pax_global_header00006660000000000000000000000064144313450760014521gustar00rootroot0000000000000052 comment=ad1c93f387ac28bc0a201de899e465bab55e1f6f oneVPL-intel-gpu-intel-onevpl-23.2.3/000077500000000000000000000000001443134507600172675ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/.gitattributes000066400000000000000000000004501443134507600221610ustar00rootroot00000000000000*.pdf filter=lfs diff=lfs merge=lfs -text *.yuv filter=lfs diff=lfs merge=lfs -text *.ivf filter=lfs diff=lfs merge=lfs -text *.jpg filter=lfs diff=lfs merge=lfs -text *.mpeg2 filter=lfs diff=lfs merge=lfs -text *.264 filter=lfs diff=lfs merge=lfs -text *.265 filter=lfs diff=lfs merge=lfs -text oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/000077500000000000000000000000001443134507600206275ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001443134507600230125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/ISSUE_TEMPLATE/1-bug.yml000066400000000000000000000050761443134507600244600ustar00rootroot00000000000000name: Bug Issue description: Use template to submit a Bug title: "[Bug]: " assignees: - yefeizhou body: - type: dropdown id: component attributes: label: Which component impacted? multiple: true options: - Decode - Encode - Video Processing - Build - Not sure - type: dropdown id: regression attributes: label: Is it regression? Good in old configuration? multiple: false options: - Yes, it's good in old version - No, this issue exist a long time - type: textarea attributes: label: What happened? description: | Please provide reproduce steps and sample cmdline if possible which help us to debug it. If it's regression, please provide good/bad commit/configuration. placeholder: | 1. In Linux or Windows or Browser or Applications... 2. With libva/libva-utils/gmmlib/media-driver version... 3. Run '...' 4. See error... validations: required: true - type: dropdown id: usage attributes: label: What's the usage scenario when you are seeing the problem? multiple: true options: - Transcode for media delivery - Playback - Web browser - Cloud Gaming - Video Analytics - Video Conference - Immersive Media - Content Creation - Game Streaming - Others validations: required: true - type: textarea attributes: label: What impacted? description: Any program or milestone would be impacted if issue yet resolved? Please provide the information as detail as possible to help us understand and prioritize the issues. placeholder: If you select "Others" for above usage, please describe your usage scenario here to help us understand the impact. validations: required: false - type: textarea attributes: label: Debug Information description: | Please provide debug information as detail as possible to accelerate issue resolved. 1. What's libva/libva-utils/gmmlib/media-driver version? 2. Could you confirm whether GPU hardware exist or not by `ls /dev/dri`? 3. Could you provide vainfo log by `vainfo >vainfo.log 2>&1`? 4. Could you provide libva trace log? Run cmd `export LIBVA_TRACE=/tmp/libva_trace.log` first then execute the case. 5. Could you attach dmesg log if GPU hang by `dmesg >dmesg.log 2>&1`? validations: required: false - type: dropdown id: contribute attributes: label: Do you want to contribute a patch to fix the issue? multiple: false options: - Yes, I'm glad to submit a patch to fix it - No. oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/ISSUE_TEMPLATE/2-feature.yml000066400000000000000000000025431443134507600253330ustar00rootroot00000000000000name: Feature Request description: Use template to request a new feature title: "[Feature]: " labels: ["Feature Request"] assignees: - yefeizhou body: - type: textarea attributes: label: What Feature? description: Please describe what feature you request and more background why you need this feature. validations: required: true - type: dropdown id: usage attributes: label: What's the usage scenario would be benifited? multiple: true options: - Transcode for media delivery - Playback - Web browser - Cloud Gaming - Video Analytics - Video Conference - Immersive Media - Content Creation - Game Streaming - Others validations: required: true - type: textarea attributes: label: What impacted? description: Any program or milestone would be benifited once the feature is enabled. Please provide the information as detail as possible to help us understand and prioritize the feature request. placeholder: If you select "Others" for above usage, please describe your usage scenario here to help us understand the impact. validations: required: false - type: dropdown id: contribute attributes: label: Do you want to contribute a patch to develop this feature? multiple: false options: - Yes, I'm glad to submit a patch for it - No.oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/workflows/000077500000000000000000000000001443134507600226645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/.github/workflows/ubuntu.yml000066400000000000000000000243541443134507600247410ustar00rootroot00000000000000name: ci on: [ push, pull_request ] env: CFLAGS: -O2 -Wformat -Wformat-security -Wall -Werror -D_FORTIFY_SOURCE=2 -fstack-protector-strong LDFLAGS: -Wl,--as-needed jobs: clang14: runs-on: ubuntu-22.04 env: CC: /usr/bin/clang-14 CXX: /usr/bin/clang++-14 ASM: /usr/bin/clang-14 steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install toolchain run: | if [[ -e $CC && -e $CXX ]]; then \ echo "clang-14 already presents in the image"; \ else \ echo "clang-14 missed in the image, installing from llvm"; \ echo "deb [trusted=yes] https://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main" | sudo tee -a /etc/apt/sources.list; \ sudo apt-get update; \ sudo apt-get install -y --no-install-recommends clang-14; \ fi - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ cmake \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DMFX_ENABLE_PXP=ON -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" .. ninja sudo ninja install clang14-enctools-full: runs-on: ubuntu-22.04 env: CC: /usr/bin/clang-14 CXX: /usr/bin/clang++-14 ASM: /usr/bin/clang-14 steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install toolchain run: | if [[ -e $CC && -e $CXX ]]; then \ echo "clang-14 already presents in the image"; \ else \ echo "clang-14 missed in the image, installing from llvm"; \ echo "deb [trusted=yes] https://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main" | sudo tee -a /etc/apt/sources.list; \ sudo apt-get update; \ sudo apt-get install -y --no-install-recommends clang-14; \ fi - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ cmake \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" \ -DMFX_ENABLE_USER_ENCTOOLS=ON -DMFX_ENABLE_AENC=ON -DMFX_ENABLE_PXP=ON \ .. ninja sudo ninja install clang14-enctools-noaenc: runs-on: ubuntu-22.04 env: CC: /usr/bin/clang-14 CXX: /usr/bin/clang++-14 ASM: /usr/bin/clang-14 steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install toolchain run: | if [[ -e $CC && -e $CXX ]]; then \ echo "clang-14 already presents in the image"; \ else \ echo "clang-14 missed in the image, installing from llvm"; \ echo "deb [trusted=yes] https://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main" | sudo tee -a /etc/apt/sources.list; \ sudo apt-get update; \ sudo apt-get install -y --no-install-recommends clang-14; \ fi - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ cmake \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" \ -DMFX_ENABLE_USER_ENCTOOLS=ON -DMFX_ENABLE_AENC=OFF -DMFX_ENABLE_PXP=ON \ .. ninja sudo ninja install clang12: runs-on: ubuntu-20.04 env: CC: /usr/bin/clang-12 CXX: /usr/bin/clang++-12 ASM: /usr/bin/clang-12 steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ cmake \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DMFX_ENABLE_PXP=ON -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" .. ninja sudo ninja install gcc11: runs-on: ubuntu-22.04 env: CC: /usr/bin/gcc-11 CXX: /usr/bin/g++-11 ASM: /usr/bin/gcc-11 # TODO: mind no -Werror # We stepped into https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100366 # gcc-11 throws -Wstringop-overflow on some std:: operations CFLAGS: -O2 -Wformat -Wformat-security -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ automake \ cmake \ gcc \ g++ \ libtool \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ pkg-config \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DMFX_ENABLE_PXP=ON -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" .. ninja sudo ninja install gcc10: runs-on: ubuntu-20.04 env: CC: /usr/bin/gcc-10 CXX: /usr/bin/g++-10 ASM: /usr/bin/gcc-10 steps: - name: checkout libmfxgen uses: actions/checkout@v2 with: path: libmfxgen - name: checkout libva uses: actions/checkout@v2 with: repository: intel/libva path: libva - name: install prerequisites run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ cmake \ libdrm-dev \ libegl1-mesa-dev \ libgl1-mesa-dev \ libx11-dev \ libx11-xcb-dev \ libxcb-dri3-dev \ libxcb-present-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ ninja-build \ make - name: print tools versions run: | cmake --version $CC --version $CXX --version - name: build libva run: | cd libva ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu make -j$(nproc) sudo make install - name: build libmfxgen run: | cd libmfxgen mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DMFX_ENABLE_PXP=ON -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CFLAGS" .. ninja sudo ninja install oneVPL-intel-gpu-intel-onevpl-23.2.3/.gitignore000066400000000000000000000000421443134507600212530ustar00rootroot00000000000000# build folder __cmake/ .vs *.useroneVPL-intel-gpu-intel-onevpl-23.2.3/CHANGELOG.md000066400000000000000000000002161443134507600210770ustar00rootroot00000000000000# Intel® oneVPL GPU Runtime open source **Whats new** - First open source release - API 2.3 - Platforms: TGL, DG1, SG1, RKL, ADL-S, ADL-P oneVPL-intel-gpu-intel-onevpl-23.2.3/CMakeLists.txt000066400000000000000000000147211443134507600220340ustar00rootroot00000000000000# Copyright (c) 2017-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. cmake_minimum_required( VERSION 3.14 ) cmake_policy(SET CMP0048 NEW) # version handled by project() if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.15) cmake_policy(SET CMP0092 NEW) # we handle warning level programmaticaly endif() # Througout this project MFX_VERSION refers to uAPI version and MEDIA_VERSION refers to product version set(MEDIA_VERSION 23.2.3) # auto-update set(MEDIA_VERSION_STR "${MEDIA_VERSION}${MEDIA_VERSION_EXTRA}" CACHE STRING "" FORCE) if(CMAKE_SYSTEM_NAME MATCHES WindowsStore) if(NOT VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION) set(VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION $ENV{MINIDDK_VERSION}) endif() endif() set(LANG CXX C ASM) project(mfxgen1 VERSION ${MEDIA_VERSION} LANGUAGES ${LANG}) include(CMakeDependentOption) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Default to `release` build if nothing was specified if((NOT CMAKE_BUILD_TYPE) AND (CMAKE_SYSTEM_NAME MATCHES Linux)) message(STATUS "No build type selected, default to release") set(CMAKE_BUILD_TYPE release) endif() set( BUILDER_ROOT "${CMAKE_HOME_DIRECTORY}/builder" ) if(DEFINED API) message(STATUS "Ignoring specified API: $API in favor or version in mfxdefs.h") set( API "" ) set( MFX_API_HOME "${MFX_HOME}/api") endif() if(NOT DEFINED ENV{MFX_HOME} ) set( MFX_HOME "${CMAKE_HOME_DIRECTORY}" ) set( MFX_API_HOME "${CMAKE_HOME_DIRECTORY}/api" ) else() set( MFX_HOME $ENV{MFX_HOME} ) set( MFX_API_HOME "${MFX_HOME}/api") endif() include( ${BUILDER_ROOT}/FindMFX.cmake ) include( ${BUILDER_ROOT}/FindInternals.cmake ) include( ${BUILDER_ROOT}/FindOpenCL.cmake ) include( ${BUILDER_ROOT}/FindFunctions.cmake ) include( ${BUILDER_ROOT}/BuildOptions.cmake ) include( ${BUILDER_ROOT}/FindGlobals.cmake ) include( ${BUILDER_ROOT}/FindITT.cmake ) include( ${BUILDER_ROOT}/FindIPP.cmake OPTIONAL) include( ${BUILDER_ROOT}/FindPackages.cmake ) if (MFX_ENABLE_PXP) add_definitions(-DMFX_ENABLE_PXP_EXT) endif() if (BUILD_RUNTIME) add_subdirectory(${CMAKE_HOME_DIRECTORY}/contrib/ipp) add_subdirectory(${CMAKE_HOME_DIRECTORY}/_studio) endif() if (ENABLE_ITT) target_link_libraries(mfx_common_properties INTERFACE itt) endif() message("") message("********************** oneVPL GPU Runtime Configuration Summary **********************") message("oneVPL:") message(" API (request to use this version) : ${API}") message(" API_VERSION : ${API_VERSION}") message(" API_FLAGS : ${API_FLAGS}") message(" MFX_CONFIG_FILE : ${MFX_CONFIG_FILE}") message(" See detailed per-component mediasdk configuration in the auto-generated file:") message(" ${MSDK_CMAKE_BINARY_ROOT}/mfx_features.h") message("Cmake:") message(" CMAKE_VERSION : ${CMAKE_VERSION}") message(" CMAKE_GENERATOR : ${CMAKE_GENERATOR}") message(" CMAKE_BUILD_TOOL : ${CMAKE_BUILD_TOOL}") message("Target:") message(" CMAKE_SYSTEM_NAME : ${CMAKE_SYSTEM_NAME}") message(" CMAKE_SYSTEM_VERSION : ${CMAKE_SYSTEM_VERSION}") message(" CMAKE_SYSTEM_PROCESSOR : ${CMAKE_SYSTEM_PROCESSOR}") message("General:") message(" CMAKE_BUILD_TYPE : ${CMAKE_BUILD_TYPE}") message(" CMAKE_TOOLCHAIN_FILE : ${CMAKE_TOOLCHAIN_FILE}") message(" CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") message(" CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}") if(CMAKE_SIZEOF_VOID_P EQUAL 8) message(" Building architecture : 64-bit") else() message(" Building architecture : 32-bit") endif() message("Flags:") message(" CMAKE_C_FLAGS : ${CMAKE_C_FLAGS}") message(" CMAKE_CXX_FLAGS : ${CMAKE_CXX_FLAGS}") message("Release flags:") message(" CMAKE_C_FLAGS_RELEASE : ${CMAKE_C_FLAGS_RELEASE}") message(" CMAKE_CXX_FLAGS_RELEASE : ${CMAKE_CXX_FLAGS_RELEASE}") message("Debug flags:") message(" CMAKE_C_FLAGS_DEBUG : ${CMAKE_C_FLAGS_DEBUG}") message(" CMAKE_CXX_FLAGS_DEBUG : ${CMAKE_CXX_FLAGS_DEBUG}") message("Install:") message(" CMAKE_INSTALL_PREFIX : ${CMAKE_INSTALL_PREFIX}") if (BUILD_TOOLS) message(" CMAKE_INSTALL_FULL_BINDIR : ${CMAKE_INSTALL_FULL_BINDIR}") endif() message(" CMAKE_INSTALL_FULL_INCLUDEDIR : ${CMAKE_INSTALL_FULL_INCLUDEDIR}") message(" CMAKE_INSTALL_FULL_LIBDIR : ${CMAKE_INSTALL_FULL_LIBDIR}") message(" CMAKE_INSTALL_FULL_DATADIR : ${CMAKE_INSTALL_FULL_DATADIR}") message("Enable:") message(" ENABLE_ITT : ${ENABLE_ITT}") message(" ENABLE_TEXTLOG : ${ENABLE_TEXTLOG}") message(" ENABLE_STAT : ${ENABLE_STAT}") message(" ENABLE_PXP : ${MFX_ENABLE_PXP}") message("Build:") message(" BUILD_RUNTIME : ${BUILD_RUNTIME}") message(" BUILD_TESTS : ${BUILD_TESTS}") message(" BUILD_MOCK_TESTS : ${BUILD_MOCK_TESTS}") message(" BUILD_TOOLS : ${BUILD_TOOLS}") message(" BUILD_KERNELS : ${BUILD_KERNELS}") message("*****************************************************************************") include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/CODEOWNERS000066400000000000000000000213061443134507600206640ustar00rootroot00000000000000* zhijie.zhang@intel.com /api/include/ vasily.aristarkhov@intel.com dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /api/vpl/ vasily.aristarkhov@intel.com dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /api/mfx_dispatch/ maxim.maximov@intel.com nikita.pletnev@intel.com oleg.nabiullin@intel.com CODEOWNERS oleg.nabiullin@intel.com dmitry.ermilov@intel.com eugene.ponomarev@intel.com # Quick Build buildplans and scripts /config/** oleg.nabiullin@intel.com dmitry.ermilov@intel.com eugene.ponomarev@intel.com # core & plugin: /_studio/mfx_lib/shared/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /_studio/shared/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /_studio/shared/umc/core/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /_studio/shared/umc/io/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /_studio/mfx_lib/cmrt_cross_platform/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com /_studio/mfx_lib/scheduler/** dmitry.gurulev@intel.com miroslav.goncharenko@intel.com evgeniy.starov@intel.com dmitry.ermilov@intel.com # mfx_player & mfx_transcoder /_testsuite/mfx_player/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_testsuite/mfx_transcoder/** alexandra.tyugina@intel.com alla.ukhina@intel.com /_testsuite/test_vpp/** alexandra.tyugina@intel.com alla.ukhina@intel.com /_testsuite/test_thread_safety/** alexandra.tyugina@intel.com alla.ukhina@intel.com /_testsuite/test_usage_models/** alexandra.tyugina@intel.com alla.ukhina@intel.com /_testsuite/sample_common/** alexandra.tyugina@intel.com alla.ukhina@intel.com /_studio/shared/umc/codec/h264_spl/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/vc1_spl/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/asf_spl/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/avi_spl/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/demuxer/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/mpeg4_spl/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com /_studio/shared/umc/codec/spl_common/** alexandra.tyugina@intel.com alla.ukhina@intel.com wade.yuan@intel.com shanshan1.wang@intel.com # decoders /_studio/mfx_lib/decode/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/av1_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/h264_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/h265_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/mpeg2_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/jpeg_common/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/jpeg_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/vc1_common/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/vc1_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/vp8_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/vp9_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/shared/umc/codec/av1_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/mfx_lib/shared/include/mfx_vpx_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com /_studio/mfx_lib/shared/src/mfx_vpx_dec/** yan.wang@intel.com will.guo@intel.com yuchen.wang@intel.com # AVC/MPEG2/JPEG encode /_studio/mfx_lib/encode_hw/h264/** sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/shared/src/mfx_h264* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/shared/include/mfx_h264* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/encode_hw/mpeg2/** sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/shared/include/mfx_mpeg2 sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/shared/src/mfx_mpeg2* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_studio/mfx_lib/encode_hw/mjpeg/** sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/avce* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/mpeg2e* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/mjpege* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/jpege* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/vp8e* sergey.a.osipov@intel.com leonid.a.kulakov@intel.com denis.volkov@intel.com # HEVC encode: /_studio/mfx_lib/encode_hw/hevc/** thomas.li@intel.com jeremy.shang@intel.com vitaliy.ilichev@intel.com yuri.skuridin@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/hevce* thomas.li@intel.com jeremy.shang@intel.com vitaliy.ilichev@intel.com leonid.a.kulakov@intel.com yuri.skuridin@intel.com # AV1 encode: /_studio/mfx_lib/encode_hw/av1/** stanislav.efremov@intel.com maxim.xue@intel.com lightny.gong@intel.com rachel.cheng@intel.com jianhong.zhang@intel.com /_studio/mfx_lib/shared/include/feature_blocks/** stanislav.efremov@intel.com maxim.xue@intel.com lightny.gong@intel.com rachel.cheng@intel.com jianhong.zhang@intel.com /tests/unit/suites/av1e/** stanislav.efremov@intel.com maxim.xue@intel.com lightny.gong@intel.com rachel.cheng@intel.com jianhong.zhang@intel.com # HEVC & AV1 encode shared: /_studio/mfx_lib/encode_hw/shared/** thomas.li@intel.com jeremy.shang@intel.com vitaliy.ilichev@intel.com leonid.a.kulakov@intel.com yuri.skuridin@intel.com stanislav.efremov@intel.com maxim.xue@intel.com lightny.gong@intel.com rachel.cheng@intel.com jianhong.zhang@intel.com # VP9 encode: _studio/mfx_lib/encode_hw/vp9/ ekaterina.shiryaeva.alexandrovna@intel.com anastasiia.sokolova@intel.com nikita.pletnev@intel.com andrey.larionov@intel.com ilya.sergeev@intel.com vasiliy.buzoverya@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/vp9e* ekaterina.shiryaeva.alexandrovna@intel.com anastasiia.sokolova@intel.com nikita.pletnev@intel.com andrey.larionov@intel.com ilya.sergeev@intel.com vasiliy.buzoverya@intel.com # VPP: /_studio/mfx_lib/vpp/ furong.zhang@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/vpp* furong.zhang@intel.com # tests: /_testsuite/msdk_ts/** /tests/** # mvce: /_studio/mfx_lib/encode_hw/mvc/** # enctools: /_studio/enctools/ timofei.a.kulakov@intel.com olga.golikova@intel.com sergey.plotnikov@intel.com /_studio/enctools/aenc sergey.plotnikov@intel.com neelesh.gokhale@intel.com /_studio/shared/include/mfxenctools-int.h timofei.a.kulakov@intel.com olga.golikova@intel.com # samples: /tutorials/** alla.ukhina@intel.com alexandra.tyugina@intel.com # hyper_encode: /_studio/mfx_lib/encode_hw/hyper_encode/** andrey.orlov@intel.com natalia.domnina@intel.com dmitry.gurulev@intel.com dmitry.ermilov@intel.com /_testsuite/msdk_ts/src/gmock/test_suites/le_* andrey.orlov@intel.com natalia.domnina@intel.com dmitry.gurulev@intel.com dmitry.ermilov@intel.com oneVPL-intel-gpu-intel-onevpl-23.2.3/CONTRIBUTING.md000066400000000000000000000005401443134507600215170ustar00rootroot00000000000000We welcome community contributions to Intel® oneVPL GPU Runtime. Thank you for your time! Please note that review and merge might take some time at this point. Intel oneVPL GPU Runtime is licensed under MIT license. By contributing to the project, you agree to the license and copyright terms therein and release your contribution under these terms.oneVPL-intel-gpu-intel-onevpl-23.2.3/LICENSE000066400000000000000000000020451443134507600202750ustar00rootroot00000000000000Copyright (c) 2021 Intel Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. oneVPL-intel-gpu-intel-onevpl-23.2.3/MODULE_LICENSE_MIT000066400000000000000000000000001443134507600220400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/NOTICE000066400000000000000000000000071443134507600201700ustar00rootroot00000000000000LICENSEoneVPL-intel-gpu-intel-onevpl-23.2.3/README.md000066400000000000000000000151101443134507600205440ustar00rootroot00000000000000# Intel® oneVPL GPU Runtime Intel® oneVPL GPU Runtime is a Runtime implementation of [oneVPL](https://github.com/oneapi-src/oneVPL/) API for Intel Gen GPUs. Runtime provides access to hardware-accelerated video decode, encode and filtering. **Supported video encoders**: HEVC, AVC, MPEG-2, JPEG, VP9 **Supported video decoders**: HEVC, AVC, VP8, VP9, MPEG-2, VC1, JPEG, AV1 **Supported video pre-processing filters**: Color Conversion, Deinterlace, Denoise, Resize, Rotate, Composition Implementation is written in C++ 14 with parts in C-for-Media (CM). oneVPL GPU Runtime is a part of Intel software stack for graphics: * [Linux Graphics Drivers](https://intel.com/linux-graphics-drivers) - General Purpose GPU Drivers for Linux Operating Systems * Visit [documentation](https://dgpu-docs.intel.com) for instructions on installing, deploying, and updating Intel software to enable general purpose GPU (GPGPU) capabilities for Linux-based operating system distributions. oneVPL Library and oneVPL GPU Runtime are successors for Intel [Media SDK](https://github.com/Intel-Media-SDK/MediaSDK). # How to use This runtime implementation is not self-sufficient. Application should use one of the available frontend dispatcher libraries: * [oneVPL](https://github.com/oneapi-src/oneVPL/) * [Media SDK](https://github.com/Intel-Media-SDK/MediaSDK) We strongly recommend to use [oneVPL](https://github.com/oneapi-src/oneVPL/) as a dispatcher frontend (libvpl.so.2). [Media SDK](https://github.com/Intel-Media-SDK/MediaSDK) dispatcher (libmfx.so.1) can be used as well, but you will get capabilities limited by those which are exposed via Media SDK API and which are actually implemented by oneVPL Runtime. Basically, compatibility with Media SDK is provided to support Media SDK based applications which did not yet migrate to oneVPL on a new HW platforms. oneVPL Gen Runtime implementation supports the following hardware platforms: | GPU | Supported | | --- | --------- | | TGL (Tiger Lake) | ✔ | | DG1 (Xe MAX) | ✔ | | RKL (Rocket Lake) | ✔ | | ADL-S (Alder Lake S) | ✔ | | ADL-P (Alder Lake P) | ✔ | # Dependencies oneVPL GPU Runtime depends on [LibVA](https://github.com/intel/libva/). This version of oneVPL GPU Runtime is compatible with the open source [Intel Media Driver for VAAPI](https://github.com/intel/media-driver). Dispatcher and Samples code hosted in [oneVPL](https://github.com/oneapi-src/oneVPL/) repository. # Table of contents * [License](#license) * [How to contribute](#how-to-contribute) * [System requirements](#system-requirements) * [How to build](#how-to-build) * [Build steps](#build-steps) * [Enabling Instrumentation and Tracing Technology (ITT)](#enabling-instrumentation-and-tracing-technology-itt) * [Recommendations](#recommendations) * [See also](#see-also) # License oneVPL GPU Runtime is licensed under MIT license. See [LICENSE](./LICENSE) for details. # How to contribute See [CONTRIBUTING](./CONTRIBUTING.md) for details. Thank you! # System requirements **Operating System:** * Linux x86-64 fully supported * Linux x86 only build **Software:** * [LibVA](https://github.com/intel/libva) * VAAPI backend driver: * [Intel Media Driver for VAAPI](https://github.com/intel/media-driver) * Some features require CM Runtime library (part of [Intel Media Driver for VAAPI](https://github.com/intel/media-driver) package) **Hardware:** Intel platforms supported by the [Intel Media Driver for VAAPI](https://github.com/intel/media-driver) starting with Tiger Lake. # How to build ## Build steps Get sources with the following Git* command (pay attention that to get full oneVPL GPU Runtime sources bundle it is required to have Git* with [LFS](https://git-lfs.github.com/) support): ```sh git clone https://github.com/oneapi-src/oneVPL-intel-gpu onevpl-gpu cd onevpl-gpu ``` To configure and build oneVPL GPU Runtime install cmake version 3.14 or later and run the following commands: ```sh mkdir build && cd build cmake .. make make install ``` oneVPL GPU Runtime depends on a number of packages which are identified and checked for the proper version during configuration stage. Please, make sure to install these packages to satisfy oneVPL GPU Runtime requirements. After successful configuration 'make' will build oneVPL GPU Runtime binaries and samples. The following cmake configuration options can be used to customize the build: | Option | Values | Description | | ------ | ------ | ----------- | | ENABLE_ITT | ON\|OFF | Enable ITT (VTune) instrumentation support (default: OFF) | | ENABLE_TEXTLOG | ON\|OFF | Enable textlog trace support (default: OFF) | | ENABLE_STAT | ON\|OFF | Enable stat trace support (default: OFF) | | BUILD_ALL | ON\|OFF | Build all the BUILD_* targets below (default: OFF) | | BUILD_RUNTIME | ON\|OFF | Build oneVPL runtime (default: ON) | | BUILD_TESTS | ON\|OFF | Build unit tests (default: OFF) | | USE_SYSTEM_GTEST | ON\|OFF | Use system gtest version instead of bundled (default: OFF) | | BUILD_TOOLS | ON\|OFF | Build tools (default: OFF) | | MFX_ENABLE_KERNELS | ON\|OFF | Build oneVPL with [media shaders](https://github.com/Intel-Media-SDK/MediaSDK/wiki/Media-SDK-Shaders-(EU-Kernels)) support (default: ON) | The following cmake settings can be used to adjust search path locations for some components oneVPL GPU Runtime build may depend on: | Setting | Values | Description | | ------- | ------ | ----------- | | CMAKE_ITT_HOME | Valid system path | Location of ITT installation, takes precendence over CMAKE_VTUNE_HOME (by default not defined) | | CMAKE_VTUNE_HOME | Valid system path | Location of VTune installation (default: /opt/intel/vtune_amplifier) | ## Enabling Instrumentation and Tracing Technology (ITT) To enable the Instrumentation and Tracing Technology (ITT) API you need to: * Either install [Intel® VTune™ Amplifier](https://software.intel.com/en-us/intel-vtune-amplifier-xe) * Or manually build an open source version (see [ITT API](https://github.com/intel/ittapi) for details) and configure oneVPL GPU Runtime with the -DENABLE_ITT=ON. In case of VTune it will be searched in the default location (/opt/intel/vtune_amplifier). You can adjust ITT search path with either CMAKE_ITT_HOME or CMAKE_VTUNE_HOME. Once oneVPL GPU Runtime was built with ITT support, enable it in a runtime creating per-user configuration file ($HOME/.mfx_trace) or a system wide configuration file (/etc/mfx_trace) with the following content: ```sh Output=0x10 ``` # Recommendations * In case of GCC compiler it is strongly recommended to use GCC version 6 or later since that's the first GCC version which has non-experimental support of C++14 being used in oneVPL GPU Runtime. oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/000077500000000000000000000000001443134507600207355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/CMakeLists.txt000066400000000000000000000033701443134507600235000ustar00rootroot00000000000000# Copyright (c) 2018-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_subdirectory(shared/mfx_trace) add_subdirectory(shared/IntelMediaSDK) add_subdirectory(shared/mfx_logging) add_subdirectory(shared/umc) add_subdirectory(shared/asc) add_subdirectory(mfx_lib/decode) add_subdirectory(mfx_lib/encode_hw) if (MFX_ENABLE_EXT) add_subdirectory(mfx_lib/ext) endif() add_subdirectory(mfx_lib/vpp) add_subdirectory(mfx_lib/shared) if (MFX_ENABLE_PXP) add_subdirectory(mfx_lib/pxp) endif() add_subdirectory(mfx_lib) if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/mfx_config_trace") add_subdirectory(mfx_config_trace) endif() if (MFX_ENABLE_ENCTOOLS) add_subdirectory(shared/enctools) add_subdirectory(enctools) endif() include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/000077500000000000000000000000001443134507600225635ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/CMakeLists.txt000066400000000000000000000045121443134507600253250ustar00rootroot00000000000000set(sources src/mfx_enctools_brc.cpp src/mfx_enctools_common.cpp src/mfx_enctools_aenc.cpp src/mfx_enctools_utils.cpp src/mfx_enctools_lpla.cpp src/mfx_enctools_allocator.cpp src/mfxenctools_dl_int.cpp aenc/include/aenc.h include/mfx_ienctools.h include/mfx_enctools.h include/mfx_enctools_aenc.h include/mfx_enctools_brc.h include/mfx_enctools_defs.h include/mfx_enctools_lpla.h include/mfx_enctools_utils.h include/mfx_enctools_allocator.h include/mfxenctools_dl_int.h src/dll_main.cpp ) if (MFX_ENABLE_AENC) find_library( AENC_LIBRARY libaenc.a PATHS ${CMAKE_HOME_DIRECTORY}/contrib/aenc/ ) if(NOT ${AENC_LIBRARY} MATCHES NOTFOUND) message(STATUS "aenc library was found here ${AENC_LIBRARY}") add_library(aenc STATIC IMPORTED GLOBAL) set_target_properties(aenc PROPERTIES IMPORTED_LOCATION "${CMAKE_HOME_DIRECTORY}/contrib/aenc/libaenc.a") target_include_directories(aenc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) else() message(STATUS "aenc library was not found (optional)! mfxlib will be built without aenc") set(MFX_ENABLE_AENC OFF) endif() endif() function(make_enctools_name name) set (enctools_name enctools) if( CMAKE_SYSTEM_NAME MATCHES Windows ) if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) set( enctools_name ${enctools_name}64 ) else() set( enctools_name ${enctools_name}32 ) endif() endif() set( ${name} ${enctools_name} PARENT_SCOPE) endfunction() make_enctools_name( enctools_name ) add_library(${enctools_name} SHARED ${sources}) set_target_properties(${enctools_name} PROPERTIES PREFIX "") target_compile_definitions(${enctools_name} PRIVATE $<$:MFX_ENABLE_AENC> ) target_include_directories(${enctools_name} PUBLIC include aenc/include ${MSDK_STUDIO_ROOT}/shared/enctools/include ) target_link_libraries(${enctools_name} PUBLIC mfx_shared_lib fast_copy_sse4 mfx_static_lib vm PRIVATE mfx_sdl_properties $<$:aenc> ) target_link_options(${enctools_name} PRIVATE $<$:LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libenctools.map> ) install(TARGETS ${enctools_name} LIBRARY DESTINATION ${MFX_MODULES_DIR}/libmfx-gen) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/aenc/000077500000000000000000000000001443134507600234715ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/aenc/include/000077500000000000000000000000001443134507600251145ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/aenc/include/aenc.h000066400000000000000000000066531443134507600262050ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __AENC_H__ #define __AENC_H__ #include "mfxstructures.h" #include "mfx_config.h" #ifdef __cplusplus extern "C" { #endif typedef struct { mfxU32 FrameWidth; mfxU32 FrameHeight; mfxU32 SrcFrameWidth; mfxU32 SrcFrameHeight; mfxI32 Pitch; mfxU32 ColorFormat; //FourCC, e.g. MFX_FOURCC_NV12 mfxU32 StrictIFrame; mfxU32 GopPicSize; //GOP size, from I to I, excluding last I mfxU32 MinGopSize; //for adaptive I mfxU32 MaxGopSize; //for adaptive I, next condition should be satisfyed (MinGopSize < MaxGopSize - MaxMiniGopSize) mfxU32 MaxIDRDist; //IDR distance in frames mfxU32 MaxMiniGopSize; mfxU32 CodecId; mfxU32 NumRefP; //toolset mfxU32 AGOP; mfxU32 ALTR; mfxU32 AREF; mfxU32 APQ; } AEncParam; #define AENC_MAP_SIZE 128 typedef struct { mfxU32 POC; mfxU32 QpY; mfxU32 SceneChanged; mfxU32 RepeatedFrame; mfxU32 TemporalComplexity; mfxU32 LTR; mfxU32 MiniGopSize; mfxU32 PyramidLayer; mfxU32 Type; //FrameType, e.g. MFX_FRAMETYPE_I mfxI32 DeltaQP; mfxU32 ClassAPQ; mfxI8 QPDeltaExplicitModulation; mfxU32 FeaturesAPQ[4]; mfxU32 SpatialComplexity; mfxU32 KeepInDPB; mfxU32 RemoveFromDPBSize; mfxU32 RemoveFromDPB[32]; mfxU32 RefListSize; mfxU32 RefList[32]; mfxU32 LongTermRefListSize; mfxU32 LongTermRefList[32]; mfxU8 PMap[AENC_MAP_SIZE]; } AEncFrame; mfxStatus MFX_CDECL AEncInit(mfxHDL* pthis, AEncParam param); void MFX_CDECL AEncClose(mfxHDL pthis); mfxStatus MFX_CDECL AEncProcessFrame(mfxHDL pthis, mfxU32 POC, mfxU8* InFrame, mfxI32 pitch, AEncFrame* OutFrame); mfxU16 MFX_CDECL AEncGetIntraDecision(mfxHDL pthis, mfxU32 displayOrder); mfxU16 MFX_CDECL AEncGetPersistenceMap(mfxHDL pthis, mfxU32 displayOrder, mfxU8 PMap[AENC_MAP_SIZE]); mfxU16 MFX_CDECL AEncGetLastPQp(mfxHDL pthis); mfxI8 MFX_CDECL AEncAPQSelect(mfxHDL pthis, mfxU32 SC, mfxU32 TSC, mfxU32 MVSize, mfxU32 Contrast, mfxU32 PyramidLayer, mfxU32 BaseQp); void MFX_CDECL AEncUpdateFrame(mfxHDL pthis, mfxU32 displayOrder, mfxU32 bits, mfxU32 QpY); #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/000077500000000000000000000000001443134507600242065ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools.h000066400000000000000000000133701443134507600270630ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_H__ #define __MFX_ENCTOOLS_H__ #include "mfx_ienctools.h" #include "mfx_enctools_defs.h" #include "mfx_enctools_aenc.h" #include "mfx_enctools_lpla.h" #include "mfx_enctools_utils.h" #include "mfx_enctools_allocator.h" #include "mfxenctools_dl_int.h" #include #include #include #include using namespace EncToolsUtils; mfxStatus InitCtrl(mfxVideoParam const & par, mfxEncToolsCtrl *ctrl); class EncTools : public IEncTools { private: bool m_bVPPInit; bool m_bInit; std::unique_ptr m_brc; AEnc_EncTool m_scd; LPLA_EncTool m_lpLookAhead; mfxExtEncToolsConfig m_config; mfxEncToolsCtrl m_ctrl; mfxHDL m_device; mfxU32 m_deviceType; mfxFrameAllocator *m_pAllocator; MFXFrameAllocator *m_pETAllocator; mfxAllocatorParams *m_pmfxAllocatorParams; MFXDLVideoSession* m_mfxSession_LA; MFXDLVideoSession m_mfxSession_SCD; std::unique_ptr m_pmfxVPP_LA; std::unique_ptr m_pmfxVPP_SCD; mfxVideoParam m_mfxVppParams_LA; mfxVideoParam m_mfxVppParams_AEnc; mfxFrameAllocResponse m_VppResponse; std::vector m_pIntSurfaces_LA; // internal surfaces mfxFrameSurface1 m_IntSurfaces_SCD; // internal surface for SCD void* m_hRTModule = nullptr; public: EncTools(void* rtmodule, void* etmodule); ~EncTools() override { Close(); } mfxStatus Init(mfxExtEncToolsConfig const * pEncToolConfig, mfxEncToolsCtrl const * ctrl) override; mfxStatus GetSupportedConfig(mfxExtEncToolsConfig* pConfig, mfxEncToolsCtrl const * ctrl) override; mfxStatus GetActiveConfig(mfxExtEncToolsConfig* pConfig) override; mfxStatus GetDelayInFrames(mfxExtEncToolsConfig const * pConfig, mfxEncToolsCtrl const * ctrl, mfxU32 *numFrames) override; mfxStatus Reset(mfxExtEncToolsConfig const * pEncToolConfig, mfxEncToolsCtrl const * ctrl) override; mfxStatus Close() override; mfxStatus Submit(mfxEncToolsTaskParam const * par) override; mfxStatus Query(mfxEncToolsTaskParam* par, mfxU32 timeOut)override ; mfxStatus Discard(mfxU32 displayOrder) override; protected: mfxStatus InitMfxVppParams(mfxEncToolsCtrl const & ctrl); mfxStatus InitVPP(mfxEncToolsCtrl const & ctrl); mfxStatus ResetVPP(mfxEncToolsCtrl const& ctrl); mfxStatus CloseVPP(); mfxStatus GetDeviceAllocator(mfxEncToolsCtrl const* ctrl); mfxStatus InitVPPSession(MFXDLVideoSession* pmfxSession); mfxStatus VPPDownScaleSurface(MFXDLVideoSession* m_pmfxSession, MFXDLVideoVPP* pVPP, mfxSyncPoint* pVppSyncp, mfxFrameSurface1* pInSurface, mfxFrameSurface1* pOutSurface); }; class ExtBRC : public EncTools { public: ExtBRC(void* rtmodule, void* etmodule) : EncTools(rtmodule, etmodule) {} mfxStatus GetFrameCtrl(mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl); mfxStatus Update(mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status); }; namespace ExtBRCFuncs { inline mfxStatus Init(mfxHDL pthis, mfxVideoParam* par) { MFX_CHECK_NULL_PTR2(pthis,par); mfxExtEncToolsConfig config = {}; mfxEncToolsCtrl ctrl = {}; mfxStatus sts = MFX_ERR_NONE; sts = InitCtrl(*par, &ctrl); MFX_CHECK_STS(sts); sts = ((ExtBRC*)pthis)->GetSupportedConfig(&config, &ctrl); MFX_CHECK_STS(sts); MFX_CHECK(config.BRC != 0, MFX_ERR_UNSUPPORTED); config = {}; config.BRC = MFX_CODINGOPTION_ON; return ((ExtBRC*)pthis)->Init(&config, &ctrl); } inline mfxStatus Close(mfxHDL pthis) { MFX_CHECK_NULL_PTR1(pthis); return ((EncTools*)pthis)->Close(); } inline mfxStatus GetFrameCtrl(mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl) { MFX_CHECK_NULL_PTR1(pthis); return ((ExtBRC*)pthis)->GetFrameCtrl(par, ctrl); } inline mfxStatus Update(mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status) { MFX_CHECK_NULL_PTR1(pthis); return ((ExtBRC*)pthis)->Update(par, ctrl, status); } inline mfxStatus Reset(mfxHDL pthis, mfxVideoParam* par) { mfxExtEncToolsConfig config = {}; mfxEncToolsCtrl ctrl = {}; mfxStatus sts = MFX_ERR_NONE; config = {}; config.BRC = MFX_CODINGOPTION_ON; sts = InitCtrl(*par, &ctrl); MFX_CHECK_STS(sts); MFX_CHECK_NULL_PTR1(pthis); return ((ExtBRC*)pthis)->Reset(&config, &ctrl); } } inline bool isFieldMode(mfxEncToolsCtrl const & ctrl) { return ((ctrl.CodecId == MFX_CODEC_HEVC) && !(ctrl.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE)); } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_aenc.h000066400000000000000000000054451443134507600300550ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_AENC_H__ #define __MFX_ENCTOOLS_AENC_H__ #include "mfxdefs.h" #include #include #include #include "aenc.h" #include "mfx_enctools_utils.h" #define ENC_TOOLS_DS_FRAME_WIDTH 576 #define ENC_TOOLS_DS_FRAME_HEIGHT 576 class AEnc_EncTool { public: AEnc_EncTool() : m_ptmpFrame(nullptr), m_bInit(false) { m_aencPar = {}; } ~AEnc_EncTool() { Close(); } mfxStatus Init(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig); mfxStatus GetInputFrameInfo(mfxFrameInfo &frameInfo); void Close(); mfxStatus SubmitFrame(mfxFrameSurface1 *surface); mfxStatus ReportEncResult(mfxU32 dispOrder, mfxEncToolsBRCEncodeResult const & pEncRes); mfxStatus GetIntraDecision(mfxU32 displayOrder, mfxU16 *frameType); mfxStatus GetSCDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeSceneChange *pPreEncSC); mfxStatus GetPersistenceMap(mfxU32 displayOrder, mfxEncToolsHintPreEncodeSceneChange *pPreEncSC); mfxStatus GetGOPDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeGOP *pPreEncGOP); mfxStatus GetARefDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeARefFrames *pPreEncARef); mfxStatus GetMLApqDeltaQp(mfxU32 displayOrder, mfxI8 & QPDeltaExplicitModulation); mfxStatus CompleteFrame(mfxU32 displayOrder); bool DoDownScaling(mfxFrameInfo const & frameInfo); protected: std::vector m_outframes; std::vector::iterator m_frameIt; mfxStatus FindOutFrame(mfxU32 displayOrder); mfxHDL m_aenc; AEncParam m_aencPar; mfxU8 *m_ptmpFrame; bool m_bInit; mfxU32 FrameWidth_aligned; mfxU32 FrameHeight_aligned; }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_allocator.h000066400000000000000000000233731443134507600311270ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_ALLOCATOR_H__ #define __MFX_ENCTOOLS_ALLOCATOR_H__ #include #include /* for memset on Linux/Android */ #include /* for std::binary_function on Linux/Android */ #include "mfxvideo.h" #include "mfx_enctools_defs.h" struct mfxAllocatorParams { virtual ~mfxAllocatorParams(){}; }; // this class implements methods declared in mfxFrameAllocator structure // simply redirecting them to virtual methods which should be overridden in derived classes class MFXFrameAllocator : public mfxFrameAllocator { public: MFXFrameAllocator(); virtual ~MFXFrameAllocator(); // optional method, override if need to pass some parameters to allocator from application virtual mfxStatus Init(mfxAllocatorParams *pParams) = 0; virtual mfxStatus Close() = 0; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) = 0; virtual mfxStatus LockFrame(mfxMemId mid, mfxFrameData *ptr) = 0; virtual mfxStatus UnlockFrame(mfxMemId mid, mfxFrameData *ptr) = 0; virtual mfxStatus GetFrameHDL(mfxMemId mid, mfxHDL *handle) = 0; virtual mfxStatus FreeFrames(mfxFrameAllocResponse *response) = 0; private: static mfxStatus MFX_CDECL Alloc_(mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); static mfxStatus MFX_CDECL Lock_(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); static mfxStatus MFX_CDECL Unlock_(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); static mfxStatus MFX_CDECL GetHDL_(mfxHDL pthis, mfxMemId mid, mfxHDL *handle); static mfxStatus MFX_CDECL Free_(mfxHDL pthis, mfxFrameAllocResponse *response); }; // This class implements basic logic of memory allocator // Manages responses for different components according to allocation request type // External frames of a particular component-related type are allocated in one call // Further calls return previously allocated response. // Ex. Preallocated frame chain with type=FROM_ENCODE | FROM_VPPIN will be returned when // request type contains either FROM_ENCODE or FROM_VPPIN // This class does not allocate any actual memory class BaseFrameAllocator: public MFXFrameAllocator { public: BaseFrameAllocator(); virtual ~BaseFrameAllocator(); virtual mfxStatus Init(mfxAllocatorParams *pParams) = 0; virtual mfxStatus Close(); virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); virtual mfxStatus FreeFrames(mfxFrameAllocResponse *response); protected: typedef std::list::iterator Iter; static const mfxU32 MEMTYPE_FROM_MASK = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_FROM_DECODE | MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_FROM_VPPOUT; struct UniqueResponse : mfxFrameAllocResponse { mfxU16 m_cropw; mfxU16 m_croph; mfxU32 m_refCount; mfxU16 m_type; UniqueResponse() : mfxFrameAllocResponse() , m_cropw(0) , m_croph(0) , m_refCount(0) , m_type(0) { } // compare responses by actual frame size, alignment (w and h) is up to application UniqueResponse(const mfxFrameAllocResponse & response, mfxU16 cropw, mfxU16 croph, mfxU16 type) : mfxFrameAllocResponse(response) , m_cropw(cropw) , m_croph(croph) , m_refCount(1) , m_type(type) { } //compare by resolution bool operator () (const UniqueResponse &response)const { return m_cropw == response.m_cropw && m_croph == response.m_croph; } }; std::list m_responses; std::list m_ExtResponses; struct IsSame : public std::binary_function { bool operator () (const mfxFrameAllocResponse & l, const mfxFrameAllocResponse &r)const { return r.mids != 0 && l.mids != 0 && r.mids[0] == l.mids[0] && r.NumFrameActual == l.NumFrameActual; } }; // checks if request is supported virtual mfxStatus CheckRequestType(mfxFrameAllocRequest *request); // frees memory attached to response virtual mfxStatus ReleaseResponse(mfxFrameAllocResponse *response) = 0; // allocates memory virtual mfxStatus AllocImpl(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) = 0; template class safe_array { public: safe_array(T *ptr = 0):m_ptr(ptr) { // construct from object pointer }; ~safe_array() { reset(0); } T* get() { // return wrapped pointer return m_ptr; } T* release() { // return wrapped pointer and give up ownership T* ptr = m_ptr; m_ptr = 0; return ptr; } void reset(T* ptr) { // destroy designated object and store new pointer if (m_ptr) { delete[] m_ptr; } m_ptr = ptr; } protected: T* m_ptr; // the wrapped object pointer }; }; #include "va/va.h" enum LibVABackend { MFX_LIBVA_AUTO, MFX_LIBVA_DRM, MFX_LIBVA_DRM_MODESET, MFX_LIBVA_X11, MFX_LIBVA_WAYLAND }; namespace MfxLoader { class SimpleLoader { public: SimpleLoader(const char* name); void* GetFunction(const char* name); ~SimpleLoader(); private: SimpleLoader(SimpleLoader&); void operator=(SimpleLoader&); void* so_handle; }; class VA_Proxy { private: SimpleLoader lib; // should appear first in member list public: typedef VAStatus(*vaInitialize_type)(VADisplay, int*, int*); typedef VAStatus(*vaTerminate_type)(VADisplay); typedef VAStatus(*vaCreateSurfaces_type)(VADisplay, unsigned int, unsigned int, unsigned int, VASurfaceID*, unsigned int, VASurfaceAttrib*, unsigned int); typedef VAStatus(*vaDestroySurfaces_type)(VADisplay, VASurfaceID*, int); typedef VAStatus(*vaCreateBuffer_type)(VADisplay, VAContextID, VABufferType, unsigned int, unsigned int, void*, VABufferID*); typedef VAStatus(*vaDestroyBuffer_type)(VADisplay, VABufferID); typedef VAStatus(*vaMapBuffer_type)(VADisplay, VABufferID, void** pbuf); typedef VAStatus(*vaUnmapBuffer_type)(VADisplay, VABufferID); typedef VAStatus(*vaDeriveImage_type)(VADisplay, VASurfaceID, VAImage*); typedef VAStatus(*vaDestroyImage_type)(VADisplay, VAImageID); typedef VAStatus(*vaSyncSurface_type)(VADisplay, VASurfaceID); VA_Proxy(); ~VA_Proxy(); const vaInitialize_type vaInitialize; const vaTerminate_type vaTerminate; const vaCreateSurfaces_type vaCreateSurfaces; const vaDestroySurfaces_type vaDestroySurfaces; const vaCreateBuffer_type vaCreateBuffer; const vaDestroyBuffer_type vaDestroyBuffer; const vaMapBuffer_type vaMapBuffer; const vaUnmapBuffer_type vaUnmapBuffer; const vaDeriveImage_type vaDeriveImage; const vaDestroyImage_type vaDestroyImage; const vaSyncSurface_type vaSyncSurface; }; } // namespace MfxLoader mfxStatus va_to_mfx_status(VAStatus va_res); // VAAPI Allocator internal Mem ID struct vaapiMemId { VASurfaceID* m_surface; VAImage m_image; // variables for VAAPI Allocator internal color conversion unsigned int m_fourcc; mfxU8* m_sys_buffer; mfxU8* m_va_buffer; }; namespace MfxLoader { class VA_Proxy; } struct vaapiAllocatorParams : mfxAllocatorParams { vaapiAllocatorParams() : m_dpy(), bAdaptivePlayback(false) {}; VADisplay m_dpy; bool bAdaptivePlayback; }; class vaapiFrameAllocator : public BaseFrameAllocator { public: vaapiFrameAllocator(); virtual ~vaapiFrameAllocator(); virtual mfxStatus Init(mfxAllocatorParams* pParams); virtual mfxStatus Close(); protected: virtual mfxStatus LockFrame(mfxMemId mid, mfxFrameData* ptr); virtual mfxStatus UnlockFrame(mfxMemId mid, mfxFrameData* ptr); virtual mfxStatus GetFrameHDL(mfxMemId mid, mfxHDL* handle); virtual mfxStatus CheckRequestType(mfxFrameAllocRequest* request); virtual mfxStatus ReleaseResponse(mfxFrameAllocResponse* response); virtual mfxStatus AllocImpl(mfxFrameAllocRequest* request, mfxFrameAllocResponse* response); VADisplay m_dpy; MfxLoader::VA_Proxy* m_libva; bool m_bAdaptivePlayback; mfxU32 m_Width; mfxU32 m_Height; }; #endif // __MFX_ENCTOOLS_ALLOCATOR_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_brc.h000066400000000000000000000554641443134507600277230ustar00rootroot00000000000000// Copyright (c) 2009-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_BRC_H__ #define __MFX_ENCTOOLS_BRC_H__ #include "mfxdefs.h" #include #include #include #include "mfx_enctools_utils.h" #include namespace EncToolsBRC { constexpr mfxU8 LA_P_UPDATE_DIST = 8; constexpr mfxU8 MBQP_P_UPDATE_DIST = 7; constexpr mfxU8 MAX_GOP_REFDIST = 16; constexpr mfxU8 MIN_PAQ_QP = 10; //do not allow PAQ to set QP below this value constexpr mfxF64 MIN_RACA = 0.25; constexpr mfxF64 MAX_RACA = 361.0; constexpr mfxF64 RACA_SCALE = 128.0; constexpr mfxU8 TOTAL_NUM_AV1_SEGMENTS_FOR_ENCTOOLS = 7; /* NalHrdConformance | VuiNalHrdParameters | Result -------------------------------------------------------------- off any => MFX_BRC_NO_HRD default off => MFX_BRC_NO_HRD on off => MFX_BRC_HRD_WEAK on (or default) on (or default) => MFX_BRC_HRD_STRONG -------------------------------------------------------------- */ struct BRC_FrameStruct { mfxU16 frameType = 0; mfxU16 pyrLayer = 0; mfxU32 encOrder = 0; mfxU32 dispOrder = 0; mfxI32 qp = 0; mfxI32 origSeqQp = 0; mfxI32 frameSize = 0; mfxI32 numRecode = 0; mfxU16 sceneChange = 0; mfxU16 longTerm = 0; mfxU32 frameCmplx = 0; mfxU32 LaAvgEncodedSize = 0; mfxU32 LaCurEncodedSize = 0; mfxU32 LaIDist = 0; mfxI16 qpDelta = MFX_QP_UNDEFINED; mfxU16 qpModulation = MFX_QP_MODULATION_NOT_DEFINED; mfxI8 QPDeltaExplicitModulation = 0; mfxU16 miniGopSize = 0; mfxU16 QpMapNZ = 0; mfxU16 PersistenceMapNZ = 0; mfxI16 QpMapBias = 0; mfxU8 PersistenceMap[MFX_ENCTOOLS_PREENC_MAP_SIZE] = {}; }; class cBRCParams { public: mfxU16 rateControlMethod; // CBR or VBR mfxU16 HRDConformance; // is HRD compliance needed mfxU16 bRec; // is Recoding possible mfxU16 bPanic; // is Panic mode possible // HRD params mfxU32 bufferSizeInBytes; mfxU32 initialDelayInBytes; // Sliding window parameters mfxU32 WinBRCMaxAvgKbps; mfxU16 WinBRCSize; // RC params mfxU32 targetbps; mfxU32 maxbps; mfxF64 frameRate; mfxF64 inputBitsPerFrame; mfxF64 maxInputBitsPerFrame; mfxU32 maxFrameSizeInBits; // Frame size params mfxU16 width; mfxU16 height; mfxU16 cropWidth; mfxU16 cropHeight; mfxU16 chromaFormat; mfxU16 bitDepthLuma; mfxU32 mRawFrameSizeInBits; mfxU32 mRawFrameSizeInPixs; // GOP params mfxU16 gopPicSize; mfxU16 gopRefDist; bool bPyr; bool bFieldMode; //BRC accurancy params mfxF64 fAbPeriodLong; // number on frames to calculate aberration from target frame mfxF64 fAbPeriodShort; // number on frames to calculate aberration from target frame mfxF64 fAbPeriodLA; // number on frames to calculate aberration from target frame (LA) mfxF64 dqAbPeriod; // number on frames to calculate aberration from dequant mfxF64 bAbPeriod; // number of frames to calculate aberration from target bitrate //QP parameters mfxI32 quantOffset; mfxI32 quantMaxI; mfxI32 quantMinI; mfxI32 quantMaxP; mfxI32 quantMinP; mfxI32 quantMaxB; mfxI32 quantMinB; mfxU32 iDQp0; mfxU32 iDQp; mfxU32 mNumRefsInGop; bool mIntraBoost; bool mVeryLowDelay; mfxF64 mMinQstepCmplxKP; mfxF64 mMinQstepRateEP; mfxI32 mMinQstepCmplxKPUpdt; mfxF64 mMinQstepCmplxKPUpdtErr; mfxU16 mLaDepth; mfxU16 mLaQp; mfxU16 mLaScale; mfxU16 mHasALTR; // When mHasALTR, LTR marking decision (on/off) based on content. mfxU32 codecId; bool mMBBRC; // Enable Macroblock-CU level QP control (true/false) bool lowPower; public: cBRCParams() : rateControlMethod(0), HRDConformance(MFX_BRC_NO_HRD), bRec(0), bPanic(0), bufferSizeInBytes(0), initialDelayInBytes(0), WinBRCMaxAvgKbps(0), WinBRCSize(0), targetbps(0), maxbps(0), frameRate(0), inputBitsPerFrame(0), maxInputBitsPerFrame(0), maxFrameSizeInBits(0), width(0), height(0), cropWidth(0), cropHeight(0), chromaFormat(0), bitDepthLuma(0), mRawFrameSizeInBits(0), mRawFrameSizeInPixs(0), gopPicSize(0), gopRefDist(0), bPyr(0), bFieldMode(0), fAbPeriodLong(0), fAbPeriodShort(0), fAbPeriodLA(0), dqAbPeriod(0), bAbPeriod(0), quantOffset(0), quantMaxI(0), quantMinI(0), quantMaxP(0), quantMinP(0), quantMaxB(0), quantMinB(0), iDQp0(0), iDQp(0), mNumRefsInGop(0), mIntraBoost(0), mVeryLowDelay(0), mMinQstepCmplxKP(0), mMinQstepRateEP(0), mMinQstepCmplxKPUpdt(0), mMinQstepCmplxKPUpdtErr(0), mLaDepth(0), mLaQp(0), mLaScale(0), mHasALTR(0), codecId(0), mMBBRC(false), lowPower(0) {} mfxStatus Init(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bFieldMode, bool bALTR); mfxStatus GetBRCResetType(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bNewSequence, bool &bReset, bool &bSlidingWindowReset, bool bALTR); }; struct sHrdInput { bool m_cbrFlag = false; mfxU32 m_bitrate = 0; mfxU32 m_maxCpbRemovalDelay = 0; mfxF64 m_clockTick = 0.0; mfxF64 m_cpbSize90k = 0.0; mfxF64 m_initCpbRemovalDelay = 0; void Init(cBRCParams par); }; class HRDCodecSpec { private: mfxI32 m_overflowQuant = 999; mfxI32 m_underflowQuant = 0; public: mfxI32 GetMaxQuant() const { return m_overflowQuant - 1; } mfxI32 GetMinQuant() const { return m_underflowQuant + 1; } void SetOverflowQuant(mfxI32 qp) { m_overflowQuant = qp; } void SetUnderflowQuant(mfxI32 qp) { m_underflowQuant = qp; } void ResetQuant() { m_overflowQuant = 999; m_underflowQuant = 0;} virtual ~HRDCodecSpec() {} virtual void Init(cBRCParams const &par) = 0; virtual void Reset(cBRCParams const &par) = 0; virtual void Update(mfxU32 sizeInbits, mfxU32 encOrder, bool bSEI) = 0; virtual mfxU32 GetInitCpbRemovalDelay(mfxU32 encOrder) const = 0; virtual mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 encOrder) const = 0; virtual mfxU32 GetMaxFrameSizeInBits(mfxU32 encOrder, bool bSEI) const = 0; virtual mfxU32 GetMinFrameSizeInBits(mfxU32 encOrder, bool bSEI) const = 0; virtual mfxF64 GetBufferDeviation(mfxU32 encOrder) const = 0; virtual mfxF64 GetBufferDeviationFactor(mfxU32 encOrder) const = 0; }; class HEVC_HRD: public HRDCodecSpec { public: HEVC_HRD() : m_prevAuCpbRemovalDelayMinus1(0) , m_prevAuCpbRemovalDelayMsb(0) , m_prevAuFinalArrivalTime(0) , m_prevBpAuNominalRemovalTime(0) , m_prevBpEncOrder(0) {} virtual ~HEVC_HRD() {} void Init(cBRCParams const&par) override; void Reset(cBRCParams const &par) override; void Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) override; mfxU32 GetInitCpbRemovalDelay(mfxU32 eo) const override; mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 eo) const override { return mfxU32(m_hrdInput.m_cpbSize90k - GetInitCpbRemovalDelay(eo)); } mfxU32 GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxU32 GetMinFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxF64 GetBufferDeviation(mfxU32 eo) const override; mfxF64 GetBufferDeviationFactor(mfxU32 eo) const override; protected: sHrdInput m_hrdInput; mfxI32 m_prevAuCpbRemovalDelayMinus1; mfxU32 m_prevAuCpbRemovalDelayMsb; mfxF64 m_prevAuFinalArrivalTime; mfxF64 m_prevBpAuNominalRemovalTime; mfxU32 m_prevBpEncOrder; }; class H264_HRD: public HRDCodecSpec { public: H264_HRD(); virtual ~H264_HRD() {} void Init(cBRCParams const &par) override; void Reset(cBRCParams const &par) override; void Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) override; mfxU32 GetInitCpbRemovalDelay(mfxU32 eo) const override; mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 eo) const override; mfxU32 GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxU32 GetMinFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxF64 GetBufferDeviation(mfxU32 eo) const override; mfxF64 GetBufferDeviationFactor(mfxU32 eo) const override; private: sHrdInput m_hrdInput; double m_trn_cur; // nominal removal time double m_taf_prv; // final arrival time of prev unit }; struct LA_Ctx { LA_Ctx(): LastLaPBitsAvg(LA_P_UPDATE_DIST + MAX_GOP_REFDIST, 0), LastLaQpCalc(0), LastLaQpCalcEncOrder(0), LastLaQpCalcDispOrder(0), LastLaQpCalcHasI(0), LastLaQpUpdateEncOrder(0), LastLaQpUpdateDispOrder(0), LastLaIBits(0), LastMBQpSetEncOrder(0), LastMBQpSetDispOrder(0) {} std::vector LastLaPBitsAvg; // History of Moving Avg of LA bits of last P frames mfxU32 LastLaQpCalc; // Last LaQp calculated mfxU32 LastLaQpCalcEncOrder; mfxU32 LastLaQpCalcDispOrder; bool LastLaQpCalcHasI; mfxU32 LastLaQpUpdateEncOrder; mfxU32 LastLaQpUpdateDispOrder; mfxU32 LastLaIBits; // LA bits of Last Intra Frame mfxU32 LastMBQpSetEncOrder; mfxU32 LastMBQpSetDispOrder; bool IsCalcLaQpDist(mfxU32 dispOrder) { return dispOrder >= LastLaQpCalcDispOrder + LA_P_UPDATE_DIST; } bool IsUpdateLaQpDist(mfxU32 dispOrder) { return dispOrder >= LastLaQpUpdateDispOrder + LA_P_UPDATE_DIST; } void SetLaQpCalcOrder(mfxU32 encOrder, mfxU32 dispOrder) { LastLaQpCalcEncOrder = encOrder; LastLaQpCalcDispOrder = dispOrder; } void SetLaQpUpdateOrder(mfxU32 encOrder, mfxU32 dispOrder) { LastLaQpUpdateEncOrder = encOrder; LastLaQpUpdateDispOrder = dispOrder; } mfxU32 GetLastCalcLaBitsAvg(mfxU32 encOrder) { return LastLaPBitsAvg[mfx::clamp((mfxI32)encOrder - (mfxI32)LastLaQpCalcEncOrder - 1, 0, (mfxI32)LastLaPBitsAvg.size() - 1)]; } void SaveLaBits(bool intra, mfxU32 LaCurEncodedSize, mfxU32 period, bool rotate) { if (intra) LastLaIBits = LaCurEncodedSize; if (rotate) std::rotate(LastLaPBitsAvg.rbegin(), LastLaPBitsAvg.rbegin() + 1, LastLaPBitsAvg.rend()); if (LastLaPBitsAvg[1]) { LastLaPBitsAvg[0] = (mfxI32)LastLaPBitsAvg[1] + ((mfxI32)LaCurEncodedSize - (mfxI32)LastLaPBitsAvg[1]) / (mfxI32)period; } else { LastLaPBitsAvg[0] = LaCurEncodedSize; } } }; struct BRC_Ctx { BRC_Ctx() : QuantIDR(0), QuantI(0), QuantP(0), QuantB(0), Quant(0), QuantMin(0), QuantMax(0), bToRecode(false), bPanic(false), encOrder(0), poc(0), SceneChange(0), SChPoc(0), LastIEncOrder(0), LastIDREncOrder(0), LastIDRSceneChange(0), LastIQpAct(0), LastIFrameSize(0), LastICmplx(0), LastIQpSetOrder(0), LastQpUpdateOrder(0), LastIQpMin(0), LastIQpSet(0), LastNonBFrameSize(0), la(), fAbLong(0), fAbShort(0), fAbLA(0), dQuantAb(0), totalDeviation(0), eRate(0), eRateSH(0) {} mfxI32 QuantIDR; //currect qp for intra frames mfxI32 QuantI; //currect qp for intra frames mfxI32 QuantP; //currect qp for P frames mfxI32 QuantB; //currect qp for B frames mfxI32 Quant; // qp for last encoded frame mfxI32 QuantMin; // qp Min for last encoded frame (is used for recoding) mfxI32 QuantMax; // qp Max for last encoded frame (is used for recoding) bool bToRecode; // last frame is needed in recoding bool bPanic; // last frame is needed in panic mfxU32 encOrder; // encoding order of last encoded frame mfxU32 poc; // poc of last encoded frame mfxI32 SceneChange; // scene change parameter of last encoded frame mfxU32 SChPoc; // poc of frame with scene change mfxU32 LastIEncOrder; // encoded order of last intra frame mfxU32 LastIDREncOrder; // encoded order of last idr frame mfxU32 LastIDRSceneChange; // last idr was scene change mfxU32 LastIQpAct; // Qp of last intra frame mfxU32 LastIFrameSize; // encoded frame size of last non B frame (is used for sceneChange) mfxF64 LastICmplx; // Cmplx of last intra frame mfxU32 LastIQpSetOrder; // Qp of last intra frame mfxU32 LastQpUpdateOrder; // When using UpdateQpParams mfxU32 LastIQpMin; // Qp of last intra frame mfxU32 LastIQpSet; // Qp of last intra frame mfxU32 LastNonBFrameSize; // encoded frame size of last non B frame (is used for sceneChange) LA_Ctx la; mfxF64 fAbLong; // frame aberration (long period) mfxF64 fAbShort; // frame aberration (short period) mfxF64 fAbLA; // frame aberration (LA period) mfxF64 dQuantAb; // dequant aberration mfxF64 totalDeviation; // deviation from target bitrate (total) mfxF64 eRate; // eRate of last encoded frame, this parameter is used for scene change calculation mfxF64 eRateSH; // eRate of last encoded scene change frame, this parameter is used for scene change calculation }; class AVGBitrate { public: AVGBitrate(mfxU32 windowSize, mfxU32 maxBitPerFrame, mfxU32 avgBitPerFrame, bool bLA = false): m_maxWinBits(maxBitPerFrame*windowSize), m_maxWinBitsLim(0), m_avgBitPerFrame(std::min(avgBitPerFrame, maxBitPerFrame)), m_currPosInWindow(windowSize - 1), m_lastFrameOrder(mfxU32(-1)), m_bLA(bLA) { windowSize = windowSize > 0 ? windowSize : 1; // kw m_slidingWindow.resize(windowSize); for (mfxU32 i = 0; i < windowSize; i++) { m_slidingWindow[i] = maxBitPerFrame / 3; //initial value to prevent big first frames } m_maxWinBitsLim = GetMaxWinBitsLim(); } virtual ~AVGBitrate() { //printf("------------ AVG Bitrate: %d ( %d), NumberOfErrors %d\n", m_MaxBitReal, m_MaxBitReal_temp, m_NumberOfErrors); } void UpdateSlidingWindow(mfxU32 sizeInBits, mfxU32 FrameOrder, bool bPanic, bool bSH, mfxU32 recode, mfxU32 /* qp */) { mfxU32 windowSize = (mfxU32)m_slidingWindow.size(); bool bNextFrame = FrameOrder != m_lastFrameOrder; if (bNextFrame) { m_lastFrameOrder = FrameOrder; m_currPosInWindow = (m_currPosInWindow + 1) % windowSize; } m_slidingWindow[m_currPosInWindow] = sizeInBits; if (bNextFrame) { if (bPanic || bSH) { m_maxWinBitsLim = mfx::clamp((GetLastFrameBits(windowSize,false) + m_maxWinBits) / 2, GetMaxWinBitsLim(), m_maxWinBits); } else { if (recode) m_maxWinBitsLim = mfx::clamp(GetLastFrameBits(windowSize,false) + GetStep() / 2, m_maxWinBitsLim, m_maxWinBits); else if ((m_maxWinBitsLim > GetMaxWinBitsLim() + GetStep()) && (m_maxWinBitsLim - GetStep() > (GetLastFrameBits(windowSize - 1, false) + sizeInBits))) m_maxWinBitsLim -= GetStep(); } } } mfxU32 GetMaxFrameSize(bool bPanic, bool bSH, mfxU32 recode) const { mfxU32 winBits = GetLastFrameBits(GetWindowSize() - 1, !bPanic); mfxU32 maxWinBitsLim = m_maxWinBitsLim; if (bSH) maxWinBitsLim = (m_maxWinBits + m_maxWinBitsLim) / 2; if (bPanic) maxWinBitsLim = m_maxWinBits; maxWinBitsLim = std::min(maxWinBitsLim + recode * GetStep() / 2, m_maxWinBits); mfxU32 maxFrameSize = winBits >= m_maxWinBitsLim ? mfxU32(std::max((mfxI32)m_maxWinBits - (mfxI32)winBits, 1)) : maxWinBitsLim - winBits; return maxFrameSize; } mfxU32 GetWindowSize() const { return (mfxU32)m_slidingWindow.size(); } mfxI32 GetBudget(mfxU32 numFrames) const { numFrames = std::min(mfxU32(m_slidingWindow.size()), numFrames); return ((mfxI32)m_maxWinBitsLim - (mfxI32)GetLastFrameBits((mfxU32)m_slidingWindow.size() - numFrames, true)); } protected: mfxU32 m_maxWinBits; mfxU32 m_maxWinBitsLim; mfxU32 m_avgBitPerFrame; mfxU32 m_currPosInWindow; mfxU32 m_lastFrameOrder; bool m_bLA; std::vector m_slidingWindow; mfxU32 GetLastFrameBits(mfxU32 numFrames, bool bCheckSkip) const { mfxU32 size = 0; numFrames = numFrames < m_slidingWindow.size() ? numFrames : (mfxU32)m_slidingWindow.size(); for (mfxU32 i = 0; i < numFrames; i++) { mfxU32 frame_size = m_slidingWindow[(m_currPosInWindow + m_slidingWindow.size() - i) % m_slidingWindow.size()]; if (bCheckSkip && (frame_size < m_avgBitPerFrame / 3)) frame_size = m_avgBitPerFrame / 3; size += frame_size; //printf("GetLastFrames: %d) %d sum %d\n",i,m_slidingWindow[(m_currPosInWindow + m_slidingWindow.size() - i) % m_slidingWindow.size() ], size); } return size; } mfxU32 GetStep() const { return (m_maxWinBits / GetWindowSize() - m_avgBitPerFrame) / (m_bLA ? 4 : 2); } mfxU32 GetMaxWinBitsLim() const { return m_maxWinBits - GetStep() * GetWindowSize(); } }; class BRC_EncToolBase : public IEncToolsBRC { public: BRC_EncToolBase() : m_bInit(false), m_par(), m_hrdSpec(), m_bDynamicInit(false), m_ctx(), m_SkipCount(0), m_ReEncodeCount(0) {} ~BRC_EncToolBase() override { Close(); } mfxStatus Init(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bALTR) override; mfxStatus Reset(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bALTR) override; void Close() override { m_bInit = false; m_bDynamicInit = false; m_FrameStruct.resize(0); } mfxStatus ReportEncResult(mfxU32 dispOrder, mfxEncToolsBRCEncodeResult const & pEncRes) override; mfxStatus SetFrameStruct(mfxU32 dispOrder, mfxEncToolsBRCFrameParams const & pFrameStruct) override; mfxStatus ReportBufferHints(mfxU32 dispOrder, mfxEncToolsBRCBufferHint const & pBufHints) override; mfxStatus ReportGopHints(mfxU32 dispOrder, mfxEncToolsHintPreEncodeGOP const & pGopHints) override; mfxStatus ProcessFrame(mfxU32 dispOrder, mfxEncToolsBRCQuantControl *pFrameQp, mfxEncToolsHintQPMap* qpMapHint) override; mfxStatus UpdateFrame(mfxU32 dispOrder, mfxEncToolsBRCStatus *pFrameSts) override; mfxStatus GetHRDPos(mfxU32 dispOrder, mfxEncToolsBRCHRDPos *pHRDPos) override; protected: bool m_bInit; cBRCParams m_par; std::unique_ptr < HRDCodecSpec> m_hrdSpec; bool m_bDynamicInit; BRC_Ctx m_ctx; std::unique_ptr m_avg; mfxU32 m_SkipCount; mfxU32 m_ReEncodeCount; std::vector m_FrameStruct; virtual mfxU16 FillQpMap(const BRC_FrameStruct&, mfxU32 /*frameQp*/, mfxEncToolsHintQPMap*, mfxI16&) = 0; mfxI32 GetCurQP(mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const; mfxI32 GetSeqQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const; mfxI32 GetPicQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const; mfxF64 ResetQuantAb(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxF64 fAbLong, mfxU32 eo, bool bIdr, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP, bool bNoNewQp) const; mfxI32 GetLaQpEst(mfxU32 LaAvgEncodedSize, mfxF64 inputBitsPerFrame, const BRC_FrameStruct& frameStruct, bool updateState); }; class BRC_EncTool : public BRC_EncToolBase { public: mfxU16 FillQpMap(const BRC_FrameStruct& frameStruct, mfxU32 frameQp, mfxEncToolsHintQPMap* qpMap, mfxI16& qpMapBias) override; }; /* - Current AV1 enctools is based on HEVC enctools - Following 2 LUTs are for the conversion of HEVC QP and AV1 dc_q_idx. */ // HEVC QP to AV1 dc_q_index mfxU8 const HEVC_QP_2_AV1_DC_Q_IDX[52] = { 1, 1, 1, 1, 2, 3, 4, 5, 7, 9, 11, 13, 16, 19, 21, 26, 29, 34, 39, 45, 52, 59, 68, 78, 89, 98, 106, 114, 122, 130, 138, 145, 153, 162, 170, 178, 186, 195, 203, 211, 219, 226, 231, 236, 241, 245, 248, 251, 252, 253, 254, 255 }; // AV1 dc_q_index to HEVC QP mfxU8 const AV1_DC_Q_IDX_2_HEVC_QP[256] = { 0, 4, 4, 5, 6, 7, 8, 8, 8, 9, 9, 10,11,11,11,11, 12,12,13,13,14,14,14,14,15,15,15,16,16,16,16,16, 17,17,17,17,17,17,17,18,18,18,18,19,19,19,19,19, 20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,22, 22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23, 23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24, 25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27, 27,27,27,27,27,27,27,28,28,28,28,28,28,28,29,29, 29,29,29,29,29,29,29,30,30,30,30,30,30,30,31,31, 31,31,31,31,31,31,32,32,32,32,32,32,32,32,33,33, 33,33,33,33,33,33,34,34,34,34,34,34,34,34,35,35, 35,35,35,35,35,35,35,36,36,36,36,36,36,36,36,37, 37,37,37,37,37,37,37,38,38,38,38,38,38,38,38,38, 39,39,39,39,39,39,39,39,40,40,40,40,40,40,40,41, 41,41,41,41,41,42,42,42,42,42,43,43,43,43,43,44, 44,44,44,45,45,45,45,46,46,46,46,47,47,47,48,48 }; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_defs.h000066400000000000000000000057331443134507600300700ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_DEFS_H__ #define __MFX_ENCTOOLS_DEFS_H__ //#include "mfxcommon.h" #include #include #include #ifndef MFX_DEBUG_TRACE #define MFX_STS_TRACE(sts) sts #else template static inline T mfx_print_err(T sts, const char *file, int line, const char *func) { if (sts) { printf("%s: %d: %s: Error = %d\n", file, line, func, sts); } return sts; } #define MFX_STS_TRACE(sts) mfx_print_err(sts, __FILE__, __LINE__, __FUNCTION__) #endif #define MFX_SUCCEEDED(sts) (MFX_STS_TRACE(sts) == MFX_ERR_NONE) #define MFX_RETURN(sts) { return MFX_STS_TRACE(sts); } #define MFX_CHECK(EXPR, ERR) { if (!(EXPR)) MFX_RETURN(ERR); } #define MFX_CHECK_STS(sts) MFX_CHECK(MFX_SUCCEEDED(sts), sts) #define MFX_CHECK_NULL_PTR1(pointer) MFX_CHECK(pointer, MFX_ERR_NULL_PTR) #define MFX_CHECK_NULL_PTR2(p1, p2) { MFX_CHECK(p1, MFX_ERR_NULL_PTR); MFX_CHECK(p2, MFX_ERR_NULL_PTR); } #define MFX_CHECK_NULL_PTR3(p1, p2, p3) { MFX_CHECK(p1, MFX_ERR_NULL_PTR); MFX_CHECK(p2, MFX_ERR_NULL_PTR); MFX_CHECK(p3, MFX_ERR_NULL_PTR); } inline bool IsOn(mfxU32 opt) { return opt == MFX_CODINGOPTION_ON; } inline bool IsOff(mfxU32 opt) { return opt == MFX_CODINGOPTION_OFF; } inline bool IsAdapt(mfxU32 opt) { return opt == MFX_CODINGOPTION_ADAPTIVE; } namespace mfx { // switch to std::clamp when C++17 support will be enabled // Clip value v to range [lo, hi] template constexpr const T& clamp(const T& v, const T& lo, const T& hi) { return std::min(hi, std::max(v, lo)); } // Comp is comparison function object with meaning of 'less' operator (i.e. std::less<> or operator<) template constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp) { return comp(v, lo) ? lo : comp(hi, v) ? hi : v; } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_lpla.h000066400000000000000000000130571443134507600300750ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_LPLA_H__ #define __MFX_ENCTOOLS_LPLA_H__ #include "mfxdefs.h" #include #include #include #include #include "aenc.h" #include "mfx_enctools_utils.h" #include "mfxenctools_dl_int.h" struct MfxFrameSize { mfxU32 dispOrder; mfxU32 encodedFrameSize; mfxU32 frameType; }; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) struct MfxLookAheadReport { mfxU32 StatusReportFeedbackNumber; mfxU8 CqmHint; mfxU8 IntraHint; mfxU8 MiniGopSize; mfxU8 PyramidQpHint; mfxU32 TargetFrameSize; }; enum { CQM_HINT_USE_FLAT_MATRIX = 0, //use flat matrix CQM_HINT_USE_CUST_MATRIX1 = 1, //use customized matrix CQM_HINT_USE_CUST_MATRIX2 = 2, CQM_HINT_USE_CUST_MATRIX3 = 3, CQM_HINT_USE_CUST_MATRIX4 = 4, CQM_HINT_NUM_CUST_MATRIX = 4, CQM_HINT_INVALID = 0xFF //invalid hint }; #endif // MFX_ENABLE_ENCTOOLS_LPLA class LPLA_EncTool { public: LPLA_EncTool(void* module) : m_bInit(false), m_device(nullptr), m_pAllocator(nullptr), m_mfxSession(module), m_pmfxENC(nullptr), m_curDispOrder(-1), m_lookAheadScale (0), m_lookAheadDepth (0), m_lastIFrameNumber(0), m_lastIDRFrameNumber(0), m_lastIPFrameNumber(0), m_nextPisIntra(false), m_GopPicSize(0), m_GopRefDist(0), m_IdrInterval(1), m_codecId(0), m_hRTModule(module) { m_bitstream = {}; m_encParams = {}; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) m_curEncodeHints = {}; #endif m_frameSizes = {}; m_config = {}; } virtual ~LPLA_EncTool () { Close(); } virtual mfxStatus Init(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig); virtual mfxStatus Reset(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig); virtual mfxStatus Close(); virtual MFXDLVideoSession* GetEncSession(); virtual mfxStatus SaveEncodedFrameSize(mfxFrameSurface1* surface, mfxU16 FrameType); virtual mfxStatus Submit(mfxFrameSurface1* surface, mfxU16 FrameType, mfxSyncPoint* pEncSyncp); virtual mfxStatus Query(mfxU32 dispOrder, mfxEncToolsBRCBufferHint *pBufHint); #if defined (MFX_ENABLE_ENCTOOLS_LPLA) virtual mfxStatus Query(mfxU32 dispOrder, mfxEncToolsHintQuantMatrix *pCqmHint); virtual mfxStatus Query(mfxU32 dispOrder, mfxEncToolsHintPreEncodeGOP *pPreEncGOP); #endif virtual mfxStatus InitSession(); virtual mfxStatus InitEncParams(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig); virtual mfxStatus ConfigureExtBuffs(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig); void SetAllocator(mfxFrameAllocator * pAllocator) { m_pAllocator = pAllocator; } void GetDownScaleParams(mfxFrameInfo & fInfo, mfxU32 & downscale) { fInfo = m_encParams.mfx.FrameInfo; downscale = m_lookAheadScale; } protected: bool m_bInit; mfxHDL m_device; mfxU32 m_deviceType; mfxFrameAllocator* m_pAllocator; MFXDLVideoSession m_mfxSession; MFXDLVideoENCODE* m_pmfxENC; mfxBitstream m_bitstream; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) std::list m_encodeHints; MfxLookAheadReport m_curEncodeHints; #endif mfxI32 m_curDispOrder; mfxVideoParam m_encParams; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxExtLplaParam m_extBufLPLA; #endif mfxExtHEVCParam m_extBufHevcParam; mfxExtCodingOption3 m_extBufCO3; mfxExtCodingOption2 m_extBufCO2; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxExtLpLaStatus m_lplaHints; #endif mfxU32 m_lookAheadScale; mfxU32 m_lookAheadDepth; mfxU32 m_lastIFrameNumber; mfxU32 m_lastIDRFrameNumber; mfxU32 m_lastIPFrameNumber; bool m_nextPisIntra; mfxU16 m_GopPicSize; mfxU16 m_GopRefDist; mfxU16 m_IdrInterval; std::list m_frameSizes; mfxExtEncToolsConfig m_config; mfxU32 m_codecId; void* m_hRTModule = nullptr; }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_enctools_utils.h000066400000000000000000000030031443134507600302730ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfxstructures.h" #include "mfx_ext_buffers.h" #include "mfxdefs.h" #include "mfx_enctools_defs.h" namespace EncToolsUtils { template mfxStatus DownScaleNN(T const & pSrc, mfxU32 srcWidth, mfxU32 srcHeight, mfxU32 srcPitch, T & pDst, mfxU32 dstWidth, mfxU32 dstHeight, mfxU32 dstPitch); mfxExtBuffer* Et_GetExtBuffer(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id); }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfx_ienctools.h000066400000000000000000000113431443134507600272320ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_IENCTOOLS_H__ #define __MFX_IENCTOOLS_H__ #include "mfxcommon.h" #include "mfxenctools-int.h" #include "mfx_enctools_defs.h" struct IEncTools { virtual ~IEncTools() {}; virtual mfxStatus Init(mfxExtEncToolsConfig const*, mfxEncToolsCtrl const*) = 0; virtual mfxStatus GetSupportedConfig(mfxExtEncToolsConfig*, mfxEncToolsCtrl const*) = 0; virtual mfxStatus GetActiveConfig(mfxExtEncToolsConfig*) = 0; virtual mfxStatus GetDelayInFrames(mfxExtEncToolsConfig const*, mfxEncToolsCtrl const*, mfxU32* /*numFrames*/) = 0; virtual mfxStatus Reset(mfxExtEncToolsConfig const*, mfxEncToolsCtrl const*) = 0; virtual mfxStatus Close() = 0; virtual mfxStatus Submit(mfxEncToolsTaskParam const*) = 0; virtual mfxStatus Query(mfxEncToolsTaskParam*, mfxU32 /*timeOut*/) = 0; virtual mfxStatus Discard(mfxU32 /*displayOrder*/) = 0; void* m_etModule = nullptr; }; struct IEncToolsBRC { virtual ~IEncToolsBRC() {} virtual mfxStatus Init(mfxEncToolsCtrl const&, bool /*bMBBRC*/, bool) = 0; virtual mfxStatus Reset(mfxEncToolsCtrl const&, bool /*bMBBRC*/, bool) = 0; virtual void Close() = 0; virtual mfxStatus ReportEncResult(mfxU32 /*dispOrder*/, mfxEncToolsBRCEncodeResult const&) = 0; virtual mfxStatus SetFrameStruct(mfxU32 /*dispOrder*/, mfxEncToolsBRCFrameParams const&) = 0; virtual mfxStatus ReportBufferHints(mfxU32 /*dispOrder*/, mfxEncToolsBRCBufferHint const&) = 0; virtual mfxStatus ReportGopHints(mfxU32 /*dispOrder*/, mfxEncToolsHintPreEncodeGOP const&) = 0; virtual mfxStatus ProcessFrame(mfxU32 /*dispOrder*/, mfxEncToolsBRCQuantControl*, mfxEncToolsHintQPMap*) = 0; virtual mfxStatus UpdateFrame(mfxU32 /*dispOrder*/, mfxEncToolsBRCStatus*) = 0; virtual mfxStatus GetHRDPos(mfxU32 /*dispOrder*/, mfxEncToolsBRCHRDPos*) = 0; }; namespace EncToolsFuncs { inline mfxStatus Init(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Init(config, ctrl); } inline mfxStatus GetSupportedConfig(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->GetSupportedConfig(config, ctrl); } inline mfxStatus GetActiveConfig(mfxHDL pthis, mfxExtEncToolsConfig* config) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->GetActiveConfig(config); } inline mfxStatus Reset(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Reset(config, ctrl); } inline mfxStatus Close(mfxHDL pthis) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Close(); } // Submit info to tool inline mfxStatus Submit(mfxHDL pthis, mfxEncToolsTaskParam* submitParam) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Submit(submitParam); } // Query info from tool inline mfxStatus Query(mfxHDL pthis, mfxEncToolsTaskParam* queryParam, mfxU32 timeOut) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Query(queryParam, timeOut); } // Query info from tool inline mfxStatus Discard(mfxHDL pthis, mfxU32 displayOrder) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->Discard(displayOrder); } inline mfxStatus GetDelayInFrames(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl, mfxU32* numFrames) { MFX_CHECK_NULL_PTR1(pthis); return ((IEncTools*)pthis)->GetDelayInFrames(config, ctrl, numFrames); } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/include/mfxenctools_dl_int.h000066400000000000000000000214311443134507600302520ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXENCTOOLS_DL_INT_H__ #define __MFXENCTOOLS_DL_INT_H__ #include "mfx_config.h" #include "mfxvideo++.h" #include "mfx_functions.h" class MFXDLVideoSession : MFXVideoSessionBase { public: decltype(MFXInitEx)* InitExPtr; decltype(MFXClose)* ClosePtr; decltype(MFXQueryVersion)* QueryVersionPtr; decltype(MFXVideoCORE_SetFrameAllocator)* SetFrameAllocatorPtr; decltype(MFXVideoCORE_SetHandle)* SetHandlePtr; decltype(MFXVideoCORE_SyncOperation)* SyncOperationPtr; MFXDLVideoSession(void* module); virtual ~MFXDLVideoSession(void) { Close(); } //override to invoke function pointer mfxStatus Init(mfxIMPL, mfxVersion*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus InitEx(mfxInitParam par) override { return InitExPtr(par, &m_session); } mfxStatus Close(void) override { return ClosePtr(m_session); } mfxStatus QueryIMPL(mfxIMPL*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus QueryVersion(mfxVersion* version) override { return QueryVersionPtr(m_session, version); } mfxStatus JoinSession(mfxSession) override { return MFX_ERR_UNSUPPORTED; } mfxStatus DisjoinSession() override { return MFX_ERR_UNSUPPORTED; } mfxStatus CloneSession(mfxSession*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus SetPriority(mfxPriority) override { return MFX_ERR_UNSUPPORTED; } mfxStatus GetPriority(mfxPriority*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus SetFrameAllocator(mfxFrameAllocator* allocator) override { return SetFrameAllocatorPtr(m_session, allocator); } mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) override { return SetHandlePtr(m_session, type, hdl); } mfxStatus GetHandle(mfxHandleType, mfxHDL*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus QueryPlatform(mfxPlatform*) override { return MFX_ERR_UNSUPPORTED; } mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) override { return SyncOperationPtr(m_session, syncp, wait); } mfxStatus GetSurfaceForEncode(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } mfxStatus GetSurfaceForDecode(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } mfxStatus GetSurfaceForVPP(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } mfxStatus GetSurfaceForVPPOut(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } virtual operator mfxSession(void) override { return m_session; } protected: mfxSession m_session; // (mfxSession) handle to the owning session private: MFXDLVideoSession(const MFXDLVideoSession&); void operator=(MFXDLVideoSession&); }; class MFXDLVideoENCODE : public MFXVideoENCODEBase { public: decltype(MFXVideoENCODE_Init)* InitPtr; decltype(MFXVideoENCODE_Close)* ClosePtr; decltype(MFXVideoENCODE_EncodeFrameAsync)* EncodeFrameAsyncPtr; explicit MFXDLVideoENCODE(mfxSession session, void* module); virtual ~MFXDLVideoENCODE(void) { Close(); } virtual mfxStatus Query(mfxVideoParam*, mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus QueryIOSurf(mfxVideoParam*, mfxFrameAllocRequest*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus Init(mfxVideoParam* par) override { return InitPtr(m_session, par); } virtual mfxStatus Reset(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus Close(void) override { return ClosePtr(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetEncodeStat(mfxEncodeStat*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl* ctrl, mfxFrameSurface1* surface, mfxBitstream* bs, mfxSyncPoint* syncp) override { return EncodeFrameAsyncPtr(m_session, ctrl, surface, bs, syncp); } virtual mfxStatus GetSurface(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; class MFXDLVideoDECODE : public MFXVideoDECODEBase { public: explicit MFXDLVideoDECODE(mfxSession session, void*) { m_session = session; } virtual ~MFXDLVideoDECODE(void) { Close(); } virtual mfxStatus Query(mfxVideoParam*, mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus DecodeHeader(mfxBitstream*, mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus QueryIOSurf(mfxVideoParam*, mfxFrameAllocRequest*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus Init(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus Reset(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus Close(void) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetVideoParam(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetDecodeStat(mfxDecodeStat*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetPayload(mfxU64*, mfxPayload*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus SetSkipMode(mfxSkipMode) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus DecodeFrameAsync(mfxBitstream*, mfxFrameSurface1*, mfxFrameSurface1**, mfxSyncPoint*) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetSurface(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; class MFXDLVideoVPP : public MFXVideoVPPBase { public: decltype(MFXVideoVPP_QueryIOSurf)* QueryIOSurfPtr; decltype(MFXVideoVPP_Init)* InitPtr; decltype(MFXVideoVPP_Close)* ClosePtr; decltype(MFXVideoVPP_RunFrameVPPAsync)* RunFrameVPPAsyncPtr; explicit MFXDLVideoVPP(mfxSession session, void* module); virtual ~MFXDLVideoVPP(void) { Close(); } virtual mfxStatus Query(mfxVideoParam*, mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest request[2]) override { return QueryIOSurfPtr(m_session, par, request); } virtual mfxStatus Init(mfxVideoParam* par) override { return InitPtr(m_session, par); } virtual mfxStatus Reset(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus Close(void) override { return ClosePtr(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam*) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus GetVPPStat(mfxVPPStat*) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1* in, mfxFrameSurface1* out, mfxExtVppAuxData* aux, mfxSyncPoint* syncp) override { return RunFrameVPPAsyncPtr(m_session, in, out, aux, syncp); } virtual mfxStatus GetSurfaceIn(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus GetSurfaceOut(mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED;; } virtual mfxStatus ProcessFrameAsync(mfxFrameSurface1*, mfxFrameSurface1**) override { return MFX_ERR_UNSUPPORTED; } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/libenctools.def000066400000000000000000000000461443134507600255600ustar00rootroot00000000000000EXPORTS MFXVideoENCODE_NewEncToolsoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/libenctools.map000066400000000000000000000001131443134507600255720ustar00rootroot00000000000000LIBENCTOOLS { global: MFXVideoENCODE_NewEncTools; local: *; };oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/000077500000000000000000000000001443134507600233525ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/dll_main.cpp000066400000000000000000000030631443134507600256370ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enctools.h" #include "mfx_loader_utils.h" #define DLL_EXPORT extern "C" __attribute__((visibility("default"))) DLL_EXPORT void * MFX_CDECL MFXVideoENCODE_NewEncTools(void* etModule, const char* rtPath) { std::unique_ptr impl; const char* rtDLLName = rtPath; void* rtModule = LoadModule(rtDLLName); if (!rtModule) { return nullptr; } impl.reset(new EncTools(rtModule, etModule)); return impl.release(); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_aenc.cpp000066400000000000000000000326721443134507600275560ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enctools.h" #include #include #include "mfx_enctools_aenc.h" #include "limits.h" #if !defined(MFX_ENABLE_ADAPTIVE_ENCODE) mfxStatus AEncInit(mfxHDL*, AEncParam) { return MFX_ERR_UNSUPPORTED; } mfxStatus AEncProcessFrame(mfxHDL, mfxU32, mfxU8*, mfxI32, AEncFrame*) { return MFX_ERR_UNSUPPORTED; } void AEncUpdateFrame(mfxHDL, mfxU32, mfxU32, mfxU32) {} void AEncClose(mfxHDL) {} mfxU16 AEncGetIntraDecision(mfxHDL, mfxU32) { return 0; } mfxU16 AEncGetPersistenceMap(mfxHDL, mfxU32, mfxU8[]) { return 0; } mfxU16 AEncGetLastPQp(mfxHDL) { return 0; } mfxI8 AEncAPQSelect(mfxHDL, mfxU32, mfxU32, mfxU32, mfxU32, mfxU32, mfxU32) { return 0; } #endif mfxStatus AEnc_EncTool::Init(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig) { mfxFrameInfo const *frameInfo = &ctrl.FrameInfo; m_aencPar.SrcFrameWidth = frameInfo->Width; m_aencPar.SrcFrameHeight = frameInfo->Height; bool doDownScaling = DoDownScaling(*frameInfo); if (doDownScaling) { FrameWidth_aligned = ENC_TOOLS_DS_FRAME_WIDTH; FrameHeight_aligned = ENC_TOOLS_DS_FRAME_HEIGHT; m_aencPar.FrameWidth = ENC_TOOLS_DS_FRAME_WIDTH; m_aencPar.FrameHeight = ENC_TOOLS_DS_FRAME_HEIGHT; m_aencPar.Pitch = ENC_TOOLS_DS_FRAME_WIDTH; } else { FrameWidth_aligned = frameInfo->Width; FrameHeight_aligned = frameInfo->Height; m_aencPar.FrameWidth = frameInfo->CropW ? frameInfo->CropW : frameInfo->Width; m_aencPar.FrameHeight = frameInfo->CropH ? frameInfo->CropH : frameInfo->Height; m_aencPar.Pitch = frameInfo->Width; } m_aencPar.CodecId = ctrl.CodecId; m_aencPar.ColorFormat = MFX_FOURCC_NV12; m_aencPar.MaxMiniGopSize = ctrl.MaxGopRefDist; m_aencPar.MaxGopSize = m_aencPar.GopPicSize = (ctrl.MaxGopSize!= 0) ? ctrl.MaxGopSize : 65000; m_aencPar.MinGopSize = std::max(m_aencPar.MaxMiniGopSize*2, 16u); // to prevent close I frames m_aencPar.StrictIFrame = IsOff(pConfig.AdaptiveI); m_aencPar.MaxIDRDist = ctrl.MaxIDRDist; m_aencPar.AGOP = !IsOff(pConfig.AdaptiveB) && (doDownScaling || m_aencPar.MaxMiniGopSize == 2); // ML AGOP tuned only for downscale path. m_aencPar.APQ = (!IsOff(pConfig.AdaptivePyramidQuantP)) || (!IsOff(pConfig.AdaptivePyramidQuantB)); m_aencPar.AREF = (!IsOff(pConfig.AdaptiveRefP)) || (!IsOff(pConfig.AdaptiveRefB)); m_aencPar.ALTR = (!IsOff(pConfig.AdaptiveLTR)); m_aencPar.NumRefP = ctrl.NumRefP; mfxStatus sts = AEncInit(&m_aenc, m_aencPar); MFX_CHECK_STS(sts); m_bInit = true; return sts; } mfxStatus AEnc_EncTool::GetInputFrameInfo(mfxFrameInfo &frameInfo) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); frameInfo.FourCC = MFX_FOURCC_NV12; frameInfo.Width = (mfxU16)FrameWidth_aligned; frameInfo.Height = (mfxU16)FrameHeight_aligned; frameInfo.BitDepthLuma = frameInfo.BitDepthChroma = 8; frameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; //??? frameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; return MFX_ERR_NONE; } bool AEnc_EncTool::DoDownScaling(mfxFrameInfo const & frameInfo) { if (frameInfo.Width > ENC_TOOLS_DS_FRAME_WIDTH + (ENC_TOOLS_DS_FRAME_WIDTH >> 1) || frameInfo.Height > ENC_TOOLS_DS_FRAME_HEIGHT + (ENC_TOOLS_DS_FRAME_HEIGHT >> 1)) return true; return false; } using namespace EncToolsUtils; mfxStatus AEnc_EncTool::SubmitFrame(mfxFrameSurface1 *surface) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = MFX_ERR_NONE; mfxU32 wS, hS, pitch; mfxU8 *pS0, *pS; if (surface->Info.CropH > 0 && surface->Info.CropW > 0) { wS = surface->Info.CropW; hS = surface->Info.CropH; } else { wS = surface->Info.Width; hS = surface->Info.Height; } pitch = surface->Data.Pitch; pS = pS0 = surface->Data.Y + surface->Info.CropX + surface->Info.CropY * pitch; if (wS > m_aencPar.FrameWidth || hS > m_aencPar.FrameHeight) { if (!m_ptmpFrame) m_ptmpFrame = new mfxU8[m_aencPar.FrameWidth * m_aencPar.FrameHeight]; sts = DownScaleNN(*pS, wS, hS, pitch, *m_ptmpFrame, m_aencPar.FrameWidth, m_aencPar.FrameHeight, m_aencPar.FrameWidth); pitch = m_aencPar.FrameWidth; pS = m_ptmpFrame; MFX_CHECK_STS(sts); } AEncFrame res; if (MFX_ERR_NONE != AEncProcessFrame(m_aenc, surface->Data.FrameOrder, pS, pitch, &res)) return MFX_ERR_MORE_DATA; //else // res.print(); m_outframes.push_back(res); return sts; } mfxStatus AEnc_EncTool::FindOutFrame(mfxU32 displayOrder) { struct CompareByDisplayOrder { mfxU32 m_DispOrder; CompareByDisplayOrder(mfxU32 frameOrder) : m_DispOrder(frameOrder) {} bool operator ()(AEncFrame const & extframe) const { return extframe.POC == m_DispOrder; } }; { auto outframe = std::find_if(m_outframes.begin(), m_outframes.end(), CompareByDisplayOrder(displayOrder)); if (outframe == m_outframes.end()) { // EOS:output previously submitted frames mfxFrameSurface1 emptySrf = {}; emptySrf.Data.FrameOrder = UINT_MAX; SubmitFrame(&emptySrf); outframe = std::find_if(m_outframes.begin(), m_outframes.end(), CompareByDisplayOrder(displayOrder)); if (outframe == m_outframes.end()) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } m_frameIt = outframe; } return MFX_ERR_NONE; } mfxStatus AEnc_EncTool::ReportEncResult(mfxU32 displayOrder, mfxEncToolsBRCEncodeResult const & pEncRes) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); AEncUpdateFrame(m_aenc, displayOrder, pEncRes.CodedFrameSize*8, pEncRes.QpY); return MFX_ERR_NONE; } mfxStatus AEnc_EncTool::GetMLApqDeltaQp(mfxU32 displayOrder, mfxI8 & QPDeltaExplicitModulation) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); mfxU32 SC = (*m_frameIt).FeaturesAPQ[0]; mfxU32 TSC = (*m_frameIt).FeaturesAPQ[1]; mfxU32 MVSize = (*m_frameIt).FeaturesAPQ[2]; mfxU32 Contrast = (*m_frameIt).FeaturesAPQ[3]; mfxU32 PyramidLayer = (*m_frameIt).PyramidLayer; mfxU32 BaseQp = AEncGetLastPQp(m_aenc); QPDeltaExplicitModulation = AEncAPQSelect(m_aenc, SC, TSC, MVSize, Contrast, PyramidLayer, BaseQp); return MFX_ERR_NONE; } mfxStatus AEnc_EncTool::GetSCDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeSceneChange *pPreEncSC) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); pPreEncSC->SceneChangeFlag = static_cast((*m_frameIt).SceneChanged); pPreEncSC->RepeatedFrameFlag = static_cast((*m_frameIt).RepeatedFrame); pPreEncSC->TemporalComplexity = static_cast((*m_frameIt).TemporalComplexity); pPreEncSC->SpatialComplexity = static_cast((*m_frameIt).SpatialComplexity); return sts; } mfxStatus AEnc_EncTool::GetPersistenceMap(mfxU32 displayOrder, mfxEncToolsHintPreEncodeSceneChange *pPreEncSC) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); mfxU16 count = 0; std::vector::iterator startIt = m_frameIt; // Curr Frame ++startIt; // Next Frame if (startIt != m_outframes.end()) { memset(pPreEncSC->PersistenceMap, 0, sizeof(pPreEncSC->PersistenceMap)); pPreEncSC->PersistenceMapNZ = 0; { for (mfxU32 i = 0; i < MFX_ENCTOOLS_PREENC_MAP_SIZE; i++) { std::vector::iterator frameIt = startIt; do { if (frameIt->PMap[i]) { if (pPreEncSC->PersistenceMap[i] < UCHAR_MAX) pPreEncSC->PersistenceMap[i] += frameIt->PMap[i]; } else break; } while (++frameIt != m_outframes.end()); if (pPreEncSC->PersistenceMap[i]) count++; } pPreEncSC->PersistenceMapNZ = count; } } else { pPreEncSC->PersistenceMapNZ = AEncGetPersistenceMap(m_aenc, displayOrder, pPreEncSC->PersistenceMap); // has async issues } return MFX_ERR_NONE; } mfxStatus AEnc_EncTool::GetIntraDecision(mfxU32 displayOrder, mfxU16 *frameType) { displayOrder; MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); *frameType = AEncGetIntraDecision(m_aenc, displayOrder); return MFX_ERR_NONE; } mfxStatus AEnc_EncTool::GetGOPDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeGOP *pPreEncGOP) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pPreEncGOP); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); mfxU16 miniGOP = (mfxU16)(*m_frameIt).MiniGopSize; pPreEncGOP->MiniGopSize = miniGOP; switch ((*m_frameIt).Type) { case MFX_FRAMETYPE_IDR: pPreEncGOP->FrameType = MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; break; case MFX_FRAMETYPE_I: pPreEncGOP->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; break; case MFX_FRAMETYPE_P: pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; break; case MFX_FRAMETYPE_B: pPreEncGOP->FrameType = MFX_FRAMETYPE_B; break; default: pPreEncGOP->FrameType = MFX_FRAMETYPE_UNKNOWN; } pPreEncGOP->QPDelta = (mfxI16)(*m_frameIt).DeltaQP; if (m_aencPar.APQ) { if (m_aencPar.CodecId == MFX_CODEC_HEVC || m_aencPar.CodecId == MFX_CODEC_AV1) { if (miniGOP >= 8) pPreEncGOP->QPModulation = MFX_QP_MODULATION_LOW + (mfxI16)(*m_frameIt).ClassAPQ; else pPreEncGOP->QPModulation = (miniGOP == 4) ? 2 : 1; } else if (m_aencPar.CodecId == MFX_CODEC_AVC) { if (miniGOP >= 8) { switch ((mfxI16)(*m_frameIt).ClassAPQ) { case 1: pPreEncGOP->QPModulation = MFX_QP_MODULATION_LOW; break; case 2: pPreEncGOP->QPModulation = MFX_QP_MODULATION_MEDIUM; break; case 3: pPreEncGOP->QPModulation = MFX_QP_MODULATION_HIGH; break; default: pPreEncGOP->QPModulation = MFX_QP_MODULATION_LOW; break; } } else { pPreEncGOP->QPModulation = (miniGOP == 4) ? 2 : 1; } } else { pPreEncGOP->QPModulation = MFX_QP_MODULATION_NOT_DEFINED; } } else { pPreEncGOP->QPModulation = MFX_QP_MODULATION_NOT_DEFINED; } //printf("%d\n", pPreEncGOP->QPDelta); return sts; } mfxStatus AEnc_EncTool::GetARefDecision(mfxU32 displayOrder, mfxEncToolsHintPreEncodeARefFrames *pPreEncARef) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pPreEncARef); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); pPreEncARef->CurrFrameType = (mfxU16)((*m_frameIt).LTR ? MFX_REF_FRAME_TYPE_LTR : ((*m_frameIt).KeepInDPB ? MFX_REF_FRAME_TYPE_KEY : MFX_REF_FRAME_NORMAL)); pPreEncARef->RejectedRefListSize = std::min((mfxU16)(*m_frameIt).RemoveFromDPBSize, 16); std::copy((*m_frameIt).RemoveFromDPB, (*m_frameIt).RemoveFromDPB + pPreEncARef->RejectedRefListSize, pPreEncARef->RejectedRefList); pPreEncARef->PreferredRefListSize = std::min((mfxU16)(*m_frameIt).RefListSize, 16); std::copy((*m_frameIt).RefList, (*m_frameIt).RefList + pPreEncARef->PreferredRefListSize, pPreEncARef->PreferredRefList); pPreEncARef->LongTermRefListSize = std::min((mfxU16)(*m_frameIt).LongTermRefListSize, 16); std::copy((*m_frameIt).LongTermRefList, (*m_frameIt).LongTermRefList + pPreEncARef->LongTermRefListSize, pPreEncARef->LongTermRefList); return sts; } mfxStatus AEnc_EncTool::CompleteFrame(mfxU32 displayOrder) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = FindOutFrame(displayOrder); MFX_CHECK_STS(sts); m_outframes.erase(m_frameIt); return MFX_ERR_NONE; } void AEnc_EncTool::Close() { if (m_bInit) { AEncClose(m_aenc); delete m_ptmpFrame; m_bInit = false; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_allocator.cpp000066400000000000000000000762001443134507600306230ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include "mfx_enctools.h" MFXFrameAllocator::MFXFrameAllocator() { pthis = this; Alloc = Alloc_; Lock = Lock_; Free = Free_; Unlock = Unlock_; GetHDL = GetHDL_; } MFXFrameAllocator::~MFXFrameAllocator() { } mfxStatus MFXFrameAllocator::Alloc_(mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) { if (0 == pthis) return MFX_ERR_MEMORY_ALLOC; MFXFrameAllocator& self = *(MFXFrameAllocator *)pthis; return self.AllocFrames(request, response); } mfxStatus MFXFrameAllocator::Lock_(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) { if (0 == pthis) return MFX_ERR_MEMORY_ALLOC; MFXFrameAllocator& self = *(MFXFrameAllocator *)pthis; return self.LockFrame(mid, ptr); } mfxStatus MFXFrameAllocator::Unlock_(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) { if (0 == pthis) return MFX_ERR_MEMORY_ALLOC; MFXFrameAllocator& self = *(MFXFrameAllocator *)pthis; return self.UnlockFrame(mid, ptr); } mfxStatus MFXFrameAllocator::Free_(mfxHDL pthis, mfxFrameAllocResponse *response) { if (0 == pthis) return MFX_ERR_MEMORY_ALLOC; MFXFrameAllocator& self = *(MFXFrameAllocator *)pthis; return self.FreeFrames(response); } mfxStatus MFXFrameAllocator::GetHDL_(mfxHDL pthis, mfxMemId mid, mfxHDL *handle) { if (0 == pthis) return MFX_ERR_MEMORY_ALLOC; MFXFrameAllocator& self = *(MFXFrameAllocator *)pthis; return self.GetFrameHDL(mid, handle); } BaseFrameAllocator::BaseFrameAllocator() { } BaseFrameAllocator::~BaseFrameAllocator() { } mfxStatus BaseFrameAllocator::CheckRequestType(mfxFrameAllocRequest *request) { if (0 == request) return MFX_ERR_NULL_PTR; // check that Media SDK component is specified in request if ((request->Type & MEMTYPE_FROM_MASK) != 0) return MFX_ERR_NONE; else return MFX_ERR_UNSUPPORTED; } mfxStatus BaseFrameAllocator::AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) { if (0 == request || 0 == response || 0 == request->NumFrameSuggested) return MFX_ERR_MEMORY_ALLOC; if (MFX_ERR_NONE != CheckRequestType(request)) return MFX_ERR_UNSUPPORTED; mfxStatus sts = MFX_ERR_NONE; if ( (request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) && (request->Type & MFX_MEMTYPE_FROM_DECODE) ) { // external decoder allocations std::list::iterator it = std::find_if( m_ExtResponses.begin() , m_ExtResponses.end() , UniqueResponse (*response, request->Info.CropW, request->Info.CropH, 0)); if (it != m_ExtResponses.end()) { // check if enough frames were allocated if (request->NumFrameMin > it->NumFrameActual) return MFX_ERR_MEMORY_ALLOC; it->m_refCount++; // return existing response *response = (mfxFrameAllocResponse&)*it; } else { sts = AllocImpl(request, response); if (sts == MFX_ERR_NONE) { m_ExtResponses.push_back(UniqueResponse(*response, request->Info.CropW, request->Info.CropH, request->Type & MEMTYPE_FROM_MASK)); } } } else { // internal allocations // reserve space before allocation to avoid memory leak std::list tmp(1, mfxFrameAllocResponse(), m_responses.get_allocator()); sts = AllocImpl(request, response); if (sts == MFX_ERR_NONE) { m_responses.splice(m_responses.end(), tmp); m_responses.back() = *response; } } return sts; } mfxStatus BaseFrameAllocator::FreeFrames(mfxFrameAllocResponse *response) { if (response == 0) return MFX_ERR_INVALID_HANDLE; if (response->mids == nullptr || response->NumFrameActual == 0) return MFX_ERR_NONE; mfxStatus sts = MFX_ERR_NONE; // check whether response is an external decoder response std::list::iterator i = std::find_if( m_ExtResponses.begin(), m_ExtResponses.end(), std::bind1st(IsSame(), *response)); if (i != m_ExtResponses.end()) { if ((--i->m_refCount) == 0) { sts = ReleaseResponse(response); m_ExtResponses.erase(i); } return sts; } // if not found so far, then search in internal responses std::list::iterator i2 = std::find_if(m_responses.begin(), m_responses.end(), std::bind1st(IsSame(), *response)); if (i2 != m_responses.end()) { sts = ReleaseResponse(response); m_responses.erase(i2); return sts; } // not found anywhere, report an error return MFX_ERR_INVALID_HANDLE; } mfxStatus BaseFrameAllocator::Close() { std::list ::iterator i; for (i = m_ExtResponses.begin(); i!= m_ExtResponses.end(); i++) { ReleaseResponse(&*i); } m_ExtResponses.clear(); std::list ::iterator i2; for (i2 = m_responses.begin(); i2!= m_responses.end(); i2++) { ReleaseResponse(&*i2); } return MFX_ERR_NONE; } #include #include namespace MfxLoader { SimpleLoader::SimpleLoader(const char* name) { dlerror(); so_handle = dlopen(name, RTLD_GLOBAL | RTLD_NOW); if (NULL == so_handle) { std::cerr << dlerror() << std::endl; throw std::runtime_error("Can't load library"); } } void* SimpleLoader::GetFunction(const char* name) { void* fn_ptr = dlsym(so_handle, name); if (!fn_ptr) throw std::runtime_error("Can't find function"); return fn_ptr; } SimpleLoader::~SimpleLoader() { if (so_handle) dlclose(so_handle); } #define SIMPLE_LOADER_STRINGIFY1( x) #x #define SIMPLE_LOADER_STRINGIFY(x) SIMPLE_LOADER_STRINGIFY1(x) #define SIMPLE_LOADER_DECORATOR1(fun,suffix) fun ## _ ## suffix #define SIMPLE_LOADER_DECORATOR(fun,suffix) SIMPLE_LOADER_DECORATOR1(fun,suffix) // Following macro applied on vaInitialize will give: vaInitialize((vaInitialize_type)lib.GetFunction("vaInitialize")) #define SIMPLE_LOADER_FUNCTION(name) name( (SIMPLE_LOADER_DECORATOR(name, type)) lib.GetFunction(SIMPLE_LOADER_STRINGIFY(name)) ) VA_Proxy::VA_Proxy() : lib("libva.so.2") , SIMPLE_LOADER_FUNCTION(vaInitialize) , SIMPLE_LOADER_FUNCTION(vaTerminate) , SIMPLE_LOADER_FUNCTION(vaCreateSurfaces) , SIMPLE_LOADER_FUNCTION(vaDestroySurfaces) , SIMPLE_LOADER_FUNCTION(vaCreateBuffer) , SIMPLE_LOADER_FUNCTION(vaDestroyBuffer) , SIMPLE_LOADER_FUNCTION(vaMapBuffer) , SIMPLE_LOADER_FUNCTION(vaUnmapBuffer) , SIMPLE_LOADER_FUNCTION(vaDeriveImage) , SIMPLE_LOADER_FUNCTION(vaDestroyImage) , SIMPLE_LOADER_FUNCTION(vaSyncSurface) { } VA_Proxy::~VA_Proxy() {} #undef SIMPLE_LOADER_FUNCTION } // MfxLoader mfxStatus va_to_mfx_status(VAStatus va_res) { mfxStatus mfxRes = MFX_ERR_NONE; switch (va_res) { case VA_STATUS_SUCCESS: mfxRes = MFX_ERR_NONE; break; case VA_STATUS_ERROR_ALLOCATION_FAILED: mfxRes = MFX_ERR_MEMORY_ALLOC; break; case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED: case VA_STATUS_ERROR_UNSUPPORTED_PROFILE: case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT: case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT: case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED: case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED: mfxRes = MFX_ERR_UNSUPPORTED; break; case VA_STATUS_ERROR_INVALID_DISPLAY: case VA_STATUS_ERROR_INVALID_CONFIG: case VA_STATUS_ERROR_INVALID_CONTEXT: case VA_STATUS_ERROR_INVALID_SURFACE: case VA_STATUS_ERROR_INVALID_BUFFER: case VA_STATUS_ERROR_INVALID_IMAGE: case VA_STATUS_ERROR_INVALID_SUBPICTURE: mfxRes = MFX_ERR_NOT_INITIALIZED; break; case VA_STATUS_ERROR_INVALID_PARAMETER: mfxRes = MFX_ERR_INVALID_VIDEO_PARAM; default: mfxRes = MFX_ERR_UNKNOWN; break; } return mfxRes; } enum { MFX_FOURCC_VP8_NV12 = MFX_MAKEFOURCC('V', 'P', '8', 'N'), MFX_FOURCC_VP8_MBDATA = MFX_MAKEFOURCC('V', 'P', '8', 'M'), MFX_FOURCC_VP8_SEGMAP = MFX_MAKEFOURCC('V', 'P', '8', 'S'), }; unsigned int ConvertMfxFourccToVAFormat(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: return VA_FOURCC_NV12; case MFX_FOURCC_YUY2: return VA_FOURCC_YUY2; case MFX_FOURCC_YV12: return VA_FOURCC_YV12; case MFX_FOURCC_RGB4: return VA_FOURCC_ARGB; case MFX_FOURCC_A2RGB10: return VA_FOURCC_ARGB; // rt format will be VA_RT_FORMAT_RGB32_10BPP case MFX_FOURCC_BGR4: return VA_FOURCC_ABGR; case MFX_FOURCC_P8: return VA_FOURCC_P208; case MFX_FOURCC_P010: return VA_FOURCC_P010; case MFX_FOURCC_Y210: return VA_FOURCC_Y210; case MFX_FOURCC_Y410: return VA_FOURCC_Y410; case MFX_FOURCC_P016: return VA_FOURCC_P016; case MFX_FOURCC_Y216: return VA_FOURCC_Y216; case MFX_FOURCC_Y416: return VA_FOURCC_Y416; case MFX_FOURCC_AYUV: return VA_FOURCC_AYUV; case MFX_FOURCC_RGB565: return VA_FOURCC_RGB565; case MFX_FOURCC_RGBP: return VA_RT_FORMAT_RGBP; default: assert(!"unsupported fourcc"); return 0; } } unsigned int ConvertVP8FourccToMfxFourcc(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_VP8_NV12: case MFX_FOURCC_VP8_MBDATA: return MFX_FOURCC_NV12; case MFX_FOURCC_VP8_SEGMAP: return MFX_FOURCC_P8; default: return fourcc; } } vaapiFrameAllocator::vaapiFrameAllocator() : m_dpy(0), m_libva(new MfxLoader::VA_Proxy), m_bAdaptivePlayback(false), m_Width(0), m_Height(0) { } vaapiFrameAllocator::~vaapiFrameAllocator() { Close(); delete m_libva; } mfxStatus vaapiFrameAllocator::Init(mfxAllocatorParams* pParams) { vaapiAllocatorParams* p_vaapiParams = dynamic_cast(pParams); if ((NULL == p_vaapiParams) || (NULL == p_vaapiParams->m_dpy)) return MFX_ERR_NOT_INITIALIZED; m_dpy = p_vaapiParams->m_dpy; m_bAdaptivePlayback = p_vaapiParams->bAdaptivePlayback; return MFX_ERR_NONE; } mfxStatus vaapiFrameAllocator::CheckRequestType(mfxFrameAllocRequest* request) { mfxStatus sts = BaseFrameAllocator::CheckRequestType(request); if (MFX_ERR_NONE != sts) return sts; if ((request->Type & (MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET)) != 0) return MFX_ERR_NONE; else return MFX_ERR_UNSUPPORTED; } mfxStatus vaapiFrameAllocator::Close() { return BaseFrameAllocator::Close(); } mfxStatus vaapiFrameAllocator::AllocImpl(mfxFrameAllocRequest* request, mfxFrameAllocResponse* response) { mfxStatus mfx_res = MFX_ERR_NONE; VAStatus va_res = VA_STATUS_SUCCESS; unsigned int va_fourcc = 0; VASurfaceID* surfaces = NULL; vaapiMemId* vaapi_mids = NULL, * vaapi_mid = NULL; mfxMemId* mids = NULL; mfxU32 fourcc = request->Info.FourCC; mfxU16 surfaces_num = request->NumFrameSuggested, numAllocated = 0, i = 0; bool bCreateSrfSucceeded = false; memset(response, 0, sizeof(mfxFrameAllocResponse)); // VP8 hybrid driver has weird requirements for allocation of surfaces/buffers for VP8 encoding // to comply with them additional logic is required to support regular and VP8 hybrid allocation pathes mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(fourcc); va_fourcc = ConvertMfxFourccToVAFormat(mfx_fourcc); if (!va_fourcc || ((VA_FOURCC_NV12 != va_fourcc) && (VA_FOURCC_YV12 != va_fourcc) && (VA_FOURCC_YUY2 != va_fourcc) && (VA_FOURCC_ARGB != va_fourcc) && (VA_FOURCC_ABGR != va_fourcc) && (VA_FOURCC_P208 != va_fourcc) && (VA_FOURCC_P010 != va_fourcc) && (VA_FOURCC_YUY2 != va_fourcc) && (VA_FOURCC_Y210 != va_fourcc) && (VA_FOURCC_Y410 != va_fourcc) && (VA_FOURCC_RGB565 != va_fourcc) && (VA_RT_FORMAT_RGBP != va_fourcc) && (VA_FOURCC_P016 != va_fourcc) && (VA_FOURCC_Y216 != va_fourcc) && (VA_FOURCC_Y416 != va_fourcc) && (VA_FOURCC_AYUV != va_fourcc))) { return MFX_ERR_MEMORY_ALLOC; } if (!surfaces_num) { return MFX_ERR_MEMORY_ALLOC; } if (MFX_ERR_NONE == mfx_res) { surfaces = (VASurfaceID*)calloc(surfaces_num, sizeof(VASurfaceID)); vaapi_mids = (vaapiMemId*)calloc(surfaces_num, sizeof(vaapiMemId)); mids = (mfxMemId*)calloc(surfaces_num, sizeof(mfxMemId)); if ((NULL == surfaces) || (NULL == vaapi_mids) || (NULL == mids)) mfx_res = MFX_ERR_MEMORY_ALLOC; } m_Width = request->Info.Width; m_Height = request->Info.Height; if (MFX_ERR_NONE == mfx_res) { if (m_bAdaptivePlayback) { for (i = 0; i < surfaces_num; ++i) { vaapi_mid = &(vaapi_mids[i]); vaapi_mid->m_fourcc = fourcc; surfaces[i] = (VASurfaceID)VA_INVALID_ID; vaapi_mid->m_surface = &surfaces[i]; mids[i] = vaapi_mid; } response->mids = mids; response->NumFrameActual = surfaces_num; return MFX_ERR_NONE; } if (VA_FOURCC_P208 != va_fourcc) { unsigned int format; VASurfaceAttrib attrib[2]; VASurfaceAttrib* pAttrib = &attrib[0]; int attrCnt = 0; attrib[attrCnt].type = VASurfaceAttribPixelFormat; attrib[attrCnt].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[attrCnt].value.type = VAGenericValueTypeInteger; attrib[attrCnt++].value.value.i = (va_fourcc == VA_RT_FORMAT_RGBP ? VA_FOURCC_RGBP : va_fourcc); format = va_fourcc; if ((fourcc == MFX_FOURCC_VP8_NV12) || ((MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET & request->Type) && ((fourcc == MFX_FOURCC_RGB4) || (fourcc == MFX_FOURCC_BGR4)))) { /* * special configuration for NV12 surf allocation for VP8 hybrid encoder and * RGB32 for JPEG is required */ attrib[attrCnt].type = (VASurfaceAttribType)VASurfaceAttribUsageHint; attrib[attrCnt].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[attrCnt].value.type = VAGenericValueTypeInteger; attrib[attrCnt++].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; } else if (fourcc == MFX_FOURCC_VP8_MBDATA) { // special configuration for MB data surf allocation for VP8 hybrid encoder is required attrib[0].value.value.i = VA_FOURCC_P208; format = VA_FOURCC_P208; } else if (va_fourcc == VA_FOURCC_NV12) { format = VA_RT_FORMAT_YUV420; } else if (fourcc == MFX_FOURCC_A2RGB10) { format = VA_RT_FORMAT_RGB32_10BPP; } #if VA_CHECK_VERSION(1,2,0) else if (va_fourcc == VA_FOURCC_P010) { format = VA_RT_FORMAT_YUV420_10; } #endif va_res = m_libva->vaCreateSurfaces(m_dpy, format, request->Info.Width, request->Info.Height, surfaces, surfaces_num, pAttrib, pAttrib ? attrCnt : 0); mfx_res = va_to_mfx_status(va_res); bCreateSrfSucceeded = (MFX_ERR_NONE == mfx_res); } else { VAContextID context_id = request->AllocId; int codedbuf_size, codedbuf_num; VABufferType codedbuf_type; if (fourcc == MFX_FOURCC_VP8_SEGMAP) { codedbuf_size = request->Info.Width; codedbuf_num = request->Info.Height; codedbuf_type = VAEncMacroblockMapBufferType; } else { int width32 = 32 * ((request->Info.Width + 31) >> 5); int height32 = 32 * ((request->Info.Height + 31) >> 5); codedbuf_size = static_cast((width32 * height32) * 400LL / (16 * 16)); codedbuf_num = 1; codedbuf_type = VAEncCodedBufferType; } for (numAllocated = 0; numAllocated < surfaces_num; numAllocated++) { VABufferID coded_buf; va_res = m_libva->vaCreateBuffer(m_dpy, context_id, codedbuf_type, codedbuf_size, codedbuf_num, NULL, &coded_buf); mfx_res = va_to_mfx_status(va_res); if (MFX_ERR_NONE != mfx_res) break; surfaces[numAllocated] = coded_buf; } } } if (MFX_ERR_NONE == mfx_res) { for (i = 0; i < surfaces_num; ++i) { vaapi_mid = &(vaapi_mids[i]); vaapi_mid->m_fourcc = fourcc; vaapi_mid->m_surface = &(surfaces[i]); mids[i] = vaapi_mid; } } if (MFX_ERR_NONE == mfx_res) { response->mids = mids; response->NumFrameActual = surfaces_num; } else // i.e. MFX_ERR_NONE != mfx_res { response->mids = NULL; response->NumFrameActual = 0; if (VA_FOURCC_P208 != va_fourcc || fourcc == MFX_FOURCC_VP8_MBDATA) { if (bCreateSrfSucceeded) m_libva->vaDestroySurfaces(m_dpy, surfaces, surfaces_num); } else { for (i = 0; i < numAllocated; i++) m_libva->vaDestroyBuffer(m_dpy, surfaces[i]); } if (mids) { free(mids); mids = NULL; } if (vaapi_mids) { free(vaapi_mids); vaapi_mids = NULL; } if (surfaces) { free(surfaces); surfaces = NULL; } } return mfx_res; } mfxStatus vaapiFrameAllocator::ReleaseResponse(mfxFrameAllocResponse* response) { vaapiMemId* vaapi_mids = NULL; VASurfaceID* surfaces = NULL; mfxU32 i = 0; bool isBitstreamMemory = false; if (!response) return MFX_ERR_NULL_PTR; if (response->mids) { vaapi_mids = (vaapiMemId*)(response->mids[0]); mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(vaapi_mids->m_fourcc); isBitstreamMemory = (MFX_FOURCC_P8 == mfx_fourcc) ? true : false; surfaces = vaapi_mids->m_surface; for (i = 0; i < response->NumFrameActual; ++i) { if (MFX_FOURCC_P8 == vaapi_mids[i].m_fourcc) m_libva->vaDestroyBuffer(m_dpy, surfaces[i]); else if (vaapi_mids[i].m_sys_buffer) free(vaapi_mids[i].m_sys_buffer); } free(vaapi_mids); free(response->mids); response->mids = NULL; if (!isBitstreamMemory) m_libva->vaDestroySurfaces(m_dpy, surfaces, response->NumFrameActual); free(surfaces); } response->NumFrameActual = 0; return MFX_ERR_NONE; } mfxStatus vaapiFrameAllocator::LockFrame(mfxMemId mid, mfxFrameData* ptr) { mfxStatus mfx_res = MFX_ERR_NONE; VAStatus va_res = VA_STATUS_SUCCESS; vaapiMemId* vaapi_mid = (vaapiMemId*)mid; if (!vaapi_mid || !(vaapi_mid->m_surface)) return MFX_ERR_INVALID_HANDLE; mfxU8* pBuffer = 0; mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(vaapi_mid->m_fourcc); if ((VASurfaceID)VA_INVALID_ID == *(vaapi_mid->m_surface)) { if (VA_FOURCC_P208 != vaapi_mid->m_fourcc) { unsigned int format; VASurfaceAttrib attrib[2]; VASurfaceAttrib* pAttrib = &attrib[0]; int attrCnt = 0; attrib[attrCnt].type = VASurfaceAttribPixelFormat; attrib[attrCnt].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[attrCnt].value.type = VAGenericValueTypeInteger; attrib[attrCnt++].value.value.i = (vaapi_mid->m_fourcc == VA_RT_FORMAT_RGBP ? VA_FOURCC_RGBP : vaapi_mid->m_fourcc); format = vaapi_mid->m_fourcc; if (mfx_fourcc == MFX_FOURCC_VP8_NV12) { // special configuration for NV12 surf allocation for VP8 hybrid encoder is required attrib[attrCnt].type = (VASurfaceAttribType)VASurfaceAttribUsageHint; attrib[attrCnt].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[attrCnt].value.type = VAGenericValueTypeInteger; attrib[attrCnt++].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; } else if (mfx_fourcc == MFX_FOURCC_VP8_MBDATA) { // special configuration for MB data surf allocation for VP8 hybrid encoder is required attrib[0].value.value.i = VA_FOURCC_P208; format = VA_FOURCC_P208; } else if (vaapi_mid->m_fourcc == VA_FOURCC_NV12) { format = VA_RT_FORMAT_YUV420; } va_res = m_libva->vaCreateSurfaces(m_dpy, format, m_Width, m_Height, vaapi_mid->m_surface, 1, pAttrib, pAttrib ? attrCnt : 0); mfx_res = va_to_mfx_status(va_res); } else { int codedbuf_size, codedbuf_num; VABufferType codedbuf_type; if (mfx_fourcc == MFX_FOURCC_VP8_SEGMAP) { codedbuf_size = m_Width; codedbuf_num = m_Height; codedbuf_type = VAEncMacroblockMapBufferType; } else { int width32 = 32 * ((m_Width + 31) >> 5); int height32 = 32 * ((m_Height + 31) >> 5); codedbuf_size = static_cast((width32 * height32) * 400LL / (16 * 16)); codedbuf_num = 1; codedbuf_type = VAEncCodedBufferType; } VABufferID coded_buf; va_res = m_libva->vaCreateBuffer(m_dpy, VA_INVALID_ID, codedbuf_type, codedbuf_size, codedbuf_num, NULL, &coded_buf); mfx_res = va_to_mfx_status(va_res); //vaapi_mid->m_surface = coded_buf; } return MFX_ERR_NONE; } if (MFX_FOURCC_P8 == mfx_fourcc) // bitstream processing { VACodedBufferSegment* coded_buffer_segment; if (vaapi_mid->m_fourcc == MFX_FOURCC_VP8_SEGMAP) va_res = m_libva->vaMapBuffer(m_dpy, *(vaapi_mid->m_surface), (void**)(&pBuffer)); else va_res = m_libva->vaMapBuffer(m_dpy, *(vaapi_mid->m_surface), (void**)(&coded_buffer_segment)); mfx_res = va_to_mfx_status(va_res); if (MFX_ERR_NONE == mfx_res) { if (vaapi_mid->m_fourcc == MFX_FOURCC_VP8_SEGMAP) ptr->Y = pBuffer; else ptr->Y = (mfxU8*)coded_buffer_segment->buf; } } else // Image processing { va_res = m_libva->vaDeriveImage(m_dpy, *(vaapi_mid->m_surface), &(vaapi_mid->m_image)); mfx_res = va_to_mfx_status(va_res); if (MFX_ERR_NONE == mfx_res) { va_res = m_libva->vaMapBuffer(m_dpy, vaapi_mid->m_image.buf, (void**)&pBuffer); mfx_res = va_to_mfx_status(va_res); } if (MFX_ERR_NONE == mfx_res) { switch (vaapi_mid->m_image.format.fourcc) { case VA_FOURCC_NV12: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->U = pBuffer + vaapi_mid->m_image.offsets[1]; ptr->V = ptr->U + 1; } break; case VA_FOURCC_YV12: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->V = pBuffer + vaapi_mid->m_image.offsets[1]; ptr->U = pBuffer + vaapi_mid->m_image.offsets[2]; } break; case VA_FOURCC_YUY2: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->U = ptr->Y + 1; ptr->V = ptr->Y + 3; } break; case VA_FOURCC_ARGB: if (mfx_fourcc == MFX_FOURCC_RGB4) { ptr->B = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->G = ptr->B + 1; ptr->R = ptr->B + 2; ptr->A = ptr->B + 3; } else return MFX_ERR_LOCK_MEMORY; break; #ifndef ANDROID case VA_FOURCC_A2R10G10B10: if (mfx_fourcc == MFX_FOURCC_A2RGB10) { ptr->B = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->G = ptr->B; ptr->R = ptr->B; ptr->A = ptr->B; } else return MFX_ERR_LOCK_MEMORY; break; #endif case VA_FOURCC_ABGR: if (mfx_fourcc == MFX_FOURCC_BGR4) { ptr->R = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->G = ptr->R + 1; ptr->B = ptr->R + 2; ptr->A = ptr->R + 3; } else return MFX_ERR_LOCK_MEMORY; break; case VA_FOURCC_RGB565: if (mfx_fourcc == MFX_FOURCC_RGB565) { ptr->B = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->G = ptr->B; ptr->R = ptr->B; } else return MFX_ERR_LOCK_MEMORY; break; case MFX_FOURCC_RGBP: if (mfx_fourcc == MFX_FOURCC_RGBP) { ptr->R = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->G = pBuffer + vaapi_mid->m_image.offsets[1]; ptr->B = pBuffer + vaapi_mid->m_image.offsets[2]; } case VA_FOURCC_P208: if (mfx_fourcc == MFX_FOURCC_NV12) { ptr->Y = pBuffer + vaapi_mid->m_image.offsets[0]; } else return MFX_ERR_LOCK_MEMORY; break; case VA_FOURCC_P010: case VA_FOURCC_P016: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y16 = (mfxU16*)(pBuffer + vaapi_mid->m_image.offsets[0]); ptr->U16 = (mfxU16*)(pBuffer + vaapi_mid->m_image.offsets[1]); ptr->V16 = ptr->U16 + 1; } break; case VA_FOURCC_AYUV: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->V = pBuffer + vaapi_mid->m_image.offsets[0]; ptr->U = ptr->V + 1; ptr->Y = ptr->V + 2; ptr->A = ptr->V + 3; } break; case VA_FOURCC_Y210: case VA_FOURCC_Y216: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y16 = (mfxU16*)(pBuffer + vaapi_mid->m_image.offsets[0]); ptr->U16 = ptr->Y16 + 1; ptr->V16 = ptr->Y16 + 3; } break; case VA_FOURCC_Y410: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->Y410 = (mfxY410*)(pBuffer + vaapi_mid->m_image.offsets[0]); ptr->Y = 0; ptr->V = 0; ptr->A = 0; } break; case VA_FOURCC_Y416: if (mfx_fourcc != vaapi_mid->m_image.format.fourcc) return MFX_ERR_LOCK_MEMORY; { ptr->U16 = (mfxU16*)(pBuffer + vaapi_mid->m_image.offsets[0]); ptr->Y16 = ptr->U16 + 1; ptr->V16 = ptr->Y16 + 1; ptr->A = (mfxU8*)(ptr->V16 + 1); } break; default: return MFX_ERR_LOCK_MEMORY; } } ptr->PitchHigh = (mfxU16)(vaapi_mid->m_image.pitches[0] / (1 << 16)); ptr->PitchLow = (mfxU16)(vaapi_mid->m_image.pitches[0] % (1 << 16)); } return mfx_res; } mfxStatus vaapiFrameAllocator::UnlockFrame(mfxMemId mid, mfxFrameData* ptr) { vaapiMemId* vaapi_mid = (vaapiMemId*)mid; if (!vaapi_mid || !(vaapi_mid->m_surface)) return MFX_ERR_INVALID_HANDLE; mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(vaapi_mid->m_fourcc); if (MFX_FOURCC_P8 == mfx_fourcc) // bitstream processing { m_libva->vaUnmapBuffer(m_dpy, *(vaapi_mid->m_surface)); } else // Image processing { m_libva->vaUnmapBuffer(m_dpy, vaapi_mid->m_image.buf); m_libva->vaDestroyImage(m_dpy, vaapi_mid->m_image.image_id); if (NULL != ptr) { ptr->PitchLow = 0; ptr->PitchHigh = 0; ptr->Y = NULL; ptr->U = NULL; ptr->V = NULL; ptr->A = NULL; } } return MFX_ERR_NONE; } mfxStatus vaapiFrameAllocator::GetFrameHDL(mfxMemId mid, mfxHDL* handle) { vaapiMemId* vaapi_mid = (vaapiMemId*)mid; if (!handle || !vaapi_mid || !(vaapi_mid->m_surface)) return MFX_ERR_INVALID_HANDLE; *handle = vaapi_mid->m_surface; //VASurfaceID* <-> mfxHDL return MFX_ERR_NONE; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_brc.cpp000066400000000000000000003431431443134507600274140ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enctools.h" #include "mfx_enctools_brc.h" #include #include #define MAX_DQP_LTR 4 #define MAX_MODEL_ERR 6 #define BRC_BUFK(verylowdelay) (verylowdelay? 4.0 : 2.5) #define SCH_BUFK(verylowdelay) (verylowdelay? 6.0 : 3.5) #define LTR_BUFK(verylowdelay) (verylowdelay? 8.0: 4.5) static mfxF64 LTR_BUF(mfxU16 type, mfxU32 dqp, bool boost, bool schg, bool shstrt, bool verylowdelay) { if (type == MFX_FRAMETYPE_IDR) { if ((schg && !boost) || !dqp) { return BRC_BUFK(verylowdelay); } else { return LTR_BUFK(verylowdelay); } } else { if (shstrt) { return SCH_BUFK(verylowdelay); } else { return BRC_BUFK(verylowdelay); } } } #define DQFF0 1.0 #define DQFF1 1.66 #define DQF(type, dqp, boost, schg) \ ((type == MFX_FRAMETYPE_IDR) ? ((dqp?pow(2, ((mfxF64)dqp / 6.0)) : 1.0) * ((schg && !boost) ? DQFF0 : DQFF1)) : 1.0) #define FRM_RATIO(type, encorder, shstrt, pyr) \ ((((encorder == 0 && !pyr) || type == MFX_FRAMETYPE_I) ? 6.0 : (shstrt || type == MFX_FRAMETYPE_IDR) ? 8.0 : 4.0) * ((pyr) ? 1.5 : 1.0)) #define BRC_CONST_MUL_P1 2.253264596 #define BRC_CONST_EXP_R_P1 0.42406423 #define ltrprintf(...) //#define ltrprintf printf #define BRC_SCENE_CHANGE_RATIO1 20.0 #define BRC_SCENE_CHANGE_RATIO2 5.0 #define BRC_QP_MODULATION_GOP8_FIXED MFX_QP_MODULATION_RESERVED0 namespace EncToolsBRC { struct CompareByDisplayOrder { mfxU32 m_DispOrder; CompareByDisplayOrder(mfxU32 frameOrder) : m_DispOrder(frameOrder) {} bool operator ()(BRC_FrameStruct const & frameStruct) const { return frameStruct.dispOrder == m_DispOrder; } }; static mfxU32 hevcBitRateScale(mfxU32 bitrate) { mfxU32 bit_rate_scale = 0; while (bit_rate_scale < 16 && (bitrate & ((1 << (6 + bit_rate_scale + 1)) - 1)) == 0) bit_rate_scale++; return bit_rate_scale; } static mfxU32 hevcCbpSizeScale(mfxU32 cpbSize) { mfxU32 cpb_size_scale = 2; while (cpb_size_scale < 16 && (cpbSize & ((1 << (4 + cpb_size_scale + 1)) - 1)) == 0) cpb_size_scale++; return cpb_size_scale; } const mfxU32 h264_h265_au_cpb_removal_delay_length_minus1 = 23; const mfxU32 h264_bit_rate_scale = 4; const mfxU32 h264_cpb_size_scale = 2; mfxI32 GetRawFrameSize(mfxU32 lumaSize, mfxU16 chromaFormat, mfxU16 bitDepthLuma) { mfxI32 frameSize = lumaSize; if (chromaFormat == MFX_CHROMAFORMAT_YUV420) frameSize += lumaSize / 2; else if (chromaFormat == MFX_CHROMAFORMAT_YUV422) frameSize += lumaSize; else if (chromaFormat == MFX_CHROMAFORMAT_YUV444) frameSize += lumaSize * 2; frameSize = frameSize * bitDepthLuma / 8; return frameSize * 8; //frame size in bits } mfxStatus cBRCParams::Init(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool fieldMode, bool bALTR) { MFX_CHECK(ctrl.RateControlMethod == MFX_RATECONTROL_CBR || ctrl.RateControlMethod == MFX_RATECONTROL_VBR, MFX_ERR_UNDEFINED_BEHAVIOR); bFieldMode= fieldMode; codecId = ctrl.CodecId; lowPower = IsOn(ctrl.LowPower); targetbps = ctrl.TargetKbps * 1000; maxbps = ctrl.MaxKbps * 1000; maxbps = (ctrl.RateControlMethod == MFX_RATECONTROL_CBR) ? targetbps : ((maxbps >= targetbps) ? maxbps : targetbps); mfxU32 bit_rate_scale = (ctrl.CodecId == MFX_CODEC_AVC) ? h264_bit_rate_scale : hevcBitRateScale(maxbps); mfxU32 cpb_size_scale = (ctrl.CodecId == MFX_CODEC_AVC) ? h264_cpb_size_scale : hevcCbpSizeScale(maxbps); rateControlMethod = ctrl.RateControlMethod; maxbps = ((maxbps >> (6 + bit_rate_scale)) << (6 + bit_rate_scale)); HRDConformance = ctrl.HRDConformance; bufferSizeInBytes = ctrl.BufferSizeInKB * 1000; // Bs Size Limit even when HRD off if (HRDConformance != MFX_BRC_NO_HRD) { bufferSizeInBytes = ((ctrl.BufferSizeInKB * 1000) >> (cpb_size_scale + 1)) << (cpb_size_scale + 1); initialDelayInBytes = ((ctrl.InitialDelayInKB * 1000) >> (cpb_size_scale + 1)) << (cpb_size_scale + 1); bRec = 1; bPanic = (HRDConformance == MFX_BRC_HRD_STRONG) ? 1 : 0; } else if(ctrl.MaxDelayInFrames > ctrl.MaxGopRefDist) { bRec = 1; // Needed for LPLA } MFX_CHECK (ctrl.FrameInfo.FrameRateExtD != 0 && ctrl.FrameInfo.FrameRateExtN != 0, MFX_ERR_UNDEFINED_BEHAVIOR); frameRate = (mfxF64)ctrl.FrameInfo.FrameRateExtN / (mfxF64)ctrl.FrameInfo.FrameRateExtD; width = ctrl.FrameInfo.Width; height = ctrl.FrameInfo.Height; cropWidth = ctrl.FrameInfo.CropW ? ctrl.FrameInfo.CropW : width; cropHeight = ctrl.FrameInfo.CropH ? ctrl.FrameInfo.CropH : height; chromaFormat = ctrl.FrameInfo.ChromaFormat == 0 ? MFX_CHROMAFORMAT_YUV420 : ctrl.FrameInfo.ChromaFormat ; bitDepthLuma = ctrl.FrameInfo.BitDepthLuma == 0 ? 8 : ctrl.FrameInfo.BitDepthLuma; mfxI32 bitdepthOffset = (6 * (bitDepthLuma - 8)); quantOffset = IsOn(ctrl.LowPower) ? 0 : bitdepthOffset; inputBitsPerFrame = targetbps / frameRate; maxInputBitsPerFrame = maxbps / frameRate; gopPicSize = ctrl.MaxGopSize*(bFieldMode ? 2 : 1); gopRefDist = ctrl.MaxGopRefDist*(bFieldMode ? 2 : 1); bPyr = (ctrl.BRefType == MFX_B_REF_PYRAMID); maxFrameSizeInBits = std::max(std::max (ctrl.MaxFrameSizeInBytes[0], ctrl.MaxFrameSizeInBytes[1]), ctrl.MaxFrameSizeInBytes[2])*8 ; if (gopRefDist <= 3) { fAbPeriodShort = 6; } else { fAbPeriodShort = std::max(16, gopRefDist*2); } // P update, future deviation control, only for LA NO HRD mfxU32 CodecId = ctrl.CodecId; mfxI32 reaction_mult = (HRDConformance == MFX_BRC_NO_HRD && ctrl.MaxDelayInFrames > ctrl.MaxGopRefDist && (CodecId == MFX_CODEC_HEVC || CodecId == MFX_CODEC_AVC || CodecId == MFX_CODEC_AV1)) ? (CodecId == MFX_CODEC_HEVC || CodecId == MFX_CODEC_AV1 ? 4 : 3) : 1; fAbPeriodLong = 120 * reaction_mult; dqAbPeriod = 120 * reaction_mult; bAbPeriod = 120 * reaction_mult; fAbPeriodLA = std::max(16, gopRefDist*2); mRawFrameSizeInBits = GetRawFrameSize(width * height, chromaFormat, IsOn(ctrl.LowPower) ? 8 : bitDepthLuma); mRawFrameSizeInPixs = mRawFrameSizeInBits / (IsOn(ctrl.LowPower) ? 8 : bitDepthLuma); if (maxFrameSizeInBits) { bRec = 1; bPanic = 1; } mfxI32 minQPI = IsOn(ctrl.LowPower) ? 10 : 1; mfxI32 maxQPI = IsOn(ctrl.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minQPP = IsOn(ctrl.LowPower) ? 10 : 1; mfxI32 maxQPP = IsOn(ctrl.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minQPB = IsOn(ctrl.LowPower) ? 10 : 1; mfxI32 maxQPB = IsOn(ctrl.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minmaxOffset = IsOn(ctrl.LowPower) ? bitdepthOffset : 0; quantMinI = (ctrl.MinQPLevel[0] != 0) ? std::max((mfxI32)ctrl.MinQPLevel[0]-minmaxOffset, minQPI) : minQPI; quantMaxI = (ctrl.MaxQPLevel[0] != 0) ? std::min((mfxI32)ctrl.MaxQPLevel[0]-minmaxOffset, maxQPI) : maxQPI; quantMinP = (ctrl.MinQPLevel[1] != 0) ? std::max((mfxI32)ctrl.MinQPLevel[1]-minmaxOffset, minQPP) : minQPP; quantMaxP = (ctrl.MaxQPLevel[1] != 0) ? std::min((mfxI32)ctrl.MaxQPLevel[1]-minmaxOffset, maxQPP) : maxQPP; quantMinB = (ctrl.MinQPLevel[2] != 0) ? std::max((mfxI32)ctrl.MinQPLevel[2]-minmaxOffset, minQPB) : minQPB; quantMaxB = (ctrl.MaxQPLevel[2] != 0) ? std::min((mfxI32)ctrl.MaxQPLevel[2]-minmaxOffset, maxQPB) : maxQPB; WinBRCMaxAvgKbps = ctrl.WinBRCMaxAvgKbps; WinBRCSize = ctrl.WinBRCSize; iDQp0 = 0; mNumRefsInGop = (mfxU32)(std::max(1.0, (!bPyr ? (mfxF64)gopPicSize / (mfxF64)gopRefDist : (mfxF64)gopPicSize / 2.0))); mfxF64 maxFrameRatio = 1.5874 * FRM_RATIO(MFX_FRAMETYPE_IDR, 0, 0, bPyr); mIntraBoost = (mNumRefsInGop > maxFrameRatio * 8.0) ? 1 : 0; mVeryLowDelay = (HRDConformance != MFX_BRC_NO_HRD && (bufferSizeInBytes * 8.0) / targetbps < 0.12) ? 1 : 0; mfxF64 maxFrameSize = mRawFrameSizeInBits; if (maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, maxFrameSizeInBits); } if (HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufOccupy = LTR_BUF(MFX_FRAMETYPE_IDR, 1, mIntraBoost, 1, 0, mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, bufOccupy / 9.* (initialDelayInBytes * 8.0) + (9.0 - bufOccupy) / 9.*inputBitsPerFrame); } mfxF64 minFrameRatio = FRM_RATIO(MFX_FRAMETYPE_IDR, 0, 0, bPyr); maxFrameRatio = std::min({maxFrameRatio, maxFrameSize / inputBitsPerFrame, mfxF64(mNumRefsInGop)}); mfxF64 dqp = std::max(0.0, 6.0 * (log(maxFrameRatio / minFrameRatio) / log(2.0))); iDQp0 = (mfxU32)(dqp + 0.5); if (iDQp0 < 1) iDQp0 = 1; if (iDQp0 > MAX_DQP_LTR) iDQp0 = MAX_DQP_LTR; // MaxFrameSize violation prevention mMinQstepCmplxKP = BRC_CONST_MUL_P1; mMinQstepRateEP = BRC_CONST_EXP_R_P1; mMinQstepCmplxKPUpdt = 0; mMinQstepCmplxKPUpdtErr = 0.16; mLaQp = ctrl.LaQp; mLaScale = ctrl.LaScale; mLaDepth = ctrl.MaxDelayInFrames; mHasALTR = ((ctrl.CodecId == MFX_CODEC_AVC) || (ctrl.CodecId == MFX_CODEC_AV1)) && bALTR; // check if codec support ALTR mMBBRC = (CodecId == MFX_CODEC_HEVC || CodecId == MFX_CODEC_AVC || CodecId == MFX_CODEC_AV1) && bMBBRC; return MFX_ERR_NONE; } mfxStatus cBRCParams::GetBRCResetType(mfxEncToolsCtrl const & ctrl, bool bNewSequence, bool bMBBRC, bool &bBRCReset, bool &bSlidingWindowReset, bool bALTR) { bBRCReset = false; bSlidingWindowReset = false; if (bNewSequence) return MFX_ERR_NONE; cBRCParams new_par; mfxStatus sts = new_par.Init(ctrl, bMBBRC,false, bALTR); MFX_CHECK_STS(sts); MFX_CHECK(new_par.rateControlMethod == rateControlMethod, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) ; MFX_CHECK(new_par.HRDConformance == HRDConformance, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) ; MFX_CHECK(new_par.frameRate == frameRate, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.width == width, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.height == height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.chromaFormat == chromaFormat, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.bitDepthLuma == bitDepthLuma, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (HRDConformance == MFX_BRC_HRD_STRONG) { MFX_CHECK(new_par.bufferSizeInBytes == bufferSizeInBytes, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.initialDelayInBytes == initialDelayInBytes, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.targetbps == targetbps, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.maxbps == maxbps, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } else if (new_par.targetbps != targetbps || new_par.maxbps != maxbps) { bBRCReset = true; } if (new_par.WinBRCMaxAvgKbps != WinBRCMaxAvgKbps) { bBRCReset = true; bSlidingWindowReset = true; } if (new_par.maxFrameSizeInBits != maxFrameSizeInBits) bBRCReset = true; if (new_par.gopPicSize != gopPicSize) bBRCReset = true; if (new_par.gopRefDist != gopRefDist) bBRCReset = true; if (new_par.bPyr != bPyr) bBRCReset = true; if (new_par.quantMaxI != quantMaxI) bBRCReset = true; if (new_par.quantMinI != quantMinI) bBRCReset = true; if (new_par.quantMaxP != quantMaxP) bBRCReset = true; if (new_par.quantMinP != quantMinP) bBRCReset = true; if (new_par.quantMaxB != quantMaxB) bBRCReset = true; if (new_par.quantMinB != quantMinB) bBRCReset = true; return MFX_ERR_NONE; } enum { MFX_BRC_RECODE_NONE = 0, MFX_BRC_RECODE_QP = 1, MFX_BRC_RECODE_PANIC = 2, }; mfxF64 const QSTEP[88] = { 0.630, 0.707, 0.794, 0.891, 1.000, 1.122, 1.260, 1.414, 1.587, 1.782, 2.000, 2.245, 2.520, 2.828, 3.175, 3.564, 4.000, 4.490, 5.040, 5.657, 6.350, 7.127, 8.000, 8.980, 10.079, 11.314, 12.699, 14.254, 16.000, 17.959, 20.159, 22.627, 25.398, 28.509, 32.000, 35.919, 40.317, 45.255, 50.797, 57.018, 64.000, 71.838, 80.635, 90.510, 101.594, 114.035, 128.000, 143.675, 161.270, 181.019, 203.187, 228.070, 256.000, 287.350, 322.540, 362.039, 406.375, 456.140, 512.000, 574.701, 645.080, 724.077, 812.749, 912.280, 1024.000, 1149.401, 1290.159, 1448.155, 1625.499, 1824.561, 2048.000, 2298.802, 2580.318, 2896.309, 3250.997, 3649.121, 4096.000, 4597.605, 5160.637, 5792.619, 6501.995, 7298.242, 8192.000, 9195.209, 10321.273, 11585.238, 13003.989, 14596.485 }; inline mfxI32 QStep2QpFloor(mfxF64 qstep, mfxI32 qpoffset = 0) // QSTEP[qp] <= qstep, return 0<=qp<=51+mQuantOffset { mfxU8 qp = mfxU8(std::upper_bound(QSTEP, QSTEP + 51 + qpoffset, qstep) - QSTEP); return qp > 0 ? qp - 1 : 0; } inline mfxI32 Qstep2QP(mfxF64 qstep, mfxI32 qpoffset = 0) // return 0<=qp<=51+mQuantOffset { mfxI32 qp = QStep2QpFloor(qstep, qpoffset); // prevent going QSTEP index out of bounds if (qp >= (mfxI32)(sizeof(QSTEP)/sizeof(QSTEP[0])) - 1) return 0; return (qp == 51 + qpoffset || qstep < (QSTEP[qp] + QSTEP[qp + 1]) / 2) ? qp : qp + 1; } inline mfxF64 QP2Qstep(mfxI32 qp, mfxI32 qpoffset = 0) { return QSTEP[std::min(51 + qpoffset, qp)]; } inline mfxU16 CheckHrdAndUpdateQP(HRDCodecSpec &hrd, mfxU32 frameSizeInBits, mfxU32 eo, bool bIdr, mfxI32 currQP) { if (frameSizeInBits > hrd.GetMaxFrameSizeInBits(eo, bIdr)) { hrd.SetUnderflowQuant(currQP); return MFX_BRC_BIG_FRAME; } else if (frameSizeInBits < hrd.GetMinFrameSizeInBits(eo, bIdr)) { hrd.SetOverflowQuant(currQP); return MFX_BRC_SMALL_FRAME; } return MFX_BRC_OK; } inline mfxI32 GetFrameTargetSize(mfxU32 brcSts, mfxI32 minFrameSize, mfxI32 maxFrameSize) { if (brcSts != MFX_BRC_BIG_FRAME && brcSts != MFX_BRC_SMALL_FRAME) return 0; return (brcSts == MFX_BRC_BIG_FRAME) ? maxFrameSize * 3 / 4 : minFrameSize * 5 / 4; } static mfxI32 GetNewQP(mfxF64 totalFrameBits, mfxF64 targetFrameSizeInBits, mfxI32 minQP , mfxI32 maxQP, mfxI32 qp , mfxI32 qp_offset, mfxF64 f_pow, bool bStrict = false, bool bLim = true) { mfxF64 qstep = 0, qstep_new = 0; mfxI32 qp_new = qp; qstep = QP2Qstep(qp, qp_offset); qstep_new = qstep * pow(totalFrameBits / targetFrameSizeInBits, f_pow); qp_new = Qstep2QP(qstep_new, qp_offset); if (totalFrameBits < targetFrameSizeInBits) // overflow { if (qp <= minQP) { return qp; // QP change is impossible } if (bLim) qp_new = std::max(qp_new, (minQP + qp + 1) >> 1); if (bStrict) qp_new = std::min(qp_new, qp - 1); } else // underflow { if (qp >= maxQP) { return qp; // QP change is impossible } if (bLim) qp_new = std::min(qp_new, (maxQP + qp + 1) >> 1); if (bStrict) qp_new = std::max(qp_new, qp + 1); } return mfx::clamp(qp_new, minQP, maxQP); } // Get QP Offset for given frame and Adaptive Pyramid QP class // level = Pyramid level or Layer, value [1-3] // isRef = zero for non-reference frame // qpMod = Adaptive Pyramid QP class, value [0-4] // QP Offset is realtive QuantB. // QuantB = QuantP+1 // qpMod=0, can be for used non 8GOP and/or non Pyramid cases. static mfxI32 GetOffsetAPQ(mfxI32 level, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpQPDeltaExplicitModulation, mfxU32 codecId) { mfxI32 qp = 0; level = std::max(mfxI32(1), std::min(mfxI32(4), level)); if (qpMod == MFX_QP_MODULATION_EXPLICIT) { qp = (int)qpQPDeltaExplicitModulation; } else { if (codecId == MFX_CODEC_HEVC || codecId == MFX_CODEC_AV1) { if (qpMod == MFX_QP_MODULATION_HIGH || qpMod == BRC_QP_MODULATION_GOP8_FIXED) { switch (level) { case 4: qp += 1; case 3: qp += (codecId == MFX_CODEC_HEVC) ? 1 : 2; case 2: qp += (codecId == MFX_CODEC_HEVC) ? 2 : 1; case 1: default: qp += (codecId == MFX_CODEC_HEVC) ? 2 : 2; break; } } else if (qpMod == MFX_QP_MODULATION_MIXED) { switch (level) { case 4: qp += 1; case 3: qp += 2; case 2: qp += 1; case 1: default: qp += 4; break; } } else if (qpMod == MFX_QP_MODULATION_MEDIUM) { switch (level) { case 4: qp += 1; case 3: qp += 1; case 2: qp += 1; case 1: default: qp += 2; break; } } else if (qpMod == MFX_QP_MODULATION_LOW) { switch (level) { case 4: qp += 1; case 3: qp += 1; case 2: qp += 1; case 1: default: qp += 1; break; } } else { qp += (level > 0 ? level - 1 : 0); if (level && !isRef) qp += 1; } } else if (codecId == MFX_CODEC_AVC) { if (qpMod == MFX_QP_MODULATION_HIGH) { switch (level) { case 4: qp += 1; case 3: qp += 2; case 2: qp += 1; case 1: default: qp += 3; break; } } else if (qpMod == MFX_QP_MODULATION_MEDIUM) { switch (level) { case 4: qp += 1; case 3: qp += 2; case 2: qp += 1; case 1: default: qp += 2; break; } } else if (qpMod == MFX_QP_MODULATION_LOW) { switch (level) { case 4: qp += 1; case 3: qp += 1; case 2: qp += 1; case 1: default: qp += 1; break; } } else { qp += (level > 0 ? level - 1 : 0); if (level && !isRef) qp += 1; } } else { qp += (level > 0 ? level - 1 : 0); if (level && !isRef) qp += 1; } } return qp; } static void SetQPParams(mfxI32 qp, mfxU32 type, BRC_Ctx& ctx, mfxU32 /* rec_num */, mfxI32 minQuant, mfxI32 maxQuant, mfxU32 level, mfxU32 iDQp, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP, mfxU32 codecId) { if (type == MFX_FRAMETYPE_IDR) { ctx.QuantIDR = qp; ctx.QuantI = qp + iDQp; ctx.QuantP = qp + 1 + iDQp; ctx.QuantB = qp + 2 + iDQp; } else if (type == MFX_FRAMETYPE_I) { ctx.QuantIDR = qp - iDQp; ctx.QuantI = qp; ctx.QuantP = qp + 1; ctx.QuantB = qp + 2; } else if (type == MFX_FRAMETYPE_P) { qp -= level; qp -= qpDeltaP; ctx.QuantIDR = qp - 1 - iDQp; ctx.QuantI = qp - 1; ctx.QuantP = qp; ctx.QuantB = qp + 1; } else if (type == MFX_FRAMETYPE_B) { qp -= GetOffsetAPQ(level, isRef, qpMod, qpExp, codecId); ctx.QuantIDR = qp - 2 - iDQp; ctx.QuantI = qp - 2; ctx.QuantP = qp - 1; ctx.QuantB = qp; } ctx.QuantIDR = mfx::clamp(ctx.QuantIDR, minQuant, maxQuant); ctx.QuantI = mfx::clamp(ctx.QuantI, minQuant, maxQuant); ctx.QuantP = mfx::clamp(ctx.QuantP, minQuant, maxQuant); ctx.QuantB = mfx::clamp(ctx.QuantB, minQuant, maxQuant); //printf("ctx.QuantIDR %d, QuantI %d, ctx.QuantP %d, ctx.QuantB %d, level %d iDQp %d\n", ctx.QuantIDR, ctx.QuantI, ctx.QuantP, ctx.QuantB, level, iDQp); } inline void UpdateQPParams(mfxI32 qp, mfxU32 type , BRC_Ctx &ctx, mfxU32 rec_num, mfxI32 minQuant, mfxI32 maxQuant, mfxU32 level, mfxU32 iDQp, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP, mfxU32 codecId) { ctx.Quant = qp; if (ctx.LastIQpSetOrder > ctx.encOrder) return; if (ctx.LastQpUpdateOrder > ctx.encOrder) return; ctx.LastQpUpdateOrder = ctx.encOrder; SetQPParams(qp, type, ctx, rec_num, minQuant, maxQuant, level, iDQp, isRef, qpMod, qpExp, qpDeltaP, codecId); } inline mfxU16 GetFrameType(mfxU16 m_frameType, mfxU16 level, mfxU16 gopRefDist, mfxU32 codecId) { if (m_frameType & MFX_FRAMETYPE_IDR) return MFX_FRAMETYPE_IDR; else if ((m_frameType & MFX_FRAMETYPE_I) && codecId == MFX_CODEC_HEVC) return MFX_FRAMETYPE_IDR; // For CRA else if (m_frameType & MFX_FRAMETYPE_I) return MFX_FRAMETYPE_I; else if (m_frameType & MFX_FRAMETYPE_P) return MFX_FRAMETYPE_P; else if ((m_frameType & MFX_FRAMETYPE_REF) && (level == 0 || gopRefDist == 1)) return MFX_FRAMETYPE_P; //low delay B else return MFX_FRAMETYPE_B; } inline bool isFrameBeforeIntra(mfxU32 order, mfxU32 intraOrder, mfxU32 gopPicSize, mfxU32 gopRefDist) { mfxI32 distance0 = gopPicSize * 3 / 4; mfxI32 distance1 = gopPicSize - gopRefDist * 3; return (order - intraOrder) > (mfxU32)(std::max(distance0, distance1)); } static mfxStatus SetRecodeParams(mfxU16 brcStatus, mfxI32 qp, mfxI32 qp_new, mfxI32 minQP, mfxI32 maxQP, BRC_Ctx &ctx, mfxBRCFrameStatus* status) { ctx.bToRecode = 1; if (brcStatus == MFX_BRC_BIG_FRAME || brcStatus == MFX_BRC_PANIC_BIG_FRAME ) { MFX_CHECK(qp_new >= qp, MFX_ERR_UNDEFINED_BEHAVIOR); ctx.Quant = qp_new; ctx.QuantMax = maxQP; if (brcStatus == MFX_BRC_BIG_FRAME && qp_new > qp) { ctx.QuantMin = std::max(qp + 1, minQP); //limit QP range for recoding status->BRCStatus = MFX_BRC_BIG_FRAME; } else { ctx.QuantMin = minQP; ctx.bPanic = 1; status->BRCStatus = MFX_BRC_PANIC_BIG_FRAME; } } else if (brcStatus == MFX_BRC_SMALL_FRAME || brcStatus == MFX_BRC_PANIC_SMALL_FRAME) { MFX_CHECK(qp_new <= qp, MFX_ERR_UNDEFINED_BEHAVIOR); ctx.Quant = qp_new; ctx.QuantMin = minQP; //limit QP range for recoding if (brcStatus == MFX_BRC_SMALL_FRAME && qp_new < qp) { ctx.QuantMax = std::min(qp - 1, maxQP); status->BRCStatus = MFX_BRC_SMALL_FRAME; } else { ctx.QuantMax = maxQP; status->BRCStatus = MFX_BRC_PANIC_SMALL_FRAME; ctx.bPanic = 1; } } //printf("recode %d, qp %d new %d, status %d\n", ctx.encOrder, qp, qp_new, status->BRCStatus); return MFX_ERR_NONE; } static mfxI32 GetNewQPTotal(mfxF64 bo, mfxF64 dQP, mfxI32 minQP , mfxI32 maxQP, mfxI32 qp, bool bPyr, bool bSC) { mfxU8 mode = (!bPyr) ; bo = mfx::clamp(bo, -1.0, 1.0); dQP = mfx::clamp(dQP, 1./maxQP, 1./minQP); mfxF64 ndQP = dQP + (1. / maxQP - dQP) * bo; ndQP = mfx::clamp(ndQP, 1. / maxQP, 1. / minQP); mfxI32 quant_new = (mfxI32) (1. / ndQP + 0.5); //printf(" GetNewQPTotal: bo %f, quant %d, quant_new %d, mode %d\n", bo, qp, quant_new, mode); if (!bSC) { if (mode == 0) // low: qp_diff [-2; 2] { if (quant_new >= qp + 5) quant_new = qp + 2; else if (quant_new > qp + 1) quant_new = qp + 1; else if (quant_new <= qp - 5) quant_new = qp - 2; else if (quant_new < qp - 1) quant_new = qp - 1; } else // (mode == 1) midle: qp_diff [-3; 3] { if (quant_new >= qp + 5) quant_new = qp + 3; else if (quant_new > qp + 2) quant_new = qp + 2; else if (quant_new <= qp - 5) quant_new = qp - 3; else if (quant_new < qp - 2) quant_new = qp - 2; } } else { quant_new = mfx::clamp(quant_new, qp - 5, qp + 5); } return mfx::clamp(quant_new, minQP, maxQP); } // Reduce AB period before intra and increase it after intra (to avoid intra frame affect on the bottom of hrd) static mfxF64 GetAbPeriodCoeff(mfxU32 numInGop, mfxU32 gopPicSize, mfxU32 SC) { const mfxU32 maxForCorrection = 30; mfxF64 maxValue = (SC) ? 1.3 : 1.5; const mfxF64 minValue = 1.0; mfxU32 numForCorrection = std::min(gopPicSize /2, maxForCorrection); mfxF64 k[maxForCorrection] = {0}; if (numInGop >= gopPicSize || gopPicSize < 2) return 1.0; for (mfxU32 i = 0; i < numForCorrection; i ++) { k[i] = maxValue - (maxValue - minValue)*i/numForCorrection; } if (numInGop < gopPicSize/2) { return k [numInGop < numForCorrection ? numInGop : numForCorrection - 1]; } else { mfxU32 n = gopPicSize - 1 - numInGop; return 1.0/ k[n < numForCorrection ? n : numForCorrection - 1]; } } static void ResetMinQForMaxFrameSize(cBRCParams* par, mfxU32 type) { if (type == MFX_FRAMETYPE_IDR || type == MFX_FRAMETYPE_I || type == MFX_FRAMETYPE_P) { par->mMinQstepCmplxKPUpdt = 0; par->mMinQstepCmplxKPUpdtErr = 0.16; par->mMinQstepCmplxKP = BRC_CONST_MUL_P1; par->mMinQstepRateEP = BRC_CONST_EXP_R_P1; } } static mfxI32 GetMinQForMaxFrameSize(const cBRCParams& par, mfxF64 targetBits, mfxU32 type) { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_P) { if (par.mMinQstepCmplxKPUpdt > 2 && par.mMinQstepCmplxKPUpdtErr < 0.69) { mfxI32 rawSize = par.mRawFrameSizeInPixs; mfxF64 BitsDesiredFrame = targetBits * (1.0 - 0.165 - std::min(0.115, par.mMinQstepCmplxKPUpdtErr/3.0)); mfxF64 R = (mfxF64)rawSize / BitsDesiredFrame; mfxF64 QstepScale = pow(R, par.mMinQstepRateEP) * par.mMinQstepCmplxKP; QstepScale = std::min(128.0, QstepScale); mfxF64 minqp = 6.0*log(QstepScale) / log(2.0) + 12.0; minqp = std::max(0.0, minqp); qp = (mfxU32)(minqp + 0.5); qp = mfx::clamp(qp, 1, 51); } } return qp; } static void UpdateMinQForMaxFrameSize(cBRCParams* par, mfxI32 bits, mfxI32 qp, const BRC_Ctx& ctx, mfxU32 type, bool shstrt, mfxU16 brcSts) { if (type == MFX_FRAMETYPE_I || type == MFX_FRAMETYPE_IDR) { mfxI32 rawSize = par->mRawFrameSizeInPixs; mfxF64 R = (mfxF64)rawSize / (mfxF64)bits; mfxF64 QstepScaleComputed = pow(R, par->mMinQstepRateEP) * par->mMinQstepCmplxKP; mfxF64 QstepScaleReal = pow(2.0, ((mfxF64)qp - 12.0) / 6.0); if (QstepScaleComputed > QstepScaleReal) { // Next P Frame atleast as complex as I Frame mfxF64 dS = log(QstepScaleReal) - log(QstepScaleComputed); par->mMinQstepCmplxKPUpdtErr = std::max((par->mMinQstepCmplxKPUpdtErr + abs(dS)) / 2, abs(dS)); mfxF64 upDlt = 0.5; dS = mfx::clamp(dS, -0.5, 1.0); par->mMinQstepCmplxKP = par->mMinQstepCmplxKP*(1.0 + upDlt*dS); //par->mMinQstepCmplxKPUpdt++; par->mMinQstepRateEP = mfx::clamp(par->mMinQstepRateEP + mfx::clamp(0.01 * (log(QstepScaleReal) - log(QstepScaleComputed))*log(R), -0.1, 0.2), 0.125, 1.0); // Sanity Check / Force if (qp < 50) { mfxF64 rateQstepNew = pow(R, par->mMinQstepRateEP); mfxF64 QstepScaleUpdtComputed = rateQstepNew * par->mMinQstepCmplxKP; mfxI32 qp_now = (mfxI32)(6.0*log(QstepScaleUpdtComputed) / log(2.0) + 12.0); if (qp < qp_now -1) { qp_now = qp + 2; QstepScaleUpdtComputed = pow(2.0, ((mfxF64)qp_now - 12.0) / 6.0); par->mMinQstepCmplxKP = QstepScaleUpdtComputed / rateQstepNew; par->mMinQstepCmplxKPUpdtErr = 0.16; } } } } else if (type == MFX_FRAMETYPE_P) { if (ctx.LastIQpSetOrder < ctx.encOrder) { mfxI32 rawSize = par->mRawFrameSizeInPixs; mfxF64 R = (mfxF64)rawSize / (mfxF64)bits; mfxF64 QstepScaleComputed = pow(R, par->mMinQstepRateEP) * par->mMinQstepCmplxKP; mfxF64 QstepScaleReal = pow(2.0, ((mfxF64)qp - 12.0) / 6.0); mfxF64 dS = log(QstepScaleReal) - log(QstepScaleComputed); par->mMinQstepCmplxKPUpdtErr = std::max((par->mMinQstepCmplxKPUpdtErr + abs(dS)) / 2, abs(dS)); mfxF64 upDlt = mfx::clamp(1.3042 * pow(R, -0.922), 0.025, 0.5); if (shstrt || par->mMinQstepCmplxKPUpdt <= 2 || par->mMinQstepCmplxKPUpdtErr > 0.69) upDlt = 0.5; else if (brcSts != MFX_BRC_OK || par->mMinQstepCmplxKPUpdtErr > 0.41) upDlt = std::max(0.125, upDlt); dS = mfx::clamp(dS, -0.5, 1.0); par->mMinQstepCmplxKP = par->mMinQstepCmplxKP*(1.0 + upDlt*dS); par->mMinQstepCmplxKPUpdt++; par->mMinQstepRateEP = mfx::clamp(par->mMinQstepRateEP + mfx::clamp(0.01 * (log(QstepScaleReal) - log(QstepScaleComputed))*log(R), -0.1, 0.2), 0.125, 1.0); } } } mfxI32 BRC_EncToolBase::GetCurQP(mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_IDR) { qp = m_ctx.QuantIDR; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_I) { qp = m_ctx.QuantI; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_P) { qp = m_ctx.QuantP + layer; qp += qpDeltaP; qp = mfx::clamp(qp, m_par.quantMinP, m_par.quantMaxP); } else { qp = m_ctx.QuantB; qp += GetOffsetAPQ(layer, isRef, qpMod, qpExp, m_par.codecId); qp = mfx::clamp(qp, m_par.quantMinB, m_par.quantMaxB); } //printf("GetCurQP IDR %d I %d P %d B %d, min %d max %d type %d \n", m_ctx.QuantIDR, m_ctx.QuantI, m_ctx.QuantP, m_ctx.QuantB, m_par.quantMinI, m_par.quantMaxI, type); return qp; } mfxF64 BRC_EncToolBase::ResetQuantAb(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxF64 fAbLong, mfxU32 eo, bool bIdr, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP, bool bNoNewQp) const { mfxI32 seqQP_new = GetSeqQP(qp, type, layer, isRef, qpMod, qpExp, qpDeltaP); mfxF64 dQuantAb_new = 1.0 / seqQP_new; mfxF64 bAbPreriod = m_par.bAbPeriod; mfxF64 totDev = m_ctx.totalDeviation; mfxF64 HRDDevFactor = 0.0; mfxF64 maxFrameSizeHrd = 0.0; mfxF64 HRDDev = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { HRDDevFactor = m_hrdSpec->GetBufferDeviationFactor(eo); HRDDev = m_hrdSpec->GetBufferDeviation(eo); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(eo, bIdr); } mfxF64 lf = 1.0 / pow(m_par.inputBitsPerFrame / fAbLong, 1.0 + HRDDevFactor); if (m_par.HRDConformance != MFX_BRC_NO_HRD && totDev > 0) { if (m_par.rateControlMethod == MFX_RATECONTROL_VBR) { totDev = std::max(totDev, HRDDev); } bAbPreriod = (mfxF64)(m_par.bPyr ? 4 : 3)*(mfxF64)maxFrameSizeHrd / m_par.inputBitsPerFrame*GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIDREncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange); bAbPreriod = mfx::clamp(bAbPreriod, m_par.bAbPeriod / 10, m_par.bAbPeriod); } if (!bNoNewQp) { mfxI32 quant_new = GetNewQPTotal(totDev / bAbPreriod / m_par.inputBitsPerFrame, dQuantAb_new, m_ctx.QuantMin, m_ctx.QuantMax, seqQP_new, m_par.bPyr && m_par.bRec, false); seqQP_new += (seqQP_new - quant_new); } mfxF64 dQuantAb = lf * (1.0 / seqQP_new); return dQuantAb; } mfxI32 BRC_EncToolBase::GetSeqQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const { mfxI32 pqp = 0; if (type == MFX_FRAMETYPE_IDR) { pqp = qp + m_par.iDQp + 1; } else if (type == MFX_FRAMETYPE_I) { pqp = qp + 1; } else if (type == MFX_FRAMETYPE_P) { pqp = qp - layer - qpDeltaP; } else { qp -= GetOffsetAPQ(layer, isRef, qpMod, qpExp, m_par.codecId); pqp = qp - 1; } pqp = mfx::clamp(pqp, m_par.quantMinP, m_par.quantMaxP); return pqp; } mfxI32 BRC_EncToolBase::GetPicQP(mfxI32 pqp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 qpMod, mfxI8 qpExp, mfxI32 qpDeltaP) const { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_IDR) { qp = pqp - 1 - m_par.iDQp; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_I) { qp = pqp - 1; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_P) { qp =pqp + layer; qp += qpDeltaP; qp = mfx::clamp(qp, m_par.quantMinP, m_par.quantMaxP); } else { qp = pqp + 1; qp += GetOffsetAPQ(layer, isRef, qpMod, qpExp, m_par.codecId); qp = mfx::clamp(qp, m_par.quantMinB, m_par.quantMaxB); } return qp; } mfxStatus BRC_EncToolBase::Init(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bALTR) { MFX_CHECK(!m_bInit, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = MFX_ERR_NONE; sts = m_par.Init(ctrl, bMBBRC, isFieldMode(ctrl), bALTR); MFX_CHECK_STS(sts); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { if (m_par.codecId == MFX_CODEC_AVC) m_hrdSpec.reset(new H264_HRD()); else m_hrdSpec.reset(new HEVC_HRD()); m_hrdSpec->Init(m_par); } m_ctx = {}; m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.fAbLA = m_par.inputBitsPerFrame; mfxI32 rawSize = GetRawFrameSize(m_par.width * m_par.height, m_par.chromaFormat, m_par.quantOffset ? m_par.bitDepthLuma : 8); mfxI32 qp = GetNewQP(rawSize, m_par.inputBitsPerFrame, m_par.quantMinI, m_par.quantMaxI, 1, m_par.quantOffset, 0.5, false, false); UpdateQPParams(qp, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, MFX_FRAMETYPE_REF, 0, 0, 0, m_par.codecId); m_ctx.dQuantAb = qp > 0 ? 1.0 / qp : 1.0; //kw if (m_par.WinBRCSize) { m_avg.reset(new AVGBitrate(m_par.WinBRCSize, (mfxU32)(m_par.WinBRCMaxAvgKbps*1000.0 / m_par.frameRate), (mfxU32)m_par.inputBitsPerFrame)); MFX_CHECK_NULL_PTR1(m_avg.get()); } m_bInit = true; return sts; } mfxStatus BRC_EncToolBase::Reset(mfxEncToolsCtrl const & ctrl, bool bMBBRC, bool bALTR) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxExtEncoderResetOption * pRO = (mfxExtEncoderResetOption *)Et_GetExtBuffer(ctrl.ExtParam, ctrl.NumExtParam, MFX_EXTBUFF_ENCODER_RESET_OPTION); if (pRO && pRO->StartNewSequence == MFX_CODINGOPTION_ON) { Close(); sts = Init(ctrl, bMBBRC, bALTR); } else { bool brcReset = false; bool slidingWindowReset = false; sts = m_par.GetBRCResetType(ctrl, false, bMBBRC, brcReset, slidingWindowReset, bALTR); MFX_CHECK_STS(sts); if (brcReset) { sts = m_par.Init(ctrl, bMBBRC, isFieldMode(ctrl), bALTR); MFX_CHECK_STS(sts); m_ctx.Quant = (mfxI32)(1. / m_ctx.dQuantAb * pow(m_ctx.fAbLong / m_par.inputBitsPerFrame, 0.32) + 0.5); m_ctx.Quant = mfx::clamp(m_ctx.Quant, m_par.quantMinI, m_par.quantMaxI); UpdateQPParams(m_ctx.Quant, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, MFX_FRAMETYPE_REF, 0, 0, 0, m_par.codecId); m_ctx.dQuantAb = 1. / m_ctx.Quant; m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.fAbLA = m_par.inputBitsPerFrame; if (slidingWindowReset) { m_avg.reset(new AVGBitrate(m_par.WinBRCSize, (mfxU32)(m_par.WinBRCMaxAvgKbps*1000.0 / m_par.frameRate), (mfxU32)m_par.inputBitsPerFrame)); MFX_CHECK_NULL_PTR1(m_avg.get()); } } } return sts; } mfxStatus BRC_EncToolBase::UpdateFrame(mfxU32 dispOrder, mfxEncToolsBRCStatus *pFrameSts) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pFrameSts); auto frameStructItr = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStructItr == m_FrameStruct.end()) return MFX_ERR_UNDEFINED_BEHAVIOR; // BRC hasn't processed the frame BRC_FrameStruct frameStruct = *frameStructItr; mfxI32 bitsEncoded = frameStruct.frameSize * 8; mfxI32 qpY = frameStruct.qp + m_par.quantOffset; if (frameStructItr->QpMapNZ) { qpY = mfx::clamp((mfxI32)qpY - frameStructItr->QpMapBias, 1, 51); } mfxI32 layer = frameStruct.pyrLayer; mfxU16 picType = GetFrameType(frameStruct.frameType, frameStruct.pyrLayer, m_par.gopRefDist, m_par.codecId); mfxU16 isRef = frameStruct.frameType & MFX_FRAMETYPE_REF; mfxU16 isIntra = frameStruct.frameType & (MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I); bool bIdr = (picType == MFX_FRAMETYPE_IDR); mfxF64 qstep = QP2Qstep(qpY, m_par.quantOffset); mfxU32 ParFrameCmplx = 0; mfxU16 ParSceneChange = (ParFrameCmplx || frameStruct.LaAvgEncodedSize) ? frameStruct.sceneChange : 0; mfxU16 ParQpModulation = frameStruct.qpModulation; mfxU16 miniGoPSize = frameStruct.miniGopSize == 0 ? m_par.gopRefDist : frameStruct.miniGopSize; if (ParQpModulation == MFX_QP_MODULATION_NOT_DEFINED && miniGoPSize >= 8 && m_par.bPyr && (m_par.codecId == MFX_CODEC_HEVC || m_par.codecId == MFX_CODEC_AV1)) { ParQpModulation = BRC_QP_MODULATION_GOP8_FIXED; } mfxI32 ParQpDeltaP = 0; if(picType == MFX_FRAMETYPE_P) ParQpDeltaP = (frameStruct.qpDelta == MFX_QP_UNDEFINED) ? 0 : std::max(-4, std::min(2, (mfxI32)frameStruct.qpDelta)); mfxU16 ParLongTerm = frameStruct.longTerm; mfxF64 fAbLong = m_ctx.fAbLong + (bitsEncoded - m_ctx.fAbLong) / m_par.fAbPeriodLong; mfxF64 fAbShort = m_ctx.fAbShort + (bitsEncoded - m_ctx.fAbShort) / m_par.fAbPeriodShort; mfxF64 fAbLA = m_ctx.fAbLA + (bitsEncoded - m_ctx.fAbLA) / m_par.fAbPeriodLA; mfxF64 eRate = bitsEncoded * sqrt(qstep); mfxF64 e2pe = 0; bool bMaxFrameSizeMode = m_par.maxFrameSizeInBits != 0 && m_par.maxFrameSizeInBits < m_par.inputBitsPerFrame * 2 && m_ctx.totalDeviation < (-1)*m_par.inputBitsPerFrame*m_par.frameRate; if (isIntra) { e2pe = (m_ctx.eRateSH == 0) ? (BRC_SCENE_CHANGE_RATIO2 + 1) : eRate / m_ctx.eRateSH; if (ParSceneChange && e2pe <= BRC_SCENE_CHANGE_RATIO2 && m_ctx.eRate) e2pe = eRate / m_ctx.eRate; } else { e2pe = (m_ctx.eRate == 0) ? (BRC_SCENE_CHANGE_RATIO2 + 1) : eRate / m_ctx.eRate; } mfxU32 frameSizeLim = 0xfffffff; // sliding window limitation or external frame size limitation // HEVC / AV1 do not have external re-encode loop to prevent bitstream copy size violation. // For NO_HRD this will ensure encoded picture fits in bitstream memory. // Bitstsream size is bufferSize if specified. mfxU32 bitstreamSizeLim = frameSizeLim; if(m_par.codecId != MFX_CODEC_AVC && m_par.HRDConformance == MFX_BRC_NO_HRD && m_par.bufferSizeInBytes) bitstreamSizeLim = m_par.bufferSizeInBytes * 8; bool bSHStart = false; bool bNeedUpdateQP = false; mfxU16 &brcSts = pFrameSts->FrameStatus.BRCStatus; brcSts = MFX_BRC_OK; if (m_par.bRec && m_ctx.bToRecode && (m_ctx.encOrder != frameStruct.encOrder)) // || frameStruct.numRecode == 0)) { //printf("++++++++++++++++++++++++++++++++++\n"); // Frame must be recoded, but encoder calls BR for another frame return MFX_ERR_UNDEFINED_BEHAVIOR; } if (frameStruct.numRecode == 0) { // Set context for new frame if (isIntra) { m_ctx.LastIEncOrder = frameStruct.encOrder; if (bIdr) { m_ctx.LastIDREncOrder = frameStruct.encOrder; m_ctx.LastIDRSceneChange = ParSceneChange; } } m_ctx.encOrder = frameStruct.encOrder; m_ctx.poc = frameStruct.dispOrder; m_ctx.bToRecode = 0; m_ctx.bPanic = 0; if (isIntra) { m_ctx.QuantMin = m_par.quantMinI; m_ctx.QuantMax = m_par.quantMaxI; } else if (picType == MFX_FRAMETYPE_P) { m_ctx.QuantMin = m_par.quantMinP; m_ctx.QuantMax = m_par.quantMaxP; } else { m_ctx.QuantMin = m_par.quantMinB; m_ctx.QuantMax = m_par.quantMaxB; } m_ctx.Quant = qpY; if (m_ctx.SceneChange && (m_ctx.poc > m_ctx.SChPoc + 1 || m_ctx.poc == 0)) m_ctx.SceneChange &= ~16; bNeedUpdateQP = true; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { m_hrdSpec->ResetQuant(); } //printf("m_ctx.SceneChange %d, m_ctx.poc %d, m_ctx.SChPoc, m_ctx.poc %d \n", m_ctx.SceneChange, m_ctx.poc, m_ctx.SChPoc, m_ctx.poc); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { brcSts = CheckHrdAndUpdateQP(*m_hrdSpec.get(), bitsEncoded, frameStruct.encOrder, bIdr, qpY); MFX_CHECK(brcSts == MFX_BRC_OK || (!m_ctx.bPanic), MFX_ERR_NOT_ENOUGH_BUFFER); if (brcSts == MFX_BRC_OK && !m_ctx.bPanic) bNeedUpdateQP = true; pFrameSts->FrameStatus.MinFrameSize = (m_hrdSpec->GetMinFrameSizeInBits(frameStruct.encOrder,bIdr) + 7) >> 3; //printf("%d: poc %d, size %d QP %d (%d %d), HRD sts %d, maxFrameSize %d, type %d \n",frame_par->EncodedOrder, frame_par->DisplayOrder, bitsEncoded, m_ctx.Quant, m_ctx.QuantMin, m_ctx.QuantMax, brcSts, m_hrd.GetMaxFrameSize(), frame_par->FrameType); } bool bCalcSetI = (isIntra && (ParFrameCmplx > 0 || frameStruct.LaAvgEncodedSize) && frameStruct.encOrder == m_ctx.LastIEncOrder // We could set Qp && ((ParSceneChange > 0 || frameStruct.encOrder == 0) && m_ctx.LastIQpSet == m_ctx.LastIQpMin)); // We did set Qp and/or was SceneChange if ((e2pe > BRC_SCENE_CHANGE_RATIO2 && bitsEncoded > 4 * m_par.inputBitsPerFrame) || bCalcSetI ) { // scene change, resetting BRC statistics m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; fAbLong = m_ctx.fAbLong + (bitsEncoded - m_ctx.fAbLong) / m_par.fAbPeriodLong; fAbShort = m_ctx.fAbShort + (bitsEncoded - m_ctx.fAbShort) / m_par.fAbPeriodShort; m_ctx.SceneChange |= 1; if (picType != MFX_FRAMETYPE_B) { bSHStart = true; bool bNoNewQp = false; m_ctx.dQuantAb = ResetQuantAb(qpY, picType, layer, isRef, fAbLong, frameStruct.encOrder, bIdr, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, bNoNewQp); m_ctx.SceneChange |= 16; m_ctx.eRateSH = eRate; m_ctx.SChPoc = frameStruct.dispOrder; //printf("!!!!!!!!!!!!!!!!!!!!! %d m_ctx.SceneChange %d, order %d\n", frameStruct.encOrder, m_ctx.SceneChange, frameStruct.dispOrder); if (picType == MFX_FRAMETYPE_P && bitsEncoded > 4 * m_par.inputBitsPerFrame) ResetMinQForMaxFrameSize(&m_par, picType); } } else if (!isIntra && !frameStruct.numRecode && frameStruct.LaAvgEncodedSize && m_ctx.la.LastLaQpUpdateEncOrder == frameStruct.encOrder) { m_ctx.dQuantAb = 1.0 / ((1.0 / m_ctx.dQuantAb) + (qpY - frameStruct.origSeqQp) * 0.5); } if (m_avg.get()) { frameSizeLim = std::min(frameSizeLim, m_avg->GetMaxFrameSize(m_ctx.bPanic, bSHStart || isIntra, frameStruct.numRecode)); } if (m_par.maxFrameSizeInBits) { frameSizeLim = std::min(frameSizeLim, m_par.maxFrameSizeInBits); } //printf("frameSizeLim %d (%d)\n", frameSizeLim, bitsEncoded); if (!m_ctx.bPanic) UpdateMinQForMaxFrameSize(&m_par, bitsEncoded, qpY, m_ctx, picType, bSHStart, brcSts); if (frameStruct.numRecode < 2) // Check other conditions for recoding (update qp if it is needed) { mfxF64 targetFrameSize = std::max(m_par.inputBitsPerFrame, fAbLong); mfxF64 dqf = (m_par.bFieldMode) ? 1.0 : DQF(picType, m_par.iDQp, ((picType == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), (ParSceneChange || m_ctx.encOrder == 0)); mfxF64 maxFrameSizeByRatio = dqf * FRM_RATIO(picType, m_ctx.encOrder, bSHStart, m_par.bPyr) * targetFrameSize; // Aref if (picType == MFX_FRAMETYPE_P && ParLongTerm && frameStruct.qpDelta<0) maxFrameSizeByRatio *= 1.58; if (frameStruct.QpMapNZ) maxFrameSizeByRatio *= 1.16; // some boost expected if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufferDeviation = m_hrdSpec->GetBufferDeviation(frameStruct.encOrder); mfxF64 dev = -1.0*maxFrameSizeByRatio - bufferDeviation; if (dev > 0) maxFrameSizeByRatio += (std::min)(maxFrameSizeByRatio, (dev / (isIntra ? 2.0 : 4.0))); } else if(isIntra && m_par.bRec) { mfxF64 devI = -m_ctx.totalDeviation; if (devI > 0) maxFrameSizeByRatio += std::min(maxFrameSizeByRatio, devI); else maxFrameSizeByRatio -= std::min(maxFrameSizeByRatio / 2.0, -devI); } // Upper limit of Max Frame size factor based on various factors mfxF64 maxFactor = 1.66 * 8 * 1.58 * 1.16 * 2.0; // Max of (Boost * FrameRatio * LTR factor * QpMap factor * Deviation factor) mfxI32 quantMax = m_ctx.QuantMax; mfxI32 quantMin = m_ctx.QuantMin; mfxI32 quant = qpY; mfxF64 maxFrameSize = std::min(maxFrameSizeByRatio, frameSizeLim); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frameStruct.encOrder,bIdr); mfxF64 bufOccupy = LTR_BUF(picType, m_par.iDQp, ((picType == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), ParSceneChange, bSHStart, m_par.mVeryLowDelay); mfxF64 maxFrameSizeHRDBalanced = bufOccupy / 9.* maxFrameSizeHrd + (9.0 - bufOccupy) / 9.*targetFrameSize; if (m_ctx.encOrder == 0) { // modify buf limits for VCM like encode for init only mfxF64 maxFrameSizeGood = 6.5 * m_par.inputBitsPerFrame; mfxF64 maxFrameSizeHighMark = 8.0 / 9.* maxFrameSizeHrd + 1.0 / 9.*m_par.inputBitsPerFrame; mfxF64 maxFrameSizeInit = mfx::clamp(maxFrameSizeGood, maxFrameSizeHRDBalanced, maxFrameSizeHighMark); maxFrameSize = std::min(maxFrameSize, maxFrameSizeInit); } else maxFrameSize = std::min(maxFrameSize, maxFrameSizeHRDBalanced); quantMax = std::min(m_hrdSpec->GetMaxQuant(), quantMax); quantMin = std::max(m_hrdSpec->GetMinQuant(), quantMin); } maxFrameSize = std::max(maxFrameSize, targetFrameSize); bool bMaxFrameSizeRecode = (!ParSceneChange || bitsEncoded > (mfxI32)(maxFactor*targetFrameSize) || m_par.HRDConformance != MFX_BRC_NO_HRD || (m_par.maxFrameSizeInBits && bitsEncoded>(mfxI32)m_par.maxFrameSizeInBits)); if (bitsEncoded > maxFrameSize && quant < quantMax && bMaxFrameSizeRecode) { mfxI32 quant_new = GetNewQP(bitsEncoded, (mfxU32)maxFrameSize, quantMin, quantMax, quant, m_par.quantOffset, 1); if (quant_new > quant) { bNeedUpdateQP = false; //printf(" recode 1-0: %d: k %5f bitsEncoded %d maxFrameSize %d (%d, %d), targetSize %d, fAbLong %f, inputBitsPerFrame %f, qp %d new %d, layer %d\n", // frameStruct.encOrder, bitsEncoded/maxFrameSize, (int)bitsEncoded, (int)maxFrameSize,(int) maxFrameSizeByRatio, (int) frameSizeLim, (int)targetFrameSize, fAbLong, m_par.inputBitsPerFrame, quant, quant_new, layer); if (quant_new > GetCurQP(picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) { UpdateQPParams(bMaxFrameSizeMode ? quant_new - 1 : quant_new, picType, m_ctx, 0, quantMin, quantMax, layer, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, isRef, fAbLong, frameStruct.encOrder, bIdr, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, false); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_BIG_FRAME, quant, quant_new, quantMin, quantMax, m_ctx, &pFrameSts->FrameStatus); frameStruct.numRecode++; return sts; } } //(quant_new > quant) } //bitsEncoded > maxFrameSize mfxF64 lFR = std::min(m_par.gopPicSize - 1, 4); mfxF64 lowFrameSizeI = std::min(maxFrameSize, lFR *(mfxF64)m_par.inputBitsPerFrame); // Did we set the qp? if (isIntra && (ParFrameCmplx > 0 || frameStruct.LaAvgEncodedSize) // We could set Qp && frameStruct.encOrder == m_ctx.LastIEncOrder && m_ctx.LastIQpSet == m_ctx.LastIQpMin // We did set Qp && frameStruct.numRecode == 0 && bitsEncoded < (lowFrameSizeI / 2.0) && quant > quantMin) // We can & should recode { // too small; do something mfxI32 quant_new = GetNewQP(bitsEncoded, (mfxU32)lowFrameSizeI, quantMin, quantMax, quant, m_par.quantOffset, 0.78, false, true); if (quant_new < quant) { bNeedUpdateQP = false; if (quant_new < GetCurQP(picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) { UpdateQPParams(bMaxFrameSizeMode ? quant_new - 1 : quant_new, picType, m_ctx, 0, quantMin, quantMax, layer, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, isRef, fAbLong, frameStruct.encOrder, bIdr, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, false); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_SMALL_FRAME, quant, quant_new, quantMin, quantMax, m_ctx, &pFrameSts->FrameStatus); frameStruct.numRecode++; return sts; } } //(quant_new < quant) } if (bitsEncoded > maxFrameSize && quant == quantMax && !isIntra && m_par.bPanic && (!m_ctx.bPanic) && isFrameBeforeIntra(m_ctx.encOrder, m_ctx.LastIEncOrder, m_par.gopPicSize, m_par.gopRefDist)) { //skip frames before intra SetRecodeParams(MFX_BRC_PANIC_BIG_FRAME, quant, quant, quantMin, quantMax, m_ctx, &pFrameSts->FrameStatus); frameStruct.numRecode++; return sts; } if (m_par.HRDConformance != MFX_BRC_NO_HRD && frameStruct.numRecode == 0 && (quant < quantMax)) { mfxF64 maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frameStruct.encOrder, bIdr); mfxF64 FAMax = 1./9. * maxFrameSizeHrd + 8./9. * fAbLong; if (fAbShort > FAMax) { mfxI32 quant_new = GetNewQP(fAbShort, FAMax, quantMin, quantMax, quant, m_par.quantOffset, 0.5); //printf("============== recode 2-0: %d: FAMax %f, fAbShort %f, quant_new %d\n",frameStruct.encOrder, FAMax, fAbShort, quant_new); if (quant_new > quant) { bNeedUpdateQP = false; if (quant_new > GetCurQP(picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) { UpdateQPParams(quant_new, picType, m_ctx, 0, quantMin, quantMax, layer, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, isRef, fAbLong, frameStruct.encOrder, bIdr, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, false); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_BIG_FRAME, quant, quant_new, quantMin, quantMax, m_ctx, &pFrameSts->FrameStatus); frameStruct.numRecode++; return sts; } } //quant_new > quant } }//m_par.HRDConformance } if ((((m_par.HRDConformance != MFX_BRC_NO_HRD && brcSts != MFX_BRC_OK) || (bitsEncoded > (mfxI32)frameSizeLim)) && m_par.bRec) || (bitsEncoded > (mfxI32)bitstreamSizeLim)) { mfxI32 quant = qpY; mfxI32 quant_new = quant; if (bitsEncoded > (mfxI32)frameSizeLim) { brcSts = MFX_BRC_BIG_FRAME; quant_new = GetNewQP(bitsEncoded, frameSizeLim, m_ctx.QuantMin, m_ctx.QuantMax, quant, m_par.quantOffset, 1, true); } else if (bitsEncoded > (mfxI32)bitstreamSizeLim) { brcSts = MFX_BRC_BIG_FRAME; quant_new = GetNewQP(bitsEncoded, bitstreamSizeLim, m_ctx.QuantMin, m_ctx.QuantMax, quant, m_par.quantOffset, 1, true); } else if (brcSts == MFX_BRC_BIG_FRAME || brcSts == MFX_BRC_SMALL_FRAME) { mfxF64 targetSize = GetFrameTargetSize(brcSts, m_hrdSpec->GetMinFrameSizeInBits(frameStruct.encOrder, bIdr), m_hrdSpec->GetMaxFrameSizeInBits(frameStruct.encOrder, bIdr)); quant_new = GetNewQP(bitsEncoded, targetSize, m_ctx.QuantMin , m_ctx.QuantMax,quant,m_par.quantOffset, 1, true); } if (quant_new != quant) { if (brcSts == MFX_BRC_SMALL_FRAME) { quant_new = std::max(quant_new, quant - 2); brcSts = MFX_BRC_PANIC_SMALL_FRAME; } // Idea is to check a sign mismatch, 'true' if both are negative or positive if ((quant_new - qpY) * (quant_new - GetCurQP(picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) > 0) { UpdateQPParams(quant_new, picType, m_ctx, 0, m_ctx.QuantMin, m_ctx.QuantMax, layer, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, isRef, fAbLong, frameStruct.encOrder, bIdr, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, false); } bNeedUpdateQP = false; } SetRecodeParams(brcSts, quant, quant_new, m_ctx.QuantMin, m_ctx.QuantMax, m_ctx, &pFrameSts->FrameStatus); //printf("===================== recode 1-0: HRD recode: quant_new %d\n", quant_new); } else { // no recoding is needed. Save context params mfxF64 k = 1. / GetSeqQP(qpY, picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); mfxF64 dqAbPeriod = m_par.dqAbPeriod; if (m_ctx.bToRecode) dqAbPeriod = (k < m_ctx.dQuantAb) ? 16 : 25; if (bNeedUpdateQP) { m_ctx.dQuantAb += (k - m_ctx.dQuantAb) / dqAbPeriod; m_ctx.dQuantAb = mfx::clamp(m_ctx.dQuantAb, 1. / m_ctx.QuantMax, 1.); m_ctx.fAbLong = fAbLong; m_ctx.fAbShort = fAbShort; m_ctx.fAbLA = fAbLA; } bool oldScene = false; if ((m_ctx.SceneChange & 16) && (m_ctx.poc < m_ctx.SChPoc) && (e2pe < .01) && (mfxF64)bitsEncoded < 1.5*fAbLong) oldScene = true; //printf("-- m_ctx.eRate %f, eRate %f, e2pe %f\n", m_ctx.eRate, eRate, e2pe ); if (!m_ctx.bPanic && frameStruct.numRecode < 100) { if (picType != MFX_FRAMETYPE_B) { m_ctx.LastNonBFrameSize = bitsEncoded; if (isIntra) { m_ctx.eRateSH = eRate; if (ParSceneChange) m_ctx.eRate = m_par.inputBitsPerFrame * sqrt(QP2Qstep(GetCurQP(MFX_FRAMETYPE_P, 0, MFX_FRAMETYPE_REF, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP), m_par.quantOffset)); } else { m_ctx.eRate = eRate; if (m_ctx.eRate > m_ctx.eRateSH) m_ctx.eRateSH = m_ctx.eRate; } } if (isIntra) { m_ctx.LastIFrameSize = bitsEncoded; m_ctx.LastIQpAct = qpY; } } if (m_avg.get()) { m_avg->UpdateSlidingWindow(bitsEncoded, m_ctx.encOrder, m_ctx.bPanic, bSHStart || isIntra, frameStruct.numRecode, qpY); } m_ctx.totalDeviation += ((mfxF64)bitsEncoded - m_par.inputBitsPerFrame); //printf("------------------ %d (%d)) Total deviation %f, old scene %d, bNeedUpdateQP %d, m_ctx.Quant %d, type %d, m_ctx.fAbLong %f m_par.inputBitsPerFrame %f\n", frameStruct.encOrder, frameStruct.dispOrder,m_ctx.totalDeviation, oldScene , bNeedUpdateQP, m_ctx.Quant,picType, m_ctx.fAbLong, m_par.inputBitsPerFrame); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { m_hrdSpec->Update(bitsEncoded, frameStruct.encOrder, bIdr); } if (!m_ctx.bPanic && (!oldScene) && bNeedUpdateQP) { mfxI32 quant_new = qpY; //Update QP mfxF64 totDev = m_ctx.totalDeviation; mfxF64 HRDDevFactor = 0.0; mfxF64 HRDDev = 0.0; mfxF64 maxFrameSizeHrd = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { HRDDevFactor = m_hrdSpec->GetBufferDeviationFactor(frameStruct.encOrder); HRDDev = m_hrdSpec->GetBufferDeviation(frameStruct.encOrder); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frameStruct.encOrder, bIdr); } mfxF64 dequant_new = m_ctx.dQuantAb*pow(m_par.inputBitsPerFrame / m_ctx.fAbLong, 1.0 + HRDDevFactor); mfxF64 bAbPreriod = m_par.bAbPeriod; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { if (m_par.rateControlMethod == MFX_RATECONTROL_VBR && m_par.maxbps > m_par.targetbps ) { totDev = std::max(totDev, HRDDev); } else { totDev = HRDDev; } if (totDev > 0) { bAbPreriod = (mfxF64)(m_par.bPyr ? 4 : 3)*(mfxF64)maxFrameSizeHrd / fAbShort * GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIDREncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange); bAbPreriod = mfx::clamp(bAbPreriod, m_par.bAbPeriod / 10, m_par.bAbPeriod); } } if (frameStruct.LaAvgEncodedSize && m_ctx.la.LastLaPBitsAvg[0] && m_par.HRDConformance == MFX_BRC_NO_HRD) { mfxF64 laRatio = (mfxF64)frameStruct.LaAvgEncodedSize / (mfxF64)m_ctx.la.LastLaPBitsAvg[0]; mfxF64 fAbFuture = laRatio * fAbLA; // future dev assuming no qp change mfxF64 futureDev = (fAbFuture - m_par.inputBitsPerFrame) * m_par.mLaDepth; //printf("%d TotalDev %lf FutureDev %lf laRatio %lf LaAvgEncodedSize %d LastLaPBitsAvg %d\n", // frameStruct.encOrder, totDev, futureDev, laRatio, frameStruct.LaAvgEncodedSize, m_ctx.LastLaPBitsAvg[0]); totDev = totDev + futureDev; } quant_new = GetNewQPTotal(totDev / bAbPreriod / (mfxF64)m_par.inputBitsPerFrame, dequant_new, m_ctx.QuantMin, m_ctx.QuantMax, GetSeqQP(qpY, picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP), m_par.bPyr && m_par.bRec, bSHStart && m_ctx.bToRecode == 0); quant_new = GetPicQP(quant_new, picType, layer, isRef,ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); //printf(" ===%d quant old %d quant_new %d, bitsEncoded %d m_ctx.QuantMin %d m_ctx.QuantMax %d\n", frameStruct.encOrder, m_ctx.Quant, quant_new, bitsEncoded, m_ctx.QuantMin, m_ctx.QuantMax); if (bMaxFrameSizeMode) { mfxF64 targetMax = ((mfxF64)m_par.maxFrameSizeInBits*((bSHStart || isIntra) ? 0.95 : 0.9)); mfxF64 targetMin = ((mfxF64)m_par.maxFrameSizeInBits*((bSHStart || isIntra) ? 0.9 : 0.8 /*0.75 : 0.5*/)); mfxI32 QuantNewMin = GetNewQP(bitsEncoded, targetMax, m_ctx.QuantMin, m_ctx.QuantMax, qpY, m_par.quantOffset, 1, false, false); mfxI32 QuantNewMax = GetNewQP(bitsEncoded, targetMin, m_ctx.QuantMin, m_ctx.QuantMax, qpY, m_par.quantOffset, 1, false, false); mfxI32 quant_corrected = qpY; if (quant_corrected < QuantNewMin - 3) quant_corrected += 2; if (quant_corrected < QuantNewMin) quant_corrected++; else if (quant_corrected > QuantNewMax + 3) quant_corrected -= 2; else if (quant_corrected > QuantNewMax) quant_corrected--; //printf(" QuantNewMin %d, QuantNewMax %d, m_ctx.Quant %d, new %d (%d)\n", QuantNewMin, QuantNewMax, m_ctx.Quant, quant_corrected, quant_new); quant_new = mfx::clamp(quant_corrected, m_ctx.QuantMin, m_ctx.QuantMax); } if ((quant_new - qpY)* (quant_new - GetCurQP(picType, layer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) > 0) // this check is actual for async scheme { //printf(" +++ Update QP %d: totalDeviation %f, bAbPreriod %f (%f), QP %d (%d %d), qp_new %d (qpY %d), type %d, dequant_new %f (%f) , m_ctx.fAbLong %f, m_par.inputBitsPerFrame %f\n", // frameStruct.encOrder, totDev, bAbPreriod, GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIEncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange), m_ctx.Quant, m_ctx.QuantMin, m_ctx.QuantMax,quant_new, qpY, picType, 1.0/dequant_new, 1.0/m_ctx.dQuantAb, m_ctx.fAbLong, m_par.inputBitsPerFrame); UpdateQPParams(quant_new, picType, m_ctx, 0, m_ctx.QuantMin, m_ctx.QuantMax, layer, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); } } m_ctx.bToRecode = 0; } return sts; } const mfxF64 COEFF_INTRA[2] = { -0.107510, 0.694515 }; static inline void get_coeff_intra(mfxF64 *pCoeff) { pCoeff[0] = COEFF_INTRA[0]; pCoeff[1] = COEFF_INTRA[1]; } // RACA = Spatial Complexity measure // RACA = Row diff Abs + Column diff Abs #define PWR_RACA 0.751 static mfxF64 getScaledIntraBits(mfxF64 targetBits, mfxF64 rawSize, mfxF64 raca) { if (raca < MIN_RACA) raca = MIN_RACA; mfxF64 SC = pow(raca, PWR_RACA); mfxF64 dBits = log((targetBits / rawSize) / SC); return dBits; } static mfxI32 compute_first_qp_intra(mfxI32 targetBits, mfxI32 rawSize, mfxF64 raca) { mfxF64 dBits = getScaledIntraBits(targetBits, rawSize, raca); mfxF64 coeffIntra[2]; get_coeff_intra(coeffIntra); mfxF64 qpNew = (dBits - coeffIntra[1]) / coeffIntra[0]; mfxI32 qp = (mfxI32)(qpNew + 0.5); if (qp < 1) qp = 1; return qp; } static mfxI32 compute_new_qp_intra(mfxI32 targetBits, mfxI32 rawSize, mfxF64 raca, mfxI32 iBits, mfxF64 icmplx, mfxI32 iqp) { mfxF64 coeffIntra1[2], coeffIntra2[2]; mfxF64 qp_hat = getScaledIntraBits(iBits, rawSize, icmplx); get_coeff_intra(coeffIntra1); qp_hat = (qp_hat - coeffIntra1[1]) / coeffIntra1[0]; mfxF64 dQp = iqp - qp_hat; dQp = mfx::clamp(dQp, (-1.0 * MAX_MODEL_ERR), (1.0 * MAX_MODEL_ERR)); mfxF64 qp_pred = getScaledIntraBits(targetBits, rawSize, raca); get_coeff_intra(coeffIntra2); qp_pred = (qp_pred - coeffIntra2[1]) / coeffIntra2[0]; mfxF64 qpNew = qp_pred + dQp; mfxI32 qp = (mfxI32)(qpNew + 0.5); if (qp < 1) qp = 1; return qp; } mfxStatus BRC_EncToolBase::GetHRDPos(mfxU32 dispOrder, mfxEncToolsBRCHRDPos *pHRDPos) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pHRDPos); auto frameStructItr = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStructItr == m_FrameStruct.end()) return MFX_ERR_UNDEFINED_BEHAVIOR; // BRC hasn't processed the frame BRC_FrameStruct frameStruct = *frameStructItr; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { pHRDPos->InitialCpbRemovalDelay = m_hrdSpec->GetInitCpbRemovalDelay(frameStruct.encOrder); pHRDPos->InitialCpbRemovalDelayOffset = m_hrdSpec->GetInitCpbRemovalDelayOffset(frameStruct.encOrder); } return MFX_ERR_NONE; } static mfxU8 SelectQp(mfxF64 erate[52], mfxF64 budget) { for (mfxU8 qp = 1; qp < 52; qp++) if (erate[qp] < budget) return (erate[qp - 1] + erate[qp] < 2 * budget) ? qp - 1 : qp; return 51; } mfxI32 BRC_EncToolBase::GetLaQpEst(mfxU32 LaAvgEncodedSize, mfxF64 inputBitsPerFrame, const BRC_FrameStruct& frameStruct, bool updateState) { mfxU32 laScaledSize = LaAvgEncodedSize << (m_par.mLaScale << 1); mfxF32 laQ = ((mfxF32)(m_par.mLaQp) - ((logf((mfxF32)inputBitsPerFrame / (mfxF32)laScaledSize) / logf(2.0f)) * 6.0f)); mfxI32 laQp = (mfxI32)(laQ); // IPPP if (m_par.gopRefDist > 1) { if (m_par.mLaScale) { if (m_par.codecId == MFX_CODEC_AVC) { if(m_par.mLaQp != 26 || !frameStruct.frameCmplx || !m_par.lowPower) { laQp = (mfxI32)(0.679f*laQ + 0.465f); // NN V L } else { mfxF32 R = (mfxF32) ((1.5 * m_par.width * m_par.height) / (inputBitsPerFrame * m_par.frameRate / 1000.0)); mfxF32 SC = (mfxF32) frameStruct.frameCmplx; mfxF32 C = std::max(SC / (128*64), 0.03f); mfxF32 B = (mfxF32)laScaledSize / (mfxF32) (1.5 * m_par.width * m_par.height); mfxF32 F = (mfxF32) (std::max(std::min(m_par.frameRate, 61.0), 23.0)); const mfxF32 Alpha=0.094160103f, Beta=0.70605035f, Gamma=0.551621897f, Delta=0.042768353f, Epsilon=0.457860107f; mfxF32 Q = Alpha * powf(R, Beta) * powf(F, Epsilon) * powf(B, Gamma) * powf(C, Delta); mfxF32 Qp = 6.f * (logf(Q)/logf(2.f)) + 2.f; laQp = (mfxI32) (Qp); } } else { if(m_par.mLaQp != 26 || !frameStruct.frameCmplx || !m_par.lowPower) { laQp = (mfxI32)(0.6634f*laQ - 0.035f); // NN V L } else { mfxF32 R = (mfxF32) ((1.5 * m_par.width * m_par.height) / (inputBitsPerFrame * m_par.frameRate / 1000.0)); mfxF32 SC = (mfxF32) frameStruct.frameCmplx; mfxF32 C = std::max(SC / (128*64), 0.03f); mfxF32 B = (mfxF32)laScaledSize / (mfxF32) (1.5 * m_par.width * m_par.height); mfxF32 F = (mfxF32) (std::max(std::min(m_par.frameRate, 61.0), 23.0)); const mfxF32 Alpha=0.095227005f, Beta=0.661596921f, Gamma=0.486806893f, Delta=0.078518546f, Epsilon=0.446383738f; mfxF32 Q = Alpha * powf(R, Beta) * powf(F, Epsilon) * powf(B, Gamma) * powf(C, Delta); mfxF32 Qp = 6.f * (logf(Q)/logf(2.f)) + 3.f; laQp = (mfxI32) (Qp); } } } else { laQp = (mfxI32)(0.776f * laQ + 4.6f); } } if (updateState) { m_ctx.la.LastLaQpCalc = laQp; m_ctx.la.SetLaQpCalcOrder(frameStruct.encOrder, frameStruct.dispOrder); m_ctx.la.LastLaQpCalcHasI = (frameStruct.frameType & (MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I)) || frameStruct.LaIDist; } return laQp; } mfxStatus BRC_EncToolBase::ProcessFrame(mfxU32 dispOrder, mfxEncToolsBRCQuantControl *pFrameQp, mfxEncToolsHintQPMap* qpMapHint) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pFrameQp); auto frameStructItr = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStructItr == m_FrameStruct.end()) return MFX_ERR_UNDEFINED_BEHAVIOR; // BRC hasn't processed the frame BRC_FrameStruct frameStruct = *frameStructItr; mfxU16 ParSceneChange = frameStruct.sceneChange; mfxU16 ParLongTerm = frameStruct.longTerm; mfxU32 ParFrameCmplx = 0; // Used only for LA models for now mfxU16 ParQpModulation = frameStruct.qpModulation; mfxI32 ParQpDeltaP = 0; mfxU16 miniGoPSize = frameStruct.miniGopSize == 0 ? m_par.gopRefDist : frameStruct.miniGopSize; if (ParQpModulation == MFX_QP_MODULATION_NOT_DEFINED && miniGoPSize >= 8 && m_par.bPyr && (m_par.codecId == MFX_CODEC_HEVC || m_par.codecId == MFX_CODEC_AV1)) { ParQpModulation = BRC_QP_MODULATION_GOP8_FIXED; } mfxI32 qp = 0; mfxI32 qpMin = 1; mfxU16 type = GetFrameType(frameStruct.frameType, frameStruct.pyrLayer, m_par.gopRefDist, m_par.codecId); bool bIdr = (type == MFX_FRAMETYPE_IDR); mfxU16 isRef = frameStruct.frameType & MFX_FRAMETYPE_REF; mfxU16 isIntra = frameStruct.frameType & (MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I); if (type == MFX_FRAMETYPE_P) ParQpDeltaP = (frameStruct.qpDelta == MFX_QP_UNDEFINED) ? 0 : std::max(-4, std::min(2, (mfxI32)frameStruct.qpDelta)); mfxF64 HRDDevFactor = 0.0; mfxF64 HRDDev = 0.0; mfxF64 maxFrameSizeHrd = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { HRDDevFactor = m_hrdSpec->GetBufferDeviationFactor(frameStruct.encOrder); HRDDev = m_hrdSpec->GetBufferDeviation(frameStruct.encOrder); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frameStruct.encOrder, bIdr); } frameStructItr->origSeqQp = GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); if (!m_bDynamicInit) { if (isIntra) { // Init DQP if (!ParLongTerm && m_par.mHasALTR) { m_par.iDQp = 0; } else if ((!ParFrameCmplx && !frameStruct.LaAvgEncodedSize) || (frameStruct.LaIDist && frameStruct.LaIDist<32)) { // longterm but no complexity measure m_par.iDQp = 1; } else { m_par.iDQp = m_par.iDQp0; } ltrprintf("DQp0 %d LongTerm %d ParFrameCmplx %d AvgEncodedSize %d IDist %d\n", m_par.iDQp, ParLongTerm, ParFrameCmplx, frameStruct.LaAvgEncodedSize, frameStruct.LaIDist); // Init Min Qp if (ParFrameCmplx > 0) { mfxF64 raca = (mfxF64)ParFrameCmplx / RACA_SCALE; // MaxFrameSize mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufOccupy = LTR_BUF(type, m_par.iDQp, m_par.mIntraBoost, 1, 0, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* (m_par.initialDelayInBytes * 8.0) + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } // Set Intra QP mfxF64 dqf = DQF(type, m_par.iDQp, m_par.mIntraBoost, 1); mfxF64 targetFrameSize = dqf * FRM_RATIO(type, 0, 0, m_par.bPyr) * (mfxF64)m_par.inputBitsPerFrame; targetFrameSize = std::min(maxFrameSize, targetFrameSize); mfxI32 qp0 = compute_first_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca); if (targetFrameSize < 6.5 * m_par.inputBitsPerFrame && qp0 > 3) qp0 -= 3; // use re-encoding for best results (maxFrameSizeGood) else if (raca == MIN_RACA && qp0 > 3) qp0 -= 3; // uncertainty; use re-encoding for best results qp0 = mfx::clamp(qp0, m_par.quantMinI, m_par.quantMaxI); ltrprintf("Qp0 %d\n", qp0); UpdateQPParams(qp0, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qpMin = qp0; } else if (ParLongTerm) { mfxI32 qp0 = m_ctx.QuantIDR; UpdateQPParams(qp0, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qpMin = qp0; } } if (frameStruct.LaAvgEncodedSize) { mfxI32 laQp = GetLaQpEst(frameStruct.LaAvgEncodedSize, m_par.inputBitsPerFrame, frameStruct, true); laQp = std::max(laQp, m_ctx.QuantP - (m_ctx.QuantP/2)); mfxI32 qp0 = mfx::clamp(std::max(laQp - 1 - (mfxI32)m_par.iDQp, 1), m_par.quantMinI, m_par.quantMaxI); ltrprintf("Dynamic Init LA %d Qp %d P Qp %d\n", frameStruct.LaAvgEncodedSize, laQp, m_ctx.QuantP); UpdateQPParams(qp0, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qpMin = m_ctx.QuantIDR; m_ctx.la.SetLaQpUpdateOrder(frameStruct.encOrder, frameStruct.dispOrder); } m_bDynamicInit = true; } if (frameStruct.encOrder == m_ctx.encOrder || frameStruct.numRecode) { qp = m_ctx.Quant; } else { if (isIntra) { // Set DQp if IDR if (type == MFX_FRAMETYPE_IDR) { if (!ParLongTerm && m_par.mHasALTR) { m_par.iDQp = 0; } else if ((!ParFrameCmplx && !frameStruct.LaAvgEncodedSize) || (frameStruct.LaIDist && frameStruct.LaIDist<32) || !m_par.mHasALTR) { m_par.iDQp = 1; } else if (ParSceneChange) { m_par.iDQp = m_par.iDQp0; } ltrprintf("DQp0 %d LongTerm %d ParFrameCmplx %d AvgEncodedSize %d IDist %d SceneChange %d\n", m_par.iDQp, ParLongTerm, ParFrameCmplx, frameStruct.LaAvgEncodedSize, frameStruct.LaIDist, ParSceneChange); } mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 hrdMaxFrameSize = m_par.initialDelayInBytes * 8; if (maxFrameSizeHrd > 0) hrdMaxFrameSize = std::min(hrdMaxFrameSize, maxFrameSizeHrd); mfxF64 bufOccupy = LTR_BUF(type, m_par.iDQp, ((type == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), (ParSceneChange || (m_ctx.LastIQpSet && m_ctx.QuantP > ((mfxI32)m_ctx.LastIQpSet + (mfxI32)m_par.iDQp + 1))), 0, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* hrdMaxFrameSize + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } if (type == MFX_FRAMETYPE_IDR && m_par.mHasALTR) { // Re-Determine LTR iDQP if (!ParLongTerm) m_par.iDQp = 0; else { mfxF64 maxFrameRatio = 2 * FRM_RATIO(type, frameStruct.encOrder, 0, m_par.bPyr); mfxF64 minFrameRatio = FRM_RATIO(type, 0, 0, m_par.bPyr); maxFrameRatio = std::min(maxFrameRatio, (maxFrameSize / m_par.inputBitsPerFrame)); mfxU32 mNumRefsInGop = m_par.mNumRefsInGop; if (m_ctx.LastIQpSetOrder) { mfxU32 pastRefsInGop = (mfxU32)(std::max(1.0, (!m_par.bPyr ? (mfxF64)(frameStruct.encOrder - m_ctx.LastIQpSetOrder) / (mfxF64)m_par.gopRefDist : (mfxF64)(frameStruct.encOrder - m_ctx.LastIQpSetOrder) / 2.0))); mNumRefsInGop = std::min(mNumRefsInGop, pastRefsInGop); } maxFrameRatio = std::min(maxFrameRatio, mNumRefsInGop); mfxF64 dqpmax = std::max(0.0, 6.0 * (log(maxFrameRatio / minFrameRatio) / log(2.0))); mfxU32 iDQpMax = (mfxU32)(dqpmax + 0.5); if((!ParFrameCmplx && !frameStruct.LaAvgEncodedSize) || (frameStruct.LaIDist && frameStruct.LaIDist<32)) iDQpMax = mfx::clamp(iDQpMax, 1u, 2u); else if (ParSceneChange) iDQpMax = mfx::clamp(iDQpMax, 1u, m_par.iDQp0); else iDQpMax = mfx::clamp(iDQpMax, 1u, MAX_DQP_LTR); m_par.iDQp = iDQpMax; ltrprintf("FR %lf DQp %d\n", maxFrameRatio, m_par.iDQp); } } // Determine Min Qp if (ParFrameCmplx > 0) { mfxF64 raca = (mfxF64)ParFrameCmplx / RACA_SCALE; mfxF64 dqf = DQF(type, m_par.iDQp, ((type == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), ParSceneChange); mfxF64 targetFrameSize = dqf * FRM_RATIO(type, frameStruct.encOrder, 0, m_par.bPyr) * m_par.inputBitsPerFrame; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance) { // CBR HRD Buffer overflow has priority mfxF64 dev = -1.0*targetFrameSize - HRDDev; if (dev > 0) targetFrameSize += std::min(targetFrameSize, (dev / 2.0)); } targetFrameSize = std::min(maxFrameSize, targetFrameSize); mfxF64 CmplxRatio = 1.0; if (m_ctx.LastICmplx) CmplxRatio = ParFrameCmplx / m_ctx.LastICmplx; if (!ParSceneChange && m_ctx.LastICmplx && m_ctx.LastIQpAct && m_ctx.LastIFrameSize && CmplxRatio > 0.5 && CmplxRatio < 2.0) { qpMin = compute_new_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca, m_ctx.LastIFrameSize, (mfxF64)m_ctx.LastICmplx / RACA_SCALE, m_ctx.LastIQpAct); if (raca == MIN_RACA && qpMin > 3) qpMin -= 3; // uncertainty; use re-encoding for best results } else { qpMin = compute_first_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca); if (targetFrameSize < 6.5 * m_par.inputBitsPerFrame && qpMin>3) qpMin -= 3; // uncertainty; use re-encoding for best results else if (raca == MIN_RACA && qpMin > 3) qpMin -= 3; // uncertainty; use re-encoding for best results } mfxI32 curQp = GetCurQP(type, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); qpMin = std::min(qpMin, curQp + 6); ltrprintf("Min QpI %d Schg %d\n", qpMin, ParSceneChange); } else if (frameStruct.LaAvgEncodedSize) { mfxF64 dqf = DQF(type, m_par.iDQp, ((type == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), ParSceneChange); mfxF64 ratio = dqf * FRM_RATIO(type, frameStruct.encOrder, 0, m_par.bPyr); mfxF64 targetFrameSize = ratio * m_par.inputBitsPerFrame; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance) { // CBR HRD Buffer overflow has priority mfxF64 devI = -1.0*targetFrameSize - HRDDev; if (devI > 0) targetFrameSize += std::min(targetFrameSize, (devI / 2.0)); } else { mfxF64 devI = - m_ctx.totalDeviation; if (devI > 0) targetFrameSize += std::min(targetFrameSize, devI); else targetFrameSize -= std::min(targetFrameSize/2.0, -devI); } targetFrameSize = std::min(maxFrameSize, targetFrameSize); mfxF64 modelScale = 0.457120157; mfxF64 IBitsRatio = 1.0; if (m_ctx.la.LastLaIBits) IBitsRatio = (mfxF64)frameStruct.LaCurEncodedSize / (mfxF64)m_ctx.la.LastLaIBits; if (!ParSceneChange && m_ctx.la.LastLaIBits && m_ctx.LastIQpAct && m_ctx.LastIFrameSize && IBitsRatio > 0.5 && IBitsRatio < 2.0) { mfxF64 lastibits = (mfxF64)(m_ctx.la.LastLaIBits * (1 << (m_par.mLaScale << 1))); mfxF64 ibits_pred = lastibits * pow(2.0, ((mfxF64)m_par.mLaQp - (mfxF64)m_ctx.LastIQpAct) / 6.0); modelScale = (mfxF64)m_ctx.LastIFrameSize / pow(ibits_pred, 1.013753126); modelScale = std::max(0.1, std::min(modelScale, 1.0)); } mfxF64 ibits = (mfxF64)(frameStruct.LaCurEncodedSize * (1 << (m_par.mLaScale << 1))); mfxF64 EstRate[52] = { 0.0 }; for (mfxU32 qpest = 0; qpest < 52; qpest++) { mfxF64 ibits_qp = (ibits*pow(2.0, ((mfxF64)m_par.mLaQp - (mfxF64)qpest) / 6.0)); ibits_qp = pow(ibits_qp, 1.013753126)*modelScale; EstRate[qpest] = ibits_qp; } mfxI32 minlaQp = SelectQp(EstRate, targetFrameSize); ltrprintf("Selected LA MinQp %d iDQp %d IQ %d, PQ %d modelScale %lf\n", minlaQp, m_par.iDQp, m_ctx.QuantIDR, m_ctx.QuantP, modelScale); qpMin = minlaQp; mfxI32 curQp = GetCurQP(type, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); qpMin = std::min(qpMin, curQp + 6); ltrprintf("Min QpI %d Schg %d\n", qpMin, ParSceneChange); } if (type == MFX_FRAMETYPE_IDR && frameStruct.LaAvgEncodedSize && ParSceneChange) { mfxF64 dev = 0; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance) { dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(HRDDev) / 2); // upto 50% boost or damp if (HRDDev < 0) dev *= -1; } else { dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(m_ctx.totalDeviation) / 2); // upto 50% boost or damp if (m_ctx.totalDeviation < 0) dev *= -1; } mfxF64 inputBitsPerFrameAdj = (m_par.inputBitsPerFrame * m_par.mLaDepth - dev) / m_par.mLaDepth; mfxI32 laQp = GetLaQpEst(frameStruct.LaAvgEncodedSize, inputBitsPerFrameAdj, frameStruct, true); mfxI32 curPQp = GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); { laQp = std::max(laQp, curPQp - (curPQp / 4)); laQp = std::min(curPQp + 6, laQp); // for quality ltrprintf("Dynamic SChg %d LA Qp %d P Qp %d\n", frameStruct.dispOrder, laQp, curPQp); UpdateQPParams(laQp, MFX_FRAMETYPE_P, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qpMin = m_ctx.QuantIDR; m_ctx.la.SetLaQpUpdateOrder(frameStruct.encOrder, frameStruct.dispOrder); } } } else //if (type == MFX_FRAMETYPE_P) { mfxU16 ltype = MFX_FRAMETYPE_P; mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 hrdMaxFrameSize = m_par.initialDelayInBytes * 8; if (maxFrameSizeHrd > 0) hrdMaxFrameSize = std::min(hrdMaxFrameSize, (mfxF64)maxFrameSizeHrd); mfxF64 bufOccupy = LTR_BUF(ltype, m_par.iDQp, false, ParSceneChange, ParSceneChange, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* hrdMaxFrameSize + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } mfxF64 targetFrameSize = FRM_RATIO(ltype, frameStruct.encOrder, 0, m_par.bPyr) * m_par.inputBitsPerFrame; if (m_par.bPyr && m_par.gopRefDist >= 8) targetFrameSize *= ((ParQpModulation == MFX_QP_MODULATION_HIGH || ParQpModulation == BRC_QP_MODULATION_GOP8_FIXED) ? 2.0 : (( ParQpModulation != MFX_QP_MODULATION_LOW) ? 1.66 : 1.0)); // Aref if (type == MFX_FRAMETYPE_P && ParLongTerm && ParQpDeltaP<0) targetFrameSize *= 1.58; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 dev = -1.0*targetFrameSize - HRDDev; if (dev > 0) targetFrameSize += std::min(targetFrameSize, (dev / 4.0)); } else { mfxF64 dev = -m_ctx.totalDeviation; if (dev > 0) targetFrameSize += std::min(targetFrameSize, (dev / 2.0)); } targetFrameSize = std::min(maxFrameSize, targetFrameSize); qpMin = GetMinQForMaxFrameSize(m_par, targetFrameSize, ltype); // LA P Update if (type == MFX_FRAMETYPE_P && frameStruct.LaAvgEncodedSize && m_par.HRDConformance == MFX_BRC_NO_HRD) { mfxU32 lastLaPBitsAvg = 0; bool LaHasI = isIntra || frameStruct.LaIDist; if (m_ctx.la.LastLaQpCalcHasI == LaHasI) { lastLaPBitsAvg = m_ctx.la.GetLastCalcLaBitsAvg(frameStruct.encOrder); } if (ParSceneChange) { mfxF64 dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(m_ctx.totalDeviation) / 2) * (m_ctx.totalDeviation < 0 ? -1 : 1); // upto 50% boost or damp mfxF64 inputBitsPerFrameAdj = (m_par.inputBitsPerFrame * m_par.mLaDepth - dev) / m_par.mLaDepth; mfxI32 lastLaQp = m_ctx.la.LastLaQpCalc; mfxI32 laQp = GetLaQpEst(frameStruct.LaAvgEncodedSize, inputBitsPerFrameAdj, frameStruct, true); mfxI32 curPQp = GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); mfxI32 diffQp = laQp - (lastLaQp ? lastLaQp : laQp); laQp = curPQp + diffQp; laQp = std::max(laQp, curPQp - (curPQp / 4)); laQp = std::min(curPQp + 6, laQp); // for quality if(laQp != curPQp) { UpdateQPParams(laQp, MFX_FRAMETYPE_P, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qpMin = m_ctx.QuantIDR; if(curPQp != GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) m_ctx.la.SetLaQpUpdateOrder(frameStruct.encOrder, frameStruct.dispOrder); } } else if (m_ctx.la.IsCalcLaQpDist(frameStruct.dispOrder) && lastLaPBitsAvg && frameStruct.LaAvgEncodedSize > 1.33*lastLaPBitsAvg && frameStruct.LaCurEncodedSize > lastLaPBitsAvg) // future Inc { mfxF64 dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(m_ctx.totalDeviation) / 2) * (m_ctx.totalDeviation < 0 ? -1 : 1); mfxF64 inputBitsPerFrameAdj = (m_par.inputBitsPerFrame * m_par.mLaDepth - dev) / m_par.mLaDepth; mfxI32 lastLaQp = m_ctx.la.LastLaQpCalc; mfxI32 laQp = GetLaQpEst(frameStruct.LaAvgEncodedSize, inputBitsPerFrameAdj, frameStruct, true); if (m_ctx.la.IsUpdateLaQpDist(frameStruct.dispOrder)) { mfxF64 devTh = m_par.inputBitsPerFrame * -2.0; mfxI32 curPQp = GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); mfxI32 diffQp = laQp - (lastLaQp ? lastLaQp : laQp); laQp = curPQp + diffQp; laQp = std::max(laQp, curPQp); // inc laQp = std::min(curPQp + (dev < devTh ? 1: 6), laQp); // for quality if(laQp != curPQp) { UpdateQPParams(laQp, MFX_FRAMETYPE_P, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); if(curPQp != GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) m_ctx.la.SetLaQpUpdateOrder(frameStruct.encOrder, frameStruct.dispOrder); } } } else if (m_ctx.la.IsCalcLaQpDist(frameStruct.dispOrder) && lastLaPBitsAvg && lastLaPBitsAvg > 1.33*frameStruct.LaAvgEncodedSize && frameStruct.LaCurEncodedSize < lastLaPBitsAvg) // future dec { mfxF64 dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(m_ctx.totalDeviation) / 2) * (m_ctx.totalDeviation < 0 ? -1 : 1); mfxF64 inputBitsPerFrameAdj = (m_par.inputBitsPerFrame * m_par.mLaDepth - dev) / m_par.mLaDepth; mfxI32 lastLaQp = m_ctx.la.LastLaQpCalc; mfxI32 laQp = GetLaQpEst(frameStruct.LaAvgEncodedSize, inputBitsPerFrameAdj, frameStruct, true); if (m_ctx.la.IsUpdateLaQpDist(frameStruct.dispOrder)) { mfxF64 devTh = m_par.inputBitsPerFrame * 2.0; mfxI32 curPQp = GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); mfxI32 diffQp = laQp - (lastLaQp ? lastLaQp : laQp); laQp = curPQp + diffQp; laQp = std::max(laQp, std::max(curPQp - (curPQp / 4), curPQp - (dev > devTh ? 1: 6))); laQp = std::min(curPQp, laQp); // dec if(laQp != curPQp) { UpdateQPParams(laQp, MFX_FRAMETYPE_P, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); if(curPQp != GetCurQP(MFX_FRAMETYPE_P, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP)) m_ctx.la.SetLaQpUpdateOrder(frameStruct.encOrder, frameStruct.dispOrder); } } } else if (m_ctx.la.IsCalcLaQpDist(frameStruct.dispOrder)) { mfxF64 dev = std::min(m_par.inputBitsPerFrame * m_par.mLaDepth / 2, abs(m_ctx.totalDeviation) / 2) * (m_ctx.totalDeviation < 0 ? -1 : 1); mfxF64 inputBitsPerFrameAdj = (m_par.inputBitsPerFrame * m_par.mLaDepth - dev) / m_par.mLaDepth; GetLaQpEst(frameStruct.LaAvgEncodedSize, inputBitsPerFrameAdj, frameStruct, true); } } } qp = GetCurQP(type, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); // Max Frame Size recode prevention if (qp < qpMin) { if (type != MFX_FRAMETYPE_B) { SetQPParams(qpMin, type, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP, m_par.codecId); qp = GetCurQP(type, frameStruct.pyrLayer, isRef, ParQpModulation, frameStruct.QPDeltaExplicitModulation, ParQpDeltaP); } else { qp = qpMin; } } else qpMin = std::min(qp - (isIntra ? 0 : 1), qpMin); } frameStruct.qp = qp - m_par.quantOffset; //printf("EncOrder %d recode %d type %d ctrl->QpY %d, qp %d PyrLayer %d QpMod %d quantOffset %d // Cmplx %ld LaCurEncodedSize %d LaAvgEncodedSize %d Deviation %f\n", // frameStruct.encOrder, frameStruct.numRecode, type, frameStruct.qp, qp, frameStruct.pyrLayer, ParQpModulation, m_par.quantOffset, // ParFrameCmplx, frameStruct.LaCurEncodedSize, frameStruct.LaAvgEncodedSize, m_ctx.totalDeviation); if (isIntra) { m_ctx.LastIQpSetOrder = frameStruct.encOrder; m_ctx.LastIQpMin = qpMin - m_par.quantOffset; m_ctx.LastIQpSet = frameStruct.qp; m_ctx.LastIQpAct = 0; m_ctx.LastICmplx = ParFrameCmplx; m_ctx.LastIFrameSize = 0; ResetMinQForMaxFrameSize(&m_par, type); } if (frameStruct.LaCurEncodedSize) { m_ctx.la.SaveLaBits(isIntra, frameStruct.LaCurEncodedSize, (mfxU32) m_par.fAbPeriodLA, !frameStruct.numRecode); } pFrameQp->QpY = frameStruct.qp; pFrameQp->NumDeltaQP = 0; // PAQ QpMapNZ & QpMap Average return by Base FillQpMap, other implementations can override these. frameStructItr->QpMapNZ = FillQpMap(*frameStructItr, pFrameQp->QpY, qpMapHint, frameStructItr->QpMapBias); if (frameStructItr->QpMapNZ) { pFrameQp->QpY = mfx::clamp((mfxI32)pFrameQp->QpY + frameStructItr->QpMapBias, 1, 51); // Allow slice Qp to change 1-51 for lambda } return MFX_ERR_NONE; } mfxStatus BRC_EncToolBase::ReportEncResult(mfxU32 dispOrder, mfxEncToolsBRCEncodeResult const & pEncRes) { auto frameStruct = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStruct == m_FrameStruct.end()) { return MFX_ERR_UNDEFINED_BEHAVIOR; // BRC gets encoding results for the frame it hasn't set QP for } (*frameStruct).frameSize = pEncRes.CodedFrameSize; (*frameStruct).qp = pEncRes.QpY; (*frameStruct).numRecode = pEncRes.NumRecodesDone; return MFX_ERR_NONE; } mfxStatus BRC_EncToolBase::SetFrameStruct(mfxU32 dispOrder, mfxEncToolsBRCFrameParams const & pFrameStruct) { auto frameStruct = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStruct == m_FrameStruct.end()) { BRC_FrameStruct frStruct; frStruct.dispOrder = dispOrder; frStruct.frameType = pFrameStruct.FrameType; frStruct.pyrLayer = pFrameStruct.PyramidLayer; frStruct.encOrder = pFrameStruct.EncodeOrder; frStruct.longTerm = pFrameStruct.LongTerm; frStruct.sceneChange = pFrameStruct.SceneChange; frStruct.frameCmplx = pFrameStruct.SpatialComplexity; frStruct.PersistenceMapNZ = pFrameStruct.PersistenceMapNZ; memcpy(frStruct.PersistenceMap, pFrameStruct.PersistenceMap, sizeof(frStruct.PersistenceMap)); m_FrameStruct.push_back(frStruct); frameStruct = m_FrameStruct.end() - 1; } else { (*frameStruct).frameType = pFrameStruct.FrameType; (*frameStruct).pyrLayer = pFrameStruct.PyramidLayer; (*frameStruct).encOrder = pFrameStruct.EncodeOrder; // or check if it's the same, otherwise - error ? (*frameStruct).numRecode++; // ??? check (*frameStruct).longTerm = pFrameStruct.LongTerm; (*frameStruct).sceneChange = pFrameStruct.SceneChange; (*frameStruct).frameCmplx = pFrameStruct.SpatialComplexity; (*frameStruct).PersistenceMapNZ = pFrameStruct.PersistenceMapNZ; memcpy((*frameStruct).PersistenceMap, pFrameStruct.PersistenceMap, sizeof((*frameStruct).PersistenceMap)); } return MFX_ERR_NONE; } mfxStatus BRC_EncToolBase::ReportBufferHints(mfxU32 dispOrder, mfxEncToolsBRCBufferHint const & pBufHints) { auto frameStruct = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStruct == m_FrameStruct.end()) { BRC_FrameStruct frStruct; frStruct.dispOrder = dispOrder; frStruct.LaAvgEncodedSize = pBufHints.AvgEncodedSizeInBits; frStruct.LaCurEncodedSize = pBufHints.CurEncodedSizeInBits; frStruct.LaIDist = pBufHints.DistToNextI; m_FrameStruct.push_back(frStruct); frameStruct = m_FrameStruct.end() - 1; } else { (*frameStruct).LaAvgEncodedSize = pBufHints.AvgEncodedSizeInBits; (*frameStruct).LaCurEncodedSize = pBufHints.CurEncodedSizeInBits; (*frameStruct).LaIDist = pBufHints.DistToNextI; } return MFX_ERR_NONE; } mfxStatus BRC_EncToolBase::ReportGopHints(mfxU32 dispOrder, mfxEncToolsHintPreEncodeGOP const & pGopHints) { auto frameStruct = std::find_if(m_FrameStruct.begin(), m_FrameStruct.end(), CompareByDisplayOrder(dispOrder)); if (frameStruct == m_FrameStruct.end()) { BRC_FrameStruct frStruct; frStruct.dispOrder = dispOrder; frStruct.qpDelta = pGopHints.QPDelta; frStruct.qpModulation = pGopHints.QPModulation; frStruct.QPDeltaExplicitModulation = pGopHints.QPDeltaExplicitModulation; (*frameStruct).miniGopSize = pGopHints.MiniGopSize; m_FrameStruct.push_back(frStruct); frameStruct = m_FrameStruct.end() - 1; } else { (*frameStruct).qpDelta = pGopHints.QPDelta; (*frameStruct).qpModulation = pGopHints.QPModulation; (*frameStruct).QPDeltaExplicitModulation = pGopHints.QPDeltaExplicitModulation; (*frameStruct).miniGopSize = pGopHints.MiniGopSize; } return MFX_ERR_NONE; } void HEVC_HRD::Init(cBRCParams const &par) { m_hrdInput.Init(par); m_prevAuCpbRemovalDelayMinus1 = -1; m_prevAuCpbRemovalDelayMsb = 0; m_prevAuFinalArrivalTime = 0; m_prevBpAuNominalRemovalTime = (mfxU32)m_hrdInput.m_initCpbRemovalDelay; m_prevBpEncOrder = 0; } void HEVC_HRD::Reset(cBRCParams const &par) { sHrdInput hrdInput; hrdInput.Init(par); m_hrdInput.m_bitrate = hrdInput.m_bitrate; m_hrdInput.m_cpbSize90k = hrdInput.m_cpbSize90k; } void HEVC_HRD::Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) { mfxF64 auNominalRemovalTime = 0.0; mfxF64 initCpbRemovalDelay = GetInitCpbRemovalDelay(eo); if (eo > 0) { mfxU32 auCpbRemovalDelayMinus1 = (eo - m_prevBpEncOrder) - 1; // (D-1) mfxU32 auCpbRemovalDelayMsb = 0; if (!bSEI && (eo - m_prevBpEncOrder) != 1) { auCpbRemovalDelayMsb = ((mfxI32)auCpbRemovalDelayMinus1 <= m_prevAuCpbRemovalDelayMinus1) ? m_prevAuCpbRemovalDelayMsb + m_hrdInput.m_maxCpbRemovalDelay : m_prevAuCpbRemovalDelayMsb; } m_prevAuCpbRemovalDelayMsb = auCpbRemovalDelayMsb; m_prevAuCpbRemovalDelayMinus1 = auCpbRemovalDelayMinus1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_hrdInput.m_clockTick * (auCpbRemovalDelayValMinus1 + 1); } else // (C-9) auNominalRemovalTime = m_hrdInput.m_initCpbRemovalDelay; // (C-3) mfxF64 initArrivalTime = m_prevAuFinalArrivalTime; if (!m_hrdInput.m_cbrFlag) { mfxF64 initArrivalEarliestTime = (bSEI) // (C-7) ? auNominalRemovalTime - initCpbRemovalDelay // (C-6) : auNominalRemovalTime - m_hrdInput.m_cpbSize90k; // (C-4) initArrivalTime = std::max(m_prevAuFinalArrivalTime, initArrivalEarliestTime * m_hrdInput.m_bitrate); } // (C-8) mfxF64 auFinalArrivalTime = initArrivalTime + (mfxF64)sizeInbits * 90000; m_prevAuFinalArrivalTime = auFinalArrivalTime; if (bSEI) { m_prevBpAuNominalRemovalTime = auNominalRemovalTime; m_prevBpEncOrder = eo; } } mfxU32 HEVC_HRD::GetInitCpbRemovalDelay(mfxU32 eo) const { mfxF64 auNominalRemovalTime; if (eo > 0) { // (D-1) mfxU32 auCpbRemovalDelayMsb = 0; mfxU32 auCpbRemovalDelayMinus1 = eo - m_prevBpEncOrder - 1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_hrdInput.m_clockTick * (auCpbRemovalDelayValMinus1 + 1); // (C-17) mfxF64 deltaTime90k = auNominalRemovalTime - m_prevAuFinalArrivalTime / m_hrdInput.m_bitrate; return (m_hrdInput.m_cbrFlag // (C-19) ? (mfxU32)(deltaTime90k) // (C-18) : (mfxU32)std::min(deltaTime90k, m_hrdInput.m_cpbSize90k)); } return (mfxU32)m_hrdInput.m_initCpbRemovalDelay; } inline mfxF64 GetTargetDelay(mfxF64 cpbSize90k, mfxF64 initCpbRemovalDelay, bool bVBR) { return bVBR ? std::max(std::min(3.0*cpbSize90k / 4.0, initCpbRemovalDelay), cpbSize90k / 2.0) : std::min(cpbSize90k / 2.0, initCpbRemovalDelay); } mfxF64 HEVC_HRD::GetBufferDeviation(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate; } mfxF64 HEVC_HRD::GetBufferDeviationFactor(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return abs((targetDelay - delay) / targetDelay); } mfxU32 HEVC_HRD::GetMaxFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { return (mfxU32)(GetInitCpbRemovalDelay(eo) / 90000.0*m_hrdInput.m_bitrate); } mfxU32 HEVC_HRD::GetMinFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); if ((!m_hrdInput.m_cbrFlag) || ((delay + m_hrdInput.m_clockTick + 16.0) < m_hrdInput.m_cpbSize90k)) return 0; return (mfxU32)((delay + m_hrdInput.m_clockTick + 16.0 - m_hrdInput.m_cpbSize90k) / 90000.0*m_hrdInput.m_bitrate + 0.99999); } H264_HRD::H264_HRD() : m_trn_cur(0) , m_taf_prv(0) { } void H264_HRD::Init(cBRCParams const &par) { m_hrdInput.Init(par); m_hrdInput.m_clockTick *= (1.0 / 90000.0); m_taf_prv = 0.0; m_trn_cur = m_hrdInput.m_initCpbRemovalDelay / 90000.0; m_trn_cur = GetInitCpbRemovalDelay(0) / 90000.0; } void H264_HRD::Reset(cBRCParams const &par) { sHrdInput hrdInput; hrdInput.Init(par); m_hrdInput.m_bitrate = hrdInput.m_bitrate; m_hrdInput.m_cpbSize90k = hrdInput.m_cpbSize90k; } void H264_HRD::Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) { // const bool interlace = false; //BRC is frame level only mfxU32 initDelay = GetInitCpbRemovalDelay(eo); double tai_earliest = bSEI ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdInput.m_cpbSize90k / 90000.0); double tai_cur = (!m_hrdInput.m_cbrFlag) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; m_taf_prv = tai_cur + (mfxF64)sizeInbits / m_hrdInput.m_bitrate; m_trn_cur += m_hrdInput.m_clockTick; } mfxU32 H264_HRD::GetInitCpbRemovalDelay(mfxU32 /* eo */) const { double delay = std::max(0.0, m_trn_cur - m_taf_prv); mfxU32 initialCpbRemovalDelay = mfxU32(90000 * delay + 0.5); return (mfxU32)(initialCpbRemovalDelay == 0 ? 1 // should not be equal to 0 : initialCpbRemovalDelay > m_hrdInput.m_cpbSize90k && (!m_hrdInput.m_cbrFlag) ? m_hrdInput.m_cpbSize90k // should not exceed hrd buffer : initialCpbRemovalDelay); } mfxF64 H264_HRD::GetBufferDeviation(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); //printf("%d) GetBufferDeviation %f (%d, target %d)\n", eo, (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate, delay, (int)targetDelay); return (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate; } mfxF64 H264_HRD::GetBufferDeviationFactor(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return abs((targetDelay - delay) / targetDelay); } mfxU32 H264_HRD::GetInitCpbRemovalDelayOffset(mfxU32 eo) const { // init_cpb_removal_delay + init_cpb_removal_delay_offset should be constant return mfxU32(m_hrdInput.m_cpbSize90k - GetInitCpbRemovalDelay(eo)); } mfxU32 H264_HRD::GetMinFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); if ((!m_hrdInput.m_cbrFlag) || ((delay + m_hrdInput.m_clockTick * 90000) < m_hrdInput.m_cpbSize90k)) return 0; return (mfxU32)((delay + m_hrdInput.m_clockTick*90000.0 - m_hrdInput.m_cpbSize90k) / 90000.0*m_hrdInput.m_bitrate) + 16; } mfxU32 H264_HRD::GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const { mfxU32 initDelay = GetInitCpbRemovalDelay(eo); double tai_earliest = (bSEI) ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdInput.m_cpbSize90k / 90000.0); double tai_cur = (!m_hrdInput.m_cbrFlag) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; mfxU32 maxFrameSize = (mfxU32)((m_trn_cur - tai_cur)*m_hrdInput.m_bitrate); return maxFrameSize; } void sHrdInput::Init(cBRCParams par) { m_cbrFlag = (par.rateControlMethod == MFX_RATECONTROL_CBR); m_bitrate = par.maxbps; m_maxCpbRemovalDelay = 1 << (h264_h265_au_cpb_removal_delay_length_minus1 + 1); m_clockTick = 90000. / par.frameRate; m_cpbSize90k = mfxU32(90000. * par.bufferSizeInBytes*8.0 / m_bitrate); m_initCpbRemovalDelay = 90000. * 8. * par.initialDelayInBytes / m_bitrate; } mfxU16 BRC_EncTool::FillQpMap(const BRC_FrameStruct& frameStruct, mfxU32 frameQp, mfxEncToolsHintQPMap* qpMapHint, mfxI16& qpMapBias) { const auto type = GetFrameType(frameStruct.frameType, frameStruct.pyrLayer, m_par.gopRefDist, m_par.codecId); const mfxU16 isIntra = frameStruct.frameType & (MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I); mfxI8 QpMap[MFX_ENCTOOLS_PREENC_MAP_SIZE] = {}; mfxU16 QpMapNZ = 0; qpMapBias= 0; // PAQ if (m_par.mMBBRC && frameStruct.PersistenceMapNZ) { if (type != MFX_FRAMETYPE_B && (isIntra || frameStruct.dispOrder >= m_ctx.la.LastMBQpSetDispOrder + MBQP_P_UPDATE_DIST || (frameStruct.numRecode && frameStruct.QpMapNZ))) { // delta QP table mfxI32 qp_y = (mfxI32) frameQp; mfxI32 qp_d = 2; if (qp_y > 30) qp_d = 6; else if (qp_y > 25) qp_d = 5; else if (qp_y > 20) qp_d = 4; else if (qp_y > 15) qp_d = 3; mfxU16 count = 0; for (mfxU32 i = 0; i < MFX_ENCTOOLS_PREENC_MAP_SIZE; i++) { QpMap[i] = (mfxI8) (-1 * std::min(qp_d, (frameStruct.PersistenceMap[i] + 1) / 3)); qpMapBias += QpMap[i]; if (QpMap[i]) count++; } QpMapNZ = count; qpMapBias = qpMapBias / MFX_ENCTOOLS_PREENC_MAP_SIZE; // Avg } } if (qpMapHint && qpMapHint->ExtQpMap.QP) { qpMapHint->QpMapFilled = QpMapNZ; if (qpMapHint->QpMapFilled) { mfxU32 iw = 16; mfxU32 ih = 8; mfxU32 ibw = m_par.cropWidth / iw; mfxU32 ibh = m_par.cropHeight / ih; mfxU32 mapBw = qpMapHint->ExtQpMap.BlockSize; mfxU32 mapBh = qpMapHint->ExtQpMap.BlockSize; mfxU32 wInBlk = qpMapHint->QpMapPitch; mfxU32 hInBlk = qpMapHint->ExtQpMap.NumQPAlloc/ wInBlk; mfxU16 count = 0; mfxI32 minQp = 1; mfxI32 maxQp = 51; if (type == MFX_FRAMETYPE_IDR || type == MFX_FRAMETYPE_I) { minQp = m_par.quantMinI; maxQp = m_par.quantMaxI; } else if (type == MFX_FRAMETYPE_P) { minQp = m_par.quantMinP; maxQp = m_par.quantMaxP; } else { minQp = m_par.quantMinB; maxQp = m_par.quantMaxB; } // Map 16x8 map to Width/blSize x Height/blSize for (mfxU32 i = 0; i < hInBlk; i++) { for (mfxU32 j = 0; j < wInBlk; j++) { // (x,y) is QP lookup location in 16x8 map for pixel center of current block (j,i) mfxU32 y = std::min((i * mapBh + mapBh / 2) / ibh, ih - 1); mfxU32 x = std::min((j * mapBw + mapBw / 2) / ibw, iw - 1); qpMapHint->ExtQpMap.QP[i * wInBlk + j] = mfxI8( mfx::clamp((mfxI32)frameQp + (mfxI32)QpMap[y * iw + x], minQp, maxQp) ); if (qpMapHint->ExtQpMap.QP[i * wInBlk + j] != frameQp) count++; } } QpMapNZ = count; qpMapHint->QpMapFilled = count; if(qpMapHint->QpMapFilled) m_ctx.la.LastMBQpSetDispOrder = frameStruct.dispOrder; } } return QpMapNZ; } } //namespace EncToolsBRC mfxStatus ExtBRC::GetFrameCtrl(mfxBRCFrameParam* frame_par, mfxBRCFrameCtrl* ctrl) { mfxEncToolsTaskParam par; par.DisplayOrder = frame_par->DisplayOrder; std::vector extParams; mfxEncToolsBRCFrameParams extFrameStruct; extFrameStruct.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM ; extFrameStruct.Header.BufferSz = sizeof(extFrameStruct); extFrameStruct.EncodeOrder = frame_par->EncodedOrder; extFrameStruct.FrameType = frame_par->FrameType; extFrameStruct.PyramidLayer = frame_par->PyramidLayer; extFrameStruct.LongTerm = frame_par->LongTerm; extParams.push_back((mfxExtBuffer *)&extFrameStruct); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); mfxStatus sts; sts = Submit(&par); MFX_CHECK_STS(sts); extParams.clear(); mfxEncToolsBRCQuantControl extFrameQP; extFrameQP.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL; extFrameQP.Header.BufferSz = sizeof(extFrameQP); extParams.push_back((mfxExtBuffer *)&extFrameQP); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); sts = Query(&par, 5000); MFX_CHECK_STS(sts); ctrl->QpY = extFrameQP.QpY; return sts; } mfxStatus ExtBRC::Update(mfxBRCFrameParam* frame_par, mfxBRCFrameCtrl* frame_ctrl, mfxBRCFrameStatus* status) { mfxEncToolsTaskParam par; par.DisplayOrder = frame_par->DisplayOrder; std::vector extParams; mfxEncToolsBRCEncodeResult extEncRes; extEncRes.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT; extEncRes.Header.BufferSz = sizeof(extEncRes); extEncRes.CodedFrameSize = frame_par->CodedFrameSize; extEncRes.QpY = (mfxU16)frame_ctrl->QpY; extEncRes.NumRecodesDone = frame_par->NumRecode; extParams.push_back((mfxExtBuffer *)&extEncRes); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); mfxStatus sts; sts = Submit(&par); MFX_CHECK_STS(sts); extParams.clear(); mfxEncToolsBRCStatus extSts; extSts.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_STATUS; extSts.Header.BufferSz = sizeof(extSts); extSts.FrameStatus = *status; extParams.push_back((mfxExtBuffer *)&extSts); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); sts = Query(&par, 5000); return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_common.cpp000066400000000000000000001236231443134507600301350ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enctools.h" #include "mfx_enctools_brc.h" #include #include #include "mfx_loader_utils.h" constexpr mfxU32 ENC_TOOLS_WAIT_INTERVAL = 300000; mfxStatus InitCtrl(mfxVideoParam const & par, mfxEncToolsCtrl *ctrl) { MFX_CHECK_NULL_PTR1(ctrl); mfxExtCodingOption *CO = (mfxExtCodingOption *)Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION); mfxExtCodingOption2 *CO2 = (mfxExtCodingOption2 *)Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); mfxExtCodingOption3 *CO3 = (mfxExtCodingOption3 *)Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); MFX_CHECK_NULL_PTR3(CO, CO2, CO3); mfxExtCodingOptionDDI* extDdi = (mfxExtCodingOptionDDI*)Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_DDI); MFX_CHECK_NULL_PTR1(extDdi); *ctrl = {}; ctrl->CodecId = par.mfx.CodecId; ctrl->CodecProfile = par.mfx.CodecProfile; ctrl->CodecLevel = par.mfx.CodecLevel; ctrl->LowPower = par.mfx.LowPower; ctrl->AsyncDepth = par.AsyncDepth; ctrl->FrameInfo = par.mfx.FrameInfo; ctrl->IOPattern = par.IOPattern; ctrl->MaxDelayInFrames = CO2->LookAheadDepth; ctrl->NumRefP = std::min(par.mfx.NumRefFrame, extDdi->NumActiveRefP); ctrl->MaxGopSize = par.mfx.GopPicSize; ctrl->MaxGopRefDist = par.mfx.GopRefDist; ctrl->MaxIDRDist = par.mfx.GopPicSize * (par.mfx.IdrInterval + !!(ctrl->CodecId == MFX_CODEC_AVC)); // For !AVC IdrInterval 0 defaults to CRA if (par.mfx.IdrInterval == 0 && ctrl->CodecId != MFX_CODEC_AVC && par.mfx.GopPicSize != 0) { ctrl->MaxIDRDist = par.mfx.GopPicSize * (UINT_MAX / par.mfx.GopPicSize); } ctrl->BRefType = CO2->BRefType; ctrl->ScenarioInfo = CO3->ScenarioInfo; ctrl->GopOptFlag = (mfxU8)par.mfx.GopOptFlag; // Rate control info mfxU32 mult = par.mfx.BRCParamMultiplier ? par.mfx.BRCParamMultiplier : 1; bool BRC = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR); ctrl->RateControlMethod = par.mfx.RateControlMethod; //CBR, VBR, CRF,CQP if (!BRC) { ctrl->QPLevel[0] = par.mfx.QPI; ctrl->QPLevel[1] = par.mfx.QPP; ctrl->QPLevel[2] = par.mfx.QPB; } else { ctrl->TargetKbps = par.mfx.TargetKbps*mult; ctrl->MaxKbps = par.mfx.MaxKbps*mult; ctrl->HRDConformance = MFX_BRC_NO_HRD; if (!IsOff(CO->NalHrdConformance) && !IsOff(CO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_STRONG; else if (IsOn(CO->NalHrdConformance) && IsOff(CO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_WEAK; ctrl->BufferSizeInKB = par.mfx.BufferSizeInKB*mult; //Bitstream size if (ctrl->HRDConformance) { ctrl->InitialDelayInKB = par.mfx.InitialDelayInKB*mult; //if HRDConformance is ON } else { ctrl->ConvergencePeriod = 0; //if HRDConformance is OFF, 0 - the period is whole stream, ctrl->Accuracy = 10; //if HRDConformance is OFF } ctrl->WinBRCMaxAvgKbps = CO3->WinBRCMaxAvgKbps*mult; ctrl->WinBRCSize = CO3->WinBRCSize; ctrl->MaxFrameSizeInBytes[0] = CO3->MaxFrameSizeI ? CO3->MaxFrameSizeI : CO2->MaxFrameSize; // MaxFrameSize limitation ctrl->MaxFrameSizeInBytes[1] = CO3->MaxFrameSizeP ? CO3->MaxFrameSizeP : CO2->MaxFrameSize; ctrl->MaxFrameSizeInBytes[2] = CO2->MaxFrameSize; ctrl->MinQPLevel[0] = CO2->MinQPI; //QP range limitations ctrl->MinQPLevel[1] = CO2->MinQPP; ctrl->MinQPLevel[2] = CO2->MinQPB; ctrl->MaxQPLevel[0] = CO2->MaxQPI; //QP range limitations ctrl->MaxQPLevel[1] = CO2->MaxQPP; ctrl->MaxQPLevel[2] = CO2->MaxQPB; ctrl->PanicMode = CO3->BRCPanicMode; } if (ctrl->NumExtParam > 1) { ctrl->ExtParam[0] = Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_DEVICE); ctrl->ExtParam[1] = Et_GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_ALLOCATOR); } // LaScale here ctrl->LaScale = 0; ctrl->LaQp = 30; if (ctrl->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; if (crW >= 720) ctrl->LaScale = 2; } else { mfxU16 crH = par.mfx.FrameInfo.CropH ? par.mfx.FrameInfo.CropH : par.mfx.FrameInfo.Height; mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; mfxU16 maxDim = std::max(crH, crW); if (maxDim >= 720) { ctrl->LaScale = 2; } ctrl->LaQp = 26; } return MFX_ERR_NONE; } inline void SetToolsStatus(mfxExtEncToolsConfig* conf, bool bOn) { conf->SceneChange = conf->AdaptiveI = conf->AdaptiveB = conf->AdaptiveRefP = conf->AdaptiveRefB = conf->AdaptiveLTR = conf->AdaptivePyramidQuantP = conf->AdaptivePyramidQuantB = conf->AdaptiveQuantMatrices = conf->BRCBufferHints = conf->AdaptiveMBQP = conf->BRC = conf->SaliencyMapHint = mfxU16(bOn ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF); } inline void CopyPreEncSCTools(mfxExtEncToolsConfig const & confIn, mfxExtEncToolsConfig* confOut) { confOut->AdaptiveI = confIn.AdaptiveI; confOut->AdaptiveB = confIn.AdaptiveB; confOut->AdaptiveRefP = confIn.AdaptiveRefP; confOut->AdaptiveRefB = confIn.AdaptiveRefB; confOut->AdaptiveLTR = confIn.AdaptiveLTR; confOut->AdaptivePyramidQuantP = confIn.AdaptivePyramidQuantP; confOut->AdaptivePyramidQuantB = confIn.AdaptivePyramidQuantB; } inline void OffPreEncSCDTools(mfxExtEncToolsConfig* conf) { mfxExtEncToolsConfig confIn = {}; SetToolsStatus(&confIn, false); CopyPreEncSCTools(confIn, conf); } inline void CopyPreEncLATools(mfxExtEncToolsConfig const & confIn, mfxExtEncToolsConfig* confOut) { confOut->AdaptiveQuantMatrices = confIn.AdaptiveQuantMatrices; confOut->BRCBufferHints = confIn.BRCBufferHints; confOut->AdaptivePyramidQuantP = confIn.AdaptivePyramidQuantP; confOut->AdaptivePyramidQuantB = confIn.AdaptivePyramidQuantB; confOut->AdaptiveI = confIn.AdaptiveI; confOut->AdaptiveB = confIn.AdaptiveB; confOut->AdaptiveMBQP = confIn.AdaptiveMBQP; } inline void OffPreEncLATools(mfxExtEncToolsConfig* conf) { mfxExtEncToolsConfig confIn = {}; SetToolsStatus(&confIn, false); CopyPreEncLATools(confIn, conf); } inline bool isPreEncSCD(mfxExtEncToolsConfig const & conf, mfxEncToolsCtrl const & ctrl) { return ((IsOn(conf.AdaptiveI) || IsOn(conf.AdaptiveB) || IsOn(conf.AdaptiveRefP) || IsOn(conf.AdaptiveRefB) || IsOn(conf.AdaptiveLTR) || IsOn(conf.AdaptivePyramidQuantP) || IsOn(conf.AdaptivePyramidQuantB) || IsOn(conf.AdaptiveMBQP)) && ctrl.ScenarioInfo != MFX_SCENARIO_GAME_STREAMING); } inline bool isPreEncLA(mfxExtEncToolsConfig const & conf, mfxEncToolsCtrl const & ctrl) { return ((IsOn(conf.BRCBufferHints) && IsOn(conf.BRC)) || (ctrl.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING && (IsOn(conf.AdaptiveI) || IsOn(conf.AdaptiveB) || IsOn(conf.AdaptiveQuantMatrices) || IsOn(conf.BRCBufferHints) || IsOn(conf.AdaptivePyramidQuantP) || IsOn(conf.AdaptivePyramidQuantB) || IsOn(conf.AdaptiveMBQP)))); } EncTools::EncTools(void* rtmodule, void* etmodule) : m_bVPPInit(false) , m_bInit(false) , m_brc(new EncToolsBRC::BRC_EncTool()) , m_lpLookAhead(rtmodule) , m_config() , m_ctrl() , m_device(0) , m_deviceType(0) , m_pAllocator(nullptr) , m_pETAllocator(nullptr) , m_pmfxAllocatorParams(nullptr) , m_mfxSession_LA(nullptr) , m_mfxSession_SCD(rtmodule) , m_mfxVppParams_LA() , m_mfxVppParams_AEnc() , m_VppResponse() , m_IntSurfaces_SCD() , m_hRTModule(rtmodule) { m_etModule = etmodule; } mfxStatus EncTools::GetSupportedConfig(mfxExtEncToolsConfig* config, mfxEncToolsCtrl const * ctrl) { MFX_CHECK_NULL_PTR2(config, ctrl); SetToolsStatus(config, false); if (ctrl->ScenarioInfo != MFX_SCENARIO_GAME_STREAMING) { config->BRC = (mfxU16)((ctrl->RateControlMethod == MFX_RATECONTROL_CBR || ctrl->RateControlMethod == MFX_RATECONTROL_VBR) ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF); if (ctrl->MaxGopRefDist == 16 || ctrl->MaxGopRefDist == 8 || ctrl->MaxGopRefDist == 4 || ctrl->MaxGopRefDist == 2 || ctrl->MaxGopRefDist == 1) { config->SceneChange = MFX_CODINGOPTION_ON; config->AdaptiveI = MFX_CODINGOPTION_ON; config->AdaptiveB = MFX_CODINGOPTION_ON; config->AdaptiveRefP = MFX_CODINGOPTION_ON; config->AdaptiveRefB = MFX_CODINGOPTION_ON; config->AdaptiveLTR = MFX_CODINGOPTION_ON; config->AdaptivePyramidQuantP = MFX_CODINGOPTION_ON; config->AdaptivePyramidQuantB = MFX_CODINGOPTION_ON; config->AdaptiveMBQP = MFX_CODINGOPTION_ON; config->AdaptiveQuantMatrices = MFX_CODINGOPTION_ON; if (ctrl->MaxDelayInFrames > ctrl->MaxGopRefDist && IsOn(config->BRC)) config->BRCBufferHints = MFX_CODINGOPTION_ON; } } #if defined (MFX_ENABLE_ENCTOOLS_LPLA) else { config->AdaptiveQuantMatrices = MFX_CODINGOPTION_ON; config->BRCBufferHints = MFX_CODINGOPTION_ON; config->SceneChange = MFX_CODINGOPTION_ON; config->AdaptivePyramidQuantP = MFX_CODINGOPTION_ON; config->AdaptiveI = MFX_CODINGOPTION_ON; config->AdaptiveB = MFX_CODINGOPTION_ON; config->AdaptivePyramidQuantB = MFX_CODINGOPTION_ON; } #endif return MFX_ERR_NONE; } mfxStatus EncTools::GetActiveConfig(mfxExtEncToolsConfig* pConfig) { MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pConfig); *pConfig = m_config; return MFX_ERR_NONE; } mfxStatus EncTools::GetDelayInFrames(mfxExtEncToolsConfig const * config, mfxEncToolsCtrl const * ctrl, mfxU32 *numFrames) { MFX_CHECK_NULL_PTR3(config, ctrl, numFrames); *numFrames = (isPreEncSCD(*config, *ctrl)) ? ctrl->MaxGopRefDist : 0; // MaxMiniGOP delay needed if (isPreEncLA(*config, *ctrl)) { *numFrames = std::max(*numFrames, (mfxU32)ctrl->MaxDelayInFrames); } return MFX_ERR_NONE; } mfxStatus EncTools::InitVPPSession(MFXDLVideoSession* pmfxSession) { MFX_CHECK_NULL_PTR1(pmfxSession); mfxStatus sts; if (mfxSession(*pmfxSession) == 0) { mfxInitParam initPar = {}; initPar.Version.Major = 1; initPar.Version.Minor = 0; initPar.Implementation = MFX_IMPL_HARDWARE; initPar.Implementation |= (m_deviceType == MFX_HANDLE_D3D11_DEVICE ? MFX_IMPL_VIA_D3D11 : (m_deviceType == MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 ? MFX_IMPL_VIA_D3D9 : MFX_IMPL_VIA_VAAPI)); initPar.GPUCopy = MFX_GPUCOPY_DEFAULT; sts = pmfxSession->InitEx(initPar); MFX_CHECK_STS(sts); } sts = pmfxSession->SetFrameAllocator(m_pAllocator); MFX_CHECK_STS(sts); sts = pmfxSession->SetHandle((mfxHandleType)m_deviceType, m_device); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } inline bool VPPParamsChanged(mfxVideoParam & prev, mfxVideoParam & cur) { bool changed = ((prev.vpp.In.CropW != cur.vpp.In.CropW) || (prev.vpp.In.CropH != cur.vpp.In.CropH) || (prev.vpp.In.Width != cur.vpp.In.Width) || (prev.vpp.In.Height != cur.vpp.In.Height)); changed = changed || ((prev.vpp.Out.CropW != cur.vpp.Out.CropW) || (prev.vpp.Out.CropH != cur.vpp.Out.CropH) || (prev.vpp.Out.Width != cur.vpp.Out.Width) || (prev.vpp.Out.Height != cur.vpp.Out.Height)); return changed; } mfxStatus EncTools::ResetVPP(mfxEncToolsCtrl const& ctrl) { MFX_CHECK(m_bVPPInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(m_device && m_pAllocator, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = MFX_ERR_NONE; // Init sessions if (isPreEncSCD(m_config, ctrl) && !m_mfxSession_SCD) { sts = InitVPPSession(&m_mfxSession_SCD); MFX_CHECK_STS(sts); } //common LA and SCD mfxVideoParam prev_mfxVppParams_LA = m_mfxVppParams_LA; mfxVideoParam prev_mfxVppParams_AEnc = m_mfxVppParams_AEnc; sts = InitMfxVppParams(ctrl); MFX_CHECK_STS(sts); if (isPreEncLA(m_config, ctrl)) { bool toInit = true; if (!m_pmfxVPP_LA) { if (!m_mfxSession_LA) { m_mfxSession_LA = m_lpLookAhead.GetEncSession(); MFX_CHECK(m_mfxSession_LA != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); } m_pmfxVPP_LA.reset(new MFXDLVideoVPP(*m_mfxSession_LA, m_hRTModule)); MFX_CHECK(m_pmfxVPP_LA, MFX_ERR_MEMORY_ALLOC); } else { if (VPPParamsChanged(prev_mfxVppParams_LA, m_mfxVppParams_LA)) { m_pmfxVPP_LA->Close(); m_pAllocator->Free(m_pAllocator->pthis, &m_VppResponse); if (!m_pIntSurfaces_LA.empty()) m_pIntSurfaces_LA.clear(); } else toInit = false; } if (toInit) { mfxExtVPPScaling vppScalingMode = {}; vppScalingMode.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; vppScalingMode.Header.BufferSz = sizeof(vppScalingMode); vppScalingMode.ScalingMode = MFX_SCALING_MODE_LOWPOWER; vppScalingMode.InterpolationMethod = MFX_INTERPOLATION_NEAREST_NEIGHBOR; std::vector extParams; extParams.push_back(&vppScalingMode.Header); m_mfxVppParams_LA.ExtParam = extParams.data(); m_mfxVppParams_LA.NumExtParam = (mfxU16)extParams.size(); sts = m_pmfxVPP_LA->Init(&m_mfxVppParams_LA); m_mfxVppParams_LA.ExtParam = nullptr; m_mfxVppParams_LA.NumExtParam = 0; MFX_CHECK_STS(sts); } //memory allocation for LA mfxFrameAllocRequest VppRequest[2]{}; sts = m_pmfxVPP_LA->QueryIOSurf(&m_mfxVppParams_LA, VppRequest); MFX_CHECK_STS(sts); if (VppRequest->NumFrameSuggested > m_pIntSurfaces_LA.size()) { if (!m_pIntSurfaces_LA.empty()) { m_pIntSurfaces_LA.clear(); m_pAllocator->Free(m_pAllocator->pthis, &m_VppResponse); } sts = m_pAllocator->Alloc(m_pAllocator->pthis, &(VppRequest[1]), &m_VppResponse); MFX_CHECK_STS(sts); m_pIntSurfaces_LA.resize(m_VppResponse.NumFrameActual); for (mfxU32 i = 0; i < (mfxU32)m_pIntSurfaces_LA.size(); i++) { m_pIntSurfaces_LA[i] = {}; m_pIntSurfaces_LA[i].Info = m_mfxVppParams_LA.vpp.Out; m_pIntSurfaces_LA[i].Data.MemId = m_VppResponse.mids[i]; } } } //SCD VPP if (isPreEncSCD(m_config, ctrl)) { bool toInit = true; if (!m_pmfxVPP_SCD) { m_pmfxVPP_SCD.reset(new MFXDLVideoVPP(m_mfxSession_SCD, m_hRTModule)); MFX_CHECK(m_pmfxVPP_SCD, MFX_ERR_MEMORY_ALLOC); } else { if (VPPParamsChanged(prev_mfxVppParams_AEnc, m_mfxVppParams_AEnc)) { m_pmfxVPP_SCD->Close(); if (m_mfxVppParams_AEnc.vpp.Out.Width * m_mfxVppParams_AEnc.vpp.Out.Height > prev_mfxVppParams_AEnc.vpp.Out.Width * prev_mfxVppParams_AEnc.vpp.Out.Height) { if (m_IntSurfaces_SCD.Data.Y) delete[] m_IntSurfaces_SCD.Data.Y; //memory allocation for SCD m_IntSurfaces_SCD.Data.Y = new mfxU8[m_mfxVppParams_AEnc.vpp.Out.Width * m_mfxVppParams_AEnc.vpp.Out.Height * 3 / 2]; } } else toInit = false; } if (toInit) { sts = m_pmfxVPP_SCD->Init(&m_mfxVppParams_AEnc); MFX_CHECK_STS(sts); m_IntSurfaces_SCD.Info = m_mfxVppParams_AEnc.vpp.Out; m_IntSurfaces_SCD.Data.UV = m_IntSurfaces_SCD.Data.Y + m_IntSurfaces_SCD.Info.Width * m_IntSurfaces_SCD.Info.Height; m_IntSurfaces_SCD.Data.Pitch = m_IntSurfaces_SCD.Info.Width; } } return sts; } mfxStatus EncTools::InitVPP(mfxEncToolsCtrl const& ctrl) { MFX_CHECK(!m_bVPPInit, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_device && m_pAllocator, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts; // Init sessions if (isPreEncSCD(m_config, ctrl)) { sts = InitVPPSession(&m_mfxSession_SCD); MFX_CHECK_STS(sts); } //common LA and SCD sts = InitMfxVppParams(ctrl); MFX_CHECK_STS(sts); //LA VPP if (isPreEncLA(m_config, ctrl)) { m_mfxSession_LA = m_lpLookAhead.GetEncSession(); MFX_CHECK(m_mfxSession_LA != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); m_pmfxVPP_LA.reset(new MFXDLVideoVPP(*m_mfxSession_LA, m_hRTModule)); MFX_CHECK(m_pmfxVPP_LA, MFX_ERR_MEMORY_ALLOC); mfxExtVPPScaling vppScalingMode = {}; vppScalingMode.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; vppScalingMode.Header.BufferSz = sizeof(vppScalingMode); vppScalingMode.ScalingMode = MFX_SCALING_MODE_LOWPOWER; vppScalingMode.InterpolationMethod = MFX_INTERPOLATION_NEAREST_NEIGHBOR; std::vector extParams; extParams.push_back(&vppScalingMode.Header); m_mfxVppParams_LA.ExtParam = extParams.data(); m_mfxVppParams_LA.NumExtParam = (mfxU16)extParams.size(); sts = m_pmfxVPP_LA->Init(&m_mfxVppParams_LA); m_mfxVppParams_LA.ExtParam = nullptr; m_mfxVppParams_LA.NumExtParam = 0; MFX_CHECK_STS(sts); //memory allocation for LA mfxFrameAllocRequest VppRequest[2]{}; sts = m_pmfxVPP_LA->QueryIOSurf(&m_mfxVppParams_LA, VppRequest); MFX_CHECK_STS(sts); sts = m_pAllocator->Alloc(m_pAllocator->pthis, &(VppRequest[1]), &m_VppResponse); if(sts == MFX_ERR_UNSUPPORTED){ //workaround for external allocator, if allocator refused allocation request, then //try to request decoder pool VppRequest[1].Type |= MFX_MEMTYPE_FROM_DECODE; sts = m_pAllocator->Alloc(m_pAllocator->pthis, &(VppRequest[1]), &m_VppResponse); } MFX_CHECK_STS(sts); m_pIntSurfaces_LA.resize(m_VppResponse.NumFrameActual); for (mfxU32 i = 0; i < (mfxU32)m_pIntSurfaces_LA.size(); i++) { m_pIntSurfaces_LA[i] = {}; m_pIntSurfaces_LA[i].Info = m_mfxVppParams_LA.vpp.Out; m_pIntSurfaces_LA[i].Data.MemId = m_VppResponse.mids[i]; } } //SCD VPP if (isPreEncSCD(m_config, ctrl)) { m_pmfxVPP_SCD.reset(new MFXDLVideoVPP(m_mfxSession_SCD, m_hRTModule)); MFX_CHECK(m_pmfxVPP_SCD, MFX_ERR_MEMORY_ALLOC); sts = m_pmfxVPP_SCD->Init(&m_mfxVppParams_AEnc); //memory allocation for SCD m_IntSurfaces_SCD = {}; m_IntSurfaces_SCD.Info = m_mfxVppParams_AEnc.vpp.Out; m_IntSurfaces_SCD.Data.Y = new mfxU8[m_IntSurfaces_SCD.Info.Width * m_IntSurfaces_SCD.Info.Height * 3 / 2]; m_IntSurfaces_SCD.Data.UV = m_IntSurfaces_SCD.Data.Y + m_IntSurfaces_SCD.Info.Width * m_IntSurfaces_SCD.Info.Height; m_IntSurfaces_SCD.Data.Pitch = m_IntSurfaces_SCD.Info.Width; } m_bVPPInit = true; return MFX_ERR_NONE; } mfxStatus EncTools::InitMfxVppParams(mfxEncToolsCtrl const & ctrl) { //common for LA and SCD mfxVideoParam mfxVppParams_Common{}; mfxVppParams_Common.vpp.In = ctrl.FrameInfo; mfxVppParams_Common.vpp.Out = mfxVppParams_Common.vpp.In; if (!mfxVppParams_Common.vpp.In.CropW) mfxVppParams_Common.vpp.In.CropW = mfxVppParams_Common.vpp.In.Width; if (!mfxVppParams_Common.vpp.In.CropH) mfxVppParams_Common.vpp.In.CropH = mfxVppParams_Common.vpp.In.Height; if(ctrl.ScenarioInfo != MFX_SCENARIO_GAME_STREAMING && mfxVppParams_Common.vpp.Out.BitDepthLuma == 10){ mfxVppParams_Common.vpp.Out.FourCC = MFX_FOURCC_NV12; mfxVppParams_Common.vpp.Out.ChromaFormat = MFX_CHROMAFORMAT_YUV420; mfxVppParams_Common.vpp.Out.BitDepthLuma = 8; mfxVppParams_Common.vpp.Out.BitDepthChroma = 8; mfxVppParams_Common.vpp.Out.Shift = 0; } MFXDLVideoSession* pSession = nullptr; if (isPreEncSCD(m_config, ctrl)) pSession = &m_mfxSession_SCD; else if (isPreEncLA(m_config, ctrl)) pSession = m_lpLookAhead.GetEncSession(); MFX_CHECK(pSession != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); //LA if (isPreEncLA(m_config, ctrl)) { m_mfxVppParams_LA = mfxVppParams_Common; mfxU32 ignore = 0; m_lpLookAhead.GetDownScaleParams(m_mfxVppParams_LA.vpp.Out, ignore); m_mfxVppParams_LA.IOPattern = ctrl.IOPattern | MFX_IOPATTERN_OUT_VIDEO_MEMORY; } //SCD if (isPreEncSCD(m_config, ctrl)) { m_mfxVppParams_AEnc = mfxVppParams_Common; mfxFrameInfo frameInfo; mfxStatus sts = m_scd.GetInputFrameInfo(frameInfo); MFX_CHECK_STS(sts); m_mfxVppParams_AEnc.vpp.Out.Width = frameInfo.Width; m_mfxVppParams_AEnc.vpp.Out.Height = frameInfo.Height; m_mfxVppParams_AEnc.vpp.Out.CropW = m_mfxVppParams_AEnc.vpp.Out.Width; m_mfxVppParams_AEnc.vpp.Out.CropH = m_mfxVppParams_AEnc.vpp.Out.Height; m_mfxVppParams_AEnc.IOPattern = ctrl.IOPattern | MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } return MFX_ERR_NONE; } mfxStatus EncTools::CloseVPP() { MFX_CHECK(m_bVPPInit, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = MFX_ERR_NONE; if (m_pAllocator) { if(m_VppResponse.mids && m_VppResponse.NumFrameActual != 0) { m_pAllocator->Free(m_pAllocator->pthis, &m_VppResponse); m_pAllocator = nullptr; } } if (m_pIntSurfaces_LA.size()) m_pIntSurfaces_LA.clear(); if (m_pmfxVPP_LA) { m_pmfxVPP_LA->Close(); m_pmfxVPP_LA.reset(); } m_mfxSession_LA = nullptr; if (m_IntSurfaces_SCD.Data.Y) { delete[] m_IntSurfaces_SCD.Data.Y; m_IntSurfaces_SCD = {}; } if (m_pmfxVPP_SCD) { m_pmfxVPP_SCD->Close(); m_pmfxVPP_SCD.reset(); } if (m_mfxSession_SCD) { sts = m_mfxSession_SCD.Close(); MFX_CHECK_STS(sts); } m_bVPPInit = false; return sts; } mfxStatus EncTools::GetDeviceAllocator(mfxEncToolsCtrl const* ctrl) { mfxStatus sts = MFX_ERR_NONE; mfxEncToolsCtrlExtDevice* extDevice = (mfxEncToolsCtrlExtDevice*)Et_GetExtBuffer(ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_ENCTOOLS_DEVICE); if (extDevice) { m_device = extDevice->DeviceHdl; m_deviceType = extDevice->HdlType; } if (!m_device) return MFX_ERR_UNDEFINED_BEHAVIOR; mfxEncToolsCtrlExtAllocator* extAlloc = (mfxEncToolsCtrlExtAllocator*)Et_GetExtBuffer(ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_ENCTOOLS_ALLOCATOR); if (extAlloc) m_pAllocator = extAlloc->pAllocator; if (!m_pAllocator) { if (m_deviceType == MFX_HANDLE_VA_DISPLAY) { m_pETAllocator = new vaapiFrameAllocator; MFX_CHECK_NULL_PTR1(m_pETAllocator); vaapiAllocatorParams* pvaapiAllocParams = new vaapiAllocatorParams; MFX_CHECK_NULL_PTR1(pvaapiAllocParams); pvaapiAllocParams->m_dpy = (VADisplay)m_device; m_pmfxAllocatorParams = pvaapiAllocParams; } else return MFX_ERR_UNDEFINED_BEHAVIOR; MFX_CHECK_NULL_PTR1(m_pETAllocator); sts = m_pETAllocator->Init(m_pmfxAllocatorParams); MFX_CHECK_STS(sts); m_pAllocator = m_pETAllocator; } return sts; } mfxStatus EncTools::Init(mfxExtEncToolsConfig const * pConfig, mfxEncToolsCtrl const * ctrl) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR2(pConfig, ctrl); MFX_CHECK(!m_bInit, MFX_ERR_UNDEFINED_BEHAVIOR); m_ctrl = *ctrl; bool needVPP = isPreEncSCD(*pConfig, *ctrl) || isPreEncLA(*pConfig, *ctrl); if (needVPP) { sts = GetDeviceAllocator(ctrl); MFX_CHECK_STS(sts); } SetToolsStatus(&m_config, false); if (IsOn(pConfig->BRC)) { sts = m_brc->Init(*ctrl, IsOn(pConfig->AdaptiveMBQP), IsOn(pConfig->AdaptiveLTR)); MFX_CHECK_STS(sts); m_config.BRC = MFX_CODINGOPTION_ON; } if (isPreEncSCD(*pConfig, *ctrl)) { sts = m_scd.Init(*ctrl, *pConfig); MFX_CHECK_STS(sts); // to add request to m_scd about supported tools CopyPreEncSCTools(*pConfig, &m_config); } if (isPreEncLA(*pConfig, *ctrl)) { m_lpLookAhead.SetAllocator(m_pAllocator); sts = m_lpLookAhead.Init(*ctrl, *pConfig); MFX_CHECK_STS(sts); CopyPreEncLATools(*pConfig, &m_config); } if (needVPP) { sts = InitVPP(*ctrl); MFX_CHECK_STS(sts); } if(IsOn(pConfig->SaliencyMapHint)) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } m_bInit = true; return sts; } mfxStatus EncTools::Close() { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); if (m_bVPPInit) sts = CloseVPP(); if (isPreEncSCD(m_config, m_ctrl)) { m_scd.Close(); OffPreEncSCDTools(&m_config); } if (isPreEncLA(m_config, m_ctrl)) { m_lpLookAhead.Close(); OffPreEncLATools(&m_config); } if (IsOn(m_config.BRC)) { m_brc->Close(); m_config.BRC = false; } m_bInit = false; return sts; } mfxStatus EncTools::Reset(mfxExtEncToolsConfig const * config, mfxEncToolsCtrl const * ctrl) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR2(config,ctrl); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); bool needVPP = isPreEncSCD(*config, *ctrl) || isPreEncLA(*config, *ctrl); if (needVPP) { mfxHDL curDevice = m_device; mfxFrameAllocator* curpAlloc = m_pAllocator; sts = GetDeviceAllocator(ctrl); MFX_CHECK_STS(sts); if (m_pAllocator != curpAlloc || m_device != curDevice) { Close(); sts = Init(config, ctrl); return sts; } } if (IsOn(config->BRC)) { MFX_CHECK(m_config.BRC, MFX_ERR_UNSUPPORTED); sts = m_brc->Reset(*ctrl, IsOn(config->AdaptiveMBQP), IsOn(config->AdaptiveLTR)); MFX_CHECK_STS(sts); } if (isPreEncSCD(*config, *ctrl)) { // to add check if Close/Init is real needed if (isPreEncSCD(m_config, m_ctrl)) m_scd.Close(); sts = m_scd.Init(*ctrl, *config); MFX_CHECK_STS(sts); } if (isPreEncLA(*config, *ctrl)) { if (isPreEncLA(m_config, m_ctrl)) sts = m_lpLookAhead.Reset(*ctrl, *config); else sts = m_lpLookAhead.Init(*ctrl, *config); MFX_CHECK_STS(sts); } if (needVPP) { sts = ResetVPP(*ctrl); } return sts; } mfxStatus EncTools::VPPDownScaleSurface(MFXDLVideoSession* /*m_pmfxSession*/, MFXDLVideoVPP* pVPP, mfxSyncPoint* pVppSyncp, mfxFrameSurface1* pInSurface, mfxFrameSurface1* pOutSurface/*, bool doSync*/) { mfxStatus sts; MFX_CHECK_NULL_PTR2(pVPP, pVppSyncp); MFX_CHECK_NULL_PTR2(pInSurface, pOutSurface); sts = pVPP->RunFrameVPPAsync(pInSurface, pOutSurface, NULL, pVppSyncp); return sts; } static void IgnoreMoreDataStatus(mfxStatus &sts) { if (sts == MFX_ERR_MORE_DATA) sts = MFX_ERR_NONE; } // Compute AV1 segmentIDs and AltQIndexes // Note: Due to HW limitation, one segment must be reserved for HW use. // PAQ assumes segment 7 is reserved for HW use. This assumption imposes constraint on segMap file in commandline (ie, segMap must has all numbers from 0 to 6). static mfxStatus ProcessAV1SegmentationData(const mfxEncToolsTaskParam* par, mfxEncToolsHintQPMap* qpMapHint, mfxI32 QpY) { MFX_CHECK(par && qpMapHint, MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtAV1Segmentation* seg = (mfxExtAV1Segmentation *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_AV1_SEGMENTATION); MFX_CHECK(seg, MFX_ERR_UNDEFINED_BEHAVIOR); // AV1 segment IDs // - QpY is HEVC QP for frame. qpMapHint.ExtQpMap.QP[] is HEVC QP for blocks/segments. // - Note SegmentID is derived from HEVC QP mfxI16 segQPs[EncToolsBRC::TOTAL_NUM_AV1_SEGMENTS_FOR_ENCTOOLS] = {-1, -1, -1, -1, -1, -1, -1}; //"-1" means feature is disabled mfxU8 maxQpY = *(std::max_element(qpMapHint->ExtQpMap.QP, qpMapHint->ExtQpMap.QP + qpMapHint->ExtQpMap.NumQPAlloc)); for(mfxU32 i = 0; i < qpMapHint->ExtQpMap.NumQPAlloc ; i++) { mfxI16 seg_qp = (mfxI16)(qpMapHint->ExtQpMap.QP[i]); mfxU8 id = mfxU8(mfx::clamp((mfxI16)maxQpY - seg_qp, 0, EncToolsBRC::TOTAL_NUM_AV1_SEGMENTS_FOR_ENCTOOLS - 1)); // PAQ uses segments [0..6] segQPs[id] = seg_qp; seg->SegmentIds[i] = id; } //Update new AltQIndex (feature_value) // - Convert from HEVC QP to AV1 q-idx mfxI16 q_idx = mfxI16(EncToolsBRC::HEVC_QP_2_AV1_DC_Q_IDX[QpY]); for (mfxI16 id = 0; id < EncToolsBRC::TOTAL_NUM_AV1_SEGMENTS_FOR_ENCTOOLS; id++) { if (segQPs[id] != -1) { seg->Segment[id].FeatureEnabled |= MFX_VP9_SEGMENT_FEATURE_QINDEX; mfxI16 altQIndex = (mfxI16)EncToolsBRC::HEVC_QP_2_AV1_DC_Q_IDX[segQPs[id]] - q_idx; seg->Segment[id].AltQIndex = mfx::clamp(altQIndex, (mfxI16)-255, (mfxI16)255); } else { seg->Segment[id].FeatureEnabled &= (~MFX_VP9_SEGMENT_FEATURE_QINDEX); } } return MFX_ERR_NONE; } mfxStatus EncTools::Submit(mfxEncToolsTaskParam const * par) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxEncToolsFrameToAnalyze *pFrameData = (mfxEncToolsFrameToAnalyze *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE); if (pFrameData) { pFrameData->Surface->Data.FrameOrder = par->DisplayOrder; if (isPreEncSCD(m_config, m_ctrl) || isPreEncLA(m_config, m_ctrl)) { MFX_CHECK(m_bVPPInit, MFX_ERR_NOT_INITIALIZED); mfxU16 FrameType = 0; mfxSyncPoint vppSyncp_SCD{}; mfxSyncPoint vppSyncp_LA{}; mfxSyncPoint encSyncp_LA{}; //SCD only case if (isPreEncSCD(m_config, m_ctrl) && !isPreEncLA(m_config, m_ctrl)) { m_IntSurfaces_SCD.Data.FrameOrder = par->DisplayOrder; sts = VPPDownScaleSurface(&m_mfxSession_SCD, m_pmfxVPP_SCD.get(), &vppSyncp_SCD, pFrameData->Surface, &m_IntSurfaces_SCD); MFX_CHECK_STS(sts); sts = m_mfxSession_SCD.SyncOperation(vppSyncp_SCD, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); sts = m_scd.SubmitFrame(&m_IntSurfaces_SCD); IgnoreMoreDataStatus(sts); return sts; } //LA only case else if (!isPreEncSCD(m_config, m_ctrl) && isPreEncLA(m_config, m_ctrl)) { m_pIntSurfaces_LA[0].Data.FrameOrder = par->DisplayOrder; sts = VPPDownScaleSurface(m_mfxSession_LA, m_pmfxVPP_LA.get(), &vppSyncp_LA, pFrameData->Surface, m_pIntSurfaces_LA.data()); MFX_CHECK_STS(sts); sts = m_lpLookAhead.Submit(m_pIntSurfaces_LA.data(), FrameType, &encSyncp_LA); MFX_CHECK_STS(sts); sts = m_mfxSession_LA->SyncOperation(encSyncp_LA, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); sts = m_lpLookAhead.SaveEncodedFrameSize(m_pIntSurfaces_LA.data(), 0 /*frame type*/); return sts; } //SCD and LA case else if (isPreEncSCD(m_config, m_ctrl) && isPreEncLA(m_config, m_ctrl)) { m_IntSurfaces_SCD.Data.FrameOrder = m_pIntSurfaces_LA[0].Data.FrameOrder = par->DisplayOrder; sts = VPPDownScaleSurface(m_mfxSession_LA, m_pmfxVPP_LA.get(), &vppSyncp_LA, pFrameData->Surface, m_pIntSurfaces_LA.data()); MFX_CHECK_STS(sts); sts = VPPDownScaleSurface(&m_mfxSession_SCD, m_pmfxVPP_SCD.get(), &vppSyncp_SCD, pFrameData->Surface, &m_IntSurfaces_SCD); MFX_CHECK_STS(sts); //LA depends on SCD if (IsOn(m_config.AdaptiveI)) { sts = m_mfxSession_SCD.SyncOperation(vppSyncp_SCD, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); sts = m_scd.SubmitFrame(&m_IntSurfaces_SCD); IgnoreMoreDataStatus(sts); MFX_CHECK_STS(sts); m_scd.GetIntraDecision(par->DisplayOrder, &FrameType); if (FrameType & (MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR)) { // convert to IREFIDR for Analysis FrameType = (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR); } sts = m_lpLookAhead.Submit(m_pIntSurfaces_LA.data(), FrameType, &encSyncp_LA); MFX_CHECK_STS(sts); sts = m_mfxSession_LA->SyncOperation(encSyncp_LA, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); sts = m_lpLookAhead.SaveEncodedFrameSize(m_pIntSurfaces_LA.data(), FrameType); return sts; } //LA can run in parallel with SCD else { //run LA sts = m_lpLookAhead.Submit(m_pIntSurfaces_LA.data(), FrameType, &encSyncp_LA); MFX_CHECK_STS(sts); //run SCD sts = m_mfxSession_SCD.SyncOperation(vppSyncp_SCD, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); sts = m_scd.SubmitFrame(&m_IntSurfaces_SCD); IgnoreMoreDataStatus(sts); MFX_CHECK_STS(sts); //save LA results sts = m_mfxSession_LA->SyncOperation(encSyncp_LA, ENC_TOOLS_WAIT_INTERVAL); MFX_CHECK_STS(sts); m_scd.GetIntraDecision(par->DisplayOrder, &FrameType); if (FrameType & (MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR)) { // convert to IREFIDR for Analysis FrameType = (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR); } sts = m_lpLookAhead.SaveEncodedFrameSize(m_pIntSurfaces_LA.data(), FrameType); return sts; } } else { return MFX_ERR_UNDEFINED_BEHAVIOR; } } } mfxEncToolsBRCEncodeResult *pEncRes = (mfxEncToolsBRCEncodeResult *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT); // Since AV1 BRC uses HEVC BRC, so need this conversion if(pEncRes && m_ctrl.CodecId == MFX_CODEC_AV1) { pEncRes->QpY = EncToolsBRC::AV1_DC_Q_IDX_2_HEVC_QP[pEncRes->QpY]; } if (pEncRes && isPreEncSCD(m_config, m_ctrl)) { m_scd.ReportEncResult(par->DisplayOrder, *pEncRes); } if (pEncRes && IsOn(m_config.BRC)) { return m_brc->ReportEncResult(par->DisplayOrder, *pEncRes); } mfxEncToolsBRCFrameParams *pFrameStruct = (mfxEncToolsBRCFrameParams *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM ); if (pFrameStruct && IsOn(m_config.BRC)) { sts = m_brc->SetFrameStruct(par->DisplayOrder, *pFrameStruct); MFX_CHECK_STS(sts); } mfxEncToolsBRCBufferHint *pBRCHints = (mfxEncToolsBRCBufferHint *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT); if (pBRCHints && IsOn(m_config.BRC)) { sts = m_brc->ReportBufferHints(par->DisplayOrder, *pBRCHints); MFX_CHECK_STS(sts); } mfxEncToolsHintPreEncodeGOP *pPreEncGOP = (mfxEncToolsHintPreEncodeGOP *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_GOP); if (pPreEncGOP && IsOn(m_config.BRC)) { if (pPreEncGOP->QPModulation == MFX_QP_MODULATION_EXPLICIT) { //MLAPQ Inference is only done when explicit modulation is used sts = m_scd.GetMLApqDeltaQp(par->DisplayOrder, pPreEncGOP->QPDeltaExplicitModulation); MFX_CHECK_STS(sts); } return m_brc->ReportGopHints(par->DisplayOrder, *pPreEncGOP); } return sts; } mfxStatus EncTools::Query(mfxEncToolsTaskParam* par, mfxU32 /*timeOut*/) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxEncToolsHintPreEncodeSceneChange *pPreEncSC = (mfxEncToolsHintPreEncodeSceneChange *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE); if (pPreEncSC && isPreEncSCD(m_config, m_ctrl)) { sts = m_scd.GetSCDecision(par->DisplayOrder, pPreEncSC); sts = m_scd.GetPersistenceMap(par->DisplayOrder, pPreEncSC); MFX_CHECK_STS(sts); } mfxEncToolsHintPreEncodeGOP *pPreEncGOP = (mfxEncToolsHintPreEncodeGOP *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_GOP); if (pPreEncGOP) { if (isPreEncSCD(m_config, m_ctrl)) sts = m_scd.GetGOPDecision(par->DisplayOrder, pPreEncGOP); #if defined (MFX_ENABLE_ENCTOOLS_LPLA) else if (isPreEncLA(m_config, m_ctrl)) { sts = m_lpLookAhead.Query(par->DisplayOrder, pPreEncGOP); if (sts == MFX_ERR_NOT_FOUND) sts = MFX_ERR_NONE; } #endif MFX_CHECK_STS(sts); } mfxEncToolsHintPreEncodeARefFrames *pPreEncARef = (mfxEncToolsHintPreEncodeARefFrames *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_AREF); if (pPreEncARef && isPreEncSCD(m_config, m_ctrl)) { sts = m_scd.GetARefDecision(par->DisplayOrder, pPreEncARef); MFX_CHECK_STS(sts); } #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxEncToolsHintQuantMatrix *pCqmHint = (mfxEncToolsHintQuantMatrix *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_MATRIX); if (pCqmHint && isPreEncLA(m_config, m_ctrl)) { sts = m_lpLookAhead.Query(par->DisplayOrder, pCqmHint); if (sts == MFX_ERR_NOT_FOUND) sts = MFX_ERR_NONE; MFX_CHECK_STS(sts); } #endif mfxEncToolsBRCBufferHint *bufferHint = (mfxEncToolsBRCBufferHint *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT); if (bufferHint && isPreEncLA(m_config, m_ctrl)) { sts = m_lpLookAhead.Query(par->DisplayOrder, bufferHint); if (sts == MFX_ERR_NOT_FOUND) sts = MFX_ERR_NONE; MFX_CHECK_STS(sts); } mfxEncToolsBRCStatus *pFrameSts = (mfxEncToolsBRCStatus *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_STATUS); if (pFrameSts && IsOn(m_config.BRC)) { return m_brc->UpdateFrame(par->DisplayOrder, pFrameSts); } mfxEncToolsBRCQuantControl *pFrameQp = (mfxEncToolsBRCQuantControl *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL); mfxEncToolsHintQPMap* qpMapHint = (mfxEncToolsHintQPMap*)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP); // Sanity check if (qpMapHint && m_ctrl.CodecId == MFX_CODEC_AV1) { mfxU16 w = m_ctrl.FrameInfo.Width; mfxU16 pitch = (w + qpMapHint->ExtQpMap.BlockSize - 1) / qpMapHint->ExtQpMap.BlockSize; MFX_CHECK(qpMapHint->QpMapPitch == pitch, MFX_ERR_UNDEFINED_BEHAVIOR); } if (pFrameQp && IsOn(m_config.BRC)) { sts = m_brc->ProcessFrame(par->DisplayOrder, pFrameQp, qpMapHint); MFX_CHECK_STS(sts); // Note: AV1 BRC is based on HEVC BRC, so need this conversion if (m_ctrl.CodecId == MFX_CODEC_AV1) { // Compute segmentIDs and AltQIndexes if (qpMapHint && qpMapHint->QpMapFilled) { ProcessAV1SegmentationData(par, qpMapHint, (mfxI32)(pFrameQp->QpY)); } pFrameQp->QpY = EncToolsBRC::HEVC_QP_2_AV1_DC_Q_IDX[pFrameQp->QpY]; } } mfxEncToolsBRCHRDPos *pHRDPos = (mfxEncToolsBRCHRDPos *)Et_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS); if (pHRDPos && IsOn(m_config.BRC)) { sts = m_brc->GetHRDPos(par->DisplayOrder, pHRDPos); MFX_CHECK_STS(sts); } return sts; } mfxStatus EncTools::Discard(mfxU32 displayOrder) { mfxStatus sts = MFX_ERR_NONE; if (isPreEncSCD(m_config, m_ctrl)) sts = m_scd.CompleteFrame(displayOrder); return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_lpla.cpp000066400000000000000000000477541443134507600276070ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enctools.h" #include "mfx_enctools_lpla.h" #include #include #include mfxStatus LPLA_EncTool::Init(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & config) { mfxStatus sts = MFX_ERR_NONE; mfxEncToolsCtrlExtDevice *extDevice = (mfxEncToolsCtrlExtDevice *)Et_GetExtBuffer(ctrl.ExtParam, ctrl.NumExtParam, MFX_EXTBUFF_ENCTOOLS_DEVICE); if (extDevice) { m_device = extDevice->DeviceHdl; m_deviceType = extDevice->HdlType; } if (!m_pAllocator) { mfxEncToolsCtrlExtAllocator *extAlloc = (mfxEncToolsCtrlExtAllocator *)Et_GetExtBuffer(ctrl.ExtParam, ctrl.NumExtParam, MFX_EXTBUFF_ENCTOOLS_ALLOCATOR); if (extAlloc) m_pAllocator = extAlloc->pAllocator; } MFX_CHECK_NULL_PTR2(m_device, m_pAllocator); sts = InitSession(); MFX_CHECK_STS(sts); m_pmfxENC = new MFXDLVideoENCODE(m_mfxSession, m_hRTModule); MFX_CHECK_NULL_PTR1(m_pmfxENC); m_GopPicSize = ctrl.MaxGopSize; if (m_GopPicSize) m_IdrInterval = (mfxU16)std::min(ctrl.MaxIDRDist / m_GopPicSize, USHRT_MAX); m_GopRefDist = ctrl.MaxGopRefDist; m_codecId = ctrl.CodecId; // main codec's ID sts = InitEncParams(ctrl, config); MFX_CHECK_STS(sts); memset(&m_bitstream, 0, sizeof(mfxBitstream)); mfxU32 bufferSize = std::max((mfxU32)m_encParams.mfx.FrameInfo.Width * m_encParams.mfx.FrameInfo.Height * 3 / 2, ctrl.BufferSizeInKB * 1000); m_bitstream.Data = new mfxU8[bufferSize]; m_bitstream.MaxLength = bufferSize; sts = ConfigureExtBuffs(ctrl, config); MFX_CHECK_STS(sts); sts = m_pmfxENC->Init(&m_encParams); if (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts) { sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); m_curDispOrder = -1; m_config = config; m_bInit = true; return sts; } mfxStatus LPLA_EncTool::Reset(mfxEncToolsCtrl const& ctrl, mfxExtEncToolsConfig const& config) { mfxStatus sts = MFX_ERR_NONE; m_curDispOrder = -1; m_GopPicSize = ctrl.MaxGopSize; if (m_GopPicSize) m_IdrInterval = (mfxU16)std::min(ctrl.MaxIDRDist / m_GopPicSize, USHRT_MAX); m_GopRefDist = ctrl.MaxGopRefDist; m_codecId = ctrl.CodecId; // main codec's ID sts = InitEncParams(ctrl, config); MFX_CHECK_STS(sts); mfxU32 bufferSize = std::max((mfxU32)m_encParams.mfx.FrameInfo.Width * m_encParams.mfx.FrameInfo.Height * 3 / 2, ctrl.BufferSizeInKB * 1000); if (!m_bitstream.Data || bufferSize > m_bitstream.MaxLength) { if (m_bitstream.Data) delete[] m_bitstream.Data; memset(&m_bitstream, 0, sizeof(mfxBitstream)); m_bitstream.Data = new mfxU8[bufferSize]; m_bitstream.MaxLength = bufferSize; } sts = ConfigureExtBuffs(ctrl, config); MFX_CHECK_STS(sts); m_pmfxENC->Close(); sts = m_pmfxENC->Init(&m_encParams); if (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts) { sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); m_config = config; return sts; } mfxStatus LPLA_EncTool::InitSession() { MFX_CHECK_NULL_PTR2(m_device, m_pAllocator); mfxStatus sts = MFX_ERR_NONE; mfxInitParam initPar = {}; mfxVersion version; // real API version with which library is initialized initPar.Version.Major = 1; initPar.Version.Minor = 0; initPar.Implementation = MFX_IMPL_HARDWARE; initPar.Implementation |= (m_deviceType == MFX_HANDLE_D3D11_DEVICE ? MFX_IMPL_VIA_D3D11 : (m_deviceType == MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 ? MFX_IMPL_VIA_D3D9 : MFX_IMPL_VIA_VAAPI)); initPar.GPUCopy = MFX_GPUCOPY_DEFAULT; sts = m_mfxSession.InitEx(initPar); MFX_CHECK_STS(sts); sts = m_mfxSession.QueryVersion(&version); // get real API version of the loaded library MFX_CHECK_STS(sts); if (m_pAllocator) { sts = m_mfxSession.SetFrameAllocator(m_pAllocator); MFX_CHECK_STS(sts); } sts = m_mfxSession.SetHandle((mfxHandleType)m_deviceType, m_device); MFX_CHECK_STS(sts); return sts; } mfxStatus LPLA_EncTool::InitEncParams(mfxEncToolsCtrl const & ctrl, mfxExtEncToolsConfig const & pConfig) { mfxStatus sts = MFX_ERR_NONE; // following configuration comes from HW recommendation m_encParams.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; m_encParams.AsyncDepth = 1; m_encParams.mfx.CodecId = MFX_CODEC_HEVC; m_encParams.mfx.LowPower = MFX_CODINGOPTION_ON; m_encParams.mfx.NumRefFrame = 1; m_encParams.mfx.TargetUsage = 7; m_encParams.mfx.RateControlMethod = MFX_RATECONTROL_CQP; m_encParams.mfx.CodecProfile = MFX_PROFILE_HEVC_MAIN; m_encParams.mfx.CodecLevel = MFX_LEVEL_HEVC_52; m_encParams.mfx.QPI = ctrl.LaQp; m_encParams.mfx.QPP = ctrl.LaQp+2; m_encParams.mfx.QPB = ctrl.LaQp+2; m_encParams.mfx.NumSlice = 1; m_encParams.mfx.GopOptFlag = ctrl.GopOptFlag; if (ctrl.CodecId != MFX_CODEC_AVC) { m_encParams.mfx.IdrInterval = m_IdrInterval; } if (IsOn(pConfig.AdaptiveI)) m_encParams.mfx.GopPicSize = 0xffff; // infinite GOP else m_encParams.mfx.GopPicSize = ctrl.MaxGopSize; m_encParams.mfx.GopRefDist = 1; //ctrl.MaxGopRefDist; m_encParams.mfx.FrameInfo = ctrl.FrameInfo; m_lookAheadScale = ctrl.LaScale; m_lookAheadDepth = ctrl.MaxDelayInFrames; mfxU16 crW = m_encParams.mfx.FrameInfo.CropW ? m_encParams.mfx.FrameInfo.CropW : m_encParams.mfx.FrameInfo.Width; mfxU16 crH = m_encParams.mfx.FrameInfo.CropH ? m_encParams.mfx.FrameInfo.CropH : m_encParams.mfx.FrameInfo.Height; if (m_lookAheadScale) { m_encParams.mfx.FrameInfo.CropW = (crW >> m_lookAheadScale); m_encParams.mfx.FrameInfo.CropH = (crH >> m_lookAheadScale); m_encParams.mfx.FrameInfo.Width = (m_encParams.mfx.FrameInfo.CropW + 15) & ~0xF; m_encParams.mfx.FrameInfo.Height = (m_encParams.mfx.FrameInfo.CropH + 15) & ~0xF; } if(ctrl.ScenarioInfo != MFX_SCENARIO_GAME_STREAMING && m_encParams.mfx.FrameInfo.BitDepthLuma == 10){ m_encParams.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; m_encParams.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; m_encParams.mfx.FrameInfo.BitDepthLuma = 8; m_encParams.mfx.FrameInfo.BitDepthChroma = 8; m_encParams.mfx.FrameInfo.Shift = 0; } return sts; } mfxStatus LPLA_EncTool::ConfigureExtBuffs(mfxEncToolsCtrl const & #if defined (MFX_ENABLE_ENCTOOLS_LPLA) ctrl #endif , mfxExtEncToolsConfig const & pConfig) { mfxStatus sts = MFX_ERR_NONE; // create ext buffer for lpla mfxExtBuffer** extBuf; m_encParams.NumExtParam = 0; #if defined (MFX_ENABLE_ENCTOOLS_LPLA) if (ctrl.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) // regular LPLA - not LPLA-assisted ET BRC; to be removed if BRC starts using the hints { // Attach buffer to bitstream for get la hints from enoder mfxExtBuffer** extParams = new mfxExtBuffer *[1]; extBuf = new mfxExtBuffer *[4]; m_lplaHints = {}; m_lplaHints.Header.BufferId = MFX_EXTBUFF_LPLA_STATUS; m_lplaHints.Header.BufferSz = sizeof(m_lplaHints); extParams[0] = &m_lplaHints.Header; m_bitstream.ExtParam = extParams; m_bitstream.NumExtParam = 1; m_extBufLPLA = {}; m_extBufLPLA.Header.BufferId = MFX_EXTBUFF_LP_LOOKAHEAD; m_extBufLPLA.Header.BufferSz = sizeof(m_extBufLPLA); m_extBufLPLA.LookAheadDepth = ctrl.MaxDelayInFrames; m_extBufLPLA.InitialDelayInKB = (mfxU16)ctrl.InitialDelayInKB; m_extBufLPLA.BufferSizeInKB = (mfxU16)ctrl.BufferSizeInKB; m_extBufLPLA.TargetKbps = (mfxU16)ctrl.TargetKbps; m_extBufLPLA.LookAheadScaleX = m_extBufLPLA.LookAheadScaleY = (mfxU8)m_lookAheadScale; m_extBufLPLA.GopRefDist = ctrl.MaxGopRefDist; m_extBufLPLA.codecTypeInEncodePass = ctrl.CodecId; if (IsOn(pConfig.AdaptiveI)) { m_extBufLPLA.MaxAdaptiveGopSize = ctrl.MaxGopSize; m_extBufLPLA.MinAdaptiveGopSize = (mfxU16)std::max(16, m_extBufLPLA.MaxAdaptiveGopSize / 4); } extBuf[m_encParams.NumExtParam] = &m_extBufLPLA.Header; m_encParams.NumExtParam++; m_extBufCO2 = {}; m_extBufCO2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2; m_extBufCO2.Header.BufferSz = sizeof(m_extBufCO2); m_extBufCO2.AdaptiveB = (mfxU16)(IsOn(pConfig.AdaptiveB) ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF); extBuf[m_encParams.NumExtParam] = &m_extBufCO2.Header; m_encParams.NumExtParam++; } else #endif extBuf = new mfxExtBuffer *[2]; m_extBufHevcParam = {}; m_extBufHevcParam.Header.BufferId = MFX_EXTBUFF_HEVC_PARAM; m_extBufHevcParam.Header.BufferSz = sizeof(m_extBufHevcParam); m_extBufHevcParam.SampleAdaptiveOffset = MFX_SAO_DISABLE; extBuf[m_encParams.NumExtParam] = &m_extBufHevcParam.Header; m_encParams.NumExtParam++; m_extBufCO3 = {}; m_extBufCO3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3; m_extBufCO3.Header.BufferSz = sizeof(m_extBufCO3); m_extBufCO3.PRefType = (mfxU16)(IsOn(pConfig.AdaptivePyramidQuantP) ? MFX_P_REF_PYRAMID : MFX_P_REF_SIMPLE); extBuf[m_encParams.NumExtParam] = &m_extBufCO3.Header; m_encParams.NumExtParam++; m_encParams.ExtParam = extBuf; return sts; } MFXDLVideoSession* LPLA_EncTool::GetEncSession() { return &m_mfxSession; } mfxStatus LPLA_EncTool::Submit(mfxFrameSurface1* surface, mfxU16 FrameType, mfxSyncPoint* pEncSyncp) { mfxStatus sts = MFX_ERR_NONE; m_bitstream.DataLength = 0; m_bitstream.DataOffset = 0; mfxEncodeCtrl ctrl = {}; ctrl.FrameType = FrameType; sts = m_pmfxENC->EncodeFrameAsync(&ctrl, surface, &m_bitstream, pEncSyncp); MFX_CHECK_STS(sts); return sts; } mfxStatus LPLA_EncTool::SaveEncodedFrameSize(mfxFrameSurface1* surface, mfxU16 FrameType) { mfxStatus sts = MFX_ERR_NONE; if (m_bitstream.DataLength == 0) return MFX_ERR_INVALID_VIDEO_PARAM; //printf("LPLA_EncTool::Submit encoded frame size %7d\n", m_bitstream.DataLength); m_frameSizes.push_back({ surface->Data.FrameOrder, m_bitstream.DataLength, FrameType }); #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxExtLpLaStatus* lplaHints = (mfxExtLpLaStatus*)Et_GetExtBuffer(m_bitstream.ExtParam, m_bitstream.NumExtParam, MFX_EXTBUFF_LPLA_STATUS); if (lplaHints) { if (lplaHints->CqmHint != CQM_HINT_INVALID) { //printf("Submit %d: CQM %d Intra %d FrmSize %d MiniGop %d QpModStrength %d \n", surface->Data.FrameOrder, lplaHints->CqmHint, lplaHints->IntraHint, lplaHints->TargetFrameSize, lplaHints->MiniGopSize, lplaHints->QpModulationStrength); m_encodeHints.push_back({ lplaHints->StatusReportFeedbackNumber, lplaHints->CqmHint, lplaHints->IntraHint, lplaHints->MiniGopSize, lplaHints->QpModulationStrength, lplaHints->TargetFrameSize }); } } #endif return sts; } #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxStatus LPLA_EncTool::Query(mfxU32 dispOrder, mfxEncToolsHintPreEncodeGOP *pPreEncGOP) { MFX_CHECK_NULL_PTR1(pPreEncGOP); mfxStatus sts = MFX_ERR_NONE; if (!m_bInit) return MFX_ERR_NOT_INITIALIZED; if ((mfxI32)dispOrder < m_curDispOrder) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; else if ((mfxI32)dispOrder > m_curDispOrder) { if (m_encodeHints.empty()) { sts = MFX_ERR_NOT_FOUND; pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; if (m_encParams.mfx.GopPicSize && (dispOrder - m_lastIFrameNumber >= (mfxU32)m_encParams.mfx.GopPicSize)) pPreEncGOP->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; } else { m_curEncodeHints = m_encodeHints.front(); m_curDispOrder = (mfxI32)dispOrder; m_encodeHints.pop_front(); } } if (sts == MFX_ERR_NONE) { switch (m_curEncodeHints.MiniGopSize) { case 1: case 2: case 4: case 8: pPreEncGOP->MiniGopSize = m_curEncodeHints.MiniGopSize; break; default: pPreEncGOP->MiniGopSize = 0; } mfxU8 qpModulationHigh = MAX_QP_MODULATION; if (m_curEncodeHints.PyramidQpHint <= qpModulationHigh && (IsOn(m_config.AdaptivePyramidQuantP) || IsOn(m_config.AdaptivePyramidQuantB))) pPreEncGOP->QPModulation = m_curEncodeHints.PyramidQpHint; else pPreEncGOP->QPModulation = MFX_QP_MODULATION_NOT_DEFINED; if (m_curEncodeHints.IntraHint && IsOn(m_config.AdaptiveI)) m_nextPisIntra = true; pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; } if (dispOrder == 0) { pPreEncGOP->FrameType = MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; m_lastIDRFrameNumber = dispOrder; m_nextPisIntra = false; } // for adaptiveI==off only: m_encParams.mfx.GopPicSize is "infinite" (0xffff) when adaptiveI==on if (m_encParams.mfx.GopPicSize && (dispOrder - m_lastIFrameNumber >= (mfxU32)m_encParams.mfx.GopPicSize)) pPreEncGOP->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; if (pPreEncGOP->FrameType & MFX_FRAMETYPE_I) { m_lastIFrameNumber = m_lastIPFrameNumber = dispOrder; if (m_GopPicSize && (dispOrder - m_lastIDRFrameNumber >= (mfxU32)m_GopPicSize * m_IdrInterval)) { pPreEncGOP->FrameType |= MFX_FRAMETYPE_IDR; m_lastIDRFrameNumber = dispOrder; } } else if (m_GopRefDist > 1) { // closed GOP (GopOptFlag or IDR) if ((dispOrder - m_lastIFrameNumber + 1 == (mfxU32)m_encParams.mfx.GopPicSize) && (m_encParams.mfx.GopOptFlag & MFX_GOP_CLOSED) || (m_encParams.mfx.GopPicSize && (dispOrder - m_lastIDRFrameNumber + 1 == (mfxU32)m_encParams.mfx.GopPicSize * m_IdrInterval))) { pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; } else { mfxU32 miniGopSize = pPreEncGOP->MiniGopSize ? pPreEncGOP->MiniGopSize : m_GopRefDist; if ((dispOrder - m_lastIPFrameNumber) % miniGopSize) { pPreEncGOP->FrameType = MFX_FRAMETYPE_B; } else { pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; if (m_nextPisIntra) { pPreEncGOP->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; if (m_codecId == MFX_CODEC_AV1) pPreEncGOP->FrameType |= MFX_FRAMETYPE_IDR; m_nextPisIntra = false; m_lastIFrameNumber = dispOrder; } m_lastIPFrameNumber = dispOrder; } } } else { pPreEncGOP->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; if (m_nextPisIntra) { pPreEncGOP->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; if (m_codecId == MFX_CODEC_AV1) pPreEncGOP->FrameType |= MFX_FRAMETYPE_IDR; m_nextPisIntra = false; m_lastIFrameNumber = dispOrder; } m_lastIPFrameNumber = dispOrder; } return sts; } #endif #if defined (MFX_ENABLE_ENCTOOLS_LPLA) mfxStatus LPLA_EncTool::Query(mfxU32 dispOrder, mfxEncToolsHintQuantMatrix *pCqmHint) { MFX_CHECK_NULL_PTR1(pCqmHint); if (!m_bInit) return MFX_ERR_NOT_INITIALIZED; if ((mfxI32)dispOrder < m_curDispOrder) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; else if ((mfxI32)dispOrder > m_curDispOrder) { if (m_encodeHints.empty()) { pCqmHint->MatrixType = CQM_HINT_INVALID; return MFX_ERR_NOT_FOUND; } m_curEncodeHints = m_encodeHints.front(); m_curDispOrder = (mfxI32)dispOrder; m_encodeHints.pop_front(); } switch (m_curEncodeHints.CqmHint) { case CQM_HINT_USE_CUST_MATRIX1: pCqmHint->MatrixType = MFX_QUANT_MATRIX_WEAK; break; case CQM_HINT_USE_CUST_MATRIX2: pCqmHint->MatrixType = MFX_QUANT_MATRIX_MEDIUM; break; case CQM_HINT_USE_CUST_MATRIX3: pCqmHint->MatrixType = MFX_QUANT_MATRIX_STRONG; break; case CQM_HINT_USE_CUST_MATRIX4: pCqmHint->MatrixType = MFX_QUANT_MATRIX_EXTREME; break; case CQM_HINT_USE_FLAT_MATRIX: default: pCqmHint->MatrixType = MFX_QUANT_MATRIX_FLAT; } return MFX_ERR_NONE; } #endif mfxStatus LPLA_EncTool::Query(mfxU32 dispOrder, mfxEncToolsBRCBufferHint *pBufHint) { MFX_CHECK_NULL_PTR1(pBufHint) if (!m_bInit) return MFX_ERR_NOT_INITIALIZED; if (pBufHint->OutputMode == MFX_BUFFERHINT_OUTPUT_DISPORDER) { if ((mfxI32)dispOrder < m_curDispOrder) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; else if ((mfxI32)dispOrder > m_curDispOrder) { if (!m_frameSizes.empty()) { m_curDispOrder = (mfxU32)dispOrder; mfxU32 laAvgBits = 0; mfxU16 distToNextI = 0; for (std::list::iterator it = m_frameSizes.begin(); it != m_frameSizes.end(); it++) { laAvgBits += it->encodedFrameSize; if (!distToNextI && (it->frameType & MFX_FRAMETYPE_I)) distToNextI = mfxU16(it->dispOrder - dispOrder); } laAvgBits *= 8; laAvgBits /= (mfxU32)m_frameSizes.size(); pBufHint->AvgEncodedSizeInBits = laAvgBits; pBufHint->CurEncodedSizeInBits = m_frameSizes.front().encodedFrameSize * 8; pBufHint->DistToNextI = distToNextI; m_frameSizes.pop_front(); } } return MFX_ERR_NONE; } #if defined (MFX_ENABLE_ENCTOOLS_LPLA) if ((mfxI32)dispOrder < m_curDispOrder) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; else if ((mfxI32)dispOrder > m_curDispOrder) { if (m_encodeHints.empty()) return MFX_ERR_NOT_FOUND; m_curEncodeHints = m_encodeHints.front(); m_curDispOrder = (mfxU32)dispOrder; m_encodeHints.pop_front(); } pBufHint->OptimalFrameSizeInBytes = m_curEncodeHints.TargetFrameSize; #endif return MFX_ERR_NONE; } mfxStatus LPLA_EncTool::Close() { mfxStatus sts = MFX_ERR_NONE; if (m_bInit) { if(m_bitstream.Data) { delete[] m_bitstream.Data; m_bitstream.Data = nullptr; } if (m_bitstream.ExtParam) { delete[] m_bitstream.ExtParam; m_bitstream.ExtParam = nullptr; } if(m_encParams.ExtParam) { delete[] m_encParams.ExtParam; m_encParams.ExtParam = nullptr; } if (m_pmfxENC) { delete m_pmfxENC; m_pmfxENC = nullptr; } sts = m_mfxSession.Close(); MFX_CHECK_STS(sts); m_bInit = false; } return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfx_enctools_utils.cpp000066400000000000000000000045441443134507600300050ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include "mfx_enctools_utils.h" namespace EncToolsUtils { template mfxStatus DownScaleNN(T const & pSrc, mfxU32 srcWidth, mfxU32 srcHeight, mfxU32 srcPitch, T & pDst, mfxU32 dstWidth, mfxU32 dstHeight, mfxU32 dstPitch) { mfxI32 step_w = srcWidth / dstWidth; mfxI32 step_h = srcHeight / dstHeight; for (mfxI32 y = 0; y < (mfxI32)dstHeight; y++) { for (mfxI32 x = 0; x < (mfxI32)dstWidth; x++) { T const * ps = &pSrc + ((y * step_h) * srcPitch) + (x * step_w); T* pd = &pDst + (y * dstPitch) + x; pd[0] = ps[0]; } } return MFX_ERR_NONE; } template mfxStatus DownScaleNN(mfxU8 const & pSrc, mfxU32 srcWidth, mfxU32 srcHeight, mfxU32 srcPitch, mfxU8 & pDst, mfxU32 dstWidth, mfxU32 dstHeight, mfxU32 dstPitch); mfxExtBuffer* Et_GetExtBuffer(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id) { if (extBuf != 0) { for (mfxU16 i = 0; i < numExtBuf; i++) { if (extBuf[i] != 0 && extBuf[i]->BufferId == id) // assuming aligned buffers return (extBuf[i]); } } return 0; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/enctools/src/mfxenctools_dl_int.cpp000066400000000000000000000060261443134507600277540ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfxenctools_dl_int.h" #include "mfx_loader_utils.h" MFXDLVideoSession::MFXDLVideoSession(void* module) { m_session = (mfxSession)0; InitExPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXInitEx")); ClosePtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXClose")); QueryVersionPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXQueryVersion")); SetFrameAllocatorPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoCORE_SetFrameAllocator")); SetHandlePtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoCORE_SetHandle")); SyncOperationPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoCORE_SyncOperation")); } MFXDLVideoENCODE::MFXDLVideoENCODE(mfxSession session, void* module) { m_session = session; InitPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoENCODE_Init")); ClosePtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoENCODE_Close")); EncodeFrameAsyncPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoENCODE_EncodeFrameAsync")); } MFXDLVideoVPP::MFXDLVideoVPP(mfxSession session, void* module) { m_session = session; QueryIOSurfPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoVPP_QueryIOSurf")); InitPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoVPP_Init")); ClosePtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoVPP_Close")); RunFrameVPPAsyncPtr = reinterpret_cast( GetModuleFuncAddress(module, "MFXVideoVPP_RunFrameVPPAsync")); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_config_trace/000077500000000000000000000000001443134507600242325ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_config_trace/CMakeLists.txt000066400000000000000000000036231443134507600267760ustar00rootroot00000000000000add_library(mfx_config_trace STATIC ${CMAKE_BINARY_DIR}/mfx_config_trace.cpp) if( DEFINED MFX_LIBNAME ) set( mfxlibname "${MFX_LIBNAME}") else() make_runtime_name( hw mfxlibname ) endif() target_compile_definitions(mfx_config_trace PRIVATE $) target_link_libraries(mfx_config_trace PUBLIC mfx_static_lib) file(STRINGS ${CMAKE_BINARY_DIR}/mfx_features.h mfx_features_contents) file(STRINGS ../shared/include/mfx_config.h mfx_config_contents) file(STRINGS ../shared/include/mfx_config_decode.h mfx_config_decode_contents) file(STRINGS ../shared/include/mfx_config_encode.h mfx_config_encode_contents) file(STRINGS ../shared/include/mfx_config_vpp.h mfx_config_vpp_contents) string(REGEX MATCHALL " *((#define)|(#undef)) +[A-Z_a-z0-9]+" macro_list ${mfx_features_contents} ${mfx_features_ext_contents} ${mfx_config_contents} ${mfx_config_decode_contents} ${mfx_config_encode_contents} ${mfx_config_vpp_contents}) file(REMOVE ${CMAKE_BINARY_DIR}/mfx_config_trace.cpp) file(APPEND ${CMAKE_BINARY_DIR}/mfx_config_trace.cpp "#include \"mfx_config.h\"\n") list(APPEND history_list "") foreach(macro IN LISTS macro_list) string(REPLACE "#define" "" macro_tmp1 ${macro}) string(REPLACE "#undef" "" macro_tmp2 ${macro_tmp1}) string(REPLACE " " "" macro_out ${macro_tmp2}) string(REGEX MATCHALL ".*_H_.*" tmp_list ${macro_out}) list(LENGTH tmp_list length) if (length EQUAL 1) continue() endif() set(is_dup 0) foreach(history_macro IN LISTS history_list) string(COMPARE EQUAL ${macro_out} ${history_macro} is_dup) endforeach() if (is_dup EQUAL 1) continue() endif() list(APPEND history_list ${macro_out}) file(APPEND ${CMAKE_BINARY_DIR}/mfx_config_trace.cpp "#ifdef ${macro_out}\n" "#pragma message(\"${macro_out} ON\")\n" "#else\n" "#pragma message(\"${macro_out} OFF\")\n" "#endif\n") endforeach() oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/000077500000000000000000000000001443134507600223555ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/CMakeLists.txt000066400000000000000000000133131443134507600251160ustar00rootroot00000000000000set(sources_common shared/src/libmfxsw.cpp shared/src/libmfxsw_async.cpp shared/src/libmfxsw_decode.cpp shared/src/libmfxsw_encode.cpp shared/src/libmfxsw_functions.cpp shared/src/libmfxsw_enc.cpp shared/src/libmfxsw_pak.cpp shared/src/libmfxsw_plugin.cpp shared/src/libmfxsw_query.cpp shared/src/libmfxsw_session.cpp shared/src/libmfxsw_vpp.cpp shared/src/libmfxsw_decode_vp.cpp shared/src/mfx_session.cpp shared/include/feature_blocks/mfx_feature_blocks_base.h shared/include/feature_blocks/mfx_feature_blocks_decl_blocks.h shared/include/feature_blocks/mfx_feature_blocks_init_macros.h shared/include/feature_blocks/mfx_feature_blocks_utils.h shared/include/mfx_utils_extbuf.h ${MSDK_CMAKE_BINARY_ROOT}/mfx_features.h # Cmake-generated configuration derived from BuildOptions ${MSDK_STUDIO_ROOT}/shared/include/mfx_config.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_common.h ${MSDK_STUDIO_ROOT}/shared/include/dispatch_session.h ${MSDK_STUDIO_ROOT}/shared/include/fast_copy_c_impl.h ${MSDK_STUDIO_ROOT}/shared/include/fast_copy.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_allocator.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core_factory.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core_interface.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core_operation.h ${MSDK_STUDIO_ROOT}/shared/include/mfxstructures-int.h ${MSDK_STUDIO_ROOT}/shared/include/mfxstructurespro.h ${MSDK_STUDIO_ROOT}/shared/include/mfxvideo++int.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_ext_buffers.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_reflect.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_timing.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_trace.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_umc_alloc_wrapper.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_utils.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_vpp_interface.h ${MSDK_STUDIO_ROOT}/shared/src/fast_copy_c_impl.cpp ${MSDK_STUDIO_ROOT}/shared/src/fast_copy.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_allocator.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_core.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_core_factory.cpp ${MSDK_STUDIO_ROOT}/shared/src/mfx_umc_alloc_wrapper.cpp ${MSDK_STUDIO_ROOT}/shared/src/mfx_umc_mjpeg_vpp.cpp ${MSDK_STUDIO_ROOT}/shared/src/mfx_static_assert_structs.cpp ) set(sources_hw ${MSDK_STUDIO_ROOT}/shared/include/libmfx_allocator_vaapi.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core_hw.h ${MSDK_STUDIO_ROOT}/shared/include/libmfx_core_vaapi.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_vpp_vaapi.h ${MSDK_STUDIO_ROOT}/shared/include/mfx_vpp_helper.h ${MSDK_STUDIO_ROOT}/shared/src/mfx_vpp_vaapi.cpp ${MSDK_STUDIO_ROOT}/shared/src/mfx_vpp_helper.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_allocator_vaapi.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_core_hw.cpp ${MSDK_STUDIO_ROOT}/shared/src/libmfx_core_vaapi.cpp ) add_library(mfxcore OBJECT) target_sources(mfxcore PRIVATE ${sources_common}) target_sources(mfxcore PRIVATE ${sources_hw}) if (CMAKE_SYSTEM_NAME MATCHES Linux) target_sources(mfxcore PRIVATE scheduler/linux/src/mfx_scheduler_core.cpp scheduler/linux/src/mfx_scheduler_core_ischeduler.cpp scheduler/linux/src/mfx_scheduler_core_iunknown.cpp scheduler/linux/src/mfx_scheduler_core_task.cpp scheduler/linux/src/mfx_scheduler_core_task_management.cpp scheduler/linux/src/mfx_scheduler_core_thread.cpp ) endif() set(HW_ONLY_LIBS asc $<$:mfx_ext> ) set(LIBS bitrate_control decode_hw encode_hw vpp_hw mfx_common_hw mfx_trace mfx_logging $<$:enctools_base> ${HW_ONLY_LIBS} $<$:itt> Threads::Threads ${CMAKE_DL_LIBS} $<$:cfgmgr32> ) target_compile_definitions(mfxcore PUBLIC MFX_VA ) target_include_directories(mfxcore PUBLIC scheduler/include ) if (CMAKE_SYSTEM_NAME MATCHES Linux) target_include_directories(mfxcore PUBLIC scheduler/linux/include ) endif() target_link_libraries(mfxcore PUBLIC ${LIBS} PRIVATE mfx_static_lib mfx_sdl_properties ) add_library(fast_copy_sse4 OBJECT ${MSDK_STUDIO_ROOT}/shared/include/fast_copy_sse4_impl.h ${MSDK_STUDIO_ROOT}/shared/src/fast_copy_sse4_impl.cpp ) target_include_directories(fast_copy_sse4 PRIVATE ${MSDK_STUDIO_ROOT}/shared/include ) target_link_libraries(fast_copy_sse4 PRIVATE bitrate_control mfx_require_sse4_properties ) if( DEFINED MFX_LIBNAME ) set( mfxlibname "${MFX_LIBNAME}") else() make_runtime_name( hw mfxlibname ) endif() message( DEBUG "Runtime name: ${mfxlibname}") add_library(${mfxlibname} SHARED) target_sources(${mfxlibname} PRIVATE $ ) target_link_libraries(${mfxlibname} PRIVATE mfxcore mfx_shared_lib mfx_sdl_properties ) target_link_options(${mfxlibname} PRIVATE $<$:LINKER:--version-script=${MSDK_LIB_ROOT}/libmfx-gen.map> ) get_mfx_version(mfx_version_major mfx_version_minor) set(libversion 1.${mfx_version_major}.${mfx_version_minor}) set(libsoversion 1.${mfx_version_major}) set_target_properties(${mfxlibname} PROPERTIES VERSION ${libversion} SOVERSION ${libsoversion} ) install(TARGETS ${mfxlibname} LIBRARY DESTINATION ${MFX_MODULES_DIR}) if (CMAKE_SYSTEM_NAME MATCHES Linux) set( PKG_CONFIG_FNAME "${CMAKE_LIB_DIR}/${CMAKE_BUILD_TYPE}/lib${mfxlibname}.pc") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pkg-config.pc.cmake" ${PKG_CONFIG_FNAME} @ONLY) install( FILES ${PKG_CONFIG_FNAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) endif() include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/000077500000000000000000000000001443134507600236005ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/CMakeLists.txt000066400000000000000000000223071443134507600263440ustar00rootroot00000000000000add_library(decode_hw STATIC) set(UMC_CODECS ${MSDK_UMC_ROOT}/codec) if (MFX_ENABLE_H264_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/h264_dec/include $<$:${MSDK_LIB_ROOT}/pxp/include> h264/include ) set(AVC_VIDEO_DECODE_SRC h264/include/mfx_h264_dec_decode.h h264/src/mfx_h264_dec_decode.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_au_splitter.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_dec_bitstream_headers.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_dec_debug.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_dec_defs_yuv.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_dec_mfx.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_dec_slice_decoder_decode_pic.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_frame.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_frame_list.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_heap.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_mfx_supplier.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_nal_spl.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_segment_decoder_dxva.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_slice_decoding.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_task_broker.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_task_supplier.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_va_packer.cpp ${UMC_CODECS}/h264_dec/src/umc_h264_va_supplier.cpp ) source_group("avc" FILES ${AVC_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_H265_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/h265_dec/include h265/include ) set(HEVC_VIDEO_DECODE_SRC h265/include/mfx_h265_dec_decode.h h265/src/mfx_h265_dec_decode.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_au_splitter.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_bitstream_headers.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_debug.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_frame.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_frame_info.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_frame_list.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_heap.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_mfx_supplier.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_nal_spl.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_scaling_list.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_segment_decoder_dxva.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_sei.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_slice_decoding.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_tables.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_task_broker.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_task_supplier.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_va_packer.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_va_packer_vaapi.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_va_packer_ms.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_va_packer_intel.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_va_supplier.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_yuv.cpp ${UMC_CODECS}/h265_dec/src/umc_h265_mfx_utils.cpp ) source_group("hevc" FILES ${HEVC_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_MJPEG_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/jpeg_dec/include ${UMC_CODECS}/jpeg_common/include ${MSDK_LIB_ROOT}/vpp/include ${MSDK_UMC_ROOT}/codec/color_space_converter/include mjpeg/include ) set(MJPEG_VIDEO_DECODE_SRC mjpeg/include/mfx_mjpeg_dec_decode.h mjpeg/src/mfx_mjpeg_dec_decode.cpp ${UMC_CODECS}/jpeg_common/src/bitstreamin.cpp ${UMC_CODECS}/jpeg_common/src/bitstreamout.cpp ${UMC_CODECS}/jpeg_common/src/colorcomp.cpp ${UMC_CODECS}/jpeg_common/src/jpegbase.cpp ${UMC_CODECS}/jpeg_common/src/membuffin.cpp ${UMC_CODECS}/jpeg_common/src/membuffout.cpp ${UMC_CODECS}/jpeg_dec/src/dechtbl.cpp ${UMC_CODECS}/jpeg_dec/src/decqtbl.cpp ${UMC_CODECS}/jpeg_dec/src/jpegdec.cpp ${UMC_CODECS}/jpeg_dec/src/jpegdec_base.cpp ${UMC_CODECS}/jpeg_dec/src/mfx_mjpeg_task.cpp ${UMC_CODECS}/jpeg_dec/src/umc_jpeg_frame_constructor.cpp ${UMC_CODECS}/jpeg_dec/src/umc_mjpeg_mfx_decode.cpp ${UMC_CODECS}/jpeg_dec/src/umc_mjpeg_mfx_decode_base.cpp ${UMC_CODECS}/jpeg_dec/src/umc_mjpeg_mfx_decode_hw.cpp ${UMC_CODECS}/color_space_converter/include/umc_color_space_conversion.h ${UMC_CODECS}/color_space_converter/include/umc_data_pointers_copy.h ${UMC_CODECS}/color_space_converter/include/umc_deinterlacing.h ${UMC_CODECS}/color_space_converter/include/umc_video_processing.h ${UMC_CODECS}/color_space_converter/include/umc_video_resizing.h ${UMC_CODECS}/color_space_converter/src/umc_video_processing.cpp ${UMC_CODECS}/color_space_converter/src/umc_video_resizing.cpp ${UMC_CODECS}/color_space_converter/src/umc_color_space_conversion.cpp ${UMC_CODECS}/color_space_converter/src/umc_deinterlacing.cpp ) source_group("mjpeg" FILES ${MJPEG_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_MPEG2_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/mpeg2_dec/include mpeg2/hw/include ) set(MPEG2_VIDEO_DECODE_SRC mpeg2/hw/include/mfx_mpeg2_decode.h mpeg2/hw/src/mfx_mpeg2_decode.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_bitstream.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_decoder.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_decoder_va.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_frame.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_slice.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_splitter.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_utils.cpp ${UMC_CODECS}/mpeg2_dec/src/umc_mpeg2_va_packer.cpp ) source_group("mpeg2" FILES ${MPEG2_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_VC1_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/vc1_common/include ${UMC_CODECS}/vc1_dec/include vc1/include ) set(VC1_VIDEO_DECODE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/vc1/src/mfx_vc1_decode.cpp ${UMC_CODECS}/vc1_common/src/umc_vc1_common.cpp ${UMC_CODECS}/vc1_common/src/umc_vc1_common_tables.cpp ${UMC_CODECS}/vc1_common/src/umc_vc1_common_tables_adv.cpp ${UMC_CODECS}/vc1_common/src/umc_vc1_spl_frame_constr.cpp ${UMC_CODECS}/vc1_common/src/umc_vc1_spl_tbl.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_huffman.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_bitplane.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_bpic.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_bpic_adv.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_frame_descr.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_frame_va.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_ipic.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_ipic_adv.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_pic_com.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_pic_com_adv.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_ppic.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_ppic_adv.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_seq.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_skipping.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_task_store.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_dec_vopdq.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_video_decoder.cpp ${UMC_CODECS}/vc1_dec/src/umc_vc1_video_decoder_hw.cpp ) source_group("vc1" FILES ${VC1_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_VP8_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC vp8/include ) set(VP8_VIDEO_DECODE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/vp8/src/mfx_vp8_dec_decode_common.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vp8/src/mfx_vp8_dec_decode_tables.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vp8/src/mfx_vp8_dec_decode_hw.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vp8/src/mfx_vp8_dec_decode_hw_vaapi.cpp ) source_group("vp8" FILES ${VP8_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_VP9_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/vp9_dec/include vp9/include ) set(VP9_VIDEO_DECODE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/vp9/src/mfx_vp9_dec_decode.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vp9/src/mfx_vp9_dec_decode_hw.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vp9/src/mfx_vp9_dec_decode_utils.cpp ${UMC_CODECS}/vp9_dec/src/umc_vp9_bitstream.cpp ${UMC_CODECS}/vp9_dec/src/umc_vp9_utils.cpp ${UMC_CODECS}/vp9_dec/src/umc_vp9_va_packer.cpp ) source_group("vp9" FILES ${VP9_VIDEO_DECODE_SRC}) endif() if (MFX_ENABLE_AV1_VIDEO_DECODE) target_include_directories(decode_hw PUBLIC ${UMC_CODECS}/vp9_dec/include ${UMC_CODECS}/av1_dec/include av1/include ) set(AV1_VIDEO_DECODE_SRC av1/src/mfx_av1_dec_decode.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_bitstream.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_decoder.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_decoder_va.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_frame.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_utils.cpp ${UMC_CODECS}/av1_dec/src/umc_av1_va_packer_vaapi.cpp ${UMC_CODECS}/vp9_dec/src/umc_vp9_bitstream.cpp ) source_group("av1" FILES ${AV1_VIDEO_DECODE_SRC}) endif() target_sources(decode_hw PRIVATE ${AVC_VIDEO_DECODE_SRC} ${HEVC_VIDEO_DECODE_SRC} ${MJPEG_VIDEO_DECODE_SRC} ${MPEG2_VIDEO_DECODE_SRC} ${VC1_VIDEO_DECODE_SRC} ${VP8_VIDEO_DECODE_SRC} ${VP9_VIDEO_DECODE_SRC} ${AV1_VIDEO_DECODE_SRC} ) target_include_directories(decode_hw PUBLIC ${MSDK_UMC_ROOT}/io/umc_va/include ) target_link_libraries(decode_hw PUBLIC mfx_static_lib umc_va_hw $<$:pxp_hw> PRIVATE mfx_sdl_properties ${IPP_LIBS} ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/av1/000077500000000000000000000000001443134507600242675ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/av1/include/000077500000000000000000000000001443134507600257125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/av1/include/mfx_av1_dec_decode.h000077500000000000000000000112171443134507600315470ustar00rootroot00000000000000// Copyright (c) 2014-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfx_common_int.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_defs.h" #include "umc_video_decoder.h" #include "mfx_umc_alloc_wrapper.h" #include #include #ifndef _MFX_AV1_DEC_DECODE_H_ #define _MFX_AV1_DEC_DECODE_H_ #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) namespace UMC_AV1_DECODER { class AV1Decoder; class AV1DecoderFrame; class AV1DecoderParams; } using UMC_AV1_DECODER::AV1DecoderFrame; class VideoDECODEAV1 : public VideoDECODE { struct TaskInfo { mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out; UMC::FrameMemID copyfromframe; }; public: VideoDECODEAV1(VideoCORE*, mfxStatus*); virtual ~VideoDECODEAV1(); static mfxStatus Query(VideoCORE*, mfxVideoParam* in, mfxVideoParam* out); static mfxStatus QueryIOSurf(VideoCORE*, mfxVideoParam*, mfxFrameAllocRequest*); static mfxStatus DecodeHeader(VideoCORE*, mfxBitstream*, mfxVideoParam*); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); virtual mfxStatus Init(mfxVideoParam*) override; virtual mfxStatus Reset(mfxVideoParam*) override; virtual mfxStatus Close() override; virtual mfxTaskThreadingPolicy GetThreadingPolicy() override; virtual mfxStatus GetVideoParam(mfxVideoParam*) override; virtual mfxStatus GetDecodeStat(mfxDecodeStat*) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream*, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, MFX_ENTRY_POINT*) override; virtual mfxStatus SetSkipMode(mfxSkipMode) override; virtual mfxStatus GetPayload(mfxU64* time_stamp, mfxPayload*) override; mfxStatus QueryFrame(mfxThreadTask); virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; private: static mfxStatus FillVideoParam(UMC_AV1_DECODER::AV1DecoderParams const*, mfxVideoParam*); static mfxStatus DecodeRoutine(void* state, void* param, mfxU32, mfxU32); static mfxStatus CompleteProc(void*, void* param, mfxStatus); mfxStatus SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out); AV1DecoderFrame* GetFrameToDisplay(); mfxStatus FillOutputSurface(mfxFrameSurface1** surface_out, mfxFrameSurface1* surface_work, AV1DecoderFrame*); mfxStatus DecodeFrame(mfxFrameSurface1 *surface_out, AV1DecoderFrame* pFrame); bool IsNeedChangeVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type) const; private: VideoCORE* m_core; std::mutex m_guard; std::unique_ptr m_surface_source; std::unique_ptr m_decoder; bool m_first_run; mfxVideoParamWrapper m_video_par; mfxVideoParamWrapper m_init_par; mfxVideoParamWrapper m_first_par; mfxFrameAllocRequest m_request; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; bool m_is_init; mfxF64 m_in_framerate; bool m_is_cscInUse; mfxU16 m_anchorFramesSource; UMC::VideoAccelerator* m_va; }; #endif // MFX_ENABLE_AV1_VIDEO_DECODE #endif // _MFX_AV1_DEC_DECODE_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/av1/src/000077500000000000000000000000001443134507600250565ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/av1/src/mfx_av1_dec_decode.cpp000077500000000000000000001214721443134507600312530ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) #include "mfx_session.h" #include "mfx_av1_dec_decode.h" #include "mfx_task.h" #include "mfx_common_int.h" #include "mfx_common_decode_int.h" #include "mfx_vpx_dec_common.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_av1_dec_defs.h" #include "umc_av1_frame.h" #include "umc_av1_utils.h" #include "libmfx_core_hw.h" #include "umc_va_base.h" #include "umc_av1_decoder_va.h" #include #include "libmfx_core_interface.h" #include "mfx_unified_av1d_logging.h" #if defined(MFX_ENABLE_PXP) #include "umc_va_protected.h" #endif // MFX_ENABLE_PXP namespace MFX_VPX_Utility { inline mfxU16 MatchProfile(mfxU32) { return MFX_PROFILE_AV1_MAIN; } inline bool CheckGUID(VideoCORE* core, eMFXHWType type, mfxVideoParam const* par) { mfxVideoParam vp = *par; mfxU16 profile = vp.mfx.CodecProfile & 0xFF; if (profile == MFX_PROFILE_UNKNOWN) { profile = MatchProfile(vp.mfx.FrameInfo.FourCC);; vp.mfx.CodecProfile = profile; } if (core->IsGuidSupported(DXVA_Intel_ModeAV1_VLD, &vp) != MFX_ERR_NONE) return false; switch (profile) { case MFX_PROFILE_AV1_MAIN: return true; default: return false; } } eMFXPlatform GetPlatform(VideoCORE* core, mfxVideoParam const* par) { assert(core); assert(par); if (!par) return MFX_PLATFORM_SOFTWARE; if(IsD3D9Simulation(*core)) return MFX_PLATFORM_SOFTWARE; eMFXPlatform platform = core->GetPlatformType(); return platform != MFX_PLATFORM_SOFTWARE && !CheckGUID(core, core->GetHWType(), par) ? MFX_PLATFORM_SOFTWARE : platform; } } static void SetFrameType(const UMC_AV1_DECODER::AV1DecoderFrame& frame, mfxFrameSurface1 &surface_out) { auto extFrameInfo = reinterpret_cast(GetExtendedBuffer(surface_out.Data.ExtParam, surface_out.Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO)); if (extFrameInfo == nullptr) return; const UMC_AV1_DECODER::FrameHeader& fh = frame.GetFrameHeader(); switch (fh.frame_type) { case UMC_AV1_DECODER::KEY_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_I; break; case UMC_AV1_DECODER::INTER_FRAME: case UMC_AV1_DECODER::INTRA_ONLY_FRAME: case UMC_AV1_DECODER::SWITCH_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_P; break; default: extFrameInfo->FrameType = MFX_FRAMETYPE_UNKNOWN; } } VideoDECODEAV1::VideoDECODEAV1(VideoCORE* core, mfxStatus* sts) : m_core(core) , m_first_run(true) , m_request() , m_response() , m_is_init(false) , m_in_framerate(0) , m_is_cscInUse(false) , m_anchorFramesSource(0) , m_va(nullptr) { if (sts) { *sts = MFX_ERR_NONE; } } VideoDECODEAV1::~VideoDECODEAV1() { if (m_is_init) { Close(); } } inline mfxU16 av1_mfx_profile_to_native_profile(mfxU16 mfx) { switch (mfx) { case MFX_PROFILE_AV1_MAIN: return 0; case MFX_PROFILE_AV1_HIGH: return 1; case MFX_PROFILE_AV1_PRO: return 2; default: return mfx; } } mfxStatus VideoDECODEAV1::Init(mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(par); std::lock_guard guard(m_guard); MFX_CHECK(!m_decoder, MFX_ERR_UNDEFINED_BEHAVIOR); eMFXPlatform platform = MFX_VPX_Utility::GetPlatform(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = m_core->GetHWType(); MFX_CHECK(CheckVideoParamDecoders(par, type) >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(MFX_VPX_Utility::CheckVideoParam(par, MFX_CODEC_AV1), MFX_ERR_INVALID_VIDEO_PARAM); m_first_par = (mfxVideoParamWrapper)(*par); m_video_par = m_first_par; m_decoder.reset(new UMC_AV1_DECODER::AV1DecoderVA()); m_request = {}; m_response = {}; m_response_alien = {}; mfxStatus sts = MFX_VPX_Utility::QueryIOSurfInternal(par, &m_request); uint32_t dpb_size = std::max(8 + par->AsyncDepth, 8); if (dpb_size >= m_request.NumFrameSuggested) { m_request.NumFrameSuggested = mfxU16(dpb_size + 1); } MFX_CHECK_STS(sts); m_init_par = (mfxVideoParamWrapper)(*par); if (0 == m_init_par.mfx.FrameInfo.FrameRateExtN || 0 == m_init_par.mfx.FrameInfo.FrameRateExtD) { m_init_par.mfx.FrameInfo.FrameRateExtD = 1; m_init_par.mfx.FrameInfo.FrameRateExtN = 30; } m_first_par = m_init_par; m_in_framerate = (mfxF64) m_first_par.mfx.FrameInfo.FrameRateExtD / m_first_par.mfx.FrameInfo.FrameRateExtN; m_decoder->SetInFrameRate(m_in_framerate); //mfxFrameAllocResponse response{}; bool internal = par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { #ifndef ENABLE_AV1D_POST_PROCESSING MFX_RETURN(MFX_ERR_UNSUPPORTED); #else MFX_CHECK(AV1DCaps::IsPostProcessSupported(m_core->GetHWType()) && (m_video_par.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY), MFX_ERR_UNSUPPORTED); if (par->mfx.FrameInfo.FourCC != videoProcessing->Out.FourCC)//csc is in use m_is_cscInUse = true; bool is_fourcc_supported = false; is_fourcc_supported = (videoProcessing->Out.FourCC == MFX_FOURCC_RGB4 || videoProcessing->Out.FourCC == MFX_FOURCC_NV12 || videoProcessing->Out.FourCC == MFX_FOURCC_P010 || videoProcessing->Out.FourCC == MFX_FOURCC_YUY2 || videoProcessing->Out.FourCC == MFX_FOURCC_AYUV || videoProcessing->Out.FourCC == MFX_FOURCC_Y410 || videoProcessing->Out.FourCC == MFX_FOURCC_Y210 || videoProcessing->Out.FourCC == MFX_FOURCC_Y216 || videoProcessing->Out.FourCC == MFX_FOURCC_Y416 || videoProcessing->Out.FourCC == MFX_FOURCC_P016 ); MFX_CHECK(is_fourcc_supported, MFX_ERR_UNSUPPORTED); if (m_core->GetVAType() == MFX_HW_VAAPI) internal = 1; #endif } #endif mfxFrameAllocRequest request_internal = m_request; { if (!internal) m_request.AllocId = par->AllocId; } MFX_CHECK_STS(sts); try { m_surface_source.reset(new SurfaceSource(m_core, *par, platform, m_request, request_internal, m_response, m_response_alien)); } catch (const std::system_error & ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } UMC_AV1_DECODER::AV1DecoderParams vp{}; vp.allocator = m_surface_source.get(); vp.async_depth = par->AsyncDepth; vp.film_grain = par->mfx.FilmGrain ? 1 : 0; // 0 - film grain is forced off, 1 - film grain is controlled by apply_grain syntax parameter if (!vp.async_depth) vp.async_depth = MFX_AUTO_ASYNC_DEPTH_VALUE; vp.io_pattern = par->IOPattern; sts = m_core->CreateVA(par, &m_request, &m_response, m_surface_source.get()); MFX_CHECK_STS(sts); m_core->GetVA((mfxHDL*)&m_va, MFX_MEMTYPE_FROM_DECODE); vp.pVideoAccelerator = m_va; ConvertMFXParamsToUMC(par, &vp); vp.info.profile = av1_mfx_profile_to_native_profile(par->mfx.CodecProfile); UMC::Status umcSts = m_decoder->Init(&vp); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_NOT_INITIALIZED); m_first_run = true; m_is_init = true; return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::QueryImplsDescription( VideoCORE&, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU32 SupportedProfiles[] = { MFX_PROFILE_AV1_MAIN , MFX_PROFILE_AV1_HIGH , MFX_PROFILE_AV1_PRO }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_P010 }; caps.CodecID = MFX_CODEC_AV1; caps.MaxcodecLevel = MFX_LEVEL_AV1_63; for (mfxU32 profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 16384, 16 }; memCaps.Height = { 16, 16384, 16 }; for (auto fcc : SupportedFourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } // Check if new parameters are compatible with old parameters bool VideoDECODEAV1::IsNeedChangeVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType /*type*/) const { auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY ; if ((newPar->IOPattern & mask) != (oldPar->IOPattern & mask) ) { return false; } if (CalculateAsyncDepth(newPar) != CalculateAsyncDepth(oldPar)) { return false; } mfxFrameAllocRequest requestOld{}; mfxFrameAllocRequest requestNew{}; mfxStatus mfxSts = MFX_VPX_Utility::QueryIOSurfInternal(oldPar, &requestOld); if (mfxSts != MFX_ERR_NONE) return false; mfxSts = MFX_VPX_Utility::QueryIOSurfInternal(newPar, &requestNew); if (mfxSts != MFX_ERR_NONE) return false; if (newPar->mfx.FrameInfo.Height > oldPar->mfx.FrameInfo.Height) { return false; } if (newPar->mfx.FrameInfo.Width > oldPar->mfx.FrameInfo.Width) { return false; } if (m_response.NumFrameActual) { if (requestNew.NumFrameMin > m_response.NumFrameActual) return false; } else { if (requestNew.NumFrameMin > requestOld.NumFrameMin || requestNew.Type != requestOld.Type) return false; } if (newPar->mfx.FrameInfo.FourCC != oldPar->mfx.FrameInfo.FourCC) { return false; } if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { return false; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * newVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(newPar->ExtParam, newPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxExtDecVideoProcessing * oldVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(oldPar->ExtParam, oldPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (((newVideoProcessing) && (!oldVideoProcessing)) || ((!newVideoProcessing) && (oldVideoProcessing))) return false; else if (newVideoProcessing && oldVideoProcessing) { if (newVideoProcessing->Out.Width > oldVideoProcessing->Out.Width) return false; if (newVideoProcessing->Out.Height > oldVideoProcessing->Out.Height) return false; /* Check Input cropping */ if (!((newVideoProcessing->In.CropX <= newVideoProcessing->In.CropW) && (newVideoProcessing->In.CropW <= newPar->mfx.FrameInfo.CropW) && (newVideoProcessing->In.CropY <= newVideoProcessing->In.CropH) && (newVideoProcessing->In.CropH <= newPar->mfx.FrameInfo.CropH))) return false; /* Check output cropping */ if (!((newVideoProcessing->Out.CropX <= newVideoProcessing->Out.CropW) && (newVideoProcessing->Out.CropW <= newVideoProcessing->Out.Width) && ((newVideoProcessing->Out.CropX + newVideoProcessing->Out.CropH) <= newVideoProcessing->Out.Width) && (newVideoProcessing->Out.CropY <= newVideoProcessing->Out.CropH) && (newVideoProcessing->Out.CropH <= newVideoProcessing->Out.Height) && ((newVideoProcessing->Out.CropY + newVideoProcessing->Out.CropH) <= newVideoProcessing->Out.Height))) return false; } #endif //MFX_DEC_VIDEO_POSTPROCESS_DISABLE return true; } mfxStatus VideoDECODEAV1::Reset(mfxVideoParam* par) { std::lock_guard guard(m_guard); MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_is_init, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); eMFXHWType type = m_core->GetHWType(); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_first_par.ExtParam, m_first_par.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing != nullptr) { // hardware resize is enabled bool hardwareUpscale = videoProcessing->Out.Width >= par->mfx.FrameInfo.Width || videoProcessing->Out.Height >= par->mfx.FrameInfo.Height; if (hardwareUpscale) { // for now only downscale is supported // at least Windows DirectX 11 provides only downscale interface // ID3D11VideoContext1->DecoderEnableDownsampling() MFX_RETURN( MFX_ERR_INVALID_VIDEO_PARAM); } } #endif eMFXPlatform platform = MFX_VPX_Utility::GetPlatform(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); MFX_CHECK(CheckVideoParamDecoders(par, type) >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(MFX_VPX_Utility::CheckVideoParam(par, MFX_CODEC_AV1, platform), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(IsNeedChangeVideoParam(par, &m_init_par, type), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_surface_source->Reset() == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_first_par = *par; if (0 == m_first_par.mfx.FrameInfo.FrameRateExtN || 0 == m_first_par.mfx.FrameInfo.FrameRateExtD) { m_first_par.mfx.FrameInfo.FrameRateExtD = 1; m_first_par.mfx.FrameInfo.FrameRateExtN = 30; } m_in_framerate = (mfxF64) m_first_par.mfx.FrameInfo.FrameRateExtD / m_first_par.mfx.FrameInfo.FrameRateExtN; m_decoder->SetInFrameRate(m_in_framerate); return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::Close() { std::lock_guard guard(m_guard); MFX_CHECK(m_is_init, MFX_ERR_NOT_INITIALIZED); m_decoder.reset(); m_surface_source->Close(); m_request = {}; m_response = {}; m_response_alien = {}; m_is_init = false; m_va = nullptr; return MFX_ERR_NONE; } mfxTaskThreadingPolicy VideoDECODEAV1::GetThreadingPolicy() { return MFX_TASK_THREADING_SHARED; } inline mfxStatus CheckLevel(mfxVideoParam* in, mfxVideoParam* out) { MFX_CHECK_NULL_PTR1(out); mfxStatus sts = MFX_ERR_NONE; if (in) { switch(in->mfx.CodecLevel) { case MFX_LEVEL_AV1_2: case MFX_LEVEL_AV1_21: case MFX_LEVEL_AV1_22: case MFX_LEVEL_AV1_23: case MFX_LEVEL_AV1_3: case MFX_LEVEL_AV1_31: case MFX_LEVEL_AV1_32: case MFX_LEVEL_AV1_33: case MFX_LEVEL_AV1_4: case MFX_LEVEL_AV1_41: case MFX_LEVEL_AV1_42: case MFX_LEVEL_AV1_43: case MFX_LEVEL_AV1_5: case MFX_LEVEL_AV1_51: case MFX_LEVEL_AV1_52: case MFX_LEVEL_AV1_53: case MFX_LEVEL_AV1_6: case MFX_LEVEL_AV1_61: case MFX_LEVEL_AV1_62: case MFX_LEVEL_AV1_63: out->mfx.CodecLevel = in->mfx.CodecLevel; break; default: sts = MFX_ERR_UNSUPPORTED; break; } } else out->mfx.CodecLevel = MFX_LEVEL_AV1_2; return sts; } mfxStatus VideoDECODEAV1::Query(VideoCORE* core, mfxVideoParam* in, mfxVideoParam* out) { MFX_CHECK(core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_NULL_PTR1(out); if (in) { MFX_CHECK((in->mfx.FrameInfo.PicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_SINGLE)) == 0, MFX_ERR_UNSUPPORTED); MFX_CHECK(in->Protected == 0, MFX_ERR_UNSUPPORTED); MFX_CHECK(in->Protected == 0, MFX_ERR_UNSUPPORTED); MFX_CHECK(in->mfx.ExtendedPicStruct == 0, MFX_ERR_UNSUPPORTED); } mfxStatus sts = MFX_VPX_Utility::Query(core, in, out, MFX_CODEC_AV1, core->GetHWType()); MFX_CHECK_STS(sts); eMFXPlatform platform = MFX_VPX_Utility::GetPlatform(core, out); if (platform != core->GetPlatformType()) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } sts = CheckLevel(in, out); MFX_CHECK_STS(sts); if (in) out->mfx.FilmGrain = in->mfx.FilmGrain; else out->mfx.FilmGrain = 1; MFX_CHECK_STS(sts); return sts; } mfxStatus VideoDECODEAV1::QueryIOSurf(VideoCORE* core, mfxVideoParam* par, mfxFrameAllocRequest* request) { MFX_CHECK(core, MFX_ERR_UNDEFINED_BEHAVIOR) MFX_CHECK_NULL_PTR2(par, request); auto const supportedMemoryType = (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!( par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY && par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY), MFX_ERR_INVALID_VIDEO_PARAM); mfxStatus sts = MFX_ERR_NONE; if (!(par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) { sts = MFX_VPX_Utility::QueryIOSurfInternal(par, request); uint32_t dpb_size = std::max(8 + par->AsyncDepth, 8); if (dpb_size >= request->NumFrameSuggested) { request->NumFrameSuggested = mfxU16(dpb_size + 1); } } else { request->Info = par->mfx.FrameInfo; request->NumFrameMin = 1; request->NumFrameSuggested = request->NumFrameMin + (par->AsyncDepth ? par->AsyncDepth : MFX_AUTO_ASYNC_DEPTH_VALUE); request->Type = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_FROM_DECODE; } sts = UpdateCscOutputFormat(par, request); MFX_CHECK_STS(sts); request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; return sts; } inline UMC::Status FillParam(mfxVideoParam *par) { if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) par->mfx.FrameInfo.Shift = 1; return UMC::UMC_OK; } mfxStatus VideoDECODEAV1::DecodeHeader(VideoCORE* core, mfxBitstream* bs, mfxVideoParam* par) { MFX_CHECK(core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_NULL_PTR3(bs, bs->Data, par); mfxStatus sts = MFX_ERR_NONE; try { MFXMediaDataAdapter in(bs); UMC_AV1_DECODER::AV1DecoderParams vp; sts = ConvertStatusUmc2Mfx(UMC_AV1_DECODER::AV1Decoder::DecodeHeader(&in, vp)); if (sts == MFX_ERR_MORE_DATA || sts == MFX_ERR_MORE_SURFACE) return sts; MFX_CHECK_STS(sts); sts = FillVideoParam(&vp, par); if (sts == MFX_ERR_MORE_DATA || sts == MFX_ERR_MORE_SURFACE) return sts; MFX_CHECK_STS(sts); } catch (UMC_AV1_DECODER::av1_exception const &ex) { sts = ConvertStatusUmc2Mfx(ex.GetStatus()); } return sts; } mfxStatus VideoDECODEAV1::GetVideoParam(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); std::lock_guard guard(m_guard); mfxStatus sts = MFX_ERR_NONE; UMC_AV1_DECODER::AV1DecoderParams vp; UMC::Status umcRes = m_decoder->GetInfo(&vp); MFX_CHECK(umcRes == UMC::UMC_OK, MFX_ERR_UNKNOWN); // fills par->mfx structure sts = FillVideoParam(&vp, par); MFX_CHECK_STS(sts); par->AsyncDepth = static_cast(vp.async_depth); par->IOPattern = static_cast(vp.io_pattern & ( MFX_IOPATTERN_OUT_VIDEO_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY)); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { mfxExtDecVideoProcessing * videoProcessingInternal = m_video_par.GetExtendedBuffer(MFX_EXTBUFF_DEC_VIDEO_PROCESSING); *videoProcessing = *videoProcessingInternal; } #endif par->mfx.FrameInfo.FrameRateExtN = m_init_par.mfx.FrameInfo.FrameRateExtN; par->mfx.FrameInfo.FrameRateExtD = m_init_par.mfx.FrameInfo.FrameRateExtD; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { if (m_init_par.mfx.FrameInfo.AspectRatioH || m_init_par.mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = m_init_par.mfx.FrameInfo.AspectRatioH; par->mfx.FrameInfo.AspectRatioW = m_init_par.mfx.FrameInfo.AspectRatioW; } else { par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; } } switch (par->mfx.FrameInfo.FourCC) { case MFX_FOURCC_P010: case MFX_FOURCC_Y210: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: par->mfx.FrameInfo.Shift = 1; default: break; } return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::GetDecodeStat(mfxDecodeStat* stat) { MFX_CHECK_NULL_PTR1(stat); return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::DecodeFrameCheck(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, MFX_ENTRY_POINT* entry_point) { MFX_CHECK_NULL_PTR1(entry_point); std::lock_guard guard(m_guard); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); #if defined(MFX_ENABLE_PXP) //Check protect VA is enabled or not if( bs && m_va && m_va->GetProtectedVA()) { MFX_CHECK((bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME), MFX_ERR_UNSUPPORTED); m_va->GetProtectedVA()->SetBitstream(bs); } #endif // MFX_ENABLE_PXP mfxStatus sts = SubmitFrame(bs, surface_work, surface_out); if (sts == MFX_ERR_MORE_DATA || sts == MFX_ERR_MORE_SURFACE) return sts; MFX_CHECK_STS(sts); std::unique_ptr info(new TaskInfo); info->copyfromframe = UMC::FRAME_MID_INVALID; info->surface_work = surface_work; if (*surface_out) info->surface_out = *surface_out; if(m_decoder->GetRepeatedFrame() != UMC::FRAME_MID_INVALID){ info->copyfromframe = m_decoder->GetRepeatedFrame(); } mfxThreadTask task = reinterpret_cast(info.release()); entry_point->pRoutine = &DecodeRoutine; entry_point->pCompleteProc = &CompleteProc; entry_point->pState = this; entry_point->requiredNumThreads = 1; entry_point->pParam = task; return sts; } mfxStatus VideoDECODEAV1::SetSkipMode(mfxSkipMode /*mode*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEAV1::GetPayload(mfxU64* /*time_stamp*/, mfxPayload* /*pPayload*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEAV1::DecodeFrame(mfxFrameSurface1 *surface_out, AV1DecoderFrame* frame) { MFX_CHECK(surface_out, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(frame, MFX_ERR_UNDEFINED_BEHAVIOR); surface_out->Data.Corrupted = 0; int32_t const error = frame->GetError(); if (error & UMC::ERROR_FRAME_DEVICE_FAILURE) { surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; MFX_CHECK(error != UMC::UMC_ERR_GPU_HANG, MFX_ERR_GPU_HANG); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } else { if (error & UMC::ERROR_FRAME_MINOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MINOR; if (error & UMC::ERROR_FRAME_MAJOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_REFERENCE_FRAME) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; if (error & UMC::ERROR_FRAME_DPB) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_LIST; if (error & UMC::ERROR_FRAME_RECOVERY) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_TOP_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_TOP_FIELD; if (error & UMC::ERROR_FRAME_BOTTOM_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_BOTTOM_FIELD; } UMC::FrameMemID id = frame->GetFrameData()->GetFrameMID(); mfxStatus sts = m_surface_source->PrepareToOutput(surface_out, id, &m_video_par); frame->Displayed(true); TRACE_EVENT(MFX_TRACE_API_AV1_DISPLAYINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( id, (uint32_t)frame->Displayed(), (uint32_t)frame->Outputted())); return sts; } mfxStatus VideoDECODEAV1::QueryFrame(mfxThreadTask task) { MFX_CHECK_NULL_PTR1(task); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); auto info = reinterpret_cast(task); UMC_AV1_DECODER::AV1DecoderFrame* frame = NULL; mfxFrameSurface1* surface_out = info->surface_out; MFX_CHECK_NULL_PTR1(surface_out); MFX_CHECK(surface_out, MFX_ERR_INVALID_HANDLE); if(info->copyfromframe != UMC::FRAME_MID_INVALID) { frame = m_decoder->DecodeFrameID(info->copyfromframe); MFX_CHECK(frame, MFX_ERR_UNDEFINED_BEHAVIOR); frame->Repeated(false); } else { MFX_CHECK(surface_out, MFX_ERR_UNDEFINED_BEHAVIOR); UMC::FrameMemID id = m_surface_source->FindSurface(surface_out); frame = m_decoder->FindFrameByMemID(id); MFX_CHECK(frame, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(frame->DecodingStarted(), MFX_ERR_UNDEFINED_BEHAVIOR); if (!frame->DecodingCompleted()) { m_decoder->QueryFrames(); } MFX_CHECK(frame->DecodingCompleted(), MFX_TASK_WORKING); } mfxStatus sts = DecodeFrame(surface_out, frame); m_decoder->Flush(); MFX_CHECK_STS(sts); return MFX_TASK_DONE; } static mfxStatus CheckFrameInfo(mfxFrameInfo &info) { MFX_SAFE_CALL(CheckFrameInfoCommon(&info, MFX_CODEC_AV1)); switch (info.FourCC) { case MFX_FOURCC_NV12: break; case MFX_FOURCC_P010: MFX_CHECK(info.Shift == 1, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); break; default: MFX_CHECK_STS(MFX_ERR_INVALID_VIDEO_PARAM); } switch (info.ChromaFormat) { case MFX_CHROMAFORMAT_YUV420: break; default: MFX_CHECK_STS(MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out) { bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_out); } else { MFX_CHECK_NULL_PTR2(surface_work, surface_out); } if (surface_work) { bool workSfsIsEmpty = IsSurfaceEmpty(*surface_work); MFX_CHECK(!workSfsIsEmpty, MFX_ERR_LOCK_MEMORY); mfxStatus sts = MFX_ERR_NONE; if (m_is_cscInUse != true) { sts = CheckFrameInfo(surface_work->Info); MFX_CHECK_STS(sts); } sts = CheckFrameData(surface_work); MFX_CHECK_STS(sts); } if (!bs) MFX_RETURN(MFX_ERR_MORE_DATA); mfxStatus sts = CheckBitstream(bs); MFX_CHECK_STS(sts); try { MFXMediaDataAdapter src(bs); for (;;) { sts = m_surface_source->SetCurrentMFXSurface(surface_work); MFX_CHECK_STS(sts); UMC::Status umcRes = m_surface_source->HasFreeSurface() ? m_decoder->GetFrame(bs ? &src : 0, nullptr) : UMC::UMC_ERR_NEED_FORCE_OUTPUT; UMC::Status umcFrameRes = umcRes; if (umcRes == UMC::UMC_NTF_NEW_RESOLUTION || umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS || umcRes == UMC::UMC_ERR_UNSUPPORTED) { UMC_AV1_DECODER::AV1DecoderParams vp; umcRes = m_decoder->GetInfo(&vp); FillVideoParam(&vp, &m_video_par); if (m_video_par.mfx.FrameInfo.Width != surface_work->Info.Width || m_video_par.mfx.FrameInfo.Height != surface_work->Info.Height) { MFX_RETURN(MFX_ERR_REALLOC_SURFACE); } m_video_par.AsyncDepth = static_cast(vp.async_depth); } if (umcFrameRes == UMC::UMC_NTF_NEW_RESOLUTION) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } if (umcRes == UMC::UMC_ERR_INVALID_STREAM) { umcRes = UMC::UMC_OK; } switch (umcRes) { case UMC::UMC_OK: if (!m_surface_source->HasFreeSurface()) { sts = MFX_ERR_MORE_SURFACE; umcFrameRes = UMC::UMC_ERR_NOT_ENOUGH_BUFFER; } break; case UMC::UMC_NTF_NEW_RESOLUTION: MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); case UMC::UMC_ERR_DEVICE_FAILED: sts = MFX_ERR_DEVICE_FAILED; break; case UMC::UMC_ERR_GPU_HANG: sts = MFX_ERR_GPU_HANG; break; case UMC::UMC_ERR_NOT_ENOUGH_BUFFER: case UMC::UMC_WRN_INFO_NOT_READY: case UMC::UMC_ERR_NEED_FORCE_OUTPUT: sts = umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER ? (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK: MFX_WRN_DEVICE_BUSY; break; case UMC::UMC_ERR_NOT_ENOUGH_DATA: case UMC::UMC_ERR_SYNC: sts = MFX_ERR_MORE_DATA; break; default: if (sts < 0 || umcRes < 0) sts = MFX_ERR_UNDEFINED_BEHAVIOR; break; } src.Save(bs); if (sts == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) { MFX_CHECK_STS(sts); } if (sts == MFX_ERR_DEVICE_FAILED || sts == MFX_ERR_GPU_HANG || sts == MFX_ERR_UNDEFINED_BEHAVIOR) { MFX_CHECK_STS(sts); } UMC_AV1_DECODER::AV1DecoderFrame* frame = m_decoder->GetCurrFrame(); if (frame && bs->TimeStamp != static_cast(MFX_TIMESTAMP_UNKNOWN)) frame->SetFrameTime(GetUmcTimeStamp(bs->TimeStamp)); frame = GetFrameToDisplay(); if (frame) { if (frame->Skipped()) { sts = MFX_ERR_MORE_DATA; break; } sts = FillOutputSurface(surface_out, surface_work, frame); return MFX_ERR_NONE; } if (umcFrameRes != UMC::UMC_OK) { break; } } // for (;;) } catch(UMC_AV1_DECODER::av1_exception const &ex) { sts = ConvertUMCStatusToMfx(ex.GetStatus()); } catch (std::bad_alloc const&) { sts = MFX_ERR_MEMORY_ALLOC; } catch(...) { sts = MFX_ERR_UNKNOWN; } if (sts == MFX_ERR_MORE_DATA) return sts; MFX_CHECK_STS(sts); return sts; } mfxStatus VideoDECODEAV1::DecodeRoutine(void* state, void* param, mfxU32, mfxU32) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "AV1DECODERoutine"); mfxStatus sts = MFX_ERR_NONE; try { auto decoder = reinterpret_cast(state); MFX_CHECK(decoder, MFX_ERR_UNDEFINED_BEHAVIOR); mfxThreadTask task = reinterpret_cast(param); MFX_CHECK(task, MFX_ERR_UNDEFINED_BEHAVIOR); sts = decoder->QueryFrame(task); MFX_CHECK_STS(sts); } catch(...) { MFX_LTRACE_MSG_1(MFX_TRACE_LEVEL_INTERNAL, "exception handled"); return MFX_ERR_NONE; } return sts; } mfxStatus VideoDECODEAV1::CompleteProc(void*, void* param, mfxStatus) { auto info = reinterpret_cast(param); delete info; return MFX_ERR_NONE; } inline mfxU16 color_format2bit_depth(UMC::ColorFormat format) { switch (format) { case UMC::NV12: case UMC::YUY2: case UMC::AYUV: return 8; case UMC::P010: case UMC::Y210: case UMC::Y410: return 10; case UMC::P016: case UMC::Y216: case UMC::Y416: return 12; default: return 0; } } inline mfxU16 color_format2chroma_format(UMC::ColorFormat format) { switch (format) { case UMC::NV12: case UMC::P010: case UMC::P016: return MFX_CHROMAFORMAT_YUV420; case UMC::YUY2: case UMC::Y210: case UMC::Y216: return MFX_CHROMAFORMAT_YUV422; case UMC::AYUV: case UMC::Y410: case UMC::Y416: return MFX_CHROMAFORMAT_YUV444; default: return MFX_CHROMAFORMAT_YUV420; } } inline mfxU16 av1_native_profile_to_mfx_profile(mfxU16 native) { switch (native) { case 0: return MFX_PROFILE_AV1_MAIN; case 1: return MFX_PROFILE_AV1_HIGH; case 2: return MFX_PROFILE_AV1_PRO; default: return 0; } } mfxStatus VideoDECODEAV1::FillVideoParam(UMC_AV1_DECODER::AV1DecoderParams const* vp, mfxVideoParam* par) { assert(vp); assert(par); mfxVideoParam p{}; ConvertUMCParamsToMFX(vp, &p); p.mfx.FrameInfo.BitDepthLuma = p.mfx.FrameInfo.BitDepthChroma = color_format2bit_depth(vp->info.color_format); p.mfx.FrameInfo.ChromaFormat = color_format2chroma_format(vp->info.color_format); par->mfx.FrameInfo = p.mfx.FrameInfo; par->mfx.CodecProfile = av1_native_profile_to_mfx_profile(p.mfx.CodecProfile); par->mfx.CodecLevel = p.mfx.CodecLevel; par->mfx.DecodedOrder = p.mfx.DecodedOrder; par->mfx.MaxDecFrameBuffering = p.mfx.MaxDecFrameBuffering; par->mfx.FilmGrain = static_cast(vp->film_grain); if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) par->mfx.FrameInfo.Shift = 1; return MFX_ERR_NONE; } UMC_AV1_DECODER::AV1DecoderFrame* VideoDECODEAV1::GetFrameToDisplay() { assert(m_decoder); UMC_AV1_DECODER::AV1DecoderFrame* frame = m_decoder->GetFrameToDisplay(); if (!frame) return nullptr; frame->Outputted(true); frame->ShowAsExisting(false); return frame; } inline void CopyFilmGrainParam(mfxExtAV1FilmGrainParam &extBuf, UMC_AV1_DECODER::FilmGrainParams const& par) { extBuf.FilmGrainFlags = 0; if (par.apply_grain) extBuf.FilmGrainFlags |= MFX_FILM_GRAIN_APPLY; extBuf.GrainSeed = (mfxU16)par.grain_seed; if (par.update_grain) extBuf.FilmGrainFlags |= MFX_FILM_GRAIN_UPDATE; extBuf.RefIdx = (mfxU8)par.film_grain_params_ref_idx; extBuf.NumYPoints = (mfxU8)par.num_y_points; for (int i = 0; i < UMC_AV1_DECODER::MAX_POINTS_IN_SCALING_FUNCTION_LUMA; i++) { extBuf.PointY[i].Value = (mfxU8)par.point_y_value[i]; extBuf.PointY[i].Scaling = (mfxU8)par.point_y_scaling[i]; } if (par.chroma_scaling_from_luma) extBuf.FilmGrainFlags |= MFX_FILM_GRAIN_CHROMA_SCALING_FROM_LUMA; extBuf.NumCbPoints = (mfxU8)par.num_cb_points; extBuf.NumCrPoints = (mfxU8)par.num_cr_points; for (int i = 0; i < UMC_AV1_DECODER::MAX_POINTS_IN_SCALING_FUNCTION_CHROMA; i++) { extBuf.PointCb[i].Value = (mfxU8)par.point_cb_value[i]; extBuf.PointCb[i].Scaling = (mfxU8)par.point_cb_scaling[i]; extBuf.PointCr[i].Value = (mfxU8)par.point_cr_value[i]; extBuf.PointCr[i].Scaling = (mfxU8)par.point_cr_scaling[i]; } extBuf.GrainScalingMinus8 = (mfxU8)par.grain_scaling - 8; extBuf.ArCoeffLag = (mfxU8)par.ar_coeff_lag; for (int i = 0; i < UMC_AV1_DECODER::MAX_AUTOREG_COEFFS_LUMA; i++) extBuf.ArCoeffsYPlus128[i] = (mfxU8)(par.ar_coeffs_y[i] + 128); for (int i = 0; i < UMC_AV1_DECODER::MAX_AUTOREG_COEFFS_CHROMA; i++) { extBuf.ArCoeffsCbPlus128[i] = (mfxU8)(par.ar_coeffs_cb[i] + 128); extBuf.ArCoeffsCrPlus128[i] = (mfxU8)(par.ar_coeffs_cr[i] + 128); } extBuf.ArCoeffShiftMinus6 = (mfxU8)par.ar_coeff_shift - 6; extBuf.GrainScaleShift = (mfxU8)par.grain_scale_shift; extBuf.CbMult = (mfxU8)par.cb_mult; extBuf.CbLumaMult = (mfxU8)par.cb_luma_mult; extBuf.CbOffset = (mfxU16)par.cb_offset; extBuf.CrMult = (mfxU8)par.cr_mult; extBuf.CrLumaMult = (mfxU8)par.cr_luma_mult; extBuf.CrOffset = (mfxU16)par.cr_offset; if (par.overlap_flag) extBuf.FilmGrainFlags |= MFX_FILM_GRAIN_OVERLAP; if (par.clip_to_restricted_range) extBuf.FilmGrainFlags |= MFX_FILM_GRAIN_CLIP_TO_RESTRICTED_RANGE; } mfxStatus VideoDECODEAV1::FillOutputSurface(mfxFrameSurface1** surf_out, mfxFrameSurface1* surface_work, UMC_AV1_DECODER::AV1DecoderFrame* pFrame) { MFX_CHECK_NULL_PTR2(pFrame, surf_out); UMC::FrameData const* fd = pFrame->GetFrameData(); MFX_CHECK(fd, MFX_ERR_DEVICE_FAILED); mfxVideoParam vp; *surf_out = m_surface_source->GetSurface(fd->GetFrameMID(), surface_work, &vp); MFX_CHECK(*surf_out != nullptr, MFX_ERR_INVALID_HANDLE); mfxFrameSurface1* surface_out = *surf_out; MFX_CHECK(surface_out, MFX_ERR_INVALID_HANDLE); SetFrameType(*pFrame, *surface_out); surface_out->Info.FrameId.TemporalId = 0; UMC::VideoDataInfo const* vi = fd->GetInfo(); MFX_CHECK(vi, MFX_ERR_DEVICE_FAILED); surface_out->Data.TimeStamp = GetMfxTimeStamp(pFrame->FrameTime()); surface_out->Data.FrameOrder = pFrame->FrameOrder(); surface_out->Data.Corrupted = 0; surface_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; surface_out->Info.CropW = static_cast(m_anchorFramesSource > 0 ? pFrame->GetRenderWidth() : pFrame->GetUpscaledWidth()); surface_out->Info.CropH = static_cast(m_anchorFramesSource > 0 ? pFrame->GetRenderHeight() : pFrame->GetFrameHeight()); surface_out->Info.AspectRatioW = 1; surface_out->Info.AspectRatioH = 1; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_video_par.ExtParam, m_video_par.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { surface_out->Info.CropH = videoProcessing->Out.CropH; surface_out->Info.CropW = videoProcessing->Out.CropW; surface_out->Info.CropX = videoProcessing->Out.CropX; surface_out->Info.CropY = videoProcessing->Out.CropY; } #endif bool isShouldUpdate = !(m_first_par.mfx.FrameInfo.FrameRateExtD || m_first_par.mfx.FrameInfo.FrameRateExtN); surface_out->Info.FrameRateExtD = isShouldUpdate ? m_init_par.mfx.FrameInfo.FrameRateExtD : m_first_par.mfx.FrameInfo.FrameRateExtD; surface_out->Info.FrameRateExtN = isShouldUpdate ? m_init_par.mfx.FrameInfo.FrameRateExtN : m_first_par.mfx.FrameInfo.FrameRateExtN; TRACE_BUFFER_EVENT(MFX_TRACE_API_AV1_OUTPUTINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, surface_out, AV1DecodeSurfaceOutparam, SURFACEOUT_AV1D); return MFX_ERR_NONE; } mfxStatus VideoDECODEAV1::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h264/000077500000000000000000000000001443134507600242635ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h264/include/000077500000000000000000000000001443134507600257065ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h264/include/mfx_h264_dec_decode.h000066400000000000000000000115631443134507600315400ustar00rootroot00000000000000// Copyright (c) 2004-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_defs.h" #ifndef _MFX_H264_DEC_DECODE_H_ #define _MFX_H264_DEC_DECODE_H_ #include "mfx_common_int.h" #include "umc_video_decoder.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_mutex.h" #include #include #include #include "mfx_task.h" namespace UMC { class MFXTaskSupplier; class MFX_SW_TaskSupplier; class VATaskSupplier; class H264DecoderFrame; class VideoData; } // namespace UMC typedef UMC::VATaskSupplier MFX_AVC_Decoder; struct ThreadTaskInfo264; class VideoDECODE; class VideoDECODEH264 : public VideoDECODE { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); VideoDECODEH264(VideoCORE *core, mfxStatus * sts); virtual ~VideoDECODEH264(void); mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) override; virtual mfxStatus DecodeFrame(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out); virtual mfxStatus GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts); virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override; virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; mfxStatus RunThread(ThreadTaskInfo264*, mfxU32 /*threadNumber*/); virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; protected: static mfxStatus QueryIOSurfInternal(eMFXHWType type, mfxVideoParam *par, mfxFrameAllocRequest *request); bool IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type); void FillOutputSurface(mfxFrameSurface1 **surface_out, mfxFrameSurface1 *surface_work, UMC::H264DecoderFrame * pFrame); UMC::H264DecoderFrame * GetFrameToDisplay(bool force); mfxStatus DecodeFrame(mfxFrameSurface1 *surface_out, UMC::H264DecoderFrame * pFrame = 0); mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out); void CopySurfaceInfo(mfxFrameSurface1 *in, mfxFrameSurface1 *out); mfxStatus SetTargetViewList(mfxVideoParam *par); mfxU16 GetChangedProfile(mfxVideoParam *par); void FillVideoParam(mfxVideoParamWrapper *par, bool full); mfxFrameSurface1 * GetInternalSurface(mfxFrameSurface1 *surface) override; std::unique_ptr m_pH264VideoDecoder; mfx_UMC_MemAllocator m_MemoryAllocator; std::unique_ptr m_surface_source; mfxVideoParamWrapper m_vInitPar; mfxVideoParamWrapper m_vFirstPar; mfxVideoParamWrapper m_vPar; ExtendedBuffer m_extBuffers; VideoCORE * m_core; bool m_isInit; mfxU16 m_frameOrder; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; mfxDecodeStat m_stat = {}; UMC::Mutex m_mGuard; bool m_useDelayedDisplay; UMC::VideoAccelerator * m_va; enum { NUMBER_OF_ADDITIONAL_FRAMES = 10 }; volatile bool m_globalTask; bool m_isFirstRun; }; #endif // _MFX_H264_DEC_DECODE_H_ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h264/src/000077500000000000000000000000001443134507600250525ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp000066400000000000000000001746571443134507600312550ustar00rootroot00000000000000// Copyright (c) 2004-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include /* for std::find on Linux/Android */ #include "mfx_h264_dec_decode.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "mfx_common.h" #include "mfx_common_decode_int.h" // debug #include "umc_h264_frame_list.h" #include "umc_h264_va_supplier.h" #include "umc_va_video_processing.h" #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_h264_supplier.h" #endif // MFX_ENABLE_PXP #include "libmfx_core_interface.h" #include "mfx_utils.h" #include "mfx_unified_h264d_logging.h" inline bool IsNeedToUseHWBuffering(eMFXHWType /*type*/) { return false; } inline bool IsBigSurfacePoolApplicable(eMFXHWType type) { bool ret = false; (void)(type); //UNREFERENCED_PARAMETER return ret; } struct ThreadTaskInfo264 { mfxFrameSurface1* surface_out = nullptr; bool is_decoding_done = false; ThreadTaskInfo264(mfxFrameSurface1* out) : surface_out(out) {} }; enum { ENABLE_DELAYED_DISPLAY_MODE = 1 }; typedef std::vector ViewIDsList; inline bool AddDependency(uint32_t dependOnViewId, const ViewIDsList & targetList, ViewIDsList &dependencyList) { ViewIDsList::const_iterator view_iter = std::find(targetList.begin(), targetList.end(), dependOnViewId); if (view_iter == targetList.end()) { view_iter = std::find(dependencyList.begin(), dependencyList.end(), dependOnViewId); if (view_iter == dependencyList.end()) { dependencyList.push_back(dependOnViewId); } return true; } return false; } mfxStatus Dependency(mfxExtMVCSeqDesc * mvcPoints, ViewIDsList & targetList, ViewIDsList &dependencyList) { for (mfxU32 i = 0; i < targetList.size(); ++i) { mfxU32 viewId = targetList[i]; // find view dependency mfxMVCViewDependency * refInfo = 0; for (mfxU32 k = 0; k < mvcPoints->NumView; k++) { if (mvcPoints->View[k].ViewId == viewId) { refInfo = &mvcPoints->View[k]; break; } } MFX_CHECK(refInfo, MFX_ERR_INVALID_VIDEO_PARAM); bool wasAdded = false; for (mfxU32 j = 0; j < refInfo->NumAnchorRefsL0; j++) { wasAdded = wasAdded || AddDependency(refInfo->AnchorRefL0[j], targetList, dependencyList); } for (mfxU32 j = 0; j < refInfo->NumAnchorRefsL1; j++) { wasAdded = wasAdded || AddDependency(refInfo->AnchorRefL1[j], targetList, dependencyList); } for (mfxU32 j = 0; j < refInfo->NumNonAnchorRefsL0; j++) { wasAdded = wasAdded || AddDependency(refInfo->NonAnchorRefL0[j], targetList, dependencyList); } for (mfxU32 j = 0; j < refInfo->NumNonAnchorRefsL1; j++) { wasAdded = wasAdded || AddDependency(refInfo->NonAnchorRefL1[j], targetList, dependencyList); } if (wasAdded) { i = 0; } } return MFX_ERR_NONE; } mfxStatus Dependency(mfxExtMVCSeqDesc * mvcPoints, mfxExtMVCTargetViews * targetViews, ViewIDsList &targetList, ViewIDsList &dependencyList) { targetList.reserve(targetViews->NumView); for (uint32_t i = 0; i < targetViews->NumView; i++) { targetList.push_back(targetViews->ViewId[i]); } mfxStatus sts = Dependency(mvcPoints, targetList, dependencyList); MFX_CHECK(sts >= MFX_ERR_NONE, sts); sts = Dependency(mvcPoints, dependencyList, dependencyList); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return MFX_ERR_NONE; } mfxU32 CalculateRequiredView(mfxVideoParam *par) { if (!IsMVCProfile(par->mfx.CodecProfile)) return 1; mfxExtMVCSeqDesc * mvcPoints = (mfxExtMVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (!mvcPoints) return 1; mfxExtMVCTargetViews * targetViews = (mfxExtMVCTargetViews *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); ViewIDsList viewList; ViewIDsList dependencyList; if (!targetViews) { return mvcPoints->NumView; } mfxStatus sts = Dependency(mvcPoints, targetViews, viewList, dependencyList); if (sts < MFX_ERR_NONE) return 1; return (mfxU32)(viewList.size() + dependencyList.size()); } VideoDECODEH264::VideoDECODEH264(VideoCORE *core, mfxStatus * sts) : VideoDECODE() , m_core(core) , m_isInit(false) , m_frameOrder((mfxU16)MFX_FRAMEORDER_UNKNOWN) , m_response() , m_response_alien() , m_useDelayedDisplay(false) , m_va(0) , m_globalTask(false) , m_isFirstRun(true) { if (sts) { *sts = MFX_ERR_NONE; } } VideoDECODEH264::~VideoDECODEH264(void) { Close(); } mfxStatus VideoDECODEH264::Init(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(!m_isInit, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_NULL_PTR1(par); eMFXPlatform platform = MFX_Utility::GetPlatform(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = m_core->GetHWType(); mfxStatus mfxSts = CheckVideoParamDecoders(par, type); MFX_CHECK(mfxSts >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); bool videoParamIsValid = MFX_Utility::CheckVideoParam(par, type); MFX_CHECK(videoParamIsValid, MFX_ERR_INVALID_VIDEO_PARAM); if (m_core->GetVAType() == MFX_HW_VAAPI) { mfxU16 codecProfile = par->mfx.CodecProfile & 0xFF; MFX_CHECK(codecProfile != MFX_PROFILE_AVC_STEREO_HIGH && codecProfile != MFX_PROFILE_AVC_MULTIVIEW_HIGH, MFX_ERR_INVALID_VIDEO_PARAM); #ifdef MFX_ENABLE_SVC_VIDEO_DECODE MFX_CHECK(codecProfile != MFX_PROFILE_AVC_SCALABLE_BASELINE && codecProfile != MFX_PROFILE_AVC_SCALABLE_HIGH, MFX_ERR_INVALID_VIDEO_PARAM); #endif } m_vInitPar = *par; m_vFirstPar = *par; m_vFirstPar.mfx.NumThread = 0; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_vFirstPar); m_vPar = m_vFirstPar; m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); mfxU32 asyncDepth = CalculateAsyncDepth(par); m_vPar.mfx.NumThread = (mfxU16)CalculateNumThread(par); m_useDelayedDisplay = ENABLE_DELAYED_DISPLAY_MODE != 0 && IsNeedToUseHWBuffering(m_core->GetHWType()) && (asyncDepth != 1); bool bUseBigSurfaceWA = IsBigSurfacePoolApplicable(type); int32_t useInternal = m_vPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { MFX_CHECK((m_vPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY), MFX_ERR_UNSUPPORTED); //PicStruct support differs, need to check per-platform if (H264DCaps::IsOnlyProgressivePicStructSupported(m_core->GetHWType())) { MFX_CHECK(m_vPar.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE, MFX_ERR_UNSUPPORTED); } bool is_fourcc_supported = ( videoProcessing->Out.FourCC == MFX_FOURCC_RGB4 || videoProcessing->Out.FourCC == MFX_FOURCC_NV12 || videoProcessing->Out.FourCC == MFX_FOURCC_P010 || videoProcessing->Out.FourCC == MFX_FOURCC_YUY2 || videoProcessing->Out.FourCC == MFX_FOURCC_AYUV || videoProcessing->Out.FourCC == MFX_FOURCC_Y410 || videoProcessing->Out.FourCC == MFX_FOURCC_Y210 || videoProcessing->Out.FourCC == MFX_FOURCC_Y216 || videoProcessing->Out.FourCC == MFX_FOURCC_Y416 || videoProcessing->Out.FourCC == MFX_FOURCC_P016); MFX_CHECK(is_fourcc_supported,MFX_ERR_UNSUPPORTED); if (m_core->GetVAType() == MFX_HW_VAAPI) useInternal = true; } #endif // allocate memory mfxFrameAllocRequest request; mfxFrameAllocRequest request_internal; memset(&request, 0, sizeof(request)); memset(&m_response, 0, sizeof(m_response)); memset(&m_response_alien, 0, sizeof(m_response_alien)); mfxSts = QueryIOSurfInternal(type, &m_vPar, &request); MFX_CHECK_STS(mfxSts); bool* isD3D9On11Core = QueryCoreInterface(m_core, MFXI_IS_CORED3D9ON11_GUID); if (isD3D9On11Core && (*isD3D9On11Core) == true) useInternal = true; request.Type |= useInternal ? MFX_MEMTYPE_INTERNAL_FRAME : MFX_MEMTYPE_EXTERNAL_FRAME; request_internal = request; try { m_surface_source.reset(new SurfaceSource(m_core, *par, platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } mfxU16 oldProfile = m_vFirstPar.mfx.CodecProfile; m_vFirstPar.mfx.CodecProfile = GetChangedProfile(&m_vFirstPar); mfxSts = m_core->CreateVA(&m_vFirstPar, &request, &m_response, m_surface_source.get()); MFX_CHECK(mfxSts >= MFX_ERR_NONE, mfxSts); UMC::Status umcSts = m_MemoryAllocator.InitMem(0, m_core); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); UMC::H264VideoDecoderParams umcVideoParams; ConvertMFXParamsToUMC(&m_vFirstPar, &umcVideoParams); umcVideoParams.numThreads = m_vPar.mfx.NumThread; umcVideoParams.m_bufferedFrames = (asyncDepth > mfxU32(umcVideoParams.numThreads)) ? asyncDepth - umcVideoParams.numThreads : 0; m_core->GetVA((mfxHDL*)&m_va, MFX_MEMTYPE_FROM_DECODE); umcVideoParams.pVideoAccelerator = m_va; #if defined(MFX_ENABLE_PXP) if (m_va->GetProtectedVA()) m_pH264VideoDecoder.reset(bUseBigSurfaceWA ? new UMC::VATaskSupplierBigSurfacePool() : new UMC::PXPH264Supplier()); // HW else #endif // MFX_ENABLE_PXP m_pH264VideoDecoder.reset(bUseBigSurfaceWA ? new UMC::VATaskSupplierBigSurfacePool() : new UMC::VATaskSupplier()); // HW m_pH264VideoDecoder->SetFrameAllocator(m_surface_source.get()); static_cast(m_pH264VideoDecoder.get())->SetVideoHardwareAccelerator(m_va); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (m_va->GetVideoProcessingVA()) { umcSts = m_va->GetVideoProcessingVA()->Init(par, videoProcessing); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_INVALID_VIDEO_PARAM); } #endif umcVideoParams.lpMemoryAllocator = &m_MemoryAllocator; umcVideoParams.m_ignore_level_constrain = par->mfx.IgnoreLevelConstrain; umcSts = m_pH264VideoDecoder->Init(&umcVideoParams); if (umcSts != UMC::UMC_OK) { MFX_RETURN(ConvertUMCStatusToMfx(umcSts)); } m_vFirstPar.mfx.CodecProfile = oldProfile; SetTargetViewList(&m_vFirstPar); m_isInit = true; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_globalTask = false; m_isFirstRun = true; if (m_useDelayedDisplay) { ((UMC::VATaskSupplier*)m_pH264VideoDecoder.get())->SetBufferedFramesNumber(NUMBER_OF_ADDITIONAL_FRAMES); } m_pH264VideoDecoder->SetVideoParams(&m_vFirstPar); MFX_CHECK(platform == m_core->GetPlatformType(), MFX_ERR_UNSUPPORTED); if (isNeedChangeVideoParamWarning) { MFX_RETURN(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::QueryImplsDescription( VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU16 SupportedProfiles[] = { MFX_PROFILE_AVC_BASELINE , MFX_PROFILE_AVC_MAIN , MFX_PROFILE_AVC_HIGH , MFX_PROFILE_AVC_HIGH_422 , MFX_PROFILE_AVC_EXTENDED #ifdef MFX_ENABLE_SVC_VIDEO_DECODE , MFX_PROFILE_AVC_SCALABLE_BASELINE , MFX_PROFILE_AVC_SCALABLE_HIGH #endif , MFX_PROFILE_AVC_MULTIVIEW_HIGH , MFX_PROFILE_AVC_STEREO_HIGH }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 }; caps.CodecID = MFX_CODEC_AVC; caps.MaxcodecLevel = MFX_LEVEL_AVC_62; mfxVideoParam par; memset(&par, 0, sizeof(par)); par.mfx.CodecId = MFX_CODEC_AVC; par.mfx.CodecLevel = caps.MaxcodecLevel; mfxStatus sts = MFX_ERR_NONE; for (mfxU16 profile : SupportedProfiles) { par.mfx.CodecProfile = profile; // Set FourCC to pass IsNeedPartialAcceleration check par.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; sts = VideoDECODEH264::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 4096, 16 }; memCaps.Height = { 16, 4096, 16 }; for (auto fcc : SupportedFourCC) { par.mfx.FrameInfo.FourCC = fcc; sts = VideoDECODEH264::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } mfxU16 VideoDECODEH264::GetChangedProfile(mfxVideoParam *par) { #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (IsSVCProfile(par->mfx.CodecProfile)) { mfxExtSvcTargetLayer * svcTarget = (mfxExtSvcTargetLayer*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (svcTarget && !svcTarget->TargetDependencyID && !svcTarget->TargetQualityID) { return MFX_PROFILE_AVC_HIGH; } } #endif if (!IsMVCProfile(par->mfx.CodecProfile)) return par->mfx.CodecProfile; mfxExtMVCTargetViews * targetViews = (mfxExtMVCTargetViews *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (targetViews && targetViews->NumView == 1 && targetViews->ViewId[0] == 0) { return MFX_PROFILE_AVC_HIGH; } return par->mfx.CodecProfile; } mfxStatus VideoDECODEH264::SetTargetViewList(mfxVideoParam *par) { #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (IsSVCProfile(par->mfx.CodecProfile)) { mfxExtSvcTargetLayer * svcTarget = (mfxExtSvcTargetLayer*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (svcTarget) { m_pH264VideoDecoder->SetSVCTargetLayer(svcTarget->TargetDependencyID, svcTarget->TargetQualityID, svcTarget->TargetTemporalID); } else { mfxExtSVCSeqDesc * svcDesc = (mfxExtSVCSeqDesc*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); if (svcDesc) { mfxU32 maxDependencyId = 0; for (size_t i = 0; i < sizeof(svcDesc->DependencyLayer)/sizeof(svcDesc->DependencyLayer[0]); i++) { if (svcDesc->DependencyLayer[i].Active) maxDependencyId = (mfxU32)i; } m_pH264VideoDecoder->SetSVCTargetLayer(maxDependencyId, UMC::H264_MAX_QUALITY_ID, UMC::H264_MAX_TEMPORAL_ID); } } } #endif ViewIDsList viewList; ViewIDsList dependencyList; mfxExtMVCSeqDesc * mvcPoints = (mfxExtMVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (!mvcPoints) { viewList.push_back(0); // base view only m_pH264VideoDecoder->SetViewList(viewList, dependencyList); return MFX_ERR_NONE; } mfxExtMVCTargetViews * targetViews = (mfxExtMVCTargetViews *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (targetViews) { mfxStatus sts = Dependency(mvcPoints, targetViews, viewList, dependencyList); MFX_CHECK(sts >= MFX_ERR_NONE, sts); m_pH264VideoDecoder->SetTemporalId(targetViews->TemporalId); } m_pH264VideoDecoder->SetViewList(viewList, dependencyList); return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::Reset(mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::Reset"); UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); eMFXHWType type = m_core->GetHWType(); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * extVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (extVideoProcessing != nullptr) { if (extVideoProcessing->Out.Width >= par->mfx.FrameInfo.Width || extVideoProcessing->Out.Height >= par->mfx.FrameInfo.Height) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } #endif eMFXPlatform platform = MFX_Utility::GetPlatform(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); mfxStatus mfxSts = CheckVideoParamDecoders(par, type); MFX_CHECK(mfxSts >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); bool videoParamIsValid = MFX_Utility::CheckVideoParam(par, type); MFX_CHECK(videoParamIsValid, MFX_ERR_INVALID_VIDEO_PARAM); bool videoParamIsSame = IsSameVideoParam(par, &m_vInitPar, type); MFX_CHECK(videoParamIsSame, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_pH264VideoDecoder->Reset(); SetTargetViewList(par); UMC::Status umcSts = m_surface_source->Reset(); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_globalTask = false; m_isFirstRun = true; memset(&m_stat, 0, sizeof(m_stat)); m_vFirstPar = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_vFirstPar); m_vPar = m_vFirstPar; m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); m_vPar.mfx.NumThread = (mfxU16)CalculateNumThread(par); m_pH264VideoDecoder->SetVideoParams(&m_vFirstPar); MFX_CHECK(platform == m_core->GetPlatformType(), MFX_ERR_UNSUPPORTED); if (isNeedChangeVideoParamWarning) { MFX_RETURN(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE /* in case of mfxExtDecVideoProcessing (SFC) usage * required to set new params for UMC::VideoProcessingVA * is mfxExtDecVideoProcessing attached or not - checked in IsSameVideoParam */ auto videoProcessing = reinterpret_cast(GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING)); if (m_va->GetVideoProcessingVA()) { umcSts = m_va->GetVideoProcessingVA()->Init(par, videoProcessing); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_INVALID_VIDEO_PARAM); } #endif //MFX_DEC_VIDEO_POSTPROCESS_DISABLE return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::Close(void) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit && m_pH264VideoDecoder.get(), MFX_ERR_NOT_INITIALIZED); m_pH264VideoDecoder->Close(); m_surface_source->Close(); m_isInit = false; m_isFirstRun = true; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_va = 0; memset(&m_stat, 0, sizeof(m_stat)); return MFX_ERR_NONE; } mfxTaskThreadingPolicy VideoDECODEH264::GetThreadingPolicy(void) { return MFX_TASK_THREADING_SHARED; } mfxStatus VideoDECODEH264::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::Query"); MFX_CHECK_NULL_PTR1(out); eMFXPlatform platform = MFX_Utility::GetPlatform(core, in); eMFXHWType type = MFX_HW_UNKNOWN; if (platform == MFX_PLATFORM_HARDWARE) { type = core->GetHWType(); } mfxStatus mfxSts = MFX_Utility::Query(core, in, out, type); MFX_CHECK_STS(mfxSts); return mfxSts; } mfxStatus VideoDECODEH264::GetVideoParam(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); FillVideoParam(&m_vPar, true); par->mfx = m_vPar.mfx; par->Protected = m_vPar.Protected; par->IOPattern = m_vPar.IOPattern; par->AsyncDepth = m_vPar.AsyncDepth; mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { mfxExtVideoSignalInfo * videoSignalInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); *videoSignal = *videoSignalInternal; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { mfxExtDecVideoProcessing * videoProcessingInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_DEC_VIDEO_PROCESSING); *videoProcessing = *videoProcessingInternal; } #endif // mvc headers mfxExtMVCSeqDesc * mvcSeqDesc = (mfxExtMVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); mfxExtMVCSeqDesc * mvcSeqDescInternal = (mfxExtMVCSeqDesc *)GetExtendedBuffer(m_vPar.ExtParam, m_vPar.NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (mvcSeqDesc && mvcSeqDescInternal && mvcSeqDescInternal->NumView) { mvcSeqDesc->NumView = mvcSeqDescInternal->NumView; mvcSeqDesc->NumViewId = mvcSeqDescInternal->NumViewId; mvcSeqDesc->NumOP = mvcSeqDescInternal->NumOP; MFX_CHECK(mvcSeqDesc->NumViewAlloc >= mvcSeqDescInternal->NumView && mvcSeqDesc->NumViewIdAlloc >= mvcSeqDescInternal->NumViewId && mvcSeqDesc->NumOPAlloc >= mvcSeqDescInternal->NumOP, MFX_ERR_NOT_ENOUGH_BUFFER); std::copy(mvcSeqDescInternal->View, mvcSeqDescInternal->View + mvcSeqDescInternal->NumView, mvcSeqDesc->View); std::copy(mvcSeqDescInternal->ViewId, mvcSeqDescInternal->ViewId + mvcSeqDescInternal->NumViewId, mvcSeqDesc->ViewId); std::copy(mvcSeqDescInternal->OP, mvcSeqDescInternal->OP + mvcSeqDescInternal->NumOP, mvcSeqDesc->OP); mfxU16 * targetView = mvcSeqDesc->ViewId; for (mfxU32 i = 0; i < mvcSeqDesc->NumOP; i++) { mvcSeqDesc->OP[i].TargetViewId = targetView; targetView += mvcSeqDesc->OP[i].NumTargetViews; } } mfxExtMVCTargetViews * mvcTarget = (mfxExtMVCTargetViews *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); mfxExtMVCTargetViews * mvcTargetInternal = (mfxExtMVCTargetViews *)GetExtendedBuffer(m_vPar.ExtParam, m_vPar.NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (mvcTarget && mvcTargetInternal && mvcTargetInternal->NumView) { *mvcTarget = *mvcTargetInternal; } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc * svcSeqDesc = (mfxExtSVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); mfxExtSVCSeqDesc * svcSeqDescInternal = (mfxExtSVCSeqDesc *)GetExtendedBuffer(m_vPar.ExtParam, m_vPar.NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); if (svcSeqDesc && svcSeqDescInternal) { *svcSeqDesc = *svcSeqDescInternal; } mfxExtSvcTargetLayer * svcTarget = (mfxExtSvcTargetLayer *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); mfxExtSvcTargetLayer * svcTargetInternal = (mfxExtSvcTargetLayer *)GetExtendedBuffer(m_vPar.ExtParam, m_vPar.NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (svcTarget && svcTargetInternal) { *svcTarget = *svcTargetInternal; } #endif // sps/pps headers mfxExtCodingOptionSPSPPS * spsPps = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (spsPps) { mfxExtCodingOptionSPSPPS * spsPpsInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); spsPps->SPSId = spsPpsInternal->SPSId; spsPps->PPSId = spsPpsInternal->PPSId; MFX_CHECK(spsPps->SPSBufSize >= spsPpsInternal->SPSBufSize && spsPps->PPSBufSize >= spsPpsInternal->PPSBufSize, MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->SPSBufSize = spsPpsInternal->SPSBufSize; spsPps->PPSBufSize = spsPpsInternal->PPSBufSize; std::copy(spsPpsInternal->SPSBuffer, spsPpsInternal->SPSBuffer + spsPps->SPSBufSize, spsPps->SPSBuffer); std::copy(spsPpsInternal->PPSBuffer, spsPpsInternal->PPSBuffer + spsPps->PPSBufSize, spsPps->PPSBuffer); } par->mfx.FrameInfo.FrameRateExtN = m_vFirstPar.mfx.FrameInfo.FrameRateExtN; par->mfx.FrameInfo.FrameRateExtD = m_vFirstPar.mfx.FrameInfo.FrameRateExtD; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtD = m_vPar.mfx.FrameInfo.FrameRateExtD; par->mfx.FrameInfo.FrameRateExtN = m_vPar.mfx.FrameInfo.FrameRateExtN; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } par->mfx.FrameInfo.AspectRatioW = m_vFirstPar.mfx.FrameInfo.AspectRatioW; par->mfx.FrameInfo.AspectRatioH = m_vFirstPar.mfx.FrameInfo.AspectRatioH; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = m_vPar.mfx.FrameInfo.AspectRatioH; par->mfx.FrameInfo.AspectRatioW = m_vPar.mfx.FrameInfo.AspectRatioW; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; } } return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::DecodeHeader"); MFX_CHECK_NULL_PTR2(bs, par); mfxStatus sts = CheckBitstream(bs); MFX_CHECK_STS(sts); MFXMediaDataAdapter in(bs); mfx_UMC_MemAllocator tempAllocator; tempAllocator.InitMem(0, core); UMC::H264VideoDecoderParams avcInfo; avcInfo.m_pData = ∈ MFX_AVC_Decoder decoder; decoder.SetMemoryAllocator(&tempAllocator); UMC::Status umcRes = MFX_Utility::DecodeHeader(&decoder, &avcInfo, bs, par); MFX_CHECK(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA, MFX_ERR_MORE_DATA); MFX_CHECK_UMC_STS(umcRes); umcRes = MFX_Utility::FillVideoParamMVCEx(&decoder, par); MFX_CHECK_UMC_STS(umcRes); // sps/pps headers mfxExtCodingOptionSPSPPS * spsPps = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (spsPps) { UMC::RawHeader *sps = decoder.GetSPS(); UMC::RawHeader *pps = decoder.GetPPS(); if (sps->GetSize()) { MFX_CHECK(spsPps->SPSBufSize >= sps->GetSize(), MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->SPSBufSize = (mfxU16)sps->GetSize(); std::copy(sps->GetPointer(), sps->GetPointer() + spsPps->SPSBufSize, spsPps->SPSBuffer); } else { spsPps->SPSBufSize = 0; } if (pps->GetSize()) { MFX_CHECK(spsPps->PPSBufSize >= pps->GetSize(), MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->PPSBufSize = (mfxU16)pps->GetSize(); std::copy(pps->GetPointer(), pps->GetPointer() + spsPps->PPSBufSize, spsPps->PPSBuffer); } else { spsPps->PPSBufSize = 0; } } return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::QueryIOSurf"); MFX_CHECK_NULL_PTR2(par, request); eMFXPlatform platform = MFX_Utility::GetPlatform(core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = core->GetHWType(); mfxVideoParam params; params = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(¶ms); if ( !(par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if ((par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); int32_t isInternalManaging = params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; bool* isD3D9On11Core = QueryCoreInterface(core, MFXI_IS_CORED3D9ON11_GUID); if (isD3D9On11Core && (*isD3D9On11Core) == true && (params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) isInternalManaging = true; mfxStatus sts = QueryIOSurfInternal(type, ¶ms, request); MFX_CHECK_STS(sts); sts = UpdateCscOutputFormat(par, request); MFX_CHECK_STS(sts); if (isInternalManaging) { request->NumFrameSuggested = request->NumFrameMin = (mfxU16)CalculateAsyncDepth(par); if (params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) request->Type = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_FROM_DECODE; } request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { // need to substitute output format // number of surfaces is same request->Info.FourCC = videoProcessing->Out.FourCC; request->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; sts = UpdateCscOutputFormat(par, request); MFX_CHECK_STS(sts); request->Info.Width = videoProcessing->Out.Width; request->Info.Height = videoProcessing->Out.Height; request->Info.CropX = videoProcessing->Out.CropX; request->Info.CropY = videoProcessing->Out.CropY; request->Info.CropW = videoProcessing->Out.CropW; request->Info.CropH = videoProcessing->Out.CropH; } #endif if (platform != core->GetPlatformType()) { assert(platform == MFX_PLATFORM_SOFTWARE); MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } if (isNeedChangeVideoParamWarning) { MFX_RETURN(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::QueryIOSurfInternal(eMFXHWType type, mfxVideoParam *par, mfxFrameAllocRequest *request) { request->Info = par->mfx.FrameInfo; mfxExtMVCSeqDesc * points = (mfxExtMVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); mfxU8 level_idc = (mfxU8)par->mfx.CodecLevel; if (IsMVCProfile(par->mfx.CodecProfile) && points && points->OP) { level_idc = mfxU8 (std::max(mfxU16(level_idc), points->OP->LevelIdc)); } mfxU32 asyncDepth = CalculateAsyncDepth(par); bool useDelayedDisplay = (ENABLE_DELAYED_DISPLAY_MODE != 0) && IsNeedToUseHWBuffering(type) && (asyncDepth != 1); mfxI32 dpbSize = UMC::CalculateDPBSize(level_idc, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, 0); if (par->mfx.MaxDecFrameBuffering && par->mfx.MaxDecFrameBuffering < dpbSize) dpbSize = par->mfx.MaxDecFrameBuffering; mfxU32 numMin = dpbSize + 1 + asyncDepth; if (useDelayedDisplay) // equals if (m_useDelayedDisplay) - workaround numMin += NUMBER_OF_ADDITIONAL_FRAMES; numMin *= CalculateRequiredView(par); #ifdef MFX_ENABLE_SVC_VIDEO_DECODE numMin *= IsSVCProfile(par->mfx.CodecProfile) ? 2 : 1; #endif request->NumFrameMin = (mfxU16)numMin; request->NumFrameSuggested = request->NumFrameMin; request->Type = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE; return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::GetDecodeStat(mfxDecodeStat *stat) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(stat); m_stat.NumSkippedFrame = m_pH264VideoDecoder->GetSkipInfo().numberOfSkippedFrames; m_stat.NumCachedFrame = 0; UMC::H264DBPList * lst = m_pH264VideoDecoder->GetDPBList(UMC::BASE_VIEW, 0); if (lst) { UMC::H264DecoderFrame *pFrame = lst->head(); for (; pFrame; pFrame = pFrame->future()) { if (!pFrame->wasOutputted() && !UMC::isAlmostDisposable(pFrame)) m_stat.NumCachedFrame++; } } m_stat.reserved[0] = m_pH264VideoDecoder->IsExistHeadersError() ? 1 : 0; *stat = m_stat; return MFX_ERR_NONE; } static mfxStatus AVCDECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "AVCDECODERoutine"); mfxStatus sts = MFX_ERR_NONE; try { auto decoder = reinterpret_cast(pState); MFX_CHECK(decoder, MFX_ERR_UNDEFINED_BEHAVIOR); auto task = reinterpret_cast(pParam); MFX_CHECK(task, MFX_ERR_UNDEFINED_BEHAVIOR); sts = decoder->RunThread(task, threadNumber); } catch(...) { MFX_LTRACE_MSG_1(MFX_TRACE_LEVEL_INTERNAL, "exception handled"); return MFX_ERR_NONE; } return sts; } static mfxStatus AVCCompleteProc(void *, void *pParam, mfxStatus ) { delete reinterpret_cast(pParam); return MFX_ERR_NONE; } mfxStatus VideoDECODEH264::RunThread(ThreadTaskInfo264* info, mfxU32 threadNumber) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::RunThread"); MFX_CHECK_NULL_PTR1(info); mfxStatus sts = MFX_TASK_WORKING; if (!info->surface_out) { for (int32_t i = 0; i < 2 && sts == MFX_TASK_WORKING; i++) { sts = m_pH264VideoDecoder->RunThread(threadNumber); } UMC::AutomaticUMCMutex guard(m_mGuard); if (sts == MFX_TASK_BUSY && !m_pH264VideoDecoder->GetTaskBroker()->IsEnoughForStartDecoding(true)) m_globalTask = false; return m_globalTask ? sts : MFX_TASK_DONE; } UMC::H264DecoderFrame * pFrame = 0; bool isDecoded; { UMC::AutomaticUMCMutex guard(m_mGuard); if (info->is_decoding_done) return MFX_TASK_DONE; mfxI32 index = m_surface_source->FindSurface(info->surface_out); pFrame = m_pH264VideoDecoder->FindSurface((UMC::FrameMemID)index); MFX_CHECK(pFrame && pFrame->m_UID != -1, MFX_ERR_NOT_FOUND); isDecoded = m_pH264VideoDecoder->CheckDecoding(pFrame); } if (!isDecoded) { for (int32_t i = 0; i < 2 && sts == MFX_TASK_WORKING; i++) { sts = m_pH264VideoDecoder->RunThread(threadNumber); } } { UMC::AutomaticUMCMutex guard(m_mGuard); if (info->is_decoding_done) return MFX_TASK_DONE; isDecoded = m_pH264VideoDecoder->CheckDecoding(pFrame); if (isDecoded) { info->is_decoding_done = true; } } if (isDecoded) { if (!pFrame->wasDisplayed()) { sts = DecodeFrame(nullptr, nullptr, info->surface_out); MFX_CHECK(sts == MFX_ERR_NONE || sts == MFX_ERR_NOT_FOUND, sts); return sts; } return MFX_TASK_DONE; } MFX_CHECK(sts >= MFX_ERR_NONE, sts); return sts; } mfxStatus VideoDECODEH264::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::DecodeFrameCheck"); UMC::AutomaticUMCMutex guard(m_mGuard); mfxStatus mfxSts = DecodeFrameCheck(bs, surface_work, surface_out); if (MFX_ERR_NONE == mfxSts || MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxSts) // It can be useful to run threads right after first frame receive { if (!*surface_out) { if (!m_globalTask && m_pH264VideoDecoder->GetTaskBroker()->IsEnoughForStartDecoding(true)) m_globalTask = true; else return MFX_WRN_DEVICE_BUSY; } ThreadTaskInfo264* info = new ThreadTaskInfo264{ *surface_out }; pEntryPoint->pRoutine = &AVCDECODERoutine; pEntryPoint->pCompleteProc = &AVCCompleteProc; pEntryPoint->pState = this; pEntryPoint->requiredNumThreads = m_vPar.mfx.NumThread; pEntryPoint->pParam = info; } MFX_CHECK_STS(mfxSts); return mfxSts; } mfxStatus VideoDECODEH264::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_out); } else { MFX_CHECK_NULL_PTR2(surface_work, surface_out); } mfxStatus sts = MFX_ERR_NONE; sts = bs ? CheckBitstream(bs) : MFX_ERR_NONE; MFX_CHECK_STS(sts); UMC::Status umcRes = UMC::UMC_OK; *surface_out = nullptr; if (surface_work) { bool isVideoProcCscEnabled = false; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing && videoProcessing->Out.FourCC != m_vPar.mfx.FrameInfo.FourCC) { isVideoProcCscEnabled = true; } #endif sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_AVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_AVC); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) sts = CheckFrameData(surface_work); MFX_CHECK_STS(sts); } sts = m_surface_source->SetCurrentMFXSurface(surface_work); MFX_CHECK_STS(sts); sts = MFX_ERR_UNDEFINED_BEHAVIOR; #if defined(MFX_ENABLE_PROTECT) #if defined(MFX_ENABLE_PXP) //Check protect VA is enabled or not if( bs && m_va->GetProtectedVA()) #else #endif // MFX_ENABLE_PXP { MFX_CHECK(m_va->GetProtectedVA(), MFX_ERR_UNSUPPORTED); MFX_CHECK((bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME), MFX_ERR_UNSUPPORTED); m_va->GetProtectedVA()->SetBitstream(bs); } #endif // MFX_ENABLE_PROTECT try { bool force = false; UMC::Status umcFrameRes = UMC::UMC_OK; MFXMediaDataAdapter src(bs); mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; if (extbuf) { ((mfxExtDecodeErrorReport *)extbuf)->ErrorTypes = 0; src.SetExtBuffer(extbuf); } for (;;) { umcRes = m_pH264VideoDecoder->AddSource(bs ? &src : 0); umcFrameRes = umcRes; src.Save(bs); if (umcRes == UMC::UMC_ERR_ALLOC) { sts = MFX_ERR_MORE_SURFACE; break; } if (umcRes == UMC::UMC_NTF_NEW_RESOLUTION || umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS || umcRes == UMC::UMC_ERR_UNSUPPORTED) { FillVideoParam(&m_vPar, true); if (umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS) { if (!m_isFirstRun) { sts = MFX_WRN_VIDEO_PARAM_CHANGED; } else { umcFrameRes = umcRes = UMC::UMC_OK; m_isFirstRun = false; } } MFX_CHECK(umcRes != UMC::UMC_NTF_NEW_RESOLUTION, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } if (umcRes == UMC::UMC_ERR_INVALID_STREAM) { umcFrameRes = umcRes = UMC::UMC_OK; } if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || umcRes == UMC::UMC_WRN_INFO_NOT_READY || umcRes == UMC::UMC_ERR_NEED_FORCE_OUTPUT) { force = umcRes == UMC::UMC_ERR_NEED_FORCE_OUTPUT; sts = umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER ? MFX_ERR_MORE_DATA_SUBMIT_TASK: MFX_WRN_DEVICE_BUSY; } if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA || umcRes == UMC::UMC_ERR_SYNC) { if (!bs || bs->DataFlag == MFX_BITSTREAM_EOS) force = true; sts = MFX_ERR_MORE_DATA; } if (umcRes == UMC::UMC_ERR_DEVICE_FAILED || umcRes == UMC::UMC_ERR_GPU_HANG) { //return these errors immediatelly unless we have [input == 0] sts = (umcRes == UMC::UMC_ERR_DEVICE_FAILED) ? MFX_ERR_DEVICE_FAILED : MFX_ERR_GPU_HANG; if (bs && bs->DataFlag != MFX_BITSTREAM_EOS) MFX_RETURN(sts); force = true; } umcRes = m_pH264VideoDecoder->RunDecoding(); if (m_vInitPar.mfx.DecodedOrder) force = true; UMC::H264DecoderFrame *pFrame = nullptr; #if defined(MFX_ENABLE_PROTECT) #if defined(MFX_ENABLE_PXP) //PXP macro on && secure decode if (m_va->GetProtectedVA()) { if (umcFrameRes != UMC::UMC_ERR_NOT_ENOUGH_BUFFER) { pFrame = GetFrameToDisplay(force); } } // PXP macro on && clear decode else #endif // MFX_ENABLE_PXP #endif // MFX_ENABLE_PROTECT pFrame = GetFrameToDisplay(force); // return frame to display if (pFrame) { FillOutputSurface(surface_out, surface_work, pFrame); m_frameOrder = (mfxU16)pFrame->m_frameOrder; (*surface_out)->Data.FrameOrder = m_frameOrder; return MFX_ERR_NONE; } if (umcFrameRes != UMC::UMC_OK) break; } // for (;;) } catch(const UMC::h264_exception & ex) { FillVideoParam(&m_vPar, false); if (ex.GetStatus() == UMC::UMC_ERR_ALLOC) { // check incompatibility of video params MFX_CHECK( m_vInitPar.mfx.FrameInfo.Width == m_vPar.mfx.FrameInfo.Width && m_vInitPar.mfx.FrameInfo.Height == m_vPar.mfx.FrameInfo.Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } mfxStatus mfxSts = ConvertUMCStatusToMfx(ex.GetStatus()); MFX_CHECK_STS(mfxSts); return mfxSts; } catch(...) { MFX_RETURN(MFX_ERR_UNKNOWN); } MFX_CHECK_STS(sts); return sts; } void VideoDECODEH264::FillVideoParam(mfxVideoParamWrapper *par, bool full) { if (!m_pH264VideoDecoder.get()) return; MFX_Utility::FillVideoParam(m_pH264VideoDecoder.get(), par, full); UMC::RawHeader *sps = m_pH264VideoDecoder->GetSPS(); UMC::RawHeader *pps = m_pH264VideoDecoder->GetPPS(); mfxExtCodingOptionSPSPPS * spsPps = reinterpret_cast(GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS)); if (spsPps) { if (sps->GetSize()) { spsPps->SPSBufSize = (mfxU16)sps->GetSize(); spsPps->SPSBuffer = sps->GetPointer(); } else { spsPps->SPSBufSize = 0; } if (pps->GetSize()) { spsPps->PPSBufSize = (mfxU16)pps->GetSize(); spsPps->PPSBuffer = pps->GetPointer(); } else { spsPps->PPSBufSize = 0; } } MFX_Utility::FillVideoParamMVCEx(m_pH264VideoDecoder.get(), par); } void VideoDECODEH264::CopySurfaceInfo(mfxFrameSurface1 *in, mfxFrameSurface1 *out) { out->Info.FrameId.ViewId = in->Info.FrameId.ViewId; out->Info.FrameId.TemporalId = in->Info.FrameId.TemporalId; out->Info.FrameId.PriorityId = in->Info.FrameId.PriorityId; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (IsSVCProfile(m_vFirstPar.mfx.CodecProfile)) { out->Info.FrameId.DependencyId = in->Info.FrameId.DependencyId; out->Info.FrameId.TemporalId = in->Info.FrameId.TemporalId; out->Info.FrameId.QualityId = in->Info.FrameId.QualityId; out->Info.FrameId.PriorityId = in->Info.FrameId.PriorityId; } #endif out->Info.CropH = in->Info.CropH; out->Info.CropW = in->Info.CropW; out->Info.CropX = in->Info.CropX; out->Info.CropY = in->Info.CropY; out->Info.AspectRatioH = in->Info.AspectRatioH; out->Info.AspectRatioW = in->Info.AspectRatioW; out->Info.FrameRateExtD = in->Info.FrameRateExtD; out->Info.FrameRateExtN = in->Info.FrameRateExtN; out->Info.PicStruct = in->Info.PicStruct; out->Data.TimeStamp = in->Data.TimeStamp; out->Data.FrameOrder = in->Data.FrameOrder; out->Data.Corrupted = in->Data.Corrupted; out->Data.DataFlag = in->Data.DataFlag; } void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSurface1 *surface_work, UMC::H264DecoderFrame * pFrame) { m_stat.NumFrame++; m_stat.NumError += pFrame->GetError() ? 1 : 0; const UMC::FrameData * fd = pFrame->GetFrameData(); *surf_out = m_surface_source->GetSurface(fd->GetFrameMID(), surface_work, &m_vPar); assert(*surf_out); mfxFrameSurface1 *surface_out = *surf_out; mfxExtDecodedFrameInfo * frameType = (mfxExtDecodedFrameInfo *)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO); if (frameType) { if (pFrame->GetAU(0)->IsIntraAU()) { frameType->FrameType = MFX_FRAMETYPE_I; if (pFrame->GetAU(0)->m_IsIDR) frameType->FrameType |= MFX_FRAMETYPE_IDR; } else if (pFrame->GetAU(0)->m_isBExist) { frameType->FrameType = MFX_FRAMETYPE_B; } else frameType->FrameType = MFX_FRAMETYPE_P; if (pFrame->GetAU(0)->IsReference()) frameType->FrameType |= MFX_FRAMETYPE_REF; if (pFrame->GetAU(1)->GetStatus() > UMC::H264DecoderFrameInfo::STATUS_NOT_FILLED) { if (pFrame->GetAU(1)->IsIntraAU()) { frameType->FrameType |= MFX_FRAMETYPE_xI; if (pFrame->GetAU(1)->m_IsIDR) frameType->FrameType |= MFX_FRAMETYPE_xIDR; } else if (pFrame->GetAU(1)->m_isBExist) { frameType->FrameType |= MFX_FRAMETYPE_xB; } else { frameType->FrameType |= MFX_FRAMETYPE_xP; } if (pFrame->GetAU(1)->IsReference()) frameType->FrameType |= MFX_FRAMETYPE_xREF; } } surface_out->Info.FrameId.ViewId = (mfxU16)pFrame->m_viewId; surface_out->Info.FrameId.TemporalId = 0; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (IsSVCProfile(m_vFirstPar.mfx.CodecProfile)) { surface_out->Info.FrameId.DependencyId = (mfxU16)0; surface_out->Info.FrameId.QualityId = (mfxU16)0; surface_out->Info.FrameId.TemporalId = 0; } #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { surface_out->Info.CropH = videoProcessing->Out.CropH; surface_out->Info.CropW = videoProcessing->Out.CropW; surface_out->Info.CropX = videoProcessing->Out.CropX; surface_out->Info.CropY = videoProcessing->Out.CropY; surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; } else #endif { surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); switch(pFrame->m_chroma_format) { case 0: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; break; case 2: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; break; default: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; break; } } bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); surface_out->Info.AspectRatioH = isShouldUpdate ? (mfxU16)pFrame->m_aspect_height : m_vFirstPar.mfx.FrameInfo.AspectRatioH; surface_out->Info.AspectRatioW = isShouldUpdate ? (mfxU16)pFrame->m_aspect_width : m_vFirstPar.mfx.FrameInfo.AspectRatioW; isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.FrameRateExtD || m_vFirstPar.mfx.FrameInfo.FrameRateExtN); surface_out->Info.FrameRateExtD = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtD : m_vFirstPar.mfx.FrameInfo.FrameRateExtD; surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; surface_out->Info.PicStruct = 0; switch (pFrame->m_displayPictureStruct) { case UMC::DPS_TOP: surface_out->Info.PicStruct = MFX_PICSTRUCT_FIELD_TFF; break; case UMC::DPS_BOTTOM: surface_out->Info.PicStruct = MFX_PICSTRUCT_FIELD_BFF; break; case UMC::DPS_TOP_BOTTOM: case UMC::DPS_BOTTOM_TOP: { mfxU32 fieldFlag = (pFrame->m_displayPictureStruct == UMC::DPS_TOP_BOTTOM) ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_FIELD_BFF; surface_out->Info.PicStruct = (mfxU16)((pFrame->m_PictureStructureForDec == UMC::FRM_STRUCTURE) ? MFX_PICSTRUCT_PROGRESSIVE : fieldFlag); if (m_vPar.mfx.ExtendedPicStruct) { surface_out->Info.PicStruct |= fieldFlag; } } break; case UMC::DPS_TOP_BOTTOM_TOP: case UMC::DPS_BOTTOM_TOP_BOTTOM: { surface_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (m_vPar.mfx.ExtendedPicStruct) { surface_out->Info.PicStruct |= MFX_PICSTRUCT_FIELD_REPEATED; surface_out->Info.PicStruct |= (pFrame->m_displayPictureStruct == UMC::DPS_TOP_BOTTOM_TOP) ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_FIELD_BFF; } } break; case UMC::DPS_FRAME_DOUBLING: surface_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (m_vPar.mfx.ExtendedPicStruct) { surface_out->Info.PicStruct |= MFX_PICSTRUCT_FRAME_DOUBLING; } break; case UMC::DPS_FRAME_TRIPLING: surface_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (m_vPar.mfx.ExtendedPicStruct) { surface_out->Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING; } break; case UMC::DPS_FRAME: default: surface_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; break; } surface_out->Data.TimeStamp = GetMfxTimeStamp(pFrame->m_dFrameTime); surface_out->Data.FrameOrder = (mfxU32)MFX_FRAMEORDER_UNKNOWN; surface_out->Data.DataFlag = (mfxU16)(pFrame->m_isOriginalPTS ? MFX_FRAMEDATA_ORIGINAL_TIMESTAMP : 0); TRACE_BUFFER_EVENT(MFX_TRACE_API_AVC_OUTPUTINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, surface_out, H264DecodeSurfaceOutparam, SURFACEOUT_H264D); UMC::SEI_Storer * storer = m_pH264VideoDecoder->GetSEIStorer(); if (storer) storer->SetTimestamp(pFrame); } mfxStatus VideoDECODEH264::DecodeFrame(mfxFrameSurface1 *surface_out, UMC::H264DecoderFrame * pFrame) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH264::DecodeFrame"); MFX_CHECK_NULL_PTR1(surface_out); mfxI32 index; if (pFrame) { index = pFrame->GetFrameData()->GetFrameMID(); } else { index = m_surface_source->FindSurface(surface_out); pFrame = m_pH264VideoDecoder->FindSurface((UMC::FrameMemID)index); MFX_CHECK(pFrame, MFX_ERR_NOT_FOUND); } int32_t const error = pFrame->GetError(); if (error & UMC::ERROR_FRAME_DEVICE_FAILURE) { MFX_CHECK(error != UMC::UMC_ERR_GPU_HANG, MFX_ERR_DEVICE_FAILED); MFX_RETURN(MFX_ERR_GPU_HANG); } surface_out->Data.Corrupted = 0; if (error & UMC::ERROR_FRAME_MINOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MINOR; if (error & UMC::ERROR_FRAME_MAJOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_REFERENCE_FRAME) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; if (error & UMC::ERROR_FRAME_DPB) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_LIST; if (error & UMC::ERROR_FRAME_RECOVERY) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_TOP_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_TOP_FIELD; if (error & UMC::ERROR_FRAME_BOTTOM_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_BOTTOM_FIELD; mfxStatus sts = m_surface_source->PrepareToOutput(surface_out, index, &m_vPar); MFX_CHECK_STS(sts); UMC::AutomaticUMCMutex guard(m_mGuard); pFrame->setWasDisplayed(); TRACE_EVENT(MFX_TRACE_API_AVC_DISPLAYINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1], pFrame->FrameNum(), (uint32_t)pFrame->wasDisplayed(), (uint32_t)pFrame->wasOutputted())); return sts; } mfxStatus VideoDECODEH264::DecodeFrame(mfxBitstream *, mfxFrameSurface1 *, mfxFrameSurface1 *surface_out) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(surface_out); mfxStatus sts = DecodeFrame(surface_out); MFX_CHECK_STS(sts); return sts; } mfxStatus VideoDECODEH264::GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ud, sz, ts); mfxStatus MFXSts = MFX_ERR_NONE; UMC::MediaData data; UMC::Status umcRes = m_pH264VideoDecoder->GetUserData(&data); MFX_CHECK(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA, MFX_ERR_MORE_DATA); MFX_CHECK(*sz >= data.GetDataSize(), MFX_ERR_NOT_ENOUGH_BUFFER); *sz = (mfxU32)data.GetDataSize(); *ts = GetMfxTimeStamp(data.GetTime()); std::copy(reinterpret_cast(data.GetDataPointer()), reinterpret_cast(data.GetDataPointer()) + data.GetDataSize(), ud); MFX_CHECK_STS(MFXSts); return MFXSts; } mfxStatus VideoDECODEH264::GetPayload( mfxU64 *ts, mfxPayload *payload ) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ts, payload, payload->Data); UMC::SEI_Storer * storer = m_pH264VideoDecoder->GetSEIStorer(); MFX_CHECK(storer, MFX_ERR_UNKNOWN); const UMC::SEI_Storer::SEI_Message * msg = storer->GetPayloadMessage(); if (msg) { MFX_CHECK(payload->BufSize >= msg->msg_size, MFX_ERR_NOT_ENOUGH_BUFFER); *ts = GetMfxTimeStamp(msg->timestamp); std::copy(msg->data, msg->data + msg->msg_size, payload->Data); payload->NumBit = (mfxU32)(msg->msg_size * 8); payload->Type = (mfxU16)msg->type; } else { payload->NumBit = 0; *ts = MFX_TIME_STAMP_INVALID; } return MFX_ERR_NONE; } UMC::H264DecoderFrame * VideoDECODEH264::GetFrameToDisplay(bool force) { UMC::H264DecoderFrame * pFrame = 0; do { pFrame = m_pH264VideoDecoder->GetFrameToDisplayInternal(force); if (!pFrame) { break; } m_pH264VideoDecoder->PostProcessDisplayFrame(pFrame); if (pFrame->IsSkipped()) { pFrame->setWasOutputted(); pFrame->setWasDisplayed(); } } while (pFrame->IsSkipped()); if (pFrame) { pFrame->setWasOutputted(); } return pFrame; } mfxStatus VideoDECODEH264::SetSkipMode(mfxSkipMode mode) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); int32_t test_num = 0; m_pH264VideoDecoder->ChangeVideoDecodingSpeed(test_num); int32_t num = 0; switch (mode) { case MFX_SKIPMODE_NOSKIP: num = -10; break; case MFX_SKIPMODE_MORE: num = 1; break; case MFX_SKIPMODE_LESS: num = -1; break; default: { MFX_RETURN(MFX_ERR_UNSUPPORTED); } } m_pH264VideoDecoder->ChangeVideoDecodingSpeed(num); return test_num == num ? MFX_WRN_VALUE_NOT_CHANGED : MFX_ERR_NONE; } bool VideoDECODEH264::IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type) { auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; if ((newPar->IOPattern & mask) != (oldPar->IOPattern & mask) ) { return false; } if (newPar->Protected != oldPar->Protected) { return false; } if (newPar->mfx.FrameInfo.FourCC != oldPar->mfx.FrameInfo.FourCC) { return false; } if (CalculateAsyncDepth(newPar) != CalculateAsyncDepth(oldPar)) { return false; } mfxFrameAllocRequest requestOld; memset(&requestOld, 0, sizeof(requestOld)); mfxFrameAllocRequest requestNew; memset(&requestNew, 0, sizeof(requestNew)); mfxStatus mfxSts = QueryIOSurfInternal(type, oldPar, &requestOld); if (mfxSts != MFX_ERR_NONE) return false; mfxSts = QueryIOSurfInternal(type, newPar, &requestNew); if (mfxSts != MFX_ERR_NONE) return false; if (newPar->mfx.FrameInfo.Height > oldPar->mfx.FrameInfo.Height) { return false; } if (newPar->mfx.FrameInfo.Width > oldPar->mfx.FrameInfo.Width) { return false; } if (newPar->mfx.FrameInfo.FourCC != oldPar->mfx.FrameInfo.FourCC) { return false; } if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { return false; } if (m_response.NumFrameActual) { if (requestNew.NumFrameMin > m_response.NumFrameActual) return false; } else { if (requestNew.NumFrameMin > requestOld.NumFrameMin || requestNew.Type != requestOld.Type) return false; } //420<->400 allowed, other chroma formats are unsupported /*if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { if ((newPar->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && newPar->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV400) || (oldPar->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && oldPar->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV400)) return false; }*/ if (CalculateRequiredView(newPar) != CalculateRequiredView(oldPar)) return false; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * newVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(newPar->ExtParam, newPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxExtDecVideoProcessing * oldVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(oldPar->ExtParam, oldPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if ( ((newVideoProcessing) && (!oldVideoProcessing)) || ((!newVideoProcessing) && (oldVideoProcessing)) ) return false; else if (newVideoProcessing && oldVideoProcessing) { if (newVideoProcessing->Out.Width > oldVideoProcessing->Out.Width) return false; if (newVideoProcessing->Out.Height > oldVideoProcessing->Out.Height) return false; /* Check Input cropping */ if (!((newVideoProcessing->In.CropX <= newVideoProcessing->In.CropW) && (newVideoProcessing->In.CropW <= newPar->mfx.FrameInfo.CropW) && (newVideoProcessing->In.CropY <= newVideoProcessing->In.CropH) && (newVideoProcessing->In.CropH <= newPar->mfx.FrameInfo.CropH) )) return false; /* Check output cropping */ if (!((newVideoProcessing->Out.CropX <= newVideoProcessing->Out.CropW) && (newVideoProcessing->Out.CropW <= newVideoProcessing->Out.Width) && ((newVideoProcessing->Out.CropX + newVideoProcessing->Out.CropH) <= newVideoProcessing->Out.Width) && (newVideoProcessing->Out.CropY <= newVideoProcessing->Out.CropH) && (newVideoProcessing->Out.CropH <= newVideoProcessing->Out.Height) && ((newVideoProcessing->Out.CropY + newVideoProcessing->Out.CropH ) <= newVideoProcessing->Out.Height) )) return false; } #endif //MFX_DEC_VIDEO_POSTPROCESS_DISABLE return true; } mfxFrameSurface1 *VideoDECODEH264::GetInternalSurface(mfxFrameSurface1 *surface) { return m_surface_source->GetInternalSurface(surface); } #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h265/000077500000000000000000000000001443134507600242645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h265/include/000077500000000000000000000000001443134507600257075ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h265/include/mfx_h265_dec_decode.h000066400000000000000000000135741443134507600315460ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_H265_VIDEO_DECODE) #include "umc_defs.h" #ifndef _MFX_H265_DEC_DECODE_H_ #define _MFX_H265_DEC_DECODE_H_ #include "mfx_common_int.h" #include "umc_video_decoder.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_mutex.h" #include #include #include #include "mfx_task.h" namespace UMC { class VideoData; } namespace UMC_HEVC_DECODER { class MFXTaskSupplier_H265; class VATaskSupplier; class H265DecoderFrame; } typedef UMC_HEVC_DECODER::VATaskSupplier MFX_AVC_Decoder_H265; class VideoDECODE; // HEVC decoder interface class class VideoDECODEH265 : public VideoDECODE { public: // MediaSDK DECODE_Query API function static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); // MediaSDK DECODE_QueryIOSurf API function static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); // Decode bitstream header and exctract parameters from it static mfxStatus DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); VideoDECODEH265(VideoCORE *core, mfxStatus * sts); virtual ~VideoDECODEH265(void); // Initialize decoder instance mfxStatus Init(mfxVideoParam *par) override; // Reset decoder with new parameters virtual mfxStatus Reset(mfxVideoParam *par) override; // Free decoder resources virtual mfxStatus Close(void) override; // Returns decoder threading mode virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override; // MediaSDK DECODE_GetVideoParam API function virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; // MediaSDK DECODE_GetDecodeStat API function virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override; // Initialize threads callbacks virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) override; // Wait until a frame is ready to be output and set necessary surface flags virtual mfxStatus DecodeFrame(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out); // Returns closed caption data virtual mfxStatus GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts); // Returns stored SEI messages virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override; // MediaSDK DECODE_SetSkipMode API function virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; // Decoder instance threads entry point. Do async tasks here mfxStatus RunThread(void * params, mfxU32 threadNumber); virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; protected: // Actually calculate needed frames number static mfxStatus QueryIOSurfInternal(eMFXHWType type, mfxVideoParam *par, mfxFrameAllocRequest *request); // Check if new parameters are compatible with new parameters bool IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type); // Fill up frame parameters before returning it to application void FillOutputSurface(mfxFrameSurface1 **surface_out, mfxFrameSurface1 *surface_work, UMC_HEVC_DECODER::H265DecoderFrame * pFrame); // Find a next frame ready to be output from decoder UMC_HEVC_DECODER::H265DecoderFrame * GetFrameToDisplay_H265(bool force); // Wait until a frame is ready to be output and set necessary surface flags mfxStatus DecodeFrame(mfxFrameSurface1 *surface_out, UMC_HEVC_DECODER::H265DecoderFrame * pFrame = 0); // Check if there is enough data to start decoding in async mode mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out); // Fill up resolution information if new header arrived void FillVideoParam(mfxVideoParamWrapper *par, bool full); mfxFrameSurface1 * GetInternalSurface(mfxFrameSurface1 *surface) override; std::unique_ptr m_pH265VideoDecoder; mfx_UMC_MemAllocator m_MemoryAllocator; std::unique_ptr m_surface_source; mfxVideoParamWrapper m_vInitPar; mfxVideoParamWrapper m_vFirstPar; mfxVideoParamWrapper m_vPar; ExtendedBuffer m_extBuffers; VideoCORE * m_core; bool m_isInit; bool m_globalTask; mfxU16 m_frameOrder; mfxFrameAllocResponse m_response = {}; mfxFrameAllocResponse m_response_alien = {}; mfxDecodeStat m_stat = {}; UMC::Mutex m_mGuard; UMC::Mutex m_mGuardRunThread; bool m_useDelayedDisplay; UMC::VideoAccelerator * m_va; enum { NUMBER_OF_ADDITIONAL_FRAMES = 10 }; bool m_isFirstRun; }; #endif // _MFX_H265_DEC_DECODE_H_ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h265/src/000077500000000000000000000000001443134507600250535ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp000066400000000000000000001547361443134507600312530ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_h265_dec_decode.h" #if defined (MFX_ENABLE_H265_VIDEO_DECODE) #include "mfx_common.h" #include "mfx_common_decode_int.h" #include "umc_h265_mfx_supplier.h" #include "umc_h265_mfx_utils.h" #include "umc_h265_frame_list.h" #include "umc_h265_va_supplier.h" #include "umc_va_video_processing.h" #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_h265_supplier.h" #endif // MFX_ENABLE_PXP #include "libmfx_core_interface.h" using namespace UMC_HEVC_DECODER; #include "mfx_unified_h265d_logging.h" inline bool IsNeedToUseHWBuffering(eMFXHWType /*type*/) { return false; } inline mfxU16 UMC2MFX_PicStruct(int dps, bool extended) { switch (dps) { case DPS_FRAME_H265: return MFX_PICSTRUCT_PROGRESSIVE; case DPS_TOP_H265: return MFX_PICSTRUCT_FIELD_TOP; case DPS_BOTTOM_H265: return MFX_PICSTRUCT_FIELD_BOTTOM; case DPS_TOP_BOTTOM_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FIELD_TFF: 0); case DPS_BOTTOM_TOP_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FIELD_BFF: 0); case DPS_TOP_BOTTOM_TOP_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FIELD_REPEATED | MFX_PICSTRUCT_FIELD_TFF: 0); case DPS_BOTTOM_TOP_BOTTOM_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FIELD_REPEATED | MFX_PICSTRUCT_FIELD_BFF: 0); case DPS_FRAME_DOUBLING_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FRAME_DOUBLING : 0); case DPS_FRAME_TRIPLING_H265: return MFX_PICSTRUCT_PROGRESSIVE | (extended ? MFX_PICSTRUCT_FRAME_TRIPLING : 0); case DPS_TOP_BOTTOM_PREV_H265: return MFX_PICSTRUCT_FIELD_TOP | (extended ? MFX_PICSTRUCT_FIELD_PAIRED_PREV : 0); case DPS_BOTTOM_TOP_PREV_H265: return MFX_PICSTRUCT_FIELD_BOTTOM | (extended ? MFX_PICSTRUCT_FIELD_PAIRED_PREV : 0); case DPS_TOP_BOTTOM_NEXT_H265: return MFX_PICSTRUCT_FIELD_TOP | (extended ? MFX_PICSTRUCT_FIELD_PAIRED_NEXT : 0); case DPS_BOTTOM_TOP_NEXT_H265: return MFX_PICSTRUCT_FIELD_BOTTOM | (extended ? MFX_PICSTRUCT_FIELD_PAIRED_NEXT : 0); default: return MFX_PICSTRUCT_UNKNOWN; } } inline UMC::Status FillParam(MFXTaskSupplier_H265 * decoder, mfxVideoParam *par, bool full) { UMC::Status umcRes = decoder->FillVideoParam(par, full); if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) par->mfx.FrameInfo.Shift = 1; return umcRes; } struct ThreadTaskInfo265 { bool is_decoding_done = false; mfxFrameSurface1 *surface_out = nullptr; mfxU32 taskID = 0; // for task ordering H265DecoderFrame *pFrame = nullptr; }; enum { ENABLE_DELAYED_DISPLAY_MODE = 1 }; VideoDECODEH265::VideoDECODEH265(VideoCORE *core, mfxStatus * sts) : VideoDECODE() , m_core(core) , m_isInit(false) , m_globalTask(false) , m_frameOrder((mfxU16)MFX_FRAMEORDER_UNKNOWN) , m_useDelayedDisplay(false) , m_va(0) , m_isFirstRun(true) { if (sts) { *sts = MFX_ERR_NONE; } } VideoDECODEH265::~VideoDECODEH265(void) { Close(); } // Initialize decoder instance mfxStatus VideoDECODEH265::Init(mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH265::Init"); UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(!m_isInit, MFX_ERR_UNDEFINED_BEHAVIOR); m_globalTask = false; MFX_CHECK_NULL_PTR1(par); eMFXPlatform platform = MFX_Utility::GetPlatform_H265(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = m_core->GetHWType(); MFX_CHECK(CheckVideoParamDecoders(par, type) >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(MFX_Utility::CheckVideoParam_H265(par, type), MFX_ERR_INVALID_VIDEO_PARAM); m_vInitPar = *par; m_vFirstPar = *par; m_vFirstPar.mfx.NumThread = 0; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_vFirstPar); m_vPar = m_vFirstPar; m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_HEVC_PARAM); mfxU32 asyncDepth = CalculateAsyncDepth(par); m_vPar.mfx.NumThread = (mfxU16)CalculateNumThread(par); m_useDelayedDisplay = ENABLE_DELAYED_DISPLAY_MODE != 0 && IsNeedToUseHWBuffering(m_core->GetHWType()) && (asyncDepth != 1); bool useBigSurfacePoolWA = MFX_Utility::IsBugSurfacePoolApplicable(par); int32_t useInternal = m_vPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); /* There are following conditions for post processing via HW fixed function engine: * (1): Progressive only for ICL and Before, interlace is supported for ICL following patforms * (2): Supported on SKL (Core) and APL (Atom) platform and above * (3): Only video memory supported (so, OPAQ memory does not supported!) * */ if (videoProcessing) { MFX_CHECK((m_vPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY), MFX_ERR_UNSUPPORTED); bool is_fourcc_supported = ( videoProcessing->Out.FourCC == MFX_FOURCC_RGB4 || videoProcessing->Out.FourCC == MFX_FOURCC_NV12 || videoProcessing->Out.FourCC == MFX_FOURCC_P010 || videoProcessing->Out.FourCC == MFX_FOURCC_YUY2 || videoProcessing->Out.FourCC == MFX_FOURCC_AYUV || videoProcessing->Out.FourCC == MFX_FOURCC_Y410 || videoProcessing->Out.FourCC == MFX_FOURCC_Y210 || videoProcessing->Out.FourCC == MFX_FOURCC_Y216 || videoProcessing->Out.FourCC == MFX_FOURCC_Y416 || videoProcessing->Out.FourCC == MFX_FOURCC_P016); MFX_CHECK(is_fourcc_supported,MFX_ERR_UNSUPPORTED); if (m_core->GetVAType() == MFX_HW_VAAPI) useInternal = true; } #endif if (IsD3D9Simulation(*m_core)) useInternal = true; // allocate memory mfxFrameAllocRequest request = {}; mfxFrameAllocRequest request_internal; mfxStatus mfxSts = QueryIOSurfInternal(type, &m_vPar, &request); if (mfxSts != MFX_ERR_NONE) return mfxSts; if (useInternal) request.Type |= MFX_MEMTYPE_INTERNAL_FRAME; else request.Type |= MFX_MEMTYPE_EXTERNAL_FRAME; request_internal = request; // allocates internal surfaces: if (useInternal) { request = request_internal; if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416 ) { request.Info.Shift = request_internal.Info.Shift = 1; } } try { m_surface_source.reset(new SurfaceSource(m_core, *par, platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } mfxSts = m_core->CreateVA(&m_vFirstPar, &request, &m_response, m_surface_source.get()); MFX_CHECK(mfxSts >= MFX_ERR_NONE, mfxSts); UMC::Status umcSts = m_MemoryAllocator.InitMem(0, m_core); UMC::VideoDecoderParams umcVideoParams; ConvertMFXParamsToUMC(&m_vFirstPar, &umcVideoParams); umcVideoParams.numThreads = m_vPar.mfx.NumThread; umcVideoParams.info.bitrate = asyncDepth - umcVideoParams.numThreads; // buffered frames m_core->GetVA((mfxHDL*)&m_va, MFX_MEMTYPE_FROM_DECODE); umcVideoParams.pVideoAccelerator = m_va; #if defined(MFX_ENABLE_PXP) if (m_va->GetProtectedVA()) m_pH265VideoDecoder.reset(useBigSurfacePoolWA ? new VATaskSupplierBigSurfacePool() : new PXPH265Supplier()); // HW else #endif // MFX_ENABLE_PXP m_pH265VideoDecoder.reset(useBigSurfacePoolWA ? new VATaskSupplierBigSurfacePool() : new VATaskSupplier()); // HW m_pH265VideoDecoder->SetFrameAllocator(m_surface_source.get()); static_cast(m_pH265VideoDecoder.get())->SetVideoHardwareAccelerator(m_va); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (m_va->GetVideoProcessingVA()) { umcSts = m_va->GetVideoProcessingVA()->Init(par, videoProcessing); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_INVALID_VIDEO_PARAM); } #endif umcVideoParams.lpMemoryAllocator = &m_MemoryAllocator; umcSts = m_pH265VideoDecoder->Init(&umcVideoParams); MFX_CHECK(umcSts == UMC::UMC_OK, ConvertUMCStatusToMfx(umcSts)); m_isInit = true; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_isFirstRun = true; if (m_useDelayedDisplay) { static_cast(m_pH265VideoDecoder.get())->SetBufferedFramesNumber(NUMBER_OF_ADDITIONAL_FRAMES); } m_pH265VideoDecoder->SetVideoParams(&m_vFirstPar); MFX_CHECK(platform == m_core->GetPlatformType(), MFX_ERR_UNSUPPORTED); MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus VideoDECODEH265::QueryImplsDescription( VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU16 SupportedProfiles[] = { MFX_PROFILE_HEVC_MAIN , MFX_PROFILE_HEVC_MAIN10 , MFX_PROFILE_HEVC_MAINSP , MFX_PROFILE_HEVC_REXT , MFX_PROFILE_HEVC_SCC }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCCChromaFormat[][2] = { { MFX_FOURCC_NV12, MFX_CHROMAFORMAT_YUV420 } , { MFX_FOURCC_P010, MFX_CHROMAFORMAT_YUV420 } , { MFX_FOURCC_P016, MFX_CHROMAFORMAT_YUV420 } , { MFX_FOURCC_YUY2, MFX_CHROMAFORMAT_YUV422 } , { MFX_FOURCC_Y210, MFX_CHROMAFORMAT_YUV422 } , { MFX_FOURCC_Y216, MFX_CHROMAFORMAT_YUV422 } , { MFX_FOURCC_AYUV, MFX_CHROMAFORMAT_YUV444 } , { MFX_FOURCC_Y410, MFX_CHROMAFORMAT_YUV444 } , { MFX_FOURCC_Y416, MFX_CHROMAFORMAT_YUV444 } }; caps.CodecID = MFX_CODEC_HEVC; caps.MaxcodecLevel = MFX_LEVEL_HEVC_62; mfxVideoParam par; memset(&par, 0, sizeof(par)); par.mfx.CodecId = MFX_CODEC_HEVC; par.mfx.CodecLevel = caps.MaxcodecLevel; mfxStatus sts = MFX_ERR_NONE; for (mfxU16 profile : SupportedProfiles) { par.mfx.CodecProfile = profile; par.mfx.FrameInfo.ChromaFormat = 0; par.mfx.FrameInfo.FourCC = 0; sts = VideoDECODEH265::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 16384, 16 }; memCaps.Height = { 16, 16384, 16 }; for (auto fccChroma : SupportedFourCCChromaFormat) { par.mfx.FrameInfo.FourCC = fccChroma[0]; par.mfx.FrameInfo.ChromaFormat = mfxU16(fccChroma[1]); sts = VideoDECODEH265::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; ah.PushBack(memCaps.ColorFormats) = fccChroma[0]; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } // Reset decoder with new parameters mfxStatus VideoDECODEH265::Reset(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); m_globalTask = false; MFX_CHECK_NULL_PTR1(par); eMFXHWType type = m_core->GetHWType(); eMFXPlatform platform = MFX_Utility::GetPlatform_H265(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); MFX_CHECK(CheckVideoParamDecoders(par, type) >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(MFX_Utility::CheckVideoParam_H265(par, type), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(IsSameVideoParam(par, &m_vInitPar, type), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_pH265VideoDecoder->Reset(); UMC::Status umcSts = m_surface_source->Reset(); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_isFirstRun = true; memset(&m_stat, 0, sizeof(m_stat)); m_vFirstPar = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_vFirstPar); m_vPar = m_vFirstPar; m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); m_vPar.CreateExtendedBuffer(MFX_EXTBUFF_HEVC_PARAM); m_vPar.mfx.NumThread = (mfxU16)CalculateNumThread(par); m_pH265VideoDecoder->SetVideoParams(&m_vFirstPar); MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } // Free decoder resources mfxStatus VideoDECODEH265::Close(void) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH265::Close"); UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit && m_pH265VideoDecoder.get(), MFX_ERR_NOT_INITIALIZED); m_pH265VideoDecoder->Close(); m_surface_source->Close(); m_isInit = false; m_isFirstRun = true; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_va = 0; memset(&m_stat, 0, sizeof(m_stat)); return MFX_ERR_NONE; } // Returns decoder threading mode mfxTaskThreadingPolicy VideoDECODEH265::GetThreadingPolicy(void) { return MFX_TASK_THREADING_SHARED; } // MediaSDK DECODE_Query API function mfxStatus VideoDECODEH265::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { MFX_CHECK_NULL_PTR1(out); eMFXPlatform platform = MFX_Utility::GetPlatform_H265(core, in); eMFXHWType type = MFX_HW_UNKNOWN; if (platform == MFX_PLATFORM_HARDWARE) { type = core->GetHWType(); } return MFX_Utility::Query_H265(core, in, out, type); } // MediaSDK DECODE_GetVideoParam API function mfxStatus VideoDECODEH265::GetVideoParam(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); FillVideoParam(&m_vPar, true); par->mfx = m_vPar.mfx; par->Protected = m_vPar.Protected; par->IOPattern = m_vPar.IOPattern; par->AsyncDepth = m_vPar.AsyncDepth; mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { mfxExtVideoSignalInfo * videoSignalInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); *videoSignal = *videoSignalInternal; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { mfxExtDecVideoProcessing * videoProcessingInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_DEC_VIDEO_PROCESSING); *videoProcessing = *videoProcessingInternal; } #endif mfxExtHEVCParam * hevcParam = (mfxExtHEVCParam *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_HEVC_PARAM); if (hevcParam) { mfxExtHEVCParam * hevcParamInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_HEVC_PARAM); *hevcParam = *hevcParamInternal; } // sps/pps headers mfxExtCodingOptionSPSPPS * spsPps = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (spsPps) { mfxExtCodingOptionSPSPPS * spsPpsInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); spsPps->SPSId = spsPpsInternal->SPSId; spsPps->PPSId = spsPpsInternal->PPSId; MFX_CHECK(spsPps->SPSBufSize >= spsPpsInternal->SPSBufSize && spsPps->PPSBufSize >= spsPpsInternal->PPSBufSize, MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->SPSBufSize = spsPpsInternal->SPSBufSize; spsPps->PPSBufSize = spsPpsInternal->PPSBufSize; std::copy(spsPpsInternal->SPSBuffer, spsPpsInternal->SPSBuffer + spsPps->SPSBufSize, spsPps->SPSBuffer); std::copy(spsPpsInternal->PPSBuffer, spsPpsInternal->PPSBuffer + spsPps->PPSBufSize, spsPps->PPSBuffer); } par->mfx.FrameInfo.FrameRateExtN = m_vFirstPar.mfx.FrameInfo.FrameRateExtN; par->mfx.FrameInfo.FrameRateExtD = m_vFirstPar.mfx.FrameInfo.FrameRateExtD; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtD = m_vPar.mfx.FrameInfo.FrameRateExtD; par->mfx.FrameInfo.FrameRateExtN = m_vPar.mfx.FrameInfo.FrameRateExtN; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } par->mfx.FrameInfo.AspectRatioW = m_vFirstPar.mfx.FrameInfo.AspectRatioW; par->mfx.FrameInfo.AspectRatioH = m_vFirstPar.mfx.FrameInfo.AspectRatioH; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = m_vPar.mfx.FrameInfo.AspectRatioH; par->mfx.FrameInfo.AspectRatioW = m_vPar.mfx.FrameInfo.AspectRatioW; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; } } return MFX_ERR_NONE; } // Decode bitstream header and exctract parameters from it mfxStatus VideoDECODEH265::DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par) { MFX_CHECK_NULL_PTR2(bs, par); mfxStatus sts = CheckBitstream(bs); MFX_CHECK_STS(sts); MFXMediaDataAdapter in(bs); mfx_UMC_MemAllocator tempAllocator; tempAllocator.InitMem(0, core); UMC::VideoDecoderParams avcInfo; avcInfo.m_pData = ∈ MFX_AVC_Decoder_H265 decoder; decoder.SetMemoryAllocator(&tempAllocator); UMC::Status umcRes = MFX_Utility::DecodeHeader(&decoder, &avcInfo, bs, par); MFX_CHECK(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA, MFX_ERR_MORE_DATA); MFX_CHECK(umcRes == UMC::UMC_OK, ConvertUMCStatusToMfx(umcRes)); umcRes = FillParam(&decoder, par, false); MFX_CHECK(umcRes == UMC::UMC_OK, ConvertUMCStatusToMfx(umcRes)); mfxExtCodingOptionVPS * extVps = (mfxExtCodingOptionVPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_VPS); if (extVps) { RawHeader_H265 *vps = decoder.GetVPS(); if (vps->GetSize()) { MFX_CHECK(extVps->VPSBufSize >= vps->GetSize(), MFX_ERR_NOT_ENOUGH_BUFFER); extVps->VPSBufSize = (mfxU16)vps->GetSize(); std::copy(vps->GetPointer(), vps->GetPointer() + extVps->VPSBufSize, extVps->VPSBuffer); } else { extVps->VPSBufSize = 0; } } mfxExtCodingOptionSPSPPS * spsPps = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (spsPps) { RawHeader_H265 *sps = decoder.GetSPS(); RawHeader_H265 *pps = decoder.GetPPS(); if (sps->GetSize()) { MFX_CHECK(spsPps->SPSBufSize >= sps->GetSize(), MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->SPSBufSize = (mfxU16)sps->GetSize(); std::copy(sps->GetPointer(), sps->GetPointer() + spsPps->SPSBufSize, spsPps->SPSBuffer); } else { spsPps->SPSBufSize = 0; } if (pps->GetSize()) { MFX_CHECK(spsPps->PPSBufSize >= pps->GetSize(), MFX_ERR_NOT_ENOUGH_BUFFER); spsPps->PPSBufSize = (mfxU16)pps->GetSize(); std::copy(pps->GetPointer(), pps->GetPointer() + spsPps->PPSBufSize, spsPps->PPSBuffer); } else { spsPps->PPSBufSize = 0; } } return MFX_ERR_NONE; } // MediaSDK DECODE_QueryIOSurf API function mfxStatus VideoDECODEH265::QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH265::QueryIOSurf"); MFX_CHECK_NULL_PTR2(par, request); eMFXPlatform platform = MFX_Utility::GetPlatform_H265(core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = core->GetHWType(); mfxVideoParam params; params = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(¶ms); auto const supportedMemoryType = (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!( par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY && par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY), MFX_ERR_INVALID_VIDEO_PARAM); bool isInternalManaging = params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; bool IsD3D9SimWithVideoMem = IsD3D9Simulation(*core) && (params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (IsD3D9SimWithVideoMem) isInternalManaging = true; mfxStatus sts = QueryIOSurfInternal(type, ¶ms, request); MFX_CHECK_STS(sts); sts = UpdateCscOutputFormat(¶ms, request); MFX_CHECK_STS(sts); if (isInternalManaging) { request->NumFrameSuggested = request->NumFrameMin = (mfxU16)CalculateAsyncDepth(par); if (!IsD3D9SimWithVideoMem) { request->Type = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_FROM_DECODE; } } request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { // need to substitute output format // number of surfaces is same request->Info.FourCC = videoProcessing->Out.FourCC; request->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; sts = UpdateCscOutputFormat(par, request); MFX_CHECK_STS(sts); request->Info.Width = videoProcessing->Out.Width; request->Info.Height = videoProcessing->Out.Height; request->Info.CropX = videoProcessing->Out.CropX; request->Info.CropY = videoProcessing->Out.CropY; request->Info.CropW = videoProcessing->Out.CropW; request->Info.CropH = videoProcessing->Out.CropH; } #endif MFX_CHECK(platform == core->GetPlatformType(), MFX_ERR_UNSUPPORTED); MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } // Actually calculate needed frames number mfxStatus VideoDECODEH265::QueryIOSurfInternal(eMFXHWType type, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEH265::QueryIOSurfInternal"); request->Info = par->mfx.FrameInfo; mfxU32 asyncDepth = CalculateAsyncDepth(par); bool useDelayedDisplay = (ENABLE_DELAYED_DISPLAY_MODE != 0) && IsNeedToUseHWBuffering(type) && (asyncDepth != 1); mfxExtHEVCParam * hevcParam = (mfxExtHEVCParam *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_HEVC_PARAM); if (hevcParam && (!hevcParam->PicWidthInLumaSamples || !hevcParam->PicHeightInLumaSamples)) // not initialized hevcParam = 0; mfxI32 dpbSize = 0; uint32_t level_idc = par->mfx.CodecLevel; if (hevcParam) dpbSize = CalculateDPBSize(par->mfx.CodecProfile, level_idc, hevcParam->PicWidthInLumaSamples, hevcParam->PicHeightInLumaSamples, 0); else dpbSize = CalculateDPBSize(par->mfx.CodecProfile, level_idc, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, 0) + 1; //1 extra for avoid aligned size issue if (par->mfx.MaxDecFrameBuffering && par->mfx.MaxDecFrameBuffering < dpbSize) dpbSize = par->mfx.MaxDecFrameBuffering; mfxU32 numMin = dpbSize + 1 + asyncDepth; if (useDelayedDisplay) // equals if (m_useDelayedDisplay) numMin += NUMBER_OF_ADDITIONAL_FRAMES; request->NumFrameMin = (mfxU16)numMin; request->NumFrameSuggested = request->NumFrameMin; request->Type = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE; return MFX_ERR_NONE; } // MediaSDK DECODE_GetDecodeStat API function mfxStatus VideoDECODEH265::GetDecodeStat(mfxDecodeStat *stat) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(stat); m_stat.NumSkippedFrame = m_pH265VideoDecoder->GetSkipInfo().numberOfSkippedFrames; m_stat.NumCachedFrame = 0; H265DBPList *dpb = m_pH265VideoDecoder->GetDPBList(); MFX_CHECK(dpb, MFX_ERR_UNDEFINED_BEHAVIOR); H265DecoderFrame *pFrame = dpb->head(); for (; pFrame; pFrame = pFrame->future()) { if (!pFrame->wasOutputted() && !isAlmostDisposable(pFrame)) m_stat.NumCachedFrame++; } *stat = m_stat; return MFX_ERR_NONE; } // Decoder threads entry point static mfxStatus HEVCDECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "HEVCDECODERoutine"); mfxStatus sts = MFX_ERR_NONE; try { auto decoder = reinterpret_cast(pState); MFX_CHECK(decoder, MFX_ERR_UNDEFINED_BEHAVIOR); sts = decoder->RunThread(pParam, threadNumber); MFX_CHECK_STS(sts); } catch(...) { MFX_LTRACE_MSG_1(MFX_TRACE_LEVEL_INTERNAL, "exception handled"); return MFX_ERR_NONE; } return sts; } // Threads complete proc callback static mfxStatus HEVCCompleteProc(void *, void *pParam, mfxStatus ) { delete reinterpret_cast(pParam); return MFX_ERR_NONE; } // Decoder instance threads entry point. Do async tasks here mfxStatus VideoDECODEH265::RunThread(void * params, mfxU32 threadNumber) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH265::RunThread"); ThreadTaskInfo265* info = reinterpret_cast(params); MFX_CHECK_NULL_PTR1(info); mfxStatus sts = MFX_TASK_WORKING; if (info->is_decoding_done) { return MFX_TASK_DONE; } if (!info->surface_out) { for (int32_t i = 0; i < 2 && sts == MFX_TASK_WORKING; i++) { sts = m_pH265VideoDecoder->RunThread(threadNumber); } UMC::AutomaticUMCMutex guard(m_mGuardRunThread); if (sts == MFX_TASK_BUSY && !m_pH265VideoDecoder->GetTaskBroker()->IsEnoughForStartDecoding(true)) m_globalTask = false; return m_globalTask ? sts : MFX_TASK_DONE; } bool isDecoded; { UMC::AutomaticUMCMutex guard(m_mGuardRunThread); if (info->is_decoding_done) return MFX_TASK_DONE; isDecoded = m_pH265VideoDecoder->CheckDecoding(true, info->pFrame); } if (!isDecoded) { sts = m_pH265VideoDecoder->RunThread(threadNumber); } { UMC::AutomaticUMCMutex guard(m_mGuardRunThread); if (info->is_decoding_done) return MFX_TASK_DONE; isDecoded = m_pH265VideoDecoder->CheckDecoding(true, info->pFrame); if (isDecoded) { info->is_decoding_done = true; } } if (isDecoded) { if (!info->pFrame->wasDisplayed() && info->surface_out) { mfxStatus status = DecodeFrame(info->surface_out, info->pFrame); if (status != MFX_ERR_NONE && status != MFX_ERR_NOT_FOUND) return status; } return MFX_TASK_DONE; } return sts; } // Initialize threads callbacks mfxStatus VideoDECODEH265::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) { UMC::AutomaticUMCMutex guard(m_mGuard); mfxStatus mfxSts = DecodeFrameCheck(bs, surface_work, surface_out); if (MFX_ERR_NONE == mfxSts || (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxSts) // It can be useful to run threads right after first frame receive { H265DecoderFrame *frame = nullptr; if (*surface_out) { mfxI32 index = m_surface_source->FindSurface(*surface_out); frame = m_pH265VideoDecoder->FindSurface((UMC::FrameMemID)index); } else { UMC::AutomaticUMCMutex mGuard(m_mGuardRunThread); H265DBPList *dpb = m_pH265VideoDecoder->GetDPBList(); MFX_CHECK(dpb, MFX_ERR_UNDEFINED_BEHAVIOR); H265DecoderFrame *pFrame = dpb->head(); for (; pFrame; pFrame = pFrame->future()) { if (!pFrame->m_pic_output && !pFrame->IsDecoded()) { frame = pFrame; break; } } if (!frame) { MFX_CHECK(m_pH265VideoDecoder->GetTaskBroker()->IsEnoughForStartDecoding(true) && !m_globalTask, MFX_WRN_DEVICE_BUSY); m_globalTask = true; } } ThreadTaskInfo265* info = new ThreadTaskInfo265(); if (*surface_out) info->surface_out = *surface_out; info->pFrame = frame; pEntryPoint->pRoutine = &HEVCDECODERoutine; pEntryPoint->pCompleteProc = &HEVCCompleteProc; pEntryPoint->pState = this; pEntryPoint->requiredNumThreads = m_vPar.mfx.NumThread; pEntryPoint->pParam = info; return mfxSts; } return mfxSts; } // Check if there is enough data to start decoding in async mode mfxStatus VideoDECODEH265::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEH265::DecodeFrameCheck"); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_out); } else { MFX_CHECK_NULL_PTR2(surface_work, surface_out); } mfxStatus sts = MFX_ERR_NONE; if (bs) { sts = CheckBitstream(bs); MFX_CHECK_STS(sts); } UMC::Status umcRes = UMC::UMC_OK; *surface_out = nullptr; if (surface_work) { bool isVideoProcCscEnabled = false; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing && videoProcessing->Out.FourCC != m_vPar.mfx.FrameInfo.FourCC) { isVideoProcCscEnabled = true; } #endif sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_HEVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_HEVC); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) sts = CheckFrameData(surface_work); MFX_CHECK_STS(sts); } #ifdef MFX_MAX_DECODE_FRAMES MFX_CHECK(m_stat.NumFrame < MFX_MAX_DECODE_FRAMES, MFX_ERR_UNDEFINED_BEHAVIOR); #endif sts = MFX_ERR_UNDEFINED_BEHAVIOR; #if defined(MFX_ENABLE_PROTECT) #if defined(MFX_ENABLE_PXP) //Check protect VA is enabled or not if( bs && m_va->GetProtectedVA() ) #else #endif // MFX_ENABLE_PXP { MFX_CHECK(m_va->GetProtectedVA(), MFX_ERR_UNSUPPORTED); MFX_CHECK((bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME), MFX_ERR_UNSUPPORTED); m_va->GetProtectedVA()->SetBitstream(bs); } #endif // MFX_ENABLE_PROTECT try { bool force = false; UMC::Status umcFrameRes = UMC::UMC_OK; MFXMediaDataAdapter src(bs); mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; if (extbuf) { reinterpret_cast(extbuf)->ErrorTypes = 0; src.SetExtBuffer(extbuf); } for (;;) { sts = m_surface_source->SetCurrentMFXSurface(surface_work); MFX_CHECK_STS(sts); umcRes = !m_surface_source->HasFreeSurface() ? UMC::UMC_ERR_NEED_FORCE_OUTPUT : m_pH265VideoDecoder->AddSource(bs ? &src : 0); umcFrameRes = umcRes; if (umcRes == UMC::UMC_NTF_NEW_RESOLUTION || umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS || umcRes == UMC::UMC_ERR_UNSUPPORTED) { FillVideoParam(&m_vPar, true); } if (umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS) { if (!m_isFirstRun) { sts = MFX_WRN_VIDEO_PARAM_CHANGED; } else { umcFrameRes = umcRes = UMC::UMC_OK; m_isFirstRun = false; } } if (umcRes == UMC::UMC_ERR_INVALID_STREAM) { umcFrameRes = umcRes = UMC::UMC_OK; } if (umcRes == UMC::UMC_NTF_NEW_RESOLUTION) { sts = MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } if (umcRes == UMC::UMC_OK && !m_surface_source->HasFreeSurface()) { sts = MFX_ERR_MORE_SURFACE; umcFrameRes = UMC::UMC_ERR_NOT_ENOUGH_BUFFER; } if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || umcRes == UMC::UMC_WRN_INFO_NOT_READY || umcRes == UMC::UMC_ERR_NEED_FORCE_OUTPUT) { force = (umcRes == UMC::UMC_ERR_NEED_FORCE_OUTPUT); sts = umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER ? (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK: MFX_WRN_DEVICE_BUSY; } if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA || umcRes == UMC::UMC_ERR_SYNC) { if (!bs || bs->DataFlag == MFX_BITSTREAM_EOS) force = true; sts = MFX_ERR_MORE_DATA; } if (umcRes == UMC::UMC_ERR_DEVICE_FAILED) { sts = MFX_ERR_DEVICE_FAILED; } if (umcRes == UMC::UMC_ERR_GPU_HANG) { sts = MFX_ERR_GPU_HANG; } src.Save(bs); if (sts == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) MFX_RETURN(sts); //return these errors immediatelly unless we have [input == 0] if (sts == MFX_ERR_DEVICE_FAILED || sts == MFX_ERR_GPU_HANG) { if (!bs || bs->DataFlag == MFX_BITSTREAM_EOS) force = true; else MFX_RETURN(sts); } umcRes = m_pH265VideoDecoder->RunDecoding(); if (m_vInitPar.mfx.DecodedOrder) force = true; H265DecoderFrame *pFrame = nullptr; #if defined(MFX_ENABLE_PXP) if (m_va->GetProtectedVA()) { if (umcFrameRes != UMC::UMC_ERR_NOT_ENOUGH_BUFFER) { pFrame = GetFrameToDisplay_H265(force); } } else #endif pFrame = GetFrameToDisplay_H265(force); // return frame to display if (pFrame) { FillOutputSurface(surface_out, surface_work, pFrame); m_frameOrder = (mfxU16)pFrame->m_frameOrder; (*surface_out)->Data.FrameOrder = m_frameOrder; return MFX_ERR_NONE; } *surface_out = 0; if (umcFrameRes != UMC::UMC_OK) break; } // for (;;) } catch(const h265_exception & ex) { FillVideoParam(&m_vPar, false); if (ex.GetStatus() == UMC::UMC_ERR_ALLOC) { // check incompatibility of video params if (m_vInitPar.mfx.FrameInfo.Width != m_vPar.mfx.FrameInfo.Width || m_vInitPar.mfx.FrameInfo.Height != m_vPar.mfx.FrameInfo.Height) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } MFX_RETURN(ConvertUMCStatusToMfx(ex.GetStatus())); } catch(const std::bad_alloc &) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } catch(...) { MFX_RETURN(MFX_ERR_UNKNOWN); } MFX_RETURN(sts); } // Fill up resolution information if new header arrived void VideoDECODEH265::FillVideoParam(mfxVideoParamWrapper *par, bool full) { if (!m_pH265VideoDecoder.get()) return; FillParam(m_pH265VideoDecoder.get(), par, full); RawHeader_H265 *sps = m_pH265VideoDecoder->GetSPS(); RawHeader_H265 *pps = m_pH265VideoDecoder->GetPPS(); mfxExtCodingOptionSPSPPS * spsPps = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (spsPps) { if (sps->GetSize()) { spsPps->SPSBufSize = (mfxU16)sps->GetSize(); spsPps->SPSBuffer = sps->GetPointer(); } else { spsPps->SPSBufSize = 0; } if (pps->GetSize()) { spsPps->PPSBufSize = (mfxU16)pps->GetSize(); spsPps->PPSBuffer = pps->GetPointer(); } else { spsPps->PPSBufSize = 0; } } } // Fill up frame parameters before returning it to application void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSurface1 *surface_work, H265DecoderFrame * pFrame) { m_stat.NumFrame++; m_stat.NumError += pFrame->GetError() ? 1 : 0; const UMC::FrameData * fd = pFrame->GetFrameData(); *surf_out = m_surface_source->GetSurface(fd->GetFrameMID(), surface_work, &m_vPar); assert(*surf_out); mfxFrameSurface1 *surface_out = *surf_out; surface_out->Info.FrameId.TemporalId = 0; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { surface_out->Info.CropH = videoProcessing->Out.CropH; surface_out->Info.CropW = videoProcessing->Out.CropW; surface_out->Info.CropX = videoProcessing->Out.CropX; surface_out->Info.CropY = videoProcessing->Out.CropY; surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; } else #endif { surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); switch(pFrame->m_chroma_format) { case 0: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; break; case 1: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; break; case 2: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; break; case 3: surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; break; default: assert(!"Unknown chroma format"); surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; } } bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); surface_out->Info.AspectRatioH = isShouldUpdate ? (mfxU16)pFrame->m_aspect_height : m_vFirstPar.mfx.FrameInfo.AspectRatioH; surface_out->Info.AspectRatioW = isShouldUpdate ? (mfxU16)pFrame->m_aspect_width : m_vFirstPar.mfx.FrameInfo.AspectRatioW; isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.FrameRateExtD || m_vFirstPar.mfx.FrameInfo.FrameRateExtN); surface_out->Info.FrameRateExtD = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtD : m_vFirstPar.mfx.FrameInfo.FrameRateExtD; surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; surface_out->Info.PicStruct = UMC2MFX_PicStruct(pFrame->m_DisplayPictureStruct_H265, !!m_vPar.mfx.ExtendedPicStruct); surface_out->Data.TimeStamp = GetMfxTimeStamp(pFrame->m_dFrameTime); surface_out->Data.FrameOrder = (mfxU32)MFX_FRAMEORDER_UNKNOWN; surface_out->Data.DataFlag = (mfxU16)(pFrame->m_isOriginalPTS ? MFX_FRAMEDATA_ORIGINAL_TIMESTAMP : 0); TRACE_BUFFER_EVENT(MFX_TRACE_API_HEVC_OUTPUTINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, surface_out, H265DecodeSurfaceOutparam, SURFACEOUT_H265D); SEI_Storer_H265 * storer = m_pH265VideoDecoder->GetSEIStorer(); if (storer) storer->SetTimestamp(pFrame); mfxExtDecodedFrameInfo* info = (mfxExtDecodedFrameInfo*)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO); if (info) { switch (pFrame->m_FrameType) { case UMC::I_PICTURE: info->FrameType = MFX_FRAMETYPE_I; if (pFrame->GetAU()->m_IsIDR) info->FrameType |= MFX_FRAMETYPE_IDR; break; case UMC::P_PICTURE: info->FrameType = MFX_FRAMETYPE_P; break; case UMC::B_PICTURE: info->FrameType = MFX_FRAMETYPE_B; break; default: assert(!"Unknown frame type"); info->FrameType = MFX_FRAMETYPE_UNKNOWN; } if (pFrame->m_isUsedAsReference) info->FrameType |= MFX_FRAMETYPE_REF; } mfxExtMasteringDisplayColourVolume* display_colour = (mfxExtMasteringDisplayColourVolume*)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME); if (display_colour && pFrame->m_mastering_display.payLoadSize > 0) { for (size_t i = 0; i < 3; i++) { display_colour->DisplayPrimariesX[i] = (mfxU16)pFrame->m_mastering_display.SEI_messages.mastering_display.display_primaries[i][0]; display_colour->DisplayPrimariesY[i] = (mfxU16)pFrame->m_mastering_display.SEI_messages.mastering_display.display_primaries[i][1]; } display_colour->WhitePointX = (mfxU16)pFrame->m_mastering_display.SEI_messages.mastering_display.white_point[0]; display_colour->WhitePointY = (mfxU16)pFrame->m_mastering_display.SEI_messages.mastering_display.white_point[1]; display_colour->MaxDisplayMasteringLuminance = (mfxU32)pFrame->m_mastering_display.SEI_messages.mastering_display.max_luminance; display_colour->MinDisplayMasteringLuminance = (mfxU32)pFrame->m_mastering_display.SEI_messages.mastering_display.min_luminance; display_colour->InsertPayloadToggle = MFX_PAYLOAD_IDR; } else if(display_colour) { display_colour->InsertPayloadToggle = MFX_PAYLOAD_OFF; } mfxExtContentLightLevelInfo* content_light = (mfxExtContentLightLevelInfo*)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO); if (content_light && pFrame->m_content_light_level_info.payLoadSize > 0) { content_light->MaxContentLightLevel = (mfxU16)pFrame->m_content_light_level_info.SEI_messages.content_light_level_info.max_content_light_level; content_light->MaxPicAverageLightLevel = (mfxU16)pFrame->m_content_light_level_info.SEI_messages.content_light_level_info.max_pic_average_light_level; content_light->InsertPayloadToggle = MFX_PAYLOAD_IDR; } else if(content_light) { content_light->InsertPayloadToggle = MFX_PAYLOAD_OFF; } } // Wait until a frame is ready to be output and set necessary surface flags mfxStatus VideoDECODEH265::DecodeFrame(mfxFrameSurface1 *surface_out, H265DecoderFrame * pFrame) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEH265::DecodeFrame"); MFX_CHECK_NULL_PTR1(surface_out); mfxI32 index; if (pFrame) { index = pFrame->GetFrameData()->GetFrameMID(); } else { index = m_surface_source->FindSurface(surface_out); pFrame = m_pH265VideoDecoder->FindSurface((UMC::FrameMemID)index); MFX_CHECK(pFrame, MFX_ERR_NOT_FOUND); } surface_out->Data.Corrupted = 0; int32_t const error = pFrame->GetError(); if (error & UMC::ERROR_FRAME_DEVICE_FAILURE) { surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; MFX_CHECK(error != UMC::UMC_ERR_GPU_HANG, MFX_ERR_GPU_HANG); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } else { if (error & UMC::ERROR_FRAME_MINOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MINOR; if (error & UMC::ERROR_FRAME_MAJOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_REFERENCE_FRAME) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; if (error & UMC::ERROR_FRAME_DPB) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_LIST; if (error & UMC::ERROR_FRAME_RECOVERY) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_TOP_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_TOP_FIELD; if (error & UMC::ERROR_FRAME_BOTTOM_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_BOTTOM_FIELD; } mfxStatus sts = m_surface_source->PrepareToOutput(surface_out, index, &m_vPar); pFrame->setWasDisplayed(); TRACE_EVENT(MFX_TRACE_API_HEVC_DISPLAYINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( pFrame->m_PicOrderCnt, (uint32_t)pFrame->wasDisplayed(), (uint32_t)pFrame->wasOutputted())); return sts; } // Wait until a frame is ready to be output and set necessary surface flags mfxStatus VideoDECODEH265::DecodeFrame(mfxBitstream *, mfxFrameSurface1 *, mfxFrameSurface1 *surface_out) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(surface_out); mfxStatus sts = DecodeFrame(surface_out); return sts; } // Returns closed caption data mfxStatus VideoDECODEH265::GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ud, sz, ts); mfxStatus MFXSts = MFX_ERR_NONE; UMC::MediaData data; UMC::Status umcRes = m_pH265VideoDecoder->GetUserData(&data); if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA) MFX_RETURN(MFX_ERR_MORE_DATA); MFX_CHECK(*sz >= data.GetDataSize(), MFX_ERR_NOT_ENOUGH_BUFFER); *sz = (mfxU32)data.GetDataSize(); *ts = GetMfxTimeStamp(data.GetTime()); mfxU8 *pDataPointer = reinterpret_cast (data.GetDataPointer()); std::copy(pDataPointer, pDataPointer + *sz, ud); return MFXSts; } // Returns stored SEI messages mfxStatus VideoDECODEH265::GetPayload( mfxU64 *ts, mfxPayload *payload ) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ts, payload, payload->Data); SEI_Storer_H265 * storer = m_pH265VideoDecoder->GetSEIStorer(); MFX_CHECK(storer, MFX_ERR_UNKNOWN); const SEI_Storer_H265::SEI_Message * msg = storer->GetPayloadMessage(); if (msg) { MFX_CHECK(payload->BufSize >= msg->size, MFX_ERR_NOT_ENOUGH_BUFFER); *ts = GetMfxTimeStamp(msg->timestamp); std::copy(msg->data, msg->data + msg->size, payload->Data); payload->CtrlFlags = msg->nal_type == NAL_UT_SEI_SUFFIX ? MFX_PAYLOAD_CTRL_SUFFIX : 0; payload->NumBit = (mfxU32)(msg->size * 8); payload->Type = (mfxU16)msg->type; } else { payload->NumBit = 0; *ts = MFX_TIME_STAMP_INVALID; } return MFX_ERR_NONE; } // Find a next frame ready to be output from decoder H265DecoderFrame * VideoDECODEH265::GetFrameToDisplay_H265(bool force) { H265DecoderFrame * pFrame = m_pH265VideoDecoder->GetFrameToDisplayInternal(force); if (!pFrame) { return 0; } pFrame->setWasOutputted(); m_pH265VideoDecoder->PostProcessDisplayFrame(pFrame); return pFrame; } // MediaSDK DECODE_SetSkipMode API function mfxStatus VideoDECODEH265::SetSkipMode(mfxSkipMode mode) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); int32_t test_num = 0; mfxStatus sts = m_pH265VideoDecoder->ChangeVideoDecodingSpeed(test_num); MFX_CHECK_STS(sts); int32_t num = 0; switch(mode) { case MFX_SKIPMODE_NOSKIP: num = -10; break; case MFX_SKIPMODE_MORE: num = 1; break; case MFX_SKIPMODE_LESS: num = -1; break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } m_pH265VideoDecoder->ChangeVideoDecodingSpeed(num); MFX_CHECK(test_num != num, MFX_WRN_VALUE_NOT_CHANGED); return MFX_ERR_NONE; } // Check if new parameters are compatible with new parameters bool VideoDECODEH265::IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type) { auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; if ((newPar->IOPattern & mask) != (oldPar->IOPattern & mask)) { return false; } if (newPar->Protected != oldPar->Protected) { return false; } if (CalculateAsyncDepth(newPar) != CalculateAsyncDepth(oldPar)) { return false; } mfxFrameAllocRequest requestOld; memset(&requestOld, 0, sizeof(requestOld)); mfxFrameAllocRequest requestNew; memset(&requestNew, 0, sizeof(requestNew)); mfxStatus mfxSts = QueryIOSurfInternal(type, oldPar, &requestOld); if (mfxSts != MFX_ERR_NONE) return false; mfxSts = QueryIOSurfInternal(type, newPar, &requestNew); if (mfxSts != MFX_ERR_NONE) return false; if (newPar->mfx.FrameInfo.Height > oldPar->mfx.FrameInfo.Height) { return false; } if (newPar->mfx.FrameInfo.Width > oldPar->mfx.FrameInfo.Width) { return false; } if (m_response.NumFrameActual) { if (requestNew.NumFrameMin > m_response.NumFrameActual) return false; } else { if (requestNew.NumFrameMin > requestOld.NumFrameMin || requestNew.Type != requestOld.Type) return false; } if (newPar->mfx.FrameInfo.FourCC != oldPar->mfx.FrameInfo.FourCC) { return false; } if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { return false; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * newVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(newPar->ExtParam, newPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxExtDecVideoProcessing * oldVideoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(oldPar->ExtParam, oldPar->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (((newVideoProcessing) && (!oldVideoProcessing)) || ((!newVideoProcessing) && (oldVideoProcessing))) return false; else if (newVideoProcessing && oldVideoProcessing) { if (newVideoProcessing->Out.Width > oldVideoProcessing->Out.Width) return false; if (newVideoProcessing->Out.Height > oldVideoProcessing->Out.Height) return false; /* Check Input cropping */ if (!((newVideoProcessing->In.CropX <= newVideoProcessing->In.CropW) && (newVideoProcessing->In.CropW <= newPar->mfx.FrameInfo.CropW) && (newVideoProcessing->In.CropY <= newVideoProcessing->In.CropH) && (newVideoProcessing->In.CropH <= newPar->mfx.FrameInfo.CropH))) return false; /* Check output cropping */ if (!((newVideoProcessing->Out.CropX <= newVideoProcessing->Out.CropW) && (newVideoProcessing->Out.CropW <= newVideoProcessing->Out.Width) && ((newVideoProcessing->Out.CropX + newVideoProcessing->Out.CropH) <= newVideoProcessing->Out.Width) && (newVideoProcessing->Out.CropY <= newVideoProcessing->Out.CropH) && (newVideoProcessing->Out.CropH <= newVideoProcessing->Out.Height) && ((newVideoProcessing->Out.CropY + newVideoProcessing->Out.CropH) <= newVideoProcessing->Out.Height))) return false; } #endif //MFX_DEC_VIDEO_POSTPROCESS_DISABLE return true; } mfxStatus VideoDECODEH265::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } mfxFrameSurface1 *VideoDECODEH265::GetInternalSurface(mfxFrameSurface1 *surface) { return m_surface_source->GetInternalSurface(surface); } #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mjpeg/000077500000000000000000000000001443134507600247025ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mjpeg/include/000077500000000000000000000000001443134507600263255ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mjpeg/include/mfx_mjpeg_dec_decode.h000066400000000000000000000220071443134507600325710ustar00rootroot00000000000000// Copyright (c) 2004-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "umc_defs.h" #ifndef _MFX_MJPEG_DEC_DECODE_H_ #define _MFX_MJPEG_DEC_DECODE_H_ #include "mfx_common_int.h" #include "umc_video_decoder.h" #include "mfx_umc_alloc_wrapper.h" #include #ifdef MFX_ENABLE_JPEG_SW_FALLBACK #include #endif #include "mfx_task.h" #include "umc_media_data.h" #include "mfx_vpp_jpeg.h" namespace UMC { class MJPEGVideoDecoderBaseMFX; class JpegFrameConstructor; class MediaDataEx; class FrameData; class MediaData; }; class VideoDECODEMJPEGBase { public: std::unique_ptr m_surface_source; UMC::VideoDecoderParams umcVideoParams; // Free tasks queue guard (if SW is used) std::mutex m_guard; mfxDecodeStat m_stat; mfxVideoParamWrapper m_vPar; VideoDECODEMJPEGBase(); virtual ~VideoDECODEMJPEGBase(){}; virtual mfxStatus Init(mfxVideoParam *decPar, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, mfxFrameAllocRequest *request_internal, bool isUseExternalFrames, VideoCORE *core) = 0; virtual mfxStatus ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf) = 0; virtual mfxStatus CheckTaskAvailability(mfxU32 maxTaskNumber) = 0; virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus RunThread(void *pParam, mfxU32 threadNumber, mfxU32 callNumber) = 0; virtual mfxStatus CompleteTask(void *pParam, mfxStatus taskRes) = 0; virtual void ReleaseReservedTask() = 0; virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) = 0; virtual mfxStatus AllocateFrameData(UMC::FrameData *&data) = 0; virtual mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; protected: mfxStatus GetVideoParam(mfxVideoParam *par, UMC::MJPEGVideoDecoderBaseMFX * mjpegDecoder); }; namespace UMC { class MJPEGVideoDecoderMFX_HW; }; class VideoDECODEMJPEGBase_HW : public VideoDECODEMJPEGBase { public: VideoDECODEMJPEGBase_HW(); virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(void); virtual mfxStatus Init(mfxVideoParam *decPar, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, mfxFrameAllocRequest *request_internal, bool isUseExternalFrames, VideoCORE *core); virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus RunThread(void *pParam, mfxU32 threadNumber, mfxU32 callNumber); virtual mfxStatus CompleteTask(void *pParam, mfxStatus taskRes); virtual mfxStatus CheckTaskAvailability(mfxU32 maxTaskNumber); virtual mfxStatus ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf); virtual void ReleaseReservedTask(); virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic); virtual mfxStatus AllocateFrameData(UMC::FrameData *&data); virtual mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out); mfxU32 AdjustFrameAllocRequest(mfxFrameAllocRequest *request, mfxInfoMFX *info, eMFXVAType vaType, bool usePostProcessing); static void AdjustFourCC(mfxFrameInfo *requestFrameInfo, const mfxInfoMFX *info, eMFXVAType vaType, bool usePostProc, bool *needVpp); static mfxStatus CheckVPPCaps(VideoCORE * core, mfxVideoParam * par); protected: // Decoder's array std::unique_ptr m_pMJPEGVideoDecoder; // True if we need special VPP color conversion after decoding bool m_needVpp; // Number of pictures collected mfxU32 m_numPic; // Output frame UMC::FrameData *m_dst; // Array of all currently using frames std::vector m_dsts; UMC::VideoAccelerator * m_va; }; #ifdef MFX_ENABLE_JPEG_SW_FALLBACK // Forward declaration of used classes class CJpegTask; class VideoDECODEMJPEGBase_SW : public VideoDECODEMJPEGBase { public: VideoDECODEMJPEGBase_SW(); mfxStatus Init(mfxVideoParam *decPar, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, mfxFrameAllocRequest *request_internal, bool isUseExternalFrames, VideoCORE *core) override; mfxStatus Reset(mfxVideoParam *par) override; mfxStatus Close(void) override; mfxStatus GetVideoParam(mfxVideoParam *par) override; mfxStatus RunThread(void *pParam, mfxU32 threadNumber, mfxU32 callNumber) override; mfxStatus CompleteTask(void *pParam, mfxStatus taskRes) override; mfxStatus CheckTaskAvailability(mfxU32 maxTaskNumber) override; mfxStatus ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf) override; void ReleaseReservedTask() override; mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) override; mfxStatus AllocateFrameData(UMC::FrameData *&data) override; mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) override; protected: CJpegTask *pLastTask; // Free tasks queue (if SW is used) std::queue> m_freeTasks; // Count of created tasks (if SW is used) mfxU16 m_tasksCount; }; #endif class VideoDECODEMJPEG : public VideoDECODE { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); VideoDECODEMJPEG(VideoCORE *core, mfxStatus * sts); virtual ~VideoDECODEMJPEG(void); mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out); virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) override; virtual mfxStatus DecodeFrame(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out); virtual mfxStatus GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts); virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override; virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; protected: static mfxStatus QueryIOSurfInternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); bool IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar); // Frames collecting unit std::unique_ptr m_frameConstructor; mfxVideoParamWrapper m_vFirstPar; mfxVideoParamWrapper m_vPar; VideoCORE * m_core; bool m_isInit; bool m_isHeaderFound; bool m_isHeaderParsed; mfxU32 m_frameOrder; std::unique_ptr decoder; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; eMFXPlatform m_platform; std::mutex m_mGuard; // Frame skipping rate mfxU32 m_skipRate; // Frame skipping count mfxU32 m_skipCount; // // Asynchronous processing functions // static mfxStatus MJPEGDECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus MJPEGCompleteProc(void *pState, void *pParam, mfxStatus taskRes); }; #endif // _MFX_MJPEG_DEC_DECODE_H_ #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mjpeg/src/000077500000000000000000000000001443134507600254715ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mjpeg/src/mfx_mjpeg_dec_decode.cpp000066400000000000000000002166631443134507600323050ustar00rootroot00000000000000// Copyright (c) 2004-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_mjpeg_dec_decode.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "mfx_common.h" #include "mfx_common_decode_int.h" #ifdef MFX_ENABLE_JPEG_SW_FALLBACK #include "mfx_mjpeg_task.h" #include "umc_mjpeg_mfx_decode.h" #include "mfx_thread_task.h" #endif #include "mfx_enc_common.h" #include "umc_jpeg_frame_constructor.h" #include "umc_mjpeg_mfx_decode_hw.h" #include "ippcore.h" // MfxIppInit in case of bundled IPP #include "libmfx_core_interface.h" // Declare skipping constants enum { JPEG_MIN_SKIP_RATE = 0, JPEG_MAX_SKIP_RATE = 9, JPEG_SKIP_BOUND = JPEG_MAX_SKIP_RATE + 1 }; struct ThreadTaskInfoJpeg { mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out; UMC::FrameData *dst; mfxU32 decodeTaskID; mfxU32 vppTaskID; bool needCheckVppStatus; mfxU32 numDecodeTasksToCheck; }; static void SetFrameType(mfxFrameSurface1 &surface_out) { auto extFrameInfo = reinterpret_cast(GetExtendedBuffer(surface_out.Data.ExtParam, surface_out.Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO)); if (extFrameInfo == nullptr) return; // terms I/P/B frames not applicable for JPEG, // so all frames marked as I extFrameInfo->FrameType = MFX_FRAMETYPE_I; } class MFX_JPEG_Utility { public: static eMFXPlatform GetPlatform(VideoCORE * core, mfxVideoParam * par); static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type); static bool CheckVideoParam(mfxVideoParam *in, eMFXHWType type); private: static bool IsNeedPartialAcceleration(VideoCORE * core, mfxVideoParam * par); }; VideoDECODEMJPEG::VideoDECODEMJPEG(VideoCORE *core, mfxStatus * sts) : VideoDECODE() , m_core(core) , m_isInit(false) , m_frameOrder((mfxU16)MFX_FRAMEORDER_UNKNOWN) , m_response() , m_response_alien() , m_platform(MFX_PLATFORM_SOFTWARE) { if (sts) { *sts = MFX_ERR_NONE; } m_isHeaderFound = false; m_isHeaderParsed = false; m_skipRate = 0; m_skipCount = 0; } VideoDECODEMJPEG::~VideoDECODEMJPEG(void) { Close(); } mfxStatus VideoDECODEMJPEG::Init(mfxVideoParam *par) { std::lock_guard guard(m_mGuard); if (m_isInit) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_NULL_PTR1(par); m_platform = MFX_JPEG_Utility::GetPlatform(m_core, par); eMFXHWType type = MFX_HW_UNKNOWN; if (m_platform == MFX_PLATFORM_HARDWARE) { type = m_core->GetHWType(); } if (CheckVideoParamDecoders(par, type) < MFX_ERR_NONE) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!MFX_JPEG_Utility::CheckVideoParam(par, type)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); m_vFirstPar = *par; m_vFirstPar.mfx.NumThread = 0; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_vFirstPar); m_vPar = m_vFirstPar; m_vPar.mfx.NumThread = (mfxU16)(m_vPar.AsyncDepth ? m_vPar.AsyncDepth : m_core->GetAutoAsyncDepth()); if (MFX_PLATFORM_SOFTWARE != m_platform) m_vPar.mfx.NumThread = 1; int32_t useInternal = (MFX_PLATFORM_SOFTWARE == m_platform) ? (m_vPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) : (m_vPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); // allocate memory mfxFrameAllocRequest request; mfxFrameAllocRequest request_internal; memset(&request, 0, sizeof(request)); memset(&m_response, 0, sizeof(m_response)); memset(&m_response_alien, 0, sizeof(m_response_alien)); MFX_SAFE_CALL(QueryIOSurfInternal(m_core, &m_vPar, &request)); request_internal = request; if (IsD3D9Simulation(*m_core)) useInternal = true; if (useInternal) request.Type |= MFX_MEMTYPE_INTERNAL_FRAME; else request.Type |= MFX_MEMTYPE_EXTERNAL_FRAME; mfxStatus mfxSts = MFX_ERR_NONE; if (MFX_PLATFORM_SOFTWARE == m_platform) { #ifdef MFX_ENABLE_JPEG_SW_FALLBACK decoder.reset(new VideoDECODEMJPEGBase_SW); #else MFX_RETURN(MFX_ERR_UNSUPPORTED); #endif } else { VideoDECODEMJPEGBase_HW * dec = new VideoDECODEMJPEGBase_HW; decoder.reset(dec); bool usePostProcessing = GetExtendedBuffer(m_vPar.ExtParam, m_vPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxU32 bNeedVpp = dec->AdjustFrameAllocRequest(&request_internal, &m_vPar.mfx, m_core->GetVAType(), usePostProcessing); useInternal |= bNeedVpp; if (bNeedVpp) { if (request_internal.Type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) { request_internal.Type &= ~(MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPOUT); } request_internal.Type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; try { dec->m_surface_source.reset(new SurfaceSourceJPEG(m_core, *par, m_platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } } } decoder->m_vPar = m_vPar; if (!decoder->m_surface_source) { try { decoder->m_surface_source.reset(new SurfaceSource(m_core, *par, m_platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } } mfxVideoParam decPar = *par; decPar.mfx.FrameInfo = request.Info; m_frameConstructor.reset(new UMC::JpegFrameConstructor()); mfxSts = decoder->Init(&decPar, &request, &m_response, &request_internal, !useInternal, m_core); MFX_CHECK(mfxSts >= MFX_ERR_NONE, mfxSts); m_isInit = true; m_isHeaderFound = false; m_isHeaderParsed = false; m_frameOrder = 0; if (m_platform != m_core->GetPlatformType()) { assert(m_platform == MFX_PLATFORM_SOFTWARE); MFX_RETURN(MFX_WRN_PARTIAL_ACCELERATION); } MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::QueryImplsDescription( VideoCORE&, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU32 SupportedProfiles[] = { MFX_PROFILE_JPEG_BASELINE }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_RGB4 , MFX_FOURCC_YUY2 }; caps.CodecID = MFX_CODEC_JPEG; caps.MaxcodecLevel = MFX_LEVEL_UNKNOWN; for (mfxU32 profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 16384, 16 }; memCaps.Height = { 16, 16384, 16 }; for (auto fcc : SupportedFourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::Reset(mfxVideoParam *par) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); eMFXHWType type = MFX_HW_UNKNOWN; if (m_platform == MFX_PLATFORM_HARDWARE) { type = m_core->GetHWType(); } if (CheckVideoParamDecoders(par, type) < MFX_ERR_NONE) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!MFX_JPEG_Utility::CheckVideoParam(par, type)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!IsSameVideoParam(par, &m_vFirstPar)) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // need to sw acceleration if (m_platform != MFX_JPEG_Utility::GetPlatform(m_core, par)) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } MFX_SAFE_CALL(decoder->Reset(par)); m_frameOrder = 0; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(par); m_vPar = *par; if (isNeedChangeVideoParamWarning) { MFX_RETURN(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } m_isHeaderFound = false; m_isHeaderParsed = false; m_skipRate = 0; m_skipCount = 0; m_frameConstructor->Reset(); if (m_platform != m_core->GetPlatformType()) { assert(m_platform == MFX_PLATFORM_SOFTWARE); MFX_RETURN(MFX_WRN_PARTIAL_ACCELERATION); } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::Close(void) { if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); decoder->Close(); m_isInit = false; m_isHeaderFound = false; m_isHeaderParsed = false; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_frameConstructor->Close(); return MFX_ERR_NONE; } mfxTaskThreadingPolicy VideoDECODEMJPEG::GetThreadingPolicy(void) { return MFX_TASK_THREADING_INTER; } mfxStatus VideoDECODEMJPEG::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { MFX_CHECK_NULL_PTR1(out); eMFXHWType type = core->GetHWType(); return MFX_JPEG_Utility::Query(core, in, out, type); } mfxStatus VideoDECODEMJPEG::GetVideoParam(mfxVideoParam *par) { if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); par->mfx = m_vPar.mfx; par->Protected = m_vPar.Protected; par->IOPattern = m_vPar.IOPattern; par->AsyncDepth = m_vPar.AsyncDepth; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtD = m_vPar.mfx.FrameInfo.FrameRateExtD; par->mfx.FrameInfo.FrameRateExtN = m_vPar.mfx.FrameInfo.FrameRateExtN; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = m_vPar.mfx.FrameInfo.AspectRatioH; par->mfx.FrameInfo.AspectRatioW = m_vPar.mfx.FrameInfo.AspectRatioW; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; } } return decoder->GetVideoParam(par); } mfxStatus VideoDECODEMJPEG::DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par) { MFX_CHECK_NULL_PTR2(bs, par); mfxStatus sts = CheckBitstream(bs); if (sts != MFX_ERR_NONE) { MFX_CHECK_INIT(sts == MFX_ERR_NULL_PTR); MFX_RETURN(MFX_ERR_NULL_PTR); } MFXMediaDataAdapter in(bs); mfx_UMC_MemAllocator tempAllocator; tempAllocator.InitMem(0, core); mfxExtJPEGQuantTables* jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); // DecodeHeader UMC::MJPEGVideoDecoderBaseMFX decoder; UMC::VideoDecoderParams umcVideoParams; umcVideoParams.info.clip_info.height = par->mfx.FrameInfo.Height; umcVideoParams.info.clip_info.width = par->mfx.FrameInfo.Width; umcVideoParams.lpMemoryAllocator = &tempAllocator; UMC::Status umcRes = decoder.Init(&umcVideoParams); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; if (extbuf) { reinterpret_cast(extbuf)->ErrorTypes = 0; in.SetExtBuffer(extbuf); } umcRes = decoder.DecodeHeader(&in); in.Save(bs); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); mfxVideoParam temp; umcRes = decoder.FillVideoParam(&temp, false); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); if(jpegQT) { umcRes = decoder.FillQuantTableExtBuf(jpegQT); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); } if(jpegHT) { umcRes = decoder.FillHuffmanTableExtBuf(jpegHT); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); } decoder.Close(); tempAllocator.Close(); par->mfx.FrameInfo = temp.mfx.FrameInfo; par->mfx.JPEGChromaFormat = temp.mfx.JPEGChromaFormat; par->mfx.JPEGColorFormat = temp.mfx.JPEGColorFormat; par->mfx.Rotation = temp.mfx.Rotation; par->mfx.InterleavedDec = temp.mfx.InterleavedDec; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR2(par, request); eMFXPlatform platform = MFX_JPEG_Utility::GetPlatform(core, par); mfxVideoParam params = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(¶ms); if ( !(par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if ((par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); MFX_SAFE_CALL(QueryIOSurfInternal(core, ¶ms, request)); int32_t isInternalManaging = (MFX_PLATFORM_SOFTWARE == platform) ? (params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) : (params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); if (isInternalManaging) { request->NumFrameSuggested = request->NumFrameMin = par->AsyncDepth ? par->AsyncDepth : core->GetAutoAsyncDepth(); request->Type = MFX_MEMTYPE_FROM_DECODE; if (MFX_PLATFORM_SOFTWARE == platform) { if ((request->Info.FourCC == MFX_FOURCC_RGB4 || request->Info.FourCC == MFX_FOURCC_YUY2) && MFX_HW_D3D11 == core->GetVAType()) request->Type |= MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET; else request->Type |= MFX_MEMTYPE_DXVA2_DECODER_TARGET; } else { request->Type |= MFX_MEMTYPE_SYSTEM_MEMORY; } } request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; if (platform != core->GetPlatformType()) { assert(platform == MFX_PLATFORM_SOFTWARE); return MFX_WRN_PARTIAL_ACCELERATION; } if (isNeedChangeVideoParamWarning) { return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::QueryIOSurfInternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { eMFXPlatform platform = MFX_JPEG_Utility::GetPlatform(core, par); request->Info = par->mfx.FrameInfo; mfxU32 asyncDepth = (par->AsyncDepth ? par->AsyncDepth : core->GetAutoAsyncDepth()); request->NumFrameMin = mfxU16 (asyncDepth); request->NumFrameSuggested = request->NumFrameMin; request->Type = MFX_MEMTYPE_FROM_DECODE; mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { // need to substitute output format // number of surfaces is same request->Info.FourCC = videoProcessing->Out.FourCC; request->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; request->Info.Width = videoProcessing->Out.Width; request->Info.Height = videoProcessing->Out.Height; request->Info.CropX = videoProcessing->Out.CropX; request->Info.CropY = videoProcessing->Out.CropY; request->Info.CropW = videoProcessing->Out.CropW; request->Info.CropH = videoProcessing->Out.CropH; } if(MFX_ROTATION_90 == par->mfx.Rotation || MFX_ROTATION_270 == par->mfx.Rotation) { std::swap(request->Info.Height, request->Info.Width); std::swap(request->Info.AspectRatioH, request->Info.AspectRatioW); std::swap(request->Info.CropH, request->Info.CropW); std::swap(request->Info.CropY, request->Info.CropX); } request->Info.Width = mfx::align2_value(request->Info.Width, 0x10); request->Info.Height = mfx::align2_value(request->Info.Height, (request->Info.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 0x8 : 0x10); if (MFX_PLATFORM_SOFTWARE == platform) { request->Type |= MFX_MEMTYPE_SYSTEM_MEMORY; } else { bool needVpp = false; if(par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_FIELD_TFF || par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_FIELD_BFF) { needVpp = true; } mfxFrameAllocRequest request_internal = *request; bool usePostProcessing = GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); VideoDECODEMJPEGBase_HW::AdjustFourCC(&request_internal.Info, &par->mfx, core->GetVAType(), usePostProcessing, &needVpp); if (needVpp && MFX_HW_D3D11 == core->GetVAType()) { request->Type |= MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET; request->Type |= MFX_MEMTYPE_FROM_VPPOUT; } else request->Type |= MFX_MEMTYPE_DXVA2_DECODER_TARGET; } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::GetDecodeStat(mfxDecodeStat *stat) { if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(stat); decoder->m_stat.NumCachedFrame = 0; decoder->m_stat.NumError = 0; *stat = decoder->m_stat; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::MJPEGDECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { VideoDECODEMJPEG &obj = *((VideoDECODEMJPEG *) pState); MFX::AutoTimer timer("DecodeFrame"); return obj.decoder->RunThread(pParam, threadNumber, callNumber); } // mfxStatus VideoDECODEMJPEG::MJPEGDECODERoutine(void *pState, void *pParam, mfxStatus VideoDECODEMJPEG::MJPEGCompleteProc(void *pState, void *pParam, mfxStatus taskRes) { VideoDECODEMJPEG &obj = *((VideoDECODEMJPEG *) pState); return obj.decoder->CompleteTask(pParam, taskRes); } mfxStatus VideoDECODEMJPEG::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) { // It can be useful to run threads right after first frame receive MFX_SAFE_CALL(DecodeFrameCheck(bs, surface_work, surface_out)); UMC::FrameData *dst = nullptr; MFX_SAFE_CALL(decoder->AllocateFrameData(dst)); { // output surface is always working surface MFX_CHECK_NULL_PTR1(dst); *surface_out = decoder->m_surface_source->GetSurface(dst->GetFrameMID(), surface_work, &m_vPar); MFX_CHECK(*surface_out != nullptr, MFX_ERR_INVALID_HANDLE); SetFrameType(**surface_out); (*surface_out)->Info.FrameId.ViewId = 0; // (mfxU16)pFrame->m_viewId; bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); if(MFX_ROTATION_0 == m_vFirstPar.mfx.Rotation || MFX_ROTATION_180 == m_vFirstPar.mfx.Rotation) { (*surface_out)->Info.CropH = m_vPar.mfx.FrameInfo.CropH; (*surface_out)->Info.CropW = m_vPar.mfx.FrameInfo.CropW; (*surface_out)->Info.AspectRatioH = isShouldUpdate ? (mfxU16) 1 : m_vFirstPar.mfx.FrameInfo.AspectRatioH; (*surface_out)->Info.AspectRatioW = isShouldUpdate ? (mfxU16) 1 : m_vFirstPar.mfx.FrameInfo.AspectRatioW; } else { (*surface_out)->Info.CropH = m_vPar.mfx.FrameInfo.CropW; (*surface_out)->Info.CropW = m_vPar.mfx.FrameInfo.CropH; (*surface_out)->Info.AspectRatioH = isShouldUpdate ? (mfxU16) 1 : m_vFirstPar.mfx.FrameInfo.AspectRatioW; (*surface_out)->Info.AspectRatioW = isShouldUpdate ? (mfxU16) 1 : m_vFirstPar.mfx.FrameInfo.AspectRatioH; } (*surface_out)->Info.CropX = 0; (*surface_out)->Info.CropY = 0; mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { (*surface_out)->Info.CropH = videoProcessing->Out.CropH; (*surface_out)->Info.CropW = videoProcessing->Out.CropW; (*surface_out)->Info.CropX = videoProcessing->Out.CropX; (*surface_out)->Info.CropY = videoProcessing->Out.CropY; } isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.FrameRateExtD || m_vFirstPar.mfx.FrameInfo.FrameRateExtN); (*surface_out)->Info.FrameRateExtD = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtD : m_vFirstPar.mfx.FrameInfo.FrameRateExtD; (*surface_out)->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; (*surface_out)->Info.PicStruct = (mfxU16) ((MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? (MFX_PICSTRUCT_PROGRESSIVE) : (MFX_PICSTRUCT_FIELD_TFF)); (*surface_out)->Data.TimeStamp = GetMfxTimeStamp(dst->GetTime()); if(MFX_TIME_STAMP_INVALID == (*surface_out)->Data.TimeStamp) { (*surface_out)->Data.TimeStamp = ((mfxU64)m_frameOrder * m_vPar.mfx.FrameInfo.FrameRateExtD * MFX_TIME_STAMP_FREQUENCY) / m_vPar.mfx.FrameInfo.FrameRateExtN; } (*surface_out)->Data.FrameOrder = m_frameOrder; m_frameOrder++; (*surface_out)->Data.Corrupted = 0; } // prepare output structure pEntryPoint->pRoutine = &MJPEGDECODERoutine; pEntryPoint->pCompleteProc = &MJPEGCompleteProc; pEntryPoint->pState = this; pEntryPoint->pRoutineName = (char *)"DecodeMJPEG"; return decoder->FillEntryPoint(pEntryPoint, surface_work, *surface_out); } mfxStatus VideoDECODEMJPEG::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out) { UMC::Status umcRes = UMC::UMC_OK; if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); // make sure that there is a free task MFX_SAFE_CALL(decoder->CheckTaskAvailability(m_vPar.AsyncDepth ? m_vPar.AsyncDepth : m_core->GetAutoAsyncDepth())); bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_out); } else { MFX_CHECK_NULL_PTR2(surface_work, surface_out); } if (bs) MFX_SAFE_CALL(CheckBitstream(bs)); *surface_out = nullptr; if (surface_work) { MFX_CHECK_COND(CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_JPEG) == MFX_ERR_NONE); MFX_SAFE_CALL(CheckFrameData(surface_work)); } mfxU32 numPic = 0; mfxU32 picToCollect = (MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? 1 : 2; do { UMC::MJPEGVideoDecoderBaseMFX* pMJPEGVideoDecoder; MFX_SAFE_CALL(decoder->ReserveUMCDecoder(pMJPEGVideoDecoder, surface_work)); MFXMediaDataAdapter src(bs); UMC::MediaDataEx *pSrcData; mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; if (extbuf) { reinterpret_cast(extbuf)->ErrorTypes = 0; src.SetExtBuffer(extbuf); } if (!m_isHeaderFound && bs) { umcRes = pMJPEGVideoDecoder->FindStartOfImage(&src); if (umcRes != UMC::UMC_OK) { if(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA) decoder->ReleaseReservedTask(); return (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA) ? MFX_ERR_MORE_DATA : ConvertUMCStatusToMfx(umcRes); } src.Save(bs); m_isHeaderFound = true; } if (!m_isHeaderParsed && bs) { umcRes = pMJPEGVideoDecoder->_GetFrameInfo((uint8_t*)src.GetDataPointer(), src.GetDataSize(), &src); if (umcRes != UMC::UMC_OK) { if(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA) decoder->ReleaseReservedTask(); return (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA) ? MFX_ERR_MORE_DATA : ConvertUMCStatusToMfx(umcRes); } mfxVideoParam temp; pMJPEGVideoDecoder->FillVideoParam(&temp, false); if(m_vPar.mfx.FrameInfo.CropW < temp.mfx.FrameInfo.CropW || m_vPar.mfx.FrameInfo.CropH < temp.mfx.FrameInfo.CropH) { decoder->ReleaseReservedTask(); MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } else if (m_vPar.mfx.FrameInfo.CropW > temp.mfx.FrameInfo.CropW || m_vPar.mfx.FrameInfo.CropH > temp.mfx.FrameInfo.CropH) { m_vPar.mfx.FrameInfo.CropW = temp.mfx.FrameInfo.CropW; m_vPar.mfx.FrameInfo.CropH = temp.mfx.FrameInfo.CropH; } m_isHeaderParsed = true; } mfxU32 maxBitstreamSize = m_vPar.mfx.FrameInfo.CropW * m_vPar.mfx.FrameInfo.CropH; switch(m_vPar.mfx.JPEGChromaFormat) { case CHROMA_TYPE_YUV411: case CHROMA_TYPE_YUV420: maxBitstreamSize = maxBitstreamSize * 3 / 2; break; case CHROMA_TYPE_YUV422H_2Y: case CHROMA_TYPE_YUV422V_2Y: case CHROMA_TYPE_YUV422H_4Y: case CHROMA_TYPE_YUV422V_4Y: maxBitstreamSize = maxBitstreamSize * 2; break; case CHROMA_TYPE_YUV444: maxBitstreamSize = maxBitstreamSize * 3; break; case CHROMA_TYPE_YUV400: default: break; }; pSrcData = m_frameConstructor->GetFrame(bs ? &src : 0, maxBitstreamSize); // update the bytes used in bitstream src.Save(bs); if (!pSrcData) { decoder->ReleaseReservedTask(); MFX_RETURN(MFX_ERR_MORE_DATA); } m_isHeaderFound = false; m_isHeaderParsed = false; try { MFX_SAFE_CALL(decoder->AddPicture(pSrcData, numPic)); } catch(const UMC::eUMC_Status& sts) { if(sts == UMC::UMC_ERR_INVALID_STREAM) { continue; } else { return ConvertUMCStatusToMfx(sts); } } // make sure, that we collected BOTH fields } while (picToCollect > numPic); // check if skipping is enabled m_skipCount += m_skipRate; if (JPEG_SKIP_BOUND <= m_skipCount) { m_skipCount -= JPEG_SKIP_BOUND; decoder->m_stat.NumSkippedFrame++; // it is time to skip a frame decoder->ReleaseReservedTask(); MFX_RETURN(MFX_ERR_MORE_DATA); } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::DecodeFrame(mfxBitstream *, mfxFrameSurface1 *, mfxFrameSurface1 *) { return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEG::GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts) { if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ud, sz, ts); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEMJPEG::GetPayload( mfxU64 *ts, mfxPayload *payload ) { if (!m_isInit) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ts, payload, payload->Data); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEMJPEG::SetSkipMode(mfxSkipMode mode) { // check error(s) if (!m_isInit) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } // check if we reached bounds of skipping if (((JPEG_MIN_SKIP_RATE == m_skipRate) && (MFX_SKIPMODE_LESS == mode)) || ((JPEG_MAX_SKIP_RATE == m_skipRate) && (MFX_SKIPMODE_MORE == mode)) || ((JPEG_MIN_SKIP_RATE == m_skipRate) && (MFX_SKIPMODE_NOSKIP == mode))) { return MFX_WRN_VALUE_NOT_CHANGED; } // set new skip rate switch (mode) { case MFX_SKIPMODE_LESS: m_skipRate -= 1; break; case MFX_SKIPMODE_MORE: m_skipRate += 1; break; default: m_skipRate = 0; break; } return MFX_ERR_NONE; } // mfxStatus VideoDECODEMJPEG::SetSkipMode(mfxSkipMode mode) bool VideoDECODEMJPEG::IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar) { auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; if ((newPar->IOPattern & mask) != (oldPar->IOPattern & mask) ) { return false; } if (newPar->Protected != oldPar->Protected) { return false; } if (newPar->AsyncDepth != oldPar->AsyncDepth) { return false; } mfxFrameAllocRequest requestOld; memset(&requestOld, 0, sizeof(requestOld)); mfxFrameAllocRequest requestNew; memset(&requestNew, 0, sizeof(requestNew)); mfxStatus mfxSts = QueryIOSurfInternal(m_core, oldPar, &requestOld); if (mfxSts != MFX_ERR_NONE) return false; mfxSts = QueryIOSurfInternal(m_core, newPar, &requestNew); if (mfxSts != MFX_ERR_NONE) return false; if (newPar->mfx.FrameInfo.Height > oldPar->mfx.FrameInfo.Height) { return false; } if (newPar->mfx.FrameInfo.Width > oldPar->mfx.FrameInfo.Width) { return false; } if (m_response.NumFrameActual) { if (requestNew.NumFrameMin > m_response.NumFrameActual) return false; } else { if (requestNew.NumFrameMin > requestOld.NumFrameMin || requestNew.Type != requestOld.Type) return false; } if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { return false; } return true; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MFX_JPEG_Utility implementation /////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool MFX_JPEG_Utility::IsNeedPartialAcceleration(VideoCORE * core, mfxVideoParam * par) { if (!par) return false; if (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB && par->mfx.JPEGChromaFormat != MFX_CHROMAFORMAT_YUV444) return true; bool isVideoPostprocEnabled = false; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE bool postProcessingRequested = GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); // Decoding of 411 is supported only via DEC_VIDEO_POSTPROCESS, so check for postprocessing // only when 411 is on input. // For same reason, enable 411 HW decode only when post processing requested. if (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV411 && postProcessingRequested) { VAProfile vaProfile = VAProfileJPEGBaseline; VAEntrypoint vaEntrypoint = VAEntrypointVLD; VAConfigAttrib vaAttrib; memset(&vaAttrib, 0, sizeof(vaAttrib)); vaAttrib.type = VAConfigAttribDecProcessing; vaAttrib.value = 0; VADisplay vaDisplay; mfxStatus mfxSts = core->GetHandle(MFX_HANDLE_VA_DISPLAY, &vaDisplay); if (MFX_ERR_NONE != mfxSts) return true; // Had to duplicate that functionality here, as LinuxVideoAccelerator::Init() has not // called at this point. VAStatus vaStatus = vaGetConfigAttributes(vaDisplay, vaProfile, vaEntrypoint, &vaAttrib, 1); if (VA_STATUS_SUCCESS != vaStatus) return true; isVideoPostprocEnabled = vaAttrib.value == VA_DEC_PROCESSING; } #endif if (par->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && par->mfx.FrameInfo.FourCC != MFX_FOURCC_RGB4 && par->mfx.FrameInfo.FourCC != MFX_FOURCC_YUY2) return true; /* on Linux in case of multiscan turn off HW support until because some functionality is missed so far */ if (par->mfx.InterleavedDec == MFX_SCANTYPE_NONINTERLEAVED) return true; switch (par->mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: if ((par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && (par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV420 || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV444 || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422H || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422V || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_MONOCHROME)) || (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV444)) return false; else return true; case MFX_FOURCC_YUY2: if(( par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && (par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV420 || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422H || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_MONOCHROME)) || (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV444)) return false; else return true; case MFX_FOURCC_UYVY: if( par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && (par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV420 || par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422H) ) return false; else return true; case MFX_FOURCC_RGB4: if ((par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB && par->mfx.JPEGChromaFormat != MFX_CHROMAFORMAT_YUV444) || (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422V) || (par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_MONOCHROME) || (!isVideoPostprocEnabled && par->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr && par->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV411) ) return true; else return false; default: return true; } return false; } eMFXPlatform MFX_JPEG_Utility::GetPlatform(VideoCORE * core, mfxVideoParam * par) { eMFXPlatform platform = core->GetPlatformType(); if (platform != MFX_PLATFORM_SOFTWARE) { if (IsNeedPartialAcceleration(core, par)) { return MFX_PLATFORM_SOFTWARE; } if (MFX_ERR_NONE != core->IsGuidSupported(sDXVA2_Intel_IVB_ModeJPEG_VLD_NoFGT, par)) { return MFX_PLATFORM_SOFTWARE; } bool needVpp = false; if (par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_FIELD_TFF || par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_FIELD_BFF) { needVpp = true; } mfxFrameAllocRequest request; memset(&request, 0, sizeof(request)); request.Info = par->mfx.FrameInfo; bool usePostProcessing = GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); VideoDECODEMJPEGBase_HW::AdjustFourCC(&request.Info, &par->mfx, core->GetVAType(), usePostProcessing, &needVpp); if (needVpp) { if (MFX_ERR_NONE != VideoDECODEMJPEGBase_HW::CheckVPPCaps(core, par)) { return MFX_PLATFORM_SOFTWARE; } } } return platform; } mfxStatus MFX_JPEG_Utility::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type) { MFX_CHECK_NULL_PTR1(out); mfxStatus sts = MFX_ERR_NONE; if (in == out) { mfxVideoParam in1 = *in; return Query(core, &in1, out, type); } memset(&out->mfx, 0, sizeof(mfxInfoMFX)); if (in) { if (in->mfx.CodecId == MFX_CODEC_JPEG) out->mfx.CodecId = in->mfx.CodecId; if ((MFX_PROFILE_JPEG_BASELINE == in->mfx.CodecProfile)) out->mfx.CodecProfile = in->mfx.CodecProfile; switch (in->mfx.CodecLevel) { case MFX_LEVEL_UNKNOWN: out->mfx.CodecLevel = in->mfx.CodecLevel; break; } if (in->mfx.NumThread < 128) out->mfx.NumThread = in->mfx.NumThread; if (in->AsyncDepth < MFX_MAX_ASYNC_DEPTH_VALUE) // Actually AsyncDepth > 5-7 is for debugging only. out->AsyncDepth = in->AsyncDepth; if (in->IOPattern) { if ((in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || (in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY)) out->IOPattern = in->IOPattern; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } mfxU32 fourCC = in->mfx.FrameInfo.FourCC; mfxU16 chromaFormat = in->mfx.FrameInfo.ChromaFormat; if ((fourCC == 0 && chromaFormat == 0) || (fourCC == MFX_FOURCC_NV12 && chromaFormat == MFX_CHROMAFORMAT_MONOCHROME) || (fourCC == MFX_FOURCC_NV12 && chromaFormat == MFX_CHROMAFORMAT_YUV420) || (fourCC == MFX_FOURCC_RGB4 && chromaFormat == MFX_CHROMAFORMAT_YUV444) || (fourCC == MFX_FOURCC_YUY2 && chromaFormat == MFX_CHROMAFORMAT_YUV422H)) { out->mfx.FrameInfo.FourCC = in->mfx.FrameInfo.FourCC; out->mfx.FrameInfo.ChromaFormat = in->mfx.FrameInfo.ChromaFormat; } else { sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.Width = mfx::align2_value(in->mfx.FrameInfo.Width, 0x10); out->mfx.FrameInfo.Height = mfx::align2_value(in->mfx.FrameInfo.Height, (in->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 0x8 : 0x10); if (in->mfx.FrameInfo.CropX <= out->mfx.FrameInfo.Width) out->mfx.FrameInfo.CropX = in->mfx.FrameInfo.CropX; if (in->mfx.FrameInfo.CropY <= out->mfx.FrameInfo.Height) out->mfx.FrameInfo.CropY = in->mfx.FrameInfo.CropY; if (out->mfx.FrameInfo.CropX + in->mfx.FrameInfo.CropW <= out->mfx.FrameInfo.Width) out->mfx.FrameInfo.CropW = in->mfx.FrameInfo.CropW; if (out->mfx.FrameInfo.CropY + in->mfx.FrameInfo.CropH <= out->mfx.FrameInfo.Height) out->mfx.FrameInfo.CropH = in->mfx.FrameInfo.CropH; out->mfx.FrameInfo.FrameRateExtN = in->mfx.FrameInfo.FrameRateExtN; out->mfx.FrameInfo.FrameRateExtD = in->mfx.FrameInfo.FrameRateExtD; out->mfx.FrameInfo.AspectRatioW = in->mfx.FrameInfo.AspectRatioW; out->mfx.FrameInfo.AspectRatioH = in->mfx.FrameInfo.AspectRatioH; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: //case MFX_PICSTRUCT_FIELD_REPEATED: //case MFX_PICSTRUCT_FRAME_DOUBLING: //case MFX_PICSTRUCT_FRAME_TRIPLING: out->mfx.FrameInfo.PicStruct = in->mfx.FrameInfo.PicStruct; break; default: sts = MFX_ERR_UNSUPPORTED; break; } switch (in->mfx.JPEGChromaFormat) { case MFX_CHROMAFORMAT_MONOCHROME: case MFX_CHROMAFORMAT_YUV420: case MFX_CHROMAFORMAT_YUV422: case MFX_CHROMAFORMAT_YUV444: case MFX_CHROMAFORMAT_YUV411: case MFX_CHROMAFORMAT_YUV422V: out->mfx.JPEGChromaFormat = in->mfx.JPEGChromaFormat; break; default: sts = MFX_ERR_UNSUPPORTED; break; } switch (in->mfx.JPEGColorFormat) { case MFX_JPEG_COLORFORMAT_UNKNOWN: case MFX_JPEG_COLORFORMAT_YCbCr: case MFX_JPEG_COLORFORMAT_RGB: out->mfx.JPEGColorFormat = in->mfx.JPEGColorFormat; break; default: sts = MFX_ERR_UNSUPPORTED; break; } switch (in->mfx.InterleavedDec) { case MFX_SCANTYPE_UNKNOWN: case MFX_SCANTYPE_INTERLEAVED: case MFX_SCANTYPE_NONINTERLEAVED: out->mfx.InterleavedDec = in->mfx.InterleavedDec; break; default: sts = MFX_ERR_UNSUPPORTED; break; } switch (in->mfx.Rotation) { case MFX_ROTATION_0: case MFX_ROTATION_90: case MFX_ROTATION_180: case MFX_ROTATION_270: out->mfx.Rotation = in->mfx.Rotation; break; default: sts = MFX_ERR_UNSUPPORTED; break; } if(in->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && in->mfx.Rotation != MFX_ROTATION_0) sts = MFX_ERR_UNSUPPORTED; mfxStatus stsExt = CheckDecodersExtendedBuffers(in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; if (in->Protected) { sts = MFX_ERR_UNSUPPORTED; } if (GetPlatform(core, out) != core->GetPlatformType() && sts == MFX_ERR_NONE) { assert(GetPlatform(core, out) == MFX_PLATFORM_SOFTWARE); sts = MFX_WRN_PARTIAL_ACCELERATION; } if (sts == MFX_ERR_NONE) { /*SFC*/ mfxExtDecVideoProcessing * videoProcessingTargetIn = (mfxExtDecVideoProcessing *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxExtDecVideoProcessing * videoProcessingTargetOut = (mfxExtDecVideoProcessing *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessingTargetIn && videoProcessingTargetOut) { // limits are from media_driver/agnostic/common/hw/mhw_sfc.h // get them via API const short unsigned MHW_SFC_MIN_HEIGHT = 128; const short unsigned MHW_SFC_MIN_WIDTH = 128; const short unsigned MHW_SFC_MAX_HEIGHT = 4096; const short unsigned MHW_SFC_MAX_WIDTH = 4096; if ( (MFX_PICSTRUCT_PROGRESSIVE == in->mfx.FrameInfo.PicStruct) && (in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (videoProcessingTargetIn->Out.Width >= MHW_SFC_MIN_WIDTH && videoProcessingTargetIn->Out.Width <= MHW_SFC_MAX_WIDTH) && (videoProcessingTargetIn->Out.Height >= MHW_SFC_MIN_HEIGHT && videoProcessingTargetIn->Out.Height <= MHW_SFC_MAX_HEIGHT) && // only conversion to RGB4 is supported by driver (fourCC == MFX_FOURCC_RGB4|| videoProcessingTargetIn->Out.FourCC == MFX_FOURCC_RGB4) && // resize is not supported by driver (videoProcessingTargetIn->In.CropX == videoProcessingTargetIn->Out.CropX && videoProcessingTargetIn->In.CropY == videoProcessingTargetIn->Out.CropY && videoProcessingTargetIn->In.CropW == videoProcessingTargetIn->Out.CropW && videoProcessingTargetIn->In.CropH == videoProcessingTargetIn->Out.CropH) ) { *videoProcessingTargetOut = *videoProcessingTargetIn; } else { sts = MFX_ERR_UNSUPPORTED; } } } } else { out->mfx.CodecId = MFX_CODEC_JPEG; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.NumThread = 1; out->AsyncDepth = 1; // mfxFrameInfo out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; out->mfx.FrameInfo.Width = 1; out->mfx.FrameInfo.Height = 1; //out->mfx.FrameInfo.CropX = 1; //out->mfx.FrameInfo.CropY = 1; //out->mfx.FrameInfo.CropW = 1; //out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; out->mfx.JPEGChromaFormat = 1; out->mfx.JPEGColorFormat = 1; out->mfx.Rotation = 1; if (type == MFX_HW_UNKNOWN) { out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } else { out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } } return sts; } bool MFX_JPEG_Utility::CheckVideoParam(mfxVideoParam *in, eMFXHWType ) { if (!in) return false; if (in->Protected) return false; if (MFX_CODEC_JPEG != in->mfx.CodecId) return false; if (in->mfx.FrameInfo.Width % 16) return false; if (in->mfx.FrameInfo.Height % 8) return false; // both zero or not zero if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) return false; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: break; default: return false; } if(in->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && in->mfx.Rotation != MFX_ROTATION_0) return false; mfxU32 fourCC = in->mfx.FrameInfo.FourCC; mfxU16 chromaFormat = in->mfx.FrameInfo.ChromaFormat; if ((fourCC != MFX_FOURCC_NV12 || chromaFormat != MFX_CHROMAFORMAT_MONOCHROME) && (fourCC != MFX_FOURCC_NV12 || chromaFormat != MFX_CHROMAFORMAT_YUV420) && (fourCC != MFX_FOURCC_RGB4 || chromaFormat != MFX_CHROMAFORMAT_YUV444) && (fourCC != MFX_FOURCC_YUY2 || chromaFormat != MFX_CHROMAFORMAT_YUV422H)) return false; if ( !(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; if ((in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; return true; } mfxStatus VideoDECODEMJPEG::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(decoder && decoder->m_surface_source, MFX_ERR_NOT_INITIALIZED); return decoder->m_surface_source->GetSurface(surface); } VideoDECODEMJPEGBase::VideoDECODEMJPEGBase() { memset(&m_stat, 0, sizeof(m_stat)); } mfxStatus VideoDECODEMJPEGBase::GetVideoParam(mfxVideoParam *par, UMC::MJPEGVideoDecoderBaseMFX * mjpegDecoder) { mfxExtJPEGQuantTables* jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); if(!jpegQT && !jpegHT) return MFX_ERR_NONE; UMC::Status umcRes = UMC::UMC_OK; if(jpegQT) { umcRes = mjpegDecoder->FillQuantTableExtBuf(jpegQT); if (umcRes != UMC::UMC_OK) return ConvertUMCStatusToMfx(umcRes); } if(jpegHT) { umcRes = mjpegDecoder->FillHuffmanTableExtBuf(jpegHT); if (umcRes != UMC::UMC_OK) return ConvertUMCStatusToMfx(umcRes); } return MFX_ERR_NONE; } VideoDECODEMJPEGBase_HW::VideoDECODEMJPEGBase_HW() { m_pMJPEGVideoDecoder.reset(new UMC::MJPEGVideoDecoderMFX_HW()); // HW m_va = 0; m_dst = 0; m_numPic = 0; m_needVpp = false; } mfxStatus VideoDECODEMJPEGBase_HW::Init(mfxVideoParam *decPar, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, mfxFrameAllocRequest *request_internal, bool, VideoCORE *core) { ConvertMFXParamsToUMC(decPar, &umcVideoParams); umcVideoParams.numThreads = m_vPar.mfx.NumThread; mfxStatus mfxSts = core->CreateVA(decPar, request, response, m_surface_source.get()); if (mfxSts < MFX_ERR_NONE) return mfxSts; core->GetVA((mfxHDL*)&m_va, MFX_MEMTYPE_FROM_DECODE); m_pMJPEGVideoDecoder->SetFrameAllocator(m_surface_source.get()); umcVideoParams.pVideoAccelerator = m_va; UMC::Status umcSts = m_pMJPEGVideoDecoder->Init(&umcVideoParams); if (umcSts != UMC::UMC_OK) { return ConvertUMCStatusToMfx(umcSts); } m_pMJPEGVideoDecoder->SetFourCC(request_internal->Info.FourCC); m_numPic = 0; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::Reset(mfxVideoParam *par) { m_pMJPEGVideoDecoder->Reset(); m_numPic = 0; m_vPar = *par; { std::lock_guard guard(m_guard); mfxU32 picToCollect = (MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? (1) : (2); while(!m_dsts.empty()) { for(mfxU32 i=0; iCloseFrame(&(m_dsts.back()), i); delete [] m_dsts.back(); m_dsts.pop_back(); } } if (m_surface_source->Reset() != UMC::UMC_OK) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } memset(&m_stat, 0, sizeof(mfxDecodeStat)); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::Close(void) { if (!m_pMJPEGVideoDecoder.get()) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); m_pMJPEGVideoDecoder->Close(); m_numPic = 0; { std::lock_guard guard(m_guard); mfxU32 picToCollect = (MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? (1) : (2); while(!m_dsts.empty()) { for(mfxU32 i=0; iCloseFrame(&(m_dsts.back()), i); delete [] m_dsts.back(); m_dsts.pop_back(); } } memset(&m_stat, 0, sizeof(mfxDecodeStat)); m_va = 0; m_surface_source->Close(); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::GetVideoParam(mfxVideoParam *par) { return VideoDECODEMJPEGBase::GetVideoParam(par, m_pMJPEGVideoDecoder.get()); } mfxStatus VideoDECODEMJPEGBase_HW::CheckVPPCaps(VideoCORE * core, mfxVideoParam * par) { VideoVppJpeg cc(core, false); return cc.Init(par); } mfxU32 VideoDECODEMJPEGBase_HW::AdjustFrameAllocRequest(mfxFrameAllocRequest *request, mfxInfoMFX *info, eMFXVAType vaType, bool usePostProcessing) { bool needVpp = false; // update request in case of interlaced stream if(request->Info.PicStruct == MFX_PICSTRUCT_FIELD_TFF || request->Info.PicStruct == MFX_PICSTRUCT_FIELD_BFF) { request->Info.Height >>= 1; request->Info.CropH >>= 1; request->NumFrameMin <<= 1; request->NumFrameSuggested <<= 1; needVpp = true; } // set FourCC AdjustFourCC(&request->Info, info, vaType, usePostProcessing, &needVpp); #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP if(info->Rotation == MFX_ROTATION_90 || info->Rotation == MFX_ROTATION_180 || info->Rotation == MFX_ROTATION_270) { needVpp = true; } if(info->Rotation == MFX_ROTATION_90 || info->Rotation == MFX_ROTATION_270) { std::swap(request->Info.Height, request->Info.Width); std::swap(request->Info.AspectRatioH, request->Info.AspectRatioW); std::swap(request->Info.CropH, request->Info.CropW); std::swap(request->Info.CropY, request->Info.CropX); } #else // MFX_ENABLE_MJPEG_ROTATE_VPP // WA for rotation of unaligned images mfxU16 mcuWidth; mfxU16 mcuHeight; mfxU16 paddingWidth; mfxU16 paddingHeight; switch(info->JPEGChromaFormat) { case MFX_CHROMAFORMAT_YUV411: mcuWidth = 32; mcuHeight = 8; break; case MFX_CHROMAFORMAT_YUV420: mcuWidth = 16; mcuHeight = 16; break; case MFX_CHROMAFORMAT_YUV422H: mcuWidth = 16; mcuHeight = 8; break; case MFX_CHROMAFORMAT_YUV422V: mcuWidth = 8; mcuHeight = 16; break; case MFX_CHROMAFORMAT_YUV400: case MFX_CHROMAFORMAT_YUV444: default: mcuWidth = 8; mcuHeight = 8; break; } if(info->Rotation == MFX_ROTATION_90 || info->Rotation == MFX_ROTATION_270) std::swap(mcuWidth, mcuHeight); paddingWidth = (mfxU16)((2<<16) - request->Info.CropW) % mcuWidth; paddingHeight = (mfxU16)((2<<16) - request->Info.CropH) % mcuHeight; switch(info->Rotation) { case MFX_ROTATION_90: request->Info.CropX = paddingWidth; request->Info.CropW = request->Info.CropW + paddingWidth; break; case MFX_ROTATION_180: request->Info.CropX = paddingWidth; request->Info.CropW = request->Info.CropW + paddingWidth; request->Info.CropY = paddingHeight; request->Info.CropH = request->Info.CropH + paddingHeight; break; case MFX_ROTATION_270: request->Info.CropY = paddingHeight; request->Info.CropH = request->Info.CropH + paddingHeight; break; } #endif // MFX_ENABLE_MJPEG_ROTATE_VPP m_needVpp = needVpp; return m_needVpp ? 1 : 0; } void VideoDECODEMJPEGBase_HW::AdjustFourCC(mfxFrameInfo *requestFrameInfo, const mfxInfoMFX *info, eMFXVAType vaType, bool usePostProc, bool *needVpp) { (void)vaType; if (info->JPEGColorFormat == MFX_JPEG_COLORFORMAT_UNKNOWN || info->JPEGColorFormat == MFX_JPEG_COLORFORMAT_YCbCr) { switch(info->JPEGChromaFormat) { case MFX_CHROMAFORMAT_MONOCHROME: if (requestFrameInfo->FourCC == MFX_FOURCC_RGB4) { requestFrameInfo->FourCC = MFX_FOURCC_NV12; *needVpp = true; } else { requestFrameInfo->FourCC = MFX_FOURCC_YUV400; *needVpp = true; } break; case MFX_CHROMAFORMAT_YUV420: if (!usePostProc && info->Rotation == MFX_ROTATION_0 && requestFrameInfo->FourCC == MFX_FOURCC_RGB4) { requestFrameInfo->FourCC = MFX_FOURCC_NV12; *needVpp = true; } break; case MFX_CHROMAFORMAT_YUV411: break; case MFX_CHROMAFORMAT_YUV422H: if (!usePostProc && info->Rotation == MFX_ROTATION_0 && requestFrameInfo->FourCC == MFX_FOURCC_RGB4) { requestFrameInfo->FourCC = MFX_FOURCC_NV12; *needVpp = true; } #if defined (DECODE_JPEG_ROTATION) else { if (info->Rotation == MFX_ROTATION_0 || info->Rotation == MFX_ROTATION_180) requestFrameInfo->FourCC = MFX_FOURCC_YUV422H; else if (info->Rotation == MFX_ROTATION_90 || info->Rotation == MFX_ROTATION_270) requestFrameInfo->FourCC = MFX_FOURCC_YUV422V; *needVpp = true; } #endif break; case MFX_CHROMAFORMAT_YUV422V: break; case MFX_CHROMAFORMAT_YUV444: if (info->Rotation == MFX_ROTATION_0 && ((!usePostProc && requestFrameInfo->FourCC == MFX_FOURCC_RGB4) // for YUV444 jpeg, decoded stream contains 444P, // to get NV12 we must use VPP || requestFrameInfo->FourCC == MFX_FOURCC_NV12)) { requestFrameInfo->FourCC = MFX_FOURCC_NV12; *needVpp = true; } break; default: assert(false); break; } } else if(info->JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB) { if(info->JPEGChromaFormat == MFX_CHROMAFORMAT_YUV444) if( vaType == MFX_HW_VAAPI && info->Rotation == MFX_ROTATION_0 && info->InterleavedDec == MFX_SCANTYPE_INTERLEAVED && requestFrameInfo->CropW >= 128 && requestFrameInfo->CropH >= 128 && requestFrameInfo->CropW <= 4096 && requestFrameInfo->CropH <= 4096 && !(*needVpp)) { requestFrameInfo->FourCC = MFX_FOURCC_RGBP; *needVpp = true; } } return; } mfxStatus VideoDECODEMJPEGBase_HW::RunThread(void *params, mfxU32, mfxU32 ) { mfxStatus mfxSts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(params); ThreadTaskInfoJpeg * info = (ThreadTaskInfoJpeg *)params; if (m_needVpp) { if(info->needCheckVppStatus) { mfxSts = ((SurfaceSourceJPEG*)m_surface_source.get())->CheckPreparingToOutput(info->surface_out, info->dst, &m_vPar, (mfxU16)info->vppTaskID); if(mfxSts != MFX_TASK_DONE) { return mfxSts; } info->needCheckVppStatus = false; } mfxU16 corruptedField = 0; if(info->numDecodeTasksToCheck == 2) { mfxSts = m_pMJPEGVideoDecoder->CheckStatusReportNumber(info->decodeTaskID-1, &corruptedField); if(mfxSts != MFX_TASK_DONE) { return mfxSts; } info->numDecodeTasksToCheck--; info->surface_out->Data.Corrupted |= corruptedField; } if(info->numDecodeTasksToCheck == 1) { mfxSts = m_pMJPEGVideoDecoder->CheckStatusReportNumber(info->decodeTaskID, &corruptedField); if(mfxSts != MFX_TASK_DONE) { return mfxSts; } info->numDecodeTasksToCheck--; info->surface_out->Data.Corrupted |= corruptedField; } } else { mfxSts = m_pMJPEGVideoDecoder->CheckStatusReportNumber(info->decodeTaskID, &(info->surface_out->Data.Corrupted)); if(mfxSts != MFX_TASK_DONE) { return mfxSts; } mfxSts = m_surface_source->PrepareToOutput(info->surface_out, info->dst->GetFrameMID(), &m_vPar, mfxU32(~MFX_COPY_USE_VACOPY_ANY)); if (mfxSts < MFX_ERR_NONE) { return mfxSts; } } info = 0; return MFX_TASK_DONE; } mfxStatus VideoDECODEMJPEGBase_HW::ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf) { pMJPEGVideoDecoder = nullptr; MFX_SAFE_CALL(m_surface_source->SetCurrentMFXSurface(surf)); if (m_numPic == 0) { int picToCollect = (MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? (1) : (2); delete[] m_dst; m_dst = new UMC::FrameData[picToCollect]; } pMJPEGVideoDecoder = m_pMJPEGVideoDecoder.get(); return MFX_ERR_NONE; } void VideoDECODEMJPEGBase_HW::ReleaseReservedTask() { if (m_numPic == 0) { delete[] m_dst; m_dst = 0; m_numPic = 0; } } mfxStatus VideoDECODEMJPEGBase_HW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) { mfxU32 fieldPos = m_numPic; if (MFX_PICSTRUCT_FIELD_BFF == m_vPar.mfx.FrameInfo.PicStruct) { // change field order in BFF case fieldPos ^= 1; } UMC::Status umcRes = UMC::UMC_OK; #ifndef MFX_ENABLE_MJPEG_ROTATE_VPP switch(m_vPar.mfx.Rotation) { case MFX_ROTATION_0: umcRes = m_pMJPEGVideoDecoder->SetRotation(0); break; case MFX_ROTATION_90: umcRes = m_pMJPEGVideoDecoder->SetRotation(90); break; case MFX_ROTATION_180: umcRes = m_pMJPEGVideoDecoder->SetRotation(180); break; case MFX_ROTATION_270: umcRes = m_pMJPEGVideoDecoder->SetRotation(270); break; } #else umcRes = m_pMJPEGVideoDecoder->SetRotation(0); #endif if (umcRes != UMC::UMC_OK) { delete[] m_dst; m_dst = 0; return ConvertUMCStatusToMfx(umcRes); } umcRes = m_pMJPEGVideoDecoder->GetFrame(pSrcData, &m_dst, fieldPos); mfxStatus sts = MFX_ERR_NONE; // convert status if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA || umcRes == UMC::UMC_ERR_SYNC) { if (m_numPic == 0) { delete[] m_dst; m_dst = 0; } sts = MFX_ERR_MORE_DATA; } else { if (umcRes != UMC::UMC_OK) { delete[] m_dst; m_dst = 0; sts = ConvertUMCStatusToMfx(umcRes); } } if (!(umcRes == UMC::UMC_OK && m_dst)) // return frame to display return sts; m_numPic++; numPic = m_numPic; return sts; } mfxStatus VideoDECODEMJPEGBase_HW::AllocateFrameData(UMC::FrameData *&data) { std::lock_guard guard(m_guard); m_dsts.push_back(m_dst); data = m_dst; m_dst = 0; m_numPic = 0; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) { mfxU16 taskId = 0; if (m_dsts.empty()) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); UMC::FrameData *dst = m_dsts.back(); if (m_needVpp) { UMC::ConvertInfo * convertInfo = m_pMJPEGVideoDecoder->GetConvertInfo(); JPEG_Info info; info.colorFormat = convertInfo->colorFormat; info.UOffset = convertInfo->UOffset; info.VOffset = convertInfo->VOffset; ((SurfaceSourceJPEG*)m_surface_source.get())->SetJPEGInfo(&info); // decoding is ready. prepare to output: mfxStatus mfxSts = ((SurfaceSourceJPEG*)m_surface_source.get())->StartPreparingToOutput(surface_out, dst, &m_vPar, &taskId); if (mfxSts < MFX_ERR_NONE) { return mfxSts; } } ThreadTaskInfoJpeg * info = new ThreadTaskInfoJpeg(); info->surface_work = surface_work; info->surface_out = surface_out; info->decodeTaskID = m_pMJPEGVideoDecoder->GetStatusReportNumber(); info->vppTaskID = (mfxU32)taskId; info->needCheckVppStatus = m_needVpp; info->numDecodeTasksToCheck = MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct ? 1 : 2; info->dst = dst; pEntryPoint->requiredNumThreads = m_vPar.mfx.NumThread; pEntryPoint->pParam = info; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::CheckTaskAvailability(mfxU32 maxTaskNumber) { std::lock_guard guard(m_guard); if (m_dsts.size() >= maxTaskNumber) { return MFX_WRN_DEVICE_BUSY; } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_HW::CompleteTask(void *pParam, mfxStatus ) { ThreadTaskInfoJpeg * info = (ThreadTaskInfoJpeg *)pParam; std::lock_guard guard(m_guard); mfxI32 index = -1; for (size_t i = 0; i < m_dsts.size(); i++) if(m_dsts[i]->GetFrameMID() == info->dst->GetFrameMID()) { index = (mfxI32)i; } if(index != -1) { mfxU32 picToCollect = (MFX_PICSTRUCT_PROGRESSIVE == m_vPar.mfx.FrameInfo.PicStruct) ? (1) : (2); for(mfxU32 i=0; iCloseFrame(&(m_dsts[index]), i); delete [] m_dsts[index]; m_dsts.erase(m_dsts.begin() + index); } delete (ThreadTaskInfoJpeg *)pParam; return MFX_ERR_NONE; } #ifdef MFX_ENABLE_JPEG_SW_FALLBACK VideoDECODEMJPEGBase_SW::VideoDECODEMJPEGBase_SW() { pLastTask = NULL; m_tasksCount = 0; } mfxStatus VideoDECODEMJPEGBase_SW::Init(mfxVideoParam *decPar, mfxFrameAllocRequest *, mfxFrameAllocResponse *, mfxFrameAllocRequest *, bool, VideoCORE *) { #if !defined(MSDK_USE_EXTERNAL_IPP) auto ippSt = MfxIppInit(); MFX_CHECK(ippSt == ippStsNoErr, MFX_ERR_UNSUPPORTED); #endif ConvertMFXParamsToUMC(decPar, &umcVideoParams); umcVideoParams.numThreads = m_vPar.mfx.NumThread; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::Reset(mfxVideoParam *par) { m_tasksCount = 0; pLastTask = nullptr; { std::lock_guard guard(m_guard); while(!m_freeTasks.empty()) { m_freeTasks.pop(); } } memset(&m_stat, 0, sizeof(mfxDecodeStat)); m_vPar = *par; UMC::Status umcSts = m_surface_source->Reset(); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::Close() { UMC::Status umcSts = m_surface_source->Close(); m_tasksCount = 0; pLastTask = nullptr; memset(&m_stat, 0, sizeof(mfxDecodeStat)); // delete free tasks queue { std::lock_guard guard(m_guard); while (!m_freeTasks.empty()) { m_freeTasks.pop(); } } MFX_CHECK(umcSts == UMC::UMC_OK, ConvertUMCStatusToMfx(umcSts)); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::GetVideoParam(mfxVideoParam *par) { mfxExtJPEGQuantTables* jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); if(!jpegQT && !jpegHT) return MFX_ERR_NONE; MFX_CHECK(pLastTask, MFX_ERR_UNSUPPORTED); return VideoDECODEMJPEGBase::GetVideoParam(par, pLastTask->m_pMJPEGVideoDecoder.get()); } mfxStatus VideoDECODEMJPEGBase_SW::ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf) { pMJPEGVideoDecoder = 0; MFX_SAFE_CALL(m_surface_source->SetCurrentMFXSurface(surf)); pMJPEGVideoDecoder = m_freeTasks.front()->m_pMJPEGVideoDecoder.get(); //pMJPEGVideoDecoder->Reset(); return MFX_ERR_NONE; } void VideoDECODEMJPEGBase_SW::ReleaseReservedTask() { if (!m_freeTasks.empty()) m_freeTasks.front()->Reset(); } mfxStatus VideoDECODEMJPEGBase_SW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) { // select the field position. 0 means top, 1 means bottom. mfxU32 fieldPos = m_freeTasks.front()->NumPicCollected(); if (MFX_PICSTRUCT_FIELD_BFF == m_vPar.mfx.FrameInfo.PicStruct) { // change field order in BFF case fieldPos ^= 1; } // add picture to the task MFX_SAFE_CALL(m_freeTasks.front()->AddPicture(pSrcData, fieldPos)); numPic = m_freeTasks.front()->NumPicCollected(); return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) { // remove the ready task from the queue { std::lock_guard guard(m_guard); pLastTask = m_freeTasks.front().release(); m_freeTasks.pop(); } pLastTask->surface_work = surface_work; pLastTask->surface_out = surface_out; pEntryPoint->requiredNumThreads = std::min(pLastTask->m_pMJPEGVideoDecoder->NumDecodersAllocated(), pLastTask->NumPiecesCollected()); pEntryPoint->pParam = pLastTask; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::AllocateFrameData(UMC::FrameData *&data) { CJpegTask *pTask = m_freeTasks.front().get(); // prepare the decoder(s) UMC::Status umcRes = pTask->m_pMJPEGVideoDecoder->AllocateFrame(); if (UMC::UMC_OK != umcRes) { return ConvertUMCStatusToMfx(umcRes); } // save parameters to the task pTask->dst = pTask->m_pMJPEGVideoDecoder.get()->GetDst(); UMC::FrameData *dst = m_freeTasks.front()->dst; dst->SetTime(m_freeTasks.front()->GetPictureBuffer(0).timeStamp); data = dst; return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::CheckTaskAvailability(mfxU32 maxTaskNumber) { if (m_freeTasks.empty()) { if (m_tasksCount >= maxTaskNumber) { return MFX_WRN_DEVICE_BUSY; } std::unique_ptr pTask(new CJpegTask()); m_tasksCount++; // initialize the task MFX_SAFE_CALL(pTask->Initialize(umcVideoParams, m_surface_source.get(), m_vPar.mfx.Rotation, m_vPar.mfx.JPEGChromaFormat, m_vPar.mfx.JPEGColorFormat)); // save the task object into the queue { std::lock_guard guard(m_guard); m_freeTasks.push(std::move(pTask)); } } return MFX_ERR_NONE; } mfxStatus VideoDECODEMJPEGBase_SW::RunThread(void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { CJpegTask *task = (CJpegTask *) pParam; if (!task) MFX_RETURN(MFX_ERR_NULL_PTR); // check the number of call. one call = one piece decoded. all extra call // should go exit. if (callNumber >= task->NumPiecesCollected()) { return MFX_TASK_DONE; } // do decoding process UMC::Status umcSts = task->m_pMJPEGVideoDecoder->DecodePicture(*task, threadNumber, callNumber); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_INVALID_VIDEO_PARAM); return ((callNumber + 1) == task->NumPiecesCollected()) ? (MFX_TASK_DONE) : (MFX_TASK_WORKING); } mfxStatus VideoDECODEMJPEGBase_SW::CompleteTask(void *pParam, mfxStatus taskRes) { CJpegTask &task = *((CJpegTask *) pParam); // do color conversion and other useless stuff if (MFX_ERR_NONE == taskRes) { UMC::Status umcRes = UMC::UMC_OK; umcRes = task.m_pMJPEGVideoDecoder->PostProcessing(task.GetPictureBuffer(0).timeStamp); if (UMC::UMC_OK != umcRes) { return ConvertUMCStatusToMfx(umcRes); } // decoding is ready. prepare to output: mfxStatus mfxSts = m_surface_source->PrepareToOutput(task.surface_out, task.dst->GetFrameMID(), &m_vPar, mfxU32(~MFX_COPY_USE_VACOPY_ANY)); if (mfxSts < MFX_ERR_NONE) { return mfxSts; } task.m_pMJPEGVideoDecoder->CloseFrame(); m_stat.NumFrame++; } task.Reset(); { std::lock_guard guard(m_guard); m_freeTasks.emplace(&task); } return MFX_ERR_NONE; } #endif //ifdef MFX_ENABLE_JPEG_SW_FALLBACK #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/000077500000000000000000000000001443134507600246125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/hw/000077500000000000000000000000001443134507600252305ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/hw/include/000077500000000000000000000000001443134507600266535ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/hw/include/mfx_mpeg2_decode.h000066400000000000000000000126631443134507600322230ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include #include "mfx_common.h" #include "mfx_common_int.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_defs.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_DECODE) class mfx_UMC_FrameAllocator; namespace UMC_MPEG2_DECODER { class MPEG2Decoder; class MPEG2DecoderFrame; } class VideoDECODEMPEG2 : public VideoDECODE { // scheduler task info struct TaskInfo { mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out; }; public: VideoDECODEMPEG2(VideoCORE*, mfxStatus*); virtual ~VideoDECODEMPEG2(); // Check correctness of input parameters static mfxStatus Query(VideoCORE*, mfxVideoParam* in, mfxVideoParam* out); // Return a number of surfaces static mfxStatus QueryIOSurf(VideoCORE*, mfxVideoParam*, mfxFrameAllocRequest*); // Decode header and initialize video parameters static mfxStatus DecodeHeader(VideoCORE* core, mfxBitstream* bs, mfxVideoParam* par); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); // Initialize decoder mfxStatus Init(mfxVideoParam*) override; // Reset decoder mfxStatus Reset(mfxVideoParam*) override; // Close decoder mfxStatus Close() override; // Return current video parameters mfxStatus GetVideoParam(mfxVideoParam*) override; // Return decoder statistic mfxStatus GetDecodeStat(mfxDecodeStat*) override; // MediaSDK DECODE_SetSkipMode API function mfxStatus SetSkipMode(mfxSkipMode) override; // Return stream payload mfxStatus GetPayload( mfxU64 *ts, mfxPayload *payload) override; // Decode frame mfxStatus DecodeFrameCheck(mfxBitstream*, mfxFrameSurface1*, mfxFrameSurface1**, MFX_ENTRY_POINT*) override; // Return scheduler threading policy mfxTaskThreadingPolicy GetThreadingPolicy() override; virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; private: // Internal implementation of API QueryIOSurf function static mfxStatus QueryIOSurfInternal(mfxVideoParam*, mfxFrameAllocRequest*); // Decoder threads entry point static mfxStatus DecodeRoutine(void* state, void* param, mfxU32, mfxU32); // Threads complete proc callback static mfxStatus CompleteProc(void*, void* param, mfxStatus); // Initialize threads callbacks mfxStatus SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, mfxThreadTask* task); // Check if there is enough data to start decoding in async mode mfxStatus SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out); // Decoder instance threads entry point. Do async tasks here mfxStatus QueryFrame(mfxThreadTask); // Wait until a frame is ready to be output and set necessary surface flags mfxStatus DecodeFrame(mfxFrameSurface1 *surface_out, UMC_MPEG2_DECODER::MPEG2DecoderFrame* frame) const; // Find a next frame ready to be output from decoder UMC_MPEG2_DECODER::MPEG2DecoderFrame* GetFrameToDisplay(); // Fill mfxFrameSurface1 meta information mfxStatus FillOutputSurface(mfxFrameSurface1* surface_work, mfxFrameSurface1** surf_out, UMC_MPEG2_DECODER::MPEG2DecoderFrame* frame) const; // Fill up resolution information if new header arrived void FillVideoParam(mfxVideoParamWrapper*, bool); // Check if new parameters are compatible with new parameters bool IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType type) const; private: VideoCORE* m_core; std::mutex m_guard; std::unique_ptr m_surface_source; std::unique_ptr m_decoder; bool m_first_run; bool m_allow_null_work_surface; mfxVideoParamWrapper m_init_video_par; mfxVideoParamWrapper m_first_video_par; mfxVideoParamWrapper m_video_par; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; mfxDecodeStat m_stat; }; #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/hw/src/000077500000000000000000000000001443134507600260175ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/mpeg2/hw/src/mfx_mpeg2_decode.cpp000066400000000000000000001043261443134507600317200ustar00rootroot00000000000000// Copyright (c) 2018-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_DECODE) #include #include #include "mfx_mpeg2_decode.h" #include "mfx_task.h" #include "mfx_umc_alloc_wrapper.h" #include "libmfx_core_hw.h" #include "umc_mpeg2_utils.h" #include "umc_mpeg2_decoder_va.h" #include "umc_va_base.h" #include "libmfx_core_interface.h" using UMC_MPEG2_DECODER::MPEG2DecoderFrame; // Convert display PS to MFX PS inline mfxU16 GetMFXPicStruct(const MPEG2DecoderFrame& frame, bool extended) { mfxU16 picStruct; switch (frame.displayPictureStruct) { case UMC_MPEG2_DECODER::DPS_TOP: picStruct = MFX_PICSTRUCT_FIELD_TFF; break; case UMC_MPEG2_DECODER::DPS_BOTTOM: picStruct = MFX_PICSTRUCT_FIELD_BFF; break; case UMC_MPEG2_DECODER::DPS_TOP_BOTTOM: case UMC_MPEG2_DECODER::DPS_BOTTOM_TOP: { mfxU32 fieldFlag = (frame.displayPictureStruct == UMC_MPEG2_DECODER::DPS_TOP_BOTTOM) ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_FIELD_BFF; picStruct = (mfxU16)((frame.isProgressiveFrame) ? MFX_PICSTRUCT_PROGRESSIVE : fieldFlag); picStruct |= extended ? fieldFlag : 0; } break; case UMC_MPEG2_DECODER::DPS_TOP_BOTTOM_TOP: case UMC_MPEG2_DECODER::DPS_BOTTOM_TOP_BOTTOM: { picStruct = MFX_PICSTRUCT_PROGRESSIVE; if (extended) { picStruct |= MFX_PICSTRUCT_FIELD_REPEATED; picStruct |= (frame.displayPictureStruct == UMC_MPEG2_DECODER::DPS_TOP_BOTTOM_TOP) ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_FIELD_BFF; } } break; case UMC_MPEG2_DECODER::DPS_FRAME_DOUBLING: picStruct = MFX_PICSTRUCT_PROGRESSIVE; picStruct |= extended ? MFX_PICSTRUCT_FRAME_DOUBLING : 0; break; case UMC_MPEG2_DECODER::DPS_FRAME_TRIPLING: picStruct = MFX_PICSTRUCT_PROGRESSIVE; picStruct |= extended ? MFX_PICSTRUCT_FRAME_TRIPLING : 0; break; case UMC_MPEG2_DECODER::DPS_FRAME: default: picStruct = MFX_PICSTRUCT_PROGRESSIVE; break; } return picStruct; } // Fill frame types void SetFrameType(const MPEG2DecoderFrame* frame, mfxFrameSurface1* surface) { auto frameType = (mfxExtDecodedFrameInfo*)GetExtendedBuffer(surface->Data.ExtParam, surface->Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO); if (frameType) { switch (frame->GetAU(0)->GetType()) { case UMC_MPEG2_DECODER::MPEG2_I_PICTURE: frameType->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR; break; case UMC_MPEG2_DECODER::MPEG2_P_PICTURE: frameType->FrameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; break; case UMC_MPEG2_DECODER::MPEG2_B_PICTURE: frameType->FrameType = MFX_FRAMETYPE_B; break; } bool fillBottom = frame->GetAU(1)->IsFilled() || !frame->isProgressiveSequence; if (fillBottom) { auto type = frame->GetAU(1)->IsFilled() ? frame->GetAU(1)->GetType() : frame->GetAU(0)->GetType(); switch (type) { case UMC_MPEG2_DECODER::MPEG2_I_PICTURE: frameType->FrameType |= MFX_FRAMETYPE_xI | MFX_FRAMETYPE_xREF; break; case UMC_MPEG2_DECODER::MPEG2_P_PICTURE: frameType->FrameType |= MFX_FRAMETYPE_xP | MFX_FRAMETYPE_xREF; break; case UMC_MPEG2_DECODER::MPEG2_B_PICTURE: frameType->FrameType |= MFX_FRAMETYPE_xB; break; } } } } // Set MPEG2 group of pictures timecode void SetTimeCode(const MPEG2DecoderFrame* frame, mfxFrameSurface1* surface) { auto timeCode = (mfxExtTimeCode*)GetExtendedBuffer(surface->Data.ExtParam, surface->Data.NumExtParam, MFX_EXTBUFF_TIME_CODE); const auto group = frame->group; if (!timeCode || !group) return; timeCode->DropFrameFlag = group->drop_frame_flag; timeCode->TimeCodePictures = group->time_code_pictures; timeCode->TimeCodeHours = group->time_code_hours; timeCode->TimeCodeMinutes = group->time_code_minutes; timeCode->TimeCodeSeconds = group->time_code_seconds; } VideoDECODEMPEG2::VideoDECODEMPEG2(VideoCORE* core, mfxStatus* sts) : m_core(core) , m_first_run(true) , m_allow_null_work_surface(false) , m_response() , m_response_alien() , m_stat() { if (sts) { *sts = MFX_ERR_NONE; } } VideoDECODEMPEG2::~VideoDECODEMPEG2() { Close(); } // Initialize decoder mfxStatus VideoDECODEMPEG2::Init(mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(!m_decoder, MFX_ERR_UNDEFINED_BEHAVIOR); std::lock_guard guard(m_guard); eMFXPlatform platform = UMC_MPEG2_DECODER::GetPlatform_MPEG2(m_core, par); eMFXHWType type = platform == MFX_PLATFORM_HARDWARE ? m_core->GetHWType() : MFX_HW_UNKNOWN; // Checking general init params mfxStatus mfxSts = CheckVideoParamDecoders(par, type); MFX_CHECK(mfxSts >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(UMC_MPEG2_DECODER::MFX_PROFILE_MPEG1 != par->mfx.CodecProfile, MFX_ERR_UNSUPPORTED); // MPEG2 specific param checking MFX_CHECK(UMC_MPEG2_DECODER::CheckVideoParam(par), MFX_ERR_INVALID_VIDEO_PARAM); m_init_video_par = *par; m_first_video_par = *par; m_first_video_par.mfx.NumThread = (mfxU16)CalculateNumThread(par); bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_first_video_par); m_video_par = m_first_video_par; m_video_par.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_video_par.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); MFX_CHECK(platform != MFX_PLATFORM_SOFTWARE, MFX_ERR_UNSUPPORTED); m_decoder.reset(new UMC_MPEG2_DECODER::MPEG2DecoderVA()); // Internal or external memory bool internal = par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; mfxFrameAllocRequest request{}; mfxFrameAllocRequest request_internal{}; m_response = {}; m_response_alien = {}; // Number of surfaces required mfxSts = QueryIOSurfInternal(&m_video_par, &request); MFX_CHECK_STS(mfxSts); if (IsD3D9Simulation(*m_core)) internal = true; request.Type |= internal ? MFX_MEMTYPE_INTERNAL_FRAME : MFX_MEMTYPE_EXTERNAL_FRAME; request_internal = request; m_response_alien = m_response; try { m_surface_source.reset(new SurfaceSource(m_core, *par, platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } UMC_MPEG2_DECODER::MPEG2DecoderParams vp{}; vp.allocator = m_surface_source.get(); vp.async_depth = CalculateAsyncDepth(par); mfxSts = m_core->CreateVA(par, &request, &m_response, m_surface_source.get()); MFX_CHECK_STS(mfxSts); m_core->GetVA((mfxHDL*)&vp.pVideoAccelerator, MFX_MEMTYPE_FROM_DECODE); ConvertMFXParamsToUMC(par, &vp); // UMC decoder initialization UMC::Status umcSts = m_decoder->Init(&vp); MFX_CHECK(UMC::UMC_OK == umcSts, MFX_ERR_NOT_INITIALIZED); m_first_run = true; m_decoder->SetVideoParams(m_first_video_par); return isNeedChangeVideoParamWarning ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } mfxStatus VideoDECODEMPEG2::QueryImplsDescription( VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU16 SupportedProfiles[] = { MFX_PROFILE_MPEG2_SIMPLE , MFX_PROFILE_MPEG2_MAIN , MFX_PROFILE_MPEG2_HIGH }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 }; caps.CodecID = MFX_CODEC_MPEG2; caps.MaxcodecLevel = MFX_LEVEL_MPEG2_HIGH1440; mfxVideoParam par; memset(&par, 0, sizeof(par)); par.mfx.CodecId = MFX_CODEC_MPEG2; par.mfx.CodecLevel = caps.MaxcodecLevel; mfxStatus sts = MFX_ERR_NONE; for (mfxU16 profile : SupportedProfiles) { par.mfx.CodecProfile = profile; // Set FourCC to pass Query check par.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; sts = VideoDECODEMPEG2::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 2048, 16 }; memCaps.Height = { 16, 2048, 16 }; for (auto fcc : SupportedFourCC) { par.mfx.FrameInfo.FourCC = fcc; sts = VideoDECODEMPEG2::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } // Reset decoder mfxStatus VideoDECODEMPEG2::Reset(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); std::lock_guard guard(m_guard); eMFXHWType type = m_core->GetHWType(); mfxStatus mfxSts = CheckVideoParamDecoders(par, type); MFX_CHECK(mfxSts >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(UMC_MPEG2_DECODER::CheckVideoParam(par), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(IsSameVideoParam(par, &m_init_video_par, type), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); eMFXPlatform platform = UMC_MPEG2_DECODER::GetPlatform_MPEG2(m_core, par); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); m_decoder->Reset(); MFX_CHECK(m_surface_source->Reset() == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_first_run = true; m_stat = {}; m_first_video_par = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_first_video_par); m_video_par = m_first_video_par; m_video_par.CreateExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); m_video_par.CreateExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); m_video_par.mfx.NumThread = (mfxU16)CalculateNumThread(par); m_decoder->SetVideoParams(m_first_video_par); return isNeedChangeVideoParamWarning ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } // Close decoder mfxStatus VideoDECODEMPEG2::Close(void) { std::lock_guard guard(m_guard); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); m_decoder->Close(); m_surface_source->Close(); m_first_run = true; m_stat = {}; return MFX_ERR_NONE; } // Check if new parameters are compatible with new parameters bool VideoDECODEMPEG2::IsSameVideoParam(mfxVideoParam * newPar, mfxVideoParam * oldPar, eMFXHWType/* type*/) const { auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; if ((newPar->IOPattern & mask) != (oldPar->IOPattern & mask)) return false; MFX_CHECK(newPar->Protected == oldPar->Protected, false); MFX_CHECK(newPar->mfx.FrameInfo.FourCC == oldPar->mfx.FrameInfo.FourCC, false); MFX_CHECK(CalculateAsyncDepth(newPar) == CalculateAsyncDepth(oldPar), false); mfxFrameAllocRequest requestOld{}; mfxFrameAllocRequest requestNew{}; MFX_CHECK(MFX_ERR_NONE == QueryIOSurfInternal(oldPar, &requestOld), false); MFX_CHECK(MFX_ERR_NONE == QueryIOSurfInternal(newPar, &requestNew), false); MFX_CHECK(newPar->mfx.FrameInfo.Height <= oldPar->mfx.FrameInfo.Height, false); MFX_CHECK(newPar->mfx.FrameInfo.Width <= oldPar->mfx.FrameInfo.Width, false); MFX_CHECK(newPar->mfx.FrameInfo.ChromaFormat == oldPar->mfx.FrameInfo.ChromaFormat, false); if (m_response.NumFrameActual) { MFX_CHECK(requestNew.NumFrameMin <= m_response.NumFrameActual, false); } else { if (requestNew.NumFrameMin > requestOld.NumFrameMin || requestNew.Type != requestOld.Type) return false; } return true; } mfxTaskThreadingPolicy VideoDECODEMPEG2::GetThreadingPolicy() { return MFX_TASK_THREADING_SHARED; } mfxStatus VideoDECODEMPEG2::Query(VideoCORE* core, mfxVideoParam* in, mfxVideoParam* out) { return UMC_MPEG2_DECODER::Query(core, in, out); } mfxStatus VideoDECODEMPEG2::QueryIOSurf(VideoCORE* core, mfxVideoParam* par, mfxFrameAllocRequest* request) { MFX_CHECK_NULL_PTR2(par, request); eMFXPlatform platform = UMC_MPEG2_DECODER::GetPlatform_MPEG2(core, par); if (platform != MFX_PLATFORM_HARDWARE) MFX_RETURN(MFX_ERR_UNSUPPORTED); mfxVideoParam params(*par); bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(¶ms); if ( !(par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if ((par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); mfxStatus sts = QueryIOSurfInternal(¶ms, request); MFX_CHECK_STS(sts); bool isInternalManaging = (params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); bool IsD3D9SimWithVideoMem = IsD3D9Simulation(*core) && (params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (IsD3D9SimWithVideoMem) isInternalManaging = true; if (isInternalManaging) { request->NumFrameSuggested = request->NumFrameMin = (mfxU16)(CalculateAsyncDepth(par) + 1); // "+1" because we release the latest displayed surface in _sync_ part when another surface comes if (!IsD3D9SimWithVideoMem) request->Type = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_FROM_DECODE; } request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; if (platform != core->GetPlatformType()) { assert(platform == MFX_PLATFORM_SOFTWARE); MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } return isNeedChangeVideoParamWarning ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } // Actually calculate needed frames number mfxStatus VideoDECODEMPEG2::QueryIOSurfInternal(mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEMPEG2::QueryIOSurfInternal"); request->Info = par->mfx.FrameInfo; mfxU16 dpbSize = UMC_MPEG2_DECODER::NUM_REF_FRAMES; mfxU16 numMin = (mfxU16)(dpbSize + CalculateAsyncDepth(par) // DPB + AsyncDepth + + 1); // input surface for DPB dumping (because we release the latest displayed surface in _sync_ part when another surface comes) request->NumFrameMin = numMin; request->NumFrameSuggested = request->NumFrameMin; request->Type = (MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE); return MFX_ERR_NONE; } // Decode stream headers and fill video parameters mfxStatus VideoDECODEMPEG2::DecodeHeader(VideoCORE* core, mfxBitstream* bs, mfxVideoParam* par) { MFX_CHECK(core, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = CheckBitstream(bs); MFX_CHECK_STS(sts); try { UMC::Status res = UMC_MPEG2_DECODER::MPEG2Decoder::DecodeHeader(*bs, *par); MFX_CHECK(UMC::UMC_OK == res, ConvertStatusUmc2Mfx(res)); } catch (UMC_MPEG2_DECODER::mpeg2_exception & ex) { return ConvertStatusUmc2Mfx(ex.GetStatus()); } return MFX_ERR_NONE; } // MediaSDK DECODE_GetVideoParam API function mfxStatus VideoDECODEMPEG2::GetVideoParam(mfxVideoParam *par) { std::lock_guard guard(m_guard); MFX_CHECK(m_decoder, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_NULL_PTR1(par); FillVideoParam(&m_video_par, true); par->mfx = m_video_par.mfx; par->Protected = m_video_par.Protected; par->IOPattern = m_video_par.IOPattern; par->AsyncDepth = m_video_par.AsyncDepth; auto videoSignal = (mfxExtVideoSignalInfo*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { auto videoSignalInternal = m_video_par.GetExtendedBuffer(MFX_EXTBUFF_VIDEO_SIGNAL_INFO); *videoSignal = *videoSignalInternal; } // Sequence header auto mfxSeq = (mfxExtCodingOptionSPSPPS*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (mfxSeq) { auto spsPpsInternal = m_video_par.GetExtendedBuffer(MFX_EXTBUFF_CODING_OPTION_SPSPPS); mfxSeq->SPSId = 0; if (mfxSeq->SPSBufSize < spsPpsInternal->SPSBufSize || mfxSeq->PPSBufSize < spsPpsInternal->PPSBufSize) MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); mfxSeq->SPSBufSize = spsPpsInternal->SPSBufSize; std::copy(spsPpsInternal->SPSBuffer, spsPpsInternal->SPSBuffer + mfxSeq->SPSBufSize, mfxSeq->SPSBuffer); } par->mfx.FrameInfo.FrameRateExtN = m_first_video_par.mfx.FrameInfo.FrameRateExtN; par->mfx.FrameInfo.FrameRateExtD = m_first_video_par.mfx.FrameInfo.FrameRateExtD; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtD = m_video_par.mfx.FrameInfo.FrameRateExtD; par->mfx.FrameInfo.FrameRateExtN = m_video_par.mfx.FrameInfo.FrameRateExtN; if (!par->mfx.FrameInfo.FrameRateExtD && !par->mfx.FrameInfo.FrameRateExtN) { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } par->mfx.FrameInfo.AspectRatioW = m_first_video_par.mfx.FrameInfo.AspectRatioW; par->mfx.FrameInfo.AspectRatioH = m_first_video_par.mfx.FrameInfo.AspectRatioH; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = m_video_par.mfx.FrameInfo.AspectRatioH; par->mfx.FrameInfo.AspectRatioW = m_video_par.mfx.FrameInfo.AspectRatioW; if (!par->mfx.FrameInfo.AspectRatioH && !par->mfx.FrameInfo.AspectRatioW) { par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; } } return MFX_ERR_NONE; } // MediaSDK DECODE_GetDecodeStat API function mfxStatus VideoDECODEMPEG2::GetDecodeStat(mfxDecodeStat *stat) { std::lock_guard guard(m_guard); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(stat); m_stat.NumSkippedFrame = m_decoder->GetNumSkipFrames(); m_stat.NumCachedFrame = m_decoder->GetNumCachedFrames(); *stat = m_stat; return MFX_ERR_NONE; } mfxStatus VideoDECODEMPEG2::DecodeFrameCheck(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, MFX_ENTRY_POINT* entry_point) { MFX_CHECK_NULL_PTR1(entry_point); std::lock_guard guard(m_guard); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(surface_out); mfxStatus sts = bs ? CheckBitstream(bs) : MFX_ERR_NONE; MFX_CHECK_STS(sts); // in case of EOS (flushing) decoder may return buffered surface // without surface_work if (surface_work != nullptr) { sts = CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_MPEG2); MFX_CHECK_STS(sts); sts = CheckFrameData(surface_work); MFX_CHECK_STS(sts); } else { bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); /* In case 1.x core and nullptr surface_work we need to return back to user one of surfaces which were previously decoded. In case of system memory these surfaces are video surfaces which were allocated by decoder. And we can't return them because user wait system surface. So, we can allow surface_work to be nullptr only for video memory or for new core (model 3). */ MFX_CHECK(allow_null_work_surface || m_init_video_par.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY, MFX_ERR_UNSUPPORTED) bool empty_bitstream = !bs || bs->DataFlag == MFX_BITSTREAM_EOS; if (!empty_bitstream && allow_null_work_surface) { m_allow_null_work_surface = true; } if (!m_allow_null_work_surface) { MFX_CHECK(empty_bitstream, MFX_ERR_NULL_PTR); } } mfxThreadTask task; sts = SubmitFrame(bs, surface_work, surface_out, &task); MFX_CHECK_STS(sts); entry_point->pRoutine = &DecodeRoutine; entry_point->pCompleteProc = &CompleteProc; entry_point->pState = this; entry_point->requiredNumThreads = 1; entry_point->pParam = task; return sts; } // MediaSDK DECODE_SetSkipMode API function mfxStatus VideoDECODEMPEG2::SetSkipMode(mfxSkipMode mode) { std::lock_guard guard(m_guard); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); int32_t current_speed = 0; // don't change, just check current value m_decoder->ChangeVideoDecodingSpeed(current_speed); // ChangeVideoDecodingSpeed updates the argument with new value int32_t new_speed = 0; switch (mode) { case MFX_SKIPMODE_NOSKIP: new_speed = -10; // restore default break; case MFX_SKIPMODE_MORE: new_speed = 1; break; case MFX_SKIPMODE_LESS: new_speed = -1; break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } m_decoder->ChangeVideoDecodingSpeed(new_speed); return current_speed == new_speed ? MFX_WRN_VALUE_NOT_CHANGED : MFX_ERR_NONE; } // Return stream payload mfxStatus VideoDECODEMPEG2::GetPayload(mfxU64 *ts, mfxPayload *payload) { std::lock_guard guard(m_guard); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(ts, payload, payload->Data); const auto payloads = m_decoder->GetPayloadStorage(); MFX_CHECK(payloads, MFX_ERR_UNKNOWN); const auto msg = payloads->GetPayloadMessage(); static const mfxU16 USER_DATA_START_CODE = 0x000001B2; if (msg) { if (payload->BufSize < msg->msg_size) MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); *ts = GetMfxTimeStamp(msg->timestamp); std::copy(msg->data, msg->data + msg->msg_size, payload->Data); payload->NumBit = (mfxU32)(msg->msg_size * 8); payload->Type = USER_DATA_START_CODE; } else { payload->NumBit = 0; *ts = MFX_TIME_STAMP_INVALID; } return MFX_ERR_NONE; } // Initialize threads callbacks mfxStatus VideoDECODEMPEG2::SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, mfxThreadTask* task) { MFX_CHECK_NULL_PTR1(task); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = SubmitFrame(bs, surface_work, surface_out); MFX_CHECK_STS(sts); std::unique_ptr info(new TaskInfo); // to prevent memory leak if (surface_work) info->surface_work = surface_work; if (*surface_out) info->surface_out = *surface_out; *task = reinterpret_cast(info.release()); return MFX_ERR_NONE; } // Wait until a frame is ready to be output and set necessary surface flags mfxStatus VideoDECODEMPEG2::DecodeFrame(mfxFrameSurface1 *surface_out, MPEG2DecoderFrame* frame) const { MFX_CHECK(surface_out, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(frame, MFX_ERR_UNDEFINED_BEHAVIOR); const auto error = frame->GetError(); surface_out->Data.Corrupted = 0; // Set corruption flags if (error & UMC::ERROR_FRAME_DEVICE_FAILURE) { surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; return error == UMC::UMC_ERR_GPU_HANG ? MFX_ERR_GPU_HANG : MFX_ERR_DEVICE_FAILED; } else { if (error & UMC::ERROR_FRAME_MINOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MINOR; if (error & UMC::ERROR_FRAME_MAJOR) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_REFERENCE_FRAME) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; if (error & UMC::ERROR_FRAME_DPB) surface_out->Data.Corrupted |= MFX_CORRUPTION_REFERENCE_LIST; if (error & UMC::ERROR_FRAME_RECOVERY) surface_out->Data.Corrupted |= MFX_CORRUPTION_MAJOR; if (error & UMC::ERROR_FRAME_TOP_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_TOP_FIELD; if (error & UMC::ERROR_FRAME_BOTTOM_FIELD_ABSENT) surface_out->Data.Corrupted |= MFX_CORRUPTION_ABSENT_BOTTOM_FIELD; } const auto id = frame->GetFrameData()->GetFrameMID(); mfxStatus sts = m_surface_source->PrepareToOutput(surface_out, id, &m_video_par); // Copy to system memory if needed frame->SetDisplayed(); return sts; } // Decoder instance threads entry point. Do async tasks here mfxStatus VideoDECODEMPEG2::QueryFrame(mfxThreadTask task) { MFX_CHECK_NULL_PTR1(task); MFX_CHECK(m_core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(m_decoder, MFX_ERR_NOT_INITIALIZED); auto info = reinterpret_cast(task); auto surface_out = info->surface_out; MFX_CHECK(surface_out, MFX_ERR_UNDEFINED_BEHAVIOR); const auto id = m_surface_source->FindSurface(surface_out); auto frame = m_decoder->FindFrameByMemID(id); MFX_CHECK(frame, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(frame->DecodingStarted(), MFX_ERR_UNDEFINED_BEHAVIOR); if (!frame->DecodingCompleted()) { m_decoder->QueryFrames(*frame); } MFX_CHECK(frame->DecodingCompleted(), MFX_TASK_WORKING); mfxStatus sts = DecodeFrame(surface_out, frame); MFX_CHECK_STS(sts); return MFX_TASK_DONE; } // Check if there is enough data to start decoding in async mode mfxStatus VideoDECODEMPEG2::SubmitFrame(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out) { mfxStatus sts = MFX_ERR_NONE; try { bool exit = false; MFXMediaDataAdapter src(bs); for (;;) { sts = m_surface_source->SetCurrentMFXSurface(surface_work); MFX_CHECK_STS(sts); UMC::Status umcRes = (m_surface_source->HasFreeSurface() || surface_work == nullptr) ? m_decoder->AddSource(bs ? &src : nullptr) : UMC::UMC_ERR_NEED_FORCE_OUTPUT; // Exit with MFX_WRN_DEVICE_BUSY src.Save(bs); // Update input mfxBitstream offset exit = (umcRes != UMC::UMC_OK); if (umcRes == UMC::UMC_NTF_NEW_RESOLUTION || umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS || umcRes == UMC::UMC_ERR_UNSUPPORTED) { FillVideoParam(&m_video_par, true); // Update current mfx video params } switch (umcRes) { case UMC::UMC_ERR_INVALID_STREAM: umcRes = UMC::UMC_OK; exit = false; break; case UMC::UMC_NTF_NEW_RESOLUTION: MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); case UMC::UMC_ERR_DEVICE_FAILED: // return errors immediatelly MFX_RETURN(MFX_ERR_DEVICE_FAILED); case UMC::UMC_ERR_GPU_HANG: // return errors immediatelly MFX_RETURN(MFX_ERR_GPU_HANG); } if (umcRes == UMC::UMC_WRN_REPOSITION_INPROGRESS) // New sequence header { if (!m_first_run) { sts = MFX_WRN_VIDEO_PARAM_CHANGED; } else { umcRes = UMC::UMC_OK; exit = false; m_first_run = false; } } if (umcRes == UMC::UMC_OK && !m_surface_source->HasFreeSurface()) { sts = MFX_ERR_MORE_SURFACE; exit = true; } else if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || umcRes == UMC::UMC_WRN_INFO_NOT_READY || umcRes == UMC::UMC_ERR_NEED_FORCE_OUTPUT) { sts = umcRes == UMC::UMC_ERR_NOT_ENOUGH_BUFFER ? (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK : MFX_WRN_DEVICE_BUSY; } else if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA || umcRes == UMC::UMC_ERR_SYNC) { sts = MFX_ERR_MORE_DATA; } auto frame = GetFrameToDisplay(); if (frame) { m_stat.NumFrame++; m_stat.NumError += frame->GetError() ? 1 : 0; return FillOutputSurface(surface_work, surface_out, frame); } if (exit) break; } // for (;;) } catch (const UMC_MPEG2_DECODER::mpeg2_exception & ex) { FillVideoParam(&m_video_par, false); if (ex.GetStatus() == UMC::UMC_ERR_ALLOC) { // check incompatibility of video params if (m_init_video_par.mfx.FrameInfo.Width != m_video_par.mfx.FrameInfo.Width || m_init_video_par.mfx.FrameInfo.Height != m_video_par.mfx.FrameInfo.Height) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } return ConvertUMCStatusToMfx(ex.GetStatus()); } catch (std::bad_alloc const&) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } catch (...) { MFX_RETURN(MFX_ERR_UNKNOWN); } return sts; } // Decoder threads entry point mfxStatus VideoDECODEMPEG2::DecodeRoutine(void* state, void* param, mfxU32, mfxU32) { auto decoder = reinterpret_cast(state); MFX_CHECK(decoder, MFX_ERR_UNDEFINED_BEHAVIOR); auto task = reinterpret_cast(param); MFX_CHECK(task, MFX_ERR_UNDEFINED_BEHAVIOR); auto sts = decoder->QueryFrame(task); return sts; } // Threads complete proc callback mfxStatus VideoDECODEMPEG2::CompleteProc(void*, void* param, mfxStatus) { auto info = reinterpret_cast(param); delete info; return MFX_ERR_NONE; } // Fill up resolution information if new header arrived void VideoDECODEMPEG2::FillVideoParam(mfxVideoParamWrapper *par, bool full) { if (!m_decoder) return; m_decoder->FillVideoParam(par, full); const auto seq = m_decoder->GetSeqAndSeqExtHdr(); auto mfxSeq = (mfxExtCodingOptionSPSPPS*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (!mfxSeq) return; if (seq->GetSize()) { mfxSeq->SPSBufSize = (mfxU16)seq->GetSize(); mfxSeq->SPSBuffer = seq->GetPointer(); } else { mfxSeq->SPSBufSize = 0; } } // Fill up frame parameters before returning it to application mfxStatus VideoDECODEMPEG2::FillOutputSurface(mfxFrameSurface1* surface_work, mfxFrameSurface1** surf_out, MPEG2DecoderFrame* frame) const { const auto fd = frame->GetFrameData(); *surf_out = m_surface_source->GetSurface(fd->GetFrameMID(), surface_work, &m_video_par); MFX_CHECK(*surf_out != nullptr, MFX_ERR_MEMORY_ALLOC); auto surface_out = *surf_out; SetFrameType(frame, surface_out); surface_out->Info.FrameId.ViewId = 0; surface_out->Info.FrameId.TemporalId = 0; surface_out->Info.CropX = 0; surface_out->Info.CropY = 0; surface_out->Info.CropW = (mfxU16)frame->horizontalSize; surface_out->Info.CropH = (mfxU16)frame->verticalSize; surface_out->Info.AspectRatioH = m_first_video_par.mfx.FrameInfo.AspectRatioH; surface_out->Info.AspectRatioW = m_first_video_par.mfx.FrameInfo.AspectRatioW; bool bShouldUpdate = !m_first_video_par.mfx.FrameInfo.AspectRatioH || !m_first_video_par.mfx.FrameInfo.AspectRatioW; surface_out->Info.AspectRatioH = bShouldUpdate ? (mfxU16)frame->aspectHeight : m_first_video_par.mfx.FrameInfo.AspectRatioH; surface_out->Info.AspectRatioW = bShouldUpdate ? (mfxU16)frame->aspectWidth : m_first_video_par.mfx.FrameInfo.AspectRatioW; bShouldUpdate = !(m_first_video_par.mfx.FrameInfo.FrameRateExtD || m_first_video_par.mfx.FrameInfo.FrameRateExtN); surface_out->Info.FrameRateExtD = bShouldUpdate ? m_video_par.mfx.FrameInfo.FrameRateExtD : m_first_video_par.mfx.FrameInfo.FrameRateExtD; surface_out->Info.FrameRateExtN = bShouldUpdate ? m_video_par.mfx.FrameInfo.FrameRateExtN : m_first_video_par.mfx.FrameInfo.FrameRateExtN; surface_out->Info.PicStruct = GetMFXPicStruct(*frame, m_video_par.mfx.ExtendedPicStruct); surface_out->Data.TimeStamp = GetMfxTimeStamp(frame->dFrameTime); surface_out->Data.FrameOrder = frame->displayOrder; surface_out->Data.DataFlag = (mfxU16)(frame->isOriginalPTS ? MFX_FRAMEDATA_ORIGINAL_TIMESTAMP : 0); SetTimeCode(frame, surface_out); auto payloads = m_decoder->GetPayloadStorage(); if (payloads) payloads->SetTimestamp(frame); return MFX_ERR_NONE; } // Find a next frame ready to be output from decoder MPEG2DecoderFrame* VideoDECODEMPEG2::GetFrameToDisplay() { MPEG2DecoderFrame* frame = nullptr; do { frame = m_decoder->GetFrameToDisplay(); if (!frame) { break; } m_decoder->PostProcessDisplayFrame(frame); if (frame->IsSkipped()) { frame->SetOutputted(); frame->SetDisplayed(); } } while (frame->IsSkipped()); if (frame) { frame->SetOutputted(); } return frame; } mfxStatus VideoDECODEMPEG2::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vc1/000077500000000000000000000000001443134507600242715ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vc1/include/000077500000000000000000000000001443134507600257145ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vc1/include/mfx_vc1_decode.h000066400000000000000000000227241443134507600307420ustar00rootroot00000000000000// Copyright (c) 2004-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef _MFX_VC1_DEC_DECODE_H_ #define _MFX_VC1_DEC_DECODE_H_ #include #include #include #include "umc_vc1_video_decoder.h" #include "umc_vc1_video_decoder_hw.h" #include "mfx_umc_alloc_wrapper.h" #include "umc_vc1_spl_frame_constr.h" #include "umc_mutex.h" #include "mfx_task.h" #include "mfx_critical_error_handler.h" typedef struct { mfxU64 pts; bool isOriginal; }VC1TSDescriptor; class VideoDECODE; class MFXVideoDECODEVC1 : public VideoDECODE, public MfxCriticalErrorHandler { public: enum { MAX_NUM_STATUS_REPORTS = 32 }; struct AsyncSurface { mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out; mfxU32 taskID; // for task ordering bool isFrameSkipped; // for status reporting }; static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); MFXVideoDECODEVC1(VideoCORE *core, mfxStatus* mfxSts); virtual ~MFXVideoDECODEVC1(void); mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts); virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp); virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override; // to satisfy internal API virtual mfxStatus DecodeFrame(mfxBitstream * /*bs*/, mfxFrameSurface1 * /*surface_work*/, mfxFrameSurface1 * /*surface_out*/){ return MFX_ERR_UNSUPPORTED; }; mfxStatus RunThread(mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_disp, mfxU32 threadNumber, mfxU32 taskID); virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; protected: static mfxStatus SetAllocRequestInternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus SetAllocRequestExternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static void CalculateFramesNumber(mfxFrameAllocRequest *request, mfxVideoParam *par, bool isBufMode); // update Frame Descriptors, copy frames to external memory in case of HW decoder mfxStatus PostProcessFrameHW(mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_disp); //need for initialization UMC::VC1Decoder mfxStatus ConvertMfxToCodecParams(mfxVideoParam *par); mfxStatus ConvertMfxBSToMediaDataForFconstr(mfxBitstream *pBitstream); mfxStatus ConvertMfxPlaneToMediaData(mfxFrameSurface1 *surface); mfxStatus CheckInput(mfxVideoParam *in); mfxStatus CheckForCriticalChanges(mfxVideoParam *in); mfxStatus CheckFrameInfo(mfxFrameInfo *info); mfxStatus SelfConstructFrame(mfxBitstream *bs); mfxStatus SelfDecodeFrame(mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp, mfxBitstream *bs); mfxStatus ReturnLastFrame(mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp); mfxStatus FillOutputSurface(mfxFrameSurface1 *surface, UMC::FrameMemID memID); mfxStatus FillOutputSurface(mfxFrameSurface1 *surface); void FillMFXDataOutputSurface(mfxFrameSurface1 *surface); mfxStatus GetOutputSurface(mfxFrameSurface1 **surface_out, mfxFrameSurface1 *surface_work, UMC::FrameMemID index); UMC::FrameMemID GetDispMemID(); void PrepareMediaIn(void); static bool IsHWSupported(VideoCORE *pCore, mfxVideoParam *par); // frame buffering mfxStatus IsDisplayFrameReady(mfxFrameSurface1 **surface_disp); mfxStatus GetStatusReport(); mfxStatus ProcessSkippedFrame(); static bool IsBufferMode(VideoCORE *pCore, mfxVideoParam *par); bool IsStatusReportEnable(); bool FrameStartCodePresence(); void SetFrameOrder(SurfaceSource* pFrameAlloc, mfxVideoParam* par, bool isLast, VC1TSDescriptor tsd, bool isSamePolar); void FillVideoSignalInfo(mfxExtVideoSignalInfo *pVideoSignal); static const mfxU16 disp_queue_size = 2; // looks enough for Linux now and disable on Windows. UMC::BaseCodecParams* m_VideoParams; UMC::MediaData* m_pInternMediaDataIn; //should be zero in case of Last frame UMC::VideoData m_InternMediaDataOut; UMC::MediaData m_FrameConstrData; mfx_UMC_MemAllocator m_MemoryAllocator; std::unique_ptr m_surface_source; std::unique_ptr m_pVC1VideoDecoder; UMC::vc1_frame_constructor* m_frame_constructor; uint8_t* m_pReadBuffer; UMC::MemID m_RBufID; uint32_t m_BufSize; UMC::MediaDataEx::_MediaDataEx* m_pStCodes; UMC::MemID m_stCodesID; mfxVideoParam m_par; mfxVideoParam m_Initpar; uint32_t m_FrameSize; bool m_bIsInit; // need for sm profile - construct frame UMC::VC1FrameConstrInfo m_FCInfo; VideoCORE* m_pCore; bool m_bIsNeedToProcFrame; bool m_bIsDecInit; bool m_bIsSWD3D; bool m_bIsSamePolar; bool m_bIsDecodeOrder; std::deque m_qMemID; std::deque m_qSyncMemID; std::deque m_qTS; // for pts in bitstream processing std::deque m_qBSTS; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; uint32_t m_SHSize; mfxU8 m_pSaveBytes[4]; // 4 bytes enough mfxU32 m_SaveBytesSize; mfxBitstream m_sbs; mfxU32 m_CurrentBufFrame; std::vector m_DisplayList; std::vector m_DisplayListAsync; bool m_bTakeBufferedFrame; bool m_bIsBuffering; mfxU32 m_CurrentTask; mfxU32 m_WaitedTask; mfxU32 m_BufOffset; // to synchronize async and sync parts UMC::Mutex m_guard; mfxU32 m_ProcessedFrames; mfxU32 m_SubmitFrame; bool m_bIsFirstField; mfxFrameSurface1 *m_pPrevOutSurface; // to process skipped frames through coping std::vector m_RawSeq; mfxU64 m_ext_dur; bool m_bStsReport; mfxU32 m_NumberOfQueries; static const mfxU32 NumOfSeqQuery = 32; bool m_bPTSTaken; private: // Declare private copy constructor to avoid accidental assignment MFXVideoDECODEVC1(const MFXVideoDECODEVC1 &); MFXVideoDECODEVC1 & operator = (const MFXVideoDECODEVC1 &); }; extern mfxStatus __CDECL VC1DECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); #endif //MFX_ENABLE_VC1_VIDEO_DECODE #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vc1/src/000077500000000000000000000000001443134507600250605ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vc1/src/mfx_vc1_decode.cpp000066400000000000000000002000341443134507600304310ustar00rootroot00000000000000// Copyright (c) 2004-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "mfx_vc1_decode.h" #include "mfxvideo++int.h" #include "mfx_vc1_dec_common.h" #include "umc_vc1_dec_task_store.h" #include "umc_vc1_dec_frame_descr_va.h" // calculate framerate #include "mfx_enc_common.h" #include "mfx_thread_task.h" #include "mfx_common_decode_int.h" using namespace MFXVC1DecCommon; using namespace UMC; class VC1TaskStore; static void SetFrameType(const uint32_t type, mfxFrameSurface1 &surface) { auto extFrameInfo = reinterpret_cast(GetExtendedBuffer(surface.Data.ExtParam, surface.Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO)); if (extFrameInfo == nullptr) return; switch (type & VC1_BI_FRAME) { case VC1_I_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_I; break; case VC1_P_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_P; break; case VC1_B_FRAME: case VC1_BI_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_B; break; default:// unexpected type extFrameInfo->FrameType = MFX_FRAMETYPE_UNKNOWN; assert(0); } } void MFXVideoDECODEVC1::SetFrameOrder(SurfaceSource* pFrameAlloc, mfxVideoParam* par, bool isLast, VC1TSDescriptor tsd, bool isSamePolar) { mfxFrameSurface1 surface = { }; mfxFrameSurface1 *pSurface; uint32_t frameOrder = 0; UMC::FrameMemID idx = m_pVC1VideoDecoder->GetFrameOrder(isLast, isSamePolar, frameOrder); pSurface = pFrameAlloc->GetSurface(idx, &surface, par); if(pSurface == nullptr) return; if (frameOrder == 0xFFFFFFFF) { pSurface->Data.FrameOrder = 0xFFFFFFFF; return; } pSurface->Data.FrameOrder = frameOrder; pSurface->Data.TimeStamp = tsd.pts; pSurface->Data.DataFlag = (mfxU16)(tsd.isOriginal ? MFX_FRAMEDATA_ORIGINAL_TIMESTAMP : 0); } void MFXVideoDECODEVC1::FillVideoSignalInfo(mfxExtVideoSignalInfo *pVideoSignal) { pVideoSignal->ColourDescriptionPresent = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.ColourDescriptionPresent; if (pVideoSignal->ColourDescriptionPresent) { pVideoSignal->ColourPrimaries = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.ColourPrimaries; pVideoSignal->MatrixCoefficients = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.MatrixCoefficients; pVideoSignal->TransferCharacteristics = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.TransferCharacteristics; } else { pVideoSignal->ColourPrimaries = 1; pVideoSignal->MatrixCoefficients = 6; pVideoSignal->TransferCharacteristics = 1; } } MFXVideoDECODEVC1::MFXVideoDECODEVC1(VideoCORE *core, mfxStatus* mfxSts):VideoDECODE(), m_VideoParams(NULL), m_pInternMediaDataIn(NULL), m_pVC1VideoDecoder(nullptr), m_frame_constructor(NULL), m_RBufID((UMC::MemID)-1), m_BufSize(1024*1024), m_pStCodes(0), m_stCodesID((UMC::MemID)-1), m_par(), m_Initpar(), m_FrameSize(0), m_bIsInit(false), m_FCInfo(), m_pCore(core), m_bIsNeedToProcFrame(true), m_bIsDecInit(false), m_bIsSWD3D(false), m_bIsSamePolar(true), m_bIsDecodeOrder(false), m_SHSize(0), m_SaveBytesSize(0), m_sbs(), m_CurrentBufFrame(0), m_bIsBuffering(false), m_CurrentTask(0), m_WaitedTask(0), m_BufOffset(0), m_ProcessedFrames(0), m_SubmitFrame(0), m_bIsFirstField(true), m_pPrevOutSurface(NULL), m_ext_dur(0), m_bStsReport(true), m_NumberOfQueries(0), m_bPTSTaken(false) { memset(&m_response, 0, sizeof(mfxFrameAllocResponse)); memset(&m_response_alien, 0, sizeof(m_response_alien)); m_MemoryAllocator.InitMem(NULL,core); m_VideoParams = new UMC::VideoDecoderParams; m_pInternMediaDataIn = new UMC::MediaData; *mfxSts = MFX_ERR_NONE; m_bTakeBufferedFrame = 0; m_pReadBuffer = NULL; } MFXVideoDECODEVC1::~MFXVideoDECODEVC1(void) { Close(); if (m_VideoParams) { delete m_VideoParams; m_VideoParams = NULL; } if (m_pInternMediaDataIn) { delete m_pInternMediaDataIn; m_pInternMediaDataIn = NULL; } } mfxStatus MFXVideoDECODEVC1::Init(mfxVideoParam *par) { // already init MFX_CHECK(!m_bIsDecInit, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus MFXSts = MFX_ERR_NONE; UMC::Status IntUMCStatus = UMC::UMC_OK; UMC::Status umcSts = UMC::UMC_OK; bool isPartMode = false; m_CurrentTask = 0; m_WaitedTask = 0; MFXSts = CheckVideoParamDecoders(par, m_pCore->GetHWType()); MFX_CHECK_STS(MFXSts); MFXSts = CheckInput(par); MFX_CHECK_STS(MFXSts); MFX_CHECK(MFX_PLATFORM_SOFTWARE != m_pCore->GetPlatformType() || !par->Protected, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(IsHWSupported(m_pCore, par) || par->Protected <= 0, MFX_ERR_INVALID_VIDEO_PARAM); mfxU16 IOPattern = par->IOPattern; m_bIsDecodeOrder = (1 == par->mfx.DecodedOrder)? true : false; // Setting buffering options m_CurrentBufFrame = 0; m_bIsBuffering = (disp_queue_size > 0)?IsBufferMode(m_pCore, par):false; m_par = *par; m_Initpar = *par; m_par.mfx.NumThread = 0; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_par); m_par.mfx.NumThread = (mfxU16)(m_par.AsyncDepth ? m_par.AsyncDepth : m_pCore->GetAutoAsyncDepth()); MFX_CHECK(m_pCore->GetPlatformType() == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); MFX_CHECK(IsHWSupported(m_pCore, par), MFX_ERR_UNSUPPORTED); m_pVC1VideoDecoder.reset(new UMC::VC1VideoDecoderHW); // frames allocation mfxFrameAllocRequest request = {}; SetAllocRequestInternal(m_pCore, &m_par, &request); mfxFrameAllocRequest request_internal = request; try { m_surface_source.reset(new SurfaceSource(m_pCore, *par, m_pCore->GetPlatformType(), request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } MFXSts = m_pCore->CreateVA(&m_par, &request, &m_response, m_surface_source.get()); MFX_CHECK(MFXSts >= MFX_ERR_NONE, MFXSts); // External allocator already was set MFXSts = MFX_ERR_NONE; // there are no errors MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_bIsSWD3D = true; m_pVC1VideoDecoder->SetExtFrameAllocator(m_surface_source.get()); ConvertMfxToCodecParams(&m_par); m_VideoParams->lpMemoryAllocator = &m_MemoryAllocator; if (par->mfx.FrameInfo.Width && par->mfx.FrameInfo.Height) { m_BufSize = par->mfx.FrameInfo.Width*par->mfx.FrameInfo.Height*2; // Set surface number for decoding. HW requires m_VideoParams->m_SuggestedOutputSize = request.NumFrameSuggested; IntUMCStatus = m_pVC1VideoDecoder->Init(m_VideoParams); MFX_CHECK_UMC_STS(IntUMCStatus); m_InternMediaDataOut.Init(par->mfx.FrameInfo.Width,par->mfx.FrameInfo.Height,UMC::YV12); } umcSts = m_MemoryAllocator.Alloc(&m_RBufID, m_BufSize, UMC::UMC_ALLOC_PERSISTENT, 16); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_pReadBuffer = (uint8_t*)(m_MemoryAllocator.Lock(m_RBufID)); m_FrameConstrData.SetBufferPointer(m_pReadBuffer, m_BufSize); m_FrameConstrData.SetDataSize(0); umcSts = m_MemoryAllocator.Alloc(&m_stCodesID, START_CODE_NUMBER*2*sizeof(int32_t)+sizeof(UMC::MediaDataEx::_MediaDataEx), UMC::UMC_ALLOC_PERSISTENT, 16); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_pStCodes = (UMC::MediaDataEx::_MediaDataEx*)(m_MemoryAllocator.Lock(m_stCodesID)); memset(reinterpret_cast(m_pStCodes), 0, (START_CODE_NUMBER*2*sizeof(int32_t)+sizeof(UMC::MediaDataEx::_MediaDataEx))); m_pStCodes->count = 0; m_pStCodes->index = 0; m_pStCodes->bstrm_pos = 0; m_pStCodes->offsets = (uint32_t*)((uint8_t*)m_pStCodes + sizeof(UMC::MediaDataEx::_MediaDataEx)); m_pStCodes->values = (uint32_t*)((uint8_t*)m_pStCodes->offsets + START_CODE_NUMBER*sizeof( uint32_t)); // Should add type of statuses to MFX MFX_CHECK(IntUMCStatus == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_FCInfo.in = m_pInternMediaDataIn; m_FCInfo.out = &m_FrameConstrData; m_FCInfo.stCodes = m_pStCodes; m_FCInfo.splMode = 2; m_bIsNeedToProcFrame = true; memset(&m_sbs, 0, sizeof(mfxBitstream)); m_sbs.Data = m_pSaveBytes; // Check. May be we in part mode if (MFX_ERR_NONE == MFXSts && isPartMode) MFXSts = MFX_ERR_UNSUPPORTED; if (IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { m_bIsSamePolar = true; } else { m_bIsSamePolar = false; } m_bIsDecInit = true; MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFXSts; } mfxStatus MFXVideoDECODEVC1::QueryImplsDescription( VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU16 SupportedProfiles[] = { MFX_PROFILE_VC1_SIMPLE , MFX_PROFILE_VC1_MAIN , MFX_PROFILE_VC1_ADVANCED }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 }; caps.CodecID = MFX_CODEC_VC1; caps.MaxcodecLevel = MFX_LEVEL_VC1_4; mfxVideoParam par; memset(&par, 0, sizeof(par)); par.mfx.CodecId = MFX_CODEC_VC1; par.mfx.CodecLevel = caps.MaxcodecLevel; mfxStatus sts = MFX_ERR_NONE; for (mfxU16 profile : SupportedProfiles) { par.mfx.CodecProfile = profile; // Set FourCC & ChromaFormat to pass Query check par.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; sts = MFXVideoDECODEVC1::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 4096, 16 }; memCaps.Height = { 16, 4096, 16 }; for (auto fcc : SupportedFourCC) { par.mfx.FrameInfo.FourCC = fcc; sts = MFXVideoDECODEVC1::Query(&core, &par, &par); if (sts != MFX_ERR_NONE) continue; ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::Reset(mfxVideoParam *par) { mfxStatus MFXSts = MFX_ERR_NONE; Status umcSts = UMC_OK; MFX_CHECK_NULL_PTR1(par); // Common parameters MFXSts = CheckVideoParamDecoders(par, m_pCore->GetHWType()); MFX_CHECK_STS(MFXSts); MFXSts = CheckInput(par); MFX_CHECK_STS(MFXSts); MFXSts = CheckForCriticalChanges(par); MFX_CHECK_STS(MFXSts); m_bIsDecodeOrder = (1 == par->mfx.DecodedOrder)? true : false; // buffers setting m_FrameConstrData.SetBufferPointer(m_pReadBuffer, m_BufSize); m_FrameConstrData.SetDataSize(0); memset(reinterpret_cast(m_pStCodes), 0, (START_CODE_NUMBER*2*sizeof(int32_t)+sizeof(UMC::MediaDataEx::_MediaDataEx))); m_pStCodes->count = 0; m_pStCodes->index = 0; m_pStCodes->bstrm_pos = 0; m_pStCodes->offsets = (uint32_t*)((uint8_t*)m_pStCodes + sizeof(UMC::MediaDataEx::_MediaDataEx)); m_pStCodes->values = (uint32_t*)((uint8_t*)m_pStCodes->offsets + START_CODE_NUMBER*sizeof( uint32_t)); // UMC decoder reset m_par = *par; bool isNeedChangeVideoParamWarning = IsNeedChangeVideoParam(&m_par); m_par.mfx.NumThread = m_pCore->GetAutoAsyncDepth(); ConvertMfxToCodecParams(par); m_VideoParams->lpMemoryAllocator = &m_MemoryAllocator; umcSts = m_pVC1VideoDecoder->Reset(); MFX_CHECK_UMC_STS(umcSts); // Clear output display index queue m_qMemID.clear(); m_qSyncMemID.clear(); m_qTS.clear(); m_qBSTS.clear(); for (mfxU32 i = 0; i < m_DisplayList.size();i++) m_pCore->DecreaseReference(&m_DisplayList[i]->Data); m_DisplayList.clear(); m_DisplayListAsync.clear(); // other vars m_bIsNeedToProcFrame = true; m_bIsDecInit = true; m_CurrentTask = 0; m_WaitedTask = 0; m_SubmitFrame = 0; m_ProcessedFrames = 0; memset(&m_sbs, 0, sizeof(mfxBitstream)); m_sbs.Data = m_pSaveBytes; umcSts = m_surface_source->Reset(); MFX_CHECK_UMC_STS(umcSts); m_bIsInit = false; // setting buffering options m_CurrentBufFrame = 0; m_bIsBuffering = (disp_queue_size > 0)?IsBufferMode(m_pCore, par):false; m_BufOffset = 0; m_bIsFirstField = true; m_pPrevOutSurface = NULL; m_ext_dur = 0; m_SHSize = 0; m_SaveBytesSize = 0; if (false == IsHWSupported(m_pCore, par)) { MFXSts = MFX_ERR_UNSUPPORTED; } MFX_CHECK(!isNeedChangeVideoParamWarning, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); m_NumberOfQueries = 0; m_bPTSTaken = false; return MFXSts; } mfxStatus MFXVideoDECODEVC1::Close(void) { mfxStatus MFXSts = MFX_ERR_NONE; m_ext_dur = 0; if (m_pVC1VideoDecoder.get()) { m_pVC1VideoDecoder->Close(); // Free decoder m_pVC1VideoDecoder.reset(0); } if (m_frame_constructor) { delete m_frame_constructor; m_frame_constructor = 0; } if ((int)m_RBufID != -1) { m_MemoryAllocator.Unlock(m_RBufID); m_MemoryAllocator.Free(m_RBufID); m_RBufID = (UMC::MemID)-1; } if ((int)m_stCodesID != -1) { m_MemoryAllocator.Unlock(m_stCodesID); m_MemoryAllocator.Free(m_stCodesID); m_stCodesID = (UMC::MemID)-1; } m_surface_source.reset(); memset(&m_response, 0, sizeof(m_response)); memset(&m_response_alien, 0, sizeof(m_response_alien)); m_qMemID.clear(); m_qSyncMemID.clear(); m_qTS.clear(); m_qBSTS.clear(); if (!m_bIsDecInit) MFXSts = MFX_ERR_NOT_INITIALIZED; m_bIsDecInit = false; m_pPrevOutSurface = NULL; memset(&m_Initpar,0, sizeof(mfxVideoParam)); return MFXSts; } mfxTaskThreadingPolicy MFXVideoDECODEVC1::GetThreadingPolicy(void) { #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) if (MFX_HW_VAAPI == m_pCore->GetVAType()) { return MFX_TASK_THREADING_INTRA; } else #endif { return MFX_TASK_THREADING_DEFAULT; } } mfxStatus MFXVideoDECODEVC1::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { mfxStatus MFXSts = MFX_ERR_NONE; mfxVideoParam tpar; MFX_CHECK_NULL_PTR1(out); if (in) { tpar = *in; in = &tpar; if (!IsHWSupported(core, in)) MFXSts = MFX_ERR_UNSUPPORTED; } if (MFX_ERR_NONE == MFXSts) MFXSts = MFXVC1DecCommon::Query(core, in, out); MFX_CHECK(MFXSts < MFX_ERR_NONE, MFXSts); return MFXSts; } mfxStatus MFXVideoDECODEVC1::GetVideoParam(mfxVideoParam *par) { MFX_CHECK(m_bIsDecInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); mfxStatus MFXSts = MFX_ERR_NONE; par->mfx = m_par.mfx; par->Protected = m_par.Protected; par->IOPattern = m_par.IOPattern; par->AsyncDepth = m_par.AsyncDepth; mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { FillVideoSignalInfo(videoSignal); } mfxExtCodingOptionSPSPPS *pSPS = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (pSPS) { if (pSPS->SPSBufSize < m_RawSeq.size()) MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); std::copy(std::begin(m_RawSeq), std::end(m_RawSeq), pSPS->SPSBuffer); pSPS->SPSBufSize = (mfxU16)m_RawSeq.size(); } MFX_CHECK(MFXSts < MFX_ERR_NONE, MFXSts); return MFXSts; } mfxStatus MFXVideoDECODEVC1::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "MFXVideoDECODEVC1::DecodeFrameCheck"); mfxStatus MFXSts; MFX_CHECK(m_bIsDecInit, MFX_ERR_NOT_INITIALIZED); if (NeedToReturnCriticalStatus(bs)) return ReturningCriticalStatus(); if(m_par.mfx.CodecProfile == 0) { if(bs) { Close(); MFXSts = CheckBitstream(bs); MFX_CHECK_STS(MFXSts); if((*bs->Data)&&0xFF == 0xC5) m_par.mfx.CodecProfile = MFX_PROFILE_VC1_SIMPLE; else { //start code search uint8_t* ptr = bs->Data+ bs->DataOffset; uint32_t i = 0; while(((i < bs->DataLength) && (*(uint32_t*)ptr!= 0x0F010000))) { ptr++; i++; } if(*((uint32_t*)ptr)!= 0x0F010000) { bs->DataOffset = bs->DataLength; MFX_RETURN(MFX_ERR_MORE_DATA); } else { m_par.mfx.CodecProfile = MFX_PROFILE_VC1_ADVANCED; } } Init(&m_par); } else { MFX_RETURN(MFX_ERR_MORE_DATA); } } bool allow_null_work_surface = SupportsVPLFeatureSet(*m_pCore); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_disp); } else { MFX_CHECK_NULL_PTR2(surface_work, surface_disp); } // for EOS support if (bs) { MFXSts = CheckBitstream(bs); MFX_CHECK_STS(MFXSts); } // not enough descriptors in queue for the next frame if (!m_pVC1VideoDecoder->m_pStore->IsReadyDS() && m_bIsNeedToProcFrame) return MFX_WRN_DEVICE_BUSY; if (surface_work) { // Check input surface for data correctness MFXSts = CheckFrameInfo(&surface_work->Info); MFXSts = CheckFrameData(surface_work); MFX_CHECK_STS(MFXSts); } //out last frame if (!bs) { // remain bytes processing if advanced profile if (m_SaveBytesSize) { m_sbs.DataLength = m_SaveBytesSize; bs = &m_sbs; m_SaveBytesSize = 0; } else if (!m_bIsNeedToProcFrame) { // Range map processing return SelfDecodeFrame(surface_work, surface_disp, bs); } else { m_bTakeBufferedFrame = false; // Lets return buffered frames // Or set frame order in case of decoding order return ReturnLastFrame(surface_work, surface_disp); } } do { MFXSts = MFX_ERR_MORE_DATA; // construct frame functionality if (m_bIsNeedToProcFrame) { while ((bs->DataLength > 4 || (bs == &m_sbs && bs->DataLength) || (bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME && bs->DataLength) || (bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME && m_FrameConstrData.GetDataSize() && (bs->DataLength == 0))) && MFXSts == MFX_ERR_MORE_DATA) { if (m_bIsNeedToProcFrame) { if (bs->DataLength) { MFXSts = SelfConstructFrame(bs); if (MFX_WRN_IN_EXECUTION == MFXSts) { MFXSts = MFX_ERR_MORE_DATA; continue; } // we sure that bitstream contains full frame if ((bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME) && (MFX_ERR_MORE_DATA == MFXSts)) continue; MFX_CHECK_STS(MFXSts); } MFXSts = SelfDecodeFrame(surface_work, surface_disp, bs); } } if (bs == &m_sbs) { UMC::AutomaticUMCMutex guard(m_guard); bs = NULL; if (MFX_ERR_MORE_DATA == MFXSts) return ReturnLastFrame(surface_work, surface_disp); } } else // Range map processing MFXSts = SelfDecodeFrame(surface_work, surface_disp, bs); } while (!surface_work && MFXSts == MFX_ERR_MORE_SURFACE); // for model 3 we can alloc next frame inside decoder return MFXSts; } mfxStatus MFXVideoDECODEVC1::SelfConstructFrame(mfxBitstream *bs) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXVideoDECODEVC1::SelfConstructFrame"); mfxStatus MFXSts = MFX_ERR_NONE; Status IntUMCStatus = UMC_OK; if (0 == (m_par.mfx.FrameInfo.Width*m_par.mfx.FrameInfo.Height)) { MFXSts = MFXVC1DecCommon::ParseSeqHeader(bs, &m_par, 0, 0); MFX_CHECK_STS(MFXSts); MFXSts = Reset(&m_par); MFX_CHECK_STS(MFXSts); } mfxU32 ReadDataSize = (mfxU32)m_FrameConstrData.GetDataSize(); mfxU32 Offset = 0; if (MFX_PROFILE_VC1_ADVANCED != m_par.mfx.CodecProfile) { ConvertMfxBSToMediaDataForFconstr(bs); if ((*(bs->Data+3) == 0xC5)&& (!m_bIsInit)) // sequence header of simple/main profile { m_FrameSize = 4; uint8_t* ptemp = bs->Data + bs->DataOffset + 4; uint32_t temp_size = ((*(ptemp+3))<<24) + ((*(ptemp+2))<<16) + ((*(ptemp+1))<<8) + *(ptemp); m_FrameSize += temp_size; m_FrameSize +=12; ptemp = (uint8_t*)bs->Data + bs->DataOffset + m_FrameSize; temp_size = ((*(ptemp+3))<<24) + ((*(ptemp+2))<<16) + ((*(ptemp+1))<<8) + *(ptemp); m_FrameSize += temp_size; m_FrameSize +=4; m_bIsInit = true; m_RawSeq.resize(m_FrameSize); std::copy(bs->Data, bs->Data + m_FrameSize, std::begin(m_RawSeq)); } else { if (!m_FrameConstrData.GetDataSize()) // begin of the frame { uint8_t* pCur = bs->Data + bs->DataOffset; m_FrameSize = ((*(pCur+3))<<24) + ((*(pCur+2))<<16) + ((*(pCur+1))<<8) + *(pCur); m_FrameSize &= 0x0fffffff; m_FrameSize += 8; m_qBSTS.push_back(bs->TimeStamp); } } uint32_t dataSize = ((bs->DataLength) > (m_FrameSize - ReadDataSize))?(m_FrameSize - ReadDataSize):(bs->DataLength); uint32_t remainedBytes = (uint32_t)(m_FrameConstrData.GetBufferSize() - m_FrameConstrData.GetDataSize()); dataSize = (dataSize > remainedBytes) ? remainedBytes : dataSize; MFX_INTERNAL_CPY((uint8_t*)m_FrameConstrData.GetBufferPointer() + m_FrameConstrData.GetDataSize(), bs->Data + bs->DataOffset, dataSize); m_FrameConstrData.SetDataSize(m_FrameConstrData.GetDataSize() + dataSize); if (dataSize < (m_FrameSize - ReadDataSize)) { bs->DataLength -= dataSize; bs->DataOffset += dataSize; MFX_RETURN(MFX_ERR_MORE_DATA); } else { bs->DataLength -= (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize); bs->DataOffset += (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize); } return MFX_ERR_NONE; } else { ConvertMfxBSToMediaDataForFconstr(bs); IntUMCStatus = m_frame_constructor->GetNextFrame(m_FCInfo); if (FrameStartCodePresence()) m_qBSTS.push_back(bs->TimeStamp); m_SHSize = 0; if (IntUMCStatus == UMC::UMC_OK) { // Let continue if zero frame size // Possible when application gives zero data size in bs if (m_FrameConstrData.GetDataSize() == 0) { PrepareMediaIn(); return MFX_WRN_IN_EXECUTION; } // Checking for SH presence // If presence doesn't move bs pointers // Decision about pointers shifting after SH parsing { mfxU32 start_code = *((mfxU32*)(m_FrameConstrData.GetBufferPointer())); if (0x0F010000 == start_code) { m_SHSize = (mfxU32)m_FrameConstrData.GetDataSize() - ReadDataSize + Offset; if (m_SHSize) { m_RawSeq.resize(m_SHSize); std::copy(reinterpret_cast(m_FrameConstrData.GetBufferPointer()), reinterpret_cast(m_FrameConstrData.GetBufferPointer()) + m_SHSize, std::begin(m_RawSeq)); } return MFX_ERR_NONE; } } bs->DataLength -= (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize + Offset); bs->DataOffset += (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize + Offset); m_SaveBytesSize = 0; return MFX_ERR_NONE; } else { // Checking for SH presence // SH should be whole in bs { mfxU32 start_code = *((mfxU32*)(m_FrameConstrData.GetBufferPointer())); if ((0x0F010000 == start_code)&&(m_FrameConstrData.GetDataSize() > 3) && (bs->DataFlag != MFX_BITSTREAM_COMPLETE_FRAME)) { return (IntUMCStatus == UMC::UMC_ERR_NOT_ENOUGH_DATA)?MFX_ERR_MORE_DATA:MFX_ERR_NOT_ENOUGH_BUFFER; } } bs->DataLength -= (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize + Offset); bs->DataOffset += (mfxU32)(m_FrameConstrData.GetDataSize() - ReadDataSize + Offset); if (IntUMCStatus == UMC::UMC_ERR_NOT_ENOUGH_DATA) { if (bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME) { if (bs->DataLength <= 4) { std::copy(bs->Data + bs->DataOffset, bs->Data + bs->DataOffset + bs->DataLength, reinterpret_cast(m_FrameConstrData.GetBufferPointer()) + m_FrameConstrData.GetDataSize()); m_sbs.TimeStamp = bs->TimeStamp; } m_SaveBytesSize = 0; m_FrameConstrData.SetDataSize(m_FrameConstrData.GetDataSize() + bs->DataLength); bs->DataOffset = bs->DataOffset + bs->DataLength; ReadDataSize = bs->DataOffset; bs->DataLength = 0; } else { m_SaveBytesSize = bs->DataLength; MFX_CHECK(m_SaveBytesSize <= 4, MFX_ERR_UNDEFINED_BEHAVIOR); std::copy(bs->Data + bs->DataOffset, bs->Data + bs->DataOffset + m_SaveBytesSize, m_pSaveBytes); m_sbs.TimeStamp = bs->TimeStamp; } MFX_RETURN(MFX_ERR_MORE_DATA); } MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); } } } mfxStatus MFXVideoDECODEVC1::SelfDecodeFrame(mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp, mfxBitstream *bs) { mfxStatus MFXSts; Status IntUMCStatus; m_bTakeBufferedFrame = true; MFXSts = ConvertMfxPlaneToMediaData(surface_work); MFX_CHECK_STS(MFXSts); if (m_bIsNeedToProcFrame) { //time stamps processing if (m_qBSTS.size()) { m_FrameConstrData.SetTime(GetUmcTimeStamp(m_qBSTS.front())); } else { m_FrameConstrData.SetTime(-1.0); } IntUMCStatus = m_pVC1VideoDecoder->GetFrame(&m_FrameConstrData, &m_InternMediaDataOut); } else // mean that we need one more surface for range map { m_bIsNeedToProcFrame = true; // only set one more surface MFX_CHECK_UMC_STS(m_pVC1VideoDecoder->SetRMSurface()); PrepareMediaIn(); m_qMemID.push_back(m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar)); if (m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar) > -1) m_qSyncMemID.push_back(m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar)); UMC::FrameMemID memID = GetDispMemID(); m_SubmitFrame++; MFXSts = FillOutputSurface(surface_work, memID); MFX_CHECK_STS(MFXSts); if (m_qSyncMemID.size()) { memID = m_qSyncMemID.front(); m_qSyncMemID.pop_front(); } if (memID > -1) { MFXSts = GetOutputSurface(surface_disp, surface_work, memID); MFX_CHECK_STS(MFXSts); m_CurrentBufFrame++; } else { *surface_disp = 0; if (bs && bs->DataLength > 4) { MFX_RETURN(MFX_ERR_MORE_SURFACE); } else { MFX_RETURN(MFX_ERR_MORE_DATA); } } return IsDisplayFrameReady(surface_disp); } if (bs && (IntUMCStatus == UMC::UMC_ERR_NOT_ENOUGH_DATA)&& (m_InternMediaDataOut.GetFrameType() == NONE_PICTURE)) // SH, EH processing { PrepareMediaIn(); // moving pointers if SH // otherwise m_SHSize is 0 bs->DataLength -= m_SHSize; bs->DataOffset += m_SHSize; MFX_RETURN(MFX_ERR_MORE_DATA); } else if ((IntUMCStatus == UMC::UMC_OK)|| (IntUMCStatus == UMC::UMC_ERR_NOT_ENOUGH_DATA)) { // Updated parameters with weq header data if (0 == (m_par.mfx.FrameInfo.FrameRateExtD * m_par.mfx.FrameInfo.FrameRateExtN)) { // new frame rate parameters mfxU32 frCode; m_par.mfx.FrameInfo.FrameRateExtD = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRAMERATEDR; m_par.mfx.FrameInfo.FrameRateExtN = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRAMERATENR; frCode = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRMRTQ_POSTPROC; // special case if (7 == m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRMRTQ_POSTPROC && (m_par.mfx.FrameInfo.FrameRateExtN > 7 || m_par.mfx.FrameInfo.FrameRateExtD > 2)) { m_par.mfx.FrameInfo.FrameRateExtD = 1; m_par.mfx.FrameInfo.FrameRateExtN = 30; } else { MapFrameRateIntoMfx(m_par.mfx.FrameInfo.FrameRateExtN, m_par.mfx.FrameInfo.FrameRateExtD, (mfxU16)frCode); } } if (!m_par.mfx.FrameInfo.AspectRatioH) { // new aspect ratio parameters if (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioH) m_par.mfx.FrameInfo.AspectRatioH = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioH; } if (!m_par.mfx.FrameInfo.AspectRatioW) { // new aspect ratio parameters if (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioW) m_par.mfx.FrameInfo.AspectRatioW = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioW; } if ((m_InternMediaDataOut.GetFrameType() != NONE_PICTURE)) // non SH { VC1TSDescriptor td; MFX_CHECK(!m_qBSTS.empty(), MFX_ERR_UNDEFINED_BEHAVIOR); if (m_qBSTS.front() == MFX_TIME_STAMP_INVALID) { td.pts = GetMfxTimeStamp(m_InternMediaDataOut.GetTime()); td.isOriginal = false; } else { td.pts = m_qBSTS.front(); td.isOriginal = true; } m_qBSTS.pop_front(); m_qTS.push_back(td); #ifdef VC1_SKIPPED_ENABLE // if we faced with skipped frame - let coping it if (m_pVC1VideoDecoder->IsLastFrameSkipped() && m_bIsSamePolar) { MFXSts = ProcessSkippedFrame(); MFX_CHECK_STS(MFXSts); } #endif } if (((m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG)|| (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG)|| (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.RANGERED))&& (!m_pVC1VideoDecoder->IsLastFrameSkipped())) // skipped picture { m_bIsNeedToProcFrame = false; MFX_RETURN(MFX_ERR_MORE_SURFACE); } m_SubmitFrame++; PrepareMediaIn(); // working with external frames m_qMemID.push_back(m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar)); if (m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar) > -1) m_qSyncMemID.push_back(m_pVC1VideoDecoder->GetDisplayIndex(m_bIsDecodeOrder, m_bIsSamePolar)); UMC::FrameMemID memID = GetDispMemID(); // if decode order return surface immediately if (m_bIsDecodeOrder) IntUMCStatus = UMC::UMC_OK; if ((IntUMCStatus == UMC::UMC_OK) && m_qSyncMemID.size()) { memID = m_qSyncMemID.front(); m_qSyncMemID.pop_front(); } MFXSts = FillOutputSurface(surface_work, memID); MFX_CHECK_STS(MFXSts); if ((memID > -1) &&(IntUMCStatus == UMC::UMC_OK)) { MFXSts = GetOutputSurface(surface_disp, surface_work, memID); MFX_CHECK_STS(MFXSts); m_CurrentBufFrame++; } else { *surface_disp = 0; } if (IntUMCStatus == UMC::UMC_OK && *surface_disp) { return IsDisplayFrameReady(surface_disp); } else { if (bs && bs->DataLength > 4) { MFX_RETURN(MFX_ERR_MORE_SURFACE); } else { MFX_RETURN(MFX_ERR_MORE_DATA); } } } else if (bs && IntUMCStatus == UMC::UMC_NTF_NEW_RESOLUTION) // SH with valid params { // new frame rate parameters mfxU32 frCode; m_par.mfx.FrameInfo.FrameRateExtD = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRAMERATEDR; m_par.mfx.FrameInfo.FrameRateExtN = m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRAMERATENR; frCode = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRMRTQ_POSTPROC; // special case if (7 == m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.FRMRTQ_POSTPROC && (m_par.mfx.FrameInfo.FrameRateExtN > 7 || m_par.mfx.FrameInfo.FrameRateExtD > 2)) { m_par.mfx.FrameInfo.FrameRateExtD = 1; m_par.mfx.FrameInfo.FrameRateExtN = 30; } else { MapFrameRateIntoMfx(m_par.mfx.FrameInfo.FrameRateExtN, m_par.mfx.FrameInfo.FrameRateExtD, (mfxU16)frCode); } // new aspect ratio parameters if (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioH) m_par.mfx.FrameInfo.AspectRatioH = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioH; if (m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioW) m_par.mfx.FrameInfo.AspectRatioW = (mfxU16)m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.AspectRatioW; bs->DataLength -= m_SHSize; bs->DataOffset += m_SHSize; //new crop parameters m_par.mfx.FrameInfo.CropW = (mfxU16)(2*(m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.CODED_WIDTH+1)); m_par.mfx.FrameInfo.CropH = (mfxU16)(2*(m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.CODED_HEIGHT+1)); return MFX_WRN_VIDEO_PARAM_CHANGED; } MFX_CHECK(IntUMCStatus != UMC::UMC_ERR_INVALID_PARAMS, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(IntUMCStatus != UMC::UMC_ERR_LOCK, MFX_ERR_LOCK_MEMORY); MFX_CHECK(IntUMCStatus != UMC::UMC_ERR_UNSUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK(IntUMCStatus != UMC::UMC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::ReturnLastFrame(mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_disp) { m_bTakeBufferedFrame = false; // Need to think about HW if (m_DisplayList.size() && m_bIsBuffering) { std::vector::iterator it = m_DisplayList.begin(); *surface_disp = *it; mfxStatus MFXSts = m_pCore->DecreaseReference(&(*surface_disp)->Data); MFX_CHECK_STS(MFXSts); m_DisplayList.erase(it); return MFX_ERR_NONE; } if (m_bIsDecodeOrder) { SetFrameOrder(m_surface_source.get(), &m_par, true, m_qTS.front(), m_bIsSamePolar); MFX_RETURN(MFX_ERR_MORE_DATA); } m_pVC1VideoDecoder->m_pStore->SeLastFramesMode(); FrameMemID memID = m_pVC1VideoDecoder->GetLastDisplayIndex(); m_qMemID.push_back(memID); m_qSyncMemID.push_back(memID); memID = m_qMemID.front(); if (memID > -1) { memID = m_qSyncMemID.front(); m_qSyncMemID.pop_front(); } if (memID > -1) { mfxU16 Corrupted = 0; mfxStatus MFXSts = GetOutputSurface(surface_disp, surface_work, memID); MFX_CHECK_STS(MFXSts); m_pVC1VideoDecoder->SetCorrupted(NULL, Corrupted); (*surface_disp)->Data.Corrupted = Corrupted; return MFX_ERR_NONE; } else { *surface_disp = 0; memID = m_qMemID.back(); switch (memID) { case -1: case -2: MFX_RETURN(MFX_ERR_MORE_DATA); default: // only one frame in stream | reset + decodeframeasync + drain with zero bitstream // memID may be arbitrary in case of external allocator mfxU16 Corrupted = 0; mfxStatus MFXSts; m_qSyncMemID.pop_back(); MFXSts = GetOutputSurface(surface_disp, surface_work, memID); MFX_CHECK_STS(MFXSts); m_pVC1VideoDecoder->SetCorrupted(NULL, Corrupted); (*surface_disp)->Data.Corrupted = Corrupted; return MFX_ERR_NONE; } } } void MFXVideoDECODEVC1::PrepareMediaIn(void) { m_FrameConstrData.SetBufferPointer(m_pReadBuffer, m_BufSize); m_FrameConstrData.SetDataSize(0); m_pStCodes->count = 0; m_bPTSTaken = false; } mfxStatus MFXVideoDECODEVC1::PostProcessFrameHW(mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_disp) { mfxStatus sts = MFX_ERR_NONE; FrameMemID memID; FrameMemID memIDdisp = -1; bool isSkip = false; mfxFrameSurface1 *surface_out; mfxU16 Corrupted = 0; if (m_DisplayListAsync.size() && m_bIsBuffering) { surface_out = m_DisplayListAsync.front(); } else surface_out = surface_disp; memIDdisp = m_qMemID.front(); m_qMemID.pop_front(); memID = m_pVC1VideoDecoder->ProcessQueuesForNextFrame(isSkip, Corrupted); if (isSkip) // calculate buffered skip frames { m_ProcessedFrames++; } if ((memID > -1) && !m_bIsSWD3D) { MFX_CHECK_NULL_PTR1(surface_work); sts = m_surface_source->PrepareToOutput(surface_work, memID, &m_par); MFX_CHECK_STS(sts); } if (-1 == memIDdisp) MFX_RETURN(MFX_ERR_MORE_DATA); if (m_bIsSWD3D && memIDdisp > -1) { if (!(m_bIsDecodeOrder && isSkip)) sts = m_surface_source->PrepareToOutput(surface_out, memIDdisp, &m_par); MFX_CHECK_STS(sts); } m_pVC1VideoDecoder->UnlockSurfaces(); if (m_bTakeBufferedFrame && memID > -1) surface_out->Data.Corrupted = Corrupted; if (m_DisplayListAsync.size()) { std::vector::iterator it = m_DisplayListAsync.begin(); m_DisplayListAsync.erase(it); if (m_BufOffset > 0) m_BufOffset--; } return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::GetUserData(mfxU8 *ud, mfxU32 *sz, mfxU64 *ts) { mfxStatus MFXSts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR3(ud, sz, ts); return MFXSts; } mfxStatus MFXVideoDECODEVC1::DecodeHeader(VideoCORE *, mfxBitstream *bs, mfxVideoParam *par) { MFX_CHECK_NULL_PTR2(bs, par); mfxStatus MFXSts = CheckBitstream(bs); MFX_CHECK_STS(MFXSts); mfxExtVideoSignalInfo *pVideoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); mfxExtCodingOptionSPSPPS *pSPS = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); mfxVideoParam temp; MFXSts = MFXVC1DecCommon::ParseSeqHeader(bs, &temp, pVideoSignal, pSPS); if(MFXSts == MFX_ERR_NOT_INITIALIZED) MFX_RETURN(MFX_ERR_MORE_DATA); if((MFXSts == MFX_ERR_MORE_DATA) && (bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME || bs->DataFlag & MFX_BITSTREAM_EOS)) MFXSts = MFX_ERR_NONE; MFX_CHECK_STS(MFXSts); par->mfx.FrameInfo = temp.mfx.FrameInfo; par->mfx.CodecProfile = temp.mfx.CodecProfile; par->mfx.CodecLevel = temp.mfx.CodecLevel; return MFXSts; } mfxStatus MFXVideoDECODEVC1::SetSkipMode(mfxSkipMode mode) { MFX_CHECK(m_bIsDecInit, MFX_ERR_NOT_INITIALIZED); Status umc_sts = UMC_OK; int32_t speed_shift; switch(mode) { case MFX_SKIPMODE_NOSKIP: speed_shift = -10; break; case MFX_SKIPMODE_MORE: speed_shift = 1; break; case MFX_SKIPMODE_LESS: speed_shift = -1; break; default: { MFX_RETURN(MFX_ERR_INVALID_HANDLE); } } umc_sts = m_pVC1VideoDecoder->ChangeVideoDecodingSpeed(speed_shift); if (UMC_OK != umc_sts) { return MFX_WRN_VALUE_NOT_CHANGED; } else { return MFX_ERR_NONE; } } mfxStatus MFXVideoDECODEVC1::GetPayload( mfxU64 *ts, mfxPayload *payload ) { MFX_CHECK_NULL_PTR2(ts, payload); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::ConvertMfxToCodecParams(mfxVideoParam *par) { mfxStatus MFXSts = MFX_ERR_NONE; UMC::VideoDecoderParams *init = DynamicCast(m_VideoParams); //Should be always if (init) { m_pCore->GetVA((mfxHDL*)&init->pVideoAccelerator, MFX_MEMTYPE_FROM_DECODE); init->info.clip_info.height = par->mfx.FrameInfo.Height; init->info.clip_info.width = par->mfx.FrameInfo.Width; init->numThreads = (0 != par->mfx.NumThread)?par->mfx.NumThread:m_pCore->GetNumWorkingThreads(); init->numThreads += disp_queue_size; if (!par->mfx.DecodedOrder) init->lFlags |= UMC::FLAG_VDEC_REORDER; if (MFX_TIMESTAMPCALC_TELECINE == par->mfx.TimeStampCalc) init->lFlags |= UMC::FLAG_VDEC_TELECINE_PTS; init->info.framerate = CalculateUMCFramerate( par->mfx.FrameInfo.FrameRateExtN, par->mfx.FrameInfo.FrameRateExtD); init->info.aspect_ratio_width = par->mfx.FrameInfo.AspectRatioW; init->info.aspect_ratio_height = par->mfx.FrameInfo.AspectRatioH; // new constructor possible if (m_frame_constructor) { delete m_frame_constructor; m_frame_constructor = 0; } if (MFX_PROFILE_VC1_ADVANCED == par->mfx.CodecProfile) { init->info.stream_subtype = UMC::VC1_VIDEO_VC1; init->info.stream_type = UMC::VC1_VIDEO; m_frame_constructor = new UMC::vc1_frame_constructor_vc1; } else if ((MFX_PROFILE_VC1_MAIN == par->mfx.CodecProfile)|| (MFX_PROFILE_VC1_SIMPLE == par->mfx.CodecProfile)) { init->info.stream_subtype = UMC::VC1_VIDEO_RCV; m_frame_constructor = new UMC::vc1_frame_constructor_rcv; } if (par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) init->info.interlace_type = UMC::INTERLEAVED_TOP_FIELD_FIRST; else init->info.interlace_type = UMC::PROGRESSIVE; } return MFXSts; } mfxStatus MFXVideoDECODEVC1::ConvertMfxBSToMediaDataForFconstr(mfxBitstream *pBitstream) { mfxStatus MFXSts = MFX_ERR_NONE; m_pInternMediaDataIn->SetBufferPointer(pBitstream->Data + pBitstream->DataOffset,pBitstream->DataLength); // splitter works m_pInternMediaDataIn->SetDataSize(0); return MFXSts; } mfxStatus MFXVideoDECODEVC1::ConvertMfxPlaneToMediaData(mfxFrameSurface1 *surface) { mfxStatus MFXSts = MFX_ERR_NONE; mfxFrameSurface1 *pNativeSurface = surface; MFXSts = m_surface_source->SetCurrentMFXSurface(pNativeSurface); MFX_CHECK_STS(MFXSts); m_InternMediaDataOut.Init(m_par.mfx.FrameInfo.Width, m_par.mfx.FrameInfo.Height, 3); return MFXSts; } mfxStatus MFXVideoDECODEVC1::QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { mfxStatus sts = SetAllocRequestExternal(core, par, request); MFX_CHECK_STS(sts); auto const supportedMemoryType = (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK( !(par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || !(par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY), MFX_ERR_INVALID_VIDEO_PARAM); if (!IsHWSupported(core, par)) { sts = MFX_ERR_UNSUPPORTED; } return sts; } mfxStatus MFXVideoDECODEVC1::SetAllocRequestInternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR2(par, request); MFX_CHECK(par->IOPattern, MFX_ERR_INVALID_VIDEO_PARAM); par->mfx.FrameInfo.CropX = 0; par->mfx.FrameInfo.CropY = 0; request->Info = par->mfx.FrameInfo; request->Info.FourCC = MFX_FOURCC_NV12; MFX_CHECK(MFX_PLATFORM_HARDWARE == core->GetPlatformType() && IsHWSupported(core, par), MFX_ERR_UNSUPPORTED); if (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) // external Sys memory, hw platform { CalculateFramesNumber(request, par, IsBufferMode(core, par)); request->Type = MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE; return MFX_ERR_NONE; } if (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) // no need to real alloc but have to request surface for video acceler { CalculateFramesNumber(request, par, IsBufferMode(core, par)); bool IsD3D9SimWithVideoMem = IsD3D9Simulation(*core) && (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); request->Type = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE; request->Type |= IsD3D9SimWithVideoMem ? MFX_MEMTYPE_INTERNAL_FRAME : MFX_MEMTYPE_EXTERNAL_FRAME; return MFX_ERR_NONE; } return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::SetAllocRequestExternal(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR2(par, request); MFX_CHECK(par->IOPattern, MFX_ERR_INVALID_VIDEO_PARAM); par->mfx.FrameInfo.CropX = 0; par->mfx.FrameInfo.CropY = 0; request->Info = par->mfx.FrameInfo; request->Info.FourCC = MFX_FOURCC_NV12; MFX_CHECK(MFX_PLATFORM_HARDWARE == core->GetPlatformType() && IsHWSupported(core, par), MFX_ERR_UNSUPPORTED); if (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) { request->NumFrameSuggested = request->NumFrameMin = (par->AsyncDepth > 0)?2*par->AsyncDepth:2*MFX_AUTO_ASYNC_DEPTH_VALUE; request->Type = MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_FROM_DECODE; } else if (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { bool isD3D9On11VideoMem = IsD3D9Simulation(*core) && (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (isD3D9On11VideoMem) request->NumFrameSuggested = request->NumFrameMin = (par->AsyncDepth > 0) ? 2 * par->AsyncDepth : 2 * MFX_AUTO_ASYNC_DEPTH_VALUE; else CalculateFramesNumber(request, par, IsBufferMode(core, par)); request->Type = MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE; } return MFX_ERR_NONE; } void MFXVideoDECODEVC1::CalculateFramesNumber(mfxFrameAllocRequest *request, mfxVideoParam *par, bool isBufMode) { mfxU16 NumAddSurfaces = isBufMode?disp_queue_size:0; request->NumFrameMin = 2*(VC1VideoDecoder::NumBufferedFrames + VC1VideoDecoder::NumReferenceFrames) + NumAddSurfaces; // 2 - from range mapping needs request->NumFrameMin += 2*(par->AsyncDepth ?par->AsyncDepth : MFX_AUTO_ASYNC_DEPTH_VALUE); request->NumFrameSuggested = request->NumFrameMin; } mfxStatus MFXVideoDECODEVC1::CheckFrameInfo(mfxFrameInfo *info) { MFX_CHECK(info->Width <= m_Initpar.mfx.FrameInfo.Width, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(info->Height <= m_Initpar.mfx.FrameInfo.Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::CheckInput(mfxVideoParam *in) { MFX_CHECK(in->mfx.FrameInfo.Width % 16 == 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->mfx.FrameInfo.Height % 16 == 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->IOPattern, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV420, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::CheckForCriticalChanges(mfxVideoParam *in) { mfxStatus sts = CheckFrameInfo(&in->mfx.FrameInfo); MFX_CHECK_STS(sts); auto const mask = MFX_IOPATTERN_OUT_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; if ( (in->IOPattern & mask) != (m_Initpar.IOPattern & mask)) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } MFX_CHECK(in->mfx.CodecProfile == m_Initpar.mfx.CodecProfile, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(in->AsyncDepth == m_Initpar.AsyncDepth, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(in->Protected == m_Initpar.Protected, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::GetDecodeStat(mfxDecodeStat *stat) { MFX_CHECK(m_bIsDecInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(stat); stat->NumCachedFrame = m_pVC1VideoDecoder->m_iMaxFramesInProcessing; stat->NumError = 0; stat->NumSkippedFrame = 0; mfxU32 NumShiftFrames = (1 == m_pVC1VideoDecoder->m_iThreadDecoderNum) ? 1 : m_pVC1VideoDecoder->m_iThreadDecoderNum - 1; stat->NumFrame = (mfxU32)((m_pVC1VideoDecoder->m_lFrameCount > m_pVC1VideoDecoder->m_iMaxFramesInProcessing) ? (m_pVC1VideoDecoder->m_lFrameCount - NumShiftFrames) : m_pVC1VideoDecoder->m_lFrameCount); return MFX_ERR_NONE; } FrameMemID MFXVideoDECODEVC1::GetDispMemID() { return m_qMemID.front(); } bool MFXVideoDECODEVC1::IsHWSupported(VideoCORE *pCore, mfxVideoParam *par) { if (MFX_PLATFORM_SOFTWARE != pCore->GetPlatformType()) { if (MFX_ERR_NONE != pCore->IsGuidSupported(sDXVA2_Intel_ModeVC1_D_Super, par)) return false; } return true; } void MFXVideoDECODEVC1::FillMFXDataOutputSurface(mfxFrameSurface1 *surface) { if (!m_qTS.front().isOriginal) { m_qTS.front().pts += m_ext_dur; } if (m_bIsDecodeOrder) { surface->Data.FrameOrder = 0xFFFFFFFF; SetFrameOrder(m_surface_source.get(), &m_par, false, m_qTS.front(), m_bIsSamePolar); if (m_pVC1VideoDecoder->m_frameOrder > 0) m_qTS.pop_front(); } else { surface->Data.FrameOrder = m_pVC1VideoDecoder->m_frameOrder++; surface->Data.TimeStamp = m_qTS.front().pts; surface->Data.DataFlag = (mfxU16)(m_qTS.front().isOriginal ? MFX_FRAMEDATA_ORIGINAL_TIMESTAMP : 0); m_qTS.pop_front(); } if ((surface->Info.PicStruct & MFX_PICSTRUCT_FIELD_REPEATED) && m_par.mfx.TimeStampCalc) { m_ext_dur += GetMfxTimeStamp((mfxF64)0.5*surface->Info.FrameRateExtD/surface->Info.FrameRateExtN); } } mfxStatus MFXVideoDECODEVC1::FillOutputSurface(mfxFrameSurface1 *surface, UMC::FrameMemID memID) { mfxStatus sts = MFX_ERR_NONE; // filling data of internal surface mfxFrameSurface1 *int_surface = m_surface_source->GetSurfaceByIndex(m_pVC1VideoDecoder->GetDisplayIndex(true, false)); if (int_surface) sts = FillOutputSurface(int_surface); else { MFX_CHECK_NULL_PTR1(surface); return FillOutputSurface(surface); } if (memID >= 0) { int_surface = m_surface_source->GetSurfaceByIndex(memID); if (int_surface && surface) surface->Info = int_surface->Info; } MFX_CHECK_STS(sts); return sts; } mfxStatus MFXVideoDECODEVC1::FillOutputSurface(mfxFrameSurface1 *surface) { surface->Info.CropX = 0; surface->Info.CropY = 0; surface->Info.CropW = (mfxU16)(2*(m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.CODED_WIDTH+1)); surface->Info.CropH = (mfxU16)(2*(m_pVC1VideoDecoder->m_pContext->m_seqLayerHeader.CODED_HEIGHT+1)); surface->Info.AspectRatioH = m_par.mfx.FrameInfo.AspectRatioH; surface->Info.AspectRatioW = m_par.mfx.FrameInfo.AspectRatioW; if (0 == surface->Info.AspectRatioH) { surface->Info.AspectRatioH = 1; } if (0 == surface->Info.AspectRatioW) { surface->Info.AspectRatioW = 1; } surface->Info.FrameRateExtD = m_par.mfx.FrameInfo.FrameRateExtD; surface->Info.FrameRateExtN = m_par.mfx.FrameInfo.FrameRateExtN; if (m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->FCM == VC1_Progressive) { surface->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (m_par.mfx.ExtendedPicStruct) { // Define repeat frames according to spec Annex I if (0x1 == m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->RPTFRM) surface->Info.PicStruct |= MFX_PICSTRUCT_FRAME_DOUBLING; else if (0x2 == m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->RPTFRM) surface->Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING; } } else { // Define display fields ordering according to spec Annex I if (m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_seqLayerHeader.PULLDOWN) { if (m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->TFF) surface->Info.PicStruct = MFX_PICSTRUCT_FIELD_TFF; else surface->Info.PicStruct = MFX_PICSTRUCT_FIELD_BFF; } else surface->Info.PicStruct = MFX_PICSTRUCT_FIELD_TFF; if (m_par.mfx.ExtendedPicStruct) { if (m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->FCM == VC1_FrameInterlace) surface->Info.PicStruct |= MFX_PICSTRUCT_PROGRESSIVE; if (m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->RFF) surface->Info.PicStruct |= MFX_PICSTRUCT_FIELD_REPEATED; } } SetFrameType(m_pVC1VideoDecoder->m_pStore->GetLastDS()->m_pContext->m_picLayerHeader->PTYPE, *surface); return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::GetOutputSurface(mfxFrameSurface1 **surface_out, mfxFrameSurface1 *surface_work, UMC::FrameMemID index) { mfxFrameSurface1 *pNativeSurface = m_surface_source->GetSurface(index, surface_work, &m_par); MFX_CHECK(pNativeSurface, MFX_ERR_UNDEFINED_BEHAVIOR); *surface_out = pNativeSurface; return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::IsDisplayFrameReady(mfxFrameSurface1 **surface_disp) { mfxStatus MFXSts; if ((m_CurrentBufFrame <= disp_queue_size) && m_bIsBuffering) { m_bTakeBufferedFrame = false; if (m_bIsDecodeOrder) { SetFrameOrder(m_surface_source.get(), &m_par, false, m_qTS.front(), m_bIsSamePolar); if (m_pVC1VideoDecoder->m_frameOrder > 0) m_qTS.pop_front(); } m_DisplayList.push_back(*surface_disp); m_DisplayListAsync.push_back(*surface_disp); MFXSts = m_pCore->IncreaseReference(&(*surface_disp)->Data); MFX_CHECK_STS(MFXSts); MFX_RETURN(MFX_ERR_MORE_SURFACE); } else { MFXSts = m_pCore->IncreaseReference(&((*surface_disp)->Data)); MFX_CHECK_STS(MFXSts); if (m_bTakeBufferedFrame) { m_DisplayList.push_back(*surface_disp); m_DisplayListAsync.push_back(*surface_disp); } if (m_bIsBuffering) { *surface_disp = m_DisplayList[m_BufOffset++]; } else *surface_disp = m_DisplayList.back(); { std::vector::iterator it = m_DisplayList.begin(); m_DisplayList.erase(it); if (m_BufOffset > 0) m_BufOffset--; } MFXSts = m_pCore->DecreaseReference(&((*surface_disp)->Data)); MFX_CHECK_STS(MFXSts); return MFX_ERR_NONE; } } bool MFXVideoDECODEVC1::IsBufferMode(VideoCORE *pCore, mfxVideoParam *par) { (void)pCore; (void)par; if ((IsHWSupported(pCore, par) && (MFX_PLATFORM_HARDWARE == pCore->GetPlatformType())&& (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)&& !par->mfx.DecodedOrder && 1 != par->AsyncDepth)) return true; else return false; } mfxStatus MFXVideoDECODEVC1::RunThread(mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_disp, mfxU32 threadNumber, mfxU32 taskID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "MFXVideoDECODEVC1::RunThread"); (void)threadNumber; mfxStatus sts; { if (IsStatusReportEnable()) { sts = MFX_ERR_NONE; // we dont need to wait status for skipped frames // we just output such frames twice if (!m_pVC1VideoDecoder->IsFrameSkipped() && m_SubmitFrame > m_ProcessedFrames) // processed and submit surface managment { sts = GetStatusReport(); } MFX_CHECK_STS(sts); if (MFX_TASK_BUSY == sts) return sts; } UMC::AutomaticUMCMutex guard(m_guard); // for HW only sequence processing if (m_WaitedTask != taskID) return MFX_TASK_NEED_CONTINUE; sts = PostProcessFrameHW(surface_work, surface_disp); if (MFX_ERR_NONE == sts) { m_WaitedTask++; return MFX_TASK_DONE; } else if (MFX_ERR_MORE_DATA == sts) return MFX_TASK_NEED_CONTINUE; else { MFX_RETURN(sts); } } } static mfxStatus VC1CompleteProc(void *, void *pParam, mfxStatus ) { delete (MFXVideoDECODEVC1::AsyncSurface *)pParam; return MFX_ERR_NONE; } mfxStatus MFXVideoDECODEVC1::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) { UMC::AutomaticUMCMutex guard(m_guard); // To be checked mfxStatus mfxSts = DecodeFrameCheck(bs, surface_work, surface_out); if (MFX_ERR_NONE == mfxSts || (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxSts) // It can be useful to run threads right after first frame receive { AsyncSurface *pAsyncSurface = new AsyncSurface; pAsyncSurface->surface_work = surface_work; pAsyncSurface->surface_out = *surface_out; pAsyncSurface->taskID = m_CurrentTask++; pAsyncSurface->isFrameSkipped = false; pEntryPoint->pRoutine = &VC1DECODERoutine; pEntryPoint->pCompleteProc = &VC1CompleteProc; pEntryPoint->pState = this; #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) if (MFX_HW_VAAPI == m_pCore->GetVAType()) pEntryPoint->requiredNumThreads = 1; else #endif pEntryPoint->requiredNumThreads = m_par.mfx.NumThread; pEntryPoint->pParam = pAsyncSurface; pEntryPoint->pRoutineName = (char *)"DecodeVC1"; if (MFX_ERR_NONE == mfxSts && (m_InternMediaDataOut.GetFrameType() != NONE_PICTURE)) { FillMFXDataOutputSurface(*surface_out); } } return mfxSts; } mfxStatus MFXVideoDECODEVC1::ProcessSkippedFrame() { mfxStatus sts = MFX_ERR_NONE; mfxU16 MemType; mfxFrameSurface1 *origSurface; mfxFrameSurface1 *surface_out; mfxFrameSurface1 tSurface; MemType = MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_EXTERNAL_FRAME; FrameMemID origMemID = m_pVC1VideoDecoder->GetSkippedIndex(); FrameMemID displayMemID = m_pVC1VideoDecoder->GetSkippedIndex(false); if (origMemID > -1) { origSurface = m_surface_source->GetSurface(origMemID, &tSurface, &m_par); } else return sts; if (displayMemID > -1) { surface_out = m_surface_source->GetSurface(displayMemID, &tSurface, &m_par); } else return sts; sts = m_pCore->DoFastCopyWrapper(surface_out, MemType, origSurface, MemType); return sts; } mfxStatus MFXVideoDECODEVC1::GetStatusReport() { #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) VideoAccelerator *va; m_pCore->GetVA((mfxHDL*)&va, MFX_MEMTYPE_FROM_DECODE); UMC::VC1FrameDescriptor *pCurrDescriptor = m_pVC1VideoDecoder->m_pStore->GetFirstDS(); if (pCurrDescriptor) { Status sts = va->SyncTask(pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex); if (sts != UMC::UMC_OK) { mfxStatus CriticalErrorStatus = (sts == UMC::UMC_ERR_GPU_HANG) ? MFX_ERR_GPU_HANG : MFX_ERR_DEVICE_FAILED; SetCriticalErrorOccured(CriticalErrorStatus); return CriticalErrorStatus; } } #else VideoAccelerator *va; m_pCore->GetVA((mfxHDL*)&va, MFX_MEMTYPE_FROM_DECODE); Status sts = UMC_OK; VASurfaceStatus surfSts = VASurfaceSkipped; UMC::VC1FrameDescriptor *pCurrDescriptor = m_pVC1VideoDecoder->m_pStore->GetFirstDS(); if (pCurrDescriptor) { VAStatus surfErr = VA_STATUS_SUCCESS; sts = va->QueryTaskStatus(pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex, &surfSts, &surfErr); MFX_CHECK(sts != UMC_ERR_GPU_HANG, MFX_ERR_GPU_HANG); MFX_CHECK(sts == UMC_OK, MFX_ERR_DEVICE_FAILED); } #endif //#if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) return MFX_ERR_NONE; } bool MFXVideoDECODEVC1::IsStatusReportEnable() { return m_bStsReport; } bool MFXVideoDECODEVC1::FrameStartCodePresence() { if (m_FCInfo.stCodes->values[0] == 0x0D010000 && !m_bPTSTaken) { m_bPTSTaken = true; return true; } return false; } mfxStatus MFXVideoDECODEVC1::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } mfxStatus __CDECL VC1DECODERoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 ) { volatile mfxStatus TaskSts; MFXVideoDECODEVC1 *pMFXVC1Decoder = (MFXVideoDECODEVC1 *)pState; MFXVideoDECODEVC1::AsyncSurface *pAsyncSurface = (MFXVideoDECODEVC1::AsyncSurface *)pParam; TaskSts = pMFXVC1Decoder->RunThread(pAsyncSurface->surface_work, pAsyncSurface->surface_out, threadNumber, pAsyncSurface->taskID); return TaskSts; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/000077500000000000000000000000001443134507600243155ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/include/000077500000000000000000000000001443134507600257405ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/include/mfx_vp8_dec_decode_common.h000066400000000000000000000034141443134507600331700ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP8_DEC_DECODE_COMMON_H_ #define _MFX_VP8_DEC_DECODE_COMMON_H_ #include "mfx_common.h" namespace VP8DecodeCommon { mfxStatus DecodeHeader(VideoCORE *p_core, mfxBitstream *p_bs, mfxVideoParam *p_params); typedef struct _IVF_FRAME { uint32_t frame_size; unsigned long long time_stamp; uint8_t *p_frame_data; } IVF_FRAME; } class MFX_VP8_Utility { public: static eMFXPlatform GetPlatform(VideoCORE *pCore, mfxVideoParam *pPar); static mfxStatus Query(VideoCORE *pCore, mfxVideoParam *pIn, mfxVideoParam *pOut, eMFXHWType type); private: static bool IsNeedPartialAcceleration(mfxVideoParam * pPar); }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/include/mfx_vp8_dec_decode_hw.h000066400000000000000000000202211443134507600323110ustar00rootroot00000000000000// Copyright (c) 2014-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP8_DECODE_HW_H_ #define _MFX_VP8_DECODE_HW_H_ #include "mfx_common.h" #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) #include "mfx_common_int.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_critical_error_handler.h" #include "umc_frame_data.h" #include "umc_media_data.h" #include "umc_va_base.h" #include "mfx_task.h" #include "umc_mutex.h" #include "mfx_vp8_dec_decode_vp8_defs.h" #include "mfx_vp8_dec_decode_common.h" class MFX_VP8_BoolDecoder { private: uint32_t m_range; uint32_t m_value; int32_t m_bitcount; uint32_t m_pos; uint8_t *m_input; int32_t m_input_size; static const int range_normalization_shift[64]; int decode_bit(int probability) { uint32_t bit = 0; uint32_t split; uint32_t bigsplit; uint32_t count = this->m_bitcount; uint32_t range = this->m_range; uint32_t value = this->m_value; split = 1 + (((range - 1) * probability) >> 8); bigsplit = (split << 24); range = split; if(value >= bigsplit) { range = this->m_range - split; value = value - bigsplit; bit = 1; } if(range >= 0x80) { this->m_value = value; this->m_range = range; return bit; } else { do { range += range; value += value; if (!--count) { count = 8; value |= static_cast(this->m_input[this->m_pos]); this->m_pos++; } } while(range < 0x80); } this->m_bitcount = count; this->m_value = value; this->m_range = range; return bit; } public: MFX_VP8_BoolDecoder() : m_range(0), m_value(0), m_bitcount(0), m_pos(0), m_input(0), m_input_size(0) {} MFX_VP8_BoolDecoder(uint8_t *pBitStream, int32_t dataSize) { init(pBitStream, dataSize); } void init(uint8_t *pBitStream, int32_t dataSize) { m_range = 255; m_bitcount = 8; m_pos = 0; m_value = (pBitStream[0] << 24) + (pBitStream[1] << 16) + (pBitStream[2] << 8) + pBitStream[3]; m_pos += 4; m_input = pBitStream; m_input_size = dataSize; } uint32_t decode(int bits = 1, int prob = 128) { uint32_t z = 0; int bit; if (m_pos >= (uint32_t)m_input_size) throw vp8_exception(MFX_ERR_MORE_DATA); for (bit = bits - 1; bit >= 0;bit--) { z |= (decode_bit(prob) << bit); } return z; } uint8_t * input() { return &m_input[m_pos]; } uint32_t pos() const { return m_pos; } int32_t bitcount() const { return m_bitcount; } uint32_t range() const { return m_range; } uint32_t value() const { return m_value; } }; class VideoDECODEVP8_HW : public VideoDECODE, public MfxCriticalErrorHandler { public: VideoDECODEVP8_HW(VideoCORE *pCore, mfxStatus *sts); ~VideoDECODEVP8_HW(); static mfxStatus Query(VideoCORE *pCore, mfxVideoParam *pIn, mfxVideoParam *pOut); static mfxStatus QueryIOSurf(VideoCORE *pCore, mfxVideoParam *pPar, mfxFrameAllocRequest *pRequest); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); virtual mfxStatus Init(mfxVideoParam *pPar) override; virtual mfxStatus Reset(mfxVideoParam *pPar) override; virtual mfxStatus Close() override; virtual mfxTaskThreadingPolicy GetThreadingPolicy() override; virtual mfxStatus GetVideoParam(mfxVideoParam *pPar) override; virtual mfxStatus GetDecodeStat(mfxDecodeStat *pStat) override; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out); virtual mfxStatus DecodeFrameCheck(mfxBitstream *pBs, mfxFrameSurface1 *pSurfaceWork, mfxFrameSurface1 **ppSurfaceOut, MFX_ENTRY_POINT *pEntryPoint) override; virtual mfxStatus DecodeFrame(mfxBitstream *pBs, mfxFrameSurface1 *pSurfaceWork, mfxFrameSurface1 *pSurfaceOut); virtual mfxStatus GetUserData(mfxU8 *pUserData, mfxU32 *pSize, mfxU64 *pTimeStamp); virtual mfxStatus GetPayload(mfxU64 *pTimeStamp, mfxPayload *pPayload) override; virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; private: mfxStatus GetOutputSurface(mfxFrameSurface1 **, mfxFrameSurface1 *, UMC::FrameMemID); mfxStatus ConstructFrame(mfxBitstream *, mfxBitstream *, VP8DecodeCommon::IVF_FRAME&); mfxStatus PreDecodeFrame(mfxBitstream *, mfxU32&, mfxU32&); mfxStatus DecodeFrameHeader(mfxBitstream *p_bistream); void UpdateSegmentation(MFX_VP8_BoolDecoder &); void UpdateLoopFilterDeltas(MFX_VP8_BoolDecoder &); void DecodeInitDequantization(MFX_VP8_BoolDecoder &); mfxStatus PackHeaders(mfxBitstream *p_bistream); static bool CheckHardwareSupport(VideoCORE *p_core, mfxVideoParam *p_par); UMC::FrameMemID GetMemIdToUnlock(); mfxStatus GetFrame(UMC::MediaData* in, UMC::FrameData** out); friend mfxStatus MFX_CDECL VP8DECODERoutine(void *p_state, void *pp_param, mfxU32 thread_number, mfxU32); struct VP8DECODERoutineData { VideoDECODEVP8_HW* decoder; mfxFrameSurface1* surface_work; UMC::FrameMemID memId; }; struct sFrameInfo { UMC::FrameType frameType; mfxU16 currIndex; mfxU16 goldIndex; mfxU16 altrefIndex; mfxU16 lastrefIndex; UMC::FrameMemID memId; }; bool m_is_initialized; VideoCORE* m_p_core; mfxVideoParamWrapper m_on_init_video_params, m_video_params; mfxU32 m_init_w, m_init_h; mfxF64 m_in_framerate; mfxU16 m_frameOrder; mfxBitstream m_bs; VP8Defs::vp8_FrameInfo m_frame_info; unsigned m_CodedCoeffTokenPartition; bool m_firstFrame; VP8Defs::vp8_RefreshInfo m_refresh_info; VP8Defs::vp8_FrameProbabilities m_frameProbs; VP8Defs::vp8_FrameProbabilities m_frameProbs_saved; VP8Defs::vp8_QuantInfo m_quantInfo; MFX_VP8_BoolDecoder m_boolDecoder[VP8Defs::VP8_MAX_NUMBER_OF_PARTITIONS]; mfxU16 gold_indx; mfxU16 altref_indx; mfxU16 lastrefIndex; std::vector m_frames; std::vector m_memIdReadyToFree; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; mfxDecodeStat m_stat; mfxFrameAllocRequest m_request; std::unique_ptr m_surface_source; UMC::VideoAccelerator *m_p_video_accelerator; UMC::Mutex m_mGuard; }; #endif //MFX_ENABLE_VP8_VIDEO_DECODE #endif //_MFX_VP8_DECODE_HW_H_ mfx_vp8_dec_decode_vp8_defs.h000066400000000000000000000234421443134507600333420ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/include// Copyright (c) 2014-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP8_DEC_DECODE_VP8_DEFS_H_ #define _MFX_VP8_DEC_DECODE_VP8_DEFS_H_ #include "mfx_common.h" #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) #include "umc_defs.h" #include "umc_structures.h" namespace VP8Defs { #define VP8_START_CODE_FOUND(ptr) ((ptr)[0] == 0x9d && (ptr)[1] == 0x01 && (ptr)[2] == 0x2a) #define VP8_MAX_NUM_OF_TOKEN_PARTITIONS 8 #define VP8_MIN_QP 0 #define VP8_MAX_QP 127 #define VP8_MAX_LF_LEVEL 63 enum { VP8_MB_DC_PRED = 0, /* predict DC using row above and column to the left */ VP8_MB_V_PRED, /* predict rows using row above */ VP8_MB_H_PRED, /* predict columns using column to the left */ VP8_MB_TM_PRED, /* propagate second differences a la "true motion" */ VP8_MB_B_PRED, /* each Y block is independently predicted */ VP8_NUM_MB_MODES_UV = VP8_MB_B_PRED, /* first four modes apply to chroma */ VP8_NUM_MB_MODES_Y /* all modes apply to luma */ }; enum { VP8_MV_NEAREST = VP8_NUM_MB_MODES_Y, /* use "nearest" motion vector for entire MB */ VP8_MV_NEAR, /* use "next nearest" */ VP8_MV_ZERO, /* use zero */ VP8_MV_NEW, /* use explicit offset from implicit */ VP8_MV_SPLIT, /* use multiple motion vectors */ VP8_NUM_MV_MODES = VP8_MV_SPLIT + 1 - VP8_MV_NEAREST }; enum { VP8_B_DC_PRED = 0, /* predict DC using row above and column to the left */ VP8_B_TM_PRED, /* propagate second differences a la "true motion" */ VP8_B_VE_PRED, /* predict rows using row above */ VP8_B_HE_PRED, /* predict columns using column to the left */ VP8_B_LD_PRED, /* southwest (left and down) 45 degree diagonal prediction */ VP8_B_RD_PRED, /* southeast (right and down) "" */ VP8_B_VR_PRED, /* SSE (vertical right) diagonal prediction */ VP8_B_VL_PRED, /* SSW (vertical left) "" */ VP8_B_HD_PRED, /* ESE (horizontal down) "" */ VP8_B_HU_PRED, /* ENE (horizontal up) "" */ VP8_NUM_INTRA_BLOCK_MODES, VP8_B_MV_LEFT = VP8_NUM_INTRA_BLOCK_MODES, VP8_B_MV_ABOVE, VP8_B_MV_ZERO, VP8_B_MV_NEW, VP8_NUM_B_MV_MODES = VP8_B_MV_NEW + 1 - VP8_NUM_INTRA_BLOCK_MODES }; enum { VP8_COEFF_PLANE_Y_AFTER_Y2 = 0, VP8_COEFF_PLANE_Y2, VP8_COEFF_PLANE_UV, VP8_COEFF_PLANE_Y, VP8_NUM_COEFF_PLANES }; #define VP8_NUM_COEFF_BANDS 8 #define VP8_NUM_LOCAL_COMPLEXITIES 3 enum { VP8_COEFF_NODE_EOB = 0, VP8_COEFF_NODE_0, VP8_COEFF_NODE_1, }; #define VP8_NUM_COEFF_NODES 11 enum { VP8_MV_IS_SHORT = 0, VP8_MV_SIGN, VP8_MV_SHORT, VP8_MV_LONG = 9, VP8_MV_LONG_BITS = 10, VP8_NUM_MV_PROBS = VP8_MV_LONG + VP8_MV_LONG_BITS }; extern const uint8_t vp8_range_normalization_shift[64]; extern const int32_t vp8_quant_dc[VP8_MAX_QP + 1 + 32]; extern const int32_t vp8_quant_ac[VP8_MAX_QP + 1 + 32]; extern const int32_t vp8_quant_dc2[VP8_MAX_QP + 1 + 32]; extern const uint8_t vp8_kf_mb_mode_y_probs[VP8_NUM_MB_MODES_Y - 1]; extern const uint8_t vp8_kf_mb_mode_uv_probs[VP8_NUM_MB_MODES_UV - 1]; extern const uint8_t vp8_kf_block_mode_probs[VP8_NUM_INTRA_BLOCK_MODES][VP8_NUM_INTRA_BLOCK_MODES][VP8_NUM_INTRA_BLOCK_MODES-1]; extern const uint8_t vp8_mb_mode_y_probs[VP8_NUM_MB_MODES_Y - 1]; extern const uint8_t vp8_mb_mode_uv_probs[VP8_NUM_MB_MODES_UV - 1]; extern const uint8_t vp8_block_mode_probs [VP8_NUM_INTRA_BLOCK_MODES - 1]; extern const uint8_t vp8_default_coeff_probs[VP8_NUM_COEFF_PLANES][VP8_NUM_COEFF_BANDS][VP8_NUM_LOCAL_COMPLEXITIES][VP8_NUM_COEFF_NODES]; extern const uint8_t vp8_coeff_update_probs[VP8_NUM_COEFF_PLANES][VP8_NUM_COEFF_BANDS][VP8_NUM_LOCAL_COMPLEXITIES][VP8_NUM_COEFF_NODES]; extern const int8_t vp8_mb_mode_y_tree[2*(VP8_NUM_MB_MODES_Y - 1)]; extern const int8_t vp8_kf_mb_mode_y_tree[2*(VP8_NUM_MB_MODES_Y - 1)]; extern const int8_t vp8_mb_mode_uv_tree[2*(VP8_NUM_MB_MODES_UV - 1)]; extern const int8_t vp8_block_mode_tree[2*(VP8_NUM_INTRA_BLOCK_MODES - 1)]; extern const uint32_t vp8_mbmode_2_blockmode_u32[VP8_NUM_MB_MODES_Y]; extern const uint8_t vp8_mv_update_probs[2][VP8_NUM_MV_PROBS]; extern const uint8_t vp8_default_mv_contexts[2][VP8_NUM_MV_PROBS]; // get this from h264 sources - need test????? extern const uint8_t vp8_ClampTbl[768]; #define vp8_GetClampTblValue(x) vp8_ClampTbl[256 + (x)] #define vp8_ClampTblLookup(x, y) vp8_GetClampTblValue((x) + mfx::clamp(y, -256, 256)) #define vp8_clamp8s(x) vp8_ClampTblLookup((x), 128) - 128 #define vp8_clamp8u(x) vp8_ClampTblLookup((x), 0) enum { VP8_ALT_QUANT = 0, VP8_ALT_LOOP_FILTER, VP8_NUM_OF_MB_FEATURES }; #define VP8_MAX_NUM_OF_SEGMENTS 4 enum { VP8_ALT_LOOP_FILTER_BITS = 6, VP8_ALT_QUANT_BITS = 7 }; enum { VP8_LOOP_FILTER_NORMAL = 0, VP8_LOOP_FILTER_SIMPLE }; #define VP8_NUM_OF_SEGMENT_TREE_PROBS 3 enum { VP8_INTRA_FRAME = 0, VP8_LAST_FRAME, VP8_GOLDEN_FRAME, VP8_ALTREF_FRAME, VP8_NUM_OF_REF_FRAMES }; #define VP8_NUM_OF_MODE_LF_DELTAS 4 #define VP8_BILINEAR_INTERP 1 #define VP8_CHROMA_FULL_PEL 2 typedef struct _vp8_FrameInfo { UMC::FrameType frameType; uint8_t showFrame; uint8_t interpolationFlags; // bit0: bilinear interpolation (1 - on, 0 - off); // bit1: chroma full pel (1 - on, 0 - off) uint8_t segmentationEnabled; uint8_t updateSegmentMap; uint8_t updateSegmentData; uint8_t segmentAbsMode; int8_t segmentFeatureData[VP8_NUM_OF_MB_FEATURES][VP8_MAX_NUM_OF_SEGMENTS]; uint8_t segmentTreeProbabilities[VP8_NUM_OF_SEGMENT_TREE_PROBS]; uint8_t loopFilterType; uint8_t loopFilterLevel; uint8_t sharpnessLevel; uint8_t mbLoopFilterAdjust; uint8_t modeRefLoopFilterDeltaUpdate; int8_t refLoopFilterDeltas[VP8_NUM_OF_REF_FRAMES]; int8_t modeLoopFilterDeltas[VP8_NUM_OF_MODE_LF_DELTAS]; uint8_t numTokenPartitions; uint8_t mbSkipEnabled; uint8_t skipFalseProb; uint8_t intraProb; uint8_t goldProb; uint8_t lastProb; int32_t numPartitions; int32_t partitionSize[VP8_MAX_NUM_OF_TOKEN_PARTITIONS]; uint8_t *partitionStart[VP8_MAX_NUM_OF_TOKEN_PARTITIONS]; int32_t m_DPBSize; uint8_t color_space_type; uint8_t clamping_type; uint8_t h_scale; // not used by the decoder uint8_t v_scale; // not used by the decoder int16_t frameWidth; // width + cols_padd int16_t frameHeight; // height + rows_padd mfxSize frameSize; // actual width/height without padding cols/rows uint32_t firstPartitionSize; // Header info bits rounded up to byte uint16_t version; uint32_t entropyDecSize; // Header info consumed bits uint32_t entropyDecOffset; } vp8_FrameInfo; typedef struct _vp8_QuantInfo { int32_t yacQP; // abs value, always specified int32_t y2acQ[VP8_MAX_NUM_OF_SEGMENTS]; int32_t y2dcQ[VP8_MAX_NUM_OF_SEGMENTS]; int32_t yacQ[VP8_MAX_NUM_OF_SEGMENTS]; int32_t ydcQ[VP8_MAX_NUM_OF_SEGMENTS]; int32_t uvacQ[VP8_MAX_NUM_OF_SEGMENTS]; int32_t uvdcQ[VP8_MAX_NUM_OF_SEGMENTS]; // q deltas int32_t ydcDeltaQP; int32_t y2acDeltaQP; int32_t y2dcDeltaQP; int32_t uvacDeltaQP; int32_t uvdcDeltaQP; int32_t lastGoldenKeyQP; const int32_t *pYacQ; const int32_t *pY2acQ; const int32_t *pUVacQ; const int32_t *pYdcQ; const int32_t *pY2dcQ; const int32_t *pUVdcQ; } vp8_QuantInfo; typedef struct _vp8_RefreshInfo { uint8_t refreshRefFrame; // (refreshRefFrame & 2) - refresh golden frame, (refreshRefFrame & 1) - altref frame uint8_t copy2Golden; uint8_t copy2Altref; uint8_t refFrameBiasTable[4]; uint8_t refreshProbabilities; uint8_t refreshLastFrame; } vp8_RefreshInfo; typedef struct _vp8_FrameProbabilities { uint8_t mbModeProbY[VP8_NUM_MB_MODES_Y - 1]; // vp8_mb_mode_y_probs uint8_t mbModeProbUV[VP8_NUM_MB_MODES_UV - 1]; // vp8_mb_mode_uv_probs uint8_t mvContexts[2][VP8_NUM_MV_PROBS]; // vp8_default_mv_contexts uint8_t coeff_probs[VP8_NUM_COEFF_PLANES][VP8_NUM_COEFF_BANDS][VP8_NUM_LOCAL_COMPLEXITIES][VP8_NUM_COEFF_NODES]; } vp8_FrameProbabilities; enum { VP8_FIRST_PARTITION = 0, VP8_TOKEN_PARTITION_0, VP8_TOKEN_PARTITION_1, VP8_TOKEN_PARTITION_2, VP8_TOKEN_PARTITION_3, VP8_TOKEN_PARTITION_4, VP8_TOKEN_PARTITION_5, VP8_TOKEN_PARTITION_6, VP8_TOKEN_PARTITION_7, VP8_TOKEN_PARTITION_8, VP8_MAX_NUMBER_OF_PARTITIONS }; typedef struct _vp8_FrameData { uint8_t* data_y; uint8_t* data_u; uint8_t* data_v; uint8_t* base_y; uint8_t* base_u; uint8_t* base_v; mfxSize size; int32_t step_y; int32_t step_uv; int32_t border_size; } vp8_FrameData; } // namespace UMC class vp8_exception { public: vp8_exception(int32_t status = -1) : m_Status(status) {} virtual ~vp8_exception() {} int32_t GetStatus() const { return m_Status; } private: int32_t m_Status; }; #endif // MFX_ENABLE_VP8_VIDEO_DECODE #endif // _MFX_VP8_DEC_DECODE_VP8_DEFS_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/src/000077500000000000000000000000001443134507600251045ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/src/mfx_vp8_dec_decode_common.cpp000066400000000000000000000247151443134507600326760ustar00rootroot00000000000000// Copyright (c) 2014-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vp8_dec_decode_common.h" #include "umc_structures.h" #include "umc_defs.h" #include "ippcore.h" #include "ipps.h" #include "ippcc.h" #include "mfx_common.h" #include "mfx_common_decode_int.h" #include "mfx_common_int.h" using namespace UMC; #define VP8_START_CODE_FOUND(ptr) ((ptr)[0] == 0x9d && (ptr)[1] == 0x01 && (ptr)[2] == 0x2a) namespace VP8DecodeCommon { mfxStatus DecodeHeader(VideoCORE *, mfxBitstream *p_bs, mfxVideoParam *p_params) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR2(p_bs, p_params); sts = CheckBitstream(p_bs); MFX_CHECK_STS(sts); if (p_bs->DataLength < 3) { MFX_RETURN(MFX_ERR_MORE_DATA); } mfxU8 *p_bitstream = p_bs->Data + p_bs->DataOffset; mfxU8 *p_bitstream_end = p_bs->Data + p_bs->DataOffset + p_bs->DataLength; mfxU32 n_bytes_offset = 0; bool start_code_found = false; while (p_bitstream < p_bitstream_end) { if (VP8_START_CODE_FOUND(p_bitstream)) // (0x9D && 0x01 && 0x2A) { start_code_found = true; // move to frame tag p_bitstream -= 3; if (n_bytes_offset < 3) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); n_bytes_offset -= 3; break; } p_bitstream += 1; n_bytes_offset += 1; } if (!start_code_found) { // set offset, but leave last six bytes // since they can be start bytes of start code and frame tag if(n_bytes_offset < 6) return MFX_ERR_MORE_BITSTREAM; MoveBitstreamData(*p_bs, n_bytes_offset - 6); MFX_RETURN(MFX_ERR_MORE_DATA); } FrameType frame_type; mfxU16 width, height; frame_type = (p_bitstream[0] & 1) ? P_PICTURE : I_PICTURE; // 1 bits p_params->mfx.CodecProfile = ((p_bitstream[0] >> 1) & 0x7) + 1; if (frame_type != I_PICTURE) { MFX_RETURN(MFX_ERR_MORE_DATA); } mfxU32 first_partion_size = (p_bitstream[0] >> 5) | // 19 bit (p_bitstream[1] << 3) | (p_bitstream[2] << 11); if (p_bitstream + first_partion_size > p_bitstream_end) { MFX_RETURN(MFX_ERR_MORE_DATA); } // move to start code p_bitstream += 3; width = ((p_bitstream[4] << 8) | p_bitstream[3]) & 0x3fff; height = ((p_bitstream[6] << 8) | p_bitstream[5]) & 0x3fff; p_params->mfx.FrameInfo.AspectRatioW = 1; p_params->mfx.FrameInfo.AspectRatioH = 1; p_params->mfx.FrameInfo.CropW = width; p_params->mfx.FrameInfo.CropH = height; p_params->mfx.FrameInfo.Width = (p_params->mfx.FrameInfo.CropW + 15) & ~0x0f; p_params->mfx.FrameInfo.Height = (p_params->mfx.FrameInfo.CropH + 15) & ~0x0f; p_params->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; p_params->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; p_params->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; MoveBitstreamData(*p_bs, n_bytes_offset); return MFX_ERR_NONE; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MFX_VP8_Utility implementation /////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool MFX_VP8_Utility::IsNeedPartialAcceleration(mfxVideoParam *p_params) { if (!p_params) return false; if (p_params->mfx.FrameInfo.Width > 4096 || p_params->mfx.FrameInfo.Height > 4096) return true; return false; } // bool MFX_VP8_Utility::IsNeedPartialAcceleration(mfxVideoParam *p_params) eMFXPlatform MFX_VP8_Utility::GetPlatform(VideoCORE *p_core, mfxVideoParam *p_params) { eMFXPlatform platform = p_core->GetPlatformType(); if (p_params && IsNeedPartialAcceleration(p_params) && platform != MFX_PLATFORM_SOFTWARE) { return MFX_PLATFORM_SOFTWARE; } return platform; } // eMFXPlatform MFX_VP8_Utility::GetPlatform(VideoCORE *p_core, mfxVideoParam *p_params) mfxStatus MFX_VP8_Utility::Query(VideoCORE *p_core, mfxVideoParam *p_in, mfxVideoParam *p_out, eMFXHWType type) { MFX_CHECK_NULL_PTR1(p_out); mfxStatus sts = MFX_ERR_NONE; if (p_in == p_out) { mfxVideoParam in1; MFX_INTERNAL_CPY(&in1, p_in, sizeof(mfxVideoParam)); return Query(p_core, &in1, p_out, type); } if (p_core->GetPlatformType() == MFX_PLATFORM_HARDWARE && VP8DCaps::IsSupported(p_core->GetHWType())) MFX_RETURN(MFX_ERR_UNSUPPORTED); memset(&p_out->mfx, 0, sizeof(mfxInfoMFX)); if (p_in) { if (p_in->mfx.CodecId == MFX_CODEC_VP8) p_out->mfx.CodecId = p_in->mfx.CodecId; switch (p_in->mfx.CodecLevel) { case MFX_LEVEL_UNKNOWN: p_out->mfx.CodecLevel = p_in->mfx.CodecLevel; break; } if (p_in->mfx.NumThread < 128) p_out->mfx.NumThread = p_in->mfx.NumThread; if (p_in->AsyncDepth < MFX_MAX_ASYNC_DEPTH_VALUE) p_out->AsyncDepth = p_in->AsyncDepth; if (p_in->IOPattern) { if ((p_in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || (p_in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY)) p_out->IOPattern = p_in->IOPattern; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } if (p_in->mfx.FrameInfo.FourCC) { // mfxFrameInfo if (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12) p_out->mfx.FrameInfo.FourCC = p_in->mfx.FrameInfo.FourCC; else sts = MFX_ERR_UNSUPPORTED; } switch(p_in->mfx.FrameInfo.ChromaFormat) { case MFX_CHROMAFORMAT_YUV420: p_out->mfx.FrameInfo.ChromaFormat = p_in->mfx.FrameInfo.ChromaFormat; break; default: if (p_in->mfx.FrameInfo.FourCC) sts = MFX_ERR_UNSUPPORTED; break; } if (!p_in->mfx.FrameInfo.ChromaFormat && !(!p_in->mfx.FrameInfo.FourCC && !p_in->mfx.FrameInfo.ChromaFormat)) sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.Width % 16 == 0 && p_in->mfx.FrameInfo.Width <= 4096) p_out->mfx.FrameInfo.Width = p_in->mfx.FrameInfo.Width; else sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.Height % 16 == 0 && p_in->mfx.FrameInfo.Height <= 4096) p_out->mfx.FrameInfo.Height = p_in->mfx.FrameInfo.Height; else sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.CropX <= p_out->mfx.FrameInfo.Width) p_out->mfx.FrameInfo.CropX = p_in->mfx.FrameInfo.CropX; if (p_in->mfx.FrameInfo.CropY <= p_out->mfx.FrameInfo.Height) p_out->mfx.FrameInfo.CropY = p_in->mfx.FrameInfo.CropY; if (p_out->mfx.FrameInfo.CropX + p_in->mfx.FrameInfo.CropW <= p_out->mfx.FrameInfo.Width) p_out->mfx.FrameInfo.CropW = p_in->mfx.FrameInfo.CropW; if (p_out->mfx.FrameInfo.CropY + p_in->mfx.FrameInfo.CropH <= p_out->mfx.FrameInfo.Height) p_out->mfx.FrameInfo.CropH = p_in->mfx.FrameInfo.CropH; p_out->mfx.FrameInfo.FrameRateExtN = p_in->mfx.FrameInfo.FrameRateExtN; p_out->mfx.FrameInfo.FrameRateExtD = p_in->mfx.FrameInfo.FrameRateExtD; p_out->mfx.FrameInfo.AspectRatioW = p_in->mfx.FrameInfo.AspectRatioW; p_out->mfx.FrameInfo.AspectRatioH = p_in->mfx.FrameInfo.AspectRatioH; switch (p_in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: p_out->mfx.FrameInfo.PicStruct = p_in->mfx.FrameInfo.PicStruct; break; default: sts = MFX_ERR_UNSUPPORTED; break; } mfxStatus stsExt = CheckDecodersExtendedBuffers(p_in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; if (p_in->Protected) { sts = MFX_ERR_UNSUPPORTED; } if (GetPlatform(p_core, p_out) != p_core->GetPlatformType() && sts == MFX_ERR_NONE) { assert(GetPlatform(p_core, p_out) == MFX_PLATFORM_SOFTWARE); sts = MFX_ERR_UNSUPPORTED; } } else { p_out->mfx.CodecId = MFX_CODEC_VP8; p_out->mfx.CodecProfile = 1; p_out->mfx.CodecLevel = 1; p_out->mfx.NumThread = 1; p_out->AsyncDepth = 1; // mfxFrameInfo p_out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; p_out->mfx.FrameInfo.Width = 16; p_out->mfx.FrameInfo.Height = 16; p_out->mfx.FrameInfo.FrameRateExtN = 1; p_out->mfx.FrameInfo.FrameRateExtD = 1; p_out->mfx.FrameInfo.AspectRatioW = 1; p_out->mfx.FrameInfo.AspectRatioH = 1; p_out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (type == MFX_HW_UNKNOWN) { p_out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } else { p_out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } } return sts; } // mfxStatus MFX_VP8_Utility::Query(VideoCORE *p_core, mfxVideoParam *p_in, mfxVideoParam *p_out, eMFXHWType type)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/src/mfx_vp8_dec_decode_hw.cpp000066400000000000000000001275341443134507600320270ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if defined(_MSC_VER) //MSVC compiler issue: complains about 'std::copy' with parameters that may be unsafe #pragma warning(push) #pragma warning(disable:4996) #endif #include /* for std::find on Linux/Android */ #if defined(_MSC_VER) #pragma warning(pop) #endif #include "mfx_common.h" #include "mfxvideo++int.h" #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) #include "mfx_common_decode_int.h" #include "mfx_vp8_dec_decode_hw.h" #include "mfx_enc_common.h" #include "mfx_vpx_dec_common.h" #include "libmfx_core_vaapi.h" #include "umc_va_base.h" #include #include #include #include #include #include "mfx_vp8_dec_decode_common.h" #define VP8_START_CODE_FOUND(ptr) ((ptr)[0] == 0x9d && (ptr)[1] == 0x01 && (ptr)[2] == 0x2a) static void SetFrameType(const VP8Defs::vp8_FrameInfo &frame_info, mfxFrameSurface1 &surface_out) { auto extFrameInfo = reinterpret_cast(GetExtendedBuffer(surface_out.Data.ExtParam, surface_out.Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO)); if (extFrameInfo == nullptr) return; switch (frame_info.frameType) { case UMC::I_PICTURE: extFrameInfo->FrameType = MFX_FRAMETYPE_I; break; case UMC::P_PICTURE: extFrameInfo->FrameType = MFX_FRAMETYPE_P; break; default: extFrameInfo->FrameType = MFX_FRAMETYPE_UNKNOWN; } } VideoDECODEVP8_HW::VideoDECODEVP8_HW(VideoCORE *p_core, mfxStatus *sts) : m_is_initialized(false) , m_p_core(p_core) , m_init_w(0) , m_init_h(0) , m_in_framerate(0) , m_frameOrder((mfxU16)MFX_FRAMEORDER_UNKNOWN) , m_CodedCoeffTokenPartition(0) , m_firstFrame(true) , m_response() , m_response_alien() , m_stat() , m_request() , m_p_video_accelerator(NULL) { UMC_SET_ZERO(m_bs); UMC_SET_ZERO(m_frame_info); UMC_SET_ZERO(m_refresh_info); UMC_SET_ZERO(m_frameProbs); UMC_SET_ZERO(m_frameProbs_saved); UMC_SET_ZERO(m_quantInfo); gold_indx = 0; altref_indx = 0; lastrefIndex = 0; if (sts) *sts = MFX_ERR_NONE; } VideoDECODEVP8_HW::~VideoDECODEVP8_HW() { Close(); } #ifdef _MSVC_LANG #pragma warning (disable : 4189) #endif bool VideoDECODEVP8_HW::CheckHardwareSupport(VideoCORE *p_core, mfxVideoParam *p_video_param) { // IsGuidSupported checks p_video_param for nullptr MFX_CHECK(p_core, false); if (p_core->IsGuidSupported(sDXVA_Intel_ModeVP8_VLD, p_video_param) != MFX_ERR_NONE) { return false; } return true; } // bool VideoDECODEVP8_HW::CheckHardwareSupport(VideoCORE *p_core, mfxVideoParam *p_video_param) mfxStatus VideoDECODEVP8_HW::Init(mfxVideoParam *p_video_param) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEVP8_HW::Init"); mfxStatus sts = MFX_ERR_NONE; if (m_is_initialized) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); eMFXVAType vatype = m_p_core->GetVAType(); if(vatype == MFX_HW_D3D11) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } eMFXPlatform platform = MFX_VP8_Utility::GetPlatform(m_p_core, p_video_param); MFX_CHECK(platform == MFX_PLATFORM_HARDWARE, MFX_ERR_UNSUPPORTED); eMFXHWType type = m_p_core->GetHWType(); if (MFX_ERR_NONE > CheckVideoParamDecoders(p_video_param, type)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } if(CheckHardwareSupport(m_p_core, p_video_param) == false) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (MFX_VPX_Utility::CheckVideoParam(p_video_param, MFX_CODEC_VP8) == false) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } m_on_init_video_params = *p_video_param; m_init_w = p_video_param->mfx.FrameInfo.Width; m_init_h = p_video_param->mfx.FrameInfo.Height; if(m_on_init_video_params.mfx.FrameInfo.FrameRateExtN == 0 || m_on_init_video_params.mfx.FrameInfo.FrameRateExtD == 0) { m_on_init_video_params.mfx.FrameInfo.FrameRateExtD = 1000; m_on_init_video_params.mfx.FrameInfo.FrameRateExtN = 30000; } m_in_framerate = (mfxF64) m_on_init_video_params.mfx.FrameInfo.FrameRateExtD / m_on_init_video_params.mfx.FrameInfo.FrameRateExtN; m_video_params = m_on_init_video_params; // allocate memory mfxFrameAllocRequest request; memset(&request, 0, sizeof(request)); memset(&m_response, 0, sizeof(m_response)); memset(&m_response_alien, 0, sizeof(m_response_alien)); sts = MFX_VPX_Utility::QueryIOSurfInternal(&m_video_params, &request); MFX_CHECK_STS(sts); mfxFrameAllocRequest request_internal = request; request.AllocId = p_video_param->AllocId; MFX_CHECK_STS(sts); m_request = request; try { m_surface_source.reset(new SurfaceSource(m_p_core, *p_video_param, platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } sts = m_p_core->CreateVA(&m_on_init_video_params, &request, &m_response, m_surface_source.get()); MFX_CHECK_STS(sts); m_p_core->GetVA((mfxHDL*)&m_p_video_accelerator, MFX_MEMTYPE_FROM_DECODE); m_frameOrder = (mfxU16)0; m_firstFrame = true; m_is_initialized = true; return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::Init(mfxVideoParam *p_video_param) mfxStatus VideoDECODEVP8_HW::QueryImplsDescription( VideoCORE&, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU32 SupportedProfiles[] = { MFX_PROFILE_VP8_0 , MFX_PROFILE_VP8_1 , MFX_PROFILE_VP8_2 , MFX_PROFILE_VP8_3 }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 }; caps.CodecID = MFX_CODEC_VP8; caps.MaxcodecLevel = MFX_LEVEL_UNKNOWN; for (mfxU32 profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 4096, 16 }; memCaps.Height = { 16, 4096, 16 }; for (auto fcc : SupportedFourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } static bool IsSameVideoParam(mfxVideoParam *newPar, mfxVideoParam *oldPar) { if (newPar->IOPattern != oldPar->IOPattern) return false; if (newPar->Protected != oldPar->Protected) return false; int32_t asyncDepth = std::min(newPar->AsyncDepth, MFX_MAX_ASYNC_DEPTH_VALUE); if (asyncDepth != oldPar->AsyncDepth) return false; if (newPar->mfx.FrameInfo.Height != oldPar->mfx.FrameInfo.Height) return false; if (newPar->mfx.FrameInfo.Width != oldPar->mfx.FrameInfo.Width) return false; if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) return false; if (newPar->mfx.NumThread > oldPar->mfx.NumThread && oldPar->mfx.NumThread > 0) // need more surfaces for efficient decoding return false; return true; } mfxStatus VideoDECODEVP8_HW::Reset(mfxVideoParam *p_video_param) { if(m_is_initialized == false) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(p_video_param); eMFXHWType type = m_p_core->GetHWType(); if (MFX_ERR_NONE > CheckVideoParamDecoders(p_video_param, type)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (MFX_VPX_Utility::CheckVideoParam(p_video_param, MFX_CODEC_VP8) == false) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!IsSameVideoParam(p_video_param, &m_on_init_video_params)) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // sw acceleration is not supported if (MFX_PLATFORM_SOFTWARE == m_p_core->GetPlatformType()) MFX_RETURN(MFX_ERR_UNSUPPORTED); if (m_surface_source->Reset() != UMC::UMC_OK) MFX_RETURN(MFX_ERR_MEMORY_ALLOC); m_frameOrder = (mfxU16)0; memset(&m_stat, 0, sizeof(m_stat)); m_on_init_video_params = *p_video_param; m_video_params = m_on_init_video_params; if (m_on_init_video_params.mfx.FrameInfo.FrameRateExtN == 0 || m_on_init_video_params.mfx.FrameInfo.FrameRateExtD == 0) { m_on_init_video_params.mfx.FrameInfo.FrameRateExtD = 1000; m_on_init_video_params.mfx.FrameInfo.FrameRateExtN = 30000; } m_in_framerate = (mfxF64) m_on_init_video_params.mfx.FrameInfo.FrameRateExtD / m_on_init_video_params.mfx.FrameInfo.FrameRateExtN; if(CheckHardwareSupport(m_p_core, p_video_param) == false) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } gold_indx = 0; altref_indx = 0; lastrefIndex = 0; m_bs.DataLength = 0; for(size_t i = 0; i < m_frames.size(); i++) { m_surface_source.get()->DecreaseReference(m_frames[i].memId); } m_firstFrame = true; m_frames.clear(); m_memIdReadyToFree.clear(); return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::Reset(mfxVideoParam *p_video_param) mfxStatus VideoDECODEVP8_HW::Close() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoDECODEVP8_HW::Close"); if(m_is_initialized == false) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); m_is_initialized = false; m_surface_source->Close(); m_frameOrder = (mfxU16)0; m_p_video_accelerator = 0; memset(&m_stat, 0, sizeof(m_stat)); if (m_bs.Data) { delete[] m_bs.Data; m_bs.DataLength = 0; } gold_indx = 0; altref_indx = 0; lastrefIndex = 0; m_firstFrame = true; return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::Close() mfxStatus VideoDECODEVP8_HW::Query(VideoCORE *p_core, mfxVideoParam *p_in, mfxVideoParam *p_out) { MFX_CHECK_NULL_PTR1(p_out); eMFXHWType type = p_core->GetHWType(); if (!CheckHardwareSupport(p_core, p_in ? p_in : p_out)) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_VP8_Utility::Query(p_core, p_in, p_out, type); } // mfxStatus VideoDECODEVP8_HW::Query(VideoCORE *p_core, mfxVideoParam *p_in, mfxVideoParam *p_out) mfxStatus VideoDECODEVP8_HW::QueryIOSurf(VideoCORE *p_core, mfxVideoParam *p_video_param, mfxFrameAllocRequest *p_request) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR3(p_core, p_video_param, p_request); mfxVideoParam p_params = *p_video_param; if ( !(p_params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } if ((p_params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } if(p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) { p_request->Info = p_params.mfx.FrameInfo; p_request->NumFrameMin = 1; p_request->NumFrameSuggested = p_request->NumFrameMin + (p_params.AsyncDepth ? p_params.AsyncDepth : MFX_AUTO_ASYNC_DEPTH_VALUE); p_request->Type = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_FROM_DECODE; } else { sts = MFX_VPX_Utility::QueryIOSurfInternal(p_video_param, p_request); } if (!CheckHardwareSupport(p_core, p_video_param)) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } return sts; } // mfxStatus VideoDECODEVP8_HW::QueryIOSurf(VideoCORE *p_core, mfxVideoParam *p_par, mfxFrameAllocRequest *p_request) mfxStatus VideoDECODEVP8_HW::DecodeFrameCheck(mfxBitstream * /*p_bs*/, mfxFrameSurface1 * /*p_surface_work*/, mfxFrameSurface1 ** /*pp_surface_out*/) { return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::DecodeFrameCheck(mfxBitstream *p_bs, mfxFrameSurface1 *p_surface_work, mfxFrameSurface1 **pp_surface_out) mfxStatus VideoDECODEVP8_HW::GetOutputSurface(mfxFrameSurface1 **pp_surface_out, mfxFrameSurface1 *p_surface_work, UMC::FrameMemID index) { mfxFrameSurface1 *p_native_surface = m_surface_source->GetSurface(index, p_surface_work, &m_video_params); if (!p_native_surface) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } *pp_surface_out = p_native_surface; return MFX_ERR_NONE; } #define VP8_START_CODE_FOUND(ptr) ((ptr)[0] == 0x9d && (ptr)[1] == 0x01 && (ptr)[2] == 0x2a) mfxStatus VideoDECODEVP8_HW::PreDecodeFrame(mfxBitstream *p_bs, mfxU32& w, mfxU32& h) { mfxU8 *p_bitstream = p_bs->Data + p_bs->DataOffset; mfxU8 *p_bitstream_end = p_bs->Data + p_bs->DataOffset + p_bs->DataLength; while (p_bitstream < p_bitstream_end) { if (VP8_START_CODE_FOUND(p_bitstream)) // (0x9D && 0x01 && 0x2A) { break; } p_bitstream += 1; } w = ((p_bitstream[4] << 8) | p_bitstream[3]) & 0x3fff; h = ((p_bitstream[6] << 8) | p_bitstream[5]) & 0x3fff; w = (w + 15) & ~0x0f; h = (h + 15) & ~0x0f; if (m_init_w != w || m_init_h != h) { MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::PreDecodeFrame(mfxBitstream *p_bs, mfxFrameSurface1 *p_surface) mfxStatus VideoDECODEVP8_HW::ConstructFrame(mfxBitstream *p_in, mfxBitstream *p_out, VP8DecodeCommon::IVF_FRAME& frame) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEVP8_HW::ConstructFrame"); MFX_CHECK_NULL_PTR1(p_out); if (p_in->DataLength == 0) { MFX_RETURN(MFX_ERR_MORE_DATA); } mfxU8 *p_bs_start = p_in->Data + p_in->DataOffset; if (p_out->Data) { delete[] p_out->Data; p_out->DataLength = 0; } p_out->Data = new uint8_t[p_in->DataLength]; std::copy(p_bs_start, p_bs_start + p_in->DataLength, p_out->Data); p_out->DataLength = p_in->DataLength; p_out->DataOffset = 0; frame.frame_size = p_in->DataLength; MoveBitstreamData(*p_in, p_in->DataLength); return MFX_ERR_NONE; } // mfxStatus VideoDECODEVP8_HW::ConstructFrame(mfxBitstream *p_in, mfxBitstream *p_out, IVF_FRAME& frame) UMC::FrameMemID VideoDECODEVP8_HW::GetMemIdToUnlock() { size_t size = m_frames.size(); if(size == 1) { return -1; } UMC::FrameMemID memId = -1; sFrameInfo info = {}; std::vector::iterator i; std::vector::iterator freeMemIdPos; for(i = m_frames.begin();i != m_frames.end() && (i + 1) != m_frames.end();i++) { freeMemIdPos = std::find(m_memIdReadyToFree.begin(), m_memIdReadyToFree.end(), i->memId); if(i->currIndex != gold_indx && i->currIndex != altref_indx && freeMemIdPos != m_memIdReadyToFree.end()) { info = *i; memId = info.memId; m_frames.erase(i); m_memIdReadyToFree.erase(freeMemIdPos); break; } } if(memId == -1) return -1; return memId; } mfxStatus MFX_CDECL VP8DECODERoutine(void *p_state, void * /*pp_param*/, mfxU32 /*thread_number*/, mfxU32) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VP8DECODERoutine"); mfxStatus sts = MFX_ERR_NONE; VideoDECODEVP8_HW::VP8DECODERoutineData& data = *(VideoDECODEVP8_HW::VP8DECODERoutineData*)p_state; VideoDECODEVP8_HW& decoder = *data.decoder; { UMC::Status status = decoder.m_p_video_accelerator->SyncTask(data.memId); if (status != UMC::UMC_OK && status != UMC::UMC_ERR_TIMEOUT) { mfxStatus CriticalErrorStatus = (status == UMC::UMC_ERR_GPU_HANG) ? MFX_ERR_GPU_HANG : MFX_ERR_DEVICE_FAILED; decoder.SetCriticalErrorOccured(CriticalErrorStatus); return CriticalErrorStatus; } } if (decoder.m_video_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY && data.surface_work) { sts = decoder.m_surface_source->PrepareToOutput(data.surface_work, data.memId, &decoder.m_on_init_video_params); } UMC::AutomaticUMCMutex guard(decoder.m_mGuard); decoder.m_memIdReadyToFree.push_back(data.memId); UMC::FrameMemID memIdToUnlock = -1; while ((memIdToUnlock = decoder.GetMemIdToUnlock()) != -1) { decoder.m_surface_source.get()->DecreaseReference(memIdToUnlock); } delete &data; return sts; } static mfxStatus VP8CompleteProc(void *, void * /*pp_param*/, mfxStatus) { return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::DecodeFrameCheck(mfxBitstream *p_bs, mfxFrameSurface1 *p_surface_work, mfxFrameSurface1 **pp_surface_out, MFX_ENTRY_POINT * p_entry_point) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEVP8_HW::DecodeFrameCheck"); mfxStatus sts = MFX_ERR_NONE; if(m_is_initialized == false) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } if (NeedToReturnCriticalStatus(p_bs)) return ReturningCriticalStatus(); bool allow_null_work_surface = SupportsVPLFeatureSet(*m_p_core); if (allow_null_work_surface) { MFX_CHECK_NULL_PTR1(pp_surface_out); } else { MFX_CHECK_NULL_PTR2(p_surface_work, pp_surface_out); } if (p_surface_work) { sts = CheckFrameInfoCodecs(&p_surface_work->Info, MFX_CODEC_VP8); MFX_CHECK_STS(sts); sts = CheckFrameData(p_surface_work); MFX_CHECK_STS(sts); } UMC::FrameMemID memId; do { sts = p_bs ? CheckBitstream(p_bs) : MFX_ERR_NONE; MFX_CHECK_STS(sts); if (p_bs == NULL) MFX_RETURN(MFX_ERR_MORE_DATA); bool show_frame; UMC::FrameType frame_type; if (p_bs->DataLength == 0) MFX_RETURN(MFX_ERR_MORE_DATA); sts = m_surface_source->SetCurrentMFXSurface(p_surface_work); MFX_CHECK_STS(sts); if (!m_surface_source->HasFreeSurface()) { return MFX_WRN_DEVICE_BUSY; } mfxU8 *pTemp = p_bs->Data + p_bs->DataOffset; frame_type = (pTemp[0] & 1) ? UMC::P_PICTURE : UMC::I_PICTURE; // 1 bits show_frame = (pTemp[0] >> 4) & 0x1; mfxU32 bs_width = 0; mfxU32 bs_height = 0; if (frame_type == UMC::I_PICTURE) { sts = PreDecodeFrame(p_bs, bs_width, bs_height); MFX_CHECK_STS(sts); } if (m_firstFrame && frame_type != UMC::I_PICTURE) { MoveBitstreamData(*p_bs, p_bs->DataLength); MFX_RETURN(MFX_ERR_MORE_DATA); } m_firstFrame = false; VP8DecodeCommon::IVF_FRAME frame; memset(&frame, 0, sizeof(VP8DecodeCommon::IVF_FRAME)); sts = ConstructFrame(p_bs, &m_bs, frame); MFX_CHECK_STS(sts); *pp_surface_out = 0; sts = DecodeFrameHeader(&m_bs); MFX_CHECK_STS(sts); UMC::VideoDataInfo vdInfo; vdInfo.Init(m_frame_info.frameSize.width, m_frame_info.frameSize.height, UMC::NV12, 8); UMC::Status umc_sts = m_surface_source->Alloc(&memId, &vdInfo, 0); MFX_CHECK(umc_sts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); if (!p_surface_work && m_on_init_video_params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { p_surface_work = m_surface_source->GetSurfaceByIndex(memId); MFX_CHECK_NULL_PTR1(p_surface_work); } if (p_surface_work) { p_surface_work->Info.CropW = p_surface_work->Info.CropW ? p_surface_work->Info.CropW : m_on_init_video_params.mfx.FrameInfo.CropW; p_surface_work->Info.CropH = p_surface_work->Info.CropH ? p_surface_work->Info.CropH : m_on_init_video_params.mfx.FrameInfo.CropH; MFX_CHECK(p_surface_work->Info.Width >= bs_width && p_surface_work->Info.Height >= bs_height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) } sFrameInfo info; info.frameType = m_frame_info.frameType; info.memId = memId; info.currIndex = static_cast(memId); info.goldIndex = gold_indx; info.altrefIndex = altref_indx; info.lastrefIndex = lastrefIndex; if (m_frame_info.frameType == UMC::I_PICTURE) { gold_indx = altref_indx = lastrefIndex = info.currIndex; } else { mfxU16 oldgold_indx = gold_indx; switch (m_refresh_info.copy2Golden) { case 1: gold_indx = lastrefIndex; break; case 2: gold_indx = altref_indx; break; case 0: default: break; } switch (m_refresh_info.copy2Altref) { case 1: altref_indx = lastrefIndex; break; case 2: altref_indx = oldgold_indx; break; case 0: default: break; } if ((m_refresh_info.refreshRefFrame & 2) != 0) gold_indx = info.currIndex; if ((m_refresh_info.refreshRefFrame & 1) != 0) altref_indx = info.currIndex; if (m_refresh_info.refreshLastFrame) lastrefIndex = info.currIndex; } m_frames.push_back(info); m_surface_source->IncreaseReference(memId); PackHeaders(&m_bs); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VP8 decode DDISubmitTask"); if (m_p_video_accelerator->BeginFrame(memId, 0) == UMC::UMC_OK) { m_p_video_accelerator->Execute(); m_p_video_accelerator->EndFrame(); } } if (show_frame) { sts = GetOutputSurface(pp_surface_out, p_surface_work, memId); MFX_CHECK_STS(sts); (*pp_surface_out)->Info.CropW = (*pp_surface_out)->Info.CropW ? (*pp_surface_out)->Info.CropW : m_on_init_video_params.mfx.FrameInfo.CropW; (*pp_surface_out)->Info.CropH = (*pp_surface_out)->Info.CropH ? (*pp_surface_out)->Info.CropH : m_on_init_video_params.mfx.FrameInfo.CropH; MFX_CHECK((*pp_surface_out)->Info.Width >= bs_width && (*pp_surface_out)->Info.Height >= bs_height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) SetFrameType(m_frame_info, **pp_surface_out); } else { sts = MFX_ERR_MORE_DATA_SUBMIT_TASK; if (p_surface_work) { pp_surface_out = nullptr; } else { m_memIdReadyToFree.push_back(memId); UMC::FrameMemID memIdToUnlock = -1; while ((memIdToUnlock = GetMemIdToUnlock()) != -1) { m_surface_source.get()->DecreaseReference(memIdToUnlock); } } } } while (sts == MFX_ERR_MORE_DATA_SUBMIT_TASK && !p_surface_work); if (pp_surface_out) { (*pp_surface_out)->Data.Corrupted = 0; (*pp_surface_out)->Data.FrameOrder = m_frameOrder; //(*pp_surface_out)->Data.FrameOrder = p_surface_work->Data.FrameOrder; m_frameOrder++; (*pp_surface_out)->Data.TimeStamp = p_bs->TimeStamp; (*pp_surface_out)->Info.FrameRateExtD = m_on_init_video_params.mfx.FrameInfo.FrameRateExtD; (*pp_surface_out)->Info.FrameRateExtN = m_on_init_video_params.mfx.FrameInfo.FrameRateExtN; (*pp_surface_out)->Info.AspectRatioW = 1; (*pp_surface_out)->Info.AspectRatioH = 1; (*pp_surface_out)->Info.PicStruct = m_on_init_video_params.mfx.FrameInfo.PicStruct; } p_entry_point->pRoutine = &VP8DECODERoutine; p_entry_point->pCompleteProc = &VP8CompleteProc; VP8DECODERoutineData* routineData = new VP8DECODERoutineData; routineData->decoder = this; routineData->memId = memId; if(pp_surface_out) routineData->surface_work = *pp_surface_out; p_entry_point->pState = routineData; p_entry_point->requiredNumThreads = 1; return sts; } // mfxStatus VideoDECODEVP8_HW::DecodeFrameCheck(mfxBitstream *p_bs, mfxFrameSurface1 *p_surface_work, mfxFrameSurface1 **pp_surface_out, MFX_ENTRY_POINT *p_entry_point) void VideoDECODEVP8_HW::UpdateSegmentation(MFX_VP8_BoolDecoder &dec) { uint32_t bits; int32_t i; int32_t j; int32_t res; bits = dec.decode(2); m_frame_info.updateSegmentMap = (uint8_t)bits >> 1; m_frame_info.updateSegmentData = (uint8_t)bits & 1; if (m_frame_info.updateSegmentData) { m_frame_info.segmentAbsMode = (uint8_t)dec.decode(); UMC_SET_ZERO(m_frame_info.segmentFeatureData); for (i = 0; i < VP8Defs::VP8_NUM_OF_MB_FEATURES; i++) { for (j = 0; j < VP8_MAX_NUM_OF_SEGMENTS; j++) { bits = (uint8_t)dec.decode(); if (bits) { bits = (uint8_t)dec.decode(8 - i); // 7 bits for ALT_QUANT, 6 - for ALT_LOOP_FILTER; +sign res = bits >> 1; if (bits & 1) res = -res; m_frame_info.segmentFeatureData[i][j] = (int8_t)res; } } } } if (m_frame_info.updateSegmentMap) { for (i = 0; i < VP8_NUM_OF_SEGMENT_TREE_PROBS; i++) { bits = (uint8_t)dec.decode(); if (bits) m_frame_info.segmentTreeProbabilities[i] = (uint8_t)dec.decode(8); else m_frame_info.segmentTreeProbabilities[i] = 255; } } } // VideoDECODEVP8_HW::UpdateSegmentation() void VideoDECODEVP8_HW::UpdateLoopFilterDeltas(MFX_VP8_BoolDecoder &dec) { uint8_t bits; int32_t i; int32_t res; for (i = 0; i < VP8Defs::VP8_NUM_OF_REF_FRAMES; i++) { if (dec.decode()) { bits = (uint8_t)dec.decode(7); res = bits >> 1; if (bits & 1) res = -res; m_frame_info.refLoopFilterDeltas[i] = (int8_t)res; } } for (i = 0; i < VP8_NUM_OF_MODE_LF_DELTAS; i++) { if (dec.decode()) { bits = (uint8_t)dec.decode(7); res = bits >> 1; if (bits & 1) res = -res; m_frame_info.modeLoopFilterDeltas[i] = (int8_t)res; } } } // VideoDECODEVP8_HW::UpdateLoopFilterDeltas() #define DECODE_DELTA_QP(dec, res, shift) \ { \ uint32_t mask = (1 << (shift - 1)); \ int32_t val; \ if (bits & mask) \ { \ bits = (bits << 5) | dec.decode(5); \ val = (int32_t)((bits >> shift) & 0xF); \ res = (bits & mask) ? -val : val; \ } \ } void VideoDECODEVP8_HW::DecodeInitDequantization(MFX_VP8_BoolDecoder &dec) { m_quantInfo.yacQP = (int32_t)dec.decode(7); m_quantInfo.ydcDeltaQP = 0; m_quantInfo.y2dcDeltaQP = 0; m_quantInfo.y2acDeltaQP = 0; m_quantInfo.uvdcDeltaQP = 0; m_quantInfo.uvacDeltaQP = 0; uint32_t bits = (uint8_t)dec.decode(5); if (bits) { DECODE_DELTA_QP(dec, m_quantInfo.ydcDeltaQP, 5) DECODE_DELTA_QP(dec, m_quantInfo.y2dcDeltaQP, 4) DECODE_DELTA_QP(dec, m_quantInfo.y2acDeltaQP, 3) DECODE_DELTA_QP(dec, m_quantInfo.uvdcDeltaQP, 2) DECODE_DELTA_QP(dec, m_quantInfo.uvacDeltaQP, 1) } int32_t qp; for(int32_t segment_id = 0; segment_id < VP8_MAX_NUM_OF_SEGMENTS; segment_id++) { if (m_frame_info.segmentationEnabled) { if (m_frame_info.segmentAbsMode) qp = m_frame_info.segmentFeatureData[VP8Defs::VP8_ALT_QUANT][segment_id]; else { qp = m_quantInfo.yacQP + m_frame_info.segmentFeatureData[VP8Defs::VP8_ALT_QUANT][segment_id]; qp = mfx::clamp(qp, 0, VP8_MAX_QP); } } else qp = m_quantInfo.yacQP; m_quantInfo.yacQ[segment_id] = qp; m_quantInfo.ydcQ[segment_id] = mfx::clamp(qp + m_quantInfo.ydcDeltaQP, 0, VP8_MAX_QP); m_quantInfo.y2acQ[segment_id] = mfx::clamp(qp + m_quantInfo.y2acDeltaQP, 0, VP8_MAX_QP); m_quantInfo.y2dcQ[segment_id] = mfx::clamp(qp + m_quantInfo.y2dcDeltaQP, 0, VP8_MAX_QP); m_quantInfo.uvacQ[segment_id] = mfx::clamp(qp + m_quantInfo.uvacDeltaQP, 0, VP8_MAX_QP); m_quantInfo.uvdcQ[segment_id] = mfx::clamp(qp + m_quantInfo.uvdcDeltaQP, 0, VP8_MAX_QP); } } mfxStatus VideoDECODEVP8_HW::DecodeFrameHeader(mfxBitstream *in) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VideoDECODEVP8_HW::DecodeFrameHeader"); using namespace VP8Defs; try { mfxU8* data_in = 0; mfxU8* data_in_end = 0; mfxU8 version; int width = 0; int height = 0; data_in = (uint8_t*)in->Data; if(!data_in) MFX_RETURN(MFX_ERR_NULL_PTR); data_in_end = data_in + in->DataLength; //suppose that Intraframes -> I_PICTURE ( == VP8_KEY_FRAME) // Interframes -> P_PICTURE m_frame_info.frameType = (data_in[0] & 1) ? UMC::P_PICTURE : UMC::I_PICTURE; // 1 bits version = (data_in[0] >> 1) & 0x7; // 3 bits m_frame_info.version = version; m_frame_info.showFrame = (data_in[0] >> 4) & 0x01; // 1 bits switch (version) { case 1: case 2: m_frame_info.interpolationFlags = VP8_BILINEAR_INTERP; break; case 3: m_frame_info.interpolationFlags = VP8_BILINEAR_INTERP | VP8_CHROMA_FULL_PEL; break; case 0: default: m_frame_info.interpolationFlags = 0; break; } mfxU32 first_partition_size = (data_in[0] >> 5) | // 19 bit (data_in[1] << 3) | (data_in[2] << 11); m_frame_info.firstPartitionSize = first_partition_size; m_frame_info.partitionSize[VP8_FIRST_PARTITION] = first_partition_size; data_in += 3; if (!m_refresh_info.refreshProbabilities) { m_frameProbs = m_frameProbs_saved; std::copy(reinterpret_cast(vp8_default_mv_contexts), reinterpret_cast(vp8_default_mv_contexts) + sizeof(vp8_default_mv_contexts), reinterpret_cast(m_frameProbs.mvContexts)); } if (first_partition_size > in->DataLength - 10) return MFX_ERR_MORE_DATA; if (m_frame_info.frameType == UMC::I_PICTURE) // if VP8_KEY_FRAME { if (!(VP8_START_CODE_FOUND(data_in))) // (0x9D && 0x01 && 0x2A) MFX_RETURN(MFX_ERR_UNKNOWN); width = ((data_in[4] << 8) | data_in[3]) & 0x3FFF; m_frame_info.h_scale = data_in[4] >> 6; height = ((data_in[6] << 8) | data_in[5]) & 0x3FFF; m_frame_info.v_scale = data_in[6] >> 6; m_frame_info.frameSize.width = width; m_frame_info.frameSize.height = height; width = (m_frame_info.frameSize.width + 15) & ~0xF; height = (m_frame_info.frameSize.height + 15) & ~0xF; if (width != m_frame_info.frameWidth || height != m_frame_info.frameHeight) { m_frame_info.frameWidth = (int16_t)width; m_frame_info.frameHeight = (int16_t)height; } data_in += 7; std::copy(reinterpret_cast(vp8_default_coeff_probs), reinterpret_cast(vp8_default_coeff_probs) + sizeof(vp8_default_coeff_probs), reinterpret_cast(m_frameProbs.coeff_probs)); UMC_SET_ZERO(m_frame_info.segmentFeatureData); m_frame_info.segmentAbsMode = 0; UMC_SET_ZERO(m_frame_info.refLoopFilterDeltas); UMC_SET_ZERO(m_frame_info.modeLoopFilterDeltas); m_refresh_info.refreshRefFrame = 3; // refresh alt+gold m_refresh_info.copy2Golden = 0; m_refresh_info.copy2Altref = 0; // restore default probabilities for Inter frames for (int i = 0; i < VP8Defs::VP8_NUM_MB_MODES_Y - 1; i++) m_frameProbs.mbModeProbY[i] = VP8Defs::vp8_mb_mode_y_probs[i]; for (int i = 0; i < VP8Defs::VP8_NUM_MB_MODES_UV - 1; i++) m_frameProbs.mbModeProbUV[i] = VP8Defs::vp8_mb_mode_uv_probs[i]; // restore default MV contexts std::copy(reinterpret_cast(VP8Defs::vp8_default_mv_contexts), reinterpret_cast(VP8Defs::vp8_default_mv_contexts) + sizeof(VP8Defs::vp8_default_mv_contexts), reinterpret_cast(m_frameProbs.mvContexts)); } if ((int32_t) (data_in_end - data_in) < 4) throw vp8_exception(MFX_ERR_MORE_DATA); m_boolDecoder[VP8_FIRST_PARTITION].init(data_in, (int32_t) (data_in_end - data_in)); if (m_frame_info.frameType == UMC::I_PICTURE) // if VP8_KEY_FRAME { uint32_t bits = m_boolDecoder[VP8_FIRST_PARTITION].decode(2); m_frame_info.color_space_type = (uint8_t)(bits >> 1); m_frame_info.clamping_type = (uint8_t)(bits & 1); // supported only color_space_type == 0 // see "VP8 Data Format and Decoding Guide" ch.9.2 if(m_frame_info.color_space_type) MFX_RETURN(MFX_ERR_UNSUPPORTED); } m_frame_info.segmentationEnabled = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(); if (m_frame_info.segmentationEnabled) { UpdateSegmentation(m_boolDecoder[VP8_FIRST_PARTITION]); } else { m_frame_info.updateSegmentData = 0; m_frame_info.updateSegmentMap = 0; } mfxU8 bits = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(7); m_frame_info.loopFilterType = bits >> 6; m_frame_info.loopFilterLevel = bits & 0x3F; bits = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(4); m_frame_info.sharpnessLevel = bits >> 1; m_frame_info.mbLoopFilterAdjust = bits & 1; m_frame_info.modeRefLoopFilterDeltaUpdate = 0; if (m_frame_info.mbLoopFilterAdjust) { m_frame_info.modeRefLoopFilterDeltaUpdate = (uint8_t)m_boolDecoder[VP8Defs::VP8_FIRST_PARTITION].decode(); if (m_frame_info.modeRefLoopFilterDeltaUpdate) { UpdateLoopFilterDeltas(m_boolDecoder[VP8_FIRST_PARTITION]); } } mfxU32 partitions; bits = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(2); m_CodedCoeffTokenPartition = bits; partitions = 1 << bits; m_frame_info.numTokenPartitions = 1 << bits; m_frame_info.numPartitions = m_frame_info.numTokenPartitions; partitions = m_frame_info.numPartitions; mfxU8 *pTokenPartition = data_in + first_partition_size; if (partitions > 1) { m_frame_info.partitionStart[0] = pTokenPartition + (partitions - 1) * 3; if (m_frame_info.partitionStart[0] > data_in_end) MFX_RETURN(MFX_ERR_MORE_DATA); for (uint32_t i = 0; i < partitions - 1; i++) { m_frame_info.partitionSize[i] = (int32_t)(pTokenPartition[0]) | (pTokenPartition[1] << 8) | (pTokenPartition[2] << 16); pTokenPartition += 3; m_frame_info.partitionStart[i+1] = m_frame_info.partitionStart[i] + m_frame_info.partitionSize[i]; if (m_frame_info.partitionStart[i+1] > data_in_end) MFX_RETURN(MFX_ERR_MORE_DATA); //??? m_boolDecoder[i + 1].init(m_frame_info.partitionStart[i], m_frame_info.partitionSize[i]); } } else { m_frame_info.partitionStart[0] = pTokenPartition; } m_frame_info.partitionSize[partitions - 1] = int32_t(data_in_end - m_frame_info.partitionStart[partitions - 1]); m_boolDecoder[partitions].init(m_frame_info.partitionStart[partitions - 1], m_frame_info.partitionSize[partitions - 1]); DecodeInitDequantization(m_boolDecoder[VP8_FIRST_PARTITION]); if (m_frame_info.frameType != UMC::I_PICTURE) // data in header for non-KEY frames { m_refresh_info.refreshRefFrame = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(2); if (!(m_refresh_info.refreshRefFrame & 2)) m_refresh_info.copy2Golden = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(2); if (!(m_refresh_info.refreshRefFrame & 1)) m_refresh_info.copy2Altref = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(2); uint8_t bias = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(2); m_refresh_info.refFrameBiasTable[1] = (bias & 1)^(bias >> 1); // ALTREF and GOLD (3^2 = 1) m_refresh_info.refFrameBiasTable[2] = (bias & 1); // ALTREF and LAST m_refresh_info.refFrameBiasTable[3] = (bias >> 1); // GOLD and LAST } m_refresh_info.refreshProbabilities = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(); if (!m_refresh_info.refreshProbabilities) m_frameProbs_saved = m_frameProbs; if (m_frame_info.frameType != UMC::I_PICTURE) { m_refresh_info.refreshLastFrame = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(); } else m_refresh_info.refreshLastFrame = 1; for (int i = 0; i < VP8_NUM_COEFF_PLANES; i++) { for (int j = 0; j < VP8_NUM_COEFF_BANDS; j++) { for (int k = 0; k < VP8_NUM_LOCAL_COMPLEXITIES; k++) { for (int l = 0; l < VP8_NUM_COEFF_NODES; l++) { mfxU8 prob = vp8_coeff_update_probs[i][j][k][l]; mfxU8 flag = (uint8_t)m_boolDecoder[VP8Defs::VP8_FIRST_PARTITION].decode(1, prob); if (flag) m_frameProbs.coeff_probs[i][j][k][l] = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(8); } } } } m_frame_info.mbSkipEnabled = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(); m_frame_info.skipFalseProb = 0; if (m_frame_info.mbSkipEnabled) m_frame_info.skipFalseProb = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(8); if (m_frame_info.frameType != UMC::I_PICTURE) { m_frame_info.intraProb = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(8); m_frame_info.lastProb = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(8); m_frame_info.goldProb = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(8); if (m_boolDecoder[VP8_FIRST_PARTITION].decode()) { int i = 0; do { m_frameProbs.mbModeProbY[i] = uint8_t(m_boolDecoder[VP8_FIRST_PARTITION].decode(8)); } while (++i < 4); } if (m_boolDecoder[VP8_FIRST_PARTITION].decode()) { int i = 0; do { m_frameProbs.mbModeProbUV[i] = uint8_t(m_boolDecoder[VP8_FIRST_PARTITION].decode(8)); } while (++i < 3); } int i = 0; do { mfxU8 *up = (uint8_t *)&vp8_mv_update_probs[i]; mfxU8 *p = m_frameProbs.mvContexts[i]; mfxU8 *pstop = p + 19; do { if (m_boolDecoder[VP8_FIRST_PARTITION].decode(1, *up++)) { const uint8_t x = (uint8_t)m_boolDecoder[VP8_FIRST_PARTITION].decode(7); *p = x ? x << 1 : 1; } } while (++p < pstop); } while (++i < 2); } // Header info consumed bits m_frame_info.entropyDecSize = m_boolDecoder[VP8_FIRST_PARTITION].pos() * 8 - 3 * 8 - m_boolDecoder[VP8_FIRST_PARTITION].bitcount(); // Subtract completely consumed bytes + current byte. Current is completely consumed if bitcount is 8. m_frame_info.firstPartitionSize = first_partition_size - ((m_frame_info.entropyDecSize + 7) >> 3); } catch(const vp8_exception & ex) { mfxStatus sts = (mfxStatus)ex.GetStatus(); MFX_RETURN(sts); } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::GetFrame(UMC::MediaData* /*in*/, UMC::FrameData** /*out*/) { return MFX_ERR_NONE; } mfxTaskThreadingPolicy VideoDECODEVP8_HW::GetThreadingPolicy() { return MFX_TASK_THREADING_INTRA; } mfxStatus VideoDECODEVP8_HW::GetVideoParam(mfxVideoParam *pPar) { if (!m_is_initialized) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pPar); pPar->mfx = m_on_init_video_params.mfx; pPar->Protected = m_on_init_video_params.Protected; pPar->IOPattern = m_on_init_video_params.IOPattern; pPar->AsyncDepth = m_on_init_video_params.AsyncDepth; pPar->mfx.FrameInfo.FrameRateExtD = m_on_init_video_params.mfx.FrameInfo.FrameRateExtD; pPar->mfx.FrameInfo.FrameRateExtN = m_on_init_video_params.mfx.FrameInfo.FrameRateExtN; pPar->mfx.FrameInfo.AspectRatioH = m_on_init_video_params.mfx.FrameInfo.AspectRatioH; pPar->mfx.FrameInfo.AspectRatioW = m_on_init_video_params.mfx.FrameInfo.AspectRatioW; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::GetDecodeStat(mfxDecodeStat *pStat) { if (!m_is_initialized) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pStat); m_stat.NumSkippedFrame = 0; m_stat.NumCachedFrame = 0; *pStat = m_stat; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::DecodeFrame(mfxBitstream *, mfxFrameSurface1 *, mfxFrameSurface1 *) { return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::GetUserData(mfxU8 *pUserData, mfxU32 *pSize, mfxU64 *pTimeStamp) { if (!m_is_initialized) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(pUserData, pSize, pTimeStamp); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEVP8_HW::GetPayload(mfxU64 *pTimeStamp, mfxPayload *pPayload) { if (!m_is_initialized) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(pTimeStamp, pPayload, pPayload->Data); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEVP8_HW::SetSkipMode(mfxSkipMode /*mode*/) { if (!m_is_initialized) MFX_RETURN(MFX_ERR_NOT_INITIALIZED); return MFX_ERR_NONE; } mfxStatus VideoDECODEVP8_HW::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } ////////////////////////////////////////////////////////////////////////////// // MFX_VP8_BoolDecoder const int MFX_VP8_BoolDecoder::range_normalization_shift[64] = { 7, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; #endif //MFX_ENABLE_VP8_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/src/mfx_vp8_dec_decode_hw_vaapi.cpp000066400000000000000000000345101443134507600331760ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) #include "mfx_common_decode_int.h" #include "mfx_vp8_dec_decode_hw.h" #include "mfx_enc_common.h" #include "umc_va_base.h" #include #include #include #include #include #include "mfx_vp8_dec_decode_common.h" mfxStatus VideoDECODEVP8_HW::PackHeaders(mfxBitstream *p_bistream) { using namespace VP8Defs; mfxStatus sts = MFX_ERR_NONE; sFrameInfo info = m_frames.back(); ///////////////////////////////////////////////////////////////////////////////////////// UMC::UMCVACompBuffer* compBufPic; VAPictureParameterBufferVP8 *picParams = (VAPictureParameterBufferVP8*)m_p_video_accelerator->GetCompBuffer(VAPictureParameterBufferType, &compBufPic, sizeof(VAPictureParameterBufferVP8)); //frame width in pixels picParams->frame_width = m_frame_info.frameSize.width; //frame height in pixels picParams->frame_height = m_frame_info.frameSize.height; picParams->pic_fields.value = 0; if (UMC::I_PICTURE == m_frame_info.frameType) { //0 means key_frame picParams->pic_fields.bits.key_frame = 0; picParams->last_ref_frame = VA_INVALID_SURFACE; picParams->golden_ref_frame = VA_INVALID_SURFACE; picParams->alt_ref_frame = VA_INVALID_SURFACE; picParams->out_of_loop_frame = VA_INVALID_SURFACE; } else // inter frame { picParams->pic_fields.bits.key_frame = 1; picParams->last_ref_frame = m_p_video_accelerator->GetSurfaceID(info.lastrefIndex); picParams->golden_ref_frame = m_p_video_accelerator->GetSurfaceID(info.goldIndex); picParams->alt_ref_frame = m_p_video_accelerator->GetSurfaceID(info.altrefIndex); picParams->out_of_loop_frame = VA_INVALID_SURFACE; } //same as version in bitstream syntax picParams->pic_fields.bits.version = m_frame_info.version; //same as segmentation_enabled in bitstream syntax picParams->pic_fields.bits.segmentation_enabled = m_frame_info.segmentationEnabled; //same as update_mb_segmentation_map in bitstream syntax picParams->pic_fields.bits.update_mb_segmentation_map = m_frame_info.updateSegmentMap; //same as update_segment_feature_data in bitstream syntax picParams->pic_fields.bits.update_segment_feature_data = m_frame_info.updateSegmentData; //same as filter_type in bitstream syntax picParams->pic_fields.bits.filter_type = m_frame_info.loopFilterType; //same as sharpness_level in bitstream syntax picParams->pic_fields.bits.sharpness_level = m_frame_info.sharpnessLevel; //same as loop_filter_adj_enable in bitstream syntax picParams->pic_fields.bits.loop_filter_adj_enable = m_frame_info.mbLoopFilterAdjust; //same as mode_ref_lf_delta_update in bitstream syntax picParams->pic_fields.bits.mode_ref_lf_delta_update = m_frame_info.modeRefLoopFilterDeltaUpdate; //same as sign_bias_golden in bitstream syntax picParams->pic_fields.bits.sign_bias_golden = 0; //same as sign_bias_alternate in bitstream syntax picParams->pic_fields.bits.sign_bias_alternate = 0; if (UMC::I_PICTURE != m_frame_info.frameType) { picParams->pic_fields.bits.sign_bias_golden = m_refresh_info.refFrameBiasTable[3]; picParams->pic_fields.bits.sign_bias_alternate = m_refresh_info.refFrameBiasTable[2]; } //same as mb_no_coeff_skip in bitstream syntax picParams->pic_fields.bits.mb_no_coeff_skip = m_frame_info.mbSkipEnabled; //flag to indicate that loop filter should be disabled picParams->pic_fields.bits.loop_filter_disable = 0; if (m_frame_info.loopFilterLevel == 0 || (m_frame_info.version == 2 || m_frame_info.version == 3)) { picParams->pic_fields.bits.loop_filter_disable = 1; } // probabilities of the segment_id decoding tree and same as // mb_segment_tree_probs in the spec. picParams->mb_segment_tree_probs[0] = m_frame_info.segmentTreeProbabilities[0]; picParams->mb_segment_tree_probs[1] = m_frame_info.segmentTreeProbabilities[1]; picParams->mb_segment_tree_probs[2] = m_frame_info.segmentTreeProbabilities[2]; if (m_frame_info.segmentationEnabled) { for (int i = 0; i < 4; i++) { if (m_frame_info.segmentAbsMode) picParams->loop_filter_level[i] = m_frame_info.segmentFeatureData[VP8_ALT_LOOP_FILTER][i]; else { picParams->loop_filter_level[i] = m_frame_info.loopFilterLevel + m_frame_info.segmentFeatureData[VP8_ALT_LOOP_FILTER][i]; picParams->loop_filter_level[i] = (picParams->loop_filter_level[i] >= 0) ? ((picParams->loop_filter_level[i] <= 63) ? picParams->loop_filter_level[i] : 63) : 0; } } } else { picParams->loop_filter_level[0] = m_frame_info.loopFilterLevel; picParams->loop_filter_level[1] = m_frame_info.loopFilterLevel; picParams->loop_filter_level[2] = m_frame_info.loopFilterLevel; picParams->loop_filter_level[3] = m_frame_info.loopFilterLevel; } //loop filter deltas for reference frame based MB level adjustment picParams->loop_filter_deltas_ref_frame[0] = m_frame_info.refLoopFilterDeltas[0]; picParams->loop_filter_deltas_ref_frame[1] = m_frame_info.refLoopFilterDeltas[1]; picParams->loop_filter_deltas_ref_frame[2] = m_frame_info.refLoopFilterDeltas[2]; picParams->loop_filter_deltas_ref_frame[3] = m_frame_info.refLoopFilterDeltas[3]; //loop filter deltas for coding mode based MB level adjustment picParams->loop_filter_deltas_mode[0] = m_frame_info.modeLoopFilterDeltas[0]; picParams->loop_filter_deltas_mode[1] = m_frame_info.modeLoopFilterDeltas[1]; picParams->loop_filter_deltas_mode[2] = m_frame_info.modeLoopFilterDeltas[2]; picParams->loop_filter_deltas_mode[3] = m_frame_info.modeLoopFilterDeltas[3]; //same as prob_skip_false in bitstream syntax picParams->prob_skip_false = m_frame_info.skipFalseProb; //same as prob_intra in bitstream syntax picParams->prob_intra = m_frame_info.intraProb; //same as prob_last in bitstream syntax picParams->prob_last = m_frame_info.lastProb; //same as prob_gf in bitstream syntax picParams->prob_gf = m_frame_info.goldProb; //list of 4 probabilities of the luma intra prediction mode decoding //tree and same as y_mode_probs in frame header //list of 3 probabilities of the chroma intra prediction mode decoding //tree and same as uv_mode_probs in frame header const mfxU8 *prob_y_table; const mfxU8 *prob_uv_table; if (UMC::I_PICTURE == m_frame_info.frameType) { prob_y_table = vp8_kf_mb_mode_y_probs; prob_uv_table = vp8_kf_mb_mode_uv_probs; } else { prob_y_table = m_frameProbs.mbModeProbY; prob_uv_table = m_frameProbs.mbModeProbUV; } for (uint32_t i = 0; i < VP8_NUM_MB_MODES_Y - 1; i += 1) { picParams->y_mode_probs[i] = prob_y_table[i]; } for (uint32_t i = 0; i < VP8_NUM_MB_MODES_UV - 1; i += 1) { picParams->uv_mode_probs[i] = prob_uv_table[i]; } //updated mv decoding probabilities and same as mv_probs in frame header for (uint32_t i = 0; i < VP8_NUM_MV_PROBS; i += 1) { picParams->mv_probs[0][i] = m_frameProbs.mvContexts[0][i]; picParams->mv_probs[1][i] = m_frameProbs.mvContexts[1][i]; } // Note that va says that count is a number of remained bits in value, // but in fact when count is 0 it does need next byte in value. That is what we have. picParams->bool_coder_ctx.range = m_boolDecoder[VP8_FIRST_PARTITION].range(); picParams->bool_coder_ctx.value = (m_boolDecoder[VP8_FIRST_PARTITION].value() >> 24) & 0xff; picParams->bool_coder_ctx.count = m_boolDecoder[VP8_FIRST_PARTITION].bitcount() & 0x7; compBufPic->SetDataSize(sizeof(VAPictureParameterBufferVP8)); ////////////////////////////////////////////////////////////////// UMC::UMCVACompBuffer* compBufCp; VAProbabilityDataBufferVP8 *coeffProbs = (VAProbabilityDataBufferVP8*)m_p_video_accelerator-> GetCompBuffer(VAProbabilityBufferType, &compBufCp, sizeof(VAProbabilityDataBufferVP8)); std::copy(reinterpret_cast(m_frameProbs.coeff_probs), reinterpret_cast(m_frameProbs.coeff_probs) + sizeof(m_frameProbs.coeff_probs), reinterpret_cast(coeffProbs)); compBufCp->SetDataSize(sizeof(VAProbabilityDataBufferVP8)); ////////////////////////////////////////////////////////////////// UMC::UMCVACompBuffer* compBufQm; VAIQMatrixBufferVP8 *qmTable = (VAIQMatrixBufferVP8*)m_p_video_accelerator-> GetCompBuffer(VAIQMatrixBufferType, &compBufQm, sizeof(VAIQMatrixBufferVP8)); if (m_frame_info.segmentationEnabled == 0) { // when segmentation is disabled, use the first entry 0 for the quantization values qmTable->quantization_index[0][1] = (unsigned char)m_quantInfo.ydcQ[0]; qmTable->quantization_index[0][0] = (unsigned char)m_quantInfo.yacQ[0]; qmTable->quantization_index[0][4] = (unsigned char)m_quantInfo.uvdcQ[0]; qmTable->quantization_index[0][5] = (unsigned char)m_quantInfo.uvacQ[0]; qmTable->quantization_index[0][2] = (unsigned char)m_quantInfo.y2dcQ[0]; qmTable->quantization_index[0][3] = (unsigned char)m_quantInfo.y2acQ[0]; } else { for (uint32_t i = 0; i < 4; i += 1) { qmTable->quantization_index[i][1] = (unsigned char)m_quantInfo.ydcQ[i]; qmTable->quantization_index[i][0] = (unsigned char)m_quantInfo.yacQ[i]; qmTable->quantization_index[i][4] = (unsigned char)m_quantInfo.uvdcQ[i]; qmTable->quantization_index[i][5] = (unsigned char)m_quantInfo.uvacQ[i]; qmTable->quantization_index[i][2] = (unsigned char)m_quantInfo.y2dcQ[i]; qmTable->quantization_index[i][3] = (unsigned char)m_quantInfo.y2acQ[i]; } } compBufQm->SetDataSize(sizeof(VAIQMatrixBufferVP8)); ////////////////////////////////////////////////////////////////// uint32_t offset = 0; if (UMC::I_PICTURE == m_frame_info.frameType) offset = 10; else offset = 3; int32_t size = p_bistream->DataLength; UMC::UMCVACompBuffer* compBufSlice; VASliceParameterBufferVP8 *sliceParams = (VASliceParameterBufferVP8*)m_p_video_accelerator-> GetCompBuffer(VASliceParameterBufferType, &compBufSlice, sizeof(VASliceParameterBufferVP8)); /* | first_part_size | |<----------------------------------->| slice_data_offset |macroblock_offset| |partition_size[0]| num_of_partitions=N+1 ------------------------->|<--------------->| |<--------------->| // counts both control and token partitions | | |<--byte boudary | |-------------------------|---------------|-|-|-----------------|--------------------|-----|----------------------| | Uncompressed data chunk | Header info |X|X| Pre-MB info | Token Partition 0 | ... | Token Partition N-1 | |-------------------------|---------------|-|-|-----------------|--------------------|-----|----------------------| / | \ |------------------------------------| |used_bits |remaining_bits_in_context| |<-------->|<----------------------->| bool_coder_ctx.count */ // number of bytes in the slice data buffer for the partitions sliceParams->slice_data_size = (int32_t)size - offset; //offset to the first byte of partition data sliceParams->slice_data_offset = 0; //see VA_SLICE_DATA_FLAG_XXX definitions sliceParams->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; //offset to the first bit of MB from the first byte of partition data sliceParams->macroblock_offset = m_frame_info.entropyDecSize; // Partitions sliceParams->num_of_partitions = m_frame_info.numPartitions + 1; sliceParams->partition_size[0] = m_frame_info.firstPartitionSize; for (int32_t i = 1; i < m_frame_info.numPartitions + 1; i += 1) { sliceParams->partition_size[i] = m_frame_info.partitionSize[i - 1]; } compBufSlice->SetDataSize(sizeof(VASliceParameterBufferVP8)); ////////////////////////////////////////////////////////////////// UMC::UMCVACompBuffer* compBufBs; MFX_CHECK(p_bistream->DataLength > offset, MFX_ERR_INVALID_VIDEO_PARAM); uint8_t *bistreamData = (uint8_t *)m_p_video_accelerator->GetCompBuffer(VASliceDataBufferType, &compBufBs, p_bistream->DataLength - offset); uint8_t *pBuffer = (uint8_t*) p_bistream->Data; std::copy(pBuffer + offset, pBuffer + size, bistreamData); compBufBs->SetDataSize((int32_t)size - offset); return sts; } // Status VP8VideoDecoderHardware::PackHeaders(MediaData* src) #endif //MFX_ENABLE_VP8_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp8/src/mfx_vp8_dec_decode_tables.cpp000066400000000000000000000647551443134507600326700ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) #include "mfx_vp8_dec_decode_vp8_defs.h" namespace VP8Defs { const uint8_t vp8_kf_mb_mode_y_probs[VP8_NUM_MB_MODES_Y - 1] = {145, 156, 163, 128}; const uint8_t vp8_kf_mb_mode_uv_probs[VP8_NUM_MB_MODES_UV - 1] = {142, 114, 183}; const uint8_t vp8_kf_block_mode_probs[VP8_NUM_INTRA_BLOCK_MODES][VP8_NUM_INTRA_BLOCK_MODES][VP8_NUM_INTRA_BLOCK_MODES-1] = { { { 231, 120, 48, 89, 115, 113, 120, 152, 112}, { 152, 179, 64, 126, 170, 118, 46, 70, 95}, { 175, 69, 143, 80, 85, 82, 72, 155, 103}, { 56, 58, 10, 171, 218, 189, 17, 13, 152}, { 144, 71, 10, 38, 171, 213, 144, 34, 26}, { 114, 26, 17, 163, 44, 195, 21, 10, 173}, { 121, 24, 80, 195, 26, 62, 44, 64, 85}, { 170, 46, 55, 19, 136, 160, 33, 206, 71}, { 63, 20, 8, 114, 114, 208, 12, 9, 226}, { 81, 40, 11, 96, 182, 84, 29, 16, 36} }, { { 134, 183, 89, 137, 98, 101, 106, 165, 148}, { 72, 187, 100, 130, 157, 111, 32, 75, 80}, { 66, 102, 167, 99, 74, 62, 40, 234, 128}, { 41, 53, 9, 178, 241, 141, 26, 8, 107}, { 104, 79, 12, 27, 217, 255, 87, 17, 7}, { 74, 43, 26, 146, 73, 166, 49, 23, 157}, { 65, 38, 105, 160, 51, 52, 31, 115, 128}, { 87, 68, 71, 44, 114, 51, 15, 186, 23}, { 47, 41, 14, 110, 182, 183, 21, 17, 194}, { 66, 45, 25, 102, 197, 189, 23, 18, 22} }, { { 88, 88, 147, 150, 42, 46, 45, 196, 205}, { 43, 97, 183, 117, 85, 38, 35, 179, 61}, { 39, 53, 200, 87, 26, 21, 43, 232, 171}, { 56, 34, 51, 104, 114, 102, 29, 93, 77}, { 107, 54, 32, 26, 51, 1, 81, 43, 31}, { 39, 28, 85, 171, 58, 165, 90, 98, 64}, { 34, 22, 116, 206, 23, 34, 43, 166, 73}, { 68, 25, 106, 22, 64, 171, 36, 225, 114}, { 34, 19, 21, 102, 132, 188, 16, 76, 124}, { 62, 18, 78, 95, 85, 57, 50, 48, 51} }, { { 193, 101, 35, 159, 215, 111, 89, 46, 111}, { 60, 148, 31, 172, 219, 228, 21, 18, 111}, { 112, 113, 77, 85, 179, 255, 38, 120, 114}, { 40, 42, 1, 196, 245, 209, 10, 25, 109}, { 100, 80, 8, 43, 154, 1, 51, 26, 71}, { 88, 43, 29, 140, 166, 213, 37, 43, 154}, { 61, 63, 30, 155, 67, 45, 68, 1, 209}, { 142, 78, 78, 16, 255, 128, 34, 197, 171}, { 41, 40, 5, 102, 211, 183, 4, 1, 221}, { 51, 50, 17, 168, 209, 192, 23, 25, 82} }, { { 125, 98, 42, 88, 104, 85, 117, 175, 82}, { 95, 84, 53, 89, 128, 100, 113, 101, 45}, { 75, 79, 123, 47, 51, 128, 81, 171, 1}, { 57, 17, 5, 71, 102, 57, 53, 41, 49}, { 115, 21, 2, 10, 102, 255, 166, 23, 6}, { 38, 33, 13, 121, 57, 73, 26, 1, 85}, { 41, 10, 67, 138, 77, 110, 90, 47, 114}, { 101, 29, 16, 10, 85, 128, 101, 196, 26}, { 57, 18, 10, 102, 102, 213, 34, 20, 43}, { 117, 20, 15, 36, 163, 128, 68, 1, 26} }, { { 138, 31, 36, 171, 27, 166, 38, 44, 229}, { 67, 87, 58, 169, 82, 115, 26, 59, 179}, { 63, 59, 90, 180, 59, 166, 93, 73, 154}, { 40, 40, 21, 116, 143, 209, 34, 39, 175}, { 57, 46, 22, 24, 128, 1, 54, 17, 37}, { 47, 15, 16, 183, 34, 223, 49, 45, 183}, { 46, 17, 33, 183, 6, 98, 15, 32, 183}, { 65, 32, 73, 115, 28, 128, 23, 128, 205}, { 40, 3, 9, 115, 51, 192, 18, 6, 223}, { 87, 37, 9, 115, 59, 77, 64, 21, 47} }, { { 104, 55, 44, 218, 9, 54, 53, 130, 226}, { 64, 90, 70, 205, 40, 41, 23, 26, 57}, { 54, 57, 112, 184, 5, 41, 38, 166, 213}, { 30, 34, 26, 133, 152, 116, 10, 32, 134}, { 75, 32, 12, 51, 192, 255, 160, 43, 51}, { 39, 19, 53, 221, 26, 114, 32, 73, 255}, { 31, 9, 65, 234, 2, 15, 1, 118, 73}, { 88, 31, 35, 67, 102, 85, 55, 186, 85}, { 56, 21, 23, 111, 59, 205, 45, 37, 192}, { 55, 38, 70, 124, 73, 102, 1, 34, 98} }, { { 102, 61, 71, 37, 34, 53, 31, 243, 192}, { 69, 60, 71, 38, 73, 119, 28, 222, 37}, { 68, 45, 128, 34, 1, 47, 11, 245, 171}, { 62, 17, 19, 70, 146, 85, 55, 62, 70}, { 75, 15, 9, 9, 64, 255, 184, 119, 16}, { 37, 43, 37, 154, 100, 163, 85, 160, 1}, { 63, 9, 92, 136, 28, 64, 32, 201, 85}, { 86, 6, 28, 5, 64, 255, 25, 248, 1}, { 56, 8, 17, 132, 137, 255, 55, 116, 128}, { 58, 15, 20, 82, 135, 57, 26, 121, 40} }, { { 164, 50, 31, 137, 154, 133, 25, 35, 218}, { 51, 103, 44, 131, 131, 123, 31, 6, 158}, { 86, 40, 64, 135, 148, 224, 45, 183, 128}, { 22, 26, 17, 131, 240, 154, 14, 1, 209}, { 83, 12, 13, 54, 192, 255, 68, 47, 28}, { 45, 16, 21, 91, 64, 222, 7, 1, 197}, { 56, 21, 39, 155, 60, 138, 23, 102, 213}, { 85, 26, 85, 85, 128, 128, 32, 146, 171}, { 18, 11, 7, 63, 144, 171, 4, 4, 246}, { 35, 27, 10, 146, 174, 171, 12, 26, 128} }, { { 190, 80, 35, 99, 180, 80, 126, 54, 45}, { 85, 126, 47, 87, 176, 51, 41, 20, 32}, { 101, 75, 128, 139, 118, 146, 116, 128, 85}, { 56, 41, 15, 176, 236, 85, 37, 9, 62}, { 146, 36, 19, 30, 171, 255, 97, 27, 20}, { 71, 30, 17, 119, 118, 255, 17, 18, 138}, { 101, 38, 60, 138, 55, 70, 43, 26, 142}, { 138, 45, 61, 62, 219, 1, 81, 188, 64}, { 32, 41, 20, 117, 151, 142, 20, 21, 163}, { 112, 19, 12, 61, 195, 128, 48, 4, 24} } }; const uint8_t vp8_mb_mode_y_probs[VP8_NUM_MB_MODES_Y - 1] = {112, 86, 140, 37}; const uint8_t vp8_mb_mode_uv_probs[VP8_NUM_MB_MODES_UV - 1] = {162, 101, 204}; const uint8_t vp8_block_mode_probs [VP8_NUM_INTRA_BLOCK_MODES - 1] = { 120, 90, 79, 133, 87, 85, 80, 111, 151 }; const uint8_t vp8_default_coeff_probs[VP8_NUM_COEFF_PLANES][VP8_NUM_COEFF_BANDS][VP8_NUM_LOCAL_COMPLEXITIES][VP8_NUM_COEFF_NODES] = { { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128} }, { { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128}, { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128}, { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128} }, { { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128}, { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128}, { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128} }, { { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128}, { 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128}, { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128} }, { { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128}, { 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128}, { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128} }, { { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128}, { 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128}, { 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128} }, { { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128}, { 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128}, { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128} }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128} } }, { { { 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62}, { 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1}, { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128} }, { { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128}, { 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128}, { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128} }, { { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128}, { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128}, { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128} }, { { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128}, { 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128}, { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128} }, { { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128}, { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128}, { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128} }, { { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128}, { 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128}, { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128} }, { { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128}, { 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128}, { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128} }, { { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128}, { 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128}, { 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128} } }, { { { 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128}, { 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128}, { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128} }, { { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128}, { 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128}, { 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128} }, { { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128}, { 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128}, { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128} }, { { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128}, { 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128}, { 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128} }, { { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128}, { 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128}, { 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128} }, { { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128} }, { { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128}, { 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128}, { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128} }, { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128} } }, { { { 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255}, { 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128}, { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128} }, { { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128}, { 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128}, { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128} }, { { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128}, { 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128}, { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128} }, { { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128}, { 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128}, { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128} }, { { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128}, { 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128}, { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128} }, { { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128}, { 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128}, { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128} }, { { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128}, { 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128}, { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128} }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128}, { 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128} } } }; const uint8_t vp8_coeff_update_probs[VP8_NUM_COEFF_PLANES][VP8_NUM_COEFF_BANDS][VP8_NUM_LOCAL_COMPLEXITIES][VP8_NUM_COEFF_NODES] = { { { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255}, { 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255}, { 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255}, { 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255}, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} } }, { { { 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255}, { 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255} }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} } }, { { { 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255}, { 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255}, { 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255} }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} } }, { { { 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255}, { 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255} }, { { 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255}, { 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255}, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255} } } }; const int8_t vp8_mb_mode_y_tree[2*(VP8_NUM_MB_MODES_Y - 1)] = { -VP8_MB_DC_PRED, 2, 4, 6, -VP8_MB_V_PRED, -VP8_MB_H_PRED, -VP8_MB_TM_PRED, -VP8_MB_B_PRED }; const int8_t vp8_kf_mb_mode_y_tree[2*(VP8_NUM_MB_MODES_Y - 1)] = { -VP8_MB_B_PRED, 2, 4, 6, -VP8_MB_DC_PRED, -VP8_MB_V_PRED, -VP8_MB_H_PRED, -VP8_MB_TM_PRED }; const int8_t vp8_mb_mode_uv_tree[2*(VP8_NUM_MB_MODES_UV - 1)] = { -VP8_MB_DC_PRED, 2, -VP8_MB_V_PRED, 4, -VP8_MB_H_PRED, -VP8_MB_TM_PRED }; const int8_t vp8_block_mode_tree[2*(VP8_NUM_INTRA_BLOCK_MODES - 1)] = { -VP8_B_DC_PRED, 2, /* B_DC_PRED = "0" */ -VP8_B_TM_PRED, 4, /* B_TM_PRED = "10" */ -VP8_B_VE_PRED, 6, /* B_VE_PRED = "110" */ 8, 12, -VP8_B_HE_PRED, 10, /* B_HE_PRED = "1110" */ -VP8_B_RD_PRED, -VP8_B_VR_PRED, /* B_RD_PRED = "111100", B_VR_PRED = "111101" */ -VP8_B_LD_PRED, 14, /* B_LD_PRED = "111110" */ -VP8_B_VL_PRED, 16, /* B_VL_PRED = "1111110" */ -VP8_B_HD_PRED, -VP8_B_HU_PRED /* HD = "11111110", HU = "11111111" */ }; const uint32_t vp8_mbmode_2_blockmode_u32[VP8_NUM_MB_MODES_Y] = { (VP8_B_DC_PRED << 24) | (VP8_B_DC_PRED << 16) | (VP8_B_DC_PRED << 8) | VP8_B_DC_PRED, (VP8_B_VE_PRED << 24) | (VP8_B_VE_PRED << 16) | (VP8_B_VE_PRED << 8) | VP8_B_VE_PRED, (VP8_B_HE_PRED << 24) | (VP8_B_HE_PRED << 16) | (VP8_B_HE_PRED << 8) | VP8_B_HE_PRED, (VP8_B_TM_PRED << 24) | (VP8_B_TM_PRED << 16) | (VP8_B_TM_PRED << 8) | VP8_B_TM_PRED, (VP8_B_DC_PRED << 24) | (VP8_B_DC_PRED << 16) | (VP8_B_DC_PRED << 8) | VP8_B_DC_PRED }; const uint8_t vp8_mv_update_probs[2][VP8_NUM_MV_PROBS] = { { 237, 246, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 250, 250, 252, 254, 254 }, { 231, 243, 245, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 251, 251, 254, 254, 254 } }; const uint8_t vp8_default_mv_contexts[2][VP8_NUM_MV_PROBS] = { { // y 162, // is short 128, // sign 225, 146, 172, 147, 214, 39, 156, // short tree 128, 129, 132, 75, 145, 178, 206, 239, 254, 254 // long bits }, { // x 164, 128, 204, 170, 119, 235, 140, 230, 228, 128, 130, 130, 74, 148, 180, 203, 236, 254, 254 // long bits } }; //???? const uint8_t vp8_ClampTbl[768] = { 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0x06 ,0x07 ,0x08 ,0x09 ,0x0a ,0x0b ,0x0c ,0x0d ,0x0e ,0x0f ,0x10 ,0x11 ,0x12 ,0x13 ,0x14 ,0x15 ,0x16 ,0x17 ,0x18 ,0x19 ,0x1a ,0x1b ,0x1c ,0x1d ,0x1e ,0x1f ,0x20 ,0x21 ,0x22 ,0x23 ,0x24 ,0x25 ,0x26 ,0x27 ,0x28 ,0x29 ,0x2a ,0x2b ,0x2c ,0x2d ,0x2e ,0x2f ,0x30 ,0x31 ,0x32 ,0x33 ,0x34 ,0x35 ,0x36 ,0x37 ,0x38 ,0x39 ,0x3a ,0x3b ,0x3c ,0x3d ,0x3e ,0x3f ,0x40 ,0x41 ,0x42 ,0x43 ,0x44 ,0x45 ,0x46 ,0x47 ,0x48 ,0x49 ,0x4a ,0x4b ,0x4c ,0x4d ,0x4e ,0x4f ,0x50 ,0x51 ,0x52 ,0x53 ,0x54 ,0x55 ,0x56 ,0x57 ,0x58 ,0x59 ,0x5a ,0x5b ,0x5c ,0x5d ,0x5e ,0x5f ,0x60 ,0x61 ,0x62 ,0x63 ,0x64 ,0x65 ,0x66 ,0x67 ,0x68 ,0x69 ,0x6a ,0x6b ,0x6c ,0x6d ,0x6e ,0x6f ,0x70 ,0x71 ,0x72 ,0x73 ,0x74 ,0x75 ,0x76 ,0x77 ,0x78 ,0x79 ,0x7a ,0x7b ,0x7c ,0x7d ,0x7e ,0x7f ,0x80 ,0x81 ,0x82 ,0x83 ,0x84 ,0x85 ,0x86 ,0x87 ,0x88 ,0x89 ,0x8a ,0x8b ,0x8c ,0x8d ,0x8e ,0x8f ,0x90 ,0x91 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 ,0x98 ,0x99 ,0x9a ,0x9b ,0x9c ,0x9d ,0x9e ,0x9f ,0xa0 ,0xa1 ,0xa2 ,0xa3 ,0xa4 ,0xa5 ,0xa6 ,0xa7 ,0xa8 ,0xa9 ,0xaa ,0xab ,0xac ,0xad ,0xae ,0xaf ,0xb0 ,0xb1 ,0xb2 ,0xb3 ,0xb4 ,0xb5 ,0xb6 ,0xb7 ,0xb8 ,0xb9 ,0xba ,0xbb ,0xbc ,0xbd ,0xbe ,0xbf ,0xc0 ,0xc1 ,0xc2 ,0xc3 ,0xc4 ,0xc5 ,0xc6 ,0xc7 ,0xc8 ,0xc9 ,0xca ,0xcb ,0xcc ,0xcd ,0xce ,0xcf ,0xd0 ,0xd1 ,0xd2 ,0xd3 ,0xd4 ,0xd5 ,0xd6 ,0xd7 ,0xd8 ,0xd9 ,0xda ,0xdb ,0xdc ,0xdd ,0xde ,0xdf ,0xe0 ,0xe1 ,0xe2 ,0xe3 ,0xe4 ,0xe5 ,0xe6 ,0xe7 ,0xe8 ,0xe9 ,0xea ,0xeb ,0xec ,0xed ,0xee ,0xef ,0xf0 ,0xf1 ,0xf2 ,0xf3 ,0xf4 ,0xf5 ,0xf6 ,0xf7 ,0xf8 ,0xf9 ,0xfa ,0xfb ,0xfc ,0xfd ,0xfe ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff }; } #endif //MFX_ENABLE_VP8_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/000077500000000000000000000000001443134507600243165ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/include/000077500000000000000000000000001443134507600257415ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/include/mfx_vp9_dec_decode.h000066400000000000000000000032711443134507600316230ustar00rootroot00000000000000// Copyright (c) 2014-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP9_DEC_DECODE_H_ #define _MFX_VP9_DEC_DECODE_H_ #include "mfx_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include "umc_defs.h" #include "mfx_common_int.h" #include "umc_video_decoder.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_vp9_dec_decode_utils.h" namespace MFX_VP9_Utility { mfxStatus DecodeHeader(VideoCORE * /*core*/, mfxBitstream *bs, mfxVideoParam *params); void FillVideoParam(eMFXPlatform platform, UMC_VP9_DECODER::VP9DecoderFrame const& frame, mfxVideoParam ¶ms); }; #endif // MFX_ENABLE_VP9_VIDEO_DECODE #endif // _MFX_VP9_DEC_DECODE_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/include/mfx_vp9_dec_decode_hw.h000066400000000000000000000127721443134507600323270ustar00rootroot00000000000000// Copyright (c) 2014-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP9_DECODE_HW_H_ #define _MFX_VP9_DECODE_HW_H_ #include "mfx_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include "mfx_vp9_dec_decode.h" #include "mfx_vp9_dec_decode_utils.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_task.h" #include "mfx_critical_error_handler.h" #include "umc_mutex.h" #include "umc_vp9_dec_defs.h" #include "umc_vp9_frame.h" #include #include #include namespace UMC_VP9_DECODER { class Packer; } class FrameStorage; class VideoDECODEVP9_HW : public VideoDECODE, public MfxCriticalErrorHandler { public: VideoDECODEVP9_HW(VideoCORE *pCore, mfxStatus *sts); virtual ~VideoDECODEVP9_HW(); static mfxStatus Query(VideoCORE *pCore, mfxVideoParam *pIn, mfxVideoParam *pOut); static mfxStatus QueryIOSurf(VideoCORE *pCore, mfxVideoParam *pPar, mfxFrameAllocRequest *pRequest); static mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription::decoder&, mfx::PODArraysHolder&); virtual mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *pPar) override; virtual mfxStatus Close() override; virtual mfxTaskThreadingPolicy GetThreadingPolicy() override; virtual mfxStatus GetVideoParam(mfxVideoParam *pPar) override; virtual mfxStatus GetDecodeStat(mfxDecodeStat *pStat) override; static mfxStatus DecodeHeader(VideoCORE * core, mfxBitstream *bs, mfxVideoParam *params); virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *pSurfaceWork, mfxFrameSurface1 **ppSurfaceOut, MFX_ENTRY_POINT *pEntryPoint) override; virtual mfxStatus GetUserData(mfxU8 *pUserData, mfxU32 *pSize, mfxU64 *pTimeStamp); virtual mfxStatus GetPayload(mfxU64 *pTimeStamp, mfxPayload *pPayload) override; virtual mfxStatus SetSkipMode(mfxSkipMode mode) override; virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) override; protected: void CalculateTimeSteps(mfxFrameSurface1 *); static mfxStatus QueryIOSurfInternal(eMFXPlatform, mfxVideoParam *, mfxFrameAllocRequest *); mfxStatus UpdateRefFrames(); mfxStatus CleanRefList(); mfxStatus DecodeSuperFrame(mfxBitstream *in, UMC_VP9_DECODER::VP9DecoderFrame & info); mfxStatus DecodeFrameHeader(mfxBitstream *in, UMC_VP9_DECODER::VP9DecoderFrame & info); mfxStatus PackHeaders(mfxBitstream *bs, UMC_VP9_DECODER::VP9DecoderFrame const & info); mfxStatus GetOutputSurface(mfxFrameSurface1 **, mfxFrameSurface1 *, UMC::FrameMemID); private: bool m_isInit; VideoCORE* m_core; eMFXPlatform m_platform; mfxVideoParamWrapper m_vInitPar; mfxVideoParamWrapper m_vPar; mfxU32 m_num_output_frames; mfxF64 m_in_framerate; mfxU16 m_frameOrder; mfxU32 m_statusReportFeedbackNumber; UMC::Mutex m_mGuard; std::deque m_mCopyGuard; //For handling repeated frames bool m_adaptiveMode; mfxU32 m_index; std::unique_ptr m_surface_source; std::unique_ptr m_Packer; std::unique_ptr m_framesStorage; mfxFrameAllocResponse m_response; mfxFrameAllocResponse m_response_alien; mfxDecodeStat m_stat; friend mfxStatus MFX_CDECL VP9DECODERoutine(void *p_state, void *pp_param, mfxU32 thread_number, mfxU32); friend mfxStatus VP9CompleteProc(void *p_state, void *pp_param, mfxStatus); mfxStatus ReportDecodeStatus(mfxFrameSurface1* surface_work); void ResetFrameInfo(); mfxStatus PrepareInternalSurface(UMC::FrameMemID &mid); struct VP9DECODERoutineData { VideoDECODEVP9_HW* decoder; mfxFrameSurface1* surface_work; UMC::FrameMemID currFrameId; UMC::FrameMemID copyFromFrame; mfxU32 index; mfxU32 showFrame; }; UMC::VideoAccelerator * m_va; typedef std::list StatuReportList; StatuReportList m_completedList; UMC_VP9_DECODER::VP9DecoderFrame m_frameInfo; typedef struct { mfxU32 width; mfxU32 height; } SizeOfFrame; SizeOfFrame m_firstSizes; SizeOfFrame m_sizesOfRefFrame[UMC_VP9_DECODER::NUM_REF_FRAMES]; mfxBitstream m_bs; mfxI32 m_baseQIndex; bool m_skipParseSuperFrameIndex; }; #endif // MFX_ENABLE_VP9_VIDEO_DECODE #endif // _MFX_VP9_DECODE_HW_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/include/mfx_vp9_dec_decode_utils.h000066400000000000000000000032771443134507600330510ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_VP9_DECODE_UTILS_H_ #define _MFX_VP9_DECODE_UTILS_H_ #include "mfx_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include #include "umc_vp9_dec_defs.h" namespace UMC_VP9_DECODER { class VP9Bitstream; class VP9DecoderFrame; } namespace MfxVP9Decode { void ParseSuperFrameIndex(const mfxU8 *data, size_t data_sz, mfxU32 sizes[8], mfxU32 *count); inline mfxU8 ReadMarker(const mfxU8 *data) { return *data; } }; // namespace MfxVP9Decode #endif // MFX_ENABLE_VP9_VIDEO_DECODE #endif // _MFX_VP9_DECODE_UTILS_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/src/000077500000000000000000000000001443134507600251055ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/src/mfx_vp9_dec_decode.cpp000066400000000000000000000222411443134507600313200ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_common.h" #include "mfx_common_decode_int.h" #include "mfx_vpx_dec_common.h" #include "mfx_enc_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include "mfx_vp9_dec_decode.h" #include "umc_vp9_utils.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_frame.h" using namespace UMC_VP9_DECODER; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MFX_VP9_Utility implementation /////////////////////////////////////////////////////////////////////////////////////////////////////////////// namespace MFX_VP9_Utility { mfxStatus DecodeHeader(VideoCORE* core, mfxBitstream* bs, mfxVideoParam* params) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR3(core, bs, params); sts = CheckBitstream(bs); MFX_CHECK_STS(sts); if (bs->DataLength < 3) { MoveBitstreamData(*bs, bs->DataLength); MFX_RETURN(MFX_ERR_MORE_DATA); } bool bHeaderRead = false; VP9DecoderFrame frame{}; frame.bit_depth = 8; for (;;) { VP9Bitstream bsReader(bs->Data + bs->DataOffset, bs->DataLength - bs->DataOffset); if (VP9_FRAME_MARKER != bsReader.GetBits(2)) break; // invalid frame.profile = bsReader.GetBit(); frame.profile |= bsReader.GetBit() << 1; if (frame.profile > 2) frame.profile += bsReader.GetBit(); if (frame.profile >= 4) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); if (bsReader.GetBit()) // show_existing_frame break; VP9_FRAME_TYPE frameType = (VP9_FRAME_TYPE) bsReader.GetBit(); mfxU32 showFrame = bsReader.GetBit(); mfxU32 errorResilientMode = bsReader.GetBit(); if (KEY_FRAME == frameType) { if (!CheckSyncCode(&bsReader)) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); if (frame.profile >= 2) { frame.bit_depth = bsReader.GetBit() ? 12 : 10; } if (SRGB != (COLOR_SPACE)bsReader.GetBits(3)) // color_space { bsReader.GetBit(); // color_range if (1 == frame.profile || 3 == frame.profile) { frame.subsamplingX = bsReader.GetBit(); frame.subsamplingY = bsReader.GetBit(); bsReader.GetBit(); // reserved_zero } else { frame.subsamplingX = 1; frame.subsamplingY = 1; } } else { if (1 == frame.profile || 3 == frame.profile) bsReader.GetBit(); else break; // invalid } frame.width = (mfxU16)bsReader.GetBits(16) + 1; frame.height = (mfxU16)bsReader.GetBits(16) + 1; bHeaderRead = true; } else { mfxU32 intraOnly = showFrame ? 0 : bsReader.GetBit(); if (!intraOnly) break; if (!errorResilientMode) bsReader.GetBits(2); if (!CheckSyncCode(&bsReader)) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); if (frame.profile >= 2) frame.bit_depth = bsReader.GetBit() ? 12 : 10; if (frame.profile == 0) { // There is no color format info in intra-only frame for frame.profile 0 frame.subsamplingX = 1; frame.subsamplingY = 1; } else // frame.profile > 0 { if (SRGB != (COLOR_SPACE)bsReader.GetBits(3)) // color_space { bsReader.GetBit(); // color_range if (1 == frame.profile || 3 == frame.profile) { frame.subsamplingX = bsReader.GetBit(); frame.subsamplingY = bsReader.GetBit(); bsReader.GetBit(); // reserved_zero } else { frame.subsamplingX = 1; frame.subsamplingY = 1; } } else { if (1 == frame.profile || 3 == frame.profile) bsReader.GetBit(); else break; // invalid } } bsReader.GetBits(NUM_REF_FRAMES); frame.width = (mfxU16)bsReader.GetBits(16) + 1; frame.height = (mfxU16)bsReader.GetBits(16) + 1; bHeaderRead = true; } break; } if (!bHeaderRead) { MoveBitstreamData(*bs, bs->DataLength); MFX_RETURN(MFX_ERR_MORE_DATA); } FillVideoParam(core->GetPlatformType(), frame, *params); return MFX_ERR_NONE; } void FillVideoParam(eMFXPlatform platform, UMC_VP9_DECODER::VP9DecoderFrame const& frame, mfxVideoParam ¶ms) { params.mfx.CodecProfile = mfxU16(frame.profile + 1); params.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; params.mfx.FrameInfo.AspectRatioW = 1; params.mfx.FrameInfo.AspectRatioH = 1; params.mfx.FrameInfo.CropX = 0; params.mfx.FrameInfo.CropY = 0; params.mfx.FrameInfo.CropW = static_cast(frame.width); params.mfx.FrameInfo.CropH = static_cast(frame.height); params.mfx.FrameInfo.Width = mfx::align2_value(params.mfx.FrameInfo.CropW, 16); params.mfx.FrameInfo.Height = mfx::align2_value(params.mfx.FrameInfo.CropH, 16); if (!frame.subsamplingX && !frame.subsamplingY) params.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; //else if (!subsampling_x && subsampling_y) // params.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV440; else if (frame.subsamplingX && !frame.subsamplingY) params.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV422; else if (frame.subsamplingX && frame.subsamplingY) params.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; switch (frame.bit_depth) { case 8: params.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; if (MFX_CHROMAFORMAT_YUV444 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_AYUV; else if (MFX_CHROMAFORMAT_YUV422 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_YUY2; params.mfx.FrameInfo.BitDepthLuma = 8; params.mfx.FrameInfo.BitDepthChroma = 8; params.mfx.FrameInfo.Shift = 0; break; case 10: params.mfx.FrameInfo.FourCC = MFX_FOURCC_P010; if (MFX_CHROMAFORMAT_YUV444 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_Y410; else if (MFX_CHROMAFORMAT_YUV422 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_Y210; params.mfx.FrameInfo.BitDepthLuma = 10; params.mfx.FrameInfo.BitDepthChroma = 10; break; case 12: params.mfx.FrameInfo.FourCC = 0; if (MFX_CHROMAFORMAT_YUV420 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_P016; else if(MFX_CHROMAFORMAT_YUV444 == params.mfx.FrameInfo.ChromaFormat) params.mfx.FrameInfo.FourCC = MFX_FOURCC_Y416; params.mfx.FrameInfo.BitDepthLuma = 12; params.mfx.FrameInfo.BitDepthChroma = 12; break; } if (platform == MFX_PLATFORM_HARDWARE) { params.mfx.FrameInfo.Shift = 0; if (params.mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || params.mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || params.mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || params.mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || params.mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) { params.mfx.FrameInfo.Shift = 1; } } } } //MFX_VP9_Utility #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/src/mfx_vp9_dec_decode_hw.cpp000066400000000000000000001557421443134507600320330ustar00rootroot00000000000000// Copyright (c) 2014-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include "mfx_vp9_dec_decode.h" #include "mfx_vp9_dec_decode_hw.h" #include "umc_vp9_utils.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_va_packer.h" #include "mfx_common_decode_int.h" #include "mfx_vpx_dec_common.h" #include #if defined(MFX_ENABLE_PXP) #include "umc_va_protected.h" #endif // MFX_ENABLE_PXP #include "umc_va_video_processing.h" #include "libmfx_core_interface.h" using namespace UMC_VP9_DECODER; #include "mfx_unified_vp9d_logging.h" static bool IsSameVideoParam(mfxVideoParam *newPar, mfxVideoParam *oldPar); // function checks hardware support with IsGuidSupported function and GUIDs inline bool CheckHardwareSupport(VideoCORE *p_core, mfxVideoParam *p_video_param) { MFX_CHECK(p_core, false); MFX_CHECK(p_video_param, false); GUID guid; mfxU32 profile = p_video_param->mfx.CodecProfile; if (!profile) { profile = UMC_VP9_DECODER::GetMinProfile(p_video_param->mfx.FrameInfo.BitDepthLuma, p_video_param->mfx.FrameInfo.ChromaFormat); } switch(profile) { case(MFX_PROFILE_VP9_0): { guid = DXVA_Intel_ModeVP9_Profile0_VLD; break; } case(MFX_PROFILE_VP9_1): { guid = DXVA_Intel_ModeVP9_Profile1_YUV444_VLD; break; } case(MFX_PROFILE_VP9_2): { guid = DXVA_Intel_ModeVP9_Profile2_10bit_VLD; break; } case(MFX_PROFILE_VP9_3): { guid = DXVA_Intel_ModeVP9_Profile3_YUV444_10bit_VLD; break; } default: return false; } mfxStatus mfxSts = p_core->IsGuidSupported(guid, p_video_param); MFX_CHECK(mfxSts == MFX_ERR_NONE, false); return true; } static void SetFrameType(const VP9DecoderFrame &frameInfo, mfxFrameSurface1 &surface_out) { auto extFrameInfo = reinterpret_cast(GetExtendedBuffer(surface_out.Data.ExtParam, surface_out.Data.NumExtParam, MFX_EXTBUFF_DECODED_FRAME_INFO)); if (extFrameInfo == nullptr) return; switch (frameInfo.frameType) { case KEY_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_I; break; case INTER_FRAME: extFrameInfo->FrameType = MFX_FRAMETYPE_P; break; default: extFrameInfo->FrameType = MFX_FRAMETYPE_UNKNOWN; } } mfxStatus VideoDECODEVP9_HW::UpdateRefFrames() { if (m_frameInfo.show_existing_frame) return MFX_ERR_NONE; for (mfxI32 ref_index = 0; ref_index < NUM_REF_FRAMES; ++ref_index) { mfxU8 mask = m_frameInfo.refreshFrameFlags & (1 << ref_index); if (mask != 0 // we should update the reference according to the bitstream data // The next condition is for decoder robustness. // After the first keyframe is decoded this frame occupies all ref slots // its mask is 011111111 and the condition "minus one" never hits. // But if the first frame is Inter-frame encoded in the intra-only mode // then we can receive "minus one" ref_frame_map item. // The decoder never should touch these references. // But if the stream is broken then decode may touch not initialized reference // So to prevent crash let's put something as the reference frame. || (m_frameInfo.ref_frame_map[ref_index] == (UMC::FrameMemID) - 1)) { MFX_CHECK((m_surface_source->IncreaseReference(m_frameInfo.currFrame) == UMC::UMC_OK), MFX_ERR_UNKNOWN); if (m_frameInfo.ref_frame_map[ref_index] >= 0) MFX_CHECK((m_surface_source->DecreaseReference(m_frameInfo.ref_frame_map[ref_index]) == UMC::UMC_OK), MFX_ERR_UNKNOWN); m_frameInfo.ref_frame_map[ref_index] = m_frameInfo.currFrame; m_frameInfo.sizesOfRefFrame[ref_index].width = m_frameInfo.width; m_frameInfo.sizesOfRefFrame[ref_index].height = m_frameInfo.height; } } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::CleanRefList() { for (mfxI32 ref_index = 0; ref_index < NUM_REF_FRAMES; ++ref_index) { if (m_frameInfo.ref_frame_map[ref_index] >= 0) MFX_CHECK((m_surface_source->DecreaseReference(m_frameInfo.ref_frame_map[ref_index]) == UMC::UMC_OK), MFX_ERR_UNKNOWN); m_frameInfo.ref_frame_map[ref_index] = -1; } return MFX_ERR_NONE; } class FrameStorage { private: std::vector m_submittedFrames; SurfaceSource *surface_source; void LockResources(const UMC_VP9_DECODER::VP9DecoderFrame & frame) const { // lock current frame for decode VP9_CHECK_AND_THROW((surface_source->IncreaseReference(frame.currFrame) == UMC::UMC_OK), MFX_ERR_UNKNOWN); // lock frame for copy if (frame.show_existing_frame) { VP9_CHECK_AND_THROW((surface_source->IncreaseReference(frame.ref_frame_map[frame.frame_to_show]) == UMC::UMC_OK), MFX_ERR_UNKNOWN); } // lock all references else { for (mfxI32 ref_index = 0; ref_index < NUM_REF_FRAMES; ++ref_index) { const UMC::FrameMemID mid = frame.ref_frame_map[ref_index]; if (mid >= 0) { VP9_CHECK_AND_THROW((surface_source->IncreaseReference(mid) == UMC::UMC_OK), MFX_ERR_UNKNOWN); } } } } void UnLockResources(const UMC_VP9_DECODER::VP9DecoderFrame & frame) const { // decoded frame should be unlocked in async routine // unlock frame for copy if (frame.show_existing_frame) { VP9_CHECK_AND_THROW((surface_source->DecreaseReference(frame.ref_frame_map[frame.frame_to_show]) == UMC::UMC_OK), MFX_ERR_UNKNOWN); } // unlock all references else { for (mfxI32 ref_index = 0; ref_index < NUM_REF_FRAMES; ++ref_index) { const UMC::FrameMemID mid = frame.ref_frame_map[ref_index]; if (mid >= 0) { VP9_CHECK_AND_THROW((surface_source->DecreaseReference(mid) == UMC::UMC_OK), MFX_ERR_UNKNOWN); } } } } public: FrameStorage(SurfaceSource *frameAllocator) : m_submittedFrames(), surface_source(frameAllocator) { } ~FrameStorage() { // unlock all locked resources try { for (auto & it : m_submittedFrames) UnLockResources(it); } catch (vp9_exception const& e) { m_submittedFrames.shrink_to_fit(); m_submittedFrames.clear(); assert(0); } m_submittedFrames.shrink_to_fit(); m_submittedFrames.clear(); } void Add(UMC_VP9_DECODER::VP9DecoderFrame & frame) { VP9_CHECK_AND_THROW((frame.currFrame >= 0), MFX_ERR_UNKNOWN); // lock refereces for current frame LockResources(frame); // avoid double submit auto find_it = std::find_if(m_submittedFrames.begin(), m_submittedFrames.end(), [frame](const UMC_VP9_DECODER::VP9DecoderFrame & item) { return item.currFrame == frame.currFrame; }); VP9_CHECK_AND_THROW((find_it == m_submittedFrames.end()), MFX_ERR_UNKNOWN); m_submittedFrames.push_back(frame); if (!m_submittedFrames.empty()) { TRACE_BUFFER_EVENT(MFX_TRACE_API_VP9_DPBPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_DPB_INFO, m_submittedFrames, VP9DecodeDpbInfo, DPBINFO_VP9D); } } void DecodeFrame(UMC::FrameMemID frameId) { auto find_it = std::find_if(m_submittedFrames.begin(), m_submittedFrames.end(), [frameId](const UMC_VP9_DECODER::VP9DecoderFrame & item) { return item.currFrame == frameId; }); if (find_it != m_submittedFrames.end()) { find_it->isDecoded = true; } TRACE_EVENT(MFX_TRACE_API_VP9_DISPLAYINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( find_it->currFrame, (uint32_t)find_it->isDecoded)); } void CompleteFrames() { for (auto it = m_submittedFrames.begin(); it != m_submittedFrames.end(); ) { if (it->isDecoded) { UnLockResources(*it); it = m_submittedFrames.erase(it); } else it = std::next(it); } } bool IsAllFramesCompleted() const { return m_submittedFrames.empty(); } }; VideoDECODEVP9_HW::VideoDECODEVP9_HW(VideoCORE *p_core, mfxStatus *sts) : m_isInit(false), m_core(p_core), m_platform(MFX_PLATFORM_HARDWARE), m_num_output_frames(0), m_in_framerate(0), m_frameOrder(0), m_statusReportFeedbackNumber(0), m_mGuard(), m_mCopyGuard(), m_adaptiveMode(false), m_index(0), m_surface_source(), m_Packer(), m_response(), m_stat(), m_va(nullptr), m_completedList(), m_firstSizes(), m_bs(), m_baseQIndex(0), m_skipParseSuperFrameIndex(false) { memset(&m_sizesOfRefFrame, 0, sizeof(m_sizesOfRefFrame)); memset(&m_frameInfo.ref_frame_map, VP9_INVALID_REF_FRAME, sizeof(m_frameInfo.ref_frame_map)); // move to another place ResetFrameInfo(); if (sts) { *sts = MFX_ERR_NONE; } } VideoDECODEVP9_HW::~VideoDECODEVP9_HW(void) { Close(); } static bool CheckVP9BitDepthRestriction(mfxFrameInfo *info) { return ((info->BitDepthLuma == FourCcBitDepth(info->FourCC)) && (info->BitDepthLuma == info->BitDepthChroma)); } mfxStatus VideoDECODEVP9_HW::Init(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(!m_isInit, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = MFX_ERR_NONE; UMC::Status umcSts = UMC::UMC_OK; eMFXHWType type = m_core->GetHWType(); m_platform = m_core->GetPlatformType(); MFX_CHECK(MFX_ERR_NONE <= CheckVideoParamDecoders(par, type), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(CheckHardwareSupport(m_core, par), MFX_ERR_UNSUPPORTED); MFX_CHECK(MFX_VPX_Utility::CheckVideoParam(par, MFX_CODEC_VP9, m_platform, type), MFX_ERR_INVALID_VIDEO_PARAM); m_vInitPar = *par; MFX_CHECK(InitBitDepthFields(&m_vInitPar.mfx.FrameInfo), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(CheckVP9BitDepthRestriction(&m_vInitPar.mfx.FrameInfo), MFX_ERR_INVALID_VIDEO_PARAM); m_vPar = m_vInitPar; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); /* There are following conditions for post processing via HW fixed function engine: * (1): Progressive only for ICL and Before, interlace is supported for ICL following patforms * (2): Supported on SKL (Core) and APL (Atom) platform and above * (3): Only video memory supported (so, OPAQ memory does not supported!) * */ if (videoProcessing) { MFX_CHECK((m_vPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY), MFX_ERR_UNSUPPORTED); bool is_fourcc_supported = ( videoProcessing->Out.FourCC == MFX_FOURCC_RGB4 || videoProcessing->Out.FourCC == MFX_FOURCC_NV12 || videoProcessing->Out.FourCC == MFX_FOURCC_P010 || videoProcessing->Out.FourCC == MFX_FOURCC_YUY2 || videoProcessing->Out.FourCC == MFX_FOURCC_AYUV || videoProcessing->Out.FourCC == MFX_FOURCC_Y410 || videoProcessing->Out.FourCC == MFX_FOURCC_Y210 || videoProcessing->Out.FourCC == MFX_FOURCC_Y216 || videoProcessing->Out.FourCC == MFX_FOURCC_Y416 || videoProcessing->Out.FourCC == MFX_FOURCC_P016); MFX_CHECK(is_fourcc_supported,MFX_ERR_UNSUPPORTED); } #endif m_vInitPar.IOPattern = ( m_vInitPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) | (m_vInitPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); if (0 == m_vInitPar.mfx.FrameInfo.FrameRateExtN || 0 == m_vInitPar.mfx.FrameInfo.FrameRateExtD) { m_vInitPar.mfx.FrameInfo.FrameRateExtD = 1000; m_vInitPar.mfx.FrameInfo.FrameRateExtN = 30000; } m_in_framerate = (mfxF64) m_vInitPar.mfx.FrameInfo.FrameRateExtD / m_vInitPar.mfx.FrameInfo.FrameRateExtN; if ((m_vPar.mfx.FrameInfo.AspectRatioH == 0) && (m_vPar.mfx.FrameInfo.AspectRatioW == 0)) { m_vPar.mfx.FrameInfo.AspectRatioH = 1; m_vPar.mfx.FrameInfo.AspectRatioW = 1; } // allocate memory mfxFrameAllocRequest request = {}; memset(&m_response, 0, sizeof(m_response)); memset(&m_response_alien, 0, sizeof(m_response_alien)); memset(&m_firstSizes, 0, sizeof(m_firstSizes)); bool useInternal = (m_vInitPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ) || IsD3D9Simulation(*m_core); sts = MFX_VPX_Utility::QueryIOSurfInternal(&m_vInitPar, &request); MFX_CHECK_STS(sts); request.Type &= ~(MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_EXTERNAL_FRAME); request.Type |= useInternal ? MFX_MEMTYPE_INTERNAL_FRAME : MFX_MEMTYPE_EXTERNAL_FRAME; mfxFrameAllocRequest request_internal = request; request.AllocId = par->AllocId; MFX_CHECK_STS(sts); try { m_surface_source.reset(new SurfaceSource(m_core, *par, m_platform, request, request_internal, m_response, m_response_alien)); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } ResetFrameInfo(); sts = m_core->CreateVA(&m_vInitPar, &request, &m_response, m_surface_source.get()); MFX_CHECK_STS(sts); m_core->GetVA((mfxHDL*)&m_va, MFX_MEMTYPE_FROM_DECODE); bool reallocFrames = (par->mfx.EnableReallocRequest == MFX_CODINGOPTION_ON); m_adaptiveMode = reallocFrames; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (videoProcessing) { MFX_CHECK(MFX_HW_D3D11 == m_core->GetVAType(), MFX_ERR_UNSUPPORTED); if (m_va->GetVideoProcessingVA()) { umcSts = m_va->GetVideoProcessingVA()->Init(par, videoProcessing); MFX_CHECK(umcSts == UMC::UMC_OK, MFX_ERR_INVALID_VIDEO_PARAM); } } #endif m_frameOrder = 0; m_statusReportFeedbackNumber = 0; m_isInit = true; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::QueryImplsDescription( VideoCORE&, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { const mfxU32 SupportedProfiles[] = { MFX_PROFILE_VP9_0 , MFX_PROFILE_VP9_1 , MFX_PROFILE_VP9_2 , MFX_PROFILE_VP9_3 }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_P010 , MFX_FOURCC_P016 , MFX_FOURCC_AYUV , MFX_FOURCC_Y410 , MFX_FOURCC_Y416 }; caps.CodecID = MFX_CODEC_VP9; caps.MaxcodecLevel = MFX_LEVEL_UNKNOWN; for (mfxU32 profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, 16384, 16 }; memCaps.Height = { 16, 16384, 16 }; for (auto fcc : SupportedFourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::Reset(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); eMFXHWType type = m_core->GetHWType(); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing != nullptr) { if (videoProcessing->Out.Width >= par->mfx.FrameInfo.Width || videoProcessing->Out.Height >= par->mfx.FrameInfo.Height) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } #endif MFX_CHECK(MFX_ERR_NONE <= CheckVideoParamDecoders(par, type), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(MFX_VPX_Utility::CheckVideoParam(par, MFX_CODEC_VP9, m_core->GetPlatformType(), type), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(CheckHardwareSupport(m_core, par), MFX_ERR_UNSUPPORTED); MFX_CHECK(IsSameVideoParam(par, &m_vInitPar), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_platform == m_core->GetPlatformType(), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); ResetFrameInfo(); UMC::Status sts = m_surface_source->Reset(); MFX_CHECK(sts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_frameOrder = 0; m_statusReportFeedbackNumber = 0; memset(&m_stat, 0, sizeof(m_stat)); memset(&m_firstSizes, 0, sizeof(m_firstSizes)); m_vPar = *par; if (0 == m_vPar.mfx.FrameInfo.FrameRateExtN || 0 == m_vPar.mfx.FrameInfo.FrameRateExtD) { m_vPar.mfx.FrameInfo.FrameRateExtD = m_vInitPar.mfx.FrameInfo.FrameRateExtD; m_vPar.mfx.FrameInfo.FrameRateExtN = m_vInitPar.mfx.FrameInfo.FrameRateExtN; } m_in_framerate = (mfxF64) m_vPar.mfx.FrameInfo.FrameRateExtD / m_vPar.mfx.FrameInfo.FrameRateExtN; m_index = 0; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::Close() { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); ResetFrameInfo(); m_surface_source->Close(); m_isInit = false; m_adaptiveMode = false; m_frameOrder = (mfxU16)MFX_FRAMEORDER_UNKNOWN; m_statusReportFeedbackNumber = 0; m_va = NULL; memset(&m_response, 0, sizeof(m_response)); memset(&m_stat, 0, sizeof(m_stat)); return MFX_ERR_NONE; } void VideoDECODEVP9_HW::ResetFrameInfo() { CleanRefList(); m_framesStorage.reset(new FrameStorage(m_surface_source.get())); memset(&m_frameInfo, 0, sizeof(m_frameInfo)); m_frameInfo.currFrame = -1; m_frameInfo.frameCountInBS = 0; m_frameInfo.currFrameInBS = 0; memset(&m_frameInfo.ref_frame_map, VP9_INVALID_REF_FRAME, sizeof(m_frameInfo.ref_frame_map)); // move to another place } mfxStatus VideoDECODEVP9_HW::DecodeHeader(VideoCORE* core, mfxBitstream* bs, mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(par); mfxStatus sts = MFX_VP9_Utility::DecodeHeader(core, bs, par); MFX_CHECK_STS(sts); return sts; } static bool IsSameVideoParam(mfxVideoParam *newPar, mfxVideoParam *oldPar) { if (newPar->IOPattern != oldPar->IOPattern) { return false; } if (newPar->mfx.FrameInfo.BitDepthLuma != oldPar->mfx.FrameInfo.BitDepthLuma || newPar->mfx.FrameInfo.BitDepthChroma != oldPar->mfx.FrameInfo.BitDepthChroma) { return false; } if (newPar->Protected != oldPar->Protected) { return false; } int32_t asyncDepth = std::min(newPar->AsyncDepth, MFX_MAX_ASYNC_DEPTH_VALUE); if (asyncDepth != oldPar->AsyncDepth) { return false; } if (newPar->mfx.FrameInfo.Height > oldPar->mfx.FrameInfo.Height) { return false; } if (newPar->mfx.FrameInfo.Width > oldPar->mfx.FrameInfo.Width) { return false; } if (newPar->mfx.FrameInfo.ChromaFormat != oldPar->mfx.FrameInfo.ChromaFormat) { return false; } if (newPar->mfx.NumThread > oldPar->mfx.NumThread && oldPar->mfx.NumThread > 0) // need more surfaces for efficient decoding { return false; } return true; } mfxTaskThreadingPolicy VideoDECODEVP9_HW::GetThreadingPolicy() { return MFX_TASK_THREADING_SHARED; } mfxStatus VideoDECODEVP9_HW::Query(VideoCORE *p_core, mfxVideoParam *p_in, mfxVideoParam *p_out) { MFX_CHECK_NULL_PTR1(p_out); mfxVideoParam localIn{}; if (p_in == p_out) { MFX_CHECK_NULL_PTR1(p_in); MFX_INTERNAL_CPY(&localIn, p_in, sizeof(mfxVideoParam)); p_in = &localIn; } eMFXHWType type = p_core->GetHWType(); mfxVideoParam *p_check_hw_par = p_in; mfxVideoParam check_hw_par{}; if (p_in == NULL) { check_hw_par.mfx.CodecId = MFX_CODEC_VP9; p_check_hw_par = &check_hw_par; } MFX_CHECK(CheckHardwareSupport(p_core, p_check_hw_par), MFX_ERR_UNSUPPORTED); mfxStatus status = MFX_VPX_Utility::Query(p_core, p_in, p_out, MFX_CODEC_VP9, type); if (p_in == NULL) { p_out->mfx.EnableReallocRequest = 1; } else { // Disable DRC realloc surface, unless the user explicitly enable it. p_out->mfx.EnableReallocRequest = MFX_CODINGOPTION_OFF; if (p_in->mfx.EnableReallocRequest == MFX_CODINGOPTION_ON) { p_out->mfx.EnableReallocRequest = MFX_CODINGOPTION_ON; } } return status; } mfxStatus VideoDECODEVP9_HW::QueryIOSurf(VideoCORE *p_core, mfxVideoParam *p_video_param, mfxFrameAllocRequest *p_request) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR3(p_core, p_video_param, p_request); const mfxVideoParam p_params = *p_video_param; auto const supportedMemoryType = (p_params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!( p_params.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY && p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY), MFX_ERR_INVALID_VIDEO_PARAM); bool IsD3D9SimWithVideoMem = IsD3D9Simulation(*p_core) && (p_video_param->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (p_params.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY || IsD3D9SimWithVideoMem) { p_request->Info = p_params.mfx.FrameInfo; p_request->NumFrameMin = 1; p_request->NumFrameSuggested = p_request->NumFrameMin + (p_params.AsyncDepth ? p_params.AsyncDepth : MFX_AUTO_ASYNC_DEPTH_VALUE); p_request->Type = MFX_MEMTYPE_FROM_DECODE; p_request->Type |= IsD3D9SimWithVideoMem ? MFX_MEMTYPE_DXVA2_DECODER_TARGET : MFX_MEMTYPE_SYSTEM_MEMORY; } else { sts = MFX_VPX_Utility::QueryIOSurfInternal(p_video_param, p_request); } p_request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = UpdateCscOutputFormat(p_video_param, p_request); MFX_CHECK_STS(sts); MFX_CHECK(CheckHardwareSupport(p_core, p_video_param), MFX_ERR_UNSUPPORTED); return sts; } mfxStatus VideoDECODEVP9_HW::GetVideoParam(mfxVideoParam *par) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); par->mfx = m_vPar.mfx; par->Protected = m_vInitPar.Protected; par->IOPattern = m_vInitPar.IOPattern; par->AsyncDepth = m_vInitPar.AsyncDepth; par->mfx.FrameInfo.FrameRateExtD = m_vInitPar.mfx.FrameInfo.FrameRateExtD; par->mfx.FrameInfo.FrameRateExtN = m_vInitPar.mfx.FrameInfo.FrameRateExtN; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { mfxExtDecVideoProcessing * videoProcessingInternal = m_vPar.GetExtendedBuffer(MFX_EXTBUFF_DEC_VIDEO_PROCESSING); *videoProcessing = *videoProcessingInternal; } #endif return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::GetDecodeStat(mfxDecodeStat *pStat) { MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(pStat); m_stat.NumSkippedFrame = 0; m_stat.NumCachedFrame = 0; *pStat = m_stat; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::GetOutputSurface(mfxFrameSurface1 **surface_out, mfxFrameSurface1 *surface_work, UMC::FrameMemID index) { mfxFrameSurface1 *pNativeSurface = m_surface_source->GetSurface(index, surface_work, &m_vInitPar); MFX_CHECK(pNativeSurface, MFX_ERR_UNDEFINED_BEHAVIOR); *surface_out = pNativeSurface; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::GetUserData(mfxU8 *pUserData, mfxU32 *pSize, mfxU64 *pTimeStamp) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(pUserData, pSize, pTimeStamp); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEVP9_HW::GetPayload(mfxU64 *pTimeStamp, mfxPayload *pPayload) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR3(pTimeStamp, pPayload, pPayload->Data); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VideoDECODEVP9_HW::SetSkipMode(mfxSkipMode /*mode*/) { UMC::AutomaticUMCMutex guard(m_mGuard); MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); return MFX_ERR_NONE; } void VideoDECODEVP9_HW::CalculateTimeSteps(mfxFrameSurface1 *p_surface) { p_surface->Data.TimeStamp = GetMfxTimeStamp(m_num_output_frames * m_in_framerate); p_surface->Data.FrameOrder = m_num_output_frames; m_num_output_frames += 1; p_surface->Info.FrameRateExtD = m_vInitPar.mfx.FrameInfo.FrameRateExtD; p_surface->Info.FrameRateExtN = m_vInitPar.mfx.FrameInfo.FrameRateExtN; p_surface->Info.CropX = m_vInitPar.mfx.FrameInfo.CropX; p_surface->Info.CropY = m_vInitPar.mfx.FrameInfo.CropY; p_surface->Info.PicStruct = m_vInitPar.mfx.FrameInfo.PicStruct; p_surface->Info.AspectRatioH = 1; p_surface->Info.AspectRatioW = 1; } enum { NUMBER_OF_STATUS = 32, }; mfxStatus MFX_CDECL VP9DECODERoutine(void *p_state, void * /* pp_param */, mfxU32 /* thread_number */, mfxU32) { VideoDECODEVP9_HW::VP9DECODERoutineData& data = *(VideoDECODEVP9_HW::VP9DECODERoutineData*)p_state; VideoDECODEVP9_HW& decoder = *data.decoder; TRACE_EVENT(MFX_TRACE_API_VP9_SYNCINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( data.copyFromFrame, data.currFrameId, data.index, data.showFrame)); if (data.copyFromFrame != UMC::FRAME_MID_INVALID) { MFX_CHECK(data.surface_work, MFX_ERR_UNDEFINED_BEHAVIOR); UMC::AutomaticUMCMutex guard(decoder.m_mGuard); mfxFrameSurface1 surfaceDst = *data.surface_work; surfaceDst.Info.Width = (surfaceDst.Info.CropW + 15) & ~0x0f; surfaceDst.Info.Height = (surfaceDst.Info.CropH + 15) & ~0x0f; mfxFrameSurface1 *surfaceSrc = decoder.m_surface_source->GetSurfaceByIndex(data.copyFromFrame); MFX_CHECK(surfaceSrc, MFX_ERR_UNDEFINED_BEHAVIOR); bool systemMemory = (decoder.m_vInitPar.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) != 0; mfxU16 srcMemType = MFX_MEMTYPE_DXVA2_DECODER_TARGET; srcMemType |= systemMemory ? MFX_MEMTYPE_INTERNAL_FRAME : MFX_MEMTYPE_EXTERNAL_FRAME; mfxU16 dstMemType = (mfxU16)MFX_MEMTYPE_EXTERNAL_FRAME; dstMemType |= systemMemory ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET; { if (data.copyFromFrame >= (mfxI32)decoder.m_mCopyGuard.size()) { decoder.m_mCopyGuard.resize(data.copyFromFrame + 1); } UMC::AutomaticUMCMutex guardCopy(decoder.m_mCopyGuard[data.copyFromFrame]); mfxU32 useGPUCopy = decoder.m_core->GetVAType() == MFX_HW_VAAPI ? MFX_COPY_USE_CM : 0u; // not using CM copy in video to video copy becasue there are issues in CM copy. if (!systemMemory) useGPUCopy = 0; MFX_SAFE_CALL(decoder.m_core->DoFastCopyWrapper(&surfaceDst, dstMemType, surfaceSrc, srcMemType, useGPUCopy)); } if (data.currFrameId != -1) { // This flag is allowing proper frame release in case of SW surfaces, when refcounter reaches zero after decrease decoder.m_surface_source->SetFreeSurfaceAllowedFlag(true); decoder.m_surface_source->DecreaseReference(data.currFrameId); decoder.m_surface_source->SetFreeSurfaceAllowedFlag(false); } decoder.m_framesStorage->DecodeFrame(data.currFrameId); return MFX_ERR_NONE; } { UMC::Status status = decoder.m_va->SyncTask(data.currFrameId); if (status != UMC::UMC_OK && status != UMC::UMC_ERR_TIMEOUT) { mfxStatus CriticalErrorStatus = (status == UMC::UMC_ERR_GPU_HANG) ? MFX_ERR_GPU_HANG : MFX_ERR_DEVICE_FAILED; decoder.SetCriticalErrorOccured(CriticalErrorStatus); return CriticalErrorStatus; } } MFX_SAFE_CALL(decoder.ReportDecodeStatus(data.surface_work)); if (data.showFrame) { MFX_CHECK(data.surface_work, MFX_ERR_UNDEFINED_BEHAVIOR); if (data.currFrameId >= (mfxI32)decoder.m_mCopyGuard.size()) { decoder.m_mCopyGuard.resize(data.currFrameId + 1); } UMC::AutomaticUMCMutex guardCopy(decoder.m_mCopyGuard[data.currFrameId]); mfxStatus sts = decoder.m_surface_source->PrepareToOutput(data.surface_work, data.currFrameId, 0, decoder.m_core->GetVAType() == MFX_HW_VAAPI); MFX_CHECK_STS(sts); } UMC::AutomaticUMCMutex guard(decoder.m_mGuard); if (data.currFrameId != -1) decoder.m_surface_source->DecreaseReference(data.currFrameId); decoder.m_framesStorage->DecodeFrame(data.currFrameId); return MFX_TASK_DONE; } mfxStatus VP9CompleteProc(void *p_state, void * /* pp_param */, mfxStatus) { delete (VideoDECODEVP9_HW::VP9DECODERoutineData*)p_state; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::ReportDecodeStatus(mfxFrameSurface1* surface_work) { std::ignore = surface_work; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::PrepareInternalSurface(UMC::FrameMemID &mid) { UMC::VideoDataInfo videoInfo; UMC::ColorFormat const cf = GetUMCColorFormat_VP9(&m_frameInfo); UMC::Status umcSts = videoInfo.Init(m_vPar.mfx.FrameInfo.Width, m_vPar.mfx.FrameInfo.Height, cf, m_frameInfo.bit_depth); MFX_CHECK(UMC::UMC_OK == umcSts, MFX_ERR_MEMORY_ALLOC); UMC::Status umc_sts = m_surface_source->Alloc(&mid, &videoInfo, mfx_UMC_ReallocAllowed); if (UMC::UMC_ERR_NOT_ENOUGH_BUFFER == umc_sts && m_adaptiveMode) { mfxFrameSurface1 *surf = m_surface_source->GetSurfaceByIndex(mid); MFX_CHECK(surf, MFX_ERR_INVALID_HANDLE); surf->Info.Width = m_vPar.mfx.FrameInfo.Width; surf->Info.Height = m_vPar.mfx.FrameInfo.Height; VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(m_core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_NULL_PTR1(vaapi_core_vpl); return vaapi_core_vpl->ReallocFrame(surf); } else MFX_CHECK(UMC::UMC_OK == umc_sts, MFX_ERR_MEMORY_ALLOC); return MFX_ERR_NONE; } static mfxStatus CheckFrameInfo(mfxFrameInfo const &currInfo, mfxFrameInfo &info, bool isVideoProcCscEnabled) { MFX_SAFE_CALL(CheckFrameInfoCommon(&info, MFX_CODEC_VP9)); //only CSC output support 422 format if(isVideoProcCscEnabled && info.ChromaFormat == MFX_CHROMAFORMAT_YUV422) { if (info.FourCC != MFX_FOURCC_Y216 && info.FourCC != MFX_FOURCC_YUY2) { MFX_CHECK_STS(MFX_ERR_INVALID_VIDEO_PARAM); } else if (info.FourCC == MFX_FOURCC_Y216) { MFX_CHECK(info.Shift == 1, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; } switch (info.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_AYUV: case MFX_FOURCC_Y410: break; case MFX_FOURCC_P016: case MFX_FOURCC_Y416: case MFX_FOURCC_P010: case MFX_FOURCC_Y210: MFX_CHECK(info.Shift == 1, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); break; default: MFX_CHECK_STS(MFX_ERR_INVALID_VIDEO_PARAM); } switch(info.ChromaFormat) { case MFX_CHROMAFORMAT_YUV420: case MFX_CHROMAFORMAT_YUV444: break; default: MFX_CHECK_STS(MFX_ERR_INVALID_VIDEO_PARAM); } if (!isVideoProcCscEnabled) { MFX_CHECK(currInfo.FourCC == info.FourCC, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT * p_entry_point) { UMC::AutomaticUMCMutex guard(m_mGuard); mfxStatus sts = MFX_ERR_NONE; UMC::FrameMemID repeateFrame = UMC::FRAME_MID_INVALID; MFX_CHECK(m_isInit, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(surface_out); *surface_out = nullptr; bool allow_null_work_surface = SupportsVPLFeatureSet(*m_core); if (!allow_null_work_surface) { MFX_CHECK_NULL_PTR1(surface_work); } bool isVideoProcCscEnabled = false; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing && (surface_work->Info.FourCC != m_vPar.mfx.FrameInfo.FourCC)) { isVideoProcCscEnabled = true; } #endif if (surface_work) { sts = CheckFrameInfo(m_vPar.mfx.FrameInfo, surface_work->Info, isVideoProcCscEnabled); MFX_CHECK_STS(sts); sts = CheckFrameData(surface_work); MFX_CHECK_STS(sts); } #if defined(MFX_ENABLE_PXP) //Check protect VA is enabled or not if( bs && m_va && m_va->GetProtectedVA()) { m_skipParseSuperFrameIndex = true; MFX_CHECK((bs->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME), MFX_ERR_UNSUPPORTED); m_va->GetProtectedVA()->SetBitstream(bs); } #endif // MFX_ENABLE_PXP do { try { m_framesStorage->CompleteFrames(); } catch (vp9_exception const& e) { UMC::Status status = e.GetStatus(); if (status != UMC::UMC_OK) MFX_RETURN(MFX_ERR_UNKNOWN); } if (NeedToReturnCriticalStatus(bs)) return ReturningCriticalStatus(); if (bs && !bs->DataLength) MFX_RETURN(MFX_ERR_MORE_DATA); if (bs == nullptr) { sts = CleanRefList(); MFX_CHECK_STS(sts); if (m_framesStorage->IsAllFramesCompleted()) { MFX_RETURN(MFX_ERR_MORE_DATA); } return MFX_WRN_DEVICE_BUSY; } sts = CheckBitstream(bs); MFX_CHECK_STS(sts); VP9DecoderFrame frameInfo = m_frameInfo; sts = DecodeFrameHeader(bs, frameInfo); MFX_CHECK_STS(sts); MFX_VP9_Utility::FillVideoParam(m_core->GetPlatformType(), frameInfo, m_vPar); if (surface_work) { if (!isVideoProcCscEnabled) { // check bit depth/color format change, skip if CSC enabled MFX_CHECK((m_vPar.mfx.FrameInfo.BitDepthLuma == surface_work->Info.BitDepthLuma && m_vPar.mfx.FrameInfo.BitDepthChroma == surface_work->Info.BitDepthChroma), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } // check resize if (m_vPar.mfx.FrameInfo.Width > surface_work->Info.Width || m_vPar.mfx.FrameInfo.Height > surface_work->Info.Height) { MFX_CHECK(m_adaptiveMode, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_RETURN(MFX_ERR_REALLOC_SURFACE); } } // possible system memory case. when external surface is enough, but internal is not. if (!m_adaptiveMode) { MFX_CHECK( m_vPar.mfx.FrameInfo.Width <= m_vInitPar.mfx.FrameInfo.Width && m_vPar.mfx.FrameInfo.Height <= m_vInitPar.mfx.FrameInfo.Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } //update frame info m_frameInfo = frameInfo; m_index++; sts = m_surface_source->SetCurrentMFXSurface(surface_work); MFX_CHECK_STS(sts); if (!m_surface_source->HasFreeSurface()) { return MFX_WRN_DEVICE_BUSY; } sts = PrepareInternalSurface(m_frameInfo.currFrame); MFX_CHECK_STS(sts); if (!m_frameInfo.frameCountInBS) { bs->DataOffset += bs->DataLength; bs->DataLength = 0; } if (!m_frameInfo.show_existing_frame) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VP9 decode DDISubmitTask"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(++FrameIndex, m_frameInfo.currFrame)); UMC::Status umcSts = m_va->BeginFrame(m_frameInfo.currFrame, 0); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, m_frameInfo.currFrame, umcSts)); MFX_CHECK(UMC::UMC_OK == umcSts, MFX_ERR_DEVICE_FAILED); sts = PackHeaders(&m_bs, m_frameInfo); MFX_CHECK_STS(sts); umcSts = m_va->Execute(); MFX_CHECK(UMC::UMC_OK == umcSts, MFX_ERR_DEVICE_FAILED); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(FrameIndex, umcSts)); umcSts = m_va->EndFrame(); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, sts)); MFX_CHECK(UMC::UMC_OK == umcSts, MFX_ERR_DEVICE_FAILED); } else { repeateFrame = m_frameInfo.ref_frame_map[m_frameInfo.frame_to_show]; ++m_statusReportFeedbackNumber; } try { m_framesStorage->Add(m_frameInfo); } catch (vp9_exception const& e) { UMC::Status status = e.GetStatus(); MFX_CHECK(status == UMC::UMC_OK, MFX_ERR_UNKNOWN); } // update list of references for next frame sts = UpdateRefFrames(); MFX_CHECK_STS(sts); if (m_frameInfo.showFrame) { sts = GetOutputSurface(surface_out, surface_work, m_frameInfo.currFrame); MFX_CHECK_STS(sts); SetFrameType(m_frameInfo, **surface_out); (*surface_out)->Data.TimeStamp = bs->TimeStamp != static_cast(MFX_TIMESTAMP_UNKNOWN) ? bs->TimeStamp : GetMfxTimeStamp(m_frameOrder * m_in_framerate); (*surface_out)->Data.Corrupted = 0; (*surface_out)->Data.FrameOrder = m_frameOrder; (*surface_out)->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; (*surface_out)->Info.CropW = (mfxU16)m_frameInfo.width; (*surface_out)->Info.CropH = (mfxU16)m_frameInfo.height; (*surface_out)->Info.AspectRatioW = m_vPar.mfx.FrameInfo.AspectRatioW; (*surface_out)->Info.AspectRatioH = m_vPar.mfx.FrameInfo.AspectRatioH; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (videoProcessing) { (*surface_out)->Info.CropH = videoProcessing->Out.CropH; (*surface_out)->Info.CropW = videoProcessing->Out.CropW; (*surface_out)->Info.CropX = videoProcessing->Out.CropX; (*surface_out)->Info.CropY = videoProcessing->Out.CropY; } #endif m_frameOrder++; sts = MFX_ERR_NONE; TRACE_BUFFER_EVENT(MFX_TRACE_API_VP9_OUTPUTINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, surface_out, VP9DecodeSurfaceOutparam, SURFACEOUT_VP9D); } else { sts = (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK; if (surface_work) // for model 3 we don't need to zero surface_out because we can alloc next frame inside decoder { surface_out = nullptr; } else // for model 3 if we need more surface we can alloc it inside decoder { if (m_vPar.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { MFX_SAFE_CALL(ReportDecodeStatus(surface_work)); } if (m_frameInfo.currFrame != -1) m_surface_source->DecreaseReference(m_frameInfo.currFrame); m_framesStorage->DecodeFrame(m_frameInfo.currFrame); } } } while (sts == MFX_ERR_MORE_DATA_SUBMIT_TASK && !surface_work); p_entry_point->pRoutine = &VP9DECODERoutine; p_entry_point->pCompleteProc = &VP9CompleteProc; VP9DECODERoutineData* routineData = new VP9DECODERoutineData(); routineData->decoder = this; routineData->currFrameId = m_frameInfo.currFrame; routineData->copyFromFrame = repeateFrame; routineData->index = m_index; routineData->showFrame = m_frameInfo.showFrame; if (surface_out) routineData->surface_work = *surface_out; p_entry_point->pState = routineData; p_entry_point->requiredNumThreads = 1; return sts; } mfxStatus VideoDECODEVP9_HW::DecodeSuperFrame(mfxBitstream *in, VP9DecoderFrame & info) { mfxU32 frameSizes[8] = { 0 }; mfxU32 frameCount = 0; m_bs = *in; if (!m_skipParseSuperFrameIndex) { MfxVP9Decode::ParseSuperFrameIndex(in->Data + in->DataOffset, in->DataLength, frameSizes, &frameCount); } if (frameCount > 1) { if (info.frameCountInBS == 0) // first call we meet super frame { info.frameCountInBS = frameCount; info.currFrameInBS = 0; } // it is not what we met before MFX_CHECK(info.frameCountInBS == frameCount, MFX_ERR_UNDEFINED_BEHAVIOR); m_bs.DataLength = frameSizes[info.currFrameInBS]; m_bs.DataOffset = in->DataOffset; for (mfxU32 i = 0; i < info.currFrameInBS; i++) m_bs.DataOffset += frameSizes[i]; if (m_bs.DataLength > m_bs.MaxLength) MFX_RETURN(MFX_ERR_MORE_DATA); info.currFrameInBS++; if (info.currFrameInBS < info.frameCountInBS) return MFX_ERR_NONE; } info.currFrameInBS = 0; info.frameCountInBS = 0; return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::DecodeFrameHeader(mfxBitstream *in, VP9DecoderFrame & info) { MFX_CHECK_NULL_PTR2(in, in->Data); try { mfxStatus sts = DecodeSuperFrame(in, info); MFX_CHECK_STS(sts); in = &m_bs; VP9Bitstream bsReader(in->Data + in->DataOffset, in->DataOffset + in->DataLength); if (VP9_FRAME_MARKER != bsReader.GetBits(2)) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); info.profile = bsReader.GetBit(); info.profile |= bsReader.GetBit() << 1; if (info.profile > 2) info.profile += bsReader.GetBit(); MFX_CHECK(info.profile < 4, MFX_ERR_UNDEFINED_BEHAVIOR); info.show_existing_frame = bsReader.GetBit(); if (info.show_existing_frame) { info.frame_to_show = bsReader.GetBits(3); info.width = info.sizesOfRefFrame[info.frame_to_show].width; info.height = info.sizesOfRefFrame[info.frame_to_show].height; info.showFrame = 1; return MFX_ERR_NONE; } info.frameType = (VP9_FRAME_TYPE) bsReader.GetBit(); info.showFrame = bsReader.GetBit(); info.errorResilientMode = bsReader.GetBit(); if (KEY_FRAME == info.frameType) { MFX_CHECK(CheckSyncCode(&bsReader), MFX_ERR_UNDEFINED_BEHAVIOR); try { GetBitDepthAndColorSpace(&bsReader, &info); } catch (vp9_exception const& e) { UMC::Status status = e.GetStatus(); MFX_CHECK(status == UMC::UMC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); } info.refreshFrameFlags = (1 << NUM_REF_FRAMES) - 1; for (mfxU8 i = 0; i < REFS_PER_FRAME; ++i) { info.activeRefIdx[i] = 0; } GetFrameSize(&bsReader, &info); } else { info.intraOnly = info.showFrame ? 0 : bsReader.GetBit(); info.resetFrameContext = info.errorResilientMode ? 0 : bsReader.GetBits(2); if (info.intraOnly) { MFX_CHECK(CheckSyncCode(&bsReader), MFX_ERR_UNDEFINED_BEHAVIOR); try { GetBitDepthAndColorSpace(&bsReader, &info); info.refreshFrameFlags = (mfxU8)bsReader.GetBits(NUM_REF_FRAMES); GetFrameSize(&bsReader, &info); } catch (vp9_exception const& e) { UMC::Status status = e.GetStatus(); MFX_CHECK(status == UMC::UMC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); } } else { info.refreshFrameFlags = (mfxU8)bsReader.GetBits(NUM_REF_FRAMES); for (mfxU8 i = 0; i < REFS_PER_FRAME; ++i) { const mfxI32 ref = bsReader.GetBits(REF_FRAMES_LOG2); info.activeRefIdx[i] = ref; info.refFrameSignBias[LAST_FRAME + i] = bsReader.GetBit(); } GetFrameSizeWithRefs(&bsReader, &info); info.allowHighPrecisionMv = bsReader.GetBit(); static const INTERP_FILTER literal2Filter[] = { EIGHTTAP_SMOOTH, EIGHTTAP, EIGHTTAP_SHARP, BILINEAR }; info.interpFilter = bsReader.GetBit() ? SWITCHABLE : literal2Filter[bsReader.GetBits(2)]; } } if (!info.errorResilientMode) { info.refreshFrameContext = bsReader.GetBit(); info.frameParallelDecodingMode = bsReader.GetBit(); } else { info.refreshFrameContext = 0; info.frameParallelDecodingMode = 1; } // This flag will be overridden by the call to vp9_setup_past_independence // below, forcing the use of context 0 for those frame types. info.frameContextIdx = bsReader.GetBits(FRAME_CONTEXTS_LOG2); if (info.frameType == KEY_FRAME || info.intraOnly || info.errorResilientMode) { SetupPastIndependence(info); } SetupLoopFilter(&bsReader, &info.lf); //setup_quantization() { info.baseQIndex = bsReader.GetBits(QINDEX_BITS); mfxI32 old_y_dc_delta_q = info.y_dc_delta_q; mfxI32 old_uv_dc_delta_q = info.uv_dc_delta_q; mfxI32 old_uv_ac_delta_q = info.uv_ac_delta_q; if (bsReader.GetBit()) { info.y_dc_delta_q = bsReader.GetBits(4); info.y_dc_delta_q = bsReader.GetBit() ? -info.y_dc_delta_q : info.y_dc_delta_q; } else info.y_dc_delta_q = 0; if (bsReader.GetBit()) { info.uv_dc_delta_q = bsReader.GetBits(4); info.uv_dc_delta_q = bsReader.GetBit() ? -info.uv_dc_delta_q : info.uv_dc_delta_q; } else info.uv_dc_delta_q = 0; if (bsReader.GetBit()) { info.uv_ac_delta_q = bsReader.GetBits(4); info.uv_ac_delta_q = bsReader.GetBit() ? -info.uv_ac_delta_q : info.uv_ac_delta_q; } else info.uv_ac_delta_q = 0; if (old_y_dc_delta_q != info.y_dc_delta_q || old_uv_dc_delta_q != info.uv_dc_delta_q || old_uv_ac_delta_q != info.uv_ac_delta_q || 0 == m_frameOrder) { InitDequantizer(&info); } info.lossless = (0 == info.baseQIndex && 0 == info.y_dc_delta_q && 0 == info.uv_dc_delta_q && 0 == info.uv_ac_delta_q); } // setup_segmentation() { info.segmentation.updateMap = 0; info.segmentation.updateData = 0; info.segmentation.enabled = (mfxU8)bsReader.GetBit(); if (info.segmentation.enabled) { // Segmentation map update info.segmentation.updateMap = (mfxU8)bsReader.GetBit(); if (info.segmentation.updateMap) { for (mfxU8 i = 0; i < VP9_NUM_OF_SEGMENT_TREE_PROBS; ++i) info.segmentation.treeProbs[i] = (mfxU8) (bsReader.GetBit() ? bsReader.GetBits(8) : VP9_MAX_PROB); info.segmentation.temporalUpdate = (mfxU8)bsReader.GetBit(); if (info.segmentation.temporalUpdate) { for (mfxU8 i = 0; i < VP9_NUM_OF_PREDICTION_PROBS; ++i) info.segmentation.predProbs[i] = (mfxU8) (bsReader.GetBit() ? bsReader.GetBits(8) : VP9_MAX_PROB); } else { for (mfxU8 i = 0; i < VP9_NUM_OF_PREDICTION_PROBS; ++i) info.segmentation.predProbs[i] = VP9_MAX_PROB; } } info.segmentation.updateData = (mfxU8)bsReader.GetBit(); if (info.segmentation.updateData) { info.segmentation.absDelta = (mfxU8)bsReader.GetBit(); ClearAllSegFeatures(info.segmentation); mfxI32 data = 0; mfxU32 nBits = 0; for (mfxU8 i = 0; i < VP9_MAX_NUM_OF_SEGMENTS; ++i) { for (mfxU8 j = 0; j < SEG_LVL_MAX; ++j) { data = 0; if (bsReader.GetBit()) // feature_enabled { EnableSegFeature(info.segmentation, i, (SEG_LVL_FEATURES) j); nBits = GetUnsignedBits(SEG_FEATURE_DATA_MAX[j]); data = bsReader.GetBits(nBits); data = data > SEG_FEATURE_DATA_MAX[j] ? SEG_FEATURE_DATA_MAX[j] : data; if (IsSegFeatureSigned( (SEG_LVL_FEATURES) j)) data = bsReader.GetBit() ? -data : data; } SetSegData(info.segmentation, i, (SEG_LVL_FEATURES) j, data); } } } } } // setup_tile_info() { const mfxI32 alignedWidth = AlignPowerOfTwo(info.width, MI_SIZE_LOG2); int minLog2TileColumns = 0, maxLog2TileColumns = 0, maxOnes = 0; mfxU32 miCols = alignedWidth >> MI_SIZE_LOG2; GetTileNBits(miCols, minLog2TileColumns, maxLog2TileColumns); maxOnes = maxLog2TileColumns - minLog2TileColumns; info.log2TileColumns = minLog2TileColumns; while (maxOnes-- && bsReader.GetBit()) info.log2TileColumns++; info.log2TileRows = bsReader.GetBit(); if (info.log2TileRows) info.log2TileRows += bsReader.GetBit(); } info.firstPartitionSize = bsReader.GetBits(16); MFX_CHECK(0 != info.firstPartitionSize, MFX_ERR_UNSUPPORTED); info.frameHeaderLength = uint32_t(bsReader.BitsDecoded() / 8 + (bsReader.BitsDecoded() % 8 > 0)); info.frameDataSize = in->DataLength; // vp9_loop_filter_frame_init() if (info.lf.filterLevel) { const mfxI32 scale = 1 << (info.lf.filterLevel >> 5); LoopFilterInfo & lf_info = info.lf_info; for (mfxU8 segmentId = 0; segmentId < VP9_MAX_NUM_OF_SEGMENTS; ++segmentId) { mfxI32 segmentFilterLevel = info.lf.filterLevel; if (IsSegFeatureActive(info.segmentation, segmentId, SEG_LVL_ALT_LF)) { const mfxI32 data = GetSegData(info.segmentation, segmentId, SEG_LVL_ALT_LF); segmentFilterLevel = clamp(info.segmentation.absDelta == SEGMENT_ABSDATA ? data : info.lf.filterLevel + data, 0, MAX_LOOP_FILTER); } if (!info.lf.modeRefDeltaEnabled) { memset(lf_info.level[segmentId], segmentFilterLevel, sizeof(lf_info.level[segmentId]) ); } else { const mfxI32 intra_lvl = segmentFilterLevel + info.lf.refDeltas[INTRA_FRAME] * scale; lf_info.level[segmentId][INTRA_FRAME][0] = (mfxU8) clamp(intra_lvl, 0, MAX_LOOP_FILTER); for (mfxU8 ref = LAST_FRAME; ref < MAX_REF_FRAMES; ++ref) { for (mfxU8 mode = 0; mode < MAX_MODE_LF_DELTAS; ++mode) { const mfxI32 inter_lvl = segmentFilterLevel + info.lf.refDeltas[ref] * scale + info.lf.modeDeltas[mode] * scale; lf_info.level[segmentId][ref][mode] = (mfxU8) clamp(inter_lvl, 0, MAX_LOOP_FILTER); } } } } } } catch(const vp9_exception & ex) { mfxStatus sts = ConvertStatusUmc2Mfx(ex.GetStatus()); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::PackHeaders(mfxBitstream *bs, VP9DecoderFrame const & info) { MFX_CHECK_NULL_PTR2(bs, bs->Data); if (!m_Packer.get()) { m_Packer.reset(Packer::CreatePacker(m_va)); MFX_CHECK(m_Packer, MFX_ERR_UNDEFINED_BEHAVIOR); } VP9Bitstream vp9bs(bs->Data + bs->DataOffset, bs->DataLength); try { m_Packer->BeginFrame(); VP9DecoderFrame packerInfo = info; m_Packer->PackAU(&vp9bs, &packerInfo); m_Packer->EndFrame(); } catch (vp9_exception const&) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } return MFX_ERR_NONE; } mfxStatus VideoDECODEVP9_HW::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_surface_source, MFX_ERR_NOT_INITIALIZED); return m_surface_source->GetSurface(surface); } #endif //MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/decode/vp9/src/mfx_vp9_dec_decode_utils.cpp000066400000000000000000000050001443134507600325320ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include #include #include "mfx_vp9_dec_decode_utils.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_frame.h" namespace MfxVP9Decode { void ParseSuperFrameIndex(const mfxU8 *data, size_t data_sz, mfxU32 sizes[8], mfxU32 *count) { assert(data_sz); mfxU8 marker = ReadMarker(data + data_sz - 1); *count = 0; if ((marker & 0xe0) == 0xc0) { const mfxU32 frames = (marker & 0x7) + 1; const mfxU32 mag = ((marker >> 3) & 0x3) + 1; const size_t index_sz = 2 + mag * frames; if (data_sz >= index_sz) { mfxU8 marker2 = ReadMarker(data + data_sz - index_sz); if (marker2 == marker) { // found a valid superframe index const mfxU8* x = &data[data_sz - index_sz + 1]; for (mfxU32 i = 0; i < frames; i++) { mfxU32 this_sz = 0; for (mfxU32 j = 0; j < mag; j++) this_sz |= (*x++) << (j * 8); sizes[i] = this_sz; } *count = frames; } } } } }; // namespace MfxVP9Decode #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/000077500000000000000000000000001443134507600243105ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/CMakeLists.txt000066400000000000000000000304031443134507600270500ustar00rootroot00000000000000add_library(encode_hw STATIC) include(functions.cmake) if (MFX_ENABLE_H264_VIDEO_ENCODE) target_include_directories(encode_hw PUBLIC h264/include ) set(AVC_VIDEO_ENCODE_SRC h264/include/mfx_h264_encode_hw.h h264/include/mfx_h264_encode_hw_utils.h h264/include/mfx_h264_enc_common_hw.h h264/include/mfx_h264_encode_interface.h h264/include/mfx_h264_encode_struct_vaapi.h h264/include/mfx_h264_encode_vaapi.h h264/src/mfx_h264_encode_hw.cpp h264/src/mfx_h264_encode_hw_utils.cpp h264/src/mfx_h264_encode_hw_utils_new.cpp h264/src/mfx_h264_enc_common_hw.cpp h264/src/mfx_h264_encode_factory.cpp h264/src/mfx_h264_encode_vaapi.cpp ) source_group("avc" FILES ${AVC_VIDEO_ENCODE_SRC}) endif() if (MFX_ENABLE_H265_VIDEO_ENCODE) target_include_directories(encode_hw PUBLIC hevc hevc/agnostic hevc/agnostic/base hevc/agnostic/g12 hevc/linux hevc/linux/g9 hevc/linux/g12 hevc/linux/xe_lpm_plus hevc/linux/base hevc/linux/xe_hpm ) set(HEVC_VIDEO_ENCODE_SRC hevc/hevcehw_disp.h hevc/agnostic/hevcehw_base.h hevc/agnostic/hevcehw_block_queues.h hevc/agnostic/hevcehw_ddi.h hevc/agnostic/hevcehw_decl_blocks.h hevc/agnostic/hevcehw_utils.h hevc/agnostic/base/hevcehw_base_data.h hevc/agnostic/base/hevcehw_base_dirty_rect.h hevc/agnostic/base/hevcehw_base_encode_stats.h hevc/agnostic/base/hevcehw_base_encoded_frame_info.h hevc/agnostic/base/hevcehw_base_enctools.cpp hevc/agnostic/base/hevcehw_base_enctools.h hevc/agnostic/base/hevcehw_base_ext_brc.h hevc/agnostic/base/hevcehw_base_hdr_sei.h hevc/agnostic/base/hevcehw_base_hrd.h hevc/agnostic/base/hevcehw_base_iddi.h hevc/agnostic/base/hevcehw_base_iddi_packer.h hevc/agnostic/base/hevcehw_base_interlace.h hevc/agnostic/base/hevcehw_base_legacy.h hevc/agnostic/base/hevcehw_base_max_frame_size.h hevc/agnostic/base/hevcehw_base_packer.h hevc/agnostic/base/hevcehw_base_parser.h hevc/agnostic/base/hevcehw_base_query_impl_desc.h hevc/agnostic/base/hevcehw_base_roi.h hevc/agnostic/base/hevcehw_base_task.h hevc/agnostic/base/hevcehw_base_weighted_prediction.h hevc/agnostic/base/hevcehw_base_alloc.h hevc/agnostic/base/hevcehw_base_constraints.h hevc/agnostic/base/hevcehw_base_scc.h hevc/agnostic/base/hevcehw_base_sao.h hevc/agnostic/base/hevcehw_base_rext.h hevc/agnostic/base/hevcehw_base_extddi.h hevc/agnostic/base/hevcehw_base_caps.h hevc/agnostic/g12/hevcehw_g12_caps.h hevc/agnostic/g12/hevcehw_g12_data.h hevc/linux/base/hevcehw_base_encoded_frame_info_lin.h hevc/linux/base/hevcehw_base_interlace_lin.h hevc/linux/base/hevcehw_base_lin.h hevc/linux/base/hevcehw_base_roi_lin.h hevc/linux/base/hevcehw_base_va_lin.h hevc/linux/base/hevcehw_base_va_packer_lin.h hevc/linux/base/hevcehw_base_weighted_prediction_lin.h hevc/linux/base/hevcehw_base_max_frame_size_lin.h hevc/linux/base/hevcehw_base_dirty_rect_lin.h hevc/linux/base/hevcehw_base_rext_lin.h hevc/linux/base/hevcehw_base_scc_lin.h hevc/linux/base/hevcehw_base_qp_modulation_lin.h hevc/linux/base/hevcehw_base_caps_lin.h hevc/linux/g12/hevcehw_g12_caps_lin.h hevc/linux/g12/hevcehw_g12_lin.h hevc/linux/xe_hpm/hevcehw_xe_hpm_lin.h hevc/linux/xe_lpm_plus/hevcehw_xe_lpm_plus_lin.h hevc/hevcehw_disp.cpp hevc/agnostic/hevcehw_base.cpp hevc/agnostic/base/hevcehw_base_alloc.cpp hevc/agnostic/base/hevcehw_base_constraints.cpp hevc/agnostic/base/hevcehw_base_dirty_rect.cpp hevc/agnostic/base/hevcehw_base_encode_stats.cpp hevc/agnostic/base/hevcehw_base_encoded_frame_info.cpp hevc/agnostic/base/hevcehw_base_ext_brc.cpp hevc/agnostic/base/hevcehw_base_hdr_sei.cpp hevc/agnostic/base/hevcehw_base_hrd.cpp hevc/agnostic/base/hevcehw_base_interlace.cpp hevc/agnostic/base/hevcehw_base_impl.cpp hevc/agnostic/base/hevcehw_base_legacy.cpp hevc/agnostic/base/hevcehw_base_legacy_defaults.cpp hevc/agnostic/base/hevcehw_base_max_frame_size.cpp hevc/agnostic/base/hevcehw_base_packer.cpp hevc/agnostic/base/hevcehw_base_parser.cpp hevc/agnostic/base/hevcehw_base_recon_info.cpp hevc/agnostic/base/hevcehw_base_query_impl_desc.cpp hevc/agnostic/base/hevcehw_base_roi.cpp hevc/agnostic/base/hevcehw_base_task.cpp hevc/agnostic/base/hevcehw_base_weighted_prediction.cpp hevc/agnostic/base/hevcehw_base_rext.cpp hevc/agnostic/base/hevcehw_base_scc.cpp hevc/agnostic/base/hevcehw_base_extddi.cpp hevc/agnostic/base/hevcehw_base_caps.cpp hevc/agnostic/g12/hevcehw_g12_caps.cpp hevc/linux/base/hevcehw_base_interlace_lin.cpp hevc/linux/base/hevcehw_base_lin.cpp hevc/linux/base/hevcehw_base_roi_lin.cpp hevc/linux/base/hevcehw_base_va_lin.cpp hevc/linux/base/hevcehw_base_va_packer_lin.cpp hevc/linux/base/hevcehw_base_weighted_prediction_lin.cpp hevc/linux/base/hevcehw_base_max_frame_size_lin.cpp hevc/linux/base/hevcehw_base_dirty_rect_lin.cpp hevc/linux/base/hevcehw_base_rext_lin.cpp hevc/linux/base/hevcehw_base_qp_modulation_lin.cpp hevc/linux/g12/hevcehw_g12_lin.cpp hevc/linux/xe_hpm/hevcehw_xe_hpm_lin.cpp hevc/linux/xe_lpm_plus/hevcehw_xe_lpm_plus_lin.cpp ) custom_source_group("hevc" ${HEVC_VIDEO_ENCODE_SRC}) endif() if (MFX_ENABLE_AV1_VIDEO_ENCODE) target_include_directories(encode_hw PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/av1/ ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/ ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_HPM ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_LPM_plus ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_HPM ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_LPM_plus ) set(AV1_VIDEO_ENCODE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/av1/av1ehw_disp.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/av1eimplbase.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/av1ehw_disp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_base.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_block_queues.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_ddi.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_decl_blocks.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_utils.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/av1ehw_base.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/av1ehw_struct_vaapi.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_va_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_va_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_va_packer_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_va_packer_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_qmatrix_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_max_frame_size_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/base/av1ehw_base_max_frame_size_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_HPM/av1ehw_xe_hpm.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_HPM/av1ehw_xe_hpm_segmentation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_HPM/av1ehw_xe_hpm_segmentation.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_HPM/av1ehw_xe_hpm_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_HPM/av1ehw_xe_hpm_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_LPM_plus/av1ehw_xe_lpm_plus_lin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/linux/Xe_LPM_plus/av1ehw_xe_lpm_plus_lin.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/Xe_LPM_plus/av1ehw_xe_lpm_plus.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_alloc.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_alloc.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_constraints.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_constraints.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_data.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_qmatrix.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_qmatrix.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_general.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_general.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_general_defaults.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_iddi.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_iddi_packer.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_impl.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_impl.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_packer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_packer.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_query_impl_desc.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_query_impl_desc.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_segmentation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_segmentation.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_task.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_task.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_tile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_tile.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_encoded_frame_info.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_encoded_frame_info.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_max_frame_size.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_max_frame_size.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_enctools.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_enctools.h ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_hdr.cpp ${CMAKE_CURRENT_SOURCE_DIR}/av1/agnostic/base/av1ehw_base_hdr.h ) custom_source_group("av1" ${AV1_VIDEO_ENCODE_SRC}) endif() if (MFX_ENABLE_MJPEG_VIDEO_ENCODE) target_include_directories(encode_hw PUBLIC mjpeg/include ${MSDK_UMC_ROOT}/codec/jpeg_common/include ) set(MJPEG_VIDEO_ENCODE_SRC mjpeg/include/mfx_mjpeg_encode_hw.h mjpeg/include/mfx_mjpeg_encode_hw_utils.h mjpeg/include/mfx_mjpeg_encode_interface.h mjpeg/include/mfx_mjpeg_encode_vaapi.h mjpeg/src/mfx_mjpeg_encode_factory.cpp mjpeg/src/mfx_mjpeg_encode_hw.cpp mjpeg/src/mfx_mjpeg_encode_hw_utils.cpp mjpeg/src/mfx_mjpeg_encode_vaapi.cpp ) source_group("mjpeg" FILES ${MJPEG_VIDEO_ENCODE_SRC}) endif() if (MFX_ENABLE_VP9_VIDEO_ENCODE) target_include_directories(encode_hw PUBLIC vp9/include ) set(VP9_VIDEO_ENCODE_SRC vp9/include/mfx_platform_defs.h vp9/include/mfx_vp9_encode_hw.h vp9/include/mfx_vp9_encode_hw_par.h vp9/include/mfx_vp9_encode_hw_utils.h vp9/include/mfx_vp9_encode_hw_vaapi.h vp9/include/mfx_vp9_encode_hw_ddi.h vp9/src/mfx_vp9_encode_hw.cpp vp9/src/mfx_vp9_encode_hw_ddi.cpp vp9/src/mfx_vp9_encode_hw_par.cpp vp9/src/mfx_vp9_encode_hw_utils.cpp vp9/src/mfx_vp9_encode_hw_vaapi.cpp ) source_group("vp9" FILES ${VP9_VIDEO_ENCODE_SRC}) endif() target_sources(encode_hw PRIVATE ${AVC_VIDEO_ENCODE_SRC} ${HEVC_VIDEO_ENCODE_SRC} ${AV1_VIDEO_ENCODE_SRC} ${MJPEG_VIDEO_ENCODE_SRC} ${VP9_VIDEO_ENCODE_SRC} shared/ehw_utils.h shared/ehw_resources_pool.h shared/ehw_task_manager.h shared/ehw_resources_pool.cpp shared/ehw_task_manager.cpp shared/ehw_device_vaapi.cpp shared/ehw_utils_vaapi.cpp ) target_include_directories(encode_hw PUBLIC ${MSDK_LIB_ROOT}/encode_hw/shared ${MSDK_STUDIO_ROOT}/shared/include ${MSDK_STUDIO_ROOT}/shared/mfx_logging/include ${MSDK_UMC_ROOT}/codec/brc/include ${MSDK_UMC_ROOT}/codec/color_space_converter/include $<$: ${MSDK_STUDIO_ROOT}/shared/enctools/include > ) set(ENCTOOLS_LIB $<$:enctools_base>) target_link_libraries(encode_hw PUBLIC mfx_static_lib umc_va_hw asc mfx_logging $<$:mfx_ext> PRIVATE mfx_sdl_properties bitrate_control ${ENCTOOLS_LIB} ) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/000077500000000000000000000000001443134507600247775ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/000077500000000000000000000000001443134507600266065ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_HPM/000077500000000000000000000000001443134507600276665ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_HPM/av1ehw_xe_hpm.h000066400000000000000000000034031443134507600325720ustar00rootroot00000000000000// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_impl.h" namespace AV1EHW { namespace Xe_HPM { template class MFXVideoENCODEAV1_HW : public TBaseGen { public: MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); }; template MFXVideoENCODEAV1_HW::MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseGen(core, status, mode) { } } //Xe_HPM }// namespace AV1EHW #endif av1ehw_xe_hpm_segmentation.cpp000066400000000000000000000126621443134507600356320ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_HPM// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_data.h" #include "av1ehw_xe_hpm_segmentation.h" namespace AV1EHW { namespace Xe_HPM { static mfxU8 FindUnusedSegmentId(const mfxExtAV1Segmentation& segPar) { assert(segPar.SegmentIds); assert(segPar.NumSegmentIdAlloc); std::array usedIDs = {}; for (mfxU32 i = 0; i < segPar.NumSegmentIdAlloc; i++) usedIDs.at(segPar.SegmentIds[i]) = true; auto unusedId = std::find(usedIDs.begin(), usedIDs.end(), false); return static_cast(std::distance(usedIDs.begin(), unusedId)); } void Segmentation::InitTask(const FeatureBlocks& blocks, TPushIT Push) { Base::Segmentation::InitTask(blocks, Push); Push(BLK_PatchSegmentParam , [this, &blocks]( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& global , StorageW& task) -> mfxStatus { mfxExtAV1Segmentation& segPar = Base::Task::Segment::Get(task); MFX_CHECK(IsSegmentationEnabled(&segPar), MFX_ERR_NONE); /* "PatchSegmentParam" does 2 workarounds 1) Sets SEG_LVL_SKIP feature for one of segments to force "SegIdPreSkip" to 1. SegIdPreSkip" should be set to 1 to WA HW issue. So far this WA is always applied. The condition could be revised/narrowed in the future. 2) Disables temporal_update (HW limitation). */ const mfxU8 id = FindUnusedSegmentId(segPar); if (id >= Base::AV1_MAX_NUM_OF_SEGMENTS) { // All segment_ids 0-7 are present in segmentation map // WA cannot be applied // Don't apply segmentation for current frame and return warning segPar = mfxExtAV1Segmentation{}; MFX_LOG_WARN("Can't apply SegIdPreSkip WA - no unused surfaces in seg map!\n"); return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } EnableFeature(segPar.Segment[id].FeatureEnabled, Base::SEG_LVL_SKIP); if (segPar.NumSegments < id + 1) segPar.NumSegments = id + 1; auto& par = Base::Glob::VideoParam::Get(global); mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); auxPar.SegmentTemporalUpdate = MFX_CODINGOPTION_OFF; return MFX_ERR_NONE; }); } inline bool IsSegBlockSmallerThanSB(mfxU32 segBlock, mfxU32 sb) { return sb == 128 || (sb == 64 && segBlock < MFX_AV1_SEGMENT_ID_BLOCK_SIZE_64x64); } void Segmentation::PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) { Base::Segmentation::PostReorderTask(blocks, Push); Push(BLK_PatchTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { Base::FH& fh = Base::Task::FH::Get(s_task); mfxExtAV1Segmentation& segPar = Base::Task::Segment::Get(s_task); if (IsSegmentationSwitchedOff(&segPar)) return MFX_ERR_NONE; if (!fh.segmentation_params.segmentation_update_map) { // in Xe_HPM "segmentation_update_map = 0" mode is implemented by forcing segmentation through VDEnc Stream in // there are following related restrictions/requirements: // 1) segmentation map should be always sent to the driver explicitly (even if there is no map update) // 2) "segmentation_update_map = 0" cannot be safely applied for SegmentIdBlockSize smaller than SB size const Base::SH& sh = Base::Glob::SH::Get(global); auto &segDpb = Base::Glob::SegDpb::Get(global); assert(!segDpb.empty()); const mfxU8 primaryRefFrameDpbIdx = static_cast(fh.ref_frame_idx[fh.primary_ref_frame]); const mfxExtAV1Segmentation* pRefPar = segDpb.at(primaryRefFrameDpbIdx).get(); assert(pRefPar); segPar.SegmentIds = pRefPar->SegmentIds; segPar.NumSegmentIdAlloc = pRefPar->NumSegmentIdAlloc; if (IsSegBlockSmallerThanSB(segPar.SegmentIdBlockSize, sh.sbSize)) { // force map update if SegmentIdBlockSize is smaller than SB size fh.segmentation_params.segmentation_update_map = 1; } } return MFX_ERR_NONE; }); } } //namespace Xe_HPM } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_xe_hpm_segmentation.h000066400000000000000000000041351443134507600352730ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_HPM// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_segmentation.h" namespace AV1EHW { namespace Xe_HPM { class Segmentation : public Base::Segmentation { public: #define BLOCK_ID_OFFSET Base::Segmentation::eBlockId::NUM_BLOCKS #define DECL_BLOCK_LIST\ DECL_BLOCK(PatchSegmentParam)\ DECL_BLOCK(PatchTask) #define DECL_FEATURE_NAME "Xe_HPM_Segmentation" #include "av1ehw_decl_blocks.h" Segmentation(mfxU32 FeatureId) : Base::Segmentation(FeatureId) { #if defined(MFX_ENABLE_LOG_UTILITY) m_trace.second.insert(Base::Segmentation::m_trace.second.begin(), Base::Segmentation::m_trace.second.end()); #endif } protected: virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; }; } //Xe_HPM } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_LPM_plus/000077500000000000000000000000001443134507600307355ustar00rootroot00000000000000av1ehw_xe_lpm_plus.h000066400000000000000000000026621443134507600346370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/Xe_LPM_plus// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_xe_hpm.h" #include "av1ehw_base_impl.h" namespace AV1EHW { namespace Xe_LPM_Plus { template using MFXVideoENCODEAV1_HW = AV1EHW::Xe_HPM::MFXVideoENCODEAV1_HW; } //Xe_LPM_Plus } //namespace AV1EHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_base.cpp000066400000000000000000000100441443134507600314760ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include #include namespace AV1EHW { const char* FeatureBlocks::GetFeatureName(mfxU32 featureID) { #if defined(MFX_ENABLE_LOG_UTILITY) return m_trace.at(featureID)->first.c_str(); #else std::ignore = featureID; return nullptr; #endif } const char* FeatureBlocks::GetBlockName(ID id) { #if defined(MFX_ENABLE_LOG_UTILITY) return m_trace.at(id.FeatureID)->second.at(id.BlockID).c_str(); #else std::ignore = id; return nullptr; #endif } void FeatureBase::Init( mfxU32 mode/*eFeatureMode*/ , FeatureBlocks& blocks) { mfxU32 prevMode = blocks.Init(m_id, mode); if (!prevMode) { SetSupported(blocks); ThrowAssert(blocks.m_trace.find(m_id) != blocks.m_trace.end(), "FeatureID must be unique"); blocks.m_trace[m_id] = GetTrace(); } mode &= ~prevMode; mfxU32 modesQ1 = (QUERY1 | QUERY_IO_SURF | INIT | QUERY_IMPLS_DESCRIPTION); bool bNeedQ0 = !!(mode & (QUERY0 | QUERY_IMPLS_DESCRIPTION)); bool bNeedQ1 = (mode & modesQ1) && !(prevMode & modesQ1); bool bNeedQIS = !!(mode & QUERY_IO_SURF); bool bNeedQID = !!(mode & QUERY_IMPLS_DESCRIPTION); bool bNeedIX = !!(mode & INIT); bool bNeedSD = bNeedQIS || bNeedIX; bool bNeedRT = !!(mode & RUNTIME); mfxU32 nQ = 0; nQ += bNeedQ0 && InitQueue(&FeatureBase::Query0, blocks); nQ += bNeedQ1 && InitQueue(&FeatureBase::Query1NoCaps, blocks); nQ += bNeedQ1 && InitQueue(&FeatureBase::Query1WithCaps, blocks); nQ += bNeedQIS && InitQueue(&FeatureBase::QueryIOSurf, blocks); nQ += bNeedQID && InitQueue(&FeatureBase::QueryImplsDescription, blocks); nQ += bNeedSD && InitQueue(&FeatureBase::SetDefaults, blocks); if (bNeedIX) { nQ += InitQueue(&FeatureBase::InitExternal, blocks); nQ += InitQueue(&FeatureBase::InitInternal, blocks); nQ += InitQueue(&FeatureBase::InitAlloc, blocks); nQ += InitQueue(&FeatureBase::AllocTask, blocks); } if (bNeedRT) { SetInherited(blocks); nQ += InitQueue(&FeatureBase::Reset, blocks); nQ += InitQueue(&FeatureBase::ResetState, blocks); nQ += InitQueue(&FeatureBase::FrameSubmit, blocks); nQ += InitQueue(&FeatureBase::AsyncRoutine, blocks); nQ += InitQueue(&FeatureBase::InitTask, blocks); nQ += InitQueue(&FeatureBase::PreReorderTask, blocks); nQ += InitQueue(&FeatureBase::PostReorderTask, blocks); nQ += InitQueue(&FeatureBase::SubmitTask, blocks); nQ += InitQueue(&FeatureBase::QueryTask, blocks); nQ += InitQueue(&FeatureBase::FreeTask, blocks); nQ += InitQueue(&FeatureBase::Close, blocks); nQ += InitQueue(&FeatureBase::GetVideoParam, blocks); } assert(nQ > 0); } }; //namespace AV1EHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_base.h000066400000000000000000000054621443134507600311530ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "mfxvideo.h" #include "mfxbrc.h" #include "mfx_ext_buffers.h" #include "mfxav1.h" #include "mfxvideo++int.h" #include "mfx_utils_logging.h" #include "mfx_utils_extbuf.h" #include "feature_blocks/mfx_feature_blocks_init_macros.h" #include "feature_blocks/mfx_feature_blocks_base.h" #include "av1ehw_utils.h" #include "av1eimplbase.h" namespace AV1EHW { using namespace MfxFeatureBlocks; namespace ExtBuffer { using namespace MfxExtBuffer; } struct FeatureBlocks : FeatureBlocksCommon { MFX_FEATURE_BLOCKS_DECLARE_BQ_UTILS_IN_FEATURE_BLOCK #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BLOCK #include "av1ehw_block_queues.h" #undef DEF_BLOCK_Q virtual const char* GetFeatureName(mfxU32 featureID) override; virtual const char* GetBlockName(ID id) override; std::map m_trace; }; #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_EXTERNAL #include "av1ehw_block_queues.h" #undef DEF_BLOCK_Q class FeatureBase : public FeatureBaseCommon { public: FeatureBase() = delete; virtual ~FeatureBase() {} virtual void Init( mfxU32 mode/*eFeatureMode*/ , FeatureBlocks& blocks) override; protected: #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BASE #include "av1ehw_block_queues.h" #undef DEF_BLOCK_Q typedef TPushQ1NC TPushQ1; FeatureBase(mfxU32 id) : FeatureBaseCommon(id) {} virtual const BlockTracer::TFeatureTrace* GetTrace() { return nullptr; } virtual void SetTraceName(std::string&& /*name*/) {} }; }; //namespace AV1EHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_block_queues.h000066400000000000000000000053501443134507600327160ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. DEF_BLOCK_Q(Query0, Q0, void, mfxVideoParam&) DEF_BLOCK_Q(Query1NoCaps, Q1NC, mfxStatus, const mfxVideoParam&, mfxVideoParam&, StorageRW&) DEF_BLOCK_Q(Query1WithCaps, Q1WC, mfxStatus, const mfxVideoParam&, mfxVideoParam&, StorageRW&) DEF_BLOCK_Q(QueryIOSurf, QIS, mfxStatus, const mfxVideoParam&, mfxFrameAllocRequest& request, StorageRW&) DEF_BLOCK_Q(SetDefaults, SD, void, mfxVideoParam&, StorageW&, StorageRW&) DEF_BLOCK_Q(InitExternal, IE, mfxStatus, const mfxVideoParam&, StorageRW&, StorageRW&) DEF_BLOCK_Q(InitInternal, II, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(InitAlloc, IA, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(Reset, R, mfxStatus, const mfxVideoParam&, StorageRW&, StorageRW&) DEF_BLOCK_Q(ResetState, RS, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(FrameSubmit, FS, mfxStatus, mfxEncodeCtrl*, mfxFrameSurface1*, mfxBitstream&, StorageW&, StorageRW&) DEF_BLOCK_Q(AsyncRoutine, AR, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(AllocTask, AT, mfxStatus, StorageW&, StorageRW&) DEF_BLOCK_Q(InitTask, IT, mfxStatus, mfxEncodeCtrl*, mfxFrameSurface1*, mfxBitstream*, StorageW&, StorageW&) DEF_BLOCK_Q(PreReorderTask, PreRT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(PostReorderTask, PostRT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(SubmitTask, ST, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(QueryTask, QT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(FreeTask, FT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(Close, CLS, void, StorageW&) DEF_BLOCK_Q(GetVideoParam, GVP, void, mfxVideoParam&, StorageR&) DEF_BLOCK_Q(QueryImplsDescription, QID, mfxStatus, VideoCORE&, mfxEncoderDescription::encoder&, mfx::PODArraysHolder&, StorageRW&) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_ddi.h000066400000000000000000000147031443134507600307770ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once typedef struct tagENCODE_CAPS_AV1 { union { struct { uint32_t CodingLimitSet : 1; uint32_t ForcedSegmentationSupport : 1; uint32_t AutoSegmentationSupport : 1; uint32_t BRCReset : 1; uint32_t TemporalLayerRateCtrl : 3; uint32_t DynamicScaling : 1; uint32_t NumScalablePipesMinus1 : 4; uint32_t UserMaxFrameSizeSupport : 1; uint32_t DirtyRectSupport : 1; uint32_t MoveRectSupport : 1; uint32_t TileSizeBytesMinus1 : 2; uint32_t FrameOBUSupport : 1; uint32_t SuperResSupport : 1; uint32_t CDEFChannelStrengthSupport : 1; uint32_t RandomAccessSupport : 1; uint32_t : 11; }; uint32_t CodingLimits; }; union { struct { uint8_t EncodeFunc : 1; // Enc+Pak uint8_t HybridPakFunc : 1; // Hybrid Pak function uint8_t EncFunc : 1; // Enc only function uint8_t reserved : 5; // 0 }; uint8_t CodingFunction; }; union { struct { uint8_t SEG_LVL_ALT_Q : 1; uint8_t SEG_LVL_ALT_LF_Y_V : 1; uint8_t SEG_LVL_ALT_LF_Y_H : 1; uint8_t SEG_LVL_ALT_LF_U : 1; uint8_t SEG_LVL_ALT_LF_V : 1; uint8_t SEG_LVL_REF_FRAME : 1; uint8_t SEG_LVL_SKIP : 1; uint8_t SEG_LVL_GLOBALMV : 1; }; uint8_t SegmentFeatureSupport; }; uint16_t reserved16b; uint32_t MaxPicWidth; uint32_t MaxPicHeight; uint8_t MaxNum_ReferenceL0_P; // [1..7] uint8_t MaxNum_ReferenceL0_B; // [1..7] uint8_t MaxNum_ReferenceL1_B; // [1..7] uint8_t reserved8b; uint16_t MaxNumOfDirtyRect; uint16_t MaxNumOfMoveRect; union { struct { uint32_t still_picture : 1; uint32_t use_128x128_superblock : 1; uint32_t enable_filter_intra : 1; uint32_t enable_intra_edge_filter : 1; // read_compound_tools uint32_t enable_interintra_compound : 1; uint32_t enable_masked_compound : 1; uint32_t enable_warped_motion : 1; uint32_t PaletteMode : 1; uint32_t enable_dual_filter : 1; uint32_t enable_order_hint : 1; uint32_t enable_jnt_comp : 1; uint32_t enable_ref_frame_mvs : 1; uint32_t enable_superres : 1; uint32_t enable_cdef : 1; uint32_t enable_restoration : 1; uint32_t allow_intrabc : 1; uint32_t ReservedBits : 16; } fields; uint32_t value; } AV1ToolSupportFlags; union { struct { uint8_t i420 : 1; // support I420 uint8_t i422 : 1; // support I422 uint8_t i444 : 1; // support I444 uint8_t mono_chrome : 1; // support mono uint8_t RGB : 1; // support RGB uint8_t reserved : 3; // [0] } fields; uint32_t value; } ChromaSupportFlags; union { struct { uint8_t eight_bits : 1; // support 8 bits uint8_t ten_bits : 1; // support 10 bits uint8_t twelve_bits : 1; // support 12 bits uint8_t reserved : 5; // [0] } fields; uint32_t value; } BitDepthSupportFlags; union { struct { uint8_t EIGHTTAP : 1; uint8_t EIGHTTAP_SMOOTH : 1; uint8_t EIGHTTAP_SHARP : 1; uint8_t BILINEAR : 1; uint8_t SWITCHABLE : 1; uint8_t reserved : 3; // [0] } fields; uint8_t value; } SupportedInterpolationFilters; uint8_t MinSegIdBlockSizeAccepted; union { struct { uint32_t CQP : 1; uint32_t CBR : 1; uint32_t VBR : 1; uint32_t AVBR : 1; uint32_t ICQ : 1; uint32_t VCM : 1; uint32_t QVBR : 1; uint32_t CQL : 1; uint32_t reserved1 : 8; // [0] uint32_t SlidingWindow : 1; uint32_t LowDelay : 1; uint32_t LookaheadBRCSupport : 1; uint32_t LookaheadAnalysisSupport : 1; uint32_t TCBRCSupport : 1; uint32_t reserved2 : 11; // [0] } fields; uint32_t value; } SupportedRateControlMethods; uint32_t reserved32b[16]; } ENCODE_CAPS_AV1; typedef enum { SINGLE_REFERENCE = 0, COMPOUND_REFERENCE = 1, REFERENCE_MODE_SELECT = 2, REFERENCE_MODES = 3, } REFERENCE_MODE; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_decl_blocks.h000066400000000000000000000026141443134507600325010ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //use customized version w/trace support instead of default one #define DECL_BLOCK_CLEANUP_DISABLE #define CODEC_NAME_PREFIX "AV1e_" #include "feature_blocks/mfx_feature_blocks_decl_blocks.h" #undef CODEC_NAME_PREFIX #undef DECL_BLOCK_LIST #undef DECL_FEATURE_NAME #undef DECL_BLOCK_CLEANUP_DISABLEoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/av1ehw_utils.h000066400000000000000000000033301443134507600313710ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "ehw_utils.h" namespace AV1EHW { using namespace MfxEncodeHW::Utils; inline mfxU8 CO2Flag(mfxU16 CO) { return CO == MFX_CODINGOPTION_ON ? 1 : 0; } inline mfxU32 Ceil(mfxF64 x) { return (mfxU32)(.999 + x); } template inline T TileLog2(T blkSize, T target) { mfxU16 k; for (k = 0; (blkSize << k) < target; k++) { } return k; } inline mfxU16 CountTL(const mfxExtTemporalLayers& TL) { return std::max(mfxU16(1), TL.NumLayers); } } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/000077500000000000000000000000001443134507600275205ustar00rootroot00000000000000av1ehw_base_alloc.cpp000066400000000000000000000062211443134507600335050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_alloc.h" using namespace AV1EHW; using namespace AV1EHW::Base; template inline typename CallChain::TInt WrapCC(TR(MfxEncodeHW::ResPool::*pfn)(TArgs...), MfxEncodeHW::ResPool* pAlloc) { return [=](typename CallChain::TExt, TArgs ...arg) { return (pAlloc->*pfn)(arg...); }; } template inline typename CallChain::TInt WrapCC(TR(MfxEncodeHW::ResPool::*pfn)(TArgs...) const, const MfxEncodeHW::ResPool* pAlloc) { return [=](typename CallChain::TExt, TArgs ...arg) { return (pAlloc->*pfn)(arg...); }; } IAllocation* Allocator::MakeAlloc(std::unique_ptr&& upAlloc) { std::unique_ptr pIAlloc(new IAllocation); bool bInvalid = !(pIAlloc && upAlloc); if (bInvalid) return nullptr; auto pAlloc = upAlloc.release(); #define WRAP_CC(X) pIAlloc->X.Push(WrapCC(&MfxEncodeHW::ResPool::X, pAlloc)) WRAP_CC(Alloc); WRAP_CC(GetResponse); WRAP_CC(GetInfo); WRAP_CC(Release); WRAP_CC(ClearFlag); WRAP_CC(SetFlag); WRAP_CC(GetFlag); WRAP_CC(UnlockAll); pIAlloc->Acquire.Push([=](IAllocation::TAcquire::TExt) -> Resource { auto res0 = pAlloc->Acquire(); Resource res1; res1.Idx = res0.Idx; res1.Mid = res0.Mid; return res1; }); pIAlloc->m_pthis.reset(pAlloc); return pIAlloc.release(); } void Allocator::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [](StorageRW&, StorageRW& local) -> mfxStatus { auto CreateAllocator = [](VideoCORE& core) -> IAllocation* { return MakeAlloc(std::unique_ptr(new MfxEncodeHW::ResPool(core))); }; local.Insert(Tmp::MakeAlloc::Key, new Tmp::MakeAlloc::TRef(CreateAllocator)); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_alloc.h000066400000000000000000000033661443134507600332400ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include "ehw_resources_pool.h" namespace AV1EHW { namespace Base { class Allocator : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) #define DECL_FEATURE_NAME "Base_Allocator" #include "av1ehw_decl_blocks.h" Allocator(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; static IAllocation* MakeAlloc(std::unique_ptr&&); }; } //Base } //namespace AV1EHW #endif av1ehw_base_constraints.cpp000066400000000000000000000254431443134507600347710ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_constraints.h" #include #include namespace AV1EHW { namespace Base { enum TABLE_A1_COLS_INDEX { MAX_PIC_SIZE_INDEX = 0, MAX_H_SIZE_INDEX, MAX_V_SIZE_INDEX, MAX_DISPLAY_RATE_INDEX, MAX_DECODE_RATE_INDEX, TABLE_A1_COLS_NUM, }; enum TABLE_A2_COLS_INDEX { MAX_HEADER_RATE_INDEX = 0, MAIN_BPS_INDEX, HIGH_BPS_INDEX, MAIN_CR_INDEX, HIGH_CR_INDEX, MAX_TILES_INDEX, MAX_TILE_COLS_INDEX, TABLE_A2_COLS_NUM, }; const mfxU64 TableA1[][TABLE_A1_COLS_NUM] = { // Level |MaxPicSize | MaxHSize | MaxVSize | MaxDiaplayRate | MaxDecodeRate /* 2.0 */ { 147456, 2048, 1152, 4423680, 5529600}, /* 2.1 */ { 278784, 2816, 1584, 8363520, 10454400}, /* 3.0 */ { 665856, 4352, 2448, 19975680, 24969600}, /* 3.1 */ { 1065024, 5504, 3096, 31950720, 39938400}, /* 4.0 */ { 2359296, 6144, 3456, 70778880, 77856768}, /* 4.1 */ { 2359296, 6144, 3456, 141557760, 155713536}, /* 5.0 */ { 8912896, 8192, 4352, 267386880, 273705200}, /* 5.1 */ { 8912896, 8192, 4352, 534773760, 547430400}, /* 5.2 */ { 8912896, 8192, 4352, 1069547520, 1094860800}, /* 5.3 */ { 8912896, 8192, 4352, 1069547520, 1176502272}, /* 6.0 */ {35651584, 16384, 8704, 1069547520, 1176502272}, /* 6.1 */ {35651584, 16384, 8704, 2139095040, 2189721600}, /* 6.2 */ {35651584, 16384, 8704, 4278190080, 4379443200}, /* 6.3 */ {35651584, 16384, 8704, 4278190080, 4706009088}, }; const mfxU32 TableA2[][TABLE_A2_COLS_NUM] = { // Level | MaxHeaderRate | Mainbps | Highbps | MainCR | HighCR | MaxTiles | MaxTileCols /* 2.0 */ { 150, 1500000, 0, 2, 0, 8, 4}, /* 2.1 */ { 150, 3000000, 0, 2, 0, 8, 4}, /* 3.0 */ { 150, 6000000, 0, 2, 0, 16, 6}, /* 3.1 */ { 150, 10000000, 0, 2, 0, 16, 6}, /* 4.0 */ { 300, 12000000, 30000000, 4, 4, 32, 8}, /* 4.1 */ { 300, 20000000, 50000000, 4, 4, 32, 8}, /* 5.0 */ { 300, 30000000, 100000000, 6, 4, 64, 8}, /* 5.1 */ { 300, 40000000, 160000000, 8, 4, 64, 8}, /* 5.2 */ { 300, 60000000, 240000000, 8, 4, 64, 8}, /* 5.3 */ { 300, 60000000, 240000000, 8, 4, 64, 8}, /* 6.0 */ { 300, 60000000, 240000000, 8, 4, 128, 16}, /* 6.1 */ { 300, 100000000, 480000000, 8, 4, 128, 16}, /* 6.2 */ { 300, 160000000, 800000000, 8, 4, 128, 16}, /* 6.3 */ { 300, 160000000, 800000000, 8, 4, 128, 16}, }; const mfxU16 MAX_LEVEL_INDEX = (sizeof(TableA1) / sizeof(TableA1[0])); inline mfxU16 GetLevelIndexInTable(mfxU16 CodecLevel) { return LevelIndexInTable.at(CodecLevel); } mfxU32 GetMaxHSizeByLevel(mfxU16 CodecLevel) { const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); return mfxU32(TableA1[levelIndex][MAX_H_SIZE_INDEX]); } mfxU32 GetMaxVSizeByLevel(mfxU16 CodecLevel) { const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); return mfxU32(TableA1[levelIndex][MAX_V_SIZE_INDEX]); } /* * Refer to AV1 Spec section A.3 Levels These requirements depend on the following level, tier, and profile dependent variables: If seq_tier is equal to 0, MaxBitrate is equal to MainMbps multiplied by 1,000,000 Otherwise (seq_tier is equal to 1), MaxBitrate is equal to HighMbps multiplied by 1,000,000 MaxBufferSize is equal to MaxBitrate multiplied by 1 second If seq_profile is equal to 0, BitrateProfileFactor is equal to 1.0 If seq_profile is equal to 1, BitrateProfileFactor is equal to 2.0 If seq_profile is equal to 2, BitrateProfileFactor is equal to 3.0 */ mfxU32 GetMaxKbpsByLevel(mfxU16 CodecLevel, mfxU16 CodecProfile, mfxU16 seqTier) { const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); mfxU32 BitrateProfileFactor = 1; switch (CodecProfile) { case(MFX_PROFILE_AV1_MAIN): BitrateProfileFactor = 1; break; case(MFX_PROFILE_AV1_HIGH): BitrateProfileFactor = 2; break; case(MFX_PROFILE_AV1_PRO): BitrateProfileFactor = 3; break; default: BitrateProfileFactor = 1; } const mfxU32 maxKbps = (seqTier == 0) ? TableA2[levelIndex][MAIN_BPS_INDEX] : TableA2[levelIndex][HIGH_BPS_INDEX]; return maxKbps / 1000 * BitrateProfileFactor; } mfxF64 GetMaxFrameRateByLevel(mfxU16 CodecLevel, mfxU32 width, mfxU32 height) { assert(width != 0 && height != 0); const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); const mfxF64 maxDisplayRate = mfxF64(TableA1[levelIndex][MAX_DISPLAY_RATE_INDEX]); return maxDisplayRate / width / height; } mfxU32 GetMaxTiles(mfxU16 CodecLevel) { const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); return mfxU32(TableA2[levelIndex][MAX_TILES_INDEX]); } mfxU16 GetMaxTileCols(mfxU16 CodecLevel) { const mfxU16 levelIndex = GetLevelIndexInTable(CodecLevel); return mfxU16(TableA2[levelIndex][MAX_TILE_COLS_INDEX]); } mfxU16 GetMinLevel( mfxU32 frN , mfxU32 frD , mfxU32 width , mfxU32 height , mfxU16 numTileCols , mfxU16 numTileRows , mfxU32 maxKbps , mfxU16 profile , mfxU16 startLevel) { assert(isValidCodecLevel(startLevel)); mfxU16 lastLevel = startLevel; auto levelIt = LevelIndexInTable.find(startLevel); while (levelIt != LevelIndexInTable.end()) { lastLevel = levelIt->first; mfxU16 level = levelIt->first; mfxU16 levelIndex = levelIt->second; const mfxU32 picSizeInSamplesY = width * height; const mfxU32 numTiles = mfxU32(numTileCols) * mfxU32(numTileRows); const mfxF64 maxFrameRate = GetMaxFrameRateByLevel(level, width, height); const mfxU64 maxPicSize = TableA1[levelIndex][MAX_PIC_SIZE_INDEX]; const mfxU64 maxHSize = TableA1[levelIndex][MAX_H_SIZE_INDEX]; const mfxU64 maxVSize = TableA1[levelIndex][MAX_V_SIZE_INDEX]; const mfxU32 maxTileCols = TableA2[levelIndex][MAX_TILE_COLS_INDEX]; const mfxU32 maxTiles = TableA2[levelIndex][MAX_TILES_INDEX]; bool bNextLevel = frN > (maxFrameRate * frD) || picSizeInSamplesY > maxPicSize || width > maxHSize || height > maxVSize || numTileCols > maxTileCols || numTiles > maxTiles; if (!bNextLevel && maxKbps > 0) { mfxU32 maxKbpsByLevel = GetMaxKbpsByLevel(level, profile); // Note: HighMbps is not defined for levels below level 4.0. Try seq_tier 1 for higher Mbps if (level >= MFX_LEVEL_AV1_4 && maxKbps > maxKbpsByLevel) { maxKbpsByLevel = GetMaxKbpsByLevel(level, profile, 1); } bNextLevel |= (maxKbps > maxKbpsByLevel); } if (!bNextLevel) { break; } else { levelIt++; } } if (levelIt != LevelIndexInTable.end()) { return levelIt->first; } else { return lastLevel; // Return maximum supported level } } mfxU16 GetMinLevel( const Defaults::Param& defPar , mfxU16 startLevel) { const mfxU16 rc = defPar.base.GetRateControlMethod(defPar); mfxU32 maxKbps = 0; SetIf(maxKbps, rc != MFX_RATECONTROL_CQP && rc != MFX_RATECONTROL_ICQ, [&]() { return defPar.base.GetMaxKbps(defPar); }); const auto frND = defPar.base.GetFrameRate(defPar); const auto res = GetRealResolution(defPar.mvp); const mfxExtAV1TileParam* pTiles = ExtBuffer::Get(defPar.mvp); const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(defPar.mvp); const auto tiles = GetNumTiles(pTiles, pAuxPar); return GetMinLevel( std::get<0>(frND) , std::get<1>(frND) , std::get<0>(res) ,std::get<1>(res) , std::get<0>(tiles) , std::get<1>(tiles) , maxKbps , defPar.mvp.mfx.CodecProfile , startLevel); } } //namespace Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)av1ehw_base_constraints.h000066400000000000000000000064531443134507600344360ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { const std::map LevelIndexInTable = { {(mfxU16)MFX_LEVEL_AV1_2 , (mfxU16)0}, {(mfxU16)MFX_LEVEL_AV1_21, (mfxU16)1}, {(mfxU16)MFX_LEVEL_AV1_3 , (mfxU16)2}, {(mfxU16)MFX_LEVEL_AV1_31, (mfxU16)3}, {(mfxU16)MFX_LEVEL_AV1_4 , (mfxU16)4}, {(mfxU16)MFX_LEVEL_AV1_41, (mfxU16)5}, {(mfxU16)MFX_LEVEL_AV1_5 , (mfxU16)6}, {(mfxU16)MFX_LEVEL_AV1_51, (mfxU16)7}, {(mfxU16)MFX_LEVEL_AV1_52, (mfxU16)8}, {(mfxU16)MFX_LEVEL_AV1_53, (mfxU16)9}, {(mfxU16)MFX_LEVEL_AV1_6 , (mfxU16)10}, }; // Level 2.2/2.3/3.2/3.3/4.2/4.3 are not defined yet in av1 spec. // Here remap such level to a lower level which is defined in spec. // And use the same MaxPicSize/MaxHSize/etc. const std::map LevelsRemap = { {(mfxU16)MFX_LEVEL_AV1_22, (mfxU16)MFX_LEVEL_AV1_21}, {(mfxU16)MFX_LEVEL_AV1_23, (mfxU16)MFX_LEVEL_AV1_21}, {(mfxU16)MFX_LEVEL_AV1_32, (mfxU16)MFX_LEVEL_AV1_31}, {(mfxU16)MFX_LEVEL_AV1_33, (mfxU16)MFX_LEVEL_AV1_31}, {(mfxU16)MFX_LEVEL_AV1_42, (mfxU16)MFX_LEVEL_AV1_41}, {(mfxU16)MFX_LEVEL_AV1_43, (mfxU16)MFX_LEVEL_AV1_41}, }; inline bool isValidCodecLevel(mfxU16 CodecLevel) { return LevelIndexInTable.find(CodecLevel) != LevelIndexInTable.end(); } mfxU32 GetMaxHSizeByLevel(mfxU16 CodecLevel); mfxU32 GetMaxVSizeByLevel(mfxU16 CodecLevel); mfxU32 GetMaxKbpsByLevel(mfxU16 CodecLevel, mfxU16 CodecProfile, mfxU16 seqTier = 0); mfxF64 GetMaxFrameRateByLevel(mfxU16 CodecLevel, mfxU32 width, mfxU32 height); mfxU32 GetMaxTiles(mfxU16 CodecLevel); mfxU16 GetMaxTileCols(mfxU16 CodecLevel); mfxU16 GetMinLevel( mfxU32 frN , mfxU32 frD , mfxU32 width , mfxU32 height , mfxU16 numTileCols , mfxU16 numTileRows , mfxU32 maxKbps , mfxU16 profile , mfxU16 startLevel); mfxU16 GetMinLevel( const Defaults::Param& defPar , mfxU16 startLevel); } //Base } //namespace AV1EHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_data.h000066400000000000000000001374601443134507600330620ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_ddi.h" #include "ehw_device.h" #include #include namespace AV1EHW { namespace Base { const uint32_t SB_SIZE = 64; const uint8_t AV1_MAX_Q_INDEX = 255; const uint8_t AV1_MIN_Q_INDEX = 1; const uint8_t AV1_NUM_QMATRIX = 15; const uint8_t AV1_MAX_NUM_OF_SEGMENTS = 8; const uint8_t AV1_MAX_LOOP_FILTER = 63; const uint8_t PRIMARY_REF_BITS = 3; const uint8_t PRIMARY_REF_NONE = 7; const uint16_t MIN_FRAME_WIDTH = 128; const uint16_t MIN_FRAME_HEIGHT = 96; const uint8_t FRAME_CONTEXTS_LOG2 = 3; const uint8_t MAX_MODE_LF_DELTAS = 2; const uint8_t REFS_PER_FRAME = 7; const uint8_t TOTAL_REFS_PER_FRAME = 8; const uint8_t REF_FRAMES_LOG2 = 3; const uint8_t NUM_REF_FRAMES = 1 << REF_FRAMES_LOG2; const uint8_t CDEF_MAX_STRENGTHS = 8; const uint8_t CDEF_STRENGTH_BITS = 6; const uint8_t CDEF_STRENGTH_DIVISOR = 4; const uint8_t MAX_MB_PLANE = 3; const uint8_t MAX_POINTS_IN_SCALING_FUNCTION_LUMA = 14; const uint8_t MAX_POINTS_IN_SCALING_FUNCTION_CHROMA = 10; const uint8_t MAX_AUTOREG_COEFFS_LUMA = 24; const uint8_t MAX_AUTOREG_COEFFS_CHROMA = MAX_AUTOREG_COEFFS_LUMA + 1; const uint8_t MAX_NUM_TEMPORAL_LAYERS = 8; const uint8_t MAX_NUM_SPATIAL_LAYERS = 4; const uint8_t MAX_NUM_OPERATING_POINTS = MAX_NUM_TEMPORAL_LAYERS * MAX_NUM_SPATIAL_LAYERS; const uint32_t AV1_MAX_TILE_WIDTH = 4096; const uint32_t AV1_MAX_TILE_AREA = (4096 * 2304); const uint32_t AV1_MAX_TILE_WIDTH_SB = AV1_MAX_TILE_WIDTH / SB_SIZE; const uint32_t AV1_MAX_TILE_AREA_SB = AV1_MAX_TILE_AREA / (SB_SIZE * SB_SIZE); const uint32_t AV1_MAX_NUM_TILE_ROWS = 64; const uint32_t AV1_MAX_NUM_TILE_COLS = 64; const uint16_t DEFAULT_TARGET_USAGE = MFX_TARGETUSAGE_BALANCED; const uint16_t DEFAULT_GOP_PIC_SIZE = 248; const uint16_t DEFAULT_GOP_REF_DIST = 8; const mfxU8 IDX_INVALID = 0xff; const int16_t DEFAULT_BPYR_QP_OFFSETS[8] = {32, 40, 48, 48, 48, 48, 48, 48}; static const uint8_t LoopFilterLevelsLuma[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 56, 58, 59, 61, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }; static const uint8_t LoopFilterLevelsChroma[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31 }; static const uint8_t ICQFactorLookup[52] = { 0, 1, 1, 1, 1, 2, 3, 4, 6, 7, 9, 11, 13, 16, 18, 23, 26, 30, 34, 39, 46, 52, 59, 68, 77, 87, 98, 104,112,120,127,134, 142,149,157,164,171,178,186,193,200,207,213,219,225,230,235,240, 245,249,252,255 }; inline bool IsValid(mfxU8 idx) { return idx != IDX_INVALID; } enum { BITDEPTH_8 = 8, BITDEPTH_10 = 10 }; enum { GOP_INFINITE = 0xFFFF, HW_SURF_ALIGN_W = 16, HW_SURF_ALIGN_H = 16, }; struct ScalingList { mfxU8 scalingLists0[6][16] = {}; mfxU8 scalingLists1[6][64] = {}; mfxU8 scalingLists2[6][64] = {}; mfxU8 scalingLists3[2][64] = {}; mfxU8 scalingListDCCoefSizeID2[6] = {}; mfxU8 scalingListDCCoefSizeID3[2] = {}; }; struct TimingInfo { uint32_t num_units_in_display_tick = 0; uint32_t time_scale = 0; uint32_t equal_picture_interval = 0; uint32_t num_ticks_per_picture_minus_1 = 0; }; struct DecoderModelInfo { uint32_t buffer_delay_length_minus_1 = 0; uint32_t num_units_in_decoding_tick = 0; uint32_t buffer_removal_time_length_minus_1 = 0; uint32_t frame_presentation_time_length_minus_1 = 0; }; struct OperatingParametersInfo { uint32_t decoder_buffer_delay = 0; uint32_t encoder_buffer_delay = 0; uint32_t low_delay_mode_flag = 0; }; struct ColorConfig { uint32_t BitDepth = 0; uint32_t mono_chrome = 0; uint32_t color_primaries = 0; uint32_t transfer_characteristics = 0; uint32_t matrix_coefficients = 0; uint32_t color_description_present_flag = 0; uint32_t color_range = 0; uint32_t chroma_sample_position = 0; uint32_t subsampling_x = 0; uint32_t subsampling_y = 0; uint32_t separate_uv_delta_q = 0; }; struct SH { //Rev 0.85 parameters (AV1 spec version 1.0) in order of appearance/calculation in sequence_header_obu() uint32_t seq_profile = 0; uint32_t still_picture = 0; uint32_t reduced_still_picture_header = 0; uint32_t timing_info_present_flag = 0; TimingInfo timing_info; uint32_t decoder_model_info_present_flag = 0; DecoderModelInfo decoder_model_info; uint32_t operating_points_cnt_minus_1 = 0; uint32_t operating_point_idc[MAX_NUM_OPERATING_POINTS] = { 0 }; uint32_t seq_level_idx[MAX_NUM_OPERATING_POINTS] = { 0 }; uint32_t seq_tier[MAX_NUM_OPERATING_POINTS] = { 0 }; uint32_t decoder_model_present_for_this_op[MAX_NUM_OPERATING_POINTS] = { 0 }; OperatingParametersInfo operating_parameters_info[MAX_NUM_OPERATING_POINTS]; uint32_t initial_display_delay_minus_1[MAX_NUM_OPERATING_POINTS] = { 0 }; uint32_t frame_width_bits = 0; uint32_t frame_height_bits = 0; uint32_t max_frame_width = 0; uint32_t max_frame_height = 0; uint32_t frame_id_numbers_present_flag = 0; uint32_t delta_frame_id_length = 0; uint32_t idLen = 0; uint32_t sbSize = 0; uint32_t enable_filter_intra = 0; uint32_t enable_intra_edge_filter = 0; uint32_t enable_interintra_compound = 0; uint32_t enable_masked_compound = 0; uint32_t enable_warped_motion = 0; uint32_t enable_dual_filter = 0; uint32_t enable_order_hint = 0; uint32_t enable_jnt_comp = 0; uint32_t enable_ref_frame_mvs = 0; uint32_t seq_force_screen_content_tools = 0; uint32_t seq_force_integer_mv = 0; uint32_t order_hint_bits_minus1 = 0; uint32_t enable_superres = 0; uint32_t enable_cdef = 0; uint32_t enable_restoration = 0; ColorConfig color_config; uint32_t film_grain_param_present = 0; }; enum FRAME_TYPE { KEY_FRAME = 0, INTER_FRAME = 1, INTRA_ONLY_FRAME = 2, // replaces intra-only SWITCH_FRAME = 3, NUM_FRAME_TYPES, }; enum { INTRA_FRAME = 0, LAST_FRAME = 1, LAST2_FRAME = 2, LAST3_FRAME = 3, GOLDEN_FRAME = 4, BWDREF_FRAME = 5, ALTREF2_FRAME = 6, ALTREF_FRAME = 7, MAX_REF_FRAMES = 8 }; enum INTERP_FILTER{ EIGHTTAP_REGULAR, EIGHTTAP_SMOOTH, EIGHTTAP_SHARP, BILINEAR, SWITCHABLE, INTERP_FILTERS_ALL }; enum SEG_LVL_FEATURES { SEG_LVL_ALT_Q = 0, // Use alternate Quantizer SEG_LVL_ALT_LF_Y_V, // Use alternate loop filter value on y plane vertical SEG_LVL_ALT_LF_Y_H, // Use alternate loop filter value on y plane horizontal SEG_LVL_ALT_LF_U, // Use alternate loop filter value on u plane SEG_LVL_ALT_LF_V, // Use alternate loop filter value on v plane SEG_LVL_REF_FRAME, // Optional Segment reference frame SEG_LVL_SKIP, // Optional Segment (0,0) + skip mode SEG_LVL_GLOBALMV, SEG_LVL_MAX }; const uint8_t SEGMENTATION_FEATURE_BITS[SEG_LVL_MAX] = { 8, 6, 6, 6, 6, 3, 0, 0 }; const uint8_t SEGMENTATION_FEATURE_SIGNED[SEG_LVL_MAX] = { 1, 1, 1, 1, 1, 0, 0, 0 }; const uint8_t SEGMENTATION_FEATURE_MAX[SEG_LVL_MAX] = { AV1_MAX_Q_INDEX, AV1_MAX_LOOP_FILTER, AV1_MAX_LOOP_FILTER, AV1_MAX_LOOP_FILTER, AV1_MAX_LOOP_FILTER, 7, 0, 0 }; enum { BLOCK_16x16 = 0, BLOCK_32x32 = 1, BLOCK_64x64 = 2, BLOCK_8x8 = 3 }; struct TileLimits { uint32_t MaxTileWidthSb; uint32_t MaxTileHeightSb; uint32_t MinLog2TileCols; uint32_t MaxLog2TileCols; uint32_t MinLog2TileRows; uint32_t MaxLog2TileRows; }; struct TileInfoAv1 { uint32_t uniform_tile_spacing_flag; uint32_t TileColsLog2; uint32_t TileRowsLog2; uint32_t TileCols; uint32_t TileRows; uint32_t TileWidthInSB[AV1_MAX_NUM_TILE_COLS]; // valid for 0 <= i < TileCols uint32_t TileHeightInSB[AV1_MAX_NUM_TILE_ROWS]; // valid for 0 <= i < TileRows uint32_t context_update_tile_id; uint32_t TileSizeBytes; struct TileLimits tileLimits; }; struct QuantizationParams { uint32_t base_q_idx; int32_t DeltaQYDc; int32_t DeltaQUDc; int32_t DeltaQUAc; int32_t DeltaQVDc; int32_t DeltaQVAc; uint32_t using_qmatrix; uint32_t qm_y; uint32_t qm_u; uint32_t qm_v; }; struct SegmentationParams { uint8_t segmentation_enabled; uint8_t segmentation_update_map; uint8_t segmentation_temporal_update; uint8_t segmentation_update_data; int32_t FeatureData[AV1_MAX_NUM_OF_SEGMENTS][SEG_LVL_MAX]; uint32_t FeatureMask[AV1_MAX_NUM_OF_SEGMENTS]; }; using SegDpbType = std::vector>; struct LoopFilterParams { int32_t loop_filter_level[4]; int32_t loop_filter_sharpness; uint8_t loop_filter_delta_enabled; uint8_t loop_filter_delta_update; // 0 = Intra, Last, Last2, Last3, GF, BWD, ARF int8_t loop_filter_ref_deltas[TOTAL_REFS_PER_FRAME]; // 0 = ZERO_MV, MV int8_t loop_filter_mode_deltas[MAX_MODE_LF_DELTAS]; }; struct CdefParams { uint32_t cdef_damping; uint32_t cdef_bits; uint32_t cdef_y_pri_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_y_sec_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_uv_pri_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_uv_sec_strength[CDEF_MAX_STRENGTHS]; }; enum RestorationType { RESTORE_NONE, RESTORE_SWITCHABLE, RESTORE_WIENER, RESTORE_SGRPROJ, RESTORE_TYPES = 4, }; struct LRParams { RestorationType lr_type[MAX_MB_PLANE]; uint32_t lr_unit_shift; uint32_t lr_uv_shift; uint32_t lr_unit_extra_shift; }; enum TX_MODE{ ONLY_4X4 = 0, // only 4x4 transform used TX_MODE_LARGEST, // transform size is the largest possible for pu size TX_MODE_SELECT, // transform specified for each block TX_MODES, }; enum TRANSFORMATION_TYPE { IDENTITY = 0, // identity transformation, 0-parameter TRANSLATION = 1, // translational motion 2-parameter ROTZOOM = 2, // simplified affine with rotation + zoom only, 4-parameter AFFINE = 3, // affine, 6-parameter HORTRAPEZOID = 4, // constrained homography, hor trapezoid, 6-parameter VERTRAPEZOID = 5, // constrained homography, ver trapezoid, 6-parameter HOMOGRAPHY = 6, // homography, 8-parameter TRANS_TYPES = 7, }; struct GlobalMotionParams { TRANSFORMATION_TYPE wmtype; int32_t wmmat[8]; int16_t alpha; int16_t beta; int16_t gamma; int16_t delta; int8_t invalid; }; struct FilmGrainParams{ uint32_t apply_grain; uint32_t grain_seed; uint32_t update_grain; uint32_t film_grain_params_ref_idx; // 8 bit values int32_t num_y_points; // value: 0..14 int32_t point_y_value[MAX_POINTS_IN_SCALING_FUNCTION_LUMA]; int32_t point_y_scaling[MAX_POINTS_IN_SCALING_FUNCTION_LUMA]; int32_t chroma_scaling_from_luma; // 8 bit values int32_t num_cb_points; // value: 0..10 int32_t point_cb_value[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t point_cb_scaling[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; // 8 bit values int32_t num_cr_points; // value: 0..10 int32_t point_cr_value[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t point_cr_scaling[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t grain_scaling; int32_t ar_coeff_lag; // values: 0..3 // 8 bit values int32_t ar_coeffs_y[MAX_AUTOREG_COEFFS_LUMA]; int32_t ar_coeffs_cb[MAX_AUTOREG_COEFFS_CHROMA]; int32_t ar_coeffs_cr[MAX_AUTOREG_COEFFS_CHROMA]; // Shift value: AR coeffs range // 6: [-2, 2) // 7: [-1, 1) // 8: [-0.5, 0.5) // 9: [-0.25, 0.25) int32_t ar_coeff_shift; // values : 6..9 int32_t grain_scale_shift; int32_t cb_mult; // 8 bits int32_t cb_luma_mult; // 8 bits int32_t cb_offset; // 9 bits int32_t cr_mult; // 8 bits int32_t cr_luma_mult; // 8 bits int32_t cr_offset; // 9 bits int32_t overlap_flag; int32_t clip_to_restricted_range; int32_t BitDepth; // video bit depth }; struct BitOffsets { mfxU32 QIndexBitOffset; mfxU32 SegmentationBitOffset; mfxU32 SegmentationBitSize; mfxU32 LoopFilterParamsBitOffset; mfxU32 FrameHeaderOBUSizeInBits; mfxU32 FrameHeaderOBUSizeByteOffset; mfxU32 UncompressedHeaderByteOffset; mfxU32 HDRHeaderByteOffset; mfxU32 CDEFParamsBitOffset; mfxU32 CDEFParamsSizeInBits; }; typedef struct FrameHeader { //Rev 0.85 parameters (AV1 spec version 1.0) in order of appearance/calculation in uncompressed_header() uint32_t show_existing_frame; uint32_t frame_to_show_map_idx; uint64_t frame_presentation_time; uint32_t display_frame_id; FRAME_TYPE frame_type; uint32_t show_frame; uint32_t showable_frame; uint32_t error_resilient_mode; uint32_t disable_cdf_update; uint32_t allow_screen_content_tools; uint32_t force_integer_mv; uint32_t current_frame_id; uint32_t frame_size_override_flag; uint32_t order_hint; uint32_t primary_ref_frame; uint8_t refresh_frame_flags; uint32_t ref_order_hint[NUM_REF_FRAMES]; uint32_t FrameWidth; uint32_t FrameHeight; uint32_t use_superres; uint32_t SuperresDenom; uint32_t UpscaledWidth; uint32_t MiCols; uint32_t MiRows; uint32_t RenderWidth; uint32_t RenderHeight; uint32_t allow_intrabc; int32_t ref_frame_idx[REFS_PER_FRAME]; uint32_t allow_high_precision_mv; INTERP_FILTER interpolation_filter; uint32_t is_motion_mode_switchable; uint32_t use_ref_frame_mvs; uint32_t disable_frame_end_update_cdf; uint32_t sbCols; uint32_t sbRows; uint32_t sbSize; TileInfoAv1 tile_info; QuantizationParams quantization_params; SegmentationParams segmentation_params; uint32_t delta_q_present; uint32_t delta_q_res; uint32_t delta_lf_present; uint32_t delta_lf_res; uint32_t delta_lf_multi; uint32_t CodedLossless; uint32_t AllLossless; LoopFilterParams loop_filter_params; CdefParams cdef_params; LRParams lr_params; TX_MODE TxMode; uint32_t reference_select; uint32_t skipModeAllowed; uint32_t skipModeFrame[2]; uint32_t skip_mode_present; uint32_t allow_warped_motion; uint32_t reduced_tx_set; GlobalMotionParams global_motion_params[TOTAL_REFS_PER_FRAME]; FilmGrainParams film_grain_params; uint32_t NumPlanes; uint32_t large_scale_tile; } FH; inline bool FrameIsIntra(const FrameHeader& fh) { return (fh.frame_type == INTRA_ONLY_FRAME || fh.frame_type == KEY_FRAME); } inline void DisableLoopFilter(FH& fh) { // AV1 spec 5.9.11 fh.loop_filter_params.loop_filter_level[0] = 0; fh.loop_filter_params.loop_filter_level[1] = 0; fh.loop_filter_params.loop_filter_ref_deltas[INTRA_FRAME] = 1; fh.loop_filter_params.loop_filter_ref_deltas[LAST_FRAME] = 0; fh.loop_filter_params.loop_filter_ref_deltas[LAST2_FRAME] = 0; fh.loop_filter_params.loop_filter_ref_deltas[LAST3_FRAME] = 0; fh.loop_filter_params.loop_filter_ref_deltas[BWDREF_FRAME] = 0; fh.loop_filter_params.loop_filter_ref_deltas[GOLDEN_FRAME] = -1; fh.loop_filter_params.loop_filter_ref_deltas[ALTREF_FRAME] = -1; fh.loop_filter_params.loop_filter_ref_deltas[ALTREF2_FRAME] = -1; for (int i = 0; i < MAX_MODE_LF_DELTAS; i++) fh.loop_filter_params.loop_filter_mode_deltas[i] = 0; } inline void DisableCDEF(FH& fh) { // AV1 spec 5.9.19 fh.cdef_params.cdef_bits = 0; fh.cdef_params.cdef_y_pri_strength[0] = 0; fh.cdef_params.cdef_y_sec_strength[0] = 0; fh.cdef_params.cdef_uv_pri_strength[0] = 0; fh.cdef_params.cdef_uv_sec_strength[0] = 0; fh.cdef_params.cdef_damping = 3; } inline void DisableLoopRestoration(FH& fh) { // AV1 spec 5.9.20 fh.lr_params.lr_type[0] = RESTORE_NONE; fh.lr_params.lr_type[1] = RESTORE_NONE; fh.lr_params.lr_type[2] = RESTORE_NONE; } struct ObuExtensionHeader { uint32_t temporal_id; uint32_t spatial_id; }; enum AV1_OBU_TYPE { OBU_SEQUENCE_HEADER = 1, OBU_TEMPORAL_DELIMITER = 2, OBU_FRAME_HEADER = 3, OBU_TILE_GROUP = 4, OBU_METADATA = 5, OBU_FRAME = 6, OBU_REDUNDANT_FRAME_HEADER = 7, OBU_PADDING = 15, }; struct Resource { mfxU8 Idx = IDX_INVALID; mfxMemId Mid = nullptr; }; struct IAllocation : public Storable { using TAlloc = CallChain; TAlloc Alloc; using TAllocOpaque = CallChain; using TGetResponse = CallChain; TGetResponse GetResponse; using TGetInfo = CallChain; TGetInfo GetInfo; using TAcquire = CallChain; TAcquire Acquire; using TRelease = CallChain; TRelease Release; using TClearFlag = CallChain; TClearFlag ClearFlag; using TSetFlag = CallChain; TSetFlag SetFlag; using TGetFlag = CallChain; TGetFlag GetFlag; using TUnlockAll = CallChain; TUnlockAll UnlockAll; std::unique_ptr m_pthis; }; class IBsWriter { public: virtual ~IBsWriter() {} virtual void PutBits(mfxU32 n, mfxU32 b) = 0; virtual void PutBit(mfxU32 b) = 0; }; struct TileGroupInfo { mfxU32 TgStart; mfxU32 TgEnd; }; using TileGroupInfos = std::vector; constexpr mfxU8 CODING_TYPE_I = 1; constexpr mfxU8 CODING_TYPE_P = 2; constexpr mfxU8 CODING_TYPE_B = 3; //regular B, or no reference to other B frames constexpr mfxU8 CODING_TYPE_B1 = 4; //B1, reference to only I, P or regular B frames constexpr mfxU8 CODING_TYPE_B2 = 5; //B2, references include B1 constexpr mfxU8 DEFAULT_DENOM_FOR_SUPERRES_ON = 16; constexpr mfxU8 DEFAULT_DENOM_FOR_SUPERRES_OFF = 8; // Min frame params required for Reorder, RefPicList/DPB management struct FrameBaseInfo : Storable { mfxI32 DisplayOrderInGOP = -1; mfxU32 EncodedOrderInGOP = 0; mfxU32 RefOrderInGOP = 0; mfxI32 NextBufferedDisplayOrder = -1; // Earliest DisplayOrderInGOP among buffered frames mfxU16 FrameType = 0; bool isLDB = false; // is "low-delay B" mfxU8 TemporalID = 0; mfxU32 BPyramidOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); mfxU32 PyramidLevel = 0; }; typedef struct _DpbFrame : FrameBaseInfo { mfxU32 DisplayOrder = mfxU32(-1); mfxU32 EncodedOrder = mfxU32(-1); mfxU64 TimestampIn = 0; mfxU16 PicStructIn = 0; mfxU32 FrameOrderIn = mfxU32(-1); bool isLTR = false; // is "long-term" bool isRejected = false; // rejected ref frame should be refreshed asap mfxU8 CodingType = 0; Resource Raw; Resource Rec; mfxFrameSurface1* pSurfIn = nullptr; //input surface, may be opaque } DpbFrame; enum eSkipMode { SKIPFRAME_NO = 0 , SKIPFRAME_INSERT_DUMMY , SKIPFRAME_INSERT_DUMMY_PROTECTED , SKIPFRAME_INSERT_NOTHING , SKIPFRAME_BRC_ONLY , SKIPFRAME_EXT_PSEUDO }; enum eSkipCmd { SKIPCMD_NeedInputReplacement = (1 << 0) , SKIPCMD_NeedDriverCall = (1 << 1) , SKIPCMD_NeedSkipSliceGen = (1 << 2) , SKIPCMD_NeedCurrentFrameSkipping = (1 << 3) , SKIPCMD_NeedNumSkipAdding = (1 << 4) }; enum eInsertHeader { INSERT_IVF_SEQ = (1 << 0) , INSERT_IVF_FRM = (1 << 1) , INSERT_TD = (1 << 2) , INSERT_SPS = (1 << 3) , INSERT_PPS = (1 << 4) , INSERT_FRM_OBU = (1 << 5) , INSERT_HDR = (1 << 6) }; using DpbType = std::vector>; using RefListType = std::array; using DpbRefreshType = std::array; inline bool IsValidRefFrame(const RefListType refList, mfxU8 refFrame) { return IsValid(refList[refFrame - LAST_FRAME]); } struct RepeatedFrameInfo { mfxU8 FrameToShowMapIdx = 0; mfxU32 DisplayOrder = 0; }; struct mfxGopHints { mfxU32 MiniGopSize = 0; mfxU16 FrameType = 0; mfxU32 QPModulaton = 0; /* Scene Change parameter */ mfxU16 SceneChange = 0; #if defined(MFX_ENABLE_ENCTOOLS) mfxU16 SpatialComplexity = 0; mfxI8 QPDeltaExplicitModulation = 0; /* Persistence Map */ mfxU16 PersistenceMapNZ; mfxU8 PersistenceMap[MFX_ENCTOOLS_PREENC_MAP_SIZE]; #endif }; using RepeatedFrames = std::vector; using TileSizeType = decltype(mfxExtAV1AuxData::TileWidthInSB[0]); using TileSizeArrayType = decltype(mfxExtAV1AuxData::TileWidthInSB); struct mfxBRCHints { /* Look ahead parameters */ mfxU32 LaAvgEncodedBits = 0; /* Average size of encoded Lookahead frames in bits */ mfxU32 LaCurEncodedBits = 0; /* Size of encoded Lookahead frame at current frame location in bits */ mfxU16 LaDistToNextI = 0; /* First I Frame in Lookahead frames (0 if not found) */ }; struct TaskCommonPar : DpbFrame { mfxU32 stage = 0; mfxU32 MinFrameSize = 0; mfxU32 BsDataLength = 0; mfxU32 BsBytesAvailable = 0; mfxU8* pBsData = nullptr; mfxU32* pBsDataLength = nullptr; mfxBitstream* pBsOut = nullptr; mfxFrameSurface1* pSurfReal = nullptr; mfxEncodeCtrl ctrl = {}; mfxU32 SkipCMD = SKIPCMD_NeedDriverCall; Resource BS; Resource CUQP; mfxHDLPair HDLRaw = {}; bool bCUQPMap = false; #if defined(MFX_ENABLE_ENCTOOLS) mfxLplastatus LplaStatus = {}; mfxBRCHints BrcHints = {}; bool bBRCUpdated = false; #endif mfxGopHints GopHints = {}; bool bForceSync = false; bool bSkip = false; bool bResetBRC = false; bool bRecode = false; bool bFreed = false; bool bCached = false; mfxI32 PrevRAP = -1; mfxU16 NumRecode = 0; mfxU8 QpY = 0; mfxU32 InsertHeaders = 0; mfxU32 StatusReportId = mfxU32(-1); DpbRefreshType RefreshFrameFlags = {}; BitOffsets Offsets = {}; mfxU8 MinBaseQIndex = 0; mfxU8 MaxBaseQIndex = 0; RefListType RefList = {}; DpbType DPB; RepeatedFrames FramesToShow = {}; mfxU16 RepeatedFrameBytes = 0; mfxU32 TCBRCTargetFrameSize = 0; mfxExtRefListCtrl InternalListCtrl = {}; bool InternalListCtrlPresent = false; }; inline void Invalidate(TaskCommonPar& par) { par = TaskCommonPar(); } inline bool IsHiddenFrame(const TaskCommonPar& frame) { return frame.NextBufferedDisplayOrder != -1 && frame.DisplayOrderInGOP > frame.NextBufferedDisplayOrder; } inline bool isValid(DpbFrame const & frame) { return IDX_INVALID != frame.Rec.Idx; } inline std::tuple GetRealResolution(const mfxVideoParam& vp) { const mfxExtAV1ResolutionParam* pRsPar = ExtBuffer::Get(vp); const bool rsValid = pRsPar != nullptr && pRsPar->FrameWidth > 0 && pRsPar->FrameHeight > 0; if (rsValid) { return std::make_tuple(pRsPar->FrameWidth, pRsPar->FrameHeight); } const auto& fi = vp.mfx.FrameInfo; if (fi.CropW > 0 && fi.CropH > 0) { return std::make_tuple(fi.CropW, fi.CropH); } else { return std::make_tuple(fi.Width, fi.Height); } } inline mfxU32 GetActualEncodeWidth(mfxU32 frameWidth, const mfxExtAV1AuxData *pAuxPar) { const bool useSuperRes = pAuxPar != nullptr && IsOn(pAuxPar->EnableSuperres); if (!useSuperRes) return frameWidth; mfxU16 denom = pAuxPar->SuperresScaleDenominator != 0 ? pAuxPar->SuperresScaleDenominator : DEFAULT_DENOM_FOR_SUPERRES_ON; return ((frameWidth << 3) + (denom >> 1)) / denom; } inline mfxU16 CountTileNumber(const TileSizeArrayType& tileSizeInSB) { mfxU16 cnt = 0; while (cnt < sizeof(TileSizeArrayType) / sizeof(TileSizeType) && tileSizeInSB[cnt] > 0) { cnt++; } return cnt; } inline std::pair GetSBNum(const mfxVideoParam& par) { mfxU32 width = 0, height = 0; std::tie(width, height) = GetRealResolution(par); const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); width = GetActualEncodeWidth(width, pAuxPar); mfxU16 sbCols = static_cast(mfx::CeilDiv(width, SB_SIZE)); mfxU16 sbRows = static_cast(mfx::CeilDiv(height, SB_SIZE)); return std::make_pair(sbCols, sbRows); } inline std::tuple GetNumTiles( const mfxExtAV1TileParam* pTiles , const mfxExtAV1AuxData* pAuxPar) { mfxU16 numTileCols = 0; mfxU16 numTileRows = 0; if (pTiles) { numTileCols = pTiles->NumTileColumns; numTileRows = pTiles->NumTileRows; } if (pAuxPar) { SetIf(numTileCols, numTileCols == 0, CountTileNumber(pAuxPar->TileWidthInSB)); SetIf(numTileRows, numTileRows == 0, CountTileNumber(pAuxPar->TileHeightInSB)); } numTileCols = std::max(mfxU16(1), numTileCols); numTileRows = std::max(mfxU16(1), numTileRows); return std::make_tuple(numTileCols, numTileRows); } inline mfxU32 GetAvgFrameSizeInBytes(const mfxVideoParam& par) { mfxU32 avgFrameSizeInBytes = 0; if (par.mfx.FrameInfo.FrameRateExtN && par.mfx.FrameInfo.FrameRateExtD) { // Use type mfxU64 to avoid value overflow with most value precise obtained. mfxU64 targetbps = TargetKbps(par.mfx) * 1000; avgFrameSizeInBytes = mfxU32(targetbps * par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN / 8); } return avgFrameSizeInBytes; } class FrameLocker : public mfxFrameData { public: mfxU32 Pitch; FrameLocker(VideoCORE& core, mfxMemId memId, bool external = false) : m_data(*this) , m_core(core) , m_memId(memId) { m_data = {}; m_status = Lock(external); Pitch = (mfxFrameData::PitchHigh << 16) + mfxFrameData::PitchLow; } FrameLocker(VideoCORE& core, mfxFrameData& data, bool external = false) : m_data(data) , m_core(core) , m_memId(data.MemId) , m_status(Lock(external)) { Pitch = (mfxFrameData::PitchHigh << 16) + mfxFrameData::PitchLow; } ~FrameLocker() { Unlock(); } enum { LOCK_NO, LOCK_INT, LOCK_EXT }; mfxStatus Unlock() { mfxStatus mfxSts = MFX_ERR_NONE; if (m_status == LOCK_INT) mfxSts = m_core.UnlockFrame(m_memId, &m_data); else if (m_status == LOCK_EXT) mfxSts = m_core.UnlockExternalFrame(m_memId, &m_data); m_status = LOCK_NO; return mfxSts; } mfxU32 Lock(bool external) { mfxU32 status = LOCK_NO; if (!m_data.Y && !m_data.Y410) { status = external ? (m_core.LockExternalFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_EXT : LOCK_NO) : (m_core.LockFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_INT : LOCK_NO); } return status; } private: FrameLocker(FrameLocker const &) = delete; FrameLocker & operator =(FrameLocker const &) = delete; mfxFrameData& m_data; VideoCORE& m_core; mfxMemId m_memId; mfxU32 m_status; }; using PackedData = MfxEncodeHW::PackedData; struct PackedHeaders { PackedData IVF; PackedData SPS; PackedData PPS; PackedData TD; PackedData HDR; }; using DDIExecParam = MfxEncodeHW::DDIExecParam; using DDIFeedbackParam = MfxEncodeHW::DDIFeedback; struct BsDataInfo { mfxU8 *Data; mfxU32 DataOffset; mfxU32 DataLength; mfxU32 MaxLength; }; enum eResetFlags { RF_SPS_CHANGED = (1 << 0) , RF_PPS_CHANGED = (1 << 1) , RF_IDR_REQUIRED = (1 << 2) , RF_BRC_RESET = (1 << 3) , RF_CANCEL_TASKS = (1 << 4) }; struct ResetHint { mfxU32 Flags; }; struct VAID { mfxU32 Profile; mfxU32 Entrypoint; }; template struct is_shared_ptr : std::false_type {}; template struct is_shared_ptr> : std::true_type {}; template static typename std::enable_if::value, void>::type UpdateDPB( DPB& dpb , const typename DPB::value_type::element_type& obj , const DpbRefreshType& refreshRefFrames , Releaser&& releaser) { using ElemType = typename DPB::value_type::element_type; if (std::find(refreshRefFrames.begin(), refreshRefFrames.end(), 1) == refreshRefFrames.end()) return; typename DPB::value_type curr(new ElemType(obj), std::forward(releaser)); for (mfxU8 i = 0; i < dpb.size(); i++) { if (refreshRefFrames[i]) dpb.at(i) = curr; } return; } typedef std::list::iterator TTaskIt; template struct TaskItWrap { using iterator_category = std::bidirectional_iterator_tag; using value_type = T; using pointer = value_type*; using reference = value_type&; using difference_type = ptrdiff_t; using iterator_type = TaskItWrap; TaskItWrap(TTaskIt _it) : it(_it) {} bool operator==(const TTaskIt& other) const { return it == other; } bool operator!=(const TTaskIt& other) const { return it != other; } bool operator==(const iterator_type& other) const { return it == other.it; } bool operator!=(const iterator_type& other) const { return it != other.it; } pointer operator->() { return &it->Write(K); } reference operator*() const { return it->Write(K); } iterator_type& operator++() { ++it; return *this; } iterator_type operator++(int) { iterator_type tmp(it); ++it; return tmp; } iterator_type& operator--() { --it; return *this; } iterator_type operator--(int) { iterator_type tmp(it); --it; return tmp; } TTaskIt it; }; struct Reorderer : CallChain { mfxU16 BufferSize = 0; //NotNull DPB; }; class EncodeCapsAv1 : public ENCODE_CAPS_AV1 , public Storable { public: EncodeCapsAv1() : ENCODE_CAPS_AV1({}) {} struct MsdkExt { bool CQPSupport = false; bool CBRSupport = false; bool VBRSupport = false; bool ICQSupport = false; } msdk; }; struct Defaults { struct Param { Param( const mfxVideoParam& _par , const EncodeCapsAv1& _caps , const Defaults& _d) : mvp(_par) , caps(_caps) , base(_d) {} const mfxVideoParam& mvp; const EncodeCapsAv1& caps; const Defaults& base; }; template using TChain = CallChain; std::map SetForFeature; TChain GetCodedPicWidth; TChain GetCodedPicHeight; TChain GetCodedPicAlignment; TChain GetGopPicSize; TChain GetGopRefDist; TChain GetNumBPyramidLayers; TChain GetNumRefFrames; TChain GetNumRefBPyramid; TChain GetNumRefNoPyramid; TChain GetMinRefForBPyramid; TChain GetMinRefForBNoPyramid; TChain GetBRefType; TChain GetPRefType; TChain GetBitDepthLuma; TChain GetTargetBitDepthLuma; TChain GetTargetChromaFormatPlus1; TChain GetRateControlMethod; TChain GetProfile; TChain GetMBBRC; TChain GetAsyncDepth; TChain GetBufferSizeInKB; TChain GetTargetKbps; TChain GetMaxKbps; TChain GetMinQPMFX; TChain GetMaxQPMFX; TChain GetNumTemporalLayers; TChain GetNumReorderFrames; TChain GetNonStdReordering; TChain> GetMaxNumRef; TChain> GetFrameRate; TChain> GetQPMFX; //I,P,B using TGetNumRefActive = CallChain< bool //bExternal , const Defaults::Param& , mfxU16(*)[8] //P , mfxU16(*)[8] //BL0 , mfxU16(*)[8]>; //BL1 TGetNumRefActive GetNumRefActive; using TGetQPOffset = CallChain< void , const Defaults::Param& , mfxU16& //EnableQPOffset , mfxI16(&)[8]>;//QPOffset TGetQPOffset GetQPOffset; using TGetFrameType = CallChain< mfxU16 //frameType , const Defaults::Param& , mfxU32 //displayOrder , mfxU32 //lastKeyFrame , mfxGopHints>; //adaptive GOP hints TGetFrameType GetFrameType; using TGetPreReorderInfo = CallChain< mfxStatus , const Defaults::Param& , FrameBaseInfo& , const mfxFrameSurface1* //pSurfIn , const mfxEncodeCtrl* //pCtrl , mfxU32 //prevKeyFrameOrder , mfxU32 //frameOrder , mfxGopHints>; //adaptive GOP hints TGetPreReorderInfo GetPreReorderInfo; // fill all info available at pre-reorder using TGetLoopFilterLevels = CallChain< void , const Defaults::Param& , FH&>; TGetLoopFilterLevels GetLoopFilterLevels; using TGetCDEF = CallChain< void , FH&>; TGetCDEF GetCDEF; //for Query w/o caps: using TPreCheck = CallChain; TPreCheck PreCheckCodecId; TPreCheck PreCheckChromaFormat; //for Query w/caps (check + fix) using TCheckAndFix = CallChain; TCheckAndFix CheckLevel; TCheckAndFix CheckSurfSize; TCheckAndFix CheckProfile; TCheckAndFix CheckFourCC; TCheckAndFix CheckInputFormatByFourCC; TCheckAndFix CheckTargetChromaFormat; TCheckAndFix CheckTargetBitDepth; TCheckAndFix CheckFourCCByTargetFormat; TCheckAndFix CheckNumRefActive; }; enum eFeatureId { FEATURE_GENERAL = 0 , FEATURE_DDI , FEATURE_DDI_PACKER , FEATURE_ALLOCATOR , FEATURE_TASK_MANAGER , FEATURE_PACKER , FEATURE_BLOCKING_SYNC , FEATURE_TILE , FEATURE_SEGMENTATION , FEATURE_ENCODED_FRAME_INFO , FEATURE_QMATRIX , FEATURE_QUERY_IMPL_DESC , FEATURE_ENCTOOLS , FEATURE_MAX_FRAME_SIZE , FEATURE_HDR , NUM_FEATURES }; enum eStages { S_NEW = 0 , S_PREPARE , S_REORDER , S_SUBMIT , S_QUERY , NUM_STAGES }; using TFramesToShowInfo = std::set; using TRepeatFrameSizeInfo = std::map; struct Glob { static const StorageR::TKey _KD = __LINE__ + 1; using VideoCore = StorageVar<__LINE__ - _KD, VideoCORE>; using RTErr = StorageVar<__LINE__ - _KD, mfxStatus>; using EncodeCaps = StorageVar<__LINE__ - _KD, EncodeCapsAv1>; using VideoParam = StorageVar<__LINE__ - _KD, ExtBuffer::Param>; using SH = StorageVar<__LINE__ - _KD, Base::SH>; using FH = StorageVar<__LINE__ - _KD, Base::FH>; using FramesToShowInfo = StorageVar<__LINE__ - _KD, TFramesToShowInfo>; using RepeatFrameSizeInfo = StorageVar<__LINE__ - _KD, TRepeatFrameSizeInfo>; using TileGroups = StorageVar<__LINE__ - _KD, TileGroupInfos>; using AllocRaw = StorageVar<__LINE__ - _KD, IAllocation>; using AllocRec = StorageVar<__LINE__ - _KD, IAllocation>; using AllocBS = StorageVar<__LINE__ - _KD, IAllocation>; using PackedHeaders = StorageVar<__LINE__ - _KD, Base::PackedHeaders>; using DDI_Resources = StorageVar<__LINE__ - _KD, std::list>; using DDI_SubmitParam = StorageVar<__LINE__ - _KD, std::list>; using DDI_Feedback = StorageVar<__LINE__ - _KD, DDIFeedbackParam>; using DDI_Execute = StorageVar<__LINE__ - _KD, CallChain>; using RealState = StorageVar<__LINE__ - _KD, StorageW>;//available during Reset using ResetHint = StorageVar<__LINE__ - _KD, Base::ResetHint>; //available during Reset using Reorder = StorageVar<__LINE__ - _KD, Reorderer>; using Defaults = StorageVar<__LINE__ - _KD, Base::Defaults>; using SegDpb = StorageVar<__LINE__ - _KD, SegDpbType>; static const StorageR::TKey CallChainsKey = __LINE__ - _KD; static const StorageR::TKey ReservedKey0 = __LINE__ - _KD; static const StorageR::TKey TaskManagerKey = __LINE__ - _KD; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; struct Tmp { static const StorageR::TKey _KD = __LINE__ + 1; using MakeAlloc = StorageVar<__LINE__ - _KD, std::function>; using BSAllocInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using RecInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using RawInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using CurrTask = StorageVar<__LINE__ - _KD, StorageW>; using BsDataInfo = StorageVar<__LINE__ - _KD, Base::BsDataInfo>; using DDI_InitParam = StorageVar<__LINE__ - _KD, std::list>; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; using TUsedRefList = std::remove_reference::type; struct EncodedInfoAv1 { TUsedRefList UsedRefListL0 = {}; TUsedRefList UsedRefListL1 = {}; mfxU16 QpY = 0; }; struct Task { static const StorageR::TKey _KD = __LINE__ + 1; using Common = StorageVar<__LINE__ - _KD, TaskCommonPar>; using FH = StorageVar<__LINE__ - _KD, Base::FH>; using Segment = StorageVar<__LINE__ - _KD, mfxExtAV1Segmentation>; using EncodedInfo = StorageVar<__LINE__ - _KD, EncodedInfoAv1>; using TileInfo = StorageVar<__LINE__ - _KD, TileInfoAv1>; using TileGroups = StorageVar<__LINE__ - _KD, TileGroupInfos>; static const StorageR::TKey TaskEventKey = __LINE__ - _KD; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; inline Defaults::Param GetRTDefaults(StorageR& strg) { return Defaults::Param( Glob::VideoParam::Get(strg) , Glob::EncodeCaps::Get(strg) , Glob::Defaults::Get(strg)); } } //namespace Base } //namespace AV1EHW #endif av1ehw_base_encoded_frame_info.cpp000066400000000000000000000135171443134507600362070ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_encoded_frame_info.h" using namespace AV1EHW; using namespace AV1EHW::Base; void EncodedFrameInfo::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(EnableMAD); }); // This is to enable Query for mfxExtAVCEncodedFrameInfo blocks.m_ebCopySupported[MFX_EXTBUFF_ENCODED_FRAME_INFO].emplace_back( [](const mfxExtBuffer* /* pSrc */, mfxExtBuffer* /* pDst */) -> void { }); } void EncodedFrameInfo::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckMAD , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); MFX_CHECK(pCO2, MFX_ERR_NONE); //not supported in driver bool bChanged = CheckOrZero( pCO2->EnableMAD , (mfxU16)MFX_CODINGOPTION_UNKNOWN , (mfxU16)MFX_CODINGOPTION_OFF); MFX_CHECK(!bChanged, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void EncodedFrameInfo::AllocTask(const FeatureBlocks& blocks, TPushAT Push) { Push(BLK_AllocTask , [this, &blocks]( StorageR& /*global*/ , StorageRW& task) -> mfxStatus { task.Insert(Task::EncodedInfo::Key, new MakeStorable); return MFX_ERR_NONE; }); } void EncodedFrameInfo::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryInfo , [this]( StorageW& /* global */ , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); MFX_CHECK(task.pBsOut, MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtAVCEncodedFrameInfo* pInfo = ExtBuffer::Get(*task.pBsOut); MFX_CHECK(pInfo, MFX_ERR_NONE); MFX_CHECK(!task.bFreed, MFX_ERR_NONE); using TUsedRef = std::remove_referenceUsedRefListL0[0])>::type; TUsedRef unused = {}; unused.FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); unused.LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX); unused.PicStruct = mfxU16(MFX_PICSTRUCT_UNKNOWN); auto& encodedInfo = Task::EncodedInfo::Get(s_task); std::fill(std::begin(encodedInfo.UsedRefListL0), std::end(encodedInfo.UsedRefListL0), unused); std::fill(std::begin(encodedInfo.UsedRefListL1), std::end(encodedInfo.UsedRefListL1), unused); auto GetUsedRef = [&](mfxU8 idx) { if (idx == IDX_INVALID) return unused; TUsedRef dst = {}; auto& src = task.DPB[idx % task.DPB.size()]; dst.FrameOrder = src->DisplayOrder; dst.LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX * !src->isLTR); dst.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; return dst; }; if (!IsI(task.FrameType)) { const mfxU8 bwdStartIdx = BWDREF_FRAME - LAST_FRAME; const auto bwdStartIt = task.RefList.begin() + bwdStartIdx; std::transform(task.RefList.begin(), bwdStartIt, encodedInfo.UsedRefListL0, GetUsedRef); std::transform(bwdStartIt, task.RefList.end(), encodedInfo.UsedRefListL1, GetUsedRef); } return MFX_ERR_NONE; }); Push(BLK_ReportInfo , [this]( StorageW& /* global */ , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); MFX_CHECK(task.pBsOut, MFX_ERR_UNDEFINED_BEHAVIOR); // Make sure task is ready for output MFX_CHECK(task.BsDataLength > 0, MFX_ERR_NONE); auto& encodedInfo = Task::EncodedInfo::Get(s_task); mfxExtAVCEncodedFrameInfo* pInfo = ExtBuffer::Get(*task.pBsOut); MFX_CHECK(pInfo, MFX_ERR_NONE); std::copy(std::begin(encodedInfo.UsedRefListL0), std::end(encodedInfo.UsedRefListL0), std::begin(pInfo->UsedRefListL0)); std::copy(std::begin(encodedInfo.UsedRefListL1), std::end(encodedInfo.UsedRefListL1), std::begin(pInfo->UsedRefListL1)); pInfo->FrameOrder = (task.FrameOrderIn == mfxU32(-1)) ? task.DisplayOrder : task.FrameOrderIn; pInfo->LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX * !task.isLTR); pInfo->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; pInfo->QP = encodedInfo.QpY; pInfo->BRCPanicMode = 0; pInfo->MAD = 0; return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_encoded_frame_info.h000066400000000000000000000040641443134507600356510ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { class EncodedFrameInfo : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckMAD )\ DECL_BLOCK(AllocTask )\ DECL_BLOCK(QueryInfo )\ DECL_BLOCK(ReportInfo) #define DECL_FEATURE_NAME "Base_EncodedFrameInfo" #include "av1ehw_decl_blocks.h" EncodedFrameInfo(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void AllocTask(const FeatureBlocks& blocks, TPushAT Push) override; virtual void QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) override; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)av1ehw_base_enctools.cpp000066400000000000000000001714141443134507600342500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #if defined(MFX_ENABLE_ENCTOOLS) #include "mfx_platform_caps.h" #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include "av1ehw_base_enctools.h" #include "av1ehw_base_task.h" #include "av1ehw_base_packer.h" #include "av1ehw_base_segmentation.h" using namespace AV1EHW; using namespace AV1EHW::Base; inline bool IsSegBlockSmallerThanSB(mfxU32 segBlock, mfxU32 sb) { return sb == 128 || (sb == 64 && segBlock < MFX_AV1_SEGMENT_ID_BLOCK_SIZE_64x64); } void ApplyHWLimitation_XeHpm(StorageW& global, StorageW& s_task, mfxExtAV1Segmentation& seg_enctools) { auto& fh = Task::FH::Get(s_task); mfxExtAV1Segmentation& seg_task = Task::Segment::Get(s_task); // Xe_HPM does not support segmentation_temporal_update fh.segmentation_params.segmentation_temporal_update = 0; // Update segmentation_update_map for small segment block size if (!fh.segmentation_params.segmentation_update_map) { // in Xe_HPM "segmentation_update_map = 0" mode is implemented by forcing segmentation through VDEnc Stream in // there are following related restrictions/requirements: // 1) segmentation map should be always sent to the driver explicitly (even if there is no map update) // 2) "segmentation_update_map = 0" cannot be safely applied for SegmentIdBlockSize smaller than SB size const Base::SH& sh = Base::Glob::SH::Get(global); seg_task.SegmentIds = seg_enctools.SegmentIds; seg_task.NumSegmentIdAlloc = seg_enctools.NumSegmentIdAlloc; if (IsSegBlockSmallerThanSB(seg_task.SegmentIdBlockSize, sh.sbSize)) { // force map update if SegmentIdBlockSize is smaller than SB size fh.segmentation_params.segmentation_update_map = 1; } } } inline static void TuneCDEFLowQP(uint32_t* strength, int32_t qp) { if (!(qp < 90)) assert(false && "Only called if qp < 90"); strength[0] = 5; strength[1] = 41; strength[3] = 6; strength[5] = 16; } inline static void TuneCDEFHighQP( CdefParams& cdef , uint32_t* strength , int32_t qp) { if (!(qp > 140)) assert(false && "Only called if qp > 140"); cdef.cdef_bits = 2; strength[1] = 63; if (qp > 210) { cdef.cdef_bits = 1; strength[0] = 0; } } inline static void TuneCDEFMediumQP( const FH& bs_fh , CdefParams& cdef , uint32_t* strength , int32_t qp) { if (!(qp > 130 && qp <= 140)) assert(false && "Only called if qp > 130 && qp <= 140"); cdef.cdef_bits = 2; strength[1] = 63; if (bs_fh.FrameWidth < 1600 && bs_fh.FrameHeight < 1600) strength[3] = 1; else strength[3] = 32; } static void CDEF(FH& bs_fh) { const int32_t qp = bs_fh.quantization_params.base_q_idx; uint32_t YStrengths[CDEF_MAX_STRENGTHS]; YStrengths[0] = 36; YStrengths[1] = 50; YStrengths[2] = 0; YStrengths[3] = 24; YStrengths[4] = 8; YStrengths[5] = 17; YStrengths[6] = 4; YStrengths[7] = 9; auto& cdef = bs_fh.cdef_params; cdef.cdef_bits = 3; if (qp < 90) TuneCDEFLowQP(YStrengths, qp); else if (qp > 140) TuneCDEFHighQP(cdef, YStrengths, qp); else if (qp > 130) TuneCDEFMediumQP(bs_fh, cdef, YStrengths, qp); if (bs_fh.FrameWidth < 1600 && bs_fh.FrameHeight < 1600) YStrengths[3] = 5; for (int i = 0; i < CDEF_MAX_STRENGTHS; i++) { cdef.cdef_y_pri_strength[i] = YStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_y_sec_strength[i] = YStrengths[i] % CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_pri_strength[i] = YStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_sec_strength[i] = YStrengths[i] % CDEF_STRENGTH_DIVISOR; } cdef.cdef_damping = (qp >> 6) + 3; } template struct ExtBufTypeToId {}; #define BIND_EXTBUF_TYPE_TO_ID(TYPE, ID) template<> struct ExtBufTypeToId { enum { id = ID }; } BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCRefListCtrl, MFX_EXTBUFF_AVC_REFLIST_CTRL); static void InitExtBufHeader_AV1(mfxExtRefListCtrl& extBuf) { extBuf = {}; extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(mfxExtRefListCtrl); for (mfxU32 i = 0; i < 32; i++) extBuf.PreferredRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); for (mfxU32 i = 0; i < 16; i++) extBuf.RejectedRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); for (mfxU32 i = 0; i < 16; i++) extBuf.LongTermRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); } void AV1EncTools::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_ENCTOOLS_CONFIG].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtEncToolsConfig*)pSrc; auto& buf_dst = *(mfxExtEncToolsConfig*)pDst; MFX_COPY_FIELD(AdaptiveI); MFX_COPY_FIELD(AdaptiveB); MFX_COPY_FIELD(AdaptiveRefP); MFX_COPY_FIELD(AdaptiveRefB); MFX_COPY_FIELD(SceneChange); MFX_COPY_FIELD(AdaptiveLTR); MFX_COPY_FIELD(AdaptivePyramidQuantP); MFX_COPY_FIELD(AdaptivePyramidQuantB); MFX_COPY_FIELD(AdaptiveQuantMatrices); MFX_COPY_FIELD(AdaptiveMBQP); MFX_COPY_FIELD(BRCBufferHints); MFX_COPY_FIELD(BRC); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(AdaptiveI); MFX_COPY_FIELD(AdaptiveB); MFX_COPY_FIELD(LookAheadDepth); MFX_COPY_FIELD(ExtBRC); MFX_COPY_FIELD(MBBRC); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(AdaptiveCQM); MFX_COPY_FIELD(ScenarioInfo); MFX_COPY_FIELD(ExtBrcAdaptiveLTR); }); } void AV1EncTools::SetInherited(ParamInheritance& par) { par.m_ebInheritDefault[MFX_EXTBUFF_ENCTOOLS_CONFIG].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& buf_src = *(const mfxExtEncToolsConfig*)pSrc; auto& buf_dst = *(mfxExtEncToolsConfig*)pDst; InheritOption(buf_src.AdaptiveI, buf_dst.AdaptiveI); InheritOption(buf_src.AdaptiveB, buf_dst.AdaptiveB); InheritOption(buf_src.AdaptiveRefP, buf_dst.AdaptiveRefP); InheritOption(buf_src.AdaptiveRefB, buf_dst.AdaptiveRefB); InheritOption(buf_src.SceneChange, buf_dst.SceneChange); InheritOption(buf_src.AdaptiveLTR, buf_dst.AdaptiveLTR); InheritOption(buf_src.AdaptivePyramidQuantP, buf_dst.AdaptivePyramidQuantP); InheritOption(buf_src.AdaptivePyramidQuantB, buf_dst.AdaptivePyramidQuantB); InheritOption(buf_src.AdaptiveQuantMatrices, buf_dst.AdaptiveQuantMatrices); InheritOption(buf_src.AdaptiveMBQP, buf_dst.AdaptiveMBQP); InheritOption(buf_src.BRCBufferHints, buf_dst.BRCBufferHints); InheritOption(buf_src.BRC, buf_dst.BRC); }); } inline bool IsHwLookAhead(const mfxExtEncToolsConfig &config, bool bGameStreaming) { if (!bGameStreaming) return false; return (IsOn(config.AdaptiveI) || IsOn(config.AdaptiveB) || IsOn(config.SceneChange) || IsOn(config.AdaptivePyramidQuantP) || IsOn(config.AdaptivePyramidQuantB) || IsOn(config.BRCBufferHints) || IsOn(config.AdaptiveQuantMatrices)); } bool AV1EHW::Base::IsHwEncToolsOn(const mfxVideoParam& video) { const mfxExtCodingOption3* pExtOpt3 = ExtBuffer::Get(video); const mfxExtCodingOption2* pExtOpt2 = ExtBuffer::Get(video); const mfxExtEncToolsConfig* pExtConfig = ExtBuffer::Get(video); bool bGameStreaming = pExtOpt3 && pExtOpt3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING; bool bLA = false; if ((bGameStreaming && pExtOpt2 && pExtOpt2->LookAheadDepth > 0) || (pExtConfig && IsHwLookAhead(*pExtConfig, bGameStreaming))) bLA = true; return bLA ; } inline bool IsSwEncToolsImplicit(const mfxVideoParam &video) { const mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); if (pExtOpt2 && pExtOpt2->LookAheadDepth > 0) { const mfxExtCodingOption3* pExtOpt3 = ExtBuffer::Get(video); if( (video.mfx.GopRefDist == 1 || video.mfx.GopRefDist == 2 || video.mfx.GopRefDist == 4 || video.mfx.GopRefDist == 8 || video.mfx.GopRefDist == 16) && IsOn(pExtOpt2->ExtBRC) && !(pExtOpt3 && pExtOpt3->ScenarioInfo != MFX_SCENARIO_UNKNOWN) ) { return true; } } return false; } bool AV1EHW::Base::IsSwEncToolsOn(const mfxVideoParam& video){ if(IsHwEncToolsOn(video)) { return false; } const mfxExtEncToolsConfig *pConfig = ExtBuffer::Get(video); if(pConfig) { mfxExtEncToolsConfig config = {}; SetDefaultConfig(video, config, true); return IsOn(config.AdaptiveI) || IsOn(config.AdaptiveB) || IsOn(config.AdaptiveRefP) || IsOn(config.AdaptiveRefB) || IsOn(config.SceneChange) || IsOn(config.AdaptiveLTR) || IsOn(config.AdaptivePyramidQuantP) || IsOn(config.AdaptivePyramidQuantB) || IsOn(config.AdaptiveQuantMatrices) || IsOn(config.AdaptiveMBQP) || IsOn(config.BRCBufferHints) || IsOn(config.BRC); } else { return IsSwEncToolsImplicit(video); } } bool AV1EHW::Base::IsEncToolsOn(const mfxVideoParam& video) { return IsHwEncToolsOn(video) || IsSwEncToolsOn(video); } inline bool IsSwEncToolsSupported(const mfxVideoParam &video) { return video.mfx.GopRefDist == 0 || video.mfx.GopRefDist == 1 || video.mfx.GopRefDist == 2 || video.mfx.GopRefDist == 4 || video.mfx.GopRefDist == 8 || video.mfx.GopRefDist == 16; } inline mfxEncTools *GetEncTools(const mfxVideoParam &video) { return (mfxEncTools *)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCTOOLS); } bool IsEncToolsConfigDefined(const mfxExtEncToolsConfig *config){ //this code is based on definition of MFX_CODINGOPTION_UNKNOWN=0 if(!config) return false; return config->AdaptiveI | config->AdaptiveB | config->AdaptiveRefP | config->AdaptiveRefB | config->SceneChange | config->AdaptiveLTR | config->AdaptivePyramidQuantP | config->AdaptivePyramidQuantB | config->AdaptiveQuantMatrices | config->AdaptiveMBQP | config->BRCBufferHints | config->BRC; } static bool isSWLACondition(const mfxVideoParam& video) { const mfxExtCodingOption2* pExtOpt2 = ExtBuffer::Get(video); return (pExtOpt2 && (pExtOpt2->LookAheadDepth > video.mfx.GopRefDist)); } void AV1EHW::Base::SetDefaultConfig(const mfxVideoParam &video, mfxExtEncToolsConfig &config, bool bMBQPSupport) { const mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); const mfxExtCodingOption3 *pExtOpt3 = ExtBuffer::Get(video); const mfxExtEncToolsConfig *pExtConfig = ExtBuffer::Get(video); const mfxExtAV1AuxData *pAuxData = ExtBuffer::Get(video); const mfxExtCodingOptionDDI *pExtDdi = ExtBuffer::Get(video); bool bGameStreaming = pExtOpt3 && pExtOpt3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING; if (!IsEncToolsConfigDefined(pExtConfig)) { if (IsSwEncToolsImplicit(video) || IsHwEncToolsOn(video)) { //ENC Tools are turned ON by specific command line parameter set config.AdaptiveI = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveB = MFX_CODINGOPTION_UNKNOWN; config.AdaptivePyramidQuantP = MFX_CODINGOPTION_UNKNOWN; config.AdaptivePyramidQuantB = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveRefP = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveRefB = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveLTR = MFX_CODINGOPTION_UNKNOWN; config.BRCBufferHints = MFX_CODINGOPTION_UNKNOWN; config.BRC = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveQuantMatrices = MFX_CODINGOPTION_UNKNOWN; config.SceneChange = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveMBQP = MFX_CODINGOPTION_UNKNOWN; } else { //turn Enc Tools OFF config.AdaptiveI = MFX_CODINGOPTION_OFF; config.AdaptiveB = MFX_CODINGOPTION_OFF; config.AdaptivePyramidQuantP = MFX_CODINGOPTION_OFF; config.AdaptivePyramidQuantB = MFX_CODINGOPTION_OFF; config.AdaptiveRefP = MFX_CODINGOPTION_OFF; config.AdaptiveRefB = MFX_CODINGOPTION_OFF; config.AdaptiveLTR = MFX_CODINGOPTION_OFF; config.BRCBufferHints = MFX_CODINGOPTION_OFF; config.BRC = MFX_CODINGOPTION_OFF; config.AdaptiveQuantMatrices = MFX_CODINGOPTION_OFF; config.SceneChange = MFX_CODINGOPTION_OFF; config.AdaptiveMBQP = MFX_CODINGOPTION_OFF; return; } } else if (pExtConfig) config = *pExtConfig; if (!bGameStreaming) { if (IsSwEncToolsSupported(video)) { bool bAdaptiveI = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bHasB = video.mfx.GopRefDist > 1; bool bAdaptiveB = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && bHasB; bool bAdaptiveLTR = !(pExtDdi && pExtDdi->NumActiveRefP < 2) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && (pExtOpt3 && IsOn(pExtOpt3->ExtBrcAdaptiveLTR)); SetDefaultOpt(config.AdaptiveI, bAdaptiveI); SetDefaultOpt(config.AdaptiveB, bAdaptiveB); SetDefaultOpt(config.AdaptivePyramidQuantP, false); SetDefaultOpt(config.AdaptivePyramidQuantB, bHasB); SetDefaultOpt(config.AdaptiveLTR, bAdaptiveLTR); } SetDefaultOpt(config.BRC, (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); bool lplaAssistedBRC = IsOn(config.BRC) && isSWLACondition(video); SetDefaultOpt(config.BRCBufferHints, lplaAssistedBRC); bool bIsSegModeUnknown = !pAuxData || (pAuxData->SegmentationMode == MFX_CODINGOPTION_UNKNOWN); SetDefaultOpt(config.AdaptiveMBQP, bMBQPSupport && lplaAssistedBRC && pExtOpt2 && IsOn(pExtOpt2->MBBRC) && bIsSegModeUnknown); //these features are not supported for now, we will enable them in future config.AdaptiveRefP = MFX_CODINGOPTION_OFF; config.AdaptiveRefB = MFX_CODINGOPTION_OFF; config.AdaptiveQuantMatrices = MFX_CODINGOPTION_OFF; } #ifdef MFX_ENABLE_ENCTOOLS_LPLA else { bool bLA = (pExtOpt2 && pExtOpt2->LookAheadDepth > 0 && (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); bool bAdaptiveI = (pExtOpt2 && IsOn(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bHasB = video.mfx.GopRefDist > 1; bool bAdaptiveB = (pExtOpt2 && IsOn(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && bHasB; bool bDisableCQM = pExtOpt3 && IsOff(pExtOpt3->AdaptiveCQM); SetDefaultOpt(config.BRCBufferHints, bLA); SetDefaultOpt(config.AdaptivePyramidQuantP, bLA); SetDefaultOpt(config.AdaptivePyramidQuantB, bLA && bHasB); SetDefaultOpt(config.AdaptiveQuantMatrices, bLA); SetDefaultOpt(config.AdaptiveI, bLA && bAdaptiveI); SetDefaultOpt(config.AdaptiveB, bLA && bAdaptiveB); SetDefaultOpt(config.AdaptiveQuantMatrices, bLA && !bDisableCQM); } #endif } inline mfxU32 CheckFlag(mfxU16 & flag, bool bCond) { return CheckOrZero(flag , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * (bCond))); } static mfxU32 CorrectVideoParams(mfxVideoParam & video, mfxExtEncToolsConfig & supportedConfig) { mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); mfxExtCodingOption3 *pExtOpt3 = ExtBuffer::Get(video); mfxExtBRC *pBRC = ExtBuffer::Get(video); mfxExtEncToolsConfig *pConfig = ExtBuffer::Get(video); mfxExtCodingOptionDDI *pExtDdi = ExtBuffer::Get(video); mfxU32 changed = 0; bool bIsEncToolsEnabled = false; if (pConfig) { bIsEncToolsEnabled = IsEncToolsOn(video); bool bAdaptiveI = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bHasB = video.mfx.GopRefDist > 1; bool bAdaptiveB = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && bHasB; bool bAdaptiveRef = false; bool bAdaptiveLTR = !(pExtDdi && pExtDdi->NumActiveRefP < 2) && !(pExtOpt3 && IsOff(pExtOpt3->ExtBrcAdaptiveLTR)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); changed += CheckFlag(pConfig->AdaptiveI, bIsEncToolsEnabled && bAdaptiveI); changed += CheckFlag(pConfig->AdaptiveB, bIsEncToolsEnabled && bAdaptiveB); changed += CheckFlag(pConfig->AdaptivePyramidQuantB, bIsEncToolsEnabled && bHasB); changed += CheckFlag(pConfig->AdaptivePyramidQuantP, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveRefP, bIsEncToolsEnabled && bAdaptiveRef); changed += CheckFlag(pConfig->AdaptiveRefB, bIsEncToolsEnabled && bAdaptiveRef); changed += CheckFlag(pConfig->AdaptiveLTR, bIsEncToolsEnabled && bAdaptiveLTR); changed += CheckFlag(pConfig->SceneChange, bIsEncToolsEnabled); changed += CheckFlag(pConfig->BRCBufferHints, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveQuantMatrices, bIsEncToolsEnabled); changed += CheckFlag(pConfig->BRC, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveI, IsOn(supportedConfig.AdaptiveI)); changed += CheckFlag(pConfig->AdaptiveB, IsOn(supportedConfig.AdaptiveB)); changed += CheckFlag(pConfig->AdaptivePyramidQuantB, IsOn(supportedConfig.AdaptivePyramidQuantB)); changed += CheckFlag(pConfig->AdaptivePyramidQuantP, IsOn(supportedConfig.AdaptivePyramidQuantP)); changed += CheckFlag(pConfig->AdaptiveRefP, IsOn(supportedConfig.AdaptiveRefP)); changed += CheckFlag(pConfig->AdaptiveRefB, IsOn(supportedConfig.AdaptiveRefB)); changed += CheckFlag(pConfig->AdaptiveLTR, IsOn(supportedConfig.AdaptiveLTR)); changed += CheckFlag(pConfig->SceneChange, IsOn(supportedConfig.SceneChange)); changed += CheckFlag(pConfig->BRCBufferHints, IsOn(supportedConfig.BRCBufferHints)); changed += CheckFlag(pConfig->AdaptiveQuantMatrices, IsOn(supportedConfig.AdaptiveQuantMatrices)); changed += CheckFlag(pConfig->BRC, IsOn(supportedConfig.BRC)); } if (pExtOpt2) { changed += CheckFlag(pExtOpt2->AdaptiveI, IsOn(supportedConfig.AdaptiveI)); changed += CheckFlag(pExtOpt2->AdaptiveB, IsOn(supportedConfig.AdaptiveB)); changed += CheckFlag(pExtOpt2->ExtBRC, IsOn(supportedConfig.BRC)); } if (pExtOpt3) { changed += CheckFlag(pExtOpt3->ExtBrcAdaptiveLTR, IsOn(supportedConfig.AdaptiveLTR)); changed += CheckFlag(pExtOpt3->AdaptiveCQM, IsOn(supportedConfig.AdaptiveQuantMatrices)); } //ExtBRC isn't compatible with EncTools if (pBRC && bIsEncToolsEnabled && (pBRC->pthis || pBRC->Init || pBRC->Close || pBRC->Update || pBRC->GetFrameCtrl || pBRC->Reset || pBRC->GetFrameCtrl)) { pBRC->pthis = nullptr; pBRC->Init = nullptr; pBRC->Close = nullptr; pBRC->Update = nullptr; pBRC->GetFrameCtrl = nullptr; pBRC->Reset = nullptr; changed++; } return changed; } static mfxStatus InitEncToolsCtrl( mfxVideoParam const & par , mfxEncToolsCtrl *ctrl) { MFX_CHECK_NULL_PTR1(ctrl); const mfxExtCodingOption2 *pCO2 = ExtBuffer::Get(par); const mfxExtCodingOption3 *pCO3 = ExtBuffer::Get(par); ctrl->CodecId = par.mfx.CodecId; ctrl->CodecProfile = par.mfx.CodecProfile; ctrl->CodecLevel = par.mfx.CodecLevel; ctrl->LowPower = par.mfx.LowPower; ctrl->FrameInfo = par.mfx.FrameInfo; ctrl->IOPattern = par.IOPattern; ctrl->MaxDelayInFrames = pCO2 ? pCO2->LookAheadDepth : 0 ; ctrl->MaxGopSize = par.mfx.GopPicSize; ctrl->MaxGopRefDist = par.mfx.GopRefDist; ctrl->MaxIDRDist = par.mfx.GopPicSize; ctrl->BRefType = pCO2 ? pCO2->BRefType : 0; ctrl->ScenarioInfo = pCO3 ? pCO3->ScenarioInfo : 0; ctrl->GopOptFlag = (mfxU8)par.mfx.GopOptFlag; // Rate control info mfxU32 mult = par.mfx.BRCParamMultiplier ? par.mfx.BRCParamMultiplier : 1; bool BRC = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR); ctrl->RateControlMethod = par.mfx.RateControlMethod; //CBR, VBR, CRF,CQP if (!BRC) { ctrl->QPLevel[0] = par.mfx.QPI; ctrl->QPLevel[1] = par.mfx.QPP; ctrl->QPLevel[2] = par.mfx.QPB; } else { ctrl->TargetKbps = par.mfx.TargetKbps * mult; ctrl->MaxKbps = par.mfx.MaxKbps * mult; ctrl->HRDConformance = MFX_BRC_NO_HRD; ctrl->ConvergencePeriod = 0; //if HRDConformance is OFF, 0 - the period is whole stream, ctrl->Accuracy = 10; //if HRDConformance is OFF ctrl->BufferSizeInKB = par.mfx.BufferSizeInKB*mult; ctrl->InitialDelayInKB = par.mfx.InitialDelayInKB*mult; mfxU32 maxFrameSize = pCO2 ? pCO2->MaxFrameSize : 0; ctrl->WinBRCMaxAvgKbps = pCO3 ? pCO3->WinBRCMaxAvgKbps*mult : 0; ctrl->WinBRCSize = pCO3 ? pCO3->WinBRCSize : 0; ctrl->MaxFrameSizeInBytes[0] = (pCO3 && pCO3->MaxFrameSizeI) ? pCO3->MaxFrameSizeI : maxFrameSize; // MaxFrameSize limitation ctrl->MaxFrameSizeInBytes[1] = (pCO3 && pCO3->MaxFrameSizeP) ? pCO3->MaxFrameSizeP : maxFrameSize; ctrl->MaxFrameSizeInBytes[2] = maxFrameSize; ctrl->MinQPLevel[0] = pCO2 ? pCO2->MinQPI : 0; //QP range limitations ctrl->MinQPLevel[1] = pCO2 ? pCO2->MinQPP : 0; ctrl->MinQPLevel[2] = pCO2 ? pCO2->MinQPB : 0; ctrl->MaxQPLevel[0] = pCO2 ? pCO2->MaxQPI : 0; //QP range limitations ctrl->MaxQPLevel[1] = pCO2 ? pCO2->MaxQPP : 0; ctrl->MaxQPLevel[2] = pCO2 ? pCO2->MaxQPB : 0; ctrl->PanicMode = pCO3 ? pCO3->BRCPanicMode : 0; } // LaScale here ctrl->LaScale = 0; ctrl->LaQp = 30; if (ctrl->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; if (crW >= 720) ctrl->LaScale = 2; } else { mfxU16 crH = par.mfx.FrameInfo.CropH ? par.mfx.FrameInfo.CropH : par.mfx.FrameInfo.Height; mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; mfxU16 maxDim = std::max(crH, crW); mfxU16 minDim = std::min(crH, crW); constexpr mfxU16 LaScale = 2; if (maxDim >= 720 && minDim >= (128 << LaScale)) //encoder limitation, 128 and up is fine { ctrl->LaScale = LaScale; } ctrl->LaQp = 26; } return MFX_ERR_NONE; } void AV1EncTools::Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) { // This "Push" sets CO2.MBBRC to ON if it is not specified in cmdline Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetMBBRC.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { bool bEncTools = IsSwEncToolsOn(par.mvp); const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); if (bEncTools && isSWLACondition(par.mvp)) { const mfxExtEncToolsConfig* pConfig = ExtBuffer::Get(par.mvp); bool bDisableMBQP = pConfig && (IsOff(pConfig->AdaptiveMBQP) || IsOff(pConfig->BRC)); return (mfxU16)((pCO2 && pCO2->MBBRC) ? pCO2->MBBRC : bDisableMBQP ? MFX_CODINGOPTION_OFF : MFX_CODINGOPTION_ON); } return mfxU16(prev(par)); }); return MFX_ERR_NONE; }); Push(BLK_Check, [&blocks](const mfxVideoParam&, mfxVideoParam& par, StorageW&) -> mfxStatus { mfxU32 changed = 0; bool bEncTools = IsEncToolsOn(par); MFX_CHECK(bEncTools, MFX_ERR_NONE); mfxEncTools *pEncTools = GetEncTools(par); bool bCreated = false; if (!pEncTools) { pEncTools = MFXVideoENCODE_CreateEncTools(par); bCreated = !!pEncTools; } mfxEncToolsCtrl ctrl = {}; mfxExtEncToolsConfig supportedConfig = {}; mfxStatus sts = InitEncToolsCtrl(par, &ctrl); MFX_CHECK_STS(sts); pEncTools->GetSupportedConfig(pEncTools->Context, &supportedConfig, &ctrl); changed += CorrectVideoParams(par, supportedConfig); if (bCreated) MFXVideoENCODE_DestroyEncTools(pEncTools); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void AV1EncTools::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW& global, StorageRW&) { if (IsHwEncToolsOn(par)) SetDefault(par.mfx.GopOptFlag, MFX_GOP_CLOSED); mfxExtEncToolsConfig *pConfig = ExtBuffer::Get(par); auto& caps = Glob::EncodeCaps::Get(global); if (pConfig) SetDefaultConfig(par, *pConfig, caps.ForcedSegmentationSupport); }); } void AV1EncTools::Reset(const FeatureBlocks& /*blocks*/, TPushR Push) { Push(BLK_ResetCheck , [this]( const mfxVideoParam& /*par*/ , StorageRW& global , StorageRW&) -> mfxStatus { MFX_CHECK(m_pEncTools, MFX_ERR_NONE); auto& init = Glob::RealState::Get(global); auto& parOld = Glob::VideoParam::Get(init); auto& parNew = Glob::VideoParam::Get(global); mfxExtEncToolsConfig *pConfigOld = ExtBuffer::Get(parOld); mfxExtEncToolsConfig *pConfigNew = ExtBuffer::Get(parNew); if (pConfigOld && pConfigNew) { MFX_CHECK( pConfigOld->AdaptiveB == pConfigNew->AdaptiveB && pConfigOld->AdaptiveI == pConfigNew->AdaptiveI && pConfigOld->AdaptiveRefP == pConfigNew->AdaptiveRefP && pConfigOld->AdaptiveRefB == pConfigNew->AdaptiveRefB && pConfigOld->AdaptiveLTR == pConfigNew->AdaptiveLTR && pConfigOld->AdaptivePyramidQuantP == pConfigNew->AdaptivePyramidQuantP && pConfigOld->AdaptivePyramidQuantB == pConfigNew->AdaptivePyramidQuantB && pConfigOld->BRC == pConfigNew->BRC && pConfigOld->BRCBufferHints == pConfigNew->BRCBufferHints && pConfigOld->AdaptiveQuantMatrices == pConfigNew->AdaptiveQuantMatrices , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; }); } void AV1EncTools::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); if (m_pEncTools && m_pEncTools->Reset) { m_EncToolCtrl = {}; mfxExtBuffer* ExtParam; mfxExtEncoderResetOption rOpt = {}; if (Glob::ResetHint::Get(global).Flags & RF_IDR_REQUIRED) { rOpt.Header.BufferId = MFX_EXTBUFF_ENCODER_RESET_OPTION; rOpt.Header.BufferSz = sizeof(rOpt); rOpt.StartNewSequence = MFX_CODINGOPTION_ON; ExtParam = &rOpt.Header; m_EncToolCtrl.NumExtParam = 1; m_EncToolCtrl.ExtParam = &ExtParam; } auto sts = InitEncToolsCtrl(par, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = m_pEncTools->Reset(m_pEncTools->Context, &m_EncToolConfig, &m_EncToolCtrl); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; }); } inline void InitEncToolsCtrlExtDevice(mfxEncToolsCtrlExtDevice & extDevice , mfxHandleType h_type , mfxHDL device_handle) { extDevice.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_DEVICE; extDevice.Header.BufferSz = sizeof(mfxEncToolsCtrlExtDevice); extDevice.HdlType = h_type; extDevice.DeviceHdl = device_handle; } inline void InitEncToolsCtrlExtAllocator(mfxEncToolsCtrlExtAllocator & extAllocator , mfxFrameAllocator &allocator) { extAllocator.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_ALLOCATOR; extAllocator.Header.BufferSz = sizeof(mfxEncToolsCtrlExtAllocator); extAllocator.pAllocator = &allocator; } inline mfxHandleType GetHandleType(eMFXVAType vaType) { switch (vaType) { case MFX_HW_D3D9: return MFX_HANDLE_D3D9_DEVICE_MANAGER; case MFX_HW_VAAPI: return MFX_HANDLE_VA_DISPLAY; default: break; } return MFX_HANDLE_D3D11_DEVICE; } void AV1EncTools::QueryIOSurf(const FeatureBlocks&, TPushQIS Push) { Push(BLK_QueryIOSurf , [](const mfxVideoParam& parInput, mfxFrameAllocRequest& req, StorageRW& strg) -> mfxStatus { ExtBuffer::Param par = parInput; auto& caps = Glob::EncodeCaps::Get(strg); bool bEncTools = IsEncToolsOn(par); mfxU32 changed = 0; MFX_CHECK(bEncTools, MFX_ERR_NONE); mfxEncTools* pEncTools = GetEncTools(par); bool bCreated = false; if (!pEncTools) { pEncTools = MFXVideoENCODE_CreateEncTools(par); bCreated = !!pEncTools; } MFX_CHECK_NULL_PTR1(pEncTools); mfxEncToolsCtrl ctrl = {}; mfxExtEncToolsConfig supportedConfig = {}; mfxStatus sts = InitEncToolsCtrl(par, &ctrl); MFX_CHECK_STS(sts); pEncTools->GetSupportedConfig(pEncTools->Context, &supportedConfig, &ctrl); changed += CorrectVideoParams(par, supportedConfig); mfxExtEncToolsConfig config = {}; SetDefaultConfig(par, config, caps.ForcedSegmentationSupport); mfxU32 maxDelay = 0; pEncTools->GetDelayInFrames(pEncTools->Context, &config, &ctrl, &maxDelay); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2) maxDelay = (mfxU32)std::max(0, maxDelay - pCO2->LookAheadDepth); //LA is used in base_legacy req.NumFrameMin += (mfxU16)maxDelay; req.NumFrameSuggested += (mfxU16)maxDelay; if (bCreated) MFXVideoENCODE_DestroyEncTools(pEncTools); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } mfxStatus AV1EncTools::SubmitPreEncTask(StorageW& /*global*/, StorageW& s_task) { MFX_CHECK(m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); mfxEncToolsTaskParam task_par = {}; auto& task = Task::Common::Get(s_task); std::vector extParams; mfxEncToolsFrameToAnalyze extFrameData = {}; //"m_numPicBuffered > 0" indicates: there are some PreEnc frames buffered for async_depth > 1 case, while not queried if (task.pSurfIn || m_numPicBuffered > 0) { extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.Surface = task.pSurfIn; extParams.push_back(&extFrameData.Header); task_par.ExtParam = extParams.data(); if (!task.pSurfIn) { m_numPicBuffered--; } } task_par.DisplayOrder = task.DisplayOrder; task_par.NumExtParam = (mfxU16)extParams.size(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); if (sts == MFX_ERR_MORE_DATA) { m_numPicBuffered++; // current PreEnc frame buffered, while not queried sts = MFX_ERR_NONE; } return (sts); } constexpr mfxU32 ENCTOOLS_QUERY_TIMEOUT = 5000; mfxStatus AV1EncTools::BRCGetCtrl(StorageW& global, StorageW& s_task, mfxEncToolsBRCQuantControl &extQuantCtrl, mfxEncToolsBRCHRDPos &extHRDPos) { MFX_CHECK(IsOn (m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); mfxEncToolsTaskParam task_par = {}; auto& task = Task::Common::Get(s_task); std::vector extParams; mfxEncToolsBRCFrameParams extFrameData = {}; mfxEncToolsBRCBufferHint extBRCHints = {}; task_par.DisplayOrder = task.DisplayOrder; { // input params extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.EncodeOrder = task.EncodedOrder; extFrameData.FrameType = task.FrameType; extFrameData.PyramidLayer = (mfxU16) task.PyramidLevel; extFrameData.SceneChange = task.GopHints.SceneChange; extFrameData.SpatialComplexity = task.GopHints.SpatialComplexity; extFrameData.PersistenceMapNZ = task.GopHints.PersistenceMapNZ; if (extFrameData.PersistenceMapNZ) memcpy(extFrameData.PersistenceMap, task.GopHints.PersistenceMap, sizeof(extFrameData.PersistenceMap)); if (task.InternalListCtrlPresent && task.InternalListCtrl.LongTermRefList[0].FrameOrder == task.DisplayOrder) { extFrameData.LongTerm = 1; } extParams.push_back(&extFrameData.Header); if (task.BrcHints.LaAvgEncodedBits) { extBRCHints.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; extBRCHints.Header.BufferSz = sizeof(extBRCHints); extBRCHints.AvgEncodedSizeInBits = task.BrcHints.LaAvgEncodedBits; extBRCHints.CurEncodedSizeInBits = task.BrcHints.LaCurEncodedBits; extBRCHints.DistToNextI = task.BrcHints.LaDistToNextI; extParams.push_back(&extBRCHints.Header); } if (task.GopHints.QPModulaton || task.GopHints.MiniGopSize) { mfxEncToolsHintPreEncodeGOP extPreGop = {}; extPreGop.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; extPreGop.Header.BufferSz = sizeof(extPreGop); extPreGop.QPModulation = (mfxU16)task.GopHints.QPModulaton; extPreGop.QPDeltaExplicitModulation = (mfxI8)task.GopHints.QPDeltaExplicitModulation; extPreGop.MiniGopSize = (mfxU16)task.GopHints.MiniGopSize; extParams.push_back(&extPreGop.Header); } task_par.ExtParam = extParams.data(); task_par.NumExtParam = (mfxU16)extParams.size(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); MFX_CHECK_STS(sts); } { mfxEncToolsHintQPMap qpMapHint = {}; auto& par = Glob::VideoParam::Get(global); extParams.clear(); // output params extQuantCtrl = {}; extQuantCtrl.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL; extQuantCtrl.Header.BufferSz = sizeof(extQuantCtrl); extParams.push_back(&extQuantCtrl.Header); extHRDPos = {}; extHRDPos.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS; extHRDPos.Header.BufferSz = sizeof(extHRDPos); extParams.push_back(&extHRDPos.Header); mfxExtAV1Segmentation seg_enctools = {}; const auto& caps = Glob::EncodeCaps::Get(global); if (IsOn(m_EncToolConfig.AdaptiveMBQP)) { // Allocate memory for segmentation, if not allocated yet if (m_pSegmentQPMap == nullptr) AllocSegmentationData(par.mfx.FrameInfo.Width, par.mfx.FrameInfo.Height, caps.MinSegIdBlockSizeAccepted); // Get QP map qpMapHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP; qpMapHint.Header.BufferSz = sizeof(qpMapHint); qpMapHint.ExtQpMap.BlockSize = m_SegmentationInfo.SegmentIdBlockSize; qpMapHint.ExtQpMap.QP = m_pSegmentQPMap; qpMapHint.ExtQpMap.Mode = MFX_MBQP_MODE_QP_VALUE; qpMapHint.QpMapPitch = (mfxU16)((par.mfx.FrameInfo.Width + m_SegmentationInfo.SegmentIdBlockSize - 1) / m_SegmentationInfo.SegmentIdBlockSize); qpMapHint.ExtQpMap.NumQPAlloc = m_SegmentationInfo.NumSegmentIdAlloc; extParams.push_back(&qpMapHint.Header); // Get segmentIDs and AltQIndexes seg_enctools.Header.BufferId = MFX_EXTBUFF_AV1_SEGMENTATION; seg_enctools.Header.BufferSz = sizeof(seg_enctools); seg_enctools.SegmentIdBlockSize = m_SegmentationInfo.SegmentIdBlockSize; seg_enctools.NumSegments = m_SegmentationInfo.NumSegments; seg_enctools.NumSegmentIdAlloc = m_SegmentationInfo.NumSegmentIdAlloc; seg_enctools.SegmentIds = m_pSegmentIDMap; extParams.push_back(&seg_enctools.Header); } task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); MFX_CHECK_STS(sts); task.bCUQPMap = qpMapHint.QpMapFilled ? true : false; mfxExtAV1Segmentation& seg_task = Task::Segment::Get(s_task); // sanity check: segmentId must be in [0,6] if (IsOn(m_EncToolConfig.AdaptiveMBQP)) { if (task.bCUQPMap) { mfxU8 max_id = *(std::max_element(seg_enctools.SegmentIds, seg_enctools.SegmentIds + seg_enctools.NumSegmentIdAlloc )); mfxU8 min_id = *(std::min_element(seg_enctools.SegmentIds, seg_enctools.SegmentIds + seg_enctools.NumSegmentIdAlloc )); MFX_CHECK(max_id <= 6 && min_id >= 0, MFX_ERR_UNDEFINED_BEHAVIOR); // Enctools does not modify segment 7. So copy segment 7 seg_enctools.Segment[7].FeatureEnabled = seg_task.Segment[7].FeatureEnabled; seg_enctools.NumSegments = 8; // Xe-Hpm limitation if (AV1ECaps::IsSegmentationHWLimitationNeeded(Glob::VideoCore::Get(global).GetHWType())) EnableFeature(seg_enctools.Segment[AV1_MAX_NUM_OF_SEGMENTS -1].FeatureEnabled, Base::SEG_LVL_SKIP); } else { // If this frame does not use PAQ, set below flags for segmentation module to disable segmentation. seg_enctools.NumSegmentIdAlloc = 0; seg_enctools.NumSegments = 0; } // These function calls are needed even if PAQ is not used for this frame. auto& dpb = Glob::SegDpb::Get(global); auto& fh = Task::FH::Get(s_task); const mfxExtAV1AuxData& auxData = ExtBuffer::Get(par); const auto& numRefFrame = Glob::VideoParam::Get(global).mfx.NumRefFrame; const auto& refreshFrameFlags = Task::Common::Get(s_task).RefreshFrameFlags; MFX_CHECK_STS(Base::Segmentation::UpdateSegmentBuffers(seg_task, &seg_enctools)); MFX_CHECK_STS(Segmentation::PostUpdateSegmentParam(seg_task, fh, dpb, auxData, numRefFrame, refreshFrameFlags)); const auto& defchain = Glob::Defaults::Get(global); const Defaults::Param& defPar = Defaults::Param(par, caps, defchain); MFX_CHECK_STS(Segmentation::CheckAndFixSegmentBuffers(&(Task::Segment::Get(s_task)), defPar)); //HW limitation if (task.bCUQPMap) { if (AV1ECaps::IsSegmentationHWLimitationNeeded(Glob::VideoCore::Get(global).GetHWType())) ApplyHWLimitation_XeHpm(global, s_task, seg_enctools); } } } return MFX_ERR_NONE; } mfxStatus AV1EncTools::QueryPreEncTask(StorageW& /*global*/, StorageW& s_task) { MFX_CHECK(m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxEncToolsTaskParam task_par = {}; std::vector extParams; mfxEncToolsHintPreEncodeSceneChange preEncodeSChg = {}; mfxEncToolsHintPreEncodeGOP preEncodeGOP = {}; mfxEncToolsBRCBufferHint bufHint = {}; mfxEncToolsHintQuantMatrix cqmHint = {}; mfxEncToolsHintQPMap qpMapHint = {}; mfxEncToolsHintPreEncodeARefFrames aRef = {}; bool isLABRC = (m_EncToolCtrl.ScenarioInfo == MFX_SCENARIO_UNKNOWN && IsOn(m_EncToolConfig.BRCBufferHints) && IsOn(m_EncToolConfig.BRC)); MFX_CHECK(task.DisplayOrder!= (mfxU32)(-1), MFX_ERR_NONE); task_par.DisplayOrder = task.DisplayOrder; task_par.NumExtParam = 0; if (IsOn(m_EncToolConfig.BRC)) { preEncodeSChg.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE; preEncodeSChg.Header.BufferSz = sizeof(preEncodeSChg); extParams.push_back(&preEncodeSChg.Header); } if (IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB)) { preEncodeGOP.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; preEncodeGOP.Header.BufferSz = sizeof(preEncodeGOP); extParams.push_back(&preEncodeGOP.Header); } #if defined MFX_ENABLE_ENCTOOLS_LPLA if (IsOn(m_EncToolConfig.AdaptiveQuantMatrices)) { cqmHint.MatrixType = CQM_HINT_USE_FLAT_MATRIX; cqmHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_MATRIX; cqmHint.Header.BufferSz = sizeof(cqmHint); extParams.push_back(&cqmHint.Header); } #endif if (IsOn(m_EncToolConfig.BRCBufferHints)) { bufHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; bufHint.Header.BufferSz = sizeof(bufHint); bufHint.OutputMode = mfxU16(isLABRC ? MFX_BUFFERHINT_OUTPUT_DISPORDER : MFX_BUFFERHINT_OUTPUT_ENCORDER); extParams.push_back(&bufHint.Header); } if (IsOn(m_EncToolConfig.AdaptiveLTR)) { aRef.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_AREF; aRef.Header.BufferSz = sizeof(aRef); extParams.push_back(&aRef.Header); } task_par.ExtParam = extParams.data(); task_par.NumExtParam = (mfxU16)extParams.size(); MFX_CHECK(task_par.NumExtParam, MFX_ERR_NONE); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); if (sts == MFX_ERR_MORE_DATA) sts = MFX_ERR_NONE; MFX_CHECK_STS(sts); task.GopHints.MiniGopSize = preEncodeGOP.MiniGopSize; task.GopHints.FrameType = preEncodeGOP.FrameType; task.GopHints.SceneChange = preEncodeSChg.SceneChangeFlag; task.GopHints.SpatialComplexity = preEncodeSChg.SpatialComplexity; task.GopHints.PersistenceMapNZ = preEncodeSChg.PersistenceMapNZ; if (preEncodeSChg.PersistenceMapNZ) memcpy(task.GopHints.PersistenceMap, preEncodeSChg.PersistenceMap, sizeof(task.GopHints.PersistenceMap)); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (IsOn(m_EncToolConfig.BRCBufferHints) && !isLABRC) { //Low power look ahead with HW BRC mfxLplastatus laStatus = {}; laStatus.QpModulation = (mfxU8)preEncodeGOP.QPModulation; laStatus.MiniGopSize = (mfxU8)preEncodeGOP.MiniGopSize; switch (cqmHint.MatrixType) { case MFX_QUANT_MATRIX_WEAK: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX1; break; case MFX_QUANT_MATRIX_MEDIUM: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX2; break; case MFX_QUANT_MATRIX_STRONG: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX3; break; case MFX_QUANT_MATRIX_EXTREME: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX4; break; case MFX_QUANT_MATRIX_FLAT: default: laStatus.CqmHint = CQM_HINT_USE_FLAT_MATRIX; } laStatus.TargetFrameSize = bufHint.OptimalFrameSizeInBytes; LpLaStatus.push_back(laStatus); //lpLaStatus is got in encoded order } else #endif { if (IsOn(m_EncToolConfig.AdaptivePyramidQuantB) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP)) { task.GopHints.QPModulaton = (mfxU8)preEncodeGOP.QPModulation; //task.GopHints.QPModulaton = MFX_QP_MODULATION_EXPLICIT; //task.GopHints.QPDeltaExplicitModulation = (mfxI8)preEncodeGOP.QPDeltaExplicitModulation; } if (isLABRC) { task.BrcHints.LaAvgEncodedBits = bufHint.AvgEncodedSizeInBits; task.BrcHints.LaCurEncodedBits = bufHint.CurEncodedSizeInBits; task.BrcHints.LaDistToNextI = bufHint.DistToNextI; } if (IsOn(m_EncToolConfig.AdaptiveLTR)) { InitExtBufHeader_AV1(task.InternalListCtrl); task.InternalListCtrlPresent = true; if (aRef.CurrFrameType == MFX_REF_FRAME_TYPE_LTR) { task.InternalListCtrl.LongTermRefList[0].FrameOrder = task.DisplayOrder; task.InternalListCtrl.LongTermRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } for (mfxU32 i = (aRef.CurrFrameType == MFX_REF_FRAME_TYPE_LTR) ? 1 : 0; i < std::min(aRef.LongTermRefListSize, (mfxU16)16); i++) { task.InternalListCtrl.LongTermRefList[i].FrameOrder = aRef.LongTermRefList[i]; task.InternalListCtrl.LongTermRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } for (mfxU32 i = 0; i < std::min(aRef.PreferredRefListSize, (mfxU16)32); i++) { task.InternalListCtrl.PreferredRefList[i].FrameOrder = aRef.PreferredRefList[i]; task.InternalListCtrl.PreferredRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } for (mfxU32 i = 0; i < std::min(aRef.RejectedRefListSize, (mfxU16)16); i++) { task.InternalListCtrl.RejectedRefList[i].FrameOrder = aRef.RejectedRefList[i]; task.InternalListCtrl.RejectedRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } } } return sts; } mfxStatus AV1EncTools::BRCUpdate(StorageW& , StorageW& s_task, mfxEncToolsBRCStatus & brcStatus) { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxEncToolsTaskParam task_par = {}; std::vector extParams; MFX_CHECK(task.DisplayOrder != (mfxU32)(-1), MFX_ERR_NONE); task_par.DisplayOrder = task.DisplayOrder; { mfxEncToolsBRCEncodeResult extEncRes; extEncRes.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT; extEncRes.Header.BufferSz = sizeof(extEncRes); extEncRes.CodedFrameSize = task.MinFrameSize > task.BsDataLength ? task.MinFrameSize : task.BsDataLength; extEncRes.NumRecodesDone = task.NumRecode; extEncRes.QpY = task.QpY; extParams.push_back(&extEncRes.Header); task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); MFX_CHECK_STS(sts); } { extParams.clear(); brcStatus = {}; brcStatus.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_STATUS; brcStatus.Header.BufferSz = sizeof(brcStatus); extParams.push_back(&brcStatus.Header); task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); MFX_CHECK_STS(sts) } return MFX_ERR_NONE; } #define IS_CUST_MATRIX(CqmHint) ((CqmHint) >= CQM_HINT_USE_CUST_MATRIX1 && (CqmHint) < CQM_HINT_USE_CUST_MATRIX1 + CQM_HINT_NUM_CUST_MATRIX) void AV1EncTools::AllocSegmentationData(mfxU16 frame_width, mfxU16 frame_height, mfxU8 blockSize) { mfxU16 numSegBlksInWidth = (mfxU16)((frame_width + blockSize - 1) / blockSize); mfxU16 numSegBlksIHeight = (mfxU16)((frame_height + blockSize - 1) / blockSize); m_SegmentationInfo.NumSegmentIdAlloc = numSegBlksInWidth * numSegBlksIHeight; m_SegmentationInfo.SegmentIdBlockSize = blockSize; m_SegmentationInfo.NumSegments = 8; //enctools needs all 8 segments m_pSegmentQPMap = new mfxU8[m_SegmentationInfo.NumSegmentIdAlloc]; m_pSegmentIDMap = new mfxU8[m_SegmentationInfo.NumSegmentIdAlloc]; } void AV1EncTools::ReleaseSegmentationData(void) { if (m_pSegmentQPMap) { delete [] m_pSegmentQPMap; m_pSegmentQPMap = nullptr; } if (m_pSegmentIDMap) { delete [] m_pSegmentIDMap; m_pSegmentIDMap = nullptr; } } void AV1EncTools::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); bool bEncTools = IsEncToolsOn(par); MFX_CHECK(bEncTools, MFX_ERR_NONE); MFX_CHECK(!m_pEncTools, MFX_ERR_NONE); mfxEncTools* encTools = GetEncTools(par); mfxEncToolsCtrlExtDevice extBufDevice = {}; mfxEncToolsCtrlExtAllocator extBufAlloc = {}; mfxExtBuffer* ExtParam[2] = {}; memset(&m_EncToolCtrl, 0, sizeof(mfxEncToolsCtrl)); auto vaType = Glob::VideoCore::Get(strg).GetVAType(); if (vaType!= MFX_HW_NO) { mfxFrameAllocator *pFrameAlloc = nullptr; mfxHDL device_handle = {}; mfxHandleType h_type = GetHandleType(vaType); auto sts = Glob::VideoCore::Get(strg).GetHandle(h_type, &device_handle); MFX_CHECK_STS(sts); pFrameAlloc = (mfxFrameAllocator*)Glob::VideoCore::Get(strg).QueryCoreInterface(MFXIEXTERNALLOC_GUID);//(&frameAlloc); InitEncToolsCtrlExtDevice(extBufDevice, h_type, device_handle); if (pFrameAlloc) InitEncToolsCtrlExtAllocator(extBufAlloc, *pFrameAlloc); ExtParam[0] = &extBufDevice.Header; ExtParam[1] = &extBufAlloc.Header; m_EncToolCtrl.ExtParam = ExtParam; m_EncToolCtrl.NumExtParam = 2; } auto sts = InitEncToolsCtrl(par, &m_EncToolCtrl); MFX_CHECK_STS(sts); m_bEncToolsInner = false; if (!(encTools && encTools->Context)) { encTools = MFXVideoENCODE_CreateEncTools(par); m_bEncToolsInner = !!encTools; } if (encTools) { mfxExtEncToolsConfig supportedConfig = {}; encTools->GetSupportedConfig(encTools->Context, &supportedConfig, &m_EncToolCtrl); if (CorrectVideoParams(par, supportedConfig)) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); SetDefaultConfig(par, m_EncToolConfig, caps.ForcedSegmentationSupport); sts = encTools->Init(encTools->Context, &m_EncToolConfig, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = encTools->GetActiveConfig(encTools->Context, &m_EncToolConfig); MFX_CHECK_STS(sts); encTools->GetDelayInFrames(encTools->Context, &m_EncToolConfig, &m_EncToolCtrl, &m_maxDelay); auto& taskMgrIface = TaskManager::TMInterface::Get(strg); auto& tm = taskMgrIface.m_Manager; S_ET_SUBMIT = tm.AddStage(tm.S_NEW); S_ET_QUERY = tm.AddStage(S_ET_SUBMIT); m_pEncTools = encTools; } m_destroy = [this]() { if (m_bEncToolsInner) MFXVideoENCODE_DestroyEncTools(m_pEncTools); m_bEncToolsInner = false; ReleaseSegmentationData(); }; return MFX_ERR_NONE; }); // Add S_ET_SUBMIT and S_ET_QUERY stages for EncTools Push(BLK_AddTask , [this](StorageRW& global, StorageRW&) -> mfxStatus { MFX_CHECK(S_ET_SUBMIT != mfxU16(-1) && S_ET_QUERY != mfxU16(-1), MFX_ERR_NONE); auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto& tm = taskMgrIface.m_Manager; auto ETSubmit = [&]( TaskManager::ExtTMInterface::TAsyncStage::TExt , StorageW& global , StorageW& /*s_task*/) -> mfxStatus { std::unique_lock closeGuard(tm.m_closeMtx); if (tm.m_nRecodeTasks) { return MFX_ERR_NONE; } if (StorageW* pTask = tm.GetTask(tm.Stage(S_ET_SUBMIT))) { SubmitPreEncTask(global, *pTask); tm.MoveTaskForward(tm.Stage(S_ET_SUBMIT), tm.FixedTask(*pTask)); } return MFX_ERR_NONE; }; auto ETQuery = [&]( TaskManager::ExtTMInterface::TAsyncStage::TExt , StorageW& /*global*/ , StorageW& s_task) -> mfxStatus { std::unique_lock closeGuard(tm.m_closeMtx); bool bFlush = !tm.IsInputTask(s_task); if (tm.m_nRecodeTasks) { return MFX_ERR_NONE; } // Delay For LookAhead Depth MFX_CHECK(tm.m_stages.at(tm.Stage(S_ET_QUERY)).size() >= std::max(m_maxDelay,1U) || bFlush,MFX_ERR_NONE); StorageW* pTask = tm.GetTask(tm.Stage(S_ET_QUERY)); MFX_CHECK(pTask, MFX_ERR_NONE); auto sts = QueryPreEncTask(global, *pTask); MFX_CHECK_STS(sts); tm.MoveTaskForward(tm.Stage(S_ET_QUERY), tm.FixedTask(*pTask)); return MFX_ERR_NONE; }; taskMgrIface.m_AsyncStages[tm.Stage(S_ET_SUBMIT)].Push(ETSubmit); taskMgrIface.m_AsyncStages[tm.Stage(S_ET_QUERY)].Push(ETQuery); // Extend Num of tasks and size of buffer. taskMgrIface.m_ResourceExtra += (mfxU16)m_maxDelay; return MFX_ERR_NONE; }); Push(BLK_UpdateTask , [this](StorageRW& global, StorageRW&) -> mfxStatus { MFX_CHECK(m_pEncTools, MFX_ERR_NONE); auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto UpdateTask = [&]( TaskManager::ExtTMInterface::TUpdateTask::TExt , StorageW& global , StorageW* dstTask) -> mfxStatus { global; dstTask; #if defined MFX_ENABLE_ENCTOOLS_LPLA if (dstTask) { auto& dst_task = Task::Common::Get(*dstTask); if (LpLaStatus.size() > 0) { auto& par = Glob::VideoParam::Get(global); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); auto& fh = Task::FH::Get(*dstTask); dst_task.LplaStatus = *(LpLaStatus.begin()); if (IsOn(CO3.AdaptiveCQM)) { fh.quantization_params.using_qmatrix = IS_CUST_MATRIX(dst_task.LplaStatus.CqmHint) ? 1 : 0; if (fh.quantization_params.using_qmatrix) { // best mapping scheme for PSNR metric const mfxU8 qMatrixYIdx[CQM_HINT_NUM_CUST_MATRIX] = { 10, 6, 3, 0 }; mfxU8 idx = dst_task.LplaStatus.CqmHint >= CQM_HINT_USE_CUST_MATRIX1 ? dst_task.LplaStatus.CqmHint - CQM_HINT_USE_CUST_MATRIX1 : 0; fh.quantization_params.qm_y = qMatrixYIdx[idx]; fh.quantization_params.qm_u = std::min(fh.quantization_params.qm_y + 8, 15U); fh.quantization_params.qm_v = fh.quantization_params.qm_u; } } LpLaStatus.pop_front(); } } #endif return MFX_ERR_NONE; }; taskMgrIface.UpdateTask.Push(UpdateTask); return MFX_ERR_NONE; }); Push(BLK_SetCallChains , [this](StorageRW& global, StorageRW&) -> mfxStatus { global; #if defined(MFX_ENABLE_ENCTOOLS_LPLA) #endif return MFX_ERR_NONE; }); } void AV1EncTools::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_GetFrameCtrl , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); mfxEncToolsBRCQuantControl quantCtrl = {}; mfxEncToolsBRCHRDPos HRDPos = {}; // call enctools BRCGetCtrl(global, s_task, quantCtrl, HRDPos); // Report BRC results to encoder auto& task = Task::Common::Get(s_task); task.QpY = (mfxU8)quantCtrl.QpY; auto& fh = Task::FH::Get(s_task); fh.quantization_params.base_q_idx = task.QpY; // Set deblocking filter levels fh.loop_filter_params.loop_filter_level[0] = LoopFilterLevelsLuma[task.QpY]; fh.loop_filter_params.loop_filter_level[1] = LoopFilterLevelsLuma[task.QpY]; fh.loop_filter_params.loop_filter_level[2] = LoopFilterLevelsChroma[task.QpY]; fh.loop_filter_params.loop_filter_level[3] = LoopFilterLevelsChroma[task.QpY]; // Set CDEF filter CDEF(fh); return MFX_ERR_NONE; }); } void AV1EncTools::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Update , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); MFX_CHECK(!task.bBRCUpdated && task.BsDataLength, MFX_ERR_NONE); mfxEncToolsBRCStatus brcSts = {}; auto sts = BRCUpdate(global, s_task, brcSts); MFX_CHECK_STS(sts); task.bSkip = false; switch (brcSts.FrameStatus.BRCStatus) { case MFX_BRC_OK: break; case MFX_BRC_PANIC_SMALL_FRAME: task.MinFrameSize = brcSts.FrameStatus.MinFrameSize; task.NumRecode++; sts = BRCUpdate(global, s_task, brcSts); MFX_CHECK_STS(sts); MFX_CHECK(brcSts.FrameStatus.BRCStatus == MFX_BRC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_BRC_PANIC_BIG_FRAME: task.bSkip = true; case MFX_BRC_BIG_FRAME: case MFX_BRC_SMALL_FRAME: task.bRecode = true; break; default: return MFX_ERR_UNDEFINED_BEHAVIOR; } task.bForceSync |= task.bSkip; task.bBRCUpdated = !task.bRecode; return MFX_ERR_NONE; }); } void AV1EncTools::FreeTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Discard , [this](StorageW& /*global*/, StorageW& s_task)->mfxStatus { MFX_CHECK(m_pEncTools && m_pEncTools->Discard, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); return m_pEncTools->Discard(m_pEncTools->Context, task.DisplayOrder); }); } void AV1EncTools::Close(const FeatureBlocks& /*blocks*/, TPushCLS Push) { Push(BLK_Close , [this](StorageW& /*global*/) { if (m_pEncTools && m_pEncTools->Close) m_pEncTools->Close(m_pEncTools->Context); }); } #endif //defined(MFX_ENABLE_ENCTOOLS) #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_enctools.h000066400000000000000000000111221443134507600337020ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #if defined(MFX_ENABLE_ENCTOOLS) #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include "mfxenctools-int.h" #include "mfx_enc_common.h" namespace AV1EHW { namespace Base { class AV1EncTools : public FeatureBase { public: mfxStatus SubmitPreEncTask(StorageW& global, StorageW& s_task); mfxStatus QueryPreEncTask(StorageW& global, StorageW& s_task); mfxStatus BRCGetCtrl(StorageW& global, StorageW& s_task, mfxEncToolsBRCQuantControl &extQuantCtrl, mfxEncToolsBRCHRDPos &extHRDPos); mfxStatus BRCUpdate(StorageW& global, StorageW& s_task, mfxEncToolsBRCStatus &sts); #define DECL_BLOCK_LIST\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(Check)\ DECL_BLOCK(Init)\ DECL_BLOCK(ResetCheck)\ DECL_BLOCK(Reset)\ DECL_BLOCK(SetCallChains)\ DECL_BLOCK(AddTask)\ DECL_BLOCK(PreEncSubmit)\ DECL_BLOCK(PreEncQuery)\ DECL_BLOCK(GetFrameCtrl)\ DECL_BLOCK(UpdateTask)\ DECL_BLOCK(Update)\ DECL_BLOCK(Discard)\ DECL_BLOCK(Close)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(QueryIOSurf) #define DECL_FEATURE_NAME "Base_EncTools" #include "av1ehw_decl_blocks.h" AV1EncTools(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void FreeTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; virtual void QueryIOSurf(const FeatureBlocks&, TPushQIS Push) override; mfxEncTools* m_pEncTools = nullptr; mfxEncToolsCtrl m_EncToolCtrl = {}; mfxExtEncToolsConfig m_EncToolConfig = {}; bool m_bEncToolsInner = false; mfxU32 m_maxDelay = 0; mfxU32 m_numPicBuffered = 0; mfxU16 S_ET_SUBMIT = mfxU16(-1); mfxU16 S_ET_QUERY = mfxU16(-1); std::list LpLaStatus; mfx::OnExit m_destroy; mfxU8* m_pSegmentQPMap = nullptr; //Note: QP in this map is HEVC QP mfxU8* m_pSegmentIDMap = nullptr; mfxExtAV1Segmentation m_SegmentationInfo = {}; protected: void AllocSegmentationData(mfxU16 frame_width, mfxU16 frame_height, mfxU8 blockSize); void ReleaseSegmentationData(void); }; bool IsEncToolsOn(const mfxVideoParam& video); bool IsHwEncToolsOn(const mfxVideoParam& video); bool IsSwEncToolsOn(const mfxVideoParam& video); void SetDefaultConfig(const mfxVideoParam &video, mfxExtEncToolsConfig &config, bool bMBQPSupport); } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_ENCTOOLS) #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_general.cpp000066400000000000000000003776271443134507600340550ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_general.h" #include "av1ehw_base_data.h" #include "av1ehw_base_constraints.h" #include "av1ehw_base_task.h" #include "fast_copy.h" #include "mfx_common_int.h" #include #include #include #include #include #include namespace AV1EHW { namespace Base { void General::SetSupported(ParamSupport& blocks) { blocks.m_mvpCopySupported.emplace_back( [](const mfxVideoParam* pSrc, mfxVideoParam* pDst) -> void { const auto& buf_src = *(const mfxVideoParam*)pSrc; auto& buf_dst = *(mfxVideoParam*)pDst; MFX_COPY_FIELD(IOPattern); MFX_COPY_FIELD(Protected); MFX_COPY_FIELD(AsyncDepth); MFX_COPY_FIELD(mfx.LowPower); MFX_COPY_FIELD(mfx.CodecId); MFX_COPY_FIELD(mfx.CodecLevel); MFX_COPY_FIELD(mfx.CodecProfile); MFX_COPY_FIELD(mfx.TargetUsage); MFX_COPY_FIELD(mfx.GopPicSize); MFX_COPY_FIELD(mfx.GopRefDist); MFX_COPY_FIELD(mfx.GopOptFlag); MFX_COPY_FIELD(mfx.BRCParamMultiplier); MFX_COPY_FIELD(mfx.RateControlMethod); MFX_COPY_FIELD(mfx.InitialDelayInKB); MFX_COPY_FIELD(mfx.BufferSizeInKB); MFX_COPY_FIELD(mfx.TargetKbps); MFX_COPY_FIELD(mfx.MaxKbps); MFX_COPY_FIELD(mfx.NumRefFrame); MFX_COPY_FIELD(mfx.EncodedOrder); MFX_COPY_FIELD(mfx.FrameInfo.Shift); MFX_COPY_FIELD(mfx.FrameInfo.BitDepthLuma); MFX_COPY_FIELD(mfx.FrameInfo.BitDepthChroma); MFX_COPY_FIELD(mfx.FrameInfo.FourCC); MFX_COPY_FIELD(mfx.FrameInfo.Width); MFX_COPY_FIELD(mfx.FrameInfo.Height); MFX_COPY_FIELD(mfx.FrameInfo.CropX); MFX_COPY_FIELD(mfx.FrameInfo.CropY); MFX_COPY_FIELD(mfx.FrameInfo.CropW); MFX_COPY_FIELD(mfx.FrameInfo.CropH); MFX_COPY_FIELD(mfx.FrameInfo.FrameRateExtN); MFX_COPY_FIELD(mfx.FrameInfo.FrameRateExtD); MFX_COPY_FIELD(mfx.FrameInfo.AspectRatioW); MFX_COPY_FIELD(mfx.FrameInfo.AspectRatioH); MFX_COPY_FIELD(mfx.FrameInfo.PicStruct); MFX_COPY_FIELD(mfx.FrameInfo.ChromaFormat); }); blocks.m_ebCopySupported[MFX_EXTBUFF_AV1_BITSTREAM_PARAM].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAV1BitstreamParam*)pSrc; auto& buf_dst = *(mfxExtAV1BitstreamParam*)pDst; MFX_COPY_FIELD(WriteIVFHeaders); }); blocks.m_ebCopySupported[MFX_EXTBUFF_AV1_RESOLUTION_PARAM].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAV1ResolutionParam*)pSrc; auto& buf_dst = *(mfxExtAV1ResolutionParam*)pDst; MFX_COPY_FIELD(FrameWidth); MFX_COPY_FIELD(FrameHeight); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(EnableQPOffset); MFX_COPY_FIELD(GPB); MFX_COPY_ARRAY_FIELD(QPOffset); MFX_COPY_ARRAY_FIELD(NumRefActiveP); MFX_COPY_ARRAY_FIELD(NumRefActiveBL0); MFX_COPY_ARRAY_FIELD(NumRefActiveBL1); MFX_COPY_FIELD(TargetChromaFormatPlus1); MFX_COPY_FIELD(TargetBitDepthLuma); MFX_COPY_FIELD(TargetBitDepthChroma); MFX_COPY_FIELD(LowDelayBRC); MFX_COPY_FIELD(ScenarioInfo); }); // keep it temporally for backward compability blocks.m_ebCopySupported[MFX_EXTBUFF_AVC_TEMPORAL_LAYERS].emplace_back( [](const mfxExtBuffer* /*pSrc*/, mfxExtBuffer* /*pDst*/) -> void { }); blocks.m_ebCopySupported[MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtTemporalLayers*)pSrc; auto& buf_dst = *(mfxExtTemporalLayers*)pDst; MFX_COPY_FIELD(NumLayers); MFX_COPY_FIELD(Layers); }); blocks.m_ebCopySupported[MFX_EXTBUFF_ENCODER_CAPABILITY].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& buf_src = *(const mfxExtEncoderCapability*)pSrc; auto& buf_dst = *(mfxExtEncoderCapability*)pDst; MFX_COPY_FIELD(MBPerSec); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION].emplace_back( [](const mfxExtBuffer* /* pSrc */, mfxExtBuffer* /* pDst */) -> void { // Teams query this buffer supportness, keeps empty since those fields ignored by AV1 }); blocks.m_ebCopySupported[MFX_EXTBUFF_VP9_PARAM].emplace_back( [](const mfxExtBuffer* /* pSrc */, mfxExtBuffer* /* pDst */) -> void { // Teams query this buffer supportness, keeps empty since those fields ignored by AV1 }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(BRefType); }); blocks.m_ebCopySupported[MFX_EXTBUFF_ENCODER_RESET_OPTION].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtEncoderResetOption*)pSrc; auto& buf_dst = *(mfxExtEncoderResetOption*)pDst; MFX_COPY_FIELD(StartNewSequence); }); blocks.m_ebCopySupported[MFX_EXTBUFF_UNIVERSAL_REFLIST_CTRL].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtRefListCtrl*)pSrc; auto& buf_dst = *(mfxExtRefListCtrl*)pDst; for (mfxU32 i = 0; i < 16; i++) { MFX_COPY_FIELD(RejectedRefList[i].FrameOrder); MFX_COPY_FIELD(LongTermRefList[i].FrameOrder); } }); blocks.m_ebCopySupported[MFX_EXTBUFF_VIDEO_SIGNAL_INFO].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtVideoSignalInfo*)pSrc; auto& buf_dst = *(mfxExtVideoSignalInfo*)pDst; MFX_COPY_FIELD(VideoFormat); MFX_COPY_FIELD(VideoFullRange); MFX_COPY_FIELD(ColourDescriptionPresent); MFX_COPY_FIELD(ColourPrimaries); MFX_COPY_FIELD(TransferCharacteristics); MFX_COPY_FIELD(MatrixCoefficients); }); blocks.m_ebCopySupported[MFX_EXTBUFF_ALLOCATION_HINTS].emplace_back( [](const mfxExtBuffer*, mfxExtBuffer*) -> void { /* Just allow this buffer to be present at Init */ }); } void General::SetInherited(ParamInheritance& par) { par.m_mvpInheritDefault.emplace_back( [](const mfxVideoParam* pSrc, mfxVideoParam* pDst) { auto& parInit = *pSrc; auto& parReset = *pDst; #define INHERIT_OPT(OPT) InheritOption(parInit.OPT, parReset.OPT) #define INHERIT_BRC(OPT) { OPT tmp(parReset.mfx); InheritOption(OPT(parInit.mfx), tmp); } INHERIT_OPT(AsyncDepth); //INHERIT_OPT(mfx.BRCParamMultiplier); INHERIT_OPT(mfx.CodecId); INHERIT_OPT(mfx.CodecProfile); INHERIT_OPT(mfx.CodecLevel); INHERIT_OPT(mfx.NumThread); INHERIT_OPT(mfx.TargetUsage); INHERIT_OPT(mfx.GopPicSize); INHERIT_OPT(mfx.GopRefDist); INHERIT_OPT(mfx.GopOptFlag); INHERIT_OPT(mfx.RateControlMethod); INHERIT_OPT(mfx.BufferSizeInKB); INHERIT_OPT(mfx.NumRefFrame); mfxU16 RC = parInit.mfx.RateControlMethod * (parInit.mfx.RateControlMethod == parReset.mfx.RateControlMethod); static const std::map< mfxU16 , std::function > InheritBrcOpt = { { mfxU16(MFX_RATECONTROL_CBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); } } , { mfxU16(MFX_RATECONTROL_VBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } , { mfxU16(MFX_RATECONTROL_CQP) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.QPI); INHERIT_OPT(mfx.QPP); INHERIT_OPT(mfx.QPB); } } , { mfxU16(MFX_RATECONTROL_ICQ) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.ICQQuality); } } , { mfxU16(MFX_RATECONTROL_LA_ICQ) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.ICQQuality); } } , { mfxU16(MFX_RATECONTROL_VCM) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } , { mfxU16(MFX_RATECONTROL_QVBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } }; auto itInheritBrcOpt = InheritBrcOpt.find(RC); if (itInheritBrcOpt != InheritBrcOpt.end()) itInheritBrcOpt->second(parInit, parReset); INHERIT_OPT(mfx.FrameInfo.FourCC); INHERIT_OPT(mfx.FrameInfo.Width); INHERIT_OPT(mfx.FrameInfo.Height); INHERIT_OPT(mfx.FrameInfo.CropX); INHERIT_OPT(mfx.FrameInfo.CropY); INHERIT_OPT(mfx.FrameInfo.CropW); INHERIT_OPT(mfx.FrameInfo.CropH); INHERIT_OPT(mfx.FrameInfo.FrameRateExtN); INHERIT_OPT(mfx.FrameInfo.FrameRateExtD); INHERIT_OPT(mfx.FrameInfo.AspectRatioW); INHERIT_OPT(mfx.FrameInfo.AspectRatioH); #undef INHERIT_OPT #undef INHERIT_BRC }); #define INIT_EB(TYPE)\ if (!pSrc || !pDst) return;\ auto& ebInit = *(TYPE*)pSrc;\ auto& ebReset = *(TYPE*)pDst; #define INHERIT_OPT(OPT) InheritOption(ebInit.OPT, ebReset.OPT); par.m_ebInheritDefault[MFX_EXTBUFF_AV1_BITSTREAM_PARAM].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtAV1BitstreamParam); INHERIT_OPT(WriteIVFHeaders); }); par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtCodingOption2); INHERIT_OPT(BRefType); }); par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [this](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtCodingOption3); INHERIT_OPT(GPB); for (mfxU32 i = 0; i < 8; i++) { INHERIT_OPT(NumRefActiveP[i]); INHERIT_OPT(NumRefActiveBL0[i]); INHERIT_OPT(NumRefActiveBL1[i]); } INHERIT_OPT(TargetChromaFormatPlus1); INHERIT_OPT(TargetBitDepthLuma); INHERIT_OPT(TargetBitDepthChroma); INHERIT_OPT(LowDelayBRC); INHERIT_OPT(ScenarioInfo); }); #undef INIT_EB #undef INHERIT_OPT } void General::Query0(const FeatureBlocks& blocks, TPushQ0 Push) { using namespace std::placeholders; Push(BLK_Query0, std::bind(&General::CheckQuery0, this, std::cref(blocks), _1)); } void General::Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) { #if defined(MFX_ENABLE_LOG_UTILITY) Push(BLK_SetLogging, [this](const mfxVideoParam&, mfxVideoParam& out, StorageRW&) -> mfxStatus { return MFX_ERR_NONE; }); #endif Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); PushDefaults(defaults); bSet = true; m_pQNCDefaults = &defaults; m_hw = Glob::VideoCore::Get(strg).GetHWType(); return MFX_ERR_NONE; }); Push(BLK_PreCheckCodecId, [&blocks, this](const mfxVideoParam& in, mfxVideoParam&, StorageRW& /*strg*/) -> mfxStatus { return m_pQNCDefaults->PreCheckCodecId(in); }); Push(BLK_PreCheckChromaFormat, [this](const mfxVideoParam& in, mfxVideoParam&, StorageW&) -> mfxStatus { return m_pQNCDefaults->PreCheckChromaFormat(in); }); Push(BLK_PreCheckExtBuffers , [this, &blocks](const mfxVideoParam& in, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckBuffers(blocks, in, &out); }); Push(BLK_CopyConfigurable , [this, &blocks](const mfxVideoParam& in, mfxVideoParam& out, StorageW&) -> mfxStatus { return CopyConfigurable(blocks, in, out); }); Push(BLK_CheckAndFixLowPower , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& /*strg*/) -> mfxStatus { mfxU32 invalid = 0; invalid += Check (out.mfx.LowPower); if (invalid) { out.mfx.LowPower = MFX_CODINGOPTION_ON; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } SetIf(out.mfx.LowPower, out.mfx.LowPower == MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON); return MFX_ERR_NONE; }); } mfxStatus General::MapLevel(mfxVideoParam& par) { MFX_CHECK(par.mfx.CodecLevel, MFX_ERR_NONE); mfxU32 changed = 0; // Map undefined level to defined level changed += MapToDefinedLevel(par.mfx.CodecLevel); MFX_CHECK(!changed, MFX_WRN_VIDEO_PARAM_CHANGED); return MFX_ERR_NONE; } inline mfxStatus CheckPicStruct(mfxVideoParam & par) { mfxU32 invalid = 0; invalid += CheckOrZero(par.mfx.FrameInfo.PicStruct, mfxU16(MFX_PICSTRUCT_PROGRESSIVE), mfxU16(0)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } inline mfxStatus CheckProtected(mfxVideoParam& par) { mfxU32 invalid = 0; invalid += CheckOrZero(par.Protected, mfxU16(0)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } inline mfxStatus CheckEncodedOrder(mfxVideoParam& par) { mfxU32 invalid = 0; invalid += CheckOrZero(par.mfx.EncodedOrder, mfxU16(0)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } void General::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckFormat , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { m_pQWCDefaults.reset( new Defaults::Param( out , Glob::EncodeCaps::Get(strg) , Glob::Defaults::Get(strg))); auto sts = m_pQWCDefaults->base.CheckFourCC(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckInputFormatByFourCC(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckTargetChromaFormat(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckTargetBitDepth(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); return m_pQWCDefaults->base.CheckFourCCByTargetFormat(*m_pQWCDefaults, out); }); Push(BLK_CheckLevel , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { mfxStatus stsMap = MapLevel(out); mfxStatus stsCheckValid = m_pQWCDefaults->base.CheckLevel(*m_pQWCDefaults, out); // invalid level error code should override mapped level error code MFX_CHECK_STS(stsCheckValid); MFX_CHECK_STS(stsMap); return MFX_ERR_NONE; }); Push(BLK_CheckPicStruct , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckPicStruct(out); }); Push(BLK_CheckSurfSize , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckSurfSize(*m_pQWCDefaults, out); }); Push(BLK_CheckCodedPicSize , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckCodedPicSize(out, *m_pQWCDefaults); }); Push(BLK_CheckTU , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckTU(out, m_pQWCDefaults->caps); }); Push(BLK_CheckDeltaQ , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckDeltaQ(out); }); Push(BLK_CheckFrameOBU , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { const auto& caps = Glob::EncodeCaps::Get(strg); return CheckFrameOBU(out, caps); }); Push(BLK_CheckOrderHint , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { const auto& caps = Glob::EncodeCaps::Get(strg); return CheckOrderHint(out, caps); }); Push(BLK_CheckOrderHintBits , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckOrderHintBits(out); }); Push(BLK_CheckCDEF , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { const auto& caps = Glob::EncodeCaps::Get(strg); return CheckCDEF(out, caps); }); Push(BLK_CheckTemporalLayers , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckTemporalLayers(out); }); Push(BLK_CheckStillPicture , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckStillPicture(out); }); Push(BLK_CheckGopRefDist , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckGopRefDist(out, *m_pQWCDefaults); }); Push(BLK_CheckGPB , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckGPB(out); }); Push(BLK_CheckColorConfig , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckColorConfig(out); }); Push(BLK_CheckNumRefFrame , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckNumRefFrame(out, *m_pQWCDefaults); }); Push(BLK_CheckIOPattern , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckIOPattern(out); }); Push(BLK_CheckProtected , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckProtected(out); }); Push(BLK_CheckRateControl , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckRateControl(out, *m_pQWCDefaults); }); Push(BLK_CheckCrops , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckCrops(out, *m_pQWCDefaults); }); Push(BLK_CheckShift , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckShift(out); }); Push(BLK_CheckFrameRate , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckFrameRate(out); }); Push(BLK_CheckProfile , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckProfile(*m_pQWCDefaults, out); }); Push(BLK_CheckEncodedOrder , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckEncodedOrder(out); }); Push(BLK_CheckLevelConstraints , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckLevelConstraints(out, *m_pQWCDefaults); }); Push(BLK_CheckTCBRC ,[this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { const auto& caps = Glob::EncodeCaps::Get(strg); return CheckTCBRC(out, caps); }); } static mfxStatus RunQuery1NoCapsQueue(const FeatureBlocks& blocks, const mfxVideoParam& in, StorageRW& strg) { mfxStatus sts = MFX_ERR_NONE; auto pPar = make_storable>(in); auto& par = *pPar; const auto& query = FeatureBlocks::BQ::Get(blocks); sts = RunBlocks(CheckGE, query, in, par, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); strg.Insert(Glob::VideoParam::Key, std::move(pPar)); return sts; } static mfxStatus RunSetDefaultsQueue(const FeatureBlocks& blocks, StorageRW& strg, StorageRW& local) { auto& par = Glob::VideoParam::Get(strg); Glob::EncodeCaps::GetOrConstruct(strg); auto& qSD = FeatureBlocks::BQ::Get(blocks); return RunBlocks(IgnoreSts, qSD, par, strg, local); }; static mfxStatus RunQuery1WithCapsQueue(const FeatureBlocks& blocks, const mfxVideoParam& in, StorageRW& strg) { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); auto& queryWC = FeatureBlocks::BQ::Get(blocks); sts = RunBlocks(CheckGE, queryWC, in, par, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return sts; }; static mfxStatus SetUnalignedDefaults(mfxVideoParam& par) { /* * VPL and encoder default values are different * And writing IVF headers is enabled in encoder when mfxExtAV1BitstreamParam is attached and its value is ON or zero. * But writing IVF headers is disabled by default in encoder when mfxExtAV1BitstreamParam is not attached. */ mfxExtAV1BitstreamParam* pBsPar = ExtBuffer::Get(par); if (pBsPar != nullptr) { SetDefault(pBsPar->WriteIVFHeaders, MFX_CODINGOPTION_ON); } return MFX_ERR_NONE; } void General::QueryIOSurf(const FeatureBlocks& blocks, TPushQIS Push) { Push(BLK_Query1NoCaps , [this, &blocks](const mfxVideoParam& in, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { mfxStatus sts = RunQuery1NoCapsQueue(blocks, in, strg); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return MFX_ERR_NONE; }); Push(BLK_SetUnalignedDefaults , [this, &blocks](const mfxVideoParam&, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); return SetUnalignedDefaults(par); }); Push(BLK_SetDefaults , [this, &blocks](const mfxVideoParam&, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { StorageRW local; return RunSetDefaultsQueue(blocks, strg, local); }); Push(BLK_Query1WithCaps , [this, &blocks](const mfxVideoParam& in, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { mfxStatus sts = RunQuery1WithCapsQueue(blocks, in, strg); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return MFX_ERR_NONE; }); Push(BLK_SetFrameAllocRequest , [this, &blocks](const mfxVideoParam&, mfxFrameAllocRequest& req, StorageRW& strg) -> mfxStatus { ExtBuffer::Param& par = Glob::VideoParam::Get(strg); auto fourCC = par.mfx.FrameInfo.FourCC; req.Info = par.mfx.FrameInfo; SetDefault(req.Info.Shift, (fourCC == MFX_FOURCC_P010 || fourCC == MFX_FOURCC_Y210)); bool bSYS = par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY; bool bVID = par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY; req.Type = bSYS * (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME) + bVID * (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME); MFX_CHECK(req.Type, MFX_ERR_INVALID_VIDEO_PARAM); req.NumFrameMin = GetMaxRaw(par); req.NumFrameSuggested = req.NumFrameMin; return MFX_ERR_NONE; }); } void General::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& par, StorageW& strg, StorageRW&) { auto& core = Glob::VideoCore::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); auto& defchain = Glob::Defaults::Get(strg); SetDefaults(par, Defaults::Param(par, caps, defchain), core.IsExternalFrameAllocator()); }); } void General::InitExternal(const FeatureBlocks& blocks, TPushIE Push) { Push(BLK_Query1NoCaps , [this, &blocks](const mfxVideoParam& in, StorageRW& strg, StorageRW&) -> mfxStatus { return RunQuery1NoCapsQueue(blocks, in, strg); }); Push(BLK_SetUnalignedDefaults , [this, &blocks](const mfxVideoParam&, StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); return SetUnalignedDefaults(par); }); Push(BLK_AttachMissingBuffers , [this, &blocks](const mfxVideoParam&, StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); for (auto& eb : blocks.m_ebCopySupported) par.NewEB(eb.first, false); par.NewEB(MFX_EXTBUFF_AV1_AUXDATA, false); return MFX_ERR_NONE; }); Push(BLK_SetDefaults , [this, &blocks](const mfxVideoParam&, StorageRW& strg, StorageRW& local) -> mfxStatus { return RunSetDefaultsQueue(blocks, strg, local); }); Push(BLK_Query1WithCaps , [this, &blocks](const mfxVideoParam& in, StorageRW& strg, StorageRW&) -> mfxStatus { return RunQuery1WithCapsQueue(blocks, in, strg); }); } void General::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetReorder , [this](StorageRW& strg, StorageRW&) -> mfxStatus { using namespace std::placeholders; auto& par = Glob::VideoParam::Get(strg); auto pReorderer = make_storable(); pReorderer->Push( [&](Reorderer::TExt, TTaskIt begin, TTaskIt end, bool bFlush) { return ReorderWrap(par, begin, end, bFlush); }); pReorderer->BufferSize = par.mfx.GopRefDist > 1 ? par.mfx.GopRefDist - 1 : 0; //pReorderer->DPB = &m_prevTask.DPB.After; strg.Insert(Glob::Reorder::Key, std::move(pReorderer)); return MFX_ERR_NONE; }); Push(BLK_SetRepeat , [this](StorageRW& strg, StorageRW&) -> mfxStatus { strg.Insert(Glob::FramesToShowInfo::Key, make_storable()); strg.Insert(Glob::RepeatFrameSizeInfo::Key, make_storable()); return MFX_ERR_NONE; }); Push(BLK_SetSH , [this](StorageRW& strg, StorageRW&) -> mfxStatus { if (!strg.Contains(Glob::SH::Key)) { auto pSH = make_storable(); SetSH( Glob::VideoParam::Get(strg) , Glob::VideoCore::Get(strg).GetHWType() , Glob::EncodeCaps::Get(strg) , *pSH); strg.Insert(Glob::SH::Key, std::move(pSH)); } return MFX_ERR_NONE; }); Push(BLK_SetFH , [this](StorageRW& strg, StorageRW&) -> mfxStatus { if (!strg.Contains(Glob::FH::Key)) { std::unique_ptr> pFH(new MakeStorable); SetFH( Glob::VideoParam::Get(strg) , Glob::VideoCore::Get(strg).GetHWType() , Glob::SH::Get(strg) , *pFH); strg.Insert(Glob::FH::Key, std::move(pFH)); } return MFX_ERR_NONE; }); Push(BLK_SetRecInfo , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); mfxFrameAllocRequest rec = {}, raw = {}; const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); if (GetRecInfo(par, CO3, Glob::VideoCore::Get(strg).GetHWType(), rec.Info)) { auto& recInfo = Tmp::RecInfo::GetOrConstruct(local, rec); SetDefault(recInfo.NumFrameMin, GetMaxRec(strg, par)); } raw.Info = par.mfx.FrameInfo; auto& rawInfo = Tmp::RawInfo::GetOrConstruct(local, raw); SetDefault(rawInfo.NumFrameMin, GetMaxRaw(par)); SetDefault(rawInfo.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME)); return MFX_ERR_NONE; }); } void General::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_AllocRaw , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); auto& rawInfo = Tmp::RawInfo::Get(local); auto AllocRaw = [&](mfxU16 NumFrameMin) { std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); mfxFrameAllocRequest req = rawInfo; req.NumFrameMin = NumFrameMin; sts = pAlloc->Alloc(req, true); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocRaw::Key, std::move(pAlloc)); return MFX_ERR_NONE; }; if (par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { sts = AllocRaw(rawInfo.NumFrameMin); MFX_CHECK_STS(sts); } return sts; }); Push(BLK_AllocRec , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); MFX_CHECK(local.Contains(Tmp::RecInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& req = Tmp::RecInfo::Get(local); SetDefault(req.NumFrameMin, GetMaxRec(strg, par)); SetDefault(req.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET)); sts = pAlloc->Alloc(req, false); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocRec::Key, std::move(pAlloc)); return sts; }); Push(BLK_AllocBS , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); MFX_CHECK(local.Contains(Tmp::BSAllocInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& req = Tmp::BSAllocInfo::Get(local); SetDefault(req.NumFrameMin, GetMaxBS(strg, par)); SetDefault(req.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME)); mfxU32 minBS = GetMinBsSize(par, ExtBuffer::Get(par), ExtBuffer::Get(par)); if (mfxU32(req.Info.Width * req.Info.Height) < minBS) { MFX_CHECK(req.Info.Width != 0, MFX_ERR_UNDEFINED_BEHAVIOR); req.Info.Height = (mfxU16)mfx::CeilDiv(minBS, req.Info.Width); } sts = pAlloc->Alloc(req, false); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocBS::Key, std::move(pAlloc)); return sts; }); } void General::Reset(const FeatureBlocks& blocks, TPushR Push) { Push(BLK_ResetInit , [this, &blocks]( const mfxVideoParam& par , StorageRW& global , StorageRW& local) -> mfxStatus { mfxStatus wrn = MFX_ERR_NONE; auto& init = Glob::RealState::Get(global); auto pParNew = make_storable>(par); ExtBuffer::Param& parNew = *pParNew; auto& parOld = Glob::VideoParam::Get(init); global.Insert(Glob::ResetHint::Key, make_storable(ResetHint{})); auto& hint = Glob::ResetHint::Get(global); const mfxExtEncoderResetOption* pResetOpt = ExtBuffer::Get(par); hint.Flags = RF_IDR_REQUIRED * (pResetOpt && IsOn(pResetOpt->StartNewSequence)); std::for_each(std::begin(blocks.m_ebCopySupported) , std::end(blocks.m_ebCopySupported) , [&](decltype(*std::begin(blocks.m_ebCopySupported)) eb) { parNew.NewEB(eb.first, false); }); std::for_each(std::begin(blocks.m_mvpInheritDefault) , std::end(blocks.m_mvpInheritDefault) , [&](decltype(*std::begin(blocks.m_mvpInheritDefault)) inherit) { inherit(&parOld, &parNew); }); std::for_each(std::begin(blocks.m_ebInheritDefault) , std::end(blocks.m_ebInheritDefault) , [&](decltype(*std::begin(blocks.m_ebInheritDefault)) eb) { auto pEbNew = ExtBuffer::Get(parNew, eb.first); auto pEbOld = ExtBuffer::Get(parOld, eb.first); MFX_CHECK(pEbNew && pEbOld, MFX_ERR_NONE); std::for_each(std::begin(eb.second) , std::end(eb.second) , [&](decltype(*std::begin(eb.second)) inherit) { inherit(parOld, pEbOld, parNew, pEbNew); }); return MFX_ERR_NONE; }); auto& qInitExternal = FeatureBlocks::BQ::Get(blocks); auto sts = RunBlocks(CheckGE, qInitExternal, parNew, global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); wrn = sts; auto& qInitInternal = FeatureBlocks::BQ::Get(blocks); sts = RunBlocks(CheckGE, qInitInternal, global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return GetWorstSts(sts, wrn); }); Push(BLK_ResetCheck , [this, &blocks]( const mfxVideoParam& par , StorageRW& global , StorageRW& local) -> mfxStatus { auto& init = Glob::RealState::Get(global); auto& parOld = Glob::VideoParam::Get(init); auto& parNew = Glob::VideoParam::Get(global); auto& hint = Glob::ResetHint::Get(global); auto defOld = GetRTDefaults(init); auto defNew = GetRTDefaults(global); MFX_CHECK(parOld.AsyncDepth == parNew.AsyncDepth, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.GopRefDist >= parNew.mfx.GopRefDist, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.NumRefFrame >= parNew.mfx.NumRefFrame, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.RateControlMethod == parNew.mfx.RateControlMethod, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.FrameInfo.ChromaFormat == parNew.mfx.FrameInfo.ChromaFormat, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.IOPattern == parNew.IOPattern, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(local.Contains(Tmp::RecInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto recOld = Glob::AllocRec::Get(init).GetInfo(); auto& recNew = Tmp::RecInfo::Get(local).Info; MFX_CHECK(recOld.Width >= recNew.Width, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(recOld.Height >= recNew.Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(recOld.FourCC == recNew.FourCC, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK( !( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) || ((mfxU32)InitialDelayInKB(parOld.mfx) == (mfxU32)InitialDelayInKB(parNew.mfx) && (mfxU32)BufferSizeInKB(parOld.mfx) == (mfxU32)BufferSizeInKB(parNew.mfx)) , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); auto& sh = Glob::SH::Get(global); bool isSpsChanged = false; isSpsChanged = (parOld.mfx.FrameInfo.FrameRateExtN != parNew.mfx.FrameInfo.FrameRateExtN && sh.timing_info_present_flag == 1) || (parOld.mfx.FrameInfo.FrameRateExtD != parNew.mfx.FrameInfo.FrameRateExtD && sh.timing_info_present_flag == 1) || parOld.mfx.FrameInfo.Height != parNew.mfx.FrameInfo.Height || parOld.mfx.FrameInfo.Width != parNew.mfx.FrameInfo.Width || parOld.mfx.CodecLevel != parNew.mfx.CodecLevel; hint.Flags |= RF_SPS_CHANGED * isSpsChanged; bool isIdrRequired = false; const auto numTlOld = defOld.base.GetNumTemporalLayers(defOld); const auto numTlNew = defNew.base.GetNumTemporalLayers(defNew); isIdrRequired = (hint.Flags & RF_SPS_CHANGED) || (hint.Flags & RF_IDR_REQUIRED) || (numTlOld != numTlNew) || parOld.mfx.GopPicSize != parNew.mfx.GopPicSize; hint.Flags |= RF_IDR_REQUIRED * isIdrRequired; const mfxExtEncoderResetOption* pResetOpt = ExtBuffer::Get(par); MFX_CHECK(!isIdrRequired || !(pResetOpt && IsOff(pResetOpt->StartNewSequence)) , MFX_ERR_INVALID_VIDEO_PARAM); // Reset can't change parameters w/o IDR. Report an error const mfxExtCodingOption3& CO3 = ExtBuffer::Get(parNew); bool brcReset = ( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && ( ((mfxU32)TargetKbps(parOld.mfx) != (mfxU32)TargetKbps(parNew.mfx) && !IsOn(CO3.LowDelayBRC)) || (mfxU32)BufferSizeInKB(parOld.mfx) != (mfxU32)BufferSizeInKB(parNew.mfx) || (mfxU32)InitialDelayInKB(parOld.mfx) != (mfxU32)InitialDelayInKB(parNew.mfx) || parOld.mfx.FrameInfo.FrameRateExtN != parNew.mfx.FrameInfo.FrameRateExtN || parOld.mfx.FrameInfo.FrameRateExtD != parNew.mfx.FrameInfo.FrameRateExtD); brcReset |= ( parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && ((mfxU32)MaxKbps(parOld.mfx) != (mfxU32)MaxKbps(parNew.mfx)); hint.Flags |= RF_BRC_RESET * (brcReset || isIdrRequired); return MFX_ERR_NONE; }); } void General::ResetState(const FeatureBlocks& blocks, TPushRS Push) { Push(BLK_ResetState , [this, &blocks]( StorageRW& global , StorageRW&) -> mfxStatus { auto& real = Glob::RealState::Get(global); auto& parInt = Glob::VideoParam::Get(real); auto& parNew = Glob::VideoParam::Get(global); auto& hint = Glob::ResetHint::Get(global); CopyConfigurable(blocks, parNew, parInt); Glob::SH::Get(real) = Glob::SH::Get(global); Glob::FH::Get(real) = Glob::FH::Get(global); MFX_CHECK(hint.Flags & RF_IDR_REQUIRED, MFX_ERR_NONE); // Need to call ResetState before UnlockAll surfaces, as DBP releaser will try to unlock surface in ResetState ResetState(); return MFX_ERR_NONE; }); } void General::FrameSubmit(const FeatureBlocks& blocks, TPushFS Push) { Push(BLK_CheckSurf , [this, &blocks]( const mfxEncodeCtrl* /*pCtrl*/ , const mfxFrameSurface1* pSurf , mfxBitstream& /*bs*/ , StorageW& global , StorageRW& /*local*/) -> mfxStatus { MFX_CHECK(pSurf, MFX_ERR_NONE); auto& par = Glob::VideoParam::Get(global); MFX_CHECK(LumaIsNull(pSurf) == (pSurf->Data.UV == 0), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(pSurf->Info.Width >= par.mfx.FrameInfo.Width, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(pSurf->Info.Height >= par.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; }); Push(BLK_CheckBS , [this, &blocks]( const mfxEncodeCtrl* /*pCtrl*/ , const mfxFrameSurface1* /*pSurf*/ , mfxBitstream& bs , StorageW& global , StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); BsDataInfo bsData = {}; bsData.Data = bs.Data; bsData.DataLength = bs.DataLength; bsData.DataOffset = bs.DataOffset; bsData.MaxLength = bs.MaxLength; if (local.Contains(Tmp::BsDataInfo::Key)) bsData = Tmp::BsDataInfo::Get(local); MFX_CHECK(bsData.DataOffset <= bsData.MaxLength, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(bsData.DataOffset + bsData.DataLength + BufferSizeInKB(par.mfx) * 1000u <= bsData.MaxLength, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK_NULL_PTR1(bsData.Data); return MFX_ERR_NONE; }); } void General::AllocTask(const FeatureBlocks& blocks, TPushAT Push) { Push(BLK_AllocTask , [this, &blocks]( StorageR& /*global*/ , StorageRW& task) -> mfxStatus { task.Insert(Task::Common::Key, new Task::Common::TRef); task.Insert(Task::FH::Key, new MakeStorable); return MFX_ERR_NONE; }); } static bool CheckRefListCtrl(mfxExtRefListCtrl* refListCtrl) { mfxU32 changed = 0; changed += CheckOrZero(refListCtrl->ApplyLongTermIdx, 0); changed += CheckOrZero(refListCtrl->NumRefIdxL0Active, 0); changed += CheckOrZero(refListCtrl->NumRefIdxL1Active, 0); for (auto& preferred : refListCtrl->PreferredRefList) { if (preferred.FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN)) { preferred.FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); changed++; } } return changed; } void General::InitTask(const FeatureBlocks& blocks, TPushIT Push) { Push(BLK_InitTask , [this, &blocks]( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& global , StorageW& task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& core = Glob::VideoCore::Get(global); auto& tpar = Task::Common::Get(task); auto stage = tpar.stage; tpar = TaskCommonPar(); tpar.stage = stage; tpar.pBsOut = pBs; MFX_CHECK(pSurf, MFX_ERR_NONE); tpar.DisplayOrder = m_frameOrder; ++m_frameOrder; tpar.pSurfIn = pSurf; bool changed = 0; if (pCtrl) { tpar.ctrl = *pCtrl; if(pCtrl->NumExtParam) { mfxExtBuffer** tEB = new mfxExtBuffer*[pCtrl->NumExtParam]; for(mfxU32 i = 0;i < pCtrl->NumExtParam;i++) { tEB[i] = (mfxExtBuffer*) new mfxU8[pCtrl->ExtParam[i]->BufferSz]; memcpy(tEB[i], pCtrl->ExtParam[i], pCtrl->ExtParam[i]->BufferSz); } tpar.ctrl.ExtParam = tEB; } else tpar.ctrl.ExtParam = nullptr; if (mfxExtRefListCtrl* refListCtrl = ExtBuffer::Get(tpar.ctrl)) changed = CheckRefListCtrl(refListCtrl); } tpar.pSurfReal = tpar.pSurfIn; core.IncreaseReference(*tpar.pSurfIn); tpar.DPB.resize(par.mfx.NumRefFrame); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; }); } void General::PreReorderTask(const FeatureBlocks& blocks, TPushPreRT Push) { Push(BLK_PrepareTask , [this, &blocks]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); auto dflts = GetRTDefaults(global); auto sts = dflts.base.GetPreReorderInfo( dflts, task, task.pSurfIn, &task.ctrl, m_lastKeyFrame, task.DisplayOrder, task.GopHints); MFX_CHECK_STS(sts); SetIf(m_lastKeyFrame, IsI(task.FrameType), task.DisplayOrder); return MFX_ERR_NONE; }); } inline bool IsLossless(FH& fh) { return (fh.quantization_params.base_q_idx == 0 && fh.quantization_params.DeltaQYDc == 0 && fh.quantization_params.DeltaQUAc == 0 && fh.quantization_params.DeltaQUDc == 0 && fh.quantization_params.DeltaQVAc == 0 && fh.quantization_params.DeltaQVDc == 0); } inline void SetTaskFramesToShow(TaskCommonPar& task, TFramesToShowInfo& info) { if (IsHiddenFrame(task)) { info.insert(task.DisplayOrder); } const mfxU32 nextDisplayOrder = task.DisplayOrder + 1; if (info.find(nextDisplayOrder) == info.end()) return; for (mfxU8 refIdx = 0; refIdx < task.DPB.size(); refIdx++) { if (task.RefreshFrameFlags[refIdx] == 1) continue; auto& refFrm = task.DPB.at(refIdx); if (refFrm->DisplayOrder != nextDisplayOrder) continue; RepeatedFrameInfo repfrm; repfrm.FrameToShowMapIdx = refIdx; repfrm.DisplayOrder = refFrm->DisplayOrder; task.FramesToShow.push_back(std::move(repfrm)); info.erase(nextDisplayOrder); return; } } inline void SetTaskRepeatedFramesSize(TaskCommonPar& task, TRepeatFrameSizeInfo& info) { const mfxU32 prevEncodedOrder = task.EncodedOrder - 1; if (info.find(prevEncodedOrder) == info.end()) return; if (info[prevEncodedOrder] != 0) { task.RepeatedFrameBytes = mfxU8(info[prevEncodedOrder]); info.erase(prevEncodedOrder); } } void General::PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) { Push(BLK_ConfigureTask , [this, &blocks]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); if (global.Contains(Glob::AllocRaw::Key)) { task.Raw = Glob::AllocRaw::Get(global).Acquire(); MFX_CHECK(task.Raw.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); } auto& recPool = Glob::AllocRec::Get(global); task.Rec = recPool.Acquire(); task.BS = Glob::AllocBS::Get(global).Acquire(); MFX_CHECK(task.BS.Idx != IDX_INVALID, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(task.Rec.Idx != IDX_INVALID, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(task.Rec.Mid && task.BS.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); auto& fh = Glob::FH::Get(global); auto def = GetRTDefaults(global); ConfigureTask(task, def, recPool); auto& framesToShowInfo = Glob::FramesToShowInfo::Get(global); SetTaskFramesToShow(task, framesToShowInfo); auto& repeatFrameSizeInfo = Glob::RepeatFrameSizeInfo::Get(global); SetTaskRepeatedFramesSize(task, repeatFrameSizeInfo); auto& sh = Glob::SH::Get(global); auto sts = GetCurrentFrameHeader(task, def, sh, fh, Task::FH::Get(s_task)); MFX_CHECK_STS(sts); return sts; }); } void General::SubmitTask(const FeatureBlocks& blocks, TPushST Push) { Push(BLK_GetRawHDL , [this, &blocks]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& core = Glob::VideoCore::Get(global); auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); bool bInternalFrame = par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || task.bSkip; MFX_CHECK(!bInternalFrame, core.GetFrameHDL(task.Raw.Mid, &task.HDLRaw.first)); MFX_CHECK(par.IOPattern != MFX_IOPATTERN_IN_VIDEO_MEMORY , core.GetExternalFrameHDL(*task.pSurfReal, task.HDLRaw)); return core.GetFrameHDL(task.pSurfReal->Data.MemId, &task.HDLRaw.first); }); Push(BLK_CopySysToRaw , [this, &blocks]( StorageW& global , StorageW& s_task)->mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); MFX_CHECK( !(task.bSkip || par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) , MFX_ERR_NONE); auto& core = Glob::VideoCore::Get(global); mfxFrameSurface1 surfSrc = MakeSurface(par.mfx.FrameInfo, *task.pSurfReal); mfxFrameSurface1 surfDst = MakeSurface(par.mfx.FrameInfo, task.Raw.Mid); surfDst.Info.Shift = surfDst.Info.FourCC == MFX_FOURCC_P010 || surfDst.Info.FourCC == MFX_FOURCC_Y210; // convert to native shift in core.CopyFrame() if required return core.DoFastCopyWrapper( &surfDst , MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE , &surfSrc , MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_SYSTEM_MEMORY); }); } void General::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_CopyBS , [this](StorageW& global, StorageW& s_task) -> mfxStatus { PERF_UTILITY_AUTO("BLK_CopyBS", PERF_LEVEL_INTERNAL); auto& task = Task::Common::Get(s_task); if (!task.pBsData) { auto& bs = *task.pBsOut; task.pBsData = bs.Data + bs.DataOffset + bs.DataLength; task.pBsDataLength = &bs.DataLength; task.BsBytesAvailable = bs.MaxLength - bs.DataOffset - bs.DataLength; } if (task.pSurfIn) { task.TimestampIn = task.pSurfIn->Data.TimeStamp; task.PicStructIn = task.pSurfIn->Info.PicStruct; task.FrameOrderIn = task.pSurfIn->Data.FrameOrder; } mfxStatus sts = MFX_ERR_NONE; auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto& tm = taskMgrIface.m_Manager; bool bNeedCacheFrame = task.BsDataLength > 0 && (IsHiddenFrame(task) || task.DisplayOrder != m_temporalUnitOrder); if (bNeedCacheFrame) { FrameLocker codedFrame(Glob::VideoCore::Get(global), task.BS.Mid); MFX_CHECK(codedFrame.Y, MFX_ERR_LOCK_MEMORY); MfxEncodeHW::CachedBitstream cachedBs(task.BsDataLength); sts = FastCopy::Copy( cachedBs.Data->data() , task.BsDataLength , codedFrame.Y , codedFrame.Pitch , { int(task.BsDataLength), 1 } , COPY_VIDEO_TO_SYS); cachedBs.isHiden = IsHiddenFrame(task); cachedBs.DisplayOrder = task.DisplayOrder; tm.PushBitstream(m_temporalUnitOrder, std::move(cachedBs)); // Dont output hidden frame immediately task.BsDataLength = 0; } bool bNeedOutputFrame = (task.DisplayOrder == m_temporalUnitOrder) && ((!IsHiddenFrame(task) && task.BsDataLength > 0) || tm.IsCacheReady(m_temporalUnitOrder)); if (bNeedOutputFrame) { mfxU32 cacheSize = tm.PeekCachedSize(m_temporalUnitOrder); MFX_CHECK(task.BsBytesAvailable >= task.BsDataLength + cacheSize, MFX_ERR_NOT_ENOUGH_BUFFER); mfxU32 offset = 0; if (cacheSize > 0) { auto& bss = tm.GetBitstreams(m_temporalUnitOrder); for (auto& bs : bss) { std::copy_n(bs.Data->data(), bs.BsDataLength, task.pBsData + offset); offset += bs.BsDataLength; } tm.ClearBitstreams(m_temporalUnitOrder); } if (task.BsDataLength) { FrameLocker codedFrame(Glob::VideoCore::Get(global), task.BS.Mid); MFX_CHECK(codedFrame.Y, MFX_ERR_LOCK_MEMORY); sts = FastCopy::Copy( task.pBsData + offset , task.BsDataLength , codedFrame.Y , codedFrame.Pitch , { int(task.BsDataLength), 1 } , COPY_VIDEO_TO_SYS); } task.BsDataLength += cacheSize; task.pBsOut->TimeStamp = task.pSurfIn ? task.pSurfIn->Data.TimeStamp : 0; task.BsBytesAvailable -= task.BsDataLength; *task.pBsDataLength += task.BsDataLength; } MFX_CHECK_STS(sts); if (task.BsDataLength == 0) { task.pBsData = nullptr; task.pBsDataLength = nullptr; task.BsBytesAvailable = 0; task.SkipCMD &= ~SKIPCMD_NeedDriverCall; return MFX_TASK_WORKING; } else { ++m_temporalUnitOrder; } return MFX_ERR_NONE; }); Push(BLK_UpdateBsInfo , [this](StorageW& /*global*/, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); MFX_CHECK(task.BsDataLength > 0, MFX_ERR_NONE); auto& bs = *task.pBsOut; bs.TimeStamp = task.TimestampIn; bs.DecodeTimeStamp = task.TimestampIn; bs.PicStruct = task.PicStructIn; bs.FrameType = task.FrameType; bs.FrameType &= ~(task.isLDB * MFX_FRAMETYPE_B); bs.FrameType |= task.isLDB * MFX_FRAMETYPE_P; return MFX_ERR_NONE; }); } inline bool ReleaseResource(IAllocation& a, Resource& r) { if (r.Mid) { a.Release(r.Idx); r = Resource(); return true; } return r.Idx == IDX_INVALID; } void General::FreeTask(const FeatureBlocks& /*blocks*/, TPushFT Push) { Push(BLK_FreeTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); auto& core = Glob::VideoCore::Get(global); ThrowAssert( !ReleaseResource(Glob::AllocBS::Get(global), task.BS) , "task.BS resource is invalid"); ThrowAssert( global.Contains(Glob::AllocRaw::Key) && !ReleaseResource(Glob::AllocRaw::Get(global), task.Raw) , "task.Raw resource is invalid"); SetIf(task.pSurfIn, task.pSurfIn && !core.DecreaseReference(*task.pSurfIn), nullptr); ThrowAssert(!!task.pSurfIn, "failed in core.DecreaseReference"); // In the future the logic might be changed to release recon based on refresh_frame_flag auto& atrRec = Glob::AllocRec::Get(global); ThrowAssert( !IsRef(task.FrameType) && !ReleaseResource(atrRec, task.Rec) , "task.Rec resource is invalid"); task.DPB.clear(); for(mfxU32 i = 0;i < task.ctrl.NumExtParam;i++) delete[] task.ctrl.ExtParam[i]; if(task.ctrl.NumExtParam) delete[] task.ctrl.ExtParam; return MFX_ERR_NONE; }); } void General::GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) { Push(BLK_CopyConfigurable , [this, &blocks](mfxVideoParam& out, StorageR& global) -> mfxStatus { return CopyConfigurable(blocks, Glob::VideoParam::Get(global), out); }); Push(BLK_FixParam , [this, &blocks](mfxVideoParam& out, StorageR& global) -> mfxStatus { out.mfx.LowPower = MFX_CODINGOPTION_ON; if (HaveRABFrames(out)) { auto defPar = GetRTDefaults(global); const mfxU32 numCacheFrames = (defPar.base.GetBRefType(defPar) != MFX_B_REF_PYRAMID) ? mfxU32(2) : mfxU32(defPar.base.GetNumBPyramidLayers(defPar)) + 1; BufferSizeInKB(out.mfx) = BufferSizeInKB(out.mfx) * numCacheFrames; } return MFX_ERR_NONE; }); } void General::Close(const FeatureBlocks& blocks, TPushCLS Push) { Push(BLK_Close , [this, &blocks]( StorageW& /*global*/) -> mfxStatus { m_prevTask.DPB.clear(); return MFX_ERR_NONE; }); } using DpbIndexes = std::vector; static void RemoveRejected( const DpbType& dpb , DpbIndexes* dpbIndexes) { dpbIndexes->erase( std::remove_if( dpbIndexes->begin() , dpbIndexes->end() , [&dpb](mfxU8 idx) { return dpb[idx]->isRejected; }) , dpbIndexes->end()); } static void FillSortedFwdBwd( const TaskCommonPar& task , DpbIndexes* fwd , DpbIndexes* bwd) { if (!fwd && !bwd) return; using DisplayOrderToDPBIndex = std::map; using Ref = DisplayOrderToDPBIndex::const_reference; auto GetIdx = [](Ref ref) {return ref.second; }; auto IsBwd = [=](Ref ref) {return ref.first > task.DisplayOrderInGOP; }; DisplayOrderToDPBIndex uniqueRefs; for (mfxU8 refIdx = 0; refIdx < task.DPB.size(); refIdx++) { auto& refFrm = task.DPB.at(refIdx); if (refFrm && refFrm->TemporalID <= task.TemporalID) uniqueRefs.insert({ refFrm->DisplayOrderInGOP, refIdx }); } uniqueRefs.erase(task.DisplayOrderInGOP); auto firstBwd = find_if(uniqueRefs.begin(), uniqueRefs.end(), IsBwd); if (fwd) { std::transform(uniqueRefs.begin(), firstBwd, std::back_inserter(*fwd), GetIdx); RemoveRejected(task.DPB, fwd); // if all fwd references are rejected // use ref closest rejected to the current frame if (fwd->empty() && firstBwd != uniqueRefs.begin()) { auto lastFwd = std::prev(firstBwd); fwd->push_back(lastFwd->second); } } if (bwd) { std::transform(firstBwd, uniqueRefs.end(), std::back_inserter(*bwd), GetIdx); RemoveRejected(task.DPB, bwd); // if all bwd references are rejected // use ref closest rejected to the current frame if (bwd->empty() && firstBwd != uniqueRefs.end()) bwd->push_back(firstBwd->second); } // Enctools: Prefer LTR (if any) to be used for P frame if (task.InternalListCtrlPresent) { if ((IsP(task.FrameType)) && (fwd && !fwd->empty())) { DpbIndexes::iterator it = fwd->begin(); int idx = -1; for(it; it != fwd->end(); it++) { auto& refFrm = task.DPB.at(*it); if (refFrm->isLTR) { idx = *it; fwd->erase(it); break; } } if (idx != -1) { fwd->push_back((mfxU8)idx); // Set LTR to be the 2nd preferred ref frame in the list if (fwd->size() > 1) { int lastIdx = (int) fwd->size() - 1; mfxU8 lastRef = (*fwd)[lastIdx]; (*fwd)[lastIdx] = (*fwd)[lastIdx - 1]; (*fwd)[lastIdx-1] = lastRef; } } } } } namespace RefListRules { template using Rules = std::list>; template class SafeIncrement { const Iter curr; const Iter end; public: SafeIncrement(const Iter& _curr, const Iter& _end) : curr(_curr), end(_end) { // the class is not intended to work with reference types assert(!std::is_reference::value); }; Iter operator+(size_t inc) const { const size_t remaining = std::distance(curr, end); const size_t safeInc = std::min(inc, remaining); Iter iter = curr; std::advance(iter, safeInc); return iter; } Iter operator()() const { return curr; } }; template static void CleanRules(Rules& rules, const Iter toRemove, mfxU8 maxRefs) { auto NeedRemove = [&toRemove](const typename Rules::value_type& rule) { return rule.second == toRemove; }; rules.remove_if(NeedRemove); if (rules.size() > maxRefs) rules.resize(maxRefs); } template static void ApplyRules(const Rules& rules, RefListType& refList) { std::array usedDpbSlots = {}; auto ApplyRule = [&](const typename Rules::value_type& rule) { const mfxU8 dpbIdx = *rule.second; if (!usedDpbSlots.at(dpbIdx)) { refList.at(rule.first - LAST_FRAME) = dpbIdx; usedDpbSlots.at(dpbIdx) = 1; } }; for_each(rules.begin(), rules.end(), ApplyRule); } } static void FillFwdPart(const DpbIndexes& fwd, mfxU8 maxFwdRefs, RefListType& refList, bool isLdbFrame= false) { // logic below is same as in original GetRefList implementation (for compatibility reasons) // In the future might consider improvement of this logic // e.g make it closer to logic from "7.8. Set frame refs process" using Iter = DpbIndexes::const_reverse_iterator; const RefListRules::SafeIncrement closestRef{ fwd.crbegin() , fwd.crend() }; RefListRules::Rules constructionRules = {}; if (isLdbFrame) { constructionRules = { {LAST_FRAME, closestRef()}, {LAST2_FRAME, closestRef + 1}, {LAST3_FRAME, closestRef + 2}, }; } else { constructionRules = { {LAST_FRAME, closestRef()}, {GOLDEN_FRAME, closestRef + 1}, {ALTREF_FRAME, closestRef + 2} }; } const mfxU8 maxRefs = std::min(maxFwdRefs, static_cast(fwd.size())); RefListRules::CleanRules(constructionRules, fwd.crend(), maxRefs); RefListRules::ApplyRules(constructionRules, refList); } static void FillRefListP(const DpbIndexes& fwd, mfxU8 maxFwdRefs, RefListType& refList) { assert(!fwd.empty()); FillFwdPart(fwd, maxFwdRefs, refList); } static void FillBwdPart(const DpbIndexes& bwd, mfxU8 maxBwdrefs, RefListType& refList) { using Iter = DpbIndexes::const_iterator; RefListRules::Rules constructionRules = { {BWDREF_FRAME, bwd.cbegin()} }; const mfxU8 maxRefs = std::min(maxBwdrefs, static_cast(bwd.size())); RefListRules::CleanRules(constructionRules, bwd.cend(), maxRefs); RefListRules::ApplyRules(constructionRules, refList); } static void FillRefListRAB( const DpbIndexes& fwd , mfxU8 maxFwdRefs , const DpbIndexes& bwd , mfxU8 maxBwdRefs , RefListType& refList) { assert(!fwd.empty()); assert(!bwd.empty()); FillFwdPart(fwd, maxFwdRefs, refList); FillBwdPart(bwd, maxBwdRefs, refList); } static void FillRefListLDB(const DpbIndexes& fwd, mfxU8 maxFwdRefs, RefListType& refList) { assert(!fwd.empty()); FillFwdPart(fwd, maxFwdRefs, refList, true); refList.at(BWDREF_FRAME - LAST_FRAME) = refList.at(LAST_FRAME - LAST_FRAME); refList.at(ALTREF2_FRAME - LAST_FRAME) = refList.at(LAST2_FRAME - LAST_FRAME); refList.at(ALTREF_FRAME - LAST_FRAME) = refList.at(LAST3_FRAME - LAST_FRAME); } inline std::tuple GetMaxRefs( const TaskCommonPar& task , const mfxVideoParam& par) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const mfxU8 maxFwdRefs = static_cast(IsB(task.FrameType) ? CO3.NumRefActiveBL0[0] : CO3.NumRefActiveP[0]); const mfxU8 maxBwdRefs = static_cast(CO3.NumRefActiveBL1[0]); return std::make_tuple(maxFwdRefs, maxBwdRefs); } inline void SetTaskQp( TaskCommonPar& task , const mfxVideoParam& par) { if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { task.QpY = 128; return; } if (IsB(task.FrameType)) { task.QpY = static_cast(par.mfx.QPB); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const bool bUseQPOffset = IsOn(CO3.EnableQPOffset) && CO2.BRefType == MFX_B_REF_PYRAMID; if (bUseQPOffset) { task.QpY = static_cast(mfx::clamp( CO3.QPOffset[mfx::clamp(task.PyramidLevel - 1, 0, 7)] + task.QpY , AV1_MIN_Q_INDEX, AV1_MAX_Q_INDEX)); } } else if (IsP(task.FrameType)) task.QpY = static_cast(par.mfx.QPP); else { assert(IsI(task.FrameType)); task.QpY = static_cast(par.mfx.QPI); } SetIf(task.QpY, !!task.ctrl.QP, static_cast(task.ctrl.QP)); } inline void SetTaskBRCParams( TaskCommonPar& task , const mfxVideoParam& par) { if(par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) return; const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); task.MinBaseQIndex = auxPar.QP.MinBaseQIndex; task.MaxBaseQIndex = auxPar.QP.MaxBaseQIndex; } inline void SetTaskEncodeOrders( TaskCommonPar& task , const TaskCommonPar& prevTask) { task.EncodedOrder = prevTask.EncodedOrder + 1; if (IsI(task.FrameType)) { task.EncodedOrderInGOP = 0; task.RefOrderInGOP = 0; } else { task.EncodedOrderInGOP = prevTask.EncodedOrderInGOP + 1; task.RefOrderInGOP = IsRef(task.FrameType) ? prevTask.RefOrderInGOP + 1 : prevTask.RefOrderInGOP; } } // task - [in/out] Current task object, task.DPB may be modified // Return - N/A inline void MarkLTR(TaskCommonPar& task) { const mfxExtRefListCtrl* refListCtrl = ExtBuffer::Get(task.ctrl); // If external reflist is not used, check for internal reflist if (!refListCtrl && task.InternalListCtrlPresent) { refListCtrl = &task.InternalListCtrl; } if (!refListCtrl) return; // Count how many unique STR left in DPB so far // We need to keep at least 1 STR decltype(task.DPB) tmpDPB(task.DPB); std::ignore = std::unique(tmpDPB.begin(), tmpDPB.end()); auto numberOfUniqueSTRs = std::count_if( tmpDPB.begin() , tmpDPB.end() , [](const DpbType::value_type& f) { return f && !f->isLTR; }); const auto& ltrList = refListCtrl->LongTermRefList; for (mfxI32 i = 0; i < 16 && numberOfUniqueSTRs > 1; i++) { const mfxU32 ltrFrameOrder = ltrList[i].FrameOrder; if (ltrFrameOrder == static_cast(MFX_FRAMEORDER_UNKNOWN)) continue; auto frameToBecomeLTR = std::find_if( task.DPB.begin() , task.DPB.end() , [ltrFrameOrder](const DpbType::value_type& f) { return f && f->DisplayOrder == ltrFrameOrder; }); if (frameToBecomeLTR != task.DPB.end() && !(*frameToBecomeLTR)->isLTR && !(*frameToBecomeLTR)->isRejected) { (*frameToBecomeLTR)->isLTR = true; numberOfUniqueSTRs--; } } } // task - [in/out] Current task object, task.DPB may be modified // Return - N/A inline void MarkRejected(TaskCommonPar& task) { const mfxExtRefListCtrl* refListCtrl = ExtBuffer::Get(task.ctrl); // If external reflist is not used, check for internal reflist if (!refListCtrl && task.InternalListCtrlPresent) { refListCtrl = &task.InternalListCtrl; } if (!refListCtrl) return; for (const auto& rejected : refListCtrl->RejectedRefList) { const mfxU32 rejectedFrameOrder = rejected.FrameOrder; if (rejectedFrameOrder == static_cast(MFX_FRAMEORDER_UNKNOWN)) continue; // Frame with certain FrameOrder may be included into DPB muliple times and // if it is rejected we need to find all links to it from DPB. // Reference frames are refreshed in the end of encoding // so, here we only can mark rejected ref frames for further removal for (auto &f : task.DPB) if (f && f->DisplayOrder == rejectedFrameOrder) f->isRejected = true; } } inline void InitTaskDPB( TaskCommonPar& task, TaskCommonPar& prevTask) { assert(task.DPB.size() >= prevTask.DPB.size()); std::move(prevTask.DPB.begin(), prevTask.DPB.end(), task.DPB.begin()); MarkRejected(task); } // task - [in/out] Current task object, RefList field will be set in place // par - [in] mfxVideoParam // Return - N/A inline void SetTaskRefList( TaskCommonPar& task , const mfxVideoParam& par) { auto& refList = task.RefList; std::fill_n(refList.begin(), REFS_PER_FRAME, IDX_INVALID); if (IsI(task.FrameType)) return; DpbIndexes fwd; DpbIndexes bwd; FillSortedFwdBwd(task, &fwd, &bwd); mfxU8 maxFwdRefs = 0; mfxU8 maxBwdRefs = 0; std::tie(maxFwdRefs, maxBwdRefs) = GetMaxRefs(task, par); if (IsP(task.FrameType)) { if (task.isLDB) FillRefListLDB(fwd, maxFwdRefs, refList); else FillRefListP(fwd, maxFwdRefs, refList); } else FillRefListRAB(fwd, maxFwdRefs, bwd, maxBwdRefs, refList); } template DPBIter FindOldestSTR(DPBIter dpbBegin, DPBIter dpbEnd, mfxU8 tid) { DPBIter oldestSTR = dpbEnd; for (auto it = dpbBegin; it != dpbEnd; ++it) { if ((*it) && !(*it)->isLTR && (*it)->TemporalID >= tid) { if (oldestSTR == dpbEnd) oldestSTR = it; else if ((*oldestSTR)->DisplayOrder > (*it)->DisplayOrder) oldestSTR = it; } } return oldestSTR; } // task - [in/out] Current task object, RefreshFrameFlags field will be set in place // Return - N/A inline void SetTaskDPBRefresh( TaskCommonPar& task , const mfxVideoParam&) { auto& refreshRefFrames = task.RefreshFrameFlags; if (IsI(task.FrameType)) std::fill(refreshRefFrames.begin(), refreshRefFrames.end(), static_cast(1)); else if (IsRef(task.FrameType)) { // At first find all rejected LTRs to refresh them with current frame mfxU8 refreshed = 0; for (size_t i = 0; i < task.DPB.size(); i++) if (task.DPB[i]->isRejected) refreshed = refreshRefFrames.at(i) = 1; if (!refreshed) { auto dpbBegin = task.DPB.begin(); auto dpbEnd = task.DPB.end(); auto slotToRefresh = dpbEnd; // If no LTR was refreshed, then find duplicate reference frame // Some frames can be included multiple times into DPB for (auto it = dpbBegin + 1; it < dpbEnd && slotToRefresh == dpbEnd; ++it) if (std::find(dpbBegin, it, *it) != it) slotToRefresh = it; // If no duplicates, then find the oldest STR // For temporal scalability frame must not overwrite frames from lower layers if (slotToRefresh == dpbEnd) slotToRefresh = FindOldestSTR(dpbBegin, dpbEnd, task.TemporalID); // If failed, just do not refresh any reference frame. // This should not happend since we maintain at least 1 STR in DPB if (slotToRefresh != dpbEnd) refreshRefFrames.at(slotToRefresh - dpbBegin) = 1; } } } class DpbFrameReleaser { IAllocation& pool; public: DpbFrameReleaser(IAllocation& _pool) : pool(_pool) {}; void operator()(DpbFrame* pFrm) { ReleaseResource(pool, pFrm->Rec); delete pFrm; } }; inline void SetTaskIVFHeaderInsert( TaskCommonPar& task , const TaskCommonPar& prevTask , bool& insertIVFSeq) { if (IsHiddenFrame(prevTask)) return; if (insertIVFSeq) { task.InsertHeaders |= INSERT_IVF_SEQ; insertIVFSeq = false; } task.InsertHeaders |= INSERT_IVF_FRM; } inline void SetTaskTDHeaderInsert( TaskCommonPar& task , const TaskCommonPar& prevTask , const mfxVideoParam& par) { if (IsHiddenFrame(prevTask)) return; const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); if (IsOn(auxPar.InsertTemporalDelimiter)) { task.InsertHeaders |= INSERT_TD; return; } const mfxExtTemporalLayers& TL = ExtBuffer::Get(par); const mfxU16 operPointCntMinus1 = CountTL(TL) - 1; if (operPointCntMinus1) { task.InsertHeaders |= INSERT_TD; } } inline void SetTaskInsertHeaders( TaskCommonPar& task , const TaskCommonPar& prevTask , const mfxVideoParam& par , bool& insertIVFSeq) { const mfxExtAV1BitstreamParam& bsPar = ExtBuffer::Get(par); if (IsOn(bsPar.WriteIVFHeaders)) SetTaskIVFHeaderInsert(task, prevTask, insertIVFSeq); SetTaskTDHeaderInsert(task, prevTask, par); if (IsI(task.FrameType)) task.InsertHeaders |= INSERT_SPS; task.InsertHeaders |= INSERT_PPS; const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); if (IsOn(auxPar.PackOBUFrame)) task.InsertHeaders |= INSERT_FRM_OBU; } inline void SetTaskTCBRC( TaskCommonPar& task , const mfxVideoParam& par) { ThrowAssert(par.mfx.FrameInfo.FrameRateExtD == 0, "FrameRateExtD = 0"); mfxU32 avgFrameSizeInBytes = GetAvgFrameSizeInBytes(par); task.TCBRCTargetFrameSize = avgFrameSizeInBytes; } void General::ConfigureTask( TaskCommonPar& task , const Defaults::Param& dflts , IAllocation& recPool) { task.StatusReportId = std::max(1, m_prevTask.StatusReportId + 1); const auto& par = dflts.mvp; SetTaskQp(task, par); SetTaskBRCParams(task, par); SetTaskEncodeOrders(task, m_prevTask); InitTaskDPB(task, m_prevTask); SetTaskRefList(task, par); SetTaskDPBRefresh(task, par); SetTaskInsertHeaders(task, m_prevTask, par, m_insertIVFSeq); const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3 && IsOn(pCO3->LowDelayBRC) && task.TCBRCTargetFrameSize == 0) { SetTaskTCBRC(task, par); } m_prevTask = task; UpdateDPB(m_prevTask.DPB, reinterpret_cast(task), task.RefreshFrameFlags, DpbFrameReleaser(recPool)); MarkLTR(m_prevTask); } static bool HaveL1(DpbType const & dpb, mfxI32 displayOrderInGOP) { return std::any_of(dpb.begin(), dpb.end(), [displayOrderInGOP](DpbType::const_reference frm) { if (frm) return frm->DisplayOrderInGOP > displayOrderInGOP; else return false; }); } static mfxU32 GetEncodingOrder( mfxU32 displayOrder , mfxU32 begin , mfxU32 end , mfxU32 &level , mfxU32 before , bool & ref) { assert(displayOrder >= begin); assert(displayOrder < end); ref = (end - begin > 1); mfxU32 pivot = (begin + end) / 2; if (displayOrder == pivot) return level + before; level++; if (displayOrder < pivot) return GetEncodingOrder(displayOrder, begin, pivot, level, before, ref); else return GetEncodingOrder(displayOrder, pivot + 1, end, level, before + pivot - begin, ref); } static mfxU32 GetBiFrameLocation(mfxU32 i, mfxU32 num, bool &ref, mfxU32 &level) { ref = false; level = 1; return GetEncodingOrder(i, 0, num, level, 0, ref); } template static T BPyrReorder(T begin, T end) { typedef typename std::iterator_traits::reference TRef; mfxU32 num = mfxU32(std::distance(begin, end)); bool bSetOrder = num && (*begin)->BPyramidOrder == mfxU32(MFX_FRAMEORDER_UNKNOWN); if (bSetOrder) { mfxU32 i = 0; std::for_each(begin, end, [&](TRef bref) { bool bRef = false; bref->BPyramidOrder = GetBiFrameLocation(i++, num, bRef, bref->PyramidLevel); bref->FrameType |= mfxU16(MFX_FRAMETYPE_REF * bRef); }); } return std::min_element(begin, end , [](TRef a, TRef b) { return a->BPyramidOrder < b->BPyramidOrder; }); } template static T Reorder( ExtBuffer::Param const & par , DpbType const & dpb , T begin , T end , bool flush) { typedef typename std::iterator_traits::reference TRef; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const bool isBPyramid = (CO2.BRefType == MFX_B_REF_PYRAMID); T top = begin; T reorderOut = top; std::list brefs; auto IsB = [](TRef f) { return AV1EHW::IsB(f.FrameType); }; auto NoL1 = [&](T& f) { return !HaveL1(dpb, f->DisplayOrderInGOP); }; std::generate_n( std::back_inserter(brefs) , std::distance(begin, std::find_if_not(begin, end, IsB)) , [&]() { return top++; }); brefs.remove_if(NoL1); if (!brefs.empty()) { if (!isBPyramid) { const auto B0POC = brefs.front()->DisplayOrderInGOP; auto it = brefs.begin(); while (it != brefs.end()) { if (IsRef((*it)->FrameType) && ((*it)->DisplayOrderInGOP - B0POC < 2)) break; ++it; } if (it == brefs.end()) it = brefs.begin(); reorderOut = *it; } else { reorderOut = *BPyrReorder(brefs.begin(), brefs.end()); } } else { // optimize end of GOP or end of sequence const bool bForcePRef = flush && top == end && begin != end; if (bForcePRef) { --top; top->FrameType = mfxU16(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); } reorderOut = top; } return reorderOut; } TTaskIt General::ReorderWrap( ExtBuffer::Param const & par , TTaskIt begin , TTaskIt end , bool flush) { typedef TaskItWrap TItWrap; return Reorder(par, m_prevTask.DPB, TItWrap(begin), TItWrap(end), flush).it; } mfxU32 General::GetMinBsSize( const mfxVideoParam & par , const mfxExtAV1ResolutionParam& rsPar , const mfxExtCodingOption3& CO3) { mfxU32 size = rsPar.FrameWidth * rsPar.FrameHeight; SetDefault(size, par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height); bool b10bit = (CO3.TargetBitDepthLuma == 10); bool b422 = (CO3.TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV422 + 1)); bool b444 = (CO3.TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV444 + 1)); mfxF64 k = 2.0 + (b10bit * 0.3) + (b422 * 0.5) + (b444 * 1.5); size = mfxU32(k * size); return size; } bool General::GetRecInfo( const mfxVideoParam& par , const mfxExtCodingOption3& CO3 , eMFXHWType hw , mfxFrameInfo& rec) { static const std::map> ModRec[2] = { { //8b { mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , [](mfxFrameInfo& rec, eMFXHWType) { rec.FourCC = MFX_FOURCC_NV12; } }, { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , [](mfxFrameInfo& rec, eMFXHWType) { rec.FourCC = MFX_FOURCC_AYUV; /* Pitch = 4*W for AYUV format Pitch need to align on 512 So, width aligment is 512/4 = 128 */ rec.Width = mfx::align2_value(rec.Width, 512 / 4); rec.Height = mfx::align2_value(rec.Height * 3 / 4, 8); } } } , { //10b { mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , [](mfxFrameInfo& rec, eMFXHWType) { //P010 rec.FourCC = MFX_FOURCC_NV12; rec.Width = mfx::align2_value(rec.Width, 32) * 2; //This is require by HW and MMC, which is same as TGL. } }, { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , [](mfxFrameInfo& rec, eMFXHWType) { rec.FourCC = MFX_FOURCC_Y410; /* Pitch = 4*W for Y410 format Pitch need to align on 256 So, width aligment is 256/4 = 64 */ rec.Width = mfx::align2_value(rec.Width, 256 / 4); rec.Height = mfx::align2_value(rec.Height * 3 / 2, 8); } } } }; rec = par.mfx.FrameInfo; auto& rModRec = ModRec[CO3.TargetBitDepthLuma == 10]; auto itModRec = rModRec.find(CO3.TargetChromaFormatPlus1); bool bUndef = (CO3.TargetBitDepthLuma != 8 && CO3.TargetBitDepthLuma != 10) || (itModRec == rModRec.end()); if (bUndef) { assert(!"undefined target format"); return false; } itModRec->second(rec, hw); rec.ChromaFormat = CO3.TargetChromaFormatPlus1 - 1; rec.BitDepthLuma = CO3.TargetBitDepthLuma; rec.BitDepthChroma = CO3.TargetBitDepthChroma; return true; } inline mfxU16 MapMfxProfileToSpec(mfxU16 profile) { switch (profile) { case MFX_PROFILE_AV1_MAIN: return 0; case MFX_PROFILE_AV1_HIGH: return 1; case MFX_PROFILE_AV1_PRO: return 2; default: return 0; } } inline mfxU16 MapMfxLevelToSpec(mfxU16 codecLevel) { return ((((codecLevel / 10) - 2) << 2) + (codecLevel % 10)); } void General::SetSH( const ExtBuffer::Param& par , eMFXHWType /*hw*/ , const EncodeCapsAv1& caps , SH& sh) { sh = {}; const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); sh.seq_profile = MapMfxProfileToSpec(par.mfx.CodecProfile); sh.still_picture = IsOn(auxPar.StillPictureMode); const int maxFrameResolutionBits = 15; sh.frame_width_bits = maxFrameResolutionBits; sh.frame_height_bits = maxFrameResolutionBits; sh.sbSize = SB_SIZE; sh.enable_order_hint = CO2Flag(auxPar.EnableOrderHint); sh.order_hint_bits_minus1 = auxPar.OrderHintBits - 1; sh.enable_cdef = CO2Flag(auxPar.EnableCdef); sh.enable_restoration = CO2Flag(auxPar.EnableRestoration); // Below fields will directly use setting from caps. sh.enable_dual_filter = caps.AV1ToolSupportFlags.fields.enable_dual_filter; sh.enable_filter_intra = caps.AV1ToolSupportFlags.fields.enable_filter_intra; sh.enable_interintra_compound = caps.AV1ToolSupportFlags.fields.enable_interintra_compound; sh.enable_intra_edge_filter = caps.AV1ToolSupportFlags.fields.enable_intra_edge_filter; sh.enable_jnt_comp = caps.AV1ToolSupportFlags.fields.enable_jnt_comp; sh.enable_masked_compound = caps.AV1ToolSupportFlags.fields.enable_masked_compound; const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); sh.color_config.BitDepth = CO3.TargetBitDepthLuma; sh.color_config.color_range = 1; // full swing representation sh.color_config.separate_uv_delta_q = 1; // NB: currently driver not work if it's '0' sh.color_config.subsampling_x = 1; // YUV 4:2:0 sh.color_config.subsampling_y = 1; // YUV 4:2:0 const mfxExtVideoSignalInfo& VSI = ExtBuffer::Get(par); sh.color_config.color_range = VSI.VideoFullRange; sh.color_config.color_description_present_flag = VSI.ColourDescriptionPresent; sh.color_config.color_primaries = VSI.ColourPrimaries; sh.color_config.transfer_characteristics = VSI.TransferCharacteristics; sh.color_config.matrix_coefficients = VSI.MatrixCoefficients; const mfxExtTemporalLayers& TL = ExtBuffer::Get(par); sh.operating_points_cnt_minus_1 = CountTL(TL) - 1; sh.seq_level_idx[0] = MapMfxLevelToSpec(par.mfx.CodecLevel); if (par.mfx.CodecLevel >= MFX_LEVEL_AV1_4 && MaxKbps(par.mfx) > GetMaxKbpsByLevel(par.mfx.CodecLevel, par.mfx.CodecProfile)) { sh.seq_tier[0] = 1; } else { sh.seq_tier[0] = 0; } if (sh.operating_points_cnt_minus_1) { // (1) Only temporal scalability is supported // (2) Set operating_point_idc[] in the same way as reference AOM // to decode by aomdec bitstreams w/ temporal scalability reset enabled // It means that the i=0 point corresponds to the // highest quality operating point(all layers), and subsequent // operarting points (i > 0) are lower quality corresponding to // skip decoding enhancement layers for (mfxU8 i = 0; i <= sh.operating_points_cnt_minus_1; i++) { sh.operating_point_idc[i] = (1u << 8) | ~(~0u << (sh.operating_points_cnt_minus_1 + 1 - i)); sh.seq_level_idx[i] = sh.seq_level_idx[0]; sh.seq_tier[i] = sh.seq_tier[0]; } } } inline INTERP_FILTER MapMfxInterpFilter(mfxU16 filter) { switch (filter) { case MFX_AV1_INTERP_EIGHTTAP_SMOOTH: return EIGHTTAP_SMOOTH; case MFX_AV1_INTERP_EIGHTTAP_SHARP: return EIGHTTAP_SHARP; case MFX_AV1_INTERP_BILINEAR: return BILINEAR; case MFX_AV1_INTERP_SWITCHABLE: return SWITCHABLE; case MFX_AV1_INTERP_EIGHTTAP: default: return EIGHTTAP_REGULAR; } } void General::SetFH( const ExtBuffer::Param& par , eMFXHWType /*hw*/ , const SH& sh , FH& fh) { // this functions sets "static" parameters which can be changed via Reset fh = {}; const mfxExtAV1ResolutionParam& rsPar = ExtBuffer::Get(par); const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); fh.FrameWidth = GetActualEncodeWidth(rsPar.FrameWidth, &auxPar); fh.FrameHeight = rsPar.FrameHeight; fh.UpscaledWidth = rsPar.FrameWidth; fh.error_resilient_mode = CO2Flag(auxPar.ErrorResilientMode); fh.disable_cdf_update = CO2Flag(auxPar.DisableCdfUpdate); fh.interpolation_filter = MapMfxInterpFilter(auxPar.InterpFilter); fh.RenderWidth = rsPar.FrameWidth; fh.RenderHeight = rsPar.FrameHeight; fh.disable_frame_end_update_cdf = CO2Flag(auxPar.DisableFrameEndUpdateCdf); fh.allow_high_precision_mv = 0; fh.skip_mode_present = 0; fh.quantization_params.DeltaQYDc = auxPar.QP.YDcDeltaQ; fh.quantization_params.DeltaQUDc = auxPar.QP.UDcDeltaQ; fh.quantization_params.DeltaQUAc = auxPar.QP.UAcDeltaQ; fh.quantization_params.DeltaQVDc = auxPar.QP.VDcDeltaQ; fh.quantization_params.DeltaQVAc = auxPar.QP.VAcDeltaQ; // Loop Filter params if (IsOn(auxPar.EnableLoopFilter)) { fh.loop_filter_params.loop_filter_sharpness = auxPar.LoopFilterSharpness; fh.loop_filter_params.loop_filter_delta_enabled = auxPar.LoopFilter.ModeRefDeltaEnabled; fh.loop_filter_params.loop_filter_delta_update = auxPar.LoopFilter.ModeRefDeltaUpdate; std::copy_n(auxPar.LoopFilter.RefDeltas, TOTAL_REFS_PER_FRAME, fh.loop_filter_params.loop_filter_ref_deltas); std::copy_n(auxPar.LoopFilter.ModeDeltas, MAX_MODE_LF_DELTAS, fh.loop_filter_params.loop_filter_mode_deltas); } if (sh.enable_restoration) { for (mfxU8 i = 0; i < MAX_MB_PLANE; i++) { fh.lr_params.lr_type[i] = RESTORE_WIENER; } fh.lr_params.lr_unit_shift = 0; fh.lr_params.lr_unit_extra_shift = 0; if (sh.color_config.subsampling_x && sh.color_config.subsampling_y) { fh.lr_params.lr_uv_shift = 1; } else { fh.lr_params.lr_uv_shift = 0; } } fh.TxMode = TX_MODE_SELECT; fh.reduced_tx_set = 1; fh.delta_lf_present = 1; fh.delta_lf_multi = 1; fh.quantization_params.using_qmatrix = 0; fh.quantization_params.qm_y = 15; fh.quantization_params.qm_u = 15; fh.quantization_params.qm_v = 15; } void SetDefaultFormat( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption3* pCO3) { auto& fi = par.mfx.FrameInfo; assert(fi.FourCC); SetDefault(fi.BitDepthLuma, [&]() { return defPar.base.GetBitDepthLuma(defPar); }); SetDefault(fi.BitDepthChroma, fi.BitDepthLuma); if (pCO3) { pCO3->TargetChromaFormatPlus1 = defPar.base.GetTargetChromaFormatPlus1(defPar); pCO3->TargetBitDepthLuma = defPar.base.GetTargetBitDepthLuma(defPar); SetDefault(pCO3->TargetBitDepthChroma, pCO3->TargetBitDepthLuma); } } void SetDefaultSize( mfxVideoParam & par , const Defaults::Param& defPar , mfxExtAV1ResolutionParam* pRsPar) { auto& fi = par.mfx.FrameInfo; SetDefault(fi.CropW, fi.Width); SetDefault(fi.CropH, fi.Height); if (pRsPar != nullptr) { SetDefaultFrameInfo(pRsPar->FrameWidth, pRsPar->FrameHeight, fi); } SetDefault(fi.AspectRatioW, mfxU16(1)); SetDefault(fi.AspectRatioH, mfxU16(1)); std::tie(fi.FrameRateExtN, fi.FrameRateExtD) = defPar.base.GetFrameRate(defPar); } void SetDefaultGOP( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption2* pCO2 , mfxExtCodingOption3* pCO3) { par.mfx.GopPicSize = defPar.base.GetGopPicSize(defPar); par.mfx.GopRefDist = defPar.base.GetGopRefDist(defPar); SetDefault(par.mfx.NumRefFrame, defPar.base.GetNumRefFrames(defPar)); if (pCO2 != nullptr) { SetIf(pCO2->BRefType, !pCO2->BRefType, [&]() { return defPar.base.GetBRefType(defPar); }); } if (pCO3 != nullptr) { SetIf(pCO3->PRefType, !pCO3->PRefType, [&]() { return defPar.base.GetPRefType(defPar); }); // change default to LDB when RAB if (General::HaveRABFrames(par)) SetDefault(pCO3->GPB, MFX_CODINGOPTION_ON); else SetDefault(pCO3->GPB, MFX_CODINGOPTION_OFF); defPar.base.GetNumRefActive( defPar , &pCO3->NumRefActiveP , &pCO3->NumRefActiveBL0 , &pCO3->NumRefActiveBL1); } } void SetDefaultBRC( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption2* pCO2 , mfxExtCodingOption3* pCO3) { SetDefault(par.mfx.BRCParamMultiplier, 1); par.mfx.RateControlMethod = defPar.base.GetRateControlMethod(defPar); BufferSizeInKB(par.mfx) = defPar.base.GetBufferSizeInKB(defPar); if(pCO2) pCO2->MBBRC = defPar.base.GetMBBRC(defPar); bool bSetQP = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && !(par.mfx.QPI && par.mfx.QPP && par.mfx.QPB); bool bSetRCPar = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR); bool bSetICQ = (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ); if (bSetQP) { std::tie(par.mfx.QPI, par.mfx.QPP, par.mfx.QPB) = defPar.base.GetQPMFX(defPar); } if (bSetRCPar) { MaxKbps(par.mfx) = defPar.base.GetMaxKbps(defPar); SetDefault(par.mfx.InitialDelayInKB, par.mfx.BufferSizeInKB / 2); } SetDefault(par.mfx.BRCParamMultiplier, 1); if (bSetICQ) { SetDefault(par.mfx.ICQQuality, 26); } mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); if (pAuxPar && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { SetDefault(pAuxPar->QP.MinBaseQIndex, AV1_MIN_Q_INDEX); SetDefault(pAuxPar->QP.MaxBaseQIndex, AV1_MAX_Q_INDEX); } if (pCO3) { defPar.base.GetQPOffset(defPar, pCO3->EnableQPOffset, pCO3->QPOffset); SetDefault(pCO3->LowDelayBRC, MFX_CODINGOPTION_OFF); } if(pCO3 && IsOn(pCO3->LowDelayBRC)) { SetDefault(pCO3->ScenarioInfo, MFX_SCENARIO_REMOTE_GAMING); } } inline void SetDefaultOrderHint(mfxExtAV1AuxData* par) { if (!par) return; SetDefault(par->EnableOrderHint, MFX_CODINGOPTION_ON); if (IsOn(par->EnableOrderHint)) { SetDefault(par->OrderHintBits, 8); } } void General::SetDefaults( mfxVideoParam& par , const Defaults::Param& defPar , bool bExternalFrameAllocator) { auto GetDefaultLevel = [&]() { return GetMinLevel(defPar, MFX_LEVEL_AV1_2); }; SetDefault(par.mfx.LowPower, MFX_CODINGOPTION_ON); SetDefault(par.AsyncDepth, defPar.base.GetAsyncDepth(defPar)); const mfxU16 IOPByAlctr[2] = { MFX_IOPATTERN_IN_SYSTEM_MEMORY, MFX_IOPATTERN_IN_VIDEO_MEMORY }; SetDefault(par.IOPattern, IOPByAlctr[!!bExternalFrameAllocator]); SetDefault(par.mfx.TargetUsage, DEFAULT_TARGET_USAGE); SetDefault(par.mfx.NumThread, 1); mfxExtAV1ResolutionParam* pRsPar = ExtBuffer::Get(par); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); SetDefaultSize(par, defPar, pRsPar); SetDefaultGOP(par, defPar, pCO2, pCO3); SetDefaultBRC(par, defPar, pCO2, pCO3); SetDefault(par.mfx.CodecProfile, defPar.base.GetProfile(defPar)); SetDefault(par.mfx.CodecLevel, GetDefaultLevel); mfxExtAV1BitstreamParam* pBsPar = ExtBuffer::Get(par); if (pBsPar != nullptr) { SetDefault(pBsPar->WriteIVFHeaders, MFX_CODINGOPTION_OFF); } SetDefault(par.mfx.FrameInfo.PicStruct, MFX_PICSTRUCT_PROGRESSIVE); SetDefaultFormat(par, defPar, pCO3); mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); if (pAuxPar) { SetDefault(pAuxPar->StillPictureMode, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->UseAnnexB, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->PackOBUFrame, MFX_CODINGOPTION_ON); SetDefault(pAuxPar->InsertTemporalDelimiter, MFX_CODINGOPTION_ON); SetDefault(pAuxPar->EnableCdef, MFX_CODINGOPTION_ON); SetDefault(pAuxPar->EnableRestoration, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->EnableLoopFilter, MFX_CODINGOPTION_ON); SetDefault(pAuxPar->InterpFilter, MFX_AV1_INTERP_EIGHTTAP); SetDefault(pAuxPar->DisableCdfUpdate, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->DisableFrameEndUpdateCdf, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->LoopFilter.ModeRefDeltaEnabled, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->LoopFilter.ModeRefDeltaUpdate, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->DisplayFormatSwizzle, MFX_CODINGOPTION_OFF); SetDefault(pAuxPar->ErrorResilientMode, MFX_CODINGOPTION_OFF); } SetDefaultOrderHint(pAuxPar); mfxExtTemporalLayers* pTemporalLayers = ExtBuffer::Get(par); if (pTemporalLayers && pTemporalLayers->NumLayers && pTemporalLayers->Layers) { SetDefault(pTemporalLayers->Layers[0].FrameRateScale, mfxU16(1)); } } mfxStatus General::CheckNumRefFrame( mfxVideoParam & par , const Defaults::Param& defPar) { MFX_CHECK(par.mfx.NumRefFrame, MFX_ERR_NONE); mfxU32 changed = 0; changed += CheckMaxOrClip(par.mfx.NumRefFrame, NUM_REF_FRAMES); if (defPar.base.GetBRefType(defPar) == MFX_B_REF_PYRAMID) { mfxU32 minNumRefFrame = defPar.base.GetNumRefBPyramid(defPar); changed += CheckMinOrClip(par.mfx.NumRefFrame, minNumRefFrame); } changed += SetIf( par.mfx.NumRefFrame , (par.mfx.GopRefDist > 1 && par.mfx.NumRefFrame == 1 && !defPar.base.GetNonStdReordering(defPar)) , defPar.base.GetMinRefForBNoPyramid(defPar)); mfxU16 NumTL = defPar.base.GetNumTemporalLayers(defPar); changed += SetIf( par.mfx.NumRefFrame , (NumTL > 1 && par.mfx.NumRefFrame < NumTL - 1) , NumTL - 1); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckFrameRate(mfxVideoParam & par) { auto& fi = par.mfx.FrameInfo; if (fi.FrameRateExtN && fi.FrameRateExtD) // FR <= 300 { if (fi.FrameRateExtN > mfxU32(300 * fi.FrameRateExtD)) { fi.FrameRateExtN = fi.FrameRateExtD = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } } if ((fi.FrameRateExtN == 0) != (fi.FrameRateExtD == 0)) { fi.FrameRateExtN = 0; fi.FrameRateExtD = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; } bool General::IsInVideoMem(const mfxVideoParam & par) { if (par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) return true; return false; } mfxStatus General::CheckShift(mfxVideoParam & par) { auto& fi = par.mfx.FrameInfo; bool bVideoMem = IsInVideoMem(par); if (bVideoMem && !fi.Shift) { if (fi.FourCC == MFX_FOURCC_P010 || fi.FourCC == MFX_FOURCC_P210) { fi.Shift = 1; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return MFX_ERR_NONE; } mfxStatus General::CheckCrops( mfxVideoParam & par , const Defaults::Param& /*defPar*/) { auto& fi = par.mfx.FrameInfo; mfxU32 invalid = 0; invalid += CheckOrZero(fi.CropX, 0); invalid += CheckOrZero(fi.CropY, 0); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); mfxU32 changed = 0; changed += CheckMaxOrClip(fi.CropW, fi.Width); changed += CheckMaxOrClip(fi.CropH, fi.Height); const mfxExtAV1ResolutionParam* pRsPar = ExtBuffer::Get(par); if (pRsPar) { changed += pRsPar->FrameWidth > 0 && CheckMaxOrClip(fi.CropW, pRsPar->FrameWidth); changed += pRsPar->FrameHeight > 0 && CheckMaxOrClip(fi.CropH, pRsPar->FrameHeight); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxU32 CheckBufferSizeInKB(mfxVideoParam& par, const Defaults::Param& defPar) { mfxU32 changed = 0; if (!par.mfx.BufferSizeInKB) return changed; mfxU32 minSizeInKB = 0; const bool bCqpOrIcq = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ; if (bCqpOrIcq) { minSizeInKB = General::GetRawBytes(defPar) / 1000; } else { mfxU32 frN = 0; mfxU32 frD = 0; std::tie(frN, frD) = defPar.base.GetFrameRate(defPar); mfxU32 avgFrameSize = Ceil((mfxF64)TargetKbps(par.mfx) * frD / frN / 8); minSizeInKB = avgFrameSize * 2 + 1; } if (BufferSizeInKB(par.mfx) < minSizeInKB) { BufferSizeInKB(par.mfx) = minSizeInKB; changed++; } return changed; } inline mfxU32 CheckAndFixQP(mfxU16& qp, const mfxU16 minQP, const mfxU16 maxQP) { mfxU32 changed = 0; if (qp) { changed += CheckMinOrClip(qp, minQP); changed += CheckMaxOrClip(qp, maxQP); } return changed; } mfxStatus General::CheckRateControl( mfxVideoParam& par , const Defaults::Param& defPar) { mfxU32 changed = 0; if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; par.mfx.Accuracy = 0; par.mfx.Convergence = 0; changed++; } auto RateControlMethod = defPar.base.GetRateControlMethod(defPar); bool bSupported = !CheckOrZero(RateControlMethod , !!defPar.caps.msdk.CBRSupport * MFX_RATECONTROL_CBR , !!defPar.caps.msdk.VBRSupport * MFX_RATECONTROL_VBR , !!defPar.caps.msdk.CQPSupport * MFX_RATECONTROL_CQP , !!defPar.caps.msdk.ICQSupport * MFX_RATECONTROL_ICQ ); MFX_CHECK(bSupported, MFX_ERR_UNSUPPORTED); changed += ((RateControlMethod == MFX_RATECONTROL_VBR) && par.mfx.MaxKbps != 0 && par.mfx.TargetKbps != 0) && CheckMinOrClip(par.mfx.MaxKbps, par.mfx.TargetKbps); changed += CheckBufferSizeInKB(par, defPar); const bool bCQP = RateControlMethod == MFX_RATECONTROL_CQP; const auto minQP = defPar.base.GetMinQPMFX(defPar); const auto maxQP = defPar.base.GetMaxQPMFX(defPar); if (bCQP) { changed += CheckAndFixQP(par.mfx.QPI, minQP, maxQP); changed += CheckAndFixQP(par.mfx.QPP, minQP, maxQP); changed += CheckAndFixQP(par.mfx.QPB, minQP, maxQP); } if (RateControlMethod == MFX_RATECONTROL_ICQ) { changed += CheckAndFixQP(par.mfx.ICQQuality, 1, 51); } mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2) { changed += CheckOrZero(pCO2->MinQPI, 0, minQP); changed += CheckOrZero(pCO2->MaxQPI, 0, maxQP); changed += CheckOrZero(pCO2->MinQPP, 0, minQP); changed += CheckOrZero(pCO2->MaxQPP, 0, maxQP); changed += CheckOrZero(pCO2->MinQPB, 0, minQP); changed += CheckOrZero(pCO2->MaxQPB, 0, maxQP); } mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3) { const mfxU16 GopRefDist = defPar.base.GetGopRefDist(defPar); const bool bBPyr = GopRefDist > 1 && defPar.base.GetBRefType(defPar) == MFX_B_REF_PYRAMID; const bool bQpOffsetValid = bCQP && bBPyr; changed += CheckOrZero(pCO3->EnableQPOffset , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !!bQpOffsetValid)); mfxI16 minQPOffset = 0; mfxI16 maxQPOffset = 0; if (IsOn(pCO3->EnableQPOffset)) { const mfxI16 QPX = std::get<2>(defPar.base.GetQPMFX(defPar)); minQPOffset = mfxI16(minQP - QPX); maxQPOffset = mfxI16(maxQP - QPX); } auto CheckQPOffset = [&](mfxI16& QPO) { return CheckMinOrClip(QPO, minQPOffset) + CheckMaxOrClip(QPO, maxQPOffset); }; changed += !!std::count_if(std::begin(pCO3->QPOffset), std::end(pCO3->QPOffset), CheckQPOffset); } mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); if (pAuxPar) { if (bCQP) { changed += CheckOrZero(pAuxPar->QP.MinBaseQIndex, 0); changed += CheckOrZero(pAuxPar->QP.MaxBaseQIndex, 0); } else { if (pAuxPar->QP.MinBaseQIndex || pAuxPar->QP.MaxBaseQIndex) { changed += CheckRangeOrClip(pAuxPar->QP.MinBaseQIndex, minQP, maxQP); changed += CheckRangeOrClip(pAuxPar->QP.MaxBaseQIndex, minQP, maxQP); changed += CheckMaxOrClip(pAuxPar->QP.MinBaseQIndex, pAuxPar->QP.MaxBaseQIndex); } } } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxU32 General::GetRawBytes(const Defaults::Param& defPar) { const auto& par = defPar.mvp; mfxU64 width = 0, height = 0; std::tie(width, height) = GetRealResolution(par); mfxU64 size = width * height; const auto format = defPar.base.GetTargetChromaFormatPlus1(defPar) - 1; auto depth = defPar.base.GetTargetBitDepthLuma(defPar); if (format == MFX_CHROMAFORMAT_YUV420) size = size * 3 / 2; else if (format == MFX_CHROMAFORMAT_YUV422) size *= 2; else if (format == MFX_CHROMAFORMAT_YUV444) size *= 3; if (depth < 8) { MFX_LOG_WARN("TargetBitDepthLuma %d should be greater than 8!", depth); depth = 8; } if (depth != 8) size = mfx::CeilDiv(size * depth, mfxU64(8)); return static_cast(size); } mfxStatus General::CheckIOPattern(mfxVideoParam & par) { mfxU32 invalid = 0; invalid += Check (par.IOPattern); if (invalid) { par.IOPattern = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; } mfxStatus General::CheckTemporalLayers(mfxVideoParam & par) { mfxExtTemporalLayers* pTemporalLayers = ExtBuffer::Get(par); MFX_CHECK(pTemporalLayers && pTemporalLayers->NumLayers != 0, MFX_ERR_NONE); mfxU32 invalid = 0; invalid += SetIf(pTemporalLayers->NumLayers, pTemporalLayers->Layers == nullptr, 0); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); invalid += CheckOrZero(pTemporalLayers->Layers[0].FrameRateScale, 0, 1); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); mfxU16 nTL = pTemporalLayers->NumLayers; // Strip tailing zeros, except for the first while (nTL > 1 && pTemporalLayers->Layers[nTL - 1].FrameRateScale == 0) { nTL--; } mfxU32 changed = 0; changed += CheckMaxOrClip(pTemporalLayers->NumLayers, nTL); // FrameScale 0 not allowd in the middle except for the first and trailing layers, the latter have been stripped mfxU16 scalePrev = std::max(mfxU16(1), pTemporalLayers->Layers[0].FrameRateScale); for (mfxU16 idx = 1; idx < pTemporalLayers->NumLayers; ++idx) { mfxU16 scaleCurr = pTemporalLayers->Layers[idx].FrameRateScale; MFX_CHECK(scaleCurr != 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!CheckMinOrZero(scaleCurr, scalePrev + 1), MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckOrZero(scaleCurr, mfxU16(scaleCurr - (scaleCurr % scalePrev))), MFX_ERR_UNSUPPORTED); scalePrev = scaleCurr; } changed += CheckOrZero(par.mfx.GopRefDist, 0, 1, par.mfx.GopRefDist * (nTL <= 1)); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckStillPicture(mfxVideoParam & par) { mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pAuxPar && IsOn(pAuxPar->StillPictureMode), MFX_ERR_NONE); mfxU32 changed = 0; if (par.mfx.GopPicSize != 1) { par.mfx.GopPicSize = 1; changed += 1; } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckGopRefDist(mfxVideoParam & par, const Defaults::Param& defPar) { MFX_CHECK(par.mfx.GopRefDist, MFX_ERR_NONE); const mfxU16 GopPicSize = defPar.base.GetGopPicSize(defPar); const mfxU16 maxRefDist = std::max(1, GopPicSize - 1); MFX_CHECK(!CheckMaxOrClip(par.mfx.GopRefDist, maxRefDist), MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckGPB(mfxVideoParam & par) { mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3) { changed += CheckOrZero( pCO3->GPB , mfxU16(MFX_CODINGOPTION_ON) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_UNKNOWN)); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckTU(mfxVideoParam & par, const ENCODE_CAPS_AV1& /* caps */) { auto& tu = par.mfx.TargetUsage; if (CheckMaxOrZero(tu, 7u)) MFX_RETURN(MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } mfxStatus General::CheckDeltaQ(mfxVideoParam& par) { mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pAuxPar, MFX_ERR_NONE); mfxU32 changed = 0; changed += CheckMinOrClip(pAuxPar->QP.YDcDeltaQ, -15); changed += CheckMaxOrClip(pAuxPar->QP.YDcDeltaQ, 15); changed += CheckMinOrClip(pAuxPar->QP.UDcDeltaQ, -63); changed += CheckMaxOrClip(pAuxPar->QP.UDcDeltaQ, 63); changed += CheckMinOrClip(pAuxPar->QP.UAcDeltaQ, -63); changed += CheckMaxOrClip(pAuxPar->QP.UAcDeltaQ, 63); changed += CheckMinOrClip(pAuxPar->QP.VDcDeltaQ, -63); changed += CheckMaxOrClip(pAuxPar->QP.VDcDeltaQ, 63); changed += CheckMinOrClip(pAuxPar->QP.VAcDeltaQ, -63); changed += CheckMaxOrClip(pAuxPar->QP.VAcDeltaQ, 63); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckFrameOBU(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps) { mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pAuxPar, MFX_ERR_NONE); mfxU32 invalid = 0; if (IsOn(pAuxPar->PackOBUFrame) && caps.FrameOBUSupport == false) { pAuxPar->PackOBUFrame = MFX_CODINGOPTION_OFF; invalid = 1; } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); mfxExtAV1TileParam* pTilePar = ExtBuffer::Get(par); MFX_CHECK(pTilePar, MFX_ERR_NONE); mfxU32 changed = 0; if (pTilePar->NumTileGroups > 1 && IsOn(pAuxPar->PackOBUFrame)) { pAuxPar->PackOBUFrame = MFX_CODINGOPTION_OFF; changed = 1; } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckOrderHint(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps) { mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pAuxPar, MFX_ERR_NONE); mfxU32 invalid = 0; if (IsOn(pAuxPar->EnableOrderHint) && caps.AV1ToolSupportFlags.fields.enable_order_hint == false) { pAuxPar->EnableOrderHint = MFX_CODINGOPTION_OFF; invalid = 1; } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } mfxStatus General::CheckOrderHintBits(mfxVideoParam& par) { mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pAuxPar, MFX_ERR_NONE); //OrderHintBits valid range is 1-8, 0 is default value and will be reset in SetDefaults mfxU32 changed = 0; changed += CheckMaxOrClip(pAuxPar->OrderHintBits, 8); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } inline void CheckCDEFStrength(mfxExtAV1AuxData& auxPar, mfxU32& invalid, mfxU32& changed, const mfxU32 CDEFChannelStrengthSupport) { for (mfxU8 i = 0; i < CDEF_MAX_STRENGTHS; i++) { changed += CheckMaxOrClip(auxPar.Cdef.CdefYStrengths[i], 63); changed += CheckMaxOrClip(auxPar.Cdef.CdefUVStrengths[i], 63); } if (CDEFChannelStrengthSupport) return; for (mfxU8 i = 0; i < CDEF_MAX_STRENGTHS; i++) { if (auxPar.Cdef.CdefUVStrengths[i] != auxPar.Cdef.CdefYStrengths[i]) { auxPar.Cdef.CdefUVStrengths[i] = auxPar.Cdef.CdefYStrengths[i] = 0; invalid += 1; } } } mfxStatus General::CheckCDEF(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps) { mfxExtAV1AuxData* const pAuxPar = ExtBuffer::Get(par); mfxU32 invalid = 0; if (pAuxPar && IsOn(pAuxPar->EnableCdef) && !caps.AV1ToolSupportFlags.fields.enable_cdef) { pAuxPar->EnableCdef = MFX_CODINGOPTION_OFF; invalid += 1; } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); mfxU32 changed = 0; if (pAuxPar) { changed += CheckMaxOrClip(pAuxPar->Cdef.CdefDampingMinus3, 3); changed += CheckMaxOrClip(pAuxPar->Cdef.CdefBits, 3); CheckCDEFStrength(*pAuxPar, invalid, changed, caps.CDEFChannelStrengthSupport); } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } inline void CheckExtParam( const ParamSupport& sprt , mfxVideoParam& par , std::vector& onesBuf) { if (!par.ExtParam) return; for (mfxU32 i = 0; i < par.NumExtParam; i++) { if (!par.ExtParam[i]) continue; mfxExtBuffer header = *par.ExtParam[i]; memset(par.ExtParam[i], 0, header.BufferSz); *par.ExtParam[i] = header; auto it = sprt.m_ebCopySupported.find(header.BufferId); if (it != sprt.m_ebCopySupported.end()) { if (onesBuf.size() < header.BufferSz) onesBuf.insert(onesBuf.end(), header.BufferSz - mfxU32(onesBuf.size()), 1); auto pSrc = (mfxExtBuffer*)onesBuf.data(); if (pSrc != nullptr) { *pSrc = header; for (auto& copy : it->second) copy(pSrc, par.ExtParam[i]); } } } } mfxStatus General::CheckColorConfig(mfxVideoParam& par) { mfxU32 changed = 0; mfxExtVideoSignalInfo* pVSI = ExtBuffer::Get(par); if (pVSI) { changed += CheckRangeOrSetDefault(pVSI->VideoFormat, 0, 8, 5); changed += CheckRangeOrSetDefault(pVSI->ColourPrimaries, 0, 255, 2); changed += CheckRangeOrSetDefault(pVSI->TransferCharacteristics, 0, 255, 2); changed += CheckRangeOrSetDefault(pVSI->MatrixCoefficients, 0, 255, 2); changed += CheckOrZero(pVSI->VideoFullRange); changed += CheckOrZero(pVSI->ColourDescriptionPresent); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } void General::CheckQuery0(const ParamSupport& sprt, mfxVideoParam& par) { std::vector onesBuf(sizeof(par), 1); auto ExtParam = par.ExtParam; auto NumExtParam = par.NumExtParam; par = mfxVideoParam{}; for (auto& copy : sprt.m_mvpCopySupported) copy((mfxVideoParam*)onesBuf.data(), &par); par.ExtParam = ExtParam; par.NumExtParam = NumExtParam; CheckExtParam(sprt, par, onesBuf); } mfxStatus General::CheckBuffers(const ParamSupport& sprt, const mfxVideoParam& in, const mfxVideoParam* out) { MFX_CHECK(!(!in.NumExtParam && (!out || !out->NumExtParam)), MFX_ERR_NONE); MFX_CHECK(in.ExtParam, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(!(out && (!out->ExtParam || out->NumExtParam != in.NumExtParam)) , MFX_ERR_UNDEFINED_BEHAVIOR); std::map detected[2]; mfxU32 dId = 0; for (auto pPar : { &in, out }) { if (!pPar) continue; for (mfxU32 i = 0; i < pPar->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(pPar->ExtParam[i]); auto id = pPar->ExtParam[i]->BufferId; MFX_CHECK(sprt.m_ebCopySupported.find(id) != sprt.m_ebCopySupported.end(), MFX_ERR_UNSUPPORTED); MFX_CHECK(!(detected[dId][id]++), MFX_ERR_UNDEFINED_BEHAVIOR); } dId++; } MFX_CHECK(!(out && detected[0] != detected[1]), MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_ERR_NONE; } mfxStatus General::CopyConfigurable(const ParamSupport& sprt, const mfxVideoParam& in, mfxVideoParam& out) { using TFnCopyMVP = std::function; using TFnCopyEB = std::function; auto CopyMVP = [&](const mfxVideoParam& src, mfxVideoParam& dst) { std::for_each(sprt.m_mvpCopySupported.begin(), sprt.m_mvpCopySupported.end() , [&](const TFnCopyMVP& copy) { copy(&src, &dst); }); }; auto CopyEB = [](const std::list& copyList, const mfxExtBuffer* pIn, mfxExtBuffer* pOut) { std::for_each(copyList.begin(), copyList.end() , [&](const TFnCopyEB& copy) { copy(pIn, pOut); }); }; mfxVideoParam tmpMVP = {}; CopyMVP(in, tmpMVP); tmpMVP.NumExtParam = out.NumExtParam; tmpMVP.ExtParam = out.ExtParam; out = tmpMVP; std::list outBufs(out.ExtParam, out.ExtParam + out.NumExtParam); outBufs.sort(); outBufs.remove(nullptr); std::for_each(outBufs.begin(), outBufs.end() , [&](mfxExtBuffer* pEbOut) { std::vector ebTmp(pEbOut->BufferSz, mfxU8(0)); auto pEbIn = ExtBuffer::Get(in, pEbOut->BufferId); auto copyIt = sprt.m_ebCopySupported.find(pEbOut->BufferId); auto copyPtrsIt = sprt.m_ebCopyPtrs.find(pEbOut->BufferId); mfxExtBuffer* pEbTmp = (mfxExtBuffer*)ebTmp.data(); bool bCopyPar = pEbIn && copyIt != sprt.m_ebCopySupported.end(); bool bCopyPtr = copyPtrsIt != sprt.m_ebCopyPtrs.end(); *pEbTmp = *pEbOut; if (bCopyPtr) { CopyEB(copyPtrsIt->second, pEbOut, pEbTmp); } if (bCopyPar) { CopyEB(copyIt->second, pEbIn, pEbTmp); } if(pEbOut->BufferId == MFX_EXTBUFF_AV1_AUXDATA) { std::copy_n((mfxU8*)pEbIn, pEbIn->BufferSz, ebTmp.data()); } std::copy_n(ebTmp.data(), ebTmp.size(), (mfxU8*)pEbOut); }); return MFX_ERR_NONE; } mfxStatus General::CheckCodedPicSize( mfxVideoParam& par , const Defaults::Param& /*defPar*/) { mfxExtAV1ResolutionParam* pRsPar = ExtBuffer::Get(par); MFX_CHECK(pRsPar, MFX_ERR_NONE); MFX_CHECK(!CheckMaxOrZero(pRsPar->FrameWidth, par.mfx.FrameInfo.Width), MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckMaxOrZero(pRsPar->FrameHeight, par.mfx.FrameInfo.Height), MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } bool MapToDefinedLevel(mfxU16& level) { auto levelIt = LevelsRemap.find(level); if(levelIt != LevelsRemap.end()) { level = levelIt->second; return true; } else { return false; } } mfxStatus General::CheckLevelConstraints( mfxVideoParam& par , const Defaults::Param& defPar) { MFX_CHECK(par.mfx.CodecLevel, MFX_ERR_NONE); const mfxU16 rc = defPar.base.GetRateControlMethod(defPar); mfxU32 maxKbps = 0; SetIf(maxKbps, rc != MFX_RATECONTROL_CQP && rc != MFX_RATECONTROL_ICQ, [&]() { return defPar.base.GetMaxKbps(defPar); }); const auto frND = defPar.base.GetFrameRate(defPar); const auto res = GetRealResolution(par); const mfxExtAV1TileParam* pTiles = ExtBuffer::Get(par); const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); const auto tiles = GetNumTiles(pTiles, pAuxPar); const mfxU16 minLevel = GetMinLevel( std::get<0>(frND) , std::get<1>(frND) , std::get<0>(res) ,std::get<1>(res) , std::get<0>(tiles) , std::get<1>(tiles) , maxKbps , par.mfx.CodecProfile , par.mfx.CodecLevel); mfxU32 changed = 0; changed += CheckMinOrClip(par.mfx.CodecLevel, minLevel); // Resolution can't be corrected, return error if Level restriction can't met const mfxU32 maxHSize = GetMaxHSizeByLevel(par.mfx.CodecLevel); const mfxU32 maxVSize = GetMaxVSizeByLevel(par.mfx.CodecLevel); if (par.mfx.FrameInfo.Width > maxHSize || par.mfx.FrameInfo.Height > maxVSize) { par.mfx.FrameInfo.Width = 0; par.mfx.FrameInfo.Height = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxExtAV1ResolutionParam* pRsPar = ExtBuffer::Get(par); if (pRsPar != nullptr && (pRsPar->FrameWidth > maxHSize || pRsPar->FrameHeight > maxVSize)) { pRsPar->FrameWidth = 0; pRsPar->FrameHeight = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } const mfxF64 maxFrameRate = GetMaxFrameRateByLevel(par.mfx.CodecLevel, std::get<0>(res), std::get<1>(res)); if (par.mfx.FrameInfo.FrameRateExtN > maxFrameRate * par.mfx.FrameInfo.FrameRateExtD) { // Not clip frame rate, only return warning if it exceeds maximum value changed++; } if (maxKbps > 0) { mfxU32 maxKbpsByLevel = 0; if (par.mfx.CodecLevel >= MFX_LEVEL_AV1_4) { maxKbpsByLevel = GetMaxKbpsByLevel(par.mfx.CodecLevel, par.mfx.CodecProfile, 1); } else { maxKbpsByLevel = GetMaxKbpsByLevel(par.mfx.CodecLevel, par.mfx.CodecProfile); } if (maxKbps > maxKbpsByLevel) { MaxKbps(par.mfx) = maxKbpsByLevel; changed++; } } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus General::CheckTCBRC(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps) { mfxExtCodingOption3* CO3 = ExtBuffer::Get(par); MFX_CHECK(CO3 && IsOn(CO3->LowDelayBRC), MFX_ERR_NONE); bool isVBR = par.mfx.RateControlMethod == MFX_RATECONTROL_VBR; mfxU32 changed = 0; changed += SetIf(CO3->LowDelayBRC, !(caps.SupportedRateControlMethods.fields.TCBRCSupport && isVBR), MFX_CODINGOPTION_OFF); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } inline FRAME_TYPE MapMfxFrameTypeToSpec(mfxU16 ft) { if (IsB(ft) || IsP(ft)) return INTER_FRAME; else { assert(IsI(ft)); return KEY_FRAME; } } inline bool IsCDEFEmpty(const mfxExtAV1AuxData& auxPar) { bool empty = true; empty &= auxPar.Cdef.CdefDampingMinus3 == 0; empty &= auxPar.Cdef.CdefBits == 0; for (mfxU8 i = 0; i < CDEF_MAX_STRENGTHS; i++) { empty &= auxPar.Cdef.CdefYStrengths[i] == 0; empty &= auxPar.Cdef.CdefUVStrengths[i] == 0; } return empty; } inline void SetCDEFByAuxData( const mfxExtAV1AuxData& auxPar , FH& bs_fh) { auto& cdef = bs_fh.cdef_params; cdef.cdef_damping = auxPar.Cdef.CdefDampingMinus3 + 3; cdef.cdef_bits = auxPar.Cdef.CdefBits; for (mfxU8 i = 0; i < CDEF_MAX_STRENGTHS; i++) { cdef.cdef_y_pri_strength[i] = auxPar.Cdef.CdefYStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_y_sec_strength[i] = auxPar.Cdef.CdefYStrengths[i] % CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_pri_strength[i] = auxPar.Cdef.CdefUVStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_sec_strength[i] = auxPar.Cdef.CdefUVStrengths[i] % CDEF_STRENGTH_DIVISOR; } } inline void SetCDEF( const Defaults::Param& dflts , const SH& sh , FH& fh) { if (!sh.enable_cdef) return; const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(dflts.mvp); if (IsCDEFEmpty(auxPar)) { //Get default CDEF settings dflts.base.GetCDEF(fh); } else { //Set CDEF through command option SetCDEFByAuxData(auxPar, fh); } } inline bool IsLoopFilterLevelsEmpty(const mfxExtAV1AuxData& auxPar) { bool empty = true; empty &= auxPar.LoopFilter.LFLevelYVert == 0; empty &= auxPar.LoopFilter.LFLevelYHorz == 0; empty &= auxPar.LoopFilter.LFLevelU == 0; empty &= auxPar.LoopFilter.LFLevelV == 0; return empty; } inline void SetLoopFilterLevelsByAuxData( const mfxExtAV1AuxData& auxPar , FH& bs_fh) { bs_fh.loop_filter_params.loop_filter_level[0] = auxPar.LoopFilter.LFLevelYVert; bs_fh.loop_filter_params.loop_filter_level[1] = auxPar.LoopFilter.LFLevelYHorz; bs_fh.loop_filter_params.loop_filter_level[2] = auxPar.LoopFilter.LFLevelU; bs_fh.loop_filter_params.loop_filter_level[3] = auxPar.LoopFilter.LFLevelV; } inline void SetLoopFilterLevels( const Defaults::Param& dflts , FH& fh) { const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(dflts.mvp); if (!IsOn(auxPar.EnableLoopFilter)) return; if (IsLoopFilterLevelsEmpty(auxPar)) { //Get default LoopFilter settings dflts.base.GetLoopFilterLevels(dflts, fh); } else { //Set LoopFilter through command option SetLoopFilterLevelsByAuxData(auxPar, fh); } } inline void SetRefFrameFlags( const TaskCommonPar& task , FH& fh , const bool frameIsIntra) { if (frameIsIntra || fh.error_resilient_mode) fh.primary_ref_frame = PRIMARY_REF_NONE; const int allFrames = (1 << NUM_REF_FRAMES) - 1; if (fh.frame_type == SWITCH_FRAME || (fh.frame_type == KEY_FRAME && fh.show_frame)) fh.refresh_frame_flags = allFrames; else { for (mfxU8 i = 0; i < NUM_REF_FRAMES; i++) fh.refresh_frame_flags |= task.RefreshFrameFlags[i] << i; } } inline void SetRefFrameIndex( const TaskCommonPar& task , FH& fh , const bool frameIsIntra) { if (frameIsIntra) return; const auto& refList = task.RefList; mfxU8 defaultRef = refList[LAST_FRAME - LAST_FRAME]; auto SetRef = [&defaultRef](mfxU8 ref) -> int32_t { return IsValid(ref) ? ref : defaultRef;}; const mfxU8 bwdStartIdx = BWDREF_FRAME - LAST_FRAME; auto bwdStartIt = refList.begin() + bwdStartIdx; std::transform(refList.begin(), bwdStartIt, fh.ref_frame_idx, SetRef); auto validBwd = IsP(task.FrameType) ? refList.end() : std::find_if(bwdStartIt, refList.end(), IsValid); if (validBwd != refList.end()) defaultRef = *validBwd; std::transform(bwdStartIt, refList.end(), fh.ref_frame_idx + bwdStartIdx, SetRef); } inline mfxU32 GetReferenceMode(const TaskCommonPar& task) { return IsB(task.FrameType) || task.isLDB ? 1 : 0; } inline int av1_get_relative_dist(const SH& sh, const uint32_t a, const uint32_t b) { // the logic is from AV1 spec 5.9.3 if (!sh.enable_order_hint) return 0; const uint32_t OrderHintBits = sh.order_hint_bits_minus1 + 1; int32_t diff = a - b; uint32_t m = 1 << (OrderHintBits - 1); diff = (diff & (m - 1)) - (diff & m); return diff; } inline void GetFwdBwdIdx( const DpbType& dpb, const SH& sh, const FH& fh, const int orderHint, int& forwardIdx, int& forwardHint, int& backwardIdx) { int i = 0; int refHint = 0; int backwardHint = -1; for (i = 0; i < REFS_PER_FRAME; i++) { auto& refFrm = dpb.at(fh.ref_frame_idx[i]); refHint = refFrm->DisplayOrderInGOP; if (av1_get_relative_dist(sh, refHint, orderHint) < 0) { if (forwardIdx < 0 || av1_get_relative_dist(sh, refHint, forwardHint) > 0) { forwardIdx = i; forwardHint = refHint; } } else if (av1_get_relative_dist(sh, refHint, orderHint) > 0) { if (backwardIdx < 0 || av1_get_relative_dist(sh, refHint, backwardHint) < 0) { backwardIdx = i; backwardHint = refHint; } } } } inline void SetSkipModeAllowed(const SH& sh, FH& fh, const DpbType& dpb) { int forwardIdx = -1; int forwardHint = -1; int backwardIdx = -1; GetFwdBwdIdx(dpb, sh, fh, fh.order_hint, forwardIdx, forwardHint, backwardIdx); if (forwardIdx < 0) { fh.skipModeAllowed = 0; } else if (backwardIdx >= 0) { fh.skipModeAllowed = 1; } else { int secondForwardHint = -1; int secondForwardIdx = -1; GetFwdBwdIdx(dpb, sh, fh, forwardHint, secondForwardIdx, secondForwardHint, backwardIdx); if (secondForwardIdx < 0) { fh.skipModeAllowed = 0; } else { fh.skipModeAllowed = 1; } } } inline void SetSkipModeParams(const SH& sh, FH& fh, const bool frameIsIntra, const DpbType& dpb) { // the logic is from AV1 spec 5.9.22 fh.skipModeAllowed = 1; if (frameIsIntra || !fh.reference_select || !sh.enable_order_hint) fh.skipModeAllowed = 0; else { SetSkipModeAllowed(sh, fh, dpb); } } mfxStatus General::GetCurrentFrameHeader( const TaskCommonPar& task , const Defaults::Param& dflts , const SH& sh , const FH& fh , FH & currFH) const { currFH = fh; currFH.frame_type = MapMfxFrameTypeToSpec(task.FrameType); currFH.show_frame = IsHiddenFrame(task) ? 0 : 1; if (currFH.show_frame) { currFH.showable_frame = currFH.frame_type != KEY_FRAME; } else { currFH.showable_frame = 1; // for now, all hiden frame will be show in later. } // could affect basic usage without explictly set error_resilient_mode = 1 if (currFH.frame_type == SWITCH_FRAME || (currFH.frame_type == KEY_FRAME && currFH.show_frame)) { currFH.error_resilient_mode = 1; } currFH.order_hint = task.DisplayOrderInGOP; // ref_order_hint for (auto iter = task.DPB.begin(); iter != task.DPB.end(); iter++) { if(*iter != nullptr) currFH.ref_order_hint[std::distance(task.DPB.begin(), iter)] = (*iter)->DisplayOrderInGOP; } const bool frameIsIntra = FrameIsIntra(currFH); SetRefFrameFlags(task, currFH, frameIsIntra); SetRefFrameIndex(task, currFH, frameIsIntra); currFH.quantization_params.base_q_idx = task.QpY; if (IsLossless(currFH)) { currFH.CodedLossless = 1; DisableCDEF(currFH); DisableLoopFilter(currFH); } else { SetCDEF(dflts, sh, currFH); SetLoopFilterLevels(dflts, currFH); } currFH.TxMode = (fh.CodedLossless) ? ONLY_4X4 : TX_MODE_SELECT; currFH.reference_select = GetReferenceMode(task); SetSkipModeParams(sh, currFH, frameIsIntra, task.DPB); return MFX_ERR_NONE; } } } #endif av1ehw_base_general.h000066400000000000000000000267561443134507600335140ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_ddi.h" #include "av1ehw_base_data.h" #include namespace AV1EHW { namespace Base { class General : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetLogging )\ DECL_BLOCK(Query0 )\ DECL_BLOCK(SetDefaultsCallChain )\ DECL_BLOCK(PreCheckCodecId )\ DECL_BLOCK(PreCheckChromaFormat )\ DECL_BLOCK(PreCheckExtBuffers )\ DECL_BLOCK(CopyConfigurable )\ DECL_BLOCK(FixParam )\ DECL_BLOCK(CheckAndFixLowPower )\ DECL_BLOCK(CheckFormat )\ DECL_BLOCK(CheckLevel )\ DECL_BLOCK(CheckPicStruct )\ DECL_BLOCK(CheckSurfSize )\ DECL_BLOCK(CheckCodedPicSize )\ DECL_BLOCK(CheckTU )\ DECL_BLOCK(CheckDeltaQ )\ DECL_BLOCK(CheckFrameOBU )\ DECL_BLOCK(CheckOrderHint )\ DECL_BLOCK(CheckOrderHintBits )\ DECL_BLOCK(CheckCDEF )\ DECL_BLOCK(CheckTemporalLayers )\ DECL_BLOCK(CheckGopRefDist )\ DECL_BLOCK(CheckStillPicture )\ DECL_BLOCK(CheckGPB )\ DECL_BLOCK(CheckNumRefFrame )\ DECL_BLOCK(CheckIOPattern )\ DECL_BLOCK(CheckProtected )\ DECL_BLOCK(CheckRateControl )\ DECL_BLOCK(CheckCrops )\ DECL_BLOCK(CheckShift )\ DECL_BLOCK(CheckFrameRate )\ DECL_BLOCK(CheckProfile )\ DECL_BLOCK(CheckEncodedOrder )\ DECL_BLOCK(CheckLevelConstraints)\ DECL_BLOCK(CheckTCBRC )\ DECL_BLOCK(Query1NoCaps )\ DECL_BLOCK(CheckColorConfig )\ DECL_BLOCK(Query1WithCaps )\ DECL_BLOCK(SetUnalignedDefaults )\ DECL_BLOCK(SetDefaults )\ DECL_BLOCK(AttachMissingBuffers )\ DECL_BLOCK(SetFrameAllocRequest )\ DECL_BLOCK(SetSH )\ DECL_BLOCK(SetFH )\ DECL_BLOCK(SetReorder )\ DECL_BLOCK(SetRepeat )\ DECL_BLOCK(AllocRaw )\ DECL_BLOCK(AllocRec )\ DECL_BLOCK(AllocBS )\ DECL_BLOCK(ResetInit )\ DECL_BLOCK(ResetCheck )\ DECL_BLOCK(ResetState )\ DECL_BLOCK(CheckSurf )\ DECL_BLOCK(CheckBS )\ DECL_BLOCK(AllocTask )\ DECL_BLOCK(InitTask )\ DECL_BLOCK(PrepareTask )\ DECL_BLOCK(ConfigureTask )\ DECL_BLOCK(GetRawHDL )\ DECL_BLOCK(CopySysToRaw )\ DECL_BLOCK(CopyBS )\ DECL_BLOCK(UpdateBsInfo )\ DECL_BLOCK(SetRecInfo )\ DECL_BLOCK(FreeTask )\ DECL_BLOCK(Close ) #define DECL_FEATURE_NAME "Base_General" #include "av1ehw_decl_blocks.h" General(mfxU32 id) : FeatureBase(id) { } protected: TaskCommonPar m_prevTask; mfxU32 m_frameOrder = 0 , m_lastKeyFrame = 0 , m_temporalUnitOrder = 0; bool m_insertIVFSeq = true; std::function(const mfxVideoParam&)> m_GetMaxRef; std::unique_ptr m_pQWCDefaults; NotNull m_pQNCDefaults; eMFXHWType m_hw = MFX_HW_UNKNOWN; void ResetState() { m_frameOrder = 0; m_lastKeyFrame = 0; m_temporalUnitOrder = 0; Invalidate(m_prevTask); } public: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query0(const FeatureBlocks& blocks, TPushQ0 Push) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void QueryIOSurf(const FeatureBlocks& blocks, TPushQIS Push) override; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void FrameSubmit(const FeatureBlocks& blocks, TPushFS Push) override; virtual void AllocTask(const FeatureBlocks& blocks, TPushAT Push) override; virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void PreReorderTask(const FeatureBlocks& blocks, TPushPreRT Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void FreeTask(const FeatureBlocks& blocks, TPushFT Push) override; virtual void GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; static void PushDefaults(Defaults& df); void CheckQuery0(const ParamSupport& sprt, mfxVideoParam& par); mfxStatus CheckBuffers(const ParamSupport& sprt, const mfxVideoParam& in, const mfxVideoParam* out = nullptr); mfxStatus CopyConfigurable(const ParamSupport& sprt, const mfxVideoParam& in, mfxVideoParam& out); mfxStatus CheckCodedPicSize(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckTU(mfxVideoParam & par, const ENCODE_CAPS_AV1& caps); mfxStatus CheckDeltaQ(mfxVideoParam& par); mfxStatus CheckFrameOBU(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps); mfxStatus CheckOrderHint(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps); mfxStatus CheckOrderHintBits(mfxVideoParam& par); mfxStatus CheckCDEF(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps); mfxStatus CheckTemporalLayers(mfxVideoParam& par); mfxStatus CheckStillPicture(mfxVideoParam& par); mfxStatus CheckGopRefDist(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckGPB(mfxVideoParam& par); mfxStatus CheckIOPattern(mfxVideoParam& par); mfxStatus CheckRateControl(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckCrops(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckShift(mfxVideoParam& par); mfxStatus CheckFrameRate(mfxVideoParam& par); mfxStatus CheckNumRefFrame(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckColorConfig(mfxVideoParam& par); mfxStatus MapLevel(mfxVideoParam& par); mfxStatus CheckLevelConstraints(mfxVideoParam& par, const Defaults::Param& defPar); mfxStatus CheckTCBRC(mfxVideoParam& par, const ENCODE_CAPS_AV1& caps); void SetDefaults( mfxVideoParam& par , const Defaults::Param& defPar , bool bExternalFrameAllocator); void SetSH( const ExtBuffer::Param& par , eMFXHWType hw , const EncodeCapsAv1& caps , SH& sh); void SetFH( const ExtBuffer::Param& par , eMFXHWType hw , const SH& sh , FH& fh); void ConfigureTask( TaskCommonPar & task , const Defaults::Param& dflts , IAllocation& recPool); mfxStatus GetCurrentFrameHeader( const TaskCommonPar& task , const Defaults::Param& dflts , const SH& sps , const FH& pps , FH & s) const; TTaskIt ReorderWrap(const ExtBuffer::Param & par, TTaskIt begin, TTaskIt end, bool flush); static mfxU32 GetRawBytes(const Defaults::Param& par); static bool IsInVideoMem(const mfxVideoParam& par); static bool HaveRABFrames(const mfxVideoParam& par) { return par.mfx.GopPicSize > 2 && par.mfx.GopRefDist > 1; } mfxU16 GetMaxRaw(const mfxVideoParam& par) { // Extend extra Raw for frames buffered between LA submit and LA Query stage const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxU16 extRaw = pCO2 ? pCO2->LookAheadDepth : 0; mfxU16 numRaw = par.AsyncDepth + par.mfx.GopRefDist + (par.AsyncDepth > 1) + extRaw; if (par.mfx.GopRefDist > 0) numRaw--; return numRaw; } mfxU16 GetMaxRec(StorageR& strg, const mfxVideoParam& par) { if (!HaveRABFrames(par)) return par.AsyncDepth + par.mfx.NumRefFrame + (par.AsyncDepth > 1); auto dflts = GetRTDefaults(strg); return par.AsyncDepth + dflts.base.GetNumBPyramidLayers(dflts) + par.mfx.NumRefFrame + 2; } mfxU16 GetMaxBS(StorageR& strg, const mfxVideoParam& par) { if (!HaveRABFrames(par)) return par.AsyncDepth + (par.AsyncDepth > 1); auto dflts = GetRTDefaults(strg); return par.AsyncDepth + dflts.base.GetNumBPyramidLayers(dflts) + 2; } bool GetRecInfo( const mfxVideoParam& par , const mfxExtCodingOption3& CO3 , eMFXHWType hw , mfxFrameInfo& rec); mfxU32 GetMinBsSize( const mfxVideoParam & par , const mfxExtAV1ResolutionParam& rsPar , const mfxExtCodingOption3& CO3); }; bool MapToDefinedLevel(mfxU16& level); inline void SetDefaultFrameInfo(mfxU32& frameWidth, mfxU32& frameHeight, mfxFrameInfo& fi) { if (frameWidth) SetDefault(fi.CropW, std::min(mfxU32(fi.Width), frameWidth)); else { SetDefault(fi.CropW, fi.Width); SetDefault(frameWidth, fi.CropW); } if (frameHeight) SetDefault(fi.CropH, std::min(mfxU32(fi.Height), frameHeight)); else { SetDefault(fi.CropH, fi.Height); SetDefault(frameHeight, fi.CropH); } } } //Base } //namespace AV1EHW #endif av1ehw_base_general_defaults.cpp000066400000000000000000001225271443134507600357270ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfx_enc_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_general.h" #include "av1ehw_base_data.h" #include "av1ehw_base_constraints.h" #include #include namespace AV1EHW { namespace Base { class GetDefault { private: inline static void TuneCDEFLowQP(uint32_t* strength, int32_t qp) { if (!(qp < 90)) assert(false && "Only called if qp < 90"); strength[0] = 5; strength[1] = 41; strength[3] = 6; strength[5] = 16; } inline static void TuneCDEFHighQP( CdefParams& cdef , uint32_t* strength , int32_t qp) { if (!(qp > 140)) assert(false && "Only called if qp > 140"); cdef.cdef_bits = 2; strength[1] = 63; if (qp > 210) { cdef.cdef_bits = 1; strength[0] = 0; } } inline static void TuneCDEFMediumQP( const FH& bs_fh , CdefParams& cdef , uint32_t* strength , int32_t qp) { if (!(qp > 130 && qp <= 140)) assert(false && "Only called if qp > 130 && qp <= 140"); cdef.cdef_bits = 2; strength[1] = 63; if (bs_fh.FrameWidth < 1600 && bs_fh.FrameHeight < 1600) strength[3] = 1; else strength[3] = 32; } public: static mfxU16 CodedPicAlignment( Defaults::TChain::TExt , const Defaults::Param& par) { (void)par; return mfxU16(8); } static mfxU16 CodedPicWidth( Defaults::TChain::TExt , const Defaults::Param& par) { const auto& fi = par.mvp.mfx.FrameInfo; const bool bCropsValid = fi.CropW > 0 && (fi.CropW + fi.CropX <= fi.Width); const mfxU16 W = mfxU16(bCropsValid * (fi.CropW + fi.CropX) + !bCropsValid * fi.Width); return mfx::align2_value(W, par.base.GetCodedPicAlignment(par)); } static mfxU16 CodedPicHeight( Defaults::TChain::TExt , const Defaults::Param& par) { const auto& fi = par.mvp.mfx.FrameInfo; const bool bCropsValid = fi.CropH > 0 && (fi.CropH + fi.CropY <= fi.Height); const mfxU16 H = mfxU16(bCropsValid * (fi.CropH + fi.CropY) + !bCropsValid * fi.Height); return mfx::align2_value(H, par.base.GetCodedPicAlignment(par)); } static mfxU16 GopPicSize( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.GopPicSize) { return par.mvp.mfx.GopPicSize; } return mfxU16(DEFAULT_GOP_PIC_SIZE); } static mfxU16 GopRefDist( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.GopRefDist) { return par.mvp.mfx.GopRefDist; } return std::min(DEFAULT_GOP_REF_DIST, par.base.GetGopPicSize(par) - 1); } static mfxU16 NumBPyramidLayers( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 refB = (par.base.GetGopRefDist(par) - 1) / 2; mfxU16 x = refB; while (x > 2) { x = (x - 1) / 2; refB -= x; } return refB + 1; } static mfxU16 NumRefBPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 NumRefActiveP[8], NumRefActiveBL0[8], NumRefActiveBL1[8]; mfxU16 NumLayers = par.base.GetNumBPyramidLayers(par); mfxU16 NumRefFrame = par.base.GetMinRefForBPyramid(par); bool bExternalNRef = par.base.GetNumRefActive(par, &NumRefActiveP, &NumRefActiveBL0, &NumRefActiveBL1); SetIf(NumRefFrame, bExternalNRef, [&]() -> mfxU16 { auto maxBL0idx = std::max_element(NumRefActiveBL0, NumRefActiveBL0 + NumLayers) - NumRefActiveBL0; auto maxBL1idx = std::max_element(NumRefActiveBL1, NumRefActiveBL1 + NumLayers) - NumRefActiveBL1; mfxU16 maxBL0 = mfxU16((NumRefActiveBL0[maxBL0idx] + maxBL0idx + 1) * (maxBL0idx < NumLayers)); mfxU16 maxBL1 = mfxU16((NumRefActiveBL1[maxBL1idx] + maxBL1idx + 1) * (maxBL1idx < NumLayers)); return std::max({ NumRefFrame, NumRefActiveP[0], maxBL0, maxBL1 }); }); // Need to have one more DPB buffer slot to enable two L0 for non-ref B frames in AV1 if (*std::max_element(NumRefActiveBL0, NumRefActiveBL0 + NumLayers) == 2) { NumRefFrame++; } return NumRefFrame; } static mfxU16 NumRefNoPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 NumRefActiveP[8], NumRefActiveBL0[8], NumRefActiveBL1[8]; par.base.GetNumRefActive(par, &NumRefActiveP, &NumRefActiveBL0, &NumRefActiveBL1); const mfxU16 RefActiveP = *std::max_element(NumRefActiveP, NumRefActiveP + mfx::size(NumRefActiveP)); const mfxU16 RefActiveBL0 = *std::max_element(NumRefActiveBL0, NumRefActiveBL0 + mfx::size(NumRefActiveBL0)); const mfxU16 RefActiveBL1 = *std::max_element(NumRefActiveBL1, NumRefActiveBL1 + mfx::size(NumRefActiveBL1)); return mfxU16((par.base.GetGopRefDist(par) > 1) ? std::max(RefActiveP, RefActiveBL0 + RefActiveBL1) : RefActiveP); } static mfxU16 NumRefFrames( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.NumRefFrame) { return par.mvp.mfx.NumRefFrame; } mfxU16 numRef = 0; if ((par.base.GetBRefType(par) == MFX_B_REF_PYRAMID)) { numRef = par.base.GetNumRefBPyramid(par); } else { numRef = par.base.GetNumRefNoPyramid(par); } mfxU16 numTL = par.base.GetNumTemporalLayers(par); numRef = std::min(std::max(numRef, numTL - 1), NUM_REF_FRAMES); return numRef; } static mfxU16 MinRefForBPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { return par.base.GetNumBPyramidLayers(par) + 1; } static mfxU16 MinRefForBNoPyramid( Defaults::TChain::TExt , const Defaults::Param& /*par*/) { return 2; } static bool NumRefActive( Defaults::TGetNumRefActive::TExt , const Defaults::Param& par , mfxU16(*pP)[8] , mfxU16(*pBL0)[8] , mfxU16(*pBL1)[8]) { bool bExternal = false; const mfxU16 numRefByTU[3][7] = { { 2, 2, 2, 2, 2, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1 } }; mfxU16 maxP = 0, maxBL0 = 0, maxBL1 = 0; std::tie(maxP, maxBL0, maxBL1) = par.base.GetMaxNumRef(par); // Get default active ref frame number mfxU16 tu = par.mvp.mfx.TargetUsage; CheckRangeOrSetDefault(tu, 1, 7, DEFAULT_TARGET_USAGE); mfxU16 defaultP = 0, defaultBL0 = 0, defaultBL1 = 0; std::tie(defaultP, defaultBL0, defaultBL1) = std::make_tuple( std::min(numRefByTU[0][tu - 1], maxP) , std::min(numRefByTU[1][tu - 1], maxBL0) , std::min(numRefByTU[2][tu - 1], maxBL1)); auto SetDefaultNRef = [](const mfxU16(*extRef)[8], mfxU16 defaultRef, mfxU16(*NumRefActive)[8]) { bool bExternal = false; if (!NumRefActive) { return bExternal; } if (!extRef) { std::fill_n(*NumRefActive, 8, defaultRef); return bExternal; } std::transform( *extRef , std::end(*extRef) , *NumRefActive , [&](mfxU16 ext) { bExternal |= !!ext; defaultRef *= !bExternal; SetDefault(defaultRef, ext); return defaultRef; }); return bExternal; }; const mfxU16(*extRefP)[8] = nullptr; const mfxU16(*extRefBL0)[8] = nullptr; const mfxU16(*extRefBL1)[8] = nullptr; if (const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp)) { extRefP = &pCO3->NumRefActiveP; extRefBL0 = &pCO3->NumRefActiveBL0; extRefBL1 = &pCO3->NumRefActiveBL1; } bExternal |= SetDefaultNRef(extRefP, defaultP, pP); bExternal |= SetDefaultNRef(extRefBL0, defaultBL0, pBL0); bExternal |= SetDefaultNRef(extRefBL1, defaultBL1, pBL1); return bExternal; } static mfxU16 BRefType( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); if (pCO2 && pCO2->BRefType) return pCO2->BRefType; // In the future it might be turned on by default const mfxU16 BPyrCand[2] = { mfxU16(MFX_B_REF_OFF), mfxU16(MFX_B_REF_PYRAMID) }; bool bValid = par.base.GetGopRefDist(par) > 3 && (par.mvp.mfx.NumRefFrame == 0 || par.base.GetMinRefForBPyramid(par) <= par.mvp.mfx.NumRefFrame); return BPyrCand[bValid]; } static mfxU16 PRefType( Defaults::TChain::TExt , const Defaults::Param&) { return MFX_P_REF_SIMPLE; } static std::tuple FrameRate( Defaults::TChain>::TExt , const Defaults::Param& par) { const auto& fi = par.mvp.mfx.FrameInfo; if (fi.FrameRateExtN && fi.FrameRateExtD) { return std::make_tuple(fi.FrameRateExtN, fi.FrameRateExtD); } mfxU32 frN = 30, frD = 1; mfxF64 frMax = 30.0; if (par.mvp.mfx.CodecLevel) { const auto res = GetRealResolution(par.mvp); frMax = GetMaxFrameRateByLevel(par.mvp.mfx.CodecLevel, std::get<0>(res), std::get<1>(res)); } const bool bFrByLevel = frN > (frMax * frD); frN = mfxU32(frN * !bFrByLevel + (frMax * 1001) * bFrByLevel); frD = mfxU32(frD * !bFrByLevel + 1001 * bFrByLevel); return std::make_tuple(frN, frD); } static mfxU16 BitDepthLuma( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.FrameInfo.BitDepthLuma) { return par.mvp.mfx.FrameInfo.BitDepthLuma; } const auto FourCC = par.mvp.mfx.FrameInfo.FourCC; const bool b4CCMax10 = FourCC == MFX_FOURCC_A2RGB10 || FourCC == MFX_FOURCC_P010 || FourCC == MFX_FOURCC_P210 || FourCC == MFX_FOURCC_Y210 || FourCC == MFX_FOURCC_Y410; return mfxU16(8 + 2 * b4CCMax10); } static mfxU16 TargetBitDepthLuma( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); if (pCO3 && pCO3->TargetBitDepthLuma) { return pCO3->TargetBitDepthLuma; } return par.base.GetBitDepthLuma(par); } static mfxU16 TargetChromaFormatPlus1( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); if (pCO3 && pCO3->TargetChromaFormatPlus1) { return pCO3->TargetChromaFormatPlus1; } //For RGB4 use illogical default 420 for backward compatibility if (par.mvp.mfx.FrameInfo.FourCC == MFX_FOURCC_RGB4 || par.mvp.mfx.FrameInfo.FourCC == MFX_FOURCC_BGR4) { return mfxU16(MFX_CHROMAFORMAT_YUV420 + 1); } return par.mvp.mfx.FrameInfo.ChromaFormat + 1; } static mfxU32 TargetKbps( Defaults::TChain::TExt , const Defaults::Param& defPar) { const auto& mfx = defPar.mvp.mfx; // TargetKbps/ICQFactor are placed in the same union in sturct mfxInfoMFX, // While in ICQ, union of TargetKbps/ICQFactor is only for ICQFactor and TargetKbps will be calculated later. if (mfx.TargetKbps && mfx.RateControlMethod != MFX_RATECONTROL_ICQ) { return mfx.TargetKbps * std::max(1, mfx.BRCParamMultiplier); } mfxU32 frN = 0, frD = 0, maxKbps = 0xffffffff; SetIf(maxKbps, !!mfx.CodecLevel, [&]() { return GetMaxKbpsByLevel(mfx.CodecLevel, mfx.CodecProfile); }); mfxU32 rawBits = General::GetRawBytes(defPar) << 3; std::tie(frN, frD) = defPar.base.GetFrameRate(defPar); // Set a large default value for TargetKbps when ICQ enalbed // In the future it might be tuned if (mfx.RateControlMethod == MFX_RATECONTROL_ICQ) { return std::min(maxKbps, static_cast(static_cast(rawBits) * frN / frD / 50000)); } return std::min(maxKbps, static_cast(static_cast(rawBits) * frN / frD / 150000)); } static mfxU32 MaxKbps( Defaults::TChain::TExt , const Defaults::Param& par) { const auto& mfx = par.mvp.mfx; if (mfx.MaxKbps && mfx.RateControlMethod != MFX_RATECONTROL_CQP && mfx.RateControlMethod != MFX_RATECONTROL_CBR) { return mfx.MaxKbps * std::max(1, mfx.BRCParamMultiplier); } return par.base.GetTargetKbps(par); } static mfxU32 BufferSizeInKB( Defaults::TChain::TExt , const Defaults::Param& defPar) { const auto& mfx = defPar.mvp.mfx; if (mfx.BufferSizeInKB) { return mfx.BufferSizeInKB * std::max(1, mfx.BRCParamMultiplier); } bool bUseMaxKbps = mfx.RateControlMethod == MFX_RATECONTROL_CBR || mfx.RateControlMethod == MFX_RATECONTROL_VBR; mfxU32 minSize = bUseMaxKbps * InitialDelayInKB(mfx); mfxU32 defaultSize = 0; auto GetFromMaxKbps = [&]() { return defPar.base.GetMaxKbps(defPar) / 4; }; auto GetFromRawBytes = [&]() { return General::GetRawBytes(defPar) / 1000; }; SetIf(defaultSize, bUseMaxKbps, GetFromMaxKbps); SetDefault(defaultSize, GetFromRawBytes); return std::max(minSize, defaultSize); } static std::tuple MaxNumRef( Defaults::TChain>::TExt , const Defaults::Param& par) { return std::make_tuple( par.caps.MaxNum_ReferenceL0_P , par.caps.MaxNum_ReferenceL0_B , par.caps.MaxNum_ReferenceL1_B); } static mfxU16 RateControlMethod( Defaults::TChain< mfxU16>::TExt , const Defaults::Param& par) { if (par.mvp.mfx.RateControlMethod) { return par.mvp.mfx.RateControlMethod; } return mfxU16(MFX_RATECONTROL_CQP); } static mfxU8 MinQPMFX( Defaults::TChain< mfxU16>::TExt , const Defaults::Param& /*par*/) { return mfxU8(AV1_MIN_Q_INDEX); } static mfxU8 MaxQPMFX( Defaults::TChain::TExt , const Defaults::Param& /*par*/) { return mfxU8(AV1_MAX_Q_INDEX); } static std::tuple QPMFX( Defaults::TChain>::TExt , const Defaults::Param& par) { bool bCQP = (par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP); mfxU16 QPI = bCQP * par.mvp.mfx.QPI; mfxU16 QPP = bCQP * par.mvp.mfx.QPP; mfxU16 QPB = bCQP * par.mvp.mfx.QPB; if (bCQP) return std::make_tuple(QPI, QPP, QPB); else { bool bValid = ((QPI) && (QPP) && (QPB)); if (bValid) return std::make_tuple(QPI, QPP, QPB); const auto minQP = par.base.GetMinQPMFX(par); const auto maxQP = par.base.GetMaxQPMFX(par); SetDefault(QPI, std::max(minQP, (maxQP + 1) / 2)); SetDefault(QPP, std::min(QPI + 5, maxQP)); SetDefault(QPB, std::min(QPP + 5, maxQP)); return std::make_tuple(QPI, QPP, QPB); } } static void QPOffset( Defaults::TGetQPOffset::TExt , const Defaults::Param& par , mfxU16& EnableQPOffset , mfxI16(&QPOffset)[8]) { if (EnableQPOffset == MFX_CODINGOPTION_UNKNOWN) { const bool bCQP = par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP; const mfxU16 GopRefDist = par.base.GetGopRefDist(par); const bool bBPyr = GopRefDist > 1 && par.base.GetBRefType(par) == MFX_B_REF_PYRAMID; EnableQPOffset = Bool2CO(bCQP && bBPyr); if (IsOn(EnableQPOffset)) { const mfxI16 QPX = std::get<2>(par.base.GetQPMFX(par)); const mfxI16 minQPOffset = mfxI16(AV1_MIN_Q_INDEX - QPX); const mfxI16 maxQPOffset = mfxI16(AV1_MAX_Q_INDEX - QPX); mfxI16 i = 0; std::generate_n(QPOffset, 8 , [&]() { return mfx::clamp(DEFAULT_BPYR_QP_OFFSETS[i++], minQPOffset, maxQPOffset); }); } } } static mfxU16 Profile( Defaults::TChain::TExt , const Defaults::Param& par) { bool bPassThrough = !!par.mvp.mfx.CodecProfile; mfxU16 bd = 0, cf = 0; SetIf(bd, !bPassThrough, [&]() { return par.base.GetTargetBitDepthLuma(par); }); SetIf(cf, !bPassThrough, [&]() { return mfxU16(par.base.GetTargetChromaFormatPlus1(par) - 1); }); bool bRext444 = !bPassThrough && (cf == MFX_CHROMAFORMAT_YUV444); bool bMain10 = !bPassThrough && !bRext444 && bd == 10; bool bMain = !bPassThrough && !bRext444 && !bMain10; return bPassThrough * par.mvp.mfx.CodecProfile + bRext444 * MFX_PROFILE_AV1_HIGH + bMain10 * MFX_PROFILE_AV1_MAIN + bMain * MFX_PROFILE_AV1_MAIN; } static mfxU16 AsyncDepth( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.AsyncDepth) { return par.mvp.AsyncDepth; } return 5; } static mfxU8 NumReorderFrames( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxU8 GopRefDist = mfxU8(par.base.GetGopRefDist(par)); if (GopRefDist < 2) return 0; const bool bBPyramid = (par.base.GetBRefType(par) == MFX_B_REF_PYRAMID); if (!bBPyramid) return 1; mfxU8 BFrameRate = GopRefDist - 1; mfxU8 n = 0; while (BFrameRate) { BFrameRate >>= 1; n++; } return n; } static bool NonStdReordering( Defaults::TChain::TExt , const Defaults::Param& par) { return par.mvp.mfx.EncodedOrder && par.mvp.mfx.NumRefFrame > 2; } static mfxU16 FrameType( Defaults::TGetFrameType::TExt , const Defaults::Param& par , mfxU32 displayOrder , mfxU32 lastKeyFrame , mfxGopHints GopHints) { mfxU32 gopPicSize = par.mvp.mfx.GopPicSize; mfxU32 gopRefDist = GopHints.MiniGopSize ? std::min(GopHints.MiniGopSize, par.mvp.mfx.GopRefDist) : par.mvp.mfx.GopRefDist; mfxU32 idrPicDist = gopPicSize * (par.mvp.mfx.IdrInterval); //infinite GOP SetIf(idrPicDist, gopPicSize == 0xffff, 0xffffffff); SetIf(gopPicSize, gopPicSize == 0xffff, 0xffffffff); mfxU32 fo = displayOrder - lastKeyFrame; bool bIdr = (fo % gopPicSize == 0); bool bPRef = !bIdr && ( (fo % gopPicSize % gopRefDist == 0) || ((fo + 1) % gopPicSize == 0)); bool bB = !(bPRef || bIdr); mfxU16 ft = GopHints.FrameType ? GopHints.FrameType : bIdr * (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR) + bPRef * (MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF) + bB * (MFX_FRAMETYPE_B); return ft; } static mfxU16 MBBRC( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bPassThrough = pCO2 && pCO2->MBBRC; bool bON = bPassThrough && IsOn(pCO2->MBBRC); bool bOFF = bPassThrough && IsOff(pCO2->MBBRC); bOFF |= !bPassThrough && ( par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP || ::IsSWBRCMode(par.mvp) || IsOn(par.mvp.mfx.LowPower)); return mfxU16( bON * MFX_CODINGOPTION_ON + bOFF * MFX_CODINGOPTION_OFF); } class TemporalLayers { public: TemporalLayers() = delete; TemporalLayers(const mfxExtTemporalLayers& tl) { SetTL(tl); } ~TemporalLayers() {} void SetTL(mfxExtTemporalLayers const & tl) { m_numTL = 0; memset(&m_TL, 0, sizeof(m_TL)); m_TL[0].Scale = 1; for (mfxU8 i = 0; i < tl.NumLayers; i++) { if (tl.Layers[i].FrameRateScale) { m_TL[m_numTL].TId = i; m_TL[m_numTL].Scale = (mfxU8)tl.Layers[i].FrameRateScale; m_numTL++; } } m_numTL = std::max(m_numTL, 1); } mfxU8 GetTId(mfxU32 frameOrder) const { mfxU16 i; if (m_numTL < 1 || m_numTL > 8) return 0; for (i = 0; i < m_numTL && (frameOrder % (m_TL[m_numTL - 1].Scale / m_TL[i].Scale)); i++); return (i < m_numTL) ? m_TL[i].TId : 0; } mfxU8 HighestTId() const { mfxU8 htid = m_TL[m_numTL - 1].TId; return mfxU8(htid + !htid * -1); } private: mfxU8 m_numTL; struct { mfxU8 TId = 0; mfxU8 Scale = 0; }m_TL[8]; }; static mfxU8 GetTId( const Defaults::Param& par , mfxU32 fo) { const mfxExtTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) return 0; return TemporalLayers(*pTemporalLayers).GetTId(fo); } static mfxU16 NumTemporalLayers( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) { return 1; } return CountTL(*pTemporalLayers); } static mfxU8 GetHighestTId( const Defaults::Param& par) { const mfxExtTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) return mfxU8(-1); return TemporalLayers(*pTemporalLayers).HighestTId(); } static mfxStatus PreReorderInfo( Defaults::TGetPreReorderInfo::TExt , const Defaults::Param& par , FrameBaseInfo& fi , const mfxFrameSurface1* pSurfIn , const mfxEncodeCtrl* pCtrl , mfxU32 prevKeyFrameOrder , mfxU32 frameOrder , mfxGopHints GopHints) { mfxU16 ftype = 0; auto SetFrameTypeFromGOP = [&]() { return Res2Bool(ftype, par.base.GetFrameType(par, frameOrder, prevKeyFrameOrder, GopHints)); }; auto SetFrameTypeFromCTRL = [&]() { return Res2Bool(ftype, pCtrl->FrameType); }; auto ForceIdr = [&]() { return Res2Bool(ftype, mfxU16(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR)); }; auto SetFrameOrderFromSurf = [&]() { frameOrder = pSurfIn->Data.FrameOrder; return true; }; bool bFrameInfoValid = (par.mvp.mfx.EncodedOrder && SetFrameOrderFromSurf() && SetFrameTypeFromCTRL() ) || (pCtrl && IsI(pCtrl->FrameType) && ForceIdr()) || SetFrameTypeFromGOP(); MFX_CHECK(bFrameInfoValid, MFX_ERR_UNDEFINED_BEHAVIOR); fi.DisplayOrderInGOP = !IsI(ftype) * (frameOrder - prevKeyFrameOrder); fi.FrameType = ftype; fi.TemporalID = !IsI(ftype) * GetTId(par, fi.DisplayOrderInGOP); bool bForceNonRef = IsRef(ftype) && fi.TemporalID == GetHighestTId(par); fi.FrameType &= ~mfxU16(bForceNonRef * MFX_FRAMETYPE_REF); if (IsP(ftype)) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); fi.isLDB = IsOn(CO3.GPB); } return MFX_ERR_NONE; } static void LoopFilterLevels( Defaults::TGetLoopFilterLevels::TExt , const Defaults::Param& par , FH& bs_fh) { int32_t levelY = 0xff; int32_t levelUV = 0xff; //for BRC cases place holder values are set to have correct PPS-header, //because when [0] and [1] are zeroes header is of different size if (par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { const int32_t qp = bs_fh.quantization_params.base_q_idx; int32_t loopFilterLevelFormulaType = 2; // 0 for old formula, 2 for new formula if (loopFilterLevelFormulaType == 2) { levelY = LoopFilterLevelsLuma[qp]; levelUV = LoopFilterLevelsChroma[qp]; } else { if (qp < 150) levelY = qp / 6; else levelY = (int32_t)(qp * 0.38 - 32); levelY = std::min(levelY, 63); levelUV = levelY; } } auto& lp = bs_fh.loop_filter_params; lp.loop_filter_level[0] = levelY; lp.loop_filter_level[1] = levelY; lp.loop_filter_level[2] = levelUV; lp.loop_filter_level[3] = levelUV; } static void CDEF( Defaults::TGetCDEF::TExt , FH& bs_fh) { const int32_t qp = bs_fh.quantization_params.base_q_idx; uint32_t YStrengths[CDEF_MAX_STRENGTHS]; YStrengths[0] = 36; YStrengths[1] = 50; YStrengths[2] = 0; YStrengths[3] = 24; YStrengths[4] = 8; YStrengths[5] = 17; YStrengths[6] = 4; YStrengths[7] = 9; auto& cdef = bs_fh.cdef_params; cdef.cdef_bits = 3; if (qp < 90) TuneCDEFLowQP(YStrengths, qp); else if (qp > 140) TuneCDEFHighQP(cdef, YStrengths, qp); else if (qp > 130) TuneCDEFMediumQP(bs_fh, cdef, YStrengths, qp); if (bs_fh.FrameWidth < 1600 && bs_fh.FrameHeight < 1600) YStrengths[3] = 5; for (int i = 0; i < CDEF_MAX_STRENGTHS; i++) { cdef.cdef_y_pri_strength[i] = YStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_y_sec_strength[i] = YStrengths[i] % CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_pri_strength[i] = YStrengths[i] / CDEF_STRENGTH_DIVISOR; cdef.cdef_uv_sec_strength[i] = YStrengths[i] % CDEF_STRENGTH_DIVISOR; } cdef.cdef_damping = (qp >> 6) + 3; } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.Get##X.Push(X); PUSH_DEFAULT(CodedPicWidth); PUSH_DEFAULT(CodedPicHeight); PUSH_DEFAULT(CodedPicAlignment); PUSH_DEFAULT(GopPicSize); PUSH_DEFAULT(GopRefDist); PUSH_DEFAULT(NumBPyramidLayers); PUSH_DEFAULT(NumRefFrames); PUSH_DEFAULT(NumRefBPyramid); PUSH_DEFAULT(NumRefNoPyramid); PUSH_DEFAULT(MinRefForBPyramid); PUSH_DEFAULT(MinRefForBNoPyramid); PUSH_DEFAULT(NumRefActive); PUSH_DEFAULT(BRefType); PUSH_DEFAULT(PRefType); PUSH_DEFAULT(FrameRate); PUSH_DEFAULT(BitDepthLuma); PUSH_DEFAULT(TargetBitDepthLuma); PUSH_DEFAULT(TargetChromaFormatPlus1); PUSH_DEFAULT(TargetKbps); PUSH_DEFAULT(MaxKbps); PUSH_DEFAULT(BufferSizeInKB); PUSH_DEFAULT(MaxNumRef); PUSH_DEFAULT(RateControlMethod); PUSH_DEFAULT(MinQPMFX); PUSH_DEFAULT(MaxQPMFX); PUSH_DEFAULT(QPMFX); PUSH_DEFAULT(QPOffset); PUSH_DEFAULT(Profile); PUSH_DEFAULT(AsyncDepth); PUSH_DEFAULT(FrameType); PUSH_DEFAULT(NumTemporalLayers); PUSH_DEFAULT(PreReorderInfo); PUSH_DEFAULT(NumReorderFrames); PUSH_DEFAULT(NonStdReordering); PUSH_DEFAULT(LoopFilterLevels); PUSH_DEFAULT(CDEF); PUSH_DEFAULT(MBBRC); #undef PUSH_DEFAULT } }; class PreCheck { public: static mfxStatus CodecId( Defaults::TPreCheck::TExt , const mfxVideoParam& in) { MFX_CHECK(in.mfx.CodecId == MFX_CODEC_AV1, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus ChromaFormat( Defaults::TPreCheck::TExt , const mfxVideoParam& in) { bool bInvalid = Check (in.mfx.FrameInfo.ChromaFormat); MFX_CHECK(!bInvalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.PreCheck##X.Push(X); PUSH_DEFAULT(CodecId); PUSH_DEFAULT(ChromaFormat); #undef PUSH_DEFAULT } }; class CheckAndFix { public: static mfxStatus Level( Defaults::TCheckAndFix::TExt , const Defaults::Param& /*dpar*/ , mfxVideoParam& par) { MFX_CHECK(par.mfx.CodecLevel, MFX_ERR_NONE); mfxU32 invalid = 0; invalid += SetIf(par.mfx.CodecLevel, !isValidCodecLevel(par.mfx.CodecLevel), 0); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus SurfSize( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { const mfxU16 MaxW = mfxU16(dpar.caps.MaxPicWidth); const mfxU16 MaxH = mfxU16(dpar.caps.MaxPicHeight); const mfxU16 MinW = MIN_FRAME_WIDTH; const mfxU16 MinH = MIN_FRAME_HEIGHT; auto& W = par.mfx.FrameInfo.Width; auto& H = par.mfx.FrameInfo.Height; MFX_CHECK(W, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(H, MFX_ERR_INVALID_VIDEO_PARAM); mfxU32 invalid = 0; invalid += CheckRangeOrSetDefault(W, MinW, MaxW, 0); invalid += CheckRangeOrSetDefault(H, MinH, MaxH, 0); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus Profile( Defaults::TCheckAndFix::TExt , const Defaults::Param& /*dpar*/ , mfxVideoParam& par) { bool bInvalid = CheckOrZero (par.mfx.CodecProfile); MFX_CHECK(!bInvalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus FourCC( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { mfxU32 invalid = 0; invalid += CheckOrZero (par.mfx.FrameInfo.FourCC); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); // caps check const auto& fourCC = par.mfx.FrameInfo.FourCC; const auto& csf = dpar.caps.ChromaSupportFlags; const auto& bsf = dpar.caps.BitDepthSupportFlags; invalid += (fourCC == MFX_FOURCC_NV12 && (!csf.fields.i420 || !bsf.fields.eight_bits)); invalid += (fourCC == MFX_FOURCC_P010 && (!csf.fields.i420 || !bsf.fields.ten_bits)); invalid += ((fourCC == MFX_FOURCC_RGB4 || fourCC == MFX_FOURCC_BGR4) && (!csf.fields.RGB || !bsf.fields.eight_bits)); invalid += (fourCC == MFX_FOURCC_AYUV && (!csf.fields.i444 || !bsf.fields.eight_bits)); invalid += (fourCC == MFX_FOURCC_Y410 && (!csf.fields.i444 || !bsf.fields.ten_bits)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus InputFormatByFourCC( Defaults::TCheckAndFix::TExt , const Defaults::Param& /*dpar*/ , mfxVideoParam& par) { mfxU32 invalid = 0; static const std::map> FourCCPar= { {mfxU32(MFX_FOURCC_NV12), {mfxU16(MFX_CHROMAFORMAT_YUV420), BITDEPTH_8}} , {mfxU32(MFX_FOURCC_P010), {mfxU16(MFX_CHROMAFORMAT_YUV420), BITDEPTH_10}} , {mfxU32(MFX_FOURCC_RGB4), {mfxU16(MFX_CHROMAFORMAT_YUV444), BITDEPTH_8}} , {mfxU32(MFX_FOURCC_BGR4), {mfxU16(MFX_CHROMAFORMAT_YUV444), BITDEPTH_8}} , {mfxU32(MFX_FOURCC_AYUV), {mfxU16(MFX_CHROMAFORMAT_YUV444), BITDEPTH_8}} , {mfxU32(MFX_FOURCC_Y410), {mfxU16(MFX_CHROMAFORMAT_YUV444), BITDEPTH_10}} }; auto itFourCCPar = FourCCPar.find(par.mfx.FrameInfo.FourCC); MFX_CHECK(itFourCCPar != FourCCPar.end(), MFX_ERR_UNSUPPORTED); invalid += CheckOrZero(par.mfx.FrameInfo.ChromaFormat, itFourCCPar->second[0]); invalid += CheckOrZero(par.mfx.FrameInfo.BitDepthLuma, itFourCCPar->second[1], 0); invalid += CheckOrZero(par.mfx.FrameInfo.BitDepthChroma, itFourCCPar->second[1], 0); if (par.mfx.FrameInfo.BitDepthLuma != par.mfx.FrameInfo.BitDepthChroma) { par.mfx.FrameInfo.BitDepthLuma = 0; par.mfx.FrameInfo.BitDepthChroma = 0; invalid += 1; } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus TargetChromaFormat( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxU32 invalid = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); if (!pCO3->TargetChromaFormatPlus1) { pCO3->TargetChromaFormatPlus1 = defPar.base.GetTargetChromaFormatPlus1(defPar); } invalid = pCO3->TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV422); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); //check targetChromaFormat By FourCC and profile mfxU16 profile = defPar.base.GetProfile(defPar); mfxU32 fourCC = par.mfx.FrameInfo.FourCC; static const std::map >> compatible = { {mfxU16(MFX_CHROMAFORMAT_YUV420 + 1) ,{ { mfxU16(MFX_PROFILE_AV1_MAIN), {mfxU32(MFX_FOURCC_NV12), mfxU32(MFX_FOURCC_P010), mfxU32(MFX_FOURCC_RGB4), mfxU32(MFX_FOURCC_BGR4)}} } }, {mfxU16(MFX_CHROMAFORMAT_YUV444 + 1) ,{ { mfxU16(MFX_PROFILE_AV1_HIGH), {mfxU32(MFX_FOURCC_AYUV), mfxU32(MFX_FOURCC_Y410), mfxU32(MFX_FOURCC_RGB4), mfxU32(MFX_FOURCC_BGR4)}} } } }; invalid += !compatible.count(pCO3->TargetChromaFormatPlus1) || !compatible.at(pCO3->TargetChromaFormatPlus1).count(profile); std::vector supportFourCC = compatible.at(pCO3->TargetChromaFormatPlus1).at(profile); invalid += (std::find(supportFourCC.begin(), supportFourCC.end(), fourCC) == supportFourCC.end()); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); //check targetChromaFormat by caps const auto& csf = defPar.caps.ChromaSupportFlags; invalid += (pCO3->TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV420 + 1) && (!csf.fields.i420)); invalid += (pCO3->TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV444 + 1) && (!csf.fields.i444)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus TargetBitDepth( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); bool b8bit = (pCO3->TargetBitDepthLuma == BITDEPTH_8); bool b10bit = (pCO3->TargetBitDepthLuma == BITDEPTH_10); mfxU32 invalid = (pCO3->TargetBitDepthLuma > 0) && (!(b8bit || b10bit)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); //check TargetBitDepth by caps invalid += (b8bit && !defPar.caps.BitDepthSupportFlags.fields.eight_bits); invalid += (b10bit && !defPar.caps.BitDepthSupportFlags.fields.ten_bits); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); if (pCO3->TargetBitDepthLuma != pCO3->TargetBitDepthChroma) { pCO3->TargetBitDepthLuma = 0; pCO3->TargetBitDepthChroma = 0; invalid += 1; } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus FourCCByTargetFormat( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { auto tbdl = dpar.base.GetTargetBitDepthLuma(dpar); auto tcf = dpar.base.GetTargetChromaFormatPlus1(dpar); static const std::map> Compatible[2] = { //8 { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , {MFX_FOURCC_AYUV, MFX_FOURCC_Y410, MFX_FOURCC_RGB4 , MFX_FOURCC_BGR4, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , {MFX_FOURCC_NV12, MFX_FOURCC_P010 , MFX_FOURCC_AYUV, MFX_FOURCC_Y410 , MFX_FOURCC_RGB4, MFX_FOURCC_BGR4, MFX_FOURCC_A2RGB10} } }, //10 { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , {MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , {MFX_FOURCC_P010, MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10} } }, }; bool bUndefinedTargetFormat = (tbdl != 8 && tbdl != 10) || !Compatible[tbdl == 10].count(tcf) || !Compatible[tbdl == 10].at(tcf).count(par.mfx.FrameInfo.FourCC); assert(!bUndefinedTargetFormat); par.mfx.FrameInfo.FourCC *= !bUndefinedTargetFormat; MFX_CHECK(!bUndefinedTargetFormat, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus NumRefActive( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); mfxU16 maxDPB = par.mfx.NumRefFrame + 1; SetIf(maxDPB, !par.mfx.NumRefFrame, NUM_REF_FRAMES + 1); mfxU16 maxRef[3] = {0, 0, 0}; std::tie(maxRef[0], maxRef[1], maxRef[2]) = defPar.base.GetMaxNumRef(defPar); for (mfxU16 i = 0; i < 3; i++) { maxRef[i] = std::min(maxRef[i], maxDPB - 1); } for (mfxU16 i = 0; i < 8; i++) { changed += CheckMaxOrClip(pCO3->NumRefActiveP [i], maxRef[0]); changed += CheckMaxOrClip(pCO3->NumRefActiveBL0[i], maxRef[1]); changed += CheckMaxOrClip(pCO3->NumRefActiveBL1[i], maxRef[2]); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.Check##X.Push(X); PUSH_DEFAULT(Level); PUSH_DEFAULT(SurfSize); PUSH_DEFAULT(Profile); PUSH_DEFAULT(FourCC); PUSH_DEFAULT(InputFormatByFourCC); PUSH_DEFAULT(TargetChromaFormat); PUSH_DEFAULT(TargetBitDepth); PUSH_DEFAULT(FourCCByTargetFormat); PUSH_DEFAULT(NumRefActive); #undef PUSH_DEFAULT } }; void General::PushDefaults(Defaults& df) { GetDefault::Push(df); PreCheck::Push(df); CheckAndFix::Push(df); } } } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_hdr.cpp000066400000000000000000000256721443134507600332620ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_packer.h" #include "av1ehw_base_hdr.h" using namespace AV1EHW; using namespace AV1EHW::Base; inline void SetDefaultMasteringDisplayColourVolume(mfxExtMasteringDisplayColourVolume* pMDCV) { SetDefault(pMDCV->MaxDisplayMasteringLuminance, 1u); SetDefault(pMDCV->MinDisplayMasteringLuminance, 1u); } inline void SetDefaultContentLightLevel(mfxExtContentLightLevelInfo* pCLLI) { SetDefault(pCLLI->MaxContentLightLevel, 1u); SetDefault(pCLLI->MaxPicAverageLightLevel, 1u); } inline mfxStatus CheckAndFixMasteringDisplayColourVolumeInfo(mfxExtMasteringDisplayColourVolume* pMDCV) { mfxU32 changed = 0; changed += CheckOrZero(pMDCV->InsertPayloadToggle); changed += CheckMaxOrClip(pMDCV->WhitePointX, 50000u); changed += CheckMaxOrClip(pMDCV->WhitePointY, 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[0], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[1], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[2], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[0], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[1], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[2], 50000u); changed += CheckMinOrClip(pMDCV->MaxDisplayMasteringLuminance, 1u); changed += CheckMaxOrClip(pMDCV->MaxDisplayMasteringLuminance, 65535u); changed += CheckMinOrClip(pMDCV->MinDisplayMasteringLuminance, 1u); changed += CheckMaxOrClip(pMDCV->MinDisplayMasteringLuminance, 65535u); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } inline mfxStatus CheckAndFixContentLightLevelInfo(mfxExtContentLightLevelInfo* pCLLI) { mfxU32 changed = 0; changed += CheckOrZero(pCLLI->InsertPayloadToggle); changed += CheckMinOrClip(pCLLI->MaxContentLightLevel, 1u); changed += CheckMaxOrClip(pCLLI->MaxContentLightLevel, 65535u); changed += CheckMinOrClip(pCLLI->MaxPicAverageLightLevel, 1u); changed += CheckMaxOrClip(pCLLI->MaxPicAverageLightLevel, 65535u); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } void Hdr::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtContentLightLevelInfo*)pSrc; auto& buf_dst = *(mfxExtContentLightLevelInfo*)pDst; MFX_COPY_FIELD(InsertPayloadToggle); MFX_COPY_FIELD(MaxContentLightLevel); MFX_COPY_FIELD(MaxPicAverageLightLevel); }); blocks.m_ebCopySupported[MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtMasteringDisplayColourVolume*)pSrc; auto& buf_dst = *(mfxExtMasteringDisplayColourVolume*)pDst; MFX_COPY_FIELD(InsertPayloadToggle); MFX_COPY_FIELD(WhitePointX); MFX_COPY_FIELD(WhitePointY); MFX_COPY_FIELD(MaxDisplayMasteringLuminance); MFX_COPY_FIELD(MinDisplayMasteringLuminance); MFX_COPY_ARRAY_FIELD(DisplayPrimariesX); MFX_COPY_ARRAY_FIELD(DisplayPrimariesY); }); } void Hdr::MetadataType(BitstreamWriter& bs, mfxU32 const value) { Leb128Data leb128 = {}; EncodeLeb128(leb128, value); const mfxU8* ptr = reinterpret_cast(&leb128.buf); for (mfxU8 i = 0; i < leb128.size; i++) bs.PutBits(8, ptr[i]); } void Hdr::PackHDR( BitstreamWriter& bs, ObuExtensionHeader const& oeh , mfxExtMasteringDisplayColourVolume const& DisplayColour) { std::vector tmpBuf(HDR_SIZE); BitstreamWriter tmpBitstream(&tmpBuf[0], HDR_SIZE); MetadataType(tmpBitstream, METADATA_TYPE_HDR_MDCV); for (int i = 0; i < 3; i++) { tmpBitstream.PutBits(16, DisplayColour.DisplayPrimariesX[i]); tmpBitstream.PutBits(16, DisplayColour.DisplayPrimariesY[i]); } tmpBitstream.PutBits(16, DisplayColour.WhitePointX); tmpBitstream.PutBits(16, DisplayColour.WhitePointY); tmpBitstream.PutBits(32, DisplayColour.MaxDisplayMasteringLuminance); tmpBitstream.PutBits(32, DisplayColour.MinDisplayMasteringLuminance); tmpBitstream.PutTrailingBits(); const bool obu_extension_flag = oeh.temporal_id | oeh.spatial_id; Packer::PackOBUHeader(bs, OBU_METADATA, obu_extension_flag, oeh); mfxU32 const obu_size_in_bytes = (tmpBitstream.GetOffset() + 7) / 8; Packer::PackOBUHeaderSize(bs, obu_size_in_bytes); bs.PutBitsBuffer(tmpBitstream.GetOffset(), tmpBitstream.GetStart()); } void Hdr::PackHDR( BitstreamWriter& bs, ObuExtensionHeader const& oeh , mfxExtContentLightLevelInfo const& LightLevel) { std::vector tmpBuf(HDR_SIZE); BitstreamWriter tmpBitstream(&tmpBuf[0], HDR_SIZE); MetadataType(tmpBitstream, METADATA_TYPE_HDR_CLL); tmpBitstream.PutBits(16, LightLevel.MaxContentLightLevel); tmpBitstream.PutBits(16, LightLevel.MaxPicAverageLightLevel); tmpBitstream.PutTrailingBits(); const bool obu_extension_flag = oeh.temporal_id | oeh.spatial_id; Packer::PackOBUHeader(bs, OBU_METADATA, obu_extension_flag, oeh); mfxU32 const obu_size_in_bytes = (tmpBitstream.GetOffset() + 7) / 8; Packer::PackOBUHeaderSize(bs, obu_size_in_bytes); bs.PutBitsBuffer(tmpBitstream.GetOffset(), tmpBitstream.GetStart()); } void Hdr::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaultsMDCV , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(par); MFX_CHECK(pMDCV, MFX_ERR_NONE); SetDefaultMasteringDisplayColourVolume(pMDCV); return MFX_ERR_NONE; }); Push(BLK_SetDefaultsCLLI , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(par); MFX_CHECK(pCLLI, MFX_ERR_NONE); SetDefaultContentLightLevel(pCLLI); return MFX_ERR_NONE; }); } void Hdr::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFixMDCV , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(par); MFX_CHECK(pMDCV, MFX_ERR_NONE); return CheckAndFixMasteringDisplayColourVolumeInfo(pMDCV); }); Push(BLK_CheckAndFixCLLI , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(par); MFX_CHECK(pCLLI, MFX_ERR_NONE); return CheckAndFixContentLightLevelInfo(pCLLI); }); } void Hdr::InitTask(const FeatureBlocks& blocks, TPushIT Push) { Push(BLK_InitTaskMDCV , [this, &blocks]( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& /*global*/ , StorageW& task) -> mfxStatus { mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(Task::Common::Get(task).ctrl); MFX_CHECK(pMDCV, MFX_ERR_NONE); SetDefaultMasteringDisplayColourVolume(pMDCV); return CheckAndFixMasteringDisplayColourVolumeInfo(pMDCV); }); Push(BLK_InitTaskCLLI , [this, &blocks]( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& /*global*/ , StorageW& task) -> mfxStatus { mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(Task::Common::Get(task).ctrl); MFX_CHECK(pCLLI, MFX_ERR_NONE); SetDefaultContentLightLevel(pCLLI); return CheckAndFixContentLightLevelInfo(pCLLI); }); } void Hdr::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_InsertPayloads , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); const mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(task.ctrl); bool bInsertMDCV = false; if (pMDCV != NULL) { bInsertMDCV = true; } const mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(task.ctrl); bool bInsertCLLI = false; if (pCLLI != NULL) { bInsertCLLI = true; } mfxVideoParam& videoParam = Glob::VideoParam::Get(global); SetDefault(pMDCV, (const mfxExtMasteringDisplayColourVolume*)ExtBuffer::Get(videoParam)); SetDefault(pCLLI, (const mfxExtContentLightLevelInfo*)ExtBuffer::Get(videoParam)); bInsertMDCV |= (pMDCV->InsertPayloadToggle == MFX_PAYLOAD_IDR) && (task.FrameType & MFX_FRAMETYPE_IDR); bInsertCLLI |= (pCLLI->InsertPayloadToggle == MFX_PAYLOAD_IDR) && (task.FrameType & MFX_FRAMETYPE_IDR); MFX_CHECK(bInsertMDCV || bInsertCLLI, MFX_ERR_NONE); BitstreamWriter bs(m_buf.data(), (mfxU32)m_buf.size(), 0); PackedHeaders& ph = Glob::PackedHeaders::Get(global); ObuExtensionHeader oeh = { task.TemporalID, 0 }; mfxU8* start = bs.GetStart(); mfxU32 headerOffset = bs.GetOffset(); if (bInsertMDCV) { PackHDR(bs, oeh, *pMDCV); } if (bInsertCLLI) { PackHDR(bs, oeh, *pCLLI); } task.Offsets.HDRHeaderByteOffset = (bs.GetOffset() >> 3); ph.HDR.pData = start + headerOffset / 8; ph.HDR.BitLen = bs.GetOffset() - headerOffset; assert(ph.HDR.BitLen % 8 == 0); task.InsertHeaders |= INSERT_HDR; return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_hdr.h000066400000000000000000000055261443134507600327230ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { enum { METADATA_TYPE_HDR_CLL = 0x0001, METADATA_TYPE_HDR_MDCV = 0x0002, }; class Hdr : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFixMDCV)\ DECL_BLOCK(CheckAndFixCLLI)\ DECL_BLOCK(SetDefaultsMDCV)\ DECL_BLOCK(SetDefaultsCLLI)\ DECL_BLOCK(InitTaskMDCV)\ DECL_BLOCK(InitTaskCLLI)\ DECL_BLOCK(InsertPayloads) #define DECL_FEATURE_NAME "Base_Hdr" #include "av1ehw_decl_blocks.h" Hdr(mfxU32 FeatureId) : FeatureBase(FeatureId) {} static const mfxU32 HDR_SIZE = 128; protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; void PackHDR(BitstreamWriter& bs, const ObuExtensionHeader& oeh, const mfxExtContentLightLevelInfo& LightLevel); void PackHDR(BitstreamWriter& bs, const ObuExtensionHeader& oeh, const mfxExtMasteringDisplayColourVolume& DisplayColour); void MetadataType(BitstreamWriter& bs, mfxU32 const value); std::array m_buf; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_iddi.h000066400000000000000000000047771443134507600330660ustar00rootroot00000000000000// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" namespace AV1EHW { namespace Base { class IDDI : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetCallChains) \ DECL_BLOCK(SetDDIID) \ DECL_BLOCK(QueryCORE) \ DECL_BLOCK(QueryCaps) \ DECL_BLOCK(QueryDDI) \ DECL_BLOCK(CreateDevice) \ DECL_BLOCK(CreateService) \ DECL_BLOCK(Register) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) #define DECL_FEATURE_NAME "Base_IDDI" #include "av1ehw_decl_blocks.h" IDDI(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override = 0; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override = 0; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override = 0; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override = 0; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override = 0; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override = 0; virtual mfxStatus SetDDIID(const mfxU16 bitDepth , const mfxU16 chromFormat , const mfxU32 fourCC , const mfxU16 targetChromaForamt) = 0; }; } //Base } //namespace AV1EHW #endif av1ehw_base_iddi_packer.h000066400000000000000000000040331443134507600343150ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { class IDDIPacker : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) \ DECL_BLOCK(QueryCaps) \ DECL_BLOCK(SetCallChains) #define DECL_FEATURE_NAME "Base_IDDIPacker" #include "av1ehw_decl_blocks.h" IDDIPacker(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override = 0; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override = 0; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override = 0; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override = 0; }; } //Base } //namespace AV1EHW #endif av1ehw_base_impl.cpp000066400000000000000000000254101443134507600333550ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_impl.h" #include "av1ehw_base_data.h" #include "av1ehw_base_general.h" #include "av1ehw_base_packer.h" #include "av1ehw_base_alloc.h" #include "av1ehw_base_task.h" #include "av1ehw_base_iddi.h" #include "av1ehw_base_iddi_packer.h" #include "av1ehw_base_segmentation.h" #include "av1ehw_base_hdr.h" #if defined(MFX_ENABLE_ENCTOOLS) #include "av1ehw_base_enctools.h" #endif #include using namespace AV1EHW; using namespace AV1EHW::Base; MFXVideoENCODEAV1_HW::MFXVideoENCODEAV1_HW(VideoCORE& core) : m_core(core) , m_runtimeErr(MFX_ERR_NONE) { } void MFXVideoENCODEAV1_HW::InternalInitFeatures( mfxStatus& status , eFeatureMode mode) { status = MFX_ERR_UNKNOWN; for (auto& pFeature : m_features) pFeature->Init(mode, *this); if (mode & QUERY1 || mode & QUERY_IMPLS_DESCRIPTION || mode & QUERY_IO_SURF || mode & INIT) { Reorder( BQ::Get(*this) , { FEATURE_GENERAL, AV1EHW::Base::General::BLK_SetDefaultsCallChain } , { FEATURE_DDI, IDDI::BLK_SetDDIID } , PLACE_AFTER); } if (mode & INIT) { Reorder( BQ::Get(*this) , { FEATURE_GENERAL, General::BLK_SetDefaults } , { FEATURE_DDI, IDDI::BLK_QueryCaps }); Reorder( BQ::Get(*this) , { FEATURE_DDI, IDDI::BLK_CreateDevice } , { FEATURE_GENERAL, General::BLK_Query1NoCaps }); auto& qIA = BQ::Get(*this); Reorder(qIA , { FEATURE_GENERAL, General::BLK_AllocRec } , { FEATURE_DDI, IDDI::BLK_CreateService } , PLACE_AFTER); qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_DDI_PACKER, IDDIPacker::BLK_Init })); qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_DDI, IDDI::BLK_Register })); } status = MFX_ERR_NONE; } mfxStatus MFXVideoENCODEAV1_HW::InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) { if (!in) { return RunBlocks(IgnoreSts, BQ::Get(*this), out); } mfxStatus sts = MFX_ERR_NONE , wrn = MFX_ERR_NONE; StorageRW& strg = m_storage; strg.Insert(Glob::VideoCore::Key, new StorableRef(core)); sts = RunBlocks(CheckGE, BQ::Get(*this), *in, out, strg); MFX_CHECK(!IsErrorSts(sts), MFX_ERR_UNSUPPORTED); wrn = sts; sts = RunBlocks(CheckGE, BQ::Get(*this), *in, out, strg); MFX_CHECK(!IsErrorSts(sts), MFX_ERR_UNSUPPORTED); sts = GetWorstSts(wrn, sts); if (IsWarnSts(sts)) sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return sts; } mfxStatus MFXVideoENCODEAV1_HW::InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) { StorageRW& strg = m_storage; strg.Insert(Glob::VideoCore::Key, new StorableRef(core)); return RunBlocks(CheckGE, BQ::Get(*this), par, request, strg); } mfxStatus MFXVideoENCODEAV1_HW::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { auto& queue = BQ::Get(*this); MFX_CHECK(!queue.empty(), MFX_ERR_UNSUPPORTED); return RunBlocks(Check, queue, core, caps, ah, m_storage); } //This class is used for temporal modification of mfxVideoParam. Implementation is based on AVC codec. #if defined(MFX_ENABLE_ENCTOOLS) class ModifiedVideoParamsAV1 { public: void ModifyForDDI(mfxVideoParam & par) { if (!m_bInit) SaveParams(par); if (IsSwEncToolsOn(par)) par.mfx.RateControlMethod = MFX_RATECONTROL_CQP; } void Restore(mfxVideoParam & par) { if (!m_bInit) return; par.mfx.RateControlMethod = RateControlMethod; m_bInit = false; } private: void SaveParams(mfxVideoParam & par) { RateControlMethod = par.mfx.RateControlMethod; m_bInit = true; } bool m_bInit = false; mfxU16 RateControlMethod = 0; }; #endif mfxStatus MFXVideoENCODEAV1_HW::Init(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_storage.Empty(), MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = MFX_ERR_NONE, wrn = MFX_ERR_NONE; StorageRW local, global; global.Insert(Glob::VideoCore::Key, new StorableRef(m_core)); global.Insert(Glob::RTErr::Key, new StorableRef(m_runtimeErr)); wrn = RunBlocks(CheckGE, BQ::Get(*this), *par, global, local); MFX_CHECK(!IsErrorSts(wrn), wrn); #if defined(MFX_ENABLE_ENCTOOLS) #endif sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); MFX_CHECK(!IsErrorSts(sts), sts); wrn = GetWorstSts(sts, wrn); #if defined(MFX_ENABLE_ENCTOOLS) ModifiedVideoParamsAV1 modParams; auto& internalPar = Glob::VideoParam::Get(global); modParams.ModifyForDDI(internalPar); #endif sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); #if defined(MFX_ENABLE_ENCTOOLS) modParams.Restore(internalPar); #endif MFX_CHECK(!IsErrorSts(sts), sts); wrn = GetWorstSts(sts, wrn); m_storage = std::move(global); m_runtimeErr = MFX_ERR_NONE; for (auto& pFeature : m_features) pFeature->Init(RUNTIME, *this); { auto& queue = BQ::Get(*this); auto it = Find(queue, { FEATURE_DDI, IDDI::BLK_Reset }); if (it != queue.end()) queue.splice(queue.end(), queue, it); } { auto& queue = BQ::Get(*this); queue.splice(queue.end(), queue, Get(queue, { FEATURE_DDI_PACKER, IDDIPacker::BLK_SubmitTask })); queue.splice(queue.end(), queue, Get(queue, { FEATURE_DDI, IDDI::BLK_SubmitTask })); // FEATURE_HDR is to submit header info named OBU_METADATA and it should be inserted before PPS Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_HDR, Hdr::BLK_InsertPayloads }); #if defined(MFX_ENABLE_ENCTOOLS) Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_ENCTOOLS, AV1EncTools::BLK_GetFrameCtrl }); #endif } { auto& queue = BQ::Get(*this); auto it = Find(queue, { FEATURE_SEGMENTATION, Segmentation::BLK_ConfigureTask }); if (it != queue.end()) { Reorder(queue , { FEATURE_GENERAL, General::BLK_ConfigureTask } , { FEATURE_SEGMENTATION, Segmentation::BLK_ConfigureTask } , PLACE_AFTER); } } #if defined(MFX_ENABLE_ENCTOOLS) { auto& queue = BQ::Get(*this); Reorder(queue , { FEATURE_DDI_PACKER, IDDIPacker::BLK_QueryTask } , { FEATURE_ENCTOOLS, AV1EncTools::BLK_Update } , PLACE_AFTER); } #endif return wrn; } mfxStatus MFXVideoENCODEAV1_HW::EncodeFrameCheck( mfxEncodeCtrl *ctrl , mfxFrameSurface1 *surface , mfxBitstream *bs , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/ , MFX_ENTRY_POINT *pEntryPoint) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR2(bs, pEntryPoint); MFX_CHECK_STS(m_runtimeErr); mfxStatus sts = MFX_ERR_NONE; StorageRW local = {}; auto BreakAtSts = [](mfxStatus x) { return (x < MFX_ERR_NONE && x != MFX_ERR_MORE_DATA_SUBMIT_TASK) || x == MFX_WRN_DEVICE_BUSY; }; sts = RunBlocks(BreakAtSts, BQ::Get(*this), ctrl, surface, *bs, m_storage, local); MFX_CHECK(!BreakAtSts(sts), sts); pEntryPoint->pState = this; pEntryPoint->pRoutine = Execute; pEntryPoint->pCompleteProc = FreeResources; pEntryPoint->requiredNumThreads = 1; pEntryPoint->pParam = &Tmp::CurrTask::Get(local); return sts; } mfxStatus MFXVideoENCODEAV1_HW::Execute(mfxThreadTask ptask, mfxU32 /*uid_p*/, mfxU32 /*uid_a*/) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(ptask); MFX_CHECK_STS(m_runtimeErr); auto& task = *(StorageRW*)ptask; return RunBlocks(Check, BQ::Get(*this), m_storage, task); } mfxStatus MFXVideoENCODEAV1_HW::FreeResources(mfxThreadTask /*task*/, mfxStatus /*sts*/) { return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEAV1_HW::Close(void) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); auto sts = RunBlocks(IgnoreSts, BQ::Get(*this), m_storage); m_storage.Clear(); return sts; } mfxStatus MFXVideoENCODEAV1_HW::Reset(mfxVideoParam* par) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); mfxStatus sts = MFX_ERR_NONE, wrn = MFX_ERR_NONE; StorageRW global, local; global.Insert(Glob::VideoCore::Key, new StorableRef(m_core)); global.Insert(Glob::RealState::Key, new StorableRef(m_storage)); wrn = RunBlocks(CheckGE, BQ::Get(*this), *par, global, local); MFX_CHECK(!IsErrorSts(wrn), wrn); sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); return GetWorstSts(wrn, sts); } mfxStatus MFXVideoENCODEAV1_HW::GetVideoParam(mfxVideoParam* par) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); return RunBlocks(IgnoreSts, BQ::Get(*this), *par, m_storage); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_impl.h000066400000000000000000000125161443134507600331040ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "mfxvideo++int.h" #include "mfx_task.h" #include "av1ehw_base.h" namespace AV1EHW { namespace Base { class MFXVideoENCODEAV1_HW : public ImplBase , virtual protected FeatureBlocks { public: MFXVideoENCODEAV1_HW(VideoCORE& core); virtual ~MFXVideoENCODEAV1_HW() { Close(); } void InternalInitFeatures( mfxStatus& status , eFeatureMode mode); virtual mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus GetFrameParam(mfxFrameParam * /*par*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus GetEncodeStat(mfxEncodeStat* /*stat*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * /*ctrl*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/ , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/ , MFX_ENTRY_POINT * /*pEntryPoint*/) override; virtual mfxStatus EncodeFrame( mfxEncodeCtrl * /*ctrl*/ , mfxEncodeInternalParams * /*pInternalParams*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * /*ctrl*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/ , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus CancelFrame( mfxEncodeCtrl * /*ctrl*/ , mfxEncodeInternalParams * /*pInternalParams*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override { return MFX_TASK_THREADING_INTRA; } virtual mfxStatus InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) override; virtual mfxStatus InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) override; virtual mfxStatus QueryImplsDescription( VideoCORE& , mfxEncoderDescription::encoder& , mfx::PODArraysHolder&) override; protected: using TFeatureList = std::list>; VideoCORE& m_core; TFeatureList m_features; StorageRW m_storage; mfxStatus m_runtimeErr; mfxStatus Execute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); mfxStatus FreeResources(mfxThreadTask task, mfxStatus sts); static mfxStatus Execute(void *pState, void *task, mfxU32 uid_p, mfxU32 uid_a) { if (pState) return ((MFXVideoENCODEAV1_HW*)pState)->Execute(task, uid_p, uid_a); else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } static mfxStatus FreeResources(void *pState, void *task, mfxStatus sts) { if (pState) return ((MFXVideoENCODEAV1_HW*)pState)->FreeResources(task, sts); else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } template T& GetFeature(mfxU32 id) { using TRFeature = decltype(m_features.front()); auto it = std::find_if(m_features.begin(), m_features.end() , [id](TRFeature pFeature) { return pFeature->GetID() == id; }); ThrowAssert(it == m_features.end(), "Feature not found"); return dynamic_cast(*it->get()); } }; } //Base }// namespace AV1EHW #endif av1ehw_base_max_frame_size.cpp000066400000000000000000000104431443134507600354050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_max_frame_size.h" using namespace AV1EHW; using namespace AV1EHW::Base; void MaxFrameSize::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(MaxFrameSize); }); } void MaxFrameSize::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); MFX_CHECK(pCO2 && pCO2->MaxFrameSize, MFX_ERR_NONE); auto& caps = Glob::EncodeCaps::Get(global); auto& maxFrameSize = pCO2->MaxFrameSize; mfxU32 changed = 0; bool bSupported = caps.UserMaxFrameSizeSupport && !Check(par.mfx.RateControlMethod, mfxU16(MFX_RATECONTROL_VBR)); mfxU32 minSizeValid = 0; mfxU32 maxSizeValid = bSupported ? maxFrameSize : 0; if (par.mfx.FrameInfo.FrameRateExtN && par.mfx.FrameInfo.FrameRateExtD) { minSizeValid = GetAvgFrameSizeInBytes(par); maxSizeValid = bSupported ? std::max(maxSizeValid, minSizeValid) : 0; } changed += CheckMinOrClip(maxFrameSize, minSizeValid); changed += CheckMaxOrZero(maxFrameSize, maxSizeValid); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void MaxFrameSize::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO2 && pCO3 && IsOn(pCO3->LowDelayBRC), MFX_ERR_NONE); // Default vaule suggested by arch. mfxU32 avgFrameSizeInBytes = GetAvgFrameSizeInBytes(par); SetDefault(pCO2->MaxFrameSize, mfxU32(6.0 * avgFrameSizeInBytes / 5.0)); return MFX_ERR_NONE; }); } void MaxFrameSize::Reset(const FeatureBlocks& /*blocks*/, TPushR Push) { Push(BLK_Reset , []( const mfxVideoParam& /*par*/ , StorageRW& global , StorageRW& /*local*/) -> mfxStatus { auto& parOld = Glob::VideoParam::Get(Glob::RealState::Get(global)); auto& parNew = Glob::VideoParam::Get(global); mfxExtCodingOption2& CO2Old = ExtBuffer::Get(parOld); mfxExtCodingOption2& CO2New = ExtBuffer::Get(parNew); auto& hint = Glob::ResetHint::Get(global); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(parNew); hint.Flags |= RF_BRC_RESET * (( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR) && !IsOn(CO3.LowDelayBRC) && (CO2Old.MaxFrameSize != CO2New.MaxFrameSize)); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_max_frame_size.h000066400000000000000000000045041443134507600350530ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { class MaxFrameSize : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(Init)\ DECL_BLOCK(Reset)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_MaxFrameSize" #include "av1ehw_decl_blocks.h" MaxFrameSize(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& /*par*/) override {}; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII /*Push*/) override {}; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST /*Push*/) override {}; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_packer.cpp000066400000000000000000001117721443134507600336700ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_packer.h" #include "av1ehw_base_task.h" #include namespace AV1EHW { namespace Base { BitstreamWriter::BitstreamWriter(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) : m_bsStart(bs) , m_bsEnd(bs + size) , m_bs(bs) , m_bitStart(bitOffset & 7) , m_bitOffset(bitOffset & 7) , m_bitsOutstanding(0) , m_BinCountsInNALunits(0) , m_firstBitFlag(true) { assert(bitOffset < 8); *m_bs &= 0xFF << (8 - m_bitOffset); } BitstreamWriter::~BitstreamWriter() { } void BitstreamWriter::Reset(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) { if (bs) { m_bsStart = bs; m_bsEnd = bs + size; m_bs = bs; m_bitOffset = (bitOffset & 7); m_bitStart = (bitOffset & 7); } else { m_bs = m_bsStart; m_bitOffset = m_bitStart; } } void BitstreamWriter::PutBitsBuffer(mfxU32 n, void* bb, mfxU32 o) { mfxU8* b = (mfxU8*)bb; mfxU32 N, B; assert(bb); auto SkipOffsetBytes = [&]() { N = o / 8; b += N; o &= 7; return o; }; auto PutBitsAfterOffsetOnes = [&]() { N = (n < (8 - o)) * n; PutBits(8 - o, ((b[0] & (0xff >> o)) >> N)); n -= (N + !N * (8 - o)); ++b; return n; }; auto PutBytesAligned = [&]() { N = n / 8; n &= 7; assert(std::ptrdiff_t(N + !!n) < std::ptrdiff_t(m_bsEnd - m_bs)); std::copy(b, b + N, m_bs); m_bs += N; return !n; }; auto PutLastByteBitsAligned = [&]() { m_bs[0] = b[N]; m_bs[0] &= (0xff << (8 - n)); m_bitOffset = (mfxU8)n; return true; }; auto CopyAlignedToUnaligned = [&]() { assert(std::ptrdiff_t(n + 7 - m_bitOffset) / 8 < std::ptrdiff_t(m_bsEnd - m_bs)); while (n >= 24) { B = ((((mfxU32)b[0] << 24) | ((mfxU32)b[1] << 16) | ((mfxU32)b[2] << 8)) >> m_bitOffset); m_bs[0] |= (mfxU8)(B >> 24); m_bs[1] = (mfxU8)(B >> 16); m_bs[2] = (mfxU8)(B >> 8); m_bs[3] = (mfxU8)B; m_bs += 3; b += 3; n -= 24; } while (n >= 8) { B = ((mfxU32)b[0] << 8) >> m_bitOffset; m_bs[0] |= (mfxU8)(B >> 8); m_bs[1] = (mfxU8)B; m_bs++; b++; n -= 8; } if (n) PutBits(n, (b[0] >> (8 - n))); return true; }; auto CopyUnalignedPartToAny = [&]() { return o && SkipOffsetBytes() && PutBitsAfterOffsetOnes(); }; auto CopyAlignedToAligned = [&]() { return !m_bitOffset && (PutBytesAligned() || PutLastByteBitsAligned()); }; bool bDone = CopyUnalignedPartToAny() || CopyAlignedToAligned() || CopyAlignedToUnaligned(); ThrowAssert(!bDone, "BitstreamWriter::PutBitsBuffer failed"); } void BitstreamWriter::PutBits(mfxU32 n, mfxU32 b) { assert(n <= sizeof(b) * 8); while (n > 24) { n -= 16; PutBits(16, (b >> n)); } b <<= (32 - n); if (!m_bitOffset) { m_bs[0] = (mfxU8)(b >> 24); m_bs[1] = (mfxU8)(b >> 16); } else { b >>= m_bitOffset; n += m_bitOffset; m_bs[0] |= (mfxU8)(b >> 24); m_bs[1] = (mfxU8)(b >> 16); } if (n > 16) { m_bs[2] = (mfxU8)(b >> 8); m_bs[3] = (mfxU8)b; } m_bs += (n >> 3); m_bitOffset = (n & 7); } void BitstreamWriter::PutBit(mfxU32 b) { switch(m_bitOffset) { case 0: m_bs[0] = (mfxU8)(b << 7); m_bitOffset = 1; break; case 7: m_bs[0] |= (mfxU8)(b & 1); m_bs ++; m_bitOffset = 0; break; default: if (b & 1) m_bs[0] |= (mfxU8)(1 << (7 - m_bitOffset)); m_bitOffset ++; break; } } void BitstreamWriter::PutBitC(mfxU32 B) { if (m_firstBitFlag) m_firstBitFlag = false; else PutBit(B); while (m_bitsOutstanding > 0) { PutBit(1 - B); m_bitsOutstanding--; } } void Packer::PackIVF(BitstreamWriter& bs, FH const& fh, mfxU32 insertHeaders, mfxVideoParam const& vp) { if (insertHeaders & INSERT_IVF_SEQ) { // IVF SEQ header mfxU32 ivfSeqHeader[8] = {0x46494B44, 0x00200000, 0x31305641, (mfxU32)(fh.UpscaledWidth + (fh.FrameHeight << 16)), vp.mfx.FrameInfo.FrameRateExtN, vp.mfx.FrameInfo.FrameRateExtD, 0/*numFramesInFile*/, 0x00000000 }; mfxU8 *ptr = reinterpret_cast(ivfSeqHeader); for (size_t i = 0; i < 32; i++) { bs.PutBitsBuffer(8, ptr + i); } } // IVF PIC header if (insertHeaders & INSERT_IVF_FRM) { const mfxU32 ivfPicHeaderSizeInBytes = 12; for (size_t i = 0; i < ivfPicHeaderSizeInBytes; i++) { bs.PutBits(8, mfxU8(0)); } } } void Packer::PackOBUHeader(BitstreamWriter& bs, AV1_OBU_TYPE obu_type, mfxU32 obu_extension_flag, ObuExtensionHeader const& oeh) { bs.PutBit(0); //forbidden bit bs.PutBits(4, obu_type); //type bs.PutBit(obu_extension_flag); bs.PutBit(1); //obu_has_size_field bs.PutBit(0); //reserved if (obu_extension_flag) { bs.PutBits(3, oeh.temporal_id); bs.PutBits(2, oeh.spatial_id); bs.PutBits(3, 0);//reserved } } void Packer::PackOBUHeaderSize(BitstreamWriter& bs, mfxU32 const obu_size_in_bytes, mfxU8 const fixed_output_len) { Leb128Data leb128 = {}; EncodeLeb128(leb128, obu_size_in_bytes, fixed_output_len); const mfxU8 *ptr = reinterpret_cast(&leb128.buf); for (mfxU8 i = 0; i < leb128.size; i++) bs.PutBits(8, ptr[i]); } inline void PackOperatingPoints(BitstreamWriter& bs, SH const& sh) { bs.PutBits(5, sh.operating_points_cnt_minus_1); for (mfxU8 i = 0; i <= sh.operating_points_cnt_minus_1; i++) { bs.PutBits(12, sh.operating_point_idc[i]); bs.PutBits(5, sh.seq_level_idx[i]); if (sh.seq_level_idx[i] > 7) { bs.PutBits(1, sh.seq_tier[i]); } } } inline void PackFrameSizeInfo(BitstreamWriter& bs, FH const& fh) { //number of bits required to store width/height mfxU8 frame_width_bits_minus_1 = 15; bs.PutBits(4, frame_width_bits_minus_1); mfxU8 frame_height_bits_minus_1 = 15; bs.PutBits(4, frame_height_bits_minus_1); // max width/height of the stream mfxU32 max_frame_width_minus_1 = fh.UpscaledWidth - 1; bs.PutBits(frame_width_bits_minus_1 + 1, max_frame_width_minus_1); mfxU32 max_frame_height_minus_1 = fh.FrameHeight - 1; bs.PutBits(frame_height_bits_minus_1 + 1, max_frame_height_minus_1); } inline void PackColorConfig(BitstreamWriter& bs, SH const& sh) { bs.PutBit(sh.color_config.BitDepth == BITDEPTH_10 ? 1 : 0); //high_bitdepth if (sh.seq_profile != 1) bs.PutBit(0); //mono_chrome bs.PutBit(sh.color_config.color_description_present_flag); if (sh.color_config.color_description_present_flag) { bs.PutBits(8, sh.color_config.color_primaries); bs.PutBits(8, sh.color_config.transfer_characteristics); bs.PutBits(8, sh.color_config.matrix_coefficients); } bs.PutBit(sh.color_config.color_range); //color_range if (sh.seq_profile == 0) bs.PutBits(2, 0); //chroma_sample_position bs.PutBit(sh.color_config.separate_uv_delta_q); //separate_uv_delta_q } void Packer::PackSPS(BitstreamWriter& bs, SH const& sh, FH const& fh, ObuExtensionHeader const& oeh) { //alloc tmp buff for the header data const mfxU32 av1_max_header_size = 1024; std::vector tmpBuf(av1_max_header_size); BitstreamWriter tmpBitstream(&tmpBuf[0], av1_max_header_size); //adding header data to tmp_buff to calculate size before adding to bitstream tmpBitstream.PutBits(3, sh.seq_profile); //seq_profile tmpBitstream.PutBit(sh.still_picture); //still_picture tmpBitstream.PutBit(0); //reduced_still_picture_header tmpBitstream.PutBit(0); //timing_info_present_flag tmpBitstream.PutBit(0); //initial_display_delay_present_flag PackOperatingPoints(tmpBitstream, sh); PackFrameSizeInfo(tmpBitstream, fh); tmpBitstream.PutBit(0); //frame_id_numbers_present_flag (affects FH) tmpBitstream.PutBit(0); //use_128x128_superblock tmpBitstream.PutBit(sh.enable_filter_intra); //enable_filter_intra tmpBitstream.PutBit(sh.enable_intra_edge_filter); //enable_intra_edge_filter tmpBitstream.PutBit(sh.enable_interintra_compound); //enable_interintra_compound tmpBitstream.PutBit(sh.enable_masked_compound); //enable_masked_compound tmpBitstream.PutBit(sh.enable_warped_motion); //enable_warped_motion tmpBitstream.PutBit(sh.enable_dual_filter); //enable_dual_filter tmpBitstream.PutBit(sh.enable_order_hint); //enable_order_hint if (sh.enable_order_hint) { tmpBitstream.PutBit(0); //enable_jnt_comp tmpBitstream.PutBit(fh.use_ref_frame_mvs); //enable_ref_frame_mvs } tmpBitstream.PutBit(1); //seq_choose_screen_content_tools tmpBitstream.PutBit(sh.seq_force_integer_mv); //seq_choose_integer_mv if (!sh.seq_force_integer_mv) { tmpBitstream.PutBit(0); //seq_force_integer_mv } if (sh.enable_order_hint) { tmpBitstream.PutBits(3, sh.order_hint_bits_minus1); //affects FH } tmpBitstream.PutBit(sh.enable_superres); //enable_superres tmpBitstream.PutBit(sh.enable_cdef); //enable_cdef tmpBitstream.PutBit(sh.enable_restoration); //enable_restoration PackColorConfig(tmpBitstream, sh); tmpBitstream.PutBit(0); //film_grain_params_present tmpBitstream.PutTrailingBits(); const bool ext = oeh.temporal_id | oeh.spatial_id; PackOBUHeader(bs, OBU_SEQUENCE_HEADER, ext, oeh); mfxU32 const obu_size_in_bytes = (tmpBitstream.GetOffset() + 7) / 8; PackOBUHeaderSize(bs, obu_size_in_bytes); bs.PutBitsBuffer(tmpBitstream.GetOffset(), tmpBitstream.GetStart()); } static int GetUnsignedBits(unsigned int num_values) { int cat = 0; if (num_values <= 1) return 0; num_values--; while (num_values > 0) { cat++; num_values >>= 1; } return cat; } static void WriteUniform(BitstreamWriter& bs, int n, int v) { const int l = GetUnsignedBits(n); const int m = (1 << l) - n; if (l == 0) return; if (v < m) { bs.PutBits(l - 1, v); } else { bs.PutBits(l - 1, m + ((v - m) >> 1)); bs.PutBits(1, (v - m) & 1); } } mfxU16 WriteSU(int32_t value, mfxU16 n) { mfxI16 signMask = 1 << (n - 1); if (value & signMask) { value = value - 2 * signMask; } return static_cast(value); } inline void PackShowFrame(BitstreamWriter& bs, FH const& fh) { bs.PutBit(fh.show_frame); //show_frame if (!fh.show_frame) bs.PutBit(fh.showable_frame); //showable_frame } inline void PackErrorResilientMode(BitstreamWriter& bs, FH const& fh) { if (fh.frame_type == SWITCH_FRAME || (fh.frame_type == KEY_FRAME && fh.show_frame)) return; else bs.PutBit(fh.error_resilient_mode); //error_resilient_mode } inline void PackOrderHint(BitstreamWriter& bs, SH const& sh, FH const& fh) { if (!sh.enable_order_hint) return; bs.PutBits(sh.order_hint_bits_minus1 + 1, fh.order_hint); //order_hint } inline void PackRefFrameFlags(BitstreamWriter& bs, FH const& fh) { const mfxU8 frameIsIntra = FrameIsIntra(fh); if (!(frameIsIntra || fh.error_resilient_mode)) bs.PutBits(3, 0); //primary_ref_frame if (!(fh.frame_type == SWITCH_FRAME || (fh.frame_type == KEY_FRAME && fh.show_frame))) bs.PutBits(NUM_REF_FRAMES, fh.refresh_frame_flags); } inline void PackInterpolationFilter(BitstreamWriter& bs, FH const& fh) { const mfxU8 is_filter_switchable = (fh.interpolation_filter == 4 ? 1 : 0); bs.PutBit(is_filter_switchable); //is_filter_switchable if (!is_filter_switchable) { bs.PutBits(2, fh.interpolation_filter); //interpolation_filter } } inline void PackSuperresParams(BitstreamWriter& bs, SH const& sh, FH const& fh) { if (sh.enable_superres) { bs.PutBit(fh.use_superres); //use_superres if (fh.use_superres) { bs.PutBits(3, fh.SuperresDenom - 9); // coded_denom } } } inline void PackFrameSize( BitstreamWriter& bs, SH const& sh, FH const& fh) { if (fh.frame_size_override_flag) { bs.PutBits(sh.frame_width_bits + 1, fh.UpscaledWidth - 1); //frame_width_minus_1 bs.PutBits(sh.frame_height_bits + 1, fh.FrameHeight - 1); //frame_height_minus_1 } PackSuperresParams(bs, sh, fh); } inline void PackRenderSize( BitstreamWriter& bs, FH const& fh) { mfxU32 render_and_frame_size_different = 0; bs.PutBit(render_and_frame_size_different); //render_and_frame_size_different if (render_and_frame_size_different == 1) { bs.PutBits(16, fh.RenderWidth - 1); //render_width_minus_1 bs.PutBits(16, fh.RenderHeight - 1); //render_height_minus_1 } } inline void PackFrameSizeWithRefs( BitstreamWriter& bs, SH const& sh, FH const& fh) { mfxU32 found_ref = 0; for (mfxI8 ref = 0; ref < REFS_PER_FRAME; ref++) bs.PutBit(found_ref); //found_ref if (found_ref == 0) { PackFrameSize(bs, sh, fh); PackRenderSize(bs, fh); } else { PackSuperresParams(bs, sh, fh); } } static void PackFrameRefInfo(BitstreamWriter& bs, SH const& sh, FH const& fh) { if (sh.enable_order_hint) bs.PutBit(0); //frame_refs_short_signaling for (mfxU8 ref = 0; ref < REFS_PER_FRAME; ref++) bs.PutBits(REF_FRAMES_LOG2, fh.ref_frame_idx[ref]); if (fh.frame_size_override_flag && !fh.error_resilient_mode) { PackFrameSizeWithRefs(bs, sh, fh); } else { PackFrameSize(bs, sh, fh); PackRenderSize(bs, fh); } bs.PutBit(fh.allow_high_precision_mv); //allow_high_precision_mv PackInterpolationFilter(bs, fh); bs.PutBit(0); //is_motion_switchable if (fh.use_ref_frame_mvs) bs.PutBit(1); //use_ref_frame_mvs } static void PackRefOrderHint(BitstreamWriter& bs, SH const& sh, FH const& fh) { if(fh.error_resilient_mode && sh.enable_order_hint) { for (mfxU8 ref = 0; ref < NUM_REF_FRAMES; ref++) { bs.PutBits(sh.order_hint_bits_minus1 + 1, fh.ref_order_hint[ref]); //ref_order_hint[i] } } } inline void PackUniformTile(BitstreamWriter& bs, TileInfoAv1 const& tileInfo) { assert(tileInfo.TileColsLog2 >= tileInfo.tileLimits.MinLog2TileCols); mfxU32 ones = tileInfo.TileColsLog2 - tileInfo.tileLimits.MinLog2TileCols; while (ones--) bs.PutBit(1); //increment_tile_cols_log2 if (tileInfo.TileColsLog2 < tileInfo.tileLimits.MaxLog2TileCols) bs.PutBit(0); //end of increment_tile_cols_log2 assert(tileInfo.TileRowsLog2 >= tileInfo.tileLimits.MinLog2TileRows); ones = tileInfo.TileRowsLog2 - tileInfo.tileLimits.MinLog2TileRows; while (ones--) bs.PutBit(1); //increment_tile_rows_log2 if (tileInfo.TileRowsLog2 < tileInfo.tileLimits.MaxLog2TileRows) bs.PutBit(0); //end of increment_tile_rows_log2 } inline void PackNonUniformTile(BitstreamWriter& bs, mfxU32 sbCols, mfxU32 sbRows, TileInfoAv1 const& tileInfo) { mfxU32 sizeSb = 0; for (mfxU16 i = 0; i < tileInfo.TileCols; i++) { sizeSb = tileInfo.TileWidthInSB[i]; WriteUniform(bs, std::min(sbCols, tileInfo.tileLimits.MaxTileWidthSb), sizeSb - 1); sbCols -= sizeSb; } for (mfxU16 i = 0; i < tileInfo.TileRows; i++) { sizeSb = tileInfo.TileHeightInSB[i]; WriteUniform(bs, std::min(sbRows, tileInfo.tileLimits.MaxTileHeightSb), sizeSb - 1); sbRows -= sizeSb; } } static void PackTileInfo(BitstreamWriter& bs, mfxU32 sbCols, mfxU32 sbRows, TileInfoAv1 const& tileInfo) { bs.PutBit(tileInfo.uniform_tile_spacing_flag); if (tileInfo.uniform_tile_spacing_flag) { PackUniformTile(bs, tileInfo); } else { PackNonUniformTile(bs, sbCols, sbRows, tileInfo); } if (tileInfo.TileRowsLog2 || tileInfo.TileColsLog2) { bs.PutBits(tileInfo.TileColsLog2 + tileInfo.TileRowsLog2, tileInfo.context_update_tile_id); // context_update_tile_id bs.PutBits(2, tileInfo.TileSizeBytes - 1); // tile_size_bytes_minus_1 } } inline void PackDeltaQValue(BitstreamWriter& bs, int32_t deltaQ) { if (deltaQ) { bs.PutBit(1); bs.PutBits(7, WriteSU(deltaQ, 7)); } else bs.PutBit(0); } inline void PackQuantizationParams(BitstreamWriter& bs, SH const& sh, FH const& fh) { bs.PutBits(8, fh.quantization_params.base_q_idx); //base_q_idx PackDeltaQValue(bs, fh.quantization_params.DeltaQYDc); bool diff_uv_delta = false; if (fh.quantization_params.DeltaQUDc != fh.quantization_params.DeltaQVDc || fh.quantization_params.DeltaQUAc != fh.quantization_params.DeltaQVAc) diff_uv_delta = true; if (sh.color_config.separate_uv_delta_q) bs.PutBit(diff_uv_delta); PackDeltaQValue(bs, fh.quantization_params.DeltaQUDc); PackDeltaQValue(bs, fh.quantization_params.DeltaQUAc); if (diff_uv_delta) { PackDeltaQValue(bs, fh.quantization_params.DeltaQVDc); PackDeltaQValue(bs, fh.quantization_params.DeltaQVAc); } bs.PutBit(fh.quantization_params.using_qmatrix); //using_qmatrix if (fh.quantization_params.using_qmatrix) { bs.PutBits(4, fh.quantization_params.qm_y); bs.PutBits(4, fh.quantization_params.qm_u); if (sh.color_config.separate_uv_delta_q) bs.PutBits(4, fh.quantization_params.qm_v); } } inline void PackSegementFeatures(BitstreamWriter& bs, SegmentationParams const& seg) { for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; i++) { for (mfxU8 j = 0; j < SEG_LVL_MAX; j++) { bool feature_enabled = seg.FeatureMask[i] & (1 << j); bs.PutBit(feature_enabled); if (!feature_enabled) continue; auto feature_value = seg.FeatureData[i][j]; auto bitsToRead = SEGMENTATION_FEATURE_BITS[j]; if (SEGMENTATION_FEATURE_SIGNED[j]) bs.PutBits(1 + bitsToRead, WriteSU(feature_value, 1 + bitsToRead)); else bs.PutBits(bitsToRead, feature_value); } } } inline void PackSegmentationParams(BitstreamWriter& bs, FH const& fh) { const auto& seg = fh.segmentation_params; bs.PutBit(seg.segmentation_enabled); //segmentation_enabled if (!seg.segmentation_enabled) return; if (fh.primary_ref_frame != PRIMARY_REF_NONE) { bs.PutBit(seg.segmentation_update_map); if (seg.segmentation_update_map) bs.PutBit(seg.segmentation_temporal_update); bs.PutBit(seg.segmentation_update_data); } if (seg.segmentation_update_data) PackSegementFeatures(bs, seg); } inline void PackDeltaQParams(BitstreamWriter& bs, FH const& fh) { if (fh.quantization_params.base_q_idx) bs.PutBit(fh.delta_q_present); //delta_q_present if (fh.delta_q_present) { bs.PutBits(2, 0); //delta_q_res bs.PutBit(fh.delta_lf_present); //delta_lf_present bs.PutBits(2, 0); //delta_lf_res bs.PutBit(fh.delta_lf_multi); //delta_lf_multi } } inline void PackLoopFilterParams(BitstreamWriter& bs, FH const& fh) { if (fh.CodedLossless || fh.allow_intrabc) return; bs.PutBits(6, fh.loop_filter_params.loop_filter_level[0]); //loop_filter_level[0] bs.PutBits(6, fh.loop_filter_params.loop_filter_level[1]); //loop_filter_level[1] if (fh.loop_filter_params.loop_filter_level[0] || fh.loop_filter_params.loop_filter_level[1]) { bs.PutBits(6, fh.loop_filter_params.loop_filter_level[2]); //loop_filter_level[2] bs.PutBits(6, fh.loop_filter_params.loop_filter_level[3]); //loop_filter_level[3] } bs.PutBits(3, fh.loop_filter_params.loop_filter_sharpness); //loop_filter_sharpness bs.PutBit(0); //loop_filter_delta_enabled } void PackCdefParams(BitstreamWriter& bs, SH const& sh, FH const& fh) { if (!sh.enable_cdef || fh.CodedLossless || fh.allow_intrabc) return; mfxU16 num_planes = sh.color_config.mono_chrome ? 1 : 3; const auto& cdef = fh.cdef_params; bs.PutBits(2, cdef.cdef_damping - 3); //cdef_damping_minus_3 bs.PutBits(2, cdef.cdef_bits); //cdef_bits for (mfxU16 i = 0; i < (1 << cdef.cdef_bits); ++i) { bs.PutBits(4, cdef.cdef_y_pri_strength[i]); //cdef_y_pri_strength[0] bs.PutBits(2, cdef.cdef_y_sec_strength[i]); //cdef_y_sec_strength[0] if (num_planes > 1) { bs.PutBits(4, cdef.cdef_uv_pri_strength[i]); //cdef_uv_pri_strength[0] bs.PutBits(2, cdef.cdef_uv_sec_strength[i]); //cdef_uv_sec_strength[0] } } } inline void PackLRParams(BitstreamWriter& bs, SH const& sh, FH const& fh) { if (fh.AllLossless || fh.allow_intrabc || !sh.enable_restoration) return; bool usesLR = false; bool usesChromaLR = false; auto const lr = fh.lr_params; for (auto i = 0; i < MAX_MB_PLANE; i++) { bs.PutBits(2, lr.lr_type[i]); if (lr.lr_type[i] != RESTORE_NONE) { usesLR = true; if (i > 0) { usesChromaLR = true; } } } if (usesLR) { bs.PutBits(1, lr.lr_unit_shift); if (sh.sbSize != 1 && lr.lr_unit_shift) // sbSize == 1 means PAK supports 128x128 size superblock { bs.PutBits(1, lr.lr_unit_extra_shift); } if (sh.color_config.subsampling_x && sh.color_config.subsampling_y && usesChromaLR) { bs.PutBits(1, lr.lr_uv_shift); } } } inline void PackFrameReferenceMode(BitstreamWriter& bs, FH const& fh, bool const frameIsIntra) { if (frameIsIntra) return; bs.PutBit(fh.reference_select); //reference_select } inline void PackSkipModeParams(BitstreamWriter& bs, FH const& fh) { if (fh.skipModeAllowed) bs.PutBit(fh.skip_mode_present); //skip_mode_present } inline void PackWrappedMotion(BitstreamWriter& bs, SH const& sh, bool const frameIsIntra) { if (frameIsIntra) return; if (sh.enable_warped_motion) bs.PutBit(0); //allow_warped_motion } inline void PackGlobalMotionParams(BitstreamWriter& bs, bool const frameIsIntra) { if (frameIsIntra) return; for (mfxU8 i = LAST_FRAME; i <= ALTREF_FRAME; i++) bs.PutBit(0); //is_global[7] } inline void PackShowExistingFrame(BitstreamWriter& bs, SH const& sh, FH const& fh) { bs.PutBits(3, fh.frame_to_show_map_idx); if (sh.frame_id_numbers_present_flag) assert(false && "No support for frame_id_numbers_present_flag"); } inline void PackFrameHeader( BitstreamWriter& bs , BitOffsets& offsets , SH const& sh , FH const& fh) { //frame_type const mfxU8 frameIsIntra = FrameIsIntra(fh); bs.PutBits(2, fh.frame_type); PackShowFrame(bs, fh); PackErrorResilientMode(bs, fh); bs.PutBit(fh.disable_cdf_update); bs.PutBit(fh.allow_screen_content_tools); bs.PutBit(fh.frame_size_override_flag); PackOrderHint(bs, sh, fh); PackRefFrameFlags(bs, fh); const int allFrames = (1 << NUM_REF_FRAMES) - 1; if(!frameIsIntra || fh.refresh_frame_flags != allFrames) PackRefOrderHint(bs, sh, fh); if (!frameIsIntra) PackFrameRefInfo(bs, sh, fh); else { PackFrameSize(bs, sh, fh); PackRenderSize(bs, fh); if (fh.allow_screen_content_tools && fh.UpscaledWidth == fh.FrameWidth) bs.PutBit(fh.allow_intrabc); } if (!fh.disable_cdf_update) bs.PutBit(fh.disable_frame_end_update_cdf); //disable_frame_end_update_cdf PackTileInfo(bs, fh.sbCols, fh.sbRows, fh.tile_info); //quantization_params offsets.QIndexBitOffset = static_cast(bs.GetOffset()); PackQuantizationParams(bs, sh, fh); //segmentation_params offsets.SegmentationBitOffset = static_cast(bs.GetOffset()); PackSegmentationParams(bs, fh); offsets.SegmentationBitSize = bs.GetOffset() - offsets.SegmentationBitOffset; PackDeltaQParams(bs, fh); offsets.LoopFilterParamsBitOffset = static_cast(bs.GetOffset()); PackLoopFilterParams(bs, fh); offsets.CDEFParamsBitOffset = static_cast(bs.GetOffset()); PackCdefParams(bs, sh, fh); offsets.CDEFParamsSizeInBits = bs.GetOffset() - offsets.CDEFParamsBitOffset; PackLRParams(bs, sh, fh); const mfxU8 tx_mode_select = fh.TxMode ? 1 : 0; if (!fh.CodedLossless) bs.PutBit(tx_mode_select); //tx_mode_select PackFrameReferenceMode(bs, fh, frameIsIntra); PackSkipModeParams(bs, fh); PackWrappedMotion(bs, sh, frameIsIntra); bs.PutBit(fh.reduced_tx_set); //reduced_tx_set PackGlobalMotionParams(bs, frameIsIntra); } void Packer::PackPPS( BitstreamWriter& bs , BitOffsets& offsets , const SH& sh , const FH& fh , const ObuExtensionHeader& oeh , mfxU32 insertHeaders) { //alloc tmp buff for the header data const mfxU32 av1_max_header_size = 1024; std::vector tmpBuf(av1_max_header_size); BitstreamWriter tmpBitstream(&tmpBuf[0], av1_max_header_size); BitOffsets tmp_offsets = {}; //adding header data to tmp_buff to calculate size before adding to bitstream tmpBitstream.PutBit(fh.show_existing_frame); if (fh.show_existing_frame) PackShowExistingFrame(tmpBitstream, sh, fh); else PackFrameHeader(tmpBitstream, tmp_offsets, sh, fh); const bool obu_extension_flag = oeh.temporal_id | oeh.spatial_id; const mfxU32 obu_header_offset = bs.GetOffset(); if (insertHeaders & INSERT_FRM_OBU) { tmp_offsets.FrameHeaderOBUSizeInBits = tmpBitstream.GetOffset(); tmpBitstream.PutAlignmentBits(); PackOBUHeader(bs, OBU_FRAME, obu_extension_flag, oeh); } else { tmp_offsets.FrameHeaderOBUSizeInBits = tmpBitstream.GetOffset() + 1; // trailing 1 bit is included tmpBitstream.PutTrailingBits(); //Trailing bit PackOBUHeader(bs, OBU_FRAME_HEADER, obu_extension_flag, oeh); } offsets.FrameHeaderOBUSizeByteOffset = (bs.GetOffset() >> 3); if (insertHeaders & INSERT_HDR) { offsets.FrameHeaderOBUSizeByteOffset += offsets.HDRHeaderByteOffset; } const mfxU32 obu_size_in_bytes = (tmpBitstream.GetOffset() + 7) / 8; PackOBUHeaderSize(bs, obu_size_in_bytes, fh.show_existing_frame? 0: 4); if (!fh.show_existing_frame) { // The offset is related to frame or frame header OBU. IVF, sequence, and other headers should not be counted. const mfxU32 obuPayloadOffset = bs.GetOffset() - obu_header_offset; offsets.QIndexBitOffset = obuPayloadOffset + tmp_offsets.QIndexBitOffset; offsets.SegmentationBitOffset = obuPayloadOffset + tmp_offsets.SegmentationBitOffset; offsets.LoopFilterParamsBitOffset = obuPayloadOffset + tmp_offsets.LoopFilterParamsBitOffset; offsets.CDEFParamsBitOffset = obuPayloadOffset + tmp_offsets.CDEFParamsBitOffset; offsets.CDEFParamsSizeInBits = tmp_offsets.CDEFParamsSizeInBits; offsets.FrameHeaderOBUSizeInBits = obuPayloadOffset + tmp_offsets.FrameHeaderOBUSizeInBits; } bs.PutBitsBuffer(tmpBitstream.GetOffset(), tmpBitstream.GetStart()); } void Packer::SetSupported(ParamSupport& blocks) { blocks.m_ebCopyPtrs[MFX_EXTBUFF_CODING_OPTION_SPSPPS].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOptionSPSPPS*)pSrc; auto& buf_dst = *(mfxExtCodingOptionSPSPPS*)pDst; MFX_COPY_FIELD(SPSBuffer); MFX_COPY_FIELD(SPSBufSize); MFX_COPY_FIELD(PPSBuffer); MFX_COPY_FIELD(PPSBufSize); }); } void Packer::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto ph = make_unique>(PackedHeaders{}); global.Insert(Glob::PackedHeaders::Key, std::move(ph)); m_pGlob = &global; return MFX_ERR_NONE; }); } void Packer::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this]( StorageRW& /*global*/ , StorageRW&) -> mfxStatus { return MFX_ERR_NONE; }); } void Packer::SubmitTask(const FeatureBlocks& blocks, TPushST Push) { Push(BLK_SubmitTask , [this, &blocks]( StorageW& global , StorageW& s_task) -> mfxStatus { BitstreamWriter bitstream(m_bitstream.data(), (mfxU32)m_bitstream.size()); PackedHeaders& ph = Glob::PackedHeaders::Get(global); mfxVideoParam& videoParam = Glob::VideoParam::Get(global); SH& sh = Glob::SH::Get(global); FH& fh = Task::FH::Get(s_task); auto& task = Task::Common::Get(s_task); ObuExtensionHeader oeh = {task.TemporalID, 0}; mfxU8* start = bitstream.GetStart(); mfxU32 headerOffset = bitstream.GetOffset(); PackIVF(bitstream, fh, task.InsertHeaders, videoParam); ph.IVF.pData = start + headerOffset / 8; ph.IVF.BitLen = bitstream.GetOffset() - headerOffset; assert(ph.IVF.BitLen % 8 == 0); headerOffset = bitstream.GetOffset(); if (task.InsertHeaders & INSERT_TD) { const bool ext = oeh.temporal_id | oeh.spatial_id; PackOBUHeader(bitstream, OBU_TEMPORAL_DELIMITER, ext, oeh); PackOBUHeaderSize(bitstream, 0); } ph.TD.pData = start + headerOffset / 8; ph.TD.BitLen = bitstream.GetOffset() - headerOffset; assert(ph.TD.BitLen % 8 == 0); headerOffset = bitstream.GetOffset(); if (IsI(task.FrameType)) { PackSPS(bitstream, sh, fh, oeh); } ph.SPS.pData = start + headerOffset / 8; ph.SPS.BitLen = bitstream.GetOffset() - headerOffset; assert(ph.SPS.BitLen % 8 == 0); headerOffset = bitstream.GetOffset(); task.Offsets.UncompressedHeaderByteOffset = headerOffset / 8; PackPPS(bitstream, task.Offsets, sh, fh, oeh, task.InsertHeaders); ph.PPS.pData = bitstream.GetStart() + headerOffset / 8; ph.PPS.BitLen = bitstream.GetOffset() - headerOffset; assert(ph.PPS.BitLen % 8 == 0); return MFX_ERR_NONE; }); } inline mfxStatus Packer::GenerateSPS(mfxVideoParam& out, const StorageR& global) { mfxExtCodingOptionSPSPPS* dst = ExtBuffer::Get(out); MFX_CHECK(dst, MFX_ERR_NONE); dst->PPSBufSize = 0; if (dst->SPSBuffer) { const mfxU16 tmpSize = 128; std::vector tmpBuf(tmpSize); BitstreamWriter bs(tmpBuf.data(), tmpSize); const SH& sh = Glob::SH::Get(global); const FH& fh = Glob::FH::Get(global); ObuExtensionHeader oeh = {0}; PackSPS(bs, sh, fh, oeh); const mfxU16 spsBufSize = mfxU16((bs.GetOffset() + 7) / 8); // Only thrown status could be returned from GetVideoParam() which ignores return value // (Check MFXVideoENCODEAV1_HW::GetVideoParam in av1ehw_base_impl.cpp) ThrowIf(dst->SPSBufSize < spsBufSize, MFX_ERR_NOT_ENOUGH_BUFFER); std::copy_n(tmpBuf.begin(), spsBufSize, dst->SPSBuffer); dst->SPSBufSize = spsBufSize; } return MFX_ERR_NONE; } void Packer::GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) { Push(BLK_GenerateSPS , [this, &blocks](mfxVideoParam& out, StorageR& global) -> mfxStatus { return GenerateSPS(out, global); }); } #define IVF_SEQ_HEADER_SIZE_BYTES 32 #define IVF_PIC_HEADER_SIZE_BYTES 12 inline void PatchIVFFrameInfo(mfxU8* IVFHeaderStart, mfxU32 frameSize, mfxU64 pts, mfxU32 insertHeaders) { const bool insertIvfSeqHeader = insertHeaders & INSERT_IVF_SEQ; mfxU32 frameLen = frameSize - IVF_PIC_HEADER_SIZE_BYTES - ((insertIvfSeqHeader) ? IVF_SEQ_HEADER_SIZE_BYTES : 0); // IVF is a simple file format that transports raw data and multi-byte numbers of little-endian MFX_PACK_BEGIN_USUAL_STRUCT() struct IVF { mfxU32 len; mfxU64 pts; } ivf = {frameLen, pts}; MFX_PACK_END() auto begin = (mfxU8*)&ivf; mfxU8 * pIVFPicHeader = insertIvfSeqHeader ? (IVFHeaderStart + IVF_SEQ_HEADER_SIZE_BYTES) : IVFHeaderStart; std::copy(begin, begin + sizeof(ivf), pIVFPicHeader); } void Packer::PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) { Push(BLK_AddRepeatedFrames , [this, &blocks]( StorageW& global , StorageW& s_task) -> mfxStatus { // Add more bytes to encoded bitstream will make BRC statistics to diverge with real bitstream size. // BRC should be notified about additional bytes, probably Skip frame DDI interface can help. auto& task = Task::Common::Get(s_task); MFX_CHECK(!task.FramesToShow.empty(), MFX_ERR_NONE); const SH& sh = Glob::SH::Get(global); mfxVideoParam& vp = Glob::VideoParam::Get(global); ObuExtensionHeader oeh = { task.TemporalID, 0 }; FH tempFh = {}; tempFh.show_existing_frame = 1; auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto& tm = taskMgrIface.m_Manager; for (const auto& frame : task.FramesToShow) { mfxU8 tempData[64]; mfxU8* dst = tempData; BitstreamWriter bitstream(dst, sizeof(tempData)); mfxU32 insertHeaders = INSERT_PPS; tempFh.frame_to_show_map_idx = frame.FrameToShowMapIdx; const mfxExtAV1BitstreamParam& bsPar = ExtBuffer::Get(vp); if (IsOn(bsPar.WriteIVFHeaders)) { insertHeaders |= INSERT_IVF_FRM; PackIVF(bitstream, tempFh, insertHeaders, vp); } const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(vp); if (IsOn(auxPar.InsertTemporalDelimiter)) { // Add temporal delimiter for shown frame const bool ext = oeh.temporal_id | oeh.spatial_id; PackOBUHeader(bitstream, OBU_TEMPORAL_DELIMITER, ext, oeh); PackOBUHeaderSize(bitstream, 0); } PackPPS(bitstream, task.Offsets, sh, tempFh, oeh, insertHeaders); const mfxU32 repeatedFrameSize = (bitstream.GetOffset() + 7) / 8; if (IsOn(bsPar.WriteIVFHeaders)) PatchIVFFrameInfo(dst, repeatedFrameSize, frame.DisplayOrder, insertHeaders); MfxEncodeHW::CachedBitstream cachedBs(repeatedFrameSize, dst); cachedBs.isHiden = false; cachedBs.DisplayOrder = frame.DisplayOrder; tm.PushBitstream(frame.DisplayOrder, std::move(cachedBs)); auto& repeatFrameSizesInfo = Glob::RepeatFrameSizeInfo::Get(global); repeatFrameSizesInfo[task.EncodedOrder] += repeatedFrameSize; // currently repeat frame size is maximum to 3(frame_header) + 2(TD) + 12(IVF frame) bytes } return MFX_ERR_NONE; }); } void Packer::QueryTask(const FeatureBlocks&, TPushQT Push) { Push(BLK_UpdateHeader , [this](StorageW& global, StorageW& s_task) -> mfxStatus { //NB: currently this block is being called after all General Feature blocks, it means //that only bits overwritten are possible, bit shifting and deleting will break the stream! mfxVideoParam& vp = Glob::VideoParam::Get(global); const mfxExtAV1BitstreamParam& bsPar = ExtBuffer::Get(vp); MFX_CHECK(IsOn(bsPar.WriteIVFHeaders), MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); MFX_CHECK(task.BsDataLength > 0, MFX_ERR_NONE); PatchIVFFrameInfo(task.pBsData, *task.pBsDataLength, task.DisplayOrder, task.InsertHeaders); return MFX_ERR_NONE; }); } } } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_packer.h000066400000000000000000000145341443134507600333330ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include namespace AV1EHW { namespace Base { struct Leb128Data { mfxU64 buf; mfxU8 size; }; // leb128 - [in] Leb128Data to hold encoded data // value - [in] integer value to encoded as leb128 // fixed_output_len - [optional in] fixed len for the output, WA for driver part (value = len, 0 - not used) // return - N/A inline void EncodeLeb128(Leb128Data& leb128, uint64_t value, const mfxU8 fixed_output_len = 0) { mfxU8* buf = reinterpret_cast(&(leb128.buf)); mfxU8& cnt = leb128.size; cnt = 0; if (!fixed_output_len) { // general encoding do { buf[cnt] = value & 0x7fU; if (value >>= 7) { buf[cnt] |= 0x80U; } cnt++; } while (value); } else { // WA to get fixed len of output mfxU8 value_byte_count = 0; do { buf[value_byte_count++] = value & 0x7fU; value >>= 7; } while (value); for (int i = 0; i < fixed_output_len - 1; i++) { buf[i] |= 0x80U; cnt++; } cnt++; } } class BitstreamWriter : public IBsWriter { public: BitstreamWriter(mfxU8* bs, mfxU32 size, mfxU8 bitOffset = 0); ~BitstreamWriter(); virtual void PutBits(mfxU32 n, mfxU32 b) override; void PutBitsBuffer(mfxU32 n, void* b, mfxU32 offset = 0); virtual void PutBit(mfxU32 b) override; mfxU32 GetOffset() { return mfxU32(m_bs - m_bsStart) * 8 + m_bitOffset - m_bitStart; } mfxU8* GetStart() { return m_bsStart; } mfxU8* GetEnd() { return m_bsEnd; } void Reset(mfxU8* bs = 0, mfxU32 size = 0, mfxU8 bitOffset = 0); void PutBitC(mfxU32 B); void PutTrailingBits() { PutBit(1); //trailing_one_bit while (GetOffset() & 7) PutBit(0); //trailing_zero_bit } void PutAlignmentBits() { while (GetOffset() & 7) PutBit(0); //Alignment_bit } void AddInfo(mfxU32 key, mfxU32 value) { if (m_pInfo) m_pInfo[0][key] = value; } void SetInfo(std::map *pInfo) { m_pInfo = pInfo; } private: mfxU8* m_bsStart; mfxU8* m_bsEnd; mfxU8* m_bs; mfxU8 m_bitStart; mfxU8 m_bitOffset; mfxU32 m_bitsOutstanding; mfxU32 m_BinCountsInNALunits; bool m_firstBitFlag; std::map *m_pInfo = nullptr; }; class Packer : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init )\ DECL_BLOCK(Reset )\ DECL_BLOCK(AddRepeatedFrames)\ DECL_BLOCK(GenerateSPS )\ DECL_BLOCK(SubmitTask )\ DECL_BLOCK(UpdateHeader ) #define DECL_FEATURE_NAME "Base_Packer" #include "av1ehw_decl_blocks.h" Packer(mfxU32 id) : FeatureBase(id) {} //protected: static const mfxU32 BITSTREAM_SIZE = 1024; static const mfxU32 SPS_ES_SIZE = 1024; static const mfxU32 PPS_ES_SIZE = 128; static const mfxU32 ES_SIZE = SPS_ES_SIZE + PPS_ES_SIZE; std::array m_es; mfxU8 *m_pRTBufBegin = nullptr , *m_pRTBufEnd = nullptr; NotNull m_pGlob; std::array m_bitstream; virtual void SetSupported(ParamSupport& par) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) override; void PackIVF(BitstreamWriter& bs, const FH& fh, mfxU32 insertHeaders, const mfxVideoParam& vp); void PackSPS(BitstreamWriter& bs, const SH& sh, const FH& fh, const ObuExtensionHeader& oeh); void PackPPS(BitstreamWriter& bs, BitOffsets& offsets, const SH& sh, const FH& fh, const ObuExtensionHeader& oeh, mfxU32 insertHeaders); mfxStatus GenerateSPS(mfxVideoParam& out, const StorageR& global); static void PackOBUHeader(BitstreamWriter& bs, AV1_OBU_TYPE obu_type, mfxU32 obu_extension_flag, const ObuExtensionHeader& oeh); static void PackOBUHeaderSize(BitstreamWriter& bs, const mfxU32 obu_size_in_bytes, const mfxU8 fixed_output_len = 0); static bool PutBit (BitstreamWriter& bs, mfxU32 b) { bs.PutBit(!!b); return true; }; static bool PutBits(BitstreamWriter& bs, mfxU32 n, mfxU32 b) { if (n) bs.PutBits(n, b); return !!n; }; }; } //Base } //namespace AV1EHW #endif av1ehw_base_qmatrix.cpp000066400000000000000000000142371443134507600341060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_qmatrix.h" using namespace AV1EHW; using namespace AV1EHW::Base; void QpHistory::Add(mfxU32 qp) { std::copy_n(m_history, HIST_SIZE - 1, m_history + 1); m_history[0] = static_cast(qp); } mfxU8 QpHistory::GetAverageQp() const { mfxU32 averageQP = 0; mfxU32 numQPs = 0; for (mfxU8 qp : m_history) { if (qp < 52) { averageQP += qp; numQPs++; } } if (numQPs > 0) averageQP = (averageQP + numQPs / 2) / numQPs; return static_cast(averageQP); } static mfxU8 GetAdaptiveCQM(const mfxVideoParam& par, const QpHistory qpHistory) { mfxU8 qMatrix = AV1_NUM_QMATRIX; const mfxExtCodingOption3* opt3 = ExtBuffer::Get(par); if (opt3 && IsOn(opt3->AdaptiveCQM)) { const mfxU32 averageQP = qpHistory.GetAverageQp(); if (averageQP == 0) // not enough history QP { const mfxU32 MBSIZE = 16; const mfxU32 BITRATE_SCALE = 2000; const mfxU32 numMB = (par.mfx.FrameInfo.Width / MBSIZE) * (par.mfx.FrameInfo.Height / MBSIZE); const mfxU32 normalizedBitrate = mfxU32(mfxU64(BITRATE_SCALE) * par.mfx.BufferSizeInKB*1000* (par.mfx.BRCParamMultiplier ? par.mfx.BRCParamMultiplier:1) * par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN / numMB); const mfxU32 STRONG_QM_BR_THRESHOLD = 25; const mfxU32 MEDIUM_QM_BR_THRESHOLD = 50; qMatrix = (normalizedBitrate < STRONG_QM_BR_THRESHOLD) ? 8 : (normalizedBitrate < MEDIUM_QM_BR_THRESHOLD) ? 10 : 12; } else { const mfxU32 FLAT_QM_QP_THRESHOLD = 50; const mfxU32 WEAK_QM_QP_THRESHOLD = 100; const mfxU32 MEDIUM_QM_QP_THRESHOLD = 150; const mfxU32 STRONG_QM_QP_THRESHOLD = 220; qMatrix = averageQP < FLAT_QM_QP_THRESHOLD ? 14 : averageQP < WEAK_QM_QP_THRESHOLD ? 12 : averageQP < MEDIUM_QM_QP_THRESHOLD ? 10 : averageQP < STRONG_QM_QP_THRESHOLD ? 8 : 6; } } return qMatrix; } void QMatrix::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(AdaptiveCQM); MFX_COPY_FIELD(ScenarioInfo); }); } static bool isAdaptiveCQMSupported(const mfxU16 scenarioInfo) { return scenarioInfo == MFX_SCENARIO_GAME_STREAMING || scenarioInfo == MFX_SCENARIO_REMOTE_GAMING; } void QMatrix::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [this](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtCodingOption3* extOpt3 = ExtBuffer::Get(par); MFX_CHECK(extOpt3, MFX_ERR_NONE); if (IsOn(extOpt3->AdaptiveCQM) && !isAdaptiveCQMSupported(extOpt3->ScenarioInfo)) { extOpt3->AdaptiveCQM = 0; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; }); } void QMatrix::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_ConfigureTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { const auto& par = Glob::VideoParam::Get(global); const mfxExtCodingOption2* extOpt2 = ExtBuffer::Get(par); MFX_CHECK(!(extOpt2 && extOpt2->LookAheadDepth >0), MFX_ERR_NONE); const mfxU8 nQMatrix = GetAdaptiveCQM(par, m_qpHistory); auto& fh = Task::FH::Get(s_task); MFX_CHECK(fh.quantization_params.using_qmatrix == 0, MFX_ERR_NONE); fh.quantization_params.using_qmatrix = nQMatrix < AV1_NUM_QMATRIX ? 1 : 0; if (fh.quantization_params.using_qmatrix) { fh.quantization_params.qm_y = nQMatrix; fh.quantization_params.qm_u = nQMatrix; fh.quantization_params.qm_v = nQMatrix; } return MFX_ERR_NONE; }); } void QMatrix::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Update , [this](StorageW& global, StorageW& s_task) -> mfxStatus { const auto& par = Glob::VideoParam::Get(global); const mfxExtCodingOption2* extOpt2 = ExtBuffer::Get(par); MFX_CHECK(!(extOpt2 && extOpt2->LookAheadDepth > 0), MFX_ERR_NONE); const auto& fb = Glob::DDI_Feedback::Get(global); MFX_CHECK(!fb.bNotReady, MFX_TASK_BUSY); const void* pFeedback = fb.Get(Task::Common::Get(s_task).StatusReportId); if (pFeedback) { mfxU16 qp = 0; MFX_SAFE_CALL(GetQPInfo(pFeedback, qp)); m_qpHistory.Add(qp); } return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_qmatrix.h000066400000000000000000000050621443134507600335470ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { struct QpHistory { QpHistory() { Reset(); } void Reset() { std::fill_n(m_history, HIST_SIZE, mfxU8(52)); } void Add(mfxU32 qp); mfxU8 GetAverageQp() const; private: static const mfxU32 HIST_SIZE = 16; mfxU8 m_history[HIST_SIZE]; }; class QMatrix : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(ConfigureTask)\ DECL_BLOCK(PatchDDITask)\ DECL_BLOCK(Update) #define DECL_FEATURE_NAME "Base_QMatrix" #include "av1ehw_decl_blocks.h" QMatrix(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override {}; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual mfxStatus GetQPInfo(const void* pDdiFeedback, mfxU16& qp) = 0; QpHistory m_qpHistory; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_query_impl_desc.cpp000066400000000000000000000156511443134507600356060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_query_impl_desc.h" using namespace AV1EHW; using namespace AV1EHW::Base; void QueryImplDesc::QueryImplsDescription(const FeatureBlocks& blocks, TPushQID Push) { auto Query = [&blocks]( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah , StorageRW&) -> mfxStatus { const mfxU32 FourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_YV12 , MFX_FOURCC_NV16 , MFX_FOURCC_YUY2 , MFX_FOURCC_RGB565 , MFX_FOURCC_RGBP , MFX_FOURCC_RGB4 , MFX_FOURCC_P010 , MFX_FOURCC_P016 , MFX_FOURCC_P210 , MFX_FOURCC_BGR4 , MFX_FOURCC_A2RGB10 , MFX_FOURCC_ARGB16 , MFX_FOURCC_ABGR16 , MFX_FOURCC_AYUV , MFX_FOURCC_AYUV_RGB4 , MFX_FOURCC_UYVY , MFX_FOURCC_Y210 , MFX_FOURCC_Y410 , MFX_FOURCC_Y216 , MFX_FOURCC_Y416 , MFX_FOURCC_NV21 , MFX_FOURCC_IYUV , MFX_FOURCC_I010 }; struct Config { mfxU16 Profile; mfxU32 FourCC; mfxU16 BitDepth; mfxU16 Shift; mfxU16 CromaFormat; }; const Config cfgs[] = { {MFX_PROFILE_AV1_MAIN, MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420} , {MFX_PROFILE_AV1_MAIN, MFX_FOURCC_P010, 10, 1, MFX_CHROMAFORMAT_YUV420} , {MFX_PROFILE_AV1_HIGH, MFX_FOURCC_AYUV, 8, 0, MFX_CHROMAFORMAT_YUV444} , {MFX_PROFILE_AV1_HIGH, MFX_FOURCC_Y410, 10, 0, MFX_CHROMAFORMAT_YUV444} }; auto& queryNC = FeatureBlocks::BQ::Get(blocks); auto& queryWC = FeatureBlocks::BQ::Get(blocks); caps.CodecID = MFX_CODEC_AV1; caps.MaxcodecLevel = MFX_LEVEL_AV1_53; caps.BiDirectionalPrediction = 1; struct TmpCaps { mfxRange32U Width = {0xffffffff, 0, 0xffffffff}; mfxRange32U Height = {0xffffffff, 0, 0xffffffff}; std::list FourCC; }; std::map tmpCaps; for (auto& cfg : cfgs) { StorageRW tmpStorage; tmpStorage.Insert(Glob::VideoCore::Key, new StorableRef(core)); ExtBuffer::Param in, out; in.mfx.CodecId = out.mfx.CodecId = caps.CodecID; in.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; in.mfx.CodecProfile = cfg.Profile; in.mfx.FrameInfo.Width = 1920; in.mfx.FrameInfo.Height = 1088; in.mfx.FrameInfo.FourCC = cfg.FourCC; in.mfx.FrameInfo.ChromaFormat = cfg.CromaFormat; in.mfx.FrameInfo.BitDepthLuma = cfg.BitDepth; in.mfx.FrameInfo.BitDepthChroma = cfg.BitDepth; in.mfx.FrameInfo.Shift = cfg.Shift; auto pCO3 = (mfxExtCodingOption3*)in.NewEB(MFX_EXTBUFF_CODING_OPTION3); out.NewEB(MFX_EXTBUFF_CODING_OPTION3); MFX_CHECK(pCO3, MFX_ERR_UNKNOWN); pCO3->TargetBitDepthLuma = cfg.BitDepth; pCO3->TargetBitDepthChroma = cfg.BitDepth; pCO3->TargetChromaFormatPlus1 = cfg.CromaFormat + 1; if (MFX_ERR_NONE != RunBlocks(CheckGE, queryNC, in, out, tmpStorage)) continue; if (MFX_ERR_NONE != RunBlocks(CheckGE, queryWC, in, out, tmpStorage)) continue; auto& currCaps = tmpCaps[cfg.Profile]; Defaults::Param defs( out , Glob::EncodeCaps::Get(tmpStorage) , Glob::Defaults::Get(tmpStorage)); auto IsUnsupportedFourCC = [&](mfxU32 fcc) { out.mfx.FrameInfo.FourCC = fcc; return defs.base.CheckFourCC(defs, out) != MFX_ERR_NONE; }; std::list supportedFourCC(std::begin(FourCC), std::end(FourCC)); supportedFourCC.remove_if(IsUnsupportedFourCC); currCaps.FourCC.splice(currCaps.FourCC.end(), supportedFourCC); mfxU32 step = defs.base.GetCodedPicAlignment(defs); currCaps.Width = { MIN_FRAME_WIDTH, defs.caps.MaxPicWidth, step }; currCaps.Height = { MIN_FRAME_HEIGHT, defs.caps.MaxPicHeight, step }; } for (auto& intCaps : tmpCaps) { auto& profileCaps = ah.PushBack(caps.Profiles); profileCaps.Profile = intCaps.first; { auto& memCaps = ah.PushBack(profileCaps.MemDesc); memCaps.Width = intCaps.second.Width; memCaps.Height = intCaps.second.Height; intCaps.second.FourCC.sort(); intCaps.second.FourCC.unique(); for (mfxU32 fcc : intCaps.second.FourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } } ah.PushBack(profileCaps.MemDesc); profileCaps.MemDesc[1] = profileCaps.MemDesc[0]; profileCaps.MemDesc[0].MemHandleType = MFX_RESOURCE_SYSTEM_SURFACE; profileCaps.MemDesc[1].MemHandleType = core.GetVAType() == MFX_HW_VAAPI ? MFX_RESOURCE_VA_SURFACE : MFX_RESOURCE_DX11_TEXTURE; profileCaps.NumMemTypes = 2; ++caps.NumProfiles; } MFX_CHECK(caps.NumProfiles, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; }; Push(BLK_Query, Query); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_query_impl_desc.h000066400000000000000000000032751443134507600352520ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { class QueryImplDesc : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Query) #define DECL_FEATURE_NAME "Base_QueryImplDesc" #include "av1ehw_decl_blocks.h" QueryImplDesc(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: void QueryImplsDescription(const FeatureBlocks& blocks, TPushQID Push) override; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_segmentation.cpp000066400000000000000000000524251443134507600351170ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_general.h" #include "av1ehw_base_segmentation.h" namespace AV1EHW { namespace Base { template inline bool CheckAndFixFeature( const ENCODE_CAPS_AV1& caps , mfxU16& featureEnabled , T& value , SEG_LVL_FEATURES feature) { bool changed = false; if (IsFeatureEnabled(featureEnabled, feature) && !IsFeatureSupported(caps, feature)) { DisableFeature(featureEnabled, feature); changed = true; } if (value && !IsFeatureEnabled(featureEnabled, feature)) { value = 0; changed = true; } mfxI32 limit = SEGMENTATION_FEATURE_MAX[feature]; if (SEGMENTATION_FEATURE_SIGNED[feature]) changed |= CheckRangeOrClip(value, -limit, limit); else changed |= CheckRangeOrClip(value, 0, limit); return changed; } mfxU32 CheckAndFixSegmentParam( const ENCODE_CAPS_AV1& caps , mfxAV1SegmentParam& seg) { mfxU32 changed = 0; changed += CheckAndFixFeature(caps, seg.FeatureEnabled, seg.AltQIndex, SEG_LVL_ALT_Q); return changed; } inline bool CheckAndZeroSegmentParam( mfxAV1SegmentParam& seg) { bool changed = false; changed |= seg.FeatureEnabled != 0; changed |= seg.AltQIndex != 0; if (changed) seg = {}; return changed; } static mfxU32 CheckSegmentMap( const mfxU32 width , const mfxU32 height , mfxExtAV1Segmentation& segPar) { mfxU32 invalid = 0; const mfxU32 blockSize = segPar.SegmentIdBlockSize > 0 ? segPar.SegmentIdBlockSize : MFX_AV1_SEGMENT_ID_BLOCK_SIZE_32x32; const mfxU32 widthInBlocks = mfx::CeilDiv(width, blockSize); const mfxU32 heightInBlocks = mfx::CeilDiv(height, blockSize); if (segPar.NumSegmentIdAlloc && segPar.NumSegmentIdAlloc < widthInBlocks * heightInBlocks) invalid++; if (segPar.SegmentIds && segPar.NumSegments) { for (mfxU32 i = 0; i < segPar.NumSegmentIdAlloc; ++i) { if (segPar.SegmentIds[i] >= segPar.NumSegments) { invalid++; break; } } } return invalid; } static mfxU8 GetLastActiveSegId(const mfxAV1SegmentParam (&segParams)[AV1_MAX_NUM_OF_SEGMENTS]) { // the logic is from AV1 spec 5.9.14 mfxU8 LastActiveSegId = 0; for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; i++) if (segParams[i].FeatureEnabled) LastActiveSegId = i; return LastActiveSegId; } static mfxU32 CheckNumSegments(mfxExtAV1Segmentation& segPar) { mfxU32 invalid = 0; invalid += CheckMaxOrZero(segPar.NumSegments, AV1_MAX_NUM_OF_SEGMENTS); // By AV1 spec 6.10.8 segment_id must be in the range 0 to LastActiveSegId. Following check helps to ensure it. invalid += CheckMaxOrZero(segPar.NumSegments, GetLastActiveSegId(segPar.Segment) + 1); return invalid; } //this function not needed for Silicon mfxU32 CheckHWLimitations(mfxExtAV1Segmentation& segPar) { mfxU32 invalid = 0; if (segPar.NumSegments && segPar.NumSegments <= AV1_MAX_NUM_OF_SEGMENTS) { const mfxAV1SegmentParam lastSeg = segPar.Segment[segPar.NumSegments - 1]; if (IsFeatureEnabled(lastSeg.FeatureEnabled, SEG_LVL_ALT_Q) && !lastSeg.AltQIndex) { // last segment with zero delta QP isn't supported by HW invalid++; } } return invalid; } inline mfxU32 CheckSegFrameQP(const mfxU16& qp, mfxExtAV1Segmentation& segPar) { mfxU32 invalid = 0; mfxI32 tempQpForSegs = 0; for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; i++) { tempQpForSegs = qp + segPar.Segment[i].AltQIndex; // HW restriction: QpForSegs cannot be negative, and when QpForSegs =0 and segDeltaQ < 0 should be treated as error if (tempQpForSegs < 0 || (tempQpForSegs == 0 && segPar.Segment[i].AltQIndex < 0)) { segPar.Segment[i].AltQIndex = 0; invalid += 1; } } return invalid; } inline void GetGopPattern(const mfxVideoParam& par, bool& bIOnly, bool& bIPOnly, bool& bIPB) { bIOnly = par.mfx.GopPicSize == 1; bIPOnly = !bIOnly && par.mfx.GopRefDist <= 1; bIPB = !bIOnly && !bIPOnly && par.mfx.GopRefDist > 1; } inline mfxU32 CheckSegQP(const mfxVideoParam& par, mfxExtAV1Segmentation& segPar) { mfxU32 invalid = 0; bool bIOnly = false; bool bIPOnly = false; bool bIPB = false; GetGopPattern(par, bIOnly, bIPOnly, bIPB); if (bIOnly) invalid += CheckSegFrameQP(par.mfx.QPI, segPar); else if (bIPOnly) { invalid += CheckSegFrameQP(par.mfx.QPI, segPar); invalid += CheckSegFrameQP(par.mfx.QPP, segPar); } else if (bIPB) { invalid += CheckSegFrameQP(par.mfx.QPI, segPar); invalid += CheckSegFrameQP(par.mfx.QPP, segPar); invalid += CheckSegFrameQP(par.mfx.QPB, segPar); } return invalid; } inline mfxU32 CheckSegDeltaForLossless(const mfxVideoParam& par, mfxExtAV1Segmentation& segPar) { bool bIOnly = false; bool bIPOnly = false; bool bIPB = false; GetGopPattern(par, bIOnly, bIPOnly, bIPB); const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); bool bZeroFrameDelta = !pAuxPar || (pAuxPar->QP.UAcDeltaQ == 0 && pAuxPar->QP.UDcDeltaQ == 0 && pAuxPar->QP.VAcDeltaQ == 0 && pAuxPar->QP.VDcDeltaQ == 0 && pAuxPar->QP.YDcDeltaQ == 0); bool bLossI = par.mfx.QPI == 0 && bZeroFrameDelta; bool bLossP = par.mfx.QPP == 0 && bZeroFrameDelta && (bIPOnly || bIPB); bool bLossB = par.mfx.QPB == 0 && bZeroFrameDelta && bIPB; mfxU32 invalid = 0; MFX_CHECK((bLossI || bLossP || bLossB), invalid); for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; ++i) { if (segPar.Segment[i].AltQIndex != 0) { segPar.Segment[i].AltQIndex = 0; invalid += 1; } } return invalid; } mfxStatus Segmentation::UpdateSegmentBuffers(mfxExtAV1Segmentation& segPar, const mfxExtAV1Segmentation* extSegPar) { MFX_CHECK(IsSegmentationEnabled(extSegPar), MFX_ERR_NONE); segPar.NumSegments = extSegPar->NumSegments; segPar.NumSegmentIdAlloc = extSegPar->NumSegmentIdAlloc; segPar.SegmentIdBlockSize = extSegPar->SegmentIdBlockSize; segPar.SegmentIds = extSegPar->SegmentIds; for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; i++) { segPar.Segment[i].FeatureEnabled = extSegPar->Segment[i].FeatureEnabled; segPar.Segment[i].AltQIndex = extSegPar->Segment[i].AltQIndex; } return MFX_ERR_NONE; } mfxStatus Segmentation::CheckAndFixSegmentBuffers(mfxExtAV1Segmentation* pSegPar, const Defaults::Param& defPar) { const mfxVideoParam& par = defPar.mvp; const ENCODE_CAPS_AV1& caps = defPar.caps; MFX_CHECK(IsSegmentationEnabled(pSegPar), MFX_ERR_NONE); mfxU32 invalid = 0, changed = 0; invalid += !!!caps.ForcedSegmentationSupport; // Further parameter check hardly rely on NumSegments. Cannot fix value of NumSegments and then use // modified value for checks. Need to drop and return MFX_ERR_UNSUPPORTED invalid += CheckNumSegments(*pSegPar); mfxU32 width = 0, height = 0; const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); std::tie(width, height) = GetRealResolution(defPar.mvp); width = GetActualEncodeWidth(width, pAuxPar); invalid += CheckSegmentMap(width, height, *pSegPar); mfxU16 rateControlMethod = defPar.base.GetRateControlMethod(defPar); invalid += !!(rateControlMethod == MFX_RATECONTROL_CQP && CheckSegQP(par, *pSegPar)); invalid += !!(rateControlMethod == MFX_RATECONTROL_CQP && CheckSegDeltaForLossless(par, *pSegPar)); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); for (mfxU16 i = 0; i < pSegPar->NumSegments; i++) { changed += CheckAndFixSegmentParam(caps, pSegPar->Segment[i]); } // clean out per-segment parameters for segments with numbers exceeding seg.NumSegments for (mfxU16 i = pSegPar->NumSegments; i < AV1_MAX_NUM_OF_SEGMENTS; ++i) { changed += CheckAndZeroSegmentParam(pSegPar->Segment[i]); } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } void Segmentation::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_AV1_SEGMENTATION].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAV1Segmentation*)pSrc; auto& buf_dst = *(mfxExtAV1Segmentation*)pDst; MFX_COPY_FIELD(NumSegments); for (mfxU32 i = 0; i < buf_src.NumSegments; i++) { MFX_COPY_FIELD(Segment[i].FeatureEnabled); MFX_COPY_FIELD(Segment[i].AltQIndex); } MFX_COPY_FIELD(SegmentIdBlockSize); MFX_COPY_FIELD(NumSegmentIdAlloc); MFX_COPY_FIELD(SegmentIds); }); } void Segmentation::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& par, StorageW&, StorageRW&) { mfxExtAV1Segmentation* pSegPar = ExtBuffer::Get(par); if (pSegPar) { SetDefault(pSegPar->SegmentIdBlockSize, MFX_AV1_SEGMENT_ID_BLOCK_SIZE_32x32); } }); } void Segmentation::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetSegDpb , [this](StorageRW& strg, StorageRW&) -> mfxStatus { strg.Insert(Glob::SegDpb::Key, new MakeStorable); return MFX_ERR_NONE; }); } void Segmentation::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [this](const mfxVideoParam& /*in*/, mfxVideoParam& out, StorageW& global) -> mfxStatus { const auto& caps = Glob::EncodeCaps::Get(global); const auto& defchain = Glob::Defaults::Get(global); const Defaults::Param& defPar = Defaults::Param(out, caps, defchain); mfxExtAV1Segmentation* pSegPar = ExtBuffer::Get(out); return CheckAndFixSegmentBuffers(pSegPar, defPar); }); } void Segmentation::AllocTask(const FeatureBlocks& blocks, TPushAT Push) { Push(BLK_AllocTask , [this, &blocks]( StorageR& /*global*/ , StorageRW& task) -> mfxStatus { task.Insert(Task::Segment::Key, new MakeStorable); return MFX_ERR_NONE; }); } static void MergeSegParam( const mfxExtAV1Segmentation& initSegPar , const mfxExtAV1Segmentation& frameSegPar , mfxExtAV1Segmentation& mergedSegPar) { assert(frameSegPar.NumSegments); // we assume that MergeSegParam is called for active per-frame segment configuration // (1) take Init ext buffer mergedSegPar = initSegPar; // (2) switch to Frame per-segment param mergedSegPar.NumSegments = frameSegPar.NumSegments; const auto emptyPar = mfxAV1SegmentParam{}; std::fill_n(mergedSegPar.Segment, AV1_MAX_NUM_OF_SEGMENTS, emptyPar); std::copy_n(frameSegPar.Segment, frameSegPar.NumSegments, mergedSegPar.Segment); // (3) switch to Frame segment map (if provided) if (frameSegPar.SegmentIds) { mergedSegPar.NumSegmentIdAlloc = frameSegPar.NumSegmentIdAlloc; mergedSegPar.SegmentIds = frameSegPar.SegmentIds; mergedSegPar.SegmentIdBlockSize = frameSegPar.SegmentIdBlockSize; } } inline bool CheckForCompleteness(const mfxExtAV1Segmentation& segPar) { return segPar.NumSegments && segPar.SegmentIds && segPar.NumSegmentIdAlloc && segPar.SegmentIdBlockSize; } static mfxStatus SetFinalSegParam( mfxExtAV1Segmentation& finalSegPar , const Defaults::Param& defPar , const mfxExtAV1Segmentation& initSegPar , const mfxExtAV1Segmentation* pFrameSegPar) { const auto emptySeg = mfxExtAV1Segmentation{}; if (IsSegmentationSwitchedOff(pFrameSegPar)) { MFX_LOG_INFO("Segmentation was switched off for current frame!\n"); finalSegPar = emptySeg; return MFX_ERR_NONE; } if (pFrameSegPar) { MergeSegParam(initSegPar, *pFrameSegPar, finalSegPar); const mfxStatus checkSts = Segmentation::CheckAndFixSegmentBuffers(&finalSegPar, defPar); if (checkSts < MFX_ERR_NONE) { MFX_LOG_WARN("Merge of Init and Frame mfxExtAV1Segmentation resulted in erroneous configuration!\n"); finalSegPar = emptySeg; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } else finalSegPar = initSegPar; if (!CheckForCompleteness(finalSegPar)) { MFX_LOG_WARN("Merge of Init and Frame mfxExtAV1Segmentation didn't give complete segment params!\n"); finalSegPar = emptySeg; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; } void Segmentation::InitTask(const FeatureBlocks& blocks, TPushIT Push) { Push(BLK_InitTask , [this, &blocks]( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& global , StorageW& task) -> mfxStatus { const auto& par = Glob::VideoParam::Get(global); const auto& caps = Glob::EncodeCaps::Get(global); const auto& defchain = Glob::Defaults::Get(global); const Defaults::Param& defPar = Defaults::Param(par, caps, defchain); const mfxExtAV1Segmentation& initSegPar = ExtBuffer::Get(par); mfxExtAV1Segmentation& finalSegPar = Task::Segment::Get(task); if (!IsSegmentationEnabled(&initSegPar)) { finalSegPar = {}; return MFX_ERR_NONE; } mfxStatus checkSts = MFX_ERR_NONE; mfxExtAV1Segmentation* pFrameSegPar = ExtBuffer::Get(Task::Common::Get(task).ctrl); if (IsSegmentationEnabled(pFrameSegPar)) { checkSts = CheckAndFixSegmentBuffers(pFrameSegPar, defPar); if (checkSts < MFX_ERR_NONE) { // ignore Frame segment param and return warning if there are issues MSDK can't fix pFrameSegPar = nullptr; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; MFX_LOG_WARN("Critical issue in Frame mfxExtAV1Segmentation - it's ignored!\n"); } } const mfxStatus mergeSts = SetFinalSegParam(finalSegPar, defPar, initSegPar, pFrameSegPar); return checkSts == MFX_ERR_NONE ? mergeSts : checkSts; }); } inline std::tuple NeedMapUpdate( const mfxExtAV1Segmentation& curSegPar , const mfxExtAV1AuxData& auxData , const mfxExtAV1Segmentation& refSegPar) { bool updateMap = true; bool temporalUpdate = false; if (!IsSegmentationSwitchedOff(&refSegPar)) { if (curSegPar.SegmentIdBlockSize == refSegPar.SegmentIdBlockSize && curSegPar.NumSegments == refSegPar.NumSegments) { assert(curSegPar.SegmentIds); assert(refSegPar.SegmentIds); const mfxU32 mapSize = std::min(curSegPar.NumSegmentIdAlloc, refSegPar.NumSegmentIdAlloc); if (std::equal(curSegPar.SegmentIds, curSegPar.SegmentIds + mapSize, refSegPar.SegmentIds)) updateMap = false; } // default value of TemporalUpdate (MFX_CODINGOPTION_UNKNOWN) is treated as ON // (we assume that in average enabled segmentation_temporal_update saves bits in comparison with disabled) temporalUpdate = updateMap && !IsOff(auxData.SegmentTemporalUpdate); } return std::make_tuple(updateMap, temporalUpdate); } inline bool NeedParUpdate(const mfxExtAV1Segmentation& curSegPar, const mfxExtAV1Segmentation& refSegPar) { if (curSegPar.NumSegments != refSegPar.NumSegments) return true; auto EqualParam = [](const mfxAV1SegmentParam& left, const mfxAV1SegmentParam& right) { return left.FeatureEnabled == right.FeatureEnabled && left.AltQIndex == right.AltQIndex; }; if (std::equal(curSegPar.Segment, curSegPar.Segment + curSegPar.NumSegments, refSegPar.Segment, EqualParam)) return false; else return true; } mfxStatus UpdateFrameHeader( const mfxExtAV1Segmentation& curSegPar , const mfxExtAV1AuxData& auxData , const FH& fh , SegmentationParams& seg , SegDpbType& segDpb) { seg = SegmentationParams{}; MFX_CHECK(curSegPar.NumSegments, MFX_ERR_NONE); seg.segmentation_enabled = 1; if (fh.primary_ref_frame == PRIMARY_REF_NONE) // AV1 spec 5.9.14 { seg.segmentation_update_map = 1; seg.segmentation_temporal_update = 0; seg.segmentation_update_data = 1; } else { const mfxU8 primaryRefFrameDpbIdx = static_cast(fh.ref_frame_idx[fh.primary_ref_frame]); const mfxExtAV1Segmentation* pRefPar = segDpb.at(primaryRefFrameDpbIdx).get(); assert(pRefPar); std::tie(seg.segmentation_update_map, seg.segmentation_temporal_update) = NeedMapUpdate(curSegPar, auxData, *pRefPar); seg.segmentation_update_data = NeedParUpdate(curSegPar, *pRefPar); } for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; ++i) { seg.FeatureMask[i] = static_cast(curSegPar.Segment[i].FeatureEnabled); seg.FeatureData[i][SEG_LVL_ALT_Q] = curSegPar.Segment[i].AltQIndex; if (IsFeatureEnabled(curSegPar.Segment[i].FeatureEnabled, SEG_LVL_SKIP)) seg.FeatureData[i][SEG_LVL_SKIP] = 1; if (IsFeatureEnabled(curSegPar.Segment[i].FeatureEnabled, SEG_LVL_GLOBALMV)) seg.FeatureData[i][SEG_LVL_GLOBALMV] = 1; } return MFX_ERR_NONE; } static void RetainSegMap(mfxExtAV1Segmentation& segPar) { const mfxU8* pMap = segPar.SegmentIds; segPar.SegmentIds = new mfxU8[segPar.NumSegmentIdAlloc]; std::copy_n(pMap, segPar.NumSegmentIdAlloc, segPar.SegmentIds); } static void PutSegParamToDPB( const mfxExtAV1Segmentation& segPar , mfxU16 numRefFrame , const DpbRefreshType& refreshFrameFlags , SegDpbType& segDpb) { if (segDpb.empty()) segDpb.resize(numRefFrame); auto SegParamReleaser = [](mfxExtAV1Segmentation* pSegPar) { delete []pSegPar->SegmentIds; delete pSegPar; }; UpdateDPB(segDpb, segPar, refreshFrameFlags, SegParamReleaser); } inline void UpdateSegmentLossless(mfxExtAV1Segmentation& segPar, FH& fh) { if (segPar.NumSegments && fh.CodedLossless) { memset(&segPar.Segment[0], 0, AV1_MAX_NUM_OF_SEGMENTS * sizeof(mfxAV1SegmentParam)); fh.segmentation_params.segmentation_enabled = 0; } } mfxStatus Segmentation::PostUpdateSegmentParam( mfxExtAV1Segmentation& segPar , FH& fh , SegDpbType& segDpb , const mfxExtAV1AuxData& auxData , const mfxU16 numRefFrame , const DpbRefreshType refreshFrameFlags) { auto sts = UpdateFrameHeader(segPar, auxData, fh, fh.segmentation_params, segDpb); MFX_CHECK_STS(sts); UpdateSegmentLossless(segPar, fh); if (fh.refresh_frame_flags) { RetainSegMap(segPar); PutSegParamToDPB(segPar, numRefFrame, refreshFrameFlags, segDpb); } if (!fh.segmentation_params.segmentation_update_map) { segPar.SegmentIds = nullptr; segPar.NumSegmentIdAlloc = 0; } return MFX_ERR_NONE; } void Segmentation::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_ConfigureTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { mfxExtAV1Segmentation& segPar = Task::Segment::Get(s_task); const auto& vp = Glob::VideoParam::Get(global); const mfxExtAV1AuxData& auxData = ExtBuffer::Get(vp); FH& fh = Task::FH::Get(s_task); auto& segDpb = Glob::SegDpb::Get(global); const auto& numRefFrame = Glob::VideoParam::Get(global).mfx.NumRefFrame; const auto& refreshFrameFlags = Task::Common::Get(s_task).RefreshFrameFlags; return PostUpdateSegmentParam(segPar, fh, segDpb, auxData, numRefFrame, refreshFrameFlags); }); } } //namespace AV1EHW } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_segmentation.h000066400000000000000000000075071443134507600345650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { inline bool IsSegmentationEnabled(const mfxExtAV1Segmentation* pSegPar) { return pSegPar && pSegPar->NumSegments != 0; } inline bool IsSegmentationSwitchedOff(const mfxExtAV1Segmentation* pSegPar) { return pSegPar && pSegPar->NumSegments == 0; } inline bool IsFeatureSupported( const ENCODE_CAPS_AV1& caps , Base::SEG_LVL_FEATURES feature) { return (caps.SegmentFeatureSupport & (1 << feature)) != 0; } inline bool IsFeatureEnabled( mfxU16 featureEnabled , Base::SEG_LVL_FEATURES feature) { return (featureEnabled & (1 << feature)) != 0; } inline void DisableFeature( mfxU16& featureEnabled , Base::SEG_LVL_FEATURES feature) { featureEnabled &= ~(1 << feature); } inline void EnableFeature( mfxU16& featureEnabled , Base::SEG_LVL_FEATURES feature) { featureEnabled |= (1 << feature); } namespace Base { class Segmentation : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(SetSegDpb)\ DECL_BLOCK(AllocTask)\ DECL_BLOCK(InitTask)\ DECL_BLOCK(ConfigureTask) #define DECL_FEATURE_NAME "Base_Segmentation" #include "av1ehw_decl_blocks.h" Segmentation(mfxU32 FeatureId) : FeatureBase(FeatureId) {} static mfxStatus UpdateSegmentBuffers(mfxExtAV1Segmentation& segPar, const mfxExtAV1Segmentation* extSegPar); static mfxStatus PostUpdateSegmentParam( mfxExtAV1Segmentation& segPar , FH& fh , SegDpbType& segDpb , const mfxExtAV1AuxData& auxData , const mfxU16 numRefFrame , const DpbRefreshType refreshFrameFlags); static mfxStatus CheckAndFixSegmentBuffers(mfxExtAV1Segmentation* pSegPar, const Defaults::Param& defPar); protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void AllocTask(const FeatureBlocks& /*blocks*/, TPushAT Push) override; virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override {}; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)av1ehw_base_task.cpp000066400000000000000000000306061443134507600333610ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_task.h" using namespace AV1EHW; using namespace AV1EHW::Base; typedef TaskItWrap TItWrap; mfxU32 TaskManager::GetNumTask() const { return m_pPar->AsyncDepth + m_pReorder->BufferSize + (m_pPar->AsyncDepth > 1) + TMInterface::Get(*m_pGlob).m_ResourceExtra; } mfxU16 TaskManager::GetBufferSize() const { return !m_pPar->mfx.EncodedOrder * (m_pReorder->BufferSize + (m_pPar->AsyncDepth > 1) + TMInterface::Get(*m_pGlob).m_ResourceExtra); } mfxU16 TaskManager::GetMaxParallelSubmits() const { const auto& vp = Glob::VideoParam::Get(*m_pGlob); if (vp.AsyncDepth == 1) { return mfxU16(1); } return std::min(2, Glob::AllocBS::Get(*m_pGlob).GetResponse().NumFrameActual); } void TaskManager::SetActiveTask(StorageW& task) { m_pFrameCheckLocal->Insert(Tmp::CurrTask::Key, new StorableRef(task)); } bool TaskManager::IsInputTask(const StorageR& task) const { return !!Task::Common::Get(task).pSurfIn; } mfxU32 TaskManager::GetStage(const StorageR& task) const { return Task::Common::Get(task).stage; } void TaskManager::SetStage(StorageW& task, mfxU32 stage) const { Task::Common::Get(task).stage = stage; } bool TaskManager::IsReorderBypass() const { return !!m_pPar->mfx.EncodedOrder; } template static T GetFirstFrameToDisplay( T begin , T end , T cur) { // In the future this logic might be implemented in post-reordering stage // In this case removal of current frame from reorder list will not be required const size_t framesInBuffer = std::distance(begin, end); if (framesInBuffer < 2) return end; std::list exceptCur; T top = begin; std::generate_n( std::back_inserter(exceptCur) , framesInBuffer , [&]() { return top++; }); exceptCur.remove(cur); const auto firstToDisplay = std::min_element( exceptCur.begin(), exceptCur.end(), [](T& a, T& b) { return a->DisplayOrderInGOP < b->DisplayOrderInGOP; }); return *firstToDisplay; } TTaskIt TaskManager::GetNextTaskToEncode(TTaskIt begin, TTaskIt end, bool bFlush) { auto IsIdrTask = [](const StorageR& rTask) { return IsIdr(Task::Common::Get(rTask).FrameType); }; auto stopIt = std::find_if(begin, end, IsIdrTask); bFlush |= (stopIt != end); // taskIt returned from m_pReorder might be equal to stopIt, which might be both valid or invalid iterator // In the former case, stopIt points to IDR frame. In the latter case, stopIt points to end iterator in the original container auto taskIt = (*m_pReorder)(begin, stopIt, bFlush); if (taskIt == end) return taskIt; TItWrap task(taskIt); auto firstToDisplay = GetFirstFrameToDisplay(TItWrap(begin), TItWrap(stopIt), task); if (firstToDisplay != stopIt) { task->NextBufferedDisplayOrder = firstToDisplay->DisplayOrderInGOP; } else if (std::distance(begin, end) < 2) { // need to show all hidden frames in minGop task->NextBufferedDisplayOrder = std::numeric_limits::max(); } else if (bFlush) { // need to show all hidden frames before end of GOP or end of sequence task->NextBufferedDisplayOrder = std::numeric_limits::max(); } return taskIt; } TTaskIt TaskManager::GetDestToPushQuery(TTaskIt begin, TTaskIt end, StorageW& task) { auto taskPar = Task::Common::Get(task); // Move current task to some location after first shown frame TTaskIt it = begin; for (; it != end; it++) { auto tempPar = Task::Common::Get(*it); if (tempPar.DisplayOrder == taskPar.DisplayOrder) continue; if (!IsHiddenFrame(tempPar)) { it++; break; } } for (; it != end; it++) { auto tempPar = Task::Common::Get(*it); if (tempPar.DisplayOrder > taskPar.DisplayOrder) break; } return it; } bool TaskManager::IsForceSync(const StorageR& task) const { return Task::Common::Get(task).bForceSync; } mfxBitstream* TaskManager::GetBS(const StorageR& task) const { return Task::Common::Get(task).pBsOut; } void TaskManager::SetBS(StorageW& task, mfxBitstream* pBS) const { Task::Common::Get(task).pBsOut = pBS; } bool TaskManager::GetRecode(const StorageR& task) const { return Task::Common::Get(task).bRecode; } void TaskManager::SetRecode(StorageW& task, bool bRecode) const { Task::Common::Get(task).bRecode = bRecode; } bool TaskManager::GetFreed(const StorageR& task) const { return Task::Common::Get(task).bFreed; } void TaskManager::SetFreed(StorageW& task, bool bFreed) const { Task::Common::Get(task).bFreed = bFreed; } mfxU32 TaskManager::GetBsDataLength(const StorageR& task) const { return Task::Common::Get(task).BsDataLength; } void TaskManager::SetBsDataLength(StorageW& task, mfxU32 len) const { Task::Common::Get(task).BsDataLength = len; } void TaskManager::AddNumRecode(StorageW& task, mfxU16 n) const { Task::Common::Get(task).NumRecode += n; } bool TaskManager::IsCached(StorageW& task) const { return Task::Common::Get(task).bCached; } void TaskManager::SetCached(StorageW& task, bool bCached) const { Task::Common::Get(task).bCached = bCached; } void TaskManager::ClearBRCUpdateFlag(StorageW& task) const { #if defined(MFX_ENABLE_ENCTOOLS) Task::Common::Get(task).bBRCUpdated = false; #else std::ignore = task; #endif } mfxStatus TaskManager::RunQueueTaskAlloc(StorageRW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } mfxStatus TaskManager::RunQueueTaskInit( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& task) { return RunBlocks( CheckGE , FeatureBlocks::BQ::Get(*m_pBlocks) , pCtrl, pSurf, pBs, *m_pGlob, task); } mfxStatus TaskManager::RunQueueTaskPreReorder(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob, task); } mfxStatus TaskManager::RunQueueTaskPostReorder(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } mfxStatus TaskManager::RunQueueTaskSubmit(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } bool TaskManager::RunQueueTaskQuery( StorageW& task , std::function stopAt) { auto& q = FeatureBlocks::BQ::Get(*m_pBlocks); auto RunBlock = [&](FeatureBlocks::BQ::TQueue::const_reference block) { return stopAt(block.Call(*m_pGlob, task)); }; return std::any_of(q.begin(), q.end(), RunBlock); } mfxStatus TaskManager::RunQueueTaskFree(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } void TaskManager::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetTMInterface , [this](StorageRW& strg, StorageRW&) -> mfxStatus { TMInterface::GetOrConstruct(strg, ExtTMInterface(*this)); return MFX_ERR_NONE; }); } void TaskManager::InitAlloc(const FeatureBlocks& blocks, TPushIA Push) { Push(BLK_Init , [this, &blocks](StorageRW& strg, StorageRW&) -> mfxStatus { m_pBlocks = &blocks; m_pGlob = &strg; m_pPar = &Glob::VideoParam::Get(strg); m_pReorder = &Glob::Reorder::Get(strg); return ManagerInit(); }); } void TaskManager::FrameSubmit(const FeatureBlocks& /*blocks*/, TPushFS Push) { Push(BLK_NewTask , [this]( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream& bs , StorageW& global , StorageRW& local) -> mfxStatus { m_pGlob = &global; m_pFrameCheckLocal = &local; return TaskNew(pCtrl, pSurf, bs); }); } mfxStatus TaskManager::RunExtraStages(mfxU16 beginStageID, mfxU16 endStageID, StorageW& task) { MFX_CHECK(!m_pGlob.isNull(), MFX_ERR_NONE); auto& stages = TMInterface::Get(*m_pGlob).m_AsyncStages; auto itStage = stages.find(beginStageID); auto itEnd = stages.find(endStageID); MFX_CHECK(itStage != stages.end(), MFX_ERR_NONE); for (; itStage != itEnd; ++itStage) { MFX_SAFE_CALL(itStage->second(*m_pGlob, task)); } return MFX_ERR_NONE; } mfxStatus TaskManager::TaskPrepare(StorageW& task) { RunExtraStages(NextStage(S_NEW), Stage(S_PREPARE), task); return MfxEncodeHW::TaskManager::TaskPrepare(task); } mfxStatus TaskManager::TaskReorder(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_PREPARE), Stage(S_REORDER), task)); return MfxEncodeHW::TaskManager::TaskReorder(task); } mfxStatus TaskManager::TaskSubmit(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_REORDER), Stage(S_SUBMIT), task)); if (TMInterface::Get(*m_pGlob).UpdateTask) { TMInterface::Get(*m_pGlob).UpdateTask(*m_pGlob, GetTask(Stage(S_SUBMIT))); } return MfxEncodeHW::TaskManager::TaskSubmit(task); } mfxStatus TaskManager::TaskQuery(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_SUBMIT), Stage(S_QUERY), task)); return MfxEncodeHW::TaskManager::TaskQuery(task); } void TaskManager::AsyncRoutine(const FeatureBlocks& /*blocks*/, TPushAR Push) { Push(BLK_PrepareTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskPrepare(task); }); Push(BLK_ReorderTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskReorder(task); }); Push(BLK_SubmitTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskSubmit(task); }); Push(BLK_QueryTask , [this]( StorageW& /*global*/ , StorageW& inTask) -> mfxStatus { return TaskQuery(inTask); }); } void TaskManager::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_ResetState , [this](StorageW& global, StorageW&) -> mfxStatus { if (Glob::ResetHint::Get(global).Flags & (RF_IDR_REQUIRED | RF_CANCEL_TASKS)) { CancelTasks(); } auto& hint = Glob::ResetHint::Get(global); MFX_CHECK(hint.Flags & RF_IDR_REQUIRED, MFX_ERR_NONE); auto& real = Glob::RealState::Get(global); Glob::AllocRec::Get(real).UnlockAll(); Glob::AllocBS::Get(real).UnlockAll(); if (real.Contains(Glob::AllocRaw::Key)) Glob::AllocRaw::Get(real).UnlockAll(); return MFX_ERR_NONE; }); } void TaskManager::Close(const FeatureBlocks& /*blocks*/, TPushCLS Push) { Push(BLK_Close , [this](StorageW& /*global*/) -> mfxStatus { CancelTasks(); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_task.h000066400000000000000000000142051443134507600331020ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include "ehw_task_manager.h" namespace AV1EHW { namespace Base { class TaskManager : public FeatureBase , protected MfxEncodeHW::TaskManager { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetTMInterface) \ DECL_BLOCK(Init) \ DECL_BLOCK(ResetState) \ DECL_BLOCK(NewTask) \ DECL_BLOCK(PrepareTask) \ DECL_BLOCK(LASubmit) \ DECL_BLOCK(LAQuery) \ DECL_BLOCK(ReorderTask) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) \ DECL_BLOCK(Close) #define DECL_FEATURE_NAME "Base_TaskManager" #include "av1ehw_decl_blocks.h" TaskManager(mfxU32 id) : FeatureBase(id) { } // Task Manager Interface for extra stages and logic class ExtTMInterface : public Storable { public: ExtTMInterface(MfxEncodeHW::TaskManager& mgr) : m_Manager(mgr) {} using TAsyncStage = CallChain; MfxEncodeHW::TaskManager& m_Manager; std::map m_AsyncStages; mfxU16 m_ResourceExtra = 0; using TUpdateTask = CallChain; TUpdateTask UpdateTask = {}; }; using TMInterface = StorageVar; protected: NotNull m_pPar; NotNull m_pReorder; NotNull m_pBlocks; NotNull m_pGlob; NotNull m_pFrameCheckLocal; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void FrameSubmit(const FeatureBlocks& blocks, TPushFS Push) override; virtual void AsyncRoutine(const FeatureBlocks& blocks, TPushAR Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; virtual mfxU32 GetNumTask() const override; virtual mfxU16 GetBufferSize() const override; virtual mfxU16 GetMaxParallelSubmits() const override; virtual void SetActiveTask(StorageW& task) override; virtual bool IsInputTask(const StorageR& task) const override; virtual mfxU32 GetStage(const StorageR& task) const override; virtual void SetStage(StorageW& task, mfxU32 stage) const override; virtual bool IsReorderBypass() const override; virtual TTaskIt GetNextTaskToEncode(TTaskIt begin, TTaskIt end, bool bFlush) override; virtual bool IsForceSync(const StorageR& task) const override; virtual mfxBitstream* GetBS(const StorageR& task) const override; virtual void SetBS(StorageW& task, mfxBitstream* pBS) const override; virtual bool GetRecode(const StorageR& task) const override; virtual void SetRecode(StorageW& task, bool bRecode) const override; virtual bool GetFreed(const StorageR& task) const override; virtual void SetFreed(StorageW& task, bool bFreed) const override; virtual mfxU32 GetBsDataLength(const StorageR& task) const override; virtual void SetBsDataLength(StorageW& task, mfxU32 len) const override; virtual void AddNumRecode(StorageW& task, mfxU16 n) const override; virtual TTaskIt GetDestToPushQuery(TTaskIt begin, TTaskIt end, StorageW& task ) override; virtual bool IsCached(StorageW& /*task*/) const override; virtual void SetCached(StorageW& /*task*/, bool) const override; virtual void ClearBRCUpdateFlag(StorageW& /*task*/) const override; virtual mfxStatus RunQueueTaskAlloc(StorageRW& task) override; virtual mfxStatus RunQueueTaskInit( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& task) override; virtual mfxStatus RunQueueTaskPreReorder(StorageW& task) override; virtual mfxStatus RunQueueTaskPostReorder(StorageW& task) override; virtual mfxStatus RunQueueTaskSubmit(StorageW& task) override; virtual bool RunQueueTaskQuery( StorageW& task , std::function stopAt) override; virtual mfxStatus RunQueueTaskFree(StorageW& task) override; virtual mfxStatus TaskPrepare(StorageW& /*task*/) override; virtual mfxStatus TaskReorder(StorageW& /*task*/) override; virtual mfxStatus TaskSubmit(StorageW& /*task*/) override; virtual mfxStatus TaskQuery(StorageW& /*task*/) override; mfxStatus RunExtraStages(mfxU16 beginStageID, mfxU16 endStageID, StorageW& task); }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_tile.cpp000066400000000000000000000602401443134507600333510ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_constraints.h" #include "av1ehw_base_tile.h" #include #include namespace AV1EHW { namespace Base { inline bool IsValidTilesSize( const mfxU16 sbNum , const mfxU16 TileNum , const TileSizeArrayType& tileSizeInSB) { mfxU32 sum = 0; mfxU16 idx = 0; while (idx < TileNum && tileSizeInSB[idx] > 0) { sum += tileSizeInSB[idx]; idx++; } return idx == TileNum && sum == sbNum; } /* * Set uniform tile size, refer to spec 5.9.15. Tile info syntax * Return true iff the input params are applicable for uniform tile size */ inline bool SetUniformTileSize( const mfxU16 sbNum , const mfxU16 tileNum , TileSizeArrayType& tileSizeInSB) { assert(tileNum > 0); const mfxU16 tileNumLog2 = TileLog2(mfxU16(1), tileNum); const mfxU16 tileSize = (sbNum + (1 << tileNumLog2) - 1) >> tileNumLog2; mfxU16 cnt = 0; mfxU16 sum = 0; while (sum + tileSize < sbNum) { tileSizeInSB[cnt++] = tileSize; sum += tileSize; } tileSizeInSB[cnt++] = sbNum - sum; if (tileNum != cnt) { std::fill_n(tileSizeInSB, cnt, mfxU16(0)); return false; } return true; } inline void SetNonUniformTileSize( const mfxU16 sbNum , const mfxU16 tileNum , TileSizeArrayType& tileSizeInSB) { assert(tileNum > 0); mfxU16 cnt = 0; auto CalcTileSize = [sbNum, tileNum, &cnt]() { mfxU16 tileSize = ((cnt + 1) * sbNum) / tileNum - (cnt * sbNum) / tileNum; SetIf(tileSize, !tileSize, 1); cnt++; return tileSize; }; std::generate(tileSizeInSB, tileSizeInSB + tileNum, CalcTileSize); } inline void SetTileLimits( const mfxU16 sbCols , const mfxU16 sbRows , const mfxU32 numTileColumns , const TileSizeArrayType &tileWidthInSB , TileLimits& tileLimits) { assert(tileWidthInSB[0] > 0); const mfxU32 tileAreaSb = sbCols * sbRows; const mfxU32 TileColsLog2 = TileLog2(mfxU32(1), numTileColumns); tileLimits.MaxTileWidthSb = AV1_MAX_TILE_WIDTH_SB; mfxU32 maxTileAreaSb = AV1_MAX_TILE_AREA_SB; tileLimits.MinLog2TileCols = TileLog2(tileLimits.MaxTileWidthSb, mfxU32(sbCols)); tileLimits.MaxLog2TileCols = TileLog2(mfxU32(1), std::min(mfxU32(sbCols), AV1_MAX_NUM_TILE_COLS)); tileLimits.MaxLog2TileRows = TileLog2(mfxU32(1), std::min(mfxU32(sbRows), AV1_MAX_NUM_TILE_ROWS)); const mfxU32 minLog2Tiles = std::max(tileLimits.MinLog2TileCols, TileLog2(maxTileAreaSb, tileAreaSb)); tileLimits.MinLog2TileRows = mfxU32(std::max(mfxI32(minLog2Tiles) - mfxI32(TileColsLog2), mfxI32(0))); maxTileAreaSb = tileAreaSb; if (minLog2Tiles) { maxTileAreaSb >>= (minLog2Tiles + 1); } const mfxU32 widestTileSb = *std::max_element(tileWidthInSB, tileWidthInSB + numTileColumns); tileLimits.MaxTileHeightSb = std::max(mfxU32(1), maxTileAreaSb / widestTileSb); } inline mfxU32 CheckTileLimits( const mfxU32 numTileColumns , const mfxU32 numTileRows , const TileSizeArrayType& tileWidthInSB , const TileSizeArrayType& tileHeightInSB , const TileLimits& tileLimits) { mfxU32 invalid = 0; for (mfxU32 i = 0; i < numTileColumns; i++) { invalid += tileWidthInSB[i] > tileLimits.MaxTileWidthSb; } for (mfxU32 i = 0; i < numTileRows; i++) { invalid += tileHeightInSB[i] > tileLimits.MaxTileHeightSb; } mfxU32 TileColsLog2 = TileLog2(mfxU32(1), numTileColumns); mfxU32 TileRowsLog2 = TileLog2(mfxU32(1), numTileRows); invalid = CheckRangeOrClip(TileColsLog2, tileLimits.MinLog2TileCols, tileLimits.MaxLog2TileCols); invalid = CheckRangeOrClip(TileRowsLog2, tileLimits.MinLog2TileRows, tileLimits.MaxLog2TileRows); return invalid; } inline void CleanTileBuffers(mfxExtAV1TileParam* pTilePar, mfxExtAV1AuxData* pAuxPar) { if (pTilePar) { pTilePar->NumTileRows = 0; pTilePar->NumTileColumns = 0; pTilePar->NumTileGroups = 0; } if (pAuxPar) { pAuxPar->UniformTileSpacing = 0; pAuxPar->ContextUpdateTileIdPlus1 = 0; std::fill_n(pAuxPar->TileWidthInSB, sizeof(mfxExtAV1AuxData::TileWidthInSB) / sizeof(mfxU16), mfxU16(0)); std::fill_n(pAuxPar->TileHeightInSB, sizeof(mfxExtAV1AuxData::TileHeightInSB) / sizeof(mfxU16), mfxU16(0)); std::fill_n(pAuxPar->NumTilesPerTileGroup, sizeof(mfxExtAV1AuxData::NumTilesPerTileGroup) / sizeof(mfxU16), mfxU16(0)); } } /* * This function returns true iff bTryUniformTiles is true and input params are applicable for uniform tile size */ inline bool SetDefaultTileSize( const mfxU16 sbNum , const mfxU16 tileNum , const bool bTryUniformTiles , TileSizeArrayType& tileSizeInSB) { if (tileNum == 0 || tileSizeInSB[0] != 0) { return false; } if (bTryUniformTiles) { const bool bSet = SetUniformTileSize(sbNum, tileNum, tileSizeInSB); if (bSet) { return true; } } SetNonUniformTileSize(sbNum, tileNum, tileSizeInSB); return false; } inline mfxU16 GetMinTileCols(const mfxU16 sbCols) { return mfx::CeilDiv(sbCols, mfxU16(AV1_MAX_TILE_WIDTH_SB)); } inline mfxU16 GetMaxNumTileCols(const mfxU16 sbCols) { return std::min(sbCols, mfxU16(AV1_MAX_NUM_TILE_COLS)); } inline mfxU16 GetMinTileRows(const mfxU16 sbRows, const TileLimits& tileLimits) { return mfx::CeilDiv(sbRows, mfxU16(tileLimits.MaxTileHeightSb)); } inline mfxU16 GetMaxTileRows(const mfxU16 sbRows) { return std::min(sbRows, mfxU16(AV1_MAX_NUM_TILE_ROWS)); } inline void SetDefaultTileParams( const mfxU16 sbCols , const mfxU16 sbRows , mfxExtAV1TileParam& tilePar , mfxExtAV1AuxData* pAuxPar) { SetDefault(tilePar.NumTileGroups, 1); if (pAuxPar != nullptr) { SetDefault(tilePar.NumTileColumns, CountTileNumber(pAuxPar->TileWidthInSB)); SetDefault(tilePar.NumTileRows, CountTileNumber(pAuxPar->TileHeightInSB)); } SetDefault(tilePar.NumTileColumns, GetMinTileCols(sbCols)); TileSizeArrayType tileWidthInSB = {}; if (pAuxPar != nullptr) { std::copy_n(pAuxPar->TileWidthInSB, tilePar.NumTileColumns, tileWidthInSB); } bool bTryUniformTiles = pAuxPar == nullptr || (!IsOff(pAuxPar->UniformTileSpacing) && pAuxPar->TileWidthInSB[0] == 0 && pAuxPar->TileHeightInSB[0] == 0); if (!IsValidTilesSize(sbCols, tilePar.NumTileColumns, tileWidthInSB)) { std::fill_n(tileWidthInSB, tilePar.NumTileColumns, mfxU16(0)); SetDefaultTileSize(sbCols, tilePar.NumTileColumns, bTryUniformTiles, tileWidthInSB); } TileLimits tileLimits = {}; SetTileLimits(sbCols, sbRows, tilePar.NumTileColumns, tileWidthInSB, tileLimits); SetDefault(tilePar.NumTileRows, GetMinTileRows(sbRows, tileLimits)); if (pAuxPar != nullptr) { bool bUniformTiles = true; bUniformTiles &= SetDefaultTileSize(sbCols, tilePar.NumTileColumns, bTryUniformTiles, pAuxPar->TileWidthInSB); bUniformTiles &= SetDefaultTileSize(sbRows, tilePar.NumTileRows, bTryUniformTiles, pAuxPar->TileHeightInSB); SetDefault(pAuxPar->UniformTileSpacing, bUniformTiles ? mfxU8(MFX_CODINGOPTION_ON) : mfxU8(MFX_CODINGOPTION_OFF)); SetDefault(pAuxPar->ContextUpdateTileIdPlus1, mfxU8(tilePar.NumTileColumns * tilePar.NumTileRows)); } } inline mfxU32 CheckUniformTileSpacing( const mfxU16 sbCols , const mfxU16 sbRows , const mfxU16 numTileColumns , const mfxU16 numTileRows , const TileSizeArrayType& tileWidthInSB , const TileSizeArrayType& tileHeightInSB , const mfxU8 UniformTileSpacing) { mfxU32 changed = 0; changed += Check (UniformTileSpacing); if (!IsOn(UniformTileSpacing)) { return changed; } // Check if uniform tile spacing is valid TileSizeArrayType tileSizeInSB = {}; if (!SetUniformTileSize(sbCols, numTileColumns, tileSizeInSB)) { return ++changed; } for (mfxU32 i = 0; i < numTileColumns; ++i) { if (tileWidthInSB[i] != tileSizeInSB[i]) { return ++changed; } } if (!SetUniformTileSize(sbRows, numTileRows, tileSizeInSB)) { return ++changed; } for (mfxU32 i = 0; i < numTileRows; ++i) { if (tileHeightInSB[i] != tileSizeInSB[i]) { return ++changed; } } return changed; } inline mfxU32 CheckAndFixTileAuxParams( const mfxU16 sbCols , const mfxU16 sbRows , const mfxU16 numTileCols , const mfxU16 numTileRows , const TileSizeArrayType& tileWidthInSB , const TileSizeArrayType& tileHeightInSB , mfxU8& UniformTileSpacing , mfxU8& ContextUpdateTileIdPlus1) { mfxU32 changed = 0; if (CheckUniformTileSpacing(sbCols, sbRows, numTileCols, numTileRows, tileWidthInSB, tileHeightInSB, UniformTileSpacing)) { UniformTileSpacing = 0; changed++; } changed += CheckMaxOrClip(ContextUpdateTileIdPlus1, mfxU8(numTileCols * numTileRows)); return changed; } /* * This function uses temporal buffers for checking in order to not set default value in ext-buffers (expected behavior for Query()) */ mfxStatus CheckAndFixBuffers( const mfxU16 sbCols , const mfxU16 sbRows , const mfxU16 maxTileColsByLevel , const mfxU32 maxTilesByLevel , mfxExtAV1TileParam& tilePar , mfxExtAV1AuxData* pAuxPar) { mfxU32 changed = 0, invalid = 0; // Make sure tile numbers are alinged between buffers auto numTiles = GetNumTiles(&tilePar, pAuxPar); changed += SetIf(tilePar.NumTileColumns, tilePar.NumTileColumns != std::get<0>(numTiles), std::get<0>(numTiles)); changed += SetIf(tilePar.NumTileRows, tilePar.NumTileRows != std::get<1>(numTiles), std::get<1>(numTiles)); // Prepare buffers for tile number and tile size check TileSizeArrayType tileWidthInSB = {}; TileSizeArrayType tileHeightInSB = {}; // If tile size does exist in input buffer, make sure tile sizes are copied after checking const bool bTileSizeSet = pAuxPar != nullptr && (pAuxPar->TileWidthInSB[0] != 0 || pAuxPar->TileHeightInSB[0] != 0); if (bTileSizeSet) { std::copy_n(pAuxPar->TileWidthInSB, tilePar.NumTileColumns, tileWidthInSB); std::copy_n(pAuxPar->TileHeightInSB, tilePar.NumTileRows, tileHeightInSB); } // Check number of tile columns const mfxU16 maxTileCols = std::min(GetMaxNumTileCols(sbCols), maxTileColsByLevel); const mfxU16 minTileCols = GetMinTileCols(sbCols); changed += CheckRangeOrClip(tilePar.NumTileColumns, minTileCols, maxTileCols); // Check tile widths mfxU32 sizeChanged = 0; const bool bTryUniformTiles = pAuxPar == nullptr || (!IsOff(pAuxPar->UniformTileSpacing) && tileWidthInSB[0] == 0 && tileHeightInSB[0] == 0); if (!IsValidTilesSize(sbCols, tilePar.NumTileColumns, tileWidthInSB)) { sizeChanged++; std::fill_n(tileWidthInSB, tilePar.NumTileColumns, mfxU16(0)); SetDefaultTileSize(sbCols, tilePar.NumTileColumns, bTryUniformTiles, tileWidthInSB); invalid += !IsValidTilesSize(sbCols, tilePar.NumTileColumns, tileWidthInSB); } if (invalid) { CleanTileBuffers(&tilePar, pAuxPar); MFX_RETURN(MFX_ERR_UNSUPPORTED); } // Check number of tile rows TileLimits tileLimits = {}; SetTileLimits(sbCols, sbRows, tilePar.NumTileColumns, tileWidthInSB, tileLimits); MFX_CHECK(tilePar.NumTileColumns != 0, MFX_ERR_UNKNOWN); const mfxU16 maxTileRows = std::min(GetMaxTileRows(sbRows), mfxU16(maxTilesByLevel / tilePar.NumTileColumns)); const mfxU16 minTileRows = GetMinTileRows(sbRows, tileLimits); changed += CheckRangeOrClip(tilePar.NumTileRows, minTileRows, maxTileRows); changed += CheckRangeOrClip(tilePar.NumTileGroups, mfxU16(0), mfxU16(tilePar.NumTileColumns * tilePar.NumTileRows)); // Check tile heights if (!IsValidTilesSize(sbRows, tilePar.NumTileRows, tileHeightInSB)) { sizeChanged++; std::fill_n(tileHeightInSB, tilePar.NumTileRows, mfxU16(0)); SetDefaultTileSize(sbRows, tilePar.NumTileRows, bTryUniformTiles, tileHeightInSB); invalid += !IsValidTilesSize(sbRows, tilePar.NumTileRows, tileHeightInSB); } if (invalid) { CleanTileBuffers(&tilePar, pAuxPar); MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (bTileSizeSet) { changed += sizeChanged; std::copy_n(tileWidthInSB, tilePar.NumTileColumns, pAuxPar->TileWidthInSB); std::copy_n(tileHeightInSB, tilePar.NumTileRows, pAuxPar->TileHeightInSB); } // Check tile size against limits invalid += CheckTileLimits(tilePar.NumTileColumns, tilePar.NumTileRows, tileWidthInSB, tileHeightInSB, tileLimits); if (invalid) { CleanTileBuffers(&tilePar, pAuxPar); MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (pAuxPar != nullptr) { changed += CheckAndFixTileAuxParams(sbCols, sbRows, tilePar.NumTileColumns, tilePar.NumTileRows, tileWidthInSB, tileHeightInSB, pAuxPar->UniformTileSpacing, pAuxPar->ContextUpdateTileIdPlus1); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } inline void SetTileInfo( const mfxU16 sbCols , const mfxU16 sbRows , const mfxExtAV1TileParam& tilePar , const mfxExtAV1AuxData& auxPar , const EncodeCapsAv1& caps , TileInfoAv1& tileInfo) { tileInfo = {}; tileInfo.TileCols = tilePar.NumTileColumns; tileInfo.TileRows = tilePar.NumTileRows; tileInfo.TileColsLog2 = TileLog2(mfxU32(1), mfxU32(tilePar.NumTileColumns)); tileInfo.TileRowsLog2 = TileLog2(mfxU32(1), mfxU32(tilePar.NumTileRows)); SetTileLimits(sbCols, sbRows, tilePar.NumTileColumns, auxPar.TileWidthInSB, tileInfo.tileLimits); for (int i = 0; i < tilePar.NumTileColumns; i++) { tileInfo.TileWidthInSB[i] = auxPar.TileWidthInSB[i]; } for (int i = 0; i < tilePar.NumTileRows; i++) { tileInfo.TileHeightInSB[i] = auxPar.TileHeightInSB[i]; } tileInfo.uniform_tile_spacing_flag = CO2Flag(auxPar.UniformTileSpacing); tileInfo.context_update_tile_id = auxPar.ContextUpdateTileIdPlus1 - 1; tileInfo.TileSizeBytes = caps.TileSizeBytesMinus1 + 1; } inline void SetTileGroupsInfo( const mfxU32 numTileGroups , const mfxU32 numTiles , TileGroupInfos& infos) { infos.clear(); if (numTiles == 0) { infos.push_back({ 0, 0 }); return; } if (numTileGroups <= 1 || numTileGroups > numTiles) { // several tiles in one tile group infos.push_back({0, numTiles - 1}); return; } // several tiles in several tile groups uint32_t cnt = 0; uint32_t size = numTiles / numTileGroups; for (uint16_t i = 0; i < numTileGroups; i++) { TileGroupInfo tgi = { cnt, cnt + size - 1 }; cnt += size; if (i == numTileGroups - 1) { tgi.TgEnd = numTiles - 1; } infos.push_back(std::move(tgi)); } } void Tile::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_AV1_TILE_PARAM].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAV1TileParam*)pSrc; auto& buf_dst = *(mfxExtAV1TileParam*)pDst; MFX_COPY_FIELD(NumTileRows); MFX_COPY_FIELD(NumTileColumns); MFX_COPY_FIELD(NumTileGroups); }); } void Tile::SetInherited(ParamInheritance& par) { #define INIT_EB(TYPE)\ if (!pSrc || !pDst) return;\ auto& ebInit = *(TYPE*)pSrc;\ auto& ebReset = *(TYPE*)pDst; #define INHERIT_OPT(OPT) InheritOption(ebInit.OPT, ebReset.OPT); par.m_ebInheritDefault[MFX_EXTBUFF_AV1_TILE_PARAM].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtAV1TileParam); INHERIT_OPT(NumTileRows); INHERIT_OPT(NumTileColumns); INHERIT_OPT(NumTileGroups); }); } void Tile::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& par, StorageW&, StorageRW&) { // Not check any tile related params in AuxData if pTilePar is nullptr mfxExtAV1TileParam* pTilePar = ExtBuffer::Get(par); if (!pTilePar) { return; } mfxU16 sbCols = 0, sbRows = 0; std::tie(sbCols, sbRows) = GetSBNum(par); mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); SetDefaultTileParams(sbCols, sbRows, *pTilePar, pAuxPar); }); } void Tile::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& global) -> mfxStatus { // Not checking any tile related params in AuxData if pTilePar is nullptr mfxExtAV1TileParam* pTilePar = ExtBuffer::Get(out); MFX_CHECK(pTilePar, MFX_ERR_NONE); mfxU16 sbCols = 0, sbRows = 0; std::tie(sbCols, sbRows) = GetSBNum(out); const auto& caps = Glob::EncodeCaps::Get(global); const auto& defchain = Glob::Defaults::Get(global); const Defaults::Param& defPar = Defaults::Param(out, caps, defchain); const mfxU16 minLevel = GetMinLevel(defPar, std::max(out.mfx.CodecLevel, mfxU16(MFX_LEVEL_AV1_2))); const mfxU16 maxTileColsByLevel = GetMaxTileCols(minLevel); const mfxU32 maxTilesByLevel = GetMaxTiles(minLevel); mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(out); return CheckAndFixBuffers(sbCols, sbRows, maxTileColsByLevel, maxTilesByLevel, *pTilePar, pAuxPar); }); } void Tile::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetTileInfo , [this](StorageRW& strg, StorageRW&) -> mfxStatus { //In current design FH should be initialized in General feature first MFX_CHECK(strg.Contains(Glob::FH::Key), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(strg.Contains(Glob::EncodeCaps::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& fh = Glob::FH::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); auto& par = Glob::VideoParam::Get(strg); mfxU16 sbCols = 0, sbRows = 0; std::tie(sbCols, sbRows) = GetSBNum(par); fh.sbCols = sbCols; fh.sbRows = sbRows; const mfxExtAV1TileParam& tilePar = ExtBuffer::Get(par); const mfxExtAV1AuxData& auxPar = ExtBuffer::Get(par); SetTileInfo(sbCols, sbRows, tilePar, auxPar, caps, fh.tile_info); return MFX_ERR_NONE; }); Push(BLK_SetTileGroups , [this](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); const mfxExtAV1TileParam& tilePar = ExtBuffer::Get(par); auto& infos = Glob::TileGroups::GetOrConstruct(strg); const mfxU32 numTiles = tilePar.NumTileColumns * tilePar.NumTileRows; SetTileGroupsInfo(tilePar.NumTileGroups, numTiles, infos); return MFX_ERR_NONE; }); } void Tile::AllocTask(const FeatureBlocks& blocks, TPushAT Push) { Push(BLK_AllocTask , [this, &blocks]( StorageR& , StorageRW& task) -> mfxStatus { task.Insert(Task::TileInfo::Key, new MakeStorable); task.Insert(Task::TileGroups::Key, new MakeStorable); return MFX_ERR_NONE; }); } inline bool IsTileUpdated(const mfxExtAV1TileParam* pFrameTilePar) { return pFrameTilePar && (pFrameTilePar->NumTileColumns > 0 || pFrameTilePar->NumTileRows > 0); } void Tile::InitTask(const FeatureBlocks& blocks, TPushIT Push) { Push(BLK_InitTask , [this, &blocks]( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& global , StorageW& task) -> mfxStatus { mfxExtAV1TileParam* pFrameTilePar = ExtBuffer::Get(Task::Common::Get(task).ctrl); MFX_CHECK(IsTileUpdated(pFrameTilePar), MFX_ERR_NONE); auto& par = Glob::VideoParam::Get(global); const mfxExtAV1TileParam* pTilePar = ExtBuffer::Get(par); const mfxExtAV1AuxData* pAuxPar = ExtBuffer::Get(par); MFX_CHECK(pTilePar && pAuxPar, MFX_ERR_UNDEFINED_BEHAVIOR); mfxU16 sbCols = 0, sbRows = 0; std::tie(sbCols, sbRows) = GetSBNum(par); mfxExtAV1AuxData* pFrameAuxPar = ExtBuffer::Get(Task::Common::Get(task).ctrl); mfxExtAV1AuxData tempAuxPar = {}; if (!pFrameAuxPar) { pFrameAuxPar = &tempAuxPar; } const mfxU16 maxTileColsByLevel = GetMaxTileCols(par.mfx.CodecLevel); const mfxU32 maxTilesByLevel = GetMaxTiles(par.mfx.CodecLevel); SetDefaultTileParams(sbCols, sbRows, *pFrameTilePar, pFrameAuxPar); mfxStatus sts = CheckAndFixBuffers(sbCols, sbRows, maxTileColsByLevel, maxTilesByLevel, *pFrameTilePar, pFrameAuxPar); if (sts < MFX_ERR_NONE) { // Ignore Frame Tile param and return warning if there are issues MSDK can't fix MFX_LOG_WARN("Issue in Frame tile settings - it's ignored!\n"); return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } const auto& caps = Glob::EncodeCaps::Get(global); auto& tileInfo = Task::TileInfo::Get(task); SetTileInfo(sbCols, sbRows, *pFrameTilePar, *pFrameAuxPar, caps, tileInfo); return sts; }); } inline void UpdateFrameTileInfo(FH& currFH, const TileInfoAv1& tileInfo) { currFH.tile_info = tileInfo; } void Tile::PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) { Push(BLK_ConfigureTask , [this, &blocks]( StorageW& /*global*/ , StorageW& s_task) -> mfxStatus { mfxExtAV1TileParam* pFrameTilePar = ExtBuffer::Get(Task::Common::Get(s_task).ctrl); if (!IsTileUpdated(pFrameTilePar)) { Task::TileGroups::Get(s_task) = {}; return MFX_ERR_NONE; } auto& fh = Task::FH::Get(s_task); auto& tileInfo = Task::TileInfo::Get(s_task); UpdateFrameTileInfo(fh, tileInfo); mfxU32 numTiles = pFrameTilePar->NumTileColumns * pFrameTilePar->NumTileColumns; auto& tileGroupInfos = Task::TileGroups::Get(s_task); SetTileGroupsInfo(pFrameTilePar->NumTileGroups, numTiles, tileGroupInfos); return MFX_ERR_NONE; }); } void Tile::ResetState(const FeatureBlocks& blocks, TPushRS Push) { Push(BLK_ResetState , [this, &blocks]( StorageRW& global , StorageRW&) -> mfxStatus { auto& real = Glob::RealState::Get(global); Glob::TileGroups::Get(real) = Glob::TileGroups::Get(global); return MFX_ERR_NONE; }); } } } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/agnostic/base/av1ehw_base_tile.h000066400000000000000000000053661443134507600331050ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" namespace AV1EHW { namespace Base { class Tile : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix )\ DECL_BLOCK(SetDefaults )\ DECL_BLOCK(SetTileInfo )\ DECL_BLOCK(SetTileGroups )\ DECL_BLOCK(AllocTask )\ DECL_BLOCK(InitTask )\ DECL_BLOCK(ConfigureTask )\ DECL_BLOCK(ResetState ) #define DECL_FEATURE_NAME "Base_Tile" #include "av1ehw_decl_blocks.h" Tile(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void AllocTask(const FeatureBlocks& /*blocks*/, TPushAT Push) override; virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; //mfxStatus UpdateFrameTileInfo( // const TaskCommonPar& task // , TileInfoAv1& tileInfo) const; }; } //Base } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/av1ehw_disp.cpp000066400000000000000000000070251443134507600277210ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_disp.h" #include "av1ehw_base.h" #include "av1ehw_base_lin.h" #include "av1ehw_xe_hpm_lin.h" namespace AV1EHWDisp { namespace Xe_HPM { using namespace AV1EHW::Linux::Xe_HPM; }; }; #include "av1ehw_xe_lpm_plus_lin.h" namespace AV1EHWDisp { namespace Xe_LPM_Plus { using namespace AV1EHW::Linux::Xe_LPM_Plus; }; }; namespace AV1EHW { static ImplBase* CreateSpecific( VideoCORE& core , mfxStatus& status , eFeatureMode mode) { ImplBase* impl = nullptr; auto hw = core.GetHWType(); if (hw < MFX_HW_SCL) status = MFX_ERR_UNSUPPORTED; if (hw == MFX_HW_DG2) impl = new AV1EHWDisp::Xe_HPM::MFXVideoENCODEAV1_HW(core, status, mode); else if (hw == MFX_HW_MTL) impl = new AV1EHWDisp::Xe_LPM_Plus::MFXVideoENCODEAV1_HW(core, status, mode); if (impl == nullptr) status = MFX_ERR_UNSUPPORTED; return impl; } VideoENCODE* Create( VideoCORE& core , mfxStatus& status) { return CreateSpecific(core, status, eFeatureMode::INIT); } mfxStatus QueryIOSurf( VideoCORE *core , mfxVideoParam *par , mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR3(core, par, request); mfxStatus sts = MFX_ERR_NONE; std::unique_ptr impl(CreateSpecific(*core, sts, eFeatureMode::QUERY_IO_SURF)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->InternalQueryIOSurf(*core, *par, *request); } mfxStatus Query( VideoCORE *core , mfxVideoParam *in , mfxVideoParam *out) { MFX_CHECK_NULL_PTR2(core, out); mfxStatus sts = MFX_ERR_NONE; eFeatureMode mode = in ? eFeatureMode::QUERY1 : eFeatureMode::QUERY0; std::unique_ptr impl(CreateSpecific(*core, sts, mode)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->InternalQuery(*core, in, *out); } mfxStatus QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { auto hw = core.GetHWType(); std::ignore = hw; mfxStatus sts = MFX_ERR_NONE; std::unique_ptr impl(CreateSpecific(core, sts, eFeatureMode::QUERY_IMPLS_DESCRIPTION)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->QueryImplsDescription(core, caps, ah); } } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/av1ehw_disp.h000066400000000000000000000033251443134507600273650ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "mfxvideo++int.h" namespace AV1EHW { VideoENCODE* Create( VideoCORE& core , mfxStatus& status); mfxStatus QueryIOSurf( VideoCORE *core , mfxVideoParam *par , mfxFrameAllocRequest *request); mfxStatus Query( VideoCORE *core , mfxVideoParam *in , mfxVideoParam *out); mfxStatus QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/av1eimplbase.h000066400000000000000000000034541443134507600275270ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "mfxvideo.h" class ImplBase : virtual public VideoENCODE { public: virtual mfxStatus InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) = 0; virtual mfxStatus InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) = 0; virtual ImplBase* ApplyMode(mfxU32 /*mode*/) { return this; } virtual mfxStatus QueryImplsDescription( VideoCORE& , mfxEncoderDescription::encoder& , mfx::PODArraysHolder&) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/000077500000000000000000000000001443134507600261365ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_HPM/000077500000000000000000000000001443134507600272165ustar00rootroot00000000000000av1ehw_xe_hpm_lin.cpp000066400000000000000000000034671443134507600332520ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_HPM// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_xe_hpm_lin.h" #include "av1ehw_base_data.h" #include "av1ehw_base_general.h" #include "av1ehw_xe_hpm_segmentation.h" using namespace AV1EHW; Linux::Xe_HPM::MFXVideoENCODEAV1_HW::MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseImpl(core, status, mode) { TFeatureList newFeatures; newFeatures.emplace_back(new AV1EHW::Xe_HPM::Segmentation(AV1EHW::Base::FEATURE_SEGMENTATION)); for (auto& pFeature : newFeatures) pFeature->Init(mode, *this); TBaseImpl::m_features.splice(TBaseImpl::m_features.end(), newFeatures); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_HPM/av1ehw_xe_hpm_lin.h000066400000000000000000000033061443134507600327660ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_xe_hpm.h" #include "av1ehw_base_lin.h" namespace AV1EHW { namespace Linux { namespace Xe_HPM { class MFXVideoENCODEAV1_HW : public AV1EHW::Linux::Base::MFXVideoENCODEAV1_HW { public: using TBaseImpl = AV1EHW::Linux::Base::MFXVideoENCODEAV1_HW; MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); }; } //Xe_HPM } //Linux } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_LPM_plus/000077500000000000000000000000001443134507600302655ustar00rootroot00000000000000av1ehw_xe_lpm_plus_lin.cpp000066400000000000000000000034751443134507600353670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_LPM_plus// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_data.h" #include "av1ehw_base_general.h" #include "av1ehw_base_segmentation.h" #include "av1ehw_xe_lpm_plus_lin.h" using namespace AV1EHW; Linux::Xe_LPM_Plus::MFXVideoENCODEAV1_HW::MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseImpl(core, status, mode) { TFeatureList newFeatures; newFeatures.emplace_back(new AV1EHW::Base::Segmentation(AV1EHW::Base::FEATURE_SEGMENTATION)); for (auto& pFeature : newFeatures) pFeature->Init(mode, *this); TBaseImpl::m_features.splice(TBaseImpl::m_features.end(), newFeatures); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_xe_lpm_plus_lin.h000066400000000000000000000033071443134507600350260ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/Xe_LPM_plus// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_xe_lpm_plus.h" #include "av1ehw_base_lin.h" namespace AV1EHW { namespace Linux { namespace Xe_LPM_Plus { class MFXVideoENCODEAV1_HW : public Linux::Base::MFXVideoENCODEAV1_HW { public: using TBaseImpl = Linux::Base::MFXVideoENCODEAV1_HW; MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); }; } //Xe_LPM_Plus } //Linux }// namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/av1ehw_struct_vaapi.h000066400000000000000000000027301443134507600322700ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) typedef enum tagENCODE_FRAME_SIZE_TOLERANCE { eFrameSizeTolerance_Normal = 0, // Default eFrameSizeTolerance_Low = 1, // Sliding Window eFrameSizeTolerance_ExtremelyLow = 2 // Low delay } ENCODE_FRAME_SIZE_TOLERANCE; #endif // defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base/000077500000000000000000000000001443134507600270505ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base/av1ehw_base_lin.cpp000066400000000000000000000061601443134507600326060ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_lin.h" #include "av1ehw_base_data.h" #include "av1ehw_base_alloc.h" #include "av1ehw_base_general.h" #include "av1ehw_base_packer.h" #include "av1ehw_base_task.h" #include "av1ehw_base_va_lin.h" #include "av1ehw_base_va_packer_lin.h" #include "av1ehw_base_tile.h" #include "av1ehw_base_query_impl_desc.h" #include "av1ehw_base_qmatrix_lin.h" #include "av1ehw_base_max_frame_size_lin.h" #if defined(MFX_ENABLE_ENCTOOLS) #include "av1ehw_base_enctools.h" #endif #include "av1ehw_base_hdr.h" using namespace AV1EHW; using namespace AV1EHW::Base; Linux::Base::MFXVideoENCODEAV1_HW::MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : AV1EHW::Base::MFXVideoENCODEAV1_HW(core) { status = MFX_ERR_UNKNOWN; auto vaType = core.GetVAType(); m_features.emplace_back(new Allocator(FEATURE_ALLOCATOR)); if(vaType == MFX_HW_VAAPI) { m_features.emplace_back(new DDI_VA(FEATURE_DDI)); } else { status = MFX_ERR_UNSUPPORTED; return; } m_features.emplace_back(new VAPacker(FEATURE_DDI_PACKER)); m_features.emplace_back(new General(FEATURE_GENERAL)); m_features.emplace_back(new TaskManager(FEATURE_TASK_MANAGER)); m_features.emplace_back(new Packer(FEATURE_PACKER)); m_features.emplace_back(new MaxFrameSize(FEATURE_MAX_FRAME_SIZE)); m_features.emplace_back(new Tile(FEATURE_TILE)); m_features.emplace_back(new QueryImplDesc(FEATURE_QUERY_IMPL_DESC)); m_features.emplace_back(new QMatrix(FEATURE_QMATRIX)); #if defined(MFX_ENABLE_ENCTOOLS) m_features.emplace_back(new AV1EncTools(FEATURE_ENCTOOLS)); #endif m_features.emplace_back(new Hdr(FEATURE_HDR)); InternalInitFeatures(status, mode); } mfxStatus Linux::Base::MFXVideoENCODEAV1_HW::Init(mfxVideoParam *par) { mfxStatus sts = AV1EHW::Base::MFXVideoENCODEAV1_HW::Init(par); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return sts; } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base/av1ehw_base_lin.h000066400000000000000000000032311443134507600322470ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_impl.h" namespace AV1EHW { namespace Linux { namespace Base { class MFXVideoENCODEAV1_HW : public AV1EHW::Base::MFXVideoENCODEAV1_HW { public: MFXVideoENCODEAV1_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); virtual mfxStatus Init(mfxVideoParam *par) override; }; } //Base } //Linux } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_max_frame_size_lin.cpp000066400000000000000000000050351443134507600356000ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_max_frame_size_lin.h" #include "av1ehw_base_va_packer_lin.h" using namespace AV1EHW; using namespace AV1EHW::Base; void Linux::Base::MaxFrameSize::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& global, StorageRW& /*local*/) -> mfxStatus { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(Glob::VideoParam::Get(global)); auto vaType = Glob::VideoCore::Get(global).GetVAType(); MFX_CHECK(vaType == MFX_HW_VAAPI, MFX_ERR_NONE); if (!!CO2.MaxFrameSize) { auto& cc = VAPacker::CC::GetOrConstruct(global); cc.AddPerPicMiscData[VAEncMiscParameterTypeMaxFrameSize].Push([]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& /*s_task*/ , std::list>& data) { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(Glob::VideoParam::Get(strg)); auto& maxFrameSize = AddVaMisc( VAEncMiscParameterTypeMaxFrameSize , data); maxFrameSize.max_frame_size = CO2.MaxFrameSize * 8; return true; }); } return MFX_ERR_NONE; }); } #endif // defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_max_frame_size_lin.h000066400000000000000000000032211443134507600352400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_max_frame_size.h" namespace AV1EHW { namespace Linux { namespace Base { class MaxFrameSize : public AV1EHW::Base::MaxFrameSize { public: MaxFrameSize(mfxU32 FeatureId) : AV1EHW::Base::MaxFrameSize(FeatureId) {} protected: virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; }; } //Base } //Linux } //namespace AV1EHW #endif // defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_qmatrix_lin.h000066400000000000000000000036761443134507600337520ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_qmatrix.h" #include "av1ehw_base_va_packer_lin.h" namespace AV1EHW { namespace Linux { namespace Base { class QMatrix : public AV1EHW::Base::QMatrix { public: QMatrix(mfxU32 FeatureId) : AV1EHW::Base::QMatrix(FeatureId) {} protected: virtual mfxStatus GetQPInfo(const void* pDdiFeedback, mfxU16& qp) override { MFX_CHECK(pDdiFeedback, MFX_ERR_UNDEFINED_BEHAVIOR); const auto pFeedback = static_cast(pDdiFeedback); qp = mfxU16(pFeedback->status & VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK); return MFX_ERR_NONE; } }; } //Base } //Linux } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base/av1ehw_base_va_lin.cpp000066400000000000000000000363271443134507600333040ustar00rootroot00000000000000// Copyright (c) 2021-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfx_enc_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base_va_lin.h" using namespace AV1EHW; using namespace AV1EHW::Base; using namespace AV1EHW::Linux::Base; mfxStatus DDI_VA::SetDDIID(const mfxU16 bitDepth, const mfxU16 chromFormat, const mfxU32 /*fourCC*/, const mfxU16/* targetChromaFormat*/) { MFX_CHECK(!m_vaid, MFX_ERR_NONE); static const std::map> VAIDSupported = { { mfxU16(BITDEPTH_8), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileAV1Profile0, VAEntrypointEncSliceLP}} } } , { mfxU16(BITDEPTH_10), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileAV1Profile0, VAEntrypointEncSliceLP}} } } }; // Check that list of VAIDs contains VAID for resulting BitDepth, ChromaFormat bool bSupported = VAIDSupported.count(bitDepth) && VAIDSupported.at(bitDepth).count(chromFormat); MFX_CHECK(bSupported, MFX_ERR_UNSUPPORTED); // Choose and return VAID m_vaid = const_cast(&VAIDSupported.at(bitDepth).at(chromFormat)); return MFX_ERR_NONE; } void DDI_VA::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetCallChains , [this](const mfxVideoParam&, mfxVideoParam& /*par*/, StorageRW& strg) -> mfxStatus { auto& ddiExec = Glob::DDI_Execute::GetOrConstruct(strg); MFX_CHECK(!ddiExec, MFX_ERR_NONE); ddiExec.Push([&](Glob::DDI_Execute::TRef::TExt, const DDIExecParam& ep) { return Execute(ep); }); m_callVa = ddiExec; return MFX_ERR_NONE; }); Push(BLK_SetDDIID , [this](const mfxVideoParam& par, mfxVideoParam&, StorageRW& strg) -> mfxStatus { EncodeCapsAv1 fakeCaps; std::unique_ptr m_pDefaults( new Defaults::Param( par , fakeCaps , Glob::Defaults::Get(strg))); MFX_CHECK_NULL_PTR1(m_pDefaults); const mfxU16 bitDepth = m_pDefaults->base.GetBitDepthLuma(*m_pDefaults); const mfxU16 chromaFormat = par.mfx.FrameInfo.ChromaFormat; const mfxU32 fourCC = par.mfx.FrameInfo.FourCC; const mfxU16 profile = par.mfx.CodecProfile; const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(m_pDefaults->mvp); mfxU16 targetChromaFormat = MFX_CHROMAFORMAT_YUV420; SetIf(targetChromaFormat, profile == MFX_PROFILE_AV1_HIGH, MFX_CHROMAFORMAT_YUV444); if (pCO3) { SetIf(targetChromaFormat, !pCO3->TargetChromaFormatPlus1, pCO3->TargetChromaFormatPlus1 - 1); } MFX_SAFE_CALL(SetDDIID(bitDepth, chromaFormat, fourCC, targetChromaFormat)); return MFX_ERR_NONE; }); } mfxStatus DDI_VA::CreateAndQueryCaps(const mfxVideoParam& par, StorageW& strg) { bool bNeedNewDevice = !IsValid() || !m_vaid || VAProfile(m_vaid->Profile) != m_profile || VAEntrypoint(m_vaid->Entrypoint) != m_entrypoint; m_callVa = Glob::DDI_Execute::Get(strg); if (bNeedNewDevice) { MFX_CHECK(m_vaid, MFX_ERR_UNDEFINED_BEHAVIOR); auto vap = VAProfile(m_vaid->Profile); auto vaep = VAEntrypoint(m_vaid->Entrypoint); auto& core = Glob::VideoCore::Get(strg); mfxStatus sts = Create(core, vap, vaep); MFX_CHECK_STS(sts); sts = QueryCaps(); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } void DDI_VA::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_QueryCaps , [this](const mfxVideoParam& par, StorageW& strg, StorageRW&) { CreateAndQueryCaps(par, strg); auto& caps = Glob::EncodeCaps::Get(strg); caps = m_caps; }); } void DDI_VA::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_QueryCaps , [this](const mfxVideoParam&, mfxVideoParam& par, StorageRW& strg) -> mfxStatus { auto sts = CreateAndQueryCaps(par, strg); MFX_CHECK_STS(sts); auto& caps = Glob::EncodeCaps::GetOrConstruct(strg); caps = m_caps; return sts; }); } void DDI_VA::InitExternal(const FeatureBlocks& /*blocks*/, TPushIE Push) { Push(BLK_CreateDevice , [this](const mfxVideoParam& par, StorageRW& strg, StorageRW&) -> mfxStatus { return CreateAndQueryCaps(par, strg); }); } mfxStatus DDI_VA::CreateVABuffers( const std::list& par , std::vector& pool) { pool.resize(par.size(), VA_INVALID_ID); std::transform(par.begin(), par.end(), pool.begin() , [this](const DDIExecParam& p){ return CreateVABuffer(p); }); bool bFailed = pool.end() != std::find(pool.begin(), pool.end(), VA_INVALID_ID); MFX_CHECK(!bFailed, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus DDI_VA::DestroyVABuffers(std::vector& pool) { bool bFailed = std::any_of(pool.begin(), pool.end() , [this](VABufferID id) { return !!DestroyVABuffer(id); }); pool.clear(); MFX_CHECK(!bFailed, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } void DDI_VA::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_CreateService , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { const auto& par = Glob::VideoParam::Get(strg); const mfxExtAV1ResolutionParam& rsPar = ExtBuffer::Get(par); mfxStatus sts; m_callVa = Glob::DDI_Execute::Get(strg); std::vector attrib(2); attrib[0].type = VAConfigAttribRTFormat; attrib[1].type = VAConfigAttribRateControl; sts = MfxEncodeHW::DeviceVAAPI::QueryCaps(attrib.data(), attrib.size() * sizeof(VAConfigAttrib)); MFX_CHECK_STS(sts); MFX_CHECK(attrib[0].value & (VA_RT_FORMAT_YUV420 | VA_RT_FORMAT_YUV420_10), MFX_ERR_DEVICE_FAILED); uint32_t vaRCType = ConvertRateControlMFX2VAAPI(par.mfx.RateControlMethod); MFX_CHECK((attrib[1].value & vaRCType), MFX_ERR_DEVICE_FAILED); attrib[1].value = vaRCType; sts = MfxEncodeHW::DeviceVAAPI::Init( rsPar.FrameWidth , rsPar.FrameHeight , VA_PROGRESSIVE , Glob::AllocRec::Get(strg).GetResponse() , attrib.data() , int(attrib.size())); MFX_CHECK_STS(sts); auto& info = Tmp::BSAllocInfo::GetOrConstruct(local); // request linear buffer info.Info.FourCC = MFX_FOURCC_P8; // context_id required for allocation video memory (temp solution) info.AllocId = m_vaContextEncode; info.Info.Width = rsPar.FrameWidth * 2; info.Info.Height = rsPar.FrameHeight; return MFX_ERR_NONE; }); Push(BLK_Register , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& res = Glob::DDI_Resources::Get(strg); auto itBs = std::find_if(res.begin(), res.end() , [](decltype(*res.begin()) r) { return r.Function == MFX_FOURCC_P8; }); MFX_CHECK(itBs != res.end(), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(itBs->Resource.Size == sizeof(VABufferID), MFX_ERR_UNDEFINED_BEHAVIOR); VABufferID* pBsBegin = (VABufferID*)itBs->Resource.pData; m_bs.assign(pBsBegin, pBsBegin + itBs->Resource.Num); mfxStatus sts = CreateVABuffers( Tmp::DDI_InitParam::Get(local) , m_perSeqPar); MFX_CHECK_STS(sts); return MFX_ERR_NONE; }); } void DDI_VA::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts; m_callVa = Glob::DDI_Execute::Get(strg); sts = DestroyVABuffers(m_perSeqPar); MFX_CHECK_STS(sts); sts = CreateVABuffers(Tmp::DDI_InitParam::Get(local), m_perSeqPar); MFX_CHECK_STS(sts); return MFX_ERR_NONE; }); } void DDI_VA::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SubmitTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { mfxStatus sts; auto& task = Task::Common::Get(s_task); m_callVa = Glob::DDI_Execute::Get(global); MFX_CHECK((task.SkipCMD & SKIPCMD_NeedDriverCall), MFX_ERR_NONE); sts = DestroyVABuffers(m_perPicPar); MFX_CHECK_STS(sts); sts = CreateVABuffers(Glob::DDI_SubmitParam::Get(global), m_perPicPar); MFX_CHECK_STS(sts); sts = BeginPicture(task.HDLRaw.first); MFX_CHECK_STS(sts); sts = RenderPicture(m_perPicPar.data(), (int)m_perPicPar.size()); MFX_CHECK_STS(sts); sts = RenderPicture(m_perSeqPar.data(), (int)m_perSeqPar.size()); MFX_CHECK_STS(sts); sts = EndPicture(); MFX_CHECK_STS(sts); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS , "A|ENCODE|AV1|PACKET_END|", "%d|%d" , m_vaContextEncode, task.StatusReportId); return MFX_ERR_NONE; }); } void DDI_VA::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); m_callVa = Glob::DDI_Execute::Get(global); MFX_CHECK((task.SkipCMD & SKIPCMD_NeedDriverCall), MFX_ERR_NONE); return QueryStatus(Glob::DDI_Feedback::Get(global), task.StatusReportId); }); } mfxStatus DDI_VA::QueryCaps() { m_caps = {}; std::map idx_map; VAConfigAttribType attr_types[] = { VAConfigAttribRTFormat , VAConfigAttribRateControl , VAConfigAttribMaxPictureHeight , VAConfigAttribMaxPictureWidth , VAConfigAttribEncMaxRefFrames , VAConfigAttribEncTileSupport , VAConfigAttribEncDynamicScaling , VAConfigAttribMaxFrameSize , (VAConfigAttribType)VAConfigAttribEncAV1 , (VAConfigAttribType)VAConfigAttribEncAV1Ext1 , (VAConfigAttribType)VAConfigAttribEncAV1Ext2 }; std::vector attrs; auto AV = [&](VAConfigAttribType t) {return attrs[idx_map[t]].value; }; mfxI32 i = 0; std::for_each(std::begin(attr_types), std::end(attr_types) , [&](decltype(*std::begin(attr_types)) type) { attrs.push_back({ type, 0 }); idx_map[type] = i; i++; }); auto sts = MfxEncodeHW::DeviceVAAPI::QueryCaps(attrs.data(), attrs.size() * sizeof(VAConfigAttrib)); MFX_CHECK_STS(sts); m_caps.ChromaSupportFlags.fields.i420 = !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV420); m_caps.BitDepthSupportFlags.fields.eight_bits = !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV420); m_caps.BitDepthSupportFlags.fields.ten_bits = !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV420_10BPP); m_caps.msdk.CBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CBR); m_caps.msdk.VBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_VBR); m_caps.msdk.CQPSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CQP); m_caps.msdk.ICQSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_ICQ); m_caps.UserMaxFrameSizeSupport = !!(AV(VAConfigAttribMaxFrameSize)); #if VA_CHECK_VERSION(1, 10, 0) m_caps.SupportedRateControlMethods.fields.TCBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_TCBRC); #endif MFX_CHECK(AV(VAConfigAttribMaxPictureWidth) != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK(AV(VAConfigAttribMaxPictureHeight) != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK_COND(AV(VAConfigAttribMaxPictureWidth) && AV(VAConfigAttribMaxPictureHeight)); m_caps.MaxPicWidth = AV(VAConfigAttribMaxPictureWidth); m_caps.MaxPicHeight = AV(VAConfigAttribMaxPictureHeight); if (AV(VAConfigAttribEncMaxRefFrames) != VA_ATTRIB_NOT_SUPPORTED) { m_caps.MaxNum_ReferenceL0_P = mfxU8(AV(VAConfigAttribEncMaxRefFrames) & 0xFF); m_caps.MaxNum_ReferenceL0_B = mfxU8((AV(VAConfigAttribEncMaxRefFrames) >> 8) & 0xFF); m_caps.MaxNum_ReferenceL1_B = mfxU8((AV(VAConfigAttribEncMaxRefFrames) >> 16) & 0xFF); } else { m_caps.MaxNum_ReferenceL0_P = 2; m_caps.MaxNum_ReferenceL0_B = 2; m_caps.MaxNum_ReferenceL1_B = 1; } m_caps.FrameOBUSupport = 1; m_caps.ForcedSegmentationSupport = 1; m_caps.AV1ToolSupportFlags.fields.enable_order_hint = 1; m_caps.AV1ToolSupportFlags.fields.enable_cdef = 1; auto attribValEncAV1 = *(VAConfigAttribValEncAV1 *)(&attrs[idx_map[(VAConfigAttribType)VAConfigAttribEncAV1]].value); m_caps.CDEFChannelStrengthSupport = attribValEncAV1.bits.support_cdef_channel_strength ? 1 : 0; auto attribValEncAV1Ext1 = *(VAConfigAttribValEncAV1Ext1 *)(&attrs[idx_map[(VAConfigAttribType)VAConfigAttribEncAV1Ext1]].value); m_caps.SegmentFeatureSupport = attribValEncAV1Ext1.bits.segment_feature_support; m_caps.MinSegIdBlockSizeAccepted = attribValEncAV1Ext1.bits.min_segid_block_size_accepted; m_caps.SupportedInterpolationFilters.value = static_cast(attribValEncAV1Ext1.bits.interpolation_filter); auto attribValEncAV1Ext2 = *(VAConfigAttribValEncAV1Ext2 *)(&attrs[idx_map[(VAConfigAttribType)VAConfigAttribEncAV1Ext2]].value); m_caps.TileSizeBytesMinus1 = attribValEncAV1Ext2.bits.tile_size_bytes_minus1; return MFX_ERR_NONE; } uint32_t DDI_VA::ConvertRateControlMFX2VAAPI(mfxU16 rateControl) { static const std::map RCMFX2VAAPI = { { mfxU16(MFX_RATECONTROL_CQP) , uint32_t(VA_RC_CQP) }, { mfxU16(MFX_RATECONTROL_CBR) , uint32_t(VA_RC_CBR) }, { mfxU16(MFX_RATECONTROL_VBR) , uint32_t(VA_RC_VBR) }, }; auto itRC = RCMFX2VAAPI.find(rateControl); if (itRC != RCMFX2VAAPI.end()) { return itRC->second; } return uint32_t(VA_RC_NONE); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base/av1ehw_base_va_lin.h000066400000000000000000000060531443134507600327420ustar00rootroot00000000000000// Copyright (c) 2021-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_ddi.h" #include "av1ehw_base_data.h" #include "av1ehw_base_iddi.h" #include "ehw_device_vaapi.h" namespace AV1EHW { namespace Linux { namespace Base { using namespace AV1EHW::Base; class DDI_VA : public IDDI , public MfxEncodeHW::DeviceVAAPI { public: DDI_VA(mfxU32 FeatureId) : IDDI(FeatureId) { SetTraceName("Base_DDI_VA"); } protected: virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual mfxStatus SetDDIID(const mfxU16 bitDepth , const mfxU16 chromFormat , const mfxU32 fourCC , const mfxU16 targetChromaFormat) override; mfxStatus CreateVABuffers( const std::list& par , std::vector& pool); mfxStatus DestroyVABuffers(std::vector& pool); using MfxEncodeHW::DeviceVAAPI::QueryCaps; mfxStatus QueryCaps(); mfxStatus CreateAndQueryCaps(const mfxVideoParam& par, StorageW& strg); uint32_t ConvertRateControlMFX2VAAPI(mfxU16 rateControl); EncodeCapsAv1 m_caps; std::vector m_perSeqPar; std::vector m_perPicPar; std::vector m_bs; VAID* m_vaid = nullptr; }; } //Base } //Linux } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_va_packer_lin.cpp000066400000000000000000000761751443134507600345570ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include #include "mfx_common_int.h" #include "av1ehw_ddi.h" #include "av1ehw_base_va_lin.h" #include "av1ehw_base_va_packer_lin.h" #include "av1ehw_struct_vaapi.h" using namespace AV1EHW; using namespace AV1EHW::Base; using namespace AV1EHW::Linux::Base; void InitSPS( const ExtBuffer::Param& par , const SH& bs_sh , VAEncSequenceParameterBufferAV1& sps) { sps = {}; sps.seq_profile = static_cast(bs_sh.seq_profile); sps.seq_level_idx = static_cast(bs_sh.seq_level_idx[0]); sps.intra_period = par.mfx.GopPicSize; sps.ip_period = par.mfx.GopRefDist; if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR) { sps.bits_per_second = TargetKbps(par.mfx) * 1000; } sps.order_hint_bits_minus_1 = static_cast(bs_sh.order_hint_bits_minus1); sps.seq_fields.bits.still_picture = bs_sh.still_picture; sps.seq_fields.bits.enable_filter_intra = bs_sh.enable_filter_intra; sps.seq_fields.bits.enable_intra_edge_filter = bs_sh.enable_intra_edge_filter; sps.seq_fields.bits.enable_interintra_compound = bs_sh.enable_interintra_compound; sps.seq_fields.bits.enable_masked_compound = bs_sh.enable_masked_compound; sps.seq_fields.bits.enable_warped_motion = bs_sh.enable_warped_motion; sps.seq_fields.bits.enable_dual_filter = bs_sh.enable_dual_filter; sps.seq_fields.bits.enable_order_hint = bs_sh.enable_order_hint; sps.seq_fields.bits.enable_jnt_comp = bs_sh.enable_jnt_comp; sps.seq_fields.bits.enable_ref_frame_mvs = bs_sh.enable_ref_frame_mvs; sps.seq_fields.bits.enable_superres = bs_sh.enable_superres; sps.seq_fields.bits.enable_cdef = bs_sh.enable_cdef; sps.seq_fields.bits.enable_restoration = bs_sh.enable_restoration; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); #if VA_CHECK_VERSION(1, 16, 0) sps.hierarchical_flag = CO2.BRefType == MFX_B_REF_PYRAMID; #else sps.reserved8b = CO2.BRefType == MFX_B_REF_PYRAMID; #endif } void InitPPS( const ExtBuffer::Param& /*par*/ , const FH& bs_fh , VAEncPictureParameterBufferAV1& pps) { pps = {}; std::fill(pps.reference_frames, pps.reference_frames + NUM_REF_FRAMES, VA_INVALID_ID); //frame size pps.frame_height_minus_1 = static_cast(bs_fh.FrameHeight - 1); pps.frame_width_minus_1 = static_cast(bs_fh.UpscaledWidth - 1); //quantizer pps.y_dc_delta_q = static_cast(bs_fh.quantization_params.DeltaQYDc); pps.u_dc_delta_q = static_cast(bs_fh.quantization_params.DeltaQUDc); pps.u_ac_delta_q = static_cast(bs_fh.quantization_params.DeltaQUAc); pps.v_dc_delta_q = static_cast(bs_fh.quantization_params.DeltaQVDc); pps.v_ac_delta_q = static_cast(bs_fh.quantization_params.DeltaQVAc); //other params pps.picture_flags.bits.error_resilient_mode = bs_fh.error_resilient_mode; pps.interpolation_filter = static_cast(bs_fh.interpolation_filter); pps.picture_flags.bits.use_superres = bs_fh.use_superres; pps.picture_flags.bits.allow_high_precision_mv = bs_fh.allow_high_precision_mv; pps.picture_flags.bits.reduced_tx_set = bs_fh.reduced_tx_set; pps.picture_flags.bits.palette_mode_enable = bs_fh.allow_screen_content_tools; //description for tx_mod pps.mode_control_flags.bits.tx_mode = bs_fh.TxMode; pps.temporal_id = 0; pps.superres_scale_denominator = static_cast(bs_fh.SuperresDenom); //q_matrix pps.qmatrix_flags.bits.using_qmatrix = bs_fh.quantization_params.using_qmatrix; pps.qmatrix_flags.bits.qm_y = bs_fh.quantization_params.qm_y; pps.qmatrix_flags.bits.qm_u = bs_fh.quantization_params.qm_u; pps.qmatrix_flags.bits.qm_v = bs_fh.quantization_params.qm_v; } inline void InitTileGroupsBuffer( const TileGroupInfos& infos , std::vector& tile_groups) { tile_groups.resize(infos.size()); for (mfxU16 i = 0; i < infos.size(); i++) { VAEncTileGroupBufferAV1& tg = tile_groups[i]; tg = {}; tg.tg_start = static_cast(infos[i].TgStart); tg.tg_end = static_cast(infos[i].TgEnd); } } inline void FillSearchIdx( VARefFrameCtrlAV1& refFrameCtrl, mfxU8 idx, mfxU8 refFrame) { switch (idx) { case 0: refFrameCtrl.fields.search_idx0 = refFrame; break; case 1: refFrameCtrl.fields.search_idx1 = refFrame; break; case 2: refFrameCtrl.fields.search_idx2 = refFrame; break; case 3: refFrameCtrl.fields.search_idx3 = refFrame; break; case 4: refFrameCtrl.fields.search_idx4 = refFrame; break; case 5: refFrameCtrl.fields.search_idx5 = refFrame; break; case 6: refFrameCtrl.fields.search_idx6 = refFrame; break; default: assert(!"Invalid index"); } } inline void FillRefCtrlL0( const TaskCommonPar& task , VAEncPictureParameterBufferAV1& pps) { mfxU8 idx = 0; for (mfxU8 refFrame = LAST_FRAME; refFrame < BWDREF_FRAME; refFrame++) { if(IsValidRefFrame(task.RefList, refFrame)) // Assume search order is same as ref_list order FillSearchIdx(pps.ref_frame_ctrl_l0, idx++, refFrame); } if(IsP(task.FrameType) && !task.isLDB) //not RAB frame { mfxU8 refFrame = ALTREF_FRAME; if (IsValidRefFrame(task.RefList, refFrame)) FillSearchIdx(pps.ref_frame_ctrl_l0, idx, refFrame); } } inline void FillRefCtrlL1( const TaskCommonPar& task , VAEncPictureParameterBufferAV1& pps) { if (IsB(task.FrameType) || task.isLDB) { mfxU8 idx = 0; for (mfxU8 refFrame = BWDREF_FRAME; refFrame < MAX_REF_FRAMES; refFrame++) { if(IsValidRefFrame(task.RefList, refFrame)) FillSearchIdx(pps.ref_frame_ctrl_l1, idx++, refFrame); } } } inline void FillRefParams( const TaskCommonPar& task , const FH& bs_fh , const std::vector& rec , VAEncPictureParameterBufferAV1& pps) { if(pps.picture_flags.bits.frame_type == KEY_FRAME) return; std::transform(task.DPB.begin(), task.DPB.end(), pps.reference_frames, [&rec](DpbType::const_reference dpbFrm) -> VASurfaceID { return rec.at(dpbFrm->Rec.Idx); }); std::transform(bs_fh.ref_frame_idx, bs_fh.ref_frame_idx + REFS_PER_FRAME, pps.ref_frame_idx, [](const int32_t idx) -> mfxU8 { return static_cast(idx); }); FillRefCtrlL0(task, pps); FillRefCtrlL1(task, pps); } inline void FillTile( const FH& bs_fh , VAEncPictureParameterBufferAV1& pps) { auto& ti = bs_fh.tile_info; pps.tile_cols = static_cast(ti.TileCols); for (mfxU16 i = 0; i < pps.tile_cols; i++) { pps.width_in_sbs_minus_1[i] = static_cast(ti.TileWidthInSB[i] - 1); } pps.tile_rows = static_cast(ti.TileRows); for (mfxU16 i = 0; i < pps.tile_rows; i++) { pps.height_in_sbs_minus_1[i] = static_cast(ti.TileHeightInSB[i] - 1); } pps.context_update_tile_id = static_cast(ti.context_update_tile_id); } inline void FillCDEF( const SH& bs_sh , const FH& bs_fh , VAEncPictureParameterBufferAV1& pps) { if(!bs_sh.enable_cdef) return; auto& cdef = bs_fh.cdef_params; pps.cdef_damping_minus_3 = static_cast(cdef.cdef_damping - 3); pps.cdef_bits = static_cast(cdef.cdef_bits); for (mfxU8 i = 0; i < CDEF_MAX_STRENGTHS; i++) { pps.cdef_y_strengths[i] = static_cast(cdef.cdef_y_pri_strength[i] * CDEF_STRENGTH_DIVISOR + cdef.cdef_y_sec_strength[i]); pps.cdef_uv_strengths[i] = static_cast(cdef.cdef_uv_pri_strength[i] * CDEF_STRENGTH_DIVISOR + cdef.cdef_uv_sec_strength[i]); } } static mfxU8 MapSegIdBlockSizeToDDI(mfxU16 size) { switch (size) { case MFX_AV1_SEGMENT_ID_BLOCK_SIZE_8x8: return BLOCK_8x8; case MFX_AV1_SEGMENT_ID_BLOCK_SIZE_32x32: return BLOCK_32x32; case MFX_AV1_SEGMENT_ID_BLOCK_SIZE_64x64: return BLOCK_64x64; case MFX_AV1_SEGMENT_ID_BLOCK_SIZE_16x16: default: return BLOCK_16x16; } } static void InitSegParam( const mfxExtAV1Segmentation& seg , const FH& bs_fh , VAEncPictureParameterBufferAV1& pps) { pps.segments = VAEncSegParamAV1{}; if (!bs_fh.segmentation_params.segmentation_enabled) return; auto& segFlags = pps.segments.seg_flags.bits; segFlags.segmentation_enabled = bs_fh.segmentation_params.segmentation_enabled; pps.segments.segment_number = static_cast(seg.NumSegments); pps.seg_id_block_size = MapSegIdBlockSizeToDDI(seg.SegmentIdBlockSize); segFlags.segmentation_update_map = bs_fh.segmentation_params.segmentation_update_map; segFlags.segmentation_temporal_update = bs_fh.segmentation_params.segmentation_temporal_update; std::transform(bs_fh.segmentation_params.FeatureMask, bs_fh.segmentation_params.FeatureMask + AV1_MAX_NUM_OF_SEGMENTS, pps.segments.feature_mask, [](mfxU32 x) -> mfxU8{ return static_cast(x); }); for (mfxU8 i = 0; i < AV1_MAX_NUM_OF_SEGMENTS; i++) { std::transform(bs_fh.segmentation_params.FeatureData[i], bs_fh.segmentation_params.FeatureData[i] + SEG_LVL_MAX, pps.segments.feature_data[i], [](int32_t x) -> int16_t{ return static_cast(x); }); } } static void InitSegMap( const mfxExtAV1Segmentation& seg , std::vector& segment_map) { segment_map.resize(seg.NumSegmentIdAlloc); if (seg.SegmentIds) std::copy_n(seg.SegmentIds, seg.NumSegmentIdAlloc, segment_map.begin()); } static void InitSegMap( const ExtBuffer::Param& par , std::vector& segment_map) { const mfxExtAV1Segmentation& segPar = ExtBuffer::Get(par); if (segPar.NumSegments == 0) { segment_map.clear(); return; } InitSegMap(segPar, segment_map); } inline uint16_t MapLRTypeToDDI(RestorationType lrType) { switch (lrType) { case RESTORE_NONE: return 0; case RESTORE_WIENER: return 1; default: ThrowAssert(true, "Only RESTORE_NONE and RESTORE_WIENER are supported"); return 0; } } void UpdatePPS( const TaskCommonPar& task , const std::vector& rec , const SH& bs_sh , const FH& bs_fh ,std::vector& tile_groups_task ,std::vector& tile_groups_global , VAEncPictureParameterBufferAV1& pps) { pps.picture_flags.bits.frame_type = bs_fh.frame_type; pps.base_qindex = static_cast(bs_fh.quantization_params.base_q_idx); pps.min_base_qindex = task.MinBaseQIndex; pps.max_base_qindex = task.MaxBaseQIndex; pps.order_hint = static_cast(bs_fh.order_hint); //DPB and refs management pps.primary_ref_frame = static_cast(bs_fh.primary_ref_frame); pps.ref_frame_ctrl_l0.value = 0; pps.ref_frame_ctrl_l1.value = 0; FillRefParams(task, bs_fh, rec, pps); //loop filter auto& lf = bs_fh.loop_filter_params; pps.filter_level[0] = static_cast(lf.loop_filter_level[0]); pps.filter_level[1] = static_cast(lf.loop_filter_level[1]); pps.filter_level_u = static_cast(lf.loop_filter_level[2]); pps.filter_level_v = static_cast(lf.loop_filter_level[3]); pps.loop_filter_flags.bits.sharpness_level = lf.loop_filter_sharpness; pps.loop_filter_flags.bits.mode_ref_delta_enabled = lf.loop_filter_delta_enabled; pps.loop_filter_flags.bits.mode_ref_delta_update = lf.loop_filter_delta_update; std::copy(lf.loop_filter_ref_deltas, lf.loop_filter_ref_deltas + TOTAL_REFS_PER_FRAME, pps.ref_deltas); std::copy(lf.loop_filter_mode_deltas, lf.loop_filter_mode_deltas + MAX_MODE_LF_DELTAS, pps.mode_deltas); //block-level deltas pps.mode_control_flags.bits.delta_q_present = bs_fh.delta_q_present; pps.mode_control_flags.bits.delta_lf_present = bs_fh.delta_lf_present; pps.mode_control_flags.bits.delta_lf_multi = bs_fh.delta_lf_multi; pps.mode_control_flags.bits.reference_mode = bs_fh.reference_select ? REFERENCE_MODE_SELECT : SINGLE_REFERENCE; pps.mode_control_flags.bits.skip_mode_present = bs_fh.skip_mode_present; FillTile(bs_fh, pps); FillCDEF(bs_sh, bs_fh, pps); //loop restoration pps.loop_restoration_flags.bits.yframe_restoration_type = MapLRTypeToDDI(bs_fh.lr_params.lr_type[0]); pps.loop_restoration_flags.bits.cbframe_restoration_type = MapLRTypeToDDI(bs_fh.lr_params.lr_type[1]); pps.loop_restoration_flags.bits.crframe_restoration_type = MapLRTypeToDDI(bs_fh.lr_params.lr_type[2]); pps.loop_restoration_flags.bits.lr_unit_shift = bs_fh.lr_params.lr_unit_shift; pps.loop_restoration_flags.bits.lr_uv_shift = bs_fh.lr_params.lr_uv_shift; //context pps.picture_flags.bits.disable_cdf_update = bs_fh.disable_cdf_update; pps.picture_flags.bits.disable_frame_end_update_cdf = bs_fh.disable_frame_end_update_cdf; pps.picture_flags.bits.disable_frame_recon = (bs_fh.refresh_frame_flags == 0); //Tile Groups if(!tile_groups_task.empty()) pps.num_tile_groups_minus1 = static_cast(tile_groups_task.size() - 1); else pps.num_tile_groups_minus1 = static_cast(tile_groups_global.size() - 1); pps.tile_group_obu_hdr_info.bits.obu_extension_flag = 0; pps.tile_group_obu_hdr_info.bits.obu_has_size_field = 1; pps.tile_group_obu_hdr_info.bits.temporal_id = 0; pps.tile_group_obu_hdr_info.bits.spatial_id = 0; //other params pps.picture_flags.bits.error_resilient_mode = bs_fh.error_resilient_mode; pps.picture_flags.bits.enable_frame_obu = (task.InsertHeaders & INSERT_FRM_OBU) ? 1 : 0; pps.reconstructed_frame = rec.at(task.Rec.Idx); //offsets auto& offsets = task.Offsets; pps.size_in_bits_frame_hdr_obu = offsets.FrameHeaderOBUSizeInBits; pps.byte_offset_frame_hdr_obu_size = offsets.FrameHeaderOBUSizeByteOffset; pps.bit_offset_loopfilter_params = offsets.LoopFilterParamsBitOffset; pps.bit_offset_qindex = offsets.QIndexBitOffset; pps.bit_offset_segmentation = offsets.SegmentationBitOffset; pps.bit_offset_cdef_params = offsets.CDEFParamsBitOffset; pps.size_in_bits_cdef_params = offsets.CDEFParamsSizeInBits; //q_matrix pps.qmatrix_flags.bits.using_qmatrix = bs_fh.quantization_params.using_qmatrix; pps.qmatrix_flags.bits.qm_y = bs_fh.quantization_params.qm_y; pps.qmatrix_flags.bits.qm_u = bs_fh.quantization_params.qm_u; pps.qmatrix_flags.bits.qm_v = bs_fh.quantization_params.qm_v; #if VA_CHECK_VERSION(1, 16, 0) pps.hierarchical_level_plus1 = static_cast(task.PyramidLevel + 1); #else pps.reserved8bits0 = static_cast(task.PyramidLevel + 1); #endif pps.skip_frames_reduced_size = static_cast(task.RepeatedFrameBytes); } inline void AddVaMiscHRD( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& hrd = AddVaMisc(VAEncMiscParameterTypeHRD, buf); uint32_t bNeedBufParam = par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR; hrd.initial_buffer_fullness = bNeedBufParam * InitialDelayInKB(par.mfx) * 8000; hrd.buffer_size = bNeedBufParam * BufferSizeInKB(par.mfx) * 8000; } inline void AddVaMiscTemporalLayer( const Glob::VideoParam::TRef& /*par*/ , std::list>& buf) { auto& tempLayer = AddVaMisc(VAEncMiscParameterTypeTemporalLayerStructure, buf); tempLayer.number_of_layers = 0; } inline void AddVaMiscFR( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& fr = AddVaMisc(VAEncMiscParameterTypeFrameRate, buf); PackMfxFrameRate(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, fr.framerate); } inline void AddVaMiscRC( const Glob::VideoParam::TRef& par , const Glob::FH::TRef& bs_fh , const Task::Common::TRef& task , std::list>& buf , bool bResetBRC = false) { auto& rc = AddVaMisc(VAEncMiscParameterTypeRateControl, buf); mfxU32 bNeedRateParam = par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR; rc.bits_per_second = bNeedRateParam * MaxKbps(par.mfx) * 1000; if(rc.bits_per_second) rc.target_percentage = mfxU32(100.0 * (mfxF64)TargetKbps(par.mfx) / (mfxF64)MaxKbps(par.mfx)); rc.rc_flags.bits.reset = bNeedRateParam && bResetBRC; const mfxExtCodingOption2* CO2 = ExtBuffer::Get(par); if (CO2) { //MBBRC control //Control VA_RC_MB 0: default, 1: enable, 2: disable, other: reserved rc.rc_flags.bits.mb_rate_control = IsOn(CO2->MBBRC) +IsOff(CO2->MBBRC) * 2; } // TCBRC control #if VA_CHECK_VERSION(1, 10, 0) rc.target_frame_size = task.TCBRCTargetFrameSize; #endif const mfxExtCodingOption3* CO3 = ExtBuffer::Get(par); if (CO3) { rc.rc_flags.bits.frame_tolerance_mode = IsOn(CO3->LowDelayBRC) ? eFrameSizeTolerance_ExtremelyLow : eFrameSizeTolerance_Normal; } rc.ICQ_quality_factor = 0; rc.initial_qp = bs_fh.quantization_params.base_q_idx; } inline void AddVaMiscTU( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& tu = AddVaMisc(VAEncMiscParameterTypeQualityLevel, buf); tu.quality_level = par.mfx.TargetUsage; } void VAPacker::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetCallChains , [this](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK(!strg.Contains(CC::Key), MFX_ERR_NONE); const auto& par = Glob::VideoParam::Get(strg); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS.Push([&par]( CallChains::TInitSPS::TExt , const StorageR& glob , VAEncSequenceParameterBufferAV1& sps) { const auto& bs_sh = Glob::SH::Get(glob); InitSPS(par, bs_sh, sps); }); cc.InitPPS.Push([&par]( CallChains::TInitPPS::TExt , const StorageR& glob , VAEncPictureParameterBufferAV1& pps) { const auto& bs_fh = Glob::FH::Get(glob); InitPPS(par, bs_fh, pps); }); cc.UpdatePPS.Push([this]( CallChains::TUpdatePPS::TExt , const StorageR& global , const StorageR& s_task , VAEncPictureParameterBufferAV1& pps) { const auto& bs_sh = Glob::SH::Get(global); const auto& bs_fh = Task::FH::Get(s_task); UpdatePPS(Task::Common::Get(s_task), GetResources(RES_REF), bs_sh, bs_fh, m_tile_groups_task, m_tile_groups_global, pps); }); return MFX_ERR_NONE; }); } void VAPacker::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& core = Glob::VideoCore::Get(strg); const auto& pInfos = Glob::TileGroups::Get(strg); InitTileGroupsBuffer(pInfos, m_tile_groups_global); const auto& par = Glob::VideoParam::Get(strg); const auto& bs_sh = Glob::SH::Get(strg); const auto& bs_fh = Glob::FH::Get(strg); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS(strg, m_sps); cc.InitPPS(strg, m_pps); cc.AddPerSeqMiscData[VAEncMiscParameterTypeHRD].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscHRD(par, data); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeTemporalLayerStructure].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTemporalLayer(par, data); return true; }); cc.AddPerPicMiscData[VAEncMiscParameterTypeRateControl].Push([this]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& s_task , std::list>& data) { const auto& par = Glob::VideoParam::Get(strg); const auto& bs_fh = Glob::FH::Get(strg); const auto& task = Task::Common::Get(s_task); AddVaMiscRC(par, bs_fh, task, data); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeFrameRate].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscFR(par, data); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeQualityLevel].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTU(par, data); return true; }); auto& vaInitPar = Tmp::DDI_InitParam::GetOrConstruct(local); auto& bsInfo = Glob::AllocBS::Get(strg); SetMaxBs(bsInfo.GetInfo().Width * bsInfo.GetInfo().Height); for (auto& AddMisc : cc.AddPerSeqMiscData) { if (AddMisc.second(strg, local, m_vaPerSeqMiscData)) { auto& misc = m_vaPerSeqMiscData.back(); vaInitPar.push_back(PackVaMiscPar(misc)); } } mfxStatus sts = Register(core, Glob::AllocRec::Get(strg).GetResponse(), RES_REF); MFX_CHECK_STS(sts); sts = Register(core, bsInfo.GetResponse(), RES_BS); MFX_CHECK_STS(sts); auto& resources = Glob::DDI_Resources::GetOrConstruct(strg); DDIExecParam xPar; xPar.Function = MFX_FOURCC_NV12; PackResources(xPar.Resource, RES_REF); resources.push_back(xPar); xPar.Function = MFX_FOURCC_P8; PackResources(xPar.Resource, RES_BS); resources.push_back(xPar); InitFeedback(bsInfo.GetResponse().NumFrameActual); GetFeedbackInterface(Glob::DDI_Feedback::GetOrConstruct(strg)); Glob::DDI_SubmitParam::GetOrConstruct(strg); cc.ReadFeedback.Push([this]( CallChains::TReadFeedback::TExt , const StorageR& /*global*/ , StorageW& s_task , const VACodedBufferSegment& fb) { return ReadFeedback(fb, Task::Common::Get(s_task).BsDataLength); }); return MFX_ERR_NONE; }); } void VAPacker::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset ,[this](StorageRW& strg, StorageRW& local) -> mfxStatus { const auto& par = Glob::VideoParam::Get(strg); const auto& bs_fh = Glob::FH::Get(strg); const auto& pInfos = Glob::TileGroups::Get(strg); InitTileGroupsBuffer(pInfos, m_tile_groups_global); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS(strg, m_sps); cc.InitPPS(strg, m_pps); InitSegMap(par, m_segment_map); m_segment = {}; m_segment.segmentMapDataSize = (mfxU32)m_segment_map.size(); m_segment.pSegmentMap = m_segment_map.data(); m_vaPerSeqMiscData.clear(); cc.AddPerSeqMiscData[VAEncMiscParameterTypeHRD].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscHRD(par, data); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeTemporalLayerStructure].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTemporalLayer(par, data); return true; }); cc.AddPerPicMiscData[VAEncMiscParameterTypeRateControl].Push([this]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& s_task , std::list>& data) { const auto& par = Glob::VideoParam::Get(strg); const auto& bs_fh = Glob::FH::Get(strg); const auto& task = Task::Common::Get(s_task); AddVaMiscRC(par, bs_fh, task, data, !!(Glob::ResetHint::Get(strg).Flags & RF_BRC_RESET)); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeFrameRate].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscFR(par, data); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeQualityLevel].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTU(par, data); return true; }); auto& vaInitPar = Tmp::DDI_InitParam::GetOrConstruct(local); vaInitPar.clear(); for (auto& AddMisc : cc.AddPerSeqMiscData) { if (AddMisc.second(strg, local, m_vaPerSeqMiscData)) { auto& misc = m_vaPerSeqMiscData.back(); vaInitPar.push_back(PackVaMiscPar(misc)); } } return MFX_ERR_NONE; }); } void VAPacker::SubmitTask(const FeatureBlocks& blocks, TPushST Push) { Push(BLK_SubmitTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); auto& ph = Glob::PackedHeaders::Get(global); auto& bs_sh = Glob::SH::Get(global); auto& bs_fh = Task::FH::Get(s_task); MFX_LOG_INFO("Task[%d] Submitting: %dx%d, frame_type=%d\n", task.StatusReportId, bs_fh.FrameWidth, bs_fh.FrameHeight, bs_fh.frame_type); const auto& tileGroupInfos = Task::TileGroups::Get(s_task); if(tileGroupInfos.empty()) m_tile_groups_task.clear(); else InitTileGroupsBuffer(tileGroupInfos, m_tile_groups_task); auto& cc = CC::Get(global); cc.UpdatePPS(global, s_task, m_pps); const auto& seg = Task::Segment::Get(s_task); InitSegParam(seg, bs_fh, m_pps); InitSegMap(seg, m_segment_map); m_segment = {}; m_segment.segmentMapDataSize = (mfxU32)m_segment_map.size(); m_segment.pSegmentMap = m_segment_map.data(); m_pps.coded_buf = GetResources(RES_BS).at(task.BS.Idx); auto& par = Glob::DDI_SubmitParam::Get(global); par.clear(); par.push_back(PackVaBuffer(VAEncSequenceParameterBufferType, m_sps)); par.push_back(PackVaBuffer(VAEncPictureParameterBufferType, m_pps)); if (!m_tile_groups_task.empty()) { std::transform(m_tile_groups_task.begin(), m_tile_groups_task.end(), std::back_inserter(par) , [&](VAEncTileGroupBufferAV1& t) { return PackVaBuffer(VAEncSliceParameterBufferType, t); }); } else { std::transform(m_tile_groups_global.begin(), m_tile_groups_global.end(), std::back_inserter(par) , [&](VAEncTileGroupBufferAV1& t) { return PackVaBuffer(VAEncSliceParameterBufferType, t); }); } if (m_segment.segmentMapDataSize) { par.push_back(PackVaBuffer(VAEncMacroblockMapBufferType, m_segment)); } m_vaPerPicMiscData.clear(); m_vaPackedHeaders.clear(); AddPackedHeaderIf(!!((task.InsertHeaders & INSERT_IVF_SEQ) || (task.InsertHeaders & INSERT_IVF_FRM)) , ph.IVF, par, VAEncPackedHeaderAV1_SPS); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_TD) , ph.TD, par, VAEncPackedHeaderAV1_SPS); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_SPS) , ph.SPS, par, VAEncPackedHeaderAV1_SPS); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_PPS) , ph.PPS, par, VAEncPackedHeaderAV1_PPS); for (auto& AddMisc : cc.AddPerPicMiscData) { if (AddMisc.second(global, s_task, m_vaPerPicMiscData)) { auto& misc = m_vaPerPicMiscData.back(); par.push_back(PackVaBuffer(VAEncMiscParameterBufferType, misc.data(), (mfxU32)misc.size())); } } SetFeedback(task.StatusReportId, *(VASurfaceID*)task.HDLRaw.first, GetResources(RES_BS).at(task.BS.Idx)); return MFX_ERR_NONE; }); } void VAPacker::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [](StorageW& global, StorageW& s_task) -> mfxStatus { auto& fb = Glob::DDI_Feedback::Get(global); MFX_CHECK(!fb.bNotReady, MFX_TASK_BUSY); auto& task = Task::Common::Get(s_task); MFX_CHECK((task.SkipCMD & SKIPCMD_NeedDriverCall), MFX_ERR_NONE); auto pFB = fb.Get(task.StatusReportId); MFX_CHECK(pFB, MFX_TASK_BUSY); auto& rtErr = Glob::RTErr::Get(global); auto sts = CC::Get(global).ReadFeedback(global, s_task, *(const VACodedBufferSegment*)pFB); SetIf(rtErr, sts < MFX_ERR_NONE, sts); fb.Remove(task.StatusReportId); return sts; }); } #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) av1ehw_base_va_packer_lin.h000066400000000000000000000072111443134507600342050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/av1/linux/base// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "av1ehw_base.h" #include "av1ehw_base_data.h" #include "av1ehw_base_iddi_packer.h" #include "ehw_utils_vaapi.h" namespace AV1EHW { namespace Linux { namespace Base { using namespace AV1EHW::Base; using namespace MfxEncodeHW; class VAPacker : public IDDIPacker , protected VAAPIParPacker { public: VAPacker(mfxU32 FeatureId) : IDDIPacker(FeatureId) { SetTraceName("Base_DDIPacker"); } struct CallChains : Storable { using TReadFeedback = CallChain; TReadFeedback ReadFeedback; using TInitSPS = CallChain; TInitSPS InitSPS; using TInitPPS = CallChain; TInitPPS InitPPS; using TUpdatePPS = CallChain; TUpdatePPS UpdatePPS; using TAddMiscData = CallChain>&>; std::map AddPerPicMiscData; std::map AddPerSeqMiscData; }; using CC = StorageVar; protected: virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; VAEncSequenceParameterBufferAV1 m_sps; VAEncPictureParameterBufferAV1 m_pps; VAEncSegMapBufferAV1 m_segment; std::vector m_tile_groups_global; std::vector m_tile_groups_task; std::vector m_segment_map; std::list> m_vaPerSeqMiscData; std::list> m_vaPerPicMiscData; }; } //Base } //Linux } //namespace AV1EHW #endif //defined(MFX_ENABLE_AV1_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/functions.cmake000066400000000000000000000006771443134507600273340ustar00rootroot00000000000000function(custom_source_group GROUP_NAME) set(GROUP_FILES ${ARGN}) if (WIN32) foreach(FILE ${GROUP_FILES}) get_filename_component(PARENT_DIR "${FILE}" PATH) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}") string(REPLACE "/" "\\" GROUP "${GROUP}") source_group("${GROUP}" FILES "${FILE}") endforeach() else() source_group(${GROUP_NAME} FILES ${GROUP_FILES}) endif() endfunction()oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/000077500000000000000000000000001443134507600247735ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include/000077500000000000000000000000001443134507600264165ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include/mfx_h264_enc_common_hw.h000066400000000000000000001530661443134507600330320ustar00rootroot00000000000000// Copyright (c) 2008-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_H264_ENC_COMMON_HW_H__ #define __MFX_H264_ENC_COMMON_HW_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include #include #include #include "mfx_ext_buffers.h" #ifdef MFX_ENABLE_ENCTOOLS #include "mfxenctools-int.h" #else #include "mfxbrc.h" #endif #include "mfx_h264_encode_struct_vaapi.h" #include #include #include "mfxmvc.h" #include "umc_defs.h" #include "ipps.h" #include "mfx_enc_common.h" #ifdef MFX_ENABLE_ENCODE_STATS #include "mfxencodestats.h" #endif #define D3DFMT_NV12 (D3DFORMAT)(MFX_MAKEFOURCC('N', 'V', '1', '2')) #define D3DDDIFMT_NV12 (D3DDDIFORMAT)(MFX_MAKEFOURCC('N', 'V', '1', '2')) #define D3DDDIFMT_YU12 (D3DDDIFORMAT)(MFX_MAKEFOURCC('Y', 'U', '1', '2')) // this guid is used to identify that device creation is performed during Query or QueryIOSurf call static const GUID MSDK_Private_Guid_Encode_AVC_Query = { 0x32560c63, 0xe3dc, 0x43c9, { 0xa8, 0x16, 0xda, 0x73, 0x36, 0x45, 0x89, 0xe9 } }; // this guid is used to identify device creation for MVC BD/AVCHD dependent view static const GUID MSDK_Private_Guid_Encode_MVC_Dependent_View = { 0x68bebcda, 0xefff, 0x4858, { 0x8d, 0x65, 0x92, 0x28, 0xab, 0xc5, 0x8c, 0x4e } }; // this guid is used to identify that device creation is performed during for low power encoder static const GUID MSDK_Private_Guid_Encode_AVC_LowPower_Query = { 0x6815aa23, 0xc93e, 0x4a71, { 0xae, 0x66, 0xb, 0x60, 0x5d, 0x3b, 0xc4, 0xd7 } }; namespace MfxHwH264Encode { class DdiTask; class InputBitstream; class OutputBitstream; struct mfxExtSpsHeader; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE struct mfxExtSpsSvcHeader; #endif struct mfxExtPpsHeader; const mfxU16 CROP_UNIT_X[] = { 1, 2, 2, 1 }; const mfxU16 CROP_UNIT_Y[] = { 1, 2, 1, 1 }; static const mfxU16 MFX_PICSTRUCT_PART1 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF; static const mfxU16 MFX_PICSTRUCT_PART2 = MFX_PICSTRUCT_FIELD_REPEATED | MFX_PICSTRUCT_FRAME_DOUBLING | MFX_PICSTRUCT_FRAME_TRIPLING; static const mfxU16 MFX_PICSTRUCT_FRAME_FLAGS = MFX_PICSTRUCT_FRAME_DOUBLING | MFX_PICSTRUCT_FRAME_TRIPLING; static const mfxU16 MFX_PICSTRUCT_FIELD_FLAGS = MFX_PICSTRUCT_FIELD_REPEATED; static const mfxU8 SEI_TYPE_BUFFERING_PERIOD = 0; static const mfxU8 SEI_TYPE_PIC_TIMING = 1; static const mfxU8 SEI_TYPE_FILLER_PAYLOAD = 3; static const mfxU8 SEI_TYPE_RECOVERY_POINT = 6; static const mfxU8 SEI_TYPE_DEC_REF_PIC_MARKING_REPETITION = 7; static const mfxU8 SEI_TYPE_SCALABILITY_INFO = 24; // MVC BD { static const mfxU8 SEI_TYPE_MVC_SCALABLE_NESTING = 37; // MVC BD } static const mfxU16 MFX_RATECONTROL_WIDI_VBR = 100; // internally used buffers static const mfxU32 MFX_EXTBUFF_SPS_HEADER = MFX_MAKEFOURCC(0xff, 'S', 'P', 'S'); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE static const mfxU32 MFX_EXTBUFF_SPS_SVC_HEADER = MFX_MAKEFOURCC(0xff, 'S', 'V', 'C'); #endif static const mfxU32 MFX_EXTBUFF_PPS_HEADER = MFX_MAKEFOURCC(0xff, 'P', 'P', 'S'); static const mfxU16 MFX_FRAMETYPE_IPB = MFX_FRAMETYPE_I | MFX_FRAMETYPE_P | MFX_FRAMETYPE_B; static const mfxU16 MFX_FRAMETYPE_PB = MFX_FRAMETYPE_P | MFX_FRAMETYPE_B; static const mfxU16 MFX_FRAMETYPE_PREF = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; static const mfxU16 MFX_FRAMETYPE_IREF = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; static const mfxU16 MFX_FRAMETYPE_IREFIDR = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR; static const mfxU16 MFX_FRAMETYPE_xIPB = MFX_FRAMETYPE_xI | MFX_FRAMETYPE_xP | MFX_FRAMETYPE_xB; static const mfxU16 MFX_FRAMETYPE_xPREF = MFX_FRAMETYPE_xP | MFX_FRAMETYPE_xREF; static const mfxU16 MFX_FRAMETYPE_xIREF = MFX_FRAMETYPE_xI | MFX_FRAMETYPE_xREF; static const mfxU16 MFX_FRAMETYPE_KEYPIC = 0x0020; static const mfxU16 MFX_IOPATTERN_IN_MASK_SYS_OR_D3D = MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_IN_VIDEO_MEMORY; static const mfxU16 MFX_IOPATTERN_IN_MASK = MFX_IOPATTERN_IN_MASK_SYS_OR_D3D; // masks for VideoParam.mfx.CodecProfile static const mfxU16 MASK_PROFILE_IDC = (0xff); static const mfxU16 MASK_CONSTRAINT_SET0_FLAG = (0x100 << 0); static const mfxU16 MASK_CONSTRAINT_SET1_FLAG = (0x100 << 1); static const mfxU16 MASK_CONSTRAINT_SET2_FLAG = (0x100 << 2); static const mfxU16 MASK_CONSTRAINT_SET3_FLAG = (0x100 << 3); static const mfxU16 MASK_CONSTRAINT_SET4_FLAG = (0x100 << 4); static const mfxU16 MASK_CONSTRAINT_SET5_FLAG = (0x100 << 5); static const mfxU16 MASK_CONSTRAINT_SET6_FLAG = (0x100 << 6); static const mfxU16 MASK_CONSTRAINT_SET7_FLAG = (0x100 << 7); static const mfxU16 MASK_CONSTRAINT_SET0123_FLAG = MASK_CONSTRAINT_SET0_FLAG | MASK_CONSTRAINT_SET1_FLAG | MASK_CONSTRAINT_SET2_FLAG | MASK_CONSTRAINT_SET3_FLAG; template inline T* SecondHalfOf(std::vector& v) { return &v[v.size() / 2]; } template inline void Zero(T & obj) { memset(reinterpret_cast(&obj), 0, sizeof(obj)); } template inline void Zero(std::vector & vec) { if (vec.size() > 0) memset(&vec[0], 0, sizeof(T) * vec.size()); } template inline void Zero(T * first, size_t cnt) { memset(first, 0, sizeof(T) * cnt); } template inline bool Equal(T const & lhs, T const & rhs) { return memcmp(&lhs, &rhs, sizeof(T)) == 0; } template inline void Copy(T & dst, U const & src) { static_assert(sizeof(T) == sizeof(U), "copy_objects_of_different_size"); MFX_INTERNAL_CPY(&dst, &src, sizeof(dst)); } template inline T & RemoveConst(T const & t) { return const_cast(t); } template inline T * RemoveConst(T const * t) { return const_cast(t); } template inline T * Begin(T(& t)[N]) { return t; } template inline T * End(T(& t)[N]) { return t + N; } template inline size_t SizeOf(T(&)[N]) { return N; } template inline T const * Begin(std::vector const & t) { return &*t.begin(); } template inline T const * End(std::vector const & t) { return &*t.begin() + t.size(); } template inline T * Begin(std::vector & t) { return &*t.begin(); } template inline T * End(std::vector & t) { return &*t.begin() + t.size(); } template struct ExtBufTypeToId {}; #define BIND_EXTBUF_TYPE_TO_ID(TYPE, ID) template<> struct ExtBufTypeToId { enum { id = ID }; } BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOption, MFX_EXTBUFF_CODING_OPTION ); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOptionSPSPPS, MFX_EXTBUFF_CODING_OPTION_SPSPPS ); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOptionDDI, MFX_EXTBUFF_DDI ); BIND_EXTBUF_TYPE_TO_ID (mfxExtVideoSignalInfo, MFX_EXTBUFF_VIDEO_SIGNAL_INFO ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMVCSeqDesc, MFX_EXTBUFF_MVC_SEQ_DESC ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMVCTargetViews, MFX_EXTBUFF_MVC_TARGET_VIEWS ); BIND_EXTBUF_TYPE_TO_ID (mfxExtPictureTimingSEI, MFX_EXTBUFF_PICTURE_TIMING_SEI ); BIND_EXTBUF_TYPE_TO_ID (mfxExtSpsHeader, MFX_EXTBUFF_SPS_HEADER ); BIND_EXTBUF_TYPE_TO_ID (mfxExtPpsHeader, MFX_EXTBUFF_PPS_HEADER ); BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCRefListCtrl, MFX_EXTBUFF_AVC_REFLIST_CTRL ); #if defined MFX_ENABLE_H264_ROUNDING_OFFSET BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCRoundingOffset, MFX_EXTBUFF_AVC_ROUNDING_OFFSET ); #endif BIND_EXTBUF_TYPE_TO_ID (mfxExtAvcTemporalLayers, MFX_EXTBUFF_AVC_TEMPORAL_LAYERS ); BIND_EXTBUF_TYPE_TO_ID (mfxExtVppAuxData, MFX_EXTBUFF_VPP_AUXDATA ); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE BIND_EXTBUF_TYPE_TO_ID (mfxExtSpsSvcHeader, MFX_EXTBUFF_SPS_SVC_HEADER ); BIND_EXTBUF_TYPE_TO_ID (mfxExtSVCSeqDesc, MFX_EXTBUFF_SVC_SEQ_DESC ); BIND_EXTBUF_TYPE_TO_ID (mfxExtSVCRateControl, MFX_EXTBUFF_SVC_RATE_CONTROL ); #endif BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOption2, MFX_EXTBUFF_CODING_OPTION2 ); BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCEncodedFrameInfo, MFX_EXTBUFF_ENCODED_FRAME_INFO ); BIND_EXTBUF_TYPE_TO_ID (mfxExtEncoderResetOption, MFX_EXTBUFF_ENCODER_RESET_OPTION ); BIND_EXTBUF_TYPE_TO_ID (mfxExtEncoderCapability, MFX_EXTBUFF_ENCODER_CAPABILITY ); BIND_EXTBUF_TYPE_TO_ID (mfxExtEncoderROI, MFX_EXTBUFF_ENCODER_ROI ); BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCRefLists, MFX_EXTBUFF_AVC_REFLISTS ); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOption3, MFX_EXTBUFF_CODING_OPTION3 ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMBQP, MFX_EXTBUFF_MBQP ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMBForceIntra, MFX_EXTBUFF_MB_FORCE_INTRA ); BIND_EXTBUF_TYPE_TO_ID (mfxExtChromaLocInfo, MFX_EXTBUFF_CHROMA_LOC_INFO ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMBDisableSkipMap, MFX_EXTBUFF_MB_DISABLE_SKIP_MAP ); #if defined(MFX_ENABLE_H264_PRIVATE_CTRL) BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCEncodeCtrl, MFX_EXTBUFF_AVC_ENCODE_CTRL ); #endif BIND_EXTBUF_TYPE_TO_ID (mfxExtPredWeightTable, MFX_EXTBUFF_PRED_WEIGHT_TABLE ); BIND_EXTBUF_TYPE_TO_ID (mfxExtDirtyRect, MFX_EXTBUFF_DIRTY_RECTANGLES ); BIND_EXTBUF_TYPE_TO_ID (mfxExtMoveRect, MFX_EXTBUFF_MOVING_RECTANGLES ); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) BIND_EXTBUF_TYPE_TO_ID (mfxExtIntGPUHang, MFX_EXTBUFF_GPU_HANG ); #endif #if defined (__MFXBRC_H__) BIND_EXTBUF_TYPE_TO_ID (mfxExtBRC, MFX_EXTBUFF_BRC ); #endif #if defined (MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) BIND_EXTBUF_TYPE_TO_ID(mfxExtPartialBitstreamParam, MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM ); #endif BIND_EXTBUF_TYPE_TO_ID(mfxExtVPPDenoise2, MFX_EXTBUFF_VPP_DENOISE2); #if defined (MFX_ENABLE_ENCTOOLS) BIND_EXTBUF_TYPE_TO_ID(mfxEncTools, MFX_EXTBUFF_ENCTOOLS); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCFrameParams, MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCQuantControl, MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCHRDPos, MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCEncodeResult, MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCStatus, MFX_EXTBUFF_ENCTOOLS_BRC_STATUS); BIND_EXTBUF_TYPE_TO_ID(mfxExtEncToolsConfig, MFX_EXTBUFF_ENCTOOLS_CONFIG); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsCtrlExtDevice, MFX_EXTBUFF_ENCTOOLS_DEVICE); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsCtrlExtAllocator, MFX_EXTBUFF_ENCTOOLS_ALLOCATOR); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsFrameToAnalyze, MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsHintPreEncodeSceneChange, MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsHintPreEncodeGOP, MFX_EXTBUFF_ENCTOOLS_HINT_GOP); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsHintPreEncodeARefFrames, MFX_EXTBUFF_ENCTOOLS_HINT_AREF); BIND_EXTBUF_TYPE_TO_ID(mfxEncToolsBRCBufferHint, MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT); #endif #ifdef MFX_ENABLE_ENCODE_STATS BIND_EXTBUF_TYPE_TO_ID(mfxExtEncodeStatsOutput, MFX_EXTBUFF_ENCODESTATS); #endif #undef BIND_EXTBUF_TYPE_TO_ID template inline void InitExtBufHeader(T & extBuf) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(T); } template <> inline void InitExtBufHeader(mfxExtVideoSignalInfo & extBuf) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(mfxExtVideoSignalInfo); // set default values extBuf.VideoFormat = 5; // unspecified video format extBuf.VideoFullRange = 0; extBuf.ColourDescriptionPresent = 0; extBuf.ColourPrimaries = 2; // unspecified extBuf.TransferCharacteristics = 2; // unspecified extBuf.MatrixCoefficients = 2; // unspecified } template <> inline void InitExtBufHeader(mfxExtAVCRefListCtrl & extBuf) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(mfxExtAVCRefListCtrl); for (mfxU32 i = 0; i < 32; i++) extBuf.PreferredRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); for (mfxU32 i = 0; i < 16; i++) extBuf.RejectedRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); for (mfxU32 i = 0; i < 16; i++) extBuf.LongTermRefList[i].FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); } #if defined(MFX_ENABLE_ENCTOOLS) inline void InitExtBufHeader(mfxExtEncToolsConfig & extBuf, mfxU16 defaultValue) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(mfxExtEncToolsConfig); extBuf.AdaptiveI = extBuf.AdaptiveB = extBuf.AdaptiveRefP = extBuf.AdaptiveRefB = extBuf.SceneChange = extBuf.AdaptiveLTR = extBuf.AdaptivePyramidQuantP = extBuf.AdaptivePyramidQuantB = extBuf.AdaptiveQuantMatrices = extBuf.BRCBufferHints = extBuf.AdaptiveMBQP = extBuf.BRC = defaultValue; } #endif template struct GetPointedType {}; template struct GetPointedType { typedef T Type; }; template struct GetPointedType { typedef T Type; }; inline mfxStatus FillMBQPData(const mfxExtMBQP* mbqpInput, mfxU32 picWidth, mfxU32 picHeight, mfxU8* pMbMap[], mfxU32 pitch, mfxU32 height_aligned, mfxU32 block_width, mfxU32 block_height, bool bFieldMode, bool bMBQPUsing[2]) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(mbqpInput); MFX_CHECK_NULL_PTR1(mbqpInput->QP); if (bFieldMode) { sts = FillMBQPBuffer(mbqpInput->QP, mbqpInput->NumQPAlloc/2, picWidth, picHeight/2, (mfxI8*)pMbMap[0], pitch, height_aligned, block_width, block_height); MFX_CHECK_STS(sts); sts = FillMBQPBuffer(mbqpInput->QP + mbqpInput->NumQPAlloc/2, mbqpInput->NumQPAlloc/2, picWidth, picHeight/2, (mfxI8*)pMbMap[1], pitch, height_aligned, block_width, block_height); MFX_CHECK_STS(sts); bMBQPUsing[0] = bMBQPUsing[1] = true; } else { sts = FillMBQPBuffer(mbqpInput->QP, mbqpInput->NumQPAlloc, picWidth, picHeight, (mfxI8*)pMbMap[0], pitch, height_aligned, block_width, block_height); MFX_CHECK_STS(sts); bMBQPUsing[0] = true; } return sts; } struct HrdParameters { mfxU8 cpbCntMinus1; mfxU8 bitRateScale; mfxU8 cpbSizeScale; mfxU32 bitRateValueMinus1[32]; mfxU32 cpbSizeValueMinus1[32]; mfxU8 cbrFlag[32]; mfxU8 initialCpbRemovalDelayLengthMinus1; mfxU8 cpbRemovalDelayLengthMinus1; mfxU8 dpbOutputDelayLengthMinus1; mfxU8 timeOffsetLength; }; struct VuiParameters { struct { mfxU16 aspectRatioInfoPresent : 1; mfxU16 overscanInfoPresent : 1; mfxU16 overscanAppropriate : 1; mfxU16 videoSignalTypePresent : 1; mfxU16 videoFullRange : 1; mfxU16 colourDescriptionPresent : 1; mfxU16 chromaLocInfoPresent : 1; mfxU16 timingInfoPresent : 1; mfxU16 fixedFrameRate : 1; mfxU16 nalHrdParametersPresent : 1; mfxU16 vclHrdParametersPresent : 1; mfxU16 lowDelayHrd : 1; mfxU16 picStructPresent : 1; mfxU16 bitstreamRestriction : 1; mfxU16 motionVectorsOverPicBoundaries : 1; mfxU16 reserved : 1; } flags; mfxU8 aspectRatioIdc; mfxU16 sarWidth; mfxU16 sarHeight; mfxU8 videoFormat; mfxU8 colourPrimaries; mfxU8 transferCharacteristics; mfxU8 matrixCoefficients; mfxU8 chromaSampleLocTypeTopField; mfxU8 chromaSampleLocTypeBottomField; mfxU32 numUnitsInTick; mfxU32 timeScale; HrdParameters nalHrdParameters; HrdParameters vclHrdParameters; mfxU8 maxBytesPerPicDenom; mfxU8 maxBitsPerMbDenom; mfxU8 log2MaxMvLengthHorizontal; mfxU8 log2MaxMvLengthVertical; mfxU8 numReorderFrames; mfxU8 maxDecFrameBuffering; }; struct mfxExtSpsHeader { mfxExtBuffer Header; mfxU8 nalRefIdc; mfxU8 nalUnitType; mfxU8 profileIdc; struct { mfxU8 set0 : 1; mfxU8 set1 : 1; mfxU8 set2 : 1; mfxU8 set3 : 1; mfxU8 set4 : 1; mfxU8 set5 : 1; mfxU8 set6 : 2; mfxU8 set7 : 2; } constraints; mfxU8 levelIdc; mfxU8 seqParameterSetId; mfxU8 chromaFormatIdc; mfxU8 separateColourPlaneFlag; mfxU8 bitDepthLumaMinus8; mfxU8 bitDepthChromaMinus8; mfxU8 qpprimeYZeroTransformBypassFlag; mfxU8 seqScalingMatrixPresentFlag; mfxU8 seqScalingListPresentFlag[12]; mfxU8 scalingList4x4[6][16]; mfxU8 scalingList8x8[6][64]; mfxU8 log2MaxFrameNumMinus4; mfxU8 picOrderCntType; mfxU8 log2MaxPicOrderCntLsbMinus4; mfxU8 deltaPicOrderAlwaysZeroFlag; mfxI32 offsetForNonRefPic; mfxI32 offsetForTopToBottomField; mfxU8 numRefFramesInPicOrderCntCycle; mfxI32 offsetForRefFrame[256]; mfxU8 maxNumRefFrames; mfxU8 gapsInFrameNumValueAllowedFlag; mfxU16 picWidthInMbsMinus1; mfxU16 picHeightInMapUnitsMinus1; mfxU8 frameMbsOnlyFlag; mfxU8 mbAdaptiveFrameFieldFlag; mfxU8 direct8x8InferenceFlag; mfxU8 frameCroppingFlag; mfxU32 frameCropLeftOffset; mfxU32 frameCropRightOffset; mfxU32 frameCropTopOffset; mfxU32 frameCropBottomOffset; mfxU8 vuiParametersPresentFlag; VuiParameters vui; }; bool operator ==(mfxExtSpsHeader const & lhs, mfxExtSpsHeader const & rhs); template <> inline bool Equal(mfxExtSpsHeader const & lhs, mfxExtSpsHeader const & rhs) { return lhs == rhs; } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE struct mfxExtSpsSvcHeader { mfxExtBuffer Header; mfxU8 interLayerDeblockingFilterControlPresentFlag; mfxU8 extendedSpatialScalabilityIdc; mfxU8 chromaPhaseXPlus1Flag; mfxU8 chromaPhaseYPlus1; mfxU8 seqRefLayerChromaPhaseXPlus1Flag; mfxU8 seqRefLayerChromaPhaseYPlus1; mfxI16 seqScaledRefLayerLeftOffset; mfxI16 seqScaledRefLayerTopOffset; mfxI16 seqScaledRefLayerRightOffset; mfxI16 seqScaledRefLayerBottomOffset; mfxU8 seqTcoeffLevelPredictionFlag; mfxU8 adaptiveTcoeffLevelPredictionFlag; mfxU8 sliceHeaderRestrictionFlag; }; #endif union SliceGroupInfo { struct { mfxU32 runLengthMinus1[8]; } t0; struct { mfxU32 topLeft[7]; mfxU32 bottomRight[7]; } t2; struct { mfxU8 sliceGroupChangeDirectionFlag; mfxU32 sliceGroupChangeRate; } t3; struct { mfxU32 picSizeInMapUnitsMinus1; } t6; }; template <> inline void InitExtBufHeader(mfxExtSpsHeader & extBuf) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof (mfxExtSpsHeader); // set default non-zero values extBuf.chromaFormatIdc = 1; extBuf.vuiParametersPresentFlag = 1; extBuf.vui.flags.nalHrdParametersPresent = 1; extBuf.vui.flags.timingInfoPresent = 1; extBuf.vui.flags.fixedFrameRate = 1; } struct mfxExtPpsHeader { mfxExtBuffer Header; mfxU8 nalRefIdc; mfxU8 picParameterSetId; mfxU8 seqParameterSetId; mfxU8 entropyCodingModeFlag; mfxU8 bottomFieldPicOrderInframePresentFlag; mfxU8 numSliceGroupsMinus1; mfxU8 sliceGroupMapType; SliceGroupInfo sliceGroupInfo; mfxU8 numRefIdxL0DefaultActiveMinus1; mfxU8 numRefIdxL1DefaultActiveMinus1; mfxU8 weightedPredFlag; mfxU8 weightedBipredIdc; mfxI8 picInitQpMinus26; mfxI8 picInitQsMinus26; mfxI8 chromaQpIndexOffset; mfxU8 deblockingFilterControlPresentFlag; mfxU8 constrainedIntraPredFlag; mfxU8 redundantPicCntPresentFlag; mfxU8 transform8x8ModeFlag; mfxU8 picScalingMatrixPresentFlag; mfxI8 secondChromaQpIndexOffset; bool moreRbspData; mfxU8 scalingList4x4[6][16]; mfxU8 scalingList8x8[6][64]; bool picScalingListPresentFlag[12]; }; struct mfxRoiDesc{ mfxU32 Left; mfxU32 Top; mfxU32 Right; mfxU32 Bottom; mfxI16 ROIValue; }; struct mfxRectDesc{ mfxU32 Left; mfxU32 Top; mfxU32 Right; mfxU32 Bottom; }; struct mfxMovingRectDesc{ mfxU32 DestLeft; mfxU32 DestTop; mfxU32 DestRight; mfxU32 DestBottom; mfxU32 SourceLeft; mfxU32 SourceTop; }; class MfxVideoParam : public mfxVideoParam { public: MfxVideoParam(); MfxVideoParam(MfxVideoParam const &); MfxVideoParam(mfxVideoParam const &); MfxVideoParam & operator = (MfxVideoParam const &); MfxVideoParam & operator = (mfxVideoParam const &); void SyncVideoToCalculableParam(); void SyncCalculableToVideoParam(); void AlignCalcWithBRCParamMultiplier(); void ApplyDefaultsToMvcSeqDesc(); #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) std::vector& GetCqmPps() { return m_extCqmPps; } const std::vector& GetCqmPps() const { return m_extCqmPps; } #endif protected: void Construct(mfxVideoParam const & par); void ConstructMvcSeqDesc(mfxExtMVCSeqDesc const & desc); private: #if defined(MFX_ENABLE_ENCTOOLS) mfxExtBuffer * m_extParam[41]; #else mfxExtBuffer * m_extParam[36]; #endif // external, documented mfxExtCodingOption m_extOpt; mfxExtCodingOption2 m_extOpt2; mfxExtCodingOption3 m_extOpt3; mfxExtCodingOptionSPSPPS m_extOptSpsPps; mfxExtVideoSignalInfo m_extVideoSignal; mfxExtMVCSeqDesc m_extMvcSeqDescr; mfxExtPictureTimingSEI m_extPicTiming; mfxExtAvcTemporalLayers m_extTempLayers; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxExtSVCSeqDesc m_extSvcSeqDescr; mfxExtSVCRateControl m_extSvcRateCtrl; #endif mfxExtEncoderResetOption m_extEncResetOpt; mfxExtEncoderROI m_extEncRoi; mfxExtChromaLocInfo m_extChromaLoc; mfxExtPredWeightTable m_extPwt; mfxExtDirtyRect m_extDirtyRect; mfxExtMoveRect m_extMoveRect; mfxExtCodingOptionDDI m_extOptDdi; mfxExtSpsHeader m_extSps; mfxExtPpsHeader m_extPps; #if defined(__MFXBRC_H__) mfxExtBRC m_extBRC; #endif #if defined(MFX_ENABLE_ENCTOOLS) mfxEncTools m_encTools; mfxExtEncToolsConfig m_encToolsConfig; mfxEncToolsCtrlExtDevice m_extDevice; mfxEncToolsCtrlExtAllocator m_extAllocator; #endif mfxExtVPPDenoise2 m_extVppHVS; #if defined(MFX_ENABLE_ENCTOOLS_LPLA) mfxExtLplaParam m_extLowpowerLA; #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) std::vector m_extCqmPps; #endif #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) mfxExtPartialBitstreamParam m_po; #endif std::vector m_storageView; std::vector m_storageOp; std::vector m_storageViewId; public: struct CalculableParam { mfxU32 bufferSizeInKB; mfxU32 initialDelayInKB; mfxU32 targetKbps; mfxU32 maxKbps; mfxU32 WinBRCMaxAvgKbps; mfxU32 numTemporalLayer; mfxU32 tid[8]; mfxU32 scale[8]; // MVC BD { struct { mfxU32 bufferSizeInKB; mfxU32 initialDelayInKB; mfxU32 targetKbps; mfxU32 maxKbps; mfxU16 codecLevel; } mvcPerViewPar; // MVC BD } mfxU32 numDependencyLayer; mfxU32 did[8]; mfxU32 numLayersTotal; mfxU32 numLayerOffset[8]; mfxU32 dqId1Exists; mfxU32 tempScalabilityMode; mfxU32 cqpHrdMode; // special CQP mode in which HRD information is written into bitstreams: 0 - disabled, 1 -CBR, 2 - VBR struct { mfxU32 bufferSizeInKB; mfxU32 initialDelayInKB; mfxU32 targetKbps; mfxU32 maxKbps; } decorativeHrdParam; // decorative HRD parameters for cqpHrdMode mfxU16 widthLa; mfxU16 heightLa; mfxU32 TCBRCTargetFrameSize; mfxU32 PPyrInterval; } calcParam; }; bool isSWBRC (MfxVideoParam const & par); bool isAdaptiveQP(MfxVideoParam const & par); bool isAdaptiveCQMSupported(mfxU16 scenarioInfo, bool isLowPowerOn); mfxU16 GetMaxNumSlices(MfxVideoParam const & par); mfxU16 GetNumSurfInput(MfxVideoParam const & video); mfxU8 GetNumReorderFrames(MfxVideoParam const & video); mfxU32 CalcNumSurfRaw(MfxVideoParam const & video); mfxU32 CalcNumSurfRecon(MfxVideoParam const & video); mfxU32 CalcNumSurfBitstream(MfxVideoParam const & video); mfxU32 CalcNumTasks(MfxVideoParam const & video); mfxI64 CalcDTSFromPTS( mfxFrameInfo const & info, mfxU16 dpbOutputDelay, mfxU64 timeStamp); #define SCALE_FROM_DRIVER 4 // driver hardcodes scale 4. Need to use this value in MSDK. Otherwise BRC and MSDK HRD calculations will diverge. mfxU32 GetMaxBitrateValue( mfxU32 kbps, mfxU32 scale = SCALE_FROM_DRIVER); mfxU8 GetCabacInitIdc(mfxU32 targetUsage); bool IsDenoiserSupported( MfxVideoParam const & video, eMFXHWType platform); mfxU32 GetPPyrSize( MfxVideoParam const & video, mfxU32 miniGopSize, bool bEncToolsLA); bool IsExtBrcSceneChangeSupported( MfxVideoParam const & video, eMFXHWType platform); bool IsCmNeededForSCD( MfxVideoParam const & video); bool IsAdaptiveLtrOn( MfxVideoParam const & video); mfxU8 DetermineQueryMode(mfxVideoParam * in); mfxStatus SetLowPowerDefault( MfxVideoParam& par, const eMFXHWType& platform); mfxStatus QueryHwCaps( VideoCORE * core, MFX_ENCODE_CAPS & hwCaps, mfxVideoParam * par); mfxStatus QueryMbProcRate( VideoCORE* core, mfxVideoParam const & out, mfxU32 (&mbPerSec)[16], const mfxVideoParam * in); mfxStatus QueryGuid( VideoCORE* core, GUID guid); mfxStatus ReadSpsPpsHeaders(MfxVideoParam & par); mfxU16 GetFrameWidth(MfxVideoParam & par); mfxU16 GetFrameHeight(MfxVideoParam & par); mfxStatus CorrectCropping( MfxVideoParam & par); bool IsRunTimeOnlyExtBuffer( mfxU32 id); bool IsRunTimeExtBufferIdSupported( MfxVideoParam const & video, mfxU32 id); bool IsRuntimeOutputExtBufferIdSupported( MfxVideoParam const & video, mfxU32 id); bool IsRunTimeExtBufferPairAllowed( MfxVideoParam const & video, mfxU32 id); bool IsRunTimeExtBufferPairRequired( MfxVideoParam const & video, mfxU32 id); bool IsVideoParamExtBufferIdSupported( mfxU32 id); mfxStatus CheckExtBufferId( mfxVideoParam const & par); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxU32 GetLastDid( mfxExtSVCSeqDesc const & extSvc); #endif mfxStatus CheckWidthAndHeight( MfxVideoParam const & par); mfxStatus CopySpsPpsToVideoParam( MfxVideoParam & par); mfxStatus CheckForAllowedH264SpecViolations( MfxVideoParam const & par); mfxStatus CheckAndFixRectQueryLike( MfxVideoParam const & par, mfxRectDesc * rect); mfxStatus CheckAndFixOpenRectQueryLike( MfxVideoParam const & par, mfxRectDesc * rect); mfxStatus CheckAndFixRoiQueryLike( MfxVideoParam const & par, mfxRoiDesc * roi, mfxU16 roiMode); mfxStatus CheckAndFixMovingRectQueryLike( MfxVideoParam const & par, mfxMovingRectDesc * rect); mfxStatus CheckVideoParam( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, bool setExtAlloc, eMFXHWType platform = MFX_HW_UNKNOWN, eMFXVAType vaType = MFX_HW_NO, eMFXGTConfig config = MFX_GT_UNKNOWN, bool bInit = false); mfxStatus CheckVideoParamQueryLike( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, eMFXHWType platform = MFX_HW_UNKNOWN, eMFXVAType vaType = MFX_HW_NO, eMFXGTConfig config = MFX_GT_UNKNOWN); mfxStatus CheckVideoParamMvcQueryLike(MfxVideoParam & par); mfxStatus CheckMVCSeqDescQueryLike(mfxExtMVCSeqDesc * mvcSeqDesc); mfxStatus CheckAndFixMVCSeqDesc(mfxExtMVCSeqDesc * mvcSeqDesc, bool isViewOutput); void SetDefaults( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, bool setExtAlloc, eMFXHWType platform = MFX_HW_UNKNOWN, eMFXVAType vaType = MFX_HW_NO, eMFXGTConfig config = MFX_GT_UNKNOWN); void InheritDefaultValues( MfxVideoParam const & parInit, MfxVideoParam & parReset, MFX_ENCODE_CAPS const & hwCaps, mfxVideoParam const * parResetIn = 0); mfxStatus CheckPayloads( mfxPayload const * const * payload, mfxU16 numPayload); mfxStatus CheckRunTimeExtBuffers( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, MFX_ENCODE_CAPS const & caps); mfxStatus CheckFEIRunTimeExtBuffersContent( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs); mfxStatus CheckRunTimePicStruct( mfxU16 runtPicStruct, mfxU16 initPicStruct); bool IsRecoveryPointSeiMessagePresent( mfxPayload const * const * payload, mfxU16 numPayload, mfxU32 payloadLayout); mfxStatus CopyFrameDataBothFields( VideoCORE * core, mfxMemId dstMid, const mfxFrameSurface1& srcSurf, mfxFrameInfo const& info, const mfxU16& inMemType); bool IsLpLookaheadSupported( mfxU16 scenario, mfxU16 lookaheadDepth, mfxU16 rateContrlMethod); struct mfxExtBufferProxy; struct mfxExtBufferRefProxy; template mfxExtBufferProxy GetExtBuffer(const T & par, mfxU32 fieldId = 0); template mfxExtBufferProxy GetExtBufferFEI(const T & bs, mfxU32 fieldId = 0); template mfxExtBufferRefProxy GetExtBufferRef(const T & par, mfxU32 fieldId = 0); struct mfxExtBufferProxy { public: template operator T() { mfxExtBuffer * p = mfx::GetExtBuffer( m_extParam, m_numExtParam, ExtBufTypeToId::Type>::id, m_fieldId); return reinterpret_cast(p); } template friend mfxExtBufferProxy GetExtBuffer(const T & par, mfxU32 fieldId) { return mfxExtBufferProxy(par.ExtParam, par.NumExtParam, fieldId); } template friend mfxExtBufferProxy GetExtBufferFEI(const T & bs, mfxU32 fieldId) { return mfxExtBufferProxy(bs->ExtParam, bs->NumExtParam, fieldId); } protected: mfxExtBufferProxy(mfxExtBuffer ** extParam, mfxU32 numExtParam, mfxU32 fieldId = 0) : m_extParam(extParam) , m_numExtParam(numExtParam) , m_fieldId(fieldId) { } private: mfxExtBuffer ** m_extParam; mfxU32 m_numExtParam; mfxU32 m_fieldId; }; // version with assert, special for extract extBuffer from wrapper MfxVideoParam struct mfxExtBufferRefProxy{ public: template operator T&() { mfxExtBuffer * p = mfx::GetExtBuffer( m_extParam, m_numExtParam, ExtBufTypeToId::Type>::id, m_fieldId); assert(p); return *(reinterpret_cast(p)); } // Intention of GetExtBufferRef is to get ext buffers // from MfxVideoParam structure which always has full set // of extension buffers ("mfx::GetExtBuffer" can't return zero). // // So, for MfxVideoParam it's better to use function GetExtBufferRef() // instead GetExtBuffer(), we can wrap issues from static code analyze // to one place (body of function GetExtBufferRef()) instead several // places (every calling GetExtBuffer()) template friend mfxExtBufferRefProxy GetExtBufferRef(const T & par, mfxU32 fieldId) { return mfxExtBufferRefProxy(par.ExtParam, par.NumExtParam, fieldId); } protected: mfxExtBufferRefProxy(mfxExtBuffer ** extParam, mfxU32 numExtParam, mfxU32 fieldId = 0) : m_extParam(extParam) , m_numExtParam(numExtParam) , m_fieldId(fieldId) { } private: mfxExtBuffer ** m_extParam; mfxU32 m_numExtParam; mfxU32 m_fieldId; }; inline bool IsFieldCodingPossible(MfxVideoParam const & par) { return (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; } inline MBQPMode GetMBQPMode(const MFX_ENCODE_CAPS& caps, const mfxVideoParam& video) { return GetMBQPMode(video, caps.ddi_caps.MaxNumOfROI, caps.ddi_caps.ROIBRCDeltaQPLevelSupport, caps.ddi_caps.MbQpDataSupport, IsFieldCodingPossible(video)); } inline void ResetNumSliceIPB(mfxVideoParam &par) { mfxExtCodingOption3 * extOpt3 = GetExtBuffer(par); if(extOpt3 != nullptr && (extOpt3->NumSliceI == 0 || extOpt3->NumSliceP == 0 || extOpt3->NumSliceB == 0)){ extOpt3->NumSliceI = extOpt3->NumSliceP = extOpt3->NumSliceB = par.mfx.NumSlice; } } inline mfxU32 GetAvgFrameSizeInBytes(const MfxVideoParam & par, bool bMaxKbps) { return mfxU32(1000.0 / 8.0*((par.mfx.MaxKbps && bMaxKbps) ? par.mfx.MaxKbps : par.mfx.TargetKbps) * std::max(par.mfx.BRCParamMultiplier,1) / (mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD) ); } inline bool IsTCBRC(const MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps) { mfxExtCodingOption3 &extOpt3 = GetExtBufferRef(par); mfxExtCodingOption &extOpt = GetExtBufferRef(par); return (IsOn(extOpt3.LowDelayBRC) && (hwCaps.ddi_caps.TCBRCSupport) && IsOff(extOpt.NalHrdConformance) && (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VCM )); } inline mfxU8 GetPayloadLayout(mfxU32 fieldPicFlag, mfxU32 secondFieldPicFlag) { return fieldPicFlag == 0 ? 0 /* MFX_PAYLOAD_LAYOUT_ALL */ : secondFieldPicFlag == 0 ? 1 /* MFX_PAYLOAD_LAYOUT_EVEN */ : 2 /* MFX_PAYLOAD_LAYOUT_ODD */; } inline mfxU8 GetPayloadLayout(const mfxFrameParam& fp) { return GetPayloadLayout(fp.AVC.FieldPicFlag, fp.AVC.SecondFieldPicFlag); } inline bool IsDriverSliceSizeControlEnabled(const MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps) { return IsOn(par.mfx.LowPower) && hwCaps.ddi_caps.SliceLevelRateCtrl; } mfxU8 ConvertFrameTypeMfx2Ddi(mfxU32 type); mfxU8 ConvertMfxFrameType2SliceType(mfxU8 type); ENCODE_FRAME_SIZE_TOLERANCE ConvertLowDelayBRCMfx2Ddi(mfxU16 type, bool bTCBRC); enum class SliceDividerType { ONESLICE = 0, // Once slice for the whole frame ROW2ROW = 1, // Slices are power of 2 number of rows, all slices the same ROWSLICE = 2, // Slices are any number of rows, all slices the same ARBITRARY_ROW_SLICE = 3, // Slices are any number of rows, slices can be different ARBITRARY_MB_SLICE = 4, // Slices are any number of MBs, slices can be different }; struct MfxMemId { public: MfxMemId() : mid(0) , external(false) {} MfxMemId(mfxMemId mid_, bool external_) : mid(mid_) , external(external_) {} mfxMemId mid; bool external; }; inline mfxU32 CeilLog2(mfxU32 val) { mfxU32 res = 0; while (val) { val >>= 1; res++; } return res; } inline mfxU32 ExpGolombCodeLength(mfxU32 val) { return CeilLog2(val + 1) * 2 - 1; } // auto-lock for frames struct FrameLocker { FrameLocker(VideoCORE * core, mfxFrameData & data, bool external = false, bool lock = true) : m_core(core) , m_data(data) , m_memId(data.MemId) , m_status(lock ? Lock(external) : LOCK_NO) { } FrameLocker(VideoCORE * core, mfxFrameData & data, mfxMemId memId, bool external = false, bool lock = true) : m_core(core) , m_data(data) , m_memId(memId) , m_status(lock ? Lock(external) : LOCK_NO) { } ~FrameLocker() { Unlock(); } mfxStatus Unlock() { mfxStatus mfxSts = MFX_ERR_NONE; if (m_status == LOCK_INT) mfxSts = m_core->UnlockFrame(m_memId, &m_data); else if (m_status == LOCK_EXT) mfxSts = m_core->UnlockExternalFrame(m_memId, &m_data); m_status = LOCK_NO; return mfxSts; } enum { LOCK_NO, LOCK_INT, LOCK_EXT }; mfxU32 Lock(bool external) { mfxU32 status = LOCK_NO; if (m_data.Y == 0) { status = external ? (m_core->LockExternalFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_EXT : LOCK_NO) : (m_core->LockFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_INT : LOCK_NO); } return status; } private: FrameLocker(FrameLocker const &); FrameLocker & operator =(FrameLocker const &); VideoCORE * m_core; mfxFrameData & m_data; mfxMemId m_memId; mfxU32 m_status; }; class FileHandle { public: FileHandle(FILE * file = 0) : m_file(file) { } ~FileHandle() { Close(); } void Close() { if (m_file != 0) { fclose(m_file); } } FileHandle & operator =(FILE* file) { Close(); m_file = file; return *this; } operator FILE *() { return m_file; } private: FileHandle(FileHandle const &); // no impl FileHandle & operator =(FileHandle const &); // no impl FILE* m_file; }; template class ScopedArray { public: ScopedArray(T * arr = 0) : m_arr(arr) { } ~ScopedArray() { reset(0); } T * reset(T * arr) { T * tmp(m_arr); delete [] m_arr; m_arr = arr; return tmp; } T * cptr() { return m_arr; } T const * cptr() const { return m_arr; } T & operator [](size_t idx) { assert(m_arr); return m_arr[idx]; } T const & operator [](size_t idx) const { assert(m_arr); return m_arr[idx]; } private: ScopedArray(ScopedArray const &); ScopedArray & operator =(ScopedArray const &); T * m_arr; }; struct SliceDividerState { mfxU32 m_numSlice; mfxU32 m_numMbInRow; mfxU32 m_numMbRow; mfxU32 m_leftSlice; mfxU32 m_leftMbRow; mfxU32 m_currSliceFirstMbRow; mfxU32 m_currSliceNumMbRow; }; struct SliceDivider : protected SliceDividerState { SliceDivider() : m_pfNext(0) {} // 'False' means no more slices, object needs to be recreated bool Next() { return m_pfNext(*this); } mfxU32 GetFirstMbInSlice() const; mfxU32 GetNumMbInSlice() const; mfxU32 GetNumSlice() const; protected: bool (*m_pfNext)(SliceDividerState & state); }; struct SliceDividerOneSlice : SliceDivider { SliceDividerOneSlice( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; struct SliceDividerArbitraryRowSlice : SliceDivider { SliceDividerArbitraryRowSlice( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; struct SliceDividerRow2Row : SliceDivider { SliceDividerRow2Row( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); static void Test(); }; struct SliceDividerRowSlice : SliceDivider { SliceDividerRowSlice( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; struct SliceDividerTemporalScalability : SliceDivider { SliceDividerTemporalScalability( mfxU32 sliceSizeInMbs, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; struct SliceDividerLowPower : SliceDivider { SliceDividerLowPower( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; struct SliceDividerLowPowerTemporalScalability : SliceDivider { SliceDividerLowPowerTemporalScalability( mfxU32 sliceSizeInMbs, mfxU32 widthInMbs, mfxU32 heightInMbs); static bool Next(SliceDividerState & state); }; SliceDivider MakeSliceDivider( SliceDividerType sliceHwCaps, mfxU32 sliceSizeInMbs, mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs, bool isLowPower = false); class AspectRatioConverter { public: AspectRatioConverter(mfxU16 sarw, mfxU16 sarh); AspectRatioConverter(mfxU8 sarIdc, mfxU16 sarw, mfxU16 sarh); mfxU8 GetSarIdc() const { return m_sarIdc; } mfxU16 GetSarWidth() const { return m_sarWidth; } mfxU16 GetSarHeight() const { return m_sarHeight; } private: mfxU8 m_sarIdc; mfxU16 m_sarWidth; mfxU16 m_sarHeight; }; class EndOfBuffer : public std::exception { public: EndOfBuffer() : std::exception() {} }; class InvalidBitstream : public std::exception { public: InvalidBitstream() : std::exception() {} }; void ReadSpsHeader( InputBitstream & reader, mfxExtSpsHeader & sps); mfxU8 ReadSpsIdOfPpsHeader( InputBitstream reader); void ReadPpsHeader( InputBitstream & reader, mfxExtSpsHeader const & sps, mfxExtPpsHeader & pps); mfxU32 WriteSpsHeader( OutputBitstream & writer, mfxExtSpsHeader const & sps); mfxU32 WriteSpsHeader( OutputBitstream & writer, mfxExtSpsHeader const & sps, mfxExtBuffer const & spsExt); mfxU32 WritePpsHeader( OutputBitstream & writer, mfxExtPpsHeader const & pps); void WriteScalingList( OutputBitstream & writer, const mfxU8* scalingList, mfxI32 sizeOfScalingList); mfxU32 WriteAud( OutputBitstream & writer, mfxU32 frameType); struct RefListMod; struct WeightTab; template struct FixedArray; typedef FixedArray ArrayRefListMod; typedef FixedArray ArrayWeightTab; void WriteRefPicListModification( OutputBitstream & writer, ArrayRefListMod const & refListMod); struct DecRefPicMarkingInfo; void WriteDecRefPicMarking( OutputBitstream & writer, DecRefPicMarkingInfo const & marking, mfxU32 idrPicFlag); bool IsAvcProfile(mfxU32 profile); bool IsAvcBaseProfile(mfxU32 profile); bool IsAvcHighProfile(mfxU32 profile); bool IsMvcProfile(mfxU32 profile); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE bool IsSvcProfile(mfxU32 profile); #endif inline mfxStatus Error(mfxStatus sts) { //__asm { int 3 } return sts; } inline mfxStatus Warning(mfxStatus sts) { //__asm { int 3 } return sts; } mfxU8 * PackPrefixNalUnitSvc( mfxU8 * begin, mfxU8 * end, bool emulationControl, DdiTask const & task, mfxU32 fieldId, mfxU32 nalUnitType = 0xe); class HeaderPacker { public: void Init( MfxVideoParam const & par, MFX_ENCODE_CAPS const & hwCaps, bool emulPrev = true); // insert emualtion prevention bytes when possible (sps/pps/sei/aud) std::vector const & PackSlices( DdiTask const & task, mfxU32 fieldId); ENCODE_PACKEDHEADER_DATA const & PackSkippedSlice( DdiTask const & task, mfxU32 fieldId); ENCODE_PACKEDHEADER_DATA const & PackAud( DdiTask const & task, mfxU32 fieldId); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE ENCODE_PACKEDHEADER_DATA const & GetScalabilitySei() const { return m_packedScalabilitySei; } #endif ENCODE_PACKEDHEADER_DATA const & GetAud() const { return m_packedAud; } std::vector const & GetSps() const { return m_packedSps; } std::vector const & GetPps(bool cqmPps = false ) const { (void)cqmPps; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (cqmPps) return m_packedCqmPps; #endif return m_packedPps; } std::vector const & GetSlices() const { return m_packedSlices; } bool isMVC() const { return m_isMVC; } bool isSvcPrefixUsed() const { return m_needPrefixNalUnit; } void ResizeSlices(mfxU32 num); #ifndef MFX_AVC_ENCODING_UNIT_DISABLE void GetHeadersInfo(std::vector &HeadersMap, DdiTask const& task, mfxU32 fid); #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) mfxU32 GetPackedCqmPpsNum() { return (mfxU32)m_packedCqmPps.size(); } #endif private: mfxU32 WriteSlice( OutputBitstream & obs, DdiTask const & task, mfxU32 fieldId, mfxU32 sliceId); mfxU32 WriteSlice( OutputBitstream & obs, DdiTask const & task, mfxU32 fieldId, mfxU32 firstMbInSlice, mfxU32 numMbInSlice); // for header packing std::vector m_sps; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE std::vector m_subset; #endif std::vector m_pps; MFX_ENCODE_CAPS m_hwCaps; mfxU8 m_spsIdx[8][16]; // for lookup by did & qid mfxU8 m_ppsIdx[8][16]; // for lookup by did & qid mfxU8 m_refDqId[8]; // for lookup by did mfxU8 m_simulcast[8]; // for lookup by did mfxU16 m_cabacInitIdc; // same for all layers and slices mfxU16 m_directSpatialMvPredFlag; // same for all layers and slices mfxU16 m_numMbPerSlice; bool m_needPrefixNalUnit; bool m_emulPrev; // insert emualtion prevention bytes when possible (sps/pps/sei/aud) bool m_isMVC; bool m_longStartCodes; bool m_isLowPower; ENCODE_PACKEDHEADER_DATA m_packedAud; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE ENCODE_PACKEDHEADER_DATA m_packedScalabilitySei; #endif std::vector m_packedSps; std::vector m_packedPps; std::vector m_packedSlices; std::vector m_headerBuffer; std::vector m_sliceBuffer; static const mfxU32 SPSPPS_BUFFER_SIZE = 1024; static const mfxU32 SLICE_BUFFER_SIZE = 2048; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) std::vector m_cqmPps; std::vector m_packedCqmPps; #endif }; inline mfxU16 LaDSenumToFactor(const mfxU16& LookAheadDS) { switch (LookAheadDS) { case MFX_LOOKAHEAD_DS_UNKNOWN: return 0; case MFX_LOOKAHEAD_DS_OFF: return 1; case MFX_LOOKAHEAD_DS_2x : return 2; case MFX_LOOKAHEAD_DS_4x : return 4; default: assert(0); return LookAheadDS; } } // Function checks if scenario is a target for memory footprint optimization inline bool IsMemoryConstrainedScenario(mfxU16 ScenarioInfo) { return MFX_SCENARIO_VIDEO_CONFERENCE == ScenarioInfo || MFX_SCENARIO_DISPLAY_REMOTING == ScenarioInfo; } }; #endif // MFX_ENABLE_H264_VIDEO_..._HW #endif // __MFX_H264_ENC_COMMON_HW_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include/mfx_h264_encode_hw.h000066400000000000000000000107621443134507600321450ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include "mfx_h264_enc_common_hw.h" #include "mfx_h264_encode_hw_utils.h" #ifndef _MFX_H264_ENCODE_HW_H_ #define _MFX_H264_ENCODE_HW_H_ class MFXHWVideoENCODEH264 : public VideoENCODE { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, void * state = 0); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus QueryImplsDescription(VideoCORE&, mfxEncoderDescription::encoder&, mfx::PODArraysHolder&); MFXHWVideoENCODEH264(VideoCORE *core, mfxStatus *sts) : m_core(core) { if (sts) { *sts = MFX_ERR_NONE; } } virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus Close() { m_impl.reset(); return MFX_ERR_NONE; } virtual mfxTaskThreadingPolicy GetThreadingPolicy() { return m_impl.get() ? m_impl->GetThreadingPolicy() : MFX_TASK_THREADING_INTRA; } virtual mfxStatus Reset(mfxVideoParam *par) { return m_impl.get() ? m_impl->Reset(par) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return m_impl.get() ? m_impl->GetVideoParam(par) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus GetFrameParam(mfxFrameParam *par) { return m_impl.get() ? m_impl->GetFrameParam(par) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return m_impl.get() ? m_impl->GetEncodeStat(stat) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *internalParams) { return m_impl.get() ? m_impl->EncodeFrameCheck(ctrl, surface, bs, reordered_surface, internalParams) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { return m_impl.get() ? m_impl->EncodeFrameCheck(ctrl, surface, bs, reordered_surface, pInternalParams, pEntryPoints, numEntryPoints) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus EncodeFrame( mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *internalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) { return m_impl.get() ? m_impl->EncodeFrame(ctrl, internalParams, surface, bs) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus CancelFrame( mfxEncodeCtrl* ctrl, mfxEncodeInternalParams* internalParams, mfxFrameSurface1* surface, mfxBitstream* bs) { return m_impl.get() ? m_impl->CancelFrame(ctrl, internalParams, surface, bs) : MFX_ERR_NOT_INITIALIZED; } protected: VideoCORE* m_core; std::unique_ptr m_impl; }; #endif // _MFX_H264_ENCODE_HW_H_ #endif // MFX_ENABLE_H264_VIDEO_ENCODE mfx_h264_encode_hw_utils.h000066400000000000000000004306021443134507600333050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include// Copyright (c) 2009-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include #include #include #include /* for std::find_if on Linux/Android */ #include #include "mfx_h264_encode_struct_vaapi.h" #include "umc_mutex.h" #include "umc_event.h" #include "umc_h264_brc.h" #include "mfx_h264_enc_common_hw.h" #include "mfx_ext_buffers.h" #include "mfx_h264_encode_interface.h" #ifdef MFX_ENABLE_EXT #include "mfx_h264_encode_cm.h" #ifdef MFX_ENABLE_ASC #include "asc_cm.h" #endif #else #include "asc.h" #endif #include "ippi.h" #include "libmfx_core_interface.h" #include "mfx_vpp_helper.h" #include "mfx_platform_caps.h" #ifdef MFX_ENABLE_MCTF_IN_AVC #include "cmvm.h" #include "mctf_common.h" #endif #ifndef _MFX_H264_ENCODE_HW_UTILS_H_ #define _MFX_H264_ENCODE_HW_UTILS_H_ #include #include #include inline constexpr bool bIntRateControlLA(mfxU16 mode) { return (mode == MFX_RATECONTROL_LA) || (mode == MFX_RATECONTROL_LA_ICQ) || (mode == MFX_RATECONTROL_LA_HRD) ; } inline constexpr bool bRateControlLA(mfxU16 mode) { return bIntRateControlLA(mode); } #define MFX_H264ENC_HW_TASK_TIMEOUT 2000 #define MFX_H264ENC_HW_TASK_TIMEOUT_SIM 600000 #define MFX_ARRAY_SIZE(ARR) (sizeof(ARR)/sizeof(ARR[0])) const int MFX_MAX_DIRTY_RECT_COUNT = MFX_ARRAY_SIZE(mfxExtDirtyRect::Rect); const int MFX_MAX_MOVE_RECT_COUNT = MFX_ARRAY_SIZE(mfxExtMoveRect::Rect); const int DEFAULT_PPYR_INTERVAL = 3; namespace MfxHwH264Encode { struct VmeData; enum { STAGE_QP = 0xf00000, STAGE_ENC1 = 0x0f0000, STAGE_PAK1 = 0x00f000, STAGE_ENC2 = 0x000f00, STAGE_PAK2 = 0x0000f0, STAGE_ENC = STAGE_ENC1 | STAGE_ENC2, STAGE_PAK = STAGE_PAK1 | STAGE_PAK2, STAGE_ALL = 0xffffff }; static const mfxU16 MFX_MEMTYPE_SYS_INT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_INTERNAL_FRAME; static const mfxU16 MFX_MEMTYPE_SYS_EXT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME; static const mfxU16 MFX_MEMTYPE_D3D_INT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME; static const mfxU16 MFX_MEMTYPE_D3D_EXT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME; mfxU16 CalcNumFrameMin(const MfxHwH264Encode::MfxVideoParam &par, MFX_ENCODE_CAPS const & hwCaps, eMFXHWType platform); enum { TFIELD = 0, BFIELD = 1 }; enum { ENC = 0, DISP = 1 }; /* NAL unit types for internal usage */ enum { NALU_NON_IDR = 1, NALU_IDR = 5, NALU_SEI = 6, NALU_SPS = 7, NALU_PPS = 8, NALU_AUD = 9, NALU_PREFIX = 14, NALU_CODED_SLICE_EXT = 20, }; class DdiTask; struct mfxExtAvcSeiBufferingPeriod { mfxU8 seq_parameter_set_id; mfxU8 nal_cpb_cnt; mfxU8 vcl_cpb_cnt; mfxU8 initial_cpb_removal_delay_length; mfxU32 nal_initial_cpb_removal_delay[32]; mfxU32 nal_initial_cpb_removal_delay_offset[32]; mfxU32 vcl_initial_cpb_removal_delay[32]; mfxU32 vcl_initial_cpb_removal_delay_offset[32]; }; struct mfxExtAvcSeiPicTiming { mfxU8 cpb_dpb_delays_present_flag; mfxU8 cpb_removal_delay_length; mfxU8 dpb_output_delay_length; mfxU8 pic_struct_present_flag; mfxU8 time_offset_length; mfxU32 cpb_removal_delay; mfxU32 dpb_output_delay; mfxU8 pic_struct; mfxU8 ct_type; }; struct mfxExtAvcSeiDecRefPicMrkRep { mfxU8 original_idr_flag; mfxU16 original_frame_num; mfxU8 original_field_info_present_flag; mfxU8 original_field_pic_flag; mfxU8 original_bottom_field_flag; mfxU8 no_output_of_prior_pics_flag; mfxU8 long_term_reference_flag; mfxU8 adaptive_ref_pic_marking_mode_flag; mfxU32 num_mmco_entries; // number of currently valid mmco, value pairs mfxU8 mmco[32]; // memory management control operation id mfxU32 value[64]; // operation-dependent data, max 2 per operation }; struct mfxExtAvcSeiRecPoint { mfxU16 recovery_frame_cnt; mfxU8 exact_match_flag; mfxU8 broken_link_flag; mfxU8 changing_slice_group_idc; }; #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX struct unifiedQMatrixH264 { mfxU8 scalingList4x4[6][16]; mfxU8 scalingList8x8[2][64]; }; #endif template struct Pair { T top; T bot; Pair() : top() , bot() { } template Pair(Pair const & pair) : top(static_cast(pair.top)) , bot(static_cast(pair.bot)) { } template explicit Pair(U const & value) : top(static_cast(value)) , bot(static_cast(value)) { } template Pair(U const & t, U const & b) : top(static_cast(t)) , bot(static_cast(b)) { } template Pair & operator =(Pair const & pair) { Pair tmp(pair); std::swap(*this, tmp); return *this; } T & operator[] (mfxU32 parity) { assert(parity < 2); return (&top)[parity & 1]; } T const & operator[] (mfxU32 parity) const { assert(parity < 2); return (&top)[parity & 1]; } }; template Pair MakePair(T const & top, T const & bot) { return Pair(top, bot); } template bool operator ==(Pair const & l, Pair const & r) { return l.top == r.top && l.bot == r.bot; } typedef Pair PairU8; typedef Pair PairU16; typedef Pair PairU32; typedef Pair PairI32; void PrepareSeiMessage( DdiTask const & task, mfxU32 nalHrdBpPresentFlag, mfxU32 vclHrdBpPresentFlag, mfxU32 seqParameterSetId, mfxExtAvcSeiBufferingPeriod & msg); void PrepareSeiMessage( DdiTask const & task, mfxU32 fieldId, mfxU32 cpbDpbDelaysPresentFlag, mfxU32 picStructPresentFlag, mfxExtAvcSeiPicTiming & msg); void PrepareSeiMessage( DdiTask const & task, mfxU32 fieldId, mfxU32 frame_mbs_only_flag, mfxExtAvcSeiDecRefPicMrkRep & msg); void PrepareSeiMessage( MfxVideoParam const & par, mfxExtAvcSeiRecPoint & msg, mfxU16 recovery_frame_cnt); mfxU32 CalculateSeiSize( mfxExtAvcSeiRecPoint const & msg); mfxU32 CalculateSeiSize( mfxExtAvcSeiDecRefPicMrkRep const & msg); // MVC BD { mfxU32 CalculateSeiSize( mfxExtAvcSeiBufferingPeriod const & msg); mfxU32 CalculateSeiSize( mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg); // MVC BD } mfxStatus CheckBeforeCopy( mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src); mfxStatus CheckBeforeCopyQueryLike( mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src); void Copy( mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src); void FastCopyBufferVid2Sys( void * dstSys, void const * srcVid, mfxI32 bytes); void FastCopyBufferSys2Vid( void * dstSys, void const * srcVid, mfxI32 bytes); PairU8 ExtendFrameType( mfxU32 type); mfxU8 CalcTemporalLayerIndex( MfxVideoParam const & video, mfxI32 frameOrder); bool CheckSubMbPartition( mfxExtCodingOptionDDI const * extDdi, mfxU8 frameType); mfxU8 GetPFrameLevel( mfxU32 i, mfxU32 num); mfxU8 PLayer( MfxVideoParam const & par, mfxU32 order); mfxU8 GetQpValue( DdiTask const & task, MfxVideoParam const & par, mfxU32 frameType); PairU16 GetPicStruct( MfxVideoParam const & video, mfxU16 runtPs); PairU16 GetPicStruct( MfxVideoParam const & video, DdiTask const & task); bool isBitstreamUpdateRequired(MfxVideoParam const & video, MFX_ENCODE_CAPS caps, eMFXHWType platform); enum { H264_FRAME_FLAG_SKIPPED = 1, H264_FRAME_FLAG_READY = 2 }; class MfxFrameAllocResponse : public mfxFrameAllocResponse { public: MfxFrameAllocResponse(); ~MfxFrameAllocResponse(); mfxStatus Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyRequired = true, bool isAllFramesRequired = false); #ifdef MFX_ENABLE_EXT mfxStatus AllocCmBuffers( CmDevice * device, mfxFrameAllocRequest & req); mfxStatus AllocCmBuffersUp( CmDevice * device, mfxFrameAllocRequest & req); mfxStatus AllocCmSurfaces( CmDevice * device, mfxFrameAllocRequest & req); mfxStatus AllocCmSurfacesUP( CmDevice * device, mfxFrameAllocRequest & req); #endif mfxStatus AllocFrames( VideoCORE * core, mfxFrameAllocRequest & req); mfxStatus UpdateResourcePointers( mfxU32 idxScd, void * memY, void * gpuSurf); void * GetSysmemBuffer(mfxU32 idx); mfxU32 Lock(mfxU32 idx); void Unlock(); mfxU32 Unlock(mfxU32 idx); mfxU32 Locked(mfxU32 idx) const; void ClearFlag(mfxU32 idx); void SetFlag(mfxU32 idx, mfxU32 flag); mfxU32 GetFlag(mfxU32 idx) const; private: MfxFrameAllocResponse(MfxFrameAllocResponse const &); MfxFrameAllocResponse & operator =(MfxFrameAllocResponse const &); #ifdef MFX_ENABLE_EXT static void DestroyBuffer (CmDevice * device, void * p); static void DestroySurface (CmDevice * device, void * p); static void DestroySurface2DUP(CmDevice * device, void * p); static void DestroyBufferUp (CmDevice * device, void * p); void (*m_cmDestroy)(CmDevice *, void *); CmDevice * m_cmDevice = nullptr; #endif VideoCORE * m_core; mfxU16 m_numFrameActualReturnedByAllocFrames; std::vector m_responseQueue; std::vector m_mids; std::vector m_locked; std::vector m_flag; std::vector m_sysmems; }; mfxU32 FindFreeResourceIndex( MfxFrameAllocResponse const & pool, mfxU32 startingFrom = 0); mfxMemId AcquireResource( MfxFrameAllocResponse & pool, mfxU32 index); mfxMemId AcquireResource( MfxFrameAllocResponse & pool); mfxHDLPair AcquireResourceUp( MfxFrameAllocResponse & pool, mfxU32 index); mfxHDLPair AcquireResourceUp( MfxFrameAllocResponse & pool); void ReleaseResource( MfxFrameAllocResponse & pool, mfxMemId mid); // add hwType param mfxStatus CheckEncodeFrameParam( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, bool isExternalFrameAllocator, MFX_ENCODE_CAPS const & caps); template void Clear(std::vector & v) { std::vector().swap(v); } template struct FixedArray { FixedArray() : m_numElem(0) { } explicit FixedArray(T fillVal) : m_numElem(0) { Fill(fillVal); } void PushBack(T const & val) { assert(m_numElem < N); m_arr[m_numElem] = val; m_numElem++; } void PushFront(T const val) { assert(m_numElem < N); std::copy(m_arr, m_arr + m_numElem, m_arr + 1); m_arr[0] = val; m_numElem++; } void Erase(T * p) { assert(p >= m_arr && p <= m_arr + m_numElem); m_numElem = mfxU32( std::copy(p + 1, m_arr + m_numElem, p) - m_arr); } void Erase(T * b, T * e) { assert(b <= e); assert(b >= m_arr && b <= m_arr + m_numElem); assert(e >= m_arr && e <= m_arr + m_numElem); m_numElem = mfxU32( std::copy(e, m_arr + m_numElem, b) - m_arr); } void Resize(mfxU32 size, T fillVal = T()) { assert(size <= N); for (mfxU32 i = m_numElem ; i < size; ++i) m_arr[i] = fillVal; m_numElem = size; } T * Begin() { return m_arr; } T const * Begin() const { return m_arr; } T * End() { return m_arr + m_numElem; } T const * End() const { return m_arr + m_numElem; } T & Back() { assert(m_numElem > 0); return m_arr[m_numElem - 1]; } T const & Back() const { assert(m_numElem > 0); return m_arr[m_numElem - 1]; } mfxU32 Size() const { return m_numElem; } mfxU32 Capacity() const { return N; } T & operator[](mfxU32 idx) { assert(idx < N); return m_arr[idx]; } T const & operator[](mfxU32 idx) const { assert(idx < N); return m_arr[idx]; } void Fill(T val) { for (mfxU32 i = 0; i < N; i++) { m_arr[i] = val; } } template bool operator==(const FixedArray& r) const { assert(Size() <= N); assert(r.Size() <= M); if (Size() != r.Size()) { return false; } for (mfxU32 i = 0; i < Size(); i++) { if (m_arr[i] != r[i]) { return false; } } return true; } private: T m_arr[N]; mfxU32 m_numElem; }; struct BiFrameLocation { BiFrameLocation() { Zero(*this); } mfxU32 miniGopCount; // sequence of B frames between I/P frames mfxU32 encodingOrder; // number within mini-GOP (in encoding order) mfxU16 refFrameFlag; // MFX_FRAMETYPE_REF if B frame is reference mfxU32 level; // level of pyramid }; class FrameTypeGenerator { public: FrameTypeGenerator(); void Init(MfxVideoParam const & video); PairU8 Get() const; BiFrameLocation GetBiFrameLocation() const; void Next(); private: mfxU32 m_frameOrder; // in display order mfxU16 m_gopOptFlag; mfxU16 m_gopPicSize; mfxU16 m_gopRefDist; mfxU16 m_refBaseDist; // key picture distance mfxU16 m_biPyramid; mfxU32 m_idrDist; }; /* Intra refresh types */ enum { MFX_REFRESH_NO = 0, MFX_REFRESH_VERTICAL = 1, MFX_REFRESH_HORIZONTAL = 2, MFX_REFRESH_SLICE = 3 }; struct IntraRefreshState { IntraRefreshState() : refrType(0), IntraLocation(0), IntraSize(0), IntRefQPDelta(0), firstFrameInCycle(false) {} mfxU16 refrType; mfxU16 IntraLocation; mfxU16 IntraSize; mfxI16 IntRefQPDelta; bool firstFrameInCycle; }; class Surface { public: Surface() : m_free(true) { } bool IsFree() const { return m_free; } void SetFree(bool free) { m_free = free; } private: bool m_free; }; class Reconstruct : public Surface { public: Reconstruct() : Surface() , m_yuv(0) , m_frameOrderIdrInDisplayOrder(0) , m_frameOrderIdr(0) , m_frameOrderI(0) , m_frameOrder(0) , m_baseLayerOrder(0) , m_frameOrderStartTScalStructure(0) , m_frameNum(0) , m_frameNumWrap(0) , m_picNum(0, 0) , m_longTermFrameIdx(NO_INDEX_U8) , m_longTermPicNum(NO_INDEX_U8, NO_INDEX_U8) , m_reference(false, false) , m_picStruct((mfxU16)MFX_PICSTRUCT_PROGRESSIVE) , m_extFrameTag(0) , m_tid(0) , m_tidx(0) , m_panicMode(0) { } mfxU16 GetPicStructForEncode() const { return m_picStruct[ENC]; } mfxU16 GetPicStructForDisplay() const { return m_picStruct[DISP]; } mfxU8 GetFirstField() const { return (GetPicStructForEncode() & MFX_PICSTRUCT_FIELD_BFF) ? 1 : 0; } mfxI32 GetPoc(mfxU32 parity) const { return 2 * ((m_frameOrder - m_frameOrderIdr) & 0x7fffffff) + (parity != GetFirstField()); } PairI32 GetPoc() const { return PairI32(GetPoc(TFIELD), GetPoc(BFIELD)); } mfxU32 GetPictureCount() const { return (GetPicStructForEncode() & MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 2; } mfxFrameSurface1* m_yuv; mfxU32 m_frameOrderIdrInDisplayOrder; // most recent idr frame in display order mfxU32 m_frameOrderIdr; // most recent idr frame in encoding order mfxU32 m_frameOrderI; // most recent i frame in encoding order mfxU32 m_frameOrder; mfxU32 m_baseLayerOrder; mfxU32 m_frameOrderStartTScalStructure; // starting point of temporal scalability structure mfxU16 m_frameNum; mfxI32 m_frameNumWrap; PairI32 m_picNum; mfxU8 m_longTermFrameIdx; PairU8 m_longTermPicNum; PairU8 m_reference; // is refrence (short or long term) or not PairU16 m_picStruct; mfxU32 m_extFrameTag; mfxU32 m_tid; // temporal_id mfxU8 m_tidx; // temporal layer index (in acsending order of temporal_id) mfxU8 m_panicMode; }; struct RefListMod { RefListMod() : m_idc(3), m_diff(0) {} RefListMod(mfxU16 idc, mfxU16 diff) : m_idc(idc), m_diff(diff) { assert(idc < 6); } mfxU16 m_idc; mfxU16 m_diff; }; struct WeightTab { mfxU8 m_lumaWeightL0Flag:1; mfxU8 m_chromaWeightL0Flag:1; mfxU8 m_lumaWeightL1Flag:1; mfxU8 m_chromaWeightL1Flag:1; mfxI8 m_lumaWeightL0; mfxI8 m_lumaOffsetL0; mfxI8 m_lumaWeightL1; mfxI8 m_lumaOffsetL1; mfxI8 m_chromaWeightL0[2]; mfxI8 m_chromaOffsetL0[2]; mfxI8 m_chromaWeightL1[2]; mfxI8 m_chromaOffsetL1[2]; }; struct DpbFrame { DpbFrame() { Zero(*this); } PairI32 m_poc; mfxU32 m_frameOrder; mfxU32 m_extFrameTag; // frameOrder assigned by application mfxU32 m_frameNum; mfxI32 m_frameNumWrap; mfxI32 m_picNum[2]; mfxU32 m_viewIdx; mfxU32 m_frameIdx; mfxU32 m_tid; PairU8 m_longTermPicNum; PairU8 m_refPicFlag; mfxU8 m_longTermIdxPlus1; mfxU8 m_longterm; // at least one field is a long term reference mfxU8 m_refBase; mfxU8 m_keyRef; //short term reference stored in DPB as long as possible mfxU8 m_PIFieldFlag; // for P/I field pair mfxMemId m_midRec; #ifdef MFX_ENABLE_EXT CmSurface2D * m_cmRaw; CmSurface2D * m_cmRawLa; CmBufferUP * m_cmMb; #endif #ifdef MFX_ENABLE_FADE_DETECTION CmBufferUP * m_cmHist; void * m_cmHistSys; #endif mfxMemId m_midRaw; // for RefRaw mode mfxFrameSurface1* m_yuvRaw; // for RefRaw mode }; inline bool operator ==(DpbFrame const & l, DpbFrame const & r) { return l.m_frameIdx == r.m_frameIdx && l.m_poc == r.m_poc && l.m_viewIdx == r.m_viewIdx; } typedef FixedArray ArrayU32x16; typedef FixedArray ArrayU32x64; typedef FixedArray ArrayU16x16; typedef FixedArray ArrayU8x8; typedef FixedArray ArrayU8x16; typedef FixedArray ArrayU8x32; typedef FixedArray ArrayU8x33; typedef FixedArray ArrayPairU32x16; typedef FixedArray ArrayRefListMod; typedef FixedArray ArrayRoi; typedef FixedArray ArrayRect; typedef FixedArray ArrayMovingRect; struct ArrayDpbFrame : public FixedArray { ArrayDpbFrame() : FixedArray() { m_maxLongTermFrameIdxPlus1.Resize(8, 0); } ArrayU8x8 m_maxLongTermFrameIdxPlus1; // for each temporal layer }; struct DecRefPicMarkingInfo { DecRefPicMarkingInfo() { Zero(*this); } void PushBack(mfxU8 op, mfxU32 param0, mfxU32 param1 = 0) { mmco.PushBack(op); value.PushBack(param0); value.PushBack(param1); } void Clear() { mmco.Resize(0); value.Resize(0); value.Resize(0); } mfxU8 no_output_of_prior_pics_flag; mfxU8 long_term_reference_flag; ArrayU8x32 mmco; // memory management control operation id ArrayU32x64 value; // operation-dependent data, max 2 per operation }; struct DecRefPicMarkingRepeatInfo { DecRefPicMarkingRepeatInfo() : presentFlag(false) , original_idr_flag(0) , original_frame_num(0) , original_field_pic_flag(0) , original_bottom_field_flag(0) , dec_ref_pic_marking() { } bool presentFlag; mfxU8 original_idr_flag; mfxU16 original_frame_num; mfxU8 original_field_pic_flag; mfxU8 original_bottom_field_flag; DecRefPicMarkingInfo dec_ref_pic_marking; }; struct SliceStructInfo { mfxU32 startMB; mfxU32 numMB; mfxF32 weight; mfxU32 cost; }; #if defined(MFX_ENABLE_EXT_BRC) struct BRCFrameParams : mfxBRCFrameParam { mfxU16 picStruct; mfxU32 OptimalFrameSizeInBytes; mfxU32 LaAvgEncodedSize; mfxU32 LaCurEncodedSize; mfxU16 LaIDist; }; #else struct BRCFrameParams { mfxU32 reserved[23]; mfxU16 SceneChange; // Frame is Scene Chg frame mfxU16 LongTerm; // Frame is long term refrence mfxU32 FrameCmplx; // Frame Complexity mfxU32 EncodedOrder; // Frame number in a sequence of reordered frames starting from encoder Init() mfxU32 DisplayOrder; // Frame number in a sequence of frames in display order starting from last IDR mfxU32 CodedFrameSize; // Size of frame in bytes after encoding mfxU16 FrameType; // See FrameType enumerator mfxU16 PyramidLayer; // B-pyramid or P-pyramid layer, frame belongs to mfxU16 NumRecode; // Number of recodings performed for this frame mfxU16 NumExtParam; mfxExtBuffer** ExtParam; mfxU16 picStruct; mfxU32 OptimalFrameSizeInBytes; mfxU32 optimalBufferFullness; }; #endif class DdiTask : public Reconstruct { public: DdiTask() : Reconstruct() , m_pushed(0) , m_type(0, 0) , m_QPdelta(0) , m_bQPDelta(false) , m_QPmodulation(0) , m_currGopRefDist(0) , m_dpb() , m_internalListCtrlPresent(false) , m_internalListCtrlHasPriority(true) , m_internalListCtrlRefModLTR(false) , m_keyReference(false) , m_initCpbRemoval(0) , m_initCpbRemovalOffset(0) , m_cpbRemoval(0, 0) , m_dpbOutputDelay(0) , m_encOrder(mfxU32(-1)) , m_encOrderIdr(0) , m_encOrderI(0) , m_viewIdx(0) , m_idx(NO_INDEX) , m_idxBs(NO_INDEX, NO_INDEX) , m_idxBsOffset(0) , m_idxRecon(NO_INDEX) , m_idxInterLayerRecon(0) , m_idxReconOffset(0) , m_idrPicId(mfxU16(-1)) , m_subMbPartitionAllowed(0, 0) , m_cqpValue(0, 0) , m_insertAud(0, 0) , m_insertSps(0, 0) , m_insertPps(0, 0) , m_AUStartsFromSlice(0, 0) , m_nalRefIdc(0, 0) , m_statusReportNumber(0, 0) , m_pid(0) , m_fillerSize(0, 0) , m_addRepackSize(0, 0) , m_maxIFrameSize(0) , m_maxPBFrameSize(0) , m_numMbPerSlice(0) , m_numSlice(0, 0) , m_numRoi(0) , m_NumDeltaQpForNonRectROI(0) , m_roiMode(MFX_ROI_MODE_PRIORITY) , m_numDirtyRect(0) , m_numMovingRect(0) , m_did(0) , m_qid(0) , m_storeRefBasePicFlag(0) , m_bs(0) , m_bsDataLength(0, 0) , m_numLeadingFF(0, 0) , m_qpY(0, 0) , m_mad(0, 0) , m_minFrameSize (0) #ifdef MFX_ENABLE_ENCODE_STATS , m_encodeStats(0) #endif , m_notProtected(false) , m_nextLayerTask(0) , m_repack(0) , m_fractionalQP(0) #ifdef MFX_ENABLE_APQ_LQ , m_ALQOffset(0) #endif , m_midRaw(MID_INVALID) , m_midRec(MID_INVALID) , m_midBit(mfxMemId(MID_INVALID)) #if defined(MFX_ENABLE_MCTF_IN_AVC) , m_midMCTF(mfxMemId(MID_INVALID)) , m_idxMCTF(NO_INDEX) , m_cmMCTF(0) #endif #ifdef MFX_ENABLE_EXT , m_cmRaw(0) , m_cmRawLa(0) , m_cmMb(0) , m_cmMbSys(0) , m_cmRefMb(0) , m_cmCurbe(0) , m_cmRefs(0) , m_cmRefsLa(0) , m_event(0) #endif , m_vmeData(0) , m_fwdRef(0) , m_bwdRef(0) , m_fieldPicFlag(0) , m_singleFieldMode(false) , m_fieldCounter(0) , m_timeStamp(0) , m_minQP(0) , m_maxQP(0) , m_resetBRC(false) , m_idxMBQP{ NO_INDEX, NO_INDEX } , m_midMBQP{ MID_INVALID, MID_INVALID } , m_isMBQP{ false, false } , m_isUseRawRef(false) , m_isSkipped (false) , m_toRecode (false) , m_isMBControl(false) , m_midMBControl(MID_INVALID) , m_idxMBControl(NO_INDEX) #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) , m_adaptiveCQMHint(CQM_HINT_INVALID) #endif #ifdef MFX_ENABLE_FADE_DETECTION , m_cmRawForHist(0) , m_cmHist(0) , m_cmHistSys(0) #endif , m_isENCPAK(false) , m_startTime(0) , m_hwType(MFX_HW_UNKNOWN) #if defined(MFX_ENABLE_H264_REPARTITION_CHECK) , m_RepartitionCheck(0) #endif , m_TCBRCTargetFrameSize(0) , m_SceneChange(0) #if defined(MFX_ENABLE_ENCTOOLS) , m_SpatialComplexity(0) , m_PersistenceMapNZ(0) , m_PersistenceMap{} #endif #if defined(MFX_ENABLE_MCTF_IN_AVC) , m_doMCTFIntraFiltering(0) #endif , m_LowDelayPyramidLayer(0) , m_frameLtrOff(1) , m_frameLtrReassign(0) , m_LtrOrder(-1) , m_LtrQp(0) , m_RefOrder(-1) , m_RefQp(0) , m_idxScd(0) #ifdef MFX_ENABLE_EXT , m_wsSubSamplingEv(0) , m_wsSubSamplingTask(0) , m_wsGpuImage(0) , m_wsIdxGpuImage(0) #endif , m_Yscd(0) #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX , m_qMatrix() #endif #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) , m_procBO{0,0} , m_scanBO{0,0} , m_nextMarkerPtr{nullptr, nullptr} , m_curNALtype() , m_bsPO{} #endif { Zero(m_ctrl); Zero(m_internalListCtrl); Zero(m_handleRaw); #if defined(MFX_ENABLE_MCTF_IN_AVC) Zero(m_handleMCTF); #endif Zero(m_fid); #ifdef MFX_ENABLE_FADE_DETECTION Zero(m_pwt); #endif Zero(m_brcFrameParams); Zero(m_brcFrameCtrl); m_FrameName[0] = 0; #ifndef MFX_AVC_ENCODING_UNIT_DISABLE m_collectUnitsInfo = false; m_headersCache[0].reserve(10); m_headersCache[1].reserve(10); #endif } bool operator == (const DdiTask& task) { if(&task == this) return true; return false; } mfxU8 GetFrameType() const { return m_type[GetFirstField()]; } // 0 - no skip, 1 - normal, 2 - pavp mfxU8 SkipFlag() const { if ( m_ctrl.SkipFrame == 0 || (m_type.top & MFX_FRAMETYPE_I) || (m_type.bot & MFX_FRAMETYPE_I)) return 0; return (mfxU8)m_ctrl.SkipFrame; } // Checking timeout for TDR hang detection bool CheckForTDRHang(mfxU32 curTime, mfxU32 timeout) const { MFX_TRACE_D(curTime); MFX_TRACE_D(m_startTime); MFX_TRACE_D(timeout); if (m_startTime && timeout && (curTime - m_startTime) > timeout) { MFX_TRACE_S("Possible TDR hang:"); MFX_TRACE_D(((curTime - m_startTime) > timeout)); return true; } return false; } inline void InitBRCParams() { Zero(m_brcFrameParams); Zero(m_brcFrameCtrl); m_brcFrameParams.FrameType = m_type[m_fid[0]]; m_brcFrameParams.DisplayOrder = m_frameOrder; m_brcFrameParams.EncodedOrder = m_encOrder; m_brcFrameParams.PyramidLayer = (m_brcFrameParams.FrameType & MFX_FRAMETYPE_B) ? (mfxU16)m_loc.level : 0; m_brcFrameParams.LongTerm = (m_longTermFrameIdx != NO_INDEX_U8) ? 1 : 0; m_brcFrameParams.SceneChange = (mfxU16)m_SceneChange; if (!m_brcFrameParams.PyramidLayer && (m_type[m_fid[0]] & MFX_FRAMETYPE_P) && m_LowDelayPyramidLayer) m_brcFrameParams.PyramidLayer = (mfxU16)m_LowDelayPyramidLayer; m_brcFrameParams.picStruct = GetPicStructForEncode(); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) m_brcFrameParams.OptimalFrameSizeInBytes = m_lplastatus.TargetFrameSize; #endif #if defined(MFX_ENABLE_ENCTOOLS) m_brcFrameParams.LaAvgEncodedSize = m_lplastatus.AvgEncodedBits; m_brcFrameParams.LaCurEncodedSize = m_lplastatus.CurEncodedBits; m_brcFrameParams.LaIDist = m_lplastatus.DistToNextI; #endif } inline bool isSEIHRDParam(mfxExtCodingOption const & extOpt, mfxExtCodingOption2 const & extOpt2) { return (((GetFrameType() & MFX_FRAMETYPE_IDR) || ((GetFrameType() & MFX_FRAMETYPE_I) && (extOpt2.BufferingPeriodSEI == MFX_BPSEI_IFRAME))) && (IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters))); } mfxEncodeCtrl m_ctrl; DdiTask * m_pushed; // task which was pushed to queue when this task was chosen for encoding Pair m_type; // encoding type (one for each field) mfxI16 m_QPdelta; bool m_bQPDelta; mfxU16 m_QPmodulation; mfxU32 m_currGopRefDist; // all info about references // everything is in pair because task is a per-frame object Pair m_dpb; ArrayDpbFrame m_dpbPostEncoding; // dpb after encoding a frame (or 2 fields) Pair m_list0; Pair m_list1; Pair m_refPicList0Mod; Pair m_refPicList1Mod; Pair m_initSizeList0; Pair m_initSizeList1; // currently used for dpb control when svc temporal layers enabled mfxExtAVCRefListCtrl m_internalListCtrl; bool m_internalListCtrlPresent; bool m_internalListCtrlHasPriority; bool m_internalListCtrlRefModLTR; bool m_keyReference; // frame should be stored in DPB as long as possible mfxU32 m_initCpbRemoval; // initial_cpb_removal_delay mfxU32 m_initCpbRemovalOffset; // initial_cpb_removal_delay_offset PairU32 m_cpbRemoval; // one for each field mfxU32 m_dpbOutputDelay; // one for entire frame mfxU32 m_encOrder; mfxU32 m_encOrderIdr; mfxU32 m_encOrderI; Pair m_decRefPicMrkRep; // for sei_message() which repeat dec_ref_pic_marking() of previous frame Pair m_decRefPicMrk; // dec_ref_pic_marking() for current frame mfxU32 m_viewIdx; mfxU32 m_idx; // index in chain of raw surfaces (set only when sysmem at input) PairU32 m_idxBs; // index of bitstream surfaces, 2 - for interlaced frame (snb only) mfxU32 m_idxBsOffset; // offset for multi-view coding mfxU32 m_idxRecon; // index of reconstructed surface mfxU32 m_idxInterLayerRecon; // index of reconstructed surface for inter-layer prediction mfxU32 m_idxReconOffset; // offset for multi-view coding mfxU16 m_idrPicId; PairU8 m_subMbPartitionAllowed; PairU8 m_cqpValue; PairU8 m_insertAud; PairU8 m_insertSps; PairU8 m_insertPps; PairU8 m_AUStartsFromSlice; PairU8 m_nalRefIdc; PairU32 m_statusReportNumber; mfxU32 m_pid; // priority_id PairU32 m_fillerSize; // MVC BD { PairU32 m_addRepackSize; // for SNB/IVB: size of padding to compensate re-pack of AVC headers to MVC headers // MVC BD } mfxU32 m_maxIFrameSize; mfxU32 m_maxPBFrameSize; mfxU16 m_numMbPerSlice; PairU16 m_numSlice; ArrayRoi m_roi; mfxU16 m_numRoi; mfxI8 m_NonRectROIDeltaQpList[16]; mfxU8 m_NumDeltaQpForNonRectROI; mfxU16 m_roiMode; ArrayRect m_dirtyRect; mfxU16 m_numDirtyRect; ArrayMovingRect m_movingRect; mfxU16 m_numMovingRect; mfxU32 m_did; // dependency_id mfxU32 m_qid; // quality_id mfxU32 m_storeRefBasePicFlag; // for svc key picture mfxBitstream * m_bs; // output bitstream PairU32 m_bsDataLength; // bitstream size reported by driver (0 - progr/top, 1 - bottom) PairU32 m_numLeadingFF; // driver may insert 0xff in the beginning of coded frame PairU8 m_qpY; // QpY reported by driver PairU32 m_mad; // MAD BiFrameLocation m_loc; IntraRefreshState m_IRState; mfxU32 m_minFrameSize; #ifdef MFX_ENABLE_ENCODE_STATS mfxExtEncodeStatsOutput* m_encodeStats; bool m_frameLevelQueryEn; bool m_blockLevelQueryEn; #endif char m_FrameName[32]; bool m_notProtected; // Driver returns not protected data DdiTask const * m_nextLayerTask; // set to 0 if no nextLayerResolutionChange mfxU32 m_repack; mfxI32 m_fractionalQP; //if m_fractionalQP > 0 set it value in QM matrices #ifdef MFX_ENABLE_APQ_LQ mfxI32 m_ALQOffset; // MBQP Offset for Lambda QP adjustment #endif mfxMemId m_midRaw; // self-allocated input surface (when app gives input frames in system memory) mfxMemId m_midRec; // reconstruction Pair m_midBit; // output bitstream mfxHDLPair m_handleRaw; // native handle to raw surface (self-allocated or given by app) #if defined(MFX_ENABLE_MCTF_IN_AVC) mfxMemId m_midMCTF; mfxHDLPair m_handleMCTF; // Handle to MCTF denoised surface mfxU32 m_idxMCTF; CmSurface2D * m_cmMCTF; #endif #ifdef MFX_ENABLE_EXT CmSurface2D * m_cmRaw; // CM surface made of m_handleRaw CmSurface2D * m_cmRawLa; // down-sized input surface for Lookahead CmBufferUP * m_cmMb; // macroblock data, VME kernel output void * m_cmMbSys; // pointer to associated system memory buffer CmBufferUP * m_cmRefMb; // macroblock data, VME kernel output for backward ref CmBuffer * m_cmCurbe; // control structure for ME & HME kernels SurfaceIndex * m_cmRefs; // VmeSurfaceG75 for ME kernel SurfaceIndex * m_cmRefsLa; // VmeSurfaceG75 for 2X kernel CmEvent * m_event; #endif VmeData * m_vmeData; DdiTask const * m_fwdRef; DdiTask const * m_bwdRef; mfxU8 m_fieldPicFlag; // true for frames with interlaced content bool m_singleFieldMode; // true for FEI single-field processing mode // m_fid is a remapper of field parity to field order and vise versa. // i.e. parity = m_fid[fieldId] and fieldId = m_fid[parity] (fieldId == m_fid[m_fid[fieldId]]). // It is useful to switch between these two representation, because DdiTask stores all information // according to parity, but all of the per-field extension buffers are attached according to field order // (the only exception is mfxExtAVCRefLists). mfxU8 m_fid[2]; // progressive fid=[0,0]; tff fid=[0,1]; bff fid=[1,0] mfxU8 m_fieldCounter; mfxU64 m_timeStamp; mfxU8 m_minQP; mfxU8 m_maxQP; std::vector m_disableDeblockingIdc[2]; std::vector m_sliceAlphaC0OffsetDiv2[2]; std::vector m_sliceBetaOffsetDiv2[2]; bool m_resetBRC; mfxU32 m_idxMBQP[2]; mfxMemId m_midMBQP[2]; bool m_isMBQP[2]; bool m_isUseRawRef; bool m_isSkipped; bool m_toRecode; bool m_isMBControl; mfxMemId m_midMBControl; mfxU32 m_idxMBControl; #if defined(MFX_ENABLE_ENCTOOLS) mfxLplastatus m_lplastatus; #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) mfxU32 m_adaptiveCQMHint; #endif #ifdef MFX_ENABLE_FADE_DETECTION CmSurface2D * m_cmRawForHist; CmBufferUP * m_cmHist; // Histogram data, kernel output void * m_cmHistSys; mfxExtPredWeightTable m_pwt[2]; // obtained from fade detection #endif bool m_isENCPAK; std::vector m_userData; std::vector m_SliceInfo; mfxU32 m_startTime; eMFXHWType m_hwType; // keep HW type information #if defined(MFX_ENABLE_H264_REPARTITION_CHECK) mfxU8 m_RepartitionCheck; // DDI level ForceRepartitionCheck #endif #ifndef MFX_AVC_ENCODING_UNIT_DISABLE bool m_collectUnitsInfo; mutable std::vector m_headersCache[2]; //Headers for every field #endif mfxU32 m_TCBRCTargetFrameSize; mfxU32 m_SceneChange; #if defined(MFX_ENABLE_ENCTOOLS) mfxU16 m_SpatialComplexity; mfxU16 m_PersistenceMapNZ; mfxU8 m_PersistenceMap[128]; #endif #if defined(MFX_ENABLE_MCTF_IN_AVC) mfxU32 m_doMCTFIntraFiltering; #endif mfxU32 m_LowDelayPyramidLayer; mfxU32 m_frameLtrOff; mfxU32 m_frameLtrReassign; mfxI32 m_LtrOrder; mfxI32 m_LtrQp; mfxI32 m_RefOrder; mfxI32 m_RefQp; mfxU32 m_idxScd; #ifdef MFX_ENABLE_EXT CmEvent *m_wsSubSamplingEv; CmTask *m_wsSubSamplingTask; CmSurface2DUP *m_wsGpuImage; SurfaceIndex *m_wsIdxGpuImage; #endif mfxU8 *m_Yscd; BRCFrameParams m_brcFrameParams; mfxBRCFrameCtrl m_brcFrameCtrl; #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX unifiedQMatrixH264 m_qMatrix; // buffer for quantization matrix #endif #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) mfxU32 m_procBO[2]; mfxU32 m_scanBO[2]; mfxU8* m_nextMarkerPtr[2]; mfxU8 m_curNALtype; mfxFrameData m_bsPO[2]; #endif }; typedef std::list::iterator DdiTaskIter; typedef std::list::const_iterator DdiTaskCiter; template class Regression { public: static const mfxU32 MAX_WINDOW = N; Regression() { Zero(x); Zero(y); } void Reset(mfxU32 size, mfxF64 initX, mfxF64 initY) { windowSize = size; normX = initX; std::fill_n(x, windowSize, initX); std::fill_n(y, windowSize, initY); sumxx = initX * initX * windowSize; sumxy = initX * initY * windowSize; } void Add(mfxF64 newx, mfxF64 newy) { newy = newy / newx * normX; newx = normX; sumxy += newx * newy - x[0] * y[0]; sumxx += newx * newx - x[0] * x[0]; std::copy(x + 1, x + windowSize, x); std::copy(y + 1, y + windowSize, y); x[windowSize - 1] = newx; y[windowSize - 1] = newy; } mfxF64 GetCoeff() const { return sumxy / sumxx; } //protected: public: // temporary for debugging and dumping mfxF64 x[N]; mfxF64 y[N]; mfxU32 windowSize; mfxF64 normX; mfxF64 sumxy; mfxF64 sumxx; }; class BrcIface { public: virtual ~BrcIface() {}; virtual mfxStatus Init(MfxVideoParam & video) = 0; virtual mfxStatus Reset(MfxVideoParam & video) = 0; virtual void Close() = 0; virtual void PreEnc(const BRCFrameParams& par, std::vector const & vmeData) = 0; virtual void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) = 0; virtual void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) = 0; virtual mfxF32 GetFractionalQp(const BRCFrameParams& par) = 0; virtual void SetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) = 0; virtual mfxU32 Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl) = 0; virtual mfxU32 GetMinFrameSize() = 0; }; BrcIface * CreateBrc(MfxVideoParam const & video, MFX_ENCODE_CAPS const & hwCaps); class Brc : public BrcIface { public: Brc(BrcIface * impl = 0) { m_impl.reset(impl); } void SetImpl(BrcIface * impl) { m_impl.reset(impl); } ~Brc() { } mfxStatus Init(MfxVideoParam & video) { return m_impl->Init(video); } mfxStatus Reset(MfxVideoParam & video) { return m_impl->Reset(video); } void Close() { m_impl->Close(); } void PreEnc(const BRCFrameParams& par, std::vector const & vmeData) { m_impl->PreEnc(par, vmeData); } void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { m_impl->GetQp(par, frameCtrl); } void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { m_impl->GetQpForRecode(par, frameCtrl); } mfxF32 GetFractionalQp(const BRCFrameParams& par) { return m_impl->GetFractionalQp(par); } void SetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { m_impl->SetQp(par, frameCtrl); } mfxU32 Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl) { return m_impl->Report(par, userDataLength, maxFrameSize, frameCtrl); } mfxU32 GetMinFrameSize() { return m_impl->GetMinFrameSize(); } private: std::unique_ptr m_impl; }; class UmcBrc : public BrcIface { public: ~UmcBrc() { Close(); } mfxStatus Init(MfxVideoParam & video); mfxStatus Reset(MfxVideoParam & ) { return MFX_ERR_NONE; }; void Close(); void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); mfxF32 GetFractionalQp(const BRCFrameParams& par); void SetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); void PreEnc(const BRCFrameParams& par, std::vector const & vmeData); mfxU32 Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl); mfxU32 GetMinFrameSize(); private: UMC::H264BRC m_impl; mfxU32 m_lookAhead; }; class Hrd { public: Hrd(); void Setup(MfxVideoParam const & par); void Reset(MfxVideoParam const & par); void RemoveAccessUnit( mfxU32 size, mfxU32 interlace, mfxU32 bufferingPeriod); mfxU32 GetInitCpbRemovalDelay() const; mfxU32 GetInitCpbRemovalDelayOffset() const; mfxU32 GetMaxFrameSize(mfxU32 bufferingPeriod) const; private: mfxU32 m_bitrate; mfxU32 m_rcMethod; mfxU32 m_hrdIn90k; // size of hrd buffer in 90kHz units double m_tick; // clock tick double m_trn_cur; // nominal removal time double m_taf_prv; // final arrival time of prev unit bool m_bIsHrdRequired; }; struct sLAThresholds { mfxU32 minFramesForClassicLA; // number of frames is needed for classic LA, if lookAhead < minFramesForClassicLA -> short LA mfxU32 minFramesForStat; // number of frames at the start of stream which must be analyzed with fixed rate mfxU32 minCostCalcPeriod; // minimum number of frames to calulate cost. costCalcPeriod >= lookAhead, costCalcPeriod < rateCalcPeriod mfxF64 maxRateRatioLocal; // maximum allowed ratio = realRate/initialRate, real rate is calculated per costCalcPeriod mfxF64 minRateRatioLocal; // minimum allowed ratio = realRate/initialRate, real rate is calculated per costCalcPeriod mfxF64 maxAvgRateRatio; // maximum allowed ratio = avgRate/initialRate, avg rate is calculated per rateCalcPeriod mfxF64 minAvgRateRatio; // minimum allowed ratio = avgRate/initialRate, avg rate is calculated per rateCalcPeriod }; class LookAheadBrc2 : public BrcIface { public: ~LookAheadBrc2() { Close(); } mfxStatus Init (MfxVideoParam & video); mfxStatus Reset(MfxVideoParam & ) { return MFX_ERR_NONE; }; void Close(); void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); mfxF32 GetFractionalQp(const BRCFrameParams& ) { assert(0); return 26.0f; } void PreEnc(const BRCFrameParams& par, std::vector const & vmeData); mfxU32 Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl); mfxU32 GetMinFrameSize() { return 0; } void SetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); public: struct LaFrameData { mfxU32 encOrder; mfxI32 poc; mfxI32 deltaQp; mfxF64 estRate[52]; mfxF64 estRateTotal[52]; mfxU32 interCost; mfxU32 intraCost; mfxU32 propCost; mfxU32 bframe; }; protected: sLAThresholds m_thresholds; mfxU32 m_lookAhead; mfxU32 m_lookAheadDep; mfxU16 m_LaScaleFactor; mfxU32 m_strength; mfxU32 m_totNumMb; mfxF64 m_initTargetRate; mfxF64 m_currRate; mfxU32 m_framesBehind; mfxF64 m_bitsBehind; mfxI32 m_curBaseQp; mfxI32 m_curQp; mfxU16 m_qpUpdateRange; //mfxF32 m_coef; mfxF64 m_fr; mfxU16 m_AsyncDepth; mfxU16 m_first; mfxU16 m_skipped; mfxU8 m_QPMin[3]; // for I, P and B mfxU8 m_QPMax[3]; // for I, P and B mfxU32 m_MaxframeSize[3]; mfxU32 m_maxFrameSizeForRec; mfxU32 m_rateCalcPeriod; mfxU32 m_costCalcPeriod; AVGBitrate* m_AvgBitrate; //sliding window std::unique_ptr m_hrd; std::vector m_laData; std::vector m_laDataStat; Regression<20> m_rateCoeffHistory[52]; void ClearStat(mfxU32 frameOrder); void SaveStat(mfxU32 frameOrder); }; class LookAheadCrfBrc : public BrcIface { public: ~LookAheadCrfBrc() { Close(); } mfxStatus Init(MfxVideoParam & video); mfxStatus Reset(MfxVideoParam & ) {return MFX_ERR_NONE;}; void Close() {} void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl); mfxF32 GetFractionalQp(const BRCFrameParams& /*par*/) { assert(0); return 26.0f; } void SetQp(const BRCFrameParams& /*par*/, mfxBRCFrameCtrl & /*frameCtrl*/) { assert(0); } void PreEnc(const BRCFrameParams& par, std::vector const & vmeData); mfxU32 Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl); mfxU32 GetMinFrameSize() { return 0; } protected: mfxU32 m_lookAhead; mfxI32 m_crfQuality; mfxI32 m_curQp; mfxU32 m_totNumMb; mfxU32 m_intraCost; mfxU32 m_interCost; mfxU32 m_propCost; mfxU8 m_QPMin[3]; // for I, P and B mfxU8 m_QPMax[3]; // for I, P and B }; #if defined(MFX_ENABLE_EXT_BRC) class H264SWBRC : public BrcIface { public: H264SWBRC() : m_minSize(0) , m_pBRC(nullptr) , m_BRCLocal() { } virtual ~H264SWBRC() { Close(); } mfxStatus Init(MfxVideoParam &video) { mfxStatus sts = MFX_ERR_NONE; mfxExtBRC * extBRC = GetExtBuffer(video); if (extBRC->pthis) { m_pBRC = extBRC; } else { sts = HEVCExtBRC::Create(m_BRCLocal); m_pBRC = &m_BRCLocal; } sts = m_pBRC->Init(m_pBRC->pthis, &video); return sts; } void Close() { m_pBRC->Close(m_pBRC->pthis); HEVCExtBRC::Destroy(m_BRCLocal); } mfxStatus Reset(MfxVideoParam &video ) { return m_pBRC->Reset(m_pBRC->pthis,&video); } mfxU32 Report(const BRCFrameParams& par, mfxU32 /*userDataLength*/, mfxU32 /*maxFrameSize*/, mfxBRCFrameCtrl &frameCtrl) { mfxBRCFrameStatus frame_sts = {}; mfxBRCFrameParam frame_par = *((mfxBRCFrameParam*)&par); mfxStatus sts = m_pBRC->Update(m_pBRC->pthis,&frame_par, &frameCtrl, &frame_sts); MFX_CHECK(sts == MFX_ERR_NONE, (mfxU32)UMC::BRC_ERROR); // BRC_ERROR m_minSize = frame_sts.MinFrameSize; switch (frame_sts.BRCStatus) { case ::MFX_BRC_OK: return UMC::BRC_OK; case ::MFX_BRC_BIG_FRAME: return UMC::BRC_ERR_BIG_FRAME; case ::MFX_BRC_SMALL_FRAME: return UMC::BRC_ERR_SMALL_FRAME; case ::MFX_BRC_PANIC_BIG_FRAME: return UMC::BRC_ERR_BIG_FRAME | UMC::BRC_NOT_ENOUGH_BUFFER; case ::MFX_BRC_PANIC_SMALL_FRAME: return UMC::BRC_ERR_SMALL_FRAME| UMC::BRC_NOT_ENOUGH_BUFFER; } return MFX_BRC_OK; } void GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxBRCFrameParam frame_par = *((mfxBRCFrameParam*)&par); m_pBRC->GetFrameCtrl(m_pBRC->pthis,&frame_par, &frameCtrl); frameCtrl.QpY = (mfxU8)mfx::clamp(frameCtrl.QpY, 1, 51); } void GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { GetQp(par, frameCtrl); } void SetQp(const BRCFrameParams& /*par*/, mfxBRCFrameCtrl &/*frameCtrl*/) { } mfxU32 GetMinFrameSize() { return m_minSize; } mfxF32 GetFractionalQp(const BRCFrameParams& /*par*/) { assert(0); return 26.0f; } virtual void PreEnc(const BRCFrameParams& /*par*/, std::vector const & /* vmeData */) {} virtual bool IsVMEBRC() {return false;} private: mfxU32 m_minSize; mfxExtBRC * m_pBRC; mfxExtBRC m_BRCLocal; }; #endif #if defined(MFX_ENABLE_ENCTOOLS) constexpr mfxU32 ENCTOOLS_QUERY_TIMEOUT = 5000; inline bool IsNotDefined(mfxU16 param) { return (param == MFX_CODINGOPTION_UNKNOWN); } inline bool IsEncToolsOptOn(mfxExtEncToolsConfig &config) { return (IsOn(config.AdaptiveI) || IsOn(config.AdaptiveB) || IsOn(config.AdaptiveRefP) || IsOn(config.AdaptiveRefB) || IsOn(config.SceneChange) || IsOn(config.AdaptiveLTR) || IsOn(config.AdaptivePyramidQuantP) || IsOn(config.AdaptivePyramidQuantB) || IsOn(config.AdaptiveQuantMatrices) || IsOn(config.BRCBufferHints) || IsOn(config.BRC)); } inline void ResetEncToolsPar(mfxExtEncToolsConfig &config, mfxU16 value) { config.AdaptiveI = config.AdaptiveB = config.AdaptiveRefP = config.AdaptiveRefB = config.SceneChange = config.AdaptiveLTR = config.AdaptivePyramidQuantP = config.AdaptivePyramidQuantB = config.AdaptiveQuantMatrices = config.BRCBufferHints = config.BRC = value; } static mfxStatus InitCtrl(mfxVideoParam const & par, mfxEncToolsCtrl *ctrl) { MFX_CHECK_NULL_PTR1(ctrl); mfxExtCodingOption *CO = (mfxExtCodingOption *) mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION); mfxExtCodingOption2 *CO2 = (mfxExtCodingOption2 *)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); mfxExtCodingOption3 *CO3 = (mfxExtCodingOption3 *)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); MFX_CHECK_NULL_PTR3(CO, CO2, CO3); mfxExtCodingOptionDDI* extDdi = (mfxExtCodingOptionDDI*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_DDI); MFX_CHECK_NULL_PTR1(extDdi); ctrl->CodecId = par.mfx.CodecId; ctrl->CodecProfile = par.mfx.CodecProfile; ctrl->CodecLevel = par.mfx.CodecLevel; ctrl->LowPower = par.mfx.LowPower; ctrl->AsyncDepth = par.AsyncDepth; ctrl->FrameInfo = par.mfx.FrameInfo; ctrl->IOPattern = par.IOPattern; ctrl->MaxDelayInFrames = CO2->LookAheadDepth; ctrl->NumRefP = std::min(par.mfx.NumRefFrame, extDdi->NumActiveRefP); ctrl->MaxGopSize = par.mfx.GopPicSize; ctrl->MaxGopRefDist = par.mfx.GopRefDist; ctrl->MaxIDRDist = par.mfx.GopPicSize * (par.mfx.IdrInterval + 1); ctrl->BRefType = CO2->BRefType; ctrl->ScenarioInfo = CO3->ScenarioInfo; ctrl->GopOptFlag = (mfxU8)par.mfx.GopOptFlag; // Rate control info mfxU32 mult = par.mfx.BRCParamMultiplier ? par.mfx.BRCParamMultiplier : 1; bool BRC = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR); ctrl->RateControlMethod = par.mfx.RateControlMethod; //CBR, VBR, CRF,CQP if (!BRC) { ctrl->QPLevel[0] = par.mfx.QPI; ctrl->QPLevel[1] = par.mfx.QPP; ctrl->QPLevel[2] = par.mfx.QPB; } else { ctrl->TargetKbps = par.mfx.TargetKbps*mult; ctrl->MaxKbps = par.mfx.MaxKbps*mult; ctrl->HRDConformance = MFX_BRC_NO_HRD; if (!IsOff(CO->NalHrdConformance) && !IsOff(CO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_STRONG; else if (IsOn(CO->NalHrdConformance) && IsOff(CO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_WEAK; if (ctrl->HRDConformance) { ctrl->BufferSizeInKB = par.mfx.BufferSizeInKB*mult; //if HRDConformance is ON ctrl->InitialDelayInKB = par.mfx.InitialDelayInKB*mult; //if HRDConformance is ON } else { ctrl->ConvergencePeriod = 0; //if HRDConformance is OFF, 0 - the period is whole stream, ctrl->Accuracy = 10; //if HRDConformance is OFF } ctrl->WinBRCMaxAvgKbps = CO3->WinBRCMaxAvgKbps*mult; ctrl->WinBRCSize = CO3->WinBRCSize; ctrl->MaxFrameSizeInBytes[0] = CO3->MaxFrameSizeI ? CO3->MaxFrameSizeI : CO2->MaxFrameSize; // MaxFrameSize limitation ctrl->MaxFrameSizeInBytes[1] = CO3->MaxFrameSizeP ? CO3->MaxFrameSizeP : CO2->MaxFrameSize; ctrl->MaxFrameSizeInBytes[2] = CO2->MaxFrameSize; ctrl->MinQPLevel[0] = CO2->MinQPI; //QP range limitations ctrl->MinQPLevel[1] = CO2->MinQPP; ctrl->MinQPLevel[2] = CO2->MinQPB; ctrl->MaxQPLevel[0] = CO2->MaxQPI; //QP range limitations ctrl->MaxQPLevel[1] = CO2->MaxQPP; ctrl->MaxQPLevel[2] = CO2->MaxQPB; ctrl->PanicMode = CO3->BRCPanicMode; } if (ctrl->NumExtParam > 1) { ctrl->ExtParam[0] = mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_DEVICE); ctrl->ExtParam[1] = mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_ALLOCATOR); } // LaScale here ctrl->LaScale = 0; ctrl->LaQp = 30; if (ctrl->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; if (crW >= 720) ctrl->LaScale = 2; } else { mfxU16 crH = par.mfx.FrameInfo.CropH ? par.mfx.FrameInfo.CropH : par.mfx.FrameInfo.Height; mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; mfxU16 maxDim = std::max(crH, crW); mfxU16 minDim = std::min(crH, crW); constexpr mfxU16 LaScale = 2; if (maxDim >= 720 && minDim >= (128<LaScale = LaScale; } ctrl->LaQp = 26; } return MFX_ERR_NONE; } class H264EncTools { public: virtual ~H264EncTools() { Close(); } static bool isEncToolNeeded(MfxVideoParam &video) { mfxEncTools * encTools = GetExtBuffer(video); mfxExtEncToolsConfig *config = GetExtBuffer(video); if (!(encTools && encTools->Context) && (!config)) return false; mfxExtEncToolsConfig tmpConfig = {}; if (config) tmpConfig = *config; GetRequiredFunc(video, tmpConfig); return IsEncToolsOptOn(tmpConfig); } bool IsPreEncNeeded() { if (m_pEncTools ) { return (IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB) || IsOn(m_EncToolConfig.AdaptiveRefP) || IsOn(m_EncToolConfig.AdaptiveRefB) || IsOn(m_EncToolConfig.SceneChange) || IsOn(m_EncToolConfig.AdaptiveLTR) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB) || IsOn(m_EncToolConfig.BRCBufferHints) || IsOn(m_EncToolConfig.AdaptiveMBQP)); } return false; } inline bool IsAdaptiveQuantMatrices() { return (m_pEncTools != 0 && (IsOn(m_EncToolConfig.AdaptiveQuantMatrices))); } inline bool IsAdaptiveI() { return (m_pEncTools != 0 && (IsOn(m_EncToolConfig.AdaptiveI))); } inline bool IsAdaptiveGOP() { return (m_pEncTools != 0 && (IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB))); } inline bool IsAdaptiveQP() { return (m_pEncTools != 0 && (IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB))); } inline bool IsAdaptiveRef() { return (m_pEncTools != 0 && (IsOn(m_EncToolConfig.AdaptiveRefP) || IsOn(m_EncToolConfig.AdaptiveRefB))); } inline bool IsAdaptiveLTR() { return (m_pEncTools != 0 && IsOn(m_EncToolConfig.AdaptiveLTR)); } inline bool IsBRC() { return (m_pEncTools != 0 && IsOn(m_EncToolConfig.BRC)); } //GetPreEncDelay returns 0 if any error in EncTools configuration. static mfxU32 GetPreEncDelay(const MfxVideoParam &par) { MfxVideoParam video = par; if (!isEncToolNeeded(video)) return 0; bool bCreated = false; mfxEncTools *encTools = 0; mfxExtEncToolsConfig supportedConfig = {}; mfxExtEncToolsConfig requiredConfig = {}; mfxEncToolsCtrl ctrl = {}; mfxStatus sts = CreateEncTools(video, encTools, bCreated); if (MFX_FAILED(sts)) return 0; sts = InitCtrl(video, &ctrl); if (MFX_FAILED(sts)) return 0; encTools->GetSupportedConfig(encTools->Context, &supportedConfig,&ctrl); CorrectVideoParams(video, supportedConfig); GetRequiredFunc(video, requiredConfig); mfxU32 numFramesForDelay = 0; encTools->GetDelayInFrames(encTools->Context, &requiredConfig, &ctrl,&numFramesForDelay); if (bCreated) MFXVideoENCODE_DestroyEncTools(encTools); return numFramesForDelay; } static mfxStatus Query(MfxVideoParam &video) { mfxExtEncToolsConfig supportedConfig = {}; mfxExtEncToolsConfig requiredConfig = {}; mfxEncToolsCtrl ctrl = {}; mfxEncTools *encTools = 0; bool bCreated = false; mfxStatus sts = CreateEncTools(video, encTools, bCreated); MFX_CHECK_STS(sts); sts = InitCtrl(video, &ctrl); MFX_CHECK_STS(sts); encTools->GetSupportedConfig(encTools->Context, &supportedConfig,&ctrl); if (CorrectVideoParams(video, supportedConfig)) sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (bCreated) MFXVideoENCODE_DestroyEncTools(encTools); return sts; } mfxStatus Init(MfxVideoParam &video) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "class H264EncTools::Init"); mfxExtEncToolsConfig requiredConf = {}; mfxExtEncToolsConfig supportedConf = {}; #if defined(MFX_ENABLE_ENCTOOLS) #endif memset(&m_EncToolCtrl, 0, sizeof(mfxEncToolsCtrl)); m_EncToolCtrl.ExtParam = m_ExtParam; m_EncToolCtrl.NumExtParam = 2; #if defined(MFX_ENABLE_ENCTOOLS) #endif mfxStatus sts = InitCtrl(video, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = CreateEncTools(video, m_pEncTools, m_bEncToolsCreated); MFX_CHECK_STS(sts); #if defined(MFX_ENABLE_ENCTOOLS) #endif m_pEncTools->GetSupportedConfig(m_pEncTools->Context, &supportedConf, &m_EncToolCtrl); #if defined(MFX_ENABLE_ENCTOOLS) #endif if (CorrectVideoParams(video, supportedConf)) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); GetRequiredFunc(video, requiredConf); #if defined(MFX_ENABLE_ENCTOOLS) #endif sts = m_pEncTools->Init(m_pEncTools->Context, &requiredConf, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = m_pEncTools->GetActiveConfig(m_pEncTools->Context, &m_EncToolConfig); MFX_CHECK_STS(sts); mfxExtEncToolsConfig *pConfig = (mfxExtEncToolsConfig *)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if (pConfig) { mfxExtBuffer header = pConfig->Header; *pConfig = m_EncToolConfig; pConfig->Header = header; } m_LAHWBRC = IsEnctoolsLAGS(video); m_LASWBRC = IsEnctoolsLABRC(video); #if defined(MFX_ENABLE_ENCTOOLS) #endif return MFX_ERR_NONE; } void Discard(mfxU32 displayOrder) { if (m_pEncTools) m_pEncTools->Discard(m_pEncTools->Context, displayOrder); } void Close() { if (m_pEncTools) { m_pEncTools->Close(m_pEncTools->Context); } if (m_bEncToolsCreated) MFXVideoENCODE_DestroyEncTools(m_pEncTools); m_bEncToolsCreated = false; } mfxStatus Reset(MfxVideoParam &video) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); mfxEncToolsCtrl newCtrl = {}; mfxExtBuffer* ExtParam; mfxExtEncoderResetOption* pRO = (mfxExtEncoderResetOption*)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCODER_RESET_OPTION); if (pRO && pRO->StartNewSequence == MFX_CODINGOPTION_ON) { ExtParam = &(pRO->Header); newCtrl.NumExtParam = 1; newCtrl.ExtParam = &ExtParam; } mfxStatus sts = InitCtrl(video, &newCtrl); MFX_CHECK_STS(sts); sts = m_pEncTools->Reset(m_pEncTools->Context, &m_EncToolConfig, &newCtrl); MFX_CHECK_STS(sts); m_EncToolCtrl = newCtrl; return MFX_ERR_NONE; } mfxStatus SubmitForPreEnc(mfxU32 displayOrder, mfxFrameSurface1 *pSurface) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB) || IsOn(m_EncToolConfig.AdaptiveLTR) || IsOn(m_EncToolConfig.AdaptiveRefB) || IsOn(m_EncToolConfig.AdaptiveRefP) || IsOn(m_EncToolConfig.SceneChange) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptiveMBQP) || IsOn(m_EncToolConfig.BRCBufferHints) || IsOn(m_EncToolConfig.AdaptiveQuantMatrices) , MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = displayOrder; std::vector extParams; mfxEncToolsFrameToAnalyze extFrameData = {}; if (pSurface) { extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.Surface = pSurface; extParams.push_back((mfxExtBuffer *)&extFrameData); } par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Submit(m_pEncTools->Context, &par); } mfxStatus QueryPreEncRes(mfxU32 displayOrder, mfxEncToolsHintPreEncodeGOP &preEncodeGOP) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB) , MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = displayOrder; std::vector extParams; preEncodeGOP = {}; preEncodeGOP.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; preEncodeGOP.Header.BufferSz = sizeof(preEncodeGOP); extParams.push_back((mfxExtBuffer *)&preEncodeGOP); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); } mfxStatus QueryPreEncARef(mfxU32 displayOrder, mfxEncToolsHintPreEncodeARefFrames &preEncodeARef) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(IsOn(m_EncToolConfig.AdaptiveLTR)|| IsOn(m_EncToolConfig.AdaptiveRefB)|| IsOn(m_EncToolConfig.AdaptiveRefP), MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = displayOrder; std::vector extParams; preEncodeARef = {}; preEncodeARef.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_AREF; preEncodeARef.Header.BufferSz = sizeof(preEncodeARef); extParams.push_back((mfxExtBuffer *)&preEncodeARef); par.ExtParam = extParams.data(); par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); } mfxStatus QueryPreEncSChg(mfxU32 displayOrder, mfxEncToolsHintPreEncodeSceneChange &preEncodeSChg) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveLTR) || IsOn(m_EncToolConfig.BRC), MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = displayOrder; std::vector extParams; memset(&preEncodeSChg, 0, sizeof(preEncodeSChg)); preEncodeSChg.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE; preEncodeSChg.Header.BufferSz = sizeof(preEncodeSChg); extParams.push_back((mfxExtBuffer *)&preEncodeSChg); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); mfxStatus sts = MFX_ERR_NONE; sts = m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); return sts; } mfxStatus QueryLookAheadStatus(mfxU32 displayOrder, mfxEncToolsBRCBufferHint *bufHint, mfxEncToolsHintPreEncodeGOP *gopHint, mfxEncToolsHintQuantMatrix *cqmHint, mfxEncToolsHintQPMap* qpMapHint) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(bufHint || gopHint || cqmHint, MFX_ERR_NULL_PTR); MFX_CHECK(m_LASWBRC || (m_LAHWBRC && (IsOn(m_EncToolConfig.AdaptiveQuantMatrices) || IsOn(m_EncToolConfig.BRCBufferHints) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptiveMBQP))), MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = displayOrder; std::vector extParams; if (bufHint) { *bufHint = {}; bufHint->Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; bufHint->Header.BufferSz = sizeof(*bufHint); bufHint->OutputMode = mfxU16(m_LASWBRC ? MFX_BUFFERHINT_OUTPUT_DISPORDER : MFX_BUFFERHINT_OUTPUT_ENCORDER); extParams.push_back((mfxExtBuffer *)bufHint); } if (gopHint) { *gopHint = {}; gopHint->Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; gopHint->Header.BufferSz = sizeof(*gopHint); extParams.push_back((mfxExtBuffer *)gopHint); } if (cqmHint) { *cqmHint = {}; cqmHint->Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_MATRIX; cqmHint->Header.BufferSz = sizeof(*cqmHint); extParams.push_back((mfxExtBuffer *)cqmHint); } if (qpMapHint && m_LAHWBRC) { qpMapHint->Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP; qpMapHint->Header.BufferSz = sizeof(*qpMapHint); extParams.push_back((mfxExtBuffer*)qpMapHint); } par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); } mfxStatus SubmitFrameForEncoding(DdiTask &task) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; BRCFrameParams *frame_par = &task.m_brcFrameParams; par.DisplayOrder = frame_par->DisplayOrder; std::vector extParams; mfxEncToolsBRCFrameParams extFrameStruct = {}; mfxEncToolsBRCBufferHint extBRCHints = {}; mfxEncToolsHintPreEncodeGOP gopHints = {}; extFrameStruct.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM ; extFrameStruct.Header.BufferSz = sizeof(extFrameStruct); extFrameStruct.EncodeOrder = frame_par->EncodedOrder; extFrameStruct.FrameType = frame_par->FrameType; extFrameStruct.PyramidLayer = frame_par->PyramidLayer; extFrameStruct.LongTerm = frame_par->LongTerm; extFrameStruct.SceneChange = frame_par->SceneChange; extFrameStruct.SpatialComplexity = task.m_SpatialComplexity; extFrameStruct.PersistenceMapNZ = task.m_PersistenceMapNZ; if (task.m_PersistenceMapNZ) memcpy(extFrameStruct.PersistenceMap, task.m_PersistenceMap, sizeof(task.m_PersistenceMap)); extParams.push_back((mfxExtBuffer *)&extFrameStruct); if (frame_par->OptimalFrameSizeInBytes | frame_par->LaAvgEncodedSize) { extBRCHints.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; extBRCHints.Header.BufferSz = sizeof(extBRCHints); extBRCHints.OptimalFrameSizeInBytes = frame_par->OptimalFrameSizeInBytes; extBRCHints.AvgEncodedSizeInBits = frame_par->LaAvgEncodedSize; extBRCHints.CurEncodedSizeInBits = frame_par->LaCurEncodedSize; extBRCHints.DistToNextI = frame_par->LaIDist; extParams.push_back((mfxExtBuffer *)&extBRCHints); } if (task.m_bQPDelta || (task.m_QPmodulation != MFX_QP_MODULATION_NOT_DEFINED)) { gopHints.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; gopHints.Header.BufferSz = sizeof(gopHints); if (task.m_bQPDelta) gopHints.QPDelta = task.m_QPdelta; if (task.m_QPmodulation != MFX_QP_MODULATION_NOT_DEFINED) gopHints.QPModulation = task.m_QPmodulation; extParams.push_back((mfxExtBuffer *)&gopHints); } par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Submit(m_pEncTools->Context, &par); } mfxStatus GetFrameCtrl(mfxBRCFrameCtrl *frame_ctrl, mfxU32 dispOrder, mfxEncToolsHintQPMap* qpMapHint) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par = {}; par.DisplayOrder = dispOrder; std::vector extParams; mfxEncToolsBRCQuantControl extFrameQP = {}; extFrameQP.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL; extFrameQP.Header.BufferSz = sizeof(extFrameQP); extParams.push_back((mfxExtBuffer *)&extFrameQP); mfxEncToolsBRCHRDPos extHRDPos = {}; extHRDPos.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS; extHRDPos.Header.BufferSz = sizeof(extHRDPos); extParams.push_back((mfxExtBuffer *)&extHRDPos); if (qpMapHint) { qpMapHint->Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP; qpMapHint->Header.BufferSz = sizeof(*qpMapHint); extParams.push_back(&qpMapHint->Header); } par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); mfxStatus sts; sts = m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); MFX_CHECK_STS(sts); frame_ctrl->QpY = extFrameQP.QpY; frame_ctrl->MaxFrameSize = extFrameQP.MaxFrameSize; std::copy(extFrameQP.DeltaQP, extFrameQP.DeltaQP + 8, frame_ctrl->DeltaQP); frame_ctrl->MaxNumRepak = extFrameQP.NumDeltaQP; frame_ctrl->InitialCpbRemovalDelay = extHRDPos.InitialCpbRemovalDelay; frame_ctrl->InitialCpbRemovalOffset = extHRDPos.InitialCpbRemovalDelayOffset; return sts; } mfxStatus SubmitEncodeResult(mfxBRCFrameParam *frame_par, mfxU32 qpY) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par; par.DisplayOrder = frame_par->DisplayOrder; std::vector extParams; mfxEncToolsBRCEncodeResult extEncRes; extEncRes.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT; extEncRes.Header.BufferSz = sizeof(extEncRes); extEncRes.CodedFrameSize = frame_par->CodedFrameSize; extEncRes.QpY = (mfxU16)qpY; extEncRes.NumRecodesDone = frame_par->NumRecode; extParams.push_back((mfxExtBuffer *)&extEncRes); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); return m_pEncTools->Submit(m_pEncTools->Context, &par); } mfxStatus GetEncodeStatus(mfxBRCFrameStatus *frame_status, mfxU32 dispOrder) { MFX_CHECK(m_pEncTools != 0, MFX_ERR_NOT_INITIALIZED); mfxEncToolsTaskParam par; par.DisplayOrder = dispOrder; std::vector extParams; mfxEncToolsBRCStatus extSts; extSts.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_STATUS; extSts.Header.BufferSz = sizeof(extSts); extParams.push_back((mfxExtBuffer *)&extSts); par.ExtParam = &extParams[0]; par.NumExtParam = (mfxU16)extParams.size(); mfxStatus sts = m_pEncTools->Query(m_pEncTools->Context, &par, ENCTOOLS_QUERY_TIMEOUT); *frame_status = extSts.FrameStatus; return sts; } protected: static bool CheckSCConditions(MfxVideoParam &video) { return ((video.mfx.GopRefDist == 0 || video.mfx.GopRefDist == 1 || video.mfx.GopRefDist == 2 || video.mfx.GopRefDist == 4 || video.mfx.GopRefDist == 8) && (video.mfx.FrameInfo.PicStruct == 0 || video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && video.calcParam.numTemporalLayer == 0); } static bool isAdaptiveLTRAllowed(MfxVideoParam& video) { mfxExtCodingOption3& extOpt3 = GetExtBufferRef(video); mfxExtCodingOptionDDI& extDdi = GetExtBufferRef(video); return !(extDdi.NumActiveRefP == 1 || IsOff(extOpt3.ExtBrcAdaptiveLTR) || (video.mfx.GopOptFlag & MFX_GOP_STRICT)); } static bool isAdaptiveRefBAllowed(MfxVideoParam& video) { mfxExtCodingOptionDDI& extDdi = GetExtBufferRef(video); bool aRefAllowed = isAdaptiveLTRAllowed(video); return aRefAllowed && video.mfx.GopRefDist > 1 && extDdi.NumActiveRefBL0 != 1; } static void GetRequiredFunc(MfxVideoParam &video, mfxExtEncToolsConfig &config) { mfxExtCodingOption2 &extOpt2 = GetExtBufferRef(video); mfxExtCodingOption3 &extOpt3 = GetExtBufferRef(video); mfxExtEncToolsConfig *pConfig = (mfxExtEncToolsConfig *)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if (pConfig) config = *pConfig; if (extOpt3.ScenarioInfo != MFX_SCENARIO_GAME_STREAMING) { if (CheckSCConditions(video)) { bool bAdaptiveI = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && !IsOff(extOpt2.AdaptiveI); bool bHasB = video.mfx.GopRefDist > 1; bool bAdaptiveB = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && !IsOff(extOpt2.AdaptiveB) && bHasB; config.AdaptiveI = (mfxU16)(IsNotDefined(config.AdaptiveI) ? (bAdaptiveI ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveI); config.AdaptiveB = (mfxU16)(IsNotDefined(config.AdaptiveB) ? (bAdaptiveB ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveB); config.AdaptivePyramidQuantP = IsNotDefined(config.AdaptivePyramidQuantP) ? (!bHasB ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.AdaptivePyramidQuantP; config.AdaptivePyramidQuantB = IsNotDefined(config.AdaptivePyramidQuantB) ? (bHasB ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.AdaptivePyramidQuantB; bool bAdaptiveRef = isAdaptiveRefBAllowed(video); bool bAdaptiveLTR = isAdaptiveLTRAllowed(video); config.AdaptiveRefB = IsNotDefined(config.AdaptiveRefB) ? (bAdaptiveRef ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.AdaptiveRefB; config.AdaptiveRefP = IsNotDefined(config.AdaptiveRefP) ? (bAdaptiveLTR ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.AdaptiveRefP; config.AdaptiveLTR = IsNotDefined(config.AdaptiveLTR) ? (bAdaptiveLTR ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.AdaptiveLTR; } config.BRC = IsNotDefined(config.BRC) ? (((video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR) && extOpt3.ScenarioInfo != MFX_SCENARIO_REMOTE_GAMING) ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF) : config.BRC; bool lplaAssistedBRC = (config.BRC == MFX_CODINGOPTION_ON) && (extOpt2.LookAheadDepth > video.mfx.GopRefDist); config.BRCBufferHints = (mfxU16)(IsNotDefined(config.BRCBufferHints) ? (lplaAssistedBRC ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.BRCBufferHints); config.AdaptiveMBQP = (mfxU16)(IsNotDefined(config.AdaptiveMBQP) ? ((lplaAssistedBRC&& IsOn(extOpt2.MBBRC)) ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveMBQP); } #ifdef MFX_ENABLE_ENCTOOLS_LPLA if (extOpt3.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { bool bLA = (extOpt2.LookAheadDepth > 0 && (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); config.BRCBufferHints = (mfxU16)(IsNotDefined(config.BRCBufferHints) ? (bLA ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.BRCBufferHints); config.AdaptivePyramidQuantP = (mfxU16)(IsNotDefined(config.AdaptivePyramidQuantP) ? (bLA ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptivePyramidQuantP); config.AdaptiveQuantMatrices = (mfxU16)(IsNotDefined(config.AdaptiveQuantMatrices) ? (bLA ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveQuantMatrices); bool bAdaptiveI = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && IsOn(extOpt2.AdaptiveI); bool bAdaptiveB = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && IsOn(extOpt2.AdaptiveB); config.AdaptiveI = (mfxU16)(IsNotDefined(config.AdaptiveI) ? (bLA && bAdaptiveI ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveI); config.AdaptiveB = (mfxU16)(IsNotDefined(config.AdaptiveB) ? (bLA && bAdaptiveB ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF) : config.AdaptiveB); } #endif } static void CheckFlag(mfxU16 &tested, mfxU16 ref, mfxU32 &errCount) { if (IsOn(tested) && IsOff(ref)) { tested = MFX_CODINGOPTION_OFF; errCount++; } } static void CheckFlag(mfxU16 &tested, bool bAllowed, mfxU32 &errCount) { if (IsOn(tested) && (!bAllowed)) { tested = MFX_CODINGOPTION_OFF; errCount++; } } static mfxU32 CorrectVideoParams(MfxVideoParam &video, mfxExtEncToolsConfig& supportedConfig) { mfxExtCodingOption2 &extOpt2 = GetExtBufferRef(video); mfxExtCodingOption3 &extOpt3 = GetExtBufferRef(video); mfxExtBRC *extBRC = GetExtBuffer(video); mfxU32 numChanges = 0; mfxExtEncToolsConfig *pConfig = (mfxExtEncToolsConfig *)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if (pConfig) { bool bEncToolsCnd = ((video.mfx.FrameInfo.PicStruct == 0 || video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && video.calcParam.numTemporalLayer == 0); bool bAdaptiveI = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && !IsOff(extOpt2.AdaptiveI); bool bHasB = video.mfx.GopRefDist > 1; bool bAdaptiveB = !(video.mfx.GopOptFlag & MFX_GOP_STRICT) && !IsOff(extOpt2.AdaptiveB) && bHasB; bool bAdaptiveRef = isAdaptiveRefBAllowed(video); bool bAdaptiveLTR = isAdaptiveLTRAllowed(video); CheckFlag(pConfig->AdaptiveI, bEncToolsCnd && bAdaptiveI, numChanges); CheckFlag(pConfig->AdaptiveB, bEncToolsCnd && bAdaptiveB, numChanges); CheckFlag(pConfig->AdaptivePyramidQuantB, bEncToolsCnd && bHasB, numChanges); CheckFlag(pConfig->AdaptivePyramidQuantP, bEncToolsCnd && !bHasB, numChanges); CheckFlag(pConfig->AdaptiveRefP, bEncToolsCnd && bAdaptiveLTR, numChanges); CheckFlag(pConfig->AdaptiveRefB, bEncToolsCnd && bAdaptiveRef, numChanges); CheckFlag(pConfig->AdaptiveLTR, bEncToolsCnd && bAdaptiveLTR, numChanges); CheckFlag(pConfig->SceneChange, bEncToolsCnd, numChanges); CheckFlag(pConfig->BRCBufferHints, bEncToolsCnd, numChanges); CheckFlag(pConfig->AdaptiveQuantMatrices, bEncToolsCnd, numChanges); CheckFlag(pConfig->BRC, bEncToolsCnd, numChanges); CheckFlag(pConfig->AdaptiveI, supportedConfig.AdaptiveI, numChanges); CheckFlag(pConfig->AdaptiveB, supportedConfig.AdaptiveB, numChanges); CheckFlag(pConfig->AdaptivePyramidQuantB, supportedConfig.AdaptivePyramidQuantB, numChanges); CheckFlag(pConfig->AdaptivePyramidQuantP, supportedConfig.AdaptivePyramidQuantP, numChanges); CheckFlag(pConfig->AdaptiveRefP, supportedConfig.AdaptiveRefP, numChanges); CheckFlag(pConfig->AdaptiveRefB, supportedConfig.AdaptiveRefB, numChanges); CheckFlag(pConfig->AdaptiveLTR, supportedConfig.AdaptiveLTR, numChanges); CheckFlag(pConfig->SceneChange, supportedConfig.SceneChange, numChanges); CheckFlag(pConfig->BRCBufferHints, supportedConfig.BRCBufferHints, numChanges); CheckFlag(pConfig->AdaptiveQuantMatrices, supportedConfig.AdaptiveQuantMatrices, numChanges); CheckFlag(pConfig->BRC, supportedConfig.BRC, numChanges); CheckFlag(extOpt2.ExtBRC, pConfig->BRC, numChanges); } CheckFlag(extOpt2.AdaptiveI, supportedConfig.AdaptiveI, numChanges); CheckFlag(extOpt2.AdaptiveB, supportedConfig.AdaptiveB, numChanges); CheckFlag(extOpt3.ExtBrcAdaptiveLTR, supportedConfig.AdaptiveLTR, numChanges); CheckFlag(extOpt2.ExtBRC, supportedConfig.BRC, numChanges); CheckFlag(extOpt2.MBBRC, supportedConfig.AdaptiveMBQP, numChanges); //ExtBRC isn't compatible with EncTools if (extBRC && (extBRC->pthis || extBRC->Init || extBRC->Close || extBRC->Update || extBRC->Reset)) { extBRC->pthis = 0; extBRC->Init = 0; extBRC->Close = 0; extBRC->Update = 0; extBRC->Reset = 0; numChanges++; } if (IsOn(extOpt2.ExtBRC) && (extOpt3.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING)) { extOpt2.ExtBRC = MFX_CODINGOPTION_UNKNOWN; numChanges++; } return numChanges; } static mfxStatus CreateEncTools(MfxVideoParam &video, mfxEncTools * &encTools, bool &bCreated) { encTools = GetExtBuffer(video); bCreated = false; if (!(encTools && encTools->Context)) { encTools = MFXVideoENCODE_CreateEncTools(video); MFX_CHECK(encTools != 0, MFX_ERR_INVALID_VIDEO_PARAM); bCreated = true; } return MFX_ERR_NONE; } public: inline bool isLASWBRC() { return m_LASWBRC; } inline bool isLAHWBRC() { return m_LAHWBRC; } #if defined(MFX_ENABLE_ENCTOOLS) #endif private: mfxEncTools* m_pEncTools = nullptr; bool m_bEncToolsCreated = false; mfxEncToolsCtrl m_EncToolCtrl = {}; mfxExtEncToolsConfig m_EncToolConfig = {}; mfxExtBuffer* m_ExtParam[2] = {}; bool m_LASWBRC = false; bool m_LAHWBRC = false; #if defined(MFX_ENABLE_ENCTOOLS) #endif }; #endif struct MBQPAllocFrameInfo : mfxFrameAllocRequest { mfxU32 width; mfxU32 height; mfxU32 pitch; mfxU32 height_aligned; mfxU32 block_width; mfxU32 block_height; }; class DdiTask2ndField { public: DdiTask2ndField() : m_1stFieldTask(nullptr) , m_2ndFieldTask() {} DdiTask * m_1stFieldTask; DdiTask m_2ndFieldTask; }; // should be called from one thread // yields tasks in cyclic manner class CyclicTaskPool { public: void Init(mfxU32 size); DdiTask2ndField * GetFreeTask(); private: std::vector m_pool; std::vector::iterator m_next; }; struct MbData { mfxU32 intraCost; mfxU32 interCost; mfxU32 propCost; mfxU8 w0; mfxU8 w1; mfxU16 dist; mfxU16 rate; mfxU16 lumaCoeffSum[4]; mfxU8 lumaCoeffCnt[4]; mfxI16Pair costCenter0; mfxI16Pair costCenter1; struct { mfxU32 intraMbFlag : 1; mfxU32 skipMbFlag : 1; mfxU32 mbType : 5; mfxU32 reserved0 : 1; mfxU32 subMbShape : 8; mfxU32 subMbPredMode : 8; mfxU32 reserved1 : 8; }; mfxI16Pair mv[2]; // in sig-sag scan }; class CmContext; struct VmeData { VmeData() : used(false) , poc(mfxU32(-1)) , pocL0(mfxU32(-1)) , pocL1(mfxU32(-1)) , encOrder(0) , intraCost(0) , interCost(0) , propCost(0) { } bool used; mfxU32 poc; mfxU32 pocL0; mfxU32 pocL1; mfxU32 encOrder; mfxU32 intraCost; mfxU32 interCost; mfxU32 propCost; std::vector mb; }; class AsyncRoutineEmulator { public: enum { STG_ACCEPT_FRAME, STG_START_SCD, STG_WAIT_SCD, STG_START_MCTF, STG_WAIT_MCTF, STG_START_LA, STG_WAIT_LA, #ifdef MFX_ENABLE_FADE_DETECTION STG_START_HIST, STG_WAIT_HIST, #endif STG_START_ENCODE, STG_WAIT_ENCODE, STG_COUNT }; enum { STG_BIT_CALL_EMULATOR = 0, STG_BIT_ACCEPT_FRAME = 1 << STG_ACCEPT_FRAME, STG_BIT_START_SCD = 1 << STG_START_SCD, STG_BIT_WAIT_SCD = 1 << STG_WAIT_SCD, STG_BIT_START_MCTF = 1 << STG_START_MCTF, STG_BIT_WAIT_MCTF = 1 << STG_WAIT_MCTF, STG_BIT_START_LA = 1 << STG_START_LA, STG_BIT_WAIT_LA = 1 << STG_WAIT_LA, #ifdef MFX_ENABLE_FADE_DETECTION STG_BIT_START_HIST = 1 << STG_START_HIST, STG_BIT_WAIT_HIST = 1 << STG_WAIT_HIST, #endif STG_BIT_START_ENCODE = 1 << STG_START_ENCODE, STG_BIT_WAIT_ENCODE = 1 << STG_WAIT_ENCODE, STG_BIT_RESTART = 1 << STG_COUNT }; AsyncRoutineEmulator(); AsyncRoutineEmulator(MfxVideoParam const & video, mfxU32 adaptGopDelay, eMFXHWType platform); void Init(MfxVideoParam const & video, mfxU32 adaptGopDelay, eMFXHWType platform); mfxU32 GetTotalGreediness() const; mfxU32 GetStageGreediness(mfxU32 i) const; mfxU32 Go(bool hasInput); protected: mfxU32 CheckStageOutput(mfxU32 stage); private: mfxU32 m_stageGreediness[STG_COUNT]; mfxU32 m_queueFullness[STG_COUNT + 1]; mfxU32 m_queueFlush[STG_COUNT + 1]; }; struct LAOutObject; struct QpHistory { QpHistory() { Reset(); } void Reset() { std::fill_n(history, HIST_SIZE, mfxU8(52)); } void Add(mfxU32 qp); mfxU8 GetAverageQp() const; private: static const mfxU32 HIST_SIZE = 16; mfxU8 history[HIST_SIZE]; }; class ImplementationAvc : public VideoENCODE { public: static mfxStatus Query( VideoCORE * core, mfxVideoParam * in, mfxVideoParam * out, void * state = 0); static mfxStatus QueryIOSurf( VideoCORE * core, mfxVideoParam * par, mfxFrameAllocRequest * request); ImplementationAvc(VideoCORE * core); virtual ~ImplementationAvc(); virtual mfxStatus Init(mfxVideoParam * par); virtual mfxStatus Close() { return MFX_ERR_NONE; } virtual mfxStatus Reset(mfxVideoParam * par); virtual mfxStatus GetVideoParam(mfxVideoParam * par); virtual mfxStatus GetFrameParam(mfxFrameParam * par); virtual mfxStatus GetEncodeStat(mfxEncodeStat * stat); virtual mfxTaskThreadingPolicy GetThreadingPolicy() { return mfxTaskThreadingPolicy(MFX_TASK_THREADING_INTRA #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) | (m_isPOut ? MFX_TASK_POLLING : 0) #endif ); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl *, mfxFrameSurface1 *, mfxBitstream *, mfxFrameSurface1 **, mfxEncodeInternalParams *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT * entryPoints, mfxU32 & numEntryPoints); virtual mfxStatus EncodeFrameCheckNormalWay( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT * entryPoints, mfxU32 & numEntryPoints); virtual mfxStatus EncodeFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus CancelFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } protected: #if defined(MFX_ENABLE_MCTF_IN_AVC) std::unique_ptr m_mctfDenoiser; // m_hvsDenoiser is the replacement for m_mctfDenoiser // due to HW change, and reuse the Init, Query, Submit // functions. std::unique_ptr m_hvsDenoiser; mfxStatus SubmitToMctf( DdiTask * pTask ); mfxStatus QueryFromMctf( void *pParam ); mfxStatus InitMctf(const mfxVideoParam* const par); #endif mfxStatus InitScd(mfxFrameAllocRequest& request); #ifdef MFX_ENABLE_ASC ns_asc::ASC_Cm amtScd; #else ns_asc::ASC amtScd; #endif mfxStatus SCD_Put_Frame_Cm( DdiTask & newTask); mfxStatus SCD_Put_Frame_Hw( DdiTask& newTask); mfxStatus SCD_Get_FrameType( DdiTask & newTask); mfxStatus CalculateFrameCmplx( DdiTask const &task, mfxU32 &raca128); mfxStatus Prd_LTR_Operation( DdiTask & task); void AssignFrameTypes( DdiTask & newTask); mfxStatus BuildPPyr( DdiTask & task, mfxU32 pyrWidth, bool bLastFrameUsing, bool bResetPyr); void setFrameInfo(DdiTask & task, mfxU32 fid); void setEncUnitsInfo(DdiTask& task, mfxU32 fid); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) void addPartialOutputOffset(DdiTask & task, mfxU64 offset, bool last = false); #endif mfxStatus UpdateBitstream( DdiTask & task, mfxU32 fid); // 0 - top/progressive, 1 - bottom #ifndef MFX_AVC_ENCODING_UNIT_DISABLE void FillEncodingUnitsInfo( DdiTask &task, mfxU8 *sbegin, mfxU8 *send, mfxExtEncodedUnitsInfo *encUnitsInfo, mfxU32 fid); #endif mfxStatus AsyncRoutine( mfxBitstream * bs); mfxStatus CheckSliceSize(DdiTask &task, bool &bToRecode); mfxStatus CheckBufferSize(DdiTask &task, bool &bToRecode, mfxU32 bsDataLength, mfxBitstream * bs); mfxStatus CheckBRCStatus(DdiTask &task, bool &bToRecode, mfxU32 bsDataLength); #ifdef MFX_ENABLE_ENCTOOLS mfxStatus EncToolsGetFrameCtrl(DdiTask& task); #endif mfxStatus FillPreEncParams(DdiTask &task); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) mfxStatus NextBitstreamDataLength( mfxBitstream * bs); #endif void OnNewFrame(); void SubmitScd(); void OnScdQueried(); void OnScdFinished(); void SubmitMCTF(); void OnMctfQueried(); void OnMctfFinished(); void OnLookaheadSubmitted(DdiTaskIter task); void OnLookaheadQueried(); #ifdef MFX_ENABLE_FADE_DETECTION void OnHistogramSubmitted(); void OnHistogramQueried(); #endif void OnEncodingSubmitted(DdiTaskIter task); void OnEncodingQueried(DdiTaskIter task); void BrcPreEnc(DdiTask const & task); static mfxStatus AsyncRoutineHelper( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus UpdateBitstreamData( void * state, void * param); #ifdef MFX_ENABLE_EXT void SubmitLookahead( DdiTask & task); mfxStatus QueryLookahead( DdiTask & task); #endif mfxStatus QueryStatus( DdiTask & task, mfxU32 ffid, bool useEvent = true); mfxStatus MiniGopSize( mfxEncodeCtrl** ctrl, mfxFrameSurface1** surface, mfxU16* requiredFrameType); mfxStatus MiniGopSize1( mfxEncodeCtrl** ctrl, mfxFrameSurface1** surface, mfxU16* requiredFrameType); mfxStatus ProcessAndCheckNewParameters( MfxVideoParam & newPar, bool & isBRCReset, bool & isIdrRequired, mfxVideoParam const * newParIn = 0); #ifdef MFX_ENABLE_EXT void DestroyDanglingCmResources(); CmDevicePtr m_cmDevice; #endif VideoCORE * m_core; MfxVideoParam m_video; MfxVideoParam m_videoInit; // m_video may change by Reset, m_videoInit doesn't change mfxEncodeStat m_stat; bool m_isD3D9SimWithVideoMem; std::list > m_listOfPairsForFieldOutputMode; AsyncRoutineEmulator m_emulatorForSyncPart; AsyncRoutineEmulator m_emulatorForAsyncPart; SliceDivider m_sliceDivider; std::list m_free; std::list m_incoming; std::list m_ScDetectionStarted; std::list m_ScDetectionFinished; std::list m_MctfStarted; std::list m_MctfFinished; std::list m_reordering; std::list m_lookaheadStarted; std::list m_lookaheadFinished; std::list m_histRun; std::list m_histWait; std::list m_encoding; UMC::Mutex m_listMutex; DdiTask m_lastTask; mfxU32 m_stagesToGo; mfxU32 m_bDeferredFrame; mfxU32 m_fieldCounter; mfxStatus m_1stFieldStatus; mfxU32 m_frameOrder; mfxU32 m_baseLayerOrder; mfxU32 m_frameOrderIdrInDisplayOrder; // frame order of last IDR frame (in display order) mfxU32 m_frameOrderIntraInDisplayOrder; // frame order of last I frame (in display order) mfxU32 m_frameOrderIPInDisplayOrder; // frame order of last I or P frame (in display order) mfxU32 m_frameOrderPyrStart; // frame order of the first frame of pyramid mfxU32 m_miniGopCount; mfxU32 m_frameOrderStartTScalStructure; // starting point of temporal scalability structure // parameters for Intra refresh mfxI64 m_baseLayerOrderStartIntraRefresh; // starting point of Intra refresh cycles (could be negative) mfxU16 m_intraStripeWidthInMBs; // width of Intra MB stripe (column or row depending on refresh type) mfxU32 m_enabledSwBrc; Brc m_brc; Hrd m_hrd; #if defined(MFX_ENABLE_ENCTOOLS) H264EncTools m_encTools; bool m_enabledEncTools; #if defined(MFX_ENABLE_ENCTOOLS_LPLA) std::list m_lpLaStatus; #endif #endif mfxU32 m_maxBsSize; std::unique_ptr m_ddi; std::unique_ptr m_vppHelperScaling; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) QpHistory m_qpHistory; #endif std::vector m_recFrameOrder; mfxU32 m_recNonRef[2]; #if defined(MFX_ENABLE_MCTF_IN_AVC) MfxFrameAllocResponse m_mctf; #endif MfxFrameAllocResponse m_scd; MfxFrameAllocResponse m_raw; MfxFrameAllocResponse m_rawSkip; MfxFrameAllocResponse m_rawLa; MfxFrameAllocResponse m_mb; MfxFrameAllocResponse m_curbe; MfxFrameAllocResponse m_rawSys; MfxFrameAllocResponse m_rec; MfxFrameAllocResponse m_bit; #ifdef MFX_ENABLE_FADE_DETECTION MfxFrameAllocResponse m_histogram; #endif MFX_ENCODE_CAPS m_caps; mfxStatus m_failedStatus; mfxU32 m_inputFrameType; mfxU32 m_NumSlices; MBQPAllocFrameInfo m_mbqpInfo; MfxFrameAllocResponse m_mbqp; bool m_useMBQPSurf; MfxFrameAllocResponse m_mbControl; bool m_useMbControlSurfs; std::vector m_tmpBsBuf; PreAllocatedVector m_sei; eMFXHWType m_currentPlatform; eMFXVAType m_currentVaType; bool m_isENCPAK; bool m_resetBRC; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) bool m_isPOut; int m_modePOut; mfxU32 m_blockPOut; std::mutex m_offsetMutex; std::unordered_map> m_offsetsMap; #endif #ifdef MFX_ENABLE_EXT std::unique_ptr m_cmCtx; #endif std::vector m_vmeDataStorage; std::vector m_tmpVmeData; mfxU32 m_LowDelayPyramidLayer; mfxI32 m_LtrQp; mfxI32 m_LtrOrder; mfxI32 m_RefQp; mfxI32 m_RefOrder; #ifdef MFX_ENABLE_ENCODE_STATS bool m_frameLevelQueryEn; bool m_blockLevelQueryEn; #endif }; struct NalUnit { NalUnit() : begin(0), end(0), type(0), numZero(0) {} NalUnit(mfxU8 * b, mfxU8 * e, mfxU8 t, mfxU8 z) : begin(b), end(e), type(t), numZero(z) {} mfxU8 * begin; mfxU8 * end; mfxU8 type; mfxU32 numZero; }; NalUnit GetNalUnit(mfxU8 * begin, mfxU8 * end); class NaluIterator { public: NaluIterator() : m_begin(0) , m_end(0) {} NaluIterator(mfxU8 * begin, mfxU8 * end) : m_nalu(GetNalUnit(begin, end)) , m_begin(m_nalu.end) , m_end(end) { } NaluIterator(NalUnit const & nalu, mfxU8 * end) : m_nalu(nalu) , m_begin(nalu.end) , m_end(end) { } NalUnit & operator *() { return m_nalu; } NalUnit * operator ->() { return &m_nalu; } NaluIterator & operator++() { m_nalu = GetNalUnit(m_begin, m_end); m_begin = m_nalu.end; return *this; } NaluIterator operator++(int) { NaluIterator tmp; ++*this; return tmp; } bool operator ==(NaluIterator const & right) const { return m_nalu.begin == right.m_nalu.begin && m_nalu.end == right.m_nalu.end; } bool operator !=(NaluIterator const & right) const { return !(*this == right); } private: NalUnit m_nalu; mfxU8 * m_begin; mfxU8 * m_end; }; struct BitstreamDesc { BitstreamDesc() : begin(0), end(0) {} mfxU8 * begin; mfxU8 * end; NalUnit aud; // byte range within [begin, end) NalUnit sps; // byte range within [begin, end) NalUnit pps; // byte range within [begin, end) NalUnit sei; // first sei if multi sei nal units present NalUnit slice; // first slice if multi-sliced }; #ifdef MFX_ENABLE_MVC_VIDEO_ENCODE class ImplementationMvc : public VideoENCODE { public: static mfxStatus Query( VideoCORE * core, mfxVideoParam * in, mfxVideoParam * out); static mfxStatus QueryIOSurf( VideoCORE * core, mfxVideoParam * par, mfxFrameAllocRequest * request); ImplementationMvc( VideoCORE * core); // MVC BD { void GetInitialHrdState( MvcTask & task, mfxU32 viewIdx); void PatchTask( MvcTask const & mvcTask,\ DdiTask & curTask, mfxU32 fieldId); // MVC BD } virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus Close(); virtual mfxTaskThreadingPolicy GetThreadingPolicy(); virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus GetFrameParam(mfxFrameParam *par); virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat); virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl *, mfxFrameSurface1 *, mfxBitstream *, mfxFrameSurface1 **, mfxEncodeInternalParams *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 & numEntryPoints); virtual mfxStatus EncodeFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus CancelFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } protected: ImplementationMvc(ImplementationMvc const &); ImplementationMvc & operator =(ImplementationMvc const &); static mfxStatus TaskRoutineDoNothing( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus TaskRoutineSubmit( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); // MVC BD { static mfxStatus TaskRoutineSubmitOneView( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus TaskRoutineQueryOneView( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); // MVC BD } static mfxStatus TaskRoutineQuery( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); mfxStatus UpdateBitstream( MvcTask & task, mfxU32 fieldId); // 0 - top/progressive, 1 - bottom // MVC BD { mfxStatus UpdateBitstreamBaseView( DdiTask & task, mfxU32 fieldId); // 0 - top/progressive, 1 - bottom mfxStatus UpdateBitstreamDepView( DdiTask & task, mfxU32 fieldId); // 0 - top/progressive, 1 - bottom // w/a for SNB/IVB: calculate size of padding to compensate re-pack of AVC headers to MVC mfxU32 CalcPaddingToCompensateRepack( DdiTask & task, mfxU32 fieldId); mfxStatus CopyRawSurface(DdiTask const & task); mfxMemId GetRawSurfaceMemId(DdiTask const & task); mfxStatus GetRawSurfaceHandle(DdiTask const & task, mfxHDLPair & hdl); // MVC BD } VideoCORE * m_core; MfxVideoParam m_video; MfxVideoParam m_videoInit; // m_video may change by Reset, m_videoInit doesn't change TaskManagerMvc m_taskMan; MFX_ENCODE_CAPS m_ddiCaps; bool m_isD3D9SimWithVideoMem; std::vector m_hrd; // MVC BD { std::unique_ptr m_ddi[2]; mfxU8 m_numEncs; MfxFrameAllocResponse m_raw[2]; MfxFrameAllocResponse m_bitstream[2]; MfxFrameAllocResponse m_recon[2]; // w/a for SNB/IVB: m_spsSubsetSpsDiff is used to calculate padding size for compensation of re-pack AVC headers to MVC mfxU32 m_spsSubsetSpsDiff; // MVC BD } PreAllocatedVector m_sei; std::vector m_sysMemBits; std::vector m_bitsDesc; eMFXHWType m_currentPlatform; // MVC BD { std::vector m_submittedPicStructs[2]; // MVC BD } mfxU32 m_inputFrameType; #ifdef MFX_ENABLE_MVC_ADD_REF mfxI32 m_bufferSizeModifier; // required to obey HRD conformance after 'dummy' run in ViewOutput mode #endif // MFX_ENABLE_MVC_ADD_REF }; #endif // #ifdef MFX_ENABLE_MVC_VIDEO_ENCODE class InputBitstream { public: InputBitstream( mfxU8 const * buf, size_t size, bool hasStartCode = true, bool doEmulationControl = true); InputBitstream( mfxU8 const * buf, mfxU8 const * bufEnd, bool hasStartCode = true, bool doEmulationControl = true); mfxU32 NumBitsRead() const; mfxU32 NumBitsLeft() const; mfxU32 GetBit(); mfxU32 GetBits(mfxU32 nbits); mfxU32 GetUe(); mfxI32 GetSe(); private: mfxU8 const * m_buf; mfxU8 const * m_ptr; mfxU8 const * m_bufEnd; mfxU32 m_bitOff; bool m_doEmulationControl; }; class OutputBitstream { public: OutputBitstream(mfxU8 * buf, size_t size, bool emulationControl = true); OutputBitstream(mfxU8 * buf, mfxU8 * bufEnd, bool emulationControl = true); mfxU32 GetNumBits() const; void PutBit(mfxU32 bit); void PutBits(mfxU32 val, mfxU32 nbits); void PutUe(mfxU32 val); void PutSe(mfxI32 val); void PutRawBytes(mfxU8 const * begin, mfxU8 const * end); // startcode emulation is not controlled void PutFillerBytes(mfxU8 filler, mfxU32 nbytes); // startcode emulation is not controlled void PutTrailingBits(); private: mfxU8 * m_buf; mfxU8 * m_ptr; mfxU8 * m_bufEnd; mfxU32 m_bitOff; bool m_emulationControl; }; class CabacPackerSimple : public OutputBitstream { public: CabacPackerSimple(mfxU8 * buf, mfxU8 * bufEnd, bool emulationControl = true); void EncodeBin(mfxU8 * ctx, mfxU8 bin); void TerminateEncode(); private: void PutBitC(mfxU32 B); void RenormE(); mfxU32 m_codILow; mfxU32 m_codIRange; mfxU32 m_bitsOutstanding; mfxU32 m_BinCountsInNALunits; bool m_firstBitFlag; }; void PutSeiHeader( OutputBitstream & bs, mfxU32 payloadType, mfxU32 payloadSize); void PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiBufferingPeriod const & msg); void PutSeiMessage( OutputBitstream & bs, mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg); void PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiDecRefPicMrkRep const & msg); void PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiRecPoint const & msg); mfxU32 PutScalableInfoSeiMessage( OutputBitstream & obs, MfxVideoParam const & par); // MVC BD { // Put MVC scalable nested SEI void PutSeiMessage( OutputBitstream & bs, mfxU32 needBufferingPeriod, mfxU32 needPicTimingSei, mfxU32 fillerSize, MfxVideoParam const & video, mfxExtAvcSeiBufferingPeriod const & msg_bp, mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg_pt); // MVC BD } mfxU8 const * SkipStartCode(mfxU8 const * begin, mfxU8 const * end); mfxU8 * SkipStartCode(mfxU8 * begin, mfxU8 * end); ArrayRefListMod CreateRefListMod( ArrayDpbFrame const & dpb, std::vector const & recons, ArrayU8x33 initList, ArrayU8x33 const & modList, mfxU32 curViewIdx, mfxI32 curPicNum, bool optimize = true); mfxU8 * CheckedMFX_INTERNAL_CPY( mfxU8 * dbegin, mfxU8 * dend, mfxU8 const * sbegin, mfxU8 const * send); mfxU8 * CheckedMemset( mfxU8 * dbegin, mfxU8 * dend, mfxU8 value, mfxU32 size); void ReadRefPicListModification(InputBitstream & reader); void ReadDecRefPicMarking( InputBitstream & reader, bool idrPicFlag); void WriteRefPicListModification( OutputBitstream & writer, ArrayRefListMod const & refListMod); void WriteDecRefPicMarking( OutputBitstream & writer, DecRefPicMarkingInfo const & marking, bool idrPicFlag); mfxU8 * RePackSlice( mfxU8 * dbegin, mfxU8 * dend, mfxU8 * sbegin, mfxU8 * send, MfxVideoParam const & par, DdiTask const & task, mfxU32 fieldId); enum { RPLM_ST_PICNUM_SUB = 0, RPLM_ST_PICNUM_ADD = 1, RPLM_LT_PICNUM = 2, RPLM_END = 3, RPLM_INTERVIEW_SUB = 4, RPLM_INTERVIEW_ADD = 5, }; enum { MMCO_END = 0, MMCO_ST_TO_UNUSED = 1, MMCO_LT_TO_UNUSED = 2, MMCO_ST_TO_LT = 3, MMCO_SET_MAX_LT_IDX = 4, MMCO_ALL_TO_UNUSED = 5, MMCO_CURR_TO_LT = 6, }; void PrepareSeiMessageBuffer( MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, // 0 - top/progressive, 1 - bottom PreAllocatedVector & sei, mfxU16 recovery_frame_cnt = 0); void PrepareSeiMessageBufferDepView( MfxVideoParam const & video, #ifdef MFX_ENABLE_AVC_BS DdiTask & task, #else // MFX_ENABLE_AVC_BS DdiTask const & task, #endif // MFX_ENABLE_AVC_BS mfxU32 fieldId, // 0 - top/progressive, 1 - bottom PreAllocatedVector & sei); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE class SvcTask : public Surface { public: SvcTask() : m_layerNum(0) { } void Allocate(mfxU32 layerNum) { m_layer.reset(new DdiTask *[layerNum]); m_layerNum = layerNum; } mfxU32 LayerNum() const { return m_layerNum; } DdiTask *& operator [](mfxU32 i) { assert(i < m_layerNum); assert(m_layer.cptr()); return m_layer[i]; } DdiTask * const & operator [](mfxU32 i) const { assert(i < m_layerNum); assert(m_layer.cptr()); return m_layer[i]; } private: ScopedArray m_layer; mfxU32 m_layerNum; }; class TaskManagerSvc { public: TaskManagerSvc(); ~TaskManagerSvc(); void Init( VideoCORE * core, MfxVideoParam const & video); void Reset(MfxVideoParam const & video); // w/o re-allocation void Close(); mfxStatus AssignTask( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, SvcTask *& newTask); void CompleteTask(SvcTask & task); const mfxEncodeStat & GetEncodeStat() const { return m_stat; } private: mfxStatus AssignAndConfirmAvcTask( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxU32 layerId); TaskManagerSvc(TaskManagerSvc const &); TaskManagerSvc & operator =(TaskManagerSvc const &); VideoCORE * m_core; MfxVideoParam const * m_video; UMC::Mutex m_mutex; ScopedArray m_layer; mfxU32 m_layerNum; std::vector > m_dqid; ScopedArray m_task; mfxU32 m_taskNum; SvcTask * m_currentTask; mfxU32 m_currentLayerId; mfxEncodeStat m_stat; }; typedef CompleteTaskOnExit CompleteTaskOnExitSvc; class ImplementationSvc : public VideoENCODE { public: static mfxStatus Query( VideoCORE * core, mfxVideoParam * in, mfxVideoParam * out); static mfxStatus QueryIOSurf( VideoCORE * core, mfxVideoParam * par, mfxFrameAllocRequest * request); ImplementationSvc(VideoCORE * core); virtual ~ImplementationSvc(); virtual mfxStatus Init(mfxVideoParam * par); virtual mfxStatus Close() { return MFX_ERR_NONE; } virtual mfxStatus Reset(mfxVideoParam * par); virtual mfxStatus GetVideoParam(mfxVideoParam * par); virtual mfxStatus GetFrameParam(mfxFrameParam * par); virtual mfxStatus GetEncodeStat(mfxEncodeStat * stat); virtual mfxTaskThreadingPolicy GetThreadingPolicy() { return MFX_TASK_THREADING_INTRA; } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl *, mfxFrameSurface1 *, mfxBitstream *, mfxFrameSurface1 **, mfxEncodeInternalParams *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT * entryPoints, mfxU32 & numEntryPoints); virtual mfxStatus EncodeFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus CancelFrame( mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } protected: mfxStatus AssignTask( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, SvcTask ** newTask); mfxStatus CopyRawSurface( DdiTask const & task); mfxHDLPair GetRawSurfaceHandle( DdiTask const & task); mfxStatus UpdateBitstream( SvcTask & task, mfxU32 fieldId); // 0 - top/progressive, 1 - bottom void PrepareSeiMessageBuffer( DdiTask const & task, mfxU32 fieldId, // 0 - top/progressive, 1 - bottom PreAllocatedVector & sei); static mfxStatus TaskRoutineDoNothing( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus TaskRoutineSubmit( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus TaskRoutineQuery( void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); mfxStatus UpdateDeviceStatus(mfxStatus sts); mfxStatus CheckDevice(); private: VideoCORE * m_core; MfxVideoParam m_video; MfxVideoParam m_videoInit; // m_video may change by Reset, m_videoInit doesn't change Hrd m_hrd; std::unique_ptr m_ddi; GUID m_guid; TaskManagerSvc m_manager; mfxU32 m_maxBsSize; MfxFrameAllocResponse m_raw; MfxFrameAllocResponse m_recon; MfxFrameAllocResponse m_bitstream; ENCODE_MBDATA_LAYOUT m_layout; MFX_ENCODE_CAPS m_caps; bool m_deviceFailed; mfxU32 m_inputFrameType; PreAllocatedVector m_sei; std::vector m_tmpBsBuf; std::vector m_scalabilityInfo; }; #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE bool IsInplacePatchNeeded( MfxVideoParam const & par, DdiTask const & task, mfxU32 fieldId); bool IsSlicePatchNeeded( DdiTask const & task, mfxU32 fieldId); mfxStatus CopyBitstream( VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, mfxU8 * bsData, mfxU32 bsSizeAvail); mfxU32 GetMaxSliceSize( mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU32 &num); mfxStatus UpdateSliceInfo( mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU32 maxSliceSize, DdiTask& task, bool& bRecoding); mfxU8 * PatchBitstream( MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend); mfxU8 * InsertSVCNAL( DdiTask const & task, mfxU32 fieldId, mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend); mfxU8 * AddEmulationPreventionAndCopy( mfxU8 * sbegin, mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend); mfxStatus FillSliceInfo( DdiTask & task, mfxU32 MaxSliceSize, mfxU32 FrameSize, mfxU32 widthLa, mfxU32 heightLa); mfxStatus CorrectSliceInfo( DdiTask & task, mfxU32 sliceWeight, mfxU32 widthLa, mfxU32 heightLa); mfxStatus CorrectSliceInfoForsed( DdiTask & task, mfxU32 widthLa, mfxU32 heightLa); mfxU32 CalcBiWeight( DdiTask const & task, mfxU32 indexL0, mfxU32 indexL1); mfxI32 GetPicNum( ArrayDpbFrame const & dpb, mfxU8 ref); mfxI32 GetPicNumF( ArrayDpbFrame const & dpb, mfxU8 ref); mfxU8 GetLongTermPicNum( ArrayDpbFrame const & dpb, mfxU8 ref); mfxU32 GetLongTermPicNumF( ArrayDpbFrame const & dpb, mfxU8 ref); mfxI32 GetPoc( ArrayDpbFrame const & dpb, mfxU8 ref); DdiTaskIter ReorderFrame( ArrayDpbFrame const & dpb, DdiTaskIter begin, DdiTaskIter end); DdiTaskIter ReorderFrame( ArrayDpbFrame const & dpb, DdiTaskIter begin, DdiTaskIter end, bool gopStrict, bool flush, bool closeGopForSceneChange); DdiTaskIter FindFrameToStartEncode( MfxVideoParam const & video, DdiTaskIter begin, DdiTaskIter end); DdiTaskIter FindFrameToWaitEncode( DdiTaskIter begin, DdiTaskIter end); DdiTaskIter FindFrameToWaitEncodeNext( DdiTaskIter begin, DdiTaskIter end, DdiTaskIter cur); PairU8 GetFrameType( MfxVideoParam const & video, mfxU32 frameOrder); IntraRefreshState GetIntraRefreshState( MfxVideoParam const & video, mfxU32 frameOrderInGop, mfxEncodeCtrl const * ctrl, mfxU16 intraStripeWidthInMBs, SliceDivider & divider, MFX_ENCODE_CAPS caps); mfxStatus UpdateIntraRefreshWithoutIDR( MfxVideoParam const & oldPar, MfxVideoParam const & newPar, mfxU32 frameOrder, mfxI64 oldStartFrame, mfxI64 & updatedStartFrame, mfxU16 & updatedStripeWidthInMBs, SliceDivider & divider, MFX_ENCODE_CAPS caps); BiFrameLocation GetBiFrameLocation( MfxVideoParam const & video, mfxU32 frameOrder, mfxU32 currGopRefDist, mfxU32 miniGOPCount); void UpdateDpbFrames( DdiTask & task, mfxU32 field, mfxU32 frameNumMax); void InitRefPicList( DdiTask & task, mfxU32 field); void ModifyRefPicLists( MfxVideoParam const & video, DdiTask & task, mfxU32 fieldId); void MarkDecodedRefPictures( MfxVideoParam const & video, DdiTask & task, mfxU32 fid); ArrayRefListMod CreateRefListMod( ArrayDpbFrame const & dpb, ArrayU8x33 initList, ArrayU8x33 const & modList, mfxU32 curViewIdx, mfxI32 curPicNum, bool optimize); void ConfigureTask( DdiTask & task, DdiTask const & prevTask, MfxVideoParam const & video, MFX_ENCODE_CAPS const & caps); mfxStatus GetNativeHandleToRawSurface( VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, mfxHDLPair & handle, bool isD3D9SimWithVideoMem); bool IsFrameToSkip(DdiTask& task, MfxFrameAllocResponse & poolRec, std::vector fo, bool bSWBRC); mfxStatus CodeAsSkipFrame( VideoCORE& core, MfxVideoParam const & video, DdiTask& task, MfxFrameAllocResponse & pool, MfxFrameAllocResponse & poolRec); mfxStatus CopyRawSurfaceToVideoMemory( VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, bool isD3D9SimWithVideoMem); mfxHDL GetNativeHandle( VideoCORE & core, mfxFrameSurface1& surf, bool external = false); void AnalyzeVmeData( DdiTaskIter begin, DdiTaskIter end, mfxU32 width, mfxU32 height); void CalcPredWeightTable( DdiTask & task, mfxU32 MaxNum_WeightedPredL0, mfxU32 MaxNum_WeightedPredL1); struct FindByFrameOrder { FindByFrameOrder(mfxU32 frameOrder) : m_frameOrder(frameOrder) {} template bool operator ()(T const & task) const { return task.m_frameOrder == m_frameOrder; } mfxU32 m_frameOrder; }; bool OrderByFrameNumWrap(DpbFrame const & lhs, DpbFrame const & rhs); bool OrderByFrameNumWrapKeyRef(DpbFrame const & lhs, DpbFrame const & rhs); template typename T::pointer find_if_ptr(T & container, P pred) { typename T::iterator i = std::find_if(container.begin(), container.end(), pred); return (i == container.end()) ? 0 : &*i; } template typename T::pointer find_if_ptr2(T & container1, T & container2, P pred) { typename T::pointer p = find_if_ptr(container1, pred); if (p == 0) p = find_if_ptr(container2, pred); return p; } template typename T::pointer find_if_ptr3(T & container1, T & container2, T & container3, P pred) { typename T::pointer p = find_if_ptr(container1, pred); if (p == 0) p = find_if_ptr(container2, pred); if (p == 0) p = find_if_ptr(container3, pred); return p; } template typename T::pointer find_if_ptr4(T & container1, T & container2, T & container3, T & container4, P pred) { typename T::pointer p = find_if_ptr(container1, pred); if (p == 0) p = find_if_ptr(container2, pred); if (p == 0) p = find_if_ptr(container3, pred); if (p == 0) p = find_if_ptr(container4, pred); return p; } #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX /// Function reads array[inSize] to array[outSize][outSize] in ZigZag order. /// Function reads array[inSize] to array[outSize][outSize] in ZigZag order. /// 1 2 3 1 2 6 /// 4 5 6 -> 3 5 7 /// 7 8 9 4 8 9 /// /// Pointer for the input array, has to be non-NULL /// Size of input array, works only with quad arrays. For example, inSize for matrix 4x4 is 16 /// Pointer for the output array, has to be non-NULL /// Size of output buffer, has to be not less than multiplied dimensions of input matrix. For example, outSize for matrix 4x4 has to be greater than or equal to 4x4 template void MakeZigZag(void const * const inPtr, const size_t inSize, void * const outPtr, const size_t outSize) { T const * const in = static_cast(inPtr); T * const out = static_cast(outPtr); assert(inPtr != NULL); assert(outPtr != NULL); assert((inSize * inSize) <= outSize); (void)outSize; uint64_t y = 0, x = 0; for (uint64_t i = 0, pos = 0, size = inSize * inSize; i < inSize; ++i) { if (y <= x) { y = i; x = 0; for (; x <= i; --y, ++x, ++pos) { out[y*inSize + x] = in[(pos / inSize)*inSize + pos % inSize]; out[(inSize - y - 1)*inSize + inSize - x - 1] = in[((size - pos - 1) / inSize)*inSize + (size - pos - 1) % inSize]; } } else { x = i; y = 0; for (; y <= i; --x, ++y, ++pos) { out[y*inSize + x] = in[(pos / inSize)*inSize + pos % inSize]; out[(inSize - y - 1)*inSize + inSize - x - 1] = in[((size - pos - 1) / inSize)*inSize + (size - pos - 1) % inSize]; } } } } /// Function reads array[inSize][inSize] in ZigZag order to array[outSize]. /// Function reads T array[inSize][inSize] in ZigZag order into T array[outSize]. /// 1 2 6 1 2 3 /// 3 5 7 -> 4 5 6 /// 4 8 9 7 8 9 /// /// Pointer for the input array, has to be non-NULL /// Size of input array, works only with quad arrays. For example, inSize for matrix 4x4 is 4 /// Pointer for the output array, has to be non-NULL /// Size of output buffer, has to be not less than inSize*inSize. For example, outSize for matrix 4x4 has to be greater than or equal to 16 template void ZigZagToPlane(void const * const inPtr, const size_t inSize, void * const outPtr, const size_t outSize) { T const * const in = static_cast(inPtr); T * const out = static_cast(outPtr); assert(inPtr != NULL); assert(outPtr != NULL); assert((inSize * inSize) <= outSize); (void)outSize; uint64_t y = 0, x = 0; for (uint64_t i = 0, pos = 0, size = inSize * inSize; i < inSize; ++i) { if (y <= x) { y = i; x = 0; for (; x <= i; --y, ++x, ++pos) { out[(pos / inSize)*inSize + pos % inSize] = in[y*inSize + x]; out[((size - pos - 1) / inSize)*inSize + (size - pos - 1) % inSize] = in[(inSize - y - 1)*inSize + inSize - x - 1]; } } else { x = i; y = 0; for (; y <= i; --x, ++y, ++pos) { out[(pos / inSize)*inSize + pos % inSize] = in[y*inSize + x]; out[((size - pos - 1) / inSize)*inSize + (size - pos - 1) % inSize] = in[(inSize - y - 1)*inSize + inSize - x - 1]; } } } } ///Function fills custom quantization matrices into inMatrix, writes in ZigZag orde ///Fills matrices depends on selected ScenarioInfo (CodingOption3) ///MFX_ERR_NONE if matrices were copied, MFX_ERR_NOT_FOUND if requested ScenarioInfo isn't supported mfxStatus FillCustomScalingLists(void *inMatrix, mfxU16 ScenarioInfo, mfxU8 maxtrixIndex = 0); ///Function fills default values of scaling list ///Pointer to the output list ///Size of output list, has to be not less than 16 for indexes 0..5, and not less than 64 for 6..11 ///Index of scaling list according Table 7-2 Rec. ITU-T H.264, has to be in range 0..11 ///Flag, if set to true, output values will be ordered in zigzag order, default - false ///MFX_ERR_NONE if default values were copied, MFX_ERR_NOT_FOUND if index not in range 0..11 mfxStatus GetDefaultScalingList(mfxU8 *outList, mfxU8 outListSize, mfxU8 index, bool zigzag); ///Function fills qMatrix for task based on values provided in extSps and extPps ///Function expects value of extSps.seqScalingMatrixPresentFlag and value of extPps.picScalingMatrixPresentFlag ///were verified before call. Otherwise default scaling lists will be used, but it won't be expected behavior ///SPS header with defined (or not defined) scaling lists ///PPS header with defined (or not defined) scaling lists ///DDI task for the filling scaling lists for current frame void FillTaskScalingList(mfxExtSpsHeader const &extSps, mfxExtPpsHeader const &extPps, DdiTask &task); #endif }; // namespace MfxHwH264Encode #endif // _MFX_H264_ENCODE_HW_UTILS_H_ #endif // MFX_ENABLE_H264_VIDEO_ENCODE mfx_h264_encode_interface.h000066400000000000000000000112141443134507600334010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #ifndef __MFX_H264_ENCODE_INTERFACE__H #define __MFX_H264_ENCODE_INTERFACE__H #include #include #include "mfxdefs.h" #include "mfxvideo++int.h" #include "mfx_h264_enc_common_hw.h" #include "mfx_h264_encode_struct_vaapi.h" namespace MfxHwH264Encode { class PreAllocatedVector { public: PreAllocatedVector() : m_size(0) { } void Alloc(mfxU32 capacity) { m_storage.resize(capacity); m_size = 0; } void SetSize(mfxU32 size) { assert(size <= m_storage.size()); m_size = size; } mfxU32 Size() const { return m_size; } mfxU32 Capacity() const { return (mfxU32)m_storage.size(); } mfxU8 * Buffer() { assert(m_storage.size() > 0); return &m_storage[0]; } mfxU8 const * Buffer() const { assert(m_storage.size() > 0); return &m_storage[0]; } private: std::vector m_storage; mfxU32 m_size; }; class DriverEncoder { public: virtual ~DriverEncoder(){} virtual mfxStatus CreateAuxilliaryDevice( VideoCORE * core, GUID guid, mfxU32 width, mfxU32 height, bool isTemporal = false) = 0; virtual mfxStatus CreateAccelerationService( MfxVideoParam const & par) = 0; virtual mfxStatus Reset( MfxVideoParam const & par) = 0; virtual mfxStatus Register( mfxFrameAllocResponse & response, D3DDDIFORMAT type) = 0; virtual mfxStatus Execute( mfxHDLPair pair, DdiTask const & task, mfxU32 fieldId, PreAllocatedVector const & sei) = 0; virtual mfxStatus QueryCompBufferInfo( D3DDDIFORMAT type, mfxFrameAllocRequest & request) = 0; virtual mfxStatus QueryEncodeCaps( MFX_ENCODE_CAPS & caps) = 0; virtual mfxStatus QueryMbPerSec( mfxVideoParam const & par, mfxU32 (&mbPerSec)[16]) = 0; virtual mfxStatus QueryStatus( DdiTask & task, mfxU32 fieldId, bool useEvent = true) = 0; virtual mfxStatus Destroy() = 0; virtual void ForceCodingFunction (mfxU16 codingFunction) = 0; virtual mfxStatus QueryHWGUID( VideoCORE * core, GUID guid, bool isTemporal) = 0; virtual mfxStatus QueryEncCtrlCaps( ENCODE_ENC_CTRL_CAPS & /*caps*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); }; virtual mfxStatus GetEncCtrlCaps( ENCODE_ENC_CTRL_CAPS & /*caps*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); }; virtual mfxStatus SetEncCtrlCaps( ENCODE_ENC_CTRL_CAPS const & /*caps*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); }; }; DriverEncoder* CreatePlatformH264Encoder( VideoCORE* core ); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE DriverEncoder* CreatePlatformSvcEncoder( VideoCORE* core ); #endif }; // namespace #endif // __MFX_H264_ENCODE_INTERFACE__H #endif // #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) mfx_h264_encode_struct_vaapi.h000066400000000000000000001047371443134507600341620ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //#include "mfx_common.h" #ifndef __MFX_H264_ENCODE_STRUCT_VAAPI__H #define __MFX_H264_ENCODE_STRUCT_VAAPI__H #include "mfx_common.h" #include "mfx_platform_headers.h" #define D3DDDIFMT_INTELENCODE_BITSTREAMDATA (D3DDDIFORMAT)164 // D3DDDIFMT_DXVA_RESERVED14 #define D3DDDIFMT_INTELENCODE_MBDATA (D3DDDIFORMAT)165 // D3DDDIFMT_DXVA_RESERVED15 #define D3DDDIFMT_INTELENCODE_MBSEGMENTMAP (D3DDDIFORMAT)181 typedef struct tagENCODE_COMP_BUFFER_INFO { D3DFORMAT Type; D3DFORMAT CompressedFormats; USHORT CreationWidth; USHORT CreationHeight; UCHAR NumBuffer; UCHAR AllocationType; } ENCODE_COMP_BUFFER_INFO; typedef enum tagENCODE_FUNC { ENCODE_ENC = 0x0001, ENCODE_PAK = 0x0002, ENCODE_ENC_PAK = 0x0004, } ENCODE_FUNC; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define frame encoding type /////////////////////////////////////////////////////////////////////////////// enum { CODING_TYPE_I = 1, CODING_TYPE_P = 2, CODING_TYPE_B = 3, }; enum { SLICE_TYPE_P = 0, SLICE_TYPE_B = 1, SLICE_TYPE_I = 2 }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define Intra MB mode /////////////////////////////////////////////////////////////////////////////// enum //for IntraMbMode Field { INTRA_MB_MODE_16x16 = 0, INTRA_MB_MODE_8x8 = 1, INTRA_MB_MODE_4x4 = 2, INTRA_MB_MODE_IPCM = 3, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define Intra MB Type /////////////////////////////////////////////////////////////////////////////// enum //Intra MbType { MBTYPE_I_4x4 = 0, MBTYPE_I_8x8 = 0, MBTYPE_I_16x16_000 = 1, MBTYPE_I_16x16_100 = 2, MBTYPE_I_16x16_200 = 3, MBTYPE_I_16x16_300 = 4, MBTYPE_I_16x16_010 = 5, MBTYPE_I_16x16_110 = 6, MBTYPE_I_16x16_210 = 7, MBTYPE_I_16x16_310 = 8, MBTYPE_I_16x16_020 = 0, MBTYPE_I_16x16_120 = 0xA, MBTYPE_I_16x16_220 = 0xB, MBTYPE_I_16x16_320 = 0xC, MBTYPE_I_16x16_001 = 0xD, MBTYPE_I_16x16_101 = 0xE, MBTYPE_I_16x16_201 = 0xF, MBTYPE_I_16x16_301 = 0x10, MBTYPE_I_16x16_011 = 0x11, MBTYPE_I_16x16_111 = 0x12, MBTYPE_I_16x16_211 = 0x13, MBTYPE_I_16x16_311 = 0x14, MBTYPE_I_16x16_021 = 0x15, MBTYPE_I_16x16_121 = 0x16, MBTYPE_I_16x16_221 = 0x17, MBTYPE_I_16x16_321 = 0x18, MBTYPE_I_IPCM = 0x19, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define Inter MB Type /////////////////////////////////////////////////////////////////////////////// enum //Inter MbType { MBTYPE_BP_L0_16x16 = 1, MBTYPE_B_L1_16x16 = 2, MBTYPE_B_Bi_16x16 = 3, MBTYPE_BP_L0_L0_16x8 = 4, MBTYPE_BP_L0_L0_8x16 = 5, MBTYPE_B_L1_L1_16x8 = 6, MBTYPE_B_L1_L1_8x16 = 7, MBTYPE_B_L0_L1_16x8 = 8, MBTYPE_B_L0_L1_8x16 = 9, MBTYPE_B_L1_L0_16x8 = 0xA, MBTYPE_B_L1_L0_8x16 = 0xB, MBTYPE_B_L0_Bi_16x8 = 0xC, MBTYPE_B_L0_Bi_8x16 = 0xD, MBTYPE_B_L1_Bi_16x8 = 0xE, MBTYPE_B_L1_Bi_8x16 = 0xF, MBTYPE_B_Bi_L0_16x8 = 0x10, MBTYPE_B_Bi_L0_8x16 = 0x11, MBTYPE_B_Bi_L1_16x8 = 0x12, MBTYPE_B_Bi_L1_8x16 = 0x13, MBTYPE_B_Bi_Bi_16x8 = 0x14, MBTYPE_B_Bi_Bi_8x16 = 0x15, MBTYPE_BP_8x8 = 0x16, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define MB Type for MPEG2 /////////////////////////////////////////////////////////////////////////////// enum { MBTYPE_I = 0x1A, MBTYPE_P_FWD_SKIP = 0x01, MBTYPE_B_BWD_SKIP = 0x02, MBTYPE_B_Bi_SKIP = 0x03, MBTYPE_P_0MV = 0x01, MBTYPE_P_FRM_FRM = 0x01, MBTYPE_P_FRM_FLD = 0x04, MBTYPE_P_FRM_DUALPRIME = 0x19, MBTYPE_P_FLD_1_16x16 = 0x01, MBTYPE_P_FLD_2_16x8 = 0x04, MBTYPE_P_FLD_DUALPRIME = 0x19, MBTYPE_B_FRM_FRM_FWD = 0x01, MBTYPE_B_FRM_FRM_BWD = 0x02, MBTYPE_B_FRM_FRM_Bi = 0x03, MBTYPE_B_FRM_FLD_FWD = 0x04, MBTYPE_B_FRM_FLD_BWD = 0x03, MBTYPE_B_FRM_FLD_Bi = 0x14, MBTYPE_B_FLD_1_16x16_FWD = 0x01, MBTYPE_B_FLD_1_16x16_BWD = 0x02, MBTYPE_B_FLD_1_16x16_Bi = 0x03, MBTYPE_B_FLD_2_16x8_FWD = 0x04, MBTYPE_B_FLD_2_16x8_BWD = 0x06, MBTYPE_B_FLD_2_16x8_Bi = 0x14, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define Inter MB block size /////////////////////////////////////////////////////////////////////////////// enum { INTER_MB_MODE_16x16 = 0, INTER_MB_MODE_16x8 = 1, INTER_MB_MODE_8x16 = 2, INTER_MB_MODE_8x8 = 3, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define inter MB sub partition shape in a 8x8 block /////////////////////////////////////////////////////////////////////////////// enum { SUB_MB_SHAPE_8x8 = 0, SUB_MB_SHAPE_8x4 = 1, SUB_MB_SHAPE_4x8 = 2, SUB_MB_SHAPE_4x4 = 3, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the Inter MB prediction type /////////////////////////////////////////////////////////////////////////////// enum { SUB_MB_PRED_MODE_L0 = 0, SUB_MB_PRED_MODE_L1 = 1, SUB_MB_PRED_MODE_Bi = 2, }; //////////////////////////////////////////////////////////////////////////////// // this structure is used to define the control structure for VME. // in Linux this structure is a proxy between MediaSDK and libVA /////////////////////////////////////////////////////////////////////////////// typedef struct tagENCODE_CAPS { union { struct { UINT CodingLimitSet : 1; UINT NoFieldFrame : 1; UINT NoCabacSupport : 1; UINT NoGapInFrameCount : 1; UINT NoGapInPicOrder : 1; UINT NoUnpairedField : 1; UINT BitDepth8Only : 1; UINT ConsecutiveMBs : 1; UINT SliceStructure : 3; UINT SliceIPOnly : 1; UINT SliceIPBOnly : 1; UINT NoWeightedPred : 1; UINT NoMinorMVs : 1; UINT ClosedGopOnly : 1; UINT NoFrameCropping : 1; UINT FrameLevelRateCtrl : 1; UINT HeaderInsertion : 1; UINT RawReconRefToggle : 1; // doesn't shpport change reference frame (original vs. recon) at a per frame basis. UINT NoPAFF : 1; // doesn't support change frame/field coding at per frame basis. UINT NoInterlacedField : 1; UINT BRCReset : 1; UINT EnhancedEncInput : 1; UINT RollingIntraRefresh : 1; UINT UserMaxFrameSizeSupport : 1; UINT LayerLevelRateCtrl : 1; UINT SliceLevelRateCtrl : 1; UINT VCMBitrateControl : 1; UINT NoESS : 1; UINT Color420Only : 1; UINT ICQBRCSupport : 1; }; UINT CodingLimits; }; union { struct { USHORT EncFunc : 1; USHORT PakFunc : 1; USHORT EncodeFunc : 1; // Enc+Pak USHORT InputAnalysisFunc : 1; // Reserved for now USHORT reserved :12; }; USHORT CodingFunction; }; UINT vaTrellisQuantization; UINT vaRollingIntraRefresh; UINT vaBufferMaxFrameSize; UINT MaxPicWidth; UINT MaxPicHeight; UCHAR MaxNum_Reference; UCHAR MaxNum_SPS_id; UCHAR MaxNum_PPS_id; UCHAR MaxNum_Reference1; UCHAR MaxNum_QualityLayer; UCHAR MaxNum_DependencyLayer; UCHAR MaxNum_DQLayer; UCHAR MaxNum_TemporalLayer; UCHAR MBBRCSupport; UCHAR TrelisQuantization; union { struct { UCHAR MaxNumOfROI : 5; // [0..16] UCHAR : 1; UCHAR ROIBRCPriorityLevelSupport : 1; UCHAR ROIBRCDeltaQPLevelSupport : 1; }; UCHAR ROICaps; }; union { struct { UINT RoundingOffset : 1; UINT SkipFrame : 1; UINT MbQpDataSupport : 1; UINT SliceLevelWeightedPred : 1; UINT LumaWeightedPred : 1; UINT ChromaWeightedPred : 1; UINT QVBRBRCSupport : 1; UINT SliceLevelReportSupport : 1; UINT HMEOffsetSupport : 1; UINT DirtyRectSupport : 1; UINT MoveRectSupport : 1; UINT FrameSizeToleranceSupport : 1; // eFrameSizeTolerance_Low (Sliding window) supported UINT HWCounterAutoIncrement : 2; UINT MBControlSupport : 1; UINT ForceRepartitionCheckSupport : 1; UINT CustomRoundingControl : 1; UINT LLCStreamingBufferSupport : 1; UINT DDRStreamingBufferSupport : 1; UINT LowDelayBRCSupport : 1; // eFrameSizeTolerance_ExtremelyLow (Low delay) supported UINT MaxNumDeltaQPMinus1 : 4; UINT TCBRCSupport : 1; UINT HRDConformanceSupport : 1; UINT PollingModeSupport : 1; UINT LookaheadBRCSupport : 1; UINT QpAdjustmentSupport : 1; UINT : 3; }; UINT CodingLimits2; }; UCHAR MaxNum_WeightedPredL0; UCHAR MaxNum_WeightedPredL1; } ENCODE_CAPS; // We cannot modify ENCODE_CAPS structure, but need to add new features struct MFX_ENCODE_CAPS { ENCODE_CAPS ddi_caps; //bitrate control capabilities provided by MSDK bool CQPSupport; bool CBRSupport; bool VBRSupport; bool AVBRSupport; bool AdaptiveMaxFrameSizeSupport; }; // this enumeration is used to define the block size for intra prediction. they // are used as bit flags to control what block size will be checked for intra // prediction. /////////////////////////////////////////////////////////////////////////////// enum { ENC_INTRA_BLOCK_NONE = 0, ENC_INTRA_BLOCK_4x4 = (1 << 0), ENC_INTRA_BLOCK_8x8 = (1 << 1), ENC_INTRA_BLOCK_16x16 = (1 << 2), ENC_INTRA_BLOCK_PCM = (1 << 3), ENC_INTRA_BLOCK_NOPCM = (ENC_INTRA_BLOCK_4x4 | ENC_INTRA_BLOCK_8x8 | ENC_INTRA_BLOCK_16x16), ENC_INTRA_BLOCK_ALL = (ENC_INTRA_BLOCK_4x4 | ENC_INTRA_BLOCK_8x8 | ENC_INTRA_BLOCK_16x16| ENC_INTRA_BLOCK_PCM), }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the cost type used in intra/inter prediction. /////////////////////////////////////////////////////////////////////////////// enum { ENC_COST_TYPE_NONE = 0, ENC_COST_TYPE_SAD = (1 << 0), //sum of absolute difference ENC_COST_TYPE_SSD = (1 << 1), //sum of squared difference ENC_COST_TYPE_SATD_HADAMARD = (1 << 2), //sum of absolute hadamard transformed difference ENC_COST_TYPE_SATD_HARR = (1 << 3), //sum of absolute harr transformed difference ENC_COST_TYPE_PROPRIETARY = (1 << 4), //propriteary cost type }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the entropy coding type used for RDO // intra/inter prediction. /////////////////////////////////////////////////////////////////////////////// enum { ENC_ENTROPY_CODING_VLC = 0, //vlc ENC_ENTROPY_CODING_CABAC = 1, //cabac }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the integer pel search algorithm. /////////////////////////////////////////////////////////////////////////////// enum { ENC_INTER_SEARCH_TYPE_NONE = 0, ENC_INTER_SEARCH_TYPE_FULL = (1 << 0), ENC_INTER_SEARCH_TYPE_UMH = (1 << 1), ENC_INTER_SEARCH_TYPE_LOG = (1 << 2), ENC_INTER_SEARCH_TYPE_TTS = (1 << 3), ENC_INTER_SEARCH_TYPE_SQUARE = (1 << 4), ENC_INTER_SEARCH_TYPE_DIAMOND = (1 << 5), ENC_INTER_SEARCH_TYPE_PROPRIETARY = (1 << 6), }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the inter prediction block size. they are // used as bit flags to control what block size should be checked in inter // prediction. // this also controls how many MV can exist in one MB. /////////////////////////////////////////////////////////////////////////////// enum { ENC_INTER_BLOCK_SIZE_NONE = 0, ENC_INTER_BLOCK_SIZE_16x16 = (1 << 0), ENC_INTER_BLOCK_SIZE_16x8 = (1 << 1), ENC_INTER_BLOCK_SIZE_8x16 = (1 << 2), ENC_INTER_BLOCK_SIZE_8x8 = (1 << 3), ENC_INTER_BLOCK_SIZE_8x4 = (1 << 4), ENC_INTER_BLOCK_SIZE_4x8 = (1 << 5), ENC_INTER_BLOCK_SIZE_4x4 = (1 << 6), //all possible size ENC_INTER_BLOCK_SIZE_ALL = (ENC_INTER_BLOCK_SIZE_16x16 | ENC_INTER_BLOCK_SIZE_16x8 | ENC_INTER_BLOCK_SIZE_8x16 | ENC_INTER_BLOCK_SIZE_8x8 | ENC_INTER_BLOCK_SIZE_8x4 | ENC_INTER_BLOCK_SIZE_4x8 | ENC_INTER_BLOCK_SIZE_4x4), //blocks are bigger than or equal 8x8 ENC_INTER_BLOCK_SIZE_NO_MINOR = (ENC_INTER_BLOCK_SIZE_16x16 | ENC_INTER_BLOCK_SIZE_16x8 | ENC_INTER_BLOCK_SIZE_8x16 | ENC_INTER_BLOCK_SIZE_8x8), //VC-1 4-MV mode, for P frame only ENC_INTER_BLOCK_SIZE_VC1_4MV = (ENC_INTER_BLOCK_SIZE_16x16 | ENC_INTER_BLOCK_SIZE_8x8), //VC-1 1-MV mode, for P and B frame ENC_INTER_BLOCK_SIZE_VC1_1MV = ENC_INTER_BLOCK_SIZE_16x16, //MPEG2 1-MV mode, for P and B frame ENC_INTER_BLOCK_SIZE_MPEG_1MV = ENC_INTER_BLOCK_SIZE_16x16, }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the interpolation methods used to get the // sub pixels. // // WMV4TAP: for 1/2 pel [-1, 9, 9, -1]/16 // for 1/4 pel [-4, 53, 18, -3]/64 // for 3/4 pel [-3, 18, 53, -4]/64 // // VME4TAP: for 1/2 pel [-1, 5, 5, -1]/8 // for 1/4 pel [-1, 13, 5, -1]/16 // for 3/4 pel [-1, 5, 13, -1]/16 // // BILINEAR: for 1/2 pel [0, 1, 1, 0]/2 // for 1/4 pel [0, 3, 1, 0]/4 // for 3/4 pel [0, 1, 3, 0]/4 // // AVC6TAP: for 1/2 pel [1, -5, 20, 20, -5, 1]/32 // for 1/4 pel [1, -5, 52, 20, -5, 1]/64 // for 3/4 pel [1, -5, 20, 52, -5, 1]/64 // /////////////////////////////////////////////////////////////////////////////// enum { ENC_INTERPOLATION_TYPE_NONE = 0, ENC_INTERPOLATION_TYPE_VME4TAP = (1 << 0), ENC_INTERPOLATION_TYPE_BILINEAR = (1 << 1), ENC_INTERPOLATION_TYPE_WMV4TAP = (1 << 2), ENC_INTERPOLATION_TYPE_AVC6TAP = (1 << 3), }; //////////////////////////////////////////////////////////////////////////////// // this enumeration is used to define the MV precision. /////////////////////////////////////////////////////////////////////////////// enum { ENC_MV_PRECISION_NONE = 0, ENC_MV_PRECISION_INTEGER = (1 << 0), ENC_MV_PRECISION_HALFPEL = (1 << 1), ENC_MV_PRECISION_QUARTERPEL = (1 << 2), }; typedef struct tagENCODE_ENC_CTRL_CAPS { //DW 0 UINT IntraPredBlockSize : 4; UINT IntraPredCostType : 5; UINT InterPredBlockSize : 8; UINT MVPrecision : 4; UINT MBZ0 : 11; //DW 1 UINT MECostType : 5; UINT MESearchType : 8; UINT MBZ1 : 19; //DW 2 UINT MVSearchWindowX : 16; UINT MVSearchWindowY : 16; //DW 3 UINT MEInterpolationMethod : 4; UINT MaxMVs : 6; UINT SkipCheck : 1; UINT DirectCheck : 1; UINT BiDirSearch : 1; UINT MBAFF : 1; UINT FieldPrediction : 1; UINT RefOppositeField : 1; UINT ChromaInME : 1; UINT WeightedPrediction : 1; UINT RateDistortionOpt : 1; UINT MVPrediction : 1; UINT DirectVME : 1; UINT MBZ2 : 5; UINT MAD : 1; UINT MBZ3 : 5; } ENCODE_ENC_CTRL_CAPS; //////////////////////////////////////////////////////////////////////////////// // this structure is used to define the sequence level parameters /////////////////////////////////////////////////////////////////////////////// typedef enum tagENCODE_ARGB_COLOR { eColorSpace_P709 = 0, eColorSpace_P601 = 1, eColorSpace_P2020 = 2 }ENCODE_ARGB_COLOR; typedef struct tagENCODE_SET_SEQUENCE_PARAMETERS_H264 { USHORT FrameWidth; USHORT FrameHeight; UCHAR Profile; UCHAR Level; USHORT GopPicSize; UCHAR GopRefDist; UCHAR GopOptFlag : 2; UCHAR Reserved2 : 6; UCHAR TargetUsage; UCHAR RateControlMethod; UINT TargetBitRate; UINT MaxBitRate; UINT MinBitRate; USHORT FramesPer100Sec; ULONG InitVBVBufferFullnessInBit; ULONG VBVBufferSizeInBit; UCHAR NumRefFrames; UCHAR seq_parameter_set_id; UCHAR chroma_format_idc; UCHAR bit_depth_luma_minus8; UCHAR bit_depth_chroma_minus8; UCHAR log2_max_frame_num_minus4; UCHAR pic_order_cnt_type; UCHAR log2_max_pic_order_cnt_lsb_minus4; UCHAR num_ref_frames_in_pic_order_cnt_cycle; INT offset_for_non_ref_pic; INT offset_for_top_to_bottom_field; INT offset_for_ref_frame[256]; USHORT frame_crop_left_offset; USHORT frame_crop_right_offset; USHORT frame_crop_top_offset; USHORT frame_crop_bottom_offset; USHORT seq_scaling_matrix_present_flag : 1; USHORT seq_scaling_list_present_flag : 1; USHORT delta_pic_order_always_zero_flag : 1; USHORT frame_mbs_only_flag : 1; USHORT direct_8x8_inference_flag : 1; USHORT vui_parameters_present_flag : 1; USHORT frame_cropping_flag : 1; USHORT EnableSliceLevelRateCtrl : 1; USHORT MBZ1 : 8; union { struct { UINT bResetBRC : 1; UINT bNoAccelerationSPSInsertion : 1; UINT GlobalSearch : 2; UINT LocalSearch : 4; UINT EarlySkip : 2; UINT Trellis : 2; UINT MBBRC : 4; UINT bReserved :16; }; UINT sFlags; }; UINT UserMaxFrameSize; USHORT AVBRAccuracy; USHORT AVBRConvergence; } ENCODE_SET_SEQUENCE_PARAMETERS_H264; typedef struct tagENCODE_SET_SEQUENCE_PARAMETERS_MPEG2 { USHORT FrameWidth; USHORT FrameHeight; UCHAR Profile; UCHAR Level; UCHAR ChromaFormat; UCHAR TargetUsage; // ENC + PAK related parameters union { USHORT AratioFrate; struct { USHORT AspectRatio : 4; USHORT FrameRateCode : 4; USHORT FrameRateExtN : 3; USHORT FrameRateExtD : 5; }; }; UINT bit_rate; // bits/sec UINT vbv_buffer_size; // 16 Kbit UCHAR progressive_sequence : 1; UCHAR low_delay : 1; UCHAR bResetBRC : 1; UCHAR bNoSPSInsertion : 1; UCHAR Reserved : 4; UCHAR RateControlMethod; USHORT Reserved16bits; UINT MaxBitRate; UINT MinBitRate; UINT UserMaxFrameSize; UINT InitVBVBufferFullnessInBit; USHORT AVBRAccuracy; USHORT AVBRConvergence; } ENCODE_SET_SEQUENCE_PARAMETERS_MPEG2; /* H.264/AVC picture entry data structure */ typedef struct _ENCODE_PICENTRY { union { struct { UCHAR Index7Bits : 7; UCHAR AssociatedFlag : 1; }; UCHAR bPicEntry; }; } ENCODE_PICENTRY; /* 1 byte */ typedef struct tagENCODE_RECT { USHORT Top; // [0..(FrameHeight+ M-1)/M -1] USHORT Bottom; // [0..(FrameHeight+ M-1)/M -1] USHORT Left; // [0..(FrameWidth+15)/16-1] USHORT Right; // [0..(FrameWidth+15)/16-1] } ENCODE_RECT; typedef struct tagENCODE_ROI { ENCODE_RECT Roi; CHAR PriorityLevelOrDQp; // [-3..3] or [-51..51] } ENCODE_ROI; typedef enum tagENCODE_SCENARIO { eScenario_Unknown = 0, eScenario_DisplayRemoting = 1, eScenario_VideoConference = 2, eScenario_Archive = 3, eScenario_LiveStreaming = 4 } ENCODE_SCENARIO; typedef enum tagENCODE_CONTENT { eContent_Unknown = 0, eContent_FullScreenVideo = 1, eContent_NonVideoScreen = 2 } ENCODE_CONTENT; typedef struct tagMOVE_RECT { USHORT SourcePointX; USHORT SourcePointY; ENCODE_RECT DestRect; } MOVE_RECT; typedef enum tagENCODE_FRAME_SIZE_TOLERANCE { eFrameSizeTolerance_Normal = 0,//default eFrameSizeTolerance_Low = 1,//Sliding Window eFrameSizeTolerance_ExtremelyLow = 2//low delay }ENCODE_FRAME_SIZE_TOLERANCE; typedef struct tagENCODE_SET_PICTURE_PARAMETERS_H264 { ENCODE_PICENTRY CurrOriginalPic; ENCODE_PICENTRY CurrReconstructedPic; UCHAR CodingType; UCHAR FieldCodingFlag : 1; UCHAR FieldFrameCodingFlag : 1; UCHAR MBZ0 : 2; UCHAR InterleavedFieldBFF : 1; UCHAR ProgressiveField : 1; UCHAR MBZ1 : 2; UCHAR NumSlice; CHAR QpY; ENCODE_PICENTRY RefFrameList[16]; UINT UsedForReferenceFlags; INT CurrFieldOrderCnt[2]; INT FieldOrderCntList[16][2]; USHORT frame_num; BOOL bLastPicInSeq; BOOL bLastPicInStream; union { struct { UINT bUseRawPicForRef : 1; UINT bDisableHeaderPacking : 1; UINT bEnableDVMEChromaIntraPrediction : 1; UINT bEnableDVMEReferenceLocationDerivation : 1; UINT bEnableDVMWSkipCentersDerivation : 1; UINT bEnableDVMEStartCentersDerivation : 1; UINT bEnableDVMECostCentersDerivation : 1; UINT bDisableSubMBPartition : 1; UINT bEmulationByteInsertion : 1; UINT bEnableRollingIntraRefresh : 2; UINT bSliceLevelReport : 1; UINT bDisableSubpixel : 1; UINT bDisableRollingIntraRefreshOverlap : 1; UINT ForceRepartitionCheck : 2; UINT bDisableFrameSkip : 1; UINT bEnablePollingMode : 1; UINT bRepeatFrame : 1; UINT bEnableQpAdjustment : 1; UINT bLookAheadPhase : 1; UINT bReserved : 11; }; BOOL UserFlags; }; UINT StatusReportFeedbackNumber; UCHAR bIdrPic; UCHAR pic_parameter_set_id; UCHAR seq_parameter_set_id; UCHAR num_ref_idx_l0_active_minus1; UCHAR num_ref_idx_l1_active_minus1; CHAR chroma_qp_index_offset; CHAR second_chroma_qp_index_offset; USHORT entropy_coding_mode_flag : 1; USHORT pic_order_present_flag : 1; USHORT weighted_pred_flag : 1; USHORT weighted_bipred_idc : 2; USHORT constrained_intra_pred_flag : 1; USHORT transform_8x8_mode_flag : 1; USHORT pic_scaling_matrix_present_flag : 1; USHORT pic_scaling_list_present_flag : 1; USHORT RefPicFlag : 1; USHORT BRCPrecision : 2; USHORT MBZ2 : 4; USHORT IntraInsertionLocation; USHORT IntraInsertionSize; CHAR QpDeltaForInsertedIntra; UINT SliceSizeInBytes; } ENCODE_SET_PICTURE_PARAMETERS_H264; typedef struct tagENCODE_SET_PICTURE_PARAMETERS_MPEG2 { ENCODE_PICENTRY CurrOriginalPic; ENCODE_PICENTRY CurrReconstructedPic; UCHAR picture_coding_type; UCHAR FieldCodingFlag : 1; UCHAR FieldFrameCodingFlag : 1; UCHAR MBZ0 : 2; UCHAR InterleavedFieldBFF : 1; UCHAR ProgressiveField : 1; UCHAR MBZ1 : 2; UCHAR NumSlice; UCHAR bPicBackwardPrediction; UCHAR bBidirectionalAveragingMode; UCHAR bPic4MVallowed; ENCODE_PICENTRY RefFrameList[2]; union { struct { UINT bUseRawPicForRef : 1; UINT bDisableHeaderPacking : 1; UINT bEnableDVMEChromaIntraPrediction : 1; UINT bEnableDVMEReferenceLocationDerivation : 1; UINT bEnableDVMESkipCentersDerivation : 1; UINT bEnableDVMEStartCentersDerivation : 1; UINT bEnableDVMECostCentersDerivation : 1; UINT bReserved : 25; }; BOOL UserFlags; }; UINT StatusReportFeedbackNumber; UINT alternate_scan : 1; UINT intra_vlc_format : 1; UINT q_scale_type : 1; UINT concealment_motion_vectors : 1; UINT frame_pred_frame_dct : 1; UINT DisableMismatchControl : 1; UINT intra_dc_precision : 2; UINT f_code00 : 4; UINT f_code01 : 4; UINT f_code10 : 4; UINT f_code11 : 4; UINT Reserved1 : 8; // ENC + PAK related parameters BOOL bLastPicInStream; BOOL bNewGop; USHORT GopPicSize; UCHAR GopRefDist; UCHAR GopOptFlag : 2; UCHAR : 6; UINT time_code : 25; UINT : 7; USHORT temporal_reference : 10; USHORT : 6; USHORT vbv_delay; UINT repeat_first_field : 1; UINT composite_display_flag : 1; UINT v_axis : 1; UINT field_sequence : 3; UINT sub_carrier : 1; UINT burst_amplitude : 7; UINT sub_carrier_phase : 8; UINT : 10; } ENCODE_SET_PICTURE_PARAMETERS_MPEG2; typedef struct tagENCODE_SET_SLICE_HEADER_H264 { UINT NumMbsForSlice; ENCODE_PICENTRY RefPicList[2][32]; SHORT Weights[2][32][3][2]; UINT first_mb_in_slice; UCHAR slice_type; UCHAR pic_parameter_set_id; USHORT direct_spatial_mv_pred_flag : 1; USHORT num_ref_idx_active_override_flag : 1; USHORT long_term_reference_flag : 1; USHORT MBZ0 : 13; USHORT idr_pic_id; USHORT pic_order_cnt_lsb; INT delta_pic_order_cnt_bottom; INT delta_pic_order_cnt[2]; UCHAR num_ref_idx_l0_active_minus1; UCHAR num_ref_idx_l1_active_minus1; UCHAR luma_log2_weight_denom; UCHAR chroma_log2_weight_denom; UCHAR cabac_init_idc; CHAR slice_qp_delta; UCHAR disable_deblocking_filter_idc; CHAR slice_alpha_c0_offset_div2; CHAR slice_beta_offset_div2; UINT slice_id; } ENCODE_SET_SLICE_HEADER_H264; typedef struct tagENCODE_PACKEDHEADER_DATA { UCHAR * pData; UINT BufferSize; UINT DataLength; UINT DataOffset; UINT SkipEmulationByteCount; UINT Reserved; } ENCODE_PACKEDHEADER_DATA; typedef struct tagENCODE_SET_SLICE_HEADER_MPEG2 { USHORT NumMbsForSlice; USHORT FirstMbX; USHORT FirstMbY; USHORT IntraSlice; UCHAR quantiser_scale_code; } ENCODE_SET_SLICE_HEADER_MPEG2; typedef struct { SHORT x; SHORT y; } ENC_MV, ENCODE_MV_DATA; typedef struct tagENCODE_ENC_MB_DATA_MPEG2 { struct { UINT InterMBMode : 2; UINT SkipMbFlag : 1; UINT MBZ1 : 5; UINT macroblock_type : 5; UINT macroblock_intra : 1; UINT FieldMBFlag : 1; UINT dct_type : 1; UINT MBZ2 : 1; UINT CbpDcV : 1; UINT CbpDcU : 1; UINT CbpDcY : 1; UINT MvFormat : 3; UINT MBZ3 : 1; UINT PackedMvNum : 3; UINT MBZ4 : 5; }; struct { UINT MbX : 16; UINT MbY : 16; }; struct { UINT coded_block_pattern : 12; UINT MBZ5 : 4; UINT TargetSizeInWord : 8; UINT MaxSizeInWord : 8; }; struct { UINT QpScaleCode : 5; UINT MBZ6 : 11; UINT MvFieldSelect : 4; UINT MBZ7 : 4; UINT FirstMbInSG : 1; UINT MbSkipConvDisable : 1; UINT LastMbInSG : 1; UINT EnableCoeffClamp : 1; UINT MBZ8 : 2; UINT FirstMbInSlice : 1; UINT LastMbInSlice : 1; }; ENC_MV MVL0[2]; ENC_MV MVL1[2]; UINT reserved[8]; } ENCODE_ENC_MB_DATA_MPEG2; typedef struct tagENCODE_ENC_MV_H264 { ENC_MV MVL0[16]; ENC_MV MVL1[16]; } ENCODE_ENC_MV_H264; typedef struct tagENCODE_MBDATA_LAYOUT { UCHAR MB_CODE_size; UINT MB_CODE_offset; UINT MB_CODE_BottomField_offset; UINT MB_CODE_stride; UCHAR MV_number; UINT MV_offset; UINT MV_BottomField_offset; UINT MV_stride; } ENCODE_MBDATA_LAYOUT; enum { ENCODE_ENC_ID = 0x100, ENCODE_PAK_ID = 0x101, ENCODE_ENC_PAK_ID = 0x102, ENCODE_VPP_ID = 0x103, // reserved for now ENCODE_FORMAT_COUNT_ID = 0x104, ENCODE_FORMATS_ID = 0x105, ENCODE_ENC_CTRL_CAPS_ID = 0x106, ENCODE_ENC_CTRL_GET_ID = 0x107, ENCODE_ENC_CTRL_SET_ID = 0x108, MBDATA_LAYOUT_ID = 0x109, ENCODE_INSERT_DATA_ID = 0x120, ENCODE_QUERY_STATUS_ID = 0x121 }; #endif /* MFX_VA_LINUX */ /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/include/mfx_h264_encode_vaapi.h000066400000000000000000000245331443134507600326300ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_H264_ENCODE_VAAPI__H #define __MFX_H264_ENCODE_VAAPI__H #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include "umc_mutex.h" #include #include #include "vaapi_ext_interface.h" #include "mfx_h264_encode_interface.h" #include "mfx_h264_encode_hw_utils.h" uint32_t ConvertRateControlMFX2VAAPI(mfxU8 rateControl); VAProfile ConvertProfileTypeMFX2VAAPI(mfxU32 type); mfxStatus SetHRD( MfxHwH264Encode::MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & hrdBuf_id); mfxStatus SetQualityParams( MfxHwH264Encode::MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & qualityParams_id, MfxHwH264Encode::DdiTask const * pTask = nullptr); mfxStatus SetQualityLevel( MfxHwH264Encode::MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & privateParams_id, mfxEncodeCtrl const * pCtrl = 0); void FillConstPartOfPps( MfxHwH264Encode::MfxVideoParam const & par, VAEncPictureParameterBufferH264 & pps); mfxStatus SetFrameRate( MfxHwH264Encode::MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & frameRateBuf_id); #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) mfxStatus SetRoundingOffset( VADisplay vaDisplay, VAContextID vaContextEncode, mfxExtAVCRoundingOffset const & roundingOffset, VABufferID & roundingOffsetBuf_id); #endif namespace MfxHwH264Encode { // map feedbackNumber <-> VASurface struct ExtVASurface { VASurfaceID surface = VA_INVALID_SURFACE; mfxU32 number = 0; mfxU32 idxBs = 0; mfxU32 size = 0; // valid only if Surface ID == VA_INVALID_SURFACE (skipped frames) }; void UpdatePPS( DdiTask const & task, mfxU32 fieldId, VAEncPictureParameterBufferH264 & pps, std::vector const & reconQueue); void UpdateSlice( MFX_ENCODE_CAPS const & hwCaps, DdiTask const & task, mfxU32 fieldId, VAEncSequenceParameterBufferH264 const & sps, VAEncPictureParameterBufferH264 const & pps, std::vector & slice, MfxVideoParam const & par, std::vector const & reconQueue); class VAAPIEncoder : public DriverEncoder { public: VAAPIEncoder(); virtual ~VAAPIEncoder(); virtual mfxStatus CreateAuxilliaryDevice( VideoCORE* core, GUID guid, mfxU32 width, mfxU32 height, bool isTemporal = false) override; virtual mfxStatus CreateAccelerationService( MfxVideoParam const & par) override; virtual mfxStatus Reset( MfxVideoParam const & par) override; // 2 -> 1 virtual mfxStatus Register( mfxFrameAllocResponse& response, D3DDDIFORMAT type) override; // (mfxExecuteBuffers& data) virtual mfxStatus Execute( mfxHDLPair pair, DdiTask const & task, mfxU32 fieldId, PreAllocatedVector const & sei) override; // recomendation from HW virtual mfxStatus QueryCompBufferInfo( D3DDDIFORMAT type, mfxFrameAllocRequest& request) override; virtual mfxStatus QueryEncodeCaps( MFX_ENCODE_CAPS& caps) override; virtual mfxStatus QueryMbPerSec( mfxVideoParam const & par, mfxU32 (&mbPerSec)[16]) override; virtual mfxStatus QueryStatus( DdiTask & task, mfxU32 fieldId, bool useEvent = true) override; virtual mfxStatus QueryStatusFEI( DdiTask const & task, mfxU32 feiFieldId, ExtVASurface const & curFeedback, mfxU32 codedStatus); virtual mfxStatus Destroy() override; void ForceCodingFunction (mfxU16 /*codingFunction*/) override { // no need in it on Linux } virtual mfxStatus QueryHWGUID( VideoCORE * core, GUID guid, bool isTemporal) override; VAAPIEncoder(const VAAPIEncoder&) = delete; VAAPIEncoder& operator=(const VAAPIEncoder&) = delete; protected: void FillSps( MfxVideoParam const & par, VAEncSequenceParameterBufferH264 & sps); VideoCORE* m_core; MfxVideoParam m_videoParam; // encoder specific. can be encapsulated by auxDevice class VADisplay m_vaDisplay; VAContextID m_vaContextEncode; VAConfigID m_vaConfig; // encode params (extended structures) VAEncSequenceParameterBufferH264 m_sps; VAEncPictureParameterBufferH264 m_pps; std::vector m_slice; // encode buffer to send vaRender() VABufferID m_spsBufferId; VABufferID m_hrdBufferId; VABufferID m_rateParamBufferId; // VAEncMiscParameterRateControl VABufferID m_frameRateId; // VAEncMiscParameterFrameRate VABufferID m_qualityLevelId; // VAEncMiscParameterBufferQualityLevel VABufferID m_maxFrameSizeId; // VAEncMiscParameterFrameRate VABufferID m_multiPassFrameSizeId; // VAEncMiscParameterBufferMultiPassFrameSize VABufferID m_quantizationId; // VAEncMiscParameterQuantization VABufferID m_rirId; // VAEncMiscParameterRIR VABufferID m_qualityParamsId; // VAEncMiscParameterEncQuality VABufferID m_miscParameterSkipBufferId; // VAEncMiscParameterSkipFrame VABufferID m_maxSliceSizeId; // VAEncMiscParameterMaxSliceSize #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) VABufferID m_roundingOffsetId; // VAEncMiscParameterCustomRoundingControl #endif VABufferID m_roiBufferId; VABufferID m_ppsBufferId; VABufferID m_mbqpBufferId; #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) VABufferID m_qmBufferId; #endif #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) VABufferID m_triggerGpuHangBufferId; #endif VABufferID m_mbNoSkipBufferId; std::vector m_sliceBufferId; VABufferID m_packedAudHeaderBufferId; VABufferID m_packedAudBufferId; VABufferID m_packedSpsHeaderBufferId; VABufferID m_packedSpsBufferId; VABufferID m_packedPpsHeaderBufferId; VABufferID m_packedPpsBufferId; VABufferID m_packedSeiHeaderBufferId; VABufferID m_packedSeiBufferId; VABufferID m_packedSkippedSliceHeaderBufferId; VABufferID m_packedSkippedSliceBufferId; #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) std::vector m_packedCqmPpsHeaderBufferId; std::vector m_packedCqmPpsBufferId; #endif std::vector m_packedSliceHeaderBufferId; std::vector m_packedSliceBufferId; std::vector m_packedSvcPrefixHeaderBufferId; std::vector m_packedSvcPrefixBufferId; std::vector m_vaFeiMBStatId; std::vector m_vaFeiMVOutId; std::vector m_vaFeiMCODEOutId; // The following 3 members are used in pair with 3 above, // to indicate the size of allocated buf. std::vector m_vaFeiMBStatBufSize; std::vector m_vaFeiMVOutBufSize; std::vector m_vaFeiMCODEOutBufSize; std::vector m_feedbackCache; std::vector m_bsQueue; std::vector m_reconQueue; mfxU32 m_width; mfxU32 m_height; mfxU32 m_userMaxFrameSize; // current MaxFrameSize from user. mfxU32 m_mbbrc; MFX_ENCODE_CAPS m_caps; /* * Current RollingIntraRefresh state, as it came through the task state and passing to DDI in PPS * for Windows we keep it here to send update by VAMapBuffer as happened. */ IntraRefreshState m_RIRState; mfxU32 m_curTrellisQuantization; // mapping in accordance with libva mfxU32 m_newTrellisQuantization; // will be sent through config. std::vector m_arrayVAEncROI; static const mfxU32 MAX_CONFIG_BUFFERS_COUNT = 29 + 5; //added FEI buffers UMC::Mutex m_guard; HeaderPacker m_headerPacker; // SkipFlag enum { NO_SKIP, NORMAL_MODE, }; mfxU8 m_numSkipFrames; mfxU32 m_sizeSkipFrames; mfxU32 m_skipMode; bool m_isENCPAK; bool m_isBrcResetRequired; VAEncMiscParameterRateControl m_vaBrcPar; VAEncMiscParameterFrameRate m_vaFrameRate; std::vector m_mb_noskip_buffer; }; }; // namespace #endif // MFX_ENABLE_H264_VIDEO_ENCODE #endif // __MFX_H264_ENCODE_VAAPI__H /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/000077500000000000000000000000001443134507600255625ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/mfx_h264_enc_common_hw.cpp000066400000000000000000013727171443134507600325400ustar00rootroot00000000000000// Copyright (c) 2009-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "libmfx_core.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include #include #include #include "libmfx_core_interface.h" #include "libmfx_core_factory.h" #include "mfx_h264_encode_hw_utils.h" #include "mfx_brc_common.h" #include "umc_h264_brc.h" #include "mfx_enc_common.h" #include "umc_h264_common.h" using namespace MfxHwH264Encode; const mfxU32 DEFAULT_CPB_IN_SECONDS = 2000; // BufferSizeInBits = DEFAULT_CPB_IN_SECONDS * MaxKbps const mfxU32 MAX_BITRATE_RATIO = mfxU32(1.5 * 1000); // MaxBps = MAX_BITRATE_RATIO * TargetKbps; const mfxU32 DEFAULT_ASYNC_DEPTH_TO_WA_D3D9_128_SURFACE_LIMIT = 10; // Use this value in case of d3d9 and when par.AsyncDepth parameter is set to a very big value namespace { static const mfxU8 EXTENDED_SAR = 0xff; static const mfxU32 MAX_H_MV = 2048; static const struct { mfxU16 w, h; } TABLE_E1[] = { { 0, 0 }, { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 }, { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 }, { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 }, { 160, 99 }, { 4, 3 }, { 3, 2 }, { 2, 1 } }; const mfxU16 AVBR_ACCURACY_MIN = 1; const mfxU16 AVBR_ACCURACY_MAX = 65535; const mfxU16 AVBR_CONVERGENCE_MIN = 1; const mfxU16 AVBR_CONVERGENCE_MAX = 65535; bool CheckTriStateOption(mfxU16 & opt) { if (opt != MFX_CODINGOPTION_UNKNOWN && opt != MFX_CODINGOPTION_ON && opt != MFX_CODINGOPTION_OFF) { opt = MFX_CODINGOPTION_UNKNOWN; return false; } return true; } #ifdef MFX_ENABLE_H264_REPARTITION_CHECK bool CheckTriStateOptionWithAdaptive(mfxU16 & opt) { if (opt != MFX_CODINGOPTION_UNKNOWN && opt != MFX_CODINGOPTION_ON && opt != MFX_CODINGOPTION_OFF && opt != MFX_CODINGOPTION_ADAPTIVE) { opt = MFX_CODINGOPTION_UNKNOWN; return false; } return true; } #endif bool CheckTriStateOptionForOff(mfxU16 & opt) { if (opt != MFX_CODINGOPTION_OFF) { opt = MFX_CODINGOPTION_OFF; return false; } return true; } inline void SetDefaultOn(mfxU16 & opt) { if (opt == MFX_CODINGOPTION_UNKNOWN) { opt = MFX_CODINGOPTION_ON; } } inline void SetDefaultOff(mfxU16 & opt) { if (opt == MFX_CODINGOPTION_UNKNOWN) { opt = MFX_CODINGOPTION_OFF; } } template bool CheckFlag(T & opt, U deflt) { if (opt > 1) { opt = static_cast(deflt); return false; } return true; } template bool CheckRange(T & opt, U min, U max) { if (opt < min) { opt = static_cast(min); return false; } if (opt > max) { opt = static_cast(max); return false; } return true; } template bool CheckRangeDflt(T & opt, U min, U max, U deflt) { if (opt < static_cast(min) || opt > static_cast(max)) { opt = static_cast(deflt); return false; } return true; } struct FunctionQuery {}; struct FunctionInit {}; template mfxU32 CheckAgreement(FunctionQuery, T & lowerPriorityValue, U higherPriorityValue) { if (lowerPriorityValue != 0 && lowerPriorityValue != higherPriorityValue) return lowerPriorityValue = higherPriorityValue, 1; else return 0; } template mfxU32 CheckAgreement(FunctionInit, T & lowerPriorityValue, U higherPriorityValue) { if (lowerPriorityValue == 0) return lowerPriorityValue = higherPriorityValue, 0; // assignment, not a correction else if (lowerPriorityValue != higherPriorityValue) return lowerPriorityValue = higherPriorityValue, 1; // correction else return 0; // already equal } bool CheckMbAlignment(mfxU32 & opt) { if (opt & 0x0f) { opt = opt & 0xfffffff0; return false; } return true; } bool CheckMbAlignmentAndUp(mfxU32 & opt) { if (opt & 0x0f) { opt = (opt & 0xfffffff0) + 0x10; return false; } return true; } bool IsValidCodingLevel(mfxU16 level) { return level == MFX_LEVEL_AVC_1 || level == MFX_LEVEL_AVC_11 || level == MFX_LEVEL_AVC_12 || level == MFX_LEVEL_AVC_13 || level == MFX_LEVEL_AVC_1b || level == MFX_LEVEL_AVC_2 || level == MFX_LEVEL_AVC_21 || level == MFX_LEVEL_AVC_22 || level == MFX_LEVEL_AVC_3 || level == MFX_LEVEL_AVC_31 || level == MFX_LEVEL_AVC_32 || level == MFX_LEVEL_AVC_4 || level == MFX_LEVEL_AVC_41 || level == MFX_LEVEL_AVC_42 || level == MFX_LEVEL_AVC_5 || level == MFX_LEVEL_AVC_51 || level == MFX_LEVEL_AVC_52; } bool IsValidCodingProfile(mfxU16 profile) { return IsAvcBaseProfile(profile) || IsAvcHighProfile(profile) || (IsMvcProfile(profile) && (profile != MFX_PROFILE_AVC_MULTIVIEW_HIGH)) || // Multiview high isn't supported by MSDK profile == MFX_PROFILE_AVC_MAIN #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE || IsSvcProfile(profile) #endif ; } inline mfxU16 GetMaxSupportedLevel() { return MFX_LEVEL_AVC_52; } mfxU16 GetNextProfile(mfxU16 profile) { switch (profile) { case MFX_PROFILE_AVC_BASELINE: return MFX_PROFILE_AVC_MAIN; case MFX_PROFILE_AVC_MAIN: return MFX_PROFILE_AVC_HIGH; case MFX_PROFILE_AVC_HIGH: return MFX_PROFILE_UNKNOWN; case MFX_PROFILE_AVC_STEREO_HIGH: return MFX_PROFILE_UNKNOWN; default: assert(!"bad profile"); return MFX_PROFILE_UNKNOWN; } } mfxU16 GetLevelLimitByDpbSize(mfxVideoParam const & par) { mfxU32 dpbSize = par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height * 3 / 2; dpbSize *= par.mfx.NumRefFrame; assert(dpbSize > 0); if (dpbSize <= 152064) return MFX_LEVEL_AVC_1; if (dpbSize <= 345600) return MFX_LEVEL_AVC_11; if (dpbSize <= 912384) return MFX_LEVEL_AVC_12; if (dpbSize <= 1824768) return MFX_LEVEL_AVC_21; if (dpbSize <= 3110400) return MFX_LEVEL_AVC_22; if (dpbSize <= 6912000) return MFX_LEVEL_AVC_31; if (dpbSize <= 7864320) return MFX_LEVEL_AVC_32; if (dpbSize <= 12582912) return MFX_LEVEL_AVC_4; if (dpbSize <= 13369344) return MFX_LEVEL_AVC_42; if (dpbSize <= 42393600) return MFX_LEVEL_AVC_5; if (dpbSize <= 70778880) return MFX_LEVEL_AVC_51; return MFX_LEVEL_UNKNOWN; } mfxU16 GetLevelLimitByFrameSize(mfxVideoParam const & par) { mfxU32 numMb = par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256; if (numMb <= 99) return MFX_LEVEL_AVC_1; if (numMb <= 396) return MFX_LEVEL_AVC_11; if (numMb <= 792) return MFX_LEVEL_AVC_21; if (numMb <= 1620) return MFX_LEVEL_AVC_22; if (numMb <= 3600) return MFX_LEVEL_AVC_31; if (numMb <= 5120) return MFX_LEVEL_AVC_32; if (numMb <= 8192) return MFX_LEVEL_AVC_4; if (numMb <= 8704) return MFX_LEVEL_AVC_42; if (numMb <= 22080) return MFX_LEVEL_AVC_5; if (numMb <= 36864) return MFX_LEVEL_AVC_51; return MFX_LEVEL_UNKNOWN; } mfxU16 GetLevelLimitByMbps(mfxVideoParam const & par) { mfxU32 numMb = par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256; mfxF64 fR = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; mfxF64 mbps = numMb * fR; if (mbps <= 1485) return MFX_LEVEL_AVC_1; if (mbps <= 3000) return MFX_LEVEL_AVC_11; if (mbps <= 6000) return MFX_LEVEL_AVC_12; if (mbps <= 11880) return MFX_LEVEL_AVC_13; if (mbps <= 19800) return MFX_LEVEL_AVC_21; if (mbps <= 20250) return MFX_LEVEL_AVC_22; if (mbps <= 40500) return MFX_LEVEL_AVC_3; if (mbps <= 108000) return MFX_LEVEL_AVC_31; if (mbps <= 216000) return MFX_LEVEL_AVC_32; if (mbps <= 245760) return MFX_LEVEL_AVC_4; if (mbps <= 522240) return MFX_LEVEL_AVC_42; if (mbps <= 589824) return MFX_LEVEL_AVC_5; if (mbps <= 983040) return MFX_LEVEL_AVC_51; if (mbps <= 2073600) return MFX_LEVEL_AVC_52; return MFX_LEVEL_UNKNOWN; } mfxU16 GetLevelLimitByMaxBitrate(mfxU16 profile, mfxU32 kbps) { mfxU32 brFactor = IsAvcHighProfile(profile) ? 1500 : 1200; mfxU32 br = 1000 * kbps; if (br <= 64 * brFactor) return MFX_LEVEL_AVC_1; if (br <= 128 * brFactor) return MFX_LEVEL_AVC_1b; if (br <= 192 * brFactor) return MFX_LEVEL_AVC_11; if (br <= 384 * brFactor) return MFX_LEVEL_AVC_12; if (br <= 768 * brFactor) return MFX_LEVEL_AVC_13; if (br <= 2000 * brFactor) return MFX_LEVEL_AVC_2; if (br <= 4000 * brFactor) return MFX_LEVEL_AVC_21; if (br <= 10000 * brFactor) return MFX_LEVEL_AVC_3; if (br <= 14000 * brFactor) return MFX_LEVEL_AVC_31; if (br <= 20000 * brFactor) return MFX_LEVEL_AVC_32; if (br <= 50000 * brFactor) return MFX_LEVEL_AVC_41; if (br <= 135000 * brFactor) return MFX_LEVEL_AVC_5; if (br <= 240000 * brFactor) return MFX_LEVEL_AVC_51; return MFX_LEVEL_UNKNOWN; } mfxU16 GetLevelLimitByBufferSize(mfxU16 profile, mfxU32 bufferSizeInKb) { mfxU32 brFactor = IsAvcHighProfile(profile) ? 1500 : 1200; mfxU32 bufSize = 8000 * bufferSizeInKb; if (bufSize <= 175 * brFactor) return MFX_LEVEL_AVC_1; if (bufSize <= 350 * brFactor) return MFX_LEVEL_AVC_1b; if (bufSize <= 500 * brFactor) return MFX_LEVEL_AVC_11; if (bufSize <= 1000 * brFactor) return MFX_LEVEL_AVC_12; if (bufSize <= 2000 * brFactor) return MFX_LEVEL_AVC_13; if (bufSize <= 4000 * brFactor) return MFX_LEVEL_AVC_21; if (bufSize <= 10000 * brFactor) return MFX_LEVEL_AVC_3; if (bufSize <= 14000 * brFactor) return MFX_LEVEL_AVC_31; if (bufSize <= 20000 * brFactor) return MFX_LEVEL_AVC_32; if (bufSize <= 25000 * brFactor) return MFX_LEVEL_AVC_4; if (bufSize <= 62500 * brFactor) return MFX_LEVEL_AVC_41; if (bufSize <= 135000 * brFactor) return MFX_LEVEL_AVC_5; if (bufSize <= 240000 * brFactor) return MFX_LEVEL_AVC_51; return MFX_LEVEL_UNKNOWN; } // calculate possible minimum level for encoding of input stream mfxU16 GetMinLevelForAllParameters(MfxVideoParam const & par) { mfxExtSpsHeader const & extSps = GetExtBufferRef(par); if (par.mfx.FrameInfo.Width == 0 || par.mfx.FrameInfo.Height == 0) { // input information isn't enough to determine required level return 0; } mfxU16 maxSupportedLevel = GetMaxSupportedLevel(); mfxU16 level = GetLevelLimitByFrameSize(par); if (level == 0 || level == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (extSps.vui.flags.timingInfoPresent == 0 || par.mfx.FrameInfo.FrameRateExtN == 0 || par.mfx.FrameInfo.FrameRateExtD == 0) { // no information about frame rate return level; } mfxU16 levelMbps = GetLevelLimitByMbps(par); if (levelMbps == 0 || levelMbps == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (levelMbps > level) level = levelMbps; if (par.mfx.NumRefFrame != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 levelDpbs = GetLevelLimitByDpbSize(par); if (levelDpbs == 0 || levelDpbs == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (levelDpbs > level) level = levelDpbs; } mfxU16 profile = par.mfx.CodecProfile; mfxU32 kbps = par.calcParam.targetKbps; if ( par.mfx.RateControlMethod == MFX_RATECONTROL_VCM || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_WIDI_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) { if (par.calcParam.maxKbps >= kbps) kbps = par.calcParam.maxKbps; else kbps = par.calcParam.targetKbps * MAX_BITRATE_RATIO / 1000; } mfxU16 levelBr = GetLevelLimitByMaxBitrate(profile, kbps); if (levelBr == 0 || levelBr == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (levelBr > level) level = levelBr; profile = par.mfx.CodecProfile; mfxU32 cpb = par.calcParam.bufferSizeInKB; mfxU16 levelCPM = GetLevelLimitByBufferSize(profile, cpb); if (levelCPM == 0 || levelCPM == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (levelCPM > level) level = levelCPM; return level; } // calculate minimum level required for encoding of input stream (with given resolution and frame rate) // input stream can't be encoded with lower level regardless of any encoding parameters mfxU16 GetMinLevelForResolutionAndFramerate(MfxVideoParam const & par) { mfxExtSpsHeader const & extSps = GetExtBufferRef(par); if (par.mfx.FrameInfo.Width == 0 || par.mfx.FrameInfo.Height == 0) { // input information isn't enough to determine required level return 0; } mfxU16 maxSupportedLevel = GetMaxSupportedLevel(); mfxU16 level = GetLevelLimitByFrameSize(par); if (level == 0 || level == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (extSps.vui.flags.timingInfoPresent == 0 || par.mfx.FrameInfo.FrameRateExtN == 0 || par.mfx.FrameInfo.FrameRateExtD == 0) { // no information about frame rate return level; } mfxU16 levelMbps = GetLevelLimitByMbps(par); if (levelMbps == 0 || levelMbps == maxSupportedLevel) { // level is already maximum possible, return it return maxSupportedLevel; } if (levelMbps > level) level = levelMbps; return level; } mfxU16 GetMaxNumRefFrame(mfxU16 level, mfxU16 width, mfxU16 height) { mfxU32 maxDpbSize = 0; if (level == MFX_LEVEL_UNKNOWN) level = MFX_LEVEL_AVC_52; switch (level) { case MFX_LEVEL_AVC_1 : maxDpbSize = 152064; break; case MFX_LEVEL_AVC_1b: maxDpbSize = 152064; break; case MFX_LEVEL_AVC_11: maxDpbSize = 345600; break; case MFX_LEVEL_AVC_12: maxDpbSize = 912384; break; case MFX_LEVEL_AVC_13: maxDpbSize = 912384; break; case MFX_LEVEL_AVC_2 : maxDpbSize = 912384; break; case MFX_LEVEL_AVC_21: maxDpbSize = 1824768; break; case MFX_LEVEL_AVC_22: maxDpbSize = 3110400; break; case MFX_LEVEL_AVC_3 : maxDpbSize = 3110400; break; case MFX_LEVEL_AVC_31: maxDpbSize = 6912000; break; case MFX_LEVEL_AVC_32: maxDpbSize = 7864320; break; case MFX_LEVEL_AVC_4 : maxDpbSize = 12582912; break; case MFX_LEVEL_AVC_41: maxDpbSize = 12582912; break; case MFX_LEVEL_AVC_42: maxDpbSize = 13369344; break; case MFX_LEVEL_AVC_5 : maxDpbSize = 42393600; break; case MFX_LEVEL_AVC_51: maxDpbSize = 70778880; break; case MFX_LEVEL_AVC_52: maxDpbSize = 70778880; break; default: assert(!"bad CodecLevel"); } mfxU32 frameSize = width * height * 3 / 2; return mfxU16(mfx::clamp(maxDpbSize / frameSize, 1u, 16u)); } mfxU16 GetMaxNumRefFrame(mfxVideoParam const & par) { return GetMaxNumRefFrame(par.mfx.CodecLevel, par.mfx.FrameInfo.Width, par.mfx.FrameInfo.Height); } mfxU16 GetMinNumRefFrameForPyramid(mfxU16 GopRefDist) { mfxU16 refIP = (GopRefDist > 1 ? 2 : 1); mfxU16 refB = GopRefDist ? (GopRefDist - 1) / 2 : 0; for (mfxU16 x = refB; x > 2;) { x = (x - 1) / 2; refB -= x; } return refIP + refB; } mfxU16 GetMinNumRefFrameForPyramid(mfxVideoParam const & par) { return GetMinNumRefFrameForPyramid(par.mfx.GopRefDist); } mfxU32 GetMaxBitrate(mfxVideoParam const & par) { mfxU32 brFactor = IsAvcHighProfile(par.mfx.CodecProfile) ? 1500 : 1200; mfxU16 level = par.mfx.CodecLevel; if (level == MFX_LEVEL_UNKNOWN) level = MFX_LEVEL_AVC_52; switch (level) { case MFX_LEVEL_AVC_1 : return 64 * brFactor; case MFX_LEVEL_AVC_1b: return 128 * brFactor; case MFX_LEVEL_AVC_11: return 192 * brFactor; case MFX_LEVEL_AVC_12: return 384 * brFactor; case MFX_LEVEL_AVC_13: return 768 * brFactor; case MFX_LEVEL_AVC_2 : return 2000 * brFactor; case MFX_LEVEL_AVC_21: return 4000 * brFactor; case MFX_LEVEL_AVC_22: return 4000 * brFactor; case MFX_LEVEL_AVC_3 : return 10000 * brFactor; case MFX_LEVEL_AVC_31: return 14000 * brFactor; case MFX_LEVEL_AVC_32: return 20000 * brFactor; case MFX_LEVEL_AVC_4 : return 20000 * brFactor; case MFX_LEVEL_AVC_41: return 50000 * brFactor; case MFX_LEVEL_AVC_42: return 50000 * brFactor; case MFX_LEVEL_AVC_5 : return 135000 * brFactor; case MFX_LEVEL_AVC_51: return 240000 * brFactor; case MFX_LEVEL_AVC_52: return 240000 * brFactor; default: assert(!"bad CodecLevel"); return 0; } } mfxU32 GetMaxPerViewBitrate(MfxVideoParam const & par) { mfxU32 brFactor = IsMvcProfile(par.mfx.CodecProfile) ? 1500 : IsAvcHighProfile(par.mfx.CodecProfile) ? 1500 : 1200; mfxU16 level = IsMvcProfile(par.mfx.CodecProfile) ? par.calcParam.mvcPerViewPar.codecLevel : par.mfx.CodecLevel; if (level == MFX_LEVEL_UNKNOWN) level = MFX_LEVEL_AVC_52; switch (level) { case MFX_LEVEL_AVC_1 : return 64 * brFactor; case MFX_LEVEL_AVC_1b: return 128 * brFactor; case MFX_LEVEL_AVC_11: return 192 * brFactor; case MFX_LEVEL_AVC_12: return 384 * brFactor; case MFX_LEVEL_AVC_13: return 768 * brFactor; case MFX_LEVEL_AVC_2 : return 2000 * brFactor; case MFX_LEVEL_AVC_21: return 4000 * brFactor; case MFX_LEVEL_AVC_22: return 4000 * brFactor; case MFX_LEVEL_AVC_3 : return 10000 * brFactor; case MFX_LEVEL_AVC_31: return 14000 * brFactor; case MFX_LEVEL_AVC_32: return 20000 * brFactor; case MFX_LEVEL_AVC_4 : return 20000 * brFactor; case MFX_LEVEL_AVC_41: return 50000 * brFactor; case MFX_LEVEL_AVC_42: return 50000 * brFactor; case MFX_LEVEL_AVC_5 : return 135000 * brFactor; case MFX_LEVEL_AVC_51: return 240000 * brFactor; case MFX_LEVEL_AVC_52: return 240000 * brFactor; default: assert(!"bad CodecLevel"); return 0; } } mfxU32 GetMaxBufferSize(mfxVideoParam const & par) { mfxU32 brFactor = IsAvcHighProfile(par.mfx.CodecProfile) ? 1500 : 1200; mfxU16 level = par.mfx.CodecLevel; if (level == MFX_LEVEL_UNKNOWN) level = MFX_LEVEL_AVC_52; switch (level) { case MFX_LEVEL_AVC_1 : return 175 * brFactor; case MFX_LEVEL_AVC_1b: return 350 * brFactor; case MFX_LEVEL_AVC_11: return 500 * brFactor; case MFX_LEVEL_AVC_12: return 1000 * brFactor; case MFX_LEVEL_AVC_13: return 2000 * brFactor; case MFX_LEVEL_AVC_2 : return 2000 * brFactor; case MFX_LEVEL_AVC_21: return 4000 * brFactor; case MFX_LEVEL_AVC_22: return 4000 * brFactor; case MFX_LEVEL_AVC_3 : return 10000 * brFactor; case MFX_LEVEL_AVC_31: return 14000 * brFactor; case MFX_LEVEL_AVC_32: return 20000 * brFactor; case MFX_LEVEL_AVC_4 : return 25000 * brFactor; case MFX_LEVEL_AVC_41: return 62500 * brFactor; case MFX_LEVEL_AVC_42: return 62500 * brFactor; case MFX_LEVEL_AVC_5 : return 135000 * brFactor; case MFX_LEVEL_AVC_51: return 240000 * brFactor; case MFX_LEVEL_AVC_52: return 240000 * brFactor; default: assert(!"bad CodecLevel"); return 0; } } mfxU32 GetMaxPerViewBufferSize(MfxVideoParam const & par) { mfxU32 brFactor = IsMvcProfile(par.mfx.CodecProfile) ? 1500 : IsAvcHighProfile(par.mfx.CodecProfile) ? 1500 : 1200; mfxU16 level = IsMvcProfile(par.mfx.CodecProfile) ? par.calcParam.mvcPerViewPar.codecLevel : par.mfx.CodecLevel; if (level == MFX_LEVEL_UNKNOWN) level = MFX_LEVEL_AVC_52; switch (level) { case MFX_LEVEL_AVC_1 : return 175 * brFactor; case MFX_LEVEL_AVC_1b: return 350 * brFactor; case MFX_LEVEL_AVC_11: return 500 * brFactor; case MFX_LEVEL_AVC_12: return 1000 * brFactor; case MFX_LEVEL_AVC_13: return 2000 * brFactor; case MFX_LEVEL_AVC_2 : return 2000 * brFactor; case MFX_LEVEL_AVC_21: return 4000 * brFactor; case MFX_LEVEL_AVC_22: return 4000 * brFactor; case MFX_LEVEL_AVC_3 : return 10000 * brFactor; case MFX_LEVEL_AVC_31: return 14000 * brFactor; case MFX_LEVEL_AVC_32: return 20000 * brFactor; case MFX_LEVEL_AVC_4 : return 25000 * brFactor; case MFX_LEVEL_AVC_41: return 62500 * brFactor; case MFX_LEVEL_AVC_42: return 62500 * brFactor; case MFX_LEVEL_AVC_5 : return 135000 * brFactor; case MFX_LEVEL_AVC_51: return 240000 * brFactor; case MFX_LEVEL_AVC_52: return 240000 * brFactor; default: assert(!"bad CodecLevel"); return 0; } } mfxU32 GetMaxMbps(mfxVideoParam const & par) { switch (par.mfx.CodecLevel) { case MFX_LEVEL_AVC_1 : case MFX_LEVEL_AVC_1b: return 1485; case MFX_LEVEL_AVC_11: return 3000; case MFX_LEVEL_AVC_12: return 6000; case MFX_LEVEL_AVC_13: case MFX_LEVEL_AVC_2 : return 11800; case MFX_LEVEL_AVC_21: return 19800; case MFX_LEVEL_AVC_22: return 20250; case MFX_LEVEL_AVC_3 : return 40500; case MFX_LEVEL_AVC_31: return 108000; case MFX_LEVEL_AVC_32: return 216000; case MFX_LEVEL_AVC_4 : case MFX_LEVEL_AVC_41: return 245760; case MFX_LEVEL_AVC_42: return 522240; case MFX_LEVEL_AVC_5 : return 589824; case MFX_LEVEL_AVC_51: return 983040; case MFX_LEVEL_AVC_52: return 2073600; default: assert(!"bad CodecLevel"); return 0; } } mfxU32 GetMinCr(mfxU32 level) { return level >= MFX_LEVEL_AVC_31 && level <= MFX_LEVEL_AVC_42 ? 4 : 2; // AVCHD spec requires MinCR = 4 for levels 4.1, 4.2 } mfxU32 GetFirstMaxFrameSize(mfxVideoParam const & par) { mfxU32 picSizeInMbs = par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256; return 384 * std::max(picSizeInMbs, GetMaxMbps(par) / 172) / GetMinCr(par.mfx.CodecLevel); } mfxU32 GetMaxFrameSize(mfxVideoParam const & par) { mfxF64 frameRate = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; return mfxU32(384 * GetMaxMbps(par) / frameRate / GetMinCr(par.mfx.CodecLevel)); } mfxStatus CheckMaxFrameSize(MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps) { mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(par); if (extOpt2.MaxFrameSize == 0 && extOpt3.MaxFrameSizeI == 0 && extOpt3.MaxFrameSizeP == 0) return MFX_ERR_NONE; bool changed = false; bool unsupported = false; bool IsEnabledSwBrc = false; #if defined(MFX_ENABLE_EXT_BRC) IsEnabledSwBrc = isSWBRC(par); #else IsEnabledSwBrc = bRateControlLA(par.mfx.RateControlMethod); #endif if ((par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) || // max frame size supported only for VBR based methods (hwCaps.ddi_caps.UserMaxFrameSizeSupport == 0 && !IsEnabledSwBrc)) { if (extOpt2.MaxFrameSize != 0 || extOpt3.MaxFrameSizeI != 0 || extOpt3.MaxFrameSizeP != 0) changed = true; extOpt2.MaxFrameSize = 0; extOpt3.MaxFrameSizeI = 0; extOpt3.MaxFrameSizeP = 0; } else { if (par.calcParam.cqpHrdMode == 0 && par.calcParam.targetKbps != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxF64 frameRate = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; mfxU32 avgFrameSizeInBytes = par.calcParam.TCBRCTargetFrameSize ? par.calcParam.TCBRCTargetFrameSize : mfxU32(par.calcParam.targetKbps * 1000 / frameRate / 8); if ((extOpt2.MaxFrameSize < avgFrameSizeInBytes) && (extOpt2.MaxFrameSize != 0)) { changed = true; extOpt2.MaxFrameSize = 0; } if ((extOpt3.MaxFrameSizeI < avgFrameSizeInBytes) && (extOpt3.MaxFrameSizeI != 0)) { changed = true; extOpt3.MaxFrameSizeI = 0; extOpt3.MaxFrameSizeP = 0; } } if ((extOpt2.MaxFrameSize != 0 && extOpt3.MaxFrameSizeI != 0) && extOpt3.MaxFrameSizeI != extOpt2.MaxFrameSize) { extOpt2.MaxFrameSize = 0; changed = true; } if (extOpt3.MaxFrameSizeI == 0 && extOpt3.MaxFrameSizeP != 0) { extOpt3.MaxFrameSizeP = 0; unsupported = true; } } if (extOpt3.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING && (extOpt2.MaxFrameSize != 0 || extOpt3.MaxFrameSizeI != 0 || extOpt3.MaxFrameSizeP != 0 )) { changed = true; extOpt2.MaxFrameSize = 0; extOpt3.MaxFrameSizeI = 0; extOpt3.MaxFrameSizeP = 0; } if (!CheckTriStateOption(extOpt3.AdaptiveMaxFrameSize)) changed = true; if(!hwCaps.AdaptiveMaxFrameSizeSupport && IsOn(extOpt3.AdaptiveMaxFrameSize)) { extOpt3.AdaptiveMaxFrameSize = MFX_CODINGOPTION_UNKNOWN; unsupported = true; } if (hwCaps.ddi_caps.UserMaxFrameSizeSupport == 0 && !IsEnabledSwBrc && IsOn(extOpt3.AdaptiveMaxFrameSize)) { extOpt3.AdaptiveMaxFrameSize = MFX_CODINGOPTION_UNKNOWN; unsupported = true; } if (hwCaps.ddi_caps.UserMaxFrameSizeSupport == 1 && !IsEnabledSwBrc && (extOpt3.MaxFrameSizeP == 0 || IsOn(par.mfx.LowPower)) && IsOn(extOpt3.AdaptiveMaxFrameSize)) { extOpt3.AdaptiveMaxFrameSize = MFX_CODINGOPTION_UNKNOWN; changed = true; } return unsupported ? MFX_ERR_UNSUPPORTED : (changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE); } mfxU32 GetMaxVmv(mfxU32 level) { switch (level) { case MFX_LEVEL_AVC_1 : case MFX_LEVEL_AVC_1b: return 64; case MFX_LEVEL_AVC_11: case MFX_LEVEL_AVC_12: case MFX_LEVEL_AVC_13: case MFX_LEVEL_AVC_2 : return 128; case MFX_LEVEL_AVC_21: case MFX_LEVEL_AVC_22: case MFX_LEVEL_AVC_3 : return 256; case MFX_LEVEL_AVC_31: case MFX_LEVEL_AVC_32: case MFX_LEVEL_AVC_4 : case MFX_LEVEL_AVC_41: case MFX_LEVEL_AVC_42: case MFX_LEVEL_AVC_5 : case MFX_LEVEL_AVC_51: case MFX_LEVEL_AVC_52: return 512; default: assert(!"bad CodecLevel"); return 0; } } mfxU16 GetDefaultAsyncDepth(MfxVideoParam const & par) { // mfxExtCodingOption2 const * extOpt2 = GetExtBuffer(par); if (par.mfx.EncodedOrder) return 1; //if (IsOn(extOpt2->ExtBRC)) // return 1; mfxU32 picSize = par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height; if (picSize < 200000) return 6; // CIF else if (picSize < 500000) return 5; // SD else if (picSize < 900000) return 4; // between SD and HD else return 3; // HD } mfxU8 GetDefaultPicOrderCount(MfxVideoParam const & par) { if (par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) return 0; if (par.mfx.GopRefDist > 1) return 0; if (par.calcParam.numTemporalLayer > 1) { if (par.mfx.NumRefFrame < par.calcParam.scale[par.calcParam.numTemporalLayer - 2]) return 0; // more than 1 consecutive non-reference frames if (par.calcParam.scale[par.calcParam.numTemporalLayer - 1] / par.calcParam.scale[par.calcParam.numTemporalLayer - 2] > 2) return 0; // more than 1 consecutive non-reference frames } return 2; } mfxU8 GetDefaultLog2MaxPicOrdCntMinus4(MfxVideoParam const & par) { mfxU32 numReorderFrames = GetNumReorderFrames(par); mfxU32 maxPocDiff = (numReorderFrames * par.mfx.GopRefDist + 1) * 2; if (par.calcParam.numTemporalLayer > 0 || par.calcParam.tempScalabilityMode) { mfxU32 maxScale = par.calcParam.scale[par.calcParam.numTemporalLayer - 1]; // for tempScalabilityMode number of temporal layers should be changed dynamically w/o IDR insertion // to assure this first SPS in bitstream should contain maximum possible log2_max_frame_num_minus4 if (par.calcParam.tempScalabilityMode) maxScale = 8; // 8 is maximum scale for 4 temporal layers maxPocDiff = std::max(maxPocDiff, 2 * maxScale); } mfxU32 log2MaxPoc = CeilLog2(2 * maxPocDiff - 1); return mfxU8(std::max(log2MaxPoc, 4u) - 4); } mfxU16 GetDefaultNumRefFrames(mfxU32 targetUsage, eMFXHWType platform) { mfxU16 const DEFAULT_BY_TU[][8] = { { 0, 3, 3, 3, 2, 1, 1, 1 }, { 0, 2, 2, 2, 2, 2, 2, 2 } }; if (H264ECaps::IsAltRefSupported(platform)) return DEFAULT_BY_TU[1][targetUsage]; return DEFAULT_BY_TU[0][targetUsage]; } mfxU16 GetMaxNumRefActivePL0(mfxU32 targetUsage, eMFXHWType platform, bool isLowPower, const mfxFrameInfo& info) { constexpr mfxU16 DEFAULT_BY_TU[][8] = { { 0, 8, 6, 3, 3, 3, 1, 1 }, // VME progressive < 4k or interlaced { 0, 4, 4, 3, 3, 3, 1, 1 }, // VME progressive >= 4k { 0, 3, 3, 2, 2, 2, 1, 1 } // VDEnc }; if (!isLowPower) { if ((info.Width < 3840 && info.Height < 2160) || (info.PicStruct != MFX_PICSTRUCT_PROGRESSIVE)) { return DEFAULT_BY_TU[0][targetUsage]; } else //progressive >= 4K { return DEFAULT_BY_TU[1][targetUsage]; } } else { if (H264ECaps::IsAltRefSupported(platform)) return 3; return DEFAULT_BY_TU[2][targetUsage]; } } mfxU16 GetDefaultNumRefActivePL0(const mfxInfoMFX& mfx, eMFXHWType platform) { if (H264ECaps::IsAltRefSupported(platform)) { constexpr mfxU16 DEFAULT_BY_TU[][8] = { { 0, 2, 2, 2, 2, 2, 1, 1 }, // without B refs { 0, 2, 2, 2, 2, 2, 2, 2 } // with B refs }; return DEFAULT_BY_TU[mfx.GopRefDist > 2][mfx.TargetUsage]; } return GetMaxNumRefActivePL0(mfx.TargetUsage, platform, IsOn(mfx.LowPower), mfx.FrameInfo); } mfxU16 GetMaxNumRefActiveBL0(mfxU32 targetUsage, eMFXHWType /*platform*/, bool isLowPower) { if (!isLowPower) { constexpr mfxU16 DEFAULT_BY_TU[][8] = { { 0, 4, 4, 2, 2, 2, 1, 1 } }; return DEFAULT_BY_TU[0][targetUsage]; } else { return 1; } } mfxU16 GetDefaultNumRefActiveBL0(const mfxInfoMFX& mfx, eMFXHWType platform) { return GetMaxNumRefActiveBL0(mfx.TargetUsage, platform, IsOn(mfx.LowPower)); } mfxU16 GetMaxNumRefActiveBL1(mfxU32 targetUsage, mfxU16 picStruct, bool isLowPower) { if (picStruct != MFX_PICSTRUCT_PROGRESSIVE && !isLowPower) { constexpr mfxU16 DEFAULT_BY_TU[] = { 0, 2, 2, 2, 2, 2, 1, 1 }; return DEFAULT_BY_TU[targetUsage]; } else { return 1; } } mfxU16 GetDefaultNumRefActiveBL1(const mfxInfoMFX& mfx, eMFXHWType /*platform*/) { return GetMaxNumRefActiveBL1(mfx.TargetUsage, mfx.FrameInfo.PicStruct, IsOn(mfx.LowPower)); } mfxU16 GetDefaultIntraPredBlockSize( MfxVideoParam const & par) { mfxU8 minTUForTransform8x8 = 7; return (IsAvcBaseProfile(par.mfx.CodecProfile) || par.mfx.CodecProfile == MFX_PROFILE_AVC_MAIN || par.mfx.TargetUsage > minTUForTransform8x8) ? mfxU16(MFX_BLOCKSIZE_MIN_16X16) : mfxU16(MFX_BLOCKSIZE_MIN_4X4); } mfxU32 GetCpbSizeValue(mfxU32 kbyte, mfxU32 scale) { return (8000 * kbyte) >> (4 + scale); } mfxU32 GetMaxCodedFrameSizeInKB(MfxVideoParam const & par) { mfxU64 mvcMultiplier = 1; const mfxU32 maxMBBytes = 3200 / 8; if (IsMvcProfile(par.mfx.CodecProfile)) { mfxExtMVCSeqDesc const & extMvc = GetExtBufferRef(par); mfxExtCodingOption const & extOpt = GetExtBufferRef(par); if (extOpt.ViewOutput != MFX_CODINGOPTION_ON) // in case of ViewOutput bitstream should contain one view (not all views) mvcMultiplier = extMvc.NumView ? extMvc.NumView : 1; } return mfxU32(std::min(UINT_MAX, size_t(par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height * mvcMultiplier / (16u * 16u) * maxMBBytes + 999u) / 1000u)); } mfxU32 CheckAgreementOfFrameRate( FunctionQuery, mfxU32 & frameRateExtN, mfxU32 & frameRateExtD, mfxU32 timeScale, mfxU32 numUnitsInTick) { if (frameRateExtN != 0 && frameRateExtD != 0 && mfxU64(frameRateExtN) * numUnitsInTick * 2 != mfxU64(frameRateExtD) * timeScale) { frameRateExtN = timeScale; frameRateExtD = numUnitsInTick * 2; return 1; } return 0; } mfxU32 CheckAgreementOfFrameRate( FunctionInit, mfxU32 & frameRateExtN, mfxU32 & frameRateExtD, mfxU32 timeScale, mfxU32 numUnitsInTick) { if (frameRateExtN == 0 || frameRateExtD == 0) { frameRateExtN = timeScale; frameRateExtD = numUnitsInTick * 2; return 0; // initialized, no error } else if (mfxU64(frameRateExtN) * numUnitsInTick * 2 != mfxU64(frameRateExtD) * timeScale) { frameRateExtN = timeScale; frameRateExtD = numUnitsInTick * 2; return 1; // modified } else { return 0; // equal, no error } } inline mfxU16 FlagToTriState(mfxU16 flag) { return flag ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); } template bool CheckAgreementOfSequenceLevelParameters(MfxVideoParam & par, mfxExtSpsHeader const & sps) { mfxU32 changed = 0; mfxFrameInfo & fi = par.mfx.FrameInfo; mfxExtCodingOption & extOpt = GetExtBufferRef(par); mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(par); TFunc f; changed |= CheckAgreement(f, par.mfx.CodecProfile, sps.profileIdc); changed |= CheckAgreement(f, par.mfx.CodecLevel, sps.levelIdc); changed |= CheckAgreement(f, par.mfx.NumRefFrame, sps.maxNumRefFrames); changed |= CheckAgreement(f, fi.ChromaFormat, sps.chromaFormatIdc); mfxU16 const cropUnitX = CROP_UNIT_X[fi.ChromaFormat]; mfxU16 const cropUnitY = CROP_UNIT_Y[fi.ChromaFormat] * (2 - sps.frameMbsOnlyFlag); changed |= CheckAgreement(f, fi.Width, mfxU16(16 * (sps.picWidthInMbsMinus1 + 1))); changed |= CheckAgreement(f, fi.Height, mfxU16(16 * (sps.picHeightInMapUnitsMinus1 + 1) * (2 - sps.frameMbsOnlyFlag))); changed |= CheckAgreement(f, fi.PicStruct, mfxU16(sps.frameMbsOnlyFlag ? mfxU16(MFX_PICSTRUCT_PROGRESSIVE) : fi.PicStruct)); changed |= CheckAgreement(f, fi.CropX, mfxU16(sps.frameCropLeftOffset * cropUnitX)); changed |= CheckAgreement(f, fi.CropY, mfxU16(sps.frameCropTopOffset * cropUnitY)); changed |= CheckAgreement(f, fi.CropW, mfxU16(fi.Width - (sps.frameCropLeftOffset + sps.frameCropRightOffset) * cropUnitX)); changed |= CheckAgreement(f, fi.CropH, mfxU16(fi.Height - (sps.frameCropTopOffset + sps.frameCropBottomOffset) * cropUnitY)); mfxU16 disableVui = FlagToTriState(!sps.vuiParametersPresentFlag); changed |= CheckAgreement(f, extOpt2.DisableVUI, disableVui); mfxU16 aspectRatioPresent = FlagToTriState(sps.vui.flags.aspectRatioInfoPresent); mfxU16 timingInfoPresent = FlagToTriState(sps.vui.flags.timingInfoPresent); mfxU16 overscanInfoPresent = FlagToTriState(sps.vui.flags.overscanInfoPresent); mfxU16 bitstreamRestriction = FlagToTriState(sps.vui.flags.bitstreamRestriction); changed |= CheckAgreement(f, extOpt3.AspectRatioInfoPresent, aspectRatioPresent); changed |= CheckAgreement(f, extOpt3.TimingInfoPresent, timingInfoPresent); changed |= CheckAgreement(f, extOpt3.OverscanInfoPresent, overscanInfoPresent); changed |= CheckAgreement(f, extOpt3.BitstreamRestriction, bitstreamRestriction); if (sps.vuiParametersPresentFlag) { if (sps.vui.flags.timingInfoPresent) { mfxU16 fixedFrameRate = FlagToTriState(sps.vui.flags.fixedFrameRate); changed |= CheckAgreement(f, extOpt2.FixedFrameRate, fixedFrameRate); changed |= CheckAgreementOfFrameRate(f, fi.FrameRateExtN, fi.FrameRateExtD, sps.vui.timeScale, sps.vui.numUnitsInTick); } if (sps.vui.flags.aspectRatioInfoPresent) { AspectRatioConverter arConv(sps.vui.aspectRatioIdc, sps.vui.sarWidth, sps.vui.sarHeight); changed |= CheckAgreement(f, fi.AspectRatioW, arConv.GetSarWidth()); changed |= CheckAgreement(f, fi.AspectRatioH, arConv.GetSarHeight()); } if (sps.vui.flags.nalHrdParametersPresent) { mfxU16 rcmethod = sps.vui.nalHrdParameters.cbrFlag[0] ? mfxU16(MFX_RATECONTROL_CBR) : mfxU16(MFX_RATECONTROL_VBR); mfxU16 maxkbps = mfxU16((( (sps.vui.nalHrdParameters.bitRateValueMinus1[0] + 1) << (6 + sps.vui.nalHrdParameters.bitRateScale)) + 999) / 1000); mfxU16 buffersize = mfxU16((((sps.vui.nalHrdParameters.cpbSizeValueMinus1[0] + 1) << (4 + sps.vui.nalHrdParameters.cpbSizeScale)) + 7999) / 8000); mfxU16 lowDelayHrd = FlagToTriState(sps.vui.flags.lowDelayHrd); changed |= CheckAgreement(f, par.mfx.RateControlMethod, rcmethod); changed |= CheckAgreement(f, par.calcParam.maxKbps, maxkbps); changed |= CheckAgreement(f, par.calcParam.bufferSizeInKB, buffersize); changed |= CheckAgreement(f, extOpt3.LowDelayHrd, lowDelayHrd); } } mfxU16 picTimingSei = sps.vui.flags.picStructPresent ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); mfxU16 vuiNalHrdParameters = sps.vui.flags.nalHrdParametersPresent ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); mfxU16 vuiVclHrdParameters = sps.vui.flags.vclHrdParametersPresent ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); if (sps.vui.flags.bitstreamRestriction) changed |= CheckAgreement(f, extOpt.MaxDecFrameBuffering, sps.vui.maxDecFrameBuffering); changed |= CheckAgreement(f, extOpt.PicTimingSEI, picTimingSei); changed |= CheckAgreement(f, extOpt.VuiNalHrdParameters, vuiNalHrdParameters); changed |= CheckAgreement(f, extOpt.VuiVclHrdParameters, vuiVclHrdParameters); return changed == 0; } template bool CheckAgreementOfPictureLevelParameters(mfxVideoParam & par, mfxExtPpsHeader const & pps) { mfxU32 changed = 0; mfxExtCodingOption * extOpt = GetExtBuffer(par); mfxU16 intraPredBlockSize = pps.transform8x8ModeFlag ? mfxU16(MFX_BLOCKSIZE_MIN_8X8) : mfxU16(MFX_BLOCKSIZE_MIN_16X16); mfxU16 cavlc = pps.entropyCodingModeFlag ? mfxU16(MFX_CODINGOPTION_OFF) : mfxU16(MFX_CODINGOPTION_ON); TFunc f; changed |= CheckAgreement(f, extOpt->IntraPredBlockSize, intraPredBlockSize); changed |= CheckAgreement(f, extOpt->CAVLC, cavlc); return changed == 0; } template void InheritOption(T optInit, T & optReset) { if (optReset == 0) optReset = optInit; } } mfxU32 MfxHwH264Encode::CalcNumSurfRaw(MfxVideoParam const & video) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); return video.AsyncDepth + video.mfx.GopRefDist - 1 + std::max(1u, mfxU32(extOpt2.LookAheadDepth)) + (video.AsyncDepth - 1) + (IsOn(extOpt2.UseRawRef) ? video.mfx.NumRefFrame : 0) + ((extOpt2.MaxSliceSize != 0 || IsOn(extOpt3.FadeDetection)) ? 1 : 0); } mfxU32 MfxHwH264Encode::CalcNumSurfRecon(MfxVideoParam const & video) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); if (IsOn(extOpt2.UseRawRef)) return video.mfx.NumRefFrame + (video.AsyncDepth - 1) + (video.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY ? video.mfx.GopRefDist : 1); else return video.mfx.NumRefFrame + video.AsyncDepth; } mfxU32 MfxHwH264Encode::CalcNumSurfBitstream(MfxVideoParam const & video) { return (IsFieldCodingPossible(video) ? video.AsyncDepth * 2 : video.AsyncDepth); } mfxU16 MfxHwH264Encode::GetMaxNumSlices(MfxVideoParam const & par) { mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(par); return std::max({extOpt3.NumSliceI, extOpt3.NumSliceP, extOpt3.NumSliceB}); } mfxU8 MfxHwH264Encode::GetNumReorderFrames(MfxVideoParam const & video) { mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(video); mfxU8 numReorderFrames = video.mfx.GopRefDist > 1 ? 1 : 0; if (video.mfx.GopRefDist > 2 && extOpt2.BRefType == MFX_B_REF_PYRAMID) { numReorderFrames = (mfxU8)std::max(CeilLog2(video.mfx.GopRefDist - 1), 1u); } return numReorderFrames; } mfxU32 MfxHwH264Encode::CalcNumTasks(MfxVideoParam const & video) { assert(video.mfx.GopRefDist > 0); assert(video.AsyncDepth > 0); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); return video.mfx.GopRefDist + (video.AsyncDepth - 1) + std::max(1u, mfxU32(extOpt2.LookAheadDepth)) + (IsOn(extOpt2.UseRawRef) ? video.mfx.NumRefFrame : 0); } mfxI64 MfxHwH264Encode::CalcDTSFromPTS( mfxFrameInfo const & info, mfxU16 dpbOutputDelay, mfxU64 timeStamp) { if (timeStamp != static_cast(MFX_TIMESTAMP_UNKNOWN)) { mfxF64 tcDuration90KHz = (mfxF64)info.FrameRateExtD / (info.FrameRateExtN * 2) * 90000; // calculate tick duration return mfxI64(timeStamp - tcDuration90KHz * dpbOutputDelay); // calculate DTS from PTS } return MFX_TIMESTAMP_UNKNOWN; } mfxU32 MfxHwH264Encode::GetMaxBitrateValue(mfxU32 kbps, mfxU32 scale) { return (1000 * kbps) >> (6 + scale); } mfxU8 MfxHwH264Encode::GetCabacInitIdc(mfxU32 targetUsage) { assert(targetUsage >= 1); assert(targetUsage <= 7); (void)targetUsage; //const mfxU8 CABAC_INIT_IDC_TABLE[] = { 0, 2, 2, 1, 0, 0, 0, 0 }; return 0; //return CABAC_INIT_IDC_TABLE[targetUsage]; } mfxU32 MfxHwH264Encode::GetPPyrSize(MfxVideoParam const & video, mfxU32 miniGopSize, bool bEncToolsLA) { mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(video); mfxU32 pyrSize = 1; if (video.mfx.GopRefDist == 1 && extOpt3.PRefType == MFX_P_REF_PYRAMID && !IsOn(extOpt3.ExtBrcAdaptiveLTR) && extDdi.NumActiveRefP != 1) { if (bEncToolsLA) pyrSize = (miniGopSize <= 1) ? 1 : 4; else pyrSize = DEFAULT_PPYR_INTERVAL; } return pyrSize; } bool MfxHwH264Encode::IsExtBrcSceneChangeSupported( MfxVideoParam const & video, eMFXHWType platform) { bool extbrcsc = false; // extbrc API change dependency mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); extbrcsc = (H264ECaps::IsVmeSupported(platform) && IsOn(extOpt2.ExtBRC) && (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR) && (video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && !video.mfx.EncodedOrder && extOpt2.LookAheadDepth == 0); return extbrcsc; } bool MfxHwH264Encode::IsCmNeededForSCD( MfxVideoParam const & video) { bool useCm = false; // If frame in Sys memory then Cm is not needed useCm = !(video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY); return useCm; } bool MfxHwH264Encode::IsDenoiserSupported( MfxVideoParam const & video, eMFXHWType platform) { (void)video; bool isSupported = false; #if defined(MFX_ENABLE_MCTF_IN_AVC) auto isDenoiserInPipeSupported = (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR ||video.mfx.RateControlMethod == MFX_RATECONTROL_VBR || video.mfx.RateControlMethod == MFX_RATECONTROL_CQP) && ((video.mfx.FrameInfo.FourCC == MFX_FOURCC_NV12) ||(video.mfx.FrameInfo.FourCC == MFX_FOURCC_YV12)) && (video.mfx.FrameInfo.BitDepthLuma == 0 || video.mfx.FrameInfo.BitDepthLuma == 8) && (video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && (video.mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV420) && !video.mfx.EncodedOrder; mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); auto isMCTFsupported = (video.mfx.FrameInfo.Width <= 3840) && (video.vpp.In.Height <= 2160) && (video.mfx.GopRefDist == 8) && IsOn(extOpt2.ExtBRC) && IsExtBrcSceneChangeSupported(video, platform); isSupported = isDenoiserInPipeSupported && (isMCTFsupported ); #endif return isSupported; } bool MfxHwH264Encode::IsAdaptiveLtrOn( MfxVideoParam const & video) { bool altr = false; mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); altr = IsOn(extOpt3.ExtBrcAdaptiveLTR); return altr; } // determine and return mode of Query operation (valid modes are 1, 2, 3, 4 - see MSDK spec for details) mfxU8 MfxHwH264Encode::DetermineQueryMode(mfxVideoParam * in) { if (in == 0) return 1; else { mfxExtEncoderCapability * caps = GetExtBuffer(*in); mfxExtEncoderResetOption * resetOpt = GetExtBuffer(*in); if (caps) { if (resetOpt) { // attached mfxExtEncoderCapability indicates mode 4. In this mode mfxExtEncoderResetOption shouldn't be attached return 0; } // specific mode to notify encoder to check guid only if (0x667 == caps->reserved[0]) { return 5; } return 4; }else if (resetOpt) return 3; else return 2; } } /* Setting default value for LowPower option. By default LowPower is OFF (using DualPipe) For platforms that hasn't VME: use LowPower by default i.e. if LowPower is Unknown then LowPower is ON Return value: MFX_WRN_INCOMPATIBLE_VIDEO_PARAM - if initial value of par.mfx.LowPower is not equal to MFX_CODINGOPTION_ON, MFX_CODINGOPTION_OFF or MFX_CODINGOPTION_UNKNOWN MFX_ERR_NONE - if no errors */ mfxStatus MfxHwH264Encode::SetLowPowerDefault(MfxVideoParam& par, const eMFXHWType& platform) { mfxStatus sts = CheckTriStateOption(par.mfx.LowPower) ? MFX_ERR_NONE : MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (!H264ECaps::IsVmeSupported(platform)) { // DualPipe (aka VME) is not available par.mfx.LowPower = MFX_CODINGOPTION_ON; return sts; } // By default, platforms with 2 encoders (VDEnc & VME) will use VME // Therefore, garbage & UNKNOWN values will be overridden to OFF SetDefaultOff(par.mfx.LowPower); return sts; } /* Return cached caps if they are. Select GUID depends on LowPower option. creates AuxilliaryDevice request and cache EncodercCaps Return value: MFX_ERR_UNDEFINED_BEHAVIOR - failed to get EncodeHWCaps iterface from Core MFX_ERR_DEVICE_FAILED failed to create DDIEncoder/AuxilliaryDevice of requestcaps call fails MFX_ERR_NONE - if no errors */ mfxStatus MfxHwH264Encode::QueryHwCaps(VideoCORE* core, MFX_ENCODE_CAPS & hwCaps, mfxVideoParam * par) { GUID guid = MSDK_Private_Guid_Encode_AVC_Query; if(IsOn(par->mfx.LowPower)) { guid = MSDK_Private_Guid_Encode_AVC_LowPower_Query; } mfxU32 width = par->mfx.FrameInfo.Width == 0 ? 1920: par->mfx.FrameInfo.Width; mfxU32 height = par->mfx.FrameInfo.Height == 0 ? 1088: par->mfx.FrameInfo.Height; EncodeHWCaps* pEncodeCaps = QueryCoreInterface(core); if (!pEncodeCaps) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } else { if (pEncodeCaps->GetHWCaps(guid, &hwCaps) == MFX_ERR_NONE) return MFX_ERR_NONE; } std::unique_ptr ddi; ddi.reset(CreatePlatformH264Encoder(core)); if (ddi.get() == 0) return Error(MFX_ERR_DEVICE_FAILED); mfxStatus sts = ddi->CreateAuxilliaryDevice(core, guid, width, height, true); MFX_CHECK_STS(sts); sts = ddi->QueryEncodeCaps(hwCaps); MFX_CHECK_STS(sts); return pEncodeCaps->SetHWCaps(guid, &hwCaps); } mfxStatus MfxHwH264Encode::QueryMbProcRate(VideoCORE* core, mfxVideoParam const & par, mfxU32 (&mbPerSec)[16], const mfxVideoParam * in) { mfxU32 width = in->mfx.FrameInfo.Width == 0 ? 1920: in->mfx.FrameInfo.Width; mfxU32 height = in->mfx.FrameInfo.Height == 0 ? 1088: in->mfx.FrameInfo.Height; GUID guid = MSDK_Private_Guid_Encode_AVC_Query; if(IsOn(in->mfx.LowPower)) guid = MSDK_Private_Guid_Encode_AVC_LowPower_Query; EncodeHWCaps* pEncodeCaps = QueryCoreInterface(core, MFXIHWMBPROCRATE_GUID); if (!pEncodeCaps) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } else { if (pEncodeCaps->GetHWCaps(guid, mbPerSec, 16) == MFX_ERR_NONE && mbPerSec[(par.mfx.TargetUsage?par.mfx.TargetUsage:4) - 1] != 0) //check if MbPerSec for particular TU was already queried or need to save return MFX_ERR_NONE; } std::unique_ptr ddi; ddi.reset(CreatePlatformH264Encoder(core)); if (ddi.get() == 0) return Error(MFX_ERR_DEVICE_FAILED); mfxStatus sts = ddi->CreateAuxilliaryDevice(core, guid, width, height, true); MFX_CHECK_STS(sts); mfxU32 tempMbPerSec[16] = {0, }; sts = ddi->QueryMbPerSec(par, tempMbPerSec); MFX_CHECK_STS(sts); mbPerSec[(par.mfx.TargetUsage?par.mfx.TargetUsage:4) - 1] = tempMbPerSec[0]; return pEncodeCaps->SetHWCaps(guid, mbPerSec, 16); } mfxStatus MfxHwH264Encode::QueryGuid(VideoCORE* core, GUID guid) { std::unique_ptr ddi; ddi.reset(CreatePlatformH264Encoder(core)); if (ddi.get() == 0) return Error(MFX_ERR_DEVICE_FAILED); return ddi->QueryHWGUID(core, guid, true); } mfxStatus MfxHwH264Encode::ReadSpsPpsHeaders(MfxVideoParam & par) { mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); try { if (extBits.SPSBuffer) { InputBitstream reader(extBits.SPSBuffer, extBits.SPSBufSize); mfxExtSpsHeader & extSps = GetExtBufferRef(par); ReadSpsHeader(reader, extSps); if (extBits.PPSBuffer) { InputBitstream pps_reader(extBits.PPSBuffer, extBits.PPSBufSize); mfxExtPpsHeader & extPps = GetExtBufferRef(par); ReadPpsHeader(pps_reader, extSps, extPps); } } } catch (std::exception &) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxU16 MfxHwH264Encode::GetFrameWidth(MfxVideoParam & par) { mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); if (extBits.SPSBuffer) { mfxExtSpsHeader & extSps = GetExtBufferRef(par); return mfxU16(16 * (extSps.picWidthInMbsMinus1 + 1)); } else { return par.mfx.FrameInfo.Width; } } mfxU16 MfxHwH264Encode::GetFrameHeight(MfxVideoParam & par) { mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); if (extBits.SPSBuffer) { mfxExtSpsHeader & extSps = GetExtBufferRef(par); return mfxU16(16 * (extSps.picHeightInMapUnitsMinus1 + 1) * (2 - extSps.frameMbsOnlyFlag)); } else { return par.mfx.FrameInfo.Height; } } mfxStatus MfxHwH264Encode::CorrectCropping(MfxVideoParam& par) { mfxStatus sts = MFX_ERR_NONE; mfxU16 horzCropUnit = CROP_UNIT_X[par.mfx.FrameInfo.ChromaFormat]; mfxU16 vertCropUnit = CROP_UNIT_Y[par.mfx.FrameInfo.ChromaFormat]; vertCropUnit *= IsFieldCodingPossible(par) ? 2 : 1; mfxU16 misalignment = par.mfx.FrameInfo.CropX & (horzCropUnit - 1); if (misalignment > 0) { par.mfx.FrameInfo.CropX += horzCropUnit - misalignment; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (par.mfx.FrameInfo.CropW >= horzCropUnit - misalignment) par.mfx.FrameInfo.CropW -= horzCropUnit - misalignment; else par.mfx.FrameInfo.CropW = 0; } misalignment = par.mfx.FrameInfo.CropW & (horzCropUnit - 1); if (misalignment > 0) { par.mfx.FrameInfo.CropW = par.mfx.FrameInfo.CropW - misalignment; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } misalignment = par.mfx.FrameInfo.CropY & (vertCropUnit - 1); if (misalignment > 0) { par.mfx.FrameInfo.CropY += vertCropUnit - misalignment; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (par.mfx.FrameInfo.CropH >= vertCropUnit - misalignment) par.mfx.FrameInfo.CropH -= vertCropUnit - misalignment; else par.mfx.FrameInfo.CropH = 0; } misalignment = par.mfx.FrameInfo.CropH & (vertCropUnit - 1); if (misalignment > 0) { par.mfx.FrameInfo.CropH = par.mfx.FrameInfo.CropH - misalignment; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return sts; } bool MfxHwH264Encode::IsRunTimeOnlyExtBuffer(mfxU32 id) { return id == MFX_EXTBUFF_AVC_REFLIST_CTRL #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) || id == MFX_EXTBUFF_AVC_ROUNDING_OFFSET #endif #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) || id == MFX_EXTBUFF_GPU_HANG #endif || id == MFX_EXTBUFF_ENCODED_FRAME_INFO || id == MFX_EXTBUFF_MBQP #if defined (MFX_ENABLE_H264_PRIVATE_CTRL) || id == MFX_EXTBUFF_AVC_ENCODE_CTRL #endif || id == MFX_EXTBUFF_MB_FORCE_INTRA || id == MFX_EXTBUFF_MB_DISABLE_SKIP_MAP #ifndef MFX_AVC_ENCODING_UNIT_DISABLE || id == MFX_EXTBUFF_ENCODED_UNITS_INFO #endif ; } bool MfxHwH264Encode::IsRunTimeExtBufferIdSupported(MfxVideoParam const & video, mfxU32 id) { (void)video; return (id == MFX_EXTBUFF_AVC_REFLIST_CTRL || id == MFX_EXTBUFF_AVC_REFLISTS #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) || id == MFX_EXTBUFF_AVC_ROUNDING_OFFSET #endif || id == MFX_EXTBUFF_ENCODED_FRAME_INFO || id == MFX_EXTBUFF_PICTURE_TIMING_SEI || id == MFX_EXTBUFF_CODING_OPTION2 || id == MFX_EXTBUFF_CODING_OPTION3 || id == MFX_EXTBUFF_ENCODER_ROI || id == MFX_EXTBUFF_MBQP || id == MFX_EXTBUFF_MOVING_RECTANGLES || id == MFX_EXTBUFF_DIRTY_RECTANGLES || id == MFX_EXTBUFF_MB_FORCE_INTRA || id == MFX_EXTBUFF_MB_DISABLE_SKIP_MAP #if defined (MFX_ENABLE_H264_PRIVATE_CTRL) || id == MFX_EXTBUFF_AVC_ENCODE_CTRL #endif || id == MFX_EXTBUFF_PRED_WEIGHT_TABLE #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) || id == MFX_EXTBUFF_GPU_HANG #endif || id == MFX_EXTBUFF_MULTI_FRAME_CONTROL || id == MFX_EXTBUFF_PICTURE_TIMING_SEI ); } bool MfxHwH264Encode::IsRuntimeOutputExtBufferIdSupported(MfxVideoParam const & video, mfxU32 id) { (void)video; return id == MFX_EXTBUFF_ENCODED_FRAME_INFO #ifndef MFX_AVC_ENCODING_UNIT_DISABLE || id == MFX_EXTBUFF_ENCODED_UNITS_INFO #endif ; } bool MfxHwH264Encode::IsRunTimeExtBufferPairAllowed(MfxVideoParam const & video, mfxU32 id) { (void)video; return (id == MFX_EXTBUFF_AVC_REFLISTS #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) || id == MFX_EXTBUFF_AVC_ROUNDING_OFFSET #endif || id == MFX_EXTBUFF_PICTURE_TIMING_SEI ) ; } bool MfxHwH264Encode::IsRunTimeExtBufferPairRequired(MfxVideoParam const & video, mfxU32 id) { (void)id; (void)video; return false; } bool MfxHwH264Encode::IsVideoParamExtBufferIdSupported(mfxU32 id) { return (id == MFX_EXTBUFF_CODING_OPTION || id == MFX_EXTBUFF_CODING_OPTION_SPSPPS #if defined(__MFXBRC_H__) || id == MFX_EXTBUFF_BRC #endif #if defined(MFX_ENABLE_ENCTOOLS) || id == MFX_EXTBUFF_ENCTOOLS || id == MFX_EXTBUFF_ENCTOOLS_CONFIG || id == MFX_EXTBUFF_ENCTOOLS_DEVICE || id == MFX_EXTBUFF_ENCTOOLS_ALLOCATOR #endif || id == MFX_EXTBUFF_MVC_SEQ_DESC || id == MFX_EXTBUFF_VIDEO_SIGNAL_INFO || id == MFX_EXTBUFF_PICTURE_TIMING_SEI || id == MFX_EXTBUFF_AVC_TEMPORAL_LAYERS || id == MFX_EXTBUFF_CODING_OPTION2 #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE || id == MFX_EXTBUFF_SVC_SEQ_DESC || id == MFX_EXTBUFF_SVC_RATE_CONTROL #endif || id == MFX_EXTBUFF_ENCODER_RESET_OPTION || id == MFX_EXTBUFF_ENCODER_CAPABILITY || id == MFX_EXTBUFF_ENCODER_ROI || id == MFX_EXTBUFF_CODING_OPTION3 || id == MFX_EXTBUFF_CHROMA_LOC_INFO || id == MFX_EXTBUFF_PRED_WEIGHT_TABLE || id == MFX_EXTBUFF_DIRTY_RECTANGLES || id == MFX_EXTBUFF_MOVING_RECTANGLES || id == MFX_EXTBUFF_MULTI_FRAME_PARAM || id == MFX_EXTBUFF_MULTI_FRAME_CONTROL #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) || id == MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM #endif || id == MFX_EXTBUFF_ALLOCATION_HINTS || id == MFX_EXTBUFF_VPP_DENOISE2 ); } mfxStatus MfxHwH264Encode::CheckExtBufferId(mfxVideoParam const & par) { for (mfxU32 i = 0; i < par.NumExtParam; i++) { if (par.ExtParam[i] == 0) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!IsVideoParamExtBufferIdSupported(par.ExtParam[i]->BufferId)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); // check if buffer presents twice in video param { if (mfx::GetExtBuffer( par.ExtParam + i + 1, par.NumExtParam - i - 1, par.ExtParam[i]->BufferId) != 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } } return MFX_ERR_NONE; } namespace { mfxStatus CheckWidthAndHeight(mfxU32 width, mfxU32 height, mfxU32 picStruct) { MFX_CHECK(width > 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(height > 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK((width & 1) == 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK((height & 1) == 0, MFX_ERR_INVALID_VIDEO_PARAM); // repeat flags are for EncodeFrameAsync if (picStruct & MFX_PICSTRUCT_PART2) picStruct = MFX_PICSTRUCT_UNKNOWN; // more then one flag was set if (mfxU32 picStructPart1 = picStruct & MFX_PICSTRUCT_PART1) if (picStructPart1 & (picStructPart1 - 1)) picStruct = MFX_PICSTRUCT_UNKNOWN; if ((picStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0) MFX_CHECK((height & 31) == 0, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } }; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxU32 MfxHwH264Encode::GetLastDid(mfxExtSVCSeqDesc const & extSvc) { mfxI32 i = 7; for (; i >= 0; i--) if (extSvc.DependencyLayer[i].Active) break; return mfxU32(i); } #endif mfxStatus MfxHwH264Encode::CheckWidthAndHeight(MfxVideoParam const & par) { mfxExtCodingOptionSPSPPS const & extBits = GetExtBufferRef(par); if (extBits.SPSBuffer) // width/height/picStruct are always valid // when they come from SPSPPS buffer // no need to check them return MFX_ERR_NONE; mfxU16 width = par.mfx.FrameInfo.Width; mfxU16 height = par.mfx.FrameInfo.Height; mfxU16 picStruct = par.mfx.FrameInfo.PicStruct; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(par.mfx.CodecProfile)) { mfxExtSVCSeqDesc const * extSvc = GetExtBuffer(par); mfxU32 lastDid = GetLastDid(*extSvc); if (lastDid > 7) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); width = extSvc->DependencyLayer[lastDid].Width; height = extSvc->DependencyLayer[lastDid].Height; if (width == 0 || height == 0) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } #endif return ::CheckWidthAndHeight(width, height, picStruct); } mfxStatus MfxHwH264Encode::CopySpsPpsToVideoParam( MfxVideoParam & par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MfxHwH264Encode::CopySpsPpsToVideoParam"); mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); bool changed = false; if (extBits.SPSBuffer) { mfxExtSpsHeader const & extSps = GetExtBufferRef(par); if (!CheckAgreementOfSequenceLevelParameters(par, extSps)) changed = true; } if (extBits.PPSBuffer) { mfxExtPpsHeader const & extPps = GetExtBufferRef(par); if (!CheckAgreementOfPictureLevelParameters(par, extPps)) changed = true; } return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } // check encoding configuration for number of H264 spec violations allowed by MSDK // it's required to report correct status to application mfxStatus MfxHwH264Encode::CheckForAllowedH264SpecViolations( MfxVideoParam const & par) { if (par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_UNKNOWN && par.mfx.CodecLevel > MFX_LEVEL_AVC_41) { return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::CheckVideoParam( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, bool setExtAlloc, eMFXHWType platform, eMFXVAType vaType, eMFXGTConfig config, bool bInit) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MfxHwH264Encode::CheckVideoParam"); mfxStatus checkSts = MFX_ERR_NONE; mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); mfxExtSpsHeader & extSps = GetExtBufferRef(par); mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(par); // first check mandatory parameters MFX_CHECK( extBits.SPSBuffer != 0 || (par.mfx.FrameInfo.Width > 0 && par.mfx.FrameInfo.Height > 0), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK( (extSps.vui.timeScale > 0 && extSps.vui.numUnitsInTick > 0) || (par.mfx.FrameInfo.FrameRateExtN > 0 && par.mfx.FrameInfo.FrameRateExtD > 0), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(par.mfx.TargetUsage <= 7, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(par.mfx.FrameInfo.ChromaFormat != 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(par.IOPattern != 0, MFX_ERR_INVALID_VIDEO_PARAM); #if defined(MFX_ENABLE_EXT_BRC) if (bInit) { mfxExtBRC & extBRC = GetExtBufferRef(par); mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); if ((extBRC.pthis || extBRC.Init || extBRC.Close || extBRC.GetFrameCtrl || extBRC.Update || extBRC.Reset) && (!extBRC.pthis || !extBRC.Init || !extBRC.Close || !extBRC.GetFrameCtrl || !extBRC.Update || !extBRC.Reset)) { extOpt2.ExtBRC = 0; extBRC.pthis = 0; extBRC.Init = 0; extBRC.Close = 0; extBRC.GetFrameCtrl = 0; extBRC.Update = 0; extBRC.Reset = 0; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } #else bInit; #endif mfxStatus sts = MFX_ERR_NONE; if (IsMvcProfile(par.mfx.CodecProfile)) { mfxExtCodingOption & extOpt = GetExtBufferRef(par); mfxExtMVCSeqDesc * extMvc = GetExtBuffer(par); sts = CheckAndFixMVCSeqDesc(extMvc, extOpt.ViewOutput == MFX_CODINGOPTION_ON); if (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts) { checkSts = sts; } else if (sts < MFX_ERR_NONE) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } sts = CheckVideoParamMvcQueryLike(par); // check and correct mvc per-view bitstream, buffer, level switch (sts) { case MFX_ERR_UNSUPPORTED: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); case MFX_ERR_INVALID_VIDEO_PARAM: case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM: return sts; case MFX_WRN_INCOMPATIBLE_VIDEO_PARAM: checkSts = sts; break; default: break; } } sts = CheckVideoParamQueryLike(par, hwCaps, platform, vaType, config); switch (sts) { case MFX_ERR_UNSUPPORTED: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); case MFX_ERR_INVALID_VIDEO_PARAM: case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM: return sts; case MFX_WRN_INCOMPATIBLE_VIDEO_PARAM: checkSts = sts; break; default: break; } if (par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) { MFX_CHECK(setExtAlloc, MFX_ERR_INVALID_VIDEO_PARAM); } auto const supportedMemoryType = (par.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); MFX_CHECK(supportedMemoryType || (par.Protected == 0), MFX_ERR_INVALID_VIDEO_PARAM); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ && par.mfx.RateControlMethod != MFX_RATECONTROL_LA_ICQ #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE && !IsSvcProfile(par.mfx.CodecProfile) #endif ) MFX_CHECK(par.calcParam.targetKbps > 0, MFX_ERR_INVALID_VIDEO_PARAM); if (extOpt3.NumSliceI || extOpt3.NumSliceP || extOpt3.NumSliceB) { // application should set number of slices for all 3 slice types at once MFX_CHECK(extOpt3.NumSliceI > 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(extOpt3.NumSliceP > 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(extOpt3.NumSliceB > 0, MFX_ERR_INVALID_VIDEO_PARAM); } SetDefaults(par, hwCaps, setExtAlloc, platform, vaType, config); sts = CheckForAllowedH264SpecViolations(par); if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) checkSts = sts; #if defined(MFX_ENABLE_ENCTOOLS_LPLA) mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); // for game streaming scenario, if option enable lowpower lookahead, check encoder's capability if (IsLpLookaheadSupported(extOpt3.ScenarioInfo, extOpt2.LookAheadDepth, par.mfx.RateControlMethod)) { MFX_CHECK(hwCaps.ddi_caps.LookaheadBRCSupport, MFX_ERR_INVALID_VIDEO_PARAM); } #endif return checkSts; } /* * utils for debug purposes */ struct Bool { explicit Bool(bool val) : m_val(val) {} Bool(Bool const & rhs) : m_val(rhs.m_val) {} Bool & operator =(Bool const & rhs) { m_val = rhs.m_val; return *this; } operator bool() { return m_val; } Bool & operator =(bool val) { //__asm { int 3 } m_val = val; return *this; } private: bool m_val; }; mfxStatus MfxHwH264Encode::CheckAndFixRectQueryLike( MfxVideoParam const & par, mfxRectDesc * rect) { mfxStatus checkSts = MFX_ERR_NONE; if (rect->Left == 0 && rect->Right == 0 && rect->Top == 0 && rect->Bottom == 0) return checkSts; checkSts = CheckAndFixOpenRectQueryLike(par, rect); return checkSts; } /* The function does following align down Left Top corner to Mb i.e. 15->0 align up Right and Bottom corner to Mb i.e. 15->16 checks that aligned rect is 'open ' i.e. Left < Right and Top < Bottom check that Right and Bottom fits in Frame i.e. Right(aligned up) <= par.mfx.FrameInfo.Width( must be aligned) returns: MFX_WRN_INCOMPATIBLE_VIDEO_PARAM - if any has been aligned MFX_ERR_UNSUPPORTED - if Left < Right and Top < Bottom MFX_ERR_UNSUPPORTED - if Right or Bottom */ mfxStatus MfxHwH264Encode::CheckAndFixOpenRectQueryLike( MfxVideoParam const & par, mfxRectDesc * rect) { mfxStatus checkSts = MFX_ERR_NONE; // check that rectangle is aligned to MB, correct it if not if (!CheckMbAlignment(rect->Left)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (!CheckMbAlignment(rect->Top)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (!CheckMbAlignmentAndUp(rect->Right)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (!CheckMbAlignmentAndUp(rect->Bottom)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; // check that rectangle dimensions don't conflict with each other if (par.mfx.FrameInfo.Width) { MFX_CHECK(CheckRangeDflt(rect->Left, mfxU32(0), mfxU32(par.mfx.FrameInfo.Width - 16), mfxU32(0)), MFX_ERR_UNSUPPORTED); if (rect->Right > par.mfx.FrameInfo.Width) { rect->Right = par.mfx.FrameInfo.Width; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } if (rect->Right <= rect->Left) { rect->Left = 0; rect->Right = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (par.mfx.FrameInfo.Height) { MFX_CHECK(CheckRangeDflt(rect->Top, mfxU32(0), mfxU32(par.mfx.FrameInfo.Height - 16), mfxU32(0)), MFX_ERR_UNSUPPORTED); if (rect->Bottom > par.mfx.FrameInfo.Height) { rect->Bottom = par.mfx.FrameInfo.Height; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } if (rect->Bottom <= rect->Top) { rect->Top = 0; rect->Bottom = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } return checkSts; } mfxStatus MfxHwH264Encode::CheckAndFixRoiQueryLike( MfxVideoParam const & par, mfxRoiDesc * roi, mfxU16 roiMode) { mfxStatus checkSts = CheckAndFixOpenRectQueryLike(par, (mfxRectDesc*)roi); // check QP if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { if (!CheckRangeDflt(roi->ROIValue, -51, 51, 0)) checkSts = MFX_ERR_UNSUPPORTED; } else { if (roiMode == MFX_ROI_MODE_QP_DELTA && !CheckRangeDflt(roi->ROIValue, -51, 51, 0)) checkSts = MFX_ERR_UNSUPPORTED; else if (roiMode == MFX_ROI_MODE_PRIORITY && !CheckRangeDflt(roi->ROIValue, -3, 3, 0)) checkSts = MFX_ERR_UNSUPPORTED; } return checkSts; } mfxStatus MfxHwH264Encode::CheckAndFixMovingRectQueryLike( MfxVideoParam const & par, mfxMovingRectDesc * rect) { mfxStatus checkSts = CheckAndFixRectQueryLike(par, (mfxRectDesc*)rect); if (par.mfx.FrameInfo.Width) if(!CheckRangeDflt(rect->SourceLeft, mfxU32(0), mfxU32(par.mfx.FrameInfo.Width - 1), mfxU32(0))) checkSts = MFX_ERR_UNSUPPORTED; if (par.mfx.FrameInfo.Height) if(!CheckRangeDflt(rect->SourceTop, mfxU32(0), mfxU32(par.mfx.FrameInfo.Height - 1), mfxU32(0))) checkSts = MFX_ERR_UNSUPPORTED; return checkSts; } //typedef bool Bool; mfxStatus MfxHwH264Encode::CheckVideoParamQueryLike( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, eMFXHWType platform, eMFXVAType vaType, eMFXGTConfig config) { Bool unsupported(false); Bool changed(false); Bool warning(false); (void)config; mfxExtCodingOption * extOpt = GetExtBuffer(par); mfxExtCodingOptionDDI * extDdi = GetExtBuffer(par); mfxExtVideoSignalInfo * extVsi = GetExtBuffer(par); mfxExtCodingOptionSPSPPS * extBits = GetExtBuffer(par); mfxExtPictureTimingSEI * extPt = GetExtBuffer(par); mfxExtSpsHeader * extSps = GetExtBuffer(par); mfxExtPpsHeader * extPps = GetExtBuffer(par); mfxExtMVCSeqDesc * extMvc = GetExtBuffer(par); mfxExtAvcTemporalLayers * extTemp = GetExtBuffer(par); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxExtSVCSeqDesc * extSvc = GetExtBuffer(par); #endif mfxExtCodingOption2 * extOpt2 = GetExtBuffer(par); mfxExtEncoderROI * extRoi = GetExtBuffer(par); mfxExtCodingOption3 * extOpt3 = GetExtBuffer(par); mfxExtChromaLocInfo * extCli = GetExtBuffer(par); mfxExtDirtyRect * extDirtyRect = GetExtBuffer(par); mfxExtMoveRect * extMoveRect = GetExtBuffer(par); mfxExtPredWeightTable * extPwt = GetExtBuffer(par); #if defined(MFX_ENABLE_ENCTOOLS) mfxExtEncToolsConfig * extConfig = GetExtBuffer(par); #endif mfxExtBRC * extBRC = GetExtBuffer(par); bool sliceRowAlligned = true; // check HW capabilities if (par.mfx.FrameInfo.Width > hwCaps.ddi_caps.MaxPicWidth || par.mfx.FrameInfo.Height > hwCaps.ddi_caps.MaxPicHeight) return Error(MFX_ERR_UNSUPPORTED); if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PART1) != MFX_PICSTRUCT_PROGRESSIVE) { if (((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PART1) == MFX_PICSTRUCT_FIELD_TFF) || ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PART1) == MFX_PICSTRUCT_FIELD_BFF)) { // TFF, BFF if (hwCaps.ddi_caps.NoInterlacedField) { par.mfx.FrameInfo.PicStruct = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } } else { // UNKNOWN or garbage par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (H264ECaps::IsVmeSupported(platform) && IsOn(par.mfx.LowPower)) changed = true; } } if (hwCaps.ddi_caps.MaxNum_TemporalLayer != 0 && hwCaps.ddi_caps.MaxNum_TemporalLayer < par.calcParam.numTemporalLayer) return Error(MFX_ERR_UNSUPPORTED); if (!CheckTriStateOption(par.mfx.LowPower)) changed = true; if (IsOn(par.mfx.LowPower)) { #if defined(MFX_ENABLE_AVCE_VDENC_B_FRAMES) if (par.mfx.GopRefDist > 1 && !H264ECaps::IsVDEncBFrameSupported(platform) ) #else if (par.mfx.GopRefDist > 1) #endif { changed = true; par.mfx.GopRefDist = 1; } if (par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ) { if (H264ECaps::IsRateControlLASupported(platform) && bRateControlLA(par.mfx.RateControlMethod)) // non LA modes are used instead { changed = true; if ((par.mfx.RateControlMethod == MFX_RATECONTROL_LA) || (par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD)) par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; else if (par.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) par.mfx.RateControlMethod = MFX_RATECONTROL_ICQ; } else { unsupported = true; par.mfx.RateControlMethod = 0; } } if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && par.calcParam.cqpHrdMode == 0) { if (!CheckRange(par.mfx.QPI, 10, 51)) changed = true; if (!CheckRange(par.mfx.QPP, 10, 51)) changed = true; if (!CheckRange(par.mfx.QPB, 10, 51)) changed = true; } } if (par.mfx.GopRefDist > 1 && hwCaps.ddi_caps.SliceIPOnly) { changed = true; par.mfx.GopRefDist = 1; } // sps/pps parameters if present overrides corresponding fields of VideoParam if (extBits->SPSBuffer) { if (!CheckAgreementOfSequenceLevelParameters(par, *extSps)) changed = true; if (extBits->PPSBuffer) if (!CheckAgreementOfPictureLevelParameters(par, *extPps)) changed = true; } if (par.Protected != 0) { unsupported = true; par.Protected = 0; } if (par.IOPattern != 0) { if ((par.IOPattern & MFX_IOPATTERN_IN_MASK) != par.IOPattern) { changed = true; par.IOPattern &= MFX_IOPATTERN_IN_MASK; } if ( par.IOPattern != MFX_IOPATTERN_IN_VIDEO_MEMORY && par.IOPattern != MFX_IOPATTERN_IN_SYSTEM_MEMORY ) { changed = true; par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; } } if (par.mfx.TargetUsage > 7) { changed = true; par.mfx.TargetUsage = 7; } if (par.mfx.GopPicSize > 0 && par.mfx.GopRefDist > 0 && par.mfx.GopRefDist > par.mfx.GopPicSize) { changed = true; par.mfx.GopRefDist = par.mfx.GopPicSize - 1; } if (par.mfx.GopRefDist > 1) { if (IsAvcBaseProfile(par.mfx.CodecProfile) || par.mfx.CodecProfile == MFX_PROFILE_AVC_CONSTRAINED_HIGH) { changed = true; par.mfx.GopRefDist = 1; } } if (par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_WIDI_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR && !bRateControlLA(par.mfx.RateControlMethod)) { changed = true; par.mfx.RateControlMethod = MFX_RATECONTROL_CBR; } if(MFX_HW_VAAPI == vaType && par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ && !bRateControlLA(par.mfx.RateControlMethod)) { unsupported = true; par.mfx.RateControlMethod = 0; } bool laEnabled = true; // LA and FD supports only with VME if (!H264ECaps::IsVmeSupported(platform)) { laEnabled = false; if (bRateControlLA(par.mfx.RateControlMethod)) { unsupported = true; par.mfx.RateControlMethod = 0; } if (IsOn(extOpt3->FadeDetection)) { unsupported = true; extOpt3->FadeDetection = 0; } } if (extOpt2->MaxSliceSize && !(IsDriverSliceSizeControlEnabled(par, hwCaps) || // driver slice control condition (SliceDividerType(hwCaps.ddi_caps.SliceStructure) == SliceDividerType::ARBITRARY_MB_SLICE && laEnabled))) // sw slice control condition { unsupported = true; extOpt2->MaxSliceSize = 0; } if (bRateControlLA(par.mfx.RateControlMethod) && IsOn(extOpt->CAVLC)) { extOpt->CAVLC = MFX_CODINGOPTION_OFF; changed = true; } if (extOpt2->MaxSliceSize) { if (par.mfx.GopRefDist > 1) { changed = true; par.mfx.GopRefDist = 1; } if (par.mfx.RateControlMethod != MFX_RATECONTROL_LA && !IsDriverSliceSizeControlEnabled(par, hwCaps)) { par.mfx.RateControlMethod = MFX_RATECONTROL_LA; changed = true; } if (extOpt2->LookAheadDepth > 1) { extOpt2->LookAheadDepth = 1; changed = true; } if (IsOn(extOpt->FieldOutput)) { unsupported = true; extOpt->FieldOutput = MFX_CODINGOPTION_UNKNOWN; } if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0) { par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; changed = true; } if (extDdi->LookAheadDependency != 0) { extDdi->LookAheadDependency = 0; changed = true; } if (par.AsyncDepth > 1 && par.mfx.LowPower != MFX_CODINGOPTION_ON) { par.AsyncDepth = 1; changed = true; } if (extOpt2->NumMbPerSlice) { extOpt2->NumMbPerSlice = 0; unsupported = true; } } else if (extOpt2->LookAheadDepth > 0) { if (!bRateControlLA(par.mfx.RateControlMethod)) { #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (extOpt3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { if (!hwCaps.ddi_caps.LookaheadBRCSupport) unsupported = true; } else #endif #if defined(MFX_ENABLE_ENCTOOLS) if(!(H264EncTools::isEncToolNeeded(par)) && !IsOn(extOpt2->ExtBRC)) #endif { changed = true; extOpt2->LookAheadDepth = 0; } } else if (par.mfx.GopRefDist > 0 && extOpt2->LookAheadDepth < 2 * par.mfx.GopRefDist) { changed = true; extOpt2->LookAheadDepth = 2 * par.mfx.GopRefDist; } if(bRateControlLA(par.mfx.RateControlMethod) && extOpt2->LookAheadDepth < 2 * par.mfx.NumRefFrame) { changed = true; extOpt2->LookAheadDepth = 2 * par.mfx.NumRefFrame; } } /* max allowed combination */ if (par.mfx.FrameInfo.PicStruct > (MFX_PICSTRUCT_PART1|MFX_PICSTRUCT_PART2)) { /* */ unsupported = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; } if (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PART2) { // repeat/double/triple flags are for EncodeFrameAsync changed = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; } mfxU16 picStructPart1 = par.mfx.FrameInfo.PicStruct; if (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PART1) { if (picStructPart1 & (picStructPart1 - 1)) { // more then one flag set changed = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; } } if (par.mfx.FrameInfo.Width & 1) { unsupported = true; par.mfx.FrameInfo.Width = 0; } if (par.mfx.FrameInfo.Height & 1) { unsupported = true; par.mfx.FrameInfo.Height = 0; } if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0 && (par.mfx.FrameInfo.Height & 31) != 0) { unsupported = true; par.mfx.FrameInfo.PicStruct = 0; par.mfx.FrameInfo.Height = 0; } // driver doesn't support resolution 16xH if (par.mfx.FrameInfo.Width == 16) { unsupported = true; par.mfx.FrameInfo.Width = 0; } // driver doesn't support resolution Wx16 if (par.mfx.FrameInfo.Height == 16) { unsupported = true; par.mfx.FrameInfo.Height = 0; } if (par.mfx.FrameInfo.Width > 0) { if (par.mfx.FrameInfo.CropX > par.mfx.FrameInfo.Width) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.CropX = 0; } if (par.mfx.FrameInfo.CropX + par.mfx.FrameInfo.CropW > par.mfx.FrameInfo.Width) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.CropW = par.mfx.FrameInfo.Width - par.mfx.FrameInfo.CropX; } } if (par.mfx.FrameInfo.Height > 0) { if (par.mfx.FrameInfo.CropY > par.mfx.FrameInfo.Height) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.CropY = 0; } if (par.mfx.FrameInfo.CropY + par.mfx.FrameInfo.CropH > par.mfx.FrameInfo.Height) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.CropH = par.mfx.FrameInfo.Height - par.mfx.FrameInfo.CropY; } } // WA for MVCe with d3d9. AsyncDepth parameter is checked here if (vaType == MFX_HW_D3D9 && par.AsyncDepth > 0 && IsMvcProfile(par.mfx.CodecProfile)) { mfxU32 numEncs = (extOpt->ViewOutput == MFX_CODINGOPTION_ON) ? 2 : 1; mfxU32 numView = (extMvc->NumView == 0) ? 1 : extMvc->NumView; mfxU32 numSurfBitstream = mfxU32(CalcNumSurfBitstream(par) * (numEncs > 1 ? 1 : numView)); mfxU32 numSurfRecon = mfxU32(CalcNumSurfRecon(par) * (numEncs > 1 ? 1 : numView)); if (numSurfBitstream > 128 || numSurfRecon > 128) { changed = true; par.AsyncDepth = DEFAULT_ASYNC_DEPTH_TO_WA_D3D9_128_SURFACE_LIMIT; } } if (CorrectCropping(par) != MFX_ERR_NONE) { // cropping read from sps header always has correct alignment changed = true; } if (extOpt2->NumMbPerSlice != 0) { bool fieldCoding = (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; mfxU16 widthInMbs = par.mfx.FrameInfo.Width / 16; mfxU16 heightInMbs = par.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1); if ( (SliceDividerType(hwCaps.ddi_caps.SliceStructure) == SliceDividerType::ONESLICE) || (SliceDividerType(hwCaps.ddi_caps.SliceStructure) < SliceDividerType::ARBITRARY_MB_SLICE && (extOpt2->NumMbPerSlice % (par.mfx.FrameInfo.Width >> 4))) || (SliceDividerType(hwCaps.ddi_caps.SliceStructure) == SliceDividerType::ROW2ROW && ((extOpt2->NumMbPerSlice / widthInMbs) & ((extOpt2->NumMbPerSlice / widthInMbs) - 1))) || (widthInMbs * heightInMbs) < extOpt2->NumMbPerSlice) { extOpt2->NumMbPerSlice = 0; unsupported = true; } } if (par.mfx.NumSlice !=0 && (extOpt3->NumSliceI != 0 || extOpt3->NumSliceP != 0 || extOpt3->NumSliceB != 0)) { if(par.mfx.NumSlice != extOpt3->NumSliceI && par.mfx.NumSlice != extOpt3->NumSliceP && par.mfx.NumSlice != extOpt3->NumSliceB) { changed = true; par.mfx.NumSlice = 0; } } if (par.mfx.RateControlMethod == MFX_RATECONTROL_VCM && hwCaps.ddi_caps.VCMBitrateControl == 0) { changed = true; par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; } if (extOpt3->LowDelayBRC == MFX_CODINGOPTION_ON) { if (par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM) { extOpt3->LowDelayBRC = MFX_CODINGOPTION_OFF; changed = true; } else { if (extOpt3->WinBRCMaxAvgKbps || extOpt3->WinBRCSize) { extOpt3->WinBRCMaxAvgKbps = 0; extOpt3->WinBRCSize = 0; changed = true; } if (par.mfx.GopRefDist != 0 && par.mfx.GopRefDist != 1) { par.mfx.GopRefDist = 1; changed = true; } } } if (par.mfx.NumSlice != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { if (par.mfx.NumSlice > par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256) { unsupported = true; par.mfx.NumSlice = 0; } bool fieldCoding = (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; SliceDivider divider = MakeSliceDivider( (extOpt2->MaxSliceSize != 0) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(hwCaps.ddi_caps.SliceStructure), extOpt2->NumMbPerSlice, par.mfx.NumSlice, par.mfx.FrameInfo.Width / 16, par.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); if (par.mfx.NumSlice != divider.GetNumSlice()) { changed = true; par.mfx.NumSlice = (mfxU16)divider.GetNumSlice(); } if (extOpt3->NumSliceP == 0) { do { if (divider.GetNumMbInSlice() % (par.mfx.FrameInfo.Width / 16) != 0) sliceRowAlligned = false; } while (divider.Next()); } } if (extOpt3->NumSliceI != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { if (extOpt3->NumSliceI > par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256) { unsupported = true; extOpt3->NumSliceI = 0; } bool fieldCoding = (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; SliceDivider divider = MakeSliceDivider( (extOpt2->MaxSliceSize != 0) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(hwCaps.ddi_caps.SliceStructure), extOpt2->NumMbPerSlice, extOpt3->NumSliceI, par.mfx.FrameInfo.Width / 16, par.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); if (extOpt3->NumSliceI != divider.GetNumSlice()) { changed = true; extOpt3->NumSliceI = (mfxU16)divider.GetNumSlice(); } } if (extOpt3->NumSliceP != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { if (extOpt3->NumSliceP > par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256) { unsupported = true; extOpt3->NumSliceP = 0; } bool fieldCoding = (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; SliceDivider divider = MakeSliceDivider( (extOpt2->MaxSliceSize != 0) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(hwCaps.ddi_caps.SliceStructure), extOpt2->NumMbPerSlice, extOpt3->NumSliceP, par.mfx.FrameInfo.Width / 16, par.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); if (extOpt3->NumSliceP != divider.GetNumSlice()) { changed = true; extOpt3->NumSliceP = (mfxU16)divider.GetNumSlice(); } do { if (divider.GetNumMbInSlice() % (par.mfx.FrameInfo.Width / 16) != 0) sliceRowAlligned = false; } while (divider.Next()); } if (extOpt3->NumSliceB != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { if (extOpt3->NumSliceB > par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height / 256) { unsupported = true; extOpt3->NumSliceB = 0; } bool fieldCoding = (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; SliceDivider divider = MakeSliceDivider( (extOpt2->MaxSliceSize != 0) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(hwCaps.ddi_caps.SliceStructure), extOpt2->NumMbPerSlice, extOpt3->NumSliceB, par.mfx.FrameInfo.Width / 16, par.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); if (extOpt3->NumSliceB != divider.GetNumSlice()) { changed = true; extOpt3->NumSliceB = (mfxU16)divider.GetNumSlice(); } } if (par.mfx.FrameInfo.ChromaFormat != 0 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV422 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; } if (par.mfx.FrameInfo.FourCC != 0 && par.mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && par.mfx.FrameInfo.FourCC != MFX_FOURCC_RGB4 && par.mfx.FrameInfo.FourCC != MFX_FOURCC_BGR4 && par.mfx.FrameInfo.FourCC != MFX_FOURCC_YUY2 && par.mfx.FrameInfo.FourCC != MFX_FOURCC_AYUV) { unsupported = true; par.mfx.FrameInfo.FourCC = 0; } if (par.mfx.FrameInfo.FourCC == MFX_FOURCC_NV12 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_MONOCHROME) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; } if (par.mfx.FrameInfo.FourCC == MFX_FOURCC_YUY2 && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV422) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV422; } if (par.mfx.FrameInfo.FourCC == MFX_FOURCC_AYUV && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; } if ((par.mfx.FrameInfo.FourCC == MFX_FOURCC_RGB4 || par.mfx.FrameInfo.FourCC == MFX_FOURCC_BGR4) && par.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; } if (hwCaps.ddi_caps.Color420Only && (par.mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV422 || par.mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV444)) { unsupported = true; par.mfx.FrameInfo.ChromaFormat = 0; } if (par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && (par.mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV422 || par.mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV444)) { changed = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } if (!CheckTriStateOption(extOpt2->DisableVUI)) changed = true; if (!CheckTriStateOption(extOpt->VuiNalHrdParameters)) changed = true; if (!CheckTriStateOption(extOpt->VuiVclHrdParameters)) changed = true; if (!CheckTriStateOption(extOpt2->FixedFrameRate)) changed = true; if (!CheckTriStateOption(extOpt3->LowDelayHrd)) changed = true; if (IsOn(extOpt2->DisableVUI)) { bool contradictoryVuiParam = false; if (!CheckTriStateOptionForOff(extOpt3->TimingInfoPresent)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt3->OverscanInfoPresent)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt3->AspectRatioInfoPresent)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt3->BitstreamRestriction)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt->VuiNalHrdParameters)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt->VuiVclHrdParameters)) contradictoryVuiParam = true; if (!CheckTriStateOptionForOff(extOpt->PicTimingSEI)) contradictoryVuiParam = true; if (contradictoryVuiParam) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; } } if (IsOff(extOpt3->OverscanInfoPresent)) { if (IsOn(extOpt3->OverscanAppropriate)) { changed = true; extOpt3->OverscanAppropriate = MFX_CODINGOPTION_OFF; } } if (IsOff(extOpt3->BitstreamRestriction)) { if (IsOn(extOpt3->MotionVectorsOverPicBoundaries)) { changed = true; extOpt3->MotionVectorsOverPicBoundaries = MFX_CODINGOPTION_OFF; } } if (IsOff(extOpt3->TimingInfoPresent)) { if (IsOn(extOpt2->FixedFrameRate)) { changed = true; extOpt2->FixedFrameRate = MFX_CODINGOPTION_OFF; } } if ((par.mfx.FrameInfo.FrameRateExtN == 0) != (par.mfx.FrameInfo.FrameRateExtD == 0)) { if (extBits->SPSBuffer && !IsOff(extOpt3->TimingInfoPresent)) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.FrameRateExtN = 0; par.mfx.FrameInfo.FrameRateExtD = 0; } if (!IsOff(extOpt3->TimingInfoPresent) && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0 && par.mfx.FrameInfo.FrameRateExtN > mfxU64(172) * par.mfx.FrameInfo.FrameRateExtD) { if (extBits->SPSBuffer) // frame_rate read from sps return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); unsupported = true; par.mfx.FrameInfo.FrameRateExtN = 0; par.mfx.FrameInfo.FrameRateExtD = 0; } if (IsOff(extOpt3->TimingInfoPresent) && IsOn(extOpt2->FixedFrameRate)) { // if timing_info_present_flag is 0, fixed_frame_rate_flag is inferred to be 0 (Annex E.2.1) if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt2->FixedFrameRate = MFX_CODINGOPTION_OFF; } if (!IsOff(extOpt3->TimingInfoPresent)) { if (IsOn(extOpt2->FixedFrameRate) && IsOn(extOpt3->LowDelayHrd)) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt3->LowDelayHrd = MFX_CODINGOPTION_OFF; } } if (par.mfx.CodecProfile != MFX_PROFILE_UNKNOWN && !IsValidCodingProfile(par.mfx.CodecProfile)) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (par.mfx.CodecProfile == MFX_PROFILE_AVC_MULTIVIEW_HIGH) return Error(MFX_ERR_UNSUPPORTED); changed = true; par.mfx.CodecProfile = MFX_PROFILE_UNKNOWN; } if (par.mfx.CodecLevel != MFX_LEVEL_UNKNOWN && !IsValidCodingLevel(par.mfx.CodecLevel)) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = MFX_LEVEL_UNKNOWN; } if (par.mfx.NumRefFrame > 16) { par.mfx.NumRefFrame = 16; changed = true; } if (par.mfx.NumRefFrame != 0) { if ((par.mfx.NumRefFrame & 1) && (hwCaps.ddi_caps.HeaderInsertion) && (par.Protected || !IsOff(extOpt->NalHrdConformance))) { // when driver writes headers it can write only even values of num_ref_frames if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.NumRefFrame++; } } if (par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 minLevel = GetLevelLimitByFrameSize(par); if (minLevel == 0) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); else if (par.mfx.CodecLevel != 0) { changed = true; // warning should be returned if frame size exceeds maximum value supported by AVC standard if (par.mfx.CodecLevel < GetMaxSupportedLevel()) par.mfx.CodecLevel = GetMaxSupportedLevel(); } } else if (par.mfx.CodecLevel != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = minLevel; } } if (!IsOff(extOpt3->TimingInfoPresent) && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxU16 minLevel = GetLevelLimitByMbps(par); if (minLevel == 0) { if (extBits->SPSBuffer) { return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } else if (par.mfx.CodecLevel != 0) { changed = true; // warning should be returned if MB processing rate exceeds maximum value supported by AVC standard if (par.mfx.CodecLevel < GetMaxSupportedLevel()) par.mfx.CodecLevel = GetMaxSupportedLevel(); } } else if (par.mfx.CodecLevel != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = minLevel; } } if (par.mfx.NumRefFrame != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 minLevel = GetLevelLimitByDpbSize(par); if (minLevel == 0) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = false; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; par.mfx.NumRefFrame = GetMaxNumRefFrame(par); } else if (par.mfx.CodecLevel != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = false; par.mfx.CodecLevel = minLevel; } } if (IsAvcHighProfile(par.mfx.CodecProfile) && (par.mfx.CodecProfile & MASK_CONSTRAINT_SET0123_FLAG)) { changed = true; par.mfx.CodecProfile = par.mfx.CodecProfile & ~MASK_CONSTRAINT_SET0123_FLAG; } if (!CheckTriStateOption(extOpt->RateDistortionOpt)) changed = true; if (!CheckTriStateOption(extOpt->EndOfSequence)) changed = true; if (!CheckTriStateOption(extOpt->FramePicture)) changed = true; if (!CheckTriStateOption(extOpt->CAVLC)) changed = true; if (!CheckTriStateOption(extOpt->RefPicListReordering)) changed = true; if (!CheckTriStateOption(extOpt->ResetRefList)) changed = true; if (!CheckTriStateOption(extOpt->RefPicMarkRep)) changed = true; if (!CheckTriStateOption(extOpt->FieldOutput)) changed = true; if (!CheckTriStateOption(extOpt->AUDelimiter)) changed = true; if (!CheckTriStateOption(extOpt->EndOfStream)) changed = true; if (!CheckTriStateOption(extOpt->PicTimingSEI)) changed = true; if (!CheckTriStateOption(extOpt->SingleSeiNalUnit)) changed = true; if (!CheckTriStateOption(extOpt->NalHrdConformance)) changed = true; if (!CheckTriStateOption(extDdi->RefRaw)) changed = true; if (!CheckTriStateOption(extDdi->DirectSpatialMvPredFlag)) changed = true; if (!CheckTriStateOption(extDdi->Hme)) changed = true; if (!CheckTriStateOption(extOpt2->BitrateLimit)) changed = true; if (!CheckTriStateOption(extOpt2->MBBRC)) changed = true; //if (!CheckTriStateOption(extOpt2->ExtBRC)) changed = true; if (!CheckTriStateOption(extOpt2->RepeatPPS)) changed = true; if (!CheckTriStateOption(extOpt2->UseRawRef)) changed = true; if (!CheckTriStateOption(extOpt3->EnableQPOffset)) changed = true; if (!CheckTriStateOption(extOpt3->DirectBiasAdjustment)) changed = true; if (!CheckTriStateOption(extOpt3->GlobalMotionBiasAdjustment)) changed = true; if ( IsOn(extOpt3->EnableQPOffset) && (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP || (par.mfx.GopRefDist > 1 && extOpt2->BRefType == MFX_B_REF_OFF) || (par.mfx.GopRefDist == 1 && extOpt3->PRefType == MFX_P_REF_SIMPLE))) { extOpt3->EnableQPOffset = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt3->EnableQPOffset)) { mfxU16 minQP = 1; mfxU16 maxQP = 51; mfxI16 QPX = (par.mfx.GopRefDist == 1) ? par.mfx.QPP : par.mfx.QPB; if (QPX) { for (mfxI16 i = 0; i < 8; i++) if (!CheckRange(extOpt3->QPOffset[i], minQP - QPX, maxQP - QPX)) changed = true; } } if (!CheckRangeDflt(extOpt3->MVCostScalingFactor, 0, 3, 0)) changed = true; if (extOpt3->MVCostScalingFactor && !IsOn(extOpt3->GlobalMotionBiasAdjustment)) { changed = true; extOpt3->MVCostScalingFactor = 0; } if (extOpt2->BufferingPeriodSEI > MFX_BPSEI_IFRAME) { changed = true; extOpt2->BufferingPeriodSEI = 0; } if (IsMvcProfile(par.mfx.CodecProfile) && IsOn(extOpt->FieldOutput)) { unsupported = true; extOpt->FieldOutput = MFX_CODINGOPTION_UNKNOWN; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_VCM && par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { changed = true; par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; } if (IsOn(extOpt2->MBBRC)) { if ((isSWBRC(par) && hwCaps.ddi_caps.QpAdjustmentSupport == 0 && hwCaps.ddi_caps.MbQpDataSupport == 0) || (!isSWBRC(par) && (hwCaps.ddi_caps.MBBRCSupport == 0 && hwCaps.ddi_caps.ICQBRCSupport == 0))) { changed = true; extOpt2->MBBRC = MFX_CODINGOPTION_OFF; } } if (extOpt2->BRefType > 2) { changed = true; extOpt2->BRefType = MFX_B_REF_UNKNOWN; } if (extOpt2->BRefType && extOpt2->BRefType != MFX_B_REF_OFF && par.mfx.GopRefDist != 0 && par.mfx.GopRefDist < 3) { changed = true; extOpt2->BRefType = MFX_B_REF_OFF; } if (extOpt->IntraPredBlockSize != MFX_BLOCKSIZE_UNKNOWN && extOpt->IntraPredBlockSize != MFX_BLOCKSIZE_MIN_16X16 && extOpt->IntraPredBlockSize != MFX_BLOCKSIZE_MIN_8X8 && extOpt->IntraPredBlockSize != MFX_BLOCKSIZE_MIN_4X4) { changed = true; extOpt->IntraPredBlockSize = MFX_BLOCKSIZE_UNKNOWN; } if (extOpt->InterPredBlockSize != MFX_BLOCKSIZE_UNKNOWN && extOpt->InterPredBlockSize != MFX_BLOCKSIZE_MIN_16X16 && extOpt->InterPredBlockSize != MFX_BLOCKSIZE_MIN_8X8 && extOpt->InterPredBlockSize != MFX_BLOCKSIZE_MIN_4X4) { changed = true; extOpt->InterPredBlockSize = MFX_BLOCKSIZE_UNKNOWN; } if (extOpt->MVPrecision != MFX_MVPRECISION_UNKNOWN && extOpt->MVPrecision != MFX_MVPRECISION_QUARTERPEL && extOpt->MVPrecision != MFX_MVPRECISION_HALFPEL && extOpt->MVPrecision != MFX_MVPRECISION_INTEGER) { changed = true; extOpt->MVPrecision = MFX_MVPRECISION_UNKNOWN; } if (extOpt->MaxDecFrameBuffering != 0) { if (par.mfx.CodecLevel != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 maxDpbSize = GetMaxNumRefFrame(par); if (extOpt->MaxDecFrameBuffering > maxDpbSize) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt->MaxDecFrameBuffering = maxDpbSize; } } if (par.mfx.NumRefFrame != 0) { if (extOpt->MaxDecFrameBuffering < par.mfx.NumRefFrame) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt->MaxDecFrameBuffering = par.mfx.NumRefFrame; } } } if ((IsOff(extOpt->CAVLC)) && (IsAvcBaseProfile(par.mfx.CodecProfile) || hwCaps.ddi_caps.NoCabacSupport)) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt->CAVLC = MFX_CODINGOPTION_ON; } if (extOpt->IntraPredBlockSize >= MFX_BLOCKSIZE_MIN_8X8) { if (IsAvcBaseProfile(par.mfx.CodecProfile) || par.mfx.CodecProfile == MFX_PROFILE_AVC_MAIN) { if (extBits->PPSBuffer && extPps->transform8x8ModeFlag) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; extOpt->IntraPredBlockSize = MFX_BLOCKSIZE_MIN_16X16; } } if ((par.mfx.CodecProfile != MFX_PROFILE_UNKNOWN) && (par.mfx.CodecProfile != MFX_PROFILE_AVC_HIGH) && IsOn(extDdi->Transform8x8Mode)) { unsupported = true; extDdi->Transform8x8Mode = MFX_CODINGOPTION_UNKNOWN; } if (par.calcParam.cqpHrdMode) { if (IsOn(extOpt->RecoveryPointSEI)) { changed = true; extOpt->RecoveryPointSEI = MFX_CODINGOPTION_OFF; } if (IsOn(extOpt->PicTimingSEI)) { changed = true; extOpt->PicTimingSEI = MFX_CODINGOPTION_OFF; } if (extOpt2->BufferingPeriodSEI != MFX_BPSEI_DEFAULT) { changed = true; extOpt2->BufferingPeriodSEI = MFX_BPSEI_DEFAULT; } } if ((IsOn(extOpt->VuiNalHrdParameters) ||IsOn(extOpt->NalHrdConformance)) && par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR && par.mfx.RateControlMethod != MFX_RATECONTROL_LA_HRD && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM && par.calcParam.cqpHrdMode == 0) { changed = true; extOpt->NalHrdConformance = MFX_CODINGOPTION_OFF; extOpt->VuiNalHrdParameters = MFX_CODINGOPTION_OFF; } if (IsOn(extOpt->VuiNalHrdParameters) && IsOff(extOpt->NalHrdConformance) && par.calcParam.cqpHrdMode == 0) { changed = true; extOpt->VuiNalHrdParameters = MFX_CODINGOPTION_OFF; } if (IsOn(extOpt->VuiVclHrdParameters) && IsOff(extOpt->NalHrdConformance)) { changed = true; extOpt->VuiVclHrdParameters = MFX_CODINGOPTION_OFF; } if (IsOn(extOpt->VuiVclHrdParameters) && par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR) { changed = true; extOpt->VuiVclHrdParameters = MFX_CODINGOPTION_OFF; } if(IsOff(extOpt->VuiNalHrdParameters) && IsOff(extOpt->VuiVclHrdParameters) && IsOn(extOpt3->LowDelayHrd)) { changed = true; extOpt3->LowDelayHrd = MFX_CODINGOPTION_OFF; } if (!IsOn(extOpt2->DisableVUI) && IsOff(extOpt->VuiNalHrdParameters) && IsOff(extOpt->VuiVclHrdParameters) && extOpt2->FixedFrameRate != MFX_CODINGOPTION_UNKNOWN && extOpt3->LowDelayHrd != MFX_CODINGOPTION_UNKNOWN && IsOn(extOpt2->FixedFrameRate) != IsOff(extOpt3->LowDelayHrd)) { // when low_delay_hrd_flag isn't present in bitstream, it's value should be inferred to be equal to 1 - fixed_frame_rate_flag (Annex E.2.1) changed = true; if (IsOn(extOpt2->FixedFrameRate)) extOpt3->LowDelayHrd = MFX_CODINGOPTION_OFF; } if (extDdi->WeightedBiPredIdc > 2) { changed = true; extDdi->WeightedBiPredIdc = 0; } if (extDdi->CabacInitIdcPlus1 > 3) { changed = true; extDdi->CabacInitIdcPlus1 = 0; } if (extOpt2->LookAheadDS > MFX_LOOKAHEAD_DS_4x) // invalid LookAheadDS { extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_UNKNOWN; changed = true; } if (extOpt2->LookAheadDS == MFX_LOOKAHEAD_DS_4x) { extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_2x; changed = true; } if (extOpt2->LookAheadDS > MFX_LOOKAHEAD_DS_OFF) { par.calcParam.widthLa = mfx::align2_value(mfxU16(par.mfx.FrameInfo.Width / LaDSenumToFactor(extOpt2->LookAheadDS)), 16); par.calcParam.heightLa = mfx::align2_value(mfxU16(par.mfx.FrameInfo.Height / LaDSenumToFactor(extOpt2->LookAheadDS)), 16); } else { par.calcParam.widthLa = par.mfx.FrameInfo.Width; par.calcParam.heightLa = par.mfx.FrameInfo.Height; } if (!CheckRangeDflt(extVsi->VideoFormat, 0, 8, 5)) changed = true; if (!CheckRangeDflt(extVsi->ColourPrimaries, 0, 255, 2)) changed = true; if (!CheckRangeDflt(extVsi->TransferCharacteristics, 0, 255, 2)) changed = true; if (!CheckRangeDflt(extVsi->MatrixCoefficients, 0, 255, 2)) changed = true; if (!CheckFlag(extVsi->VideoFullRange, 0)) changed = true; if (!CheckFlag(extVsi->ColourDescriptionPresent, 0)) changed = true; if (!CheckRangeDflt(extCli->ChromaLocInfoPresentFlag, 0, 1, 0)) changed = true; if (!CheckRangeDflt(extCli->ChromaSampleLocTypeTopField, 0, 5, 0)) changed = true; if (!CheckRangeDflt(extCli->ChromaSampleLocTypeBottomField, 0, 5, 0)) changed = true; if ( (IsOn(extOpt2->DisableVUI) && extCli->ChromaLocInfoPresentFlag) || (!extCli->ChromaLocInfoPresentFlag && (extCli->ChromaSampleLocTypeTopField || extCli->ChromaSampleLocTypeBottomField))) { extCli->ChromaLocInfoPresentFlag = 0; extCli->ChromaSampleLocTypeTopField = 0; extCli->ChromaSampleLocTypeBottomField = 0; changed = true; } // Keep the behavior on VME and set to OFF from ACM since we decided to deprecate this parameter on VDEnc. if (H264ECaps::IsVmeSupported(platform)) { if (extOpt2->BitrateLimit == MFX_CODINGOPTION_UNKNOWN) extOpt2->BitrateLimit = MFX_CODINGOPTION_ON; } else { if (extOpt2->BitrateLimit == MFX_CODINGOPTION_ON) changed = true; extOpt2->BitrateLimit = MFX_CODINGOPTION_OFF; } if (par.calcParam.cqpHrdMode == 0) { // regular check for compatibility of profile/level and BRC parameters if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.calcParam.targetKbps != 0) { if (!IsOff(extOpt2->BitrateLimit) && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxF64 rawDataBitrate = 12.0 * par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height * par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD; mfxU32 minTargetKbps = mfxU32(std::min(0xffffffff, rawDataBitrate / 1000.0 / 700.0)); if (par.calcParam.targetKbps < minTargetKbps) { changed = true; par.calcParam.targetKbps = minTargetKbps; } } if ((!IsOff(extOpt->NalHrdConformance) && extBits->SPSBuffer == 0) || IsOn(extOpt->VuiNalHrdParameters) || IsOn(extOpt->VuiVclHrdParameters)) { mfxU16 profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.targetKbps)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = minLevel; par.mfx.CodecProfile = profile; } break; } } if (profile == MFX_PROFILE_UNKNOWN) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } changed = true; par.calcParam.targetKbps = GetMaxBitrate(par) / 1000; } } } if (par.calcParam.targetKbps != 0 && par.calcParam.maxKbps != 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { if (par.calcParam.maxKbps != par.calcParam.targetKbps) { changed = true; if (extBits->SPSBuffer && ( extSps->vui.flags.nalHrdParametersPresent || extSps->vui.flags.vclHrdParametersPresent)) par.calcParam.targetKbps = par.calcParam.maxKbps; else par.calcParam.maxKbps = par.calcParam.targetKbps; } } else if ( par.mfx.RateControlMethod == MFX_RATECONTROL_VCM || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_WIDI_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) { if (par.calcParam.maxKbps < par.calcParam.targetKbps) { if (extBits->SPSBuffer && ( extSps->vui.flags.nalHrdParametersPresent || extSps->vui.flags.vclHrdParametersPresent)) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.maxKbps = par.calcParam.targetKbps; } } } if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.calcParam.maxKbps != 0) { mfxU16 profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.maxKbps)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = minLevel; par.mfx.CodecProfile = profile; } break; } } if (profile == MFX_PROFILE_UNKNOWN) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } changed = true; par.calcParam.maxKbps = GetMaxBitrate(par) / 1000; } } if (par.calcParam.bufferSizeInKB != 0 && bRateControlLA(par.mfx.RateControlMethod) &&(par.mfx.RateControlMethod != MFX_RATECONTROL_LA_HRD)) { mfxU32 uncompressedSizeInKb = GetMaxCodedFrameSizeInKB(par); if (par.calcParam.bufferSizeInKB < uncompressedSizeInKb) { changed = true; par.calcParam.bufferSizeInKB = uncompressedSizeInKb; } } if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR && hwCaps.AVBRSupport == 0) { par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; par.mfx.Accuracy = 0; par.calcParam.initialDelayInKB = 0; par.mfx.Convergence = 0; par.calcParam.maxKbps = 0; changed = true; } if (par.calcParam.bufferSizeInKB != 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { mfxU32 uncompressedSizeInKb = GetMaxCodedFrameSizeInKB(par); if (par.calcParam.bufferSizeInKB < uncompressedSizeInKb) { changed = true; par.calcParam.bufferSizeInKB = uncompressedSizeInKb; } } else { mfxF64 avgFrameSizeInKB = 0; if (par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0 && par.calcParam.targetKbps != 0) { mfxF64 frameRate = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; avgFrameSizeInKB = par.calcParam.targetKbps / frameRate / 8; if (par.calcParam.bufferSizeInKB < 2 * avgFrameSizeInKB) { if (extBits->SPSBuffer && ( extSps->vui.flags.nalHrdParametersPresent || extSps->vui.flags.vclHrdParametersPresent)) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.bufferSizeInKB = mfxU32(2 * avgFrameSizeInKB + 1); } } mfxU16 profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByBufferSize(profile, par.calcParam.bufferSizeInKB)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.mfx.CodecLevel = minLevel; } break; } } if (profile == MFX_PROFILE_UNKNOWN) { if (extBits->SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } changed = true; par.calcParam.bufferSizeInKB = mfxU16(std::min(GetMaxBufferSize(par) / 8000, USHRT_MAX)); } if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.calcParam.initialDelayInKB != 0) { if (par.calcParam.initialDelayInKB >= par.calcParam.bufferSizeInKB) { changed = true; par.calcParam.initialDelayInKB = par.calcParam.bufferSizeInKB / 2; } if (avgFrameSizeInKB > 0 && par.calcParam.initialDelayInKB < mfxU32(avgFrameSizeInKB)) { changed = true; par.calcParam.initialDelayInKB = std::min(par.calcParam.bufferSizeInKB, mfxU32(avgFrameSizeInKB)); } } } } } else { // special check for compatibility of profile/level and BRC parameters for cqpHrdMode mfxU16 profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.decorativeHrdParam.targetKbps)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { changed = true; par.mfx.CodecLevel = minLevel; par.mfx.CodecProfile = profile; } break; } if (profile == MFX_PROFILE_UNKNOWN) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } } } if (par.calcParam.decorativeHrdParam.maxKbps < par.calcParam.decorativeHrdParam.targetKbps) { changed = true; par.calcParam.decorativeHrdParam.maxKbps = par.calcParam.decorativeHrdParam.targetKbps; } profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.decorativeHrdParam.maxKbps)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { changed = true; par.mfx.CodecLevel = minLevel; par.mfx.CodecProfile = profile; } break; } } if (profile == MFX_PROFILE_UNKNOWN) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } } profile = std::max(MFX_PROFILE_AVC_BASELINE, par.mfx.CodecProfile & MASK_PROFILE_IDC); for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByBufferSize(profile, par.calcParam.decorativeHrdParam.bufferSizeInKB)) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0 && par.mfx.CodecLevel < minLevel) { changed = true; par.mfx.CodecLevel = minLevel; } break; } } if (profile == MFX_PROFILE_UNKNOWN) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecProfile != 0) { par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; par.mfx.CodecLevel = MFX_LEVEL_AVC_52; } changed = true; } if (par.calcParam.decorativeHrdParam.initialDelayInKB > par.calcParam.decorativeHrdParam.bufferSizeInKB) { changed = true; par.calcParam.decorativeHrdParam.initialDelayInKB = par.calcParam.decorativeHrdParam.bufferSizeInKB / 2; } } mfxStatus sts = CheckMaxFrameSize(par, hwCaps); if (sts == MFX_ERR_UNSUPPORTED) unsupported = true; else if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) changed = true; #if defined(MFX_ENABLE_ENCTOOLS) if (H264EncTools::isEncToolNeeded(par)) { if ((IsOn(extOpt2->ExtBRC) && extOpt2->LookAheadDepth == 0) || par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { changed = true; ResetEncToolsPar(*extConfig, MFX_CODINGOPTION_OFF); } else { sts = H264EncTools::Query(par); if (sts == MFX_ERR_UNSUPPORTED) unsupported = true; else if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) changed = true; } } #endif #if defined(MFX_ENABLE_EXT_BRC) if (IsOn(extOpt2->ExtBRC) && par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR) { extOpt2->ExtBRC = MFX_CODINGOPTION_OFF; changed = true; } if ((!IsOn(extOpt2->ExtBRC)) && (extBRC->pthis || extBRC->Init || extBRC->Close || extBRC->GetFrameCtrl || extBRC->Update || extBRC->Reset) ) { extBRC->pthis = 0; extBRC->Init = 0; extBRC->Close = 0; extBRC->GetFrameCtrl = 0; extBRC->Update = 0; extBRC->Reset = 0; changed = true; } if ((extBRC->pthis || extBRC->Init || extBRC->Close || extBRC->GetFrameCtrl || extBRC->Update || extBRC->Reset) && (!extBRC->pthis || !extBRC->Init || !extBRC->Close || !extBRC->GetFrameCtrl || !extBRC->Update || !extBRC->Reset)) { extOpt2->ExtBRC = 0; extBRC->pthis = 0; extBRC->Init = 0; extBRC->Close = 0; extBRC->GetFrameCtrl = 0; extBRC->Update = 0; extBRC->Reset = 0; changed = true; } #endif if (par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { if (par.mfx.CodecLevel != 0 && par.mfx.CodecLevel < MFX_LEVEL_AVC_21) { if (extBits->SPSBuffer) // level came from sps header, override picstruct par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; else // level came from videoparam, override level par.mfx.CodecLevel = MFX_LEVEL_AVC_21; changed = true; } mfxU16 levelToCheck = par.mfx.CodecLevel; if (levelToCheck == 0) levelToCheck = GetMinLevelForAllParameters(par); if (levelToCheck > MFX_LEVEL_AVC_41) { if (GetMinLevelForResolutionAndFramerate(par) <= MFX_LEVEL_AVC_41) { // it's possible to encode stream with level lower than 4.2 // correct encoding parameters to satisfy H264 spec (table A-4, frame_mbs_only_flag) changed = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } else { // it's impossible to encode stream with level lower than 4.2 // allow H264 spec violation ((table A-4, frame_mbs_only_flag)) and return warning warning = true; } } } if (par.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { if (IsAvcBaseProfile(par.mfx.CodecProfile) || par.mfx.CodecProfile == MFX_PROFILE_AVC_PROGRESSIVE_HIGH || par.mfx.CodecProfile == MFX_PROFILE_AVC_CONSTRAINED_HIGH) { changed = true; par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } } if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0 && par.mfx.NumRefFrame == 1) { par.mfx.NumRefFrame ++; // HSW and IVB don't support 1 reference frame for interlaced encoding changed = true; } if (IsOn(extOpt->FieldOutput)) { if (par.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE || IsOn(extOpt->FramePicture)) { changed = true; extOpt->FieldOutput = MFX_CODINGOPTION_OFF; } } if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && par.calcParam.cqpHrdMode == 0) { if (!CheckRange(par.mfx.QPI, 0, 51)) changed = true; if (!CheckRange(par.mfx.QPP, 0, 51)) changed = true; if (!CheckRange(par.mfx.QPB, 0, 51)) changed = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR && hwCaps.CBRSupport == 0) { par.mfx.RateControlMethod = 0; unsupported = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR && hwCaps.VBRSupport == 0) { par.mfx.RateControlMethod = 0; unsupported = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && hwCaps.CQPSupport == 0) { par.mfx.RateControlMethod = 0; unsupported = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ && hwCaps.ddi_caps.ICQBRCSupport == 0) { par.mfx.RateControlMethod = 0; unsupported = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR && hwCaps.ddi_caps.QVBRBRCSupport == 0) { par.mfx.RateControlMethod = 0; unsupported = true; } if ( ((par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ) || (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR)) && (extOpt2->MBBRC == MFX_CODINGOPTION_OFF) ) { // for ICQ or QVBR BRC mode MBBRC is ignored by driver and always treated as ON // need to change extOpt2->MBBRC respectively to notify application about it extOpt2->MBBRC = MFX_CODINGOPTION_ON; changed = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) { if (!CheckRange(par.mfx.ICQQuality, 0, 51)) changed = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) { if (!CheckRange(extOpt3->QVBRQuality, 0, 51)) changed = true; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { if (!CheckRange(par.mfx.Accuracy, AVBR_ACCURACY_MIN, AVBR_ACCURACY_MAX)) changed = true; if (!CheckRange(par.mfx.Convergence, AVBR_CONVERGENCE_MIN, AVBR_CONVERGENCE_MAX)) changed = true; } for (mfxU32 i = 0; i < 3; i++) { mfxU32 maxTimeOffset = (1 << 24) - 1; mfxU32 maxNFrames = (par.mfx.FrameInfo.FrameRateExtN > 0 && par.mfx.FrameInfo.FrameRateExtD > 0) ? (par.mfx.FrameInfo.FrameRateExtN - 1) / par.mfx.FrameInfo.FrameRateExtD : 255; if (extPt->TimeStamp[i].CtType != 0xffff) { if (!CheckRangeDflt(extPt->TimeStamp[i].CtType, 0, 3, 2)) changed = true; } if (!CheckRangeDflt(extPt->TimeStamp[i].CountingType, 0, 31, 0)) changed = true; if (!CheckRange(extPt->TimeStamp[i].NFrames, 0u, maxNFrames)) changed = true; if (!CheckRange(extPt->TimeStamp[i].SecondsValue, 0, 59)) changed = true; if (!CheckRange(extPt->TimeStamp[i].MinutesValue, 0, 59)) changed = true; if (!CheckRange(extPt->TimeStamp[i].HoursValue, 0, 23)) changed = true; if (!CheckRange(extPt->TimeStamp[i].TimeOffset, 0u, maxTimeOffset)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].ClockTimestampFlag, 0)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].NuitFieldBasedFlag, 1)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].FullTimestampFlag, 1)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].DiscontinuityFlag, 0)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].CntDroppedFlag, 0)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].SecondsFlag, 0)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].MinutesFlag, 0)) changed = true; if (!CheckFlag (extPt->TimeStamp[i].HoursFlag, 0)) changed = true; } if (!CheckRangeDflt(extBits->SPSId, 0, 31, 0)) changed = true; if (!CheckRangeDflt(extBits->PPSId, 0, 255, 0)) changed = true; if (extBits->SPSBuffer) { if (extSps->seqParameterSetId > 31 || !IsValidCodingProfile(extSps->profileIdc) || !IsValidCodingLevel(extSps->levelIdc) || extSps->chromaFormatIdc != 1 || extSps->bitDepthLumaMinus8 != 0 || extSps->bitDepthChromaMinus8 != 0 || extSps->qpprimeYZeroTransformBypassFlag != 0 || extSps->picOrderCntType == 1 || /*extSps->gapsInFrameNumValueAllowedFlag != 0 ||*/ extSps->mbAdaptiveFrameFieldFlag != 0 || extSps->vui.flags.vclHrdParametersPresent != 0 || extSps->vui.nalHrdParameters.cpbCntMinus1 > 0 || extSps->vui.numReorderFrames > extSps->vui.maxDecFrameBuffering) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // the following fields aren't supported by snb/ivb_win7 drivers directly and requires sps patching // patching is not possible whe protection is on if (par.Protected != 0) if (extSps->nalRefIdc != 1 || extSps->constraints.set0 != 0 || extSps->constraints.set1 != 0 || extSps->constraints.set2 != 0 || extSps->constraints.set3 != 0 || extSps->constraints.set4 != 0 || extSps->constraints.set5 != 0 || extSps->constraints.set6 != 0 || extSps->constraints.set7 != 0) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (extBits->PPSBuffer) { if (extPps->seqParameterSetId != extSps->seqParameterSetId || extPps->numSliceGroupsMinus1 > 0 || extPps->numRefIdxL0DefaultActiveMinus1 > 31 || extPps->numRefIdxL1DefaultActiveMinus1 > 31 || //Check of weightedPredFlag is actually not needed, as it was read from 1 bit in extBits->PPSBuffer extPps->weightedPredFlag > 1 || extPps->weightedBipredIdc > 2 || extPps->picInitQpMinus26 < -26 || extPps->picInitQpMinus26 > 25 || extPps->picInitQsMinus26 != 0 || extPps->chromaQpIndexOffset < -12 || extPps->chromaQpIndexOffset > 12 || extPps->deblockingFilterControlPresentFlag == 0 || extPps->redundantPicCntPresentFlag != 0 || extPps->secondChromaQpIndexOffset < -12 || extPps->secondChromaQpIndexOffset > 12) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // the following fields aren't supported by snb/ivb_win7 drivers directlyand requires pps patching // patching is not possible whe protection is on if (par.Protected != 0) if (extSps->nalRefIdc != 1) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX if (extSps->seqScalingMatrixPresentFlag) { // Rec. ITU-T H.264 (04/2017), chapter A.2 Profiles, customized Scaling Matrices is supported // only for High profiles and protected content isn't supported if (!IsAvcHighProfile(par.mfx.CodecProfile) || par.Protected != 0) { extSps->seqScalingMatrixPresentFlag = 0; return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } //levelIdx == 3 isn't supported if (extSps->levelIdc == 3) { extSps->seqScalingMatrixPresentFlag = 0; return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } //if seqScalingMatrixPresent flag isn't 0 at least one matrix has to be provided //More information Rec. ITU-T H.264, 7.4.2.1.1 Sequence parameter set data semantics mfxU8 sum = 0; for (mfxU8 i = 0; i < 8 /*((extSps->levelIdc != 3) ? 8 : 12)*/; ++i) { sum |= extSps->seqScalingListPresentFlag[i]; if (extSps->seqScalingListPresentFlag[i] > 1) //bitfield { extSps->seqScalingListPresentFlag[i] = 1; changed = true; } } if (!sum) { extSps->seqScalingMatrixPresentFlag = 0; changed = true; } } if (extBits->PPSBuffer && extPps->picScalingMatrixPresentFlag) { // Rec. ITU-T H.264 (04/2017), chapter A.2 Profiles, customized Scaling Matrices is supported // only for High profiles and protected content isn't supported if (!IsAvcHighProfile(par.mfx.CodecProfile) || par.Protected != 0) { extPps->picScalingMatrixPresentFlag = 0; return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } //transform8x8ModeFlag has to be 1, other values is unsupported if (extPps->transform8x8ModeFlag != 1) { extPps->picScalingMatrixPresentFlag = 0; return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } else { //if picScalingMatrixPresent flag isn't 0 at least one matrix has to be provided //More information Rec. ITU-T H.264, 7.4.2.2 Picture parameter set RBSP semantics bool sum = 0; for (mfxU8 i = 0; i < 8 /*6 + 2*(!!extPps->transform8x8ModeFlag)*/; ++i) { sum |= extPps->picScalingListPresentFlag[i]; } if (!sum) { extPps->picScalingMatrixPresentFlag = 0; changed = true; } } } #endif } if (!CheckTriStateOption(extOpt3->ExtBrcAdaptiveLTR)) changed = true; #ifdef MFX_AUTOLTR_FEATURE_DISABLE if (IsOn(extOpt3->ExtBrcAdaptiveLTR)) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } #else // else MFX_AUTOLTR_FEATURE_DISABLE == MFX_AUTOLTR_FEATURE_ENABLED if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && IsOff(extOpt2->ExtBRC)) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && par.mfx.RateControlMethod != 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && par.mfx.NumRefFrame != 0) { mfxU16 nrfMin = (par.mfx.GopRefDist > 1 ? 2 : 1); bool bPyr = (extOpt2->BRefType == MFX_B_REF_PYRAMID); if (bPyr) nrfMin = GetMinNumRefFrameForPyramid(par); if (par.mfx.NumRefFrame <= nrfMin) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } } if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && extDdi->NumActiveRefP != 0) { if (extDdi->NumActiveRefP <= 1) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } } #endif //MFX_AUTOLTR_FEATURE_DISABLE #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (!CheckTriStateOption(extOpt3->AdaptiveCQM)) changed = true; if (IsOn(extOpt3->AdaptiveCQM) && !isAdaptiveCQMSupported(extOpt3->ScenarioInfo, IsOn(par.mfx.LowPower))) { extOpt3->AdaptiveCQM = MFX_CODINGOPTION_OFF; changed = true; } #endif if (IsMvcProfile(par.mfx.CodecProfile) && MFX_ERR_UNSUPPORTED == CheckMVCSeqDescQueryLike(extMvc)) { unsupported = true; } par.SyncCalculableToVideoParam(); par.AlignCalcWithBRCParamMultiplier(); if (par.calcParam.numTemporalLayer > 0 && par.mfx.EncodedOrder != 0) { changed = true; memset(extTemp->Layer, 0, sizeof(extTemp->Layer)); // unnamed structures can't be used in templates Zero(par.calcParam.scale); Zero(par.calcParam.tid); par.calcParam.numTemporalLayer = 0; par.calcParam.tempScalabilityMode = 0; } if (par.calcParam.tempScalabilityMode && par.mfx.GopRefDist > 1) { changed = true; par.mfx.GopRefDist = 1; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_VCM && par.mfx.GopRefDist > 1) { changed = true; par.mfx.GopRefDist = 1; } if (extTemp->BaseLayerPID + par.calcParam.numTemporalLayer > 64) { unsupported = true; extTemp->BaseLayerPID = 0; } if (par.calcParam.numTemporalLayer > 0 && IsAvcProfile(par.mfx.CodecProfile) && extTemp->Layer[0].Scale != 1) { unsupported = true; extTemp->Layer[0].Scale = 0; } for (mfxU32 i = 1; i < par.calcParam.numTemporalLayer; i++) { if (par.calcParam.scale[i] <= par.calcParam.scale[i - 1] || // increasing par.calcParam.scale[i] % par.calcParam.scale[i - 1]) // divisible { unsupported = true; extTemp->Layer[par.calcParam.tid[i]].Scale = 0; } if (par.calcParam.tempScalabilityMode && par.calcParam.scale[i] != par.calcParam.scale[i - 1] * 2) { unsupported = true; extTemp->Layer[par.calcParam.tid[i]].Scale = 0; } } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (hwCaps.ddi_caps.MaxNum_QualityLayer == 0 && hwCaps.ddi_caps.MaxNum_DependencyLayer == 0) { for (mfxU32 i = 0; i < par.calcParam.numDependencyLayer; i++) { mfxU32 did = par.calcParam.did[i]; if (extSvc->DependencyLayer[did].BasemodePred != 0 && extSvc->DependencyLayer[did].BasemodePred != MFX_CODINGOPTION_OFF) { extSvc->DependencyLayer[did].BasemodePred = MFX_CODINGOPTION_OFF; changed = true; } if (extSvc->DependencyLayer[did].MotionPred != 0 && extSvc->DependencyLayer[did].MotionPred != MFX_CODINGOPTION_OFF) { extSvc->DependencyLayer[did].MotionPred = MFX_CODINGOPTION_OFF; changed = true; } if (extSvc->DependencyLayer[did].ResidualPred != 0 && extSvc->DependencyLayer[did].ResidualPred != MFX_CODINGOPTION_OFF) { extSvc->DependencyLayer[did].ResidualPred = MFX_CODINGOPTION_OFF; changed = true; } } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (extOpt2->IntRefType > 3 || (extOpt2->IntRefType && hwCaps.ddi_caps.RollingIntraRefresh == 0)) { extOpt2->IntRefType = 0; unsupported = true; } if (!H264ECaps::IsVmeSupported(platform) && (extOpt2->IntRefType > MFX_REFRESH_HORIZONTAL)) { extOpt2->IntRefType = MFX_REFRESH_HORIZONTAL; changed = true; } if (extOpt2->IntRefType && par.mfx.GopRefDist > 1) { extOpt2->IntRefType = 0; changed = true; } if (extOpt2->IntRefType && par.mfx.NumRefFrame > 1 && par.calcParam.tempScalabilityMode == 0) { extOpt2->IntRefType = 0; changed = true; } if (extOpt2->IntRefType && par.calcParam.numTemporalLayer && par.calcParam.tempScalabilityMode == 0) { extOpt2->IntRefType = 0; changed = true; } if (extOpt2->IntRefQPDelta < -51 || extOpt2->IntRefQPDelta > 51) { extOpt2->IntRefQPDelta = 0; changed = true; } if (extOpt2->IntRefCycleSize != 0 && par.mfx.GopPicSize != 0 && extOpt2->IntRefCycleSize >= par.mfx.GopPicSize) { // refresh cycle length shouldn't be greater or equal to GOP size extOpt2->IntRefType = 0; extOpt2->IntRefCycleSize = 0; changed = true; } if (extOpt3->IntRefCycleDist != 0 && par.mfx.GopPicSize != 0 && extOpt3->IntRefCycleDist >= par.mfx.GopPicSize) { // refresh period length shouldn't be greater or equal to GOP size extOpt2->IntRefType = 0; extOpt3->IntRefCycleDist = 0; changed = true; } if (extOpt3->IntRefCycleDist != 0 && extOpt2->IntRefCycleSize != 0 && extOpt2->IntRefCycleSize > extOpt3->IntRefCycleDist) { // refresh period shouldn't be greater than refresh cycle size extOpt3->IntRefCycleDist = 0; changed = true; } if (extOpt2->IntRefType == MFX_REFRESH_SLICE) { if (extOpt2->IntRefCycleSize && !extOpt3->NumSliceP && !par.mfx.NumSlice) { extOpt2->IntRefType = MFX_REFRESH_HORIZONTAL; changed = true; } if (extOpt2->IntRefCycleSize && extOpt3->NumSliceP && (extOpt2->IntRefCycleSize != extOpt3->NumSliceP)) { extOpt2->IntRefCycleSize = extOpt3->NumSliceP; changed = true; } if ((extOpt3->NumSliceP != 0) && (par.mfx.GopPicSize != 0) && (extOpt3->NumSliceP > par.mfx.GopPicSize)) { extOpt2->IntRefType = 0; changed = true; } if ((extOpt3->IntRefCycleDist != 0) && (extOpt3->NumSliceP != 0) && (extOpt3->NumSliceP > extOpt3->IntRefCycleDist)) { // refresh period shouldn't be greater than refresh cycle size extOpt3->IntRefCycleDist = 0; changed = true; } if ((extOpt2->MaxSliceSize) || (extOpt2->NumMbPerSlice) || (!sliceRowAlligned)) { extOpt2->IntRefType = 0; extOpt2->IntRefCycleSize = 0; unsupported = true; } } if (extOpt2->Trellis & ~(MFX_TRELLIS_OFF | MFX_TRELLIS_I | MFX_TRELLIS_P | MFX_TRELLIS_B)) { extOpt2->Trellis &= (MFX_TRELLIS_OFF | MFX_TRELLIS_I | MFX_TRELLIS_P | MFX_TRELLIS_B); changed = true; } if ((extOpt2->Trellis & MFX_TRELLIS_OFF) && (extOpt2->Trellis & ~MFX_TRELLIS_OFF)) { extOpt2->Trellis = MFX_TRELLIS_OFF; changed = true; } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (extOpt2->Trellis && IsSvcProfile(par.mfx.CodecProfile)) { extOpt2->Trellis = 0; changed = true; } #endif /*if (extOpt2->Trellis && hwCaps.EnhancedEncInput == 0) { extOpt2->Trellis = 0; unsupported = true; }*/ if (extOpt2->BRefType != 0 && extOpt2->BRefType != MFX_B_REF_OFF && par.mfx.CodecLevel != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { const mfxU16 nfxMaxByLevel = GetMaxNumRefFrame(par); const mfxU16 nfxMinForPyramid = GetMinNumRefFrameForPyramid(par); if (nfxMinForPyramid > nfxMaxByLevel) { // max dpb size is not enougn for pyramid changed = true; extOpt2->BRefType = MFX_B_REF_OFF; } else { if (par.mfx.NumRefFrame != 0 && par.mfx.NumRefFrame < nfxMinForPyramid) { changed = true; par.mfx.NumRefFrame = nfxMinForPyramid; } } } if (par.calcParam.numTemporalLayer > 1 && par.mfx.CodecLevel != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 const nrfMaxByLevel = GetMaxNumRefFrame(par); mfxU16 const nrfMinForTemporal = mfxU16(1 << (par.calcParam.numTemporalLayer - 2)); if (nrfMinForTemporal > nrfMaxByLevel) { // max dpb size is not enougn for requested number of temporal layers changed = true; par.calcParam.numTemporalLayer = 1; } else { if (par.mfx.NumRefFrame != 0 && par.mfx.NumRefFrame < nrfMinForTemporal) { changed = true; par.mfx.NumRefFrame = nrfMinForTemporal; } } } if (extRoi->NumROI && extRoi->ROIMode != MFX_ROI_MODE_QP_DELTA && extRoi->ROIMode != MFX_ROI_MODE_PRIORITY) { unsupported = true; extRoi->NumROI = 0; } if ((extRoi->NumROI && (extRoi->ROIMode == MFX_ROI_MODE_QP_DELTA || extRoi->ROIMode == MFX_ROI_MODE_PRIORITY ))&& hwCaps.ddi_caps.ROIBRCDeltaQPLevelSupport == 0) { unsupported = true; extRoi->NumROI = 0; } if (extRoi->NumROI) { if (extRoi->NumROI > hwCaps.ddi_caps.MaxNumOfROI) { if (hwCaps.ddi_caps.MaxNumOfROI == 0) unsupported = true; else changed = true; extRoi->NumROI = hwCaps.ddi_caps.MaxNumOfROI; } } for (mfxU16 i = 0; i < extRoi->NumROI; i++) { sts = CheckAndFixRoiQueryLike(par, (mfxRoiDesc*)(&(extRoi->ROI[i])), extRoi->ROIMode); if (sts < MFX_ERR_NONE) unsupported = true; else if (sts != MFX_ERR_NONE) changed = true; } if (extDirtyRect->NumRect > MFX_MAX_DIRTY_RECT_COUNT) { changed = true; extDirtyRect->NumRect = MFX_MAX_DIRTY_RECT_COUNT; } if (extDirtyRect->NumRect && hwCaps.ddi_caps.DirtyRectSupport == 0) { unsupported = true; extDirtyRect->NumRect = 0; } for (mfxU16 i = 0; i < extDirtyRect->NumRect; i++) { sts = CheckAndFixRectQueryLike(par, (mfxRectDesc*)(&(extDirtyRect->Rect[i]))); if (sts < MFX_ERR_NONE) unsupported = true; else if (sts != MFX_ERR_NONE) changed = true; } if (extMoveRect->NumRect > MFX_MAX_MOVE_RECT_COUNT) { changed = true; extMoveRect->NumRect = MFX_MAX_MOVE_RECT_COUNT; } if (extMoveRect->NumRect && hwCaps.ddi_caps.MoveRectSupport == 0) { unsupported = true; extMoveRect->NumRect = 0; } for (mfxU16 i = 0; i < extMoveRect->NumRect; i++) { sts = CheckAndFixMovingRectQueryLike(par, (mfxMovingRectDesc*)(&(extMoveRect->Rect[i]))); if (sts < MFX_ERR_NONE) unsupported = true; else if (sts != MFX_ERR_NONE) changed = true; } if (extPwt) { mfxU16 maxLuma[2] = {0}; mfxU16 maxChroma[2] = {0}; bool out_of_caps = false; if (0 == hwCaps.ddi_caps.NoWeightedPred) { // On linux, WP is FEI specific feature. So when legay encoder calls Query(), do not // enable the flag of this capability. if (hwCaps.ddi_caps.LumaWeightedPred) { maxLuma[0] = std::min(hwCaps.ddi_caps.MaxNum_WeightedPredL0, 32); maxLuma[1] = std::min(hwCaps.ddi_caps.MaxNum_WeightedPredL1, 32); } if (hwCaps.ddi_caps.ChromaWeightedPred) { maxChroma[0] = std::min(hwCaps.ddi_caps.MaxNum_WeightedPredL0, 32); maxChroma[1] = std::min(hwCaps.ddi_caps.MaxNum_WeightedPredL1, 32); } } for (mfxU16 lx = 0; lx < 2; lx++) { for (mfxU16 i = 0; i < 32 && !out_of_caps && extPwt->LumaWeightFlag[lx][i]; i++) out_of_caps = (i >= maxLuma[lx]); for (mfxU16 i = 0; i < 32 && !out_of_caps && extPwt->ChromaWeightFlag[lx][i]; i++) out_of_caps = (i >= maxChroma[lx]); } if (out_of_caps) { Zero(extPwt->LumaWeightFlag); Zero(extPwt->ChromaWeightFlag); for (mfxU16 lx = 0; lx < 2; lx++) { for (mfxU16 i = 0; i < maxLuma[lx]; i++) extPwt->LumaWeightFlag[lx][i] = 1; for (mfxU16 i = 0; i < maxChroma[lx]; i++) extPwt->ChromaWeightFlag[lx][i] = 1; } changed = true; } if (extPwt->LumaLog2WeightDenom && extPwt->LumaLog2WeightDenom != 6) { extPwt->LumaLog2WeightDenom = 6; changed = true; } if (extPwt->ChromaLog2WeightDenom && extPwt->ChromaLog2WeightDenom != 6) { extPwt->ChromaLog2WeightDenom = 6; changed = true; } } if (!CheckRangeDflt(extOpt2->SkipFrame, 0, 3, 0)) changed = true; if ( extOpt2->SkipFrame && hwCaps.ddi_caps.SkipFrame == 0 && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { extOpt2->SkipFrame = 0; changed = true; } bool mfxRateControlHwSupport = hwCaps.ddi_caps.FrameSizeToleranceSupport && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR); bool slidingWindowSupported = par.mfx.RateControlMethod == MFX_RATECONTROL_LA || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD || (mfxRateControlHwSupport && !IsOn(extOpt2->ExtBRC)); if (extOpt3->WinBRCMaxAvgKbps || extOpt3->WinBRCSize) { if (!slidingWindowSupported) { extOpt3->WinBRCMaxAvgKbps = 0; extOpt3->WinBRCSize = 0; par.calcParam.WinBRCMaxAvgKbps = 0; unsupported = true; } else if (extOpt3->WinBRCSize==0) { warning = true; } else if (mfxRateControlHwSupport && !IsOn(extOpt2->ExtBRC)) { if (par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxU16 iframerate = (mfxU16)ceil((mfxF64)par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD); if (extOpt3->WinBRCSize != iframerate) { extOpt3->WinBRCSize = iframerate; changed = true; } } else { CalculateMFXFramerate((mfxF64)extOpt3->WinBRCSize, &par.mfx.FrameInfo.FrameRateExtN, &par.mfx.FrameInfo.FrameRateExtD); changed = true; } if (par.calcParam.maxKbps) { if (par.calcParam.WinBRCMaxAvgKbps != par.calcParam.maxKbps) { par.calcParam.WinBRCMaxAvgKbps = (mfxU16)par.calcParam.maxKbps; changed = true; } } else if (par.calcParam.WinBRCMaxAvgKbps) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR && par.calcParam.targetKbps && par.calcParam.WinBRCMaxAvgKbps != par.calcParam.targetKbps) { par.calcParam.WinBRCMaxAvgKbps = par.calcParam.targetKbps; changed = true; } if (par.calcParam.targetKbps && par.calcParam.WinBRCMaxAvgKbps < par.calcParam.targetKbps) { extOpt3->WinBRCMaxAvgKbps = 0; par.calcParam.WinBRCMaxAvgKbps = 0; extOpt3->WinBRCSize = 0; unsupported = true; } else { par.calcParam.maxKbps = par.calcParam.WinBRCMaxAvgKbps; changed = true; } } else { warning = true; } } else if (par.calcParam.targetKbps && par.calcParam.WinBRCMaxAvgKbps < par.calcParam.targetKbps) { extOpt3->WinBRCMaxAvgKbps = 0; par.calcParam.WinBRCMaxAvgKbps = 0; extOpt3->WinBRCSize = 0; unsupported = true; } } if ( extOpt2->MinQPI || extOpt2->MaxQPI || extOpt2->MinQPP || extOpt2->MaxQPP || extOpt2->MinQPB || extOpt2->MaxQPB) { if (!CheckRangeDflt(extOpt2->MaxQPI, 0, 51, 0)) changed = true; if (!CheckRangeDflt(extOpt2->MaxQPP, 0, 51, 0)) changed = true; if (!CheckRangeDflt(extOpt2->MaxQPB, 0, 51, 0)) changed = true; if (!CheckRangeDflt(extOpt2->MinQPI, 0, (extOpt2->MaxQPI ? extOpt2->MaxQPI : 51), 0)) changed = true; if (!CheckRangeDflt(extOpt2->MinQPP, 0, (extOpt2->MaxQPP ? extOpt2->MaxQPP : 51), 0)) changed = true; if (!CheckRangeDflt(extOpt2->MinQPB, 0, (extOpt2->MaxQPB ? extOpt2->MaxQPB : 51), 0)) changed = true; } if (!CheckTriStateOption(extOpt3->BRCPanicMode)) changed = true; if (IsOff(extOpt3->BRCPanicMode) && (bRateControlLA(par.mfx.RateControlMethod) || (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) || (vaType != MFX_HW_VAAPI))) // neither CQP nor LA BRC modes nor Windows support BRC panic mode disabling { extOpt3->BRCPanicMode = MFX_CODINGOPTION_UNKNOWN; unsupported = true; } if (!CheckTriStateOption(extOpt3->EnableMBQP)) changed = true; if (IsOn(extOpt3->EnableMBQP) && !(hwCaps.ddi_caps.MbQpDataSupport && (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || isSWBRC(par)))) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; changed = true; } if (!CheckTriStateOption(extOpt3->EnableMBForceIntra)) changed = true; // at the moment LINUX , IOTG, OPEN SRC - feature unsupported if (IsOn(extOpt3->EnableMBForceIntra)) { extOpt3->EnableMBForceIntra = 0; changed = true; } if (!CheckTriStateOption(extOpt3->MBDisableSkipMap)) changed = true; if (IsOn(extOpt3->MBDisableSkipMap) && vaType != MFX_HW_VAAPI) { extOpt3->MBDisableSkipMap = MFX_CODINGOPTION_OFF; changed = true; } if (!CheckRangeDflt(extOpt2->DisableDeblockingIdc, 0, 2, 0)) changed = true; if (!CheckTriStateOption(extOpt2->EnableMAD)) changed = true; if (!CheckTriStateOption(extOpt2->AdaptiveI)) changed = true; if (IsOn(extOpt2->AdaptiveI) && (par.mfx.GopOptFlag & MFX_GOP_STRICT)) { extOpt2->AdaptiveI = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt2->AdaptiveI) && (!(IsExtBrcSceneChangeSupported(par, platform) && !(extBRC->pthis)) #if defined(MFX_ENABLE_ENCTOOLS) && IsOff(extConfig->AdaptiveI) #endif )) { extOpt2->AdaptiveI = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt2->AdaptiveI) && (par.mfx.GopOptFlag & MFX_GOP_STRICT)) { extOpt2->AdaptiveI = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt3->ExtBrcAdaptiveLTR) && (!(IsExtBrcSceneChangeSupported(par, platform) && !(extBRC->pthis))) #if defined(MFX_ENABLE_ENCTOOLS) && (extOpt2->LookAheadDepth == 0) #endif ) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; changed = true; } if (!CheckTriStateOption(extOpt2->AdaptiveB)) changed = true; if (IsOn(extOpt2->AdaptiveB) && (!(IsExtBrcSceneChangeSupported(par, platform) && !(extBRC->pthis)) #if defined(MFX_ENABLE_ENCTOOLS) && IsOff(extConfig->AdaptiveB) && (extOpt2->LookAheadDepth == 0) #endif )) { extOpt2->AdaptiveB = MFX_CODINGOPTION_OFF; changed = true; } if (IsOn(extOpt2->AdaptiveB) && (par.mfx.GopOptFlag & MFX_GOP_STRICT)) { extOpt2->AdaptiveB = MFX_CODINGOPTION_OFF; changed = true; } if (extOpt3->PRefType == MFX_P_REF_PYRAMID && par.mfx.GopRefDist > 1) { extOpt3->PRefType = MFX_P_REF_DEFAULT; changed = true; } if (!CheckRangeDflt(extOpt3->WeightedPred, (mfxU16)MFX_WEIGHTED_PRED_UNKNOWN, (mfxU16)MFX_WEIGHTED_PRED_EXPLICIT, (mfxU16)MFX_WEIGHTED_PRED_DEFAULT)) changed = true; if (!CheckRangeDflt(extOpt3->WeightedBiPred, (mfxU16)MFX_WEIGHTED_PRED_UNKNOWN, (mfxU16)MFX_WEIGHTED_PRED_IMPLICIT, (mfxU16)MFX_WEIGHTED_PRED_DEFAULT)) changed = true; if ( hwCaps.ddi_caps.NoWeightedPred && (extOpt3->WeightedPred == MFX_WEIGHTED_PRED_EXPLICIT || extOpt3->WeightedBiPred == MFX_WEIGHTED_PRED_EXPLICIT)) { extOpt3->WeightedPred = MFX_WEIGHTED_PRED_DEFAULT; extOpt3->WeightedBiPred = MFX_WEIGHTED_PRED_DEFAULT; unsupported = true; } if (!CheckTriStateOption(extOpt3->FadeDetection)) changed = true; // disable WP for legacy encoder on linux if ( (extOpt3->WeightedPred == MFX_WEIGHTED_PRED_EXPLICIT || extOpt3->WeightedBiPred == MFX_WEIGHTED_PRED_EXPLICIT || extOpt3->WeightedBiPred == MFX_WEIGHTED_PRED_IMPLICIT)) { extOpt3->WeightedPred = MFX_WEIGHTED_PRED_DEFAULT; extOpt3->WeightedBiPred = MFX_WEIGHTED_PRED_DEFAULT; changed = true; } #ifndef MFX_AVC_ENCODING_UNIT_DISABLE if (!CheckTriStateOption(extOpt3->EncodedUnitsInfo)) changed = true; if ((par.calcParam.numTemporalLayer > 1 || IsMvcProfile(par.mfx.CodecProfile)) && IsOn(extOpt3->EncodedUnitsInfo)) { extOpt3->EncodedUnitsInfo = MFX_CODINGOPTION_OFF; unsupported = true; } #endif #ifdef MFX_ENABLE_H264_REPARTITION_CHECK if (!CheckTriStateOptionWithAdaptive(extOpt3->RepartitionCheckEnable)) { changed = true; } if (!hwCaps.ddi_caps.ForceRepartitionCheckSupport && IsOn(extOpt3->RepartitionCheckEnable)) { extOpt3->RepartitionCheckEnable = MFX_CODINGOPTION_UNKNOWN; unsupported = true; } #endif // MFX_ENABLE_H264_REPARTITION_CHECK return unsupported ? MFX_ERR_UNSUPPORTED : (changed || warning) ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } // checks MVC per-view parameters (bitrates, buffer size, initial delay, level) mfxStatus MfxHwH264Encode::CheckVideoParamMvcQueryLike(MfxVideoParam & par) { bool changed = false; mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); mfxExtSpsHeader & extSps = GetExtBufferRef(par); // first of all allign CodecLevel with general (not per-view) parameters: resolution, framerate, DPB size if (par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 minLevel = GetLevelLimitByFrameSize(par); if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } if (par.calcParam.mvcPerViewPar.codecLevel == 0) par.calcParam.mvcPerViewPar.codecLevel = minLevel; } if (extSps.vui.flags.timingInfoPresent && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxU16 minLevel = GetLevelLimitByMbps(par); if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } } if (par.mfx.NumRefFrame != 0 && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0) { mfxU16 minLevel = GetLevelLimitByDpbSize(par); if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = false; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } } // check MVC per-view parameters (bitrates, buffer size, initial delay, level) if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.calcParam.mvcPerViewPar.targetKbps != 0) { if (par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxF64 rawDataBitrate = 12.0 * par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height * par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD; mfxU32 minTargetKbps = mfxU32(std::min(0xffffffff, rawDataBitrate / 1000.0 / 500.0)); if (par.calcParam.mvcPerViewPar.targetKbps < minTargetKbps) { changed = true; par.calcParam.mvcPerViewPar.targetKbps = minTargetKbps; } } if (extSps.vui.flags.nalHrdParametersPresent || extSps.vui.flags.vclHrdParametersPresent) { mfxU16 profile = MFX_PROFILE_AVC_HIGH; for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.mvcPerViewPar.targetKbps)) { if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } break; } } if (profile == MFX_PROFILE_UNKNOWN) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } if (par.calcParam.mvcPerViewPar.targetKbps != 0 && par.calcParam.mvcPerViewPar.maxKbps != 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { if (par.calcParam.mvcPerViewPar.maxKbps != par.calcParam.mvcPerViewPar.targetKbps) { changed = true; if (extSps.vui.flags.nalHrdParametersPresent || extSps.vui.flags.vclHrdParametersPresent) par.calcParam.mvcPerViewPar.targetKbps = par.calcParam.mvcPerViewPar.maxKbps; else par.calcParam.mvcPerViewPar.maxKbps = par.calcParam.mvcPerViewPar.targetKbps; } } else if ( par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_WIDI_VBR) { if (par.calcParam.mvcPerViewPar.maxKbps < par.calcParam.mvcPerViewPar.targetKbps) { if (extBits.SPSBuffer && ( extSps.vui.flags.nalHrdParametersPresent || extSps.vui.flags.vclHrdParametersPresent)) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.maxKbps = par.calcParam.mvcPerViewPar.targetKbps; } } } if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.calcParam.mvcPerViewPar.maxKbps != 0) { mfxU16 profile = MFX_PROFILE_AVC_HIGH; for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByMaxBitrate(profile, par.calcParam.mvcPerViewPar.maxKbps)) { if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } break; } } if (profile == MFX_PROFILE_UNKNOWN) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } if (par.calcParam.mvcPerViewPar.bufferSizeInKB != 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { mfxU32 uncompressedSizeInKb = GetMaxCodedFrameSizeInKB(par); if (par.calcParam.mvcPerViewPar.bufferSizeInKB < uncompressedSizeInKb) { changed = true; par.calcParam.mvcPerViewPar.bufferSizeInKB = uncompressedSizeInKb; } } else { mfxF64 avgFrameSizeInKB = 0; if (par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0 && par.calcParam.mvcPerViewPar.targetKbps != 0) { mfxF64 frameRate = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; avgFrameSizeInKB = par.calcParam.mvcPerViewPar.targetKbps / frameRate / 8; if (par.calcParam.mvcPerViewPar.bufferSizeInKB < 2 * avgFrameSizeInKB) { if (extBits.SPSBuffer && ( extSps.vui.flags.nalHrdParametersPresent || extSps.vui.flags.vclHrdParametersPresent)) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.bufferSizeInKB = mfxU16(2 * avgFrameSizeInKB + 1); } } mfxU16 profile = MFX_PROFILE_AVC_HIGH; for (; profile != MFX_PROFILE_UNKNOWN; profile = GetNextProfile(profile)) { if (mfxU16 minLevel = GetLevelLimitByBufferSize(profile, par.calcParam.mvcPerViewPar.bufferSizeInKB)) { if (par.calcParam.mvcPerViewPar.codecLevel != 0 && par.calcParam.mvcPerViewPar.codecLevel < minLevel) { if (extBits.SPSBuffer) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); changed = true; par.calcParam.mvcPerViewPar.codecLevel = minLevel; } break; } } if (profile == MFX_PROFILE_UNKNOWN) return Error(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_AVBR && par.calcParam.mvcPerViewPar.initialDelayInKB != 0) { if (par.calcParam.mvcPerViewPar.initialDelayInKB > par.calcParam.mvcPerViewPar.bufferSizeInKB) { changed = true; par.calcParam.mvcPerViewPar.initialDelayInKB = par.calcParam.mvcPerViewPar.bufferSizeInKB / 2; } if (avgFrameSizeInKB != 0 && par.calcParam.mvcPerViewPar.initialDelayInKB < avgFrameSizeInKB) { changed = true; par.calcParam.mvcPerViewPar.initialDelayInKB = mfxU16(std::min(par.calcParam.mvcPerViewPar.bufferSizeInKB, avgFrameSizeInKB)); } } } } return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } // check mfxExtMVCSeqDesc as in Query mfxStatus MfxHwH264Encode::CheckMVCSeqDescQueryLike(mfxExtMVCSeqDesc * mvcSeqDesc) { bool unsupported = false; if (mvcSeqDesc->NumView > 0 && mvcSeqDesc->NumView != 2) { unsupported = true; mvcSeqDesc->NumView = 0; } if (mvcSeqDesc->NumOP > 1024) { unsupported = true; mvcSeqDesc->NumOP = 0; } if (mvcSeqDesc->NumOP > 0 && mvcSeqDesc->NumViewId > 1024 * mvcSeqDesc->NumOP) { unsupported = true; mvcSeqDesc->NumViewId = 0; } if (mvcSeqDesc->NumViewAlloc > 0 && (mvcSeqDesc->NumViewAlloc < mvcSeqDesc->NumView)) { unsupported = true; mvcSeqDesc->NumViewAlloc = 0; } return unsupported ? MFX_ERR_UNSUPPORTED : MFX_ERR_NONE; } // check mfxExtMVCSeqDesc before encoding mfxStatus MfxHwH264Encode::CheckAndFixMVCSeqDesc(mfxExtMVCSeqDesc * mvcSeqDesc, bool isViewOutput) { if (mvcSeqDesc == nullptr) { return MFX_ERR_NULL_PTR; } bool unsupported = false; bool changed = false; if (mvcSeqDesc->NumView > 2 || mvcSeqDesc->NumView < 2) { unsupported = true; mvcSeqDesc->NumView = 0; } if (mvcSeqDesc->NumOP > 1024) { unsupported = true; mvcSeqDesc->NumOP = 0; } if (mvcSeqDesc->NumOP > 0 && mvcSeqDesc->NumViewId > 1024 * mvcSeqDesc->NumOP) { unsupported = true; mvcSeqDesc->NumViewId = 0; } if (mvcSeqDesc->NumViewAlloc > 0 && mvcSeqDesc->NumViewAlloc < mvcSeqDesc->NumView) { changed = true; mvcSeqDesc->NumViewAlloc = 0; mvcSeqDesc->View = 0; } if (mvcSeqDesc->NumViewAlloc > 0) { if (mvcSeqDesc->View == 0) { unsupported = true; } else { if (mvcSeqDesc->View[0].ViewId != 0 && isViewOutput) { changed = true; mvcSeqDesc->View[0].ViewId = 0; } } } if (mvcSeqDesc->NumViewIdAlloc > 0 && mvcSeqDesc->NumViewIdAlloc < mvcSeqDesc->NumViewId) { changed = true; mvcSeqDesc->NumViewId = 0; mvcSeqDesc->NumViewIdAlloc = 0; mvcSeqDesc->ViewId = 0; } if (mvcSeqDesc->NumViewIdAlloc > 0) { if (mvcSeqDesc->ViewId == 0) { unsupported = true; } else { if (mvcSeqDesc->ViewId[0] != 0 && isViewOutput) { changed = true; mvcSeqDesc->ViewId[0] = 0; } } } if (mvcSeqDesc->NumOPAlloc > 0 && mvcSeqDesc->NumOPAlloc < mvcSeqDesc->NumOP) { changed = true; mvcSeqDesc->NumOP = 0; mvcSeqDesc->NumOPAlloc = 0; mvcSeqDesc->OP = 0; } if (mvcSeqDesc->NumOPAlloc > 0 && mvcSeqDesc->OP == 0) { unsupported = true; } return unsupported ? MFX_ERR_UNSUPPORTED : changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } void MfxHwH264Encode::InheritDefaultValues( MfxVideoParam const & parInit, MfxVideoParam & parReset, MFX_ENCODE_CAPS const & hwCaps, mfxVideoParam const * parResetIn) { mfxExtCodingOption const & extOptInit = GetExtBufferRef(parInit); mfxExtCodingOption * extOptReset = GetExtBuffer(parReset); mfxExtCodingOption3 const & extOpt3Init = GetExtBufferRef(parInit); mfxExtCodingOption3 * extOpt3Reset = GetExtBuffer(parReset); mfxExtCodingOption2 const & extOpt2Init = GetExtBufferRef(parInit); mfxExtCodingOption2 * extOpt2Reset = GetExtBuffer(parReset); mfxU32 TCBRCTargetFrameSize = 0; InheritOption(extOptInit.NalHrdConformance, extOptReset->NalHrdConformance); InheritOption(extOpt3Init.LowDelayBRC, extOpt3Reset->LowDelayBRC); InheritOption(parInit.mfx.RateControlMethod, parReset.mfx.RateControlMethod); InheritOption(parInit.mfx.FrameInfo.FrameRateExtN, parReset.mfx.FrameInfo.FrameRateExtN); InheritOption(parInit.mfx.FrameInfo.FrameRateExtD, parReset.mfx.FrameInfo.FrameRateExtD); InheritOption(parInit.mfx.BRCParamMultiplier, parReset.mfx.BRCParamMultiplier); InheritOption(extOpt3Init.ScenarioInfo, extOpt3Reset->ScenarioInfo); InheritOption(extOpt3Init.AdaptiveMaxFrameSize, extOpt3Reset->AdaptiveMaxFrameSize); InheritOption(parInit.mfx.LowPower, parReset.mfx.LowPower); InheritOption(extOpt2Init.LookAheadDepth, extOpt2Reset->LookAheadDepth); if (IsTCBRC(parReset, hwCaps)) { TCBRCTargetFrameSize = GetAvgFrameSizeInBytes(parReset, false); if (extOpt2Reset->MaxFrameSize == 0 && parReset.mfx.MaxKbps != 0) extOpt2Reset->MaxFrameSize = GetAvgFrameSizeInBytes(parReset, true); // TCBRC Reset is a special case - Below BRC params are used only to calculate TCBRCTargetFrameSize // and after that, they must be restored to parInit params. // This is needed to avoid real heavy BRC reset // // For case, when TCBRCTargetFrameSize will be greater than extOpt2.MaxFrameSize or extOpt3.MaxFrameSizeI // real BRC Reset will be called parReset.mfx.TargetKbps = parInit.mfx.TargetKbps; parReset.mfx.MaxKbps = parInit.mfx.MaxKbps; parReset.mfx.InitialDelayInKB = parInit.mfx.InitialDelayInKB; parReset.mfx.BufferSizeInKB = parInit.mfx.BufferSizeInKB; parReset.mfx.BRCParamMultiplier = parInit.mfx.BRCParamMultiplier; } InheritOption(parInit.AsyncDepth, parReset.AsyncDepth); InheritOption(parInit.mfx.CodecId, parReset.mfx.CodecId); InheritOption(parInit.mfx.CodecProfile, parReset.mfx.CodecProfile); InheritOption(parInit.mfx.CodecLevel, parReset.mfx.CodecLevel); InheritOption(parInit.mfx.NumThread, parReset.mfx.NumThread); InheritOption(parInit.mfx.TargetUsage, parReset.mfx.TargetUsage); InheritOption(parInit.mfx.GopPicSize, parReset.mfx.GopPicSize); InheritOption(parInit.mfx.GopRefDist, parReset.mfx.GopRefDist); InheritOption(parInit.mfx.GopOptFlag, parReset.mfx.GopOptFlag); InheritOption(parInit.mfx.IdrInterval, parReset.mfx.IdrInterval); InheritOption(parInit.mfx.BufferSizeInKB, parReset.mfx.BufferSizeInKB); InheritOption(parInit.mfx.NumSlice, parReset.mfx.NumSlice); InheritOption(parInit.mfx.NumRefFrame, parReset.mfx.NumRefFrame); InheritOption(parInit.mfx.LowPower, parReset.mfx.LowPower); if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_CBR && parReset.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { InheritOption(parInit.mfx.InitialDelayInKB, parReset.mfx.InitialDelayInKB); InheritOption(parInit.mfx.TargetKbps, parReset.mfx.TargetKbps); } if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_VBR && parReset.mfx.RateControlMethod == MFX_RATECONTROL_VBR) { InheritOption(parInit.mfx.InitialDelayInKB, parReset.mfx.InitialDelayInKB); InheritOption(parInit.mfx.TargetKbps, parReset.mfx.TargetKbps); InheritOption(parInit.mfx.MaxKbps, parReset.mfx.MaxKbps); } if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_CQP && parReset.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { InheritOption(parInit.mfx.QPI, parReset.mfx.QPI); InheritOption(parInit.mfx.QPP, parReset.mfx.QPP); InheritOption(parInit.mfx.QPB, parReset.mfx.QPB); } if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_AVBR && parReset.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { InheritOption(parInit.mfx.Accuracy, parReset.mfx.Accuracy); InheritOption(parInit.mfx.Convergence, parReset.mfx.Convergence); } if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_ICQ && parReset.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) InheritOption(parInit.mfx.ICQQuality, parReset.mfx.ICQQuality); if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_VCM && parReset.mfx.RateControlMethod == MFX_RATECONTROL_VCM) { InheritOption(parInit.mfx.InitialDelayInKB, parReset.mfx.InitialDelayInKB); InheritOption(parInit.mfx.TargetKbps, parReset.mfx.TargetKbps); InheritOption(parInit.mfx.MaxKbps, parReset.mfx.MaxKbps); } InheritOption(parInit.mfx.FrameInfo.FourCC, parReset.mfx.FrameInfo.FourCC); InheritOption(parInit.mfx.FrameInfo.FourCC, parReset.mfx.FrameInfo.FourCC); InheritOption(parInit.mfx.FrameInfo.Width, parReset.mfx.FrameInfo.Width); InheritOption(parInit.mfx.FrameInfo.Height, parReset.mfx.FrameInfo.Height); InheritOption(parInit.mfx.FrameInfo.CropX, parReset.mfx.FrameInfo.CropX); InheritOption(parInit.mfx.FrameInfo.CropY, parReset.mfx.FrameInfo.CropY); InheritOption(parInit.mfx.FrameInfo.CropW, parReset.mfx.FrameInfo.CropW); InheritOption(parInit.mfx.FrameInfo.CropH, parReset.mfx.FrameInfo.CropH); InheritOption(parInit.mfx.FrameInfo.AspectRatioW, parReset.mfx.FrameInfo.AspectRatioW); InheritOption(parInit.mfx.FrameInfo.AspectRatioH, parReset.mfx.FrameInfo.AspectRatioH); InheritOption(extOptInit.RateDistortionOpt, extOptReset->RateDistortionOpt); InheritOption(extOptInit.MECostType, extOptReset->MECostType); InheritOption(extOptInit.MESearchType, extOptReset->MESearchType); InheritOption(extOptInit.MVSearchWindow.x, extOptReset->MVSearchWindow.x); InheritOption(extOptInit.MVSearchWindow.y, extOptReset->MVSearchWindow.y); InheritOption(extOptInit.EndOfSequence, extOptReset->EndOfSequence); InheritOption(extOptInit.FramePicture, extOptReset->FramePicture); InheritOption(extOptInit.CAVLC, extOptReset->CAVLC); InheritOption(extOptInit.SingleSeiNalUnit, extOptReset->SingleSeiNalUnit); InheritOption(extOptInit.VuiVclHrdParameters, extOptReset->VuiVclHrdParameters); InheritOption(extOptInit.RefPicListReordering, extOptReset->RefPicListReordering); InheritOption(extOptInit.ResetRefList, extOptReset->ResetRefList); InheritOption(extOptInit.RefPicMarkRep, extOptReset->RefPicMarkRep); InheritOption(extOptInit.FieldOutput, extOptReset->FieldOutput); InheritOption(extOptInit.IntraPredBlockSize, extOptReset->IntraPredBlockSize); InheritOption(extOptInit.InterPredBlockSize, extOptReset->InterPredBlockSize); InheritOption(extOptInit.MVPrecision, extOptReset->MVPrecision); InheritOption(extOptInit.MaxDecFrameBuffering, extOptReset->MaxDecFrameBuffering); InheritOption(extOptInit.AUDelimiter, extOptReset->AUDelimiter); InheritOption(extOptInit.EndOfStream, extOptReset->EndOfStream); InheritOption(extOptInit.PicTimingSEI, extOptReset->PicTimingSEI); InheritOption(extOptInit.VuiNalHrdParameters, extOptReset->VuiNalHrdParameters); if (!parResetIn || !(mfxExtCodingOption2 const *)GetExtBuffer(*parResetIn)) //user should be able to disable IntraRefresh via Reset() { InheritOption(extOpt2Init.IntRefType, extOpt2Reset->IntRefType); InheritOption(extOpt2Init.IntRefCycleSize, extOpt2Reset->IntRefCycleSize); } InheritOption(extOpt2Init.DisableVUI, extOpt2Reset->DisableVUI); InheritOption(extOpt2Init.SkipFrame, extOpt2Reset->SkipFrame); InheritOption(extOpt3Init.PRefType, extOpt3Reset->PRefType); #if defined(MFX_ENABLE_EXT_BRC) InheritOption(extOpt2Init.ExtBRC, extOpt2Reset->ExtBRC); #endif InheritOption(extOpt3Init.NumSliceI, extOpt3Reset->NumSliceI); InheritOption(extOpt3Init.NumSliceP, extOpt3Reset->NumSliceP); InheritOption(extOpt3Init.NumSliceB, extOpt3Reset->NumSliceB); if (!parResetIn || !(mfxExtCodingOption3 const *)GetExtBuffer(*parResetIn)) InheritOption(extOpt3Init.IntRefCycleDist, extOpt3Reset->IntRefCycleDist); if (parInit.mfx.RateControlMethod == MFX_RATECONTROL_QVBR && parReset.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) { InheritOption(parInit.mfx.InitialDelayInKB, parReset.mfx.InitialDelayInKB); InheritOption(parInit.mfx.TargetKbps, parReset.mfx.TargetKbps); InheritOption(parInit.mfx.MaxKbps, parReset.mfx.MaxKbps); InheritOption(extOpt3Init.QVBRQuality, extOpt3Reset->QVBRQuality); } #if defined(MFX_ENABLE_EXT_BRC) mfxExtBRC & extBRCInit = GetExtBufferRef(parInit); mfxExtBRC & extBRCReset = GetExtBufferRef(parReset); if (!extBRCReset.pthis && !extBRCReset.Init && !extBRCReset.Reset && !extBRCReset.Close && !extBRCReset.GetFrameCtrl && !extBRCReset.Update) { extBRCReset = extBRCInit; } #endif #if defined(MFX_ENABLE_ENCTOOLS) mfxExtEncToolsConfig &configInit = GetExtBufferRef(parInit); mfxExtEncToolsConfig &configReset = GetExtBufferRef(parReset); if (!IsEncToolsOptOn(configReset) && IsEncToolsOptOn(configInit)) ResetEncToolsPar(configReset, 0); InheritOption(configInit.AdaptiveI, configReset.AdaptiveI); InheritOption(configInit.AdaptiveB, configReset.AdaptiveB); InheritOption(configInit.AdaptiveRefP, configReset.AdaptiveRefP); InheritOption(configInit.AdaptiveRefB, configReset.AdaptiveRefB); InheritOption(configInit.SceneChange, configReset.SceneChange); InheritOption(configInit.AdaptiveLTR, configReset.AdaptiveLTR); InheritOption(configInit.AdaptivePyramidQuantP, configReset.AdaptivePyramidQuantP); InheritOption(configInit.AdaptivePyramidQuantB, configReset.AdaptivePyramidQuantB); InheritOption(configInit.BRCBufferHints, configReset.BRCBufferHints); InheritOption(configInit.BRC, configReset.BRC); #endif parReset.SyncVideoToCalculableParam(); parReset.calcParam.TCBRCTargetFrameSize = TCBRCTargetFrameSize; // not inherited: // InheritOption(parInit.mfx.FrameInfo.PicStruct, parReset.mfx.FrameInfo.PicStruct); // InheritOption(parInit.IOPattern, parReset.IOPattern); // InheritOption(parInit.mfx.FrameInfo.ChromaFormat, parReset.mfx.FrameInfo.ChromaFormat); } namespace { bool IsDyadic(mfxU32 tempScales[8], mfxU32 numTempLayers) { if (numTempLayers > 0) for (mfxU32 i = 1; i < numTempLayers; ++i) if (tempScales[i] != 2 * tempScales[i - 1]) return false; return true; } bool IsPowerOf2(mfxU32 n) { return (n & (n - 1)) == 0; } }; bool IsHRDBasedBRCMethod(mfxU16 RateControlMethod) { return RateControlMethod != MFX_RATECONTROL_CQP && RateControlMethod != MFX_RATECONTROL_AVBR && RateControlMethod != MFX_RATECONTROL_ICQ && RateControlMethod != MFX_RATECONTROL_LA && RateControlMethod != MFX_RATECONTROL_LA_ICQ; } bool MfxHwH264Encode::isSWBRC(MfxVideoParam const & par) { mfxExtCodingOption2 &extOpt2 = GetExtBufferRef(par); return (bRateControlLA(par.mfx.RateControlMethod) || (IsOn(extOpt2.ExtBRC) && (extOpt2.LookAheadDepth == 0) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR))); } bool MfxHwH264Encode::isAdaptiveQP(MfxVideoParam const & video) { if ((video.mfx.GopRefDist == 8) && (video.mfx.FrameInfo.PicStruct == 0 || video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && video.calcParam.numTemporalLayer == 0 ) { mfxExtCodingOption3 &extOpt3 = GetExtBufferRef(video); return IsOff(extOpt3.EnableQPOffset); } return false; } bool MfxHwH264Encode::isAdaptiveCQMSupported(mfxU16 scenarioInfo, bool isLowPowerOn) { return ((scenarioInfo == MFX_SCENARIO_GAME_STREAMING) || (scenarioInfo == MFX_SCENARIO_REMOTE_GAMING)) && isLowPowerOn; } void MfxHwH264Encode::SetDefaults( MfxVideoParam & par, MFX_ENCODE_CAPS const & hwCaps, bool setExtAlloc, eMFXHWType platform, eMFXVAType vaType, eMFXGTConfig config) { mfxExtCodingOption * extOpt = GetExtBuffer(par); mfxExtCodingOption2 * extOpt2 = GetExtBuffer(par); mfxExtCodingOption3 * extOpt3 = GetExtBuffer(par); mfxExtCodingOptionDDI * extDdi = GetExtBuffer(par); mfxExtVideoSignalInfo * extVsi = GetExtBuffer(par); mfxExtCodingOptionSPSPPS * extBits = GetExtBuffer(par); mfxExtSpsHeader * extSps = GetExtBuffer(par); mfxExtPpsHeader * extPps = GetExtBuffer(par); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxExtSVCSeqDesc * extSvc = GetExtBuffer(par); mfxExtSVCRateControl * extRc = GetExtBuffer(par); #endif mfxExtChromaLocInfo* extCli = GetExtBuffer(par); #if defined(MFX_ENABLE_ENCTOOLS) mfxExtEncToolsConfig *extConfig = GetExtBuffer(par); #endif if (extOpt2->UseRawRef) extDdi->RefRaw = extOpt2->UseRawRef; else if (!extOpt2->UseRawRef) extOpt2->UseRawRef = extDdi->RefRaw; if (extOpt2->UseRawRef == MFX_CODINGOPTION_UNKNOWN) extOpt2->UseRawRef = MFX_CODINGOPTION_OFF; if (IsOn(par.mfx.LowPower)) { if (par.mfx.GopRefDist == 0) { // on DG2+ 3 B-frames with B-pyramid is default par.mfx.GopRefDist = H264ECaps::IsVDEncBFrameSupported(platform) ? 4 : 1; } if (par.mfx.FrameInfo.PicStruct == 0) par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } if (extOpt2->MaxSliceSize) { if (par.mfx.GopRefDist == 0) par.mfx.GopRefDist = 1; if (par.mfx.FrameInfo.PicStruct == 0) par.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (par.AsyncDepth == 0) par.AsyncDepth = 1; if (!IsDriverSliceSizeControlEnabled(par, hwCaps)) { if (par.mfx.RateControlMethod == 0) par.mfx.RateControlMethod = MFX_RATECONTROL_LA; if (extOpt2->LookAheadDepth == 0) extOpt2->LookAheadDepth = 1; if (extOpt2->LookAheadDS == MFX_LOOKAHEAD_DS_UNKNOWN) extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_2x; } else { if (par.mfx.RateControlMethod == 0) par.mfx.RateControlMethod = MFX_RATECONTROL_CBR; } } mfxU8 fieldCodingPossible = IsFieldCodingPossible(par); if (par.IOPattern == 0) par.IOPattern = setExtAlloc ? mfxU16(MFX_IOPATTERN_IN_VIDEO_MEMORY) : mfxU16(MFX_IOPATTERN_IN_SYSTEM_MEMORY); if (par.AsyncDepth == 0) par.AsyncDepth = GetDefaultAsyncDepth(par); if (par.mfx.TargetUsage == 0) par.mfx.TargetUsage = 4; if (par.mfx.NumSlice == 0) { if (extOpt2->NumMbPerSlice != 0) { par.mfx.NumSlice = ( (par.mfx.FrameInfo.Width / 16) * (par.mfx.FrameInfo.Height / 16 / (fieldCodingPossible ? 2 : 1)) + extOpt2->NumMbPerSlice - 1) / extOpt2->NumMbPerSlice; } else par.mfx.NumSlice = 1; } if (par.mfx.RateControlMethod == 0) par.mfx.RateControlMethod = MFX_RATECONTROL_CBR; if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && par.calcParam.cqpHrdMode == 0) { mfxU16 maxQP = 51; mfxU16 minQP = IsOn(par.mfx.LowPower) ? 10 : 1; // 10 is min QP for VDENC if (!par.mfx.QPI) par.mfx.QPI = mfxU16(std::max(par.mfx.QPP - 1, minQP) * !!par.mfx.QPP); if (!par.mfx.QPI) par.mfx.QPI = mfxU16(std::max(par.mfx.QPB - 2, minQP) * !!par.mfx.QPB); if (!par.mfx.QPI) par.mfx.QPI = std::max(minQP, (maxQP + 1) / 2); if (!par.mfx.QPP) par.mfx.QPP = std::min(par.mfx.QPI + 1, maxQP); if (!par.mfx.QPB) par.mfx.QPB = std::min(par.mfx.QPP + 1, maxQP); } if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { if (par.mfx.Accuracy == 0) par.mfx.Accuracy = 100; if (par.mfx.Convergence == 0) par.mfx.Convergence = AVBR_CONVERGENCE_MAX; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) { if (par.mfx.ICQQuality == 0) par.mfx.ICQQuality = 26; } if (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) { if (extOpt3->QVBRQuality == 0) extOpt3->QVBRQuality = 26; } if (par.mfx.GopRefDist == 0) { if (IsAvcBaseProfile(par.mfx.CodecProfile) || par.mfx.CodecProfile == MFX_PROFILE_AVC_CONSTRAINED_HIGH || (par.calcParam.numTemporalLayer > 0 && par.calcParam.tempScalabilityMode) || hwCaps.ddi_caps.SliceIPOnly) { par.mfx.GopRefDist = 1; } else if (par.calcParam.numTemporalLayer > 1) { // svc temporal layers par.mfx.GopRefDist = 1; extOpt2->BRefType = MFX_B_REF_OFF; if (IsDyadic(par.calcParam.scale, par.calcParam.numTemporalLayer) && par.mfx.GopPicSize % par.calcParam.scale[par.calcParam.numTemporalLayer - 1] == 0) { if (par.calcParam.numTemporalLayer == 2) { par.mfx.GopRefDist = 2; extOpt2->BRefType = MFX_B_REF_OFF; } else { par.mfx.GopRefDist = 4; extOpt2->BRefType = MFX_B_REF_PYRAMID; } } } else { par.mfx.GopRefDist = (IsOn(extOpt2->AdaptiveI) || IsOn(extOpt2->AdaptiveB) || #if defined(MFX_ENABLE_ENCTOOLS) IsOn(extConfig->AdaptiveI) || IsOn(extConfig->AdaptiveB) || #endif IsAdaptiveLtrOn(par))? 8 : 3; } } if (par.mfx.GopPicSize > 0 && par.mfx.GopPicSize <= par.mfx.GopRefDist) par.mfx.GopRefDist = par.mfx.GopPicSize; if ( (par.mfx.RateControlMethod == MFX_RATECONTROL_LA || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) && (extOpt3->WinBRCMaxAvgKbps || extOpt3->WinBRCSize)) { if (!extOpt3->WinBRCMaxAvgKbps) { extOpt3->WinBRCMaxAvgKbps = par.mfx.TargetKbps * 2; par.calcParam.WinBRCMaxAvgKbps = par.calcParam.targetKbps * 2; } if (!extOpt3->WinBRCSize) { extOpt3->WinBRCSize = (mfxU16)(par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD); extOpt3->WinBRCSize = (!extOpt3->WinBRCSize) ? 30 : extOpt3->WinBRCSize; } } //WA for MVC quality problem on progressive content. if (IsMvcProfile(par.mfx.CodecProfile)) { extDdi->NumActiveRefP = extDdi->NumActiveRefBL0 = extDdi->NumActiveRefBL1 = 1; } if (extDdi->NumActiveRefP == 0) { { mfxU16 maxNumActivePL0 = GetMaxNumRefActivePL0(par.mfx.TargetUsage, platform, IsOn(par.mfx.LowPower), par.mfx.FrameInfo); extDdi->NumActiveRefP = extOpt3->NumRefActiveP[0] ? std::min(maxNumActivePL0, extOpt3->NumRefActiveP[0]) : GetDefaultNumRefActivePL0(par.mfx, platform); } } if (par.mfx.GopRefDist > 1) { if (extDdi->NumActiveRefBL0 == 0) { { mfxU16 maxNumActiveBL0 = GetMaxNumRefActiveBL0(par.mfx.TargetUsage, platform, IsOn(par.mfx.LowPower)); extDdi->NumActiveRefBL0 = extOpt3->NumRefActiveBL0[0] ? std::min(maxNumActiveBL0, extOpt3->NumRefActiveBL0[0]) : GetDefaultNumRefActiveBL0(par.mfx, platform); } } /* if (extDdi->NumActiveRefBL0 == 0) */ if (extDdi->NumActiveRefBL1 == 0) { { mfxU16 maxNumActiveBL1 = GetMaxNumRefActiveBL1(par.mfx.TargetUsage, par.mfx.FrameInfo.PicStruct, IsOn(par.mfx.LowPower)); extDdi->NumActiveRefBL1 = extOpt3->NumRefActiveBL1[0] ? std::min(maxNumActiveBL1, extOpt3->NumRefActiveBL1[0]) : GetDefaultNumRefActiveBL1(par.mfx, platform); } } /* if (extDdi->NumActiveRefBL1 == 0) */ } if (par.mfx.GopPicSize == 0) { mfxU32 maxScale = (par.calcParam.numTemporalLayer) > 0 ? par.calcParam.scale[par.calcParam.numTemporalLayer - 1] : 1; par.mfx.GopPicSize = mfxU16((256 + maxScale - 1) / maxScale * maxScale); } if (extOpt2->BRefType == MFX_B_REF_UNKNOWN) { assert(par.mfx.GopRefDist > 0); assert(par.mfx.GopPicSize > 0); if (IsDyadic(par.calcParam.scale, par.calcParam.numTemporalLayer) && par.mfx.GopRefDist >= 4 && (!par.mfx.NumRefFrame || par.mfx.NumRefFrame >= GetMinNumRefFrameForPyramid(par)) && (!IsMvcProfile(par.mfx.CodecProfile) || (IsPowerOf2(par.mfx.GopRefDist) && (par.mfx.GopPicSize % par.mfx.GopRefDist) == 0)) && par.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) { extOpt2->BRefType = MFX_B_REF_PYRAMID; } else { extOpt2->BRefType = MFX_B_REF_OFF; } } if (par.mfx.FrameInfo.FourCC == 0) par.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; if (par.mfx.FrameInfo.ChromaFormat == 0) par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (par.mfx.FrameInfo.CropW == 0) par.mfx.FrameInfo.CropW = par.mfx.FrameInfo.Width - par.mfx.FrameInfo.CropX; if (par.mfx.FrameInfo.CropH == 0) par.mfx.FrameInfo.CropH = par.mfx.FrameInfo.Height - par.mfx.FrameInfo.CropY; if (par.mfx.FrameInfo.AspectRatioW == 0) par.mfx.FrameInfo.AspectRatioW = 1; if (par.mfx.FrameInfo.AspectRatioH == 0) par.mfx.FrameInfo.AspectRatioH = 1; if (extOpt->InterPredBlockSize == MFX_BLOCKSIZE_UNKNOWN) extOpt->InterPredBlockSize = MFX_BLOCKSIZE_MIN_4X4; if (extOpt->MVPrecision == MFX_MVPRECISION_UNKNOWN) extOpt->MVPrecision = MFX_MVPRECISION_QUARTERPEL; if (extOpt->RateDistortionOpt == MFX_CODINGOPTION_UNKNOWN) extOpt->RateDistortionOpt = MFX_CODINGOPTION_OFF; if (extOpt->RateDistortionOpt == MFX_CODINGOPTION_UNKNOWN) extOpt->RateDistortionOpt = MFX_CODINGOPTION_OFF; if (extOpt->EndOfSequence == MFX_CODINGOPTION_UNKNOWN) extOpt->EndOfSequence = MFX_CODINGOPTION_OFF; if (extOpt->RefPicListReordering == MFX_CODINGOPTION_UNKNOWN) extOpt->RefPicListReordering = MFX_CODINGOPTION_OFF; if (extOpt->ResetRefList == MFX_CODINGOPTION_UNKNOWN) extOpt->ResetRefList = MFX_CODINGOPTION_OFF; if (extOpt->RefPicMarkRep == MFX_CODINGOPTION_UNKNOWN) extOpt->RefPicMarkRep = MFX_CODINGOPTION_OFF; if (extOpt->FieldOutput == MFX_CODINGOPTION_UNKNOWN) extOpt->FieldOutput = MFX_CODINGOPTION_OFF; if (extOpt->AUDelimiter == MFX_CODINGOPTION_UNKNOWN) extOpt->AUDelimiter = (par.calcParam.tempScalabilityMode) ? mfxU16(MFX_CODINGOPTION_OFF) : mfxU16(MFX_CODINGOPTION_ON); if (extOpt->EndOfStream == MFX_CODINGOPTION_UNKNOWN) extOpt->EndOfStream = MFX_CODINGOPTION_OFF; { SetDefaultOn(extOpt->PicTimingSEI); } if (extOpt->ViewOutput == MFX_CODINGOPTION_UNKNOWN) extOpt->ViewOutput = MFX_CODINGOPTION_OFF; if (extOpt->VuiNalHrdParameters == MFX_CODINGOPTION_UNKNOWN) extOpt->VuiNalHrdParameters = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR || (bRateControlLA(par.mfx.RateControlMethod) && par.mfx.RateControlMethod != MFX_RATECONTROL_LA_HRD) || IsOn(extOpt2->DisableVUI) ? mfxU16(MFX_CODINGOPTION_OFF) : mfxU16(MFX_CODINGOPTION_ON); if (extOpt->VuiVclHrdParameters == MFX_CODINGOPTION_UNKNOWN) extOpt->VuiVclHrdParameters = MFX_CODINGOPTION_OFF; if (extOpt->NalHrdConformance == MFX_CODINGOPTION_UNKNOWN) extOpt->NalHrdConformance = IsOn(extOpt->VuiNalHrdParameters) || IsOn(extOpt->VuiVclHrdParameters) ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); if (extOpt->CAVLC == MFX_CODINGOPTION_UNKNOWN) extOpt->CAVLC = (IsAvcBaseProfile(par.mfx.CodecProfile) || hwCaps.ddi_caps.NoCabacSupport) ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); if (extOpt->SingleSeiNalUnit == MFX_CODINGOPTION_UNKNOWN) extOpt->SingleSeiNalUnit = MFX_CODINGOPTION_ON; if (extDdi->MEInterpolationMethod == ENC_INTERPOLATION_TYPE_NONE) extDdi->MEInterpolationMethod = ENC_INTERPOLATION_TYPE_AVC6TAP; if (extDdi->RefRaw == MFX_CODINGOPTION_UNKNOWN) extDdi->RefRaw = MFX_CODINGOPTION_OFF; if (extDdi->DirectSpatialMvPredFlag == MFX_CODINGOPTION_UNKNOWN) extDdi->DirectSpatialMvPredFlag = MFX_CODINGOPTION_ON; if (extDdi->Hme == MFX_CODINGOPTION_UNKNOWN) extDdi->Hme = MFX_CODINGOPTION_ON; #if defined(MFX_ENABLE_EXT_BRC) if (extOpt2->ExtBRC == MFX_CODINGOPTION_UNKNOWN) extOpt2->ExtBRC = MFX_CODINGOPTION_OFF; #endif if (extOpt2->LookAheadDepth == 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) extOpt2->LookAheadDepth = std::max(10, 2 * par.mfx.GopRefDist); else if (bRateControlLA(par.mfx.RateControlMethod)) extOpt2->LookAheadDepth = std::max(40, 2 * par.mfx.GopRefDist); } if (extDdi->LookAheadDependency == 0) { if (bIntRateControlLA(par.mfx.RateControlMethod) && par.mfx.RateControlMethod != MFX_RATECONTROL_LA_ICQ) { extDdi->LookAheadDependency = std::min(10, extOpt2->LookAheadDepth / 4); extDdi->LookAheadDependency = mfx::clamp(extDdi->LookAheadDependency, std::min(par.mfx.GopRefDist + 1, extOpt2->LookAheadDepth * 2 / 3), (extOpt2->LookAheadDepth * 2 / 3)); } else { extDdi->LookAheadDependency = extOpt2->LookAheadDepth; } } if (extOpt2->LookAheadDS == MFX_LOOKAHEAD_DS_UNKNOWN) // default: use LA 2X for TU3-7 and LA 1X for TU1-2 { if (par.mfx.TargetUsage > 2 || (par.mfx.FrameInfo.Width >= 1920 && (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE)) || // customer's issue (par.mfx.FrameInfo.Width > 3000) ) extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_2x; else extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_OFF; } if ((extOpt2->LookAheadDS != MFX_LOOKAHEAD_DS_OFF) && (extOpt2->LookAheadDS != MFX_LOOKAHEAD_DS_2x) && (extOpt2->LookAheadDS != MFX_LOOKAHEAD_DS_4x)) extOpt2->LookAheadDS = MFX_LOOKAHEAD_DS_OFF; if (extDdi->QpUpdateRange == 0) extDdi->QpUpdateRange = 10; if (extDdi->RegressionWindow == 0) extDdi->RegressionWindow = 20; if (extOpt2->RepeatPPS == MFX_CODINGOPTION_UNKNOWN) extOpt2->RepeatPPS = MFX_CODINGOPTION_ON; mfxExtBRC const & extBRC = GetExtBufferRef(par); if (extOpt3->PRefType == MFX_P_REF_DEFAULT) { if (par.mfx.GopRefDist == 1 && par.calcParam.numTemporalLayer == 0 && extDdi->NumActiveRefP != 1 && (par.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && ((IsExtBrcSceneChangeSupported(par, platform) && !extBRC.pthis) #if defined(MFX_ENABLE_ENCTOOLS_LPLA) || IsLpLookaheadSupported(extOpt3->ScenarioInfo, extOpt2->LookAheadDepth, par.mfx.RateControlMethod) #endif )) extOpt3->PRefType = MFX_P_REF_PYRAMID; else if (par.mfx.GopRefDist == 1) extOpt3->PRefType = MFX_P_REF_SIMPLE; } if (!extOpt3->EnableQPOffset) { mfxU16 minQP = 1; mfxU16 maxQP = 51; if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && (extOpt2->BRefType == MFX_B_REF_PYRAMID || extOpt3->PRefType == MFX_P_REF_PYRAMID)) { extOpt3->EnableQPOffset = MFX_CODINGOPTION_ON; mfxI16 QPX = (par.mfx.GopRefDist == 1) ? par.mfx.QPP : par.mfx.QPB; for (mfxI16 i = 0; i < 8; i++) extOpt3->QPOffset[i] = mfx::clamp(i + (par.mfx.GopRefDist > 1), (mfxI16)minQP - QPX, (mfxI16)maxQP - QPX); } else extOpt3->EnableQPOffset = MFX_CODINGOPTION_OFF; } if (IsOff(extOpt3->EnableQPOffset)) Zero(extOpt3->QPOffset); if (extOpt2->MinQPI && !extOpt2->MaxQPI) extOpt2->MaxQPI = 51; if (extOpt2->MinQPP && !extOpt2->MaxQPP) extOpt2->MaxQPP = 51; if (extOpt2->MinQPB && !extOpt2->MaxQPB) extOpt2->MaxQPB = 51; extDdi->MaxMVs = 32; extDdi->SkipCheck = 1; extDdi->DirectCheck = 1; extDdi->BiDirSearch = 1; extDdi->FieldPrediction = fieldCodingPossible; extDdi->MVPrediction = 1; if (extDdi->StrengthN == 0) extDdi->StrengthN = 220; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) mfxExtPartialBitstreamParam const * extPBP = GetExtBuffer(par); // Override the BRC precision to 1 (two pass BRC in case of IPCM) when PartialOuput is requested if (extPBP->Granularity != MFX_PARTIAL_BITSTREAM_NONE) extDdi->BRCPrecision = 1; #endif if (par.mfx.NumRefFrame == 0) { mfxU16 const nrfAdapt = (IsOn(extOpt3->ExtBrcAdaptiveLTR) #if defined(MFX_ENABLE_ENCTOOLS) || (!IsOff(extConfig->AdaptiveLTR)) #endif ) ? 2 : 0; mfxU16 const nrfMin = (par.mfx.GopRefDist > 1 ? 2 : 1) + nrfAdapt; mfxU16 const nrfDefault = std::max(nrfMin, GetDefaultNumRefFrames(par.mfx.TargetUsage, platform) + nrfAdapt); mfxU16 const nrfMaxByCaps = mfx::clamp(hwCaps.ddi_caps.MaxNum_Reference, 1, 8) * 2; mfxU16 const nrfMaxByLevel = GetMaxNumRefFrame(par); mfxU16 const nrfMinForPyramid = GetMinNumRefFrameForPyramid(par) + nrfAdapt; mfxU16 const nrfMinForTemporal = mfxU16(nrfMin + par.calcParam.numTemporalLayer - 1); mfxU16 const nrfMinForInterlace = 2; // HSW and IVB don't support 1 reference frame for interlace if (par.calcParam.numTemporalLayer > 1) par.mfx.NumRefFrame = nrfMinForTemporal; else if (extOpt2->BRefType != MFX_B_REF_OFF) par.mfx.NumRefFrame = nrfMinForPyramid; else if (extOpt2->IntRefType) par.mfx.NumRefFrame = 1; else if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0) par.mfx.NumRefFrame = std::min({std::max(nrfDefault, nrfMinForInterlace), nrfMaxByLevel, nrfMaxByCaps}); else if (extOpt3->PRefType == MFX_P_REF_PYRAMID) par.mfx.NumRefFrame = std::max((mfxU16)par.calcParam.PPyrInterval, nrfDefault); else par.mfx.NumRefFrame = std::min({nrfDefault, nrfMaxByLevel, nrfMaxByCaps}); if (IsOn(par.mfx.LowPower) && (extOpt3->PRefType != MFX_P_REF_PYRAMID)) { par.mfx.NumRefFrame = std::min(hwCaps.ddi_caps.MaxNum_Reference, par.mfx.NumRefFrame); } par.calcParam.PPyrInterval = std::min(par.calcParam.PPyrInterval, par.mfx.NumRefFrame); } if (extOpt->IntraPredBlockSize == MFX_BLOCKSIZE_UNKNOWN) extOpt->IntraPredBlockSize = GetDefaultIntraPredBlockSize(par); if (par.mfx.CodecProfile == MFX_PROFILE_UNKNOWN) { par.mfx.CodecProfile = MFX_PROFILE_AVC_BASELINE; if ((par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_FIELD_TFF) || (par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_FIELD_BFF)) par.mfx.CodecProfile = MFX_PROFILE_AVC_MAIN; if (par.mfx.GopRefDist > 1) par.mfx.CodecProfile = MFX_PROFILE_AVC_MAIN; if (IsOff(extOpt->CAVLC)) par.mfx.CodecProfile = MFX_PROFILE_AVC_MAIN; if (extOpt->IntraPredBlockSize >= MFX_BLOCKSIZE_MIN_8X8) par.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; } if (par.mfx.CodecLevel == MFX_LEVEL_UNKNOWN) par.mfx.CodecLevel = GetMinLevelForAllParameters(par); if (extOpt2->BufferingPeriodSEI == MFX_BPSEI_DEFAULT && IsOn(extOpt->RecoveryPointSEI) && extOpt2->IntRefType == 0 ) { extOpt2->BufferingPeriodSEI = MFX_BPSEI_IFRAME; } SetDefaultOff(extOpt2->DisableVUI); SetDefaultOn(extOpt3->AspectRatioInfoPresent); SetDefaultOff(extOpt3->OverscanInfoPresent); SetDefaultOn(extOpt3->TimingInfoPresent); SetDefaultOn(extOpt2->FixedFrameRate); SetDefaultOff(extOpt3->LowDelayHrd); SetDefaultOn(extOpt3->BitstreamRestriction); SetDefaultOff(extOpt->RecoveryPointSEI); SetDefaultOff(extOpt3->DirectBiasAdjustment); SetDefaultOff(extOpt3->GlobalMotionBiasAdjustment); SetDefaultOff(extOpt3->LowDelayBRC); #ifdef MFX_ENABLE_H264_REPARTITION_CHECK if (extOpt3->RepartitionCheckEnable == MFX_CODINGOPTION_UNKNOWN) extOpt3->RepartitionCheckEnable = MFX_CODINGOPTION_ADAPTIVE; #endif // MFX_ENABLE_H264_REPARTITION_CHECK if (extOpt3->ExtBrcAdaptiveLTR == MFX_CODINGOPTION_UNKNOWN #if defined(MFX_ENABLE_ENCTOOLS) && IsOff(extConfig->AdaptiveLTR) #endif ) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_OFF; #ifndef MFX_AUTOLTR_FEATURE_DISABLE // remove check when sample extbrc is same as implicit extbrc // currently added for no behaviour change in sample extbrc if (IsExtBrcSceneChangeSupported(par, platform) && !extBRC.pthis) { extOpt3->ExtBrcAdaptiveLTR = MFX_CODINGOPTION_ON; // make sure to call CheckVideoParamQueryLike // or add additional conditions above (num ref & num active) } #endif } if (extOpt2->AdaptiveI == MFX_CODINGOPTION_UNKNOWN) { if ((IsExtBrcSceneChangeSupported(par, platform) && !extBRC.pthis) #if defined(MFX_ENABLE_ENCTOOLS) || (!IsOff(extConfig->AdaptiveI) #if defined(MFX_ENABLE_ENCTOOLS_LPLA) && (!IsLpLookaheadSupported(extOpt3->ScenarioInfo, extOpt2->LookAheadDepth, par.mfx.RateControlMethod) || IsOn(extConfig->AdaptiveI)) #endif ) #endif ) extOpt2->AdaptiveI = MFX_CODINGOPTION_ON; else extOpt2->AdaptiveI = MFX_CODINGOPTION_OFF; } if (extOpt2->AdaptiveB == MFX_CODINGOPTION_UNKNOWN) { if ((IsExtBrcSceneChangeSupported(par, platform) && !extBRC.pthis) #if defined(MFX_ENABLE_ENCTOOLS) || (!IsOff(extConfig->AdaptiveB) #if defined(MFX_ENABLE_ENCTOOLS_LPLA) && (!IsLpLookaheadSupported(extOpt3->ScenarioInfo, extOpt2->LookAheadDepth, par.mfx.RateControlMethod) || IsOn(extConfig->AdaptiveB)) #endif ) #endif ) extOpt2->AdaptiveB = MFX_CODINGOPTION_ON; else extOpt2->AdaptiveB = MFX_CODINGOPTION_OFF; } #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (isAdaptiveCQMSupported(extOpt3->ScenarioInfo, IsOn(par.mfx.LowPower))) { if (extOpt3->AdaptiveCQM == MFX_CODINGOPTION_UNKNOWN) extOpt3->AdaptiveCQM = MFX_CODINGOPTION_ON; } else extOpt3->AdaptiveCQM = MFX_CODINGOPTION_OFF; #endif #if defined(MFX_ENABLE_ENCTOOLS_LPLA) // Closed GOP for GS/LPLA unless IdrInterval is set to max // Open GOP with arbitrary IdrInterval if GOP is strict (GopOptFlag == MFX_GOP_STRICT) if (extOpt3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING && IsOn(par.mfx.LowPower) && extOpt2->LookAheadDepth > 0 && par.mfx.GopOptFlag == 0 && par.mfx.IdrInterval != USHRT_MAX) { par.mfx.GopOptFlag = MFX_GOP_CLOSED; } #endif CheckVideoParamQueryLike(par, hwCaps, platform, vaType, config); if (extOpt3->NumSliceI == 0 && extOpt3->NumSliceP == 0 && extOpt3->NumSliceB == 0) extOpt3->NumSliceI = extOpt3->NumSliceP = extOpt3->NumSliceB = par.mfx.NumSlice; if (extOpt2->MBBRC == MFX_CODINGOPTION_UNKNOWN) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ) { // for ICQ BRC mode MBBRC is ignored by driver and always treated as ON // need to change extOpt2->MBBRC respectively to notify application about it extOpt2->MBBRC = MFX_CODINGOPTION_ON; } else { extOpt2->MBBRC = MFX_CODINGOPTION_OFF; // turn on MBBRC by default for enctools if // - entools is ON // - look-ahead // - hw supports MBdata // - VBR or CBR const mfxExtCodingOption3* pCO3 = (mfxExtCodingOption3*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); bool bNonGS = !(pCO3 && pCO3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING); if(IsEnctoolsLABRC(par) && hwCaps.ddi_caps.MbQpDataSupport && bNonGS) extOpt2->MBBRC = MFX_CODINGOPTION_ON; } } if (extOpt2->IntRefType && extOpt2->IntRefCycleSize == 0) { if (extOpt2->IntRefType == MFX_REFRESH_SLICE) { extOpt2->IntRefCycleSize = extOpt3->NumSliceP; } else { // set intra refresh cycle to 1 sec by default extOpt2->IntRefCycleSize = (mfxU16)((par.mfx.FrameInfo.FrameRateExtN + par.mfx.FrameInfo.FrameRateExtD - 1) / par.mfx.FrameInfo.FrameRateExtD); } } if (extOpt3->EnableMBQP == MFX_CODINGOPTION_UNKNOWN) extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; if (extOpt3->MBDisableSkipMap == MFX_CODINGOPTION_UNKNOWN) extOpt3->MBDisableSkipMap = MFX_CODINGOPTION_OFF; if (extOpt3->EnableMBForceIntra == MFX_CODINGOPTION_UNKNOWN) extOpt3->EnableMBForceIntra = MFX_CODINGOPTION_OFF; if (par.calcParam.cqpHrdMode == 0) { if (par.calcParam.maxKbps == 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_WIDI_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VCM || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) { mfxU32 maxBps = par.calcParam.targetKbps * MAX_BITRATE_RATIO; if (IsOn(extOpt->NalHrdConformance) || IsOn(extOpt->VuiVclHrdParameters)) maxBps = std::min(maxBps, GetMaxBitrate(par)); par.calcParam.maxKbps = maxBps / 1000; assert(par.calcParam.maxKbps >= par.calcParam.targetKbps); } else if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { par.calcParam.maxKbps = par.calcParam.targetKbps; } } if (par.calcParam.bufferSizeInKB == 0) { if (bRateControlLA(par.mfx.RateControlMethod) && (par.mfx.RateControlMethod != MFX_RATECONTROL_LA_HRD)) { par.calcParam.bufferSizeInKB = GetMaxCodedFrameSizeInKB(par); } else { mfxU32 bufferSizeInBits = std::min( GetMaxBufferSize(par), // limit by spec par.calcParam.maxKbps * DEFAULT_CPB_IN_SECONDS); // limit by common sense par.calcParam.bufferSizeInKB = !IsHRDBasedBRCMethod(par.mfx.RateControlMethod) ? GetMaxCodedFrameSizeInKB(par) : bufferSizeInBits / 8000; } par.calcParam.bufferSizeInKB = std::max(par.calcParam.bufferSizeInKB, par.calcParam.initialDelayInKB); } if (par.calcParam.initialDelayInKB == 0 && IsHRDBasedBRCMethod(par.mfx.RateControlMethod)) { par.calcParam.initialDelayInKB = (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR && isSWBRC(par)) ? 3*par.calcParam.bufferSizeInKB / 4: par.calcParam.bufferSizeInKB / 2; } // Check BufferSizeInKB and InitialDelayInKB at extremely low bitrate to ensure there is enough space to write bitstream if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ && !isSWBRC(par) && par.mfx.FrameInfo.Width != 0 && par.mfx.FrameInfo.Height != 0 && par.mfx.FrameInfo.FrameRateExtN != 0 && par.mfx.FrameInfo.FrameRateExtD != 0) { mfxF64 rawDataBitrate = 12.0 * par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height * par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD; mfxU32 minBufferSizeInKB = mfxU32(std::min(0xffffffff, rawDataBitrate / 8 / 1000.0 / 1400.0)); if (par.calcParam.bufferSizeInKB < minBufferSizeInKB) { par.calcParam.bufferSizeInKB = minBufferSizeInKB; par.calcParam.initialDelayInKB = minBufferSizeInKB / 2; } } } if (IsMvcProfile(par.mfx.CodecProfile)) { CheckVideoParamMvcQueryLike(par); if (par.calcParam.cqpHrdMode == 0) { if (par.calcParam.mvcPerViewPar.maxKbps == 0) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_WIDI_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) { mfxU32 maxBps = par.calcParam.mvcPerViewPar.targetKbps * MAX_BITRATE_RATIO; if (IsOn(extOpt->NalHrdConformance) || IsOn(extOpt->VuiVclHrdParameters)) maxBps = std::min(maxBps, GetMaxPerViewBitrate(par)); par.calcParam.mvcPerViewPar.maxKbps = maxBps / 1000; assert(par.calcParam.mvcPerViewPar.maxKbps >= par.calcParam.mvcPerViewPar.targetKbps); } else if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { par.calcParam.mvcPerViewPar.maxKbps = par.calcParam.mvcPerViewPar.targetKbps; } } if (par.calcParam.mvcPerViewPar.bufferSizeInKB == 0) { mfxU32 bufferSizeInBits = std::min( GetMaxPerViewBufferSize(par), // limit by spec par.calcParam.mvcPerViewPar.maxKbps * DEFAULT_CPB_IN_SECONDS); // limit by common sense par.calcParam.mvcPerViewPar.bufferSizeInKB = !IsHRDBasedBRCMethod(par.mfx.RateControlMethod) ? GetMaxCodedFrameSizeInKB(par) : bufferSizeInBits / 8000; par.calcParam.mvcPerViewPar.bufferSizeInKB = std::max(par.calcParam.mvcPerViewPar.bufferSizeInKB, 2 * par.calcParam.mvcPerViewPar.initialDelayInKB); } // HRD buffer size can be different for the same level for AVC and MVC profiles. // So in case of MVC we need to copy MVC-specific buffer size to calcParam.bufferSizeInKB to assure that application will get enough size for bitstream buffer allocation par.calcParam.bufferSizeInKB = par.calcParam.mvcPerViewPar.bufferSizeInKB; par.calcParam.initialDelayInKB = std::min(par.calcParam.initialDelayInKB, par.calcParam.bufferSizeInKB); if (par.calcParam.mvcPerViewPar.initialDelayInKB == 0 && IsHRDBasedBRCMethod(par.mfx.RateControlMethod)) { par.calcParam.mvcPerViewPar.initialDelayInKB = par.calcParam.mvcPerViewPar.bufferSizeInKB / 2; } } } if (extOpt->MaxDecFrameBuffering == 0) { extOpt->MaxDecFrameBuffering = par.mfx.NumRefFrame; } if (extDdi->DisablePSubMBPartition == MFX_CODINGOPTION_UNKNOWN) { extDdi->DisablePSubMBPartition = MFX_CODINGOPTION_OFF; // check restriction A.3.3 (f) if (IsAvcBaseProfile(par.mfx.CodecProfile) && par.mfx.CodecLevel <= MFX_LEVEL_AVC_3) extDdi->DisablePSubMBPartition = MFX_CODINGOPTION_ON; } if (extDdi->DisableBSubMBPartition == MFX_CODINGOPTION_UNKNOWN) { extDdi->DisableBSubMBPartition = MFX_CODINGOPTION_OFF; // check restriction A.3.3 (f) if (IsAvcBaseProfile(par.mfx.CodecProfile) && par.mfx.CodecLevel <= MFX_LEVEL_AVC_3) extDdi->DisableBSubMBPartition = MFX_CODINGOPTION_ON; } if (extDdi->WeightedBiPredIdc == 0) { extDdi->WeightedBiPredIdc = (par.mfx.GopRefDist == 3 && !IsMvcProfile(par.mfx.CodecProfile) && extOpt2->BRefType == MFX_B_REF_OFF) ? 2 // explicit weighted biprediction (when 2 B frames in a row) : 0; // no weighted biprediction } if (extDdi->CabacInitIdcPlus1 == 0) { extDdi->CabacInitIdcPlus1 = GetCabacInitIdc(par.mfx.TargetUsage) + 1; } bool IsEnabledSwBrc = false; #if defined(MFX_ENABLE_EXT_BRC) IsEnabledSwBrc = isSWBRC(par); #else IsEnabledSwBrc = bRateControlLA(par.mfx.RateControlMethod); #endif if (par.calcParam.TCBRCTargetFrameSize == 0) { par.calcParam.TCBRCTargetFrameSize = IsTCBRC(par, hwCaps) ? GetAvgFrameSizeInBytes(par, false) : 0; } if ((hwCaps.ddi_caps.UserMaxFrameSizeSupport != 0 || IsEnabledSwBrc) && (par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) && extOpt2->MaxFrameSize == 0) { extOpt2->MaxFrameSize = std::max(extOpt3->MaxFrameSizeI, extOpt3->MaxFrameSizeP); if (!extOpt2->MaxFrameSize) { extOpt2->MaxFrameSize = (IsOn(extOpt3->LowDelayBRC)) ? GetAvgFrameSizeInBytes(par, true): std::min(GetMaxFrameSize(par), GetFirstMaxFrameSize(par)); } } if (extOpt3->AdaptiveMaxFrameSize == MFX_CODINGOPTION_UNKNOWN ) extOpt3->AdaptiveMaxFrameSize = (IsOn(par.mfx.LowPower) && hwCaps.AdaptiveMaxFrameSizeSupport) ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); if (extOpt3->BRCPanicMode == MFX_CODINGOPTION_UNKNOWN) extOpt3->BRCPanicMode = extOpt->NalHrdConformance == MFX_CODINGOPTION_ON || bRateControlLA(par.mfx.RateControlMethod) || par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || vaType != MFX_HW_VAAPI || ((extOpt2->MaxFrameSize != 0 || extOpt3->WinBRCSize != 0) && isSWBRC(par)) ? mfxU16(MFX_CODINGOPTION_ON) : mfxU16(MFX_CODINGOPTION_OFF); par.ApplyDefaultsToMvcSeqDesc(); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE bool svcSupportedByHw = (hwCaps.ddi_caps.MaxNum_QualityLayer || hwCaps.ddi_caps.MaxNum_DependencyLayer); for (mfxU32 i = 0; i < par.calcParam.numDependencyLayer; i++) { mfxU32 did = par.calcParam.did[i]; if (extSvc->DependencyLayer[did].CropH == 0) extSvc->DependencyLayer[did].CropH = extSvc->DependencyLayer[did].Height - extSvc->DependencyLayer[did].CropY; if (extSvc->DependencyLayer[did].CropW == 0) extSvc->DependencyLayer[did].CropW = extSvc->DependencyLayer[did].Width - extSvc->DependencyLayer[did].CropX; if (extSvc->DependencyLayer[did].ScanIdxPresent == 0) extSvc->DependencyLayer[did].ScanIdxPresent = MFX_CODINGOPTION_OFF; if (IsOff(extSvc->DependencyLayer[did].ScanIdxPresent)) { for (mfxU32 qid = 0; qid < extSvc->DependencyLayer[did].QualityNum; qid++) { extSvc->DependencyLayer[did].QualityLayer[qid].ScanIdxStart = 0; extSvc->DependencyLayer[did].QualityLayer[qid].ScanIdxEnd = 15; } } if (extSvc->DependencyLayer[did].BasemodePred == 0) extSvc->DependencyLayer[did].BasemodePred = svcSupportedByHw ? mfxU16(MFX_CODINGOPTION_ADAPTIVE) : mfxU16(MFX_CODINGOPTION_OFF); if (extSvc->DependencyLayer[did].MotionPred == 0) extSvc->DependencyLayer[did].MotionPred = svcSupportedByHw ? mfxU16(MFX_CODINGOPTION_ADAPTIVE) : mfxU16(MFX_CODINGOPTION_OFF); if (extSvc->DependencyLayer[did].ResidualPred == 0) extSvc->DependencyLayer[did].ResidualPred = svcSupportedByHw ? mfxU16(MFX_CODINGOPTION_ADAPTIVE) : mfxU16(MFX_CODINGOPTION_OFF); } if (!IsSvcProfile(par.mfx.CodecProfile)) { extSvc->TemporalScale[0] = 1; extSvc->DependencyLayer[0].Active = 1; extSvc->DependencyLayer[0].Width = par.mfx.FrameInfo.Width; extSvc->DependencyLayer[0].Height = par.mfx.FrameInfo.Height; extSvc->DependencyLayer[0].CropX = par.mfx.FrameInfo.CropX; extSvc->DependencyLayer[0].CropY = par.mfx.FrameInfo.CropY; extSvc->DependencyLayer[0].CropW = par.mfx.FrameInfo.CropW; extSvc->DependencyLayer[0].CropH = par.mfx.FrameInfo.CropH; extSvc->DependencyLayer[0].GopPicSize = par.mfx.GopPicSize; extSvc->DependencyLayer[0].GopRefDist = par.mfx.GopRefDist; extSvc->DependencyLayer[0].GopOptFlag = par.mfx.GopOptFlag; extSvc->DependencyLayer[0].IdrInterval = par.mfx.IdrInterval; extSvc->DependencyLayer[0].BasemodePred = MFX_CODINGOPTION_OFF; extSvc->DependencyLayer[0].MotionPred = MFX_CODINGOPTION_OFF; extSvc->DependencyLayer[0].ResidualPred = MFX_CODINGOPTION_OFF; extSvc->DependencyLayer[0].ScanIdxPresent = MFX_CODINGOPTION_OFF; extSvc->DependencyLayer[0].TemporalNum = 1; extSvc->DependencyLayer[0].TemporalId[0] = 0; extSvc->DependencyLayer[0].QualityNum = 1; extRc->RateControlMethod = par.mfx.RateControlMethod; extRc->NumLayers = 1; switch (extRc->RateControlMethod) { case MFX_RATECONTROL_CBR: case MFX_RATECONTROL_VBR: case MFX_RATECONTROL_LA: case MFX_RATECONTROL_VCM: case MFX_RATECONTROL_QVBR: case MFX_RATECONTROL_LA_HRD: extRc->Layer[0].CbrVbr.TargetKbps = par.mfx.TargetKbps; extRc->Layer[0].CbrVbr.InitialDelayInKB = par.mfx.InitialDelayInKB; extRc->Layer[0].CbrVbr.BufferSizeInKB = par.mfx.BufferSizeInKB; extRc->Layer[0].CbrVbr.MaxKbps = par.mfx.MaxKbps; break; case MFX_RATECONTROL_CQP: extRc->Layer[0].Cqp.QPI = par.mfx.QPI; extRc->Layer[0].Cqp.QPP = par.mfx.QPP; extRc->Layer[0].Cqp.QPB = par.mfx.QPB; break; case MFX_RATECONTROL_AVBR: extRc->Layer[0].Avbr.TargetKbps = par.mfx.TargetKbps; extRc->Layer[0].Avbr.Convergence = par.mfx.Convergence; extRc->Layer[0].Avbr.Accuracy = par.mfx.Accuracy; break; case MFX_RATECONTROL_ICQ: case MFX_RATECONTROL_LA_ICQ: break; default: assert(0); break; } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (extBits->SPSBuffer == 0) { mfxFrameInfo const & fi = par.mfx.FrameInfo; extSps->nalRefIdc = par.calcParam.tempScalabilityMode ? 3 : 1; extSps->nalUnitType = 7; extSps->profileIdc = mfxU8(par.mfx.CodecProfile & MASK_PROFILE_IDC); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(extSps->profileIdc)) extSps->profileIdc = MFX_PROFILE_AVC_HIGH; #endif extSps->constraints.set0 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET0_FLAG)); extSps->constraints.set1 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET1_FLAG)); if (par.calcParam.numTemporalLayer > 0 && IsAvcBaseProfile(par.mfx.CodecProfile)) extSps->constraints.set1 = 1; // tempScalabilityMode requires constraint base profile extSps->constraints.set2 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET2_FLAG)); extSps->constraints.set3 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET3_FLAG)); extSps->constraints.set4 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET4_FLAG)); extSps->constraints.set5 = mfxU8(!!(par.mfx.CodecProfile & MASK_CONSTRAINT_SET5_FLAG)); extSps->constraints.set6 = 0; extSps->constraints.set7 = 0; extSps->levelIdc = IsMvcProfile(par.mfx.CodecProfile) ? mfxU8(par.calcParam.mvcPerViewPar.codecLevel) : mfxU8(par.mfx.CodecLevel); extSps->seqParameterSetId = mfxU8(extBits->SPSId); extSps->chromaFormatIdc = mfxU8(MFX_CHROMAFORMAT_YUV420);//in case if RGB or YUY2 passed we still need encode in 420 extSps->separateColourPlaneFlag = 0; extSps->bitDepthLumaMinus8 = 0; extSps->bitDepthChromaMinus8 = 0; extSps->qpprimeYZeroTransformBypassFlag = 0; extSps->seqScalingMatrixPresentFlag = 0; extSps->log2MaxFrameNumMinus4 = 4;//GetDefaultLog2MaxFrameNumMinux4(par); extSps->picOrderCntType = (extOpt2->SkipFrame == MFX_SKIPFRAME_INSERT_DUMMY) ? 0 : GetDefaultPicOrderCount(par); extSps->log2MaxPicOrderCntLsbMinus4 = extOpt2->SkipFrame ? ((mfxU8)CeilLog2(2 * par.mfx.GopPicSize) + 1 - 4) : GetDefaultLog2MaxPicOrdCntMinus4(par); extSps->log2MaxPicOrderCntLsbMinus4 = std::min(12, extSps->log2MaxPicOrderCntLsbMinus4); extSps->deltaPicOrderAlwaysZeroFlag = 1; extSps->maxNumRefFrames = mfxU8(par.mfx.NumRefFrame); extSps->gapsInFrameNumValueAllowedFlag = par.calcParam.numTemporalLayer > 1 || par.calcParam.tempScalabilityMode; // for tempScalabilityMode change of temporal structure shouldn't change SPS. extSps->frameMbsOnlyFlag = (fi.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 0; extSps->picWidthInMbsMinus1 = mfx::CeilDiv(fi.Width, 16) - 1; extSps->picHeightInMapUnitsMinus1 = mfx::CeilDiv(fi.Height, 16) / (2 - extSps->frameMbsOnlyFlag) - 1; extSps->direct8x8InferenceFlag = 1; //Fix cropping for ARGB and YUY2 formats, need to redesign in case real 444 or 422 support in AVC. mfxU16 croma_format = fi.ChromaFormat; if(croma_format == MFX_CHROMAFORMAT_YUV444 || croma_format == MFX_CHROMAFORMAT_YUV422) croma_format = MFX_CHROMAFORMAT_YUV420; mfxU16 cropUnitX = CROP_UNIT_X[croma_format]; mfxU16 cropUnitY = CROP_UNIT_Y[croma_format] * (2 - extSps->frameMbsOnlyFlag); extSps->frameCropLeftOffset = (fi.CropX / cropUnitX); extSps->frameCropRightOffset = (mfx::align2_value(fi.Width, 16) - fi.CropW - fi.CropX) / cropUnitX; extSps->frameCropTopOffset = (fi.CropY / cropUnitY); extSps->frameCropBottomOffset = (mfx::align2_value(fi.Height, 16) - fi.CropH - fi.CropY) / cropUnitY; extSps->frameCroppingFlag = extSps->frameCropLeftOffset || extSps->frameCropRightOffset || extSps->frameCropTopOffset || extSps->frameCropBottomOffset; extSps->vuiParametersPresentFlag = !IsOn(extOpt2->DisableVUI); if (extSps->vuiParametersPresentFlag) { AspectRatioConverter arConv(fi.AspectRatioW, fi.AspectRatioH); extSps->vui.flags.aspectRatioInfoPresent = (fi.AspectRatioH && fi.AspectRatioW) && !IsOff(extOpt3->AspectRatioInfoPresent); extSps->vui.aspectRatioIdc = arConv.GetSarIdc(); extSps->vui.sarWidth = arConv.GetSarWidth(); extSps->vui.sarHeight = arConv.GetSarHeight(); extSps->vui.flags.overscanInfoPresent = !IsOff(extOpt3->OverscanInfoPresent); extSps->vui.flags.overscanAppropriate = !IsOff(extOpt3->OverscanAppropriate); extSps->vui.videoFormat = mfxU8(extVsi->VideoFormat); extSps->vui.flags.videoFullRange = extVsi->VideoFullRange; extSps->vui.flags.colourDescriptionPresent = extVsi->ColourDescriptionPresent; extSps->vui.colourPrimaries = mfxU8(extVsi->ColourPrimaries); extSps->vui.transferCharacteristics = mfxU8(extVsi->TransferCharacteristics); extSps->vui.matrixCoefficients = mfxU8(extVsi->MatrixCoefficients); extSps->vui.flags.videoSignalTypePresent = extSps->vui.videoFormat != 5 || extSps->vui.flags.videoFullRange != 0 || extSps->vui.flags.colourDescriptionPresent != 0; extSps->vui.flags.chromaLocInfoPresent = !!extCli->ChromaLocInfoPresentFlag; extSps->vui.chromaSampleLocTypeTopField = mfxU8(extCli->ChromaSampleLocTypeTopField); extSps->vui.chromaSampleLocTypeBottomField = mfxU8(extCli->ChromaSampleLocTypeBottomField); extSps->vui.flags.timingInfoPresent = !IsOff(extOpt3->TimingInfoPresent); extSps->vui.numUnitsInTick = fi.FrameRateExtD; extSps->vui.timeScale = fi.FrameRateExtN * 2; extSps->vui.flags.fixedFrameRate = !IsOff(extOpt2->FixedFrameRate); extSps->vui.flags.nalHrdParametersPresent = IsOn(extOpt->VuiNalHrdParameters); extSps->vui.flags.vclHrdParametersPresent = IsOn(extOpt->VuiVclHrdParameters); extSps->vui.nalHrdParameters.cpbCntMinus1 = 0; extSps->vui.nalHrdParameters.bitRateScale = SCALE_FROM_DRIVER; extSps->vui.nalHrdParameters.cpbSizeScale = 2; if (par.calcParam.cqpHrdMode) { extSps->vui.nalHrdParameters.bitRateValueMinus1[0] = GetMaxBitrateValue(par.calcParam.decorativeHrdParam.maxKbps) - 1; extSps->vui.nalHrdParameters.cpbSizeValueMinus1[0] = GetCpbSizeValue(par.calcParam.decorativeHrdParam.bufferSizeInKB, 2) - 1; extSps->vui.nalHrdParameters.cbrFlag[0] = par.calcParam.cqpHrdMode == 1 ? 1 : 0; } else { // extSps isn't syncronized with m_video after next assignment for ViewOutput mode. Need to Init ExtSps HRD for MVC keeping them syncronized if (IsMvcProfile(par.mfx.CodecProfile)) { extSps->vui.nalHrdParameters.bitRateValueMinus1[0] = GetMaxBitrateValue(par.calcParam.mvcPerViewPar.maxKbps) - 1; extSps->vui.nalHrdParameters.cpbSizeValueMinus1[0] = GetCpbSizeValue(par.calcParam.mvcPerViewPar.bufferSizeInKB, 2) - 1; } else { extSps->vui.nalHrdParameters.bitRateValueMinus1[0] = GetMaxBitrateValue(par.calcParam.maxKbps) - 1; extSps->vui.nalHrdParameters.cpbSizeValueMinus1[0] = GetCpbSizeValue(par.calcParam.bufferSizeInKB, 2) - 1; } extSps->vui.nalHrdParameters.cbrFlag[0] = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR); } extSps->vui.nalHrdParameters.initialCpbRemovalDelayLengthMinus1 = 23; extSps->vui.nalHrdParameters.cpbRemovalDelayLengthMinus1 = 23; extSps->vui.nalHrdParameters.dpbOutputDelayLengthMinus1 = 23; extSps->vui.nalHrdParameters.timeOffsetLength = 24; extSps->vui.vclHrdParameters.cpbCntMinus1 = 0; extSps->vui.vclHrdParameters.bitRateScale = SCALE_FROM_DRIVER; extSps->vui.vclHrdParameters.cpbSizeScale = 2; if (IsMvcProfile(par.mfx.CodecProfile)) { extSps->vui.vclHrdParameters.bitRateValueMinus1[0] = GetMaxBitrateValue(par.calcParam.mvcPerViewPar.maxKbps) - 1; extSps->vui.vclHrdParameters.cpbSizeValueMinus1[0] = GetCpbSizeValue(par.calcParam.mvcPerViewPar.bufferSizeInKB, 2) - 1; } else { extSps->vui.vclHrdParameters.bitRateValueMinus1[0] = GetMaxBitrateValue(par.calcParam.maxKbps) - 1; extSps->vui.vclHrdParameters.cpbSizeValueMinus1[0] = GetCpbSizeValue(par.calcParam.bufferSizeInKB, 2) - 1; } extSps->vui.vclHrdParameters.cbrFlag[0] = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR); extSps->vui.vclHrdParameters.initialCpbRemovalDelayLengthMinus1 = 23; extSps->vui.vclHrdParameters.cpbRemovalDelayLengthMinus1 = 23; extSps->vui.vclHrdParameters.dpbOutputDelayLengthMinus1 = 23; extSps->vui.vclHrdParameters.timeOffsetLength = 24; extSps->vui.flags.lowDelayHrd = IsOn(extOpt3->LowDelayHrd);; extSps->vui.flags.picStructPresent = IsOn(extOpt->PicTimingSEI); extSps->vui.flags.bitstreamRestriction = !IsOff(extOpt3->BitstreamRestriction); extSps->vui.flags.motionVectorsOverPicBoundaries = !IsOff(extOpt3->MotionVectorsOverPicBoundaries); extSps->vui.maxBytesPerPicDenom = 2; extSps->vui.maxBitsPerMbDenom = 1; extSps->vui.log2MaxMvLengthHorizontal = mfxU8(CeilLog2(4 * MAX_H_MV - 1)); extSps->vui.log2MaxMvLengthVertical = mfxU8(CeilLog2(4 * GetMaxVmv(par.mfx.CodecLevel) - 1)); extSps->vui.numReorderFrames = GetNumReorderFrames(par); extSps->vui.maxDecFrameBuffering = mfxU8(extOpt->MaxDecFrameBuffering); extSps->vuiParametersPresentFlag = extSps->vui.flags.aspectRatioInfoPresent || extSps->vui.flags.overscanInfoPresent || extSps->vui.flags.videoSignalTypePresent || extSps->vui.flags.chromaLocInfoPresent || extSps->vui.flags.timingInfoPresent || extSps->vui.flags.nalHrdParametersPresent || extSps->vui.flags.vclHrdParametersPresent || extSps->vui.flags.picStructPresent || extSps->vui.flags.bitstreamRestriction; } if (extBits->PPSBufSize == 0) { extPps->nalRefIdc = par.calcParam.tempScalabilityMode ? 3 : 1; extPps->picParameterSetId = mfxU8(extBits->PPSId); extPps->seqParameterSetId = mfxU8(extBits->SPSId); extPps->entropyCodingModeFlag = IsOff(extOpt->CAVLC); extPps->bottomFieldPicOrderInframePresentFlag = 0; extPps->numSliceGroupsMinus1 = 0; extPps->sliceGroupMapType = 0; extPps->numRefIdxL0DefaultActiveMinus1 = 0; extPps->numRefIdxL1DefaultActiveMinus1 = 0; extPps->weightedPredFlag = mfxU8(extOpt3->WeightedPred == MFX_WEIGHTED_PRED_EXPLICIT); extPps->weightedBipredIdc = extOpt3->WeightedBiPred ? mfxU8(extOpt3->WeightedBiPred - 1) : mfxU8(extDdi->WeightedBiPredIdc); extPps->picInitQpMinus26 = 0; extPps->picInitQsMinus26 = 0; extPps->chromaQpIndexOffset = 0; extPps->deblockingFilterControlPresentFlag = 1; extPps->constrainedIntraPredFlag = 0; extPps->redundantPicCntPresentFlag = 0; extPps->moreRbspData = !IsAvcBaseProfile(par.mfx.CodecProfile) && par.mfx.CodecProfile != MFX_PROFILE_AVC_MAIN; extPps->transform8x8ModeFlag = extDdi->Transform8x8Mode == MFX_CODINGOPTION_UNKNOWN ? extOpt->IntraPredBlockSize > MFX_BLOCKSIZE_MIN_16X16 : IsOn(extDdi->Transform8x8Mode); extPps->picScalingMatrixPresentFlag = 0; extPps->secondChromaQpIndexOffset = 0; } #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX if (IsOn(extOpt3->AdaptiveCQM)&& isAdaptiveCQMSupported(extOpt3->ScenarioInfo, IsOn(par.mfx.LowPower))) { std::vector &extCqmPps = par.GetCqmPps(); for (mfxU8 j = 0; j < extCqmPps.size(); j++) { extCqmPps[j] = *extPps; extCqmPps[j].picParameterSetId = j + 1; FillCustomScalingLists(&(extCqmPps[j].scalingList4x4[0][0]), extOpt3->ScenarioInfo, j+1); extCqmPps[j].picScalingMatrixPresentFlag = 1; for (mfxU8 i = 0; i < sizeof(extCqmPps[j].picScalingListPresentFlag) / sizeof(extCqmPps[j].picScalingListPresentFlag[0]); ++i) extCqmPps[j].picScalingListPresentFlag[i] = (i < ((extSps->levelIdc != 3) ? 8 : 12)) ? 1 : 0; } } #endif } #ifndef MFX_AVC_ENCODING_UNIT_DISABLE SetDefaultOff(extOpt3->EncodedUnitsInfo); #endif par.SyncCalculableToVideoParam(); par.AlignCalcWithBRCParamMultiplier(); } mfxStatus MfxHwH264Encode::CheckPayloads( const mfxPayload* const* payload, mfxU16 numPayload) { const mfxU8 SUPPORTED_SEI[] = { 0, // 00 buffering_period 0, // 01 pic_timing 1, // 02 pan_scan_rect 1, // 03 filler_payload 1, // 04 user_data_registered_itu_t_t35 1, // 05 user_data_unregistered 1, // 06 recovery_point 0, // 07 dec_ref_pic_marking_repetition 0, // 08 spare_pic 1, // 09 scene_info 0, // 10 sub_seq_info 0, // 11 sub_seq_layer_characteristics 0, // 12 sub_seq_characteristics 1, // 13 full_frame_freeze 1, // 14 full_frame_freeze_release 1, // 15 full_frame_snapshot 1, // 16 progressive_refinement_segment_start 1, // 17 progressive_refinement_segment_end 0, // 18 motion_constrained_slice_group_set 1, // 19 film_grain_characteristics 1, // 20 deblocking_filter_display_preference 1, // 21 stereo_video_info 0, // 22 post_filter_hint 0, // 23 tone_mapping_info 0, // 24 scalability_info 0, // 25 sub_pic_scalable_layer 0, // 26 non_required_layer_rep 0, // 27 priority_layer_info 0, // 28 layers_not_present 0, // 29 layer_dependency_change 0, // 30 scalable_nesting 0, // 31 base_layer_temporal_hrd 0, // 32 quality_layer_integrity_check 0, // 33 redundant_pic_property 0, // 34 tl0_dep_rep_index 0, // 35 tl_switching_point 0, // 36 parallel_decoding_info 0, // 37 mvc_scalable_nesting 0, // 38 view_scalability_info 0, // 39 multiview_scene_info 0, // 40 multiview_acquisition_info 0, // 41 non_required_view_component 0, // 42 view_dependency_change 0, // 43 operation_points_not_present 0, // 44 base_view_temporal_hrd 1, // 45 frame_packing_arrangement }; for (mfxU16 i = 0; i < numPayload; ++i) { // Particular payload can absent // Check only present payloads if (payload[i] && payload[i]->NumBit > 0) { MFX_CHECK_NULL_PTR1(payload[i]->Data); // Check buffer size MFX_CHECK( payload[i]->NumBit <= 8u * payload[i]->BufSize, MFX_ERR_UNDEFINED_BEHAVIOR); // Sei messages type constraints MFX_CHECK( payload[i]->Type < (sizeof SUPPORTED_SEI / sizeof SUPPORTED_SEI[0]) && SUPPORTED_SEI[payload[i]->Type] == 1, MFX_ERR_UNDEFINED_BEHAVIOR); } } return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::CheckRunTimeExtBuffers( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, MFX_ENCODE_CAPS const & caps) { MFX_CHECK_NULL_PTR3(ctrl, surface, bs); mfxStatus checkSts = MFX_ERR_NONE; bool single_field_mode = false; for (mfxU32 i = 0; i < bs->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(bs->ExtParam[i]); if (!IsRuntimeOutputExtBufferIdSupported(video, bs->ExtParam[i]->BufferId)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; // don't return error in runtime, just ignore unsupported ext buffer and return warning } for (mfxU32 i = 0; i < ctrl->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(ctrl->ExtParam[i]); if (!IsRunTimeExtBufferIdSupported(video, ctrl->ExtParam[i]->BufferId)) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; // don't return error in runtime, just ignore unsupported ext buffer and return warning bool buffer_pair = mfx::GetExtBuffer( ctrl->ExtParam + i + 1, ctrl->NumExtParam - i - 1, ctrl->ExtParam[i]->BufferId) || mfx::GetExtBuffer( ctrl->ExtParam, i, ctrl->ExtParam[i]->BufferId); // In single-field mode only one buffer is required for one field encoding bool buffer_pair_allowed = !single_field_mode ? IsRunTimeExtBufferPairAllowed(video, ctrl->ExtParam[i]->BufferId) : false; // if initialized PicStruct is UNKNOWN, to check runtime PicStruct bool buffer_pair_required = !single_field_mode ? IsRunTimeExtBufferPairRequired(video, ctrl->ExtParam[i]->BufferId) : false; if (buffer_pair_required) { switch (video.mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: buffer_pair_required = false; break; case MFX_PICSTRUCT_UNKNOWN: // for runtime PicStruct, it may be set as (MFX_PICSTRUCT_PROGRESSIVE | // MFX+PICSTRUCT_FIELD_TFF/BFF) for progressive frames if (surface->Info.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) { buffer_pair_required = false; } break; default: break; } } if (buffer_pair && !buffer_pair_allowed) { // Ignore second buffer and return warning checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } else if (!buffer_pair && buffer_pair_required) { // Return error if only one per-field buffer provided MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } mfxU16 PicStruct = (video.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_UNKNOWN) ? video.mfx.FrameInfo.PicStruct : surface->Info.PicStruct; mfxU16 NumFields = (PicStruct & MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 2; { mfxStatus sts = CheckFEIRunTimeExtBuffersContent(video, ctrl, surface, bs); MFX_CHECK(sts >= MFX_ERR_NONE, sts); if (sts != MFX_ERR_NONE) checkSts = sts; } #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) for (mfxU16 fieldId = 0; fieldId < NumFields; fieldId++) { mfxExtAVCRoundingOffset* extRoundingOffset = reinterpret_cast(mfx::GetExtBuffer(ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_AVC_ROUNDING_OFFSET, fieldId)); if (extRoundingOffset) { if (IsOn(extRoundingOffset->EnableRoundingIntra)) { if (extRoundingOffset->RoundingOffsetIntra > 7) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; extRoundingOffset->RoundingOffsetIntra = extRoundingOffset->RoundingOffsetIntra % 7; } } if (IsOn(extRoundingOffset->EnableRoundingInter)) { if (extRoundingOffset->RoundingOffsetInter > 7) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; extRoundingOffset->RoundingOffsetInter = extRoundingOffset->RoundingOffsetInter % 7; } } } } #endif mfxExtAVCRefListCtrl const * extRefListCtrl = GetExtBuffer(*ctrl); if (extRefListCtrl && video.calcParam.numTemporalLayer > 0 && video.calcParam.tempScalabilityMode == 0) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; mfxExtAVCRefLists const * extRefLists = GetExtBuffer(*ctrl); if (extRefLists && video.calcParam.numTemporalLayer > 0 && video.calcParam.tempScalabilityMode == 0) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; // check timestamp from mfxExtPictureTimingSEI for (mfxU16 fieldId = 0; fieldId < NumFields; fieldId++) { mfxExtPictureTimingSEI const* extPt = reinterpret_cast(mfx::GetExtBuffer(ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_PICTURE_TIMING_SEI, fieldId)); if (extPt) { for (mfxU32 i = 0; i < 3; i++) { // return warning if there is any 0xffff template except for CtType if (extPt->TimeStamp[i].CountingType == 0xffff || extPt->TimeStamp[i].NFrames == 0xffff || extPt->TimeStamp[i].SecondsValue == 0xffff || extPt->TimeStamp[i].MinutesValue == 0xffff || extPt->TimeStamp[i].HoursValue == 0xffff || extPt->TimeStamp[i].TimeOffset == 0xffff || extPt->TimeStamp[i].ClockTimestampFlag == 0xffff || extPt->TimeStamp[i].NuitFieldBasedFlag == 0xffff || extPt->TimeStamp[i].FullTimestampFlag == 0xffff || extPt->TimeStamp[i].DiscontinuityFlag == 0xffff || extPt->TimeStamp[i].CntDroppedFlag == 0xffff || extPt->TimeStamp[i].SecondsFlag == 0xffff || extPt->TimeStamp[i].MinutesFlag == 0xffff || extPt->TimeStamp[i].HoursFlag == 0xffff) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } } } // check ROI mfxExtEncoderROI const * extRoi = GetExtBuffer(*ctrl); if (extRoi) { // check below should have the same logic as in MfxHwH264Encode::ConfigureTask // the difference that ConfigureTask doesn't copy bad arg to DdiTask // CheckRunTimeExtBuffers just reports MFX_WRN_INCOMPATIBLE_VIDEO_PARAM for the same args mfxU16 const MaxNumOfROI = caps.ddi_caps.MaxNumOfROI; mfxU16 actualNumRoi = extRoi->NumROI; if (extRoi->NumROI) { if (extRoi->NumROI > MaxNumOfROI) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; actualNumRoi = MaxNumOfROI; } if (extRoi->ROIMode != MFX_ROI_MODE_QP_DELTA && extRoi->ROIMode != MFX_ROI_MODE_PRIORITY) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; actualNumRoi = 0; } if (extRoi->ROIMode == MFX_ROI_MODE_QP_DELTA && caps.ddi_caps.ROIBRCDeltaQPLevelSupport == 0) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; actualNumRoi = 0; } } for (mfxU16 i = 0; i < actualNumRoi; i++) { mfxRoiDesc task_roi = {extRoi->ROI[i].Left, extRoi->ROI[i].Top, extRoi->ROI[i].Right, extRoi->ROI[i].Bottom, extRoi->ROI[i].Priority}; // check runtime ROI mfxStatus sts = CheckAndFixRoiQueryLike(video, &task_roi, extRoi->ROIMode); if (sts != MFX_ERR_NONE) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } } #if defined(MFX_ENABLE_AVCE_DIRTY_RECTANGLE) mfxExtDirtyRect const * extDirtyRect = GetExtBuffer(*ctrl); if (extDirtyRect) { mfxU16 actualNumRect = extDirtyRect->NumRect; if (actualNumRect == 0) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (actualNumRect > MFX_MAX_DIRTY_RECT_COUNT) { actualNumRect = MFX_MAX_DIRTY_RECT_COUNT; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } for (mfxU16 i = 0; i < actualNumRect; i++) { mfxStatus sts = CheckAndFixRectQueryLike(video, (mfxRectDesc*)(&(extDirtyRect->Rect[i]))); if (sts != MFX_ERR_NONE) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } #else mfxExtDirtyRect const * extDirtyRect = GetExtBuffer(*ctrl); if (extDirtyRect) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } #endif #if defined(MFX_ENABLE_AVCE_MOVE_RECTANGLE) mfxExtMoveRect const * extMoveRect = GetExtBuffer(*ctrl); if (extMoveRect) { mfxU16 actualNumRect = extMoveRect->NumRect; if (actualNumRect == 0) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (actualNumRect > MFX_MAX_MOVE_RECT_COUNT) { actualNumRect = MFX_MAX_MOVE_RECT_COUNT; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } for (mfxU16 i = 0; i < actualNumRect; i++) { mfxStatus sts = CheckAndFixMovingRectQueryLike(video, (mfxMovingRectDesc*)(&(extMoveRect->Rect[i]))); if (sts != MFX_ERR_NONE) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } #else mfxExtMoveRect const * extMoveRect = GetExtBuffer(*ctrl); if (extMoveRect) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } #endif mfxExtPredWeightTable *extPwt = GetExtBuffer(*ctrl); if (extPwt) { if (extPwt->LumaLog2WeightDenom && (extPwt->LumaLog2WeightDenom != 6)) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (extPwt->ChromaLog2WeightDenom && (extPwt->ChromaLog2WeightDenom != 6)) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return checkSts; } mfxStatus MfxHwH264Encode::CheckFEIRunTimeExtBuffersContent( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs) { MFX_CHECK_NULL_PTR3(ctrl, surface, bs); mfxStatus checkSts = MFX_ERR_NONE; (void)video; (void)bs; return checkSts; } mfxStatus MfxHwH264Encode::CheckRunTimePicStruct( mfxU16 runtPs, mfxU16 initPs) { static mfxU16 const PRG = MFX_PICSTRUCT_PROGRESSIVE; static mfxU16 const TFF = MFX_PICSTRUCT_FIELD_TFF; static mfxU16 const BFF = MFX_PICSTRUCT_FIELD_BFF; static mfxU16 const UNK = MFX_PICSTRUCT_UNKNOWN; static mfxU16 const DBL = MFX_PICSTRUCT_FRAME_DOUBLING; static mfxU16 const TRPL = MFX_PICSTRUCT_FRAME_TRIPLING; static mfxU16 const REP = MFX_PICSTRUCT_FIELD_REPEATED; if ((initPs == PRG && runtPs == UNK) || (initPs == PRG && runtPs == PRG) || (initPs == PRG && runtPs == (PRG | DBL)) || (initPs == PRG && runtPs == (PRG | TRPL))) return MFX_ERR_NONE; if ((initPs == BFF && runtPs == UNK) || (initPs == BFF && runtPs == BFF) || (initPs == UNK && runtPs == BFF) || (initPs == TFF && runtPs == UNK) || (initPs == TFF && runtPs == TFF) || (initPs == UNK && runtPs == TFF)) return MFX_ERR_NONE; if ((initPs == UNK && runtPs == (PRG | BFF)) || (initPs == UNK && runtPs == (PRG | TFF)) || (initPs == UNK && runtPs == (PRG | BFF | REP)) || (initPs == UNK && runtPs == (PRG | TFF | REP)) || (initPs == UNK && runtPs == PRG) || (initPs == BFF && runtPs == PRG) || (initPs == TFF && runtPs == PRG)) return MFX_ERR_NONE; if (initPs == UNK && runtPs == UNK) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } bool MfxHwH264Encode::IsRecoveryPointSeiMessagePresent( const mfxPayload* const* payload, mfxU16 numPayload, mfxU32 payloadLayout) { if (!payload) return false; mfxU32 step = payloadLayout == 0 /*MFX_PAYLOAD_LAYOUT_ALL*/ ? 1 : 2; mfxU32 i = payloadLayout == 2 /*MFX_PAYLOAD_LAYOUT_ODD*/ ? 1 : 0; for (; i < numPayload; i += step) if (payload[i] && payload[i]->NumBit > 0 && payload[i]->Type == 6) break; return i < numPayload; } mfxStatus MfxHwH264Encode::CopyFrameDataBothFields( VideoCORE * core, mfxMemId dstMid, const mfxFrameSurface1& srcSurf, mfxFrameInfo const& info, const mfxU16& inMemType) { mfxFrameSurface1 sysSurf = MakeSurface(info, srcSurf); mfxFrameSurface1 vidSurf = MakeSurface(info, dstMid); mfxStatus sts = core->DoFastCopyWrapper( &vidSurf, MFX_MEMTYPE_INTERNAL_FRAME|MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_FROM_ENCODE, &sysSurf, inMemType); MFX_CHECK_STS(sts); return sts; } #if defined(MFX_ENABLE_ENCTOOLS_LPLA) bool MfxHwH264Encode::IsLpLookaheadSupported(mfxU16 scenario, mfxU16 lookaheadDepth, mfxU16 rateContrlMethod) { if (scenario == MFX_SCENARIO_GAME_STREAMING && lookaheadDepth > 0 && (rateContrlMethod == MFX_RATECONTROL_CBR || rateContrlMethod == MFX_RATECONTROL_VBR)) { return true; } return false; } #endif mfxU8 MfxHwH264Encode::ConvertFrameTypeMfx2Ddi(mfxU32 type) { switch (type & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: return CODING_TYPE_I; case MFX_FRAMETYPE_P: return CODING_TYPE_P; case MFX_FRAMETYPE_B: return CODING_TYPE_B; default: assert(!"Unsupported frame type"); return 0; } } ENCODE_FRAME_SIZE_TOLERANCE MfxHwH264Encode::ConvertLowDelayBRCMfx2Ddi(mfxU16 type, bool bTCBRC) { switch (type) { case MFX_CODINGOPTION_ON: return bTCBRC ? eFrameSizeTolerance_Normal : eFrameSizeTolerance_ExtremelyLow; default: return eFrameSizeTolerance_Normal; } } mfxU8 MfxHwH264Encode::ConvertMfxFrameType2SliceType(mfxU8 type) { switch (type & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: return SLICE_TYPE_I + 5; case MFX_FRAMETYPE_P: return SLICE_TYPE_P + 5; case MFX_FRAMETYPE_B: return SLICE_TYPE_B + 5; default: assert("bad codingType"); return 0xff; } } mfxU32 SliceDivider::GetFirstMbInSlice() const { assert(m_currSliceFirstMbRow * m_numMbInRow < 0x10000000); return m_currSliceFirstMbRow * m_numMbInRow; } mfxU32 SliceDivider::GetNumMbInSlice() const { assert(m_currSliceNumMbRow * m_numMbInRow < 0x10000000); return m_currSliceNumMbRow * m_numMbInRow; } mfxU32 SliceDivider::GetNumSlice() const { assert(0 < m_numSlice && m_numSlice < 0x10000000); return m_numSlice; } SliceDividerArbitraryRowSlice::SliceDividerArbitraryRowSlice( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerArbitraryRowSlice::Next; m_numSlice = mfx::clamp(numSlice, 1u, heightInMbs); m_numMbInRow = widthInMbs; m_numMbRow = heightInMbs; m_leftSlice = m_numSlice; m_leftMbRow = m_numMbRow; m_currSliceFirstMbRow = 0; m_currSliceNumMbRow = mfx::CeilDiv(m_leftMbRow, m_leftSlice); } bool SliceDividerArbitraryRowSlice::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow += state.m_currSliceNumMbRow; state.m_currSliceNumMbRow = mfx::CeilDiv(state.m_leftMbRow, state.m_leftSlice); assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDividerOneSlice::SliceDividerOneSlice( mfxU32 /*numSlice*/, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerOneSlice::Next; m_numSlice = 1; m_numMbInRow = widthInMbs; m_numMbRow = heightInMbs; m_leftSlice = 1; m_leftMbRow = heightInMbs; m_currSliceFirstMbRow = 0; m_currSliceNumMbRow = heightInMbs; } bool SliceDividerOneSlice::Next(SliceDividerState & state) { state.m_leftMbRow = 0; state.m_leftSlice = 0; return false; } namespace { // nearest but less than n mfxU32 GetNearestPowerOf2(mfxU32 n) { mfxU32 mask = 0x80000000; for (; mask > 0; mask >>= 1) if (n & mask) break; return mask; } }; SliceDividerRow2Row::SliceDividerRow2Row( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerRow2Row::Next; m_numSlice = std::max(numSlice, 1u); m_numMbInRow = widthInMbs; m_numMbRow = heightInMbs; m_leftSlice = m_numSlice; m_leftMbRow = m_numMbRow; m_currSliceFirstMbRow = 0; m_currSliceNumMbRow = m_leftMbRow / m_leftSlice; // check if frame is divisible to requested number of slices mfxU32 numMbRowInSlice = std::max(1u, m_numMbRow / m_numSlice); numMbRowInSlice = GetNearestPowerOf2(numMbRowInSlice) << 1; if ((m_numMbRow + numMbRowInSlice - 1) / numMbRowInSlice < m_numSlice) numMbRowInSlice >>= 1; // As number of slices can only be increased, try smaller slices m_numSlice = (m_numMbRow + numMbRowInSlice - 1) / numMbRowInSlice; m_leftSlice = m_numSlice; m_currSliceNumMbRow = std::min(numMbRowInSlice, m_leftMbRow); } bool SliceDividerRow2Row::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow += state.m_currSliceNumMbRow; if (state.m_currSliceNumMbRow > state.m_leftMbRow) state.m_currSliceNumMbRow = state.m_leftMbRow; assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDividerRowSlice::SliceDividerRowSlice( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerRowSlice::Next; m_numSlice = mfx::clamp(numSlice, 1u, heightInMbs); m_numMbInRow = widthInMbs; m_numMbRow = heightInMbs; m_currSliceFirstMbRow = 0; m_leftMbRow = heightInMbs; mfxU32 H = heightInMbs; // frame height mfxU32 n = m_numSlice; // num slices mfxU32 sh = (H + n - 1) / n; // slice height // check if frame is divisible to requested number of slices // so that size of last slice is no bigger than other slices while (sh * (n - 1) >= H) { n++; sh = (H + n - 1) / n; } m_currSliceNumMbRow = sh; m_numSlice = n; m_leftSlice = n; } bool SliceDividerRowSlice::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow += state.m_currSliceNumMbRow; if (state.m_currSliceNumMbRow > state.m_leftMbRow) state.m_currSliceNumMbRow = state.m_leftMbRow; assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDividerTemporalScalability::SliceDividerTemporalScalability( mfxU32 sliceSizeInMbs, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerTemporalScalability::Next; m_numMbInRow = 1; m_numMbRow = heightInMbs*widthInMbs; m_currSliceFirstMbRow = 0; m_leftMbRow = m_numMbRow; m_numSlice = (m_numMbRow + sliceSizeInMbs - 1) / sliceSizeInMbs; m_currSliceNumMbRow = sliceSizeInMbs; m_leftSlice = m_numSlice; } bool SliceDividerTemporalScalability::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow += state.m_currSliceNumMbRow; if (state.m_currSliceNumMbRow > state.m_leftMbRow) state.m_currSliceNumMbRow = state.m_leftMbRow; assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDividerLowPowerTemporalScalability::SliceDividerLowPowerTemporalScalability( mfxU32 sliceSizeInMbs, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerLowPowerTemporalScalability::Next; m_numMbInRow = 1; m_numMbRow = heightInMbs*widthInMbs; m_currSliceFirstMbRow = 0; m_leftMbRow = m_numMbRow; m_numSlice = (m_numMbRow + sliceSizeInMbs - 1) / sliceSizeInMbs; m_currSliceNumMbRow = sliceSizeInMbs; m_leftSlice = m_numSlice; } bool SliceDividerLowPowerTemporalScalability::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow = 0; //state.m_currSliceNumMbRow; if (state.m_currSliceNumMbRow > state.m_leftMbRow) state.m_currSliceNumMbRow = state.m_leftMbRow; assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDividerLowPower::SliceDividerLowPower( mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs) { m_pfNext = &SliceDividerLowPower::Next; m_numSlice = mfx::clamp(numSlice, 1u, heightInMbs); m_numMbInRow = widthInMbs; m_numMbRow = heightInMbs; m_currSliceFirstMbRow = 0; m_leftMbRow = heightInMbs; mfxU32 H = heightInMbs; // frame height mfxU32 n = m_numSlice; // num slices mfxU32 sh = (H + n - 1) / n; // slice height // check if frame is divisible to requested number of slices // so that size of last slice is no bigger than other slices while (sh * (n - 1) >= H) { n++; sh = (H + n - 1) / n; } m_currSliceNumMbRow = sh; m_numSlice = n; m_leftSlice = n; } bool SliceDividerLowPower::Next(SliceDividerState & state) { state.m_leftMbRow -= state.m_currSliceNumMbRow; state.m_leftSlice -= 1; if (state.m_leftSlice == 0) { assert(state.m_leftMbRow == 0); return false; } else { state.m_currSliceFirstMbRow = 0;//state.m_currSliceNumMbRow; if (state.m_currSliceNumMbRow > state.m_leftMbRow) state.m_currSliceNumMbRow = state.m_leftMbRow; assert(state.m_currSliceNumMbRow != 0); return true; } } SliceDivider MfxHwH264Encode::MakeSliceDivider( SliceDividerType sliceHwCaps, mfxU32 sliceSizeInMbs, mfxU32 numSlice, mfxU32 widthInMbs, mfxU32 heightInMbs, bool isLowPower) { if(isLowPower){ if(sliceHwCaps != SliceDividerType::ONESLICE && sliceSizeInMbs > 0) return SliceDividerLowPowerTemporalScalability(sliceSizeInMbs, widthInMbs, heightInMbs); return SliceDividerLowPower(numSlice, widthInMbs, heightInMbs); } if(sliceHwCaps != SliceDividerType::ONESLICE && sliceSizeInMbs > 0) return SliceDividerTemporalScalability(sliceSizeInMbs, widthInMbs, heightInMbs); switch (sliceHwCaps) { case SliceDividerType::ROW2ROW: return SliceDividerRow2Row(numSlice, widthInMbs, heightInMbs); case SliceDividerType::ROWSLICE: return SliceDividerRowSlice(numSlice, widthInMbs, heightInMbs); case SliceDividerType::ARBITRARY_ROW_SLICE: return SliceDividerArbitraryRowSlice(numSlice, widthInMbs, heightInMbs); //If arbitrary slice size supported by HW make legacy HSW division, need to implement arbitrary case case SliceDividerType::ARBITRARY_MB_SLICE: return SliceDividerRowSlice(numSlice, widthInMbs, heightInMbs); default: return SliceDividerOneSlice(numSlice, widthInMbs, heightInMbs); } } namespace { bool TestSliceDivider( mfxU32 requestedNumSlice, mfxU32 width, mfxU32 height, mfxU32 refNumSlice, mfxU32 refNumMbRowsInSlice, mfxU32 refNumMbRowsInLastSlice) { mfxU32 numMbsInRow = (width + 15) / 16; SliceDivider sd = SliceDividerRow2Row(requestedNumSlice, numMbsInRow, (height + 15) / 16); mfxU32 numSlice = sd.GetNumSlice(); if (numSlice != refNumSlice) return false; mfxU32 predictedPirstMbInSlice = 0; for (mfxU32 i = 0; i < numSlice; i++) { mfxU32 firstMbInSlice = sd.GetFirstMbInSlice(); mfxU32 numMbInSlice = sd.GetNumMbInSlice(); if (firstMbInSlice != predictedPirstMbInSlice) return false; bool hasNext = sd.Next(); if (hasNext != (i + 1 < numSlice)) return false; if (hasNext) { if (numMbInSlice != refNumMbRowsInSlice * numMbsInRow) return false; } else { if (numMbInSlice != refNumMbRowsInLastSlice * numMbsInRow) return false; } predictedPirstMbInSlice += numMbInSlice; } return true; } bool TestSliceDividerWithReport( mfxU32 requestedNumSlice, mfxU32 width, mfxU32 height, mfxU32 refNumSlice, mfxU32 refNumMbRowsInSlice, mfxU32 refNumMbRowsInLastSlice) { if (!TestSliceDivider(requestedNumSlice, width, height, refNumSlice, refNumMbRowsInSlice, refNumMbRowsInLastSlice)) { //std::cout << "Failed with requestedNumSlice=" << requestedNumSlice << " width=" << width << " height=" << height << std::endl; return false; } //std::cout << "Passed with requestedNumSlice=" << requestedNumSlice << " width=" << width << " height=" << height << std::endl; return true; } } void SliceDividerRow2Row::Test() { TestSliceDividerWithReport( 2, 720, 480, 2, 16, 14); TestSliceDividerWithReport( 4, 720, 480, 4, 8, 6); TestSliceDividerWithReport( 8, 720, 480, 8, 4, 2); TestSliceDividerWithReport(16, 720, 480, 30, 1, 1); TestSliceDividerWithReport( 2, 1920, 1080, 2, 64, 4); TestSliceDividerWithReport( 4, 1920, 1080, 5, 16, 4); TestSliceDividerWithReport( 8, 1920, 1080, 9, 8, 4); TestSliceDividerWithReport(16, 1920, 1080, 17, 4, 4); TestSliceDividerWithReport( 8, 1280, 720, 12, 4, 1); TestSliceDividerWithReport( 8, 480, 320, 10, 2, 2); TestSliceDividerWithReport( 2, 720, 480 / 2, 2, 8, 7); TestSliceDividerWithReport( 4, 720, 480 / 2, 4, 4, 3); TestSliceDividerWithReport( 8, 720, 480 / 2, 8, 2, 1); TestSliceDividerWithReport(16, 720, 480 / 2, 15, 1, 1); TestSliceDividerWithReport( 2, 1920, 1080 / 2, 2, 32, 2); TestSliceDividerWithReport( 4, 1920, 1080 / 2, 5, 8, 2); TestSliceDividerWithReport( 8, 1920, 1080 / 2, 9, 4, 2); TestSliceDividerWithReport(16, 1920, 1080 / 2, 17, 2, 2); TestSliceDividerWithReport( 8, 1280, 720 / 2, 12, 2, 1); TestSliceDividerWithReport( 8, 480, 320 / 2, 10, 1, 1); } MfxVideoParam::MfxVideoParam() : mfxVideoParam() , m_extOpt() , m_extOpt2() , m_extOpt3() , m_extOptSpsPps() , m_extVideoSignal() , m_extMvcSeqDescr() , m_extPicTiming() , m_extTempLayers() #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE , m_extSvcSeqDescr() , m_extSvcRateCtrl() #endif , m_extEncResetOpt() , m_extEncRoi() , m_extChromaLoc() , m_extPwt() , m_extDirtyRect() , m_extMoveRect() , m_extOptDdi() , m_extSps() , m_extPps() #if defined(__MFXBRC_H__) , m_extBRC() #if defined(MFX_ENABLE_ENCTOOLS) , m_encTools() , m_encToolsConfig() , m_extDevice() , m_extAllocator() #endif #endif #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) , m_po() #endif , calcParam() { memset(m_extParam, 0, sizeof(m_extParam)); } MfxVideoParam::MfxVideoParam(MfxVideoParam const & par) { Construct(par); calcParam = par.calcParam; } MfxVideoParam::MfxVideoParam(mfxVideoParam const & par) { Construct(par); SyncVideoToCalculableParam(); } MfxVideoParam& MfxVideoParam::operator=(MfxVideoParam const & par) { Construct(par); #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) std::copy(par.m_extCqmPps.begin(), par.m_extCqmPps.end(), m_extCqmPps.begin()); #endif calcParam = par.calcParam; return *this; } MfxVideoParam& MfxVideoParam::operator=(mfxVideoParam const & par) { Construct(par); SyncVideoToCalculableParam(); return *this; } void MfxVideoParam::SyncVideoToCalculableParam() { mfxU32 multiplier = std::max(mfx.BRCParamMultiplier, 1); calcParam.PPyrInterval = (mfx.NumRefFrame > 0) ? std::min(DEFAULT_PPYR_INTERVAL, mfx.NumRefFrame) : DEFAULT_PPYR_INTERVAL; calcParam.bufferSizeInKB = mfx.BufferSizeInKB * multiplier; if (IsOn(m_extOpt.VuiNalHrdParameters) && !IsOn(m_extOpt.VuiVclHrdParameters) && IsOff(m_extOpt.NalHrdConformance) && mfx.RateControlMethod == MFX_RATECONTROL_CQP && mfx.FrameInfo.FrameRateExtN != 0 && mfx.FrameInfo.FrameRateExtD != 0 && mfx.BufferSizeInKB != 0 && mfx.InitialDelayInKB != 0 && mfx.TargetKbps != 0) { calcParam.cqpHrdMode = mfx.MaxKbps > 0 ? 2 : 1; } if (calcParam.cqpHrdMode) { calcParam.decorativeHrdParam.bufferSizeInKB = calcParam.bufferSizeInKB; calcParam.decorativeHrdParam.initialDelayInKB = mfx.InitialDelayInKB * multiplier; calcParam.decorativeHrdParam.targetKbps = mfx.TargetKbps * multiplier; calcParam.decorativeHrdParam.maxKbps = mfx.MaxKbps > 0 ? mfx.MaxKbps * multiplier : calcParam.decorativeHrdParam.targetKbps; } if (mfx.RateControlMethod != MFX_RATECONTROL_CQP && mfx.RateControlMethod != MFX_RATECONTROL_ICQ && mfx.RateControlMethod != MFX_RATECONTROL_LA_ICQ) { calcParam.initialDelayInKB = mfx.InitialDelayInKB * multiplier; calcParam.targetKbps = mfx.TargetKbps * multiplier; calcParam.maxKbps = mfx.MaxKbps * multiplier; } else { calcParam.bufferSizeInKB = calcParam.initialDelayInKB = calcParam.maxKbps = 0; } if ( mfx.RateControlMethod == MFX_RATECONTROL_LA || mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) calcParam.WinBRCMaxAvgKbps = m_extOpt3.WinBRCMaxAvgKbps * multiplier; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(mfx.CodecProfile)) { calcParam.numTemporalLayer = 0; calcParam.tid[0] = 0; calcParam.scale[0] = 1; for (mfxU32 did = 8; did > 0; did--) { if (m_extSvcSeqDescr.DependencyLayer[did - 1].Active) { // 'numTemporalLayers' is used as temporal fix for array bound violation (calcParam.tid[], calcParam.scale[]) // need to implement correct checking for 'TemporalNum' (this param is used before calling CheckVideoParamQueryLike()) mfxU16 numTemporalLayers = std::min(m_extSvcSeqDescr.DependencyLayer[did - 1].TemporalNum, 8); for (mfxU32 tidx = 0; tidx < numTemporalLayers; tidx++) { mfxU32 tid = m_extSvcSeqDescr.DependencyLayer[did - 1].TemporalId[tidx]; calcParam.tid[calcParam.numTemporalLayer] = tid; calcParam.scale[calcParam.numTemporalLayer] = m_extSvcSeqDescr.TemporalScale[tid]; calcParam.numTemporalLayer++; } break; } } } else #endif { calcParam.numTemporalLayer = 0; calcParam.tid[0] = 0; calcParam.scale[0] = 1; for (mfxU32 i = 0; i < 8; i++) { if (m_extTempLayers.Layer[i].Scale != 0) { calcParam.tid[calcParam.numTemporalLayer] = i; calcParam.scale[calcParam.numTemporalLayer] = m_extTempLayers.Layer[i].Scale; calcParam.numTemporalLayer++; } } if (calcParam.numTemporalLayer) calcParam.tempScalabilityMode = 1; calcParam.numDependencyLayer = 1; calcParam.numLayersTotal = 1; } if (IsMvcProfile(mfx.CodecProfile)) { mfxExtMVCSeqDesc * extMvc = GetExtBuffer(*this); if (extMvc && extMvc->NumView) { calcParam.mvcPerViewPar.bufferSizeInKB = calcParam.bufferSizeInKB / extMvc->NumView; if (mfx.RateControlMethod != MFX_RATECONTROL_CQP && mfx.RateControlMethod != MFX_RATECONTROL_ICQ && mfx.RateControlMethod != MFX_RATECONTROL_LA_ICQ) { calcParam.mvcPerViewPar.initialDelayInKB = calcParam.initialDelayInKB / extMvc->NumView; calcParam.mvcPerViewPar.targetKbps = calcParam.targetKbps / extMvc->NumView; calcParam.mvcPerViewPar.maxKbps = calcParam.maxKbps / extMvc->NumView; } else { calcParam.mvcPerViewPar.initialDelayInKB = calcParam.mvcPerViewPar.targetKbps = calcParam.mvcPerViewPar.maxKbps = 0; } } calcParam.mvcPerViewPar.codecLevel = mfx.CodecLevel; } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(mfx.CodecProfile)) { calcParam.numLayersTotal = 0; calcParam.numDependencyLayer = 0; for (mfxU32 i = 0; i < 8; i++) { if (m_extSvcSeqDescr.DependencyLayer[i].Active) { calcParam.did[calcParam.numDependencyLayer] = i; calcParam.numLayerOffset[calcParam.numDependencyLayer] = calcParam.numLayersTotal; calcParam.numLayersTotal += m_extSvcSeqDescr.DependencyLayer[i].QualityNum * m_extSvcSeqDescr.DependencyLayer[i].TemporalNum; calcParam.numDependencyLayer++; } } calcParam.dqId1Exists = m_extSvcSeqDescr.DependencyLayer[calcParam.did[0]].QualityNum > 1 ? 1 : 0; } #endif } void MfxVideoParam::SyncCalculableToVideoParam() { mfxU32 maxVal32 = calcParam.bufferSizeInKB; if (mfx.RateControlMethod != MFX_RATECONTROL_CQP) { maxVal32 = std::max(maxVal32, calcParam.targetKbps); if (mfx.RateControlMethod != MFX_RATECONTROL_AVBR) { if (mfx.RateControlMethod == MFX_RATECONTROL_VBR || mfx.RateControlMethod == MFX_RATECONTROL_QVBR) maxVal32 = std::max({maxVal32, calcParam.maxKbps, calcParam.initialDelayInKB}); else maxVal32 = std::max({maxVal32, calcParam.maxKbps, calcParam.initialDelayInKB, calcParam.WinBRCMaxAvgKbps}); } } mfx.BRCParamMultiplier = mfxU16((maxVal32 + 0x10000) / 0x10000); if (calcParam.cqpHrdMode == 0 || calcParam.bufferSizeInKB) { mfx.BufferSizeInKB = mfxU16(calcParam.bufferSizeInKB / mfx.BRCParamMultiplier); } if (mfx.RateControlMethod == MFX_RATECONTROL_CBR || mfx.RateControlMethod == MFX_RATECONTROL_VBR || mfx.RateControlMethod == MFX_RATECONTROL_VCM || mfx.RateControlMethod == MFX_RATECONTROL_AVBR|| mfx.RateControlMethod == MFX_RATECONTROL_QVBR || (bRateControlLA(mfx.RateControlMethod) && (mfx.RateControlMethod != MFX_RATECONTROL_LA_ICQ))) { mfx.TargetKbps = mfxU16(calcParam.targetKbps / mfx.BRCParamMultiplier); if (mfx.RateControlMethod != MFX_RATECONTROL_AVBR) { mfx.InitialDelayInKB = mfxU16(calcParam.initialDelayInKB / mfx.BRCParamMultiplier); mfx.MaxKbps = mfxU16(calcParam.maxKbps / mfx.BRCParamMultiplier); } } if ( mfx.RateControlMethod == MFX_RATECONTROL_LA || mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) m_extOpt3.WinBRCMaxAvgKbps = mfxU16(calcParam.WinBRCMaxAvgKbps / mfx.BRCParamMultiplier); } void MfxVideoParam::AlignCalcWithBRCParamMultiplier() { if(!mfx.BRCParamMultiplier) return; if (mfx.RateControlMethod != MFX_RATECONTROL_CQP) { calcParam.bufferSizeInKB = mfx.BufferSizeInKB * mfx.BRCParamMultiplier; calcParam.initialDelayInKB = mfx.InitialDelayInKB * mfx.BRCParamMultiplier; calcParam.targetKbps = mfx.TargetKbps * mfx.BRCParamMultiplier; calcParam.maxKbps = mfx.MaxKbps * mfx.BRCParamMultiplier; calcParam.WinBRCMaxAvgKbps = m_extOpt3.WinBRCMaxAvgKbps * mfx.BRCParamMultiplier; } } void MfxVideoParam::Construct(mfxVideoParam const & par) { mfxVideoParam & base = *this; base = par; Zero(m_extParam); Zero(calcParam); NumExtParam = 0; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) m_extCqmPps.resize(CQM_HINT_NUM_CUST_MATRIX); #endif #define CONSTRUCT_EXT_BUFFER(type, name) \ InitExtBufHeader(name); \ if (type * opts = GetExtBuffer(par)) \ { name = *opts; } \ m_extParam[NumExtParam++] = &name.Header; #define CONSTRUCT_EXT_BUFFER_EX(type, name, field) \ InitExtBufHeader(name[field]); \ if (type * opts = GetExtBuffer(par, field)) \ name[field] = *opts; \ m_extParam[NumExtParam++] = &name[field].Header; #define CONSTRUCT_EXT_BUFFER_DEF(type, name, defValue) \ InitExtBufHeader(name, defValue); \ if (type * opts = GetExtBuffer(par)) \ { name = *opts; } \ m_extParam[NumExtParam++] = &name.Header; CONSTRUCT_EXT_BUFFER(mfxExtCodingOption, m_extOpt); CONSTRUCT_EXT_BUFFER(mfxExtCodingOptionSPSPPS, m_extOptSpsPps); CONSTRUCT_EXT_BUFFER(mfxExtVideoSignalInfo, m_extVideoSignal); // perform deep copy of the mfxExtMVCSeqDesc buffer InitExtBufHeader(m_extMvcSeqDescr); if (mfxExtMVCSeqDesc * buffer = GetExtBuffer(par)) ConstructMvcSeqDesc(*buffer); m_extParam[NumExtParam++] = &m_extMvcSeqDescr.Header; CONSTRUCT_EXT_BUFFER(mfxExtPictureTimingSEI, m_extPicTiming); CONSTRUCT_EXT_BUFFER(mfxExtAvcTemporalLayers, m_extTempLayers); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE CONSTRUCT_EXT_BUFFER(mfxExtSVCSeqDesc, m_extSvcSeqDescr); CONSTRUCT_EXT_BUFFER(mfxExtSVCRateControl, m_extSvcRateCtrl); #endif CONSTRUCT_EXT_BUFFER(mfxExtCodingOptionDDI, m_extOptDdi); CONSTRUCT_EXT_BUFFER(mfxExtSpsHeader, m_extSps); CONSTRUCT_EXT_BUFFER(mfxExtPpsHeader, m_extPps); CONSTRUCT_EXT_BUFFER(mfxExtCodingOption2, m_extOpt2); CONSTRUCT_EXT_BUFFER(mfxExtEncoderResetOption, m_extEncResetOpt); CONSTRUCT_EXT_BUFFER(mfxExtEncoderROI, m_extEncRoi); CONSTRUCT_EXT_BUFFER(mfxExtCodingOption3, m_extOpt3); CONSTRUCT_EXT_BUFFER(mfxExtChromaLocInfo, m_extChromaLoc); CONSTRUCT_EXT_BUFFER(mfxExtPredWeightTable, m_extPwt); CONSTRUCT_EXT_BUFFER(mfxExtDirtyRect, m_extDirtyRect); CONSTRUCT_EXT_BUFFER(mfxExtMoveRect, m_extMoveRect); #if defined(__MFXBRC_H__) CONSTRUCT_EXT_BUFFER(mfxExtBRC, m_extBRC); #endif #if defined(MFX_ENABLE_ENCTOOLS) mfxU16 et_default = MFX_CODINGOPTION_OFF; mfxExtEncToolsConfig *pConf = GetExtBuffer(par); if (!pConf) { // AEnc EncTools on for all GopRefDist if (m_extOpt2.LookAheadDepth > 0 && !bRateControlLA(mfx.RateControlMethod) && m_extOpt2.ExtBRC == MFX_CODINGOPTION_ON && m_extOpt3.ScenarioInfo == MFX_SCENARIO_UNKNOWN) { et_default = MFX_CODINGOPTION_UNKNOWN; } #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (IsLpLookaheadSupported(m_extOpt3.ScenarioInfo, m_extOpt2.LookAheadDepth, mfx.RateControlMethod)) { et_default = MFX_CODINGOPTION_UNKNOWN; } #endif } CONSTRUCT_EXT_BUFFER(mfxEncTools, m_encTools); CONSTRUCT_EXT_BUFFER_DEF(mfxExtEncToolsConfig, m_encToolsConfig, et_default); CONSTRUCT_EXT_BUFFER(mfxEncToolsCtrlExtDevice, m_extDevice); CONSTRUCT_EXT_BUFFER(mfxEncToolsCtrlExtAllocator, m_extAllocator); #endif CONSTRUCT_EXT_BUFFER(mfxExtVPPDenoise2, m_extVppHVS); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) CONSTRUCT_EXT_BUFFER(mfxExtPartialBitstreamParam , m_po); #endif #undef CONSTRUCT_EXT_BUFFER #undef CONSTRUCT_EXT_BUFFER_EX ExtParam = m_extParam; } void MfxVideoParam::ConstructMvcSeqDesc( mfxExtMVCSeqDesc const & desc) { m_extMvcSeqDescr.NumView = desc.NumView; m_extMvcSeqDescr.NumViewAlloc = desc.NumViewAlloc; m_extMvcSeqDescr.View = 0; m_extMvcSeqDescr.NumViewId = desc.NumViewId; m_extMvcSeqDescr.NumViewIdAlloc = desc.NumViewIdAlloc; m_extMvcSeqDescr.ViewId = 0; m_extMvcSeqDescr.NumOP = desc.NumOP; m_extMvcSeqDescr.NumOPAlloc = desc.NumOPAlloc; m_extMvcSeqDescr.OP = 0; m_extMvcSeqDescr.NumRefsTotal = desc.NumRefsTotal; if (desc.View) {// potentially NumView and NumViewAlloc may differ, so reallocate for NumViewAlloc views m_storageView.resize(desc.NumViewAlloc); std::copy(desc.View, desc.View + desc.NumView, m_storageView.begin()); m_extMvcSeqDescr.View = &m_storageView[0]; if (desc.ViewId && desc.OP) { m_storageOp.resize(desc.NumOPAlloc); m_storageViewId.resize(desc.NumViewIdAlloc); std::copy(desc.OP, desc.OP + desc.NumOP, m_storageOp.begin()); std::copy(desc.ViewId, desc.ViewId + desc.NumViewId, m_storageViewId.begin()); for (size_t i = 0; i < m_storageOp.size(); ++i) { ptrdiff_t offset = desc.OP[i].TargetViewId - desc.ViewId; m_storageOp[i].TargetViewId = &m_storageViewId[0] + offset; } m_extMvcSeqDescr.ViewId = &m_storageViewId[0]; m_extMvcSeqDescr.OP = &m_storageOp[0]; } } } void MfxVideoParam::ApplyDefaultsToMvcSeqDesc() { if (false == IsMvcProfile(mfx.CodecProfile)) { m_extMvcSeqDescr.NumView = 1; return; } if (m_extMvcSeqDescr.NumView == 0) m_extMvcSeqDescr.NumView = 2; if (m_extMvcSeqDescr.View == 0) { m_extMvcSeqDescr.NumViewAlloc = m_extMvcSeqDescr.NumView; m_storageView.resize(m_extMvcSeqDescr.NumView); Zero(m_storageView); for (size_t i = 0; i < m_storageView.size(); i++) m_storageView[i].ViewId = mfxU16(i); m_extMvcSeqDescr.View = &m_storageView[0]; } if (m_extMvcSeqDescr.ViewId == 0) { m_extMvcSeqDescr.NumViewId = m_extMvcSeqDescr.NumViewIdAlloc = m_extMvcSeqDescr.NumView; m_storageViewId.resize(m_extMvcSeqDescr.NumViewId); Zero(m_storageViewId); for (size_t i = 0; i < m_extMvcSeqDescr.NumViewIdAlloc; i++) m_storageViewId[i] = mfxU16(i); m_extMvcSeqDescr.ViewId = &m_storageViewId[0]; } if (m_extMvcSeqDescr.OP == 0) { m_extMvcSeqDescr.NumOP = 1; m_extMvcSeqDescr.NumOPAlloc = 1; m_storageOp.resize(m_extMvcSeqDescr.NumOP); Zero(m_storageOp); m_storageOp[0].TemporalId = 0; m_storageOp[0].LevelIdc = mfx.CodecLevel; m_storageOp[0].NumViews = mfxU16(m_storageViewId.size()); m_storageOp[0].NumTargetViews = mfxU16(m_storageViewId.size()); m_storageOp[0].TargetViewId = &m_storageViewId[0]; m_extMvcSeqDescr.OP = m_storageOp.size() ? &m_storageOp[0] : 0; } else { for (mfxU32 i = 0; i < m_extMvcSeqDescr.NumOP; i++) { if (m_extMvcSeqDescr.OP[i].LevelIdc == 0) m_extMvcSeqDescr.OP[i].LevelIdc = mfx.CodecLevel; } } } AspectRatioConverter::AspectRatioConverter(mfxU16 sarw, mfxU16 sarh) : m_sarIdc(0), m_sarWidth(0), m_sarHeight(0) { if (sarw != 0 && sarh != 0) { for (mfxU8 i = 1; i < sizeof(TABLE_E1) / sizeof(TABLE_E1[0]); i++) { if ((sarw % TABLE_E1[i].w) == 0 && (sarh % TABLE_E1[i].h) == 0 && (sarw / TABLE_E1[i].w) == (sarh / TABLE_E1[i].h)) { m_sarIdc = i; m_sarWidth = TABLE_E1[i].w; m_sarHeight = TABLE_E1[i].h; return; } } m_sarIdc = EXTENDED_SAR; m_sarWidth = sarw; m_sarHeight = sarh; } } AspectRatioConverter::AspectRatioConverter(mfxU8 sarIdc, mfxU16 sarw, mfxU16 sarh) { if (sarIdc < sizeof(TABLE_E1) / sizeof(TABLE_E1[0])) { m_sarIdc = sarIdc; m_sarWidth = TABLE_E1[sarIdc].w; m_sarHeight = TABLE_E1[sarIdc].h; } else { m_sarIdc = EXTENDED_SAR; m_sarWidth = sarw; m_sarHeight = sarh; } } namespace { # ifdef min # undef min # endif # ifdef max # undef max # endif template class RangeChecker { public: RangeChecker(Tfrom from) : m_from(from) {} template operator Tto() const { if (std::numeric_limits::min() <= m_from && m_from <= std::numeric_limits::max()) return static_cast(m_from); throw InvalidBitstream(); } private: Tfrom m_from; }; class InputBitstreamCheckedRange { public: InputBitstreamCheckedRange(InputBitstream & impl) : m_impl(impl) {} mfxU32 NumBitsRead() const { return m_impl.NumBitsRead(); } mfxU32 NumBitsLeft() const { return m_impl.NumBitsLeft(); } mfxU8 GetBit() { return static_cast(m_impl.GetBit()); } RangeChecker GetBits(mfxU32 nbits) { return m_impl.GetBits(nbits); } RangeChecker GetUe() { return m_impl.GetUe(); } RangeChecker GetSe() { return m_impl.GetSe(); } private: void operator =(InputBitstreamCheckedRange const &); InputBitstream & m_impl; }; void ReadScalingList( InputBitstreamCheckedRange & reader, mfxU8 * scalingList, mfxU32 size) { mfxU8 lastScale = 8; mfxU8 nextScale = 8; const mfxI32* scan; if (size == 16) scan = UMC_H264_ENCODER::dec_single_scan[0]; else scan = UMC_H264_ENCODER::dec_single_scan_8x8[0]; for (mfxU32 i = 0; i < size; i++) { if (nextScale != 0) { mfxI32 deltaScale = reader.GetSe(); if (deltaScale < -128 || deltaScale > 127) throw InvalidBitstream(); nextScale = mfxU8((lastScale + deltaScale + 256) & 0xff); } scalingList[scan[i]] = (nextScale == 0) ? lastScale : nextScale; lastScale = scalingList[scan[i]]; } } void ReadHrdParameters( InputBitstreamCheckedRange & reader, HrdParameters & hrd) { hrd.cpbCntMinus1 = reader.GetUe(); if (hrd.cpbCntMinus1 > 31) throw InvalidBitstream(); hrd.bitRateScale = reader.GetBits(4); hrd.cpbSizeScale = reader.GetBits(4); for (mfxU32 i = 0; i <= hrd.cpbCntMinus1; i++) { hrd.bitRateValueMinus1[i] = reader.GetUe(); hrd.cpbSizeValueMinus1[i] = reader.GetUe(); hrd.cbrFlag[i] = reader.GetBit(); } hrd.initialCpbRemovalDelayLengthMinus1 = reader.GetBits(5); hrd.cpbRemovalDelayLengthMinus1 = reader.GetBits(5); hrd.dpbOutputDelayLengthMinus1 = reader.GetBits(5); hrd.timeOffsetLength = reader.GetBits(5); } void WriteHrdParameters( OutputBitstream & writer, HrdParameters const & hrd) { writer.PutUe(hrd.cpbCntMinus1); writer.PutBits(hrd.bitRateScale, 4); writer.PutBits(hrd.cpbSizeScale, 4); for (mfxU32 i = 0; i <= hrd.cpbCntMinus1; i++) { writer.PutUe(hrd.bitRateValueMinus1[i]); writer.PutUe(hrd.cpbSizeValueMinus1[i]); writer.PutBit(hrd.cbrFlag[i]); } writer.PutBits(hrd.initialCpbRemovalDelayLengthMinus1, 5); writer.PutBits(hrd.cpbRemovalDelayLengthMinus1, 5); writer.PutBits(hrd.dpbOutputDelayLengthMinus1, 5); writer.PutBits(hrd.timeOffsetLength, 5); } bool MoreRbspData(InputBitstream reader) { mfxU32 bitsLeft = reader.NumBitsLeft(); if (bitsLeft == 0) return false; if (reader.GetBit() == 0) return true; --bitsLeft; for (; bitsLeft > 0; --bitsLeft) if (reader.GetBit() == 1) return true; return false; } }; void MfxHwH264Encode::ReadSpsHeader( InputBitstream & is, mfxExtSpsHeader & sps) { // set defaults for optional fields Zero(sps.vui); sps.chromaFormatIdc = 1; sps.vui.videoFormat = 5; sps.vui.colourPrimaries = 2; sps.vui.transferCharacteristics = 2; sps.vui.matrixCoefficients = 2; sps.vui.flags.fixedFrameRate = 1; InputBitstreamCheckedRange reader(is); mfxU32 unused = reader.GetBit(); // forbiddenZeroBit std::ignore = unused; sps.nalRefIdc = reader.GetBits(2); if (sps.nalRefIdc == 0) throw InvalidBitstream(); sps.nalUnitType = reader.GetBits(5); if (sps.nalUnitType != 7) throw InvalidBitstream(); sps.profileIdc = reader.GetBits(8); sps.constraints.set0 = reader.GetBit(); sps.constraints.set1 = reader.GetBit(); sps.constraints.set2 = reader.GetBit(); sps.constraints.set3 = reader.GetBit(); sps.constraints.set4 = reader.GetBit(); sps.constraints.set5 = reader.GetBit(); sps.constraints.set6 = reader.GetBit(); sps.constraints.set7 = reader.GetBit(); sps.levelIdc = reader.GetBits(8); sps.seqParameterSetId = reader.GetUe(); if (sps.profileIdc == 100 || sps.profileIdc == 110 || sps.profileIdc == 122 || sps.profileIdc == 244 || sps.profileIdc == 44 || sps.profileIdc == 83 || sps.profileIdc == 86 || sps.profileIdc == 118 || sps.profileIdc == 128) { sps.chromaFormatIdc = reader.GetUe(); if (sps.chromaFormatIdc == 3) unused = reader.GetBit(); // separateColourPlaneFlag sps.bitDepthLumaMinus8 = reader.GetUe(); sps.bitDepthChromaMinus8 = reader.GetUe(); sps.qpprimeYZeroTransformBypassFlag = reader.GetBit(); sps.seqScalingMatrixPresentFlag = reader.GetBit(); if (sps.seqScalingMatrixPresentFlag) { for (mfxU32 i = 0; i < ((sps.chromaFormatIdc != 3) ? 8u : 12u); i++) { sps.seqScalingListPresentFlag[i] = reader.GetBit(); if (sps.seqScalingListPresentFlag[i]) { (i < 6) ? ReadScalingList(reader, sps.scalingList4x4[i], 16) : ReadScalingList(reader, sps.scalingList8x8[i - 6], 64); } } } } sps.log2MaxFrameNumMinus4 = reader.GetUe(); sps.picOrderCntType = reader.GetUe(); if (sps.picOrderCntType == 0) { sps.log2MaxPicOrderCntLsbMinus4 = reader.GetUe(); } else if (sps.picOrderCntType == 1) { sps.deltaPicOrderAlwaysZeroFlag = reader.GetBit(); sps.offsetForNonRefPic = reader.GetSe(); sps.offsetForTopToBottomField = reader.GetSe(); sps.numRefFramesInPicOrderCntCycle = reader.GetUe(); for (mfxU32 i = 0; i < sps.numRefFramesInPicOrderCntCycle; i++) sps.offsetForRefFrame[i] = reader.GetSe(); } sps.maxNumRefFrames = reader.GetUe(); sps.gapsInFrameNumValueAllowedFlag = reader.GetBit(); sps.picWidthInMbsMinus1 = reader.GetUe(); sps.picHeightInMapUnitsMinus1 = reader.GetUe(); sps.frameMbsOnlyFlag = reader.GetBit(); if (!sps.frameMbsOnlyFlag) sps.mbAdaptiveFrameFieldFlag = reader.GetBit(); sps.direct8x8InferenceFlag = reader.GetBit(); sps.frameCroppingFlag = reader.GetBit(); if (sps.frameCroppingFlag) { sps.frameCropLeftOffset = reader.GetUe(); sps.frameCropRightOffset = reader.GetUe(); sps.frameCropTopOffset = reader.GetUe(); sps.frameCropBottomOffset = reader.GetUe(); } sps.vuiParametersPresentFlag = reader.GetBit(); if (sps.vuiParametersPresentFlag) { sps.vui.flags.aspectRatioInfoPresent = reader.GetBit(); if (sps.vui.flags.aspectRatioInfoPresent) { sps.vui.aspectRatioIdc = reader.GetBits(8); if (sps.vui.aspectRatioIdc == 255) { sps.vui.sarWidth = reader.GetBits(16); sps.vui.sarHeight = reader.GetBits(16); } } sps.vui.flags.overscanInfoPresent = reader.GetBit(); if (sps.vui.flags.overscanInfoPresent) sps.vui.flags.overscanAppropriate = reader.GetBit(); sps.vui.flags.videoSignalTypePresent = reader.GetBit(); if (sps.vui.flags.videoSignalTypePresent) { sps.vui.videoFormat = reader.GetBits(3); sps.vui.flags.videoFullRange = reader.GetBit(); sps.vui.flags.colourDescriptionPresent = reader.GetBit(); if (sps.vui.flags.colourDescriptionPresent) { sps.vui.colourPrimaries = reader.GetBits(8); sps.vui.transferCharacteristics = reader.GetBits(8); sps.vui.matrixCoefficients = reader.GetBits(8); } } sps.vui.flags.chromaLocInfoPresent = reader.GetBit(); if (sps.vui.flags.chromaLocInfoPresent) { sps.vui.chromaSampleLocTypeTopField = reader.GetUe(); sps.vui.chromaSampleLocTypeBottomField = reader.GetUe(); } sps.vui.flags.timingInfoPresent = reader.GetBit(); if (sps.vui.flags.timingInfoPresent) { sps.vui.numUnitsInTick = reader.GetBits(32); sps.vui.timeScale = reader.GetBits(32); sps.vui.flags.fixedFrameRate = reader.GetBit(); } sps.vui.flags.nalHrdParametersPresent = reader.GetBit(); if (sps.vui.flags.nalHrdParametersPresent) ReadHrdParameters(reader, sps.vui.nalHrdParameters); sps.vui.flags.vclHrdParametersPresent = reader.GetBit(); if (sps.vui.flags.vclHrdParametersPresent) ReadHrdParameters(reader, sps.vui.vclHrdParameters); if (sps.vui.flags.nalHrdParametersPresent || sps.vui.flags.vclHrdParametersPresent) sps.vui.flags.lowDelayHrd = reader.GetBit(); sps.vui.flags.picStructPresent = reader.GetBit(); sps.vui.flags.bitstreamRestriction = reader.GetBit(); if (sps.vui.flags.bitstreamRestriction) { sps.vui.flags.motionVectorsOverPicBoundaries = reader.GetBit(); sps.vui.maxBytesPerPicDenom = reader.GetUe(); sps.vui.maxBitsPerMbDenom = reader.GetUe(); sps.vui.log2MaxMvLengthHorizontal = reader.GetUe(); sps.vui.log2MaxMvLengthVertical = reader.GetUe(); sps.vui.numReorderFrames = reader.GetUe(); sps.vui.maxDecFrameBuffering = reader.GetUe(); } } } mfxU8 MfxHwH264Encode::ReadSpsIdOfPpsHeader( InputBitstream is) { InputBitstreamCheckedRange reader(is); /*mfxU8 ppsId = */reader.GetUe(); mfxU8 spsId = reader.GetUe(); if (spsId > 31) throw InvalidBitstream(); return spsId; } void MfxHwH264Encode::ReadPpsHeader( InputBitstream & is, mfxExtSpsHeader const & sps, mfxExtPpsHeader & pps) { InputBitstreamCheckedRange reader(is); mfxU32 unused = reader.GetBit(); // forbiddenZeroBit std::ignore = unused; pps.nalRefIdc = reader.GetBits(2); if (pps.nalRefIdc == 0) throw InvalidBitstream(); mfxU8 nalUnitType = reader.GetBits(5); if (nalUnitType != 8) throw InvalidBitstream(); pps.picParameterSetId = reader.GetUe(); pps.seqParameterSetId = reader.GetUe(); if (pps.seqParameterSetId != sps.seqParameterSetId) throw InvalidBitstream(); pps.entropyCodingModeFlag = reader.GetBit(); pps.bottomFieldPicOrderInframePresentFlag = reader.GetBit();; pps.numSliceGroupsMinus1 = reader.GetUe(); if (pps.numSliceGroupsMinus1 > 0) { if (pps.numSliceGroupsMinus1 > 7) throw InvalidBitstream(); pps.sliceGroupMapType = reader.GetUe(); if (pps.sliceGroupMapType == 0) { for (mfxU32 i = 0; i <= pps.numSliceGroupsMinus1; i++) pps.sliceGroupInfo.t0.runLengthMinus1[i] = reader.GetUe(); } else if (pps.sliceGroupMapType == 2) { for (mfxU32 i = 0; i < pps.numSliceGroupsMinus1; i++) { pps.sliceGroupInfo.t2.topLeft[i] = reader.GetUe(); pps.sliceGroupInfo.t2.bottomRight[i] = reader.GetUe(); } } else if ( pps.sliceGroupMapType == 3 || pps.sliceGroupMapType == 4 || pps.sliceGroupMapType == 5) { pps.sliceGroupInfo.t3.sliceGroupChangeDirectionFlag = reader.GetBit(); pps.sliceGroupInfo.t3.sliceGroupChangeRate = reader.GetUe(); } else if (pps.sliceGroupMapType == 6) { pps.sliceGroupInfo.t6.picSizeInMapUnitsMinus1 = reader.GetUe(); for (mfxU32 i = 0; i <= pps.sliceGroupInfo.t6.picSizeInMapUnitsMinus1; i++) unused = reader.GetBits(CeilLog2(pps.numSliceGroupsMinus1 + 1)); // sliceGroupId } } pps.numRefIdxL0DefaultActiveMinus1 = reader.GetUe(); pps.numRefIdxL1DefaultActiveMinus1 = reader.GetUe(); pps.weightedPredFlag = reader.GetBit(); pps.weightedBipredIdc = reader.GetBits(2); pps.picInitQpMinus26 = reader.GetSe(); pps.picInitQsMinus26 = reader.GetSe(); pps.chromaQpIndexOffset = reader.GetSe();; pps.deblockingFilterControlPresentFlag = reader.GetBit(); pps.constrainedIntraPredFlag = reader.GetBit(); pps.redundantPicCntPresentFlag = reader.GetBit(); pps.moreRbspData = MoreRbspData(is); if (pps.moreRbspData) { pps.transform8x8ModeFlag = reader.GetBit(); pps.picScalingMatrixPresentFlag = reader.GetBit(); if (pps.picScalingMatrixPresentFlag) { for (mfxU32 i = 0; i < 6 + ((sps.chromaFormatIdc != 3) ? 2u : 6u) * pps.transform8x8ModeFlag; i++) { mfxU32 picScalingListPresentFlag = reader.GetBit(); if (picScalingListPresentFlag) { (i < 6) ? ReadScalingList(reader, pps.scalingList4x4[i], 16) : ReadScalingList(reader, pps.scalingList8x8[i - 6], 64); } } } pps.secondChromaQpIndexOffset = reader.GetSe(); } } namespace { void WriteSpsData( OutputBitstream & writer, mfxExtSpsHeader const & sps) { writer.PutBits(sps.profileIdc, 8); writer.PutBit(sps.constraints.set0); writer.PutBit(sps.constraints.set1); writer.PutBit(sps.constraints.set2); writer.PutBit(sps.constraints.set3); writer.PutBit(sps.constraints.set4); writer.PutBit(sps.constraints.set5); writer.PutBit(sps.constraints.set6); writer.PutBit(sps.constraints.set7); writer.PutBits(sps.levelIdc, 8); writer.PutUe(sps.seqParameterSetId); if (sps.profileIdc == 100 || sps.profileIdc == 110 || sps.profileIdc == 122 || sps.profileIdc == 244 || sps.profileIdc == 44 || sps.profileIdc == 83 || sps.profileIdc == 86 || sps.profileIdc == 118 || sps.profileIdc == 128) { writer.PutUe(sps.chromaFormatIdc); if (sps.chromaFormatIdc == 3) writer.PutBit(sps.separateColourPlaneFlag); writer.PutUe(sps.bitDepthLumaMinus8); writer.PutUe(sps.bitDepthChromaMinus8); writer.PutBit(sps.qpprimeYZeroTransformBypassFlag); writer.PutBit(sps.seqScalingMatrixPresentFlag); if (sps.seqScalingMatrixPresentFlag) { #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX for (mfxU8 i = 0; i < ((sps.levelIdc != 3) ? 8 : 12); ++i) { //Put scaling list present flag writer.PutBit(sps.seqScalingListPresentFlag[i]); if (sps.seqScalingListPresentFlag[i]) { if (i < 6) WriteScalingList(writer, &sps.scalingList4x4[i][0], 16); else WriteScalingList(writer, &sps.scalingList8x8[i - 6][0], 64); } } #else assert("seq_scaling_matrix is unsupported"); #endif } } writer.PutUe(sps.log2MaxFrameNumMinus4); writer.PutUe(sps.picOrderCntType); if (sps.picOrderCntType == 0) { writer.PutUe(sps.log2MaxPicOrderCntLsbMinus4); } else if (sps.picOrderCntType == 1) { writer.PutBit(sps.deltaPicOrderAlwaysZeroFlag); writer.PutSe(sps.offsetForNonRefPic); writer.PutSe(sps.offsetForTopToBottomField); writer.PutUe(sps.numRefFramesInPicOrderCntCycle); for (mfxU32 i = 0; i < sps.numRefFramesInPicOrderCntCycle; i++) writer.PutSe(sps.offsetForRefFrame[i]); } writer.PutUe(sps.maxNumRefFrames); writer.PutBit(sps.gapsInFrameNumValueAllowedFlag); writer.PutUe(sps.picWidthInMbsMinus1); writer.PutUe(sps.picHeightInMapUnitsMinus1); writer.PutBit(sps.frameMbsOnlyFlag); if (!sps.frameMbsOnlyFlag) writer.PutBit(sps.mbAdaptiveFrameFieldFlag); writer.PutBit(sps.direct8x8InferenceFlag); writer.PutBit(sps.frameCroppingFlag); if (sps.frameCroppingFlag) { writer.PutUe(sps.frameCropLeftOffset); writer.PutUe(sps.frameCropRightOffset); writer.PutUe(sps.frameCropTopOffset); writer.PutUe(sps.frameCropBottomOffset); } writer.PutBit(sps.vuiParametersPresentFlag); if (sps.vuiParametersPresentFlag) { writer.PutBit(sps.vui.flags.aspectRatioInfoPresent); if (sps.vui.flags.aspectRatioInfoPresent) { writer.PutBits(sps.vui.aspectRatioIdc, 8); if (sps.vui.aspectRatioIdc == 255) { writer.PutBits(sps.vui.sarWidth, 16); writer.PutBits(sps.vui.sarHeight, 16); } } writer.PutBit(sps.vui.flags.overscanInfoPresent); if (sps.vui.flags.overscanInfoPresent) writer.PutBit(sps.vui.flags.overscanAppropriate); writer.PutBit(sps.vui.flags.videoSignalTypePresent); if (sps.vui.flags.videoSignalTypePresent) { writer.PutBits(sps.vui.videoFormat, 3); writer.PutBit(sps.vui.flags.videoFullRange); writer.PutBit(sps.vui.flags.colourDescriptionPresent); if (sps.vui.flags.colourDescriptionPresent) { writer.PutBits(sps.vui.colourPrimaries, 8); writer.PutBits(sps.vui.transferCharacteristics, 8); writer.PutBits(sps.vui.matrixCoefficients, 8); } } writer.PutBit(sps.vui.flags.chromaLocInfoPresent); if (sps.vui.flags.chromaLocInfoPresent) { writer.PutUe(sps.vui.chromaSampleLocTypeTopField); writer.PutUe(sps.vui.chromaSampleLocTypeBottomField); } writer.PutBit(sps.vui.flags.timingInfoPresent); if (sps.vui.flags.timingInfoPresent) { writer.PutBits(sps.vui.numUnitsInTick, 32); writer.PutBits(sps.vui.timeScale, 32); writer.PutBit(sps.vui.flags.fixedFrameRate); } writer.PutBit(sps.vui.flags.nalHrdParametersPresent); if (sps.vui.flags.nalHrdParametersPresent) WriteHrdParameters(writer, sps.vui.nalHrdParameters); writer.PutBit(sps.vui.flags.vclHrdParametersPresent); if (sps.vui.flags.vclHrdParametersPresent) WriteHrdParameters(writer, sps.vui.vclHrdParameters); if (sps.vui.flags.nalHrdParametersPresent || sps.vui.flags.vclHrdParametersPresent) writer.PutBit(sps.vui.flags.lowDelayHrd); writer.PutBit(sps.vui.flags.picStructPresent); writer.PutBit(sps.vui.flags.bitstreamRestriction); if (sps.vui.flags.bitstreamRestriction) { writer.PutBit(sps.vui.flags.motionVectorsOverPicBoundaries); writer.PutUe(sps.vui.maxBytesPerPicDenom); writer.PutUe(sps.vui.maxBitsPerMbDenom); writer.PutUe(sps.vui.log2MaxMvLengthHorizontal); writer.PutUe(sps.vui.log2MaxMvLengthVertical); writer.PutUe(sps.vui.numReorderFrames); writer.PutUe(sps.vui.maxDecFrameBuffering); } } } void WriteSpsMvcExtension( OutputBitstream & writer, mfxExtMVCSeqDesc const & extMvc) { writer.PutUe(extMvc.NumView - 1); // num_views_minus1 for (mfxU32 i = 0; i < extMvc.NumView; i++) writer.PutUe(extMvc.View[i].ViewId); // view_id[i] for (mfxU32 i = 1; i < extMvc.NumView; i++) { writer.PutUe(extMvc.View[i].NumAnchorRefsL0); // num_anchor_refs_l0[i] for (mfxU32 j = 0; j < extMvc.View[i].NumAnchorRefsL0; j++) writer.PutUe(extMvc.View[i].AnchorRefL0[j]); // anchor_ref_l0[i][j] writer.PutUe(extMvc.View[i].NumAnchorRefsL1); // num_anchor_refs_l1[i] for (mfxU32 j = 0; j < extMvc.View[i].NumAnchorRefsL1; j++) writer.PutUe(extMvc.View[i].AnchorRefL1[j]); // anchor_ref_l1[i][j] } for (mfxU32 i = 1; i < extMvc.NumView; i++) { writer.PutUe(extMvc.View[i].NumNonAnchorRefsL0); // num_non_anchor_refs_l0[i] for (mfxU32 j = 0; j < extMvc.View[i].NumNonAnchorRefsL0; j++) writer.PutUe(extMvc.View[i].NonAnchorRefL0[j]); // non_anchor_ref_l0[i][j] writer.PutUe(extMvc.View[i].NumNonAnchorRefsL1); // num_non_anchor_refs_l1[i] for (mfxU32 j = 0; j < extMvc.View[i].NumNonAnchorRefsL1; j++) writer.PutUe(extMvc.View[i].NonAnchorRefL1[j]); // non_anchor_ref_l1[i][j] } writer.PutUe(extMvc.NumOP - 1); // num_level_values_signalled_minus1 for (mfxU32 i = 0; i < extMvc.NumOP; i++) { writer.PutBits(extMvc.OP[i].LevelIdc, 8); // level_idc[i] writer.PutUe(0); // num_applicable_ops_minus1[i] for (mfxU32 j = 0; j < 1; j++) { writer.PutBits(extMvc.OP[i].TemporalId, 3); // applicable_op_temporal_id[i][j] writer.PutUe(extMvc.OP[i].NumTargetViews - 1); // applicable_op_num_target_views_minus1[i][j] for (mfxU32 k = 0; k < extMvc.OP[i].NumTargetViews; k++) writer.PutUe(extMvc.OP[i].TargetViewId[k]); // applicable_op_target_view_id[i][j][k] writer.PutUe(extMvc.OP[i].NumViews - 1); // applicable_op_num_views_minus1[i][j] } } } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE void WriteSpsSvcExtension( OutputBitstream & writer, mfxExtSpsHeader const & sps, mfxExtSpsSvcHeader const & extSvc) { mfxU32 chromaArrayType = sps.separateColourPlaneFlag ? 0 : sps.chromaFormatIdc; writer.PutBit(extSvc.interLayerDeblockingFilterControlPresentFlag); // inter_layer_deblocking_filter_control_present_flag writer.PutBits(extSvc.extendedSpatialScalabilityIdc, 2); // extended_spatial_scalability_idc if (chromaArrayType == 1 || chromaArrayType == 2) writer.PutBit(extSvc.chromaPhaseXPlus1Flag); // chroma_phase_x_plus1_flag if (chromaArrayType == 1) writer.PutBits(extSvc.chromaPhaseYPlus1, 2); // chroma_phase_y_plus1 if (extSvc.extendedSpatialScalabilityIdc == 1) { if (chromaArrayType > 0) { writer.PutBit(extSvc.seqRefLayerChromaPhaseXPlus1Flag); // seq_ref_layer_chroma_phase_x_plus1_flag writer.PutBits(extSvc.seqRefLayerChromaPhaseYPlus1, 2); // seq_ref_layer_chroma_phase_y_plus1 } writer.PutSe(extSvc.seqScaledRefLayerLeftOffset); // seq_scaled_ref_layer_left_offset writer.PutSe(extSvc.seqScaledRefLayerTopOffset); // seq_scaled_ref_layer_top_offset writer.PutSe(extSvc.seqScaledRefLayerRightOffset); // seq_scaled_ref_layer_right_offset writer.PutSe(extSvc.seqScaledRefLayerBottomOffset); // seq_scaled_ref_layer_bottom_offset } writer.PutBit(extSvc.seqTcoeffLevelPredictionFlag); // seq_tcoeff_level_prediction_flag if (extSvc.seqTcoeffLevelPredictionFlag) writer.PutBit(extSvc.adaptiveTcoeffLevelPredictionFlag); // adaptive_tcoeff_level_prediction_flag writer.PutBit(extSvc.sliceHeaderRestrictionFlag); // slice_header_restriction_flag } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE } mfxU32 MfxHwH264Encode::WriteSpsHeader( OutputBitstream & writer, mfxExtSpsHeader const & sps) { mfxU32 initNumBits = writer.GetNumBits(); const mfxU8 header[4] = { 0, 0, 0, 1 }; writer.PutRawBytes(header, header + sizeof header / sizeof header[0]); writer.PutBit(0); // forbiddenZeroBit writer.PutBits(sps.nalRefIdc, 2); writer.PutBits(NALU_SPS, 5); // nalUnitType WriteSpsData(writer, sps); writer.PutTrailingBits(); return writer.GetNumBits() - initNumBits; } mfxU32 MfxHwH264Encode::WriteSpsHeader( OutputBitstream & writer, mfxExtSpsHeader const & sps, mfxExtBuffer const & spsExt) { mfxU32 initNumBits = writer.GetNumBits(); const mfxU8 header[4] = { 0, 0, 0, 1 }; writer.PutRawBytes(header, header + sizeof header / sizeof header[0]); writer.PutBit(0); // forbidden_zero_bit writer.PutBits(sps.nalRefIdc, 2); // nal_ref_idc writer.PutBits(sps.nalUnitType, 5); // nal_unit_type WriteSpsData(writer, sps); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(sps.profileIdc)) { assert(spsExt.BufferId == MFX_EXTBUFF_SPS_SVC_HEADER); mfxExtSpsSvcHeader const & extSvc = (mfxExtSpsSvcHeader const &)spsExt; WriteSpsSvcExtension(writer, sps, extSvc); writer.PutBit(0); // svc_vui_parameters_present_flag } else #endif if (IsMvcProfile(sps.profileIdc)) { assert(spsExt.BufferId == MFX_EXTBUFF_MVC_SEQ_DESC); mfxExtMVCSeqDesc const & extMvc = (mfxExtMVCSeqDesc const &)spsExt; writer.PutBit(1); // bit_equal_to_one WriteSpsMvcExtension(writer, extMvc); writer.PutBit(0); // mvc_vui_parameters_present_flag } writer.PutBit(0); // additional_extension2_flag writer.PutTrailingBits(); return writer.GetNumBits() - initNumBits; } mfxU32 MfxHwH264Encode::WritePpsHeader( OutputBitstream & writer, mfxExtPpsHeader const & pps) { mfxU32 initNumBits = writer.GetNumBits(); const mfxU8 header[4] = { 0, 0, 0, 1 }; writer.PutRawBytes(header, header + sizeof header / sizeof header[0]); writer.PutBit(0); // forbiddenZeroBit writer.PutBits(pps.nalRefIdc, 2); writer.PutBits(NALU_PPS, 5); // nalUnitType writer.PutUe(pps.picParameterSetId); writer.PutUe(pps.seqParameterSetId); writer.PutBit(pps.entropyCodingModeFlag); writer.PutBit(pps.bottomFieldPicOrderInframePresentFlag); writer.PutUe(pps.numSliceGroupsMinus1); if (pps.numSliceGroupsMinus1 > 0) { writer.PutUe(pps.sliceGroupMapType); if (pps.sliceGroupMapType == 0) { for (mfxU32 i = 0; i <= pps.numSliceGroupsMinus1; i++) writer.PutUe(pps.sliceGroupInfo.t0.runLengthMinus1[i]); } else if (pps.sliceGroupMapType == 2) { for (mfxU32 i = 0; i < pps.numSliceGroupsMinus1; i++) { writer.PutUe(pps.sliceGroupInfo.t2.topLeft[i]); writer.PutUe(pps.sliceGroupInfo.t2.bottomRight[i]); } } else if ( pps.sliceGroupMapType == 3 || pps.sliceGroupMapType == 4 || pps.sliceGroupMapType == 5) { writer.PutBit(pps.sliceGroupInfo.t3.sliceGroupChangeDirectionFlag); writer.PutUe(pps.sliceGroupInfo.t3.sliceGroupChangeRate); } else if (pps.sliceGroupMapType == 6) { writer.PutUe(pps.sliceGroupInfo.t6.picSizeInMapUnitsMinus1); assert("unsupprted slice_group_map_type = 6"); for (mfxU32 i = 0; i <= pps.sliceGroupInfo.t6.picSizeInMapUnitsMinus1; i++) writer.PutBits(1, CeilLog2(pps.numSliceGroupsMinus1 + 1)); } } writer.PutUe(pps.numRefIdxL0DefaultActiveMinus1); writer.PutUe(pps.numRefIdxL1DefaultActiveMinus1); writer.PutBit(pps.weightedPredFlag); writer.PutBits(pps.weightedBipredIdc, 2); writer.PutSe(pps.picInitQpMinus26); writer.PutSe(pps.picInitQsMinus26); writer.PutSe(pps.chromaQpIndexOffset); writer.PutBit(pps.deblockingFilterControlPresentFlag); writer.PutBit(pps.constrainedIntraPredFlag); writer.PutBit(pps.redundantPicCntPresentFlag); if (pps.moreRbspData) { writer.PutBit(pps.transform8x8ModeFlag); writer.PutBit(pps.picScalingMatrixPresentFlag); if (pps.picScalingMatrixPresentFlag) { //for(int i=0; i < 6 + ((sps.chroma_format_idc != 3) ? 2:6)*pps.transform8x8ModeFlag; i++){ for(int i=0; i < 6+2*(!!pps.transform8x8ModeFlag); i++){ //Put scaling list present flag writer.PutBit(pps.picScalingListPresentFlag[i]); if( pps.picScalingListPresentFlag[i] ){ if( i<6 ) WriteScalingList(writer, &pps.scalingList4x4[i][0], 16); else WriteScalingList(writer, &pps.scalingList8x8[i-6][0], 64); } } } writer.PutSe(pps.secondChromaQpIndexOffset); } writer.PutTrailingBits(); return writer.GetNumBits() - initNumBits; } void MfxHwH264Encode::WriteScalingList( OutputBitstream & writer, const mfxU8* scalingList, mfxI32 sizeOfScalingList) { int16_t lastScale, nextScale; int32_t j; int16_t delta_scale; const int32_t* scan; lastScale=nextScale=8; if( sizeOfScalingList == 16 ) scan = UMC_H264_ENCODER::dec_single_scan[0]; else scan = UMC_H264_ENCODER::dec_single_scan_8x8[0]; for( j = 0; j 0); // ref_pic_list_modification_flag_l0 if (refListMod.Size() > 0) { for (mfxU32 i = 0; i < refListMod.Size(); i++) { writer.PutUe(refListMod[i].m_idc); // modification_of_pic_nums_idc writer.PutUe(refListMod[i].m_diff); // abs_diff_pic_num_minus1 or // long_term_pic_num or // abs_diff_view_idx_minus1 } writer.PutUe(RPLM_END); } } void MfxHwH264Encode::WriteDecRefPicMarking( OutputBitstream & writer, DecRefPicMarkingInfo const & marking, mfxU32 idrPicFlag) { if (idrPicFlag) { writer.PutBit(marking.no_output_of_prior_pics_flag); // no_output_of_prior_pics_flag writer.PutBit(marking.long_term_reference_flag); // long_term_reference_flag } else { writer.PutBit(marking.mmco.Size() > 0); // adaptive_ref_pic_marking_mode_flag if (marking.mmco.Size()) { for (mfxU32 i = 0; i < marking.mmco.Size(); i++) { writer.PutUe(marking.mmco[i]); // memory_management_control_operation writer.PutUe(marking.value[2 * i]); // difference_of_pic_nums_minus1 or // long_term_pic_num or // long_term_frame_idx or // max_long_term_frame_idx_plus1 if (marking.mmco[i] == MMCO_ST_TO_LT) writer.PutUe(marking.value[2 * i + 1]); // long_term_frame_idx } writer.PutUe(MMCO_END); } } } mfxU32 MfxHwH264Encode::WriteAud( OutputBitstream & writer, mfxU32 frameType) { mfxU32 initNumBits = writer.GetNumBits(); mfxU8 const header[4] = { 0, 0, 0, 1 }; writer.PutRawBytes(header, header + sizeof header / sizeof header[0]); writer.PutBit(0); writer.PutBits(0, 2); writer.PutBits(NALU_AUD, 5); writer.PutBits(ConvertFrameTypeMfx2Ddi(frameType) - 1, 3); writer.PutTrailingBits(); return writer.GetNumBits() - initNumBits; } bool MfxHwH264Encode::IsAvcProfile(mfxU32 profile) { return IsAvcBaseProfile(profile) || profile == MFX_PROFILE_AVC_MAIN || profile == MFX_PROFILE_AVC_EXTENDED || IsAvcHighProfile(profile); } bool MfxHwH264Encode::IsAvcBaseProfile(mfxU32 profile) { return profile == MFX_PROFILE_AVC_BASELINE || profile == MFX_PROFILE_AVC_CONSTRAINED_BASELINE; } bool MfxHwH264Encode::IsAvcHighProfile(mfxU32 profile) { return profile == MFX_PROFILE_AVC_HIGH || profile == MFX_PROFILE_AVC_CONSTRAINED_HIGH || profile == MFX_PROFILE_AVC_PROGRESSIVE_HIGH; } bool MfxHwH264Encode::IsMvcProfile(mfxU32 profile) { return profile == MFX_PROFILE_AVC_STEREO_HIGH || profile == MFX_PROFILE_AVC_MULTIVIEW_HIGH; } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE bool MfxHwH264Encode::IsSvcProfile(mfxU32 profile) { return profile == MFX_PROFILE_AVC_SCALABLE_BASELINE || profile == MFX_PROFILE_AVC_SCALABLE_HIGH; } #endif bool MfxHwH264Encode::operator ==( mfxExtSpsHeader const & lhs, mfxExtSpsHeader const & rhs) { // part from the beginning of sps to nalHrdParameters mfxU8 const * lhsBegin1 = (mfxU8 const *)&lhs; mfxU8 const * rhsBegin1 = (mfxU8 const *)&rhs; mfxU8 const * lhsEnd1 = (mfxU8 const *)&lhs.vui.nalHrdParameters; // part from the end of vclHrdParameters to the end of sps mfxU8 const * lhsBegin2 = (mfxU8 const *)&lhs.vui.maxBytesPerPicDenom; mfxU8 const * rhsBegin2 = (mfxU8 const *)&rhs.vui.maxBytesPerPicDenom; mfxU8 const * lhsEnd2 = (mfxU8 const *)&lhs + sizeof(lhs); if (memcmp(lhsBegin1, rhsBegin1, lhsEnd1 - lhsBegin1) != 0 || memcmp(lhsBegin2, rhsBegin2, lhsEnd2 - lhsBegin2) != 0) return false; if (lhs.vui.flags.nalHrdParametersPresent) if (!Equal(lhs.vui.nalHrdParameters, rhs.vui.nalHrdParameters)) return false; if (lhs.vui.flags.vclHrdParametersPresent) if (!Equal(lhs.vui.vclHrdParameters, rhs.vui.vclHrdParameters)) return false; return true; } mfxU8 * MfxHwH264Encode::PackPrefixNalUnitSvc( mfxU8 * begin, mfxU8 * end, bool emulationControl, DdiTask const & task, mfxU32 fieldId, mfxU32 nalUnitType) { OutputBitstream obs(begin, end, false); mfxU32 idrFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_IDR) ? 1 : 0; mfxU32 nalRefIdc = task.m_nalRefIdc[fieldId]; mfxU32 useRefBasePicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_KEYPIC) ? 1 : 0; obs.PutBits(1, 24); // 001 obs.PutBits(0, 1); // forbidden_zero_flag obs.PutBits(nalRefIdc, 2); // nal_ref_idc obs.PutBits(nalUnitType, 5); // nal_unit_type obs.PutBits(1, 1); // svc_extension_flag obs.PutBits(idrFlag, 1); // idr_flag obs.PutBits(task.m_pid, 6); // priority_id obs.PutBits(1, 1); // no_inter_layer_pred_flag obs.PutBits(task.m_did, 3); // dependency_id obs.PutBits(task.m_qid, 4); // quality_id obs.PutBits(task.m_tid, 3); // temporal_id obs.PutBits(useRefBasePicFlag, 1); // use_ref_base_pic_flag obs.PutBits(1, 1); // discardable_flag obs.PutBits(1, 1); // output_flag obs.PutBits(0x3, 2); // reserved_three_2bits OutputBitstream obs1(begin + obs.GetNumBits() / 8, end, emulationControl); if (nalRefIdc && nalUnitType == 14) { mfxU32 additional_prefix_nal_unit_extension_flag = 0; obs1.PutBit(task.m_storeRefBasePicFlag); if ((useRefBasePicFlag || task.m_storeRefBasePicFlag) && !idrFlag) WriteDecRefPicMarking(obs1, task.m_decRefPicMrk[fieldId], idrFlag); obs1.PutBit(additional_prefix_nal_unit_extension_flag); assert(additional_prefix_nal_unit_extension_flag == 0); obs1.PutTrailingBits(); } return begin + obs.GetNumBits() / 8 + obs1.GetNumBits() / 8; } namespace { ENCODE_PACKEDHEADER_DATA MakePackedByteBuffer(mfxU8 * data, mfxU32 size, mfxU32 skipEmulCount) { ENCODE_PACKEDHEADER_DATA desc = {}; desc.pData = data; desc.BufferSize = size; desc.DataLength = size; desc.SkipEmulationByteCount = skipEmulCount; return desc; } void PrepareSpsPpsHeaders( MfxVideoParam const & par, std::vector & sps, #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE std::vector & subset, #endif std::vector & pps) { mfxExtSpsHeader const & extSps = GetExtBufferRef(par); mfxExtPpsHeader const & extPps = GetExtBufferRef(par); mfxU16 numViews = extSps.profileIdc == MFX_PROFILE_AVC_STEREO_HIGH ? 2 : 1; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxU32 numDep = par.calcParam.numDependencyLayer; mfxU32 firstDid = par.calcParam.did[0]; mfxU32 lastDid = par.calcParam.did[numDep - 1]; mfxExtSVCSeqDesc const * extSvc = GetExtBuffer(par); mfxU32 numQualityAtLastDep = extSvc->DependencyLayer[lastDid].QualityNum; #endif mfxU16 heightMul = 2 - extSps.frameMbsOnlyFlag; // prepare sps for base layer sps[0] = extSps; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(par.mfx.CodecProfile)) // force SPS id to 0 for SVC profile only. For other profiles should be able to encode custom SPS id sps[0].seqParameterSetId = 0; sps[0].picWidthInMbsMinus1 = mfx::CeilDiv(extSvc->DependencyLayer[firstDid].Width, 16) - 1; sps[0].picHeightInMapUnitsMinus1 = mfx::CeilDiv(extSvc->DependencyLayer[firstDid].Height, 16) / heightMul - 1; #else sps[0].picWidthInMbsMinus1 = mfx::CeilDiv(par.mfx.FrameInfo.Width, 16) - 1; sps[0].picHeightInMapUnitsMinus1 = mfx::CeilDiv(par.mfx.FrameInfo.Height, 16) / heightMul - 1; #endif if (numViews > 1) { // MVC requires SPS and number of Subset SPS. // HeaderPacker prepares 2 SPS NAL units: // one for base view (sps_id = 0, profile_idc = 100) // and another for all other views (sps_id = 1, profile_idc = 128). // Second SPS will be re-packed to SubsetSPS after return from driver. for (mfxU16 view = 0; view < numViews; view++) { sps[view] = extSps; pps[view] = extPps; if (numViews > 1 && view == 0) // MVC base view sps[view].profileIdc = MFX_PROFILE_AVC_HIGH; sps[view].seqParameterSetId = mfxU8(!!view) & 0x1f; pps[view].picParameterSetId = mfxU8(!!view); pps[view].seqParameterSetId = sps[view].seqParameterSetId; } return; } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE // prepare sps for enhanced spatial layers for (mfxU32 i = 0, spsidx = 1; i < numDep; i++, spsidx++) { mfxU32 did = par.calcParam.did[i]; if (i == 0 && extSvc->DependencyLayer[did].QualityNum == 1) continue; // don't need a subset sps for did = 0 sps[spsidx] = extSps; sps[spsidx].nalUnitType = 15; sps[spsidx].profileIdc = mfxU8(par.mfx.CodecProfile & MASK_PROFILE_IDC); sps[spsidx].seqParameterSetId = mfxU8(i); sps[spsidx].picWidthInMbsMinus1 = mfx::CeilDiv(extSvc->DependencyLayer[did].Width, 16) - 1; sps[spsidx].picHeightInMapUnitsMinus1 = mfx::CeilDiv(extSvc->DependencyLayer[did].Height, 16) / heightMul - 1; InitExtBufHeader(subset[spsidx - 1]); subset[spsidx - 1].interLayerDeblockingFilterControlPresentFlag = 1; subset[spsidx - 1].extendedSpatialScalabilityIdc = 1; subset[spsidx - 1].chromaPhaseXPlus1Flag = 0; subset[spsidx - 1].chromaPhaseYPlus1 = 0; subset[spsidx - 1].seqRefLayerChromaPhaseXPlus1Flag = 0; subset[spsidx - 1].seqRefLayerChromaPhaseYPlus1 = 0; subset[spsidx - 1].seqScaledRefLayerLeftOffset = extSvc->DependencyLayer[did].ScaledRefLayerOffsets[0]; subset[spsidx - 1].seqScaledRefLayerTopOffset = extSvc->DependencyLayer[did].ScaledRefLayerOffsets[1]; subset[spsidx - 1].seqScaledRefLayerRightOffset = extSvc->DependencyLayer[did].ScaledRefLayerOffsets[2]; subset[spsidx - 1].seqScaledRefLayerBottomOffset = extSvc->DependencyLayer[did].ScaledRefLayerOffsets[3]; subset[spsidx - 1].sliceHeaderRestrictionFlag = 0; subset[spsidx - 1].seqTcoeffLevelPredictionFlag = mfxU8(extSvc->DependencyLayer[did].QualityLayer[0].TcoeffPredictionFlag); subset[spsidx - 1].adaptiveTcoeffLevelPredictionFlag = 0; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE pps[0] = extPps; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE // prepare pps for base and enhanced spatial layers for (mfxU32 i = 0; i < numDep; i++) { mfxU32 did = par.calcParam.did[i]; mfxU32 simulcast = IsOff(extSvc->DependencyLayer[did].BasemodePred) && IsOff(extSvc->DependencyLayer[did].MotionPred) && IsOff(extSvc->DependencyLayer[did].ResidualPred) ? 1 : 0; pps[i] = extPps; if (IsSvcProfile(par.mfx.CodecProfile)) // force SPS/PPS id to 0 for SVC profile only. For other profiles should be able to encode custom SPS/PPS { pps[i].seqParameterSetId = mfxU8(i); pps[i].picParameterSetId = mfxU8(i); } pps[i].constrainedIntraPredFlag = ((i == numDep - 1 && numQualityAtLastDep == 1) || simulcast) ? 0 : 1; } // pack pps for enhanced quality layer of highest spatial layer if exists if (numQualityAtLastDep > 1) { pps.back() = extPps; pps.back().seqParameterSetId = mfxU8(numDep - 1); pps.back().picParameterSetId = mfxU8(numDep); pps.back().constrainedIntraPredFlag = 0; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE } }; void HeaderPacker::Init( MfxVideoParam const & par, MFX_ENCODE_CAPS const & hwCaps, bool emulPrev) { mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(par); mfxExtSpsHeader const & extSps = GetExtBufferRef(par); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(par); mfxU16 numViews = extSps.profileIdc == MFX_PROFILE_AVC_STEREO_HIGH ? 2 : 1; mfxU32 numSpsHeaders = numViews; mfxU32 numPpsHeaders = numViews; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxExtSVCSeqDesc const * extSvc = GetExtBuffer(par); mfxU32 numDep = par.calcParam.numDependencyLayer; mfxU32 firstDid = par.calcParam.did[0]; mfxU32 lastDid = par.calcParam.did[numDep - 1]; mfxU32 numQualityAtFirstDep = extSvc->DependencyLayer[firstDid].QualityNum; mfxU32 numQualityAtLastDep = extSvc->DependencyLayer[lastDid].QualityNum; mfxU32 additionalSpsForFirstSpatialLayer = (numQualityAtFirstDep > 1); mfxU32 additionalPpsForLastSpatialLayer = (numQualityAtLastDep > 1); numSpsHeaders = std::max(numDep + additionalSpsForFirstSpatialLayer, numViews); numPpsHeaders = std::max(numDep + additionalPpsForLastSpatialLayer, numViews); #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE mfxU32 maxNumSlices = GetMaxNumSlices(par); m_sps.resize(numSpsHeaders); m_pps.resize(numPpsHeaders); m_packedSps.resize(numSpsHeaders); m_packedPps.resize(numPpsHeaders); m_packedSlices.resize(maxNumSlices); m_headerBuffer.resize(SPSPPS_BUFFER_SIZE); m_sliceBuffer.resize(SLICE_BUFFER_SIZE); Zero(m_sps); Zero(m_pps); Zero(m_packedAud); Zero(m_packedSps); Zero(m_packedPps); Zero(m_packedSlices); Zero(m_spsIdx); Zero(m_ppsIdx); Zero(m_refDqId); Zero(m_simulcast); m_emulPrev = emulPrev; m_isMVC = numViews > 1; m_numMbPerSlice = extOpt2.NumMbPerSlice; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE m_subset.resize(numSpsHeaders / numViews - 1); Zero(m_subset); PrepareSpsPpsHeaders(par, m_sps, m_subset, m_pps); #else PrepareSpsPpsHeaders(par, m_sps, m_pps); #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) const mfxExtCodingOption3 &extOpt3 = GetExtBufferRef(par); if (IsOn(extOpt3.AdaptiveCQM)) { const std::vector &extCqmPps = par.GetCqmPps(); if (m_cqmPps.empty()) { m_cqmPps.resize(extCqmPps.size()); Zero(m_cqmPps); } if (m_packedCqmPps.empty()) { m_packedCqmPps.resize(extCqmPps.size()); Zero(m_packedCqmPps); } for (mfxU32 i = 0; i < extCqmPps.size(); i++) m_cqmPps[i] = extCqmPps[i]; } #endif // prepare data for slice level #ifndef MFX_ENABLE_SVC_VIDEO_ENCODE m_needPrefixNalUnit = (par.calcParam.numTemporalLayer > 0) && (par.mfx.LowPower != MFX_CODINGOPTION_ON);//LowPower limitation for temporal scalability we need to patch bitstream with SVC NAL after encoding #else m_needPrefixNalUnit = (IsSvcProfile(par.mfx.CodecProfile) || (par.calcParam.numTemporalLayer > 0)) && (par.mfx.LowPower != MFX_CODINGOPTION_ON);//LowPower limitation for temporal scalability we need to patch bitstream with SVC NAL after encoding for (mfxU32 i = 0; i < numDep; i++) { mfxU32 did = par.calcParam.did[i]; mfxU32 prevDid = i > 0 ? par.calcParam.did[i - 1] : 0; m_simulcast[did] = IsOff(extSvc->DependencyLayer[did].BasemodePred) && IsOff(extSvc->DependencyLayer[did].MotionPred) && IsOff(extSvc->DependencyLayer[did].ResidualPred) ? 1 : 0; m_refDqId[did] = did > 0 ? mfxU8(16 * prevDid + extSvc->DependencyLayer[prevDid].QualityNum - 1) : 0; for (mfxU32 qid = 0; qid < extSvc->DependencyLayer[did].QualityNum; qid++) { m_spsIdx[did][qid] = mfxU8(did == 0 ? (!!qid) : (did + additionalSpsForFirstSpatialLayer)); m_ppsIdx[did][qid] = mfxU8(did); } } if (additionalPpsForLastSpatialLayer) m_ppsIdx[lastDid][numQualityAtLastDep - 1]++; #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE m_cabacInitIdc = extDdi.CabacInitIdcPlus1 - 1; m_directSpatialMvPredFlag = extDdi.DirectSpatialMvPredFlag; // pack headers OutputBitstream obs(Begin(m_headerBuffer), End(m_headerBuffer), m_emulPrev); ENCODE_PACKEDHEADER_DATA * bufDesc = Begin(m_packedSps); mfxU8 * bufBegin = Begin(m_headerBuffer); mfxU32 numBits = 0; #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE // pack scalability sei Zero(m_packedScalabilitySei); if (IsSvcProfile(par.mfx.CodecProfile)) { numBits = PutScalableInfoSeiMessage(obs, par); assert(numBits % 8 == 0); m_packedScalabilitySei = MakePackedByteBuffer(bufBegin, numBits / 8, m_emulPrev ? 0 : 4); bufBegin += numBits / 8; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE // pack sps for base and enhanced spatial layers with did > 0 for (size_t i = 0; i < m_sps.size(); i++) { #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE numBits = (i == 0 || (numViews > 1)) ? WriteSpsHeader(obs, m_sps[i]) : WriteSpsHeader(obs, m_sps[i], m_subset[i - 1].Header); #else numBits = WriteSpsHeader(obs, m_sps[i]); #endif *bufDesc++ = MakePackedByteBuffer(bufBegin, numBits / 8, m_emulPrev ? 0 : 4); bufBegin += numBits / 8; } // pack pps for base and enhanced spatial layers bufDesc = Begin(m_packedPps); for (size_t i = 0; i < m_pps.size(); i++) { numBits = WritePpsHeader(obs, m_pps[i]); *bufDesc++ = MakePackedByteBuffer(bufBegin, numBits / 8, m_emulPrev ? 0 : 4); bufBegin += numBits / 8; } #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) // pack extended pps for adaptive CQM if (!m_packedCqmPps.empty()) { bufDesc = Begin(m_packedCqmPps); for (size_t i = 0; i < m_cqmPps.size(); i++) { numBits = WritePpsHeader(obs, m_cqmPps[i]); *bufDesc++ = MakePackedByteBuffer(bufBegin, numBits / 8, m_emulPrev ? 0 : 4); bufBegin += numBits / 8; } } #endif m_hwCaps = hwCaps; m_longStartCodes = IsOn(extDdi.LongStartCodes) && !IsOn(par.mfx.LowPower); m_isLowPower = IsOn(par.mfx.LowPower); } void HeaderPacker::ResizeSlices(mfxU32 num) { m_packedSlices.resize(num); Zero(m_packedSlices); } #ifndef MFX_AVC_ENCODING_UNIT_DISABLE /* Filling information about headers in HeadersInfo. */ void HeaderPacker::GetHeadersInfo(std::vector &HeadersInfo, DdiTask const& task, mfxU32 fid) { std::vector::iterator it; mfxU32 offset = 0; if (task.m_insertAud[fid]) { HeadersInfo.emplace_back(); HeadersInfo.back().Type = NALU_AUD; HeadersInfo.back().Size = m_packedAud.DataLength; HeadersInfo.back().Offset = offset; offset += HeadersInfo.back().Size; } if (task.m_insertSps[fid]) { for (it = m_packedSps.begin(); it < m_packedSps.end(); ++it) { HeadersInfo.emplace_back(); HeadersInfo.back().Type = NALU_SPS; HeadersInfo.back().Size = it->DataLength; HeadersInfo.back().Offset = offset; offset += HeadersInfo.back().Size; } } if (task.m_insertPps[fid]) { for (it = m_packedPps.begin(); it < m_packedPps.end(); ++it) { HeadersInfo.emplace_back(); HeadersInfo.back().Type = NALU_PPS; HeadersInfo.back().Size = it->DataLength; HeadersInfo.back().Offset = offset; offset += HeadersInfo.back().Size; } } } #endif ENCODE_PACKEDHEADER_DATA const & HeaderPacker::PackAud( DdiTask const & task, mfxU32 fieldId) { mfxU8 * audBegin = m_packedPps.back().pData + m_packedPps.back().DataLength; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (!m_packedCqmPps.empty()) for (auto it = m_packedCqmPps.begin(); it < m_packedCqmPps.end(); it++) audBegin += it->DataLength; #endif OutputBitstream obs(audBegin, End(m_headerBuffer), m_emulPrev); mfxU32 numBits = WriteAud(obs, task.m_type[fieldId]); m_packedAud = MakePackedByteBuffer(audBegin, numBits / 8, m_emulPrev ? 0 : 4); return m_packedAud; } std::vector const & HeaderPacker::PackSlices( DdiTask const & task, mfxU32 fieldId) { const mfxU32 maxSliceHeaderSize = 50; //maximum coded slice header size in bytes size_t numSlices = task.m_SliceInfo.size() ? task.m_SliceInfo.size() : task.m_numSlice[fieldId]; if (task.m_SliceInfo.size()) { m_numMbPerSlice = 0; } if (numSlices) { m_packedSlices.resize(numSlices); if (m_sliceBuffer.size() < (numSlices * maxSliceHeaderSize)) { m_sliceBuffer.resize(numSlices * maxSliceHeaderSize); } } Zero(m_sliceBuffer); Zero(m_packedSlices); mfxU8 * sliceBufferBegin = Begin(m_sliceBuffer); mfxU8 * sliceBufferEnd = End(m_sliceBuffer); for (mfxU32 i = 0; i < m_packedSlices.size(); i++) { mfxU8 * endOfPrefix = m_needPrefixNalUnit && task.m_did == 0 && task.m_qid == 0 ? PackPrefixNalUnitSvc(sliceBufferBegin, sliceBufferEnd, true, task, fieldId) : sliceBufferBegin; OutputBitstream obs(endOfPrefix, sliceBufferEnd, false); // pack without emulation control if (task.m_SliceInfo.size()) WriteSlice(obs, task, fieldId, task.m_SliceInfo[i].startMB, task.m_SliceInfo[i].numMB); else WriteSlice(obs, task, fieldId, i); m_packedSlices[i].pData = sliceBufferBegin; m_packedSlices[i].DataLength = mfxU32((endOfPrefix - sliceBufferBegin) * 8 + obs.GetNumBits()); // for slices length is in bits m_packedSlices[i].BufferSize = (m_packedSlices[i].DataLength + 7) / 8; m_packedSlices[i].SkipEmulationByteCount = mfxU32(endOfPrefix - sliceBufferBegin + 3); sliceBufferBegin += m_packedSlices[i].BufferSize; } if (task.m_AUStartsFromSlice[fieldId]) m_packedSlices[0].SkipEmulationByteCount = 4; return m_packedSlices; } void WritePredWeightTable( OutputBitstream & obs, MFX_ENCODE_CAPS const & hwCaps, DdiTask const & task, mfxU32 fieldId, mfxU32 chromaArrayType) { // Transform field parity to field number before buffer request (PWT attached according to field order, not parity) // However in case of FEI single field mode, only one buffer is attached. mfxU32 fieldNum = task.m_singleFieldMode ? 0 : task.m_fid[fieldId]; const mfxExtPredWeightTable* pPWT = GetExtBuffer(task.m_ctrl, fieldNum); #ifdef MFX_ENABLE_FADE_DETECTION if (!pPWT) pPWT = &task.m_pwt[fieldId]; else if ((pPWT->LumaLog2WeightDenom && pPWT->LumaLog2WeightDenom != 6) || (pPWT->ChromaLog2WeightDenom && pPWT->ChromaLog2WeightDenom != 6)) pPWT = &task.m_pwt[fieldId]; #endif mfxU32 nRef[2] = { std::max(1u, task.m_list0[fieldId].Size()), std::max(1u, task.m_list1[fieldId].Size()) }; mfxU32 maxWeights[2] = { hwCaps.ddi_caps.MaxNum_WeightedPredL0, hwCaps.ddi_caps.MaxNum_WeightedPredL1 }; bool present; obs.PutUe(pPWT->LumaLog2WeightDenom); if (chromaArrayType != 0) obs.PutUe(pPWT->ChromaLog2WeightDenom); for (mfxU32 lx = 0; lx <= (mfxU32)!!(task.m_type[fieldId] & MFX_FRAMETYPE_B); lx++) { for (mfxU32 i = 0; i < nRef[lx]; i++) { present = !!pPWT->LumaWeightFlag[lx][i] && hwCaps.ddi_caps.LumaWeightedPred; if (i < maxWeights[lx]) { obs.PutBit(present); if (present) { obs.PutSe(pPWT->Weights[lx][i][0][0]); obs.PutSe(pPWT->Weights[lx][i][0][1]); } } else { obs.PutBit(0); } if (chromaArrayType != 0) { present = !!pPWT->ChromaWeightFlag[lx][i] && hwCaps.ddi_caps.ChromaWeightedPred; if (i < maxWeights[lx]) { obs.PutBit(present); if (present) { for (mfxU32 j = 1; j < 3; j++) { obs.PutSe(pPWT->Weights[lx][i][j][0]); obs.PutSe(pPWT->Weights[lx][i][j][1]); } } } else { obs.PutBit(0); } } } } } mfxU32 HeaderPacker::WriteSlice( OutputBitstream & obs, DdiTask const & task, mfxU32 fieldId, mfxU32 sliceId) { mfxU32 sliceType = ConvertMfxFrameType2SliceType(task.m_type[fieldId]) % 5; mfxU32 refPicFlag = !!(task.m_type[fieldId] & MFX_FRAMETYPE_REF); mfxU32 idrPicFlag = !!(task.m_type[fieldId] & MFX_FRAMETYPE_IDR); mfxU32 nalRefIdc = task.m_nalRefIdc[fieldId]; mfxU32 nalUnitType = (task.m_did == 0 && task.m_qid == 0) ? (idrPicFlag ? NALU_IDR : NALU_NON_IDR) : NALU_CODED_SLICE_EXT; mfxU32 fieldPicFlag = task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE; mfxExtSpsHeader const & sps = task.m_viewIdx ? m_sps[task.m_viewIdx] : m_sps[m_spsIdx[task.m_did][task.m_qid]]; mfxExtPpsHeader const & pps = #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) task.m_adaptiveCQMHint > 0 && task.m_adaptiveCQMHint <= static_cast(m_cqmPps.size()) ? m_cqmPps[task.m_adaptiveCQMHint - 1] : #endif task.m_viewIdx ? m_pps[task.m_viewIdx] : m_pps[m_ppsIdx[task.m_did][task.m_qid]]; // if frame_mbs_only_flag = 0 and current task implies encoding of progressive frame // then picture height in MBs isn't equal to PicHeightInMapUnits. Multiplier required mfxU32 picHeightMultiplier = (sps.frameMbsOnlyFlag == 0) && (fieldPicFlag == 0) ? 2 : 1; mfxU32 picHeightInMBs = (sps.picHeightInMapUnitsMinus1 + 1) * picHeightMultiplier; SliceDivider divider = MakeSliceDivider( SliceDividerType(m_hwCaps.ddi_caps.SliceStructure), m_numMbPerSlice, (mfxU32)m_packedSlices.size(), sps.picWidthInMbsMinus1 + 1, picHeightInMBs); mfxU32 firstMbInSlice = 0; if (!m_isLowPower) { for (mfxU32 i = 0; i <= sliceId; i++, divider.Next()) firstMbInSlice = divider.GetFirstMbInSlice(); } mfxU32 sliceHeaderRestrictionFlag = 0; mfxU8 startcode[4] = { 0, 0, 0, 1}; mfxU8 * pStartCode = startcode; #if !defined(ANDROID) if (!m_longStartCodes) { if (task.m_AUStartsFromSlice[fieldId] == false || sliceId > 0) pStartCode++; } #endif obs.PutRawBytes(pStartCode, startcode + sizeof startcode); obs.PutBit(0); obs.PutBits(nalRefIdc, 2); obs.PutBits(nalUnitType, 5); mfxU32 noInterLayerPredFlag = (task.m_qid == 0) ? m_simulcast[task.m_did] : 0; if (nalUnitType == 20) { mfxU32 useRefBasePicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_KEYPIC) ? 1 : 0; obs.PutBits(1, 1); // svc_extension_flag obs.PutBits(idrPicFlag, 1); obs.PutBits(task.m_pid, 6); obs.PutBits(noInterLayerPredFlag, 1); obs.PutBits(task.m_did, 3); obs.PutBits(task.m_qid, 4); obs.PutBits(task.m_tid, 3); obs.PutBits(useRefBasePicFlag, 1); // use_ref_base_pic_flag obs.PutBits(1, 1); // discardable_flag obs.PutBits(1, 1); // output_flag obs.PutBits(0x3, 2); // reserved_three_2bits } obs.PutUe(firstMbInSlice); obs.PutUe(sliceType + 5); obs.PutUe(pps.picParameterSetId); obs.PutBits(task.m_frameNum, sps.log2MaxFrameNumMinus4 + 4); if (!sps.frameMbsOnlyFlag) { obs.PutBit(fieldPicFlag); if (fieldPicFlag) obs.PutBit(fieldId); } if (idrPicFlag) obs.PutUe(task.m_idrPicId); if (sps.picOrderCntType == 0) { obs.PutBits(task.GetPoc(fieldId), sps.log2MaxPicOrderCntLsbMinus4 + 4); if (pps.bottomFieldPicOrderInframePresentFlag && !fieldPicFlag) obs.PutSe(0); // delta_pic_order_cnt_bottom } if (sps.picOrderCntType == 1 && !sps.deltaPicOrderAlwaysZeroFlag) { obs.PutSe(0); // delta_pic_order_cnt[0] if (pps.bottomFieldPicOrderInframePresentFlag && !fieldPicFlag) obs.PutSe(0); // delta_pic_order_cnt[1] } if (task.m_qid == 0) { if (sliceType == SLICE_TYPE_B) obs.PutBit(IsOn(m_directSpatialMvPredFlag)); if (sliceType != SLICE_TYPE_I) { mfxU32 numRefIdxL0ActiveMinus1 = std::max(1u, task.m_list0[fieldId].Size()) - 1; mfxU32 numRefIdxL1ActiveMinus1 = std::max(1u, task.m_list1[fieldId].Size()) - 1; mfxU32 numRefIdxActiveOverrideFlag = (numRefIdxL0ActiveMinus1 != pps.numRefIdxL0DefaultActiveMinus1) || (numRefIdxL1ActiveMinus1 != pps.numRefIdxL1DefaultActiveMinus1 && sliceType == SLICE_TYPE_B); obs.PutBit(numRefIdxActiveOverrideFlag); if (numRefIdxActiveOverrideFlag) { obs.PutUe(numRefIdxL0ActiveMinus1); if (sliceType == SLICE_TYPE_B) obs.PutUe(numRefIdxL1ActiveMinus1); } } if (sliceType != SLICE_TYPE_I) WriteRefPicListModification(obs, task.m_refPicList0Mod[fieldId]); if (sliceType == SLICE_TYPE_B) WriteRefPicListModification(obs, task.m_refPicList1Mod[fieldId]); if ((pps.weightedPredFlag == 1 && sliceType == SLICE_TYPE_P) || (pps.weightedBipredIdc == 1 && sliceType == SLICE_TYPE_B)) { mfxU32 chromaArrayType = sps.separateColourPlaneFlag ? 0 : sps.chromaFormatIdc; WritePredWeightTable(obs, m_hwCaps, task, fieldId, chromaArrayType); } if (refPicFlag || task.m_nalRefIdc[fieldId]) { WriteDecRefPicMarking(obs, task.m_decRefPicMrk[fieldId], idrPicFlag); mfxU32 storeRefBasePicFlag = 0; if (nalUnitType == 20 && !sliceHeaderRestrictionFlag) obs.PutBit(storeRefBasePicFlag); } } if (pps.entropyCodingModeFlag && sliceType != SLICE_TYPE_I) obs.PutUe(m_cabacInitIdc); obs.PutSe(task.m_cqpValue[fieldId] - (pps.picInitQpMinus26 + 26)); if (pps.deblockingFilterControlPresentFlag) { mfxU32 disableDeblockingFilterIdc = task.m_disableDeblockingIdc[fieldId][sliceId]; mfxI32 sliceAlphaC0OffsetDiv2 = task.m_sliceAlphaC0OffsetDiv2[fieldId][sliceId]; mfxI32 sliceBetaOffsetDiv2 = task.m_sliceBetaOffsetDiv2[fieldId][sliceId]; obs.PutUe(disableDeblockingFilterIdc); if (disableDeblockingFilterIdc != 1) { obs.PutSe(sliceAlphaC0OffsetDiv2); obs.PutSe(sliceBetaOffsetDiv2); } } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (nalUnitType == 20) { mfxU32 sliceSkipFlag = 0; mfxExtSpsSvcHeader const & subset = m_subset[m_spsIdx[task.m_did][task.m_qid] - 1]; if (!noInterLayerPredFlag && task.m_qid == 0) { mfxU32 interLayerDeblockingFilterIdc = (task.m_did || task.m_qid) ? 0 : 1; mfxU32 interLayerSliceAlphaC0OffsetDiv2 = 0; mfxU32 interLayerSliceBetaOffsetDiv2 = 0; mfxU32 constrainedIntraResamplingFlag = 0; obs.PutUe(m_refDqId[task.m_did]); if (subset.interLayerDeblockingFilterControlPresentFlag) { obs.PutUe(interLayerDeblockingFilterIdc); if (interLayerDeblockingFilterIdc != 1) { obs.PutSe(interLayerSliceAlphaC0OffsetDiv2); obs.PutSe(interLayerSliceBetaOffsetDiv2); } } obs.PutBit(constrainedIntraResamplingFlag); if (subset.extendedSpatialScalabilityIdc == 2) { if (sps.chromaFormatIdc > 0) { obs.PutBit(subset.seqRefLayerChromaPhaseXPlus1Flag); obs.PutBits(subset.seqRefLayerChromaPhaseYPlus1, 2); } obs.PutSe(subset.seqScaledRefLayerLeftOffset); obs.PutSe(subset.seqScaledRefLayerTopOffset); obs.PutSe(subset.seqScaledRefLayerRightOffset); obs.PutSe(subset.seqScaledRefLayerBottomOffset); } } if (!noInterLayerPredFlag) { sliceSkipFlag = 0; mfxU32 adaptiveBaseModeFlag = !m_simulcast[task.m_did]; mfxU32 defaultBaseModeFlag = 0; mfxU32 adaptiveMotionPredictionFlag = !m_simulcast[task.m_did]; mfxU32 defaultMotionPredictionFlag = 0; mfxU32 adaptiveResidualPredictionFlag = !m_simulcast[task.m_did]; mfxU32 defaultResidualPredictionFlag = 0; mfxU32 adaptiveTcoeffLevelPredictionFlag = 0; obs.PutBit(sliceSkipFlag); if (sliceSkipFlag) obs.PutUe(divider.GetNumMbInSlice() - 1); else { obs.PutBit(adaptiveBaseModeFlag); if (!adaptiveBaseModeFlag) obs.PutBit(defaultBaseModeFlag); if (!defaultBaseModeFlag) { obs.PutBit(adaptiveMotionPredictionFlag); if (!adaptiveMotionPredictionFlag) obs.PutBit(defaultMotionPredictionFlag); } obs.PutBit(adaptiveResidualPredictionFlag); if (!adaptiveResidualPredictionFlag) obs.PutBit(defaultResidualPredictionFlag); } if (adaptiveTcoeffLevelPredictionFlag) obs.PutBit(subset.seqTcoeffLevelPredictionFlag); } if (!sliceHeaderRestrictionFlag && !sliceSkipFlag) { mfxU32 scanIdxStart = 0; mfxU32 scanIdxEnd = 15; obs.PutBits(scanIdxStart, 4); obs.PutBits(scanIdxEnd, 4); } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE return obs.GetNumBits(); } mfxU32 HeaderPacker::WriteSlice( OutputBitstream & obs, DdiTask const & task, mfxU32 fieldId, mfxU32 firstMbInSlice, mfxU32 numMbInSlice) { mfxU32 sliceType = ConvertMfxFrameType2SliceType(task.m_type[fieldId]) % 5; mfxU32 refPicFlag = !!(task.m_type[fieldId] & MFX_FRAMETYPE_REF); mfxU32 idrPicFlag = !!(task.m_type[fieldId] & MFX_FRAMETYPE_IDR); mfxU32 nalRefIdc = task.m_nalRefIdc[fieldId]; mfxU32 nalUnitType = (task.m_did == 0 && task.m_qid == 0) ? (idrPicFlag ? 5 : 1) : 20; mfxU32 fieldPicFlag = task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE; mfxExtSpsHeader const & sps = task.m_viewIdx ? m_sps[task.m_viewIdx] : m_sps[m_spsIdx[task.m_did][task.m_qid]]; mfxExtPpsHeader const & pps = #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) IsCustMatrix(task.m_adaptiveCQMHint) ? m_cqmPps[(mfxU32)task.m_adaptiveCQMHint - 1] : #endif task.m_viewIdx ? m_pps[task.m_viewIdx] : m_pps[m_ppsIdx[task.m_did][task.m_qid]]; // if frame_mbs_only_flag = 0 and current task implies encoding of progressive frame // then picture height in MBs isn't equal to PicHeightInMapUnits. Multiplier required //mfxU32 picHeightMultiplier = (sps.frameMbsOnlyFlag == 0) && (fieldPicFlag == 0) ? 2 : 1; //mfxU32 picHeightInMBs = (sps.picHeightInMapUnitsMinus1 + 1) * picHeightMultiplier; mfxU32 sliceHeaderRestrictionFlag = 0; #if defined(ANDROID) mfxU8 startcode[4] = { 0, 0, 0, 1 }; #else mfxU8 startcode[3] = { 0, 0, 1 }; if (m_longStartCodes) obs.PutFillerBytes(0x00, 1); #endif obs.PutRawBytes(startcode, startcode + sizeof startcode); obs.PutBit(0); obs.PutBits(nalRefIdc, 2); obs.PutBits(nalUnitType, 5); mfxU32 noInterLayerPredFlag = (task.m_qid == 0) ? m_simulcast[task.m_did] : 0; if (nalUnitType == 20) { mfxU32 useRefBasePicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_KEYPIC) ? 1 : 0; obs.PutBits(1, 1); // svc_extension_flag obs.PutBits(idrPicFlag, 1); obs.PutBits(task.m_pid, 6); obs.PutBits(noInterLayerPredFlag, 1); obs.PutBits(task.m_did, 3); obs.PutBits(task.m_qid, 4); obs.PutBits(task.m_tid, 3); obs.PutBits(useRefBasePicFlag, 1); // use_ref_base_pic_flag obs.PutBits(1, 1); // discardable_flag obs.PutBits(1, 1); // output_flag obs.PutBits(0x3, 2); // reserved_three_2bits } obs.PutUe(firstMbInSlice); obs.PutUe(sliceType + 5); obs.PutUe(pps.picParameterSetId); obs.PutBits(task.m_frameNum, sps.log2MaxFrameNumMinus4 + 4); if (!sps.frameMbsOnlyFlag) { obs.PutBit(fieldPicFlag); if (fieldPicFlag) obs.PutBit(fieldId); } if (idrPicFlag) obs.PutUe(task.m_idrPicId); if (sps.picOrderCntType == 0) { obs.PutBits(task.GetPoc(fieldId), sps.log2MaxPicOrderCntLsbMinus4 + 4); if (pps.bottomFieldPicOrderInframePresentFlag && !fieldPicFlag) obs.PutSe(0); // delta_pic_order_cnt_bottom } if (sps.picOrderCntType == 1 && !sps.deltaPicOrderAlwaysZeroFlag) { obs.PutSe(0); // delta_pic_order_cnt[0] if (pps.bottomFieldPicOrderInframePresentFlag && !fieldPicFlag) obs.PutSe(0); // delta_pic_order_cnt[1] } if (task.m_qid == 0) { if (sliceType == SLICE_TYPE_B) obs.PutBit(IsOn(m_directSpatialMvPredFlag)); if (sliceType != SLICE_TYPE_I) { mfxU32 numRefIdxL0ActiveMinus1 = std::max(1u, task.m_list0[fieldId].Size()) - 1; mfxU32 numRefIdxL1ActiveMinus1 = std::max(1u, task.m_list1[fieldId].Size()) - 1; mfxU32 numRefIdxActiveOverrideFlag = (numRefIdxL0ActiveMinus1 != pps.numRefIdxL0DefaultActiveMinus1) || (numRefIdxL1ActiveMinus1 != pps.numRefIdxL1DefaultActiveMinus1 && sliceType == SLICE_TYPE_B); obs.PutBit(numRefIdxActiveOverrideFlag); if (numRefIdxActiveOverrideFlag) { obs.PutUe(numRefIdxL0ActiveMinus1); if (sliceType == SLICE_TYPE_B) obs.PutUe(numRefIdxL1ActiveMinus1); } } if (sliceType != SLICE_TYPE_I) WriteRefPicListModification(obs, task.m_refPicList0Mod[fieldId]); if (sliceType == SLICE_TYPE_B) WriteRefPicListModification(obs, task.m_refPicList1Mod[fieldId]); if ((pps.weightedPredFlag == 1 && sliceType == SLICE_TYPE_P) || (pps.weightedBipredIdc == 1 && sliceType == SLICE_TYPE_B)) { mfxU32 chromaArrayType = sps.separateColourPlaneFlag ? 0 : sps.chromaFormatIdc; WritePredWeightTable(obs, m_hwCaps, task, fieldId, chromaArrayType); } if (refPicFlag) { WriteDecRefPicMarking(obs, task.m_decRefPicMrk[fieldId], idrPicFlag); mfxU32 storeRefBasePicFlag = 0; if (nalUnitType == 20 && !sliceHeaderRestrictionFlag) obs.PutBit(storeRefBasePicFlag); } } if (pps.entropyCodingModeFlag && sliceType != SLICE_TYPE_I) obs.PutUe(m_cabacInitIdc); obs.PutSe(task.m_cqpValue[fieldId] - (pps.picInitQpMinus26 + 26)); if (pps.deblockingFilterControlPresentFlag) { // task.m_disableDeblockingIdc[fieldId] is initialized for fixed number of slices // it can't be used to feed slice header generation for adaptive slice mode // always use slice id 0 // the same for task.m_sliceAlphaC0OffsetDiv2 and task.m_sliceBetaOffsetDiv2 mfxU32 disableDeblockingFilterIdc = task.m_disableDeblockingIdc[fieldId][0]; mfxI32 sliceAlphaC0OffsetDiv2 = task.m_sliceAlphaC0OffsetDiv2[fieldId][0]; mfxI32 sliceBetaOffsetDiv2 = task.m_sliceBetaOffsetDiv2[fieldId][0]; obs.PutUe(disableDeblockingFilterIdc); if (disableDeblockingFilterIdc != 1) { obs.PutSe(sliceAlphaC0OffsetDiv2); obs.PutSe(sliceBetaOffsetDiv2); } } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (nalUnitType == 20) { mfxU32 sliceSkipFlag = 0; mfxExtSpsSvcHeader const & subset = m_subset[m_spsIdx[task.m_did][task.m_qid] - 1]; if (!noInterLayerPredFlag && task.m_qid == 0) { mfxU32 interLayerDeblockingFilterIdc = (task.m_did || task.m_qid) ? 0 : 1; mfxU32 interLayerSliceAlphaC0OffsetDiv2 = 0; mfxU32 interLayerSliceBetaOffsetDiv2 = 0; mfxU32 constrainedIntraResamplingFlag = 0; obs.PutUe(m_refDqId[task.m_did]); if (subset.interLayerDeblockingFilterControlPresentFlag) { obs.PutUe(interLayerDeblockingFilterIdc); if (interLayerDeblockingFilterIdc != 1) { obs.PutSe(interLayerSliceAlphaC0OffsetDiv2); obs.PutSe(interLayerSliceBetaOffsetDiv2); } } obs.PutBit(constrainedIntraResamplingFlag); if (subset.extendedSpatialScalabilityIdc == 2) { if (sps.chromaFormatIdc > 0) { obs.PutBit(subset.seqRefLayerChromaPhaseXPlus1Flag); obs.PutBits(subset.seqRefLayerChromaPhaseYPlus1, 2); } obs.PutSe(subset.seqScaledRefLayerLeftOffset); obs.PutSe(subset.seqScaledRefLayerTopOffset); obs.PutSe(subset.seqScaledRefLayerRightOffset); obs.PutSe(subset.seqScaledRefLayerBottomOffset); } } if (!noInterLayerPredFlag) { sliceSkipFlag = 0; mfxU32 adaptiveBaseModeFlag = !m_simulcast[task.m_did]; mfxU32 defaultBaseModeFlag = 0; mfxU32 adaptiveMotionPredictionFlag = !m_simulcast[task.m_did]; mfxU32 defaultMotionPredictionFlag = 0; mfxU32 adaptiveResidualPredictionFlag = !m_simulcast[task.m_did]; mfxU32 defaultResidualPredictionFlag = 0; mfxU32 adaptiveTcoeffLevelPredictionFlag = 0; obs.PutBit(sliceSkipFlag); if (sliceSkipFlag) obs.PutUe(numMbInSlice - 1); else { obs.PutBit(adaptiveBaseModeFlag); if (!adaptiveBaseModeFlag) obs.PutBit(defaultBaseModeFlag); if (!defaultBaseModeFlag) { obs.PutBit(adaptiveMotionPredictionFlag); if (!adaptiveMotionPredictionFlag) obs.PutBit(defaultMotionPredictionFlag); } obs.PutBit(adaptiveResidualPredictionFlag); if (!adaptiveResidualPredictionFlag) obs.PutBit(defaultResidualPredictionFlag); } if (adaptiveTcoeffLevelPredictionFlag) obs.PutBit(subset.seqTcoeffLevelPredictionFlag); } if (!sliceHeaderRestrictionFlag && !sliceSkipFlag) { mfxU32 scanIdxStart = 0; mfxU32 scanIdxEnd = 15; obs.PutBits(scanIdxStart, 4); obs.PutBits(scanIdxEnd, 4); } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE (void)numMbInSlice; return obs.GetNumBits(); } const mfxU8 M_N[2][3][3][2] = { // [isB][ctxIdx][cabac_init_idc][m, n] {// m and n values for 3 CABAC contexts 11-13 (mb_skip_flag for P frames) {{23, 33}, {22, 25}, {29, 16}}, {{23, 2}, {34, 0}, {25, 0}}, {{21, 0}, {16, 0}, {14, 0}} }, {// m and n values for 3 CABAC contexts 24-26 (mb_skip_flag for B frames) {{18, 64}, {26, 34}, {20, 40}}, {{ 9, 43}, {19, 22}, {20, 10}}, {{29, 0}, {40, 0}, {29, 0}} }, }; const mfxI8 M_N_mbt_b[9][3][2] = { // [ctxIdx][cabac_init_idc][m, n] // m and n values for CABAC contexts 27-35 (mb_type for B frames) {{ 26, 67}, { 57, 2}, { 54, 0}}, {{ 16, 90}, { 41, 36}, { 37, 42}}, {{ 9, 104}, { 26, 69}, { 12, 97}}, {{-46, 127}, {-45, 127}, {-32, 127}}, {{-20, 104}, {-15, 101}, {-22, 117}}, {{ 1, 67}, { -4, 76}, { -2, 74}}, {{-13, 78}, { -6, 71}, { -4, 85}}, {{-11, 65}, {-13, 79}, {-24, 102}}, {{ 1, 62}, { 5, 52}, { 5, 57}} }; const mfxI8 M_N_mvd_b[14][3][2] = { // [ctxIdx][cabac_init_idc][m, n] // m and n values for CABAC contexts 40-53 (mvd_lx for B frames) {{ -3, 69}, { -2, 69}, {-11, 89}}, {{ -6, 81}, { -5, 82}, {-15, 103}}, {{-11, 96}, {-10, 96}, {-21, 116}}, {{ 6, 55}, { 2, 59}, { 19, 57}}, {{ 7, 67}, { 2, 75}, { 20, 58}}, {{ -5, 86}, { -3, 87}, { 4, 84}}, {{ 2, 88}, { -3, 100}, { 6, 96}}, {{ 0, 58}, { 1, 56}, { 1, 63}}, {{ -3, 76}, { -3, 74}, { -5, 85}}, {{-10, 94}, { -6, 85}, {-13, 106}}, {{ 5, 54}, { 0, 59}, { 5, 63}}, {{ 4, 69}, { -3, 81}, { 6, 75}}, {{ -3, 81}, { -7, 86}, { -3, 90}}, {{ 0, 88}, { -5, 95}, { -1, 101}} }; const mfxI8 M_N_ref_b[6][3][2] = { // [ctxIdx][cabac_init_idc][m, n] // m and n values for CABAC contexts 54-59 (ref_idx_lx for B frames) {{ -7, 67}, { -1, 66}, { 3, 55}}, {{ -5, 74}, { -1, 77}, { -4, 79}}, {{ -4, 74}, { 1, 70}, { -2, 75}}, {{ -5, 80}, { -2, 86}, {-12, 97}}, {{ -7, 72}, { -5, 72}, { -7, 50}}, {{ 1, 58}, { 0, 61}, { 1, 60}}, }; const mfxI8 M_N_cbp_b[12][3][2] = { // [ctxIdx][cabac_init_idc][m, n] // m and n values for CABAC contexts 73-84 (coded_block_pattern for B frames) {{-27, 126}, {-39, 127}, {-36, 127}}, {{-28, 98}, {-18, 91}, {-17, 91}}, {{-25, 101}, {-17, 96}, {-14, 95}}, {{-23, 67}, {-26, 81}, {-25, 84}}, {{-28, 82}, {-35, 98}, {-25, 86}}, {{-20, 94}, {-24, 102}, {-12, 89}}, {{-16, 83}, {-23, 97}, {-17, 91}}, {{-22, 110}, {-27, 119}, {-31, 127}}, {{-21, 91}, {-24, 99}, {-14, 76}}, {{-18, 102}, {-21, 110}, {-18, 103}}, {{-13, 93}, {-18, 102}, {-13, 90}}, {{-29, 127}, {-36, 127}, {-37, 127}} }; inline void InitCabacContext(mfxI16 m, mfxI16 n, mfxU16 sliceQP, mfxU8& ctx) { mfxI16 preCtxState = mfx::clamp(( ( m * sliceQP ) >> 4 ) + n, 1, 126); if (preCtxState <= 63) ctx = mfxU8(63 - preCtxState); // MPS = 0 else ctx = mfxU8((preCtxState - 64) | (1 << 6)); // MPS = 1 } #define INIT_CABAC_CONTEXTS(idc, QP, MN, ctx) \ for (mfxU32 i = 0; i < sizeof(ctx); i++) \ InitCabacContext(MN[i][idc][0], MN[i][idc][1], mfxU16(QP), ctx[i]); ENCODE_PACKEDHEADER_DATA const & HeaderPacker::PackSkippedSlice( DdiTask const & task, mfxU32 fieldId) { Zero(m_packedSlices); mfxU8 * sliceBufferBegin = Begin(m_sliceBuffer); mfxU8 * sliceBufferEnd = End(m_sliceBuffer); mfxU8 * endOfPrefix = m_needPrefixNalUnit && task.m_did == 0 && task.m_qid == 0 ? PackPrefixNalUnitSvc(sliceBufferBegin, sliceBufferEnd, true, task, fieldId) : sliceBufferBegin; CabacPackerSimple packer(endOfPrefix, sliceBufferEnd, m_emulPrev); WriteSlice(packer, task, fieldId, 0); mfxExtSpsHeader const & sps = task.m_viewIdx ? m_sps[task.m_viewIdx] : m_sps[m_spsIdx[task.m_did][task.m_qid]]; mfxExtPpsHeader const & pps = #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) IsCustMatrix(task.m_adaptiveCQMHint) ? m_cqmPps[(mfxU32)task.m_adaptiveCQMHint - 1] : #endif task.m_viewIdx ? m_pps[task.m_viewIdx] : m_pps[m_ppsIdx[task.m_did][task.m_qid]]; mfxU32 picHeightMultiplier = (sps.frameMbsOnlyFlag == 0) && (task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE) ? 2 : 1; mfxU32 picHeightInMB = (sps.picHeightInMapUnitsMinus1 + 1) * picHeightMultiplier; mfxU32 picWidthInMB = (sps.picWidthInMbsMinus1 + 1); mfxU32 picSizeInMB = picWidthInMB * picHeightInMB; if (pps.entropyCodingModeFlag) { mfxU32 numAlignmentBits = (8 - (packer.GetNumBits() & 0x7)) & 0x7; packer.PutBits(0xff, numAlignmentBits); // encode dummy MB data mfxU8 cabacContexts[3]; // 3 CABAC contexts for mb_skip_flag mfxU32 sliceQP = task.m_cqpValue[fieldId]; INIT_CABAC_CONTEXTS(m_cabacInitIdc, sliceQP, M_N[!!(task.m_type[fieldId] & MFX_FRAMETYPE_B)], cabacContexts); mfxU8 ctx276 = 63; // ctx for end_of_slice_flag: MPS = 0, pStateIdx = 63 (non-adapting prob state) if ((task.m_type[fieldId] & MFX_FRAMETYPE_B) && (task.m_type[fieldId] & MFX_FRAMETYPE_REF)) { mfxU8 ctxMBT[9]; mfxU8 ctxREF[6]; mfxU8 ctxMVD[14]; mfxU8 ctxCBP[12]; INIT_CABAC_CONTEXTS(m_cabacInitIdc, sliceQP, M_N_mbt_b, ctxMBT); INIT_CABAC_CONTEXTS(m_cabacInitIdc, sliceQP, M_N_ref_b, ctxREF); INIT_CABAC_CONTEXTS(m_cabacInitIdc, sliceQP, M_N_mvd_b, ctxMVD); INIT_CABAC_CONTEXTS(m_cabacInitIdc, sliceQP, M_N_cbp_b, ctxCBP); for (mfxU32 uMB = 0; uMB < (picSizeInMB-1); uMB ++) { bool mbA = !!(uMB % picWidthInMB); //is left MB available bool mbB = (uMB >= picWidthInMB); //is above MB available packer.EncodeBin(&cabacContexts[mbA + mbB], 0); // encode mb_skip_flag = 0 // mb_type = 1 (B_L0_16x16) 1 0 0 packer.EncodeBin(&ctxMBT[mbA + mbB], 1); packer.EncodeBin(&ctxMBT[3], 0); packer.EncodeBin(&ctxMBT[5], 0); if (task.m_list0[fieldId].Size() > 1) packer.EncodeBin(&ctxREF[0], 0); // ref_idx_l0 = 0 packer.EncodeBin(&ctxMVD[0], 0); // mvd_l0[][][0] = 0 packer.EncodeBin(&ctxMVD[7], 0); // mvd_l0[][][1] = 0 // coded_block_pattern = 0 (0 0 0 0, 0) packer.EncodeBin(&ctxCBP[mbA + 2 * mbB], 0); packer.EncodeBin(&ctxCBP[ 1 + 2 * mbB], 0); packer.EncodeBin(&ctxCBP[mbA + 2 * 1 ], 0); packer.EncodeBin(&ctxCBP[ 1 + 2 * 1 ], 0); packer.EncodeBin(&ctxCBP[4], 0); packer.EncodeBin(&ctx276, 0); // end_of_slice_flag = 0 } packer.EncodeBin(&cabacContexts[2], 0); // encode mb_skip_flag = 0 // mb_type = 1 (B_L0_16x16) 1 0 0 packer.EncodeBin(&ctxMBT[2], 1); packer.EncodeBin(&ctxMBT[3], 0); packer.EncodeBin(&ctxMBT[5], 0); if (task.m_list0[fieldId].Size() > 1) packer.EncodeBin(&ctxREF[0], 0); // ref_idx_l0 = 0 packer.EncodeBin(&ctxMVD[0], 0); // mvd_l0[][][0] = 0 packer.EncodeBin(&ctxMVD[7], 0); // mvd_l0[][][1] = 0 // coded_block_pattern = 0 (0 0 0 0, 0) packer.EncodeBin(&ctxCBP[3], 0); packer.EncodeBin(&ctxCBP[3], 0); packer.EncodeBin(&ctxCBP[3], 0); packer.EncodeBin(&ctxCBP[3], 0); packer.EncodeBin(&ctxCBP[4], 0); } else { for (mfxU32 uMB = 0; uMB < (picSizeInMB-1); uMB ++) { packer.EncodeBin(&cabacContexts[0], 1); // encode mb_skip_flag = 1 for every MB. packer.EncodeBin(&ctx276, 0); // encode end_of_slice_flag = 0 for every MB } packer.EncodeBin(&cabacContexts[0], 1); // encode mb_skip_flag = 1 for every MB. } packer.TerminateEncode(); } else { if ((task.m_type[fieldId] & MFX_FRAMETYPE_B) && (task.m_type[fieldId] & MFX_FRAMETYPE_REF)) { for (mfxU32 uMB = 0; uMB < picSizeInMB; uMB ++) { packer.PutUe(0); // mb_skip_run = 0 packer.PutUe(1); // mb_type = 1 (B_L0_16x16) if (task.m_list0[fieldId].Size() > 1) packer.PutBit(1);// ref_idx_l0 = 0 packer.PutSe(0); // mvd_l0[][][0] = 0 packer.PutSe(0); // mvd_l0[][][1] = 0 packer.PutUe(0); // coded_block_pattern = 0 } } else { packer.PutUe(picSizeInMB); // write mb_skip_run = picSizeInMBs } packer.PutTrailingBits(); assert(packer.GetNumBits() % 8 == 0); } m_packedSlices[0].pData = sliceBufferBegin; m_packedSlices[0].DataLength = mfxU32((endOfPrefix - sliceBufferBegin) + (packer.GetNumBits() / 8)); m_packedSlices[0].BufferSize = m_packedSlices[0].DataLength; m_packedSlices[0].SkipEmulationByteCount = m_emulPrev ? 0 : (mfxU32(endOfPrefix - sliceBufferBegin) + 3); return m_packedSlices[0]; } #endif //MFX_ENABLE_H264_VIDEO_..._HW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/mfx_h264_encode_factory.cpp000066400000000000000000000035601443134507600326730ustar00rootroot00000000000000// Copyright (c) 2011-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include "mfx_h264_encode_interface.h" #include "mfx_h264_encode_vaapi.h" using namespace MfxHwH264Encode; // tmp solution #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE DriverEncoder* MfxHwH264Encode::CreatePlatformSvcEncoder( VideoCORE * core ) { assert( core ); return 0; } #endif DriverEncoder* MfxHwH264Encode::CreatePlatformH264Encoder( VideoCORE* core ) { //MFX_CHECK_NULL_PTR1( core ); assert( core ); (void)core; return new VAAPIEncoder;//( core ); } // DriverEncoder* MfxHwH264Encode::CreatePlatformH264Encoder( VideoCORE* core ) #endif // #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/mfx_h264_encode_hw.cpp000066400000000000000000005710301443134507600316440ustar00rootroot00000000000000// Copyright (c) 2009-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include #include #include #include #include #include "mfx_task.h" #include "libmfx_core.h" #include "libmfx_core_hw.h" #include "libmfx_core_interface.h" #include "mfx_ext_buffers.h" #include "mfx_h264_encode_hw.h" #include "mfx_h264_enc_common_hw.h" #include "mfx_h264_encode_hw_utils.h" #include "mfx_enc_common.h" #ifdef MFX_ENABLE_ENCODE_STATS #include "mfx_utils_extbuf.h" #endif //MFX_ENABLE_ENCODE_STATS #ifdef MFX_ENABLE_EXT #include "cmrt_cross_platform.h" #include "mfx_h264_encode_cm.h" #include "mfx_h264_encode_cm_defs.h" #endif #if MFX_ENABLE_AGOP #define DEBUG_ADAPT 0 const char frameType[] = {'U','I','P','U','B'}; #endif using namespace std::chrono_literals; using namespace MfxHwH264Encode; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) // special value to mark untouch space in bitstream (should be not equal to start code or valid NAL type) #define PO_EMPTY_MARK 0xF4000000 // mark interval in bitstream #define PO_MARK_INTERVAL 256 #endif namespace MfxHwH264EncodeHW { mfxU16 GetFrameWidth(MfxVideoParam & par) { mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); if (extBits.SPSBuffer) { mfxExtSpsHeader & extSps = GetExtBufferRef(par); return mfxU16(16 * (extSps.picWidthInMbsMinus1 + 1)); } else { return par.mfx.FrameInfo.Width; } } mfxU16 GetFrameHeight(MfxVideoParam & par) { mfxExtCodingOptionSPSPPS & extBits = GetExtBufferRef(par); if (extBits.SPSBuffer) { mfxExtSpsHeader & extSps = GetExtBufferRef(par); return mfxU16(16 * (extSps.picHeightInMapUnitsMinus1 + 1) * (2 - extSps.frameMbsOnlyFlag)); } else { return par.mfx.FrameInfo.Height; } } VmeData * FindUnusedVmeData(std::vector & vmeData) { VmeData * oldest = 0; for (size_t i = 0; i < vmeData.size(); i++) { if (!vmeData[i].used) return &vmeData[i]; if (oldest == 0 || oldest->encOrder > vmeData[i].encOrder) oldest = &vmeData[i]; } return oldest; } } using namespace MfxHwH264EncodeHW; mfxStatus MFXHWVideoENCODEH264::Init(mfxVideoParam * par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXHWVideoENCODEH264::Init"); if (m_impl.get() != 0) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (mfx::GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC)) if (par->mfx.CodecProfile == 0) par->mfx.CodecProfile = MFX_PROFILE_AVC_SCALABLE_BASELINE; #endif std::unique_ptr impl( #ifdef MFX_ENABLE_MVC_VIDEO_ENCODE IsMvcProfile(par->mfx.CodecProfile) ? (VideoENCODE *) new ImplementationMvc(m_core) : #endif #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE IsSvcProfile(par->mfx.CodecProfile) ? (VideoENCODE *) new ImplementationSvc(m_core) : #endif (VideoENCODE *) new ImplementationAvc(m_core)); mfxStatus sts = impl->Init(par); MFX_CHECK( sts >= MFX_ERR_NONE, sts); m_impl = std::move(impl); return sts; } mfxStatus MFXHWVideoENCODEH264::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { MFX_ENCODE_CAPS hwCaps = {}; MfxVideoParam tmp = mfxVideoParam(); auto platform = core.GetHWType(); std::ignore = SetLowPowerDefault(tmp, platform); MFX_SAFE_CALL(QueryHwCaps(&core, hwCaps, &tmp)); const mfxU32 SupportedProfiles[] = { MFX_PROFILE_AVC_BASELINE , MFX_PROFILE_AVC_CONSTRAINED_BASELINE , MFX_PROFILE_AVC_MAIN , MFX_PROFILE_AVC_HIGH , MFX_PROFILE_AVC_CONSTRAINED_HIGH , MFX_PROFILE_AVC_PROGRESSIVE_HIGH }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; const mfxU32 SupportedFourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_RGB4 , MFX_FOURCC_BGR4 , MFX_FOURCC_YUY2 , MFX_FOURCC_AYUV }; caps.CodecID = MFX_CODEC_AVC; caps.MaxcodecLevel = MFX_LEVEL_AVC_52; caps.BiDirectionalPrediction = !IsOn(tmp.mfx.LowPower) #if defined(MFX_ENABLE_AVCE_VDENC_B_FRAMES) || H264ECaps::IsVDEncBFrameSupported(platform) #endif ; for (mfxU32 profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = {16, hwCaps.ddi_caps.MaxPicWidth, 16}; memCaps.Height = {16, hwCaps.ddi_caps.MaxPicHeight, 16}; for (auto fcc : SupportedFourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus MFXHWVideoENCODEH264::Query( VideoCORE * core, mfxVideoParam * in, mfxVideoParam * out, void * state) { #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (in && in->mfx.CodecProfile == 0) if (mfx::GetExtBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC)) in->mfx.CodecProfile = MFX_PROFILE_AVC_SCALABLE_BASELINE; if (in && IsSvcProfile(in->mfx.CodecProfile) && (core->GetVAType() == MFX_HW_VAAPI) ) MFX_RETURN(MFX_ERR_UNSUPPORTED); #endif if (in && IsMvcProfile(in->mfx.CodecProfile) && !IsHwMvcEncSupported()) MFX_RETURN(MFX_ERR_UNSUPPORTED); if (in == 0) return ImplementationAvc::Query(core, in, out); #ifdef MFX_ENABLE_MVC_VIDEO_ENCODE if (IsMvcProfile(in->mfx.CodecProfile)) return ImplementationMvc::Query(core, in, out); #endif #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(in->mfx.CodecProfile)) return ImplementationSvc::Query(core, in, out); #endif if (state) { MFXHWVideoENCODEH264 * AVCEncoder = (MFXHWVideoENCODEH264*)state; if (!AVCEncoder->m_impl.get()) { assert(!"Encoder implementation isn't initialized"); MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } return ImplementationAvc::Query(core, in, out, AVCEncoder->m_impl.get()); } return ImplementationAvc::Query(core, in, out); } mfxStatus MFXHWVideoENCODEH264::QueryIOSurf( VideoCORE * core, mfxVideoParam * par, mfxFrameAllocRequest * request) { #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (mfx::GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC)) if (par->mfx.CodecProfile == 0) par->mfx.CodecProfile = MFX_PROFILE_AVC_SCALABLE_BASELINE; if (IsSvcProfile(par->mfx.CodecProfile)) return ImplementationSvc::QueryIOSurf(core, par, request); #endif if (IsMvcProfile(par->mfx.CodecProfile) && !IsHwMvcEncSupported()) return MFX_ERR_UNSUPPORTED; #ifdef MFX_ENABLE_MVC_VIDEO_ENCODE if (IsMvcProfile(par->mfx.CodecProfile)) return ImplementationMvc::QueryIOSurf(core, par, request); #endif return ImplementationAvc::QueryIOSurf(core, par, request); } void QpHistory::Add(mfxU32 qp) { std::copy_n(history, HIST_SIZE - 1, history + 1); history[0] = static_cast(qp); } mfxU8 QpHistory::GetAverageQp() const { mfxU32 averageQP = 0; mfxU32 numQPs = 0; for (mfxU8 qp : history) { if (qp < 52) { averageQP += qp; numQPs++; } } if (numQPs > 0) averageQP = (averageQP + numQPs / 2) / numQPs; return static_cast(averageQP); } mfxStatus ImplementationAvc::Query( VideoCORE * core, mfxVideoParam * in, mfxVideoParam * out, void * state) { MFX_CHECK_NULL_PTR2(core, out); mfxStatus sts; // "in" parameters should uniquely identify one of 4 Query operation modes (see MSDK spec for details) mfxU8 queryMode = DetermineQueryMode(in); MFX_CHECK(queryMode, MFX_ERR_UNDEFINED_BEHAVIOR); // input parameters are contradictory and don't allow to choose Query mode eMFXHWType platform = core->GetHWType(); if (queryMode == 1) // see MSDK spec for details related to Query mode 1 { Zero(out->mfx); out->IOPattern = 1; out->Protected = 1; out->AsyncDepth = 1; out->mfx.CodecId = 1; out->mfx.LowPower = 1; if (!H264ECaps::IsVmeSupported(platform)) out->mfx.LowPower = 0; out->mfx.CodecLevel = 1; out->mfx.CodecProfile = 1; out->mfx.NumThread = 0; out->mfx.TargetUsage = 1; out->mfx.GopPicSize = 1; out->mfx.GopRefDist = 1; out->mfx.GopOptFlag = 1; out->mfx.IdrInterval = 1; out->mfx.RateControlMethod = 1; out->mfx.InitialDelayInKB = 1; out->mfx.BufferSizeInKB = 1; out->mfx.TargetKbps = 1; out->mfx.MaxKbps = 1; out->mfx.NumSlice = 1; out->mfx.NumRefFrame = 1; out->mfx.NumThread = 1; out->mfx.EncodedOrder = 1; out->mfx.FrameInfo.FourCC = 1; out->mfx.FrameInfo.Width = 1; out->mfx.FrameInfo.Height = 1; out->mfx.FrameInfo.CropX = 1; out->mfx.FrameInfo.CropY = 1; out->mfx.FrameInfo.CropW = 1; out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.ChromaFormat = 1; out->mfx.FrameInfo.PicStruct = 1; if (mfxExtMVCSeqDesc * opt = GetExtBuffer(*out)) { opt->NumOP = 1; opt->NumView = 1; opt->NumViewId = 1; } if (mfxExtAVCRefListCtrl * ctrl = GetExtBuffer(*out)) { mfxExtBuffer tmp = ctrl->Header; Zero(*ctrl); ctrl->Header = tmp; ctrl->NumRefIdxL0Active = 1; ctrl->NumRefIdxL1Active = 1; ctrl->ApplyLongTermIdx = 1; ctrl->LongTermRefList[0].FrameOrder = 1; ctrl->LongTermRefList[0].LongTermIdx = 1; ctrl->PreferredRefList[0].FrameOrder = 1; ctrl->RejectedRefList[0].FrameOrder = 1; } if (mfxExtEncoderResetOption * resetOpt = GetExtBuffer(*out)) { resetOpt->StartNewSequence = 1; } if (mfxExtEncoderROI * extRoi = GetExtBuffer(*out)) { extRoi->NumROI = 1; extRoi->ROIMode = MFX_ROI_MODE_QP_DELTA; extRoi->ROI[0].Left = 1; extRoi->ROI[0].Right = 1; extRoi->ROI[0].Top = 1; extRoi->ROI[0].Bottom = 1; extRoi->ROI[0].DeltaQP = 1; } if (mfxExtEncoderCapability * extCap = GetExtBuffer(*out)) { (void) extCap; MFX_CHECK(MFX_HW_VAAPI != core->GetVAType(), MFX_ERR_UNSUPPORTED); } #ifdef MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT if(mfxExtPartialBitstreamParam* po = GetExtBuffer(*out)) { po->Granularity = 1; po->BlockSize = 1; } #endif } else if (queryMode == 2) // see MSDK spec for details related to Query mode 2 { MFX_ENCODE_CAPS hwCaps = { }; MfxVideoParam tmp = *in; // deep copy, create all supported extended buffers mfxStatus lpSts = SetLowPowerDefault(tmp, platform); // let's use default values if input resolution is 0x0 mfxU32 Width = in->mfx.FrameInfo.Width == 0 ? 1920: in->mfx.FrameInfo.Width; mfxU32 Height = in->mfx.FrameInfo.Height == 0 ? 1088: in->mfx.FrameInfo.Height; if (Width > 4096 || Height > 4096) sts = MFX_ERR_UNSUPPORTED; else sts = QueryHwCaps(core, hwCaps, &tmp); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); sts = ReadSpsPpsHeaders(tmp); MFX_CHECK_STS(sts); eMFXGTConfig* pMFXGTConfig = QueryCoreInterface(core, MFXICORE_GT_CONFIG_GUID); MFX_CHECK(pMFXGTConfig != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus checkSts = CheckVideoParamQueryLike(tmp, hwCaps, platform, core->GetVAType(), *pMFXGTConfig); if (checkSts == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) checkSts = MFX_ERR_UNSUPPORTED; else if (checkSts == MFX_ERR_NONE && lpSts != MFX_ERR_NONE) // transfer MFX_WRN_INCOMPATIBLE_VIDEO_PARAM to upper level checkSts = lpSts; #ifdef MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT if(mfxExtPartialBitstreamParam* po = GetExtBuffer(*out)) { if(po->Granularity < MFX_PARTIAL_BITSTREAM_NONE || po->Granularity > MFX_PARTIAL_BITSTREAM_ANY) { checkSts = MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } if(po->Granularity == MFX_PARTIAL_BITSTREAM_BLOCK && po->BlockSize == 0) checkSts = MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; if(out->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { checkSts = MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } #endif // Query should not modify UNKNOWN options if (in->mfx.LowPower == MFX_CODINGOPTION_UNKNOWN) tmp.mfx.LowPower = MFX_CODINGOPTION_UNKNOWN; out->IOPattern = tmp.IOPattern; out->Protected = tmp.Protected; out->AsyncDepth = tmp.AsyncDepth; out->mfx = tmp.mfx; // should have same number of buffers MFX_CHECK((in->NumExtParam == out->NumExtParam) && ((!in->ExtParam) == (!out->ExtParam)), MFX_ERR_UNSUPPORTED); // should have same buffers if (in->ExtParam && out->ExtParam) { for (mfxU32 i = 0; i < in->NumExtParam; i++) MFX_CHECK_NULL_PTR1(in->ExtParam[i]); for (mfxU32 i = 0; i < out->NumExtParam; i++) MFX_CHECK_NULL_PTR1(out->ExtParam[i]); for (mfxU32 i = 0; i < in->NumExtParam; i++) { if (in->ExtParam[i]) { if (IsRunTimeOnlyExtBuffer(in->ExtParam[i]->BufferId)) continue; // it's runtime only ext buffer. Nothing to check or correct, just move on. if (in->ExtParam[i]->BufferId == MFX_EXTBUFF_MULTI_FRAME_PARAM || in->ExtParam[i]->BufferId == MFX_EXTBUFF_MULTI_FRAME_CONTROL) continue; // skip checking MFE buffers if (in->ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DENOISE2) continue; // skip checking HVS denoise buffers MFX_CHECK(IsVideoParamExtBufferIdSupported(in->ExtParam[i]->BufferId), MFX_ERR_UNSUPPORTED); // buffer present twice in 'in' MFX_CHECK (mfx::GetExtBuffer( in->ExtParam + i + 1, in->NumExtParam - i - 1, in->ExtParam[i]->BufferId) == 0, MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtBuffer * buf = mfx::GetExtBuffer(out->ExtParam, out->NumExtParam, in->ExtParam[i]->BufferId); MFX_CHECK(buf, MFX_ERR_UNDEFINED_BEHAVIOR); // buffer doesn't present in 'out' mfxExtBuffer * corrected = mfx::GetExtBuffer(tmp.ExtParam, tmp.NumExtParam, in->ExtParam[i]->BufferId); MFX_CHECK_NULL_PTR1(corrected); if (buf->BufferId == MFX_EXTBUFF_MVC_SEQ_DESC) { // mfxExtMVCSeqDesc is complex structure // deep-copy is required if mvc description is fully initialized mfxExtMVCSeqDesc & src = *(mfxExtMVCSeqDesc *)corrected; mfxExtMVCSeqDesc & dst = *(mfxExtMVCSeqDesc *)buf; sts = CheckBeforeCopyQueryLike(dst, src); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); Copy(dst, src); } else { // shallow-copy MFX_INTERNAL_CPY(buf, corrected, corrected->BufferSz); } } } for (mfxU32 i = 0; i < out->NumExtParam; i++) { if (out->ExtParam[i] && mfx::GetExtBuffer(in->ExtParam, in->NumExtParam, out->ExtParam[i]->BufferId) == 0) MFX_RETURN(MFX_ERR_UNSUPPORTED); } } return checkSts; } else if (queryMode == 3) // see MSDK spec for details related to Query mode 3 { mfxStatus checkSts = MFX_ERR_NONE; // encoder isn't initialized. Query() can't operate in mode 3 MFX_CHECK(state, MFX_ERR_UNDEFINED_BEHAVIOR); checkSts = CheckExtBufferId(*in); MFX_CHECK_STS(checkSts); MfxVideoParam newPar = *in; bool isIdrRequired = false; bool isBRCReset = false; ImplementationAvc * AVCEncoder = (ImplementationAvc*)state; checkSts = AVCEncoder->ProcessAndCheckNewParameters(newPar, isBRCReset, isIdrRequired); MFX_CHECK(checkSts >= MFX_ERR_NONE, checkSts); mfxExtEncoderResetOption * extResetOptIn = GetExtBuffer(*in); mfxExtEncoderResetOption * extResetOptOut = GetExtBuffer(*out); if (extResetOptOut != 0) { extResetOptOut->StartNewSequence = extResetOptIn->StartNewSequence; if (extResetOptIn->StartNewSequence == MFX_CODINGOPTION_UNKNOWN) { extResetOptOut->StartNewSequence = mfxU16(isIdrRequired ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF); } } return checkSts; } else if (4 == queryMode)// Query mode 4: Query should do a single thing - report MB processing rate { mfxU32 mbPerSec[16] = {0, }; // let use default values if input resolution is 0x0, 1920x1088 - should cover almost all cases out->mfx.TargetUsage = in->mfx.TargetUsage == 0 ? 4: in->mfx.TargetUsage; mfxExtEncoderCapability * extCaps = GetExtBuffer(*out); // can't return MB processing rate since mfxExtEncoderCapability isn't attached to "out" MFX_CHECK(extCaps, MFX_ERR_UNDEFINED_BEHAVIOR); MfxVideoParam tmp = *in; (void)SetLowPowerDefault(tmp, platform); // query MB processing rate from driver sts = QueryMbProcRate(core, *out, mbPerSec, &tmp); if (IsOn(in->mfx.LowPower) && sts != MFX_ERR_NONE) MFX_RETURN(MFX_ERR_UNSUPPORTED); if (sts != MFX_ERR_NONE) { extCaps->MBPerSec = 0; // driver don't support reporting of MB processing rate MFX_RETURN(MFX_ERR_UNSUPPORTED); // any other HW problem } extCaps->MBPerSec = mbPerSec[out->mfx.TargetUsage-1]; // driver returned status OK and MAX_MB_PER_SEC = 0. Treat this as driver doesn't support reporting of MAX_MB_PER_SEC for requested encoding configuration MFX_CHECK(extCaps->MBPerSec, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } else if (5 == queryMode) { MfxVideoParam tmp = *in; (void)SetLowPowerDefault(tmp, platform); if(IsOn(tmp.mfx.LowPower)) return QueryGuid(core, DXVA2_INTEL_LOWPOWERENCODE_AVC); return QueryGuid(core, DXVA2_Intel_Encode_AVC); } return MFX_ERR_NONE; } mfxStatus ImplementationAvc::QueryIOSurf( VideoCORE * core, mfxVideoParam * par, mfxFrameAllocRequest * request) { mfxU32 inPattern = par->IOPattern & MFX_IOPATTERN_IN_MASK; auto const supportedMemoryType = inPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || inPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY; MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_ENCODE_CAPS hwCaps = {}; MfxVideoParam tmp(*par); eMFXHWType platform = core->GetHWType(); mfxStatus lpSts = SetLowPowerDefault(tmp, platform); mfxStatus sts = QueryHwCaps(core, hwCaps, &tmp); if (IsOn(par->mfx.LowPower) && sts != MFX_ERR_NONE) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } sts = ReadSpsPpsHeaders(tmp); MFX_CHECK_STS(sts); sts = CheckWidthAndHeight(tmp); MFX_CHECK_STS(sts); sts = CopySpsPpsToVideoParam(tmp); MFX_CHECK(sts >= MFX_ERR_NONE, sts); eMFXGTConfig* pMFXGTConfig = QueryCoreInterface(core, MFXICORE_GT_CONFIG_GUID); MFX_CHECK(pMFXGTConfig != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus checkSts = CheckVideoParamQueryLike(tmp, hwCaps, platform, core->GetVAType(), *pMFXGTConfig); MFX_CHECK(checkSts != MFX_ERR_UNSUPPORTED, MFX_ERR_UNSUPPORTED); if (checkSts == MFX_ERR_NONE && lpSts != MFX_ERR_NONE) checkSts = lpSts; SetDefaults(tmp, hwCaps, true, core->GetHWType(), core->GetVAType(), *pMFXGTConfig); if (tmp.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { request->Type = MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY; } else // MFX_IOPATTERN_IN_VIDEO_MEMORY || MFX_IOPATTERN_IN_OPAQUE_MEMORY { request->Type = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET; request->Type |= MFX_MEMTYPE_EXTERNAL_FRAME; } request->NumFrameMin = CalcNumFrameMin(tmp, hwCaps, core->GetHWType()); request->NumFrameSuggested = request->NumFrameMin; // get FrameInfo from original VideoParam request->Info = tmp.mfx.FrameInfo; return MFX_ERR_NONE; } ImplementationAvc::ImplementationAvc(VideoCORE * core) : m_core(core) , m_video() , m_stat() , m_isD3D9SimWithVideoMem(false) , m_sliceDivider() , m_stagesToGo(0) , m_bDeferredFrame(0) , m_fieldCounter(0) , m_1stFieldStatus(MFX_ERR_NONE) , m_frameOrder(0) , m_baseLayerOrder(0) , m_frameOrderIdrInDisplayOrder(0) , m_frameOrderIntraInDisplayOrder(0) , m_frameOrderIPInDisplayOrder(0) , m_frameOrderPyrStart(0) , m_miniGopCount(0) , m_frameOrderStartTScalStructure(0) , m_baseLayerOrderStartIntraRefresh(0) , m_intraStripeWidthInMBs(0) , m_enabledSwBrc(false) , m_hrd() #if defined(MFX_ENABLE_ENCTOOLS) , m_encTools() , m_enabledEncTools(false) #endif , m_maxBsSize(0) , m_caps() , m_failedStatus(MFX_ERR_NONE) , m_inputFrameType(0) , m_NumSlices(0) , m_useMBQPSurf(false) , m_useMbControlSurfs(false) , m_currentPlatform(MFX_HW_UNKNOWN) , m_currentVaType(MFX_HW_NO) , m_isENCPAK(false) , m_resetBRC(false) #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) , m_isPOut(false) , m_modePOut(MFX_PARTIAL_BITSTREAM_NONE) , m_blockPOut(0) , m_offsetMutex() #endif , m_LowDelayPyramidLayer(0) , m_LtrQp(0) , m_LtrOrder(-1) , m_RefQp(0) , m_RefOrder(-1) { memset(&m_recNonRef, 0, sizeof(m_recNonRef)); memset(&m_mbqpInfo, 0, sizeof(m_mbqpInfo)); } ImplementationAvc::~ImplementationAvc() { amtScd.Close(); #ifdef MFX_ENABLE_EXT DestroyDanglingCmResources(); #endif mfxExtCodingOption2 const * extOpt2 = GetExtBuffer(m_video); if (extOpt2 && IsOn(extOpt2->UseRawRef) && (m_inputFrameType == MFX_IOPATTERN_IN_VIDEO_MEMORY)) { // in case of raw references and external frame allocation, encoder needs to unlock DPB surfaces ArrayDpbFrame const & finDpb = m_lastTask.m_dpbPostEncoding; for (mfxU32 i = 0; i < finDpb.Size(); i++) m_core->DecreaseReference(*finDpb[i].m_yuvRaw); } } #ifdef MFX_ENABLE_EXT void ImplementationAvc::DestroyDanglingCmResources() { if (m_cmDevice) { mfxExtCodingOption2 * extOpt2 = GetExtBuffer(m_video); for (DdiTaskIter i = m_lookaheadStarted.begin(), e = m_lookaheadStarted.end(); i != e; ++i) { m_cmCtx->DestroyEvent(i->m_event); if (extOpt2 && (extOpt2->MaxSliceSize == 0)) { int ffid = i->m_fid[0]; ArrayDpbFrame & iniDpb = i->m_dpb[ffid]; for (mfxU32 j = 0; j < iniDpb.Size(); j++) m_cmDevice->DestroySurface(iniDpb[j].m_cmRaw); } m_cmDevice->DestroySurface(i->m_cmRaw); m_cmDevice->DestroyVmeSurfaceG7_5(i->m_cmRefs); m_cmDevice->DestroyVmeSurfaceG7_5(i->m_cmRefsLa); } } } #endif /*Class for modifying and restoring VideoParams. Needed for initialization some components */ class ModifiedVideoParams { public: ModifiedVideoParams() : m_bInit(false), m_RateControlMethod(0), m_LookAheadDepth(0), m_MaxKbps(0), m_MBBRC(0) {} void ModifyForDDI(MfxVideoParam & par, MFX_ENCODE_CAPS &caps, bool bSWBRC) { mfxExtCodingOption2& extOpt2 = GetExtBufferRef(par); bool bMBBRCviaMBQP = IsOn(extOpt2.MBBRC) && (GetMBQPMode(caps, par) != MBQPMode_None); if (!bSWBRC && !bMBBRCviaMBQP) return; if (!m_bInit) SaveParams(par); // in the case of SWBRC driver works in CQP mode if (bSWBRC) par.mfx.RateControlMethod = MFX_RATECONTROL_CQP; if (bMBBRCviaMBQP) extOpt2.MBBRC = MFX_CODINGOPTION_OFF; } void ModifyForBRC(MfxVideoParam & par, bool bSWBRC) { mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); if (!(bSWBRC && extOpt2.MaxSliceSize)) return; if (!m_bInit) SaveParams(par); // int the case of MaxSliceSize BRC works in VBR mode (instead LA) par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; par.mfx.MaxKbps = par.mfx.TargetKbps * 2; extOpt2.LookAheadDepth = 0; } void Restore(MfxVideoParam & par) { if (!m_bInit) return; mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); par.mfx.RateControlMethod = m_RateControlMethod; par.mfx.MaxKbps = m_MaxKbps; extOpt2.LookAheadDepth = m_LookAheadDepth; extOpt2.MBBRC = m_MBBRC; m_bInit = false; } private: bool m_bInit; mfxU16 m_RateControlMethod; mfxU16 m_LookAheadDepth; mfxU16 m_MaxKbps; mfxU16 m_MBBRC; protected: void SaveParams(MfxVideoParam & par) { mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); m_RateControlMethod = par.mfx.RateControlMethod; m_LookAheadDepth= extOpt2.LookAheadDepth; m_MaxKbps = par.mfx.MaxKbps; m_MBBRC = extOpt2.MBBRC; m_bInit = true; } }; #if defined(MFX_ENABLE_MCTF_IN_AVC) mfxStatus ImplementationAvc::InitMctf(const mfxVideoParam* const par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ImplementationAvc::InitMctf"); MFX_CHECK_NULL_PTR1(par); mfxStatus sts = CheckExtBufferId(*par); MFX_CHECK_STS(sts); if (!CommonCaps::IsCmSupported(m_core->GetHWType())) { // init vpp mfxExtVPPDenoise2* extBufDenoise2 = reinterpret_cast(mfx::GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VPP_DENOISE2)); m_hvsDenoiser = std::make_unique(m_core, &sts); MfxVideoParam vppParams = {}; vppParams.AsyncDepth = (mfxU16)m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_MCTF) + 1; vppParams.IOPattern = (m_video.IOPattern & 0x0f) | MFX_IOPATTERN_OUT_VIDEO_MEMORY; vppParams.vpp.In = m_video.mfx.FrameInfo; vppParams.vpp.Out = m_video.mfx.FrameInfo; mfxExtVPPDenoise2 denoiseConfig = {}; denoiseConfig.Header.BufferId = MFX_EXTBUFF_VPP_DENOISE2; denoiseConfig.Header.BufferSz = sizeof(mfxExtVPPDenoise2); denoiseConfig.Mode = extBufDenoise2 ? extBufDenoise2->Mode: MFX_DENOISE_MODE_INTEL_HVS_AUTO_BDRATE; denoiseConfig.Strength = extBufDenoise2 ? extBufDenoise2->Strength: 0; mfxExtBuffer* extBuffer = &denoiseConfig.Header; vppParams.NumExtParam = 1; vppParams.ExtParam = &extBuffer; sts = m_hvsDenoiser->Init(&vppParams); MFX_CHECK_STS(sts); mfxFrameAllocRequest request = { }; request.Info = m_video.mfx.FrameInfo; request.Type &= ~MFX_MEMTYPE_EXTERNAL_FRAME; request.Type |= MFX_MEMTYPE_INTERNAL_FRAME; request.Type |= MFX_MEMTYPE_FROM_VPPOUT; request.NumFrameMin = (mfxU16)m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_MCTF) + (mfxU16)m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_START_ENCODE) + 7; sts = m_mctf.Alloc(m_core, request); MFX_CHECK_STS(sts); } else { if (!m_cmDevice) { m_cmDevice.Reset(TryCreateCmDevicePtr(m_core)); MFX_CHECK_NULL_PTR1(m_cmDevice); } mfxFrameAllocRequest request = { }; request.Info = m_video.mfx.FrameInfo; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = (mfxU16)m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_MCTF) + 1; sts = m_mctf.Alloc(m_core, request); MFX_CHECK_STS(sts); m_mctfDenoiser = std::make_unique(); sts = m_mctfDenoiser->MCTF_INIT(m_core, m_cmDevice, m_video.mfx.FrameInfo, NULL, IsCmNeededForSCD(m_video), true, true, true); MFX_CHECK_STS(sts); } return sts; } #endif mfxStatus ImplementationAvc::InitScd(mfxFrameAllocRequest& request) { mfxStatus sts = MFX_ERR_NONE; request.Info.FourCC = MFX_FOURCC_P8; request.NumFrameMin = mfxU16(m_video.AsyncDepth); request.Info.Width = amtScd.Get_asc_subsampling_width(); request.Info.Height = amtScd.Get_asc_subsampling_height(); #ifdef MFX_ENABLE_EXT if (CommonCaps::IsCmSupported(m_core->GetHWType())) { if (IsCmNeededForSCD(m_video)) { // Use CM if frame is video memory if (!m_cmDevice) { m_cmDevice.Reset(TryCreateCmDevicePtr(m_core)); MFX_CHECK(m_cmDevice, MFX_ERR_UNSUPPORTED); } request.Type = MFX_MEMTYPE_D3D_INT; sts = m_scd.AllocCmSurfacesUP(m_cmDevice, request); MFX_CHECK_STS(sts); } else { // No need to use CM if frame is sys memory request.Type = MFX_MEMTYPE_SYS_INT; sts = m_scd.AllocFrames(m_core, request); MFX_CHECK_STS(sts); } } else #endif { m_vppHelperScaling.reset(new MfxVppHelper(m_core, &sts)); MFX_CHECK_STS(sts); MfxVideoParam vppParams = {}; vppParams.AsyncDepth = 1; vppParams.IOPattern = (m_video.IOPattern & 0x0f) | MFX_IOPATTERN_OUT_SYSTEM_MEMORY; vppParams.vpp.In = m_video.mfx.FrameInfo; vppParams.vpp.Out = m_video.mfx.FrameInfo; vppParams.vpp.Out.CropX = 0; vppParams.vpp.Out.CropY = 0; vppParams.vpp.Out.CropW = amtScd.Get_asc_subsampling_width(); vppParams.vpp.Out.CropH = amtScd.Get_asc_subsampling_height(); vppParams.vpp.Out.Width = amtScd.Get_asc_subsampling_width(); vppParams.vpp.Out.Height = amtScd.Get_asc_subsampling_height(); mfxExtVPPScaling m_scalingConfig = {}; m_scalingConfig.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; m_scalingConfig.Header.BufferSz = sizeof(mfxExtVPPScaling); m_scalingConfig.ScalingMode = MFX_SCALING_MODE_LOWPOWER; m_scalingConfig.InterpolationMethod = MFX_INTERPOLATION_NEAREST_NEIGHBOR; mfxExtBuffer* extBuffer = &m_scalingConfig.Header; vppParams.NumExtParam = 1; vppParams.ExtParam = &extBuffer; sts = m_vppHelperScaling->Init(&vppParams); MFX_CHECK_STS(sts); } sts = amtScd.Init(m_video.mfx.FrameInfo.CropW, m_video.mfx.FrameInfo.CropH, m_video.mfx.FrameInfo.Width, m_video.mfx.FrameInfo.PicStruct, #ifdef MFX_ENABLE_KERNELS m_cmDevice, #endif IsCmNeededForSCD(m_video)); MFX_CHECK_STS(sts); return sts; } mfxStatus ImplementationAvc::Init(mfxVideoParam * par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ImplementationAvc::Init"); mfxStatus sts = CheckExtBufferId(*par); MFX_CHECK_STS(sts); m_video = *par; eMFXHWType platform = m_core->GetHWType(); mfxStatus lpSts = SetLowPowerDefault(m_video, platform); sts = ReadSpsPpsHeaders(m_video); MFX_CHECK_STS(sts); sts = CheckWidthAndHeight(m_video); MFX_CHECK_STS(sts); m_ddi.reset(CreatePlatformH264Encoder(m_core)); if (m_ddi.get() == 0) return MFX_ERR_UNSUPPORTED; GUID guid; if (IsOn(m_video.mfx.LowPower)) { guid = DXVA2_INTEL_LOWPOWERENCODE_AVC; } else { guid = DXVA2_Intel_Encode_AVC; } sts = m_ddi->CreateAuxilliaryDevice( m_core, guid, GetFrameWidth(m_video), GetFrameHeight(m_video)); if (sts != MFX_ERR_NONE) return MFX_ERR_UNSUPPORTED; sts = m_ddi->QueryEncodeCaps(m_caps); if (sts != MFX_ERR_NONE) return MFX_ERR_UNSUPPORTED; m_currentPlatform = platform; m_currentVaType = m_core->GetVAType(); mfxStatus spsppsSts = CopySpsPpsToVideoParam(m_video); eMFXGTConfig* pMFXGTConfig = QueryCoreInterface(m_core, MFXICORE_GT_CONFIG_GUID); MFX_CHECK(pMFXGTConfig != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); bool vpl_interface = SupportsVPLFeatureSet(*m_core); mfxStatus checkStatus = CheckVideoParam(m_video, m_caps , m_core->IsExternalFrameAllocator() || vpl_interface , m_currentPlatform, m_currentVaType, *pMFXGTConfig, true); if (checkStatus < MFX_ERR_NONE) return checkStatus; else if (checkStatus == MFX_ERR_NONE) checkStatus = spsppsSts; if (checkStatus == MFX_ERR_NONE && lpSts != MFX_ERR_NONE) // transfer MFX_WRN_INCOMPATIBLE_VIDEO_PARAM to upper level checkStatus = lpSts; // CQP enabled mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(m_video); #if defined(MFX_ENABLE_EXT_BRC) m_enabledSwBrc = bRateControlLA(m_video.mfx.RateControlMethod) || (IsOn(extOpt2.ExtBRC) && (m_video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || m_video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); #else m_enabledSwBrc = bRateControlLA(m_video.mfx.RateControlMethod); #endif // need it for both ENCODE and ENC m_hrd.Setup(m_video); #if defined(MFX_ENABLE_ENCTOOLS) if (H264EncTools::isEncToolNeeded(m_video)) { if (MFX_HW_D3D11 == m_currentVaType || MFX_HW_D3D9 == m_currentVaType || MFX_HW_VAAPI == m_currentVaType) { mfxHandleType h_type = (MFX_HW_D3D11 == m_currentVaType ? MFX_HANDLE_D3D11_DEVICE : (MFX_HW_D3D9 == m_currentVaType ? MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 : MFX_HANDLE_VA_DISPLAY)); mfxHDL device_handle = nullptr; m_core->GetHandle(h_type, &device_handle); mfxFrameAllocator* pFrameAlloc = QueryCoreInterface(m_core, MFXIEXTERNALLOC_GUID); mfxEncToolsCtrlExtDevice & extBufDevice = GetExtBufferRef(m_video); extBufDevice.DeviceHdl = device_handle; extBufDevice.HdlType = h_type; mfxEncToolsCtrlExtAllocator & extBufAlloc = GetExtBufferRef(m_video); extBufAlloc.pAllocator = pFrameAlloc; } sts = m_encTools.Init(m_video); MFX_CHECK_STS(sts); m_enabledEncTools = true; if (m_encTools.IsBRC()) m_enabledSwBrc = true; } #endif if (m_enabledSwBrc) { #if defined (MFX_ENABLE_ENCTOOLS) // to change m_video before BRC Init and DDI init ModifiedVideoParams mod_params; if (!m_enabledEncTools) { m_brc.SetImpl(CreateBrc(m_video, m_caps)); // to change m_video before BRC Init and DDI init mod_params.ModifyForBRC(m_video, true); m_brc.Init(m_video); mod_params.Restore(m_video); } mod_params.ModifyForDDI(m_video, m_caps, true); sts = m_ddi->CreateAccelerationService(m_video); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); mod_params.Restore(m_video); #else m_brc.SetImpl(CreateBrc(m_video, m_caps)); // to change m_video before BRC Init and DDI init ModifiedVideoParams mod_params; mod_params.ModifyForBRC(m_video, true); m_brc.Init(m_video); mod_params.Restore(m_video); mod_params.ModifyForDDI(m_video, m_caps, true); sts = m_ddi->CreateAccelerationService(m_video); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); mod_params.Restore(m_video); #endif } else { sts = m_ddi->CreateAccelerationService(m_video); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); } if (IsOn(extOpt2.EnableMAD)) { ENCODE_ENC_CTRL_CAPS c_caps = {}; sts = m_ddi->QueryEncCtrlCaps(c_caps); if (sts == MFX_ERR_NONE && c_caps.MAD) { m_ddi->GetEncCtrlCaps(c_caps); if (!c_caps.MAD) { c_caps.MAD = 1; sts = m_ddi->SetEncCtrlCaps(c_caps); MFX_CHECK_STS(sts); } } else { extOpt2.EnableMAD = MFX_CODINGOPTION_OFF; checkStatus = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } mfxFrameAllocRequest request = { }; request.Info = m_video.mfx.FrameInfo; mfxU32 adaptGopDelay = 0; #if defined(MFX_ENABLE_ENCTOOLS) adaptGopDelay = H264EncTools::GetPreEncDelay(m_video); #endif m_emulatorForSyncPart.Init(m_video, adaptGopDelay, m_core->GetHWType()); m_emulatorForAsyncPart = m_emulatorForSyncPart; // Allocate raw surfaces. // This is required only in case of system memory at input m_isD3D9SimWithVideoMem = IsD3D9Simulation(*m_core) && (m_video.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); if (m_video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || m_isD3D9SimWithVideoMem) { request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(CalcNumSurfRaw(m_video)); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MfxFrameAllocResponse Alloc"); sts = m_raw.Alloc(m_core, request, true); } MFX_CHECK_STS(sts); } mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(m_video); bool bPanicModeSupport = m_enabledSwBrc; if (m_raw.NumFrameActual == 0 && bPanicModeSupport) { request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(m_video.AsyncDepth); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MfxFrameAllocResponse Alloc"); sts = m_rawSkip.Alloc(m_core, request, true); } MFX_CHECK_STS(sts); } m_inputFrameType = m_video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_IOPATTERN_IN_SYSTEM_MEMORY : MFX_IOPATTERN_IN_VIDEO_MEMORY; // ENC+PAK always needs separate chain for reconstructions produced by PAK. bool bParallelEncPak = (m_video.mfx.RateControlMethod == MFX_RATECONTROL_CQP && m_video.mfx.GopRefDist > 2 && m_video.AsyncDepth > 2); //in case if RGB or YUY2 passed we still need encode in 420 request.Info.FourCC = MFX_FOURCC_NV12; request.Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(m_video.mfx.NumRefFrame + m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_ENCODE) + bParallelEncPak); request.Type |= MFX_MEMTYPE_INTERNAL_FRAME; //For MMCD encoder bind flag is required, panic mode using reconstruct frame copy for refframe skipping, where no warranty that compressed frame will be processed proper way. if (!bIntRateControlLA(par->mfx.RateControlMethod)) { request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; } // Recon surface width/height must be align at 16 mfxU16 width = request.Info.Width; mfxU16 height = request.Info.Height; request.Info.Width = mfx::align2_value(width, 16); request.Info.Height = mfx::align2_value(height, 16); sts = m_rec.Alloc(m_core, request, bPanicModeSupport); MFX_CHECK_STS(sts); request.Info.Width = width; request.Info.Height = height; sts = m_ddi->Register(m_rec.NumFrameActual ? m_rec : m_raw, D3DDDIFMT_NV12); MFX_CHECK_STS(sts); m_recFrameOrder.resize(request.NumFrameMin, 0xffffffff); m_recNonRef[0] = m_recNonRef[1] = 0xffffffff; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if (mfxExtPartialBitstreamParam const * bo = GetExtBuffer(*par)) //need to check original par, because m_video always contains all buffers { //check for bitstream patching bool needIntermediateBitstreamBuffer = m_video.calcParam.numTemporalLayer > 0 || (m_video.mfx.NumRefFrame & 1); mfxExtSpsHeader const & extSps = GetExtBufferRef(m_video); mfxExtPpsHeader const & extPps = GetExtBufferRef(m_video); mfxU8 constraintFlags = (extSps.constraints.set0 << 7) | (extSps.constraints.set1 << 6) | (extSps.constraints.set2 << 5) | (extSps.constraints.set3 << 4) | (extSps.constraints.set4 << 3) | (extSps.constraints.set5 << 2) | (extSps.constraints.set6 << 1) | (extSps.constraints.set7 << 0); bool inPlacePatchNeeded = constraintFlags != 0 || extSps.nalRefIdc != 1 || extPps.nalRefIdc != 1 || extSps.gapsInFrameNumValueAllowedFlag == 1 || (extSps.maxNumRefFrames & 1); bool doPatch = (IsOn(m_video.mfx.LowPower) && (m_video.calcParam.numTemporalLayer > 0)) || needIntermediateBitstreamBuffer || inPlacePatchNeeded; if ((!(IsOn(m_video.mfx.LowPower) && (m_video.calcParam.numTemporalLayer > 0)) && m_caps.ddi_caps.HeaderInsertion == 0) || m_video.Protected != 0) doPatch = needIntermediateBitstreamBuffer = false; m_isPOut = !doPatch; MFX_CHECK(!doPatch, MFX_ERR_INVALID_VIDEO_PARAM); m_modePOut = bo->Granularity; MFX_CHECK((bo->Granularity >= MFX_PARTIAL_BITSTREAM_NONE && bo->Granularity <= MFX_PARTIAL_BITSTREAM_ANY), MFX_ERR_INVALID_VIDEO_PARAM); if (m_modePOut == MFX_PARTIAL_BITSTREAM_NONE || (m_modePOut == MFX_PARTIAL_BITSTREAM_SLICE && par->mfx.NumSlice < 2)) { //No sense to use PO for 1 slice m_isPOut = false; } else if (m_modePOut == MFX_PARTIAL_BITSTREAM_BLOCK) { MFX_CHECK((bo->BlockSize != 0), MFX_ERR_INVALID_VIDEO_PARAM); m_blockPOut = bo->BlockSize; } } #endif if (GetMBQPMode(m_caps, m_video) ) { m_useMBQPSurf = true; m_mbqpInfo.block_height = 16; m_mbqpInfo.block_width = 16; m_mbqpInfo.width = m_video.mfx.FrameInfo.Width / 16; m_mbqpInfo.height = m_video.mfx.FrameInfo.Height / 16; m_mbqpInfo.NumFrameMin = IsEnctoolsLAGS(m_video) ? m_rec.NumFrameActual: mfxU16(m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_ENCODE) + bParallelEncPak); if (IsFieldCodingPossible(m_video)) m_mbqpInfo.NumFrameMin *= 2; m_mbqpInfo.pitch = 0; { m_mbqpInfo.pitch = mfx::align2_value(m_mbqpInfo.width, 64); m_mbqpInfo.height_aligned = mfx::align2_value(m_mbqpInfo.height, IsFieldCodingPossible(m_video) ? 16 : 8); m_mbqpInfo.Info.Width = (mfxU16)m_mbqpInfo.pitch ; m_mbqpInfo.Info.Height = (mfxU16)m_mbqpInfo.height_aligned; m_mbqpInfo.Info.FourCC = MFX_FOURCC_P8; m_mbqpInfo.Type = (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_INTERNAL_FRAME); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MfxFrameAllocResponse Alloc"); sts = m_mbqp.Alloc(m_core, m_mbqpInfo, false); } MFX_CHECK_STS(sts); } // Allocate surfaces for bitstreams. // Need at least one such surface and more for async-mode. sts = m_ddi->QueryCompBufferInfo(D3DDDIFMT_INTELENCODE_BITSTREAMDATA, request); MFX_CHECK_STS(sts); request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = (mfxU16)m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_ENCODE); if (IsFieldCodingPossible(m_video)) request.NumFrameMin *= 2; // 2 bitstream surfaces per frame // driver may suggest too small buffer for bitstream request.Info.Width = std::max(request.Info.Width, m_video.mfx.FrameInfo.Width); if (MFX_RATECONTROL_CQP == m_video.mfx.RateControlMethod && !IsMemoryConstrainedScenario(extOpt3.ScenarioInfo)) request.Info.Height = std::max(request.Info.Height, m_video.mfx.FrameInfo.Height * 3); else request.Info.Height = std::max(request.Info.Height, m_video.mfx.FrameInfo.Height * 3 / 2); // workaround for high bitrates on small resolutions, // as driver do not respect coded buffer size we have to provide buffer large enough if (MFX_RATECONTROL_CQP != m_video.mfx.RateControlMethod) { const mfxU32 hrdBufSize = m_video.calcParam.bufferSizeInKB * 1000; if (hrdBufSize > static_cast(request.Info.Width * request.Info.Height)) request.Info.Height = mfx::align2_value(static_cast(hrdBufSize / request.Info.Width), 16); } //limit bs size to 4095*nMBs + slice_hdr_size * nSlice if (!IsMemoryConstrainedScenario(extOpt3.ScenarioInfo)) { const mfxU32 SLICE_BUFFER_SIZE = 2048; //from HeaderPacker const mfxU32 MAX_MB_SIZE = 512; //4095 bits in bytes const mfxU32 nMBs = (m_video.mfx.FrameInfo.Width * m_video.mfx.FrameInfo.Height) / 256; const mfxU32 maxNumSlices = std::max(GetMaxNumSlices(m_video), 1); const mfxU32 maxBufSize = MAX_MB_SIZE * nMBs + SLICE_BUFFER_SIZE * maxNumSlices; if (maxBufSize > static_cast(request.Info.Width * request.Info.Height)) request.Info.Height = mfx::align2_value(static_cast(maxBufSize / request.Info.Width), 16); } m_maxBsSize = request.Info.Width * request.Info.Height; m_NumSlices = mfx::CeilDiv(m_video.mfx.FrameInfo.Height, 16); sts = m_bit.Alloc(m_core, request, false); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_EXT if (IsOn(extOpt3.FadeDetection) || bIntRateControlLA(m_video.mfx.RateControlMethod)) { m_cmDevice.Reset(TryCreateCmDevicePtr(m_core)); if (m_cmDevice == NULL) MFX_RETURN(MFX_ERR_UNSUPPORTED); m_cmCtx.reset(new CmContext(m_video, m_cmDevice, m_core)); } if (bIntRateControlLA(m_video.mfx.RateControlMethod)) { request.Info.Width = m_video.calcParam.widthLa; request.Info.Height = m_video.calcParam.heightLa; mfxU32 numMb = request.Info.Width * request.Info.Height / 256; mfxI32 numVME = m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_WAIT_LA) + m_emulatorForSyncPart.GetStageGreediness(AsyncRoutineEmulator::STG_START_ENCODE) - 1; numVME = numVME < (m_video.mfx.GopRefDist + 1) ? (m_video.mfx.GopRefDist + 1) : numVME; m_vmeDataStorage.resize(numVME); for (size_t i = 0; i < m_vmeDataStorage.size(); i++) m_vmeDataStorage[i].mb.resize(numMb); m_tmpVmeData.reserve(extOpt2.LookAheadDepth); if (extOpt2.LookAheadDS > MFX_LOOKAHEAD_DS_OFF) { request.Info.FourCC = MFX_FOURCC_NV12; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(m_video.mfx.NumRefFrame + m_video.AsyncDepth); sts = m_rawLa.AllocCmSurfaces(m_cmDevice, request); MFX_CHECK_STS(sts); } request.Info.Width = m_video.calcParam.widthLa / 16 * sizeof(LAOutObject); request.Info.Height = m_video.calcParam.heightLa / 16; request.Info.FourCC = MFX_FOURCC_P8; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(m_video.mfx.NumRefFrame + m_video.AsyncDepth); sts = m_mb.AllocCmBuffersUp(m_cmDevice, request); MFX_CHECK_STS(sts); request.Info.Width = sizeof(CURBEData); request.Info.Height = 1; request.Info.FourCC = MFX_FOURCC_P8; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = 1 + !!(m_video.AsyncDepth > 1); sts = m_curbe.AllocCmBuffers(m_cmDevice, request); MFX_CHECK_STS(sts); } #endif #ifdef MFX_ENABLE_FADE_DETECTION if (IsOn(extOpt3.FadeDetection) && m_cmCtx.get() && m_cmCtx->isHistogramSupported()) { request.Info.Width = 256 * 2 * sizeof(uint); request.Info.Height = 1; request.Info.FourCC = MFX_FOURCC_P8; request.Type = MFX_MEMTYPE_D3D_INT; request.NumFrameMin = mfxU16(m_video.mfx.NumRefFrame + m_video.AsyncDepth); sts = m_histogram.AllocCmBuffersUp(m_cmDevice, request); MFX_CHECK_STS(sts); } #endif if (IsExtBrcSceneChangeSupported(m_video, m_core->GetHWType()) #if defined(MFX_ENABLE_ENCTOOLS) && !(m_enabledEncTools) #endif ) { sts = InitScd(request); MFX_CHECK_STS(sts); } #if defined(MFX_ENABLE_MCTF_IN_AVC) if (IsDenoiserSupported(m_video, m_core->GetHWType())) { sts = InitMctf(par); MFX_CHECK_STS(sts); } #endif sts = m_ddi->Register(m_bit, D3DDDIFMT_INTELENCODE_BITSTREAMDATA); MFX_CHECK_STS(sts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "cleanup"); m_free.resize(m_emulatorForSyncPart.GetTotalGreediness() + m_video.AsyncDepth - 1); m_incoming.clear(); m_ScDetectionStarted.clear(); m_ScDetectionFinished.clear(); m_MctfStarted.clear(); m_MctfFinished.clear(); m_reordering.clear(); m_lookaheadStarted.clear(); m_lookaheadFinished.clear(); m_histRun.clear(); m_histWait.clear(); m_encoding.clear(); } m_fieldCounter = 0; m_1stFieldStatus = MFX_ERR_NONE; m_frameOrder = 0; m_stagesToGo = AsyncRoutineEmulator::STG_BIT_CALL_EMULATOR; m_bDeferredFrame = 0; m_failedStatus = MFX_ERR_NONE; m_baseLayerOrder = 0; m_frameOrderIdrInDisplayOrder = 0; m_frameOrderIntraInDisplayOrder = 0; m_frameOrderIPInDisplayOrder = 0; m_frameOrderPyrStart = 0; m_miniGopCount = 0; m_frameOrderStartTScalStructure = 0; m_lastTask = DdiTask(); // initialization of parameters for Intra refresh if (extOpt2.IntRefType) { if (extOpt2.IntRefType == MFX_REFRESH_SLICE) { m_intraStripeWidthInMBs = 0; } else { mfxU16 refreshDimension = extOpt2.IntRefType == MFX_REFRESH_HORIZONTAL ? m_video.mfx.FrameInfo.Height >> 4 : m_video.mfx.FrameInfo.Width >> 4; m_intraStripeWidthInMBs = (refreshDimension + extOpt2.IntRefCycleSize - 1) / extOpt2.IntRefCycleSize; } m_baseLayerOrderStartIntraRefresh = 0; } Zero(m_stat); // required for slice header patching if (isBitstreamUpdateRequired(m_video, m_caps, m_currentPlatform)) m_tmpBsBuf.resize(m_maxBsSize); const size_t MAX_SEI_SIZE = 10 * 1024; const size_t MAX_FILLER_SIZE = m_video.mfx.FrameInfo.Width * m_video.mfx.FrameInfo.Height; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Preallocated Vector Alloc"); m_sei.Alloc(mfxU32(MAX_SEI_SIZE + MAX_FILLER_SIZE)); } #ifndef MFX_ENABLE_H264_REPARTITION_CHECK MFX_CHECK(extOpt3.RepartitionCheckEnable == MFX_CODINGOPTION_UNKNOWN, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); #endif //MFX_ENABLE_H264_REPARTITION_CHECK // init slice divider bool fieldCoding = (m_video.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; bool isSliceSizeConformanceEnabled = extOpt2.MaxSliceSize && (IsDriverSliceSizeControlEnabled(m_video, m_caps) || (SliceDividerType(m_caps.ddi_caps.SliceLevelRateCtrl) == SliceDividerType::ARBITRARY_MB_SLICE && H264ECaps::IsVmeSupported(platform))); m_sliceDivider = MakeSliceDivider( (isSliceSizeConformanceEnabled) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(m_caps.ddi_caps.SliceStructure), extOpt2.NumMbPerSlice, extOpt3.NumSliceP, m_video.mfx.FrameInfo.Width / 16, m_video.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); m_videoInit = m_video; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) m_qpHistory.Reset(); #endif return checkStatus; } mfxStatus ImplementationAvc::ProcessAndCheckNewParameters( MfxVideoParam & newPar, bool & brcReset, bool & isIdrRequired, mfxVideoParam const * newParIn) { mfxStatus sts = MFX_ERR_NONE; mfxExtEncoderResetOption & extResetOpt = GetExtBufferRef(newPar); sts = ReadSpsPpsHeaders(newPar); MFX_CHECK_STS(sts); mfxStatus spsppsSts = CopySpsPpsToVideoParam(newPar); //set NumSliceI/P/B to Numslice if not set by new parameters. ResetNumSliceIPB(newPar); InheritDefaultValues(m_video, newPar, m_caps, newParIn); eMFXGTConfig* pMFXGTConfig = QueryCoreInterface(m_core, MFXICORE_GT_CONFIG_GUID); MFX_CHECK(pMFXGTConfig != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); bool vpl_interface = SupportsVPLFeatureSet(*m_core); mfxStatus checkStatus = CheckVideoParam(newPar, m_caps , m_core->IsExternalFrameAllocator() || vpl_interface , m_currentPlatform, m_currentVaType, *pMFXGTConfig); if (checkStatus < MFX_ERR_NONE) return checkStatus; else if (checkStatus == MFX_ERR_NONE) checkStatus = spsppsSts; // check if change of temporal scalability required by new parameters mfxU32 tempLayerIdx = 0; bool changeTScalLayers = false; if (m_video.calcParam.tempScalabilityMode && newPar.calcParam.tempScalabilityMode) { // calculate temporal layer for next frame tempLayerIdx = CalcTemporalLayerIndex(m_video, m_frameOrder - m_frameOrderStartTScalStructure); changeTScalLayers = m_video.calcParam.numTemporalLayer != newPar.calcParam.numTemporalLayer; } mfxExtSpsHeader const & extSpsNew = GetExtBufferRef(newPar); mfxExtSpsHeader const & extSpsOld = GetExtBufferRef(m_video); mfxExtCodingOption2 const & extOpt2New = GetExtBufferRef(newPar); mfxExtCodingOption2 const & extOpt2Old = GetExtBufferRef(m_video); mfxExtCodingOption3 const & extOpt3New = GetExtBufferRef(newPar); if(!IsOn(m_video.mfx.LowPower)) { MFX_CHECK((extOpt2New.MaxSliceSize != 0) == (extOpt2Old.MaxSliceSize != 0), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } auto const LARateControl = m_video.mfx.RateControlMethod == MFX_RATECONTROL_LA || m_video.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD; MFX_CHECK(!(LARateControl && !IsOn(m_video.mfx.LowPower) && extOpt2New.MaxSliceSize == 0), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // check if IDR required after change of encoding parameters bool isSpsChanged = extSpsNew.vuiParametersPresentFlag == 0 ? memcmp(&extSpsNew, &extSpsOld, sizeof(mfxExtSpsHeader) - sizeof(VuiParameters)) != 0 : !Equal(extSpsNew, extSpsOld); isIdrRequired = isSpsChanged || (tempLayerIdx != 0 && changeTScalLayers) || newPar.mfx.GopPicSize != m_video.mfx.GopPicSize; if (isIdrRequired && IsOff(extResetOpt.StartNewSequence)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); // Reset can't change parameters w/o IDR. Report an error mfxExtCodingOption & extOptNew = GetExtBufferRef(newPar); mfxExtCodingOption & extOptOld = GetExtBufferRef(m_video); brcReset = m_video.calcParam.targetKbps != newPar.calcParam.targetKbps || m_video.calcParam.maxKbps != newPar.calcParam.maxKbps; MFX_CHECK( IsAvcProfile(newPar.mfx.CodecProfile) && m_video.AsyncDepth == newPar.AsyncDepth && m_videoInit.mfx.GopRefDist >= newPar.mfx.GopRefDist && m_videoInit.mfx.NumSlice >= newPar.mfx.NumSlice && m_videoInit.mfx.NumRefFrame >= newPar.mfx.NumRefFrame && m_video.mfx.RateControlMethod == newPar.mfx.RateControlMethod && m_videoInit.mfx.FrameInfo.Width >= newPar.mfx.FrameInfo.Width && m_videoInit.mfx.FrameInfo.Height >= newPar.mfx.FrameInfo.Height && m_video.mfx.FrameInfo.ChromaFormat == newPar.mfx.FrameInfo.ChromaFormat && extOpt2Old.ExtBRC == extOpt2New.ExtBRC, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (m_video.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { MFX_CHECK( m_video.calcParam.initialDelayInKB == newPar.calcParam.initialDelayInKB && m_video.calcParam.bufferSizeInKB == newPar.calcParam.bufferSizeInKB, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } MFX_CHECK( IsOn(extOptOld.FieldOutput) || extOptOld.FieldOutput == extOptNew.FieldOutput, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK( IsOn(m_video.mfx.LowPower) == IsOn(newPar.mfx.LowPower), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // we can use feature only if sufs was allocated on init if (IsOn(extOpt3New.EnableMBForceIntra) && m_useMbControlSurfs == false) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (IsOn(extOpt3New.FadeDetection) #ifdef MFX_ENABLE_FADE_DETECTION && !(m_cmCtx.get() && m_cmCtx->isHistogramSupported()) #endif ) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (bIntRateControlLA(m_video.mfx.RateControlMethod) ) { MFX_CHECK(extOpt2Old.LookAheadDepth >= extOpt2New.LookAheadDepth, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } #if defined(MFX_ENABLE_EXT_BRC) if (IsOn(extOpt2Old.ExtBRC)) { mfxExtBRC & extBRCInit = GetExtBufferRef(m_video); mfxExtBRC & extBRCReset = GetExtBufferRef(newPar); MFX_CHECK( extBRCInit.pthis == extBRCReset.pthis && extBRCInit.Init == extBRCReset.Init && extBRCInit.Reset == extBRCReset.Reset && extBRCInit.Close == extBRCReset.Close && extBRCInit.GetFrameCtrl == extBRCReset.GetFrameCtrl && extBRCInit.Update == extBRCReset.Update, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } #endif return checkStatus; } // ProcessAndCheckNewParameters mfxStatus ImplementationAvc::Reset(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(par); sts = CheckExtBufferId(*par); MFX_CHECK_STS(sts); MfxVideoParam newPar = *par; mfxExtCodingOption2 & extOpt2New = GetExtBufferRef(newPar); mfxExtCodingOption2 & extOpt2Old = GetExtBufferRef(m_video); bool isIdrRequired = false; bool isBRCReset = false; mfxStatus checkStatus = ProcessAndCheckNewParameters(newPar, isBRCReset, isIdrRequired, par); if (checkStatus < MFX_ERR_NONE) return checkStatus; mfxExtCodingOption3 & extOpt3New = GetExtBufferRef(newPar); mfxExtCodingOption3 & extOpt3Old = GetExtBufferRef(m_video); if (extOpt3New.NumSliceP != extOpt3Old.NumSliceP || ((extOpt2New.IntRefType != extOpt2Old.IntRefType) && (extOpt2New.IntRefType != 0))) // reset slice divider { bool fieldCoding = (newPar.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; bool isSliceSizeConformanceEnabled = extOpt2New.MaxSliceSize && (IsDriverSliceSizeControlEnabled(m_video, m_caps) || (SliceDividerType(m_caps.ddi_caps.SliceLevelRateCtrl) == SliceDividerType::ARBITRARY_MB_SLICE && H264ECaps::IsVmeSupported(m_core->GetHWType()))); m_sliceDivider = MakeSliceDivider( isSliceSizeConformanceEnabled ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(m_caps.ddi_caps.SliceStructure), extOpt2New.NumMbPerSlice, extOpt3New.NumSliceP, newPar.mfx.FrameInfo.Width / 16, newPar.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); if (extOpt2New.IntRefType == MFX_REFRESH_SLICE) m_baseLayerOrderStartIntraRefresh = m_baseLayerOrder - 1; } // m_encoding contains few submitted and not queried tasks, wait for their completion for (DdiTaskIter i = m_encoding.begin(); i != m_encoding.end(); ++i) for (mfxU32 f = 0; f <= i->m_fieldPicFlag; f++) while ((sts = QueryStatus(*i, i->m_fid[f])) == MFX_TASK_BUSY) std::this_thread::sleep_for(1ms); while (!m_encoding.empty()) OnEncodingQueried(m_encoding.begin()); #ifdef MFX_ENABLE_EXT DestroyDanglingCmResources(); #endif mfxU32 adaptGopDelay = 0; #if defined(MFX_ENABLE_ENCTOOLS) adaptGopDelay = m_encTools.GetPreEncDelay(newPar); #endif m_emulatorForSyncPart.Init(newPar, adaptGopDelay, m_core->GetHWType()); m_emulatorForAsyncPart = m_emulatorForSyncPart; m_hrd.Reset(newPar); // to change m_video before DDI Reset ModifiedVideoParams mod_par; mod_par.ModifyForDDI(newPar, m_caps, m_enabledSwBrc); m_ddi->Reset(newPar); mod_par.Restore(newPar); m_1stFieldStatus = MFX_ERR_NONE; m_fieldCounter = 0; m_stagesToGo = AsyncRoutineEmulator::STG_BIT_CALL_EMULATOR; m_bDeferredFrame = 0; mfxExtEncoderResetOption const & extResetOpt = GetExtBufferRef(newPar); // perform reset of encoder and start new sequence with IDR in following cases: // 1) change of encoding parameters require insertion of IDR // 2) application explicitly asked about starting new sequence if (isIdrRequired || IsOn(extResetOpt.StartNewSequence)) { if (extOpt2Old.MaxSliceSize && m_lastTask.m_yuv && m_video.mfx.LowPower != MFX_CODINGOPTION_ON) { if (m_raw.Unlock(m_lastTask.m_idx) == (mfxU32)-1) { m_core->DecreaseReference(*m_lastTask.m_yuv); } #ifdef MFX_ENABLE_EXT if (m_cmDevice) { m_cmDevice->DestroySurface(m_lastTask.m_cmRaw); m_lastTask.m_cmRaw = NULL; } #endif } m_free.splice(m_free.end(), m_incoming); m_free.splice(m_free.end(), m_reordering); m_free.splice(m_free.end(), m_lookaheadStarted); m_free.splice(m_free.end(), m_lookaheadFinished); m_free.splice(m_free.end(), m_histRun); m_free.splice(m_free.end(), m_histWait); m_free.splice(m_free.end(), m_encoding); for (DdiTaskIter i = m_free.begin(); i != m_free.end(); ++i) { if (i->m_yuv) m_core->DecreaseReference(*i->m_yuv); *i = DdiTask(); } Zero(m_stat); m_lastTask = DdiTask(); m_frameOrder = 0; m_baseLayerOrder = 0; m_frameOrderIdrInDisplayOrder = 0; m_frameOrderIntraInDisplayOrder = 0; m_frameOrderPyrStart = 0; m_frameOrderIPInDisplayOrder = 0; m_miniGopCount = 0; m_frameOrderStartTScalStructure = 0; m_1stFieldStatus = MFX_ERR_NONE; m_fieldCounter = 0; m_raw.Unlock(); m_rawLa.Unlock(); m_mb.Unlock(); m_rawSys.Unlock(); m_rec.Unlock(); m_bit.Unlock(); m_recNonRef[0] = m_recNonRef[1] = 0xffffffff; // reset of Intra refresh if (extOpt2New.IntRefType) { if (extOpt2New.IntRefType == MFX_REFRESH_SLICE) { m_intraStripeWidthInMBs = 0; } else { mfxU16 refreshDimension = extOpt2New.IntRefType == MFX_REFRESH_HORIZONTAL ? m_video.mfx.FrameInfo.Height >> 4 : m_video.mfx.FrameInfo.Width >> 4; m_intraStripeWidthInMBs = (refreshDimension + extOpt2New.IntRefCycleSize - 1) / extOpt2New.IntRefCycleSize; } m_baseLayerOrderStartIntraRefresh = 0; } } else { if (m_video.calcParam.tempScalabilityMode && newPar.calcParam.tempScalabilityMode && m_video.calcParam.numTemporalLayer != newPar.calcParam.numTemporalLayer) { // reset starting point of temporal scalability calculation if number of temporal layers was changed w/o IDR m_frameOrderStartTScalStructure = m_frameOrder; } if ((extOpt2New.IntRefType) && (extOpt2New.IntRefType != MFX_REFRESH_SLICE)) { sts = UpdateIntraRefreshWithoutIDR( m_video, newPar, m_baseLayerOrder, m_baseLayerOrderStartIntraRefresh, m_baseLayerOrderStartIntraRefresh, m_intraStripeWidthInMBs, m_sliceDivider, m_caps); MFX_CHECK_STS(sts); } } m_video = newPar; bool bModParams = false; if (m_enabledSwBrc) { if (isIdrRequired) { mfxExtEncoderResetOption & resetOption = GetExtBufferRef(newPar); resetOption.StartNewSequence = MFX_CODINGOPTION_ON; } mod_par.ModifyForBRC(newPar, true); bModParams = true; } #if defined(MFX_ENABLE_ENCTOOLS) if (H264EncTools::isEncToolNeeded(m_video)) { sts = m_encTools.Reset(newPar); MFX_CHECK_STS(sts); } else #endif #if defined(MFX_ENABLE_EXT_BRC) if (m_enabledSwBrc) { sts = m_brc.Reset(newPar); MFX_CHECK_STS(sts); } #else {} #endif if (bModParams) mod_par.Restore(newPar); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) //reconfigure partial output on reset if it exists in ext buffers //otherwise, disable it if (mfxExtPartialBitstreamParam const * bo = GetExtBuffer(m_video)) { m_isPOut = true; m_modePOut = bo->Granularity; MFX_CHECK((bo->Granularity >= MFX_PARTIAL_BITSTREAM_NONE && bo->Granularity <= MFX_PARTIAL_BITSTREAM_ANY), MFX_ERR_INVALID_VIDEO_PARAM); if(m_modePOut == MFX_PARTIAL_BITSTREAM_NONE || (m_modePOut == MFX_PARTIAL_BITSTREAM_SLICE && par->mfx.NumSlice < 2)) { //No sense to use PO for 1 slice m_isPOut = false; } else if(m_modePOut == MFX_PARTIAL_BITSTREAM_BLOCK) { MFX_CHECK((bo->BlockSize != 0), MFX_ERR_INVALID_VIDEO_PARAM); m_blockPOut = bo->BlockSize; } } #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) m_qpHistory.Reset(); #endif return checkStatus; } mfxStatus ImplementationAvc::GetVideoParam(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); // For buffers which are field-based std::map buffers_offsets; for (mfxU32 i = 0; i < par->NumExtParam; i++) { if (buffers_offsets.find(par->ExtParam[i]->BufferId) == buffers_offsets.end()) buffers_offsets[par->ExtParam[i]->BufferId] = 0; else buffers_offsets[par->ExtParam[i]->BufferId]++; if (mfxExtBuffer * buf = mfx::GetExtBuffer(m_video.ExtParam, m_video.NumExtParam, par->ExtParam[i]->BufferId, buffers_offsets[par->ExtParam[i]->BufferId])) { if (par->ExtParam[i]->BufferId == MFX_EXTBUFF_CODING_OPTION_SPSPPS) { // need to generate sps/pps nal units mfxExtCodingOptionSPSPPS * dst = (mfxExtCodingOptionSPSPPS *)par->ExtParam[i]; mfxExtSpsHeader const & sps = GetExtBufferRef(m_video); mfxExtPpsHeader const & pps = GetExtBufferRef(m_video); try { if (dst->SPSBuffer) { MFX_CHECK(dst->SPSBufSize, MFX_ERR_INVALID_VIDEO_PARAM); OutputBitstream writerSps(dst->SPSBuffer, dst->SPSBufSize); WriteSpsHeader(writerSps, sps); dst->SPSBufSize = mfxU16((writerSps.GetNumBits() + 7) / 8); } if (dst->PPSBuffer) { MFX_CHECK(dst->PPSBufSize, MFX_ERR_INVALID_VIDEO_PARAM); OutputBitstream writerPps(dst->PPSBuffer, dst->PPSBufSize); WritePpsHeader(writerPps, pps); dst->PPSBufSize = mfxU16((writerPps.GetNumBits() + 7) / 8); } } catch (std::exception &) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } dst->SPSId = sps.seqParameterSetId; dst->PPSId = pps.picParameterSetId; } else { MFX_INTERNAL_CPY(par->ExtParam[i], buf, par->ExtParam[i]->BufferSz); } } else { MFX_RETURN(MFX_ERR_UNSUPPORTED); } } mfxExtBuffer ** ExtParam = par->ExtParam; mfxU16 NumExtParam = par->NumExtParam; MFX_INTERNAL_CPY(par, &(static_cast(m_video)), sizeof(mfxVideoParam)); par->ExtParam = ExtParam; par->NumExtParam = NumExtParam; mfxExtCodingOption3 & extOpt3 = GetExtBufferRef(m_video); if (m_video.calcParam.TCBRCTargetFrameSize != 0 && IsOn(extOpt3.LowDelayBRC)) par->mfx.TargetKbps = (mfxU16)std::round(m_video.calcParam.TCBRCTargetFrameSize / 1000.0 * 8.0 / std::max(par->mfx.BRCParamMultiplier, 1) * (mfxF64(par->mfx.FrameInfo.FrameRateExtN) / par->mfx.FrameInfo.FrameRateExtD)); return MFX_ERR_NONE; } mfxStatus ImplementationAvc::GetFrameParam(mfxFrameParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus ImplementationAvc::GetEncodeStat(mfxEncodeStat *stat) { MFX_CHECK_NULL_PTR1(stat); UMC::AutomaticUMCMutex guard(m_listMutex); *stat = m_stat; return MFX_ERR_NONE; } struct CompareByMidRec { mfxMemId m_mid; CompareByMidRec(mfxMemId mid) : m_mid(mid) {} bool operator ()(DpbFrame const & frame) const { return frame.m_midRec == m_mid; } }; struct CompareByFrameOrder { mfxU32 m_FrameOrder; CompareByFrameOrder(mfxU32 frameOrder) : m_FrameOrder(frameOrder) {} bool operator ()(DpbFrame const & frame) const { return frame.m_frameOrder == m_FrameOrder; } }; void ImplementationAvc::OnNewFrame() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_ACCEPT_FRAME; UMC::AutomaticUMCMutex guard(m_listMutex); m_reordering.splice(m_reordering.end(), m_incoming, m_incoming.begin()); } void ImplementationAvc::SubmitScd() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_ACCEPT_FRAME; UMC::AutomaticUMCMutex guard(m_listMutex); m_ScDetectionStarted.splice(m_ScDetectionStarted.end(), m_incoming, m_incoming.begin()); } void ImplementationAvc::OnScdQueried() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_SCD; UMC::AutomaticUMCMutex guard(m_listMutex); m_ScDetectionFinished.splice(m_ScDetectionFinished.end(), m_ScDetectionStarted, m_ScDetectionStarted.begin()); } void ImplementationAvc::OnScdFinished() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_SCD; UMC::AutomaticUMCMutex guard(m_listMutex); m_reordering.splice(m_reordering.end(), m_ScDetectionFinished, m_ScDetectionFinished.begin()); } void ImplementationAvc::SubmitMCTF() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_SCD; UMC::AutomaticUMCMutex guard(m_listMutex); m_MctfStarted.splice(m_MctfStarted.end(), m_ScDetectionFinished, m_ScDetectionFinished.begin()); } void ImplementationAvc::OnMctfQueried() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_MCTF; UMC::AutomaticUMCMutex guard(m_listMutex); m_MctfFinished.splice(m_MctfFinished.end(), m_MctfStarted, m_MctfStarted.begin()); } void ImplementationAvc::OnMctfFinished() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_MCTF; UMC::AutomaticUMCMutex guard(m_listMutex); m_reordering.splice(m_reordering.end(), m_MctfFinished, m_MctfFinished.begin()); } void ImplementationAvc::OnLookaheadSubmitted(DdiTaskIter task) { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_LA; if (m_inputFrameType == MFX_IOPATTERN_IN_SYSTEM_MEMORY) m_core->DecreaseReference(*task->m_yuv); m_lookaheadStarted.splice(m_lookaheadStarted.end(), m_reordering, task); } void ImplementationAvc::OnLookaheadQueried() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_LA; #ifdef MFX_ENABLE_EXT DdiTask & task = m_lookaheadStarted.front(); int fid = task.m_fid[0]; mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(m_video); if (extOpt2.MaxSliceSize == 0) { ArrayDpbFrame & iniDpb = task.m_dpb[fid]; ArrayDpbFrame & finDpb = task.m_dpbPostEncoding; for (mfxU32 i = 0; i < iniDpb.Size(); i++) { // m_cmRaw is always filled if (std::find_if(finDpb.Begin(), finDpb.End(), CompareByFrameOrder(iniDpb[i].m_frameOrder)) == finDpb.End()) { ReleaseResource(m_rawLa, iniDpb[i].m_cmRawLa); ReleaseResource(m_mb, iniDpb[i].m_cmMb); if (m_cmDevice){ m_cmDevice->DestroySurface(iniDpb[i].m_cmRaw); iniDpb[i].m_cmRaw = NULL; } } } } ReleaseResource(m_curbe, task.m_cmCurbe); if (m_cmDevice) { if(task.m_cmRefs) m_cmDevice->DestroyVmeSurfaceG7_5(task.m_cmRefs); if(task.m_cmRefsLa) m_cmDevice->DestroyVmeSurfaceG7_5(task.m_cmRefsLa); if(task.m_event) m_cmCtx->DestroyEvent(task.m_event); } if ((task.GetFrameType() & MFX_FRAMETYPE_REF) == 0) { ReleaseResource(m_rawLa, task.m_cmRawLa); ReleaseResource(m_mb, task.m_cmMb); if (m_cmDevice) { m_cmDevice->DestroySurface(task.m_cmRaw); task.m_cmRaw = NULL; } } #endif m_histRun.splice(m_histRun.end(), m_lookaheadStarted, m_lookaheadStarted.begin()); } #ifdef MFX_ENABLE_FADE_DETECTION void ImplementationAvc::OnHistogramSubmitted() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_HIST; m_histWait.splice(m_histWait.end(), m_histRun, m_histRun.begin()); } void ImplementationAvc::OnHistogramQueried() { m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_HIST; DdiTask & task = m_histWait.front(); int fid = task.m_fid[0]; ArrayDpbFrame & iniDpb = task.m_dpb[fid]; ArrayDpbFrame & finDpb = task.m_dpbPostEncoding; for (mfxU32 i = 0; i < iniDpb.Size(); i++) { if (std::find_if(finDpb.Begin(), finDpb.End(), CompareByFrameOrder(iniDpb[i].m_frameOrder)) == finDpb.End()) { ReleaseResource(m_histogram, iniDpb[i].m_cmHist); } } if ((task.m_reference[0] + task.m_reference[1]) == 0) { ReleaseResource(m_histogram, task.m_cmHist); } if (m_cmDevice && task.m_cmRawForHist) { m_cmDevice->DestroySurface(task.m_cmRawForHist); task.m_cmRawForHist = 0; } if (m_cmCtx && task.m_event) { m_cmCtx->DestroyEvent(task.m_event); task.m_event = 0; } m_lookaheadFinished.splice(m_lookaheadFinished.end(), m_histWait, m_histWait.begin()); } #endif void ImplementationAvc::OnEncodingSubmitted(DdiTaskIter task) { task->m_startTime = (mfxU32)std::chrono::time_point_cast(std::chrono::steady_clock::now()).time_since_epoch().count(); MFX_TRACE_D(task->m_startTime); m_encoding.splice(m_encoding.end(), m_lookaheadFinished, task); } void ImplementationAvc::OnEncodingQueried(DdiTaskIter task) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ImplementationAvc::OnEncodingQueried"); m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_WAIT_ENCODE; mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); int ffid = task->m_fid[0]; ArrayDpbFrame const & iniDpb = task->m_dpb[ffid]; ArrayDpbFrame const & finDpb = task->m_dpbPostEncoding; for (mfxU32 i = 0; i < iniDpb.Size(); i++) { if (std::find_if(finDpb.Begin(), finDpb.End(), CompareByMidRec(iniDpb[i].m_midRec)) == finDpb.End()) { ReleaseResource(m_rec, iniDpb[i].m_midRec); if (IsOn(extOpt2.UseRawRef)) { if (m_inputFrameType == MFX_IOPATTERN_IN_VIDEO_MEMORY) m_core->DecreaseReference(*iniDpb[i].m_yuvRaw); ReleaseResource(m_raw, iniDpb[i].m_midRaw); ReleaseResource(m_rawSkip, iniDpb[i].m_midRaw); } } } if (IsOff(extOpt2.UseRawRef) || (task->m_reference[0] + task->m_reference[1]) == 0) { if (m_inputFrameType == MFX_IOPATTERN_IN_VIDEO_MEMORY) m_core->DecreaseReference(*task->m_yuv); ReleaseResource(m_raw, task->m_midRaw); ReleaseResource(m_rawSkip, task->m_midRaw); } ReleaseResource(m_bit, task->m_midBit[0]); ReleaseResource(m_bit, task->m_midBit[1]); if ((task->m_reference[0] + task->m_reference[1]) == 0) ReleaseResource(m_rec, task->m_midRec); if (task->m_midMBQP[0]) ReleaseResource(m_mbqp, task->m_midMBQP[0]); if (task->m_midMBQP[1]) ReleaseResource(m_mbqp, task->m_midMBQP[1]); if (m_useMbControlSurfs && task->m_isMBControl) ReleaseResource(m_mbControl, task->m_midMBControl); #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) m_qpHistory.Add(task->m_qpY[0]); #endif #if defined(MFX_ENABLE_MCTF_IN_AVC) if (IsDenoiserSupported(m_video, m_core->GetHWType()) && task->m_midMCTF) { ReleaseResource(m_mctf, task->m_midMCTF); task->m_midMCTF = MID_INVALID; MfxHwH264Encode::Zero(task->m_handleMCTF); if (m_cmDevice) m_cmDevice->DestroySurface(task->m_cmMCTF); } #endif mfxU32 numBits = 8 * (task->m_bsDataLength[0] + task->m_bsDataLength[1]); #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { if (!m_encTools.IsBRC()) { mfxStatus ests; BRCFrameParams brcFrameParams = {}; brcFrameParams.CodedFrameSize = task->m_bsDataLength[0] + task->m_bsDataLength[1]; brcFrameParams.DisplayOrder = task->m_frameOrder; brcFrameParams.EncodedOrder = task->m_encOrder; ests = m_encTools.SubmitEncodeResult(&brcFrameParams, task->m_qpY[0]); } m_encTools.Discard(task->m_frameOrder); } #endif *task = DdiTask(); UMC::AutomaticUMCMutex guard(m_listMutex); m_stat.NumBit += numBits; m_stat.NumCachedFrame--; m_stat.NumFrame++; m_free.splice(m_free.end(), m_encoding, task); } namespace { void Change_DPB( ArrayDpbFrame & dpb, mfxMemId const * mids, std::vector const & fo) { for (mfxU32 i = 0; i < dpb.Size(); i++) { mfxU32 idxRec = mfxU32(std::find(fo.begin(), fo.end(), dpb[i].m_frameOrder) - fo.begin()); dpb[i].m_frameIdx = idxRec; dpb[i].m_midRec = mids[idxRec]; } } mfxStatus CountLeadingFF( VideoCORE & core, DdiTask & task, mfxU32 fid #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) , bool isPOut = false #endif ) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CountLeadingFF"); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(isPOut) return MFX_ERR_NONE; #endif mfxFrameData bitstream = {}; task.m_numLeadingFF[fid] = 0; FrameLocker lock(&core, bitstream, task.m_midBit[fid]); if (bitstream.Y == 0) return Error(MFX_ERR_LOCK_MEMORY); mfxU32 skippedMax = std::min(15u, task.m_bsDataLength[fid]); while (*bitstream.Y == 0xff && task.m_numLeadingFF[fid] < skippedMax) { ++bitstream.Y; ++task.m_numLeadingFF[fid]; } return MFX_ERR_NONE; } } void ImplementationAvc::BrcPreEnc( DdiTask const & task) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); DdiTaskIter j = m_lookaheadFinished.begin(); mfxU32 numLaFrames = (mfxU32)m_lookaheadFinished.size(); while (j->m_encOrder != task.m_encOrder) ++j, --numLaFrames; numLaFrames = std::min(extOpt2.LookAheadDepth, numLaFrames); m_tmpVmeData.resize(numLaFrames); for (size_t i = 0; i < m_tmpVmeData.size(); ++i, ++j) m_tmpVmeData[i] = j->m_vmeData; m_brc.PreEnc(task.m_brcFrameParams, m_tmpVmeData); } #if defined(MFX_ENABLE_MCTF_IN_AVC) mfxStatus ImplementationAvc::SubmitToMctf(DdiTask * pTask) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "VideoVPPHW::SubmitToMctf"); MFX_CHECK_NULL_PTR1(pTask); bool isIntraFrame = pTask->GetFrameType() & (MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR); bool isPFrame = pTask->GetFrameType() & MFX_FRAMETYPE_P; bool isAnchorFrame = isIntraFrame || isPFrame; pTask->m_idxMCTF = FindFreeResourceIndex(m_mctf); pTask->m_midMCTF = AcquireResource(m_mctf, pTask->m_idxMCTF); if (m_hvsDenoiser) { if (pTask->m_midMCTF) { MFX_SAFE_CALL(m_core->GetFrameHDL(pTask->m_midMCTF, &pTask->m_handleMCTF.first)); mfxFrameSurface1 hvsSurface = {}; hvsSurface.Info = m_video.mfx.FrameInfo; hvsSurface.Data.MemId = pTask->m_midMCTF; hvsSurface.Data.MemType = MFX_MEMTYPE_D3D_INT; MFX_SAFE_CALL(m_hvsDenoiser->Submit(pTask->m_yuv, &hvsSurface)); #if defined(MFX_ENABLE_HVS_ON_ANCHOR_FRAMES) if (!isAnchorFrame) { ReleaseResource(m_mctf, pTask->m_midMCTF); pTask->m_midMCTF = MID_INVALID; MfxHwH264Encode::Zero(pTask->m_handleMCTF); } #endif } } else if (m_mctfDenoiser) { m_mctfDenoiser->IntBufferUpdate(pTask->m_SceneChange, isIntraFrame, pTask->m_doMCTFIntraFiltering); if (!pTask->m_midMCTF) isAnchorFrame = false; //No resource available to generate filtered output, let it pass. else MFX_SAFE_CALL(m_core->GetFrameHDL(pTask->m_midMCTF, &pTask->m_handleMCTF.first)); if (IsCmNeededForSCD(m_video)) { MFX_SAFE_CALL(m_mctfDenoiser->MCTF_PUT_FRAME( pTask->m_yuv, pTask->m_handleMCTF, &pTask->m_cmMCTF, true, nullptr, isAnchorFrame, pTask->m_doMCTFIntraFiltering)); } else { mfxFrameData pData = pTask->m_yuv->Data; FrameLocker lock2(m_core, pData, true); MFX_CHECK_NULL_PTR1(pData.Y); MFX_SAFE_CALL(m_mctfDenoiser->MCTF_PUT_FRAME( pData.Y, pTask->m_handleMCTF, &pTask->m_cmMCTF, false, nullptr, isAnchorFrame, pTask->m_doMCTFIntraFiltering)); } // --- access to the internal MCTF queue to increase buffer_count: no need to protect by mutex, as 1 writer & 1 reader MFX_SAFE_CALL(m_mctfDenoiser->MCTF_UpdateBufferCount()); // filtering itself MFX_SAFE_CALL(m_mctfDenoiser->MCTF_DO_FILTERING_IN_AVC()); } return MFX_ERR_NONE; } mfxStatus ImplementationAvc::QueryFromMctf(void *pParam) { #ifdef MFX_ENABLE_EXT MFX_CHECK_NULL_PTR1(pParam); DdiTask *pTask = (DdiTask*)pParam; if (CommonCaps::IsCmSupported(m_core->GetHWType())) { //Check if noise analysis determined if filter is not neeeded and free resources and handle if (!m_mctfDenoiser->MCTF_CHECK_FILTER_USE() && (pTask->m_handleMCTF.first)) { ReleaseResource(m_mctf, pTask->m_midMCTF); pTask->m_midMCTF = MID_INVALID; MfxHwH264Encode::Zero(pTask->m_handleMCTF); if (m_cmDevice) m_cmDevice->DestroySurface(pTask->m_cmMCTF); } MFX_SAFE_CALL(m_mctfDenoiser->MCTF_RELEASE_FRAME(IsCmNeededForSCD(m_video))); } #endif return MFX_ERR_NONE; } #endif using namespace ns_asc; mfxStatus ImplementationAvc::SCD_Put_Frame_Cm(DdiTask & task) { (void)task; #ifdef MFX_ENABLE_EXT task.m_SceneChange = false; mfxFrameSurface1 *pSurfI = nullptr; pSurfI = task.m_yuv; mfxHDLPair handle = { nullptr,nullptr }; if (IsCmNeededForSCD(m_video)) { MFX_SAFE_CALL(m_core->GetExternalFrameHDL(*pSurfI, handle, false)); mfxHDLPair cmScdSurf = { nullptr,nullptr }; task.m_idxScd = FindFreeResourceIndex(m_scd); cmScdSurf = AcquireResourceUp(m_scd, task.m_idxScd); if (cmScdSurf.first != nullptr && cmScdSurf.second != nullptr && task.m_wsGpuImage == nullptr) { task.m_wsGpuImage = (CmSurface2DUP *)cmScdSurf.first; task.m_wsGpuImage->GetIndex(task.m_wsIdxGpuImage); task.m_Yscd = (mfxU8*)cmScdSurf.second; task.m_wsSubSamplingEv = nullptr; } else MFX_RETURN(MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(amtScd.QueueFrameProgressive(handle, task.m_wsIdxGpuImage, &task.m_wsSubSamplingEv, &task.m_wsSubSamplingTask)); } else { mfxFrameData pData = task.m_yuv->Data; mfxFrameInfo Info = task.m_yuv->Info; FrameLocker lock2(m_core, pData, true); MFX_SAFE_CALL(CheckFramePointers(Info, pData)); task.m_idxScd = FindFreeResourceIndex(m_scd); task.m_Yscd = (mfxU8*)m_scd.GetSysmemBuffer(task.m_idxScd); MFX_SAFE_CALL(amtScd.PutFrameProgressive(pData.Y, pData.Pitch)); } return MFX_ERR_NONE; #else MFX_RETURN(MFX_ERR_UNSUPPORTED); #endif } mfxStatus ImplementationAvc::SCD_Put_Frame_Hw(DdiTask& task) { mfxStatus sts; task.m_SceneChange = false; mfxFrameSurface1* pSurfI = nullptr; pSurfI = task.m_yuv; sts = m_vppHelperScaling->Submit(pSurfI); MFX_CHECK_STS(sts); const mfxFrameSurface1& outSurf = m_vppHelperScaling->GetOutputSurface(); task.m_Yscd = outSurf.Data.Y; MFX_CHECK(task.m_Yscd, Error(MFX_ERR_LOCK_MEMORY)); return MFX_ERR_NONE; } constexpr mfxU32 MAX_PYR_SIZE = 4; inline bool bIsRefValid(mfxU32 frameOrder, mfxU32 distFromIntra, mfxU32 diff) { return (distFromIntra >= diff && frameOrder >= diff); } inline void AddRefInPreferredList(DdiTask & task, mfxU32 distFromIntra, mfxU32 diff, mfxU32 &numPrefered) { if (bIsRefValid(task.m_frameOrder, distFromIntra, diff) && numPrefered < 8) { task.m_internalListCtrl.PreferredRefList[numPrefered].FrameOrder = task.m_frameOrder - diff; task.m_internalListCtrl.PreferredRefList[numPrefered].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; numPrefered++; } } inline void AddRefInRejectedList(DdiTask & task, mfxU32 distFromIntra, mfxU32 diff, mfxU32 &numRejected) { if (bIsRefValid(task.m_frameOrder, distFromIntra, diff) && numRejected < 8) { task.m_internalListCtrl.RejectedRefList[numRejected].FrameOrder = task.m_frameOrder - diff; task.m_internalListCtrl.RejectedRefList[numRejected].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; numRejected++; } } static void StartNewPyr(DdiTask & task, DdiTask & lastTask, mfxU32 numRefActiveP, bool bLastFrameUsing, mfxU32 &numRejected) { mfxU32 maxKeyRef = numRefActiveP; std::vector keyRefs; bool bNonKeyLastRef = false; for (mfxU32 i = 0; i < lastTask.m_dpbPostEncoding.Size(); i++) { mfxU32 diff = task.m_frameOrder - lastTask.m_dpbPostEncoding[i].m_frameOrder; if (lastTask.m_dpbPostEncoding[i].m_keyRef) { //store key frames list keyRefs.push_back(task.m_frameOrder - lastTask.m_dpbPostEncoding[i].m_frameOrder); } else if (!bLastFrameUsing || diff != 1) { //reject non key frames exept previous frame (if bLastFrameUsing mode) task.m_internalListCtrl.RejectedRefList[numRejected].FrameOrder = lastTask.m_dpbPostEncoding[i].m_frameOrder; task.m_internalListCtrl.RejectedRefList[numRejected].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; numRejected++; } else bNonKeyLastRef = true; } if (maxKeyRef > 1 && bNonKeyLastRef) maxKeyRef--; if (keyRefs.size() > maxKeyRef) { std::sort(keyRefs.begin(), keyRefs.end()); for (mfxU32 i = maxKeyRef; i < keyRefs.size(); i++) { task.m_internalListCtrl.RejectedRefList[numRejected].FrameOrder = task.m_frameOrder - keyRefs[i]; task.m_internalListCtrl.RejectedRefList[numRejected].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; numRejected++; } } } mfxStatus ImplementationAvc::BuildPPyr(DdiTask & task, mfxU32 pyrWidth, bool bLastFrameUsing, bool bResetPyr) { mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(m_video); mfxExtCodingOptionDDI const & extOptDDI = GetExtBufferRef(m_video); MFX_CHECK(m_video.mfx.GopRefDist == 1 && extOpt3.PRefType == MFX_P_REF_PYRAMID && pyrWidth > 0 && pyrWidth <= MAX_PYR_SIZE &&!IsOn(extOpt3.ExtBrcAdaptiveLTR), MFX_ERR_NONE); mfxExtAVCRefListCtrl * ctrl = GetExtBuffer(task.m_ctrl); mfxExtAVCRefLists * advCtrl = GetExtBuffer(task.m_ctrl, task.m_fid[0]); MFX_CHECK(ctrl == NULL && advCtrl == NULL, MFX_ERR_NONE); if (bResetPyr) m_frameOrderPyrStart = task.m_frameOrder; mfxU32 distFromIntra = task.m_frameOrder - m_frameOrderIntraInDisplayOrder; mfxU32 distFromPyrStart = task.m_frameOrder - m_frameOrderPyrStart; mfxU32 posInPyr = distFromPyrStart % pyrWidth; InitExtBufHeader(task.m_internalListCtrl); task.m_internalListCtrlPresent = true; if (posInPyr == 0) { task.m_keyReference = 1; mfxU32 numRejected = 0; StartNewPyr(task, m_lastTask, extOptDDI.NumActiveRefP, bLastFrameUsing, numRejected); } else { // frameOrder difference between current frame and Reference frame mfxU32 refDiff[MAX_PYR_SIZE - 1][MAX_PYR_SIZE - 1][2] = { {{1,pyrWidth + 1}, {0,0}, {0,0}},//pyrWidth == 2 {{1,pyrWidth + 1}, {2,pyrWidth + 2}, {0,0}},//pyrWidth == 3 {{1,pyrWidth + 1}, {2,pyrWidth + 2}, {1,3}} }; //pyrWidth == 4 mfxU32 refDiffLastFrame[MAX_PYR_SIZE - 1][MAX_PYR_SIZE - 1][2] = { {{1,pyrWidth + 1}, {0,0}, {0,0}},//pyrWidth == 2 {{1,pyrWidth + 1}, {1,2}, {0,0}},//pyrWidth == 3 {{1,pyrWidth + 1}, {1,2}, {1,3}} }; //pyrWidth == 4 mfxU32 rejDiff[MAX_PYR_SIZE - 1][MAX_PYR_SIZE - 1] = { {0, 0, 0},//pyrWidth == 2 {0, 1, 0},//pyrWidth == 3 {0, 1, 1} }; //pyrWidth == 4 mfxI32 rejDiffLastFrame[MAX_PYR_SIZE - 1][MAX_PYR_SIZE - 1] = { {0 , 0, 0},//pyrWidth == 2 {0, 1, 0},//pyrWidth == 3 {0, 1, 1} }; //pyrWidth == 4 mfxU32 layer[MAX_PYR_SIZE - 1][MAX_PYR_SIZE - 1] { {1,0,0}, {2,1,0}, {2,1,2} }; mfxU32 numPrefered = 0; mfxU32 numRejected = 0; for (int i = 0; i < 2; i++) { mfxU32 diff = bLastFrameUsing ? refDiffLastFrame[pyrWidth - 2][posInPyr - 1][i] : refDiff[pyrWidth - 2][posInPyr - 1][i]; AddRefInPreferredList(task, distFromIntra, diff, numPrefered); } { mfxU32 diff = bLastFrameUsing ? rejDiffLastFrame[pyrWidth - 2][posInPyr - 1] : rejDiff[pyrWidth - 2][posInPyr - 1]; AddRefInRejectedList(task, distFromIntra, diff, numRejected); } task.m_LowDelayPyramidLayer = layer[pyrWidth - 2][posInPyr - 1]; if (IsOn(extOpt3.EnableQPOffset)) { task.m_QPdelta = extOpt3.QPOffset[layer[pyrWidth - 2][posInPyr - 1]]; task.m_bQPDelta = true; } } return MFX_ERR_NONE; } mfxStatus ImplementationAvc::SCD_Get_FrameType(DdiTask & task) { #ifdef MFX_ENABLE_EXT if (task.m_wsSubSamplingEv) { MFX_SAFE_CALL(amtScd.ProcessQueuedFrame(&task.m_wsSubSamplingEv, &task.m_wsSubSamplingTask, &task.m_wsGpuImage, &task.m_Yscd)); ReleaseResource(m_scd, (mfxHDL)task.m_wsGpuImage); } #endif mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(m_video); task.m_SceneChange = amtScd.Get_frame_shot_Decision(); #if defined(MFX_ENABLE_MCTF_IN_AVC) task.m_doMCTFIntraFiltering = amtScd.Get_intra_frame_denoise_recommendation(); #endif if (extOpt3.PRefType == MFX_P_REF_PYRAMID) { // Adaptive low Delay Quantizer settings for extbrc m_LowDelayPyramidLayer = (!(task.m_type[0] & MFX_FRAMETYPE_P) || task.m_SceneChange) ? 0 : ((amtScd.Get_PDist_advice() > 1 || amtScd.Get_RepeatedFrame_advice()) ? (m_LowDelayPyramidLayer ? 0 : 1) : 0); task.m_LowDelayPyramidLayer = m_LowDelayPyramidLayer; } else task.m_LowDelayPyramidLayer = m_LowDelayPyramidLayer = 0; if(task.m_SceneChange) { bool bPyr = extOpt2.BRefType == MFX_B_REF_PYRAMID; if (IsOn(extOpt2.AdaptiveI)) { mfxI32 idist = (mfxI32)(task.m_frameOrder - m_frameOrderIntraInDisplayOrder); mfxI32 idrdist = (mfxI32)(task.m_frameOrder - m_frameOrderIdrInDisplayOrder); mfxExtCodingOptionDDI const * extDdi = GetExtBuffer(m_video); MFX_CHECK_NULL_PTR1(extDdi); mfxI32 numRef = std::min(extDdi->NumActiveRefP, m_video.mfx.NumRefFrame); mfxI32 minPDist = numRef * m_video.mfx.GopRefDist; mfxI32 minIdrDist = (task.m_frameLtrOff ? numRef : std::max(8, numRef)) * (bPyr ? 2 : m_video.mfx.GopRefDist); minIdrDist = std::min(minIdrDist, m_video.mfx.GopPicSize/2); minPDist = std::min(minPDist, minIdrDist); if (!(task.m_type[0] & MFX_FRAMETYPE_I) && idist < minPDist && IsOn(extOpt2.AdaptiveB)) { // inside ref list, B to P but Don't break Pyr Structure if (!bPyr) { task.m_ctrl.FrameType = (MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); task.m_type = ExtendFrameType(task.m_ctrl.FrameType); } } else if (!(task.m_type[0] & MFX_FRAMETYPE_IDR) && idrdist < minIdrDist) { // outside ref list, B/P to I but Don't break Pyr Structure if (!bPyr) { task.m_ctrl.FrameType = (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF); task.m_type = ExtendFrameType(task.m_ctrl.FrameType); } } else { // IDR task.m_ctrl.FrameType = (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR); task.m_type = ExtendFrameType(task.m_ctrl.FrameType); } } else if (IsOn(extOpt2.AdaptiveB)) { if (!(task.m_type[0] & MFX_FRAMETYPE_I)) { // B to P but Don't break Pyr Structure if (!bPyr) { task.m_ctrl.FrameType = (MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); task.m_type = ExtendFrameType(task.m_ctrl.FrameType); } } } } return MFX_ERR_NONE; } using namespace ns_asc; mfxStatus ImplementationAvc::Prd_LTR_Operation(DdiTask & task) { #ifdef MFX_ENABLE_EXT if (task.m_wsSubSamplingEv && CommonCaps::IsCmSupported(m_core->GetHWType())) { MFX_SAFE_CALL(amtScd.ProcessQueuedFrame(&task.m_wsSubSamplingEv, &task.m_wsSubSamplingTask, &task.m_wsGpuImage, &task.m_Yscd)); m_scd.UpdateResourcePointers(task.m_idxScd, (void *)task.m_Yscd, (void *)task.m_wsGpuImage); ReleaseResource(m_scd, (mfxHDL)task.m_wsGpuImage); } else if (!CommonCaps::IsCmSupported(m_core->GetHWType())) { amtScd.ProcessQueuedFrame(&task.m_Yscd); } #endif task.m_frameLtrReassign = 0; task.m_LtrOrder = m_LtrOrder; task.m_RefOrder = m_RefOrder; task.m_LtrQp = m_LtrQp; task.m_RefQp = m_RefQp; task.m_frameLtrOff = 1; if (IsAdaptiveLtrOn(m_video)) { ASC_LTR_DEC scd_LTR_hint = NO_LTR; MFX_SAFE_CALL(amtScd.get_LTR_op_hint(scd_LTR_hint)); task.m_frameLtrOff = (scd_LTR_hint == NO_LTR); if (m_LtrQp && m_RefQp && m_RefQp < m_LtrQp - 1 && m_LtrOrder >= 0 && m_RefOrder > m_LtrOrder) { task.m_frameLtrReassign = 1; } } return MFX_ERR_NONE; } mfxStatus ImplementationAvc::CalculateFrameCmplx(DdiTask const &task, mfxU32 &raca128) { mfxFrameSurface1 *pSurfI = nullptr; pSurfI = task.m_yuv; mfxHDLPair handle = { nullptr,nullptr }; mfxF64 raca = 0; // Raca = l2 norm of average abs row diff and average abs col diff raca128 = 0; if (IsCmNeededForSCD(m_video)) { MFX_SAFE_CALL(m_core->GetExternalFrameHDL(*pSurfI, handle, false)); MFX_SAFE_CALL(amtScd.calc_RaCa_Surf(handle, raca)); } else { mfxFrameData Data = task.m_yuv->Data; mfxFrameInfo Info = task.m_yuv->Info; FrameLocker lock2(m_core, Data, true); MFX_SAFE_CALL(CheckFramePointers(Info, Data)); mfxI32 w, h; if (Info.CropH > 0 && Info.CropW > 0) { w = Info.CropW; h = Info.CropH; } else { w = Info.Width; h = Info.Height; } mfxI32 pitch = Data.Pitch; mfxU8* ptr = Data.Y + Info.CropX + Info.CropY * pitch; if (ptr) MFX_SAFE_CALL(amtScd.calc_RaCa_pic(ptr, w, h, Data.Pitch, raca)); } if (raca < MIN_RACA) raca = MIN_RACA; if (raca > MAX_RACA) raca = MAX_RACA; raca128 = (mfxU16)(raca * RACA_SCALE); return MFX_ERR_NONE; } struct FindNonSkip { FindNonSkip(mfxU16 skipFrameMode) : m_skipFrameMode(skipFrameMode) {} template bool operator ()(T const & task) const { return (m_skipFrameMode != MFX_SKIPFRAME_INSERT_NOTHING && m_skipFrameMode != MFX_SKIPFRAME_INSERT_DUMMY) || task.m_ctrl.SkipFrame == 0; } mfxU16 m_skipFrameMode; }; mfxStatus FixForcedFrameType (DdiTask & newTask, mfxU32 frameOrder) { if (frameOrder == 0 && !(newTask.m_type[0] & MFX_FRAMETYPE_IDR) && !(newTask.m_type[1] & MFX_FRAMETYPE_IDR)) { if (newTask.m_type[0] & MFX_FRAMETYPE_I) newTask.m_type[0] = newTask.m_type[0] | MFX_FRAMETYPE_IDR; else if (newTask.m_type[1] & MFX_FRAMETYPE_I) newTask.m_type[1] = newTask.m_type[1] | MFX_FRAMETYPE_IDR; else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } if (!(newTask.m_type[0] & MFX_FRAMETYPE_REF)) newTask.m_type[0] = newTask.m_type[0] | MFX_FRAMETYPE_REF; if (!(newTask.m_type[1] & MFX_FRAMETYPE_REF)) newTask.m_type[1] = newTask.m_type[1] | MFX_FRAMETYPE_REF; return MFX_ERR_NONE; } void ImplementationAvc::AssignFrameTypes(DdiTask & newTask) { //newTask.m_frameOrder = m_frameOrder; newTask.m_picStruct = GetPicStruct(m_video, newTask); newTask.m_fieldPicFlag = newTask.m_picStruct[ENC] != MFX_PICSTRUCT_PROGRESSIVE; newTask.m_fid[0] = newTask.m_picStruct[ENC] == MFX_PICSTRUCT_FIELD_BFF; newTask.m_fid[1] = newTask.m_fieldPicFlag - newTask.m_fid[0]; newTask.m_baseLayerOrder = m_baseLayerOrder; if (newTask.m_picStruct[ENC] == MFX_PICSTRUCT_FIELD_BFF) std::swap(newTask.m_type.top, newTask.m_type.bot); newTask.m_frameOrderIdrInDisplayOrder = m_frameOrderIdrInDisplayOrder; newTask.m_frameOrderStartTScalStructure = m_frameOrderStartTScalStructure; if (newTask.GetFrameType() & MFX_FRAMETYPE_B) { newTask.m_loc = GetBiFrameLocation(m_video, newTask.m_frameOrder - m_frameOrderIPInDisplayOrder, newTask.m_currGopRefDist,m_miniGopCount); newTask.m_type[0] |= newTask.m_loc.refFrameFlag; newTask.m_type[1] |= newTask.m_loc.refFrameFlag; } if ((newTask.GetFrameType() & MFX_FRAMETYPE_I) || (newTask.GetFrameType() & MFX_FRAMETYPE_P) || (newTask.GetFrameType() & MFX_FRAMETYPE_IDR)) { m_frameOrderIPInDisplayOrder = newTask.m_frameOrder; m_miniGopCount++; } if (newTask.GetFrameType() & MFX_FRAMETYPE_IDR) { m_frameOrderIdrInDisplayOrder = newTask.m_frameOrder; m_frameOrderStartTScalStructure = m_frameOrderIdrInDisplayOrder; // IDR always starts new temporal scalabilty structure newTask.m_frameOrderStartTScalStructure = m_frameOrderStartTScalStructure; m_frameOrderPyrStart = newTask.m_frameOrder; m_miniGopCount = 0; } if (newTask.GetFrameType() & MFX_FRAMETYPE_I) { m_frameOrderIntraInDisplayOrder = newTask.m_frameOrder; m_baseLayerOrderStartIntraRefresh = newTask.m_baseLayerOrder; m_frameOrderPyrStart = newTask.m_frameOrder; } } mfxU32 GetMaxFrameSize(DdiTask const & task, MfxVideoParam const &video, Hrd const &hrd) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); mfxU32 maxFrameSize_hrd = hrd.GetMaxFrameSize(task.GetFrameType() & MFX_FRAMETYPE_IDR)>>3; mfxU32 maxFrameSize = (task.GetFrameType() & MFX_FRAMETYPE_I) ? extOpt3.MaxFrameSizeI : extOpt3.MaxFrameSizeP; maxFrameSize = (!maxFrameSize) ? extOpt2.MaxFrameSize : maxFrameSize; return (maxFrameSize_hrd && maxFrameSize) ? std::min(maxFrameSize_hrd,maxFrameSize): std::max(maxFrameSize_hrd,maxFrameSize); } void GetHRDParamFromBRC(DdiTask & task, mfxU32 &initCpbRemoval, mfxU32 &initCpbRemovalOffset) { if (task.m_brcFrameCtrl.InitialCpbRemovalDelay || task.m_brcFrameCtrl.InitialCpbRemovalOffset) { initCpbRemoval = task.m_brcFrameCtrl.InitialCpbRemovalDelay; initCpbRemovalOffset = task.m_brcFrameCtrl.InitialCpbRemovalOffset; } } void UpdateBRCParams(DdiTask & task) { task.m_cqpValue[0] = task.m_cqpValue[1] = (mfxU8)task.m_brcFrameCtrl.QpY; GetHRDParamFromBRC(task, task.m_initCpbRemoval, task.m_initCpbRemovalOffset); } mfxStatus ImplementationAvc::CheckSliceSize(DdiTask &task, bool &bToRecode) { mfxU32 bsSizeAvail = mfxU32(m_tmpBsBuf.size()); mfxU8 *pBS = &m_tmpBsBuf[0]; mfxStatus sts = MFX_ERR_NONE; mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); bToRecode = false; MFX_CHECK(task.m_fieldPicFlag == 0, MFX_ERR_UNDEFINED_BEHAVIOR); if ((sts = CopyBitstream(*m_core, m_video, task, task.m_fid[0], pBS, bsSizeAvail)) != MFX_ERR_NONE) return Error(sts); sts = UpdateSliceInfo(pBS, pBS + task.m_bsDataLength[task.m_fid[0]], extOpt2.MaxSliceSize, task, bToRecode); if (sts != MFX_ERR_NONE) return Error(sts); if (bToRecode) { if (task.m_repack == 0) { sts = CorrectSliceInfo(task, 70, m_video.calcParam.widthLa, m_video.calcParam.heightLa); if (sts != MFX_ERR_NONE && sts != MFX_ERR_UNDEFINED_BEHAVIOR) return Error(sts); if (sts == MFX_ERR_UNDEFINED_BEHAVIOR) task.m_repack = 1; } if (task.m_repack > 0) { if (task.m_repack > 5 && task.m_SliceInfo.size() > 255) { sts = CorrectSliceInfo(task, 70, m_video.calcParam.widthLa, m_video.calcParam.heightLa); if (sts != MFX_ERR_NONE && sts != MFX_ERR_UNDEFINED_BEHAVIOR) return Error(sts); } else { size_t old_slice_size = task.m_SliceInfo.size(); sts = CorrectSliceInfoForsed(task, m_video.calcParam.widthLa, m_video.calcParam.heightLa); if (sts != MFX_ERR_NONE) return Error(sts); if (old_slice_size == task.m_SliceInfo.size() && task.m_repack < 4) task.m_repack = 4; } } if (task.m_repack >= 4) { if (task.m_cqpValue[0] < 51) { task.m_cqpValue[0] = task.m_cqpValue[0] + 1 + (mfxU8)(task.m_repack - 4); if (task.m_cqpValue[0] > 51) task.m_cqpValue[0] = 51; task.m_cqpValue[1] = task.m_cqpValue[0]; } else if (task.m_SliceInfo.size() > 255) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } } return sts; } mfxStatus ImplementationAvc::CheckBufferSize(DdiTask &task, bool &bToRecode, mfxU32 bsDataLength, mfxBitstream * bs) { if ((bsDataLength > (bs->MaxLength - bs->DataOffset - bs->DataLength))) { if (task.m_cqpValue[0] == 51) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); task.m_cqpValue[0] = task.m_cqpValue[0] + 1; task.m_cqpValue[1] = task.m_cqpValue[0]; // printf("Recoding 0: frame %d, qp %d\n", task.m_frameOrder, task.m_cqpValue[0]); bToRecode = true; } return MFX_ERR_NONE; } #ifdef MFX_ENABLE_ENCTOOLS mfxStatus ImplementationAvc::EncToolsGetFrameCtrl(DdiTask& task) { mfxEncToolsHintQPMap qpMapHint = {}; mfxFrameData qpMap = {}; bool bMbQP = false; std::unique_ptr lock = nullptr; if (GetMBQPMode(m_caps, m_video) == MBQPMode_FromEncToolsBRC) { MFX_CHECK(task.m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); if (!task.m_midMBQP[0]) { task.m_idxMBQP[0] = FindFreeResourceIndex(m_mbqp); task.m_midMBQP[0] = AcquireResource(m_mbqp, task.m_idxMBQP[0]); MFX_CHECK(task.m_midMBQP[0], MFX_ERR_UNDEFINED_BEHAVIOR); } lock = std::make_unique (m_core, qpMap, task.m_midMBQP[0]); MFX_CHECK(qpMap.Y, MFX_ERR_LOCK_MEMORY); qpMapHint.ExtQpMap.BlockSize = (mfxU16)m_mbqpInfo.block_width; qpMapHint.ExtQpMap.QP = qpMap.Y; qpMapHint.ExtQpMap.Mode = MFX_MBQP_MODE_QP_VALUE; qpMapHint.ExtQpMap.NumQPAlloc = m_mbqpInfo.height_aligned * m_mbqpInfo.pitch; qpMapHint.QpMapPitch = (mfxU16)m_mbqpInfo.pitch; bMbQP = true; } mfxStatus sts = m_encTools.GetFrameCtrl(&task.m_brcFrameCtrl, task.m_frameOrder, bMbQP ? &qpMapHint : 0); if (bMbQP) task.m_isMBQP[0] = !!(qpMapHint.QpMapFilled); return sts; } #endif mfxStatus ImplementationAvc::CheckBRCStatus(DdiTask &task, bool &bToRecode, mfxU32 bsDataLength) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); task.m_brcFrameParams.CodedFrameSize = bsDataLength; mfxU32 res; // Pre-Emptive Skip padding if(task.m_panicMode && task.m_isSkipped) task.m_brcFrameParams.CodedFrameSize = std::max(bsDataLength, task.m_minFrameSize); #if defined(MFX_ENABLE_ENCTOOLS) mfxBRCFrameStatus frame_sts = {}; mfxStatus ests; if (m_enabledEncTools) { ests = m_encTools.SubmitEncodeResult(&task.m_brcFrameParams, task.m_brcFrameCtrl.QpY); MFX_CHECK_STS(ests); ests = m_encTools.GetEncodeStatus(&frame_sts, task.m_frameOrder); switch (frame_sts.BRCStatus) { case ::MFX_BRC_OK: res = UMC::BRC_OK; break; case ::MFX_BRC_BIG_FRAME: res = UMC::BRC_ERR_BIG_FRAME; break; case ::MFX_BRC_SMALL_FRAME: res = UMC::BRC_ERR_SMALL_FRAME; break; case ::MFX_BRC_PANIC_BIG_FRAME: res = UMC::BRC_ERR_BIG_FRAME | UMC::BRC_NOT_ENOUGH_BUFFER; break; case ::MFX_BRC_PANIC_SMALL_FRAME: res = UMC::BRC_ERR_SMALL_FRAME | UMC::BRC_NOT_ENOUGH_BUFFER; break; default: res = UMC::BRC_OK; } } else #endif res = m_brc.Report(task.m_brcFrameParams, 0, GetMaxFrameSize(task, m_video, m_hrd), task.m_brcFrameCtrl); MFX_CHECK((mfxI32)res != UMC::BRC_ERROR, MFX_ERR_UNDEFINED_BEHAVIOR); if ((res != 0) && (!extOpt2.MaxSliceSize)) { if (task.m_panicMode) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); task.m_brcFrameParams.NumRecode++; if ((task.m_cqpValue[0] == 51 || (res & UMC::BRC_NOT_ENOUGH_BUFFER)) && (res & UMC::BRC_ERR_BIG_FRAME)) { task.m_panicMode = 1; task.m_repack = 100; task.m_isSkipped = true; bToRecode = true; // Pre-Empt Min Bs for Skip Frame #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { task.m_minFrameSize = frame_sts.MinFrameSize; } else #endif { task.m_minFrameSize =(mfxU32)( (m_brc.GetMinFrameSize() + 7) >> 3 ); } } else if (((res & UMC::BRC_NOT_ENOUGH_BUFFER) || (task.m_repack > 2)) && (res & UMC::BRC_ERR_SMALL_FRAME)) { #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { task.m_minFrameSize = frame_sts.MinFrameSize; task.m_brcFrameParams.CodedFrameSize = task.m_minFrameSize; ests = m_encTools.SubmitEncodeResult(&task.m_brcFrameParams, task.m_brcFrameCtrl.QpY); MFX_CHECK_STS(ests); ests = m_encTools.GetEncodeStatus(&frame_sts, task.m_frameOrder); MFX_CHECK_STS(ests); } else #endif { task.m_minFrameSize =(mfxU32)( (m_brc.GetMinFrameSize() + 7) >> 3 ); task.m_brcFrameParams.CodedFrameSize = task.m_minFrameSize; m_brc.Report(task.m_brcFrameParams, 0, m_hrd.GetMaxFrameSize((task.m_type[task.m_fid[0]] & MFX_FRAMETYPE_IDR)), task.m_brcFrameCtrl); } bToRecode = false; //Padding is in update bitstream } else { #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { ests = m_encTools.SubmitFrameForEncoding(task); MFX_CHECK_STS(ests); ests = EncToolsGetFrameCtrl(task); MFX_CHECK_STS(ests); } else #endif m_brc.GetQpForRecode(task.m_brcFrameParams, task.m_brcFrameCtrl); UpdateBRCParams(task); bToRecode = true; } } return MFX_ERR_NONE; } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) mfxStatus ImplementationAvc::NextBitstreamDataLength(mfxBitstream * bs) { //find task corresponding to required bitstream mfxI64 off = 0; { std::lock_guard lock(m_offsetMutex); auto it = m_offsetsMap.find(bs); if(it != m_offsetsMap.end()) { std::queue& q = (*it).second; if(!q.empty()) { off = q.front(); q.pop(); if(!q.empty() && q.front() == 0) { //last offset => remove bitstream m_offsetsMap.erase(it); } } } } if(off){ //update bitstream length bs->DataLength = (mfxU32)off; } return MFX_ERR_NONE; } #endif #if defined(MFX_ENABLE_ENCTOOLS) mfxStatus ImplementationAvc::FillPreEncParams(DdiTask &task) { mfxStatus sts = MFX_ERR_NONE; mfxEncToolsHintPreEncodeGOP st = {}; if (m_encTools.IsAdaptiveI() || m_encTools.IsAdaptiveGOP() || m_encTools.IsAdaptiveQP() || m_encTools.IsAdaptiveLTR() || m_encTools.IsAdaptiveRef()) { if (m_encTools.IsAdaptiveGOP() || m_encTools.IsAdaptiveQP()) { sts = m_encTools.QueryPreEncRes(task.m_frameOrder, st); MFX_CHECK_STS(sts); if (task.m_type[0] == 0) { task.m_type = ExtendFrameType(st.FrameType); task.m_currGopRefDist = st.MiniGopSize; AssignFrameTypes(task); } else task.m_currGopRefDist = m_video.mfx.GopRefDist; if (m_encTools.IsPreEncNeeded()) { task.m_QPdelta = st.QPDelta; task.m_bQPDelta = true; } if (m_encTools.IsAdaptiveQP()) { task.m_QPmodulation = st.QPModulation; #ifdef MFX_ENABLE_APQ_LQ task.m_ALQOffset = ((task.m_currGopRefDist == 8 || m_video.mfx.GopRefDist == 8) && (task.m_type[0] & MFX_FRAMETYPE_B)) ? 2 : task.m_ALQOffset; task.m_ALQOffset = (task.m_currGopRefDist == 8 && (task.m_type[0] & MFX_FRAMETYPE_P)) ? -1 : task.m_ALQOffset; #endif //printf("%d type %d, m_QPdelta %d m_QPmodulation %d, currGopRefDist %d, ALQOffset %d\n", task.m_frameOrder, st.FrameType, st.QPDelta, st.QPModulation, task.m_currGopRefDist, task.m_ALQOffset); } } if (m_encTools.IsAdaptiveI() || m_encTools.IsAdaptiveLTR() || m_encTools.IsBRC()) { mfxEncToolsHintPreEncodeSceneChange schg = {}; sts = m_encTools.QueryPreEncSChg(task.m_frameOrder, schg); MFX_CHECK_STS(sts); task.m_SceneChange = schg.SceneChangeFlag; task.m_SpatialComplexity = schg.SpatialComplexity; task.m_PersistenceMapNZ = schg.PersistenceMapNZ; if(task.m_PersistenceMapNZ) memcpy(task.m_PersistenceMap, schg.PersistenceMap, sizeof(task.m_PersistenceMap)); } if (m_encTools.IsAdaptiveLTR() || m_encTools.IsAdaptiveRef()) { mfxEncToolsHintPreEncodeARefFrames ref = {}; sts = m_encTools.QueryPreEncARef(task.m_frameOrder, ref); MFX_CHECK_STS(sts); InitExtBufHeader(task.m_internalListCtrl); task.m_internalListCtrlPresent = true; if (ref.CurrFrameType == MFX_REF_FRAME_TYPE_KEY) task.m_keyReference = 1; if (ref.CurrFrameType == MFX_REF_FRAME_TYPE_LTR) { task.m_internalListCtrl.LongTermRefList[0].FrameOrder = task.m_frameOrder; task.m_internalListCtrl.LongTermRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; //printf("et reflists for POC %d LongTerm %d\n", task.m_frameOrder, task.m_frameOrder); } for (mfxU32 i = (ref.CurrFrameType == MFX_REF_FRAME_TYPE_LTR) ? 1 : 0; i < std::min(ref.LongTermRefListSize, (mfxU16)16); i++) { task.m_internalListCtrl.LongTermRefList[i].FrameOrder = ref.LongTermRefList[i]; task.m_internalListCtrl.LongTermRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; //printf("et reflists for POC %d LongTerm %d\n", task.m_frameOrder, ref.LongTermRefList[i]); } for (mfxU32 i = 0; i < std::min(ref.PreferredRefListSize, (mfxU16)32); i++) { task.m_internalListCtrl.PreferredRefList[i].FrameOrder = ref.PreferredRefList[i]; task.m_internalListCtrl.PreferredRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; //printf("et reflists for POC %d Preferred %d\n", task.m_frameOrder, ref.PreferredRefList[i]); } for (mfxU32 i = 0; i < std::min(ref.RejectedRefListSize, (mfxU16)16); i++) { task.m_internalListCtrl.RejectedRefList[i].FrameOrder = ref.RejectedRefList[i]; task.m_internalListCtrl.RejectedRefList[i].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; //printf("et reflists for POC %d Rejected %d\n", task.m_frameOrder, ref.RejectedRefList[i]); } } } if (m_encTools.isLASWBRC()) { mfxEncToolsBRCBufferHint bufHint = {}; sts = m_encTools.QueryLookAheadStatus(task.m_frameOrder, &bufHint, nullptr, nullptr, nullptr); MFX_CHECK_STS(sts); task.m_lplastatus.AvgEncodedBits = bufHint.AvgEncodedSizeInBits; task.m_lplastatus.CurEncodedBits = bufHint.CurEncodedSizeInBits; task.m_lplastatus.DistToNextI = bufHint.DistToNextI; } #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (m_encTools.isLAHWBRC()) { mfxEncToolsBRCBufferHint bufHint = {}; // if QueryPreEncRes has been called above, no need to Query PreEncodeGOP again mfxEncToolsHintPreEncodeGOP *gopHint = (st.Header.BufferSz > 0 ? nullptr : &st); mfxEncToolsHintQuantMatrix cqmHint = {}; mfxEncToolsHintQPMap qpMapHint = {}; mfxFrameData qpMap = {}; bool bMbQP = false; std::unique_ptr lock = nullptr; if (GetMBQPMode(m_caps, m_video) == MBQPMode_FromEncToolsLA) { MFX_CHECK(task.m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); if (!task.m_midMBQP[0]) { task.m_idxMBQP[0] = FindFreeResourceIndex(m_mbqp); task.m_midMBQP[0] = AcquireResource(m_mbqp, task.m_idxMBQP[0]); MFX_CHECK(task.m_midMBQP[0], MFX_ERR_UNDEFINED_BEHAVIOR); } lock = std::make_unique (m_core, qpMap, task.m_midMBQP[0]); MFX_CHECK(qpMap.Y, MFX_ERR_LOCK_MEMORY); qpMapHint.ExtQpMap.BlockSize = (mfxU16)m_mbqpInfo.block_width; qpMapHint.ExtQpMap.QP = qpMap.Y; qpMapHint.ExtQpMap.Mode = MFX_MBQP_MODE_QP_DELTA; qpMapHint.ExtQpMap.NumQPAlloc = m_mbqpInfo.height_aligned * m_mbqpInfo.pitch; qpMapHint.QpMapPitch = (mfxU16)m_mbqpInfo.pitch; bMbQP = true; } sts = m_encTools.QueryLookAheadStatus(task.m_frameOrder, &bufHint, gopHint, &cqmHint, bMbQP? &qpMapHint: 0); MFX_CHECK_STS(sts); if (gopHint) { if (task.m_type[0] == 0) { task.m_type = ExtendFrameType(st.FrameType); task.m_currGopRefDist = st.MiniGopSize; AssignFrameTypes(task); } else task.m_currGopRefDist = m_video.mfx.GopRefDist; } mfxLplastatus lplaStatus = {}; switch (cqmHint.MatrixType) { case MFX_QUANT_MATRIX_WEAK: lplaStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX1; break; case MFX_QUANT_MATRIX_MEDIUM: lplaStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX2; break; case MFX_QUANT_MATRIX_STRONG: lplaStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX3; break; case MFX_QUANT_MATRIX_EXTREME: lplaStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX4; break; case MFX_QUANT_MATRIX_FLAT: default: lplaStatus.CqmHint = CQM_HINT_USE_FLAT_MATRIX; } lplaStatus.TargetFrameSize = bufHint.OptimalFrameSizeInBytes; lplaStatus.MiniGopSize = (mfxU8)st.MiniGopSize; lplaStatus.QpModulation = (mfxU8)st.QPModulation; m_lpLaStatus.push_back(lplaStatus); } #endif return MFX_ERR_NONE; } #endif #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) void SetupAdaptiveCQM(const MfxVideoParam &par, DdiTask &task, const QpHistory qpHistory) { task.m_adaptiveCQMHint = CQM_HINT_INVALID; const mfxExtCodingOption3 &opt3 = GetExtBufferRef(par); if (IsOn(opt3.AdaptiveCQM)) { const mfxExtSpsHeader& extSps = GetExtBufferRef(par); const std::vector& extCqmPps = par.GetCqmPps(); const mfxU32 averageQP = qpHistory.GetAverageQp(); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (task.m_lplastatus.CqmHint != CQM_HINT_INVALID && par.mfx.GopRefDist >= 4 && H264ECaps::IsAcqmSupported(task.m_hwType)) // LPLA based ACQM { if (task.m_type.top & (MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_P)) { task.m_lplastatus.CqmHint = CQM_HINT_USE_FLAT_MATRIX; } task.m_adaptiveCQMHint = task.m_lplastatus.CqmHint; } else #endif // MFX_ENABLE_ENCTOOLS_LPLA { // History based ACQM if (par.mfx.GopRefDist >= 4 && H264ECaps::IsAcqmSupported(task.m_hwType) && (task.m_type.top & (MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_P))) { task.m_adaptiveCQMHint = CQM_HINT_USE_FLAT_MATRIX; } else { if (averageQP == 0) // not enough history QP { const mfxU32 MBSIZE = 16; const mfxU32 BITRATE_SCALE = 2000; const mfxU32 numMB = (par.mfx.FrameInfo.Width / MBSIZE) * (par.mfx.FrameInfo.Height / MBSIZE); const mfxU32 normalizedBitrate = mfxU32(mfxU64(BITRATE_SCALE) * par.calcParam.targetKbps * par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN / numMB); const mfxU32 STRONG_QM_BR_THRESHOLD = 25; const mfxU32 MEDIUM_QM_BR_THRESHOLD = 50; task.m_adaptiveCQMHint = (normalizedBitrate < STRONG_QM_BR_THRESHOLD) ? CQM_HINT_USE_CUST_MATRIX3 : (normalizedBitrate < MEDIUM_QM_BR_THRESHOLD) ? CQM_HINT_USE_CUST_MATRIX2 : CQM_HINT_USE_CUST_MATRIX1; } else { const mfxU32 FLAT_QM_QP_THRESHOLD = 32; const mfxU32 WEAK_QM_QP_THRESHOLD = 38; const mfxU32 MEDIUM_QM_QP_THRESHOLD = 44; const mfxU32 STRONG_QM_QP_THRESHOLD = 50; task.m_adaptiveCQMHint = averageQP < FLAT_QM_QP_THRESHOLD ? CQM_HINT_USE_FLAT_MATRIX : averageQP < WEAK_QM_QP_THRESHOLD ? CQM_HINT_USE_CUST_MATRIX1 : averageQP < MEDIUM_QM_QP_THRESHOLD ? CQM_HINT_USE_CUST_MATRIX2 : averageQP < STRONG_QM_QP_THRESHOLD ? CQM_HINT_USE_CUST_MATRIX3 : CQM_HINT_USE_CUST_MATRIX4; } } #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (task.m_lplastatus.CqmHint != CQM_HINT_INVALID) task.m_lplastatus.CqmHint = (mfxU8)task.m_adaptiveCQMHint; #endif } if (IsCustMatrix(task.m_adaptiveCQMHint)) { mfxU32 cqmIndex = task.m_adaptiveCQMHint - 1; if (extSps.seqScalingMatrixPresentFlag || extCqmPps[cqmIndex].picScalingMatrixPresentFlag) FillTaskScalingList(extSps, extCqmPps[cqmIndex], task); } } } #endif mfxStatus ImplementationAvc::AsyncRoutine(mfxBitstream * bs) { mfxExtCodingOption const & extOpt = GetExtBufferRef(m_video); #ifdef MFX_ENABLE_EXT mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(m_video); #endif mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(m_video); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ImplementationAvc::AsyncRoutine"); if (m_stagesToGo == 0) { UMC::AutomaticUMCMutex guard(m_listMutex); m_stagesToGo = m_emulatorForAsyncPart.Go(!m_incoming.empty()); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_ACCEPT_FRAME) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_ACCEPT_FRAME"); DdiTask & newTask = m_incoming.front(); if (!m_video.mfx.EncodedOrder) { if (IsExtBrcSceneChangeSupported(m_video, m_core->GetHWType()) #if defined(MFX_ENABLE_ENCTOOLS) // for LPLA, use frameType provided by EncTools even if AdaptiveGOP is off || (m_enabledEncTools && (m_encTools.IsAdaptiveGOP() || m_encTools.isLAHWBRC() || m_encTools.isLASWBRC())) #endif ) { newTask.m_frameOrder = m_frameOrder; } else { if (newTask.m_type[0] == 0) newTask.m_type = GetFrameType(m_video, m_frameOrder - m_frameOrderIdrInDisplayOrder); else { mfxStatus sts = FixForcedFrameType(newTask, m_frameOrder - m_frameOrderIdrInDisplayOrder); if (sts != MFX_ERR_NONE) return Error(sts); } newTask.m_frameOrder = m_frameOrder; AssignFrameTypes(newTask); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (!m_encTools.isLAHWBRC()) #endif BuildPPyr(newTask, GetPPyrSize(m_video, 0, false), true, false); } m_frameOrder++; } else { newTask.m_picStruct = GetPicStruct(m_video, newTask); newTask.m_fieldPicFlag = newTask.m_picStruct[ENC] != MFX_PICSTRUCT_PROGRESSIVE; newTask.m_fid[0] = newTask.m_picStruct[ENC] == MFX_PICSTRUCT_FIELD_BFF; newTask.m_fid[1] = newTask.m_fieldPicFlag - newTask.m_fid[0]; if (newTask.m_picStruct[ENC] == MFX_PICSTRUCT_FIELD_BFF) std::swap(newTask.m_type.top, newTask.m_type.bot); } // move task to reordering queue //printf("\rACCEPTED do=%4d eo=%4d type=%d\n", newTask.m_frameOrder, newTask.m_encOrder, newTask.m_type[0]); fflush(stdout); SubmitScd(); // move task to reordering queue //OnNewFrame(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_START_SCD) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_START_SCD"); DdiTask & task = m_ScDetectionStarted.back(); #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools && (m_encTools.IsPreEncNeeded())) { mfxFrameSurface1 tmpSurface = *task.m_yuv; mfxStatus sts = m_encTools.SubmitForPreEnc(task.m_frameOrder, &tmpSurface); if (sts == MFX_ERR_MORE_DATA) sts = MFX_ERR_NONE; MFX_CHECK_STS(sts); } #endif if (IsExtBrcSceneChangeSupported(m_video, m_core->GetHWType())) { mfxStatus sts = MFX_ERR_NONE; if (!CommonCaps::IsCmSupported(m_core->GetHWType())) sts = SCD_Put_Frame_Hw(task); else sts = SCD_Put_Frame_Cm(task); MFX_CHECK_STS(sts); } OnScdQueried(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_SCD) { DdiTask & task = m_ScDetectionFinished.front(); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_WAIT_SCD"); #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { mfxStatus sts = FillPreEncParams(task); MFX_CHECK_STS(sts); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (m_encTools.isLAHWBRC()) { mfxU32 miniGopSize = m_lpLaStatus.empty() ? 1 : m_lpLaStatus.front().MiniGopSize; mfxU32 pyrWidth = GetPPyrSize(m_video, miniGopSize, true); mfxU32 prevPyrWidth = GetPPyrSize(m_video, m_lastTask.m_lplastatus.MiniGopSize, true); BuildPPyr(task, pyrWidth, true, pyrWidth != prevPyrWidth); } #endif } #endif if (IsExtBrcSceneChangeSupported(m_video, m_core->GetHWType())) { if (task.m_type[0] == 0) task.m_type = GetFrameType(m_video, task.m_frameOrder - m_frameOrderIdrInDisplayOrder); MFX_CHECK_STS(Prd_LTR_Operation(task)); MFX_CHECK_STS(SCD_Get_FrameType(task)); AssignFrameTypes(task); } SubmitMCTF(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_START_MCTF) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_START_MCTF"); if (IsDenoiserSupported(m_video, m_core->GetHWType())) { #if defined(MFX_ENABLE_MCTF_IN_AVC) DdiTask & task = m_MctfStarted.back(); MFX_CHECK_STS(SubmitToMctf(&task)); #endif } OnMctfQueried(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_MCTF) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_WAIT_MCTF"); if (IsDenoiserSupported(m_video, m_core->GetHWType())) { #if defined(MFX_ENABLE_MCTF_IN_AVC) DdiTask & task = m_MctfFinished.front(); MFX_CHECK_STS(QueryFromMctf(&task)); #endif } OnMctfFinished(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_START_LA) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::START_LA"); bool gopStrict = !!(m_video.mfx.GopOptFlag & MFX_GOP_STRICT); bool closeGopForSceneChange = (extOpt2.BRefType != MFX_B_REF_PYRAMID) && IsOn(extOpt2.AdaptiveB); DdiTaskIter task = (m_video.mfx.EncodedOrder) ? m_reordering.begin() : ReorderFrame(m_lastTask.m_dpbPostEncoding, m_reordering.begin(), m_reordering.end(), gopStrict, m_reordering.size() < m_video.mfx.GopRefDist, closeGopForSceneChange); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (!m_lpLaStatus.empty()) { task->m_lplastatus = m_lpLaStatus.front(); // LPLA hints come in encoding order m_lpLaStatus.pop_front(); } #endif if (task == m_reordering.end()) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); task->m_idx = FindFreeResourceIndex(m_raw); task->m_midRaw = AcquireResource(m_raw, task->m_idx); mfxStatus sts = GetNativeHandleToRawSurface(*m_core, m_video, *task, task->m_handleRaw, m_isD3D9SimWithVideoMem); if (sts != MFX_ERR_NONE) return Error(sts); sts = CopyRawSurfaceToVideoMemory(*m_core, m_video, *task, m_isD3D9SimWithVideoMem); if (sts != MFX_ERR_NONE) return Error(sts); #ifdef MFX_ENABLE_EXT if (bIntRateControlLA(m_video.mfx.RateControlMethod)) { mfxHDLPair cmMb = AcquireResourceUp(m_mb); task->m_cmMb = (CmBufferUP *)cmMb.first; task->m_cmMbSys = (void *)cmMb.second; task->m_cmRawLa = (CmSurface2D *)AcquireResource(m_rawLa); task->m_cmCurbe = (CmBuffer *)AcquireResource(m_curbe); task->m_vmeData = FindUnusedVmeData(m_vmeDataStorage); if ((!task->m_cmRawLa && extOpt2.LookAheadDS > MFX_LOOKAHEAD_DS_OFF) || !task->m_cmMb || !task->m_cmCurbe || !task->m_vmeData) { return Error(MFX_ERR_UNDEFINED_BEHAVIOR); } task->m_cmRaw = CreateSurface(m_cmDevice, task->m_handleRaw, m_currentVaType); } #endif #ifdef MFX_ENABLE_FADE_DETECTION if (IsOn(extOpt3.FadeDetection) && m_cmCtx.get() && m_cmCtx->isHistogramSupported()) { mfxHDLPair cmHist = AcquireResourceUp(m_histogram); task->m_cmHist = (CmBufferUP *)cmHist.first; task->m_cmHistSys = (mfxU32 *)cmHist.second; if (!task->m_cmHist) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); memset(task->m_cmHistSys, 0, sizeof(uint)* 512); task->m_cmRawForHist = CreateSurface(m_cmDevice, task->m_handleRaw, m_currentVaType); } #endif task->m_isENCPAK = m_isENCPAK; if (m_isENCPAK && (NULL != bs)) task->m_bs = bs; // keep the hwtype info in case of no VideoCore interface task->m_hwType = m_currentPlatform; ConfigureTask(*task, m_lastTask, m_video, m_caps); Zero(task->m_IRState); if (task->m_tidx == 0) { // current frame is in base temporal layer // insert intra refresh MBs and update base layer counter task->m_IRState = GetIntraRefreshState( m_video, mfxU32(task->m_baseLayerOrder - m_baseLayerOrderStartIntraRefresh), &(task->m_ctrl), m_intraStripeWidthInMBs, m_sliceDivider, m_caps); m_baseLayerOrder ++; } #ifdef MFX_ENABLE_EXT if (bIntRateControlLA(m_video.mfx.RateControlMethod)) { int ffid = task->m_fid[0]; ArrayDpbFrame const & dpb = task->m_dpb[ffid]; ArrayU8x33 const & l0 = task->m_list0[ffid]; ArrayU8x33 const & l1 = task->m_list1[ffid]; DdiTask * fwd = 0; if (l0.Size() > 0) fwd = find_if_ptr4(m_lookaheadFinished, m_lookaheadStarted, m_histRun, m_histWait, FindByFrameOrder(dpb[l0[0] & 127].m_frameOrder)); DdiTask * bwd = 0; if (l1.Size() > 0) bwd = find_if_ptr4(m_lookaheadFinished, m_lookaheadStarted, m_histRun, m_histWait, FindByFrameOrder(dpb[l1[0] & 127].m_frameOrder)); if ((!fwd) && l0.Size() >0 && extOpt2.MaxSliceSize) //TO DO { fwd = &m_lastTask; } task->m_cmRefs = CreateVmeSurfaceG75(m_cmDevice, task->m_cmRaw, fwd ? &fwd->m_cmRaw : 0, bwd ? &bwd->m_cmRaw : 0, !!fwd, !!bwd); if (extOpt2.LookAheadDS > MFX_LOOKAHEAD_DS_OFF) task->m_cmRefsLa = CreateVmeSurfaceG75(m_cmDevice, task->m_cmRawLa, fwd ? &fwd->m_cmRawLa : 0, bwd ? &bwd->m_cmRawLa : 0, !!fwd, !!bwd); task->m_cmRefMb = bwd ? bwd->m_cmMb : 0; task->m_fwdRef = fwd; task->m_bwdRef = bwd; SubmitLookahead(*task); } #endif //printf("\rLA_SUBMITTED do=%4d eo=%4d type=%d\n", task->m_frameOrder, task->m_encOrder, task->m_type[0]); fflush(stdout); if (extOpt2.MaxSliceSize && m_lastTask.m_yuv && !m_caps.ddi_caps.SliceLevelRateCtrl) { if (m_raw.Unlock(m_lastTask.m_idx) == (mfxU32)-1) { m_core->DecreaseReference(*m_lastTask.m_yuv); } #ifdef MFX_ENABLE_EXT ReleaseResource(m_rawLa, m_lastTask.m_cmRawLa); ReleaseResource(m_mb, m_lastTask.m_cmMb); if (m_cmDevice) { m_cmDevice->DestroySurface(m_lastTask.m_cmRaw); m_lastTask.m_cmRaw = NULL; } #endif } m_lastTask = *task; if (extOpt2.MaxSliceSize && m_lastTask.m_yuv && !m_caps.ddi_caps.SliceLevelRateCtrl) { if (m_raw.Lock(m_lastTask.m_idx) == 0) { m_core->IncreaseReference(*m_lastTask.m_yuv); } } OnLookaheadSubmitted(task); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_LA) { mfxStatus sts = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::WAIT_LA"); #ifdef MFX_ENABLE_EXT if (bIntRateControlLA(m_video.mfx.RateControlMethod)) sts = QueryLookahead(m_lookaheadStarted.front()); #endif if(sts != MFX_ERR_NONE) return sts; //printf("\rLA_SYNCED do=%4d eo=%4d type=%d\n", m_lookaheadStarted.front().m_frameOrder, m_lookaheadStarted.front().m_encOrder, m_lookaheadStarted.front().m_type[0]); fflush(stdout); OnLookaheadQueried(); } #ifdef MFX_ENABLE_FADE_DETECTION if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_START_HIST) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_START_HIST"); if (IsOn(extOpt3.FadeDetection) && m_cmCtx.get() && m_cmCtx->isHistogramSupported()) { DdiTask & task = m_histRun.front(); task.m_event = m_cmCtx->RunHistogram(task, m_video.mfx.FrameInfo.CropW, m_video.mfx.FrameInfo.CropH, m_video.mfx.FrameInfo.CropX, m_video.mfx.FrameInfo.CropY); } OnHistogramSubmitted(); } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_HIST) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::STG_BIT_WAIT_HIST"); DdiTask & task = m_histWait.front(); mfxStatus sts = MFX_ERR_NONE; if (IsOn(extOpt3.FadeDetection) && m_cmCtx.get() && m_cmCtx->isHistogramSupported()) sts = m_cmCtx->QueryHistogram(task.m_event); if(sts != MFX_ERR_NONE) return sts; CalcPredWeightTable(task, m_caps.ddi_caps.MaxNum_WeightedPredL0, m_caps.ddi_caps.MaxNum_WeightedPredL1); OnHistogramQueried(); if (bIntRateControlLA(m_video.mfx.RateControlMethod) && extDdi.LookAheadDependency > 0 && m_lookaheadFinished.size() >= extDdi.LookAheadDependency) { DdiTaskIter end = m_lookaheadFinished.end(); DdiTaskIter beg = end; std::advance(beg, -extDdi.LookAheadDependency); AnalyzeVmeData(beg, end, m_video.calcParam.widthLa, m_video.calcParam.heightLa); } } #endif if ((m_stagesToGo & AsyncRoutineEmulator::STG_BIT_START_ENCODE)|| m_bDeferredFrame) { bool bParallelEncPak = (m_video.mfx.RateControlMethod == MFX_RATECONTROL_CQP && m_video.mfx.GopRefDist > 2 && m_video.AsyncDepth > 2); //char task_name [40]; //sprintf(task_name,"Avc::START_ENCODE (%d) - %x", task->m_encOrder, task->m_yuv); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::START_ENCODE"); Hrd hrd = m_hrd; // tmp copy mfxU32 numEncCall = m_bDeferredFrame + 1; for (mfxU32 i = 0; i < numEncCall; i++) { DdiTaskIter task = FindFrameToStartEncode(m_video, m_lookaheadFinished.begin(), m_lookaheadFinished.end()); if (task == m_lookaheadFinished.end()) break; bool toSkip = IsFrameToSkip(*task, m_rec, m_recFrameOrder, m_enabledSwBrc); if ((task->isSEIHRDParam(extOpt, extOpt2) || toSkip) && (!m_encoding.empty())) { // wait until all previously submitted encoding tasks are finished m_bDeferredFrame ++; m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_ENCODE; break; } task->m_initCpbRemoval = hrd.GetInitCpbRemovalDelay(); task->m_initCpbRemovalOffset = hrd.GetInitCpbRemovalDelayOffset(); if (bParallelEncPak) { if (task->m_type[0] & MFX_FRAMETYPE_REF) { m_rec.Lock(m_recNonRef[0]); m_rec.Lock(m_recNonRef[1]); task->m_idxRecon = FindFreeResourceIndex(m_rec); m_rec.Unlock(m_recNonRef[0]); m_rec.Unlock(m_recNonRef[1]); m_recNonRef[0] = m_recNonRef[1] = 0xffffffff; } else { task->m_idxRecon = FindFreeResourceIndex(m_rec); m_recNonRef[0] = m_recNonRef[1]; m_recNonRef[1] = task->m_idxRecon; } } else { task->m_idxRecon = FindFreeResourceIndex(m_rec); } task->m_idxBs[0] = FindFreeResourceIndex(m_bit); task->m_midRec = AcquireResource(m_rec, task->m_idxRecon); task->m_midBit[0] = AcquireResource(m_bit, task->m_idxBs[0]); if (!task->m_midRec || !task->m_midBit[0]) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(m_isPOut) { task->m_procBO[0] = 0; task->m_scanBO[0] = 0; task->m_bsPO[0] = {}; MFX_CHECK(m_core->LockFrame(task->m_midBit[0], &task->m_bsPO[0]) == MFX_ERR_NONE, MFX_ERR_LOCK_MEMORY); MFX_CHECK(task->m_bsPO[0].Y != 0, MFX_ERR_LOCK_MEMORY); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::MARK_BS"); if(m_isPOut) { for(uint32_t o = 0; o < m_maxBsSize / PO_MARK_INTERVAL / 2; o++) *((uint32_t*)(task->m_bsPO[0].Y + PO_MARK_INTERVAL * o)) = PO_EMPTY_MARK; } task->m_nextMarkerPtr[0] = task->m_bsPO[0].Y + 256; } #endif if (task->m_fieldPicFlag) { task->m_idxBs[1] = FindFreeResourceIndex(m_bit); task->m_midBit[1] = AcquireResource(m_bit, task->m_idxBs[1]); if (!task->m_midBit[1]) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(m_isPOut) { task->m_procBO[1] = 0; task->m_scanBO[1] = 0; //this should disable repack effectivly setting NumPakPasses = 1 in driver task->m_minQP = 1; task->m_maxQP = 51; task->m_bsPO[0] = {}; MFX_CHECK(m_core->LockFrame(task->m_midBit[0], &task->m_bsPO[0]) == MFX_ERR_NONE, MFX_ERR_LOCK_MEMORY); mfxU8* ptr = task->m_bsPO[0].Y; MFX_CHECK(ptr != 0, MFX_ERR_LOCK_MEMORY); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::MARK_BS"); const uint32_t offsets = m_maxBsSize >> 9; // m_maxBsSize / 256 / 2; mfxU8* ptrS = ptr; for(uint32_t o = 0; o < offsets; o++) { *((uint32_t*)(ptr)) = PO_EMPTY_MARK; ptr += PO_MARK_INTERVAL; } task->m_nextMarkerPtr[0] = ptrS + PO_MARK_INTERVAL; } #endif } // Change DPB m_recFrameOrder[task->m_idxRecon] = task->m_frameOrder; Change_DPB(task->m_dpb[0], m_rec.mids, m_recFrameOrder); Change_DPB(task->m_dpb[1], m_rec.mids, m_recFrameOrder); Change_DPB(task->m_dpbPostEncoding, m_rec.mids, m_recFrameOrder); if (m_enabledSwBrc) { task->InitBRCParams(); if (bIntRateControlLA(m_video.mfx.RateControlMethod)) BrcPreEnc(*task); if (IsExtBrcSceneChangeSupported(m_video, m_core->GetHWType()) && (task->GetFrameType() & MFX_FRAMETYPE_I) && (task->m_encOrder == 0 || m_video.mfx.GopPicSize != 1)) { mfxStatus sts = CalculateFrameCmplx(*task, task->m_brcFrameParams.FrameCmplx); if (sts != MFX_ERR_NONE) return Error(sts); } #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { mfxStatus etSts; etSts = m_encTools.SubmitFrameForEncoding(*task); MFX_CHECK_STS(etSts); etSts = EncToolsGetFrameCtrl(*task); MFX_CHECK_STS(etSts); } else #endif m_brc.GetQp(task->m_brcFrameParams, task->m_brcFrameCtrl); UpdateBRCParams(*task); if ((m_video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || m_video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) { m_LtrOrder = task->m_LtrOrder; m_LtrQp = (task->m_longTermFrameIdx != NO_INDEX_U8) ? task->m_cqpValue[0] : task->m_LtrQp; if (task->m_type[0] & MFX_FRAMETYPE_REF) { m_RefQp = task->m_cqpValue[0]; m_RefOrder = task->m_frameOrder; } } if (extOpt2.MaxSliceSize) { mfxStatus sts = FillSliceInfo(*task, extOpt2.MaxSliceSize, extOpt2.MaxSliceSize * m_NumSlices, m_video.calcParam.widthLa, m_video.calcParam.heightLa); if (sts != MFX_ERR_NONE) return Error(sts); //printf("EST frameSize %d\n", m_brc.GetDistFrameSize()); } } auto mode = GetMBQPMode(m_caps, m_video); if (mode) { mfxFrameData qpMap[2] = {}; std::unique_ptr lock[2]; for (int f = 0; f <= task->m_fieldPicFlag; f++) { if (!task->m_midMBQP[f]) { task->m_idxMBQP[f] = FindFreeResourceIndex(m_mbqp); task->m_midMBQP[f] = AcquireResource(m_mbqp, task->m_idxMBQP[f]); MFX_CHECK(task->m_midMBQP[f], MFX_ERR_UNDEFINED_BEHAVIOR); } lock[f].reset(new FrameLocker(m_core, qpMap[f], task->m_midMBQP[f])); MFX_CHECK_NULL_PTR1(qpMap[f].Y); } mfxExtMBQP const* mbqpExt = GetExtBuffer(task->m_ctrl); mfxExtEncoderROI const* extRoi = GetExtBuffer(task->m_ctrl); if (mode == MBQPMode_ExternalMap && mbqpExt) { mfxU8* maps[2] = {qpMap[0].Y,qpMap[1].Y}; mfxStatus sts = FillMBQPData(mbqpExt, m_video.mfx.FrameInfo.CropW, m_video.mfx.FrameInfo.CropH, maps, m_mbqpInfo.pitch, m_mbqpInfo.height_aligned, m_mbqpInfo.block_width, m_mbqpInfo.block_height, task->m_fieldPicFlag, task->m_isMBQP); MFX_CHECK_STS(sts); } else if (mode == MBQPMode_ForROI && extRoi) { MFX_CHECK(task->m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); mfxStatus sts = FillMBMapViaROI(*extRoi, (mfxI8*)qpMap[0].Y, m_mbqpInfo.Info.Width, m_mbqpInfo.Info.Height, m_mbqpInfo.pitch, m_mbqpInfo.block_width, m_mbqpInfo.block_height, task->m_cqpValue[0]); MFX_CHECK_STS(sts); task->m_isMBQP[0] = true; } #ifdef MFX_ENABLE_APQ_LQ else if (mode == MBQPMode_ForALQOffset) { MFX_CHECK(task->m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); if (task->m_ALQOffset != 0) { bool MBQP_forALQOffset = true; if (task->m_ALQOffset > 0) { if (task->m_cqpValue[0] > task->m_ALQOffset) task->m_cqpValue[0] = (mfxU8)((mfxI32)task->m_cqpValue[0] - task->m_ALQOffset); else { task->m_ALQOffset = 0; MBQP_forALQOffset = false; } } else if (task->m_ALQOffset < 0 && task->m_cqpValue[0] > 51 + task->m_ALQOffset) { task->m_ALQOffset = 0; MBQP_forALQOffset = false; } if (MBQP_forALQOffset) { MFX_CHECK(task->m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); mfxStatus sts = FillCUQPData((mfxU8)mfx::clamp(task->m_ALQOffset + task->m_cqpValue[0], 1, 51), (mfxI8*)qpMap[0].Y, m_mbqpInfo.pitch, m_mbqpInfo.height_aligned); MFX_CHECK_STS(sts); task->m_isMBQP[0] = true; } } } #endif } // In case of progressive frames in PAFF mode need to switch the flag off to prevent m_fieldCounter changes task->m_singleFieldMode = false; if (toSkip) { mfxStatus sts = CodeAsSkipFrame(*m_core, m_video, *task, m_rawSkip, m_rec); if (sts != MFX_ERR_NONE) return Error(sts); } for (mfxU32 f = 0; f <= task->m_fieldPicFlag; f++) { mfxU32 fieldId = task->m_fid[f]; mfxU16 recovery_frame_cnt = (mfxU16)std::count_if(m_reordering.begin(), m_reordering.end(), [](DdiTask task_item) {return task_item.m_type[0] & MFX_FRAMETYPE_REF; }); if (!IsOn(extOpt.FramePicture)) recovery_frame_cnt *= 2; // assume that both paired fields are or aren't reference. PrepareSeiMessageBuffer(m_video, *task, fieldId, m_sei, recovery_frame_cnt); #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE bool needSvcPrefix = IsSvcProfile(m_video.mfx.CodecProfile) || (m_video.calcParam.numTemporalLayer > 0); #else bool needSvcPrefix = (m_video.calcParam.numTemporalLayer > 0); #endif if (task->m_insertAud[f] == 0 && task->m_insertSps[f] == 0 && task->m_insertPps[f] == 0 && m_sei.Size() == 0 && needSvcPrefix == 0) task->m_AUStartsFromSlice[f] = 1; else task->m_AUStartsFromSlice[f] = 0; #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (isAdaptiveCQMSupported(extOpt3.ScenarioInfo, IsOn(m_video.mfx.LowPower))) SetupAdaptiveCQM(m_video, *task, m_qpHistory); #endif mfxStatus sts = MFX_ERR_NONE; #ifdef MFX_ENABLE_ENCODE_STATS task->m_frameLevelQueryEn = m_frameLevelQueryEn; task->m_blockLevelQueryEn = m_blockLevelQueryEn; #endif //printf("Execute: %d, type %d, qp %d\n", task->m_frameOrder, task->m_type[0], task->m_cqpValue[0]); #if defined(MFX_ENABLE_MCTF_IN_AVC) if(task->m_handleMCTF.first)//Intercept encoder so MCTF denoised frame can be fed at the right moment. sts = m_ddi->Execute(task->m_handleMCTF, *task, fieldId, m_sei); else #endif sts = m_ddi->Execute(task->m_handleRaw, *task, fieldId, m_sei); MFX_CHECK(sts == MFX_ERR_NONE, Error(sts)); #ifndef MFX_AVC_ENCODING_UNIT_DISABLE if (task->m_collectUnitsInfo && m_sei.Size() > 0) { mfxU32 offset = task->m_headersCache[fieldId].size() > 0 ? task->m_headersCache[fieldId].back().Offset + task->m_headersCache[fieldId].back().Size : 0; task->m_headersCache[fieldId].emplace_back(); task->m_headersCache[fieldId].back().Type = NALU_SEI; task->m_headersCache[fieldId].back().Size = m_sei.Size(); task->m_headersCache[fieldId].back().Offset = offset; } #endif /* FEI Field processing mode: store first field */ if (task->m_singleFieldMode && (0 == m_fieldCounter)) { m_fieldCounter = 1; task->m_bsDataLength[0] = task->m_bsDataLength[1] = 0; sts = QueryStatus(*task, fieldId); MFX_CHECK(sts == MFX_ERR_NONE, Error(sts)); if ((NULL == task->m_bs) && (bs != NULL)) task->m_bs = bs; sts = UpdateBitstream(*task, fieldId); MFX_CHECK(sts == MFX_ERR_NONE, Error(sts)); /*DO NOT submit second field for execution in this case * (FEI Field processing mode)*/ break; } } //printf("\rENC_SUBMITTED do=%4d eo=%4d type=%d\n", task->m_frameOrder, task->m_encOrder, task->m_type[0]); fflush(stdout); OnEncodingSubmitted(task); if (m_bDeferredFrame) m_bDeferredFrame--; } m_stagesToGo &= ~AsyncRoutineEmulator::STG_BIT_START_ENCODE; } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_ENCODE) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Avc::WAIT_ENCODE"); DdiTaskIter task = FindFrameToWaitEncode(m_encoding.begin(), m_encoding.end()); mfxStatus sts = MFX_ERR_NONE; #ifdef MFX_ENABLE_ENCODE_STATS if (bs) task->m_encodeStats = MfxExtBuffer::Get(*bs); else task->m_encodeStats = nullptr; #endif //MFX_ENABLE_ENCODE_STATS if (m_enabledSwBrc) { for (;; ++task->m_repack) { mfxU32 bsDataLength = 0; for (mfxU32 f = 0; f <= task->m_fieldPicFlag; f++) { if ((sts = QueryStatus(*task, task->m_fid[f])) != MFX_ERR_NONE) return sts; bsDataLength += task->m_bsDataLength[task->m_fid[f]]; } //printf("Real frameSize %d, repack %d\n", bsDataLength, task->m_repack); bool bRecoding = task->m_toRecode; if (!bRecoding && extOpt2.MaxSliceSize) { sts = CheckSliceSize(*task, bRecoding); if (sts != MFX_ERR_NONE) return Error(sts); } if (!bRecoding) { if (IsOn(extOpt2.MBBRC)) task->m_brcFrameCtrl.QpY = task->m_cqpValue[0]; sts = CheckBRCStatus(*task, bRecoding, bsDataLength); if (sts != MFX_ERR_NONE) return Error(sts); } if (!bRecoding) { sts = CheckBufferSize(*task, bRecoding, bsDataLength, bs); if (bRecoding) task->m_brcFrameCtrl.QpY = task->m_cqpValue[0]; if (sts != MFX_ERR_NONE) return Error(sts); } if (bRecoding) { DdiTaskIter curTask = task; DdiTaskIter nextTask; task->m_toRecode = false; // wait for next tasks while ((nextTask = FindFrameToWaitEncodeNext(m_encoding.begin(), m_encoding.end(), curTask)) != curTask) { for (mfxU32 f = 0; f <= nextTask->m_fieldPicFlag; f++) { while ((sts = QueryStatus(*nextTask, nextTask->m_fid[f])) == MFX_TASK_BUSY) { std::this_thread::yield(); } if (sts != MFX_ERR_NONE) return sts; } if (!extOpt2.MaxSliceSize) { #if defined(MFX_ENABLE_ENCTOOLS) if (m_enabledEncTools) { mfxStatus etSts = EncToolsGetFrameCtrl(*nextTask); MFX_CHECK_STS(etSts); } else #endif m_brc.GetQpForRecode(nextTask->m_brcFrameParams, nextTask->m_brcFrameCtrl); UpdateBRCParams(*nextTask); bRecoding = true; } curTask = nextTask; } // restart encoded task nextTask = curTask = task; do { if (m_enabledSwBrc && (m_video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || m_video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) { if (nextTask->m_longTermFrameIdx != NO_INDEX_U8 && nextTask->m_LtrOrder == m_LtrOrder) { m_LtrQp = nextTask->m_cqpValue[0]; } if (nextTask->m_type[0] & MFX_FRAMETYPE_REF) { m_RefQp = nextTask->m_cqpValue[0]; m_RefOrder = nextTask->m_frameOrder; } } curTask = nextTask; curTask->m_bsDataLength[0] = curTask->m_bsDataLength[1] = 0; bool toSkip = IsFrameToSkip(*curTask, m_rec, m_recFrameOrder, m_enabledSwBrc); if (toSkip) { sts = CodeAsSkipFrame(*m_core, m_video, *curTask, m_rawSkip, m_rec); if (sts == MFX_WRN_DEVICE_BUSY) { curTask->m_toRecode = true; } else if (sts != MFX_ERR_NONE) return Error(sts); } if (GetMBQPMode(m_caps, m_video) == MBQPMode_ForALQOffset && curTask->m_ALQOffset && curTask->m_isMBQP[0]) { mfxFrameData qpMap = {}; FrameLocker lock(m_core, qpMap, curTask->m_midMBQP[0]); MFX_CHECK_NULL_PTR1(qpMap.Y); MFX_CHECK(curTask->m_fieldPicFlag == 0, MFX_ERR_NOT_IMPLEMENTED); sts = FillCUQPData((mfxU8)mfx::clamp(curTask->m_ALQOffset + curTask->m_cqpValue[0], 1, 51), (mfxI8*)qpMap.Y, m_mbqpInfo.pitch, m_mbqpInfo.height_aligned); MFX_CHECK_STS(sts); } for (mfxU32 f = 0; f <= curTask->m_fieldPicFlag; f++) { PrepareSeiMessageBuffer(m_video, *curTask, curTask->m_fid[f], m_sei); while ((sts = m_ddi->Execute(curTask->m_handleRaw, *curTask, curTask->m_fid[f], m_sei)) == MFX_TASK_BUSY) { std::this_thread::yield(); } if (sts != MFX_ERR_NONE) return Error(sts); } } while ((nextTask = FindFrameToWaitEncodeNext(m_encoding.begin(), m_encoding.end(), curTask)) != curTask); continue; } break; } m_rec.SetFlag(task->m_idxRecon, H264_FRAME_FLAG_READY); task->m_bs = bs; for (mfxU32 f = 0; f <= task->m_fieldPicFlag; f++) { //printf("Update bitstream: %d, len %d\n",task->m_encOrder, task->m_bsDataLength[task->m_fid[f]]); if ((sts = UpdateBitstream(*task, task->m_fid[f])) != MFX_ERR_NONE) return Error(sts); } m_NumSlices = (mfxU32)task->m_SliceInfo.size(); if (extOpt2.MaxSliceSize && task->m_repack < 4) { mfxF32 w_avg = 0; for (size_t t = 0; t < task->m_SliceInfo.size(); t ++ ) w_avg = w_avg + task->m_SliceInfo[t].weight; w_avg = w_avg/m_NumSlices; if (w_avg < 70.0f) m_NumSlices = (mfxU32)w_avg* m_NumSlices / 70; } OnEncodingQueried(task); } else if (IsOff(extOpt.FieldOutput)) { mfxU32 f = 0; mfxU32 f_start = 0; mfxU32 f_end = task->m_fieldPicFlag; /* Query results if NO FEI Field processing mode (this is legacy encoding) */ if (!task->m_singleFieldMode) { #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(m_isPOut) { do { //polling while get busy state for(f = f_start; f <= f_end; f++) { sts = QueryStatus(*task, task->m_fid[f], false); switch(sts) { case MFX_TASK_DONE: break; case MFX_TASK_BUSY: break; default: return sts; } } task->m_bs = bs; for(f = f_start; f <= f_end; f++) { sts = UpdateBitstream(*task, task->m_fid[f]); if(sts == MFX_ERR_NONE) { sts = QueryStatus(*task, task->m_fid[f], false); }else if(sts == MFX_TASK_BUSY) break; MFX_CHECK(sts == MFX_ERR_NONE, sts); if(task->m_bsPO[f].Y != 0) { MFX_CHECK(m_core->UnlockFrame(task->m_midBit[f], &task->m_bsPO[f]) == MFX_ERR_NONE, MFX_ERR_LOCK_MEMORY); } } } while(sts == MFX_TASK_BUSY); } else { #endif for(f = f_start; f <= f_end; f++) { if((sts = QueryStatus(*task, task->m_fid[f])) != MFX_ERR_NONE) return sts; } task->m_bs = bs; for(f = f_start; f <= f_end; f++) { if((sts = UpdateBitstream(*task, task->m_fid[f])) != MFX_ERR_NONE) return Error(sts); } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) } #endif OnEncodingQueried(task); } // if (!task->m_singleFieldMode) } else { std::pair * pair = reinterpret_cast *>(bs); assert(pair->second < 2); task->m_bs = pair->first; mfxU32 fid = task->m_fid[pair->second & 1]; if ((sts = QueryStatus(*task, fid)) != MFX_ERR_NONE) return sts; if ((sts = UpdateBitstream(*task, fid)) != MFX_ERR_NONE) return Error(sts); if (task->m_fieldCounter == 2) { OnEncodingQueried(task); UMC::AutomaticUMCMutex guard(m_listMutex); m_listOfPairsForFieldOutputMode.pop_front(); m_listOfPairsForFieldOutputMode.pop_front(); } } } if (m_stagesToGo & AsyncRoutineEmulator::STG_BIT_RESTART) { m_stagesToGo = AsyncRoutineEmulator::STG_BIT_CALL_EMULATOR; return MFX_TASK_BUSY; } return MFX_TASK_DONE; } //function to be called from SyncOp to complete bitstream DataLength update //param should conttain pointer to bitstream mfxStatus ImplementationAvc::UpdateBitstreamData(void * state, void * param) { ImplementationAvc & impl = *(ImplementationAvc *)state; if (impl.m_failedStatus != MFX_ERR_NONE) return impl.m_failedStatus; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(impl.m_isPOut) { return impl.NextBitstreamDataLength((mfxBitstream *)param); } #endif return MFX_ERR_NONE; } mfxStatus ImplementationAvc::AsyncRoutineHelper(void * state, void * param, mfxU32, mfxU32) { ImplementationAvc & impl = *(ImplementationAvc *)state; if (impl.m_failedStatus != MFX_ERR_NONE) return impl.m_failedStatus; mfxStatus sts = MFX_ERR_NONE; try { sts = impl.AsyncRoutine((mfxBitstream *)param); if (sts != MFX_TASK_BUSY && sts != MFX_TASK_DONE #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) && sts != MFX_ERR_NONE_PARTIAL_OUTPUT #endif ) impl.m_failedStatus = sts; } catch (...) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Exception on AsyncRoutine!"); impl.m_failedStatus = MFX_ERR_DEVICE_FAILED; sts = MFX_ERR_DEVICE_FAILED; } return sts; } mfxStatus ImplementationAvc::EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT entryPoints[], mfxU32 & numEntryPoints) { char task_name [240]; snprintf(task_name, sizeof(task_name)-1, "Avc::EncodeFrameCheck - %p", surface); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, task_name); mfxExtCodingOption const & extOpt = GetExtBufferRef(m_video); if (IsOff(extOpt.FieldOutput)) { #ifdef MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT if(m_isPOut) { //save new bitstream in map std::lock_guard lock(m_offsetMutex); m_offsetsMap[bs] = std::queue(); } #endif return EncodeFrameCheckNormalWay(ctrl, surface, bs, reordered_surface, internalParams, entryPoints, numEntryPoints); } else { if (m_fieldCounter == 0) { mfxStatus sts = EncodeFrameCheckNormalWay(ctrl, surface, bs, reordered_surface, internalParams, entryPoints, numEntryPoints); if (sts == MFX_WRN_DEVICE_BUSY || sts < MFX_ERR_NONE) return sts; UMC::AutomaticUMCMutex guard(m_listMutex); m_listOfPairsForFieldOutputMode.push_back(std::make_pair(bs, 0)); entryPoints->pParam = &m_listOfPairsForFieldOutputMode.back(); m_fieldCounter = 1; m_1stFieldStatus = sts; MFX_RETURN(MFX_ERR_MORE_BITSTREAM); } else { m_fieldCounter = 0; *reordered_surface = surface; UMC::AutomaticUMCMutex guard(m_listMutex); m_listOfPairsForFieldOutputMode.push_back(std::make_pair(bs, 1)); entryPoints[0].pState = this; entryPoints[0].pParam = &m_listOfPairsForFieldOutputMode.back(); entryPoints[0].pCompleteProc = 0; entryPoints[0].pOutputPostProc = #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) m_isPOut ? UpdateBitstreamData : #endif nullptr; entryPoints[0].requiredNumThreads = 1; entryPoints[0].pRoutineName = "AsyncRoutine"; entryPoints[0].pRoutine = AsyncRoutineHelper; numEntryPoints = 1; return m_1stFieldStatus; } } } mfxStatus ImplementationAvc::EncodeFrameCheckNormalWay( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * ,//internalParams, MFX_ENTRY_POINT entryPoints[], mfxU32 & numEntryPoints) { MFX_CHECK_STS(m_failedStatus); bool vpl_interface = SupportsVPLFeatureSet(*m_core); mfxStatus checkSts = CheckEncodeFrameParam( m_video, ctrl, surface, bs, m_core->IsExternalFrameAllocator() || vpl_interface, m_caps); if (checkSts < MFX_ERR_NONE) return checkSts; mfxStatus status = checkSts; { UMC::AutomaticUMCMutex guard(m_listMutex); if (m_free.empty()) return MFX_WRN_DEVICE_BUSY; } mfxU32 stagesToGo = m_emulatorForSyncPart.Go(!!surface); while (stagesToGo & AsyncRoutineEmulator::STG_BIT_RESTART) stagesToGo = m_emulatorForSyncPart.Go(!!surface); if (stagesToGo == AsyncRoutineEmulator::STG_BIT_CALL_EMULATOR) MFX_RETURN(MFX_ERR_MORE_DATA); // end of encoding session #ifdef MFX_ENABLE_ENCODE_STATS if (bs) { mfxExtEncodeStatsOutput* pStats = MfxExtBuffer::Get(*bs); m_frameLevelQueryEn = pStats == nullptr ? false : !!(pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_FRAME); m_blockLevelQueryEn = pStats == nullptr ? false : !!(pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_BLK); } else { m_frameLevelQueryEn = false; m_blockLevelQueryEn = false; } #endif if ((stagesToGo & AsyncRoutineEmulator::STG_BIT_WAIT_ENCODE) == 0) { status = mfxStatus(MFX_ERR_MORE_DATA_SUBMIT_TASK); bs = 0; // no output will be generated } if (surface) { mfxEncodeCtrl defaultCtrl = {}; if (ctrl == 0) ctrl = &defaultCtrl; UMC::AutomaticUMCMutex guard(m_listMutex); m_free.front().m_yuv = surface; m_free.front().m_ctrl = *ctrl; m_free.front().m_type = ExtendFrameType(ctrl->FrameType); m_free.front().m_extFrameTag = surface->Data.FrameOrder; m_free.front().m_frameOrder = surface->Data.FrameOrder; m_free.front().m_timeStamp = surface->Data.TimeStamp; m_core->IncreaseReference(*surface); mfxU16 const MaxNumOfROI = 0; m_free.front().m_roi.Resize(MaxNumOfROI); m_stat.NumCachedFrame++; m_incoming.splice(m_incoming.end(), m_free, m_free.begin()); } *reordered_surface = surface; entryPoints[0].pState = this; entryPoints[0].pParam = bs; entryPoints[0].pCompleteProc = 0; entryPoints[0].pOutputPostProc = #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) m_isPOut ? UpdateBitstreamData : #endif nullptr; entryPoints[0].requiredNumThreads = 1; entryPoints[0].pRoutineName = "AsyncRoutine"; entryPoints[0].pRoutine = AsyncRoutineHelper; numEntryPoints = 1; return status; } #ifdef MFX_ENABLE_EXT void ImplementationAvc::SubmitLookahead( DdiTask & task) { task.m_vmeData->poc = task.GetPoc(0); task.m_vmeData->pocL0 = task.m_fwdRef ? task.m_fwdRef->GetPoc(0) : 0xffffffff; task.m_vmeData->pocL1 = task.m_bwdRef ? task.m_bwdRef->GetPoc(0) : 0xffffffff; task.m_vmeData->encOrder = task.m_encOrder; task.m_vmeData->used = true; task.m_event = m_cmCtx->RunVme(task, 26); } mfxStatus ImplementationAvc::QueryLookahead( DdiTask & task) { return m_cmCtx->QueryVme(task, task.m_event); } #endif mfxStatus ImplementationAvc::QueryStatus( DdiTask & task, mfxU32 fid, bool useEvent) { if (task.m_bsDataLength[fid] == 0) { mfxStatus sts = MFX_TASK_BUSY; sts = m_ddi->QueryStatus(task, fid, useEvent); MFX_TRACE_3("m_ddi->QueryStatus", "Task[field=%d feedback=%d] sts=%d \n", fid, task.m_statusReportNumber[fid], sts); if (sts == MFX_WRN_DEVICE_BUSY) return MFX_TASK_BUSY; if (sts != MFX_ERR_NONE) return Error(sts); if (m_video.Protected == 0) if ((sts = CountLeadingFF(*m_core, task, fid #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) , m_isPOut #endif )) != MFX_ERR_NONE) return Error(sts); } return MFX_ERR_NONE; } mfxStatus ImplementationAvc::UpdateBitstream( DdiTask & task, mfxU32 fid) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ImplementationAvc::UpdateBitstream"); mfxFrameData bitstream = #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) task.m_bsPO[fid]; #else {}; #endif mfxU32 bsSizeAvail = task.m_bs->MaxLength - task.m_bs->DataOffset - task.m_bs->DataLength; mfxU8 *bsData = task.m_bs->Data + task.m_bs->DataOffset + task.m_bs->DataLength; mfxU32 dataLength = task.m_bs->DataLength; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if (m_isPOut && task.m_bsDataLength[fid] == 0) { mfxU8 *alignedEndPtr = (bitstream.Y + bsSizeAvail); MFX_CHECK((!(task.m_procBO[fid] && *(uint32_t*)bitstream.Y != PO_EMPTY_MARK)), MFX_ERR_DEVICE_FAILED); mfxU8* nptr = task.m_nextMarkerPtr[fid]; while ((nptr < alignedEndPtr) && (*(uint32_t*)nptr != PO_EMPTY_MARK)) nptr += PO_MARK_INTERVAL; mfxU32 bsSizeActual = (int)(nptr - bitstream.Y) - PO_MARK_INTERVAL, bsSizeToCopy = 0; mfxU8* alignedTailPtr = bitstream.Y + bsSizeActual; task.m_nextMarkerPtr[fid] = nptr; if (bsSizeActual > task.m_procBO[fid] + 5) { if (m_modePOut == MFX_PARTIAL_BITSTREAM_BLOCK) { bsSizeToCopy = (bsSizeActual - task.m_procBO[fid] > m_blockPOut) ? m_blockPOut : 0; } else if(m_modePOut == MFX_PARTIAL_BITSTREAM_SLICE) { //scan bitstream for next slice starting from the previous scan position mfxU8 *nextNAL = bitstream.Y + task.m_scanBO[fid]; mfxU8 curNALType = task.m_curNALtype; if (task.m_scanBO[fid] == task.m_procBO[fid]) { nextNAL += (nextNAL[2] == 1) ? 3 : 4; curNALType = *nextNAL & 0x1f; } mfxU32 b4 = (0xffff<<16) | (nextNAL[0] << 8) | nextNAL[1]; for(; nextNAL < alignedTailPtr - 5; ++nextNAL) { b4 <<= 8; b4 |= nextNAL[2]; if((b4 & 0x00ffffff) == 1) { if(curNALType == 0x01 /*NAL_UT_SLICE*/ || curNALType == 0x05 /*NAL_UT_IDR_SLICE*/) { bsSizeToCopy = (mfxU32)(nextNAL - bitstream.Y) - task.m_procBO[fid]; if(b4 == 1) bsSizeToCopy--; break; } else { nextNAL += 3; curNALType = *nextNAL & 0x1f; } } } task.m_curNALtype = curNALType; task.m_scanBO[fid] = (int)(nextNAL - bitstream.Y); } else { bsSizeToCopy = bsSizeActual - task.m_procBO[fid]; } } if(!bsSizeToCopy) return MFX_TASK_BUSY; //scheduler should respin task FastCopyBufferVid2Sys(bsData, bitstream.Y + task.m_procBO[fid], bsSizeToCopy); task.m_procBO[fid] += bsSizeToCopy; *(int *)bitstream.Y = PO_EMPTY_MARK; setFrameInfo(task, fid); task.m_bs->TimeStamp = task.m_timeStamp; task.m_bs->DecodeTimeStamp = CalcDTSFromPTS(m_video.mfx.FrameInfo, mfxU16(task.m_dpbOutputDelay), task.m_timeStamp); task.m_bs->PicStruct = task.GetPicStructForDisplay(); task.m_bs->FrameType = task.m_type[task.GetFirstField()] & ~MFX_FRAMETYPE_KEYPIC; if(task.m_fieldPicFlag) { task.m_bs->FrameType = mfxU16(task.m_bs->FrameType | ((task.m_type[!task.GetFirstField()] & ~MFX_FRAMETYPE_KEYPIC) << 8)); } dataLength += bsSizeToCopy; addPartialOutputOffset(task, dataLength); return MFX_ERR_NONE_PARTIAL_OUTPUT; } #endif bool needIntermediateBitstreamBuffer = m_video.calcParam.numTemporalLayer > 0 || (IsSlicePatchNeeded(task, fid) || (m_video.mfx.NumRefFrame & 1)); bool doPatch = (IsOn(m_video.mfx.LowPower) && (m_video.calcParam.numTemporalLayer > 0)) || needIntermediateBitstreamBuffer || IsInplacePatchNeeded(m_video, task, fid); if ((!((IsOn(m_video.mfx.LowPower) && (m_video.calcParam.numTemporalLayer > 0))) && m_caps.ddi_caps.HeaderInsertion == 0) || m_video.Protected != 0) doPatch = needIntermediateBitstreamBuffer = false; // Lock d3d surface with compressed picture. MFX_LTRACE_S(MFX_TRACE_LEVEL_INTERNAL, task.m_FrameName); FrameLocker lock(m_core, bitstream, task.m_midBit[fid], false, #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) !m_isPOut #else true #endif ); MFX_CHECK(bitstream.Y != 0, MFX_ERR_LOCK_MEMORY); mfxU32 skippedff = task.m_numLeadingFF[fid]; task.m_bsDataLength[fid] -= skippedff; bitstream.Y += skippedff; if ((!m_video.Protected || task.m_notProtected) && (*((mfxU32*)bitstream.Y) == 0x00)) { MFX_LTRACE_S(MFX_TRACE_LEVEL_EXTCALL, "First 4 bytes of output bitstream don't contain Annex B NAL unit startcode - start_code_prefix_one_3bytes"); } mfxU32 bsSizeActual = task.m_bsDataLength[fid]; mfxU32 bsSizeToCopy = task.m_bsDataLength[fid]; #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if (m_isPOut && task.m_procBO[fid] < (uint32_t)task.m_bsDataLength[fid]) { if (m_modePOut == MFX_PARTIAL_BITSTREAM_BLOCK) { bsSizeActual = std::min(m_blockPOut, (mfxU32)task.m_bsDataLength[fid] - task.m_procBO[fid]); bsSizeToCopy = bsSizeActual; } else if (m_modePOut == MFX_PARTIAL_BITSTREAM_SLICE) { NalUnit nal; bsSizeToCopy = 0; do { nal = GetNalUnit(bitstream.Y + task.m_procBO[fid] + bsSizeToCopy, bitstream.Y + task.m_bsDataLength[fid]); bsSizeToCopy += (uint32_t)(nal.end - nal.begin); } while (nal.type != 0x01 && nal.type != 0x05); bsSizeActual = bsSizeToCopy; } else if (m_modePOut == MFX_PARTIAL_BITSTREAM_ANY) { bsSizeActual = (mfxU32)task.m_bsDataLength[fid] - task.m_procBO[fid]; bsSizeToCopy = bsSizeActual; } } #endif if (m_video.Protected == 0 || task.m_notProtected) { if (needIntermediateBitstreamBuffer) { bsData = &m_tmpBsBuf[0]; bsSizeAvail = mfxU32(m_tmpBsBuf.size()); } } mfxU32 initialDataLength = dataLength; assert(bsSizeToCopy <= bsSizeAvail); if (bsSizeToCopy > bsSizeAvail) { bsSizeToCopy = bsSizeAvail; bsSizeActual = bsSizeAvail; if (m_video.Protected) { bsSizeToCopy = mfx::align2_value(bsSizeToCopy - 15, 16); bsSizeActual = std::min(bsSizeActual, bsSizeToCopy); } } // Avoid segfaults on very high bitrates if (bsSizeToCopy > m_maxBsSize #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) && !m_isPOut #endif ) { // bsSizeToCopy = m_maxBsSize; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Too big bitstream surface unlock (bitstream)"); MFX_LTRACE_S(MFX_TRACE_LEVEL_INTERNAL, task.m_FrameName); lock.Unlock(); return Error(MFX_ERR_DEVICE_FAILED); } // Copy compressed picture from d3d surface to buffer in system memory if (bsSizeToCopy) { #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) FastCopyBufferVid2Sys(bsData, bitstream.Y + task.m_procBO[fid], bsSizeToCopy); task.m_procBO[fid] += bsSizeToCopy; #else FastCopyBufferVid2Sys(bsData, bitstream.Y, bsSizeToCopy); #endif } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(!m_isPOut) #endif { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Surface unlock (bitstream)"); MFX_LTRACE_S(MFX_TRACE_LEVEL_INTERNAL, task.m_FrameName); mfxStatus sts = lock.Unlock(); MFX_CHECK_STS(sts); } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) else { if (task.m_procBO[fid] < (uint32_t)task.m_bsDataLength[fid]) { setFrameInfo(task, fid); task.m_bs->TimeStamp = task.m_timeStamp; task.m_bs->DecodeTimeStamp = CalcDTSFromPTS(m_video.mfx.FrameInfo, mfxU16(task.m_dpbOutputDelay), task.m_timeStamp); task.m_bs->PicStruct = task.GetPicStructForDisplay(); task.m_bs->FrameType = task.m_type[task.GetFirstField()] & ~MFX_FRAMETYPE_KEYPIC; if (task.m_fieldPicFlag) task.m_bs->FrameType = mfxU16(task.m_bs->FrameType | ((task.m_type[!task.GetFirstField()] & ~MFX_FRAMETYPE_KEYPIC) << 8)); dataLength += bsSizeToCopy; addPartialOutputOffset(task, dataLength); return MFX_ERR_NONE_PARTIAL_OUTPUT; } } #endif if (doPatch #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) && !m_isPOut #endif ) { mfxU8 * dbegin = bsData; mfxU8 * dend = bsData + bsSizeActual; if (needIntermediateBitstreamBuffer) { dbegin = task.m_bs->Data + task.m_bs->DataOffset + task.m_bs->DataLength; dend = task.m_bs->Data + task.m_bs->MaxLength; } mfxU8 * endOfPatchedBitstream = IsOn(m_video.mfx.LowPower)? InsertSVCNAL(task, fid, bsData, bsData + bsSizeActual, dbegin, dend)://insert SVC NAL for temporal scalability PatchBitstream(m_video, task, fid, bsData, bsData + bsSizeActual, dbegin, dend); dataLength += (mfxU32)(endOfPatchedBitstream - dbegin); } else { dataLength += bsSizeActual; } if (m_enabledSwBrc) { mfxU32 minFrameSize = task.m_minFrameSize; mfxU32 frameSize = dataLength - initialDataLength; bsData += frameSize; bsSizeAvail -= frameSize; if (frameSize < minFrameSize) { CheckedMemset(bsData, bsData + bsSizeAvail, 0, minFrameSize - frameSize); dataLength += minFrameSize - frameSize; } else { CheckedMemset(bsData, bsData + bsSizeAvail, 0, skippedff); dataLength += skippedff; } } setFrameInfo(task, fid); // Update bitstream fields task.m_bs->TimeStamp = task.m_timeStamp; task.m_bs->DecodeTimeStamp = CalcDTSFromPTS(m_video.mfx.FrameInfo, mfxU16(task.m_dpbOutputDelay), task.m_timeStamp); task.m_bs->PicStruct = task.GetPicStructForDisplay(); task.m_bs->FrameType = task.m_type[task.GetFirstField()] & ~MFX_FRAMETYPE_KEYPIC; if (task.m_fieldPicFlag) task.m_bs->FrameType = mfxU16(task.m_bs->FrameType | ((task.m_type[!task.GetFirstField()]& ~MFX_FRAMETYPE_KEYPIC) << 8)); task.m_fieldCounter++; // Update hrd buffer #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(!m_isPOut) { #endif m_hrd.RemoveAccessUnit( dataLength - initialDataLength, task.m_fieldPicFlag, (task.m_type[fid] & MFX_FRAMETYPE_IDR) != 0); #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) } #endif if (initialDataLength == dataLength) { MFX_LTRACE_S(MFX_TRACE_LEVEL_PARAMS, "Unexpected behavior : length of bitstream stayed unchanged"); } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) if(m_isPOut) addPartialOutputOffset(task, dataLength, true); else #endif { task.m_bs->DataLength = dataLength; } #ifndef MFX_AVC_ENCODING_UNIT_DISABLE setEncUnitsInfo(task, fid); #endif return MFX_ERR_NONE; } #ifndef MFX_AVC_ENCODING_UNIT_DISABLE /* Method for filling mfxExtEncodedUnitsInfo ext-buffer task - in - DDITask sbegin - in - pointer to the start of bitstream, might be NULL if encUnitsList->size()>0 send - in - pointer to the end of bitstream, might be NULL if encUnitsList->size()>0 encUnitsInfo - out - destination ext-buffer fid - in - field id */ void ImplementationAvc::FillEncodingUnitsInfo( DdiTask &task, mfxU8 *sbegin, mfxU8 *send, mfxExtEncodedUnitsInfo *encUnitsInfo, mfxU32 fid ) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "NALU Reporting"); if (!encUnitsInfo) return; if (sbegin != NULL && send != NULL) { mfxU32 offset = 0; if (fid == 0) { encUnitsInfo->NumUnitsEncoded = 0; } else //calculate starting offset in bitstream for second field { offset = task.m_bsDataLength[0]; } if (offset) { for (size_t i = 0; i < task.m_headersCache[fid].size(); ++i) { task.m_headersCache[fid][i].Offset += offset; //actualize offsets } } if (encUnitsInfo->NumUnitsAlloc > encUnitsInfo->NumUnitsEncoded) { size_t count = std::min(encUnitsInfo->NumUnitsAlloc - encUnitsInfo->NumUnitsEncoded, task.m_headersCache[fid].size()); std::copy(std::begin(task.m_headersCache[fid]), std::begin(task.m_headersCache[fid]) + count, encUnitsInfo->UnitInfo + encUnitsInfo->NumUnitsEncoded); } if (task.m_headersCache[fid].size() > 0) { offset = task.m_headersCache[fid].back().Offset + task.m_headersCache[fid].back().Size; //in case we have hidden units } encUnitsInfo->NumUnitsEncoded += mfxU16(std::min(size_t(encUnitsInfo->NumUnitsAlloc) - encUnitsInfo->NumUnitsEncoded, task.m_headersCache[fid].size())); if (task.m_SliceInfo.size() <= 1 && task.m_numSlice.top <= 1 && task.m_numSlice.bot <= 1 && task.m_fieldPicFlag == false) //if we have only one slice in bitstream { if (encUnitsInfo->NumUnitsEncoded < encUnitsInfo->NumUnitsAlloc) { encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Type = sbegin[offset+3] & 0x1F; encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Size = (mfxU32)((ptrdiff_t)send - (ptrdiff_t)sbegin - offset); encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Offset = offset; } ++encUnitsInfo->NumUnitsEncoded; } else { for (NaluIterator nalu(sbegin + offset, send); nalu != NaluIterator(); ++nalu) { if (nalu->type != NALU_IDR && nalu->type != NALU_NON_IDR) break; //End of field if (encUnitsInfo->NumUnitsEncoded < encUnitsInfo->NumUnitsAlloc) { encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Type = nalu->type; encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Size = mfxU32(nalu->end - nalu->begin); encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Offset = offset; offset += encUnitsInfo->UnitInfo[encUnitsInfo->NumUnitsEncoded].Size; } ++encUnitsInfo->NumUnitsEncoded; } } } } //ImplementationAvc::FillEncodingUnitsInfo #endif void ImplementationAvc::setFrameInfo( DdiTask & task, mfxU32 fid ) { mfxExtCodingOption const &extOpt = GetExtBufferRef(m_video); mfxU32 seconfFieldOffset = 0; if (fid) seconfFieldOffset = task.m_bs->DataLength; if (task.m_bs->NumExtParam > 0) { // setting of mfxExtAVCEncodedFrameInfo isn't supported for FieldOutput mode at the moment if (IsOff(extOpt.FieldOutput)) { mfxExtAVCEncodedFrameInfo * encFrameInfo = (mfxExtAVCEncodedFrameInfo*)mfx::GetExtBuffer(task.m_bs->ExtParam, task.m_bs->NumExtParam, MFX_EXTBUFF_ENCODED_FRAME_INFO); if (encFrameInfo) { if (task.m_fieldPicFlag == 0) { // should return actual reference lists to application // at the moment it's supported for progressive encoding only encFrameInfo->FrameOrder = task.m_extFrameTag; encFrameInfo->LongTermIdx = task.m_longTermFrameIdx == NO_INDEX_U8 ? NO_INDEX_U16 : task.m_longTermFrameIdx; encFrameInfo->MAD = task.m_mad[fid]; if ( bRateControlLA(m_video.mfx.RateControlMethod)) encFrameInfo->QP = task.m_cqpValue[fid]; else encFrameInfo->QP = task.m_qpY[fid]; // only return of ref list L0 is supported at the moment mfxU8 i = 0; for (i = 0; i < task.m_list0[0].Size(); i ++) { DpbFrame& refFrame = task.m_dpb[0][task.m_list0[0][i] & 127]; // retrieve corresponding ref frame from DPB encFrameInfo->UsedRefListL0[i].FrameOrder = refFrame.m_extFrameTag; if (refFrame.m_longterm && refFrame.m_longTermIdxPlus1) // reference frame is LTR with valid LTR idx encFrameInfo->UsedRefListL0[i].LongTermIdx = refFrame.m_longTermIdxPlus1 - 1; else encFrameInfo->UsedRefListL0[i].LongTermIdx = NO_INDEX_U16; encFrameInfo->UsedRefListL0[i].PicStruct = (mfxU16)MFX_PICSTRUCT_PROGRESSIVE; } for (; i < 32; i ++) { encFrameInfo->UsedRefListL0[i].FrameOrder = (mfxU32)MFX_FRAMEORDER_UNKNOWN; encFrameInfo->UsedRefListL0[i].LongTermIdx = NO_INDEX_U16; encFrameInfo->UsedRefListL0[i].PicStruct = (mfxU16)MFX_PICSTRUCT_UNKNOWN; } } else if (fid) { encFrameInfo->SecondFieldOffset = seconfFieldOffset; } } } } } void ImplementationAvc::setEncUnitsInfo(DdiTask& task, mfxU32 fid) { mfxExtEncodedUnitsInfo* encUnitsInfo = NULL; if (task.m_collectUnitsInfo ) { encUnitsInfo = (mfxExtEncodedUnitsInfo*)mfx::GetExtBuffer(task.m_bs->ExtParam, task.m_bs->NumExtParam, MFX_EXTBUFF_ENCODED_UNITS_INFO); FillEncodingUnitsInfo( task, task.m_bs->Data + task.m_bs->DataOffset, task.m_bs->Data + task.m_bs->DataOffset + task.m_bs->DataLength, encUnitsInfo, fid ); } if (task.m_headersCache[fid].size() > 0) //if we have previously collected data about headers/slices task.m_headersCache[fid].clear(); } #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) void ImplementationAvc::addPartialOutputOffset(DdiTask & task, mfxU64 offset, bool last) { std::lock_guard lock(m_offsetMutex); auto it = m_offsetsMap.find(task.m_bs); if(it != m_offsetsMap.end()) { std::queue& q = (*it).second; q.push(offset); if(last) q.push(0); } } #endif #endif // MFX_ENABLE_H264_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/mfx_h264_encode_hw_utils.cpp000066400000000000000000004753061443134507600330750ustar00rootroot00000000000000// Copyright (c) 2009-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include #include #include #include #include #include /* for INT_MIN, INT_MAX, etc. on Linux/Android */ #include #ifdef MFX_ENABLE_EXT #include "cmrt_cross_platform.h" #endif #include #include "mfx_brc_common.h" #include "mfx_h264_encode_hw_utils.h" #include "libmfx_core.h" #include "umc_video_data.h" #include "fast_copy.h" #include "mfx_enc_common.h" #include "mfx_utils.h" using namespace MfxHwH264Encode; namespace MfxHwH264Encode { const mfxU32 NUM_CLOCK_TS[9] = { 1, 1, 1, 2, 2, 3, 3, 2, 3 }; mfxU16 CalcNumFrameMin(const MfxHwH264Encode::MfxVideoParam &par, MFX_ENCODE_CAPS const & hwCaps, eMFXHWType platform) { mfxU16 numFrameMin = 0; if (IsMvcProfile(par.mfx.CodecProfile))//MVC { if (par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { numFrameMin = par.mfx.GopRefDist; } else // MFX_IOPATTERN_IN_VIDEO_MEMORY || MFX_IOPATTERN_IN_OPAQUE_MEMORY { mfxExtCodingOptionDDI & extDdi = GetExtBufferRef(par); numFrameMin = IsOn(extDdi.RefRaw) ? par.mfx.GopRefDist + par.mfx.NumRefFrame : par.mfx.GopRefDist; } numFrameMin = numFrameMin + par.AsyncDepth - 1; mfxExtMVCSeqDesc & extMvc = GetExtBufferRef(par); numFrameMin = mfxU16(std::min(0xffffu, numFrameMin * extMvc.NumView)); } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE if (IsSvcProfile(par.mfx.CodecProfile))//SVC { if (par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { numFrameMin = par.mfx.GopRefDist; } else // MFX_IOPATTERN_IN_VIDEO_MEMORY || MFX_IOPATTERN_IN_OPAQUE_MEMORY { mfxExtCodingOptionDDI & extDdi = GetExtBufferRef(par); numFrameMin = IsOn(extDdi.RefRaw) ? par.mfx.GopRefDist + par.mfx.NumRefFrame : par.mfx.GopRefDist; } numFrameMin = numFrameMin + par.AsyncDepth - 1; mfxExtSVCSeqDesc const * extSvc = GetExtBuffer(par); mfxU16 numDependencyLayer = 0; for (mfxU32 i = 0; i < 8; i++) if (extSvc->DependencyLayer[i].Active) numDependencyLayer++; numFrameMin = numDependencyLayer * numFrameMin; } #endif if (IsAvcProfile(par.mfx.CodecProfile))//AVC { mfxExtCodingOption2 * extOpt2 = GetExtBuffer(par); mfxExtCodingOption3 * extOpt3 = GetExtBuffer(par); mfxU16 mctfFrames = ((par.AsyncDepth == 1) && IsDenoiserSupported(par, platform)) ? 1 : 0; mfxU32 adaptGopDelay = 0; #if defined(MFX_ENABLE_ENCTOOLS) adaptGopDelay = H264EncTools::GetPreEncDelay(par); #endif if (par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { numFrameMin = (mfxU16)(par.mfx.GopRefDist + adaptGopDelay + mctfFrames + par.AsyncDepth - 1); } else // MFX_IOPATTERN_IN_VIDEO_MEMORY || MFX_IOPATTERN_IN_OPAQUE_MEMORY { numFrameMin = (mfxU16)AsyncRoutineEmulator(par, adaptGopDelay, platform).GetTotalGreediness() + par.AsyncDepth - 1; mfxExtCodingOptionDDI & extDdi = GetExtBufferRef(par); numFrameMin += IsOn(extDdi.RefRaw) ? par.mfx.NumRefFrame : 0; // strange thing but for backward compatibility: // msdk needs to tell how many surfaces application will need for reordering // even if application does this reordering(!!!) if (par.mfx.EncodedOrder) numFrameMin += par.mfx.GopRefDist - 1; if (extOpt2 && extOpt2->MaxSliceSize != 0 && !IsDriverSliceSizeControlEnabled(par, hwCaps)) numFrameMin++; if (extOpt3 && IsOn(extOpt3->FadeDetection)) numFrameMin++; } } return numFrameMin; } inline bool Less(mfxU32 num1, mfxU32 num2) { return (num1 - num2) >= 0x80000000; } void SetSurfaceFree(Surface & surf) { surf.SetFree(true); } void SetReconstructFree(Reconstruct & rec) { rec.SetFree(true); rec.m_reference[TFIELD] = false; rec.m_reference[BFIELD] = false; } struct SetReconstructFreeAndDecRef { explicit SetReconstructFreeAndDecRef(VideoCORE& core) : m_core(core) {} void operator() (Reconstruct& rec) { SetReconstructFree(rec); if (rec.m_yuv && rec.m_yuv->Data.Locked > 0) m_core.DecreaseReference(&rec.m_yuv->Data); rec.m_yuv = 0; } private: void operator=(const SetReconstructFreeAndDecRef&); VideoCORE& m_core; }; PairU16 GetPicStruct( MfxVideoParam const & video, DdiTask const & task) { mfxU16 runtPs = task.m_yuv->Info.PicStruct; //if (mfxExtVppAuxData const * extAuxData = GetExtBuffer(task.m_ctrl)) // if (extAuxData->PicStruct != MFX_PICSTRUCT_UNKNOWN) // runtPs = extAuxData->PicStruct; return GetPicStruct(video, runtPs); } PairU16 GetPicStruct( MfxVideoParam const & video, mfxU16 runtPs) { mfxExtCodingOption const & extOpt = GetExtBufferRef(video); mfxU16 initPs = video.mfx.FrameInfo.PicStruct; mfxU16 framePic = extOpt.FramePicture; mfxU16 fieldOut = extOpt.FieldOutput; static mfxU16 const PRG = MFX_PICSTRUCT_PROGRESSIVE; static mfxU16 const TFF = MFX_PICSTRUCT_FIELD_TFF; static mfxU16 const BFF = MFX_PICSTRUCT_FIELD_BFF; static mfxU16 const UNK = MFX_PICSTRUCT_UNKNOWN; static mfxU16 const DBL = MFX_PICSTRUCT_FRAME_DOUBLING; static mfxU16 const TRPL = MFX_PICSTRUCT_FRAME_TRIPLING; static mfxU16 const REP = MFX_PICSTRUCT_FIELD_REPEATED; PairU16 ps = MakePair(PRG, PRG); if (initPs == PRG) { assert(IsOff(fieldOut)); } if (initPs == UNK && runtPs == UNK) { assert(!"unsupported picstruct combination"); } if (initPs == PRG && runtPs == UNK) ps = MakePair(PRG, PRG); else if (initPs == PRG && runtPs == PRG) ps = MakePair(PRG, PRG); else if (initPs == PRG && runtPs == (PRG | DBL)) ps = MakePair(PRG, PRG | DBL); else if (initPs == PRG && runtPs == (PRG | TRPL)) ps = MakePair(PRG, PRG | TRPL); else if (initPs == BFF && runtPs == UNK) ps = MakePair(BFF, BFF); else if ((initPs == BFF || initPs == UNK) && runtPs == BFF) ps = MakePair(BFF, BFF); else if (initPs == TFF && runtPs == UNK) ps = MakePair(TFF, TFF); else if ((initPs == TFF || initPs == UNK) && runtPs == TFF) ps = MakePair(TFF, TFF); else if (initPs == UNK && runtPs == (PRG | BFF)) ps = MakePair(PRG, PRG | BFF); else if (initPs == UNK && runtPs == (PRG | TFF)) ps = MakePair(PRG, PRG | TFF); else if (initPs == UNK && runtPs == (PRG | BFF | REP)) ps = MakePair(PRG, PRG | BFF | REP); else if (initPs == UNK && runtPs == (PRG | TFF | REP)) ps = MakePair(PRG, PRG | TFF | REP); else if ((initPs == TFF || initPs == UNK) && runtPs == PRG) ps = MakePair(PRG, PRG | TFF); else if (initPs == BFF && runtPs == PRG) ps = MakePair(PRG, PRG | BFF); else if (initPs == PRG) ps = MakePair(PRG, PRG); else if (initPs == BFF) ps = MakePair(BFF, BFF); else if (initPs == TFF) ps = MakePair(TFF, TFF); else if (initPs == UNK && framePic == MFX_CODINGOPTION_OFF) ps = MakePair(TFF, TFF); else if (initPs == UNK && framePic != MFX_CODINGOPTION_OFF) ps = MakePair(PRG, PRG); if (IsOn(fieldOut) && ps[ENC] == PRG) ps[ENC] = ps[DISP] = (ps[1] & BFF) ? BFF : TFF; return ps; } bool isBitstreamUpdateRequired(MfxVideoParam const & video, MFX_ENCODE_CAPS caps, eMFXHWType ) { if(video.Protected) { return false; } mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(video); if(video.mfx.LowPower == MFX_CODINGOPTION_ON) return video.calcParam.numTemporalLayer > 0; else if(extOpt2.MaxSliceSize) return true; else if(caps.ddi_caps.HeaderInsertion == 1) return true; return false; } PairU8 ExtendFrameType(mfxU32 type) { mfxU32 type1 = type & 0xff; mfxU32 type2 = type >> 8; if (type2 == 0) { type2 = type1 & ~MFX_FRAMETYPE_IDR; // second field can't be IDR if (type1 & MFX_FRAMETYPE_I) { type2 &= ~MFX_FRAMETYPE_I; type2 |= MFX_FRAMETYPE_P; } } return PairU8(type1, type2); } bool CheckSubMbPartition(mfxExtCodingOptionDDI const * extDdi, mfxU8 frameType) { if (frameType & MFX_FRAMETYPE_P) return IsOff(extDdi->DisablePSubMBPartition); if (frameType & MFX_FRAMETYPE_B) return IsOff(extDdi->DisablePSubMBPartition); return true; } mfxU8 GetPFrameLevel(mfxU32 i, mfxU32 num) { if (i == 0 || i >= num) return 0; mfxU32 level = 1; mfxU32 begin = 0; mfxU32 end = num; mfxU32 t = (begin + end + 1) / 2; while (t != i) { level++; if (i > t) begin = t; else end = t; t = (begin + end + 1) / 2; } return (mfxU8)level; } mfxU8 PLayer(MfxVideoParam const & par, mfxU32 order) { return std::min(7, GetPFrameLevel(order % par.calcParam.PPyrInterval, par.calcParam.PPyrInterval)); } mfxU8 GetQpValue( DdiTask const & task, MfxVideoParam const & par, mfxU32 frameType) { const mfxExtCodingOption2& CO2 = GetExtBufferRef(par); const mfxExtCodingOption3& CO3 = GetExtBufferRef(par); const mfxU8 minQP = 1; const mfxU8 maxQP = 51; mfxU8 QP = 0; if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP /*|| par.mfx.RateControlMethod == MFX_RATECONTROL_VCM && (frameType & MFX_FRAMETYPE_I)*/) { if (task.m_ctrl.QP > 0) { if (IsOn(par.mfx.LowPower) && (task.m_ctrl.QP < 10)) return 10; // get per frame qp return std::min(mfxU8(task.m_ctrl.QP), mfxU8(maxQP)); } else { bool bUseQPOffset = (frameType & MFX_FRAMETYPE_B && CO2.BRefType == MFX_B_REF_PYRAMID) || (frameType & MFX_FRAMETYPE_P && CO3.PRefType == MFX_P_REF_PYRAMID); // get per stream qp switch (frameType & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: return mfxU8(par.mfx.QPI + task.m_QPdelta); case MFX_FRAMETYPE_P: QP = mfxU8(par.mfx.QPP); if (task.m_bQPDelta) { QP = (mfxU8)mfx::clamp(task.m_QPdelta + QP, minQP, maxQP); } else if (par.calcParam.numTemporalLayer > 1) { QP = (mfxU8)mfx::clamp(CO3.QPOffset[task.m_tid] + QP, minQP, maxQP); } return QP; case MFX_FRAMETYPE_B: QP = mfxU8(par.mfx.QPB); if (task.m_bQPDelta) { QP = (mfxU8)mfx::clamp(task.m_QPdelta + QP, minQP, maxQP); } else if (bUseQPOffset && (task.m_currGopRefDist == 0 || task.m_currGopRefDist > 2)) { QP = (mfxU8)mfx::clamp( CO3.QPOffset[mfx::clamp(task.m_loc.level - 1, 0, 7)] + QP, minQP, maxQP); } return QP; default: assert(!"bad frame type (GetQpValue)"); return 0xff; } } } return 26; } bool IsPreferred(mfxExtAVCRefListCtrl const & refPicListCtrl, mfxU32 frameOrder, mfxU32 picStruct) { for (mfxU8 j = 0; j < 16; j ++) if (refPicListCtrl.PreferredRefList[j].FrameOrder == frameOrder && refPicListCtrl.PreferredRefList[j].PicStruct == picStruct) return true; return false; } bool IsRejected(mfxExtAVCRefListCtrl const & refPicListCtrl, mfxU32 frameOrder, mfxU32 picStruct) { for (mfxU8 j = 0; j < 16; j ++) if (refPicListCtrl.RejectedRefList[j].FrameOrder == frameOrder && refPicListCtrl.PreferredRefList[j].PicStruct == picStruct) return true; return false; } mfxI32 GetPicNum( std::vector const & recons, ArrayDpbFrame const & dpb, mfxU8 ref) { Reconstruct const & recFrame = recons[dpb[ref & 127].m_frameIdx]; return recFrame.m_picNum[ref >> 7]; } mfxI32 GetPicNumF( std::vector const & recons, ArrayDpbFrame const & dpb, mfxU8 ref) { Reconstruct const & recFrame = recons[dpb[ref & 127].m_frameIdx]; return recFrame.m_reference[ref >> 7] ? recFrame.m_picNum[ref >> 7] : 0x20000; } mfxU8 GetLongTermPicNum( std::vector const & recons, ArrayDpbFrame const & dpb, mfxU8 ref) { Reconstruct const & recFrame = recons[dpb[ref & 127].m_frameIdx]; return recFrame.m_longTermPicNum[ref >> 7]; } mfxU32 GetLongTermPicNumF( std::vector const & recons, ArrayDpbFrame const & dpb, mfxU8 ref) { DpbFrame const & dpbFrame = dpb[ref & 127]; Reconstruct const & recFrame = recons[dpbFrame.m_frameIdx]; return recFrame.m_reference[ref >> 7] && dpbFrame.m_longterm ? recFrame.m_longTermPicNum[ref >> 7] : 0x20; } struct BasePredicateForRefPic { typedef std::vector Recons; typedef ArrayDpbFrame Dpb; typedef mfxU8 Arg; typedef bool Res; BasePredicateForRefPic(Recons const & recons, Dpb const & dpb) : m_recons(recons) , m_dpb(dpb) { } Recons const & m_recons; Dpb const & m_dpb; }; struct RefPicNumIsGreater : public BasePredicateForRefPic { RefPicNumIsGreater(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 l, mfxU8 r) const { return Less( GetPicNum(m_recons, m_dpb, r), GetPicNum(m_recons, m_dpb, l)); } }; struct LongTermRefPicNumIsLess : public BasePredicateForRefPic { LongTermRefPicNumIsLess(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 l, mfxU8 r) const { return Less( GetLongTermPicNum(m_recons, m_dpb, l), GetLongTermPicNum(m_recons, m_dpb, r)); } }; struct RefPocIsLess : public BasePredicateForRefPic { RefPocIsLess(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 l, mfxU8 r) const { return Less(GetPoc(m_dpb, l), GetPoc(m_dpb, r)); } }; struct RefPocIsGreater : public BasePredicateForRefPic { RefPocIsGreater(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 l, mfxU8 r) const { return Less(GetPoc(m_dpb, r), GetPoc(m_dpb, l)); } }; struct RefPocIsLessThan : public BasePredicateForRefPic { RefPocIsLessThan(Recons const & recons, Dpb const & dpb, mfxU32 poc) : BasePredicateForRefPic(recons, dpb) , m_poc(poc) { } bool operator ()(mfxU8 r) const { return Less(GetPoc(m_dpb, r), m_poc); } mfxU32 m_poc; }; struct RefPocIsGreaterThan : public BasePredicateForRefPic { RefPocIsGreaterThan(Recons const & recons, Dpb const & dpb, mfxU32 poc) : BasePredicateForRefPic(recons, dpb) , m_poc(poc) { } bool operator ()(mfxU8 r) const { return Less(m_poc, GetPoc(m_dpb, r)); } mfxU32 m_poc; }; struct RefIsShortTerm : public BasePredicateForRefPic { RefIsShortTerm(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 r) const { return m_recons[m_dpb[r & 127].m_frameIdx].m_reference[r >> 7] && !m_dpb[r & 127].m_longterm; } }; struct RefIsLongTerm : public BasePredicateForRefPic { RefIsLongTerm(Recons const & recons, Dpb const & dpb) : BasePredicateForRefPic(recons, dpb) { } bool operator ()(mfxU8 r) const { return m_recons[m_dpb[r & 127].m_frameIdx].m_reference[r >> 7] && m_dpb[r & 127].m_longterm; } }; struct RefIsFromHigherTemporalLayer : public BasePredicateForRefPic { RefIsFromHigherTemporalLayer(Recons const & recons, Dpb const & dpb, mfxU32 currTid) : BasePredicateForRefPic(recons, dpb) , m_currTid(currTid) { } bool operator ()(mfxU8 r) const { return m_currTid < m_recons[m_dpb[r & 127].m_frameIdx].m_tid; } mfxU32 m_currTid; }; template struct LogicalAndHelper { typedef typename T::Arg Arg; typedef typename T::Res Res; LogicalAndHelper(T pr1, U pr2) : m_pr1(pr1) , m_pr2(pr2) { } Res operator ()(Arg arg) const { return m_pr1(arg) && m_pr2(arg); } T m_pr1; U m_pr2; }; template LogicalAndHelper LogicalAnd(T pr1, U pr2) { return LogicalAndHelper(pr1, pr2); } template struct LogicalNotHelper { typedef typename T::argument_type Arg; typedef typename T::result_type Res; LogicalNotHelper(T pr) : m_pr(pr) { } Res operator ()(Arg arg) const { return !m_pred(arg); } T m_pr; }; template LogicalNotHelper LogicalNot(T pr) { return LogicalNotHelper(pr); } bool LongTermInList( std::vector const & recons, ArrayDpbFrame const & dpb, ArrayU8x33 const & list) { return list.End() == std::find_if(list.Begin(), list.End(), RefIsLongTerm(recons, dpb)); } mfxU8 CalcTemporalLayerIndex(MfxVideoParam const & video, mfxI32 frameOrder) { mfxU8 i = 0; if (video.calcParam.numTemporalLayer > 0) { mfxU32 maxScale = video.calcParam.scale[video.calcParam.numTemporalLayer - 1]; for (; i < video.calcParam.numTemporalLayer; i++) if (frameOrder % (maxScale / video.calcParam.scale[i]) == 0) break; } return i; } }; ///////////////////////////////////////////////////////////////////////////////// // FrameTypeGenerator FrameTypeGenerator::FrameTypeGenerator() : m_frameOrder (0) // in display order , m_gopOptFlag (0) , m_gopPicSize (0) , m_gopRefDist (0) , m_refBaseDist(0) // key picture distance , m_biPyramid (0) , m_idrDist (0) { } void FrameTypeGenerator::Init(MfxVideoParam const & video) { m_gopOptFlag = video.mfx.GopOptFlag; m_gopPicSize = std::max(video.mfx.GopPicSize, 1); m_gopRefDist = std::max(video.mfx.GopRefDist, 1); m_idrDist = m_gopPicSize * (video.mfx.IdrInterval + 1); mfxExtCodingOption2 * extOpt2 = GetExtBuffer(video); m_biPyramid = extOpt2->BRefType == MFX_B_REF_OFF ? 0 : extOpt2->BRefType; m_frameOrder = 0; } namespace { mfxU32 GetEncodingOrder(mfxU32 displayOrder, mfxU32 begin, mfxU32 end, mfxU32 counter, bool & ref) { assert(displayOrder >= begin); assert(displayOrder < end); ref = (end - begin > 1); mfxU32 pivot = (begin + end) / 2; if (displayOrder == pivot) return counter; else if (displayOrder < pivot) return GetEncodingOrder(displayOrder, begin, pivot, counter + 1, ref); else return GetEncodingOrder(displayOrder, pivot + 1, end, counter + 1 + pivot - begin, ref); } } BiFrameLocation FrameTypeGenerator::GetBiFrameLocation() const { BiFrameLocation loc; if (m_biPyramid != 0) { bool ref = false; mfxU32 orderInMiniGop = m_frameOrder % m_gopPicSize % m_gopRefDist - 1; loc.encodingOrder = GetEncodingOrder(orderInMiniGop, 0, m_gopRefDist - 1, 0, ref); loc.miniGopCount = m_frameOrder % m_gopPicSize / m_gopRefDist; loc.refFrameFlag = mfxU16(ref ? MFX_FRAMETYPE_REF : 0); } return loc; } PairU8 FrameTypeGenerator::Get() const { mfxU16 keyPicture = (m_refBaseDist && m_frameOrder % m_refBaseDist == 0) ? MFX_FRAMETYPE_KEYPIC : 0; if (m_frameOrder == 0) { return ExtendFrameType(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR | keyPicture); } if (m_frameOrder % m_gopPicSize == 0) { return ExtendFrameType(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | keyPicture); } if (m_frameOrder % m_gopPicSize % m_gopRefDist == 0) { return ExtendFrameType(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF | keyPicture); } if ((m_gopOptFlag & MFX_GOP_STRICT) == 0) { if (((m_frameOrder + 1) % m_gopPicSize == 0 && (m_gopOptFlag & MFX_GOP_CLOSED)) || ((m_frameOrder + 1) % m_idrDist == 0)) { // switch last B frame to P frame return ExtendFrameType(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF | keyPicture); } } return ExtendFrameType(MFX_FRAMETYPE_B | keyPicture); } void FrameTypeGenerator::Next() { m_frameOrder = (m_frameOrder + 1) % m_idrDist; } NalUnit MfxHwH264Encode::GetNalUnit(mfxU8 * begin, mfxU8 * end) { for (; begin < end - 5; ++begin) { if ((begin[0] == 0 && begin[1] == 0 && begin[2] == 1) || (begin[0] == 0 && begin[1] == 0 && begin[2] == 0 && begin[3] == 1)) { mfxU8 numZero = (begin[2] == 1 ? 2 : 3); mfxU8 type = (begin[2] == 1 ? begin[3] : begin[4]) & 0x1f; for (mfxU8 * next = begin + 4; next < end - 4; ++next) { if (next[0] == 0 && next[1] == 0 && next[2] == 1) { if (*(next - 1) == 0) --next; return NalUnit(begin, next, type, numZero); } } return NalUnit(begin, end, type, numZero); } } return NalUnit(); } void MfxHwH264Encode::PrepareSeiMessage( DdiTask const & task, mfxU32 nalHrdBpPresentFlag, mfxU32 vclHrdBpPresentFlag, mfxU32 seqParameterSetId, mfxExtAvcSeiBufferingPeriod & msg) { Zero(msg); assert(seqParameterSetId < 32); msg.seq_parameter_set_id = mfxU8(seqParameterSetId); msg.nal_cpb_cnt = !!nalHrdBpPresentFlag; msg.vcl_cpb_cnt = !!vclHrdBpPresentFlag; msg.initial_cpb_removal_delay_length = 24; msg.nal_initial_cpb_removal_delay[0] = task.m_initCpbRemoval; msg.nal_initial_cpb_removal_delay_offset[0] = task.m_initCpbRemovalOffset; msg.vcl_initial_cpb_removal_delay[0] = task.m_initCpbRemoval; msg.vcl_initial_cpb_removal_delay_offset[0] = task.m_initCpbRemovalOffset; } void MfxHwH264Encode::PrepareSeiMessage( DdiTask const & task, mfxU32 fieldId, mfxU32 cpbDpbDelaysPresentFlag, mfxU32 picStructPresentFlag, mfxExtAvcSeiPicTiming & msg) { Zero(msg); msg.cpb_dpb_delays_present_flag = mfxU8(cpbDpbDelaysPresentFlag); msg.cpb_removal_delay_length = 24; msg.dpb_output_delay_length = 24; msg.pic_struct_present_flag = mfxU8(picStructPresentFlag); msg.time_offset_length = 24; msg.cpb_removal_delay = task.m_cpbRemoval[fieldId]; msg.dpb_output_delay = task.m_dpbOutputDelay; switch (task.GetPicStructForDisplay()) { case mfxU16(MFX_PICSTRUCT_FIELD_TFF): case mfxU16(MFX_PICSTRUCT_FIELD_BFF): msg.pic_struct = mfxU8(fieldId + 1); msg.ct_type = 1; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF): msg.pic_struct = 3; msg.ct_type = 1; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF): msg.pic_struct = 4; msg.ct_type = 1; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_REPEATED): msg.pic_struct = 5; msg.ct_type = 1; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_REPEATED): msg.pic_struct = 6; msg.ct_type = 1; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_DOUBLING): msg.pic_struct = 7; msg.ct_type = 0; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_TRIPLING): msg.pic_struct = 8; msg.ct_type = 0; break; case mfxU16(MFX_PICSTRUCT_PROGRESSIVE): default: msg.pic_struct = 0; msg.ct_type = 0; break; } } void MfxHwH264Encode::PrepareSeiMessage( const DdiTask& task, mfxU32 fieldId, mfxU32 frame_mbs_only_flag, mfxExtAvcSeiDecRefPicMrkRep& extSeiDecRefPicMrkRep) { extSeiDecRefPicMrkRep.original_idr_flag = task.m_decRefPicMrkRep[fieldId].original_idr_flag; extSeiDecRefPicMrkRep.original_frame_num = task.m_decRefPicMrkRep[fieldId].original_frame_num; extSeiDecRefPicMrkRep.original_field_info_present_flag = (frame_mbs_only_flag == 0); if (frame_mbs_only_flag == 0) { extSeiDecRefPicMrkRep.original_field_pic_flag = task.m_decRefPicMrkRep[fieldId].original_field_pic_flag; extSeiDecRefPicMrkRep.original_bottom_field_flag = task.m_decRefPicMrkRep[fieldId].original_bottom_field_flag; } extSeiDecRefPicMrkRep.no_output_of_prior_pics_flag = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.no_output_of_prior_pics_flag; extSeiDecRefPicMrkRep.long_term_reference_flag = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.long_term_reference_flag; extSeiDecRefPicMrkRep.num_mmco_entries = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.mmco.Size(); extSeiDecRefPicMrkRep.adaptive_ref_pic_marking_mode_flag = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.mmco.Size() > 0; for (mfxU8 i = 0; i < extSeiDecRefPicMrkRep.num_mmco_entries; i ++) { extSeiDecRefPicMrkRep.mmco[i] = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.mmco[i]; extSeiDecRefPicMrkRep.value[i * 2] = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.value[i * 2]; extSeiDecRefPicMrkRep.value[i * 2 + 1] = task.m_decRefPicMrkRep[fieldId].dec_ref_pic_marking.value[i * 2 + 1]; } } void MfxHwH264Encode::PrepareSeiMessage( MfxVideoParam const & par, mfxExtAvcSeiRecPoint & msg, mfxU16 recovery_frame_cnt) { mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); mfxU32 numTL = par.calcParam.numTemporalLayer; if (extOpt2.IntRefType) // following calculation assumes that for multiple temporal layers last layer is always non-reference msg.recovery_frame_cnt = (extOpt2.IntRefCycleSize - 1) << (numTL > 2 ? (numTL >> 1) : 0); else msg.recovery_frame_cnt = recovery_frame_cnt; msg.exact_match_flag = 1; msg.broken_link_flag = 0; msg.changing_slice_group_idc = 0; } mfxU32 MfxHwH264Encode::CalculateSeiSize( mfxExtAvcSeiRecPoint const & msg) { mfxU32 dataSizeInBits = ExpGolombCodeLength(msg.recovery_frame_cnt); // size of recovery_frame_cnt dataSizeInBits += 4; // exact_match_flag + broken_link_flag + changing_slice_group_idc mfxU32 dataSizeInBytes = (dataSizeInBits + 7) >> 3; return dataSizeInBytes; } mfxU32 MfxHwH264Encode::CalculateSeiSize( mfxExtAvcSeiDecRefPicMrkRep const & msg) { mfxU32 dataSizeInBits = 0; // calculate size of sei_payload dataSizeInBits += ExpGolombCodeLength(msg.original_frame_num) + 1; // original_frame_num + original_idr_flag if (msg.original_field_info_present_flag) dataSizeInBits += msg.original_field_pic_flag == 0 ? 1 : 2; // original_field_info_present_flag + original_bottom_field_flag if (msg.original_idr_flag) { dataSizeInBits += 2; // no_output_of_prior_pics_flag + long_term_reference_flag } else { dataSizeInBits += 1; // adaptive_ref_pic_marking_mode_flag for (mfxU32 i = 0; i < msg.num_mmco_entries; i ++) { dataSizeInBits += ExpGolombCodeLength(msg.mmco[i]); // memory_management_control_operation dataSizeInBits += ExpGolombCodeLength(msg.value[2 * i]); if (msg.mmco[i] == 3) dataSizeInBits += ExpGolombCodeLength(msg.value[2 * i + 1]); } } mfxU32 dataSizeInBytes = (dataSizeInBits + 7) >> 3; return dataSizeInBytes; } // MVC BD { mfxU32 MfxHwH264Encode::CalculateSeiSize( mfxExtAvcSeiBufferingPeriod const & msg) { mfxU32 dataSizeInBits = 2 * msg.initial_cpb_removal_delay_length * (msg.nal_cpb_cnt + msg.vcl_cpb_cnt); dataSizeInBits += ExpGolombCodeLength(msg.seq_parameter_set_id); mfxU32 dataSizeInBytes = (dataSizeInBits + 7) >> 3; return dataSizeInBytes; } mfxU32 MfxHwH264Encode::CalculateSeiSize( mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg) { mfxU32 dataSizeInBits = 0; if (msg.cpb_dpb_delays_present_flag) { dataSizeInBits += msg.cpb_removal_delay_length; dataSizeInBits += msg.dpb_output_delay_length; } if (msg.pic_struct_present_flag) { dataSizeInBits += 4; // msg.pic_struct; assert(msg.pic_struct <= 8); mfxU32 numClockTS = NUM_CLOCK_TS[std::min(msg.pic_struct, 8)]; dataSizeInBits += numClockTS; // clock_timestamp_flag[i] for (mfxU32 i = 0; i < numClockTS; i++) { if (extPt.TimeStamp[i].ClockTimestampFlag) { mfxU32 tsSize = 19; if (extPt.TimeStamp[i].FullTimestampFlag) { tsSize += 17; } else { tsSize += (( extPt.TimeStamp[i].HoursFlag * 5 + 7) * extPt.TimeStamp[i].MinutesFlag + 7) * extPt.TimeStamp[i].SecondsFlag + 1; } dataSizeInBits += tsSize + msg.time_offset_length; } } } mfxU32 dataSizeInBytes = (dataSizeInBits + 7) >> 3; return dataSizeInBytes; } // MVC BD } namespace { UMC::FrameType ConvertFrameTypeMfx2Umc(mfxU32 frameType) { switch (frameType & 0xf) { case MFX_FRAMETYPE_I: return UMC::I_PICTURE; case MFX_FRAMETYPE_P: return UMC::P_PICTURE; case MFX_FRAMETYPE_B: return UMC::B_PICTURE; default: assert(!"wrong coding type"); return UMC::NONE_PICTURE; } } mfxI32 ConvertPicStructMfx2Umc(mfxU32 picStruct) { switch (picStruct) { case MFX_PICSTRUCT_PROGRESSIVE: return UMC::PS_FRAME; case MFX_PICSTRUCT_FIELD_TFF: return UMC::PS_TOP_FIELD; case MFX_PICSTRUCT_FIELD_BFF: return UMC::PS_BOTTOM_FIELD; default: assert(!"bad picStruct"); return UMC::PS_FRAME; } } }; mfxStatus UmcBrc::Init(MfxVideoParam & video) { assert( video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR || video.mfx.RateControlMethod == MFX_RATECONTROL_AVBR); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); m_lookAhead = extOpt2.LookAheadDepth; mfxVideoParam tmpVideo = video; tmpVideo.mfx.GopRefDist = (extOpt2.LookAheadDepth >= 5) ? 1 : tmpVideo.mfx.GopRefDist; UMC::VideoBrcParams umcBrcParams; mfxStatus sts = ConvertVideoParam_Brc(&tmpVideo, &umcBrcParams); assert(sts == MFX_ERR_NONE); (void)sts; umcBrcParams.GOPPicSize = tmpVideo.mfx.GopPicSize; umcBrcParams.GOPRefDist = tmpVideo.mfx.GopRefDist; umcBrcParams.profile = tmpVideo.mfx.CodecProfile; umcBrcParams.level = tmpVideo.mfx.CodecLevel; UMC::Status umcSts = m_impl.Init(&umcBrcParams); assert(umcSts == UMC::UMC_OK); (void)umcSts; return MFX_ERR_NONE; } void UmcBrc::Close() { m_impl.Close(); } void UmcBrc::GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxU32 frameType = par.FrameType; if (m_lookAhead >= 5 && (frameType & MFX_FRAMETYPE_B)) frameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; UMC::FrameType umcFrameType = ConvertFrameTypeMfx2Umc(frameType); m_impl.SetPictureFlags(umcFrameType, ConvertPicStructMfx2Umc(par.picStruct)); frameCtrl.QpY = (mfxU8)m_impl.GetQP(umcFrameType); } void UmcBrc::GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { frameCtrl.QpY = mfx::clamp(frameCtrl.QpY + (mfxU8)par.NumRecode, 1, 51); } mfxF32 UmcBrc::GetFractionalQp(const BRCFrameParams& par) { mfxU32 frameType = par.FrameType; if (m_lookAhead >= 5 && (frameType & MFX_FRAMETYPE_B)) frameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; UMC::FrameType umcFrameType = ConvertFrameTypeMfx2Umc(frameType); m_impl.SetPictureFlags(umcFrameType, ConvertPicStructMfx2Umc(par.picStruct)); return 0.f;//m_impl.GetFractionalQP(umcFrameType); } void UmcBrc::SetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxU32 frameType = par.FrameType; if (m_lookAhead >= 5 && (frameType & MFX_FRAMETYPE_B)) frameType = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; m_impl.SetQP(frameCtrl.QpY, ConvertFrameTypeMfx2Umc(frameType)); } void UmcBrc::PreEnc(const BRCFrameParams& par, std::vector const & vmeData) { for (size_t i = 0; i < vmeData.size(); i++) { if (vmeData[i]->encOrder == par.EncodedOrder) { m_impl.PreEncFrame(ConvertFrameTypeMfx2Umc(par.FrameType), vmeData[i]->intraCost, vmeData[i]->interCost); break; } } } mfxU32 UmcBrc::Report(const BRCFrameParams& par, mfxU32 userDataLength, mfxU32 /*maxFrameSize*/, mfxBRCFrameCtrl &/*frameCtrl*/) { return m_impl.PostPackFrame(ConvertFrameTypeMfx2Umc(par.FrameType), 8 * par.CodedFrameSize, userDataLength * 8, par.NumRecode, par.EncodedOrder); } mfxU32 UmcBrc::GetMinFrameSize() { mfxI32 minSize = 0; //m_impl.GetMinMaxFrameSize(&minSize, 0); assert(minSize >= 0); return mfxU32(minSize + 7) / 8; } namespace { mfxF64 const QSTEP[52] = { 0.630, 0.707, 0.794, 0.891, 1.000, 1.122, 1.260, 1.414, 1.587, 1.782, 2.000, 2.245, 2.520, 2.828, 3.175, 3.564, 4.000, 4.490, 5.040, 5.657, 6.350, 7.127, 8.000, 8.980, 10.079, 11.314, 12.699, 14.254, 16.000, 17.959, 20.159, 22.627, 25.398, 28.509, 32.000, 35.919, 40.317, 45.255, 50.797, 57.018, 64.000, 71.838, 80.635, 90.510, 101.594, 114.035, 128.000, 143.675, 161.270, 181.019, 203.187, 228.070 }; mfxU8 QStep2QpCeil(mfxF64 qstep) // QSTEP[qp] > qstep { return std::min(mfxU8(std::lower_bound(QSTEP, QSTEP + 52, qstep) - QSTEP), 51); } } #ifdef _DEBUG //#define brcprintf printf #else // _DEBUG //#define brcprintf #endif // _DEBUG #ifndef brcprintf #define brcprintf(...) #endif // brcprintf namespace MfxHwH264EncodeHW { mfxF64 const INTRA_QSTEP_COEFF = 2.0; mfxI32 const MAX_QP_CHANGE = 2; mfxF64 const LOG2_64 = 3.0; mfxF64 const MIN_EST_RATE = 0.3; mfxF64 const NORM_EST_RATE = 100.0; mfxF64 const MIN_RATE_COEFF_CHANGE = 0.5; mfxF64 const MAX_RATE_COEFF_CHANGE = 2.0; mfxF64 const INIT_RATE_COEFF[] = { 1.109, 1.196, 1.225, 1.309, 1.369, 1.428, 1.490, 1.588, 1.627, 1.723, 1.800, 1.851, 1.916, 2.043, 2.052, 2.140, 2.097, 2.096, 2.134, 2.221, 2.084, 2.153, 2.117, 2.014, 1.984, 2.006, 1.801, 1.796, 1.682, 1.549, 1.485, 1.439, 1.248, 1.221, 1.133, 1.045, 0.990, 0.987, 0.895, 0.921, 0.891, 0.887, 0.896, 0.925, 0.917, 0.942, 0.964, 0.997, 1.035, 1.098, 1.170, 1.275 }; mfxU8 GetSkippedQp(MbData const & mb) { if (mb.intraMbFlag) return 52; // never skipped if (abs(mb.mv[0].x - mb.costCenter0.x) >= 4 || abs(mb.mv[0].y - mb.costCenter0.y) >= 4 || abs(mb.mv[1].x - mb.costCenter1.x) >= 4 || abs(mb.mv[1].y - mb.costCenter1.y) >= 4) return 52; // never skipped mfxU16 const * sumc = mb.lumaCoeffSum; mfxU8 const * nzc = mb.lumaCoeffCnt; if (nzc[0] + nzc[1] + nzc[2] + nzc[3] == 0) return 0; // skipped at any qp mfxF64 qoff = 1.0 / 6; mfxF64 norm = 0.1666; mfxF64 qskip = std::max({ nzc[0] ? (sumc[0] * norm / nzc[0]) / (1.0 - qoff) * LOG2_64 : 0.0, nzc[1] ? (sumc[1] * norm / nzc[1]) / (1.0 - qoff) * LOG2_64 : 0.0, nzc[2] ? (sumc[2] * norm / nzc[2]) / (1.0 - qoff) * LOG2_64 : 0.0, nzc[3] ? (sumc[3] * norm / nzc[3]) / (1.0 - qoff) * LOG2_64 : 0.0}); return QStep2QpCeil(qskip); } } using namespace MfxHwH264EncodeHW; inline void SetMinMaxQP(mfxExtCodingOption2 const & extOpt2, mfxU8 QPMin[], mfxU8 QPMax[]) { // valid qp range [1, 51], default qp range [8, 51], qp=0 doesn't supported by driver QPMin[0] = (extOpt2.MinQPI) ? extOpt2.MinQPI : 8; QPMin[1] = (extOpt2.MinQPP) ? extOpt2.MinQPP : 8; QPMin[2] = (extOpt2.MinQPB) ? extOpt2.MinQPB : 8; QPMax[0] = (extOpt2.MaxQPI) ? extOpt2.MaxQPI : 51; QPMax[1] = (extOpt2.MaxQPP) ? extOpt2.MaxQPP : 51; QPMax[2] = (extOpt2.MaxQPB) ? extOpt2.MaxQPB : 51; } enum { MFX_BRC_ACCURACY_UNKNOWN, MFX_BRC_ACCURACY_LOW, MFX_BRC_ACCURACY_MEDIUM, MFX_BRC_ACCURACY_HIGH }; struct sBrcTarget { mfxU32 rateCalcPeriodInSec; // 0 - all frames are used in rate calculation, otherwise the last n seconds mfxU32 accuracy; // MFX_BRC_ACCURACY_LOW, MFX_BRC_ACCURACY_MEDIUM, MFX_BRC_ACCURACY_HIGH }; void setLAThresholds(sLAThresholds& thresholds, mfxU32 accuracy) { thresholds.minFramesForClassicLA = 30; thresholds.minFramesForStat = 10; if (accuracy == MFX_BRC_ACCURACY_HIGH) { thresholds.minCostCalcPeriod = 20; thresholds.maxRateRatioLocal = 1.3; thresholds.minRateRatioLocal = 0.9; thresholds.maxAvgRateRatio = 1.02; thresholds.minAvgRateRatio = 1.00; } else if (accuracy == MFX_BRC_ACCURACY_LOW) { thresholds.minCostCalcPeriod = 40; thresholds.maxRateRatioLocal = 1.5; thresholds.minRateRatioLocal = 0.7; thresholds.maxAvgRateRatio = 1.08; thresholds.minAvgRateRatio = 1.00; } else { // MFX_BRC_ACCURACY_MEDIUM thresholds.minCostCalcPeriod = 30; thresholds.maxRateRatioLocal = 1.4; thresholds.minRateRatioLocal = 0.85; thresholds.maxAvgRateRatio = 1.05; thresholds.minAvgRateRatio = 1.00; } } inline mfxF64 criticalRatio(mfxF64 maxRatio) { // limit overrun more than twice is critical // example: for maxRatio = 1.4 (40% limit), 80% excess is critical return (maxRatio > 1.0) ? (2.0*maxRatio - 1.0) : maxRatio; } inline mfxU32 GetFrameTypeIndex(mfxU32 frameType) { if (frameType & MFX_FRAMETYPE_I) return 0; if (frameType & MFX_FRAMETYPE_P) return 1; if (frameType & MFX_FRAMETYPE_B) return 2; return 0; } inline mfxU8 SelectQp(mfxF64 erate[52], mfxF64 budget) { for (mfxU8 qp = 1; qp < 52; qp++) if (erate[qp] < budget) return (erate[qp - 1] + erate[qp] < 2 * budget) ? qp - 1 : qp; return 51; } inline mfxU8 GetNewQP(mfxU32 size, mfxU32 targeSize, mfxU8 curQP) { mfxF64 qstep = QSTEP[std::min(51, curQP)]; mfxF64 qstep_new = qstep * pow((mfxF64)size / targeSize, 0.8); mfxU8 qp_new = QStep2QpCeil(qstep_new); if (qp_new > 0 && qstep_new >(QSTEP[qp_new] + QSTEP[qp_new - 1]) / 2) --qp_new; return qp_new; } mfxStatus LookAheadBrc2::Init(MfxVideoParam & video) { mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(video); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); sBrcTarget brcTarget = {0, MFX_BRC_ACCURACY_MEDIUM}; // will be added in API setLAThresholds(m_thresholds, brcTarget.accuracy); m_lookAhead = extOpt2.LookAheadDepth - extDdi.LookAheadDependency; m_lookAheadDep = extDdi.LookAheadDependency; m_LaScaleFactor = LaDSenumToFactor(extOpt2.LookAheadDS); m_qpUpdateRange = extDdi.QpUpdateRange; m_strength = extDdi.StrengthN; m_fr = mfxF64(video.mfx.FrameInfo.FrameRateExtN) / video.mfx.FrameInfo.FrameRateExtD; m_totNumMb = video.mfx.FrameInfo.Width * video.mfx.FrameInfo.Height / 256; m_initTargetRate = 1000* video.calcParam.targetKbps /m_fr / m_totNumMb; m_currRate = m_initTargetRate; m_laData.reserve(m_lookAhead+1); assert(extDdi.RegressionWindow <= m_rateCoeffHistory[0].MAX_WINDOW); for (mfxU32 qp = 0; qp < 52; qp++) m_rateCoeffHistory[qp].Reset(extDdi.RegressionWindow, 100.0, 100.0 * INIT_RATE_COEFF[qp]); m_framesBehind = 0; m_bitsBehind = 0.0; m_curQp = -1; m_curBaseQp = -1; //m_coef = 4; m_skipped = 0; m_maxFrameSizeForRec = 0; m_AvgBitrate = 0; SetMinMaxQP(extOpt2, m_QPMin, m_QPMax); if (extOpt3.WinBRCSize) { m_AvgBitrate = new AVGBitrate(extOpt3.WinBRCSize, (mfxU32)(1000.0* video.calcParam.WinBRCMaxAvgKbps / m_fr), (mfxU32)(1000.0* video.calcParam.targetKbps / m_fr), true); } if (brcTarget.rateCalcPeriodInSec != 0) m_rateCalcPeriod = (brcTarget.rateCalcPeriodInSec < 0x1fffffff) ? (mfxU32)(brcTarget.rateCalcPeriodInSec*m_fr) : 0xffffffff; else if (video.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) m_rateCalcPeriod = (mfxU32)(8000.0 * video.mfx.BufferSizeInKB / video.mfx.TargetKbps*m_fr * 2.0); else m_rateCalcPeriod = 0xffffffff; m_hrd.reset(); if (video.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD) { m_hrd.reset(new Hrd); m_hrd->Setup(video); } m_MaxframeSize[0] = std::max(extOpt3.MaxFrameSizeI, extOpt2.MaxFrameSize); m_MaxframeSize[1] = std::max(extOpt3.MaxFrameSizeP, extOpt2.MaxFrameSize); m_MaxframeSize[2] = extOpt2.MaxFrameSize; m_costCalcPeriod = std::max(m_lookAhead, m_thresholds.minCostCalcPeriod); m_laDataStat.reserve(m_costCalcPeriod - m_lookAhead +1); m_AsyncDepth = video.AsyncDepth > 1 ? 1 : 0; m_first = 0; return MFX_ERR_NONE; } void LookAheadBrc2::Close() { if (m_AvgBitrate) { delete m_AvgBitrate; m_AvgBitrate = 0; } } mfxF64 GetTotalRate(std::vector const & laData, mfxI32 baseQp, size_t size, mfxU32 first) { mfxF64 totalRate = 0.0; size = (size < laData.size()) ? size : laData.size(); for (size_t i = 0 + first; i < size; i++) totalRate += laData[i].estRateTotal[mfx::clamp(baseQp + laData[i].deltaQp, 0, 51)]; return totalRate; } mfxF64 GetTotalRate(std::vector const & laData, std::vector const & laDataStat, mfxI32 baseQp, size_t size, mfxU32 first) { mfxF64 totalRate = GetTotalRate(laData, baseQp, size, first); //old frames from this period totalRate += GetTotalRate(laDataStat, baseQp, laDataStat.size(), 0); return totalRate; } mfxU8 SelectQp(std::vector const & laData, mfxF64 budget, size_t size, mfxU32 async) { mfxF64 prevTotalRate = GetTotalRate(laData, 0, size, async); //printf("SelectQp: budget = %f, size = %d, async = %d\n", budget, size, async); for (mfxU8 qp = 1; qp < 52; qp++) { mfxF64 totalRate = GetTotalRate(laData, qp, size, async); if (totalRate < budget) return (prevTotalRate + totalRate < 2 * budget) ? qp - 1 : qp; else prevTotalRate = totalRate; } return 51; } mfxU8 SelectQp(std::vector const & laData, std::vector const & laDataStat, mfxF64 budget, size_t size, mfxU32 async) { mfxF64 prevTotalRate = GetTotalRate(laData, laDataStat, 0, size, async); //printf("SelectQp: budget = %f, size = %d, async = %d\n", budget, size, async); for (mfxU8 qp = 1; qp < 52; qp++) { mfxF64 totalRate = GetTotalRate(laData, laDataStat, qp, size, async); if (totalRate < budget) return (prevTotalRate + totalRate < 2 * budget) ? qp - 1 : qp; else prevTotalRate = totalRate; } return 51; } mfxU8 GetFrameTypeLetter(mfxU32 frameType) { mfxU32 ref = (frameType & MFX_FRAMETYPE_REF) ? 0 : 'a' - 'A'; if (frameType & MFX_FRAMETYPE_I) return mfxU8('I' + ref); if (frameType & MFX_FRAMETYPE_P) return mfxU8('P' + ref); if (frameType & MFX_FRAMETYPE_B) return mfxU8('B' + ref); return 'x'; } void LookAheadBrc2::GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "LookAheadBrc2::GetQp"); brcprintf("\r%4d: do=%4d type=%c Rt=%7.3f-%7.3f curc=%4d numc=%2d ", m_laData[0].encOrder, m_laData[0].poc/2, GetFrameTypeLetter(par.FrameType), m_targetRateMin, m_targetRateMax, m_laData[0].interCost / m_totNumMb, mfxU32(m_laData.size())); (void)par; mfxF64 totalEstRate[52] = { 0.0 }; for (mfxU32 qp = 0; qp < 52; qp++) { mfxF64 rateCoeff = m_rateCoeffHistory[qp].GetCoeff(); for (mfxU32 i = m_first; i < m_laData.size(); i++) { m_laData[i].estRateTotal[qp] = std::max(MIN_EST_RATE, rateCoeff * m_laData[i].estRate[qp]); totalEstRate[qp] += m_laData[i].estRateTotal[qp]; } for (size_t i = 0; i < m_laDataStat.size(); i++) { m_laDataStat[i].estRateTotal[qp] = std::max(MIN_EST_RATE, rateCoeff * m_laDataStat[i].estRate[qp]); } } mfxI32 maxDeltaQp = INT_MIN; if (m_lookAheadDep > 0) { mfxI32 curQp = m_curBaseQp < 0 ? SelectQp(totalEstRate, m_initTargetRate * m_laData.size()) : m_curBaseQp; mfxF64 strength = 0.03 * curQp + .75; for (mfxU32 i = m_first; i < m_laData.size(); i++) { mfxU32 intraCost = m_laData[i].intraCost; mfxU32 interCost = m_laData[i].interCost; mfxU32 propCost = m_laData[i].propCost; mfxF64 ratio = 1.0;//mfxF64(interCost) / intraCost; mfxF64 deltaQp = log((intraCost + propCost * ratio) / intraCost) / log(2.0); m_laData[i].deltaQp = (interCost >= intraCost * 0.9) ? -mfxI32(deltaQp * 2 * strength + 0.5) : -mfxI32(deltaQp * 1 * strength + 0.5); maxDeltaQp = std::max(maxDeltaQp, m_laData[i].deltaQp); } } else { for (mfxU32 i = m_first; i < m_laData.size(); i++) { mfxU32 intraCost = m_laData[i].intraCost; mfxU32 interCost = m_laData[i].interCost; m_laData[i].deltaQp = (interCost >= intraCost * 0.9) ? -5 : m_laData[i].bframe ? 0 : -2; maxDeltaQp = std::max(maxDeltaQp, m_laData[i].deltaQp); } } for (mfxU32 i = m_first; i < m_laData.size(); i++) m_laData[i].deltaQp -= maxDeltaQp; mfxF64 MaxRate = 0; mfxF64 MinRate = 0; bool bStartOfStream = (par.EncodedOrder < m_thresholds.minFramesForStat); mfxF64 currRateLocal = m_initTargetRate; bool bLocalMin = false; if (m_lookAhead < m_thresholds.minFramesForClassicLA) { if (bStartOfStream) { //MaxRate is increased at the start of stream in the case of short LA to avoid cutting the fist frame. static mfxF64 k[] = { 5.0, 4.0, 3.0, 2.0, 1.95, 1.9, 1.85, 1.83, 1.8, 1.7, 1.6, 1.55, 1.50, 1.45,1.35, 1.30, 1.25, 1.20, 1.15, 1.10, 1.0}; MinRate = MaxRate = (m_currRate == m_initTargetRate) ? m_initTargetRate * k[std::min(m_lookAhead, (mfxU32)(sizeof(k)/sizeof(k[0])-1))] : (m_currRate + m_initTargetRate) / 2.0; MaxRate = std::max(MaxRate, m_initTargetRate); MinRate = std::min(MinRate, m_initTargetRate); } else { currRateLocal = GetTotalRate(m_laData, m_laDataStat, m_curBaseQp, m_laData.size(), m_first) / (m_laDataStat.size() + m_laData.size()); if (currRateLocal > m_initTargetRate*criticalRatio(m_thresholds.maxRateRatioLocal)) { bLocalMin = true; MaxRate = m_initTargetRate * criticalRatio(m_thresholds.maxRateRatioLocal); } } } else { mfxF64 rateCalcPeriod = std::min(m_rateCalcPeriod, m_framesBehind); MinRate = MaxRate = std::max((m_initTargetRate *(rateCalcPeriod + m_costCalcPeriod) - m_currRate * rateCalcPeriod) / m_costCalcPeriod, m_initTargetRate/60.0); } mfxU8 minQp = m_QPMin[0]; mfxU8 maxQp = m_QPMax[0]; mfxI32 baseQP = mfx::clamp(m_curBaseQp, m_QPMin[0], m_QPMax[0]); mfxF64 ratio = m_currRate / m_initTargetRate; mfxF64 ratioLocal = currRateLocal / m_initTargetRate; if (MaxRate) { minQp = SelectQp(m_laData, m_laDataStat, MaxRate * (m_laData.size() + m_laDataStat.size() - m_first), m_laData.size(), m_first); } else if ((ratio > m_thresholds.maxAvgRateRatio && ratioLocal > 1.00) || (ratio > criticalRatio(m_thresholds.maxAvgRateRatio) && ratioLocal > m_thresholds.minRateRatioLocal) || (ratioLocal > m_thresholds.maxRateRatioLocal)) { minQp = std::max(minQp, (mfxU8)(baseQP + ((ratioLocal > criticalRatio(m_thresholds.maxRateRatioLocal)) ? 2 : 1))); } if (MinRate) { maxQp = SelectQp(m_laData, m_laDataStat, MinRate * (m_laData.size() + m_laDataStat.size() - m_first), m_laData.size(), m_first); } else if ((ratio < m_thresholds.minAvgRateRatio && ratioLocal < 1.00) || (ratioLocal < m_thresholds.minRateRatioLocal && ratio < m_thresholds.maxAvgRateRatio)) { maxQp = (mfxU8)(baseQP - 1); } if (m_AvgBitrate) { size_t framesForCheck = m_AvgBitrate->GetWindowSize() < (m_laData.size() - m_first) ? m_AvgBitrate->GetWindowSize() : (m_laData.size() - m_first); for (mfxU32 i = 1; i < framesForCheck; i++) { mfxF64 budget = mfxF64(m_AvgBitrate->GetBudget(i)) / (mfxF64(m_totNumMb)); mfxU8 QP = SelectQp(m_laData, budget, i + m_first, m_first); if (minQp < QP) { minQp = QP; maxQp = maxQp > minQp ? maxQp : minQp; } } } if (m_hrd.get()) { mfxF64 maxFrameSizeInBits = m_hrd->GetMaxFrameSize(par.FrameType & MFX_FRAMETYPE_IDR); mfxF64 maxRatePerMb = maxFrameSizeInBits / mfxF64(m_totNumMb); for (size_t i = 0; i < m_laData.size() - m_first; i++) { mfxF64 budget = maxRatePerMb + i * m_initTargetRate; mfxU8 QP = SelectQp(m_laData, budget, 1 + i + m_first, m_first); if (minQp < QP) { minQp = QP; maxQp = maxQp > minQp ? maxQp : minQp; } } } if (m_curBaseQp < 0) m_curBaseQp = minQp; // first frame else if (m_curBaseQp < minQp && bLocalMin) m_curBaseQp = mfx::clamp(minQp, m_curBaseQp - MAX_QP_CHANGE, m_curBaseQp + 2*MAX_QP_CHANGE); else if (m_curBaseQp < minQp) m_curBaseQp = mfx::clamp(minQp, m_curBaseQp - MAX_QP_CHANGE, m_curBaseQp + MAX_QP_CHANGE); else if (m_curBaseQp > maxQp) m_curBaseQp = mfx::clamp(maxQp, m_curBaseQp - MAX_QP_CHANGE, m_curBaseQp + MAX_QP_CHANGE); else ; // do not change qp if last qp guarantees target rate interval mfxU32 ind = GetFrameTypeIndex(par.FrameType); m_curQp = mfx::clamp(m_curBaseQp + m_laData[m_first].deltaQp, m_QPMin[ind], m_QPMax[ind]); //printf("bqp=%2d qp=%2d dqp=%2d erate=%7.3f ", m_curBaseQp, m_curQp, m_laData[0].deltaQp, m_laData[0].estRateTotal[m_curQp]); frameCtrl.QpY = m_curQp; } void LookAheadBrc2::GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxI32 qp = frameCtrl.QpY; if (m_maxFrameSizeForRec < par.CodedFrameSize) { qp = GetNewQP(par.CodedFrameSize, m_maxFrameSizeForRec, (mfxU8)frameCtrl.QpY); } if (qp <= frameCtrl.QpY) qp = frameCtrl.QpY + std::max(1, mfxI32(par.NumRecode)); mfxU32 ind = GetFrameTypeIndex(par.FrameType); frameCtrl.QpY = mfx::clamp(qp, (mfxI32)m_QPMin[ind], (mfxI32)m_QPMax[ind]); } void LookAheadBrc2::SetQp(const BRCFrameParams& /*par*/, mfxBRCFrameCtrl &frameCtrl) { m_curQp = mfxU8(mfx::clamp(frameCtrl.QpY, 1, 51)); } void LookAheadBrc2::ClearStat(mfxU32 frameOrder) { if (m_costCalcPeriod == m_lookAhead) return; // for short LA only mfxU32 lastNewFrame = frameOrder + m_lookAhead; if ((m_laDataStat.size() > 1) && (m_laDataStat[0].encOrder + m_costCalcPeriod < lastNewFrame || m_laDataStat.size() >= m_costCalcPeriod - m_lookAhead - 1)) m_laDataStat.erase(m_laDataStat.begin(), m_laDataStat.begin() + 1); // old frames are removed } void LookAheadBrc2::SaveStat(mfxU32 frameOrder) { if (m_costCalcPeriod == m_lookAhead) return; // for short LA only for (size_t i = 0; i < m_laData.size() && m_laData[i].encOrder < frameOrder; i++) { if (m_laDataStat.empty() || (m_laData[i].encOrder > m_laDataStat.back().encOrder)) m_laDataStat.push_back(m_laData[i]); } } void LookAheadBrc2::PreEnc(const BRCFrameParams& par, std::vector const & vmeData) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "LookAheadBrc2::PreEnc"); m_first = 0; ClearStat(par.EncodedOrder); SaveStat(par.EncodedOrder); size_t i = 0; for (; i < m_laData.size(); i++) if (m_laData[i].encOrder == par.EncodedOrder) { break; } if (m_AsyncDepth && (i >= m_AsyncDepth)) { i = i - m_AsyncDepth; m_first = 1; } m_laData.erase(m_laData.begin(), m_laData.begin() + i); mfxU32 firstNewFrame = m_laData.empty() ? par.EncodedOrder : m_laData.back().encOrder + 1; mfxU32 lastNewFrame = par.EncodedOrder + m_lookAhead; for (i = 0; i < vmeData.size(); i++) { if (vmeData[i]->encOrder < firstNewFrame || vmeData[i]->encOrder >= lastNewFrame) continue; LaFrameData newData = {}; newData.encOrder = vmeData[i]->encOrder; newData.poc = vmeData[i]->poc; newData.interCost = vmeData[i]->interCost; newData.intraCost = vmeData[i]->intraCost; newData.propCost = vmeData[i]->propCost; newData.bframe = vmeData[i]->pocL1 != mfxU32(-1); for (size_t j = 0; j < vmeData[i]->mb.size(); j++) { mfxF64 LaMultiplier = m_LaScaleFactor * m_LaScaleFactor; MbData const & mb = vmeData[i]->mb[j]; if (mb.intraMbFlag) { for (mfxU32 qp = 0; qp < 52; qp++) newData.estRate[qp] += LaMultiplier * mb.dist / (QSTEP[qp] * INTRA_QSTEP_COEFF); } else { mfxU32 skipQp = GetSkippedQp(mb); for (mfxU32 qp = 0; qp < skipQp; qp++) newData.estRate[qp] += LaMultiplier * mb.dist / (QSTEP[qp]); } } for (mfxU32 qp = 0; qp < 52; qp++) newData.estRate[qp] /= m_totNumMb; m_laData.push_back(newData); } assert(m_laData.size() <= m_lookAhead + m_AsyncDepth); } mfxU32 LookAheadBrc2::Report(const BRCFrameParams& par, mfxU32 /* userDataLength */, mfxU32 maxFrameSize, mfxBRCFrameCtrl &frameCtrl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "LookAheadBrc2::Report"); mfxF64 realRatePerMb = 8 * par.CodedFrameSize / mfxF64(m_totNumMb); mfxU32 maxFS = maxFrameSize? maxFrameSize*8 : 0xFFFFFFF; mfxI32 qp = mfx::clamp(frameCtrl.QpY, 1, 51); if ((m_skipped == 1) && ((par.FrameType & MFX_FRAMETYPE_B)!=0) && par.NumRecode < 100) return 3; // skip mode for this frame m_skipped = (par.NumRecode < 100) ? 0 : 1; //frame was skipped (panic mode) //we will skip all frames until next reference] if (m_AvgBitrate) maxFS = std::min(maxFS, m_AvgBitrate->GetMaxFrameSize(m_skipped>0, (par.FrameType & MFX_FRAMETYPE_I)!=0, par.NumRecode)); if ((8 * par.CodedFrameSize + 24) > maxFS) { m_maxFrameSizeForRec = maxFS/8; // for recoding return 1; } if (m_AvgBitrate) m_AvgBitrate->UpdateSlidingWindow(8 * par.CodedFrameSize, par.EncodedOrder, m_skipped>0, (par.FrameType & MFX_FRAMETYPE_I)!=0, par.NumRecode, qp); if (m_hrd.get()) m_hrd->RemoveAccessUnit(par.CodedFrameSize, 0, 0); m_framesBehind++; m_bitsBehind += realRatePerMb; mfxF64 rateCalcPeriod = std::min(m_rateCalcPeriod, m_framesBehind); m_currRate = ((rateCalcPeriod - 1.0)*m_currRate + realRatePerMb) / rateCalcPeriod; mfxF64 oldCoeff = m_rateCoeffHistory[qp].GetCoeff(); mfxF64 y = std::max(0.0, realRatePerMb); mfxF64 x = m_laData[0].estRate[qp]; mfxF64 minY = NORM_EST_RATE * INIT_RATE_COEFF[qp] * MIN_RATE_COEFF_CHANGE; mfxF64 maxY = NORM_EST_RATE * INIT_RATE_COEFF[qp] * MAX_RATE_COEFF_CHANGE; y = mfx::clamp(y / x * NORM_EST_RATE, minY, maxY); m_rateCoeffHistory[qp].Add(NORM_EST_RATE, y); mfxF64 ratio = m_rateCoeffHistory[qp].GetCoeff() / oldCoeff; mfxI32 signed_qp = qp; for (mfxI32 i = -m_qpUpdateRange; i <= m_qpUpdateRange; i++) if (i != 0 && signed_qp + i >= 0 && signed_qp + i < 52) { mfxF64 r = ((ratio - 1.0) * (1.0 - abs(i)/(m_qpUpdateRange + 1)) + 1.0); m_rateCoeffHistory[signed_qp + i].Add(NORM_EST_RATE, NORM_EST_RATE * m_rateCoeffHistory[signed_qp + i].GetCoeff() * r); } brcprintf("rrate=%6.3f newCoeff=%5.3f\n", realRatePerMb, m_rateCoeffHistory[qp].GetCoeff()); return 0; } mfxStatus LookAheadCrfBrc::Init(MfxVideoParam & video) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); m_lookAhead = extOpt2.LookAheadDepth; m_crfQuality = video.mfx.ICQQuality; m_totNumMb = video.mfx.FrameInfo.Width * video.mfx.FrameInfo.Height / 256; m_intraCost = 0; m_interCost = 0; m_propCost = 0; SetMinMaxQP(extOpt2, m_QPMin, m_QPMax); return MFX_ERR_NONE; } void LookAheadCrfBrc::GetQp(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxF64 strength = 0.03 * m_crfQuality + .75; mfxF64 ratio = 1.0; mfxF64 deltaQpF = log((m_intraCost + m_propCost * ratio) / m_intraCost) / log(2.0); mfxI32 deltaQp = (m_interCost >= m_intraCost * 0.9) ? -mfxI32(deltaQpF * 2 * strength + 0.5) : -mfxI32(deltaQpF * 1 * strength + 0.5); mfxU32 ind = GetFrameTypeIndex(par.FrameType); m_curQp = mfx::clamp(m_crfQuality + deltaQp, m_QPMin[ind], m_QPMax[ind]); // driver doesn't support qp=0 frameCtrl.QpY = mfxU8(m_curQp); } void LookAheadCrfBrc::GetQpForRecode(const BRCFrameParams& par, mfxBRCFrameCtrl &frameCtrl) { mfxI32 qp = frameCtrl.QpY + par.NumRecode; mfxU32 ind = GetFrameTypeIndex(par.FrameType); frameCtrl.QpY = mfx::clamp(qp, (mfxI32)m_QPMin[ind], (mfxI32)m_QPMax[ind]); } void LookAheadCrfBrc::PreEnc(const BRCFrameParams& par, std::vector const & vmeData) { for (size_t i = 0; i < vmeData.size(); i++) { if (vmeData[i]->encOrder == par.EncodedOrder) { m_intraCost = vmeData[i]->intraCost; m_interCost = vmeData[i]->interCost; m_propCost = vmeData[i]->propCost; } } } mfxU32 LookAheadCrfBrc::Report(const BRCFrameParams& /*par*/, mfxU32 /*userDataLength*/, mfxU32 /* maxFrameSize */, mfxBRCFrameCtrl &/*frameCtrl*/) { return 0; } Hrd::Hrd() :m_bitrate(0) , m_rcMethod(0) , m_hrdIn90k(0) , m_tick(0) , m_trn_cur(0) , m_taf_prv(0) , m_bIsHrdRequired(false) { } void Hrd::Setup(MfxVideoParam const & par) { mfxExtCodingOption & opts = GetExtBufferRef(par); if (!IsOn(opts.NalHrdConformance)) { // hrd control isn't required m_bIsHrdRequired = false; return; } m_bIsHrdRequired = true; m_rcMethod = par.mfx.RateControlMethod; if (m_rcMethod != MFX_RATECONTROL_CBR && m_rcMethod != MFX_RATECONTROL_VBR && m_rcMethod != MFX_RATECONTROL_WIDI_VBR) m_rcMethod = MFX_RATECONTROL_VBR; // MVC BD { // for ViewOutput mode HRD should be controlled for every view separately if (IsMvcProfile(par.mfx.CodecProfile) && opts.ViewOutput == MFX_CODINGOPTION_ON) { m_bitrate = GetMaxBitrateValue(par.calcParam.mvcPerViewPar.maxKbps) << (6 + SCALE_FROM_DRIVER); m_hrdIn90k = mfxU32(8000.0 * par.calcParam.mvcPerViewPar.bufferSizeInKB / m_bitrate * 90000.0); } else { m_bitrate = GetMaxBitrateValue(par.calcParam.maxKbps) << (6 + SCALE_FROM_DRIVER); m_hrdIn90k = mfxU32(8000.0 * par.calcParam.bufferSizeInKB / m_bitrate * 90000.0); } // MVC BD } m_tick = 0.5 * par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN; m_taf_prv = 0.0; // MVC BD { if (IsMvcProfile(par.mfx.CodecProfile) && opts.ViewOutput == MFX_CODINGOPTION_ON) m_trn_cur = double(8000) * par.calcParam.mvcPerViewPar.initialDelayInKB / m_bitrate; else m_trn_cur = double(8000) * par.calcParam.initialDelayInKB / m_bitrate; // MVC BD } m_trn_cur = GetInitCpbRemovalDelay() / 90000.0; } void Hrd::Reset(MfxVideoParam const & par) { if (m_bIsHrdRequired == false) return; m_bitrate = GetMaxBitrateValue(par.calcParam.maxKbps) << (6 + SCALE_FROM_DRIVER); m_hrdIn90k = mfxU32(8000.0 * par.calcParam.bufferSizeInKB / m_bitrate * 90000.0); } void Hrd::RemoveAccessUnit(mfxU32 size, mfxU32 interlace, mfxU32 bufferingPeriod) { if (m_bIsHrdRequired == false) return; mfxU32 initDelay = GetInitCpbRemovalDelay(); double tai_earliest = bufferingPeriod ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdIn90k / 90000.0); double tai_cur = (m_rcMethod == MFX_RATECONTROL_VBR) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; m_taf_prv = tai_cur + double(8) * size / m_bitrate; m_trn_cur += m_tick * (interlace ? 1 : 2); } mfxU32 Hrd::GetInitCpbRemovalDelay() const { if (m_bIsHrdRequired == false) return 0; double delay = std::max(0.0, m_trn_cur - m_taf_prv); mfxU32 initialCpbRemovalDelay = mfxU32(90000 * delay + 0.5); return initialCpbRemovalDelay == 0 ? 1 // should not be equal to 0 : initialCpbRemovalDelay > m_hrdIn90k && m_rcMethod == MFX_RATECONTROL_VBR ? m_hrdIn90k // should not exceed hrd buffer : initialCpbRemovalDelay; } mfxU32 Hrd::GetInitCpbRemovalDelayOffset() const { if (m_bIsHrdRequired == false) return 0; // init_cpb_removal_delay + init_cpb_removal_delay_offset should be constant return m_hrdIn90k - GetInitCpbRemovalDelay(); } mfxU32 Hrd::GetMaxFrameSize(mfxU32 bufferingPeriod) const { if (m_bIsHrdRequired == false) return 0; mfxU32 initDelay = GetInitCpbRemovalDelay(); double tai_earliest = (bufferingPeriod) ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdIn90k / 90000.0); double tai_cur = (m_rcMethod == MFX_RATECONTROL_VBR) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; mfxU32 maxFrameSize = (mfxU32)((m_trn_cur - tai_cur)*m_bitrate); //printf("MaxFrame %d, tai_cur %f, max_taf_cur %f\n", maxFrameSize, tai_cur, tai_cur + (mfxF64)maxFrameSize / m_bitrate); return maxFrameSize; } InputBitstream::InputBitstream( mfxU8 const * buf, size_t size, bool hasStartCode, bool doEmulationControl) : m_buf(buf) , m_ptr(buf) , m_bufEnd(buf + size) , m_bitOff(0) , m_doEmulationControl(doEmulationControl) { if (hasStartCode) m_ptr = m_buf = SkipStartCode(m_buf, m_bufEnd); } InputBitstream::InputBitstream( mfxU8 const * buf, mfxU8 const * bufEnd, bool hasStartCode, bool doEmulationControl) : m_buf(buf) , m_ptr(buf) , m_bufEnd(bufEnd) , m_bitOff(0) , m_doEmulationControl(doEmulationControl) { if (hasStartCode) m_ptr = m_buf = SkipStartCode(m_buf, m_bufEnd); } mfxU32 InputBitstream::NumBitsRead() const { return mfxU32(8 * (m_ptr - m_buf) + m_bitOff); } mfxU32 InputBitstream::NumBitsLeft() const { return mfxU32(8 * (m_bufEnd - m_ptr) - m_bitOff); } mfxU32 InputBitstream::GetBit() { if (m_ptr >= m_bufEnd) throw EndOfBuffer(); mfxU32 bit = (*m_ptr >> (7 - m_bitOff)) & 1; if (++m_bitOff == 8) { ++m_ptr; m_bitOff = 0; if (m_doEmulationControl && m_ptr - m_buf >= 2 && (m_bufEnd - m_ptr) >= 1 && *m_ptr == 0x3 && *(m_ptr - 1) == 0 && *(m_ptr - 2) == 0 && (*(m_ptr + 1) & 0xfc) == 0) { ++m_ptr; // skip start code emulation prevention byte (0x03) } } return bit; } mfxU32 InputBitstream::GetBits(mfxU32 nbits) { mfxU32 bits = 0; for (; nbits > 0; --nbits) { bits <<= 1; bits |= GetBit(); } return bits; } mfxU32 InputBitstream::GetUe() { mfxU32 zeroes = 0; while (GetBit() == 0) ++zeroes; return zeroes == 0 ? 0 : ((1 << zeroes) | GetBits(zeroes)) - 1; } mfxI32 InputBitstream::GetSe() { mfxU32 val = GetUe(); mfxU32 sign = (val & 1); val = (val + 1) >> 1; return sign ? val : -mfxI32(val); } OutputBitstream::OutputBitstream(mfxU8 * buf, size_t size, bool emulationControl) : m_buf(buf) , m_ptr(buf) , m_bufEnd(buf + size) , m_bitOff(0) , m_emulationControl(emulationControl) { if (m_ptr < m_bufEnd) *m_ptr = 0; // clear next byte } OutputBitstream::OutputBitstream(mfxU8 * buf, mfxU8 * bufEnd, bool emulationControl) : m_buf(buf) , m_ptr(buf) , m_bufEnd(bufEnd) , m_bitOff(0) , m_emulationControl(emulationControl) { if (m_ptr < m_bufEnd) *m_ptr = 0; // clear next byte } mfxU32 OutputBitstream::GetNumBits() const { return mfxU32(8 * (m_ptr - m_buf) + m_bitOff); } void OutputBitstream::PutBit(mfxU32 bit) { if (m_ptr >= m_bufEnd) throw EndOfBuffer(); mfxU8 mask = mfxU8(0xff << (8 - m_bitOff)); mfxU8 newBit = mfxU8((bit & 1) << (7 - m_bitOff)); *m_ptr = (*m_ptr & mask) | newBit; if (++m_bitOff == 8) { if (m_emulationControl && m_ptr - 2 >= m_buf && (*m_ptr & 0xfc) == 0 && *(m_ptr - 1) == 0 && *(m_ptr - 2) == 0) { if (m_ptr + 1 >= m_bufEnd) throw EndOfBuffer(); *(m_ptr + 1) = *(m_ptr + 0); *(m_ptr + 0) = 0x03; m_ptr++; } m_bitOff = 0; m_ptr++; if (m_ptr < m_bufEnd) *m_ptr = 0; // clear next byte } } void OutputBitstream::PutBits(mfxU32 val, mfxU32 nbits) { assert(nbits <= 32); for (; nbits > 0; nbits--) PutBit((val >> (nbits - 1)) & 1); } void OutputBitstream::PutUe(mfxU32 val) { if (val == 0) { PutBit(1); } else { val++; mfxU32 nbits = 1; while (val >> nbits) nbits++; PutBits(0, nbits - 1); PutBits(val, nbits); } } void OutputBitstream::PutSe(mfxI32 val) { (val <= 0) ? PutUe(-2 * val) : PutUe( 2 * val - 1); } void OutputBitstream::PutTrailingBits() { PutBit(1); while (m_bitOff != 0) PutBit(0); } void OutputBitstream::PutRawBytes(mfxU8 const * begin, mfxU8 const * end) { assert(m_bitOff == 0); if (m_bufEnd - m_ptr < end - begin) throw EndOfBuffer(); MFX_INTERNAL_CPY(m_ptr, begin, (uint32_t)(end - begin)); m_bitOff = 0; m_ptr += end - begin; if (m_ptr < m_bufEnd) *m_ptr = 0; } void OutputBitstream::PutFillerBytes(mfxU8 filler, mfxU32 nbytes) { assert(m_bitOff == 0); if (m_ptr + nbytes > m_bufEnd) throw EndOfBuffer(); memset(m_ptr, filler, nbytes); m_ptr += nbytes; } void MfxHwH264Encode::PutSeiHeader( OutputBitstream & bs, mfxU32 payloadType, mfxU32 payloadSize) { while (payloadType >= 255) { bs.PutBits(0xff, 8); payloadType -= 255; } bs.PutBits(payloadType, 8); while (payloadSize >= 255) { bs.PutBits(0xff, 8); payloadSize -= 255; } bs.PutBits(payloadSize, 8); } void MfxHwH264Encode::PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiBufferingPeriod const & msg) { mfxU32 const dataSizeInBytes = CalculateSeiSize(msg); PutSeiHeader(bs, SEI_TYPE_BUFFERING_PERIOD, dataSizeInBytes); bs.PutUe(msg.seq_parameter_set_id); for (mfxU32 i = 0; i < msg.nal_cpb_cnt; i++) { bs.PutBits(msg.nal_initial_cpb_removal_delay[i], msg.initial_cpb_removal_delay_length); bs.PutBits(msg.nal_initial_cpb_removal_delay_offset[i], msg.initial_cpb_removal_delay_length); } for (mfxU32 i = 0; i < msg.vcl_cpb_cnt; i++) { bs.PutBits(msg.vcl_initial_cpb_removal_delay[i], msg.initial_cpb_removal_delay_length); bs.PutBits(msg.vcl_initial_cpb_removal_delay_offset[i], msg.initial_cpb_removal_delay_length); } if (bs.GetNumBits() & 7) { bs.PutBit(1); while (bs.GetNumBits() & 7) bs.PutBit(0); } } void MfxHwH264Encode::PutSeiMessage( OutputBitstream & bs, mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg) { mfxU32 const dataSizeInBytes = CalculateSeiSize(extPt, msg); PutSeiHeader(bs, SEI_TYPE_PIC_TIMING, dataSizeInBytes); if (msg.cpb_dpb_delays_present_flag) { bs.PutBits(msg.cpb_removal_delay, msg.cpb_removal_delay_length); bs.PutBits(msg.dpb_output_delay, msg.dpb_output_delay_length); } if (msg.pic_struct_present_flag) { assert(msg.pic_struct <= 8); mfxU32 numClockTS = NUM_CLOCK_TS[std::min(msg.pic_struct, 8)]; bs.PutBits(msg.pic_struct, 4); for (mfxU32 i = 0; i < numClockTS; i ++) { bs.PutBit(extPt.TimeStamp[i].ClockTimestampFlag); if (extPt.TimeStamp[i].ClockTimestampFlag) { mfxU32 ctType = (extPt.TimeStamp[i].CtType == 0xffff) ? msg.ct_type // based on picstruct : extPt.TimeStamp[i].CtType; // user-defined bs.PutBits(ctType, 2); bs.PutBit (extPt.TimeStamp[i].NuitFieldBasedFlag); bs.PutBits(extPt.TimeStamp[i].CountingType, 5); bs.PutBit (extPt.TimeStamp[i].FullTimestampFlag); bs.PutBit (extPt.TimeStamp[i].DiscontinuityFlag); bs.PutBit (extPt.TimeStamp[i].CntDroppedFlag); bs.PutBits(extPt.TimeStamp[i].NFrames, 8); if (extPt.TimeStamp[i].FullTimestampFlag) { bs.PutBits(extPt.TimeStamp[i].SecondsValue, 6); bs.PutBits(extPt.TimeStamp[i].MinutesValue, 6); bs.PutBits(extPt.TimeStamp[i].HoursValue, 5); } else { bs.PutBit(extPt.TimeStamp[i].SecondsFlag); if (extPt.TimeStamp[i].SecondsFlag) { bs.PutBits(extPt.TimeStamp[i].SecondsValue, 6); bs.PutBit(extPt.TimeStamp[i].MinutesFlag); if (extPt.TimeStamp[i].MinutesFlag) { bs.PutBits(extPt.TimeStamp[i].MinutesValue, 6); bs.PutBit(extPt.TimeStamp[i].HoursFlag); if (extPt.TimeStamp[i].HoursFlag) bs.PutBits(extPt.TimeStamp[i].HoursValue, 5); } } } bs.PutBits(extPt.TimeStamp[i].TimeOffset, msg.time_offset_length); } } } if (bs.GetNumBits() & 7) { bs.PutBit(1); while (bs.GetNumBits() & 7) bs.PutBit(0); } } void MfxHwH264Encode::PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiDecRefPicMrkRep const & msg) { mfxU32 const dataSizeInBytes = CalculateSeiSize(msg); PutSeiHeader(bs, SEI_TYPE_DEC_REF_PIC_MARKING_REPETITION, dataSizeInBytes); bs.PutBit(msg.original_idr_flag); bs.PutUe(msg.original_frame_num); if (msg.original_field_info_present_flag) { bs.PutBit(msg.original_field_pic_flag); if (msg.original_field_pic_flag) bs.PutBit(msg.original_bottom_field_flag); } // put dec_ref_pic_marking() syntax if (msg.original_idr_flag) { bs.PutBit(msg.no_output_of_prior_pics_flag); bs.PutBit(msg.long_term_reference_flag); } else { bs.PutBit(msg.adaptive_ref_pic_marking_mode_flag); for (mfxU32 i = 0; i < msg.num_mmco_entries; i ++) { bs.PutUe(msg.mmco[i]); bs.PutUe(msg.value[2 * i]); if (msg.mmco[i] == 3) bs.PutUe(msg.value[2 * i + 1]); } } if (bs.GetNumBits() & 7) { bs.PutBit(1); while (bs.GetNumBits() & 7) bs.PutBit(0); } } void MfxHwH264Encode::PutSeiMessage( OutputBitstream & bs, mfxExtAvcSeiRecPoint const & msg) { mfxU32 const dataSizeInBytes = CalculateSeiSize(msg); PutSeiHeader(bs, SEI_TYPE_RECOVERY_POINT, dataSizeInBytes); bs.PutUe(msg.recovery_frame_cnt); bs.PutBit(msg.exact_match_flag); bs.PutBit(msg.broken_link_flag); bs.PutBits(msg.changing_slice_group_idc, 2); if (bs.GetNumBits() & 7) { bs.PutBit(1); while (bs.GetNumBits() & 7) bs.PutBit(0); } } #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE namespace { mfxU32 PutScalableInfoSeiPayload( OutputBitstream & obs, MfxVideoParam const & par) { mfxU32 initialNumBits = obs.GetNumBits(); mfxExtSVCSeqDesc const * extSvc = GetExtBuffer(par); mfxU32 numLayers = par.calcParam.numLayersTotal; mfxU32 temporal_id_nesting_flag = 0; mfxU32 priority_layer_info_present_flag = 0; mfxU32 priority_id_setting_flag = 0; obs.PutBit(temporal_id_nesting_flag); obs.PutBit(priority_layer_info_present_flag); obs.PutBit(priority_id_setting_flag); obs.PutUe(numLayers - 1); mfxU32 layer = 0; for (mfxU32 d = 0; d < par.calcParam.numDependencyLayer; d++) { mfxU32 did = par.calcParam.did[d]; for (mfxU32 t = 0; t < extSvc->DependencyLayer[did].TemporalNum; t++) { mfxU32 tid = extSvc->DependencyLayer[did].TemporalId[t]; for (mfxU32 qid = 0; qid < extSvc->DependencyLayer[did].QualityNum; qid++, layer++) { mfxU8 priority_id = 0; mfxU8 discardable_flag = 0; mfxU8 sub_pic_layer_flag = 0; mfxU8 sub_region_layer_flag = 0; mfxU8 iroi_division_info_present_flag = 0; mfxU8 profile_level_info_present_flag = 0; mfxU8 bitrate_info_present_flag = 0; mfxU8 frm_rate_info_present_flag = 0; mfxU8 frm_size_info_present_flag = 0; mfxU8 layer_dependency_info_present_flag = 0; mfxU8 parameter_sets_info_present_flag = 0; mfxU8 bitstream_restriction_info_present_flag = 0; mfxU8 exact_inter_layer_pred_flag = 0; mfxU8 layer_conversion_flag = 0; mfxU8 layer_output_flag = 0; mfxU8 layer_dependency_info_src_layer_id_delta = 0; mfxU8 parameter_sets_info_src_layer_id_delta = 0; obs.PutUe(layer); obs.PutBits(priority_id, 6); obs.PutBit(discardable_flag); obs.PutBits(did, 3); obs.PutBits(qid, 4); obs.PutBits(tid, 3); obs.PutBit(sub_pic_layer_flag); obs.PutBit(sub_region_layer_flag); obs.PutBit(iroi_division_info_present_flag); obs.PutBit(profile_level_info_present_flag); obs.PutBit(bitrate_info_present_flag); obs.PutBit(frm_rate_info_present_flag); obs.PutBit(frm_size_info_present_flag); obs.PutBit(layer_dependency_info_present_flag); obs.PutBit(parameter_sets_info_present_flag); obs.PutBit(bitstream_restriction_info_present_flag); obs.PutBit(exact_inter_layer_pred_flag); obs.PutBit(layer_conversion_flag); obs.PutBit(layer_output_flag); if (layer_dependency_info_present_flag) ; else obs.PutUe(layer_dependency_info_src_layer_id_delta); if (parameter_sets_info_present_flag) ; else obs.PutUe(parameter_sets_info_src_layer_id_delta); } } } if (obs.GetNumBits() & 7) { obs.PutBit(1); while (obs.GetNumBits() & 7) obs.PutBit(0); } return obs.GetNumBits() - initialNumBits; } }; mfxU32 MfxHwH264Encode::PutScalableInfoSeiMessage( OutputBitstream & obs, MfxVideoParam const & par) { OutputBitstream tmp = obs; mfxU32 lengthInBytes = (PutScalableInfoSeiPayload(tmp, par) + 7) / 8; mfxU32 initialNumBits = obs.GetNumBits(); mfxU8 const header[5] = { 0, 0, 0, 1, NALU_SEI }; obs.PutRawBytes(header, header + sizeof(header)); PutSeiHeader(obs, SEI_TYPE_SCALABILITY_INFO, lengthInBytes); PutScalableInfoSeiPayload(obs, par); obs.PutTrailingBits(); return obs.GetNumBits() - initialNumBits; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_ENCODE // MVC BD { void MfxHwH264Encode::PutSeiMessage( OutputBitstream & bs, mfxU32 needBufferingPeriod, mfxU32 needPicTimingSei, mfxU32 fillerSize, MfxVideoParam const & video, mfxExtAvcSeiBufferingPeriod const & msg_bp, mfxExtPictureTimingSEI const & extPt, mfxExtAvcSeiPicTiming const & msg_pt) { if (needBufferingPeriod == 0 && needPicTimingSei == 0 && fillerSize == 0) return; mfxExtMVCSeqDesc & extMvc = GetExtBufferRef(video); mfxU32 dataSizeInBytes = 2; // hardcoded 2 bytes for MVC nested SEI syntax prior sei_messages (1 view in op) if (needBufferingPeriod) { dataSizeInBytes += 2; // hardcoded 2 bytes on BP sei_message() header dataSizeInBytes += CalculateSeiSize(msg_bp); // calculate size of BP SEI payload } if (needPicTimingSei) { dataSizeInBytes += 2; // hardcoded 2 bytes on PT sei_message() header dataSizeInBytes += CalculateSeiSize(extPt, msg_pt); // calculate size of PT SEI payload } if (fillerSize) { fillerSize -= fillerSize / 256; // compensate part of header dataSizeInBytes += 1; // last_payload_type_byte for filler payload dataSizeInBytes += (fillerSize + 254) / 255; // ff_bytes + last_payload_size_byte dataSizeInBytes += fillerSize; // filler payload } PutSeiHeader(bs, SEI_TYPE_MVC_SCALABLE_NESTING, dataSizeInBytes); bs.PutBit(1); // put operation_point_flag = 1 bs.PutUe(0); // put num_view_components_op_minus1 = 0 bs.PutBits(extMvc.View[1].ViewId, 10); // put sei_op_view_id[0] bs.PutBits(0, 3); // sei_op_temporal_id bs.PutBits(0, 1); // put sei_nesting_zero_bits if (needBufferingPeriod) PutSeiMessage(bs, msg_bp); if (needPicTimingSei) PutSeiMessage(bs, extPt, msg_pt); if (fillerSize) { // how many bytes takes to encode payloadSize depends on size of sei message // need to compensate it PutSeiHeader(bs, SEI_TYPE_FILLER_PAYLOAD, fillerSize); bs.PutFillerBytes(0xff, fillerSize); } } // MVC BD } MfxFrameAllocResponse::MfxFrameAllocResponse() : m_core(0) , m_numFrameActualReturnedByAllocFrames(0) { Zero((mfxFrameAllocResponse &)*this); } MfxFrameAllocResponse::~MfxFrameAllocResponse() { if (m_core) { if (MFX_HW_D3D11 == m_core->GetVAType() && m_responseQueue.size()) { for (size_t i = 0; i < m_responseQueue.size(); i++) m_core->FreeFrames(&m_responseQueue[i]); } else { if (mids) { NumFrameActual = m_numFrameActualReturnedByAllocFrames; m_core->FreeFrames(this); } for (size_t i = 0; i < m_sysmems.size(); i++) { if (m_sysmems[i]) { AlignedFree(m_sysmems[i]); m_sysmems[i] = 0; } } } } #ifdef MFX_ENABLE_EXT if (m_cmDevice) { for (size_t i = 0; i < m_mids.size(); i++) if (m_mids[i]) { m_cmDestroy(m_cmDevice, m_mids[i]); m_mids[i] = 0; } for (size_t i = 0; i < m_sysmems.size(); i++) { if (m_sysmems[i]) { CM_ALIGNED_FREE(m_sysmems[i]); m_sysmems[i] = 0; } } } #endif } #ifdef MFX_ENABLE_EXT void MfxFrameAllocResponse::DestroyBuffer(CmDevice * device, void * p) { device->DestroySurface((CmBuffer *&)p); } void MfxFrameAllocResponse::DestroySurface(CmDevice * device, void * p) { device->DestroySurface((CmSurface2D *&)p); } void MfxFrameAllocResponse::DestroySurface2DUP(CmDevice * device, void * p) { device->DestroySurface2DUP((CmSurface2DUP *&)p); } void MfxFrameAllocResponse::DestroyBufferUp(CmDevice * device, void * p) { device->DestroyBufferUP((CmBufferUP *&)p); } #endif mfxStatus MfxFrameAllocResponse::Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyRequired, bool isAllFramesRequired) { if (m_core #ifdef MFX_ENABLE_EXT || m_cmDevice #endif ) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; // no need in 2 different NumFrames if (MFX_HW_D3D11 == core->GetVAType()) { mfxFrameAllocRequest tmp = req; tmp.NumFrameMin = tmp.NumFrameSuggested = 1; m_responseQueue.resize(req.NumFrameMin); m_mids.resize(req.NumFrameMin); for (int i = 0; i < req.NumFrameMin; i++) { mfxStatus sts = core->AllocFrames(&tmp, &m_responseQueue[i],isCopyRequired); MFX_CHECK_STS(sts); m_mids[i] = m_responseQueue[i].mids[0]; } mids = &m_mids[0]; NumFrameActual = req.NumFrameMin; } else { mfxStatus sts = core->AllocFrames(&req, this,isCopyRequired); MFX_CHECK_STS(sts); } if (NumFrameActual < req.NumFrameMin) MFX_RETURN(MFX_ERR_MEMORY_ALLOC); m_locked.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); m_core = core; #ifdef MFX_ENABLE_EXT m_cmDevice = 0; m_cmDestroy = 0; #endif m_numFrameActualReturnedByAllocFrames = NumFrameActual; if (!isAllFramesRequired) NumFrameActual = req.NumFrameMin; // no need in redundant frames return MFX_ERR_NONE; } #ifdef MFX_ENABLE_EXT mfxStatus MfxFrameAllocResponse::AllocCmBuffers( CmDevice * device, mfxFrameAllocRequest & req) { if (m_core || m_cmDevice) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; mfxU32 size = req.Info.Width * req.Info.Height; m_mids.resize(req.NumFrameMin, 0); m_locked.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); for (int i = 0; i < req.NumFrameMin; i++) m_mids[i] = CreateBuffer(device, size); NumFrameActual = req.NumFrameMin; mids = &m_mids[0]; m_core = 0; m_cmDevice = device; m_cmDestroy = &DestroyBuffer; return MFX_ERR_NONE; } mfxStatus MfxFrameAllocResponse::AllocCmSurfaces( CmDevice * device, mfxFrameAllocRequest & req) { if (m_core || m_cmDevice) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; m_mids.resize(req.NumFrameMin, 0); m_locked.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); for (int i = 0; i < req.NumFrameMin; i++) m_mids[i] = CreateSurface(device, req.Info.Width, req.Info.Height, req.Info.FourCC); NumFrameActual = req.NumFrameMin; mids = &m_mids[0]; m_core = 0; m_cmDevice = device; m_cmDestroy = &DestroySurface; return MFX_ERR_NONE; } mfxStatus MfxFrameAllocResponse::AllocCmSurfacesUP( CmDevice * device, mfxFrameAllocRequest & req) { if (m_core || m_cmDevice) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; mfxU32 size = req.Info.Width * req.Info.Height; m_mids.resize(req.NumFrameMin, 0); m_locked.resize(req.NumFrameMin, 0); m_sysmems.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); for (int i = 0; i < req.NumFrameMin; i++) { m_sysmems[i] = AlignedMalloc(size, 0x1000); m_mids[i] = CreateSurface(device, m_sysmems[i], req.Info.Width, req.Info.Height, req.Info.FourCC); } NumFrameActual = req.NumFrameMin; mids = &m_mids[0]; m_core = 0; m_cmDevice = device; m_cmDestroy = &DestroySurface2DUP; return MFX_ERR_NONE; } #endif mfxStatus MfxFrameAllocResponse::AllocFrames( VideoCORE * core, mfxFrameAllocRequest & req) { if (m_core #ifdef MFX_ENABLE_EXT || m_cmDevice #endif ) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; mfxU32 size = req.Info.Width * req.Info.Height; m_locked.resize(req.NumFrameMin, 0); m_sysmems.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); for (int i = 0; i < req.NumFrameMin; i++) { m_sysmems[i] = AlignedMalloc(size, 0x1000); } NumFrameActual = req.NumFrameMin; m_core = core; #ifdef MFX_ENABLE_EXT m_cmDestroy = 0; #endif return MFX_ERR_NONE; } mfxStatus MfxFrameAllocResponse::UpdateResourcePointers(mfxU32 idxScd, void * memY, void * gpuSurf) { if (m_mids.size() < idxScd || m_sysmems.size() < idxScd) return MFX_ERR_NOT_ENOUGH_BUFFER; m_mids[idxScd] = gpuSurf; m_sysmems[idxScd] = memY; return MFX_ERR_NONE; } #ifdef MFX_ENABLE_EXT mfxStatus MfxFrameAllocResponse::AllocCmBuffersUp( CmDevice * device, mfxFrameAllocRequest & req) { if (m_core || m_cmDevice) return Error(MFX_ERR_MEMORY_ALLOC); req.NumFrameSuggested = req.NumFrameMin; mfxU32 size = req.Info.Width * req.Info.Height; m_mids.resize(req.NumFrameMin, 0); m_locked.resize(req.NumFrameMin, 0); m_sysmems.resize(req.NumFrameMin, 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); for (int i = 0; i < req.NumFrameMin; i++) { m_sysmems[i] = AlignedMalloc(size, 0x1000); m_mids[i] = CreateBuffer(device, size, m_sysmems[i]); } NumFrameActual = req.NumFrameMin; mids = &m_mids[0]; m_core = 0; m_cmDevice = device; m_cmDestroy = &DestroyBufferUp; return MFX_ERR_NONE; } #endif mfxU32 MfxFrameAllocResponse::Lock(mfxU32 idx) { if (idx >= m_locked.size()) return 0; assert(m_locked[idx] < 0xffffffff); return ++m_locked[idx]; } void MfxFrameAllocResponse::ClearFlag(mfxU32 idx) { assert(idx < m_flag.size()); if (idx < m_flag.size()) { m_flag[idx] = 0; } } void MfxFrameAllocResponse::SetFlag(mfxU32 idx, mfxU32 flag) { assert(idx < m_flag.size()); if (idx < m_flag.size()) { m_flag[idx] |= flag; } } mfxU32 MfxFrameAllocResponse::GetFlag(mfxU32 idx) const { assert(idx < m_flag.size()); if (idx < m_flag.size()) { return m_flag[idx]; } return 0; } void MfxFrameAllocResponse::Unlock() { std::fill(m_locked.begin(), m_locked.end(), 0); } mfxU32 MfxFrameAllocResponse::Unlock(mfxU32 idx) { if (idx >= m_locked.size()) return mfxU32(-1); assert(m_locked[idx] > 0); return --m_locked[idx]; } mfxU32 MfxFrameAllocResponse::Locked(mfxU32 idx) const { return (idx < m_locked.size()) ? m_locked[idx] : 1; } void * MfxFrameAllocResponse::GetSysmemBuffer(mfxU32 idx) { return (idx < m_sysmems.size()) ? m_sysmems[idx] : 0; } mfxU32 MfxHwH264Encode::FindFreeResourceIndex( MfxFrameAllocResponse const & pool, mfxU32 startingFrom) { for (mfxU32 i = startingFrom; i < pool.NumFrameActual; i++) if (pool.Locked(i) == 0) return i; return NO_INDEX; } mfxMemId MfxHwH264Encode::AcquireResource( MfxFrameAllocResponse & pool, mfxU32 index) { if (index > pool.NumFrameActual) return MID_INVALID; pool.Lock(index); pool.ClearFlag(index); return pool.mids[index]; } mfxMemId MfxHwH264Encode::AcquireResource( MfxFrameAllocResponse & pool) { return AcquireResource(pool, FindFreeResourceIndex(pool)); } mfxHDLPair MfxHwH264Encode::AcquireResourceUp( MfxFrameAllocResponse & pool, mfxU32 index) { mfxHDLPair p = { 0, 0 }; if (index > pool.NumFrameActual) return p; pool.Lock(index); pool.ClearFlag(index); p.first = pool.mids[index]; p.second = pool.GetSysmemBuffer(index); return p; } mfxHDLPair MfxHwH264Encode::AcquireResourceUp( MfxFrameAllocResponse & pool) { return AcquireResourceUp(pool, FindFreeResourceIndex(pool)); } void MfxHwH264Encode::ReleaseResource( MfxFrameAllocResponse & pool, mfxMemId mid) { for (mfxU32 i = 0; i < pool.NumFrameActual; i++) { if (pool.mids[i] == mid) { pool.Unlock(i); break; } } } mfxStatus MfxHwH264Encode::CheckEncodeFrameParam( MfxVideoParam const & video, mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, bool isExternalFrameAllocator, MFX_ENCODE_CAPS const & caps) { mfxStatus checkSts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(bs); if(IsOn(video.mfx.LowPower) && ctrl){ //LowPower can't encode low QPs if(ctrl->QP != 0 && ctrl->QP < 10 ){ ctrl->QP = 10; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } if (video.Protected == 0) { mfxU32 bufferSizeInKB = 0; if (video.calcParam.cqpHrdMode) bufferSizeInKB = video.calcParam.decorativeHrdParam.bufferSizeInKB; else if (IsMvcProfile(video.mfx.CodecProfile)) bufferSizeInKB = video.calcParam.mvcPerViewPar.bufferSizeInKB; else bufferSizeInKB = video.calcParam.bufferSizeInKB; MFX_CHECK(bs->DataOffset <= bs->MaxLength, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(bs->DataOffset + bs->DataLength + bufferSizeInKB * 1000u <= bs->MaxLength, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK_NULL_PTR1(bs->Data); } if (video.mfx.EncodedOrder == 1) { MFX_CHECK(surface != 0, MFX_ERR_MORE_DATA); MFX_CHECK_NULL_PTR1(ctrl); mfxU16 firstFieldType = ctrl->FrameType & 0x07; mfxU16 secondFieldType = (ctrl->FrameType >> 8) & 0x07; // check frame type MFX_CHECK( firstFieldType == MFX_FRAMETYPE_I || firstFieldType == MFX_FRAMETYPE_P || firstFieldType == MFX_FRAMETYPE_B, MFX_ERR_INVALID_VIDEO_PARAM); if (secondFieldType) { MFX_CHECK( firstFieldType == MFX_FRAMETYPE_I || firstFieldType == MFX_FRAMETYPE_P || firstFieldType == MFX_FRAMETYPE_B, MFX_ERR_INVALID_VIDEO_PARAM); // check compatibility of fields types MFX_CHECK( firstFieldType == secondFieldType || (firstFieldType == MFX_FRAMETYPE_I && secondFieldType == MFX_FRAMETYPE_P) || (firstFieldType == MFX_FRAMETYPE_P && secondFieldType == MFX_FRAMETYPE_I), MFX_ERR_INVALID_VIDEO_PARAM); } } else if (video.mfx.EncodedOrder != 1) { if (ctrl != 0 && ctrl->FrameType) { // check FrameType for forced key-frame generation mfxU16 type = ctrl->FrameType & (MFX_FRAMETYPE_IPB | MFX_FRAMETYPE_xIPB); MFX_CHECK( type == (MFX_FRAMETYPE_I) || type == (MFX_FRAMETYPE_I | MFX_FRAMETYPE_xI) || type == (MFX_FRAMETYPE_I | MFX_FRAMETYPE_xP) || ((type == (MFX_FRAMETYPE_P | MFX_FRAMETYPE_xI))), MFX_ERR_INVALID_VIDEO_PARAM); } } if (ctrl) { mfxExtCodingOption3* pCO3 = GetExtBuffer(*ctrl); if (pCO3) { #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (pCO3->AdaptiveCQM != MFX_CODINGOPTION_UNKNOWN) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; #endif } } if (surface != 0) { // Check Runtime extension buffers if not buffered frames processing if (ctrl != 0 && ctrl->NumExtParam) { checkSts = CheckRunTimeExtBuffers(video, ctrl, surface, bs, caps); if (checkSts < MFX_ERR_NONE) { return checkSts; } } MFX_CHECK((surface->Data.Y == 0) == (surface->Data.UV == 0), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(surface->Data.Pitch < 0x8000, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(surface->Data.Y != 0 || isExternalFrameAllocator, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(surface->Info.Width >= video.mfx.FrameInfo.Width, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface->Info.Height >= video.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); mfxStatus sts = CheckRunTimePicStruct(surface->Info.PicStruct, video.mfx.FrameInfo.PicStruct); if (sts < MFX_ERR_NONE) return sts; else if (sts > MFX_ERR_NONE) checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (video.calcParam.cqpHrdMode) { MFX_CHECK_NULL_PTR1(ctrl); MFX_CHECK(ctrl->QP > 0 && ctrl->QP <= 51, MFX_ERR_INVALID_VIDEO_PARAM); } } if (ctrl != 0 && ctrl->NumPayload > 0) { MFX_CHECK_NULL_PTR1(ctrl->Payload); mfxStatus sts = CheckPayloads(ctrl->Payload, ctrl->NumPayload); MFX_CHECK_STS(sts); } return checkSts; } mfxStatus MfxHwH264Encode::CheckBeforeCopy(mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src) { if (dst.NumViewAlloc < src.NumView || dst.NumViewIdAlloc < src.NumViewId || dst.NumOPAlloc < src.NumOP) { dst.NumView = src.NumView; dst.NumViewId = src.NumViewId; dst.NumOP = src.NumOP; return MFX_ERR_NOT_ENOUGH_BUFFER; } if (dst.View == 0 || dst.ViewId == 0 || dst.OP == 0) { return MFX_ERR_NULL_PTR; } return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::CheckBeforeCopyQueryLike(mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src) { if ((dst.View && dst.NumViewAlloc < src.NumView) || (dst.ViewId && dst.NumViewIdAlloc < src.NumViewId) || (dst.OP && dst.NumOPAlloc < src.NumOP)) { dst.NumView = src.NumView; dst.NumViewId = src.NumViewId; dst.NumOP = src.NumOP; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } void MfxHwH264Encode::Copy(mfxExtMVCSeqDesc & dst, mfxExtMVCSeqDesc const & src) { if (dst.View) { dst.NumView = src.NumView; std::copy(src.View, src.View + src.NumView, dst.View); } if (dst.ViewId) { dst.NumViewId = src.NumViewId; std::copy(src.ViewId, src.ViewId + src.NumViewId, dst.ViewId); } if (dst.OP) { dst.NumOP = src.NumOP; for (mfxU32 i = 0; i < dst.NumOP; i++) { dst.OP[i].TemporalId = src.OP[i].TemporalId; dst.OP[i].LevelIdc = src.OP[i].LevelIdc; dst.OP[i].NumViews = src.OP[i].NumViews; dst.OP[i].NumTargetViews = src.OP[i].NumTargetViews; dst.OP[i].TargetViewId = &dst.ViewId[src.OP[i].TargetViewId - src.ViewId]; } } dst.NumRefsTotal = src.NumRefsTotal; } void MfxHwH264Encode::FastCopyBufferVid2Sys(void * dstSys, void const * srcVid, mfxI32 bytes) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Surface copy (bitstream)"); assert(dstSys != 0); assert(srcVid != 0); mfxSize roi = { bytes, 1 }; mfxStatus sts = FastCopy::Copy((uint8_t *)dstSys, bytes, (uint8_t *)srcVid, bytes, roi, COPY_VIDEO_TO_SYS); assert(sts == MFX_ERR_NONE); (void)sts; } void MfxHwH264Encode::FastCopyBufferSys2Vid(void * dstVid, void const * srcSys, mfxI32 bytes) { assert(dstVid != 0); assert(srcSys != 0); mfxSize roi = { bytes, 1 }; #if defined(IPP_NONTEMPORAL_STORE) int sts = ippiCopyManaged_8u_C1R((uint8_t *)srcSys, bytes, (uint8_t *)dstVid, bytes, roi, IPP_NONTEMPORAL_STORE); assert(sts == ippStsNoErr); (void)sts; #else mfxStatus sts = FastCopy::Copy((uint8_t *)dstVid, bytes, (uint8_t *)srcSys, bytes, roi, COPY_SYS_TO_VIDEO); assert(sts == MFX_ERR_NONE); (void)sts; #endif } void CyclicTaskPool::Init(mfxU32 size) { m_pool.resize(size); m_next = m_pool.begin(); } DdiTask2ndField * CyclicTaskPool::GetFreeTask() { if (m_pool.empty()) return 0; if (m_next == m_pool.end()) m_next = m_pool.begin(); return &*(m_next++); } mfxU8 const * MfxHwH264Encode::SkipStartCode(mfxU8 const * begin, mfxU8 const * end) { mfxU32 threeBytePrefix = (end - begin < 3) ? 0xffffffff : (begin[0] << 16) | (begin[1] << 8) | (begin[2]); if (threeBytePrefix == 1) return begin + 3; else if (threeBytePrefix == 0 && end - begin > 3 && begin[3] == 1) return begin + 4; else return begin; } mfxU8 * MfxHwH264Encode::SkipStartCode(mfxU8 * begin, mfxU8 * end) { return const_cast(SkipStartCode(const_cast(begin), const_cast(end))); } ArrayRefListMod MfxHwH264Encode::CreateRefListMod( ArrayDpbFrame const & dpb, std::vector const & recons, ArrayU8x33 initList, ArrayU8x33 const & modList, mfxU32 curViewIdx, mfxI32 curPicNum, bool optimize) { assert(initList.Size() == modList.Size()); ArrayRefListMod refListMod; mfxI32 picNumPred = curPicNum; mfxI32 picViewIdxPred = -1; for (mfxU32 refIdx = 0; refIdx < modList.Size(); refIdx++) { if (optimize && initList == modList) return refListMod; if (dpb[modList[refIdx] & 0x7f].m_viewIdx != curViewIdx) { // inter-view reference reordering mfxI32 viewIdx = dpb[modList[refIdx] & 0x7f].m_viewIdx; if (viewIdx > picViewIdxPred) { refListMod.PushBack(RefListMod(RPLM_INTERVIEW_ADD, mfxU16(viewIdx - picViewIdxPred - 1))); } else if (viewIdx < picViewIdxPred) { refListMod.PushBack(RefListMod(RPLM_INTERVIEW_SUB, mfxU16(picViewIdxPred - viewIdx - 1))); } else { assert(!"can't reorder ref list"); break; } for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (dpb[initList[cIdx] & 0x7f].m_viewIdx != mfxU32(viewIdx)) initList[nIdx++] = initList[cIdx]; picViewIdxPred = viewIdx; } else if (dpb[modList[refIdx] & 0x7f].m_longterm) { // long term reference reordering mfxU8 longTermPicNum = GetLongTermPicNum(recons, dpb, modList[refIdx]); refListMod.PushBack(RefListMod(RPLM_LT_PICNUM, longTermPicNum)); for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (GetLongTermPicNumF(recons, dpb, initList[cIdx]) != longTermPicNum || dpb[initList[cIdx] & 0x7f].m_viewIdx != curViewIdx) initList[nIdx++] = initList[cIdx]; } else { // short term reference reordering mfxI32 picNum = GetPicNum(recons, dpb, modList[refIdx]); if (picNum > picNumPred) { mfxU16 absDiffPicNum = mfxU16(picNum - picNumPred); refListMod.PushBack(RefListMod(RPLM_ST_PICNUM_ADD, absDiffPicNum - 1)); } else if (picNum < picNumPred) { mfxU16 absDiffPicNum = mfxU16(picNumPred - picNum); refListMod.PushBack(RefListMod(RPLM_ST_PICNUM_SUB, absDiffPicNum - 1)); } else { assert(!"can't reorder ref list"); break; } for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (GetPicNumF(recons, dpb, initList[cIdx]) != picNum || dpb[initList[cIdx] & 0x7f].m_viewIdx != curViewIdx) initList[nIdx++] = initList[cIdx]; picNumPred = picNum; } } return refListMod; } mfxU8 * MfxHwH264Encode::CheckedMFX_INTERNAL_CPY( mfxU8 * dbegin, mfxU8 * dend, mfxU8 const * sbegin, mfxU8 const * send) { if (dend - dbegin < send - sbegin) { assert(0); throw EndOfBuffer(); } MFX_INTERNAL_CPY(dbegin, sbegin, (uint32_t)(send - sbegin)); return dbegin + (send - sbegin); } mfxU8 * MfxHwH264Encode::CheckedMemset( mfxU8 * dbegin, mfxU8 * dend, mfxU8 value, mfxU32 size) { if (dbegin + size > dend) { assert(0); throw EndOfBuffer(); } memset(dbegin, value, size); return dbegin + size; } void MfxHwH264Encode::ReadRefPicListModification( InputBitstream & reader) { if (reader.GetBit()) // ref_pic_list_modification_flag_l0 { for (;;) { mfxU32 tmp = reader.GetUe(); // modification_of_pic_nums_idc if (tmp == RPLM_END) break; if (tmp > RPLM_INTERVIEW_ADD) { assert(!"bad bitstream"); throw std::logic_error(": bad bitstream"); } reader.GetUe(); // abs_diff_pic_num_minus1 or // long_term_pic_num or // abs_diff_view_idx_minus1 } } } void MfxHwH264Encode::ReadDecRefPicMarking( InputBitstream & reader, bool idrPicFlag) { if (idrPicFlag) { reader.GetBit(); // no_output_of_prior_pics_flag reader.GetBit(); // long_term_reference_flag } else { mfxU32 tmp = reader.GetBit(); // adaptive_ref_pic_marking_mode_flag assert(tmp == 0 && "adaptive_ref_pic_marking_mode_flag should be 0"); (void)tmp; } } void WriteRefPicListModification( OutputBitstream & writer, ArrayRefListMod const & refListMod) { writer.PutBit(refListMod.Size() > 0); // ref_pic_list_modification_flag_l0 if (refListMod.Size() > 0) { for (mfxU32 i = 0; i < refListMod.Size(); i++) { writer.PutUe(refListMod[i].m_idc); // modification_of_pic_nums_idc writer.PutUe(refListMod[i].m_diff); // abs_diff_pic_num_minus1 or // long_term_pic_num or // abs_diff_view_idx_minus1 } writer.PutUe(RPLM_END); } } void MfxHwH264Encode::WriteDecRefPicMarking( OutputBitstream & writer, DecRefPicMarkingInfo const & marking, bool idrPicFlag) { if (idrPicFlag) { writer.PutBit(marking.no_output_of_prior_pics_flag); // no_output_of_prior_pics_flag writer.PutBit(marking.long_term_reference_flag); // long_term_reference_flag } else { writer.PutBit(marking.mmco.Size() > 0); // adaptive_ref_pic_marking_mode_flag if (marking.mmco.Size()) { for (mfxU32 i = 0; i < marking.mmco.Size(); i++) { writer.PutUe(marking.mmco[i]); // memory_management_control_operation writer.PutUe(marking.value[2 * i]); // difference_of_pic_nums_minus1 or // long_term_pic_num or // long_term_frame_idx or // max_long_term_frame_idx_plus1 if (marking.mmco[i] == MMCO_ST_TO_LT) writer.PutUe(marking.value[2 * i + 1]); // long_term_frame_idx } writer.PutUe(MMCO_END); } } } mfxU8 * MfxHwH264Encode::RePackSlice( mfxU8 * dbegin, mfxU8 * dend, mfxU8 * sbegin, mfxU8 * send, MfxVideoParam const & par, DdiTask const & task, mfxU32 fieldId) { mfxExtSpsHeader & extSps = GetExtBufferRef(par); mfxExtPpsHeader & extPps = GetExtBufferRef(par); mfxU32 num_ref_idx_l0_active_minus1 = 0; mfxU32 num_ref_idx_l1_active_minus1 = 0; mfxU32 sliceType = 0; mfxU32 fieldPicFlag = 0; mfxU32 tmp = 0; if (extPps.entropyCodingModeFlag == 0) { // remove start code emulation prevention bytes when doing full repack for CAVLC mfxU32 zeroCount = 0; mfxU8 * write = sbegin; for (mfxU8 * read = write; read != send; ++read) { if (*read == 0x03 && zeroCount >= 2 && read + 1 != send && (*(read + 1) & 0xfc) == 0) { // skip start code emulation prevention byte zeroCount = 0; // drop zero count } else { *(write++) = *read; zeroCount = (*read == 0) ? zeroCount + 1 : 0; } } } InputBitstream reader(sbegin, send, true, extPps.entropyCodingModeFlag == 1); OutputBitstream writer(dbegin, dend); writer.PutUe(reader.GetUe()); // first_mb_in_slice writer.PutUe(sliceType = reader.GetUe()); // slice_type writer.PutUe(reader.GetUe()); // pic_parameter_set_id mfxU32 log2MaxFrameNum = extSps.log2MaxFrameNumMinus4 + 4; writer.PutBits(reader.GetBits(log2MaxFrameNum), log2MaxFrameNum); if (!extSps.frameMbsOnlyFlag) { writer.PutBit(fieldPicFlag = reader.GetBit()); // field_pic_flag if (fieldPicFlag) writer.PutBit(reader.GetBit()); // bottom_field_flag } if (task.m_type[fieldId] & MFX_FRAMETYPE_IDR) writer.PutUe(reader.GetUe()); // idr_pic_id if (extSps.picOrderCntType == 0) { mfxU32 log2MaxPicOrderCntLsb = extSps.log2MaxPicOrderCntLsbMinus4 + 4; writer.PutBits(reader.GetBits(log2MaxPicOrderCntLsb), log2MaxPicOrderCntLsb); } if (sliceType % 5 == 1) writer.PutBit(reader.GetBit()); // direct_spatial_mv_pred_flag if (sliceType % 5 == 0 || sliceType % 5 == 1) { writer.PutBit(tmp = reader.GetBit()); // num_ref_idx_active_override_flag if (tmp) { num_ref_idx_l0_active_minus1 = reader.GetUe(); writer.PutUe(num_ref_idx_l0_active_minus1); // num_ref_idx_l0_active_minus1 if (sliceType % 5 == 1) { num_ref_idx_l1_active_minus1 = reader.GetUe(); writer.PutUe(num_ref_idx_l1_active_minus1); // num_ref_idx_l1_active_minus1 } } else { num_ref_idx_l0_active_minus1 = extPps.numRefIdxL0DefaultActiveMinus1; num_ref_idx_l1_active_minus1 = extPps.numRefIdxL1DefaultActiveMinus1; } } if (sliceType % 5 != 2 && sliceType % 5 != 4) { ReadRefPicListModification(reader); // align size of ref pic list modification with num_ref_idx_l0_active_minus1 which is written to bitstream if (task.m_refPicList0Mod[fieldId].Size() > num_ref_idx_l0_active_minus1 + 1) { ArrayRefListMod refPicListMod = task.m_refPicList0Mod[fieldId]; refPicListMod.Resize(num_ref_idx_l0_active_minus1 + 1); WriteRefPicListModification(writer, refPicListMod); } else WriteRefPicListModification(writer, task.m_refPicList0Mod[fieldId]); } if (sliceType % 5 == 1) { ReadRefPicListModification(reader); if (task.m_refPicList1Mod[fieldId].Size() > num_ref_idx_l1_active_minus1 + 1) { ArrayRefListMod refPicListMod = task.m_refPicList1Mod[fieldId]; refPicListMod.Resize(num_ref_idx_l1_active_minus1 + 1); WriteRefPicListModification(writer, refPicListMod); } else WriteRefPicListModification(writer, task.m_refPicList1Mod[fieldId]); } if (task.m_type[fieldId] & MFX_FRAMETYPE_REF) { bool idrPicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_IDR) != 0; ReadDecRefPicMarking(reader, idrPicFlag); WriteDecRefPicMarking(writer, task.m_decRefPicMrk[fieldId], idrPicFlag); } if (extPps.entropyCodingModeFlag && (sliceType % 5 != 2)) writer.PutUe(reader.GetUe()); // cabac_init_idc writer.PutSe(reader.GetSe()); // slice_qp_delta if (1/*deblocking_filter_control_present_flag*/) { writer.PutUe(tmp = reader.GetUe()); // disable_deblocking_filter_idc if (tmp != 1) { writer.PutSe(reader.GetSe()); // slice_alpha_c0_offset_div2 writer.PutSe(reader.GetSe()); // slice_beta_offset_div2 } } if (extPps.entropyCodingModeFlag) { while (reader.NumBitsRead() % 8) reader.GetBit(); // cabac_alignment_one_bit mfxU32 numAlignmentBits = (8 - (writer.GetNumBits() & 0x7)) & 0x7; writer.PutBits(0xff, numAlignmentBits); sbegin += reader.NumBitsRead() / 8; dbegin += writer.GetNumBits() / 8; MFX_INTERNAL_CPY(dbegin, sbegin, (uint32_t)(send - sbegin)); dbegin += send - sbegin; } else { mfxU32 bitsLeft = reader.NumBitsLeft(); for (; bitsLeft > 31; bitsLeft -= 32) writer.PutBits(reader.GetBits(32), 32); writer.PutBits(reader.GetBits(bitsLeft), bitsLeft); writer.PutBits(0, (8 - (writer.GetNumBits() & 7)) & 7); // trailing zeroes assert((reader.NumBitsRead() & 7) == 0); assert((writer.GetNumBits() & 7) == 0); sbegin += (reader.NumBitsRead() + 7) / 8; dbegin += (writer.GetNumBits() + 7) / 8; } return dbegin; } namespace { mfxExtPictureTimingSEI const * SelectPicTimingSei( MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId) { if (mfxExtPictureTimingSEI const * extPt = reinterpret_cast(mfx::GetExtBuffer(task.m_ctrl.ExtParam, task.m_ctrl.NumExtParam, MFX_EXTBUFF_PICTURE_TIMING_SEI, fieldId))) { return extPt; } else { mfxExtPictureTimingSEI const * extPtGlobal = GetExtBuffer(video); return extPtGlobal; } } }; void MfxHwH264Encode::PrepareSeiMessageBuffer( MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, PreAllocatedVector & sei, mfxU16 recovery_frame_cnt) { mfxExtCodingOption const & extOpt = GetExtBufferRef(video); mfxExtSpsHeader const & extSps = GetExtBufferRef(video); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxExtPictureTimingSEI const * extPt = SelectPicTimingSei(video, task, fieldId); mfxU32 fillerSize = task.m_fillerSize[fieldId]; mfxU32 fieldPicFlag = (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE); mfxU32 secondFieldPicFlag = (task.GetFirstField() != fieldId); mfxU32 idrPicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_IDR); mfxU32 isIPicture = (task.m_type[fieldId] & MFX_FRAMETYPE_I); mfxU32 recoveryPoint = IsRecoveryPointSeiMessagePresent( task.m_ctrl.Payload, task.m_ctrl.NumPayload, GetPayloadLayout(fieldPicFlag, secondFieldPicFlag)); mfxU32 needRecoveryPointSei = (extOpt.RecoveryPointSEI == MFX_CODINGOPTION_ON && ((extOpt2.IntRefType && task.m_IRState.firstFrameInCycle && task.m_IRState.IntraLocation == 0) || (extOpt2.IntRefType == 0 && isIPicture && !idrPicFlag))); mfxU32 needCpbRemovalDelay = idrPicFlag || recoveryPoint || needRecoveryPointSei || (isIPicture && extOpt2.BufferingPeriodSEI == MFX_BPSEI_IFRAME); mfxU32 needMarkingRepetitionSei = IsOn(extOpt.RefPicMarkRep) && task.m_decRefPicMrkRep[fieldId].presentFlag; mfxU32 needBufferingPeriod = (IsOn(extOpt.VuiNalHrdParameters) && needCpbRemovalDelay) || (IsOn(extOpt.VuiVclHrdParameters) && needCpbRemovalDelay) || (IsOn(extOpt.PicTimingSEI) && (idrPicFlag || (isIPicture && extOpt2.BufferingPeriodSEI == MFX_BPSEI_IFRAME))); // to activate sps mfxU32 needPicTimingSei = IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters) || IsOn(extOpt.PicTimingSEI); if (video.calcParam.cqpHrdMode) needBufferingPeriod = needPicTimingSei = 0; // in CQP HRD mode application inserts BP and PT SEI itself mfxU32 needAtLeastOneSei = (task.m_ctrl.NumPayload > secondFieldPicFlag && task.m_ctrl.Payload != nullptr && task.m_ctrl.Payload[secondFieldPicFlag] != 0) || (fillerSize > 0) || needBufferingPeriod || needPicTimingSei || needMarkingRepetitionSei; OutputBitstream writer(sei.Buffer(), sei.Capacity()); mfxU8 const SEI_STARTCODE[5] = { 0, 0, 0, 1, 6 }; if (needAtLeastOneSei && IsOn(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); mfxExtAvcSeiBufferingPeriod msgBufferingPeriod = {}; { mfxExtAvcSeiPicTiming msgPicTiming; mfxU32 sps_id = extSps.seqParameterSetId; sps_id = ((sps_id + !!task.m_viewIdx) & 0x1f); // use appropriate sps id for dependent views if (needBufferingPeriod) { PrepareSeiMessage( task, IsOn(extOpt.VuiNalHrdParameters), IsOn(extOpt.VuiVclHrdParameters), sps_id, msgBufferingPeriod); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, msgBufferingPeriod); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (needPicTimingSei) { PrepareSeiMessage( task, fieldId, IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters), extSps.vui.flags.picStructPresent, msgPicTiming); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); assert(extPt); if (!extPt) return; PutSeiMessage(writer, *extPt, msgPicTiming); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } } // user-defined messages if (task.m_ctrl.Payload != nullptr) { for (mfxU32 i = secondFieldPicFlag; i < task.m_ctrl.NumPayload; i = i + 1 + fieldPicFlag) { if (task.m_ctrl.Payload[i] != nullptr) { if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); for (mfxU32 b = 0; b < task.m_ctrl.Payload[i]->NumBit / 8; b++) writer.PutBits(task.m_ctrl.Payload[i]->Data[b], 8); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } } } if (needMarkingRepetitionSei) { mfxU8 frameMbsOnlyFlag = (video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 0; mfxExtAvcSeiDecRefPicMrkRep decRefPicMrkRep; PrepareSeiMessage(task, fieldId, frameMbsOnlyFlag, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (needRecoveryPointSei) { mfxExtAvcSeiRecPoint msgPicTiming; PrepareSeiMessage(video, msgPicTiming, recovery_frame_cnt); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, msgPicTiming); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (fillerSize > 0) { // how many bytes takes to encode payloadSize depends on size of sei message // need to compensate it fillerSize -= fillerSize / 256; if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiHeader(writer, SEI_TYPE_FILLER_PAYLOAD, fillerSize); writer.PutFillerBytes(0xff, fillerSize); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (needAtLeastOneSei && IsOn(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); // add repack compensation to the end of last sei NALu. // It's padding done with trailing_zero_8bits. This padding could has greater size then real repack overhead. if (task.m_addRepackSize[fieldId] && needAtLeastOneSei) writer.PutFillerBytes(0xff, task.m_addRepackSize[fieldId]); sei.SetSize(writer.GetNumBits() / 8); } // MVC BD { void MfxHwH264Encode::PrepareSeiMessageBufferDepView( MfxVideoParam const & video, #ifdef MFX_ENABLE_AVC_BS DdiTask & task, #else // MFX_ENABLE_AVC_BS DdiTask const & task, #endif // MFX_ENABLE_AVC_BS mfxU32 fieldId, PreAllocatedVector & sei) { mfxExtCodingOption const & extOpt = GetExtBufferRef(video); mfxExtSpsHeader const & extSps = GetExtBufferRef(video); mfxExtPictureTimingSEI const * extPt = SelectPicTimingSei(video, task, fieldId); mfxU32 fillerSize = task.m_fillerSize[fieldId]; mfxU32 fieldPicFlag = (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE); mfxU32 secondFieldPicFlag = (task.GetFirstField() != fieldId); mfxU32 idrPicFlag = (task.m_type[fieldId] & MFX_FRAMETYPE_IDR); mfxU32 recoveryPoint = IsRecoveryPointSeiMessagePresent( task.m_ctrl.Payload, task.m_ctrl.NumPayload, GetPayloadLayout(fieldPicFlag, secondFieldPicFlag)); mfxU32 needCpbRemovalDelay = idrPicFlag || recoveryPoint; mfxU32 needMarkingRepetitionSei = IsOn(extOpt.RefPicMarkRep) && task.m_decRefPicMrkRep[fieldId].presentFlag; mfxU32 needBufferingPeriod = (IsOn(extOpt.VuiNalHrdParameters) && needCpbRemovalDelay) || (IsOn(extOpt.VuiVclHrdParameters) && needCpbRemovalDelay) || (IsOn(extOpt.PicTimingSEI) && idrPicFlag); // to activate sps mfxU32 needPicTimingSei = IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters) || IsOn(extOpt.PicTimingSEI); mfxU32 needMvcNestingSei = needBufferingPeriod || needPicTimingSei; // for BD/AVCHD compatible encoding filler SEI should have MVC nesting wrapper if (IsOn(extOpt.ViewOutput)) needMvcNestingSei |= (fillerSize != 0); mfxU32 needNotNestingSei = (task.m_ctrl.Payload && task.m_ctrl.NumPayload > 0) || (fillerSize > 0 && IsOff(extOpt.ViewOutput)) || needMarkingRepetitionSei; OutputBitstream writer(sei.Buffer(), sei.Capacity()); mfxU8 const SEI_STARTCODE[5] = { 0, 0, 0, 1, 6 }; // MVC BD { mfxExtAvcSeiBufferingPeriod msgBufferingPeriod = {}; mfxExtAvcSeiPicTiming msgPicTiming; mfxU32 sps_id = extSps.seqParameterSetId; sps_id = ((sps_id + !!task.m_viewIdx) & 0x1f); // use appropriate sps id for dependent views // MVC BD } if (needMvcNestingSei) { if (needBufferingPeriod) { PrepareSeiMessage( task, IsOn(extOpt.VuiNalHrdParameters), IsOn(extOpt.VuiVclHrdParameters), sps_id, msgBufferingPeriod); // write NAL unit with MVC nesting SEI for BP writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, needBufferingPeriod, 0, 0, video, msgBufferingPeriod, *extPt, msgPicTiming); writer.PutTrailingBits(); } if (needPicTimingSei) { PrepareSeiMessage( task, fieldId, IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters), extSps.vui.flags.picStructPresent, msgPicTiming); // write NAL unit with MVC nesting SEI for PT writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, 0, needPicTimingSei, 0, video, msgBufferingPeriod, *extPt, msgPicTiming); writer.PutTrailingBits(); } if (fillerSize) { // write NAL unit with MVC nesting SEI for filler writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, 0, 0, fillerSize, video, msgBufferingPeriod, *extPt, msgPicTiming); writer.PutTrailingBits(); } } if (needNotNestingSei && IsOn(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); // user-defined messages if (task.m_ctrl.Payload != nullptr) { for (mfxU32 i = secondFieldPicFlag; i < task.m_ctrl.NumPayload; i = i + 1 + fieldPicFlag) { if (task.m_ctrl.Payload[i] != nullptr) { if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); for (mfxU32 b = 0; b < task.m_ctrl.Payload[i]->NumBit / 8; b++) writer.PutBits(task.m_ctrl.Payload[i]->Data[b], 8); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } } } if (needMarkingRepetitionSei) { mfxU8 frameMbsOnlyFlag = (video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 0; mfxExtAvcSeiDecRefPicMrkRep decRefPicMrkRep; PrepareSeiMessage(task, fieldId, frameMbsOnlyFlag, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writer, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (fillerSize > 0 && IsOff(extOpt.ViewOutput)) { // how many bytes takes to encode payloadSize depends on size of sei message // need to compensate it fillerSize -= fillerSize / 256; if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiHeader(writer, SEI_TYPE_FILLER_PAYLOAD, fillerSize); writer.PutFillerBytes(0xff, fillerSize); if (IsOff(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); } if (needNotNestingSei && IsOn(extOpt.SingleSeiNalUnit)) writer.PutTrailingBits(); // w/a for SNB/IVB: padd sei buffer to compensate re-pack of AVC headers to MVC // add repack compensation to the end of last sei NALu. if (needMvcNestingSei && task.m_addRepackSize[fieldId]) writer.PutFillerBytes(0xff, task.m_addRepackSize[fieldId]); sei.SetSize(writer.GetNumBits() / 8); #ifdef MFX_ENABLE_AVC_BS // encoding of AVC SEI with size equal to MVC SEI mfxU32 seiSizeMVC = writer.GetNumBits() / 8; mfxU32 seiSizeAVC = 0; mfxU32 needAtLeastOneSei = task.m_ctrl.Payload && task.m_ctrl.NumPayload > 0 || fillerSize > 0 || needBufferingPeriod || needPicTimingSei || needMarkingRepetitionSei; OutputBitstream writerAVC(&sei[0], sei.Capacity()); if (needAtLeastOneSei && IsOn(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); if (needBufferingPeriod) { PrepareSeiMessage( task, IsOn(extOpt.VuiNalHrdParameters), IsOn(extOpt.VuiVclHrdParameters), sps_id, msgBufferingPeriod); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writerAVC, msgBufferingPeriod); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); } if (needPicTimingSei) { PrepareSeiMessage( task, fieldId, IsOn(extOpt.VuiNalHrdParameters) || IsOn(extOpt.VuiVclHrdParameters), msgPicTiming); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); assert(extPt); if (!extPt) return; PutSeiMessage(writerAVC, *extPt, msgPicTiming); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); } // user-defined messages if (task.m_ctrl.Payload != nullptr) { for (mfxU32 i = secondFieldPicFlag; i < task.m_ctrl.NumPayload; i = i + 1 + fieldPicFlag) { if (task.m_ctrl.Payload[i] != nullptr) { if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); for (mfxU32 b = 0; b < task.m_ctrl.Payload[i]->NumBit / 8; b++) writerAVC.PutBits(task.m_ctrl.Payload[i]->Data[b], 8); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); } } } if (needMarkingRepetitionSei) { mfxU8 frameMbsOnlyFlag = (video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 0; mfxExtAvcSeiDecRefPicMrkRep decRefPicMrkRep; PrepareSeiMessage(task, fieldId, frameMbsOnlyFlag, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiMessage(writerAVC, decRefPicMrkRep); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); } if (fillerSize > 0) { // how many bytes takes to encode payloadSize depends on size of sei message // need to compensate it fillerSize -= fillerSize / 256; if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutRawBytes(SEI_STARTCODE, SEI_STARTCODE + sizeof(SEI_STARTCODE)); PutSeiHeader(writerAVC, SEI_TYPE_FILLER_PAYLOAD, fillerSize); writerAVC.PutFillerBytes(0xff, fillerSize); if (IsOff(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); } if (needAtLeastOneSei && IsOn(extOpt.SingleSeiNalUnit)) writerAVC.PutTrailingBits(); // add repack compensation to the end of last sei NALu. if (task.m_addRepackSize[fieldId] && needAtLeastOneSei) writerAVC.PutFillerBytes(0xff, task.m_addRepackSize[fieldId]); seiSizeAVC = writerAVC.GetNumBits() / 8; mfxI32 seiSizeDiff = seiSizeMVC - seiSizeAVC; assert(seiSizeDiff >= 0); if (seiSizeDiff > 0) { writerAVC.PutFillerBytes(0xff, seiSizeDiff); task.m_addRepackSize[fieldId] += seiSizeDiff; } assert(writer.GetNumBits() == writerAVC.GetNumBits()); sei.SetSize(writerAVC.GetNumBits() / 8); #endif // MFX_ENABLE_AVC_BS } // MVC BD } bool MfxHwH264Encode::IsInplacePatchNeeded( MfxVideoParam const & par, DdiTask const & task, mfxU32 fieldId) { mfxExtSpsHeader const & extSps = GetExtBufferRef(par); mfxExtPpsHeader const & extPps = GetExtBufferRef(par); mfxU8 constraintFlags = (extSps.constraints.set0 << 7) | (extSps.constraints.set1 << 6) | (extSps.constraints.set2 << 5) | (extSps.constraints.set3 << 4) | (extSps.constraints.set4 << 3) | (extSps.constraints.set5 << 2) | (extSps.constraints.set6 << 1) | (extSps.constraints.set7 << 0); if (task.m_nalRefIdc[fieldId] > 1) return true; return constraintFlags != 0 || extSps.nalRefIdc != 1 || extPps.nalRefIdc != 1 || extSps.gapsInFrameNumValueAllowedFlag == 1 || (extSps.maxNumRefFrames & 1); } bool MfxHwH264Encode::IsSlicePatchNeeded( DdiTask const & task, mfxU32 fieldId) { for (mfxU32 i = 0; i < task.m_refPicList0Mod[fieldId].Size(); i++) if (task.m_refPicList0Mod[fieldId][i].m_idc == RPLM_LT_PICNUM) return true; // driver doesn't write reordering syntax for long term reference pictures for (mfxU32 i = 0; i < task.m_list0[fieldId].Size(); i++) if (task.m_dpb[fieldId][task.m_list0[fieldId][i] & 0x7f].m_longterm) return true; // driver insert incorrect reordering syntax when longterm ref present for (mfxU32 i = 0; i < task.m_list1[fieldId].Size(); i++) if (task.m_dpb[fieldId][task.m_list1[fieldId][i] & 0x7f].m_longterm) return true; // driver insert incorrect reordering syntax when longterm ref present bool list0ModifiedAndShortened = task.m_refPicList0Mod[fieldId].Size() > 0 && task.m_initSizeList0[fieldId] != task.m_list0[fieldId].Size(); return task.m_refPicList1Mod[fieldId].Size() > 0 || // driver doesn't write reordering syntax for List1 list0ModifiedAndShortened || // driver doesn't write correct reordering syntax // when num_ref_idx_l0_active is different from inital task.m_decRefPicMrk[fieldId].mmco.Size() > 0 || // driver doesn't write dec_ref_pic_marking syntax task.m_decRefPicMrk[fieldId].long_term_reference_flag; // even for idr frames } mfxStatus MfxHwH264Encode::CopyBitstream(VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, mfxU8 * bsData, mfxU32 bsSizeAvail) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H264 encode CopyBitstream"); mfxFrameData bitstream = {}; FrameLocker lock(&core, bitstream, task.m_midBit[fieldId]); MFX_CHECK(video.Protected == 0 || task.m_notProtected, MFX_ERR_UNDEFINED_BEHAVIOR); if (bitstream.Y == 0) return Error(MFX_ERR_LOCK_MEMORY); mfxU32 bsSizeToCopy = task.m_bsDataLength[fieldId]; if (bsSizeToCopy > bsSizeAvail) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); FastCopyBufferVid2Sys(bsData, bitstream.Y, bsSizeToCopy); return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::UpdateSliceInfo( mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU32 maxSliceSize, DdiTask & task, bool& bRecoding) { mfxU32 num = 0; for (NaluIterator nalu(sbegin, send); nalu != NaluIterator(); ++nalu) { if (nalu->type == 1 || nalu->type == 5) { mfxF32 slice_len = (mfxF32) (nalu->end - nalu->begin); mfxF32 weight = (slice_len*100)/maxSliceSize; task.m_SliceInfo[num].weight = weight ; if (weight > 100) bRecoding = true; //printf ("%d \t slice len\t%f\t%f\n", num, slice_len, task.m_SliceInfo[num].weight); num++; } } if (task.m_repack == 0 && !bRecoding) { if (num > 4) { mfxF32 weight_avg = 0; for (mfxU32 i = 0; i < num; i ++) { weight_avg += task.m_SliceInfo[i].weight; } weight_avg = weight_avg/(mfxF32)num; bRecoding = (weight_avg < 25); //if (bRecoding) //{ //printf("short slices %d, w=%f\n", num, weight_avg); //} } } return (task.m_SliceInfo.size()!= num)? MFX_ERR_UNDEFINED_BEHAVIOR : MFX_ERR_NONE; } mfxU8 * MfxHwH264Encode::PatchBitstream( MfxVideoParam const & video, DdiTask const & task, mfxU32 fieldId, mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend) { mfxExtSpsHeader const & extSps = GetExtBufferRef(video); mfxExtPpsHeader const & extPps = GetExtBufferRef(video); mfxU8 constraintFlags = (extSps.constraints.set0 << 7) | (extSps.constraints.set1 << 6) | (extSps.constraints.set2 << 5) | (extSps.constraints.set3 << 4) | (extSps.constraints.set4 << 3) | (extSps.constraints.set5 << 2) | (extSps.constraints.set6 << 1) | (extSps.constraints.set7 << 0); bool copy = (sbegin != dbegin); bool prefixNalUnitNeeded = video.calcParam.numTemporalLayer > 0; bool slicePatchNeeded = copy && IsSlicePatchNeeded(task, fieldId); assert(copy || !IsSlicePatchNeeded(task, fieldId) || !"slice patching requries intermediate bitstream buffer"); bool spsPresent = false; for (NaluIterator nalu(sbegin, send); nalu != NaluIterator(); ++nalu) { if (nalu->type == 7) { mfxU8 * spsBegin = dbegin; if (extSps.gapsInFrameNumValueAllowedFlag || (extSps.maxNumRefFrames & 1)) { assert(copy); InputBitstream reader(nalu->begin + nalu->numZero + 1, nalu->end); mfxExtSpsHeader spsHead = { }; ReadSpsHeader(reader, spsHead); spsHead.gapsInFrameNumValueAllowedFlag = extSps.gapsInFrameNumValueAllowedFlag; spsHead.maxNumRefFrames = extSps.maxNumRefFrames; OutputBitstream writer(dbegin, dend); dbegin += WriteSpsHeader(writer, spsHead) / 8; } else { dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } // snb and ivb driver doesn't provide controls for nal_ref_idc // if nal_ref_idc from mfxExtCodingOptionSPSPPS differs from value hardcoded in driver (1) // it needs to be patched spsBegin[nalu->numZero + 1] &= ~0x30; spsBegin[nalu->numZero + 1] |= extSps.nalRefIdc << 5; // snb and ivb driver doesn't provide controls for constraint flags in sps header // if any of them were set via mfxExtCodingOptionSPSPPS // sps header generated by driver needs to be patched // such patching doesn't change length of header spsBegin[nalu->numZero + 3] = constraintFlags; spsPresent = true; } else if (nalu->type == 8) { if (spsPresent || // pps always accompanies sps !video.calcParam.tempScalabilityMode) // mfxExtAvcTemporalLayers buffer is not present, pps to every frame { mfxU8 * ppsBegin = dbegin; dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; // snb and ivb driver doesn't provide controls for nal_ref_idc // if nal_ref_idc from mfxExtCodingOptionSPSPPS differs from value hardcoded in driver (1) // it needs to be patched ppsBegin[nalu->numZero + 1] &= ~0x30; ppsBegin[nalu->numZero + 1] |= extPps.nalRefIdc << 5; } } else if (nalu->type == 9) { if (!video.calcParam.tempScalabilityMode) // mfxExtAvcTemporalLayers buffer is not present, aud to every frame { dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } } else if (nalu->type == 1 || nalu->type == 5) { if (task.m_nalRefIdc[fieldId] > 1) { nalu->begin[nalu->numZero + 1] &= ~0x30; nalu->begin[nalu->numZero + 1] |= task.m_nalRefIdc[fieldId] << 5; } if (prefixNalUnitNeeded) { dbegin = PackPrefixNalUnitSvc(dbegin, dend, true, task, fieldId); } if (slicePatchNeeded) { assert(copy || !"slice patching requries intermediate bitstream buffer"); dbegin = CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->begin + nalu->numZero + 2); dbegin = RePackSlice(dbegin, dend, nalu->begin + nalu->numZero + 2, nalu->end, video, task, fieldId); } else { dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } } else { dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } } return dbegin; } mfxU8 * MfxHwH264Encode::InsertSVCNAL( DdiTask const & task, mfxU32 fieldId, mfxU8 * sbegin, // contents of source buffer may be modified mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend) { bool copy = (sbegin != dbegin); for (NaluIterator nalu(sbegin, send); nalu != NaluIterator(); ++nalu) { if (nalu->type == 1 || nalu->type == 5) { dbegin = PackPrefixNalUnitSvc(dbegin, dend, true, task, fieldId); dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } else { dbegin = copy ? CheckedMFX_INTERNAL_CPY(dbegin, dend, nalu->begin, nalu->end) : nalu->end; } } return dbegin; } namespace { mfxI32 CalcDistScaleFactor( mfxU32 pocCur, mfxU32 pocL0, mfxU32 pocL1) { mfxI32 tb = mfx::clamp(mfxI32(pocCur - pocL0), -128, 127); mfxI32 td = mfx::clamp(mfxI32(pocL1 - pocL0), -128, 127); mfxI32 tx = (16384 + abs(td/2)) / td; return mfx::clamp((tb * tx + 32) >> 6, -1024, 1023); } mfxI32 CalcDistScaleFactor( DdiTask const & task, mfxU32 indexL0, mfxU32 indexL1) { if (indexL0 >= task.m_list0[0].Size() || indexL1 >= task.m_list1[0].Size()) return 128; mfxU32 pocL0 = task.m_dpb[0][task.m_list0[0][indexL0] & 127].m_poc[0]; mfxU32 pocL1 = task.m_dpb[0][task.m_list1[0][indexL1] & 127].m_poc[0]; if (pocL0 == pocL1) return 128; return CalcDistScaleFactor(task.GetPoc(0), pocL0, pocL1); } mfxU32 GetMBCost(DdiTask const & task, mfxU32 nMB, mfxU32 widthMB, mfxU32 heightMB, mfxU32 widthVME, mfxU32 heightVME) { mfxU32 xVME = (mfxU32)((mfxF32)(nMB%widthMB) / ((mfxF32)widthMB/(mfxF32)widthVME)); mfxU32 yVME = (mfxU32)((mfxF32)(nMB/widthMB) / ((mfxF32)heightMB/(mfxF32)heightVME)); mfxU32 mbCost = task.m_vmeData->mb[yVME*widthVME + xVME].dist; /* if (!task.m_vmeData->mb[nMB].intraMbFlag) { mbCost = task.m_cqpValue[0] < GetSkippedQp(task.m_vmeData->mb[nMB]) ? mbCost : 0; } */ mbCost = mbCost > 0 ? mbCost : 1; return mbCost; } }; mfxU32 MfxHwH264Encode::CalcBiWeight( DdiTask const & task, mfxU32 indexL0, mfxU32 indexL1) { mfxI32 biWeight = CalcDistScaleFactor(task, indexL0, indexL1) >> 2; return biWeight < -64 || biWeight > 128 ? 32 : biWeight; } BrcIface * MfxHwH264Encode::CreateBrc(MfxVideoParam const & video, MFX_ENCODE_CAPS const & hwCaps) { mfxExtCodingOption2 const & ext = GetExtBufferRef(video); if (ext.MaxSliceSize && !IsDriverSliceSizeControlEnabled(video, hwCaps)) return new UmcBrc; switch (video.mfx.RateControlMethod) { case MFX_RATECONTROL_LA: case MFX_RATECONTROL_LA_HRD: return new LookAheadBrc2; case MFX_RATECONTROL_LA_ICQ: return new LookAheadCrfBrc; #if defined(MFX_ENABLE_EXT_BRC) case MFX_RATECONTROL_CBR: case MFX_RATECONTROL_VBR: return new H264SWBRC; #endif default: return new UmcBrc; } } mfxU8 * MfxHwH264Encode::AddEmulationPreventionAndCopy( mfxU8 * sbegin, mfxU8 * send, mfxU8 * dbegin, mfxU8 * dend) { mfxU32 zeroCount = 0; mfxU8 * write = dbegin; for (mfxU8 * read = sbegin; read != send; ++read) { if (write > dend) { assert(0); throw EndOfBuffer(); } if (zeroCount >= 2 && (*read & 0xfc) == 0) { *(write++) = 0x03; zeroCount = 0; // drop zero count } zeroCount = (*read == 0) ? zeroCount + 1 : 0; *(write++) = *read; } return write; } mfxStatus MfxHwH264Encode::FillSliceInfo(DdiTask & task, mfxU32 MaxSliceSize, mfxU32 FrameSize, mfxU32 widthLa, mfxU32 heightLa) { if (MaxSliceSize == 0) return MFX_ERR_NONE; mfxU32 numPics = task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE ? 1 : 2; mfxU32 numSlices = (FrameSize + MaxSliceSize-1)/MaxSliceSize; mfxU32 widthMB = task.m_yuv->Info.Width/16; mfxU32 heightMB = task.m_yuv->Info.Height/16; mfxU32 numMB = widthMB*heightMB; numSlices = (numSlices > 0) ? numSlices : 1; numSlices = (numSlices > 255) ? 255 : numSlices; mfxU32 curMB = 0; mfxF32 maxSliceCost = 0.0; for (mfxU32 i = 0; i < numMB; i ++) { maxSliceCost = maxSliceCost + GetMBCost(task, i, widthMB, heightMB, widthLa/16, heightLa/16); } maxSliceCost = maxSliceCost/numSlices; task.m_SliceInfo.resize(numSlices); mfxU32 sliceCost = 0; mfxU32 numRealSlises = 0; mfxU32 prevCost = 0; for (size_t i = 0; i < task.m_SliceInfo.size(); ++i) { task.m_SliceInfo[i].startMB = curMB/numPics; mfxU32 numMBForSlice = 0; while (curMB < numMB) { mfxU32 mbCost = GetMBCost(task, curMB, widthMB, heightMB, widthLa/16, heightLa/16); if (((sliceCost + mbCost) > maxSliceCost * (i + 1)) && (numMBForSlice > 0) && (i < (task.m_SliceInfo.size() - 1))) { break; } sliceCost = sliceCost + mbCost; curMB ++; numMBForSlice ++; } task.m_SliceInfo[i].numMB = numMBForSlice/numPics; task.m_SliceInfo[i].weight = 100; task.m_SliceInfo[i].cost = sliceCost -prevCost; //printf("%d\t%d\n", i, task.m_SliceInfo[i].cost); prevCost = sliceCost; if (numMBForSlice) numRealSlises++; } if (numRealSlises != task.m_SliceInfo.size()) task.m_SliceInfo.resize(numRealSlises); return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::CorrectSliceInfo(DdiTask & task, mfxU32 MaxSliceWeight, mfxU32 widthLa, mfxU32 heightLa) { if (task.m_SliceInfo.size() == 0) return MFX_ERR_NONE; SliceStructInfo new_info[256] = {}; mfxU32 new_slice = 0; mfxU32 curMB = 0; mfxU32 old_slice = 0; mfxU32 numPics = task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE ? 1 : 2; mfxU32 widthMB = task.m_yuv->Info.Width/16; mfxU32 heightMB = task.m_yuv->Info.Height/16; mfxU32 numMB = widthMB*heightMB; // Form new slices using VME MB data and real coded slice size for (;new_slice < 256; ++new_slice) { mfxF64 sliceWeight = 0.0; new_info[new_slice].startMB = curMB/numPics; mfxU32 numMBForSlice = 0; mfxU32 sliceCost = 0; while (curMB < numMB) { if (curMB >= task.m_SliceInfo[old_slice].startMB + task.m_SliceInfo[old_slice].numMB) { old_slice ++; } mfxU32 mbCost = GetMBCost(task, curMB, widthMB, heightMB, widthLa/16, heightLa/16); mfxF64 mbWeight = (mfxF64) mbCost/task.m_SliceInfo[old_slice].cost*task.m_SliceInfo[old_slice].weight; if (((sliceWeight + mbWeight) > MaxSliceWeight) && (numMBForSlice > 0)) { break; } sliceWeight = sliceWeight + mbWeight; sliceCost += mbCost; curMB ++; numMBForSlice ++; } new_info[new_slice].numMB = numMBForSlice/numPics; new_info[new_slice].weight = 100; new_info[new_slice].cost = sliceCost; if (curMB >= numMB) break; } if (curMB < numMB) return Error(MFX_ERR_UNDEFINED_BEHAVIOR); task.m_SliceInfo.resize(new_slice + 1); for (size_t i = 0; i < task.m_SliceInfo.size(); i++) { task.m_SliceInfo[i] = new_info[i]; } return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::CorrectSliceInfoForsed(DdiTask & task, mfxU32 widthLa, mfxU32 heightLa) { mfxU32 freeSlisesMax = task.m_SliceInfo.size() < 256 ? mfxU32(256 - task.m_SliceInfo.size()) : 0; if (!freeSlisesMax) return MFX_ERR_NONE; mfxU32 bigSlices[256] = {0}; mfxU32 numBigSlices = 0; SliceStructInfo new_info[256] = {}; mfxU32 widthMB = task.m_yuv->Info.Width/16; mfxU32 heightMB = task.m_yuv->Info.Height/16; // sort big slices for (mfxU32 i = 0; i < (mfxU32)task.m_SliceInfo.size(); i++) { bigSlices[i] = i; } for (; numBigSlices < freeSlisesMax; numBigSlices++) { mfxF32 max_weight = 0; mfxU32 max_index = 0; for (size_t j = numBigSlices; j < task.m_SliceInfo.size(); j++) { if (max_weight < task.m_SliceInfo[bigSlices[j]].weight && task.m_SliceInfo[bigSlices[j]].numMB > 1) { max_weight = task.m_SliceInfo[bigSlices[j]].weight; max_index = (mfxU32)j; } } if (max_weight < 100) break; mfxU32 tmp = bigSlices[max_index] ; bigSlices[max_index] =bigSlices[numBigSlices]; bigSlices[numBigSlices] = tmp; } mfxU32 numSlises = 0; // devide big slices for (mfxU32 i = 0; i < task.m_SliceInfo.size(); i++) { bool bBigSlice = false; for (mfxU32 j = 0; j < numBigSlices; j++) { if (bigSlices[j] == i) { bBigSlice = true; break; } } if (bBigSlice) { new_info[numSlises].startMB = task.m_SliceInfo[i].startMB; new_info[numSlises].numMB = task.m_SliceInfo[i].numMB / 2; new_info[numSlises].cost = 0; for (mfxU32 n = new_info[numSlises].startMB; n < new_info[numSlises].startMB + new_info[numSlises].numMB; n++) { new_info[numSlises].cost += GetMBCost(task, n, widthMB, heightMB, widthLa/16, heightLa/16); } numSlises ++; new_info[numSlises].startMB = new_info[numSlises - 1].startMB + new_info[numSlises - 1].numMB; new_info[numSlises].numMB =task.m_SliceInfo[i].numMB - new_info[numSlises - 1].numMB; new_info[numSlises].cost = 0; for (mfxU32 n = new_info[numSlises].startMB; n < new_info[numSlises].startMB + new_info[numSlises].numMB; n++) { new_info[numSlises].cost += GetMBCost(task, n, widthMB, heightMB, widthLa/16, heightLa/16); } numSlises ++; } else { new_info[numSlises ++] = task.m_SliceInfo[i]; } } task.m_SliceInfo.resize(numSlises); for (size_t i = 0; i < task.m_SliceInfo.size(); i++) { task.m_SliceInfo[i] = new_info[i]; } return MFX_ERR_NONE; } const mfxU8 rangeTabLPS[64][4] = { { 93 + 35 , 101 + 75 , 19 + 189, 82 + 158, }, { 82 + 46 , 145 + 22 , 193 + 4 , 29 + 198, }, { 5 + 123, 107 + 51 , 152 + 35 , 72 + 144, }, { 106 + 17 , 23 + 127, 116 + 62 , 152 + 53 , }, { 26 + 90 , 33 + 109, 27 + 142, 129 + 66 , }, { 37 + 74 , 88 + 47 , 30 + 130, 5 + 180, }, { 60 + 45 , 91 + 37 , 139 + 13 , 96 + 79 , }, { 70 + 30 , 14 + 108, 120 + 24 , 138 + 28 , }, { 31 + 64 , 8 + 108, 80 + 57 , 77 + 81 , }, { 78 + 12 , 29 + 81 , 23 + 107, 1 + 149, }, { 26 + 59 , 99 + 5 , 19 + 104, 99 + 43 , }, { 21 + 60 , 61 + 38 , 7 + 110, 15 + 120, }, { 63 + 14 , 64 + 30 , 76 + 35 , 30 + 98 , }, { 0 + 73 , 54 + 35 , 8 + 97 , 94 + 28 , }, { 25 + 44 , 61 + 24 , 67 + 33 , 84 + 32 , }, { 50 + 16 , 16 + 64 , 27 + 68 , 108 + 2 , }, { 54 + 8 , 16 + 60 , 24 + 66 , 43 + 61 , }, { 5 + 54 , 46 + 26 , 65 + 21 , 93 + 6 , }, { 50 + 6 , 57 + 12 , 42 + 39 , 22 + 72 , }, { 51 + 2 , 24 + 41 , 50 + 27 , 81 + 8 , }, { 46 + 5 , 14 + 48 , 55 + 18 , 76 + 9 , }, { 47 + 1 , 21 + 38 , 26 + 43 , 17 + 63 , }, { 7 + 39 , 31 + 25 , 58 + 8 , 42 + 34 , }, { 39 + 4 , 7 + 46 , 30 + 33 , 20 + 52 , }, { 5 + 36 , 29 + 21 , 1 + 58 , 29 + 40 , }, { 25 + 14 , 47 + 1 , 15 + 41 , 12 + 53 , }, { 2 + 35 , 10 + 35 , 45 + 9 , 50 + 12 , }, { 3 + 32 , 36 + 7 , 23 + 28 , 11 + 48 , }, { 11 + 22 , 24 + 17 , 31 + 17 , 15 + 41 , }, { 8 + 24 , 19 + 20 , 17 + 29 , 2 + 51 , }, { 28 + 2 , 16 + 21 , 40 + 3 , 28 + 22 , }, { 11 + 18 , 34 + 1 , 18 + 23 , 17 + 31 , }, { 12 + 15 , 28 + 5 , 20 + 19 , 17 + 28 , }, { 6 + 20 , 15 + 16 , 19 + 18 , 12 + 31 , }, { 19 + 5 , 23 + 7 , 31 + 4 , 27 + 14 , }, { 4 + 19 , 25 + 3 , 32 + 1 , 0 + 39 , }, { 10 + 12 , 22 + 5 , 8 + 24 , 17 + 20 , }, { 11 + 10 , 25 + 1 , 0 + 30 , 4 + 31 , }, { 2 + 18 , 9 + 15 , 0 + 29 , 6 + 27 , }, { 18 + 1 , 11 + 12 , 2 + 25 , 0 + 31 , }, { 12 + 6 , 10 + 12 , 17 + 9 , 24 + 6 , }, { 5 + 12 , 18 + 3 , 2 + 23 , 6 + 22 , }, { 1 + 15 , 7 + 13 , 19 + 4 , 18 + 9 , }, { 4 + 11 , 12 + 7 , 21 + 1 , 5 + 20 , }, { 12 + 2 , 6 + 12 , 5 + 16 , 10 + 14 , }, { 4 + 10 , 7 + 10 , 17 + 3 , 17 + 6 , }, { 10 + 3 , 7 + 9 , 14 + 5 , 10 + 12 , }, { 1 + 11 , 14 + 1 , 2 + 16 , 10 + 11 , }, { 2 + 10 , 12 + 2 , 6 + 11 , 1 + 19 , }, { 1 + 10 , 3 + 11 , 0 + 16 , 18 + 1 , }, { 3 + 8 , 8 + 5 , 1 + 14 , 16 + 2 , }, { 9 + 1 , 9 + 3 , 3 + 12 , 14 + 3 , }, { 1 + 9 , 6 + 6 , 9 + 5 , 0 + 16 , }, { 1 + 8 , 6 + 5 , 11 + 2 , 6 + 9 , }, { 2 + 7 , 10 + 1 , 3 + 9 , 5 + 9 , }, { 3 + 5 , 4 + 6 , 7 + 5 , 12 + 2 , }, { 4 + 4 , 6 + 3 , 10 + 1 , 6 + 7 , }, { 0 + 7 , 3 + 6 , 8 + 3 , 2 + 10 , }, { 6 + 1 , 8 + 1 , 7 + 3 , 9 + 3 , }, { 0 + 7 , 6 + 2 , 0 + 10 , 9 + 2 , }, { 0 + 6 , 1 + 7 , 5 + 4 , 5 + 6 , }, { 3 + 3 , 1 + 6 , 5 + 4 , 8 + 2 , }, { 0 + 6 , 5 + 2 , 4 + 4 , 0 + 9 , }, { 1 + 1 , 0 + 2 , 1 + 1 , 0 + 2 , }, }; const mfxU8 transIdxLPS[64] = { 55 - 55, 168 - 168, 0 + 1, 0 + 2, 1 + 1, 0 + 4, 1 + 3, 0 + 5, 1 + 5, 4 + 3, 4 + 4, 6 + 3, 8 + 1, 4 + 7, 9 + 2, 1 + 11, 1 + 12, 9 + 4, 10 + 5, 9 + 6, 10 + 6, 14 + 2, 8 + 10, 0 + 18, 18 + 1, 18 + 1, 3 + 18, 10 + 11, 7 + 15, 10 + 12, 18 + 5, 16 + 8, 18 + 6, 14 + 11, 5 + 21, 12 + 14, 25 + 2, 20 + 7, 21 + 7, 5 + 24, 26 + 3, 10 + 20, 21 + 9, 0 + 30, 11 + 20, 12 + 20, 14 + 18, 29 + 4, 22 + 11, 13 + 20, 11 + 23, 33 + 1, 0 + 35, 24 + 11, 22 + 13, 26 + 10, 20 + 16, 35 + 1, 8 + 29, 13 + 24, 19 + 18, 5 + 33, 32 + 6, 32 + 31, }; const mfxU8 transIdxMPS[64] = { 0 + 1, 0 + 2, 2 + 1, 1 + 3, 0 + 5, 2 + 4, 0 + 7, 2 + 6, 3 + 6, 7 + 3, 6 + 5, 4 + 8, 2 + 11, 11 + 3, 10 + 5, 10 + 6, 8 + 9, 14 + 4, 10 + 9, 5 + 15, 0 + 21, 15 + 7, 15 + 8, 4 + 20, 20 + 5, 15 + 11, 14 + 13, 23 + 5, 11 + 18, 17 + 13, 1 + 30, 13 + 19, 17 + 16, 17 + 17, 27 + 8, 0 + 36, 0 + 37, 7 + 31, 25 + 14, 4 + 36, 22 + 19, 8 + 34, 9 + 34, 15 + 29, 16 + 29, 36 + 10, 37 + 10, 25 + 23, 43 + 6, 12 + 38, 43 + 8, 5 + 47, 10 + 43, 25 + 29, 37 + 18, 27 + 29, 38 + 19, 15 + 43, 31 + 28, 24 + 36, 10 + 51, 54 + 8, 28 + 34, 59 + 4, }; CabacPackerSimple::CabacPackerSimple(mfxU8 * buf, mfxU8 * bufEnd, bool emulationControl) : OutputBitstream(buf, bufEnd, emulationControl) , m_codILow(0) , m_codIRange(510) , m_bitsOutstanding(0) , m_BinCountsInNALunits(0) , m_firstBitFlag(true) { } void CabacPackerSimple::PutBitC(mfxU32 B) { if (m_firstBitFlag) m_firstBitFlag = false; else PutBit(B); while (m_bitsOutstanding > 0) { PutBit(1-B); m_bitsOutstanding --; } } void CabacPackerSimple::RenormE() { while (m_codIRange < 256) { if (m_codILow < 256) { PutBitC(0); } else if (m_codILow >= 512) { m_codILow -= 512; PutBitC(1); } else { m_codILow -= 256; m_bitsOutstanding ++; } m_codIRange <<= 1; m_codILow <<= 1; } } void CabacPackerSimple::EncodeBin(mfxU8 * ctx, mfxU8 binVal) { mfxU8 pStateIdx = (*ctx) & 0x3F; mfxU8 valMPS = ((*ctx) >> 6); mfxU32 qCodIRangeIdx = (m_codIRange >> 6) & 3; mfxU32 codIRangeLPS = rangeTabLPS[pStateIdx][qCodIRangeIdx]; m_codIRange -= codIRangeLPS; if (binVal != valMPS) { m_codILow += m_codIRange; m_codIRange = codIRangeLPS; if (pStateIdx == 0) valMPS = 1 - valMPS; pStateIdx = transIdxLPS[pStateIdx]; } else { pStateIdx = transIdxMPS[pStateIdx]; } *ctx = ((valMPS<<6) | pStateIdx); RenormE(); m_BinCountsInNALunits ++; } void CabacPackerSimple::TerminateEncode() { m_codIRange -= 2; m_codILow += m_codIRange; m_codIRange = 2; RenormE(); PutBitC((m_codILow >> 9) & 1); PutBit(m_codILow >> 8); PutTrailingBits(); m_BinCountsInNALunits ++; } #endif // MFX_ENABLE_H264_VIDEO_ENCODE mfx_h264_encode_hw_utils_new.cpp000066400000000000000000004307561443134507600336670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src// Copyright (c) 2009-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include #include "mfx_h264_encode_hw_utils.h" #include "mfx_common_int.h" #include "ippi.h" using namespace MfxHwH264Encode; namespace MfxHwH264Encode { mfxI32 GetPicNum(ArrayDpbFrame const & dpb, mfxU8 ref) { return dpb[ref & 127].m_picNum[ref >> 7]; } mfxI32 GetPicNumF(ArrayDpbFrame const & dpb, mfxU8 ref) { DpbFrame const & dpbFrame = dpb[ref & 127]; return dpbFrame.m_refPicFlag[ref >> 7] ? dpbFrame.m_picNum[ref >> 7] : 0x20000; } mfxU8 GetLongTermPicNum(ArrayDpbFrame const & dpb, mfxU8 ref) { return dpb[ref & 127].m_longTermPicNum[ref >> 7]; } mfxU32 GetLongTermPicNumF(ArrayDpbFrame const & dpb, mfxU8 ref) { DpbFrame const & dpbFrame = dpb[ref & 127]; return dpbFrame.m_refPicFlag[ref >> 7] && dpbFrame.m_longterm ? dpbFrame.m_longTermPicNum[ref >> 7] : 0x20; } mfxI32 GetPoc(ArrayDpbFrame const & dpb, mfxU8 ref) { return dpb[ref & 127].m_poc[ref >> 7]; } }; namespace { struct BasePredicateForRefPic { typedef ArrayDpbFrame Dpb; typedef mfxU8 Arg; typedef bool Res; BasePredicateForRefPic(Dpb const & dpb) : m_dpb(dpb) {} void operator =(BasePredicateForRefPic const &); Dpb const & m_dpb; }; struct RefPicNumIsGreater : public BasePredicateForRefPic { RefPicNumIsGreater(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 l, mfxU8 r) const { return GetPicNum(m_dpb, l) > GetPicNum(m_dpb, r); } }; struct LongTermRefPicNumIsLess : public BasePredicateForRefPic { LongTermRefPicNumIsLess(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 l, mfxU8 r) const { return GetLongTermPicNum(m_dpb, l) < GetLongTermPicNum(m_dpb, r); } }; struct RefPocIsLess : public BasePredicateForRefPic { RefPocIsLess(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 l, mfxU8 r) const { return GetPoc(m_dpb, l) < GetPoc(m_dpb, r); } }; struct RefPocIsGreater : public BasePredicateForRefPic { RefPocIsGreater(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 l, mfxU8 r) const { return GetPoc(m_dpb, l) > GetPoc(m_dpb, r); } }; struct RefPocIsLessThan : public BasePredicateForRefPic { RefPocIsLessThan(Dpb const & dpb, mfxI32 poc) : BasePredicateForRefPic(dpb), m_poc(poc) {} bool operator ()(mfxU8 r) const { return GetPoc(m_dpb, r) < m_poc; } mfxI32 m_poc; }; struct RefPocIsGreaterThan : public BasePredicateForRefPic { RefPocIsGreaterThan(Dpb const & dpb, mfxI32 poc) : BasePredicateForRefPic(dpb), m_poc(poc) {} bool operator ()(mfxU8 r) const { return GetPoc(m_dpb, r) > m_poc; } mfxI32 m_poc; }; struct RefIsShortTerm : public BasePredicateForRefPic { RefIsShortTerm(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 r) const { return m_dpb[r & 127].m_refPicFlag[r >> 7] && !m_dpb[r & 127].m_longterm; } }; struct RefIsLongTerm : public BasePredicateForRefPic { RefIsLongTerm(Dpb const & dpb) : BasePredicateForRefPic(dpb) {} bool operator ()(mfxU8 r) const { return m_dpb[r & 127].m_refPicFlag[r >> 7] && m_dpb[r & 127].m_longterm; } }; struct RefIsFromHigherTemporalLayer : public BasePredicateForRefPic { RefIsFromHigherTemporalLayer(Dpb const & dpb, mfxU32 tid) : BasePredicateForRefPic(dpb), m_tid(tid) {} bool operator ()(mfxU8 r) const { return m_dpb[r & 127].m_tid > m_tid; } mfxU32 m_tid; }; bool RefListHasLongTerm( ArrayDpbFrame const & dpb, ArrayU8x33 const & list) { return std::find_if(list.Begin(), list.End(), RefIsLongTerm(dpb)) != list.End(); } template struct LogicalAndHelper { typedef typename T::Arg Arg; typedef typename T::Res Res; T m_pr1; U m_pr2; LogicalAndHelper(T pr1, U pr2) : m_pr1(pr1), m_pr2(pr2) {} Res operator ()(Arg arg) const { return m_pr1(arg) && m_pr2(arg); } }; template LogicalAndHelper LogicalAnd(T pr1, U pr2) { return LogicalAndHelper(pr1, pr2); } template struct LogicalNotHelper { typedef typename T::argument_type Arg; typedef typename T::result_type Res; T m_pr; LogicalNotHelper(T pr) : m_pr(pr) {} Res operator ()(Arg arg) const { return !m_pred(arg); } }; template LogicalNotHelper LogicalNot(T pr) { return LogicalNotHelper(pr); } mfxU32 CountFutureRefs( ArrayDpbFrame const & dpb, mfxU32 currFrameOrder) { mfxU32 count = 0; for (mfxU32 i = 0; i < dpb.Size(); ++i) if (currFrameOrder < dpb[i].m_frameOrder) count++; return count; } }; void MfxHwH264Encode::UpdateDpbFrames( DdiTask & task, mfxU32 field, mfxU32 frameNumMax) { mfxU32 ps = task.GetPicStructForEncode(); for (mfxU32 i = 0; i < task.m_dpb[field].Size(); i++) { DpbFrame & ref = task.m_dpb[field][i]; if (ref.m_longTermIdxPlus1 > 0) { if (ps == MFX_PICSTRUCT_PROGRESSIVE) { ref.m_longTermPicNum[0] = ref.m_longTermIdxPlus1 - 1; ref.m_longTermPicNum[1] = ref.m_longTermIdxPlus1 - 1; } else { ref.m_longTermPicNum[0] = 2 * (ref.m_longTermIdxPlus1 - 1) + mfxU8( !field); ref.m_longTermPicNum[1] = 2 * (ref.m_longTermIdxPlus1 - 1) + mfxU8(!!field); } } else { ref.m_frameNumWrap = (ref.m_frameNum > task.m_frameNum) ? ref.m_frameNum - frameNumMax : ref.m_frameNum; // update picNum if (ps == MFX_PICSTRUCT_PROGRESSIVE) { ref.m_picNum[0] = ref.m_frameNumWrap; ref.m_picNum[1] = ref.m_frameNumWrap; } else { ref.m_picNum[0] = 2 * ref.m_frameNumWrap + ( !field); ref.m_picNum[1] = 2 * ref.m_frameNumWrap + (!!field); } } } } namespace { void ProcessFields( mfxU32 bottomPicFlag, ArrayDpbFrame const & dpb, ArrayU8x33 const & picListFrm, ArrayU8x33 & picListFld) { // 8.2.4.2.5 "Initialisation process for reference picture lists in fields" mfxU8 const * sameParity = picListFrm.Begin(); mfxU8 const * oppParity = picListFrm.Begin(); picListFld.Resize(0); while (sameParity != picListFrm.End() || oppParity != picListFrm.End()) { for (; sameParity != picListFrm.End(); sameParity++) { if (dpb[*sameParity & 127].m_refPicFlag[bottomPicFlag]) { picListFld.PushBack((*sameParity & 127) + mfxU8(bottomPicFlag << 7)); sameParity++; break; } } for (; oppParity != picListFrm.End(); oppParity++) { if (dpb[*oppParity & 127].m_refPicFlag[!bottomPicFlag]) { picListFld.PushBack((*oppParity & 127) + mfxU8(!bottomPicFlag << 7)); oppParity++; break; } } } } }; void MfxHwH264Encode::InitRefPicList( DdiTask & task, mfxU32 field) { ArrayU8x33 list0Frm(0xff); // list0 built like current picture is frame ArrayU8x33 list1Frm(0xff); // list1 built like current picture is frame ArrayU8x33 & list0 = task.m_list0[field]; ArrayU8x33 & list1 = task.m_list1[field]; ArrayDpbFrame & dpb = task.m_dpb[field]; mfxU32 useRefBasePicFlag = !!(task.m_type[field] & MFX_FRAMETYPE_KEYPIC); // build lists of reference frame if (task.m_type[field] & MFX_FRAMETYPE_IDR) { // in MVC P or B frame can be IDR // its DPB may be not empty // however it shouldn't have inter-frame references } else if (task.m_type[field] & MFX_FRAMETYPE_P) { // 8.2.4.2.1-2 "Initialisation process for // the reference picture list for P and SP slices in frames/fields" for (mfxU32 i = 0; i < dpb.Size(); i++) if (!dpb[i].m_longterm && (useRefBasePicFlag == dpb[i].m_refBase)) list0Frm.PushBack(mfxU8(i)); std::sort(list0Frm.Begin(), list0Frm.End(), RefPicNumIsGreater(dpb)); mfxU8 * firstLongTerm = list0Frm.End(); for (mfxU32 i = 0; i < dpb.Size(); i++) if (dpb[i].m_longterm && (useRefBasePicFlag == dpb[i].m_refBase)) list0Frm.PushBack(mfxU8(i)); std::sort( firstLongTerm, list0Frm.End(), LongTermRefPicNumIsLess(dpb)); } else if (task.m_type[field] & MFX_FRAMETYPE_B) { // 8.2.4.2.3-4 "Initialisation process for // reference picture lists for B slices in frames/fields" for (mfxU32 i = 0; i < dpb.Size(); i++) { if (!dpb[i].m_longterm && (useRefBasePicFlag == dpb[i].m_refBase)) { if (dpb[i].m_poc[0] <= task.GetPoc(0)) list0Frm.PushBack(mfxU8(i)); else list1Frm.PushBack(mfxU8(i)); } } std::sort(list0Frm.Begin(), list0Frm.End(), RefPocIsGreater(dpb)); std::sort(list1Frm.Begin(), list1Frm.End(), RefPocIsLess(dpb)); // elements of list1 append list0 // elements of list0 append list1 mfxU32 list0Size = list0Frm.Size(); mfxU32 list1Size = list1Frm.Size(); for (mfxU32 ref = 0; ref < list1Size; ref++) list0Frm.PushBack(list1Frm[ref]); for (mfxU32 ref = 0; ref < list0Size; ref++) list1Frm.PushBack(list0Frm[ref]); mfxU8 * firstLongTermL0 = list0Frm.End(); mfxU8 * firstLongTermL1 = list1Frm.End(); for (mfxU32 i = 0; i < dpb.Size(); i++) { if (dpb[i].m_longterm && (useRefBasePicFlag == dpb[i].m_refBase)) { list0Frm.PushBack(mfxU8(i)); list1Frm.PushBack(mfxU8(i)); } } std::sort( firstLongTermL0, list0Frm.End(), LongTermRefPicNumIsLess(dpb)); std::sort( firstLongTermL1, list1Frm.End(), LongTermRefPicNumIsLess(dpb)); } if (task.GetPicStructForEncode() & MFX_PICSTRUCT_PROGRESSIVE) { // just copy lists list0 = list0Frm; list1 = list1Frm; } else { // for interlaced picture we need to perform // 8.2.4.2.5 "Initialisation process for reference picture lists in fields" list0.Resize(0); list1.Resize(0); ProcessFields(field, dpb, list0Frm, list0); ProcessFields(field, dpb, list1Frm, list1); } // "When the reference picture list RefPicList1 has more than one entry // and RefPicList1 is identical to the reference picture list RefPicList0, // the first two entries RefPicList1[0] and RefPicList1[1] are switched" if (list1.Size() > 1 && list0 == list1) { std::swap(list1[0], list1[1]); } task.m_initSizeList0[field] = list0.Size(); task.m_initSizeList1[field] = list1.Size(); } namespace { mfxU8 * FindByExtFrameTag( mfxU8 * begin, mfxU8 * end, ArrayDpbFrame const & dpb, mfxU32 extFrameTag, mfxU32 picStruct) { mfxU8 bff = (picStruct == MFX_PICSTRUCT_FIELD_BFF) ? 1 : 0; for (; begin != end; ++begin) if (dpb[*begin & 127].m_extFrameTag == extFrameTag) if (picStruct == MFX_PICSTRUCT_PROGRESSIVE || bff == (*begin >> 7)) break; return begin; } mfxU8 * FindByFrameOrder( mfxU8 * begin, mfxU8 * end, ArrayDpbFrame const & dpb, mfxU32 frameOrder, mfxU32 picStruct) { mfxU8 bff = (picStruct == MFX_PICSTRUCT_FIELD_BFF) ? 1 : 0; for (; begin != end; ++begin) if (dpb[*begin & 127].m_frameOrder == frameOrder) if (picStruct == MFX_PICSTRUCT_PROGRESSIVE || bff == (*begin >> 7)) break; return begin; } void ReorderRefPicList( ArrayU8x33 & refPicList, ArrayDpbFrame const & dpb, mfxExtAVCRefListCtrl const & ctrl, mfxU32 numActiveRef, bool byExtFrameTag, bool bEncToolsMode) { mfxU8 * begin = refPicList.Begin(); mfxU8 * end = refPicList.End(); mfxU8 * (*pFindRef)( mfxU8 * begin, mfxU8 * end, ArrayDpbFrame const & dpb, mfxU32 extFrameTag, mfxU32 picStruct) = ((byExtFrameTag) ? FindByExtFrameTag :FindByFrameOrder); if (bEncToolsMode && begin != end) begin++; //the nearest frame shouldn't be reordered for (mfxU32 i = 0; i < 32 && ctrl.PreferredRefList[i].FrameOrder != 0xffffffff; i++) { mfxU8 * ref = pFindRef( begin, end, dpb, ctrl.PreferredRefList[i].FrameOrder, ctrl.PreferredRefList[i].PicStruct); if (ref != end) std::rotate(begin++, ref, ref + 1); } for (mfxU32 i = 0; i < 16 && ctrl.RejectedRefList[i].FrameOrder != 0xffffffff; i++) { mfxU8 * ref = pFindRef( begin, end, dpb, ctrl.RejectedRefList[i].FrameOrder, ctrl.RejectedRefList[i].PicStruct); if (ref != end) std::rotate(ref, ref + 1, end--); } refPicList.Resize((mfxU32)(end - refPicList.Begin())); if (numActiveRef > 0 && refPicList.Size() > numActiveRef) refPicList.Resize(numActiveRef); } typedef struct { mfxU32 FrameOrder; mfxU16 PicStruct; mfxU16 reserved[5]; } mfxRefPic; void ReorderRefPicList( ArrayU8x33 & refPicList, ArrayDpbFrame const & dpb, mfxRefPic const * reordRefList, mfxU32 numActiveRef) { mfxU8 * begin = refPicList.Begin(); mfxU8 * end = refPicList.End(); for (mfxU32 i = 0; i < 32 && reordRefList[i].FrameOrder != 0xffffffff; i++) { mfxU8 * ref = FindByExtFrameTag( begin, end, dpb, reordRefList[i].FrameOrder, reordRefList[i].PicStruct); if (ref != end) std::rotate(begin++, ref, ref + 1); } if (numActiveRef > 0 && refPicList.Size() > numActiveRef) refPicList.Resize(numActiveRef); } }; ArrayRefListMod MfxHwH264Encode::CreateRefListMod( ArrayDpbFrame const & dpb, ArrayU8x33 initList, ArrayU8x33 const & modList, mfxU32 curViewIdx, mfxI32 curPicNum, bool optimize) { assert(initList.Size() == modList.Size()); ArrayRefListMod refListMod; mfxI32 picNumPred = curPicNum; mfxI32 picViewIdxPred = -1; for (mfxU32 refIdx = 0; refIdx < modList.Size(); refIdx++) { if (optimize && initList == modList) return refListMod; if (dpb[modList[refIdx] & 0x7f].m_viewIdx != curViewIdx) { // inter-view reference reordering mfxI32 viewIdx = mfxI32(dpb[modList[refIdx] & 0x7f].m_viewIdx); if (viewIdx > picViewIdxPred) { refListMod.PushBack(RefListMod(RPLM_INTERVIEW_ADD, mfxU16(viewIdx - picViewIdxPred - 1))); } else if (viewIdx < picViewIdxPred) { refListMod.PushBack(RefListMod(RPLM_INTERVIEW_SUB, mfxU16(picViewIdxPred - viewIdx - 1))); } else { assert(!"can't reorder ref list"); break; } for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (mfxI32(dpb[initList[cIdx] & 0x7f].m_viewIdx) != viewIdx) initList[nIdx++] = initList[cIdx]; picViewIdxPred = viewIdx; } else if (dpb[modList[refIdx] & 0x7f].m_longterm) { // long term reference reordering mfxU8 longTermPicNum = GetLongTermPicNum(dpb, modList[refIdx]); refListMod.PushBack(RefListMod(RPLM_LT_PICNUM, longTermPicNum)); for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (GetLongTermPicNumF(dpb, initList[cIdx]) != longTermPicNum || dpb[initList[cIdx] & 0x7f].m_viewIdx != curViewIdx) initList[nIdx++] = initList[cIdx]; } else { // short term reference reordering mfxI32 picNum = GetPicNum(dpb, modList[refIdx]); if (picNum > picNumPred) { mfxU16 absDiffPicNum = mfxU16(picNum - picNumPred); refListMod.PushBack(RefListMod(RPLM_ST_PICNUM_ADD, absDiffPicNum - 1)); } else if (picNum < picNumPred) { mfxU16 absDiffPicNum = mfxU16(picNumPred - picNum); refListMod.PushBack(RefListMod(RPLM_ST_PICNUM_SUB, absDiffPicNum - 1)); } else { assert(!"can't reorder ref list"); break; } for (mfxU32 cIdx = initList.Size(); cIdx > refIdx; cIdx--) initList[cIdx] = initList[cIdx - 1]; initList[refIdx] = modList[refIdx]; mfxU32 nIdx = refIdx + 1; for (mfxU32 cIdx = refIdx + 1; cIdx <= initList.Size(); cIdx++) if (GetPicNumF(dpb, initList[cIdx]) != picNum || dpb[initList[cIdx] & 0x7f].m_viewIdx != curViewIdx) initList[nIdx++] = initList[cIdx]; picNumPred = picNum; } } return refListMod; } namespace { bool CheckMfxExtAVCRefListsForField(mfxExtAVCRefLists const & ctrl) { bool isCorrect = true; for (mfxU8 i = 0; i < 32; i ++) { if (ctrl.RefPicList0[i].FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN) && ctrl.RefPicList0[i].PicStruct != MFX_PICSTRUCT_FIELD_TFF && ctrl.RefPicList0[i].PicStruct != MFX_PICSTRUCT_FIELD_BFF) { isCorrect = false; break; } } return isCorrect; } inline mfxI8 GetIdxOfFirstSameParity(ArrayU8x33 const & refList, mfxU32 fieldId) { for (mfxU8 i = 0; i < refList.Size(); i ++) { mfxU8 refFieldId = (refList[i] & 128) >> 7; if (fieldId == refFieldId) { return (mfxI8)i; } } return -1; } inline mfxU16 GetMaxNumRefActiveBL1(const mfxU32& targetUsage, const bool& isField) { if (isField) { mfxU16 const DEFAULT_BY_TU[] = { 0, 2, 2, 2, 2, 2, 1, 1 }; return DEFAULT_BY_TU[targetUsage]; } else { return 1; } } }; void MfxHwH264Encode::ModifyRefPicLists( MfxVideoParam const & video, DdiTask & task, mfxU32 fieldId) { ArrayDpbFrame const & dpb = task.m_dpb[fieldId]; ArrayU8x33 & list0 = task.m_list0[fieldId]; ArrayU8x33 & list1 = task.m_list1[fieldId]; mfxU32 ps = task.GetPicStructForEncode(); ArrayRefListMod & mod0 = task.m_refPicList0Mod[fieldId]; ArrayRefListMod & mod1 = task.m_refPicList1Mod[fieldId]; bool BEncToolsMode = false; #if defined(MFX_ENABLE_ENCTOOLS) mfxExtEncToolsConfig &config = GetExtBufferRef(video); BEncToolsMode = ((IsOn(config.AdaptiveRefB) || IsOn(config.AdaptiveRefP) || IsOn(config.AdaptiveLTR)) && task.m_internalListCtrlPresent && (task.GetPicStructForEncode() & MFX_PICSTRUCT_PROGRESSIVE)); #endif ArrayU8x33 initList0 = task.m_list0[fieldId]; ArrayU8x33 initList1 = task.m_list1[fieldId]; mfxI32 curPicNum = task.m_picNum[fieldId]; mfxU32 ffid = task.GetFirstField(); bool isField = (task.GetPicStructForEncode() & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) != 0; bool isIPFieldPair = (task.m_type[ ffid] & MFX_FRAMETYPE_I) && (task.m_type[!ffid] & MFX_FRAMETYPE_P); mfxExtAVCRefLists * advCtrl = GetExtBuffer(task.m_ctrl, fieldId); if ((video.mfx.GopOptFlag & MFX_GOP_CLOSED) || (task.m_frameOrderI < task.m_frameOrder && !advCtrl)) { // remove references to pictures prior to first I frame in decoding order // if gop is closed do it for all frames in gop // if gop is open do it for pictures subsequent to first I frame in display order mfxU32 firstIntraFramePoc = 2 * (task.m_frameOrderI - task.m_frameOrderIdr); list0.Erase( std::remove_if(list0.Begin(), list0.End(), LogicalAnd(RefPocIsLessThan(dpb, firstIntraFramePoc), RefIsShortTerm(dpb))), list0.End()); list1.Erase( std::remove_if(list1.Begin(), list1.End(), LogicalAnd(RefPocIsLessThan(dpb, firstIntraFramePoc), RefIsShortTerm(dpb))), list1.End()); } mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(video); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); const mfxU32 numMaxActiveRefL1 = GetMaxNumRefActiveBL1(video.mfx.TargetUsage, isField); mfxU32 numActiveRefL1 = std::min(extDdi.NumActiveRefBL1, numMaxActiveRefL1); mfxU32 numActiveRefL0 = (task.m_type[fieldId] & MFX_FRAMETYPE_P) ? extDdi.NumActiveRefP : extDdi.NumActiveRefBL0; mfxExtAVCRefListCtrl * ctrl = GetExtBuffer(task.m_ctrl); mfxExtAVCRefListCtrl ctrl_copied = {}; if (ctrl == 0 && task.m_internalListCtrlPresent && !IsAdaptiveLtrOn(video)) ctrl = &task.m_internalListCtrl; if (ctrl) ctrl_copied = *ctrl; if (advCtrl && isField) { // check ref list control structure for interlaced case // in addition WRN should be returned from sync part if passed mfxExtAVCRefLists is incorrect if (false == CheckMfxExtAVCRefListsForField(*advCtrl)) { // just ignore incorrect mfxExtAVCRefLists structure advCtrl = 0; } } if (BEncToolsMode && ((task.m_type[0] & MFX_FRAMETYPE_B) || (task.m_type[0] & MFX_FRAMETYPE_P))) { ArrayU8x33 backupList0 = list0; ArrayU8x33 backupList1 = list1; list0.Erase( std::remove_if(list0.Begin(), list0.End(), RefPocIsGreaterThan(dpb, task.GetPoc(fieldId))), list0.End()); std::sort(list0.Begin(), list0.End(), RefPocIsGreater(dpb)); if (task.m_type[0] & MFX_FRAMETYPE_B) { list1.Erase( std::remove_if(list1.Begin(), list1.End(), RefPocIsLessThan(dpb, task.GetPoc(fieldId))), list1.End()); std::sort(list1.Begin(), list1.End(), RefPocIsLess(dpb)); } // keep at least one ref pic in lists if (list0.Size() == 0) list0.PushBack(backupList0[0]); if (task.m_type[0] & MFX_FRAMETYPE_B) { if (list1.Size() == 0) list1.PushBack(backupList1[0]); } } bool bCanApplyRefCtrl = video.calcParam.numTemporalLayer == 0 || video.mfx.GopRefDist == 1; // try to customize ref pic list using provided mfxExtAVCRefListCtrl if ((ctrl || advCtrl) && bCanApplyRefCtrl) { ArrayU8x33 backupList0 = list0; bool bIntList = (ctrl == &task.m_internalListCtrl); if (task.m_type[fieldId] & MFX_FRAMETYPE_PB) { if (advCtrl) // advanced ref list control has priority { mfxU32 numActiveRefL0Final = advCtrl->NumRefIdxL0Active ? std::min(advCtrl->NumRefIdxL0Active, numActiveRefL0) : numActiveRefL0; ReorderRefPicList(list0, dpb, (mfxRefPic*)(&advCtrl->RefPicList0[0]), numActiveRefL0Final); } else { mfxU32 numActiveRefL0Final = ctrl->NumRefIdxL0Active ? std::min(ctrl->NumRefIdxL0Active, numActiveRefL0) : numActiveRefL0; ReorderRefPicList(list0, dpb, ctrl_copied, numActiveRefL0Final, !bIntList, BEncToolsMode); } } if (task.m_type[fieldId] & MFX_FRAMETYPE_B) { if (advCtrl) // advanced ref list control has priority { numActiveRefL1 = advCtrl->NumRefIdxL1Active ? std::min(advCtrl->NumRefIdxL1Active,numMaxActiveRefL1) : numActiveRefL1; ReorderRefPicList(list1, dpb, (mfxRefPic*)(&advCtrl->RefPicList1[0]), numActiveRefL1); } else { numActiveRefL1 = ctrl->NumRefIdxL1Active ? std::min(ctrl->NumRefIdxL1Active,numMaxActiveRefL1) : numActiveRefL1; ReorderRefPicList(list1, dpb, ctrl_copied, numActiveRefL1, !bIntList, BEncToolsMode); } } if (video.calcParam.numTemporalLayer > 1) { // remove references with higher temporal layer list0.Erase( std::remove_if( list0.Begin(), list0.End(), RefIsFromHigherTemporalLayer(dpb, task.m_tid)), list0.End()); } if (backupList0.Size() && list0.Size() == 0) { // ref list is empty after customization. Ignore custom ref list since driver can't correctly encode Inter frame with empty ref list list0 = backupList0; // restore ref list L0 from backup bCanApplyRefCtrl = false; assert(!"Ref list is empty after customization"); } } // form modified ref pic list using internal MSDK logic if ((ctrl == 0 && advCtrl == 0) || bCanApplyRefCtrl == false) { // prepare ref list for P-field of I/P field pair // swap 1st and 2nd entries of L0 ref pic list to use I-field of I/P pair as reference for P-field if (isIPFieldPair) { if (ps != MFX_PICSTRUCT_PROGRESSIVE && fieldId != ffid && list0.Size() > 1) std::swap(list0[0], list0[1]); } else if (task.m_type[fieldId] & MFX_FRAMETYPE_B) { ArrayU8x33 backupList0 = list0; ArrayU8x33 backupList1 = list1; list0.Erase( std::remove_if(list0.Begin(), list0.End(), RefPocIsGreaterThan(dpb, task.GetPoc(fieldId))), list0.End()); list1.Erase( std::remove_if(list1.Begin(), list1.End(), RefPocIsLessThan(dpb, task.GetPoc(fieldId))), list1.End()); // keep at least one ref pic in lists if (list0.Size() == 0) list0.PushBack(backupList0[0]); if (list1.Size() == 0) list1.PushBack(backupList1[0]); if (isField && (0 > GetIdxOfFirstSameParity(list0, fieldId))) { // revert optimization of L0 if all fields of same parity were removed from the list // it's required since driver doesn't support field of opposite parity at 1st place in ref list list0 = backupList0; } if (isField && (0 > GetIdxOfFirstSameParity(list1, fieldId))) { // revert optimization of L1 if all fields of same parity were removed from the list // it's required since driver doesn't support field of opposite parity at 1st place in ref list list1 = backupList1; } } // P and B pic's ref list need to modify if P/I flag in the DPB is true which means the sence change. // as the I treated as CRA, so the P and B field don't ref on the P field of the P/I in list0. // and the B don't ref on the I field of the P/I in list1. if ((ps != MFX_PICSTRUCT_PROGRESSIVE) && (task.m_type[fieldId] & MFX_FRAMETYPE_PB)) { mfxU8 index = 0; for (index = 0; index < dpb.Size(); index++) { if (dpb[index].m_PIFieldFlag) { if (task.GetPoc(fieldId) > dpb[index].m_poc[0]) list0.Erase( std::remove_if(list0.Begin(), list0.End(), RefPocIsLessThan(dpb, dpb[index].m_poc[!ffid])), list0.End()); else if (task.GetPoc(fieldId) < dpb[index].m_poc[0]) list1.Erase( std::remove_if(list1.Begin(), list1.End(), RefPocIsGreaterThan(dpb, dpb[index].m_poc[ffid])), list1.End()); } } } if (video.calcParam.numTemporalLayer > 0) { list0.Erase( std::remove_if(list0.Begin(), list0.End(), RefIsFromHigherTemporalLayer(dpb, task.m_tid)), list0.End()); list1.Erase( std::remove_if(list1.Begin(), list1.End(), RefIsFromHigherTemporalLayer(dpb, task.m_tid)), list1.End()); std::sort(list0.Begin(), list0.End(), RefPocIsGreater(dpb)); std::sort(list1.Begin(), list1.End(), RefPocIsLess(dpb)); if (video.calcParam.tempScalabilityMode) { // cut lists to 1 element for tempScalabilityMode list0.Resize(std::min(list0.Size(), 1u)); list1.Resize(std::min(list1.Size(), 1u)); } } else if (extOpt2.BRefType == MFX_B_REF_PYRAMID && (task.m_type[0] & MFX_FRAMETYPE_P)) { if (task.GetPicStructForEncode() & MFX_PICSTRUCT_PROGRESSIVE) { std::sort(list0.Begin(), list0.End(), RefPocIsGreater(dpb)); } else { // reorder list0 in POC descending order separately for each parity for (mfxU8* l = list0.Begin(); l < list0.End(); l++) for (mfxU8* r = l + 1; r < list0.End(); r++) if (((*l) >> 7) == ((*r) >> 7) && GetPoc(dpb, *r) > GetPoc(dpb, *l)) std::swap(*l, *r); } } if (video.calcParam.numTemporalLayer == 0 && (task.m_type[0] & MFX_FRAMETYPE_P) && task.m_internalListCtrlRefModLTR) { mfxU8 * begin = list0.Begin(); mfxU8 * end = list0.End(); mfxU8 * ltr = 0; for (; begin != end; ++begin) if (dpb[*begin & 127].m_longterm) break; ltr = begin; begin = list0.Begin(); if (ltr != end && ltr != begin) std::rotate(++begin, ltr, ltr + 1); } // cut ref pic lists according to user's limitations if (numActiveRefL0 > 0 && list0.Size() > numActiveRefL0) list0.Resize(numActiveRefL0); if (numActiveRefL1 > 0 && list1.Size() > numActiveRefL1) list1.Resize(numActiveRefL1); } initList0.Resize(list0.Size()); initList1.Resize(list1.Size()); bool bNoRefListModOpt0 = (video.calcParam.tempScalabilityMode== 0) && video.calcParam.numTemporalLayer && RefListHasLongTerm(dpb, initList0); // ref list mod syntax optimization is prohibited for SVC + LTR bool bNoRefListModOpt1 = (video.calcParam.tempScalabilityMode == 0) && video.calcParam.numTemporalLayer && RefListHasLongTerm(dpb, initList1); // ref list mod syntax optimization is prohibited for SVC + LTR mod0 = CreateRefListMod(dpb, initList0, list0, task.m_viewIdx, curPicNum, !bNoRefListModOpt0); mod1 = CreateRefListMod(dpb, initList1, list1, task.m_viewIdx, curPicNum, !bNoRefListModOpt1); } namespace { void DecideOnRefPicFlag( MfxVideoParam const & video, DdiTask & task) { mfxU32 numLayers = video.calcParam.numTemporalLayer; if (numLayers > 1) { Pair & ft = task.m_type; mfxU32 lastLayerScale = video.calcParam.scale[numLayers - 1] / video.calcParam.scale[numLayers - 2]; if (((ft[0] | ft[1]) & MFX_FRAMETYPE_REF) && // one of fields is ref pic numLayers > 1 && // more than one temporal layer lastLayerScale == 2 && // highest layer is dyadic (task.m_tidx + 1U) == numLayers) // this is the highest layer { ft[0] &= ~MFX_FRAMETYPE_REF; ft[1] &= ~MFX_FRAMETYPE_REF; } } } DpbFrame const * FindOldestRef( ArrayDpbFrame const & dpb, mfxU32 tid) { DpbFrame const * oldest = 0; DpbFrame const * i = dpb.Begin(); DpbFrame const * e = dpb.End(); for (; i != e; ++i) if (i->m_tid == tid) oldest = i; for (; i != e; ++i) if (i->m_tid == tid && i->m_frameOrder < oldest->m_frameOrder) oldest = i; return oldest; } mfxU32 CountRefs( ArrayDpbFrame const & dpb, mfxU32 tid) { mfxU32 counter = 0; for (DpbFrame const * i = dpb.Begin(), * e = dpb.End(); i != e; ++i) if (i->m_tid == tid) counter++; return counter; } void UpdateMaxLongTermFrameIdxPlus1(ArrayU8x8 & arr, mfxU8 curTidx, mfxU8 val) { std::fill(arr.Begin() + curTidx, arr.End(), val); } struct FindInDpbByExtFrameTag { FindInDpbByExtFrameTag(mfxU32 extFrameTag) : m_extFrameTag(extFrameTag) {} bool operator ()(DpbFrame const & dpbFrame) const { return dpbFrame.m_extFrameTag == m_extFrameTag; } mfxU32 m_extFrameTag; }; struct FindInDpbByFrameOrder { FindInDpbByFrameOrder(mfxU32 frameOrder) : m_frameOrder(frameOrder) {} bool operator ()(DpbFrame const & dpbFrame) const { return dpbFrame.m_frameOrder == m_frameOrder; } mfxU32 m_frameOrder; }; struct FindInDpbByLtrIdx { FindInDpbByLtrIdx(mfxU32 longTermIdx) : m_LongTermIdx(longTermIdx) {} bool operator ()(DpbFrame const & dpbFrame) const { return dpbFrame.m_longterm && dpbFrame.m_longTermIdxPlus1 == (m_LongTermIdx + 1); } mfxU32 m_LongTermIdx; }; }; bool MfxHwH264Encode::OrderByFrameNumWrap(DpbFrame const & lhs, DpbFrame const & rhs) { if (!lhs.m_longterm && !rhs.m_longterm) if (lhs.m_refBase == rhs.m_refBase) return lhs.m_frameNumWrap < rhs.m_frameNumWrap; else return lhs.m_refBase > rhs.m_refBase; else if (!lhs.m_longterm && rhs.m_longterm) return true; else if (lhs.m_longterm && !rhs.m_longterm) return false; else // both long term return lhs.m_longTermPicNum[0] < rhs.m_longTermPicNum[0]; } bool MfxHwH264Encode::OrderByFrameNumWrapKeyRef(DpbFrame const & lhs, DpbFrame const & rhs) { if (!lhs.m_longterm && !rhs.m_longterm) if (lhs.m_refBase == rhs.m_refBase) { if (lhs.m_keyRef != rhs.m_keyRef) return (lhs.m_keyRef < rhs.m_keyRef); else return lhs.m_frameNumWrap < rhs.m_frameNumWrap; } else return lhs.m_refBase > rhs.m_refBase; else if (!lhs.m_longterm && rhs.m_longterm) return true; else if (lhs.m_longterm && !rhs.m_longterm) return false; else // both long term return lhs.m_longTermPicNum[0] < rhs.m_longTermPicNum[0]; } namespace { bool OrderByDisplayOrder(DpbFrame const & lhs, DpbFrame const & rhs) { if (!lhs.m_longterm && !rhs.m_longterm) return lhs.m_frameOrder < rhs.m_frameOrder; else if (!lhs.m_longterm && rhs.m_longterm) // anti logic, sort by short term first!? return true; else if (lhs.m_longterm && !rhs.m_longterm) // anti logic, sort by short term first!? return false; else // both long term return lhs.m_frameOrder < rhs.m_frameOrder; } bool OrderByDisplayOrderKeyRef(DpbFrame const & lhs, DpbFrame const & rhs) { if (!lhs.m_longterm && !rhs.m_longterm) { if (lhs.m_keyRef != rhs.m_keyRef) return (lhs.m_keyRef < rhs.m_keyRef); else return lhs.m_frameOrder < rhs.m_frameOrder; } else if (!lhs.m_longterm && rhs.m_longterm) // anti logic, sort by short term first!? return true; else if (lhs.m_longterm && !rhs.m_longterm) // anti logic, sort by short term first!? return false; else // both long term return lhs.m_frameOrder < rhs.m_frameOrder; } struct OrderByNearestPrev { mfxU32 m_fo; OrderByNearestPrev(mfxU32 displayOrder) : m_fo(displayOrder) {} bool operator() (DpbFrame const & l, DpbFrame const & r) { return (l.m_frameOrder < m_fo) && ((r.m_frameOrder > m_fo) || ((m_fo - l.m_frameOrder) < (m_fo - r.m_frameOrder))); } }; void InitNewDpbFrame( DpbFrame & ref, DdiTask const & task, mfxU32 fid) { ref.m_poc = task.GetPoc(); ref.m_frameOrder = task.m_frameOrder; ref.m_extFrameTag = task.m_extFrameTag; ref.m_frameNum = task.m_frameNum; ref.m_frameNumWrap = task.m_frameNumWrap; ref.m_viewIdx = task.m_viewIdx; ref.m_longTermPicNum = task.m_longTermPicNum; ref.m_longTermIdxPlus1 = task.m_longTermFrameIdx + 1; ref.m_frameIdx = task.m_idxRecon; ref.m_longterm = ref.m_longTermIdxPlus1 > 0; ref.m_tid = task.m_tid; ref.m_refBase = 0; ref.m_midRec = task.m_midRec; #ifdef MFX_ENABLE_EXT ref.m_cmRaw = task.m_cmRaw; ref.m_cmRawLa = task.m_cmRawLa; ref.m_cmMb = task.m_cmMb; #endif ref.m_refPicFlag[ fid] = !!(task.m_type[ fid] & MFX_FRAMETYPE_REF); ref.m_refPicFlag[!fid] = !!(task.m_type[!fid] & MFX_FRAMETYPE_REF); if (task.m_fieldPicFlag) ref.m_refPicFlag[!fid] = 0; ref.m_keyRef = task.m_keyReference; #ifdef MFX_ENABLE_FADE_DETECTION ref.m_cmHist = task.m_cmHist; ref.m_cmHistSys = task.m_cmHistSys; #endif ref.m_midRaw = task.m_midRaw; ref.m_yuvRaw = task.m_yuv; } bool ValidateLtrForTemporalScalability( MfxVideoParam const & video, DdiTask & task) { mfxExtAVCRefListCtrl * ctrl = GetExtBuffer(task.m_ctrl); if (ctrl == 0) return true; //nothing to check if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE || video.mfx.GopRefDist > 1) { // adaptive marking is supported only for progressive encoding // adaptive marking together with temporal scalability is supported for encoding w/o B-frames only return false; } bool isValid = true; mfxU32 temporalLayer = task.m_tidx; //ArrayDpbFrame const & dpb = task.m_dpb[fieldId]; //mfxU32 nrfMinForTemporal = video.calcParam.numTemporalLayer > 1 ? mfxU16(1 << (video.calcParam.numTemporalLayer - 2)) : 1; for (mfxU32 i = 0; i < 16 && ctrl->LongTermRefList[i].FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN); i++) { isValid = false; if (temporalLayer) { // LTR request is attached to frame from not base layer assert(!"LTR is requested for frame from not base layer"); break; } if (ctrl->LongTermRefList[i].FrameOrder == task.m_extFrameTag) { // LTR is requested for current frame isValid = true; break; } } if (isValid == false) assert(!"Current frame isn't included to LTR request"); // allow application to remove frames from DPB on enhanced temporal layer // application is responsible for sending correct DPB change orders /*if (isValid == true && ctrl->RejectedRefList[0].FrameOrder != MFX_FRAMEORDER_UNKNOWN && temporalLayer) { // dpb change request is attached to frame from not base layer assert(!"DPB change request is attached to frame from not base layer"); isValid = false; }*/ return isValid; } }; void MfxHwH264Encode::MarkDecodedRefPictures( MfxVideoParam const & video, DdiTask & task, mfxU32 fid) { // declare shorter names ArrayDpbFrame const & initDpb = task.m_dpb[fid]; ArrayDpbFrame & currDpb = (fid == task.m_fid[1]) ? task.m_dpbPostEncoding : task.m_dpb[!fid]; ArrayU8x8 & maxLtIdx = currDpb.m_maxLongTermFrameIdxPlus1; mfxU32 type = task.m_type[fid]; DecRefPicMarkingInfo & marking = task.m_decRefPicMrk[fid]; // marking commands will be applied to dpbPostEncoding // initial dpb stay unchanged currDpb = initDpb; if ((type & MFX_FRAMETYPE_REF) == 0) return; // non-reference frames don't change dpb mfxExtAVCRefListCtrl const * ext_ctrl = GetExtBuffer(task.m_ctrl); mfxExtAVCRefListCtrl const * ctrl = (task.m_internalListCtrlPresent && (task.m_internalListCtrlHasPriority || !ext_ctrl)) ? &task.m_internalListCtrl : ext_ctrl; bool useInternalFrameOrder = false; if (ctrl && ctrl == &task.m_internalListCtrl) useInternalFrameOrder = true; if (video.calcParam.numTemporalLayer > 0 && false == ValidateLtrForTemporalScalability(video, task)) ctrl = 0; // requested changes in dpb conflict with temporal scalability. Ignore requested dpb changes if (type & MFX_FRAMETYPE_IDR) { currDpb.Resize(0); UpdateMaxLongTermFrameIdxPlus1(maxLtIdx, 0, 0); marking.long_term_reference_flag = 0; if (ctrl ) { for (mfxU32 i = 0; i < 16 && ctrl->LongTermRefList[i].FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN); i++) { if (ctrl->LongTermRefList[i].FrameOrder == (useInternalFrameOrder ? task.m_frameOrder : task.m_extFrameTag)) { marking.long_term_reference_flag = 1; task.m_longTermFrameIdx = 0; break; } } } DpbFrame newDpbFrame; InitNewDpbFrame(newDpbFrame, task, fid); currDpb.PushBack(newDpbFrame); if (task.m_storeRefBasePicFlag) { newDpbFrame.m_refBase = 1; currDpb.PushBack(newDpbFrame); } UpdateMaxLongTermFrameIdxPlus1(maxLtIdx, 0, marking.long_term_reference_flag); } else { mfxU32 ffid = task.GetFirstField(); bool currFrameIsAddedToDpb = (fid != ffid) && (task.m_type[ffid] & MFX_FRAMETYPE_REF); // collect used long-term frame indices ArrayU8x16 usedLtIdx; usedLtIdx.Resize(16, 0); for (mfxU32 i = 0; i < initDpb.Size(); i++) if (initDpb[i].m_longTermIdxPlus1 > 0) usedLtIdx[initDpb[i].m_longTermIdxPlus1 - 1] = 1; // check longterm list // when frameOrder is sent first time corresponding 'short-term' reference is marked 'long-term' if (ctrl ) { for (mfxU32 i = 0; i < 16 && ctrl->RejectedRefList[i].FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN); i++) { DpbFrame * ref = currDpb.End(); if (!useInternalFrameOrder) { ref = std::find_if( currDpb.Begin(), currDpb.End(), FindInDpbByExtFrameTag(ctrl->RejectedRefList[i].FrameOrder)); } else { ref = std::find_if( currDpb.Begin(), currDpb.End(), FindInDpbByFrameOrder(ctrl->RejectedRefList[i].FrameOrder)); } if (ref != currDpb.End()) { if (ref->m_longterm) { // adaptive marking for long-term references is supported only for progressive encoding assert(task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE); marking.PushBack(MMCO_LT_TO_UNUSED, ref->m_longTermPicNum[0]); usedLtIdx[ref->m_longTermIdxPlus1 - 1] = 0; } else { marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - ref->m_picNum[0] - 1); if (task.GetPicStructForEncode() & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) { // second field should be removed from DPB as well marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - ref->m_picNum[1] - 1); } } //printf("delete rejected from dpb for task %d: %d\n", // task.m_frameOrder, ref->m_frameOrder); currDpb.Erase(ref); } } for (mfxU32 i = 0; i < 16 && ctrl->LongTermRefList[i].FrameOrder != static_cast(MFX_FRAMEORDER_UNKNOWN); i++) { // adaptive marking for long-term references is supported only for progressive encoding assert(task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE); DpbFrame * ref = currDpb.End(); if (!useInternalFrameOrder) { ref = std::find_if( currDpb.Begin(), currDpb.End(), FindInDpbByExtFrameTag(ctrl->LongTermRefList[i].FrameOrder)); } else { ref = std::find_if( currDpb.Begin(), currDpb.End(), FindInDpbByFrameOrder(ctrl->LongTermRefList[i].FrameOrder)); } if (video.calcParam.numTemporalLayer == 0 && // for temporal scalability only current frame could be marked as LTR ref != currDpb.End() && ref->m_longterm == 0) { // find free long-term frame index mfxU8 longTermIdx = mfxU8(std::find(usedLtIdx.Begin(), usedLtIdx.End(), 0) - usedLtIdx.Begin()); assert(longTermIdx != usedLtIdx.Size()); if (longTermIdx == usedLtIdx.Size()) break; if (longTermIdx >= maxLtIdx[task.m_tidx]) { // need to update MaxLongTermFrameIdx assert(longTermIdx < video.mfx.NumRefFrame); marking.PushBack(MMCO_SET_MAX_LT_IDX, longTermIdx + 1); UpdateMaxLongTermFrameIdxPlus1(maxLtIdx, task.m_tidx, longTermIdx + 1); } marking.PushBack(MMCO_ST_TO_LT, task.m_picNum[fid] - ref->m_picNum[0] - 1, longTermIdx); usedLtIdx[longTermIdx] = 1; ref->m_longTermIdxPlus1 = longTermIdx + 1; ref->m_longterm = 1; } else if (ctrl->LongTermRefList[i].FrameOrder == (useInternalFrameOrder ? task.m_frameOrder : task.m_extFrameTag)) { // frame is not in dpb, but it is a current frame // mark it as 'long-term' mfxU8 longTermIdx; if (ctrl->ApplyLongTermIdx != 1) { // first make free space in dpb if it is full if (currDpb.Size() == video.mfx.NumRefFrame) { DpbFrame * toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByFrameNumWrap); assert(toRemove != currDpb.End()); if (toRemove == currDpb.End()) break; if (toRemove->m_longterm == 1) { // no short-term reference in dpb // remove oldest long-term toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByDisplayOrder); assert(toRemove->m_longterm == 1); // must be longterm ref marking.PushBack(MMCO_LT_TO_UNUSED, toRemove->m_longTermPicNum[0]); usedLtIdx[toRemove->m_longTermIdxPlus1 - 1] = 0; } else { marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - toRemove->m_picNum[0] - 1); } currDpb.Erase(toRemove); } // find free long-term frame index longTermIdx = mfxU8(std::find(usedLtIdx.Begin(), usedLtIdx.End(), 0) - usedLtIdx.Begin()); assert(longTermIdx != usedLtIdx.Size()); if (longTermIdx == usedLtIdx.Size()) break; } else { // use LTR idx provided by application longTermIdx = (mfxU8)ctrl->LongTermRefList[i].LongTermIdx; // don't validate input, just perform quick check assert(longTermIdx < video.mfx.NumRefFrame); DpbFrame * toRemove = std::find_if( currDpb.Begin(), currDpb.End(), FindInDpbByLtrIdx(longTermIdx)); if (toRemove == currDpb.End() && currDpb.Size() == video.mfx.NumRefFrame) { toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByFrameNumWrap); if (toRemove != currDpb.End()) { if (toRemove->m_longterm) toRemove = currDpb.End(); else marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - toRemove->m_picNum[0] - 1); } } if (toRemove != currDpb.End()) currDpb.Erase(toRemove); assert(currDpb.Size() < video.mfx.NumRefFrame); } if (longTermIdx >= maxLtIdx[task.m_tidx]) { // need to update MaxLongTermFrameIdx assert(longTermIdx < video.mfx.NumRefFrame); marking.PushBack(MMCO_SET_MAX_LT_IDX, longTermIdx + 1); UpdateMaxLongTermFrameIdxPlus1(maxLtIdx, task.m_tidx, longTermIdx + 1); } marking.PushBack(MMCO_CURR_TO_LT, longTermIdx); usedLtIdx[longTermIdx] = 1; task.m_longTermFrameIdx = longTermIdx; DpbFrame newDpbFrame; InitNewDpbFrame(newDpbFrame, task, fid); currDpb.PushBack(newDpbFrame); assert(currDpb.Size() <= video.mfx.NumRefFrame); currFrameIsAddedToDpb = true; } } } // if first field was a reference then entire frame is already in dpb if (!currFrameIsAddedToDpb) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); for (mfxU32 refBase = 0; refBase <= task.m_storeRefBasePicFlag; refBase++) { if (currDpb.Size() == video.mfx.NumRefFrame) { DpbFrame * toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByFrameNumWrapKeyRef); DpbFrame * toRemoveDefault = std::min_element(currDpb.Begin(), currDpb.End(), OrderByFrameNumWrap); if (toRemove != currDpb.End() && extOpt2.BRefType == MFX_B_REF_PYRAMID) { toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByDisplayOrderKeyRef); } assert(toRemove != currDpb.End()); if (toRemove == currDpb.End()) return; //printf("delete from dpb for task %d: %d\n", task.m_frameOrder, toRemove->m_frameOrder); if (toRemove->m_longterm == 1) { // no short-term reference in dpb // remove oldest long-term toRemove = std::min_element(currDpb.Begin(), currDpb.End(), OrderByDisplayOrder); assert(toRemove->m_longterm == 1); // must be longterm ref marking.PushBack(MMCO_LT_TO_UNUSED, toRemove->m_longTermPicNum[0]); usedLtIdx[toRemove->m_longTermIdxPlus1 - 1] = 0; } else if (marking.mmco.Size() > 0 || toRemove != toRemoveDefault) { // already have mmco commands, sliding window will not be invoked // remove oldest short-term manually marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - toRemove->m_picNum[0] - 1); if (task.m_fieldPicFlag) marking.PushBack(MMCO_ST_TO_UNUSED, task.m_picNum[fid] - toRemove->m_picNum[1] - 1); } currDpb.Erase(toRemove); } DpbFrame newDpbFrame; InitNewDpbFrame(newDpbFrame, task, fid); newDpbFrame.m_refBase = (mfxU8)refBase; currDpb.PushBack(newDpbFrame); assert(currDpb.Size() <= video.mfx.NumRefFrame); } } } } namespace { mfxStatus CreateAdditionalDpbCommands( MfxVideoParam const & video, DdiTask & task) { if (task.m_internalListCtrlPresent && video.calcParam.numTemporalLayer == 0) return MFX_ERR_NONE; task.m_internalListCtrlPresent = false; task.m_internalListCtrlHasPriority = true; task.m_internalListCtrlRefModLTR = false; InitExtBufHeader(task.m_internalListCtrl); mfxU32 numLayers = video.calcParam.numTemporalLayer; mfxU32 refPicFlag = !!((task.m_type[0] | task.m_type[1]) & MFX_FRAMETYPE_REF); if (refPicFlag && // only ref frames occupy slot in dpb video.calcParam.tempScalabilityMode == 0 && // no long term refs in temporal scalability numLayers > 1 && (task.m_tidx + 1U) != numLayers) // no dpb commands for last-not-based temporal laeyr { // find oldest ref frame from the same temporal layer DpbFrame const * toRemove = FindOldestRef(task.m_dpb[0], task.m_tid); if (toRemove == 0 && task.m_dpb[0].Size() == video.mfx.NumRefFrame) { // no ref frame from same layer but need to free dpb slot // look for oldest frame from the highest layer toRemove = FindOldestRef(task.m_dpb[0], numLayers - 1); assert(toRemove != 0); } if (video.mfx.GopRefDist > 1 && // B frames present task.m_tidx == 0 && // base layer CountRefs(task.m_dpb[0], 0) < 2 && // 0 or 1 refs from base layer task.m_dpb[0].Size() < video.mfx.NumRefFrame) // dpb is not full yet { // this is to keep 2 references from base layer for B frames at next layer toRemove = 0; } if (toRemove) { task.m_internalListCtrl.RejectedRefList[0].FrameOrder = toRemove->m_frameOrder; task.m_internalListCtrl.RejectedRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } task.m_internalListCtrl.LongTermRefList[0].FrameOrder = task.m_frameOrder; task.m_internalListCtrl.LongTermRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; task.m_internalListCtrlPresent = true; } else if (refPicFlag && IsAdaptiveLtrOn(video)) { mfxExtCodingOptionDDI const * extDdi = GetExtBuffer(video); MFX_CHECK_NULL_PTR1(extDdi); mfxU32 numActiveRefL0 = (task.m_type[0] & MFX_FRAMETYPE_P) ? extDdi->NumActiveRefP : extDdi->NumActiveRefBL0; if ((task.m_type[0] & MFX_FRAMETYPE_IDR) && task.m_frameLtrOff == 0) { task.m_internalListCtrl.LongTermRefList[0].FrameOrder = task.m_frameOrder; task.m_internalListCtrl.LongTermRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; task.m_internalListCtrlPresent = true; task.m_internalListCtrlHasPriority = false; task.m_LtrOrder = task.m_frameOrder; } else if ((task.m_type[0] & MFX_FRAMETYPE_REF) && task.m_frameLtrOff == 0 && task.m_frameLtrReassign != 1 && numActiveRefL0 > 1 && (numActiveRefL0 < video.mfx.NumRefFrame || video.mfx.NumRefFrame > 2)) { DpbFrame const * ltr = 0; DpbFrame const * i = task.m_dpb[0].Begin(); DpbFrame const * e = task.m_dpb[0].End(); DpbFrame const * p = &task.m_dpb[0].Back(); for (; i != e; ++i) { if (i->m_longterm) ltr = i; } if (ltr && ltr->m_frameOrder != p->m_frameOrder) { task.m_internalListCtrlRefModLTR = true; } } else if (task.m_frameLtrOff == 1) { DpbFrame const * ltr = 0; DpbFrame const * i = task.m_dpb[0].Begin(); DpbFrame const * e = task.m_dpb[0].End(); for (; i != e; ++i) { if (i->m_longterm) ltr = i; } if (ltr) { task.m_internalListCtrl.RejectedRefList[0].FrameOrder = ltr->m_frameOrder; task.m_internalListCtrl.RejectedRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; task.m_internalListCtrlPresent = true; task.m_internalListCtrlHasPriority = false; task.m_LtrOrder = -1; task.m_LtrQp = 0; } } else if ((task.m_type[0] & MFX_FRAMETYPE_P) && task.m_frameLtrReassign == 1 && task.m_frameLtrOff == 0) { DpbFrame const * ref = 0; DpbFrame const * i = task.m_dpb[0].Begin(); DpbFrame const * e = task.m_dpb[0].End(); DpbFrame const * p = &task.m_dpb[0].Back(); for (; i != e; ++i) { if ((mfxI32)i->m_frameOrder == task.m_RefOrder) ref = i; } if (ref) { DpbFrame const * ltr = 0; i = task.m_dpb[0].Begin(); for (; i != e; ++i) { if (i->m_longterm) ltr = i; } if (ltr && (mfxI32)ltr->m_frameOrder == (mfxI32)task.m_LtrOrder) { task.m_internalListCtrl.RejectedRefList[0].FrameOrder = ltr->m_frameOrder; task.m_internalListCtrl.RejectedRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; task.m_internalListCtrl.LongTermRefList[0].FrameOrder = task.m_RefOrder; task.m_internalListCtrl.LongTermRefList[0].PicStruct = MFX_PICSTRUCT_PROGRESSIVE; task.m_internalListCtrlPresent = true; task.m_internalListCtrlHasPriority = false; task.m_LtrOrder = task.m_RefOrder; task.m_LtrQp = task.m_RefQp; if (numActiveRefL0 > 1 && (numActiveRefL0 < video.mfx.NumRefFrame || video.mfx.NumRefFrame > 2) && ref->m_frameOrder != p->m_frameOrder) { task.m_internalListCtrlRefModLTR = true; } } } } } return MFX_ERR_NONE; } }; DdiTaskIter MfxHwH264Encode::ReorderFrame( ArrayDpbFrame const & dpb, DdiTaskIter begin, DdiTaskIter end) { // [begin, end) range of frames is in display order DdiTaskIter top = begin; while (top != end && // go thru buffered frames in display order and (top->GetFrameType() & MFX_FRAMETYPE_B) && // get earliest non-B frame CountFutureRefs(dpb, top->m_frameOrder) == 0) // or B frame with L1 reference { ++top; } if (top != end && (top->GetFrameType() & MFX_FRAMETYPE_B)) { // special case for B frames (when B pyramid is enabled) DdiTaskIter i = top; while (++i != end && // check remaining (i->GetFrameType() & MFX_FRAMETYPE_B) && // B frames (i->m_loc.miniGopCount == top->m_loc.miniGopCount)) // from the same mini-gop { if (top->m_loc.encodingOrder > i->m_loc.encodingOrder) top = i; } } return top; } DdiTaskIter MfxHwH264Encode::ReorderFrame( ArrayDpbFrame const & dpb, DdiTaskIter begin, DdiTaskIter end, bool gopStrict, bool flush, bool closeGopForSceneChange) { DdiTaskIter top = ReorderFrame(dpb, begin, end); DdiTaskIter prev = top; if(prev != end && prev != begin){ //special case for custom IDR frame --prev; //we just change previous B-frame to P-frame if((top->m_ctrl.FrameType & MFX_FRAMETYPE_IDR || ((top->m_ctrl.FrameType & MFX_FRAMETYPE_I) && closeGopForSceneChange && top->m_SceneChange) // Also Do it for scene change I frame || ((top->m_ctrl.FrameType & MFX_FRAMETYPE_P) && closeGopForSceneChange && top->m_SceneChange)) // Also Do it for scene change B-> P frame && prev->GetFrameType() & MFX_FRAMETYPE_B && !gopStrict) { prev->m_type[0] = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; prev->m_type[1] = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; top = prev; } } if (flush && top == end && begin != end) { if (gopStrict) { top = begin; } else { top = end; --top; assert(top->GetFrameType() & MFX_FRAMETYPE_B); top->m_type[0] = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; top->m_type[1] = MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; top = ReorderFrame(dpb, begin, end); assert(top != end || begin == end); } } else if (prev != end &&!top->m_frameLtrOff && top->m_ctrl.FrameType & MFX_FRAMETYPE_IDR) { // Mini LA DdiTaskIter next = top; ++next; while (next != end) { if (next->m_SceneChange) top->m_frameLtrOff = 1; ++next; } } return top; } PairU8 MfxHwH264Encode::GetFrameType( MfxVideoParam const & video, mfxU32 frameOrder) { mfxU32 gopOptFlag = video.mfx.GopOptFlag; mfxU32 gopPicSize = video.mfx.GopPicSize; mfxU32 gopRefDist = video.mfx.GopRefDist; mfxU32 idrPicDist = gopPicSize * (video.mfx.IdrInterval + 1); if (gopPicSize == 0xffff) //infinite GOP idrPicDist = gopPicSize = 0xffffffff; if (frameOrder % idrPicDist == 0) return ExtendFrameType(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR); if (frameOrder % gopPicSize == 0) return ExtendFrameType(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF); if (frameOrder % gopPicSize % gopRefDist == 0) return ExtendFrameType(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); if ((gopOptFlag & MFX_GOP_STRICT) == 0) if (((frameOrder + 1) % gopPicSize == 0 && (gopOptFlag & MFX_GOP_CLOSED)) || (frameOrder + 1) % idrPicDist == 0) return ExtendFrameType(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); // switch last B frame to P frame return ExtendFrameType(MFX_FRAMETYPE_B); } IntraRefreshState MfxHwH264Encode::GetIntraRefreshState( MfxVideoParam const & video, mfxU32 frameOrderInGopDispOrder, mfxEncodeCtrl const * ctrl, mfxU16 intraStripeWidthInMBs, SliceDivider & divider, MFX_ENCODE_CAPS caps) { IntraRefreshState state; mfxExtCodingOption2 & extOpt2Init = GetExtBufferRef(video); mfxExtCodingOption3 & extOpt3Init = GetExtBufferRef(video); state.firstFrameInCycle = false; if (extOpt2Init.IntRefType == 0) return state; // set QP for Intra macroblocks within refreshing line state.IntRefQPDelta = extOpt2Init.IntRefQPDelta; if (ctrl) { mfxExtCodingOption2 * extOpt2Runtime = GetExtBuffer(*ctrl); if (extOpt2Runtime && extOpt2Runtime->IntRefQPDelta <= 51 && extOpt2Runtime->IntRefQPDelta >= -51) state.IntRefQPDelta = extOpt2Runtime->IntRefQPDelta; } if (extOpt2Init.IntRefType == MFX_REFRESH_SLICE) { if (mfxI32(frameOrderInGopDispOrder - 1) < 0) { // reset divider on I frames bool fieldCoding = (video.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; divider = MakeSliceDivider( (caps.ddi_caps.SliceLevelRateCtrl) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(caps.ddi_caps.SliceStructure), extOpt2Init.NumMbPerSlice, extOpt3Init.NumSliceP, video.mfx.FrameInfo.Width / 16, video.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); return state; } if (mfxI32(frameOrderInGopDispOrder - 1) < 0) return state; state.firstFrameInCycle = extOpt3Init.IntRefCycleDist ? (((frameOrderInGopDispOrder - 1) % extOpt3Init.IntRefCycleDist == 0) && frameOrderInGopDispOrder) : (((frameOrderInGopDispOrder - 1) % extOpt3Init.NumSliceP == 0) && frameOrderInGopDispOrder); state.IntraSize = ((USHORT)divider.GetNumMbInSlice() / (video.mfx.FrameInfo.Width >> 4)); state.IntraLocation = ((USHORT)divider.GetFirstMbInSlice() / (video.mfx.FrameInfo.Width >> 4)); if ((state.IntraLocation == 0) && (!state.firstFrameInCycle)) { state.IntraSize = 0; // no refresh between cycles } else { state.refrType = extOpt2Init.IntRefType; if (!divider.Next()) { bool fieldCoding = (video.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0; divider = MakeSliceDivider( (caps.ddi_caps.SliceLevelRateCtrl) ? SliceDividerType::ARBITRARY_MB_SLICE : SliceDividerType(caps.ddi_caps.SliceStructure), extOpt2Init.NumMbPerSlice, extOpt3Init.NumSliceP, video.mfx.FrameInfo.Width / 16, video.mfx.FrameInfo.Height / 16 / (fieldCoding ? 2 : 1)); } } return state; } mfxU32 refreshPeriod = extOpt3Init.IntRefCycleDist ? extOpt3Init.IntRefCycleDist : extOpt2Init.IntRefCycleSize; mfxU32 offsetFromStartOfGop = extOpt3Init.IntRefCycleDist ? refreshPeriod : 1; // 1st refresh cycle in GOP starts with offset mfxI32 frameOrderMinusOffset = frameOrderInGopDispOrder - offsetFromStartOfGop; if (frameOrderMinusOffset < 0) return state; // too early to start refresh mfxU32 frameOrderInRefreshPeriod = frameOrderMinusOffset % refreshPeriod; if (frameOrderInRefreshPeriod >= extOpt2Init.IntRefCycleSize) return state; // for current refresh period refresh cycle is already passed // check if Intra refresh required for current frame mfxU32 refreshDimension = extOpt2Init.IntRefType == MFX_REFRESH_HORIZONTAL ? video.mfx.FrameInfo.Height >> 4 : video.mfx.FrameInfo.Width >> 4; mfxU32 numFramesWithoutRefresh = extOpt2Init.IntRefCycleSize - (refreshDimension + intraStripeWidthInMBs - 1) / intraStripeWidthInMBs; mfxU32 idxInRefreshCycle = frameOrderInRefreshPeriod; state.firstFrameInCycle = (idxInRefreshCycle == 0); mfxI32 idxInActualRefreshCycle = idxInRefreshCycle - numFramesWithoutRefresh; if (idxInActualRefreshCycle < 0) return state; // actual refresh isn't started yet within current refresh cycle, no Intra column/row required for current frame state.refrType = extOpt2Init.IntRefType; state.IntraSize = intraStripeWidthInMBs; state.IntraLocation = (mfxU16)idxInActualRefreshCycle * intraStripeWidthInMBs; return state; } mfxStatus MfxHwH264Encode::UpdateIntraRefreshWithoutIDR( MfxVideoParam const & oldPar, MfxVideoParam const & newPar, mfxU32 baseLayerOrder, mfxI64 oldStartFrame, mfxI64 & updatedStartFrame, mfxU16 & updatedStripeWidthInMBs, SliceDivider & divider, MFX_ENCODE_CAPS caps) { MFX_CHECK_WITH_ASSERT((oldPar.mfx.FrameInfo.Width == newPar.mfx.FrameInfo.Width) && (oldPar.mfx.FrameInfo.Height == newPar.mfx.FrameInfo.Height), MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtCodingOption2 & extOpt2Old = GetExtBufferRef(oldPar); mfxExtCodingOption2 & extOpt2New = GetExtBufferRef(newPar); mfxExtCodingOption3 & extOpt3Old = GetExtBufferRef(oldPar); mfxExtCodingOption3 & extOpt3New = GetExtBufferRef(newPar); MFX_CHECK_WITH_ASSERT(extOpt2New.IntRefType && extOpt2New.IntRefCycleSize, MFX_ERR_UNDEFINED_BEHAVIOR); mfxU16 refreshDimension = extOpt2New.IntRefType == MFX_REFRESH_HORIZONTAL ? newPar.mfx.FrameInfo.Height >> 4 : newPar.mfx.FrameInfo.Width >> 4; updatedStripeWidthInMBs = (refreshDimension + extOpt2New.IntRefCycleSize - 1) / extOpt2New.IntRefCycleSize; if ((!extOpt2Old.IntRefType) || (extOpt2Old.IntRefType == MFX_REFRESH_SLICE)) { updatedStartFrame = baseLayerOrder - (extOpt3New.IntRefCycleDist ? extOpt3New.IntRefCycleDist : 1); return MFX_ERR_NONE; } mfxU16 oldRefreshDimension = extOpt2Old.IntRefType == MFX_REFRESH_HORIZONTAL ? newPar.mfx.FrameInfo.Height >> 4 : newPar.mfx.FrameInfo.Width >> 4; mfxU16 oldStripeWidthInMBs = (oldRefreshDimension + extOpt2Old.IntRefCycleSize - 1) / extOpt2Old.IntRefCycleSize; IntraRefreshState oldIRState = MfxHwH264Encode::GetIntraRefreshState( oldPar, mfxU32(baseLayerOrder - oldStartFrame), 0, oldStripeWidthInMBs, divider, caps); if ( extOpt2New.IntRefType != extOpt2Old.IntRefType || (!oldIRState.IntraLocation && !oldIRState.firstFrameInCycle)) { if (!extOpt3New.IntRefCycleDist) { updatedStartFrame = baseLayerOrder - 1; } else { mfxU16 oldIRProgressInFrames = extOpt3Old.IntRefCycleDist ? (baseLayerOrder % extOpt3Old.IntRefCycleDist) : 0; if (!oldIRProgressInFrames || oldIRState.IntraLocation) { oldIRProgressInFrames += (mfxU16)(extOpt3Old.IntRefCycleDist < baseLayerOrder ? extOpt3Old.IntRefCycleDist : baseLayerOrder); } if (extOpt3New.IntRefCycleDist < oldIRProgressInFrames || !oldIRProgressInFrames) { updatedStartFrame = baseLayerOrder - extOpt3New.IntRefCycleDist; } else { updatedStartFrame = baseLayerOrder - oldIRProgressInFrames; } } } else if (extOpt3Old.IntRefCycleDist || extOpt3New.IntRefCycleDist) { if (oldIRState.IntraLocation) { updatedStartFrame = baseLayerOrder - ((oldIRState.IntraLocation + updatedStripeWidthInMBs - 1) / updatedStripeWidthInMBs); } else //if (oldIRState.firstFrameInCycle || !extOpt3New->IntRefCycleDist) { updatedStartFrame = baseLayerOrder; } if ( extOpt3New.IntRefCycleDist > extOpt3Old.IntRefCycleDist && extOpt3Old.IntRefCycleDist > extOpt2Old.IntRefCycleSize) { updatedStartFrame += (extOpt3New.IntRefCycleDist - extOpt3Old.IntRefCycleDist); } if (extOpt3New.IntRefCycleDist) { updatedStartFrame = (updatedStartFrame % extOpt3New.IntRefCycleDist) - extOpt3New.IntRefCycleDist; } else { updatedStartFrame--; } } else { mfxU16 updatedNumFramesWithoutRefresh = extOpt2New.IntRefCycleSize - (refreshDimension + updatedStripeWidthInMBs - 1) / updatedStripeWidthInMBs; mfxU16 newIRProgressInFrames = oldIRState.IntraLocation / updatedStripeWidthInMBs + updatedNumFramesWithoutRefresh + 1; updatedStartFrame = baseLayerOrder - newIRProgressInFrames; } return MFX_ERR_NONE; } DdiTaskIter MfxHwH264Encode::FindFrameToStartEncode( MfxVideoParam const & video, DdiTaskIter begin, DdiTaskIter end) { if (/*video.mfx.RateControlMethod != MFX_RATECONTROL_LA &&*/ video.mfx.RateControlMethod != MFX_RATECONTROL_CQP || video.AsyncDepth == 1) return begin; // in case of CQP optimization is applied // dependency between ENC and PAK is removed by encoding reference P frame earlier DdiTaskIter first = begin; DdiTaskIter second = ++begin; if (first == end || second == end) return first; if ((first ->GetFrameType() & MFX_FRAMETYPE_B) && (second->GetFrameType() & MFX_FRAMETYPE_P) && (second->m_frameNum == first->m_frameNum)) return second; return first; } DdiTaskIter MfxHwH264Encode::FindFrameToWaitEncode( DdiTaskIter begin, DdiTaskIter end) { if (begin == end) return begin; DdiTaskIter oldest = begin; for (++begin; begin != end; ++begin) if (oldest->m_encOrder > begin->m_encOrder) oldest = begin; return oldest; } DdiTaskIter MfxHwH264Encode::FindFrameToWaitEncodeNext( DdiTaskIter begin, DdiTaskIter end, DdiTaskIter cur) { if (begin == end) return cur; DdiTaskIter oldest = cur; for (;begin != end; ++begin) if (((oldest->m_encOrder > begin->m_encOrder)&&(oldest != cur)) || ( (oldest == cur) && (begin->m_encOrder > cur->m_encOrder))) oldest = begin; return oldest; } namespace { mfxU32 GetEncodingOrder(mfxU32 displayOrder, mfxU32 begin, mfxU32 end, mfxU32 &level, mfxU32 before, bool & ref) { assert(displayOrder >= begin); assert(displayOrder < end); ref = (end - begin > 1); mfxU32 pivot = (begin + end) / 2; if (displayOrder == pivot) return level + before; level ++; if (displayOrder < pivot) return GetEncodingOrder(displayOrder, begin, pivot, level , before, ref); else return GetEncodingOrder(displayOrder, pivot + 1, end, level, before + pivot - begin, ref); } }; BiFrameLocation MfxHwH264Encode::GetBiFrameLocation( MfxVideoParam const & video, mfxU32 frameOrder, mfxU32 currGopRefDist, mfxU32 miniGOPCount) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxU32 gopPicSize = video.mfx.GopPicSize; mfxU32 biPyramid = extOpt2.BRefType; BiFrameLocation loc; currGopRefDist = (currGopRefDist > 0) ? std::min(currGopRefDist, video.mfx.GopRefDist) : video.mfx.GopRefDist; if (gopPicSize == 0xffff) //infinite GOP gopPicSize = 0xffffffff; if (biPyramid != MFX_B_REF_OFF) { bool ref = false; mfxU32 orderInMiniGop = std::max(frameOrder % gopPicSize % currGopRefDist, 1) - 1; loc.level = 1; loc.encodingOrder = GetEncodingOrder(orderInMiniGop, 0, currGopRefDist - 1, loc.level ,0, ref); loc.miniGopCount = miniGOPCount; loc.refFrameFlag = mfxU16(ref ? MFX_FRAMETYPE_REF : 0); } return loc; } void MfxHwH264Encode::ConfigureTask( DdiTask & task, DdiTask const & prevTask, MfxVideoParam const & video, MFX_ENCODE_CAPS const & caps) { mfxExtCodingOption const & extOpt = GetExtBufferRef(video); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); mfxExtCodingOption2 const * extOpt2Runtime = GetExtBuffer(task.m_ctrl); mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(video); mfxExtSpsHeader const & extSps = GetExtBufferRef(video); #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX mfxExtPpsHeader const & extPps = GetExtBufferRef(video); #endif mfxExtAvcTemporalLayers const & extTemp = GetExtBufferRef(video); mfxExtEncoderROI const & extRoi = GetExtBufferRef(video); mfxExtEncoderROI const * extRoiRuntime = GetExtBuffer(task.m_ctrl); mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(video); mfxExtDirtyRect const * extDirtyRect = GetExtBuffer(video); mfxExtDirtyRect const * extDirtyRectRuntime = GetExtBuffer(task.m_ctrl); mfxExtMoveRect const * extMoveRect = GetExtBuffer(video); mfxExtMoveRect const * extMoveRectRuntime = GetExtBuffer(task.m_ctrl); mfxU32 const FRAME_NUM_MAX = 1 << (extSps.log2MaxFrameNumMinus4 + 4); mfxU32 ffid = task.m_fid[0]; mfxU32 sfid = !ffid; // in order not to affect original GetFrameType, add P/I field flag bool isPIFieldPair = (task.m_type[ffid] & MFX_FRAMETYPE_P) && (task.m_type[!ffid] & MFX_FRAMETYPE_I); bool isPrevPIFieldPair = (prevTask.m_type[ffid] & MFX_FRAMETYPE_P) && (prevTask.m_type[!ffid] & MFX_FRAMETYPE_I); mfxU32 numReorderFrames = GetNumReorderFrames(video); mfxU32 prevsfid = prevTask.m_fid[1]; mfxU8 idrPicFlag = !!(task.GetFrameType() & MFX_FRAMETYPE_IDR); mfxU8 intraPicFlag = !!(task.GetFrameType() & MFX_FRAMETYPE_I) ? 1 : (isPIFieldPair ? 1 : 0); mfxU8 prevIdrFrameFlag = !!(prevTask.GetFrameType() & MFX_FRAMETYPE_IDR); mfxU8 prevIFrameFlag = !!(prevTask.GetFrameType() & MFX_FRAMETYPE_I) ? 1 : (isPrevPIFieldPair ? 1 : 0); mfxU8 prevRefPicFlag = !!(prevTask.GetFrameType() & MFX_FRAMETYPE_REF); mfxU8 prevIdrPicFlag = !!(prevTask.m_type[prevsfid] & MFX_FRAMETYPE_IDR); mfxU8 frameNumIncrement = (prevRefPicFlag || prevTask.m_nalRefIdc[0]) ? 1 : 0; mfxU16 SkipMode = extOpt2Runtime ? extOpt2Runtime->SkipFrame : extOpt2.SkipFrame; task.m_frameOrderIdr = idrPicFlag ? task.m_frameOrder : prevTask.m_frameOrderIdr; task.m_frameOrderI = intraPicFlag ? task.m_frameOrder : prevTask.m_frameOrderI; task.m_encOrder = prevTask.m_encOrder + 1; task.m_encOrderIdr = prevIdrFrameFlag ? prevTask.m_encOrder : prevTask.m_encOrderIdr; task.m_encOrderI = prevIFrameFlag ? prevTask.m_encOrder : prevTask.m_encOrderI; task.m_isUseRawRef = IsOn(extOpt2.UseRawRef); task.m_isSkipped = false; if (task.m_isUseRawRef && extOpt2Runtime) task.m_isUseRawRef = !IsOff(extOpt2Runtime->UseRawRef); task.m_frameNum = mfxU16((prevTask.m_frameNum + frameNumIncrement) % FRAME_NUM_MAX); if (idrPicFlag) task.m_frameNum = 0; task.m_picNum[0] = task.m_frameNum * (task.m_fieldPicFlag + 1) + task.m_fieldPicFlag; task.m_picNum[1] = task.m_picNum[0]; task.m_idrPicId = prevTask.m_idrPicId + idrPicFlag; mfxU32 prevBPSeiFrameEncOrder = (extOpt2.BufferingPeriodSEI == MFX_BPSEI_IFRAME) ? task.m_encOrderI : task.m_encOrderIdr; mfxU32 insertBPSei = (extOpt2.BufferingPeriodSEI == MFX_BPSEI_IFRAME && intraPicFlag) || (idrPicFlag); task.m_dpbOutputDelay = 2 * (task.m_frameOrder + numReorderFrames - task.m_encOrder); task.m_cpbRemoval[ffid] = 2 * (task.m_encOrder - prevBPSeiFrameEncOrder); task.m_cpbRemoval[sfid] = (insertBPSei) ? 1 : task.m_cpbRemoval[ffid] + 1; if (video.calcParam.tempScalabilityMode) task.m_tidx = CalcTemporalLayerIndex(video, task.m_frameOrder - task.m_frameOrderStartTScalStructure); else task.m_tidx = CalcTemporalLayerIndex(video, task.m_frameOrder - task.m_frameOrderIdrInDisplayOrder); task.m_tid = video.calcParam.tid[task.m_tidx]; task.m_pid = task.m_tidx + extTemp.BaseLayerPID; DecideOnRefPicFlag(video, task); // for temporal layers if (task.m_ctrl.SkipFrame != 0 && SkipMode != MFX_SKIPFRAME_BRC_ONLY) { task.m_ctrl.SkipFrame = (extOpt2.SkipFrame) ? 1 : 0; if (video.mfx.GopRefDist > 1 && ((task.m_type.top & MFX_FRAMETYPE_REF) || (task.m_type.bot & MFX_FRAMETYPE_REF))) { task.m_ctrl.SkipFrame = 0; } if (task.SkipFlag() != 0) { task.m_type.top &= ~MFX_FRAMETYPE_REF; task.m_type.bot &= ~MFX_FRAMETYPE_REF; } } else { task.m_ctrl.SkipFrame = std::min(0xFF, task.m_ctrl.SkipFrame); } task.m_reference[ffid] = !!(task.m_type[ffid] & MFX_FRAMETYPE_REF); task.m_reference[sfid] = !!(task.m_type[sfid] & MFX_FRAMETYPE_REF); task.m_decRefPicMrkRep[ffid].presentFlag = prevIdrPicFlag || prevTask.m_decRefPicMrk[prevsfid].mmco.Size(); task.m_decRefPicMrkRep[ffid].original_idr_flag = prevIdrPicFlag; task.m_decRefPicMrkRep[ffid].original_frame_num = prevTask.m_frameNum; task.m_decRefPicMrkRep[ffid].original_field_pic_flag = prevTask.m_fieldPicFlag; task.m_decRefPicMrkRep[ffid].original_bottom_field_flag = prevTask.m_fid[prevsfid]; task.m_decRefPicMrkRep[ffid].dec_ref_pic_marking = prevTask.m_decRefPicMrk[prevsfid]; task.m_subMbPartitionAllowed[0] = CheckSubMbPartition(&extDdi, task.m_type[0]); task.m_subMbPartitionAllowed[1] = CheckSubMbPartition(&extDdi, task.m_type[1]); task.m_insertAud[ffid] = IsOn(extOpt.AUDelimiter); task.m_insertAud[sfid] = IsOn(extOpt.AUDelimiter); task.m_insertSps[ffid] = intraPicFlag; task.m_insertSps[sfid] = 0; task.m_insertPps[ffid] = task.m_insertSps[ffid] || IsOn(extOpt2.RepeatPPS); task.m_insertPps[sfid] = task.m_insertSps[sfid] || IsOn(extOpt2.RepeatPPS); task.m_nalRefIdc[ffid] = task.m_reference[ffid]; task.m_nalRefIdc[sfid] = task.m_reference[sfid]; // process roi mfxExtEncoderROI const * pRoi = &extRoi; if (extRoiRuntime) { pRoi = extRoiRuntime; } task.m_numRoi = 0; if (pRoi && extOpt3.EnableMBQP == MFX_CODINGOPTION_ON) { task.m_NumDeltaQpForNonRectROI = static_cast(pRoi->NumROI); for (int i = 0; i < pRoi->NumROI; i++) { task.m_NonRectROIDeltaQpList[i] = static_cast(pRoi->ROI[i].DeltaQP); } } else if (pRoi && pRoi->NumROI) { mfxU16 numRoi = pRoi->NumROI <= task.m_roi.Capacity() ? pRoi->NumROI : (mfxU16)task.m_roi.Capacity(); if (numRoi > caps.ddi_caps.MaxNumOfROI) { numRoi = caps.ddi_caps.MaxNumOfROI; } if (pRoi->ROIMode != MFX_ROI_MODE_QP_DELTA && pRoi->ROIMode != MFX_ROI_MODE_PRIORITY) { numRoi = 0; } if (caps.ddi_caps.ROIBRCDeltaQPLevelSupport == 0) { numRoi = 0; } for (mfxU16 i = 0; i < numRoi; i ++) { if (extRoiRuntime) { mfxRoiDesc task_roi = {pRoi->ROI[i].Left, pRoi->ROI[i].Top, pRoi->ROI[i].Right, pRoi->ROI[i].Bottom, (mfxI16)((pRoi->ROIMode == MFX_ROI_MODE_PRIORITY ? (-1) : 1) * pRoi->ROI[i].DeltaQP) }; // check runtime ROI mfxStatus sts = CheckAndFixRoiQueryLike(video, &task_roi, extRoiRuntime->ROIMode); if (sts != MFX_ERR_UNSUPPORTED) { task.m_roi[task.m_numRoi] = task_roi; task.m_numRoi++; } } else { task.m_roi[task.m_numRoi] = {pRoi->ROI[i].Left, pRoi->ROI[i].Top, pRoi->ROI[i].Right, pRoi->ROI[i].Bottom, (mfxI16)((pRoi->ROIMode == MFX_ROI_MODE_PRIORITY ? (-1) : 1) * pRoi->ROI[i].DeltaQP) }; task.m_numRoi ++; } } task.m_roiMode = MFX_ROI_MODE_QP_DELTA; } mfxExtDirtyRect const * pDirtyRect = extDirtyRectRuntime ? extDirtyRectRuntime : extDirtyRect; task.m_numDirtyRect = 0; if (pDirtyRect && pDirtyRect->NumRect) { mfxU16 numRect = pDirtyRect->NumRect <= task.m_dirtyRect.Capacity() ? pDirtyRect->NumRect : (mfxU16)task.m_dirtyRect.Capacity(); for (mfxU16 i = 0; i < numRect; i ++) { task.m_dirtyRect[task.m_numDirtyRect] = {pDirtyRect->Rect[i].Left, pDirtyRect->Rect[i].Top, pDirtyRect->Rect[i].Right, pDirtyRect->Rect[i].Bottom}; if (extDirtyRectRuntime) { // check runtime dirty rectangle mfxStatus sts = CheckAndFixRectQueryLike(video, &(task.m_dirtyRect[task.m_numDirtyRect])); if (sts != MFX_ERR_UNSUPPORTED) task.m_numDirtyRect ++; } else task.m_numDirtyRect ++; } } mfxExtMoveRect const * pMoveRect = extMoveRectRuntime ? extMoveRectRuntime : extMoveRect; task.m_numMovingRect = 0; if (pMoveRect && pMoveRect->NumRect) { mfxU16 numRect = pMoveRect->NumRect <= task.m_movingRect.Capacity() ? pMoveRect->NumRect : (mfxU16)task.m_movingRect.Capacity(); for (mfxU16 i = 0; i < numRect; i ++) { task.m_movingRect[task.m_numMovingRect] = {pMoveRect->Rect[i].DestLeft, pMoveRect->Rect[i].DestTop, pMoveRect->Rect[i].DestRight, pMoveRect->Rect[i].DestBottom, pMoveRect->Rect[i].SourceLeft, pMoveRect->Rect[i].SourceTop}; if (extMoveRectRuntime) { // check runtime moving rectangle mfxStatus sts = CheckAndFixMovingRectQueryLike(video, &(task.m_movingRect[task.m_numMovingRect])); if (sts != MFX_ERR_UNSUPPORTED) task.m_numMovingRect ++; } else task.m_numMovingRect ++; } } if (extOpt3.MaxFrameSizeI) { task.m_maxIFrameSize = extOpt3.MaxFrameSizeI; task.m_maxPBFrameSize = extOpt3.MaxFrameSizeP; } else { task.m_maxIFrameSize = extOpt2Runtime ? extOpt2Runtime->MaxFrameSize : extOpt2.MaxFrameSize; task.m_maxPBFrameSize = 0; } task.m_numMbPerSlice = extOpt2.NumMbPerSlice; task.m_numSlice[ffid] = (task.m_type[ffid] & MFX_FRAMETYPE_I) ? extOpt3.NumSliceI : (task.m_type[ffid] & MFX_FRAMETYPE_P) ? extOpt3.NumSliceP : extOpt3.NumSliceB; task.m_numSlice[!ffid] = (task.m_type[!ffid] & MFX_FRAMETYPE_I) ? extOpt3.NumSliceI : (task.m_type[!ffid] & MFX_FRAMETYPE_P) ? extOpt3.NumSliceP : extOpt3.NumSliceB; if (video.calcParam.tempScalabilityMode) { task.m_insertPps[ffid] = task.m_insertSps[ffid]; task.m_insertPps[sfid] = task.m_insertSps[sfid]; task.m_nalRefIdc[ffid] = idrPicFlag ? 3 : (task.m_reference[ffid] ? 2 : 0); task.m_nalRefIdc[sfid] = task.m_reference[sfid] ? 2 : 0; } task.m_cqpValue[0] = GetQpValue(task, video, task.m_type[0]); task.m_cqpValue[1] = GetQpValue(task, video, task.m_type[1]); task.m_statusReportNumber[0] = 2 * task.m_encOrder; task.m_statusReportNumber[1] = 2 * task.m_encOrder + 1; task.m_dpb[ffid] = prevTask.m_dpbPostEncoding; CreateAdditionalDpbCommands(video, task); // for svc temporal layers & LTR UpdateDpbFrames(task, ffid, FRAME_NUM_MAX); InitRefPicList(task, ffid); ModifyRefPicLists(video, task, ffid); MarkDecodedRefPictures(video, task, ffid); if (task.m_fieldPicFlag) { UpdateDpbFrames(task, sfid, FRAME_NUM_MAX); InitRefPicList(task, sfid); ModifyRefPicLists(video, task, sfid); // mark second field of last added frame short-term ref task.m_dpbPostEncoding = task.m_dpb[sfid]; if (task.m_reference[sfid]) task.m_dpbPostEncoding.Back().m_refPicFlag[sfid] = 1; // mark the P/I field pair flag if ((task.m_type[ffid] & MFX_FRAMETYPE_P) && (task.m_type[ffid] & MFX_FRAMETYPE_REF) && (task.m_type[sfid] & MFX_FRAMETYPE_I) && (task.m_type[sfid] & MFX_FRAMETYPE_REF)) task.m_dpbPostEncoding.Back().m_PIFieldFlag = 1; } const mfxExtCodingOption2* extOpt2Cur = (extOpt2Runtime ? extOpt2Runtime : &extOpt2); if (task.m_type[ffid] & MFX_FRAMETYPE_I) { task.m_minQP = extOpt2Cur->MinQPI; task.m_maxQP = extOpt2Cur->MaxQPI; } else if (task.m_type[ffid] & MFX_FRAMETYPE_P) { task.m_minQP = extOpt2Cur->MinQPP; task.m_maxQP = extOpt2Cur->MaxQPP; } else if (task.m_type[ffid] & MFX_FRAMETYPE_B) { task.m_minQP = extOpt2Cur->MinQPB; task.m_maxQP = extOpt2Cur->MaxQPB; } if (task.m_maxQP > 51) task.m_maxQP = 0; if (task.m_minQP > 51 || (task.m_maxQP && task.m_minQP > task.m_maxQP)) task.m_minQP = 0; mfxU32 fieldMaxCount = video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE ? 1 : 2; for (mfxU32 field = 0; field < fieldMaxCount; field++) { // Fill deblocking parameters mfxU8 disableDeblockingIdc = (mfxU8)extOpt2Cur->DisableDeblockingIdc; mfxI8 sliceAlphaC0OffsetDiv2 = 0; mfxI8 sliceBetaOffsetDiv2 = 0; for (mfxU32 i = 0; i < task.m_numSlice[task.m_fid[field]]; i++) { // Store per-slice values in task task.m_disableDeblockingIdc[task.m_fid[field]].push_back(disableDeblockingIdc); task.m_sliceAlphaC0OffsetDiv2[task.m_fid[field]].push_back(sliceAlphaC0OffsetDiv2); task.m_sliceBetaOffsetDiv2[task.m_fid[field]].push_back(sliceBetaOffsetDiv2); } // for (mfxU32 i = 0; i < task.m_numSlice[field]; i++) } // for (mfxU32 field = 0; field < fieldMaxCount; field++) #ifndef MFX_AVC_ENCODING_UNIT_DISABLE task.m_collectUnitsInfo = IsOn(extOpt3.EncodedUnitsInfo); #endif #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX // Have to fill default or provided scaling list matrices if SPS or PPS is defined if (extSps.seqScalingMatrixPresentFlag || extPps.picScalingMatrixPresentFlag) { FillTaskScalingList(extSps, extPps, task); } #endif #if defined(MFX_ENABLE_H264_REPARTITION_CHECK) { switch (extOpt3.RepartitionCheckEnable) { case MFX_CODINGOPTION_OFF: // Favor Speed task.m_RepartitionCheck = 2; // 2: FORCE_DISABLE (Disable this feature totally for all cases) break; case MFX_CODINGOPTION_ON: // Favor Quality task.m_RepartitionCheck = 1; //1: FORCE_ENABLE (Enable this feature totally for all cases) break; case MFX_CODINGOPTION_ADAPTIVE: // keep design to driver task.m_RepartitionCheck = 0; break; default: assert(!"Invalid value for RepartitionCheckEnable!"); } } #endif task.m_TCBRCTargetFrameSize = video.calcParam.TCBRCTargetFrameSize; } mfxStatus MfxHwH264Encode::CopyRawSurfaceToVideoMemory( VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, bool isD3D9SimWithVideoMem) { mfxFrameSurface1 * surface = task.m_yuv; mfxU16 inMemType = static_cast((video.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); if (video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || isD3D9SimWithVideoMem) { mfxStatus sts = MFX_ERR_NONE; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Copy input (sys->d3d)"); sts = CopyFrameDataBothFields(&core, task.m_midRaw, *surface, video.mfx.FrameInfo, inMemType); if (sts != MFX_ERR_NONE) return Error(sts); } } return MFX_ERR_NONE; } bool MfxHwH264Encode::IsFrameToSkip(DdiTask& task, MfxFrameAllocResponse & poolRec, std::vector fo, bool bSWBRC) { if (task.m_isSkipped) return true; mfxI32 fid = task.m_fid[0]; if (task.m_list1[fid].Size() && bSWBRC && (task.GetFrameType() & MFX_FRAMETYPE_B)) { mfxU8 ind = task.m_list1[fid][0] & 127; if (ind < 15 ) { ArrayDpbFrame & dpb = task.m_dpb[0]; mfxU32 idxRec = mfxU32(std::find(fo.begin(), fo.end(), dpb[ind].m_frameOrder) - fo.begin()); return ((poolRec.GetFlag(idxRec) & H264_FRAME_FLAG_SKIPPED) != 0); } } return false; } mfxStatus MfxHwH264Encode::CodeAsSkipFrame( VideoCORE & core, MfxVideoParam const & video, DdiTask& task, MfxFrameAllocResponse & pool, MfxFrameAllocResponse & poolRec) { mfxStatus sts = MFX_ERR_NONE; if (task.m_midRaw == NULL) { task.m_idx = FindFreeResourceIndex(pool); task.m_midRaw = AcquireResource(pool, task.m_idx); MFX_CHECK_NULL_PTR1(task.m_midRaw); sts = core.GetFrameHDL(task.m_midRaw, &task.m_handleRaw.first); MFX_CHECK_STS(sts); } if (task.GetFrameType() & MFX_FRAMETYPE_I) { mfxFrameData curr = {}; curr.MemId = task.m_midRaw; FrameLocker lock1(&core, curr, task.m_midRaw); mfxU32 size = curr.Pitch*video.mfx.FrameInfo.Height; memset(curr.Y, 0, size); switch (video.mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: memset(curr.UV, 128, size >> 1); break; case MFX_FOURCC_YV12: memset(curr.U, 128, size >> 2); memset(curr.V, 128, size >> 2); break; default: MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } } else { mfxI32 fid = task.m_fid[0]; mfxU8 ind = ((task.GetFrameType() & MFX_FRAMETYPE_B) && task.m_list1[fid].Size() != 0) ? task.m_list1[fid][0] : task.m_list0[fid][0]; MFX_CHECK(ind < 15, MFX_ERR_UNDEFINED_BEHAVIOR); DpbFrame& refFrame = task.m_dpb[0][ind]; mfxFrameSurface1 surfSrc = MakeSurface(video.mfx.FrameInfo, refFrame.m_midRec); mfxFrameSurface1 surfDst = MakeSurface(video.mfx.FrameInfo, task.m_midRaw); if ((poolRec.GetFlag(refFrame.m_frameIdx) & H264_FRAME_FLAG_READY) != 0) { sts = core.DoFastCopyWrapper(&surfDst, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE, &surfSrc, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE); if (ind != 0) poolRec.SetFlag(refFrame.m_frameIdx, H264_FRAME_FLAG_SKIPPED); } else return MFX_WRN_DEVICE_BUSY; } poolRec.SetFlag(task.m_idxRecon, H264_FRAME_FLAG_SKIPPED); return sts; } mfxStatus MfxHwH264Encode::GetNativeHandleToRawSurface( VideoCORE & core, MfxVideoParam const & video, DdiTask const & task, mfxHDLPair & handle, bool isD3D9SimWithVideoMem) { mfxStatus sts = MFX_ERR_NONE; Zero(handle); mfxHDL * nativeHandle = &handle.first; mfxFrameSurface1 * surface = task.m_yuv; if (video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || isD3D9SimWithVideoMem) sts = core.GetFrameHDL(task.m_midRaw, nativeHandle); else if (video.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) sts = core.GetExternalFrameHDL(*surface, handle); else return Error(MFX_ERR_UNDEFINED_BEHAVIOR); return sts; } mfxHDL MfxHwH264Encode::GetNativeHandle( VideoCORE & core, mfxFrameSurface1& surf, bool external) { mfxHDLPair handle = {}; mfxStatus sts = (external) ? core.GetExternalFrameHDL(surf, handle) : core.GetFrameHDL(surf, handle); assert(sts == MFX_ERR_NONE); return (sts == MFX_ERR_NONE) ? handle.first : 0; } namespace MfxHwH264EncodeHW { void DivideCost(std::vector & mb, mfxI32 width, mfxI32 height, mfxU32 cost, mfxI32 x, mfxI32 y) { mfxI32 mbx = x >> 4; mfxI32 mby = y >> 4; mfxI32 xx = x & 15; mfxI32 yy = y & 15; if (mbx + 0 < width && mby + 0 < height && mbx + 0 >= 0 && mby + 0 >= 0) mb[width * (mby + 0) + mbx + 0].propCost += mfxU32(cost * (16 - xx) * (16 - yy) / 256); if (mbx + 1 < width && mby + 0 < height && mbx + 1 >= 0 && mby + 0 >= 0) mb[width * (mby + 0) + mbx + 1].propCost += mfxU32(cost * ( xx) * (16 - yy) / 256); if (mbx + 0 < width && mby + 1 < height && mbx + 0 >= 0 && mby + 1 >= 0) mb[width * (mby + 1) + mbx + 0].propCost += mfxU32(cost * (16 - xx) * ( yy) / 256); if (mbx + 1 < width && mby + 1 < height && mbx + 1 >= 0 && mby + 1 >= 0) mb[width * (mby + 1) + mbx + 1].propCost += mfxU32(cost * ( xx) * ( yy) / 256); } }; using namespace MfxHwH264EncodeHW; void MfxHwH264Encode::AnalyzeVmeData(DdiTaskIter begin, DdiTaskIter end, mfxU32 width, mfxU32 height) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "AnalyzeVmeData"); mfxI32 w = width >> 4; mfxI32 h = height >> 4; for (DdiTaskIter task = begin; task != end; task++) { task->m_vmeData->propCost = 0; for (size_t i = 0; i < task->m_vmeData->mb.size(); i++) task->m_vmeData->mb[i].propCost = 0; } DdiTaskIter task = end; for (--task; task != begin; --task) { VmeData * cur = task->m_vmeData; VmeData * l0 = 0; VmeData * l1 = 0; if (task->m_fwdRef && task->m_fwdRef->m_encOrder >= begin->m_encOrder) l0 = task->m_fwdRef->m_vmeData; if (task->m_bwdRef && task->m_bwdRef->m_encOrder >= begin->m_encOrder) l1 = task->m_bwdRef->m_vmeData; for (mfxI32 y = 0; y < h; y++) { MbData const * mb = &cur->mb[y * w]; for (mfxI32 x = 0; x < w; x++, mb++) { if (!mb->intraMbFlag) { mfxU32 amount = mb->intraCost - mb->interCost; mfxF64 frac = amount / mfxF64(mb->intraCost); mfxU32 propCost = mfxU32(amount + mb->propCost * frac + 0.5); if (mb->mbType == MBTYPE_BP_L0_16x16) { if (l0) DivideCost(l0->mb, w, h, propCost, (x << 4) + ((mb->mv[0].x + 2) >> 2), (y << 4) + ((mb->mv[0].y + 2) >> 2)); } else if (mb->mbType == MBTYPE_B_L1_16x16) { if (l1) DivideCost(l1->mb, w, h, propCost, (x << 4) + ((mb->mv[1].x + 2) >> 2), (y << 4) + ((mb->mv[1].y + 2) >> 2)); } else if (mb->mbType == MBTYPE_B_Bi_16x16) { if (l0) DivideCost(l0->mb, w, h, (propCost * mb->w0 + 32) >> 6, (x << 4) + ((mb->mv[0].x + 2) >> 2), (y << 4) + ((mb->mv[0].y + 2) >> 2)); if (l1) DivideCost(l1->mb, w, h, (propCost * mb->w1 + 32) >> 6, (x << 4) + ((mb->mv[1].x + 2) >> 2), (y << 4) + ((mb->mv[1].y + 2) >> 2)); } else { assert(!"invalid mb mode"); } } } } cur->propCost = 0; for (size_t i = 0; i < cur->mb.size(); i++) cur->propCost += cur->mb[i].propCost; } begin->m_vmeData->propCost = 0; for (size_t i = 0; i < begin->m_vmeData->mb.size(); i++) begin->m_vmeData->propCost += begin->m_vmeData->mb[i].propCost; } #ifdef MFX_ENABLE_FADE_DETECTION namespace FadeDetectionHistLSE { mfxU16 GetSegments( mfxU32 const * Hist, mfxU16 SDiv, mfxU16 const * SMult, mfxU16 * Segment, mfxU16 NumSegments, mfxU16 range, mfxU32 * SumPixels = 0) { mfxU16 i, j, PeakPos = 0; mfxU32 N = 0, curr = 0, prev = 0, target; for (i = 0; i < range; i++) { N += Hist[i]; if (Hist[i] > Hist[PeakPos]) PeakPos = i; } for (i = 0; i < range; i++) { curr += Hist[i]; for (j = 0; j < NumSegments; j++) { target = N * SMult[j] / SDiv; if (prev < target && curr >= target) Segment[j] = i; } prev = curr; } if (SumPixels) *SumPixels = N; return PeakPos; } void TransformHist( mfxU32 const * refHist, mfxU32 * transHist, mfxI16 weight, mfxI16 offset, mfxU16 logWDc, mfxU16 range) { mfxI32 fract, add0, add1; mfxI16 i, map0, map1; for (i = 0; i < range; i++) { fract = (i * weight) & ((1 << logWDc) - 1); add1 = (refHist[i] * fract) >> logWDc; add0 = refHist[i] - add1; map0 = ((i * weight) >> logWDc) + offset; map1 = map0 + 1; if (map0 >= 0 && map0 < range) transHist[map0] += add0; if (map1 >= 0 && map1 < range) transHist[map1] += add1; } } mfxF64 HistDiffThrCoeff(mfxF64 CheckRange) { if (CheckRange < 20) return 10; if (CheckRange < 30) return 8.5; if (CheckRange < 40) return 8; if (CheckRange < 50) return 7.5; if (CheckRange < 60) return 7; if (CheckRange < 70) return 6.5; if (CheckRange < 80) return 6; if (CheckRange < 90) return 5.5; if (CheckRange < 100) return 5; return 4.5; } void CalcWeight( mfxU32 const * curHist, mfxU32 const * refHist, mfxU32 list, mfxU32 idx, mfxExtPredWeightTable & pwt) { const mfxU16 range = 256; const mfxU16 cmpHistOffset = 10; const mfxU16 cmpHistRange = range - cmpHistOffset - 16; const mfxU16 numSegments = 8; const mfxU16 SegmentMultiplier[numSegments] = { 2, 4, 6, 7, 8, 10, 12, 14 }; const mfxU16 SegmentDivider = 16; const mfxU16 logWDc = 6; const mfxU16 rounding = (1 << (logWDc - 1)); const mfxI16 maxWO = 127; if (idx > 31) return; list = !!list; pwt.LumaLog2WeightDenom = logWDc; pwt.ChromaLog2WeightDenom = 0; pwt.Weights[list][idx][0][0] = (1 << logWDc); pwt.Weights[list][idx][0][1] = 0; pwt.Weights[list][idx][1][0] = 0; pwt.Weights[list][idx][1][1] = 0; pwt.Weights[list][idx][2][0] = 0; pwt.Weights[list][idx][2][1] = 0; if (!curHist || !refHist) return; mfxU16 x[numSegments] = {}; mfxU16 y[numSegments] = {}; mfxI16 CurPeakPos = 0, RefPeakPos = 0, TransformedPeakPos = 0; mfxI32 sx = 0, sy = 0, sxx = 0, syy = 0, sxy = 0; mfxU32 CheckRange = 0, VarSampleDiff = 0; mfxI32 AveSampleDiff = 0; mfxU32 HistBuff[range] = {}; mfxU32(&ScaledHist)[range] = HistBuff; mfxI16 Weight = 0, Offset = 0; mfxU32 HistDiffThr = 0; mfxU32 NumSamples = 0, NumSamplesRef = 0; mfxU32 sumClosedPixelsDiff = 0, numClosedPixels = 0; bool stopCountClosedPixels = false; mfxU32 sumPixelHistDiff0 = 0, sumPixelHistDiff1 = 0, sumPixelHistDiff2 = 0; mfxI32 maxPixelHistDiff0 = 0, maxPixelHistDiff1 = 0, maxPixelHistDiff2 = 0; mfxU32 AveDiff = 0; mfxU32 const * cmpHist; RefPeakPos = GetSegments(refHist, SegmentDivider, SegmentMultiplier, x, numSegments, range, &NumSamplesRef); CurPeakPos = GetSegments(curHist, SegmentDivider, SegmentMultiplier, y, numSegments, range, &NumSamples); if (NumSamples == 0 || NumSamples != NumSamplesRef) return; // invalid or incomparable histograms for (mfxU16 i = 0; i < numSegments; i++) { sx += x[i]; sy += y[i]; sxx += x[i] * x[i]; syy += y[i] * y[i]; sxy += x[i] * y[i]; mfxI32 diff = y[i] - x[i]; AveSampleDiff += diff; VarSampleDiff += diff * diff; if (!stopCountClosedPixels) { if (abs(diff) <= 1) { sumClosedPixelsDiff += abs(diff); numClosedPixels++; } else stopCountClosedPixels = true; } } VarSampleDiff = (VarSampleDiff * numSegments - AveSampleDiff * AveSampleDiff) / (numSegments * numSegments); AveSampleDiff = AveSampleDiff > 0 ? ((AveSampleDiff + numSegments / 2) / numSegments) : -((abs(AveSampleDiff) + numSegments / 2) / numSegments); CheckRange = y[numSegments - 1] - y[0]; Weight = mfxI16(((sxy - ((sx * sy + numSegments / 2) / numSegments)) << logWDc) / std::max(1, (sxx - ((sx * sx + numSegments / 2) / numSegments)))); Offset = mfxI16(sy - ((Weight * sx + rounding) >> logWDc)); Offset = (Offset + (Offset > 0 ? numSegments / 2 : -numSegments / 2)) / numSegments; if (abs(Weight) < 4) return; if (abs(Weight) <= (1 << logWDc)) { TransformHist(refHist, ScaledHist, Weight, Offset, logWDc, range); cmpHist = curHist; } else { mfxI16 Weight1 = mfxI16(((sxy - ((sx * sy + numSegments / 2) / numSegments)) << logWDc) / std::max(1, (syy - ((sy * sy + numSegments / 2) / numSegments)))); mfxI16 Offset1 = mfxI16(sx - ((Weight1 * sy + rounding) >> logWDc)); Offset1 = (Offset1 + (Offset1 > 0 ? numSegments / 2 : -numSegments / 2)) / numSegments; if (abs(Weight1) < 4) return; TransformHist(curHist, ScaledHist, Weight1, Offset1, logWDc, range); cmpHist = refHist; } for (mfxI32 i = cmpHistOffset, j, diff; i < (cmpHistOffset + cmpHistRange); i++) { j = i + AveSampleDiff; if (j > 0 && j < range) { diff = (mfxI32)curHist[j] - (mfxI32)refHist[i]; sumPixelHistDiff0 += abs(diff); if (abs(diff) > maxPixelHistDiff0) maxPixelHistDiff0 = abs(diff); } diff = (mfxI32)cmpHist[i] - (mfxI32)ScaledHist[i]; sumPixelHistDiff1 += abs(diff); if (abs(diff) > maxPixelHistDiff1) maxPixelHistDiff1 = abs(diff); diff = (mfxI32)curHist[i] - (mfxI32)refHist[i]; sumPixelHistDiff2 += abs(diff); if (abs(diff) > maxPixelHistDiff2) maxPixelHistDiff2 = abs(diff); } if (sumPixelHistDiff0 <= sumPixelHistDiff1 || abs(Weight) > maxWO || abs(Offset) > maxWO) { sumPixelHistDiff1 = sumPixelHistDiff0; maxPixelHistDiff1 = maxPixelHistDiff0; Weight = (1 << logWDc); Offset = mfxI16(AveSampleDiff); } if (sumPixelHistDiff2 < sumPixelHistDiff1) { sumPixelHistDiff1 = sumPixelHistDiff2; maxPixelHistDiff1 = maxPixelHistDiff2; Weight = (1 << logWDc); Offset = 0; } mfxI32 maxdiff = 0, orgmaxdiff = 0, transformedClosedPixelsDiff = 0, transformMaxDiff = 0; mfxI32 sumdiff = 0; for (mfxU16 i = 0; i < numSegments; i++) { mfxI16 transformedClosedPixel = (((x[i] * Weight + rounding) >> logWDc) + Offset); transformedClosedPixel = mfx::clamp(transformedClosedPixel, 0, range - 1); if (i < numClosedPixels) { transformedClosedPixelsDiff += abs(y[i] - transformedClosedPixel); if (transformMaxDiff < abs(y[i] - transformedClosedPixel)) transformMaxDiff = abs(y[i] - transformedClosedPixel); } if (maxdiff < abs(y[i] - transformedClosedPixel)) maxdiff = abs(y[i] - transformedClosedPixel); sumdiff += abs(y[i] - transformedClosedPixel); } pwt.LumaWeightFlag[list][idx] = 1; HistDiffThr = mfxU32(HistDiffThrCoeff(CheckRange) * NumSamples / 16); TransformedPeakPos = ((RefPeakPos * Weight + rounding) >> logWDc) + Offset; AveDiff = (sumdiff) / numSegments; if ( sumPixelHistDiff1 > HistDiffThr || (Weight == (1 << logWDc) && Offset == 0) || (abs(Weight) > maxWO || abs(Offset) > maxWO) || ((CheckRange > 35) && abs(AveSampleDiff) <= 1 && VarSampleDiff <= 1) || ((CheckRange > 35) && Weight != (1 << logWDc) && abs(AveSampleDiff) <= 1 && VarSampleDiff == 0) || ((CheckRange > 25) && abs(RefPeakPos - CurPeakPos) <= 1 && abs(TransformedPeakPos - CurPeakPos) > abs(RefPeakPos - CurPeakPos) + 2) || (numClosedPixels >= (numSegments / 2) && (CheckRange > 35) && (transformedClosedPixelsDiff - sumClosedPixelsDiff > 2 || transformMaxDiff >= 2)) || (Weight == (1 << logWDc) && ((abs(AveSampleDiff) <= 2 && AveDiff > 1) || (AveDiff * AveDiff) > std::max(1u, VarSampleDiff / 2))) || (Weight != (1 << logWDc) && (maxdiff > 3 * abs(AveSampleDiff) || sumdiff >= 8 * abs(AveSampleDiff)))) { pwt.LumaWeightFlag[list][idx] = 0; } if (pwt.LumaWeightFlag[list][idx]) { bool fwFadeDetected = true, bwFadeDetected = true; for (mfxI16 i = 0; i < numSegments; i++) { mfxI16 curdiff = y[i] - x[i]; if (i != 0) { if ( (orgmaxdiff * curdiff < 0) || (abs(orgmaxdiff) - abs(curdiff) > (abs(AveSampleDiff) > 15 ? 4 : 1))) { fwFadeDetected = false; } } if (abs(orgmaxdiff) < abs(curdiff)) orgmaxdiff = curdiff; } orgmaxdiff = 0; for (mfxI16 i = numSegments - 1; i >= 0; i--) { mfxI16 curdiff = y[i] - x[i]; if (i != numSegments - 1) { if ( (orgmaxdiff * curdiff < 0) || (abs(orgmaxdiff) - abs(curdiff) > (abs(AveSampleDiff) > 15 ? 4 : 1))) { bwFadeDetected = false; } } if (abs(orgmaxdiff) < abs(curdiff)) orgmaxdiff = curdiff; } pwt.LumaWeightFlag[list][idx] = mfxU16(fwFadeDetected | bwFadeDetected); } if (pwt.LumaWeightFlag[list][idx]) { pwt.Weights[list][idx][0][0] = Weight; pwt.Weights[list][idx][0][1] = Offset; } } }; void MfxHwH264Encode::CalcPredWeightTable( DdiTask & task, mfxU32 MaxNum_WeightedPredL0, mfxU32 MaxNum_WeightedPredL1) { //MaxNum_WeightedPredL0 = MaxNum_WeightedPredL1 = 1; mfxU32* curHist = (mfxU32*)task.m_cmHistSys; mfxU32* refHist = 0; mfxU32 MaxWPLX[2] = { MaxNum_WeightedPredL0, MaxNum_WeightedPredL1 }; //if (curHist) //{ // for (mfxI32 i = 0; i < 256 * (task.m_fieldPicFlag + 1); i++) // fprintf(stderr, "%3d ", curHist[i]); // fprintf(stderr, "\n"); fflush(stderr); //} for (mfxU32 field = 0; field <= task.m_fieldPicFlag; field++) { mfxU32 fid = task.m_fid[field]; Zero(task.m_pwt[fid]); mfxExtPredWeightTable const * external = GetExtBuffer(task.m_ctrl, field); bool fade = true; if (external) { if (((external->LumaLog2WeightDenom && external->LumaLog2WeightDenom != 6) || (external->ChromaLog2WeightDenom && external->ChromaLog2WeightDenom != 6))) { task.m_pwt[fid] = *external; // ajust weights for Denom == 6 if (external->LumaLog2WeightDenom && (external->LumaLog2WeightDenom != 6)) { for (mfxU8 i = 0; i < 2; i++)//list for (mfxU8 j = 0; j < 32; j++)//entry { if (task.m_pwt[fid].LumaWeightFlag[i][j]) { if (task.m_pwt[fid].LumaLog2WeightDenom <= 6) task.m_pwt[fid].Weights[i][j][0][0] = task.m_pwt[fid].Weights[i][j][0][0] * (1 << (6 - task.m_pwt[fid].LumaLog2WeightDenom));//2^(6-k) else task.m_pwt[fid].Weights[i][j][0][0] /= (1 << (task.m_pwt[fid].LumaLog2WeightDenom - 6));//2^(-1) } } task.m_pwt[fid].LumaLog2WeightDenom = 6; } if (external->ChromaLog2WeightDenom && (external->ChromaLog2WeightDenom != 6)) { for (mfxU8 i = 0; i < 2; i++)//list for (mfxU8 j = 0; j < 32; j++)//entry { if (task.m_pwt[fid].ChromaWeightFlag[i][j]) { if (task.m_pwt[fid].ChromaLog2WeightDenom <= 6) { task.m_pwt[fid].Weights[i][j][1][0] = task.m_pwt[fid].Weights[i][j][1][0] * (1 << (6 - task.m_pwt[fid].ChromaLog2WeightDenom));//2^(6-k) task.m_pwt[fid].Weights[i][j][2][0] = task.m_pwt[fid].Weights[i][j][2][0] * (1 << (6 - task.m_pwt[fid].ChromaLog2WeightDenom));//2^(6-k) } else { task.m_pwt[fid].Weights[i][j][1][0] /= (1 << (task.m_pwt[fid].ChromaLog2WeightDenom - 6));//2^(-1) task.m_pwt[fid].Weights[i][j][2][0] /= (1 << (task.m_pwt[fid].ChromaLog2WeightDenom - 6));//2^(-1) } } } task.m_pwt[fid].ChromaLog2WeightDenom = 6; } } continue; } //fprintf(stderr, "FO: %04d POC %04d:\n", task.m_frameOrder, task.GetPoc()[fid]); fflush(stderr); for (mfxU32 l = 0; l < 2; l++) { Pair const & ListX = l ? task.m_list1 : task.m_list0; for (mfxU32 i = 0; i < ListX[fid].Size() && i < MaxWPLX[l] && fade; i++) { mfxU8 refIdx = (ListX[fid][i] & 0x7F); mfxU8 refField = (ListX[fid][i] >> 7); refHist = (mfxU32*)task.m_dpb[fid][refIdx].m_cmHistSys; FadeDetectionHistLSE::CalcWeight( curHist ? curHist + 256 * fid : 0, refHist ? refHist + 256 * refField : 0, l, i, task.m_pwt[fid]); //fprintf(stderr, "%04d[%d] vs. %04d[%d] ", task.m_frameOrder, fid, task.m_dpb[fid][refIdx].m_frameOrder, (mfxU32)refField); fflush(stderr); //fprintf(stderr, "LWF: %d W: %4d O: %4d\n", // task.m_pwt[fid].LumaWeightFlag[l][i], // task.m_pwt[fid].Weights[l][i][0][0], // task.m_pwt[fid].Weights[l][i][0][1]); fflush(stderr); fade &= !!task.m_pwt[fid].LumaWeightFlag[l][i]; } } if (!fade) { //fprintf(stderr, "There Is No Fade!\n"); fflush(stderr); for (mfxU32 l = 0; l < 2; l++) { for (mfxU32 i = 0; i < MaxWPLX[l]; i++) { task.m_pwt[fid].LumaWeightFlag[l][i] = 0; task.m_pwt[fid].Weights[l][i][0][0] = (1 << task.m_pwt[fid].LumaLog2WeightDenom); task.m_pwt[fid].Weights[l][i][0][1] = 0; } } } } } #endif // #ifdef MFX_ENABLE_FADE_DETECTION AsyncRoutineEmulator::AsyncRoutineEmulator() { std::fill(Begin(m_stageGreediness), End(m_stageGreediness), 1); Zero(m_queueFullness); Zero(m_queueFlush); } AsyncRoutineEmulator::AsyncRoutineEmulator(MfxVideoParam const & video, mfxU32 adaptGopDelay, eMFXHWType platform) { Init(video, adaptGopDelay, platform); } void AsyncRoutineEmulator::Init(MfxVideoParam const & video, mfxU32 adaptGopDelay, eMFXHWType platform) { mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(video); switch (video.mfx.RateControlMethod) { case MFX_RATECONTROL_CQP: m_stageGreediness[STG_ACCEPT_FRAME] = 1; m_stageGreediness[STG_START_SCD] = 1; m_stageGreediness[STG_WAIT_SCD] = 1 + adaptGopDelay; m_stageGreediness[STG_START_MCTF] = 1; m_stageGreediness[STG_WAIT_MCTF] = IsDenoiserSupported(video, platform) ? 2 : 1; m_stageGreediness[STG_START_LA ] = video.mfx.EncodedOrder ? 1 : video.mfx.GopRefDist; m_stageGreediness[STG_WAIT_LA ] = 1; #ifdef MFX_ENABLE_FADE_DETECTION m_stageGreediness[STG_START_HIST ] = 1; m_stageGreediness[STG_WAIT_HIST ] = 1; #endif m_stageGreediness[STG_START_ENCODE] = 1; m_stageGreediness[STG_WAIT_ENCODE ] = 1 + !!(video.AsyncDepth > 1); if (video.AsyncDepth > 1) { // for parallel ENC/PAK optimization m_stageGreediness[STG_START_ENCODE] += !!(video.mfx.GopRefDist > 1); m_stageGreediness[STG_WAIT_ENCODE ] += !!(video.mfx.GopRefDist > 1) + !!(video.AsyncDepth > 2 && video.mfx.GopRefDist > 2); } break; case MFX_RATECONTROL_LA: case MFX_RATECONTROL_LA_ICQ: case MFX_RATECONTROL_LA_HRD: m_stageGreediness[STG_ACCEPT_FRAME] = 1; m_stageGreediness[STG_START_SCD] = 1; m_stageGreediness[STG_WAIT_SCD] = 1 + adaptGopDelay; m_stageGreediness[STG_START_MCTF] = 1; m_stageGreediness[STG_WAIT_MCTF] = IsDenoiserSupported(video, platform) ? 2 : 1; m_stageGreediness[STG_START_LA ] = video.mfx.EncodedOrder ? 1 : video.mfx.GopRefDist; m_stageGreediness[STG_WAIT_LA ] = 1 + !!(video.AsyncDepth > 1); #ifdef MFX_ENABLE_FADE_DETECTION m_stageGreediness[STG_START_HIST ] = 1; m_stageGreediness[STG_WAIT_HIST ] = 1; #endif m_stageGreediness[STG_START_ENCODE] = extOpt2.LookAheadDepth; m_stageGreediness[STG_WAIT_ENCODE ] = 1 + !!(video.AsyncDepth > 1); break; default: m_stageGreediness[STG_ACCEPT_FRAME] = 1; m_stageGreediness[STG_START_SCD] = 1; m_stageGreediness[STG_WAIT_SCD] = (IsExtBrcSceneChangeSupported(video, platform) && IsCmNeededForSCD(video) ? 1 + !!(video.AsyncDepth > 1) : 1) + adaptGopDelay; m_stageGreediness[STG_START_MCTF] = 1; m_stageGreediness[STG_WAIT_MCTF] = IsDenoiserSupported(video, platform) ? 2 : 1; m_stageGreediness[STG_START_LA ] = video.mfx.EncodedOrder ? 1 : video.mfx.GopRefDist; m_stageGreediness[STG_WAIT_LA] = 1; #ifdef MFX_ENABLE_FADE_DETECTION m_stageGreediness[STG_START_HIST ] = 1; m_stageGreediness[STG_WAIT_HIST ] = 1; #endif m_stageGreediness[STG_START_ENCODE] = 1; m_stageGreediness[STG_WAIT_ENCODE ] = 1 + !!(video.AsyncDepth > 1); break; } Zero(m_queueFullness); Zero(m_queueFlush); } mfxU32 AsyncRoutineEmulator::GetTotalGreediness() const { mfxU32 greediness = 0; for (mfxU32 i = 0; i < STG_COUNT; i++) greediness += m_stageGreediness[i] - 1; return greediness + 1; } mfxU32 AsyncRoutineEmulator::GetStageGreediness(mfxU32 stage) const { return (stage < STG_COUNT) ? m_stageGreediness[stage] : 0; } mfxU32 AsyncRoutineEmulator::CheckStageOutput(mfxU32 stage) { mfxU32 in = stage; mfxU32 out = stage + 1; mfxU32 hasOutput = 0; if (m_queueFullness[in] >= m_stageGreediness[stage] || (m_queueFullness[in] > 0 && m_queueFlush[in])) { --m_queueFullness[in]; ++m_queueFullness[out]; hasOutput = 1; } m_queueFlush[out] = (m_queueFlush[in] && m_queueFullness[in] == 0); return hasOutput; } mfxU32 AsyncRoutineEmulator::Go(bool hasInput) { if (hasInput) ++m_queueFullness[STG_ACCEPT_FRAME]; else m_queueFlush[STG_ACCEPT_FRAME] = 1; mfxU32 stages = 0; for (mfxU32 i = 0; i < STG_COUNT; i++) stages += CheckStageOutput(i) << i; if (!hasInput && stages != 0 && (stages & STG_BIT_WAIT_ENCODE) == 0) stages += STG_BIT_RESTART; return stages; } #ifdef MFX_ENABLE_AVC_CUSTOM_QMATRIX mfxStatus MfxHwH264Encode::GetDefaultScalingList(mfxU8 *outList, mfxU8 outListSize, mfxU8 index, bool zigzag=false) { //Rec. ITU-T H.264, Table 7-3 mfxU8 intra_4x4[16] = { 6,13,13,20,20,20,28,28,28,28,32,32,32,37,37,42, }; mfxU8 inter_4x4[16] = { 10,14,14,20,20,20,24,24,24,24,27,27,27,30,30,34 }; //Rec. ITU-T H.264, Table 7-4 mfxU8 intra_8x8[64] = { 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42 }; mfxU8 inter_8x8[64] = { 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35 }; (void)outListSize; //Index according Rec. ITU-T H.264, Table 7-2 switch (index) { case 0: //Intra Y case 1: //Intra Cb case 2: //Intra Cr { assert(outListSize >= 16); if (!zigzag) std::copy(std::begin(intra_4x4), std::end(intra_4x4), outList); else MakeZigZag(intra_4x4, 4, outList, 16); break; } case 3: //Inter Y case 4: //Inter Cb case 5: //Inter Cr assert(outListSize >= 16); if (!zigzag) std::copy(std::begin(inter_4x4), std::end(inter_4x4), outList); else MakeZigZag(inter_4x4, 4, outList, 16); break; case 6: //Intra Y case 8: //Intra Cb case 10: //Intra Cr assert(outListSize >= 64); if (!zigzag) std::copy(std::begin(intra_8x8), std::end(intra_8x8), outList); else MakeZigZag(intra_8x8, 8, outList, 64); break; case 7: //Inter Y case 9: //Inter Cb case 11: //Inter Cr assert(outListSize >= 64); if (!zigzag) std::copy(std::begin(inter_8x8), std::end(inter_8x8), outList); else MakeZigZag(inter_8x8, 8, outList, 64); break; default: return MFX_ERR_NOT_FOUND; } return MFX_ERR_NONE; } mfxStatus MfxHwH264Encode::FillCustomScalingLists(void *inMatrix, mfxU16 ScenarioInfo, mfxU8 maxtrixIndex) { unifiedQMatrixH264 &matrix = *static_cast(inMatrix); if ((ScenarioInfo != MFX_SCENARIO_GAME_STREAMING) && (ScenarioInfo != MFX_SCENARIO_REMOTE_GAMING)) return MFX_ERR_NOT_FOUND; if (maxtrixIndex >= CQM_HINT_USE_CUST_MATRIX1 + CQM_HINT_NUM_CUST_MATRIX) maxtrixIndex = 0; mfxU8 intra_4x4[CQM_HINT_NUM_CUST_MATRIX+1][16] = { // matrix 0: single CQM { 16, 34, 53, 74, 34, 53, 74, 85, 53, 74, 85, 98, 74, 85, 98, 112 }, // matrix 1: multiple CQM, weak { 21, 21, 21, 24, 21, 21, 24, 26, 21, 24, 26, 29, 24, 26, 29, 32 }, // matrix 2: multiple CQM, medium { 27, 29, 36, 46, 29, 36, 46, 52, 36, 46, 52, 58, 46, 52, 58, 64 }, // matrix 3: multiple CQM, strong { 28, 31, 53, 74, 31, 53, 74, 85, 53, 74, 85, 98, 74, 85, 98, 112 }, // matrix 4: multiple CQM, extreme { 31, 31, 53, 74, 31, 53, 74, 85, 53, 74, 85, 98, 74, 85, 98, 112 } }; mfxU8 inter_4x4[CQM_HINT_NUM_CUST_MATRIX+1][16] = { //matrix 0: single CQM { 16, 22, 32, 38, 22, 32, 38, 43, 32, 38, 43, 48, 38, 43, 48, 54 }, // matrix 1: multiple CQM, weak { 21, 21, 21, 24, 21, 21, 24, 26, 21, 24, 26, 29, 24, 26, 29, 32 }, // matrix 2: multiple CQM, medium { 27, 29, 32, 38, 29, 32, 38, 43, 32, 38, 43, 48, 38, 43, 48, 54 }, // matrix 3: multiple CQM, strong { 28, 31, 36, 46, 31, 36, 46, 52, 36, 46, 52, 58, 46, 52, 58, 64 }, // matrix 4: multiple CQM, extreme { 31, 31, 36, 46, 31, 36, 46, 52, 36, 46, 52, 58, 46, 52, 58, 64 } }; mfxU8 intra_8x8[CQM_HINT_NUM_CUST_MATRIX+1][64] = { //matrix 0: single CQM { 16, 26, 34, 42, 48, 61, 66, 72, 26, 29, 42, 48, 61, 66, 72, 77, 34, 42, 48, 61, 66, 72, 77, 82, 42, 48, 61, 66, 72, 77, 82, 88, 48, 61, 66, 72, 77, 82, 88, 96, 61, 66, 72, 77, 82, 88, 96, 101, 66, 72, 77, 82, 88, 96, 101, 106, 72, 77, 82, 88, 96, 101, 106, 112 }, // matrix 1: multiple CQM, weak { 16, 16, 34, 42, 48, 61, 66, 72, 16, 29, 42, 48, 61, 66, 72, 77, 34, 42, 48, 61, 66, 72, 77, 82, 42, 48, 61, 66, 72, 77, 82, 88, 48, 61, 66, 72, 77, 82, 88, 96, 61, 66, 72, 77, 82, 88, 96, 101, 66, 72, 77, 82, 88, 96, 101, 106, 72, 77, 82, 88, 96, 101, 106, 112 }, // matrix 2: multiple CQM, medium { 16, 19, 34, 42, 48, 61, 66, 72, 19, 29, 42, 48, 61, 66, 72, 77, 34, 42, 48, 61, 66, 72, 77, 82, 42, 48, 61, 66, 72, 77, 82, 88, 48, 61, 66, 72, 77, 82, 88, 96, 61, 66, 72, 77, 82, 88, 96, 101, 66, 72, 77, 82, 88, 96, 101, 106, 72, 77, 82, 88, 96, 101, 106, 112 }, // matrix 3: multiple CQM, strong { 19, 25, 34, 42, 48, 61, 66, 72, 25, 29, 42, 48, 61, 66, 72, 77, 34, 42, 48, 61, 66, 72, 77, 82, 42, 48, 61, 66, 72, 77, 82, 88, 48, 61, 66, 72, 77, 82, 88, 96, 61, 66, 72, 77, 82, 88, 96, 101, 66, 72, 77, 82, 88, 96, 101, 106, 72, 77, 82, 88, 96, 101, 106, 112 }, // matrix 4: multiple CQM, extreme { 22, 22, 34, 42, 48, 61, 66, 72, 22, 29, 42, 48, 61, 66, 72, 77, 34, 42, 48, 61, 66, 72, 77, 82, 42, 48, 61, 66, 72, 77, 82, 88, 48, 61, 66, 72, 77, 82, 88, 96, 61, 66, 72, 77, 82, 88, 96, 101, 66, 72, 77, 82, 88, 96, 101, 106, 72, 77, 82, 88, 96, 101, 106, 112 } }; mfxU8 inter_8x8[CQM_HINT_NUM_CUST_MATRIX+1][64] = { //matrix 0: single CQM { 16, 23, 26, 30, 33, 37, 39, 42, 23, 23, 30, 33, 37, 39, 42, 44, 26, 30, 33, 37, 39, 42, 44, 48, 30, 33, 37, 39, 42, 44, 48, 49, 33, 37, 39, 42, 44, 48, 49, 53, 37, 39, 42, 44, 48, 49, 53, 56, 39, 42, 44, 48, 49, 53, 56, 58, 42, 44, 48, 49, 53, 56, 58, 62 }, // matrix 1: multiple CQM, weak { 16, 16, 26, 30, 33, 37, 39, 42, 16, 23, 30, 33, 37, 39, 42, 44, 26, 30, 33, 37, 39, 42, 44, 48, 30, 33, 37, 39, 42, 44, 48, 49, 33, 37, 39, 42, 44, 48, 49, 53, 37, 39, 42, 44, 48, 49, 53, 56, 39, 42, 44, 48, 49, 53, 56, 58, 42, 44, 48, 49, 53, 56, 58, 62 }, // matrix 2: multiple CQM, medium { 16, 16, 26, 30, 33, 37, 39, 42, 16, 23, 30, 33, 37, 39, 42, 44, 26, 30, 33, 37, 39, 42, 44, 48, 30, 33, 37, 39, 42, 44, 48, 49, 33, 37, 39, 42, 44, 48, 49, 53, 37, 39, 42, 44, 48, 49, 53, 56, 39, 42, 44, 48, 49, 53, 56, 58, 42, 44, 48, 49, 53, 56, 58, 62 }, // matrix 3: multiple CQM, strong { 19, 22, 26, 30, 33, 37, 39, 42, 22, 23, 30, 33, 37, 39, 42, 44, 26, 30, 33, 37, 39, 42, 44, 48, 30, 33, 37, 39, 42, 44, 48, 49, 33, 37, 39, 42, 44, 48, 49, 53, 37, 39, 42, 44, 48, 49, 53, 56, 39, 42, 44, 48, 49, 53, 56, 58, 42, 44, 48, 49, 53, 56, 58, 62 }, // matrix 4: multiple CQM, extreme { 19, 22, 26, 30, 33, 37, 39, 42, 22, 23, 30, 33, 37, 39, 42, 44, 26, 30, 33, 37, 39, 42, 44, 48, 30, 33, 37, 39, 42, 44, 48, 49, 33, 37, 39, 42, 44, 48, 49, 53, 37, 39, 42, 44, 48, 49, 53, 56, 39, 42, 44, 48, 49, 53, 56, 58, 42, 44, 48, 49, 53, 56, 58, 62 } }; mfxU8 flat_4x4[16] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; std::copy(std::begin(intra_4x4[maxtrixIndex]), std::end(intra_4x4[maxtrixIndex]), std::begin(matrix.scalingList4x4[0])); std::copy(std::begin(inter_4x4[maxtrixIndex]), std::end(inter_4x4[maxtrixIndex]), std::begin(matrix.scalingList4x4[3])); std::copy(std::begin(intra_8x8[maxtrixIndex]), std::end(intra_8x8[maxtrixIndex]), std::begin(matrix.scalingList8x8[0])); std::copy(std::begin(inter_8x8[maxtrixIndex]), std::end(inter_8x8[maxtrixIndex]), std::begin(matrix.scalingList8x8[1])); if (maxtrixIndex > 2) { std::copy(std::begin(intra_4x4[maxtrixIndex-2]), std::end(intra_4x4[maxtrixIndex-2]), std::begin(matrix.scalingList4x4[1])); std::copy(std::begin(intra_4x4[maxtrixIndex-2]), std::end(intra_4x4[maxtrixIndex-2]), std::begin(matrix.scalingList4x4[2])); std::copy(std::begin(inter_4x4[maxtrixIndex-2]), std::end(inter_4x4[maxtrixIndex-2]), std::begin(matrix.scalingList4x4[4])); std::copy(std::begin(inter_4x4[maxtrixIndex-2]), std::end(inter_4x4[maxtrixIndex-2]), std::begin(matrix.scalingList4x4[5])); } else { std::copy(std::begin(flat_4x4), std::end(flat_4x4), std::begin(matrix.scalingList4x4[1])); std::copy(std::begin(flat_4x4), std::end(flat_4x4), std::begin(matrix.scalingList4x4[2])); std::copy(std::begin(flat_4x4), std::end(flat_4x4), std::begin(matrix.scalingList4x4[4])); std::copy(std::begin(flat_4x4), std::end(flat_4x4), std::begin(matrix.scalingList4x4[5])); } return MFX_ERR_NONE; } void MfxHwH264Encode::FillTaskScalingList(mfxExtSpsHeader const &extSps, mfxExtPpsHeader const &extPps, DdiTask &task) { for (mfxU8 i = 0; i < ((extSps.levelIdc != 3) ? 8 : 12); ++i) //levelIdc==3 isn't supported, has to be checked on input { if (i < 6) { if (extSps.seqScalingListPresentFlag[i]) { ZigZagToPlane(extSps.scalingList4x4[i], 4, &task.m_qMatrix.scalingList4x4[i], sizeof(task.m_qMatrix.scalingList4x4[i])); } else { //Scaling list fall-back rule A, Rec. ITU-T H.264, Table 7-2 if (i == 0 || i == 3) //Intra Y or Inter Y { GetDefaultScalingList(task.m_qMatrix.scalingList4x4[i], sizeof(task.m_qMatrix.scalingList4x4[i]), i); } else { std::copy(std::begin(task.m_qMatrix.scalingList4x4[i - 1]), std::end(task.m_qMatrix.scalingList4x4[i - 1]), std::begin(task.m_qMatrix.scalingList4x4[i])); } } } else { if (i == 6 || i == 7) //Intra Y or Inter Y { if (extSps.seqScalingListPresentFlag[i]) { ZigZagToPlane(extSps.scalingList8x8[i - 6], 8, &task.m_qMatrix.scalingList8x8[i - 6], sizeof(task.m_qMatrix.scalingList8x8[i - 6])); } else { //Scaling list fall-back rule A, Rec. ITU-T H.264, Table 7-2 GetDefaultScalingList(task.m_qMatrix.scalingList8x8[i - 6], sizeof(task.m_qMatrix.scalingList8x8[i - 6]), i); } } else { assert("levelIdc == 3 isn't supported"); } } } if (extPps.picScalingMatrixPresentFlag) { for (mfxU8 i = 0; i < 6 + 2 * (!!extPps.transform8x8ModeFlag); ++i) { if (i < 6) { if (extPps.picScalingListPresentFlag[i]) { ZigZagToPlane(extPps.scalingList4x4[i], 4, task.m_qMatrix.scalingList4x4[i], sizeof(task.m_qMatrix.scalingList4x4[i])); } else { //According Scaling list fall-back rule B, Rec. ITU-T H.264, Table 7-2, leave Intra Y and Inter Y as they defined for SPS if (i != 0 && i != 3) //Intra Cb,Cr or Inter Cb,Cr { std::copy(std::begin(task.m_qMatrix.scalingList4x4[i - 1]), std::end(task.m_qMatrix.scalingList4x4[i - 1]), std::begin(task.m_qMatrix.scalingList4x4[i])); } } } else { if (extPps.picScalingListPresentFlag[i]) { ZigZagToPlane(extPps.scalingList8x8[i - 6], 8, task.m_qMatrix.scalingList8x8[i - 6], sizeof(task.m_qMatrix.scalingList8x8[i - 6])); } else { //According Scaling list fall-back rule B, Rec. ITU-T H.264, Table 7-2, leave Intra Y and Inter Y as they defined for SPS if (i > 7) //Intra Cb,Cr and Inter Cb,Cr is unsupported { assert("Indexes greater than 7 are not supported"); } } } } } } #endif //MFX_ENABLE_AVC_CUSTOM_QMATRIX #endif // MFX_ENABLE_H264_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/h264/src/mfx_h264_encode_vaapi.cpp000066400000000000000000003613011443134507600323240ustar00rootroot00000000000000// Copyright (c) 2011-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include #include #include "libmfx_core_vaapi.h" #include "mfx_common_int.h" #include "mfx_h264_encode_vaapi.h" #include "mfx_h264_encode_hw_utils.h" #if defined(_DEBUG) //#define mdprintf fprintf #define mdprintf(...) #else #define mdprintf(...) #endif using namespace MfxHwH264Encode; mfxU32 ConvertMfxFourcc2VaapiRTFormat(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: return VA_RT_FORMAT_YUV420; case MFX_FOURCC_YUY2: return VA_RT_FORMAT_YUV422; case MFX_FOURCC_AYUV: return VA_RT_FORMAT_YUV444; case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: return VA_RT_FORMAT_RGB32; default: assert(!"Unsupported fourcc"); return 0; } } static mfxU8 ConvertMfxFrameType2VaapiSliceType(mfxU8 type) { switch (type & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: case MFX_FRAMETYPE_P: case MFX_FRAMETYPE_B: return ConvertMfxFrameType2SliceType(type) % 5; default: assert("bad codingType"); return 0xff; } } uint32_t ConvertRateControlMFX2VAAPI(mfxU8 rateControl) { switch (rateControl) { case MFX_RATECONTROL_CBR: return VA_RC_CBR; case MFX_RATECONTROL_VBR: return VA_RC_VBR; case MFX_RATECONTROL_AVBR: return VA_RC_AVBR; #ifdef MFX_ENABLE_QVBR case MFX_RATECONTROL_QVBR: return VA_RC_QVBR; #endif case MFX_RATECONTROL_CQP: return VA_RC_CQP; case MFX_RATECONTROL_ICQ: return VA_RC_ICQ; case MFX_RATECONTROL_VCM: return VA_RC_VCM; default: return 0; } } VAProfile ConvertProfileTypeMFX2VAAPI(mfxU32 type) { switch (type) { case MFX_PROFILE_AVC_CONSTRAINED_BASELINE: case MFX_PROFILE_AVC_BASELINE: return VAProfileH264ConstrainedBaseline; case MFX_PROFILE_AVC_MAIN: return VAProfileH264Main; case MFX_PROFILE_AVC_HIGH: return VAProfileH264High; default: //assert(!"Unsupported profile type"); return VAProfileH264High; //VAProfileNone; } } // VAProfile ConvertProfileTypeMFX2VAAPI(mfxU8 type) SliceDividerType ConvertSliceStructureVAAPIToMFX(mfxU8 structure) { if (structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS) return SliceDividerType::ARBITRARY_MB_SLICE; if (structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS) return SliceDividerType::ARBITRARY_ROW_SLICE; if (structure & VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS || structure & VA_ENC_SLICE_STRUCTURE_EQUAL_MULTI_ROWS) return SliceDividerType::ROWSLICE; if (structure & VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS) return SliceDividerType::ROW2ROW; return SliceDividerType::ONESLICE; } mfxStatus SetHRD( MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & hrdBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterHRD *hrd_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, hrdBuf_id); MFX_CHECK_STS(mfxSts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterHRD), 1, NULL, &hrdBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, hrdBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeHRD; hrd_param = (VAEncMiscParameterHRD *)misc_param->data; hrd_param->initial_buffer_fullness = par.calcParam.initialDelayInKB * 8000; hrd_param->buffer_size = par.calcParam.bufferSizeInKB * 8000; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, hrdBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // void SetHRD(...) void FillBrcStructures( MfxVideoParam const & par, VAEncMiscParameterRateControl & vaBrcPar, VAEncMiscParameterFrameRate & vaFrameRate) { Zero(vaBrcPar); Zero(vaFrameRate); vaBrcPar.bits_per_second = GetMaxBitrateValue(par.calcParam.maxKbps) << (6 + SCALE_FROM_DRIVER); if(par.calcParam.maxKbps) vaBrcPar.target_percentage = (unsigned int)(100.0 * (mfxF64)par.calcParam.targetKbps / (mfxF64)par.calcParam.maxKbps); vaBrcPar.ICQ_quality_factor = par.mfx.ICQQuality; PackMfxFrameRate(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, vaFrameRate.framerate); } mfxStatus SetRateControl( MfxVideoParam const & par, mfxU32 mbbrc, mfxU8 minQP, mfxU8 maxQP, mfxU32 TargetFrameSize, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & rateParamBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterRateControl *rate_param; #ifdef MFX_ENABLE_QVBR mfxExtCodingOption3 const & extOpt3 = GetExtBufferRef(par); #endif mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, rateParamBuf_id); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl), 1, NULL, &rateParamBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, rateParamBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeRateControl; rate_param = (VAEncMiscParameterRateControl *)misc_param->data; rate_param->bits_per_second = GetMaxBitrateValue(par.calcParam.maxKbps) << (6 + SCALE_FROM_DRIVER); rate_param->window_size = par.mfx.Convergence * 100; if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { rate_param->window_size = par.mfx.Convergence; rate_param->bits_per_second = ((1000 * par.calcParam.targetKbps) >> (6 + SCALE_FROM_DRIVER)) << (6 + SCALE_FROM_DRIVER); } rate_param->min_qp = minQP; rate_param->max_qp = maxQP; #if VA_CHECK_VERSION(1, 10, 0) rate_param->target_frame_size = TargetFrameSize; #endif if (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ) rate_param->ICQ_quality_factor = par.mfx.ICQQuality; #ifdef MFX_ENABLE_QVBR else if (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) rate_param->quality_factor = extOpt3.QVBRQuality; #endif if(par.calcParam.maxKbps) rate_param->target_percentage = (unsigned int)((mfxU64)par.calcParam.targetKbps * 100 / par.calcParam.maxKbps); if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { rate_param->target_percentage = par.mfx.Accuracy; } rate_param->rc_flags.bits.frame_tolerance_mode = ConvertLowDelayBRCMfx2Ddi(extOpt3.LowDelayBRC, par.calcParam.TCBRCTargetFrameSize); // Activate frame tolerance sliding window mode if (extOpt3.WinBRCSize) { rate_param->rc_flags.bits.frame_tolerance_mode = eFrameSizeTolerance_Low; } // MBBRC control // Control VA_RC_MB 0: default, 1: enable, 2: disable, other: reserved rate_param->rc_flags.bits.mb_rate_control = mbbrc & 0xf; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, rateParamBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus SetBrcResetRequired( VADisplay vaDisplay, VABufferID rateParamBuf_id, bool isBrcResetRequired) { if (rateParamBuf_id == VA_INVALID_ID) return MFX_ERR_NONE; // if buf wasn't created VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterRateControl *rate_param; vaSts = vaMapBuffer(vaDisplay, rateParamBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); rate_param = (VAEncMiscParameterRateControl *)misc_param->data; rate_param->rc_flags.bits.reset = isBrcResetRequired; vaSts = vaUnmapBuffer(vaDisplay, rateParamBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus SetFrameRate( MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & frameRateBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterFrameRate *frameRate_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, frameRateBuf_id); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterFrameRate), 1, NULL, &frameRateBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, frameRateBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeFrameRate; frameRate_param = (VAEncMiscParameterFrameRate *)misc_param->data; PackMfxFrameRate(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, frameRate_param->framerate); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, frameRateBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } static mfxStatus SetMaxSliceSize( const UINT userMaxSliceSize, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & maxSliceSizeBuf_id) { mfxStatus sts = CheckAndDestroyVAbuffer(vaDisplay, maxSliceSizeBuf_id); MFX_CHECK_STS(sts); VAStatus vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterMaxSliceSize), 1, nullptr, &maxSliceSizeBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); VAEncMiscParameterBuffer *misc_param; vaSts = vaMapBuffer(vaDisplay, maxSliceSizeBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeMaxSliceSize; auto maxSliceSize_param = reinterpret_cast(misc_param->data); maxSliceSize_param->max_slice_size = userMaxSliceSize; vaSts = vaUnmapBuffer(vaDisplay, maxSliceSizeBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } static mfxStatus SetMaxFrameSize( const UINT userMaxFrameSize, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & frameSizeBuf_id) { VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferMaxFrameSize *p_maxFrameSize; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, frameSizeBuf_id); MFX_CHECK_STS(mfxSts); VAStatus vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterBufferMaxFrameSize), 1, NULL, &frameSizeBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, frameSizeBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeMaxFrameSize; p_maxFrameSize = (VAEncMiscParameterBufferMaxFrameSize *)misc_param->data; p_maxFrameSize->max_frame_size = userMaxFrameSize*8; // in bits for libva { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, frameSizeBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } #if VA_CHECK_VERSION(1,3,0) static mfxStatus SetMultiPassFrameSize( DdiTask const & task, mfxU32 /*fieldId*/, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & frameSizeBuf_id) { VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferMultiPassFrameSize *p_multiPassFrameSize; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, frameSizeBuf_id); MFX_CHECK_STS(mfxSts); VAStatus vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterBufferMultiPassFrameSize), 1, NULL, &frameSizeBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(vaDisplay, frameSizeBuf_id, (void **)&misc_param); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeMultiPassFrameSize; p_multiPassFrameSize = (VAEncMiscParameterBufferMultiPassFrameSize *)misc_param->data; p_multiPassFrameSize->max_frame_size = task.m_brcFrameCtrl.MaxFrameSize; p_multiPassFrameSize->num_passes = task.m_brcFrameCtrl.MaxNumRepak; p_multiPassFrameSize->delta_qp = (unsigned char *)task.m_brcFrameCtrl.DeltaQP; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, frameSizeBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } #endif #if !defined(ANDROID) static mfxStatus SetTrellisQuantization( mfxU32 trellis, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & trellisBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterQuantization *trellis_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, trellisBuf_id); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterQuantization), 1, NULL, &trellisBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, trellisBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeQuantization; trellis_param = (VAEncMiscParameterQuantization *)misc_param->data; trellis_param->quantization_flags.value = trellis; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, trellisBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // void SetTrellisQuantization(...) #endif static mfxStatus SetRollingIntraRefresh( IntraRefreshState const & rirState, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & rirBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterRIR *rir_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, rirBuf_id); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRIR), 1, NULL, &rirBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, rirBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeRIR; rir_param = (VAEncMiscParameterRIR *)misc_param->data; rir_param->rir_flags.value = rirState.refrType; rir_param->intra_insertion_location = rirState.IntraLocation; rir_param->intra_insert_size = rirState.IntraSize; rir_param->qp_delta_for_inserted_intra = mfxU8(rirState.IntRefQPDelta); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, rirBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // void SetRollingIntraRefresh(...) mfxStatus SetQualityParams( MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & qualityParams_id, DdiTask const * pTask) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterEncQuality *quality_param; mfxExtCodingOption2 const * extOpt2 = GetExtBuffer(par); mfxExtCodingOption3 const * extOpt3 = GetExtBuffer(par); mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, qualityParams_id); MFX_CHECK_STS(mfxSts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterEncQuality), 1, NULL, &qualityParams_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(vaDisplay, qualityParams_id, (void **)&misc_param); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeEncQuality; quality_param = (VAEncMiscParameterEncQuality *)misc_param->data; quality_param->useRawPicForRef = extOpt2 && IsOn(extOpt2->UseRawRef); if (extOpt3) { quality_param->directBiasAdjustmentEnable = IsOn(extOpt3->DirectBiasAdjustment); quality_param->globalMotionBiasAdjustmentEnable = IsOn(extOpt3->GlobalMotionBiasAdjustment); if (quality_param->globalMotionBiasAdjustmentEnable && extOpt3->MVCostScalingFactor < 4) quality_param->HMEMVCostScalingFactor = extOpt3->MVCostScalingFactor; quality_param->PanicModeDisable = IsOff(extOpt3->BRCPanicMode); #ifdef MFX_ENABLE_H264_REPARTITION_CHECK switch (extOpt3->RepartitionCheckEnable) { case MFX_CODINGOPTION_ON: quality_param->ForceRepartitionCheck = 1; break; case MFX_CODINGOPTION_OFF: quality_param->ForceRepartitionCheck = 2; break; case MFX_CODINGOPTION_UNKNOWN: case MFX_CODINGOPTION_ADAPTIVE: default: quality_param->ForceRepartitionCheck = 0; } #endif // MFX_ENABLE_H264_REPARTITION_CHECK } if (pTask) { mfxExtCodingOption3 const * extOpt3rt = GetExtBuffer(pTask->m_ctrl); quality_param->useRawPicForRef = pTask->m_isUseRawRef; if (extOpt3rt) { quality_param->directBiasAdjustmentEnable = IsOn(extOpt3rt->DirectBiasAdjustment); quality_param->globalMotionBiasAdjustmentEnable = IsOn(extOpt3rt->GlobalMotionBiasAdjustment); if (quality_param->globalMotionBiasAdjustmentEnable && extOpt3rt->MVCostScalingFactor < 4) quality_param->HMEMVCostScalingFactor = extOpt3rt->MVCostScalingFactor; #ifdef MFX_ENABLE_H264_REPARTITION_CHECK switch (extOpt3rt->RepartitionCheckEnable) { case MFX_CODINGOPTION_ON: quality_param->ForceRepartitionCheck = 1; break; case MFX_CODINGOPTION_OFF: quality_param->ForceRepartitionCheck = 2; break; case MFX_CODINGOPTION_UNKNOWN: // lets stick with option specified on init if not specified per-frame break; case MFX_CODINGOPTION_ADAPTIVE: default: quality_param->ForceRepartitionCheck = 0; } #endif // MFX_ENABLE_H264_REPARTITION_CHECK } // if (extOpt3rt) #ifdef MFX_ENABLE_H264_PRIVATE_CTRL mfxExtAVCEncodeCtrl const * extPCQC = GetExtBuffer(pTask->m_ctrl); if (extPCQC) { quality_param->skipCheckDisable = (extPCQC->SkipCheck & 0x0F) == MFX_SKIP_CHECK_DISABLE; quality_param->FTQEnable = (extPCQC->SkipCheck & 0x0F) == MFX_SKIP_CHECK_FTQ_ON; quality_param->FTQOverride = quality_param->FTQEnable || (extPCQC->SkipCheck & 0x0F) == MFX_SKIP_CHECK_FTQ_OFF; if (extPCQC->SkipCheck & MFX_SKIP_CHECK_SET_THRESHOLDS) { if (quality_param->FTQEnable) { quality_param->FTQSkipThresholdLUTInput = 1; for (mfxU32 i = 0; i < 52; i ++) quality_param->FTQSkipThresholdLUT[i] = (mfxU8)extPCQC->SkipThreshold[i]; } else { quality_param->NonFTQSkipThresholdLUTInput = 1; Copy(quality_param->NonFTQSkipThresholdLUT, extPCQC->SkipThreshold); } } } #endif } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, qualityParams_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // void SetQualityParams(...) mfxStatus SetQualityLevel( MfxVideoParam const & par, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & qualityParams_id, mfxEncodeCtrl const * /* pCtrl */) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferQualityLevel *quality_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, qualityParams_id); MFX_CHECK_STS(mfxSts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterBufferQualityLevel), 1, NULL, &qualityParams_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(vaDisplay, qualityParams_id, (void **)&misc_param); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeQualityLevel; quality_param = (VAEncMiscParameterBufferQualityLevel *)misc_param->data; quality_param->quality_level = (unsigned int)(par.mfx.TargetUsage); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, qualityParams_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // SetQualityLevel mfxStatus SetSkipFrame( VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & skipParam_id, mfxU8 skipFlag, mfxU8 numSkipFrames, mfxU32 sizeSkipFrames) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterSkipFrame *skipParam; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, skipParam_id); MFX_CHECK_STS(mfxSts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterSkipFrame), 1, NULL, &skipParam_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(vaDisplay, skipParam_id, (void **)&misc_param); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeSkipFrame; skipParam = (VAEncMiscParameterSkipFrame *)misc_param->data; skipParam->skip_frame_flag = skipFlag; skipParam->num_skip_frames = numSkipFrames; skipParam->size_skip_frames = sizeSkipFrames; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, skipParam_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } static mfxStatus SetROI( DdiTask const & task, std::vector & arrayVAEncROI, VADisplay vaDisplay, VAContextID vaContextEncode, VABufferID & roiParam_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferROI *roi_Param; unsigned int roi_buffer_size = sizeof(VAEncMiscParameterBufferROI); mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, roiParam_id); MFX_CHECK_STS(mfxSts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + roi_buffer_size, 1, NULL, &roiParam_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(vaDisplay, roiParam_id, (void **)&misc_param); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeROI; roi_Param = (VAEncMiscParameterBufferROI *)misc_param->data; memset(roi_Param, 0, roi_buffer_size); if (task.m_numRoi) { roi_Param->num_roi = task.m_numRoi; if (arrayVAEncROI.size() < task.m_numRoi) { arrayVAEncROI.resize(task.m_numRoi); } roi_Param->roi = Begin(arrayVAEncROI); memset(roi_Param->roi, 0, task.m_numRoi * sizeof(VAEncROI)); for (mfxU32 i = 0; i < task.m_numRoi; i++) { roi_Param->roi[i].roi_rectangle.x = task.m_roi[i].Left; roi_Param->roi[i].roi_rectangle.y = task.m_roi[i].Top; roi_Param->roi[i].roi_rectangle.width = task.m_roi[i].Right - task.m_roi[i].Left; roi_Param->roi[i].roi_rectangle.height = task.m_roi[i].Bottom - task.m_roi[i].Top; roi_Param->roi[i].roi_value = task.m_roi[i].ROIValue; } roi_Param->max_delta_qp = 51; roi_Param->min_delta_qp = -51; roi_Param->roi_flags.bits.roi_value_is_qp_delta = 0; if (task.m_roiMode == MFX_ROI_MODE_QP_DELTA) { roi_Param->roi_flags.bits.roi_value_is_qp_delta = 1; } } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, roiParam_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) mfxStatus SetRoundingOffset( VADisplay vaDisplay, VAContextID vaContextEncode, mfxExtAVCRoundingOffset const & roundingOffset, VABufferID & roundingOffsetBuf_id) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterCustomRoundingControl *rounding_param; mfxStatus mfxSts = CheckAndDestroyVAbuffer(vaDisplay, roundingOffsetBuf_id); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(vaDisplay, vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterCustomRoundingControl), 1, NULL, &roundingOffsetBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(vaDisplay, roundingOffsetBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeCustomRoundingControl; rounding_param = (VAEncMiscParameterCustomRoundingControl *)misc_param->data; if (IsOn(roundingOffset.EnableRoundingIntra)) { rounding_param->rounding_offset_setting.bits.enable_custom_rouding_intra = 1; rounding_param->rounding_offset_setting.bits.rounding_offset_intra = roundingOffset.RoundingOffsetIntra; } else { rounding_param->rounding_offset_setting.bits.enable_custom_rouding_intra = 0; rounding_param->rounding_offset_setting.bits.rounding_offset_intra = 0; } if (IsOn(roundingOffset.EnableRoundingInter)) { rounding_param->rounding_offset_setting.bits.enable_custom_rounding_inter = 1; rounding_param->rounding_offset_setting.bits.rounding_offset_inter = roundingOffset.RoundingOffsetInter; } else { rounding_param->rounding_offset_setting.bits.enable_custom_rounding_inter = 0; rounding_param->rounding_offset_setting.bits.rounding_offset_inter = 0; } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer(vaDisplay, roundingOffsetBuf_id); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } #endif void FillConstPartOfPps( MfxVideoParam const & par, VAEncPictureParameterBufferH264 & pps) { mfxExtPpsHeader const * extPps = GetExtBuffer(par); mfxExtSpsHeader const * extSps = GetExtBuffer(par); assert( extPps != 0 ); assert( extSps != 0 ); if (!extPps || !extSps) return; pps.seq_parameter_set_id = 0; // extSps->seqParameterSetId; - driver doesn't support non-zero sps_id pps.pic_parameter_set_id = 0; // extPps->picParameterSetId; - driver doesn't support non-zero pps_id pps.last_picture = 0; pps.frame_num = 0; pps.pic_init_qp = extPps->picInitQpMinus26 + 26; pps.num_ref_idx_l0_active_minus1 = extPps->numRefIdxL0DefaultActiveMinus1; pps.num_ref_idx_l1_active_minus1 = extPps->numRefIdxL1DefaultActiveMinus1; pps.chroma_qp_index_offset = extPps->chromaQpIndexOffset; pps.second_chroma_qp_index_offset = extPps->secondChromaQpIndexOffset; pps.pic_fields.bits.deblocking_filter_control_present_flag = 1; pps.pic_fields.bits.entropy_coding_mode_flag = extPps->entropyCodingModeFlag; pps.pic_fields.bits.pic_order_present_flag = extPps->bottomFieldPicOrderInframePresentFlag; pps.pic_fields.bits.weighted_pred_flag = extPps->weightedPredFlag; pps.pic_fields.bits.weighted_bipred_idc = extPps->weightedBipredIdc; pps.pic_fields.bits.constrained_intra_pred_flag = extPps->constrainedIntraPredFlag; pps.pic_fields.bits.transform_8x8_mode_flag = extPps->transform8x8ModeFlag; pps.pic_fields.bits.pic_scaling_matrix_present_flag = extPps->picScalingMatrixPresentFlag; mfxU32 i = 0; for( i = 0; i < 16; i++ ) { pps.ReferenceFrames[i].picture_id = VA_INVALID_ID; } } // void FillConstPartOfPps(...) namespace MfxHwH264Encode { void UpdatePPS( DdiTask const & task, mfxU32 fieldId, VAEncPictureParameterBufferH264 & pps, std::vector const & reconQueue #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) , mfxU32 cqmPpsNum #endif ) { pps.frame_num = task.m_frameNum; pps.pic_fields.bits.idr_pic_flag = (task.m_type[fieldId] & MFX_FRAMETYPE_IDR) ? 1 : 0; pps.pic_fields.bits.reference_pic_flag = (task.m_type[fieldId] & MFX_FRAMETYPE_REF) ? 1 : 0; pps.CurrPic.TopFieldOrderCnt = task.GetPoc(TFIELD); pps.CurrPic.BottomFieldOrderCnt = task.GetPoc(BFIELD); if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE) pps.CurrPic.flags = TFIELD == fieldId ? VA_PICTURE_H264_TOP_FIELD : VA_PICTURE_H264_BOTTOM_FIELD; else pps.CurrPic.flags = 0; mfxU32 i = 0; mfxU32 idx = 0; for( i = 0; i < task.m_dpb[fieldId].Size(); i++ ) { pps.ReferenceFrames[i].frame_idx = idx = task.m_dpb[fieldId][i].m_frameIdx & 0x7f; pps.ReferenceFrames[i].picture_id = reconQueue[idx].surface; pps.ReferenceFrames[i].flags = task.m_dpb[fieldId][i].m_longterm ? VA_PICTURE_H264_LONG_TERM_REFERENCE : VA_PICTURE_H264_SHORT_TERM_REFERENCE; pps.ReferenceFrames[i].TopFieldOrderCnt = task.m_dpb[fieldId][i].m_poc[0]; pps.ReferenceFrames[i].BottomFieldOrderCnt = task.m_dpb[fieldId][i].m_poc[1]; } for (; i < 16; i++) { pps.ReferenceFrames[i].picture_id = VA_INVALID_ID; pps.ReferenceFrames[i].frame_idx = 0xff; pps.ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID; pps.ReferenceFrames[i].TopFieldOrderCnt = 0; pps.ReferenceFrames[i].BottomFieldOrderCnt = 0; } #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (IsCustMatrix(task.m_adaptiveCQMHint) && cqmPpsNum > 0) { pps.pic_parameter_set_id = static_cast(task.m_adaptiveCQMHint); pps.pic_fields.bits.pic_scaling_matrix_present_flag = true; } else { // CqmHint is CQM_HINT_USE_FLAT_MATRIX or CQM_HINT_INVALID, or no available extended CQM pps pps.pic_parameter_set_id = 0; pps.pic_fields.bits.pic_scaling_matrix_present_flag = false; } #endif } // void UpdatePPS(...) void FillPWT( MFX_ENCODE_CAPS const & hwCaps, VAEncPictureParameterBufferH264 const & pps, mfxExtPredWeightTable const & pwt, VAEncSliceParameterBufferH264 & slice) { mfxU32 iNumRefL0 = 0; mfxU32 iNumRefL1 = 0; const mfxU32 iWeight = 0, iOffset = 1, iY = 0, iCb = 1, iCr = 2, iCbVa = 0, iCrVa = 1; mfxU32 ref = 0; // check parameter if (!((pps.pic_fields.bits.weighted_pred_flag == 1 && slice.slice_type % 5 == SLICE_TYPE_P) || (pps.pic_fields.bits.weighted_bipred_idc == 1 && slice.slice_type % 5 == SLICE_TYPE_B))) return; iNumRefL0 = hwCaps.ddi_caps.MaxNum_WeightedPredL0 < slice.num_ref_idx_l0_active_minus1 + 1 ? hwCaps.ddi_caps.MaxNum_WeightedPredL0 : slice.num_ref_idx_l0_active_minus1 + 1; iNumRefL1 = hwCaps.ddi_caps.MaxNum_WeightedPredL1 < slice.num_ref_idx_l1_active_minus1 + 1 ? hwCaps.ddi_caps.MaxNum_WeightedPredL1 : slice.num_ref_idx_l1_active_minus1 + 1; // initialize Zero(slice.luma_log2_weight_denom); Zero(slice.chroma_log2_weight_denom); Zero(slice.luma_weight_l0_flag); Zero(slice.luma_weight_l1_flag); Zero(slice.chroma_weight_l0_flag); Zero(slice.chroma_weight_l1_flag); Zero(slice.luma_weight_l0); Zero(slice.luma_weight_l1); Zero(slice.luma_offset_l0); Zero(slice.luma_offset_l1); Zero(slice.chroma_weight_l0); Zero(slice.chroma_weight_l1); Zero(slice.chroma_offset_l0); Zero(slice.chroma_offset_l1); slice.luma_log2_weight_denom = (mfxU8)pwt.LumaLog2WeightDenom; slice.chroma_log2_weight_denom = (mfxU8)pwt.ChromaLog2WeightDenom; if (hwCaps.ddi_caps.LumaWeightedPred) { // Set Luma L0 if ((slice.slice_type % 5) == SLICE_TYPE_P || (slice.slice_type % 5) == SLICE_TYPE_B) { for (ref = 0; ref < iNumRefL0; ref++) { if (pwt.LumaWeightFlag[0][ref]) { slice.luma_weight_l0_flag |= 1 << ref; Copy(slice.luma_weight_l0[ref], pwt.Weights[0][ref][iY][iWeight]); Copy(slice.luma_offset_l0[ref], pwt.Weights[0][ref][iY][iOffset]); } else { slice.luma_weight_l0[ref] = (1 << slice.luma_log2_weight_denom); slice.luma_offset_l0[ref] = 0; } } } // Set Luma L1 if ((slice.slice_type % 5) == SLICE_TYPE_B) { for (ref = 0; ref < iNumRefL1; ref++) { if (pwt.LumaWeightFlag[1][ref]) { slice.luma_weight_l1_flag |= 1 << ref; Copy(slice.luma_weight_l1[ref], pwt.Weights[1][ref][iY][iWeight]); Copy(slice.luma_offset_l1[ref], pwt.Weights[1][ref][iY][iOffset]); } else { slice.luma_weight_l1[ref] = (1 << slice.luma_log2_weight_denom); slice.luma_offset_l1[ref] = 0; } } } } if (hwCaps.ddi_caps.ChromaWeightedPred) { // Set Chroma L0 if ((slice.slice_type % 5) == SLICE_TYPE_P || (slice.slice_type % 5) == SLICE_TYPE_B) { for (ref = 0; ref < iNumRefL0; ref++) { if (pwt.ChromaWeightFlag[0][ref]) { slice.chroma_weight_l0_flag |= 1 << ref; Copy(slice.chroma_weight_l0[ref][iCbVa], pwt.Weights[0][ref][iCb][iWeight]); Copy(slice.chroma_weight_l0[ref][iCrVa], pwt.Weights[0][ref][iCr][iWeight]); Copy(slice.chroma_offset_l0[ref][iCbVa], pwt.Weights[0][ref][iCb][iOffset]); Copy(slice.chroma_offset_l0[ref][iCrVa], pwt.Weights[0][ref][iCr][iOffset]); } else { slice.chroma_weight_l0[ref][iCbVa] = (1 << slice.chroma_log2_weight_denom); slice.chroma_weight_l0[ref][iCrVa] = (1 << slice.chroma_log2_weight_denom); slice.chroma_offset_l0[ref][iCbVa] = 0; slice.chroma_offset_l0[ref][iCrVa] = 0; } } } // Set Chroma L1 if ((slice.slice_type % 5) == SLICE_TYPE_B) { for (ref = 0; ref < iNumRefL1; ref++) { if (pwt.ChromaWeightFlag[1][ref]) { slice.chroma_weight_l1_flag |= 1 << ref; Copy(slice.chroma_weight_l1[ref][iCbVa], pwt.Weights[1][ref][iCb][iWeight]); Copy(slice.chroma_weight_l1[ref][iCrVa], pwt.Weights[1][ref][iCr][iWeight]); Copy(slice.chroma_offset_l1[ref][iCbVa], pwt.Weights[1][ref][iCb][iOffset]); Copy(slice.chroma_offset_l1[ref][iCrVa], pwt.Weights[1][ref][iCr][iOffset]); } else { slice.chroma_weight_l1[ref][iCbVa] = (1 << slice.chroma_log2_weight_denom); slice.chroma_weight_l1[ref][iCrVa] = (1 << slice.chroma_log2_weight_denom); slice.chroma_offset_l1[ref][iCbVa] = 0; slice.chroma_offset_l1[ref][iCrVa] = 0; } } } } } void UpdateSlice( MFX_ENCODE_CAPS const & hwCaps, DdiTask const & task, mfxU32 fieldId, VAEncSequenceParameterBufferH264 const & sps, VAEncPictureParameterBufferH264 const & pps, std::vector & slice, MfxVideoParam const & par, std::vector const & reconQueue) { mfxU32 numPics = task.GetPicStructForEncode() == MFX_PICSTRUCT_PROGRESSIVE ? 1 : 2; if (task.m_numSlice[fieldId]) slice.resize(task.m_numSlice[fieldId]); mfxU32 numSlice = slice.size(); mfxU32 idx = 0, ref = 0; // In case of single-field processing, only one buffer is attached mfxU32 idxToPickBuffer = task.m_singleFieldMode ? 0 : task.m_fid[fieldId]; mfxExtCodingOptionDDI * extDdi = GetExtBuffer(par); mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); assert(extDdi != 0); mfxExtPredWeightTable const * pPWT = GetExtBuffer(task.m_ctrl, idxToPickBuffer); #ifdef MFX_ENABLE_FADE_DETECTION if (!pPWT) pPWT = &task.m_pwt[fieldId]; #endif SliceDivider divider = MakeSliceDivider( SliceDividerType(hwCaps.ddi_caps.SliceStructure), task.m_numMbPerSlice, numSlice, sps.picture_width_in_mbs, sps.picture_height_in_mbs / numPics); ArrayDpbFrame const & dpb = task.m_dpb[fieldId]; ArrayU8x33 const & list0 = task.m_list0[fieldId]; ArrayU8x33 const & list1 = task.m_list1[fieldId]; for( size_t i = 0; i < slice.size(); ++i, divider.Next() ) { slice[i].macroblock_address = divider.GetFirstMbInSlice(); slice[i].num_macroblocks = divider.GetNumMbInSlice(); slice[i].macroblock_info = VA_INVALID_ID; for (ref = 0; ref < list0.Size(); ref++) { slice[i].RefPicList0[ref].frame_idx = idx = dpb[list0[ref] & 0x7f].m_frameIdx & 0x7f; slice[i].RefPicList0[ref].picture_id = reconQueue[idx].surface; if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE) slice[i].RefPicList0[ref].flags = list0[ref] >> 7 ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } for (; ref < 32; ref++) { slice[i].RefPicList0[ref].picture_id = VA_INVALID_ID; slice[i].RefPicList0[ref].flags = VA_PICTURE_H264_INVALID; } for (ref = 0; ref < list1.Size(); ref++) { slice[i].RefPicList1[ref].frame_idx = idx = dpb[list1[ref] & 0x7f].m_frameIdx & 0x7f; slice[i].RefPicList1[ref].picture_id = reconQueue[idx].surface; if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE) slice[i].RefPicList1[ref].flags = list1[ref] >> 7 ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } for (; ref < 32; ref++) { slice[i].RefPicList1[ref].picture_id = VA_INVALID_ID; slice[i].RefPicList1[ref].flags = VA_PICTURE_H264_INVALID; } slice[i].pic_parameter_set_id = pps.pic_parameter_set_id; slice[i].slice_type = ConvertMfxFrameType2VaapiSliceType( task.m_type[fieldId] ); slice[i].direct_spatial_mv_pred_flag = 1; slice[i].num_ref_idx_l0_active_minus1 = std::max(1, task.m_list0[fieldId].Size()) - 1; slice[i].num_ref_idx_l1_active_minus1 = std::max(1, task.m_list1[fieldId].Size()) - 1; slice[i].num_ref_idx_active_override_flag = slice[i].num_ref_idx_l0_active_minus1 != pps.num_ref_idx_l0_active_minus1 || slice[i].num_ref_idx_l1_active_minus1 != pps.num_ref_idx_l1_active_minus1; slice[i].idr_pic_id = task.m_idrPicId; slice[i].pic_order_cnt_lsb = mfxU16(task.GetPoc(fieldId)); slice[i].delta_pic_order_cnt_bottom = 0; slice[i].delta_pic_order_cnt[0] = 0; slice[i].delta_pic_order_cnt[1] = 0; slice[i].luma_log2_weight_denom = 0; slice[i].chroma_log2_weight_denom = 0; slice[i].cabac_init_idc = extDdi ? (mfxU8)extDdi->CabacInitIdcPlus1 - 1 : 0; slice[i].slice_qp_delta = mfxI8(task.m_cqpValue[fieldId] - pps.pic_init_qp); { slice[i].disable_deblocking_filter_idc = extOpt2.DisableDeblockingIdc; slice[i].slice_alpha_c0_offset_div2 = 0; slice[i].slice_beta_offset_div2 = 0; } if (pPWT) FillPWT(hwCaps, pps, *pPWT, slice[i]); } } // void UpdateSlice(...) } // namespace MfxHwH264Encode void UpdateSliceSizeLimited( MFX_ENCODE_CAPS const & hwCaps, DdiTask const & task, mfxU32 fieldId, VAEncSequenceParameterBufferH264 const & sps, VAEncPictureParameterBufferH264 const & pps, std::vector & slice, MfxVideoParam const & par, std::vector const & reconQueue) { (void)sps; mfxU32 idx = 0, ref = 0; mfxExtCodingOptionDDI * extDdi = GetExtBuffer(par); mfxExtCodingOption2 & extOpt2 = GetExtBufferRef(par); assert(extDdi != 0); mfxExtPredWeightTable const * pPWT = GetExtBuffer(task.m_ctrl, task.m_fid[fieldId]); #ifdef MFX_ENABLE_FADE_DETECTION if (!pPWT) pPWT = &task.m_pwt[fieldId]; #endif size_t numSlices = task.m_SliceInfo.size(); if (numSlices != slice.size()) { size_t old_size = slice.size(); slice.resize(numSlices); for (size_t i = old_size; i < slice.size(); ++i) { slice[i] = slice[0]; //slice[i].slice_id = (mfxU32)i; } } ArrayDpbFrame const & dpb = task.m_dpb[fieldId]; ArrayU8x33 const & list0 = task.m_list0[fieldId]; ArrayU8x33 const & list1 = task.m_list1[fieldId]; for( size_t i = 0; i < slice.size(); ++i) { slice[i].macroblock_address = task.m_SliceInfo[i].startMB; slice[i].num_macroblocks = task.m_SliceInfo[i].numMB; slice[i].macroblock_info = VA_INVALID_ID; for (ref = 0; ref < list0.Size(); ref++) { slice[i].RefPicList0[ref].frame_idx = idx = dpb[list0[ref] & 0x7f].m_frameIdx & 0x7f; slice[i].RefPicList0[ref].picture_id = reconQueue[idx].surface; if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE) slice[i].RefPicList0[ref].flags = list0[ref] >> 7 ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } for (; ref < 32; ref++) { slice[i].RefPicList0[ref].picture_id = VA_INVALID_ID; slice[i].RefPicList0[ref].flags = VA_PICTURE_H264_INVALID; } for (ref = 0; ref < list1.Size(); ref++) { slice[i].RefPicList1[ref].frame_idx = idx = dpb[list1[ref] & 0x7f].m_frameIdx & 0x7f; slice[i].RefPicList1[ref].picture_id = reconQueue[idx].surface; if (task.GetPicStructForEncode() != MFX_PICSTRUCT_PROGRESSIVE) slice[i].RefPicList1[ref].flags = list1[ref] >> 7 ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } for (; ref < 32; ref++) { slice[i].RefPicList1[ref].picture_id = VA_INVALID_ID; slice[i].RefPicList1[ref].flags = VA_PICTURE_H264_INVALID; } slice[i].pic_parameter_set_id = pps.pic_parameter_set_id; slice[i].slice_type = ConvertMfxFrameType2VaapiSliceType( task.m_type[fieldId] ); slice[i].direct_spatial_mv_pred_flag = 1; slice[i].num_ref_idx_l0_active_minus1 = std::max(1, task.m_list0[fieldId].Size()) - 1; slice[i].num_ref_idx_l1_active_minus1 = std::max(1, task.m_list1[fieldId].Size()) - 1; slice[i].num_ref_idx_active_override_flag = slice[i].num_ref_idx_l0_active_minus1 != pps.num_ref_idx_l0_active_minus1 || slice[i].num_ref_idx_l1_active_minus1 != pps.num_ref_idx_l1_active_minus1; slice[i].idr_pic_id = task.m_idrPicId; slice[i].pic_order_cnt_lsb = mfxU16(task.GetPoc(fieldId)); slice[i].delta_pic_order_cnt_bottom = 0; slice[i].delta_pic_order_cnt[0] = 0; slice[i].delta_pic_order_cnt[1] = 0; slice[i].luma_log2_weight_denom = 0; slice[i].chroma_log2_weight_denom = 0; slice[i].cabac_init_idc = extDdi ? (mfxU8)extDdi->CabacInitIdcPlus1 - 1 : 0; slice[i].slice_qp_delta = mfxI8(task.m_cqpValue[fieldId] - pps.pic_init_qp); { slice[i].disable_deblocking_filter_idc = extOpt2.DisableDeblockingIdc; slice[i].slice_alpha_c0_offset_div2 = 0; slice[i].slice_beta_offset_div2 = 0; } if (pPWT) FillPWT(hwCaps, pps, *pPWT, slice[i]); } } // void UpdateSliceSizeLimited(...) //////////////////////////////////////////////////////////////////////////////////////////// // HWEncoder based on VAAPI //////////////////////////////////////////////////////////////////////////////////////////// using namespace MfxHwH264Encode; VAAPIEncoder::VAAPIEncoder() : m_core(NULL) , m_videoParam() , m_vaDisplay() , m_vaContextEncode(VA_INVALID_ID) , m_vaConfig(VA_INVALID_ID) , m_sps() , m_pps() , m_slice() , m_spsBufferId(VA_INVALID_ID) , m_hrdBufferId(VA_INVALID_ID) , m_rateParamBufferId(VA_INVALID_ID) , m_frameRateId(VA_INVALID_ID) , m_qualityLevelId(VA_INVALID_ID) , m_maxFrameSizeId(VA_INVALID_ID) , m_multiPassFrameSizeId(VA_INVALID_ID) , m_quantizationId(VA_INVALID_ID) , m_rirId(VA_INVALID_ID) , m_qualityParamsId(VA_INVALID_ID) , m_miscParameterSkipBufferId(VA_INVALID_ID) , m_maxSliceSizeId(VA_INVALID_ID) #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) , m_roundingOffsetId(VA_INVALID_ID) #endif , m_roiBufferId(VA_INVALID_ID) , m_ppsBufferId(VA_INVALID_ID) , m_mbqpBufferId(VA_INVALID_ID) #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) , m_qmBufferId(VA_INVALID_ID) #endif #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) , m_triggerGpuHangBufferId(VA_INVALID_ID) #endif , m_mbNoSkipBufferId(VA_INVALID_ID) , m_packedAudHeaderBufferId(VA_INVALID_ID) , m_packedAudBufferId(VA_INVALID_ID) , m_packedSpsHeaderBufferId(VA_INVALID_ID) , m_packedSpsBufferId(VA_INVALID_ID) , m_packedPpsHeaderBufferId(VA_INVALID_ID) , m_packedPpsBufferId(VA_INVALID_ID) , m_packedSeiHeaderBufferId(VA_INVALID_ID) , m_packedSeiBufferId(VA_INVALID_ID) , m_packedSkippedSliceHeaderBufferId(VA_INVALID_ID) , m_packedSkippedSliceBufferId(VA_INVALID_ID) #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) , m_packedCqmPpsHeaderBufferId(CQM_HINT_NUM_CUST_MATRIX, VA_INVALID_ID) , m_packedCqmPpsBufferId(CQM_HINT_NUM_CUST_MATRIX, VA_INVALID_ID) #endif , m_feedbackCache() , m_bsQueue() , m_reconQueue() , m_width() , m_height() , m_userMaxFrameSize() , m_mbbrc() , m_caps() , m_RIRState() , m_curTrellisQuantization() , m_newTrellisQuantization() , m_arrayVAEncROI() , m_guard() , m_headerPacker() , m_numSkipFrames() , m_sizeSkipFrames() , m_skipMode() , m_isENCPAK(false) , m_isBrcResetRequired(false) , m_vaBrcPar() , m_vaFrameRate() , m_mb_noskip_buffer() { m_videoParam.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH; // QueryHwCaps will use this value } // VAAPIEncoder::VAAPIEncoder(VideoCORE* core) VAAPIEncoder::~VAAPIEncoder() { Destroy(); } // VAAPIEncoder::~VAAPIEncoder() void VAAPIEncoder::FillSps( MfxVideoParam const & par, VAEncSequenceParameterBufferH264 & sps) { mfxExtSpsHeader const * extSps = GetExtBuffer(par); assert( extSps != 0 ); if (!extSps) return; sps.picture_width_in_mbs = mfx::align2_value(par.mfx.FrameInfo.Width, 16) >> 4; sps.picture_height_in_mbs = mfx::align2_value(par.mfx.FrameInfo.Height, 16) >> 4; sps.level_idc = par.mfx.CodecLevel; sps.intra_period = par.mfx.GopPicSize; sps.ip_period = par.mfx.GopRefDist; sps.bits_per_second = GetMaxBitrateValue(par.calcParam.maxKbps) << (6 + SCALE_FROM_DRIVER); sps.time_scale = extSps->vui.timeScale; sps.num_units_in_tick = extSps->vui.numUnitsInTick; sps.max_num_ref_frames = mfxU8((extSps->maxNumRefFrames + 1) / 2); sps.seq_parameter_set_id = 0; // extSps->seqParameterSetId; - driver doesn't support non-zero sps_id sps.bit_depth_luma_minus8 = extSps->bitDepthLumaMinus8; sps.bit_depth_chroma_minus8 = extSps->bitDepthChromaMinus8; sps.seq_fields.bits.chroma_format_idc = extSps->chromaFormatIdc; sps.seq_fields.bits.log2_max_frame_num_minus4 = extSps->log2MaxFrameNumMinus4; sps.seq_fields.bits.pic_order_cnt_type = extSps->picOrderCntType; sps.seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = extSps->log2MaxPicOrderCntLsbMinus4; sps.num_ref_frames_in_pic_order_cnt_cycle = extSps->numRefFramesInPicOrderCntCycle; sps.offset_for_non_ref_pic = extSps->offsetForNonRefPic; sps.offset_for_top_to_bottom_field = extSps->offsetForTopToBottomField; Copy(sps.offset_for_ref_frame, extSps->offsetForRefFrame); sps.frame_crop_left_offset = mfxU16(extSps->frameCropLeftOffset); sps.frame_crop_right_offset = mfxU16(extSps->frameCropRightOffset); sps.frame_crop_top_offset = mfxU16(extSps->frameCropTopOffset); sps.frame_crop_bottom_offset = mfxU16(extSps->frameCropBottomOffset); sps.seq_fields.bits.seq_scaling_matrix_present_flag = extSps->seqScalingMatrixPresentFlag; sps.seq_fields.bits.delta_pic_order_always_zero_flag = extSps->deltaPicOrderAlwaysZeroFlag; sps.seq_fields.bits.frame_mbs_only_flag = extSps->frameMbsOnlyFlag; sps.seq_fields.bits.mb_adaptive_frame_field_flag = extSps->mbAdaptiveFrameFieldFlag; sps.seq_fields.bits.direct_8x8_inference_flag = extSps->direct8x8InferenceFlag; sps.vui_parameters_present_flag = extSps->vuiParametersPresentFlag; sps.vui_fields.bits.timing_info_present_flag = extSps->vui.flags.timingInfoPresent; sps.vui_fields.bits.bitstream_restriction_flag = extSps->vui.flags.bitstreamRestriction; sps.vui_fields.bits.log2_max_mv_length_horizontal = extSps->vui.log2MaxMvLengthHorizontal; sps.vui_fields.bits.log2_max_mv_length_vertical = extSps->vui.log2MaxMvLengthVertical; sps.frame_cropping_flag = extSps->frameCroppingFlag; sps.sar_height = extSps->vui.sarHeight; sps.sar_width = extSps->vui.sarWidth; sps.aspect_ratio_idc = extSps->vui.aspectRatioIdc; mfxExtCodingOption2 const * extOpt2 = GetExtBuffer(par); assert( extOpt2 != 0 ); m_newTrellisQuantization = extOpt2 ? extOpt2->Trellis : 0; } // void FillSps(...) mfxStatus VAAPIEncoder::CreateAuxilliaryDevice( VideoCORE* core, GUID guid, mfxU32 width, mfxU32 height, bool /*isTemporal*/) { MFX_CHECK_NULL_PTR1(core); m_core = core; VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(m_core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_WITH_ASSERT(vaapi_core_vpl, MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(vaapi_core_vpl->GetVAService(&m_vaDisplay)); m_caps = {}; m_caps.ddi_caps.FrameSizeToleranceSupport = H264ECaps::IsFrameSizeTolerenceSupported(m_core->GetHWType()); m_width = width; m_height = height; m_caps.ddi_caps.BRCReset = 1; // no bitrate resolution control m_caps.ddi_caps.HeaderInsertion = 0; // we will provide headers (SPS, PPS) in binary format to the driver // libva doesn't accept AdaptiveMaxFrameSize and MaxFrameSizeP, so unsupported m_caps.AdaptiveMaxFrameSizeSupport = false; std::map idx_map; VAConfigAttribType attr_types[] = { VAConfigAttribRTFormat, VAConfigAttribRateControl, VAConfigAttribEncQuantization, VAConfigAttribEncIntraRefresh, VAConfigAttribMaxPictureHeight, VAConfigAttribMaxPictureWidth, VAConfigAttribEncInterlaced, VAConfigAttribEncMaxRefFrames, VAConfigAttribEncSliceStructure, VAConfigAttribEncROI, VAConfigAttribEncSkipFrame, VAConfigAttribCustomRoundingControl }; std::vector attrs; attrs.reserve(sizeof(attr_types) / sizeof(attr_types[0])); auto AV = [&attrs, &idx_map](VAConfigAttribType t) -> uint32_t& { return attrs[idx_map[t]].value; }; mfxI32 i = 0; std::for_each(std::begin(attr_types), std::end(attr_types) , [&attrs, &idx_map, &i](decltype(*std::begin(attr_types)) type) { attrs.push_back({ type, 0 }); idx_map[type] = i; ++i; }); VAEntrypoint entrypoint = VAEntrypointEncSlice; if ((MSDK_Private_Guid_Encode_AVC_LowPower_Query == guid) || (DXVA2_INTEL_LOWPOWERENCODE_AVC == guid)) { entrypoint = VAEntrypointEncSliceLP; } VAStatus vaSts = vaGetConfigAttributes(m_vaDisplay, ConvertProfileTypeMFX2VAAPI(m_videoParam.mfx.CodecProfile), entrypoint, Begin(attrs), attrs.size()); MFX_CHECK(!(VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT == vaSts || VA_STATUS_ERROR_UNSUPPORTED_PROFILE == vaSts), MFX_ERR_UNSUPPORTED); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_caps.CQPSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CQP); m_caps.CBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CBR); m_caps.VBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_VBR); m_caps.ddi_caps.VCMBitrateControl = !!(AV(VAConfigAttribRateControl) & VA_RC_VCM); m_caps.ddi_caps.ICQBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_ICQ); #ifdef MFX_ENABLE_QVBR m_caps.ddi_caps.QVBRBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_QVBR); #endif #if VA_CHECK_VERSION(1,3,0) m_caps.AVBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_AVBR); m_caps.AVBRSupport = H264ECaps::IsVmeSupported(m_core->GetHWType()); #endif #if VA_CHECK_VERSION(1, 10, 0) m_caps.ddi_caps.TCBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_TCBRC); #endif m_caps.ddi_caps.TrelisQuantization = !!(AV(VAConfigAttribEncQuantization) & (~VA_ATTRIB_NOT_SUPPORTED)); m_caps.ddi_caps.vaTrellisQuantization = AV(VAConfigAttribEncQuantization); m_caps.ddi_caps.RollingIntraRefresh = !!(AV(VAConfigAttribEncIntraRefresh) & (~VA_ATTRIB_NOT_SUPPORTED)); m_caps.ddi_caps.vaRollingIntraRefresh = AV(VAConfigAttribEncIntraRefresh); m_caps.ddi_caps.SkipFrame = !!(AV(VAConfigAttribEncSkipFrame) & (~VA_ATTRIB_NOT_SUPPORTED)); #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) m_caps.ddi_caps.RoundingOffset = !!(AV(VAConfigAttribCustomRoundingControl) & (~VA_ATTRIB_NOT_SUPPORTED)); #endif m_caps.ddi_caps.UserMaxFrameSizeSupport = 1; m_caps.ddi_caps.MBBRCSupport = 1; m_caps.ddi_caps.MbQpDataSupport = 1; m_caps.ddi_caps.NoWeightedPred = 0; m_caps.ddi_caps.LumaWeightedPred = 1; m_caps.ddi_caps.ChromaWeightedPred = 1; m_caps.ddi_caps.MaxNum_WeightedPredL0 = 4; m_caps.ddi_caps.MaxNum_WeightedPredL1 = 2; m_caps.ddi_caps.Color420Only = !(AV(VAConfigAttribRTFormat) & (VA_RT_FORMAT_YUV422 | VA_RT_FORMAT_YUV444)); m_caps.ddi_caps.MaxPicWidth = AV(VAConfigAttribMaxPictureWidth); if (m_caps.ddi_caps.MaxPicWidth == VA_ATTRIB_NOT_SUPPORTED || m_caps.ddi_caps.MaxPicWidth == 0) m_caps.ddi_caps.MaxPicWidth = 1920; m_caps.ddi_caps.MaxPicHeight = AV(VAConfigAttribMaxPictureHeight); if (m_caps.ddi_caps.MaxPicHeight == VA_ATTRIB_NOT_SUPPORTED || m_caps.ddi_caps.MaxPicHeight == 0) m_caps.ddi_caps.MaxPicHeight = 1088; if (AV(VAConfigAttribEncSliceStructure) != VA_ATTRIB_NOT_SUPPORTED) { // Attribute for VAConfigAttribEncSliceStructure includes both (1) information about supported slice structure and // (2) indication of support for max slice size feature const auto sliceCapabilities = AV(VAConfigAttribEncSliceStructure); const auto sliceStructure = sliceCapabilities & ~VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE; m_caps.ddi_caps.SliceStructure = static_cast(ConvertSliceStructureVAAPIToMFX(sliceStructure)); m_caps.ddi_caps.SliceLevelRateCtrl = sliceCapabilities & VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE ? 1 : 0; } else { m_caps.ddi_caps.SliceStructure = 4;// 4 - arbitrary slice size in MBs; the other - SliceDividerOneSlice } m_caps.ddi_caps.NoInterlacedField = !(AV(VAConfigAttribEncInterlaced) & VA_ENC_INTERLACED_FIELD); // 0 - Interlace is supported, 1 - Interlace is not supported if (AV(VAConfigAttribEncMaxRefFrames) != VA_ATTRIB_NOT_SUPPORTED) { m_caps.ddi_caps.MaxNum_Reference = AV(VAConfigAttribEncMaxRefFrames) & 0xffff; m_caps.ddi_caps.MaxNum_Reference1 = (AV(VAConfigAttribEncMaxRefFrames) >> 16) & 0xffff; } else { m_caps.ddi_caps.MaxNum_Reference = 1; m_caps.ddi_caps.MaxNum_Reference1 = 1; } if (AV(VAConfigAttribEncROI) != VA_ATTRIB_NOT_SUPPORTED) { auto VaEncROIValPtr = reinterpret_cast(&AV(VAConfigAttribEncROI)); assert(VaEncROIValPtr->bits.num_roi_regions < 32); m_caps.ddi_caps.MaxNumOfROI = VaEncROIValPtr->bits.num_roi_regions; m_caps.ddi_caps.ROIBRCPriorityLevelSupport = VaEncROIValPtr->bits.roi_rc_priority_support; m_caps.ddi_caps.ROIBRCDeltaQPLevelSupport = VaEncROIValPtr->bits.roi_rc_qp_delta_support; } else { m_caps.ddi_caps.MaxNumOfROI = 0; } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateAuxilliaryDevice(VideoCORE* core, GUID guid, mfxU32 width, mfxU32 height) mfxStatus VAAPIEncoder::CreateAccelerationService(MfxVideoParam const & par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::CreateAccelerationService"); if(IsMvcProfile(par.mfx.CodecProfile)) MFX_RETURN(MFX_ERR_UNSUPPORTED); if(0 == m_reconQueue.size()) { /* We need to pass reconstructed surfaces wheh call vaCreateContext(). * Here we don't have this info. */ m_videoParam = par; return MFX_ERR_NONE; } MFX_CHECK(m_vaDisplay, MFX_ERR_DEVICE_FAILED); VAStatus vaSts; mfxI32 entrypointsIndx = 0; mfxI32 numEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(numEntrypoints, MFX_ERR_DEVICE_FAILED); std::vector pEntrypoints(numEntrypoints); vaSts = vaQueryConfigEntrypoints( m_vaDisplay, ConvertProfileTypeMFX2VAAPI(par.mfx.CodecProfile), Begin(pEntrypoints), &numEntrypoints); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); VAEntrypoint entryPoint = IsOn(par.mfx.LowPower) ? VAEntrypointEncSliceLP : VAEntrypointEncSlice; if( !m_isENCPAK ) { bool bEncodeEnable = false; for( entrypointsIndx = 0; entrypointsIndx < numEntrypoints; entrypointsIndx++ ) { if( entryPoint == pEntrypoints[entrypointsIndx] ) { bEncodeEnable = true; break; } } if( !bEncodeEnable ) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } } // Configuration VAConfigAttrib attrib[3]; mfxI32 numAttrib = 0; mfxU32 flag = VA_PROGRESSIVE; attrib[0].type = VAConfigAttribRTFormat; attrib[1].type = VAConfigAttribRateControl; numAttrib += 2; vaSts = vaGetConfigAttributes(m_vaDisplay, ConvertProfileTypeMFX2VAAPI(par.mfx.CodecProfile), entryPoint, &attrib[0], numAttrib); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU32 vaRTFormat = ConvertMfxFourcc2VaapiRTFormat(par.mfx.FrameInfo.FourCC); if ((attrib[0].value & vaRTFormat) == 0) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } uint32_t vaRCType = ConvertRateControlMFX2VAAPI(par.mfx.RateControlMethod); mfxExtCodingOption2 const *extOpt2 = GetExtBuffer(par); if( NULL == extOpt2 ) { assert( extOpt2 ); MFX_RETURN(MFX_ERR_UNKNOWN); } m_mbbrc = IsOn(extOpt2->MBBRC) ? 1 : IsOff(extOpt2->MBBRC) ? 2 : 0; m_skipMode = extOpt2->SkipFrame; if ((attrib[1].value & vaRCType) == 0) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } attrib[0].value = VA_RT_FORMAT_YUV420; attrib[1].value = vaRCType; vaSts = vaCreateConfig( m_vaDisplay, ConvertProfileTypeMFX2VAAPI(par.mfx.CodecProfile), entryPoint, attrib, numAttrib, &m_vaConfig); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); std::vector reconSurf; for(unsigned int i = 0; i < m_reconQueue.size(); i++) reconSurf.push_back(m_reconQueue[i].surface); // Encoder create { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateContext"); vaSts = vaCreateContext( m_vaDisplay, m_vaConfig, m_width, m_height, flag, Begin(reconSurf), reconSurf.size(), &m_vaContextEncode); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU16 maxNumSlices = GetMaxNumSlices(par); m_slice.resize(maxNumSlices); m_sliceBufferId.resize(maxNumSlices); m_packedSliceHeaderBufferId.resize(maxNumSlices); m_packedSliceBufferId.resize(maxNumSlices); std::fill(m_sliceBufferId.begin(), m_sliceBufferId.end(), VA_INVALID_ID); std::fill(m_packedSliceHeaderBufferId.begin(), m_packedSliceHeaderBufferId.end(), VA_INVALID_ID); std::fill(m_packedSliceBufferId.begin(), m_packedSliceBufferId.end(), VA_INVALID_ID); Zero(m_sps); Zero(m_pps); Zero(m_slice); //------------------------------------------------------------------ FillSps(par, m_sps); FillBrcStructures(par, m_vaBrcPar, m_vaFrameRate); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetHRD(par, m_vaDisplay, m_vaContextEncode, m_hrdBufferId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetRateControl(par, m_mbbrc, 0, 0, 0, m_vaDisplay, m_vaContextEncode, m_rateParamBufferId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetFrameRate(par, m_vaDisplay, m_vaContextEncode, m_frameRateId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetQualityLevel(par, m_vaDisplay, m_vaContextEncode, m_qualityLevelId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetQualityParams(par, m_vaDisplay, m_vaContextEncode, m_qualityParamsId), MFX_ERR_DEVICE_FAILED); if (extOpt2->MaxSliceSize != 0) { mfxStatus sts = SetMaxSliceSize(extOpt2->MaxSliceSize, m_vaDisplay, m_vaContextEncode, m_maxSliceSizeId); MFX_CHECK_WITH_ASSERT(sts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); } FillConstPartOfPps(par, m_pps); if (m_caps.ddi_caps.HeaderInsertion == 0) { m_headerPacker.Init(par, m_caps); if (m_headerPacker.isSvcPrefixUsed()) { m_packedSvcPrefixHeaderBufferId.resize(maxNumSlices, VA_INVALID_ID); m_packedSvcPrefixBufferId.resize(maxNumSlices, VA_INVALID_ID); } } mfxExtCodingOption3 const *extOpt3 = GetExtBuffer(par); if (extOpt3) { if (IsOn(extOpt3->MBDisableSkipMap)) m_mb_noskip_buffer.resize(mfx::align2_value(m_width / 16, 64) * mfx::align2_value(m_height / 16, 8)); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateAccelerationService(MfxVideoParam const & par) mfxStatus VAAPIEncoder::Reset(MfxVideoParam const & par) { // MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Enc Reset"); m_videoParam = par; mfxExtCodingOption2 const *extOpt2 = GetExtBuffer(par); mfxExtCodingOption3 const *extOpt3 = GetExtBuffer(par); if( NULL == extOpt2 ) { assert( extOpt2 ); MFX_RETURN(MFX_ERR_UNKNOWN); } m_mbbrc = IsOn(extOpt2->MBBRC) ? 1 : IsOff(extOpt2->MBBRC) ? 2 : 0; m_skipMode = extOpt2->SkipFrame; FillSps(par, m_sps); VAEncMiscParameterRateControl oldBrcPar = m_vaBrcPar; VAEncMiscParameterFrameRate oldFrameRate = m_vaFrameRate; FillBrcStructures(par, m_vaBrcPar, m_vaFrameRate); // BRC reset is processed by driver inside vaRenderPicture(), // so set it here and use in 1st subsequent Execute() m_isBrcResetRequired = !Equal(m_vaBrcPar, oldBrcPar) || !Equal(m_vaFrameRate, oldFrameRate) || m_userMaxFrameSize != extOpt2->MaxFrameSize; MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetHRD(par, m_vaDisplay, m_vaContextEncode, m_hrdBufferId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetRateControl(par, m_mbbrc, 0, 0, 0, m_vaDisplay, m_vaContextEncode, m_rateParamBufferId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetFrameRate(par, m_vaDisplay, m_vaContextEncode, m_frameRateId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetQualityLevel(par, m_vaDisplay, m_vaContextEncode, m_qualityLevelId), MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetQualityParams(par, m_vaDisplay, m_vaContextEncode, m_qualityParamsId), MFX_ERR_DEVICE_FAILED); if (extOpt2->MaxSliceSize != 0) { mfxStatus sts = SetMaxSliceSize(extOpt2->MaxSliceSize, m_vaDisplay, m_vaContextEncode, m_maxSliceSizeId); MFX_CHECK_WITH_ASSERT(sts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); } FillConstPartOfPps(par, m_pps); if (m_caps.ddi_caps.HeaderInsertion == 0) m_headerPacker.Init(par, m_caps); if (extOpt3) { if (IsOn(extOpt3->MBDisableSkipMap)) m_mb_noskip_buffer.resize(mfx::align2_value(m_width / 16, 64) * mfx::align2_value(m_height / 16, 8)); } /* Destroy existing FEI buffers * For next Execute() call new buffer sets will re-allocated */ if (m_isENCPAK) { mfxStatus mfxSts; for( mfxU32 i = 0; i < m_vaFeiMBStatId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMBStatId[i]); MFX_CHECK_STS(mfxSts); } for( mfxU32 i = 0; i < m_vaFeiMVOutId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMVOutId[i]); MFX_CHECK_STS(mfxSts); } for( mfxU32 i = 0; i < m_vaFeiMCODEOutId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMCODEOutId[i]); MFX_CHECK_STS(mfxSts); } std::fill(m_vaFeiMBStatBufSize.begin(), m_vaFeiMBStatBufSize.end(), 0); std::fill(m_vaFeiMVOutBufSize.begin(), m_vaFeiMVOutBufSize.end(), 0); std::fill(m_vaFeiMCODEOutBufSize.begin(), m_vaFeiMCODEOutBufSize.end(), 0); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Reset(MfxVideoParam const & par) mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT /*type*/, mfxFrameAllocRequest& request) { // request linear buffer request.Info.FourCC = MFX_FOURCC_P8; // context_id required for allocation video memory (tmp solution) request.AllocId = m_vaContextEncode; return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest& request) mfxStatus VAAPIEncoder::QueryEncodeCaps(MFX_ENCODE_CAPS& caps) { caps = m_caps; return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryEncodeCaps(MFX_ENCODE_CAPS& caps) mfxStatus VAAPIEncoder::QueryMbPerSec(mfxVideoParam const & par, mfxU32 (&mbPerSec)[16]) { VAConfigID config = VA_INVALID_ID; VAConfigAttrib attrib[2]; attrib[0].type = VAConfigAttribRTFormat; attrib[0].value = VA_RT_FORMAT_YUV420; attrib[1].type = VAConfigAttribRateControl; attrib[1].value = ConvertRateControlMFX2VAAPI(par.mfx.RateControlMethod); VAStatus vaSts = vaCreateConfig( m_vaDisplay, ConvertProfileTypeMFX2VAAPI(par.mfx.CodecProfile), IsOn(par.mfx.LowPower) ? VAEntrypointEncSliceLP : VAEntrypointEncSlice, attrib, 2, &config); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); VAProcessingRateParameter proc_rate_buf = { }; mfxU32 & processing_rate = mbPerSec[0]; proc_rate_buf.proc_buf_enc.level_idc = par.mfx.CodecLevel ? par.mfx.CodecLevel : 0xff; proc_rate_buf.proc_buf_enc.quality_level = par.mfx.TargetUsage ? par.mfx.TargetUsage : 0xffff; proc_rate_buf.proc_buf_enc.intra_period = par.mfx.GopPicSize ? par.mfx.GopPicSize : 0xffff; proc_rate_buf.proc_buf_enc.ip_period = par.mfx.GopRefDist ? par.mfx.GopRefDist : 0xffff; vaSts = vaQueryProcessingRate(m_vaDisplay, config, &proc_rate_buf, &processing_rate); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaDestroyConfig(m_vaDisplay, config); return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::QueryHWGUID(VideoCORE * /*core*/, GUID /*guid*/, bool /*isTemporal*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus VAAPIEncoder::Register(mfxFrameAllocResponse& response, D3DDDIFORMAT type) { std::vector * pQueue; mfxStatus sts; if( D3DDDIFMT_INTELENCODE_BITSTREAMDATA == type ) { pQueue = &m_bsQueue; } else { pQueue = &m_reconQueue; } { // we should register allocated HW bitstreams and recon surfaces MFX_CHECK( response.mids, MFX_ERR_NULL_PTR ); ExtVASurface extSurf; VASurfaceID *pSurface = NULL; for (mfxU32 i = 0; i < response.NumFrameActual; i++) { sts = m_core->GetFrameHDL(response.mids[i], (mfxHDL *)&pSurface); MFX_CHECK_STS(sts); extSurf.number = i; extSurf.surface = *pSurface; pQueue->push_back( extSurf ); } } if( D3DDDIFMT_INTELENCODE_BITSTREAMDATA != type ) { sts = CreateAccelerationService(m_videoParam); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Register(mfxFrameAllocResponse& response, D3DDDIFORMAT type) bool operator==(const ENCODE_ENC_CTRL_CAPS& l, const ENCODE_ENC_CTRL_CAPS& r) { return memcmp(&l, &r, sizeof(ENCODE_ENC_CTRL_CAPS)) == 0; } bool operator!=(const ENCODE_ENC_CTRL_CAPS& l, const ENCODE_ENC_CTRL_CAPS& r) { return !(l == r); } //static int debug_frame_bum = 0; mfxStatus VAAPIEncoder::Execute( mfxHDLPair pair, DdiTask const & task, mfxU32 fieldId, PreAllocatedVector const & sei) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H264 encode DDISubmitTask"); mfxHDL surface = pair.first; VAEncPackedHeaderParameterBuffer packed_header_param_buffer; VASurfaceID reconSurface; VASurfaceID *inputSurface = (VASurfaceID*)surface; VABufferID codedBuffer; std::vector configBuffers; std::vector packedBufferIndexes; mfxU32 i; VAStatus vaSts; mfxStatus mfxSts; mfxU8 skipFlag = task.SkipFlag(); mfxU16 skipMode = m_skipMode; mfxExtCodingOption2 const * ctrlOpt2 = GetExtBuffer(task.m_ctrl); mfxExtCodingOption3 const * ctrlOpt3 = GetExtBuffer(task.m_ctrl); mfxExtMBDisableSkipMap const * ctrlNoSkipMap = GetExtBuffer(task.m_ctrl); #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) mfxExtAVCRoundingOffset const * ctrlRoundingOffset = GetExtBuffer(task.m_ctrl, task.m_fid[fieldId]); #endif if (ctrlOpt2 && ctrlOpt2->SkipFrame <= MFX_SKIPFRAME_BRC_ONLY) skipMode = ctrlOpt2->SkipFrame; if (skipMode == MFX_SKIPFRAME_BRC_ONLY) { skipFlag = 0; // encode current frame as normal m_numSkipFrames += (mfxU8)task.m_ctrl.SkipFrame; } // update params { size_t slice_size_old = m_slice.size(); //Destroy old buffers for(size_t i = 0; i < slice_size_old; i++) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_sliceBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSliceHeaderBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSliceBufferId[i]); MFX_CHECK_STS(mfxSts); } for(size_t i = 0; i < m_packedSvcPrefixBufferId.size(); i++) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSvcPrefixHeaderBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSvcPrefixBufferId[i]); MFX_CHECK_STS(mfxSts); } UpdatePPS(task, fieldId, m_pps, m_reconQueue #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) , m_headerPacker.GetPackedCqmPpsNum() #endif ); if (task.m_SliceInfo.size()) UpdateSliceSizeLimited(m_caps, task, fieldId, m_sps, m_pps, m_slice, m_videoParam, m_reconQueue); else UpdateSlice(m_caps, task, fieldId, m_sps, m_pps, m_slice, m_videoParam, m_reconQueue); if (slice_size_old != m_slice.size()) { m_sliceBufferId.resize(m_slice.size()); m_packedSliceHeaderBufferId.resize(m_slice.size()); m_packedSliceBufferId.resize(m_slice.size()); if (m_headerPacker.isSvcPrefixUsed()) { m_packedSvcPrefixHeaderBufferId.resize(m_slice.size()); m_packedSvcPrefixBufferId.resize(m_slice.size()); } } } configBuffers.reserve(MAX_CONFIG_BUFFERS_COUNT + m_slice.size() * 2 + m_packedSvcPrefixBufferId.size() * 2); /* for debug only */ //fprintf(stderr, "----> Encoding frame = %u, type = %u\n", debug_frame_bum++, ConvertMfxFrameType2SliceType( task.m_type[fieldId]) -5 ); //------------------------------------------------------------------ // find bitstream mfxU32 idxBs = task.m_idxBs[fieldId]; if( idxBs < m_bsQueue.size() ) { codedBuffer = m_bsQueue[idxBs].surface; } else { MFX_RETURN(MFX_ERR_UNKNOWN); } // find reconstructed surface mfxU32 idxRecon = task.m_idxRecon; if( idxRecon < m_reconQueue.size()) { reconSurface = m_reconQueue[ idxRecon ].surface; } else { MFX_RETURN(MFX_ERR_UNKNOWN); } m_pps.coded_buf = codedBuffer; m_pps.CurrPic.picture_id = reconSurface; //------------------------------------------------------------------ // buffer creation & configuration //------------------------------------------------------------------ { // 1. sequence level { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSequenceParameterBufferType, sizeof(m_sps), 1, &m_sps, &m_spsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_spsBufferId); } // 2. Picture level { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPictureParameterBufferType, sizeof(m_pps), 1, &m_pps, &m_ppsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_ppsBufferId); } // 3. Slice level for( i = 0; i < m_slice.size(); i++ ) { // Buffer destroyed in the beginning of the function vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSliceParameterBufferType, sizeof(m_slice[i]), 1, &m_slice[i], &m_sliceBufferId[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } if (m_caps.ddi_caps.HeaderInsertion == 1 && skipFlag == NO_SKIP) { // SEI if (sei.Size() > 0) { packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = 1; packed_header_param_buffer.bit_length = sei.Size()*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSeiHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, sei.Size(), 1, RemoveConst(sei.Buffer()), &m_packedSeiBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_packedSeiHeaderBufferId); configBuffers.push_back(m_packedSeiBufferId); } } else { // AUD if (task.m_insertAud[fieldId]) { ENCODE_PACKEDHEADER_DATA const & packedAud = m_headerPacker.PackAud(task, fieldId); packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = !packedAud.SkipEmulationByteCount; packed_header_param_buffer.bit_length = packedAud.DataLength*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedAudHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedAudHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedAudBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedAud.DataLength, 1, packedAud.pData, &m_packedAudBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedAudHeaderBufferId); configBuffers.push_back(m_packedAudBufferId); } // SPS if (task.m_insertSps[fieldId]) { std::vector const & packedSpsArray = m_headerPacker.GetSps(); ENCODE_PACKEDHEADER_DATA const & packedSps = packedSpsArray[0]; packed_header_param_buffer.type = VAEncPackedHeaderSequence; packed_header_param_buffer.has_emulation_bytes = !packedSps.SkipEmulationByteCount; packed_header_param_buffer.bit_length = packedSps.DataLength*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSpsHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSpsHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSpsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedSps.DataLength, 1, packedSps.pData, &m_packedSpsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedSpsHeaderBufferId); configBuffers.push_back(m_packedSpsBufferId); } // PPS if (task.m_insertPps[fieldId]) { std::vector const & packedPpsArray = m_headerPacker.GetPps(); ENCODE_PACKEDHEADER_DATA const & packedPps = packedPpsArray[0]; packed_header_param_buffer.type = VAEncPackedHeaderPicture; packed_header_param_buffer.has_emulation_bytes = !packedPps.SkipEmulationByteCount; packed_header_param_buffer.bit_length = packedPps.DataLength*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedPpsHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedPpsHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedPpsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedPps.DataLength, 1, packedPps.pData, &m_packedPpsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedPpsHeaderBufferId); configBuffers.push_back(m_packedPpsBufferId); #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (IsCustMatrix(task.m_adaptiveCQMHint)) { mfxU32 extCqmNum = m_headerPacker.GetPackedCqmPpsNum(); if (extCqmNum > 0) { std::vector const & packedCqmPps = m_headerPacker.GetPps(true); for (mfxU32 cqmIndex = 0; cqmIndex < extCqmNum; cqmIndex++) { packed_header_param_buffer.has_emulation_bytes = !packedCqmPps[cqmIndex].SkipEmulationByteCount; packed_header_param_buffer.bit_length = packedCqmPps[cqmIndex].DataLength * 8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedCqmPpsHeaderBufferId[cqmIndex]); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedCqmPpsHeaderBufferId[cqmIndex]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedCqmPpsBufferId[cqmIndex]); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedCqmPps[cqmIndex].DataLength, 1, packedCqmPps[cqmIndex].pData, &m_packedCqmPpsBufferId[cqmIndex]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedCqmPpsHeaderBufferId[cqmIndex]); configBuffers.push_back(m_packedCqmPpsBufferId[cqmIndex]); } } } #endif } // SEI if (sei.Size() > 0) { packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = 1; packed_header_param_buffer.bit_length = sei.Size()*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSeiHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, sei.Size(), 1, RemoveConst(sei.Buffer()), &m_packedSeiBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedSeiHeaderBufferId); configBuffers.push_back(m_packedSeiBufferId); } if (skipFlag != NO_SKIP) { // The whole slice ENCODE_PACKEDHEADER_DATA const & packedSkippedSlice = m_headerPacker.PackSkippedSlice(task, fieldId); packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = !packedSkippedSlice.SkipEmulationByteCount; packed_header_param_buffer.bit_length = packedSkippedSlice.DataLength*8; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSkippedSliceHeaderBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSkippedSliceHeaderBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSkippedSliceBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedSkippedSlice.DataLength, 1, packedSkippedSlice.pData, &m_packedSkippedSliceBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); packedBufferIndexes.push_back(configBuffers.size()); configBuffers.push_back(m_packedSkippedSliceHeaderBufferId); configBuffers.push_back(m_packedSkippedSliceBufferId); } else { // length of Prefix NAL unit: now it's always 8 bytes for reference picture, and 7 bytes for non-reference picture // need to add zero_byte if AU starts from Prefix NAL unit mfxU32 prefix_bytes = (7 + !!task.m_nalRefIdc[fieldId]) * m_headerPacker.isSvcPrefixUsed(); //Slice headers only std::vector const & packedSlices = m_headerPacker.PackSlices(task, fieldId); for (size_t i = 0; i < packedSlices.size(); i++) { ENCODE_PACKEDHEADER_DATA const & packedSlice = packedSlices[i]; if (prefix_bytes) { packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = 1; packed_header_param_buffer.bit_length = (prefix_bytes * 8); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSvcPrefixHeaderBufferId[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, prefix_bytes, 1, packedSlice.pData, &m_packedSvcPrefixBufferId[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_packedSvcPrefixHeaderBufferId[i]); configBuffers.push_back(m_packedSvcPrefixBufferId[i]); } packed_header_param_buffer.type = VAEncPackedHeaderH264_Slice; packed_header_param_buffer.has_emulation_bytes = 0; packed_header_param_buffer.bit_length = packedSlice.DataLength - (prefix_bytes * 8); // DataLength is already in bits ! // Buffer destroyed in the beginning of the function vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedSliceHeaderBufferId[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); // Buffer destroyed in the beginning of the function vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, (packedSlice.DataLength + 7) / 8 - prefix_bytes, 1, packedSlice.pData + prefix_bytes, &m_packedSliceBufferId[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_packedSliceHeaderBufferId[i]); configBuffers.push_back(m_packedSliceBufferId[i]); } } } configBuffers.push_back(m_hrdBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetRateControl(m_videoParam, m_mbbrc, task.m_minQP, task.m_maxQP, task.m_TCBRCTargetFrameSize, m_vaDisplay, m_vaContextEncode, m_rateParamBufferId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_rateParamBufferId); configBuffers.push_back(m_frameRateId); configBuffers.push_back(m_qualityLevelId); mfxExtCodingOption2 const *extOpt2 = GetExtBuffer(m_videoParam); if (extOpt2 && extOpt2->MaxSliceSize != 0) configBuffers.push_back(m_maxSliceSizeId); if (m_isBrcResetRequired) { MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetBrcResetRequired(m_vaDisplay, m_rateParamBufferId, m_isBrcResetRequired), MFX_ERR_DEVICE_FAILED); m_isBrcResetRequired = false; } /* * Limit frame size by application/user level */ m_userMaxFrameSize = (UINT)task.m_maxIFrameSize; // if (task.m_frameOrder) // m_sps.bResetBRC = true; MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetMaxFrameSize(m_userMaxFrameSize, m_vaDisplay, m_vaContextEncode, m_maxFrameSizeId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_maxFrameSizeId); #if VA_CHECK_VERSION(1,3,0) if (task.m_brcFrameCtrl.MaxNumRepak && task.m_brcFrameCtrl.MaxFrameSize) { mfxSts = SetMultiPassFrameSize(task, fieldId, m_vaDisplay, m_vaContextEncode, m_multiPassFrameSizeId); MFX_CHECK_WITH_ASSERT(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_multiPassFrameSizeId); } #endif #if !defined(ANDROID) /* * By default (0) - driver will decide. * 1 - disable trellis quantization * x0E - enable for any type of frames */ if (m_newTrellisQuantization != 0) { m_curTrellisQuantization = m_newTrellisQuantization; MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetTrellisQuantization(m_curTrellisQuantization, m_vaDisplay, m_vaContextEncode, m_quantizationId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_quantizationId); } #endif /* * RollingIntraRefresh */ if (memcmp(&task.m_IRState, &m_RIRState, sizeof(m_RIRState))) { m_RIRState = task.m_IRState; MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetRollingIntraRefresh(m_RIRState, m_vaDisplay, m_vaContextEncode, m_rirId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_rirId); } if (task.m_numRoi) { MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetROI(task, m_arrayVAEncROI, m_vaDisplay, m_vaContextEncode, m_roiBufferId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_roiBufferId); } /*FEI has its own interface for MBQp*/ if ((task.m_isMBQP[fieldId]) && (!m_isENCPAK)) { mfxFrameData qpMap = {}; FrameLocker lock(m_core, qpMap, task.m_midMBQP[fieldId]); static_assert(sizeof(VAEncQPBufferH264) == 1, "qpMapBuffer must be changed"); mfxU32 mbH = mfx::align2_value(m_sps.picture_height_in_mbs >> (!!task.m_fieldPicFlag),8); mfxU32 mbW = mfx::align2_value(m_sps.picture_width_in_mbs, 64); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbqpBufferId); MFX_CHECK_STS(mfxSts); // LibVA expect full buffer size w/o interlace adjustments vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncQPBufferType, mbW, mbH, qpMap.Y, &m_mbqpBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_mbqpBufferId); } if (ctrlNoSkipMap) { mfxU32 mbW = m_sps.picture_width_in_mbs; mfxU32 mbH = m_sps.picture_height_in_mbs / (2 - !task.m_fieldPicFlag); //width(64byte alignment) height(8byte alignment) mfxU32 bufW = mfx::align2_value(mbW, 64); mfxU32 bufH = mfx::align2_value(mbH, 8); mfxU32 fieldOffset = (mfxU32)fieldId * (mbH * mbW) * (mfxU32)!!task.m_fieldPicFlag; if ( m_mb_noskip_buffer.size() >= (bufW * bufH) && ctrlNoSkipMap->Map && ctrlNoSkipMap->MapSize >= (mbW * m_sps.picture_height_in_mbs)) { Zero(m_mb_noskip_buffer); for (mfxU32 mbRow = 0; mbRow < mbH; mbRow ++) MFX_INTERNAL_CPY(&m_mb_noskip_buffer[mbRow * bufW], &ctrlNoSkipMap->Map[fieldOffset + mbRow * mbW], mbW); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbNoSkipBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMacroblockDisableSkipMapBufferType, (bufW * bufH), 1, &m_mb_noskip_buffer[0], &m_mbNoSkipBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_mbNoSkipBufferId); } } #if defined(MFX_ENABLE_AVC_CUSTOM_QMATRIX) if (m_pps.pic_fields.bits.pic_scaling_matrix_present_flag || m_sps.seq_fields.bits.seq_scaling_matrix_present_flag) { VAIQMatrixBufferH264 m_qMatrix; memcpy(m_qMatrix.ScalingList4x4, task.m_qMatrix.scalingList4x4, sizeof(task.m_qMatrix.scalingList4x4)); memcpy(m_qMatrix.ScalingList8x8, task.m_qMatrix.scalingList8x8, sizeof(task.m_qMatrix.scalingList8x8)); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qmBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAQMatrixBufferType, sizeof(m_qMatrix), 1, &m_qMatrix, &m_qmBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (m_qmBufferId != VA_INVALID_ID) configBuffers.push_back(m_qmBufferId); } #endif #if defined (MFX_ENABLE_H264_ROUNDING_OFFSET) if (m_caps.ddi_caps.RoundingOffset && ctrlRoundingOffset) { MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetRoundingOffset(m_vaDisplay, m_vaContextEncode, *ctrlRoundingOffset, m_roundingOffsetId), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_roundingOffsetId); } #endif #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) if ((mfxExtIntGPUHang*)GetExtBuffer(task.m_ctrl)) { unsigned int trigger_hang = 1; mfxStatus mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_triggerGpuHangBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VATriggerCodecHangBufferType, sizeof(trigger_hang), 1, &trigger_hang, &m_triggerGpuHangBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_triggerGpuHangBufferId); } #endif if (ctrlOpt2 || ctrlOpt3) { MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetQualityParams(m_videoParam, m_vaDisplay, m_vaContextEncode, m_qualityParamsId, &task), MFX_ERR_DEVICE_FAILED); } if (VA_INVALID_ID != m_qualityParamsId) configBuffers.push_back(m_qualityParamsId); mfxU32 storedSize = 0; #ifndef MFX_AVC_ENCODING_UNIT_DISABLE if (task.m_collectUnitsInfo) { m_headerPacker.GetHeadersInfo(task.m_headersCache[fieldId], task, fieldId); } #endif if (skipFlag != NORMAL_MODE) { MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetSkipFrame(m_vaDisplay, m_vaContextEncode, m_miscParameterSkipBufferId, skipFlag ? skipFlag : !!m_numSkipFrames, m_numSkipFrames, m_sizeSkipFrames), MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_miscParameterSkipBufferId); m_numSkipFrames = 0; m_sizeSkipFrames = 0; mdprintf(stderr, "task.m_frameNum=%d\n", task.m_frameNum); mdprintf(stderr, "inputSurface=%d\n", *inputSurface); mdprintf(stderr, "m_pps.CurrPic.picture_id=%d\n", m_pps.CurrPic.picture_id); mdprintf(stderr, "m_pps.ReferenceFrames[0]=%d\n", m_pps.ReferenceFrames[0].picture_id); mdprintf(stderr, "m_pps.ReferenceFrames[1]=%d\n", m_pps.ReferenceFrames[1].picture_id); //------------------------------------------------------------------ // Rendering //------------------------------------------------------------------ MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|AVC|PACKET_START|", "%d|%d", m_vaContextEncode, task.m_frameNum); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); vaSts = vaBeginPicture( m_vaDisplay, m_vaContextEncode, *inputSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture"); vaSts = vaRenderPicture( m_vaDisplay, m_vaContextEncode, configBuffers.data(), configBuffers.size()); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); for(i = 0; i < m_slice.size(); i++) { vaSts = vaRenderPicture( m_vaDisplay, m_vaContextEncode, &m_sliceBufferId[i], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); vaSts = vaEndPicture(m_vaDisplay, m_vaContextEncode); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|AVC|PACKET_END|", "%d|%d", m_vaContextEncode, task.m_frameNum); } else { VACodedBufferSegment *codedBufferSegment; { codedBuffer = m_bsQueue[task.m_idxBs[fieldId]].surface; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer( m_vaDisplay, codedBuffer, (void **)(&codedBufferSegment)); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } codedBufferSegment->next = 0; codedBufferSegment->reserved = 0; codedBufferSegment->status = 0; MFX_CHECK_WITH_ASSERT(codedBufferSegment->buf, MFX_ERR_DEVICE_FAILED); mfxU8 * bsDataStart = (mfxU8 *)codedBufferSegment->buf; mfxU8 * bsDataEnd = bsDataStart; if (skipMode != MFX_SKIPFRAME_INSERT_NOTHING) { for (size_t i = 0; i < packedBufferIndexes.size(); i++) { size_t headerIndex = packedBufferIndexes[i]; void *pBufferHeader; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(m_vaDisplay, configBuffers[headerIndex], &pBufferHeader); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); void *pData; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer(m_vaDisplay, configBuffers[headerIndex + 1], &pData); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (pBufferHeader && pData) { VAEncPackedHeaderParameterBuffer const & header = *(VAEncPackedHeaderParameterBuffer const *)pBufferHeader; mfxU32 lenght = (header.bit_length+7)/8; assert(mfxU32(bsDataStart + m_width*m_height - bsDataEnd) > lenght); assert(header.has_emulation_bytes); MFX_INTERNAL_CPY(bsDataEnd, pData, lenght); bsDataEnd += lenght; } vaSts = vaUnmapBuffer(m_vaDisplay, configBuffers[headerIndex]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaUnmapBuffer(m_vaDisplay, configBuffers[headerIndex + 1]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } storedSize = mfxU32(bsDataEnd - bsDataStart); codedBufferSegment->size = storedSize; m_numSkipFrames ++; m_sizeSkipFrames += (skipMode != MFX_SKIPFRAME_INSERT_NOTHING) ? storedSize : 0; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer( m_vaDisplay, codedBuffer ); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } //------------------------------------------------------------------ // PostStage //------------------------------------------------------------------ // put to cache { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback; currentFeedback.number = task.m_statusReportNumber[fieldId]; currentFeedback.surface = (NORMAL_MODE == skipFlag) ? VA_INVALID_SURFACE : *inputSurface; currentFeedback.idxBs = task.m_idxBs[fieldId]; currentFeedback.size = storedSize; m_feedbackCache.push_back( currentFeedback ); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Execute(ExecuteBuffers& data, mfxU32 fieldId) mfxStatus VAAPIEncoder::QueryStatus( DdiTask & task, mfxU32 fieldId, bool /*useEvent*/) { mfxStatus sts = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H264 encode DDIWaitTaskSync"); bool isFound = false; VASurfaceID waitSurface; mfxU32 waitIdxBs; mfxU32 waitSize; mfxU32 indxSurf; ExtVASurface currentFeedback; UMC::AutomaticUMCMutex guard(m_guard); for( indxSurf = 0; indxSurf < m_feedbackCache.size(); indxSurf++ ) { currentFeedback = m_feedbackCache[ indxSurf ]; if( currentFeedback.number == task.m_statusReportNumber[fieldId] ) { waitSurface = currentFeedback.surface; waitIdxBs = currentFeedback.idxBs; waitSize = currentFeedback.size; isFound = true; break; } } if( !isFound ) { MFX_RETURN(MFX_ERR_UNKNOWN); } if (VA_INVALID_SURFACE == waitSurface) //skipped frame { task.m_bsDataLength[fieldId] = waitSize; m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); return MFX_ERR_NONE; } // find used bitstream VABufferID codedBuffer; if(waitIdxBs < m_bsQueue.size()) { codedBuffer = m_bsQueue[waitIdxBs].surface; } else { MFX_RETURN(MFX_ERR_UNKNOWN); } VAStatus vaSts = VA_STATUS_SUCCESS; #if defined(SYNCHRONIZATION_BY_VA_MAP_BUFFER) m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); guard.Unlock(); #else # if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); guard.Unlock(); # else VASurfaceStatus surfSts = VASurfaceSkipped; vaSts = vaQuerySurfaceStatus(m_vaDisplay, waitSurface, &surfSts); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (VASurfaceReady == surfSts) { m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); guard.Unlock(); } else if (VASurfaceRendering == surfSts || VASurfaceDisplaying == surfSts) { MFX_RETURN(MFX_WRN_DEVICE_BUSY); } else { assert(!"bad feedback status"); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } #endif // #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) #endif // #if defined(SYNCHRONIZATION_BY_VA_MAP_BUFFER) #if VA_CHECK_VERSION(1,9,0) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncBuffer"); vaSts = vaSyncBuffer(m_vaDisplay, codedBuffer, VA_TIMEOUT_INFINITE); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #endif VACodedBufferSegment *codedBufferSegment = 0; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer( m_vaDisplay, codedBuffer, (void **)(&codedBufferSegment)); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } task.m_bsDataLength[fieldId] = codedBufferSegment->size; // Disable QP report on Linux until driver fix. task.m_qpY[fieldId] = (codedBufferSegment->status & VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK); if (codedBufferSegment->status & VA_CODED_BUF_STATUS_BAD_BITSTREAM) sts = MFX_ERR_GPU_HANG; else if (!codedBufferSegment->size || !codedBufferSegment->buf) sts = MFX_ERR_DEVICE_FAILED; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer( m_vaDisplay, codedBuffer ); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); MFX_CHECK_STS(sts); if (m_isENCPAK) { // Use parity to order conversion here (FEI ext buffers attached by field order, but MSDK operates in terms of fields parity) sts = VAAPIEncoder::QueryStatusFEI(task, task.m_fid[fieldId], currentFeedback, codedBufferSegment->status); MFX_CHECK_STS(sts); } return sts; } //mfxStatus VAAPIEncoder::QueryStatus mfxStatus VAAPIEncoder::QueryStatusFEI( DdiTask const & task, mfxU32 feiFieldId, ExtVASurface const & curFeedback, mfxU32 codedStatus) { (void)codedStatus; (void)task; (void)feiFieldId; (void)curFeedback; MFX_RETURN(MFX_ERR_UNKNOWN); } //mfxStatus VAAPIEncoder::QueryStatusFEI mfxStatus VAAPIEncoder::Destroy() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Destroy"); VAStatus vaSts; mfxStatus mfxSts; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_hrdBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_rateParamBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_frameRateId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qualityLevelId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_maxFrameSizeId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_multiPassFrameSizeId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_quantizationId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_rirId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qualityParamsId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParameterSkipBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_maxSliceSizeId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_roiBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbqpBufferId); MFX_CHECK_STS(mfxSts); #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qmBufferId); MFX_CHECK_STS(mfxSts); #endif #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_triggerGpuHangBufferId); MFX_CHECK_STS(mfxSts); #endif mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbNoSkipBufferId); MFX_CHECK_STS(mfxSts); for(mfxU32 i = 0; i < m_slice.size(); i++) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_sliceBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSliceHeaderBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSliceBufferId[i]); MFX_CHECK_STS(mfxSts); } for(size_t i = 0; i < m_packedSvcPrefixBufferId.size(); i++) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSvcPrefixHeaderBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSvcPrefixBufferId[i]); MFX_CHECK_STS(mfxSts); } #if defined (MFX_ENABLE_AVC_CUSTOM_QMATRIX) for (size_t i = 0; i < m_packedCqmPpsBufferId.size(); i++) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedCqmPpsHeaderBufferId[i]); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedCqmPpsBufferId[i]); MFX_CHECK_STS(mfxSts); } #endif mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedAudHeaderBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedAudBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSpsHeaderBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSpsBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedPpsHeaderBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedPpsBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiHeaderBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSeiBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSkippedSliceHeaderBufferId); MFX_CHECK_STS(mfxSts); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedSkippedSliceBufferId); MFX_CHECK_STS(mfxSts); for( mfxU32 i = 0; i < m_vaFeiMBStatId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMBStatId[i]); MFX_CHECK_STS(mfxSts); } for( mfxU32 i = 0; i < m_vaFeiMVOutId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMVOutId[i]); MFX_CHECK_STS(mfxSts); } for( mfxU32 i = 0; i < m_vaFeiMCODEOutId.size(); i++ ) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_vaFeiMCODEOutId[i]); MFX_CHECK_STS(mfxSts); } if (m_vaContextEncode != VA_INVALID_ID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaDestroyContext"); vaSts = vaDestroyContext(m_vaDisplay, m_vaContextEncode); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_vaContextEncode = VA_INVALID_ID; } if (m_vaConfig != VA_INVALID_ID) { vaSts = vaDestroyConfig(m_vaDisplay, m_vaConfig); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_vaConfig = VA_INVALID_ID; } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Destroy() #endif // MFX_ENABLE_H264_VIDEO_ENCODE /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/000077500000000000000000000000001443134507600252355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/000077500000000000000000000000001443134507600270445ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base/000077500000000000000000000000001443134507600277565ustar00rootroot00000000000000hevcehw_base_alloc.cpp000066400000000000000000000057061443134507600342100ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_alloc.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; template inline typename CallChain::TInt WrapCC(TR(MfxEncodeHW::ResPool::*pfn)(TArgs...), MfxEncodeHW::ResPool* pAlloc) { return [=](typename CallChain::TExt, TArgs ...arg) { return (pAlloc->*pfn)(arg...); }; } template inline typename CallChain::TInt WrapCC(TR(MfxEncodeHW::ResPool::*pfn)(TArgs...) const, const MfxEncodeHW::ResPool* pAlloc) { return [=](typename CallChain::TExt, TArgs ...arg) { return (pAlloc->*pfn)(arg...); }; } IAllocation* Allocator::MakeAlloc(std::unique_ptr&& upAlloc) { std::unique_ptr pIAlloc(new IAllocation); bool bInvalid = !(pIAlloc && upAlloc); if (bInvalid) return nullptr; auto pAlloc = upAlloc.release(); #define WRAP_CC(X) pIAlloc->X.Push(WrapCC(&MfxEncodeHW::ResPool::X, pAlloc)) WRAP_CC(Alloc); WRAP_CC(GetResponse); WRAP_CC(GetInfo); WRAP_CC(Release); WRAP_CC(ClearFlag); WRAP_CC(SetFlag); WRAP_CC(GetFlag); WRAP_CC(UnlockAll); WRAP_CC(Acquire); pIAlloc->m_pthis.reset(pAlloc); return pIAlloc.release(); } void Allocator::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [](StorageRW&, StorageRW& local) -> mfxStatus { auto CreateAllocator = [](VideoCORE& core) -> IAllocation* { return MakeAlloc(std::unique_ptr(new MfxEncodeHW::ResPool(core))); }; local.Insert(Tmp::MakeAlloc::Key, new Tmp::MakeAlloc::TRef(CreateAllocator)); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_alloc.h000066400000000000000000000033741443134507600336540ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "ehw_resources_pool.h" namespace HEVCEHW { namespace Base { class Allocator : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) #define DECL_FEATURE_NAME "Base_Allocator" #include "hevcehw_decl_blocks.h" Allocator(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; static IAllocation* MakeAlloc(std::unique_ptr&&); }; } //Base } //namespace HEVCEHW #endif hevcehw_base_caps.cpp000066400000000000000000000254211443134507600340400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_caps.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Caps::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { using Base::Glob; using Base::Defaults; Push(BLK_SetLowPower, [](const mfxVideoParam&, mfxVideoParam& par, StorageRW&) -> mfxStatus { mfxU32 invalid = 0; invalid += Check (par.mfx.LowPower); if (invalid) { par.mfx.LowPower = MFX_CODINGOPTION_ON; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } SetIf(par.mfx.LowPower, par.mfx.LowPower == MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON); return MFX_ERR_NONE; }); Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetLowPower.Push([]( Defaults::TGetHWDefault::TExt /*prev*/ , const mfxVideoParam& /*par*/ , eMFXHWType /*hw*/) { return mfxU16(MFX_CODINGOPTION_ON); }); defaults.GetMaxNumRef.Push([]( Base::Defaults::TChain>::TExt , const Base::Defaults::Param& dpar) { //HEVC VDENC Maximum supported number const mfxU16 nRef[3] = { 3, 2, 1 }; mfxU16 numRefFrame = dpar.mvp.mfx.NumRefFrame + !dpar.mvp.mfx.NumRefFrame * 16; return std::make_tuple( std::min(nRef[0], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[1], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[2], std::min(dpar.caps.MaxNum_Reference1, numRefFrame))); }); defaults.GetNumRefActive.Push([]( Base::Defaults::TGetNumRefActive::TExt , const Base::Defaults::Param& dpar , mfxU16(*pP)[8] , mfxU16(*pBL0)[8] , mfxU16(*pBL1)[8]) { bool bExternal = false; mfxU16 defaultP = 0, defaultBL0 = 0, defaultBL1 = 0; const mfxU16 nRef[3][7] = { // HEVC VDENC default reference number with TU { 3, 3, 2, 2, 2, 1, 1 }, { 2, 2, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1 } }; mfxU16 tu = dpar.mvp.mfx.TargetUsage; CheckRangeOrSetDefault(tu, 1, 7, 4); --tu; mfxU16 numRefFrame = dpar.mvp.mfx.NumRefFrame + !dpar.mvp.mfx.NumRefFrame * 16; // Get default active frame number std::tie(defaultP, defaultBL0, defaultBL1) = std::make_tuple( std::min(nRef[0][tu], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[1][tu], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[2][tu], std::min(dpar.caps.MaxNum_Reference1, numRefFrame))); auto SetDefaultNRef = [](const mfxU16(*extRef)[8], mfxU16 defaultRef, mfxU16(*NumRefActive)[8]) { bool bExternal = false; bool bDone = false; bDone |= !NumRefActive; bDone |= !bDone && !extRef && std::fill_n(*NumRefActive, 8, defaultRef); bDone |= !bDone && std::transform( *extRef , std::end(*extRef) , *NumRefActive , [&](mfxU16 ext) { bExternal |= SetIf(defaultRef, !!ext, ext); return defaultRef; }); return bExternal; }; const mfxU16(*extRefP)[8] = nullptr; const mfxU16(*extRefBL0)[8] = nullptr; const mfxU16(*extRefBL1)[8] = nullptr; if (const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(dpar.mvp)) { extRefP = &pCO3->NumRefActiveP; extRefBL0 = &pCO3->NumRefActiveBL0; extRefBL1 = &pCO3->NumRefActiveBL1; } bExternal |= SetDefaultNRef(extRefP, defaultP, pP); bExternal |= SetDefaultNRef(extRefBL0, defaultBL0, pBL0); bExternal |= SetDefaultNRef(extRefBL1, defaultBL1, pBL1); return bExternal; }); defaults.CheckSlices.Push([]( Base::Defaults::TCheckAndFix::TExt prev , const Defaults::Param& dpar , mfxVideoParam& par) { auto sts = prev(dpar, par); MFX_CHECK_STS(sts); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); bool bCheckNMB = pCO2 && pCO2->NumMbPerSlice; if (bCheckNMB) { // It is not supported when LCU number in slice is not row aligned. mfxU16 W = dpar.base.GetCodedPicWidth(dpar); mfxU16 LCUSize = dpar.base.GetLCUSize(dpar); mfxU32 nLCUsInWidth = mfx::CeilDiv(W, LCUSize); MFX_CHECK(!(pCO2->NumMbPerSlice % nLCUsInWidth), MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; }); defaults.GetSPS.Push([]( Defaults::TGetSPS::TExt prev , const Defaults::Param& defPar , const Base::VPS& vps , Base::SPS& sps) { auto sts = prev(defPar, vps, sps); if (sps.temporal_mvp_enabled_flag) { sps.temporal_mvp_enabled_flag = (defPar.mvp.mfx.TargetUsage < 6); } return sts; }); defaults.GetGopRefDist.Push([]( Base::Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.GopRefDist) { return par.mvp.mfx.GopRefDist; } auto GopPicSize = par.base.GetGopPicSize(par); const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bNoB = (pCO2 && pCO2->IntRefType) || par.base.GetNumTemporalLayers(par) > 1 || par.caps.SliceIPOnly || GopPicSize < 3 || par.mvp.mfx.NumRefFrame == 1; if (bNoB) { return mfxU16(1); } return std::min(GopPicSize - 1, 8); }); defaults.GetTileSlices.Push([]( Base::Defaults::TGetTileSlices::TExt prev , const Defaults::Param& dpar , std::vector& slices , mfxU32 SliceStructure , mfxU32 nCol , mfxU32 nRow , mfxU32 nSlice) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(dpar.mvp); if (SliceStructure != ROWSLICE || (pCO2 && pCO2->NumMbPerSlice != 0)) { prev(dpar, slices, SliceStructure, nCol, nRow, nSlice); } else { nSlice = std::max(nSlice * (SliceStructure != 0), 1); nSlice = std::min(nSlice, nRow); mfxU32 nLCU = nCol * nRow; mfxU32 segAddr = 0; mfxU32 nSlicePrev = (mfxU32)slices.size(); mfxU32 nRowsPerSlice = mfx::CeilDiv(nRow, nSlice); mfxU32 nSliceIdx = nSlicePrev; if (nSlicePrev) { segAddr = slices.back().SegmentAddress + slices.back().NumLCU; } slices.resize(nSlicePrev + nSlice); SliceInfo zeroSI = {}; auto slBegin = std::next(slices.begin(), nSlicePrev); auto slEnd = slices.end(); std::fill(slBegin, slEnd, zeroSI); std::for_each( slBegin , slEnd , [&](SliceInfo& si) { si.NumLCU += nRowsPerSlice * nCol; si.SegmentAddress = segAddr; segAddr += si.NumLCU; nSliceIdx ++; if (nSliceIdx == (nRow % nSlice)) nRowsPerSlice -= 1; }); slices.back().NumLCU = slBegin->SegmentAddress + nLCU - slices.back().SegmentAddress; } return (mfxU16)nSlice; }); bSet = true; return MFX_ERR_NONE; }); } void Caps::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_HardcodeCaps , [this](const mfxVideoParam&, mfxVideoParam& par, StorageRW& strg) -> mfxStatus { auto& caps = HEVCEHW::Base::Glob::EncodeCaps::Get(strg); caps.SliceIPOnly = (par.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC); caps.msdk.PSliceSupport = true; SetSpecificCaps(caps); return MFX_ERR_NONE; }); } void Caps::GetVideoParam(const FeatureBlocks& /*blocks*/, TPushGVP Push) { Push(BLK_FixParam , [](mfxVideoParam& par, StorageR& /*global*/) -> mfxStatus { par.mfx.LowPower = MFX_CODINGOPTION_ON; return MFX_ERR_NONE; }); } void Caps::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW&, StorageRW&) { SetDefault(par.mfx.LowPower, MFX_CODINGOPTION_ON); }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_caps.h000066400000000000000000000041251443134507600335030ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class Caps : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(SetLowPower)\ DECL_BLOCK(HardcodeCaps)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(FixParam) #define DECL_FEATURE_NAME "Base_Caps" #include "hevcehw_decl_blocks.h" Caps(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void GetVideoParam(const FeatureBlocks& /*blocks*/, TPushGVP Push) override; virtual void SetSpecificCaps(Base::EncodeCapsHevc& /*caps*/) {}; virtual void SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) override; }; } //Base } //namespace HEVCEHW #endif hevcehw_base_constraints.cpp000066400000000000000000000201301443134507600354510ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_constraints.h" #include #include #include using namespace HEVCEHW; using namespace HEVCEHW::Base; const mfxU32 TableA1[][6] = { // Level |MaxLumaPs | MaxCPB | MaxSlice | MaxTileRows | MaxTileCols // Segments | // PerPicture| /* 1 */ { 36864, 350, 350, 16, 1, 1}, /* 2 */ { 122880, 1500, 1500, 16, 1, 1}, /* 2.1 */ { 245760, 3000, 3000, 20, 1, 1}, /* 3 */ { 552960, 6000, 6000, 30, 2, 2}, /* 3.1 */ { 983040, 10000, 10000, 40, 3, 3}, /* 4 */ { 2228224, 12000, 30000, 75, 5, 5}, /* 4.1 */ { 2228224, 20000, 50000, 75, 5, 5}, /* 5 */ { 8912896, 25000, 100000, 200, 11, 10}, /* 5.1 */ { 8912896, 40000, 160000, 200, 11, 10}, /* 5.2 */ { 8912896, 60000, 240000, 200, 11, 10}, /* 6 */ {35651584, 60000, 240000, 600, 22, 20}, /* 6.1 */ {35651584, 120000, 480000, 600, 22, 20}, /* 6.2 */ {35651584, 240000, 800000, 600, 22, 20}, }; const mfxU32 TableA2[][4] = { // Level | MaxLumaSr | MaxBR | MinCr /* 1 */ { 552960, 128, 128, 2}, /* 2 */ { 3686400, 1500, 1500, 2}, /* 2.1 */ { 7372800, 3000, 3000, 2}, /* 3 */ { 16588800, 6000, 6000, 2}, /* 3.1 */ { 33177600, 10000, 10000, 2}, /* 4 */ { 66846720, 12000, 30000, 4}, /* 4.1 */ { 133693440, 20000, 50000, 4}, /* 5 */ { 267386880, 25000, 100000, 6}, /* 5.1 */ { 534773760, 40000, 160000, 8}, /* 5.2 */ {1069547520, 60000, 240000, 8}, /* 6 */ {1069547520, 60000, 240000, 8}, /* 6.1 */ {2139095040, 120000, 480000, 8}, /* 6.2 */ {4278190080, 240000, 800000, 6}, }; const mfxU16 MaxLidx = (sizeof(TableA1) / sizeof(TableA1[0])) - 1; mfxU16 LevelIdx(mfxU16 mfx_level) { static const std::map LevelMFX2STD = { {(mfxU16)MFX_LEVEL_HEVC_1 , (mfxU16) 0} , {(mfxU16)MFX_LEVEL_HEVC_2 , (mfxU16) 1} , {(mfxU16)MFX_LEVEL_HEVC_21, (mfxU16) 2} , {(mfxU16)MFX_LEVEL_HEVC_3 , (mfxU16) 3} , {(mfxU16)MFX_LEVEL_HEVC_31, (mfxU16) 4} , {(mfxU16)MFX_LEVEL_HEVC_4 , (mfxU16) 5} , {(mfxU16)MFX_LEVEL_HEVC_41, (mfxU16) 6} , {(mfxU16)MFX_LEVEL_HEVC_5 , (mfxU16) 7} , {(mfxU16)MFX_LEVEL_HEVC_51, (mfxU16) 8} , {(mfxU16)MFX_LEVEL_HEVC_52, (mfxU16) 9} , {(mfxU16)MFX_LEVEL_HEVC_6 , (mfxU16)10} , {(mfxU16)MFX_LEVEL_HEVC_61, (mfxU16)11} , {(mfxU16)MFX_LEVEL_HEVC_62, (mfxU16)12} }; return LevelMFX2STD.at(mfx_level & 0xFF); } mfxU16 TierIdx(mfxU16 mfx_level) { return !!(mfx_level & MFX_TIER_HEVC_HIGH); } mfxU16 GetMaxDpbSize(mfxU32 PicSizeInSamplesY, mfxU32 MaxLumaPs, mfxU16 maxDpbPicBuf) { if (PicSizeInSamplesY <= (MaxLumaPs >> 2)) return std::min(4 * maxDpbPicBuf, 16); else if (PicSizeInSamplesY <= (MaxLumaPs >> 1)) return std::min(2 * maxDpbPicBuf, 16); else if (PicSizeInSamplesY <= ((3 * MaxLumaPs) >> 2)) return std::min((4 * maxDpbPicBuf) / 3, 16U); return maxDpbPicBuf; } mfxU16 HEVCEHW::Base::GetMaxDpbSizeByLevel(mfxVideoParam const & par, mfxU32 PicSizeInSamplesY) { assert(par.mfx.CodecLevel != 0); return GetMaxDpbSize(PicSizeInSamplesY, TableA1[LevelIdx(par.mfx.CodecLevel)][0], 6); } mfxU32 HEVCEHW::Base::GetMaxKbpsByLevel(mfxVideoParam const & par) { assert(par.mfx.CodecLevel != 0); return TableA2[LevelIdx(par.mfx.CodecLevel)][1 + TierIdx(par.mfx.CodecLevel)] * 1100 / 1000; } mfxF64 HEVCEHW::Base::GetMaxFrByLevel(mfxVideoParam const & par, mfxU32 PicSizeInSamplesY) { assert(par.mfx.CodecLevel != 0); mfxU32 MaxLumaSr = TableA2[LevelIdx(par.mfx.CodecLevel)][0]; return (mfxF64)MaxLumaSr / PicSizeInSamplesY; } mfxU32 HEVCEHW::Base::GetMaxCpbInKBByLevel(mfxVideoParam const & par) { assert(par.mfx.CodecLevel != 0); return TableA1[LevelIdx(par.mfx.CodecLevel)][1 + TierIdx(par.mfx.CodecLevel)] * 1100 / 8000; } const mfxU16 LevelIdxToMfx[] = { MFX_LEVEL_HEVC_1 , MFX_LEVEL_HEVC_2 , MFX_LEVEL_HEVC_21, MFX_LEVEL_HEVC_3 , MFX_LEVEL_HEVC_31, MFX_LEVEL_HEVC_4 , MFX_LEVEL_HEVC_41, MFX_LEVEL_HEVC_5 , MFX_LEVEL_HEVC_51, MFX_LEVEL_HEVC_52, MFX_LEVEL_HEVC_6 , MFX_LEVEL_HEVC_61, MFX_LEVEL_HEVC_62, }; inline mfxU16 MaxTidx(mfxU16 l) { return (LevelIdxToMfx[std::min(l, MaxLidx)] >= MFX_LEVEL_HEVC_4); } mfxU16 MfxLevel(mfxU16 l, mfxU16 t) { return LevelIdxToMfx[std::min(l, MaxLidx)] | (MFX_TIER_HEVC_HIGH * !!t); } mfxU16 HEVCEHW::Base::GetMinLevel( mfxU32 frN , mfxU32 frD , mfxU16 PicWidthInLumaSamples , mfxU16 PicHeightInLumaSamples , mfxU16 MinRef , mfxU16 NumTileColumns , mfxU16 NumTileRows , mfxU32 NumSlice , mfxU32 BufferSizeInKB , mfxU32 MaxKbps , mfxU16 StartLevel) { bool bInvalid = frN == 0 || frD == 0; if (bInvalid) return 0; mfxU32 CpbBrNalFactor = 1100; mfxU32 PicSizeInSamplesY = (mfxU32)PicWidthInLumaSamples * PicHeightInLumaSamples; mfxU32 LumaSr = mfxU32(std::ceil(mfxF64(PicSizeInSamplesY) * frN / frD)); mfxU16 lidx = LevelIdx(StartLevel); mfxU16 tidx = TierIdx(StartLevel); bool bSearch = true; while (bSearch) { mfxU32 MaxLumaPs = TableA1[lidx][0]; mfxU32 MaxCPB = TableA1[lidx][1+tidx]; mfxU32 MaxSSPP = TableA1[lidx][3]; mfxU32 MaxTileRows = TableA1[lidx][4]; mfxU32 MaxTileCols = TableA1[lidx][5]; mfxU32 MaxLumaSr = TableA2[lidx][0]; mfxU32 MaxBR = TableA2[lidx][1+tidx]; //mfxU32 MinCR = TableA2[lidx][3]; mfxU16 MaxDpbSize = GetMaxDpbSize(PicSizeInSamplesY, MaxLumaPs, 6); bool bNextTier = BufferSizeInKB * 8000 > CpbBrNalFactor * MaxCPB || LumaSr > MaxLumaSr || MaxKbps * 1000 > CpbBrNalFactor * MaxBR; bool bMaxTier = bNextTier && tidx >= MaxTidx(lidx); bool bNextLevel = PicSizeInSamplesY > MaxLumaPs || PicWidthInLumaSamples > sqrt((mfxF64)MaxLumaPs * 8) || PicHeightInLumaSamples > sqrt((mfxF64)MaxLumaPs * 8) || MinRef + 1 > MaxDpbSize || NumTileColumns > MaxTileCols || NumTileRows > MaxTileRows || NumSlice > MaxSSPP || bMaxTier; bNextTier &= !bNextLevel; tidx *= !bMaxTier; tidx += bNextTier; lidx += bNextLevel; bSearch = (lidx <= MaxLidx) && (bNextTier || bNextLevel); } return MfxLevel(lidx, tidx); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_constraints.h000066400000000000000000000035621443134507600351300ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) namespace HEVCEHW { namespace Base { mfxU16 GetMaxDpbSizeByLevel(mfxVideoParam const & par, mfxU32 PicSizeInSamplesY); mfxU32 GetMaxKbpsByLevel(mfxVideoParam const & par); mfxF64 GetMaxFrByLevel(mfxVideoParam const & par, mfxU32 PicSizeInSamplesY); mfxU32 GetMaxCpbInKBByLevel(mfxVideoParam const & par); mfxU16 GetMinLevel( mfxU32 frN , mfxU32 frD , mfxU16 PicWidthInLumaSamples , mfxU16 PicHeightInLumaSamples , mfxU16 MinRef , mfxU16 NumTileColumns , mfxU16 NumTileRows , mfxU32 NumSlice , mfxU32 BufferSizeInKB , mfxU32 MaxKbps , mfxU16 StartLevel); } //Base } //namespace HEVCEHW #endif hevcehw_base_data.h000066400000000000000000001430531443134507600334720ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_ddi.h" #include "ehw_resources_pool.h" #include "ehw_device.h" #include namespace HEVCEHW { namespace Base { class EndOfBuffer : public std::exception { public: EndOfBuffer() : std::exception() {} }; constexpr mfxU8 MAX_DPB_SIZE = 15; constexpr mfxU8 IDX_INVALID = 0xff; constexpr mfxU8 HW_SURF_ALIGN_W = 16; constexpr mfxU8 HW_SURF_ALIGN_H = 16; constexpr mfxU16 MAX_SLICES = 600; // conforms to level 6 limits constexpr mfxU8 DEFAULT_LTR_INTERVAL = 16; constexpr mfxU8 DEFAULT_PPYR_INTERVAL = 3; constexpr mfxU16 GOP_INFINITE = 0xFFFF; constexpr mfxU8 MAX_NUM_TILE_COLUMNS = 20; constexpr mfxU8 MAX_NUM_TILE_ROWS = 22; constexpr mfxU8 MAX_NUM_LONG_TERM_PICS = 8; constexpr mfxU16 MIN_TILE_WIDTH_IN_SAMPLES = 256; constexpr mfxU16 MIN_TILE_HEIGHT_IN_SAMPLES = 64; enum NALU_TYPE { TRAIL_N = 0, TRAIL_R, TSA_N, TSA_R, STSA_N, STSA_R, RADL_N, RADL_R, RASL_N, RASL_R, RSV_VCL_N10, RSV_VCL_R11, RSV_VCL_N12, RSV_VCL_R13, RSV_VCL_N14, RSV_VCL_R15, BLA_W_LP, BLA_W_RADL, BLA_N_LP, IDR_W_RADL, IDR_N_LP, CRA_NUT, RSV_IRAP_VCL22, RSV_IRAP_VCL23, RSV_VCL24, RSV_VCL25, RSV_VCL26, RSV_VCL27, RSV_VCL28, RSV_VCL29, RSV_VCL30, RSV_VCL31, VPS_NUT, SPS_NUT, PPS_NUT, AUD_NUT, EOS_NUT, EOB_NUT, FD_NUT, PREFIX_SEI_NUT, SUFFIX_SEI_NUT, RSV_NVCL41, RSV_NVCL42, RSV_NVCL43, RSV_NVCL44, RSV_NVCL45, RSV_NVCL46, RSV_NVCL47, UNSPEC48, UNSPEC49, UNSPEC50, UNSPEC51, UNSPEC52, UNSPEC53, UNSPEC54, UNSPEC55, UNSPEC56, UNSPEC57, UNSPEC58, UNSPEC59, UNSPEC60, UNSPEC61, UNSPEC62, UNSPEC63, num_NALU_TYPE }; struct ProfileTierLevel { mfxU8 profile_space : 2; mfxU8 tier_flag : 1; mfxU8 profile_idc : 5; mfxU8 progressive_source_flag : 1; mfxU8 interlaced_source_flag : 1; mfxU8 non_packed_constraint_flag : 1; mfxU8 frame_only_constraint_flag : 1; mfxU8 profile_present_flag : 1; mfxU8 level_present_flag : 1; mfxU8 : 2; mfxU8 level_idc; mfxU32 profile_compatibility_flags; union { mfxU32 rext_constraint_flags_0_31; struct { mfxU32 max_12bit : 1; mfxU32 max_10bit : 1; mfxU32 max_8bit : 1; mfxU32 max_422chroma : 1; mfxU32 max_420chroma : 1; mfxU32 max_monochrome : 1; mfxU32 intra : 1; mfxU32 one_picture_only : 1; mfxU32 lower_bit_rate : 1; mfxU32 : 23; } constraint; }; mfxU32 rext_constraint_flags_32_42 : 11; mfxU32 inbld_flag : 1; mfxU32 : 20; }; struct SubLayerOrdering { mfxU8 max_dec_pic_buffering_minus1 : 4; mfxU8 max_num_reorder_pics : 4; mfxU32 max_latency_increase_plus1; }; struct STRPS { mfxU8 inter_ref_pic_set_prediction_flag : 1; mfxU8 delta_idx_minus1 : 6; mfxU8 delta_rps_sign : 1; mfxU8 num_negative_pics : 4; mfxU8 num_positive_pics : 4; mfxU16 abs_delta_rps_minus1; mfxU16 WeightInGop; struct Pic { mfxU8 used_by_curr_pic_flag : 1; mfxU8 use_delta_flag : 1; mfxI16 DeltaPocSX; union { struct { mfxU16 delta_poc_s0_minus1 : 15; mfxU16 used_by_curr_pic_s0_flag : 1; }; struct { mfxU16 delta_poc_s1_minus1 : 15; mfxU16 used_by_curr_pic_s1_flag : 1; }; struct { mfxU16 delta_poc_sx_minus1 : 15; mfxU16 used_by_curr_pic_sx_flag : 1; }; }; }pic[16]; }; using STRPSPic = STRPS::Pic; struct LayersInfo { mfxU8 sub_layer_ordering_info_present_flag : 1; ProfileTierLevel general; struct SubLayer : ProfileTierLevel, SubLayerOrdering {} sub_layer[8]; }; struct HRDInfo { mfxU16 nal_hrd_parameters_present_flag : 1; mfxU16 vcl_hrd_parameters_present_flag : 1; mfxU16 sub_pic_hrd_params_present_flag : 1; mfxU16 du_cpb_removal_delay_increment_length_minus1 : 5; mfxU16 sub_pic_cpb_params_in_pic_timing_sei_flag : 1; mfxU16 dpb_output_delay_du_length_minus1 : 5; mfxU16 tick_divisor_minus2 : 8; mfxU16 bit_rate_scale : 4; mfxU16 cpb_size_scale : 4; mfxU8 cpb_size_du_scale : 4; mfxU16 initial_cpb_removal_delay_length_minus1 : 5; mfxU16 au_cpb_removal_delay_length_minus1 : 5; mfxU16 dpb_output_delay_length_minus1 : 5; struct SubLayer { mfxU8 fixed_pic_rate_general_flag : 1; mfxU8 fixed_pic_rate_within_cvs_flag : 1; mfxU8 low_delay_hrd_flag : 1; mfxU16 elemental_duration_in_tc_minus1 : 11; mfxU16 cpb_cnt_minus1 : 5; struct CPB { mfxU32 bit_rate_value_minus1; mfxU32 cpb_size_value_minus1; mfxU32 cpb_size_du_value_minus1; mfxU32 bit_rate_du_value_minus1; mfxU8 cbr_flag; } cpb[32]; } sl[8]; }; struct BufferingPeriodSEI { mfxU8 seq_parameter_set_id : 4; mfxU8 irap_cpb_params_present_flag : 1; mfxU8 concatenation_flag : 1; mfxU32 cpb_delay_offset; mfxU32 dpb_delay_offset; mfxU32 au_cpb_removal_delay_delta_minus1; struct CPB{ mfxU32 initial_cpb_removal_delay; mfxU32 initial_cpb_removal_offset; mfxU32 initial_alt_cpb_removal_delay; mfxU32 initial_alt_cpb_removal_offset; } nal[32], vcl[32]; }; struct PicTimingSEI { mfxU8 pic_struct : 4; mfxU8 source_scan_type : 2; mfxU8 duplicate_flag : 1; mfxU8 du_common_cpb_removal_delay_flag : 1; mfxU32 au_cpb_removal_delay_minus1; mfxU32 pic_dpb_output_delay; mfxU32 pic_dpb_output_du_delay; mfxU32 num_decoding_units_minus1; mfxU32 du_common_cpb_removal_delay_increment_minus1; mfxU32* num_nalus_in_du_minus1; mfxU32* du_cpb_removal_delay_increment_minus1; }; struct VPS : LayersInfo { mfxU16 video_parameter_set_id : 4; mfxU16 reserved_three_2bits : 2; mfxU16 max_layers_minus1 : 6; mfxU16 max_sub_layers_minus1 : 3; mfxU16 temporal_id_nesting_flag : 1; mfxU16 reserved_0xffff_16bits; mfxU16 max_layer_id : 6; mfxU16 num_layer_sets_minus1 : 10; //mfxU8** layer_id_included_flag; // max [1024][64]; mfxU32 num_units_in_tick; mfxU32 time_scale; mfxU32 timing_info_present_flag : 1; mfxU32 poc_proportional_to_timing_flag : 1; mfxU32 num_ticks_poc_diff_one_minus1 : 10; mfxU32 num_hrd_parameters : 10; //VPSHRD* hrd; //max 1024 }; struct VUI { mfxU8 aspect_ratio_info_present_flag : 1; mfxU8 aspect_ratio_idc; mfxU16 sar_width; mfxU16 sar_height; mfxU8 overscan_info_present_flag : 1; mfxU8 overscan_appropriate_flag : 1; mfxU8 video_signal_type_present_flag : 1; mfxU8 video_format : 3; mfxU8 video_full_range_flag : 1; mfxU8 colour_description_present_flag : 1; mfxU8 colour_primaries; mfxU8 transfer_characteristics; mfxU8 matrix_coeffs; mfxU8 chroma_loc_info_present_flag : 1; mfxU8 chroma_sample_loc_type_top_field : 3; mfxU8 chroma_sample_loc_type_bottom_field : 3; mfxU8 neutral_chroma_indication_flag : 1; mfxU8 field_seq_flag : 1; mfxU8 frame_field_info_present_flag : 1; mfxU8 default_display_window_flag : 1; mfxU32 def_disp_win_left_offset; mfxU32 def_disp_win_right_offset; mfxU32 def_disp_win_top_offset; mfxU32 def_disp_win_bottom_offset; mfxU8 timing_info_present_flag : 1; mfxU8 hrd_parameters_present_flag : 1; mfxU8 poc_proportional_to_timing_flag : 1; mfxU8 bitstream_restriction_flag : 1; mfxU8 tiles_fixed_structure_flag : 1; mfxU8 motion_vectors_over_pic_boundaries_flag : 1; mfxU8 restricted_ref_pic_lists_flag : 1; mfxU32 num_units_in_tick; mfxU32 time_scale; mfxU32 num_ticks_poc_diff_one_minus1; mfxU32 min_spatial_segmentation_idc : 12; mfxU32 max_bytes_per_pic_denom : 5; mfxU32 max_bits_per_min_cu_denom : 5; mfxU16 log2_max_mv_length_horizontal : 5; mfxU16 log2_max_mv_length_vertical : 4; HRDInfo hrd; }; struct ScalingList { mfxU8 scalingLists0[6][16]; mfxU8 scalingLists1[6][64]; mfxU8 scalingLists2[6][64]; mfxU8 scalingLists3[2][64]; mfxU8 scalingListDCCoefSizeID2[6]; mfxU8 scalingListDCCoefSizeID3[2]; }; struct SPS : LayersInfo { mfxU8 video_parameter_set_id : 4; mfxU8 max_sub_layers_minus1 : 3; mfxU8 temporal_id_nesting_flag : 1; mfxU8 seq_parameter_set_id : 4; mfxU8 chroma_format_idc : 2; mfxU8 separate_colour_plane_flag : 1; mfxU8 conformance_window_flag : 1; mfxU32 pic_width_in_luma_samples; mfxU32 pic_height_in_luma_samples; mfxU32 conf_win_left_offset; mfxU32 conf_win_right_offset; mfxU32 conf_win_top_offset; mfxU32 conf_win_bottom_offset; mfxU8 bit_depth_luma_minus8 : 3; mfxU8 bit_depth_chroma_minus8 : 3; mfxU8 log2_max_pic_order_cnt_lsb_minus4 : 4; //mfxU8 sub_layer_ordering_info_present_flag : 1; mfxU32 log2_min_luma_coding_block_size_minus3; mfxU32 log2_diff_max_min_luma_coding_block_size; mfxU32 log2_min_transform_block_size_minus2; mfxU32 log2_diff_max_min_transform_block_size; mfxU32 max_transform_hierarchy_depth_inter; mfxU32 max_transform_hierarchy_depth_intra; mfxU8 scaling_list_enabled_flag : 1; mfxU8 scaling_list_data_present_flag : 1; mfxU8 amp_enabled_flag : 1; mfxU8 sample_adaptive_offset_enabled_flag : 1; mfxU8 pcm_enabled_flag : 1; mfxU8 pcm_loop_filter_disabled_flag : 1; mfxU8 pcm_sample_bit_depth_luma_minus1 : 4; mfxU8 pcm_sample_bit_depth_chroma_minus1 : 4; mfxU32 log2_min_pcm_luma_coding_block_size_minus3; mfxU32 log2_diff_max_min_pcm_luma_coding_block_size; mfxU8 long_term_ref_pics_present_flag : 1; mfxU8 num_long_term_ref_pics_sps : 6; mfxU16 lt_ref_pic_poc_lsb_sps[32]; mfxU8 used_by_curr_pic_lt_sps_flag[32]; mfxU8 temporal_mvp_enabled_flag : 1; mfxU8 strong_intra_smoothing_enabled_flag : 1; mfxU8 vui_parameters_present_flag : 1; mfxU8 extension_flag : 1; mfxU8 extension_data_flag : 1; mfxU8 range_extension_flag : 1; mfxU8 transform_skip_rotation_enabled_flag : 1; mfxU8 transform_skip_context_enabled_flag : 1; mfxU8 implicit_rdpcm_enabled_flag : 1; mfxU8 explicit_rdpcm_enabled_flag : 1; mfxU8 extended_precision_processing_flag : 1; mfxU8 intra_smoothing_disabled_flag : 1; mfxU8 high_precision_offsets_enabled_flag : 1; mfxU8 persistent_rice_adaptation_enabled_flag : 1; mfxU8 cabac_bypass_alignment_enabled_flag : 1; mfxU8 low_delay_mode : 1; mfxU8 hierarchical_flag : 1; mfxU8 ExtensionFlags; mfxU8 num_short_term_ref_pic_sets; STRPS strps[65]; ScalingList scl; VUI vui; }; struct PPS { mfxU16 pic_parameter_set_id : 6; mfxU16 seq_parameter_set_id : 4; mfxU16 dependent_slice_segments_enabled_flag : 1; mfxU16 output_flag_present_flag : 1; mfxU16 num_extra_slice_header_bits : 3; mfxU16 sign_data_hiding_enabled_flag : 1; mfxU16 cabac_init_present_flag : 1; mfxU16 num_ref_idx_l0_default_active_minus1 : 4; mfxU16 num_ref_idx_l1_default_active_minus1 : 4; mfxU16 constrained_intra_pred_flag : 1; mfxU16 transform_skip_enabled_flag : 1; mfxU16 cu_qp_delta_enabled_flag : 1; mfxU16 slice_segment_header_extension_present_flag : 1; mfxU32 diff_cu_qp_delta_depth; mfxI32 init_qp_minus26; mfxI16 cb_qp_offset : 6; mfxI16 cr_qp_offset : 6; mfxU8 slice_chroma_qp_offsets_present_flag : 1; mfxU8 weighted_pred_flag : 1; mfxU8 weighted_bipred_flag : 1; mfxU8 transquant_bypass_enabled_flag : 1; mfxU8 tiles_enabled_flag : 1; mfxU8 entropy_coding_sync_enabled_flag : 1; mfxU8 uniform_spacing_flag : 1; mfxU8 loop_filter_across_tiles_enabled_flag : 1; mfxU16 num_tile_columns_minus1; mfxU16 num_tile_rows_minus1; mfxU16 column_width[MAX_NUM_TILE_COLUMNS - 1]; mfxU16 row_height[MAX_NUM_TILE_ROWS - 1]; mfxU8 loop_filter_across_slices_enabled_flag : 1; mfxU8 deblocking_filter_control_present_flag : 1; mfxU8 deblocking_filter_override_enabled_flag : 1; mfxU8 deblocking_filter_disabled_flag : 1; mfxU8 scaling_list_data_present_flag : 1; mfxU8 lists_modification_present_flag : 1; mfxU8 extension_flag : 1; mfxU8 extension_data_flag : 1; mfxI8 beta_offset_div2 : 4; mfxI8 tc_offset_div2 : 4; ScalingList sld; mfxU16 log2_parallel_merge_level_minus2; mfxU32 range_extension_flag : 1; mfxU32 cross_component_prediction_enabled_flag : 1; mfxU32 chroma_qp_offset_list_enabled_flag : 1; mfxU32 log2_sao_offset_scale_luma : 3; mfxU32 log2_sao_offset_scale_chroma : 3; mfxU32 chroma_qp_offset_list_len_minus1 : 3; mfxU32 diff_cu_chroma_qp_offset_depth : 5; mfxU32 log2_max_transform_skip_block_size_minus2 : 5; mfxU32 : 10; mfxI8 cb_qp_offset_list[6]; mfxI8 cr_qp_offset_list[6]; mfxU8 ExtensionFlags; }; struct Slice { mfxU8 no_output_of_prior_pics_flag : 1; mfxU8 pic_parameter_set_id : 6; mfxU8 dependent_slice_segment_flag : 1; mfxU32 segment_address; mfxU8 reserved_flags; mfxU8 type : 2; mfxU8 colour_plane_id : 2; mfxU8 short_term_ref_pic_set_idx; mfxU8 pic_output_flag : 1; mfxU8 short_term_ref_pic_set_sps_flag : 1; mfxU8 num_long_term_sps : 6; mfxU8 first_slice_segment_in_pic_flag : 1; mfxU8 temporal_mvp_enabled_flag : 1; mfxU8 sao_luma_flag : 1; mfxU8 sao_chroma_flag : 1; mfxU8 num_ref_idx_active_override_flag : 1; mfxU8 mvd_l1_zero_flag : 1; mfxU8 cabac_init_flag : 1; mfxU8 collocated_from_l0_flag : 1; mfxU8 collocated_ref_idx : 4; mfxU8 five_minus_max_num_merge_cand : 3; mfxU8 num_ref_idx_l0_active_minus1 : 4; mfxU8 num_ref_idx_l1_active_minus1 : 4; mfxU32 pic_order_cnt_lsb; mfxU16 num_long_term_pics; mfxI8 slice_qp_delta; mfxI16 slice_cb_qp_offset : 6; mfxI16 slice_cr_qp_offset : 6; mfxU8 deblocking_filter_override_flag : 1; mfxU8 deblocking_filter_disabled_flag : 1; mfxU8 loop_filter_across_slices_enabled_flag : 1; mfxU8 offset_len_minus1 : 5; mfxI8 beta_offset_div2 : 4; mfxI8 tc_offset_div2 : 4; mfxU32 num_entry_point_offsets; STRPS strps; struct LongTerm { mfxU8 lt_idx_sps : 5; mfxU8 used_by_curr_pic_lt_flag : 1; mfxU8 delta_poc_msb_present_flag : 1; mfxU32 poc_lsb_lt; mfxU32 delta_poc_msb_cycle_lt; } lt[MAX_NUM_LONG_TERM_PICS]; mfxU8 ref_pic_list_modification_flag_lx[2]; mfxU8 list_entry_lx[2][16]; mfxU16 luma_log2_weight_denom : 3; mfxU16 chroma_log2_weight_denom : 3; mfxI16 pwt[2][16][3][2]; //[list][list entry][Y, Cb, Cr][weight, offset] }; struct NALU { mfxU16 long_start_code : 1; mfxU16 nal_unit_type : 6; mfxU16 nuh_layer_id : 6; mfxU16 nuh_temporal_id_plus1 : 3; }; using Resource = MfxEncodeHW::ResPool::Resource; struct IAllocation : public Storable { using TAlloc = CallChain; TAlloc Alloc; using TAllocOpaque = CallChain; using TGetResponse = CallChain; TGetResponse GetResponse; using TGetInfo = CallChain; TGetInfo GetInfo; using TAcquire = CallChain; TAcquire Acquire; using TRelease = CallChain; TRelease Release; using TClearFlag = CallChain; TClearFlag ClearFlag; using TSetFlag = CallChain; TSetFlag SetFlag; using TGetFlag = CallChain; TGetFlag GetFlag; using TUnlockAll = CallChain; TUnlockAll UnlockAll; std::unique_ptr m_pthis; }; struct SCCFlags { mfxU16 IBCEnable = 1; mfxU16 PaletteEnable = 1; }; struct DDIIDSetting { bool EnableRecon422 = false; void* DDIID = nullptr; }; class IBsReader { public: virtual ~IBsReader() {} virtual mfxU32 GetBit() = 0; virtual mfxU32 GetBits(mfxU32 n) = 0; virtual mfxU32 GetUE() = 0; virtual mfxI32 GetSE() = 0; //conditional read template mfxU32 CondBits(bool bRead, mfxU32 nBits, TDefault defaultVal) { return bRead ? GetBits(nBits) : mfxU32(defaultVal); } template mfxU32 CondBit(bool bRead, TDefault defaultVal) { return bRead ? GetBit() : mfxU32(defaultVal); } template mfxU32 CondUE(bool bRead, TDefault defaultVal) { return bRead ? GetUE() : mfxU32(defaultVal); } template mfxI32 CondSE(bool bRead, TDefault defaultVal) { return bRead ? GetSE() : mfxI32(defaultVal); } }; class IBsWriter { public: virtual ~IBsWriter() {} virtual void PutBits(mfxU32 n, mfxU32 b) = 0; virtual void PutBit(mfxU32 b) = 0; virtual void PutUE(mfxU32 b) = 0; virtual void PutSE(mfxI32 b) = 0; }; struct SliceInfo { mfxU32 SegmentAddress; mfxU32 NumLCU; }; constexpr mfxU8 CODING_TYPE_I = 1; constexpr mfxU8 CODING_TYPE_P = 2; constexpr mfxU8 CODING_TYPE_B = 3; //regular B, or no reference to other B frames constexpr mfxU8 CODING_TYPE_B1 = 4; //B1, reference to only I, P or regular B frames constexpr mfxU8 CODING_TYPE_B2 = 5; //B2, references include B1 // Min frame params required for Reorder, RefPicList/DPB management struct FrameBaseInfo : Storable { mfxI32 POC = -1; mfxU16 FrameType = 0; bool isLDB = false; // is "low-delay B" mfxU8 TemporalID = 0; mfxU32 BPyramidOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); mfxU32 PyramidLevel = 0; bool bBottomField = false; bool b2ndField = false; }; typedef struct _DpbFrame : FrameBaseInfo { mfxU32 DisplayOrder = mfxU32(-1); mfxU32 EncodedOrder = mfxU32(-1); bool isLTR = false; // is "long-term" mfxU8 CodingType = 0; Resource Raw; Resource Rec; mfxFrameSurface1* pSurfIn = nullptr; //input surface, may be opaque } DpbFrame, DpbArray[MAX_DPB_SIZE]; enum eSkipMode { SKIPFRAME_NO = 0 , SKIPFRAME_INSERT_DUMMY , SKIPFRAME_INSERT_DUMMY_PROTECTED , SKIPFRAME_INSERT_NOTHING , SKIPFRAME_BRC_ONLY , SKIPFRAME_EXT_PSEUDO }; enum eSkipCmd { SKIPCMD_NeedInputReplacement = (1 << 0) , SKIPCMD_NeedDriverCall = (1 << 1) , SKIPCMD_NeedSkipSliceGen = (1 << 2) , SKIPCMD_NeedCurrentFrameSkipping = (1 << 3) , SKIPCMD_NeedNumSkipAdding = (1 << 4) }; struct IntraRefreshState { mfxU16 refrType; mfxU16 IntraLocation; mfxU16 IntraSize; mfxI16 IntRefQPDelta; bool firstFrameInCycle; }; enum eInsertHeader { INSERT_AUD = 0x01, INSERT_VPS = 0x02, INSERT_SPS = 0x04, INSERT_PPS = 0x08, INSERT_BPSEI = 0x10, INSERT_PTSEI = 0x20, INSERT_DCVSEI = 0x40, INSERT_LLISEI = 0x80, INSERT_SEI = (INSERT_BPSEI | INSERT_PTSEI | INSERT_DCVSEI | INSERT_LLISEI) }; enum eRecFlag { REC_SKIPPED = 1 , REC_READY = 2 }; struct mfxLastKeyFrameInfo { mfxU32 lastIDROrder; mfxU32 lastIPOrder; mfxI32 lastIPoc; }; struct mfxGopHints { mfxU32 MiniGopSize = 0; mfxU16 FrameType = 0; mfxU32 QPModulaton = 0; /* Scene Change parameter */ mfxU16 SceneChange = 0; #if defined(MFX_ENABLE_ENCTOOLS) mfxU16 SpatialComplexity = 0; mfxI8 QPDeltaExplicitModulation = 0; /* Maps */ mfxU16 PersistenceMapNZ; mfxU8 PersistenceMap[128]; #endif }; struct mfxBRCHints { /* Look ahead parameters */ mfxU32 LaAvgEncodedBits = 0; /* Average size of encoded Lookahead frames in bits */ mfxU32 LaCurEncodedBits = 0; /* Size of encoded Lookahead frame at current frame location in bits */ mfxU16 LaDistToNextI = 0; /* First I Frame in Lookahead frames (0 if not found) */ }; struct TaskCommonPar : DpbFrame { mfxU32 stage = 0; mfxU32 MinFrameSize = 0; mfxU32 BsDataLength = 0; mfxU32 BsBytesAvailable = 0; mfxU8* pBsData = nullptr; mfxU32* pBsDataLength = nullptr; mfxBitstream* pBsOut = nullptr; mfxFrameSurface1* pSurfReal = nullptr; mfxEncodeCtrl ctrl = {}; mfxU32 SkipCMD = 0; Resource BS; Resource CUQP; mfxHDLPair HDLRaw = {}; bool bCUQPMap = false; #if defined(MFX_ENABLE_ENCTOOLS) mfxLplastatus LplaStatus = {}; #endif mfxGopHints GopHints = {}; mfxBRCHints BrcHints = {}; bool bForceSync = false; bool bSkip = false; bool bResetBRC = false; bool bDontPatchBS = false; bool bRecode = false; bool bFreed = false; bool bForceLongStartCode = false; IntraRefreshState IRState = {}; mfxLastKeyFrameInfo LastKeyFrameInfo = {}; mfxI32 PrevRAP = -1; mfxU16 NumRecode = 0; mfxI8 QpY = 0; mfxI8 m_minQP = 0; mfxI8 m_maxQP = 0; mfxU8 SliceNUT = 0; mfxU32 InsertHeaders = 0; mfxU32 RepackHeaders = 0; mfxU32 StatusReportId = mfxU32(-1); mfxU32 initial_cpb_removal_delay = 0; mfxU32 initial_cpb_removal_offset = 0; mfxU32 cpb_removal_delay = 0; //dpb_output_delay = (DisplayOrder + sps.sub_layer[0].max_num_reorder_pics - EncodedOrder); mfxU32 TCBRCTargetFrameSize = 0; mfxU8 RefPicList[2][MAX_DPB_SIZE] = { {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} }; mfxU8 NumRefActive[2] = {}; struct DPBs { DpbArray Active // available during task execution (modified dpb[BEFORE] ) , After // after task execution (ACTIVE + curTask if ref) , Before // after previous task execution (prevTask dpb[AFTER]) ; } DPB; std::list PLInternal = {}; }; inline void Invalidate(TaskCommonPar& par) { par = TaskCommonPar(); } inline bool isValid(DpbFrame const & frame) { return IDX_INVALID != frame.Rec.Idx; } inline bool isDpbEnd(DpbArray const & dpb, mfxU32 idx) { return idx >= MAX_DPB_SIZE || !isValid(dpb[idx]); } class FrameLocker : public mfxFrameData { public: mfxU32 Pitch; FrameLocker(VideoCORE& core, mfxMemId memId, bool external = false) : m_data(*this) , m_core(core) , m_memId(memId) { m_data = {}; m_status = Lock(external); Pitch = (mfxFrameData::PitchHigh << 16) + mfxFrameData::PitchLow; } FrameLocker(VideoCORE& core, mfxFrameData& data, bool external = false) : m_data(data) , m_core(core) , m_memId(data.MemId) , m_status(Lock(external)) { Pitch = (mfxFrameData::PitchHigh << 16) + mfxFrameData::PitchLow; } ~FrameLocker() { Unlock(); } enum { LOCK_NO, LOCK_INT, LOCK_EXT }; mfxStatus Unlock() { mfxStatus mfxSts = MFX_ERR_NONE; if (m_status == LOCK_INT) mfxSts = m_core.UnlockFrame(m_memId, &m_data); else if (m_status == LOCK_EXT) mfxSts = m_core.UnlockExternalFrame(m_memId, &m_data); m_status = LOCK_NO; return mfxSts; } mfxU32 Lock(bool external) { mfxU32 status = LOCK_NO; if (!m_data.Y && !m_data.Y410) { status = external ? (m_core.LockExternalFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_EXT : LOCK_NO) : (m_core.LockFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_INT : LOCK_NO); } return status; } private: FrameLocker(FrameLocker const &) = delete; FrameLocker & operator =(FrameLocker const &) = delete; mfxFrameData& m_data; VideoCORE& m_core; mfxMemId m_memId; mfxU32 m_status; }; enum ePackInfo { PACK_QPDOffset = 0 , PACK_SAOOffset , PACK_VUIOffset , PACK_PWTOffset , PACK_PWTLength , NUM_PACK_INFO }; using MfxEncodeHW::PackedData; struct PackedHeaders { PackedData VPS; PackedData SPS; PackedData PPS; std::vector CqmPPS; PackedData AUD[3]; PackedData PrefixSEI; PackedData SuffixSEI; std::vector SSH; }; using MfxEncodeHW::DDIExecParam; using DDIFeedbackParam = MfxEncodeHW::DDIFeedback; struct BsDataInfo { mfxU8 *Data; mfxU32 DataOffset; mfxU32 DataLength; mfxU32 MaxLength; }; enum eResetFlags { RF_SPS_CHANGED = (1 << 0) , RF_PPS_CHANGED = (1 << 1) , RF_IDR_REQUIRED = (1 << 2) , RF_BRC_RESET = (1 << 3) , RF_CANCEL_TASKS = (1 << 4) }; struct ResetHint { mfxU32 Flags; }; struct VAID { mfxU32 Profile; mfxU32 Entrypoint; }; /*SliceStructure indicates the restrictions set on the slice structure.*/ enum SliceStructure { // Once slice for the whole frame ONESLICE = 0 /*Slices are composed of a power of 2 number of rows and each slice must have the same size (width and height) except for the last one, which must be smaller or equal to the previous slices. */ , POW2ROW = 1 /*Slices are composed of any number of rows, but all must have the same size (width and height) except for the last one, which must be smaller or equal to the previous slices.*/ , ROWSLICE = 2 //Arbitrary number of rows per slice for all slices. , ARBITRARY_ROW_SLICE = 3 //Arbitrary number of macroblocks per slice for all slices. , ARBITRARY_MB_SLICE = 4 }; typedef std::list::iterator TTaskIt; template struct TaskItWrap { using iterator_category = std::bidirectional_iterator_tag; using value_type = T; using pointer = value_type*; using reference = value_type&; using difference_type = ptrdiff_t; using iterator_type = TaskItWrap; TaskItWrap(TTaskIt _it) : it(_it) {} bool operator==(const TTaskIt& other) const { return it == other; } bool operator!=(const TTaskIt& other) const { return it != other; } bool operator==(const iterator_type& other) const { return it == other.it; } bool operator!=(const iterator_type& other) const { return it != other.it; } pointer operator->() { return &it->Write(K); } reference operator*() const { return it->Write(K); } iterator_type& operator++() { ++it; return *this; } iterator_type operator++(int) { iterator_type tmp(it); ++it; return tmp; } iterator_type& operator--() { --it; return *this; } iterator_type operator--(int) { iterator_type tmp(it); --it; return tmp; } TTaskIt it; }; struct Reorderer : CallChain { mfxU16 BufferSize = 0; mfxU16 MaxReorder = 0; NotNull DPB; using TBaseCC = CallChain; TTaskIt operator()(TTaskIt itBegin, TTaskIt itEnd, bool bFlush) { return TBaseCC::operator()((const DpbArray&)*DPB, itBegin, itEnd, bFlush); } }; class EncodeCapsHevc : public ENCODE_CAPS_HEVC , public Storable { public: EncodeCapsHevc() : ENCODE_CAPS_HEVC({}) {} struct MsdkExt { bool bSingleSliceMultiTile = false; bool CQPSupport = false; bool CBRSupport = false; bool VBRSupport = false; bool ICQSupport = false; bool PSliceSupport = false; } msdk; }; struct Defaults { struct Param { Param( const mfxVideoParam& _par , const EncodeCapsHevc& _caps , eMFXHWType _hw , const Defaults& _d) : mvp(_par) , caps(_caps) , hw(_hw) , base(_d) {} const mfxVideoParam& mvp; const EncodeCapsHevc& caps; eMFXHWType hw; const Defaults& base; }; template using TChain = CallChain; std::map SetForFeature; TChain GetCodedPicWidth; TChain GetCodedPicHeight; TChain GetCodedPicAlignment; TChain GetMaxDPB; TChain GetNumTemporalLayers; TChain GetGopPicSize; TChain GetGopRefDist; TChain GetNumBPyramidLayers; TChain GetNumRefFrames; TChain GetNumRefBPyramid; TChain GetNumRefPPyramid; TChain GetNumRefNoPyramid; TChain GetMinRefForBPyramid; TChain GetMinRefForBNoPyramid; TChain GetBRefType; TChain GetPRefType; TChain GetTargetBitDepthLuma; TChain GetTargetChromaFormat; TChain GetMaxBitDepth; TChain GetMaxBitDepthByFourCC; TChain GetMaxChroma; TChain GetMaxChromaByFourCC; TChain GetRateControlMethod; TChain GetProfile; TChain GetMBBRC; TChain GetAsyncDepth; TChain GetNumSlices; TChain GetLCUSize; TChain GetHRDConformanceON; TChain GetPicTimingSEI; TChain GetPPyrInterval; TChain GetTargetKbps; TChain GetMaxKbps; TChain GetBufferSizeInKB; TChain GetPreSetBufferSizeInKB; TChain> GetNumTiles; // (NumTileColumns, NumTileRows) TChain> GetMaxNumRef; TChain> GetFrameRate; TChain> GetQPMFX; //I,P,B TChain GetMinQPMFX; TChain GetMaxQPMFX; TChain GetHighestTId; TChain GetNumReorderFrames; TChain GetNonStdReordering; using TGetNumRefActive = CallChain< bool //bExternal , const Defaults::Param& , mfxU16(*)[8] //P , mfxU16(*)[8] //BL0 , mfxU16(*)[8]>; //BL1 TGetNumRefActive GetNumRefActive; using TGetQPOffset = CallChain< mfxU16 //EnableQPOffset , const Defaults::Param& , mfxI16(*)[8]>;//QPOffset TGetQPOffset GetQPOffset; using TGetFrameType = CallChain< mfxU16 // FrameType , const Defaults::Param& , mfxU32//DisplayOrder , mfxGopHints //adaptive GOP hints , mfxLastKeyFrameInfo>; //LastIDR & LastIP TGetFrameType GetFrameType; using TGetPLayer = CallChain< mfxU8 //layer , const Defaults::Param& , mfxU32 //order , mfxGopHints>; //adaptive GOP hints TGetPLayer GetPLayer; using TGetTId = TGetPLayer; TGetTId GetTId; using TGetRPLFromExt = CallChain< std::tuple //nL0, nL1 , const Defaults::Param& , const DpbArray & , mfxU16, mfxU16 //maxL0, maxL1 , const mfxExtAVCRefLists& , mfxU8(&)[2][MAX_DPB_SIZE]>; //out RefPicList TGetRPLFromExt GetRPLFromExt; using TGetRPL = CallChain< std::tuple //nL0, nL1 , const Defaults::Param& , const DpbArray & , mfxU16, mfxU16 //maxL0, maxL1 , const FrameBaseInfo& , mfxU8(&)[2][MAX_DPB_SIZE]>; //out RefPicList TGetRPL GetRefPicList; TGetRPL GetRPLMod; // apply hw/other specific modifications to RefPicList (final) using TGetRPLFromCtrl = CallChain< std::tuple //nL0, nL1 , const Defaults::Param& , const DpbArray & , mfxU16, mfxU16 //maxL0, maxL1 , const FrameBaseInfo& , const mfxExtAVCRefListCtrl& , mfxU8(&)[2][MAX_DPB_SIZE]>; //out RefPicList TGetRPLFromCtrl GetRPLFromCtrl; using TCmpRef = CallChain< bool // refA > refB , const Defaults::Param& , const FrameBaseInfo& // curFrame , const FrameBaseInfo& // refA , const FrameBaseInfo&>; // refB TCmpRef CmpRefLX[2]; using TGetWeakRef = CallChain< const DpbFrame* , const Defaults::Param& , const FrameBaseInfo& // curFrame , const DpbFrame* // begin , const DpbFrame*>; // end TGetWeakRef GetWeakRef; using TGetPreReorderInfo = CallChain< mfxStatus , const Defaults::Param& , FrameBaseInfo& , const mfxFrameSurface1* //pSurfIn , const mfxEncodeCtrl* //pCtrl , mfxLastKeyFrameInfo //prevIDROrder & prevIPOC & prevIPOrder , mfxU32 //frameOrder , mfxGopHints>; //adaptive GOP hints TGetPreReorderInfo GetPreReorderInfo; // fill all info available at pre-reorder using TGetFrameNumRefActive = CallChain< std::tuple , const Defaults::Param& , const FrameBaseInfo&>; TGetFrameNumRefActive GetFrameNumRefActive; using TGetTileSlices = CallChain< mfxU16 , const Defaults::Param& , std::vector& , mfxU32 //SliceStructure , mfxU32 //nCol , mfxU32 //nRow , mfxU32>; //nSlice TGetTileSlices GetTileSlices; using TGetSlices = CallChain < mfxU16 , const Defaults::Param& , std::vector&>; TGetSlices GetSlices; using TGetVPS = CallChain; TGetVPS GetVPS; using TGetSPS = CallChain; TGetSPS GetSPS; using TGetPPS = CallChain; TGetPPS GetPPS; using TGetSHNUT = CallChain< mfxU8 //NUT , const Defaults::Param& , const TaskCommonPar& //task , bool>; //RAPIntra TGetSHNUT GetSHNUT; using TGetFrameOrder = CallChain< mfxU32 //FrameOrder , const Defaults::Param& , const StorageR& //task , mfxU32>; //prevFrameOrder TGetFrameOrder GetFrameOrder; using TRunFastCopyWrapper = CallChain< mfxStatus , mfxFrameSurface1 & /* surfDst */ , mfxU16 /* dstMemType */ , mfxFrameSurface1 & /* surfSrc */ , mfxU16 /* srcMemType */ >; TRunFastCopyWrapper RunFastCopyWrapper; //for Query w/o caps: using TPreCheck = CallChain; TPreCheck PreCheckCodecId; TPreCheck PreCheckChromaFormat; template using TGetHWDefault = CallChain ; TGetHWDefault GetLowPower; //for Query w/caps (check + fix) using TCheckAndFix = CallChain; TCheckAndFix CheckLCUSize; TCheckAndFix CheckLowDelayBRC; TCheckAndFix CheckLevel; TCheckAndFix CheckSurfSize; TCheckAndFix CheckProfile; TCheckAndFix CheckFourCC; TCheckAndFix CheckInputFormatByFourCC; TCheckAndFix CheckTargetChromaFormat; TCheckAndFix CheckTargetBitDepth; TCheckAndFix CheckFourCCByTargetFormat; TCheckAndFix CheckWinBRC; TCheckAndFix CheckSAO; TCheckAndFix CheckNumRefActive; TCheckAndFix CheckSlices; }; enum eFeatureId { FEATURE_LEGACY = 0 , FEATURE_DDI , FEATURE_DDI_PACKER , FEATURE_PARSER , FEATURE_HRD , FEATURE_ALLOCATOR , FEATURE_TASK_MANAGER , FEATURE_PACKER , FEATURE_BLOCKING_SYNC , FEATURE_EXT_BRC , FEATURE_DIRTY_RECT , FEATURE_DUMP_FILES , FEATURE_EXTDDI , FEATURE_HDR_SEI , FEATURE_MAX_FRAME_SIZE , FEATURE_PROTECTED , FEATURE_GPU_HANG , FEATURE_ROI , FEATURE_INTERLACE , FEATURE_BRC_SLIDING_WINDOW , FEATURE_MB_PER_SEC , FEATURE_ENCODED_FRAME_INFO #ifdef MFX_ENABLE_ENCODE_STATS , FEATURE_ENCODE_STATS #endif , FEATURE_WEIGHTPRED , FEATURE_QMATRIX , FEATURE_UNITS_INFO , FEATURE_FEI , FEATURE_LPLA_ANALYSIS , FEATURE_LPLA_ENCODE , FEATURE_RECON_INFO , FEATURE_LPLA_STATUS , FEATURE_QUERY_IMPL_DESC , FEATURE_ENCTOOLS , FEATURE_REXT , FEATURE_SAO , FEATURE_QP_MODULATION , FEATURE_SCC , FEATURE_SCCMODE , FEATURE_CAPS #ifdef MFX_ENABLE_PXP , FEATURE_PXP #endif , NUM_FEATURES }; enum eStages { S_NEW = 0 , S_PREPARE , S_REORDER , S_SUBMIT , S_QUERY , NUM_STAGES }; struct MBQPAllocFrameInfo : mfxFrameAllocRequest { mfxU32 width = 0; //(picWidthInLumaSamples + blkSz - 1) / blkSz; mfxU32 height = 0; // (picHeightInLumaSamples + blkSz - 1) / blkSz; mfxU32 pitch = 0; // mfx::align2_value(m_width, 64); mfxU32 height_aligned = 0; // mfx::align2_value(m_height, 4); mfxU32 block_width = 0; //blkSz; mfxU32 block_height = 0; //blkSz; }; struct Glob { static const StorageR::TKey _KD = __LINE__ + 1; using VideoCore = StorageVar<__LINE__ - _KD, VideoCORE>; using RTErr = StorageVar<__LINE__ - _KD, mfxStatus>; using EncodeCaps = StorageVar<__LINE__ - _KD, EncodeCapsHevc>; using VideoParam = StorageVar<__LINE__ - _KD, ExtBuffer::Param>; using VPS = StorageVar<__LINE__ - _KD, Base::VPS>; using SPS = StorageVar<__LINE__ - _KD, Base::SPS>; using PPS = StorageVar<__LINE__ - _KD, Base::PPS>; using CqmPPS = StorageVar<__LINE__ - _KD, std::vector>; using SliceInfo = StorageVar<__LINE__ - _KD, std::vector>; using AllocRaw = StorageVar<__LINE__ - _KD, IAllocation>; using AllocOpq = StorageVar<__LINE__ - _KD, IAllocation>; using AllocRec = StorageVar<__LINE__ - _KD, IAllocation>; using AllocBS = StorageVar<__LINE__ - _KD, IAllocation>; using AllocMBQP = StorageVar<__LINE__ - _KD, IAllocation>; using MBQPAllocInfo = StorageVar<__LINE__ - _KD, MBQPAllocFrameInfo>; using PackedHeaders = StorageVar<__LINE__ - _KD, Base::PackedHeaders>; using DDI_Resources = StorageVar<__LINE__ - _KD, std::list>; using DDI_SubmitParam = StorageVar<__LINE__ - _KD, std::list>; using DDI_Feedback = StorageVar<__LINE__ - _KD, DDIFeedbackParam>; using DDI_Execute = StorageVar<__LINE__ - _KD, CallChain>; using RealState = StorageVar<__LINE__ - _KD, StorageW>;//available during Reset using ResetHint = StorageVar<__LINE__ - _KD, Base::ResetHint>; //available during Reset using Reorder = StorageVar<__LINE__ - _KD, Reorderer>; using NeedRextConstraints = StorageVar<__LINE__ - _KD, std::function>; using ReadSpsExt = StorageVar<__LINE__ - _KD, std::function>; using ReadPpsExt = StorageVar<__LINE__ - _KD, std::function>; using PackSpsExt = StorageVar<__LINE__ - _KD, std::function>; using PackPpsExt = StorageVar<__LINE__ - _KD, std::function>; using Defaults = StorageVar<__LINE__ - _KD, Base::Defaults>; using SCCFlags = StorageVar<__LINE__ - _KD, Base::SCCFlags>; using DDIIDSetting = StorageVar<__LINE__ - _KD, Base::DDIIDSetting>; static const StorageR::TKey ReservedKey0 = __LINE__ - _KD; static const StorageR::TKey BasePackerKey = __LINE__ - _KD; static const StorageR::TKey TaskManagerKey = __LINE__ - _KD; static const StorageR::TKey SccSpsKey = __LINE__ - _KD; static const StorageR::TKey SccPpsKey = __LINE__ - _KD; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; struct Tmp { static const StorageR::TKey _KD = __LINE__ + 1; using MakeAlloc = StorageVar<__LINE__ - _KD, std::function>; using BSAllocInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using RecInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using RawInfo = StorageVar<__LINE__ - _KD, mfxFrameAllocRequest>; using CurrTask = StorageVar<__LINE__ - _KD, StorageW>; using BsDataInfo = StorageVar<__LINE__ - _KD, Base::BsDataInfo>; using DDI_InitParam = StorageVar<__LINE__ - _KD, std::list>; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; struct Task { static const StorageR::TKey _KD = __LINE__ + 1; using Common = StorageVar<__LINE__ - _KD, TaskCommonPar>; using SSH = StorageVar<__LINE__ - _KD, Base::Slice>; static const StorageR::TKey ReservedKey0 = __LINE__ - _KD; static const StorageR::TKey NUM_KEYS = __LINE__ - _KD; }; template inline const TEB& GetRTExtBuffer(const StorageR& glob, const StorageR& task) { const TEB* pEB = ExtBuffer::Get(Task::Common::Get(task).ctrl); if (pEB) return *pEB; return ExtBuffer::Get(Glob::VideoParam::Get(glob)); } } //namespace Base } //namespace HEVCEHW #endif hevcehw_base_dirty_rect.cpp000066400000000000000000000127031443134507600352610ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_dirty_rect.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; mfxStatus CheckAndFixRect( DirtyRect::RectData& rect , mfxVideoParam const & par , ENCODE_CAPS_HEVC const & caps) { mfxU32 changed = 0; changed += CheckMaxOrClip(rect.Left, par.mfx.FrameInfo.Width); changed += CheckMaxOrClip(rect.Right, par.mfx.FrameInfo.Width); changed += CheckMaxOrClip(rect.Top, par.mfx.FrameInfo.Height); changed += CheckMaxOrClip(rect.Bottom, par.mfx.FrameInfo.Height); mfxU32 blockSize = 1 << (caps.BlockSize + 3); changed += AlignDown(rect.Left, blockSize); changed += AlignDown(rect.Top, blockSize); changed += AlignUp(rect.Right, blockSize); changed += AlignUp(rect.Bottom, blockSize); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } mfxStatus CheckAndFixDirtyRect( ENCODE_CAPS_HEVC const & caps , mfxVideoParam const & par , mfxExtDirtyRect& dr) { mfxStatus sts = MFX_ERR_NONE, rsts = MFX_ERR_NONE; mfxU32 changed = 0, invalid = 0; if (caps.DirtyRectSupport == 0) { invalid++; dr.NumRect = 0; } changed += CheckMaxOrClip(dr.NumRect, DirtyRect::MAX_NUM_DIRTY_RECT); for (mfxU16 i = 0; i < dr.NumRect; i++) { // check that rectangle dimensions don't conflict with each other and don't exceed frame size rsts = CheckAndFixRect(dr.Rect[i], par, caps); } auto IsInvalidRect = [](const DirtyRect::RectData& rect) { // Dirty rectangle (0, 0, 0, 0) is a valid dirty rectangle and means that frame is not changed. if (rect.Left==0 && rect.Right==0 && rect.Top==0 && rect.Bottom==0) return false; return ((rect.Left >= rect.Right) || (rect.Top >= rect.Bottom)); }; mfxU16 numValidRect = mfxU16(std::remove_if(dr.Rect, dr.Rect + dr.NumRect, IsInvalidRect) - dr.Rect); changed += CheckMaxOrClip(dr.NumRect, numValidRect); if (changed) sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; if (invalid) sts = MFX_ERR_UNSUPPORTED; return GetWorstSts(sts, rsts); } void DirtyRect::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_DIRTY_RECTANGLES].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtDirtyRect*)pSrc; auto& dst = *(mfxExtDirtyRect*)pDst; dst.NumRect = src.NumRect; for (mfxU32 i = 0; i < mfx::size(src.Rect); ++i) { dst.Rect[i].Left = src.Rect[i].Left; dst.Rect[i].Top = src.Rect[i].Top; dst.Rect[i].Right = src.Rect[i].Right; dst.Rect[i].Bottom = src.Rect[i].Bottom; } }); } void DirtyRect::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtDirtyRect* pDR = ExtBuffer::Get(par); if (pDR && pDR->NumRect) return CheckAndFixDirtyRect(Glob::EncodeCaps::Get(global), par, *pDR); return MFX_ERR_NONE; }); } void DirtyRect::AllocTask(const FeatureBlocks& /*blocks*/, TPushAT Push) { Push(BLK_AllocTask , [this]( StorageR& /*global*/ , StorageW& task) -> mfxStatus { m_taskToRects.emplace(&task, std::vector(MAX_NUM_DIRTY_RECT)); return MFX_ERR_NONE; }); } void DirtyRect::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_ConfigureTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); mfxExtDirtyRect tmp; mfxExtDirtyRect* pDR = ExtBuffer::Get(Task::Common::Get(s_task).ctrl); if (pDR) { tmp = *pDR; if (CheckAndFixDirtyRect(Glob::EncodeCaps::Get(global), par, tmp) < MFX_ERR_NONE) pDR = nullptr; else pDR = &tmp; } if (!pDR) pDR = ExtBuffer::Get(par); auto& rects = m_taskToRects[&s_task]; if (pDR) rects.assign(pDR->Rect, pDR->Rect + pDR->NumRect); else rects.clear(); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_dirty_rect.h000066400000000000000000000051511443134507600347250ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class DirtyRect : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(AllocTask)\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetCallChains)\ DECL_BLOCK(ConfigureTask)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_DirtyRect" #include "hevcehw_decl_blocks.h" DirtyRect(mfxU32 FeatureId) : FeatureBase(FeatureId) {} typedef std::remove_reference::type RectData; static constexpr mfxU8 MAX_NUM_DIRTY_RECT = 64; protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void AllocTask(const FeatureBlocks& /*blocks*/, TPushAT Push) override; virtual void PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST /*Push*/) override {}; bool SkipRectangle(const RectData& rect) { if (rect.Left >= rect.Right || rect.Top >= rect.Bottom) return true; return false; } std::map> m_taskToRects; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_encode_stats.cpp000066400000000000000000000120301443134507600355550ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifdef MFX_ENABLE_ENCODE_STATS #ifdef MFX_ENABLE_H265_VIDEO_ENCODE #include "hevcehw_base_encode_stats.h" #include "hevcehw_base_task.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void EncodeStats::FrameSubmit(const FeatureBlocks& /*blocks*/, TPushFS Push) { Push(BLK_CheckBS , [&]( const mfxEncodeCtrl* /*pCtrl*/ , const mfxFrameSurface1* /*pSurf*/ , mfxBitstream& bs , StorageW& /*global*/ , StorageRW& /*local*/) -> mfxStatus { mfxExtEncodeStatsOutput* pStats = ExtBuffer::Get(bs); m_frameLevelQueryEn = pStats == nullptr ? false : !!(pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_FRAME); m_blockLevelQueryEn = pStats == nullptr ? false : !!(pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_BLK); return MFX_ERR_NONE; }); } void EncodeStats::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_PatchDDITask , [this](StorageW& global, StorageW& /*s_task*/) -> mfxStatus { return PatchDdi(global); }); } void EncodeStats::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryInit , [this](StorageW& global, StorageW& s_task) -> mfxStatus { MFX_CHECK(m_frameLevelQueryEn || m_blockLevelQueryEn, MFX_ERR_NONE); auto& taskPar = Task::Common::Get(s_task); MFX_CHECK(taskPar.pBsOut, MFX_ERR_NONE); mfxExtEncodeStatsOutput* pStats = ExtBuffer::Get(*taskPar.pBsOut); MFX_CHECK(pStats, MFX_ERR_NULL_PTR); if (pStats->EncodeStatsContainer == nullptr) { pStats->EncodeStatsContainer = mfxEncodeStatsContainerHevc::Create(); } MFX_CHECK(pStats->EncodeStatsContainer, MFX_ERR_NULL_PTR); auto pContainer = reinterpret_cast( pStats->EncodeStatsContainer->RefInterface.Context); MFX_CHECK(pContainer, MFX_ERR_NULL_PTR); const auto& par = Glob::VideoParam::Get(global); mfxU32 numCtu = ((par.mfx.FrameInfo.Width + 63) / 64) * ((par.mfx.FrameInfo.Height + 63) / 64); if (pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_FRAME) { MFX_CHECK(m_frameLevelQueryEn, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_STS(pContainer->AllocFrameStatsBuf()); MFX_CHECK(pStats->EncodeStatsContainer->EncodeFrameStats, MFX_ERR_NULL_PTR); pStats->EncodeStatsContainer->EncodeFrameStats->NumCTU = numCtu; } if (pStats->EncodeStatsFlags & MFX_ENCODESTATS_LEVEL_BLK) { MFX_CHECK(m_blockLevelQueryEn, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_STS(pContainer->AllocBlkStatsBuf(numCtu)); MFX_CHECK(pStats->EncodeStatsContainer->EncodeBlkStats, MFX_ERR_NULL_PTR); MFX_CHECK(pStats->EncodeStatsContainer->EncodeBlkStats->NumCTU, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(pStats->EncodeStatsContainer->EncodeBlkStats->HEVCCTUArray, MFX_ERR_NULL_PTR); } auto& ddiFb = Glob::DDI_Feedback::Get(global); for (auto& xPar : ddiFb.ExecParam) { MFX_CHECK_STS(PatchFeedback(xPar.Out.pData , *pStats->EncodeStatsContainer)); } return MFX_ERR_NONE; }); Push(BLK_QueryTask , [this](StorageW& /*global*/, StorageW& s_task) -> mfxStatus { MFX_CHECK(m_frameLevelQueryEn || m_blockLevelQueryEn, MFX_ERR_NONE); auto& taskPar = Task::Common::Get(s_task); MFX_CHECK(taskPar.pBsOut, MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtEncodeStatsOutput* pStats = ExtBuffer::Get(*taskPar.pBsOut); MFX_CHECK(pStats, MFX_ERR_NULL_PTR); MFX_CHECK(pStats->EncodeStatsContainer, MFX_ERR_NULL_PTR); pStats->EncodeStatsContainer->DisplayOrder = taskPar.DisplayOrder; return MFX_ERR_NONE; }); } #endif // MFX_ENABLE_H265_VIDEO_ENCODE #endif // MFX_ENABLE_ENCODE_STATS hevcehw_base_encode_stats.h000066400000000000000000000063761443134507600352420ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #ifdef MFX_ENABLE_ENCODE_STATS #ifdef MFX_ENABLE_H265_VIDEO_ENCODE #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "libmfx_allocator.h" namespace HEVCEHW { namespace Base { class mfxEncodeStatsContainerHevc : public mfxEncodeStatsContainerImpl { public: static mfxEncodeStatsContainerImpl* Create() { auto container = new mfxEncodeStatsContainerHevc(); container->AddRef(); return container; } protected: mfxEncodeStatsContainerHevc() = default; mfxStatus AllocBlkStatsArray(mfxU32 numBlk) override { return AllocBlkStatsBuf(numBlk , this->EncodeBlkStats->NumCTU , this->EncodeBlkStats->HEVCCTUArray); } void DetroyBlkStatsArray() override { DeleteArray(this->EncodeBlkStats->HEVCCTUArray); this->EncodeBlkStats->NumCTU = 0; } }; class EncodeStats : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckBS)\ DECL_BLOCK(PatchDDITask)\ DECL_BLOCK(QueryInit)\ DECL_BLOCK(QueryTask) #define DECL_FEATURE_NAME "Base_EncodeStats" #include "hevcehw_decl_blocks.h" EncodeStats(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: void FrameSubmit(const FeatureBlocks& /*blocks*/, TPushFS Push) override; void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; void QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) override; virtual mfxStatus PatchDdi(StorageW& global) const = 0; virtual mfxStatus PatchFeedback(void* pDdiFeedback, const mfxEncodeStatsContainer& stats) const = 0; protected: bool m_frameLevelQueryEn = false; bool m_blockLevelQueryEn = false; }; } //Base } //namespace HEVCEHW #endif // MFX_ENABLE_H265_VIDEO_ENCODE #endif // MFX_ENABLE_ENCODE_STATS hevcehw_base_encoded_frame_info.cpp000066400000000000000000000111621443134507600366750ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_encoded_frame_info.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void EncodedFrameInfo::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtCodingOption2*)pSrc; auto& dst = *(mfxExtCodingOption2*)pDst; dst.EnableMAD = src.EnableMAD; }); } void EncodedFrameInfo::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckMAD , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); MFX_CHECK(pCO2, MFX_ERR_NONE); //not supported in driver bool bChanged = CheckOrZero( pCO2->EnableMAD , (mfxU16)MFX_CODINGOPTION_UNKNOWN , (mfxU16)MFX_CODINGOPTION_OFF); MFX_CHECK(!bChanged, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void EncodedFrameInfo::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); MFX_CHECK(task.pBsOut, MFX_ERR_UNDEFINED_BEHAVIOR); mfxExtAVCEncodedFrameInfo* pInfo = ExtBuffer::Get(*task.pBsOut); MFX_CHECK(pInfo, MFX_ERR_NONE); using TUsedRef = std::remove_referenceUsedRefListL0[0])>::type; TUsedRef unused = {}; unused.FrameOrder = mfxU32(MFX_FRAMEORDER_UNKNOWN); unused.LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX); unused.PicStruct = mfxU16(MFX_PICSTRUCT_UNKNOWN); std::fill(std::begin(pInfo->UsedRefListL0), std::end(pInfo->UsedRefListL0), unused); std::fill(std::begin(pInfo->UsedRefListL1), std::end(pInfo->UsedRefListL1), unused); auto picStruct = Glob::VideoParam::Get(global).mfx.FrameInfo.PicStruct; bool bFields = !!(picStruct & (MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_BOTTOM)); const mfxU16 PicStructTable[2][2] = { {mfxU16(MFX_PICSTRUCT_PROGRESSIVE), mfxU16(MFX_PICSTRUCT_PROGRESSIVE)}, {mfxU16(MFX_PICSTRUCT_FIELD_TOP), mfxU16(MFX_PICSTRUCT_FIELD_BOTTOM)} }; auto GetUsedRef = [&](mfxU8 idx) { TUsedRef dst = {}; auto& src = task.DPB.Active[idx % 16]; dst.FrameOrder = src.DisplayOrder; dst.LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX * !src.isLTR); dst.PicStruct = PicStructTable[bFields][src.bBottomField]; return dst; }; std::transform(task.RefPicList[0], task.RefPicList[0] + task.NumRefActive[0], pInfo->UsedRefListL0, GetUsedRef); std::transform(task.RefPicList[1], task.RefPicList[1] + task.NumRefActive[1], pInfo->UsedRefListL1, GetUsedRef); pInfo->FrameOrder = (task.pSurfIn->Data.FrameOrder == mfxU32(-1)) ? task.DisplayOrder : task.pSurfIn->Data.FrameOrder; pInfo->LongTermIdx = mfxU16(MFX_LONGTERM_IDX_NO_IDX * !task.isLTR); pInfo->PicStruct = PicStructTable[bFields][task.bBottomField]; pInfo->QP = 0; pInfo->BRCPanicMode = 0; pInfo->MAD = 0; return GetDdiInfo(Glob::DDI_Feedback::Get(global).Get(task.StatusReportId), *pInfo); }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_encoded_frame_info.h000066400000000000000000000041371443134507600363460ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class EncodedFrameInfo : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckMAD)\ DECL_BLOCK(QueryTask) #define DECL_FEATURE_NAME "Base_EncodedFrameInfo" #include "hevcehw_decl_blocks.h" EncodedFrameInfo(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) override; virtual mfxStatus GetDdiInfo(const void* pDdiFeedback, mfxExtAVCEncodedFrameInfo& info) = 0; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_enctools.cpp000066400000000000000000001504511443134507600347420ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2020-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #if defined(MFX_ENABLE_ENCTOOLS) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "hevcehw_base_enctools.h" #include "hevcehw_base_task.h" #include "hevcehw_base_legacy.h" #include using namespace HEVCEHW; using namespace HEVCEHW::Base; void HevcEncTools::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_ENCTOOLS_CONFIG].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& buf_src = *(const mfxExtEncToolsConfig*)pSrc; auto& buf_dst = *(mfxExtEncToolsConfig*)pDst; MFX_COPY_FIELD(AdaptiveI); MFX_COPY_FIELD(AdaptiveB); MFX_COPY_FIELD(AdaptiveLTR); MFX_COPY_FIELD(AdaptivePyramidQuantB); MFX_COPY_FIELD(AdaptivePyramidQuantP); MFX_COPY_FIELD(AdaptiveQuantMatrices); MFX_COPY_FIELD(AdaptiveRefB); MFX_COPY_FIELD(AdaptiveRefP); MFX_COPY_FIELD(BRC); MFX_COPY_FIELD(BRCBufferHints); MFX_COPY_FIELD(SceneChange); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(AdaptiveI); MFX_COPY_FIELD(AdaptiveB); MFX_COPY_FIELD(LookAheadDepth); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(ExtBrcAdaptiveLTR); }); } void HevcEncTools::SetInherited(ParamInheritance& par) { par.m_ebInheritDefault[MFX_EXTBUFF_ENCTOOLS_CONFIG].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& buf_src = *(const mfxExtEncToolsConfig*)pSrc; auto& buf_dst = *(mfxExtEncToolsConfig*)pDst; InheritOption(buf_src.AdaptiveI, buf_dst.AdaptiveI); InheritOption(buf_src.AdaptiveB, buf_dst.AdaptiveB); InheritOption(buf_src.AdaptiveLTR, buf_dst.AdaptiveLTR); InheritOption(buf_src.AdaptivePyramidQuantB, buf_dst.AdaptivePyramidQuantB); InheritOption(buf_src.AdaptivePyramidQuantP, buf_dst.AdaptivePyramidQuantP); InheritOption(buf_src.AdaptiveQuantMatrices, buf_dst.AdaptiveQuantMatrices); InheritOption(buf_src.AdaptiveRefB, buf_dst.AdaptiveRefB); InheritOption(buf_src.AdaptiveRefP, buf_dst.AdaptiveRefP); InheritOption(buf_src.BRC, buf_dst.BRC); InheritOption(buf_src.BRCBufferHints, buf_dst.BRCBufferHints); InheritOption(buf_src.SceneChange, buf_dst.SceneChange); }); } inline bool IsLookAhead(const mfxExtEncToolsConfig &config, bool bGameStreaming) { if (!bGameStreaming) return false; return (IsOn(config.AdaptiveI) || IsOn(config.AdaptiveB) || IsOn(config.SceneChange) || IsOn(config.AdaptivePyramidQuantP) || IsOn(config.BRCBufferHints) || IsOn(config.AdaptiveQuantMatrices)); } inline bool IsAdaptiveGOP(const mfxExtEncToolsConfig &config) { return (IsOn(config.AdaptiveI) || IsOn(config.AdaptiveB)); } inline bool IsAdaptiveQP(const mfxExtEncToolsConfig &config) { return (IsOn(config.AdaptivePyramidQuantP) || IsOn(config.AdaptivePyramidQuantB)); } inline bool IsAdaptiveRef(const mfxExtEncToolsConfig &config) { return (IsOn(config.AdaptiveRefP) || IsOn(config.AdaptiveRefB)); } inline bool IsAdaptiveLTR(const mfxExtEncToolsConfig &config) { return IsOn(config.AdaptiveLTR); } inline bool IsBRC(const mfxExtEncToolsConfig &config) { return IsOn(config.BRC); } inline bool IsEncToolsOptSet(const mfxExtEncToolsConfig& config) { return (config.AdaptiveB | config.AdaptiveI | config.AdaptiveLTR | config.AdaptivePyramidQuantB | config.AdaptivePyramidQuantP | config.AdaptiveQuantMatrices | config.AdaptiveRefB | config.AdaptiveRefP | config.BRC | config.BRCBufferHints | config.SceneChange); } bool HEVCEHW::Base::IsEncToolsOptOn(const mfxExtEncToolsConfig &config, bool bGameStreaming) { return (IsAdaptiveGOP(config) || IsAdaptiveQP(config) || IsAdaptiveRef(config) || IsAdaptiveLTR(config) || IsBRC(config) || IsLookAhead(config,bGameStreaming)); } bool HEVCEHW::Base::IsLPLAEncToolsOn(const mfxExtEncToolsConfig &config, bool bGameStreaming) { return IsLookAhead(config, bGameStreaming); } inline mfxU32 GetNumTempLayers(const mfxVideoParam &video) { const mfxExtAvcTemporalLayers* tempLayers = ExtBuffer::Get(video); if (tempLayers == nullptr) return 0; mfxU32 numTemporalLayer = 0; if (tempLayers) { for (mfxU32 i = 0; i < 8; i++) { if (tempLayers->Layer[i].Scale != 0) numTemporalLayer++; } } return numTemporalLayer; } inline bool IsAdaptiveRefAllowed(const mfxVideoParam &video) { const mfxExtCodingOption3 *pExtOpt3 = ExtBuffer::Get(video); bool adaptiveRef = (video.mfx.TargetUsage != 7) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); if (pExtOpt3) { adaptiveRef = adaptiveRef && !(pExtOpt3->NumRefActiveP[0] == 1 || (video.mfx.GopRefDist > 1 && pExtOpt3->NumRefActiveBL0[0] == 1)); adaptiveRef = adaptiveRef && !IsOff(pExtOpt3->ExtBrcAdaptiveLTR); } return adaptiveRef; } inline bool CheckEncToolsCondition(const mfxVideoParam &video) { return ((video.mfx.FrameInfo.PicStruct == 0 || video.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) && GetNumTempLayers(video) <= 1); } inline bool CheckSWEncCondition(const mfxVideoParam &video) { return ( CheckEncToolsCondition(video) && (video.mfx.GopRefDist == 0 || video.mfx.GopRefDist == 1 || video.mfx.GopRefDist == 2 || video.mfx.GopRefDist == 4 || video.mfx.GopRefDist == 8 || video.mfx.GopRefDist == 16)); } inline mfxEncTools *GetEncTools(mfxVideoParam &video) { return (mfxEncTools *)mfx::GetExtBuffer(video.ExtParam, video.NumExtParam, MFX_EXTBUFF_ENCTOOLS); } inline bool IsGameStreaming(const mfxVideoParam& video) { const mfxExtCodingOption3* pExtOpt3 = ExtBuffer::Get(video); return (pExtOpt3 && pExtOpt3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING); } inline bool IsEncToolsImplicit(const mfxVideoParam &video) { const mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); bool etOn = false; if (pExtOpt2 && pExtOpt2->LookAheadDepth > 0) { const mfxExtCodingOption3* pExtOpt3 = ExtBuffer::Get(video); etOn = (IsGameStreaming(video) && IsOn(video.mfx.LowPower)); // LPLA etOn = etOn || ((video.mfx.GopRefDist == 2 || video.mfx.GopRefDist == 4 || video.mfx.GopRefDist == 8 || video.mfx.GopRefDist == 16) && IsOn(pExtOpt2->ExtBRC) // SW EncTools && !(pExtOpt3 && pExtOpt3->ScenarioInfo != MFX_SCENARIO_UNKNOWN)); } return etOn; } bool isSWLACondition(const mfxVideoParam& video) { const mfxExtCodingOption2* pExtOpt2 = ExtBuffer::Get(video); return (pExtOpt2 && (pExtOpt2->LookAheadDepth > video.mfx.GopRefDist)); } static void SetDefaultConfig(const mfxVideoParam &video, mfxExtEncToolsConfig &config, bool bMBQPSupport) { const mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); const mfxExtCodingOption3 *pExtOpt3 = ExtBuffer::Get(video); const mfxExtEncToolsConfig *pExtConfig = ExtBuffer::Get(video); bool bGameStreaming = IsGameStreaming(video); if (!pExtConfig || !IsEncToolsOptSet(*pExtConfig)) { if (IsEncToolsImplicit(video)) { config.AdaptiveI = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveB = MFX_CODINGOPTION_UNKNOWN; config.AdaptivePyramidQuantP = MFX_CODINGOPTION_UNKNOWN; config.AdaptivePyramidQuantB = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveRefP = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveRefB = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveLTR = MFX_CODINGOPTION_UNKNOWN; config.BRCBufferHints = MFX_CODINGOPTION_UNKNOWN; config.BRC = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveQuantMatrices = MFX_CODINGOPTION_UNKNOWN; config.SceneChange = MFX_CODINGOPTION_UNKNOWN; config.AdaptiveMBQP = MFX_CODINGOPTION_UNKNOWN; } else { config.AdaptiveI = MFX_CODINGOPTION_OFF; config.AdaptiveB = MFX_CODINGOPTION_OFF; config.AdaptivePyramidQuantP = MFX_CODINGOPTION_OFF; config.AdaptivePyramidQuantB = MFX_CODINGOPTION_OFF; config.AdaptiveRefP = MFX_CODINGOPTION_OFF; config.AdaptiveRefB = MFX_CODINGOPTION_OFF; config.AdaptiveLTR = MFX_CODINGOPTION_OFF; config.BRCBufferHints = MFX_CODINGOPTION_OFF; config.BRC = MFX_CODINGOPTION_OFF; config.AdaptiveQuantMatrices = MFX_CODINGOPTION_OFF; config.SceneChange = MFX_CODINGOPTION_OFF; config.AdaptiveMBQP = MFX_CODINGOPTION_OFF; return; } } else config = *pExtConfig; if (!bGameStreaming) { if (CheckSWEncCondition(video)) { bool bAdaptiveI = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bAdaptiveB = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); SetDefaultOpt(config.AdaptiveI, bAdaptiveI); SetDefaultOpt(config.AdaptiveB, bAdaptiveB); SetDefaultOpt(config.AdaptivePyramidQuantP, false); SetDefaultOpt(config.AdaptivePyramidQuantB, true); bool bAdaptiveRef = IsAdaptiveRefAllowed(video); SetDefaultOpt(config.AdaptiveRefP, bAdaptiveRef); SetDefaultOpt(config.AdaptiveRefB, bAdaptiveRef); SetDefaultOpt(config.AdaptiveLTR, bAdaptiveRef); } SetDefaultOpt(config.BRC, (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); bool lplaAssistedBRC = IsOn(config.BRC) && isSWLACondition(video); SetDefaultOpt(config.BRCBufferHints, lplaAssistedBRC); SetDefaultOpt(config.AdaptiveMBQP, bMBQPSupport && lplaAssistedBRC && IsOn(pExtOpt2->MBBRC)); SetDefaultOpt(config.AdaptiveQuantMatrices, false); } #ifdef MFX_ENABLE_ENCTOOLS_LPLA else { bool bLA = (pExtOpt2 && pExtOpt2->LookAheadDepth > 0 && (video.mfx.RateControlMethod == MFX_RATECONTROL_CBR || video.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); bool bAdaptiveI = (pExtOpt2 && IsOn(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bAdaptiveB = (pExtOpt2 && IsOn(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); SetDefaultOpt(config.BRCBufferHints, bLA); SetDefaultOpt(config.AdaptivePyramidQuantP, bLA); SetDefaultOpt(config.AdaptivePyramidQuantB, bLA); SetDefaultOpt(config.AdaptiveQuantMatrices, bLA && !IsOff(pExtOpt3->AdaptiveCQM)); SetDefaultOpt(config.AdaptiveI, bLA && bAdaptiveI); SetDefaultOpt(config.AdaptiveB, bLA && bAdaptiveB); SetDefaultOpt(config.AdaptiveMBQP, bLA && bMBQPSupport && IsOn(pExtOpt2->MBBRC) ); } #endif } inline mfxU32 CheckFlag(mfxU16 & flag, bool bCond) { return CheckOrZero(flag , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * (bCond))); } static mfxU32 CorrectVideoParams(mfxVideoParam & video, mfxExtEncToolsConfig & supportedConfig) { mfxExtCodingOption2 *pExtOpt2 = ExtBuffer::Get(video); mfxExtCodingOption3 *pExtOpt3 = ExtBuffer::Get(video); mfxExtBRC *pBRC = ExtBuffer::Get(video); mfxExtEncToolsConfig *pConfig = ExtBuffer::Get(video); bool bIsEncToolsEnabled = CheckEncToolsCondition(video); mfxU32 changed = 0; #ifdef MFX_ENABLE_ENCTOOLS_LPLA if (IsGameStreaming(video)) { // Closed GOP for GS by default unless IdrInterval is set to max // Open GOP with arbitrary IdrInterval if GOP is strict (GopOptFlag == MFX_GOP_STRICT) if (video.mfx.GopOptFlag == 0 && video.mfx.IdrInterval != USHRT_MAX) { changed++; video.mfx.GopOptFlag = MFX_GOP_CLOSED; } } #endif if (pConfig) { bool bAdaptiveI = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveI)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bAdaptiveB = !(pExtOpt2 && IsOff(pExtOpt2->AdaptiveB)) && !(video.mfx.GopOptFlag & MFX_GOP_STRICT); bool bAdaptiveRef = IsAdaptiveRefAllowed(video); changed += CheckFlag(pConfig->AdaptiveI, bIsEncToolsEnabled && bAdaptiveI); changed += CheckFlag(pConfig->AdaptiveB, bIsEncToolsEnabled && bAdaptiveB); changed += CheckFlag(pConfig->AdaptivePyramidQuantB, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptivePyramidQuantP, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveRefP, bIsEncToolsEnabled && bAdaptiveRef); changed += CheckFlag(pConfig->AdaptiveRefB, bIsEncToolsEnabled && bAdaptiveRef); changed += CheckFlag(pConfig->AdaptiveLTR, bIsEncToolsEnabled && bAdaptiveRef); changed += CheckFlag(pConfig->SceneChange, bIsEncToolsEnabled); changed += CheckFlag(pConfig->BRCBufferHints, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveQuantMatrices, bIsEncToolsEnabled); changed += CheckFlag(pConfig->BRC, bIsEncToolsEnabled); changed += CheckFlag(pConfig->AdaptiveI, IsOn(supportedConfig.AdaptiveI)); changed += CheckFlag(pConfig->AdaptiveB, IsOn(supportedConfig.AdaptiveB)); changed += CheckFlag(pConfig->AdaptivePyramidQuantB, IsOn(supportedConfig.AdaptivePyramidQuantB)); changed += CheckFlag(pConfig->AdaptivePyramidQuantP, IsOn(supportedConfig.AdaptivePyramidQuantP)); changed += CheckFlag(pConfig->AdaptiveRefP, IsOn(supportedConfig.AdaptiveRefP)); changed += CheckFlag(pConfig->AdaptiveRefB, IsOn(supportedConfig.AdaptiveRefB)); changed += CheckFlag(pConfig->AdaptiveLTR, IsOn(supportedConfig.AdaptiveLTR)); changed += CheckFlag(pConfig->SceneChange, IsOn(supportedConfig.SceneChange)); changed += CheckFlag(pConfig->BRCBufferHints, IsOn(supportedConfig.BRCBufferHints)); changed += CheckFlag(pConfig->AdaptiveQuantMatrices, IsOn(supportedConfig.AdaptiveQuantMatrices)); changed += CheckFlag(pConfig->BRC, IsOn(supportedConfig.BRC)); changed += CheckFlag(pConfig->AdaptiveMBQP, IsOn(supportedConfig.AdaptiveMBQP)); } if (pExtOpt2) { changed += CheckFlag(pExtOpt2->AdaptiveI, IsOn(supportedConfig.AdaptiveI)); changed += CheckFlag(pExtOpt2->AdaptiveB, IsOn(supportedConfig.AdaptiveB)); changed += CheckFlag(pExtOpt2->ExtBRC, IsOn(supportedConfig.BRC)); changed += CheckFlag(pExtOpt2->MBBRC, IsOn(supportedConfig.AdaptiveMBQP)); } if (pExtOpt3) changed += CheckFlag(pExtOpt3->ExtBrcAdaptiveLTR, IsOn(supportedConfig.AdaptiveLTR)); //ExtBRC isn't compatible with EncTools if (pBRC && bIsEncToolsEnabled && (pBRC->pthis || pBRC->Init || pBRC->Close || pBRC->Update || pBRC->GetFrameCtrl || pBRC->Reset || pBRC->GetFrameCtrl)) { pBRC->pthis = nullptr; pBRC->Init = nullptr; pBRC->Close = nullptr; pBRC->Update = nullptr; pBRC->GetFrameCtrl = nullptr; pBRC->Reset = nullptr; changed++; } return changed; } static mfxStatus InitEncToolsCtrl( mfxVideoParam const & par , mfxEncToolsCtrl *ctrl) { MFX_CHECK_NULL_PTR1(ctrl); const mfxExtCodingOption *pCO = ExtBuffer::Get(par); const mfxExtCodingOption2 *pCO2 = ExtBuffer::Get(par); const mfxExtCodingOption3 *pCO3 = ExtBuffer::Get(par); const mfxExtCodingOptionDDI* pCODDI = ExtBuffer::Get(par); ctrl->CodecId = par.mfx.CodecId; ctrl->CodecProfile = par.mfx.CodecProfile; ctrl->CodecLevel = par.mfx.CodecLevel; ctrl->LowPower = par.mfx.LowPower; ctrl->AsyncDepth = par.AsyncDepth; ctrl->FrameInfo = par.mfx.FrameInfo; ctrl->IOPattern = par.IOPattern; ctrl->MaxDelayInFrames = pCO2 ? pCO2->LookAheadDepth : 0 ; ctrl->NumRefP = pCODDI ? std::min(par.mfx.NumRefFrame, pCODDI->NumActiveRefP) : par.mfx.NumRefFrame; ctrl->MaxGopSize = par.mfx.GopPicSize; ctrl->MaxGopRefDist = par.mfx.GopRefDist; ctrl->MaxIDRDist = par.mfx.GopPicSize * par.mfx.IdrInterval; // HEVC Defaults to CRA for IdrInterval == 0 if (par.mfx.IdrInterval == 0 && par.mfx.GopPicSize != 0) { ctrl->MaxIDRDist = par.mfx.GopPicSize * (0xffff / par.mfx.GopPicSize); } ctrl->BRefType = pCO2 ? pCO2->BRefType : 0; ctrl->ScenarioInfo = pCO3 ? pCO3->ScenarioInfo : 0; ctrl->GopOptFlag = (mfxU8)par.mfx.GopOptFlag; // Rate control info mfxU32 mult = par.mfx.BRCParamMultiplier ? par.mfx.BRCParamMultiplier : 1; bool BRC = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR); ctrl->RateControlMethod = par.mfx.RateControlMethod; //CBR, VBR, CRF,CQP if (!BRC) { ctrl->QPLevel[0] = par.mfx.QPI; ctrl->QPLevel[1] = par.mfx.QPP; ctrl->QPLevel[2] = par.mfx.QPB; } else { ctrl->TargetKbps = par.mfx.TargetKbps * mult; ctrl->MaxKbps = par.mfx.MaxKbps * mult; if (pCO) { ctrl->HRDConformance = MFX_BRC_NO_HRD; if (!IsOff(pCO->NalHrdConformance) && !IsOff(pCO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_STRONG; else if (IsOn(pCO->NalHrdConformance) && IsOff(pCO->VuiNalHrdParameters)) ctrl->HRDConformance = MFX_BRC_HRD_WEAK; } else ctrl->HRDConformance = MFX_BRC_HRD_STRONG; ctrl->BufferSizeInKB = par.mfx.BufferSizeInKB*mult; //Bitstream size if (ctrl->HRDConformance) { ctrl->InitialDelayInKB = par.mfx.InitialDelayInKB*mult; //if HRDConformance is ON } else { ctrl->ConvergencePeriod = 0; //if HRDConformance is OFF, 0 - the period is whole stream, ctrl->Accuracy = 10; //if HRDConformance is OFF } mfxU32 maxFrameSize = pCO2 ? pCO2->MaxFrameSize : 0; ctrl->WinBRCMaxAvgKbps = pCO3 ? pCO3->WinBRCMaxAvgKbps*mult : 0; ctrl->WinBRCSize = pCO3 ? pCO3->WinBRCSize : 0; ctrl->MaxFrameSizeInBytes[0] = (pCO3 && pCO3->MaxFrameSizeI) ? pCO3->MaxFrameSizeI : maxFrameSize; // MaxFrameSize limitation ctrl->MaxFrameSizeInBytes[1] = (pCO3 && pCO3->MaxFrameSizeP) ? pCO3->MaxFrameSizeP : maxFrameSize; ctrl->MaxFrameSizeInBytes[2] = maxFrameSize; ctrl->MinQPLevel[0] = pCO2 ? pCO2->MinQPI : 0; //QP range limitations ctrl->MinQPLevel[1] = pCO2 ? pCO2->MinQPP : 0; ctrl->MinQPLevel[2] = pCO2 ? pCO2->MinQPB : 0; ctrl->MaxQPLevel[0] = pCO2 ? pCO2->MaxQPI : 0; //QP range limitations ctrl->MaxQPLevel[1] = pCO2 ? pCO2->MaxQPP : 0; ctrl->MaxQPLevel[2] = pCO2 ? pCO2->MaxQPB : 0; ctrl->PanicMode = pCO3 ? pCO3->BRCPanicMode : 0; } // LaScale here ctrl->LaScale = 0; ctrl->LaQp = 30; if (ctrl->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) { mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; if (crW >= 720) ctrl->LaScale = 2; } else { mfxU16 crH = par.mfx.FrameInfo.CropH ? par.mfx.FrameInfo.CropH : par.mfx.FrameInfo.Height; mfxU16 crW = par.mfx.FrameInfo.CropW ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; mfxU16 maxDim = std::max(crH, crW); mfxU16 minDim = std::min(crH, crW); constexpr mfxU16 LaScale = 2; if (maxDim >= 720 && minDim >= (128<LaScale = LaScale; } ctrl->LaQp = 26; } return MFX_ERR_NONE; } static bool isEncTools(const mfxVideoParam& par) { const mfxExtEncToolsConfig* pConfig = ExtBuffer::Get(par); bool bEncTools = false; if (pConfig) { mfxExtEncToolsConfig config = {}; SetDefaultConfig(par, config, true); bEncTools = IsEncToolsOptOn(config, IsGameStreaming(par)); } else bEncTools = IsEncToolsImplicit(par); return bEncTools; } void HevcEncTools::Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) { Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetMBBRC.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { bool bEncTools = isEncTools(par.mvp); if (bEncTools && !IsGameStreaming(par.mvp) && isSWLACondition(par.mvp)) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); const mfxExtEncToolsConfig* pConfig = ExtBuffer::Get(par.mvp); bool bDisableMBQP = pConfig && (IsOff(pConfig->AdaptiveMBQP) || IsOff(pConfig->BRC)); return (mfxU16)((pCO2 && pCO2->MBBRC) ? pCO2->MBBRC : bDisableMBQP ? MFX_CODINGOPTION_OFF : MFX_CODINGOPTION_ON); } return mfxU16(prev(par)); }); return MFX_ERR_NONE; }); Push(BLK_Check, [&blocks](const mfxVideoParam&, mfxVideoParam& par, StorageW&) -> mfxStatus { bool bEncTools = isEncTools(par); mfxU32 changed = 0; MFX_CHECK(bEncTools, MFX_ERR_NONE); mfxEncTools *pEncTools = GetEncTools(par); bool bCreated = false; if (!pEncTools) { pEncTools = MFXVideoENCODE_CreateEncTools(par); bCreated = !!pEncTools; } mfxEncToolsCtrl ctrl = {}; mfxExtEncToolsConfig supportedConfig = {}; mfxStatus sts = InitEncToolsCtrl(par, &ctrl); MFX_CHECK_STS(sts); pEncTools->GetSupportedConfig(pEncTools->Context, &supportedConfig, &ctrl); changed += CorrectVideoParams(par, supportedConfig); if (bCreated) MFXVideoENCODE_DestroyEncTools(pEncTools); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void HevcEncTools::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW& global, StorageRW&) { mfxExtEncToolsConfig *pConfig = ExtBuffer::Get(par); auto& caps = Glob::EncodeCaps::Get(global); if (pConfig) SetDefaultConfig(par, *pConfig, caps.MBBRCSupport); }); } void HevcEncTools::Reset(const FeatureBlocks& /*blocks*/, TPushR Push) { Push(BLK_ResetCheck , []( const mfxVideoParam& /*par*/ , StorageRW& global , StorageRW&) -> mfxStatus { auto& init = Glob::RealState::Get(global); auto& parOld = Glob::VideoParam::Get(init); auto& parNew = Glob::VideoParam::Get(global); mfxExtEncToolsConfig *pConfigOld = ExtBuffer::Get(parOld); mfxExtEncToolsConfig *pConfigNew = ExtBuffer::Get(parNew); if (pConfigOld && pConfigNew) { MFX_CHECK( pConfigOld->AdaptiveB == pConfigNew->AdaptiveB && pConfigOld->AdaptiveI == pConfigNew->AdaptiveI && pConfigOld->AdaptiveRefP == pConfigNew->AdaptiveRefP && pConfigOld->AdaptiveRefB == pConfigNew->AdaptiveRefB && pConfigOld->AdaptiveLTR == pConfigNew->AdaptiveLTR && pConfigOld->AdaptivePyramidQuantP == pConfigNew->AdaptivePyramidQuantP && pConfigOld->AdaptivePyramidQuantB == pConfigNew->AdaptivePyramidQuantB && pConfigOld->BRC == pConfigNew->BRC && pConfigOld->BRCBufferHints == pConfigNew->BRCBufferHints && pConfigOld->AdaptiveQuantMatrices == pConfigNew->AdaptiveQuantMatrices , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; }); } void HevcEncTools::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); if (m_pEncTools && m_pEncTools->Reset) { m_EncToolCtrl = {}; mfxExtBuffer* ExtParam; mfxExtEncoderResetOption rOpt = {}; if (Glob::ResetHint::Get(global).Flags & RF_IDR_REQUIRED) { rOpt.Header.BufferId = MFX_EXTBUFF_ENCODER_RESET_OPTION; rOpt.Header.BufferSz = sizeof(rOpt); rOpt.StartNewSequence = MFX_CODINGOPTION_ON; ExtParam = &rOpt.Header; m_EncToolCtrl.NumExtParam = 1; m_EncToolCtrl.ExtParam = &ExtParam; } auto sts = InitEncToolsCtrl(par, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = m_pEncTools->Reset(m_pEncTools->Context, &m_EncToolConfig, &m_EncToolCtrl); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; }); } inline void InitEncToolsCtrlExtDevice(mfxEncToolsCtrlExtDevice & extDevice , mfxHandleType h_type , mfxHDL device_handle) { extDevice.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_DEVICE; extDevice.Header.BufferSz = sizeof(mfxEncToolsCtrlExtDevice); extDevice.HdlType = h_type; extDevice.DeviceHdl = device_handle; } inline void InitEncToolsCtrlExtAllocator(mfxEncToolsCtrlExtAllocator & extAllocator , mfxFrameAllocator &allocator) { extAllocator.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_ALLOCATOR; extAllocator.Header.BufferSz = sizeof(mfxEncToolsCtrlExtAllocator); extAllocator.pAllocator = &allocator; } inline mfxHandleType GetHandleType(eMFXVAType vaType) { switch (vaType) { case MFX_HW_D3D9: return MFX_HANDLE_D3D9_DEVICE_MANAGER; case MFX_HW_VAAPI: return MFX_HANDLE_VA_DISPLAY; default: break; } return MFX_HANDLE_D3D11_DEVICE; } void HevcEncTools::QueryIOSurf(const FeatureBlocks&, TPushQIS Push) { Push(BLK_QueryIOSurf , [](const mfxVideoParam& parInput, mfxFrameAllocRequest& req, StorageRW& strg) -> mfxStatus { ExtBuffer::Param par = parInput; auto& caps = Glob::EncodeCaps::Get(strg); bool bEncTools = isEncTools(par); mfxU32 changed = 0; MFX_CHECK(bEncTools, MFX_ERR_NONE); mfxEncTools* pEncTools = GetEncTools(par); bool bCreated = false; if (!pEncTools) { pEncTools = MFXVideoENCODE_CreateEncTools(par); bCreated = !!pEncTools; } MFX_CHECK_NULL_PTR1(pEncTools); mfxEncToolsCtrl ctrl = {}; mfxExtEncToolsConfig supportedConfig = {}; mfxStatus sts = InitEncToolsCtrl(par, &ctrl); MFX_CHECK_STS(sts); pEncTools->GetSupportedConfig(pEncTools->Context, &supportedConfig, &ctrl); changed += CorrectVideoParams(par, supportedConfig); mfxExtEncToolsConfig config = {}; SetDefaultConfig(par, config, caps.MbQpDataSupport); mfxU32 maxDelay = 0; pEncTools->GetDelayInFrames(pEncTools->Context, &config, &ctrl, &maxDelay); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2) maxDelay = (mfxU32)std::max(0, maxDelay - pCO2->LookAheadDepth); //LA is used in base_legacy req.NumFrameMin += (mfxU16)maxDelay; req.NumFrameSuggested += (mfxU16)maxDelay; if (bCreated) MFXVideoENCODE_DestroyEncTools(pEncTools); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } mfxStatus HevcEncTools::SubmitPreEncTask(StorageW& /*global*/, StorageW& s_task) { MFX_CHECK(m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); mfxEncToolsTaskParam task_par = {}; auto& task = Task::Common::Get(s_task); std::vector extParams; mfxEncToolsFrameToAnalyze extFrameData = {}; //"m_numPicBuffered > 0" indicates: there are some PreEnc frames buffered for async_depth > 1 case, while not queried if (task.pSurfIn || m_numPicBuffered > 0) { extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.Surface = task.pSurfIn; extParams.push_back(&extFrameData.Header); task_par.ExtParam = extParams.data(); if (!task.pSurfIn) { m_numPicBuffered--; } } task_par.DisplayOrder = task.DisplayOrder; task_par.NumExtParam = (mfxU16)extParams.size(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); if (sts == MFX_ERR_MORE_DATA) { m_numPicBuffered++; // current PreEnc frame buffered, while not queried sts = MFX_ERR_NONE; } return (sts); } constexpr mfxU32 ENCTOOLS_QUERY_TIMEOUT = 5000; mfxStatus HevcEncTools::BRCGetCtrl(StorageW& global , StorageW& s_task, mfxEncToolsBRCQuantControl &extQuantCtrl , mfxEncToolsBRCHRDPos &extHRDPos, mfxEncToolsHintQPMap &qpMapHint) { MFX_CHECK(IsOn (m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); mfxEncToolsTaskParam task_par = {}; auto& task = Task::Common::Get(s_task); std::vector extParams; mfxEncToolsBRCFrameParams extFrameData = {}; mfxEncToolsBRCBufferHint extBRCHints = {}; task_par.DisplayOrder = task.DisplayOrder; { // input params extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.EncodeOrder = task.EncodedOrder; extFrameData.FrameType = task.FrameType; extFrameData.PyramidLayer = (mfxU16) task.PyramidLevel; extFrameData.SceneChange = task.GopHints.SceneChange; extFrameData.SpatialComplexity = task.GopHints.SpatialComplexity; extFrameData.PersistenceMapNZ = task.GopHints.PersistenceMapNZ; memcpy(extFrameData.PersistenceMap, task.GopHints.PersistenceMap, sizeof(extFrameData.PersistenceMap)); extParams.push_back(&extFrameData.Header); if (task.BrcHints.LaAvgEncodedBits) { extBRCHints.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; extBRCHints.Header.BufferSz = sizeof(extBRCHints); extBRCHints.AvgEncodedSizeInBits = task.BrcHints.LaAvgEncodedBits; extBRCHints.CurEncodedSizeInBits = task.BrcHints.LaCurEncodedBits; extBRCHints.DistToNextI = task.BrcHints.LaDistToNextI; extParams.push_back(&extBRCHints.Header); } if (task.GopHints.QPModulaton || task.GopHints.MiniGopSize) { mfxEncToolsHintPreEncodeGOP extPreGop = {}; extPreGop.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; extPreGop.Header.BufferSz = sizeof(extPreGop); extPreGop.QPModulation = (mfxU16)task.GopHints.QPModulaton; extPreGop.QPDeltaExplicitModulation = (mfxI8)task.GopHints.QPDeltaExplicitModulation; extPreGop.MiniGopSize = (mfxU16)task.GopHints.MiniGopSize; extParams.push_back(&extPreGop.Header); } task_par.ExtParam = extParams.data(); task_par.NumExtParam = (mfxU16)extParams.size(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); MFX_CHECK_STS(sts); } { extParams.clear(); // output params extQuantCtrl = {}; extQuantCtrl.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL; extQuantCtrl.Header.BufferSz = sizeof(extQuantCtrl); extParams.push_back(&extQuantCtrl.Header); extHRDPos = {}; extHRDPos.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS; extHRDPos.Header.BufferSz = sizeof(extHRDPos); extParams.push_back(&extHRDPos.Header); auto& par = Glob::VideoParam::Get(global); auto& caps = Glob::EncodeCaps::Get(global); std::unique_ptr qpMap = nullptr; if (Legacy::GetMBQPMode(caps, par) == MBQPMode_FromEncToolsBRC && global.Contains(Glob::AllocMBQP::Key)) { qpMapHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP; qpMapHint.Header.BufferSz = sizeof(qpMapHint); if (!task.CUQP.Mid) { task.CUQP = Glob::AllocMBQP::Get(global).Acquire(); MFX_CHECK(task.CUQP.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); } auto& allocInfo = Glob::MBQPAllocInfo::Get(global); auto& core = Glob::VideoCore::Get(global); qpMap = std::make_unique (core, task.CUQP.Mid); MFX_CHECK(qpMap->Y, MFX_ERR_LOCK_MEMORY); qpMapHint.ExtQpMap.BlockSize = (mfxU16)allocInfo.block_width; qpMapHint.ExtQpMap.QP = qpMap->Y; qpMapHint.ExtQpMap.Mode = MFX_MBQP_MODE_QP_VALUE; qpMapHint.ExtQpMap.NumQPAlloc = allocInfo.height_aligned * allocInfo.pitch; qpMapHint.QpMapPitch = (mfxU16)allocInfo.pitch; extParams.push_back(&qpMapHint.Header); } task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); MFX_CHECK_STS(sts); if (qpMapHint.QpMapFilled) task.bCUQPMap = true; } return MFX_ERR_NONE; } mfxStatus HevcEncTools::QueryPreEncTask(StorageW& global, StorageW& s_task) { MFX_CHECK(m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxEncToolsTaskParam task_par = {}; std::vector extParams; mfxEncToolsHintPreEncodeSceneChange preEncodeSChg = {}; mfxEncToolsHintPreEncodeGOP preEncodeGOP = {}; mfxEncToolsBRCBufferHint bufHint = {}; mfxEncToolsHintQuantMatrix cqmHint = {}; mfxEncToolsHintQPMap qpMapHint = {}; bool isLABRC = (m_EncToolCtrl.ScenarioInfo == MFX_SCENARIO_UNKNOWN && IsOn(m_EncToolConfig.BRCBufferHints) && IsOn(m_EncToolConfig.BRC)); MFX_CHECK(task.DisplayOrder!= (mfxU32)(-1), MFX_ERR_NONE); task_par.DisplayOrder = task.DisplayOrder; task_par.NumExtParam = 0; if (IsOn(m_EncToolConfig.BRC)) { preEncodeSChg.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE; preEncodeSChg.Header.BufferSz = sizeof(preEncodeSChg); extParams.push_back(&preEncodeSChg.Header); } if (IsOn(m_EncToolConfig.AdaptiveI) || IsOn(m_EncToolConfig.AdaptiveB) || IsOn(m_EncToolConfig.AdaptivePyramidQuantP) || IsOn(m_EncToolConfig.AdaptivePyramidQuantB)) { preEncodeGOP.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_GOP; preEncodeGOP.Header.BufferSz = sizeof(preEncodeGOP); extParams.push_back(&preEncodeGOP.Header); } #if defined MFX_ENABLE_ENCTOOLS_LPLA if (IsOn(m_EncToolConfig.AdaptiveQuantMatrices)) { cqmHint.MatrixType = CQM_HINT_USE_FLAT_MATRIX; cqmHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_MATRIX; cqmHint.Header.BufferSz = sizeof(cqmHint); extParams.push_back(&cqmHint.Header); } #endif if (IsOn(m_EncToolConfig.BRCBufferHints)) { bufHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT; bufHint.Header.BufferSz = sizeof(bufHint); bufHint.OutputMode = mfxU16(isLABRC ? MFX_BUFFERHINT_OUTPUT_DISPORDER : MFX_BUFFERHINT_OUTPUT_ENCORDER); extParams.push_back(&bufHint.Header); } auto& par = Glob::VideoParam::Get(global); auto& caps = Glob::EncodeCaps::Get(global); std::unique_ptr qpMap = nullptr; if (Legacy::GetMBQPMode(caps, par) == MBQPMode_FromEncToolsLA && global.Contains(Glob::AllocMBQP::Key)) { qpMapHint.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP; qpMapHint.Header.BufferSz = sizeof(qpMapHint); if (!task.CUQP.Mid) { task.CUQP = Glob::AllocMBQP::Get(global).Acquire(); MFX_CHECK(task.CUQP.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); } auto& allocInfo = Glob::MBQPAllocInfo::Get(global); auto& core = Glob::VideoCore::Get(global); qpMap = std::make_unique (core, task.CUQP.Mid); MFX_CHECK(qpMap->Y, MFX_ERR_LOCK_MEMORY); qpMapHint.ExtQpMap.BlockSize = (mfxU16)allocInfo.block_width; qpMapHint.ExtQpMap.QP = qpMap->Y; qpMapHint.ExtQpMap.Mode = MFX_MBQP_MODE_QP_DELTA; qpMapHint.ExtQpMap.NumQPAlloc = allocInfo.height_aligned * allocInfo.pitch; qpMapHint.QpMapPitch = (mfxU16)allocInfo.pitch; extParams.push_back(&qpMapHint.Header); } task_par.ExtParam = extParams.data(); task_par.NumExtParam = (mfxU16)extParams.size(); MFX_CHECK(task_par.NumExtParam, MFX_ERR_NONE); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); if (sts == MFX_ERR_MORE_DATA) sts = MFX_ERR_NONE; MFX_CHECK_STS(sts); task.GopHints.MiniGopSize = preEncodeGOP.MiniGopSize; task.GopHints.FrameType = preEncodeGOP.FrameType; task.GopHints.SceneChange = preEncodeSChg.SceneChangeFlag; task.GopHints.SpatialComplexity = preEncodeSChg.SpatialComplexity; task.GopHints.PersistenceMapNZ = preEncodeSChg.PersistenceMapNZ; if (qpMapHint.QpMapFilled) task.bCUQPMap = true; memcpy(task.GopHints.PersistenceMap, preEncodeSChg.PersistenceMap, sizeof(task.GopHints.PersistenceMap)); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) if (IsOn(m_EncToolConfig.BRCBufferHints) && !isLABRC) { //Low power look ahead with HW BRC mfxLplastatus laStatus = {}; laStatus.QpModulation = (mfxU8)preEncodeGOP.QPModulation; laStatus.MiniGopSize = (mfxU8)preEncodeGOP.MiniGopSize; switch (cqmHint.MatrixType) { case MFX_QUANT_MATRIX_WEAK: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX1; break; case MFX_QUANT_MATRIX_MEDIUM: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX2; break; case MFX_QUANT_MATRIX_STRONG: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX3; break; case MFX_QUANT_MATRIX_EXTREME: laStatus.CqmHint = CQM_HINT_USE_CUST_MATRIX4; break; case CQM_HINT_INVALID: laStatus.CqmHint = CQM_HINT_INVALID; break; case MFX_QUANT_MATRIX_FLAT: default: laStatus.CqmHint = CQM_HINT_USE_FLAT_MATRIX; } laStatus.TargetFrameSize = bufHint.OptimalFrameSizeInBytes; LpLaStatus.push_back(laStatus); //lpLaStatus is got in encoded order } else #endif { if (IsOn(m_EncToolConfig.AdaptivePyramidQuantB)) { if (preEncodeGOP.MiniGopSize <= 8) { task.GopHints.QPModulaton = MFX_QP_MODULATION_EXPLICIT; task.GopHints.QPDeltaExplicitModulation = (mfxI8)preEncodeGOP.QPDeltaExplicitModulation; } else { task.GopHints.QPModulaton = (mfxU8)preEncodeGOP.QPModulation; } } if (isLABRC) { task.BrcHints.LaAvgEncodedBits = bufHint.AvgEncodedSizeInBits; task.BrcHints.LaCurEncodedBits = bufHint.CurEncodedSizeInBits; task.BrcHints.LaDistToNextI = bufHint.DistToNextI; } } return sts; } mfxStatus HevcEncTools::BRCUpdate(StorageW& , StorageW& s_task, mfxEncToolsBRCStatus & brcStatus) { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxEncToolsTaskParam task_par = {}; std::vector extParams; MFX_CHECK(task.DisplayOrder != (mfxU32)(-1), MFX_ERR_NONE); task_par.DisplayOrder = task.DisplayOrder; { mfxEncToolsBRCEncodeResult extEncRes; extEncRes.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT; extEncRes.Header.BufferSz = sizeof(extEncRes); extEncRes.CodedFrameSize = task.MinFrameSize > task.BsDataLength ? task.MinFrameSize : task.BsDataLength; extEncRes.QpY = (mfxU16)task.QpY; extEncRes.NumRecodesDone = task.NumRecode; extParams.push_back(&extEncRes.Header); task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Submit(m_pEncTools->Context, &task_par); MFX_CHECK_STS(sts); } { extParams.clear(); brcStatus = {}; brcStatus.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_BRC_STATUS; brcStatus.Header.BufferSz = sizeof(brcStatus); extParams.push_back(&brcStatus.Header); task_par.NumExtParam = (mfxU16)extParams.size(); task_par.ExtParam = extParams.data(); auto sts = m_pEncTools->Query(m_pEncTools->Context, &task_par, ENCTOOLS_QUERY_TIMEOUT); MFX_CHECK_STS(sts) } return MFX_ERR_NONE; } void HevcEncTools::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); mfxExtEncToolsConfig* pConfig = ExtBuffer::Get(par); bool bEncTools = (pConfig) ? IsEncToolsOptOn(*pConfig, IsGameStreaming(par)) : false; MFX_CHECK(bEncTools, MFX_ERR_NONE); MFX_CHECK(!m_pEncTools, MFX_ERR_NONE); mfxEncTools* encTools = GetEncTools(par); mfxEncToolsCtrlExtDevice extBufDevice = {}; mfxEncToolsCtrlExtAllocator extBufAlloc = {}; mfxExtBuffer* ExtParam[2] = {}; memset(&m_EncToolCtrl, 0, sizeof(mfxEncToolsCtrl)); auto vaType = Glob::VideoCore::Get(strg).GetVAType(); if (vaType!= MFX_HW_NO) { mfxFrameAllocator *pFrameAlloc = nullptr; mfxHDL device_handle = {}; mfxHandleType h_type = GetHandleType(vaType); auto sts = Glob::VideoCore::Get(strg).GetHandle(h_type, &device_handle); MFX_CHECK_STS(sts); pFrameAlloc = (mfxFrameAllocator*)Glob::VideoCore::Get(strg).QueryCoreInterface(MFXIEXTERNALLOC_GUID);//(&frameAlloc); InitEncToolsCtrlExtDevice(extBufDevice, h_type, device_handle); if (pFrameAlloc) InitEncToolsCtrlExtAllocator(extBufAlloc, *pFrameAlloc); ExtParam[0] = &extBufDevice.Header; ExtParam[1] = &extBufAlloc.Header; m_EncToolCtrl.ExtParam = ExtParam; m_EncToolCtrl.NumExtParam = 2; } auto sts = InitEncToolsCtrl(par, &m_EncToolCtrl); MFX_CHECK_STS(sts); m_bEncToolsInner = false; if (!(encTools && encTools->Context)) { encTools = MFXVideoENCODE_CreateEncTools(par); m_bEncToolsInner = !!encTools; } if (encTools) { mfxExtEncToolsConfig supportedConfig = {}; encTools->GetSupportedConfig(encTools->Context, &supportedConfig, &m_EncToolCtrl); if (CorrectVideoParams(par, supportedConfig)) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); SetDefaultConfig(par, m_EncToolConfig,caps.MbQpDataSupport); sts = encTools->Init(encTools->Context, &m_EncToolConfig, &m_EncToolCtrl); MFX_CHECK_STS(sts); sts = encTools->GetActiveConfig(encTools->Context, &m_EncToolConfig); MFX_CHECK_STS(sts); encTools->GetDelayInFrames(encTools->Context, &m_EncToolConfig, &m_EncToolCtrl, &m_maxDelay); auto& taskMgrIface = TaskManager::TMInterface::Get(strg); auto& tm = taskMgrIface.Manager; S_ET_SUBMIT = tm.AddStage(tm.S_NEW); S_ET_QUERY = tm.AddStage(S_ET_SUBMIT); m_pEncTools = encTools; } m_destroy = [this]() { if (m_bEncToolsInner) MFXVideoENCODE_DestroyEncTools(m_pEncTools); m_bEncToolsInner = false; }; return MFX_ERR_NONE; }); // Add S_ET_SUBMIT and S_ET_QUERY stages for EncTools Push(BLK_AddTask , [this](StorageRW& global, StorageRW&) -> mfxStatus { MFX_CHECK(S_ET_SUBMIT != mfxU16(-1) && S_ET_QUERY != mfxU16(-1), MFX_ERR_NONE); auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto& tm = taskMgrIface.Manager; auto ETSubmit = [&]( TaskManager::ExtTMInterface::TAsyncStage::TExt , StorageW& global , StorageW& /*s_task*/) -> mfxStatus { std::unique_lock closeGuard(tm.m_closeMtx); if(tm.m_nRecodeTasks) { return MFX_ERR_NONE; } if (StorageW* pTask = tm.GetTask(tm.Stage(S_ET_SUBMIT))) { SubmitPreEncTask(global, *pTask); tm.MoveTaskForward(tm.Stage(S_ET_SUBMIT), tm.FixedTask(*pTask)); } return MFX_ERR_NONE; }; auto ETQuery = [&]( TaskManager::ExtTMInterface::TAsyncStage::TExt , StorageW& global , StorageW& s_task) -> mfxStatus { std::unique_lock closeGuard(tm.m_closeMtx); bool bFlush = !tm.IsInputTask(s_task); if(tm.m_nRecodeTasks) { return MFX_ERR_NONE; } // Delay For LookAhead Depth MFX_CHECK(tm.m_stages.at(tm.Stage(S_ET_QUERY)).size() >= std::max(m_maxDelay,1U) || bFlush,MFX_ERR_NONE); StorageW* pTask = tm.GetTask(tm.Stage(S_ET_QUERY)); MFX_CHECK(pTask, MFX_ERR_NONE); auto sts = QueryPreEncTask(global, *pTask); MFX_CHECK_STS(sts); tm.MoveTaskForward(tm.Stage(S_ET_QUERY), tm.FixedTask(*pTask)); return MFX_ERR_NONE; }; taskMgrIface.AsyncStages[tm.Stage(S_ET_SUBMIT)].Push(ETSubmit); taskMgrIface.AsyncStages[tm.Stage(S_ET_QUERY)].Push(ETQuery); // Extend Num of tasks and size of buffer. taskMgrIface.ResourceExtra += (mfxU16)m_maxDelay; return MFX_ERR_NONE; }); Push(BLK_UpdateTask , [this](StorageRW& global, StorageRW&) -> mfxStatus { MFX_CHECK(m_pEncTools, MFX_ERR_NONE); auto& taskMgrIface = TaskManager::TMInterface::Get(global); auto UpdateTask = [&]( TaskManager::ExtTMInterface::TUpdateTask::TExt , StorageW* dstTask) -> mfxStatus { if (dstTask) { auto& dst_task = Task::Common::Get(*dstTask); if (LpLaStatus.size() > 0) { dst_task.LplaStatus = *(LpLaStatus.begin()); LpLaStatus.pop_front(); } } return MFX_ERR_NONE; }; taskMgrIface.UpdateTask.Push(UpdateTask); return MFX_ERR_NONE; }); } void HevcEncTools::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_GetFrameCtrl , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Submit, MFX_ERR_NONE); auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto& sh = Task::SSH::Get(s_task); auto& sps = Glob::SPS::Get(global); auto& pps = Glob::PPS::Get(global); bool bNegativeQpAllowed = !IsOn(par.mfx.LowPower); mfxI32 minQP = (-6 * sps.bit_depth_luma_minus8) * bNegativeQpAllowed; mfxI32 maxQP = 51; mfxEncToolsBRCQuantControl quantCtrl = {}; mfxEncToolsHintQPMap qpMapHint = {}; mfxEncToolsBRCHRDPos HRDPos = {}; BRCGetCtrl(global, s_task, quantCtrl, HRDPos, qpMapHint); SetDefault(HRDPos.InitialCpbRemovalDelay, task.initial_cpb_removal_delay); SetDefault(HRDPos.InitialCpbRemovalDelayOffset, task.initial_cpb_removal_offset); task.initial_cpb_removal_delay = HRDPos.InitialCpbRemovalDelay; task.initial_cpb_removal_offset = HRDPos.InitialCpbRemovalDelayOffset; task.QpY = mfxI8(mfx::clamp((mfxI32)quantCtrl.QpY + (-6 * sps.bit_depth_luma_minus8) * bNegativeQpAllowed, minQP, maxQP)); sh.slice_qp_delta = mfxI8(task.QpY - (pps.init_qp_minus26 + 26)); sh.temporal_mvp_enabled_flag &= !(par.AsyncDepth > 1 && task.NumRecode); // WA return MFX_ERR_NONE; }); } void HevcEncTools::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Update , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(IsOn(m_EncToolConfig.BRC) && m_pEncTools && m_pEncTools->Query, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxEncToolsBRCStatus brcSts = {}; auto sts = BRCUpdate(global, s_task, brcSts); MFX_CHECK_STS(sts); task.bSkip = false; switch (brcSts.FrameStatus.BRCStatus) { case MFX_BRC_OK: break; case MFX_BRC_PANIC_SMALL_FRAME: task.MinFrameSize = brcSts.FrameStatus.MinFrameSize; task.NumRecode++; sts = BRCUpdate(global, s_task, brcSts); MFX_CHECK_STS(sts); MFX_CHECK(brcSts.FrameStatus.BRCStatus == MFX_BRC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_BRC_PANIC_BIG_FRAME: task.bSkip = true; case MFX_BRC_BIG_FRAME: case MFX_BRC_SMALL_FRAME: task.bRecode = true; break; default: MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } task.bForceSync |= task.bSkip; return MFX_ERR_NONE; }); } void HevcEncTools::FreeTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Discard , [this](StorageW& /*global*/, StorageW& s_task)->mfxStatus { MFX_CHECK(m_pEncTools && m_pEncTools->Discard, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); return m_pEncTools->Discard(m_pEncTools->Context, task.DisplayOrder); }); } void HevcEncTools::Close(const FeatureBlocks& /*blocks*/, TPushCLS Push) { Push(BLK_Close , [this](StorageW& /*global*/) { if (m_pEncTools && m_pEncTools->Close) m_pEncTools->Close(m_pEncTools->Context); }); } #endif //defined(MFX_ENABLE_ENCTOOLS) #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_enctools.h000066400000000000000000000103271443134507600344040ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #if defined(MFX_ENABLE_ENCTOOLS) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "mfxenctools-int.h" #include "mfx_enc_common.h" namespace HEVCEHW { namespace Base { class HevcEncTools : public FeatureBase { public: mfxStatus SubmitPreEncTask(StorageW& global, StorageW& s_task); mfxStatus QueryPreEncTask(StorageW& global, StorageW& s_task); mfxStatus BRCGetCtrl(StorageW& global, StorageW& s_task, mfxEncToolsBRCQuantControl &extQuantCtrl, mfxEncToolsBRCHRDPos &extHRDPos, mfxEncToolsHintQPMap &qpMapHint); mfxStatus BRCUpdate(StorageW& global, StorageW& s_task, mfxEncToolsBRCStatus &sts); #define DECL_BLOCK_LIST\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(Check)\ DECL_BLOCK(Init)\ DECL_BLOCK(ResetCheck)\ DECL_BLOCK(Reset)\ DECL_BLOCK(SetCallChains)\ DECL_BLOCK(AddTask)\ DECL_BLOCK(PreEncSubmit)\ DECL_BLOCK(PreEncQuery)\ DECL_BLOCK(GetFrameCtrl)\ DECL_BLOCK(UpdateTask)\ DECL_BLOCK(Update)\ DECL_BLOCK(Discard)\ DECL_BLOCK(Close)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(QueryIOSurf) #define DECL_FEATURE_NAME "Base_EncTools" #include "hevcehw_decl_blocks.h" HevcEncTools(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void FreeTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; virtual void QueryIOSurf(const FeatureBlocks&, TPushQIS Push) override; mfxEncTools* m_pEncTools = nullptr; mfxEncToolsCtrl m_EncToolCtrl = {}; mfxExtEncToolsConfig m_EncToolConfig = {}; bool m_bEncToolsInner = false; mfxU32 m_maxDelay = 0; mfxU32 m_numPicBuffered = 0; mfxU16 S_ET_SUBMIT = mfxU16(-1); mfxU16 S_ET_QUERY = mfxU16(-1); std::list LpLaStatus; mfx::OnExit m_destroy; }; bool IsEncToolsOptOn(const mfxExtEncToolsConfig &config, bool bGameStreaming); bool IsLPLAEncToolsOn(const mfxExtEncToolsConfig &config, bool bGameStreaming); } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_ENCTOOLS) #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_ext_brc.cpp000066400000000000000000000301411443134507600345330ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_ext_brc.h" #include "mfx_brc_common.h" #ifdef MFX_ENABLE_ENCTOOLS #include "mfxenctools-int.h" #include "hevcehw_base_enctools.h" #endif using namespace HEVCEHW; using namespace HEVCEHW::Base; void ExtBRC::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_BRC].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtBRC*)pSrc; auto& dst = *(mfxExtBRC*)pDst; dst.pthis = src.pthis; dst.Init = src.Init; dst.Reset = src.Reset; dst.Close = src.Close; dst.GetFrameCtrl = src.GetFrameCtrl; dst.Update = src.Update; }); } void ExtBRC::SetInherited(ParamInheritance& par) { par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& src = *(const mfxExtCodingOption2*)pSrc; auto& dst = *(mfxExtCodingOption2*)pDst; InheritOption(src.ExtBRC, dst.ExtBRC); }); par.m_ebInheritDefault[MFX_EXTBUFF_BRC].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& src = *(const mfxExtBRC*)pSrc; auto& dst = *(mfxExtBRC*)pDst; if ( !dst.pthis && !dst.Init && !dst.Reset && !dst.Close && !dst.GetFrameCtrl && !dst.Update) { dst.pthis = src.pthis; dst.Init = src.Init; dst.Reset = src.Reset; dst.Close = src.Close; dst.GetFrameCtrl = src.GetFrameCtrl; dst.Update = src.Update; } }); } void ExtBRC::Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) { Push(BLK_Check, [&blocks](const mfxVideoParam&, mfxVideoParam& par, StorageW&) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtBRC* pBRC = ExtBuffer::Get(par); mfxU32 changed = 0; MFX_CHECK(pCO2, MFX_ERR_NONE); bool bAllowed = par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR; bool bInvalid = IsOn(pCO2->ExtBRC) && pBRC && ( pBRC->pthis || pBRC->Init || pBRC->Close || pBRC->GetFrameCtrl || pBRC->Update || pBRC->Reset) && ( !pBRC->pthis || !pBRC->Init || !pBRC->Close || !pBRC->GetFrameCtrl || !pBRC->Update || !pBRC->Reset); changed += CheckOrZero(pCO2->ExtBRC , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * (bAllowed && !bInvalid))); bool bZeroPtrs = !IsOn(pCO2->ExtBRC) && pBRC && ( pBRC->pthis || pBRC->Init || pBRC->Close || pBRC->GetFrameCtrl || pBRC->Update || pBRC->Reset); if (bZeroPtrs) { pBRC->pthis = nullptr; pBRC->Init = nullptr; pBRC->Close = nullptr; pBRC->GetFrameCtrl = nullptr; pBRC->Update = nullptr; pBRC->Reset = nullptr; ++changed; } bool bInitMode = !FeatureBlocks::BQ::Get(blocks).empty(); MFX_CHECK(!(bInvalid && bInitMode), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void ExtBRC::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW&, StorageRW&) { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2 && pCO2->ExtBRC == MFX_CODINGOPTION_UNKNOWN) pCO2->ExtBRC = MFX_CODINGOPTION_OFF; }); } void ExtBRC::Reset(const FeatureBlocks& /*blocks*/, TPushR Push) { Push(BLK_ResetCheck , []( const mfxVideoParam& /*par*/ , StorageRW& global , StorageRW&) -> mfxStatus { auto& init = Glob::RealState::Get(global); auto& parOld = Glob::VideoParam::Get(init); auto& parNew = Glob::VideoParam::Get(global); const mfxExtCodingOption2(&CO2)[2] = { ExtBuffer::Get(parOld), ExtBuffer::Get(parNew) }; MFX_CHECK(CO2[0].ExtBRC == CO2[1].ExtBRC, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (IsOn(CO2[0].ExtBRC)) { const mfxExtBRC(&BRC)[2] = { ExtBuffer::Get(parOld), ExtBuffer::Get(parNew) }; MFX_CHECK( BRC[0].pthis == BRC[1].pthis && BRC[0].Init == BRC[1].Init && BRC[0].Reset == BRC[1].Reset && BRC[0].Close == BRC[1].Close && BRC[0].GetFrameCtrl == BRC[1].GetFrameCtrl && BRC[0].Update == BRC[1].Update , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } return MFX_ERR_NONE; }); } void ExtBRC::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); if (m_brc.Reset) { if (Glob::ResetHint::Get(global).Flags & RF_IDR_REQUIRED) { mfxExtEncoderResetOption& rOpt = ExtBuffer::Get(par); rOpt.StartNewSequence = MFX_CODINGOPTION_ON; } mfxStatus sts = m_brc.Reset(m_brc.pthis, &par); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; }); } void ExtBRC::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); mfxExtBRC& brc = ExtBuffer::Get(par); bool bInternalBRC = IsOn(CO2.ExtBRC) && !brc.pthis && !m_brc.pthis; bool bExternalBRC = IsOn(CO2.ExtBRC) && brc.pthis && !m_brc.pthis; #ifdef MFX_ENABLE_ENCTOOLS mfxExtEncToolsConfig* pConfig = ExtBuffer::Get(par); bool bEncTools = (pConfig) ? IsEncToolsOptOn(*pConfig, CO3.ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) : false; if (bEncTools) bInternalBRC = bExternalBRC = false; #endif if (bInternalBRC) { auto sts = HEVCExtBRC::Create(m_brc); MFX_CHECK_STS(sts); m_destroy = [this]() { HEVCExtBRC::Destroy(m_brc); }; } SetIf(m_brc, bExternalBRC, brc); if (m_brc.Init) { mfxStatus sts = m_brc.Init(m_brc.pthis, &par); MFX_CHECK_STS(sts); } m_bUseLevel = !(IGNORE_P_PYRAMID_LEVEL && CO3.PRefType == MFX_P_REF_PYRAMID); return MFX_ERR_NONE; }); } mfxBRCFrameParam ExtBRC::MakeFrameParam(const TaskCommonPar& task) { mfxBRCFrameParam fp = {}; fp.DisplayOrder = task.DisplayOrder; fp.EncodedOrder = task.EncodedOrder; fp.FrameType = task.FrameType; fp.PyramidLayer = mfxU16(task.PyramidLevel * m_bUseLevel + task.b2ndField); fp.NumRecode = task.NumRecode; fp.CodedFrameSize = task.BsDataLength; return fp; } void ExtBRC::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_GetFrameCtrl , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(m_brc.GetFrameCtrl, MFX_ERR_NONE); auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto& sh = Task::SSH::Get(s_task); auto& sps = Glob::SPS::Get(global); auto& pps = Glob::PPS::Get(global); bool bNegativeQpAllowed = !IsOn(par.mfx.LowPower); mfxI32 minQP = (-6 * sps.bit_depth_luma_minus8) * bNegativeQpAllowed; mfxI32 maxQP = 51; mfxBRCFrameParam fp = MakeFrameParam(task); mfxBRCFrameCtrl fc = {}; mfxStatus sts = m_brc.GetFrameCtrl(m_brc.pthis, &fp, &fc); MFX_CHECK_STS(sts); SetDefault(fc.InitialCpbRemovalDelay, task.initial_cpb_removal_delay); SetDefault(fc.InitialCpbRemovalOffset, task.initial_cpb_removal_offset); task.initial_cpb_removal_delay = fc.InitialCpbRemovalDelay; task.initial_cpb_removal_offset = fc.InitialCpbRemovalOffset; task.QpY = mfxI8(mfx::clamp(fc.QpY, minQP, maxQP)); sh.slice_qp_delta = mfxI8(task.QpY - (pps.init_qp_minus26 + 26)); sh.temporal_mvp_enabled_flag &= !(par.AsyncDepth > 1 && task.NumRecode); // WA return MFX_ERR_NONE; }); } void ExtBRC::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_Update , [this]( StorageW& /*global*/ , StorageW& s_task) -> mfxStatus { MFX_CHECK(m_brc.Update, MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); mfxBRCFrameParam fp = MakeFrameParam(task); mfxBRCFrameCtrl fc = {}; mfxBRCFrameStatus fs = {}; fc.QpY = task.QpY; mfxStatus sts = m_brc.Update(m_brc.pthis, &fp, &fc, &fs); MFX_CHECK_STS(sts); task.bSkip = false; switch (fs.BRCStatus) { case MFX_BRC_OK: break; case MFX_BRC_PANIC_SMALL_FRAME: task.MinFrameSize = (mfxU32)((fs.MinFrameSize + 7) >> 3); fp.NumRecode++; fp.CodedFrameSize = (mfxU32)((fs.MinFrameSize + 7) >> 3); sts = m_brc.Update(m_brc.pthis, &fp, &fc, &fs); MFX_CHECK_STS(sts); MFX_CHECK(fs.BRCStatus == MFX_BRC_OK, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_BRC_PANIC_BIG_FRAME: task.bSkip = true; case MFX_BRC_BIG_FRAME: case MFX_BRC_SMALL_FRAME: task.bRecode = true; break; default: MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } task.bForceSync |= task.bSkip; return MFX_ERR_NONE; }); } void ExtBRC::Close(const FeatureBlocks& /*blocks*/, TPushCLS Push) { Push(BLK_Close , [this](StorageW& /*global*/) { if (m_brc.Close) m_brc.Close(m_brc.pthis); }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_ext_brc.h000066400000000000000000000055471443134507600342140ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class ExtBRC : public FeatureBase { public: // At current release this is to align with legacy code behavior. There are chances that // in future release it will be disabled regarding on effect of SWBRC static const bool IGNORE_P_PYRAMID_LEVEL = true; #define DECL_BLOCK_LIST\ DECL_BLOCK(Check)\ DECL_BLOCK(Init)\ DECL_BLOCK(ResetCheck)\ DECL_BLOCK(Reset)\ DECL_BLOCK(GetFrameCtrl)\ DECL_BLOCK(Update)\ DECL_BLOCK(Close)\ DECL_BLOCK(SetDefaults) #define DECL_FEATURE_NAME "Base_ExtBRC" #include "hevcehw_decl_blocks.h" ExtBRC(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; mfxBRCFrameParam MakeFrameParam(const TaskCommonPar& task); mfxExtBRC m_brc = {}; mfx::OnExit m_destroy; bool m_bUseLevel = true; }; } //Base } //namespace HEVCEHW #endifhevcehw_base_extddi.cpp000066400000000000000000000151471443134507600343770ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_extddi.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void ExtDDI::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_DDI].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& buf_src = *(const mfxExtCodingOptionDDI*)pSrc; auto& buf_dst = *(mfxExtCodingOptionDDI*)pDst; MFX_COPY_FIELD(LongStartCodes); MFX_COPY_FIELD(NumActiveRefP); MFX_COPY_FIELD(NumActiveRefBL0); MFX_COPY_FIELD(NumActiveRefBL1); MFX_COPY_FIELD(QpAdjust); MFX_COPY_FIELD(TMVP); }); } void ExtDDI::SetInherited(ParamInheritance& par) { par.m_ebInheritDefault[MFX_EXTBUFF_DDI].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& src = *(const mfxExtCodingOptionDDI*)pSrc; auto& dst = *(mfxExtCodingOptionDDI*)pDst; InheritOption(src.LongStartCodes, dst.LongStartCodes); InheritOption(src.NumActiveRefP, dst.NumActiveRefP); InheritOption(src.NumActiveRefBL0, dst.NumActiveRefBL0); InheritOption(src.NumActiveRefBL1, dst.NumActiveRefBL1); InheritOption(src.QpAdjust, dst.QpAdjust); InheritOption(src.TMVP, dst.TMVP); }); } void ExtDDI::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetCallChains, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetSPS.Push([]( Defaults::TGetSPS::TExt prev , const Defaults::Param& defPar , const VPS& vps , Base::SPS& sps) { const mfxExtCodingOptionDDI* pCODDI = ExtBuffer::Get(defPar.mvp); auto sts = prev(defPar, vps, sps); MFX_CHECK(pCODDI && pCODDI->TMVP, sts); sps.temporal_mvp_enabled_flag = !IsOff(pCODDI->TMVP); return sts; }); bSet = true; return MFX_ERR_NONE; }); } void ExtDDI::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [this](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtCodingOptionDDI* pCODDI = ExtBuffer::Get(par); MFX_CHECK(pCODDI, MFX_ERR_NONE); auto& coddi = *pCODDI; bool changed = false; auto& caps = Glob::EncodeCaps::Get(global); changed |= CheckTriStateOrZero(coddi.LongStartCodes); if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) changed |= CheckTriStateOrZero(coddi.QpAdjust); else changed |= CheckOrZero(coddi.QpAdjust); changed |= CheckMaxOrClip(coddi.NumActiveRefP, caps.MaxNum_Reference0); changed |= CheckMaxOrClip(coddi.NumActiveRefBL0, caps.MaxNum_Reference0); changed |= CheckMaxOrClip(coddi.NumActiveRefBL1, caps.MaxNum_Reference1); if (par.mfx.NumRefFrame) { changed |= CheckMaxOrClip(coddi.NumActiveRefP, par.mfx.NumRefFrame); changed |= CheckMaxOrClip(coddi.NumActiveRefBL0, par.mfx.NumRefFrame); changed |= CheckMaxOrClip(coddi.NumActiveRefBL1, par.mfx.NumRefFrame); } return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; }); } void ExtDDI::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtCodingOptionDDI* pCODDI = ExtBuffer::Get(par); if(!pCODDI) return; auto& coddi = *pCODDI; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); SetDefault(coddi.LongStartCodes, MFX_CODINGOPTION_OFF); if (pCO3) { if (coddi.NumActiveRefP) std::fill_n(pCO3->NumRefActiveP, mfx::size(pCO3->NumRefActiveP), coddi.NumActiveRefP); SetDefault(coddi.NumActiveRefP, pCO3->NumRefActiveP[0]); if (coddi.NumActiveRefBL0) std::fill_n(pCO3->NumRefActiveBL0, mfx::size(pCO3->NumRefActiveBL0), coddi.NumActiveRefBL0); SetDefault(coddi.NumActiveRefBL0, pCO3->NumRefActiveBL0[0]); if (coddi.NumActiveRefBL1) std::fill_n(pCO3->NumRefActiveBL1, mfx::size(pCO3->NumRefActiveBL1), coddi.NumActiveRefBL1); SetDefault(coddi.NumActiveRefBL1, pCO3->NumRefActiveBL1[0]); } SetDefault(coddi.QpAdjust, (mfxU16)MFX_CODINGOPTION_OFF); }); } void ExtDDI::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& /*strg*/, StorageRW&) -> mfxStatus { m_bPatchNextDDITask = true; return MFX_ERR_NONE; }); } void ExtDDI::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_ConfigureTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { const mfxExtCodingOptionDDI& coddi = ExtBuffer::Get(Glob::VideoParam::Get(global)); auto& task = Task::Common::Get(s_task); task.bForceLongStartCode = IsOn(coddi.LongStartCodes); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_extddi.h000066400000000000000000000051261443134507600340400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class ExtDDI : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(ConfigureTask)\ DECL_BLOCK(Init)\ DECL_BLOCK(PatchDDITask)\ DECL_BLOCK(SetCallChains) #define DECL_FEATURE_NAME "Base_ExtDDI" #include "hevcehw_decl_blocks.h" ExtDDI(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override {}; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; bool m_bPatchNextDDITask = false; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_hdr_sei.cpp000066400000000000000000000204221443134507600345230ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_hdr_sei.h" #include "hevcehw_base_packer.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void HdrSei::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtContentLightLevelInfo*)pSrc; auto& dst = *(mfxExtContentLightLevelInfo*)pDst; dst.InsertPayloadToggle = src.InsertPayloadToggle; dst.MaxContentLightLevel = src.MaxContentLightLevel; dst.MaxPicAverageLightLevel = src.MaxPicAverageLightLevel; }); blocks.m_ebCopySupported[MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtMasteringDisplayColourVolume*)pSrc; auto& dst = *(mfxExtMasteringDisplayColourVolume*)pDst; dst.InsertPayloadToggle = src.InsertPayloadToggle; std::copy_n(src.DisplayPrimariesX, mfx::size(src.DisplayPrimariesX), dst.DisplayPrimariesX); std::copy_n(src.DisplayPrimariesY, mfx::size(src.DisplayPrimariesY), dst.DisplayPrimariesY); dst.WhitePointX = src.WhitePointX; dst.WhitePointY = src.WhitePointY; dst.MaxDisplayMasteringLuminance = src.MaxDisplayMasteringLuminance; dst.MinDisplayMasteringLuminance = src.MinDisplayMasteringLuminance; }); } void PackSEIPayload( BitstreamWriter& bs , const mfxExtMasteringDisplayColourVolume & DisplayColour) { mfxU32 size = mfx::CeilDiv(bs.GetOffset(), 8u); mfxU8* pl = bs.GetStart() + size; // payload start bs.PutBits(8, 137); //payload type bs.PutBits(8, 0xff); //place for payload size size += 2; for (int i = 0; i < 3; i++) { bs.PutBits(16, DisplayColour.DisplayPrimariesX[i]); bs.PutBits(16, DisplayColour.DisplayPrimariesY[i]); } bs.PutBits(16, DisplayColour.WhitePointX); bs.PutBits(16, DisplayColour.WhitePointY); bs.PutBits(32, DisplayColour.MaxDisplayMasteringLuminance); bs.PutBits(32, DisplayColour.MinDisplayMasteringLuminance); size = mfx::CeilDiv(bs.GetOffset(), 8u) - size; assert(size < 256); pl[1] = (mfxU8)size; //payload size } void PackSEIPayload( BitstreamWriter& bs , const mfxExtContentLightLevelInfo & LightLevel) { mfxU32 size = mfx::CeilDiv(bs.GetOffset(), 8u); mfxU8* pl = bs.GetStart() + size; // payload start bs.PutBits(8, 144); //payload type bs.PutBits(8, 0xff); //place for payload size size += 2; bs.PutBits(16, LightLevel.MaxContentLightLevel); bs.PutBits(16, LightLevel.MaxPicAverageLightLevel); size = mfx::CeilDiv(bs.GetOffset(), 8u) - size; assert(size < 256); pl[1] = (mfxU8)size; //payload size } void HdrSei::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFixMDCV , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(par); MFX_CHECK(pMDCV, MFX_ERR_NONE); mfxU32 changed = 0; changed += CheckOrZero(pMDCV->InsertPayloadToggle); changed += CheckMaxOrClip(pMDCV->WhitePointX, 50000u); changed += CheckMaxOrClip(pMDCV->WhitePointY, 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[0], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[1], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesX[2], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[0], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[1], 50000u); changed += CheckMaxOrClip(pMDCV->DisplayPrimariesY[2], 50000u); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; }); Push(BLK_CheckAndFixCLLI , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& /*global*/) -> mfxStatus { mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(par); MFX_CHECK(pCLLI, MFX_ERR_NONE); mfxU32 changed = 0; changed += CheckOrZero(pCLLI->InsertPayloadToggle); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; }); } void HdrSei::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaultsMDCV , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(par); MFX_CHECK(pMDCV, MFX_ERR_NONE); SetDefault(pMDCV->InsertPayloadToggle, MFX_PAYLOAD_OFF); return MFX_ERR_NONE; }); Push(BLK_SetDefaultsCLLI , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(par); MFX_CHECK(pCLLI, MFX_ERR_NONE); SetDefault(pCLLI->InsertPayloadToggle, MFX_PAYLOAD_OFF); return MFX_ERR_NONE; }); } void HdrSei::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_InsertPayloads , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); const mfxExtMasteringDisplayColourVolume* pMDCV = ExtBuffer::Get(task.ctrl); const mfxExtContentLightLevelInfo* pCLLI = ExtBuffer::Get(task.ctrl); bool bInsertMDCV = !!pMDCV; bool bInsertCLLI = !!pCLLI; SetDefault(pMDCV, (const mfxExtMasteringDisplayColourVolume*)ExtBuffer::Get(par)); SetDefault(pCLLI, (const mfxExtContentLightLevelInfo*)ExtBuffer::Get(par)); bInsertMDCV |= (pMDCV->InsertPayloadToggle == MFX_PAYLOAD_IDR) && (task.FrameType & MFX_FRAMETYPE_IDR); bInsertCLLI |= (pCLLI->InsertPayloadToggle == MFX_PAYLOAD_IDR) && (task.FrameType & MFX_FRAMETYPE_IDR); MFX_CHECK(bInsertMDCV || bInsertCLLI, MFX_ERR_NONE); BitstreamWriter bs(m_buf.data(), (mfxU32)m_buf.size(), 0); if (bInsertMDCV) { mfxPayload pl = {}; pl.Type = 137; pl.NumBit = bs.GetOffset(); pl.BufSize = (mfxU16)mfx::CeilDiv(pl.NumBit, 8u); pl.Data = bs.GetStart() + pl.BufSize; PackSEIPayload(bs, *pMDCV); pl.NumBit = bs.GetOffset() - pl.NumBit; pl.BufSize = (mfxU16)mfx::CeilDiv(pl.NumBit, 8u); task.PLInternal.push_back(pl); task.InsertHeaders |= INSERT_DCVSEI; } if (bInsertCLLI) { mfxPayload pl = {}; pl.Type = 144; pl.NumBit = bs.GetOffset(); pl.BufSize = (mfxU16)mfx::CeilDiv(pl.NumBit, 8u); pl.Data = bs.GetStart() + pl.BufSize; PackSEIPayload(bs, *pCLLI); pl.NumBit = bs.GetOffset() - pl.NumBit; pl.BufSize = (mfxU16)mfx::CeilDiv(pl.NumBit, 8u); task.PLInternal.push_back(pl); task.InsertHeaders |= INSERT_LLISEI; } return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_hdr_sei.h000066400000000000000000000043271443134507600341760ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class HdrSei : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFixMDCV)\ DECL_BLOCK(CheckAndFixCLLI)\ DECL_BLOCK(SetDefaultsMDCV)\ DECL_BLOCK(SetDefaultsCLLI)\ DECL_BLOCK(InsertPayloads) #define DECL_FEATURE_NAME "Base_HdrSei" #include "hevcehw_decl_blocks.h" HdrSei(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; std::array m_buf; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_hrd.cpp000066400000000000000000000167131443134507600336730ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_hrd.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void HRD::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW&) -> mfxStatus { Init( Glob::SPS::Get(strg) , InitialDelayInKB(Glob::VideoParam::Get(strg).mfx) ); m_prevBpEncOrderAsync = 0; return MFX_ERR_NONE; }); } void HRD::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this](StorageRW& strg, StorageRW&) -> mfxStatus { Reset(Glob::SPS::Get(strg)); return MFX_ERR_NONE; }); } void HRD::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SubmitTask , [this](StorageW&, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); if (task.NumRecode == 0) task.cpb_removal_delay = !!task.EncodedOrder * (task.EncodedOrder - m_prevBpEncOrderAsync); bool bBPSEI = (task.InsertHeaders & INSERT_BPSEI); bool bSetBPPar = bBPSEI && !task.initial_cpb_removal_delay && !task.initial_cpb_removal_offset; if (bSetBPPar) { task.initial_cpb_removal_delay = GetInitCpbRemovalDelay(task.EncodedOrder); task.initial_cpb_removal_offset = GetInitCpbRemovalDelayOffset(); } SetIf(m_prevBpEncOrderAsync, bBPSEI, task.EncodedOrder); return MFX_ERR_NONE; }); } void HRD::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [this](StorageW&, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); Update(task.BsDataLength * 8, task.EncodedOrder, !!(task.InsertHeaders & INSERT_BPSEI)); return MFX_ERR_NONE; }); } void HRD::Init(const SPS &sps, mfxU32 InitialDelayInKB) { VUI const & vui = sps.vui; HRDInfo const & hrd = sps.vui.hrd; HRDInfo::SubLayer::CPB const & cpb0 = hrd.sl[0].cpb[0]; m_bIsHrdRequired = !( !sps.vui_parameters_present_flag || !sps.vui.hrd_parameters_present_flag || !(hrd.nal_hrd_parameters_present_flag || hrd.vcl_hrd_parameters_present_flag)); if (!m_bIsHrdRequired) return; mfxU32 cpbSize = (cpb0.cpb_size_value_minus1 + 1) << (4 + hrd.cpb_size_scale); m_cbrFlag = !!cpb0.cbr_flag; m_bitrate = (cpb0.bit_rate_value_minus1 + 1) << (6 + hrd.bit_rate_scale); m_maxCpbRemovalDelay = 1 << (hrd.au_cpb_removal_delay_length_minus1 + 1); m_cpbSize90k = mfxU32(90000. * cpbSize / m_bitrate); m_initCpbRemovalDelay = mfxU32(90000. * 8000. * InitialDelayInKB / m_bitrate); m_clockTick = (mfxF64)vui.num_units_in_tick * 90000 / vui.time_scale; m_prevAuCpbRemovalDelayMinus1 = -1; m_prevAuCpbRemovalDelayMsb = 0; m_prevAuFinalArrivalTime = 0; m_prevBpAuNominalRemovalTime = m_initCpbRemovalDelay; m_prevBpEncOrder = 0; } void HRD::Reset(SPS const & sps) { HRDInfo const & hrd = sps.vui.hrd; HRDInfo::SubLayer::CPB const & cpb0 = hrd.sl[0].cpb[0]; if (m_bIsHrdRequired == false) return; mfxU32 cpbSize = (cpb0.cpb_size_value_minus1 + 1) << (4 + hrd.cpb_size_scale); m_bitrate = (cpb0.bit_rate_value_minus1 + 1) << (6 + hrd.bit_rate_scale); m_cpbSize90k = mfxU32(90000. * cpbSize / m_bitrate); } void HRD::Update(mfxU32 sizeInbits, mfxU32 encOrder, bool bufferingPeriodPic) { mfxF64 auNominalRemovalTime; if (m_bIsHrdRequired == false) return; // (C-9) auNominalRemovalTime = m_initCpbRemovalDelay; if (encOrder > 0) { mfxU32 auCpbRemovalDelayMinus1 = (encOrder - m_prevBpEncOrder) - 1; bool bSetDelayMsb = !bufferingPeriodPic && auCpbRemovalDelayMinus1; // (D-1) mfxU32 auCpbRemovalDelayMsb = bSetDelayMsb * (m_prevAuCpbRemovalDelayMsb + m_maxCpbRemovalDelay * (mfxI32(auCpbRemovalDelayMinus1) <= m_prevAuCpbRemovalDelayMinus1)); m_prevAuCpbRemovalDelayMsb = auCpbRemovalDelayMsb; m_prevAuCpbRemovalDelayMinus1 = auCpbRemovalDelayMinus1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_clockTick * (auCpbRemovalDelayValMinus1 + 1); } // (C-3) mfxF64 initArrivalTime = m_prevAuFinalArrivalTime; if (!m_cbrFlag) { mfxF64 initArrivalEarliestTime = auNominalRemovalTime; // (C-7) initArrivalEarliestTime -= !!bufferingPeriodPic * m_initCpbRemovalDelay; // (C-6) initArrivalEarliestTime -= !bufferingPeriodPic * m_cpbSize90k; // (C-4) initArrivalTime = std::max(m_prevAuFinalArrivalTime, initArrivalEarliestTime * m_bitrate); } // (C-8) mfxF64 auFinalArrivalTime = initArrivalTime + (mfxF64)sizeInbits * 90000; m_prevAuFinalArrivalTime = auFinalArrivalTime; if (bufferingPeriodPic) { m_prevBpAuNominalRemovalTime = auNominalRemovalTime; m_prevBpEncOrder = encOrder; } /*fprintf (stderr, "FO: %d\ninitArrivalTime = %f\nauFinalArrivalTime = %f\nauNominalRemovalTime = %f\n", encOrder, initArrivalTime / 90000 / m_bitrate, auFinalArrivalTime / 90000 / m_bitrate, auNominalRemovalTime / 90000); fflush(stderr);*/ } mfxU32 HRD::GetInitCpbRemovalDelay(mfxU32 encOrder) { mfxF64 auNominalRemovalTime; if (m_bIsHrdRequired == false) return 0; if (encOrder > 0) { // (D-1) mfxU32 auCpbRemovalDelayMsb = 0; mfxU32 auCpbRemovalDelayMinus1 = encOrder - m_prevBpEncOrder - 1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_clockTick * (auCpbRemovalDelayValMinus1 + 1); // (C-17) mfxF64 deltaTime90k = auNominalRemovalTime - m_prevAuFinalArrivalTime / m_bitrate; m_initCpbRemovalDelay = m_cbrFlag // (C-19) ? (mfxU32)(deltaTime90k) // (C-18) : (mfxU32)std::min(deltaTime90k, m_cpbSize90k); } return (mfxU32)m_initCpbRemovalDelay; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base/hevcehw_base_hrd.h000066400000000000000000000062701443134507600334140ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class HRD : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) #define DECL_FEATURE_NAME "Base_HRD" #include "hevcehw_decl_blocks.h" HRD(mfxU32 id) : FeatureBase(id) , m_bIsHrdRequired(false) , m_cbrFlag(false) , m_bitrate(0) , m_maxCpbRemovalDelay(0) , m_clockTick(0) , m_cpbSize90k(0) , m_initCpbRemovalDelay(0) , m_prevAuCpbRemovalDelayMinus1(0) , m_prevAuCpbRemovalDelayMsb(0) , m_prevAuFinalArrivalTime(0) , m_prevBpAuNominalRemovalTime(0) , m_prevBpEncOrder(0) , m_prevBpEncOrderAsync(0) {} protected: bool m_bIsHrdRequired; bool m_cbrFlag; mfxU32 m_bitrate; mfxU32 m_maxCpbRemovalDelay; mfxF64 m_clockTick; mfxF64 m_cpbSize90k; mfxF64 m_initCpbRemovalDelay; mfxI32 m_prevAuCpbRemovalDelayMinus1; mfxU32 m_prevAuCpbRemovalDelayMsb; mfxF64 m_prevAuFinalArrivalTime; mfxF64 m_prevBpAuNominalRemovalTime; mfxU32 m_prevBpEncOrder; mfxU32 m_prevBpEncOrderAsync; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; using FeatureBase::Init; void Init(const SPS &sps, mfxU32 InitialDelayInKB); using FeatureBase::Reset; void Reset(SPS const & sps); void Update(mfxU32 sizeInbits, mfxU32 encOrder, bool bufferingPeriodPic); mfxU32 GetInitCpbRemovalDelay(mfxU32 encOrder); mfxU32 GetInitCpbRemovalDelayOffset() const { return mfxU32(m_cpbSize90k - m_initCpbRemovalDelay); } }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_iddi.h000066400000000000000000000044231443134507600334670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" namespace HEVCEHW { namespace Base { class IDDI : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetCallChains) \ DECL_BLOCK(QueryCaps) \ DECL_BLOCK(CreateDevice) \ DECL_BLOCK(CreateService) \ DECL_BLOCK(Register) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(SetDDIID) \ DECL_BLOCK(QueryTask) #define DECL_FEATURE_NAME "Base_IDDI" #include "hevcehw_decl_blocks.h" IDDI(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override = 0; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override = 0; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override = 0; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override = 0; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override = 0; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override = 0; }; } //Base } //namespace HEVCEHW #endif hevcehw_base_iddi_packer.h000066400000000000000000000045301443134507600350130ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class IDDIPacker : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) \ DECL_BLOCK(SetCallChains) \ DECL_BLOCK(HardcodeCaps)\ DECL_BLOCK(CreateService) #define DECL_FEATURE_NAME "Base_IDDIPacker" #include "hevcehw_decl_blocks.h" IDDIPacker(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override = 0; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override = 0; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override = 0; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override = 0; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override = 0; void HardcodeCapsCommon(EncodeCapsHevc& caps, const mfxVideoParam& par) { caps.SliceIPOnly = IsOn(par.mfx.LowPower); caps.msdk.PSliceSupport = false; } }; } //Base } //namespace HEVCEHW #endif hevcehw_base_impl.cpp000066400000000000000000000250611443134507600340530ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_impl.h" #include "hevcehw_base_data.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_parser.h" #include "hevcehw_base_packer.h" #include "hevcehw_base_hrd.h" #include "hevcehw_base_alloc.h" #include "hevcehw_base_task.h" #include "hevcehw_base_ext_brc.h" #include "hevcehw_base_dirty_rect.h" #include "hevcehw_base_hdr_sei.h" #include "hevcehw_base_iddi.h" #include "hevcehw_base_iddi_packer.h" #include "hevcehw_base_roi.h" #include "hevcehw_base_interlace.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base_weighted_prediction.h" #endif #if defined(MFX_ENABLE_ENCTOOLS) #include "hevcehw_base_enctools.h" #endif #include using namespace HEVCEHW; using namespace HEVCEHW::Base; MFXVideoENCODEH265_HW::MFXVideoENCODEH265_HW(VideoCORE& core) : m_core(core) { } void MFXVideoENCODEH265_HW::InternalInitFeatures( mfxStatus& status , eFeatureMode mode) { status = MFX_ERR_UNKNOWN; for (auto& pFeature : m_features) pFeature->Init(mode, *this); if (mode & (QUERY1 | QUERY_IO_SURF | INIT | QUERY_IMPLS_DESCRIPTION)) { Reorder( BQ::Get(*this) , { FEATURE_LEGACY, Legacy::BLK_SetLowPowerDefault } , { FEATURE_DDI, IDDI::BLK_SetDDIID } , PLACE_AFTER); } if (mode & INIT) { Reorder( BQ::Get(*this) , { FEATURE_DDI, IDDI::BLK_CreateDevice } , { FEATURE_LEGACY, Legacy::BLK_SetVideoParam }); auto& qII = BQ::Get(*this); Reorder(qII , { FEATURE_LEGACY, Legacy::BLK_SetReorder } , { FEATURE_INTERLACE, Interlace::BLK_SetReorder } , PLACE_AFTER); Reorder(qII , { FEATURE_LEGACY, Legacy::BLK_SetRawInfo } , { FEATURE_INTERLACE, Interlace::BLK_PatchRawInfo } , PLACE_AFTER); auto& qIA = BQ::Get(*this); qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_DDI_PACKER, IDDIPacker::BLK_Init })); qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_DDI, IDDI::BLK_Register })); } status = MFX_ERR_NONE; } mfxStatus MFXVideoENCODEH265_HW::InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) { if (!in) { return RunBlocks(IgnoreSts, BQ::Get(*this), out); } mfxStatus sts = MFX_ERR_NONE , wrn = MFX_ERR_NONE; StorageRW& strg = m_storage; strg.Insert(Glob::VideoCore::Key, new StorableRef(core)); sts = RunBlocks(CheckGE, BQ::Get(*this), *in, out, strg); MFX_CHECK(sts >= MFX_ERR_NONE, sts); wrn = sts; sts = RunBlocks(CheckGE, BQ::Get(*this), *in, out, strg); if (sts == MFX_ERR_INVALID_VIDEO_PARAM) sts = MFX_ERR_UNSUPPORTED; return GetWorstSts(wrn, sts); } mfxStatus MFXVideoENCODEH265_HW::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { auto& queue = BQ::Get(*this); MFX_CHECK(!queue.empty(), MFX_ERR_UNSUPPORTED); return RunBlocks(Check, queue, core, caps, ah, m_storage); } mfxStatus MFXVideoENCODEH265_HW::InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) { StorageRW& strg = m_storage; strg.Insert(Glob::VideoCore::Key, new StorableRef(core)); return RunBlocks(CheckGE, BQ::Get(*this), par, request, strg); } mfxStatus MFXVideoENCODEH265_HW::Init(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_storage.Empty(), MFX_ERR_UNDEFINED_BEHAVIOR); mfxStatus sts = MFX_ERR_NONE, wrn = MFX_ERR_NONE; StorageRW local, global; global.Insert(Glob::VideoCore::Key, new StorableRef(m_core)); global.Insert(Glob::RTErr::Key, new StorableRef(m_runtimeErr)); wrn = RunBlocks(CheckGE, BQ::Get(*this), *par, global, local); MFX_CHECK(wrn >= MFX_ERR_NONE, wrn); sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); wrn = GetWorstSts(sts, wrn); sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); wrn = GetWorstSts(sts, wrn); m_storage = std::move(global); m_runtimeErr = MFX_ERR_NONE; for (auto& pFeature : m_features) pFeature->Init(RUNTIME, *this); { auto& queue = BQ::Get(*this); auto it = Find(queue, { FEATURE_DDI, IDDI::BLK_Reset }); if (it != queue.end()) queue.splice(queue.end(), queue, it); } { auto& queue = BQ::Get(*this); queue.splice(queue.end(), queue, Get(queue, { FEATURE_DDI_PACKER, IDDIPacker::BLK_SubmitTask })); queue.splice(queue.end(), queue, Get(queue, { FEATURE_DDI, IDDI::BLK_SubmitTask })); Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_HDR_SEI, HdrSei::BLK_InsertPayloads }); Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_INTERLACE, Interlace::BLK_InsertPTSEI }); Reorder(queue, { FEATURE_DDI, IDDI::BLK_SubmitTask }, { FEATURE_INTERLACE, Interlace::BLK_PatchDDITask }); #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) Reorder(queue, { FEATURE_DDI, IDDI::BLK_SubmitTask }, { FEATURE_WEIGHTPRED, WeightPred::BLK_PatchDDITask }); #endif //update slice qp before packing Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_EXT_BRC, ExtBRC::BLK_GetFrameCtrl }); #ifdef MFX_ENABLE_ENCTOOLS Reorder(queue, { FEATURE_PACKER, Packer::BLK_SubmitTask }, { FEATURE_ENCTOOLS, HevcEncTools::BLK_GetFrameCtrl }); #endif Reorder(queue, { FEATURE_LEGACY, Legacy::BLK_SkipFrame }, { FEATURE_INTERLACE, Interlace::BLK_SkipFrame }); } { auto& queue = BQ::Get(*this); Reorder(queue , { FEATURE_LEGACY, Legacy::BLK_DoPadding } , { FEATURE_PACKER, Packer::BLK_InsertSuffixSEI }); Reorder(queue , { FEATURE_DDI_PACKER, IDDIPacker::BLK_QueryTask } , { FEATURE_EXT_BRC, ExtBRC::BLK_Update } , PLACE_AFTER); #ifdef MFX_ENABLE_ENCTOOLS Reorder(queue , { FEATURE_DDI_PACKER, IDDIPacker::BLK_QueryTask } , { FEATURE_ENCTOOLS, HevcEncTools::BLK_Update } , PLACE_AFTER); #endif Reorder(queue , { FEATURE_EXT_BRC, ExtBRC::BLK_Update } , { FEATURE_INTERLACE, Interlace::BLK_QueryTask } , PLACE_AFTER); } return wrn; } mfxStatus MFXVideoENCODEH265_HW::EncodeFrameCheck( mfxEncodeCtrl *ctrl , mfxFrameSurface1 *surface , mfxBitstream *bs , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/ , MFX_ENTRY_POINT *pEntryPoint) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR2(bs, pEntryPoint); MFX_CHECK_STS(m_runtimeErr); mfxStatus sts = MFX_ERR_NONE; StorageRW local; auto BreakAtSts = [](mfxStatus x) { return (x < MFX_ERR_NONE && x != MFX_ERR_MORE_DATA_SUBMIT_TASK) || x == MFX_WRN_DEVICE_BUSY; }; sts = RunBlocks(BreakAtSts, BQ::Get(*this), ctrl, surface, *bs, m_storage, local); MFX_CHECK(!BreakAtSts(sts), sts); pEntryPoint->pState = this; pEntryPoint->pRoutine = Execute; pEntryPoint->pCompleteProc = FreeResources; pEntryPoint->requiredNumThreads = 1; pEntryPoint->pParam = &Tmp::CurrTask::Get(local); return sts; } mfxStatus MFXVideoENCODEH265_HW::Execute(mfxThreadTask ptask, mfxU32 /*uid_p*/, mfxU32 /*uid_a*/) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(ptask); MFX_CHECK_STS(m_runtimeErr); auto& task = *(StorageRW*)ptask; return RunBlocks(Check, BQ::Get(*this), m_storage, task); } mfxStatus MFXVideoENCODEH265_HW::FreeResources(mfxThreadTask /*task*/, mfxStatus /*sts*/) { return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEH265_HW::Close(void) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); auto sts = RunBlocks(IgnoreSts, BQ::Get(*this), m_storage); m_storage.Clear(); return sts; } mfxStatus MFXVideoENCODEH265_HW::Reset(mfxVideoParam* par) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); mfxStatus sts = MFX_ERR_NONE, wrn = MFX_ERR_NONE; StorageRW global, local; global.Insert(Glob::VideoCore::Key, new StorableRef(m_core)); global.Insert(Glob::RealState::Key, new StorableRef(m_storage)); wrn = RunBlocks(CheckGE, BQ::Get(*this), *par, global, local); MFX_CHECK(wrn >= MFX_ERR_NONE, wrn); sts = RunBlocks(CheckGE, BQ::Get(*this), global, local); return GetWorstSts(wrn, sts); } mfxStatus MFXVideoENCODEH265_HW::GetVideoParam(mfxVideoParam* par) { MFX_CHECK(!m_storage.Empty(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(par); return RunBlocks(IgnoreSts, BQ::Get(*this), *par, m_storage); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_impl.h000066400000000000000000000130331443134507600335140ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "mfx_task.h" #include "hevcehw_base.h" namespace HEVCEHW { namespace Base { class MFXVideoENCODEH265_HW : public ImplBase , virtual protected FeatureBlocks { public: MFXVideoENCODEH265_HW(VideoCORE& core); virtual ~MFXVideoENCODEH265_HW() { Close(); } void InternalInitFeatures( mfxStatus& status , eFeatureMode mode); virtual mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus GetFrameParam(mfxFrameParam * /*par*/) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetEncodeStat(mfxEncodeStat* /*stat*/) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * /*ctrl*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/ , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/ , MFX_ENTRY_POINT * /*pEntryPoint*/) override; virtual mfxStatus EncodeFrame( mfxEncodeCtrl * /*ctrl*/ , mfxEncodeInternalParams * /*pInternalParams*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * /*ctrl*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/ , mfxFrameSurface1 ** /*reordered_surface*/ , mfxEncodeInternalParams * /*pInternalParams*/) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus CancelFrame( mfxEncodeCtrl * /*ctrl*/ , mfxEncodeInternalParams * /*pInternalParams*/ , mfxFrameSurface1 * /*surface*/ , mfxBitstream * /*bs*/) override { return MFX_ERR_UNSUPPORTED; } virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override { return MFX_TASK_THREADING_INTRA; } virtual mfxStatus InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) override; virtual mfxStatus InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) override; virtual mfxStatus QueryImplsDescription( VideoCORE& , mfxEncoderDescription::encoder& , mfx::PODArraysHolder&) override; protected: using TFeatureList = std::list>; VideoCORE& m_core; TFeatureList m_features; StorageRW m_storage; mfxStatus m_runtimeErr = MFX_ERR_NONE; mfxStatus Execute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); mfxStatus FreeResources(mfxThreadTask task, mfxStatus sts); static mfxStatus Execute(void *pState, void *task, mfxU32 uid_p, mfxU32 uid_a) { if (pState) return ((MFXVideoENCODEH265_HW*)pState)->Execute(task, uid_p, uid_a); else return MFX_ERR_UNDEFINED_BEHAVIOR; } static mfxStatus FreeResources(void *pState, void *task, mfxStatus sts) { if (pState) return ((MFXVideoENCODEH265_HW*)pState)->FreeResources(task, sts); else return MFX_ERR_UNDEFINED_BEHAVIOR; } template T* FindFeature(mfxU32 id) { using TRFeature = decltype(m_features.front()); auto it = std::find_if(m_features.begin(), m_features.end() , [id](TRFeature pFeature) { return pFeature->GetID() == id; }); if (it == m_features.end()) { return nullptr; } return dynamic_cast(it->get()); } template T& GetFeature(mfxU32 id) { T* pFeature = FindFeature(id); ThrowAssert(!pFeature, "Feature not found"); return *pFeature; } }; } //Base }// namespace HEVCEHW #endif hevcehw_base_interlace.cpp000066400000000000000000000521641443134507600350640ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_interlace.h" #include "hevcehw_base_packer.h" #include "hevcehw_base_legacy.h" #include #include #include using namespace HEVCEHW; using namespace HEVCEHW::Base; void Interlace::Query1NoCaps(const FeatureBlocks& , TPushQ1 Push) { Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetMinRefForBPyramid.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { bool bField = IsField(par.mvp.mfx.FrameInfo.PicStruct); return mfxU16(prev(par) * (1 + bField) + bField); }); defaults.GetMinRefForBNoPyramid.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { bool bField = IsField(par.mvp.mfx.FrameInfo.PicStruct); return mfxU16(prev(par) * (1 + bField)); }); defaults.GetNumReorderFrames.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { bool bField = IsField(par.mvp.mfx.FrameInfo.PicStruct); return mfxU8(prev(par) * (1 + bField)); }); defaults.GetNonStdReordering.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { return (IsField(par.mvp.mfx.FrameInfo.PicStruct) && par.mvp.mfx.EncodedOrder && par.mvp.mfx.NumRefFrame && par.mvp.mfx.GopRefDist > 1 && par.base.GetMinRefForBNoPyramid(par) > par.mvp.mfx.NumRefFrame) || prev(par); }); defaults.GetNumRefPPyramid.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { mfxU16 k = 1 + IsField(par.mvp.mfx.FrameInfo.PicStruct); return mfxU16(prev(par) * k); }); defaults.GetNumRefNoPyramid.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { return mfxU16(prev(par) * (1 + IsField(par.mvp.mfx.FrameInfo.PicStruct))); }); defaults.GetFrameType.Push( [](Defaults::TGetFrameType::TExt prev , const Defaults::Param& par , mfxU32 fo , mfxGopHints GopHints , mfxLastKeyFrameInfo LastKeyFrameInfo) { bool bField = IsField(par.mvp.mfx.FrameInfo.PicStruct); mfxU32 dFO = bField * (LastKeyFrameInfo.lastIDROrder % 2); mfxU32 nPicInFrame = bField + 1; mfxLastKeyFrameInfo mLastKeyFrameInfo = { 0, (LastKeyFrameInfo.lastIPOrder + dFO - LastKeyFrameInfo.lastIDROrder) / nPicInFrame, 0 }; auto ft = prev(par, (fo + dFO - LastKeyFrameInfo.lastIDROrder) / nPicInFrame, GopHints, mLastKeyFrameInfo); bool b2ndField = bField && ((fo + dFO - LastKeyFrameInfo.lastIDROrder) % 2); bool bForceP = b2ndField && IsI(ft); ft &= ~((MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR) * bForceP); ft |= MFX_FRAMETYPE_P * bForceP; bool bForceRef = bField && !b2ndField && !IsB(ft); ft |= MFX_FRAMETYPE_REF * bForceRef; return ft; }); defaults.GetPicTimingSEI.Push( [](Defaults::TChain::TExt prev , const Defaults::Param& par) { return Bool2CO(IsField(par.mvp.mfx.FrameInfo.PicStruct) || IsOn(prev(par))); }); defaults.GetPLayer.Push( [](Defaults::TGetPLayer::TExt prev , const Defaults::Param& par , mfxU32 fo , mfxGopHints GopHints) { return prev(par, fo / (1 + IsField(par.mvp.mfx.FrameInfo.PicStruct)), GopHints); }); defaults.GetTId.Push( [](Defaults::TGetTId::TExt prev , const Defaults::Param& par , mfxU32 fo , mfxGopHints GopHints) { return prev(par, fo / (1 + IsField(par.mvp.mfx.FrameInfo.PicStruct)), GopHints); }); defaults.GetRefPicList.Push( []( Defaults::TGetRPL::TExt prev , const Defaults::Param& par , const DpbArray &DPB , mfxU16 maxL0 , mfxU16 maxL1 , const FrameBaseInfo& cur , mfxU8(&RefPicList)[2][MAX_DPB_SIZE]) -> std::tuple { if (!IsField(par.mvp.mfx.FrameInfo.PicStruct)) return prev(par, DPB, maxL0, maxL1, cur, RefPicList); auto nRefLX = prev(par, DPB, MAX_DPB_SIZE, MAX_DPB_SIZE, cur, RefPicList); auto& l0 = std::get<0>(nRefLX); auto& l1 = std::get<1>(nRefLX); bool bValid = l0 <= maxL0 && l1 <= maxL1; if (!bValid) { std::list L0(RefPicList[0], RefPicList[0] + l0); std::list L1(RefPicList[1], RefPicList[1] + l1); auto CmpRef = [&](mfxU8 a, mfxU8 b) { auto FN = [](const FrameBaseInfo& x) { return (x.POC + !x.b2ndField) / 2; }; auto aDist = abs(FN(DPB[a]) - FN(cur)) * 2 + (DPB[a].bBottomField != cur.bBottomField); auto bDist = abs(FN(DPB[b]) - FN(cur)) * 2 + (DPB[b].bBottomField != cur.bBottomField); return aDist <= bDist; }; auto IsNotInL0 = [&](mfxU8 x) { return std::find(L0.begin(), L0.end(), x) == L0.end(); }; auto IsNotInL1 = [&](mfxU8 x) { return std::find(L1.begin(), L1.end(), x) == L1.end(); }; L0.sort(CmpRef); L1.sort(CmpRef); L0.resize(std::min(maxL0, l0)); L1.resize(std::min(maxL1, l1)); std::ignore = std::remove_if(RefPicList[0], RefPicList[0] + l0, IsNotInL0); std::ignore = std::remove_if(RefPicList[1], RefPicList[1] + l1, IsNotInL1); l0 = mfxU8(L0.size()); l1 = mfxU8(L1.size()); std::fill(std::next(RefPicList[0], l0), std::end(RefPicList[0]), IDX_INVALID); std::fill(std::next(RefPicList[1], l1), std::end(RefPicList[1]), IDX_INVALID); } return nRefLX; }); defaults.GetPreReorderInfo.Push([]( Defaults::TGetPreReorderInfo::TExt prev , const Defaults::Param& par , FrameBaseInfo& fi , const mfxFrameSurface1* pSurfIn , const mfxEncodeCtrl* pCtrl , mfxLastKeyFrameInfo LastKeyFrameInfo , mfxU32 frameOrder , mfxGopHints GopHints) { auto sts = prev(par, fi, pSurfIn, pCtrl, LastKeyFrameInfo, frameOrder, GopHints); MFX_CHECK_STS(sts); MFX_CHECK(IsField(par.mvp.mfx.FrameInfo.PicStruct), MFX_ERR_NONE); bool bInfoValid = pSurfIn && !!(pSurfIn->Info.PicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)); fi.b2ndField = !!(frameOrder & 1); fi.bBottomField = (bInfoValid && IsBFF(pSurfIn->Info.PicStruct)) || (!bInfoValid && (IsBFF(par.mvp.mfx.FrameInfo.PicStruct) != fi.b2ndField)); return MFX_ERR_NONE; }); // min 2 active L0 refs for 2nd field defaults.GetFrameNumRefActive.Push([]( Defaults::TGetFrameNumRefActive::TExt prev , const Defaults::Param& par , const FrameBaseInfo& fi) { auto nRef = prev(par, fi); auto& nL0 = std::get<0>(nRef); bool bSetMinL0 = nL0 && fi.b2ndField && nL0 < 2; SetIf(nL0, bSetMinL0, mfxU8(2)); return nRef; }); defaults.GetSHNUT.Push([]( Defaults::TGetSHNUT::TExt prev , const Defaults::Param& par , const TaskCommonPar& task , bool bRAPIntra) { return prev(par, task, bRAPIntra && !IsField(par.mvp.mfx.FrameInfo.PicStruct)); }); defaults.GetVPS.Push([]( Defaults::TGetVPS::TExt prev , const Defaults::Param& par , VPS& vps) { auto sts = prev(par, vps); vps.general.progressive_source_flag = !!(par.mvp.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); vps.general.interlaced_source_flag = !(par.mvp.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); vps.general.frame_only_constraint_flag = !IsField(par.mvp.mfx.FrameInfo.PicStruct); return sts; }); defaults.GetSPS.Push([]( Defaults::TGetSPS::TExt prev , const Defaults::Param& par , const VPS& vps , SPS& sps) { auto sts = prev(par, vps, sps); auto& mfx = par.mvp.mfx; MFX_CHECK(IsField(mfx.FrameInfo.PicStruct) && sts >= MFX_ERR_NONE, sts); sps.log2_max_pic_order_cnt_lsb_minus4 = mfx::clamp( mfx::CeilLog2(mfx.GopRefDist * 2 + sps.sub_layer[sps.max_sub_layers_minus1].max_dec_pic_buffering_minus1) - 1 , sps.log2_max_pic_order_cnt_lsb_minus4 , 12u); sps.vui.frame_field_info_present_flag = 1; sps.vui.field_seq_flag = 1; return sts; }); defaults.GetWeakRef.Push([]( Defaults::TGetWeakRef::TExt prev , const Defaults::Param& par , const FrameBaseInfo &cur , const DpbFrame *begin , const DpbFrame *end) { if (!IsField(par.mvp.mfx.FrameInfo.PicStruct)) { return prev(par, cur, begin, end); } const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); auto POCLess = [](const DpbFrame& l, const DpbFrame& r) { return l.POC < r.POC; }; if (CO3.PRefType == MFX_P_REF_PYRAMID) { auto PyrInt = par.base.GetPPyrInterval(par); auto FN = [](const FrameBaseInfo& x) { return (x.POC + !x.b2ndField) / 2; }; auto IsWeak = [&](const FrameBaseInfo& x) { return (FN(x) - FN(*begin)) % PyrInt != 0; }; if (FN(begin[1]) == FN(begin[0])) { return std::find_if(begin, end, IsWeak); } return begin; } return std::min_element(begin, end, POCLess); }); bSet = true; return MFX_ERR_NONE; }); } void Interlace::Query1WithCaps(const FeatureBlocks&, TPushQ1 Push) { Push(BLK_CheckPicStruct, [](const mfxVideoParam&, mfxVideoParam& par, StorageRW&) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); bool bInterlaceAllowed = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || ( pCO2 && IsOn(pCO2->ExtBRC) && ( par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR)); bool bChanged = CheckOrZero( par.mfx.FrameInfo.PicStruct , mfxU16(MFX_PICSTRUCT_UNKNOWN) , mfxU16(MFX_PICSTRUCT_PROGRESSIVE) , mfxU16(bInterlaceAllowed * MFX_PICSTRUCT_FIELD_TOP) , mfxU16(bInterlaceAllowed * MFX_PICSTRUCT_FIELD_BOTTOM) , mfxU16(bInterlaceAllowed * MFX_PICSTRUCT_FIELD_SINGLE) , mfxU16(bInterlaceAllowed * MFX_PICSTRUCT_FIELD_TFF) , mfxU16(bInterlaceAllowed * MFX_PICSTRUCT_FIELD_BFF)); MFX_CHECK(!bChanged, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void Interlace::QueryIOSurf(const FeatureBlocks&, TPushQIS Push) { Push(BLK_QueryIOSurf , [](const mfxVideoParam&, mfxFrameAllocRequest& req, StorageRW& strg) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); mfxU16 nExtraRaw = IsField(par.mfx.FrameInfo.PicStruct) * (par.mfx.GopRefDist - 1); req.NumFrameMin += nExtraRaw; req.NumFrameSuggested += nExtraRaw; return MFX_ERR_NONE; }); } using TTaskItWrap = TaskItWrap; static bool IsL1Ready( DpbArray const & dpb, mfxI32 poc, TTaskItWrap begin, TTaskItWrap end, bool flush) { std::list bwd(mfx::size(dpb), nullptr); std::iota(bwd.begin(), bwd.end(), std::begin(dpb)); bwd.remove_if([&](const DpbFrame* p) { return !isValid(*p) || p->POC < poc; }); if (bwd.size() != 1) return !bwd.empty(); auto top = std::find_if_not(begin, end , [&](const FrameBaseInfo& f) { return f.POC <= bwd.back()->POC; }); bool bRes = (top != end && IsB(top->FrameType)) || (top == end && flush); return bRes; } template static T IntBPyrReorder(T begin, T end) { typedef typename std::iterator_traits::reference TRef; mfxU32 num = mfxU32(std::distance(begin, end)); bool bSetOrder = num && (*begin)->BPyramidOrder == mfxU32(MFX_FRAMEORDER_UNKNOWN); if (bSetOrder) { mfxU32 i = 0; std::for_each(begin, end, [&](TRef bref) { bool bRef = false; bref->BPyramidOrder = Legacy::GetBiFrameLocation(i++ / 2, num / 2, bRef, bref->PyramidLevel); bref->PyramidLevel *= 2; bref->FrameType |= mfxU16(MFX_FRAMETYPE_REF * (bRef || !bref->b2ndField)); }); } return std::min_element(begin, end , [](TRef a, TRef b) { return a->BPyramidOrder < b->BPyramidOrder; }); } static TTaskItWrap IntReorder( mfxVideoParam const & par, DpbArray const & dpb, TTaskItWrap begin, TTaskItWrap end, bool flush) { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); bool bBPyramid = (CO2.BRefType == MFX_B_REF_PYRAMID); auto top = begin; std::list brefs; auto IsB = [] (FrameBaseInfo& f){ return !!(f.FrameType & MFX_FRAMETYPE_B); }; auto NoL1 = [&](TTaskItWrap f) { return !IsL1Ready(dpb, f->POC, begin, end, flush); }; auto NextBRef = [&]() { return *IntBPyrReorder(brefs.begin(), brefs.end()); }; std::generate_n( std::back_inserter(brefs) , std::distance(begin, std::find_if_not(begin, end, IsB)) , [&]() { return top++; }); brefs.remove_if(NoL1); bool bNoPyramidB = !bBPyramid && !brefs.empty(); if (bNoPyramidB) { auto topB = brefs.begin(); FrameBaseInfo* pPrevB = nullptr; auto IsNextBRef = [&](TTaskItWrap& f) { bool bRes = IsRef(f->FrameType) && (!pPrevB || ((f->POC - pPrevB->POC) < 3)); pPrevB = &*f; return bRes; }; auto ref = std::find_if(brefs.begin(), brefs.end(), IsNextBRef); SetIf(topB, ref != brefs.end(), ref); return *topB; } SetIf(top, !brefs.empty(), NextBRef); bool bForcePRef = flush && top == end && begin != end; while (bForcePRef) { --top; top->FrameType = mfxU16(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); bForcePRef = top != begin && top->b2ndField; } return top; } void Interlace::InitInternal(const FeatureBlocks&, TPushII Push) { Push(BLK_SetReorder , [](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); MFX_CHECK(IsField(par.mfx.FrameInfo.PicStruct), MFX_ERR_NONE); auto& rdr = Glob::Reorder::Get(strg); rdr.BufferSize += par.mfx.GopRefDist - 1; rdr.MaxReorder += par.mfx.GopRefDist; rdr.Push([&](Reorderer::TExt, const DpbArray& DPB, TTaskIt begin, TTaskIt end, bool bFlush) { return IntReorder(par, DPB, begin, end, bFlush).it; }); return MFX_ERR_NONE; }); Push(BLK_PatchRawInfo , [](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); MFX_CHECK(IsField(par.mfx.FrameInfo.PicStruct), MFX_ERR_NONE); Tmp::RawInfo::Get(local).NumFrameMin += par.mfx.GopRefDist - 1; return MFX_ERR_NONE; }); } void Interlace::SubmitTask(const FeatureBlocks& , TPushST Push) { Push(BLK_InsertPTSEI , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto PS = par.mfx.FrameInfo.PicStruct; MFX_CHECK(IsField(PS), MFX_ERR_NONE); auto& task = Task::Common::Get(s_task); MFX_CHECK(task.InsertHeaders & INSERT_PTSEI, MFX_ERR_NONE); auto usrPlEnd = task.ctrl.Payload + task.ctrl.NumPayload; bool bUserPTSEI = usrPlEnd != std::find_if(task.ctrl.Payload, usrPlEnd , [](const mfxPayload* pPl) { return pPl && pPl->Type == 1; }); MFX_CHECK(!bUserPTSEI, MFX_ERR_NONE); auto& sps = Glob::SPS::Get(global); static const std::map PicStructMFX2STD = { {mfxU16(MFX_PICSTRUCT_FIELD_TOP), mfxU8(1)} , {mfxU16(MFX_PICSTRUCT_FIELD_BOTTOM), mfxU8(2)} , {mfxU16(MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_PAIRED_PREV), mfxU8(9)} , {mfxU16(MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_PAIRED_NEXT), mfxU8(11)} , {mfxU16(MFX_PICSTRUCT_FIELD_BOTTOM | MFX_PICSTRUCT_FIELD_PAIRED_PREV), mfxU8(10)} , {mfxU16(MFX_PICSTRUCT_FIELD_BOTTOM | MFX_PICSTRUCT_FIELD_PAIRED_NEXT), mfxU8(12)} }; PicTimingSEI pt = {}; pt.pic_struct = 1 + task.bBottomField; if (PicStructMFX2STD.count(task.pSurfIn->Info.PicStruct)) pt.pic_struct = PicStructMFX2STD.at(task.pSurfIn->Info.PicStruct); pt.source_scan_type = 0; pt.duplicate_flag = 0; pt.au_cpb_removal_delay_minus1 = std::max(task.cpb_removal_delay, 1) - 1; pt.pic_dpb_output_delay = task.DisplayOrder + sps.sub_layer[sps.max_sub_layers_minus1].max_num_reorder_pics - task.EncodedOrder; BitstreamWriter bs(m_buf.data(), (mfxU32)m_buf.size(), 0); mfxPayload pl = {}; pl.Type = 1; pl.Data = bs.GetStart(); bs.PutBits(8, 1); //payload type bs.PutBits(8, 0xff); //place for payload size Packer::PackSEIPayload(bs, sps.vui, pt); pl.NumBit = bs.GetOffset(); pl.BufSize = mfxU16(mfx::CeilDiv(pl.NumBit, 8u)); assert(pl.BufSize < 256); pl.Data[1] = (mfxU8)pl.BufSize - 2; //payload size task.PLInternal.push_back(pl); return MFX_ERR_NONE; }); Push(BLK_SkipFrame , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto& allocRec = Glob::AllocRec::Get(global); //skip second field when the first one is skipped bool b2ndFieldSkip = !task.bSkip && task.b2ndField && Legacy::IsSWBRC(par) && !!(allocRec.GetFlag(task.DPB.Active[task.RefPicList[0][0]].Rec.Idx) & REC_SKIPPED); task.bSkip |= b2ndFieldSkip; m_b2ndFieldRecode = b2ndFieldSkip && !(!!(allocRec.GetFlag(task.DPB.Active[task.RefPicList[0][0]].Rec.Idx) & REC_READY)); return MFX_ERR_NONE; }); } void Interlace::QueryTask(const FeatureBlocks&, TPushQT Push) { Push(BLK_QueryTask , [this](StorageW& /*global*/, StorageW& s_task) -> mfxStatus { MFX_CHECK(m_b2ndFieldRecode, MFX_ERR_NONE); m_b2ndFieldRecode = false; auto& task = Task::Common::Get(s_task); task.bRecode = true; return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_interlace.h000066400000000000000000000053021443134507600345210ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class Interlace : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckPicStruct)\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(SetReorder)\ DECL_BLOCK(PatchRawInfo)\ DECL_BLOCK(PrepareTask)\ DECL_BLOCK(InsertPTSEI)\ DECL_BLOCK(SkipFrame)\ DECL_BLOCK(QueryTask)\ DECL_BLOCK(PatchDDITask)\ DECL_BLOCK(QueryIOSurf) #define DECL_FEATURE_NAME "Base_Interlace" #include "hevcehw_decl_blocks.h" Interlace(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void QueryIOSurf(const FeatureBlocks& blocks, TPushQIS Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; static bool IsField(mfxU16 PicStruct) { return !!(PicStruct & MFX_PICSTRUCT_FIELD_SINGLE); } static bool IsBFF(mfxU16 PicStruct) { return !!(PicStruct & MFX_PICSTRUCT_FIELD_BFF); } std::array m_buf; bool m_b2ndFieldRecode = false; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_legacy.cpp000066400000000000000000005005111443134507600343540ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "mfx_common_int.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_data.h" #include "hevcehw_base_constraints.h" #include "hevcehw_base_parser.h" #include "fast_copy.h" #include "mfx_common_int.h" #include #include #include #include #include #include #include #include "libmfx_core.h" #include "mfx_enc_common.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Legacy::SetSupported(ParamSupport& blocks) { auto CopyRawBuffer = [](mfxU8* pSrcBuf, mfxU16 szSrcBuf, mfxU8* pDstBuf, mfxU16& szDstBuf) { bool bCopy = pSrcBuf && pDstBuf; ThrowIf(bCopy && szSrcBuf > szDstBuf, MFX_ERR_NOT_ENOUGH_BUFFER); if (bCopy) { std::copy_n(pSrcBuf, szSrcBuf, pDstBuf); szDstBuf = szSrcBuf; } }; blocks.m_mvpCopySupported.emplace_back( [](const mfxVideoParam* pSrc, mfxVideoParam* pDst) -> void { const auto& buf_src = *(const mfxVideoParam*)pSrc; auto& buf_dst = *(mfxVideoParam*)pDst; MFX_COPY_FIELD(IOPattern); MFX_COPY_FIELD(Protected); MFX_COPY_FIELD(AsyncDepth); MFX_COPY_FIELD(mfx.CodecId); MFX_COPY_FIELD(mfx.LowPower); MFX_COPY_FIELD(mfx.CodecLevel); MFX_COPY_FIELD(mfx.CodecProfile); MFX_COPY_FIELD(mfx.TargetUsage); MFX_COPY_FIELD(mfx.GopPicSize); MFX_COPY_FIELD(mfx.GopRefDist); MFX_COPY_FIELD(mfx.GopOptFlag); MFX_COPY_FIELD(mfx.IdrInterval); MFX_COPY_FIELD(mfx.BRCParamMultiplier); MFX_COPY_FIELD(mfx.RateControlMethod); MFX_COPY_FIELD(mfx.InitialDelayInKB); MFX_COPY_FIELD(mfx.BufferSizeInKB); MFX_COPY_FIELD(mfx.TargetKbps); MFX_COPY_FIELD(mfx.MaxKbps); MFX_COPY_FIELD(mfx.NumSlice); MFX_COPY_FIELD(mfx.NumRefFrame); MFX_COPY_FIELD(mfx.EncodedOrder); MFX_COPY_FIELD(mfx.FrameInfo.Shift); MFX_COPY_FIELD(mfx.FrameInfo.BitDepthLuma); MFX_COPY_FIELD(mfx.FrameInfo.BitDepthChroma); MFX_COPY_FIELD(mfx.FrameInfo.FourCC); MFX_COPY_FIELD(mfx.FrameInfo.Width); MFX_COPY_FIELD(mfx.FrameInfo.Height); MFX_COPY_FIELD(mfx.FrameInfo.CropX); MFX_COPY_FIELD(mfx.FrameInfo.CropY); MFX_COPY_FIELD(mfx.FrameInfo.CropW); MFX_COPY_FIELD(mfx.FrameInfo.CropH); MFX_COPY_FIELD(mfx.FrameInfo.FrameRateExtN); MFX_COPY_FIELD(mfx.FrameInfo.FrameRateExtD); MFX_COPY_FIELD(mfx.FrameInfo.AspectRatioW); MFX_COPY_FIELD(mfx.FrameInfo.AspectRatioH); MFX_COPY_FIELD(mfx.FrameInfo.ChromaFormat); MFX_COPY_FIELD(mfx.FrameInfo.PicStruct); }); blocks.m_ebCopySupported[MFX_EXTBUFF_HEVC_PARAM].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtHEVCParam*)pSrc; auto& buf_dst = *(mfxExtHEVCParam*)pDst; MFX_COPY_FIELD(PicWidthInLumaSamples); MFX_COPY_FIELD(PicHeightInLumaSamples); MFX_COPY_FIELD(GeneralConstraintFlags); MFX_COPY_FIELD(SampleAdaptiveOffset); MFX_COPY_FIELD(LCUSize); }); blocks.m_ebCopySupported[MFX_EXTBUFF_HEVC_TILES].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtHEVCTiles*)pSrc; auto& buf_dst = *(mfxExtHEVCTiles*)pDst; MFX_COPY_FIELD(NumTileRows); MFX_COPY_FIELD(NumTileColumns); }); blocks.m_ebCopySupported[MFX_EXTBUFF_AVC_REFLISTS].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAVCRefLists*)pSrc; auto& buf_dst = *(mfxExtAVCRefLists*)pDst; MFX_COPY_FIELD(NumRefIdxL0Active); MFX_COPY_FIELD(NumRefIdxL1Active); for (mfxU32 i = 0; i < 16; i++) { MFX_COPY_FIELD(RefPicList0[i].FrameOrder); MFX_COPY_FIELD(RefPicList1[i].FrameOrder); } }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption*)pSrc; auto& buf_dst = *(mfxExtCodingOption*)pDst; MFX_COPY_FIELD(PicTimingSEI); MFX_COPY_FIELD(VuiNalHrdParameters); MFX_COPY_FIELD(NalHrdConformance); MFX_COPY_FIELD(AUDelimiter); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption2*)pSrc; auto& buf_dst = *(mfxExtCodingOption2*)pDst; MFX_COPY_FIELD(IntRefType); MFX_COPY_FIELD(IntRefCycleSize); MFX_COPY_FIELD(IntRefQPDelta); MFX_COPY_FIELD(MBBRC); MFX_COPY_FIELD(BRefType); MFX_COPY_FIELD(NumMbPerSlice); MFX_COPY_FIELD(DisableDeblockingIdc); MFX_COPY_FIELD(RepeatPPS); MFX_COPY_FIELD(MaxSliceSize); MFX_COPY_FIELD(ExtBRC); MFX_COPY_FIELD(MinQPI); MFX_COPY_FIELD(MaxQPI); MFX_COPY_FIELD(MinQPP); MFX_COPY_FIELD(MaxQPP); MFX_COPY_FIELD(MinQPB); MFX_COPY_FIELD(MaxQPB); MFX_COPY_FIELD(SkipFrame); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(PRefType); MFX_COPY_FIELD(IntRefCycleDist); MFX_COPY_FIELD(EnableQPOffset); MFX_COPY_FIELD(GPB); MFX_COPY_ARRAY_FIELD(QPOffset); MFX_COPY_ARRAY_FIELD(NumRefActiveP); MFX_COPY_ARRAY_FIELD(NumRefActiveBL0); MFX_COPY_ARRAY_FIELD(NumRefActiveBL1); MFX_COPY_FIELD(QVBRQuality); MFX_COPY_FIELD(EnableMBQP); MFX_COPY_FIELD(TransformSkip); MFX_COPY_FIELD(TargetChromaFormatPlus1); MFX_COPY_FIELD(TargetBitDepthLuma); MFX_COPY_FIELD(TargetBitDepthChroma); MFX_COPY_FIELD(WinBRCMaxAvgKbps); MFX_COPY_FIELD(WinBRCSize); MFX_COPY_FIELD(EnableNalUnitType); MFX_COPY_FIELD(LowDelayBRC); MFX_COPY_FIELD(BRCPanicMode); MFX_COPY_FIELD(ScenarioInfo); MFX_COPY_FIELD(AdaptiveCQM); }); blocks.m_ebCopyPtrs[MFX_EXTBUFF_CODING_OPTION_SPSPPS].emplace_back( [&](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOptionSPSPPS*)pSrc; auto& buf_dst = *(mfxExtCodingOptionSPSPPS*)pDst; MFX_COPY_FIELD(SPSBuffer); MFX_COPY_FIELD(SPSBufSize); MFX_COPY_FIELD(PPSBuffer); MFX_COPY_FIELD(PPSBufSize); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION_SPSPPS].emplace_back( [&](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOptionSPSPPS*)pSrc; auto& buf_dst = *(mfxExtCodingOptionSPSPPS*)pDst; CopyRawBuffer(buf_src.SPSBuffer, buf_src.SPSBufSize, buf_dst.SPSBuffer, buf_dst.SPSBufSize); CopyRawBuffer(buf_src.PPSBuffer, buf_src.PPSBufSize, buf_dst.PPSBuffer, buf_dst.PPSBufSize); }); blocks.m_ebCopySupported[MFX_EXTBUFF_AVC_REFLIST_CTRL].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAVCRefListCtrl*)pSrc; auto& buf_dst = *(mfxExtAVCRefListCtrl*)pDst; MFX_COPY_FIELD(NumRefIdxL0Active); MFX_COPY_FIELD(NumRefIdxL1Active); for (mfxU32 i = 0; i < 16; i++) { MFX_COPY_FIELD(PreferredRefList[i].FrameOrder); MFX_COPY_FIELD(RejectedRefList[i].FrameOrder); MFX_COPY_FIELD(LongTermRefList[i].FrameOrder); } }); blocks.m_ebCopySupported[MFX_EXTBUFF_AVC_TEMPORAL_LAYERS].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtAvcTemporalLayers*)pSrc; auto& buf_dst = *(mfxExtAvcTemporalLayers*)pDst; for (mfxU32 i = 0; i < 7; i++) { MFX_COPY_FIELD(Layer[i].Scale); } }); blocks.m_ebCopySupported[MFX_EXTBUFF_ENCODER_RESET_OPTION].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtEncoderResetOption*)pSrc; auto& buf_dst = *(mfxExtEncoderResetOption*)pDst; MFX_COPY_FIELD(StartNewSequence); }); blocks.m_ebCopyPtrs[MFX_EXTBUFF_CODING_OPTION_VPS].emplace_back( [&](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOptionVPS*)pSrc; auto& buf_dst = *(mfxExtCodingOptionVPS*)pDst; MFX_COPY_FIELD(VPSBuffer); MFX_COPY_FIELD(VPSBufSize); }); blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION_VPS].emplace_back( [&](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtCodingOptionVPS*)pSrc; auto& buf_dst = *(mfxExtCodingOptionVPS*)pDst; CopyRawBuffer(buf_src.VPSBuffer, buf_src.VPSBufSize, buf_dst.VPSBuffer, buf_dst.VPSBufSize); }); blocks.m_ebCopySupported[MFX_EXTBUFF_VIDEO_SIGNAL_INFO].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtVideoSignalInfo*)pSrc; auto& buf_dst = *(mfxExtVideoSignalInfo*)pDst; buf_dst = buf_src; }); blocks.m_ebCopySupported[MFX_EXTBUFF_MBQP].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtMBQP*)pSrc; auto& buf_dst = *(mfxExtMBQP*)pDst; MFX_COPY_FIELD(NumQPAlloc); MFX_COPY_FIELD(QP); }); blocks.m_ebCopySupported[MFX_EXTBUFF_ALLOCATION_HINTS].emplace_back( [](const mfxExtBuffer*, mfxExtBuffer*) -> void { /* Just allow this buffer to be present at Init */ }); blocks.m_ebCopySupported[MFX_EXTBUFF_CHROMA_LOC_INFO].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { const auto& buf_src = *(const mfxExtChromaLocInfo*)pSrc; auto& buf_dst = *(mfxExtChromaLocInfo*)pDst; buf_dst = buf_src; }); } bool Legacy::IsTCBRC(const mfxVideoParam& par, mfxU16 tcbrcSupport) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const mfxExtCodingOption& CO = ExtBuffer::Get(par); return (IsOn(CO3.LowDelayBRC) && tcbrcSupport && IsOff(CO.NalHrdConformance) && (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VCM )); } void Legacy::SetInherited(ParamInheritance& par) { par.m_mvpInheritDefault.emplace_back( [](const mfxVideoParam* pSrc, mfxVideoParam* pDst) { auto& parInit = *pSrc; auto& parReset = *pDst; #define INHERIT_OPT(OPT) InheritOption(parInit.OPT, parReset.OPT) #define INHERIT_BRC(OPT) { OPT tmp(parReset.mfx); InheritOption(OPT(parInit.mfx), tmp); } INHERIT_OPT(AsyncDepth); //INHERIT_OPT(mfx.BRCParamMultiplier); INHERIT_OPT(mfx.LowPower); INHERIT_OPT(mfx.CodecId); INHERIT_OPT(mfx.CodecProfile); INHERIT_OPT(mfx.CodecLevel); INHERIT_OPT(mfx.NumThread); INHERIT_OPT(mfx.TargetUsage); INHERIT_OPT(mfx.GopPicSize); INHERIT_OPT(mfx.GopRefDist); INHERIT_OPT(mfx.GopOptFlag); INHERIT_OPT(mfx.IdrInterval); INHERIT_OPT(mfx.RateControlMethod); INHERIT_OPT(mfx.BufferSizeInKB); INHERIT_OPT(mfx.NumSlice); INHERIT_OPT(mfx.NumRefFrame); mfxU16 RC = parInit.mfx.RateControlMethod * (parInit.mfx.RateControlMethod == parReset.mfx.RateControlMethod); static const std::map< mfxU16 , std::function > InheritBrcOpt = { { mfxU16(MFX_RATECONTROL_CBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); } } , { mfxU16(MFX_RATECONTROL_VBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } , { mfxU16(MFX_RATECONTROL_CQP) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.QPI); INHERIT_OPT(mfx.QPP); INHERIT_OPT(mfx.QPB); } } , { mfxU16(MFX_RATECONTROL_ICQ) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.ICQQuality); } } , { mfxU16(MFX_RATECONTROL_LA_ICQ) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_OPT(mfx.ICQQuality); } } , { mfxU16(MFX_RATECONTROL_VCM) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } , { mfxU16(MFX_RATECONTROL_QVBR) , [](const mfxVideoParam& parInit, mfxVideoParam& parReset) { INHERIT_BRC(InitialDelayInKB); INHERIT_BRC(TargetKbps); INHERIT_BRC(MaxKbps); } } }; auto itInheritBrcOpt = InheritBrcOpt.find(RC); if (itInheritBrcOpt != InheritBrcOpt.end()) itInheritBrcOpt->second(parInit, parReset); INHERIT_OPT(mfx.FrameInfo.FourCC); INHERIT_OPT(mfx.FrameInfo.Width); INHERIT_OPT(mfx.FrameInfo.Height); INHERIT_OPT(mfx.FrameInfo.CropX); INHERIT_OPT(mfx.FrameInfo.CropY); INHERIT_OPT(mfx.FrameInfo.CropW); INHERIT_OPT(mfx.FrameInfo.CropH); INHERIT_OPT(mfx.FrameInfo.FrameRateExtN); INHERIT_OPT(mfx.FrameInfo.FrameRateExtD); INHERIT_OPT(mfx.FrameInfo.AspectRatioW); INHERIT_OPT(mfx.FrameInfo.AspectRatioH); #undef INHERIT_OPT #undef INHERIT_BRC }); #define INIT_EB(TYPE)\ if (!pSrc || !pDst) return;\ auto& ebInit = *(TYPE*)pSrc;\ auto& ebReset = *(TYPE*)pDst; #define INHERIT_OPT(OPT) InheritOption(ebInit.OPT, ebReset.OPT); par.m_ebInheritDefault[MFX_EXTBUFF_HEVC_PARAM].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtHEVCParam); INHERIT_OPT(GeneralConstraintFlags); INHERIT_OPT(SampleAdaptiveOffset); INHERIT_OPT(LCUSize); }); par.m_ebInheritDefault[MFX_EXTBUFF_HEVC_TILES].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtHEVCTiles); INHERIT_OPT(NumTileColumns); INHERIT_OPT(NumTileRows); }); par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtCodingOption); INHERIT_OPT(VuiNalHrdParameters); INHERIT_OPT(NalHrdConformance); INHERIT_OPT(PicTimingSEI); }); par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtCodingOption2); INHERIT_OPT(IntRefType); INHERIT_OPT(IntRefCycleSize); INHERIT_OPT(IntRefQPDelta); INHERIT_OPT(MBBRC); INHERIT_OPT(BRefType); INHERIT_OPT(NumMbPerSlice); INHERIT_OPT(MinQPI); INHERIT_OPT(MinQPP); INHERIT_OPT(MinQPB); INHERIT_OPT(MaxQPI); INHERIT_OPT(MaxQPP); INHERIT_OPT(MaxQPB); }); par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [this](const mfxVideoParam& parInit , const mfxExtBuffer* pSrc , const mfxVideoParam& parReset , mfxExtBuffer* pDst) { INIT_EB(mfxExtCodingOption3); INHERIT_OPT(LowDelayBRC); INHERIT_OPT(IntRefCycleDist); INHERIT_OPT(PRefType); INHERIT_OPT(GPB); INHERIT_OPT(TransformSkip); INHERIT_OPT(TargetChromaFormatPlus1); INHERIT_OPT(TargetBitDepthLuma); INHERIT_OPT(TargetBitDepthChroma); INHERIT_OPT(WinBRCMaxAvgKbps); INHERIT_OPT(WinBRCSize); INHERIT_OPT(EnableMBQP); INHERIT_OPT(ScenarioInfo); INHERIT_OPT(AdaptiveCQM); mfxU16 RC = parInit.mfx.RateControlMethod * (parInit.mfx.RateControlMethod == parReset.mfx.RateControlMethod); if (RC == MFX_RATECONTROL_QVBR) INHERIT_OPT(QVBRQuality); if (parInit.mfx.TargetUsage != parReset.mfx.TargetUsage) { auto maxRef = m_GetMaxRef(parReset); auto ClipRefP = [maxRef](mfxU16 ref) { return std::min(ref, std::get

(maxRef)); }; auto ClipRefBL0 = [maxRef](mfxU16 ref) { return std::min(ref, std::get(maxRef)); }; auto ClipRefBL1 = [maxRef](mfxU16 ref) { return std::min(ref, std::get(maxRef)); }; std::transform(ebInit.NumRefActiveP, ebInit.NumRefActiveP + 8, ebReset.NumRefActiveP, ClipRefP); std::transform(ebInit.NumRefActiveBL0, ebInit.NumRefActiveBL0 + 8, ebReset.NumRefActiveBL0, ClipRefBL0); std::transform(ebInit.NumRefActiveBL1, ebInit.NumRefActiveBL1 + 8, ebReset.NumRefActiveBL1, ClipRefBL1); } else { InheritOptions(ebInit.NumRefActiveP, ebInit.NumRefActiveP + 8, ebReset.NumRefActiveP); InheritOptions(ebInit.NumRefActiveBL0, ebInit.NumRefActiveBL0 + 8, ebReset.NumRefActiveBL0); InheritOptions(ebInit.NumRefActiveBL1, ebInit.NumRefActiveBL1 + 8, ebReset.NumRefActiveBL1); } }); par.m_ebInheritDefault[MFX_EXTBUFF_VIDEO_SIGNAL_INFO].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtVideoSignalInfo); INHERIT_OPT(VideoFormat); INHERIT_OPT(ColourPrimaries); INHERIT_OPT(TransferCharacteristics); INHERIT_OPT(MatrixCoefficients); INHERIT_OPT(VideoFullRange); INHERIT_OPT(ColourDescriptionPresent); }); par.m_ebInheritDefault[MFX_EXTBUFF_CHROMA_LOC_INFO].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { INIT_EB(mfxExtChromaLocInfo); INHERIT_OPT(ChromaLocInfoPresentFlag); INHERIT_OPT(ChromaSampleLocTypeTopField); INHERIT_OPT(ChromaSampleLocTypeBottomField); }); #undef INIT_EB #undef INHERIT_OPT } void Legacy::Query0(const FeatureBlocks& blocks, TPushQ0 Push) { using namespace std::placeholders; Push( BLK_Query0, std::bind(&Legacy::CheckQuery0, this, std::cref(blocks), _1)); } void Legacy::Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) { #if defined(MFX_ENABLE_LOG_UTILITY) Push(BLK_SetLogging, [this](const mfxVideoParam&, mfxVideoParam& out, StorageRW&) -> mfxStatus { return MFX_ERR_NONE; }); #endif Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); PushDefaults(defaults); VideoCORE * pCore = &Glob::VideoCore::Get(strg); defaults.RunFastCopyWrapper.Push([pCore](Defaults::TRunFastCopyWrapper::TExt , mfxFrameSurface1 &surfDst , mfxU16 dstMemType , mfxFrameSurface1 &surfSrc , mfxU16 srcMemType) -> mfxStatus { return pCore->DoFastCopyWrapper(&surfDst, dstMemType, &surfSrc, srcMemType); }); bSet = true; m_pQNCDefaults = &defaults; m_hw = Glob::VideoCore::Get(strg).GetHWType(); return MFX_ERR_NONE; }); Push(BLK_PreCheckCodecId, [this](const mfxVideoParam& in, mfxVideoParam&, StorageRW& /*strg*/) -> mfxStatus { return m_pQNCDefaults->PreCheckCodecId(in); }); Push(BLK_PreCheckChromaFormat, [this](const mfxVideoParam& in, mfxVideoParam&, StorageW&) -> mfxStatus { return m_pQNCDefaults->PreCheckChromaFormat(in); }); Push(BLK_PreCheckExtBuffers , [this, &blocks](const mfxVideoParam& in, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckBuffers(blocks, in, &out); }); Push(BLK_CopyConfigurable , [this, &blocks](const mfxVideoParam& in, mfxVideoParam& out, StorageW&) -> mfxStatus { return CopyConfigurable(blocks, in, out); }); Push(BLK_SetLowPowerDefault , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& /*strg*/) -> mfxStatus { auto lowPower = m_pQNCDefaults->GetLowPower(out, m_hw); bool bChanged = out.mfx.LowPower && out.mfx.LowPower != lowPower; out.mfx.LowPower = lowPower; MFX_CHECK(!bChanged, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void Legacy::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckHeaders , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& strg) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; m_pQWCDefaults.reset( new Defaults::Param( out , Glob::EncodeCaps::Get(strg) , Glob::VideoCore::Get(strg).GetHWType() , Glob::Defaults::Get(strg))); if (strg.Contains(Glob::SPS::Key)) sts = CheckSPS(Glob::SPS::Get(strg), m_pQWCDefaults->caps, m_pQWCDefaults->hw); if (!sts && strg.Contains(Glob::PPS::Key)) sts = CheckPPS(Glob::PPS::Get(strg), m_pQWCDefaults->caps, m_pQWCDefaults->hw); return sts; }); Push(BLK_CheckLCUSize , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW& ) -> mfxStatus { return m_pQWCDefaults->base.CheckLCUSize(*m_pQWCDefaults, out); }); Push(BLK_CheckFormat , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { auto sts = m_pQWCDefaults->base.CheckFourCC(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckInputFormatByFourCC(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckTargetChromaFormat(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); sts = m_pQWCDefaults->base.CheckTargetBitDepth(*m_pQWCDefaults, out); MFX_CHECK_STS(sts); return m_pQWCDefaults->base.CheckFourCCByTargetFormat(*m_pQWCDefaults, out); }); Push(BLK_CheckLowDelayBRC , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckLowDelayBRC(*m_pQWCDefaults, out); }); Push(BLK_CheckLevel , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckLevel(*m_pQWCDefaults, out); }); Push(BLK_CheckSurfSize , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckSurfSize(*m_pQWCDefaults, out); }); Push(BLK_CheckCodedPicSize , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckCodedPicSize(out, *m_pQWCDefaults); }); Push(BLK_CheckTiles , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckTiles(out, *m_pQWCDefaults); }); Push(BLK_CheckTU , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckTU(out, m_pQWCDefaults->caps); }); Push(BLK_CheckTemporalLayers , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckTemporalLayers(out); }); Push(BLK_CheckGopRefDist , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckGopRefDist(out, m_pQWCDefaults->caps); }); Push(BLK_CheckNumRefFrame , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckNumRefFrame(out, *m_pQWCDefaults); }); Push(BLK_CheckIOPattern , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckIOPattern(out); }); Push(BLK_CheckBRC , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckBRC(out, *m_pQWCDefaults); }); Push(BLK_CheckCrops , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckCrops(out, *m_pQWCDefaults); }); Push(BLK_CheckShift , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckShift(out); }); Push(BLK_CheckFrameRate , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckFrameRate(out); }); Push(BLK_CheckSlices , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckSlices(*m_pQWCDefaults, out); }); Push(BLK_CheckBPyramid , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckBPyramid(out, *m_pQWCDefaults); }); Push(BLK_CheckPPyramid , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckPPyramid(out); }); Push(BLK_CheckIntraRefresh , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckIntraRefresh(out, *m_pQWCDefaults); }); Push(BLK_CheckSkipFrame , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckSkipFrame(out); }); Push(BLK_CheckGPB , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckGPB(out); }); Push(BLK_CheckESPackParam , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckESPackParam(out, m_pQWCDefaults->hw); }); Push(BLK_CheckNumRefActive , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckNumRefActive(*m_pQWCDefaults, out); }); Push(BLK_CheckSAO , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckSAO(*m_pQWCDefaults, out); }); Push(BLK_CheckProfile , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return m_pQWCDefaults->base.CheckProfile(*m_pQWCDefaults, out); }); Push(BLK_CheckLevelConstraints , [this](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { return CheckLevelConstraints(out, *m_pQWCDefaults); }); } void Legacy::QueryIOSurf(const FeatureBlocks& blocks, TPushQIS Push) { Push(BLK_CheckIOPattern , [](const mfxVideoParam& par, mfxFrameAllocRequest&, StorageRW&) -> mfxStatus { bool check_result = Check (par.IOPattern); MFX_CHECK(!check_result, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; }); Push(BLK_CheckVideoParam , [&blocks](const mfxVideoParam& par, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto pTmpPar = make_storable>(par); auto& queryNC = FeatureBlocks::BQ::Get(blocks); sts = RunBlocks(CheckGE, queryNC, par, *pTmpPar, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); auto& queryWC = FeatureBlocks::BQ::Get(blocks); sts = RunBlocks(CheckGE, queryWC, par, *pTmpPar, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); strg.Insert(Glob::VideoParam::Key, std::move(pTmpPar)); return MFX_ERR_NONE; }); Push(BLK_SetDefaults , [&blocks](const mfxVideoParam&, mfxFrameAllocRequest&, StorageRW& strg) -> mfxStatus { ExtBuffer::Param& par = Glob::VideoParam::Get(strg); StorageRW local; auto& qSD = FeatureBlocks::BQ::Get(blocks); return RunBlocks(IgnoreSts, qSD, par, strg, local); }); Push(BLK_SetFrameAllocRequest , [this](const mfxVideoParam&, mfxFrameAllocRequest& req, StorageRW& strg) -> mfxStatus { ExtBuffer::Param& par = Glob::VideoParam::Get(strg); auto fourCC = par.mfx.FrameInfo.FourCC; req.Info = par.mfx.FrameInfo; SetDefault(req.Info.Shift, (fourCC == MFX_FOURCC_P010 || fourCC == MFX_FOURCC_Y210)); bool bSYS = par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY; bool bVID = par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY; req.Type = bSYS * (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME) + bVID * (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME); MFX_CHECK(req.Type, MFX_ERR_INVALID_VIDEO_PARAM); req.NumFrameMin = GetMaxRaw(par); req.NumFrameSuggested = req.NumFrameMin; return MFX_ERR_NONE; }); } void Legacy::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& par, StorageW& strg, StorageRW&) { auto& core = Glob::VideoCore::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); auto& defchain = Glob::Defaults::Get(strg); SetDefaults(par, Defaults::Param(par, caps, core.GetHWType(), defchain), core.IsExternalFrameAllocator()); }); } void Legacy::InitExternal(const FeatureBlocks& blocks, TPushIE Push) { Push(BLK_SetVideoParam , [&blocks](const mfxVideoParam& in, StorageRW& strg, StorageRW&) -> mfxStatus { const auto& query = FeatureBlocks::BQ::Get(blocks); mfxStatus sts = MFX_ERR_NONE; auto pPar = make_storable>(in); ExtBuffer::Param& par = *pPar; sts = RunBlocks(CheckGE, query, in, par, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); strg.Insert(Glob::VideoParam::Key, std::move(pPar)); return sts; }); Push(BLK_CheckVideoParam , [&blocks](const mfxVideoParam& in, StorageRW& strg, StorageRW&) -> mfxStatus { const auto& query = FeatureBlocks::BQ::Get(blocks); mfxStatus sts = MFX_ERR_NONE; ExtBuffer::Param& par = Glob::VideoParam::Get(strg); sts = RunBlocks(CheckGE, query, in, par, strg); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts >= MFX_ERR_NONE, sts); MFX_CHECK(in.mfx.FrameInfo.Width == par.mfx.FrameInfo.Width && in.mfx.FrameInfo.Height == par.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); return sts; }); Push(BLK_SetDefaults , [&blocks](const mfxVideoParam&, StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); for (auto& eb : blocks.m_ebCopySupported) par.NewEB(eb.first, false); auto& qSD = FeatureBlocks::BQ::Get(blocks); return RunBlocks(IgnoreSts, qSD, par, strg, local); }); } void Legacy::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetReorder , [this](StorageRW& strg, StorageRW&) -> mfxStatus { using namespace std::placeholders; auto& par = Glob::VideoParam::Get(strg); auto pReorderer = make_storable(); pReorderer->BufferSize = par.mfx.GopRefDist - 1; pReorderer->MaxReorder = par.mfx.GopRefDist - 1; pReorderer->DPB = &m_prevTask.DPB.After; pReorderer->Push( [&](Reorderer::TExt, const DpbArray& DPB, TTaskIt begin, TTaskIt end, bool bFlush) { auto IsIdrFrame = [](TItWrap::reference fi) { return IsIdr(fi.FrameType); }; auto newEnd = std::find_if(TItWrap(begin), TItWrap(end), IsIdrFrame); bFlush |= (newEnd != begin && newEnd != end); return Reorder(par, DPB, TItWrap(begin), newEnd, bFlush).it; }); strg.Insert(Glob::Reorder::Key, std::move(pReorderer)); return MFX_ERR_NONE; }); Push(BLK_SetVPS , [this](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK(!strg.Contains(Glob::VPS::Key), MFX_ERR_NONE); auto dflts = GetRTDefaults(strg); auto sts = dflts.base.GetVPS(dflts, Glob::VPS::GetOrConstruct(strg)); MFX_CHECK_STS(sts); return MFX_ERR_NONE; }); Push(BLK_SetSPS , [this](StorageRW& strg, StorageRW&) -> mfxStatus { if (!strg.Contains(Glob::SPS::Key)) { auto pSPS = make_storable(); auto dflts = GetRTDefaults(strg); auto sts = dflts.base.GetSPS(dflts, Glob::VPS::Get(strg), *pSPS); MFX_CHECK_STS(sts); strg.Insert(Glob::SPS::Key, std::move(pSPS)); } if (strg.Contains(Glob::RealState::Key)) { auto& hint = Glob::ResetHint::Get(strg); const SPS& oldSPS = Glob::SPS::Get(Glob::RealState::Get(strg)); SPS& newSPS = Glob::SPS::Get(strg); SPS oldSPScopy = oldSPS; std::copy(newSPS.strps, newSPS.strps + mfx::size(newSPS.strps), oldSPScopy.strps); oldSPScopy.num_short_term_ref_pic_sets = newSPS.num_short_term_ref_pic_sets; if (!oldSPS.vui_parameters_present_flag) oldSPScopy.vui = newSPS.vui; bool bSPSChanged = !!memcmp(&newSPS, &oldSPScopy, sizeof(SPS)); hint.Flags |= RF_SPS_CHANGED * (bSPSChanged || (hint.Flags & RF_IDR_REQUIRED)); } return CheckSPS(Glob::SPS::Get(strg) , Glob::EncodeCaps::Get(strg) , Glob::VideoCore::Get(strg).GetHWType()); }); Push(BLK_NestSTRPS , [](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK( strg.Contains(Glob::RealState::Key) && !(Glob::ResetHint::Get(strg).Flags & RF_SPS_CHANGED) , MFX_ERR_NONE); SPS& newSPS = Glob::SPS::Get(strg); const SPS& oldSPS = Glob::SPS::Get(Glob::RealState::Get(strg)); //sacrifice STRPS optimization at Reset to avoid IDR insertion newSPS.num_short_term_ref_pic_sets = oldSPS.num_short_term_ref_pic_sets; std::copy(oldSPS.strps, oldSPS.strps + mfx::size(oldSPS.strps), newSPS.strps); return MFX_ERR_NONE; }); Push(BLK_SetSTRPS , [this](StorageRW& strg, StorageRW&) -> mfxStatus { SPS& sps = Glob::SPS::Get(strg); MFX_CHECK( !sps.num_short_term_ref_pic_sets && !(strg.Contains(Glob::RealState::Key) && !(Glob::ResetHint::Get(strg).Flags & RF_SPS_CHANGED)) , MFX_ERR_NONE); auto dflts = GetRTDefaults(strg); MFX_CHECK(!dflts.base.GetNonStdReordering(dflts), MFX_ERR_NONE); SetSTRPS(dflts, sps, Glob::Reorder::Get(strg)); return MFX_ERR_NONE; }); Push(BLK_SetPPS , [this](StorageRW& strg, StorageRW&) -> mfxStatus { if (!strg.Contains(Glob::PPS::Key)) { std::unique_ptr> pPPS(new MakeStorable); auto dflts = GetRTDefaults(strg); auto sts = dflts.base.GetPPS(dflts, Glob::SPS::Get(strg), *pPPS); MFX_CHECK_STS(sts); strg.Insert(Glob::PPS::Key, std::move(pPPS)); } if (strg.Contains(Glob::RealState::Key)) { const PPS& oldPPS = Glob::PPS::Get(Glob::RealState::Get(strg)); PPS& newPPS = Glob::PPS::Get(strg); if (memcmp(&oldPPS, &newPPS, sizeof(PPS))) Glob::ResetHint::Get(strg).Flags |= RF_PPS_CHANGED; } return CheckPPS(Glob::PPS::Get(strg) , Glob::EncodeCaps::Get(strg) , Glob::VideoCore::Get(strg).GetHWType()); }); Push(BLK_SetSlices , [this](StorageRW& strg, StorageRW&) -> mfxStatus { auto dflts = GetRTDefaults(strg); dflts.base.GetSlices(dflts, Glob::SliceInfo::GetOrConstruct(strg)); return MFX_ERR_NONE; }); Push(BLK_SetRawInfo , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); mfxFrameAllocRequest raw = {}; raw.Info = par.mfx.FrameInfo; auto& rawInfo = Tmp::RawInfo::GetOrConstruct(local, raw); SetDefault(rawInfo.NumFrameMin, GetMaxRaw(par)); SetDefault(rawInfo.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME)); return MFX_ERR_NONE; }); } void Legacy::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_AllocRaw , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); auto& rawInfo = Tmp::RawInfo::Get(local); auto AllocRaw = [&](mfxU16 NumFrameMin) { std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); mfxFrameAllocRequest req = rawInfo; req.NumFrameMin = NumFrameMin; sts = pAlloc->Alloc(req, true); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocRaw::Key, std::move(pAlloc)); return MFX_ERR_NONE; }; bool isD3D9SimWithVideoMem = IsD3D9Simulation(Glob::VideoCore::Get(strg)) && (par.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); if (par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || isD3D9SimWithVideoMem) { sts = AllocRaw(rawInfo.NumFrameMin); MFX_CHECK_STS(sts); } bool bSkipFramesMode = ( (IsSWBRC(par) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) || (CO2.SkipFrame == MFX_SKIPFRAME_INSERT_DUMMY)) && !strg.Contains(Glob::AllocRaw::Key); if (bSkipFramesMode) { sts = AllocRaw(GetMaxBS(par)); MFX_CHECK_STS(sts); } return sts; }); Push(BLK_AllocBS , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); MFX_CHECK(local.Contains(Tmp::BSAllocInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& req = Tmp::BSAllocInfo::Get(local); SetDefault(req.NumFrameMin, GetMaxBS(par)); SetDefault(req.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME)); mfxU32 minBS = GetMinBsSize(par); if (mfxU32(req.Info.Width * req.Info.Height) < minBS) { MFX_CHECK(req.Info.Width != 0, MFX_ERR_UNDEFINED_BEHAVIOR); req.Info.Height = (mfxU16)mfx::CeilDiv(minBS, req.Info.Width); } sts = pAlloc->Alloc(req, false); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocBS::Key, std::move(pAlloc)); return sts; }); Push(BLK_AllocMBQP , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); //const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); auto& core = Glob::VideoCore::Get(strg); auto& caps = Glob::EncodeCaps::Get(strg); MFX_CHECK(Legacy::GetMBQPMode(caps, par), MFX_ERR_NONE); MFX_CHECK(strg.Contains(Glob::MBQPAllocInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& req = Glob::MBQPAllocInfo::Get(strg); SetDefault(req.NumFrameMin, GetMaxMBMaps(par)); SetDefault(req.NumFrameSuggested, GetMaxMBMaps(par)); m_CUQPBlkW = (mfxU16)req.width; m_CUQPBlkH = (mfxU16)req.height; std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(core)); sts = pAlloc->Alloc(req, true); MFX_CHECK_STS(sts); if (!req.pitch) { auto CUQP = pAlloc->Acquire(); MFX_CHECK(CUQP.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); { FrameLocker lock(core, CUQP.Mid); MFX_CHECK(lock.Y, MFX_ERR_LOCK_MEMORY); req.pitch = lock.Pitch; } pAlloc->Release(CUQP.Idx); } strg.Insert(Glob::AllocMBQP::Key, std::move(pAlloc)); return sts; }); Push(BLK_ResetState , [this](StorageRW& /*strg*/, StorageRW& /*local*/) -> mfxStatus { ResetState(); return MFX_ERR_NONE; }); } void Legacy::Reset(const FeatureBlocks& blocks, TPushR Push) { Push(BLK_ResetInit , [this, &blocks]( const mfxVideoParam& par , StorageRW& global , StorageRW& local) -> mfxStatus { mfxStatus wrn = MFX_ERR_NONE; auto& init = Glob::RealState::Get(global); if (par.NumExtParam != 0) MFX_CHECK(std::none_of(par.ExtParam, par.ExtParam + par.NumExtParam, [](mfxExtBuffer* buf) { return buf == nullptr; }), MFX_ERR_NULL_PTR); auto pParNew = make_storable>(par); ExtBuffer::Param& parNew = *pParNew; auto& parOld = Glob::VideoParam::Get(init); auto& core = Glob::VideoCore::Get(init); global.Insert(Glob::ResetHint::Key, make_storable(ResetHint{})); auto& hint = Glob::ResetHint::Get(global); const mfxExtEncoderResetOption* pResetOpt = ExtBuffer::Get(par); hint.Flags = RF_IDR_REQUIRED * (pResetOpt && IsOn(pResetOpt->StartNewSequence)); m_GetMaxRef = [&](const mfxVideoParam& par) { auto& def = Glob::Defaults::Get(init); auto hw = core.GetHWType(); auto& caps = Glob::EncodeCaps::Get(init); return def.GetMaxNumRef(Defaults::Param(par, caps, hw, def)); }; std::for_each(std::begin(blocks.m_ebCopySupported) , std::end(blocks.m_ebCopySupported) , [&](decltype(*std::begin(blocks.m_ebCopySupported)) eb) { parNew.NewEB(eb.first, false); }); std::for_each(std::begin(blocks.m_mvpInheritDefault) , std::end(blocks.m_mvpInheritDefault) , [&](decltype(*std::begin(blocks.m_mvpInheritDefault)) inherit) { inherit(&parOld, &parNew); }); std::for_each(std::begin(blocks.m_ebInheritDefault) , std::end(blocks.m_ebInheritDefault) , [&](decltype(*std::begin(blocks.m_ebInheritDefault)) eb) { auto pEbNew = ExtBuffer::Get(parNew, eb.first); auto pEbOld = ExtBuffer::Get(parOld, eb.first); MFX_CHECK(pEbNew && pEbOld, MFX_ERR_NONE); std::for_each(std::begin(eb.second) , std::end(eb.second) , [&](decltype(*std::begin(eb.second)) inherit) { inherit(parOld, pEbOld, parNew, pEbNew); }); return MFX_ERR_NONE; }); auto& qInitExternal = FeatureBlocks::BQ::Get(blocks); auto& qInitInternal = FeatureBlocks::BQ::Get(blocks); auto sts = RunBlocks(CheckGE, qInitExternal, parNew, global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); wrn = sts; sts = RunBlocks(CheckGE, qInitInternal, global, local); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return GetWorstSts(sts, wrn); }); Push(BLK_ResetCheck , [this]( const mfxVideoParam& par , StorageRW& global , StorageRW& local) -> mfxStatus { auto& init = Glob::RealState::Get(global); auto& parOld = Glob::VideoParam::Get(init); auto& parNew = Glob::VideoParam::Get(global); auto& hint = Glob::ResetHint::Get(global); auto defOld = GetRTDefaults(init); auto defNew = GetRTDefaults(global); const mfxExtEncoderResetOption* pResetOpt = ExtBuffer::Get(par); const mfxExtHEVCParam (&hevcPar)[2] = { ExtBuffer::Get(parOld), ExtBuffer::Get(parNew) }; MFX_CHECK(hevcPar[0].LCUSize == hevcPar[1].LCUSize, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); // LCU Size Can't be changed MFX_CHECK(parOld.AsyncDepth == parNew.AsyncDepth, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.GopRefDist >= parNew.mfx.GopRefDist, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.NumRefFrame >= parNew.mfx.NumRefFrame, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.RateControlMethod == parNew.mfx.RateControlMethod, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.mfx.FrameInfo.ChromaFormat == parNew.mfx.FrameInfo.ChromaFormat, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(parOld.IOPattern == parNew.IOPattern, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(local.Contains(Tmp::RecInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto recOld = Glob::AllocRec::Get(init).GetInfo(); auto& recNew = Tmp::RecInfo::Get(local).Info; MFX_CHECK(recOld.Width >= recNew.Width, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(recOld.Height >= recNew.Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(recOld.FourCC == recNew.FourCC, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK( !( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) ||( (mfxU32)InitialDelayInKB(parOld.mfx) == (mfxU32)InitialDelayInKB(parNew.mfx) && (mfxU32)BufferSizeInKB(parOld.mfx) == (mfxU32)BufferSizeInKB(parNew.mfx)) , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); mfxU32 tempLayerIdx = 0; bool changeTScalLayers = false; bool isIdrRequired = false; // check if change of temporal scalability required by new parameters auto numTlOld = defOld.base.GetNumTemporalLayers(defOld); auto numTlNew = defNew.base.GetNumTemporalLayers(defNew); bool bTlActive = numTlOld > 1 && numTlNew > 1; if (bTlActive) { // calculate temporal layer for next frame mfxGopHints GopHints = {}; tempLayerIdx = defOld.base.GetTId(defOld, m_frameOrder + 1, GopHints); changeTScalLayers = numTlOld != numTlNew; } // check if IDR required after change of encoding parameters const mfxExtCodingOption2(&CO2)[2] = { ExtBuffer::Get(parOld), ExtBuffer::Get(parNew) }; isIdrRequired = (hint.Flags & RF_SPS_CHANGED) || (hint.Flags & RF_IDR_REQUIRED) || (tempLayerIdx != 0 && changeTScalLayers) || parOld.mfx.GopPicSize != parNew.mfx.GopPicSize || CO2[0].IntRefType != CO2[1].IntRefType; hint.Flags |= RF_IDR_REQUIRED * isIdrRequired; MFX_CHECK(!isIdrRequired || !(pResetOpt && IsOff(pResetOpt->StartNewSequence)) , MFX_ERR_INVALID_VIDEO_PARAM); // Reset can't change parameters w/o IDR. Report an error bool brcReset = ( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && ( (mfxU32)TargetKbps(parOld.mfx) != (mfxU32)TargetKbps(parNew.mfx) || (mfxU32)BufferSizeInKB(parOld.mfx) != (mfxU32)BufferSizeInKB(parNew.mfx) || (mfxU32)InitialDelayInKB(parOld.mfx) != (mfxU32)InitialDelayInKB(parNew.mfx) || parOld.mfx.FrameInfo.FrameRateExtN != parNew.mfx.FrameInfo.FrameRateExtN || parOld.mfx.FrameInfo.FrameRateExtD != parNew.mfx.FrameInfo.FrameRateExtD); brcReset |= ( parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && ((mfxU32)MaxKbps(parOld.mfx) != (mfxU32)MaxKbps(parNew.mfx)); const mfxExtCodingOption(&CO)[2] = { ExtBuffer::Get(parOld), ExtBuffer::Get(parNew) }; bool HRDConformance = !(IsOff(CO[1].NalHrdConformance) || IsOff(CO[1].VuiNalHrdParameters)); MFX_CHECK( !( brcReset && parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR && HRDConformance) , MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); hint.Flags |= RF_BRC_RESET * (brcReset || isIdrRequired); return MFX_ERR_NONE; }); } void Legacy::ResetState(const FeatureBlocks& blocks, TPushRS Push) { Push(BLK_ResetState , [this, &blocks]( StorageRW& global , StorageRW&) -> mfxStatus { auto& real = Glob::RealState::Get(global); auto& parInt = Glob::VideoParam::Get(real); auto& parNew = Glob::VideoParam::Get(global); auto& hint = Glob::ResetHint::Get(global); CopyConfigurable(blocks, parNew, parInt); Glob::VPS::Get(real) = Glob::VPS::Get(global); Glob::SPS::Get(real) = Glob::SPS::Get(global); Glob::PPS::Get(real) = Glob::PPS::Get(global); Glob::SliceInfo::Get(real) = Glob::SliceInfo::Get(global); m_forceHeaders |= !!(hint.Flags & RF_PPS_CHANGED) * INSERT_PPS; MFX_CHECK(hint.Flags & RF_IDR_REQUIRED, MFX_ERR_NONE); Glob::AllocRec::Get(real).UnlockAll(); Glob::AllocBS::Get(real).UnlockAll(); if (real.Contains(Glob::AllocMBQP::Key)) Glob::AllocMBQP::Get(real).UnlockAll(); if (real.Contains(Glob::AllocRaw::Key)) Glob::AllocRaw::Get(real).UnlockAll(); ResetState(); return MFX_ERR_NONE; }); } void Legacy::FrameSubmit(const FeatureBlocks& /*blocks*/, TPushFS Push) { Push(BLK_CheckSurf , []( const mfxEncodeCtrl* /*pCtrl*/ , const mfxFrameSurface1* pSurf , mfxBitstream& /*bs*/ , StorageW& global , StorageRW& /*local*/) -> mfxStatus { MFX_CHECK(pSurf, MFX_ERR_NONE); auto& par = Glob::VideoParam::Get(global); MFX_CHECK(LumaIsNull(pSurf) == (pSurf->Data.UV == 0), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(pSurf->Info.Width >= par.mfx.FrameInfo.Width, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(pSurf->Info.Height >= par.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; }); Push(BLK_CheckBS , []( const mfxEncodeCtrl* /*pCtrl*/ , const mfxFrameSurface1* /*pSurf*/ , mfxBitstream& bs , StorageW& global , StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); BsDataInfo bsData = {}; bsData.Data = bs.Data; bsData.DataLength = bs.DataLength; bsData.DataOffset = bs.DataOffset; bsData.MaxLength = bs.MaxLength; if (local.Contains(Tmp::BsDataInfo::Key)) bsData = Tmp::BsDataInfo::Get(local); MFX_CHECK(bsData.DataOffset <= bsData.MaxLength, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(bsData.DataOffset + bsData.DataLength + BufferSizeInKB(par.mfx) * 1000u <= bsData.MaxLength, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK_NULL_PTR1(bsData.Data); return MFX_ERR_NONE; }); } void Legacy::AllocTask(const FeatureBlocks& /*blocks*/, TPushAT Push) { Push(BLK_AllocTask , []( StorageR& /*global*/ , StorageRW& task) -> mfxStatus { task.Insert(Task::Common::Key, new Task::Common::TRef); task.Insert(Task::SSH::Key, new MakeStorable); return MFX_ERR_NONE; }); } void Legacy::InitTask(const FeatureBlocks& /*blocks*/, TPushIT Push) { Push(BLK_InitTask , [this]( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& global , StorageW& task) -> mfxStatus { auto& core = Glob::VideoCore::Get(global); auto& tpar = Task::Common::Get(task); auto stage = tpar.stage; tpar = TaskCommonPar(); tpar.stage = stage; tpar.pBsOut = pBs; MFX_CHECK(pSurf, MFX_ERR_NONE); tpar.pSurfIn = pSurf; if (pCtrl) { tpar.ctrl = *pCtrl; } tpar.pSurfReal = tpar.pSurfIn; core.IncreaseReference(*tpar.pSurfIn); auto dflts = GetRTDefaults(global); m_frameOrder = dflts.base.GetFrameOrder(dflts, task, m_frameOrder); tpar.DisplayOrder = m_frameOrder; return MFX_ERR_NONE; }); } void Legacy::PreReorderTask(const FeatureBlocks& /*blocks*/, TPushPreRT Push) { Push(BLK_PrepareTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto dflts = GetRTDefaults(global); auto sts = dflts.base.GetPreReorderInfo( dflts, task, task.pSurfIn, &task.ctrl, { LastKeyFrameInfo.lastIDROrder, LastKeyFrameInfo.lastIPOrder, m_prevTask.LastKeyFrameInfo.lastIPoc}, task.DisplayOrder, task.GopHints); MFX_CHECK_STS(sts); if (par.mfx.EncodedOrder) { auto BufferSize = Glob::Reorder::Get(global).BufferSize; auto MaxReorder = Glob::Reorder::Get(global).MaxReorder; bool bFrameFromPast = task.DisplayOrder && (task.DisplayOrder < m_prevTask.DisplayOrder); MFX_CHECK(!bFrameFromPast || ((m_prevTask.DisplayOrder - task.DisplayOrder) <= MaxReorder), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(task.DisplayOrder <= (m_prevTask.EncodedOrder + 1 + BufferSize), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(isValid(m_prevTask.DPB.After[0]) || IsIdr(task.FrameType), MFX_ERR_UNDEFINED_BEHAVIOR); } task.LastKeyFrameInfo = m_prevTask.LastKeyFrameInfo; SetIf(LastKeyFrameInfo.lastIDROrder, IsIdr(task.FrameType), task.DisplayOrder); SetIf(task.LastKeyFrameInfo.lastIPoc, IsI(task.FrameType), task.POC); SetIf(LastKeyFrameInfo.lastIPOrder, IsI(task.FrameType) || IsP(task.FrameType), task.DisplayOrder); return MFX_ERR_NONE; }); } void Legacy::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_ConfigureTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); if (global.Contains(Glob::AllocRaw::Key)) { task.Raw = Glob::AllocRaw::Get(global).Acquire(); MFX_CHECK(task.Raw.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); } task.Rec = Glob::AllocRec::Get(global).Acquire(); task.BS = Glob::AllocBS::Get(global).Acquire(); MFX_CHECK(task.BS.Idx != IDX_INVALID, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(task.Rec.Idx != IDX_INVALID, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(task.Rec.Mid && task.BS.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); auto& par = Glob::VideoParam::Get(global); auto& sps = Glob::SPS::Get(global); auto& pps = Glob::PPS::Get(global); auto def = GetRTDefaults(global); ConfigureTask(task, def, sps); auto sts = GetSliceHeader(par, task, sps, pps, Task::SSH::Get(s_task)); MFX_CHECK_STS(sts); return sts; }); } void Legacy::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SkipFrame , []( StorageW& global , StorageW& s_task) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); bool bCheckSkip = !task.bSkip && IsB(task.FrameType) && !task.isLDB && IsSWBRC(par); auto& allocRec = Glob::AllocRec::Get(global); task.bSkip |= bCheckSkip && !!(allocRec.GetFlag(task.DPB.Active[task.RefPicList[1][0]].Rec.Idx) & REC_SKIPPED); MFX_CHECK(task.bSkip, MFX_ERR_NONE); task.bForceSync = true; if (IsI(task.FrameType)) { MFX_CHECK( par.mfx.FrameInfo.FourCC == MFX_FOURCC_NV12 || par.mfx.FrameInfo.FourCC == MFX_FOURCC_P010 , MFX_ERR_UNDEFINED_BEHAVIOR); FrameLocker raw(Glob::VideoCore::Get(global), task.Raw.Mid); mfxU32 size = raw.Pitch * par.mfx.FrameInfo.Height; int UVFiller = (par.mfx.FrameInfo.FourCC == MFX_FOURCC_NV12) * 126; memset(raw.Y, 0, size); memset(raw.UV, UVFiller, size >> 1); allocRec.SetFlag(task.Rec.Idx, REC_SKIPPED); return MFX_ERR_NONE; } auto& core = Glob::VideoCore::Get(global); bool bL1 = (IsB(task.FrameType) && !task.isLDB && task.NumRefActive[1] && !task.b2ndField); auto idx = task.RefPicList[bL1][0]; mfxFrameSurface1 surfSrc = {}; mfxFrameSurface1 surfDst = {}; surfSrc.Info = par.mfx.FrameInfo; surfDst.Info = allocRec.GetInfo(); MFX_CHECK(!memcmp(&surfSrc.Info, &surfDst.Info, sizeof(mfxFrameInfo)), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(idx < MAX_DPB_SIZE, MFX_ERR_UNDEFINED_BEHAVIOR); auto& ref = task.DPB.Active[idx]; allocRec.SetFlag(task.Rec.Idx, REC_SKIPPED); MFX_CHECK(allocRec.GetFlag(ref.Rec.Idx) & REC_READY, MFX_ERR_NONE); surfSrc.Data.MemId = ref.Rec.Mid; surfDst.Data.MemId = task.Raw.Mid; mfxStatus sts = core.DoFastCopyWrapper( &surfDst, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE, &surfSrc, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE); MFX_CHECK_STS(sts); allocRec.SetFlag(ref.Rec.Idx, REC_SKIPPED * !!idx); return MFX_ERR_NONE; }); Push(BLK_GetRawHDL , []( StorageW& global , StorageW& s_task) -> mfxStatus { auto& core = Glob::VideoCore::Get(global); auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); bool bInternalFrame = par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || (IsD3D9Simulation(Glob::VideoCore::Get(global)) && (par.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY)) || task.bSkip; mfxFrameSurface1* surface = task.pSurfReal; bool bIntAlloc = surface && (surface->Data.MemType & MFX_MEMTYPE_INTERNAL_FRAME); // Video memory internal allocation MFX_CHECK(!(bIntAlloc && par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY), core.GetFrameHDL(*task.pSurfReal, task.HDLRaw)); // System memory MFX_CHECK(!(bInternalFrame || bIntAlloc), core.GetFrameHDL(task.Raw.Mid, &task.HDLRaw.first)); // Video memory external allocation MFX_CHECK(par.IOPattern != MFX_IOPATTERN_IN_VIDEO_MEMORY , core.GetExternalFrameHDL(*task.pSurfReal, task.HDLRaw)); return core.GetFrameHDL(task.pSurfReal->Data.MemId, &task.HDLRaw.first); }); Push(BLK_CopySysToRaw , [this]( StorageW& global , StorageW& s_task)->mfxStatus { auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto dflts = GetRTDefaults(global); bool videoMemory = (par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY && !IsD3D9Simulation(Glob::VideoCore::Get(global))); MFX_CHECK(!(task.bSkip || videoMemory), MFX_ERR_NONE); mfxFrameSurface1 surfSrc = MakeSurface(par.mfx.FrameInfo, *task.pSurfReal); mfxFrameSurface1 surfDst = MakeSurface(par.mfx.FrameInfo, task.Raw.Mid); surfDst.Info.Shift = surfDst.Info.FourCC == MFX_FOURCC_P010 || surfDst.Info.FourCC == MFX_FOURCC_Y210; // convert to native shift in core.CopyFrame() if required mfxU16 inMemType = static_cast((par.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); return dflts.base.RunFastCopyWrapper( surfDst, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_FROM_ENCODE, surfSrc, inMemType); }); Push(BLK_FillCUQPSurf , [this]( StorageW& global , StorageW& s_task)->mfxStatus { auto& task = Task::Common::Get(s_task); auto& par = Glob::VideoParam::Get(global); auto& caps = Glob::EncodeCaps::Get(global); auto mode = GetMBQPMode(caps, par); MFX_CHECK(mode == MBQPMode_ExternalMap || mode == MBQPMode_ForROI, MFX_ERR_NONE); std::unique_ptr qpMap = nullptr; auto& mapInfo = Glob::MBQPAllocInfo::Get(global); const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); if (!task.CUQP.Mid) { task.CUQP = Glob::AllocMBQP::Get(global).Acquire(); MFX_CHECK(task.CUQP.Mid, MFX_ERR_UNDEFINED_BEHAVIOR); } auto& core = Glob::VideoCore::Get(global); qpMap = std::make_unique (core, task.CUQP.Mid); if (mode == MBQPMode_ExternalMap) { mfxExtMBQP* mbqpExt = ExtBuffer::Get(task.ctrl); MFX_CHECK(mbqpExt, MFX_ERR_NONE); mfxStatus sts = FillCUQPData(mbqpExt, HEVCParam.PicWidthInLumaSamples, HEVCParam.PicHeightInLumaSamples, (mfxI8*)qpMap->Y, mapInfo.pitch, mapInfo.height_aligned, mapInfo.block_width, mapInfo.block_height); MFX_CHECK_STS(sts); } else { mfxExtEncoderROI* roi = ExtBuffer::Get(task.ctrl); MFX_CHECK(roi, MFX_ERR_NONE); // TO DO: it must be called after GetCtrl block mfxStatus sts = FillMBMapViaROI(*roi, (mfxI8*)qpMap->Y, mapInfo.Info.Width, mapInfo.Info.Height, mapInfo.pitch, mapInfo.block_width, mapInfo.block_height, task.QpY); MFX_CHECK_STS(sts); } task.bCUQPMap = true; return MFX_ERR_NONE; }); } void Legacy::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_CopyBS , [](StorageW& global, StorageW& s_task) -> mfxStatus { PERF_UTILITY_AUTO("BLK_CopyBS", PERF_LEVEL_INTERNAL); auto& task = Task::Common::Get(s_task); if (!task.pBsData) { auto& bs = *task.pBsOut; task.pBsData = bs.Data + bs.DataOffset + bs.DataLength; task.pBsDataLength = &bs.DataLength; task.BsBytesAvailable = bs.MaxLength - bs.DataOffset - bs.DataLength; } MFX_CHECK(task.BsDataLength, MFX_ERR_NONE); mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(task.BsBytesAvailable >= task.BsDataLength, MFX_ERR_NOT_ENOUGH_BUFFER); FrameLocker codedFrame(Glob::VideoCore::Get(global), task.BS.Mid); MFX_CHECK(codedFrame.Y, MFX_ERR_LOCK_MEMORY); sts = FastCopy::Copy( task.pBsData , task.BsDataLength , codedFrame.Y , codedFrame.Pitch , { int(task.BsDataLength), 1 } , COPY_VIDEO_TO_SYS); MFX_CHECK_STS(sts); task.BsBytesAvailable -= task.BsDataLength; return MFX_ERR_NONE; }); Push(BLK_DoPadding , [](StorageW& /*global*/, StorageW& s_task) -> mfxStatus { PERF_UTILITY_AUTO("BLK_DoPadding", PERF_LEVEL_INTERNAL); auto& task = Task::Common::Get(s_task); MFX_CHECK(task.MinFrameSize >= task.BsDataLength, MFX_ERR_NONE); MFX_CHECK(!task.bDontPatchBS, MFX_ERR_UNDEFINED_BEHAVIOR); mfxU32 padding = task.MinFrameSize - task.BsDataLength; MFX_CHECK(task.BsBytesAvailable >= padding, MFX_ERR_NOT_ENOUGH_BUFFER); memset(task.pBsData + task.BsDataLength, 0, padding); task.BsDataLength += padding; task.BsBytesAvailable -= padding; return MFX_ERR_NONE; }); Push(BLK_UpdateBsInfo , [](StorageW& global, StorageW& s_task) -> mfxStatus { const auto& par = Glob::VideoParam::Get(global); auto& task = Task::Common::Get(s_task); auto& sps = Glob::SPS::Get(global); auto& bs = *task.pBsOut; mfxI32 dpbOutputDelay = task.DisplayOrder + sps.sub_layer[sps.max_sub_layers_minus1].max_num_reorder_pics - task.EncodedOrder; bs.TimeStamp = task.pSurfIn->Data.TimeStamp; bs.DecodeTimeStamp = MFX_TIMESTAMP_UNKNOWN; if (bs.TimeStamp != mfxU64(MFX_TIMESTAMP_UNKNOWN)) { mfxF64 tcDuration90KHz = (mfxF64)par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN * 90000; bs.DecodeTimeStamp = mfxI64(bs.TimeStamp - tcDuration90KHz * dpbOutputDelay); } bs.PicStruct = task.pSurfIn->Info.PicStruct; bs.FrameType = task.FrameType; bs.FrameType &= ~(task.isLDB * MFX_FRAMETYPE_B); bs.FrameType |= task.isLDB * MFX_FRAMETYPE_P; *task.pBsDataLength += task.BsDataLength; return MFX_ERR_NONE; }); } inline bool ReleaseResource(IAllocation& a, Resource& r) { if (r.Mid) { a.Release(r.Idx); r = Resource(); return true; } return r.Idx == IDX_INVALID; } void Legacy::FreeTask(const FeatureBlocks& /*blocks*/, TPushFT Push) { Push(BLK_FreeTask , [](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); auto& core = Glob::VideoCore::Get(global); ThrowAssert( !ReleaseResource(Glob::AllocBS::Get(global), task.BS) , "task.BS resource is invalid"); ThrowAssert( global.Contains(Glob::AllocMBQP::Key) && !ReleaseResource(Glob::AllocMBQP::Get(global), task.CUQP) , "task.CUQP resource is invalid"); ThrowAssert( global.Contains(Glob::AllocRaw::Key) && !ReleaseResource(Glob::AllocRaw::Get(global), task.Raw) , "task.Raw resource is invalid"); SetIf(task.pSurfIn, task.pSurfIn && !core.DecreaseReference(*task.pSurfIn), nullptr); ThrowAssert(!!task.pSurfIn, "failed in core.DecreaseReference"); auto& atrRec = Glob::AllocRec::Get(global); if (task.Rec.Idx != IDX_INVALID) atrRec.SetFlag(task.Rec.Idx, REC_READY); ThrowAssert( !IsRef(task.FrameType) && !ReleaseResource(atrRec, task.Rec) , "task.Rec resource is invalid"); auto pDPBBeforeEnd = std::find_if_not( task.DPB.Before, task.DPB.Before + mfx::size(task.DPB.Before), isValid); auto pDPBAfterEnd = std::find_if_not( task.DPB.After, task.DPB.After + mfx::size(task.DPB.After), isValid); auto DPBFrameReleaseVerify = [&](DpbFrame& ref) { auto IsSameRecIdx = [&](DpbFrame& refA) { return refA.Rec.Idx == ref.Rec.Idx; }; return pDPBAfterEnd != std::find_if(task.DPB.After, pDPBAfterEnd, IsSameRecIdx) || ReleaseResource(atrRec, ref.Rec); }; auto nDPBFramesValid = std::count_if(task.DPB.Before, pDPBBeforeEnd, DPBFrameReleaseVerify); ThrowAssert(nDPBFramesValid != (pDPBBeforeEnd - task.DPB.Before), "task.DPB.Before is invalid"); return MFX_ERR_NONE; }); } void Legacy::GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) { Push(BLK_CopyConfigurable , [this, &blocks](mfxVideoParam& out, StorageR& global) -> mfxStatus { return CopyConfigurable(blocks, Glob::VideoParam::Get(global), out); }); } IntraRefreshState GetIntraRefreshState( const ExtBuffer::Param & par , const mfxEncodeCtrl& ctrl , mfxU32 frameOrderInGopDispOrder , mfxU32 IntraRefreshBlockUnitSize) { IntraRefreshState state={}; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); const mfxExtCodingOption2* pCO2RT = ExtBuffer::Get(ctrl); mfxU32 refreshPeriod = std::max(CO3.IntRefCycleDist + (!CO3.IntRefCycleDist * CO2.IntRefCycleSize), 1); mfxU32 offsetFromStartOfGop = std::max(!!CO3.IntRefCycleDist * refreshPeriod, 1); // 1st refresh cycle in GOP starts with offset mfxI32 frameOrderMinusOffset = frameOrderInGopDispOrder - offsetFromStartOfGop; mfxU32 frameOrderInRefreshPeriod = frameOrderMinusOffset % refreshPeriod; state.firstFrameInCycle = false; bool bNoUpdate = CO2.IntRefType == 0 || frameOrderMinusOffset < 0 // too early to start refresh || frameOrderInRefreshPeriod >= CO2.IntRefCycleSize; // for current refresh period refresh cycle is already passed if (bNoUpdate) return state; mfxU32 IRBlockSize = 1 << (3 + IntraRefreshBlockUnitSize); // refreshing parts (stripes) in frame mfxU32 refreshDimension = CO2.IntRefType == MFX_REFRESH_HORIZONTAL ? mfx::CeilDiv(HEVCParam.PicHeightInLumaSamples, IRBlockSize) : mfx::CeilDiv(HEVCParam.PicWidthInLumaSamples, IRBlockSize); // In most cases number of refresh stripes is no aligned with number of frames for refresh. // In head frames are refreshed min stripes (can be 0), in tail min+1 // min * head + (min+1) * tail == min * frames + tail == refreshDimension mfxU32 frames = CO2.IntRefCycleSize; // frames to commit full refresh mfxU32 minStr = refreshDimension / frames; // minimal refreshed stripes mfxU32 tail = refreshDimension % frames; // tail frames have minStr+1 stripes mfxU32 head = frames - tail; // head frames with minStr stripes if (frameOrderInRefreshPeriod < head) // min, can be 0 { if (!minStr) return state; // actual refresh isn't started yet within current refresh cycle, no Intra column/row required for current frame state.IntraSize = (mfxU16)minStr; state.IntraLocation = (mfxU16)(frameOrderInRefreshPeriod * minStr); } else { state.IntraSize = (mfxU16)(minStr + 1); state.IntraLocation = (mfxU16)(frameOrderInRefreshPeriod * minStr + (frameOrderInRefreshPeriod - head)); } state.firstFrameInCycle = (frameOrderInRefreshPeriod == 0); state.refrType = CO2.IntRefType; // set QP for Intra macroblocks within refreshing line state.IntRefQPDelta = CO2.IntRefQPDelta; bool bUpdateQPDelta = pCO2RT && pCO2RT->IntRefQPDelta <= 51 && pCO2RT->IntRefQPDelta >= -51; if (bUpdateQPDelta) state.IntRefQPDelta = pCO2RT->IntRefQPDelta; return state; } mfxU8 GetCodingType(const TaskCommonPar & task) { const mfxU8 I = 1; // I picture. const mfxU8 P = 2; // P or GPB picture at base temporal level. const mfxU8 B = 3; // P, GPB or B picture at temporal level 1. const mfxU8 B1 = 4; // P, GPB or B picture at temporal level 2. const mfxU8 B2 = 5; // P, GPB or B picture at temporal level 3. auto IsBX = [&](mfxU8 idx) { auto& ref = task.DPB.Active[idx]; return !ref.isLDB && ref.CodingType > B; }; auto IsB0 = [&](mfxU8 idx) { auto& ref = task.DPB.Active[idx]; return !ref.isLDB && ref.CodingType == B; }; mfxU8 type = 0; type += I * IsI(task.FrameType); type += P * (!type && IsP(task.FrameType)); type += B * (!type && task.isLDB); type += B2 * (!type && std::any_of(task.RefPicList[0], task.RefPicList[0] + task.NumRefActive[0], IsBX)); type += B2 * (!type && std::any_of(task.RefPicList[1], task.RefPicList[1] + task.NumRefActive[1], IsBX)); type += B1 * (!type && std::any_of(task.RefPicList[0], task.RefPicList[0] + task.NumRefActive[0], IsB0)); type += B1 * (!type && std::any_of(task.RefPicList[1], task.RefPicList[1] + task.NumRefActive[1], IsB0)); type += B * !type; return type; } class SkipMode { private: eSkipMode m_mode; mfxU32 m_cmd; void SetCMD() { m_cmd = 0; m_cmd |= NeedInputReplacement() * SKIPCMD_NeedInputReplacement; m_cmd |= NeedDriverCall() * SKIPCMD_NeedDriverCall; m_cmd |= NeedSkipSliceGen() * SKIPCMD_NeedSkipSliceGen; m_cmd |= NeedCurrentFrameSkipping() * SKIPCMD_NeedCurrentFrameSkipping; m_cmd |= NeedNumSkipAdding() * SKIPCMD_NeedNumSkipAdding; } public: SkipMode(eSkipMode mode = SKIPFRAME_NO) : m_mode(mode) { SetCMD(); } SkipMode(mfxU16 mode, bool bProtected) { SetMode(mode, bProtected); } void SetMode(mfxU16 skipModeMFX, bool bProtected) { m_mode = eSkipMode( SKIPFRAME_INSERT_DUMMY_PROTECTED * (skipModeMFX == MFX_SKIPFRAME_INSERT_DUMMY && bProtected) + SKIPFRAME_INSERT_DUMMY * (skipModeMFX == MFX_SKIPFRAME_INSERT_DUMMY && !bProtected) + SKIPFRAME_INSERT_NOTHING * (skipModeMFX == MFX_SKIPFRAME_INSERT_NOTHING) + SKIPFRAME_BRC_ONLY * (skipModeMFX == MFX_SKIPFRAME_BRC_ONLY)); SetCMD(); } void SetPseudoSkip() { m_mode = SKIPFRAME_EXT_PSEUDO; } eSkipMode GetMode() { return m_mode; } mfxU32 GetCMD() { return m_cmd; } bool NeedInputReplacement() { return m_mode == SKIPFRAME_EXT_PSEUDO; } bool NeedDriverCall() { return m_mode == SKIPFRAME_INSERT_DUMMY_PROTECTED || m_mode == SKIPFRAME_EXT_PSEUDO || m_mode == SKIPFRAME_NO || m_mode == SKIPFRAME_EXT_PSEUDO; } bool NeedSkipSliceGen() { return m_mode == SKIPFRAME_INSERT_DUMMY_PROTECTED || m_mode == SKIPFRAME_INSERT_DUMMY; } bool NeedCurrentFrameSkipping() { return m_mode == SKIPFRAME_INSERT_DUMMY_PROTECTED || m_mode == SKIPFRAME_INSERT_DUMMY || m_mode == SKIPFRAME_INSERT_NOTHING; } bool NeedNumSkipAdding() { return m_mode == SKIPFRAME_BRC_ONLY; } }; static void SetTaskQpY( TaskCommonPar & task , const ExtBuffer::Param & par , const SPS& sps , const Defaults::Param& dflts) { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const mfxU8 maxQP = mfxU8(51 + 6 * (CO3.TargetBitDepthLuma - 8)); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { task.QpY = 0; return; } bool bUseQPP = IsP(task.FrameType) || task.isLDB; bool bUseQPB = !bUseQPP && IsB(task.FrameType); bool bUseQPOffset = (bUseQPB && CO2.BRefType == MFX_B_REF_PYRAMID) || (bUseQPP && CO3.PRefType == MFX_P_REF_PYRAMID); // set coding type and QP if (bUseQPB) { task.QpY = (mfxI8)par.mfx.QPB; if (bUseQPOffset) { task.QpY = (mfxI8)mfx::clamp( CO3.QPOffset[mfx::clamp(task.PyramidLevel - 1, 0, 7)] + task.QpY , 1, maxQP); } } else if (bUseQPP) { // encode P as GPB task.QpY = (mfxI8)par.mfx.QPP; if (dflts.base.GetNumTemporalLayers(dflts) > 1) { task.QpY = (mfxI8)mfx::clamp(CO3.QPOffset[task.TemporalID] + task.QpY, 1, maxQP); } else if (bUseQPOffset) { task.QpY = (mfxI8)mfx::clamp( CO3.QPOffset[std::min(task.PyramidLevel, mfx::size(CO3.QPOffset) - 1)] + task.QpY , 1, maxQP); } } else { assert(IsI(task.FrameType)); task.QpY = (mfxI8)par.mfx.QPI; } SetIf(task.QpY, !!task.ctrl.QP, (mfxI8)task.ctrl.QP); task.QpY -= 6 * sps.bit_depth_luma_minus8; task.QpY &= 0xff * !(task.QpY < 0 && IsOn(par.mfx.LowPower)); } void Legacy::ConfigureTask( TaskCommonPar & task , const Defaults::Param& dflts , const SPS& sps) { auto& par = dflts.mvp; const mfxExtCodingOption& CO = ExtBuffer::Get(par); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); const bool isI = IsI(task.FrameType); const bool isP = IsP(task.FrameType); const bool isIDR = IsIdr(task.FrameType); mfxExtAVCRefLists* pExtLists = ExtBuffer::Get(task.ctrl); mfxExtAVCRefListCtrl* pExtListCtrl = ExtBuffer::Get(task.ctrl); { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(task.ctrl); SkipMode mode; SetDefault(pCO2, &CO2); mode.SetMode(mfxU16(!!task.ctrl.SkipFrame * pCO2->SkipFrame), !!par.Protected); task.FrameType &= ~(MFX_FRAMETYPE_REF * (mode.NeedCurrentFrameSkipping() && par.mfx.GopRefDist == 1 && isP)); if (IsRef(task.FrameType)) { task.ctrl.SkipFrame = 0; mode.SetMode(MFX_SKIPFRAME_NO_SKIP, !!par.Protected); } task.SkipCMD = mode.GetCMD(); } task.ctrl.MfxNalUnitType &= 0xffff * IsOn(CO3.EnableNalUnitType); const mfxExtMBQP *pMBQP = ExtBuffer::Get(task.ctrl); task.bCUQPMap |= (IsOn(CO3.EnableMBQP) && pMBQP && pMBQP->NumQPAlloc > 0); // Do not use IsMBQP() bool bUpdateIRState = task.TemporalID == 0 && CO2.IntRefType; if (bUpdateIRState) { m_baseLayerOrder *= !isI; task.IRState = GetIntraRefreshState( par, task.ctrl, m_baseLayerOrder++, dflts.caps.IntraRefreshBlockUnitSize); } if (IsTCBRC(par, dflts.caps.TCBRCSupport) && task.TCBRCTargetFrameSize == 0) { ThrowAssert(par.mfx.FrameInfo.FrameRateExtD == 0, "FrameRateExtD = 0"); mfxU32 AvgFrameSizeInBytes = mfxU32(1000.0 / 8.0*(par.mfx.TargetKbps) * std::max(par.mfx.BRCParamMultiplier,1) / (mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD)); task.TCBRCTargetFrameSize = AvgFrameSizeInBytes; } mfxU32 needRecoveryPointSei = (CO.RecoveryPointSEI == MFX_CODINGOPTION_ON && ( (CO2.IntRefType && task.IRState.firstFrameInCycle && task.IRState.IntraLocation == 0) || (CO2.IntRefType == 0 && isI))); mfxU32 needCpbRemovalDelay = isIDR || needRecoveryPointSei; const bool isRef = IsRef(task.FrameType); // encode P as GPB task.isLDB = IsOn(CO3.GPB) && isP; task.FrameType &= ~(MFX_FRAMETYPE_P * task.isLDB); task.FrameType |= (MFX_FRAMETYPE_B * task.isLDB); task.LastKeyFrameInfo = m_prevTask.LastKeyFrameInfo; task.PrevRAP = m_prevTask.PrevRAP; task.EncodedOrder = m_prevTask.EncodedOrder + 1; InitDPB(task, m_prevTask, pExtListCtrl); //construct ref lists std::tie(task.NumRefActive[0], task.NumRefActive[1]) = dflts.base.GetFrameNumRefActive(dflts, task); if (!isI) { ConstructRPL(dflts, task.DPB.Active, task, task.RefPicList, task.NumRefActive, pExtLists, pExtListCtrl); } SetTaskQpY(task, par, sps, dflts); task.CodingType = GetCodingType(task); task.InsertHeaders |= m_forceHeaders; m_forceHeaders = 0; task.InsertHeaders |= (INSERT_VPS | INSERT_SPS | INSERT_PPS) * isIDR; task.InsertHeaders |= INSERT_BPSEI * (needCpbRemovalDelay && sps.vui.hrd_parameters_present_flag ); task.InsertHeaders |= INSERT_PTSEI * (sps.vui.frame_field_info_present_flag || sps.vui.hrd.nal_hrd_parameters_present_flag || sps.vui.hrd.vcl_hrd_parameters_present_flag); task.InsertHeaders |= INSERT_PPS * IsOn(CO2.RepeatPPS); task.InsertHeaders |= INSERT_AUD * IsOn(CO.AUDelimiter); // update dpb std::copy(task.DPB.Active, task.DPB.Active + mfx::size(task.DPB.Active), task.DPB.After); Remove(task.DPB.After, 0, MAX_DPB_SIZE * isIDR); if (isRef) { task.LastKeyFrameInfo.lastIPoc = isI * task.POC + !isI * task.LastKeyFrameInfo.lastIPoc; UpdateDPB(dflts, task, task.DPB.After, pExtListCtrl); using TRLtrDesc = decltype(pExtListCtrl->LongTermRefList[0]); auto IsCurFrame = [&](TRLtrDesc ltr) { return ltr.FrameOrder == task.DisplayOrder; }; task.isLTR |= pExtListCtrl && std::any_of( std::begin(pExtListCtrl->LongTermRefList) , std::end(pExtListCtrl->LongTermRefList) , IsCurFrame); } task.SliceNUT = dflts.base.GetSHNUT(dflts, task, true); bool bRAP = task.SliceNUT == CRA_NUT || task.SliceNUT == IDR_W_RADL || task.SliceNUT == IDR_N_LP; task.PrevRAP = bRAP * task.POC + !bRAP * task.PrevRAP; task.StatusReportId = std::max(1, m_prevTask.StatusReportId + 1); task.bForceSync = !!(task.InsertHeaders & INSERT_BPSEI); if (task.FrameType & MFX_FRAMETYPE_I) { task.m_minQP = CO2.MinQPI; task.m_maxQP = CO2.MaxQPI; } else if (task.FrameType & MFX_FRAMETYPE_P) { task.m_minQP = CO2.MinQPP; task.m_maxQP = CO2.MaxQPP; } else if (task.FrameType & MFX_FRAMETYPE_B) { task.m_minQP = CO2.MinQPB; task.m_maxQP = CO2.MaxQPB; } m_prevTask = task; } static mfxU32 CountL1(DpbArray const & dpb, mfxI32 poc) { mfxU32 c = 0; for (mfxU32 i = 0; !isDpbEnd(dpb, i); i++) c += dpb[i].POC > poc; return c; } static mfxU32 GetEncodingOrder( mfxU32 displayOrder , mfxU32 begin , mfxU32 end , mfxU32 &level , mfxU32 before , bool & ref) { assert(displayOrder >= begin); assert(displayOrder < end); ref = (end - begin > 1); mfxU32 pivot = (begin + end) / 2; if (displayOrder == pivot) return level + before; level++; if (displayOrder < pivot) return GetEncodingOrder(displayOrder, begin, pivot, level, before, ref); else return GetEncodingOrder(displayOrder, pivot + 1, end, level, before + pivot - begin, ref); } mfxU32 Legacy::GetBiFrameLocation(mfxU32 i, mfxU32 num, bool &ref, mfxU32 &level) { ref = false; level = 1; return GetEncodingOrder(i, 0, num, level, 0, ref); } Legacy::TItWrapIt Legacy::BPyrReorder(TItWrapIt begin, TItWrapIt end) { using TRef = std::iterator_traits::reference; mfxU32 num = mfxU32(std::distance(begin, end)); bool bSetOrder = num && (*begin)->BPyramidOrder == mfxU32(MFX_FRAMEORDER_UNKNOWN); if (bSetOrder) { mfxU32 i = 0; std::for_each(begin, end, [&](TRef bref) { bool bRef = false; bref->BPyramidOrder = Legacy::GetBiFrameLocation(i++, num, bRef, bref->PyramidLevel); bref->FrameType |= mfxU16(MFX_FRAMETYPE_REF * bRef); }); } return std::min_element(begin, end , [](TRef a, TRef b) { return a->BPyramidOrder < b->BPyramidOrder; }); } Legacy::TItWrap Legacy::Reorder( ExtBuffer::Param const & par , DpbArray const & dpb , TItWrap begin , TItWrap end , bool flush) { using TRef = TItWrap::reference; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); bool isBPyramid = (CO2.BRefType == MFX_B_REF_PYRAMID); TItWrap top = begin; std::list brefs; auto IsB = [](TRef f) { return HEVCEHW::IsB(f.FrameType); }; auto NoL1 = [&](TItWrap& f) { return !CountL1(dpb, f->POC); }; std::generate_n( std::back_inserter(brefs) , std::distance(begin, std::find_if_not(begin, end, IsB)) , [&]() { return top++; }); brefs.remove_if(NoL1); bool bNoPyramidB = !isBPyramid && !brefs.empty(); if (bNoPyramidB) { auto B0POC = brefs.front()->POC; auto RefB = [B0POC](TItWrap& f) { return IsRef(f->FrameType) && (f->POC - B0POC < 2); }; TItWrapIt BCand[2] = { std::find_if(brefs.begin() , brefs.end(), RefB) , brefs.begin() }; return *BCand[BCand[0] == brefs.end()]; } if (!brefs.empty()) return *BPyrReorder(brefs.begin(), brefs.end()); bool bForcePRef = flush && top == end && begin != end; if (bForcePRef) { --top; top->FrameType = mfxU16(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); } return top; } std::tuple Legacy::GetCUQPMapBlockSize( mfxU16 frameWidth , mfxU16 frameHeight , mfxU16 CUQPWidth , mfxU16 CUHeight) { bool bValid = CUQPWidth && CUHeight; if (bValid) { const mfxU16 BlkSizes[] = { 4, 8, 16, 32, 64 }; auto itBlkWidth = std::lower_bound(BlkSizes, std::end(BlkSizes), frameWidth / CUQPWidth); auto itBlkHeight = std::lower_bound(BlkSizes, std::end(BlkSizes), frameHeight / CUHeight); bValid = itBlkWidth != std::end(BlkSizes) && itBlkHeight != std::end(BlkSizes) && (*itBlkWidth * (CUQPWidth - 1) < frameWidth) && (*itBlkHeight * (CUHeight - 1) < frameHeight); if (bValid) return std::make_tuple(MFX_ERR_NONE, *itBlkWidth, *itBlkHeight); } return std::make_tuple(MFX_ERR_UNDEFINED_BEHAVIOR, mfxU16(0), mfxU16(0)); } mfxU32 Legacy::GetMinBsSize( const ExtBuffer::Param& par) { const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); mfxU32 size = HEVCParam.PicHeightInLumaSamples * HEVCParam.PicWidthInLumaSamples; SetDefault(size, par.mfx.FrameInfo.Width * par.mfx.FrameInfo.Height); bool b10bit = (CO3.TargetBitDepthLuma == 10); bool b422 = (CO3.TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV422 + 1)); bool b444 = (CO3.TargetChromaFormatPlus1 == (MFX_CHROMAFORMAT_YUV444 + 1)); mfxF64 k = 2.0 + (b10bit * 0.3) + (b422 * 0.5) + (b444 * 1.5); size = mfxU32(k * size); bool bUseAvgSize = par.mfx.RateControlMethod == MFX_RATECONTROL_CBR && IsSWBRC(par) && par.mfx.FrameInfo.FrameRateExtD != 0; if (!bUseAvgSize) return size; mfxU32 avgSize = TargetKbps(par.mfx) * 1000 * par.mfx.FrameInfo.FrameRateExtD / (par.mfx.FrameInfo.FrameRateExtN * 8); return std::max(size, avgSize * 2); } typedef std::remove_referencePreferredRefList[0])>::type TLCtrlRLE; void Legacy::InitDPB( TaskCommonPar & task, TaskCommonPar const & prevTask, const mfxExtAVCRefListCtrl* pLCtrl) { bool b1stTrail = task.POC > task.PrevRAP && prevTask.POC <= prevTask.PrevRAP; if ((task.IRState.refrType && !task.IRState.firstFrameInCycle) // IntRefCycle || (!task.IRState.refrType && prevTask.IRState.refrType)) // First frame after IntRefCycle { Remove(task.DPB.Active, 0, MAX_DPB_SIZE); for (mfxU8 i = 0; !isDpbEnd(prevTask.DPB.After, i); i++) { const DpbFrame& ref = prevTask.DPB.After[i]; // initial POC = -1 if (ref.POC > task.DPB.Active[0].POC && ref.TemporalID == 0) // disable multiref within IntraRefCycle and next frame // and update DPB.Active only if temporal layer id = 0 for IntraRef cases task.DPB.Active[0] = ref; } } else if (b1stTrail) { Remove(task.DPB.Active, 0, MAX_DPB_SIZE); // Always check in current release, there are chances in future release to add mode to disable this check. std::copy_if( prevTask.DPB.After , prevTask.DPB.After + mfx::size(prevTask.DPB.After) , task.DPB.Active , [&](const DpbFrame& ref) { return isValid(ref) && (ref.POC == task.PrevRAP || ref.isLTR); }); } else { std::copy_n(prevTask.DPB.After, mfx::size(prevTask.DPB.After), task.DPB.Active); } std::copy_n(prevTask.DPB.After, mfx::size(prevTask.DPB.After), task.DPB.Before); DpbArray& dpb = task.DPB.Active; auto dpbEnd = std::find_if_not(dpb, dpb + mfx::size(dpb), isValid); dpbEnd = RemoveIf(dpb, dpbEnd , [&](const DpbFrame& ref) { return ref.TemporalID > 0 && ref.TemporalID >= task.TemporalID; }); if (pLCtrl) { std::list rejectIDX; std::transform( std::begin(pLCtrl->RejectedRefList) , std::end(pLCtrl->RejectedRefList) , std::back_inserter(rejectIDX) , [&](const TLCtrlRLE& lt) { mfxU16 idx = GetDPBIdxByFO(dpb, lt.FrameOrder); bool bInvalid = (idx >= MAX_DPB_SIZE) || !dpb[idx].isLTR; return std::max(lt.FrameOrder, mfxU32(bInvalid * MFX_FRAMEORDER_UNKNOWN)); }); rejectIDX.sort(); rejectIDX.unique(); rejectIDX.remove(mfxU32(MFX_FRAMEORDER_UNKNOWN)); std::for_each(rejectIDX.begin(), rejectIDX.end() , [&](mfxU32 fo) { Remove(dpb, GetDPBIdxByFO(dpb, fo)); }); } } mfxU16 Legacy::UpdateDPB( const Defaults::Param& def , const DpbFrame& task , DpbArray & dpb , const mfxExtAVCRefListCtrl * pLCtrl) { auto& par = def.mvp; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); bool isBPyramid = (CO2.BRefType == MFX_B_REF_PYRAMID); mfxU16 end = 0; // DPB end mfxU16 st0 = 0; // first ST ref in DPB bool bClearCodingType = isBPyramid && (task.isLDB || task.CodingType < CODING_TYPE_B); auto ClearCodingType = [](DpbFrame& ref) { ref.CodingType = 0; }; auto IsLTR = [](DpbFrame& f) { return f.isLTR; }; auto POCLess = [](DpbFrame& l, DpbFrame& r) { return l.POC < r.POC; }; end = mfxU16(std::find_if_not(dpb, dpb + mfx::size(dpb), isValid) - dpb); st0 = mfxU16(std::find_if_not(dpb, dpb + end, IsLTR) - dpb); // frames stored in DPB in POC ascending order, // LTRs before STRs (use LTR-candidate as STR as long as it is possible) std::sort(dpb, dpb + st0, POCLess); std::sort(dpb + st0, dpb + end, POCLess); // sliding window over STRs bool bRunSlidingWindow = end && end == par.mfx.NumRefFrame; if (bRunSlidingWindow) { st0 = mfxU16(def.base.GetWeakRef(def, task, dpb + st0, dpb + end) - dpb); Remove(dpb, st0 * (st0 < end)); --end; } ThrowAssert(end >= MAX_DPB_SIZE, "DPB overflow, no space for new frame"); //don't keep coding types for prev. mini-GOP std::for_each(dpb, dpb + (end * bClearCodingType), ClearCodingType); dpb[end++] = task; if (pLCtrl) { st0 = mfxU16(std::find_if_not(dpb, dpb + end, IsLTR) - dpb); auto lctrlLtrEnd = std::find_if( pLCtrl->LongTermRefList , pLCtrl->LongTermRefList + mfx::size(pLCtrl->LongTermRefList) , [](const TLCtrlRLE& lt) { return lt.FrameOrder == mfxU32(MFX_FRAMEORDER_UNKNOWN); }); std::list markLTR; std::transform(pLCtrl->LongTermRefList, lctrlLtrEnd, std::back_inserter(markLTR) , [&](const TLCtrlRLE& lt) { mfxU16 idx = GetDPBIdxByFO(dpb, lt.FrameOrder); idx += !!dpb[idx].isLTR * MAX_DPB_SIZE; return std::min(idx, MAX_DPB_SIZE); }); markLTR.sort(); markLTR.remove(mfxU16(MAX_DPB_SIZE)); markLTR.unique(); std::for_each(markLTR.begin(), markLTR.end() , [&](mfxU16 idx) { DpbFrame ltr = dpb[idx]; ltr.isLTR = true; Remove(dpb, idx); Insert(dpb, st0, ltr); st0++; }); std::sort(dpb, dpb + st0, POCLess); } return end; } void Legacy::ConstructRPL( const Defaults::Param& dflts , const DpbArray & DPB , const FrameBaseInfo& cur , mfxU8(&RefPicList)[2][MAX_DPB_SIZE] , mfxU8(&numRefActive)[2] , const mfxExtAVCRefLists * pExtLists , const mfxExtAVCRefListCtrl * pLCtrl) { auto GetRPLFromExt = [&]() { return dflts.base.GetRPLFromExt( dflts , DPB , numRefActive[0] , numRefActive[1] , *pExtLists , RefPicList); }; auto GetRPLFromCtrl = [&]() { return dflts.base.GetRPLFromCtrl ( dflts , DPB , numRefActive[0] , numRefActive[1] , cur , *pLCtrl , RefPicList); }; std::tuple nRef(mfxU8(0), mfxU8(0)); SetIf(nRef, !!pExtLists, GetRPLFromExt); SetIf(nRef, !std::get<0>(nRef) , dflts.base.GetRefPicList , dflts , DPB , numRefActive[0] , numRefActive[1] , cur , RefPicList); SetIf(nRef, !!pLCtrl, GetRPLFromCtrl); ThrowAssert(!std::get<0>(nRef), "L0 is empty"); nRef = dflts.base.GetRPLMod( dflts , DPB , numRefActive[0] , numRefActive[1] , cur , RefPicList); numRefActive[0] = std::get<0>(nRef); numRefActive[1] = std::get<1>(nRef); } void Legacy::ConstructSTRPS( const DpbArray & DPB , const mfxU8(&RefPicList)[2][MAX_DPB_SIZE] , const mfxU8(&numRefActive)[2] , mfxI32 poc , STRPS& rps) { mfxU32 i, nRef; for (i = 0, nRef = 0; !isDpbEnd(DPB, i); i ++) { if (DPB[i].isLTR) continue; rps.pic[nRef].DeltaPocSX = (mfxI16)(DPB[i].POC - poc); rps.pic[nRef].used_by_curr_pic_sx_flag = IsCurrRef(DPB, RefPicList, numRefActive, DPB[i].POC); rps.num_negative_pics += rps.pic[nRef].DeltaPocSX < 0; rps.num_positive_pics += rps.pic[nRef].DeltaPocSX > 0; nRef ++; } std::sort(rps.pic, rps.pic + nRef , [](decltype(rps.pic[0]) l, decltype(rps.pic[0]) r) { return l.DeltaPocSX < r.DeltaPocSX; }); std::sort(rps.pic, rps.pic + rps.num_negative_pics , [](decltype(rps.pic[0]) l, decltype(rps.pic[0]) r) { return l.DeltaPocSX > r.DeltaPocSX; }); for (i = 0; i < nRef; i ++) { mfxI16 prev = (!i || i == rps.num_negative_pics) ? 0 : rps.pic[i-1].DeltaPocSX; rps.pic[i].delta_poc_sx_minus1 = mfxU16(abs(rps.pic[i].DeltaPocSX - prev) - 1); } } mfxU32 EstimateRpsBits(const STRPS* pSpsRps, mfxU8 nSet, const STRPS & rps, mfxU8 idx) { auto NBitsUE = [](mfxU32 b) -> mfxU32 { return mfx::CeilLog2(b + 2) * 2 - 1; }; auto IsNotUsed = [](const STRPSPic& pic) { return !pic.used_by_curr_pic_flag; }; auto AccNBitsDPoc = [&](mfxU32 x, const STRPSPic& pic) { return std::move(x) + NBitsUE(pic.delta_poc_sx_minus1) + 1; }; mfxU32 n = (idx != 0); if (!rps.inter_ref_pic_set_prediction_flag) { mfxU32 nPic = mfxU32(rps.num_negative_pics + rps.num_positive_pics); n += NBitsUE(rps.num_negative_pics); n += NBitsUE(rps.num_positive_pics); return std::accumulate(rps.pic, rps.pic + nPic, n, AccNBitsDPoc); } assert(idx > rps.delta_idx_minus1); STRPS const & ref = pSpsRps[idx - rps.delta_idx_minus1 - 1]; mfxU32 nPic = mfxU32(ref.num_negative_pics + ref.num_positive_pics); if (idx == nSet) n += NBitsUE(rps.delta_idx_minus1); n += 1; n += NBitsUE(rps.abs_delta_rps_minus1); n += nPic; n += mfxU32(std::count_if(rps.pic, rps.pic + nPic + 1, IsNotUsed)); return n; } bool GetInterRps(STRPS const & refRPS, STRPS& rps, mfxU8 dIdxMinus1) { auto oldRPS = rps; auto newRPS = oldRPS; newRPS.inter_ref_pic_set_prediction_flag = 1; newRPS.delta_idx_minus1 = dIdxMinus1; std::list dPocs[2]; auto AddDPoc = [&dPocs](mfxI16 dPoc) { if (dPoc) dPocs[dPoc > 0].push_back(dPoc); }; std::for_each(oldRPS.pic, oldRPS.pic + oldRPS.num_negative_pics + oldRPS.num_positive_pics , [&](STRPSPic& oldPic) { AddDPoc(oldPic.DeltaPocSX); std::for_each(refRPS.pic, refRPS.pic + refRPS.num_negative_pics + refRPS.num_positive_pics , [&](const STRPSPic& refPic) { AddDPoc(oldPic.DeltaPocSX - refPic.DeltaPocSX); }); }); dPocs[0].sort(std::greater()); dPocs[1].sort(std::less()); dPocs[0].unique(); dPocs[1].unique(); mfxI16 dPoc = 0; bool bDPocFound = false; auto NextDPock = [&]() { return ((!dPocs[0].empty() || !dPocs[1].empty()) && !bDPocFound); }; while (NextDPock()) { dPoc *= -1; bool bPositive = (dPoc > 0 && !dPocs[1].empty()) || dPocs[0].empty(); dPoc = dPocs[bPositive].front(); dPocs[bPositive].pop_front(); std::for_each(newRPS.pic , newRPS.pic + refRPS.num_negative_pics + refRPS.num_positive_pics + 1 , [&](STRPSPic& newPic) { newPic.used_by_curr_pic_flag = 0; newPic.use_delta_flag = 0; }); auto pOldPic = oldRPS.pic; auto UseDelta = [&pOldPic, dPoc](STRPSPic& newPic, mfxI16 refDeltaPocSX, mfxI16 sign) { bool bUse = ((pOldPic->DeltaPocSX * sign) > 0) && ((pOldPic->DeltaPocSX - refDeltaPocSX) == dPoc); newPic.used_by_curr_pic_flag = (bUse && pOldPic->used_by_curr_pic_sx_flag) || (!bUse && newPic.used_by_curr_pic_flag); newPic.use_delta_flag = bUse || (!bUse && newPic.use_delta_flag); pOldPic += bUse; }; auto pRefPic = refRPS.pic + refRPS.num_negative_pics + refRPS.num_positive_pics - 1; std::for_each( MakeRIter(newRPS.pic + refRPS.num_negative_pics + refRPS.num_positive_pics) , MakeRIter(newRPS.pic + refRPS.num_negative_pics) , [&](STRPSPic& newPic) { UseDelta(newPic, pRefPic->DeltaPocSX, -1); --pRefPic; }); UseDelta(newRPS.pic[refRPS.num_negative_pics + refRPS.num_positive_pics], 0, (dPoc < 0) * -1); pRefPic = refRPS.pic; std::for_each(newRPS.pic, newRPS.pic + refRPS.num_negative_pics , [&](STRPSPic& newPic) { UseDelta(newPic, pRefPic->DeltaPocSX, -1); ++pRefPic; }); if (pOldPic != (oldRPS.pic + oldRPS.num_negative_pics)) continue; pRefPic = refRPS.pic + refRPS.num_negative_pics - 1; std::for_each( MakeRIter(newRPS.pic + refRPS.num_negative_pics) , MakeRIter(newRPS.pic) , [&](STRPSPic& newPic) { UseDelta(newPic, pRefPic->DeltaPocSX, +1); --pRefPic; }); UseDelta(newRPS.pic[refRPS.num_negative_pics + refRPS.num_positive_pics], 0, dPoc > 0); pRefPic = refRPS.pic + refRPS.num_negative_pics; std::for_each( newRPS.pic + refRPS.num_negative_pics , newRPS.pic + refRPS.num_negative_pics + refRPS.num_positive_pics , [&](STRPSPic& newPic) { UseDelta(newPic, pRefPic->DeltaPocSX, +1); ++pRefPic; }); bDPocFound = (pOldPic == (oldRPS.pic + oldRPS.num_negative_pics + oldRPS.num_positive_pics)); } newRPS.delta_rps_sign = (dPoc < 0); newRPS.abs_delta_rps_minus1 = mfxU16(abs(dPoc) - 1); SetIf(rps, bDPocFound, newRPS); return bDPocFound; } void OptimizeSTRPS(const STRPS* pSpsRps, mfxU8 n, STRPS& oldRPS, mfxU8 idx) { auto IsEnoughPics = [&](const STRPS& refRPS) { return (refRPS.num_negative_pics + refRPS.num_positive_pics + 1) < (oldRPS.num_negative_pics + oldRPS.num_positive_pics); }; auto itRBegin = MakeRIter(pSpsRps + idx); auto itREnd = MakeRIter(pSpsRps + ((idx < n && idx > 1) * (idx - 1))); auto itSearchRBegin = std::find_if_not(itRBegin, itREnd, IsEnoughPics); mfxU8 dIdxMinus1 = mfxU8(std::distance(itRBegin, itSearchRBegin)); auto UpdateRPS = [&](const STRPS& refRPS) { STRPS newRPS = oldRPS; bool bUpdateRps = GetInterRps(refRPS, newRPS, dIdxMinus1++) && (EstimateRpsBits(pSpsRps, n, newRPS, idx) < EstimateRpsBits(pSpsRps, n, oldRPS, idx)); SetIf(oldRPS, bUpdateRps, newRPS); }; auto itSearchREnd = itREnd; bool b1Ref = (idx < n) && (itSearchRBegin != itREnd); SetIf(itSearchREnd, b1Ref, std::next(itSearchRBegin, b1Ref)); std::for_each(itSearchRBegin, itSearchREnd, UpdateRPS); } bool Equal(const STRPS & l, const STRPS & r) { //ignore inter_ref_pic_set_prediction_flag, check only DeltaPocSX auto IsSame = [](const STRPSPic & l, const STRPSPic & r) { return l.DeltaPocSX == r.DeltaPocSX && l.used_by_curr_pic_sx_flag == r.used_by_curr_pic_sx_flag; }; auto nPic = l.num_negative_pics + l.num_positive_pics; return l.num_negative_pics == r.num_negative_pics && l.num_positive_pics == r.num_positive_pics && (std::mismatch(l.pic, l.pic + nPic, r.pic, IsSame) == std::make_pair(l.pic + nPic, r.pic + nPic)); } void Legacy::SetSTRPS( const Defaults::Param& dflts , SPS& sps , const Reorderer& reorder) { std::list frames; auto& par = dflts.mvp; STRPS sets[65] = {}; auto pSetsBegin = sets; auto pSetsEnd = pSetsBegin; bool bTL = dflts.base.GetNumTemporalLayers(dflts) > 1; mfxI32 nGops = par.mfx.IdrInterval + !par.mfx.IdrInterval * 4; mfxI32 stDist = std::min(par.mfx.GopPicSize * nGops, 128); mfxLastKeyFrameInfo m_LastKeyFrameInfo = {}; bool bDone = false; mfxI32 i = 0; mfxI32 RAPPOC = -1; // if >= 0 first frame with bigger POC clears refs previous to RAP bool bFields = (par.mfx.FrameInfo.PicStruct & (MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_BOTTOM)); bool bIisRAP = !bFields; // control to match real encoding here Reorderer localReorder; DpbArray dpb; localReorder = reorder; localReorder.DPB = &dpb; //use own DPB do { { FrameBaseInfo fi; mfxGopHints GopHints = {}; auto sts = dflts.base.GetPreReorderInfo(dflts, fi, nullptr, nullptr, m_LastKeyFrameInfo, mfxU32(i), GopHints); ThrowIf(!!sts, "failed at GetPreReorderInfo"); SetIf(m_LastKeyFrameInfo.lastIPOrder, !IsB(fi.FrameType), i); frames.push_back(StorageRW()); frames.back().Insert(Task::Common::Key, new FrameBaseInfo(fi)); } auto frIt = localReorder(frames.begin(), frames.end(), false); bool bNext = frIt == frames.end(); FrameBaseInfo* cur = nullptr; SetIf(cur, !bNext, [&]() { return &frIt->Write(Task::Common::Key); }); bDone = (i > 0 && !bNext && IsIdr(cur->FrameType)) || (!bNext && cur->POC >= stDist) || (pSetsEnd + 1) >= std::end(sets); bNext |= bDone; if (!bNext) { bool bAfterRAP = (RAPPOC >= 0) && (cur->POC > RAPPOC); // if true - need to remove refs 0 && ref.TemporalID >= cur->TemporalID)); }); bool bIDR = IsIdr(cur->FrameType); bool bI = IsI(cur->FrameType); bool bB = IsB(cur->FrameType); bool bP = IsP(cur->FrameType); bool bRef = IsRef(cur->FrameType); SetIf(RAPPOC, bAfterRAP, -1); // clear after use SetIf(RAPPOC, bI && bIisRAP, cur->POC); // enable at I if conrol allows if (!bIDR) { mfxU8 nRef[2] = {}; mfxU8 RefPicList[2][MAX_DPB_SIZE]; std::fill_n(RefPicList[0], mfx::size(RefPicList[0]), IDX_INVALID); std::fill_n(RefPicList[1], mfx::size(RefPicList[1]), IDX_INVALID); auto SetRPL = [&]() { ConstructRPL(dflts, dpb, *cur, RefPicList, nRef); return true; }; std::tie(nRef[0], nRef[1]) = dflts.base.GetFrameNumRefActive(dflts, *cur); bool bRPL = (bB && nRef[0] && SetRPL()) || (bP && nRef[0] && SetRPL()) || (bI); //I picture is not using any refs, but saves them in RPS to be used by future pics. // but currently every I is RAP and frames after it won't use refs before it ThrowAssert(!bRPL, "failed to construct RefPicList"); STRPS rps = {}; ConstructSTRPS(dpb, RefPicList, nRef, cur->POC, rps); auto pCurSet = std::find_if(pSetsBegin, pSetsEnd , [&](const STRPS& x) { return Equal(x, rps); }); pSetsEnd += SetIf(*pCurSet, pSetsEnd == pCurSet, rps); ++pCurSet->WeightInGop; } SetIf(m_LastKeyFrameInfo.lastIPoc, bI, cur->POC); DpbFrame tmp; (FrameBaseInfo&)tmp = *cur; tmp.Rec.Idx += bRef; ThrowAssert(bRef && !UpdateDPB(dflts, tmp, dpb), "failed to UpdateDPB"); frames.erase(frIt); } ++i; } while (!bDone); mfxU8 nSet = mfxU8(std::distance(pSetsBegin, pSetsEnd)); auto IsRpsOptimal = [&nSet, &par, pSetsBegin](const STRPS& curRps) { STRPS rps = curRps; mfxU32 n = curRps.WeightInGop; //current RPS used for N frames //bits for RPS in SPS and SSHs mfxU32 bits0 = EstimateRpsBits(pSetsBegin, nSet, rps, nSet - 1) //bits for RPS in SPS + (mfx::CeilLog2(nSet + 1) - mfx::CeilLog2(nSet)) * 2 //diff of bits for STRPS num in SPS (ue() coded) + (nSet > 1) * (par.mfx.NumSlice * mfx::CeilLog2(nSet) * n); //bits for RPS idx in SSHs // count frames that use SPS RPS auto AccFrWithRPS = [](mfxU32 x, const STRPS& r) { return std::move(x) + r.inter_ref_pic_set_prediction_flag * r.WeightInGop; }; if (mfx::CeilLog2(nSet) - mfx::CeilLog2(nSet - 1)) //diff RPS idx bits with bigger RPS for ALL frames bits0 = par.mfx.NumSlice * std::accumulate(pSetsBegin, pSetsBegin + nSet - 1, bits0, AccFrWithRPS); //emulate removal of current RPS from SPS --nSet; rps.inter_ref_pic_set_prediction_flag = 0; OptimizeSTRPS(pSetsBegin, nSet, rps, nSet); //bits for RPS in SSHs (no RPS in SPS) mfxU32 bits1 = EstimateRpsBits(pSetsBegin, nSet, rps, nSet) * par.mfx.NumSlice * n; return bits0 <= bits1; }; std::sort(pSetsBegin, pSetsEnd , [&](const STRPS& l, const STRPS& r) { return l.WeightInGop > r.WeightInGop; }); i = 0; std::for_each(pSetsBegin, pSetsEnd , [&](STRPS& sf) { OptimizeSTRPS(sets, nSet, sf, mfxU8(i++)); }); auto ritLastRps = std::find_if(MakeRIter(pSetsEnd), MakeRIter(pSetsBegin), IsRpsOptimal); // Also makes sense to try cut nSet to 2^n. Shorter idx code can overweight sps.num_short_term_ref_pic_sets = mfxU8(std::distance(ritLastRps, MakeRIter(pSetsBegin))); std::copy_n(pSetsBegin, sps.num_short_term_ref_pic_sets, sps.strps); } mfxStatus Legacy::CheckSPS(const SPS& sps, const ENCODE_CAPS_HEVC& caps, eMFXHWType hw) { (void)hw; MFX_CHECK_COND( sps.log2_min_luma_coding_block_size_minus3 == 0 && sps.separate_colour_plane_flag == 0 && sps.pcm_enabled_flag == 0); MFX_CHECK_COND(sps.amp_enabled_flag == 1); MFX_CHECK_COND( !( (!caps.YUV444ReconSupport && (sps.chroma_format_idc == 3)) || (!caps.YUV422ReconSupport && (sps.chroma_format_idc == 2)) || (caps.Color420Only && (sps.chroma_format_idc != 1)))); MFX_CHECK_COND( !( sps.pic_width_in_luma_samples > caps.MaxPicWidth || sps.pic_height_in_luma_samples > caps.MaxPicHeight)); MFX_CHECK_COND( !( (caps.MaxEncodedBitDepth == 0 || caps.BitDepth8Only) && (sps.bit_depth_luma_minus8 != 0 || sps.bit_depth_chroma_minus8 != 0))); MFX_CHECK_COND( !( (caps.MaxEncodedBitDepth == 2 || caps.MaxEncodedBitDepth == 1 || !caps.BitDepth8Only) && ( !(sps.bit_depth_luma_minus8 == 0 || sps.bit_depth_luma_minus8 == 2 || sps.bit_depth_luma_minus8 == 4) || !(sps.bit_depth_chroma_minus8 == 0 || sps.bit_depth_chroma_minus8 == 2 || sps.bit_depth_chroma_minus8 == 4)))); MFX_CHECK_COND( !( caps.MaxEncodedBitDepth == 2 && ( !(sps.bit_depth_luma_minus8 == 0 || sps.bit_depth_luma_minus8 == 2 || sps.bit_depth_luma_minus8 == 4) || !(sps.bit_depth_chroma_minus8 == 0 || sps.bit_depth_chroma_minus8 == 2 || sps.bit_depth_chroma_minus8 == 4)))); MFX_CHECK_COND( !( caps.MaxEncodedBitDepth == 3 && ( !(sps.bit_depth_luma_minus8 == 0 || sps.bit_depth_luma_minus8 == 2 || sps.bit_depth_luma_minus8 == 4 || sps.bit_depth_luma_minus8 == 8) || !(sps.bit_depth_chroma_minus8 == 0 || sps.bit_depth_chroma_minus8 == 2 || sps.bit_depth_chroma_minus8 == 4 || sps.bit_depth_chroma_minus8 == 8)))); return MFX_ERR_NONE; } mfxStatus Legacy::CheckPPS(const PPS& pps, const ENCODE_CAPS_HEVC& caps, eMFXHWType /*hw*/) { if (pps.tiles_enabled_flag) { MFX_CHECK_COND(pps.loop_filter_across_tiles_enabled_flag); } MFX_CHECK_COND(!((mfxU32)(((pps.num_tile_columns_minus1 + 1) * (pps.num_tile_rows_minus1 + 1)) > 1) > caps.TileSupport)); return MFX_ERR_NONE; } void SetDefaultFormat( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption3* pCO3) { auto& fi = par.mfx.FrameInfo; assert(fi.FourCC); SetDefault(fi.BitDepthLuma, [&]() { return defPar.base.GetMaxBitDepth(defPar); }); SetDefault(fi.BitDepthChroma, fi.BitDepthLuma); if (pCO3) { pCO3->TargetChromaFormatPlus1 = defPar.base.GetTargetChromaFormat(defPar); pCO3->TargetBitDepthLuma = defPar.base.GetTargetBitDepthLuma(defPar); SetDefault(pCO3->TargetBitDepthChroma, pCO3->TargetBitDepthLuma); } } void SetDefaultSize( mfxVideoParam & par , const Defaults::Param& defPar , mfxExtHEVCParam* pHEVC) { auto& fi = par.mfx.FrameInfo; mfxU16 PicWidthInLumaSamples = defPar.base.GetCodedPicWidth(defPar); mfxU16 PicHeightInLumaSamples = defPar.base.GetCodedPicHeight(defPar); if (pHEVC) { SetDefault(pHEVC->PicWidthInLumaSamples, PicWidthInLumaSamples); SetDefault(pHEVC->PicHeightInLumaSamples, PicHeightInLumaSamples); } SetDefault(fi.CropW, mfxU16(PicWidthInLumaSamples - fi.CropX)); SetDefault(fi.CropH, mfxU16(PicHeightInLumaSamples - fi.CropY)); SetDefault(fi.AspectRatioW, mfxU16(1)); SetDefault(fi.AspectRatioH, mfxU16(1)); std::tie(fi.FrameRateExtN, fi.FrameRateExtD) = defPar.base.GetFrameRate(defPar); } void SetDefaultGOP( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption2* pCO2 , mfxExtCodingOption3* pCO3) { par.mfx.GopPicSize = defPar.base.GetGopPicSize(defPar); par.mfx.GopRefDist = defPar.base.GetGopRefDist(defPar); SetIf(pCO2->BRefType, pCO2 && !pCO2->BRefType, [&]() { return defPar.base.GetBRefType(defPar); }); SetIf(pCO3->PRefType, pCO3 && !pCO3->PRefType, [&]() { return defPar.base.GetPRefType(defPar); }); par.mfx.NumRefFrame = defPar.base.GetNumRefFrames(defPar); if (pCO3) { SetDefault(pCO3->GPB, MFX_CODINGOPTION_ON); defPar.base.GetNumRefActive( defPar , &pCO3->NumRefActiveP , &pCO3->NumRefActiveBL0 , &pCO3->NumRefActiveBL1); } } void SetDefaultBRC( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtCodingOption2* pCO2 , mfxExtCodingOption3* pCO3) { par.mfx.RateControlMethod = defPar.base.GetRateControlMethod(defPar); BufferSizeInKB(par.mfx) = defPar.base.GetBufferSizeInKB(defPar); if (pCO2) pCO2->MBBRC = defPar.base.GetMBBRC(defPar); bool bSetQP = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && !(par.mfx.QPI && par.mfx.QPP && par.mfx.QPB); bool bSetRCPar = (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VCM); bool bSetICQ = (par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ); bool bSetQVBR = (par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR && pCO3); if (bSetQP) { std::tie(par.mfx.QPI, par.mfx.QPP, par.mfx.QPB) = defPar.base.GetQPMFX(defPar); } if (bSetRCPar) { TargetKbps(par.mfx) = defPar.base.GetTargetKbps(defPar); MaxKbps(par.mfx) = defPar.base.GetMaxKbps(defPar); SetDefault(par.mfx.InitialDelayInKB , par.mfx.BufferSizeInKB * (2 + (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR && Legacy::IsSWBRC(par))) / 4); } if (bSetICQ) SetDefault(par.mfx.ICQQuality, 26); if (bSetQVBR) SetDefault(pCO3->QVBRQuality, 26); if (pCO3) { SetDefault(pCO3->LowDelayBRC, MFX_CODINGOPTION_OFF); pCO3->EnableQPOffset = defPar.base.GetQPOffset(defPar, &pCO3->QPOffset); SetDefault(pCO3->EnableMBQP , Bool2CO( !( par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || Legacy::IsSWBRC(par) || !defPar.caps.MbQpDataSupport))); bool bSetWinBRC = pCO3->WinBRCSize || pCO3->WinBRCMaxAvgKbps; if (bSetWinBRC) { SetDefault(pCO3->WinBRCSize , (mfxU16)mfx::CeilDiv(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD)); SetDefault(pCO3->WinBRCMaxAvgKbps, par.mfx.MaxKbps); } SetDefault(pCO3->BRCPanicMode, Bool2CO(defPar.caps.HRDConformanceSupport)); } } void SetDefaultEsOptions( mfxVideoParam& par , const Defaults::Param& defPar , mfxExtHEVCParam* pHEVC , mfxExtCodingOption* pCO , mfxExtCodingOption2* pCO2 , mfxExtCodingOption3* pCO3) { if (pCO) { bool bHRDConformance = defPar.base.GetHRDConformanceON(defPar); SetDefault(pCO->NalHrdConformance, Bool2CO(bHRDConformance)); SetDefault(pCO->VuiNalHrdParameters, Bool2CO(bHRDConformance)); SetDefault(pCO->AUDelimiter, mfxU16(MFX_CODINGOPTION_OFF)); pCO->PicTimingSEI = defPar.base.GetPicTimingSEI(defPar); } if (pCO2) SetDefault(pCO2->RepeatPPS, mfxU16(MFX_CODINGOPTION_OFF)); if (pCO3) { SetDefault(pCO3->TransformSkip, mfxU16(MFX_CODINGOPTION_ON)); SetDefault(pCO3->TransformSkip, mfxU16(MFX_CODINGOPTION_OFF)); SetDefault(pCO3->EnableNalUnitType, Bool2CO(!!par.mfx.EncodedOrder)); } if (pHEVC) { bool bNoSAO = SetDefault(pHEVC->SampleAdaptiveOffset, mfxU16(MFX_SAO_ENABLE_LUMA | MFX_SAO_ENABLE_CHROMA)) && defPar.base.CheckSAO(defPar, par); pHEVC->SampleAdaptiveOffset *= !bNoSAO; SetDefault(pHEVC->SampleAdaptiveOffset, mfxU16(MFX_SAO_DISABLE)); } } void Legacy::SetDefaults( mfxVideoParam& par , const Defaults::Param& defPar , bool bExternalFrameAllocator) { auto& fi = par.mfx.FrameInfo; mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); mfxExtHEVCTiles* pTile = ExtBuffer::Get(par); mfxExtAvcTemporalLayers* pTemporalLayers = ExtBuffer::Get(par); mfxExtCodingOption* pCO = ExtBuffer::Get(par); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); mfxU16 IOPByAlctr[2] = { MFX_IOPATTERN_IN_SYSTEM_MEMORY, MFX_IOPATTERN_IN_VIDEO_MEMORY }; auto GetNumSlices = [&]() { std::vector slices; return defPar.base.GetSlices(defPar, slices); }; auto GetDefaultLevel = [&]() { mfxU16 nCol = 0, nRow = 0; std::tie(nCol, nRow) = defPar.base.GetNumTiles(defPar); return GetMinLevel( fi.FrameRateExtN , fi.FrameRateExtD , defPar.base.GetCodedPicWidth(defPar) , defPar.base.GetCodedPicHeight(defPar) , par.mfx.NumRefFrame , nCol , nRow , par.mfx.NumSlice , BufferSizeInKB(par.mfx) , MaxKbps(par.mfx) , MFX_LEVEL_HEVC_1); }; if (pHEVC) { pHEVC->LCUSize = defPar.base.GetLCUSize(defPar); } SetDefaultFormat(par, defPar, pCO3); SetDefault(par.mfx.CodecProfile, defPar.base.GetProfile(defPar)); SetDefault(par.AsyncDepth, defPar.base.GetAsyncDepth(defPar)); SetDefault(par.IOPattern, IOPByAlctr[!!bExternalFrameAllocator]); SetDefault(par.mfx.TargetUsage, mfxU16(4)) && CheckTU(par, defPar.caps); if (pTile) { std::tie(pTile->NumTileColumns, pTile->NumTileRows) = defPar.base.GetNumTiles(defPar); } SetDefault(par.mfx.NumSlice, GetNumSlices); SetDefaultSize(par, defPar, pHEVC); SetDefaultGOP(par, defPar, pCO2, pCO3); SetDefaultBRC(par, defPar, pCO2, pCO3); if (pTemporalLayers) { SetDefault(pTemporalLayers->Layer[0].Scale, mfxU16(1)); } SetDefault(par.mfx.CodecLevel, GetDefaultLevel); SetDefaultEsOptions(par, defPar, pHEVC, pCO, pCO2, pCO3); if (pCO2) { auto minQP = defPar.base.GetMinQPMFX(defPar); auto maxQP = defPar.base.GetMaxQPMFX(defPar); SetDefault(pCO2->IntRefCycleSize, mfxU16(mfx::CeilDiv(fi.FrameRateExtN, fi.FrameRateExtD) * !!pCO2->IntRefType)); SetDefault(pCO2->MinQPI, minQP); SetDefault(pCO2->MinQPP, minQP); SetDefault(pCO2->MinQPB, minQP); SetDefault(pCO2->MaxQPI, maxQP); SetDefault(pCO2->MaxQPP, maxQP); SetDefault(pCO2->MaxQPB, maxQP); } bool bSetConstr = pHEVC && (par.mfx.CodecProfile >= MFX_PROFILE_HEVC_REXT && !pHEVC->GeneralConstraintFlags); if (bSetConstr) { auto& constr = pHEVC->GeneralConstraintFlags; mfxU16 bdY = defPar.base.GetTargetBitDepthLuma(defPar); mfxU16 cf = defPar.base.GetTargetChromaFormat(defPar) - 1; constr |= MFX_HEVC_CONSTR_REXT_MAX_422CHROMA * (cf <= MFX_CHROMAFORMAT_YUV422); constr |= MFX_HEVC_CONSTR_REXT_MAX_420CHROMA * (cf <= MFX_CHROMAFORMAT_YUV420); constr |= MFX_HEVC_CONSTR_REXT_MAX_12BIT * (bdY <= 12); constr |= MFX_HEVC_CONSTR_REXT_MAX_10BIT * (bdY <= 10); //there is no Main 4:2:2 in current standard spec.(2016/12), only Main 4:2:2 10 constr |= MFX_HEVC_CONSTR_REXT_MAX_8BIT * (bdY <= 8 && (cf != MFX_CHROMAFORMAT_YUV422)); constr |= MFX_HEVC_CONSTR_REXT_LOWER_BIT_RATE; } } mfxStatus Legacy::CheckLevelConstraints( mfxVideoParam & par , const Defaults::Param& defPar) { MFX_CHECK(par.mfx.CodecLevel, MFX_ERR_NONE); mfxU16 PicWidthInLumaSamples = defPar.base.GetCodedPicWidth(defPar); mfxU16 PicHeightInLumaSamples = defPar.base.GetCodedPicHeight(defPar); mfxU16 MinRef = defPar.base.GetNumRefFrames(defPar); mfxU32 NumSlice = defPar.base.GetNumSlices(defPar); mfxU32 BufferSizeInKB = 0; mfxU32 MaxKbps = 0; mfxU16 rc = defPar.base.GetRateControlMethod(defPar); auto tiles = defPar.base.GetNumTiles(defPar); auto frND = defPar.base.GetFrameRate(defPar); // ICQ&CQP don't require BufferSizeInKB and MaxKbps SetIf(BufferSizeInKB , rc != MFX_RATECONTROL_CQP && rc != MFX_RATECONTROL_ICQ , [&]() { return defPar.base.GetBufferSizeInKB(defPar); }); SetIf(MaxKbps , rc != MFX_RATECONTROL_CQP && rc != MFX_RATECONTROL_ICQ , [&]() { return defPar.base.GetMaxKbps(defPar); }); mfxU16 minLevel = GetMinLevel( std::get<0>(frND) , std::get<1>(frND) , PicWidthInLumaSamples , PicHeightInLumaSamples , MinRef , std::get<0>(tiles) , std::get<1>(tiles) , NumSlice , BufferSizeInKB , MaxKbps , par.mfx.CodecLevel); MFX_CHECK(!CheckMinOrClip(par.mfx.CodecLevel, minLevel), MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckESPackParam(mfxVideoParam & par, eMFXHWType hw) { (void)hw; mfxU32 changed = 0; mfxExtCodingOption* pCO = ExtBuffer::Get(par); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); mfxExtChromaLocInfo* pCLI = ExtBuffer::Get(par); mfxExtVideoSignalInfo* pVSI = ExtBuffer::Get(par); if (pCO) { bool bNoHRD = par.mfx.RateControlMethod != MFX_RATECONTROL_CBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VBR && par.mfx.RateControlMethod != MFX_RATECONTROL_VCM && par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR; changed += CheckOrZero( pCO->NalHrdConformance , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !bNoHRD)); changed += CheckOrZero( pCO->VuiNalHrdParameters , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !(bNoHRD || IsOff(pCO->NalHrdConformance)))); changed += CheckTriStateOrZero(pCO->PicTimingSEI); changed += CheckTriStateOrZero(pCO->AUDelimiter); } if (pCO2) { changed += CheckTriStateOrZero(pCO2->RepeatPPS); } if (pVSI) { changed += CheckRangeOrSetDefault(pVSI->VideoFormat, 0, 8, 5); changed += CheckRangeOrSetDefault(pVSI->ColourPrimaries, 0, 255, 2); changed += CheckRangeOrSetDefault(pVSI->TransferCharacteristics, 0, 255, 2); changed += CheckRangeOrSetDefault(pVSI->MatrixCoefficients, 0, 255, 2); changed += CheckOrZero(pVSI->VideoFullRange); changed += CheckOrZero(pVSI->ColourDescriptionPresent); } if (pCLI) { changed += CheckOrZero(pCLI->ChromaLocInfoPresentFlag); changed += CheckRangeOrSetDefault(pCLI->ChromaSampleLocTypeTopField, 0, 255, 0); changed += CheckRangeOrSetDefault(pCLI->ChromaSampleLocTypeBottomField, 0, 255, 0); } if (pCO3) { changed += CheckOrZero( pCO3->TransformSkip , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON)); changed += CheckOrZero( pCO3->EnableNalUnitType , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !!par.mfx.EncodedOrder)); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckGPB(mfxVideoParam & par) { mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3) { changed += CheckOrZero( pCO3->GPB , mfxU16(MFX_CODINGOPTION_ON) , mfxU16(MFX_CODINGOPTION_OFF * !!m_pQWCDefaults->caps.msdk.PSliceSupport) , mfxU16(MFX_CODINGOPTION_UNKNOWN)); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckSkipFrame(mfxVideoParam & par) { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2 && CheckOrZero (pCO2->SkipFrame)) return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return MFX_ERR_NONE; } mfxStatus Legacy::CheckIntraRefresh( mfxVideoParam & par , const Defaults::Param& defPar) { mfxStatus sts = MFX_ERR_NONE; mfxU32 changed = 0; mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO2) { MFX_CHECK_NO_RET( !CheckMaxOrClip(pCO2->IntRefType, MFX_REFRESH_HORIZONTAL) , sts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET( defPar.caps.RollingIntraRefresh || !CheckOrZero(pCO2->IntRefType, MFX_REFRESH_NO) , sts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET( defPar.caps.RollingIntraRefresh || !CheckOrZero(pCO2->IntRefCycleSize, 0) , sts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET( defPar.caps.RollingIntraRefresh || !pCO3 || !CheckOrZero(pCO3->IntRefCycleDist, 0) , sts, MFX_ERR_UNSUPPORTED); // B-Frames should be disabled for intra refresh if (pCO2->IntRefType && par.mfx.GopRefDist > 1) { pCO2->IntRefType = MFX_REFRESH_NO; ++changed; } // refresh cycle length shouldn't be greater or equal to GOP size bool bInvalidCycle = pCO2->IntRefCycleSize != 0 && par.mfx.GopPicSize != 0 && pCO2->IntRefCycleSize >= par.mfx.GopPicSize; pCO2->IntRefType *= !bInvalidCycle; pCO2->IntRefCycleSize *= !bInvalidCycle; changed += bInvalidCycle; // refresh period shouldn't be greater than refresh cycle size bool bInvalidDist = pCO3 && pCO3->IntRefCycleDist != 0 && pCO2->IntRefCycleSize != 0 && pCO2->IntRefCycleSize > pCO3->IntRefCycleDist; if (bInvalidDist) { pCO3->IntRefCycleDist = 0; ++changed; } mfxI16 qpDiff = defPar.base.GetMaxQPMFX(defPar) - defPar.base.GetMinQPMFX(defPar); changed += CheckRangeOrSetDefault(pCO2->IntRefQPDelta, mfxI16(-qpDiff), qpDiff, mfxI16(0)); } MFX_CHECK_STS(sts); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckTemporalLayers(mfxVideoParam & par) { mfxU32 changed = 0; mfxExtAvcTemporalLayers* pTemporalLayers = ExtBuffer::Get(par); MFX_CHECK(pTemporalLayers, MFX_ERR_NONE); MFX_CHECK(!CheckOrZero(pTemporalLayers->Layer[0].Scale, 0, 1), MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckOrZero(pTemporalLayers->Layer[7].Scale, 0), MFX_ERR_UNSUPPORTED); mfxU16 nTL = 1; for (mfxU16 i = 1, prev = 0; i < 7; ++i) { if (!pTemporalLayers->Layer[i].Scale) continue; auto& scaleCurr = pTemporalLayers->Layer[i].Scale; auto scalePrev = pTemporalLayers->Layer[prev].Scale; MFX_CHECK(!CheckMinOrZero(scaleCurr, scalePrev + 1), MFX_ERR_UNSUPPORTED); MFX_CHECK(scalePrev, MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckOrZero(scaleCurr, mfxU16(scaleCurr - (scaleCurr % scalePrev))), MFX_ERR_UNSUPPORTED); prev = i; ++nTL; } changed += CheckOrZero(par.mfx.GopRefDist, 0, 1, par.mfx.GopRefDist * (nTL <= 1)); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckPPyramid(mfxVideoParam & par) { mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3) { changed += CheckOrZero (pCO3->PRefType); if (pCO3->PRefType == MFX_P_REF_PYRAMID && par.mfx.GopRefDist > 1) { pCO3->PRefType = MFX_P_REF_DEFAULT; changed++; } } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckBPyramid( mfxVideoParam & par , const Defaults::Param& defPar) { mfxU32 changed = 0; mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); if (pCO2) { mfxU16 minRefForPyramid = 3; if (par.mfx.GopRefDist) minRefForPyramid = defPar.base.GetMinRefForBPyramid(defPar); bool bNoBPyramid = par.mfx.GopRefDist > 0 && ( par.mfx.GopRefDist < 2 || minRefForPyramid > 16 || (par.mfx.NumRefFrame && (minRefForPyramid > par.mfx.NumRefFrame) && !defPar.base.GetNonStdReordering(defPar))); changed += CheckOrZero(pCO2->BRefType , mfxU16(MFX_B_REF_UNKNOWN) , mfxU16(MFX_B_REF_OFF) , mfxU16(MFX_B_REF_PYRAMID * !bNoBPyramid)); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckNumRefFrame( mfxVideoParam & par , const Defaults::Param& defPar) { mfxU32 changed = 0; changed += CheckMaxOrClip(par.mfx.NumRefFrame, defPar.base.GetMaxDPB(defPar) - 1); changed += SetIf( par.mfx.NumRefFrame , (par.mfx.GopRefDist > 1 && par.mfx.NumRefFrame == 1 && !defPar.base.GetNonStdReordering(defPar)) , defPar.base.GetMinRefForBNoPyramid(defPar)); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckFrameRate(mfxVideoParam & par) { auto& fi = par.mfx.FrameInfo; if (fi.FrameRateExtN && fi.FrameRateExtD) // FR <= 300 { if (fi.FrameRateExtN > mfxU32(300 * fi.FrameRateExtD)) { fi.FrameRateExtN = fi.FrameRateExtD = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } } if ((fi.FrameRateExtN == 0) != (fi.FrameRateExtD == 0)) { fi.FrameRateExtN = 0; fi.FrameRateExtD = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; } bool Legacy::IsInVideoMem(const mfxVideoParam & par) { if (par.IOPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) return true; return false; } mfxStatus Legacy::CheckShift(mfxVideoParam & par) { auto& fi = par.mfx.FrameInfo; bool bVideoMem = IsInVideoMem(par); if (bVideoMem && !fi.Shift) { if (fi.FourCC == MFX_FOURCC_P010 || fi.FourCC == MFX_FOURCC_P210) { fi.Shift = 1; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return MFX_ERR_NONE; } mfxStatus Legacy::CheckCrops( mfxVideoParam & par , const Defaults::Param& defPar) { mfxU32 changed = 0; auto W = defPar.base.GetCodedPicWidth(defPar); auto H = defPar.base.GetCodedPicHeight(defPar); auto& fi = par.mfx.FrameInfo; changed += CheckMaxOrClip(fi.CropX, W); changed += CheckMaxOrClip(fi.CropW, W - fi.CropX); changed += CheckMaxOrClip(fi.CropY, H); changed += CheckMaxOrClip(fi.CropH, H - fi.CropY); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } bool CheckBufferSizeInKB( mfxVideoParam & par , const Defaults::Param& defPar , mfxU16 bd) { mfxU32 changed = 0; auto W = defPar.base.GetCodedPicWidth(defPar); auto H = defPar.base.GetCodedPicHeight(defPar); mfxU16 cf = defPar.base.GetTargetChromaFormat(defPar) - 1; mfxU32 rawBytes = Legacy::GetRawBytes(W, H, cf, bd) / 1000; bool bCqpOrIcq = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ; bool bSetToRaw = bCqpOrIcq && BufferSizeInKB(par.mfx) < rawBytes; if (bSetToRaw) { BufferSizeInKB(par.mfx) = rawBytes; changed++; } else if (!bCqpOrIcq) { mfxU32 frN = 0, frD = 0; std::tie(frN, frD) = defPar.base.GetFrameRate(defPar); mfxU32 avgFS = mfxU32(std::ceil((mfxF64)TargetKbps(par.mfx) * frD / frN / 8)); if (BufferSizeInKB(par.mfx) < avgFS * 2 + 1) { BufferSizeInKB(par.mfx) = avgFS * 2 + 1; changed++; } if (par.mfx.CodecLevel) { mfxU32 maxCPB = GetMaxCpbInKBByLevel(par); if (BufferSizeInKB(par.mfx) > maxCPB) { BufferSizeInKB(par.mfx) = maxCPB; changed++; } } } return !!changed; } mfxStatus Legacy::CheckBRC( mfxVideoParam & par , const Defaults::Param& defPar) { mfxU32 changed = 0; mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (par.mfx.RateControlMethod == MFX_RATECONTROL_AVBR) { par.mfx.RateControlMethod = MFX_RATECONTROL_VBR; par.mfx.Accuracy = 0; par.mfx.Convergence = 0; changed++; } bool supportedRateControl = !CheckOrZero(par.mfx.RateControlMethod , 0 , !!defPar.caps.msdk.CBRSupport * MFX_RATECONTROL_CBR , !!defPar.caps.msdk.VBRSupport * MFX_RATECONTROL_VBR , !!defPar.caps.msdk.CQPSupport * MFX_RATECONTROL_CQP , !!defPar.caps.msdk.ICQSupport * MFX_RATECONTROL_ICQ , !!defPar.caps.VCMBitRateControl * MFX_RATECONTROL_VCM , !!defPar.caps.QVBRBRCSupport * MFX_RATECONTROL_QVBR ); MFX_CHECK(supportedRateControl, MFX_ERR_UNSUPPORTED); MFX_CHECK(par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ || !CheckMaxOrZero(par.mfx.ICQQuality, 51), MFX_ERR_UNSUPPORTED); changed += (( par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && par.mfx.MaxKbps != 0 && par.mfx.TargetKbps != 0) && CheckMinOrClip(par.mfx.MaxKbps, par.mfx.TargetKbps) && CheckMaxOrClip(par.mfx.TargetKbps, par.mfx.MaxKbps); auto bd = defPar.base.GetTargetBitDepthLuma(defPar); auto minQP = defPar.base.GetMinQPMFX(defPar); auto maxQP = defPar.base.GetMaxQPMFX(defPar); if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { changed += par.mfx.QPI && CheckMinOrClip(par.mfx.QPI, minQP); changed += par.mfx.QPI && CheckMaxOrClip(par.mfx.QPI, maxQP); changed += par.mfx.QPP && CheckMinOrClip(par.mfx.QPP, minQP); changed += par.mfx.QPP && CheckMaxOrClip(par.mfx.QPP, maxQP); changed += par.mfx.QPB && CheckMinOrClip(par.mfx.QPB, minQP); changed += par.mfx.QPB && CheckMaxOrClip(par.mfx.QPB, maxQP); } changed += par.mfx.BufferSizeInKB && CheckBufferSizeInKB(par, defPar, bd); if (pCO3) { MFX_CHECK(par.mfx.RateControlMethod != MFX_RATECONTROL_QVBR || !CheckMaxOrZero(pCO3->QVBRQuality, 51), MFX_ERR_UNSUPPORTED); auto GopRefDist = defPar.base.GetGopRefDist(defPar); mfxU16 QPPB[2] = { par.mfx.QPP, par.mfx.QPB }; mfxI16 QPX = QPPB[GopRefDist != 1] * (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP); bool bNoQpOffset = (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) || (GopRefDist > 1 && defPar.base.GetBRefType(defPar) == MFX_B_REF_OFF) || (GopRefDist == 1 && defPar.base.GetPRefType(defPar) == MFX_P_REF_SIMPLE); changed += CheckOrZero(pCO3->EnableQPOffset , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !bNoQpOffset)); auto CheckQPOffset = [&](mfxI16& QPO) { return CheckMinOrClip(QPO, minQP - QPX) + CheckMaxOrClip(QPO, maxQP - QPX); }; changed += IsOn(pCO3->EnableQPOffset) && QPX && std::count_if(std::begin(pCO3->QPOffset), std::end(pCO3->QPOffset), CheckQPOffset); changed += CheckOrZero(pCO3->EnableMBQP , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !!(defPar.caps.MbQpDataSupport))); auto sts = defPar.base.CheckWinBRC(defPar, par); MFX_CHECK(sts >= MFX_ERR_NONE, sts); changed += (sts > MFX_ERR_NONE); changed += CheckOrZero(pCO3->BRCPanicMode , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * !!(defPar.caps.HRDConformanceSupport))); } if (pCO2) { changed += CheckTriStateOrZero(pCO2->MBBRC); changed += ( defPar.caps.MBBRCSupport == 0 || par.mfx.RateControlMethod == MFX_RATECONTROL_CQP ) && CheckOrZero(pCO2->MBBRC); changed += !defPar.caps.SliceByteSizeCtrl && CheckOrZero(pCO2->MaxSliceSize); bool bMinMaxQpAllowed = (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) && (IsSWBRC(par)||IsOn(par.mfx.LowPower)); if (bMinMaxQpAllowed) { changed += pCO2->MinQPI && CheckRangeOrSetDefault(pCO2->MinQPI, minQP, maxQP, 0); changed += pCO2->MaxQPI && CheckRangeOrSetDefault(pCO2->MaxQPI, std::max(pCO2->MinQPI, minQP), maxQP, 0); changed += pCO2->MinQPP && CheckRangeOrSetDefault(pCO2->MinQPP, minQP, maxQP, 0); changed += pCO2->MaxQPP && CheckRangeOrSetDefault(pCO2->MaxQPP, std::max(pCO2->MinQPP, minQP), maxQP, 0); changed += pCO2->MinQPB && CheckRangeOrSetDefault(pCO2->MinQPB, minQP, maxQP, 0); changed += pCO2->MaxQPB && CheckRangeOrSetDefault(pCO2->MaxQPB, std::max(pCO2->MinQPB, minQP), maxQP, 0); } else { changed += CheckOrZero(pCO2->MinQPI, 0, minQP); changed += CheckOrZero(pCO2->MaxQPI, 0, maxQP); changed += CheckOrZero(pCO2->MinQPP, 0, minQP); changed += CheckOrZero(pCO2->MaxQPP, 0, maxQP); changed += CheckOrZero(pCO2->MinQPB, 0, minQP); changed += CheckOrZero(pCO2->MaxQPB, 0, maxQP); } } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxU32 Legacy::GetRawBytes(mfxU16 w, mfxU16 h, mfxU16 ChromaFormat, mfxU16 BitDepth) { mfxU32 s = w * h; if (ChromaFormat == MFX_CHROMAFORMAT_YUV420) s = s * 3 / 2; else if (ChromaFormat == MFX_CHROMAFORMAT_YUV422) s *= 2; else if (ChromaFormat == MFX_CHROMAFORMAT_YUV444) s *= 3; assert(BitDepth >= 8); if (BitDepth != 8) s = (s * BitDepth + 7) / 8; return s; } mfxStatus Legacy::CheckIOPattern(mfxVideoParam & par) { bool check_result = Check (par.IOPattern); MFX_CHECK(!check_result, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckGopRefDist(mfxVideoParam & par, const ENCODE_CAPS_HEVC& caps) { MFX_CHECK(par.mfx.GopRefDist, MFX_ERR_NONE); mfxU16 maxRefDist = std::max(1, !caps.SliceIPOnly * (par.mfx.GopPicSize - 1)); MFX_CHECK(!CheckMaxOrClip(par.mfx.GopRefDist, maxRefDist), MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus Legacy::CheckTU(mfxVideoParam & par, const ENCODE_CAPS_HEVC& caps) { auto& tu = par.mfx.TargetUsage; if (CheckMaxOrZero(tu, 7u)) MFX_RETURN(MFX_ERR_UNSUPPORTED); if (!tu) return MFX_ERR_NONE; auto support = caps.TUSupport; mfxI16 abs_diff = 0; bool sign = 0; mfxI16 newtu = tu; do { newtu = tu + (1 - 2 * sign) * abs_diff; abs_diff += !sign; sign = !sign; } while (!(support & (1 << (newtu - 1))) && newtu > 0); if (tu != newtu) { tu = newtu; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; } mfxStatus Legacy::CheckTiles( mfxVideoParam & par , const Defaults::Param& defPar) { mfxExtHEVCTiles* pTile = ExtBuffer::Get(par); MFX_CHECK(pTile, MFX_ERR_NONE); mfxU16 MaxTileColumns = MAX_NUM_TILE_COLUMNS , MaxTileRows = MAX_NUM_TILE_ROWS , changed = 0; if (!defPar.caps.TileSupport) { MaxTileColumns = 1; MaxTileRows = 1; } else { mfxU32 minTileWidth = MIN_TILE_WIDTH_IN_SAMPLES; mfxU32 minTileHeight = MIN_TILE_HEIGHT_IN_SAMPLES; // min 2x2 lcu is supported on VDEnc SetIf(minTileHeight, defPar.caps.NumScalablePipesMinus1 > 0 && IsOn(par.mfx.LowPower), 128); mfxU16 maxCol = std::max(1, mfxU16(defPar.base.GetCodedPicWidth(defPar) / minTileWidth)); mfxU16 maxRow = std::max(1, mfxU16(defPar.base.GetCodedPicHeight(defPar) / minTileHeight)); changed += CheckMaxOrClip(pTile->NumTileColumns, maxCol); changed += CheckMaxOrClip(pTile->NumTileRows, maxRow); } MFX_CHECK(!CheckMaxOrClip(pTile->NumTileColumns, MaxTileColumns), MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckMaxOrClip(pTile->NumTileRows, MaxTileRows), MFX_ERR_UNSUPPORTED); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } void Legacy::CheckQuery0(const ParamSupport& sprt, mfxVideoParam& par) { std::vector onesBuf(sizeof(par), 1); auto ExtParam = par.ExtParam; auto NumExtParam = par.NumExtParam; par = mfxVideoParam{}; for (auto& copy : sprt.m_mvpCopySupported) copy((mfxVideoParam*)onesBuf.data(), &par); par.ExtParam = ExtParam; par.NumExtParam = NumExtParam; if (par.ExtParam) { for (mfxU32 i = 0; i < par.NumExtParam; i++) { if (!par.ExtParam[i]) continue; mfxExtBuffer header = *par.ExtParam[i]; memset(par.ExtParam[i], 0, header.BufferSz); *par.ExtParam[i] = header; auto it = sprt.m_ebCopySupported.find(header.BufferId); if (it != sprt.m_ebCopySupported.end()) { if (onesBuf.size() < header.BufferSz) onesBuf.insert(onesBuf.end(), header.BufferSz - mfxU32(onesBuf.size()), 1); auto pSrc = (mfxExtBuffer*)onesBuf.data(); *pSrc = header; for (auto& copy : it->second) copy(pSrc, par.ExtParam[i]); } } } } mfxStatus Legacy::CheckBuffers(const ParamSupport& sprt, const mfxVideoParam& in, const mfxVideoParam* out) { MFX_CHECK(!(!in.NumExtParam && (!out || !out->NumExtParam)), MFX_ERR_NONE); MFX_CHECK(in.ExtParam, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(!(out && (!out->ExtParam || out->NumExtParam != in.NumExtParam)) , MFX_ERR_UNDEFINED_BEHAVIOR); std::map detected[2]; mfxU32 dId = 0; for (auto pPar : { &in, out }) { if (!pPar) continue; for (mfxU32 i = 0; i < pPar->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(pPar->ExtParam[i]); auto id = pPar->ExtParam[i]->BufferId; MFX_CHECK(sprt.m_ebCopySupported.find(id) != sprt.m_ebCopySupported.end(), MFX_ERR_UNSUPPORTED); MFX_CHECK(!(detected[dId][id]++), MFX_ERR_UNDEFINED_BEHAVIOR); } dId++; } MFX_CHECK(!(out && detected[0] != detected[1]), MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_ERR_NONE; } mfxStatus Legacy::CopyConfigurable(const ParamSupport& sprt, const mfxVideoParam& in, mfxVideoParam& out) { using TFnCopyMVP = std::function; using TFnCopyEB = std::function; auto CopyMVP = [&](const mfxVideoParam& src, mfxVideoParam& dst) { std::for_each(sprt.m_mvpCopySupported.begin(), sprt.m_mvpCopySupported.end() , [&](const TFnCopyMVP& copy) { copy(&src, &dst); }); }; auto CopyEB = [](const std::list& copyList, const mfxExtBuffer* pIn, mfxExtBuffer* pOut) { std::for_each(copyList.begin(), copyList.end() , [&](const TFnCopyEB& copy) { copy(pIn, pOut); }); }; mfxVideoParam tmpMVP = {}; CopyMVP(in, tmpMVP); tmpMVP.NumExtParam = out.NumExtParam; tmpMVP.ExtParam = out.ExtParam; out = tmpMVP; std::list outBufs(out.ExtParam, out.ExtParam + out.NumExtParam); outBufs.sort(); outBufs.remove(nullptr); std::for_each(outBufs.begin(), outBufs.end() , [&](mfxExtBuffer* pEbOut) { std::vector ebTmp(pEbOut->BufferSz, mfxU8(0)); auto pEbIn = ExtBuffer::Get(in, pEbOut->BufferId); auto copyIt = sprt.m_ebCopySupported.find(pEbOut->BufferId); auto copyPtrsIt = sprt.m_ebCopyPtrs.find(pEbOut->BufferId); mfxExtBuffer* pEbTmp = (mfxExtBuffer*)ebTmp.data(); bool bCopyPar = pEbIn && copyIt != sprt.m_ebCopySupported.end(); bool bCopyPtr = copyPtrsIt != sprt.m_ebCopyPtrs.end(); *pEbTmp = *pEbOut; if (bCopyPtr) { CopyEB(copyPtrsIt->second, pEbOut, pEbTmp); } if (bCopyPar) { CopyEB(copyIt->second, pEbIn, pEbTmp); } std::copy_n(ebTmp.data(), ebTmp.size(), (mfxU8*)pEbOut); }); return MFX_ERR_NONE; } mfxStatus Legacy::CheckCodedPicSize( mfxVideoParam & par , const Defaults::Param& defPar) { mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); MFX_CHECK(pHEVC, MFX_ERR_NONE); auto alignment = defPar.base.GetCodedPicAlignment(defPar); auto& W = pHEVC->PicWidthInLumaSamples; auto& H = pHEVC->PicHeightInLumaSamples; auto AW = mfx::align2_value(W, alignment); auto AH = mfx::align2_value(H, alignment); MFX_CHECK(!CheckMaxOrZero(W, par.mfx.FrameInfo.Width), MFX_ERR_UNSUPPORTED); MFX_CHECK(!CheckMaxOrZero(H, par.mfx.FrameInfo.Height), MFX_ERR_UNSUPPORTED); if ((W != AW) || (H != AH)) { W = AW; H = AH; return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return MFX_ERR_NONE; } mfxU16 FrameType2SliceType(mfxU32 ft) { bool bB = IsB(ft); bool bP = !bB && IsP(ft); return 1 * bP + 2 * !(bB || bP); } bool isCurrLt( DpbArray const & DPB, mfxU8 const (&RefPicList)[2][MAX_DPB_SIZE], mfxU8 const (&numRefActive)[2], mfxI32 poc) { for (mfxU32 i = 0; i < 2; i++) for (mfxU32 j = 0; j < numRefActive[i]; j++) if (poc == DPB[RefPicList[i][j]].POC) return DPB[RefPicList[i][j]].isLTR; return false; } inline bool isCurrLt(const TaskCommonPar & task, mfxI32 poc) { return isCurrLt(task.DPB.Active, task.RefPicList, task.NumRefActive, poc); } template inline T Lsb(T val, mfxU32 maxLSB) { if (val >= 0) return val % maxLSB; return (maxLSB - ((-val) % maxLSB)) % maxLSB; } bool isForcedDeltaPocMsbPresent( const TaskCommonPar & prevTask, mfxI32 poc, mfxU32 MaxPocLsb) { DpbArray const & DPB = prevTask.DPB.Active; if (Lsb(prevTask.POC, MaxPocLsb) == Lsb(poc, MaxPocLsb)) return true; for (mfxU16 i = 0; !isDpbEnd(DPB, i); i++) if (DPB[i].POC != poc && Lsb(DPB[i].POC, MaxPocLsb) == Lsb(poc, MaxPocLsb)) return true; return false; } mfxU16 GetSliceHeaderLTRs( const TaskCommonPar& task , const TaskCommonPar& prevTask , const DpbArray & DPB , const SPS& sps , mfxI32 (<R)[MAX_NUM_LONG_TERM_PICS] , Slice & s) { mfxU16 nLTR = 0; size_t nDPBLT = 0; mfxU32 MaxPocLsb = (1<<(sps.log2_max_pic_order_cnt_lsb_minus4+4)); mfxU32 dPocCycleMSBprev = 0; mfxI32 DPBLT[MAX_DPB_SIZE] = {}; mfxI32 InvalidPOC = -9000; std::transform(DPB, DPB + mfx::size(DPB), DPBLT , [InvalidPOC](const DpbFrame& x) { return (x.isLTR && isValid(x)) ? x.POC : InvalidPOC; }); nDPBLT = std::remove_if(DPBLT, DPBLT + mfx::size(DPBLT) , [InvalidPOC](mfxI32 x) { return x == InvalidPOC; }) - DPBLT; std::sort(DPBLT, DPBLT + nDPBLT, std::greater()); // sort for DeltaPocMsbCycleLt (may only increase) // insert LTR using lt_ref_pic_poc_lsb_sps std::for_each(DPBLT, DPBLT + nDPBLT, [&](mfxI32& ltpoc) { mfxU32 dPocCycleMSB = (task.POC / MaxPocLsb - ltpoc / MaxPocLsb); mfxU32 dPocLSB = ltpoc - (task.POC - dPocCycleMSB * MaxPocLsb - s.pic_order_cnt_lsb); size_t ltId = std::find_if( sps.lt_ref_pic_poc_lsb_sps , sps.lt_ref_pic_poc_lsb_sps + sps.num_long_term_ref_pics_sps , [&](const mfxU16& ltPocLsb) { return dPocLSB == ltPocLsb && isCurrLt(task, DPBLT[ltpoc]) == !!sps.used_by_curr_pic_lt_sps_flag[sps.lt_ref_pic_poc_lsb_sps - <PocLsb] && dPocCycleMSB >= dPocCycleMSBprev; }) - sps.lt_ref_pic_poc_lsb_sps; if (ltId >= sps.num_long_term_ref_pics_sps) return; auto& curlt = s.lt[s.num_long_term_sps]; curlt.lt_idx_sps = ltId; curlt.used_by_curr_pic_lt_flag = !!sps.used_by_curr_pic_lt_sps_flag[ltId]; curlt.poc_lsb_lt = sps.lt_ref_pic_poc_lsb_sps[ltId]; curlt.delta_poc_msb_cycle_lt = dPocCycleMSB - dPocCycleMSBprev; curlt.delta_poc_msb_present_flag = !!curlt.delta_poc_msb_cycle_lt || isForcedDeltaPocMsbPresent(prevTask, ltpoc, MaxPocLsb); dPocCycleMSBprev = dPocCycleMSB; ++s.num_long_term_sps; if (curlt.used_by_curr_pic_lt_flag) { assert(nLTR < MAX_NUM_LONG_TERM_PICS); LTR[nLTR++] = ltpoc; } ltpoc = InvalidPOC; }); nDPBLT = std::remove_if(DPBLT, DPBLT + nDPBLT , [InvalidPOC](mfxI32 x) { return x == InvalidPOC; }) - DPBLT; dPocCycleMSBprev = 0; std::for_each(DPBLT, DPBLT + nDPBLT, [&](mfxI32 ltpoc) { auto& curlt = s.lt[s.num_long_term_sps + s.num_long_term_pics]; mfxU32 dPocCycleMSB = (task.POC / MaxPocLsb - ltpoc / MaxPocLsb); mfxU32 dPocLSB = ltpoc - (task.POC - dPocCycleMSB * MaxPocLsb - s.pic_order_cnt_lsb); assert(dPocCycleMSB >= dPocCycleMSBprev); curlt.used_by_curr_pic_lt_flag = isCurrLt(task, ltpoc); curlt.poc_lsb_lt = dPocLSB; curlt.delta_poc_msb_cycle_lt = dPocCycleMSB - dPocCycleMSBprev; curlt.delta_poc_msb_present_flag = !!curlt.delta_poc_msb_cycle_lt || isForcedDeltaPocMsbPresent(prevTask, ltpoc, MaxPocLsb); dPocCycleMSBprev = dPocCycleMSB; ++s.num_long_term_pics; if (curlt.used_by_curr_pic_lt_flag) { if (nLTR < MAX_NUM_LONG_TERM_PICS) //KW LTR[nLTR++] = ltpoc; else assert(!"too much LTRs"); } }); return nLTR; } void GetSliceHeaderRPLMod( const TaskCommonPar& task , const DpbArray & DPB , const mfxI32 (&STR)[2][MAX_DPB_SIZE] , const mfxU16 (&nSTR)[2] , const mfxI32 LTR[MAX_NUM_LONG_TERM_PICS] , mfxU16 nLTR , Slice & s) { auto& RefPicList = task.RefPicList; auto ModLX = [&](mfxU16 lx, mfxU16 NumRpsCurrTempListX) { mfxU16 rIdx = 0; mfxI32 RPLTempX[16] = {}; // default ref. list without modifications auto AddRef = [&](mfxI32 ref) { RPLTempX[rIdx++] = ref; }; while (rIdx < NumRpsCurrTempListX) { std::for_each(STR[lx], STR[lx] + std::min(nSTR[lx], NumRpsCurrTempListX - rIdx), AddRef); std::for_each(STR[!lx], STR[!lx] + std::min(nSTR[!lx], NumRpsCurrTempListX - rIdx), AddRef); std::for_each(LTR, LTR + std::min(nLTR, NumRpsCurrTempListX - rIdx), AddRef); } for (rIdx = 0; rIdx < task.NumRefActive[lx]; rIdx++) { auto pRef = std::find_if(RPLTempX, RPLTempX + NumRpsCurrTempListX , [&](mfxI32 ref) {return DPB[RefPicList[lx][rIdx]].POC == ref; }); s.list_entry_lx[lx][rIdx] = mfxU8(pRef - RPLTempX); s.ref_pic_list_modification_flag_lx[lx] |= (s.list_entry_lx[lx][rIdx] != rIdx); } }; ModLX(0, std::max(nSTR[0] + nSTR[1] + nLTR, task.NumRefActive[0])); ModLX(1, std::max(nSTR[0] + nSTR[1] + nLTR, task.NumRefActive[1])); } mfxStatus Legacy::GetSliceHeader( const ExtBuffer::Param & par , const TaskCommonPar& task , const SPS& sps , const PPS& pps , Slice & s) { bool isP = IsP(task.FrameType); bool isB = IsB(task.FrameType); bool isI = IsI(task.FrameType); ThrowAssert(isP + isB + isI != 1, "task.FrameType is invalid"); s = {}; s.first_slice_segment_in_pic_flag = 1; s.no_output_of_prior_pics_flag = 0; s.pic_parameter_set_id = pps.pic_parameter_set_id; s.type = FrameType2SliceType(task.FrameType); s.pic_output_flag = !!pps.output_flag_present_flag; assert(0 == sps.separate_colour_plane_flag); bool bNonIdrNut = task.SliceNUT != IDR_W_RADL && task.SliceNUT != IDR_N_LP; if (bNonIdrNut) { mfxU16 nLTR = 0, nSTR[2] = {}; mfxI32 STR[2][MAX_DPB_SIZE] = {}; // used short-term references mfxI32 LTR[MAX_NUM_LONG_TERM_PICS] = {}; // used long-term references const auto& DPB = task.DPB.Active; // DPB before encoding const auto& RefPicList = task.RefPicList; // Ref. Pic. List auto IsSame = [&s](const STRPS& x) { return Equal(x, s.strps); }; auto IsLTR = [](const DpbFrame& ref) { return isValid(ref) && ref.isLTR; }; auto IsL0Pic = [](const STRPSPic& pic) { return pic.used_by_curr_pic_sx_flag && (pic.DeltaPocSX <= 0); }; auto IsL1Pic = [](const STRPSPic& pic) { return pic.used_by_curr_pic_sx_flag && (pic.DeltaPocSX > 0); }; auto PicToPOC = [&](const STRPSPic& pic) { return (task.POC + pic.DeltaPocSX); }; MFX_CHECK(std::max(task.NumRefActive[0], task.NumRefActive[1]) <= MAX_DPB_SIZE, MFX_ERR_INVALID_VIDEO_PARAM) ConstructSTRPS(DPB, RefPicList, task.NumRefActive, task.POC, s.strps); s.pic_order_cnt_lsb = (task.POC & ~(0xFFFFFFFF << (sps.log2_max_pic_order_cnt_lsb_minus4 + 4))); s.short_term_ref_pic_set_idx = mfxU8(std::find_if(sps.strps, sps.strps + sps.num_short_term_ref_pic_sets, IsSame) - sps.strps); s.short_term_ref_pic_set_sps_flag = (s.short_term_ref_pic_set_idx < sps.num_short_term_ref_pic_sets); if (!s.short_term_ref_pic_set_sps_flag) OptimizeSTRPS(sps.strps, sps.num_short_term_ref_pic_sets, s.strps, sps.num_short_term_ref_pic_sets); std::list picsUsed[2]; auto itStrpsPicsBegin = s.strps.pic; auto itStrpsPicsEnd = s.strps.pic + mfxU32(s.strps.num_negative_pics + s.strps.num_positive_pics); std::copy_if(itStrpsPicsBegin, itStrpsPicsEnd, std::back_inserter(picsUsed[0]), IsL0Pic); std::copy_if(itStrpsPicsBegin, itStrpsPicsEnd, std::back_inserter(picsUsed[1]), IsL1Pic); nSTR[0] = mfxU16(std::transform(picsUsed[0].begin(), picsUsed[0].end(), STR[0], PicToPOC) - STR[0]); nSTR[1] = mfxU16(std::transform(picsUsed[1].begin(), picsUsed[1].end(), STR[1], PicToPOC) - STR[1]); if (std::any_of(DPB, DPB + mfx::size(DPB), IsLTR)) { assert(sps.long_term_ref_pics_present_flag); nLTR = GetSliceHeaderLTRs(task, m_prevTask, DPB, sps, LTR, s); } if (pps.lists_modification_present_flag) { GetSliceHeaderRPLMod(task, DPB, STR, nSTR, LTR, nLTR, s); } } s.temporal_mvp_enabled_flag = !!sps.temporal_mvp_enabled_flag; if (sps.sample_adaptive_offset_enabled_flag) { const mfxExtHEVCParam* rtHEVCParam = ExtBuffer::Get(task.ctrl); const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); mfxU16 FrameSAO = (rtHEVCParam && rtHEVCParam->SampleAdaptiveOffset) ? rtHEVCParam->SampleAdaptiveOffset : HEVCParam.SampleAdaptiveOffset; s.sao_luma_flag = !!(FrameSAO & MFX_SAO_ENABLE_LUMA); s.sao_chroma_flag = !!(FrameSAO & MFX_SAO_ENABLE_CHROMA); } if (!isI) { s.num_ref_idx_active_override_flag = ( pps.num_ref_idx_l0_default_active_minus1 + 1 != task.NumRefActive[0] || (isB && pps.num_ref_idx_l1_default_active_minus1 + 1 != task.NumRefActive[1])); s.num_ref_idx_l0_active_minus1 = task.NumRefActive[0] - 1; s.num_ref_idx_l1_active_minus1 = isB * (task.NumRefActive[1] - 1); s.mvd_l1_zero_flag &= !isB; s.cabac_init_flag = 0; s.collocated_from_l0_flag = !!s.temporal_mvp_enabled_flag; s.five_minus_max_num_merge_cand = 0; } bool bSetQPd = par.mfx.RateControlMethod == MFX_RATECONTROL_CQP; s.slice_qp_delta = mfxI8((task.QpY - (pps.init_qp_minus26 + 26)) * bSetQPd); s.slice_cb_qp_offset = 0; s.slice_cr_qp_offset = 0; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(task.ctrl); SetDefault(pCO2, &CO2); s.deblocking_filter_disabled_flag = !!pCO2->DisableDeblockingIdc; s.deblocking_filter_override_flag = (s.deblocking_filter_disabled_flag != pps.deblocking_filter_disabled_flag); s.beta_offset_div2 = pps.beta_offset_div2; s.tc_offset_div2 = pps.tc_offset_div2; s.loop_filter_across_slices_enabled_flag = pps.loop_filter_across_slices_enabled_flag; s.num_entry_point_offsets *= !(pps.tiles_enabled_flag || pps.entropy_coding_sync_enabled_flag); return MFX_ERR_NONE; } bool Legacy::IsMain10SP(const mfxU16 codecProfile, const mfxExtHEVCParam* pHEVC) { return codecProfile == MFX_PROFILE_HEVC_MAIN10 && pHEVC && pHEVC->GeneralConstraintFlags == MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY; } #endif hevcehw_base_legacy.h000066400000000000000000000334761443134507600340340ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_ddi.h" #include "hevcehw_base_data.h" #include "mfx_enc_common.h" #include namespace HEVCEHW { namespace Base { enum FType { // Frame type for GetMaxNumRef tuple P = 0, BL0 = 1, BL1 = 2 }; class Legacy : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Query0 )\ DECL_BLOCK(SetLogging )\ DECL_BLOCK(SetDefaultsCallChain )\ DECL_BLOCK(PreCheckCodecId )\ DECL_BLOCK(PreCheckChromaFormat )\ DECL_BLOCK(PreCheckExtBuffers )\ DECL_BLOCK(CopyConfigurable )\ DECL_BLOCK(SetLowPowerDefault )\ DECL_BLOCK(CheckHeaders )\ DECL_BLOCK(CheckLCUSize )\ DECL_BLOCK(CheckFormat )\ DECL_BLOCK(CheckLowDelayBRC )\ DECL_BLOCK(CheckLevel )\ DECL_BLOCK(CheckSurfSize )\ DECL_BLOCK(CheckCodedPicSize )\ DECL_BLOCK(CheckTiles )\ DECL_BLOCK(CheckTU )\ DECL_BLOCK(CheckTemporalLayers )\ DECL_BLOCK(CheckGopRefDist )\ DECL_BLOCK(CheckNumRefFrame )\ DECL_BLOCK(CheckIOPattern )\ DECL_BLOCK(CheckBRC )\ DECL_BLOCK(CheckCrops )\ DECL_BLOCK(CheckShift )\ DECL_BLOCK(CheckFrameRate )\ DECL_BLOCK(CheckSlices )\ DECL_BLOCK(CheckBPyramid )\ DECL_BLOCK(CheckPPyramid )\ DECL_BLOCK(CheckIntraRefresh )\ DECL_BLOCK(CheckSkipFrame )\ DECL_BLOCK(CheckGPB )\ DECL_BLOCK(CheckESPackParam )\ DECL_BLOCK(CheckNumRefActive )\ DECL_BLOCK(CheckSAO )\ DECL_BLOCK(CheckProfile )\ DECL_BLOCK(CheckLevelConstraints)\ DECL_BLOCK(CheckVideoParam )\ DECL_BLOCK(SetDefaults )\ DECL_BLOCK(SetFrameAllocRequest )\ DECL_BLOCK(SetVPS )\ DECL_BLOCK(SetSPS )\ DECL_BLOCK(NestSTRPS )\ DECL_BLOCK(SetSTRPS )\ DECL_BLOCK(SetPPS )\ DECL_BLOCK(SetSlices )\ DECL_BLOCK(SetReorder )\ DECL_BLOCK(AllocRaw )\ DECL_BLOCK(AllocBS )\ DECL_BLOCK(AllocMBQP )\ DECL_BLOCK(ResetInit )\ DECL_BLOCK(ResetCheck )\ DECL_BLOCK(ResetState )\ DECL_BLOCK(CheckSurf )\ DECL_BLOCK(CheckBS )\ DECL_BLOCK(AllocTask )\ DECL_BLOCK(InitTask )\ DECL_BLOCK(PrepareTask )\ DECL_BLOCK(ConfigureTask )\ DECL_BLOCK(SkipFrame )\ DECL_BLOCK(GetRawHDL )\ DECL_BLOCK(CopySysToRaw )\ DECL_BLOCK(FillCUQPSurf )\ DECL_BLOCK(CopyBS )\ DECL_BLOCK(DoPadding )\ DECL_BLOCK(UpdateBsInfo )\ DECL_BLOCK(SetRawInfo )\ DECL_BLOCK(SetVideoParam )\ DECL_BLOCK(FreeTask ) #define DECL_FEATURE_NAME "Base_Legacy" #include "hevcehw_decl_blocks.h" Legacy(mfxU32 id) : FeatureBase(id) { } protected: TaskCommonPar m_prevTask; mfxU32 m_frameOrder = mfxU32(-1) , m_baseLayerOrder = 0 , m_forceHeaders = 0; mfxU16 m_CUQPBlkW = 0 , m_CUQPBlkH = 0; mfxLastKeyFrameInfo LastKeyFrameInfo = {}; std::function(const mfxVideoParam&)> m_GetMaxRef; std::unique_ptr m_pQWCDefaults; NotNull m_pQNCDefaults; eMFXHWType m_hw = MFX_HW_UNKNOWN; void ResetState() { m_frameOrder = mfxU32(-1); LastKeyFrameInfo = {}; m_baseLayerOrder = 0; Invalidate(m_prevTask); } public: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void Query0(const FeatureBlocks& blocks, TPushQ0 Push) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void QueryIOSurf(const FeatureBlocks& blocks, TPushQIS Push) override; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void FrameSubmit(const FeatureBlocks& blocks, TPushFS Push) override; virtual void AllocTask(const FeatureBlocks& blocks, TPushAT Push) override; virtual void InitTask(const FeatureBlocks& blocks, TPushIT Push) override; virtual void PreReorderTask(const FeatureBlocks& blocks, TPushPreRT Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void FreeTask(const FeatureBlocks& blocks, TPushFT Push) override; virtual void GetVideoParam(const FeatureBlocks& blocks, TPushGVP Push) override; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; static void PushDefaults(Defaults& df); void CheckQuery0(const ParamSupport& sprt, mfxVideoParam& par); mfxStatus CheckBuffers(const ParamSupport& sprt, const mfxVideoParam& in, const mfxVideoParam* out = nullptr); mfxStatus CopyConfigurable(const ParamSupport& sprt, const mfxVideoParam& in, mfxVideoParam& out); mfxStatus CheckCodedPicSize( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckTiles( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckTU(mfxVideoParam & par, const ENCODE_CAPS_HEVC& caps); mfxStatus CheckGopRefDist(mfxVideoParam & par, const ENCODE_CAPS_HEVC& caps); mfxStatus CheckIOPattern(mfxVideoParam & par); mfxStatus CheckBRC( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckCrops( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckShift(mfxVideoParam & par); mfxStatus CheckFrameRate(mfxVideoParam & par); mfxStatus CheckNumRefFrame( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckSlices( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckBPyramid( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckPPyramid(mfxVideoParam & par); mfxStatus CheckTemporalLayers(mfxVideoParam & par); mfxStatus CheckIntraRefresh( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckSkipFrame(mfxVideoParam & par); mfxStatus CheckGPB(mfxVideoParam & par); mfxStatus CheckESPackParam(mfxVideoParam & par, eMFXHWType hw); mfxStatus CheckLevelConstraints( mfxVideoParam & par , const Defaults::Param& defPar); mfxStatus CheckSPS(const SPS& sps, const ENCODE_CAPS_HEVC& caps, eMFXHWType hw); mfxStatus CheckPPS(const PPS& sps, const ENCODE_CAPS_HEVC& caps, eMFXHWType hw); void SetDefaults( mfxVideoParam& par , const Defaults::Param& defPar , bool bExternalFrameAllocator); void SetSTRPS( const Defaults::Param& dflts , SPS& sps , const Reorderer& reorder); void ConfigureTask( TaskCommonPar & task , const Defaults::Param& dflts , const SPS& sps); mfxStatus GetSliceHeader( const ExtBuffer::Param & par , const TaskCommonPar& task , const SPS& sps , const PPS& pps , Slice & s); static mfxU32 GetRawBytes(mfxU16 w, mfxU16 h, mfxU16 ChromaFormat, mfxU16 BitDepth); static bool IsInVideoMem(const mfxVideoParam & par); static bool IsTCBRC(const mfxVideoParam & par, mfxU16 tcbrcSupport); static bool IsMain10SP(const mfxU16 codecProfile, const mfxExtHEVCParam* pHEVC); static inline MBQPMode GetMBQPMode(const ENCODE_CAPS_HEVC& caps, const mfxVideoParam& par) { return ::GetMBQPMode(par, caps.MaxNumOfROI, caps.ROIDeltaQPSupport, caps.MbQpDataSupport, false); } static inline bool IsSWBRC(const mfxVideoParam& par) { return ::IsSWBRCMode(par); } mfxU16 GetMaxRaw(const mfxVideoParam & par) { // Extend extra Raw for frames buffered between LA submit and LA Query stage const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxU16 extRaw = pCO2 ? pCO2->LookAheadDepth : 0; return par.AsyncDepth + (par.mfx.GopRefDist - 1) + (par.AsyncDepth > 1) + extRaw; } mfxU16 GetMaxMBMaps(mfxVideoParam const& par) { // Extend extra Raw for frames buffered between LA submit and LA Query stage const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); return par.AsyncDepth + ((pCO2 && pCO2->LookAheadDepth) ? (par.mfx.GopRefDist - 1) : 0) + (par.AsyncDepth > 1); } mfxU16 GetMaxBS(mfxVideoParam const & par) { return par.AsyncDepth + (par.AsyncDepth > 1); } mfxU32 GetMinBsSize(const ExtBuffer::Param& par); static std::tuple GetCUQPMapBlockSize( mfxU16 frameWidth, mfxU16 frameHeight, mfxU16 CUQPWidth, mfxU16 CUHeight); void ConstructRPL( const Defaults::Param& dflts , const DpbArray & DPB , const FrameBaseInfo& cur , mfxU8(&RefPicList)[2][MAX_DPB_SIZE] , mfxU8(&numRefActive)[2] , const mfxExtAVCRefLists * pExtLists = nullptr , const mfxExtAVCRefListCtrl * pLCtrl = nullptr); void ConstructSTRPS( const DpbArray & DPB , const mfxU8(&RefPicList)[2][MAX_DPB_SIZE] , const mfxU8 (&numRefActive)[2] , mfxI32 poc , STRPS& rps); void InitDPB( TaskCommonPar & task, TaskCommonPar const & prevTask, const mfxExtAVCRefListCtrl* pLCtrl); mfxU16 UpdateDPB( const Defaults::Param& dflts , const DpbFrame& task , DpbArray & dpb , const mfxExtAVCRefListCtrl * pLCtrl = nullptr); static bool IsCurrRef( const DpbArray & DPB , const mfxU8 (&RefPicList)[2][MAX_DPB_SIZE] , const mfxU8 (&numRefActive)[2] , mfxI32 poc) { for (mfxU32 i = 0; i < 2; i++) for (mfxU32 j = 0; j < numRefActive[i]; j++) if (poc == DPB[RefPicList[i][j]].POC) return true; return false; } static mfxU8 GetDPBIdxByFO(DpbArray const & DPB, mfxU32 fo) { for (mfxU8 i = 0; !isDpbEnd(DPB, i); i++) if (DPB[i].DisplayOrder == fo) return i; return mfxU8(MAX_DPB_SIZE); } static mfxU8 GetDPBIdxByPoc(DpbArray const & DPB, mfxI32 poc) { for (mfxU8 i = 0; !isDpbEnd(DPB, i); i++) if (DPB[i].POC == poc) return i; return mfxU8(MAX_DPB_SIZE); } static mfxU32 GetBiFrameLocation(mfxU32 i, mfxU32 num, bool &ref, mfxU32 &level); Defaults::Param GetRTDefaults(StorageR& strg) { return Defaults::Param( Glob::VideoParam::Get(strg) , Glob::EncodeCaps::Get(strg) , m_hw , Glob::Defaults::Get(strg)); } using TItWrap = TaskItWrap; using TItWrapIt = std::list::iterator; static TItWrapIt BPyrReorder(TItWrapIt begin, TItWrapIt end); static TItWrap Reorder( ExtBuffer::Param const & par , DpbArray const & dpb , TItWrap begin , TItWrap end , bool flush); }; } //Base } //namespace HEVCEHW #endif hevcehw_base_legacy_defaults.cpp000066400000000000000000003121421443134507600362440ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_legacy.h" #include "hevcehw_base_data.h" #include "hevcehw_base_constraints.h" #include #include using namespace HEVCEHW; using namespace HEVCEHW::Base; class TemporalLayers { public: TemporalLayers() : m_numTL(1) { m_TL[0].Scale = 1; } TemporalLayers(const mfxExtAvcTemporalLayers& tl) { SetTL(tl); } ~TemporalLayers() {} static mfxU16 CountTL(const mfxExtAvcTemporalLayers& tl); void SetTL(mfxExtAvcTemporalLayers const & tl) { m_numTL = 0; memset(&m_TL, 0, sizeof(m_TL)); m_TL[0].Scale = 1; for (mfxU8 i = 0; i < 7; i++) { if (tl.Layer[i].Scale) { m_TL[m_numTL].TId = i; m_TL[m_numTL].Scale = (mfxU8)tl.Layer[i].Scale; m_numTL++; } } m_numTL = std::max(m_numTL, 1); } mfxU8 NumTL() const { return m_numTL; } mfxU8 GetTId(mfxU32 frameOrder) const { mfxU16 i; if (m_numTL < 1 || m_numTL > 8) return 0; for (i = 0; i < m_numTL && (frameOrder % (m_TL[m_numTL - 1].Scale / m_TL[i].Scale)); i++); return (i < m_numTL) ? m_TL[i].TId : 0; } mfxU8 HighestTId() const { mfxU8 htid = m_TL[m_numTL - 1].TId; return mfxU8(htid + !htid * -1); } private: mfxU8 m_numTL; struct { mfxU8 TId = 0; mfxU8 Scale = 0; }m_TL[8]; }; mfxU16 TemporalLayers::CountTL(const mfxExtAvcTemporalLayers& tl) { typedef decltype(tl.Layer[0]) TRLayer; return std::max(1, (mfxU16)std::count_if( tl.Layer, tl.Layer + mfx::size(tl.Layer), [](TRLayer l) { return !!l.Scale; })); } class GetDefault { public: static mfxU16 CodedPicAlignment( Defaults::TChain::TExt , const Defaults::Param& par) { (void)par; return mfxU16(8); } static mfxU16 CodedPicWidth( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); if (pHEVC && pHEVC->PicWidthInLumaSamples) { return pHEVC->PicWidthInLumaSamples; } auto& fi = par.mvp.mfx.FrameInfo; bool bCropsValid = fi.CropW > 0; mfxU16 W = mfxU16(bCropsValid * (fi.CropW + fi.CropX) + !bCropsValid * fi.Width); return mfx::align2_value(W, par.base.GetCodedPicAlignment(par)); } static mfxU16 CodedPicHeight( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); if (pHEVC && pHEVC->PicHeightInLumaSamples) { return pHEVC->PicHeightInLumaSamples; } auto& fi = par.mvp.mfx.FrameInfo; bool bCropsValid = fi.CropH > 0; mfxU16 H = mfxU16(bCropsValid * (fi.CropH + fi.CropY) + !bCropsValid * fi.Height); return mfx::align2_value(H, par.base.GetCodedPicAlignment(par)); } static mfxU16 MaxDPB( Defaults::TChain::TExt , const Defaults::Param& par) { if (!par.mvp.mfx.CodecLevel) { return 16; } auto W = par.base.GetCodedPicWidth(par); auto H = par.base.GetCodedPicHeight(par); return GetMaxDpbSizeByLevel(par.mvp, W * H); } static mfxU16 GopPicSize( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.GopPicSize) { return par.mvp.mfx.GopPicSize; } const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); if (par.mvp.mfx.CodecProfile == MFX_PROFILE_HEVC_MAINSP || Legacy::IsMain10SP(par.mvp.mfx.CodecProfile, pHEVC)) { return 1; } return mfxU16(GOP_INFINITE); } static mfxU16 GopRefDist( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.GopRefDist) { return par.mvp.mfx.GopRefDist; } auto GopPicSize = par.base.GetGopPicSize(par); const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bNoB = (pCO2 && pCO2->IntRefType) || par.base.GetNumTemporalLayers(par) > 1 || par.caps.SliceIPOnly || GopPicSize < 3 || par.mvp.mfx.NumRefFrame == 1; bool bCQP = par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_CQP || Legacy::IsSWBRC(par.mvp); if (bNoB) { return 1; } return std::min(GopPicSize - 1, 4 * (1 + bCQP)); } static mfxU16 NumBPyramidLayers( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 refB = (par.base.GetGopRefDist(par) - 1) / 2; mfxU16 x = refB; while (x > 2) { x = (x - 1) / 2; refB -= x; } return refB + 1; } static mfxU16 NumRefBPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 NumRefActiveP[8], NumRefActiveBL0[8], NumRefActiveBL1[8]; mfxU16 NumLayers = par.base.GetNumBPyramidLayers(par); mfxU16 NumRefFrame = par.base.GetMinRefForBPyramid(par); bool bExternalNRef = par.base.GetNumRefActive(par, &NumRefActiveP, &NumRefActiveBL0, &NumRefActiveBL1); SetIf(NumRefFrame, bExternalNRef, [&]() -> mfxU16 { auto maxBL0idx = std::max_element(NumRefActiveBL0, NumRefActiveBL0 + NumLayers) - NumRefActiveBL0; auto maxBL1idx = std::max_element(NumRefActiveBL1, NumRefActiveBL1 + NumLayers) - NumRefActiveBL1; mfxU16 maxBL0 = mfxU16((NumRefActiveBL0[maxBL0idx] + maxBL0idx + 1) * (maxBL0idx < NumLayers)); mfxU16 maxBL1 = mfxU16((NumRefActiveBL1[maxBL1idx] + maxBL1idx + 1) * (maxBL1idx < NumLayers)); return std::max({ NumRefFrame, NumRefActiveP[0], maxBL0, maxBL1 }); }); return NumRefFrame; } static mfxU16 NumRefPPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 NumRefActiveP[8]; par.base.GetNumRefActive(par, &NumRefActiveP, nullptr, nullptr); mfxU16 RefActiveP = *std::max_element(NumRefActiveP, NumRefActiveP + mfx::size(NumRefActiveP)); return std::min(DEFAULT_PPYR_INTERVAL, RefActiveP); } static mfxU16 NumRefNoPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU16 NumRefActiveP[8], NumRefActiveBL0[8]; par.base.GetNumRefActive(par, &NumRefActiveP, &NumRefActiveBL0, nullptr); mfxU16 RefActiveP = *std::max_element(NumRefActiveP, NumRefActiveP + mfx::size(NumRefActiveP)); mfxU16 RefActiveBL0 = *std::max_element(NumRefActiveBL0, NumRefActiveBL0 + mfx::size(NumRefActiveBL0)); return mfxU16(std::max(RefActiveP, RefActiveBL0) + (par.base.GetGopRefDist(par) > 1) * RefActiveBL0); } static mfxU16 NumRefFrames( Defaults::TChain::TExt , const Defaults::Param& par) { auto NumRefBPyramid = [&]() { return par.base.GetNumRefBPyramid(par); }; auto NumRefPPyramid = [&]() { return par.base.GetNumRefPPyramid(par); }; auto NumRefDefault = [&]() { return par.base.GetNumRefNoPyramid(par); }; bool bUsrValue = !!par.mvp.mfx.NumRefFrame; bool bBPyramid = !bUsrValue && (par.base.GetBRefType(par) == MFX_B_REF_PYRAMID); bool bPPyramyd = !bUsrValue && !bBPyramid && (par.base.GetPRefType(par) == MFX_P_REF_PYRAMID); bool bDefault = !bUsrValue && !bBPyramid && !bPPyramyd; mfxU16 NumRefFrame = par.mvp.mfx.NumRefFrame; SetIf(NumRefFrame, bBPyramid, NumRefBPyramid); SetIf(NumRefFrame, bPPyramyd, NumRefPPyramid); SetIf(NumRefFrame, bDefault, NumRefDefault); SetIf(NumRefFrame, !bUsrValue, [&]() { return std::min( par.base.GetMaxDPB(par) - 1 , std::max(par.base.GetNumTemporalLayers(par) - 1, NumRefFrame)); }); return NumRefFrame; } static mfxU16 MinRefForBPyramid( Defaults::TChain::TExt , const Defaults::Param& par) { return par.base.GetNumBPyramidLayers(par) + 1; } static mfxU16 MinRefForBNoPyramid( Defaults::TChain::TExt , const Defaults::Param& /*par*/) { return 2; } static bool NumRefActive( Defaults::TGetNumRefActive::TExt , const Defaults::Param& par , mfxU16(*pP)[8] , mfxU16(*pBL0)[8] , mfxU16(*pBL1)[8]) { bool bExternal = false; mfxU16 maxP = 0, maxBL0 = 0, maxBL1 = 0; std::tie(maxP, maxBL0, maxBL1) = par.base.GetMaxNumRef(par); auto SetDefaultNRef = [](const mfxU16(*extRef)[8], mfxU16 defaultRef, mfxU16(*NumRefActive)[8]) { bool bExternal = false; bool bDone = false; bDone |= !NumRefActive; bDone |= !bDone && !extRef && std::fill_n(*NumRefActive, 8, defaultRef); bDone |= !bDone && std::transform( *extRef , std::end(*extRef) , *NumRefActive , [&](mfxU16 ext) { bExternal |= SetIf(defaultRef, !!ext, ext); return defaultRef; }); return bExternal; }; const mfxU16(*extRefP )[8] = nullptr; const mfxU16(*extRefBL0)[8] = nullptr; const mfxU16(*extRefBL1)[8] = nullptr; if (const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp)) { extRefP = &pCO3->NumRefActiveP; extRefBL0 = &pCO3->NumRefActiveBL0; extRefBL1 = &pCO3->NumRefActiveBL1; } bExternal |= SetDefaultNRef(extRefP, maxP, pP); bExternal |= SetDefaultNRef(extRefBL0, maxBL0, pBL0); bExternal |= SetDefaultNRef(extRefBL1, maxBL1, pBL1); return bExternal; } static mfxU16 BRefType( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bSet = pCO2 && pCO2->BRefType; if (bSet) return pCO2->BRefType; const mfxU16 BPyrCand[2] = { mfxU16(MFX_B_REF_OFF), mfxU16(MFX_B_REF_PYRAMID) }; bool bValid = par.base.GetGopRefDist(par) > 3 && (par.mvp.mfx.NumRefFrame == 0 || par.base.GetMinRefForBPyramid(par) <= par.mvp.mfx.NumRefFrame); return BPyrCand[bValid]; } static mfxU16 PRefType( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); bool bSet = pCO3 && pCO3->PRefType; if (bSet) return pCO3->PRefType; static const mfxU16 PRefType[3] = { mfxU16(MFX_P_REF_DEFAULT), mfxU16(MFX_P_REF_SIMPLE), mfxU16(MFX_P_REF_PYRAMID) }; auto GopRefDist = par.base.GetGopRefDist(par); mfxI32 idx = GopRefDist == 1; idx += idx && (par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_CQP || Legacy::IsSWBRC(par.mvp)); return PRefType[idx]; } static std::tuple FrameRate( Defaults::TChain>::TExt , const Defaults::Param& par) { auto& fi = par.mvp.mfx.FrameInfo; if (fi.FrameRateExtN && fi.FrameRateExtD) { return std::make_tuple(fi.FrameRateExtN, fi.FrameRateExtD); } mfxU32 frN = 30, frD = 1; mfxF64 frMax = 30.; if (par.mvp.mfx.CodecLevel) { auto W = par.base.GetCodedPicWidth(par); auto H = par.base.GetCodedPicHeight(par); frMax = GetMaxFrByLevel(par.mvp, W * H); } bool bFrByLevel = frN > (frMax * frD); frN = mfxU32(frN * !bFrByLevel + (frMax * 1001) * bFrByLevel); frD = mfxU32(frD * !bFrByLevel + 1001 * bFrByLevel); return std::make_tuple(frN, frD); } static mfxU16 MaxBitDepthByFourCC( Defaults::TChain::TExt , const Defaults::Param& par) { auto FourCC = par.mvp.mfx.FrameInfo.FourCC; bool b4CCMax10 = FourCC == MFX_FOURCC_A2RGB10 || FourCC == MFX_FOURCC_P010 || FourCC == MFX_FOURCC_P210 || FourCC == MFX_FOURCC_Y210 || FourCC == MFX_FOURCC_Y410; return mfxU16(8 + 2 * b4CCMax10); } static mfxU16 MaxChromaByFourCC( Defaults::TChain::TExt , const Defaults::Param& par) { auto fcc = par.mvp.mfx.FrameInfo.FourCC; bool bMax420 = fcc == MFX_FOURCC_NV12 || fcc == MFX_FOURCC_P010; bool bMax422 = fcc == MFX_FOURCC_YUY2 || fcc == MFX_FOURCC_Y210 || fcc == MFX_FOURCC_P210; bMax422 &= !bMax420; bool bMax444 = !(bMax422 || bMax420); return mfxU16( bMax420 * MFX_CHROMAFORMAT_YUV420 + bMax422 * MFX_CHROMAFORMAT_YUV422 + bMax444 * MFX_CHROMAFORMAT_YUV444); } static mfxU16 MaxBitDepth( Defaults::TChain::TExt , const Defaults::Param& par) { auto profile = par.mvp.mfx.CodecProfile; const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); bool bCheckConstraints = profile >= MFX_PROFILE_HEVC_REXT && pHEVC; bool bMax8 = profile == MFX_PROFILE_HEVC_MAIN || profile == MFX_PROFILE_HEVC_MAINSP || (bCheckConstraints && (pHEVC->GeneralConstraintFlags & MFX_HEVC_CONSTR_REXT_MAX_8BIT)); bool bMax10 = profile == MFX_PROFILE_HEVC_MAIN10 || (bCheckConstraints && (pHEVC->GeneralConstraintFlags & MFX_HEVC_CONSTR_REXT_MAX_10BIT)); bool bMax12 = (bCheckConstraints && (pHEVC->GeneralConstraintFlags & MFX_HEVC_CONSTR_REXT_MAX_12BIT)); std::list maxBD({ mfxU16(8 + !!par.caps.MaxEncodedBitDepth * (1 << par.caps.MaxEncodedBitDepth)) , mfxU16(bMax8 * 8) , mfxU16(bMax10 * 10) , mfxU16(bMax12 * 12) , par.mvp.mfx.FrameInfo.BitDepthLuma , par.base.GetMaxBitDepthByFourCC(par) }); maxBD.sort(); maxBD.remove(0); return maxBD.front(); } static mfxU16 MaxChroma( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); mfxU32 profile = par.mvp.mfx.CodecProfile; mfxU16 maxBy4CC = par.base.GetMaxChromaByFourCC(par); bool bCheckConstraints = profile >= MFX_PROFILE_HEVC_REXT && pHEVC; bool bMax420 = profile == MFX_PROFILE_HEVC_MAIN || profile == MFX_PROFILE_HEVC_MAINSP || profile == MFX_PROFILE_HEVC_MAIN10 || (bCheckConstraints && (pHEVC->GeneralConstraintFlags & MFX_HEVC_CONSTR_REXT_MAX_420CHROMA)) || !(par.caps.YUV422ReconSupport || par.caps.YUV444ReconSupport) || maxBy4CC == MFX_CHROMAFORMAT_YUV420; bool bMax422 = ((bCheckConstraints && (pHEVC->GeneralConstraintFlags & MFX_HEVC_CONSTR_REXT_MAX_422CHROMA)) || maxBy4CC == MFX_CHROMAFORMAT_YUV422) && (par.caps.YUV422ReconSupport && maxBy4CC >= MFX_CHROMAFORMAT_YUV422); bMax422 &= !bMax420; bool bMax444 = !(bMax422 || bMax420) && (par.caps.YUV444ReconSupport && maxBy4CC == MFX_CHROMAFORMAT_YUV444); bMax420 |= !(bMax422 || bMax444); mfxU16 maxCf = mfxU16( bMax420 * MFX_CHROMAFORMAT_YUV420 + bMax422 * MFX_CHROMAFORMAT_YUV422 + bMax444 * MFX_CHROMAFORMAT_YUV444); return maxCf; } static mfxU16 TargetBitDepthLuma( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); if (pCO3 && pCO3->TargetBitDepthLuma) { return pCO3->TargetBitDepthLuma; } return par.base.GetMaxBitDepth(par); } static mfxU16 TargetChromaFormat( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); if (pCO3 && pCO3->TargetChromaFormatPlus1) { return pCO3->TargetChromaFormatPlus1; } //For RGB4 use illogical default 420 for backward compatibility if (par.mvp.mfx.FrameInfo.FourCC == MFX_FOURCC_RGB4) { return mfxU16(MFX_CHROMAFORMAT_YUV420 + 1); } return mfxU16(par.base.GetMaxChroma(par) + 1); } static mfxU32 TargetKbps( Defaults::TChain::TExt , const Defaults::Param& par) { auto& mfx = par.mvp.mfx; if (mfx.TargetKbps) { return mfx.TargetKbps * std::max(1, mfx.BRCParamMultiplier); } mfxU32 frN = 0, frD = 0, maxBR = 0xffffffff; SetIf(maxBR, !!mfx.CodecLevel, [&]() { return GetMaxKbpsByLevel(par.mvp); }); mfxU16 W = par.base.GetCodedPicWidth(par); mfxU16 H = par.base.GetCodedPicHeight(par); std::tie(frN, frD) = par.base.GetFrameRate(par); mfxU16 bd = par.base.GetTargetBitDepthLuma(par); mfxU16 cf = par.base.GetTargetChromaFormat(par) - 1; mfxU32 rawBits = (Legacy::GetRawBytes(W, H, cf, bd) << 3); return std::min(maxBR, rawBits * frN / frD / 150000); } static mfxU32 MaxKbps( Defaults::TChain::TExt , const Defaults::Param& par) { auto& mfx = par.mvp.mfx; if (mfx.MaxKbps && mfx.RateControlMethod != MFX_RATECONTROL_CQP && mfx.RateControlMethod != MFX_RATECONTROL_CBR) { return mfx.MaxKbps * std::max(1, mfx.BRCParamMultiplier); } return par.base.GetTargetKbps(par); } static mfxU32 PreSetBufferSizeInKB( Defaults::TChain::TExt , const Defaults::Param& par) { auto& mfx = par.mvp.mfx; if (mfx.BufferSizeInKB) { return mfx.BufferSizeInKB * std::max(1, mfx.BRCParamMultiplier); } return mfxU32(0); } static mfxU32 BufferSizeInKB( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU32 preSetBufferSizeInKB = par.base.GetPreSetBufferSizeInKB(par); if (preSetBufferSizeInKB) { return preSetBufferSizeInKB; } auto& mfx = par.mvp.mfx; if (mfx.BufferSizeInKB) { return mfx.BufferSizeInKB * std::max(1, mfx.BRCParamMultiplier); } bool bUseMaxKbps = mfx.RateControlMethod == MFX_RATECONTROL_CBR || mfx.RateControlMethod == MFX_RATECONTROL_VBR || mfx.RateControlMethod == MFX_RATECONTROL_QVBR || mfx.RateControlMethod == MFX_RATECONTROL_VCM; mfxU32 maxCPB = 0xffffffff; mfxU32 minCPB = bUseMaxKbps * InitialDelayInKB(par.mvp.mfx); mfxU32 defaultCPB = 0; auto GetMaxCPBByLevel = [&]() { return GetMaxCpbInKBByLevel(par.mvp); }; auto GetCPBFromMaxKbps = [&]() { mfxU32 defaultBufferSizeInKB = par.base.GetMaxKbps(par) / 4; // Check BufferSizeInKB at extremely low bitrate to ensure there is enough space to write bitstream if (mfx.FrameInfo.Width != 0 && mfx.FrameInfo.Height != 0 && mfx.FrameInfo.FrameRateExtN != 0 && mfx.FrameInfo.FrameRateExtD != 0) { mfxF64 rawDataBitrate = 12.0 * mfx.FrameInfo.Width * mfx.FrameInfo.Height * mfx.FrameInfo.FrameRateExtN / mfx.FrameInfo.FrameRateExtD; mfxU32 minBufferSizeInKB = mfxU32(std::min(0xffffffff, rawDataBitrate / 8 / 1000.0 / 1400.0)); if (defaultBufferSizeInKB < minBufferSizeInKB) { defaultBufferSizeInKB = minBufferSizeInKB; } } return defaultBufferSizeInKB; }; auto GetCPBFromRawBytes = [&]() { mfxU16 bd = par.base.GetTargetBitDepthLuma(par); mfxU16 W = par.base.GetCodedPicWidth(par); mfxU16 H = par.base.GetCodedPicHeight(par); mfxU16 cf = par.base.GetTargetChromaFormat(par) - 1; return Legacy::GetRawBytes(W, H, cf, bd) / 1000; }; bool bCqpOrIcq = mfx.RateControlMethod == MFX_RATECONTROL_CQP || mfx.RateControlMethod == MFX_RATECONTROL_ICQ; SetIf(maxCPB, !!mfx.CodecLevel && !bCqpOrIcq, GetMaxCPBByLevel); SetIf(defaultCPB, bUseMaxKbps, GetCPBFromMaxKbps); SetDefault(defaultCPB, GetCPBFromRawBytes); return std::max(minCPB, std::min(maxCPB, defaultCPB)); } static std::tuple MaxNumRef( Defaults::TChain>::TExt , const Defaults::Param& par) { mfxU16 tu = par.mvp.mfx.TargetUsage; CheckRangeOrSetDefault(tu, 1, 7, 4); bool bLP = IsOn(par.mvp.mfx.LowPower); --tu; static const mfxU16 nRefs[2][2][7] = { {// VME { 4, 4, 3, 3, 3, 1, 1 } , { 2, 2, 1, 1, 1, 1, 1 } } , {// VDENC { 3, 3, 2, 2, 2, 1, 1 } , { 3, 3, 2, 2, 2, 1, 1 } } }; mfxU16 nRefL0 = mfxU16(nRefs[bLP][0][tu]); mfxU16 nRefL1 = mfxU16(nRefs[bLP][1][tu]); mfxU16 numRefFrame = par.mvp.mfx.NumRefFrame + !par.mvp.mfx.NumRefFrame * 16; return std::make_tuple( std::min({ nRefL0, par.caps.MaxNum_Reference0, numRefFrame }) , std::min({ nRefL0, par.caps.MaxNum_Reference0, numRefFrame }) , std::min({ nRefL1, par.caps.MaxNum_Reference1, numRefFrame })); } static mfxU16 RateControlMethod( Defaults::TChain< mfxU16>::TExt , const Defaults::Param& par) { if (par.mvp.mfx.RateControlMethod) { return par.mvp.mfx.RateControlMethod; } return mfxU16(MFX_RATECONTROL_CQP); } static mfxU8 MinQPMFX( Defaults::TChain< mfxU16>::TExt , const Defaults::Param& par) { // negative QP for CQP VME only; bool bPositive = !par.caps.NegativeQPSupport || IsOn(par.mvp.mfx.LowPower) // remove when caps.NegativeQPSupport is correctly set in driver || par.mvp.mfx.RateControlMethod != MFX_RATECONTROL_CQP; bool bMin10 = IsOn(par.mvp.mfx.LowPower) && !Legacy::IsSWBRC(par.mvp); // 10 is min QP for VDENC return mfxU8(std::max(1, (bMin10 * 10) + (bPositive * (6 * (par.base.GetTargetBitDepthLuma(par) - 8))))); } static mfxU8 MaxQPMFX( Defaults::TChain::TExt , const Defaults::Param& par) { return 51 + 6 * mfxU8(std::max(8, par.base.GetTargetBitDepthLuma(par)) - 8); } static std::tuple QPMFX( Defaults::TChain>::TExt , const Defaults::Param& par) { bool bCQP = (par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP); mfxU16 QPI = bCQP * par.mvp.mfx.QPI; mfxU16 QPP = bCQP * par.mvp.mfx.QPP; mfxU16 QPB = bCQP * par.mvp.mfx.QPB; bool bValid = (QPI && QPP && QPB); if (bValid) return std::make_tuple(QPI, QPP, QPB); auto maxQP = par.base.GetMaxQPMFX(par); auto minQP = par.base.GetMinQPMFX(par); SetDefault(QPI, mfxU16(std::max(QPP - 2, minQP) * !!QPP)); SetDefault(QPI, mfxU16(std::max(QPB - 4, minQP) * !!QPB)); SetDefault(QPI, std::max(minQP, (maxQP + 1) / 2)); SetDefault(QPP, std::min(QPI + 2, maxQP)); SetDefault(QPB, std::min(QPP + 2, maxQP)); return std::make_tuple(QPI, QPP, QPB); } static mfxU16 QPOffset( Defaults::TGetQPOffset::TExt , const Defaults::Param& par , mfxI16(*pQPOffset)[8]) { mfxU16 EnableQPOffset = 0; if (const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp)) { EnableQPOffset = pCO3->EnableQPOffset; } if (!EnableQPOffset) { bool bCQP = par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP; bool bBPyr = bCQP && par.base.GetBRefType(par) == MFX_B_REF_PYRAMID; bool bPPyr = bCQP && !bBPyr && par.base.GetPRefType(par) == MFX_P_REF_PYRAMID; EnableQPOffset = Bool2CO(bBPyr || bPPyr); bool bGenerate = IsOn(EnableQPOffset) && pQPOffset; if (bGenerate) { mfxI16 QPX = 0, i = 0, maxQPOffset = 0, minQPOffset = 0; SetIf(QPX, bBPyr, [&]() { return std::get<2>(par.base.GetQPMFX(par)); }); SetIf(QPX, bPPyr, [&]() { return std::get<1>(par.base.GetQPMFX(par)); }); maxQPOffset = mfxI16(par.base.GetMaxQPMFX(par) - QPX); minQPOffset = mfxI16(par.base.GetMinQPMFX(par) - QPX); std::generate_n(*pQPOffset, 8 , [&]() { return mfx::clamp(i++ + bBPyr, minQPOffset, maxQPOffset); }); } } bool bZeroOffset = IsOff(EnableQPOffset) && pQPOffset; std::fill_n(*pQPOffset, 8 * bZeroOffset, mfxI16(0)); return EnableQPOffset; } static mfxU16 Profile( Defaults::TChain::TExt , const Defaults::Param& par) { bool bPassThrough = !!par.mvp.mfx.CodecProfile; mfxU16 bd = 0, cf = 0; SetIf(bd, !bPassThrough, [&]() { return par.base.GetTargetBitDepthLuma(par); }); SetIf(cf, !bPassThrough, [&]() { return mfxU16(par.base.GetTargetChromaFormat(par) - 1); }); bool bRext = !bPassThrough && (cf != MFX_CHROMAFORMAT_YUV420 || bd > 10); bool bMain10 = !bPassThrough && !bRext && bd == 10; bool bMain = !bPassThrough && !bRext && !bMain10; return bPassThrough * par.mvp.mfx.CodecProfile + bRext * MFX_PROFILE_HEVC_REXT + bMain10 * MFX_PROFILE_HEVC_MAIN10 + bMain * MFX_PROFILE_HEVC_MAIN; } static mfxU16 MBBRC( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bPassThrough = pCO2 && pCO2->MBBRC; bool bON = bPassThrough && IsOn(pCO2->MBBRC); bool bOFF = bPassThrough && IsOff(pCO2->MBBRC); bOFF |= !bPassThrough && ( par.base.GetRateControlMethod(par) == MFX_RATECONTROL_CQP || Legacy::IsSWBRC(par.mvp) || IsOn(par.mvp.mfx.LowPower)); return mfxU16( bON * MFX_CODINGOPTION_ON + bOFF * MFX_CODINGOPTION_OFF); } static mfxU16 AsyncDepth( Defaults::TChain::TExt , const Defaults::Param& par) { return par.mvp.AsyncDepth + !par.mvp.AsyncDepth * 5; } static mfxU16 NumSlices( Defaults::TChain::TExt , const Defaults::Param& par) { if (par.mvp.mfx.NumSlice) return par.mvp.mfx.NumSlice; std::vector slices; return par.base.GetSlices(par, slices); } static mfxU16 LCUSize( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par.mvp); if (pHEVC && pHEVC->LCUSize) { return pHEVC->LCUSize; } bool bForce64 = IsOn(par.mvp.mfx.LowPower); bool bMaxByCaps = !IsOn(par.mvp.mfx.LowPower); bool bForce32 = !bForce64 && !bMaxByCaps; mfxU16 LCUSize = bForce64 * 64 + bForce32 * 32 + bMaxByCaps * (1 << (mfx::CeilLog2(par.caps.LCUSizeSupported + 1) + 3)); assert((LCUSize >> 4) & par.caps.LCUSizeSupported); return LCUSize; } static bool HRDConformanceON( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption* pCO = ExtBuffer::Get(par.mvp); return (!pCO || !(IsOff(pCO->NalHrdConformance) || IsOff(pCO->VuiNalHrdParameters))) && ( par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_VCM || par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_QVBR); } static mfxU16 PicTimingSEI( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtCodingOption* pCO = ExtBuffer::Get(par.mvp); bool bForceON = pCO && IsOn(pCO->PicTimingSEI); bool bForceOFF = pCO && IsOff(pCO->PicTimingSEI); return Bool2CO(bForceON || (!bForceOFF && par.base.GetHRDConformanceON(par))); } static mfxU16 PPyrInterval( Defaults::TChain::TExt , const Defaults::Param& par) { return mfxU16( !!par.mvp.mfx.NumRefFrame * std::min(DEFAULT_PPYR_INTERVAL, par.mvp.mfx.NumRefFrame) + !par.mvp.mfx.NumRefFrame * DEFAULT_PPYR_INTERVAL); } static mfxU8 PLayer( Defaults::TGetPLayer::TExt , const Defaults::Param& par , mfxU32 fo , mfxGopHints GopHints) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par.mvp); auto num = par.base.GetPPyrInterval(par); if (GopHints.MiniGopSize && par.base.GetGopRefDist(par) == 1) num = std::min(num, (mfxU16) GopHints.MiniGopSize); mfxU32 i = fo % num; bool bForce0 = (pCO3 && pCO3->PRefType != MFX_P_REF_PYRAMID) || i == 0 || i >= num; if (bForce0) return 0; mfxU32 level = 1; mfxU32 begin = 0; mfxU32 end = num; mfxU32 t = (begin + end + 1) / 2; while (t != i) { ++level; SetIf(begin, i > t, t); SetIf(end, i <= t, t); t = (begin + end + 1) / 2; } return (mfxU8)std::min(level, 7); } static mfxU8 TId( Defaults::TGetTId::TExt , const Defaults::Param& par , mfxU32 fo , mfxGopHints) { const mfxExtAvcTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) return 0; return TemporalLayers(*pTemporalLayers).GetTId(fo); } static mfxU16 NumTemporalLayers( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtAvcTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) return 1; return TemporalLayers::CountTL(*pTemporalLayers); } static mfxU8 HighestTId( Defaults::TChain::TExt , const Defaults::Param& par) { const mfxExtAvcTemporalLayers* pTemporalLayers = ExtBuffer::Get(par.mvp); if (!pTemporalLayers) return mfxU8(-1); return TemporalLayers(*pTemporalLayers).HighestTId(); } static mfxU8 NumReorderFrames( Defaults::TChain::TExt , const Defaults::Param& par) { mfxU8 BFrameRate = mfxU8(par.base.GetGopRefDist(par) - 1); bool bBPyramid = (par.base.GetBRefType(par) == MFX_B_REF_PYRAMID); mfxU8 n = !!BFrameRate; if (bBPyramid && n--) { while (BFrameRate) { BFrameRate >>= 1; n++; } } return n; } static bool NonStdReordering( Defaults::TChain::TExt , const Defaults::Param& par) { return par.mvp.mfx.EncodedOrder && par.mvp.mfx.NumRefFrame > 2 && (par.base.GetBRefType(par) == MFX_B_REF_PYRAMID) && par.base.GetMinRefForBPyramid(par) > par.mvp.mfx.NumRefFrame; } static mfxU16 FrameType( Defaults::TGetFrameType::TExt , const Defaults::Param& par , mfxU32 displayOrder , mfxGopHints GopHints , mfxLastKeyFrameInfo LastKeyFrameInfo) { mfxU32 gopOptFlag = par.mvp.mfx.GopOptFlag; mfxU32 gopPicSize = par.mvp.mfx.GopPicSize; mfxU32 gopRefDist = GopHints.MiniGopSize ? std::min(GopHints.MiniGopSize, par.mvp.mfx.GopRefDist): par.mvp.mfx.GopRefDist; mfxU32 idrPicDist = gopPicSize * (par.mvp.mfx.IdrInterval); //infinite GOP SetIf(idrPicDist, gopPicSize == 0xffff, 0xffffffff); SetIf(gopPicSize, gopPicSize == 0xffff, 0xffffffff); mfxU32 fo = displayOrder - LastKeyFrameInfo.lastIDROrder; bool bIdr = fo == 0 || (idrPicDist && (fo % idrPicDist == 0)); bool bIRef = !bIdr && (fo % gopPicSize == 0); bool bPRef = !bIdr && !bIRef && ( ((displayOrder - LastKeyFrameInfo.lastIPOrder) % gopRefDist == 0) || ((fo + 1) % gopPicSize == 0 && (gopOptFlag & MFX_GOP_CLOSED)) || (idrPicDist && (fo + 1) % idrPicDist == 0)); bool bB = !(bPRef || bIdr || bIRef); mfxU16 ft = GopHints.FrameType ? GopHints.FrameType : bIdr * (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR) + bIRef * (MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF) + bPRef * (MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF) + bB * (MFX_FRAMETYPE_B); bool bForceNonRef = IsRef(ft) && par.base.GetTId(par, fo, GopHints) == par.base.GetHighestTId(par); ft &= ~(bForceNonRef * MFX_FRAMETYPE_REF); return ft; } static std::tuple RPLFromExt( Defaults::TGetRPLFromExt::TExt , const Defaults::Param& , const DpbArray &DPB , mfxU16 maxL0 , mfxU16 maxL1 , const mfxExtAVCRefLists& extRPL , mfxU8(&RefPicList)[2][MAX_DPB_SIZE]) { typedef decltype(*extRPL.RefPicList0) TRExtRPL0Entry; typedef decltype(*extRPL.RefPicList1) TRExtRPL1Entry; mfxU8 l0 = 0, l1 = 0; std::for_each(extRPL.RefPicList0 , extRPL.RefPicList0 + extRPL.NumRefIdxL0Active , [&](TRExtRPL0Entry ref) { mfxU8 idx = Legacy::GetDPBIdxByFO(DPB, (mfxI32)ref.FrameOrder); RefPicList[0][l0] = idx; l0 += (idx < MAX_DPB_SIZE) && (l0 < maxL0); }); std::for_each(extRPL.RefPicList1 , extRPL.RefPicList1 + extRPL.NumRefIdxL1Active , [&](TRExtRPL1Entry ref) { mfxU8 idx = Legacy::GetDPBIdxByFO(DPB, (mfxI32)ref.FrameOrder); RefPicList[1][l1] = idx; l1 += (idx < MAX_DPB_SIZE) && (l1 < maxL1); }); l0 = std::min(l0, mfxU8(maxL0)); l1 = std::min(l1, mfxU8(maxL1)); std::fill(RefPicList[0] + l0, RefPicList[0] + mfx::size(RefPicList[0]), IDX_INVALID); std::fill(RefPicList[1] + l1, RefPicList[1] + mfx::size(RefPicList[1]), IDX_INVALID); return std::make_tuple(l0, l1); } static std::tuple RPLMod( Defaults::TGetRPL::TExt , const Defaults::Param& par , const DpbArray &/*DPB*/ , mfxU16 /*maxL0*/ , mfxU16 maxL1 , const FrameBaseInfo& cur , mfxU8(&RefPicList)[2][MAX_DPB_SIZE]) { mfxU8 l0 = mfxU8(mfx::size(RefPicList[0]) - std::count(RefPicList[0], RefPicList[0] + mfx::size(RefPicList[0]), IDX_INVALID)); mfxU8 l1 = mfxU8(mfx::size(RefPicList[1]) - std::count(RefPicList[1], RefPicList[1] + mfx::size(RefPicList[1]), IDX_INVALID)); bool isB = IsB(cur.FrameType) && !cur.isLDB; bool bDefaultL1 = isB && !l1 && l0; if (bDefaultL1) { RefPicList[1][l1++] = RefPicList[0][l0 - 1]; } // on VDENC for LDB frames L1 must be completely identical to L0 mfxU8 maxLdbL1 = (mfxU8)std::max(maxL1, l0 * IsOn(par.mvp.mfx.LowPower)); //ignore l1 != l0 in pExtLists for LDB (unsupported by HW) l1 = l1 * isB + std::min(l0, maxLdbL1) * !isB; std::copy_n(RefPicList[0], l1 * !isB, RefPicList[1]); return std::make_tuple(l0, l1); } static bool CmpRef( Defaults::TCmpRef::TExt , const Defaults::Param& , const FrameBaseInfo &cur , const FrameBaseInfo &a , const FrameBaseInfo &b) { return abs(cur.POC - a.POC) < abs(cur.POC - b.POC); } static const DpbFrame* WeakRef( Defaults::TGetWeakRef::TExt , const Defaults::Param& par , const FrameBaseInfo &/*cur*/ , const DpbFrame *begin , const DpbFrame *end) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); if (CO3.PRefType == MFX_P_REF_PYRAMID) { auto CmpLDRefs = [&](const DpbFrame& a, const DpbFrame& b) { return (a.PyramidLevel > b.PyramidLevel || (a.PyramidLevel == b.PyramidLevel && a.POC < b.POC)); }; return std::min_element(begin, end, CmpLDRefs); } auto POCLess = [](const DpbFrame& a, const DpbFrame& b) { return a.POC < b.POC; }; return std::min_element(begin, end, POCLess); } static std::tuple RefPicList( Defaults::TGetRPL::TExt , const Defaults::Param& par , const DpbArray &DPB , mfxU16 maxL0 , mfxU16 maxL1 , const FrameBaseInfo& cur , mfxU8(&RefPicList)[2][MAX_DPB_SIZE]) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); bool bLowDelay = (CO3.PRefType == MFX_P_REF_PYRAMID); mfxU8 l0 = 0, l1 = 0; const DpbFrame* dpbBegin = &DPB[0]; std::list L0(mfx::size(DPB), nullptr); std::list L1(mfx::size(DPB) * (IsB(cur.FrameType) && !cur.isLDB), nullptr); std::iota(L0.begin(), L0.end(), dpbBegin); std::iota(L1.begin(), L1.end(), dpbBegin); L0.remove_if([&](const DpbFrame* x) { return !isValid(*x) || x->TemporalID > cur.TemporalID || x->POC > cur.POC; }); L1.remove_if([&](const DpbFrame* x) { return !isValid(*x) || x->TemporalID > cur.TemporalID || x->POC < cur.POC; }); bool bL1 = false; auto Closer = [&](const DpbFrame* a, const DpbFrame* b) { return par.base.CmpRefLX[bL1](par, cur, *a, *b); }; auto CmpRefs = [&](const DpbFrame* a, const DpbFrame* b) // return (a > b) { bool bEQ = true; bool bGT = false; bGT |= bEQ && (bLowDelay && (a->PyramidLevel < b->PyramidLevel)); bEQ &= !bLowDelay || (a->PyramidLevel == b->PyramidLevel); bGT |= bEQ && Closer(a, b); return bGT; }; if (L0.empty()) { assert(!"L0 is empty - reordering issue?"); L0 = L1; } L0.sort(CmpRefs); L0.splice(L0.begin(), L0, std::min_element(L0.begin(), L0.end(), Closer)); bL1 = true; L1.sort(CmpRefs); l0 = mfxU8(std::min(L0.size(), maxL0)); l1 = mfxU8(std::min(L1.size(), maxL1)); L0.resize(l0); L1.resize(l1); bool bNoQPOffset = (par.mvp.mfx.RateControlMethod == MFX_RATECONTROL_CQP && IsOff(CO3.EnableQPOffset)); bool bIsSCC = par.mvp.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC; // use default ref list order for SCC bool bUseDefaultOrder = bIsSCC || bNoQPOffset; if (bUseDefaultOrder) { auto POCDescending = [](const DpbFrame* a, const DpbFrame* b) { return a->POC > b->POC; }; L0.sort(POCDescending); } auto POCAscending = [](const DpbFrame* a, const DpbFrame* b) { return a->POC < b->POC; }; L1.sort(POCAscending); std::transform(L0.begin(), L0.end(), RefPicList[0] , [&](const DpbFrame* x) { return mfxU8(x - dpbBegin); }); std::transform(L1.begin(), L1.end(), RefPicList[1] , [&](const DpbFrame* x) { return mfxU8(x - dpbBegin); }); return std::make_tuple(l0, l1); } static std::tuple RPLFromCtrl( Defaults::TGetRPLFromCtrl::TExt , const Defaults::Param& , const DpbArray &DPB , mfxU16 maxL0 , mfxU16 maxL1 , const FrameBaseInfo& cur , const mfxExtAVCRefListCtrl& ctrl , mfxU8(&RefPicList)[2][MAX_DPB_SIZE]) { typedef decltype(*ctrl.RejectedRefList) TRRejected; typedef decltype(*ctrl.PreferredRefList) TRPreferred; mfxU8 pref[2] = {}; mfxU8 IdxList[16]; auto pIdxListEnd = IdxList + mfx::size(IdxList); mfxU8 l0 = mfxU8(mfx::size(RefPicList[0]) - std::count(RefPicList[0], RefPicList[0] + mfx::size(RefPicList[0]), IDX_INVALID)); mfxU8 l1 = mfxU8(mfx::size(RefPicList[1]) - std::count(RefPicList[1], RefPicList[1] + mfx::size(RefPicList[1]), IDX_INVALID)); SetIf(maxL0, ctrl.NumRefIdxL0Active, std::min(ctrl.NumRefIdxL0Active, maxL0)); SetIf(maxL1, ctrl.NumRefIdxL1Active, std::min(ctrl.NumRefIdxL1Active, maxL1)); std::transform( ctrl.RejectedRefList , ctrl.RejectedRefList + mfx::size(IdxList) , IdxList , [&](TRRejected x) { return Legacy::GetDPBIdxByFO(DPB, x.FrameOrder); }); l0 = mfxU8(std::remove_if(RefPicList[0], RefPicList[0] + l0, [&](mfxU8 ref) { return std::find(IdxList, pIdxListEnd, ref) != pIdxListEnd; }) - RefPicList[0]); l1 = mfxU8(std::remove_if(RefPicList[1], RefPicList[1] + l1, [&](mfxU8 ref) { return std::find(IdxList, pIdxListEnd, ref) != pIdxListEnd; }) - RefPicList[1]); std::transform( ctrl.PreferredRefList , ctrl.PreferredRefList + mfx::size(IdxList) , IdxList , [&](TRPreferred x) { return Legacy::GetDPBIdxByFO(DPB, x.FrameOrder); }); pIdxListEnd = std::remove_if(IdxList, pIdxListEnd , [&](mfxU8 ref) { return ref >= MAX_DPB_SIZE; }); mfxU8 tmpRPL[2][MAX_DPB_SIZE + 2] = {}; mfxU8* pRplEnd[2] = { tmpRPL[0] + l0, tmpRPL[1] + l1 }; std::fill(std::next(tmpRPL[0], MAX_DPB_SIZE), std::end(tmpRPL[0]), IDX_INVALID); std::fill(std::next(tmpRPL[1], MAX_DPB_SIZE), std::end(tmpRPL[1]), IDX_INVALID); std::copy(std::begin(RefPicList[0]), std::end(RefPicList[0]), std::begin(tmpRPL[0])); std::copy(std::begin(RefPicList[1]), std::end(RefPicList[1]), std::begin(tmpRPL[1])); std::for_each(IdxList, pIdxListEnd , [&](mfxU8 ref) { bool lx = DPB[ref].POC > cur.POC; pRplEnd[lx] = std::remove(tmpRPL[lx], pRplEnd[lx], ref); Insert(tmpRPL[lx], pref[lx]++, ref); ++pRplEnd[lx]; }); l0 = std::min((mfxU8)maxL0, mfxU8(pRplEnd[0] - tmpRPL[0])); l1 = std::min((mfxU8)maxL1, mfxU8(pRplEnd[1] - tmpRPL[1])); std::fill(std::next(RefPicList[0], l0), std::end(RefPicList[0]), IDX_INVALID); std::fill(std::next(RefPicList[1], l1), std::end(RefPicList[1]), IDX_INVALID); std::copy_n(tmpRPL[0], l0, RefPicList[0]); std::copy_n(tmpRPL[1], l1, RefPicList[1]); bool bDefaultL0 = (l0 == 0); RefPicList[0][l0 += bDefaultL0] *= !bDefaultL0; return std::make_tuple(l0, l1); } static mfxStatus PreReorderInfo( Defaults::TGetPreReorderInfo::TExt , const Defaults::Param& par , FrameBaseInfo& fi , const mfxFrameSurface1* pSurfIn , const mfxEncodeCtrl* pCtrl , mfxLastKeyFrameInfo LastKeyFrameInfo , mfxU32 frameOrder , mfxGopHints GopHints) { mfxU16 ftype = 0; auto SetFrameTypeFromGOP = [&]() { return Res2Bool(ftype, par.base.GetFrameType(par, frameOrder, GopHints, LastKeyFrameInfo)); }; auto SetFrameTypeFromCTRL = [&]() { return pCtrl && Res2Bool(ftype, pCtrl->FrameType); }; auto ForceIdr = [&]() { return Res2Bool(ftype, mfxU16(MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR)); }; auto SetFrameOrderFromSurf = [&]() { if (!pSurfIn) return false; frameOrder = pSurfIn->Data.FrameOrder; return true; }; bool bFrameInfoValid = (par.mvp.mfx.EncodedOrder && SetFrameOrderFromSurf() && SetFrameTypeFromCTRL() ) || (pCtrl && IsIdr(pCtrl->FrameType) && ForceIdr()) || SetFrameTypeFromGOP(); MFX_CHECK(bFrameInfoValid, MFX_ERR_UNDEFINED_BEHAVIOR); fi.POC = !IsIdr(ftype) * (frameOrder - LastKeyFrameInfo.lastIDROrder); fi.FrameType = ftype; fi.TemporalID = !IsI(ftype) * par.base.GetTId(par, fi.POC - LastKeyFrameInfo.lastIPoc, GopHints); if (IsP(ftype)) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); fi.isLDB = IsOn(CO3.GPB); fi.PyramidLevel = par.base.GetPLayer(par, fi.POC - LastKeyFrameInfo.lastIPoc, GopHints); } return MFX_ERR_NONE; } static std::tuple FrameNumRefActive( Defaults::TGetFrameNumRefActive::TExt , const Defaults::Param& par , const FrameBaseInfo& fi) { mfxU8 nL0 = 0, nL1 = 0; if (IsB(fi.FrameType) && !fi.isLDB) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par.mvp); mfxI32 layer = (CO2.BRefType == MFX_B_REF_PYRAMID) * mfx::clamp(fi.PyramidLevel - 1, 0, 7); nL0 = (mfxU8)CO3.NumRefActiveBL0[layer]; nL1 = (mfxU8)CO3.NumRefActiveBL1[layer]; } if (IsP(fi.FrameType) || fi.isLDB) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par.mvp); auto layer = mfx::clamp(fi.PyramidLevel, 0, 7); nL0 = (mfxU8)CO3.NumRefActiveP[layer]; nL1 = (mfxU8)std::min(CO3.NumRefActiveP[layer], CO3.NumRefActiveBL1[layer]); // on VDENC for LDB frames L1 must be completely identical to L0 nL1 = IsOn(par.mvp.mfx.LowPower) ? nL0: nL1; } return std::make_tuple(nL0, nL1); } static mfxU16 LowPower( Defaults::TGetHWDefault::TExt , const mfxVideoParam& par , eMFXHWType hw) { (void)hw; if (!Check(par.mfx.LowPower)) return par.mfx.LowPower; auto fcc = par.mfx.FrameInfo.FourCC; bool bOn = fcc == MFX_FOURCC_AYUV || fcc == MFX_FOURCC_Y410 || fcc == MFX_FOURCC_A2RGB10 || fcc == MFX_FOURCC_RGB4; return mfxU16( bOn * MFX_CODINGOPTION_ON + !bOn * MFX_CODINGOPTION_OFF); } static std::tuple NumTiles( Defaults::TChain>::TExt , const Defaults::Param& par) { const mfxExtHEVCTiles* pTiles = ExtBuffer::Get(par.mvp); mfxU16 nCol = 1; mfxU16 nRow = 1; if (pTiles) { nCol = std::max(nCol, pTiles->NumTileColumns); nRow = std::max(nRow, pTiles->NumTileRows); } return std::make_tuple(nCol, nRow); } static mfxU16 TileSlices( Defaults::TGetTileSlices::TExt , const Defaults::Param& dpar , std::vector& slices , mfxU32 SliceStructure , mfxU32 nCol , mfxU32 nRow , mfxU32 nSlice) { mfxU32 nLCU = nCol * nRow; mfxU32 nLcuPerSlice = 0; mfxU32 nSlicePrev = (mfxU32)slices.size(); mfxU32 segAddr = 0; mfxU32 nLCUMult = 1; bool bStrictNumLCUPerSlice = false; if (nSlicePrev) { segAddr = slices.back().SegmentAddress + slices.back().NumLCU; } if (SliceStructure == ONESLICE) { slices.emplace_back(SliceInfo{ segAddr, nLCU }); return 1; } if (const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(dpar.mvp)) { bStrictNumLCUPerSlice = !!pCO2->NumMbPerSlice; nLcuPerSlice = pCO2->NumMbPerSlice; } SetDefault(nLcuPerSlice, nLCU / nSlice); //in case of NumMbPerSlice != 0 need to check alignment //if it's value is not aligned, warning will be generated in CheckVideoParam() after MakeSlices() call bool bAlignLcuPerSliceByRows = SliceStructure == ROWSLICE && bStrictNumLCUPerSlice; mfxU32 nLcuPerSliceAlignment = std::max(1, bAlignLcuPerSliceByRows * nCol); nLcuPerSlice = mfx::CeilDiv(nLcuPerSlice, nLcuPerSliceAlignment) * nLcuPerSliceAlignment; //if not aligned already but need to bAlignLcuPerSliceByRows = !bAlignLcuPerSliceByRows && SliceStructure < ARBITRARY_MB_SLICE; if (bAlignLcuPerSliceByRows) { nSlice = std::min(nSlice, nRow); mfxU32 nRowsPerSlice = mfx::CeilDiv(nRow, nSlice); bool bAddSlice = (SliceStructure != POW2ROW) && (nRowsPerSlice * (nSlice - 1)) >= nRow; nSlice += bAddSlice; nRowsPerSlice -= bAddSlice; if (SliceStructure == POW2ROW) { mfxU32 nRowLog2 = mfx::CeilLog2(nRowsPerSlice); mfxU32 nRowsCand[2] = { mfxU32(1 << (nRowLog2 - 1)), mfxU32(1 << nRowLog2) }; mfxI32 dC0 = nRowsPerSlice - nRowsCand[0]; mfxI32 dC1 = nRowsCand[1] - nRowsPerSlice; nRowsPerSlice = nRowsCand[dC0 > dC1]; nSlice = mfx::CeilDiv(nRow, nRowsPerSlice); } nLcuPerSlice = nRowsPerSlice; nLCUMult = nCol; nLCU /= nCol; bStrictNumLCUPerSlice |= ((SliceStructure == POW2ROW) || (SliceStructure == ROWSLICE)); } slices.resize(nSlicePrev + nSlice); mfxU32 nLCULeft = nLCU % nSlice; bStrictNumLCUPerSlice |= (nSlice < 2 || (nLCULeft == 0)); SliceInfo zeroSI = {}; auto slBegin = std::next(slices.begin(), nSlicePrev); auto slEnd = slices.end(); std::fill(slBegin, slEnd, zeroSI); if (!bStrictNumLCUPerSlice) { bool bLessLCUs = (nLCULeft > (nSlice / 2)); nLcuPerSlice += bLessLCUs; nLCULeft = !bLessLCUs * nLCULeft + bLessLCUs * (nLcuPerSlice * nSlice - nLCU); mfxI32 delta = (1 - 2 * bLessLCUs) * nLCUMult; mfxU32 step = nSlice / nLCULeft; auto slStepBegin = mfx::MakeStepIter(slBegin, step); auto slStepEnd = mfx::MakeStepIter(slEnd, step); auto ModNumLCU = [&delta](SliceInfo& si) { si.NumLCU += delta; }; std::for_each(slStepBegin, slStepEnd, ModNumLCU); nLCULeft = (mfxU32)std::max(0, int(nSlice / step - nLCULeft)); step = ((nSlice / step) / std::max(1u, nLCULeft)) * step; delta *= -1; slStepBegin = mfx::MakeStepIter(slBegin, step); slStepEnd = std::next(slStepBegin, nLCULeft); std::for_each(slStepBegin, slStepEnd, ModNumLCU); } std::for_each( slBegin , slEnd , [&](SliceInfo& si) { si.NumLCU += nLcuPerSlice * nLCUMult; si.SegmentAddress = segAddr; segAddr += si.NumLCU; }); slices.back().NumLCU = slBegin->SegmentAddress + (nLCU * nLCUMult) - slices.back().SegmentAddress; return (mfxU16)nSlice; } static void GetTileUniformSpacingParam( std::vector& colWidth , std::vector& rowHeight , std::vector& TsToRs , mfxU32 nCol , mfxU32 nRow , mfxU32 nTCol , mfxU32 nTRow , mfxU32 nLCU) { std::vector colBd (nTCol + 1, 0); std::vector rowBd (nTRow + 1, 0); colWidth.resize(nTCol, 0); rowHeight.resize(nTRow, 0); TsToRs.resize(nLCU); auto pColBd = colBd.data(); auto pRowBd = rowBd.data(); auto pColWidth = colWidth.data(); auto pRowHeight = rowHeight.data(); mfxI32 i; auto NextCW = [nCol, nTCol, &i]() { ++i; return ((i + 1) * nCol) / nTCol - (i * nCol) / nTCol; }; auto NextRH = [nRow, nTRow, &i]() { ++i; return ((i + 1) * nRow) / nTRow - (i * nRow) / nTRow; }; auto NextBd = [&i](mfxU32 wh) { return (i += wh); }; i = -1; std::generate(pColWidth, pColWidth + nTCol, NextCW); i = -1; std::generate(pRowHeight, pRowHeight + nTRow, NextRH); i = 0; std::transform(pColWidth, pColWidth + nTCol, pColBd + 1, NextBd); i = 0; std::transform(pRowHeight, pRowHeight + nTRow, pRowBd + 1, NextBd); for (mfxU32 rso = 0; rso < nLCU; ++rso) { mfxU32 tbX = rso % nCol; mfxU32 tbY = rso / nCol; mfxU32 tso = 0; auto LTX = [tbX](mfxU32 x) { return tbX >= x; }; auto LTY = [tbY](mfxU32 y) { return tbY >= y; }; auto tileX = std::count_if(pColBd + 1, pColBd + nTCol, LTX); auto tileY = std::count_if(pRowBd + 1, pRowBd + nTRow, LTY); tso += rowHeight[tileY] * std::accumulate(pColWidth, pColWidth + tileX, 0u); tso += nCol * std::accumulate(pRowHeight, pRowHeight + tileY, 0u); tso += (tbY - rowBd[tileY]) * colWidth[tileX] + tbX - colBd[tileX]; assert(tso < nLCU); TsToRs[tso] = rso; } } static mfxU16 Slices( Defaults::TGetSlices::TExt , const Defaults::Param& defPar , std::vector& slices) { const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(defPar.mvp); mfxU16 W = defPar.base.GetCodedPicWidth(defPar); mfxU16 H = defPar.base.GetCodedPicHeight(defPar); mfxU16 LCUSize = defPar.base.GetLCUSize(defPar); mfxU32 nCol = mfx::CeilDiv(W, LCUSize); mfxU32 nRow = mfx::CeilDiv(H, LCUSize); auto tiles = defPar.base.GetNumTiles(defPar); mfxU32 nTCol = std::get<0>(tiles); mfxU32 nTRow = std::get<1>(tiles); mfxU32 nTile = nTCol * nTRow; mfxU32 nLCU = nCol * nRow; mfxU32 nSlice = std::min(std::min(nLCU, MAX_SLICES), std::max(defPar.mvp.mfx.NumSlice, 1)); mfxU32 SliceStructure = defPar.caps.SliceStructure; mfxU32 minSlice = !defPar.caps.msdk.bSingleSliceMultiTile * nTile; // DDI:0.9972: VDEnc supports multiple static slices in case of single tile frame only. // But for multi tiles frame, no single tile can contain multiple static slices. // Actually it's no matter for driver whether dynamic or static slices are used // It returns an error in the both cases. mfxU32 maxSlice = (nTile > 1 && IsOn(defPar.mvp.mfx.LowPower)) * nTile; SetDefault(maxSlice, nSlice); maxSlice = std::max(maxSlice, minSlice); nSlice = mfx::clamp(nSlice, minSlice, maxSlice); bool bHardcodeSliceStructureRowSlice = IsOn(defPar.mvp.mfx.LowPower) && nTile == 1; SliceStructure = SliceStructure * !bHardcodeSliceStructureRowSlice + ROWSLICE * bHardcodeSliceStructureRowSlice; slices.resize(0); bool bNumMbPerSliceSet = pCO2 && pCO2->NumMbPerSlice != 0; if (bNumMbPerSliceSet) nSlice = mfx::CeilDiv(nLCU / nTile, pCO2->NumMbPerSlice) * nTile; nSlice = std::max(nSlice * (SliceStructure != 0), 1); nSlice = std::max(nSlice, nTile * (nSlice > 1)); if (nTile == 1) { //TileScan = RasterScan, no SegmentAddress conversion required return defPar.base.GetTileSlices(defPar, slices, SliceStructure, nCol, nRow, nSlice); } std::vector colWidth (nTCol, 0); std::vector rowHeight (nTRow, 0); std::vector TsToRs (nLCU); //assume uniform spacing GetTileUniformSpacingParam(colWidth, rowHeight, TsToRs, nCol, nRow, nTCol, nTRow, nLCU); if (nSlice == 1) { defPar.base.GetTileSlices(defPar, slices, SliceStructure, nCol, nRow, nSlice); } else { using TileInfo = struct { mfxU32 id; mfxU32 nCol; mfxU32 nRow; mfxU32 nLCU; mfxU32 nSlice; }; auto TileIdLess = [](TileInfo& l, TileInfo& r) { return l.id < r.id; }; auto NumSliceCoeff = [](TileInfo const & tile) { assert(tile.nSlice > 0); return (mfxF64(tile.nLCU) / tile.nSlice); }; auto CmpTiles = [&](TileInfo& l, TileInfo& r) { return NumSliceCoeff(l) > NumSliceCoeff(r); }; auto AddTileSlices = [&](TileInfo& t) { defPar.base.GetTileSlices(defPar, slices, SliceStructure, t.nCol, t.nRow, t.nSlice); }; std::vector tile(nTile); mfxU32 id = 0; mfxU32 nLcuPerSlice = mfx::CeilDiv(nLCU, nSlice); mfxU32 nSliceRest = nSlice; std::for_each(std::begin(rowHeight), std::end(rowHeight), [&](mfxU32 h) { std::for_each(std::begin(colWidth), std::end(colWidth), [&](mfxU32 w) { auto& curTile = tile[id]; curTile.id = id; curTile.nCol = w; curTile.nRow = h; curTile.nLCU = curTile.nCol * curTile.nRow; curTile.nSlice = std::max(1U, curTile.nLCU / nLcuPerSlice); nSliceRest -= curTile.nSlice; ++id; }); }); while (nSliceRest) { std::sort(tile.begin(), tile.end(), CmpTiles); assert(tile[0].nLCU > tile[0].nSlice); tile[0].nSlice++; nSliceRest--; } std::sort(tile.begin(), tile.end(), TileIdLess); std::for_each(std::begin(tile), std::end(tile), AddTileSlices); } std::for_each(std::begin(slices), std::end(slices) , [&](SliceInfo& s) { assert(s.SegmentAddress < nLCU); s.SegmentAddress = TsToRs[s.SegmentAddress]; }); assert(slices.size() <= MAX_SLICES); return (mfxU16)slices.size(); } static mfxStatus VPS( Defaults::TGetVPS::TExt , const Defaults::Param& dflts , Base::VPS& vps) { auto& par = dflts.mvp; const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); mfxU16 NumTL = dflts.base.GetNumTemporalLayers(dflts); ProfileTierLevel& general = vps.general; SubLayerOrdering& slo = vps.sub_layer[NumTL - 1]; vps = Base::VPS{}; vps.video_parameter_set_id = 0; vps.reserved_three_2bits = 3; vps.max_layers_minus1 = 0; vps.max_sub_layers_minus1 = mfxU16(NumTL - 1); vps.temporal_id_nesting_flag = 1; vps.reserved_0xffff_16bits = 0xFFFF; vps.sub_layer_ordering_info_present_flag = 0; vps.timing_info_present_flag = 1; vps.num_units_in_tick = par.mfx.FrameInfo.FrameRateExtD; vps.time_scale = par.mfx.FrameInfo.FrameRateExtN; vps.poc_proportional_to_timing_flag = 0; vps.num_hrd_parameters = 0; general.profile_space = 0; general.tier_flag = !!(par.mfx.CodecLevel & MFX_TIER_HEVC_HIGH); general.profile_idc = mfxU8(par.mfx.CodecProfile); general.profile_compatibility_flags = 1 << (31 - general.profile_idc); general.progressive_source_flag = 1; general.interlaced_source_flag = 0; general.non_packed_constraint_flag = 0; general.frame_only_constraint_flag = 1; general.level_idc = mfxU8((par.mfx.CodecLevel & 0xFF) * 3); if (par.mfx.CodecProfile == MFX_PROFILE_HEVC_REXT || (par.mfx.CodecProfile == MFX_PROFILE_HEVC_MAIN10 && HEVCParam.GeneralConstraintFlags == MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY)) { general.rext_constraint_flags_0_31 = (mfxU32)(HEVCParam.GeneralConstraintFlags & 0xffffffff); general.rext_constraint_flags_32_42 = (mfxU32)(HEVCParam.GeneralConstraintFlags >> 32); } auto numReorderFrames = dflts.base.GetNumReorderFrames(dflts); slo.max_dec_pic_buffering_minus1 = par.mfx.NumRefFrame; slo.max_num_reorder_pics = std::min(numReorderFrames, slo.max_dec_pic_buffering_minus1); slo.max_latency_increase_plus1 = 0; return MFX_ERR_NONE; } static mfxStatus SPS( Defaults::TGetSPS::TExt , const Defaults::Param& defPar , const Base::VPS& vps , Base::SPS& sps) { const std::map arIdc = { {( 0 << 16) + 0, 0} , {( 1 << 16) + 1, 1} , {( 12 << 16) + 11, 2} , {( 10 << 16) + 11, 3} , {( 16 << 16) + 11, 4} , {( 40 << 16) + 33, 5} , {( 24 << 16) + 11, 6} , {( 20 << 16) + 11, 7} , {( 32 << 16) + 11, 8} , {( 80 << 16) + 33, 9} , {( 18 << 16) + 11, 10} , {( 15 << 16) + 11, 11} , {( 64 << 16) + 33, 12} , {(160 << 16) + 99, 13} , {( 4 << 16) + 3, 14} , {( 3 << 16) + 2, 15} , {( 2 << 16) + 1, 16} }; auto GetAspectRatioIdc = [&arIdc](mfxU16 w, mfxU16 h) { mfxU32 key = (w << 16) + h; return arIdc.count(key) ? mfxU8(arIdc.at(key)) : mfxU8(255); }; auto& slo = vps.sub_layer[vps.max_sub_layers_minus1]; const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(defPar.mvp); const mfxExtCodingOption& CO = ExtBuffer::Get(defPar.mvp); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(defPar.mvp); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(defPar.mvp); auto& mfx = defPar.mvp.mfx; sps = Base::SPS{}; ((LayersInfo&)sps) = ((LayersInfo&)vps); sps.video_parameter_set_id = vps.video_parameter_set_id; sps.max_sub_layers_minus1 = vps.max_sub_layers_minus1; sps.temporal_id_nesting_flag = vps.temporal_id_nesting_flag; sps.seq_parameter_set_id = 0; sps.chroma_format_idc = CO3.TargetChromaFormatPlus1 - 1; sps.separate_colour_plane_flag = 0; sps.pic_width_in_luma_samples = HEVCParam.PicWidthInLumaSamples; sps.pic_height_in_luma_samples = HEVCParam.PicHeightInLumaSamples; sps.conformance_window_flag = 0; sps.bit_depth_luma_minus8 = (mfxU8)std::max(0, CO3.TargetBitDepthLuma - 8); sps.bit_depth_chroma_minus8 = (mfxU8)std::max(0, CO3.TargetBitDepthChroma - 8); sps.log2_max_pic_order_cnt_lsb_minus4 = (mfxU8)mfx::clamp(mfx::CeilLog2(mfx.GopRefDist + slo.max_dec_pic_buffering_minus1) - 1, 0u, 12u); sps.log2_min_luma_coding_block_size_minus3 = 0; sps.log2_diff_max_min_luma_coding_block_size = mfx::CeilLog2(HEVCParam.LCUSize) - 3 - sps.log2_min_luma_coding_block_size_minus3; sps.log2_min_transform_block_size_minus2 = 0; sps.log2_diff_max_min_transform_block_size = 3; sps.max_transform_hierarchy_depth_inter = 2; sps.max_transform_hierarchy_depth_intra = 2; sps.scaling_list_enabled_flag = 0; sps.amp_enabled_flag = true; sps.sample_adaptive_offset_enabled_flag = !(HEVCParam.SampleAdaptiveOffset & MFX_SAO_DISABLE); sps.pcm_enabled_flag = 0; sps.long_term_ref_pics_present_flag = 1; sps.temporal_mvp_enabled_flag = 1; sps.strong_intra_smoothing_enabled_flag = 0; // QpModulation support bool isBPyramid = (CO2.BRefType == MFX_B_REF_PYRAMID); sps.low_delay_mode = (mfx.GopRefDist == 1); sps.hierarchical_flag = isBPyramid && ((mfx.GopRefDist == 4) || (mfx.GopRefDist == 8)); auto& fi = mfx.FrameInfo; mfxU16 SubWidthC[4] = {1,2,2,1}; mfxU16 SubHeightC[4] = {1,2,1,1}; mfxU16 cropUnitX = SubWidthC[sps.chroma_format_idc]; mfxU16 cropUnitY = SubHeightC[sps.chroma_format_idc]; sps.conf_win_left_offset = (fi.CropX / cropUnitX); sps.conf_win_right_offset = (sps.pic_width_in_luma_samples - fi.CropW - fi.CropX) / cropUnitX; sps.conf_win_top_offset = (fi.CropY / cropUnitY); sps.conf_win_bottom_offset = (sps.pic_height_in_luma_samples - fi.CropH - fi.CropY) / cropUnitY; sps.conformance_window_flag = sps.conf_win_left_offset || sps.conf_win_right_offset || sps.conf_win_top_offset || sps.conf_win_bottom_offset; sps.vui_parameters_present_flag = 1; sps.vui.aspect_ratio_info_present_flag = 1; sps.vui.aspect_ratio_idc = GetAspectRatioIdc(fi.AspectRatioW, fi.AspectRatioH); sps.vui.sar_width = fi.AspectRatioW; sps.vui.sar_height = fi.AspectRatioH; const mfxExtChromaLocInfo& CLI = ExtBuffer::Get(defPar.mvp); sps.vui.chroma_loc_info_present_flag = mfxU8(CLI.ChromaLocInfoPresentFlag); sps.vui.chroma_sample_loc_type_top_field = mfxU8(CLI.ChromaSampleLocTypeTopField); sps.vui.chroma_sample_loc_type_bottom_field = mfxU8(CLI.ChromaSampleLocTypeBottomField); const mfxExtVideoSignalInfo& VSI = ExtBuffer::Get(defPar.mvp); sps.vui.video_format = mfxU8(VSI.VideoFormat); sps.vui.video_full_range_flag = VSI.VideoFullRange; sps.vui.colour_description_present_flag = VSI.ColourDescriptionPresent; sps.vui.colour_primaries = mfxU8(VSI.ColourPrimaries); sps.vui.transfer_characteristics = mfxU8(VSI.TransferCharacteristics); sps.vui.matrix_coeffs = mfxU8(VSI.MatrixCoefficients); sps.vui.video_signal_type_present_flag = (VSI.VideoFormat != 5) || (VSI.VideoFullRange != 0) || (VSI.ColourDescriptionPresent != 0); sps.vui.timing_info_present_flag = !!vps.timing_info_present_flag; sps.vui.num_units_in_tick = vps.num_units_in_tick; sps.vui.time_scale = vps.time_scale; sps.vui.field_seq_flag = 0; sps.vui.frame_field_info_present_flag = IsOn(CO.PicTimingSEI) || sps.vui.field_seq_flag || (vps.general.progressive_source_flag && vps.general.interlaced_source_flag); if (IsOn(CO.VuiNalHrdParameters)) { HRDInfo& hrd = sps.vui.hrd; HRDInfo::SubLayer& sl0 = hrd.sl[0]; HRDInfo::SubLayer::CPB& cpb0 = sl0.cpb[0]; mfxU32 hrdBitrate = HEVCEHW::MaxKbps(mfx) * 1000; mfxU32 cpbSize = HEVCEHW::BufferSizeInKB(mfx) * 8000; sps.vui.hrd_parameters_present_flag = 1; hrd.nal_hrd_parameters_present_flag = 1; hrd.sub_pic_hrd_params_present_flag = 0; hrd.bit_rate_scale = mfxU16(mfx::clamp(CountTrailingZeroes(hrdBitrate) - 6, 0, 16)); hrd.cpb_size_scale = mfxU16(mfx::clamp(CountTrailingZeroes(cpbSize) - 4, 2, 16)); hrd.initial_cpb_removal_delay_length_minus1 = 23; hrd.au_cpb_removal_delay_length_minus1 = 23; hrd.dpb_output_delay_length_minus1 = 23; sl0.fixed_pic_rate_general_flag = 1; sl0.low_delay_hrd_flag = 0; sl0.cpb_cnt_minus1 = 0; cpb0.bit_rate_value_minus1 = (hrdBitrate >> (6 + hrd.bit_rate_scale)) - 1; cpb0.cpb_size_value_minus1 = (cpbSize >> (4 + hrd.cpb_size_scale)) - 1; cpb0.cbr_flag = (mfx.RateControlMethod == MFX_RATECONTROL_CBR); } return MFX_ERR_NONE; } static mfxStatus PPS( Defaults::TGetPPS::TExt , const Defaults::Param& defPar , const Base::SPS& sps , Base::PPS& pps) { auto& par = defPar.mvp; const mfxExtHEVCParam& HEVCParam = ExtBuffer::Get(par); const mfxExtHEVCTiles& HEVCTiles = ExtBuffer::Get(par); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); bool bSWBRC = Legacy::IsSWBRC(par); bool bCQP = (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP); mfxU16 maxRefP = *std::max_element(CO3.NumRefActiveP, CO3.NumRefActiveP + 8); mfxU16 maxRefBL0 = *std::max_element(CO3.NumRefActiveBL0, CO3.NumRefActiveBL0 + 8); mfxU16 maxRefBL1 = *std::max_element(CO3.NumRefActiveBL1, CO3.NumRefActiveBL1 + 8); pps = {}; pps.seq_parameter_set_id = sps.seq_parameter_set_id; pps.pic_parameter_set_id = 0; pps.dependent_slice_segments_enabled_flag = 0; pps.output_flag_present_flag = 0; pps.num_extra_slice_header_bits = 0; pps.sign_data_hiding_enabled_flag = 0; pps.cabac_init_present_flag = 0; pps.num_ref_idx_l0_default_active_minus1 = (par.mfx.GopRefDist <= 2) ? (maxRefP - 1) : (maxRefBL0 - 1); pps.num_ref_idx_l1_default_active_minus1 = (par.mfx.GopRefDist <= 2) ? (maxRefP - 1) : (maxRefBL1 - 1); pps.init_qp_minus26 = 0; pps.constrained_intra_pred_flag = 0; pps.transform_skip_enabled_flag = IsOn(CO3.TransformSkip); pps.cu_qp_delta_enabled_flag = !(IsOff(CO3.EnableMBQP) && bCQP) && !bSWBRC; pps.cu_qp_delta_enabled_flag |= (IsOn(par.mfx.LowPower) || CO2.MaxSliceSize); // Only 3 and 0 are supported pps.diff_cu_qp_delta_depth = (HEVCParam.LCUSize == 64) * 3; pps.cb_qp_offset = (bSWBRC * -1); pps.cr_qp_offset = (bSWBRC * -1); pps.slice_chroma_qp_offsets_present_flag = (bSWBRC * 1); mfxI32 QP = (par.mfx.GopPicSize == 1) * par.mfx.QPI + (par.mfx.GopPicSize != 1 && par.mfx.GopRefDist == 1) * par.mfx.QPP + (par.mfx.GopPicSize != 1 && par.mfx.GopRefDist != 1) * par.mfx.QPB; pps.init_qp_minus26 = bCQP * (QP - 26 - (6 * sps.bit_depth_luma_minus8)); pps.slice_chroma_qp_offsets_present_flag = 0; pps.weighted_pred_flag = 0; pps.weighted_bipred_flag = 0; pps.transquant_bypass_enabled_flag = 0; pps.tiles_enabled_flag = 0; pps.entropy_coding_sync_enabled_flag = 0; if (HEVCTiles.NumTileColumns * HEVCTiles.NumTileRows > 1) { mfxU16 nCol = (mfxU16)mfx::CeilDiv(HEVCParam.PicWidthInLumaSamples, HEVCParam.LCUSize); mfxU16 nRow = (mfxU16)mfx::CeilDiv(HEVCParam.PicHeightInLumaSamples, HEVCParam.LCUSize); mfxU16 nTCol = std::max(HEVCTiles.NumTileColumns, 1); mfxU16 nTRow = std::max(HEVCTiles.NumTileRows, 1); pps.tiles_enabled_flag = 1; pps.uniform_spacing_flag = 1; pps.num_tile_columns_minus1 = nTCol - 1; pps.num_tile_rows_minus1 = nTRow - 1; mfxI32 i = -1; std::generate(std::begin(pps.column_width), std::end(pps.column_width) , [nCol, nTCol, &i]() { ++i; return mfxU16(((i + 1) * nCol) / nTCol - (i * nCol) / nTCol); }); i = -1; std::generate(std::begin(pps.row_height), std::end(pps.row_height) , [nRow, nTRow, &i]() { ++i; return mfxU16(((i + 1) * nRow) / nTRow - (i * nRow) / nTRow); }); pps.loop_filter_across_tiles_enabled_flag = 1; } pps.loop_filter_across_slices_enabled_flag = true; pps.deblocking_filter_control_present_flag = 1; pps.deblocking_filter_disabled_flag = !!CO2.DisableDeblockingIdc; pps.deblocking_filter_override_enabled_flag = 1; // to disable deblocking per frame pps.scaling_list_data_present_flag = 0; pps.lists_modification_present_flag = 1; pps.log2_parallel_merge_level_minus2 = 0; pps.slice_segment_header_extension_present_flag = 0; return MFX_ERR_NONE; } static mfxU8 SHNUT( Defaults::TGetSHNUT::TExt , const Defaults::Param& , const TaskCommonPar& task , bool bRAPIntra) { const DpbArray& DPB = task.DPB.After; const bool isI = IsI(task.FrameType); const bool isRef = IsRef(task.FrameType); const bool isIDR = IsIdr(task.FrameType); auto IsNonCurrLTR = [&](const DpbFrame& ref) { return (isValid(ref) && ref.isLTR && ref.Rec.Idx != task.Rec.Idx); }; mfxU8 NUT = mfxU8(task.ctrl.MfxNalUnitType); bool bExtNUTValid = task.ctrl.MfxNalUnitType && ((NUT == MFX_HEVC_NALU_TYPE_TRAIL_R && (task.POC > task.PrevRAP && isRef)) || (NUT == MFX_HEVC_NALU_TYPE_TRAIL_N && (task.POC > task.PrevRAP && !isRef)) || (NUT == MFX_HEVC_NALU_TYPE_RASL_R && (task.POC < task.PrevRAP && isRef)) || (NUT == MFX_HEVC_NALU_TYPE_RASL_N && (task.POC < task.PrevRAP && !isRef)) || (NUT == MFX_HEVC_NALU_TYPE_RADL_R && (task.POC < task.PrevRAP && isRef)) || (NUT == MFX_HEVC_NALU_TYPE_RADL_N && (task.POC < task.PrevRAP && !isRef)) || (NUT == MFX_HEVC_NALU_TYPE_CRA_NUT && isI) || (NUT == MFX_HEVC_NALU_TYPE_IDR_W_RADL && isIDR) || (NUT == MFX_HEVC_NALU_TYPE_IDR_N_LP && isIDR)); NUT *= bExtNUTValid; NUT += mfxU8((!NUT && isIDR) * (IDR_W_RADL + 1)); NUT += mfxU8((!NUT && isI && bRAPIntra && std::end(DPB) != std::find_if(DPB, std::end(DPB), IsNonCurrLTR)) * (TRAIL_R + 1)); //following frames may refer to prev. GOP NUT += mfxU8((!NUT && isI && bRAPIntra) * (CRA_NUT + 1)); NUT += mfxU8((!NUT && task.TemporalID > 0) * (TSA_N + isRef + 1)); NUT += mfxU8((!NUT && task.POC > task.PrevRAP) * (TRAIL_N + isRef + 1)); NUT += mfxU8(!NUT * (RASL_N + isRef + 1)); return mfxU8(NUT - 1); } static mfxU32 FrameOrder( Defaults::TGetFrameOrder::TExt , const Defaults::Param& par , const StorageR& s_task , mfxU32 prevFrameOrder) { if (par.mvp.mfx.EncodedOrder) { auto& task = Task::Common::Get(s_task); if (task.pSurfIn) { return task.pSurfIn->Data.FrameOrder; } } return (prevFrameOrder + 1); } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.Get##X.Push(X); PUSH_DEFAULT(CodedPicAlignment); PUSH_DEFAULT(CodedPicWidth); PUSH_DEFAULT(CodedPicHeight); PUSH_DEFAULT(MaxDPB); PUSH_DEFAULT(GopPicSize); PUSH_DEFAULT(GopRefDist); PUSH_DEFAULT(NumBPyramidLayers); PUSH_DEFAULT(NumRefBPyramid); PUSH_DEFAULT(NumRefPPyramid); PUSH_DEFAULT(NumRefNoPyramid); PUSH_DEFAULT(NumRefFrames); PUSH_DEFAULT(MinRefForBPyramid); PUSH_DEFAULT(MinRefForBNoPyramid); PUSH_DEFAULT(NumRefActive); PUSH_DEFAULT(BRefType); PUSH_DEFAULT(PRefType); PUSH_DEFAULT(FrameRate); PUSH_DEFAULT(MaxBitDepthByFourCC); PUSH_DEFAULT(MaxBitDepth); PUSH_DEFAULT(MaxChroma); PUSH_DEFAULT(MaxChromaByFourCC); PUSH_DEFAULT(TargetBitDepthLuma); PUSH_DEFAULT(TargetChromaFormat); PUSH_DEFAULT(TargetKbps); PUSH_DEFAULT(MaxKbps); PUSH_DEFAULT(PreSetBufferSizeInKB); PUSH_DEFAULT(BufferSizeInKB); PUSH_DEFAULT(MaxNumRef); PUSH_DEFAULT(RateControlMethod); PUSH_DEFAULT(MinQPMFX); PUSH_DEFAULT(MaxQPMFX); PUSH_DEFAULT(QPMFX); PUSH_DEFAULT(QPOffset); PUSH_DEFAULT(Profile); PUSH_DEFAULT(MBBRC); PUSH_DEFAULT(AsyncDepth); PUSH_DEFAULT(NumSlices); PUSH_DEFAULT(LCUSize); PUSH_DEFAULT(HRDConformanceON); PUSH_DEFAULT(PicTimingSEI); PUSH_DEFAULT(FrameType); PUSH_DEFAULT(PPyrInterval); PUSH_DEFAULT(PLayer); PUSH_DEFAULT(NumTemporalLayers); PUSH_DEFAULT(TId); PUSH_DEFAULT(HighestTId); PUSH_DEFAULT(RPLFromExt); PUSH_DEFAULT(RefPicList); PUSH_DEFAULT(RPLMod); PUSH_DEFAULT(RPLFromCtrl); PUSH_DEFAULT(PreReorderInfo); PUSH_DEFAULT(LowPower); PUSH_DEFAULT(NumReorderFrames); PUSH_DEFAULT(NonStdReordering); PUSH_DEFAULT(NumTiles); PUSH_DEFAULT(TileSlices); PUSH_DEFAULT(Slices); PUSH_DEFAULT(VPS); PUSH_DEFAULT(SPS); PUSH_DEFAULT(PPS); PUSH_DEFAULT(FrameNumRefActive); PUSH_DEFAULT(SHNUT); PUSH_DEFAULT(WeakRef); PUSH_DEFAULT(FrameOrder); #undef PUSH_DEFAULT df.CmpRefLX[0].Push(CmpRef); df.CmpRefLX[1].Push(CmpRef); } }; class PreCheck { public: static mfxStatus CodecId( Defaults::TPreCheck::TExt , const mfxVideoParam& in) { MFX_CHECK(in.mfx.CodecId == MFX_CODEC_HEVC, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus ChromaFormat( Defaults::TPreCheck::TExt , const mfxVideoParam& in) { bool bUnsupported = Check (in.mfx.FrameInfo.ChromaFormat); MFX_CHECK(!bUnsupported, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.PreCheck##X.Push(X); PUSH_DEFAULT(CodecId); PUSH_DEFAULT(ChromaFormat); #undef PUSH_DEFAULT } }; class CheckAndFix { public: static mfxStatus LCUSize( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); MFX_CHECK(pHEVC, MFX_ERR_NONE); auto& lcuSize = pHEVC->LCUSize; MFX_CHECK(lcuSize != 0, MFX_ERR_NONE);// zero is allowed /* LCUSizeSupported - Supported LCU sizes, bit fields 0b001 : 16x16 0b010 : 32x32 0b100 : 64x64 */ assert(dpar.caps.LCUSizeSupported > 0); bool bValid = !Check(lcuSize) && ((lcuSize >> 4) & dpar.caps.LCUSizeSupported); lcuSize *= bValid; MFX_CHECK(bValid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus LowDelayBRC( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { (void)dpar; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); mfxU32 changed = 0; bool bAllowed = !Check (par.mfx.RateControlMethod); changed += CheckOrZero( pCO3->LowDelayBRC , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(MFX_CODINGOPTION_ON * bAllowed)); bool bOn = IsOn(pCO3->LowDelayBRC); changed += bOn && CheckOrZero(pCO3->WinBRCMaxAvgKbps); changed += bOn && CheckOrZero(pCO3->WinBRCSize); changed += bOn && SetIf(par.mfx.GopRefDist, par.mfx.GopRefDist > 1, 1); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static mfxStatus Level( Defaults::TCheckAndFix::TExt , const Defaults::Param& /*dpar*/ , mfxVideoParam& par) { bool bInalid = CheckOrZero (par.mfx.CodecLevel); MFX_CHECK(!bInalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus SurfSize( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { auto pCO2 = (const mfxExtCodingOption2*)ExtBuffer::Get(par); auto& W = par.mfx.FrameInfo.Width; auto& H = par.mfx.FrameInfo.Height; auto& CRPX = par.mfx.FrameInfo.CropX; auto& CRPY = par.mfx.FrameInfo.CropY; auto CRPX_c = CRPX; auto CRPY_c = CRPY; auto& CRPW = par.mfx.FrameInfo.CropW; auto& CRPH = par.mfx.FrameInfo.CropH; auto AW = mfx::align2_value(W, HW_SURF_ALIGN_W); auto AH = mfx::align2_value(H, HW_SURF_ALIGN_H); mfxU32 changed = 0; mfxStatus UnsSts = MFX_ERR_NONE; bool bVDEnc64 = IsOn(par.mfx.LowPower) && (64 == dpar.base.GetLCUSize(dpar)); mfxU16 MaxW = mfxU16(dpar.caps.MaxPicWidth); mfxU16 MaxH = mfxU16(dpar.caps.MaxPicHeight); mfxU16 MinW = mfxU16(128 * (bVDEnc64 && !dpar.caps.SliceByteSizeCtrl)); mfxU16 MinH = mfxU16(128 * (bVDEnc64)); MinW = std::max(MinW, mfxU16(192 * (bVDEnc64 && pCO2 && pCO2->MaxSliceSize))); MFX_CHECK(W, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(H, MFX_ERR_INVALID_VIDEO_PARAM); changed += (W != AW) + (H != AH); W = AW; H = AH; MFX_CHECK_NO_RET(!CheckRangeOrSetDefault(W, MinW, MaxW, 0), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET(!CheckRangeOrSetDefault(H, MinH, MaxH, 0), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET(!CheckMaxOrZero (CRPX, W), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET(!CheckMaxOrZero (CRPY, H), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET(!CheckMaxOrZero (CRPW, W - CRPX_c), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_NO_RET(!CheckMaxOrZero (CRPH, H - CRPY_c), UnsSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_STS(UnsSts); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static mfxStatus Profile( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxU32 changed = 0; mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); mfxU16 ChromaFormat = defPar.base.GetTargetChromaFormat(defPar) - 1; mfxU16 BitDepth = defPar.base.GetTargetBitDepthLuma(defPar); mfxU64 REXTConstr = 0; if (pHEVC) REXTConstr = pHEVC->GeneralConstraintFlags; bool bValid = !par.mfx.CodecProfile || (par.mfx.CodecProfile == MFX_PROFILE_HEVC_REXT && !(((REXTConstr & MFX_HEVC_CONSTR_REXT_MAX_8BIT) && BitDepth > 8) || ((REXTConstr & MFX_HEVC_CONSTR_REXT_MAX_10BIT) && BitDepth > 10) || ((REXTConstr & MFX_HEVC_CONSTR_REXT_MAX_12BIT) && BitDepth > 12) || ((REXTConstr & MFX_HEVC_CONSTR_REXT_MAX_420CHROMA) && ChromaFormat > MFX_CHROMAFORMAT_YUV420) || ((REXTConstr & MFX_HEVC_CONSTR_REXT_MAX_422CHROMA) && ChromaFormat > MFX_CHROMAFORMAT_YUV422))) || (par.mfx.CodecProfile == MFX_PROFILE_HEVC_MAIN10 && !(BitDepth != 10 && BitDepth != 0)) || (par.mfx.CodecProfile == MFX_PROFILE_HEVC_MAINSP) || (par.mfx.CodecProfile == MFX_PROFILE_HEVC_MAIN && !(BitDepth != 8 && BitDepth != 0)); changed += (par.mfx.CodecProfile == MFX_PROFILE_HEVC_MAINSP || Legacy::IsMain10SP(par.mfx.CodecProfile, pHEVC)) && CheckOrZero(par.mfx.GopPicSize, 0, 1); par.mfx.CodecProfile *= bValid; MFX_CHECK(bValid, MFX_ERR_UNSUPPORTED); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static const std::map> FourCCPar; static mfxStatus FourCC( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { const mfxU16 BdMap[] = {8, 10, 12, 16}; auto& FourCC = par.mfx.FrameInfo.FourCC; auto it = FourCCPar.find(FourCC); bool bInvalid = (it == FourCCPar.end()); bool bRGB = (FourCC == MFX_FOURCC_A2RGB10 || FourCC == MFX_FOURCC_RGB4); bInvalid = bInvalid || (it->second[1] > BdMap[dpar.caps.MaxEncodedBitDepth & 3]); bInvalid = bInvalid || (bRGB && !dpar.caps.RGBEncodingSupport); FourCC *= !bInvalid; MFX_CHECK(!bInvalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus InputFormatByFourCC( Defaults::TCheckAndFix::TExt , const Defaults::Param& /*dpar*/ , mfxVideoParam& par) { mfxU32 invalid = 0; auto itFourCCPar = FourCCPar.find(par.mfx.FrameInfo.FourCC); invalid += (itFourCCPar == FourCCPar.end() && Res2Bool(par.mfx.FrameInfo.FourCC, mfxU32(MFX_FOURCC_NV12))); itFourCCPar = FourCCPar.find(par.mfx.FrameInfo.FourCC); assert(itFourCCPar != FourCCPar.end()); invalid += CheckOrZero(par.mfx.FrameInfo.ChromaFormat, mfxU16(itFourCCPar->second[0])); invalid += CheckOrZero(par.mfx.FrameInfo.BitDepthLuma, mfxU16(itFourCCPar->second[1]), 0); invalid += CheckOrZero(par.mfx.FrameInfo.BitDepthChroma, mfxU16(itFourCCPar->second[1]), 0); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus TargetChromaFormat( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { mfxU32 invalid = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); // 422 target is not supported on VDENC invalid += IsOn(par.mfx.LowPower) && pCO3->TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV422); // 444 target is not POR on VME invalid += !IsOn(par.mfx.LowPower) && pCO3->TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV444); static const mfxU16 cfTbl[] = { 0 , 1 + MFX_CHROMAFORMAT_YUV420 , 1 + MFX_CHROMAFORMAT_YUV422 , 1 + MFX_CHROMAFORMAT_YUV444 }; mfxU16 maxChroma = dpar.base.GetMaxChroma(dpar) + 1; maxChroma *= (maxChroma <= mfx::size(cfTbl)); SetDefault(maxChroma, mfxU16(MFX_CHROMAFORMAT_YUV420 + 1)); invalid += !std::count(cfTbl, cfTbl + maxChroma, pCO3->TargetChromaFormatPlus1); invalid += (pCO3->TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV444) && !dpar.caps.YUV444ReconSupport); invalid += (pCO3->TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV422) && !dpar.caps.YUV422ReconSupport); pCO3->TargetChromaFormatPlus1 *= !invalid; MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus TargetBitDepth( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); mfxU32 invalid = 0; auto CheckBD = [&](bool bMax10) { invalid += bMax10 && CheckOrZero(pCO3->TargetBitDepthLuma); invalid += bMax10 && CheckOrZero(pCO3->TargetBitDepthChroma); invalid += !bMax10 && CheckOrZero(pCO3->TargetBitDepthLuma); invalid += !bMax10 && CheckOrZero(pCO3->TargetBitDepthChroma); }; CheckBD(dpar.base.GetMaxBitDepth(dpar) == 10); CheckBD(pCO3->TargetBitDepthLuma == 10); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); auto& fi = par.mfx.FrameInfo; mfxU32 changed = 0; changed += fi.BitDepthLuma && pCO3->TargetBitDepthLuma && !IsOn(par.mfx.LowPower) && SetIf(pCO3->TargetBitDepthLuma, pCO3->TargetBitDepthLuma != fi.BitDepthLuma, 0); changed += fi.BitDepthChroma && pCO3->TargetBitDepthChroma && !IsOn(par.mfx.LowPower) && SetIf(pCO3->TargetBitDepthChroma, pCO3->TargetBitDepthChroma != fi.BitDepthChroma, 0); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static mfxStatus FourCCByTargetFormat( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { auto tbdl = dpar.base.GetTargetBitDepthLuma(dpar); auto tcf = dpar.base.GetTargetChromaFormat(dpar); static const std::map> Compatible[2] = { //8 { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , {MFX_FOURCC_AYUV, MFX_FOURCC_Y410, MFX_FOURCC_RGB4 , MFX_FOURCC_BGR4, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV422) , {MFX_FOURCC_YUY2, MFX_FOURCC_Y210, MFX_FOURCC_P210 , MFX_FOURCC_AYUV, MFX_FOURCC_Y410, MFX_FOURCC_RGB4 , MFX_FOURCC_BGR4, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , {MFX_FOURCC_NV12, MFX_FOURCC_P010, MFX_FOURCC_RGB4 , MFX_FOURCC_YUY2, MFX_FOURCC_P210, MFX_FOURCC_Y210 , MFX_FOURCC_AYUV, MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10 , MFX_FOURCC_BGR4} } }, //10 { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , {MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV422) , {MFX_FOURCC_P210, MFX_FOURCC_Y210, MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10} } ,{ mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , {MFX_FOURCC_P010, MFX_FOURCC_P210, MFX_FOURCC_Y210, MFX_FOURCC_Y410, MFX_FOURCC_A2RGB10} } }, }; bool bUndefinedTargetFormat = (tbdl != 8 && tbdl != 10) || !Compatible[tbdl == 10].count(tcf) || !Compatible[tbdl == 10].at(tcf).count(par.mfx.FrameInfo.FourCC); assert(!bUndefinedTargetFormat); par.mfx.FrameInfo.FourCC *= !bUndefinedTargetFormat; MFX_CHECK(!bUndefinedTargetFormat, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus WinBRC( Defaults::TCheckAndFix::TExt , const Defaults::Param& dpar , mfxVideoParam& par) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3 && (pCO3->WinBRCSize || pCO3->WinBRCMaxAvgKbps), MFX_ERR_NONE); mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); bool bExtBRC = pCO2 && IsOn(pCO2->ExtBRC); bool bVBR = (par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR); bool bUnsupported = bVBR && pCO3->WinBRCMaxAvgKbps && (pCO3->WinBRCMaxAvgKbps < TargetKbps(par.mfx)); mfxU32 changed = !bVBR || bUnsupported; pCO3->WinBRCSize *= !changed; pCO3->WinBRCMaxAvgKbps *= !changed; MFX_CHECK(!bUnsupported, MFX_ERR_UNSUPPORTED); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(bVBR && !bExtBRC, MFX_ERR_NONE); auto fr = dpar.base.GetFrameRate(dpar); mfxU16 fps = mfxU16(mfx::CeilDiv(std::get<0>(fr), std::get<1>(fr))); auto maxKbps = dpar.base.GetMaxKbps(dpar); changed += pCO3->WinBRCSize && SetIf(pCO3->WinBRCSize, pCO3->WinBRCSize != fps, fps); changed += SetIf(pCO3->WinBRCMaxAvgKbps, pCO3->WinBRCMaxAvgKbps != maxKbps, maxKbps); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static mfxStatus SAO( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); MFX_CHECK(pHEVC, MFX_ERR_NONE); mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); /* This flag should be set to 0 for max LCU size is 16x16 */ bool bSAOSupported = !((pCO3 && pCO3->WeightedPred == MFX_WEIGHTED_PRED_EXPLICIT) || (pCO3 && pCO3->WeightedBiPred == MFX_WEIGHTED_PRED_EXPLICIT) || defPar.base.GetLCUSize(defPar) == 16 ); changed += CheckOrZero (pHEVC->SampleAdaptiveOffset , mfxU16(MFX_SAO_UNKNOWN) , mfxU16(MFX_SAO_DISABLE) , mfxU16(bSAOSupported * MFX_SAO_ENABLE_LUMA) , mfxU16(bSAOSupported * MFX_SAO_ENABLE_CHROMA) , mfxU16(bSAOSupported * (MFX_SAO_ENABLE_LUMA | MFX_SAO_ENABLE_CHROMA))); MFX_CHECK(!changed, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus NumRefActive( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxU32 changed = 0; mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); mfxU16 maxDPB = par.mfx.NumRefFrame + 1; SetIf(maxDPB, !par.mfx.NumRefFrame, defPar.base.GetMaxDPB, defPar); mfxU16 maxP = std::min(defPar.caps.MaxNum_Reference0, maxDPB - 1); mfxU16 maxBL0 = std::min(defPar.caps.MaxNum_Reference0, maxDPB - 1); mfxU16 maxBL1 = std::min(defPar.caps.MaxNum_Reference1, maxDPB - 1); auto maxRefByTu = defPar.base.GetMaxNumRef(defPar); maxP = std::min(maxP, std::get

(maxRefByTu)); maxBL0 = std::min(maxBL0, std::get(maxRefByTu)); maxBL1 = std::min(maxBL1, std::get(maxRefByTu)); for (mfxU16 i = 0; i < 8; i++) { changed += CheckMaxOrClip(pCO3->NumRefActiveP [i], maxP); changed += CheckMaxOrClip(pCO3->NumRefActiveBL0[i], maxBL0); changed += CheckMaxOrClip(pCO3->NumRefActiveBL1[i], maxBL1); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static mfxStatus Slices( Defaults::TCheckAndFix::TExt , const Defaults::Param& defPar , mfxVideoParam& par) { mfxU32 changed = 0; mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); bool bCheckNMB = pCO2 && pCO2->NumMbPerSlice; if (bCheckNMB) { auto tiles = defPar.base.GetNumTiles(defPar); mfxU16 W = defPar.base.GetCodedPicWidth(defPar); mfxU16 H = defPar.base.GetCodedPicHeight(defPar); mfxU16 LCUSize = defPar.base.GetLCUSize(defPar); mfxU32 nLCU = mfx::CeilDiv(W, LCUSize) * mfx::CeilDiv(H, LCUSize); mfxU32 nTile = std::get<0>(tiles) * std::get<1>(tiles); mfxU32 maxSlicesPerTile = MAX_SLICES / nTile; mfxU32 maxSlicesTotal = maxSlicesPerTile * nTile; mfxU32 maxNumMbPerSlice = mfx::CeilDiv(nLCU, nTile); mfxU32 minNumMbPerSlice = mfx::CeilDiv(nLCU, maxSlicesTotal); changed += CheckMinOrClip(pCO2->NumMbPerSlice, minNumMbPerSlice); changed += CheckMaxOrClip(pCO2->NumMbPerSlice, maxNumMbPerSlice); } std::vector slices; auto supportedNslices = defPar.base.GetSlices(defPar, slices); if (par.mfx.NumSlice) { changed += CheckRangeOrSetDefault(par.mfx.NumSlice, supportedNslices, supportedNslices, supportedNslices); } if (bCheckNMB) { auto itMaxSlice = std::max_element(slices.begin(), slices.end() , [](SliceInfo a, SliceInfo b) { return a.NumLCU < b.NumLCU; }); if (itMaxSlice != std::end(slices)) changed += CheckMinOrClip(pCO2->NumMbPerSlice, itMaxSlice->NumLCU); } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } static void Push(Defaults& df) { #define PUSH_DEFAULT(X) df.Check##X.Push(X); PUSH_DEFAULT(LCUSize); PUSH_DEFAULT(LowDelayBRC); PUSH_DEFAULT(Level); PUSH_DEFAULT(SurfSize); PUSH_DEFAULT(Profile); PUSH_DEFAULT(FourCC); PUSH_DEFAULT(InputFormatByFourCC); PUSH_DEFAULT(TargetChromaFormat); PUSH_DEFAULT(TargetBitDepth); PUSH_DEFAULT(FourCCByTargetFormat); PUSH_DEFAULT(WinBRC); PUSH_DEFAULT(SAO); PUSH_DEFAULT(NumRefActive); PUSH_DEFAULT(Slices); #undef PUSH_DEFAULT } }; const std::map> CheckAndFix::FourCCPar = { {mfxU32(MFX_FOURCC_AYUV), {mfxU32(MFX_CHROMAFORMAT_YUV444), 8 }} , {mfxU32(MFX_FOURCC_RGB4), {mfxU32(MFX_CHROMAFORMAT_YUV444), 8 }} , {mfxU32(MFX_FOURCC_A2RGB10), {mfxU32(MFX_CHROMAFORMAT_YUV444), 10 }} , {mfxU32(MFX_FOURCC_Y410), {mfxU32(MFX_CHROMAFORMAT_YUV444), 10 }} , {mfxU32(MFX_FOURCC_P210), {mfxU32(MFX_CHROMAFORMAT_YUV422), 10, }} , {mfxU32(MFX_FOURCC_Y210), {mfxU32(MFX_CHROMAFORMAT_YUV422), 10, }} , {mfxU32(MFX_FOURCC_YUY2), {mfxU32(MFX_CHROMAFORMAT_YUV422), 8, }} , {mfxU32(MFX_FOURCC_P010), {mfxU32(MFX_CHROMAFORMAT_YUV420), 10, }} , {mfxU32(MFX_FOURCC_NV12), {mfxU32(MFX_CHROMAFORMAT_YUV420), 8, }} , {mfxU32(MFX_FOURCC_BGR4), {mfxU32(MFX_CHROMAFORMAT_YUV444), 8, }} }; void Legacy::PushDefaults(Defaults& df) { GetDefault::Push(df); PreCheck::Push(df); CheckAndFix::Push(df); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_max_frame_size.cpp000066400000000000000000000122071443134507600361010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_max_frame_size.h" #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void MaxFrameSize::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtCodingOption2*)pSrc; auto& dst = *(mfxExtCodingOption2*)pDst; dst.MaxFrameSize = src.MaxFrameSize; }); } void MaxFrameSize::SetInherited(ParamInheritance& par) { par.m_ebInheritDefault[MFX_EXTBUFF_CODING_OPTION2].emplace_back( [](const mfxVideoParam& /*parInit*/ , const mfxExtBuffer* pSrc , const mfxVideoParam& /*parReset*/ , mfxExtBuffer* pDst) { auto& src = *(const mfxExtCodingOption2*)pSrc; auto& dst = *(mfxExtCodingOption2*)pDst; InheritOption(src.MaxFrameSize, dst.MaxFrameSize); }); } void MaxFrameSize::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); MFX_CHECK(pCO2 && pCO2->MaxFrameSize, MFX_ERR_NONE); auto& caps = Glob::EncodeCaps::Get(global); auto& MaxFrameSize = pCO2->MaxFrameSize; mfxU32 changed = 0; bool bSupported = (Legacy::IsSWBRC(par) || caps.UserMaxFrameSizeSupport) && !Check(par.mfx.RateControlMethod, mfxU16(MFX_RATECONTROL_VBR), mfxU16(MFX_RATECONTROL_QVBR)); mfxU32 MinValid = 0; mfxU32 MaxValid = MaxFrameSize * bSupported; if (par.mfx.FrameInfo.FrameRateExtN && par.mfx.FrameInfo.FrameRateExtD) { MinValid = mfxU32(TargetKbps(par.mfx) * 1000 * par.mfx.FrameInfo.FrameRateExtD / par.mfx.FrameInfo.FrameRateExtN / 8); MaxValid = std::max(MaxValid, MinValid) * bSupported; } changed += CheckMinOrClip(MaxFrameSize, MinValid); changed += CheckMaxOrZero(MaxFrameSize, MaxValid); return changed ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; }); } void MaxFrameSize::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3 && pCO2 && IsOn(pCO3->LowDelayBRC), MFX_ERR_NONE); mfxF64 frameRate = mfxF64(par.mfx.FrameInfo.FrameRateExtN) / par.mfx.FrameInfo.FrameRateExtD; mfxU32 avgFrameSizeInBytes = mfxU32(MaxKbps(par.mfx) * 1000 / frameRate / 8); mfxExtCodingOption* pCO = ExtBuffer::Get(par); if (IsOn(pCO3->LowDelayBRC) && pCO && IsOff(pCO->NalHrdConformance)) { SetDefault(pCO2->MaxFrameSize, 1.4 * avgFrameSizeInBytes); } else { SetDefault(pCO2->MaxFrameSize, 2 * avgFrameSizeInBytes); } return MFX_ERR_NONE; }); } void MaxFrameSize::Reset(const FeatureBlocks& /*blocks*/, TPushR Push) { Push(BLK_Reset , []( const mfxVideoParam& /*par*/ , StorageRW& global , StorageRW& /*local*/) -> mfxStatus { auto& parOld = Glob::VideoParam::Get(Glob::RealState::Get(global)); auto& parNew = Glob::VideoParam::Get(global); mfxExtCodingOption2& CO2Old = ExtBuffer::Get(parOld); mfxExtCodingOption2& CO2New = ExtBuffer::Get(parNew); auto& hint = Glob::ResetHint::Get(global); hint.Flags |= RF_BRC_RESET * (( parOld.mfx.RateControlMethod == MFX_RATECONTROL_CBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VBR || parOld.mfx.RateControlMethod == MFX_RATECONTROL_VCM) && (CO2Old.MaxFrameSize != CO2New.MaxFrameSize)); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_max_frame_size.h000066400000000000000000000047261443134507600355550ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class MaxFrameSize : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(Init)\ DECL_BLOCK(Reset)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_MaxFrameSize" #include "hevcehw_decl_blocks.h" MaxFrameSize(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void SetInherited(ParamInheritance& par) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII /*Push*/) override {}; virtual void Reset(const FeatureBlocks& blocks, TPushR Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& blocks, TPushSD Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST /*Push*/) override {}; bool m_bPatchNextDDITask = false; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_packer.cpp000066400000000000000000002275251443134507600343700ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_packer.h" #include #include #include using namespace HEVCEHW; using namespace HEVCEHW::Base; const mfxU8 tab_cabacRangeTabLps[128][4] = { { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 }, { 123, 150, 178, 205 }, { 116, 142, 169, 195 }, { 111, 135, 160, 185 }, { 105, 128, 152, 175 }, { 100, 122, 144, 166 }, { 95, 116, 137, 158 }, { 90, 110, 130, 150 }, { 85, 104, 123, 142 }, { 81, 99, 117, 135 }, { 77, 94, 111, 128 }, { 73, 89, 105, 122 }, { 69, 85, 100, 116 }, { 66, 80, 95, 110 }, { 62, 76, 90, 104 }, { 59, 72, 86, 99 }, { 56, 69, 81, 94 }, { 53, 65, 77, 89 }, { 51, 62, 73, 85 }, { 48, 59, 69, 80 }, { 46, 56, 66, 76 }, { 43, 53, 63, 72 }, { 41, 50, 59, 69 }, { 39, 48, 56, 65 }, { 37, 45, 54, 62 }, { 35, 43, 51, 59 }, { 33, 41, 48, 56 }, { 32, 39, 46, 53 }, { 30, 37, 43, 50 }, { 29, 35, 41, 48 }, { 27, 33, 39, 45 }, { 26, 31, 37, 43 }, { 24, 30, 35, 41 }, { 23, 28, 33, 39 }, { 22, 27, 32, 37 }, { 21, 26, 30, 35 }, { 20, 24, 29, 33 }, { 19, 23, 27, 31 }, { 18, 22, 26, 30 }, { 17, 21, 25, 28 }, { 16, 20, 23, 27 }, { 15, 19, 22, 25 }, { 14, 18, 21, 24 }, { 14, 17, 20, 23 }, { 13, 16, 19, 22 }, { 12, 15, 18, 21 }, { 12, 14, 17, 20 }, { 11, 14, 16, 19 }, { 11, 13, 15, 18 }, { 10, 12, 15, 17 }, { 10, 12, 14, 16 }, { 9, 11, 13, 15 }, { 9, 11, 12, 14 }, { 8, 10, 12, 14 }, { 8, 9, 11, 13 }, { 7, 9, 11, 12 }, { 7, 9, 10, 12 }, { 7, 8, 10, 11 }, { 6, 8, 9, 11 }, { 6, 7, 9, 10 }, { 6, 7, 8, 9 }, { 2, 2, 2, 2 }, //The same for valMPS=1 { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 }, { 123, 150, 178, 205 }, { 116, 142, 169, 195 }, { 111, 135, 160, 185 }, { 105, 128, 152, 175 }, { 100, 122, 144, 166 }, { 95, 116, 137, 158 }, { 90, 110, 130, 150 }, { 85, 104, 123, 142 }, { 81, 99, 117, 135 }, { 77, 94, 111, 128 }, { 73, 89, 105, 122 }, { 69, 85, 100, 116 }, { 66, 80, 95, 110 }, { 62, 76, 90, 104 }, { 59, 72, 86, 99 }, { 56, 69, 81, 94 }, { 53, 65, 77, 89 }, { 51, 62, 73, 85 }, { 48, 59, 69, 80 }, { 46, 56, 66, 76 }, { 43, 53, 63, 72 }, { 41, 50, 59, 69 }, { 39, 48, 56, 65 }, { 37, 45, 54, 62 }, { 35, 43, 51, 59 }, { 33, 41, 48, 56 }, { 32, 39, 46, 53 }, { 30, 37, 43, 50 }, { 29, 35, 41, 48 }, { 27, 33, 39, 45 }, { 26, 31, 37, 43 }, { 24, 30, 35, 41 }, { 23, 28, 33, 39 }, { 22, 27, 32, 37 }, { 21, 26, 30, 35 }, { 20, 24, 29, 33 }, { 19, 23, 27, 31 }, { 18, 22, 26, 30 }, { 17, 21, 25, 28 }, { 16, 20, 23, 27 }, { 15, 19, 22, 25 }, { 14, 18, 21, 24 }, { 14, 17, 20, 23 }, { 13, 16, 19, 22 }, { 12, 15, 18, 21 }, { 12, 14, 17, 20 }, { 11, 14, 16, 19 }, { 11, 13, 15, 18 }, { 10, 12, 15, 17 }, { 10, 12, 14, 16 }, { 9, 11, 13, 15 }, { 9, 11, 12, 14 }, { 8, 10, 12, 14 }, { 8, 9, 11, 13 }, { 7, 9, 11, 12 }, { 7, 9, 10, 12 }, { 7, 8, 10, 11 }, { 6, 8, 9, 11 }, { 6, 7, 9, 10 }, { 6, 7, 8, 9 }, { 2, 2, 2, 2 } }; /* CABAC trans tables: state (MPS and LPS ) + valMPS in 6th bit */ const mfxU8 tab_cabacTransTbl[2][128] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 0, 64, 65, 66, 66, 68, 68, 69, 70, 71, 72, 73, 73, 75, 75, 76, 77, 77, 79, 79, 80, 80, 82, 82, 83, 83, 85, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 94, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 99, 100, 100, 100, 101, 101, 101, 102, 102, 127 }, { 0, 0, 1, 2, 2, 4, 4, 5, 6, 7, 8, 9, 9, 11, 11, 12, 13, 13, 15, 15, 16, 16, 18, 18, 19, 19, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 30, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127 } }; const CABACContextTable CABACContext::InitVal[3] = { { { 154 }, /*CU_TRANSQUANT_BYPASS_FLAG*/ { 139, 141, 157 }, /*SPLIT_CODING_UNIT_FLAG*/ { 154, 154, 154 }, /*SKIP_FLAG*/ { 154 }, /*MERGE_IDX*/ { 63 } /*END_OF_SLICE_FLAG*/ }, { { 154 }, /*CU_TRANSQUANT_BYPASS_FLAG*/ { 107, 139, 126 }, /*SPLIT_CODING_UNIT_FLAG*/ { 197, 185, 201 }, /*SKIP_FLAG*/ { 122 }, /*MERGE_IDX*/ { 63 } /*END_OF_SLICE_FLAG*/ }, { { 154 }, /*CU_TRANSQUANT_BYPASS_FLAG*/ { 107, 139, 126 }, /*SPLIT_CODING_UNIT_FLAG*/ { 197, 185, 201 }, /*SKIP_FLAG*/ { 137 }, /*MERGE_IDX*/ { 63 } /*END_OF_SLICE_FLAG*/ } }; void CABACContext::Init(const PPS& pps, const Slice& sh) { mfxU8* pState = (mfxU8*)&((CABACContextTable&)*this); mfxU8* pStateEnd = pState + sizeof(CABACContextTable); mfxI32 SliceQpY = mfx::clamp(26 + pps.init_qp_minus26 + sh.slice_qp_delta, 0, 51); mfxU32 initType = (sh.type == 1) * (sh.cabac_init_flag + 1) + (sh.type != 2 && sh.type != 1) * (2 - sh.cabac_init_flag); const mfxU8* pInitVal = (const mfxU8*)&InitVal[initType]; while (pState != pStateEnd) { mfxI32 preCtxState = mfx::clamp(((((pInitVal[0] >> 4) * 5 - 45) * SliceQpY) >> 4) + ((pInitVal[0] & 15) << 3) - 16, 1, 126); *pState = mfxU8( (preCtxState <= 63) * ((63 - preCtxState) << 1) + (preCtxState > 63) * (((preCtxState - 64) << 1) | 1)); ++pState; ++pInitVal; } END_OF_SLICE_FLAG[0] = (63 << 1); } BitstreamWriter::BitstreamWriter(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) : m_bsStart(bs) , m_bsEnd(bs + size) , m_bs(bs) , m_bitStart(bitOffset & 7) , m_bitOffset(bitOffset & 7) , m_codILow(0)// cabac variables , m_codIRange(510) , m_bitsOutstanding(0) , m_BinCountsInNALunits(0) , m_firstBitFlag(true) { assert(bitOffset < 8); *m_bs &= 0xFF << (8 - m_bitOffset); } BitstreamWriter::~BitstreamWriter() { } void BitstreamWriter::Reset(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) { if (bs) { m_bsStart = bs; m_bsEnd = bs + size; m_bs = bs; m_bitOffset = (bitOffset & 7); m_bitStart = (bitOffset & 7); } else { m_bs = m_bsStart; m_bitOffset = m_bitStart; } } void BitstreamWriter::PutBitsBuffer(mfxU32 n, void* bb, mfxU32 o) { mfxU8* b = (mfxU8*)bb; mfxU32 N, B; assert(bb); auto SkipOffsetBytes = [&]() { N = o / 8; b += N; o &= 7; return o; }; auto PutBitsAfterOffsetOnes = [&]() { N = (n < (8 - o)) * n; PutBits(8 - o, ((b[0] & (0xff >> o)) >> N)); n -= (N + !N * (8 - o)); ++b; return n; }; auto PutBytesAligned = [&]() { N = n / 8; n &= 7; assert(std::ptrdiff_t(N + !!n) < std::ptrdiff_t(m_bsEnd - m_bs)); std::copy(b, b + N, m_bs); m_bs += N; return !n; }; auto PutLastByteBitsAligned = [&]() { m_bs[0] = b[N]; m_bs[0] &= (0xff << (8 - n)); m_bitOffset = (mfxU8)n; return true; }; auto CopyAlignedToUnaligned = [&]() { assert(std::ptrdiff_t(n + 7 - m_bitOffset) / 8 < std::ptrdiff_t(m_bsEnd - m_bs)); while (n >= 24) { B = ((((mfxU32)b[0] << 24) | ((mfxU32)b[1] << 16) | ((mfxU32)b[2] << 8)) >> m_bitOffset); m_bs[0] |= (mfxU8)(B >> 24); m_bs[1] = (mfxU8)(B >> 16); m_bs[2] = (mfxU8)(B >> 8); m_bs[3] = (mfxU8)B; m_bs += 3; b += 3; n -= 24; } while (n >= 8) { B = ((mfxU32)b[0] << 8) >> m_bitOffset; m_bs[0] |= (mfxU8)(B >> 8); m_bs[1] = (mfxU8)B; m_bs++; b++; n -= 8; } if (n) PutBits(n, (b[0] >> (8 - n))); return true; }; auto CopyUnalignedPartToAny = [&]() { return o && SkipOffsetBytes() && PutBitsAfterOffsetOnes(); }; auto CopyAlignedToAligned = [&]() { return !m_bitOffset && (PutBytesAligned() || PutLastByteBitsAligned()); }; bool bDone = CopyUnalignedPartToAny() || CopyAlignedToAligned() || CopyAlignedToUnaligned(); ThrowAssert(!bDone, "BitstreamWriter::PutBitsBuffer failed"); } void BitstreamWriter::PutBits(mfxU32 n, mfxU32 b) { assert(n <= sizeof(b) * 8); while (n > 24) { n -= 16; PutBits(16, (b >> n)); } b <<= (32 - n); if (!m_bitOffset) { m_bs[0] = (mfxU8)(b >> 24); m_bs[1] = (mfxU8)(b >> 16); } else { b >>= m_bitOffset; n += m_bitOffset; m_bs[0] |= (mfxU8)(b >> 24); m_bs[1] = (mfxU8)(b >> 16); } if (n > 16) { m_bs[2] = (mfxU8)(b >> 8); m_bs[3] = (mfxU8)b; } m_bs += (n >> 3); m_bitOffset = (n & 7); } void BitstreamWriter::PutBit(mfxU32 b) { switch(m_bitOffset) { case 0: m_bs[0] = (mfxU8)(b << 7); m_bitOffset = 1; break; case 7: m_bs[0] |= (mfxU8)(b & 1); m_bs ++; m_bitOffset = 0; break; default: if (b & 1) m_bs[0] |= (mfxU8)(1 << (7 - m_bitOffset)); m_bitOffset ++; break; } } void BitstreamWriter::PutGolomb(mfxU32 b) { if (!b) { PutBit(1); } else { mfxU32 n = 1; b ++; while (b >> n) n ++; PutBits(n - 1, 0); PutBits(n, b); } } void BitstreamWriter::PutTrailingBits(bool bCheckAligened) { if ((!bCheckAligened) || m_bitOffset) PutBit(1); if (m_bitOffset) { *(++m_bs) = 0; m_bitOffset = 0; } } void BitstreamWriter::PutBitC(mfxU32 B) { if (m_firstBitFlag) m_firstBitFlag = false; else PutBit(B); while (m_bitsOutstanding > 0) { PutBit(1 - B); m_bitsOutstanding--; } } void BitstreamWriter::RenormE() { while (m_codIRange < 256) { if (m_codILow < 256) { PutBitC(0); } else if (m_codILow >= 512) { m_codILow -= 512; PutBitC(1); } else { m_codILow -= 256; m_bitsOutstanding++; } m_codIRange <<= 1; m_codILow <<= 1; } } void BitstreamWriter::EncodeBin(mfxU8& ctx, mfxU8 binVal) { mfxU8 pStateIdx = (ctx >> 1); mfxU8 valMPS = (ctx & 1); mfxU32 qCodIRangeIdx = (m_codIRange >> 6) & 3; mfxU32 codIRangeLPS = tab_cabacRangeTabLps[pStateIdx][qCodIRangeIdx]; m_codIRange -= codIRangeLPS; if (binVal != valMPS) { m_codILow += m_codIRange; m_codIRange = codIRangeLPS; if (pStateIdx == 0) valMPS = 1 - valMPS; pStateIdx = tab_cabacTransTbl[1][pStateIdx];//transIdxLPS[pStateIdx]; } else { pStateIdx = tab_cabacTransTbl[0][pStateIdx];//transIdxMPS[pStateIdx]; } ctx = (pStateIdx << 1) | valMPS; RenormE(); m_BinCountsInNALunits++; } void BitstreamWriter::EncodeBinEP(mfxU8 binVal) { m_codILow += m_codILow + m_codIRange * (binVal == 1); RenormE(); m_BinCountsInNALunits++; } void BitstreamWriter::SliceFinish() { m_codIRange -= 2; m_codILow += m_codIRange; m_codIRange = 2; RenormE(); PutBitC((m_codILow >> 9) & 1); PutBit(m_codILow >> 8); PutTrailingBits(); m_BinCountsInNALunits++; } void BitstreamWriter::cabacInit() { m_codILow = 0; m_codIRange = 510; m_bitsOutstanding = 0; m_BinCountsInNALunits = 0; m_firstBitFlag = true; } void Packer::PackNALU(BitstreamWriter& bs, NALU const & h) { bool bLongSC = h.nal_unit_type == VPS_NUT || h.nal_unit_type == SPS_NUT || h.nal_unit_type == PPS_NUT || h.nal_unit_type == AUD_NUT || h.nal_unit_type == PREFIX_SEI_NUT || h.long_start_code; if (bLongSC) bs.PutBits(8, 0); //zero_byte bs.PutBits( 24, 0x000001);//start_code bs.PutBit(0); bs.PutBits(6, h.nal_unit_type); bs.PutBits(6, h.nuh_layer_id); bs.PutBits(3, h.nuh_temporal_id_plus1); } void Packer::PackPTL(BitstreamWriter& bs, LayersInfo const & profile_tier_level, mfxU16 max_sub_layers_minus1) { bs.PutBits(2, profile_tier_level.general.profile_space); bs.PutBit(profile_tier_level.general.tier_flag); bs.PutBits(5, profile_tier_level.general.profile_idc); bs.PutBits(24,(profile_tier_level.general.profile_compatibility_flags >> 8)); bs.PutBits(8 ,(profile_tier_level.general.profile_compatibility_flags & 0xFF)); bs.PutBit(profile_tier_level.general.progressive_source_flag); bs.PutBit(profile_tier_level.general.interlaced_source_flag); bs.PutBit(profile_tier_level.general.non_packed_constraint_flag); bs.PutBit(profile_tier_level.general.frame_only_constraint_flag); bs.PutBit(profile_tier_level.general.constraint.max_12bit ); bs.PutBit(profile_tier_level.general.constraint.max_10bit ); bs.PutBit(profile_tier_level.general.constraint.max_8bit ); bs.PutBit(profile_tier_level.general.constraint.max_422chroma ); bs.PutBit(profile_tier_level.general.constraint.max_420chroma ); bs.PutBit(profile_tier_level.general.constraint.max_monochrome ); bs.PutBit(profile_tier_level.general.constraint.intra ); bs.PutBit(profile_tier_level.general.constraint.one_picture_only); bs.PutBit(profile_tier_level.general.constraint.lower_bit_rate ); bs.PutBits(23, 0); bs.PutBits(11, 0); bs.PutBit(profile_tier_level.general.inbld_flag); bs.PutBits(8, profile_tier_level.general.level_idc); std::for_each(profile_tier_level.sub_layer, profile_tier_level.sub_layer + max_sub_layers_minus1 , [&](const LayersInfo::SubLayer& sl) { bs.PutBit(sl.profile_present_flag); bs.PutBit(sl.level_present_flag); }); if (max_sub_layers_minus1 > 0) bs.PutBits(2 * (8 - max_sub_layers_minus1), 0); // reserved_zero_2bits[ i ] std::for_each(profile_tier_level.sub_layer, profile_tier_level.sub_layer + max_sub_layers_minus1 , [&](const LayersInfo::SubLayer& sl) { if (sl.profile_present_flag) { bs.PutBits(2, sl.profile_space); bs.PutBit(sl.tier_flag); bs.PutBits(5, sl.profile_idc); bs.PutBits(24, (sl.profile_compatibility_flags >> 8)); bs.PutBits(8, (sl.profile_compatibility_flags & 0xFF)); bs.PutBit(sl.progressive_source_flag); bs.PutBit(sl.interlaced_source_flag); bs.PutBit(sl.non_packed_constraint_flag); bs.PutBit(sl.frame_only_constraint_flag); bs.PutBit(profile_tier_level.general.constraint.max_12bit); bs.PutBit(profile_tier_level.general.constraint.max_10bit); bs.PutBit(profile_tier_level.general.constraint.max_8bit); bs.PutBit(profile_tier_level.general.constraint.max_422chroma); bs.PutBit(profile_tier_level.general.constraint.max_420chroma); bs.PutBit(profile_tier_level.general.constraint.max_monochrome); bs.PutBit(profile_tier_level.general.constraint.intra); bs.PutBit(profile_tier_level.general.constraint.one_picture_only); bs.PutBit(profile_tier_level.general.constraint.lower_bit_rate); bs.PutBits(23, 0); bs.PutBits(11, 0); bs.PutBit(sl.inbld_flag); } if (sl.level_present_flag) bs.PutBits(8, sl.level_idc); }); } void Packer::PackSLO(BitstreamWriter& bs, LayersInfo const & slo, mfxU16 max_sub_layers_minus1) { bs.PutBit(slo.sub_layer_ordering_info_present_flag); std::for_each( slo.sub_layer + (max_sub_layers_minus1 * !slo.sub_layer_ordering_info_present_flag) , slo.sub_layer + max_sub_layers_minus1 + 1 , [&](const LayersInfo::SubLayer& sl) { bs.PutUE(sl.max_dec_pic_buffering_minus1); bs.PutUE(sl.max_num_reorder_pics); bs.PutUE(sl.max_latency_increase_plus1); }); } void Packer::PackAUD(BitstreamWriter& bs, mfxU8 pic_type) { NALU nalu = {0, AUD_NUT, 0, 1}; PackNALU(bs, nalu); bs.PutBits(3, pic_type); bs.PutTrailingBits(); } void Packer::PackVPS(BitstreamWriter& bs, VPS const & vps) { NALU nalu = {0, VPS_NUT, 0, 1}; PackNALU(bs, nalu); bs.PutBits(4, vps.video_parameter_set_id); bs.PutBits(2, 3); bs.PutBits(6, vps.max_layers_minus1); bs.PutBits(3, vps.max_sub_layers_minus1); bs.PutBit(vps.temporal_id_nesting_flag); bs.PutBits(16, 0xFFFF); PackPTL(bs, vps, vps.max_sub_layers_minus1); PackSLO(bs, vps, vps.max_sub_layers_minus1); bs.PutBits(6, vps.max_layer_id); bs.PutUE(vps.num_layer_sets_minus1); assert(0 == vps.num_layer_sets_minus1); bs.PutBit(vps.timing_info_present_flag); if (vps.timing_info_present_flag) { bs.PutBits(32, vps.num_units_in_tick); bs.PutBits(32, vps.time_scale); bs.PutBit(vps.poc_proportional_to_timing_flag); if (vps.poc_proportional_to_timing_flag) bs.PutUE(vps.num_ticks_poc_diff_one_minus1); bs.PutUE(vps.num_hrd_parameters); assert(0 == vps.num_hrd_parameters); } bs.PutBit(0); //vps.extension_flag bs.PutTrailingBits(); } void Packer::PackHRD( BitstreamWriter& bs, HRDInfo const & hrd, bool commonInfPresentFlag, mfxU16 maxNumSubLayersMinus1) { mfxU32 nSE = 0; auto PackSubLayer = [&](const HRDInfo::SubLayer& sl) { nSE += PutBit(bs, sl.fixed_pic_rate_general_flag); nSE += !sl.fixed_pic_rate_general_flag && PutBit(bs, sl.fixed_pic_rate_within_cvs_flag); bool bFixedPicRate = sl.fixed_pic_rate_within_cvs_flag || sl.fixed_pic_rate_general_flag; nSE += bFixedPicRate && PutUE(bs, sl.elemental_duration_in_tc_minus1); nSE += !bFixedPicRate && PutBit(bs, sl.low_delay_hrd_flag); nSE += !sl.low_delay_hrd_flag && PutUE(bs, sl.cpb_cnt_minus1); std::for_each( sl.cpb , sl.cpb + ((sl.cpb_cnt_minus1 + 1) * hrd.nal_hrd_parameters_present_flag) , [&](const HRDInfo::SubLayer::CPB& cpb) { nSE += PutUE(bs, cpb.bit_rate_value_minus1); nSE += PutUE(bs, cpb.cpb_size_value_minus1); nSE += hrd.sub_pic_hrd_params_present_flag && PutUE(bs, cpb.cpb_size_du_value_minus1); nSE += hrd.sub_pic_hrd_params_present_flag && PutUE(bs, cpb.bit_rate_du_value_minus1); nSE += PutBit(bs, cpb.cbr_flag); }); assert(hrd.vcl_hrd_parameters_present_flag == 0); }; if (commonInfPresentFlag) { nSE += PutBit(bs, hrd.nal_hrd_parameters_present_flag); nSE += PutBit(bs, hrd.vcl_hrd_parameters_present_flag); bool bNalVclHrdPresent = hrd.nal_hrd_parameters_present_flag || hrd.vcl_hrd_parameters_present_flag; if (bNalVclHrdPresent) { nSE += PutBit(bs, hrd.sub_pic_hrd_params_present_flag); if (hrd.sub_pic_hrd_params_present_flag) { nSE += PutBits(bs, 8, hrd.tick_divisor_minus2); nSE += PutBits(bs, 5, hrd.du_cpb_removal_delay_increment_length_minus1); nSE += PutBit(bs, hrd.sub_pic_cpb_params_in_pic_timing_sei_flag); nSE += PutBits(bs, 5, hrd.dpb_output_delay_du_length_minus1); } nSE += PutBits(bs, 4, hrd.bit_rate_scale); nSE += PutBits(bs, 4, hrd.cpb_size_scale); nSE += hrd.sub_pic_hrd_params_present_flag && PutBits(bs, 4, hrd.cpb_size_du_scale); nSE += PutBits(bs, 5, hrd.initial_cpb_removal_delay_length_minus1); nSE += PutBits(bs, 5, hrd.au_cpb_removal_delay_length_minus1); nSE += PutBits(bs, 5, hrd.dpb_output_delay_length_minus1); } } std::for_each(hrd.sl, hrd.sl + maxNumSubLayersMinus1 + 1, PackSubLayer); } void Packer::PackVUI(BitstreamWriter& bs, VUI const & vui, mfxU16 max_sub_layers_minus1) { mfxU32 nSE = 0; bool bPackSARWH = vui.aspect_ratio_info_present_flag && vui.aspect_ratio_idc == 255; nSE += PutBit(bs, vui.aspect_ratio_info_present_flag); nSE += vui.aspect_ratio_info_present_flag && PutBits(bs, 8, vui.aspect_ratio_idc); nSE += bPackSARWH && PutBits(bs, 16, vui.sar_width); nSE += bPackSARWH && PutBits(bs, 16, vui.sar_height); nSE += PutBit(bs, vui.overscan_info_present_flag); nSE += vui.overscan_info_present_flag && PutBit(bs, vui.overscan_appropriate_flag); nSE += PutBit(bs, vui.video_signal_type_present_flag); if (vui.video_signal_type_present_flag) { nSE += PutBits(bs, 3, vui.video_format); nSE += PutBit(bs, vui.video_full_range_flag); nSE += PutBit(bs, vui.colour_description_present_flag); if (vui.colour_description_present_flag) { nSE += PutBits(bs, 8, vui.colour_primaries); nSE += PutBits(bs, 8, vui.transfer_characteristics); nSE += PutBits(bs, 8, vui.matrix_coeffs); } } nSE += PutBit(bs, vui.chroma_loc_info_present_flag); nSE += vui.chroma_loc_info_present_flag && PutUE(bs, vui.chroma_sample_loc_type_top_field); nSE += vui.chroma_loc_info_present_flag && PutUE(bs, vui.chroma_sample_loc_type_bottom_field); nSE += PutBit(bs, vui.neutral_chroma_indication_flag ); nSE += PutBit(bs, vui.field_seq_flag ); nSE += PutBit(bs, vui.frame_field_info_present_flag ); nSE += PutBit(bs, vui.default_display_window_flag ); if (vui.default_display_window_flag) { nSE += PutUE(bs, vui.def_disp_win_left_offset ); nSE += PutUE(bs, vui.def_disp_win_right_offset ); nSE += PutUE(bs, vui.def_disp_win_top_offset ); nSE += PutUE(bs, vui.def_disp_win_bottom_offset ); } nSE += PutBit(bs, vui.timing_info_present_flag); if (vui.timing_info_present_flag) { nSE += PutBits(bs, 32, vui.num_units_in_tick ); nSE += PutBits(bs, 32, vui.time_scale ); nSE += PutBit(bs, vui.poc_proportional_to_timing_flag); nSE += vui.poc_proportional_to_timing_flag && PutUE(bs, vui.num_ticks_poc_diff_one_minus1); nSE += PutBit(bs, vui.hrd_parameters_present_flag); if (vui.hrd_parameters_present_flag) PackHRD(bs, vui.hrd, 1, max_sub_layers_minus1); } nSE += PutBit(bs, vui.bitstream_restriction_flag); if (vui.bitstream_restriction_flag) { nSE += PutBit(bs, vui.tiles_fixed_structure_flag ); nSE += PutBit(bs, vui.motion_vectors_over_pic_boundaries_flag ); nSE += PutBit(bs, vui.restricted_ref_pic_lists_flag ); nSE += PutUE(bs, vui.min_spatial_segmentation_idc ); nSE += PutUE(bs, vui.max_bytes_per_pic_denom ); nSE += PutUE(bs, vui.max_bits_per_min_cu_denom ); nSE += PutUE(bs, vui.log2_max_mv_length_horizontal ); nSE += PutUE(bs, vui.log2_max_mv_length_vertical ); } assert(nSE >= 10); } void PackSTRPS(BitstreamWriter& bs, const STRPS* sets, mfxU32 num, mfxU32 idx); void PackExtension(mfxU8 extFlags, std::function Pack) { mfxU8 extId = 0; while (extFlags) { if (extFlags & 0x80) ThrowAssert(!Pack(extId), "extension is not supported"); ++extId; extFlags <<= 1; } } mfxU32 Packer::PackSLD(BitstreamWriter& bs, ScalingList const & scl) { mfxU32 nSE = 0; const mfxU32 matrixIds[] = { 0, 1, 2, 3, 4, 5 }; auto PackDeltaCoef = [&](mfxU32 sizeId, mfxU32 nextCoef, const mfxU8* scalingList, mfxI32 dcCoeff = 0) { mfxU8 scaling_list_pred_mode_flag = 1; // no implementation for reference scaling list(scaling_list_pred_mode_flag = 0). nSE += PutBit(bs, scaling_list_pred_mode_flag); bool bNeedDC = (sizeId > 1); // 16x16 or 32x32 nSE += bNeedDC && PutSE(bs, dcCoeff); mfxU32 coefNum = std::min(64, (1 << (4 + (sizeId << 1)))); nSE += PutSE(bs, int8_t(scalingList[0] - nextCoef)); for (mfxU32 i = 1; i < coefNum; i++) { nSE += PutSE(bs, int8_t(scalingList[i] - scalingList[i - 1])); //here casting to int8_t will perform as x -= 256 if x > 127 and x += 256 if x < -128 } }; auto Pack4x4 = [&](mfxU32 matrixId) { PackDeltaCoef(0, 8, &scl.scalingLists0[matrixId][0]); }; auto Pack8x8 = [&](mfxU32 matrixId) { PackDeltaCoef(1, 8, &scl.scalingLists1[matrixId][0]); }; auto Pack16x16 = [&](mfxU32 matrixId) { auto next = scl.scalingLists2[matrixId][0]; PackDeltaCoef(2, next, &scl.scalingLists2[matrixId][0], next - 8); }; auto Pack32x32 = [&](mfxU32 matrixId) { auto next = scl.scalingLists3[!!matrixId][0]; PackDeltaCoef(3, next, &scl.scalingLists3[!!matrixId][0], next - 8); }; std::for_each(std::begin(matrixIds), std::end(matrixIds), Pack4x4); std::for_each(std::begin(matrixIds), std::end(matrixIds), Pack8x8); std::for_each(std::begin(matrixIds), std::end(matrixIds), Pack16x16); Pack32x32(0); Pack32x32(3); assert(nSE == (6 * (1 + 16) // 4x4 + 6 * (1 + 64) // 8x8 + 6 * (2 + 64) // 16x16 + 2 * (2 + 64))); // 32x32 return nSE; } void Packer::PackSPS(BitstreamWriter& bs, SPS const & sps) { NALU nalu = {0, SPS_NUT, 0, 1}; mfxU32 nSE = 0; mfxU32 nLTR = !!sps.long_term_ref_pics_present_flag * sps.num_long_term_ref_pics_sps; PackNALU(bs, nalu); nSE += PutBits(bs, 4, sps.video_parameter_set_id); nSE += PutBits(bs, 3, sps.max_sub_layers_minus1); nSE += PutBit(bs, sps.temporal_id_nesting_flag); PackPTL(bs, sps, sps.max_sub_layers_minus1); nSE += PutUE(bs, sps.seq_parameter_set_id); nSE += PutUE(bs, sps.chroma_format_idc); nSE += (sps.chroma_format_idc == 3) && PutBit(bs, sps.separate_colour_plane_flag); nSE += PutUE(bs, sps.pic_width_in_luma_samples); nSE += PutUE(bs, sps.pic_height_in_luma_samples); nSE += PutBit(bs, sps.conformance_window_flag); if (sps.conformance_window_flag) { nSE += PutUE(bs, sps.conf_win_left_offset); nSE += PutUE(bs, sps.conf_win_right_offset); nSE += PutUE(bs, sps.conf_win_top_offset); nSE += PutUE(bs, sps.conf_win_bottom_offset); } nSE += PutUE(bs, sps.bit_depth_luma_minus8); nSE += PutUE(bs, sps.bit_depth_chroma_minus8); nSE += PutUE(bs, sps.log2_max_pic_order_cnt_lsb_minus4); PackSLO(bs, sps, sps.max_sub_layers_minus1); nSE += PutUE(bs, sps.log2_min_luma_coding_block_size_minus3); nSE += PutUE(bs, sps.log2_diff_max_min_luma_coding_block_size); nSE += PutUE(bs, sps.log2_min_transform_block_size_minus2); nSE += PutUE(bs, sps.log2_diff_max_min_transform_block_size); nSE += PutUE(bs, sps.max_transform_hierarchy_depth_inter); nSE += PutUE(bs, sps.max_transform_hierarchy_depth_intra); nSE += PutBit(bs, sps.scaling_list_enabled_flag); if (sps.scaling_list_enabled_flag) { nSE += PutBit(bs, sps.scaling_list_data_present_flag); nSE += sps.scaling_list_data_present_flag && PackSLD(bs, sps.scl); } nSE += PutBit(bs, sps.amp_enabled_flag); nSE += PutBit(bs, sps.sample_adaptive_offset_enabled_flag); nSE += PutBit(bs, sps.pcm_enabled_flag); if (sps.pcm_enabled_flag) { nSE += PutBits(bs, 4, sps.pcm_sample_bit_depth_luma_minus1); nSE += PutBits(bs, 4, sps.pcm_sample_bit_depth_chroma_minus1); nSE += PutUE(bs, sps.log2_min_pcm_luma_coding_block_size_minus3); nSE += PutUE(bs, sps.log2_diff_max_min_pcm_luma_coding_block_size); nSE += PutBit(bs, sps.pcm_loop_filter_disabled_flag); } nSE += PutUE(bs, sps.num_short_term_ref_pic_sets); for (mfxU32 i = 0; i < sps.num_short_term_ref_pic_sets; i++) PackSTRPS(bs, sps.strps, sps.num_short_term_ref_pic_sets, i); nSE += PutBit(bs, sps.long_term_ref_pics_present_flag); nSE += sps.long_term_ref_pics_present_flag && PutUE(bs, sps.num_long_term_ref_pics_sps); for (mfxU32 i = 0; i < nLTR; ++i) { nSE += PutBits(bs, sps.log2_max_pic_order_cnt_lsb_minus4 + 4, sps.lt_ref_pic_poc_lsb_sps[i] ); nSE += PutBit(bs, sps.used_by_curr_pic_lt_sps_flag[i] ); } nSE += PutBit(bs, sps.temporal_mvp_enabled_flag); nSE += PutBit(bs, sps.strong_intra_smoothing_enabled_flag); nSE += PutBit(bs, sps.vui_parameters_present_flag); if (sps.vui_parameters_present_flag) PackVUI(bs, sps.vui, sps.max_sub_layers_minus1); nSE += PutBit(bs, sps.extension_flag); nSE += sps.extension_flag && PutBit(bs, sps.range_extension_flag); nSE += sps.extension_flag && PutBits(bs, 7, sps.ExtensionFlags); if (sps.range_extension_flag) { nSE += PutBit(bs, sps.transform_skip_rotation_enabled_flag); nSE += PutBit(bs, sps.transform_skip_context_enabled_flag); nSE += PutBit(bs, sps.implicit_rdpcm_enabled_flag); nSE += PutBit(bs, sps.explicit_rdpcm_enabled_flag); nSE += PutBit(bs, sps.extended_precision_processing_flag); nSE += PutBit(bs, sps.intra_smoothing_disabled_flag); nSE += PutBit(bs, sps.high_precision_offsets_enabled_flag); nSE += PutBit(bs, sps.persistent_rice_adaptation_enabled_flag); nSE += PutBit(bs, sps.cabac_bypass_alignment_enabled_flag); } assert(nSE >= 27); PackExtension(sps.ExtensionFlags & 0x7f , [&](mfxU8 id) { auto& PackSpsExt = Glob::PackSpsExt::Get(*m_pGlob); return PackSpsExt && PackSpsExt(sps, id, bs); }); bs.PutTrailingBits(); } void Packer::PackPPS(BitstreamWriter& bs, PPS const & pps) { NALU nalu = {0, PPS_NUT, 0, 1}; mfxU32 nSE = 0; bool bNeedDblk = pps.deblocking_filter_control_present_flag; bool bNeedDblkOffsets = bNeedDblk && !pps.deblocking_filter_disabled_flag; PackNALU(bs, nalu); nSE += PutUE(bs, pps.pic_parameter_set_id); nSE += PutUE(bs, pps.seq_parameter_set_id); nSE += PutBit(bs, pps.dependent_slice_segments_enabled_flag); nSE += PutBit(bs, pps.output_flag_present_flag); nSE += PutBits(bs, 3, pps.num_extra_slice_header_bits); nSE += PutBit(bs, pps.sign_data_hiding_enabled_flag); nSE += PutBit(bs, pps.cabac_init_present_flag); nSE += PutUE(bs, pps.num_ref_idx_l0_default_active_minus1); nSE += PutUE(bs, pps.num_ref_idx_l1_default_active_minus1); nSE += PutSE(bs, pps.init_qp_minus26); nSE += PutBit(bs, pps.constrained_intra_pred_flag); nSE += PutBit(bs, pps.transform_skip_enabled_flag); nSE += PutBit(bs, pps.cu_qp_delta_enabled_flag); nSE += pps.cu_qp_delta_enabled_flag && PutUE(bs, pps.diff_cu_qp_delta_depth); nSE += PutSE(bs, pps.cb_qp_offset); nSE += PutSE(bs, pps.cr_qp_offset); nSE += PutBit(bs, pps.slice_chroma_qp_offsets_present_flag); nSE += PutBit(bs, pps.weighted_pred_flag); nSE += PutBit(bs, pps.weighted_bipred_flag); nSE += PutBit(bs, pps.transquant_bypass_enabled_flag); nSE += PutBit(bs, pps.tiles_enabled_flag); nSE += PutBit(bs, pps.entropy_coding_sync_enabled_flag); if (pps.tiles_enabled_flag) { auto cwEnd = pps.column_width + pps.num_tile_columns_minus1 * !pps.uniform_spacing_flag; auto rhEnd = pps.row_height + pps.num_tile_rows_minus1 * !pps.uniform_spacing_flag; auto PutTileDim = [&](mfxU16 x) { return PutUE(bs, std::max(x, 1) - 1); }; nSE += PutUE(bs, pps.num_tile_columns_minus1); nSE += PutUE(bs, pps.num_tile_rows_minus1); nSE += PutBit(bs, pps.uniform_spacing_flag); nSE += mfxU32(std::count_if(pps.column_width, cwEnd, PutTileDim)); nSE += mfxU32(std::count_if(pps.row_height, rhEnd, PutTileDim)); nSE += PutBit(bs, pps.loop_filter_across_tiles_enabled_flag); } nSE += PutBit(bs, pps.loop_filter_across_slices_enabled_flag); nSE += PutBit(bs, pps.deblocking_filter_control_present_flag); nSE += bNeedDblk && PutBit(bs, pps.deblocking_filter_override_enabled_flag); nSE += bNeedDblk && PutBit(bs, pps.deblocking_filter_disabled_flag); nSE += bNeedDblkOffsets && PutSE(bs, pps.beta_offset_div2); nSE += bNeedDblkOffsets && PutSE(bs, pps.tc_offset_div2); nSE += PutBit(bs, pps.scaling_list_data_present_flag); nSE += pps.scaling_list_data_present_flag && PackSLD(bs, pps.sld); nSE += PutBit(bs, pps.lists_modification_present_flag); nSE += PutUE(bs, pps.log2_parallel_merge_level_minus2); nSE += PutBit(bs, pps.slice_segment_header_extension_present_flag); nSE += PutBit(bs, pps.extension_flag); nSE += pps.extension_flag && PutBit(bs, pps.range_extension_flag); nSE += pps.extension_flag && PutBits(bs, 7, pps.ExtensionFlags); if (pps.range_extension_flag) { mfxU32 nQpOffsets = pps.chroma_qp_offset_list_enabled_flag * (pps.chroma_qp_offset_list_len_minus1 + 1); nSE += pps.transform_skip_enabled_flag && PutUE(bs, pps.log2_max_transform_skip_block_size_minus2); nSE += PutBit(bs, pps.cross_component_prediction_enabled_flag); nSE += PutBit(bs, pps.chroma_qp_offset_list_enabled_flag); nSE += pps.chroma_qp_offset_list_enabled_flag && PutUE(bs, pps.diff_cu_chroma_qp_offset_depth); nSE += pps.chroma_qp_offset_list_enabled_flag && PutUE(bs, pps.chroma_qp_offset_list_len_minus1); for (mfxU32 i = 0; i < nQpOffsets; i++) { nSE += PutSE(bs, pps.cb_qp_offset_list[i]); nSE += PutSE(bs, pps.cr_qp_offset_list[i]); } nSE += PutUE(bs, pps.log2_sao_offset_scale_luma); nSE += PutUE(bs, pps.log2_sao_offset_scale_chroma); } PackExtension(pps.ExtensionFlags & 0x7f , [&](mfxU8 id) { auto& PackPpsExt = Glob::PackPpsExt::Get(*m_pGlob); return PackPpsExt && PackPpsExt(pps, id, bs); }); bs.PutTrailingBits(); assert(nSE >= 28); } void Packer::PackSSHPartIdAddr( BitstreamWriter& bs, NALU const & nalu, SPS const & sps, PPS const & pps, Slice const & slice) { mfxU32 MaxCU = (1<<(sps.log2_min_luma_coding_block_size_minus3 + 3 + sps.log2_diff_max_min_luma_coding_block_size)); mfxU32 PicSizeInCtbsY = mfx::CeilDiv(sps.pic_width_in_luma_samples, MaxCU) * mfx::CeilDiv(sps.pic_height_in_luma_samples, MaxCU); bs.PutBit(slice.first_slice_segment_in_pic_flag); bool bIRAP = nalu.nal_unit_type >= BLA_W_LP && nalu.nal_unit_type <= RSV_IRAP_VCL23; if (bIRAP) bs.PutBit(slice.no_output_of_prior_pics_flag); bs.PutUE(slice.pic_parameter_set_id); if (!slice.first_slice_segment_in_pic_flag) { if (pps.dependent_slice_segments_enabled_flag) bs.PutBit(slice.dependent_slice_segment_flag); bs.PutBits(mfx::CeilLog2(PicSizeInCtbsY), slice.segment_address); } } void Packer::PackSSHPartNonIDR( BitstreamWriter& bs, SPS const & sps, Slice const & slice) { mfxU32 nSE = 0; bool bNeedStIdx = slice.short_term_ref_pic_set_sps_flag && (sps.num_short_term_ref_pic_sets > 1); auto PutSpsLT = [&](const Slice::LongTerm& lt) { nSE += (sps.num_long_term_ref_pics_sps > 1) && PutBits(bs, mfx::CeilLog2(sps.num_long_term_ref_pics_sps), lt.lt_idx_sps); nSE += PutBit(bs, lt.delta_poc_msb_present_flag); nSE += lt.delta_poc_msb_present_flag && PutUE(bs, lt.delta_poc_msb_cycle_lt); }; auto PutSliceLT = [&](const Slice::LongTerm& lt) { nSE += PutBits(bs, sps.log2_max_pic_order_cnt_lsb_minus4 + 4, lt.poc_lsb_lt); nSE += PutBit(bs, lt.used_by_curr_pic_lt_flag); nSE += PutBit(bs, lt.delta_poc_msb_present_flag); nSE += lt.delta_poc_msb_present_flag && PutUE(bs, lt.delta_poc_msb_cycle_lt); }; nSE += PutBits(bs, sps.log2_max_pic_order_cnt_lsb_minus4 + 4, slice.pic_order_cnt_lsb); nSE += PutBit(bs, slice.short_term_ref_pic_set_sps_flag); if (!slice.short_term_ref_pic_set_sps_flag) { std::vector strps(sps.strps, sps.strps + sps.num_short_term_ref_pic_sets); strps.push_back(slice.strps); PackSTRPS(bs, strps.data(), sps.num_short_term_ref_pic_sets, sps.num_short_term_ref_pic_sets); } nSE += bNeedStIdx && PutBits(bs, mfx::CeilLog2(sps.num_short_term_ref_pic_sets), slice.short_term_ref_pic_set_idx); if (sps.long_term_ref_pics_present_flag) { nSE += (sps.num_long_term_ref_pics_sps > 0) && PutUE(bs, slice.num_long_term_sps); nSE += PutUE(bs, slice.num_long_term_pics); std::for_each(slice.lt, slice.lt + slice.num_long_term_sps, PutSpsLT); std::for_each(slice.lt, slice.lt + slice.num_long_term_pics, PutSliceLT); } nSE += sps.temporal_mvp_enabled_flag && PutBit(bs, slice.temporal_mvp_enabled_flag); assert(nSE >= 2); } bool Packer::PackSSHPWT( BitstreamWriter& bs , const SPS& sps , const PPS& pps , const Slice& slice) { constexpr mfxU16 Y = 0, Cb = 1, Cr = 2, W = 0, O = 1, P = 1, B = 0; struct AccWFlag : std::pair { AccWFlag(mfxU16 idx, mfxI16 w) : std::pair(idx, w){} mfxU16 operator()(mfxU16 wf, const mfxI16(&pwt)[3][2]) { return (wf << 1) + !(pwt[first][O] == 0 && pwt[first][W] == second); }; }; bool bNeedY = (pps.weighted_pred_flag && slice.type == P) || (pps.weighted_bipred_flag && slice.type == B); bool bNeedC = bNeedY && (sps.chroma_format_idc != 0); mfxI16 BdOffsetC = sps.high_precision_offsets_enabled_flag * (sps.bit_depth_chroma_minus8 + 8 - 1) + !sps.high_precision_offsets_enabled_flag * 7; mfxU32 nSE = 0; mfxI16 WpOffC = (1 << BdOffsetC); mfxI16 wY = (1 << slice.luma_log2_weight_denom); mfxI16 wC = (1 << slice.chroma_log2_weight_denom); mfxI16 l2WDc = slice.chroma_log2_weight_denom; auto startOffset = bs.GetOffset(); auto PutPwtLX = [&](const mfxI16(&pwtLX)[16][3][2], mfxU32 sz) { mfxU32 szY = sz * bNeedY; mfxU32 szC = sz * bNeedC; mfxU16 wfmap = (1 << (szY - 1)); mfxU16 lumaw = 0; mfxU16 chromaw = 0; auto PutWOVal = [&](const mfxI16(&pwt)[3][2]) { bool bPutY = !!(lumaw & wfmap); bool bPutC = !!(chromaw & wfmap); nSE += bPutY && PutSE(bs, pwt[Y][W] - wY); nSE += bPutY && PutSE(bs, pwt[Y][O]); nSE += bPutC && PutSE(bs, pwt[Cb][W] - wC); nSE += bPutC && PutSE(bs, mfx::clamp(((WpOffC * pwt[Cb][W]) >> l2WDc) + pwt[Cb][O] - WpOffC, -4 * WpOffC, 4 * WpOffC - 1)); nSE += bPutC && PutSE(bs, pwt[Cb][W] - wC); nSE += bPutC && PutSE(bs, mfx::clamp(((WpOffC * pwt[Cr][W]) >> l2WDc) + pwt[Cr][O] - WpOffC, -4 * WpOffC, 4 * WpOffC - 1)); wfmap >>= 1; }; lumaw = std::accumulate(pwtLX, pwtLX + szY, mfxU16(0), AccWFlag(Y, wY)); chromaw = std::accumulate(pwtLX, pwtLX + szC, mfxU16(0), AccWFlag(Cb, wC)); chromaw |= std::accumulate(pwtLX, pwtLX + szC, mfxU16(0), AccWFlag(Cr, wC)); nSE += szY && PutBits(bs, szY, lumaw); nSE += szC && PutBits(bs, szC, chromaw); std::for_each(pwtLX, pwtLX + szY, PutWOVal); }; bs.AddInfo(PACK_PWTOffset, startOffset); nSE += bNeedY && PutUE(bs, slice.luma_log2_weight_denom); nSE += bNeedC && PutSE(bs, mfxI32(slice.chroma_log2_weight_denom) - slice.luma_log2_weight_denom); PutPwtLX(slice.pwt[0], slice.num_ref_idx_l0_active_minus1 + 1); PutPwtLX(slice.pwt[1], (slice.num_ref_idx_l1_active_minus1 + 1) * (slice.type == B)); bs.AddInfo(PACK_PWTLength, bs.GetOffset() - startOffset); return !!nSE; } void Packer::PackSSHPartPB( BitstreamWriter& bs, SPS const & sps, PPS const & pps, Slice const & slice) { auto IsSTUsed = [](const STRPSPic& pic) { return !!pic.used_by_curr_pic_sx_flag; }; auto IsLTUsed = [](const Slice::LongTerm& lt) { return !!lt.used_by_curr_pic_lt_flag; }; bool bB = (slice.type == 0); mfxU32 nSE = 0; auto stEnd = slice.strps.pic + slice.strps.num_negative_pics + slice.strps.num_positive_pics; auto ltEnd = slice.lt + slice.num_long_term_sps + slice.num_long_term_pics; mfxU16 NumPocTotalCurr = mfxU16(std::count_if(slice.strps.pic, stEnd, IsSTUsed) + std::count_if(slice.lt, ltEnd, IsLTUsed)); bool bNeedRPLM0 = pps.lists_modification_present_flag && NumPocTotalCurr > 1; bool bNeedRPLM1 = bNeedRPLM0 && bB; bool bNeedCRefIdx0 = (slice.collocated_from_l0_flag && slice.num_ref_idx_l0_active_minus1 > 0); bool bNeedCRefIdx1 = (!slice.collocated_from_l0_flag && slice.num_ref_idx_l1_active_minus1 > 0); bool bNeedCRefIdx = slice.temporal_mvp_enabled_flag && (bNeedCRefIdx0 || bNeedCRefIdx1); auto PackRPLM = [&](mfxU8 lx, mfxU8 num) { nSE += PutBit(bs, !!slice.ref_pic_list_modification_flag_lx[lx]); num *= !!slice.ref_pic_list_modification_flag_lx[lx]; std::for_each(slice.list_entry_lx[lx], slice.list_entry_lx[lx] + num , [&](mfxU8 entry) { nSE += PutBits(bs, mfx::CeilLog2(NumPocTotalCurr), entry); }); }; nSE += PutBit(bs, slice.num_ref_idx_active_override_flag); nSE += slice.num_ref_idx_active_override_flag && PutUE(bs, slice.num_ref_idx_l0_active_minus1); nSE += slice.num_ref_idx_active_override_flag && bB && PutUE(bs, slice.num_ref_idx_l1_active_minus1); if (bNeedRPLM0) { PackRPLM(0, slice.num_ref_idx_l0_active_minus1 + 1); } if (bNeedRPLM1) { PackRPLM(1, slice.num_ref_idx_l1_active_minus1 + 1); } nSE += bB && PutBit(bs, slice.mvd_l1_zero_flag); nSE += pps.cabac_init_present_flag && PutBit(bs, slice.cabac_init_flag); nSE += slice.temporal_mvp_enabled_flag && bB && PutBit(bs, slice.collocated_from_l0_flag); nSE += bNeedCRefIdx && PutUE(bs, slice.collocated_ref_idx); PackSSHPWT(bs, sps, pps, slice); nSE += PutUE(bs, slice.five_minus_max_num_merge_cand); assert(nSE >= 2); } void Packer::PackSSHPartIndependent( BitstreamWriter& bs, NALU const & nalu, SPS const & sps, PPS const & pps, Slice const & slice) { const mfxU8 I = 2; mfxU32 nSE = 0; nSE += PutBits(bs, pps.num_extra_slice_header_bits, slice.reserved_flags); nSE += PutUE(bs, slice.type); nSE += pps.output_flag_present_flag && PutBit(bs, slice.pic_output_flag); nSE += (sps.separate_colour_plane_flag == 1) && PutBits(bs, 2, slice.colour_plane_id); bool bNonIDR = nalu.nal_unit_type != IDR_W_RADL && nalu.nal_unit_type != IDR_N_LP; if (bNonIDR) PackSSHPartNonIDR(bs, sps, slice); if (sps.sample_adaptive_offset_enabled_flag) { bs.AddInfo(PACK_SAOOffset, bs.GetOffset()); nSE += PutBit(bs, slice.sao_luma_flag); nSE += PutBit(bs, slice.sao_chroma_flag); } if (slice.type != I) PackSSHPartPB(bs, sps, pps, slice); bs.AddInfo(PACK_QPDOffset, bs.GetOffset()); nSE += PutSE(bs, slice.slice_qp_delta); nSE += pps.slice_chroma_qp_offsets_present_flag && PutSE(bs, slice.slice_cb_qp_offset); nSE += pps.slice_chroma_qp_offsets_present_flag && PutSE(bs, slice.slice_cr_qp_offset); nSE += pps.deblocking_filter_override_enabled_flag && PutBit(bs, slice.deblocking_filter_override_flag); nSE += slice.deblocking_filter_override_flag && PutBit(bs, slice.deblocking_filter_disabled_flag); bool bPackDblkOffsets = slice.deblocking_filter_override_flag && !slice.deblocking_filter_disabled_flag; nSE += bPackDblkOffsets && PutSE(bs, slice.beta_offset_div2); nSE += bPackDblkOffsets && PutSE(bs, slice.tc_offset_div2); bool bPackSliceLF = (pps.loop_filter_across_slices_enabled_flag && (slice.sao_luma_flag || slice.sao_chroma_flag || !slice.deblocking_filter_disabled_flag)); nSE += bPackSliceLF && PutBit(bs, slice.loop_filter_across_slices_enabled_flag); assert(nSE >= 2); } void Packer::PackSSH( BitstreamWriter& bs, NALU const & nalu, SPS const & sps, PPS const & pps, Slice const & slice, bool dyn_slice_size) { PackNALU(bs, nalu); if (!dyn_slice_size) PackSSHPartIdAddr(bs, nalu, sps, pps, slice); if (!slice.dependent_slice_segment_flag) PackSSHPartIndependent(bs, nalu, sps, pps, slice); if (pps.tiles_enabled_flag || pps.entropy_coding_sync_enabled_flag) { assert(slice.num_entry_point_offsets == 0); bs.PutUE(slice.num_entry_point_offsets); } assert(0 == pps.slice_segment_header_extension_present_flag); if (!dyn_slice_size) // no trailing bits for dynamic slice size bs.PutTrailingBits(); } void PackSTRPS(BitstreamWriter& bs, const STRPS* sets, mfxU32 num, mfxU32 idx) { STRPS const & strps = sets[idx]; if (idx != 0) bs.PutBit(strps.inter_ref_pic_set_prediction_flag); if (strps.inter_ref_pic_set_prediction_flag) { if(idx == num) bs.PutUE(strps.delta_idx_minus1); bs.PutBit(strps.delta_rps_sign); bs.PutUE(strps.abs_delta_rps_minus1); mfxU32 RefRpsIdx = idx - ( strps.delta_idx_minus1 + 1 ); mfxU32 NumDeltaPocs = sets[RefRpsIdx].num_negative_pics + sets[RefRpsIdx].num_positive_pics; std::for_each( strps.pic , strps.pic + NumDeltaPocs + 1 , [&](const STRPS::Pic& pic) { bs.PutBit(pic.used_by_curr_pic_flag); if (!pic.used_by_curr_pic_flag) bs.PutBit(pic.use_delta_flag); }); } else { bs.PutUE(strps.num_negative_pics); bs.PutUE(strps.num_positive_pics); std::for_each( strps.pic , strps.pic + strps.num_positive_pics + strps.num_negative_pics , [&](const STRPS::Pic& pic) { bs.PutUE(pic.delta_poc_sx_minus1); bs.PutBit(pic.used_by_curr_pic_sx_flag); }); } } void Packer::PackSEIPayload( BitstreamWriter& bs, VUI const & vui, BufferingPeriodSEI const & bp) { HRDInfo const & hrd = vui.hrd; bs.PutUE(bp.seq_parameter_set_id); if (!bp.irap_cpb_params_present_flag) bs.PutBit(bp.irap_cpb_params_present_flag); if (bp.irap_cpb_params_present_flag) { bs.PutBits(hrd.au_cpb_removal_delay_length_minus1+1, bp.cpb_delay_offset); bs.PutBits(hrd.dpb_output_delay_length_minus1+1, bp.dpb_delay_offset); } bs.PutBit(bp.concatenation_flag); bs.PutBits(hrd.au_cpb_removal_delay_length_minus1+1, bp.au_cpb_removal_delay_delta_minus1); mfxU16 CpbCnt = hrd.sl[0].cpb_cnt_minus1; bool bAltCpb = hrd.sub_pic_hrd_params_present_flag || bp.irap_cpb_params_present_flag; auto PackCPB = [&](const BufferingPeriodSEI::CPB& cpb) { bs.PutBits(hrd.initial_cpb_removal_delay_length_minus1 + 1, cpb.initial_cpb_removal_delay); bs.PutBits(hrd.initial_cpb_removal_delay_length_minus1 + 1, cpb.initial_cpb_removal_offset); if (bAltCpb) { bs.PutBits(hrd.initial_cpb_removal_delay_length_minus1 + 1, cpb.initial_alt_cpb_removal_delay); bs.PutBits(hrd.initial_cpb_removal_delay_length_minus1 + 1, cpb.initial_alt_cpb_removal_offset); } }; std::for_each( bp.nal , bp.nal + (CpbCnt + 1) * hrd.nal_hrd_parameters_present_flag , PackCPB); std::for_each( bp.vcl , bp.vcl + (CpbCnt + 1) * hrd.vcl_hrd_parameters_present_flag , PackCPB); bs.PutTrailingBits(true); } void Packer::PackSEIPayload( BitstreamWriter& bs, VUI const & vui, PicTimingSEI const & pt) { HRDInfo const & hrd = vui.hrd; if (vui.frame_field_info_present_flag) { bs.PutBits(4, pt.pic_struct); bs.PutBits(2, pt.source_scan_type); bs.PutBit(pt.duplicate_flag); } bool bHRD = hrd.nal_hrd_parameters_present_flag || hrd.vcl_hrd_parameters_present_flag; if (bHRD) { bs.PutBits(hrd.au_cpb_removal_delay_length_minus1+1, pt.au_cpb_removal_delay_minus1); bs.PutBits(hrd.dpb_output_delay_length_minus1+1, pt.pic_dpb_output_delay); assert(hrd.sub_pic_hrd_params_present_flag == 0); } bs.PutTrailingBits(true); } mfxU32 Packer::PackRBSP(mfxU8* dst, mfxU8* rbsp, mfxU32 dst_size, mfxU32 rbsp_size) { mfxU32 rest_bytes = dst_size - rbsp_size; mfxU8* rbsp_end = rbsp + rbsp_size; if(dst_size < rbsp_size) return 0; //skip start-code if (rbsp_size > 3) { dst[0] = rbsp[0]; dst[1] = rbsp[1]; dst[2] = rbsp[2]; dst += 3; rbsp += 3; } while (rbsp_end - rbsp > 2) { *dst++ = *rbsp++; bool bNeedEPB = !(rbsp[-1] || rbsp[0] || (rbsp[1] & 0xFC)); if (bNeedEPB) { if (!--rest_bytes) return 0; *dst++ = *rbsp++; *dst++ = 0x03; } } while (rbsp_end > rbsp) *dst++ = *rbsp++; dst_size -= rest_bytes; return dst_size; } void Packer::PackBPPayload( BitstreamWriter& rbsp , const TaskCommonPar & task , const SPS& sps) { BufferingPeriodSEI bp = {}; bp.seq_parameter_set_id = sps.seq_parameter_set_id; bp.nal[0].initial_cpb_removal_delay = bp.vcl[0].initial_cpb_removal_delay = task.initial_cpb_removal_delay; bp.nal[0].initial_cpb_removal_offset = bp.vcl[0].initial_cpb_removal_offset = task.initial_cpb_removal_offset; mfxU32 size = mfx::CeilDiv(rbsp.GetOffset(), 8u); mfxU8* pl = rbsp.GetStart() + size; // payload start rbsp.PutBits(8, 0); //payload type rbsp.PutBits(8, 0xff); //place for payload size size += 2; Packer::PackSEIPayload(rbsp, sps.vui, bp); size = mfx::CeilDiv(rbsp.GetOffset(), 8u) - size; assert(size < 256); pl[1] = (mfxU8)size; //payload size } void Packer::PackPTPayload( BitstreamWriter& rbsp , const ExtBuffer::Param & par , const TaskCommonPar & task , const SPS& sps) { PicTimingSEI pt = {}; static const std::map> PicStructMFX2STD[2] = { { {mfxU16(MFX_PICSTRUCT_FIELD_TFF), {mfxU8(3), mfxU8(0)}} , {mfxU16(MFX_PICSTRUCT_FIELD_BFF), {mfxU8(4), mfxU8(0)}} , {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF), {mfxU8(3), mfxU8(1)}} , {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF), {mfxU8(4), mfxU8(1)}} , {mfxU16(MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_REPEATED), {mfxU8(5), mfxU8(0)}} , {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_REPEATED), {mfxU8(5), mfxU8(1)}} , {mfxU16(MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_REPEATED), {mfxU8(6), mfxU8(0)}} , {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_REPEATED), {mfxU8(6), mfxU8(1)}} , {mfxU16(0), {mfxU8(0), mfxU8(2)}} } , {//progressive only {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_DOUBLING), {mfxU8(7), mfxU8(1)}} , {mfxU16(MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_TRIPLING), {mfxU8(8), mfxU8(1)}} , {mfxU16(0), {mfxU8(0), mfxU8(1)}} } }; bool bProg = !!(par.mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); mfxU16 key = task.pSurfIn->Info.PicStruct; key *= mfxU16(!!PicStructMFX2STD[bProg].count(key)); auto ps = PicStructMFX2STD[bProg].at(key); pt.pic_struct = ps[0]; pt.source_scan_type = ps[1]; pt.duplicate_flag = 0; pt.au_cpb_removal_delay_minus1 = std::max(task.cpb_removal_delay, 1) - 1; pt.pic_dpb_output_delay = task.DisplayOrder + sps.sub_layer[sps.max_sub_layers_minus1].max_num_reorder_pics - task.EncodedOrder; mfxU32 size = mfx::CeilDiv(rbsp.GetOffset(), 8u); mfxU8* pl = rbsp.GetStart() + size; // payload start rbsp.PutBits(8, 1); //payload type rbsp.PutBits(8, 0xFF); //place for payload size size += 2; Packer::PackSEIPayload(rbsp, sps.vui, pt); size = mfx::CeilDiv(rbsp.GetOffset(), 8u) - size; assert(size < 256); pl[1] = (mfxU8)size; //payload size } template bool PLTypeEq(const mfxPayload* pl) { return (pl && pl->Type == PT); } mfxU32 Packer::GetPrefixSEI( const ExtBuffer::Param & par , const TaskCommonPar & task , const SPS& sps , mfxU8* buf , mfxU32 sizeInBytes) { NALU nalu = {1, PREFIX_SEI_NUT, 0, 1}; BitstreamWriter rbsp(m_rbsp.data(), (mfxU32)m_rbsp.size()); std::list prefixPL, tmpPL; mfxPayload BPSEI = {}, PTSEI = {}; auto pBegin = buf; auto PutPLIntoRBSP = [&rbsp](const mfxPayload* pPL) { rbsp.PutBitsBuffer(pPL->NumBit, pPL->Data); rbsp.PutTrailingBits(true); }; auto PackSeiNalu = [&](std::list& pls) { PackNALU(rbsp, nalu); std::for_each(pls.begin(), pls.end(), PutPLIntoRBSP); rbsp.PutTrailingBits(); auto bytesPacked = PackRBSP(buf, rbsp.GetStart(), sizeInBytes, mfx::CeilDiv(rbsp.GetOffset(), 8u)); buf += bytesPacked; sizeInBytes -= bytesPacked; rbsp.Reset(); return bytesPacked; }; //external payloads prefixPL.assign(task.ctrl.Payload, task.ctrl.Payload + (task.ctrl.NumPayload * !!task.ctrl.Payload)); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { prefixPL.remove_if(PLTypeEq<0>); //buffering_period prefixPL.remove_if(PLTypeEq<1>); //pic_timing } //internal payloads std::transform(task.PLInternal.begin(), task.PLInternal.end(), std::back_inserter(prefixPL) , [](const mfxPayload& pl) { return &pl; }); prefixPL.remove_if([](const mfxPayload* pPL) { return !pPL || (pPL->CtrlFlags & MFX_PAYLOAD_CTRL_SUFFIX); }); bool bNeedSEI = !prefixPL.empty() || (task.InsertHeaders & INSERT_SEI); if (!bNeedSEI) return 0; /* An SEI NAL unit containing an active parameter sets SEI message shall contain only one active parameter sets SEI message and shall not contain any other SEI messages. */ /* When an SEI NAL unit containing an active parameter sets SEI message is present in an access unit, it shall be the first SEI NAL unit that follows the prevVclNalUnitInAu of the SEI NAL unit and precedes the nextVclNalUnitInAu of the SEI NAL unit. */ MoveIf(prefixPL, tmpPL, PLTypeEq<129>); bool bPackError = !tmpPL.empty() && !PackSeiNalu(tmpPL); if (bPackError) return 0; bool bNeedOwnPT = (task.InsertHeaders & INSERT_PTSEI) && !std::any_of(prefixPL.begin(), prefixPL.end(), PLTypeEq<1>); if (bNeedOwnPT) { PTSEI.Type = 1; PTSEI.NumBit = rbsp.GetOffset(); PTSEI.Data = rbsp.GetStart() + PTSEI.NumBit / 8; PackPTPayload(rbsp, par, task, sps); PTSEI.NumBit = rbsp.GetOffset() - PTSEI.NumBit; PTSEI.BufSize = (mfxU16)mfx::CeilDiv(PTSEI.NumBit, 8); prefixPL.push_front(&PTSEI); rbsp.PutTrailingBits(true); auto pNewRBSPStart = rbsp.GetStart() + mfx::CeilDiv(rbsp.GetOffset(), 8u); rbsp.Reset(pNewRBSPStart, mfxU32(rbsp.GetEnd() - pNewRBSPStart)); } bool bNeedOwnBP = (task.InsertHeaders & INSERT_BPSEI) && !std::any_of(prefixPL.begin(), prefixPL.end(), PLTypeEq<0>); if (bNeedOwnBP) { BPSEI.Type = 0; BPSEI.NumBit = rbsp.GetOffset(); BPSEI.Data = rbsp.GetStart() + BPSEI.NumBit / 8; PackBPPayload(rbsp, task, sps); BPSEI.NumBit = rbsp.GetOffset() - BPSEI.NumBit; BPSEI.BufSize = (mfxU16)mfx::CeilDiv(BPSEI.NumBit, 8); prefixPL.push_front(&BPSEI); rbsp.PutTrailingBits(true); auto pNewRBSPStart = rbsp.GetStart() + mfx::CeilDiv(rbsp.GetOffset(), 8u); rbsp.Reset(pNewRBSPStart, mfxU32(rbsp.GetEnd() - pNewRBSPStart)); } /* When an SEI NAL unit contains a non-nested buffering period SEI message, a non-nested picture timing SEI message, or a non-nested decoding unit information SEI message, the SEI NAL unit shall not contain any other SEI message with payloadType not equal to 0 (buffering period), 1 (picture timing) or 130 (decoding unit information). */ tmpPL.clear(); MoveIf(prefixPL, tmpPL, PLTypeEq<0>); MoveIf(prefixPL, tmpPL, PLTypeEq<1>); MoveIf(prefixPL, tmpPL, PLTypeEq<130>); bPackError = (!tmpPL.empty() && !PackSeiNalu(tmpPL)) || (!prefixPL.empty() && !PackSeiNalu(prefixPL)); return mfxU32(!bPackError * (buf - pBegin)); } mfxU32 Packer::GetSuffixSEI( const TaskCommonPar & task , mfxU8* buf , mfxU32 sizeInBytes) { NALU nalu = {0, SUFFIX_SEI_NUT, 0, 1}; BitstreamWriter rbsp(m_rbsp.data(), (mfxU32)m_rbsp.size()); std::list suffixPL, prefixPL; std::list::iterator plIt; suffixPL.assign(task.ctrl.Payload, task.ctrl.Payload + (task.ctrl.NumPayload * !!task.ctrl.Payload)); suffixPL.remove_if([](const mfxPayload* pPL) { return !pPL || !(pPL->CtrlFlags & MFX_PAYLOAD_CTRL_SUFFIX); }); prefixPL.assign(task.ctrl.Payload, task.ctrl.Payload + (task.ctrl.NumPayload * !!task.ctrl.Payload)); prefixPL.remove_if([](const mfxPayload* pPL) { return !pPL || (pPL->CtrlFlags & MFX_PAYLOAD_CTRL_SUFFIX); }); /* It is a requirement of bitstream conformance that when a prefix SEI message with payloadType equal to 17 (progressive refinement segment end) or 22 (post-filter hint) is present in an access unit, a suffix SEI message with the same value of payloadType shall not be present in the same access unit.*/ if (prefixPL.end() != std::find_if(prefixPL.begin(), prefixPL.end(), PLTypeEq<17>)) suffixPL.remove_if(PLTypeEq<17>); if (prefixPL.end() != std::find_if(prefixPL.begin(), prefixPL.end(), PLTypeEq<22>)) suffixPL.remove_if(PLTypeEq<22>); if (suffixPL.empty()) return 0; PackNALU(rbsp, nalu); std::for_each(suffixPL.begin(), suffixPL.end() , [&](const mfxPayload* pPL) { rbsp.PutBitsBuffer(pPL->NumBit, pPL->Data); rbsp.PutTrailingBits(true); }); rbsp.PutTrailingBits(); return PackRBSP(buf, rbsp.GetStart(), sizeInBytes, mfx::CeilDiv(rbsp.GetOffset(), 8u)); } static void PackSkipCTU( mfxU32 xCtu , mfxU32 yCtu , mfxU32 log2CtuSize , BitstreamWriter& bs , const SPS& sps , const PPS& pps , const Slice& slice , mfxU32 x0 , mfxU32 y0 , CABACContext& ctx) { bool mbA = //is left MB available ((yCtu == y0) && xCtu > x0) || ((yCtu != y0) && xCtu > 0); bool mbB = //is above MB available (yCtu != y0) && ((xCtu >= x0 && yCtu > y0) || (xCtu < x0 && yCtu > (y0 + (1 << log2CtuSize)))); bool boundary = ((xCtu + (1 << log2CtuSize) > sps.pic_width_in_luma_samples) || (yCtu + (1 << log2CtuSize) > sps.pic_height_in_luma_samples)) && (log2CtuSize > (sps.log2_min_luma_coding_block_size_minus3 + 3)); mfxU8 split_flag = boundary && (log2CtuSize > (sps.log2_min_luma_coding_block_size_minus3 + 3)); if (!boundary) bs.EncodeBin(ctx.SPLIT_CODING_UNIT_FLAG[0], split_flag); if (split_flag) { mfxU32 x1 = xCtu + (1 << (log2CtuSize - 1)); mfxU32 y1 = yCtu + (1 << (log2CtuSize - 1)); struct SplitMap { mfxU32 x; mfxU32 y; bool bPackCTU; }; auto PackSplitCTU = [&](const SplitMap& s) { PackSkipCTU(s.x, s.y, log2CtuSize - 1, bs, sps, pps, slice, x0, y0, ctx); }; std::list splitMap({ {xCtu, yCtu, true}, {x1 , yCtu, x1 < sps.pic_width_in_luma_samples}, {xCtu, y1 , y1 < sps.pic_height_in_luma_samples}, {x1 , y1 , x1 < sps.pic_width_in_luma_samples && y1 < sps.pic_height_in_luma_samples} }); splitMap.remove_if([](const SplitMap& s) { return !s.bPackCTU; }); std::for_each(std::begin(splitMap), std::end(splitMap), PackSplitCTU); } else { if (pps.transquant_bypass_enabled_flag) bs.EncodeBin(ctx.CU_TRANSQUANT_BYPASS_FLAG[0], 0); bs.EncodeBin(ctx.SKIP_FLAG[mbA + mbB], 1); if (slice.five_minus_max_num_merge_cand < 4) bs.EncodeBin(ctx.MERGE_IDX[0], 0); } } void Packer::PackSkipSSD( BitstreamWriter& bs , SPS const & sps , PPS const & pps , Slice const & sh , mfxU32 NumLCU) { CABACContext ctx; const mfxU32 CtbLog2SizeY = sps.log2_min_luma_coding_block_size_minus3 + 3 + sps.log2_diff_max_min_luma_coding_block_size; const mfxU32 CtbSizeY = (1 << CtbLog2SizeY); const mfxU32 PicWidthInCtbsY = mfx::CeilDiv(sps.pic_width_in_luma_samples, CtbSizeY); ctx.Init(pps, sh); mfxU32 xCtu0 = (sh.segment_address % PicWidthInCtbsY) << CtbLog2SizeY; mfxU32 yCtu0 = (sh.segment_address / PicWidthInCtbsY) << CtbLog2SizeY; mfxU32 ctuAdrrEnd = sh.segment_address + NumLCU - 1; for (mfxU32 ctuAdrr = sh.segment_address; ctuAdrr < ctuAdrrEnd; ctuAdrr++) { mfxU32 xCtu = (ctuAdrr % PicWidthInCtbsY) << CtbLog2SizeY; mfxU32 yCtu = (ctuAdrr / PicWidthInCtbsY) << CtbLog2SizeY; PackSkipCTU(xCtu, yCtu, CtbLog2SizeY, bs, sps, pps, sh, xCtu0, yCtu0, ctx); bs.EncodeBin(ctx.END_OF_SLICE_FLAG[0], 0); } mfxU32 ctu = ctuAdrrEnd;//PicSizeInCtbsY - 1; mfxU32 xCtu = (ctu % PicWidthInCtbsY) << CtbLog2SizeY; mfxU32 yCtu = (ctu / PicWidthInCtbsY) << CtbLog2SizeY; PackSkipCTU(xCtu, yCtu, CtbLog2SizeY, bs, sps, pps, sh, xCtu0, yCtu0, ctx); bs.SliceFinish(); } void Packer::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_Init , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto ph = make_unique>(PackedHeaders{}); m_pGlob = &global; if (global.Contains(CC::Key)) CC::Get(global).UpdateLPLAAnalysisSPSBS(global, Glob::SPS::Get(global)); mfxStatus sts = Reset( Glob::VPS::Get(global) , Glob::SPS::Get(global) , Glob::PPS::Get(global) , Glob::CqmPPS::GetOrConstruct(global) , Glob::SliceInfo::Get(global) , *ph); MFX_CHECK_STS(sts); auto& vpar = Glob::VideoParam::Get(global); mfxExtCodingOptionVPS& vps = ExtBuffer::Get(vpar); mfxExtCodingOptionSPSPPS& spspps = ExtBuffer::Get(vpar); vps.VPSBuffer = ph->VPS.pData; vps.VPSBufSize = mfxU16(mfx::CeilDiv(ph->VPS.BitLen, 8u)); spspps.SPSBuffer = ph->SPS.pData; spspps.SPSBufSize = mfxU16(mfx::CeilDiv(ph->SPS.BitLen, 8u)); spspps.PPSBuffer = ph->PPS.pData; spspps.PPSBufSize = mfxU16(mfx::CeilDiv(ph->PPS.BitLen, 8u)); global.Insert(Glob::PackedHeaders::Key, std::move(ph)); return MFX_ERR_NONE; }); } void Packer::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this]( StorageRW& global , StorageRW&) -> mfxStatus { auto& initState = Glob::RealState::Get(global); auto& ph = Glob::PackedHeaders::Get(initState); m_pGlob = &global; mfxStatus sts = Reset( Glob::VPS::Get(global) , Glob::SPS::Get(global) , Glob::PPS::Get(global) , Glob::CqmPPS::GetOrConstruct(global) , Glob::SliceInfo::Get(global) , ph); MFX_CHECK_STS(sts); auto& vpar = Glob::VideoParam::Get(global); mfxExtCodingOptionVPS& vps = ExtBuffer::Get(vpar); mfxExtCodingOptionSPSPPS& spspps = ExtBuffer::Get(vpar); vps.VPSBuffer = ph.VPS.pData; vps.VPSBufSize = mfxU16(mfx::CeilDiv(ph.VPS.BitLen, 8u)); spspps.SPSBuffer = ph.SPS.pData; spspps.SPSBufSize = mfxU16(mfx::CeilDiv(ph.SPS.BitLen, 8u)); spspps.PPSBuffer = ph.PPS.pData; spspps.PPSBufSize = mfxU16(mfx::CeilDiv(ph.PPS.BitLen, 8u)); auto& vparInit = Glob::VideoParam::Get(initState); ((mfxExtCodingOptionVPS&)ExtBuffer::Get(vparInit)) = vps; ((mfxExtCodingOptionSPSPPS&)ExtBuffer::Get(vparInit)) = spspps; return MFX_ERR_NONE; }); } mfxStatus Packer::PackHeader(BitstreamWriter& rbsp, mfxU8* pESBegin, mfxU8* pESEnd, PackedData& d) { d.BitLen = PackRBSP(pESBegin, rbsp.GetStart(), mfxU32(pESEnd - pESBegin), mfx::CeilDiv(rbsp.GetOffset(), 8u)); MFX_CHECK(d.BitLen, MFX_ERR_NOT_ENOUGH_BUFFER); d.pData = pESBegin; d.bLongSC = true; d.bHasEP = true; d.BitLen *= 8; rbsp.Reset(); return MFX_ERR_NONE; }; mfxStatus Packer::Reset( const VPS& vps , const SPS& sps , const PPS& pps , const std::vector& cqmpps , const std::vector& si , PackedHeaders& ph) { MFX_CHECK(m_es.data(), MFX_ERR_UNKNOWN); MFX_CHECK(m_rbsp.data(), MFX_ERR_UNKNOWN); mfxStatus sts = MFX_ERR_NONE; auto pESBegin = m_es.data(); auto pESEnd = pESBegin + m_es.size(); BitstreamWriter rbsp(m_rbsp.data(), (mfxU32)m_rbsp.size()); for (mfxU8 i = 0; i < 3; i++) { BitstreamWriter es(pESBegin, mfxU32(pESEnd - pESBegin)); PackAUD(es, i); auto& d = ph.AUD[i]; d.pData = es.GetStart(); d.BitLen = es.GetOffset(); d.bLongSC = true; d.bHasEP = true; pESBegin += mfx::CeilDiv(d.BitLen, 8u); } PackVPS(rbsp, vps); sts = PackHeader(rbsp, pESBegin, pESEnd, ph.VPS); MFX_CHECK_STS(sts); pESBegin += ph.VPS.BitLen / 8; PackSPS(rbsp, sps); sts = PackHeader(rbsp, pESBegin, pESEnd, ph.SPS); MFX_CHECK_STS(sts); pESBegin += ph.SPS.BitLen / 8; PackPPS(rbsp, pps); sts = PackHeader(rbsp, pESBegin, pESEnd, ph.PPS); MFX_CHECK_STS(sts); pESBegin += ph.PPS.BitLen / 8; // Pack cqm PPS header for adaptive cqm. if (m_pGlob->Contains(CC::Key) && CC::Get(*m_pGlob).PackAdaptiveCqmHeader && CC::Get(*m_pGlob).PackAdaptiveCqmHeader(m_pGlob)) { ph.CqmPPS.resize(CQM_HINT_NUM_CUST_MATRIX); for (mfxU8 idx = 0; idx < CQM_HINT_NUM_CUST_MATRIX && idx < cqmpps.size(); idx++) { if (cqmpps[idx].scaling_list_data_present_flag) { PackPPS(rbsp, cqmpps[idx]); sts = PackHeader(rbsp, pESBegin, pESEnd, ph.CqmPPS[idx]); MFX_CHECK_STS(sts); pESBegin += ph.CqmPPS[idx].BitLen / 8; } } } ph.SSH.resize(si.size()); m_pRTBufBegin = pESBegin; m_pRTBufEnd = pESEnd; return MFX_ERR_NONE; } mfxU32 Packer::GetPSEIAndSSH( const ExtBuffer::Param& par , const TaskCommonPar& task , const SPS& sps , const PPS& pps , Slice sh , const std::vector& si , PackedHeaders& ph , mfxU8* buf , mfxU32 sizeInBytes) { BitstreamWriter rbsp(m_rbsp.data(), (mfxU32)m_rbsp.size()); mfxU8* pBegin = buf; mfxU8* pEnd = pBegin + sizeInBytes; bool bSkip = !!(task.SkipCMD & SKIPCMD_NeedSkipSliceGen); bool bDSS = !bSkip && !!((const mfxExtCodingOption2&)ExtBuffer::Get(par)).MaxSliceSize; bool bNeedSEI = (task.InsertHeaders & INSERT_SEI) || std::any_of(task.ctrl.Payload, task.ctrl.Payload + task.ctrl.NumPayload, [](const mfxPayload* pPL) { return pPL && !(pPL->CtrlFlags & MFX_PAYLOAD_CTRL_SUFFIX); }); auto PutSSH = [&](PackedData& d, NALU& nalu) { rbsp.Reset(pBegin, mfxU32(pEnd - pBegin)); rbsp.SetInfo(&d.PackInfo); PackSSH(rbsp, nalu, sps, pps, sh, bDSS); d.BitLen = rbsp.GetOffset(); pBegin += mfx::CeilDiv(d.BitLen, 8u); return d.BitLen; }; auto PutSkip = [&](PackedData& d, NALU& nalu, mfxU32 nLCU) { rbsp.Reset(); PackSSH(rbsp, nalu, sps, pps, sh, bDSS); PackSkipSSD(rbsp, sps, pps, sh, nLCU); d.BitLen = PackRBSP(pBegin, rbsp.GetStart(), mfxU32(pEnd - pBegin), mfx::CeilDiv(rbsp.GetOffset(), 8u)); pBegin += d.BitLen; d.BitLen *= 8; return d.BitLen; }; ph.PrefixSEI.BitLen = 0; if (bNeedSEI) { ph.PrefixSEI.BitLen = GetPrefixSEI(par, task, sps, pBegin, mfxU32(pEnd - pBegin)); ph.PrefixSEI.pData = pBegin; pBegin += ph.PrefixSEI.BitLen; ph.PrefixSEI.BitLen *= 8; ph.PrefixSEI.bHasEP = true; ph.PrefixSEI.bLongSC = true; if (!ph.PrefixSEI.BitLen) { return 0; } } for (mfxU32 i = 0; i < si.size(); i++) { auto& d = ph.SSH.at(i); bool bLongStartCode = (!i && !task.InsertHeaders) || task.bForceLongStartCode || (IsOn(par.mfx.LowPower) && !bDSS && (task.SliceNUT == IDR_W_RADL || task.SliceNUT == IDR_N_LP)); NALU nalu = { mfxU16(bLongStartCode), task.SliceNUT, 0, mfxU16(task.TemporalID + 1) }; d.pData = pBegin; d.bLongSC = bLongStartCode; d.bHasEP = bSkip; sh.first_slice_segment_in_pic_flag = !i; sh.segment_address = si.at(i).SegmentAddress; bool bFailed = !( (bSkip && PutSkip(d, nalu, si.at(i).NumLCU)) || (!bSkip && PutSSH(d, nalu))); if (bFailed) { return 0; } } return mfxU32(pBegin - buf); } void Packer::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SubmitTask , [this]( StorageW& global , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); mfx::OnExit cleanup([&]() { task.PLInternal.clear(); }); if (task.SkipCMD & SKIPCMD_NeedDriverCall) { auto& ph = Glob::PackedHeaders::Get(global); auto& pps = Glob::PPS::Get(global); if (task.RepackHeaders & INSERT_PPS) { BitstreamWriter rbsp(m_rbsp.data(), (mfxU32)m_rbsp.size()); auto pPpsEsBegin = ph.SPS.pData + ph.SPS.BitLen / 8; PackPPS(rbsp, pps); ThrowAssert(pPpsEsBegin < m_es.data() || pPpsEsBegin > (m_es.data() + m_es.size()) , "pPpsEsBegin is out of Packer ES buffer (m_es)"); auto sts = PackHeader(rbsp, pPpsEsBegin, m_pRTBufEnd, ph.PPS); MFX_CHECK_STS(sts); m_pRTBufBegin = ph.PPS.pData + ph.PPS.BitLen / 8; } // Update Slice header for adaptive cqm. if (global.Contains(CC::Key) && CC::Get(global).UpdateAdaptiveCqmSH) CC::Get(global).UpdateAdaptiveCqmSH(global, s_task); mfxU32 sz = GetPSEIAndSSH( Glob::VideoParam::Get(global) , task , Glob::SPS::Get(global) , pps , Task::SSH::Get(s_task) , Glob::SliceInfo::Get(global) , ph , m_pRTBufBegin , mfxU32(m_pRTBufEnd - m_pRTBufBegin)); MFX_CHECK(sz, MFX_ERR_NOT_ENOUGH_BUFFER); } else if (task.SkipCMD & SKIPCMD_NeedSkipSliceGen) { FrameLocker bsData(Glob::VideoCore::Get(global), task.BS.Mid); auto& ph = Glob::PackedHeaders::Get(global); auto bsInfo = Glob::AllocBS::Get(global).GetInfo(); auto& ssh = Task::SSH::Get(s_task); mfxU32 BsBytesAvailable = bsInfo.Width * bsInfo.Height; mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(bsData.Y, MFX_ERR_LOCK_MEMORY); auto BSInsert = [&](const PackedData& d) -> mfxStatus { mfxU32 sz = mfx::CeilDiv(d.BitLen, 8u); MFX_CHECK(sz <= BsBytesAvailable, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK(d.bHasEP, MFX_ERR_UNDEFINED_BEHAVIOR); std::copy(d.pData, d.pData + sz, bsData.Y + task.BsDataLength); task.BsDataLength += sz; BsBytesAvailable -= sz; return MFX_ERR_NONE; }; bool bErr = ((task.InsertHeaders & INSERT_AUD) && Res2Bool(sts, BSInsert(ph.AUD[mfx::clamp(2 - ssh.type, 0, 2)]))) || ((task.InsertHeaders & INSERT_VPS) && Res2Bool(sts, BSInsert(ph.VPS))) || ((task.InsertHeaders & INSERT_SPS) && Res2Bool(sts, BSInsert(ph.SPS))) || ((task.InsertHeaders & INSERT_PPS) && Res2Bool(sts, BSInsert(ph.PPS))); MFX_CHECK(!bErr, sts); // Update Slice header for adaptive cqm. if (global.Contains(CC::Key)) CC::Get(global).UpdateAdaptiveCqmSH(global, s_task); mfxU32 sz = GetPSEIAndSSH( Glob::VideoParam::Get(global) , task , Glob::SPS::Get(global) , Glob::PPS::Get(global) , ssh , Glob::SliceInfo::Get(global) , ph , bsData.Y + task.BsDataLength , BsBytesAvailable); MFX_CHECK(sz, MFX_ERR_NOT_ENOUGH_BUFFER); task.BsDataLength += sz; } return MFX_ERR_NONE; }); } void Packer::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_InsertSuffixSEI , [this]( StorageW& /*global*/ , StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); if (task.ctrl.NumPayload) { mfxU32 sz = GetSuffixSEI(task, task.pBsData + task.BsDataLength, task.BsBytesAvailable); MFX_CHECK(!sz || !task.bDontPatchBS, MFX_ERR_UNDEFINED_BEHAVIOR); task.BsDataLength += sz; task.BsBytesAvailable -= sz; } return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_packer.h000066400000000000000000000226541443134507600340310ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include namespace HEVCEHW { namespace Base { class BitstreamWriter : public IBsWriter { public: BitstreamWriter(mfxU8* bs, mfxU32 size, mfxU8 bitOffset = 0); ~BitstreamWriter(); virtual void PutBits(mfxU32 n, mfxU32 b) override; void PutBitsBuffer(mfxU32 n, void* b, mfxU32 offset = 0); virtual void PutBit(mfxU32 b) override; void PutGolomb(mfxU32 b); void PutTrailingBits(bool bCheckAligned = false); virtual void PutUE(mfxU32 b) override { PutGolomb(b); } virtual void PutSE(mfxI32 b) override { (b > 0) ? PutGolomb((b << 1) - 1) : PutGolomb((-b) << 1); } mfxU32 GetOffset() { return mfxU32(m_bs - m_bsStart) * 8 + m_bitOffset - m_bitStart; } mfxU8* GetStart() { return m_bsStart; } mfxU8* GetEnd() { return m_bsEnd; } void Reset(mfxU8* bs = 0, mfxU32 size = 0, mfxU8 bitOffset = 0); void cabacInit(); void EncodeBin(mfxU8& ctx, mfxU8 binVal); void EncodeBinEP(mfxU8 binVal); void SliceFinish(); void PutBitC(mfxU32 B); void AddInfo(mfxU32 key, mfxU32 value) { if (m_pInfo) m_pInfo[0][key] = value; } void SetInfo(std::map *pInfo) { m_pInfo = pInfo; } private: void RenormE(); mfxU8* m_bsStart; mfxU8* m_bsEnd; mfxU8* m_bs; mfxU8 m_bitStart; mfxU8 m_bitOffset; mfxU32 m_codILow; mfxU32 m_codIRange; mfxU32 m_bitsOutstanding; mfxU32 m_BinCountsInNALunits; bool m_firstBitFlag; std::map *m_pInfo = nullptr; }; struct CABACContextTable { mfxU8 CU_TRANSQUANT_BYPASS_FLAG[1]; mfxU8 SPLIT_CODING_UNIT_FLAG[3]; mfxU8 SKIP_FLAG[3]; mfxU8 MERGE_IDX[1]; mfxU8 END_OF_SLICE_FLAG[1]; }; struct CABACContext : CABACContextTable { static const CABACContextTable InitVal[3]; void Init(const PPS& pps, const Slice& sh); }; class Packer : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Init) \ DECL_BLOCK(Reset) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(InsertSuffixSEI) #define DECL_FEATURE_NAME "Base_Packer" #include "hevcehw_decl_blocks.h" Packer(mfxU32 id) : FeatureBase(id) {} //protected: static const mfxU32 RBSP_SIZE = 4096; static const mfxU32 AUD_ES_SIZE = 8; static const mfxU32 VPS_ES_SIZE = 256; static const mfxU32 SPS_ES_SIZE = 1024; static const mfxU32 PPS_ES_SIZE = 128; static const mfxU32 SSH_ES_SIZE = MAX_SLICES * 16; static const mfxU32 ES_SIZE = AUD_ES_SIZE * 3 + VPS_ES_SIZE + SPS_ES_SIZE + PPS_ES_SIZE + SSH_ES_SIZE; std::array m_rbsp; std::array m_es; mfxU8 *m_pRTBufBegin = nullptr , *m_pRTBufEnd = nullptr; NotNull m_pGlob; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; using FeatureBase::Reset; mfxStatus Reset( const VPS& vps , const SPS& sps , const PPS& pps , const std::vector& cqmpps , const std::vector& si , PackedHeaders& ph); mfxU32 GetPrefixSEI( const ExtBuffer::Param & par , const TaskCommonPar & task , const SPS& sps , mfxU8* buf , mfxU32 sizeInBytes); mfxU32 GetSuffixSEI( const TaskCommonPar & task , mfxU8* buf , mfxU32 sizeInBytes); mfxU32 GetPSEIAndSSH( const ExtBuffer::Param& par , const TaskCommonPar& task , const SPS& sps , const PPS& pps , Slice sh , const std::vector& si , PackedHeaders& ph , mfxU8* buf , mfxU32 sizeInBytes); void PackBPPayload( BitstreamWriter& rbsp , const TaskCommonPar & task , const SPS& sps); void PackPTPayload( BitstreamWriter& rbsp , const ExtBuffer::Param & par , const TaskCommonPar & task , const SPS& sps); void PackNALU (BitstreamWriter& bs, NALU const & nalu); void PackAUD (BitstreamWriter& bs, mfxU8 pic_type); void PackVPS (BitstreamWriter& bs, VPS const & vps); void PackSPS (BitstreamWriter& bs, SPS const & sps); void PackPPS (BitstreamWriter& bs, PPS const & pps); void PackVUI (BitstreamWriter& bs, VUI const & vui, mfxU16 max_sub_layers_minus1); void PackHRD (BitstreamWriter& bs, HRDInfo const & hrd, bool commonInfPresentFlag, mfxU16 maxNumSubLayersMinus1); void PackPTL (BitstreamWriter& bs, LayersInfo const & profile_tier_level, mfxU16 max_sub_layers_minus1); void PackSLO (BitstreamWriter& bs, LayersInfo const & slo, mfxU16 max_sub_layers_minus1); mfxU32 PackSLD(BitstreamWriter& bs, ScalingList const & scl); void PackSSH( BitstreamWriter& bs , NALU const & nalu , SPS const & sps , PPS const & pps , Slice const & slice , bool dyn_slice_size = false); void PackSkipSSD( BitstreamWriter& bs , SPS const & sps , PPS const & pps , Slice const & slice , mfxU32 NumLCU); void PackSEIPayload(BitstreamWriter& bs, VUI const & vui, BufferingPeriodSEI const & bp); static void PackSEIPayload(BitstreamWriter& bs, VUI const & vui, PicTimingSEI const & pt); static mfxU32 PackRBSP(mfxU8* dst, mfxU8* src, mfxU32 dst_size, mfxU32 src_size); static mfxStatus PackHeader(BitstreamWriter& rbsp, mfxU8* pESBegin, mfxU8* pESEnd, PackedData& d); static bool PutUE (BitstreamWriter& bs, mfxU32 b) { bs.PutUE(b); return true; }; static bool PutSE (BitstreamWriter& bs, mfxI32 b) { bs.PutSE(b); return true; }; static bool PutBit (BitstreamWriter& bs, mfxU32 b) { bs.PutBit(!!b); return true; }; static bool PutBits (BitstreamWriter& bs, mfxU32 n, mfxU32 b) { if (n) bs.PutBits(n, b); return !!n; }; static bool PackSSHPWT( BitstreamWriter& bs , const SPS& sps , const PPS& pps , const Slice& slice); static void PackSSHPartPB( BitstreamWriter& bs , const SPS & sps , const PPS & pps , const Slice & slice); static void PackSSHPartIndependent( BitstreamWriter& bs , const NALU & nalu , const SPS & sps , const PPS & pps , const Slice & slice); static void PackSSHPartNonIDR( BitstreamWriter& bs , const SPS & sps , const Slice & slice); void PackSSHPartIdAddr( BitstreamWriter& bs , const NALU & nalu , const SPS & sps , const PPS & pps , const Slice & slice); struct CallChains : Storable { using TUpdateAdaptiveCqmSH = CallChain; TUpdateAdaptiveCqmSH UpdateAdaptiveCqmSH; using TPackAdaptiveCqmHeader = CallChain; TPackAdaptiveCqmHeader PackAdaptiveCqmHeader; using TUpdateLPLAAnalysisSPSBS = CallChain; TUpdateLPLAAnalysisSPSBS UpdateLPLAAnalysisSPSBS; }; using CC = StorageVar; }; } //Base } //namespace HEVCEHW #endif hevcehw_base_parser.cpp000066400000000000000000001007061443134507600344060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_parser.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; BitstreamReader::BitstreamReader(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) : m_bsStart(bs) , m_bsEnd(bs + size) , m_bs(bs) , m_bitStart(bitOffset & 7) , m_bitOffset(bitOffset & 7) , m_emulation(true) { } BitstreamReader::~BitstreamReader() { } void BitstreamReader::Reset(mfxU8* bs, mfxU32 size, mfxU8 bitOffset) { if (bs) { m_bsStart = bs; m_bsEnd = bs + size; m_bs = bs; m_bitOffset = (bitOffset & 7); m_bitStart = (bitOffset & 7); } else { m_bs = m_bsStart; m_bitOffset = m_bitStart; } } mfxU32 BitstreamReader::GetBit() { assert(m_bs < m_bsEnd); ThrowIf(m_bs >= m_bsEnd, EndOfBuffer()); mfxU32 b = (*m_bs >> (7 - m_bitOffset)) & 1; bool bNewByte = (++m_bitOffset == 8); m_bs += bNewByte; m_bitOffset *= !bNewByte; bool bSkipEPByte = bNewByte && m_emulation && m_bs - m_bsStart >= 2 && (m_bsEnd - m_bs) >= 1 && m_bs[ 0] == 0x03 && m_bs[-1] == 0x00 && m_bs[-2] == 0x00 && (m_bs[1] & 0xfc) == 0x00; m_bs += bSkipEPByte; return b; } mfxU32 BitstreamReader::GetBits(mfxU32 n) { mfxU32 b = 0; while (n--) b = (b << 1) | GetBit(); return b; } mfxU32 BitstreamReader::GetUE() { mfxU32 lz = 0; while (!GetBit()) lz++; return !lz ? 0 : ((1 << lz) | GetBits(lz)) - 1; } mfxI32 BitstreamReader::GetSE() { mfxU32 ue = GetUE(); return (ue & 1) ? (mfxI32)((ue + 1) >> 1) : -(mfxI32)((ue + 1) >> 1); } template bool TryRead(TDst& dst, StorageR& strg, StorageR::TKey key) { if (!strg.Contains(key)) return false; dst = strg.Read(key); return true; } void Parser::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_LoadSPSPPS , [this](const mfxVideoParam&, mfxVideoParam& par, StorageRW& strg) -> mfxStatus { mfxExtCodingOptionSPSPPS* pSP = ExtBuffer::Get(par); MFX_CHECK(pSP, MFX_ERR_NONE); auto pSPS = make_storable(); auto pPPS = make_storable(); TryRead(m_needRextConstraints, strg, Glob::NeedRextConstraints::Key); TryRead(m_readSpsExt, strg, Glob::ReadSpsExt::Key); TryRead(m_readPpsExt, strg, Glob::ReadPpsExt::Key); auto sts = LoadSPSPPS(par, *pSPS, *pPPS); MFX_CHECK(sts >= MFX_ERR_NONE, sts); bool bErr = pSP->SPSBuffer && pSP->SPSBufSize && !strg.TryInsert(Glob::SPS::Key, std::move(pSPS)); ThrowAssert(bErr, "failed to insert Glob::SPS"); bErr = pSP->PPSBuffer && pSP->PPSBufSize && !strg.TryInsert(Glob::PPS::Key, std::move(pPPS)); ThrowAssert(bErr, "failed to insert Glob::PPS"); return sts; }); } mfxStatus Parser::LoadSPSPPS(mfxVideoParam& par, SPS & sps, PPS & pps) { mfxExtCodingOptionSPSPPS* pSP = ExtBuffer::Get(par); if (!pSP) return MFX_ERR_NONE; mfxStatus sts = MFX_ERR_NONE; if (pSP->SPSBuffer) { BitstreamReader bs(pSP->SPSBuffer, pSP->SPSBufSize); sts = ParseSPS(bs, sps); MFX_CHECK_STS(sts); sts = SpsToMFX(sps, par); MFX_CHECK_STS(sts); } if (pSP->PPSBuffer) { BitstreamReader bs(pSP->PPSBuffer, pSP->PPSBufSize); sts = ParsePPS(bs, pps); MFX_CHECK_STS(sts); sts = PpsToMFX(pps, par); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } mfxStatus Parser::ParseNALU(BitstreamReader& bs, NALU & nalu) { mfxStatus sts = MFX_ERR_NONE; bool emulation = bs.GetEmulation(); bs.SetEmulation(false); try { mfxU32 start_code = bs.GetBits(24); mfxU32 n = 3; while ((start_code & 0x00FFFFFF) != 1) { start_code <<= 8; start_code |= bs.GetBits(8); n++; } if (bs.GetBit()) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); nalu.long_start_code = (n > 3) && !(start_code >> 24); nalu.nal_unit_type = bs.GetBits(6); nalu.nuh_layer_id = bs.GetBits(6); nalu.nuh_temporal_id_plus1 = bs.GetBits(3); } catch (std::exception &) { sts = MFX_ERR_INVALID_VIDEO_PARAM; } bs.SetEmulation(emulation); return sts; } mfxStatus ParsePTL( BitstreamReader& bs , ProfileTierLevel& profile_tier_level , std::function NeedRextConstraints) { if (profile_tier_level.profile_present_flag) { profile_tier_level.profile_space = bs.GetBits(2); profile_tier_level.tier_flag = bs.GetBit(); profile_tier_level.profile_idc = bs.GetBits(5); profile_tier_level.profile_compatibility_flags = bs.GetBits(32); profile_tier_level.progressive_source_flag = bs.GetBit(); profile_tier_level.interlaced_source_flag = bs.GetBit(); profile_tier_level.non_packed_constraint_flag = bs.GetBit(); profile_tier_level.frame_only_constraint_flag = bs.GetBit(); bool bREXT = ((profile_tier_level.profile_idc >= 4) && (profile_tier_level.profile_idc <= 7)) || (profile_tier_level.profile_compatibility_flags & 0xf0) || (NeedRextConstraints && NeedRextConstraints(profile_tier_level)); profile_tier_level.constraint.max_12bit = bs.CondBit(bREXT, 0); profile_tier_level.constraint.max_10bit = bs.CondBit(bREXT, 0); profile_tier_level.constraint.max_8bit = bs.CondBit(bREXT, 0); profile_tier_level.constraint.max_422chroma = bs.CondBit(bREXT, 0); profile_tier_level.constraint.max_420chroma = bs.CondBit(bREXT, 0); profile_tier_level.constraint.max_monochrome = bs.CondBit(bREXT, 0); profile_tier_level.constraint.intra = bs.CondBit(bREXT, 0); profile_tier_level.constraint.one_picture_only = bs.CondBit(bREXT, 0); profile_tier_level.constraint.lower_bit_rate = bs.CondBit(bREXT, 0); //general_reserved_zero_34bits MFX_CHECK(!bs.GetBits(24), MFX_ERR_UNSUPPORTED); MFX_CHECK(!bs.GetBits(10), MFX_ERR_UNSUPPORTED); //general_reserved_zero_43bits MFX_CHECK(bREXT || !bs.GetBits(9), MFX_ERR_UNSUPPORTED); /*if ( profile_tier_level.profile_idc >= 1 && profile_tier_level.profile_idc <= 5 || (profile_tier_level.profile_compatibility_flags & 0x3e)) { profile_tier_level.inbld_flag = bs.GetBit(); } else*/ MFX_CHECK(!bs.GetBit(), MFX_ERR_UNSUPPORTED);//general_reserved_zero_bit } profile_tier_level.level_idc = (mfxU8)bs.CondBits(profile_tier_level.level_present_flag, 8, 0); return MFX_ERR_NONE; } bool DPocSort(mfxI16 l, mfxI16 r) { if (l < 0 && r > 0) return true; if (r < 0 && l > 0) return false; if (l < 0) return (l > r); return (l < r); } void ParseSTRPS( BitstreamReader& bs , SPS & sps , mfxU32 idx) { STRPS & strps = sps.strps[idx]; strps.inter_ref_pic_set_prediction_flag = bs.CondBit(idx != 0, 0); if (strps.inter_ref_pic_set_prediction_flag) { auto& cur = strps; strps.delta_rps_sign = bs.GetBit(); strps.abs_delta_rps_minus1 = (mfxU16)bs.GetUE(); mfxU32 RefRpsIdx = idx - (strps.delta_idx_minus1 + 1); STRPS& ref = sps.strps[RefRpsIdx]; mfxI16 NumDeltaPocs = 0; mfxI16 RefNumDeltaPocs = NumDeltaPocs; mfxI16 deltaRps = (1 - 2 * strps.delta_rps_sign) * (strps.abs_delta_rps_minus1 + 1); bool used_by_curr_pic_flag[std::extent::value] = {}; bool use_delta_flag[std::extent::value] = {}; for (mfxI16 i = 0; i <= RefNumDeltaPocs; ++i) { auto& curPic = cur.pic[NumDeltaPocs]; used_by_curr_pic_flag[i] = !!bs.GetBit(); use_delta_flag[i] = used_by_curr_pic_flag[i] || bs.GetBit(); if (use_delta_flag[i]) { curPic.used_by_curr_pic_sx_flag = used_by_curr_pic_flag[i]; curPic.DeltaPocSX = (i < RefNumDeltaPocs) * ref.pic[i].DeltaPocSX + deltaRps; cur.num_negative_pics += (curPic.DeltaPocSX < 0); cur.num_positive_pics += (curPic.DeltaPocSX > 0); NumDeltaPocs++; } } std::sort( cur.pic , cur.pic + NumDeltaPocs , [](STRPS::Pic& l, STRPS::Pic& r) { return DPocSort(l.DeltaPocSX, r.DeltaPocSX); }); for (mfxI16 i = 0; i <= RefNumDeltaPocs; ++i) { cur.pic[i].used_by_curr_pic_flag = used_by_curr_pic_flag[i]; cur.pic[i].use_delta_flag = use_delta_flag[i]; } } else { strps.num_negative_pics = bs.GetUE(); strps.num_positive_pics = bs.GetUE(); mfxI16 sign = -1; auto ParseIntraPic = [&](STRPS::Pic& pic) { pic.delta_poc_sx_minus1 = bs.GetUE(); pic.used_by_curr_pic_sx_flag = bs.GetBit(); pic.DeltaPocSX = mfxI16(sign * (pic.delta_poc_sx_minus1 + 1)); }; std::for_each( strps.pic , strps.pic + strps.num_negative_pics , ParseIntraPic); sign = 1; std::for_each( strps.pic + strps.num_negative_pics , strps.pic + strps.num_negative_pics + strps.num_positive_pics , ParseIntraPic); } } mfxStatus ParseHRD( BitstreamReader& bs , SPS & sps) { HRDInfo & hrd = sps.vui.hrd; hrd.nal_hrd_parameters_present_flag = bs.GetBit(); hrd.vcl_hrd_parameters_present_flag = bs.GetBit(); bool bHrdParam = hrd.nal_hrd_parameters_present_flag || hrd.vcl_hrd_parameters_present_flag; hrd.sub_pic_hrd_params_present_flag = bs.CondBit(bHrdParam, 0); hrd.tick_divisor_minus2 = bs.CondBits(hrd.sub_pic_hrd_params_present_flag, 8, 0); hrd.du_cpb_removal_delay_increment_length_minus1 = bs.CondBits(hrd.sub_pic_hrd_params_present_flag, 5, 0); hrd.sub_pic_cpb_params_in_pic_timing_sei_flag = bs.CondBit(hrd.sub_pic_hrd_params_present_flag, 0); hrd.dpb_output_delay_du_length_minus1 = bs.CondBits(hrd.sub_pic_hrd_params_present_flag, 5, 0); hrd.bit_rate_scale = bs.CondBits(bHrdParam, 4, 0); hrd.cpb_size_scale = bs.CondBits(bHrdParam, 4, 0); hrd.cpb_size_du_scale = bs.CondBits(hrd.sub_pic_hrd_params_present_flag, 4, 0); hrd.initial_cpb_removal_delay_length_minus1 = bs.CondBits(bHrdParam, 5, 0); hrd.au_cpb_removal_delay_length_minus1 = bs.CondBits(bHrdParam, 5, 0); hrd.dpb_output_delay_length_minus1 = bs.CondBits(bHrdParam, 5, 0); bool bErr = std::any_of( hrd.sl , hrd.sl + sps.max_sub_layers_minus1 + 1 , [&](HRDInfo::SubLayer& sl) { sl.fixed_pic_rate_general_flag = bs.GetBit(); sl.fixed_pic_rate_within_cvs_flag = !sl.fixed_pic_rate_general_flag && bs.GetBit(); bool bFixedPicRate = sl.fixed_pic_rate_within_cvs_flag || sl.fixed_pic_rate_general_flag; sl.elemental_duration_in_tc_minus1 = bs.CondUE(bFixedPicRate, 0); sl.low_delay_hrd_flag = bs.CondBit(!bFixedPicRate, 0); sl.cpb_cnt_minus1 = bs.CondUE(!sl.low_delay_hrd_flag, 0); std::for_each( sl.cpb , sl.cpb + (sl.cpb_cnt_minus1 + 1) * hrd.nal_hrd_parameters_present_flag , [&](decltype(*sl.cpb) cpb) { cpb.bit_rate_value_minus1 = bs.GetUE(); cpb.cpb_size_value_minus1 = bs.GetUE(); cpb.cpb_size_du_value_minus1 = bs.CondUE(hrd.sub_pic_hrd_params_present_flag, 0); cpb.bit_rate_du_value_minus1 = bs.CondUE(hrd.sub_pic_hrd_params_present_flag, 0); cpb.cbr_flag = (mfxU8)bs.GetBit(); }); return !!hrd.vcl_hrd_parameters_present_flag; }); MFX_CHECK(!bErr, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } mfxStatus ParseVUI( BitstreamReader& bs , SPS & sps) { VUI & vui = sps.vui; vui.aspect_ratio_info_present_flag = bs.GetBit(); vui.aspect_ratio_idc = (mfxU8)bs.CondBits(vui.aspect_ratio_info_present_flag, 8, 0); vui.sar_width = (mfxU16)bs.CondBits(vui.aspect_ratio_idc == 255, 16, 0); vui.sar_height = (mfxU16)bs.CondBits(vui.aspect_ratio_idc == 255, 16, 0); vui.overscan_info_present_flag = bs.GetBit(); vui.overscan_appropriate_flag = bs.CondBit(vui.overscan_info_present_flag, 0); vui.video_signal_type_present_flag = bs.GetBit(); vui.video_format = bs.CondBits(vui.video_signal_type_present_flag, 3, 0); vui.video_full_range_flag = bs.CondBit(vui.video_signal_type_present_flag, 0); vui.colour_description_present_flag = bs.CondBit(vui.video_signal_type_present_flag, 0); vui.colour_primaries = (mfxU8)bs.CondBits(vui.colour_description_present_flag, 8, 0); vui.transfer_characteristics = (mfxU8)bs.CondBits(vui.colour_description_present_flag, 8, 0); vui.matrix_coeffs = (mfxU8)bs.CondBits(vui.colour_description_present_flag, 8, 0); vui.chroma_loc_info_present_flag = bs.GetBit(); vui.chroma_sample_loc_type_top_field = bs.CondUE(vui.chroma_loc_info_present_flag, 0); vui.chroma_sample_loc_type_bottom_field = bs.CondUE(vui.chroma_loc_info_present_flag, 0); vui.neutral_chroma_indication_flag = bs.GetBit(); vui.field_seq_flag = bs.GetBit(); vui.frame_field_info_present_flag = bs.GetBit(); vui.default_display_window_flag = bs.GetBit(); vui.def_disp_win_left_offset = bs.CondUE(vui.default_display_window_flag, 0); vui.def_disp_win_right_offset = bs.CondUE(vui.default_display_window_flag, 0); vui.def_disp_win_top_offset = bs.CondUE(vui.default_display_window_flag, 0); vui.def_disp_win_bottom_offset = bs.CondUE(vui.default_display_window_flag, 0); vui.timing_info_present_flag = bs.GetBit(); vui.num_units_in_tick = bs.CondBits(vui.timing_info_present_flag, 32, 0); vui.time_scale = bs.CondBits(vui.timing_info_present_flag, 32, 0); vui.poc_proportional_to_timing_flag = bs.CondBit(vui.timing_info_present_flag, 0); vui.num_ticks_poc_diff_one_minus1 = bs.CondUE(vui.poc_proportional_to_timing_flag, 0); vui.hrd_parameters_present_flag = bs.GetBit(); mfxStatus sts = MFX_ERR_NONE; bool bErr = vui.hrd_parameters_present_flag && Res2Bool(sts, ParseHRD(bs, sps)); MFX_CHECK(!bErr, sts); vui.bitstream_restriction_flag = bs.GetBit(); vui.tiles_fixed_structure_flag = bs.CondBit(vui.bitstream_restriction_flag, 0); vui.motion_vectors_over_pic_boundaries_flag = bs.CondBit(vui.bitstream_restriction_flag, 0); vui.restricted_ref_pic_lists_flag = bs.CondBit(vui.bitstream_restriction_flag, 0); vui.min_spatial_segmentation_idc = bs.CondUE(vui.bitstream_restriction_flag, 0); vui.max_bytes_per_pic_denom = bs.CondUE(vui.bitstream_restriction_flag, 0); vui.max_bits_per_min_cu_denom = bs.CondUE(vui.bitstream_restriction_flag, 0); vui.log2_max_mv_length_horizontal = bs.CondUE(vui.bitstream_restriction_flag, 0); vui.log2_max_mv_length_vertical = bs.CondUE(vui.bitstream_restriction_flag, 0); return MFX_ERR_NONE; } mfxStatus Parser::ParseSPS(BitstreamReader& bs, SPS & sps) { mfxStatus sts = MFX_ERR_NONE; NALU nalu = {}; sps = SPS{}; do { sts = ParseNALU(bs, nalu); MFX_CHECK_STS(sts); } while (nalu.nal_unit_type != SPS_NUT); try { sps.video_parameter_set_id = bs.GetBits(4); sps.max_sub_layers_minus1 = bs.GetBits(3); sps.temporal_id_nesting_flag = bs.GetBit(); sps.general.profile_present_flag = 1; sps.general.level_present_flag = 1; sts = ParsePTL(bs, sps.general, m_needRextConstraints); MFX_CHECK_STS(sts); std::for_each(sps.sub_layer, sps.sub_layer + sps.max_sub_layers_minus1 , [&](decltype(*sps.sub_layer) sl) { sl.profile_present_flag = bs.GetBit(); sl.level_present_flag = bs.GetBit(); }); MFX_CHECK(!(sps.max_sub_layers_minus1 && bs.GetBits(2 * 8)) // reserved_zero_2bits[ i ] , MFX_ERR_INVALID_VIDEO_PARAM); auto ParsePTLWrap = [&](ProfileTierLevel& profile_tier_level) { return Res2Bool(sts, ParsePTL(bs, profile_tier_level, m_needRextConstraints)); }; bool bErr = std::any_of(sps.sub_layer, sps.sub_layer + sps.max_sub_layers_minus1, ParsePTLWrap); MFX_CHECK(!bErr, sts); sps.seq_parameter_set_id = bs.GetUE(); sps.chroma_format_idc = bs.GetUE(); sps.separate_colour_plane_flag = (sps.chroma_format_idc == 3) && bs.GetBit(); sps.pic_width_in_luma_samples = bs.GetUE(); sps.pic_height_in_luma_samples = bs.GetUE(); sps.conformance_window_flag = bs.GetBit(); sps.conf_win_left_offset = bs.CondUE(sps.conformance_window_flag, 0); sps.conf_win_right_offset = bs.CondUE(sps.conformance_window_flag, 0); sps.conf_win_top_offset = bs.CondUE(sps.conformance_window_flag, 0); sps.conf_win_bottom_offset = bs.CondUE(sps.conformance_window_flag, 0); sps.bit_depth_luma_minus8 = bs.GetUE(); sps.bit_depth_chroma_minus8 = bs.GetUE(); sps.log2_max_pic_order_cnt_lsb_minus4 = bs.GetUE(); sps.sub_layer_ordering_info_present_flag = bs.GetBit(); std::for_each( sps.sub_layer + (sps.max_sub_layers_minus1 * sps.sub_layer_ordering_info_present_flag) , sps.sub_layer + sps.max_sub_layers_minus1 + 1 , [&](decltype(*sps.sub_layer) sl) { sl.max_dec_pic_buffering_minus1 = bs.GetUE(); sl.max_num_reorder_pics = bs.GetUE(); sl.max_latency_increase_plus1 = bs.GetUE(); }); sps.log2_min_luma_coding_block_size_minus3 = bs.GetUE(); sps.log2_diff_max_min_luma_coding_block_size = bs.GetUE(); sps.log2_min_transform_block_size_minus2 = bs.GetUE(); sps.log2_diff_max_min_transform_block_size = bs.GetUE(); sps.max_transform_hierarchy_depth_inter = bs.GetUE(); sps.max_transform_hierarchy_depth_intra = bs.GetUE(); sps.scaling_list_enabled_flag = bs.GetBit(); MFX_CHECK(!sps.scaling_list_enabled_flag, MFX_ERR_UNSUPPORTED); sps.amp_enabled_flag = bs.GetBit(); sps.sample_adaptive_offset_enabled_flag = bs.GetBit(); sps.pcm_enabled_flag = bs.GetBit(); sps.pcm_sample_bit_depth_luma_minus1 = bs.CondBits(sps.pcm_enabled_flag, 4, 0); sps.pcm_sample_bit_depth_chroma_minus1 = bs.CondBits(sps.pcm_enabled_flag, 4, 0); sps.log2_min_pcm_luma_coding_block_size_minus3 = bs.CondUE(sps.pcm_enabled_flag, 0); sps.log2_diff_max_min_pcm_luma_coding_block_size = bs.CondUE(sps.pcm_enabled_flag, 0); sps.pcm_loop_filter_disabled_flag = bs.CondBit(sps.pcm_enabled_flag, 0); sps.num_short_term_ref_pic_sets = (mfxU8)bs.GetUE(); for (mfxU32 idx = 0; idx < sps.num_short_term_ref_pic_sets; idx++) { ParseSTRPS(bs, sps, idx); } sps.long_term_ref_pics_present_flag = bs.GetBit(); sps.num_long_term_ref_pics_sps = bs.CondUE(sps.long_term_ref_pics_present_flag, 0); for (mfxU32 i = 0; i < sps.num_long_term_ref_pics_sps; i++) { sps.lt_ref_pic_poc_lsb_sps[i] = (mfxU16)bs.GetBits(sps.log2_max_pic_order_cnt_lsb_minus4 + 4); sps.used_by_curr_pic_lt_sps_flag[i] = (mfxU8)bs.GetBit(); } sps.temporal_mvp_enabled_flag = bs.GetBit(); sps.strong_intra_smoothing_enabled_flag = bs.GetBit(); sps.vui_parameters_present_flag = bs.GetBit(); bErr = sps.vui_parameters_present_flag && Res2Bool(sts, ParseVUI(bs, sps)); MFX_CHECK(!bErr, sts); sps.extension_flag = bs.GetBit(); MFX_CHECK(sps.extension_flag, sts); sps.range_extension_flag = bs.GetBit(); sps.ExtensionFlags = mfxU8((sps.range_extension_flag << 7) + bs.GetBits(7)); sps.transform_skip_rotation_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.transform_skip_context_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.implicit_rdpcm_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.explicit_rdpcm_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.extended_precision_processing_flag = bs.CondBit(sps.range_extension_flag, 0); sps.intra_smoothing_disabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.high_precision_offsets_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.persistent_rice_adaptation_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); sps.cabac_bypass_alignment_enabled_flag = bs.CondBit(sps.range_extension_flag, 0); mfxU8 extFlags = (sps.ExtensionFlags << 1); MFX_CHECK(!(extFlags && !m_readSpsExt), MFX_ERR_UNSUPPORTED); MFX_CHECK(extFlags && m_readSpsExt, MFX_ERR_NONE); for (mfxU8 extId = 1; extFlags; extId++) { MFX_CHECK(!(extFlags & 0x80) || m_readSpsExt(sps, extId, bs), MFX_ERR_UNSUPPORTED); extFlags <<= 1; } } catch (std::exception &) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } mfxStatus Parser::ParsePPS(BitstreamReader& bs, PPS & pps) { NALU nalu = {}; pps = PPS{}; do { mfxStatus sts = ParseNALU(bs, nalu); MFX_CHECK_STS(sts); } while (nalu.nal_unit_type != PPS_NUT); try { pps.pic_parameter_set_id = bs.GetUE(); pps.seq_parameter_set_id = bs.GetUE(); pps.dependent_slice_segments_enabled_flag = bs.GetBit(); pps.output_flag_present_flag = bs.GetBit(); pps.num_extra_slice_header_bits = bs.GetBits(3); pps.sign_data_hiding_enabled_flag = bs.GetBit(); pps.cabac_init_present_flag = bs.GetBit(); pps.num_ref_idx_l0_default_active_minus1 = bs.GetUE(); pps.num_ref_idx_l1_default_active_minus1 = bs.GetUE(); pps.init_qp_minus26 = bs.GetSE(); pps.constrained_intra_pred_flag = bs.GetBit(); pps.transform_skip_enabled_flag = bs.GetBit(); pps.cu_qp_delta_enabled_flag = bs.GetBit(); pps.diff_cu_qp_delta_depth = bs.CondUE(pps.cu_qp_delta_enabled_flag, 0); pps.cb_qp_offset = bs.GetSE(); pps.cr_qp_offset = bs.GetSE(); pps.slice_chroma_qp_offsets_present_flag = bs.GetBit(); pps.weighted_pred_flag = bs.GetBit(); pps.weighted_bipred_flag = bs.GetBit(); pps.transquant_bypass_enabled_flag = bs.GetBit(); pps.tiles_enabled_flag = bs.GetBit(); pps.entropy_coding_sync_enabled_flag = bs.GetBit(); pps.num_tile_columns_minus1 = (mfxU16)bs.CondUE(pps.tiles_enabled_flag, 0); pps.num_tile_rows_minus1 = (mfxU16)bs.CondUE(pps.tiles_enabled_flag, 0); pps.uniform_spacing_flag = bs.CondBit(pps.tiles_enabled_flag, 1); std::generate_n( pps.column_width , pps.num_tile_columns_minus1 * !pps.uniform_spacing_flag , [&]() { return mfxU16(bs.GetUE() + 1); }); std::generate_n( pps.row_height , pps.num_tile_rows_minus1 * !pps.uniform_spacing_flag , [&]() { return mfxU16(bs.GetUE() + 1); }); pps.loop_filter_across_tiles_enabled_flag = bs.CondBit(pps.tiles_enabled_flag, 0); pps.loop_filter_across_slices_enabled_flag = bs.GetBit(); pps.deblocking_filter_control_present_flag = bs.GetBit(); pps.deblocking_filter_override_enabled_flag = bs.CondBit(pps.deblocking_filter_control_present_flag, 0); pps.deblocking_filter_disabled_flag = bs.CondBit(pps.deblocking_filter_control_present_flag, 0); bool bDblkOffsets = pps.deblocking_filter_control_present_flag && !pps.deblocking_filter_disabled_flag; pps.beta_offset_div2 = bs.CondSE(bDblkOffsets, 0); pps.tc_offset_div2 = bs.CondSE(bDblkOffsets, 0); pps.scaling_list_data_present_flag = bs.GetBit(); MFX_CHECK(!pps.scaling_list_data_present_flag, MFX_ERR_UNSUPPORTED); pps.lists_modification_present_flag = bs.GetBit(); pps.log2_parallel_merge_level_minus2 = (mfxU16)bs.GetUE(); pps.slice_segment_header_extension_present_flag = bs.GetBit(); pps.extension_flag = bs.GetBit(); MFX_CHECK(pps.extension_flag, MFX_ERR_NONE); pps.range_extension_flag = bs.GetBit(); pps.ExtensionFlags = mfxU8((pps.range_extension_flag << 7) + bs.GetBits(7)); pps.log2_max_transform_skip_block_size_minus2 = bs.CondUE( pps.range_extension_flag && pps.transform_skip_enabled_flag, 0); pps.cross_component_prediction_enabled_flag = bs.CondBit(pps.range_extension_flag, 0); pps.chroma_qp_offset_list_enabled_flag = bs.CondBit(pps.range_extension_flag, 0); pps.diff_cu_chroma_qp_offset_depth = bs.CondUE(pps.chroma_qp_offset_list_enabled_flag, 0); pps.chroma_qp_offset_list_len_minus1 = bs.CondUE(pps.chroma_qp_offset_list_enabled_flag, 0); mfxU32 nChromaQpOffsets = (pps.chroma_qp_offset_list_len_minus1 + 1) * pps.chroma_qp_offset_list_enabled_flag; for (mfxU32 i = 0; i < nChromaQpOffsets; i++) { pps.cb_qp_offset_list[i] = (mfxI8)bs.GetSE(); pps.cr_qp_offset_list[i] = (mfxI8)bs.GetSE(); } pps.log2_sao_offset_scale_luma = bs.CondUE(pps.range_extension_flag, 0); pps.log2_sao_offset_scale_chroma = bs.CondUE(pps.range_extension_flag, 0); mfxU8 extFlags = (pps.ExtensionFlags << 1); MFX_CHECK(!extFlags || m_readPpsExt, MFX_ERR_UNSUPPORTED); MFX_CHECK(extFlags && m_readPpsExt, MFX_ERR_NONE); for (mfxU8 extId = 1; extFlags; extId++) { bool bExtSts = !(extFlags & 0x80) || m_readPpsExt(pps, extId, bs); MFX_CHECK(bExtSts, MFX_ERR_UNSUPPORTED); extFlags <<= 1; } } catch (std::exception &) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } const mfxU8 AspectRatioByIdc[][2] = { { 0, 0}, { 1, 1}, { 12, 11}, { 10, 11}, { 16, 11}, { 40, 33}, { 24, 11}, { 20, 11}, { 32, 11}, { 80, 33}, { 18, 11}, { 15, 11}, { 64, 33}, {160, 99}, { 4, 3}, { 3, 2}, { 2, 1}, }; mfxStatus Parser::SpsToMFX(const SPS& sps, mfxVideoParam& par) { mfxExtHEVCParam* pHEVCParam = ExtBuffer::Get(par); mfxExtCodingOption* pCO = ExtBuffer::Get(par); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); mfxFrameInfo& fi = par.mfx.FrameInfo; mfxU16 SubWidthC[4] = { 1, 2, 2, 1 }; mfxU16 SubHeightC[4] = { 1, 2, 1, 1 }; mfxU16 cropUnitX = SubWidthC[sps.chroma_format_idc]; mfxU16 cropUnitY = SubHeightC[sps.chroma_format_idc]; par.mfx.CodecProfile = sps.general.profile_idc; par.mfx.CodecLevel = sps.general.level_idc / 3; par.mfx.CodecLevel |= (sps.general.tier_flag * MFX_TIER_HEVC_HIGH); if (pHEVCParam) { pHEVCParam->GeneralConstraintFlags = sps.general.rext_constraint_flags_0_31; pHEVCParam->GeneralConstraintFlags |= ((mfxU64)sps.general.rext_constraint_flags_32_42 << 32); pHEVCParam->PicWidthInLumaSamples = (mfxU16)sps.pic_width_in_luma_samples; pHEVCParam->PicHeightInLumaSamples = (mfxU16)sps.pic_height_in_luma_samples; } par.mfx.NumRefFrame = sps.sub_layer[0].max_dec_pic_buffering_minus1; par.mfx.FrameInfo.ChromaFormat = sps.chroma_format_idc; fi.BitDepthLuma = sps.bit_depth_luma_minus8 + 8; fi.BitDepthChroma = sps.bit_depth_chroma_minus8 + 8; if (pCO3) { pCO3->TargetChromaFormatPlus1 = 1 + sps.chroma_format_idc; pCO3->TargetBitDepthLuma = sps.bit_depth_luma_minus8 + 8; pCO3->TargetBitDepthChroma = sps.bit_depth_chroma_minus8 + 8; } fi.Width = mfx::align2_value((mfxU16)sps.pic_width_in_luma_samples, HW_SURF_ALIGN_W); fi.Height = mfx::align2_value((mfxU16)sps.pic_height_in_luma_samples, HW_SURF_ALIGN_H); fi.CropX = 0; fi.CropY = 0; fi.CropW = fi.Width; fi.CropH = fi.Height; fi.CropX += cropUnitX * (mfxU16)sps.conf_win_left_offset; fi.CropW -= cropUnitX * (mfxU16)sps.conf_win_left_offset; fi.CropW -= cropUnitX * (mfxU16)sps.conf_win_right_offset; fi.CropY += cropUnitY * (mfxU16)sps.conf_win_top_offset; fi.CropH -= cropUnitY * (mfxU16)sps.conf_win_top_offset; fi.CropH -= cropUnitY * (mfxU16)sps.conf_win_bottom_offset; MFX_CHECK(sps.vui_parameters_present_flag, MFX_ERR_NONE); auto& vui = sps.vui; bool bArFromSarWH = vui.aspect_ratio_info_present_flag && vui.aspect_ratio_idc == 255; SetIf(fi.AspectRatioW, bArFromSarWH, vui.sar_width); SetIf(fi.AspectRatioH, bArFromSarWH, vui.sar_height); bool bArFromIdc = vui.aspect_ratio_info_present_flag && !bArFromSarWH && vui.aspect_ratio_idc < mfx::size(AspectRatioByIdc); auto ArIdc = vui.aspect_ratio_idc * bArFromIdc; SetIf(fi.AspectRatioW, bArFromIdc, AspectRatioByIdc[ArIdc][0]); SetIf(fi.AspectRatioH, bArFromIdc, AspectRatioByIdc[ArIdc][1]); SetIf(fi.FrameRateExtN, vui.timing_info_present_flag, vui.time_scale); SetIf(fi.FrameRateExtD, vui.timing_info_present_flag, vui.num_units_in_tick); cropUnitX *= vui.default_display_window_flag; cropUnitY *= vui.default_display_window_flag; fi.CropX += cropUnitX * (mfxU16)vui.def_disp_win_left_offset; fi.CropW -= cropUnitX * (mfxU16)vui.def_disp_win_left_offset; fi.CropW -= cropUnitX * (mfxU16)vui.def_disp_win_right_offset; fi.CropY += cropUnitY * (mfxU16)vui.def_disp_win_top_offset; fi.CropH -= cropUnitY * (mfxU16)vui.def_disp_win_top_offset; fi.CropH -= cropUnitY * (mfxU16)vui.def_disp_win_bottom_offset; MFX_CHECK(sps.vui.hrd_parameters_present_flag, MFX_ERR_NONE); if (pCO) pCO->VuiNalHrdParameters = MFX_CODINGOPTION_ON; auto& hrd = sps.vui.hrd; auto& sl0 = hrd.sl[0]; auto& cpb0 = sl0.cpb[0]; MaxKbps(par.mfx) = ((cpb0.bit_rate_value_minus1 + 1) << (6 + hrd.bit_rate_scale)) / 1000; BufferSizeInKB(par.mfx) = ((cpb0.cpb_size_value_minus1 + 1) << (4 + hrd.cpb_size_scale)) / 8000; par.mfx.TargetKbps = par.mfx.MaxKbps; par.mfx.RateControlMethod = MFX_RATECONTROL_CBR * cpb0.cbr_flag + MFX_RATECONTROL_VBR * !cpb0.cbr_flag; return MFX_ERR_NONE; } mfxStatus Parser::PpsToMFX(const PPS& pps, mfxVideoParam& par) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); if (pCO3) { std::fill_n(pCO3->NumRefActiveP, 8, mfxU16(pps.num_ref_idx_l0_default_active_minus1 + 1)); std::fill_n(pCO3->NumRefActiveBL1, 8, mfxU16(pps.num_ref_idx_l1_default_active_minus1 + 1)); pCO3->TransformSkip = (pps.transform_skip_enabled_flag ? (mfxU16)MFX_CODINGOPTION_ON : (mfxU16)MFX_CODINGOPTION_OFF); } mfxExtHEVCTiles* pTiles = ExtBuffer::Get(par); bool bSetTiles = pps.tiles_enabled_flag && pTiles; if (bSetTiles) { pTiles->NumTileColumns = pps.num_tile_columns_minus1 + 1; pTiles->NumTileRows = pps.num_tile_rows_minus1 + 1; } return MFX_ERR_NONE; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_parser.h000066400000000000000000000061351443134507600340540ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class BitstreamReader : public IBsReader { public: BitstreamReader(mfxU8* bs, mfxU32 size, mfxU8 bitOffset = 0); ~BitstreamReader(); virtual mfxU32 GetBit() override; virtual mfxU32 GetBits(mfxU32 n) override; virtual mfxU32 GetUE() override; virtual mfxI32 GetSE() override; mfxU32 GetOffset() { return (mfxU32)(m_bs - m_bsStart) * 8 + m_bitOffset - m_bitStart; } mfxU8* GetStart() { return m_bsStart; } void SetEmulation(bool f) { m_emulation = f; }; bool GetEmulation() { return m_emulation; }; void Reset(mfxU8* bs = 0, mfxU32 size = 0, mfxU8 bitOffset = 0); private: mfxU8 * m_bsStart; mfxU8* m_bsEnd; mfxU8* m_bs; mfxU8 m_bitStart; mfxU8 m_bitOffset; bool m_emulation; }; class Parser : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(LoadSPSPPS) #define DECL_FEATURE_NAME "Base_Parser" #include "hevcehw_decl_blocks.h" Parser(mfxU32 id) : FeatureBase(id) {} protected: std::function m_needRextConstraints; std::function m_readSpsExt; std::function m_readPpsExt; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; mfxStatus LoadSPSPPS(mfxVideoParam& par, SPS & sps, PPS & pps); mfxStatus ParseNALU(BitstreamReader& bs, NALU & nalu); mfxStatus ParseSPS(BitstreamReader& bs, SPS & sps); mfxStatus ParsePPS(BitstreamReader& bs, PPS & pps); mfxStatus SpsToMFX(const SPS& sps, mfxVideoParam& par); mfxStatus PpsToMFX(const PPS& pps, mfxVideoParam& par); }; } //Base } //namespace HEVCEHW #endif hevcehw_base_query_impl_desc.cpp000066400000000000000000000215151443134507600362760ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_query_impl_desc.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void QueryImplDesc::QueryImplsDescription(const FeatureBlocks& blocks, TPushQID Push) { auto Query = [&blocks]( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah , StorageRW&) -> mfxStatus { const mfxU32 FourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_YV12 , MFX_FOURCC_NV16 , MFX_FOURCC_YUY2 , MFX_FOURCC_RGB565 , MFX_FOURCC_RGBP , MFX_FOURCC_RGB4 , MFX_FOURCC_P010 , MFX_FOURCC_P016 , MFX_FOURCC_P210 , MFX_FOURCC_BGR4 , MFX_FOURCC_A2RGB10 , MFX_FOURCC_ARGB16 , MFX_FOURCC_ABGR16 , MFX_FOURCC_AYUV , MFX_FOURCC_AYUV_RGB4 , MFX_FOURCC_UYVY , MFX_FOURCC_Y210 , MFX_FOURCC_Y410 , MFX_FOURCC_Y216 , MFX_FOURCC_Y416 , MFX_FOURCC_NV21 , MFX_FOURCC_IYUV , MFX_FOURCC_I010 }; struct Config { mfxU16 Profile; mfxU32 FourCC; mfxU16 BitDepth; mfxU16 Shift; mfxU16 CromaFormat; mfxU16 LowPower; }; const Config cfgs[] = { {MFX_PROFILE_HEVC_MAIN , MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_MAIN , MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_ON} , {MFX_PROFILE_HEVC_MAIN10, MFX_FOURCC_P010, 10, 1, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_MAIN10, MFX_FOURCC_P010, 10, 1, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_ON} , {MFX_PROFILE_HEVC_MAINSP, MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_MAINSP, MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_ON} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_YUY2, 8, 0, MFX_CHROMAFORMAT_YUV422, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_AYUV, 8, 0, MFX_CHROMAFORMAT_YUV444, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_P010, 10, 1, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_Y210, 10, 1, MFX_CHROMAFORMAT_YUV422, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_Y410, 10, 0, MFX_CHROMAFORMAT_YUV444, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_P016, 12, 1, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_Y216, 12, 1, MFX_CHROMAFORMAT_YUV422, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_REXT , MFX_FOURCC_Y416, 12, 1, MFX_CHROMAFORMAT_YUV444, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_SCC , MFX_FOURCC_NV12, 8, 0, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_SCC , MFX_FOURCC_P010, 10, 1, MFX_CHROMAFORMAT_YUV420, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_SCC , MFX_FOURCC_AYUV, 8, 0, MFX_CHROMAFORMAT_YUV444, MFX_CODINGOPTION_UNKNOWN} , {MFX_PROFILE_HEVC_SCC , MFX_FOURCC_Y410, 10, 0, MFX_CHROMAFORMAT_YUV444, MFX_CODINGOPTION_UNKNOWN} }; auto& queryNC = FeatureBlocks::BQ::Get(blocks); auto& queryWC = FeatureBlocks::BQ::Get(blocks); caps.CodecID = MFX_CODEC_HEVC; caps.MaxcodecLevel = (MFX_TIER_HEVC_HIGH | MFX_LEVEL_HEVC_62); caps.BiDirectionalPrediction = 0; struct TmpCaps { mfxRange32U Width = {0xffffffff, 0, 0xffffffff}; mfxRange32U Height = {0xffffffff, 0, 0xffffffff}; std::list FourCC; }; std::map tmpCaps; for (auto& cfg : cfgs) { StorageRW tmpStorage; tmpStorage.Insert(Glob::VideoCore::Key, new StorableRef(core)); ExtBuffer::Param in, out; in.mfx.CodecId = out.mfx.CodecId = caps.CodecID; in.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; in.mfx.CodecProfile = cfg.Profile; in.mfx.FrameInfo.Width = 1920; in.mfx.FrameInfo.Height = 1088; in.mfx.FrameInfo.FourCC = cfg.FourCC; in.mfx.FrameInfo.ChromaFormat = cfg.CromaFormat; in.mfx.FrameInfo.BitDepthLuma = cfg.BitDepth; in.mfx.FrameInfo.Shift = cfg.Shift; in.mfx.LowPower = cfg.LowPower; auto pCO3 = (mfxExtCodingOption3*)in.NewEB(MFX_EXTBUFF_CODING_OPTION3); out.NewEB(MFX_EXTBUFF_CODING_OPTION3); MFX_CHECK(pCO3, MFX_ERR_UNKNOWN); pCO3->TargetBitDepthLuma = cfg.BitDepth; pCO3->TargetChromaFormatPlus1 = cfg.CromaFormat + 1; if (MFX_ERR_NONE != RunBlocks(CheckGE, queryNC, in, out, tmpStorage)) continue; if (MFX_ERR_NONE != RunBlocks(CheckGE, queryWC, in, out, tmpStorage)) continue; auto& currCaps = tmpCaps[cfg.Profile]; Defaults::Param defs( out , Glob::EncodeCaps::Get(tmpStorage) , core.GetHWType() , Glob::Defaults::Get(tmpStorage)); auto IsUnsupportedFourCC = [&](mfxU32 fcc) { out.mfx.FrameInfo.FourCC = fcc; return defs.base.CheckFourCC(defs, out) != MFX_ERR_NONE; }; mfxU32 step = defs.base.GetCodedPicAlignment(defs); std::list supportedFourCC(std::begin(FourCC), std::end(FourCC)); supportedFourCC.remove_if(IsUnsupportedFourCC); currCaps.FourCC.splice(currCaps.FourCC.end(), supportedFourCC); CheckMaxOrClip(currCaps.Width.Step, step); CheckMinOrClip(currCaps.Width.Max, defs.caps.MaxPicWidth); currCaps.Width.Min = currCaps.Width.Step; CheckMaxOrClip(currCaps.Height.Step, step); CheckMinOrClip(currCaps.Height.Max, defs.caps.MaxPicHeight); currCaps.Height.Min = currCaps.Height.Step; caps.BiDirectionalPrediction |= !defs.caps.SliceIPOnly; } for (auto& intCaps : tmpCaps) { auto& profileCaps = ah.PushBack(caps.Profiles); profileCaps.Profile = intCaps.first; { auto& memCaps = ah.PushBack(profileCaps.MemDesc); memCaps.Width = intCaps.second.Width; memCaps.Height = intCaps.second.Height; intCaps.second.FourCC.sort(); intCaps.second.FourCC.unique(); for (mfxU32 fcc : intCaps.second.FourCC) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } } ah.PushBack(profileCaps.MemDesc); profileCaps.MemDesc[1] = profileCaps.MemDesc[0]; profileCaps.MemDesc[0].MemHandleType = MFX_RESOURCE_SYSTEM_SURFACE; profileCaps.MemDesc[1].MemHandleType = core.GetVAType() == MFX_HW_VAAPI ? MFX_RESOURCE_VA_SURFACE : MFX_RESOURCE_DX11_TEXTURE; profileCaps.NumMemTypes = 2; ++caps.NumProfiles; } return MFX_ERR_NONE; }; Push(BLK_Query, Query); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_query_impl_desc.h000066400000000000000000000033031443134507600357360ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class QueryImplDesc : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(Query) #define DECL_FEATURE_NAME "Base_QueryImplDesc" #include "hevcehw_decl_blocks.h" QueryImplDesc(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: void QueryImplsDescription(const FeatureBlocks& blocks, TPushQID Push) override; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_recon_info.cpp000066400000000000000000000067061443134507600352400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_recon_info.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void ReconInfo::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetRecInfo , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); mfxFrameAllocRequest rec = {}; if (GetRecInfo(par, ExtBuffer::Get(par), rec.Info)) { Tmp::RecInfo::GetOrConstruct(local, rec); SetDefault(rec.NumFrameMin, GetMaxRec(par)); } return MFX_ERR_NONE; }); } void ReconInfo::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_AllocRec , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts = MFX_ERR_NONE; auto& par = Glob::VideoParam::Get(strg); std::unique_ptr pAlloc(Tmp::MakeAlloc::Get(local)(Glob::VideoCore::Get(strg))); MFX_CHECK(local.Contains(Tmp::RecInfo::Key), MFX_ERR_UNDEFINED_BEHAVIOR); auto& req = Tmp::RecInfo::Get(local); SetDefault(req.NumFrameMin, GetMaxRec(par)); SetDefault(req.Type , mfxU16(MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET)); sts = pAlloc->Alloc(req, false); MFX_CHECK_STS(sts); strg.Insert(Glob::AllocRec::Key, std::move(pAlloc)); return sts; }); } mfxU16 ReconInfo::GetMaxRec(mfxVideoParam const & par) { return par.AsyncDepth + par.mfx.NumRefFrame + (par.AsyncDepth > 1); } bool ReconInfo::GetRecInfo( const mfxVideoParam& par , const mfxExtCodingOption3& CO3 , mfxFrameInfo& rec) { rec = par.mfx.FrameInfo; auto& rModRec = ModRec[CO3.TargetBitDepthLuma == 10]; auto itModRec = rModRec.find(CO3.TargetChromaFormatPlus1); bool bUndef = (CO3.TargetBitDepthLuma != 8 && CO3.TargetBitDepthLuma != 10) || (itModRec == rModRec.end()); if (!bUndef) { itModRec->second(rec); } rec.ChromaFormat = CO3.TargetChromaFormatPlus1 - 1; rec.BitDepthLuma = CO3.TargetBitDepthLuma; rec.BitDepthChroma = CO3.TargetBitDepthChroma; return true; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_base_recon_info.h000066400000000000000000000041411443134507600346740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class ReconInfo : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetRecInfo) \ DECL_BLOCK(AllocRec) #define DECL_FEATURE_NAME "Base_ReconInfo" #include "hevcehw_decl_blocks.h" ReconInfo(mfxU32 FeatureId) : FeatureBase(FeatureId) { } protected: typedef std::function RecUpd; std::map ModRec[2]; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push); virtual void InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push); mfxU16 GetMaxRec(mfxVideoParam const & par); bool GetRecInfo( const mfxVideoParam& par , const mfxExtCodingOption3& CO3 , mfxFrameInfo& rec); }; } //Base } //namespace HEVCEHW #endif hevcehw_base_rext.cpp000066400000000000000000000223521443134507600340740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_rext.h" #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void RExt::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetRecInfo , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& par = Base::Glob::VideoParam::Get(strg); mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); bool bG12SpecificRec = (CO3.TargetBitDepthLuma == 12 || CO3.TargetBitDepthLuma == 10) && (CO3.TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV420) || CO3.TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV422)); bG12SpecificRec = bG12SpecificRec || (CO3.TargetBitDepthLuma == 12 && CO3.TargetChromaFormatPlus1 == (1 + MFX_CHROMAFORMAT_YUV444)); MFX_CHECK(bG12SpecificRec, MFX_ERR_NONE); local.Erase(Base::Tmp::RecInfo::Key); auto pRI = make_storable(mfxFrameAllocRequest{}); auto& rec = pRI->Info; rec = par.mfx.FrameInfo; auto itUpdateRecInfo = mUpdateRecInfo.find(CO3.TargetChromaFormatPlus1); bool bUndef = (itUpdateRecInfo == mUpdateRecInfo.end()); if (!bUndef) mUpdateRecInfo.at(CO3.TargetChromaFormatPlus1)(rec, pRI->Type, IsOn(par.mfx.LowPower)); rec.ChromaFormat = CO3.TargetChromaFormatPlus1 - 1; rec.BitDepthLuma = CO3.TargetBitDepthLuma; rec.BitDepthChroma = CO3.TargetBitDepthChroma; local.Insert(Base::Tmp::RecInfo::Key, std::move(pRI)); return MFX_ERR_NONE; }); } void RExt::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetDefaultsCallChain , [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.CheckFourCC.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { MFX_CHECK(IsRextFourCC(par.mfx.FrameInfo.FourCC), prev(dpar, par)); return MFX_ERR_NONE; }); defaults.CheckInputFormatByFourCC.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { MFX_CHECK(IsRextFourCC(par.mfx.FrameInfo.FourCC), prev(dpar, par)); auto& fi = par.mfx.FrameInfo; mfxU32 invalid = 0; if (IsOn(par.mfx.LowPower)) { invalid += Check(fi.BitDepthLuma); invalid += Check(fi.BitDepthChroma); } else { invalid += CheckOrZero(fi.BitDepthLuma); invalid += CheckOrZero(fi.BitDepthChroma); } invalid += (fi.FourCC == MFX_FOURCC_P016) && CheckOrZero(fi.ChromaFormat); invalid += (fi.FourCC == MFX_FOURCC_Y216) && CheckOrZero(fi.ChromaFormat); invalid += (fi.FourCC == MFX_FOURCC_Y416) && CheckOrZero(fi.ChromaFormat); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; }); defaults.CheckTargetBitDepth.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3 && IsRextFourCC(par.mfx.FrameInfo.FourCC), prev(dpar, par)); mfxU32 invalid = 0; if (IsOn(par.mfx.LowPower)) { invalid += CheckOrZero(pCO3->TargetBitDepthLuma); invalid += CheckOrZero(pCO3->TargetBitDepthChroma); } else { invalid += CheckOrZero(pCO3->TargetBitDepthLuma); invalid += CheckOrZero(pCO3->TargetBitDepthChroma); } MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; }); defaults.CheckFourCCByTargetFormat.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { MFX_CHECK(IsRextFourCC(par.mfx.FrameInfo.FourCC), prev(dpar, par)); auto tcf = dpar.base.GetTargetChromaFormat(dpar); auto& fi = par.mfx.FrameInfo; mfxU32 invalid = 0; invalid += (tcf == MFX_CHROMAFORMAT_YUV444 + 1) && Check(fi.FourCC); invalid += (tcf == MFX_CHROMAFORMAT_YUV422 + 1) && Check(fi.FourCC); MFX_CHECK(!invalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; }); defaults.CheckProfile.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { MFX_CHECK(IsRextFourCC(par.mfx.FrameInfo.FourCC), prev(dpar, par)); bool bInvalid = CheckOrZero(par.mfx.CodecProfile); MFX_CHECK(!bInvalid, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; }); defaults.GetMaxChromaByFourCC.Push( [](Base::Defaults::TChain::TExt prev , const Base::Defaults::Param& dpar) { MFX_CHECK(IsRextFourCC(dpar.mvp.mfx.FrameInfo.FourCC), prev(dpar)); auto fcc = dpar.mvp.mfx.FrameInfo.FourCC; return mfxU16( (fcc == MFX_FOURCC_P016) * MFX_CHROMAFORMAT_YUV420 + (fcc == MFX_FOURCC_Y216) * MFX_CHROMAFORMAT_YUV422 + (fcc == MFX_FOURCC_Y416) * MFX_CHROMAFORMAT_YUV444); }); defaults.GetMaxBitDepthByFourCC.Push( [](Base::Defaults::TChain::TExt prev , const Base::Defaults::Param& dpar) { MFX_CHECK(IsRextFourCC(dpar.mvp.mfx.FrameInfo.FourCC), prev(dpar)); return mfxU16(12); }); defaults.RunFastCopyWrapper.Push( [](Base::Defaults::TRunFastCopyWrapper::TExt prev , mfxFrameSurface1 &surfDst , mfxU16 dstMemType , mfxFrameSurface1 &surfSrc , mfxU16 srcMemType) { // convert to native shift in core.CopyFrame() if required surfDst.Info.Shift |= (mfxU16) (surfDst.Info.FourCC == MFX_FOURCC_P016 || surfDst.Info.FourCC == MFX_FOURCC_Y216); return prev( surfDst , dstMemType , surfSrc , srcMemType); }); bSet = true; return MFX_ERR_NONE; }); } void RExt::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckShift , [](const mfxVideoParam&, mfxVideoParam& out, StorageW&) -> mfxStatus { auto& fi = out.mfx.FrameInfo; bool bVideoMem = Base::Legacy::IsInVideoMem(out); bool bNeedShift = (bVideoMem && !fi.Shift) && ( fi.FourCC == MFX_FOURCC_P016 || fi.FourCC == MFX_FOURCC_Y216 || fi.FourCC == MFX_FOURCC_Y416); SetIf(fi.Shift, bNeedShift, 1); MFX_CHECK(!bNeedShift, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); Push(BLK_HardcodeCaps , [](const mfxVideoParam& par, mfxVideoParam&, StorageRW& strg) -> mfxStatus { Base::Glob::EncodeCaps::Get(strg).MaxEncodedBitDepth = IsOn(par.mfx.LowPower) ? 1 : 2; return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_rext.h000066400000000000000000000042771443134507600335470ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class RExt : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetRecInfo)\ DECL_BLOCK(HardcodeCaps)\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(CheckShift) #define DECL_FEATURE_NAME "Base_RExt" #include "hevcehw_decl_blocks.h" RExt(mfxU32 FeatureId) : FeatureBase(FeatureId) { } protected: virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; static bool IsRextFourCC(mfxU32 FourCC) { return !Check(FourCC); } typedef std::function RecUpd; std::map mUpdateRecInfo; }; } //Base } //namespace HEVCEHW #endif hevcehw_base_roi.cpp000066400000000000000000000164111443134507600337020ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_ROI) #include "hevcehw_base_roi.h" #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; static mfxStatus CheckAndFixRect( ROI::RectData& rect , mfxVideoParam const & par , ENCODE_CAPS_HEVC const & caps) { mfxU32 changed = 0; changed += CheckMaxOrClip(rect.Left, par.mfx.FrameInfo.Width); changed += CheckMaxOrClip(rect.Right, par.mfx.FrameInfo.Width); changed += CheckMaxOrClip(rect.Top, par.mfx.FrameInfo.Height); changed += CheckMaxOrClip(rect.Bottom, par.mfx.FrameInfo.Height); mfxU32 blockSize = 1 << (caps.BlockSize + 3); changed += AlignDown(rect.Left, blockSize); changed += AlignDown(rect.Top, blockSize); changed += AlignUp(rect.Right, blockSize); changed += AlignUp(rect.Bottom, blockSize); if(rect.Left == 0 && rect.Top == 0 && rect.Right == 0 && rect.Bottom == 0) { rect.Right = blockSize;//expand zero rectangle to min supported size rect.Bottom = blockSize; changed++; } MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus ROI::CheckAndFixROI( ENCODE_CAPS_HEVC const & caps , mfxVideoParam const & par , mfxExtEncoderROI& roi) { mfxStatus sts = MFX_ERR_NONE, rsts = MFX_ERR_NONE; mfxU32 changed = 0, invalid = 0; bool bROIViaMBQP = (Legacy::GetMBQPMode(caps, par) == MBQPMode_ForROI); changed += CheckOrZero(roi.ROIMode, MFX_ROI_MODE_PRIORITY, MFX_ROI_MODE_QP_DELTA); if (!bROIViaMBQP) { invalid += !(roi.ROIMode != MFX_ROI_MODE_QP_DELTA || caps.ROIDeltaQPSupport); roi.ROIMode *= !invalid; invalid += !(par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR || par.mfx.RateControlMethod == MFX_RATECONTROL_CQP || par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR); invalid += !(caps.MaxNumOfROI); invalid += !(par.mfx.RateControlMethod != MFX_RATECONTROL_CQP || caps.ROIDeltaQPSupport); } mfxU16 maxNumOfRoi = !invalid * std::max( mfxU16(bROIViaMBQP * (caps.MbQpDataSupport * ROI::MAX_NUM_ROI)) , mfxU16(!bROIViaMBQP * caps.MaxNumOfROI)); changed += CheckMaxOrClip(roi.NumROI, maxNumOfRoi); mfxI16 minVal = std::min(-51 * (roi.ROIMode == MFX_ROI_MODE_QP_DELTA), -3); mfxI16 maxVal = std::max(51 * (roi.ROIMode == MFX_ROI_MODE_QP_DELTA), 3); std::for_each(roi.ROI, roi.ROI + roi.NumROI , [&](ROI::RectData& rect) { rsts = GetWorstSts(rsts, CheckAndFixRect(rect, par, caps)); invalid += CheckMinOrZero(rect.Priority, minVal); invalid += CheckMaxOrZero(rect.Priority, maxVal); if (roi.ROIMode == MFX_ROI_MODE_PRIORITY && !caps.ROIBRCPriorityLevelSupport) { // Priority mode is not supported. Convert it to delta QP mode roi.ROI->DeltaQP = (mfxI16)(-1 * roi.ROI->Priority); } }); auto IsInvalidRect = [](const ROI::RectData& rect) { return ((rect.Left >= rect.Right) || (rect.Top >= rect.Bottom)); }; mfxU16 numValidROI = mfxU16(std::remove_if(roi.ROI, roi.ROI + roi.NumROI, IsInvalidRect) - roi.ROI); changed += CheckMaxOrClip(roi.NumROI, numValidROI); if (roi.NumROI && roi.ROIMode == MFX_ROI_MODE_PRIORITY && !caps.ROIBRCPriorityLevelSupport) { // Priority mode is not supported. Convert it to delta QP mode roi.ROIMode = MFX_ROI_MODE_QP_DELTA; changed++; } sts = GetWorstSts( mfxStatus(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM * !!changed) , mfxStatus(MFX_ERR_UNSUPPORTED * !!invalid)); return GetWorstSts(sts, rsts); } void ROI::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_ENCODER_ROI].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& src = *(const mfxExtEncoderROI*)pSrc; auto& dst = *(mfxExtEncoderROI*)pDst; dst.NumROI = src.NumROI; dst.ROIMode = src.ROIMode; std::transform(src.ROI, src.ROI + mfx::size(src.ROI), dst.ROI , [](const RectData& s) { RectData d = {}; d.Left = s.Left; d.Top = s.Top; d.Right = s.Right; d.Bottom = s.Bottom; d.DeltaQP = s.DeltaQP; return d; }); }); } void ROI::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [this](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtEncoderROI* pROI = ExtBuffer::Get(par); MFX_CHECK(pROI && pROI->NumROI, MFX_ERR_NONE); auto& caps = Glob::EncodeCaps::Get(global); mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); bool changed = false; auto sts = CheckAndFixROI(caps, par, *pROI); MFX_CHECK(sts >= MFX_ERR_NONE && pCO3, sts); return GetWorstSts(sts, mfxStatus(changed * MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)); }); } void ROI::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [this](mfxVideoParam& , StorageW& strg, StorageRW&) { auto& defaults = Glob::Defaults::Get(strg); auto& bSet = defaults.SetForFeature[GetID()]; if (!bSet) { defaults.GetPPS.Push([]( Defaults::TGetPPS::TExt prev , const Defaults::Param& defPar , const Base::SPS& sps , Base::PPS& pps) { auto sts = prev(defPar, sps, pps); pps.cu_qp_delta_enabled_flag |= !!((const mfxExtEncoderROI&)ExtBuffer::Get(defPar.mvp)).NumROI; return sts; }); bSet = true; } return MFX_ERR_NONE; }); } void ROI::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetPPS , [this](StorageRW& strg, StorageRW&) -> mfxStatus { m_bViaCuQp = (Legacy::GetMBQPMode(Glob::EncodeCaps::Get(strg), Glob::VideoParam::Get(strg)) == MBQPMode_ForROI); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_HEVCE_ROI) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base/hevcehw_base_roi.h000066400000000000000000000046441443134507600334330ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_ROI) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class ROI : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(SetCallChains)\ DECL_BLOCK(SetPPS)\ DECL_BLOCK(ConfigureTask)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_ROI" #include "hevcehw_decl_blocks.h" ROI(mfxU32 FeatureId) : FeatureBase(FeatureId) {} typedef std::remove_reference::type RectData; static const mfxU32 MAX_NUM_ROI = 16; protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST /*Push*/) override {}; virtual void SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; mfxStatus CheckAndFixROI( ENCODE_CAPS_HEVC const & caps , mfxVideoParam const & par , mfxExtEncoderROI& roi); bool m_bViaCuQp = false; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_HEVCE_ROI) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base/hevcehw_base_sao.h000066400000000000000000000056421443134507600334230ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class SAO : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetDefaultsCallChain) #define DECL_FEATURE_NAME "Base_SAO" #include "hevcehw_decl_blocks.h" SAO(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override { Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.CheckSAO.Push([]( Base::Defaults::TCheckAndFix::TExt , const Base::Defaults::Param& defPar , mfxVideoParam& par) { mfxExtHEVCParam* pHEVC = ExtBuffer::Get(par); MFX_CHECK(pHEVC, MFX_ERR_NONE); bool bNoSAO = defPar.base.GetLCUSize(defPar) == 16; bool bChanged = CheckOrZero( pHEVC->SampleAdaptiveOffset , mfxU16(MFX_SAO_UNKNOWN) , mfxU16(MFX_SAO_DISABLE) , mfxU16(!bNoSAO * MFX_SAO_ENABLE_LUMA) , mfxU16(!bNoSAO * MFX_SAO_ENABLE_CHROMA) , mfxU16(!bNoSAO * (MFX_SAO_ENABLE_LUMA | MFX_SAO_ENABLE_CHROMA))); MFX_CHECK(!bChanged, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); bSet = true; return MFX_ERR_NONE; }); } }; } //Base } //namespace HEVCEHW #endif hevcehw_base_scc.cpp000066400000000000000000000246231443134507600336650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_scc.h" #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; constexpr mfxU8 SCC_EXT_ID = 3; bool SCC::ReadSpsExt(StorageRW& strg, const Base::SPS&, mfxU8 id, Base::IBsReader& bs) { if (id != SCC_EXT_ID) return false; SccSpsExt& sps = SpsExt::GetOrConstruct(strg, SccSpsExt{}); sps.curr_pic_ref_enabled_flag = bs.GetBit(); sps.palette_mode_enabled_flag = bs.GetBit(); if (sps.palette_mode_enabled_flag) { sps.palette_max_size = bs.GetUE(); sps.delta_palette_max_predictor_size = bs.GetUE(); sps.palette_predictor_initializer_present_flag = bs.GetBit(); if (sps.palette_predictor_initializer_present_flag) { return false; } } sps.motion_vector_resolution_control_idc = bs.GetBits(2); sps.intra_boundary_filtering_disabled_flag = bs.GetBit(); sps.scc_extension_flag = 1; return true; } bool SCC::ReadPpsExt(StorageRW& strg, const Base::PPS&, mfxU8 id, Base::IBsReader& bs) { if (id != SCC_EXT_ID) return false; auto pExt = make_storable(SccPpsExt{}); SccPpsExt& pps = *pExt; pps.curr_pic_ref_enabled_flag = bs.GetBit(); pps.residual_adaptive_colour_transform_enabled_flag = bs.GetBit(); // MBZ for Gen12 if (pps.residual_adaptive_colour_transform_enabled_flag) { return false; } pps.palette_predictor_initializer_present_flag = bs.GetBit(); // MBZ for Gen12 if (pps.palette_predictor_initializer_present_flag) { return false; } pps.scc_extension_flag = 1; strg.Insert(PpsExt::Key, std::move(pExt)); return true; } bool SCC::PackSpsExt(StorageRW& strg, const Base::SPS&, mfxU8 id, Base::IBsWriter& bs) { if (id != SCC_EXT_ID) return false; auto& sps = SpsExt::Get(strg); bs.PutBit(sps.curr_pic_ref_enabled_flag); bs.PutBit(sps.palette_mode_enabled_flag); if (sps.palette_mode_enabled_flag) { bs.PutUE(sps.palette_max_size); bs.PutUE(sps.delta_palette_max_predictor_size); bs.PutBit(0); // Gen12: palette_predictor_initializer_present_flag - MBZ } bs.PutBits(2, 0); // Gen12: motion_vector_resolution_control_idc - MBZ bs.PutBit(0); // Gen12: intra_boundary_filtering_disabled_flag - MBZ return true; } bool SCC::PackPpsExt(StorageRW& strg, const Base::PPS&, mfxU8 id, Base::IBsWriter& bs) { if (id != SCC_EXT_ID) return false; auto& pps = PpsExt::Get(strg); bs.PutBit(pps.curr_pic_ref_enabled_flag); bs.PutBit(0); // Gen12: pps.residual_adaptive_colour_transform_enabled_flag - MBZ bs.PutBit(0); // Gen12: pps.palette_predictor_initializer_present_flag - MBZ return true; } void SCC::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetCallChains , [this](const mfxVideoParam& par, mfxVideoParam&, StorageRW& strg) -> mfxStatus { MFX_CHECK(par.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC, MFX_ERR_NONE); MFX_CHECK(!IsOff(par.mfx.LowPower), MFX_ERR_NONE); auto& defaults = Glob::Defaults::GetOrConstruct(strg); auto& sccflags = Glob::SCCFlags::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.CheckProfile.Push( [](Base::Defaults::TCheckAndFix::TExt prev , const Base::Defaults::Param& dpar , mfxVideoParam& par) { mfx::OnExit reveretProfile([&](){ SetIf(par.mfx.CodecProfile, !!par.mfx.CodecProfile, MFX_PROFILE_HEVC_SCC); }); par.mfx.CodecProfile = MFX_PROFILE_HEVC_REXT; return prev(dpar, par); }); defaults.GetVPS.Push([]( Defaults::TGetVPS::TExt prev , const Defaults::Param& defpar , Base::VPS& vps) { auto sts = prev(defpar, vps); vps.general.constraint.max_12bit = 1; vps.general.constraint.max_10bit = 1; vps.general.constraint.max_8bit = (defpar.mvp.mfx.FrameInfo.BitDepthLuma != 10); vps.general.constraint.max_422chroma = (defpar.mvp.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444); vps.general.constraint.max_420chroma = (defpar.mvp.mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444); vps.general.constraint.lower_bit_rate = 1; return sts; }); defaults.GetSPS.Push( [](Defaults::TGetSPS::TExt prev , const Defaults::Param& defPar , const Base::VPS& vps , Base::SPS& sps) { auto sts = prev(defPar, vps, sps); MFX_CHECK_STS(sts); sps.extension_flag = 1; sps.ExtensionFlags |= (0x80 >> SCC_EXT_ID); return sts; }); bSet = true; MFX_CHECK(sccflags.IBCEnable, MFX_ERR_NONE); defaults.GetPPS.Push( [](Defaults::TGetPPS::TExt prev , const Defaults::Param& defPar , const Base::SPS& sps , Base::PPS& pps) { auto sts = prev(defPar, sps, pps); MFX_CHECK_STS(sts); pps.extension_flag = 1; pps.ExtensionFlags |= (0x80 >> SCC_EXT_ID); // Disable ref-list modification pps.lists_modification_present_flag = 0; return sts; }); return MFX_ERR_NONE; }); Push(BLK_SetLowPowerDefault , [](const mfxVideoParam&, mfxVideoParam& par, StorageW& strg) -> mfxStatus { (void)strg; bool bLowPower = par.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC; SetDefault(par.mfx.LowPower, mfxU16(bLowPower * MFX_CODINGOPTION_ON)); return MFX_ERR_NONE; }); Push(BLK_LoadSPSPPS , [](const mfxVideoParam&, mfxVideoParam&, StorageRW& strg) -> mfxStatus { Glob::NeedRextConstraints::GetOrConstruct(strg) = [](const Base::ProfileTierLevel& profile_tier_level) { return ((profile_tier_level.profile_idc == 9) || (profile_tier_level.profile_compatibility_flags & (0x1 << 9))); }; auto& sccflags = Glob::SCCFlags::GetOrConstruct(strg); using namespace std::placeholders; Glob::ReadSpsExt::GetOrConstruct(strg) = std::bind(ReadSpsExt, std::ref(strg), _1, _2, _3); Glob::PackSpsExt::GetOrConstruct(strg) = std::bind(PackSpsExt, std::ref(strg), _1, _2, _3); if (sccflags.IBCEnable) { Glob::ReadPpsExt::GetOrConstruct(strg) = std::bind(ReadPpsExt, std::ref(strg), _1, _2, _3); Glob::PackPpsExt::GetOrConstruct(strg) = std::bind(PackPpsExt, std::ref(strg), _1, _2, _3); } return MFX_ERR_NONE; }); } void SCC::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW&) -> mfxStatus { m_bPatchNextDDITask = (Glob::VideoParam::Get(strg).mfx.CodecProfile == MFX_PROFILE_HEVC_SCC); m_bPatchDDISlices = m_bPatchNextDDITask; return MFX_ERR_NONE; }); Push(BLK_SetSPSExt , [](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK(Glob::VideoParam::Get(strg).mfx.CodecProfile == MFX_PROFILE_HEVC_SCC, MFX_ERR_NONE); auto& sccflags = Glob::SCCFlags::Get(strg); MFX_CHECK(sccflags.IBCEnable || sccflags.PaletteEnable, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); auto& spsExt = SpsExt::GetOrConstruct(strg, SccSpsExt{}); spsExt = {}; if (sccflags.IBCEnable) { spsExt.curr_pic_ref_enabled_flag = 1; } if (sccflags.PaletteEnable) { spsExt.palette_mode_enabled_flag = 1; spsExt.palette_max_size = 64; spsExt.delta_palette_max_predictor_size = 32; } spsExt.scc_extension_flag = 1; return MFX_ERR_NONE; }); Push(BLK_SetPPSExt , [](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK(Glob::VideoParam::Get(strg).mfx.CodecProfile == MFX_PROFILE_HEVC_SCC, MFX_ERR_NONE); auto& sccflags = Glob::SCCFlags::Get(strg); MFX_CHECK(sccflags.IBCEnable, MFX_ERR_NONE); auto& ppsExt = PpsExt::GetOrConstruct(strg, SccPpsExt{}); ppsExt = {}; ppsExt.curr_pic_ref_enabled_flag = 1; ppsExt.scc_extension_flag = 1; return MFX_ERR_NONE; }); } void SCC::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_PatchSliceHeader , []( StorageW& global , StorageW& s_task) -> mfxStatus { MFX_CHECK(Glob::VideoParam::Get(global).mfx.CodecProfile == MFX_PROFILE_HEVC_SCC, MFX_ERR_NONE); auto& sccflags = Glob::SCCFlags::Get(global); MFX_CHECK(sccflags.IBCEnable, MFX_ERR_NONE); auto& ssh = Base::Task::SSH::Get(s_task); ssh.num_ref_idx_active_override_flag = 1; if (ssh.type == 2) { // Change slice type from I to P and disable temporal MV prediction // to enable IBC ssh.type = 1; ssh.temporal_mvp_enabled_flag = 0; } else { ssh.num_ref_idx_l0_active_minus1++; //for cur pic ref } return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) && defined(MFX_ENABLE_HEVCE_SCC) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base/hevcehw_base_scc.h000066400000000000000000000104031443134507600334000ustar00rootroot00000000000000// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class SCC : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetCallChains)\ DECL_BLOCK(SetLowPowerDefault)\ DECL_BLOCK(CheckProfile)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(Init)\ DECL_BLOCK(SetSPSExt)\ DECL_BLOCK(SetPPSExt)\ DECL_BLOCK(LoadSPSPPS)\ DECL_BLOCK(PatchSliceHeader)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_SCC" #include "hevcehw_decl_blocks.h" SCC(mfxU32 FeatureId) : FeatureBase(FeatureId) {} struct SccSpsExt { mfxU8 scc_extension_flag : 1; mfxU8 curr_pic_ref_enabled_flag : 1; mfxU8 palette_mode_enabled_flag : 1; mfxU8 motion_vector_resolution_control_idc : 2; // MBZ for Gen12 mfxU8 intra_boundary_filtering_disabled_flag : 1; // MBZ for Gen12 mfxU8 palette_predictor_initializer_present_flag : 1; // MBZ for Gen12 mfxU8 : 1; mfxU32 palette_max_size; // A.3.7: palette_max_size<=64 mfxU32 delta_palette_max_predictor_size; // A.3.7: palette_max_size+delta_palette_max_predictor_size <= 128 mfxU32 num_palette_predictor_initializer_minus1; mfxU32 palette_predictor_initializers[3][128]; }; struct SccPpsExt { mfxU8 scc_extension_flag : 1; mfxU8 curr_pic_ref_enabled_flag : 1; mfxU8 residual_adaptive_colour_transform_enabled_flag : 1; // MBZ for Gen12 mfxU8 palette_predictor_initializer_present_flag : 1; // MBZ for Gen12 mfxU8 slice_act_qp_offsets_present_flag : 1; mfxU8 monochrome_palette_flag : 1; mfxU8 : 2; mfxU32 act_y_qp_offset_plus5; mfxU32 act_cb_qp_offset_plus5; mfxU32 act_cr_qp_offset_plus3; mfxU32 num_palette_predictor_initializer; mfxU32 luma_bit_depth_entry_minus8; mfxU32 chroma_bit_depth_entry_minus8; mfxU32 palette_predictor_initializers[3][128]; }; using SpsExt = StorageVar; using PpsExt = StorageVar; protected: virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; virtual void PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) override; virtual void SetExtraGUIDs(StorageRW& /*strg*/) {}; static bool ReadSpsExt(StorageRW& strg, const Base::SPS&, mfxU8 id, Base::IBsReader& bs); static bool ReadPpsExt(StorageRW& strg, const Base::PPS&, mfxU8 id, Base::IBsReader& bs); static bool PackSpsExt(StorageRW& strg, const Base::SPS&, mfxU8 id, Base::IBsWriter& bs); static bool PackPpsExt(StorageRW& strg, const Base::PPS&, mfxU8 id, Base::IBsWriter& bs); bool m_bPatchNextDDITask = false; bool m_bPatchDDISlices = false; }; } //Base } //namespace HEVCEHW #endif hevcehw_base_task.cpp000066400000000000000000000220661443134507600340560ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_task.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; mfxU32 TaskManager::GetNumTask() const { return m_pPar->AsyncDepth + m_pReorder->BufferSize + (m_pPar->AsyncDepth > 1) + TMInterface::Get(*m_pGlob).ResourceExtra; } mfxU16 TaskManager::GetBufferSize() const { return !m_pPar->mfx.EncodedOrder * (m_pReorder->BufferSize + (m_pPar->AsyncDepth > 1) + TMInterface::Get(*m_pGlob).ResourceExtra); } mfxU16 TaskManager::GetMaxParallelSubmits() const { return std::min(2, Glob::AllocBS::Get(*m_pGlob).GetResponse().NumFrameActual); } void TaskManager::SetActiveTask(StorageW& task) { m_pFrameCheckLocal->Insert(Tmp::CurrTask::Key, new StorableRef(task)); } bool TaskManager::IsInputTask(const StorageR& task) const { return !!Task::Common::Get(task).pSurfIn; } mfxU32 TaskManager::GetStage(const StorageR& task) const { return Task::Common::Get(task).stage; } void TaskManager::SetStage(StorageW& task, mfxU32 stage) const { Task::Common::Get(task).stage = stage; } bool TaskManager::IsReorderBypass() const { return !!m_pPar->mfx.EncodedOrder; } TTaskIt TaskManager::GetNextTaskToEncode(TTaskIt begin, TTaskIt end, bool bFlush) { auto IsIdrTask = [](const StorageR& rTask) { return IsIdr(Task::Common::Get(rTask).FrameType); }; auto it = std::find_if(begin, end, IsIdrTask); bFlush |= (it != end); return (*m_pReorder)(begin, it, bFlush); } bool TaskManager::IsForceSync(const StorageR& task) const { return Task::Common::Get(task).bForceSync; } mfxBitstream* TaskManager::GetBS(const StorageR& task) const { return Task::Common::Get(task).pBsOut; } void TaskManager::SetBS(StorageW& task, mfxBitstream* pBS) const { Task::Common::Get(task).pBsOut = pBS; } bool TaskManager::GetRecode(const StorageR& task) const { return Task::Common::Get(task).bRecode; } void TaskManager::SetRecode(StorageW& task, bool bRecode) const { Task::Common::Get(task).bRecode = bRecode; } bool TaskManager::GetFreed(const StorageR& task) const { return Task::Common::Get(task).bFreed; } void TaskManager::SetFreed(StorageW& task, bool bFreed) const { Task::Common::Get(task).bFreed = bFreed; } mfxU32 TaskManager::GetBsDataLength(const StorageR& task) const { return Task::Common::Get(task).BsDataLength; } void TaskManager::SetBsDataLength(StorageW& task, mfxU32 len) const { Task::Common::Get(task).BsDataLength = len; } void TaskManager::AddNumRecode(StorageW& task, mfxU16 n) const { Task::Common::Get(task).NumRecode += n; } mfxStatus TaskManager::RunQueueTaskAlloc(StorageRW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } mfxStatus TaskManager::RunQueueTaskInit( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& task) { return RunBlocks( CheckGE , FeatureBlocks::BQ::Get(*m_pBlocks) , pCtrl, pSurf, pBs, *m_pGlob, task); } mfxStatus TaskManager::RunQueueTaskPreReorder(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob, task); } mfxStatus TaskManager::RunQueueTaskPostReorder(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } mfxStatus TaskManager::RunQueueTaskSubmit(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } bool TaskManager::RunQueueTaskQuery( StorageW& task , std::function stopAt) { auto& q = FeatureBlocks::BQ::Get(*m_pBlocks); auto RunBlock = [&](FeatureBlocks::BQ::TQueue::const_reference block) { return stopAt(block.Call(*m_pGlob, task)); }; return std::any_of(q.begin(), q.end(), RunBlock); } mfxStatus TaskManager::RunQueueTaskFree(StorageW& task) { return RunBlocks( Check , FeatureBlocks::BQ::Get(*m_pBlocks) , *m_pGlob , task); } void TaskManager::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { auto SetInterface = [this](StorageRW& strg, StorageRW&) { TMInterface::GetOrConstruct(strg, ExtTMInterface(*this)); return MFX_ERR_NONE; }; Push(BLK_SetTMInterface, SetInterface); } void TaskManager::InitAlloc(const FeatureBlocks& blocks, TPushIA Push) { Push(BLK_Init , [this, &blocks](StorageRW& strg, StorageRW&) -> mfxStatus { m_pBlocks = &blocks; m_pGlob = &strg; m_pPar = &Glob::VideoParam::Get(strg); m_pReorder = &Glob::Reorder::Get(strg); return ManagerInit(); }); } void TaskManager::FrameSubmit(const FeatureBlocks& /*blocks*/, TPushFS Push) { Push(BLK_NewTask , [this]( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream& bs , StorageW& global , StorageRW& local) -> mfxStatus { m_pGlob = &global; m_pFrameCheckLocal = &local; return TaskNew(pCtrl, pSurf, bs); }); } mfxStatus TaskManager::RunExtraStages(mfxU16 beginStageID, mfxU16 endStageID, StorageW& task) { MFX_CHECK(!m_pGlob.isNull(), MFX_ERR_NONE); auto& stages = TMInterface::Get(*m_pGlob).AsyncStages; auto itStage = stages.find(beginStageID); auto itEnd = stages.find(endStageID); MFX_CHECK(itStage != stages.end(), MFX_ERR_NONE); for (; itStage != itEnd; ++itStage) { MFX_SAFE_CALL(itStage->second(*m_pGlob, task)); } return MFX_ERR_NONE; } mfxStatus TaskManager::TaskPrepare(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_NEW), Stage(S_PREPARE), task)); return MfxEncodeHW::TaskManager::TaskPrepare(task); } mfxStatus TaskManager::TaskReorder(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_PREPARE), Stage(S_REORDER), task)); return MfxEncodeHW::TaskManager::TaskReorder(task); } mfxStatus TaskManager::TaskSubmit(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_REORDER), Stage(S_SUBMIT), task)); if (TMInterface::Get(*m_pGlob).UpdateTask) TMInterface::Get(*m_pGlob).UpdateTask(GetTask(Stage(S_SUBMIT))); return MfxEncodeHW::TaskManager::TaskSubmit(task); } mfxStatus TaskManager::TaskQuery(StorageW& task) { MFX_SAFE_CALL(RunExtraStages(NextStage(S_SUBMIT), Stage(S_QUERY), task)); return MfxEncodeHW::TaskManager::TaskQuery(task); } void TaskManager::AsyncRoutine(const FeatureBlocks& /*blocks*/, TPushAR Push) { Push(BLK_PrepareTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskPrepare(task); }); Push(BLK_ReorderTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskReorder(task); }); Push(BLK_SubmitTask , [this]( StorageW& /*global*/ , StorageW& task) -> mfxStatus { return TaskSubmit(task); }); Push(BLK_QueryTask , [this]( StorageW& /*global*/ , StorageW& inTask) -> mfxStatus { return TaskQuery(inTask); }); } void TaskManager::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this](StorageW& global, StorageW&) -> mfxStatus { if (Glob::ResetHint::Get(global).Flags & (RF_IDR_REQUIRED | RF_CANCEL_TASKS)) { CancelTasks(); } return MFX_ERR_NONE; }); } void TaskManager::Close(const FeatureBlocks& /*blocks*/, TPushCLS Push) { Push(BLK_Close , [this](StorageW& /*global*/) -> mfxStatus { CancelTasks(); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_task.h000066400000000000000000000134431443134507600335220ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "ehw_task_manager.h" namespace HEVCEHW { namespace Base { class TaskManager : public FeatureBase , protected MfxEncodeHW::TaskManager { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetTMInterface) \ DECL_BLOCK(Init) \ DECL_BLOCK(Reset) \ DECL_BLOCK(NewTask) \ DECL_BLOCK(PrepareTask) \ DECL_BLOCK(LASubmit) \ DECL_BLOCK(LAQuery) \ DECL_BLOCK(ReorderTask) \ DECL_BLOCK(SubmitTask) \ DECL_BLOCK(QueryTask) \ DECL_BLOCK(Close) #define DECL_FEATURE_NAME "Base_TaskManager" #include "hevcehw_decl_blocks.h" TaskManager(mfxU32 id) : FeatureBase(id) { } // Task Manager Interface for extra stages and logic class ExtTMInterface : public Storable { public: ExtTMInterface(MfxEncodeHW::TaskManager& mgr) : Manager(mgr) {} using TAsyncStage = CallChain; MfxEncodeHW::TaskManager& Manager; std::map AsyncStages; mfxU16 ResourceExtra = 0; using TUpdateTask = CallChain; TUpdateTask UpdateTask = {}; }; using TMInterface = StorageVar; protected: NotNull m_pPar; NotNull m_pReorder; NotNull m_pBlocks; NotNull m_pGlob; NotNull m_pFrameCheckLocal; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; virtual void FrameSubmit(const FeatureBlocks& blocks, TPushFS Push) override; virtual void AsyncRoutine(const FeatureBlocks& blocks, TPushAR Push) override; virtual void Close(const FeatureBlocks& blocks, TPushCLS Push) override; virtual mfxU32 GetNumTask() const override; virtual mfxU16 GetBufferSize() const override; virtual mfxU16 GetMaxParallelSubmits() const override; virtual void SetActiveTask(StorageW& task) override; virtual bool IsInputTask(const StorageR& task) const override; virtual mfxU32 GetStage(const StorageR& task) const override; virtual void SetStage(StorageW& task, mfxU32 stage) const override; virtual bool IsReorderBypass() const override; virtual TTaskIt GetNextTaskToEncode(TTaskIt begin, TTaskIt end, bool bFlush) override; virtual bool IsForceSync(const StorageR& task) const override; virtual mfxBitstream* GetBS(const StorageR& task) const override; virtual void SetBS(StorageW& task, mfxBitstream* pBS) const override; virtual bool GetRecode(const StorageR& task) const override; virtual void SetRecode(StorageW& task, bool bRecode) const override; virtual bool GetFreed(const StorageR& task) const override; virtual void SetFreed(StorageW& task, bool bFreed) const override; virtual mfxU32 GetBsDataLength(const StorageR& task) const override; virtual void SetBsDataLength(StorageW& task, mfxU32 len) const override; virtual void AddNumRecode(StorageW& task, mfxU16 n) const override; virtual mfxStatus RunQueueTaskAlloc(StorageRW& task) override; virtual mfxStatus RunQueueTaskInit( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream* pBs , StorageW& task) override; virtual mfxStatus RunQueueTaskPreReorder(StorageW& task) override; virtual mfxStatus RunQueueTaskPostReorder(StorageW& task) override; virtual mfxStatus RunQueueTaskSubmit(StorageW& task) override; virtual bool RunQueueTaskQuery( StorageW& task , std::function stopAt) override; virtual mfxStatus RunQueueTaskFree(StorageW& task) override; virtual mfxStatus TaskPrepare(StorageW& /*task*/) override; virtual mfxStatus TaskReorder(StorageW& /*task*/) override; virtual mfxStatus TaskSubmit(StorageW& /*task*/) override; virtual mfxStatus TaskQuery(StorageW& /*task*/) override; mfxStatus RunExtraStages(mfxU16 beginStageID, mfxU16 endStageID, StorageW& task); }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_weighted_prediction.cpp000066400000000000000000000175051443134507600371360ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base_weighted_prediction.h" #include using namespace HEVCEHW; using namespace HEVCEHW::Base; void WeightPred::SetSupported(ParamSupport& blocks) { blocks.m_ebCopySupported[MFX_EXTBUFF_CODING_OPTION3].emplace_back( [](const mfxExtBuffer* pSrc, mfxExtBuffer* pDst) -> void { auto& buf_src = *(const mfxExtCodingOption3*)pSrc; auto& buf_dst = *(mfxExtCodingOption3*)pDst; MFX_COPY_FIELD(WeightedPred); MFX_COPY_FIELD(WeightedBiPred); MFX_COPY_FIELD(FadeDetection); }); } void WeightPred::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_CheckAndFix , [](const mfxVideoParam& /*in*/, mfxVideoParam& par, StorageW& global) -> mfxStatus { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); auto& caps = Glob::EncodeCaps::Get(global); bool bFDSupported = !caps.NoWeightedPred; mfxU32 changed = 0; changed += CheckOrZero( pCO3->WeightedPred , mfxU16(MFX_WEIGHTED_PRED_UNKNOWN) , mfxU16(MFX_WEIGHTED_PRED_DEFAULT) , mfxU16(!caps.NoWeightedPred * MFX_WEIGHTED_PRED_EXPLICIT)); changed += CheckOrZero( pCO3->WeightedBiPred , mfxU16(MFX_WEIGHTED_PRED_UNKNOWN) , mfxU16(MFX_WEIGHTED_PRED_DEFAULT) , mfxU16(!caps.NoWeightedPred * MFX_WEIGHTED_PRED_EXPLICIT)); changed += CheckOrZero( pCO3->FadeDetection , mfxU16(MFX_CODINGOPTION_UNKNOWN) , mfxU16(MFX_CODINGOPTION_OFF) , mfxU16(bFDSupported * MFX_CODINGOPTION_ON)); MFX_CHECK(!changed, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); return MFX_ERR_NONE; }); } void WeightPred::SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) { Push(BLK_SetDefaults , [](mfxVideoParam& par, StorageW& /*strg*/, StorageRW&) { mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(pCO3, MFX_ERR_NONE); SetDefault(pCO3->FadeDetection, MFX_CODINGOPTION_OFF); SetDefault(pCO3->WeightedPred , IsOn(pCO3->FadeDetection) * MFX_WEIGHTED_PRED_EXPLICIT + IsOff(pCO3->FadeDetection) * MFX_WEIGHTED_PRED_DEFAULT); SetDefault(pCO3->WeightedBiPred, pCO3->WeightedPred); return MFX_ERR_NONE; }); } void WeightPred::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetPPS , [](StorageRW& strg, StorageRW&) -> mfxStatus { auto& par = Glob::VideoParam::Get(strg); const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); PPS& pps = Glob::PPS::Get(strg); pps.weighted_pred_flag = (CO3.WeightedPred == MFX_WEIGHTED_PRED_EXPLICIT); pps.weighted_bipred_flag = (CO3.WeightedBiPred == MFX_WEIGHTED_PRED_EXPLICIT) || (IsOn(CO3.GPB) && pps.weighted_pred_flag); MFX_CHECK(strg.Contains(Glob::RealState::Key), MFX_ERR_NONE); const PPS& oldPPS = Glob::PPS::Get(Glob::RealState::Get(strg)); Glob::ResetHint::Get(strg).Flags |= RF_PPS_CHANGED * ( (pps.weighted_pred_flag != oldPPS.weighted_pred_flag) || (pps.weighted_bipred_flag != oldPPS.weighted_bipred_flag)); return MFX_ERR_NONE; }); } void WeightPred::PostReorderTask(const FeatureBlocks& /*blocks*/, TPushPostRT Push) { Push(BLK_SetSSH , [](StorageW& global, StorageW& s_task) -> mfxStatus { auto& pps = Glob::PPS::Get(global); auto& ssh = Task::SSH::Get(s_task); bool bNeedPWT = (pps.weighted_pred_flag && ssh.type == 1) || (pps.weighted_bipred_flag && ssh.type == 0); MFX_CHECK(bNeedPWT, MFX_ERR_NONE); const mfxU16 Y = 0, Cb = 1, Cr = 2, W = 0, O = 1; auto& task = Task::Common::Get(s_task); auto& caps = Glob::EncodeCaps::Get(global); auto pExtPWT = (mfxExtPredWeightTable*)ExtBuffer::Get(task.ctrl); auto SetDefaultWeight = [&](mfxI16 (&pwt)[3][2]) { pwt[Y][W] = (1 << ssh.luma_log2_weight_denom); pwt[Y][O] = 0; pwt[Cb][W] = (1 << ssh.chroma_log2_weight_denom); pwt[Cb][O] = 0; pwt[Cr][W] = (1 << ssh.chroma_log2_weight_denom); pwt[Cr][O] = 0; }; auto CopyLxPWT = [&](mfxU16 l, mfxU16 sz) { auto CopyY = [&](mfxU16 i) { ssh.pwt[l][i][Y][W] = pExtPWT->Weights[l][i][Y][W]; ssh.pwt[l][i][Y][O] = pExtPWT->Weights[l][i][Y][O]; }; auto CopyC = [&](mfxU16 i) { ssh.pwt[l][i][Cb][W] = pExtPWT->Weights[l][i][Cb][W]; ssh.pwt[l][i][Cb][O] = pExtPWT->Weights[l][i][Cb][O]; ssh.pwt[l][i][Cr][W] = pExtPWT->Weights[l][i][Cr][W]; ssh.pwt[l][i][Cr][O] = pExtPWT->Weights[l][i][Cr][O]; }; std::list idxY(sz * caps.LumaWeightedPred, 0); std::list idxC(sz * caps.ChromaWeightedPred, 0); std::iota(idxY.begin(), idxY.end(), mfxI16(0)); std::iota(idxC.begin(), idxC.end(), mfxI16(0)); idxY.remove_if([&](mfxI16 i) { return !pExtPWT->LumaWeightFlag[l][i]; }); idxC.remove_if([&](mfxI16 i) { return !pExtPWT->ChromaWeightFlag[l][i]; }); for_each(idxY.begin(), idxY.end(), CopyY); for_each(idxC.begin(), idxC.end(), CopyC); }; ssh.luma_log2_weight_denom = 6; ssh.chroma_log2_weight_denom = ssh.luma_log2_weight_denom; if (pExtPWT) { ssh.luma_log2_weight_denom = pExtPWT->LumaLog2WeightDenom; ssh.chroma_log2_weight_denom = pExtPWT->ChromaLog2WeightDenom; } std::for_each(std::begin(ssh.pwt[0]), std::end(ssh.pwt[0]), SetDefaultWeight); std::for_each(std::begin(ssh.pwt[1]), std::end(ssh.pwt[1]), SetDefaultWeight); MFX_CHECK(pExtPWT, MFX_ERR_NONE); CopyLxPWT(0, std::min(ssh.num_ref_idx_l0_active_minus1 + 1, caps.MaxNum_WeightedPredL0)); CopyLxPWT(1, std::min(ssh.num_ref_idx_l1_active_minus1 + 1, caps.MaxNum_WeightedPredL1)); bool bForceSameWeights = task.isLDB && std::equal( std::begin(task.RefPicList[0]) , std::end(task.RefPicList[0]) , std::begin(task.RefPicList[1])); MFX_CHECK(bForceSameWeights, MFX_ERR_NONE); std::copy_n((mfxU8*)ssh.pwt[0], sizeof(ssh.pwt[0]), (mfxU8*)ssh.pwt[1]); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION)hevcehw_base_weighted_prediction.h000066400000000000000000000042731443134507600366010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Base { class WeightPred : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(CheckAndFix)\ DECL_BLOCK(SetDefaults)\ DECL_BLOCK(SetPPS)\ DECL_BLOCK(SetSSH)\ DECL_BLOCK(PatchDDITask) #define DECL_FEATURE_NAME "Base_WeightPred" #include "hevcehw_decl_blocks.h" WeightPred(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void SetSupported(ParamSupport& par) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetDefaults(const FeatureBlocks& /*blocks*/, TPushSD Push) override; virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; virtual void PostReorderTask(const FeatureBlocks& blocks, TPushPostRT Push) override; }; } //Base } //namespace HEVCEHW #endif //defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTIONoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/g12/000077500000000000000000000000001443134507600274355ustar00rootroot00000000000000hevcehw_g12_caps.cpp000066400000000000000000000107661443134507600332040ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/g12// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_g12_caps.h" using namespace HEVCEHW; using namespace HEVCEHW::Gen12; void Caps::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetDefaultsCallChain, [this](const mfxVideoParam&, mfxVideoParam& out, StorageRW& strg) -> mfxStatus { auto& defaults = HEVCEHW::Base::Glob::Defaults::GetOrConstruct(strg); auto& bSet = defaults.SetForFeature[GetID()]; MFX_CHECK(!bSet, MFX_ERR_NONE); defaults.GetMaxNumRef.Push([]( Base::Defaults::TChain>::TExt , const Base::Defaults::Param& dpar) { const mfxU16 nRef[2][3][7] = { { // VME { 4, 4, 3, 3, 3, 1, 1 }, { 4, 4, 3, 3, 3, 1, 1 }, { 2, 2, 1, 1, 1, 1, 1 } }, { // VDENC { 3, 3, 2, 2, 2, 1, 1 }, { 2, 2, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1 } } }; bool bVDEnc = IsOn(dpar.mvp.mfx.LowPower); mfxU16 tu = dpar.mvp.mfx.TargetUsage; CheckRangeOrSetDefault(tu, 1, 7, 4); --tu; /* Same way like on Base or Gen11 platforms */ mfxU16 numRefFrame = dpar.mvp.mfx.NumRefFrame + !dpar.mvp.mfx.NumRefFrame * 16; return std::make_tuple( std::min(nRef[bVDEnc][0][tu], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[bVDEnc][1][tu], std::min(dpar.caps.MaxNum_Reference0, numRefFrame)) , std::min(nRef[bVDEnc][2][tu], std::min(dpar.caps.MaxNum_Reference1, numRefFrame))); }); if (IsOn(out.mfx.LowPower)) { defaults.GetGopRefDist.Push([]( Base::Defaults::TChain::TExt , const Base::Defaults::Param& par) { if (par.mvp.mfx.GopRefDist) { return par.mvp.mfx.GopRefDist; } auto GopPicSize = par.base.GetGopPicSize(par); const mfxExtCodingOption2* pCO2 = ExtBuffer::Get(par.mvp); bool bNoB = (pCO2 && pCO2->IntRefType) || par.base.GetNumTemporalLayers(par) > 1 || par.caps.SliceIPOnly || GopPicSize < 3 || par.mvp.mfx.NumRefFrame == 1; if (bNoB) { return mfxU16(1); } return std::min(GopPicSize - 1, 8); }); } bSet = true; return MFX_ERR_NONE; }); } void Caps::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_HardcodeCaps , [this](const mfxVideoParam&, mfxVideoParam& par, StorageRW& strg) -> mfxStatus { auto& caps = HEVCEHW::Base::Glob::EncodeCaps::Get(strg); caps.SliceIPOnly = IsOn(par.mfx.LowPower) && par.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC; caps.msdk.bSingleSliceMultiTile = false; caps.YUV422ReconSupport &= !caps.Color420Only; SetSpecificCaps(caps); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/g12/hevcehw_g12_caps.h000066400000000000000000000035651443134507600327270ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_g12_data.h" namespace HEVCEHW { namespace Gen12 { class Caps : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetDefaultsCallChain)\ DECL_BLOCK(HardcodeCaps)\ DECL_BLOCK(HardcodeCapsExt) #define DECL_FEATURE_NAME "G12_Caps" #include "hevcehw_decl_blocks.h" Caps(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) override; virtual void SetSpecificCaps(Base::EncodeCapsHevc& /*caps*/) {}; }; } //Gen12 } //namespace HEVCEHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/g12/hevcehw_g12_data.h000066400000000000000000000026301443134507600327020ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Gen12 { enum eFeatureId { FEATURE_CAPS = Base::eFeatureId::NUM_FEATURES , NUM_FEATURES }; } //namespace Gen12 } //namespace HEVCEHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_base.cpp000066400000000000000000000100501443134507600321670ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include #include namespace HEVCEHW { const char* FeatureBlocks::GetFeatureName(mfxU32 featureID) { #if defined(MFX_ENABLE_LOG_UTILITY) return m_trace.at(featureID)->first.c_str(); #else std::ignore = featureID; return nullptr; #endif } const char* FeatureBlocks::GetBlockName(ID id) { #if defined(MFX_ENABLE_LOG_UTILITY) return m_trace.at(id.FeatureID)->second.at(id.BlockID).c_str(); #else std::ignore = id; return nullptr; #endif } void FeatureBase::Init( mfxU32 mode/*eFeatureMode*/ , FeatureBlocks& blocks) { mfxU32 prevMode = blocks.Init(m_id, mode); if (!prevMode) { SetSupported(blocks); ThrowAssert(blocks.m_trace.find(m_id) != blocks.m_trace.end(), "FeatureID must be unique"); blocks.m_trace[m_id] = GetTrace(); } mode &= ~prevMode; mfxU32 modesQ1 = (QUERY1 | QUERY_IO_SURF | INIT | QUERY_IMPLS_DESCRIPTION); bool bNeedQ0 = !!(mode & (QUERY0 | QUERY_IMPLS_DESCRIPTION)); bool bNeedQ1 = (mode & modesQ1) && !(prevMode & modesQ1); bool bNeedQIS = !!(mode & QUERY_IO_SURF); bool bNeedQID = !!(mode & QUERY_IMPLS_DESCRIPTION); bool bNeedIX = !!(mode & INIT); bool bNeedSD = bNeedQIS || bNeedIX; bool bNeedRT = !!(mode & RUNTIME); mfxU32 nQ = 0; nQ += bNeedQ0 && InitQueue(&FeatureBase::Query0, blocks); nQ += bNeedQ1 && InitQueue(&FeatureBase::Query1NoCaps, blocks); nQ += bNeedQ1 && InitQueue(&FeatureBase::Query1WithCaps, blocks); nQ += bNeedQIS && InitQueue(&FeatureBase::QueryIOSurf, blocks); nQ += bNeedQID && InitQueue(&FeatureBase::QueryImplsDescription, blocks); nQ += bNeedSD && InitQueue(&FeatureBase::SetDefaults, blocks); if (bNeedIX) { nQ += InitQueue(&FeatureBase::InitExternal, blocks); nQ += InitQueue(&FeatureBase::InitInternal, blocks); nQ += InitQueue(&FeatureBase::InitAlloc, blocks); nQ += InitQueue(&FeatureBase::AllocTask, blocks); } if (bNeedRT) { SetInherited(blocks); nQ += InitQueue(&FeatureBase::Reset, blocks); nQ += InitQueue(&FeatureBase::ResetState, blocks); nQ += InitQueue(&FeatureBase::FrameSubmit, blocks); nQ += InitQueue(&FeatureBase::AsyncRoutine, blocks); nQ += InitQueue(&FeatureBase::InitTask, blocks); nQ += InitQueue(&FeatureBase::PreReorderTask, blocks); nQ += InitQueue(&FeatureBase::PostReorderTask, blocks); nQ += InitQueue(&FeatureBase::SubmitTask, blocks); nQ += InitQueue(&FeatureBase::QueryTask, blocks); nQ += InitQueue(&FeatureBase::FreeTask, blocks); nQ += InitQueue(&FeatureBase::Close, blocks); nQ += InitQueue(&FeatureBase::GetVideoParam, blocks); } assert(nQ > 0); } }; //namespace HEVCEHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_base.h000066400000000000000000000066001443134507600316420ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "mfxvideo.h" #include "mfxbrc.h" #include "mfx_ext_buffers.h" #include "mfxvideo++int.h" #include "mfx_utils_extbuf.h" #include "feature_blocks/mfx_feature_blocks_init_macros.h" #include "feature_blocks/mfx_feature_blocks_base.h" #include "hevcehw_utils.h" namespace HEVCEHW { using namespace MfxFeatureBlocks; namespace ExtBuffer { using namespace MfxExtBuffer; }; struct FeatureBlocks : FeatureBlocksCommon { MFX_FEATURE_BLOCKS_DECLARE_BQ_UTILS_IN_FEATURE_BLOCK #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BLOCK #include "hevcehw_block_queues.h" #undef DEF_BLOCK_Q virtual const char* GetFeatureName(mfxU32 featureID) override; virtual const char* GetBlockName(ID id) override; std::map m_trace; }; #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_EXTERNAL #include "hevcehw_block_queues.h" #undef DEF_BLOCK_Q class FeatureBase : public FeatureBaseCommon { public: FeatureBase(); virtual ~FeatureBase() {} virtual void Init( mfxU32 mode/*eFeatureMode*/ , FeatureBlocks& blocks) override; protected: #define DEF_BLOCK_Q MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BASE #include "hevcehw_block_queues.h" #undef DEF_BLOCK_Q typedef TPushQ1NC TPushQ1; FeatureBase(mfxU32 id) : FeatureBaseCommon(id) {} virtual const BlockTracer::TFeatureTrace* GetTrace() { return nullptr; } virtual void SetTraceName(std::string&& /*name*/) {} }; enum eImplMode { IMPL_MODE_DEFAULT = 0 , IMPL_MODE_FEI }; class ImplBase : virtual public VideoENCODE { public: virtual mfxStatus InternalQuery( VideoCORE& core , mfxVideoParam *in , mfxVideoParam& out) = 0; virtual mfxStatus InternalQueryIOSurf( VideoCORE& core , mfxVideoParam& par , mfxFrameAllocRequest& request) = 0; virtual ImplBase* ApplyMode(mfxU32 /*mode*/) { return this; } virtual mfxStatus QueryImplsDescription( VideoCORE& , mfxEncoderDescription::encoder& , mfx::PODArraysHolder&) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } }; }; //namespace HEVCEHW #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_block_queues.h000066400000000000000000000053501443134507600334120ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. DEF_BLOCK_Q(Query0, Q0, void, mfxVideoParam&) DEF_BLOCK_Q(Query1NoCaps, Q1NC, mfxStatus, const mfxVideoParam&, mfxVideoParam&, StorageRW&) DEF_BLOCK_Q(Query1WithCaps, Q1WC, mfxStatus, const mfxVideoParam&, mfxVideoParam&, StorageRW&) DEF_BLOCK_Q(QueryIOSurf, QIS, mfxStatus, const mfxVideoParam&, mfxFrameAllocRequest& request, StorageRW&) DEF_BLOCK_Q(SetDefaults, SD, void, mfxVideoParam&, StorageW&, StorageRW&) DEF_BLOCK_Q(InitExternal, IE, mfxStatus, const mfxVideoParam&, StorageRW&, StorageRW&) DEF_BLOCK_Q(InitInternal, II, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(InitAlloc, IA, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(Reset, R, mfxStatus, const mfxVideoParam&, StorageRW&, StorageRW&) DEF_BLOCK_Q(ResetState, RS, mfxStatus, StorageRW&, StorageRW&) DEF_BLOCK_Q(FrameSubmit, FS, mfxStatus, mfxEncodeCtrl*, mfxFrameSurface1*, mfxBitstream&, StorageW&, StorageRW&) DEF_BLOCK_Q(AsyncRoutine, AR, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(AllocTask, AT, mfxStatus, StorageW&, StorageRW&) DEF_BLOCK_Q(InitTask, IT, mfxStatus, mfxEncodeCtrl*, mfxFrameSurface1*, mfxBitstream*, StorageW&, StorageW&) DEF_BLOCK_Q(PreReorderTask, PreRT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(PostReorderTask, PostRT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(SubmitTask, ST, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(QueryTask, QT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(FreeTask, FT, mfxStatus, StorageW&, StorageW&) DEF_BLOCK_Q(Close, CLS, void, StorageW&) DEF_BLOCK_Q(GetVideoParam, GVP, void, mfxVideoParam&, StorageR&) DEF_BLOCK_Q(QueryImplsDescription, QID, mfxStatus, VideoCORE&, mfxEncoderDescription::encoder&, mfx::PODArraysHolder&, StorageRW&) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_ddi.h000066400000000000000000000123261443134507600314720ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once namespace HEVCEHW { typedef struct tagENCODE_CAPS_HEVC { union{ struct { uint32_t CodingLimitSet : 1; uint32_t BitDepth8Only : 1; uint32_t Color420Only : 1; uint32_t SliceStructure : 3; uint32_t SliceIPOnly : 1; uint32_t SliceIPBOnly : 1; uint32_t NoWeightedPred : 1; uint32_t NoMinorMVs : 1; uint32_t RawReconRefToggle : 1; uint32_t NoInterlacedField : 1; uint32_t BRCReset : 1; uint32_t RollingIntraRefresh : 1; uint32_t UserMaxFrameSizeSupport : 1; uint32_t FrameLevelRateCtrl : 1; uint32_t SliceByteSizeCtrl : 1; uint32_t VCMBitRateControl : 1; uint32_t ParallelBRC : 1; uint32_t TileSupport : 1; uint32_t SkipFrame : 1; uint32_t MbQpDataSupport : 1; uint32_t SliceLevelWeightedPred : 1; uint32_t LumaWeightedPred : 1; uint32_t ChromaWeightedPred : 1; uint32_t QVBRBRCSupport : 1; uint32_t HMEOffsetSupport : 1; uint32_t YUV422ReconSupport : 1; uint32_t YUV444ReconSupport : 1; uint32_t RGBReconSupport : 1; uint32_t MaxEncodedBitDepth : 2; }; uint32_t CodingLimits; }; uint32_t MaxPicWidth; uint32_t MaxPicHeight; uint8_t MaxNum_Reference0; uint8_t MaxNum_Reference1; uint8_t MBBRCSupport; uint8_t TUSupport; union { struct { uint8_t MaxNumOfROI : 5; // [0..16] uint8_t ROIBRCPriorityLevelSupport : 1; uint8_t BlockSize : 2; }; uint8_t ROICaps; }; union { struct { uint32_t SliceLevelReportSupport : 1; uint32_t CTULevelReportSupport : 1; uint32_t SearchWindow64Support : 1; uint32_t CustomRoundingControl : 1; uint32_t LowDelayBRCSupport : 1; uint32_t IntraRefreshBlockUnitSize : 2; uint32_t LCUSizeSupported : 3; uint32_t MaxNumDeltaQPMinus1 : 4; uint32_t DirtyRectSupport : 1; uint32_t MoveRectSupport : 1; uint32_t FrameSizeToleranceSupport : 1; uint32_t HWCounterAutoIncrementSupport : 2; uint32_t ROIDeltaQPSupport : 1; uint32_t NumScalablePipesMinus1 : 5; uint32_t NegativeQPSupport : 1; uint32_t HRDConformanceSupport : 1; uint32_t TileBasedEncodingSupport : 1; uint32_t PartialFrameUpdateSupport : 1; uint32_t RGBEncodingSupport : 1; uint32_t LLCStreamingBufferSupport : 1; uint32_t DDRStreamingBufferSupport : 1; }; uint32_t CodingLimits2; }; uint8_t MaxNum_WeightedPredL0; uint8_t MaxNum_WeightedPredL1; uint16_t MaxNumOfDirtyRect; uint16_t MaxNumOfMoveRect; uint16_t MaxNumOfConcurrentFramesMinus1; uint16_t LLCSizeInMBytes; union { struct { uint16_t PFrameSupport : 1; uint16_t LookaheadAnalysisSupport : 1; uint16_t LookaheadBRCSupport : 1; uint16_t TileReplaySupport : 1; uint16_t TCBRCSupport : 1; uint16_t reservedbits0 : 2; uint16_t ExtFrameStatsReport : 1; uint16_t BlockStatsReport : 1; uint16_t reservedbits1 : 7; }; uint16_t CodingLimits3; }; uint32_t reserved32bits1; uint32_t reserved32bits2; uint32_t reserved32bits3; } ENCODE_CAPS_HEVC; }; //namespace HEVCEHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_decl_blocks.h000066400000000000000000000026151443134507600331760ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //use customized version w/trace support instead of default one #define DECL_BLOCK_CLEANUP_DISABLE #define CODEC_NAME_PREFIX "HEVCe_" #include "feature_blocks/mfx_feature_blocks_decl_blocks.h" #undef CODEC_NAME_PREFIX #undef DECL_BLOCK_LIST #undef DECL_FEATURE_NAME #undef DECL_BLOCK_CLEANUP_DISABLEoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/agnostic/hevcehw_utils.h000066400000000000000000000024651443134507600320750ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "ehw_utils.h" namespace HEVCEHW { using namespace MfxEncodeHW::Utils; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/hevcehw_disp.cpp000077500000000000000000000105531443134507600304200ustar00rootroot00000000000000// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_disp.h" #include "hevcehw_base.h" #include "hevcehw_g12_lin.h" namespace HEVCEHWDisp { namespace TGL { using namespace HEVCEHW::Linux::Gen12; }; namespace DG1 { using namespace HEVCEHW::Linux::Gen12; }; }; #include "hevcehw_xe_hpm_lin.h" namespace HEVCEHWDisp { namespace Xe_HPM { using namespace HEVCEHW::Linux::Xe_HPM; }; }; #include "hevcehw_xe_lpm_plus_lin.h" namespace HEVCEHWDisp { namespace Xe_LPM_Plus { using namespace HEVCEHW::Linux::Xe_LPM_Plus; }; }; namespace HEVCEHW { static ImplBase* CreateSpecific( eMFXHWType HW , VideoCORE& core , mfxStatus& status , eFeatureMode mode) { if (HW >= MFX_HW_MTL) return new HEVCEHWDisp::Xe_LPM_Plus::MFXVideoENCODEH265_HW(core, status, mode); if (HW >= MFX_HW_DG2) return new HEVCEHWDisp::Xe_HPM::MFXVideoENCODEH265_HW(core, status, mode); if (HW == MFX_HW_DG1) return new HEVCEHWDisp::DG1::MFXVideoENCODEH265_HW(core, status, mode); return new HEVCEHWDisp::TGL::MFXVideoENCODEH265_HW(core, status, mode); } VideoENCODE* Create( VideoCORE& core , mfxStatus& status) { auto hw = core.GetHWType(); if (hw < MFX_HW_TGL_LP) { status = MFX_ERR_UNSUPPORTED; return nullptr; } auto p = CreateSpecific(hw, core, status, eFeatureMode::INIT); return p; } mfxStatus QueryIOSurf( VideoCORE *core , mfxVideoParam *par , mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR3(core, par, request); auto hw = core->GetHWType(); if (hw < MFX_HW_TGL_LP) MFX_RETURN(MFX_ERR_UNSUPPORTED); mfxStatus sts = MFX_ERR_NONE; std::unique_ptr impl(CreateSpecific(hw, *core, sts, eFeatureMode::QUERY_IO_SURF)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); impl.reset(impl.release()->ApplyMode(IMPL_MODE_DEFAULT)); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->InternalQueryIOSurf(*core, *par, *request); } mfxStatus Query( VideoCORE *core , mfxVideoParam *in , mfxVideoParam *out) { MFX_CHECK_NULL_PTR2(core, out); auto hw = core->GetHWType(); if (hw < MFX_HW_TGL_LP) MFX_RETURN(MFX_ERR_UNSUPPORTED); if (in) { const mfxExtEncoderResetOption* pResetOpt = ExtBuffer::Get(*in); MFX_CHECK(!pResetOpt, MFX_ERR_NONE); } mfxStatus sts = MFX_ERR_NONE; std::unique_ptr impl(CreateSpecific(hw, *core, sts, in ? eFeatureMode::QUERY1 : eFeatureMode::QUERY0)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); impl.reset(impl.release()->ApplyMode(IMPL_MODE_DEFAULT)); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->InternalQuery(*core, in, *out); } mfxStatus QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { auto hw = core.GetHWType(); if (hw < MFX_HW_TGL_LP) MFX_RETURN(MFX_ERR_UNSUPPORTED); mfxStatus sts = MFX_ERR_NONE; std::unique_ptr impl(CreateSpecific(hw, core, sts, eFeatureMode::QUERY_IMPLS_DESCRIPTION)); MFX_CHECK_STS(sts); MFX_CHECK(impl, MFX_ERR_UNKNOWN); return impl->QueryImplsDescription(core, caps, ah); } } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/hevcehw_disp.h000066400000000000000000000033301443134507600300550ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "mfxvideo++int.h" namespace HEVCEHW { VideoENCODE* Create( VideoCORE& core , mfxStatus& status); mfxStatus QueryIOSurf( VideoCORE *core , mfxVideoParam *par , mfxFrameAllocRequest *request); mfxStatus Query( VideoCORE *core , mfxVideoParam *in , mfxVideoParam *out); mfxStatus QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/000077500000000000000000000000001443134507600263745ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base/000077500000000000000000000000001443134507600273065ustar00rootroot00000000000000hevcehw_base_caps_lin.h000066400000000000000000000050321443134507600336730ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_caps.h" namespace HEVCEHW { namespace Linux { namespace Base { class Caps : public HEVCEHW::Base::Caps { public: Caps(mfxU32 FeatureId) : HEVCEHW::Base::Caps(FeatureId) {} protected: virtual void SetSpecificCaps(HEVCEHW::Base::EncodeCapsHevc& caps) override { caps.CodingLimitSet = 1; caps.Color420Only = 0; caps.SliceIPBOnly = 1; caps.NoMinorMVs = 1; caps.RawReconRefToggle = 1; caps.NoInterlacedField = 1; caps.MaxNumOfROI = 16; caps.ROIDeltaQPSupport = 1; caps.BlockSize = 1; caps.SliceLevelReportSupport = 1; caps.FrameSizeToleranceSupport = 1; caps.NumScalablePipesMinus1 = 1; caps.NoWeightedPred = 0; caps.LumaWeightedPred = 1; caps.ChromaWeightedPred = 0; caps.MaxNum_WeightedPredL0 = 4; caps.MaxNum_WeightedPredL1 = 2; caps.HRDConformanceSupport = 1; caps.TileSupport = 1; caps.YUV444ReconSupport = 1; caps.IntraRefreshBlockUnitSize = 2; } }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_dirty_rect_lin.cpp000066400000000000000000000061721443134507600354560ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_dirty_rect_lin.h" #include "hevcehw_base_va_packer_lin.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Linux::Base::DirtyRect::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_SetCallChains , [this](StorageRW& global, StorageRW& /*local*/) -> mfxStatus { auto& vaPacker = VAPacker::CC::Get(global); vaPacker.AddPerPicMiscData[VAEncMiscParameterTypeDirtyRect].Push([this]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& global , const StorageR& s_task , std::list>& data) { auto dirtyRect = GetRTExtBuffer(global, s_task); auto& vaDirtyRect = AddVaMisc(VAEncMiscParameterTypeDirtyRect, data); vaDirtyRect.num_roi_rectangle = 0; m_vaDirtyRects.clear(); for (int i = 0; i < dirtyRect.NumRect; i++) { if (SkipRectangle(dirtyRect.Rect[i])) continue; /* Driver expects width x height rect and MSDK uses the 'open' edge rect, so width = right - left. Borders will be further aligned in driver. We expect here Right > Left and Bottom > Top */ m_vaDirtyRects.push_back({ int16_t(dirtyRect.Rect[i].Left) , int16_t(dirtyRect.Rect[i].Top) , uint16_t((dirtyRect.Rect[i].Right - dirtyRect.Rect[i].Left)) , uint16_t((dirtyRect.Rect[i].Bottom - dirtyRect.Rect[i].Top)) }); } vaDirtyRect.roi_rectangle = m_vaDirtyRects.empty() ? nullptr : m_vaDirtyRects.data(); vaDirtyRect.num_roi_rectangle = m_vaDirtyRects.size(); return vaDirtyRect.num_roi_rectangle ? 1 : 0; }); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_dirty_rect_lin.h000066400000000000000000000033161443134507600351200ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_dirty_rect.h" #include "va/va.h" namespace HEVCEHW { namespace Linux { namespace Base { class DirtyRect : public HEVCEHW::Base::DirtyRect { public: DirtyRect(mfxU32 FeatureId) : HEVCEHW::Base::DirtyRect(FeatureId) {} protected: virtual void InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) override; std::vector m_vaDirtyRects = std::vector(MAX_NUM_DIRTY_RECT);; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_encoded_frame_info_lin.h000066400000000000000000000040421443134507600365330ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_encoded_frame_info.h" #include "hevcehw_base_va_packer_lin.h" #include "va/va.h" namespace HEVCEHW { namespace Linux { namespace Base { class EncodedFrameInfo : public HEVCEHW::Base::EncodedFrameInfo { public: EncodedFrameInfo(mfxU32 FeatureId) : HEVCEHW::Base::EncodedFrameInfo(FeatureId) {} protected: virtual mfxStatus GetDdiInfo( const void* pDdiFeedback , mfxExtAVCEncodedFrameInfo& info) override { MFX_CHECK(pDdiFeedback, MFX_ERR_UNDEFINED_BEHAVIOR); auto& fb = *(const VACodedBufferSegment*)pDdiFeedback; info.QP = mfxU16(fb.status & VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK); return MFX_ERR_NONE; } }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_interlace_lin.cpp000066400000000000000000000044551443134507600352560ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_interlace_lin.h" #include "hevcehw_base_va_packer_lin.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Linux::Base::Interlace::SubmitTask(const FeatureBlocks& blocks, TPushST Push) { HEVCEHW::Base::Interlace::SubmitTask(blocks, Push); Push(BLK_PatchDDITask , [](StorageW& global, StorageW& /*s_task*/) -> mfxStatus { auto& par = Glob::VideoParam::Get(global); MFX_CHECK(IsField(par.mfx.FrameInfo.PicStruct), MFX_ERR_NONE); auto& ddiPar = Glob::DDI_SubmitParam::Get(global); auto it = std::find_if(std::begin(ddiPar), std::end(ddiPar) , [](DDIExecParam& ep) { return (ep.Function == VAEncSequenceParameterBufferType); }); MFX_CHECK(it != std::end(ddiPar) && it->In.pData, MFX_ERR_NONE); auto& sps = *(VAEncSequenceParameterBufferHEVC*)it->In.pData; sps.intra_period = par.mfx.GopPicSize * 2; sps.intra_idr_period = par.mfx.GopPicSize * par.mfx.IdrInterval * 2; sps.ip_period = mfxU8(par.mfx.GopRefDist * 2); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_interlace_lin.h000066400000000000000000000032111443134507600347100ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_interlace.h" namespace HEVCEHW { namespace Linux { namespace Base { class Interlace : public HEVCEHW::Base::Interlace { public: Interlace(mfxU32 FeatureId) : HEVCEHW::Base::Interlace(FeatureId) {} protected: virtual void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base/hevcehw_base_lin.cpp000066400000000000000000000126741443134507600333110ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_lin.h" #include "hevcehw_base_data.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_parser.h" #include "hevcehw_base_recon_info_lin.h" #include "hevcehw_base_packer.h" #include "hevcehw_base_hrd.h" #include "hevcehw_base_alloc.h" #include "hevcehw_base_task.h" #include "hevcehw_base_ext_brc.h" #include "hevcehw_base_dirty_rect_lin.h" #include "hevcehw_base_hdr_sei.h" #include "hevcehw_base_va_lin.h" #include "hevcehw_base_va_packer_lin.h" #include "hevcehw_base_interlace_lin.h" #include "hevcehw_base_encoded_frame_info_lin.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base_weighted_prediction_lin.h" #endif #if defined (MFX_ENABLE_HEVC_CUSTOM_QMATRIX) #include "hevcehw_base_qmatrix_lin.h" #endif #if defined(MFX_ENABLE_HEVCE_ROI) #include "hevcehw_base_roi_lin.h" #endif #include "hevcehw_base_max_frame_size_lin.h" #ifdef MFX_ENABLE_ENCTOOLS #include "hevcehw_base_enctools.h" #endif #include "hevcehw_base_query_impl_desc.h" #include using namespace HEVCEHW; using namespace HEVCEHW::Base; Linux::Base::MFXVideoENCODEH265_HW::MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : HEVCEHW::Base::MFXVideoENCODEH265_HW(core) { status = MFX_ERR_UNKNOWN; auto vaType = core.GetVAType(); m_features.emplace_back(new Parser(FEATURE_PARSER)); m_features.emplace_back(new Allocator(FEATURE_ALLOCATOR)); if (vaType == MFX_HW_VAAPI) { m_features.emplace_back(new DDI_VA(FEATURE_DDI)); } else { status = MFX_ERR_UNSUPPORTED; return; } m_features.emplace_back(new VAPacker(FEATURE_DDI_PACKER)); m_features.emplace_back(new Legacy(FEATURE_LEGACY)); m_features.emplace_back(new ReconInfo(FEATURE_RECON_INFO)); m_features.emplace_back(new HRD(FEATURE_HRD)); m_features.emplace_back(new TaskManager(FEATURE_TASK_MANAGER)); m_features.emplace_back(new Packer(FEATURE_PACKER)); m_features.emplace_back(new ExtBRC(FEATURE_EXT_BRC)); m_features.emplace_back(new DirtyRect(FEATURE_DIRTY_RECT)); m_features.emplace_back(new HdrSei(FEATURE_HDR_SEI)); m_features.emplace_back(new Interlace(FEATURE_INTERLACE)); m_features.emplace_back(new EncodedFrameInfo(FEATURE_ENCODED_FRAME_INFO)); #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) m_features.emplace_back(new WeightPred(FEATURE_WEIGHTPRED)); #endif //defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #if defined (MFX_ENABLE_HEVC_CUSTOM_QMATRIX) m_features.emplace_back(new QMatrix(FEATURE_QMATRIX)); #endif #if defined(MFX_ENABLE_HEVCE_ROI) m_features.emplace_back(new ROI(FEATURE_ROI)); #endif m_features.emplace_back(new MaxFrameSize(FEATURE_MAX_FRAME_SIZE)); m_features.emplace_back(new QueryImplDesc(FEATURE_QUERY_IMPL_DESC)); #if defined(MFX_ENABLE_ENCTOOLS) m_features.emplace_back(new HevcEncTools(FEATURE_ENCTOOLS)); #endif InternalInitFeatures(status, mode); if (mode & INIT) { auto& qIA = BQ::Get(*this); Reorder(qIA , { FEATURE_LEGACY, Legacy::BLK_AllocRaw } , { FEATURE_RECON_INFO, ReconInfo::BLK_AllocRec } , PLACE_AFTER); Reorder(qIA , { FEATURE_RECON_INFO, ReconInfo::BLK_AllocRec } , { FEATURE_DDI, IDDI::BLK_CreateService } , PLACE_AFTER); qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_DIRTY_RECT, DirtyRect::BLK_SetCallChains })); #if defined(MFX_ENABLE_HEVCE_ROI) qIA.splice(qIA.end(), qIA, Get(qIA, { FEATURE_ROI, ROI::BLK_SetCallChains })); #endif } } mfxStatus Linux::Base::MFXVideoENCODEH265_HW::Init(mfxVideoParam *par) { mfxStatus sts = HEVCEHW::Base::MFXVideoENCODEH265_HW::Init(par); MFX_CHECK(sts >= MFX_ERR_NONE, sts); { auto& queue = BQ::Get(*this); Reorder(queue , { FEATURE_DDI_PACKER, VAPacker::BLK_QueryTask } , { FEATURE_ENCODED_FRAME_INFO, EncodedFrameInfo::BLK_QueryTask }); } { auto& queue = BQ::Get(*this); #if defined (MFX_ENABLE_HEVC_CUSTOM_QMATRIX) Reorder(queue , { FEATURE_DDI, IDDI::BLK_SubmitTask } , { FEATURE_QMATRIX, QMatrix::BLK_PatchDDITask }); #endif //defined(MFX_ENABLE_HEVC_CUSTOM_QMATRIX) } return sts; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base/hevcehw_base_lin.h000066400000000000000000000032421443134507600327450ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_impl.h" namespace HEVCEHW { namespace Linux { namespace Base { class MFXVideoENCODEH265_HW : public HEVCEHW::Base::MFXVideoENCODEH265_HW { public: MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); virtual mfxStatus Init(mfxVideoParam *par) override; }; } //Base } //Linux }// namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_max_frame_size_lin.cpp000066400000000000000000000051461443134507600362770ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_max_frame_size_lin.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_va_packer_lin.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void HEVCEHW::Linux::Base::MaxFrameSize::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_Init , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(Glob::VideoParam::Get(strg)); m_bPatchNextDDITask = !!CO2.MaxFrameSize; auto vaType = Glob::VideoCore::Get(strg).GetVAType(); MFX_CHECK(vaType == MFX_HW_VAAPI, MFX_ERR_NONE); if (m_bPatchNextDDITask) { auto& cc = VAPacker::CC::GetOrConstruct(strg); cc.AddPerSeqMiscData[VAEncMiscParameterTypeMaxFrameSize].Push([]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(Glob::VideoParam::Get(strg)); auto& maxfs = AddVaMisc( VAEncMiscParameterTypeMaxFrameSize , data); maxfs.max_frame_size = CO2.MaxFrameSize * 8; return true; }); } return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_max_frame_size_lin.h000066400000000000000000000032351443134507600357410ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_max_frame_size.h" namespace HEVCEHW { namespace Linux { namespace Base { class MaxFrameSize : public HEVCEHW::Base::MaxFrameSize { public: MaxFrameSize(mfxU32 FeatureId) : HEVCEHW::Base::MaxFrameSize(FeatureId) {} protected: virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_qp_modulation_lin.cpp000066400000000000000000000101571443134507600361570ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_qp_modulation_lin.h" #include "hevcehw_base_data.h" #include "hevcehw_base_va_packer_lin.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Linux::Base::QpModulation::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetCallChains, [](StorageRW& strg, StorageRW&) -> mfxStatus { auto& cc = Base::VAPacker::CC::GetOrConstruct(strg); auto hwType = Glob::VideoCore::Get(strg).GetHWType(); cc.InitSPS.Push([hwType]( Base::VAPacker::CallChains::TInitSPS::TExt prev , const StorageR& glob , VAEncSequenceParameterBufferHEVC& sps) { prev(glob, sps); const mfxVideoParam& par = Glob::VideoParam::Get(glob); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); Defaults::Param dflts( par , Glob::EncodeCaps::Get(glob) , hwType , Glob::Defaults::Get(glob)); mfxU16 numTL = dflts.base.GetNumTemporalLayers(dflts); sps.seq_fields.bits.hierachical_flag = (CO2.BRefType == MFX_B_REF_PYRAMID) || (numTL > 1 && numTL < 4); sps.ip_period = (IsOn(par.mfx.LowPower) && sps.seq_fields.bits.low_delay_seq && sps.seq_fields.bits.hierachical_flag) ? (1 << (numTL - 1)) : sps.ip_period; // distance between anchor frames for driver }); cc.UpdatePPS.Push([]( Base::VAPacker::CallChains::TUpdatePPS::TExt prev , const StorageR& global , const StorageR& s_task , const VAEncSequenceParameterBufferHEVC& sps , VAEncPictureParameterBufferHEVC& pps) { prev(global, s_task, sps, pps); auto& task = Task::Common::Get(s_task); auto& bsSPS = Glob::SPS::Get(global); bool bHLByCodingType = !sps.seq_fields.bits.low_delay_seq && sps.seq_fields.bits.hierachical_flag; bool bHLByTemporalID = sps.seq_fields.bits.low_delay_seq && bsSPS.max_sub_layers_minus1; bool bHLByPyrLevel = sps.seq_fields.bits.low_delay_seq && !bHLByTemporalID; // QP modulation in LDB mode SetIf(pps.hierarchical_level_plus1, bHLByTemporalID, task.TemporalID + 1); SetIf(pps.hierarchical_level_plus1, bHLByPyrLevel, task.PyramidLevel + 1); // QP modulation in RAB mode if (bHLByCodingType) { ThrowAssert(Check(task.CodingType), "invalid coding type"); pps.hierarchical_level_plus1 = (task.CodingType - 1) * (task.CodingType > 3); pps.hierarchical_level_plus1 += 2 * (task.CodingType == 3 && !task.isLDB); pps.hierarchical_level_plus1 += !pps.hierarchical_level_plus1; pps.pic_fields.bits.coding_type = std::min(task.CodingType, mfxU8(3)); } }); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_qp_modulation_lin.h000066400000000000000000000033641443134507600356260ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" namespace HEVCEHW { namespace Linux { namespace Base { class QpModulation : public FeatureBase { public: #define DECL_BLOCK_LIST\ DECL_BLOCK(SetCallChains) #define DECL_FEATURE_NAME "Base_QpModulation" #include "hevcehw_decl_blocks.h" QpModulation(mfxU32 FeatureId) : FeatureBase(FeatureId) {} protected: virtual void InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) override; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_recon_info_lin.h000066400000000000000000000051711443134507600350720ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_base_data.h" #include "hevcehw_base_recon_info.h" namespace HEVCEHW { namespace Linux { namespace Base { class ReconInfo : public HEVCEHW::Base::ReconInfo { public: ReconInfo(mfxU32 FeatureId) : HEVCEHW::Base::ReconInfo(FeatureId) { ModRec[0] = { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , [](mfxFrameInfo& rec) { rec.FourCC = MFX_FOURCC_AYUV; } } , { mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , [](mfxFrameInfo& rec) { rec.FourCC = MFX_FOURCC_NV12; } } }; ModRec[1] = { { mfxU16(1 + MFX_CHROMAFORMAT_YUV444) , [](mfxFrameInfo& rec) { rec.FourCC = MFX_FOURCC_Y410; } } , { mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , [](mfxFrameInfo& rec) { rec.FourCC = MFX_FOURCC_P010; } } }; } }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_rext_lin.cpp000066400000000000000000000025031443134507600342620ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_rext_lin.h" #include "va/va.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_rext_lin.h000066400000000000000000000036001443134507600337260ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_rext.h" namespace HEVCEHW { namespace Linux { namespace Base { class RExt : public HEVCEHW::Base::RExt { public: RExt(mfxU32 FeatureId) : HEVCEHW::Base::RExt(FeatureId) { mUpdateRecInfo = { { mfxU16(1 + MFX_CHROMAFORMAT_YUV420) , [](mfxFrameInfo& rec, mfxU16& type, bool /*bVDEnc*/) { if (rec.BitDepthLuma == 10) rec.FourCC = MFX_FOURCC_P010; else rec.FourCC = MFX_FOURCC_P016; } } }; } }; } //Linux } //Base } //HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_roi_lin.cpp000066400000000000000000000064771443134507600341070ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_ROI) #include "hevcehw_base_roi_lin.h" #include "hevcehw_base_va_packer_lin.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Linux::Base::ROI::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_SetCallChains , [this](StorageRW& global, StorageRW& /*local*/) -> mfxStatus { auto& vaPacker = VAPacker::CC::Get(global); MFX_CHECK(!m_bViaCuQp, MFX_ERR_NONE); vaPacker.AddPerPicMiscData[VAEncMiscParameterTypeROI].Push([this]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& global , const StorageR& s_task , std::list>& data) { auto roi = GetRTExtBuffer(global, s_task); bool bNeedROI = !!roi.NumROI; if (bNeedROI) { auto& caps = Glob::EncodeCaps::Get(global); auto& par = Glob::VideoParam::Get(global); CheckAndFixROI(caps, par, roi); bNeedROI = !!roi.NumROI; } if (bNeedROI) { auto& vaROI = AddVaMisc(VAEncMiscParameterTypeROI, data); auto MakeVAEncROI = [](const RectData& rect) { VAEncROI roi = {}; roi.roi_rectangle.x = rect.Left; roi.roi_rectangle.y = rect.Top; roi.roi_rectangle.width = rect.Right - rect.Left; roi.roi_rectangle.height = rect.Bottom - rect.Top; roi.roi_value = int8_t(rect.DeltaQP); return roi; }; m_vaROI.resize(roi.NumROI); vaROI.num_roi = roi.NumROI; vaROI.roi = m_vaROI.data(); std::transform(roi.ROI, roi.ROI + roi.NumROI, vaROI.roi, MakeVAEncROI); vaROI.max_delta_qp = 51; vaROI.min_delta_qp = -51; vaROI.roi_flags.bits.roi_value_is_qp_delta = 1; } return bNeedROI; }); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_HEVCE_ROI) hevcehw_base_roi_lin.h000066400000000000000000000031521443134507600335370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_ROI) #include "hevcehw_base_roi.h" #include "va/va.h" namespace HEVCEHW { namespace Linux { namespace Base { class ROI : public HEVCEHW::Base::ROI { public: ROI(mfxU32 FeatureId) : HEVCEHW::Base::ROI(FeatureId) {} protected: virtual void InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) override; std::vector m_vaROI; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_HEVCE_ROI) hevcehw_base_scc_lin.h000066400000000000000000000057761443134507600335340ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_scc.h" #include "va/va.h" #include "hevcehw_base_va_packer_lin.h" namespace HEVCEHW { namespace Linux { namespace Base { class SCC : public HEVCEHW::Base::SCC { public: SCC(mfxU32 FeatureId) : HEVCEHW::Base::SCC(FeatureId) {} protected: void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override { Push(BLK_PatchDDITask , [this](StorageW& global, StorageW& /*s_task*/) -> mfxStatus { MFX_CHECK(m_bPatchNextDDITask || m_bPatchDDISlices, MFX_ERR_NONE); auto& ddiPar = HEVCEHW::Base::Glob::DDI_SubmitParam::Get(global); auto itPPS = std::find_if(std::begin(ddiPar), std::end(ddiPar) , [](HEVCEHW::Base::DDIExecParam& ep) { return (ep.Function == VAEncPictureParameterBufferType); }); MFX_CHECK(itPPS != std::end(ddiPar) && itPPS->In.pData, MFX_ERR_NOT_FOUND); auto& ddiPPS = *(VAEncPictureParameterBufferHEVC*)itPPS->In.pData; if(m_bPatchNextDDITask) { m_bPatchNextDDITask = false; auto itSPS = std::find_if(std::begin(ddiPar), std::end(ddiPar) , [](HEVCEHW::Base::DDIExecParam& ep) { return (ep.Function == VAEncSequenceParameterBufferType); }); MFX_CHECK(itSPS != std::end(ddiPar) && itSPS->In.pData, MFX_ERR_NOT_FOUND); auto& ddiSPS = *(VAEncSequenceParameterBufferHEVC*)itSPS->In.pData; ddiSPS.scc_fields.bits.palette_mode_enabled_flag = SpsExt::Get(global).palette_mode_enabled_flag; ddiPPS.scc_fields.bits.pps_curr_pic_ref_enabled_flag = PpsExt::Get(global).curr_pic_ref_enabled_flag; } return MFX_ERR_NONE; }); } }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_va_lin.cpp000066400000000000000000000564321443134507600337200ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "hevcehw_base_va_lin.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; using namespace HEVCEHW::Linux; using namespace HEVCEHW::Linux::Base; mfxStatus PickDDIIDNormal(VAID*& DDIID, Defaults::Param defPar, const mfxVideoParam& par) { const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(defPar.mvp); bool bBDInvalid = pCO3 && Check(pCO3->TargetBitDepthLuma); bool bCFInvalid = pCO3 && Check (pCO3->TargetChromaFormatPlus1); mfxU16 bitDepth = 8 * (defPar.base.GetProfile(defPar) == MFX_PROFILE_HEVC_MAIN); mfxU16 chromFormat = 0; auto mvpCopy = defPar.mvp; mvpCopy.NumExtParam = 0; Defaults::Param parCopy(mvpCopy, defPar.caps, defPar.hw, defPar.base); auto pParForBD = &defPar; auto pParForCF = &defPar; SetIf(pParForBD, bBDInvalid, &parCopy); SetIf(pParForCF, bCFInvalid, &parCopy); SetIf(bitDepth, !bitDepth, [&]() { return pParForBD->base.GetTargetBitDepthLuma(*pParForBD); }); SetIf(chromFormat, !chromFormat, [&]() { return mfxU16(pParForCF->base.GetTargetChromaFormat(*pParForCF) - 1); }); static const std::map> VAIDSupported[2] = { //LowPower = OFF { { mfxU16(8), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCMain, VAEntrypointEncSlice}} , {mfxU16(MFX_CHROMAFORMAT_YUV422), VAID{VAProfileHEVCMain422_10, VAEntrypointEncSlice}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCMain444, VAEntrypointEncSlice}} } } , { mfxU16(10), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCMain10, VAEntrypointEncSlice}} , {mfxU16(MFX_CHROMAFORMAT_YUV422), VAID{VAProfileHEVCMain422_10, VAEntrypointEncSlice}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCMain444_10, VAEntrypointEncSlice}} } } } //LowPower = ON ,{ { mfxU16(8), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCMain, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV422), VAID{VAProfileHEVCMain422_10, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCMain444, VAEntrypointEncSliceLP}} } } , { mfxU16(10), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCMain10, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV422), VAID{VAProfileHEVCMain422_10, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCMain444_10, VAEntrypointEncSliceLP}} } } } }; bool bLowPower = IsOn(par.mfx.LowPower); // Choose and return VAID MFX_CHECK((bitDepth == 8 || bitDepth == 10), MFX_ERR_NONE); DDIID = const_cast(&VAIDSupported[bLowPower].at(bitDepth).at(chromFormat)); return MFX_ERR_NONE; } mfxStatus PickDDIIDREXT(VAID* &DDIID, const mfxVideoParam& par) { auto& fi = par.mfx.FrameInfo; const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); MFX_CHECK(fi.BitDepthLuma <= 12, MFX_ERR_NONE); MFX_CHECK(fi.BitDepthChroma <= 12, MFX_ERR_NONE); MFX_CHECK(!pCO3 || pCO3->TargetBitDepthLuma <= 12, MFX_ERR_NONE); MFX_CHECK(!pCO3 || pCO3->TargetBitDepthChroma <= 12, MFX_ERR_NONE); MFX_CHECK(!IsOn(par.mfx.LowPower), MFX_ERR_NONE); static const std::map < mfxU32, ::VAID> VAIDSupported12bit = { {mfxU32(MFX_FOURCC_P016) , VAID{VAProfileHEVCMain12, VAEntrypointEncSlice}} ,{mfxU32(MFX_FOURCC_Y216), VAID{VAProfileHEVCMain422_12, VAEntrypointEncSlice}} ,{mfxU32(MFX_FOURCC_Y416), VAID{VAProfileHEVCMain444_12, VAEntrypointEncSlice}} }; MFX_CHECK(fi.FourCC == MFX_FOURCC_P016 || fi.FourCC == MFX_FOURCC_Y216 || fi.FourCC == MFX_FOURCC_Y416, MFX_ERR_NONE); SetIf(DDIID, fi.FourCC == MFX_FOURCC_P016, const_cast(&VAIDSupported12bit.at(fi.FourCC))); SetIf(DDIID, fi.FourCC == MFX_FOURCC_Y216, const_cast(&VAIDSupported12bit.at(fi.FourCC))); SetIf(DDIID, fi.FourCC == MFX_FOURCC_Y416, const_cast(&VAIDSupported12bit.at(fi.FourCC))); return MFX_ERR_NONE; } mfxStatus PickDDIIDSCC(VAID* &DDIID, const mfxVideoParam& par) { MFX_CHECK(par.mfx.CodecProfile == MFX_PROFILE_HEVC_SCC, MFX_ERR_NONE); MFX_CHECK(IsOn(par.mfx.LowPower), MFX_ERR_NONE); static const std::map> VAIDSupported = { { mfxU16(8), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCSccMain, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCSccMain444, VAEntrypointEncSliceLP}} } } , { mfxU16(10), { {mfxU16(MFX_CHROMAFORMAT_YUV420), VAID{VAProfileHEVCSccMain10, VAEntrypointEncSliceLP}} , {mfxU16(MFX_CHROMAFORMAT_YUV444), VAID{VAProfileHEVCSccMain444_10, VAEntrypointEncSliceLP}} } } }; auto& fi = par.mfx.FrameInfo; const mfxExtCodingOption3* pCO3 = ExtBuffer::Get(par); mfxU16 bd = 8, cf = fi.ChromaFormat; bd = std::max(bd, fi.BitDepthLuma); bd = std::max(bd, fi.BitDepthChroma); if (pCO3) { bd = std::max(bd, pCO3->TargetBitDepthLuma); bd = std::max(bd, pCO3->TargetBitDepthChroma); if (pCO3->TargetChromaFormatPlus1) cf = std::max(cf, pCO3->TargetChromaFormatPlus1 - 1); } // Check that list of VAIDs contains VAU for resulting BitDepth, ChromaFormat MFX_CHECK(VAIDSupported.count(bd) && VAIDSupported.at(bd).count(cf), MFX_ERR_NONE); // Choose and return VAID DDIID = const_cast(&VAIDSupported.at(bd).at(cf)); return MFX_ERR_NONE; } mfxStatus DDI_VA::SetDDIID(VAID* &DDIID, const mfxVideoParam& par, StorageRW& strg) { VideoCORE& core = Glob::VideoCore::Get(strg); auto& defaults = Glob::Defaults::Get(strg); EncodeCapsHevc fakeCaps = {}; Defaults::Param defPar(par, fakeCaps, core.GetHWType(), defaults); fakeCaps.MaxEncodedBitDepth = true; fakeCaps.YUV422ReconSupport = Glob::DDIIDSetting::GetOrConstruct(strg).EnableRecon422 || !IsOn(par.mfx.LowPower); fakeCaps.YUV444ReconSupport = true; MFX_CHECK_STS(PickDDIIDNormal(DDIID, defPar, par)); MFX_CHECK_STS(PickDDIIDREXT(DDIID, par)); MFX_CHECK_STS(PickDDIIDSCC(DDIID, par)); MFX_CHECK_NULL_PTR1(DDIID); return MFX_ERR_NONE; } void DDI_VA::Query1NoCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_SetCallChains , [this](const mfxVideoParam&, mfxVideoParam& /*par*/, StorageRW& strg) -> mfxStatus { auto& ddiExec = Glob::DDI_Execute::GetOrConstruct(strg); MFX_CHECK(!ddiExec, MFX_ERR_NONE); ddiExec.Push([&](Glob::DDI_Execute::TRef::TExt, const DDIExecParam& ep) { return Execute(ep); }); m_callVa = ddiExec; return MFX_ERR_NONE; }); Push(BLK_SetDDIID , [this](const mfxVideoParam&, mfxVideoParam& out, StorageRW& strg) -> mfxStatus { if (strg.Contains(Glob::DDIIDSetting::Key)) { auto& ddiidSetting = Glob::DDIIDSetting::Get(strg); MFX_CHECK(!ddiidSetting.DDIID, MFX_ERR_NONE); } if (strg.Contains(Glob::RealState::Key)) { //don't change VAID in Reset auto& initPar = Glob::RealState::Get(strg); strg.Insert(Glob::DDIIDSetting::Key, make_storable(Glob::DDIIDSetting::Get(initPar))); return MFX_ERR_NONE; } VAID* vaid = nullptr; MFX_SAFE_CALL(SetDDIID(vaid, out, strg)); MFX_CHECK_NULL_PTR1(vaid); auto& ddiidSetting = Glob::DDIIDSetting::GetOrConstruct(strg); ddiidSetting.DDIID = (void*)vaid; return MFX_ERR_NONE; }); } void DDI_VA::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_QueryCaps , [this](const mfxVideoParam&, mfxVideoParam& /*par*/, StorageRW& strg) -> mfxStatus { MFX_CHECK(strg.Contains(Glob::DDIIDSetting::Key), MFX_ERR_UNSUPPORTED); auto& ddiidSetting = Glob::DDIIDSetting::Get(strg); MFX_CHECK(ddiidSetting.DDIID, MFX_ERR_UNSUPPORTED); auto& core = Glob::VideoCore::Get(strg); VAID* vaid = (VAID*)ddiidSetting.DDIID; MFX_CHECK_NULL_PTR1(vaid); auto vap = VAProfile(vaid->Profile); auto vaep = VAEntrypoint(vaid->Entrypoint); bool bNeedNewDevice = !IsValid() || vap != m_profile || vaep != m_entrypoint; m_callVa = Glob::DDI_Execute::Get(strg); if (bNeedNewDevice) { mfxStatus sts = Create(core, vap, vaep); MFX_CHECK_STS(sts); sts = QueryCaps(); MFX_CHECK_STS(sts); } Glob::EncodeCaps::GetOrConstruct(strg) = m_caps; return MFX_ERR_NONE; }); } void DDI_VA::InitExternal(const FeatureBlocks& /*blocks*/, TPushIE Push) { Push(BLK_CreateDevice , [this](const mfxVideoParam& /*par*/, StorageRW& strg, StorageRW&) -> mfxStatus { auto& core = Glob::VideoCore::Get(strg); auto& ddiidSetting = Glob::DDIIDSetting::GetOrConstruct(strg); VAID* vaid = (VAID*)ddiidSetting.DDIID; MFX_CHECK_NULL_PTR1(vaid); auto vap = VAProfile(vaid->Profile); auto vaep = VAEntrypoint(vaid->Entrypoint); bool bNeedNewDevice = !IsValid() || vap != m_profile || vaep != m_entrypoint; m_callVa = Glob::DDI_Execute::Get(strg); MFX_CHECK(bNeedNewDevice, MFX_ERR_NONE); mfxStatus sts = Create(core, vap, vaep); MFX_CHECK_STS(sts); sts = QueryCaps(); MFX_CHECK_STS(sts); return sts; }); } mfxStatus DDI_VA::CreateVABuffers( const std::list& par , std::vector& pool) { pool.resize(par.size(), VA_INVALID_ID); std::transform(par.begin(), par.end(), pool.begin() , [this](const DDIExecParam& p) { return CreateVABuffer(p); }); bool bFailed = pool.end() != std::find(pool.begin(), pool.end(), VA_INVALID_ID); MFX_CHECK(!bFailed, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus DDI_VA::DestroyVABuffers(std::vector& pool) { bool bFailed = std::any_of(pool.begin(), pool.end() , [this](VABufferID id) { return !!DestroyVABuffer(id); }); pool.clear(); MFX_CHECK(!bFailed, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } void DDI_VA::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_CreateService , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { const auto& par = Glob::VideoParam::Get(strg); const mfxExtHEVCParam& hevcPar = ExtBuffer::Get(par); mfxStatus sts; m_callVa = Glob::DDI_Execute::Get(strg); std::vector attrib(2); attrib[0].type = VAConfigAttribRTFormat; attrib[1].type = VAConfigAttribRateControl; sts = MfxEncodeHW::DeviceVAAPI::QueryCaps(attrib.data(), attrib.size() * sizeof(VAConfigAttrib)); MFX_CHECK_STS(sts); MFX_CHECK(attrib[0].value & (VA_RT_FORMAT_YUV420|VA_RT_FORMAT_YUV420_10), MFX_ERR_DEVICE_FAILED); uint32_t vaRCType = ConvertRateControlMFX2VAAPI(par.mfx.RateControlMethod, Legacy::IsSWBRC(par)); MFX_CHECK((attrib[1].value & vaRCType), MFX_ERR_DEVICE_FAILED); attrib[1].value = vaRCType; sts = MfxEncodeHW::DeviceVAAPI::Init( hevcPar.PicWidthInLumaSamples , hevcPar.PicHeightInLumaSamples , VA_PROGRESSIVE , Glob::AllocRec::Get(strg).GetResponse() , attrib.data() , int(attrib.size())); MFX_CHECK_STS(sts); auto& info = Tmp::BSAllocInfo::GetOrConstruct(local); // request linear buffer info.Info.FourCC = MFX_FOURCC_P8; // context_id required for allocation video memory (tmp solution) info.AllocId = m_vaContextEncode; info.Info.Width = hevcPar.PicWidthInLumaSamples * 2; info.Info.Height = hevcPar.PicHeightInLumaSamples; return MFX_ERR_NONE; }); Push(BLK_Register , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& res = Glob::DDI_Resources::Get(strg); auto itBs = std::find_if(res.begin(), res.end() , [](decltype(*res.begin()) r) { return r.Function == MFX_FOURCC_P8; }); MFX_CHECK(itBs != res.end(), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(itBs->Resource.Size == sizeof(VABufferID), MFX_ERR_UNDEFINED_BEHAVIOR); VABufferID* pBsBegin = (VABufferID*)itBs->Resource.pData; m_bs.assign(pBsBegin, pBsBegin + itBs->Resource.Num); mfxStatus sts = CreateVABuffers( Tmp::DDI_InitParam::Get(local) , m_perSeqPar); MFX_CHECK_STS(sts); return MFX_ERR_NONE; }); } void DDI_VA::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { mfxStatus sts; m_callVa = Glob::DDI_Execute::Get(strg); sts = DestroyVABuffers(m_perSeqPar); MFX_CHECK_STS(sts); sts = CreateVABuffers( Tmp::DDI_InitParam::Get(local) , m_perSeqPar); MFX_CHECK_STS(sts); return MFX_ERR_NONE; }); } void DDI_VA::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SubmitTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { mfxStatus sts; auto& task = Task::Common::Get(s_task); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H265 encode DDISubmitTask"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_INFO, 0, make_event_data(this)); m_callVa = Glob::DDI_Execute::Get(global); MFX_CHECK((task.SkipCMD & SKIPCMD_NeedDriverCall), MFX_ERR_NONE); sts = DestroyVABuffers(m_perPicPar); MFX_CHECK_STS(sts); sts = CreateVABuffers(Glob::DDI_SubmitParam::Get(global), m_perPicPar); MFX_CHECK_STS(sts); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS , "A|ENCODE|AVC|PACKET_START|", "%p|%d" , m_vaContextEncode, task.StatusReportId); sts = BeginPicture(task.HDLRaw.first); MFX_CHECK_STS(sts); sts = RenderPicture(m_perPicPar.data(), (int)m_perPicPar.size()); MFX_CHECK_STS(sts); sts = RenderPicture(m_perSeqPar.data(), (int)m_perSeqPar.size()); MFX_CHECK_STS(sts); sts = EndPicture(); MFX_CHECK_STS(sts); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS , "A|ENCODE|AVC|PACKET_END|", "%d|%d" , m_vaContextEncode, task.StatusReportId); return sts; }); } void DDI_VA::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& task = Task::Common::Get(s_task); mfxStatus sts = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H265 encode DDIWaitTaskSync"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_WAIT_TASK_SYNC, EVENT_TYPE_INFO, 0, make_event_data(this)); m_callVa = Glob::DDI_Execute::Get(global); MFX_CHECK((task.SkipCMD & SKIPCMD_NeedDriverCall), MFX_ERR_NONE); sts = QueryStatus(Glob::DDI_Feedback::Get(global), task.StatusReportId); return sts; }); } mfxStatus DDI_VA::QueryCaps() { m_caps = {}; std::map idx_map; VAConfigAttribType attr_types[] = { VAConfigAttribRTFormat , VAConfigAttribRateControl , VAConfigAttribEncQuantization , VAConfigAttribEncIntraRefresh , VAConfigAttribMaxPictureHeight , VAConfigAttribMaxPictureWidth , VAConfigAttribEncParallelRateControl , VAConfigAttribEncMaxRefFrames , VAConfigAttribEncSliceStructure , VAConfigAttribEncROI , VAConfigAttribEncTileSupport , VAConfigAttribEncDirtyRect , VAConfigAttribMaxFrameSize }; std::vector attrs; auto AV = [&](VAConfigAttribType t) { return attrs[idx_map[t]].value; }; mfxI32 i = 0; std::for_each(std::begin(attr_types), std::end(attr_types) , [&](decltype(*std::begin(attr_types)) type) { attrs.push_back({ type, 0 }); idx_map[type] = i; ++i; }); auto sts = MfxEncodeHW::DeviceVAAPI::QueryCaps(attrs.data(), attrs.size() * sizeof(VAConfigAttrib)); MFX_CHECK_STS(sts); m_caps.VCMBitRateControl = !!(AV(VAConfigAttribRateControl) & VA_RC_VCM); //Video conference mode m_caps.MBBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_MB); m_caps.msdk.CBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CBR); m_caps.msdk.VBRSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_VBR); m_caps.msdk.CQPSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_CQP); m_caps.msdk.ICQSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_ICQ); #ifdef MFX_ENABLE_QVBR m_caps.QVBRBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_QVBR); #endif #if VA_CHECK_VERSION(1, 10, 0) m_caps.TCBRCSupport = !!(AV(VAConfigAttribRateControl) & VA_RC_TCBRC); #endif m_caps.RollingIntraRefresh = !!(AV(VAConfigAttribEncIntraRefresh) & (~VA_ATTRIB_NOT_SUPPORTED)); m_caps.MaxEncodedBitDepth = std::max( !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV420_12) * 2 , !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV420_10)); m_caps.Color420Only = !(AV(VAConfigAttribRTFormat) & (VA_RT_FORMAT_YUV422 | VA_RT_FORMAT_YUV444)); m_caps.BitDepth8Only = !(AV(VAConfigAttribRTFormat) & (VA_RT_FORMAT_YUV420_10 | VA_RT_FORMAT_YUV420_12)); m_caps.YUV422ReconSupport = !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV422); m_caps.YUV444ReconSupport = !!(AV(VAConfigAttribRTFormat) & VA_RT_FORMAT_YUV444); m_caps.RGBEncodingSupport = !!(AV(VAConfigAttribRTFormat) & (VA_RT_FORMAT_RGB32 | VA_RT_FORMAT_RGB32_10)); // argb4 or a2rgb10 MFX_CHECK(AV(VAConfigAttribMaxPictureWidth) != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK(AV(VAConfigAttribMaxPictureHeight) != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK_COND(AV(VAConfigAttribMaxPictureWidth) && AV(VAConfigAttribMaxPictureHeight)); m_caps.MaxPicWidth = AV(VAConfigAttribMaxPictureWidth); m_caps.MaxPicHeight = AV(VAConfigAttribMaxPictureHeight); if (AV(VAConfigAttribEncMaxRefFrames) != VA_ATTRIB_NOT_SUPPORTED) { m_caps.MaxNum_Reference0 = mfxU8(AV(VAConfigAttribEncMaxRefFrames)); m_caps.MaxNum_Reference1 = mfxU8(AV(VAConfigAttribEncMaxRefFrames) >> 16); SetDefault(m_caps.MaxNum_Reference1, m_caps.MaxNum_Reference0); CheckMaxOrClip(m_caps.MaxNum_Reference1, m_caps.MaxNum_Reference0); } else { m_caps.MaxNum_Reference0 = 3; m_caps.MaxNum_Reference1 = 1; } if (AV(VAConfigAttribEncROI) != VA_ATTRIB_NOT_SUPPORTED) // VAConfigAttribEncROI { auto roi = *(VAConfigAttribValEncROI*)&attrs[idx_map[VAConfigAttribEncROI]].value; assert(roi.bits.num_roi_regions < 32); m_caps.MaxNumOfROI = roi.bits.num_roi_regions; m_caps.ROIBRCPriorityLevelSupport = roi.bits.roi_rc_priority_support; m_caps.ROIDeltaQPSupport = roi.bits.roi_rc_qp_delta_support; } if (AV(VAConfigAttribEncDirtyRect) != VA_ATTRIB_NOT_SUPPORTED && AV(VAConfigAttribEncDirtyRect) != 0) { m_caps.DirtyRectSupport = 1; m_caps.MaxNumOfDirtyRect = mfxU16(AV(VAConfigAttribEncDirtyRect)); } m_caps.TileSupport = (AV(VAConfigAttribEncTileSupport) == 1); m_caps.UserMaxFrameSizeSupport = !!(AV(VAConfigAttribMaxFrameSize)); if (AV(VAConfigAttribEncSliceStructure)!=VA_ATTRIB_NOT_SUPPORTED) { // Attribute for VAConfigAttribEncSliceStructure includes both: // (1) information about supported slice structure and // (2) indication of support for max slice size feature uint32_t sliceCapabilities = AV(VAConfigAttribEncSliceStructure); m_caps.SliceStructure = ConvertSliceStructureVAAPIToMFX(sliceCapabilities); // It means that GPU may further split the slice region that // slice control data specifies into finer slice segments based on slice size upper limit (MaxSliceSize) m_caps.SliceByteSizeCtrl = (sliceCapabilities & VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE)!=0; } return MFX_ERR_NONE; } uint32_t DDI_VA::ConvertRateControlMFX2VAAPI(mfxU16 rateControl, bool bSWBRC) { if (bSWBRC) return VA_RC_CQP; static const std::map RCMFX2VAAPI = { { mfxU16(MFX_RATECONTROL_CQP) , uint32_t(VA_RC_CQP) }, { mfxU16(MFX_RATECONTROL_CBR) , uint32_t(VA_RC_CBR | VA_RC_MB) }, { mfxU16(MFX_RATECONTROL_VBR) , uint32_t(VA_RC_VBR | VA_RC_MB) }, { mfxU16(MFX_RATECONTROL_ICQ) , uint32_t(VA_RC_ICQ) }, { mfxU16(MFX_RATECONTROL_VCM) , uint32_t(VA_RC_VCM) }, #ifdef MFX_ENABLE_QVBR { mfxU16(MFX_RATECONTROL_QVBR) , uint32_t(VA_RC_QVBR) }, #endif }; auto itRC = RCMFX2VAAPI.find(rateControl); if (itRC != RCMFX2VAAPI.end()) { return itRC->second; } assert(!"Unsupported RateControl"); return 0; } uint32_t DDI_VA::ConvertSliceStructureVAAPIToMFX(uint32_t structure) { if (structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS) return ARBITRARY_MB_SLICE; if (structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS) return ARBITRARY_ROW_SLICE; if (structure & VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS || structure & VA_ENC_SLICE_STRUCTURE_EQUAL_MULTI_ROWS) return ROWSLICE; if (structure & VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS) return POW2ROW; return ONESLICE; } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base/hevcehw_base_va_lin.h000066400000000000000000000055571443134507600334460ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "hevcehw_base.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_ddi.h" #include "hevcehw_base_data.h" #include "hevcehw_base_iddi.h" #include "ehw_device_vaapi.h" namespace HEVCEHW { namespace Linux { namespace Base { using namespace HEVCEHW::Base; class DDI_VA : public IDDI , public MfxEncodeHW::DeviceVAAPI { public: DDI_VA(mfxU32 FeatureId) : IDDI(FeatureId) { SetTraceName("Base_DDI_VA"); } protected: virtual void Query1NoCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void InitExternal(const FeatureBlocks& blocks, TPushIE Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; mfxStatus CreateVABuffers( const std::list& par , std::vector& pool); mfxStatus DestroyVABuffers(std::vector& pool); using MfxEncodeHW::DeviceVAAPI::QueryCaps; mfxStatus QueryCaps(); mfxStatus SetDDIID(VAID*& DDIID, const mfxVideoParam& par, StorageRW& strg); uint32_t ConvertRateControlMFX2VAAPI(mfxU16 rateControl, bool bSWBRC); uint32_t ConvertSliceStructureVAAPIToMFX(uint32_t structure); EncodeCapsHevc m_caps; std::vector m_perSeqPar; std::vector m_perPicPar; std::vector m_bs; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_va_packer_lin.cpp000066400000000000000000001132451443134507600352410ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "hevcehw_base_va_packer_lin.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "mfx_common_int.h" #include "hevcehw_base_va_lin.h" #include "hevcehw_base_legacy.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; using namespace HEVCEHW::Linux; using namespace HEVCEHW::Linux::Base; void VAPacker::Query1WithCaps(const FeatureBlocks& /*blocks*/, TPushQ1 Push) { Push(BLK_HardcodeCaps , [this](const mfxVideoParam&, mfxVideoParam& par, StorageRW& strg) -> mfxStatus { auto& caps = Glob::EncodeCaps::Get(strg); auto& ddiidSetting = Glob::DDIIDSetting::Get(strg); VAID* vaid = (VAID*)ddiidSetting.DDIID; MFX_CHECK_NULL_PTR1(vaid); HardcodeCapsCommon(caps, par); bool bLP = (vaid-> Entrypoint == VAEntrypointEncSliceLP); caps.LCUSizeSupported |= (32 >> 4) * (!bLP) + (64 >> 4); caps.BRCReset = 1; // no bitrate resolution control caps.BlockSize = 1; caps.MbQpDataSupport = 1; caps.TUSupport = 73; caps.ParallelBRC = bLP ? 0 : 1; caps.MaxEncodedBitDepth |= (!caps.BitDepth8Only); caps.YUV444ReconSupport |= (!caps.Color420Only && IsOn(par.mfx.LowPower)); caps.YUV422ReconSupport &= (!caps.Color420Only && !IsOn(par.mfx.LowPower)); return MFX_ERR_NONE; }); } void InitSPS( const ExtBuffer::Param& par , const SPS& bs_sps , VAEncSequenceParameterBufferHEVC & sps) { sps = {}; sps.general_profile_idc = bs_sps.general.profile_idc; sps.general_level_idc = bs_sps.general.level_idc; sps.general_tier_flag = bs_sps.general.tier_flag; sps.intra_period = par.mfx.GopPicSize; sps.intra_idr_period = par.mfx.GopPicSize * par.mfx.IdrInterval; sps.ip_period = par.mfx.GopRefDist; if ( par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ) { sps.bits_per_second = TargetKbps(par.mfx) * 1000; } sps.pic_width_in_luma_samples = (uint16_t)bs_sps.pic_width_in_luma_samples; sps.pic_height_in_luma_samples = (uint16_t)bs_sps.pic_height_in_luma_samples; sps.seq_fields.bits.chroma_format_idc = bs_sps.chroma_format_idc; sps.seq_fields.bits.separate_colour_plane_flag = bs_sps.separate_colour_plane_flag; sps.seq_fields.bits.bit_depth_luma_minus8 = bs_sps.bit_depth_luma_minus8; sps.seq_fields.bits.bit_depth_chroma_minus8 = bs_sps.bit_depth_chroma_minus8; sps.seq_fields.bits.scaling_list_enabled_flag = bs_sps.scaling_list_enabled_flag; sps.seq_fields.bits.strong_intra_smoothing_enabled_flag = bs_sps.strong_intra_smoothing_enabled_flag; sps.seq_fields.bits.amp_enabled_flag = bs_sps.amp_enabled_flag; sps.seq_fields.bits.sample_adaptive_offset_enabled_flag = bs_sps.sample_adaptive_offset_enabled_flag; sps.seq_fields.bits.pcm_enabled_flag = bs_sps.pcm_enabled_flag; sps.seq_fields.bits.pcm_loop_filter_disabled_flag = 1;//bs_sps.pcm_loop_filter_disabled_flag; sps.seq_fields.bits.sps_temporal_mvp_enabled_flag = bs_sps.temporal_mvp_enabled_flag; sps.seq_fields.bits.low_delay_seq = bs_sps.low_delay_mode; sps.seq_fields.bits.hierachical_flag = bs_sps.hierarchical_flag; sps.log2_min_luma_coding_block_size_minus3 = (mfxU8)bs_sps.log2_min_luma_coding_block_size_minus3; sps.log2_diff_max_min_luma_coding_block_size = (mfxU8)bs_sps.log2_diff_max_min_luma_coding_block_size; sps.log2_min_transform_block_size_minus2 = (mfxU8)bs_sps.log2_min_transform_block_size_minus2; sps.log2_diff_max_min_transform_block_size = (mfxU8)bs_sps.log2_diff_max_min_transform_block_size; sps.max_transform_hierarchy_depth_inter = (mfxU8)bs_sps.max_transform_hierarchy_depth_inter; sps.max_transform_hierarchy_depth_intra = (mfxU8)bs_sps.max_transform_hierarchy_depth_intra; sps.pcm_sample_bit_depth_luma_minus1 = (mfxU8)bs_sps.pcm_sample_bit_depth_luma_minus1; sps.pcm_sample_bit_depth_chroma_minus1 = (mfxU8)bs_sps.pcm_sample_bit_depth_chroma_minus1; sps.log2_min_pcm_luma_coding_block_size_minus3 = (mfxU8)bs_sps.log2_min_pcm_luma_coding_block_size_minus3; sps.log2_max_pcm_luma_coding_block_size_minus3 = (mfxU8)(bs_sps.log2_min_pcm_luma_coding_block_size_minus3 + bs_sps.log2_diff_max_min_pcm_luma_coding_block_size); sps.vui_parameters_present_flag = bs_sps.vui_parameters_present_flag; sps.vui_fields.bits.aspect_ratio_info_present_flag = bs_sps.vui.aspect_ratio_info_present_flag; sps.vui_fields.bits.neutral_chroma_indication_flag = bs_sps.vui.neutral_chroma_indication_flag; sps.vui_fields.bits.field_seq_flag = bs_sps.vui.field_seq_flag; sps.vui_fields.bits.vui_timing_info_present_flag = bs_sps.vui.timing_info_present_flag; sps.vui_fields.bits.bitstream_restriction_flag = bs_sps.vui.bitstream_restriction_flag; sps.vui_fields.bits.tiles_fixed_structure_flag = bs_sps.vui.tiles_fixed_structure_flag; sps.vui_fields.bits.motion_vectors_over_pic_boundaries_flag = bs_sps.vui.motion_vectors_over_pic_boundaries_flag; sps.vui_fields.bits.restricted_ref_pic_lists_flag = bs_sps.vui.restricted_ref_pic_lists_flag; sps.vui_fields.bits.log2_max_mv_length_horizontal = bs_sps.vui.log2_max_mv_length_horizontal; sps.vui_fields.bits.log2_max_mv_length_vertical = bs_sps.vui.log2_max_mv_length_vertical; sps.aspect_ratio_idc = bs_sps.vui.aspect_ratio_idc; sps.sar_width = bs_sps.vui.sar_width; sps.sar_height = bs_sps.vui.sar_height; sps.vui_num_units_in_tick = bs_sps.vui.num_units_in_tick; sps.vui_time_scale = bs_sps.vui.time_scale; sps.min_spatial_segmentation_idc = bs_sps.vui.min_spatial_segmentation_idc; sps.max_bytes_per_pic_denom = bs_sps.vui.max_bytes_per_pic_denom; sps.max_bits_per_min_cu_denom = bs_sps.vui.max_bits_per_min_cu_denom; } void InitPPS( const ExtBuffer::Param& /*par*/ , const PPS& bs_pps , VAEncPictureParameterBufferHEVC & pps) { pps = {}; std::for_each( std::begin(pps.reference_frames) , std::end(pps.reference_frames) , [](decltype(*std::begin(pps.reference_frames)) ref) { ref.picture_id = VA_INVALID_ID; }); pps.last_picture = 0; pps.pic_init_qp = (mfxU8)(bs_pps.init_qp_minus26 + 26); pps.diff_cu_qp_delta_depth = (mfxU8)bs_pps.diff_cu_qp_delta_depth; pps.pps_cb_qp_offset = (mfxU8)bs_pps.cb_qp_offset; pps.pps_cr_qp_offset = (mfxU8)bs_pps.cr_qp_offset; pps.num_tile_columns_minus1 = (mfxU8)bs_pps.num_tile_columns_minus1; pps.num_tile_rows_minus1 = (mfxU8)bs_pps.num_tile_rows_minus1; auto NumTileDdiToVa = [](mfxU16 n) { return (uint8_t)std::max(0, n - 1); }; std::transform( bs_pps.column_width , bs_pps.column_width + pps.num_tile_columns_minus1 + 1u , pps.column_width_minus1 , NumTileDdiToVa); std::transform( bs_pps.row_height , bs_pps.row_height + pps.num_tile_rows_minus1 + 1u , pps.row_height_minus1 , NumTileDdiToVa); pps.log2_parallel_merge_level_minus2 = (mfxU8)bs_pps.log2_parallel_merge_level_minus2; pps.ctu_max_bitsize_allowed = 0; pps.num_ref_idx_l0_default_active_minus1 = (mfxU8)bs_pps.num_ref_idx_l0_default_active_minus1; pps.num_ref_idx_l1_default_active_minus1 = (mfxU8)bs_pps.num_ref_idx_l1_default_active_minus1; pps.slice_pic_parameter_set_id = 0; pps.pic_fields.bits.dependent_slice_segments_enabled_flag = bs_pps.dependent_slice_segments_enabled_flag; pps.pic_fields.bits.sign_data_hiding_enabled_flag = bs_pps.sign_data_hiding_enabled_flag; pps.pic_fields.bits.constrained_intra_pred_flag = bs_pps.constrained_intra_pred_flag; pps.pic_fields.bits.transform_skip_enabled_flag = bs_pps.transform_skip_enabled_flag; pps.pic_fields.bits.cu_qp_delta_enabled_flag = bs_pps.cu_qp_delta_enabled_flag; pps.pic_fields.bits.weighted_pred_flag = bs_pps.weighted_pred_flag; pps.pic_fields.bits.weighted_bipred_flag = bs_pps.weighted_bipred_flag; pps.pic_fields.bits.transquant_bypass_enabled_flag = bs_pps.transquant_bypass_enabled_flag; pps.pic_fields.bits.tiles_enabled_flag = bs_pps.tiles_enabled_flag; pps.pic_fields.bits.entropy_coding_sync_enabled_flag = bs_pps.entropy_coding_sync_enabled_flag; pps.pic_fields.bits.loop_filter_across_tiles_enabled_flag = bs_pps.loop_filter_across_tiles_enabled_flag; pps.pic_fields.bits.pps_loop_filter_across_slices_enabled_flag = bs_pps.loop_filter_across_slices_enabled_flag; pps.pic_fields.bits.scaling_list_data_present_flag = bs_pps.scaling_list_data_present_flag; pps.pic_fields.bits.screen_content_flag = 0; pps.pic_fields.bits.enable_gpu_weighted_prediction = 0; pps.pic_fields.bits.no_output_of_prior_pics_flag = 0; } void InitSSH( const ExtBuffer::Param& /*par*/ , Glob::SliceInfo::TRef sinfo , std::vector & slices) { slices.resize(sinfo.size()); std::transform(sinfo.begin(), sinfo.end(), slices.begin() , [](const SliceInfo& si) { VAEncSliceParameterBufferHEVC s = {}; s.slice_segment_address = si.SegmentAddress; s.num_ctu_in_slice = si.NumLCU; return s; }); if (!slices.empty()) slices.rbegin()->slice_fields.bits.last_slice_of_pic_flag = 1; } void AddVaMiscHRD( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& hrd = AddVaMisc(VAEncMiscParameterTypeHRD, buf); hrd.initial_buffer_fullness = InitialDelayInKB(par.mfx) * 8000; hrd.buffer_size = BufferSizeInKB(par.mfx) * 8000; } void AddVaMiscRC( const Glob::VideoParam::TRef& par , const Glob::PPS::TRef& bs_pps , const Task::Common::TRef & task , std::list>& buf , bool bResetBRC = false) { auto& rc = AddVaMisc(VAEncMiscParameterTypeRateControl, buf); uint32_t bNeedRateParam = par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ; rc.bits_per_second = bNeedRateParam * MaxKbps(par.mfx) * 1000; if (rc.bits_per_second) rc.target_percentage = uint32_t(100.0 * (mfxF64)TargetKbps(par.mfx) / (mfxF64)MaxKbps(par.mfx)); rc.rc_flags.bits.reset = bNeedRateParam && bResetBRC; const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); #ifdef PARALLEL_BRC_support rc.rc_flags.bits.enable_parallel_brc = bNeedRateParam && (par.AsyncDepth > 1) && (par.mfx.GopRefDist > 1) && (par.mfx.GopRefDist <= 8) && (CO2.BRefType == MFX_B_REF_PYRAMID); #endif //PARALLEL_BRC_support rc.ICQ_quality_factor = uint32_t((par.mfx.RateControlMethod == MFX_RATECONTROL_ICQ) * par.mfx.ICQQuality); rc.initial_qp = bs_pps.init_qp_minus26 + 26; // MBBRC control // Control VA_RC_MB 0: default, 1: enable, 2: disable, other: reserved rc.rc_flags.bits.mb_rate_control = IsOn(CO2.MBBRC) + IsOff(CO2.MBBRC) * 2; // TCBRC control #if VA_CHECK_VERSION(1, 10, 0) rc.target_frame_size = task.TCBRCTargetFrameSize; #endif if (IsOn(par.mfx.LowPower) && (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP)) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); rc.min_qp = task.m_minQP - 6*(CO3.TargetBitDepthLuma - 8); if ((rc.min_qp < 0) || (rc.min_qp > 51)) rc.min_qp = 10; rc.max_qp = task.m_maxQP - 6*(CO3.TargetBitDepthLuma - 8); if ((rc.max_qp < 0) || (rc.max_qp > 51)) rc.max_qp = 51; } #ifdef MFX_ENABLE_QVBR const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); if (CO3.WinBRCSize) { rc.rc_flags.bits.frame_tolerance_mode = 1; //sliding window rc.window_size = 1000; rc.bits_per_second = CO3.WinBRCMaxAvgKbps * 1000; rc.target_percentage = uint32_t(100.0 * (mfxF64)TargetKbps(par.mfx) / (mfxF64)CO3.WinBRCMaxAvgKbps); } rc.quality_factor = uint32_t((par.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) * CO3.QVBRQuality); #endif } void AddVaMiscPBRC( const Glob::VideoParam::TRef& par , std::list>& buf) { #ifdef PARALLEL_BRC_support auto& pbrc = AddVaMisc( VAEncMiscParameterTypeParallelBRC, buf); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); if (CO2.BRefType != MFX_B_REF_PYRAMID) { pbrc.num_b_in_gop[0] = par.mfx.GopRefDist - 1; pbrc.num_b_in_gop[1] = 0; pbrc.num_b_in_gop[2] = 0; return; } if (par.mfx.GopRefDist <= 8) { static uint32_t B[9] = { 0,0,1,1,1,1,1,1,1 }; static uint32_t B1[9] = { 0,0,0,1,2,2,2,2,2 }; static uint32_t B2[9] = { 0,0,0,0,0,1,2,3,4 }; mfxI32 numBpyr = par.mfx.GopPicSize / par.mfx.GopRefDist; mfxI32 lastBpyrW = par.mfx.GopPicSize%par.mfx.GopRefDist; pbrc.num_b_in_gop[0] = numBpyr * B[par.mfx.GopRefDist] + B[lastBpyrW];; pbrc.num_b_in_gop[1] = numBpyr * B1[par.mfx.GopRefDist] + B1[lastBpyrW]; pbrc.num_b_in_gop[2] = numBpyr * B2[par.mfx.GopRefDist] + B2[lastBpyrW]; return; } pbrc.num_b_in_gop[0] = 0; pbrc.num_b_in_gop[1] = 0; pbrc.num_b_in_gop[2] = 0; #else std::ignore = par; std::ignore = buf; #endif //PARALLEL_BRC_support } void AddVaMiscFR( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& fr = AddVaMisc(VAEncMiscParameterTypeFrameRate, buf); PackMfxFrameRate(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, fr.framerate); } void AddVaMiscTU( const Glob::VideoParam::TRef& par , std::list>& buf) { auto& tu = AddVaMisc(VAEncMiscParameterTypeQualityLevel, buf); tu.quality_level = par.mfx.TargetUsage; } void AddVaMiscQualityParams( const Glob::VideoParam::TRef& par , std::list>& buf) { const mfxExtCodingOption3& CO3 = ExtBuffer::Get(par); auto& quality_param = AddVaMisc(VAEncMiscParameterTypeEncQuality, buf); quality_param.PanicModeDisable = IsOff(CO3.BRCPanicMode); } void AddVaMiscMaxSliceSize( const Glob::VideoParam::TRef& par , std::list>& buf) { const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); auto& maxSliceSize_param = AddVaMisc(VAEncMiscParameterTypeMaxSliceSize, buf); maxSliceSize_param.max_slice_size = CO2.MaxSliceSize; } void UpdatePPS( const TaskCommonPar & task , const Slice & sh , const std::vector & rec , VAEncPictureParameterBufferHEVC & pps) { pps.pic_fields.bits.idr_pic_flag = !!(task.FrameType & MFX_FRAMETYPE_IDR); pps.pic_fields.bits.coding_type = task.CodingType; pps.pic_fields.bits.reference_pic_flag = !!(task.FrameType & MFX_FRAMETYPE_REF); pps.collocated_ref_pic_index = 0xff; if (sh.temporal_mvp_enabled_flag) pps.collocated_ref_pic_index = task.RefPicList[!sh.collocated_from_l0_flag][sh.collocated_ref_idx]; pps.decoded_curr_pic.picture_id = rec.at(task.Rec.Idx); pps.decoded_curr_pic.pic_order_cnt = task.POC; pps.decoded_curr_pic.flags = 0; pps.nal_unit_type = task.SliceNUT; auto pDpbBegin = task.DPB.Active; auto pDpbEnd = task.DPB.Active + mfx::size(task.DPB.Active); auto pDpbValidEnd = std::find_if(pDpbBegin, pDpbEnd , [](decltype(*pDpbBegin) ref) { return ref.Rec.Idx == IDX_INVALID; }); std::transform(pDpbBegin, pDpbValidEnd, pps.reference_frames , [&](decltype(*pDpbBegin) ref) { VAPictureHEVC vaRef = {}; vaRef.picture_id = rec.at(ref.Rec.Idx); vaRef.pic_order_cnt = ref.POC; vaRef.flags = VA_PICTURE_HEVC_LONG_TERM_REFERENCE * !!ref.isLTR; return vaRef; }); VAPictureHEVC vaRefInvalid = {}; vaRefInvalid.picture_id = VA_INVALID_SURFACE; vaRefInvalid.flags = VA_PICTURE_HEVC_INVALID; std::fill( pps.reference_frames + (pDpbValidEnd - pDpbBegin) , pps.reference_frames + mfx::size(pps.reference_frames) , vaRefInvalid); } void VAPacker::InitInternal(const FeatureBlocks& /*blocks*/, TPushII Push) { Push(BLK_SetCallChains , [this](StorageRW& strg, StorageRW&) -> mfxStatus { MFX_CHECK(!strg.Contains(CC::Key), MFX_ERR_NONE); const auto& par = Glob::VideoParam::Get(strg); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS.Push([&par]( CallChains::TInitSPS::TExt , const StorageR& glob , VAEncSequenceParameterBufferHEVC& sps) { const auto& bs_sps = Glob::SPS::Get(glob); InitSPS(par, bs_sps, sps); }); cc.UpdatePPS.Push([this]( CallChains::TUpdatePPS::TExt , const StorageR& global , const StorageR& s_task , const VAEncSequenceParameterBufferHEVC& /*sps*/ , VAEncPictureParameterBufferHEVC& pps) { UpdatePPS(Task::Common::Get(s_task), Task::SSH::Get(s_task), GetResources(RES_REF), pps); }); return MFX_ERR_NONE; }); } void VAPacker::InitAlloc(const FeatureBlocks& /*blocks*/, TPushIA Push) { Push(BLK_CreateService , [this](StorageRW& strg, StorageRW& local)->mfxStatus { const auto& par = Glob::VideoParam::Get(strg); const auto& caps = Glob::EncodeCaps::Get(strg); if (Legacy::GetMBQPMode(caps, par)) { const mfxExtHEVCParam& HEVCPar = ExtBuffer::Get(par); auto pInfo = make_storable(MBQPAllocFrameInfo{}); mfxU32 blkSz = 8 << caps.BlockSize; pInfo->width = (HEVCPar.PicWidthInLumaSamples + blkSz - 1) / blkSz; pInfo->height = (HEVCPar.PicHeightInLumaSamples + blkSz - 1) / blkSz; pInfo->pitch = mfx::align2_value(pInfo->width, 64); pInfo->height_aligned = mfx::align2_value(pInfo->height, 4); pInfo->block_width = blkSz; pInfo->block_height = blkSz; pInfo->Info.Height = (mfxU16) pInfo->height_aligned; pInfo->Info.Width = (mfxU16)pInfo->pitch; pInfo->Info.FourCC = MFX_FOURCC_P8; pInfo->Type = (MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_INTERNAL_FRAME); strg.Insert(Glob::MBQPAllocInfo::Key, std::move(pInfo)); } return MFX_ERR_NONE; }); Push(BLK_Init , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { auto& core = Glob::VideoCore::Get(strg); const auto& par = Glob::VideoParam::Get(strg); const auto& bs_pps = Glob::PPS::Get(strg); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS(strg, m_sps); InitPPS(par, bs_pps, m_pps); InitSSH(par, Glob::SliceInfo::Get(strg), m_slices); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ) { cc.AddPerSeqMiscData[VAEncMiscParameterTypeHRD].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscHRD(par, m_vaPerSeqMiscData); return true; }); } cc.AddPerSeqMiscData[VAEncMiscParameterTypeParallelBRC].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscPBRC(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeFrameRate].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscFR(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeQualityLevel].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTU(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeEncQuality].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscQualityParams(par, m_vaPerSeqMiscData); return true; }); if (CO2.MaxSliceSize) { cc.AddPerSeqMiscData[VAEncMiscParameterTypeMaxSliceSize].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& , const StorageR& , std::list>& data) { AddVaMiscMaxSliceSize(par, m_vaPerSeqMiscData); return true; }); } auto& vaInitPar = Tmp::DDI_InitParam::GetOrConstruct(local); auto& bsInfo = Glob::AllocBS::Get(strg); SetMaxBs(bsInfo.GetInfo().Width * bsInfo.GetInfo().Height); for (auto& AddMisc : cc.AddPerSeqMiscData) { if (AddMisc.second(strg, local, m_vaPerSeqMiscData)) { auto& misc = m_vaPerSeqMiscData.back(); vaInitPar.push_back(PackVaMiscPar(misc)); } } const auto& caps = Glob::EncodeCaps::Get(strg); mfxStatus sts = Register(core, Glob::AllocRec::Get(strg).GetResponse(), RES_REF); MFX_CHECK_STS(sts); sts = Register(core, bsInfo.GetResponse(), RES_BS); MFX_CHECK_STS(sts) auto& resources = Glob::DDI_Resources::GetOrConstruct(strg); DDIExecParam xPar; xPar.Function = MFX_FOURCC_NV12; PackResources(xPar.Resource, RES_REF); resources.push_back(xPar); xPar.Function = MFX_FOURCC_P8; PackResources(xPar.Resource, RES_BS); resources.push_back(xPar); InitFeedback(bsInfo.GetResponse().NumFrameActual); GetFeedbackInterface(Glob::DDI_Feedback::GetOrConstruct(strg)); Glob::DDI_SubmitParam::GetOrConstruct(strg); cc.ReadFeedback.Push([this]( CallChains::TReadFeedback::TExt , const StorageR& /*global*/ , StorageW& s_task , const VACodedBufferSegment& fb) { return ReadFeedback(fb, Task::Common::Get(s_task).BsDataLength); }); cc.AddPerPicMiscData[VAEncMiscParameterTypeSkipFrame].Push([this]( CallChains::TAddMiscData::TExt , const StorageR& , const StorageR& s_task , std::list>& data) { if (Task::Common::Get(s_task).SkipCMD & SKIPCMD_NeedNumSkipAdding) { auto& sf = AddVaMisc(VAEncMiscParameterTypeSkipFrame, data); sf.num_skip_frames = uint8_t(m_numSkipFrames); sf.size_skip_frames = m_sizeSkipFrames; sf.skip_frame_flag = !!m_numSkipFrames; return true; } return false; }); cc.AddPerPicMiscData[VAEncMiscParameterTypeRateControl].Push([this]( CallChains::TAddMiscData::TExt , const StorageR& global , const StorageR& s_task , std::list>& data) { const auto& par = Glob::VideoParam::Get(global); const auto& bs_pps = Glob::PPS::Get(global); auto& task = Task::Common::Get(s_task); AddVaMiscRC(par, bs_pps, task, data, !!(m_resetHintFlags & RF_BRC_RESET)); return true; }); cc.AddPerPicMiscData[VAEncMiscParameterTypeRIR].Push([]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& , const StorageR& s_task , std::list>& data) { auto& task = Task::Common::Get(s_task); if (task.IRState.refrType) { auto& vaRIR = AddVaMisc(VAEncMiscParameterTypeRIR, data); vaRIR.rir_flags.value = task.IRState.refrType; vaRIR.intra_insertion_location = task.IRState.IntraLocation; vaRIR.intra_insert_size = task.IRState.IntraSize; vaRIR.qp_delta_for_inserted_intra = mfxU8(task.IRState.IntRefQPDelta); return true; } return false; }); return MFX_ERR_NONE; }); } void VAPacker::ResetState(const FeatureBlocks& /*blocks*/, TPushRS Push) { Push(BLK_Reset , [this](StorageRW& strg, StorageRW& local) -> mfxStatus { const auto& par = Glob::VideoParam::Get(strg); const auto& bs_pps = Glob::PPS::Get(strg); const mfxExtCodingOption2& CO2 = ExtBuffer::Get(par); auto& cc = CC::GetOrConstruct(strg); cc.InitSPS(strg, m_sps); const auto& reset_hint = Glob::ResetHint::Get(strg); m_resetHintFlags = reset_hint.Flags; InitPPS(par, bs_pps, m_pps); InitSSH(par, Glob::SliceInfo::Get(strg), m_slices); m_vaPerSeqMiscData.clear(); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && par.mfx.RateControlMethod != MFX_RATECONTROL_ICQ) { cc.AddPerSeqMiscData[VAEncMiscParameterTypeHRD].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscHRD(par, m_vaPerSeqMiscData); return true; }); } cc.AddPerSeqMiscData[VAEncMiscParameterTypeParallelBRC].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscPBRC(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeFrameRate].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscFR(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeQualityLevel].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscTU(par, m_vaPerSeqMiscData); return true; }); cc.AddPerSeqMiscData[VAEncMiscParameterTypeEncQuality].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& strg , const StorageR& local , std::list>& data) { AddVaMiscQualityParams(par, m_vaPerSeqMiscData); return true; }); if (CO2.MaxSliceSize) { cc.AddPerSeqMiscData[VAEncMiscParameterTypeMaxSliceSize].Push([this, &par]( VAPacker::CallChains::TAddMiscData::TExt , const StorageR& , const StorageR& , std::list>& data) { AddVaMiscMaxSliceSize(par, m_vaPerSeqMiscData); return true; }); } auto& vaInitPar = Tmp::DDI_InitParam::GetOrConstruct(local); vaInitPar.clear(); for (auto& AddMisc : cc.AddPerSeqMiscData) { if (AddMisc.second(strg, local, m_vaPerSeqMiscData)) { auto& misc = m_vaPerSeqMiscData.back(); vaInitPar.push_back(PackVaMiscPar(misc)); } } return MFX_ERR_NONE; }); } void UpdateSlices( const TaskCommonPar & task , const Slice & sh , const VAEncPictureParameterBufferHEVC & pps , std::vector & slices) { std::for_each(slices.begin(), slices.end() , [&](VAEncSliceParameterBufferHEVC& slice) { slice.slice_type = sh.type; slice.slice_pic_parameter_set_id = pps.slice_pic_parameter_set_id; if (slice.slice_type != 2) { slice.num_ref_idx_l0_active_minus1 = task.NumRefActive[0]==0 ? 0 : task.NumRefActive[0] - 1; if (slice.slice_type == 0) slice.num_ref_idx_l1_active_minus1 = task.NumRefActive[1]==0 ? 0 : task.NumRefActive[1] - 1; else slice.num_ref_idx_l1_active_minus1 = 0; } else slice.num_ref_idx_l0_active_minus1 = slice.num_ref_idx_l1_active_minus1 = 0; VAPictureHEVC vaRefInvalid = {}; vaRefInvalid.picture_id = VA_INVALID_SURFACE; vaRefInvalid.flags = VA_PICTURE_HEVC_INVALID; auto GetRef = [&](mfxU8 idx) { if (idx < mfx::size(pps.reference_frames)) return pps.reference_frames[idx]; return vaRefInvalid; }; std::fill(slice.ref_pic_list0, slice.ref_pic_list0 + mfx::size(slice.ref_pic_list0), vaRefInvalid); std::fill(slice.ref_pic_list1, slice.ref_pic_list1 + mfx::size(slice.ref_pic_list1), vaRefInvalid); std::transform( task.RefPicList[0] , task.RefPicList[0] + task.NumRefActive[0] , slice.ref_pic_list0 , GetRef); std::transform( task.RefPicList[1] , task.RefPicList[1] + task.NumRefActive[1] , slice.ref_pic_list1 , GetRef); slice.max_num_merge_cand = 5 - sh.five_minus_max_num_merge_cand; slice.slice_qp_delta = sh.slice_qp_delta; slice.slice_cb_qp_offset = sh.slice_cb_qp_offset; slice.slice_cr_qp_offset = sh.slice_cr_qp_offset; slice.slice_beta_offset_div2 = sh.beta_offset_div2; slice.slice_tc_offset_div2 = sh.tc_offset_div2; slice.slice_fields.bits.dependent_slice_segment_flag = sh.dependent_slice_segment_flag; slice.slice_fields.bits.slice_temporal_mvp_enabled_flag = sh.temporal_mvp_enabled_flag; slice.slice_fields.bits.slice_sao_luma_flag = sh.sao_luma_flag; slice.slice_fields.bits.slice_sao_chroma_flag = sh.sao_chroma_flag; slice.slice_fields.bits.num_ref_idx_active_override_flag = slice.num_ref_idx_l0_active_minus1 != pps.num_ref_idx_l0_default_active_minus1 || slice.num_ref_idx_l1_active_minus1 != pps.num_ref_idx_l1_default_active_minus1; slice.slice_fields.bits.mvd_l1_zero_flag = sh.mvd_l1_zero_flag; slice.slice_fields.bits.cabac_init_flag = sh.cabac_init_flag; slice.slice_fields.bits.slice_deblocking_filter_disabled_flag = sh.deblocking_filter_disabled_flag; slice.slice_fields.bits.collocated_from_l0_flag = sh.collocated_from_l0_flag; }); } void VAPacker::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_SubmitTask , [this](StorageW& global, StorageW& s_task) -> mfxStatus { auto& core = Glob::VideoCore::Get(global); auto& task = Task::Common::Get(s_task); bool bSkipCurr = !(task.SkipCMD & SKIPCMD_NeedDriverCall) && (task.SkipCMD & SKIPCMD_NeedCurrentFrameSkipping); m_numSkipFrames += !!(task.SkipCMD & SKIPCMD_NeedNumSkipAdding) * task.ctrl.SkipFrame; m_numSkipFrames += bSkipCurr; m_sizeSkipFrames += bSkipCurr * task.BsDataLength; MFX_CHECK(task.SkipCMD & SKIPCMD_NeedDriverCall, MFX_ERR_NONE); auto& sh = Task::SSH::Get(s_task); auto& ph = Glob::PackedHeaders::Get(global); if (task.RepackHeaders & INSERT_PPS) { InitPPS(Glob::VideoParam::Get(global), Glob::PPS::Get(global), m_pps); } auto& cc = CC::Get(global); if (cc.UpdateSPS) { cc.UpdateSPS(global, m_sps); } cc.UpdatePPS(global, s_task, m_sps, m_pps); UpdateSlices(task, sh, m_pps, m_slices); m_pps.coded_buf = GetResources(RES_BS).at(task.BS.Idx); auto& par = Glob::DDI_SubmitParam::Get(global); par.clear(); par.push_back(PackVaBuffer(VAEncSequenceParameterBufferType, m_sps)); par.push_back(PackVaBuffer(VAEncPictureParameterBufferType, m_pps)); if(m_sps.seq_fields.bits.scaling_list_enabled_flag) { m_qm = {}; par.push_back(PackVaBuffer(VAQMatrixBufferType, m_qm)); } std::transform(m_slices.begin(), m_slices.end(), std::back_inserter(par) , [&](VAEncSliceParameterBufferHEVC& s) { return PackVaBuffer(VAEncSliceParameterBufferType, s); }); if (task.CUQP.Idx != IDX_INVALID && task.bCUQPMap) { FrameLocker lock(core, task.CUQP.Mid); MFX_CHECK(lock.Y, MFX_ERR_LOCK_MEMORY); auto& req = Glob::MBQPAllocInfo::Get(global); par.push_back(PackVaBuffer( VAEncQPBufferType , lock.Y , req.pitch , req.height_aligned)); } m_vaPerPicMiscData.clear(); m_vaPackedHeaders.clear(); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_AUD) , ph.AUD[mfx::clamp(task.CodingType, 1, 3) - 1], par); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_VPS) , ph.VPS, par, VAEncPackedHeaderHEVC_VPS); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_SPS) , ph.SPS, par, VAEncPackedHeaderHEVC_SPS); AddPackedHeaderIf(!!(task.InsertHeaders & INSERT_PPS) , ph.PPS, par, VAEncPackedHeaderHEVC_PPS); AddPackedHeaderIf((!!(task.InsertHeaders & INSERT_SEI) || task.ctrl.NumPayload) && ph.PrefixSEI.BitLen , ph.PrefixSEI, par/*, VAEncPackedHeaderHEVC_SEI*/); std::for_each( ph.SSH.begin() , ph.SSH.begin() + std::min(m_slices.size(), ph.SSH.size()) , [&](PackedData& pd) { AddPackedHeaderIf(true, pd, par, VAEncPackedHeaderHEVC_Slice); }); for (auto& AddMisc : cc.AddPerPicMiscData) { if (AddMisc.second(global, s_task, m_vaPerPicMiscData)) { auto& misc = m_vaPerPicMiscData.back(); par.push_back(PackVaBuffer(VAEncMiscParameterBufferType, misc.data(), (mfxU32)misc.size())); } } SetFeedback(task.StatusReportId, *(VASurfaceID*)task.HDLRaw.first, GetResources(RES_BS).at(task.BS.Idx)); m_numSkipFrames = 0; m_sizeSkipFrames = 0; return MFX_ERR_NONE; }); } void VAPacker::QueryTask(const FeatureBlocks& /*blocks*/, TPushQT Push) { Push(BLK_QueryTask , [](StorageW& global, StorageW& s_task) -> mfxStatus { auto& fb = Glob::DDI_Feedback::Get(global); MFX_CHECK(!fb.bNotReady, MFX_TASK_BUSY); auto& task = Task::Common::Get(s_task); if (!(task.SkipCMD & SKIPCMD_NeedDriverCall)) return MFX_ERR_NONE; auto pFB = fb.Get(task.StatusReportId); MFX_CHECK(pFB, MFX_TASK_BUSY); auto& rtErr = Glob::RTErr::Get(global); auto sts = CC::Get(global).ReadFeedback(global, s_task, *(const VACodedBufferSegment*)pFB); SetIf(rtErr, sts < MFX_ERR_NONE, sts); #if defined(MFX_ENABLE_ENCTOOLS_LPLA) auto& cc = CC::Get(global); if (cc.UpdateCqmHint) { cc.UpdateCqmHint(task, *(const VACodedBufferSegment*)pFB); } #endif fb.Remove(task.StatusReportId); return sts; }); } #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_va_packer_lin.h000066400000000000000000000101221443134507600346740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "hevcehw_base.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_data.h" #include "hevcehw_base_iddi_packer.h" #include "ehw_utils_vaapi.h" #include "va/va.h" namespace HEVCEHW { namespace Linux { namespace Base { using namespace HEVCEHW::Base; using namespace MfxEncodeHW; class VAPacker : public IDDIPacker , protected VAAPIParPacker { public: VAPacker(mfxU32 FeatureId) : IDDIPacker(FeatureId) { SetTraceName("Base_VAPacker"); } struct CallChains : Storable { using TReadFeedback = CallChain; TReadFeedback ReadFeedback; using TInitSPS = CallChain; TInitSPS InitSPS; using TUpdateSPS = CallChain; TUpdateSPS UpdateSPS; using TUpdatePPS = CallChain; TUpdatePPS UpdatePPS; using TUpdateCqmHint = CallChain; TUpdateCqmHint UpdateCqmHint; using TAddMiscData = CallChain>&>; std::map AddPerPicMiscData; std::map AddPerSeqMiscData; }; using CC = StorageVar; protected: virtual void Query1WithCaps(const FeatureBlocks& blocks, TPushQ1 Push) override; virtual void InitAlloc(const FeatureBlocks& blocks, TPushIA Push) override; virtual void InitInternal(const FeatureBlocks& blocks, TPushII Push) override; virtual void SubmitTask(const FeatureBlocks& blocks, TPushST Push) override; virtual void QueryTask(const FeatureBlocks& blocks, TPushQT Push) override; virtual void ResetState(const FeatureBlocks& blocks, TPushRS Push) override; VAEncSequenceParameterBufferHEVC m_sps; VAEncPictureParameterBufferHEVC m_pps; VAQMatrixBufferHEVC m_qm; std::vector m_slices; mfxU32 m_numSkipFrames = 0; mfxU32 m_sizeSkipFrames = 0; mfxU32 m_resetHintFlags = 0; std::list> m_vaPerSeqMiscData; std::list> m_vaPerPicMiscData; }; } //Base } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_base_weighted_prediction_lin.cpp000066400000000000000000000115241443134507600373230ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base_weighted_prediction_lin.h" #include "hevcehw_base_va_packer_lin.h" #include "va/va.h" using namespace HEVCEHW; using namespace HEVCEHW::Base; void Linux::Base::WeightPred::SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) { Push(BLK_PatchDDITask , [](StorageW& global, StorageW& s_task) -> mfxStatus { auto& esSlice = Task::SSH::Get(s_task); auto& ddiPar = Glob::DDI_SubmitParam::Get(global); auto itPPS = std::find_if(std::begin(ddiPar), std::end(ddiPar) , [](DDIExecParam& ep) { return (ep.Function == VAEncPictureParameterBufferType); }); MFX_CHECK(itPPS != std::end(ddiPar) && itPPS->In.pData, MFX_ERR_UNKNOWN); auto& ddiPPS = *(VAEncPictureParameterBufferHEVC*)itPPS->In.pData; const mfxExtCodingOption3& CO3 = ExtBuffer::Get(Glob::VideoParam::Get(global)); ddiPPS.pic_fields.bits.enable_gpu_weighted_prediction = IsOn(CO3.FadeDetection); // should be set for I as well bool bNeedPWT = (esSlice.type != 2 && (ddiPPS.pic_fields.bits.weighted_bipred_flag || ddiPPS.pic_fields.bits.weighted_pred_flag)); MFX_CHECK(bNeedPWT, MFX_ERR_NONE); auto& ph = Glob::PackedHeaders::Get(global); auto itSSH = ph.SSH.begin(); auto SetPWT = [&](VAEncSliceParameterBufferHEVC& slice) { const mfxU16 Y = 0, Cb = 1, Cr = 2, Weight = 0, Offset = 1; slice.luma_log2_weight_denom = (mfxU8)esSlice.luma_log2_weight_denom; slice.delta_chroma_log2_weight_denom = (mfxI8)(esSlice.chroma_log2_weight_denom - slice.luma_log2_weight_denom); slice.pred_weight_table_bit_offset = itSSH->PackInfo.at(PACK_PWTOffset); slice.pred_weight_table_bit_length = itSSH->PackInfo.at(PACK_PWTLength); mfxI16 wY = (1 << slice.luma_log2_weight_denom); mfxI16 wC = (1 << esSlice.chroma_log2_weight_denom); for (mfxU16 i = 0; i < 15; i++) { slice.luma_offset_l0[i] = (mfxI8)esSlice.pwt[0][i][Y][Offset]; slice.delta_luma_weight_l0[i] = (mfxI8)(esSlice.pwt[0][i][Y][Weight] - wY); slice.chroma_offset_l0[i][0] = (mfxI8)esSlice.pwt[0][i][Cb][Offset]; slice.chroma_offset_l0[i][1] = (mfxI8)esSlice.pwt[0][i][Cr][Offset]; slice.delta_chroma_weight_l0[i][0] = (mfxI8)(esSlice.pwt[0][i][Cb][Weight] - wC); slice.delta_chroma_weight_l0[i][1] = (mfxI8)(esSlice.pwt[0][i][Cr][Weight] - wC); slice.luma_offset_l1[i] = (mfxI8)esSlice.pwt[1][i][Y][Offset]; slice.delta_luma_weight_l1[i] = (mfxI8)(esSlice.pwt[1][i][Y][Weight] - wY); slice.chroma_offset_l1[i][0] = (mfxI8)esSlice.pwt[1][i][Cb][Offset]; slice.chroma_offset_l1[i][1] = (mfxI8)esSlice.pwt[1][i][Cr][Offset]; slice.delta_chroma_weight_l1[i][0] = (mfxI8)(esSlice.pwt[1][i][Cb][Weight] - wC); slice.delta_chroma_weight_l1[i][1] = (mfxI8)(esSlice.pwt[1][i][Cr][Weight] - wC); } }; std::for_each(std::begin(ddiPar), std::end(ddiPar) , [&](DDIExecParam& ep) { if (ep.Function != VAEncSliceParameterBufferType) return; auto pBegin = (VAEncSliceParameterBufferHEVC*)ep.In.pData; auto pEnd = pBegin + (std::max(ep.In.Num, 1) * !!pBegin); assert(ep.In.Size == sizeof(VAEncSliceParameterBufferHEVC)); std::for_each(pBegin, pEnd, SetPWT); }); return MFX_ERR_NONE; }); } #endif //defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) hevcehw_base_weighted_prediction_lin.h000066400000000000000000000032431443134507600367670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/base// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) #include "hevcehw_base_weighted_prediction.h" namespace HEVCEHW { namespace Linux { namespace Base { class WeightPred : public HEVCEHW::Base::WeightPred { public: WeightPred(mfxU32 FeatureId) : HEVCEHW::Base::WeightPred(FeatureId) {} protected: void SubmitTask(const FeatureBlocks& /*blocks*/, TPushST Push) override; }; } //Gen11Win } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/g12/000077500000000000000000000000001443134507600267655ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/g12/hevcehw_g12_caps_lin.h000066400000000000000000000050351443134507600331130ustar00rootroot00000000000000// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base.h" #include "hevcehw_g12_caps.h" namespace HEVCEHW { namespace Linux { namespace Gen12 { class Caps : public HEVCEHW::Gen12::Caps { public: Caps(mfxU32 FeatureId) : HEVCEHW::Gen12::Caps(FeatureId) {} protected: virtual void SetSpecificCaps(HEVCEHW::Base::EncodeCapsHevc& caps) override { caps.CodingLimitSet = 1; caps.Color420Only = 0; caps.SliceIPBOnly = 1; caps.NoMinorMVs = 1; caps.RawReconRefToggle = 1; caps.NoInterlacedField = 1; caps.MaxNumOfROI = 16; caps.ROIDeltaQPSupport = 1; caps.BlockSize = 1; caps.SliceLevelReportSupport = 1; caps.FrameSizeToleranceSupport = 1; caps.NumScalablePipesMinus1 = 1; caps.NoWeightedPred = 0; caps.LumaWeightedPred = 1; caps.ChromaWeightedPred = 0; caps.MaxNum_WeightedPredL0 = 4; caps.MaxNum_WeightedPredL1 = 2; caps.HRDConformanceSupport = 1; caps.TileSupport = 1; caps.YUV444ReconSupport = 1; caps.IntraRefreshBlockUnitSize = 2; } }; } //Gen12 } //Linux } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/g12/hevcehw_g12_lin.cpp000066400000000000000000000127031443134507600324400ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_g12_lin.h" #include "hevcehw_base_rext_lin.h" #include "hevcehw_g12_caps_lin.h" #include "hevcehw_base_scc_lin.h" #include "hevcehw_base_qp_modulation_lin.h" #include "hevcehw_base_sao.h" #include "hevcehw_base_scc.h" #include "hevcehw_base_rext.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_iddi_packer.h" #include "hevcehw_base_iddi.h" #include "hevcehw_base_parser.h" #include "hevcehw_base_recon_info_lin.h" namespace HEVCEHW { namespace Linux { namespace Gen12 { using namespace HEVCEHW::Gen12; MFXVideoENCODEH265_HW::MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseGen(core, status, mode) { TFeatureList newFeatures; newFeatures.emplace_back(new HEVCEHW::Linux::Base::RExt(HEVCEHW::Base::FEATURE_REXT)); newFeatures.emplace_back(new HEVCEHW::Linux::Base::SCC(HEVCEHW::Base::FEATURE_SCC)); newFeatures.emplace_back(new HEVCEHW::Linux::Gen12::Caps(HEVCEHW::Linux::Gen12::FEATURE_CAPS)); newFeatures.emplace_back(new HEVCEHW::Base::SAO(HEVCEHW::Base::FEATURE_SAO)); newFeatures.emplace_back(new HEVCEHW::Linux::Base::QpModulation(HEVCEHW::Base::FEATURE_QP_MODULATION)); InternalInitFeatures(status, mode, newFeatures); } void MFXVideoENCODEH265_HW::InternalInitFeatures( mfxStatus& status , eFeatureMode mode , TFeatureList& newFeatures) { status = MFX_ERR_UNKNOWN; for (auto& pFeature : newFeatures) pFeature->Init(mode, *this); TBaseGen::m_features.splice(TBaseGen::m_features.end(), newFeatures); if (mode & (QUERY1 | QUERY_IO_SURF | INIT)) { auto& qnc = FeatureBlocks::BQ::Get(*this); FeatureBlocks::Reorder( qnc , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetLowPowerDefault } , { FEATURE_CAPS, Caps::BLK_SetDefaultsCallChain }); Reorder( qnc , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetLowPowerDefault } , { HEVCEHW::Base::FEATURE_SCC, HEVCEHW::Linux::Base::SCC::BLK_SetLowPowerDefault }); Reorder( qnc , { HEVCEHW::Base::FEATURE_PARSER, HEVCEHW::Base::Parser::BLK_LoadSPSPPS } , { HEVCEHW::Base::FEATURE_SCC, HEVCEHW::Linux::Base::SCC::BLK_LoadSPSPPS }); auto& qwc = FeatureBlocks::BQ::Get(*this); FeatureBlocks::Reorder( qwc , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps } , { HEVCEHW::Base::FEATURE_REXT, HEVCEHW::Linux::Base::RExt::BLK_HardcodeCaps }); FeatureBlocks::Reorder( qwc , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps } , { FEATURE_CAPS, Caps::BLK_HardcodeCaps }); FeatureBlocks::Reorder( qwc , { HEVCEHW::Base::FEATURE_REXT, HEVCEHW::Linux::Base::RExt::BLK_HardcodeCaps } , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps }); } if (mode & INIT) { auto& iint = BQ::Get(*this); Reorder( iint , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetSPS } , { HEVCEHW::Base::FEATURE_SCC, HEVCEHW::Linux::Base::SCC::BLK_SetSPSExt }); Reorder( iint , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetPPS } , { HEVCEHW::Base::FEATURE_SCC, HEVCEHW::Linux::Base::SCC::SCC::BLK_SetPPSExt }); Reorder( iint , { HEVCEHW::Base::FEATURE_RECON_INFO, HEVCEHW::Base::ReconInfo::BLK_SetRecInfo } , { HEVCEHW::Base::FEATURE_REXT, HEVCEHW::Linux::Base::RExt::BLK_SetRecInfo } , PLACE_AFTER); } status = MFX_ERR_NONE; } mfxStatus MFXVideoENCODEH265_HW::Init(mfxVideoParam *par) { auto sts = TBaseGen::Init(par); MFX_CHECK_STS(sts); auto& st = BQ::Get(*this); Reorder( st , { HEVCEHW::Base::FEATURE_DDI, HEVCEHW::Base::IDDI::BLK_SubmitTask } , { HEVCEHW::Base::FEATURE_SCC, HEVCEHW::Base::SCC::BLK_PatchDDITask }); return MFX_ERR_NONE; } } //namespace Linux } //namespace Gen12 } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/g12/hevcehw_g12_lin.h000066400000000000000000000041261443134507600321050ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_lin.h" #include "hevcehw_g12_data.h" namespace HEVCEHW { namespace Linux { namespace Gen12 { enum eFeatureId { NUM_FEATURES = HEVCEHW::Gen12::eFeatureId::NUM_FEATURES }; class MFXVideoENCODEH265_HW : public Linux::Base::MFXVideoENCODEH265_HW { public: using TBaseGen = Linux::Base::MFXVideoENCODEH265_HW; MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); virtual mfxStatus Init(mfxVideoParam *par) override; protected: using TFeatureList = HEVCEHW::Base::MFXVideoENCODEH265_HW::TFeatureList; void InternalInitFeatures( mfxStatus& status , eFeatureMode mode , TFeatureList& newFeatures); }; } //Gen12 } //namespace Linux }// namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_hpm/000077500000000000000000000000001443134507600276545ustar00rootroot00000000000000hevcehw_xe_hpm_lin.cpp000066400000000000000000000053111443134507600341340ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_hpm// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_xe_hpm_lin.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_extddi.h" #include "hevcehw_base_caps_lin.h" #include "hevcehw_g12_caps.h" namespace HEVCEHW { namespace Linux { namespace Xe_HPM { MFXVideoENCODEH265_HW::MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseImpl(core, status, mode) { TFeatureList newFeatures; newFeatures.emplace_back(new HEVCEHW::Linux::Base::Caps(HEVCEHW::Base::FEATURE_CAPS)); newFeatures.emplace_back(new HEVCEHW::Base::ExtDDI(HEVCEHW::Base::FEATURE_EXTDDI)); for (auto& pFeature : newFeatures) pFeature->Init(mode, *this); m_features.splice(m_features.end(), newFeatures); if (mode & (QUERY1 | QUERY_IO_SURF | INIT)) { auto& qnc = BQ::Get(*this); qnc.splice(qnc.begin(), qnc, Get(qnc, { HEVCEHW::Base::FEATURE_CAPS, HEVCEHW::Linux::Base::Caps::BLK_SetLowPower })); Reorder( qnc , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetLowPowerDefault } , { HEVCEHW::Base::FEATURE_CAPS, HEVCEHW::Linux::Base::Caps::BLK_SetDefaultsCallChain }); auto& qwc = BQ::Get(*this); Reorder( qwc , { HEVCEHW::Gen12::FEATURE_CAPS, HEVCEHW::Gen12::Caps::BLK_HardcodeCaps } , { HEVCEHW::Base::FEATURE_CAPS, HEVCEHW::Linux::Base::Caps::BLK_HardcodeCaps } , PLACE_AFTER); } } }}} //namespace HEVCEHW::Linux::Xe_HPM #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)hevcehw_xe_hpm_lin.h000066400000000000000000000032451443134507600336050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_hpm// Copyright (c) 2019-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_g12_lin.h" namespace HEVCEHW { namespace Linux { namespace Xe_HPM { class MFXVideoENCODEH265_HW : public Linux::Gen12::MFXVideoENCODEH265_HW { public: using TBaseImpl = Linux::Gen12::MFXVideoENCODEH265_HW; MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); }; } //Xe_HPM } //Linux }// namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_lpm_plus/000077500000000000000000000000001443134507600307235ustar00rootroot00000000000000hevcehw_xe_lpm_plus_lin.cpp000066400000000000000000000121311443134507600362500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_lpm_plus// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_xe_lpm_plus_lin.h" #include "hevcehw_base_rext_lin.h" #include "hevcehw_base_caps_lin.h" #include "hevcehw_base_scc_lin.h" #include "hevcehw_base_qp_modulation_lin.h" #include "hevcehw_base_sao.h" #include "hevcehw_base_scc.h" #include "hevcehw_base_legacy.h" #include "hevcehw_base_iddi_packer.h" #include "hevcehw_base_iddi.h" #include "hevcehw_base_parser.h" #include "hevcehw_base_recon_info_lin.h" #include "hevcehw_base_extddi.h" namespace HEVCEHW { namespace Linux { namespace Xe_LPM_Plus { using namespace HEVCEHW::Base; using namespace HEVCEHW::Linux::Base; MFXVideoENCODEH265_HW::MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode) : TBaseGen(core, status, mode) { TFeatureList newFeatures; newFeatures.emplace_back(new RExt(FEATURE_REXT)); newFeatures.emplace_back(new SCC(FEATURE_SCC)); newFeatures.emplace_back(new Caps(FEATURE_CAPS)); newFeatures.emplace_back(new SAO(FEATURE_SAO)); newFeatures.emplace_back(new QpModulation(FEATURE_QP_MODULATION)); newFeatures.emplace_back(new ExtDDI(FEATURE_EXTDDI)); InternalInitFeatures(status, mode, newFeatures); } void MFXVideoENCODEH265_HW::InternalInitFeatures( mfxStatus& status , eFeatureMode mode , TFeatureList& newFeatures) { status = MFX_ERR_UNKNOWN; for (auto& pFeature : newFeatures) pFeature->Init(mode, *this); TBaseGen::m_features.splice(TBaseGen::m_features.end(), newFeatures); if (mode & (QUERY1 | QUERY_IO_SURF | INIT)) { auto& qnc = FeatureBlocks::BQ::Get(*this); FeatureBlocks::Reorder( qnc , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetLowPowerDefault } , { FEATURE_CAPS, Caps::BLK_SetDefaultsCallChain }); Reorder( qnc , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetLowPowerDefault } , { FEATURE_SCC, SCC::BLK_SetLowPowerDefault }); Reorder( qnc , { HEVCEHW::Base::FEATURE_PARSER, HEVCEHW::Base::Parser::BLK_LoadSPSPPS } , { FEATURE_SCC, SCC::BLK_LoadSPSPPS }); auto& qwc = FeatureBlocks::BQ::Get(*this); FeatureBlocks::Reorder( qwc , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps } , { FEATURE_REXT, RExt::BLK_HardcodeCaps }); FeatureBlocks::Reorder( qwc , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps } , { FEATURE_CAPS, Caps::BLK_HardcodeCaps }); FeatureBlocks::Reorder( qwc , { FEATURE_REXT, RExt::BLK_HardcodeCaps } , { HEVCEHW::Base::FEATURE_DDI_PACKER, HEVCEHW::Base::IDDIPacker::BLK_HardcodeCaps }); } if (mode & INIT) { auto& iint = BQ::Get(*this); Reorder( iint , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetSPS } , { FEATURE_SCC, SCC::BLK_SetSPSExt }); Reorder( iint , { HEVCEHW::Base::FEATURE_LEGACY, HEVCEHW::Base::Legacy::BLK_SetPPS } , { FEATURE_SCC, SCC::BLK_SetPPSExt }); Reorder( iint , { HEVCEHW::Base::FEATURE_RECON_INFO, HEVCEHW::Base::ReconInfo::BLK_SetRecInfo } , { FEATURE_REXT, RExt::BLK_SetRecInfo } , PLACE_AFTER); } status = MFX_ERR_NONE; } mfxStatus MFXVideoENCODEH265_HW::Init(mfxVideoParam *par) { auto sts = TBaseGen::Init(par); MFX_CHECK_STS(sts); auto& st = BQ::Get(*this); Reorder( st , { HEVCEHW::Base::FEATURE_DDI, HEVCEHW::Base::IDDI::BLK_SubmitTask } , { FEATURE_SCC, SCC::BLK_PatchDDITask }); return MFX_ERR_NONE; } } //namespace Linux } //namespace Xe_LPM_Plus } //namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) hevcehw_xe_lpm_plus_lin.h000066400000000000000000000040041443134507600357150ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/hevc/linux/xe_lpm_plus// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #include "hevcehw_base_lin.h" #include "hevcehw_base_data.h" namespace HEVCEHW { namespace Linux { namespace Xe_LPM_Plus { class MFXVideoENCODEH265_HW : public Linux::Base::MFXVideoENCODEH265_HW { public: using TBaseGen = Linux::Base::MFXVideoENCODEH265_HW; MFXVideoENCODEH265_HW( VideoCORE& core , mfxStatus& status , eFeatureMode mode = eFeatureMode::INIT); virtual mfxStatus Init(mfxVideoParam *par) override; protected: using TFeatureList = HEVCEHW::Base::MFXVideoENCODEH265_HW::TFeatureList; void InternalInitFeatures( mfxStatus& status , eFeatureMode mode , TFeatureList& newFeatures); }; } // Xe_LPM_Plus } // namespace Linux } // namespace HEVCEHW #endif //defined(MFX_ENABLE_H265_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/000077500000000000000000000000001443134507600254125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/include/000077500000000000000000000000001443134507600270355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/include/mfx_mjpeg_encode_hw.h000066400000000000000000000133211443134507600331750ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MJPEG_ENCODE_HW_H__ #define __MFX_MJPEG_ENCODE_HW_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfxvideo++int.h" #include "mfx_mjpeg_encode_hw_utils.h" #include "mfx_mjpeg_encode_interface.h" class MfxFrameAllocResponse : public mfxFrameAllocResponse { public: MfxFrameAllocResponse(); ~MfxFrameAllocResponse(); mfxStatus Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyRequired); void Free(); private: MfxFrameAllocResponse(MfxFrameAllocResponse const &); MfxFrameAllocResponse & operator =(MfxFrameAllocResponse const &); VideoCORE * m_core; std::vector m_responseQueue; std::vector m_mids; }; class MFXVideoENCODEMJPEG_HW : public VideoENCODE { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus QueryImplsDescription(VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah); MFXVideoENCODEMJPEG_HW(VideoCORE *core, mfxStatus *sts); virtual ~MFXVideoENCODEMJPEG_HW(); virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(void); virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus GetFrameParam(mfxFrameParam *par); virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat); virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints); // previous scheduling model - functions are not need to be implemented, only to be compatible virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *, mfxFrameSurface1 *, mfxBitstream *, mfxFrameSurface1 **, mfxEncodeInternalParams *) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } virtual mfxStatus EncodeFrame(mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } virtual mfxStatus CancelFrame(mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } protected: // callbacks to work with scheduler static mfxStatus TaskRoutineSubmitFrame(void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus TaskRoutineQueryFrame(void * state, void * param, mfxU32 threadNumber, mfxU32 callNumber); mfxStatus UpdateDeviceStatus(mfxStatus sts); mfxStatus CheckDevice(); mfxStatus CheckEncodeFrameParam(mfxFrameSurface1 * surface, mfxBitstream * bs, bool isExternalFrameAllocator); // pointer to video core - class for memory/frames management and allocation VideoCORE* m_pCore; mfxVideoParam m_vFirstParam; mfxVideoParam m_vParam; std::unique_ptr m_ddi; bool m_bInitialized; bool m_deviceFailed; mfxFrameAllocResponse m_raw; // raw surface, for input raw is in system memory case MfxFrameAllocResponse m_bitstream; // bitstream surface mfxU32 m_counter; // task number (StatusReportFeedbackNumber) MfxHwMJpegEncode::TaskManager m_TaskManager; mfxExtJPEGQuantTables m_checkedJpegQT; mfxExtJPEGHuffmanTables m_checkedJpegHT; mfxExtBuffer* m_pCheckedExt[3]; bool m_bUseInternalMem; }; #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #endif // __MFX_MJPEG_ENCODE_HW_H__ mfx_mjpeg_encode_hw_utils.h000066400000000000000000000126501443134507600343420ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/include// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MJPEG_ENCODE_HW_UTILS_H__ #define __MFX_MJPEG_ENCODE_HW_UTILS_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include #include #include "mfxstructures.h" #include #include #include #include "vm_interlocked.h" #include "umc_mutex.h" #include "mfxstructures.h" #include "mfxjpeg.h" namespace MfxHwMJpegEncode { #define JPEG_VIDEO_SURFACE_NUM 4 #define JPEG_DDITASK_MAX_NUM 32 enum { MFX_MEMTYPE_VIDEO_INT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME, MFX_MEMTYPE_VIDEO_EXT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME }; typedef struct { mfxU32 Baseline; mfxU32 Sequential; mfxU32 Huffman; mfxU32 NonInterleaved; mfxU32 Interleaved; mfxU32 MaxPicWidth; mfxU32 MaxPicHeight; mfxU32 SampleBitDepth; mfxU32 MaxNumComponent; mfxU32 MaxNumScan; mfxU32 MaxNumHuffTable; mfxU32 MaxNumQuantTable; } JpegEncCaps; typedef struct { mfxU16 header; mfxU8 lenH; mfxU8 lenL; mfxU8 s[5]; mfxU8 versionH; mfxU8 versionL; mfxU8 units; mfxU16 xDensity; mfxU16 yDensity; mfxU8 xThumbnails; mfxU8 yThumbnails; } JpegApp0Data; typedef struct { mfxU16 header; mfxU8 lenH; mfxU8 lenL; mfxU8 s[5]; mfxU8 versionH; mfxU8 versionL; mfxU8 flags0H; mfxU8 flags0L; mfxU8 flags1H; mfxU8 flags1L; mfxU8 transform; } JpegApp14Data; typedef struct { mfxU8 * data; mfxU32 length; mfxU32 maxLength; } JpegPayload; mfxStatus QueryHwCaps( VideoCORE * core, JpegEncCaps & hwCaps); bool IsJpegParamExtBufferIdSupported( mfxU32 id); mfxStatus CheckExtBufferId( mfxVideoParam const & par); mfxStatus CheckJpegParam( VideoCORE * core, mfxVideoParam & par, JpegEncCaps const & hwCaps); struct ExecuteBuffers { ExecuteBuffers() { memset(&m_pps, 0, sizeof(m_pps)); memset(&m_payload_base, 0, sizeof(m_payload_base)); memset(&m_app0_data, 0, sizeof(m_app0_data)); memset(&m_app14_data, 0, sizeof(m_app14_data)); } mfxStatus Init(mfxVideoParam const *par, mfxEncodeCtrl const * ctrl, JpegEncCaps const * hwCaps); void Close(); VAEncPictureParameterBufferJPEG m_pps; std::vector m_scan_list; std::vector m_dqt_list; std::vector m_dht_list; std::vector m_payload_list; JpegPayload m_payload_base; JpegApp0Data m_app0_data; JpegApp14Data m_app14_data; }; typedef struct { mfxFrameSurface1 * surface; // input raw surface mfxBitstream * bs; // output bitstream mfxU32 m_idx; // index of raw surface mfxU32 m_idxBS; // index of bitstream surface (always equal as m_idx for now) mfxU32 lInUse; // 0: free, 1: used. mfxU32 m_statusReportNumber; mfxU32 m_bsDataLength; // output bitstream length bool m_cleanDdiData; ExecuteBuffers * m_pDdiData; } DdiTask; class TaskManager { public: TaskManager(); ~TaskManager(); mfxStatus Init(mfxU32 maxTaskNum); mfxStatus Reset(); mfxStatus Close(); mfxStatus AssignTask(DdiTask *& newTask); mfxStatus RemoveTask(DdiTask & task); private: DdiTask * m_pTaskList; mfxU32 m_TaskNum; UMC::Mutex m_mutex; }; }; // namespace MfxHwMJpegEncode #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #endif // __MFX_MJPEG_ENCODE_HW_UTILS_H__ mfx_mjpeg_encode_interface.h000066400000000000000000000054051443134507600344440ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/include// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MJPEG_ENCODE_INTERFACE_H__ #define __MFX_MJPEG_ENCODE_INTERFACE_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include #include #include "mfxdefs.h" #include "mfxvideo++int.h" #include "mfx_mjpeg_encode_hw_utils.h" namespace MfxHwMJpegEncode { class DriverEncoder { public: virtual ~DriverEncoder(){} virtual mfxStatus CreateAuxilliaryDevice( VideoCORE * core, mfxU32 width, mfxU32 height, bool isTemporal = false) = 0; virtual mfxStatus CreateAccelerationService( mfxVideoParam const & par) = 0; virtual mfxStatus RegisterBitstreamBuffer( mfxFrameAllocResponse & response) = 0; virtual mfxStatus Execute(DdiTask &task, mfxHDL surface) = 0; virtual mfxStatus QueryBitstreamBufferInfo( mfxFrameAllocRequest & request) = 0; virtual mfxStatus QueryEncodeCaps( JpegEncCaps & caps) = 0; virtual mfxStatus QueryStatus( DdiTask & task) = 0; virtual mfxStatus UpdateBitstream( mfxMemId MemId, DdiTask & task) = 0; virtual mfxStatus Destroy() = 0; virtual mfxStatus CreateWrapBuffers( const mfxU16& /*numFrameMin*/, const mfxVideoParam& /*par*/) { return MFX_ERR_NONE; } }; DriverEncoder* CreatePlatformMJpegEncoder( VideoCORE* core ); }; // namespace #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #endif // __MFX_MJPEG_ENCODE_INTERFACE_H__ mfx_mjpeg_encode_vaapi.h000066400000000000000000000072201443134507600336010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/include// Copyright (c) 2014-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MJPEG_ENCODE_VAAPI_H__ #define __MFX_MJPEG_ENCODE_VAAPI_H__ #include "mfx_common.h" #if defined(MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include #include #include #include #include "umc_mutex.h" #include "mfx_ext_buffers.h" #include "mfxpcp.h" #include "mfx_mjpeg_encode_hw_utils.h" #include "mfx_mjpeg_encode_interface.h" namespace MfxHwMJpegEncode { typedef struct { VASurfaceID surface; mfxU32 number; mfxU32 idxBs; mfxU32 size; // valid only if Surface ID == VA_INVALID_SURFACE (skipped frames) } ExtVASurface; class VAAPIEncoder : public DriverEncoder { public: VAAPIEncoder(); virtual ~VAAPIEncoder(); virtual mfxStatus CreateAuxilliaryDevice( VideoCORE * core, mfxU32 width, mfxU32 height, bool isTemporal = false) override; virtual mfxStatus CreateAccelerationService( mfxVideoParam const & par) override; virtual mfxStatus RegisterBitstreamBuffer( mfxFrameAllocResponse & response) override; virtual mfxStatus Execute(DdiTask &task, mfxHDL surface) override; virtual mfxStatus QueryBitstreamBufferInfo( mfxFrameAllocRequest & request) override; virtual mfxStatus QueryEncodeCaps( JpegEncCaps & caps) override; virtual mfxStatus QueryStatus( DdiTask & task) override; virtual mfxStatus UpdateBitstream( mfxMemId MemId, DdiTask & task) override; virtual mfxStatus Destroy() override; VAAPIEncoder(VAAPIEncoder const &) = delete; VAAPIEncoder & operator =(VAAPIEncoder const &) = delete; private: mfxStatus DestroyBuffers(); VideoCORE * m_core; mfxU32 m_width; mfxU32 m_height; JpegEncCaps m_caps; VADisplay m_vaDisplay; VAContextID m_vaContextEncode; VAConfigID m_vaConfig; UMC::Mutex m_guard; std::vector m_feedbackCache; std::vector m_bsQueue; VABufferID m_qmBufferId; VABufferID m_htBufferId; VABufferID m_scanBufferId; VABufferID m_ppsBufferId; std::vector m_appBufferIds;; }; }; // namespace #endif // defined(MFX_ENABLE_MJPEG_VIDEO_ENCODE) #endif // __MFX_MJPEG_ENCODE_VAAPI_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/src/000077500000000000000000000000001443134507600262015ustar00rootroot00000000000000mfx_mjpeg_encode_factory.cpp000066400000000000000000000034331443134507600336510ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/src// Copyright (c) 2013-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfx_mjpeg_encode_interface.h" #include "mfx_mjpeg_encode_vaapi.h" using namespace MfxHwMJpegEncode; // platform switcher DriverEncoder* MfxHwMJpegEncode::CreatePlatformMJpegEncoder( VideoCORE* core ) { //MFX_CHECK_NULL_PTR1( core ); assert( core ); if (MFX_HW_VAAPI == core->GetVAType()) { return new VAAPIEncoder; } else { return NULL; } } // DriverEncoder* MfxHwMJpegEncode::CreatePlatformMJpegEncoder( VideoCORE* core ) #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/src/mfx_mjpeg_encode_hw.cpp000066400000000000000000001163161443134507600327040ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfx_mjpeg_encode_hw.h" #include "mfx_enc_common.h" #include "mfx_task.h" #include "umc_defs.h" #include "mfx_ext_buffers.h" #include "libmfx_core_interface.h" #include "libmfx_core.h" using namespace MfxHwMJpegEncode; template bool setPlaneROI(T value, T* pDst, int dstStep, mfxSize roiSize) { if (!pDst || roiSize.width < 0 || roiSize.height < 0) return false; for (int h = 0; h < roiSize.height; h++) { std::fill(pDst, pDst + roiSize.width, value); pDst = (T *)((unsigned char*)pDst + dstStep); } return true; } template bool swapChannels(const T* pSrc, int srcStep, T* pDst, int dstStep, mfxSize roiSize, const int dstOrder[3]) { const T *src0, *src1, *src2; T *dst = pDst; int width = roiSize.width * 4, height = roiSize.height; int h; int s; if (!pSrc || !pDst || srcStep <= 0 || dstStep <= 0 || roiSize.width <= 0 || roiSize.height <= 0) return false; if ((dstOrder[0] < 0) || (dstOrder[0] > 2)) return false; if ((dstOrder[1] < 0) || (dstOrder[1] > 2)) return false; if ((dstOrder[2] < 0) || (dstOrder[2] > 2)) return false; src0 = (T*)(pSrc + dstOrder[0]); src1 = (T*)(pSrc + dstOrder[1]); src2 = (T*)(pSrc + dstOrder[2]); if ((srcStep == dstStep) && (srcStep == width)) { width *= height; height = 1; } for (h = 0; h < height; h++) { for (s = 0; s < width; s += 4) { T x0 = src0[s]; T x1 = src1[s]; T x2 = src2[s]; dst[s] = x0; dst[s + 1] = x1; dst[s + 2] = x2; } src0 += srcStep, src1 += srcStep, src2 += srcStep; dst += dstStep; } return true; } MfxFrameAllocResponse::MfxFrameAllocResponse() :mfxFrameAllocResponse() , m_core(0) { } MfxFrameAllocResponse::~MfxFrameAllocResponse() { Free(); } void MfxFrameAllocResponse::Free() { if (m_core) { if (MFX_HW_D3D11 == m_core->GetVAType() && m_responseQueue.size()) { for (size_t i = 0; i < m_responseQueue.size(); i++) m_core->FreeFrames(&m_responseQueue[i]); } else { if (mids) { m_core->FreeFrames(this); } } m_core = NULL; } } mfxStatus MfxFrameAllocResponse::Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyRequired = true) { mfxStatus sts = MFX_ERR_NONE; if (m_core || core == NULL) { sts = MFX_ERR_MEMORY_ALLOC; } MFX_CHECK_STS(sts); m_core = core; if (MFX_HW_D3D11 == core->GetVAType()) { mfxFrameAllocRequest tmp = req; tmp.NumFrameMin = tmp.NumFrameSuggested = 1; m_responseQueue.resize(req.NumFrameMin); m_mids.resize(req.NumFrameMin); for (int i = 0; i < req.NumFrameMin; i++) { sts = core->AllocFrames(&tmp, &m_responseQueue[i], isCopyRequired); MFX_CHECK_STS(sts); m_mids[i] = m_responseQueue[i].mids[0]; } mids = &m_mids[0]; NumFrameActual = req.NumFrameMin; } else { sts = core->AllocFrames(&req, this, isCopyRequired); MFX_CHECK_STS(sts); } if (NumFrameActual < req.NumFrameMin) MFX_RETURN(MFX_ERR_MEMORY_ALLOC); return MFX_ERR_NONE; } MFXVideoENCODEMJPEG_HW::MFXVideoENCODEMJPEG_HW(VideoCORE *core, mfxStatus *sts) : m_checkedJpegQT() , m_checkedJpegHT() , m_bUseInternalMem(false) { m_pCore = core; m_bInitialized = false; m_deviceFailed = false; m_counter = 1; memset(&m_vFirstParam, 0, sizeof(mfxVideoParam)); memset(&m_vParam, 0, sizeof(mfxVideoParam)); memset(&m_raw, 0, sizeof(m_raw)); *sts = (core ? MFX_ERR_NONE : MFX_ERR_NULL_PTR); } MFXVideoENCODEMJPEG_HW::~MFXVideoENCODEMJPEG_HW() { Close(); } mfxStatus MFXVideoENCODEMJPEG_HW::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { JpegEncCaps hwCaps = {}; MFX_SAFE_CALL(QueryHwCaps(&core, hwCaps)); caps.CodecID = MFX_CODEC_JPEG; caps.MaxcodecLevel = 0; caps.BiDirectionalPrediction = 0; auto& profileCaps = ah.PushBack(caps.Profiles); profileCaps.Profile = MFX_PROFILE_JPEG_BASELINE; auto& memCaps = ah.PushBack(profileCaps.MemDesc); memCaps.MemHandleType = MFX_RESOURCE_SYSTEM_SURFACE; memCaps.Width = { 1, hwCaps.MaxPicWidth, 1 }; memCaps.Height = { 1, hwCaps.MaxPicHeight, 1 }; ah.PushBack(memCaps.ColorFormats) = MFX_FOURCC_NV12; ah.PushBack(memCaps.ColorFormats) = MFX_FOURCC_YV12; ah.PushBack(memCaps.ColorFormats) = MFX_FOURCC_YUY2; ah.PushBack(memCaps.ColorFormats) = MFX_FOURCC_RGB4; memCaps.NumColorFormats = 4; ah.PushBack(profileCaps.MemDesc); profileCaps.MemDesc[1] = profileCaps.MemDesc[0]; profileCaps.MemDesc[1].MemHandleType = core.GetVAType() == MFX_HW_VAAPI ? MFX_RESOURCE_VA_SURFACE : MFX_RESOURCE_DX11_TEXTURE; profileCaps.NumMemTypes = 2; caps.NumProfiles = 1; return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEMJPEG_HW::Query(VideoCORE * core, mfxVideoParam *in, mfxVideoParam *out) { mfxU32 isCorrected = 0; mfxU32 isInvalid = 0; MFX_CHECK_NULL_PTR2(core, out); if (!in) { memset(&out->mfx, 0, sizeof(out->mfx)); out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; out->mfx.FrameInfo.Width = 1; out->mfx.FrameInfo.Height = 1; out->mfx.FrameInfo.CropX = 0; out->mfx.FrameInfo.CropY = 0; out->mfx.FrameInfo.CropW = 1; out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.PicStruct = 1; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; out->mfx.CodecId = MFX_CODEC_JPEG; out->mfx.CodecLevel = 0; out->mfx.CodecProfile = MFX_PROFILE_JPEG_BASELINE; out->mfx.NumThread = 1; out->mfx.Interleaved = MFX_SCANTYPE_INTERLEAVED; out->mfx.Quality = 1; out->mfx.RestartInterval = 0; out->AsyncDepth = 1; out->IOPattern = 1; out->Protected = 0; //Extended coding options mfxStatus sts = CheckExtBufferId(*out); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); JpegEncCaps hwCaps = {}; sts = QueryHwCaps(core, hwCaps); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); } else { // Check HW caps JpegEncCaps hwCaps = {}; mfxStatus sts = QueryHwCaps(core, hwCaps); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); sts = CheckJpegParam(core, *in, hwCaps); if (sts == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) isInvalid++; // Extended coding options sts = CheckExtBufferId(*in); if (sts != MFX_ERR_NONE) isInvalid++; sts = CheckExtBufferId(*out); if (sts != MFX_ERR_NONE) isInvalid++; // Check external buffers mfxExtJPEGQuantTables* qt_in = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( in->ExtParam, in->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGQuantTables* qt_out = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( out->ExtParam, out->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* ht_in = (mfxExtJPEGHuffmanTables*)mfx::GetExtBuffer( in->ExtParam, in->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); mfxExtJPEGHuffmanTables* ht_out = (mfxExtJPEGHuffmanTables*)mfx::GetExtBuffer( out->ExtParam, out->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); if ((qt_in == 0) != (qt_out == 0) || (ht_in == 0) != (ht_out == 0)) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); if (qt_in && qt_out) { if(qt_in->NumTable <= 4) { qt_out->NumTable = qt_in->NumTable; for(mfxU16 i=0; iNumTable; i++) for(mfxU16 j=0; j<64; j++) qt_out->Qm[i][j] = qt_in->Qm[i][j]; } else { qt_out->NumTable = 0; for(mfxU16 i=0; i<4; i++) for(mfxU16 j=0; j<64; j++) qt_out->Qm[i][j] = 0; isInvalid++; } } if (ht_in && ht_out) { if(ht_in->NumDCTable <= 4) { ht_out->NumDCTable = ht_in->NumDCTable; for(mfxU16 i=0; iNumDCTable; i++) { for(mfxU16 j=0; j<16; j++) ht_out->DCTables[i].Bits[j] = ht_in->DCTables[i].Bits[j]; for(mfxU16 j=0; j<12; j++) ht_out->DCTables[i].Values[j] = ht_in->DCTables[i].Values[j]; } } else { ht_out->NumDCTable = 0; for(mfxU16 i=0; i<4; i++) { for(mfxU16 j=0; j<16; j++) ht_out->DCTables[i].Bits[j] = 0; for(mfxU16 j=0; j<12; j++) ht_out->DCTables[i].Values[j] = 0; } isInvalid++; } if(ht_in->NumACTable <= 4) { ht_out->NumACTable = ht_in->NumACTable; for(mfxU16 i=0; iNumACTable; i++) { for(mfxU16 j=0; j<16; j++) ht_out->ACTables[i].Bits[j] = ht_in->ACTables[i].Bits[j]; for(mfxU16 j=0; j<162; j++) ht_out->ACTables[i].Values[j] = ht_in->ACTables[i].Values[j]; } } else { ht_out->NumACTable = 0; for(mfxU16 i=0; i<4; i++) { for(mfxU16 j=0; j<16; j++) ht_out->ACTables[i].Bits[j] = 0; for(mfxU16 j=0; j<162; j++) ht_out->ACTables[i].Values[j] = 0; } isInvalid++; } } // Check options for correctness if (in->mfx.CodecId != MFX_CODEC_JPEG) isInvalid++; out->mfx.CodecId = MFX_CODEC_JPEG; // profile and level can be corrected switch(in->mfx.CodecProfile) { case MFX_PROFILE_JPEG_BASELINE: //case MFX_PROFILE_JPEG_EXTENDED: //case MFX_PROFILE_JPEG_PROGRESSIVE: //case MFX_PROFILE_JPEG_LOSSLESS: case MFX_PROFILE_UNKNOWN: out->mfx.CodecProfile = MFX_PROFILE_JPEG_BASELINE; break; default: isInvalid++; out->mfx.CodecProfile = MFX_PROFILE_UNKNOWN; break; } mfxU32 fourCC = in->mfx.FrameInfo.FourCC; mfxU16 chromaFormat = in->mfx.FrameInfo.ChromaFormat; if ((fourCC == 0 && chromaFormat == 0) || (fourCC == MFX_FOURCC_NV12 && (chromaFormat == MFX_CHROMAFORMAT_YUV420 || chromaFormat == MFX_CHROMAFORMAT_YUV400)) || (fourCC == MFX_FOURCC_YUY2 && chromaFormat == MFX_CHROMAFORMAT_YUV422H) || (fourCC == MFX_FOURCC_RGB4 && chromaFormat == MFX_CHROMAFORMAT_YUV444)) { out->mfx.FrameInfo.FourCC = in->mfx.FrameInfo.FourCC; out->mfx.FrameInfo.ChromaFormat = in->mfx.FrameInfo.ChromaFormat; } else { out->mfx.FrameInfo.FourCC = 0; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; return MFX_ERR_UNSUPPORTED; } if (in->Protected != 0) isInvalid++; out->Protected = 0; out->AsyncDepth = in->AsyncDepth; //Check for valid framerate if((!in->mfx.FrameInfo.FrameRateExtN && in->mfx.FrameInfo.FrameRateExtD) || (in->mfx.FrameInfo.FrameRateExtN && !in->mfx.FrameInfo.FrameRateExtD) || (in->mfx.FrameInfo.FrameRateExtD && ((mfxF64)in->mfx.FrameInfo.FrameRateExtN / in->mfx.FrameInfo.FrameRateExtD) > 172)) { isInvalid++; out->mfx.FrameInfo.FrameRateExtN = out->mfx.FrameInfo.FrameRateExtD = 0; } else { out->mfx.FrameInfo.FrameRateExtN = in->mfx.FrameInfo.FrameRateExtN; out->mfx.FrameInfo.FrameRateExtD = in->mfx.FrameInfo.FrameRateExtD; } switch(in->IOPattern) { case 0: case MFX_IOPATTERN_IN_SYSTEM_MEMORY: case MFX_IOPATTERN_IN_VIDEO_MEMORY: out->IOPattern = in->IOPattern; break; default: isCorrected++; if(in->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY) out->IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY; else if(in->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) out->IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; else out->IOPattern = 0; } out->mfx.NumThread = in->mfx.NumThread; if(out->mfx.NumThread < 1) out->mfx.NumThread = 1; // Check crops if (in->mfx.FrameInfo.CropH > in->mfx.FrameInfo.Height && in->mfx.FrameInfo.Height) { out->mfx.FrameInfo.CropH = 0; isInvalid ++; } else out->mfx.FrameInfo.CropH = in->mfx.FrameInfo.CropH; if (in->mfx.FrameInfo.CropW > in->mfx.FrameInfo.Width && in->mfx.FrameInfo.Width) { out->mfx.FrameInfo.CropW = 0; isInvalid ++; } else out->mfx.FrameInfo.CropW = in->mfx.FrameInfo.CropW; if (in->mfx.FrameInfo.CropX + in->mfx.FrameInfo.CropW > in->mfx.FrameInfo.Width) { out->mfx.FrameInfo.CropX = 0; isInvalid ++; } else out->mfx.FrameInfo.CropX = in->mfx.FrameInfo.CropX; if (in->mfx.FrameInfo.CropY + in->mfx.FrameInfo.CropH > in->mfx.FrameInfo.Height) { out->mfx.FrameInfo.CropY = 0; isInvalid ++; } else out->mfx.FrameInfo.CropY = in->mfx.FrameInfo.CropY; out->mfx.FrameInfo.AspectRatioW = in->mfx.FrameInfo.AspectRatioW; out->mfx.FrameInfo.AspectRatioH = in->mfx.FrameInfo.AspectRatioH; if (in->mfx.Quality > 100) { out->mfx.Quality = 100; isCorrected++; } else { out->mfx.Quality = in->mfx.Quality; } out->mfx.FrameInfo.Height = in->mfx.FrameInfo.Height; out->mfx.FrameInfo.Width = in->mfx.FrameInfo.Width; out->mfx.Interleaved = in->mfx.Interleaved; out->mfx.RestartInterval = in->mfx.RestartInterval; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: out->mfx.FrameInfo.PicStruct = in->mfx.FrameInfo.PicStruct; break; case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: //case MFX_PICSTRUCT_FIELD_REPEATED: //case MFX_PICSTRUCT_FRAME_DOUBLING: //case MFX_PICSTRUCT_FRAME_TRIPLING: return MFX_ERR_UNSUPPORTED; default: isInvalid++; out->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; break; } } if(isInvalid) MFX_RETURN(MFX_ERR_UNSUPPORTED); if(isCorrected) return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return MFX_ERR_NONE; } // function to calculate required number of external surfaces and create request mfxStatus MFXVideoENCODEMJPEG_HW::QueryIOSurf(VideoCORE * core, mfxVideoParam *par, mfxFrameAllocRequest *request) { mfxStatus sts = MFX_ERR_NONE; JpegEncCaps hwCaps = { }; sts = QueryHwCaps(core, hwCaps); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); sts = CheckJpegParam(core, *par, hwCaps); // check for valid IOPattern mfxU16 IOPatternIn = par->IOPattern & ( MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_IN_SYSTEM_MEMORY); if (!par->IOPattern || ( (IOPatternIn != MFX_IOPATTERN_IN_VIDEO_MEMORY) && (IOPatternIn != MFX_IOPATTERN_IN_SYSTEM_MEMORY))) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } request->Info = par->mfx.FrameInfo; request->NumFrameMin = 1; request->Type = MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY; request->Type |= (IOPatternIn == MFX_IOPATTERN_IN_SYSTEM_MEMORY) ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; request->NumFrameSuggested = std::max(request->NumFrameMin, par->AsyncDepth); return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEMJPEG_HW::Init(mfxVideoParam *par) { mfxStatus sts, QueryStatus; if (m_bInitialized || !m_pCore) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); if(par == NULL) return MFX_ERR_NULL_PTR; MFX_CHECK( CheckExtBufferId(*par) == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM ); mfxExtJPEGQuantTables* jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); mfxVideoParam checked; mfxU16 ext_counter = 0; checked = *par; if (jpegQT) { m_checkedJpegQT = *jpegQT; m_pCheckedExt[ext_counter++] = &m_checkedJpegQT.Header; } else { memset(&m_checkedJpegQT, 0, sizeof(m_checkedJpegQT)); m_checkedJpegQT.Header.BufferId = MFX_EXTBUFF_JPEG_QT; m_checkedJpegQT.Header.BufferSz = sizeof(m_checkedJpegQT); } if (jpegHT) { m_checkedJpegHT = *jpegHT; m_pCheckedExt[ext_counter++] = &m_checkedJpegHT.Header; } else { memset(&m_checkedJpegHT, 0, sizeof(m_checkedJpegHT)); m_checkedJpegHT.Header.BufferId = MFX_EXTBUFF_JPEG_HUFFMAN; m_checkedJpegHT.Header.BufferSz = sizeof(m_checkedJpegHT); } checked.ExtParam = m_pCheckedExt; checked.NumExtParam = ext_counter; sts = Query(m_pCore, par, &checked); if ((sts != MFX_ERR_NONE) && (sts != MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)) { if (sts == MFX_ERR_UNSUPPORTED) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } else return sts; } QueryStatus = sts; par = &checked; // from now work with fixed copy of input! bool vpl_interface = SupportsVPLFeatureSet(*m_pCore); if (!m_pCore->IsExternalFrameAllocator() && !vpl_interface && (par->IOPattern & (MFX_IOPATTERN_OUT_VIDEO_MEMORY | MFX_IOPATTERN_IN_VIDEO_MEMORY))) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); m_ddi.reset( CreatePlatformMJpegEncoder( m_pCore ) ); if (m_ddi.get() == 0) return MFX_ERR_UNSUPPORTED; MFX_INTERNAL_CPY(&m_vFirstParam, par, sizeof(mfxVideoParam)); MFX_INTERNAL_CPY(&m_vParam, &m_vFirstParam, sizeof(mfxVideoParam)); sts = m_ddi->CreateAuxilliaryDevice( m_pCore, m_vParam.mfx.FrameInfo.Width, m_vParam.mfx.FrameInfo.Height); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); sts = m_ddi->CreateAccelerationService(m_vParam); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); mfxFrameAllocRequest request = { }; request.Info = m_vParam.mfx.FrameInfo; // for JPEG encoding, one raw buffer is enough. but regarding to // motion JPEG video, we'd better use multiple buffers to support async mode. mfxU16 surface_num = JPEG_VIDEO_SURFACE_NUM + m_vParam.AsyncDepth; m_bUseInternalMem = m_vParam.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || (IsD3D9Simulation(*m_pCore) && (m_vParam.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY)); // WA for RGB swapping issue if (m_vParam.mfx.FrameInfo.FourCC == MFX_FOURCC_RGB4) { request.Info.FourCC = MFX_FOURCC_BGR4; request.Type = MFX_MEMTYPE_VIDEO_INT; #if defined(LINUX) request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; // required for libva especially for RGB32 #endif request.NumFrameMin = surface_num; request.NumFrameSuggested = request.NumFrameMin; sts = m_pCore->AllocFrames(&request, &m_raw, true); MFX_CHECK( sts == MFX_ERR_NONE && m_raw.NumFrameActual >= request.NumFrameMin, MFX_ERR_MEMORY_ALLOC); } else if (m_bUseInternalMem) { // Allocate raw surfaces. // This is required only in case of system memory at input request.Type = MFX_MEMTYPE_VIDEO_INT; #if defined(LINUX) request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; // required for libva especially for RGB32 #endif request.NumFrameMin = surface_num; request.NumFrameSuggested = request.NumFrameMin; sts = m_pCore->AllocFrames(&request, &m_raw, true); MFX_CHECK( sts == MFX_ERR_NONE && m_raw.NumFrameActual >= request.NumFrameMin, MFX_ERR_MEMORY_ALLOC); } // Allocate bitstream surfaces. request.Type = MFX_MEMTYPE_VIDEO_INT; #if defined(LINUX) request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; // required for libva especially for RGB32 #endif request.NumFrameMin = surface_num; request.NumFrameSuggested = request.NumFrameMin; // driver may suggest too small buffer for bitstream sts = m_ddi->QueryBitstreamBufferInfo(request); MFX_CHECK_STS(sts); mfxU16 doubleBytesPerPx = 0; switch(m_vParam.mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: doubleBytesPerPx = 3; break; case MFX_FOURCC_YUY2: doubleBytesPerPx = 4; break; case MFX_FOURCC_RGB4: default: doubleBytesPerPx = 8; break; } request.Info.Width = std::max (request.Info.Width, m_vParam.mfx.FrameInfo.Width); request.Info.Height = std::max(request.Info.Height, m_vParam.mfx.FrameInfo.Height * doubleBytesPerPx / 2); sts = m_bitstream.Alloc(m_pCore, request); MFX_CHECK( sts == MFX_ERR_NONE && m_bitstream.NumFrameActual >= request.NumFrameMin, MFX_ERR_MEMORY_ALLOC); sts = m_ddi->RegisterBitstreamBuffer(m_bitstream); MFX_CHECK_STS(sts); sts = m_TaskManager.Init(surface_num); MFX_CHECK_STS(sts); m_bInitialized = true; return (QueryStatus == MFX_ERR_NONE) ? sts : QueryStatus; } mfxStatus MFXVideoENCODEMJPEG_HW::Reset(mfxVideoParam *par) { mfxStatus sts; if(!m_bInitialized) return MFX_ERR_NOT_INITIALIZED; if(par == NULL) return MFX_ERR_NULL_PTR; sts = CheckExtBufferId(*par); MFX_CHECK_STS(sts); mfxExtJPEGQuantTables* jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); mfxVideoParam checked; mfxU16 ext_counter = 0; checked = *par; if (jpegQT) { m_checkedJpegQT = *jpegQT; m_pCheckedExt[ext_counter++] = &m_checkedJpegQT.Header; } else { memset(&m_checkedJpegQT, 0, sizeof(m_checkedJpegQT)); m_checkedJpegQT.Header.BufferId = MFX_EXTBUFF_JPEG_QT; m_checkedJpegQT.Header.BufferSz = sizeof(m_checkedJpegQT); } if (jpegHT) { m_checkedJpegHT = *jpegHT; m_pCheckedExt[ext_counter++] = &m_checkedJpegHT.Header; } else { memset(&m_checkedJpegHT, 0, sizeof(m_checkedJpegHT)); m_checkedJpegHT.Header.BufferId = MFX_EXTBUFF_JPEG_HUFFMAN; m_checkedJpegHT.Header.BufferSz = sizeof(m_checkedJpegHT); } checked.ExtParam = m_pCheckedExt; checked.NumExtParam = ext_counter; sts = Query(m_pCore, par, &checked); if (sts != MFX_ERR_NONE && sts != MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { if (sts == MFX_ERR_UNSUPPORTED) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } else return sts; } par = &checked; // from now work with fixed copy of input! // check for valid IOPattern mfxU16 IOPatternIn = par->IOPattern & ( MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_IN_SYSTEM_MEMORY); if (!par->IOPattern || ( (IOPatternIn != MFX_IOPATTERN_IN_VIDEO_MEMORY) && (IOPatternIn != MFX_IOPATTERN_IN_SYSTEM_MEMORY))) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } if (!m_pCore->IsExternalFrameAllocator() && (par->IOPattern & (MFX_IOPATTERN_OUT_VIDEO_MEMORY | MFX_IOPATTERN_IN_VIDEO_MEMORY))) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if(par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_UNKNOWN && par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_FIELD_TFF && par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_FIELD_BFF) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // check that new params don't require allocation of additional memory if (par->mfx.FrameInfo.Width > m_vFirstParam.mfx.FrameInfo.Width || par->mfx.FrameInfo.Height > m_vFirstParam.mfx.FrameInfo.Height || m_vFirstParam.mfx.FrameInfo.FourCC != par->mfx.FrameInfo.FourCC || m_vFirstParam.mfx.FrameInfo.ChromaFormat != par->mfx.FrameInfo.ChromaFormat) MFX_RETURN(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); sts = m_TaskManager.Reset(); MFX_CHECK_STS(sts); m_vParam.mfx = par->mfx; m_vParam.IOPattern = par->IOPattern; m_vParam.Protected = 0; if(par->AsyncDepth != m_vFirstParam.AsyncDepth) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); m_counter = 1; return sts; } mfxStatus MFXVideoENCODEMJPEG_HW::Close(void) { mfxStatus sts = m_TaskManager.Close(); MFX_CHECK_STS(sts); m_bitstream.Free(); if (m_raw.NumFrameActual != 0) { m_pCore->FreeFrames(&m_raw); memset(&m_raw, 0, sizeof(m_raw)); } return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEMJPEG_HW::GetVideoParam(mfxVideoParam *par) { if (!m_bInitialized) return MFX_ERR_NOT_INITIALIZED; MFX_CHECK_NULL_PTR1(par); par->mfx = m_vParam.mfx; par->Protected = m_vParam.Protected; par->IOPattern = m_vParam.IOPattern; par->AsyncDepth = m_vParam.AsyncDepth; return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEMJPEG_HW::GetFrameParam(mfxFrameParam *par) { MFX_CHECK_NULL_PTR1(par); MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus MFXVideoENCODEMJPEG_HW::GetEncodeStat(mfxEncodeStat *stat) { if (!m_bInitialized) return MFX_ERR_NOT_INITIALIZED; MFX_CHECK_NULL_PTR1(stat) memset(stat, 0, sizeof(mfxEncodeStat)); /*stat->NumCachedFrame = 0; stat->NumBit = m_totalBits; stat->NumFrame = m_encodedFrames;*/ MFX_RETURN(MFX_ERR_UNSUPPORTED); } // main function to run encoding process, synchronous mfxStatus MFXVideoENCODEMJPEG_HW::EncodeFrameCheck( mfxEncodeCtrl *ctrl, mfxFrameSurface1 *inSurface, mfxBitstream *bs, mfxFrameSurface1 ** /*reordered_surface*/, mfxEncodeInternalParams * /*pInternalParams*/, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { mfxExtJPEGQuantTables* jpegQT = NULL; mfxExtJPEGHuffmanTables* jpegHT = NULL; JpegEncCaps hwCaps = {}; mfxFrameSurface1 *surface = inSurface; if (inSurface && !surface) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } bool vpl_interface = SupportsVPLFeatureSet(*m_pCore); mfxStatus checkSts = CheckEncodeFrameParam( surface, bs, m_pCore->IsExternalFrameAllocator() || vpl_interface); MFX_CHECK(checkSts >= MFX_ERR_NONE, checkSts); mfxStatus status = checkSts; if (ctrl && ctrl->ExtParam && ctrl->NumExtParam > 0) { jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_JPEG_QT ); jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); } // Check new tables if exists if (jpegQT || jpegHT) { mfxVideoParam vPar = m_vParam; vPar.ExtParam = ctrl->ExtParam; vPar.NumExtParam = ctrl->NumExtParam; mfxStatus mfxRes = m_ddi->QueryEncodeCaps(hwCaps); MFX_CHECK_STS(mfxRes); mfxRes = CheckJpegParam(m_pCore, vPar, hwCaps); if (mfxRes != MFX_ERR_NONE) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxExtJPEGQuantTables* jpegQTInitial = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( m_vParam.ExtParam, m_vParam.NumExtParam, MFX_EXTBUFF_JPEG_QT ); if (!(jpegQTInitial || jpegQT || m_vParam.mfx.Quality)) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } DdiTask * task = 0; checkSts = m_TaskManager.AssignTask(task); MFX_CHECK_STS(checkSts); if (!task->m_pDdiData || task->m_cleanDdiData || jpegQT || jpegHT) { task->m_cleanDdiData = jpegQT || jpegHT; if (task->m_pDdiData) { task->m_pDdiData->Close(); delete task->m_pDdiData; task->m_pDdiData = NULL; } mfxStatus mfxRes = m_ddi->QueryEncodeCaps(hwCaps); MFX_CHECK_STS(mfxRes); task->m_pDdiData = new MfxHwMJpegEncode::ExecuteBuffers; checkSts = task->m_pDdiData->Init(&m_vParam, ctrl, &hwCaps); MFX_CHECK_STS(checkSts); } bs->TimeStamp = surface->Data.TimeStamp; bs->DecodeTimeStamp = surface->Data.TimeStamp; bs->FrameType = MFX_FRAMETYPE_I; m_pCore->IncreaseReference(*surface); task->surface = surface; task->bs = bs; task->m_statusReportNumber = m_counter++; // definition tasks for MSDK scheduler pEntryPoints[0].pState = this; pEntryPoints[0].pParam = task; // callback to run after complete task / depricated pEntryPoints[0].pCompleteProc = 0; // callback to run after complete sub-task (for SW implementation makes sense) / (NON-OBLIGATORY) pEntryPoints[0].pOutputPostProc = 0; pEntryPoints[0].requiredNumThreads = 1; pEntryPoints[1] = pEntryPoints[0]; pEntryPoints[0].pRoutineName = (char *)"Encode Submit"; pEntryPoints[1].pRoutineName = (char *)"Encode Query"; pEntryPoints[0].pRoutine = TaskRoutineSubmitFrame; pEntryPoints[1].pRoutine = TaskRoutineQueryFrame; numEntryPoints = 2; return status; } mfxStatus MFXVideoENCODEMJPEG_HW::CheckEncodeFrameParam( mfxFrameSurface1 * surface, mfxBitstream * bs, bool isExternalFrameAllocator) { mfxStatus sts = MFX_ERR_NONE; if (!m_bInitialized) return MFX_ERR_NOT_INITIALIZED; MFX_CHECK_NULL_PTR1(bs); MFX_CHECK_NULL_PTR1(bs->Data); // Check for enough bitstream buffer size if ( (0 == bs->MaxLength) || (bs->MaxLength <= (bs->DataOffset + bs->DataLength)) ) return MFX_ERR_NOT_ENOUGH_BUFFER; if ( NULL != surface ) { if (surface->Info.ChromaFormat != m_vParam.mfx.FrameInfo.ChromaFormat) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (m_vParam.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { mfxU32 pitch = surface->Data.PitchLow + ((mfxU32)surface->Data.PitchHigh << 16); MFX_CHECK((surface->Data.Y == 0) == (surface->Data.UV == 0), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK((surface->Data.Y == 0) || (pitch != 0), MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(surface->Data.Y != 0 || isExternalFrameAllocator, MFX_ERR_UNDEFINED_BEHAVIOR); } MFX_CHECK(surface->Info.Width >= m_vParam.mfx.FrameInfo.Width, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface->Info.Height >= m_vParam.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); } else { MFX_RETURN(MFX_ERR_MORE_DATA); } return sts; } // Routine to submit task to HW. asyncronous part of encdoing mfxStatus MFXVideoENCODEMJPEG_HW::TaskRoutineSubmitFrame( void * state, void * param, mfxU32 /*threadNumber*/, mfxU32 /*callNumber*/) { MFXVideoENCODEMJPEG_HW & enc = *(MFXVideoENCODEMJPEG_HW*)state; DdiTask &task = *(DdiTask*)param; mfxStatus sts = enc.CheckDevice(); MFX_CHECK_STS(sts); mfxHDLPair surfacePair = { }; mfxHDL surfaceHDL = 0; mfxHDL *pSurfaceHdl; if (MFX_HW_D3D11 == enc.m_pCore->GetVAType()) pSurfaceHdl = (mfxHDL *)&surfacePair; else if (MFX_HW_D3D9 == enc.m_pCore->GetVAType()) pSurfaceHdl = (mfxHDL *)&surfaceHDL; else if (MFX_HW_VAAPI == enc.m_pCore->GetVAType()) pSurfaceHdl = (mfxHDL *)&surfaceHDL; else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); mfxFrameSurface1 * nativeSurf = task.surface; // WA for RGB swapping issue if (enc.m_vParam.mfx.FrameInfo.FourCC == MFX_FOURCC_RGB4) { mfxFrameSurface1 dst{}; dst.Info = nativeSurf->Info; dst.Info.FourCC = MFX_FOURCC_BGR4; dst.Data.MemId = enc.m_raw.mids[task.m_idx]; bool bExternalFrameLocked = false; if (enc.m_pCore->GetVAType() == MFX_HW_VAAPI || IsD3D9Simulation(*enc.m_pCore)) { enc.m_pCore->LockFrame(enc.m_raw.mids[task.m_idx], &dst.Data); MFX_CHECK(dst.Data.R != 0, MFX_ERR_LOCK_MEMORY); if (nativeSurf->Data.B == 0) { enc.m_pCore->LockExternalFrame(nativeSurf->Data.MemId, &nativeSurf->Data); bExternalFrameLocked = true; } MFX_CHECK(nativeSurf->Data.B != 0, MFX_ERR_LOCK_MEMORY); const int dstOrder[3] = {2, 1, 0}; mfxSize roi = {nativeSurf->Info.Width, nativeSurf->Info.Height}; mfxSize setroi = {nativeSurf->Info.Width*4, nativeSurf->Info.Height}; if (0 == roi.width || 0 == roi.height) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); mfxU32 srsPitch = nativeSurf->Data.PitchLow + ((mfxU32)nativeSurf->Data.PitchHigh << 16); mfxU32 dstPitch = dst.Data.PitchLow + ((mfxU32)dst.Data.PitchHigh << 16); bool res = setPlaneROI(0xff, dst.Data.R, dstPitch, setroi); MFX_CHECK(res, MFX_ERR_UNDEFINED_BEHAVIOR); res = swapChannels(nativeSurf->Data.B, srsPitch, dst.Data.R, dstPitch, roi, dstOrder); MFX_CHECK(res, MFX_ERR_UNDEFINED_BEHAVIOR); if (bExternalFrameLocked) { sts = enc.m_pCore->UnlockExternalFrame(nativeSurf->Data.MemId, &nativeSurf->Data); MFX_CHECK_STS(sts); } sts = enc.m_pCore->UnlockFrame(enc.m_raw.mids[task.m_idx], &dst.Data); MFX_CHECK_STS(sts); } else { // In fact this is a CM copy path mfxU16 src_memtype = (mfxU16)((nativeSurf->Data.B == 0) ? MFX_MEMTYPE_DXVA2_DECODER_TARGET : MFX_MEMTYPE_SYSTEM_MEMORY); src_memtype |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = enc.m_pCore->DoFastCopyWrapper(&dst, MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME, nativeSurf, src_memtype); MFX_CHECK_STS(sts); } sts = enc.m_pCore->GetFrameHDL(enc.m_raw.mids[task.m_idx], pSurfaceHdl); } else if (enc.m_bUseInternalMem) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Copy input"); mfxFrameSurface1 surfSrc = MakeSurface(enc.m_vParam.mfx.FrameInfo, *nativeSurf); mfxFrameSurface1 surfDst = MakeSurface(enc.m_vParam.mfx.FrameInfo, enc.m_raw.mids[task.m_idx]); mfxU16 inMemType = MFX_MEMTYPE_EXTERNAL_FRAME; inMemType |= enc.m_vParam.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET; sts = enc.m_pCore->DoFastCopyWrapper(&surfDst, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET, &surfSrc, inMemType); MFX_CHECK_STS(sts); sts = enc.m_pCore->GetFrameHDL(enc.m_raw.mids[task.m_idx], pSurfaceHdl); } else { sts = enc.m_pCore->GetExternalFrameHDL(*nativeSurf, surfacePair); surfaceHDL = surfacePair.first; } MFX_CHECK_STS(sts); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "JPEG encode DDISubmitTask"); if (MFX_HW_D3D11 == enc.m_pCore->GetVAType()) { MFX_CHECK(surfacePair.first != 0, MFX_ERR_UNDEFINED_BEHAVIOR); sts = enc.m_ddi->Execute(task, (mfxHDL)pSurfaceHdl); } else if (MFX_HW_D3D9 == enc.m_pCore->GetVAType()) { MFX_CHECK(surfaceHDL != 0, MFX_ERR_UNDEFINED_BEHAVIOR); sts = enc.m_ddi->Execute(task, surfaceHDL); } else if (MFX_HW_VAAPI == enc.m_pCore->GetVAType()) { MFX_CHECK(surfaceHDL != 0, MFX_ERR_UNDEFINED_BEHAVIOR); sts = enc.m_ddi->Execute(task, (mfxHDL)surfaceHDL); } return sts; } // Routine to query encdoing status from HW. asyncronous part of encdoing mfxStatus MFXVideoENCODEMJPEG_HW::TaskRoutineQueryFrame( void * state, void * param, mfxU32 /*threadNumber*/, mfxU32 /*callNumber*/) { mfxStatus sts; MFXVideoENCODEMJPEG_HW & enc = *(MFXVideoENCODEMJPEG_HW*)state; DdiTask &task = *(DdiTask*)param; sts = enc.m_ddi->QueryStatus(task); MFX_CHECK_STS(sts); sts = enc.m_ddi->UpdateBitstream(enc.m_bitstream.mids[task.m_idx], task); MFX_CHECK_STS(sts); enc.m_pCore->DecreaseReference(*task.surface); return enc.m_TaskManager.RemoveTask(task); } mfxStatus MFXVideoENCODEMJPEG_HW::UpdateDeviceStatus(mfxStatus sts) { if (sts == MFX_ERR_DEVICE_FAILED) m_deviceFailed = true; return sts; } mfxStatus MFXVideoENCODEMJPEG_HW::CheckDevice() { return m_deviceFailed ? MFX_ERR_DEVICE_FAILED : MFX_ERR_NONE; } #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) mfx_mjpeg_encode_hw_utils.cpp000066400000000000000000000526261443134507600340500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/src// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfx_mjpeg_encode_hw_utils.h" #include "libmfx_core_factory.h" #include "libmfx_core_interface.h" #include "jpegbase.h" #include "mfx_enc_common.h" #include "mfx_mjpeg_encode_interface.h" using namespace MfxHwMJpegEncode; mfxStatus MfxHwMJpegEncode::QueryHwCaps(VideoCORE * core, JpegEncCaps & hwCaps) { MFX_CHECK_NULL_PTR1(core); // Should be replaced with once quering capabs as other encoders do // remove this when driver starts returning actual encode caps hwCaps.MaxPicWidth = 4096; hwCaps.MaxPicHeight = 4096; std::unique_ptr ddi; ddi.reset( CreatePlatformMJpegEncoder(core) ); if (ddi.get() == 0) return MFX_ERR_NULL_PTR; mfxStatus sts = ddi->CreateAuxilliaryDevice(core, 640, 480, true); MFX_CHECK_STS(sts); sts = ddi->QueryEncodeCaps(hwCaps); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } bool MfxHwMJpegEncode::IsJpegParamExtBufferIdSupported(mfxU32 id) { return id == MFX_EXTBUFF_JPEG_QT || id == MFX_EXTBUFF_JPEG_HUFFMAN; } mfxStatus MfxHwMJpegEncode::CheckExtBufferId(mfxVideoParam const & par) { for (mfxU32 i = 0; i < par.NumExtParam; i++) { if (par.ExtParam[i] == 0) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); if (!IsJpegParamExtBufferIdSupported(par.ExtParam[i]->BufferId)) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); // check if buffer presents twice in video param if (mfx::GetExtBuffer( par.ExtParam + i + 1, par.NumExtParam - i - 1, par.ExtParam[i]->BufferId) != 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } return MFX_ERR_NONE; } mfxStatus MfxHwMJpegEncode::CheckJpegParam(VideoCORE *core, mfxVideoParam & par, JpegEncCaps const & hwCaps) { MFX_CHECK(core, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(hwCaps.Baseline, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(hwCaps.Sequential, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(hwCaps.Huffman, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK((par.mfx.Interleaved && hwCaps.Interleaved) || (!par.mfx.Interleaved && hwCaps.NonInterleaved), MFX_ERR_UNSUPPORTED); MFX_CHECK(par.mfx.FrameInfo.Width > 0 && par.mfx.FrameInfo.Height > 0, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); mfxF64 BytesPerPx = 0; switch (par.mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: BytesPerPx = 1.5; break; case MFX_FOURCC_YUY2: BytesPerPx = 2; break; case MFX_FOURCC_RGB4: default: BytesPerPx = 4; } if (core->GetVAType() == MFX_HW_D3D9) { MFX_CHECK(par.mfx.FrameInfo.Height <= hwCaps.MaxPicWidth/BytesPerPx, MFX_ERR_UNSUPPORTED ); } MFX_CHECK(par.mfx.FrameInfo.Width <= (mfxU16)hwCaps.MaxPicWidth && par.mfx.FrameInfo.Height <= (mfxU16)hwCaps.MaxPicHeight, MFX_ERR_UNSUPPORTED); MFX_CHECK(hwCaps.SampleBitDepth == 8, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(hwCaps.MaxNumComponent == 3, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(hwCaps.MaxNumScan >= 1, MFX_ERR_UNSUPPORTED); mfxStatus sts = CheckExtBufferId(par); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); mfxExtJPEGQuantTables* qt_in = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par.ExtParam, par.NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* ht_in = (mfxExtJPEGHuffmanTables*)mfx::GetExtBuffer( par.ExtParam, par.NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); if (qt_in && qt_in->NumTable > hwCaps.MaxNumQuantTable) return MFX_ERR_UNSUPPORTED; if (ht_in && (ht_in->NumDCTable > hwCaps.MaxNumHuffTable || ht_in->NumACTable > hwCaps.MaxNumHuffTable)) return MFX_ERR_UNSUPPORTED; return MFX_ERR_NONE; } mfxStatus ExecuteBuffers::Init(mfxVideoParam const *par, mfxEncodeCtrl const * ctrl, JpegEncCaps const * hwCaps) { mfxStatus sts = MFX_ERR_NONE; mfxU32 fourCC = par->mfx.FrameInfo.FourCC; mfxU16 chromaFormat = par->mfx.FrameInfo.ChromaFormat; mfxExtJPEGQuantTables* jpegQT = NULL; mfxExtJPEGHuffmanTables* jpegHT = NULL; if (ctrl && ctrl->ExtParam && ctrl->NumExtParam > 0) { jpegQT = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_JPEG_QT ); jpegHT = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); } mfxExtJPEGQuantTables* jpegQTInitial = (mfxExtJPEGQuantTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_QT ); mfxExtJPEGHuffmanTables* jpegHTInitial = (mfxExtJPEGHuffmanTables*) mfx::GetExtBuffer( par->ExtParam, par->NumExtParam, MFX_EXTBUFF_JPEG_HUFFMAN ); m_payload_base.length = 0; m_payload_list.clear(); if (fourCC == MFX_FOURCC_RGB4 && chromaFormat == MFX_CHROMAFORMAT_YUV444) { m_app14_data.header = 0xEEFF;//APP14 m_app14_data.lenH = 0; m_app14_data.lenL = 14; m_app14_data.s[0] = 0x41;//"A" m_app14_data.s[1] = 0x64;//"D" m_app14_data.s[2] = 0x6F;//"O" m_app14_data.s[3] = 0x62;//"B" m_app14_data.s[4] = 0x65;//"E" m_app14_data.versionH = 0; m_app14_data.versionL = 0x64; m_app14_data.flags0H = 0; m_app14_data.flags0L = 0; m_app14_data.flags1H = 0; m_app14_data.flags1L = 0; m_app14_data.transform = 0; //RGB mfxU32 payloadSize = 16; if (m_payload_base.length + payloadSize > m_payload_base.maxLength) { mfxU8* data = new mfxU8[m_payload_base.length + payloadSize]; std::copy(m_payload_base.data, m_payload_base.data + m_payload_base.length, data); delete[] m_payload_base.data; m_payload_base.data = data; m_payload_base.maxLength = m_payload_base.length + payloadSize; } m_payload_list.resize(1); m_payload_list.back().data = m_payload_base.data + m_payload_base.length; std::copy(reinterpret_cast(&m_app14_data), reinterpret_cast(&m_app14_data) + payloadSize, m_payload_list.back().data); m_payload_list.back().length = payloadSize; m_payload_base.length += m_payload_list.back().length; } else { m_app0_data.header = 0xE0FF;//APP0 m_app0_data.lenH = 0; m_app0_data.lenL = 16; m_app0_data.s[0] = 0x4A;//"J" m_app0_data.s[1] = 0x46;//"F" m_app0_data.s[2] = 0x49;//"I" m_app0_data.s[3] = 0x46;//"F" m_app0_data.s[4] = 0; // 0 m_app0_data.versionH = 0x01; m_app0_data.versionL = 0x02; m_app0_data.units = JRU_NONE; m_app0_data.xDensity = 0x0100;//1 m_app0_data.yDensity = 0x0100;//1 m_app0_data.xThumbnails = 0; m_app0_data.yThumbnails = 0; mfxU32 payloadSize = 18; if (m_payload_base.length + payloadSize > m_payload_base.maxLength) { mfxU8* data = new mfxU8[m_payload_base.length + payloadSize]; std::copy(m_payload_base.data, m_payload_base.data + m_payload_base.length, data); delete[] m_payload_base.data; m_payload_base.data = data; m_payload_base.maxLength = m_payload_base.length + payloadSize; } m_payload_list.resize(1); m_payload_list.back().data = m_payload_base.data + m_payload_base.length; std::copy(reinterpret_cast(&m_app0_data), reinterpret_cast(&m_app0_data) + payloadSize, m_payload_list.back().data); m_payload_list.back().length = payloadSize; m_payload_base.length += m_payload_list.back().length; } if (ctrl && ctrl->Payload && ctrl->NumPayload > 0) { for (mfxU16 i=0; iNumPayload; i++) { mfxPayload* pExtPayload = ctrl->Payload[i]; if (pExtPayload) { if (pExtPayload->Data && (pExtPayload->NumBit>>3) > 0) { mfxU32 payloadSize = pExtPayload->NumBit>>3; if (m_payload_base.length + payloadSize > m_payload_base.maxLength) { mfxU8* data = new mfxU8[m_payload_base.length + payloadSize]; std::copy(m_payload_base.data, m_payload_base.data + m_payload_base.length, data); delete[] m_payload_base.data; m_payload_base.data = data; m_payload_base.maxLength = m_payload_base.length + payloadSize; mfxU32 offset = 0; for (mfxU16 j = 0; j < m_payload_list.size(); j++) { m_payload_list[j].data = m_payload_base.data + offset; offset += m_payload_list[j].length; } } m_payload_list.resize(m_payload_list.size()+1); m_payload_list.back().data = m_payload_base.data + m_payload_base.length; std::copy(pExtPayload->Data, pExtPayload->Data + payloadSize, m_payload_list.back().data); m_payload_list.back().length = payloadSize; m_payload_base.length += m_payload_list.back().length; } else { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } } } // Picture Header memset(&m_pps, 0, sizeof(m_pps)); m_pps.reconstructed_picture = 0; m_pps.pic_flags.bits.profile = 0; m_pps.pic_flags.bits.progressive = 0; m_pps.pic_flags.bits.huffman = 1; m_pps.pic_flags.bits.interleaved = (par->mfx.Interleaved != 0); m_pps.pic_flags.bits.differential = 0; m_pps.picture_width = (mfxU32)par->mfx.FrameInfo.CropW; m_pps.picture_height = (mfxU32)par->mfx.FrameInfo.CropH; m_pps.sample_bit_depth = 8; m_pps.component_id[0] = 1; m_pps.component_id[1] = 2; m_pps.component_id[2] = 3; if (!jpegQT && !jpegQTInitial) m_pps.quality = (par->mfx.Quality > 100) ? 100 : par->mfx.Quality; if (fourCC == MFX_FOURCC_NV12 && chromaFormat == MFX_CHROMAFORMAT_YUV420) m_pps.num_components = 3; else if (fourCC == MFX_FOURCC_YUY2 && chromaFormat == MFX_CHROMAFORMAT_YUV422H) m_pps.num_components = 3; else if (fourCC == MFX_FOURCC_NV12 && chromaFormat == MFX_CHROMAFORMAT_YUV400) m_pps.num_components = 1; else if (fourCC == MFX_FOURCC_RGB4 && chromaFormat == MFX_CHROMAFORMAT_YUV444) m_pps.num_components = 3; else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); // Scan Header m_pps.num_scan = 1; m_scan_list.resize(1); memset(&m_scan_list[0], 0, sizeof(m_scan_list[0])); m_scan_list[0].restart_interval = par->mfx.RestartInterval; m_scan_list[0].num_components = m_pps.num_components; m_scan_list[0].components[0].component_selector = 1; m_scan_list[0].components[1].component_selector = 2; m_scan_list[0].components[2].component_selector = 3; // Quanlization tables if (jpegQT || jpegQTInitial) { // External tables mfxExtJPEGQuantTables *pExtQuant = jpegQT ? jpegQT : jpegQTInitial; MFX_CHECK(pExtQuant->NumTable && (pExtQuant->NumTable <= hwCaps->MaxNumQuantTable), MFX_ERR_UNDEFINED_BEHAVIOR); m_dqt_list.resize(1); if(pExtQuant->NumTable == 1) { m_dqt_list[0].load_lum_quantiser_matrix = true; m_dqt_list[0].load_chroma_quantiser_matrix = false; for(mfxU16 i = 0; i< 64; i++) { m_dqt_list[0].lum_quantiser_matrix[i]=(unsigned char) pExtQuant->Qm[0][i]; } m_pps.quantiser_table_selector[0] = 0; m_pps.quantiser_table_selector[1] = 0; m_pps.quantiser_table_selector[2] = 0; } else if(pExtQuant->NumTable == 2) { m_dqt_list[0].load_chroma_quantiser_matrix = true; m_dqt_list[0].load_lum_quantiser_matrix = true; for(mfxU16 i = 0; i< 64; i++) { m_dqt_list[0].lum_quantiser_matrix[i]=(unsigned char) pExtQuant->Qm[0][i]; m_dqt_list[0].chroma_quantiser_matrix[i]=(unsigned char) pExtQuant->Qm[1][i]; } m_pps.quantiser_table_selector[0] = 0; m_pps.quantiser_table_selector[1] = 1; m_pps.quantiser_table_selector[2] = 1; } else MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } else { // No external tables - use Quality parameter m_dqt_list.resize(0); if (fourCC == MFX_FOURCC_RGB4) { m_pps.quantiser_table_selector[0] = 0; m_pps.quantiser_table_selector[1] = 0; m_pps.quantiser_table_selector[2] = 0; } else { m_pps.quantiser_table_selector[0] = 0; m_pps.quantiser_table_selector[1] = 1; m_pps.quantiser_table_selector[2] = 1; } } // Huffman tables if (jpegHT || jpegHTInitial) { // External tables mfxExtJPEGHuffmanTables *pExtHuffman = jpegHT ? jpegHT : jpegHTInitial; MFX_CHECK(pExtHuffman->NumDCTable && pExtHuffman->NumACTable && (pExtHuffman->NumDCTable < hwCaps->MaxNumHuffTable) && (pExtHuffman->NumACTable < hwCaps->MaxNumHuffTable), MFX_ERR_UNDEFINED_BEHAVIOR); m_dht_list.resize(1); for (mfxU16 j = 0; j < pExtHuffman->NumDCTable; j++) { if(j < 2) { MFX_INTERNAL_CPY(m_dht_list[0].huffman_table[j].num_dc_codes, pExtHuffman->DCTables[j].Bits, 16 * sizeof(mfxU8)); MFX_INTERNAL_CPY(m_dht_list[0].huffman_table[j].dc_values, pExtHuffman->DCTables[j].Values, 12 * sizeof(mfxU8)); } else MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } for (mfxU16 j = 0; j < pExtHuffman->NumACTable; j++) { if(j < 2) { MFX_INTERNAL_CPY(m_dht_list[0].huffman_table[j].num_ac_codes, pExtHuffman->ACTables[j].Bits, 16 * sizeof(mfxU8)); MFX_INTERNAL_CPY(m_dht_list[0].huffman_table[j].ac_values, pExtHuffman->ACTables[j].Values, 162 * sizeof(mfxU8)); } else MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } else { // Internal tables if (hwCaps->MaxNumHuffTable == 0) { m_dht_list.resize(0); } else if (hwCaps->MaxNumHuffTable == 1 || fourCC == MFX_FOURCC_RGB4) { m_dht_list.resize(1); m_dht_list[0].load_huffman_table[0] = 1; //0 for luma for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[0].num_dc_codes[i] = DefaultLuminanceDCBits[i]; for(mfxU16 i = 0; i < 12; i++) m_dht_list[0].huffman_table[0].dc_values[i] = DefaultLuminanceDCValues[i]; for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[0].num_ac_codes[i] = DefaultLuminanceACBits[i]; for(mfxU16 i = 0; i < 162; i++) m_dht_list[0].huffman_table[0].ac_values[i] = DefaultLuminanceACValues[i]; m_scan_list[0].components[0].dc_table_selector = 0; m_scan_list[0].components[1].dc_table_selector = 0; m_scan_list[0].components[2].dc_table_selector = 0; m_scan_list[0].components[0].ac_table_selector = 0; m_scan_list[0].components[1].ac_table_selector = 0; m_scan_list[0].components[2].ac_table_selector = 0; } else { m_dht_list.resize(1); m_dht_list[0].load_huffman_table[0] = 1; //0 for luma m_dht_list[0].load_huffman_table[1] = 1; // 1 for chroma for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[0].num_dc_codes[i] = DefaultLuminanceDCBits[i]; for(mfxU16 i = 0; i < 12; i++) m_dht_list[0].huffman_table[0].dc_values[i] = DefaultLuminanceDCValues[i]; for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[0].num_ac_codes[i] = DefaultLuminanceACBits[i]; for(mfxU16 i = 0; i < 162; i++) m_dht_list[0].huffman_table[0].ac_values[i] = DefaultLuminanceACValues[i]; for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[1].num_dc_codes[i] = DefaultChrominanceDCBits[i]; for(mfxU16 i = 0; i < 12; i++) m_dht_list[0].huffman_table[1].dc_values[i] = DefaultChrominanceDCValues[i]; for(mfxU16 i = 0; i < 16; i++) m_dht_list[0].huffman_table[1].num_ac_codes[i] = DefaultChrominanceACBits[i]; for(mfxU16 i = 0; i < 162; i++) m_dht_list[0].huffman_table[1].ac_values[i] = DefaultChrominanceACValues[i]; m_scan_list[0].components[0].dc_table_selector = 0; m_scan_list[0].components[1].dc_table_selector = 1; m_scan_list[0].components[2].dc_table_selector = 1; m_scan_list[0].components[0].ac_table_selector = 0; m_scan_list[0].components[1].ac_table_selector = 1; m_scan_list[0].components[2].ac_table_selector = 1; } } return sts; } void ExecuteBuffers::Close() { if (m_payload_base.data) { delete [] m_payload_base.data; m_payload_base.data = 0; m_payload_base.length = 0; m_payload_base.maxLength = 0; } m_dht_list.clear(); m_dqt_list.clear(); m_scan_list.clear(); m_payload_list.clear(); } TaskManager::TaskManager() { m_pTaskList = 0; m_TaskNum = 0; } TaskManager::~TaskManager() { UMC::AutomaticUMCMutex guard(m_mutex); Close(); } mfxStatus TaskManager::Init(mfxU32 maxTaskNum) { UMC::AutomaticUMCMutex guard(m_mutex); if (maxTaskNum > 0 && maxTaskNum < JPEG_DDITASK_MAX_NUM) { m_TaskNum = maxTaskNum; m_pTaskList = new DdiTask[m_TaskNum]; memset(m_pTaskList, 0, m_TaskNum * sizeof(DdiTask)); for (mfxU32 i = 0; i < m_TaskNum; i++) { m_pTaskList[i].m_idx = i; m_pTaskList[i].m_idxBS = i; } return MFX_ERR_NONE; } else { m_pTaskList = 0; m_TaskNum = 0; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } mfxStatus TaskManager::Reset() { UMC::AutomaticUMCMutex guard(m_mutex); if (m_pTaskList) { for (mfxU32 i = 0; i < m_TaskNum; i++) { if(m_pTaskList[i].m_pDdiData) { m_pTaskList[i].m_pDdiData->Close(); delete m_pTaskList[i].m_pDdiData; m_pTaskList[i].m_pDdiData = NULL; } vm_interlocked_xchg32(&m_pTaskList[i].lInUse, 0); m_pTaskList[i].surface = 0; m_pTaskList[i].bs = 0; } } return MFX_ERR_NONE; } mfxStatus TaskManager::Close() { if (m_pTaskList) { for (mfxU32 i = 0; i < m_TaskNum; i++) { if(m_pTaskList[i].m_pDdiData) { m_pTaskList[i].m_pDdiData->Close(); delete m_pTaskList[i].m_pDdiData; m_pTaskList[i].m_pDdiData = NULL; } } delete [] m_pTaskList; m_pTaskList = 0; } return MFX_ERR_NONE; } mfxStatus TaskManager::AssignTask(DdiTask *& newTask) { UMC::AutomaticUMCMutex guard(m_mutex); if (m_pTaskList) { mfxU32 i; for (i = 0; i < m_TaskNum; i++) { if (m_pTaskList[i].lInUse == 0) break; } if (i < m_TaskNum) { newTask = &m_pTaskList[i]; vm_interlocked_xchg32(&newTask->lInUse, 1); return MFX_ERR_NONE; } else { return MFX_WRN_DEVICE_BUSY; } } else { return MFX_ERR_NULL_PTR; } } mfxStatus TaskManager::RemoveTask(DdiTask & task) { UMC::AutomaticUMCMutex guard(m_mutex); if (m_pTaskList) { vm_interlocked_xchg32(&task.lInUse, 0); task.surface = 0; task.bs = 0; return MFX_ERR_NONE; } else { return MFX_ERR_NULL_PTR; } } #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/mjpeg/src/mfx_mjpeg_encode_vaapi.cpp000066400000000000000000000433531443134507600333660ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfx_mjpeg_encode_hw_utils.h" #include "libmfx_core_factory.h" #include "libmfx_core_interface.h" #include "jpegbase.h" #include "mfx_enc_common.h" #include "mfx_mjpeg_encode_vaapi.h" #include "libmfx_core_interface.h" #include "mfx_mjpeg_encode_hw_utils.h" #include "libmfx_core_vaapi.h" #include "fast_copy.h" using namespace MfxHwMJpegEncode; VAAPIEncoder::VAAPIEncoder() : m_core(NULL) , m_width(-1) , m_height(-1) , m_caps() , m_vaDisplay(0) , m_vaContextEncode(VA_INVALID_ID) , m_vaConfig(VA_INVALID_ID) , m_qmBufferId(VA_INVALID_ID) , m_htBufferId(VA_INVALID_ID) , m_scanBufferId(VA_INVALID_ID) , m_ppsBufferId(VA_INVALID_ID) { } VAAPIEncoder::~VAAPIEncoder() { Destroy(); } mfxStatus VAAPIEncoder::CreateAuxilliaryDevice( VideoCORE * core, mfxU32 width, mfxU32 height, bool /*isTemporal*/) { m_core = core; VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(m_core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_WITH_ASSERT(vaapi_core_vpl, MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(vaapi_core_vpl->GetVAService(&m_vaDisplay)); MFX_CHECK(m_vaDisplay, MFX_ERR_DEVICE_FAILED); VAStatus vaSts; mfxI32 entrypointsIndx = 0; mfxI32 numEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(numEntrypoints, MFX_ERR_DEVICE_FAILED); std::vector pEntrypoints(numEntrypoints); vaSts = vaQueryConfigEntrypoints( m_vaDisplay, VAProfileJPEGBaseline, &pEntrypoints[0], &numEntrypoints); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); bool bEncodeEnable = false; for( entrypointsIndx = 0; entrypointsIndx < numEntrypoints; entrypointsIndx++ ) { if( VAEntrypointEncPicture == pEntrypoints[entrypointsIndx] ) { bEncodeEnable = true; break; } } MFX_CHECK(bEncodeEnable, MFX_ERR_DEVICE_FAILED); m_width = width; m_height = height; // set caps memset(&m_caps, 0, sizeof(m_caps)); m_caps.Baseline = 1; m_caps.Sequential = 1; m_caps.Huffman = 1; m_caps.NonInterleaved = 0; m_caps.Interleaved = 1; m_caps.SampleBitDepth = 8; m_caps.MaxNumComponent = 3; m_caps.MaxNumScan = 1; m_caps.MaxNumHuffTable = 2; m_caps.MaxNumQuantTable = 2; std::map attrib_map; VAConfigAttribType attrib_types[] = { VAConfigAttribEncJPEG, VAConfigAttribMaxPictureWidth, VAConfigAttribMaxPictureHeight, VAConfigAttribContextPriority }; std::vector attrib; attrib.reserve(sizeof(attrib_types) / sizeof(attrib_types[0])); for (size_t i = 0; i < sizeof(attrib_types) / sizeof(attrib_types[0]); i++) { attrib.push_back(VAConfigAttrib{attrib_types[i], 0}); attrib_map[attrib_types[i]] = i; } vaSts = vaGetConfigAttributes(m_vaDisplay, VAProfileJPEGBaseline, VAEntrypointEncPicture, attrib.data(), attrib.size()); VAConfigAttribValEncJPEG encAttribVal; encAttribVal.value = attrib[attrib_map[VAConfigAttribEncJPEG]].value; m_caps.MaxNumComponent = encAttribVal.bits.max_num_components; m_caps.MaxNumScan = encAttribVal.bits.max_num_scans; m_caps.MaxNumHuffTable = encAttribVal.bits.max_num_huffman_tables; m_caps.MaxNumQuantTable = encAttribVal.bits.max_num_quantization_tables; m_caps.MaxPicWidth = attrib[attrib_map[VAConfigAttribMaxPictureWidth]].value; m_caps.MaxPicHeight = attrib[attrib_map[VAConfigAttribMaxPictureHeight]].value; return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::CreateAccelerationService(mfxVideoParam const & par) { MFX_CHECK(m_vaDisplay, MFX_ERR_DEVICE_FAILED); VAStatus vaSts; mfxI32 entrypointsIndx = 0; mfxI32 numEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(numEntrypoints, MFX_ERR_DEVICE_FAILED); std::vector pEntrypoints(numEntrypoints); MFX_CHECK_WITH_ASSERT(par.mfx.CodecProfile == MFX_PROFILE_JPEG_BASELINE, MFX_ERR_DEVICE_FAILED); vaSts = vaQueryConfigEntrypoints( m_vaDisplay, VAProfileJPEGBaseline, &pEntrypoints[0], &numEntrypoints); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); bool bEncodeEnable = false; for( entrypointsIndx = 0; entrypointsIndx < numEntrypoints; entrypointsIndx++ ) { if( VAEntrypointEncPicture == pEntrypoints[entrypointsIndx] ) { bEncodeEnable = true; break; } } if( !bEncodeEnable ) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } // Configuration VAConfigAttrib attrib; attrib.type = VAConfigAttribRTFormat; vaSts = vaGetConfigAttributes(m_vaDisplay, VAProfileJPEGBaseline, VAEntrypointEncPicture, &attrib, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (!(attrib.value & VA_RT_FORMAT_YUV420) || !(attrib.value & VA_RT_FORMAT_YUV422) ) //to be do MFX_RETURN(MFX_ERR_DEVICE_FAILED); vaSts = vaCreateConfig( m_vaDisplay, VAProfileJPEGBaseline, VAEntrypointEncPicture, NULL, 0, &m_vaConfig); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); // Encoder create vaSts = vaCreateContext( m_vaDisplay, m_vaConfig, m_width, m_height, VA_PROGRESSIVE, NULL, 0, &m_vaContextEncode); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::QueryBitstreamBufferInfo(mfxFrameAllocRequest& request) { // request linear buffer request.Info.FourCC = MFX_FOURCC_P8; // context_id required for allocation video memory (tmp solution) request.AllocId = m_vaContextEncode; return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::QueryEncodeCaps(JpegEncCaps & caps) { caps = m_caps; return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::RegisterBitstreamBuffer(mfxFrameAllocResponse& response) { std::vector * pQueue; mfxStatus sts; pQueue = &m_bsQueue; { // we should register allocated HW bitstreams and recon surfaces MFX_CHECK( response.mids, MFX_ERR_NULL_PTR ); ExtVASurface extSurf = { VA_INVALID_ID, 0, 0, 0 }; VASurfaceID *pSurface = NULL; for (mfxU32 i = 0; i < response.NumFrameActual; i++) { sts = m_core->GetFrameHDL(response.mids[i], (mfxHDL *)&pSurface); MFX_CHECK_STS(sts); extSurf.number = i; extSurf.surface = *pSurface; pQueue->push_back( extSurf ); } } return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::Execute(DdiTask &task, mfxHDL surface) { VAStatus vaSts; ExecuteBuffers *pExecuteBuffers = task.m_pDdiData; ExtVASurface codedbuffer = m_bsQueue[task.m_idxBS]; pExecuteBuffers->m_pps.coded_buf = (VABufferID)codedbuffer.surface; vaSts = vaBeginPicture(m_vaDisplay, m_vaContextEncode, *(VASurfaceID*)surface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); DestroyBuffers(); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPictureParameterBufferType, sizeof(VAEncPictureParameterBufferJPEG), 1, &pExecuteBuffers->m_pps, &m_ppsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if(pExecuteBuffers->m_dqt_list.size()) { // only the first dq table has been handled vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAQMatrixBufferType, sizeof(VAQMatrixBufferJPEG), 1, &pExecuteBuffers->m_dqt_list[0], &m_qmBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } if(pExecuteBuffers->m_dht_list.size()) { // only the first huffmn table has been handled vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAHuffmanTableBufferType, sizeof(VAHuffmanTableBufferJPEGBaseline), 1, &pExecuteBuffers->m_dht_list[0], &m_htBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } if(pExecuteBuffers->m_payload_list.size()) { m_appBufferIds.resize(pExecuteBuffers->m_payload_list.size()); for( mfxU8 index = 0; index < pExecuteBuffers->m_payload_list.size(); index++) { vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, pExecuteBuffers->m_payload_list[index].length, 1, pExecuteBuffers->m_payload_list[index].data, &m_appBufferIds[index]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } if(pExecuteBuffers->m_scan_list.size() == 1) { vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSliceParameterBufferType, sizeof(VAEncSliceParameterBufferJPEG), 1, &pExecuteBuffers->m_scan_list[0], &m_scanBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } else { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, (VABufferID *)&m_ppsBufferId, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if(m_qmBufferId != VA_INVALID_ID) { vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, (VABufferID *)&m_qmBufferId, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } if( m_htBufferId != VA_INVALID_ID) { vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, (VABufferID *)&m_htBufferId, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } if(m_appBufferIds.size()) { for( mfxU8 index = 0; index < m_appBufferIds.size(); index++) { vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, (VABufferID *)&m_appBufferIds[index], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, (VABufferID *)&m_scanBufferId, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaEndPicture(m_vaDisplay, m_vaContextEncode); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback = { VA_INVALID_ID, 0, 0, 0 }; currentFeedback.number = task.m_statusReportNumber; currentFeedback.surface = *(VASurfaceID*)surface; currentFeedback.idxBs = task.m_idxBS; currentFeedback.size = 0; m_feedbackCache.push_back( currentFeedback ); } return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::QueryStatus(DdiTask & task) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "JPEG encode DDIWaitTaskSync"); VAStatus vaSts; bool isFound = false; VASurfaceID waitSurface; mfxU32 waitIdxBs; mfxU32 waitSize; mfxU32 indxSurf; UMC::AutomaticUMCMutex guard(m_guard); for( indxSurf = 0; indxSurf < m_feedbackCache.size(); indxSurf++ ) { ExtVASurface currentFeedback = m_feedbackCache[ indxSurf ]; if( currentFeedback.number == task.m_statusReportNumber ) { waitSurface = currentFeedback.surface; waitIdxBs = currentFeedback.idxBs; waitSize = currentFeedback.size; isFound = true; break; } } if( !isFound ) { MFX_RETURN(MFX_ERR_UNKNOWN); } // find used bitstream VABufferID codedBuffer; if( waitIdxBs < m_bsQueue.size()) { codedBuffer = m_bsQueue[waitIdxBs].surface; } else { MFX_RETURN(MFX_ERR_UNKNOWN); } if (waitSurface != VA_INVALID_SURFACE) // Not skipped frame { VASurfaceStatus surfSts = VASurfaceSkipped; #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); guard.Unlock(); vaSts = vaSyncSurface(m_vaDisplay, waitSurface); // it could happen that decoding error will not be returned after decoder sync // and will be returned at subsequent encoder sync instead // just ignore VA_STATUS_ERROR_DECODING_ERROR in encoder if (vaSts == VA_STATUS_ERROR_DECODING_ERROR) vaSts = VA_STATUS_SUCCESS; MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); surfSts = VASurfaceReady; #else vaSts = vaQuerySurfaceStatus(m_vaDisplay, waitSurface, &surfSts); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (VASurfaceReady == surfSts) { m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); guard.Unlock(); } #endif switch (surfSts) { case VASurfaceReady: VACodedBufferSegment *codedBufferSegment; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Enc vaMapBuffer"); vaSts = vaMapBuffer( m_vaDisplay, codedBuffer, (void **)(&codedBufferSegment)); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } task.m_bsDataLength = codedBufferSegment->size; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Enc vaUnmapBuffer"); vaSts = vaUnmapBuffer( m_vaDisplay, codedBuffer ); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; case VASurfaceRendering: case VASurfaceDisplaying: return MFX_WRN_DEVICE_BUSY; case VASurfaceSkipped: default: assert(!"bad feedback status"); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } } else { task.m_bsDataLength = waitSize; m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); } return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::UpdateBitstream( mfxMemId MemId, DdiTask & task) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "JPEG encode CopyBitstream"); mfxU8 * bsData = task.bs->Data + task.bs->DataOffset + task.bs->DataLength; mfxSize roi = {(int)task.m_bsDataLength, 1}; mfxFrameData bitstream = { }; if (task.m_bsDataLength + task.bs->DataOffset + task.bs->DataLength > task.bs->MaxLength) return MFX_ERR_NOT_ENOUGH_BUFFER; m_core->LockFrame(MemId, &bitstream); MFX_CHECK(bitstream.Y != 0, MFX_ERR_LOCK_MEMORY); mfxStatus sts = FastCopy::Copy( bsData, task.m_bsDataLength, (uint8_t *)bitstream.Y, task.m_bsDataLength, roi, COPY_VIDEO_TO_SYS); assert(sts == MFX_ERR_NONE); task.bs->DataLength += task.m_bsDataLength; m_core->UnlockFrame(MemId, &bitstream); return sts; } mfxStatus VAAPIEncoder::DestroyBuffers() { mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qmBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_htBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_scanBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); std::ignore = MFX_STS_TRACE(sts); for (size_t index = 0; index < m_appBufferIds.size(); index++) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_appBufferIds[index]); std::ignore = MFX_STS_TRACE(sts); } m_appBufferIds.clear(); return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::Destroy() { m_bsQueue.clear(); m_feedbackCache.clear(); DestroyBuffers(); if( m_vaContextEncode ) { VAStatus vaSts = vaDestroyContext( m_vaDisplay, m_vaContextEncode ); std::ignore = MFX_STS_TRACE(vaSts); m_vaContextEncode = 0; } if( m_vaConfig ) { VAStatus vaSts = vaDestroyConfig( m_vaDisplay, m_vaConfig ); std::ignore = MFX_STS_TRACE(vaSts); m_vaConfig = 0; } return MFX_ERR_NONE; } #endif //defined(MFX_ENABLE_MJPEG_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/000077500000000000000000000000001443134507600255565ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_device.h000066400000000000000000000065231443134507600300370ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "feature_blocks/mfx_feature_blocks_utils.h" #include "libmfx_core_interface.h" #include namespace MfxEncodeHW { struct DDIExecParam { mfxU32 Function = 0; struct Param { void* pData = nullptr; mfxU32 Size = 0; mfxU32 Num = 0; template T& Cast(mfxU32 idx = 0) const { bool bInvalid = !pData || (Size * std::max(Num, 1)) < (sizeof(T) * (idx + 1)); if (bInvalid) throw std::logic_error("Invalid DDIExecParam::Param data"); return *((T*)pData); } } In, Out, Resource; template static bool IsFunction(const DDIExecParam& xpar) { return xpar.Function == F; } }; struct DDIFeedback { using TGet = MfxFeatureBlocks::CallChain; using TCheckStatus = MfxFeatureBlocks::CallChain; using TUpdate = MfxFeatureBlocks::CallChain; std::list ExecParam; TGet Get; TCheckStatus CheckStatus; TUpdate Update; TUpdate Remove; bool bNotReady = false; }; struct PackedData { mfxU8* pData; mfxU32 BitLen; bool bHasEP; bool bLongSC; std::map PackInfo; }; class Device { public: virtual ~Device() {} virtual mfxStatus Create( VideoCORE& core , GUID guid , mfxU32 width , mfxU32 height , bool isTemporal) = 0; virtual bool IsValid() const = 0; virtual mfxStatus QueryCaps(void* pCaps, mfxU32 size) = 0; virtual mfxStatus QueryDdiVersion(mfxU32 codecId) = 0; virtual mfxStatus QueryCompBufferInfo(mfxU32, mfxFrameInfo&) = 0; virtual mfxStatus Init(const std::list*) = 0; virtual mfxStatus Execute(const DDIExecParam&) = 0; virtual mfxStatus QueryStatus(DDIFeedback& fb, mfxU32 id) = 0; virtual mfxStatus BeginPicture(mfxHDL) = 0; virtual mfxStatus EndPicture() = 0; virtual mfxU32 GetLastErr() const = 0; virtual void Trace(const DDIExecParam&, bool /*bAfterExec*/, mfxU32 /*res*/) {} }; } //namespace MfxEncodeHWoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_device_vaapi.cpp000066400000000000000000000254301443134507600315500ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "ehw_device_vaapi.h" #include #include "feature_blocks/mfx_feature_blocks_utils.h" namespace MfxEncodeHW { using namespace MfxFeatureBlocks; mfxStatus DeviceVAAPI::Create( VideoCORE& core , GUID guid , mfxU32 /*width*/ , mfxU32 /*height*/ , bool /*isTemporal*/) { mfxStatus sts = core.GetHandle(MFX_HANDLE_VA_DISPLAY, (mfxHDL*)&m_vaDisplay); MFX_CHECK_STS(sts); TVAGUID vaguid = {}; vaguid.guid = guid; m_profile = vaguid.va.profile; m_entrypoint = vaguid.va.entrypoint; m_pCore = &core; m_callVa = [this](const DDIExecParam& par) { return Execute(par); }; return MFX_ERR_NONE; } void DeviceVAAPI::Destroy() { m_callVa = [this](const DDIExecParam& par) { return Execute(par); }; std::set vaBuffers; vaBuffers.swap(m_vaBuffers); for (auto id : vaBuffers) { DestroyVABuffer(id); } if (m_vaContextEncode != VA_INVALID_ID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaDestroyContext"); m_lastErr = Execute(VAFID_DestroyContext, m_vaDisplay, m_vaContextEncode); m_vaContextEncode = VA_INVALID_ID; } if (m_vaConfig != VA_INVALID_ID) { m_lastErr = Execute(VAFID_DestroyConfig, m_vaDisplay, m_vaConfig); m_vaConfig = VA_INVALID_ID; } m_vaDisplay = nullptr; } mfxStatus DeviceVAAPI::QueryCaps(void* pCaps, mfxU32 size) { MFX_CHECK(IsValid(), MFX_ERR_NOT_INITIALIZED); int num = (size / sizeof(VAConfigAttrib)); auto sts = Execute( VAFID_GetConfigAttributes , m_vaDisplay , m_profile , m_entrypoint , (VAConfigAttrib*)pCaps , num); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus DeviceVAAPI::QueryCompBufferInfo(mfxU32 /*type*/, mfxFrameInfo& /*info*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus DeviceVAAPI::Init(const std::list* pPar) { MFX_CHECK(IsValid(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK(pPar, MFX_ERR_UNDEFINED_BEHAVIOR); auto itCreateConfig = std::find_if(pPar->begin(), pPar->end(), DDIExecParam::IsFunction); MFX_CHECK(itCreateConfig != pPar->end(), MFX_ERR_UNDEFINED_BEHAVIOR); auto itCreateContext = std::find_if(pPar->begin(), pPar->end(), DDIExecParam::IsFunction); MFX_CHECK(itCreateContext != pPar->end(), MFX_ERR_UNDEFINED_BEHAVIOR); mfxI32 numEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(numEntrypoints, MFX_ERR_DEVICE_FAILED); std::vector ep_list(numEntrypoints); std::vector profile_list(vaMaxNumProfiles(m_vaDisplay), VAProfileNone); mfxI32 num_profiles = 0; mfxStatus sts = MFX_ERR_NONE; sts = Execute( VAFID_QueryConfigProfiles , m_vaDisplay , profile_list.data() , &num_profiles); MFX_CHECK_STS(sts); MFX_CHECK(std::find(profile_list.begin(), profile_list.end(), m_profile) != profile_list.end(), MFX_ERR_DEVICE_FAILED); sts = Execute( VAFID_QueryConfigEntrypoints , m_vaDisplay , m_profile , ep_list.data() , &numEntrypoints); MFX_CHECK_STS(sts); MFX_CHECK(std::find(ep_list.begin(), ep_list.end(), m_entrypoint) != ep_list.end(), MFX_ERR_DEVICE_FAILED); auto& cfgPar = GetArgs(itCreateConfig->In, vaCreateConfig); std::get<0>(cfgPar) = m_vaDisplay; std::get<1>(cfgPar) = m_profile; std::get<2>(cfgPar) = m_entrypoint; std::get<5>(cfgPar) = &m_vaConfig; sts = Execute(*itCreateConfig); MFX_CHECK_STS(sts); auto& ctxPar = GetArgs(itCreateContext->In, vaCreateContext); std::get<0>(ctxPar) = m_vaDisplay; std::get<1>(ctxPar) = m_vaConfig; std::get<7>(ctxPar) = &m_vaContextEncode; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateContext"); sts = Execute(*itCreateContext); } MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus DeviceVAAPI::Execute(const DDIExecParam& ep) { bool bUnsupported = false; m_lastErr = m_ddiExec.at(VAFID(ep.Function))(ep); bUnsupported |= ep.Function == VAFID_CreateContext && (VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED == m_lastErr); bUnsupported |= ep.Function == VAFID_GetConfigAttributes && (VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT == m_lastErr); bUnsupported |= ep.Function == VAFID_GetConfigAttributes && (VA_STATUS_ERROR_UNSUPPORTED_PROFILE == m_lastErr); MFX_CHECK(!bUnsupported, MFX_ERR_UNSUPPORTED); MFX_CHECK(VA_STATUS_SUCCESS == m_lastErr, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus DeviceVAAPI::BeginPicture(mfxHDL hdl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); return Execute(VAFID_BeginPicture , m_vaDisplay , m_vaContextEncode , *(VASurfaceID*)hdl); } mfxStatus DeviceVAAPI::EndPicture() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); return Execute(VAFID_EndPicture , m_vaDisplay , m_vaContextEncode); } VABufferID DeviceVAAPI::CreateVABuffer(const DDIExecParam& ep) { MFX_CHECK(IsValid(), MFX_ERR_NOT_INITIALIZED); VABufferID id = VA_INVALID_ID; VABufferType type = VABufferType(ep.Function); mfxStatus sts; if (type != VAEncMiscParameterBufferType) { sts = Execute( VAFID_CreateBuffer , m_vaDisplay , m_vaContextEncode , type , ep.In.Size , std::max(ep.In.Num, 1) , ep.In.pData , &id); MFX_CHECK(!sts, VA_INVALID_ID); m_vaBuffers.insert(id); return id; } sts = Execute( VAFID_CreateBuffer , m_vaDisplay , m_vaContextEncode , VAEncMiscParameterBufferType , ep.In.Size , 1 , nullptr , &id); MFX_CHECK(!sts, VA_INVALID_ID); VAEncMiscParameterBuffer *pMP; sts = Execute( VAFID_MapBuffer , m_vaDisplay , id , (void **)&pMP); MFX_CHECK(!sts, VA_INVALID_ID); pMP->type = ((VAEncMiscParameterBuffer*)ep.In.pData)->type; mfxU8* pDst = (mfxU8*)pMP->data; mfxU8* pSrc = (mfxU8*)ep.In.pData + sizeof(VAEncMiscParameterBuffer); std::copy(pSrc, pSrc + ep.In.Size - sizeof(VAEncMiscParameterBuffer), pDst); sts = Execute( VAFID_UnmapBuffer , m_vaDisplay , id); MFX_CHECK(!sts, VA_INVALID_ID); m_vaBuffers.insert(id); return id; } mfxStatus DeviceVAAPI::DestroyVABuffer(VABufferID id) { m_vaBuffers.erase(id); return Execute(VAFID_DestroyBuffer, m_vaDisplay, id); } VASurfaceID DeviceVAAPI::GetVASurface(mfxMemId mid) { MFX_CHECK(IsValid(), VA_INVALID_SURFACE); VASurfaceID *pSurface = nullptr; mfxStatus sts = m_pCore->GetFrameHDL(mid, (mfxHDL*)&pSurface); MFX_CHECK(!sts && pSurface, VA_INVALID_SURFACE); return *pSurface; } mfxStatus DeviceVAAPI::Init( int width , int height , int flag , mfxFrameAllocResponse recResponse , VAConfigAttrib* pAttr , int nAttr , std::list* pPar) { std::vector rec(recResponse.NumFrameActual, VA_INVALID_SURFACE); std::list xPar; mfx::TupleArgs::type argsCfg; mfx::TupleArgs::type argsCtx; if (!pPar) pPar = &xPar; bool bNeedCreateConfig = pPar->end() == std::find_if(pPar->begin(), pPar->end(), DDIExecParam::IsFunction); bool bNeedCreateContext = pPar->end() == std::find_if(pPar->begin(), pPar->end(), DDIExecParam::IsFunction); if (bNeedCreateConfig) { std::get<3>(argsCfg) = pAttr; std::get<4>(argsCfg) = nAttr; DDIExecParam xPar; xPar.Function = VAFID_CreateConfig; xPar.In.pData = &argsCfg; xPar.In.Size = sizeof(argsCfg); pPar->push_back(xPar); } if (bNeedCreateContext) { std::transform( recResponse.mids , recResponse.mids + recResponse.NumFrameActual , rec.begin() , [this](mfxMemId mid) { return GetVASurface(mid); }); MFX_CHECK(std::find(rec.begin(), rec.end(), VA_INVALID_SURFACE) == rec.end(), MFX_ERR_DEVICE_FAILED); std::get<2>(argsCtx) = width; std::get<3>(argsCtx) = height; std::get<4>(argsCtx) = flag; std::get<5>(argsCtx) = rec.data(); std::get<6>(argsCtx) = (int)rec.size(); DDIExecParam xPar; xPar.Function = VAFID_CreateContext; xPar.In.pData = &argsCtx; xPar.In.Size = sizeof(argsCtx); pPar->push_back(xPar); } return Init(pPar); } mfxStatus DeviceVAAPI::QueryStatus(DDIFeedback& ddiFB, mfxU32 id) { MFX_CHECK(!ddiFB.Get(id), MFX_ERR_NONE); auto itMB = std::find_if(ddiFB.ExecParam.begin(), ddiFB.ExecParam.end(), DDIExecParam::IsFunction); MFX_CHECK(itMB != ddiFB.ExecParam.end(), MFX_ERR_UNDEFINED_BEHAVIOR); auto& mbPar = GetArgs(itMB->In, vaMapBuffer); // Synchronization using vaSyncBuffer is temporarily disabled auto itSS = std::find_if(ddiFB.ExecParam.begin(), ddiFB.ExecParam.end(), DDIExecParam::IsFunction); MFX_CHECK(itSS != ddiFB.ExecParam.end(), MFX_ERR_UNDEFINED_BEHAVIOR); auto& ssPar = GetArgs(itSS->In, vaSyncSurface); auto sts = SyncSurface(std::get<1>(ssPar)); MFX_CHECK_STS(sts); VACodedBufferSegment* pCBS = nullptr; sts = MapBuffer(std::get<1>(mbPar), (void **)&pCBS); MFX_CHECK_STS(sts); MFX_CHECK(pCBS, MFX_ERR_DEVICE_FAILED); itMB->Out.Cast() = *pCBS; sts = UnmapBuffer(std::get<1>(mbPar)); MFX_CHECK_STS(sts); ddiFB.bNotReady = false; return ddiFB.Update(id); } } //namespace MfxEncodeHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_device_vaapi.h000066400000000000000000000165741443134507600312260ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "ehw_device.h" #include "va/va.h" #include #include #include #include #include namespace MfxEncodeHW { class DeviceVAAPI : public Device { public: ~DeviceVAAPI() { Destroy(); } union TVAGUID { GUID guid; struct VA { VAProfile profile; VAEntrypoint entrypoint; } va; }; mfxStatus Create(VideoCORE& core, VAProfile profile, VAEntrypoint entrypoint) { TVAGUID guid = {}; guid.va.profile = profile; guid.va.entrypoint = entrypoint; return Create(core, guid.guid, 0, 0, false); } mfxStatus Init( int width , int height , int flag , mfxFrameAllocResponse rec , VAConfigAttrib* pAttr , int nAttr , std::list* pPar = nullptr); virtual mfxStatus Create( VideoCORE& core , GUID guid , mfxU32 width , mfxU32 height , bool isTemporal) override; virtual bool IsValid() const override { return m_pCore && m_vaDisplay; } virtual mfxStatus QueryCaps(void* pCaps /*VAConfigAttrib*/, mfxU32 size) override; virtual mfxStatus QueryDdiVersion(mfxU32 codecId) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus QueryCompBufferInfo(mfxU32, mfxFrameInfo&) override; virtual mfxStatus Init(const std::list*) override; virtual mfxStatus Execute(const DDIExecParam&) override; virtual mfxStatus QueryStatus(DDIFeedback& fb, mfxU32 id) override; virtual mfxStatus BeginPicture(mfxHDL) override; virtual mfxStatus EndPicture() override; virtual mfxU32 GetLastErr() const override { return mfxU32(m_lastErr); } VABufferID CreateVABuffer(const DDIExecParam&); mfxStatus DestroyVABuffer(VABufferID); VASurfaceID GetVASurface(mfxMemId); void Destroy(); enum VAFID { VAFID_CreateConfig = 1 , VAFID_DestroyConfig , VAFID_CreateContext , VAFID_DestroyContext , VAFID_GetConfigAttributes , VAFID_QueryConfigEntrypoints , VAFID_QueryConfigProfiles , VAFID_CreateBuffer , VAFID_MapBuffer , VAFID_UnmapBuffer , VAFID_DestroyBuffer , VAFID_BeginPicture , VAFID_RenderPicture , VAFID_EndPicture , VAFID_SyncSurface #if VA_CHECK_VERSION(1,9,0) , VAFID_SyncBuffer #endif }; using TDdiExec = std::function; using TDdiExecMfx = std::function; template static inline std::tuple& GetArgs(const DDIExecParam::Param& par, TRes(*)(TArgs...)) { return par.Cast>(); } template static TDdiExec CallDefault(TFn fn) { using TArgs = typename mfx::TupleArgs::type; return [fn](const DDIExecParam& par) { return mfx::apply(fn, par.In.Cast()); }; } template static mfxStatus CallVA(TDdiExecMfx& fn, VAFID id, TArgs... args) { auto tpl = std::make_tuple(args...); DDIExecParam xPar; xPar.Function = mfxU32(id); xPar.In.pData = &tpl; xPar.In.Size = sizeof(tpl); return fn(xPar); } template mfxStatus Execute(VAFID id, TArgs... args) { return CallVA(m_callVa, id, args...); } mfxStatus RenderPicture(VABufferID* pBuf, int num) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture"); return Execute(VAFID_RenderPicture, m_vaDisplay, m_vaContextEncode, pBuf, num); } mfxStatus SyncSurface(VASurfaceID target) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncSurface"); return Execute(VAFID_SyncSurface, m_vaDisplay, target); } #if VA_CHECK_VERSION(1,9,0) mfxStatus SyncBuffer(VABufferID id, uint64_t timeout_ns) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncBuffer"); return Execute(VAFID_SyncBuffer, m_vaDisplay, id, timeout_ns); } #endif mfxStatus MapBuffer(VABufferID id, void** pBuf) { return Execute(VAFID_MapBuffer, m_vaDisplay, id, pBuf); } mfxStatus UnmapBuffer(VABufferID id) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); return Execute(VAFID_UnmapBuffer, m_vaDisplay, id); } protected: TDdiExecMfx m_callVa; VAStatus m_lastErr = VA_STATUS_SUCCESS; VideoCORE* m_pCore = nullptr; VAProfile m_profile = VAProfileNone; VAEntrypoint m_entrypoint = VAEntrypointEncSlice; VADisplay m_vaDisplay = nullptr; VAContextID m_vaContextEncode = VA_INVALID_ID; VAConfigID m_vaConfig = VA_INVALID_ID; std::map m_ddiExec = { {VAFID_CreateConfig, CallDefault(&vaCreateConfig)} , {VAFID_DestroyConfig, CallDefault(&vaDestroyConfig)} , {VAFID_CreateContext, CallDefault(&vaCreateContext)} , {VAFID_DestroyContext, CallDefault(&vaDestroyContext)} , {VAFID_GetConfigAttributes, CallDefault(&vaGetConfigAttributes)} , {VAFID_QueryConfigEntrypoints, CallDefault(&vaQueryConfigEntrypoints)} , {VAFID_QueryConfigProfiles, CallDefault(&vaQueryConfigProfiles)} , {VAFID_CreateBuffer, CallDefault(&vaCreateBuffer)} , {VAFID_MapBuffer, CallDefault(&vaMapBuffer)} , {VAFID_UnmapBuffer, CallDefault(&vaUnmapBuffer)} , {VAFID_DestroyBuffer, CallDefault(&vaDestroyBuffer)} , {VAFID_BeginPicture, CallDefault(&vaBeginPicture)} , {VAFID_RenderPicture, CallDefault(&vaRenderPicture)} , {VAFID_EndPicture, CallDefault(&vaEndPicture)} , {VAFID_SyncSurface, CallDefault(&vaSyncSurface)} #if VA_CHECK_VERSION(1,9,0) , {VAFID_SyncBuffer, CallDefault(&vaSyncBuffer)} #endif }; std::set m_vaBuffers; }; } //namespace MfxEncodeHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_resources_pool.cpp000066400000000000000000000070641443134507600321770ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "ehw_resources_pool.h" namespace MfxEncodeHW { ResPool::ResPool(VideoCORE& core) : m_core(core) { } ResPool::~ResPool() { Free(); } ResPool::Resource ResPool::Acquire() { Resource res; res.Idx = mfxU8(std::find(m_locked.begin(), m_locked.end(), 0u) - m_locked.begin()); if (res.Idx >= GetResponse().NumFrameActual) { res.Idx = IDX_INVALID; return res; } Lock(res.Idx); ClearFlag(res.Idx); res.Mid = GetResponse().mids[res.Idx]; return res; } void ResPool::Free() { if (m_response.mids) { m_response.NumFrameActual = m_numFrameActual; m_core.FreeFrames(&m_response); m_response.mids = 0; } } mfxStatus ResPool::Alloc( const mfxFrameAllocRequest& request , bool isCopyRequired) { auto req = request; req.NumFrameSuggested = req.NumFrameMin; mfxStatus sts = m_core.AllocFrames(&req, &m_response, isCopyRequired); MFX_CHECK_STS(sts); MFX_CHECK(m_response.NumFrameActual >= req.NumFrameMin, MFX_ERR_MEMORY_ALLOC); m_locked.resize(req.NumFrameMin, 0); std::fill(m_locked.begin(), m_locked.end(), 0); m_flag.resize(req.NumFrameMin, 0); std::fill(m_flag.begin(), m_flag.end(), 0); m_info = req.Info; m_numFrameActual = m_response.NumFrameActual; m_response.NumFrameActual = req.NumFrameMin; m_bExternal = false; m_bOpaque = false; return MFX_ERR_NONE; } mfxU32 ResPool::Lock(mfxU32 idx) { if (idx >= m_locked.size()) return 0; assert(m_locked[idx] < 0xffffffff); return ++m_locked[idx]; } void ResPool::ClearFlag(mfxU32 idx) { assert(idx < m_flag.size()); if (idx < m_flag.size()) { m_flag[idx] = 0; } } void ResPool::SetFlag(mfxU32 idx, mfxU32 flag) { assert(idx < m_flag.size()); if (idx < m_flag.size()) { m_flag[idx] |= flag; } } mfxU32 ResPool::GetFlag(mfxU32 idx) { assert(idx < m_flag.size()); if (idx < m_flag.size()) { return m_flag[idx]; } return 0; } void ResPool::UnlockAll() { std::fill(m_locked.begin(), m_locked.end(), 0); std::fill(m_flag.begin(), m_flag.end(), 0); } mfxU32 ResPool::Unlock(mfxU32 idx) { if (idx >= m_locked.size()) return mfxU32(-1); assert(m_locked[idx] > 0); return --m_locked[idx]; } mfxU32 ResPool::Locked(mfxU32 idx) const { return (idx < m_locked.size()) ? m_locked[idx] : 1; } } //namespace MfxEncodeHWoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_resources_pool.h000066400000000000000000000056031443134507600316410ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "libmfx_core_interface.h" #include "feature_blocks/mfx_feature_blocks_utils.h" #include namespace MfxEncodeHW { class ResPool : public MfxFeatureBlocks::Storable { public: static constexpr mfxU8 IDX_INVALID = 0xff; struct Resource { mfxU8 Idx = IDX_INVALID; mfxMemId Mid = nullptr; }; ResPool(VideoCORE& core); virtual ~ResPool(); virtual mfxStatus Alloc( const mfxFrameAllocRequest & req , bool isCopyRequired); virtual Resource Acquire(); virtual void Release(mfxU32 idx) { Unlock(idx); } mfxFrameAllocResponse GetResponse() const { return m_response; } mfxFrameInfo GetInfo() const { return m_info; } void ClearFlag(mfxU32 idx); void SetFlag(mfxU32 idx, mfxU32 flag); mfxU32 GetFlag(mfxU32 idx); void UnlockAll(); mfxU32 Lock(mfxU32 idx); mfxU32 Unlock(mfxU32 idx); mfxU32 Locked(mfxU32 idx) const; virtual void Free(); bool IsExternal() { return m_bExternal; }; protected: ResPool(ResPool const &) = delete; ResPool & operator =(ResPool const &) = delete; VideoCORE& m_core; std::vector m_responseQueue; std::vector m_mids; std::vector m_locked; std::vector m_flag; mfxFrameInfo m_info = {}; mfxFrameAllocResponse m_response = {}; bool m_bExternal = true; bool m_bOpaque = false; mfxU16 m_numFrameActual = 0; }; } //namespace MfxEncodeHWoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_task_manager.cpp000066400000000000000000000250331443134507600315640ustar00rootroot00000000000000// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "ehw_task_manager.h" #include using namespace std::chrono_literals; namespace MfxEncodeHW { mfxStatus TaskManager::ManagerInit() { mfxStatus sts = ManagerReset(GetNumTask()); MFX_CHECK_STS(sts); for (auto& task : m_stages[0]) { sts = RunQueueTaskAlloc(task); MFX_CHECK_STS(sts); } m_nPicBuffered = 0; m_bufferSize = GetBufferSize(); m_maxParallelSubmits = GetMaxParallelSubmits(); m_nTasksInExecution = 0; m_cachedBitstream = {}; m_outputReady = {}; return sts; } mfxStatus TaskManager::TaskNew( mfxEncodeCtrl* pCtrl , mfxFrameSurface1* pSurf , mfxBitstream& bs) { MFX_CHECK(pSurf || m_nPicBuffered, MFX_ERR_MORE_DATA); auto pBs = &bs; auto pTask = GetTask(Stage(S_NEW)); MFX_CHECK(pTask, MFX_WRN_DEVICE_BUSY); SetActiveTask(*pTask); bool bBufferPic = pSurf && m_nPicBuffered < m_bufferSize; if (bBufferPic) { pBs = nullptr; ++m_nPicBuffered; } m_nPicBuffered -= !pSurf && m_nPicBuffered; auto sts = RunQueueTaskInit(pCtrl, pSurf, pBs, *pTask); MoveTaskForward(Stage(S_NEW), FixedTask(*pTask)); MFX_CHECK(sts >= MFX_ERR_NONE, sts); MFX_CHECK(pBs, MFX_ERR_MORE_DATA_SUBMIT_TASK); return sts; } mfxStatus TaskManager::TaskPrepare(StorageW& /*task*/ ) { std::unique_lock closeGuard(m_closeMtx); MFX_CHECK(!m_nRecodeTasks, MFX_ERR_NONE); auto pTask = GetTask(Stage(S_PREPARE)); MFX_CHECK(pTask, MFX_ERR_NONE); MFX_CHECK(IsInputTask(*pTask), MFX_ERR_NONE);// leave fake task in "prepare" stage for now auto sts = RunQueueTaskPreReorder(*pTask); MFX_CHECK_STS(sts); auto pTaskToDo = MoveTaskForward(Stage(S_PREPARE), FixedTask(*pTask)); MFX_CHECK(&(StorageW&)*pTaskToDo == pTask, MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_ERR_NONE; } mfxStatus TaskManager::TaskReorder(StorageW& task) { std::unique_lock closeGuard(m_closeMtx); bool bNeedTask = !m_nRecodeTasks && (m_stages.at(NextStage(S_REORDER)).size() + m_nTasksInExecution) < m_maxParallelSubmits; MFX_CHECK(bNeedTask, MFX_ERR_NONE); auto IsInputTask = [this](StorageR& rTask) { return this->IsInputTask(rTask); }; StorageW* pTask = nullptr; bool bFlush = !IsInputTask(task) && !GetTask(Stage(S_PREPARE), SimpleCheck(IsInputTask)); TFnGetTask GetNextTask = [&](TTaskIt b, TTaskIt e) { return GetNextTaskToEncode(b, e, bFlush); }; if (IsReorderBypass()) { GetNextTask = FirstTask; } pTask = MoveTaskForward(Stage(S_REORDER), GetNextTask); MFX_CHECK(pTask, MFX_ERR_NONE); return RunQueueTaskPostReorder(*pTask); } mfxStatus TaskManager::TaskSubmit(StorageW& /*task*/) { std::unique_lock closeGuard(m_closeMtx); while (StorageW* pTask = GetTask(Stage(S_SUBMIT))) { bool bSync = (m_maxParallelSubmits <= m_nTasksInExecution) || (IsForceSync(*pTask) && GetTask(NextStage(S_SUBMIT))); MFX_CHECK(!bSync, MFX_ERR_NONE); auto sts = RunQueueTaskSubmit(*pTask); MFX_CHECK_STS(sts); MoveTaskForward(Stage(S_SUBMIT), FixedTask(*pTask)); SetCached(*pTask, false); ++m_nTasksInExecution; m_nRecodeTasks -= !!m_nRecodeTasks; } return MFX_ERR_NONE; } mfxStatus TaskManager::TaskQuery(StorageW& inTask) { std::unique_lock closeGuard(m_closeMtx); auto pBs = GetBS(inTask); MFX_CHECK(pBs, MFX_ERR_NONE); if (m_bPostponeQuery) // wait for the subsequent task to restore parallel submission { m_bPostponeQuery = false; return MFX_ERR_NONE; } StorageRW* pTask = nullptr; StorageRW* pPrevRecode = nullptr; bool bCallAgain = false; bool bWaitForCache = false; TFnGetTask GetDestForWait = [&](TTaskIt b, TTaskIt e) { return GetDestToPushQuery(b, e, *pTask); }; mfxStatus NoTaskErr[2] = { MFX_ERR_UNDEFINED_BEHAVIOR, MFX_TASK_BUSY }; auto NeedRecode = [&](mfxStatus sts) { bCallAgain = (pPrevRecode && sts == MFX_TASK_BUSY); if (bCallAgain) { std::this_thread::sleep_for(1ms); return true; } if (sts == MFX_TASK_WORKING) { bWaitForCache = true; return false; } ThrowIf(!!sts, sts); return (GetRecode(*pTask) && GetBsDataLength(*pTask)); }; auto NextToPrevRecode = [&](TTaskIt begin, TTaskIt end) { auto it = FixedTask(*pPrevRecode)(begin, end); return std::next(it, it != end); }; do { pTask = GetTask(Stage(S_QUERY)); MFX_CHECK(pTask, NoTaskErr[!!pPrevRecode]); if (pPrevRecode && IsCached(*pTask)) { StorageRW* pTaskFirst = pTask; while (true) { MoveTask(Stage(S_QUERY), Stage(S_QUERY), FixedTask(*pTask), EndTask); pTask = GetTask(Stage(S_QUERY)); MFX_CHECK(pTask, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(pTask != pTaskFirst, MFX_TASK_BUSY); if (!IsCached(*pTask)) break; } } auto& task = *pTask; bool bRecode = false; SetBS(task, pBs); SetRecode(task, !!pPrevRecode); SetBsDataLength(task, GetBsDataLength(task) * !pPrevRecode); //reset value from prev. recode if any do { bRecode = RunQueueTaskQuery(task, NeedRecode); } while (bCallAgain); AddNumRecode(task, bRecode && !pPrevRecode); if (!IsCached(task)) --m_nTasksInExecution; if (!!pPrevRecode) { ClearBRCUpdateFlag(task); pPrevRecode = MoveTask(Stage(S_QUERY), Stage(S_SUBMIT), FixedTask(*pTask), NextToPrevRecode); } if (bWaitForCache) { SetCached(task, true); MoveTask(Stage(S_QUERY), Stage(S_QUERY), FixedTask(*pTask), GetDestForWait); } if (bRecode && !pPrevRecode) { ClearBRCUpdateFlag(task); pPrevRecode = MoveTask(Stage(S_QUERY), Stage(S_SUBMIT), FixedTask(*pTask), FirstTask); } m_nRecodeTasks += bRecode; } while (pPrevRecode); ThrowIf(pPrevRecode, std::logic_error("For recode must exit by \"no task for query\" condition")); if (!GetFreed(*pTask)) { SetFreed(*pTask, true); auto sts = RunQueueTaskFree(*pTask); MFX_CHECK_STS(sts); } if (bWaitForCache) { return MFX_TASK_WORKING; } if (!IsInputTask(inTask)) { MoveTask(Stage(S_PREPARE), Stage(S_NEW), FixedTask(inTask)); //don't need fake task anymore } MoveTask(Stage(S_QUERY), Stage(S_NEW), FixedTask(*pTask)); if (m_nRecodeTasks) // when some task is left in submit stage w/o being moved to the next stage { m_bPostponeQuery = true; // repeat async cycle w/ same parameters except query stage to resubmit the task return MFX_TASK_WORKING; } return MFX_ERR_NONE; } void TaskManager::CancelTasks() { std::unique_lock closeGuard(m_closeMtx); auto stageIt = m_stages.begin(); while (++stageIt != m_stages.end()) { std::for_each(stageIt->begin(), stageIt->end() , [&](StorageRW& task) { RunQueueTaskFree(task); }); m_stages.front().splice(m_stages.front().end(), *stageIt); } m_nTasksInExecution = 0; m_nPicBuffered = 0; m_nRecodeTasks = 0; m_cachedBitstream = {}; m_outputReady = {}; } mfxStatus TaskManager::ManagerReset(mfxU32 numTask) { std::unique_lock lock(m_mtx); MFX_CHECK(m_cv.wait_for( lock , std::chrono::seconds(600) , [&] { return m_stages.back().empty(); }) , MFX_ERR_GPU_HANG); MFX_CHECK(numTask, MFX_ERR_NONE); for (size_t i = 1; i < m_stages.size(); ++i) m_stages.front().splice(m_stages.front().end(), m_stages[i]); m_stages.front().resize(numTask); return MFX_ERR_NONE; } StorageRW* TaskManager::MoveTask( mfxU16 from , mfxU16 to , TFnGetTask which , TFnGetTask where) { StorageRW* pTask = nullptr; bool bNotify = false; ThrowIf(from >= m_stages.size() || to >= m_stages.size(), std::out_of_range("Invalid task stage id")); { std::unique_lock lock(m_mtx); auto& src = m_stages[from]; auto& dst = m_stages[to]; if (!m_stages[from].empty()) { auto itWhich = which(src.begin(), src.end()); auto itWhere = where(dst.begin(), dst.end()); if (itWhich == src.end()) return nullptr; pTask = &*itWhich; dst.splice(itWhere, src, itWhich); bNotify = (to == 0 && m_stages.back().empty()); auto stage = GetStage(*pTask); stage |= (1 << from); stage &= ~(0xffffffff << to); SetStage(*pTask, stage); } } if (bNotify) m_cv.notify_one(); return pTask; } StorageRW* TaskManager::GetTask(mfxU16 stage, TFnGetTask which) { ThrowIf(stage >= m_stages.size(), std::out_of_range("Invalid task stage id")); { std::unique_lock lock(m_mtx); auto& src = m_stages[stage]; auto it = which(src.begin(), src.end()); if (it != src.end()) return &*it; } return nullptr; } } //namespace MfxEncodeHWoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_task_manager.h000066400000000000000000000222011443134507600312230ustar00rootroot00000000000000// Copyright (c) 2020-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include #include #include #include #include #include "feature_blocks/mfx_feature_blocks_utils.h" namespace MfxEncodeHW { class CachedBitstream { public: mfxU32 DisplayOrder = 0; mfxU32 BsDataLength = 0; std::shared_ptr> Data; bool isHiden = true; CachedBitstream(mfxU32 length, mfxU8* pData=nullptr) { Data = std::make_shared>(std::vector(length)); BsDataLength = length; if (pData != nullptr) { std::copy(pData, pData + length, Data->data()); } } }; using namespace MfxFeatureBlocks; class TaskManager { private: std::map> m_cachedBitstream = {}; std::map m_outputReady = {}; public: using TTaskList = std::list; using TTaskIt = TTaskList::iterator; using TFnGetTask = std::function; virtual ~TaskManager() {} virtual mfxU32 GetNumTask () const = 0; virtual mfxU16 GetBufferSize () const = 0; virtual mfxU16 GetMaxParallelSubmits() const = 0; virtual void SetActiveTask (StorageW& /*task*/) = 0; virtual bool IsInputTask (const StorageR& /*task*/) const = 0; virtual mfxU32 GetStage (const StorageR& /*task*/) const = 0; virtual void SetStage (StorageW& /*task*/, mfxU32) const = 0; virtual bool IsReorderBypass () const = 0; virtual TTaskIt GetNextTaskToEncode (TTaskIt /*begin*/, TTaskIt /*end*/, bool /*bFlush*/) = 0; virtual bool IsForceSync (const StorageR& /*task*/) const = 0; virtual mfxBitstream* GetBS (const StorageR& /*task*/) const = 0; virtual void SetBS (StorageW& /*task*/, mfxBitstream* /*pBS*/) const = 0; virtual bool GetRecode (const StorageR& /*task*/) const = 0; virtual void SetRecode (StorageW& /*task*/, bool) const = 0; virtual bool GetFreed (const StorageR& /*task*/) const = 0; virtual void SetFreed (StorageW& /*task*/, bool) const = 0; virtual mfxU32 GetBsDataLength (const StorageR& /*task*/) const = 0; virtual void SetBsDataLength (StorageW& /*task*/, mfxU32) const = 0; virtual void AddNumRecode (StorageW& /*task*/, mfxU16) const = 0; virtual TTaskIt GetDestToPushQuery(TTaskIt begin, TTaskIt /*end*/, StorageW& /*task*/) { return begin; } virtual bool IsCached(StorageW& /*task*/) const { return false; } virtual void SetCached(StorageW& /*task*/, bool) const { } virtual void ClearBRCUpdateFlag(StorageW& /*task*/) const { } virtual mfxStatus RunQueueTaskAlloc(StorageRW& /*task*/) = 0; virtual mfxStatus RunQueueTaskInit( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream* /*pBs*/ , StorageW& /*task*/) = 0; virtual mfxStatus RunQueueTaskPreReorder(StorageW& /*task*/) = 0; virtual mfxStatus RunQueueTaskPostReorder(StorageW& /*task*/) = 0; virtual mfxStatus RunQueueTaskSubmit(StorageW& /*task*/) = 0; virtual bool RunQueueTaskQuery( StorageW& /*task*/ , std::function /*stopAt*/) = 0; virtual mfxStatus RunQueueTaskFree(StorageW& /*task*/) = 0; virtual mfxStatus ManagerInit(); virtual mfxStatus TaskNew( mfxEncodeCtrl* /*pCtrl*/ , mfxFrameSurface1* /*pSurf*/ , mfxBitstream& /*bs*/); virtual mfxStatus TaskPrepare(StorageW& /*task*/); virtual mfxStatus TaskReorder(StorageW& /*task*/); virtual mfxStatus TaskSubmit(StorageW& /*task*/); virtual mfxStatus TaskQuery(StorageW& /*task*/); virtual void CancelTasks(); static constexpr mfxU16 S_NEW = 0; static constexpr mfxU16 S_PREPARE = 1; static constexpr mfxU16 S_REORDER = 2; static constexpr mfxU16 S_SUBMIT = 3; static constexpr mfxU16 S_QUERY = 4; std::map m_stageID = { {S_NEW, S_NEW} , {S_PREPARE, S_PREPARE} , {S_REORDER, S_REORDER} , {S_SUBMIT, S_SUBMIT} , {S_QUERY, S_QUERY} }; const mfxU16 max_num_of_stages = 7; // 5 "regular" (see above) + 2 added by EncTools (S_ET_SUBMIT, S_ET_QUERY) std::vector m_stages = std::vector(max_num_of_stages); mfxU16 m_nPicBuffered = 0; mfxU16 m_bufferSize = 0; mfxU16 m_maxParallelSubmits = 0; mfxU16 m_nTasksInExecution = 0; mfxU16 m_nRecodeTasks = 0; bool m_bPostponeQuery = false; std::mutex m_mtx, m_closeMtx; std::condition_variable m_cv; mfxU16 AddStage(mfxU16 stageBefore) { mfxU16 stageNew = mfxU16(m_stageID.size()); mfxU16 idx = m_stageID.at(stageBefore); auto UpdateStage = [idx](std::map::reference pair) { pair.second += (pair.second > idx); }; std::for_each(m_stageID.begin(), m_stageID.end(), UpdateStage); m_stageID[stageNew] = idx + 1; return stageNew; } static TTaskIt FirstTask (TTaskIt begin, TTaskIt) { return begin; } static TTaskIt EndTask (TTaskIt, TTaskIt end) { return end; } static TFnGetTask SimpleCheck (std::function cond) { using namespace std::placeholders; return std::bind(std::find_if>, _1, _2, cond); } static TFnGetTask FixedTask(const StorageR& task) { auto pTask = &task; return SimpleCheck([pTask](StorageR& b) { return &b == pTask; }); } mfxU16 Stage(mfxU16 s) { return m_stageID.at(s); } mfxU16 NextStage(mfxU16 s) { return Stage(s) + 1; } //blocking mfxStatus ManagerReset(mfxU32 numTask); //non-blocking StorageRW* MoveTask( mfxU16 from , mfxU16 to , TFnGetTask which = FirstTask , TFnGetTask where = EndTask); StorageRW* MoveTaskForward( mfxU16 from , TFnGetTask which = FirstTask , TFnGetTask where = EndTask) { return MoveTask(from, from + 1, which, where); } StorageRW* GetTask(mfxU16 stage, TFnGetTask which = FirstTask); bool IsCacheReady(mfxU32 order) { return m_outputReady[order]; } void PushBitstream(mfxU32 order, CachedBitstream&& bs) { assert(!m_outputReady[order]); m_cachedBitstream[order].push_back(bs); if (!bs.isHiden) m_outputReady[order] = true; } std::deque& GetBitstreams(mfxU32 order) { return m_cachedBitstream[order]; } void ClearBitstreams(mfxU32 order) { m_cachedBitstream.erase(order); m_outputReady.erase(order); } mfxU32 PeekCachedSize(mfxU32 order) const { auto it = m_cachedBitstream.find(order); if (it == m_cachedBitstream.end()) return 0; mfxU32 size = 0; for (const auto& bs : it->second) { size += bs.BsDataLength; } return size; } }; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_utils.h000066400000000000000000000162211443134507600277340ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" namespace MfxEncodeHW { namespace Utils { //using namespace MfxFeatureBlocks; using namespace mfx::options; using namespace mfx::options::frametype; template class NotNull { public: typedef typename std::remove_reference::type TBase; NotNull(T p = nullptr) : m_ptr(p) { } bool isNull() const { return m_ptr == nullptr; } T get() const { if (!m_ptr) throw std::logic_error("nullptr deref"); return m_ptr; } operator T() const { return get(); } T operator->() const { return get(); } TBase& operator*() const { return *get(); } private: T m_ptr = nullptr; }; template inline T& Deref(T* ptr) { return *((NotNull(ptr)).get()); } inline void ThrowAssert(bool bThrow, const char* msg) { if (bThrow) throw std::logic_error(msg); } template inline std::reverse_iterator RBegin(T(&arr)[N]) { return std::reverse_iterator(arr + N); } template inline typename std::reverse_iterator< typename std::conditional< std::is_const::value , typename T::const_iterator , typename T::iterator >::type > RBegin(T& container) { return container.rbegin(); } template inline std::reverse_iterator REnd(T (&arr)[N]) { return std::reverse_iterator(arr); } template inline typename std::reverse_iterator< typename std::conditional< std::is_const::value , typename T::const_iterator , typename T::iterator >::type > REnd(T& container) { return container.rend(); } template inline std::reverse_iterator MakeRIter(T i) { return std::reverse_iterator(i); } template inline void MoveIf(TIn& src, TOut& dst, TPred pred) { TIn newSrc; std::partition_copy( std::make_move_iterator(std::begin(src)) , std::make_move_iterator(std::end(src)) , std::back_inserter(dst) , std::back_inserter(newSrc) , pred); src = std::move(newSrc); } template inline mfxU32 CountTrailingZeroes(T x) { mfxU32 l = 0; if (!x) return sizeof(x) * 8; while (!((x >> l) & 1)) ++l; return l; } template struct DefaultFiller { static constexpr typename std::remove_reference::type Get() { return typename std::remove_reference::type(); } }; template struct DefaultFiller::type >::value >::type> { static constexpr typename std::remove_reference::type Get() { return typename std::remove_reference::type(-1); } }; template inline void Remove( A &_from , size_t _where , size_t _num = 1) { if (std::end(_from) < std::begin(_from) + _where + _num) throw std::out_of_range("Remove() target is out of array range"); auto it = std::copy(std::begin(_from) + _where + _num, std::end(_from), std::begin(_from) + _where); std::fill(it, std::end(_from), DefaultFiller::Get()); } template inline T RemoveIf( T _begin , T _end , Pr _pr) { _begin = std::remove_if(_begin, _end, _pr); std::fill(_begin, _end, DefaultFiller::Get()); return _begin; } template inline void Insert( A &_to , size_t _where , T const & _what) { if (std::begin(_to) + _where + 1 >= std::end(_to)) throw std::out_of_range("Insert() target is out of array range"); std::copy_backward(std::begin(_to) + _where, std::end(_to) - 1, std::end(_to)); _to[_where] = _what; } inline void UpdateMultiplier(mfxInfoMFX& mfx, mfxU16 MN) { auto& MO = mfx.BRCParamMultiplier; SetDefault(MO, 1); if (MO != MN) { mfx.BufferSizeInKB = (mfxU16)mfx::CeilDiv(mfx.BufferSizeInKB * MO, MN); if ( mfx.RateControlMethod == MFX_RATECONTROL_CBR || mfx.RateControlMethod == MFX_RATECONTROL_VBR || mfx.RateControlMethod == MFX_RATECONTROL_VCM || mfx.RateControlMethod == MFX_RATECONTROL_QVBR) { mfx.TargetKbps = (mfxU16)mfx::CeilDiv(mfx.TargetKbps * MO, MN); mfx.InitialDelayInKB = (mfxU16)mfx::CeilDiv(mfx.InitialDelayInKB * MO, MN); mfx.MaxKbps = (mfxU16)mfx::CeilDiv(mfx.MaxKbps * MO, MN); } MO = MN; } } template class BRCMultiplied { public: BRCMultiplied(mfxInfoMFX& par) : pMfx(&par) , pcMfx(&par) {} BRCMultiplied(const mfxInfoMFX& par) : pMfx(nullptr) , pcMfx(&par) {} operator mfxU32 () const { return CV() * std::max(1, pcMfx->BRCParamMultiplier); } mfxU32 operator= (mfxU32 x) { if (pMfx) { mfxU16 MN = std::max(1, pcMfx->BRCParamMultiplier); while (mfx::CeilDiv(x, MN) >= (1 << 16)) MN++; UpdateMultiplier(*pMfx, MN); V() = (mfxU16)mfx::CeilDiv(x, MN); } return *this; } BRCMultiplied& operator= (const BRCMultiplied& other) { *this = (mfxU32)other; return *this; } private: mfxInfoMFX* pMfx; const mfxInfoMFX* pcMfx; inline mfxU16& V() { return *(mfxU16*)((mfxU8*)pMfx + offset); } inline mfxU16 CV() const { return *(const mfxU16*)((const mfxU8*)pcMfx + offset); } }; typedef BRCMultiplied InitialDelayInKB; typedef BRCMultiplied BufferSizeInKB; typedef BRCMultiplied TargetKbps; typedef BRCMultiplied MaxKbps; template inline bool Res2Bool(T& res2store, T res) { res2store = res; return !!res; } }//namespace Utils }//namespace MfxEncodeHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_utils_vaapi.cpp000066400000000000000000000126571443134507600314600ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "ehw_utils_vaapi.h" #include "ehw_device_vaapi.h" namespace MfxEncodeHW { DDIExecParam VAAPIParPacker::PackVaMiscPar(std::vector& data) { DDIExecParam par; par.Function = VAEncMiscParameterBufferType; par.In.pData = data.data(); par.In.Size = (mfxU32)data.size(); par.In.Num = 1; return par; } void VAAPIParPacker::PackResources(DDIExecParam::Param& par, mfxU32 type) { auto& res = m_resources.at(type); par.pData = res.data(); par.Size = sizeof(VAGenericID); par.Num = mfxU32(res.size()); } mfxStatus VAAPIParPacker::Register( VideoCORE& core , const mfxFrameAllocResponse& response , mfxU32 type) { auto MidToVA = [&](mfxMemId mid) -> VASurfaceID { VASurfaceID *pSurface = nullptr; auto sts = core.GetFrameHDL(mid, (mfxHDL*)&pSurface); MFX_CHECK(!sts, VA_INVALID_SURFACE); return *pSurface; }; auto& res = m_resources[type]; res.resize(response.NumFrameActual); std::transform(response.mids, response.mids + response.NumFrameActual, res.begin(), MidToVA); bool bFailed = std::find(res.begin(), res.end(), VA_INVALID_SURFACE) != res.end(); MFX_CHECK(!bFailed, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus VAAPIParPacker::ReadFeedback(const VACodedBufferSegment& fb, mfxU32& bsSize) { MFX_CHECK(!(fb.status & VA_CODED_BUF_STATUS_BAD_BITSTREAM), MFX_ERR_GPU_HANG); MFX_CHECK(fb.buf && fb.size, MFX_ERR_DEVICE_FAILED); MFX_CHECK(m_maxBsSize >= fb.size, MFX_ERR_DEVICE_FAILED); bsSize = fb.size; return MFX_ERR_NONE; } void VAAPIParPacker::SetFeedback(mfxU32 fbId, VASurfaceID sId, VABufferID bsId) { auto& fb = m_feedback.at(FeedbackIDWrap(fbId)); fb.csb = {}; std::get<1>(fb.ssPar) = sId; std::get<1>(fb.mbPar) = bsId; } void VAAPIParPacker::GetFeedbackInterface(DDIFeedback& fb) { fb = DDIFeedback(); DDIExecParam xPar; xPar.Function = mfxU32(DeviceVAAPI::VAFID_SyncSurface); fb.ExecParam.push_back(xPar); auto pSS = &fb.ExecParam.back(); xPar.Function = mfxU32(DeviceVAAPI::VAFID_MapBuffer); xPar.Out.pData = &m_feedbackTmp.csb; xPar.Out.Size = sizeof(VACodedBufferSegment); xPar.Out.Num = 1; fb.ExecParam.push_back(xPar); auto pMB = &fb.ExecParam.back(); fb.Get.Push([this, pMB, pSS](DDIFeedback::TGet::TExt, mfxU32 id) -> const void* { if (!FeedbackReady(id)) { auto& currFB = m_feedback.at(FeedbackIDWrap(id)); pSS->In.pData = &currFB.ssPar; pSS->In.Size = sizeof(currFB.ssPar); pSS->In.Num = 1; pMB->In.pData = &currFB.mbPar; pMB->In.Size = sizeof(currFB.mbPar); pMB->In.Num = 1; return nullptr; } return &m_feedback.at(FeedbackIDWrap(id)).csb; }); fb.Update.Push([this](DDIFeedback::TUpdate::TExt, mfxU32 id) { MFX_CHECK(!FeedbackReady(id), MFX_ERR_UNDEFINED_BEHAVIOR); m_feedback.at(FeedbackIDWrap(id)).csb = m_feedbackTmp.csb; m_feedbackTmp.csb = {}; FeedbackReady(id) = true; return MFX_ERR_NONE; }); fb.Remove.Push([this](DDIFeedback::TUpdate::TExt, mfxU32 id) { FeedbackReady(id) = false; return MFX_ERR_NONE; }); } bool VAAPIParPacker::AddPackedHeaderIf( bool cond , const PackedData pd , std::list& par , uint32_t type) { if (!cond) return false; VAEncPackedHeaderParameterBuffer vaPh = {}; vaPh.type = type; vaPh.bit_length = pd.BitLen; vaPh.has_emulation_bytes = pd.bHasEP; m_vaPackedHeaders.push_back(vaPh); DDIExecParam xPar; xPar.Function = VAEncPackedHeaderParameterBufferType; xPar.In.pData = &m_vaPackedHeaders.back(); xPar.In.Size = sizeof(VAEncPackedHeaderParameterBuffer); xPar.In.Num = 1; par.push_back(xPar); xPar.Function = VAEncPackedHeaderDataBufferType; xPar.In.pData = pd.pData; xPar.In.Size = (pd.BitLen + 7) / 8; xPar.In.Num = 1; par.push_back(xPar); return true; } DDIExecParam VAAPIParPacker::PackVaBuffer(VABufferType type, void* pData, mfxU32 size, mfxU32 num) { DDIExecParam xPar; xPar.Function = type; xPar.In.pData = pData; xPar.In.Size = size; xPar.In.Num = num; return xPar; } } //namespace MfxEncodeHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/shared/ehw_utils_vaapi.h000066400000000000000000000072471443134507600311240ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "ehw_device.h" #include "va/va.h" #include #include namespace MfxEncodeHW { template T& AddVaMisc( VAEncMiscParameterType type , std::list>& buf) { const size_t szH = sizeof(VAEncMiscParameterBuffer); const size_t szB = sizeof(T); buf.push_back(std::vector(szH + szB, 0)); auto pMisc = (VAEncMiscParameterBuffer*)buf.back().data(); pMisc->type = type; return *(T*)(buf.back().data() + szH); } class VAAPIParPacker { public: enum eResId { RES_BS = 0 , RES_REF , NUM_RES }; static DDIExecParam PackVaMiscPar(std::vector& data); mfxStatus Register( VideoCORE& core , const mfxFrameAllocResponse& response , mfxU32 type); void PackResources(DDIExecParam::Param& par, mfxU32 type); void SetMaxBs(mfxU32 sizeInBytes) { m_maxBsSize = sizeInBytes; } void InitFeedback(mfxU16 cacheSize) { m_feedback.resize(cacheSize); } mfxStatus ReadFeedback(const VACodedBufferSegment& fb, mfxU32& bsSize); void GetFeedbackInterface(DDIFeedback& fb); bool AddPackedHeaderIf( bool cond , const PackedData pd , std::list& par , uint32_t type = VAEncPackedHeaderRawData); const std::vector& GetResources(mfxU32 type) { return m_resources.at(type); } static DDIExecParam PackVaBuffer(VABufferType type, void* pData, mfxU32 size, mfxU32 num = 1); template static DDIExecParam PackVaBuffer(VABufferType type, T& src) { return PackVaBuffer(type, &src, mfxU32(sizeof(T)), 1); } void SetFeedback(mfxU32 fbId, VASurfaceID sId, VABufferID bsId); protected: using TVaSS = mfx::TupleArgs::type; using TVaMB = mfx::TupleArgs::type; struct Feedback { TVaSS ssPar; TVaMB mbPar; VACodedBufferSegment csb = {}; }; mfxU32 m_maxBsSize = mfxU32(-1); std::map> m_resources; Feedback m_feedbackTmp; std::vector m_feedback; std::map m_fbReady; std::list m_vaPackedHeaders; mfxU32 FeedbackIDWrap(mfxU32 id) { return (id % m_feedback.size()); } bool& FeedbackReady(mfxU32 id) { return m_fbReady[FeedbackIDWrap(id)]; } }; } //namespace MfxEncodeHW oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/000077500000000000000000000000001443134507600250265ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/000077500000000000000000000000001443134507600264515ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_platform_defs.h000066400000000000000000000033371443134507600323270ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PLATFORM_DEFS_H__ #define __MFX_PLATFORM_DEFS_H__ static const GUID GUID_NULL = { 0x00000000, 0x0000, 0x0000,{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; typedef int D3DFORMAT; #ifndef D3DDDIFORMAT #define D3DDDIFORMAT D3DFORMAT #endif typedef int BOOL; typedef char CHAR; typedef unsigned char BYTE; typedef short SHORT; typedef int INT; typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned int UINT; typedef int LONG; typedef unsigned int ULONG; typedef unsigned int DWORD; #endif // __MFX_PLATFORM_DEFS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_vp9_encode_hw.h000066400000000000000000000160031443134507600322250ustar00rootroot00000000000000// Copyright (c) 2016-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include #include #include "mfxvideo.h" #include "mfxvideo++int.h" #include "mfx_utils.h" #include #include #include "mfx_vp9_encode_hw_utils.h" #include "mfx_vp9_encode_hw_ddi.h" namespace MfxHwVP9Encode { class MFXVideoENCODEVP9_HW : public VideoENCODE { public: MFXVideoENCODEVP9_HW(VideoCORE *core, mfxStatus *status) : m_bStartIVFSequence(false) , m_maxBsSize(0) , m_initialized(false) , m_frameArrivalOrder(0) , m_drainState(false) , m_resetBrc(false) , m_taskIdForDriver(0) , m_numBufferedFrames(0) , m_initWidth(0) , m_initHeight(0) , m_frameOrderInGop(0) , m_frameOrderInRefStructure(0) , m_bUseInternalMem(false) , m_isD3D9SimWithVideoMem(false) { m_prevSegment.Header.BufferId = MFX_EXTBUFF_VP9_SEGMENTATION; m_prevSegment.Header.BufferSz = sizeof(mfxExtVP9Segmentation); ZeroExtBuffer(m_prevSegment); Zero(m_prevFrameParam); if (core) m_pCore = core; if (status) *status = MFX_ERR_NONE; } virtual ~MFXVideoENCODEVP9_HW() { Close(); } static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryImplsDescription(VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah); virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(); virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) { return MFX_TASK_THREADING_INTRA; } virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus GetFrameParam(mfxFrameParam * /*par*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus GetEncodeStat(mfxEncodeStat * /*stat*/) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl * /*ctrl*/, mfxFrameSurface1 * /*surface*/, mfxBitstream * /*bs*/, mfxFrameSurface1 ** /*reordered_surface*/, mfxEncodeInternalParams * /*pInternalParams*/) { return MFX_ERR_NONE; } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 ** /*reordered_surface*/, mfxEncodeInternalParams * /*pInternalParams*/, MFX_ENTRY_POINT *pEntryPoint) { mfxThreadTask userParam; mfxStatus mfxRes = EncodeFrameSubmit(ctrl, surface, bs, &userParam); if (mfxRes >= MFX_ERR_NONE || mfxRes == MFX_ERR_MORE_DATA_SUBMIT_TASK) { pEntryPoint->pState = this; pEntryPoint->pRoutine = Execute; pEntryPoint->pCompleteProc = FreeResources; pEntryPoint->requiredNumThreads = 1; pEntryPoint->pParam = userParam; } return mfxRes; } virtual mfxStatus EncodeFrame(mfxEncodeCtrl * /*ctrl*/, mfxEncodeInternalParams * /*pInternalParams*/, mfxFrameSurface1 * /*surface*/, mfxBitstream * /*bs*/) { return MFX_ERR_NONE; } virtual mfxStatus CancelFrame(mfxEncodeCtrl * /*ctrl*/, mfxEncodeInternalParams * /*pInternalParams*/, mfxFrameSurface1 * /*surface*/, mfxBitstream * /*bs*/) { return MFX_ERR_NONE; } static mfxStatus Execute(void *pState, void *task, mfxU32 uid_p, mfxU32 uid_a) { if (pState) return ((MFXVideoENCODEVP9_HW*)pState)->Execute(task, uid_p, uid_a); else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } virtual mfxStatus Execute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); static mfxStatus FreeResources(void *pState, void *task, mfxStatus sts) { if (pState) return ((MFXVideoENCODEVP9_HW*)pState)->FreeResources(task, sts); else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } virtual mfxStatus FreeResources(mfxThreadTask task, mfxStatus sts); virtual mfxStatus EncodeFrameSubmit(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task); virtual mfxStatus ConfigTask(Task &task); virtual mfxStatus RemoveObsoleteParameters(); virtual mfxStatus UpdateBitstream(Task & task); bool isInitialized() { return m_initialized; } protected: VP9MfxVideoParam m_video; std::list m_videoForParamChange; // encoder keeps several versions of encoding parameters // to allow dynamic parameter change w/o drain of all buffered tasks. // Tasks submitted before the change reference to previous parameters version. std::unique_ptr m_ddi; UMC::Mutex m_taskMutex; bool m_bStartIVFSequence; mfxU64 m_maxBsSize; std::vector m_tasks; std::list m_free; std::list m_accepted; std::list m_submitted; std::queue m_outs; ExternalFrames m_rawFrames; InternalFrames m_opaqFrames; InternalFrames m_rawLocalFrames; InternalFrames m_reconFrames; InternalFrames m_outBitstreams; InternalFrames m_segmentMaps; std::vector m_dpb; VideoCORE *m_pCore; bool m_initialized; mfxU32 m_frameArrivalOrder; bool m_drainState; bool m_resetBrc; mfxU32 m_taskIdForDriver; // should be unique among all the frames submitted to driver mfxI32 m_numBufferedFrames; mfxU16 m_initWidth; mfxU16 m_initHeight; mfxU32 m_frameOrderInGop; mfxU32 m_frameOrderInRefStructure; // reset of ref structure happens at key-frames and after dynamic scaling mfxExtVP9Segmentation m_prevSegment; VP9FrameLevelParam m_prevFrameParam; bool m_bUseInternalMem; bool m_isD3D9SimWithVideoMem; }; } // MfxHwVP9EncodeoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_vp9_encode_hw_ddi.h000066400000000000000000000172741443134507600330600ustar00rootroot00000000000000// Copyright (c) 2016-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "mfx_h264_encode_struct_vaapi.h" #include "mfx_vp9_encode_hw_utils.h" #include "mfx_platform_defs.h" namespace MfxHwVP9Encode { static const GUID DXVA2_Intel_Encode_VP9_Profile0 = { 0x464bdb3c, 0x91c4, 0x4e9b, { 0x89, 0x6f, 0x22, 0x54, 0x96, 0xac, 0x4e, 0xd6 } }; static const GUID DXVA2_Intel_Encode_VP9_Profile1 = { 0xafe4285c, 0xab63, 0x4b2d, { 0x82, 0x78, 0xe6, 0xba, 0xac, 0xea, 0x2c, 0xe9 } }; static const GUID DXVA2_Intel_Encode_VP9_10bit_Profile2 = { 0x4c5ba10, 0x4e9a, 0x4b8e, { 0x8d, 0xbf, 0x4f, 0x4b, 0x48, 0xaf, 0xa2, 0x7c } }; static const GUID DXVA2_Intel_Encode_VP9_10bit_Profile3 = { 0x24d19fca, 0xc5a2, 0x4b8e, { 0x9f, 0x93, 0xf8, 0xf6, 0xef, 0x15, 0xc8, 0x90 } }; static const GUID DXVA2_Intel_LowpowerEncode_VP9_Profile0 = { 0x9b31316b, 0xf204, 0x455d, { 0x8a, 0x8c, 0x93, 0x45, 0xdc, 0xa7, 0x7c, 0x1 } }; static const GUID DXVA2_Intel_LowpowerEncode_VP9_Profile1 = { 0x277de9c5, 0xed83, 0x48dd, {0xab, 0x8f, 0xac, 0x2d, 0x24, 0xb2, 0x29, 0x43 } }; static const GUID DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile2 = { 0xacef8bc, 0x285f, 0x415d, {0xab, 0x22, 0x7b, 0xf2, 0x52, 0x7a, 0x3d, 0x2e } }; static const GUID DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile3 = { 0x353aca91, 0xd945, 0x4c13, {0xae, 0x7e, 0x46, 0x90, 0x60, 0xfa, 0xc8, 0xd8 } }; GUID GetGuid(VP9MfxVideoParam const & par); typedef struct tagENCODE_CAPS_VP9 { union { struct { UINT CodingLimitSet : 1; UINT Color420Only : 1; UINT ForcedSegmentationSupport : 1; UINT FrameLevelRateCtrl : 1; UINT BRCReset : 1; UINT AutoSegmentationSupport : 1; UINT TemporalLayerRateCtrl : 3; UINT DynamicScaling : 1; UINT TileSupport : 1; UINT NumScalablePipesMinus1 : 3; UINT YUV422ReconSupport : 1; UINT YUV444ReconSupport : 1; UINT MaxEncodedBitDepth : 2; UINT UserMaxFrameSizeSupport : 1; UINT SegmentFeatureSupport : 4; UINT DirtyRectSupport : 1; UINT MoveRectSupport : 1; UINT : 7; }; UINT CodingLimits; }; union { struct { UCHAR EncodeFunc : 1; // CHV+ UCHAR HybridPakFunc : 1; // HSW/BDW hybrid ENC & PAK UCHAR EncFunc : 1; // BYT enc only mode UCHAR: 5; }; UCHAR CodingFunction; }; UINT MaxPicWidth; UINT MaxPicHeight; USHORT MaxNumOfDirtyRect; USHORT MaxNumOfMoveRect; UINT MaxNum_Reference0; } ENCODE_CAPS_VP9; class DriverEncoder; mfxStatus QueryCaps(VideoCORE * pCore, ENCODE_CAPS_VP9 & caps, GUID guid, VP9MfxVideoParam const & par); DriverEncoder* CreatePlatformVp9Encoder(VideoCORE * pCore); class DriverEncoder { public: virtual ~DriverEncoder(){} virtual mfxStatus CreateAuxilliaryDevice( VideoCORE * pCore, GUID guid, VP9MfxVideoParam const & par) = 0; virtual mfxStatus CreateAccelerationService( VP9MfxVideoParam const & par) = 0; virtual mfxStatus Reset( VP9MfxVideoParam const & par) = 0; virtual mfxStatus Register( mfxFrameAllocResponse & response, D3DDDIFORMAT type) = 0; virtual mfxStatus Execute( Task const &task, mfxHDLPair pair) = 0; virtual mfxStatus QueryCompBufferInfo( D3DDDIFORMAT type, mfxFrameAllocRequest & request, mfxU32 frameWidth, mfxU32 frameHeight) = 0; virtual mfxStatus QueryEncodeCaps( ENCODE_CAPS_VP9 & caps) = 0; virtual mfxStatus QueryStatus( Task & task ) = 0; virtual mfxU32 GetReconSurfFourCC() = 0; virtual mfxStatus Destroy() = 0; }; #define VP9_MAX_UNCOMPRESSED_HEADER_SIZE 1000 #define SWITCHABLE 4 /* should be the last one */ enum { LAST_FRAME = 0, GOLDEN_FRAME = 1, ALTREF_FRAME = 2 }; struct BitOffsets { mfxU16 BitOffsetUncompressedHeader; mfxU16 BitOffsetForLFRefDelta; mfxU16 BitOffsetForLFModeDelta; mfxU16 BitOffsetForLFLevel; mfxU16 BitOffsetForQIndex; mfxU16 BitOffsetForFirstPartitionSize; mfxU16 BitOffsetForSegmentation; mfxU16 BitSizeForSegmentation; }; inline mfxStatus AddSeqHeader(mfxU32 width, mfxU32 height, mfxU32 FrameRateN, mfxU32 FrameRateD, mfxU32 numFramesInFile, mfxU8* pBitstream, mfxU32 bufferSize) { mfxU32 ivf_file_header[8] = { 0x46494B44, 0x00200000, 0x30395056, width + (height << 16), FrameRateN, FrameRateD, numFramesInFile, 0x00000000 }; if (bufferSize < sizeof(ivf_file_header)) MFX_RETURN(MFX_ERR_MORE_DATA); std::copy(std::begin(ivf_file_header),std::end(ivf_file_header), reinterpret_cast (pBitstream)); return MFX_ERR_NONE; }; inline mfxStatus AddPictureHeader(mfxU8* pBitstream, mfxU32 bufferSize) { mfxU32 number_of_zero_bytes = 3 * sizeof(mfxU32); if (bufferSize < number_of_zero_bytes) MFX_RETURN(MFX_ERR_MORE_DATA); std::fill_n(pBitstream, number_of_zero_bytes, mfxU8(0)); return MFX_ERR_NONE; }; inline ENCODE_PACKEDHEADER_DATA MakePackedByteBuffer(mfxU8 * data, mfxU32 size) { ENCODE_PACKEDHEADER_DATA desc = {}; desc.pData = data; desc.BufferSize = size; desc.DataLength = size; return desc; } struct BitBuffer { mfxU8 *pBuffer; mfxU16 bitOffset; }; mfxU16 WriteUncompressedHeader(BitBuffer &buffer, Task const &task, VP9SeqLevelParam const &seqPar, BitOffsets &offsets); mfxU16 PrepareFrameHeader(VP9MfxVideoParam const &par, mfxU8 *pBuf, mfxU32 bufferSizeBytes, Task const& task, VP9SeqLevelParam const &seqPar, BitOffsets &offsets); } // MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_vp9_encode_hw_par.h000066400000000000000000000045521443134507600330750ustar00rootroot00000000000000// Copyright (c) 2016-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "mfx_ext_buffers.h" #include "mfx_vp9_encode_hw_ddi.h" namespace MfxHwVP9Encode { mfxStatus CheckExtBufferHeaders(mfxU16 numExtParam, mfxExtBuffer** extParam, bool isRuntime = false); mfxStatus SetSupportedParameters(mfxVideoParam & par); mfxStatus CheckParameters(VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps); mfxStatus CheckParametersAndSetDefaults( VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps); mfxStatus SetDefaults( VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps); void InheritDefaults(VP9MfxVideoParam& defaultsDst, VP9MfxVideoParam const & defaultsSrc); mfxStatus CheckSurface(VP9MfxVideoParam const & video, mfxFrameSurface1 const & surface, mfxU32 initWidth, mfxU32 initHeight, ENCODE_CAPS_VP9 const &caps); mfxStatus CheckAndFixCtrl(VP9MfxVideoParam const & video, mfxEncodeCtrl & ctrl, ENCODE_CAPS_VP9 const & caps); mfxStatus CheckBitstream(VP9MfxVideoParam const & video, mfxBitstream * bs); void SetDefaultsForProfileAndFrameInfo(VP9MfxVideoParam& par); bool CheckAndFixQIndexDelta(mfxI16& qIndexDelta, mfxU16 qIndex); } // MfxHwVP9EncodeoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_vp9_encode_hw_utils.h000066400000000000000000000704061443134507600334540ustar00rootroot00000000000000// Copyright (c) 2016-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "mfx_ext_buffers.h" #include "mfx_trace.h" #include "umc_mutex.h" #include #include #include #include #include "mfxstructures.h" #include "mfx_enc_common.h" #include "assert.h" static inline bool operator==(mfxVP9SegmentParam const& l, mfxVP9SegmentParam const& r) { return MFX_EQ_FIELD(FeatureEnabled) && MFX_EQ_FIELD(QIndexDelta) && MFX_EQ_FIELD(LoopFilterLevelDelta) && MFX_EQ_FIELD(ReferenceFrame); } namespace MfxHwVP9Encode { #define DPB_SIZE 8 // DPB size by VP9 spec #define DPB_SIZE_REAL 3 // DPB size really used by encoder #define MAX_SEGMENTS 8 #define REF_FRAMES_LOG2 3 #define REF_FRAMES (1 << REF_FRAMES_LOG2) #define MAX_REF_LF_DELTAS 4 #define MAX_MODE_LF_DELTAS 2 #define SEG_LVL_MAX 4 #define IVF_SEQ_HEADER_SIZE_BYTES 32 #define IVF_PIC_HEADER_SIZE_BYTES 12 #define MAX_IVF_HEADER_SIZE IVF_SEQ_HEADER_SIZE_BYTES + IVF_PIC_HEADER_SIZE_BYTES #define MAX_Q_INDEX 255 #define MAX_ICQ_QUALITY_INDEX 255 #define MAX_LF_LEVEL 63 #define MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA 15 #define MAX_TASK_ID 0xffff #define MAX_NUM_TEMP_LAYERS 8 #define MAX_NUM_TEMP_LAYERS_SUPPORTED 4 #define MAX_UPSCALE_RATIO 16 #define MAX_DOWNSCALE_RATIO 2 #define MIN_TILE_HEIGHT 128 #define MIN_TILE_WIDTH 256 #define MAX_TILE_WIDTH 4096 #define MAX_NUM_TILE_ROWS_VP9 4 #define MAX_NUM_TILES 16 const mfxU16 segmentSkipMask = 0xf0; const mfxU16 segmentRefMask = 0x0f; enum { MFX_MEMTYPE_D3D_INT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME, MFX_MEMTYPE_D3D_EXT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME, MFX_MEMTYPE_SYS_EXT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME, MFX_MEMTYPE_SYS_INT = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_INTERNAL_FRAME }; static const mfxU16 MFX_IOPATTERN_IN_MASK_SYS_OR_D3D = MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_IN_VIDEO_MEMORY; static const mfxU16 MFX_IOPATTERN_IN_MASK = MFX_IOPATTERN_IN_MASK_SYS_OR_D3D; static const mfxU16 MFX_MEMTYPE_SYS_OR_D3D = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_SYSTEM_MEMORY; enum eTaskStatus { TASK_FREE = 0, TASK_INITIALIZED, TASK_SUBMITTED }; enum { REF_LAST = 0, REF_GOLD = 1, REF_ALT = 2, REF_TOTAL = 3 }; enum { KEY_FRAME = 0, INTER_FRAME = 1, NUM_FRAME_TYPES }; enum { UNKNOWN_COLOR_SPACE = 0, BT_601 = 1, BT_709 = 2, SMPTE_170 = 3, SMPTE_240 = 4, BT_2020 = 5, RESERVED = 6, SRGB = 7 }; enum { BITDEPTH_8 = 8, BITDEPTH_10 = 10, BITDEPTH_12 = 12 }; enum { PROFILE_0 = 0, PROFILE_1 = 1, PROFILE_2 = 2, PROFILE_3 = 3, MAX_PROFILES }; // Sequence level parameters should contain only parameters that will not change during encoding struct VP9SeqLevelParam { mfxU8 profile; mfxU8 bitDepth;; mfxU8 colorSpace; mfxU8 colorRange; mfxU8 subsamplingX; mfxU8 subsamplingY; mfxU8 frameParallelDecoding; }; enum { NO_SEGMENTATION = 0, APP_SEGMENTATION = 1, BRC_SEGMENTATION = 2 }; struct VP9FrameLevelParam { mfxU8 frameType; mfxU8 baseQIndex; mfxI8 qIndexDeltaLumaDC; mfxI8 qIndexDeltaChromaAC; mfxI8 qIndexDeltaChromaDC; mfxU32 width; mfxU32 height; mfxU32 renderWidth; mfxU32 renderHeight; mfxU8 refreshFrameContext; mfxU8 resetFrameContext; mfxU8 refList[REF_TOTAL]; // indexes of last, gold, alt refs for current frame mfxU8 refBiases[REF_TOTAL]; mfxU8 refreshRefFrames[DPB_SIZE]; // which reference frames are refreshed with current reconstructed frame mfxU16 modeInfoCols; mfxU16 modeInfoRows; mfxU8 allowHighPrecisionMV; mfxU8 showFrame; mfxU8 intraOnly; mfxU8 lfLevel; mfxI8 lfRefDelta[4]; mfxI8 lfModeDelta[2]; mfxU8 modeRefDeltaEnabled; mfxU8 modeRefDeltaUpdate; mfxU8 sharpness; mfxU8 segmentation; mfxU8 segmentationUpdateMap; mfxU8 segmentationUpdateData; mfxU8 segmentationTemporalUpdate; mfxU16 segmentIdBlockSize; mfxU8 errorResilentMode; mfxU8 interpFilter; mfxU8 frameContextIdx; mfxU8 log2TileCols; mfxU8 log2TileRows; mfxU16 temporalLayer; mfxU16 nextTemporalLayer; }; struct sFrameEx { mfxFrameSurface1 *pSurface; mfxU32 idInPool; mfxU32 frameOrder; mfxU8 refCount; }; inline mfxStatus LockSurface(sFrameEx* pFrame, VideoCORE* pCore) { return (pFrame) ? pCore->IncreaseReference(*pFrame->pSurface) : MFX_ERR_NONE; } inline mfxStatus FreeSurface(sFrameEx* &pFrame, VideoCORE* pCore) { mfxStatus sts = MFX_ERR_NONE; if (pFrame && pFrame->pSurface) { sts = pCore->DecreaseReference(*pFrame->pSurface); pFrame = 0; } return sts; } inline bool isFreeSurface (sFrameEx* pFrame) { return (pFrame->pSurface->Data.Locked == 0); } inline void IncreaseRef(sFrameEx* &pFrame) { pFrame->refCount++; } inline mfxStatus DecreaseRef(sFrameEx* &pFrame, VideoCORE* pCore) { if (pFrame->refCount) { pFrame->refCount--; if (pFrame->refCount == 0) { mfxStatus sts = FreeSurface(pFrame, pCore); MFX_CHECK_STS(sts); } } return MFX_ERR_NONE; } template inline void Zero(T & obj) { obj = T(); } template inline void Zero(T (&obj)[N]) { std::fill_n(obj, N, T()); } template inline void Zero(std::vector & vec) { vec.assign(vec.size(), T()); } template inline void ZeroExtBuffer(T & obj) { mfxExtBuffer header = obj.Header; obj = T(); obj.Header = header; } inline mfxU32 CeilDiv(mfxU32 x, mfxU32 y) { return (x + y - 1) / y; } inline mfxU32 CeilLog2(mfxU32 x) { mfxU32 l = 0; while (x > (1U << l)) l++; return l; } inline mfxU32 FloorLog2(mfxU32 x) { mfxU32 l = 0; while (x >= (1U << (l + 1))) l++; return l; } template struct ExtBufTypeToId {}; #define BIND_EXTBUF_TYPE_TO_ID(TYPE, ID) template<> struct ExtBufTypeToId { enum { id = ID }; } BIND_EXTBUF_TYPE_TO_ID (mfxExtVP9Param, MFX_EXTBUFF_VP9_PARAM); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOption2, MFX_EXTBUFF_CODING_OPTION2); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOption3, MFX_EXTBUFF_CODING_OPTION3); BIND_EXTBUF_TYPE_TO_ID (mfxExtCodingOptionDDI, MFX_EXTBUFF_DDI); BIND_EXTBUF_TYPE_TO_ID (mfxExtVP9Segmentation, MFX_EXTBUFF_VP9_SEGMENTATION); BIND_EXTBUF_TYPE_TO_ID (mfxExtVP9TemporalLayers, MFX_EXTBUFF_VP9_TEMPORAL_LAYERS); BIND_EXTBUF_TYPE_TO_ID (mfxExtAVCEncodedFrameInfo, MFX_EXTBUFF_ENCODED_FRAME_INFO); BIND_EXTBUF_TYPE_TO_ID (mfxExtAllocationHints, MFX_EXTBUFF_ALLOCATION_HINTS); #undef BIND_EXTBUF_TYPE_TO_ID template inline void InitExtBufHeader(T & extBuf) { Zero(extBuf); extBuf.Header.BufferId = ExtBufTypeToId::id; extBuf.Header.BufferSz = sizeof(T); } template struct GetPointedType {}; template struct GetPointedType { typedef T Type; }; template struct GetPointedType { typedef T Type; }; struct mfxExtBufferProxy { public: template operator T() { mfxExtBuffer * p = mfx::GetExtBuffer( m_extParam, m_numExtParam, ExtBufTypeToId::Type>::id); return reinterpret_cast(p); } template friend mfxExtBufferProxy GetExtBuffer(const T & par); protected: mfxExtBufferProxy(mfxExtBuffer ** extParam, mfxU32 numExtParam) : m_extParam(extParam) , m_numExtParam(numExtParam) { } private: mfxExtBuffer ** m_extParam; mfxU32 m_numExtParam; }; template mfxExtBufferProxy GetExtBuffer(T const & par) { return mfxExtBufferProxy(par.ExtParam, par.NumExtParam); } struct mfxExtBufferRefProxy{ public: template operator T&() { mfxExtBuffer * p = mfx::GetExtBuffer( m_extParam, m_numExtParam, ExtBufTypeToId::Type>::id); assert(p); return *(reinterpret_cast(p)); } template friend mfxExtBufferRefProxy GetExtBufferRef(const T & par); protected: mfxExtBufferRefProxy(mfxExtBuffer ** extParam, mfxU32 numExtParam) : m_extParam(extParam) , m_numExtParam(numExtParam) { } private: mfxExtBuffer ** m_extParam; mfxU32 m_numExtParam; }; template mfxExtBufferRefProxy GetExtBufferRef(T const & par) { return mfxExtBufferRefProxy(par.ExtParam, par.NumExtParam); } class VP9MfxVideoParam; struct ActualExtBufferExtractor { public: template operator T&() { mfxExtBuffer * p = mfx::GetExtBuffer( m_newParam, m_newNum, ExtBufTypeToId::Type>::id); if (p) { return *(reinterpret_cast(p)); } else { p = mfx::GetExtBuffer( m_basicParam, m_basicNum, ExtBufTypeToId::Type>::id); assert(p); return *(reinterpret_cast(p)); } } template friend ActualExtBufferExtractor GetActualExtBufferRef(const VP9MfxVideoParam & basicPar, const T & newPar); protected: ActualExtBufferExtractor(mfxExtBuffer ** basicParam, mfxU32 basicNum, mfxExtBuffer ** newParam, mfxU32 newNum) : m_basicParam(basicParam) , m_basicNum(basicNum) , m_newParam(newParam) , m_newNum(newNum) { } private: mfxExtBuffer ** m_basicParam; mfxU32 m_basicNum; mfxExtBuffer ** m_newParam; mfxU32 m_newNum; }; // remove first entry of extended buffer template mfxStatus RemoveExtBuffer(T & par, mfxU32 id) { if (par.ExtParam == 0) { return MFX_ERR_NONE; } for (mfxU16 i = 0; i < par.NumExtParam; i++) { mfxExtBuffer* pBuf = par.ExtParam[i]; MFX_CHECK_NULL_PTR1(pBuf); if (pBuf->BufferId == id) { for (mfxU16 j = i + 1; j < par.NumExtParam; j++) { par.ExtParam[j - 1] = par.ExtParam[j]; par.ExtParam[j] = 0; } par.NumExtParam--; break; } } return MFX_ERR_NONE; } class MfxFrameAllocResponse : public mfxFrameAllocResponse { public: MfxFrameAllocResponse(); MfxFrameAllocResponse(MfxFrameAllocResponse const &) = delete; MfxFrameAllocResponse & operator =(MfxFrameAllocResponse const &) = delete; ~MfxFrameAllocResponse(); mfxStatus Alloc( VideoCORE* pCore, mfxFrameAllocRequest & req, bool isCopyRequired); mfxStatus Release(); mfxFrameInfo m_info; private: VideoCORE* m_pCore; mfxU16 m_numFrameActualReturnedByAllocFrames; std::vector m_responseQueue; std::vector m_mids; }; struct FrameLocker { FrameLocker(VideoCORE * pCore, mfxFrameData & data) : m_core(pCore) , m_data(data) , m_memId(data.MemId) , m_status(Lock()) { } FrameLocker(VideoCORE * pCore, mfxFrameData & data, mfxMemId memId) : m_core(pCore) , m_data(data) , m_memId(memId) , m_status(Lock()) { } ~FrameLocker() { Unlock(); } mfxStatus Unlock() { mfxStatus mfxSts = MFX_ERR_NONE; mfxSts = m_core->UnlockFrame(m_memId, &m_data); m_status = LOCK_NO; return mfxSts; } protected: enum { LOCK_NO, LOCK_DONE }; mfxU32 Lock() { mfxU32 status = LOCK_NO; if (m_data.Y == 0 && MFX_ERR_NONE == m_core->LockFrame(m_memId, &m_data)) status = LOCK_DONE; return status; } private: FrameLocker(FrameLocker const &); FrameLocker & operator =(FrameLocker const &); VideoCORE * m_core; mfxFrameData & m_data; mfxMemId m_memId; mfxU32 m_status; }; struct TempLayerParam { mfxU16 Scale; mfxU32 targetKbps; }; #define NUM_OF_SUPPORTED_EXT_BUFFERS 8 // mfxExtVP9Param, mfxExtOpaqueSurfaceAlloc, mfxExtCodingOption2, mfxExtCodingOption3, mfxExtCodingOptionDDI, mfxExtVP9Segmentation, mfxExtVP9TemporalLayers, mfxExtAVCEncodedFrameInfo class VP9MfxVideoParam : public mfxVideoParam { public: VP9MfxVideoParam(); VP9MfxVideoParam(VP9MfxVideoParam const &); VP9MfxVideoParam(mfxVideoParam const &); VP9MfxVideoParam(mfxVideoParam const & par, eMFXHWType const & platform); VP9MfxVideoParam & operator = (VP9MfxVideoParam const &); VP9MfxVideoParam & operator = (mfxVideoParam const &); eMFXHWType m_platform; mfxU32 m_targetKbps; mfxU32 m_maxKbps; mfxU32 m_bufferSizeInKb; mfxU32 m_initialDelayInKb; TempLayerParam m_layerParam[MAX_NUM_TEMP_LAYERS]; bool m_segBufPassed; bool m_tempLayersBufPassed; bool m_webRTCMode; mfxU16 m_numLayers; void CalculateInternalParams(); void SyncInternalParamToExternal(); protected: void Construct(mfxVideoParam const & par); private: mfxExtBuffer * m_extParam[NUM_OF_SUPPORTED_EXT_BUFFERS]; mfxExtVP9Param m_extPar; mfxExtCodingOption2 m_extOpt2; mfxExtCodingOption3 m_extOpt3; mfxExtCodingOptionDDI m_extOptDDI; mfxExtVP9Segmentation m_extSeg; mfxExtVP9TemporalLayers m_extTempLayers; mfxExtAVCEncodedFrameInfo m_extFrameInfo; }; template ActualExtBufferExtractor GetActualExtBufferRef(VP9MfxVideoParam const & basicPar, T const & newPar) { return ActualExtBufferExtractor(basicPar.ExtParam, basicPar.NumExtParam, newPar.ExtParam, newPar.NumExtParam); } class Task; mfxStatus SetFramesParams(VP9MfxVideoParam const &par, Task const & task, mfxU8 frameType, VP9FrameLevelParam &frameParam, eMFXHWType platform); mfxStatus InitVp9SeqLevelParam(VP9MfxVideoParam const &video, VP9SeqLevelParam ¶m); mfxStatus DecideOnRefListAndDPBRefresh(VP9MfxVideoParam const & par, Task *pTask, std::vector& dpb, VP9FrameLevelParam &frameParam, mfxU32 prevFrameOrderInRefStructure); mfxStatus UpdateDpb(VP9FrameLevelParam &frameParam, sFrameEx *pRecFrame, std::vector&dpb, VideoCORE *pCore); class ExternalFrames { protected: std::list m_frames; public: ExternalFrames() {} void Init(mfxU32 numFrames); mfxStatus GetFrame(mfxFrameSurface1 *pInFrame, sFrameEx *&pOutFrame); }; class InternalFrames { protected: std::vector m_frames; MfxFrameAllocResponse m_response; std::vector m_surfaces; public: InternalFrames() {} mfxStatus Init(VideoCORE *pCore, mfxFrameAllocRequest *pAllocReq, bool isCopyRequired); sFrameEx * GetFreeFrame(); mfxStatus GetFrame(mfxU32 numFrame, sFrameEx * &Frame); mfxStatus Release(); inline mfxU16 Height() { return m_response.m_info.Height; } inline mfxU16 Width() { return m_response.m_info.Width; } inline mfxU32 Num() { return m_response.NumFrameActual; } inline MfxFrameAllocResponse& GetFrameAllocReponse() {return m_response;} }; inline mfxU32 CalcNumTasks(mfxVideoParam const & video) { return video.AsyncDepth; } inline mfxU32 CalcNumSurfRecon(mfxVideoParam const & video) { return video.mfx.NumRefFrame + CalcNumTasks(video); } inline mfxU32 CalcNumSurfRaw(mfxVideoParam const & video) { // number of input surfaces is same for VIDEO and SYSTEM memory // because so far encoder doesn't support LookAhead and B-frames return video.AsyncDepth + ((video.AsyncDepth > 1)? 1: 0); } class Task { public: sFrameEx* m_pRawFrame; sFrameEx* m_pRawLocalFrame; mfxBitstream* m_pBitsteam; VP9FrameLevelParam m_frameParam; sFrameEx* m_pRecFrame; sFrameEx* m_pRecRefFrames[3]; sFrameEx* m_pOutBs; sFrameEx* m_pSegmentMap; mfxU32 m_frameOrder; mfxU64 m_timeStamp; mfxU32 m_taskIdForDriver; mfxU32 m_frameOrderInGop; mfxU32 m_frameOrderInRefStructure; mfxEncodeCtrl m_ctrl; mfxU32 m_bsDataLength; VP9MfxVideoParam* m_pParam; bool m_insertIVFSeqHeader; bool m_resetBrc; mfxExtVP9Segmentation const * m_pPrevSegment; Task (): m_pRawFrame(NULL), m_pRawLocalFrame(NULL), m_pBitsteam(0), m_pRecFrame(NULL), m_pOutBs(NULL), m_pSegmentMap(NULL), m_frameOrder(0), m_timeStamp(0), m_taskIdForDriver(0), m_frameOrderInGop(0), m_frameOrderInRefStructure(0), m_bsDataLength(0), m_pParam(NULL), m_insertIVFSeqHeader(false), m_resetBrc(false), m_pPrevSegment(NULL) { Zero(m_pRecRefFrames); Zero(m_frameParam); Zero(m_ctrl); } ~Task() {}; }; inline mfxStatus FreeTask(VideoCORE *pCore, Task &task) { mfxStatus sts = FreeSurface(task.m_pRawFrame, pCore); MFX_CHECK_STS(sts); sts = FreeSurface(task.m_pRawLocalFrame, pCore); MFX_CHECK_STS(sts); sts = FreeSurface(task.m_pOutBs, pCore); MFX_CHECK_STS(sts); sts = FreeSurface(task.m_pSegmentMap, pCore); MFX_CHECK_STS(sts); sts = DecreaseRef(task.m_pRecFrame, pCore); MFX_CHECK_STS(sts); task.m_pRecFrame = 0; const VP9MfxVideoParam& curMfxPar = *task.m_pParam; if (curMfxPar.m_numLayers && task.m_frameParam.temporalLayer == curMfxPar.m_numLayers - 1 && curMfxPar.m_numLayers > curMfxPar.mfx.NumRefFrame) { // if last temporal layer is non-reference, need to free reconstructed surface right away. sts = FreeSurface(task.m_pRecFrame, pCore); MFX_CHECK_STS(sts); } task.m_pBitsteam = 0; Zero(task.m_frameParam); Zero(task.m_ctrl); return MFX_ERR_NONE; } inline bool IsBufferBasedBRC(mfxU16 brcMethod) { return brcMethod == MFX_RATECONTROL_CBR || brcMethod == MFX_RATECONTROL_VBR; } inline bool IsBitrateBasedBRC(mfxU16 brcMethod) { return IsBufferBasedBRC(brcMethod); } inline bool isBrcResetRequired(VP9MfxVideoParam const & parBefore, VP9MfxVideoParam const & parAfter) { mfxU16 brc = parAfter.mfx.RateControlMethod; if (false == IsBitrateBasedBRC(brc)) { return false; } double frameRateBefore = (double)parBefore.mfx.FrameInfo.FrameRateExtN / (double)parBefore.mfx.FrameInfo.FrameRateExtD; double frameRateAfter = (double)parAfter.mfx.FrameInfo.FrameRateExtN / (double)parAfter.mfx.FrameInfo.FrameRateExtD; mfxExtVP9Param const & extParBefore = GetExtBufferRef(parBefore); mfxExtVP9Param const & extParAfter = GetExtBufferRef(parAfter); if (parBefore.m_targetKbps != parAfter.m_targetKbps || ((brc == MFX_RATECONTROL_VBR) && (parBefore.m_maxKbps != parAfter.m_maxKbps)) || frameRateBefore != frameRateAfter || (IsBufferBasedBRC(brc) && (parBefore.m_bufferSizeInKb != parAfter.m_bufferSizeInKb)) || ((brc == MFX_RATECONTROL_ICQ) && (parBefore.mfx.ICQQuality != parAfter.mfx.ICQQuality)) || extParBefore.FrameWidth != extParAfter.FrameWidth || extParBefore.FrameHeight != extParAfter.FrameHeight) { return true; } else { return false; } } inline mfxU16 CalcTemporalLayerIndex(VP9MfxVideoParam const & par, mfxU32 frameOrder) { mfxU16 i = 0; mfxExtVP9TemporalLayers const & tl = GetExtBufferRef(par); if (par.m_numLayers > 0) { mfxU32 maxScale = tl.Layer[par.m_numLayers - 1].FrameRateScale; for (; i < par.m_numLayers; i++) if (frameOrder % (maxScale / tl.Layer[i].FrameRateScale) == 0) break; } return i; } // for TS-encoding: context refreshing should be disabled for the 1st frame in each layer // in case if this frame can appear next to the key-frame after layers extraction // this is demand by kernel processing logic inline bool IsNeedDisableRefreshForFrameTS(VP9MfxVideoParam const & par, mfxU32 frameOrderInGop) { if (par.m_numLayers > 1 && frameOrderInGop >= 2) { mfxExtVP9TemporalLayers const & tl = GetExtBufferRef(par); mfxU32 maxScale = tl.Layer[par.m_numLayers - 1].FrameRateScale; if (frameOrderInGop > maxScale) { // not applicable outside of the 1st GOP return false; } else if (frameOrderInGop == maxScale) { // the last affected frame is the first frame in the 2nd GOP return true; } else if (frameOrderInGop <= (maxScale / 2)) { // inside the first GOP affected all frames in the beginning of Layer-2 and Layer-3 // (Layer-0 and Layer-1 not affected) if (CalcTemporalLayerIndex(par, frameOrderInGop) < CalcTemporalLayerIndex(par, frameOrderInGop - 1)) { return true; } } } return false; } mfxStatus GetRealSurface( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task, mfxFrameSurface1 *& pSurface); mfxStatus GetInputSurface( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task, mfxFrameSurface1 *& pSurface); mfxStatus CopyRawSurfaceToVideoMemory( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task); /*mfxStatus ReleaseDpbFrames(VideoCORE* pCore, std::vector & dpb) { for (mfxU8 refIdx = 0; refIdx < dpb.size(); refIdx ++) { if (dpb[refIdx]) { dpb[refIdx]->refCount = 0; MFX_CHECK_STS(FreeSurface(dpb[refIdx], pCore)); } } return MFX_ERR_NONE; }*/ struct FindTaskByRawSurface { FindTaskByRawSurface(mfxFrameSurface1 * pSurf) : m_pSurface(pSurf) {} bool operator ()(Task const & task) { return task.m_pRawFrame->pSurface == m_pSurface; } mfxFrameSurface1* m_pSurface; }; struct FindTaskByMfxVideoParam { FindTaskByMfxVideoParam(mfxVideoParam* pPar) : m_pPar(pPar) {} bool operator ()(Task const & task) { return task.m_pParam == m_pPar; } mfxVideoParam* m_pPar; }; // full list of essential segmentation parametes is provided inline bool AllMandatorySegMapParams(mfxExtVP9Segmentation const & seg) { return seg.SegmentIdBlockSize && seg.NumSegmentIdAlloc && seg.SegmentId; } // at least one essential segmentation parameter is provided inline bool AnyMandatorySegMapParam(mfxExtVP9Segmentation const & seg) { return seg.SegmentIdBlockSize || seg.NumSegmentIdAlloc || seg.SegmentId; } inline mfxU16 MapIdToBlockSize(mfxU16 id) { return id; } inline bool CompareSegmentMaps(mfxExtVP9Segmentation const & first, mfxExtVP9Segmentation const & second) { if (!first.SegmentId || !second.SegmentId || first.SegmentIdBlockSize != second.SegmentIdBlockSize || !first.NumSegmentIdAlloc || !second.NumSegmentIdAlloc) return false; return std::equal(first.SegmentId, first.SegmentId + std::min(first.NumSegmentIdAlloc, second.NumSegmentIdAlloc), second.SegmentId); } inline bool CompareSegmentParams(mfxExtVP9Segmentation const & first, mfxExtVP9Segmentation const & second) { if (first.NumSegments != second.NumSegments) return false; return std::equal(first.Segment, first.Segment + first.NumSegments, second.Segment); } inline void CopySegmentationBuffer(mfxExtVP9Segmentation & dst, mfxExtVP9Segmentation const & src) { mfxU8* tmp = dst.SegmentId; ZeroExtBuffer(dst); dst = src; dst.SegmentId = tmp; if (dst.SegmentId && src.SegmentId && dst.NumSegmentIdAlloc) { std::copy(src.SegmentId, src.SegmentId + dst.NumSegmentIdAlloc, dst.SegmentId); } } inline void CombineInitAndRuntimeSegmentBuffers(mfxExtVP9Segmentation & runtime, mfxExtVP9Segmentation const & init) { if (runtime.SegmentId == 0 && init.SegmentId != 0) { runtime.SegmentId = init.SegmentId; runtime.SegmentIdBlockSize = init.SegmentIdBlockSize; runtime.NumSegmentIdAlloc = init.NumSegmentIdAlloc; } } enum { FEAT_QIDX = 0, FEAT_LF_LVL = 1, FEAT_REF = 2, FEAT_SKIP = 3 }; inline bool IsFeatureEnabled(mfxU16 features, mfxU8 feature) { return (features & (1 << feature)) != 0; } mfxStatus GetNativeHandleToRawSurface( VideoCORE & core, mfxFrameSurface1& surf, mfxHDLPair& handle, VP9MfxVideoParam const & video, bool isD3D9SimWithVideoMem); } // MfxHwVP9Encode template inline bool Clamp(T & opt, I min, I max) { if (opt < static_cast(min)) { opt = static_cast(min); return false; } if (opt > static_cast(max)) { opt = static_cast(max); return false; } return true; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/include/mfx_vp9_encode_hw_vaapi.h000066400000000000000000000125661443134507600334170ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_vp9_encode_hw_ddi.h" namespace MfxHwVP9Encode { #include #include enum { MFX_FOURCC_VP9_NV12 = MFX_MAKEFOURCC('V','P','8','N'), MFX_FOURCC_VP9_SEGMAP = MFX_MAKEFOURCC('V','P','8','S'), }; typedef struct { VASurfaceID surface; mfxU32 number; mfxU32 idxBs; } ExtVASurface; /* Convert MediaSDK into DDI */ void FillSpsBuffer(mfxVideoParam const & par, VAEncSequenceParameterBufferVP9 & sps); mfxStatus FillPpsBuffer(Task const & task, mfxVideoParam const & par, VAEncPictureParameterBufferVP9 & pps, std::vector const & reconQueue, BitOffsets const &offsets); class VAAPIEncoder : public DriverEncoder { public: VAAPIEncoder(); virtual ~VAAPIEncoder(); virtual mfxStatus CreateAuxilliaryDevice( VideoCORE* core, GUID guid, VP9MfxVideoParam const & par) override; virtual mfxStatus CreateAccelerationService( VP9MfxVideoParam const & par) override; virtual mfxStatus Reset( VP9MfxVideoParam const & par) override; // 2 -> 1 virtual mfxStatus Register( mfxFrameAllocResponse& response, D3DDDIFORMAT type) override; // (mfxExecuteBuffers& data) virtual mfxStatus Execute( Task const &task, mfxHDLPair pair) override; // recomendation from HW virtual mfxStatus QueryCompBufferInfo( D3DDDIFORMAT type, mfxFrameAllocRequest& request, mfxU32 frameWidth, mfxU32 frameHeight) override; virtual mfxStatus QueryEncodeCaps( ENCODE_CAPS_VP9& caps) override; virtual mfxStatus QueryPlatform( eMFXHWType& platform); virtual mfxStatus QueryStatus( Task & task) override; virtual mfxU32 GetReconSurfFourCC() override; virtual mfxStatus Destroy() override; VAAPIEncoder(const VAAPIEncoder&) = delete; VAAPIEncoder& operator=(const VAAPIEncoder&) = delete; private: VideoCORE* m_pmfxCore; VP9MfxVideoParam m_video; // encoder specific. can be encapsulated by auxDevice class VADisplay m_vaDisplay; VAContextID m_vaContextEncode; VAConfigID m_vaConfig; // encode params (extended structures) VAEncSequenceParameterBufferVP9 m_sps; VAEncPictureParameterBufferVP9 m_pps; VAEncMiscParameterTypeVP9PerSegmantParam m_segPar; VAEncMiscParameterRateControl m_vaBrcPar; VAEncMiscParameterFrameRate m_vaFrameRate; VP9SeqLevelParam m_seqParam; // encode buffer to send vaRender() VABufferID m_spsBufferId; VABufferID m_ppsBufferId; VABufferID m_segMapBufferId; VABufferID m_segParBufferId; VABufferID m_hrdBufferId; VABufferID m_qualityLevelBufferId; VABufferID m_packedHeaderParameterBufferId; VABufferID m_packedHeaderDataBufferId; // max number of temp layers is 8, but now supported only 4 VABufferID m_tempLayersBufferId; bool m_tempLayersParamsReset; std::vector m_frameRateBufferIds; // individual buffer for every temporal layer std::vector m_rateCtrlBufferIds; // individual buffer for every temporal layer std::vector m_feedbackCache; std::vector m_reconQueue; std::vector m_segMapQueue; std::vector m_bsQueue; std::vector m_frameHeaderBuf; static const mfxU32 MAX_CONFIG_BUFFERS_COUNT = 26; // sps, pps, bitstream, uncomp header, segment map, per-segment parameters, temp layers, frame rate(up to 8), rate ctrl(up to 8), hrd, quality level mfxU32 m_width; mfxU32 m_height; bool m_isBrcResetRequired; ENCODE_CAPS_VP9 m_caps; eMFXHWType m_platform; UMC::Mutex m_guard; }; } // MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/000077500000000000000000000000001443134507600256155ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/mfx_vp9_encode_hw.cpp000066400000000000000000001164631443134507600317370ustar00rootroot00000000000000// Copyright (c) 2016-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfxvideo++int.h" #include "mfx_vp9_encode_hw.h" #include "mfx_vp9_encode_hw_par.h" #include "mfx_vp9_encode_hw_ddi.h" #include "mfx_platform_caps.h" #include "umc_defs.h" #include "fast_copy.h" #include "libmfx_core.h" namespace MfxHwVP9Encode { bool CheckTriStateOption(mfxU16 & opt); void SetDefaultForLowpower(mfxU16 & lowpower) { CheckTriStateOption(lowpower); if (lowpower == MFX_CODINGOPTION_UNKNOWN) { lowpower = MFX_CODINGOPTION_ON; } } bool CheckFourcc(mfxU32 fourcc, ENCODE_CAPS_VP9 const& caps); mfxStatus MFXVideoENCODEVP9_HW::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { mfxVideoParam par = {}; eMFXHWType platform = core.GetHWType(); VP9MfxVideoParam tmp(par, platform); SetDefaultForLowpower(tmp.mfx.LowPower); const mfxU16 Profiles[] = { MFX_PROFILE_VP9_0 , MFX_PROFILE_VP9_1 , MFX_PROFILE_VP9_2 , MFX_PROFILE_VP9_3 }; const mfxU32 FourCC[] = { MFX_FOURCC_NV12 , MFX_FOURCC_YV12 , MFX_FOURCC_NV16 , MFX_FOURCC_YUY2 , MFX_FOURCC_RGB565 , MFX_FOURCC_RGBP , MFX_FOURCC_RGB4 , MFX_FOURCC_P010 , MFX_FOURCC_P016 , MFX_FOURCC_P210 , MFX_FOURCC_BGR4 , MFX_FOURCC_A2RGB10 , MFX_FOURCC_ARGB16 , MFX_FOURCC_ABGR16 , MFX_FOURCC_AYUV , MFX_FOURCC_AYUV_RGB4 , MFX_FOURCC_UYVY , MFX_FOURCC_Y210 , MFX_FOURCC_Y410 , MFX_FOURCC_Y216 , MFX_FOURCC_Y416 , MFX_FOURCC_NV21 , MFX_FOURCC_IYUV , MFX_FOURCC_I010 }; caps.CodecID = MFX_CODEC_VP9; caps.BiDirectionalPrediction = 0; caps.MaxcodecLevel = 0; for (mfxU16 profile : Profiles) { ENCODE_CAPS_VP9 hwCaps = {}; tmp.mfx.CodecProfile = profile; if (MFX_ERR_NONE != QueryCaps(&core, hwCaps, GetGuid(tmp), tmp)) continue; auto& profileCaps = ah.PushBack(caps.Profiles); profileCaps.Profile = profile; auto& memCaps = ah.PushBack(profileCaps.MemDesc); memCaps.MemHandleType = MFX_RESOURCE_SYSTEM_SURFACE; memCaps.Width = { 16, hwCaps.MaxPicWidth, 16 }; memCaps.Height = { 16, hwCaps.MaxPicHeight, 16 }; for (mfxU32 fcc : FourCC) { if (CheckFourcc(fcc, hwCaps)) { ah.PushBack(memCaps.ColorFormats) = fcc; ++memCaps.NumColorFormats; } } ah.PushBack(profileCaps.MemDesc); profileCaps.MemDesc[1] = profileCaps.MemDesc[0]; profileCaps.MemDesc[1].MemHandleType = core.GetVAType() == MFX_HW_VAAPI ? MFX_RESOURCE_VA_SURFACE : MFX_RESOURCE_DX11_TEXTURE; profileCaps.NumMemTypes = 2; ++caps.NumProfiles; } MFX_CHECK(caps.NumProfiles, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEVP9_HW::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXVideoENCODEVP9_HW::Query"); MFX_CHECK_NULL_PTR1(out); if (in == 0) { MFX_RETURN(SetSupportedParameters(*out)); } else { eMFXHWType platform = core->GetHWType(); // check attached buffers (all are supported by encoder, no duplications, etc.) mfxStatus sts = CheckExtBufferHeaders(in->NumExtParam, in->ExtParam); MFX_CHECK_STS(sts); sts = CheckExtBufferHeaders(out->NumExtParam, out->ExtParam); MFX_CHECK_STS(sts); VP9MfxVideoParam toValidate(*in, platform); SetDefaultsForProfileAndFrameInfo(toValidate); // get HW caps from driver ENCODE_CAPS_VP9 caps = {}; sts = QueryCaps(core, caps, GetGuid(toValidate), toValidate); MFX_CHECK(MFX_ERR_NONE == sts, MFX_ERR_UNSUPPORTED); toValidate = *in; // validate input parameters sts = CheckParameters(toValidate, caps); toValidate.SyncInternalParamToExternal(); // copy validated parameters to [out] out->mfx = toValidate.mfx; out->AsyncDepth = toValidate.AsyncDepth; out->IOPattern = toValidate.IOPattern; out->Protected = toValidate.Protected; // copy validated ext buffers if (in->ExtParam && out->ExtParam) { for (mfxU8 i = 0; i < in->NumExtParam; i++) { mfxExtBuffer *pInBuf = in->ExtParam[i]; if (pInBuf) { mfxExtBuffer *pOutBuf = GetExtendedBuffer(out->ExtParam, out->NumExtParam, pInBuf->BufferId); if (pOutBuf && (pOutBuf->BufferSz == pInBuf->BufferSz)) { mfxExtBuffer *pCorrectedBuf = GetExtendedBuffer(toValidate.ExtParam, toValidate.NumExtParam, pInBuf->BufferId); MFX_CHECK_NULL_PTR1(pCorrectedBuf); char* src = reinterpret_cast (pCorrectedBuf); char* dst = reinterpret_cast (pOutBuf); std::copy(src, src + pCorrectedBuf->BufferSz, dst); } else { // the buffer is present in [in] and absent in [out] // or buffer sizes are different in [in] and [out] MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } } } } MFX_RETURN(sts); } } mfxStatus MFXVideoENCODEVP9_HW::QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_CHECK_NULL_PTR2(par,request); mfxStatus sts = CheckExtBufferHeaders(par->NumExtParam, par->ExtParam); MFX_CHECK_STS(sts); eMFXHWType platform = core->GetHWType(); mfxU32 inPattern = par->IOPattern & MFX_IOPATTERN_IN_MASK; auto const supportedMemoryType = inPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || inPattern == MFX_IOPATTERN_IN_VIDEO_MEMORY; MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); VP9MfxVideoParam toValidate(*par, platform); SetDefaultsForProfileAndFrameInfo(toValidate); SetDefaultForLowpower(toValidate.mfx.LowPower); // get HW caps from driver ENCODE_CAPS_VP9 caps = {}; sts = QueryCaps(core, caps, GetGuid(toValidate), toValidate); MFX_CHECK(MFX_ERR_NONE == sts, MFX_ERR_UNSUPPORTED); // get validated and properly initialized set of parameters CheckParameters(toValidate, caps); SetDefaults(toValidate, caps); // fill mfxFrameAllocRequest switch (par->IOPattern) { case MFX_IOPATTERN_IN_SYSTEM_MEMORY: request->Type = MFX_MEMTYPE_SYS_EXT; break; case MFX_IOPATTERN_IN_VIDEO_MEMORY: request->Type = MFX_MEMTYPE_D3D_EXT; break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } request->NumFrameMin = (mfxU16)CalcNumSurfRaw(toValidate); request->NumFrameSuggested = request->NumFrameMin; request->Info = par->mfx.FrameInfo; return MFX_ERR_NONE; } void SetReconInfo(VP9MfxVideoParam const &par, mfxFrameInfo &fi) { mfxExtCodingOption3 opt3 = GetExtBufferRef(par); mfxU16 format = opt3.TargetChromaFormatPlus1 - 1; mfxU16 depth = opt3.TargetBitDepthLuma; fi.Width = mfx::align2_value(fi.Width, 8); fi.Height = mfx::align2_value(fi.Height, 8); if (format == MFX_CHROMAFORMAT_YUV444 && depth == BITDEPTH_10) { fi.FourCC = MFX_FOURCC_Y410; #ifndef LINUX /* Pitch = 4*W for Y410 format Pitch need to align on 256 So, width aligment is 256/4 = 64 */ fi.Width = (mfxU16)mfx::align2_value(fi.Width, 256 / 4); fi.Height = (mfxU16)mfx::align2_value(fi.Height * 3 / 2, 64); #endif } else if (format == MFX_CHROMAFORMAT_YUV444 && depth == BITDEPTH_8) { fi.FourCC = MFX_FOURCC_AYUV; #ifndef LINUX /* Pitch = 4*W for AYUV format Pitch need to align on 512 So, width aligment is 512/4 = 128 */ fi.Width = (mfxU16)mfx::align2_value(fi.Width, 512 / 4); fi.Height = (mfxU16)mfx::align2_value(fi.Height * 3 / 4, 64); #endif } else if (format == MFX_CHROMAFORMAT_YUV420 && depth == BITDEPTH_10) { #ifdef LINUX fi.FourCC = MFX_FOURCC_P010; #else fi.FourCC = MFX_FOURCC_NV12; fi.Width = mfx::align2_value(fi.Width, 32) * 2; #endif // LINUX } else if (format == MFX_CHROMAFORMAT_YUV420 && depth == BITDEPTH_8) { fi.FourCC = MFX_FOURCC_NV12; } else { assert(!"undefined target format"); } fi.ChromaFormat = format; fi.BitDepthLuma = depth; fi.BitDepthChroma = depth; } mfxStatus MFXVideoENCODEVP9_HW::Init(mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXVideoENCODEVP9_HW::Init"); if (m_initialized == true) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } MFX_CHECK_NULL_PTR1(par); mfxStatus sts = CheckExtBufferHeaders(par->NumExtParam, par->ExtParam); MFX_CHECK_STS(sts); mfxStatus checkSts = MFX_ERR_NONE; // to save warnings ater parameters checking eMFXHWType platform = m_pCore->GetHWType(); m_video = VP9MfxVideoParam(*par, platform); m_ddi.reset(CreatePlatformVp9Encoder(m_pCore)); MFX_CHECK(m_ddi.get() != 0, MFX_ERR_UNSUPPORTED); VP9MfxVideoParam toGetGuid(m_video); SetDefaultsForProfileAndFrameInfo(toGetGuid); sts = m_ddi->CreateAuxilliaryDevice(m_pCore, GetGuid(toGetGuid), toGetGuid); MFX_CHECK(sts != MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); ENCODE_CAPS_VP9 caps = {}; m_ddi->QueryEncodeCaps(caps); // get validated and properly initialized set of parameters for encoding checkSts = CheckParametersAndSetDefaults(m_video, caps); MFX_CHECK(checkSts >= 0, checkSts); // save WxH from Init to check resolution change in Reset m_initWidth = m_video.mfx.FrameInfo.Width; m_initHeight = m_video.mfx.FrameInfo.Height; sts = m_ddi->CreateAccelerationService(m_video); MFX_CHECK_STS(sts); m_rawFrames.Init(CalcNumSurfRaw(m_video)); mfxFrameAllocRequest request = {}; request.Info = m_video.mfx.FrameInfo; request.Type = MFX_MEMTYPE_D3D_INT; m_isD3D9SimWithVideoMem = IsD3D9Simulation(*m_pCore) && (m_video.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); m_bUseInternalMem = m_video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || m_isD3D9SimWithVideoMem; if (m_bUseInternalMem) { request.NumFrameMin = request.NumFrameSuggested = (mfxU16)CalcNumSurfRaw(m_video); sts = m_rawLocalFrames.Init(m_pCore, &request, true); MFX_CHECK_STS(sts); } // allocate and register surfaces for reconstructed frames request.NumFrameMin = request.NumFrameSuggested = (mfxU16)CalcNumSurfRecon(m_video); SetReconInfo(m_video, request.Info); //For MMCD encoder bind flag is required if (request.Info.FourCC == MFX_FOURCC_NV12) { request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; } sts = m_reconFrames.Init(m_pCore, &request, false); MFX_CHECK_STS(sts); sts = m_ddi->Register(m_reconFrames.GetFrameAllocReponse(), D3DDDIFMT_NV12); MFX_CHECK_STS(sts); // allocate and register surfaces for output bitstreams sts = m_ddi->QueryCompBufferInfo(D3DDDIFMT_INTELENCODE_BITSTREAMDATA, request, m_video.mfx.FrameInfo.Width, m_video.mfx.FrameInfo.Height); MFX_CHECK_STS(sts); request.NumFrameMin = request.NumFrameSuggested = (mfxU16)CalcNumTasks(m_video); if (!request.Info.Width) { request.Info.Width = m_video.mfx.FrameInfo.Width; } if (!request.Info.Height) { request.Info.Height = m_video.mfx.FrameInfo.Height; } // maximum buffer size for output bitstream is equal to two uncompressed frames of NV12 format // with an assumption that in the worst case encoded frame size exceeds the uncompressed size (allowed by VP9 standard) mfxU32 max_buffer_size = m_video.mfx.FrameInfo.Width*m_video.mfx.FrameInfo.Height*3; if (m_video.mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || m_video.mfx.FrameInfo.FourCC == MFX_FOURCC_Y410) { // doubling the size of the bitstream buffer if 10-bit format is used max_buffer_size *= 2; } // increase Width and Height in the request to allocate bigger buffer if estimated maximum size exceeds recommendation of the driver if (static_cast(request.Info.Width * request.Info.Height) < max_buffer_size) { mfxU32 tmp_width = static_cast(request.Info.Width); mfxU32 tmp_height = CeilDiv(max_buffer_size, static_cast(request.Info.Width)); const mfxU32 max_dx_dimension_size = 16384; if (tmp_height > max_dx_dimension_size) { tmp_height = max_dx_dimension_size; tmp_width = CeilDiv(max_buffer_size, max_dx_dimension_size); if (tmp_width > max_dx_dimension_size) { tmp_width = max_dx_dimension_size; } } request.Info.Width = static_cast(tmp_width); request.Info.Height = static_cast(tmp_height); } sts = m_outBitstreams.Init(m_pCore, &request, false); MFX_CHECK_STS(sts); sts = m_ddi->Register(m_outBitstreams.GetFrameAllocReponse(), D3DDDIFMT_INTELENCODE_BITSTREAMDATA); MFX_CHECK_STS(sts); m_maxBsSize = request.Info.Width * request.Info.Height; // allocate and register surfaces for segmentation map sts = m_ddi->QueryCompBufferInfo(D3DDDIFMT_INTELENCODE_MBSEGMENTMAP, request, m_video.mfx.FrameInfo.Width, m_video.mfx.FrameInfo.Height); MFX_CHECK_STS(sts); request.NumFrameMin = request.NumFrameSuggested = (mfxU16)CalcNumTasks(m_video); sts = m_segmentMaps.Init(m_pCore, &request, false); MFX_CHECK_STS(sts); sts = m_ddi->Register(m_segmentMaps.GetFrameAllocReponse(), D3DDDIFMT_INTELENCODE_MBSEGMENTMAP); MFX_CHECK_STS(sts); mfxU16 blockSize = MapIdToBlockSize(MFX_VP9_SEGMENT_ID_BLOCK_SIZE_64x64); if (VP9ECaps::Is32x32BlockSupported(platform)) blockSize = MapIdToBlockSize(MFX_VP9_SEGMENT_ID_BLOCK_SIZE_32x32); // allocate enough space for segmentation map for lowest supported segment block size and highest supported resolution mfxU16 wInBlocks = (static_cast(caps.MaxPicWidth) + blockSize - 1) / blockSize; mfxU16 hInBlocks = (static_cast(caps.MaxPicHeight) + blockSize - 1) / blockSize; mfxU32 sizeInBlocks = wInBlocks * hInBlocks; m_prevSegment.SegmentId = new mfxU8[sizeInBlocks]; memset(m_prevSegment.SegmentId, 0, sizeInBlocks); Zero(m_prevFrameParam); // prepare enough space for tasks m_free.resize(CalcNumTasks(m_video)); m_numBufferedFrames = 0; // prepare enough space for DPB management m_dpb.resize(m_video.mfx.NumRefFrame); m_bStartIVFSequence = true; m_initialized = true; m_resetBrc = false; m_frameArrivalOrder = 0; m_taskIdForDriver = 0; m_frameOrderInGop = 0; m_frameOrderInRefStructure = 0; m_videoForParamChange.push_back(m_video); MFX_RETURN(checkSts); } mfxStatus MFXVideoENCODEVP9_HW::Reset(mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXVideoENCODEVP9_HW::Reset"); if (m_initialized == false) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } mfxStatus sts = MFX_ERR_NONE; mfxStatus checkSts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(par); sts = CheckExtBufferHeaders(par->NumExtParam, par->ExtParam); MFX_CHECK_STS(sts); MFX_CHECK(par->IOPattern == m_video.IOPattern, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); eMFXHWType platform = m_pCore->GetHWType(); VP9MfxVideoParam parBeforeReset(m_video); VP9MfxVideoParam parAfterReset(*par, platform); ENCODE_CAPS_VP9 caps = {}; m_ddi->QueryEncodeCaps(caps); InheritDefaults(parAfterReset, parBeforeReset); parAfterReset.CalculateInternalParams(); // get validated and properly initialized set of parameters for encoding checkSts = CheckParametersAndSetDefaults(parAfterReset, caps); MFX_CHECK(checkSts >= 0, checkSts); // check that no re-allocation is required // make sure LowPower not changed - i.e. encoder type the same MFX_CHECK(parBeforeReset.mfx.CodecProfile == parAfterReset.mfx.CodecProfile && parBeforeReset.AsyncDepth == parAfterReset.AsyncDepth && parBeforeReset.IOPattern == parAfterReset.IOPattern && m_initWidth >= parAfterReset.mfx.FrameInfo.Width && m_initHeight >= parAfterReset.mfx.FrameInfo.Height && m_initWidth >= parAfterReset.mfx.FrameInfo.CropW && m_initHeight >= parAfterReset.mfx.FrameInfo.CropH && (0 == m_rawLocalFrames.Num() || m_rawLocalFrames.Num() >= CalcNumSurfRaw(parAfterReset)) && m_reconFrames.Num() >= CalcNumSurfRecon(parAfterReset) && parBeforeReset.mfx.RateControlMethod == parAfterReset.mfx.RateControlMethod && parBeforeReset.mfx.LowPower == parAfterReset.mfx.LowPower, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_video = parAfterReset; m_resetBrc = isBrcResetRequired(parBeforeReset, parAfterReset); if (m_frameArrivalOrder) { m_bStartIVFSequence = false; } const mfxExtEncoderResetOption * pExtReset = (mfxExtEncoderResetOption*)mfx::GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCODER_RESET_OPTION); if (parBeforeReset.mfx.GopPicSize != parAfterReset.mfx.GopPicSize || (pExtReset && IsOn(pExtReset->StartNewSequence))) { m_frameArrivalOrder = 0; m_frameOrderInGop = 0; m_frameOrderInRefStructure = 0; Zero(m_prevFrameParam); m_bStartIVFSequence = true; } else { // check that changes in encoding parameters don't violate VP9 specification const mfxExtVP9Param& extParBefore = GetExtBufferRef(parBeforeReset); const mfxExtVP9Param& extParAfter = GetExtBufferRef(parAfterReset); MFX_CHECK(m_frameArrivalOrder == 0 || (extParAfter.FrameWidth <= MAX_UPSCALE_RATIO * extParBefore.FrameWidth && extParAfter.FrameHeight <= MAX_UPSCALE_RATIO * extParBefore.FrameHeight && static_cast(extParAfter.FrameWidth) >= static_cast(extParBefore.FrameWidth) / MAX_DOWNSCALE_RATIO && static_cast(extParAfter.FrameHeight) >= static_cast(extParBefore.FrameHeight) / MAX_DOWNSCALE_RATIO), MFX_ERR_INVALID_VIDEO_PARAM); // so far dynamic scaling isn't supported together with temporal scalability if ((extParAfter.FrameWidth != extParBefore.FrameWidth || extParAfter.FrameHeight != extParBefore.FrameHeight) && parAfterReset.m_numLayers > 1) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // dynamic scaling and tiles don't work together if ((extParAfter.FrameWidth != extParBefore.FrameWidth || extParAfter.FrameHeight != extParBefore.FrameHeight) && (extParAfter.NumTileRows > 1 || extParAfter.NumTileColumns > 1)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // Tile switching is unsupported by driver for Gen11+ if ((extParBefore.NumTileColumns > 1 || extParBefore.NumTileRows > 1) && extParAfter.NumTileColumns == 1 && extParAfter.NumTileRows == 1) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // dynamic scaling and segmentation don't work together const mfxExtVP9Segmentation& seg = GetExtBufferRef(parAfterReset); if ((extParAfter.FrameWidth != extParBefore.FrameWidth || extParAfter.FrameHeight != extParBefore.FrameHeight) && seg.NumSegments > 1) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } sts = m_ddi->Reset(m_video); MFX_CHECK_STS(sts); m_videoForParamChange.push_back(m_video); MFX_RETURN(checkSts); } mfxStatus MFXVideoENCODEVP9_HW::RemoveObsoleteParameters() { if (m_videoForParamChange.size() > 1) // m_videoForParamChange.back() contains latest encoding parameters. It shouldn't be removed. { std::list::iterator par = m_videoForParamChange.begin(); std::list::iterator latest = m_videoForParamChange.end(); latest--; while (par != latest) { if (m_accepted.end() == std::find_if(m_accepted.begin(), m_accepted.end(), FindTaskByMfxVideoParam(&*par)) && // [par] isn't referenced by "acceped" Tasks m_submitted.end() == std::find_if(m_submitted.begin(), m_submitted.end(), FindTaskByMfxVideoParam(&*par))) // [par] isn't referenced by "submitted" Tasks { // [par] isn't referenced by any Task submitted to the MFXVideoENCODEVP9_HW. It's obsolete and can be safely removed. par = m_videoForParamChange.erase(par); } else { par++; } } } return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEVP9_HW::EncodeFrameSubmit(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task) { MFX_LTRACE_1(MFX_TRACE_LEVEL_DEFAULT, "MFXVideoENCODEVP9_HW::EncodeFrameSubmit ", "Frame %d", m_frameArrivalOrder); if (m_initialized == false || m_videoForParamChange.size() == 0) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } if (ctrl) { mfxStatus sts = CheckExtBufferHeaders(ctrl->NumExtParam, ctrl->ExtParam, true); MFX_CHECK_STS(sts); } mfxStatus checkSts = CheckBitstream(m_video, bs); MFX_CHECK_STS(checkSts); mfxStatus bufferingSts = MFX_ERR_NONE; { UMC::AutomaticUMCMutex guard(m_taskMutex); mfxStatus sts = RemoveObsoleteParameters(); MFX_CHECK_STS(sts); if (m_drainState == true && surface) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } if (surface == 0) { // entering "drain" state. In this state new frames aren't accepted. m_drainState = true; if (m_numBufferedFrames == 0) { // all the buffered frames are drained. Exit "drain state" and notify application m_drainState = false; MFX_RETURN(MFX_ERR_MORE_DATA); } else { m_numBufferedFrames --; } } else { // take Task from the pool and initialize with arrived frame if (m_free.size() == 0) { // no tasks in the pool MFX_RETURN(MFX_WRN_DEVICE_BUSY); } Task& newFrame = m_free.front(); Zero(newFrame); sts = m_rawFrames.GetFrame(surface, newFrame.m_pRawFrame); MFX_CHECK_STS(sts); sts = LockSurface(newFrame.m_pRawFrame, m_pCore); MFX_CHECK_STS(sts); ENCODE_CAPS_VP9 caps = {}; sts = m_ddi->QueryEncodeCaps(caps); if (sts != MFX_ERR_NONE) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); checkSts = CheckSurface(m_video, *surface, m_initWidth, m_initHeight, caps); MFX_CHECK_STS(checkSts); if (ctrl) { mfxEncodeCtrl tmpCtrl = *ctrl; checkSts = CheckAndFixCtrl(m_video, tmpCtrl, caps); MFX_CHECK(checkSts >= MFX_ERR_NONE, checkSts); newFrame.m_ctrl = tmpCtrl; } newFrame.m_timeStamp = surface->Data.TimeStamp; newFrame.m_frameOrder = m_frameArrivalOrder; newFrame.m_taskIdForDriver = m_taskIdForDriver; newFrame.m_pParam = &m_videoForParamChange.back(); // always use latest encoding parameters newFrame.m_resetBrc = m_resetBrc; m_resetBrc = false; // BRC reset is triggered only once. m_accepted.splice(m_accepted.end(), m_free, m_free.begin()); if (m_free.size() > 0) { m_numBufferedFrames++; // during "drain" state application may call EncodeFrameAsync w/o respective SyncOperation // that's why we need to use separate counter to undeerstand when all frames are finally drained bufferingSts = MFX_ERR_MORE_DATA_SUBMIT_TASK; } m_frameArrivalOrder++; m_taskIdForDriver = (m_taskIdForDriver + 1) % (MAX_TASK_ID + 1); } // place mfxBitstream to the queue if (bufferingSts == MFX_ERR_NONE) { m_outs.push(bs); } } *task = (mfxThreadTask)surface; MFX_CHECK_STS(bufferingSts); MFX_RETURN(checkSts); } mfxStatus MFXVideoENCODEVP9_HW::ConfigTask(Task &task) { VP9FrameLevelParam frameParam = { }; const VP9MfxVideoParam& curMfxPar = *task.m_pParam; mfxU16 forcedFrameType = task.m_ctrl.FrameType; mfxU8 frameType = (mfxU8)((task.m_frameOrder % curMfxPar.mfx.GopPicSize) == 0 || (forcedFrameType & MFX_FRAMETYPE_I) ? KEY_FRAME : INTER_FRAME); task.m_insertIVFSeqHeader = false; if (frameType == KEY_FRAME) { mfxExtVP9Param& opt = GetExtBufferRef(curMfxPar); if (opt.WriteIVFHeaders != MFX_CODINGOPTION_OFF && m_frameOrderInGop == 0 && m_bStartIVFSequence == true) { task.m_insertIVFSeqHeader = true; } m_frameOrderInGop = 0; } task.m_frameOrderInGop = m_frameOrderInGop; mfxExtVP9Param const &extPar = GetActualExtBufferRef(curMfxPar, task.m_ctrl); mfxU32 prevFrameOrderInRefStructure = m_frameOrderInRefStructure; if (m_frameOrderInGop == 0 || (m_prevFrameParam.width != extPar.FrameWidth || m_prevFrameParam.height != extPar.FrameHeight)) { m_frameOrderInRefStructure = 0; } task.m_frameOrderInRefStructure = m_frameOrderInRefStructure; eMFXHWType platform = m_pCore->GetHWType(); mfxStatus sts = SetFramesParams(curMfxPar, task, frameType, frameParam, platform); task.m_pRecFrame = 0; task.m_pOutBs = 0; task.m_pRawLocalFrame = 0; if (m_bUseInternalMem) { task.m_pRawLocalFrame = m_rawLocalFrames.GetFreeFrame(); MFX_CHECK(task.m_pRawLocalFrame != 0, MFX_WRN_DEVICE_BUSY); } task.m_pRecFrame = m_reconFrames.GetFreeFrame(); MFX_CHECK(task.m_pRecFrame != 0, MFX_WRN_DEVICE_BUSY); task.m_pRecFrame->frameOrder = task.m_frameOrder; task.m_pOutBs = m_outBitstreams.GetFreeFrame(); MFX_CHECK(task.m_pOutBs != 0, MFX_WRN_DEVICE_BUSY); if (frameParam.segmentation == APP_SEGMENTATION) { task.m_pSegmentMap = m_segmentMaps.GetFreeFrame(); MFX_CHECK(task.m_pSegmentMap != 0, MFX_WRN_DEVICE_BUSY); } sts = DecideOnRefListAndDPBRefresh(curMfxPar, &task, m_dpb, frameParam, prevFrameOrderInRefStructure); task.m_frameParam = frameParam; task.m_pRecFrame->pSurface->Data.FrameOrder = task.m_frameOrder; if (task.m_frameParam.frameType == KEY_FRAME) { task.m_pRecRefFrames[REF_LAST] = task.m_pRecRefFrames[REF_GOLD] = task.m_pRecRefFrames[REF_ALT] = 0; } else { mfxU8 idxLast = task.m_frameParam.refList[REF_LAST]; mfxU8 idxGold = task.m_frameParam.refList[REF_GOLD]; mfxU8 idxAlt = task.m_frameParam.refList[REF_ALT]; task.m_pRecRefFrames[REF_LAST] = m_dpb[idxLast]; if (VP9ECaps::IsDefaultMultiRefUsed(platform)) { bool multiref = m_dpb.size() > 1; task.m_pRecRefFrames[REF_GOLD] = m_dpb[idxGold] != m_dpb[idxLast] || multiref ? m_dpb[idxGold] : 0; } else { task.m_pRecRefFrames[REF_GOLD] = m_dpb[idxGold] != m_dpb[idxLast] ? m_dpb[idxGold] : 0; } task.m_pRecRefFrames[REF_ALT] = m_dpb[idxAlt] != m_dpb[idxLast] && m_dpb[idxAlt] != m_dpb[idxGold] ? m_dpb[idxAlt] : 0; } sts = LockSurface(task.m_pRecFrame, m_pCore); MFX_CHECK_STS(sts); sts = LockSurface(task.m_pRawLocalFrame, m_pCore); MFX_CHECK_STS(sts); sts = LockSurface(task.m_pOutBs, m_pCore); MFX_CHECK_STS(sts); sts = LockSurface(task.m_pSegmentMap, m_pCore); MFX_CHECK_STS(sts); UpdateDpb(frameParam, task.m_pRecFrame, m_dpb, m_pCore); m_prevFrameParam = task.m_frameParam; MFX_RETURN(sts); } mfxStatus MFXVideoENCODEVP9_HW::Execute(mfxThreadTask task, mfxU32 /*uid_p*/, mfxU32 /*uid_a*/) { if (m_initialized == false) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } mfxFrameSurface1* pSurf = (mfxFrameSurface1*)task; // submit frame to the driver (if any) if (m_accepted.size()) // we have something to submit to driver { Task& newFrame = m_accepted.front(); // no mutex required here since splice() method doesn't cause race conditions for getting and modification of existing elements if (newFrame.m_pRawFrame->pSurface == pSurf) // frame pointed by pSurf isn't submitted yet - let's proceed with submission { MFX_LTRACE_1(MFX_TRACE_LEVEL_DEFAULT, "MFXVideoENCODEVP9_HW::SubmitFrame ", "Frame %d", newFrame.m_frameOrder); mfxStatus sts = MFX_ERR_NONE; const VP9MfxVideoParam& curMfxPar = *newFrame.m_pParam; newFrame.m_pPrevSegment = &m_prevSegment; sts = ConfigTask(newFrame); MFX_CHECK_STS(sts); mfxFrameSurface1 *pSurface = 0; mfxHDLPair surfaceHDL = {}; sts = CopyRawSurfaceToVideoMemory(m_pCore, curMfxPar, newFrame); MFX_CHECK_STS(sts); sts = GetInputSurface(m_pCore, curMfxPar, newFrame, pSurface); MFX_CHECK_STS(sts); // get handle to input frame in VIDEO memory (either external or local) sts = GetNativeHandleToRawSurface(*m_pCore, *pSurface, surfaceHDL, m_video, m_isD3D9SimWithVideoMem); MFX_CHECK_STS(sts); MFX_CHECK_STS(sts); MFX_CHECK(surfaceHDL.first != 0, MFX_ERR_UNDEFINED_BEHAVIOR); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VP9 encode DDISubmitTask"); // submit the frame to the driver sts = m_ddi->Execute(newFrame, surfaceHDL); MFX_CHECK_STS(sts); } IncreaseRef(newFrame.m_pRecFrame); { UMC::AutomaticUMCMutex guard(m_taskMutex); m_submitted.splice(m_submitted.end(), m_accepted, m_accepted.begin()); } // save segmentation params which were applied to current frame mfxExtVP9Segmentation const & seg = GetActualExtBufferRef(curMfxPar, newFrame.m_ctrl); CopySegmentationBuffer(m_prevSegment, seg); m_frameOrderInGop++; m_frameOrderInRefStructure++; } } // get frame from the driver (if any) if (m_submitted.size() == m_video.AsyncDepth || // [AsyncDepth] asynchronous tasks are submitted to driver. It's time to make synchronization. (pSurf == 0 && m_submitted.size())) // or we are in "drain state" - need to synchronize all submitted to driver w/o any conditions { Task& frameToGet = m_submitted.front(); MFX_LTRACE_1(MFX_TRACE_LEVEL_DEFAULT, "MFXVideoENCODEVP9_HW::QueryFrame ", "Frame %d", frameToGet.m_frameOrder); assert(m_outs.size() > 0); mfxStatus sts = MFX_ERR_NONE; sts = m_ddi->QueryStatus(frameToGet); if (sts == MFX_WRN_DEVICE_BUSY) { MFX_RETURN(MFX_TASK_BUSY); } MFX_CHECK_STS(sts); frameToGet.m_pBitsteam = m_outs.front(); sts = UpdateBitstream(frameToGet); MFX_CHECK_STS(sts); { UMC::AutomaticUMCMutex guard(m_taskMutex); m_outs.pop(); sts = FreeTask(m_pCore, frameToGet); MFX_CHECK_STS(sts); m_free.splice(m_free.end(), m_submitted, m_submitted.begin()); } } return MFX_TASK_DONE; } mfxStatus MFXVideoENCODEVP9_HW::FreeResources(mfxThreadTask /*task*/, mfxStatus /*sts*/) { return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEVP9_HW::Close() { if (m_initialized == false) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } mfxStatus sts = MFX_ERR_NONE; for (std::list::iterator i = m_accepted.begin(); i != m_accepted.end(); i++) { sts = FreeTask(m_pCore, *i); MFX_CHECK_STS(sts); } for (std::list::iterator i = m_submitted.begin(); i != m_submitted.end(); i++) { sts = FreeTask(m_pCore, *i); MFX_CHECK_STS(sts); } sts = m_opaqFrames.Release(); MFX_CHECK_STS(sts); sts = m_rawLocalFrames.Release(); MFX_CHECK_STS(sts); sts = m_reconFrames.Release(); MFX_CHECK_STS(sts); sts = m_outBitstreams.Release(); MFX_CHECK_STS(sts); sts = m_segmentMaps.Release(); MFX_CHECK_STS(sts); if (m_prevSegment.SegmentId) { delete[] m_prevSegment.SegmentId; m_prevSegment.SegmentId = 0; } m_initialized = false; return MFX_ERR_NONE; } mfxStatus MFXVideoENCODEVP9_HW::GetVideoParam(mfxVideoParam *par) { if (m_initialized == false) { MFX_RETURN(MFX_ERR_NOT_INITIALIZED); } MFX_CHECK_NULL_PTR1(par); mfxStatus sts = CheckExtBufferHeaders(par->NumExtParam, par->ExtParam); MFX_CHECK_STS(sts); par->AsyncDepth = m_video.AsyncDepth; par->IOPattern = m_video.IOPattern; par->Protected = m_video.Protected; par->mfx = m_video.mfx; for (mfxU8 i = 0; i < par->NumExtParam; i++) { mfxExtBuffer *pOutBuf = par->ExtParam[i]; if (pOutBuf == 0) { MFX_RETURN(MFX_ERR_NULL_PTR); } mfxExtBuffer *pLocalBuf = GetExtendedBuffer(m_video.ExtParam, m_video.NumExtParam, pOutBuf->BufferId); if (pLocalBuf && (pOutBuf->BufferSz == pLocalBuf->BufferSz)) { char* src = reinterpret_cast (pLocalBuf); char* dst = reinterpret_cast (pOutBuf); std::copy(src, src + pLocalBuf->BufferSz, dst); } else { assert(!"Encoder doesn't have requested buffer or buffer sizes are different!"); MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } } return MFX_ERR_NONE; } inline mfxStatus UpdatePictureHeader(mfxU32 frameLen, mfxU32 frameNum, mfxU8* pPictureHeader, mfxU32 bufferSize) { mfxU32 ivf_frame_header[3] = {frameLen, frameNum, 0x00000000}; if (bufferSize < sizeof(ivf_frame_header)) MFX_RETURN(MFX_ERR_MORE_DATA); std::copy(std::begin(ivf_frame_header),std::end(ivf_frame_header), reinterpret_cast (pPictureHeader)); return MFX_ERR_NONE; }; //#define SUPERFRAME_WA_MSDK mfxStatus MFXVideoENCODEVP9_HW::UpdateBitstream( Task & task) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VP9 encode CopyBitstream"); mfxFrameData bitstream = {}; FrameLocker lock(m_pCore, bitstream, task.m_pOutBs->pSurface->Data.MemId); if (bitstream.Y == 0) { MFX_RETURN(MFX_ERR_LOCK_MEMORY); } mfxU32 bsSizeToCopy = task.m_bsDataLength; #ifdef SUPERFRAME_WA_MSDK // "SF" below stands for Superframe const mfxU32 hiddenFrameSize = bsSizeToCopy - IVF_PIC_HEADER_SIZE_BYTES - (task.m_insertIVFSeqHeader ? IVF_SEQ_HEADER_SIZE_BYTES : 0); const mfxU32 frameSizeLen = (CeilLog2(hiddenFrameSize) + 7) / 8; const mfxU32 showFrameSize = 1; const mfxU32 SFHeaderSize = 1; const mfxU32 extraSizeForSF = showFrameSize + SFHeaderSize + 2 * frameSizeLen + SFHeaderSize; #endif mfxU32 bsSizeAvail = task.m_pBitsteam->MaxLength - task.m_pBitsteam->DataOffset - task.m_pBitsteam->DataLength; mfxU8 * bsData = task.m_pBitsteam->Data + task.m_pBitsteam->DataOffset + task.m_pBitsteam->DataLength; MFX_CHECK(bsSizeToCopy <= bsSizeAvail, MFX_ERR_NOT_ENOUGH_BUFFER); // Avoid segfaults on very high bitrates if (bsSizeToCopy > m_maxBsSize) { lock.Unlock(); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } // Copy compressed picture from d3d surface to buffer in system memory if (bsSizeToCopy) { mfxSize roi = {(int32_t)bsSizeToCopy,1}; FastCopy::Copy(bsData, bsSizeToCopy, bitstream.Y, bitstream.Pitch, roi, COPY_VIDEO_TO_SYS); } mfxExtVP9Param& opt = GetExtBufferRef(m_video); #ifdef SUPERFRAME_WA_MSDK mfxU8* pEnd = bsData + bsSizeToCopy; mfxU8* p = pEnd; if (task.m_frameParam.showFrame == 0) { const mfxU8 frameMarker = 0x2 << 6; const mfxU8 profile = 0x0 << 4; const mfxU8 showExistingFrame = 0x1 << 3; mfxU8 frameToShow = 0; for (mfxU8 i = 0; i < DPB_SIZE; i++) { if (task.m_frameParam.refreshRefFrames[i] == 1) { frameToShow = i; break; } } const mfxU8 showFrame = frameMarker | profile | showExistingFrame | frameToShow; const mfxU8 SFMarker = 0x06 << 5; const mfxU8 bytesPerFrameSizeM1 = (static_cast(frameSizeLen) - 1) << 3; const mfxU8 framesInSuperFrameM1 = 1; const mfxU8 superFrameHeader = SFMarker | bytesPerFrameSizeM1 | framesInSuperFrameM1; *p = showFrame; p++; *p = superFrameHeader; p++; for (mfxU8 i = 0; i < frameSizeLen; i++) { *p = static_cast(0xff & (hiddenFrameSize >> (8 * i))); p++; } for (mfxU8 i = 0; i < frameSizeLen; i++) { *p = static_cast(0xff & (showFrameSize >> (8 * i))); p++; } *p = superFrameHeader; p++; } task.m_pBitsteam->DataLength += static_cast(p - pEnd); #endif task.m_pBitsteam->DataLength += bsSizeToCopy; if (opt.WriteIVFHeaders != MFX_CODINGOPTION_OFF) { mfxU8 * pIVFPicHeader = task.m_insertIVFSeqHeader ? bsData + IVF_SEQ_HEADER_SIZE_BYTES : bsData; mfxStatus sts = UpdatePictureHeader(task.m_pBitsteam->DataLength - IVF_PIC_HEADER_SIZE_BYTES - (task.m_insertIVFSeqHeader ? IVF_SEQ_HEADER_SIZE_BYTES : 0), (mfxU32)task.m_frameOrder, pIVFPicHeader, bsSizeAvail - IVF_SEQ_HEADER_SIZE_BYTES); MFX_CHECK_STS(sts); } // Update bitstream fields task.m_pBitsteam->TimeStamp = task.m_timeStamp; task.m_pBitsteam->FrameType = mfxU16(task.m_frameParam.frameType == KEY_FRAME ? MFX_FRAMETYPE_I : MFX_FRAMETYPE_P); task.m_pBitsteam->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (mfxExtAVCEncodedFrameInfo * encFrameInfo = GetExtBuffer(*(task.m_pBitsteam))) encFrameInfo->FrameOrder = task.m_frameOrder; return MFX_ERR_NONE; } } // MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/mfx_vp9_encode_hw_ddi.cpp000066400000000000000000000375521443134507600325600ustar00rootroot00000000000000// Copyright (c) 2016-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_vp9_encode_hw_utils.h" #include "mfx_vp9_encode_hw_par.h" #include "mfx_vp9_encode_hw_ddi.h" namespace MfxHwVP9Encode { GUID GetGuid(VP9MfxVideoParam const & par) { // Currently we don't support LP=OFF // so it is mapped to GUID_NULL // it will cause Query/Init fails with Unsupported // ever when driver support LP=OFF switch (par.mfx.CodecProfile) { case MFX_PROFILE_VP9_0: return (par.mfx.LowPower != MFX_CODINGOPTION_OFF) ? DXVA2_Intel_LowpowerEncode_VP9_Profile0 : GUID_NULL; //DXVA2_Intel_Encode_VP9_Profile0; break; case MFX_PROFILE_VP9_1: return (par.mfx.LowPower != MFX_CODINGOPTION_OFF) ? DXVA2_Intel_LowpowerEncode_VP9_Profile1 : GUID_NULL; //DXVA2_Intel_Encode_VP9_Profile1; break; case MFX_PROFILE_VP9_2: return (par.mfx.LowPower != MFX_CODINGOPTION_OFF) ? DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile2 : GUID_NULL; // DXVA2_Intel_Encode_VP9_10bit_Profile2; break; case MFX_PROFILE_VP9_3: return (par.mfx.LowPower != MFX_CODINGOPTION_OFF) ? DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile3 : GUID_NULL; // DXVA2_Intel_Encode_VP9_10bit_Profile3; break; default: // profile cannot be identified. Use Profile0 so far return (par.mfx.LowPower != MFX_CODINGOPTION_OFF) ? DXVA2_Intel_LowpowerEncode_VP9_Profile0 : GUID_NULL; // DXVA2_Intel_Encode_VP9_Profile0; } } mfxStatus QueryCaps(VideoCORE* pCore, ENCODE_CAPS_VP9 & caps, GUID guid, VP9MfxVideoParam const & par) { std::unique_ptr ddi; ddi.reset(CreatePlatformVp9Encoder(pCore)); MFX_CHECK(ddi.get() != NULL, MFX_ERR_UNSUPPORTED); mfxStatus sts = ddi.get()->CreateAuxilliaryDevice(pCore, guid, par); MFX_CHECK_STS(sts); sts = ddi.get()->QueryEncodeCaps(caps); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // uncompressed headencompressedr packing #define VP9_FRAME_MARKER 0x2 #define VP9_SYNC_CODE_0 0x49 #define VP9_SYNC_CODE_1 0x83 #define VP9_SYNC_CODE_2 0x42 #define FRAME_CONTEXTS_LOG2 2 #define FRAME_CONTEXTS (1 << FRAME_CONTEXTS_LOG2) #define QINDEX_BITS 8 #define MAX_TILE_WIDTH_B64 64 #define MIN_TILE_WIDTH_B64 4 #define MI_SIZE_LOG2 3 #define MI_BLOCK_SIZE_LOG2 (6 - MI_SIZE_LOG2) // 64 = 2^6 #define MI_BLOCK_SIZE (1 << MI_BLOCK_SIZE_LOG2) // mi-units per max block void WriteBit(BitBuffer &buf, mfxU8 bit) { const mfxU16 byteOffset = buf.bitOffset / CHAR_BIT; const mfxU8 bitsLeftInByte = CHAR_BIT - 1 - buf.bitOffset % CHAR_BIT; if (bitsLeftInByte == CHAR_BIT - 1) { buf.pBuffer[byteOffset] = mfxU8(bit << bitsLeftInByte); } else { buf.pBuffer[byteOffset] &= ~(1 << bitsLeftInByte); buf.pBuffer[byteOffset] |= bit << bitsLeftInByte; } buf.bitOffset = buf.bitOffset + 1; }; void WriteLiteral(BitBuffer &buf, mfxU64 data, mfxU64 bits) { for (mfxI64 bit = bits - 1; bit >= 0; bit--) { WriteBit(buf, (data >> bit) & 1); } } void WriteColorConfig(BitBuffer &buf, VP9SeqLevelParam const &seqPar) { if (seqPar.profile >= PROFILE_2) { assert(seqPar.bitDepth > BITDEPTH_8); WriteBit(buf, seqPar.bitDepth == BITDEPTH_10 ? 0 : 1); } WriteLiteral(buf, seqPar.colorSpace, 3); if (seqPar.colorSpace != SRGB) { WriteBit(buf, seqPar.colorRange); if (seqPar.profile == PROFILE_1 || seqPar.profile == PROFILE_3) { assert(seqPar.subsamplingX != 1 || seqPar.subsamplingY != 1); WriteBit(buf, seqPar.subsamplingX); WriteBit(buf, seqPar.subsamplingY); WriteBit(buf, 0); // unused } else { assert(seqPar.subsamplingX == 1 && seqPar.subsamplingY == 1); } } else { assert(seqPar.profile == PROFILE_1 || seqPar.profile == PROFILE_3); WriteBit(buf, 0); // unused } } void WriteFrameSize(BitBuffer &buf, VP9FrameLevelParam const &framePar) { WriteLiteral(buf, framePar.width - 1, 16); WriteLiteral(buf, framePar.height - 1, 16); const mfxU8 renderFrameSizeDifferent = 0; // is not supported WriteBit(buf, renderFrameSizeDifferent); } void WriteQIndexDelta(BitBuffer &buf, mfxI16 qDelta) { if (qDelta != 0) { WriteBit(buf, 1); WriteLiteral(buf, abs(qDelta), 4); WriteBit(buf, qDelta < 0); } else { WriteBit(buf, 0); } } mfxU16 WriteUncompressedHeader(BitBuffer &localBuf, Task const &task, VP9SeqLevelParam const &seqPar, BitOffsets &offsets) { VP9FrameLevelParam const &framePar = task.m_frameParam; Zero(offsets); offsets.BitOffsetUncompressedHeader = (mfxU16)localBuf.bitOffset; WriteLiteral(localBuf, VP9_FRAME_MARKER, 2); // profile switch (seqPar.profile) { case PROFILE_0: WriteLiteral(localBuf, 0, 2); break; case PROFILE_1: WriteLiteral(localBuf, 2, 2); break; case PROFILE_2: WriteLiteral(localBuf, 1, 2); break; case PROFILE_3: WriteLiteral(localBuf, 6, 3); break; default: assert(0); } WriteBit(localBuf, 0); // show_existing_frame WriteBit(localBuf, framePar.frameType); WriteBit(localBuf, framePar.showFrame); WriteBit(localBuf, framePar.errorResilentMode); if (framePar.frameType == KEY_FRAME) // Key frame { // sync code WriteLiteral(localBuf, VP9_SYNC_CODE_0, 8); WriteLiteral(localBuf, VP9_SYNC_CODE_1, 8); WriteLiteral(localBuf, VP9_SYNC_CODE_2, 8); // color config WriteColorConfig(localBuf, seqPar); // frame, render size WriteFrameSize(localBuf, framePar); } else // Inter frame { if (!framePar.showFrame) { WriteBit(localBuf, framePar.intraOnly); } if (!framePar.errorResilentMode) { WriteLiteral(localBuf, framePar.resetFrameContext, 2); } // prepare refresh frame mask mfxU8 refreshFamesMask = 0; for (mfxU8 i = 0; i < DPB_SIZE; i++) { refreshFamesMask |= (framePar.refreshRefFrames[i] << i); } if (framePar.intraOnly) { // sync code WriteLiteral(localBuf, VP9_SYNC_CODE_0, 8); WriteLiteral(localBuf, VP9_SYNC_CODE_1, 8); WriteLiteral(localBuf, VP9_SYNC_CODE_2, 8); // Note for profile 0, 420 8bpp is assumed. if (seqPar.profile > PROFILE_0) { WriteColorConfig(localBuf, seqPar); } // refresh frame info WriteLiteral(localBuf, refreshFamesMask, REF_FRAMES); // frame, render size WriteFrameSize(localBuf, framePar); } else { WriteLiteral(localBuf, refreshFamesMask, REF_FRAMES); for (mfxI8 refFrame = LAST_FRAME; refFrame <= ALTREF_FRAME; refFrame ++) { WriteLiteral(localBuf, framePar.refList[int(refFrame)], REF_FRAMES_LOG2); WriteBit(localBuf, framePar.refBiases[int(refFrame)]); } // frame size with refs mfxU8 found = 1; if (task.m_frameOrderInRefStructure == 0) { // reference structure is reset which means resolution change // don't inherit resolution of reference frames found = 0; } for (mfxI8 refFrame = LAST_FRAME; refFrame <= ALTREF_FRAME; refFrame ++) { WriteBit(localBuf, found); if (found) break; } if (!found) { WriteLiteral(localBuf, framePar.width - 1, 16); WriteLiteral(localBuf, framePar.height - 1, 16); } const mfxU8 renderFrameSizeDifferent = 0; // is not supported WriteBit(localBuf, renderFrameSizeDifferent); WriteBit(localBuf, framePar.allowHighPrecisionMV); // interpolation filter syntax const mfxU8 filterToLiteralMap[] = { 1, 0, 2, 3 }; assert(framePar.interpFilter <= SWITCHABLE); WriteBit(localBuf, framePar.interpFilter == SWITCHABLE); if (framePar.interpFilter < SWITCHABLE) { WriteLiteral(localBuf, filterToLiteralMap[framePar.interpFilter], 2); } } } if (!framePar.errorResilentMode) { WriteBit(localBuf, framePar.refreshFrameContext); WriteBit(localBuf, seqPar.frameParallelDecoding); } WriteLiteral(localBuf, framePar.frameContextIdx, FRAME_CONTEXTS_LOG2); offsets.BitOffsetForLFLevel = (mfxU16)localBuf.bitOffset; // loop filter syntax WriteLiteral(localBuf, framePar.lfLevel, 6); WriteLiteral(localBuf, framePar.sharpness, 3); WriteBit(localBuf, framePar.modeRefDeltaEnabled); if (framePar.modeRefDeltaEnabled) { WriteBit(localBuf, framePar.modeRefDeltaUpdate); if (framePar.modeRefDeltaUpdate) { offsets.BitOffsetForLFRefDelta = (mfxU16)localBuf.bitOffset; for (mfxI8 i = 0; i < MAX_REF_LF_DELTAS; i++) { // always write deltas explicitly to allow BRC modify them const mfxI8 delta = framePar.lfRefDelta[int(i)]; WriteBit(localBuf, 1); WriteLiteral(localBuf, abs(delta) & 0x3F, 6); WriteBit(localBuf, delta < 0); } offsets.BitOffsetForLFModeDelta = (mfxU16)localBuf.bitOffset; for (mfxI8 i = 0; i < MAX_MODE_LF_DELTAS; i++) { // always write deltas explicitly to allow BRC modify them const mfxI8 delta = framePar.lfModeDelta[int(i)]; WriteBit(localBuf, 1); WriteLiteral(localBuf, abs(delta) & 0x3F, 6); WriteBit(localBuf, delta < 0); } } } offsets.BitOffsetForQIndex = (mfxU16)localBuf.bitOffset; // quantization params WriteLiteral(localBuf, framePar.baseQIndex, QINDEX_BITS); WriteQIndexDelta(localBuf, framePar.qIndexDeltaLumaDC); WriteQIndexDelta(localBuf, framePar.qIndexDeltaChromaDC); WriteQIndexDelta(localBuf, framePar.qIndexDeltaChromaAC); offsets.BitOffsetForSegmentation = (mfxU16)localBuf.bitOffset; //segmentation bool segmentation = framePar.segmentation != NO_SEGMENTATION; WriteBit(localBuf, segmentation); if (segmentation) { // for both cases (APP_SEGMENTATION and BRC_SEGMENTATION) segmentation_params() will be completely re-written by HW accelerator // so just writing dummy parameters here WriteBit(localBuf, 0); WriteBit(localBuf, 0); } offsets.BitSizeForSegmentation = (mfxU16)localBuf.bitOffset - offsets.BitOffsetForSegmentation; // tile info mfxU8 minLog2TileCols = 0; mfxU8 maxLog2TileCols = 1; mfxU8 ones; const mfxU16 sb64Cols = mfxU16((mfx::align2_value(framePar.modeInfoCols, 1 << MI_BLOCK_SIZE_LOG2)) >> MI_BLOCK_SIZE_LOG2); while ((MAX_TILE_WIDTH_B64 << minLog2TileCols) < sb64Cols) { minLog2TileCols ++; } while ((sb64Cols >> maxLog2TileCols) >= MIN_TILE_WIDTH_B64) { maxLog2TileCols ++; } maxLog2TileCols--; ones = framePar.log2TileCols - minLog2TileCols; while (ones--) { WriteBit(localBuf, 1); } if (framePar.log2TileCols < maxLog2TileCols) { WriteBit(localBuf, 0); } WriteBit(localBuf, framePar.log2TileRows != 0); if (framePar.log2TileRows != 0) { WriteBit(localBuf, framePar.log2TileRows != 1); } offsets.BitOffsetForFirstPartitionSize = (mfxU16)localBuf.bitOffset;; // size of compressed header (unknown so far, will be written by driver/HuC) WriteLiteral(localBuf, 0, 16); return localBuf.bitOffset; }; mfxU16 PrepareFrameHeader(VP9MfxVideoParam const &par, mfxU8 *pBuf, mfxU32 bufferSizeBytes, Task const& task, VP9SeqLevelParam const &seqPar, BitOffsets &offsets) { if (bufferSizeBytes < VP9_MAX_UNCOMPRESSED_HEADER_SIZE + MAX_IVF_HEADER_SIZE) { return 0; // zero size of header - indication that something went wrong } BitBuffer localBuf; localBuf.pBuffer = pBuf; localBuf.bitOffset = 0; mfxExtVP9Param& opt = GetExtBufferRef(par); mfxU16 ivfHeaderSize = 0; if (opt.WriteIVFHeaders != MFX_CODINGOPTION_OFF) { if (task.m_insertIVFSeqHeader) { mfxStatus sts = AddSeqHeader(task.m_frameParam.width, task.m_frameParam.height, par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, 0, localBuf.pBuffer, bufferSizeBytes); if (sts != MFX_ERR_NONE) return 0; ivfHeaderSize += IVF_SEQ_HEADER_SIZE_BYTES; } mfxStatus sts = AddPictureHeader(localBuf.pBuffer + ivfHeaderSize, bufferSizeBytes - ivfHeaderSize); if (sts != MFX_ERR_NONE) return 0; ivfHeaderSize += IVF_PIC_HEADER_SIZE_BYTES; } localBuf.bitOffset += ivfHeaderSize * 8; mfxU16 totalBitsWritten = WriteUncompressedHeader(localBuf, task, seqPar, offsets); return (totalBitsWritten + 7) / 8; } } // MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/mfx_vp9_encode_hw_par.cpp000066400000000000000000001574031443134507600326000ustar00rootroot00000000000000// Copyright (c) 2016-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfx_enc_common.h" #include "mfx_vp9_encode_hw_par.h" #include "mfx_vp9_encode_hw_utils.h" #include "mfx_platform_caps.h" #include "mfx_common_int.h" #include "mfx_ext_buffers.h" #include "umc_defs.h" #include #include namespace MfxHwVP9Encode { bool IsExtBufferSupportedInInit(mfxU32 id) { return id == MFX_EXTBUFF_VP9_PARAM || id == MFX_EXTBUFF_CODING_OPTION2 || id == MFX_EXTBUFF_CODING_OPTION3 || id == MFX_EXTBUFF_DDI // RefreshFrameContext is used by driver || id == MFX_EXTBUFF_VP9_SEGMENTATION || id == MFX_EXTBUFF_VP9_TEMPORAL_LAYERS || id == MFX_EXTBUFF_ENCODER_RESET_OPTION || id == MFX_EXTBUFF_ALLOCATION_HINTS ; } bool IsExtBufferIgnoredInRuntime(mfxU32 id) { // we may just ignore MFX_EXTBUFF_VPP_AUXDATA as it provides auxiliary information return id == MFX_EXTBUFF_VPP_AUXDATA; } bool IsExtBufferSupportedInRuntime(mfxU32 id) { return id == MFX_EXTBUFF_VP9_PARAM || id == MFX_EXTBUFF_VP9_SEGMENTATION || IsExtBufferIgnoredInRuntime(id); } mfxStatus CheckExtBufferHeaders(mfxU16 numExtParam, mfxExtBuffer** extParam, bool isRuntime) { for (mfxU16 i = 0; i < numExtParam; i++) { MFX_CHECK_NULL_PTR1(extParam); mfxExtBuffer *pBuf = extParam[i]; // check that NumExtParam complies with ExtParam MFX_CHECK_NULL_PTR1(extParam[i]); // check that there is no ext buffer duplication in ExtParam for (mfxU16 j = i + 1; j < numExtParam; j++) { if (extParam[j]->BufferId == pBuf->BufferId) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } } bool isSupported = isRuntime ? IsExtBufferSupportedInRuntime(pBuf->BufferId) : IsExtBufferSupportedInInit(pBuf->BufferId); if (!isSupported) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } } return MFX_ERR_NONE; } // below code allows to do 3 things: // 1) Set 1 to parameters which are configurable (supported) by the encoder. // 2) Copy only supported parameters: // a) During input paramerets validation to check if all parameters passed by app are supported. // b) In Reset() API function to inherrit all defaults from configuration that was actual prior to Reset() call. #define COPY_PAR_IF_ZERO(pDst, pSrc, PAR)\ if (pDst->PAR == 0)\ {\ pDst->PAR = pSrc->PAR;\ } #define SET_OR_COPY_PAR(PAR)\ if (pSrc)\ {\ COPY_PAR_IF_ZERO(pDst, pSrc, PAR); \ }\ else\ {\ pDst->PAR = 1; \ } #define SET_OR_COPY_PAR_DONT_INHERIT(PAR)\ if (pSrc)\ {\ if (zeroDst)\ {\ COPY_PAR_IF_ZERO(pDst, pSrc, PAR); \ }\ }\ else\ {\ pDst->PAR = 1; \ } #define COPY_PTR(PTR)\ if (pSrc)\ {\ COPY_PAR_IF_ZERO(pDst, pSrc, PTR); \ }\ inline void SetOrCopy(mfxInfoMFX *pDst, mfxInfoMFX const *pSrc = 0, bool /*zeroDst*/ = true) { SET_OR_COPY_PAR(FrameInfo.Width); SET_OR_COPY_PAR(FrameInfo.Height); SET_OR_COPY_PAR(FrameInfo.CropW); SET_OR_COPY_PAR(FrameInfo.CropH); SET_OR_COPY_PAR(FrameInfo.CropX); SET_OR_COPY_PAR(FrameInfo.CropY); SET_OR_COPY_PAR(FrameInfo.FrameRateExtN); SET_OR_COPY_PAR(FrameInfo.FrameRateExtD); SET_OR_COPY_PAR(FrameInfo.AspectRatioW); SET_OR_COPY_PAR(FrameInfo.AspectRatioH); SET_OR_COPY_PAR(FrameInfo.ChromaFormat); SET_OR_COPY_PAR(FrameInfo.BitDepthLuma); SET_OR_COPY_PAR(FrameInfo.BitDepthChroma); SET_OR_COPY_PAR(FrameInfo.Shift); SET_OR_COPY_PAR(FrameInfo.PicStruct); SET_OR_COPY_PAR(FrameInfo.FourCC); SET_OR_COPY_PAR(NumThread); SET_OR_COPY_PAR(LowPower); SET_OR_COPY_PAR(CodecId); SET_OR_COPY_PAR(CodecProfile); SET_OR_COPY_PAR(TargetUsage); SET_OR_COPY_PAR(GopPicSize); SET_OR_COPY_PAR(GopRefDist); SET_OR_COPY_PAR(RateControlMethod); SET_OR_COPY_PAR(BufferSizeInKB); SET_OR_COPY_PAR(InitialDelayInKB); SET_OR_COPY_PAR(QPI); SET_OR_COPY_PAR(TargetKbps); SET_OR_COPY_PAR(MaxKbps); SET_OR_COPY_PAR(BRCParamMultiplier); SET_OR_COPY_PAR(NumRefFrame); } inline void SetOrCopy(mfxExtVP9Param *pDst, mfxExtVP9Param const *pSrc = 0, bool zeroDst = true) { SET_OR_COPY_PAR_DONT_INHERIT(FrameWidth); SET_OR_COPY_PAR_DONT_INHERIT(FrameHeight); SET_OR_COPY_PAR(WriteIVFHeaders); SET_OR_COPY_PAR(QIndexDeltaLumaDC); SET_OR_COPY_PAR(QIndexDeltaChromaAC); SET_OR_COPY_PAR(QIndexDeltaChromaDC); SET_OR_COPY_PAR(NumTileRows); SET_OR_COPY_PAR(NumTileColumns); } inline void SetOrCopy(mfxExtCodingOption2 *pDst, mfxExtCodingOption2 const *pSrc = 0, bool /*zeroDst*/ = true) { SET_OR_COPY_PAR(MBBRC); } inline void SetOrCopy(mfxExtCodingOption3 *pDst, mfxExtCodingOption3 const *pSrc = 0, bool /*zeroDst*/ = true) { (void)pSrc; (void)pDst; SET_OR_COPY_PAR(TargetChromaFormatPlus1); SET_OR_COPY_PAR(TargetBitDepthLuma); SET_OR_COPY_PAR(TargetBitDepthChroma); COPY_PTR(ScenarioInfo); } inline void SetOrCopy(mfxExtVP9Segmentation *pDst, mfxExtVP9Segmentation const *pSrc = 0, bool zeroDst = true) { SET_OR_COPY_PAR_DONT_INHERIT(NumSegments); SET_OR_COPY_PAR(SegmentIdBlockSize); SET_OR_COPY_PAR(NumSegmentIdAlloc); for (mfxU8 i = 0; i < MAX_SEGMENTS; i++) { SET_OR_COPY_PAR_DONT_INHERIT(Segment[i].FeatureEnabled); SET_OR_COPY_PAR_DONT_INHERIT(Segment[i].ReferenceFrame); SET_OR_COPY_PAR_DONT_INHERIT(Segment[i].LoopFilterLevelDelta); SET_OR_COPY_PAR_DONT_INHERIT(Segment[i].QIndexDelta); } COPY_PTR(SegmentId); } inline void SetOrCopy(mfxExtVP9TemporalLayers *pDst, mfxExtVP9TemporalLayers const *pSrc = 0, bool zeroDst = true) { for (mfxU8 i = 0; i < MAX_NUM_TEMP_LAYERS; i++) { SET_OR_COPY_PAR_DONT_INHERIT(Layer[i].FrameRateScale); SET_OR_COPY_PAR_DONT_INHERIT(Layer[i].TargetKbps); } } inline void SetOrCopy(mfxExtCodingOptionDDI *pDst, mfxExtCodingOptionDDI const *pSrc = 0, bool /*zeroDst*/ = true) { SET_OR_COPY_PAR(RefreshFrameContext); SET_OR_COPY_PAR(ChangeFrameContextIdxForTS); SET_OR_COPY_PAR(SuperFrameForTS); } template inline mfxStatus SetOrCopySupportedParams(T* pDst, T const *pSrc = 0, bool zeroDst = true) { MFX_CHECK_NULL_PTR1(pDst); if (zeroDst) { ZeroExtBuffer(*pDst); } SetOrCopy(pDst, pSrc, zeroDst); return MFX_ERR_NONE; } template<> inline mfxStatus SetOrCopySupportedParams(mfxInfoMFX* pDst, mfxInfoMFX const *pSrc, bool zeroDst) { MFX_CHECK_NULL_PTR1(pDst); if (zeroDst) { Zero(*pDst); } SetOrCopy(pDst, pSrc, zeroDst); return MFX_ERR_NONE; } #define SET_SUPPORTED_PARAMS(type) \ { \ type * pExt = GetExtBuffer(par); \ if (pExt != 0) \ { \ SetOrCopySupportedParams(pExt); \ } \ } mfxStatus SetSupportedParameters(mfxVideoParam & par) { par.AsyncDepth = 1; par.IOPattern = 1; par.Protected = 0; memset(par.reserved, 0, sizeof(par.reserved)); memset(&par.reserved2, 0, sizeof(par.reserved2)); memset(&par.reserved3, 0, sizeof(par.reserved3)); // mfxInfoMfx SetOrCopySupportedParams(&par.mfx); // extended buffers mfxStatus sts = CheckExtBufferHeaders(par.NumExtParam, par.ExtParam); MFX_CHECK_STS(sts); SET_SUPPORTED_PARAMS(mfxExtVP9Param); SET_SUPPORTED_PARAMS(mfxExtCodingOption2); SET_SUPPORTED_PARAMS(mfxExtCodingOption3); SET_SUPPORTED_PARAMS(mfxExtVP9TemporalLayers); return MFX_ERR_NONE; } struct Bool { Bool(bool initValue) : value(initValue) {}; Bool & operator=(bool newValue) { value = newValue; return *this; }; bool operator==(bool valueToCheck) { return (value == valueToCheck); }; bool value; }; bool CheckTriStateOption(mfxU16 & opt) { if (opt != MFX_CODINGOPTION_UNKNOWN && opt != MFX_CODINGOPTION_ON && opt != MFX_CODINGOPTION_OFF) { opt = MFX_CODINGOPTION_UNKNOWN; return false; } return true; } template bool CheckRange(T & opt, U min, U max) { if (opt < min) { opt = static_cast(min); return false; } if (opt > max) { opt = static_cast(max); return false; } return true; } template bool CheckRangeDflt(T & opt, U min, U max, U deflt) { if (opt < static_cast(min) || opt > static_cast(max)) { opt = static_cast(deflt); return false; } return true; } #define INHERIT_DEFAULTS(type, zeroDst) \ { \ type& dst = GetExtBufferRef(defaultsDst); \ type& src = GetExtBufferRef(defaultsSrc); \ SetOrCopySupportedParams(&dst, &src, zeroDst); \ } void InheritDefaults(VP9MfxVideoParam& defaultsDst, VP9MfxVideoParam const & defaultsSrc) { // inherit default from mfxInfoMfx SetOrCopySupportedParams(&defaultsDst.mfx, &defaultsSrc.mfx, false); INHERIT_DEFAULTS(mfxExtVP9Param, false); INHERIT_DEFAULTS(mfxExtCodingOption2, false); INHERIT_DEFAULTS(mfxExtCodingOption3, false); mfxExtVP9Segmentation* pSegDst = GetExtBuffer(defaultsDst); mfxExtVP9Segmentation* pSegSrc = GetExtBuffer(defaultsSrc); if (defaultsDst.m_segBufPassed == true) { mfxU16 numSegmentsDst = pSegDst->NumSegments; if (numSegmentsDst != 0) { // NumSegments set to 0 means disabling of segmentation // so there is no need to inherit any segmentation paramaters SetOrCopySupportedParams(pSegDst, pSegSrc, false); } } else { SetOrCopySupportedParams(pSegDst, pSegSrc); } INHERIT_DEFAULTS(mfxExtVP9TemporalLayers, !defaultsDst.m_tempLayersBufPassed); INHERIT_DEFAULTS(mfxExtCodingOptionDDI, false); } #define CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(type) \ { \ type& tmpBuf = GetExtBufferRef(tmp); \ type& inBuf = GetExtBufferRef(par); \ SetOrCopySupportedParams(&inBuf, &tmpBuf); \ if (memcmp(&inBuf, &tmpBuf, sizeof(type))) \ { \ sts = MFX_ERR_UNSUPPORTED; \ } \ } mfxStatus CleanOutNonconfigurableParameters(VP9MfxVideoParam &par) { VP9MfxVideoParam tmp = par; mfxStatus sts = SetOrCopySupportedParams(&par.mfx, &tmp.mfx); MFX_CHECK_STS(sts); if (memcmp(&par.mfx, &tmp.mfx, sizeof(mfxInfoMFX))) { sts = MFX_ERR_UNSUPPORTED; } CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(mfxExtVP9Param); CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(mfxExtCodingOption2); CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(mfxExtCodingOption3); CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(mfxExtVP9Segmentation); CLEAN_OUT_NONCONFIGURABLE_PARAMETERS(mfxExtVP9TemporalLayers); MFX_RETURN(sts); } bool IsBrcModeSupported(mfxU16 brc) { return brc == MFX_RATECONTROL_CBR || brc == MFX_RATECONTROL_VBR || brc == MFX_RATECONTROL_CQP || brc == MFX_RATECONTROL_ICQ; } bool IsChromaFormatSupported(mfxU16 profile, mfxU16 chromaFormat) { switch (profile) { case MFX_PROFILE_VP9_0: case MFX_PROFILE_VP9_2: return chromaFormat == MFX_CHROMAFORMAT_YUV420; case MFX_PROFILE_VP9_1: case MFX_PROFILE_VP9_3: return chromaFormat == MFX_CHROMAFORMAT_YUV420 || chromaFormat == MFX_CHROMAFORMAT_YUV444; } return false; } bool IsBitDepthSupported(mfxU16 profile, mfxU16 bitDepth) { switch (profile) { case MFX_PROFILE_VP9_0: case MFX_PROFILE_VP9_1: return bitDepth == BITDEPTH_8; case MFX_PROFILE_VP9_2: case MFX_PROFILE_VP9_3: return bitDepth == 8 || bitDepth == BITDEPTH_10; } return false; } mfxU16 GetChromaFormat(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_P010: return MFX_CHROMAFORMAT_YUV420; case MFX_FOURCC_AYUV: case MFX_FOURCC_Y410: return MFX_CHROMAFORMAT_YUV444; default: return 0; } } mfxU16 GetBitDepth(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_AYUV: return BITDEPTH_8; case MFX_FOURCC_Y410: case MFX_FOURCC_P010: return BITDEPTH_10; default: return 0; } } // check bit depth itself and it's compliance with fourcc bool CheckBitDepth(mfxU16 depth, mfxU32 fourcc) { if (depth != 0 && ((depth != BITDEPTH_8 && depth != BITDEPTH_10) || (fourcc != 0 && depth != GetBitDepth(fourcc)))) { return false; } return true; } // check chroma format itself and it's compliance with fourcc bool CheckChromaFormat(mfxU16 format, mfxU32 fourcc) { if ((format != MFX_CHROMAFORMAT_YUV420 && format != MFX_CHROMAFORMAT_YUV444) || (fourcc != 0 && format != GetChromaFormat(fourcc))) { return false; } return true; } bool CheckFourcc(mfxU32 fourcc, ENCODE_CAPS_VP9 const &caps) { return fourcc == MFX_FOURCC_NV12 || (fourcc == MFX_FOURCC_AYUV && caps.YUV444ReconSupport) // 8 bit || (caps.MaxEncodedBitDepth > 0 && (fourcc == MFX_FOURCC_P010 // 10 bit || (fourcc == MFX_FOURCC_Y410 && caps.YUV444ReconSupport))); } mfxU16 MapTUToSupportedRange(mfxU16 tu) { switch (tu) { case MFX_TARGETUSAGE_1: case MFX_TARGETUSAGE_2: return MFX_TARGETUSAGE_BEST_QUALITY; case MFX_TARGETUSAGE_3: case MFX_TARGETUSAGE_4: case MFX_TARGETUSAGE_5: return MFX_TARGETUSAGE_BALANCED; case MFX_TARGETUSAGE_6: case MFX_TARGETUSAGE_7: return MFX_TARGETUSAGE_BEST_SPEED; default: return MFX_TARGETUSAGE_UNKNOWN; } } inline bool IsFeatureSupported(ENCODE_CAPS_VP9 const & caps, mfxU8 feature) { return (caps.SegmentFeatureSupport & (1 << feature)) != 0; } inline void Disable(mfxU16& features, mfxU8 feature) { features &= ~(1 << feature); } inline bool CheckFeature(mfxU16& features, mfxI16* featureValue, mfxU8 feature, ENCODE_CAPS_VP9 const & caps) { bool status = true; // check QIndex feature if (IsFeatureEnabled(features, feature) && !IsFeatureSupported(caps, feature)) { Disable(features, feature); status = false; } if (featureValue && *featureValue && !IsFeatureEnabled(features, feature)) { *featureValue = 0; status = false; } return status; } bool CheckAndFixQIndexDelta(mfxI16& qIndexDelta, mfxU16 qIndex) { mfxI16 minQIdxDelta = qIndex ? 1 - qIndex : 1 - MAX_Q_INDEX; mfxI16 maxQIdxDelta = MAX_Q_INDEX - qIndex; // if Q index is OK, but Q index value + delta is out of valid range - clamp Q index delta return Clamp(qIndexDelta, minQIdxDelta, maxQIdxDelta); } mfxStatus CheckPerSegmentParams(mfxVP9SegmentParam& segPar, ENCODE_CAPS_VP9 const & caps, mfxInfoMFX &video_par, mfxEncodeCtrl *ctrl_par = nullptr) { Bool changed = false; mfxU16& features = segPar.FeatureEnabled; if (video_par.RateControlMethod == MFX_RATECONTROL_CQP) { // check QIndex feature if (false == CheckFeature(features, &segPar.QIndexDelta, FEAT_QIDX, caps)) { changed = true; } // if delta Q index value is out of valid range - just ignore it if (false == CheckRangeDflt(segPar.QIndexDelta, -MAX_Q_INDEX, MAX_Q_INDEX, 0)) { changed = true; } else { // if delta Q index value is OK, but Q index value + delta is out of valid range - clamp Q index delta if (false == CheckAndFixQIndexDelta(segPar.QIndexDelta, video_par.QPI)) { changed = true; } // if delta Q index value is OK, but Q index value + global QP + frame QP delta is out of valid range - clamp Q index delta if (ctrl_par) { mfxExtVP9Param* pExtParRuntime = GetExtBuffer(*ctrl_par); if (pExtParRuntime) { if (!CheckAndFixQIndexDelta(segPar.QIndexDelta, video_par.QPI + pExtParRuntime->QIndexDeltaLumaDC) || !CheckAndFixQIndexDelta(segPar.QIndexDelta, video_par.QPI + pExtParRuntime->QIndexDeltaChromaAC) || !CheckAndFixQIndexDelta(segPar.QIndexDelta, video_par.QPI + pExtParRuntime->QIndexDeltaChromaDC)) { changed = true; } } } } } // check LF Level feature if (false == CheckFeature(features, &segPar.LoopFilterLevelDelta, FEAT_LF_LVL, caps)) { changed = true; } if (false == CheckRangeDflt(segPar.LoopFilterLevelDelta, -MAX_LF_LEVEL, MAX_LF_LEVEL, 0)) { changed = true; } // check reference feature if (false == CheckFeature(features, reinterpret_cast(&segPar.ReferenceFrame), FEAT_REF, caps)) { changed = true; } if (segPar.ReferenceFrame && segPar.ReferenceFrame != MFX_VP9_REF_INTRA && segPar.ReferenceFrame != MFX_VP9_REF_LAST && segPar.ReferenceFrame != MFX_VP9_REF_GOLDEN && segPar.ReferenceFrame != MFX_VP9_REF_ALTREF) { segPar.ReferenceFrame = 0; changed = true; } // check skip feature if (false == CheckFeature(features, 0, FEAT_SKIP, caps)) { changed = true; } MFX_RETURN((changed == true) ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE); } mfxStatus CheckSegmentationMap(mfxU8 const * segMap, mfxU32 numSegmentIdAlloc, mfxU16 numSegments) { for (mfxU32 i = 0; i < numSegmentIdAlloc; i++) { if (segMap[i] >= numSegments) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } } return MFX_ERR_NONE; } inline mfxStatus GetCheckStatus(Bool& changed, Bool& unsupported) { if (unsupported == true) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } MFX_RETURN((changed == true) ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE); } inline void ConvertStatusToBools(Bool& changed, Bool& unsupported, mfxStatus sts) { if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { changed = true; } else if (sts == MFX_ERR_UNSUPPORTED) { unsupported = true; } } // if called with only video_par - assumed stream init, if both video_par and ctrl_par - assumed on-frame checking mfxStatus CheckSegmentationParam(mfxExtVP9Segmentation& seg, mfxU32 frameWidth, mfxU32 frameHeight, ENCODE_CAPS_VP9 const & caps, VP9MfxVideoParam const &par, mfxEncodeCtrl *ctrl_par = nullptr) { Bool changed = false; Bool unsupported = false; mfxInfoMFX video_par = par.mfx; if ((seg.NumSegments != 0 || true == AnyMandatorySegMapParam(seg)) && caps.ForcedSegmentationSupport == 0) { // driver/HW don't support segmentation // set all segmentation parameters to 0 ZeroExtBuffer(seg); unsupported = true; } if (seg.NumSegments > MAX_SEGMENTS) { // further parameter check hardly rely on NumSegments. Cannot fix value of NumSegments and then use modified value for checks. Need to drop and return MFX_ERR_UNSUPPORTED seg.NumSegments = 0; unsupported = true; } if (seg.SegmentIdBlockSize && ((seg.SegmentIdBlockSize != MFX_VP9_SEGMENT_ID_BLOCK_SIZE_64x64 && !VP9ECaps::Is32x32BlockSupported(par.m_platform)) || (seg.SegmentIdBlockSize < MFX_VP9_SEGMENT_ID_BLOCK_SIZE_32x32 && VP9ECaps::Is32x32BlockSupported(par.m_platform)))) { seg.SegmentIdBlockSize = 0; unsupported = true; } // check that NumSegmentIdAlloc is enough for given frame resolution and block size mfxU16 blockSize = MapIdToBlockSize(seg.SegmentIdBlockSize); if (seg.NumSegmentIdAlloc && blockSize && frameWidth && frameHeight) { mfxU32 widthInBlocks = (frameWidth + blockSize - 1) / blockSize; mfxU32 heightInBlocks = (frameHeight + blockSize - 1) / blockSize; mfxU32 sizeInBlocks = widthInBlocks * heightInBlocks; if (seg.NumSegmentIdAlloc && seg.NumSegmentIdAlloc < sizeInBlocks) { seg.NumSegmentIdAlloc = 0; seg.SegmentIdBlockSize = 0; unsupported = true; } } for (mfxU16 i = 0; i < seg.NumSegments; i++) { mfxStatus sts = CheckPerSegmentParams(seg.Segment[i], caps, video_par, ctrl_par); if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { changed = true; } } // clean out per-segment parameters for segments with numbers exceeding seg.NumSegments if (seg.NumSegments) { for (mfxU16 i = seg.NumSegments; i < MAX_SEGMENTS; i++) { if (seg.Segment[i].LoopFilterLevelDelta || seg.Segment[i].QIndexDelta || seg.Segment[i].ReferenceFrame) { Zero(seg.Segment[i]); changed = true; } } } // check that segmentation map contains only valid segment ids if (seg.NumSegments && seg.NumSegmentIdAlloc && seg.SegmentId) { mfxStatus sts = CheckSegmentationMap(seg.SegmentId, seg.NumSegmentIdAlloc, seg.NumSegments); if (sts == MFX_ERR_UNSUPPORTED) { seg.SegmentId = 0; unsupported = true; } } // corner cases checks if (seg.NumSegments == 1) { // corner case: only one segment is set // segmentation doesn't make sense here, because one segment covers whole frame and all params can be applied directly to frame if (seg.Segment[0].QIndexDelta) { if (ctrl_par == nullptr) { // global segmentation if (video_par.RateControlMethod == MFX_RATECONTROL_CQP) { // CQP: apply segment's QP_delta to global QP and disable segmentation CheckAndFixQIndexDelta(seg.Segment[0].QIndexDelta, video_par.QPI); video_par.QPI += seg.Segment[0].QIndexDelta; CheckAndFixQIndexDelta(seg.Segment[0].QIndexDelta, video_par.QPP); video_par.QPP += seg.Segment[0].QIndexDelta; } else { unsupported = true; } } else { // on-frame segmentation unsupported = true; } seg.Segment[0].QIndexDelta = 0; } seg.NumSegments = 0; changed = true; } else if (seg.NumSegments > 1) { // corner case: several segments are set but no segment params // segmentation doesn't make sense because no actual changes are applied Bool enabled_deltas = false; for (mfxU16 i = 0; i < seg.NumSegments; i++) { if (seg.Segment[i].QIndexDelta || seg.Segment[i].LoopFilterLevelDelta || seg.Segment[i].FeatureEnabled || seg.Segment[i].ReferenceFrame) { enabled_deltas = true; break; } } if (enabled_deltas == false) { seg.NumSegments = 0; changed = true; } } MFX_RETURN(GetCheckStatus(changed, unsupported)); } mfxStatus CheckTemporalLayers(VP9MfxVideoParam& par, ENCODE_CAPS_VP9 const & caps) { Bool changed = false; Bool unsupported = false; if (par.m_layerParam[0].Scale && par.m_layerParam[0].Scale != 1) { par.m_layerParam[0].Scale = 0; unsupported = true; } mfxU8 i = 0; mfxU16 prevScale = 0; mfxU32 prevBitrate = 0; par.m_numLayers = 0; bool gapsInScales = false; for (; i < MAX_NUM_TEMP_LAYERS_SUPPORTED; i++) { mfxU16& scale = par.m_layerParam[i].Scale; mfxU32& bitrate = par.m_layerParam[i].targetKbps; if (scale) { if (prevScale && (scale <= prevScale || scale % prevScale)) { scale = 0; unsupported = true; } else { prevScale = scale; } } else { gapsInScales = true; } if (bitrate) { if (par.mfx.RateControlMethod && false == IsBitrateBasedBRC(par.mfx.RateControlMethod)) { bitrate = 0; changed = true; } else { if (caps.TemporalLayerRateCtrl == 0 || bitrate <= prevBitrate) { bitrate = 0; unsupported = true; } else { prevBitrate = bitrate; } } } if (scale && !gapsInScales) { par.m_numLayers++; } } if (unsupported == true) { par.m_numLayers = 0; } if (par.m_numLayers) { mfxU16 temporalCycleLenght = par.m_layerParam[par.m_numLayers - 1].Scale; if (par.mfx.GopPicSize && par.mfx.GopPicSize < temporalCycleLenght) { par.m_numLayers = 0; i = 0; changed = true; } } for (; i < MAX_NUM_TEMP_LAYERS; i++) { if (par.m_layerParam[i].Scale != 0 || par.m_layerParam[i].targetKbps != 0) { Zero(par.m_layerParam[i]); changed = true; } } MFX_RETURN(GetCheckStatus(changed, unsupported)); } inline mfxU16 MinRefsForTemporalLayers(mfxU16 numTL) { if (numTL < 3) { return 1; } else { return numTL - 1; } } bool CheckAndFixCTQIdxDeltas(mfxExtVP9Param& extPar) { bool isOk = true; if (false == CheckRangeDflt(extPar.QIndexDeltaLumaDC, -MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, 0)) isOk = false; if (false == CheckRangeDflt(extPar.QIndexDeltaChromaAC, -MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, 0)) isOk = false; if (false == CheckRangeDflt(extPar.QIndexDeltaChromaDC, -MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, MAX_ABS_COEFF_TYPE_Q_INDEX_DELTA, 0)) isOk = false; return isOk; } bool CheckAndFixCTQIdxDeltasQPBased(mfxExtVP9Param& extPar, mfxU16 qIndex) { bool isOk = true; if (false == CheckAndFixQIndexDelta(extPar.QIndexDeltaLumaDC, qIndex)) isOk = false; if (false == CheckAndFixQIndexDelta(extPar.QIndexDeltaChromaAC, qIndex)) isOk = false; if (false == CheckAndFixQIndexDelta(extPar.QIndexDeltaChromaDC, qIndex)) isOk = false; return isOk; } template inline bool SetDefault(T &par, int defaultValue) { bool defaultSet = false; if (par == 0) { par = (T)defaultValue; defaultSet = true; } return defaultSet; } template inline bool SetTwoDefaults(T &par1, T &par2, int defaultValue1, int defaultValue2) { bool defaultsSet = false; if (par1 == 0 && par2 == 0) { par1 = (T)defaultValue1; par2 = (T)defaultValue2; defaultsSet = true; } return defaultsSet; } mfxStatus CheckParameters(VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps) { Bool changed = false; Bool unsupported = false; if (par.mfx.LowPower != MFX_CODINGOPTION_UNKNOWN && par.mfx.LowPower != MFX_CODINGOPTION_ON && par.mfx.LowPower != MFX_CODINGOPTION_OFF) { par.mfx.LowPower = MFX_CODINGOPTION_ON; changed = true; } if (par.mfx.LowPower == MFX_CODINGOPTION_OFF) { par.mfx.LowPower = MFX_CODINGOPTION_ON; } // clean out non-configurable params but do not return any errors on that (ignore mode) /*mfxStatus err = */CleanOutNonconfigurableParameters(par); if ( par.IOPattern && par.IOPattern != MFX_IOPATTERN_IN_VIDEO_MEMORY && par.IOPattern != MFX_IOPATTERN_IN_SYSTEM_MEMORY) { par.IOPattern = 0; unsupported = true; } if (par.Protected != 0) { par.Protected = 0; unsupported = true; } // check mfxInfoMfx double frameRate = 0.0; mfxFrameInfo& fi = par.mfx.FrameInfo; if ((fi.Width & 0x0f) != 0 || (fi.Height & 0x0f) != 0) { fi.Width = 0; fi.Height = 0; unsupported = true; } if (fi.Width > caps.MaxPicWidth) { fi.Width = 0; unsupported = true; } if (fi.Height > caps.MaxPicHeight) { fi.Height = 0; unsupported = true; } //VP9 doesn't support CropX, CropY due to absence of syntax in bitstream header if ((fi.Width && (fi.CropW > fi.Width)) || (fi.Height && (fi.CropH > fi.Height)) || fi.CropX || fi.CropY) { fi.CropW = 0; fi.CropH = 0; fi.CropX = 0; fi.CropY = 0; unsupported = true; } if ((fi.FrameRateExtN == 0) != (fi.FrameRateExtD == 0)) { fi.FrameRateExtN = 0; fi.FrameRateExtD = 0; unsupported = true; } if (fi.FrameRateExtD != 0) { frameRate = (double)fi.FrameRateExtN / (double)fi.FrameRateExtD; } if (fi.FrameRateExtD != 0 && (frameRate < 1.0 || frameRate > 180.0)) { fi.FrameRateExtN = 0; fi.FrameRateExtD = 0; unsupported = true; } if (fi.AspectRatioH != 0 || fi.AspectRatioW != 0) { if (!(fi.AspectRatioH == 1 && fi.AspectRatioW == 1)) { fi.AspectRatioH = 1; fi.AspectRatioW = 1; changed = true; } } if (fi.PicStruct > MFX_PICSTRUCT_PROGRESSIVE) { fi.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; unsupported = true; } { mfxExtCodingOption3& opt3 = GetExtBufferRef(par); mfxU32& fourcc = fi.FourCC; mfxU16& inFormat = fi.ChromaFormat; mfxU16& inDepthLuma = fi.BitDepthLuma; mfxU16& inDepthChroma = fi.BitDepthChroma; mfxU16& profile = par.mfx.CodecProfile; mfxU16& outFormatP1 = opt3.TargetChromaFormatPlus1; mfxU16& outDepthLuma = opt3.TargetBitDepthLuma; mfxU16& outDepthChroma = opt3.TargetBitDepthChroma; if (fourcc != 0 && false == CheckFourcc(fourcc, caps)) { fourcc = 0; unsupported = true; } if (false == CheckChromaFormat(inFormat, fourcc)) { inFormat = 0; unsupported = true; } if (false == CheckBitDepth(inDepthLuma, fourcc)) { inDepthLuma = 0; unsupported = true; } if (false == CheckBitDepth(inDepthChroma, fourcc)) { inDepthChroma = 0; unsupported = true; } if (inDepthLuma != 0 && inDepthChroma != 0 && inDepthLuma != inDepthChroma) { inDepthChroma = 0; unsupported = true; } if (fi.Shift != 0 && fourcc != MFX_FOURCC_P010 ) { fi.Shift = 0; unsupported = true; } if (outFormatP1 != 0 && false == CheckChromaFormat(outFormatP1 - 1, fourcc)) { outFormatP1 = 0; unsupported = true; } if (false == CheckBitDepth(outDepthLuma, fourcc)) { outDepthLuma = 0; unsupported = true; } if (false == CheckBitDepth(outDepthChroma, fourcc)) { outDepthChroma = 0; unsupported = true; } if (outDepthLuma != 0 && outDepthChroma != 0 && outDepthLuma != outDepthChroma) { outDepthChroma = 0; unsupported = true; } // check compliance of profile and chroma format, bit depth if (profile != 0) { if (outFormatP1 != 0 && false == IsChromaFormatSupported(profile, outFormatP1 - 1)) { outFormatP1 = 0; unsupported = true; } if (outDepthLuma != 0 && false == IsBitDepthSupported(profile, outDepthLuma)) { outDepthLuma = 0; unsupported = true; } if (outDepthChroma != 0 && false == IsBitDepthSupported(profile, outDepthChroma)) { outDepthChroma = 0; unsupported = true; } } } if (par.mfx.NumThread > 1) { par.mfx.NumThread = 1; changed = true; } if (par.mfx.TargetUsage) { par.mfx.TargetUsage = MapTUToSupportedRange(par.mfx.TargetUsage); if (par.mfx.TargetUsage == MFX_TARGETUSAGE_UNKNOWN) { unsupported = true; } } if (par.mfx.GopRefDist > 1) { par.mfx.GopRefDist = 1; changed = true; } mfxStatus tlSts = CheckTemporalLayers(par, caps); ConvertStatusToBools(changed, unsupported, tlSts); mfxU16& brcMode = par.mfx.RateControlMethod; mfxExtCodingOption2& opt2 = GetExtBufferRef(par); if (brcMode != 0) { if (false == IsBrcModeSupported(brcMode)) { brcMode = 0; par.m_initialDelayInKb = 0; par.m_bufferSizeInKb = 0; par.m_targetKbps = 0; par.m_maxKbps = 0; par.mfx.BRCParamMultiplier = 0; unsupported = true; } else if (IsBitrateBasedBRC(brcMode)) { if (par.m_numLayers) { const mfxU32 bitrateForTopTempLayer = par.m_layerParam[par.m_numLayers - 1].targetKbps; if (bitrateForTopTempLayer && par.m_targetKbps && bitrateForTopTempLayer != par.m_targetKbps) { par.m_targetKbps = bitrateForTopTempLayer; changed = true; } } if ((brcMode == MFX_RATECONTROL_CBR && par.m_maxKbps && par.m_maxKbps != par.m_targetKbps) || (brcMode == MFX_RATECONTROL_VBR && par.m_maxKbps && par.m_maxKbps < par.m_targetKbps)) { par.m_maxKbps = par.m_targetKbps; changed = true; } if (IsBufferBasedBRC(brcMode) && par.m_bufferSizeInKb && par.m_initialDelayInKb > par.m_bufferSizeInKb) { par.m_initialDelayInKb = 0; unsupported = true; } } else if (brcMode == MFX_RATECONTROL_CQP) { if (par.mfx.QPI > MAX_Q_INDEX) { par.mfx.QPI = MAX_Q_INDEX; changed = true; } if (par.mfx.QPP > MAX_Q_INDEX) { par.mfx.QPP = MAX_Q_INDEX; changed = true; } if (par.mfx.QPB > 0) { par.mfx.QPB = 0; changed = true; } if (par.mfx.BRCParamMultiplier > 1) { par.mfx.BRCParamMultiplier = 1; changed = true; } } else if (brcMode == MFX_RATECONTROL_ICQ) { if (par.mfx.ICQQuality > MAX_ICQ_QUALITY_INDEX) { par.mfx.ICQQuality = MAX_ICQ_QUALITY_INDEX; changed = true; } } } if (par.m_numLayers == 0) { // VP9 spec allows to store up to 8 reference frames. // this VP9 implementation use maximum 3 of 8 so far. // we don't need to allocate more if really only 3 are used. mfxU16 maxSupportedNumRef = std::min(static_cast(caps.MaxNum_Reference0), DPB_SIZE_REAL); if (par.mfx.NumRefFrame > maxSupportedNumRef) { par.mfx.NumRefFrame = maxSupportedNumRef; changed = true; } // For targetUsage 1: MaxNum_Reference is 3 // For targetUsage 4: MaxNum_Reference is 2 // For targetUsage 7: MaxNum_Reference is 1 mfxU16 RefActiveP = 3; if (par.mfx.TargetUsage) { if (par.mfx.TargetUsage == MFX_TARGETUSAGE_BALANCED) { RefActiveP = 2; } else if (par.mfx.TargetUsage == MFX_TARGETUSAGE_BEST_SPEED) { RefActiveP = 1; } } if (par.mfx.NumRefFrame > RefActiveP) { par.mfx.NumRefFrame = RefActiveP; changed = true; } SetDefault(par.mfx.NumRefFrame, std::min(maxSupportedNumRef, RefActiveP)); } else { if (par.mfx.NumRefFrame && par.mfx.NumRefFrame < MinRefsForTemporalLayers(par.m_numLayers)) { par.mfx.NumRefFrame = MinRefsForTemporalLayers(par.m_numLayers); changed = true; } } mfxExtCodingOptionDDI &opt = GetExtBufferRef(par); if (false == CheckTriStateOption(opt.WriteIVFHeaders)) { changed = true; } mfxExtVP9Param &extPar = GetExtBufferRef(par); if (extPar.FrameWidth % 2) { extPar.FrameWidth = 0; unsupported = true; } if (extPar.FrameHeight % 2) { extPar.FrameHeight = 0; unsupported = true; } if (extPar.FrameHeight && extPar.FrameHeight > caps.MaxPicHeight) { extPar.FrameHeight = 0; unsupported = true; } if (extPar.FrameWidth && extPar.FrameWidth > caps.MaxPicWidth) { extPar.FrameWidth = 0; unsupported = true; } if (extPar.FrameWidth && fi.Width && extPar.FrameWidth > fi.Width) { extPar.FrameWidth = 0; unsupported = true; } if (extPar.FrameHeight && fi.Height && extPar.FrameHeight > fi.Height) { extPar.FrameHeight = 0; unsupported = true; } /*if (extPar.FrameWidth && (fi.CropX + fi.CropW > extPar.FrameWidth) || extPar.FrameHeight && (fi.CropY + fi.CropH > extPar.FrameHeight)) { fi.CropX = 0; fi.CropW = 0; fi.CropY = 0; fi.CropH = 0; unsupported = true; }*/ if (false == CheckAndFixCTQIdxDeltas(extPar)) { changed = true; } if (brcMode == MFX_RATECONTROL_CQP) { if (false == CheckAndFixCTQIdxDeltasQPBased(extPar, par.mfx.QPI)) { changed = true; } if (false == CheckAndFixCTQIdxDeltasQPBased(extPar, par.mfx.QPP)) { changed = true; } } // check mfxExtCodingOption2 if (false == CheckTriStateOption(opt2.MBBRC)) { changed = true; } if (IsOn(opt2.MBBRC) && caps.AutoSegmentationSupport == 0) { opt2.MBBRC = MFX_CODINGOPTION_OFF; unsupported = true; } if (brcMode == MFX_RATECONTROL_CQP && IsOn(opt2.MBBRC)) { opt2.MBBRC = MFX_CODINGOPTION_OFF; changed = true; } mfxU16 width = extPar.FrameWidth ? extPar.FrameWidth : fi.Width; mfxU16 height = extPar.FrameHeight ? extPar.FrameHeight : fi.Height; mfxExtVP9Segmentation& seg = GetExtBufferRef(par); mfxStatus segSts = CheckSegmentationParam(seg, width, height, caps, par); ConvertStatusToBools(changed, unsupported, segSts); if (IsOn(opt2.MBBRC) && seg.NumSegments) { // explicit segmentation overwrites MBBRC opt2.MBBRC = MFX_CODINGOPTION_OFF; changed = true; } mfxU16& rows = extPar.NumTileRows; mfxU16& cols = extPar.NumTileColumns; if (rows * cols > 1 && caps.TileSupport == 0) { rows = cols = 1; unsupported = true; } if (rows && height) { mfxU16 heightInTiles = static_cast(CeilDiv(height, MIN_TILE_HEIGHT)); mfxU16 maxPossibleRows = std::min(heightInTiles, MAX_NUM_TILE_ROWS_VP9); if (rows > maxPossibleRows) { rows = maxPossibleRows; changed = true; } if (rows) { mfxU16 lowerPowOf2 = (1 << FloorLog2(rows)); if (rows != lowerPowOf2) { rows = lowerPowOf2; changed = true; } } } if (cols && width) { mfxU16 widthInMinTileCols = static_cast(CeilDiv(width, MIN_TILE_WIDTH)); mfxU16 maxPossibleCols = std::min(widthInMinTileCols, MAX_NUM_TILES); if (cols > maxPossibleCols) { cols = maxPossibleCols; changed = true; } mfxU16 lowerPowOf2 = (1 << FloorLog2(cols)); mfxU16 correctValue = lowerPowOf2; mfxU16 minPossibleCols = static_cast(CeilDiv(width, MAX_TILE_WIDTH)); if (cols < minPossibleCols) { cols = minPossibleCols; changed = true; mfxU16 higherPowOf2 = (1 << CeilLog2(cols)); correctValue = higherPowOf2; } if (cols != correctValue) { cols = correctValue; changed = true; } } if (rows * cols > MAX_NUM_TILES) { cols = 0; rows = 0; unsupported = true; } // KNOWN FEATURES LIMITATIONS: // temporal scalability and tiles don't work together if (par.m_numLayers > 1 && (rows > 1 || cols > 1)) { rows = cols = 1; unsupported = true; } MFX_RETURN(GetCheckStatus(changed, unsupported)); } inline mfxU32 GetDefaultBufferSize(VP9MfxVideoParam const &par) { if (IsBufferBasedBRC(par.mfx.RateControlMethod)) { const mfxU8 defaultBufferInSec = 2; return defaultBufferInSec * ((par.m_targetKbps + 7) / 8); } else { const mfxExtVP9Param& extPar = GetExtBufferRef(par); if (par.mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || par.mfx.FrameInfo.FourCC == MFX_FOURCC_Y410) { return (extPar.FrameWidth * extPar.FrameHeight * 3) / 1000; // size of two uncompressed 420 8bit frames in KB } else return (extPar.FrameWidth * extPar.FrameHeight * 3) / 2 / 1000; // size of uncompressed 420 8bit frame in KB } } inline mfxU16 GetDefaultAsyncDepth(VP9MfxVideoParam const &/*par*/) { return 5; } inline mfxU16 GetMinProfile(mfxU16 depth, mfxU16 format) { return MFX_PROFILE_VP9_0 + (depth > 8) * 2 + (format > MFX_CHROMAFORMAT_YUV420); } void SetDefaultsForProfileAndFrameInfo(VP9MfxVideoParam& par) { mfxFrameInfo& fi = par.mfx.FrameInfo; SetDefault(fi.ChromaFormat, GetChromaFormat(fi.FourCC)); SetDefault(fi.BitDepthLuma, GetBitDepth(fi.FourCC)); SetDefault(fi.BitDepthChroma, GetBitDepth(fi.FourCC)); mfxExtCodingOption3 &opt3 = GetExtBufferRef(par); SetDefault(opt3.TargetChromaFormatPlus1, fi.ChromaFormat + 1); SetDefault(opt3.TargetBitDepthLuma, fi.BitDepthLuma); SetDefault(opt3.TargetBitDepthChroma, fi.BitDepthChroma); SetDefault(par.mfx.CodecProfile, GetMinProfile(opt3.TargetBitDepthLuma, opt3.TargetChromaFormatPlus1 - 1)); } #define DEFAULT_GOP_SIZE 0xffff #define DEFAULT_FRAME_RATE 30 mfxStatus SetDefaults( VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps) { SetDefault(par.AsyncDepth, GetDefaultAsyncDepth(par)); // mfxInfoMfx SetDefault(par.mfx.TargetUsage, MFX_TARGETUSAGE_BALANCED); SetDefault(par.mfx.GopPicSize, DEFAULT_GOP_SIZE); SetDefault(par.mfx.GopRefDist, 1); SetDefault(par.mfx.NumRefFrame, 1); SetDefault(par.mfx.BRCParamMultiplier, 1); SetDefault(par.mfx.LowPower, MFX_CODINGOPTION_ON); SetDefault(par.mfx.NumThread, 1); if (par.mfx.TargetKbps && (par.mfx.TargetKbps < par.mfx.MaxKbps)) { SetDefault(par.mfx.RateControlMethod, MFX_RATECONTROL_VBR); } else { SetDefault(par.mfx.RateControlMethod, MFX_RATECONTROL_CBR); } if (IsBitrateBasedBRC(par.mfx.RateControlMethod)) { if (par.m_numLayers) { const mfxU32 bitrateForTopTempLayer = par.m_layerParam[par.m_numLayers - 1].targetKbps; SetDefault(par.m_targetKbps, bitrateForTopTempLayer); } SetDefault(par.m_maxKbps, par.m_targetKbps); } // mfxInfomfx.FrameInfo mfxFrameInfo &fi = par.mfx.FrameInfo; mfxExtVP9Param& extPar = GetExtBufferRef(par); if (extPar.FrameWidth) { SetDefault(fi.CropW, std::min(fi.Width, extPar.FrameWidth)); } else { SetDefault(fi.CropW, fi.Width); SetDefault(extPar.FrameWidth, fi.CropW); } if (extPar.FrameHeight) { SetDefault(fi.CropH, std::min(fi.Height, extPar.FrameHeight)); } else { SetDefault(fi.CropH, fi.Height); SetDefault(extPar.FrameHeight, fi.CropH); } SetDefault(par.m_bufferSizeInKb, GetDefaultBufferSize(par)); if (IsBufferBasedBRC(par.mfx.RateControlMethod)) { SetDefault(par.m_initialDelayInKb, par.m_bufferSizeInKb / 2); } if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { SetDefault(par.mfx.QPI, 128); SetDefault(par.mfx.QPP, par.mfx.QPI + 5); } mfxExtCodingOption2& opt2 = GetExtBufferRef(par); /*mfxExtVP9Segmentation& seg = GetExtBufferRef(par); if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP && caps.AutoSegmentationSupport && !AllMandatorySegMapParams(seg)) { SetDefault(opt2.MBBRC, MFX_CODINGOPTION_ON); } else { SetDefault(opt2.MBBRC, MFX_CODINGOPTION_OFF); }*/ // by default disable auto-segmentation (aka MBBRC) for all configurations and platforms SetDefault(opt2.MBBRC, MFX_CODINGOPTION_OFF); if (false == SetTwoDefaults(fi.FrameRateExtN, fi.FrameRateExtD, 30, 1)) { SetDefault(fi.FrameRateExtN, fi.FrameRateExtD * DEFAULT_FRAME_RATE); SetDefault(fi.FrameRateExtD, fi.FrameRateExtN % DEFAULT_FRAME_RATE == 0 ? fi.FrameRateExtN / DEFAULT_FRAME_RATE : 1); } SetTwoDefaults(fi.AspectRatioW, fi.AspectRatioH, 1, 1); SetDefault(fi.PicStruct, MFX_PICSTRUCT_PROGRESSIVE); // profile, chroma format, bit depth SetDefaultsForProfileAndFrameInfo(par); SetDefault(extPar.NumTileColumns, (extPar.FrameWidth + MAX_TILE_WIDTH - 1) / MAX_TILE_WIDTH); SetDefault(extPar.NumTileRows, 1); // ext buffers mfxExtCodingOptionDDI &opt = GetExtBufferRef(par); SetDefault(opt.WriteIVFHeaders, MFX_CODINGOPTION_ON); // check final set of parameters mfxStatus sts = CheckParameters(par, caps); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CheckParametersAndSetDefaults( VP9MfxVideoParam &par, ENCODE_CAPS_VP9 const &caps) { mfxStatus sts = MFX_ERR_NONE; // check parameters defined by application mfxStatus checkSts = MFX_ERR_NONE; checkSts = CheckParameters(par, caps); if (checkSts == MFX_ERR_UNSUPPORTED) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // check presence of mandatory parameters // (1) resolution mfxFrameInfo const &fi = par.mfx.FrameInfo; if (fi.Width == 0 || fi.Height == 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // (2) fourcc if (fi.FourCC == 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // (3) target bitrate if ((IsBitrateBasedBRC(par.mfx.RateControlMethod) || par.mfx.RateControlMethod == 0) && par.m_numLayers == 0 && par.m_targetKbps == 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // (4) crops if ((fi.CropW == 0) != (fi.CropH == 0)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } mfxExtVP9Param& extPar = GetExtBufferRef(par); if ((extPar.FrameWidth == 0) != (extPar.FrameHeight == 0)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // (6) Mandatory segmentation parameters mfxExtVP9Segmentation const & seg = GetExtBufferRef(par); if (AnyMandatorySegMapParam(seg) && seg.NumSegments != 0 && !AllMandatorySegMapParams(seg)) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } // (7) At least one valid layer for temporal scalability if (par.m_tempLayersBufPassed && par.m_numLayers == 0) { mfxExtVP9TemporalLayers const & tl = GetExtBufferRef(par); for (mfxU8 i = 0; i < MAX_NUM_TEMP_LAYERS_SUPPORTED; i++) { if (tl.Layer[i].FrameRateScale != 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } } // (8) Bitrates for all temporal layers in case of bitrate-based BRC if (par.m_numLayers && (IsBitrateBasedBRC(par.mfx.RateControlMethod) || par.mfx.RateControlMethod == 0)) { for (mfxU8 i = 0; i < par.m_numLayers; i++) { if (par.m_layerParam[i].targetKbps == 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } } // check non-mandatory parameters which require return of WARNING if not set if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP && (par.mfx.QPI == 0 || par.mfx.QPP == 0)) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (IsBitrateBasedBRC(par.mfx.RateControlMethod) && par.m_numLayers && par.m_targetKbps == 0) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } // set defaults for parameters not defined by application sts = SetDefaults(par, caps); MFX_CHECK(sts >= 0, sts); // during parameters validation we worked with internal parameter versions // now need to update external (API) versions of these parameters par.SyncInternalParamToExternal(); MFX_RETURN(checkSts); } mfxStatus CheckSurface( VP9MfxVideoParam const & video, mfxFrameSurface1 const & surface, mfxU32 initWidth, mfxU32 initHeight, ENCODE_CAPS_VP9 const &caps) { // check that surface contains valid data MFX_CHECK(CheckFourcc(surface.Info.FourCC, caps), MFX_ERR_INVALID_VIDEO_PARAM); if (video.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY) { MFX_CHECK(!LumaIsNull(&surface) || surface.Data.MemId, MFX_ERR_NULL_PTR); if (surface.Info.FourCC != MFX_FOURCC_Y410) { MFX_CHECK(surface.Data.U != 0 || (surface.Data.MemId && LumaIsNull(&surface)), MFX_ERR_NULL_PTR); MFX_CHECK(surface.Data.V != 0 || (surface.Data.MemId && LumaIsNull(&surface)), MFX_ERR_NULL_PTR); } } const mfxExtVP9Param& extPar = GetExtBufferRef(video); MFX_CHECK(surface.Info.Width >= extPar.FrameWidth, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface.Info.Height >= extPar.FrameHeight, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface.Info.Width <= initWidth, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface.Info.Height <= initHeight, MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus CheckAndFixCtrl( VP9MfxVideoParam const & video, mfxEncodeCtrl & ctrl, ENCODE_CAPS_VP9 const & caps) { mfxStatus checkSts = MFX_ERR_NONE; // check mfxEncodeCtrl for correct parameters if (ctrl.QP > 255) { ctrl.QP = 255; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (ctrl.FrameType > MFX_FRAMETYPE_P) { ctrl.FrameType = MFX_FRAMETYPE_P; checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } mfxExtVP9Param* pExtParRuntime = GetExtBuffer(ctrl); const mfxExtVP9Param& extParInit = GetExtBufferRef(video); if (pExtParRuntime) { if (false == CheckAndFixCTQIdxDeltas(*pExtParRuntime)) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (false == CheckAndFixCTQIdxDeltasQPBased(*pExtParRuntime, ctrl.QP)) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if ((pExtParRuntime->FrameWidth && pExtParRuntime->FrameWidth != extParInit.FrameWidth) || (pExtParRuntime->FrameHeight && pExtParRuntime->FrameHeight != extParInit.FrameHeight)) { // if set, runtime values of FrameWidth/FrameHeight should be same as static values // we cannot just remove whole mfxExtVP9Param since it has other parameters // so just return warning to app to notify checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } pExtParRuntime->FrameWidth = extParInit.FrameWidth; pExtParRuntime->FrameHeight = extParInit.FrameHeight; } mfxExtVP9Segmentation* seg = GetExtBuffer(ctrl); if (seg) { bool removeSegBuffer = false; mfxExtCodingOption2 const & opt2 = GetExtBufferRef(video); mfxStatus sts = MFX_ERR_NONE; if (IsOn(opt2.MBBRC)) { // segmentation ext buffer conflicts with MBBRC. It will be ignored. removeSegBuffer = true; } else if (seg->NumSegments) { const mfxExtVP9Param& extPar = GetExtBufferRef(video); sts = CheckSegmentationParam(*seg, extPar.FrameWidth, extPar.FrameHeight, caps, video, &ctrl); if (sts == MFX_ERR_UNSUPPORTED || (true == AnyMandatorySegMapParam(*seg) && false == AllMandatorySegMapParams(*seg)) || IsOn(opt2.MBBRC) ) { // provided segmentation parameters are invalid or lack mandatory information. // Ext buffer will be ignored. Report to application about it with warning. removeSegBuffer = true; } else { if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } mfxExtVP9Segmentation const & segInit = GetExtBufferRef(video); CombineInitAndRuntimeSegmentBuffers(*seg, segInit); if (false == AllMandatorySegMapParams(*seg)) { // neither runtime ext buffer not init don't contain valid segmentation map. // Ext buffer will be ignored. Report to application about it with warning. removeSegBuffer = true; } } } if (removeSegBuffer) { // remove ext buffer from mfxEncodeCtrl // and report to application about it with warning. checkSts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; sts = RemoveExtBuffer(ctrl, MFX_EXTBUFF_VP9_SEGMENTATION); MFX_CHECK(sts >= MFX_ERR_NONE, checkSts); } } mfxExtVP9Segmentation* seg_video = GetExtBuffer(video); if (seg_video) { const mfxExtVP9Param& extParSeg = GetExtBufferRef(video); mfxStatus sts = CheckSegmentationParam(*seg_video, extParSeg.FrameWidth, extParSeg.FrameHeight, caps, video, &ctrl); MFX_CHECK_STS(sts); } MFX_RETURN(checkSts); } mfxStatus CheckBitstream( VP9MfxVideoParam const & video, mfxBitstream * bs) { MFX_CHECK_NULL_PTR1(bs); MFX_CHECK_NULL_PTR1(bs->Data); // check bitstream buffer for enough space MFX_CHECK(bs->MaxLength > 0, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK(bs->DataOffset < bs->MaxLength, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(bs->MaxLength > bs->DataOffset + bs->DataLength, MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK(bs->DataOffset + bs->DataLength + video.m_bufferSizeInKb * 1000 <= bs->MaxLength, MFX_ERR_NOT_ENOUGH_BUFFER); return MFX_ERR_NONE; } } //namespace MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/mfx_vp9_encode_hw_utils.cpp000066400000000000000000000674331443134507600331610ustar00rootroot00000000000000// Copyright (c) 2016-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vp9_encode_hw_utils.h" #include "mfx_platform_caps.h" #include "umc_defs.h" #include #include namespace MfxHwVP9Encode { VP9MfxVideoParam::VP9MfxVideoParam() : m_platform(MFX_HW_UNKNOWN) , m_targetKbps(0) , m_maxKbps(0) , m_bufferSizeInKb(0) , m_initialDelayInKb(0) , m_segBufPassed(false) , m_tempLayersBufPassed(false) , m_webRTCMode(false) , m_numLayers(0) { Zero(m_layerParam); Zero(m_extParam); Zero(m_extPar); Zero(m_extOpt2); Zero(m_extOpt3); Zero(m_extOptDDI); Zero(m_extSeg); Zero(m_extTempLayers); Zero(m_extFrameInfo); } VP9MfxVideoParam::VP9MfxVideoParam(VP9MfxVideoParam const & par) { Construct(par); } VP9MfxVideoParam::VP9MfxVideoParam(mfxVideoParam const & par) { Construct(par); } VP9MfxVideoParam::VP9MfxVideoParam(mfxVideoParam const & par, eMFXHWType const & platform) { m_platform = platform; Construct(par); } VP9MfxVideoParam& VP9MfxVideoParam::operator=(VP9MfxVideoParam const & par) { m_platform = par.m_platform; Construct(par); return *this; } VP9MfxVideoParam& VP9MfxVideoParam::operator=(mfxVideoParam const & par) { Construct(par); return *this; } void VP9MfxVideoParam::CalculateInternalParams() { m_targetKbps = m_maxKbps = m_bufferSizeInKb = m_initialDelayInKb = 0; mfxU16 mult = std::max(mfx.BRCParamMultiplier, 1); //"RateControlMethod == 0" always maps to CBR or VBR depending on TargetKbps and MaxKbps if (IsBitrateBasedBRC(mfx.RateControlMethod) || mfx.RateControlMethod == 0) { m_targetKbps = mult * mfx.TargetKbps; m_maxKbps = mult * mfx.MaxKbps; if (IsBufferBasedBRC(mfx.RateControlMethod) || mfx.RateControlMethod == 0) { m_bufferSizeInKb = mult * mfx.BufferSizeInKB; m_initialDelayInKb = mult * mfx.InitialDelayInKB; } } m_numLayers = 0; for (mfxU16 i = 0; i < MAX_NUM_TEMP_LAYERS; i++) { if (m_extTempLayers.Layer[i].FrameRateScale) { m_numLayers++; } m_layerParam[i].Scale = m_extTempLayers.Layer[i].FrameRateScale; m_layerParam[i].targetKbps = mult * m_extTempLayers.Layer[i].TargetKbps; } } void VP9MfxVideoParam::SyncInternalParamToExternal() { mfxU32 maxBrcVal32 = m_bufferSizeInKb; if (IsBitrateBasedBRC(mfx.RateControlMethod)) { maxBrcVal32 = std::max({m_maxKbps, maxBrcVal32, m_targetKbps}); if (IsBufferBasedBRC(mfx.RateControlMethod)) { maxBrcVal32 = std::max(maxBrcVal32, m_initialDelayInKb); } for (mfxU16 i = 0; i < MAX_NUM_TEMP_LAYERS; i++) { maxBrcVal32 = std::max(maxBrcVal32, m_layerParam[i].targetKbps); } } mfxU16 mult = std::max(mfx.BRCParamMultiplier, 1); if (maxBrcVal32) { mult = mfx.BRCParamMultiplier = static_cast((maxBrcVal32 + 0x10000) / 0x10000); } mfx.BufferSizeInKB = (mfxU16)CeilDiv(m_bufferSizeInKb, mult); if (IsBitrateBasedBRC(mfx.RateControlMethod)) { mfx.TargetKbps = (mfxU16)CeilDiv(m_targetKbps, mult); mfx.MaxKbps = (mfxU16)CeilDiv(m_maxKbps, mult); if (IsBufferBasedBRC(mfx.RateControlMethod)) { mfx.InitialDelayInKB = (mfxU16)CeilDiv(m_initialDelayInKb, mult); } } for (mfxU16 i = 0; i < MAX_NUM_TEMP_LAYERS; i++) { m_extTempLayers.Layer[i].FrameRateScale = m_layerParam[i].Scale; m_extTempLayers.Layer[i].TargetKbps = static_cast(CeilDiv(m_layerParam[i].targetKbps, mult)); } } void VP9MfxVideoParam::Construct(mfxVideoParam const & par) { mfxVideoParam & base = *this; base = par; Zero(m_extParam); InitExtBufHeader(m_extPar); InitExtBufHeader(m_extOpt2); InitExtBufHeader(m_extOpt3); InitExtBufHeader(m_extOptDDI); InitExtBufHeader(m_extSeg); InitExtBufHeader(m_extTempLayers); InitExtBufHeader(m_extFrameInfo); if (mfxExtVP9Param * opts = GetExtBuffer(par)) m_extPar = *opts; if (mfxExtCodingOption2 * opts = GetExtBuffer(par)) m_extOpt2 = *opts; if (mfxExtCodingOption3 * opts = GetExtBuffer(par)) m_extOpt3 = *opts; if (mfxExtCodingOptionDDI * opts = GetExtBuffer(par)) m_extOptDDI = *opts; m_segBufPassed = false; if (mfxExtVP9Segmentation * opts = GetExtBuffer(par)) { m_extSeg = *opts; m_segBufPassed = true; } m_tempLayersBufPassed = false; if (mfxExtVP9TemporalLayers * opts = GetExtBuffer(par)) { m_extTempLayers = *opts; m_tempLayersBufPassed = true; } m_webRTCMode = false; if (m_tempLayersBufPassed && m_extOpt3.ScenarioInfo == MFX_SCENARIO_VIDEO_CONFERENCE) m_webRTCMode = true; if (mfxExtAVCEncodedFrameInfo * opts = GetExtBuffer(par)) m_extFrameInfo = *opts; m_extParam[0] = &m_extPar.Header; m_extParam[1] = &m_extOpt2.Header; m_extParam[2] = &m_extOpt3.Header; m_extParam[3] = &m_extSeg.Header; m_extParam[4] = &m_extTempLayers.Header; m_extParam[5] = &m_extOptDDI.Header; m_extParam[7] = &m_extFrameInfo.Header; ExtParam = m_extParam; NumExtParam = mfxU16(sizeof m_extParam / sizeof m_extParam[0]); assert(NumExtParam == NUM_OF_SUPPORTED_EXT_BUFFERS); CalculateInternalParams(); } const mfxI32 acScaleFactors[256] = { 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347, 353, 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448, 456, 465, 474, 483, 492, 501, 510, 520, 530, 540, 550, 560, 571, 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, 729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828 }; mfxU32 ModifyLoopFilterLevelQPBased(mfxU32 QP, eMFXHWType platform) { if (VP9ECaps::IsTableBasedLfLevelUsed(platform)) { // notice mfxI32, mis-use unsigned here would lead to overflow further wrong LFlevel mfxI32 level = 0; const mfxI32 q = acScaleFactors[QP]; double qnorm = q / (double)acScaleFactors[255]; double qnorm2 = qnorm * qnorm; double qnorm3 = qnorm * qnorm2; level = mfxI32((20.095 * qnorm3 - 15.371 * qnorm2 + 5.5294 * qnorm - 0.166) * 63 /*MAX_LOOP_FILTER*/ + 0.5); level = level < 0 ? 0 : level > 63 ? 63 : level; if (level > 63) level = 63; return (mfxU8)level; } else { if (QP >= 40) { return (mfxU8)(-18.98682 + 0.3967082 * (float)QP + 0.0005054 * pow((float)QP - 127.5, 2) - 9.692e-6 * pow((float)QP - 127.5, 3)); } else { return QP / 4; } } } mfxStatus InitVp9SeqLevelParam(VP9MfxVideoParam const &video, VP9SeqLevelParam ¶m) { Zero(param); param.profile = (mfxU8)(video.mfx.CodecProfile - 1); param.bitDepth = BITDEPTH_8; param.subsamplingX = 1; param.subsamplingY = 1; mfxExtCodingOption3 opt3 = GetExtBufferRef(video); if (MFX_CHROMAFORMAT_YUV444 == (opt3.TargetChromaFormatPlus1 - 1)) { param.subsamplingX = 0; param.subsamplingY = 0; } param.bitDepth = (mfxU8)opt3.TargetBitDepthLuma; param.colorSpace = UNKNOWN_COLOR_SPACE; param.colorRange = 0; // BT.709-6 return MFX_ERR_NONE; }; mfxStatus SetFramesParams(VP9MfxVideoParam const &par, Task const & task, mfxU8 frameType, VP9FrameLevelParam &frameParam, eMFXHWType platform) { (void)platform; Zero(frameParam); frameParam.frameType = frameType; mfxExtVP9Param const &extPar = GetActualExtBufferRef(par, task.m_ctrl); if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { frameParam.baseQIndex = mfxU8(task.m_ctrl.QP > 0 ? task.m_ctrl.QP : frameParam.frameType == KEY_FRAME ? par.mfx.QPI : par.mfx.QPP); } frameParam.lfLevel = (mfxU8)ModifyLoopFilterLevelQPBased(frameParam.baseQIndex, platform); if (VP9ECaps::IsTableBasedLfLevelUsed(platform)) { frameParam.interpFilter = 4; frameParam.lfRefDelta[0] = 1; frameParam.lfRefDelta[1] = 0; frameParam.lfRefDelta[2] = -1; frameParam.lfRefDelta[3] = -1; frameParam.modeRefDeltaEnabled = 1; if (frameParam.lfLevel > 31) { frameParam.lfRefDelta[0] = frameParam.lfRefDelta[0] * 2; frameParam.lfRefDelta[1] = frameParam.lfRefDelta[1] * 2; frameParam.lfRefDelta[2] = frameParam.lfRefDelta[2] * 2; frameParam.lfRefDelta[3] = frameParam.lfRefDelta[3] * 2; } } frameParam.width = frameParam.renderWidth = extPar.FrameWidth; frameParam.height = frameParam.renderHeight = extPar.FrameHeight; frameParam.qIndexDeltaLumaDC = static_cast(extPar.QIndexDeltaLumaDC); frameParam.qIndexDeltaChromaAC = static_cast(extPar.QIndexDeltaChromaAC); frameParam.qIndexDeltaChromaDC = static_cast(extPar.QIndexDeltaChromaDC); frameParam.errorResilentMode = par.m_webRTCMode ? 1 : 0; mfxExtCodingOption2 const & opt2 = GetExtBufferRef(par); if (IsOn(opt2.MBBRC)) { frameParam.segmentation = BRC_SEGMENTATION; } else { mfxExtVP9Segmentation const & seg = GetActualExtBufferRef(par, task.m_ctrl); if (seg.NumSegments && AllMandatorySegMapParams(seg)) { frameParam.segmentation = APP_SEGMENTATION; frameParam.segmentationUpdateMap = frameParam.frameType == KEY_FRAME || frameParam.errorResilentMode || false == CompareSegmentMaps(*task.m_pPrevSegment, seg); frameParam.segmentationUpdateData = frameParam.frameType == KEY_FRAME || frameParam.errorResilentMode || false == CompareSegmentParams(*task.m_pPrevSegment, seg); frameParam.segmentationTemporalUpdate = 0; frameParam.segmentIdBlockSize = seg.SegmentIdBlockSize; } else { frameParam.segmentation = NO_SEGMENTATION; } } frameParam.showFrame = 1; frameParam.intraOnly = 0; if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { // In BRC mode driver may update LF level and mode/ref LF deltas. // But driver writes corrupted uncompressed frame header when mode or ref deltas are written by MSDK frameParam.modeRefDeltaEnabled = 0; frameParam.modeRefDeltaUpdate = 0; } mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(par); if (extDdi.RefreshFrameContext) { frameParam.refreshFrameContext = IsOn(extDdi.RefreshFrameContext) ? 1 : 0; } else { // context switching isn't supported by driver now. So refresh_frame_context is disabled for temporal scalability frameParam.refreshFrameContext = par.m_numLayers ? 0 : 1; } frameParam.allowHighPrecisionMV = 1; mfxU16 alignedWidth = mfx::align2_value(mfxU16(frameParam.width), 8); // align to Mode Info block size (8 pixels) mfxU16 alignedHeight = mfx::align2_value(mfxU16(frameParam.height), 8); // align to Mode Info block size (8 pixels) frameParam.modeInfoRows = alignedHeight >> 3; frameParam.modeInfoCols = alignedWidth >> 3; frameParam.temporalLayer = CalcTemporalLayerIndex(par, task.m_frameOrderInGop); frameParam.nextTemporalLayer = CalcTemporalLayerIndex(par, task.m_frameOrderInGop + 1); if (!IsOff(extDdi.SuperFrameForTS) && par.m_numLayers && frameParam.temporalLayer != frameParam.nextTemporalLayer && !par.m_webRTCMode) { frameParam.showFrame = 0; } if (IsOn(extDdi.ChangeFrameContextIdxForTS)) { if (par.m_numLayers) { frameParam.frameContextIdx = static_cast(frameParam.temporalLayer); } else { frameParam.frameContextIdx = static_cast(task.m_frameOrder % 4); } } if (par.m_numLayers > 1 && IsOn(extDdi.ChangeFrameContextIdxForTS) && frameParam.refreshFrameContext) { // context refreshing should be disabled for certain frames in TS-encoding // this is demand by kernel processing logic if (IsNeedDisableRefreshForFrameTS(par, task.m_frameOrderInGop)) { frameParam.refreshFrameContext = false; } } frameParam.log2TileRows = static_cast(CeilLog2(extPar.NumTileRows)); frameParam.log2TileCols = static_cast(CeilLog2(extPar.NumTileColumns)); return MFX_ERR_NONE; } #define DPB_SLOT_FOR_GOLD_REF dpbSize - 1 // construct default ref list. This list can be modified later for special cases mfxStatus GetDefaultRefList(mfxU32 frameOrder, mfxU8 (&refList)[3], std::vector const & dpb) { mfxU8 dpbSize = (mfxU8)dpb.size(); bool multiref = dpbSize > 1; if (multiref == true) { refList[REF_GOLD] = DPB_SLOT_FOR_GOLD_REF; // last DPB intry is always for LTR (= GOLD) // for DPB size 2 LAST and ALT are both DBP[0] // for DPB size 3 LAST and ALT alternate between DPB[0] and DPB[1] if (dpbSize == 2) { refList[REF_LAST] = refList[REF_ALT] = 0; } else { refList[REF_LAST] = 1 - frameOrder % 2; refList[REF_ALT] = frameOrder % 2; } } else { // single ref: // Last, Gold, Alt are pointing to DPB[0] refList[REF_GOLD] = refList[REF_ALT] = refList[REF_LAST] = 0; } return MFX_ERR_NONE; } mfxStatus DecideOnRefListAndDPBRefresh( VP9MfxVideoParam const & par, Task *pTask, std::vector& dpb, VP9FrameLevelParam &frameParam, mfxU32 prevFrameOrderInRefStructure) { if (frameParam.frameType == KEY_FRAME) { memset(frameParam.refreshRefFrames, 1, DPB_SIZE); return MFX_ERR_NONE; } mfxU8 dpbSize = (mfxU8)dpb.size(); if (par.m_numLayers < 2) { // single layer mfxU32 frameOrder = pTask->m_frameOrderInRefStructure; GetDefaultRefList( frameOrder ? frameOrder : prevFrameOrderInRefStructure, frameParam.refList, dpb); // by default encoder always updates DPB slot pointed by "default" ALT mfxU8 dpbSlotToRefresh = frameParam.refList[REF_ALT]; bool multiref = dpbSize > 1; if (multiref) { // modify ref list to workaround architecture limitations if (frameOrder == 0) { // special case - ref structure was reset w/o key-frame - use single ref for current frame frameParam.refList[REF_GOLD] = frameParam.refList[REF_ALT] = frameParam.refList[REF_LAST]; } else if (dpb[frameParam.refList[REF_LAST]] == dpb[frameParam.refList[REF_GOLD]] && dpb[frameParam.refList[REF_LAST]] != dpb[frameParam.refList[REF_ALT]]) { // if LAST and GOLD point to same reference slot, other than is pointed by ALT // need to swap ALT and GOLD since arhitecture doesn't support use of LAST and ALT w/o GOLD std::swap(frameParam.refList[REF_GOLD], frameParam.refList[REF_ALT]); } } if (frameOrder == 0) { // refresh whole DPB with current frame memset(frameParam.refreshRefFrames, 1, DPB_SIZE); } else { // refresh chosen DPB slot with current frame frameParam.refreshRefFrames[dpbSlotToRefresh] = 1; // in addition change LTR (=GOLD) ref frame 4 times per second mfxU32 frameRate = par.mfx.FrameInfo.FrameRateExtN / par.mfx.FrameInfo.FrameRateExtD; if (frameRate >= 4 && ((frameOrder % (frameRate / 2)) == 0 || (frameOrder % (frameRate / 2)) == frameRate / 4)) { frameParam.refreshRefFrames[DPB_SLOT_FOR_GOLD_REF] = 1; } } } else { // multiple temporal layers std::map FOs; mfxU16 lastRefLayer = par.mfx.NumRefFrame >= par.m_numLayers ? par.m_numLayers - 1 : par.m_numLayers - 2; for (mfxU32 i = 0; i <= frameParam.temporalLayer && i <= lastRefLayer; i++) { FOs.emplace(dpb[i]->frameOrder, i); } if (par.m_webRTCMode) { // limit Picture Group to 8 frames static mfxU32 zeroLevelCounter = 0; if (frameParam.temporalLayer == 0) zeroLevelCounter++; // each time we get frame with TL id = 0, zeroLevelCounter increases // To limit PG to 8 frames (means 9 and next frames could not reffer to frames previous to 8 frame), we need to delete last reference that comes after 8's frame // For 3 TL case, TL pattern for first 8 frames would be 0212 0212. Zero-level is present here 2 times -> multiplier = 2. // For 2 TL case, TL pattern for first 8 frames would be 0101 0101. Zero-level is present here 4 times -> multiplier = 4. // Getting zeroLevelCounter divided by specific multiplier, we could make a decision that PG is ended and now we can erase reference: mfxU8 multiplier = par.m_numLayers == 3 ? 2 : 4; if (zeroLevelCounter % multiplier == 0) { auto it = FOs.begin(); FOs.erase(it); } } std::map::reverse_iterator closest = FOs.rbegin(); for (mfxU8 ref = REF_LAST; ref < REF_TOTAL && closest != FOs.rend(); ref++, closest++) { frameParam.refList[ref] = static_cast(closest->second); } frameParam.refreshRefFrames[frameParam.temporalLayer] = 1; } memset(&frameParam.refBiases[0], 0, REF_TOTAL); return MFX_ERR_NONE; } mfxStatus UpdateDpb(VP9FrameLevelParam &frameParam, sFrameEx *pRecFrame, std::vector&dpb, VideoCORE* pCore) { for (mfxU8 i = 0; i < dpb.size(); i++) { if (frameParam.refreshRefFrames[i]) { if (dpb[i]) { mfxStatus sts = DecreaseRef(dpb[i], pCore); MFX_CHECK_STS(sts); } dpb[i] = pRecFrame; IncreaseRef(dpb[i]); } } return MFX_ERR_NONE; } //--------------------------------------------------------- // service class: MfxFrameAllocResponse //--------------------------------------------------------- MfxFrameAllocResponse::MfxFrameAllocResponse() : m_info() , m_pCore(0) , m_numFrameActualReturnedByAllocFrames(0) { Zero(m_info); } MfxFrameAllocResponse::~MfxFrameAllocResponse() { Release(); } mfxStatus MfxFrameAllocResponse::Alloc( VideoCORE* pCore, mfxFrameAllocRequest & req, bool isCopyRequired) { req.NumFrameSuggested = req.NumFrameMin; // no need in 2 different NumFrames if (pCore->GetVAType() == MFX_HW_D3D11) { mfxFrameAllocRequest tmp = req; tmp.NumFrameMin = tmp.NumFrameSuggested = 1; m_responseQueue.resize(req.NumFrameMin); m_mids.resize(req.NumFrameMin); for (int i = 0; i < req.NumFrameMin; i++) { mfxStatus sts = pCore->AllocFrames(&tmp, &m_responseQueue[i], isCopyRequired); MFX_CHECK_STS(sts); m_mids[i] = m_responseQueue[i].mids[0]; } mids = &m_mids[0]; NumFrameActual = req.NumFrameMin; } else { mfxStatus sts = pCore->AllocFrames(&req, this, isCopyRequired); MFX_CHECK_STS(sts); } if (NumFrameActual < req.NumFrameMin) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } m_pCore = pCore; m_numFrameActualReturnedByAllocFrames = NumFrameActual; NumFrameActual = req.NumFrameMin; m_info = req.Info; return MFX_ERR_NONE; } mfxStatus MfxFrameAllocResponse::Release() { if (m_numFrameActualReturnedByAllocFrames == 0) { // nothing was allocated, nothing to do return MFX_ERR_NONE; } if (m_pCore == 0) { MFX_RETURN(MFX_ERR_NULL_PTR); } if (m_pCore->GetVAType() == MFX_HW_D3D11) { for (size_t i = 0; i < m_responseQueue.size(); i++) { mfxStatus sts = m_pCore->FreeFrames(&m_responseQueue[i]); MFX_CHECK_STS(sts); } m_responseQueue.resize(0); m_numFrameActualReturnedByAllocFrames = 0; } else { if (mids) { NumFrameActual = m_numFrameActualReturnedByAllocFrames; mfxStatus sts = m_pCore->FreeFrames(this); MFX_CHECK_STS(sts); m_numFrameActualReturnedByAllocFrames = 0; } } return MFX_ERR_NONE; } //--------------------------------------------------------- // service class: ExternalFrames //--------------------------------------------------------- void ExternalFrames::Init(mfxU32 numFrames) { m_frames.resize(numFrames); { mfxU32 i = 0; std::list::iterator frame = m_frames.begin(); for ( ;frame!= m_frames.end(); frame++) { Zero(*frame); frame->idInPool = i++; } } } mfxStatus ExternalFrames::GetFrame(mfxFrameSurface1 *pInFrame, sFrameEx *&pOutFrame ) { std::list::iterator frame = m_frames.begin(); for ( ;frame!= m_frames.end(); frame++) { if (frame->pSurface == 0) { frame->pSurface = pInFrame; pOutFrame = &*frame; return MFX_ERR_NONE; } if (frame->pSurface == pInFrame) { pOutFrame = &*frame; return MFX_ERR_NONE; } } sFrameEx newFrame = {}; newFrame.idInPool = (mfxU32)m_frames.size(); newFrame.pSurface = pInFrame; m_frames.push_back(newFrame); pOutFrame = &m_frames.back(); return MFX_ERR_NONE; } //--------------------------------------------------------- // service class: InternalFrames //--------------------------------------------------------- mfxStatus InternalFrames::Init(VideoCORE *pCore, mfxFrameAllocRequest *pAllocReq, bool isCopyRequired) { MFX_CHECK_NULL_PTR2 (pCore, pAllocReq); mfxU32 nFrames = pAllocReq->NumFrameMin; if (nFrames == 0) { return MFX_ERR_NONE; } //printf("internal frames init %d (request)\n", req.NumFrameSuggested); mfxStatus sts = m_response.Alloc(pCore, *pAllocReq, isCopyRequired); MFX_CHECK_STS(sts); //printf("internal frames init %d (%d) [%d](response)\n", m_response.NumFrameActual,Num(),nFrames); m_surfaces.resize(nFrames); Zero(m_surfaces); //printf("internal frames init 1 [%d](response)\n", Num()); m_frames.resize(nFrames); Zero(m_frames); //printf("internal frames init 2 [%d](response)\n", Num()); for (mfxU32 i = 0; i < nFrames; i++) { m_frames[i].idInPool = i; m_frames[i].refCount = 0; m_surfaces[i].Data.MemId = m_response.mids[i]; m_surfaces[i].Info = pAllocReq->Info; m_frames[i].pSurface = &m_surfaces[i]; } return MFX_ERR_NONE; } sFrameEx * InternalFrames::GetFreeFrame() { std::vector::iterator frame = m_frames.begin(); for (;frame != m_frames.end(); frame ++) { if (isFreeSurface(&frame[0])) { return &frame[0]; } } return 0; } mfxStatus InternalFrames::GetFrame(mfxU32 numFrame, sFrameEx * &Frame) { MFX_CHECK(numFrame < m_frames.size(), MFX_ERR_UNDEFINED_BEHAVIOR); if (isFreeSurface(&m_frames[numFrame])) { Frame = &m_frames[numFrame]; return MFX_ERR_NONE; } MFX_RETURN(MFX_WRN_DEVICE_BUSY); } mfxStatus InternalFrames::Release() { mfxStatus sts = m_response.Release(); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } //--------------------------------------------------------- // service class: Task //--------------------------------------------------------- mfxStatus GetRealSurface( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task, mfxFrameSurface1 *& pSurface) { std::ignore = par; std::ignore = pCore; pSurface = task.m_pRawFrame->pSurface; return MFX_ERR_NONE; } mfxStatus GetInputSurface( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task, mfxFrameSurface1 *& pSurface) { if (task.m_pRawLocalFrame) { pSurface = task.m_pRawLocalFrame->pSurface; } else { mfxStatus sts = GetRealSurface(pCore, par, task, pSurface); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } mfxStatus CopyRawSurfaceToVideoMemory( VideoCORE *pCore, VP9MfxVideoParam const &par, Task const &task) { if (task.m_pRawLocalFrame) { mfxFrameSurface1* pInternalSurf = task.m_pRawLocalFrame->pSurface; mfxFrameSurface1 *pExternalSurface = 0; mfxStatus sts = GetRealSurface(pCore, par, task, pExternalSurface); MFX_CHECK_STS(sts); mfxFrameSurface1 extSurf = *pExternalSurface; mfxU16 inMemType = MFX_MEMTYPE_EXTERNAL_FRAME; inMemType |= par.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET; sts = pCore->DoFastCopyWrapper( pInternalSurf, MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME, &extSurf, inMemType); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } mfxStatus GetNativeHandleToRawSurface( VideoCORE& core, mfxFrameSurface1& surf, mfxHDLPair& handle, VP9MfxVideoParam const& video, bool isD3D9SimWithVideoMem) { mfxStatus sts = MFX_ERR_NONE; mfxU32 iopattern = video.IOPattern; if (iopattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY || isD3D9SimWithVideoMem) sts = core.GetFrameHDL(surf, handle); else if (iopattern == MFX_IOPATTERN_IN_VIDEO_MEMORY) sts = core.GetExternalFrameHDL(surf, handle); else MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); MFX_RETURN(sts); } } // MfxHwVP9EncodeoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/encode_hw/vp9/src/mfx_vp9_encode_hw_vaapi.cpp000066400000000000000000001450411443134507600331110ustar00rootroot00000000000000// Copyright (c) 2012-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vp9_encode_hw_utils.h" #include "mfx_vp9_encode_hw_par.h" #include "mfx_vp9_encode_hw_vaapi.h" #include "mfx_common_int.h" #include namespace MfxHwVP9Encode { /* ----------- Functions to convert MediaSDK into DDI --------------------- */ DriverEncoder* CreatePlatformVp9Encoder(VideoCORE*) { return new VAAPIEncoder; } uint32_t ConvertRTFormatMFX2VAAPI(mfxU8 chromaFormat) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ConvertRTFormatMFX2VAAPI"); switch (chromaFormat) { case MFX_CHROMAFORMAT_YUV420: return VA_RT_FORMAT_YUV420; case MFX_CHROMAFORMAT_YUV444: return VA_RT_FORMAT_YUV444; default: assert(!"Unsupported ChromaFormat"); return 0; } } uint32_t ConvertRateControlMFX2VAAPI(mfxU8 rateControl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ConvertRateControlMFX2VAAPI"); switch (rateControl) { case MFX_RATECONTROL_CBR: return VA_RC_CBR; case MFX_RATECONTROL_VBR: return VA_RC_VBR; case MFX_RATECONTROL_AVBR: return VA_RC_VBR; case MFX_RATECONTROL_CQP: return VA_RC_CQP; default: assert(!"Unsupported RateControl"); return 0; } } mfxU16 ConvertSegmentRefControlToVAAPI(mfxU16 refFrameControl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ConvertSegmentRefControlToVAAPI"); mfxU16 refControl = refFrameControl & 0x0F;//4 bits switch (refControl) { case MFX_VP9_REF_LAST: return 1; case MFX_VP9_REF_GOLDEN: return 2; case MFX_VP9_REF_ALTREF: return 3; default: return 0; } } // mfxU16 ConvertSegmentRefControlToVAAPI(mfxU16 refFrameControl) void FillSpsBuffer(mfxVideoParam const & par, VAEncSequenceParameterBufferVP9 & sps) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FillSpsBuffer"); Zero(sps); sps.max_frame_width = par.mfx.FrameInfo.CropW!=0 ? par.mfx.FrameInfo.CropW : par.mfx.FrameInfo.Width; sps.max_frame_height = par.mfx.FrameInfo.CropH!=0 ? par.mfx.FrameInfo.CropH : par.mfx.FrameInfo.Height; sps.kf_auto = 0; sps.kf_min_dist = 1; sps.kf_max_dist = par.mfx.GopRefDist; sps.bits_per_second = par.mfx.TargetKbps * 1000; sps.intra_period = par.mfx.GopPicSize; } // void FillSpsBuffer(mfxVideoParam const & par, VAEncSequenceParameterBufferVP9 & sps) mfxStatus FillPpsBuffer( Task const & task, mfxVideoParam const & /*par*/, VAEncPictureParameterBufferVP9 & pps, std::vector const & reconQueue, BitOffsets const &offsets) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FillPpsBuffer"); Zero(pps); pps.frame_width_dst = pps.frame_width_src = static_cast(task.m_frameParam.width); pps.frame_height_dst = pps.frame_height_src = static_cast(task.m_frameParam.height); MFX_CHECK(task.m_pRecFrame->idInPool < reconQueue.size(), MFX_ERR_UNDEFINED_BEHAVIOR); pps.reconstructed_frame = reconQueue[task.m_pRecFrame->idInPool].surface; pps.ref_flags.bits.force_kf = 0; VP9FrameLevelParam const &framePar = task.m_frameParam; { mfxU16 ridx = 0; while (ridx < 8) pps.reference_frames[ridx++] = VA_INVALID_SURFACE; ridx = 0; pps.refresh_frame_flags = 0; for (mfxU8 i = 0; i < DPB_SIZE; i++) pps.refresh_frame_flags |= (framePar.refreshRefFrames[i] << i); if (task.m_pRecRefFrames[REF_LAST] && task.m_pRecRefFrames[REF_LAST]->idInPool < reconQueue.size()) { pps.reference_frames[ridx] = reconQueue[task.m_pRecRefFrames[REF_LAST]->idInPool].surface; pps.ref_flags.bits.ref_last_idx = ridx; //(ref_frame_ctrl & 0x01 == 1) indicates that last frame is used as reference frame pps.ref_flags.bits.ref_frame_ctrl_l0 |= 0x01; pps.ref_flags.bits.ref_frame_ctrl_l1 |= 0x01; ridx ++; } if (task.m_pRecRefFrames[REF_GOLD] && task.m_pRecRefFrames[REF_GOLD]->idInPool < reconQueue.size()) { pps.reference_frames[ridx] = reconQueue[task.m_pRecRefFrames[REF_GOLD]->idInPool].surface; pps.ref_flags.bits.ref_gf_idx = ridx; //(ref_frame_ctrl & 0x02 == 1) indicates that golden frame is used as reference frame pps.ref_flags.bits.ref_frame_ctrl_l0 |= 0x02; pps.ref_flags.bits.ref_frame_ctrl_l1 |= 0x02; ridx ++; } if (task.m_pRecRefFrames[REF_ALT] && task.m_pRecRefFrames[REF_ALT]->idInPool < reconQueue.size()) { pps.reference_frames[ridx] = reconQueue[task.m_pRecRefFrames[REF_ALT]->idInPool].surface; pps.ref_flags.bits.ref_arf_idx = ridx; //(ref_frame_ctrl & 0x04 == 1) indicates that alt frame is used as reference frame pps.ref_flags.bits.ref_frame_ctrl_l0 |= 0x04; pps.ref_flags.bits.ref_frame_ctrl_l1 |= 0x04; ridx ++; } } pps.pic_flags.bits.frame_type = framePar.frameType; pps.pic_flags.bits.show_frame = framePar.showFrame; pps.pic_flags.bits.error_resilient_mode = framePar.errorResilentMode; pps.pic_flags.bits.intra_only = framePar.intraOnly; pps.pic_flags.bits.segmentation_enabled = framePar.segmentation != NO_SEGMENTATION; pps.pic_flags.bits.refresh_frame_context = framePar.refreshFrameContext; pps.pic_flags.bits.frame_context_idx = framePar.frameContextIdx; pps.pic_flags.bits.allow_high_precision_mv = framePar.allowHighPrecisionMV; pps.pic_flags.bits.mcomp_filter_type = framePar.interpFilter; if (pps.pic_flags.bits.show_frame == 0) pps.pic_flags.bits.super_frame_flag = 1; //segmentation functionality is not fully implemented yet if (framePar.segmentation == APP_SEGMENTATION) { //pps.pic_flags.bits.seg_id_block_size = BLOCK_16x16; //no such parameter in va pps.pic_flags.bits.segmentation_update_map = task.m_frameParam.segmentationUpdateMap; pps.pic_flags.bits.segmentation_temporal_update = task.m_frameParam.segmentationTemporalUpdate; pps.pic_flags.bits.auto_segmentation = false; //not supported for now } pps.luma_ac_qindex = framePar.baseQIndex; pps.luma_dc_qindex_delta = framePar.qIndexDeltaLumaDC; pps.chroma_ac_qindex_delta = framePar.qIndexDeltaChromaAC; pps.chroma_dc_qindex_delta = framePar.qIndexDeltaChromaDC; pps.filter_level = framePar.lfLevel; pps.sharpness_level = framePar.sharpness; for (mfxU16 i = 0; i < 4; i ++) pps.ref_lf_delta[i] = framePar.lfRefDelta[i]; for (mfxU16 i = 0; i < 2; i ++) pps.mode_lf_delta[i] = framePar.lfModeDelta[i]; pps.ref_flags.bits.temporal_id = static_cast(framePar.temporalLayer); pps.bit_offset_ref_lf_delta = offsets.BitOffsetForLFRefDelta; pps.bit_offset_mode_lf_delta = offsets.BitOffsetForLFModeDelta; pps.bit_offset_lf_level = offsets.BitOffsetForLFLevel; pps.bit_offset_qindex = offsets.BitOffsetForQIndex; pps.bit_offset_first_partition_size = offsets.BitOffsetForFirstPartitionSize; pps.bit_offset_segmentation = offsets.BitOffsetForSegmentation; pps.bit_size_segmentation = offsets.BitSizeForSegmentation; //Tiles functionality is not fully implemented yet pps.log2_tile_columns = framePar.log2TileCols; pps.log2_tile_rows = framePar.log2TileRows; return MFX_ERR_NONE; } // mfxStatus FillPpsBuffer(...) mfxStatus SetTemporalStructure( VP9MfxVideoParam const & par, VADisplay m_vaDisplay, VAContextID m_vaContextEncode, VABufferID & tempLayersBufferId) //VAEncMiscParameterTemporalLayerStructure & tempLayers) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "SetTemporalStructure"); VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterTemporalLayerStructure *tempLayers; mfxExtVP9TemporalLayers& extTL = GetExtBufferRef(par); mfxU8 numTL = 0; for (numTL = 0; numTL < 4 && extTL.Layer[numTL].FrameRateScale != 0; numTL++); if (numTL == 0) { numTL = 1; } mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, tempLayersBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterTemporalLayerStructure), 1, NULL, &tempLayersBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, tempLayersBufferId, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeTemporalLayerStructure; tempLayers = (VAEncMiscParameterTemporalLayerStructure *)misc_param->data; memset(tempLayers, 0, sizeof(VAEncMiscParameterTemporalLayerStructure)); tempLayers->number_of_layers = static_cast(numTL); vaSts = vaUnmapBuffer(m_vaDisplay, tempLayersBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus FillSegMap( Task const & task, mfxVideoParam const & /*par*/, VideoCORE * pCore, VAEncMiscParameterTypeVP9PerSegmantParam & segPar) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FillSegMap"); if (task.m_frameParam.segmentation == 0) return MFX_ERR_NONE; // segment map isn't required mfxFrameData segMap {}; FrameLocker lock(pCore, segMap, task.m_pSegmentMap->pSurface->Data.MemId); mfxU8 *pBuf = segMap.Y; if (pBuf == 0) MFX_RETURN(MFX_ERR_LOCK_MEMORY); mfxExtVP9Segmentation const & seg = GetActualExtBufferRef(*task.m_pParam, task.m_ctrl); Zero(segPar); mfxFrameInfo const & dstFi = task.m_pSegmentMap->pSurface->Info; // driver seg map is always in 16x16 blocks because of HW limitation constexpr mfxU16 dstBlockSize = 16; mfxU32 dstW = dstFi.CropW / dstBlockSize; // width should be in MBs mfxU32 dstH = dstFi.Height; mfxU32 dstPitch = dstFi.Width; mfxFrameInfo const & srcFi = task.m_pRawFrame->pSurface->Info; mfxU16 srcBlockSize = MapIdToBlockSize(seg.SegmentIdBlockSize); mfxU32 srcW = (srcFi.Width + srcBlockSize - 1) / srcBlockSize; mfxU32 srcH = (srcFi.Height + srcBlockSize - 1) / srcBlockSize; mfxU16 ratio = srcBlockSize / dstBlockSize; if (seg.NumSegmentIdAlloc < srcW * srcH || seg.SegmentId == 0 || srcW != (dstW + ratio - 1) / ratio || srcH != (dstH + ratio - 1) / ratio) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } for (mfxI8 i = seg.NumSegments - 1; i >= 0; i --) { VAEncSegParamVP9 & segva = segPar.seg_data[int(i)]; mfxVP9SegmentParam const & segmfx = seg.Segment[int(i)]; mfxI16 qIndexDelta = segmfx.QIndexDelta; CheckAndFixQIndexDelta(qIndexDelta, task.m_frameParam.baseQIndex); segva.segment_lf_level_delta = static_cast(segmfx.LoopFilterLevelDelta); segva.segment_qindex_delta = qIndexDelta; if (IsFeatureEnabled(segmfx.FeatureEnabled, FEAT_REF)) { segva.seg_flags.bits.segment_reference_enabled = 1; segva.seg_flags.bits.segment_reference = ConvertSegmentRefControlToVAAPI(segmfx.ReferenceFrame); } if (IsFeatureEnabled(segmfx.FeatureEnabled, FEAT_SKIP)) { segva.seg_flags.bits.segment_reference_skipped = 1; } } // for now application seg map is accepted in 64x64 blocks, for Xe_HPM+ in 32x32 and 64x64 blocks // and driver seg map is always in 16x16 blocks // need to map one to another for (mfxU32 i = 0; i < dstH; i++) { for (mfxU32 j = 0; j < dstW; j++) { segMap.Y[i * dstPitch + j] = seg.SegmentId[(i / ratio) * srcW + j / ratio]; } } return MFX_ERR_NONE; } //mfxStatus FillSegMap(..) void FillBrcStructures( mfxVideoParam const & par, VAEncMiscParameterRateControl & vaBrcPar, VAEncMiscParameterFrameRate & vaFrameRate) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FillBrcStructures"); Zero(vaBrcPar); Zero(vaFrameRate); vaBrcPar.bits_per_second = par.mfx.MaxKbps * 1000; if(par.mfx.MaxKbps) vaBrcPar.target_percentage = (unsigned int)(100.0 * (mfxF64)par.mfx.TargetKbps / (mfxF64)par.mfx.MaxKbps); PackMfxFrameRate(par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD, vaFrameRate.framerate); } // void FillBrcStructures( mfxStatus SetRateControl( VP9MfxVideoParam const & par, VADisplay m_vaDisplay, VAContextID m_vaContextEncode, std::vector & rateParamBuf_ids, bool isBrcResetRequired = false) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "SetRateControl"); VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterRateControl *rate_param; mfxU8 numTL = par.m_numLayers; bool TL_attached = false; if (numTL == 0) numTL = 1; else TL_attached = true; mfxExtVP9TemporalLayers& extTL = GetExtBufferRef(par); mfxStatus sts; for (VABufferID& id : rateParamBuf_ids) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); } rateParamBuf_ids.resize(numTL); for (mfxU8 tl = 0; tl < rateParamBuf_ids.size(); tl++) { vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl), 1, NULL, &rateParamBuf_ids[tl]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, rateParamBuf_ids[tl], (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeRateControl; rate_param = (VAEncMiscParameterRateControl *)misc_param->data; if (IsBitrateBasedBRC(par.mfx.RateControlMethod)) { if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR) { rate_param->bits_per_second = TL_attached ? extTL.Layer[tl].TargetKbps * 1000 : par.mfx.MaxKbps * 1000; } else { rate_param->bits_per_second = par.mfx.MaxKbps * 1000; if (rate_param->bits_per_second) rate_param->target_percentage = TL_attached ? (unsigned int)(100.0 * (mfxF64)extTL.Layer[tl].TargetKbps / (mfxF64)par.mfx.MaxKbps) : (unsigned int)(100.0 * (mfxF64)par.mfx.TargetKbps / (mfxF64)par.mfx.MaxKbps); } rate_param->rc_flags.bits.reset = isBrcResetRequired; rate_param->rc_flags.bits.temporal_id = tl; } rate_param->rc_flags.bits.enable_dynamic_scaling = 1; vaSts = vaUnmapBuffer(m_vaDisplay, rateParamBuf_ids[tl]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; } //mfxStatus SetRateControl(..) mfxStatus SetHRD( mfxVideoParam const & par, VADisplay m_vaDisplay, VAContextID m_vaContextEncode, VABufferID & hrdBuf_id) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "SetHRD"); VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterHRD *hrd_param; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, hrdBuf_id); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterHRD), 1, NULL, &hrdBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, hrdBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeHRD; hrd_param = (VAEncMiscParameterHRD *)misc_param->data; if (par.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { hrd_param->initial_buffer_fullness = par.mfx.InitialDelayInKB * 8000; hrd_param->buffer_size = par.mfx.BufferSizeInKB * 8000; } else { hrd_param->initial_buffer_fullness = 0; hrd_param->buffer_size = 0; } vaSts = vaUnmapBuffer(m_vaDisplay, hrdBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } //mfxStatus SetHRD(..) mfxStatus SetQualityLevel( mfxVideoParam const & par, VADisplay m_vaDisplay, VAContextID m_vaContextEncode, VABufferID & qualityLevelBuf_id) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "SetQualityLevel"); VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferQualityLevel *quality_param; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, qualityLevelBuf_id); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterBufferQualityLevel), 1, NULL, &qualityLevelBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, qualityLevelBuf_id, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeQualityLevel; quality_param = (VAEncMiscParameterBufferQualityLevel *)misc_param->data; quality_param->quality_level = par.mfx.TargetUsage; vaSts = vaUnmapBuffer(m_vaDisplay, qualityLevelBuf_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } //mfxStatus SetQualityLevel(..) mfxStatus SetFrameRate( VP9MfxVideoParam const & par, VADisplay m_vaDisplay, VAContextID m_vaContextEncode, std::vector & frameRateBufIds) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "SetFrameRate"); VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterFrameRate *frameRate_param; mfxExtVP9TemporalLayers& extTL = GetExtBufferRef(par); mfxU16 numTL = std::max(par.m_numLayers, 1); mfxStatus sts; for (VABufferID& id : frameRateBufIds) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); } frameRateBufIds.resize(numTL); mfxU32 nom = par.mfx.FrameInfo.FrameRateExtN; mfxU32 denom = par.mfx.FrameInfo.FrameRateExtD; for (mfxU16 tl = 0; tl < numTL; tl++) { vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterFrameRate), 1, NULL, &frameRateBufIds[tl]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, frameRateBufIds[tl], (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = VAEncMiscParameterTypeFrameRate; frameRate_param = (VAEncMiscParameterFrameRate *)misc_param->data; if (tl == numTL - 1) PackMfxFrameRate(nom, denom, frameRate_param->framerate); else PackMfxFrameRate(nom*extTL.Layer[tl].FrameRateScale, denom*extTL.Layer[numTL - 1].FrameRateScale, frameRate_param->framerate); frameRate_param->framerate_flags.bits.temporal_id = tl; vaSts = vaUnmapBuffer(m_vaDisplay, frameRateBufIds[tl]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; } // mfxStatus SetFrameRate(..) VAAPIEncoder::VAAPIEncoder() : m_pmfxCore(NULL) , m_vaDisplay(NULL) , m_vaContextEncode(VA_INVALID_ID) , m_vaConfig(VA_INVALID_ID) , m_sps() , m_pps() , m_segPar() , m_vaBrcPar() , m_vaFrameRate() , m_seqParam() , m_spsBufferId(VA_INVALID_ID) , m_ppsBufferId(VA_INVALID_ID) , m_segMapBufferId(VA_INVALID_ID) , m_segParBufferId(VA_INVALID_ID) , m_hrdBufferId(VA_INVALID_ID) , m_qualityLevelBufferId(VA_INVALID_ID) , m_packedHeaderParameterBufferId(VA_INVALID_ID) , m_packedHeaderDataBufferId(VA_INVALID_ID) , m_tempLayersBufferId(VA_INVALID_ID) , m_tempLayersParamsReset(false) , m_width(0) , m_height(0) , m_isBrcResetRequired(false) , m_caps() , m_platform() { } // VAAPIEncoder::VAAPIEncoder(VideoCORE* core) VAAPIEncoder::~VAAPIEncoder() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "~VAAPIEncoder"); Destroy(); } // VAAPIEncoder::~VAAPIEncoder() VAProfile ConvertGuidToVAAPIProfile(const GUID& guid) { if (guid == MfxHwVP9Encode::DXVA2_Intel_LowpowerEncode_VP9_Profile0) return VAProfileVP9Profile0; if (guid == MfxHwVP9Encode::DXVA2_Intel_LowpowerEncode_VP9_Profile1) return VAProfileVP9Profile1; if (guid == MfxHwVP9Encode::DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile2) return VAProfileVP9Profile2; if (guid == MfxHwVP9Encode::DXVA2_Intel_LowpowerEncode_VP9_10bit_Profile3) return VAProfileVP9Profile3; return VAProfileNone; /// Lowpower == OFF is not supported yet. } // this function is aimed to workaround all CAPS reporting problems in driver void HardcodeCaps(ENCODE_CAPS_VP9& caps) { caps.CodingLimitSet = 1; caps.Color420Only = 1; caps.Color420Only = 0; caps.MaxEncodedBitDepth = 1; //0: 8bit, 1: 8 and 10 bit; caps.NumScalablePipesMinus1 = 0; caps.NumScalablePipesMinus1 = 3; caps.ForcedSegmentationSupport = 1; caps.AutoSegmentationSupport = 1; caps.SegmentFeatureSupport = 1 << FEAT_QIDX | 1 << FEAT_LF_LVL; caps.DynamicScaling = 1; caps.EncodeFunc = 1; caps.HybridPakFunc = 1; } mfxStatus VAAPIEncoder::CreateAuxilliaryDevice( VideoCORE* pCore, GUID guid, VP9MfxVideoParam const & par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CreateAuxilliaryDevice"); MFX_CHECK_WITH_ASSERT(pCore != 0, MFX_ERR_NULL_PTR); m_pmfxCore = pCore; mfxStatus mfxSts = pCore->GetHandle(MFX_HANDLE_VA_DISPLAY, &m_vaDisplay); MFX_CHECK_STS(mfxSts); m_platform = m_pmfxCore->GetHWType(); m_width = par.mfx.FrameInfo.Width; m_height = par.mfx.FrameInfo.Height; // set encoder CAPS on our own for now memset(&m_caps, 0, sizeof(m_caps)); std::map idx_map; VAConfigAttribType attr_types[] = { VAConfigAttribRTFormat, VAConfigAttribEncDirtyRect, VAConfigAttribMaxPictureWidth, VAConfigAttribMaxPictureHeight, VAConfigAttribEncTileSupport, VAConfigAttribEncRateControlExt, VAConfigAttribEncParallelRateControl, VAConfigAttribFrameSizeToleranceSupport, VAConfigAttribProcessingRate, VAConfigAttribEncDynamicScaling, VAConfigAttribEncMacroblockInfo, VAConfigAttribEncMaxRefFrames, VAConfigAttribEncSkipFrame, }; std::vector attrs; for (size_t i = 0; i < sizeof(attr_types) / sizeof(attr_types[0]); i++) { attrs.push_back({attr_types[i], 0}); idx_map[ attr_types[i] ] = i; } VAProfile vaapipr = ConvertGuidToVAAPIProfile(guid); if (vaapipr == VAProfileNone) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } VAStatus vaSts = vaGetConfigAttributes(m_vaDisplay, vaapipr, VAEntrypointEncSliceLP, attrs.data(), (int)attrs.size()); MFX_CHECK(!(VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT == vaSts || VA_STATUS_ERROR_UNSUPPORTED_PROFILE == vaSts), MFX_ERR_UNSUPPORTED); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (attrs[idx_map[VAConfigAttribRTFormat]].value != VA_ATTRIB_NOT_SUPPORTED) { m_caps.YUV422ReconSupport = attrs[idx_map[VAConfigAttribRTFormat]].value & VA_RT_FORMAT_YUV422 ? 1 : 0; m_caps.YUV444ReconSupport = attrs[idx_map[VAConfigAttribRTFormat]].value & VA_RT_FORMAT_YUV444 ? 1 : 0; } if (attrs[idx_map[VAConfigAttribEncDirtyRect]].value != VA_ATTRIB_NOT_SUPPORTED && attrs[idx_map[VAConfigAttribEncDirtyRect]].value != 0) { m_caps.DirtyRectSupport = 1; m_caps.MaxNumOfDirtyRect =attrs[idx_map[VAConfigAttribEncDirtyRect]].value; } if (attrs[idx_map[VAConfigAttribMaxPictureWidth]].value != VA_ATTRIB_NOT_SUPPORTED) m_caps.MaxPicWidth = attrs[idx_map[VAConfigAttribMaxPictureWidth]].value; if (attrs[idx_map[VAConfigAttribMaxPictureHeight]].value != VA_ATTRIB_NOT_SUPPORTED) m_caps.MaxPicHeight = attrs[idx_map[VAConfigAttribMaxPictureHeight]].value; if (attrs[idx_map[VAConfigAttribEncTileSupport]].value != VA_ATTRIB_NOT_SUPPORTED) m_caps.TileSupport = attrs[idx_map[VAConfigAttribEncTileSupport]].value; if (attrs[idx_map[VAConfigAttribEncRateControlExt]].value != VA_ATTRIB_NOT_SUPPORTED) { VAConfigAttribValEncRateControlExt rateControlConf; rateControlConf.value = attrs[idx_map[VAConfigAttribEncRateControlExt]].value; m_caps.TemporalLayerRateCtrl = rateControlConf.bits.max_num_temporal_layers_minus1; } if (attrs[idx_map[VAConfigAttribEncMacroblockInfo]].value != VA_ATTRIB_NOT_SUPPORTED && attrs[idx_map[VAConfigAttribEncMacroblockInfo]].value) m_caps.SegmentFeatureSupport |= 1 << FEAT_QIDX; if (attrs[idx_map[VAConfigAttribEncMaxRefFrames]].value != VA_ATTRIB_NOT_SUPPORTED) { m_caps.MaxNum_Reference0 = attrs[idx_map[VAConfigAttribEncMaxRefFrames]].value; } if (attrs[idx_map[VAConfigAttribEncSkipFrame]].value != VA_ATTRIB_NOT_SUPPORTED && attrs[idx_map[VAConfigAttribEncSkipFrame]].value) m_caps.SegmentFeatureSupport |= 1 << FEAT_SKIP; if (attrs[idx_map[VAConfigAttribEncDynamicScaling]].value != VA_ATTRIB_NOT_SUPPORTED) { m_caps.DynamicScaling = attrs[idx_map[VAConfigAttribEncDynamicScaling]].value; } if (attrs[idx_map[VAConfigAttribFrameSizeToleranceSupport]].value != VA_ATTRIB_NOT_SUPPORTED) m_caps.UserMaxFrameSizeSupport = attrs[idx_map[VAConfigAttribFrameSizeToleranceSupport]].value; if (attrs[idx_map[VAConfigAttribProcessingRate]].value != VA_ATTRIB_NOT_SUPPORTED) { m_caps.FrameLevelRateCtrl = attrs[idx_map[VAConfigAttribProcessingRate]].value == VA_PROCESSING_RATE_ENCODE; m_caps.BRCReset = attrs[idx_map[VAConfigAttribProcessingRate]].value == VA_PROCESSING_RATE_ENCODE; } HardcodeCaps(m_caps); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateAuxilliaryDevice(VideoCORE* core, GUID guid, VP9MfxVideoParam const & par) mfxStatus VAAPIEncoder::CreateAccelerationService(VP9MfxVideoParam const & par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CreateAccelerationService"); if(0 == m_reconQueue.size()) { /* We need to pass reconstructed surfaces when call vaCreateContext(). * Here we don't have this info. */ m_video = par; return MFX_ERR_NONE; } MFX_CHECK(m_vaDisplay, MFX_ERR_DEVICE_FAILED); VAStatus vaSts; VAProfile va_profile = ConvertGuidToVAAPIProfile(GetGuid(par)); mfxI32 entrypointsIndx = 0; mfxI32 numEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(numEntrypoints, MFX_ERR_DEVICE_FAILED); std::vector pEntrypoints(numEntrypoints); vaSts = vaQueryConfigEntrypoints( m_vaDisplay, va_profile, pEntrypoints.data(), &numEntrypoints); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); bool bEncodeEnable = false; for( entrypointsIndx = 0; entrypointsIndx < numEntrypoints; entrypointsIndx++ ) { if( VAEntrypointEncSliceLP == pEntrypoints[entrypointsIndx] ) { bEncodeEnable = true; break; } } if( !bEncodeEnable ) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } // Configuration VAConfigAttrib attrib[2]; attrib[0].type = VAConfigAttribRTFormat; attrib[1].type = VAConfigAttribRateControl; vaSts = vaGetConfigAttributes(m_vaDisplay, va_profile, VAEntrypointEncSliceLP, &attrib[0], 2); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); uint32_t vaRTFormat = ConvertRTFormatMFX2VAAPI(par.mfx.FrameInfo.ChromaFormat); if ((attrib[0].value & vaRTFormat) == 0) MFX_RETURN(MFX_ERR_DEVICE_FAILED); uint32_t vaRCType = ConvertRateControlMFX2VAAPI(par.mfx.RateControlMethod); if ((attrib[1].value & vaRCType) == 0) MFX_RETURN(MFX_ERR_DEVICE_FAILED); attrib[0].value = vaRTFormat; attrib[1].value = vaRCType; vaSts = vaCreateConfig( m_vaDisplay, va_profile, VAEntrypointEncSliceLP, attrib, 2, &m_vaConfig); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); std::vector reconSurf; for(unsigned int i = 0; i < m_reconQueue.size(); i++) reconSurf.push_back(m_reconQueue[i].surface); // Encoder create vaSts = vaCreateContext( m_vaDisplay, m_vaConfig, m_width, m_height, VA_PROGRESSIVE, reconSurf.data(), reconSurf.size(), &m_vaContextEncode); MFX_CHECK(VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED != vaSts, MFX_ERR_UNSUPPORTED); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); Zero(m_sps); Zero(m_pps); //------------------------------------------------------------------ FillSpsBuffer(par, m_sps); FillBrcStructures(par, m_vaBrcPar, m_vaFrameRate); m_isBrcResetRequired = false; mfxStatus mfxSts; mfxSts = SetHRD(par, m_vaDisplay, m_vaContextEncode, m_hrdBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); if (par.m_numLayers) { mfxSts = SetTemporalStructure(par, m_vaDisplay, m_vaContextEncode, m_tempLayersBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); } mfxSts = SetRateControl(par, m_vaDisplay, m_vaContextEncode, m_rateCtrlBufferIds); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); mfxSts = SetQualityLevel(par, m_vaDisplay, m_vaContextEncode, m_qualityLevelBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); mfxSts = SetFrameRate(par, m_vaDisplay, m_vaContextEncode, m_frameRateBufferIds); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); m_frameHeaderBuf.resize(VP9_MAX_UNCOMPRESSED_HEADER_SIZE + MAX_IVF_HEADER_SIZE); InitVp9SeqLevelParam(par, m_seqParam); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateAccelerationService(MfxVideoParam const & par) mfxStatus VAAPIEncoder::Reset(VP9MfxVideoParam const & par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Reset"); m_video = par; FillSpsBuffer(par, m_sps); VAEncMiscParameterRateControl oldBrcPar = m_vaBrcPar; VAEncMiscParameterFrameRate oldFrameRate = m_vaFrameRate; FillBrcStructures(par, m_vaBrcPar, m_vaFrameRate); m_isBrcResetRequired = memcmp(&m_vaBrcPar, &oldBrcPar, sizeof(oldBrcPar)) || memcmp(&m_vaFrameRate, &oldFrameRate, sizeof (oldFrameRate)); mfxStatus mfxSts; mfxSts = SetHRD(par, m_vaDisplay, m_vaContextEncode, m_hrdBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); // even we have not temporal layers (after reset), // we have to update driver temporal layers structures in the next render cycle mfxSts = SetTemporalStructure(par, m_vaDisplay, m_vaContextEncode, m_tempLayersBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); m_tempLayersParamsReset = true; mfxSts = SetRateControl(par, m_vaDisplay, m_vaContextEncode, m_rateCtrlBufferIds); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); mfxSts = SetQualityLevel(par, m_vaDisplay, m_vaContextEncode, m_qualityLevelBufferId); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); mfxSts = SetFrameRate(par, m_vaDisplay, m_vaContextEncode, m_frameRateBufferIds); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == mfxSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Reset(MfxVideoParam const & par) mfxU32 VAAPIEncoder::GetReconSurfFourCC() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "GetReconSurfFourCC"); return MFX_FOURCC_VP9_NV12; } // mfxU32 VAAPIEncoder::GetReconSurfFourCC() mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest& request, mfxU32 frameWidth, mfxU32 frameHeight) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "QueryCompBufferInfo"); if (type == D3DDDIFMT_INTELENCODE_BITSTREAMDATA) { request.Info.FourCC = MFX_FOURCC_P8; } else if (type == D3DDDIFMT_INTELENCODE_MBSEGMENTMAP) { // driver seg map is always in 16x16 blocks because of HW limitation constexpr mfxU16 blockSize = 16; request.Info.FourCC = MFX_FOURCC_VP9_SEGMAP; // requirement from driver: seg map width has to be 128 aligned for buffer creation request.Info.Width = mfx::align2_value(frameWidth / blockSize, 128); request.Info.Height = frameHeight / blockSize; } request.AllocId = m_vaContextEncode; return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest& request, mfxU32 frameWidth, mfxU32 frameHeight) mfxStatus VAAPIEncoder::QueryEncodeCaps(ENCODE_CAPS_VP9& caps) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "QueryEncodeCaps"); caps = m_caps; return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryEncodeCaps(ENCODE_CAPS& caps) mfxStatus VAAPIEncoder::Register(mfxFrameAllocResponse& response, D3DDDIFORMAT type) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Register"); std::vector * pQueue; mfxStatus sts; if (D3DDDIFMT_INTELENCODE_MBSEGMENTMAP == type) pQueue = &m_segMapQueue; else if (D3DDDIFMT_INTELENCODE_BITSTREAMDATA == type) pQueue = &m_bsQueue; else pQueue = &m_reconQueue; // we should register allocated HW bitstreams and recon surfaces MFX_CHECK( response.mids, MFX_ERR_NULL_PTR ); ExtVASurface extSurf {VA_INVALID_SURFACE, 0, 0}; VASurfaceID *pSurface = NULL; for (mfxU32 i = 0; i < response.NumFrameActual; i++) { sts = m_pmfxCore->GetFrameHDL(response.mids[i], (mfxHDL *)&pSurface); MFX_CHECK_STS(sts); extSurf.number = i; extSurf.surface = *pSurface; pQueue->push_back( extSurf ); } if( D3DDDIFMT_INTELENCODE_BITSTREAMDATA != type && D3DDDIFMT_INTELENCODE_MBSEGMENTMAP != type) { sts = CreateAccelerationService(m_video); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Register(mfxFrameAllocResponse& response, D3DDDIFORMAT type) mfxStatus VAAPIEncoder::Execute( Task const & task, mfxHDLPair pair) { VAStatus vaSts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Execute"); VASurfaceID *inputSurface = (VASurfaceID*)pair.first; VABufferID codedBuffer; std::vector configBuffers; configBuffers.reserve(MAX_CONFIG_BUFFERS_COUNT); // prepare frame header: write IVF and uncompressed header, calculate bit offsets BitOffsets offsets; mfxU8 * pBuf = &m_frameHeaderBuf[0]; Zero(m_frameHeaderBuf); mfxU16 bytesWritten = PrepareFrameHeader(*task.m_pParam, pBuf, (mfxU32)m_frameHeaderBuf.size(), task, m_seqParam, offsets); MFX_CHECK(bytesWritten != 0, MFX_ERR_MORE_DATA); // update params FillPpsBuffer(task, m_video, m_pps, m_reconQueue, offsets); FillSegMap(task, m_video, m_pmfxCore, m_segPar); //=============================================================================================== //------------------------------------------------------------------ // find bitstream mfxU32 idxInPool = task.m_pOutBs->idInPool; if( idxInPool < m_bsQueue.size()) { codedBuffer = m_bsQueue[idxInPool].surface; } else { MFX_RETURN(MFX_ERR_UNKNOWN); } m_pps.coded_buf = codedBuffer; //------------------------------------------------------------------ // buffer creation & configuration //------------------------------------------------------------------ mfxStatus sts; { // 1. sequence level { sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSequenceParameterBufferType, sizeof(m_sps), 1, &m_sps, &m_spsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_spsBufferId); } // 2. Picture level { sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPictureParameterBufferType, sizeof(m_pps), 1, &m_pps, &m_ppsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_ppsBufferId); } if (task.m_frameParam.segmentation == APP_SEGMENTATION) { // 4. Segmentation map // segmentation map buffer is already allocated and filled. Need just to attach it mfxU32 segCodedBuffer = task.m_pSegmentMap->idInPool; MFX_CHECK( segCodedBuffer < m_segMapQueue.size(), MFX_ERR_UNDEFINED_BEHAVIOR); m_segMapBufferId = m_segMapQueue[segCodedBuffer].surface; configBuffers.push_back(m_segMapBufferId); // 5. Per-segment parameters sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_segParBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAQMatrixBufferType, sizeof(m_segPar), 1, &m_segPar, &m_segParBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_segParBufferId); } //packed header data ENCODE_PACKEDHEADER_DATA packedData = MakePackedByteBuffer(pBuf, bytesWritten); VAEncPackedHeaderParameterBuffer packed_header_param_buffer; packed_header_param_buffer.type = VAEncPackedHeaderRawData; packed_header_param_buffer.has_emulation_bytes = 1; packed_header_param_buffer.bit_length = packedData.DataLength*8; sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedHeaderParameterBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, &m_packedHeaderParameterBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_packedHeaderParameterBufferId); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedHeaderDataBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, packedData.DataLength, 1, packedData.pData, &m_packedHeaderDataBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_packedHeaderDataBufferId); // 8. hrd parameters configBuffers.push_back(m_hrdBufferId); // 9. temporal layers if (m_video.m_numLayers || m_tempLayersParamsReset) { configBuffers.push_back(m_tempLayersBufferId); m_tempLayersParamsReset = false; } // 10. RC parameters SetRateControl(m_video, m_vaDisplay, m_vaContextEncode, m_rateCtrlBufferIds, m_isBrcResetRequired); MFX_CHECK_WITH_ASSERT(m_rateCtrlBufferIds.size() == m_frameRateBufferIds.size(), MFX_ERR_DEVICE_FAILED); m_isBrcResetRequired = false; // reset BRC only once for (mfxU8 i = 0; i < m_rateCtrlBufferIds.size(); i++) { configBuffers.push_back(m_rateCtrlBufferIds[i]); } // 11. frame rate for (VABufferID id : m_frameRateBufferIds) { configBuffers.push_back(id); } // 12. quality level configBuffers.push_back(m_qualityLevelBufferId); } //------------------------------------------------------------------ // Rendering //------------------------------------------------------------------ { MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|VP9|PACKET_START|", "%p|%d", m_vaContextEncode, task.m_taskIdForDriver); vaSts = vaBeginPicture( m_vaDisplay, m_vaContextEncode, *inputSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { vaSts = vaRenderPicture( m_vaDisplay, m_vaContextEncode, configBuffers.data(), configBuffers.size()); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "vaEndPicture");//?? vaSts = vaEndPicture(m_vaDisplay, m_vaContextEncode); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|VP9|PACKET_END|", "%d|%d", m_vaContextEncode, task.m_taskIdForDriver); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } //------------------------------------------------------------------ // PostStage //------------------------------------------------------------------ // put to cache { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback; currentFeedback.surface = *inputSurface; currentFeedback.number = task.m_frameOrder; currentFeedback.idxBs = idxInPool; m_feedbackCache.push_back( currentFeedback ); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Execute(ExecuteBuffers& data, mfxU32 fieldId) mfxStatus VAAPIEncoder::QueryPlatform(eMFXHWType& platform) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::QueryPlatform"); platform = m_platform; return MFX_ERR_NONE; } mfxStatus VAAPIEncoder::QueryStatus( Task & task) { VAStatus vaSts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::QueryStatus"); //------------------------------------------ // (1) mapping feedbackNumber -> surface & mb data buffer bool isFound = false; VASurfaceID waitSurface; mfxU32 waitIdxBs; mfxU32 indxSurf; mfxStatus sts = MFX_ERR_NONE; { UMC::AutomaticUMCMutex guard(m_guard); for( indxSurf = 0; indxSurf < m_feedbackCache.size(); indxSurf++ ) { ExtVASurface currentFeedback = m_feedbackCache[ indxSurf ]; if( currentFeedback.number == task.m_frameOrder) { waitSurface = currentFeedback.surface; waitIdxBs = currentFeedback.idxBs; isFound = true; break; } } } if( !isFound ) { MFX_RETURN(MFX_ERR_UNKNOWN); } VABufferID codedBuffer; if( waitIdxBs >= m_bsQueue.size()) { MFX_RETURN(MFX_ERR_UNKNOWN); } else codedBuffer = m_bsQueue[waitIdxBs].surface; VASurfaceStatus surfSts = VASurfaceSkipped; #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) vaSts = vaSyncSurface(m_vaDisplay, waitSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { UMC::AutomaticUMCMutex guard(m_guard); m_feedbackCache.erase( m_feedbackCache.begin() + indxSurf ); } surfSts = VASurfaceReady; #else vaSts = vaQuerySurfaceStatus(m_vaDisplay, waitSurface, &surfSts); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (VASurfaceReady == surfSts) { UMC::AutomaticUMCMutex guard(m_guard); m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); } #endif switch (surfSts) { case VASurfaceReady: VACodedBufferSegment *codedBufferSegment; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer( m_vaDisplay, codedBuffer, (void **)(&codedBufferSegment)); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } task.m_bsDataLength = codedBufferSegment->size; if (codedBufferSegment->status & VA_CODED_BUF_STATUS_BAD_BITSTREAM) sts = MFX_ERR_GPU_HANG; else if (!codedBufferSegment->size || !codedBufferSegment->buf) sts = MFX_ERR_DEVICE_FAILED; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer( m_vaDisplay, codedBuffer ); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } return sts; case VASurfaceRendering: case VASurfaceDisplaying: return MFX_WRN_DEVICE_BUSY; case VASurfaceSkipped: default: assert(!"bad feedback status"); MFX_RETURN(MFX_ERR_DEVICE_FAILED); } } // mfxStatus VAAPIEncoder::QueryStatus(mfxU32 feedbackNumber, mfxU32& bytesWritten) mfxStatus VAAPIEncoder::Destroy() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Destroy"); mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); std::ignore = MFX_STS_TRACE(sts); // m_segMapBufferId buffer is allocated through internal allocator and will be destroyed there m_segMapBufferId = VA_INVALID_ID; sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_segParBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_hrdBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qualityLevelBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedHeaderParameterBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedHeaderDataBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_tempLayersBufferId); std::ignore = MFX_STS_TRACE(sts); for (VABufferID& id : m_frameRateBufferIds) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); std::ignore = MFX_STS_TRACE(sts); } for (VABufferID& id : m_rateCtrlBufferIds) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); std::ignore = MFX_STS_TRACE(sts); } if(m_vaContextEncode != VA_INVALID_ID) { VAStatus vaSts = vaDestroyContext(m_vaDisplay, m_vaContextEncode); std::ignore = MFX_STS_TRACE(vaSts); m_vaContextEncode = VA_INVALID_ID; } if(m_vaConfig != VA_INVALID_ID) { VAStatus vaSts = vaDestroyConfig( m_vaDisplay, m_vaConfig ); std::ignore = MFX_STS_TRACE(vaSts); m_vaConfig = VA_INVALID_ID; } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Destroy() } // MfxHwVP9Encode oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/000077500000000000000000000000001443134507600231555ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/CMakeLists.txt000066400000000000000000000173241443134507600257240ustar00rootroot00000000000000# Copyright (c) 2018-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_subdirectory(cmrt_cross_platform) add_subdirectory(asc) add_library(mfx_ext STATIC) if(MFX_ENABLE_KERNELS) set( MSDK_GENX_ROOT ${MSDK_LIB_ROOT}/ext/genx ) if (BUILD_KERNELS) # Here we define build steps to generate c-array binary kernels. If you # don't use BUILD_KERNELS options these kernels will just be used from # pre-built form. If you will regenerate kernels you may notice the # difference from the per-built kernels in git-diff. # Helper application to generate c-array data representation of .isa binary # kernels. add_executable(embed_isa ${MSDK_GENX_ROOT}/tools/embed_isa.c) set_target_properties(embed_isa PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) # Generates CM kernel suitable for usage in C/C++ application sources # ${src} - input CM kernel source file # ${genx} - platform generation level # ${out_dir} - directory to generate output # Generated outputs for ${src}=path/file.cpp, ${genx}=gen9: # ${out_dir}/file_gen9_isa.h # ${out_dir}/file_gen9_isa.cpp function(add_cmc_target src genx out_dir) get_filename_component(tgt ${src} NAME_WE) add_custom_command( OUTPUT ${tgt}_${genx}.isa DEPENDS embed_isa ${src} COMMAND ${CMC} -c -Qxcm -Qxcm_release -Qxcm_print_asm_count -menableiga -mCM_init_global -mCM_printregusage -Dtarget_${genx} -Qxcm_jit_target=${genx} ${src} -o ${tgt}_${genx}.isa) add_custom_command( OUTPUT ${tgt}_${genx}_isa.cpp ${tgt}_${genx}_isa.h DEPENDS embed_isa ${tgt}_${genx}.isa COMMAND embed_isa ${tgt}_${genx}.isa) add_custom_command( OUTPUT ${out_dir}/${tgt}_${genx}_isa.h ${out_dir}/${tgt}_${genx}_isa.cpp DEPENDS ${tgt}_${genx}_isa.cpp ${tgt}_${genx}_isa.h COMMAND ${CMAKE_COMMAND} -E copy ${tgt}_${genx}_isa.h ${out_dir} COMMAND ${CMAKE_COMMAND} -E copy ${tgt}_${genx}_isa.cpp ${out_dir}) endfunction() endif() ### ASC if( MFX_ENABLE_ASC ) if(BUILD_KERNELS) foreach(platform gen12lp) add_cmc_target(${MSDK_GENX_ROOT}/asc/src/genx_scd.cpp ${platform} ${MSDK_GENX_ROOT}/asc/isa) endforeach() endif() set( prefix ${MSDK_GENX_ROOT}/asc/isa ) list( APPEND genx_sources ${prefix}/genx_scd_gen12lp_isa.cpp ) list( APPEND genx_include_dirs ${prefix} ) endif() ### copy if(BUILD_KERNELS) foreach(platform gen12lp) add_cmc_target(${MSDK_GENX_ROOT}/copy_kernels/src/genx_copy_kernel.cpp ${platform} ${MSDK_GENX_ROOT}/copy_kernels/isa) endforeach() endif() set( prefix ${MSDK_GENX_ROOT}/copy_kernels/isa ) list( APPEND genx_sources ${prefix}/genx_copy_kernel_gen12lp_isa.cpp ) list( APPEND genx_include_dirs ${prefix} ) ### field copy if(BUILD_KERNELS) foreach(platform gen12lp) add_cmc_target(${MSDK_GENX_ROOT}/field_copy/src/genx_fcopy.cpp ${platform} ${MSDK_GENX_ROOT}/field_copy/isa) endforeach() endif() set( prefix ${MSDK_GENX_ROOT}/field_copy/isa ) list( APPEND genx_sources ${prefix}/genx_fcopy_gen12lp_isa.cpp ) list( APPEND genx_include_dirs ${prefix} ) ### h264_encode if(MFX_ENABLE_H264_VIDEO_ENCODE) if(BUILD_KERNELS) foreach(platform gen12lp) add_cmc_target(${MSDK_GENX_ROOT}/h264_encode/src/genx_histogram.cpp ${platform} ${MSDK_GENX_ROOT}/h264_encode/isa) add_cmc_target(${MSDK_GENX_ROOT}/h264_encode/src/genx_simple_me.cpp ${platform} ${MSDK_GENX_ROOT}/h264_encode/isa) endforeach() endif() set( prefix ${MSDK_GENX_ROOT}/h264_encode/isa ) list( APPEND genx_sources ${MSDK_GENX_ROOT}/h264_encode/src/genx_simple_me_proto.cpp ${prefix}/genx_simple_me_gen12lp_isa.cpp ${prefix}/genx_histogram_gen12lp_isa.cpp ) list( APPEND genx_include_dirs ${prefix} ) endif() ### MCTF if(MFX_ENABLE_MCTF) if(BUILD_KERNELS) foreach(platform gen12lp) add_cmc_target(${MSDK_GENX_ROOT}/mctf/src/genx_me.cpp ${platform} ${MSDK_GENX_ROOT}/mctf/isa) add_cmc_target(${MSDK_GENX_ROOT}/mctf/src/genx_mc.cpp ${platform} ${MSDK_GENX_ROOT}/mctf/isa) add_cmc_target(${MSDK_GENX_ROOT}/mctf/src/genx_sd.cpp ${platform} ${MSDK_GENX_ROOT}/mctf/isa) endforeach() endif() set( prefix ${MSDK_GENX_ROOT}/mctf/isa ) list( APPEND genx_sources ${prefix}/genx_mc_gen12lp_isa.cpp ${prefix}/genx_me_gen12lp_isa.cpp ${prefix}/genx_sd_gen12lp_isa.cpp ) list( APPEND mctf_package mctf_package/mctf/src/mctf_common.cpp mctf_package/mctf/include/mctf_common.h ) list( APPEND genx_include_dirs ${prefix} ) list ( APPEND mctf_include_dir mctf_package/mctf/include ) endif() source_group("genx" FILES ${genx_sources}) source_group("mctf_hw" FILES ${mctf_package}) target_include_directories(mfx_ext PUBLIC ${genx_include_dirs} ${mctf_include_dir} ) target_sources(mfx_ext PRIVATE ${genx_sources} ${mctf_package} ) if (MFX_ENABLE_H264_VIDEO_ENCODE) target_include_directories(mfx_ext PUBLIC h264/include ${MSDK_UMC_ROOT}/codec/brc/include ${MSDK_LIB_ROOT}/encode_hw/h264/include ) set(avc_video_encode_src h264/include/mfx_h264_encode_cm.h h264/include/mfx_h264_encode_cm_defs.h h264/src/mfx_h264_encode_cm.cpp ) source_group("avce" FILES ${avc_video_encode_src}) target_sources(mfx_ext PRIVATE ${avc_video_encode_src} ) endif() endif() if (MFX_ENABLE_MPEG2_VIDEO_ENCODE) target_include_directories(mfx_ext PUBLIC mpeg2/include ${MSDK_UMC_ROOT}/codec/brc/include ${MSDK_LIB_ROOT}/shared/include ${MSDK_STUDIO_ROOT}/shared/enctools/include ) set(mpeg2_video_encode_src mpeg2/include/mfx_mpeg2_encode_debug_hw.h mpeg2/include/mfx_mpeg2_encode_full_hw.h mpeg2/include/mfx_mpeg2_encode_hw.h mpeg2/include/mfx_mpeg2_encode_utils_hw.h mpeg2/include/mfx_mpeg2_enc_common.h mpeg2/include/mfx_mpeg2_enc_common_hw.h mpeg2/include/mfx_mpeg2_encode_interface.h mpeg2/include/mfx_mpeg2_encode_vaapi.h mpeg2/src/mfx_mpeg2_encode_debug_hw.cpp mpeg2/src/mfx_mpeg2_encode_full_hw.cpp mpeg2/src/mfx_mpeg2_encode_hw.cpp mpeg2/src/mfx_mpeg2_encode_utils_hw.cpp mpeg2/src/mfx_mpeg2_encode_vaapi.cpp mpeg2/src/mfx_mpeg2_encode_factory.cpp mpeg2/src/mfx_mpeg2_enc_common_hw.cpp ) source_group("mpeg2e" FILES ${mpeg2_video_encode_src}) target_sources(mfx_ext PRIVATE ${mpeg2_video_encode_src} ) endif() target_link_libraries(mfx_ext PUBLIC mfx_static_lib asc_ext cmrt_cross_platform_hw PRIVATE bitrate_control ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/000077500000000000000000000000001443134507600237235ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/CMakeLists.txt000066400000000000000000000027301443134507600264650ustar00rootroot00000000000000# Copyright (c) 2022 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_library(asc_ext STATIC include/asc_cm.h src/asc_cm.cpp ) target_include_directories(asc_ext PUBLIC include PRIVATE ${MSDK_STUDIO_ROOT}/mfx_lib/ext/genx/asc/isa ) target_sources(asc_ext PRIVATE ${MSDK_STUDIO_ROOT}/mfx_lib/ext/genx/asc/isa/genx_scd_gen12lp_isa.cpp ) target_link_libraries(asc_ext PRIVATE cmrt_cross_platform_hw ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/include/000077500000000000000000000000001443134507600253465ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/include/asc_cm.h000066400000000000000000000136651443134507600267570ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _ASC_CM_H_ #define _ASC_CM_H_ #include #include "asc.h" #include "asc_structures.h" #include "cmrt_cross_platform.h" namespace ns_asc { class ASCimageData_Cm: public ASCimageData { public: ASCimageData_Cm(); CmSurface2DUP *gpuImage; SurfaceIndex *idxImage; }; typedef struct ASCvideoBufferCm: public ASCVidSample { ASCimageData_Cm layer; mfxI32 frame_number, forward_reference, backward_reference; } ASCVidSampleCm; class ASC_Cm: public ASC { using ASC::Init; public: ASC_Cm(); virtual ~ASC_Cm(){} virtual void Close(); virtual mfxStatus Init(mfxI32 Width, mfxI32 Height, mfxI32 Pitch, mfxU32 PicStruct, #ifdef MFX_ENABLE_KERNELS CmDevice* pCmDevice, #endif bool isCmSupported); protected: CmDevice *m_device; CmQueue *m_queue; CmSurface2DUP *m_pSurfaceCp; SurfaceIndex *m_pIdxSurfCp; CmProgram *m_program; CmKernel *m_kernel_p, *m_kernel_t, *m_kernel_b, *m_kernel_cp; CmThreadSpace *m_threadSpace, *m_threadSpaceCp; CmEvent *m_subSamplingEv, *m_frameCopyEv; CmTask *m_task, *m_taskCp; bool m_cmDeviceAssigned; // these maps will be used by m_pCmCopy to track already created surfaces std::map m_tableCmRelations2; std::map m_tableCmIndex2; mfxStatus VidSample_Alloc(); virtual void VidSample_dispose(); mfxStatus alloc(); mfxStatus InitCPU(); mfxStatus InitGPUsurf(CmDevice* pCmDevice); mfxStatus IO_Setup(); bool Query_resize_Event(); mfxStatus SetKernel(SurfaceIndex *idxFrom, SurfaceIndex *idxTo, CmTask **subSamplingTask, mfxU32 parity); mfxStatus SetKernel(SurfaceIndex *idxFrom, CmTask **subSamplingTask, mfxU32 parity); mfxStatus SetKernel(SurfaceIndex *idxFrom, mfxU32 parity); mfxStatus QueueFrame(mfxHDLPair frameHDL, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity); mfxStatus QueueFrame(mfxHDLPair frameHDL, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity); mfxStatus QueueFrame(mfxHDLPair frameHDL, mfxU32 parity); mfxStatus QueueFrame(SurfaceIndex *idxFrom, mfxU32 parity); #ifndef CMRT_EMU mfxStatus QueueFrame(SurfaceIndex *idxFrom, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity); mfxStatus QueueFrame(SurfaceIndex *idxFrom, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity); #else mfxStatus QueueFrame(SurfaceIndex *idxFrom, CmEvent **subSamplingEv, CmTask **subSamplingTask, CmThreadSpace *subThreadSpace, mfxU32 parity); #endif mfxStatus RunFrame(SurfaceIndex *idxFrom, mfxU32 parity); mfxStatus RunFrame(mfxHDLPair frameHDL, mfxU32 parity); mfxStatus RunFrame(mfxU8 *frame, mfxU32 parity); mfxStatus CreateCmSurface2D(mfxHDLPair pSrcPair, CmSurface2D* & pCmSurface2D, SurfaceIndex* &pCmSrcIndex); mfxStatus CreateCmKernels(); mfxStatus CopyFrameSurface(mfxHDLPair frameHDL); void Reset_ASCCmDevice(); void Set_ASCCmDevice(); public: bool Query_ASCCmDevice(); mfxStatus AssignResources(mfxU8 position, mfxU8 *pixelData); mfxStatus AssignResources(mfxU8 position, CmSurface2DUP *inputFrame, mfxU8 *pixelData); mfxStatus SwapResources(mfxU8 position, CmSurface2DUP **inputFrame, mfxU8 **pixelData); mfxStatus QueueFrameProgressive(mfxHDLPair surface, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask); mfxStatus QueueFrameProgressive(mfxHDLPair surface, CmEvent **taskEvent, CmTask **subSamplingTask); mfxStatus QueueFrameProgressive(mfxHDLPair surface); mfxStatus QueueFrameProgressive(SurfaceIndex* idxSurf); mfxStatus QueueFrameProgressive(SurfaceIndex* idxSurf, CmEvent* subSamplingEv, CmTask* subSamplingTask); mfxStatus QueueFrameInterlaced(mfxHDLPair surface); mfxStatus QueueFrameInterlaced(SurfaceIndex* idxSurf); mfxStatus ProcessQueuedFrame(CmEvent **subSamplingEv, CmTask **subSamplingTask, CmSurface2DUP **inputFrame, mfxU8 **pixelData); mfxStatus ProcessQueuedFrame(); mfxStatus ProcessQueuedFrame(mfxU8** pixelData); mfxStatus PutFrameProgressive(mfxHDLPair surface); mfxStatus PutFrameProgressive(mfxHDL surface); mfxStatus PutFrameProgressive(SurfaceIndex* idxSurf); mfxStatus PutFrameProgressive(mfxU8 *frame, mfxI32 Pitch); mfxStatus PutFrameInterlaced(mfxHDLPair surface); mfxStatus PutFrameInterlaced(mfxHDL surface); mfxStatus PutFrameInterlaced(SurfaceIndex* idxSurf); mfxStatus PutFrameInterlaced(mfxU8 *frame, mfxI32 Pitch); virtual mfxStatus calc_RaCa_Surf(mfxHDLPair surface, mfxF64& rscs); //private: // ASCVidSampleCm** m_videoData; }; }; #endif //_ASC_CM_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/src/000077500000000000000000000000001443134507600245125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/asc/src/asc_cm.cpp000066400000000000000000000721571443134507600264570ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc.h" #include "asc_cm.h" #include "asc_defs.h" #include "asc_cpu_dispatcher.h" #include "libmfx_core_interface.h" #ifdef MFX_ENABLE_ASC #include "genx_scd_gen12lp_isa.h" #endif #include "tree.h" #include "iofunctions.h" #include "motion_estimation_engine.h" #include #include #include static bool operator < (const mfxHDLPair & l, const mfxHDLPair & r) { return (l.first == r.first) ? (l.second < r.second) : (l.first < r.first); }; namespace ns_asc { ASCimageData_Cm::ASCimageData_Cm() { gpuImage = nullptr; idxImage = nullptr; } ASC_Cm::ASC_Cm() : m_device(nullptr) , m_queue(nullptr) , m_pSurfaceCp(nullptr) , m_pIdxSurfCp(nullptr) , m_program(nullptr) , m_kernel_p(nullptr) , m_kernel_t(nullptr) , m_kernel_b(nullptr) , m_kernel_cp(nullptr) , m_threadSpace(nullptr) , m_threadSpaceCp(nullptr) , m_subSamplingEv(nullptr) , m_frameCopyEv(nullptr) , m_task(nullptr) , m_taskCp(nullptr) , m_cmDeviceAssigned(false) , m_tableCmRelations2() , m_tableCmIndex2() { } mfxStatus ASC_Cm::VidSample_Alloc() { INT res = CM_SUCCESS; for (mfxI32 i = 0; i < ASCVIDEOSTATSBUF; i++) { MFX_SAFE_CALL(m_videoData[i]->layer.InitFrame(m_dataIn->layer)); if (Query_ASCCmDevice()) { res = m_device->CreateSurface2DUP(m_dataIn->layer->Extended_Width, m_dataIn->layer->Extended_Height, CM_SURFACE_FORMAT_A8, (void *)m_videoData[i]->layer.Image.data, static_cast(m_videoData[i])->layer.gpuImage); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = static_cast(m_videoData[i])->layer.gpuImage->GetIndex(static_cast(m_videoData[i])->layer.idxImage); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } else { static_cast(m_videoData[i])->layer.gpuImage = nullptr; static_cast(m_videoData[i])->layer.idxImage = nullptr; } } if (Query_ASCCmDevice()) { mfxU32 physicalSize = 0; res = m_device->GetSurface2DInfo(m_gpuwidth, m_gpuheight, CM_SURFACE_FORMAT_NV12, m_gpuImPitch, physicalSize); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); m_frameBkp = nullptr; m_frameBkp = (mfxU8*)memalign(0x1000, physicalSize); if (m_frameBkp == nullptr) return MFX_ERR_MEMORY_ALLOC; memset(m_frameBkp, 0, physicalSize); res = m_device->CreateSurface2DUP(m_gpuImPitch, m_gpuheight, CM_SURFACE_FORMAT_NV12, (void *)m_frameBkp, m_pSurfaceCp); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_pSurfaceCp->GetIndex(m_pIdxSurfCp); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } else { m_frameBkp = nullptr; m_pSurfaceCp = nullptr; m_pIdxSurfCp = nullptr; } return MFX_ERR_NONE; } void ASC_Cm::VidSample_dispose() { for (mfxI32 i = ASCVIDEOSTATSBUF - 1; i >= 0; i--) { if (m_videoData[i] != nullptr) { m_videoData[i]->layer.Close(); if (static_cast(m_videoData[i])->layer.gpuImage) { m_device->DestroySurface2DUP(static_cast(m_videoData[i])->layer.gpuImage); static_cast(m_videoData[i])->layer.gpuImage = nullptr; static_cast(m_videoData[i])->layer.idxImage = nullptr; } delete (m_videoData[i]); } } free(m_frameBkp); } mfxStatus ASC_Cm::alloc() { return VidSample_Alloc(); } mfxStatus ASC_Cm::InitCPU() { return alloc(); } mfxStatus ASC_Cm::InitGPUsurf(CmDevice* pCmDevice) { #ifdef MFX_ENABLE_KERNELS INT res = CM_SUCCESS; m_subSamplingEv = nullptr; m_frameCopyEv = nullptr; Reset_ASCCmDevice(); m_device = pCmDevice; if (!m_device) res = CM_FAILURE; SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); Set_ASCCmDevice(); mfxU32 hwType = 0; size_t hwSize = sizeof(hwType); res = m_device->GetCaps(CAP_GPU_PLATFORM, hwSize, &hwType); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->CreateQueue(m_queue); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); switch (hwType) { case PLATFORM_INTEL_BDW: case PLATFORM_INTEL_SKL: case PLATFORM_INTEL_KBL: case PLATFORM_INTEL_GLK: case PLATFORM_INTEL_CFL: case PLATFORM_INTEL_CNL: case PLATFORM_INTEL_BXT: case PLATFORM_INTEL_ICL: case PLATFORM_INTEL_ICLLP: return MFX_ERR_UNSUPPORTED; case PLATFORM_INTEL_TGLLP: case PLATFORM_INTEL_RKL: case PLATFORM_INTEL_DG1: case PLATFORM_INTEL_ADL_S: case PLATFORM_INTEL_ADL_P: case PLATFORM_INTEL_ADL_N: res = m_device->LoadProgram((void *)genx_scd_gen12lp, sizeof(genx_scd_gen12lp), m_program, "nojitter"); break; default: res = CM_NOT_IMPLEMENTED; } SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; #else (void)pCmDevice; return MFX_ERR_UNSUPPORTED; #endif } mfxStatus ASC_Cm::IO_Setup() { mfxStatus sts = MFX_ERR_NONE; sts = alloc(); SCD_CHECK_MFX_ERR(sts); if (Query_ASCCmDevice()) { SCD_CHECK_CM_ERR(m_device->CreateKernel(m_program, CM_KERNEL_FUNCTION(surfaceCopy_Y), m_kernel_cp), MFX_ERR_DEVICE_FAILED); m_threadsWidth = (UINT)ceil((double)m_gpuwidth / SCD_BLOCK_PIXEL_WIDTH); m_threadsHeight = (UINT)ceil((double)m_gpuheight / SCD_BLOCK_HEIGHT); SCD_CHECK_CM_ERR(m_device->CreateThreadSpace(m_threadsWidth, m_threadsHeight, m_threadSpaceCp), MFX_ERR_DEVICE_FAILED); SCD_CHECK_CM_ERR(m_kernel_cp->SetThreadCount(m_threadsWidth * m_threadsHeight), MFX_ERR_DEVICE_FAILED); #ifndef CMRT_EMU SCD_CHECK_CM_ERR(m_kernel_cp->AssociateThreadSpace(m_threadSpaceCp), MFX_ERR_DEVICE_FAILED); #endif } else { m_kernel_cp = nullptr; m_threadSpaceCp = nullptr; } return sts; } mfxStatus ASC_Cm::SetKernel(SurfaceIndex *idxFrom, SurfaceIndex *idxTo, CmTask **subSamplingTask, mfxU32 parity) { mfxU32 argIdx = 0; INT res; //Progressive Point subsampling kernel CmKernel **subKernel = nullptr; if (m_dataIn->interlaceMode == ASCprogressive_frame) { subKernel = &m_kernel_p; } else { if (parity == ASCTopField) subKernel = &m_kernel_t; else if (parity == ASCBottomField) subKernel = &m_kernel_b; else return MFX_ERR_UNDEFINED_BEHAVIOR; } int tmp_subWidth = subWidth, tmp_subHeight = subHeight; res = (*subKernel)->SetKernelArg(argIdx++, sizeof(SurfaceIndex), idxFrom); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subKernel)->SetKernelArg(argIdx++, sizeof(SurfaceIndex), idxTo); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subKernel)->SetKernelArg(argIdx++, sizeof(int), &m_gpuwidth); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subKernel)->SetKernelArg(argIdx++, sizeof(int), &m_gpuheight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subKernel)->SetKernelArg(argIdx++, sizeof(int), &tmp_subWidth); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subKernel)->SetKernelArg(argIdx++, sizeof(int), &tmp_subHeight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); /*if (*subSamplingTask) res = (*subSamplingTask)->Reset(); else */res = m_device->CreateTask(*subSamplingTask); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*subSamplingTask)->AddKernel((*subKernel)); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus ASC_Cm::SetKernel(SurfaceIndex *idxFrom, CmTask **subSamplingTask, mfxU32 parity) { return (SetKernel(idxFrom, static_cast(m_videoData[ASCCurrent_Frame])->layer.idxImage, subSamplingTask, parity)); } mfxStatus ASC_Cm::SetKernel(SurfaceIndex *idxFrom, mfxU32 parity) { return(SetKernel(idxFrom, &m_task, parity)); } #ifndef CMRT_EMU mfxStatus ASC_Cm::QueueFrame(SurfaceIndex *idxFrom, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity) #else mfxStatus ASC_Cm::QueueFrame(SurfaceIndex *idxFrom, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask, CmThreadSpace *subThreadSpace, mfxU32 parity) #endif { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; *subSamplingEv = NULL;// CM_NO_EVENT; INT res; res = SetKernel(idxFrom, idxTo, subSamplingTask, parity); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); #ifndef CMRT_EMU res = m_queue->Enqueue(*subSamplingTask, *subSamplingEv); #else res = m_queue->Enqueue(*subSamplingTask, *subSamplingEv, subThreadSpace); #endif SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } #ifndef CMRT_EMU mfxStatus ASC_Cm::QueueFrame(SurfaceIndex *idxFrom, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity) #else mfxStatus ASC_Cm::QueueFrame(SurfaceIndex *idxFrom, CmEvent **subSamplingEv, CmTask **subSamplingTask, CmThreadSpace *subThreadSpace, mfxU32 parity) #endif { #ifndef CMRT_EMU return(QueueFrame(idxFrom, static_cast(m_videoData[ASCCurrent_Frame])->layer.idxImage, subSamplingEv, subSamplingTask, parity)); #else return(QueueFrame(idxFrom, m_videoData[ASCCurrent_Frame]->layer.idxImage, subSamplingEv, subSamplingTask, subThreadSpace, parity)); #endif } mfxStatus ASC_Cm::QueueFrame(SurfaceIndex *idxFrom, mfxU32 parity) { return( #ifndef CMRT_EMU QueueFrame(idxFrom, &m_subSamplingEv, &m_task, parity) #else QueueFrame(idxFrom, &m_subSamplingEv, &m_task, m_threadSpace, parity) #endif ); } mfxStatus ASC_Cm::QueueFrame(mfxHDLPair frameHDL, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; m_videoData[ASCCurrent_Frame]->frame_number = m_videoData[ASCReference_Frame]->frame_number + 1; CmSurface2D* p_surfaceFrom = nullptr; SurfaceIndex* idxFrom = nullptr; CreateCmSurface2D(frameHDL, p_surfaceFrom, idxFrom); mfxStatus sts = QueueFrame(idxFrom, idxTo, subSamplingEv, subSamplingTask, parity); SCD_CHECK_MFX_ERR(sts); return MFX_ERR_NONE; } mfxStatus ASC_Cm::QueueFrame(mfxHDLPair frameHDL, CmEvent **subSamplingEv, CmTask **subSamplingTask, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; m_videoData[ASCCurrent_Frame]->frame_number = m_videoData[ASCReference_Frame]->frame_number + 1; CmSurface2D* p_surfaceFrom = nullptr; SurfaceIndex* idxFrom = nullptr; CreateCmSurface2D(frameHDL, p_surfaceFrom, idxFrom); mfxStatus sts = QueueFrame(idxFrom, subSamplingEv, subSamplingTask, parity); SCD_CHECK_MFX_ERR(sts); return MFX_ERR_NONE; } mfxStatus ASC_Cm::QueueFrame(mfxHDLPair frameHDL, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; m_videoData[ASCCurrent_Frame]->frame_number = m_videoData[ASCReference_Frame]->frame_number + 1; CmSurface2D* p_surfaceFrom = nullptr; SurfaceIndex* idxFrom = nullptr; CreateCmSurface2D(frameHDL, p_surfaceFrom, idxFrom); mfxStatus sts = QueueFrame(idxFrom, parity); SCD_CHECK_MFX_ERR(sts); return MFX_ERR_NONE; } mfxStatus ASC_Cm::RunFrame(SurfaceIndex *idxFrom, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; CmEvent* e = NULL;// CM_NO_EVENT; INT res; res = SetKernel(idxFrom, parity); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); #ifndef CMRT_EMU res = m_queue->Enqueue(m_task, e); #else res = m_queue->Enqueue(m_task, e, m_threadSpace); #endif SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = e->WaitForTaskFinished(); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->DestroyTask(m_task); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_queue->DestroyEvent(e); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); AscFrameAnalysis(); return MFX_ERR_NONE; } mfxStatus ASC_Cm::RunFrame(mfxHDLPair frameHDL, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; m_videoData[ASCCurrent_Frame]->frame_number = m_videoData[ASCReference_Frame]->frame_number + 1; CmSurface2D* p_surfaceFrom = 0; SurfaceIndex *idxFrom = nullptr; CreateCmSurface2D(frameHDL, p_surfaceFrom, idxFrom); mfxStatus sts = RunFrame(idxFrom, parity); SCD_CHECK_MFX_ERR(sts); return MFX_ERR_NONE; } mfxStatus ASC_Cm::RunFrame(mfxU8 *frame, mfxU32 parity) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; m_videoData[ASCCurrent_Frame]->frame_number = m_videoData[ASCReference_Frame]->frame_number + 1; (this->*(resizeFunc))(frame, m_width, m_height, m_pitch, (ASCLayers)0, parity); RsCsCalc(); DetectShotChangeFrame(); Put_LTR_Hint(); GeneralBufferRotation(); return MFX_ERR_NONE; } mfxStatus ASC_Cm::CreateCmSurface2D(mfxHDLPair pSrcPair, CmSurface2D* & pCmSurface2D, SurfaceIndex* &pCmSrcIndex) { INT cmSts = 0; std::map::iterator it; std::map::iterator it_idx; it = m_tableCmRelations2.find(pSrcPair); if (m_tableCmRelations2.end() == it) { //UMC::AutomaticUMCMutex guard(m_guard); { cmSts = m_device->CreateSurface2D(pSrcPair, pCmSurface2D); SCD_CHECK_CM_ERR(cmSts, MFX_ERR_DEVICE_FAILED); m_tableCmRelations2.insert(std::pair(pSrcPair, pCmSurface2D)); } cmSts = pCmSurface2D->GetIndex(pCmSrcIndex); SCD_CHECK_CM_ERR(cmSts, MFX_ERR_DEVICE_FAILED); m_tableCmIndex2.insert(std::pair(pCmSurface2D, pCmSrcIndex)); } else { pCmSurface2D = it->second; it_idx = m_tableCmIndex2.find(pCmSurface2D); if (it_idx == m_tableCmIndex2.end()) return MFX_ERR_UNDEFINED_BEHAVIOR; else pCmSrcIndex = it_idx->second; } return MFX_ERR_NONE; } mfxStatus ASC_Cm::CreateCmKernels() { INT res; m_kernel_p = NULL; m_kernel_t = NULL; m_kernel_b = NULL; m_threadSpace = NULL; m_threadSpaceCp = NULL; m_threadsWidth = subWidth / OUT_BLOCK; m_threadsHeight = subHeight; res = m_device->CreateThreadSpace(m_threadsWidth, m_threadsHeight, m_threadSpace); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->CreateKernel(m_program, CM_KERNEL_FUNCTION(SubSamplePoint_p), m_kernel_p); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_p->SetThreadCount(m_threadsWidth * m_threadsHeight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->CreateKernel(m_program, CM_KERNEL_FUNCTION(SubSamplePoint_t), m_kernel_t); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_t->SetThreadCount(m_threadsWidth * m_threadsHeight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->CreateKernel(m_program, CM_KERNEL_FUNCTION(SubSamplePoint_b), m_kernel_b); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_b->SetThreadCount(m_threadsWidth * m_threadsHeight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); #ifndef CMRT_EMU res = m_kernel_p->AssociateThreadSpace(m_threadSpace); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_t->AssociateThreadSpace(m_threadSpace); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_b->AssociateThreadSpace(m_threadSpace); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); #endif return MFX_ERR_NONE; } mfxStatus ASC_Cm::CopyFrameSurface(mfxHDLPair frameHDL) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; CmSurface2D* p_surfaceFrom = nullptr; mfxStatus sts; INT res; SurfaceIndex *idxFrom = nullptr; sts = CreateCmSurface2D(frameHDL, p_surfaceFrom, idxFrom); SCD_CHECK_MFX_ERR(sts); m_frameCopyEv = NULL;// CM_NO_EVENT; mfxU32 argIdx = 0; //Copy pixels kernel res = m_kernel_cp->SetKernelArg(argIdx++, sizeof(SurfaceIndex), idxFrom); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_cp->SetKernelArg(argIdx++, sizeof(SurfaceIndex), m_pIdxSurfCp); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); mfxU32 width_dword = (UINT)ceil((double)m_gpuwidth / 4); res = m_kernel_cp->SetKernelArg(argIdx++, sizeof(mfxU32), &width_dword); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_cp->SetKernelArg(argIdx++, sizeof(mfxI32), &m_gpuheight); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_kernel_cp->SetKernelArg(argIdx++, sizeof(mfxU32), &m_gpuImPitch); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->CreateTask(m_taskCp); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_taskCp->AddKernel(m_kernel_cp); //progressive SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); #ifndef CMRT_EMU res = m_queue->Enqueue(m_taskCp, m_frameCopyEv); #else res = m_queue->Enqueue(m_taskCp, m_frameCopyEv, m_threadSpaceCp); #endif SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_frameCopyEv->WaitForTaskFinished(); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->DestroyTask(m_taskCp); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_queue->DestroyEvent(m_frameCopyEv); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return sts; } void ASC_Cm::Reset_ASCCmDevice() { m_cmDeviceAssigned = false; } void ASC_Cm::Set_ASCCmDevice() { m_cmDeviceAssigned = true; } bool ASC_Cm::Query_ASCCmDevice() { return m_cmDeviceAssigned; } mfxStatus ASC_Cm::AssignResources(mfxU8 position, mfxU8 *pixelData) { if (!IsASCinitialized()) return MFX_ERR_DEVICE_FAILED; if (pixelData == nullptr) return MFX_ERR_DEVICE_FAILED; m_videoData[position]->layer.Image.Y = pixelData; return MFX_ERR_NONE; } mfxStatus ASC_Cm::AssignResources(mfxU8 position, CmSurface2DUP *inputFrame, mfxU8 *pixelData) { if (!IsASCinitialized()) return MFX_ERR_DEVICE_FAILED; if (inputFrame == nullptr) return MFX_ERR_DEVICE_FAILED; //std::swap(m_videoData[position]->layer.gpuImage, inputFrame); static_cast(m_videoData[position])->layer.gpuImage = inputFrame; static_cast(m_videoData[position])->layer.gpuImage->GetIndex(static_cast(m_videoData[position])->layer.idxImage); if (pixelData == nullptr) return MFX_ERR_DEVICE_FAILED; /*std::swap(m_videoData[position]->layer.Image.data, pixelData); m_videoData[position]->layer.Image.Y = m_videoData[position]->layer.Image.data;*/ m_videoData[position]->layer.Image.Y = pixelData; return MFX_ERR_NONE; } mfxStatus ASC_Cm::SwapResources(mfxU8 position, CmSurface2DUP **inputFrame, mfxU8 **pixelData) { if (!IsASCinitialized()) return MFX_ERR_DEVICE_FAILED; if (inputFrame == nullptr) return MFX_ERR_DEVICE_FAILED; std::swap(static_cast(m_videoData[position])->layer.gpuImage, *inputFrame); static_cast(m_videoData[position])->layer.gpuImage->GetIndex(static_cast(m_videoData[position])->layer.idxImage); if (pixelData == nullptr) return MFX_ERR_DEVICE_FAILED; std::swap(m_videoData[position]->layer.Image.data, *pixelData); m_videoData[position]->layer.Image.Y = m_videoData[position]->layer.Image.data; return MFX_ERR_NONE; } mfxStatus ASC_Cm::QueueFrameProgressive(SurfaceIndex* idxSurf) { mfxStatus sts = QueueFrame(idxSurf, ASCTopField); return sts; } mfxStatus ASC_Cm::QueueFrameProgressive(SurfaceIndex* idxSurf, CmEvent *subSamplingEv, CmTask *subSamplingTask) { mfxStatus sts = QueueFrame(idxSurf, &subSamplingEv, &subSamplingTask, ASCTopField); return sts; } mfxStatus ASC_Cm::QueueFrameProgressive(mfxHDLPair surface, SurfaceIndex *idxTo, CmEvent **subSamplingEv, CmTask **subSamplingTask) { mfxStatus sts = QueueFrame(surface, idxTo, subSamplingEv, subSamplingTask, ASCTopField); return sts; } mfxStatus ASC_Cm::QueueFrameProgressive(mfxHDLPair surface, CmEvent **subSamplingEv, CmTask **subSamplingTask) { mfxStatus sts = QueueFrame(surface, subSamplingEv, subSamplingTask, ASCTopField); return sts; } mfxStatus ASC_Cm::QueueFrameProgressive(mfxHDLPair surface) { mfxStatus sts = QueueFrame(surface, ASCTopField); return sts; } mfxStatus ASC_Cm::QueueFrameInterlaced(SurfaceIndex* idxSurf) { mfxStatus sts = QueueFrame(idxSurf, m_dataIn->currentField); m_dataReady = (sts == MFX_ERR_NONE); SetNextField(); return sts; } mfxStatus ASC_Cm::QueueFrameInterlaced(mfxHDLPair surface) { mfxStatus sts = QueueFrame(surface, m_dataIn->currentField); SetNextField(); return sts; } mfxStatus ASC_Cm::ProcessQueuedFrame(CmEvent **subSamplingEv, CmTask **subSamplingTask, CmSurface2DUP **inputFrame, mfxU8 **pixelData) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; INT res; if (*subSamplingEv) { res = (*subSamplingEv)->WaitForTaskFinished(); if (res == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); if(inputFrame != nullptr && pixelData != nullptr) MFX_SAFE_CALL(SwapResources(ASCCurrent_Frame, inputFrame, pixelData)) AscFrameAnalysis(); res = m_queue->DestroyEvent(*subSamplingEv); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = m_device->DestroyTask(*subSamplingTask); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); m_dataReady = (res == CM_SUCCESS); } else { return MFX_ERR_DEVICE_FAILED; } return MFX_ERR_NONE; } mfxStatus ASC_Cm::ProcessQueuedFrame() { return ProcessQueuedFrame(&m_subSamplingEv, &m_task, nullptr, nullptr); } mfxStatus ASC_Cm::ProcessQueuedFrame(mfxU8** pixelData) { MFX_CHECK(IsASCinitialized(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR2(pixelData, *pixelData); memcpy(m_videoData[ASCCurrent_Frame]->layer.Image.data, *pixelData, subWidth * subHeight); m_videoData[ASCCurrent_Frame]->layer.Image.Y = m_videoData[ASCCurrent_Frame]->layer.Image.data; AscFrameAnalysis(); return MFX_ERR_NONE; } mfxStatus ASC_Cm::PutFrameProgressive(SurfaceIndex* idxSurf) { mfxStatus sts = RunFrame(idxSurf, ASCTopField); m_dataReady = (sts == MFX_ERR_NONE); return sts; } mfxStatus ASC_Cm::PutFrameProgressive(mfxHDLPair surface) { mfxStatus sts = RunFrame(surface, ASCTopField); m_dataReady = (sts == MFX_ERR_NONE); return sts; } mfxStatus ASC_Cm::PutFrameProgressive(mfxHDL surface) { mfxHDLPair surfPair = { surface, nullptr }; mfxStatus sts = PutFrameProgressive(surfPair); return sts; } mfxStatus ASC_Cm::PutFrameProgressive(mfxU8 *frame, mfxI32 Pitch) { mfxStatus sts; if (Pitch > 0) { sts = SetPitch(Pitch); SCD_CHECK_MFX_ERR(sts); } sts = RunFrame(frame, ASCTopField); SCD_CHECK_MFX_ERR(sts); m_dataReady = (sts == MFX_ERR_NONE); return sts; } mfxStatus ASC_Cm::PutFrameInterlaced(mfxU8 *frame, mfxI32 Pitch) { mfxStatus sts; if (Pitch > 0) { sts = SetPitch(Pitch); SCD_CHECK_MFX_ERR(sts); } sts = RunFrame(frame, m_dataIn->currentField); m_dataReady = (sts == MFX_ERR_NONE); SetNextField(); return sts; } mfxStatus ASC_Cm::PutFrameInterlaced(SurfaceIndex* idxSurf) { mfxStatus sts = RunFrame(idxSurf, m_dataIn->currentField); m_dataReady = (sts == MFX_ERR_NONE); SetNextField(); return sts; } mfxStatus ASC_Cm::PutFrameInterlaced(mfxHDLPair surface) { mfxStatus sts = RunFrame(surface, m_dataIn->currentField); m_dataReady = (sts == MFX_ERR_NONE); SetNextField(); return sts; } mfxStatus ASC_Cm::PutFrameInterlaced(mfxHDL surface) { mfxHDLPair surfPair = { surface, nullptr }; mfxStatus sts = PutFrameInterlaced(surfPair); return sts; } mfxStatus ASC_Cm::calc_RaCa_Surf(mfxHDLPair surface, mfxF64& rscs) { if (!Query_ASCCmDevice()) return MFX_ERR_UNDEFINED_BEHAVIOR; mfxStatus sts = CopyFrameSurface(surface); SCD_CHECK_MFX_ERR(sts); sts = calc_RaCa_pic(m_frameBkp, m_gpuwidth, m_gpuheight, m_gpuImPitch, rscs); SCD_CHECK_MFX_ERR(sts); return sts; } void ASC_Cm::Close() { if (m_videoData != nullptr) { VidSample_dispose(); delete[] m_videoData; m_videoData = nullptr; } if (m_support != nullptr) { VidRead_dispose(); delete m_support; m_support = nullptr; } if (m_dataIn != nullptr) { delete m_dataIn->layer; delete m_dataIn; m_dataIn = nullptr; } if (m_device) { for (auto& surf : m_tableCmRelations2) { CmSurface2D* temp = surf.second; m_device->DestroySurface(temp); } m_tableCmRelations2.clear(); m_tableCmIndex2.clear(); if (m_kernel_p) m_device->DestroyKernel(m_kernel_p); if (m_kernel_t) m_device->DestroyKernel(m_kernel_t); if (m_kernel_b) m_device->DestroyKernel(m_kernel_b); if (m_kernel_cp) m_device->DestroyKernel(m_kernel_cp); if (m_program) m_device->DestroyProgram(m_program); if (m_pSurfaceCp) m_device->DestroySurface2DUP(m_pSurfaceCp); if (m_threadSpace) m_device->DestroyThreadSpace(m_threadSpace); if (m_threadSpaceCp) m_device->DestroyThreadSpace(m_threadSpaceCp); if (m_task) m_device->DestroyTask(m_task); if (m_taskCp) m_device->DestroyTask(m_taskCp); } m_pSurfaceCp = nullptr; m_kernel_p = nullptr; m_kernel_t = nullptr; m_kernel_b = nullptr; m_kernel_cp = nullptr; m_program = nullptr; m_device = nullptr; m_threadSpace = nullptr; m_threadSpaceCp = nullptr; } bool ASC_Cm::Query_resize_Event() { return (m_subSamplingEv != nullptr); } mfxStatus ASC_Cm::Init(mfxI32 Width, mfxI32 Height, mfxI32 Pitch, mfxU32 PicStruct, #ifdef MFX_ENABLE_KERNELS CmDevice* pCmDevice, #endif bool isCmSupported) { mfxStatus sts = MFX_ERR_NONE; INT res; m_device = nullptr; m_queue = nullptr; m_program = nullptr; m_task = nullptr; m_taskCp = nullptr; m_AVX2_available = CpuFeature_AVX2(); m_SSE4_available = CpuFeature_SSE41(); ASC_CPU_DISP_INIT_C(GainOffset); ASC_CPU_DISP_INIT_SSE4_C(RsCsCalc_4x4); ASC_CPU_DISP_INIT_C(RsCsCalc_bound); ASC_CPU_DISP_INIT_C(RsCsCalc_diff); ASC_CPU_DISP_INIT_SSE4_C(ImageDiffHistogram); ASC_CPU_DISP_INIT_AVX2_SSE4_C(ME_SAD_8x8_Block_Search); ASC_CPU_DISP_INIT_SSE4_C(Calc_RaCa_pic); InitStruct(); try { m_dataIn = new ASCVidData; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } m_dataIn->layer = nullptr; try { m_dataIn->layer = new ASCImDetails; //ASCVidSampleCm* m_videoData = new ASCVidSample * [ASCVIDEOSTATSBUF]; for (mfxU8 i = 0; i < ASCVIDEOSTATSBUF; i++) m_videoData[i] = nullptr; m_support = new ASCVidRead; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } #ifdef MFX_ENABLE_KERNELS if (pCmDevice && isCmSupported) { res = InitGPUsurf(pCmDevice); SCD_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } #else (void)res; #endif for (mfxI32 i = 0; i < ASCVIDEOSTATSBUF; i++) { try { m_videoData[i] = new ASCVidSampleCm; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } } Params_Init(); sts = SetDimensions(Width, Height, Pitch); SCD_CHECK_MFX_ERR(sts); m_gpuwidth = Width; m_gpuheight = Height; VidSample_Init(); Setup_Environment(); sts = IO_Setup(); SCD_CHECK_MFX_ERR(sts); sts = VidRead_Init(); SCD_CHECK_MFX_ERR(sts); SetUltraFastDetection(); if (Query_ASCCmDevice() && isCmSupported) { sts = CreateCmKernels(); SCD_CHECK_MFX_ERR(sts); } sts = SetInterlaceMode((PicStruct & MFX_PICSTRUCT_FIELD_TFF) ? ASCtopfieldfirst_frame : (PicStruct & MFX_PICSTRUCT_FIELD_BFF) ? ASCbotfieldFirst_frame : ASCprogressive_frame); SCD_CHECK_MFX_ERR(sts); m_dataReady = false; m_ASCinitialized = (sts == MFX_ERR_NONE); return sts; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/000077500000000000000000000000001443134507600272375ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/CMakeLists.txt000066400000000000000000000035171443134507600320050ustar00rootroot00000000000000# Copyright (c) 2022 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_library(cmrt_cross_platform_hw STATIC include/cmrt_cross_platform.h include/cmrt_utility.h include/cm_mem_copy.h include/cm_gpu_copy_code.h include/cmrt_vpp.h src/cmrt_cross_platform.cpp src/cmrt_utility.cpp src/cm_mem_copy.cpp ) target_include_directories(cmrt_cross_platform_hw PUBLIC include ${MSDK_STUDIO_ROOT}/shared/asc/include ${MSDK_STUDIO_ROOT}/mfx_lib/ext/genx/copy_kernels/isa ) target_sources(cmrt_cross_platform_hw PRIVATE ${MSDK_STUDIO_ROOT}/mfx_lib/ext/genx/copy_kernels/isa/genx_copy_kernel_gen12lp_isa.cpp ) target_link_libraries(cmrt_cross_platform_hw PUBLIC $<$:cfgmgr32> mfx_static_lib vm mfx_logging PRIVATE mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include/000077500000000000000000000000001443134507600306625ustar00rootroot00000000000000cm_gpu_copy_code.h000066400000000000000000003361631443134507600342660ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CM_GPU_COPY_CODE_H__ #define __CM_GPU_COPY_CODE_H__ #define CM_CODE_SIZE 16783 const unsigned char cm_code[CM_CODE_SIZE] = { 0xEF, 0xBE, 0xAD, 0xDE, 0x02, 0x00, 0x02, 0x00, 0x2B, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x32, 0x44, 0x54, 0x6F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0x88, 0x00, 0x00, 0x00, 0x32, 0x13, 0x00, 0x00, 0xBB, 0x06, 0x00, 0x00, 0x2F, 0x27, 0x00, 0x00, 0x30, 0x0D, 0x00, 0x00, 0x2B, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x54, 0x6F, 0x32, 0x44, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0xBA, 0x13, 0x00, 0x00, 0x75, 0x13, 0x00, 0x00, 0x24, 0x1A, 0x00, 0x00, 0x5F, 0x34, 0x00, 0x00, 0x30, 0x0D, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x32, 0x44, 0x54, 0x6F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0x00, 0x41, 0x73, 0x6D, 0x4E, 0x61, 0x6D, 0x65, 0x00, 0x53, 0x4C, 0x4D, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x42, 0x42, 0x5F, 0x30, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x00, 0x5F, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x32, 0x44, 0x54, 0x6F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0x5F, 0x42, 0x42, 0x5F, 0x31, 0x00, 0x56, 0x32, 0x00, 0x56, 0x33, 0x00, 0x42, 0x42, 0x5F, 0x33, 0x35, 0x00, 0x56, 0x31, 0x34, 0x00, 0x56, 0x32, 0x33, 0x34, 0x00, 0x56, 0x31, 0x35, 0x00, 0x56, 0x31, 0x38, 0x00, 0x56, 0x32, 0x33, 0x35, 0x00, 0x56, 0x31, 0x39, 0x00, 0x56, 0x32, 0x33, 0x00, 0x56, 0x32, 0x32, 0x38, 0x00, 0x46, 0x6C, 0x61, 0x67, 0x52, 0x65, 0x67, 0x4E, 0x75, 0x6D, 0x00, 0x42, 0x42, 0x5F, 0x33, 0x39, 0x00, 0x42, 0x42, 0x5F, 0x33, 0x38, 0x00, 0x56, 0x32, 0x33, 0x36, 0x00, 0x56, 0x32, 0x33, 0x37, 0x00, 0x56, 0x34, 0x00, 0x56, 0x33, 0x30, 0x00, 0x56, 0x32, 0x33, 0x38, 0x00, 0x56, 0x32, 0x33, 0x39, 0x00, 0x56, 0x35, 0x00, 0x56, 0x33, 0x33, 0x00, 0x56, 0x32, 0x34, 0x30, 0x00, 0x56, 0x32, 0x34, 0x31, 0x00, 0x56, 0x36, 0x00, 0x56, 0x33, 0x36, 0x00, 0x56, 0x32, 0x34, 0x32, 0x00, 0x56, 0x32, 0x34, 0x33, 0x00, 0x56, 0x37, 0x00, 0x56, 0x33, 0x39, 0x00, 0x56, 0x32, 0x34, 0x34, 0x00, 0x56, 0x32, 0x34, 0x35, 0x00, 0x56, 0x38, 0x00, 0x56, 0x32, 0x34, 0x36, 0x00, 0x56, 0x32, 0x34, 0x37, 0x00, 0x56, 0x39, 0x00, 0x56, 0x32, 0x34, 0x38, 0x00, 0x56, 0x32, 0x34, 0x39, 0x00, 0x56, 0x31, 0x30, 0x00, 0x56, 0x32, 0x35, 0x30, 0x00, 0x56, 0x32, 0x35, 0x31, 0x00, 0x56, 0x31, 0x31, 0x00, 0x56, 0x31, 0x32, 0x00, 0x56, 0x31, 0x33, 0x00, 0x56, 0x35, 0x35, 0x00, 0x56, 0x35, 0x34, 0x00, 0x56, 0x32, 0x35, 0x32, 0x00, 0x56, 0x32, 0x35, 0x33, 0x00, 0x56, 0x36, 0x30, 0x00, 0x56, 0x32, 0x35, 0x34, 0x00, 0x56, 0x32, 0x35, 0x35, 0x00, 0x56, 0x32, 0x35, 0x36, 0x00, 0x56, 0x36, 0x36, 0x00, 0x56, 0x36, 0x34, 0x00, 0x56, 0x32, 0x35, 0x37, 0x00, 0x56, 0x32, 0x35, 0x38, 0x00, 0x56, 0x32, 0x35, 0x39, 0x00, 0x56, 0x37, 0x31, 0x00, 0x56, 0x36, 0x39, 0x00, 0x56, 0x32, 0x36, 0x30, 0x00, 0x56, 0x32, 0x36, 0x31, 0x00, 0x56, 0x32, 0x36, 0x32, 0x00, 0x56, 0x37, 0x36, 0x00, 0x56, 0x37, 0x34, 0x00, 0x56, 0x32, 0x36, 0x33, 0x00, 0x56, 0x32, 0x36, 0x34, 0x00, 0x56, 0x32, 0x36, 0x35, 0x00, 0x56, 0x38, 0x31, 0x00, 0x56, 0x37, 0x39, 0x00, 0x56, 0x32, 0x36, 0x36, 0x00, 0x56, 0x32, 0x36, 0x37, 0x00, 0x56, 0x32, 0x36, 0x38, 0x00, 0x56, 0x38, 0x36, 0x00, 0x56, 0x38, 0x34, 0x00, 0x56, 0x32, 0x36, 0x39, 0x00, 0x56, 0x32, 0x37, 0x30, 0x00, 0x56, 0x32, 0x37, 0x31, 0x00, 0x56, 0x39, 0x31, 0x00, 0x56, 0x38, 0x39, 0x00, 0x56, 0x32, 0x37, 0x32, 0x00, 0x56, 0x32, 0x37, 0x33, 0x00, 0x56, 0x32, 0x37, 0x34, 0x00, 0x56, 0x39, 0x36, 0x00, 0x56, 0x39, 0x35, 0x00, 0x56, 0x39, 0x34, 0x00, 0x56, 0x32, 0x37, 0x35, 0x00, 0x56, 0x32, 0x37, 0x36, 0x00, 0x56, 0x31, 0x30, 0x32, 0x00, 0x56, 0x32, 0x37, 0x37, 0x00, 0x56, 0x32, 0x37, 0x38, 0x00, 0x56, 0x32, 0x37, 0x39, 0x00, 0x56, 0x31, 0x30, 0x36, 0x00, 0x56, 0x32, 0x38, 0x30, 0x00, 0x56, 0x32, 0x38, 0x31, 0x00, 0x56, 0x32, 0x38, 0x32, 0x00, 0x56, 0x31, 0x31, 0x31, 0x00, 0x56, 0x32, 0x38, 0x33, 0x00, 0x56, 0x32, 0x38, 0x34, 0x00, 0x56, 0x32, 0x38, 0x35, 0x00, 0x42, 0x42, 0x5F, 0x39, 0x35, 0x00, 0x42, 0x42, 0x5F, 0x39, 0x36, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x07, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x64, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x01, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x01, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x12, 0x00, 0x02, 0x31, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x01, 0x00, 0x20, 0x00, 0x04, 0x00, 0x02, 0x02, 0x00, 0x24, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x04, 0x00, 0x00, 0x11, 0x00, 0x2C, 0x00, 0x04, 0x00, 0xB5, 0x0C, 0x00, 0x00, 0x7D, 0x06, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1C, 0x47, 0x50, 0x55, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x75, 0x6E, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x65, 0x64, 0x5F, 0x67, 0x65, 0x6E, 0x78, 0x5F, 0x30, 0x2E, 0x61, 0x73, 0x6D, 0x03, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x31, 0x01, 0x00, 0x30, 0x02, 0x00, 0x31, 0x03, 0x00, 0x29, 0x90, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x01, 0x29, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0x00, 0x00, 0x00, 0x29, 0x90, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x01, 0x29, 0x90, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x08, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x2C, 0x90, 0x03, 0x02, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0x00, 0x00, 0x00, 0x32, 0x90, 0x01, 0x00, 0x04, 0x00, 0x31, 0x05, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0x31, 0x04, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x19, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1B, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x20, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x40, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x21, 0x01, 0x23, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x60, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x25, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x21, 0x01, 0x27, 0x00, 0x00, 0x00, 0x26, 0x90, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x2B, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x2E, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x21, 0x01, 0x31, 0x00, 0x00, 0x00, 0x37, 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x32, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x33, 0x00, 0x00, 0x00, 0x21, 0x01, 0x34, 0x00, 0x00, 0x00, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x08, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0C, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x10, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x14, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x14, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x18, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1C, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1C, 0x10, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x09, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x09, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0D, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0D, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x11, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x11, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x15, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x15, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x19, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x19, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1D, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1D, 0x10, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0A, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0E, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x12, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x12, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x16, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x16, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1A, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1A, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1E, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1E, 0x10, 0x00, 0x02, 0x00, 0x23, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0B, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0B, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0F, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x0F, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x13, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x13, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x17, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x17, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1B, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1B, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1F, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x35, 0x00, 0x1F, 0x10, 0x00, 0x02, 0x00, 0x27, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x08, 0x10, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0C, 0x10, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x10, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0D, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0D, 0x10, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x31, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0A, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0A, 0x10, 0x00, 0x02, 0x00, 0x31, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0E, 0x10, 0x00, 0x02, 0x00, 0x31, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x34, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x34, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0B, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0B, 0x10, 0x00, 0x02, 0x00, 0x34, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0F, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0F, 0x10, 0x00, 0x02, 0x00, 0x34, 0x00, 0x03, 0x10, 0x66, 0x02, 0x10, 0x90, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x39, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x80, 0x00, 0x10, 0x90, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x43, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x00, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x47, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x48, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x80, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x00, 0x02, 0x10, 0x90, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x51, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x52, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x80, 0x02, 0x10, 0x90, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x06, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x55, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x56, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x57, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x00, 0x03, 0x10, 0x90, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x07, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x59, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x35, 0x00, 0x80, 0x03, 0x01, 0x90, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x60, 0x00, 0x00, 0x00, 0x21, 0x01, 0x36, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x64, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x65, 0x00, 0x00, 0x00, 0x21, 0x01, 0x36, 0x00, 0x80, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x68, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x66, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x69, 0x00, 0x00, 0x00, 0x21, 0x01, 0x36, 0x00, 0x00, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x03, 0x02, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x36, 0x00, 0x80, 0x01, 0x31, 0x06, 0x00, 0x34, 0x90, 0x00, 0x00, 0x31, 0x07, 0x00, 0x6C, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x54, 0x6F, 0x32, 0x44, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0x00, 0x41, 0x73, 0x6D, 0x4E, 0x61, 0x6D, 0x65, 0x00, 0x53, 0x4C, 0x4D, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x42, 0x42, 0x5F, 0x39, 0x37, 0x00, 0x42, 0x42, 0x5F, 0x39, 0x38, 0x00, 0x5F, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x54, 0x6F, 0x32, 0x44, 0x5F, 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x5F, 0x6E, 0x76, 0x31, 0x32, 0x5F, 0x31, 0x32, 0x38, 0x5F, 0x66, 0x75, 0x6C, 0x6C, 0x5F, 0x42, 0x42, 0x5F, 0x39, 0x38, 0x00, 0x56, 0x31, 0x31, 0x36, 0x00, 0x56, 0x31, 0x31, 0x37, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x33, 0x32, 0x00, 0x56, 0x31, 0x32, 0x38, 0x00, 0x56, 0x32, 0x38, 0x36, 0x00, 0x56, 0x31, 0x32, 0x39, 0x00, 0x56, 0x31, 0x33, 0x32, 0x00, 0x56, 0x32, 0x38, 0x37, 0x00, 0x56, 0x31, 0x33, 0x33, 0x00, 0x56, 0x31, 0x33, 0x37, 0x00, 0x56, 0x32, 0x33, 0x31, 0x00, 0x46, 0x6C, 0x61, 0x67, 0x52, 0x65, 0x67, 0x4E, 0x75, 0x6D, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x33, 0x36, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x33, 0x35, 0x00, 0x56, 0x31, 0x34, 0x33, 0x00, 0x56, 0x31, 0x34, 0x32, 0x00, 0x56, 0x32, 0x38, 0x38, 0x00, 0x56, 0x32, 0x38, 0x39, 0x00, 0x56, 0x31, 0x31, 0x38, 0x00, 0x56, 0x31, 0x34, 0x38, 0x00, 0x56, 0x32, 0x39, 0x30, 0x00, 0x56, 0x32, 0x39, 0x31, 0x00, 0x56, 0x32, 0x39, 0x32, 0x00, 0x56, 0x31, 0x35, 0x34, 0x00, 0x56, 0x31, 0x35, 0x32, 0x00, 0x56, 0x32, 0x39, 0x33, 0x00, 0x56, 0x32, 0x39, 0x34, 0x00, 0x56, 0x32, 0x39, 0x35, 0x00, 0x56, 0x31, 0x35, 0x39, 0x00, 0x56, 0x31, 0x35, 0x37, 0x00, 0x56, 0x32, 0x39, 0x36, 0x00, 0x56, 0x32, 0x39, 0x37, 0x00, 0x56, 0x32, 0x39, 0x38, 0x00, 0x56, 0x31, 0x36, 0x34, 0x00, 0x56, 0x31, 0x36, 0x32, 0x00, 0x56, 0x32, 0x39, 0x39, 0x00, 0x56, 0x33, 0x30, 0x30, 0x00, 0x56, 0x33, 0x30, 0x31, 0x00, 0x56, 0x31, 0x36, 0x39, 0x00, 0x56, 0x31, 0x36, 0x37, 0x00, 0x56, 0x33, 0x30, 0x32, 0x00, 0x56, 0x33, 0x30, 0x33, 0x00, 0x56, 0x33, 0x30, 0x34, 0x00, 0x56, 0x31, 0x37, 0x34, 0x00, 0x56, 0x31, 0x37, 0x32, 0x00, 0x56, 0x33, 0x30, 0x35, 0x00, 0x56, 0x33, 0x30, 0x36, 0x00, 0x56, 0x33, 0x30, 0x37, 0x00, 0x56, 0x31, 0x37, 0x39, 0x00, 0x56, 0x31, 0x37, 0x37, 0x00, 0x56, 0x33, 0x30, 0x38, 0x00, 0x56, 0x33, 0x30, 0x39, 0x00, 0x56, 0x33, 0x31, 0x30, 0x00, 0x56, 0x31, 0x38, 0x35, 0x00, 0x56, 0x31, 0x38, 0x34, 0x00, 0x56, 0x31, 0x38, 0x33, 0x00, 0x56, 0x31, 0x38, 0x32, 0x00, 0x56, 0x33, 0x31, 0x31, 0x00, 0x56, 0x33, 0x31, 0x32, 0x00, 0x56, 0x31, 0x31, 0x39, 0x00, 0x56, 0x31, 0x39, 0x30, 0x00, 0x56, 0x33, 0x31, 0x33, 0x00, 0x56, 0x33, 0x31, 0x34, 0x00, 0x56, 0x33, 0x31, 0x35, 0x00, 0x56, 0x31, 0x39, 0x34, 0x00, 0x56, 0x33, 0x31, 0x36, 0x00, 0x56, 0x33, 0x31, 0x37, 0x00, 0x56, 0x33, 0x31, 0x38, 0x00, 0x56, 0x31, 0x39, 0x39, 0x00, 0x56, 0x33, 0x31, 0x39, 0x00, 0x56, 0x33, 0x32, 0x30, 0x00, 0x56, 0x33, 0x32, 0x31, 0x00, 0x56, 0x31, 0x32, 0x30, 0x00, 0x56, 0x31, 0x32, 0x31, 0x00, 0x56, 0x31, 0x32, 0x32, 0x00, 0x56, 0x31, 0x32, 0x33, 0x00, 0x56, 0x31, 0x32, 0x34, 0x00, 0x56, 0x31, 0x32, 0x35, 0x00, 0x56, 0x31, 0x32, 0x36, 0x00, 0x56, 0x31, 0x32, 0x37, 0x00, 0x56, 0x33, 0x32, 0x32, 0x00, 0x56, 0x33, 0x32, 0x33, 0x00, 0x56, 0x32, 0x30, 0x36, 0x00, 0x56, 0x33, 0x32, 0x34, 0x00, 0x56, 0x33, 0x32, 0x35, 0x00, 0x56, 0x32, 0x30, 0x39, 0x00, 0x56, 0x33, 0x32, 0x36, 0x00, 0x56, 0x33, 0x32, 0x37, 0x00, 0x56, 0x32, 0x31, 0x32, 0x00, 0x56, 0x33, 0x32, 0x38, 0x00, 0x56, 0x33, 0x32, 0x39, 0x00, 0x56, 0x33, 0x33, 0x30, 0x00, 0x56, 0x33, 0x33, 0x31, 0x00, 0x56, 0x33, 0x33, 0x32, 0x00, 0x56, 0x33, 0x33, 0x33, 0x00, 0x56, 0x33, 0x33, 0x34, 0x00, 0x56, 0x33, 0x33, 0x35, 0x00, 0x56, 0x33, 0x33, 0x36, 0x00, 0x56, 0x33, 0x33, 0x37, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x39, 0x32, 0x00, 0x42, 0x42, 0x5F, 0x31, 0x39, 0x33, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x07, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x64, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x01, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x01, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x01, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x01, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x12, 0x00, 0x02, 0x30, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x01, 0x00, 0x20, 0x00, 0x04, 0x00, 0x02, 0x02, 0x00, 0x24, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x04, 0x00, 0x00, 0x11, 0x00, 0x2C, 0x00, 0x04, 0x00, 0xC1, 0x0C, 0x00, 0x00, 0xB4, 0x06, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1C, 0x47, 0x50, 0x55, 0x43, 0x6F, 0x70, 0x79, 0x5F, 0x75, 0x6E, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x65, 0x64, 0x5F, 0x67, 0x65, 0x6E, 0x78, 0x5F, 0x31, 0x2E, 0x61, 0x73, 0x6D, 0x03, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x31, 0x01, 0x00, 0x30, 0x02, 0x00, 0x31, 0x03, 0x00, 0x29, 0x90, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x01, 0x29, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0x00, 0x00, 0x00, 0x29, 0x90, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x01, 0x29, 0x90, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x08, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x2C, 0x90, 0x03, 0x02, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0x00, 0x00, 0x00, 0x32, 0x90, 0x01, 0x00, 0x04, 0x00, 0x31, 0x05, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0x31, 0x04, 0x00, 0x10, 0x90, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x80, 0x00, 0x10, 0x90, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x25, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x00, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x80, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x00, 0x02, 0x10, 0x90, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x33, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x34, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x80, 0x02, 0x10, 0x90, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x06, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x39, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x00, 0x03, 0x10, 0x90, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x07, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1D, 0x00, 0x80, 0x03, 0x26, 0x90, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x01, 0x10, 0x90, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0x21, 0x01, 0x46, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x48, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x49, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x46, 0x00, 0x80, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x46, 0x00, 0x00, 0x01, 0x01, 0x90, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x51, 0x00, 0x00, 0x00, 0x21, 0x01, 0x25, 0x90, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x00, 0x21, 0x01, 0x46, 0x00, 0x80, 0x01, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x08, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x08, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0C, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0C, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x10, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x10, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x14, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x14, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x18, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x18, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1C, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x53, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1C, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x09, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x09, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0D, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0D, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x11, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x11, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x15, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x15, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x19, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x19, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1D, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0A, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0A, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0E, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0E, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x12, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x12, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x16, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x16, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1A, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1A, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x55, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1E, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0B, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0B, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0F, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x0F, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x13, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x04, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x13, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1B, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x06, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1B, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1F, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x56, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x1F, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x04, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x04, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x08, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x08, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0C, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x57, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0C, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x01, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x01, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x05, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x05, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x09, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x09, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0D, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x58, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0D, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x02, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x02, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x06, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x06, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0A, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0E, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x59, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0E, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x03, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x03, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x07, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x07, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0B, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0B, 0x10, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0F, 0x00, 0x66, 0x02, 0x29, 0x94, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x46, 0x00, 0x0F, 0x10, 0x66, 0x02, 0x38, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x53, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x54, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x40, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x61, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x62, 0x00, 0x00, 0x00, 0x21, 0x01, 0x55, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x01, 0x05, 0x01, 0x60, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x64, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x65, 0x00, 0x00, 0x00, 0x21, 0x01, 0x56, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x66, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x67, 0x00, 0x00, 0x00, 0x21, 0x01, 0x57, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x68, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x69, 0x00, 0x00, 0x00, 0x21, 0x01, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x21, 0x01, 0x59, 0x00, 0x00, 0x00, 0x38, 0x00, 0x02, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x21, 0x01, 0x5A, 0x00, 0x00, 0x00, 0x31, 0x06, 0x00, 0x34, 0x90, 0x00, 0x00, 0x31, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x55, 0xAA, 0x01, 0x05, 0x00, 0x00, 0x00, 0x29, 0x2D, 0x30, 0x20, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0x05, 0x00, 0x00, 0x00, 0x29, 0x2D, 0x34, 0x20, 0x06, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0x41, 0x00, 0x00, 0x10, 0x25, 0x3D, 0x30, 0x20, 0x30, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x3C, 0x20, 0x28, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0x25, 0x3D, 0x38, 0x20, 0x34, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x04, 0xA4, 0x1C, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x20, 0x00, 0xA0, 0xA0, 0x02, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0x30, 0x20, 0x28, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xC4, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xC0, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0xC8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x23, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0xC4, 0x27, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x64, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x00, 0x68, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0x08, 0x00, 0x00, 0xA2, 0x00, 0x60, 0x20, 0xC4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x07, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0xC0, 0x27, 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x00, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xE4, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0xA2, 0x00, 0xE0, 0x20, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x22, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0x3C, 0x20, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x24, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0x08, 0x00, 0x00, 0xA2, 0x00, 0x20, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xA5, 0x3C, 0x34, 0x20, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x80, 0x48, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x40, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x00, 0x48, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x01, 0x08, 0x00, 0x00, 0xA2, 0x00, 0x44, 0x20, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x80, 0x48, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x84, 0x22, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x80, 0x22, 0xC4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x88, 0x22, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0xC0, 0x24, 0x80, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0D, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x80, 0x48, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xA4, 0x21, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xA0, 0x21, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0xA8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0x40, 0x25, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0E, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x80, 0x48, 0x02, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xC4, 0x21, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0xC0, 0x21, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0xC8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x04, 0xC1, 0x03, 0xC0, 0x25, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x24, 0x38, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x49, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x20, 0x38, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x20, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x13, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x22, 0x50, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x17, 0x0A, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x22, 0x50, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x16, 0x12, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x01, 0x60, 0x00, 0x15, 0x02, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x22, 0x50, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x14, 0x1A, 0x00, 0x01, 0x08, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x22, 0x50, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x38, 0x20, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xA2, 0x0C, 0x68, 0x22, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x60, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xE1, 0x01, 0x60, 0x00, 0x02, 0x1B, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x70, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x0B, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0x70, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x13, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0x70, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x03, 0x00, 0x01, 0x00, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0x70, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x20, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x3C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x38, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x3C, 0x20, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x22, 0x90, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x22, 0x90, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x14, 0x0C, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x22, 0x90, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x13, 0x14, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x22, 0x90, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x12, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x08, 0x22, 0x3C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x11, 0x1C, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x3C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x3C, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x40, 0x27, 0x20, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x21, 0xB0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0xB0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0D, 0x0D, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x21, 0xB0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x15, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x21, 0xB0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0B, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x21, 0x40, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0A, 0x1D, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x60, 0x26, 0x80, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0xA0, 0x26, 0x20, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x01, 0xE1, 0x01, 0x60, 0x00, 0x0A, 0x0E, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x21, 0xD0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x09, 0x16, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0xD0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x06, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0xD0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x07, 0x1E, 0x00, 0x01, 0x00, 0x80, 0x00, 0x32, 0x02, 0x50, 0x21, 0xD0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0xC0, 0x26, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x40, 0x26, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0xA0, 0x27, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0xC8, 0x20, 0xA0, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x00, 0x27, 0xC0, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x60, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x22, 0xF0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x22, 0xF0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x13, 0x0F, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x22, 0xF0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x12, 0x17, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x22, 0xF0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x11, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0xE8, 0x21, 0x60, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x10, 0x1F, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x20, 0x27, 0x40, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x80, 0x27, 0x20, 0x00, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x22, 0x10, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x22, 0x10, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x12, 0x10, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x22, 0x10, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x11, 0x18, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x21, 0x10, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x10, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0xC8, 0x21, 0x80, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0F, 0x20, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0xE0, 0x26, 0xA0, 0x07, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x06, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x30, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0x30, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x11, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0x30, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x19, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0x30, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x09, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x20, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x02, 0x21, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x20, 0x20, 0x34, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x24, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x49, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x34, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x2C, 0x20, 0x34, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0B, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x21, 0xD0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0F, 0x2E, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x21, 0x50, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0E, 0x2A, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x21, 0xD0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0D, 0x26, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0x50, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x00, 0x00, 0x00, 0xA2, 0x0C, 0x68, 0x21, 0x2C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x28, 0x20, 0x2C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x30, 0x20, 0x2C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x34, 0x20, 0x2C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x60, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0xF0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x2F, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0x70, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x07, 0x2B, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x20, 0xF0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x06, 0x27, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x70, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x88, 0x20, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0x10, 0x06, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x21, 0x90, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0B, 0x2C, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x21, 0x10, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0A, 0x28, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x21, 0x90, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x09, 0x24, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x08, 0x21, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x30, 0x06, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x31, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0xB0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x2D, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0x30, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x29, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0xB0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x02, 0x25, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x20, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x05, 0xC8, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x06, 0x00, 0x00, 0x31, 0x00, 0x00, 0x07, 0xC0, 0x0F, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x55, 0xAA, 0x01, 0x05, 0x00, 0x00, 0x00, 0x29, 0x2D, 0x36, 0x20, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0x05, 0x00, 0x00, 0x00, 0x29, 0x2D, 0x34, 0x20, 0x06, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0x41, 0x00, 0x00, 0x10, 0x25, 0x3D, 0x30, 0x20, 0x36, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x3C, 0x20, 0x28, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0x25, 0x3D, 0x34, 0x20, 0x34, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x04, 0xA4, 0x1C, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x20, 0x00, 0xA0, 0xA0, 0x02, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0x30, 0x20, 0x28, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x41, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x24, 0x34, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x49, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x20, 0x34, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x38, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x60, 0x26, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xA2, 0x0C, 0xE8, 0x21, 0x60, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x20, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x7C, 0x26, 0x60, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0xE8, 0x21, 0x7C, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x20, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x64, 0x26, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x38, 0x20, 0x64, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x78, 0x26, 0x60, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x20, 0x78, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x74, 0x26, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x3C, 0x20, 0x74, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x64, 0x26, 0x60, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x48, 0x20, 0x64, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x68, 0x26, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x68, 0x26, 0x68, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x6C, 0x26, 0x60, 0x06, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x08, 0x22, 0x6C, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x72, 0x26, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0B, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x74, 0x26, 0x72, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x78, 0x26, 0x60, 0x06, 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x68, 0x21, 0x78, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x22, 0x60, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x6C, 0x26, 0x70, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x64, 0x26, 0x60, 0x06, 0x00, 0x00, 0x6C, 0x06, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x48, 0x21, 0x64, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x23, 0x40, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xED, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x41, 0x00, 0x00, 0x10, 0xA5, 0x15, 0x7C, 0x26, 0x70, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x80, 0x26, 0x60, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x88, 0x22, 0x80, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x23, 0x80, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xA5, 0x3C, 0x40, 0x26, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0E, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x48, 0x26, 0x40, 0x06, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x24, 0x48, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x49, 0x00, 0x60, 0x10, 0xA4, 0x14, 0x00, 0x20, 0x48, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x44, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x14, 0x44, 0x26, 0x44, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xA2, 0x0C, 0xC8, 0x21, 0x44, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x24, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x0A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x48, 0x26, 0x44, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x48, 0x21, 0x48, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x24, 0x40, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x4C, 0x26, 0x44, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x68, 0x20, 0x4C, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0x40, 0x25, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x11, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA1, 0x14, 0x5C, 0x26, 0x44, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x02, 0x08, 0x08, 0x00, 0x00, 0x22, 0x0C, 0x28, 0x22, 0x5C, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x04, 0xCD, 0x03, 0xC0, 0x25, 0x20, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x40, 0x09, 0x12, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x21, 0xD0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x09, 0x1E, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0x50, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x1A, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0xD0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x07, 0x16, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x20, 0x50, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x06, 0x12, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0xD0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x0E, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0x50, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x0A, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0xD0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x06, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0x50, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x24, 0x20, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x20, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x10, 0xA5, 0x3C, 0x58, 0x26, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x21, 0xF0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x09, 0x1F, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0x70, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x1B, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0xF0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x07, 0x17, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x20, 0x70, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x06, 0x13, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0xF0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x0F, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0x70, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x0B, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0xF0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x07, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0x70, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x02, 0x03, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x24, 0x20, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x20, 0x20, 0x58, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x40, 0x09, 0x12, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x04, 0x00, 0x10, 0xA5, 0x3C, 0x50, 0x26, 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x08, 0x00, 0x10, 0xA5, 0x3C, 0x54, 0x26, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x40, 0x09, 0x12, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x21, 0x10, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x09, 0x20, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0x90, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x1C, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0x10, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x07, 0x18, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x20, 0x90, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x06, 0x14, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x10, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x10, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x20, 0x90, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x04, 0x0C, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x20, 0x10, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x03, 0x08, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x20, 0x90, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x02, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x24, 0x20, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x20, 0x20, 0x50, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0B, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, 0x40, 0x09, 0x12, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x22, 0x30, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x13, 0x21, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x22, 0xB0, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x12, 0x1D, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x22, 0x30, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x11, 0x19, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x22, 0xB0, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x10, 0x15, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x21, 0x30, 0x02, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0F, 0x11, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x21, 0xB0, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0E, 0x0D, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x21, 0x30, 0x01, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0D, 0x09, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0xB0, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x05, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x64, 0x21, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x60, 0x21, 0x54, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x68, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x60, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x20, 0xD0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x06, 0x26, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x20, 0x50, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x05, 0x22, 0x00, 0x01, 0xF0, 0x01, 0x60, 0x00, 0x07, 0x2A, 0x00, 0x01, 0xBD, 0x03, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x01, 0x40, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x10, 0x21, 0xD0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x08, 0x2E, 0x00, 0x01, 0x08, 0x80, 0x00, 0x32, 0x02, 0xF0, 0x20, 0x50, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x84, 0x20, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x09, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x01, 0x40, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x21, 0xF0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0D, 0x2F, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0x70, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x2B, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x21, 0xF0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0B, 0x27, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x21, 0x70, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0A, 0x23, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x24, 0x21, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x20, 0x21, 0x58, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x28, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x01, 0x40, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x22, 0x10, 0x06, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x22, 0x90, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x13, 0x2C, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x50, 0x22, 0x10, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x12, 0x28, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x30, 0x22, 0x90, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x11, 0x24, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x04, 0x22, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x22, 0x50, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x20, 0x0C, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x01, 0x40, 0x09, 0x0A, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xD0, 0x21, 0x30, 0x06, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0E, 0x31, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0xB0, 0x21, 0xB0, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0D, 0x2D, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x90, 0x21, 0x30, 0x05, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0C, 0x29, 0x00, 0x01, 0x04, 0x80, 0x00, 0x32, 0x02, 0x70, 0x21, 0xB0, 0x04, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x00, 0x0B, 0x25, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA2, 0x00, 0x44, 0x21, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0xA2, 0x00, 0x40, 0x21, 0x54, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x62, 0x00, 0x48, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x31, 0x00, 0x60, 0x05, 0xC0, 0x03, 0x00, 0x20, 0x40, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xA2, 0x03, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x31, 0x00, 0x00, 0x07, 0xC0, 0x0F, 0x00, 0x20, 0x80, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //#include "cm\cm.h" //#include "test_conf.h" // //*----------------------------------------------------------------------*/ // //extern "C" _GENX_MAIN_ void //surfaceCopy_BufferTo2D_Single_nv12_128_full(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width, int height) //{ // matrix inData_m; // vector_ref inData0 = inData_m.select<1, 1, 128, 1>(0, 0); // vector_ref inData1 = inData_m.select<1, 1, 128, 1>(1, 0); // vector_ref inData2 = inData_m.select<1, 1, 128, 1>(2, 0); // vector_ref inData3 = inData_m.select<1, 1, 128, 1>(3, 0); // vector_ref inData4 = inData_m.select<1, 1, 128, 1>(4, 0); // vector_ref inData5 = inData_m.select<1, 1, 128, 1>(5, 0); // vector_ref inData6 = inData_m.select<1, 1, 128, 1>(6, 0); // vector_ref inData7 = inData_m.select<1, 1, 128, 1>(7, 0); // // matrix inData_m2; // vector_ref inData8 = inData_m2.select<1, 1, 128, 1>(0, 0); // vector_ref inData9 = inData_m2.select<1, 1, 128, 1>(1, 0); // vector_ref inData10 = inData_m2.select<1, 1, 128, 1>(2, 0); // vector_ref inData11 = inData_m2.select<1, 1, 128, 1>(3, 0); // // matrix outData0; // matrix outData1; // matrix outData2; // matrix outData3; // // matrix outData4; // matrix outData5; // matrix outData6; // matrix outData7; // // int horizOffset = get_thread_origin_x() * 128; // int vertOffset = get_thread_origin_y() * 8; // // if (width - horizOffset < 128) // horizOffset = width - 128; // // uint linear_offset = vertOffset * width + horizOffset; // // read(INBUF_IDX, linear_offset , inData0); // read(INBUF_IDX, linear_offset + width * 1, inData1); // read(INBUF_IDX, linear_offset + width * 2, inData2); // read(INBUF_IDX, linear_offset + width * 3, inData3); // read(INBUF_IDX, linear_offset + width * 4, inData4); // read(INBUF_IDX, linear_offset + width * 5, inData5); // read(INBUF_IDX, linear_offset + width * 6, inData6); // read(INBUF_IDX, linear_offset + width * 7, inData7); // // uint linear_offset2 = ((vertOffset >> 1) + height) * width + horizOffset; // // read(INBUF_IDX, linear_offset2 , inData8); // read(INBUF_IDX, linear_offset2 + width * 1, inData9); // read(INBUF_IDX, linear_offset2 + width * 2, inData10); // read(INBUF_IDX, linear_offset2 + width * 3, inData11); // // outData0 = inData_m.select<8, 1, 32, 1>(0, 0); // outData1 = inData_m.select<8, 1, 32, 1>(0, 32); // outData2 = inData_m.select<8, 1, 32, 1>(0, 64); // outData3 = inData_m.select<8, 1, 32, 1>(0, 96); // // outData4 = inData_m2.select<4, 1, 32, 1>(0, 0); // outData5 = inData_m2.select<4, 1, 32, 1>(0, 32); // outData6 = inData_m2.select<4, 1, 32, 1>(0, 64); // outData7 = inData_m2.select<4, 1, 32, 1>(0, 96); // // write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 0, vertOffset, outData0); // write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 32, vertOffset, outData1); // write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 64, vertOffset, outData2); // write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 96, vertOffset, outData3); // // write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 0, vertOffset >> 1, outData4); // write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 32, vertOffset >> 1, outData5); // write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 64, vertOffset >> 1, outData6); // write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 96, vertOffset >> 1, outData7); //} // //extern "C" _GENX_MAIN_ void //surfaceCopy_2DToBuffer_Single_nv12_128_full(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width, int height) //{ // matrix inData0; // matrix inData1; // matrix inData2; // matrix inData3; // // matrix inData4; // matrix inData5; // matrix inData6; // matrix inData7; // // matrix outData_m; // vector_ref outData0 = outData_m.select<1, 1, 128, 1>(0, 0); // vector_ref outData1 = outData_m.select<1, 1, 128, 1>(1, 0); // vector_ref outData2 = outData_m.select<1, 1, 128, 1>(2, 0); // vector_ref outData3 = outData_m.select<1, 1, 128, 1>(3, 0); // vector_ref outData4 = outData_m.select<1, 1, 128, 1>(4, 0); // vector_ref outData5 = outData_m.select<1, 1, 128, 1>(5, 0); // vector_ref outData6 = outData_m.select<1, 1, 128, 1>(6, 0); // vector_ref outData7 = outData_m.select<1, 1, 128, 1>(7, 0); // // matrix outData_m2; // vector_ref outData8 = outData_m2.select<1, 1, 128, 1>(0, 0); // vector_ref outData9 = outData_m2.select<1, 1, 128, 1>(1, 0); // vector_ref outDataA = outData_m2.select<1, 1, 128, 1>(2, 0); // vector_ref outDataB = outData_m2.select<1, 1, 128, 1>(3, 0); // // int horizOffset = get_thread_origin_x() * 128; // int vertOffset = get_thread_origin_y() * 8; // // if (width - horizOffset < 128) // horizOffset = width - 128; // // read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 0, vertOffset, inData0); // read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 32, vertOffset, inData1); // read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 64, vertOffset, inData2); // read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + 96, vertOffset, inData3); // // read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 0, vertOffset >> 1, inData4); // read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 32, vertOffset >> 1, inData5); // read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 64, vertOffset >> 1, inData6); // read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset + 96, vertOffset >> 1, inData7); // // outData_m.select<8, 1, 32, 1>(0, 0) = inData0; // outData_m.select<8, 1, 32, 1>(0, 32) = inData1; // outData_m.select<8, 1, 32, 1>(0, 64) = inData2; // outData_m.select<8, 1, 32, 1>(0, 96) = inData3; // // outData_m2.select<4, 1, 32, 1>(0, 0) = inData4; // outData_m2.select<4, 1, 32, 1>(0, 32) = inData5; // outData_m2.select<4, 1, 32, 1>(0, 64) = inData6; // outData_m2.select<4, 1, 32, 1>(0, 96) = inData7; // // uint linear_offset = (vertOffset * width + horizOffset); // // write(OUTBUF_IDX, linear_offset, outData0); // write(OUTBUF_IDX, linear_offset + width * 1, outData1); // write(OUTBUF_IDX, linear_offset + width * 2, outData2); // write(OUTBUF_IDX, linear_offset + width * 3, outData3); // write(OUTBUF_IDX, linear_offset + width * 4, outData4); // write(OUTBUF_IDX, linear_offset + width * 5, outData5); // write(OUTBUF_IDX, linear_offset + width * 6, outData6); // write(OUTBUF_IDX, linear_offset + width * 7, outData7); // // uint linear_offset2 = (((vertOffset >> 1) + height) * width + horizOffset); // // write(OUTBUF_IDX, linear_offset2, outData8); // write(OUTBUF_IDX, linear_offset2 + width * 1, outData9); // write(OUTBUF_IDX, linear_offset2 + width * 2, outDataA); // write(OUTBUF_IDX, linear_offset2 + width * 3, outDataB); //} #endif // __CM_GPU_COPY_CODE_H__oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include/cm_mem_copy.h000066400000000000000000000436451443134507600333360ustar00rootroot00000000000000// Copyright (c) 2011-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CM_MEM_COPY_H__ #define __CM_MEM_COPY_H__ #include "mfxdefs.h" #include "mfxstructures.h" #include "ippi.h" #ifdef MFX_ENABLE_KERNELS #include "genx_copy_kernel_gen12lp_isa.h" #endif #ifdef _MSVC_LANG #pragma warning(disable: 4505) #pragma warning(disable: 4100) #pragma warning(disable: 4201) #endif #include #include #include #include #include #include "cmrt_cross_platform.h" typedef mfxI32 cmStatus; #define BLOCK_PIXEL_WIDTH (32) #define BLOCK_HEIGHT (8) #define CM_MAX_GPUCOPY_SURFACE_WIDTH_IN_BYTE 65408 #define CM_MAX_GPUCOPY_SURFACE_HEIGHT 4088 #define CM_SUPPORTED_COPY_SIZE(ROI) (ROI.width <= CM_MAX_GPUCOPY_SURFACE_WIDTH_IN_BYTE && ROI.height <= CM_MAX_GPUCOPY_SURFACE_HEIGHT ) #define CM_ALIGNED(PTR) (!((mfxU64(PTR))&0xf)) #define CM_ALIGNED64(PTR) (!((mfxU64(PTR))&0x3f)) static inline bool operator < (const mfxHDLPair & l, const mfxHDLPair & r) { return (l.first == r.first) ? (l.second < r.second) : (l.first < r.first); }; class CmDevice; class CmBuffer; class CmBufferUP; class CmSurface2D; class CmEvent; class CmQueue; class CmProgram; class CmKernel; class SurfaceIndex; class CmThreadSpace; class CmTask; struct IDirect3DSurface9; struct IDirect3DDeviceManager9; template class CmSurfBufferBase { public: CmSurfBufferBase(T* surfbuf, CmDevice* device) : surfacebuffer(surfbuf) , cm_device(device) , use_count(0) {} CmSurfBufferBase(const CmSurfBufferBase&) = delete; CmSurfBufferBase(CmSurfBufferBase&& other) noexcept { *this = std::move(other); } CmSurfBufferBase& operator= (const CmSurfBufferBase&) = delete; CmSurfBufferBase& operator= (CmSurfBufferBase&& other) noexcept { if (this != &other) { surfacebuffer = other.surfacebuffer; cm_device = other.cm_device; use_count.exchange(other.use_count, std::memory_order_relaxed); other.surfacebuffer = nullptr; other.cm_device = nullptr; } return *this; } void AddRef() { use_count.fetch_add(1u, std::memory_order_relaxed); } void Release() { use_count.fetch_sub(1u, std::memory_order_relaxed); } bool IsFree() const { return use_count.load(std::memory_order_relaxed) == 0; } operator T* () { return surfacebuffer; } protected: T* surfacebuffer = nullptr; CmDevice* cm_device = nullptr; std::atomic use_count; }; class CmSurface2DWrapper : public CmSurfBufferBase { public: CmSurface2DWrapper(CmSurface2D* surf, CmDevice* device) : CmSurfBufferBase(surf, device) {} CmSurface2DWrapper(const CmSurface2DWrapper&) = delete; CmSurface2DWrapper(CmSurface2DWrapper&& other) noexcept : CmSurfBufferBase(nullptr, nullptr) { *this = std::move(other); } CmSurface2DWrapper& operator= (const CmSurface2DWrapper&) = delete; CmSurface2DWrapper& operator= (CmSurface2DWrapper&& other) noexcept { if (this != &other) { DestroySurface(); static_cast(*this) = std::move(static_cast(other)); } return *this; } ~CmSurface2DWrapper() { DestroySurface(); } private: void DestroySurface() { if (cm_device && surfacebuffer) { assert(use_count == 0); std::ignore = MFX_STS_TRACE(cm_device->DestroySurface(surfacebuffer)); } } }; class CmBufferUPWrapper : public CmSurfBufferBase { public: CmBufferUPWrapper(CmBufferUP* buf, SurfaceIndex* pindx, CmDevice* device) : CmSurfBufferBase(buf, device) , pIndex(pindx) {} CmBufferUPWrapper(const CmBufferUPWrapper&) = delete; CmBufferUPWrapper(CmBufferUPWrapper&& other) noexcept : CmSurfBufferBase(nullptr, nullptr) { *this = std::move(other); } CmBufferUPWrapper& operator= (const CmBufferUPWrapper&) = delete; CmBufferUPWrapper& operator= (CmBufferUPWrapper&& other) noexcept { if (this != &other) { DestroyBuffer(); static_cast(*this) = std::move(static_cast(other)); pIndex = other.pIndex; other.pIndex = nullptr; } return *this; } ~CmBufferUPWrapper() { DestroyBuffer(); } SurfaceIndex* GetIndex() { return pIndex; } private: void DestroyBuffer() { if (cm_device && surfacebuffer) { std::ignore = MFX_STS_TRACE(cm_device->DestroyBufferUP(surfacebuffer)); } } SurfaceIndex* pIndex = nullptr; }; class CmCopyWrapper { public: CmCopyWrapper(bool cm_buffer_cache = false) : m_use_cm_buffers_cache(cm_buffer_cache) {} // destructor virtual ~CmCopyWrapper(void); template CmDevice* GetCmDevice(D3DAbstract *pD3D) { cmStatus cmSts = CM_SUCCESS; mfxU32 version = 0; if (m_pCmDevice) return m_pCmDevice; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CreateCmDevice"); cmSts = ::CreateCmDevice(m_pCmDevice, version, pD3D, CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE); if (cmSts != CM_SUCCESS) return NULL; if (CM_1_0 > version) { return NULL; } return m_pCmDevice; }; CmDevice* GetCmDevice(VADisplay dpy) { cmStatus cmSts = CM_SUCCESS; mfxU32 version; if (m_pCmDevice) return m_pCmDevice; cmSts = ::CreateCmDevice(m_pCmDevice, version, dpy, CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE); if (cmSts != CM_SUCCESS) return NULL; if (CM_1_0 > version) { return NULL; } return m_pCmDevice; }; // initialize available functionality mfxStatus Initialize(mfxU16 hwDeviceId, eMFXHWType hwtype = MFX_HW_UNKNOWN); mfxStatus InitializeSwapKernels(eMFXHWType hwtype = MFX_HW_UNKNOWN); // release all resources void Close(); // check input parameters mfxStatus IsCmCopySupported(mfxFrameSurface1 *pSurface, IppiSize roi); static bool CanUseCmCopy(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); static bool CheckSurfaceContinuouslyAllocated(const mfxFrameSurface1 &surf); static bool isSinglePlainFormat(mfxU32 format); static bool isNeedSwapping(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); static bool isNeedShift(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); static bool isNV12LikeFormat(mfxU32 format); static int getSizePerPixel(mfxU32 format); mfxStatus CopyVideoToVideo(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); mfxStatus CopySysToVideo(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); mfxStatus CopyVideoToSys(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc); mfxStatus CopyVideoToSystemMemoryAPI(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi); mfxStatus CopyVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format); mfxStatus CopySystemToVideoMemoryAPI(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi); mfxStatus CopySystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format); mfxStatus CopyVideoToVideoMemoryAPI(mfxHDLPair dst, mfxHDLPair src, IppiSize roi); mfxStatus CopySwapVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format); mfxStatus CopySwapSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format); mfxStatus CopyShiftSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 bitshift, mfxU32 format); mfxStatus CopyShiftVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 bitshift, mfxU32 format); mfxStatus CopyMirrorVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format); mfxStatus CopyMirrorSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format); mfxStatus CopySwapVideoToVideoMemory(mfxHDLPair dst, mfxHDLPair src, IppiSize roi, mfxU32 format); mfxStatus CopyMirrorVideoToVideoMemory(mfxHDLPair dst, mfxHDLPair src, IppiSize roi, mfxU32 format); void CleanUpCache(); mfxStatus EnqueueCopyNV12GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopySwapRBGPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyGPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopySwapRBCPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyCPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopySwapRBGPUtoGPU( CmSurface2D* pSurfaceIn, CmSurface2D* pSurfaceOut, int width, int height, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyMirrorGPUtoGPU( CmSurface2D* pSurfaceIn, CmSurface2D* pSurfaceOut, int width, int height, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyMirrorNV12GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyMirrorNV12CPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); mfxStatus EnqueueCopyShiftP010GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, int bitshift, CmEvent* & pEvent ); mfxStatus EnqueueCopyShiftGPUtoCPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, int bitshift, CmEvent* & pEvent); mfxStatus EnqueueCopyShiftP010CPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, int bitshift, CmEvent* & pEvent ); mfxStatus EnqueueCopyShiftCPUtoGPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, int bitshift, const UINT option, CmEvent* & pEvent); mfxStatus EnqueueCopyNV12CPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ); protected: eMFXHWType m_HWType = MFX_HW_UNKNOWN; CmDevice *m_pCmDevice = nullptr; CmProgram *m_pCmProgram = nullptr; INT m_timeout = 0; CmThreadSpace *m_pThreadSpace = nullptr; CmQueue *m_pCmQueue = nullptr; CmTask *m_pCmTask1 = nullptr; CmTask *m_pCmTask2 = nullptr; CmSurface2D *m_pCmSurface2D = nullptr; CmBufferUP *m_pCmUserBuffer = nullptr; SurfaceIndex *m_pCmSrcIndex = nullptr; SurfaceIndex *m_pCmDstIndex = nullptr; // Cache for CM surfaces (associated with frames in video memory) std::map, CmSurface2DWrapper> m_tableCmRelations; // Cache for CM Buffers (associated with frames in system memory) bool m_use_cm_buffers_cache = false; std::map, CmBufferUPWrapper> m_tableSysRelations; std::mutex m_mutex; CmSurface2DWrapper* CreateCmSurface2D(mfxHDLPair surfaceIdPair, mfxU32 width, mfxU32 height); CmBufferUPWrapper* CreateUpBuffer(mfxU8 *pDst, mfxU32 memSize, mfxU32 width, mfxU32 height); private: bool m_bSwapKernelsInitialized = false; }; #endif // __CM_MEM_COPY_H__ cmrt_cross_platform.h000066400000000000000000002307051443134507600350450ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include// Copyright (c) 1985-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CMRT_CROSS_PLATFORM_H__ #define __CMRT_CROSS_PLATFORM_H__ #include "mfx_common.h" #include "cmrt_utility.h" #include "asc_structures.h" /* Applicable for old and new CMAPI */ #define CM_LINUX #ifndef CM_NOINLINE #ifndef CM_EMU #ifndef __GNUC__ #define CM_NOINLINE __declspec(noinline) #else #define CM_NOINLINE __attribute__((noinline)) #endif #else #define CM_NOINLINE #endif /* CM_EMU */ #endif #ifndef CM_INLINE #ifndef __GNUC__ #define CM_INLINE __forceinline #else #define CM_INLINE inline __attribute__((always_inline)) #endif #endif #if defined(__INTEL_COMPILER) #pragma warning(push) #pragma warning(disable:2289) #endif #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnon-virtual-dtor" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-private-field" #else #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #endif #endif class SurfaceIndex { public: CM_NOINLINE SurfaceIndex() { index = 0; }; CM_NOINLINE SurfaceIndex(const SurfaceIndex& _src) { index = _src.index; }; CM_NOINLINE SurfaceIndex(const unsigned int& _n) { index = _n; }; CM_NOINLINE SurfaceIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; }; CM_NOINLINE SurfaceIndex& operator + (const unsigned int& _n) { this->index += _n; return *this; }; virtual unsigned int get_data(void) { return index; }; private: unsigned int index; #ifdef CM_LINUX /* * Do not delete this line: * SurfaceIndex is commonly used as CM kernel function's parameter. * It has virutal table and has copy constructor, so GNU calling convetion will pass the object's pointer to kernel function. * This is different with Windows VC++, which always copies the entire object transferred on the callee's stack. * * Depending on the special object size after adding below "extra_byte", * SetKernelArg and SetThreadArg can recognize this object and follow GNU's convention to construct kernel function's stack. * Detail can be found on "https://github.com/intel/cm-compiler#documentation" */ unsigned char extra_byte; #endif }; class SamplerIndex { public: CM_NOINLINE SamplerIndex() { index = 0; }; CM_NOINLINE SamplerIndex(SamplerIndex& _src) { index = _src.get_data(); }; CM_NOINLINE SamplerIndex(const unsigned int& _n) { index = _n; }; CM_NOINLINE SamplerIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; }; virtual unsigned int get_data(void) { return index; }; private: unsigned int index; #ifdef CM_LINUX /* * Do not delete this line: * Same reason as SurfaceIndex. */ unsigned char extra_byte; #endif }; #if defined(__clang__) #pragma clang diagnostic pop // "-Wunused-private-field" #endif #ifdef _MSVC_LANG #pragma warning(push) #pragma warning(disable: 4100) #pragma warning(disable: 4201) #endif typedef void * AbstractSurfaceHandle; typedef void * AbstractDeviceHandle; struct IDirect3DSurface9; struct IDirect3DDeviceManager9; struct ID3D11Texture2D; struct ID3D11Device; #ifdef __cplusplus # define EXTERN_C extern "C" #else # define EXTERN_C #endif #ifdef CM_LINUX #define LONG INCORRECT_64BIT_LONG #define ULONG INCORRECT_64BIT_ULONG #ifdef __int64 #undef __int64 #endif #include #include #define _tmain main #include #include #include #include #include #include #include #include #include #include typedef int BOOL; #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif typedef char byte; typedef unsigned char BYTE; typedef unsigned int UINT32; typedef UINT32 DWORD; typedef int INT; typedef unsigned int UINT; typedef signed char INT8; typedef unsigned char UINT8; typedef signed short INT16; typedef unsigned short UINT16; typedef signed int INT32; typedef signed long long INT64; typedef unsigned long long UINT64; typedef enum _VACMTEXTUREADDRESS { VACMTADDRESS_WRAP = 1, VACMTADDRESS_MIRROR = 2, VACMTADDRESS_CLAMP = 3, VACMTADDRESS_BORDER = 4, VACMTADDRESS_MIRRORONCE = 5, VACMTADDRESS_FORCE_DWORD = 0x7fffffff } VACMTEXTUREADDRESS; typedef enum _VACMTEXTUREFILTERTYPE { VACMTEXF_NONE = 0, VACMTEXF_POINT = 1, VACMTEXF_LINEAR = 2, VACMTEXF_ANISOTROPIC = 3, VACMTEXF_FLATCUBIC = 4, VACMTEXF_GAUSSIANCUBIC = 5, VACMTEXF_PYRAMIDALQUAD = 6, VACMTEXF_GAUSSIANQUAD = 7, VACMTEXF_CONVOLUTIONMONO = 8, // Convolution filter for monochrome textures VACMTEXF_FORCE_DWORD = 0x7fffffff } VACMTEXTUREFILTERTYPE; #define CM_MAX_TIMEOUT 2 #define CM_ATTRIBUTE(attribute) __attribute__((attribute)) typedef enum _VA_CM_FORMAT { VA_CM_FMT_UNKNOWN = 0, VA_CM_FMT_A8R8G8B8 = 21, VA_CM_FMT_X8R8G8B8 = 22, VA_CM_FMT_A8 = 28, VA_CM_FMT_A2B10G10R10 = 31, VA_CM_FMT_A8B8G8R8 = 32, VA_CM_FMT_A16B16G16R16 = 36, VA_CM_FMT_P8 = 41, VA_CM_FMT_L8 = 50, VA_CM_FMT_A8L8 = 51, VA_CM_FMT_R16U = 57, VA_CM_FMT_V8U8 = 60, VA_CM_FMT_R8U = 62, VA_CM_FMT_D16 = 80, VA_CM_FMT_L16 = 81, VA_CM_FMT_A16B16G16R16F = 113, VA_CM_FMT_R32F = 114, VA_CM_FMT_NV12 = VA_FOURCC_NV12, VA_CM_FMT_UYVY = VA_FOURCC_UYVY, VA_CM_FMT_YUY2 = VA_FOURCC_YUY2, VA_CM_FMT_444P = VA_FOURCC_444P, VA_CM_FMT_411P = VA_FOURCC_411P, VA_CM_FMT_422H = VA_FOURCC_422H, VA_CM_FMT_422V = VA_FOURCC_422V, VA_CM_FMT_IMC3 = VA_FOURCC_IMC3, VA_CM_FMT_YV12 = VA_FOURCC_YV12, VA_CM_FMT_P010 = VA_FOURCC_P010, VA_CM_FMT_P016 = VA_FOURCC_P016, VA_CM_FMT_MAX = 0xFFFFFFFF } VA_CM_FORMAT; inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment) { return memalign(alignment, size); } inline void CM_ALIGNED_FREE(void * memory) { free(memory); } //multi-thread API: #define THREAD_HANDLE pthread_t inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg) { int err = 0; err = pthread_create(handle, NULL, (void * (*)(void *))start_routine, arg); if (err) { printf(" cm create thread failed! \n"); exit(-1); } } inline void CM_THREAD_EXIT(void * retval) { pthread_exit(retval); } inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt) { void *tret; for (int i = 0; i < thread_cnt; i++) { pthread_join(handle_array[i], &tret); } return 0; } #define CM_SURFACE_FORMAT VA_CM_FORMAT #define CM_SURFACE_FORMAT_UNKNOWN VA_CM_FMT_UNKNOWN #define CM_SURFACE_FORMAT_A8R8G8B8 VA_CM_FMT_A8R8G8B8 #define CM_SURFACE_FORMAT_X8R8G8B8 VA_CM_FMT_X8R8G8B8 #define CM_SURFACE_FORMAT_A8B8G8R8 VA_CM_FMT_A8B8G8R8 #define CM_SURFACE_FORMAT_A8 VA_CM_FMT_A8 #define CM_SURFACE_FORMAT_P8 VA_CM_FMT_P8 #define CM_SURFACE_FORMAT_R32F VA_CM_FMT_R32F #define CM_SURFACE_FORMAT_NV12 VA_CM_FMT_NV12 #define CM_SURFACE_FORMAT_UYVY VA_CM_FMT_UYVY #define CM_SURFACE_FORMAT_YUY2 VA_CM_FMT_YUY2 #define CM_SURFACE_FORMAT_V8U8 VA_CM_FMT_V8U8 #define CM_SURFACE_FORMAT_R8_UINT VA_CM_FMT_R8U #define CM_SURFACE_FORMAT_R16_UINT VA_CM_FMT_R16U #define CM_SURFACE_FORMAT_R16_SINT VA_CM_FMT_A8L8 #define CM_SURFACE_FORMAT_D16 VA_CM_FMT_D16 #define CM_SURFACE_FORMAT_L16 VA_CM_FMT_L16 #define CM_SURFACE_FORMAT_A16B16G16R16 VA_CM_FMT_A16B16G16R16 #define CM_SURFACE_FORMAT_R10G10B10A2 VA_CM_FMT_A2B10G10R10 #define CM_SURFACE_FORMAT_A16B16G16R16F VA_CM_FMT_A16B16G16R16F #define CM_SURFACE_FORMAT_444P VA_CM_FMT_444P #define CM_SURFACE_FORMAT_422H VA_CM_FMT_422H #define CM_SURFACE_FORMAT_422V VA_CM_FMT_422V #define CM_SURFACE_FORMAT_411P VA_CM_FMT_411P #define CM_SURFACE_FORMAT_IMC3 VA_CM_FMT_IMC3 #define CM_SURFACE_FORMAT_YV12 VA_CM_FMT_YV12 #define CM_SURFACE_FORMAT_P010 VA_CM_FMT_P010 #define CM_SURFACE_FORMAT_P016 VA_CM_FMT_P016 #define CM_TEXTURE_ADDRESS_TYPE VACMTEXTUREADDRESS #define CM_TEXTURE_ADDRESS_WRAP VACMTADDRESS_WRAP #define CM_TEXTURE_ADDRESS_MIRROR VACMTADDRESS_MIRROR #define CM_TEXTURE_ADDRESS_CLAMP VACMTADDRESS_CLAMP #define CM_TEXTURE_ADDRESS_BORDER VACMTADDRESS_BORDER #define CM_TEXTURE_ADDRESS_MIRRORONCE VACMTADDRESS_MIRRORONCE #define CM_TEXTURE_FILTER_TYPE VACMTEXTUREFILTERTYPE #define CM_TEXTURE_FILTER_TYPE_NONE VACMTEXF_NONE #define CM_TEXTURE_FILTER_TYPE_POINT VACMTEXF_POINT #define CM_TEXTURE_FILTER_TYPE_LINEAR VACMTEXF_LINEAR #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC VACMTEXF_ANISOTROPIC #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC VACMTEXF_FLATCUBIC #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC VACMTEXF_GAUSSIANCUBIC #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD VACMTEXF_PYRAMIDALQUAD #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD VACMTEXF_GAUSSIANQUAD #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO VACMTEXF_CONVOLUTIONMONO /* Surrport for common-used data type */ #define _TCHAR char #ifndef TRUE #define TRUE 1 #endif typedef int HKEY; typedef unsigned int uint; typedef unsigned int* PUINT; typedef float FLOAT; typedef unsigned long long DWORDLONG; #ifndef ULONG_PTR #define ULONG_PTR unsigned long #endif /* Handle Type */ typedef void *HMODULE; typedef void *HINSTANCE; typedef int HANDLE; typedef void *PVOID; typedef int WINBOOL; typedef BOOL *PBOOL; typedef unsigned long ULONG; typedef ULONG *PULONG; typedef unsigned short USHORT; typedef USHORT *PUSHORT; typedef unsigned char UCHAR; typedef UCHAR *PUCHAR; typedef char CHAR; typedef short SHORT; typedef long LONG; typedef double DOUBLE; #define __int8 char #define __int16 short #define __int32 int #define __int64 long long typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BYTE *PBYTE; typedef int *PINT; typedef WORD *PWORD; typedef DWORD *PDWORD; typedef unsigned int *PUINT; typedef LONG HRESULT; typedef long long LONGLONG; //Performance EXTERN_C INT QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); EXTERN_C INT QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); struct BITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } __attribute__((packed)); struct BITMAPINFOHEADER { DWORD biSize; DWORD biWidth; DWORD biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; DWORD biXPelsPerMeter; DWORD biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }; struct RGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; }; #ifdef CMRT_EMU // below macro definition is to workaround a bug in g++4.4 template inline void * CM_KERNEL_FUNCTION_TO_POINTER(kernelFunctionTy kernelFunction) { return (void *)kernelFunction; } #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__, CM_KERNEL_FUNCTION_TO_POINTER(__VA_ARGS__) #else #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__ #endif #ifdef CMRT_EMU // below macro definition is to workaround a bug in g++4.4 template inline void * CM_KERNEL_FUNCTION_POINTER(kernelFunctionTy kernelFunction) { return (void *)kernelFunction; } #define _NAME(...) #__VA_ARGS__, CM_KERNEL_FUNCTION_POINTER(__VA_ARGS__) #else #define _NAME(...) #__VA_ARGS__ #endif #else // ifdef CM_LINUX #define CM_ATTRIBUTE(attribute) __declspec(attribute) #define CM_TYPE_NAME(type) typeid(type).name() inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment) { return _aligned_malloc(size, alignment); } inline void CM_ALIGNED_FREE(void * memory) { _aligned_free(memory); } #if !CM_METRO //multi-thread API: #define THREAD_HANDLE HANDLE inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg) { handle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, (LPVOID)arg, 0, NULL); } inline void CM_THREAD_EXIT(void * retval) { ExitThread(0); } inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt) { DWORD ret = WaitForMultipleObjects(thread_cnt, handle_array, true, INFINITE); return ret; } #endif #define CM_SURFACE_FORMAT D3DFORMAT #define CM_SURFACE_FORMAT_UNKNOWN D3DFMT_UNKNOWN #define CM_SURFACE_FORMAT_A8R8G8B8 D3DFMT_A8R8G8B8 #define CM_SURFACE_FORMAT_X8R8G8B8 D3DFMT_X8R8G8B8 #define CM_SURFACE_FORMAT_A8B8G8R8 D3DFMT_A8B8G8R8 #define CM_SURFACE_FORMAT_A8 D3DFMT_A8 #define CM_SURFACE_FORMAT_P8 D3DFMT_P8 #define CM_SURFACE_FORMAT_R32F D3DFMT_R32F #define CM_SURFACE_FORMAT_NV12 (D3DFORMAT)MAKEFOURCC('N','V','1','2') #define CM_SURFACE_FORMAT_P016 (D3DFORMAT)MAKEFOURCC('P','0','1','6') #define CM_SURFACE_FORMAT_P010 (D3DFORMAT)MAKEFOURCC('P','0','1','0') #define CM_SURFACE_FORMAT_UYVY D3DFMT_UYVY #define CM_SURFACE_FORMAT_YUY2 D3DFMT_YUY2 #define CM_SURFACE_FORMAT_V8U8 D3DFMT_V8U8 #define CM_SURFACE_FORMAT_A8L8 D3DFMT_A8L8 #define CM_SURFACE_FORMAT_D16 D3DFMT_D16 #define CM_SURFACE_FORMAT_L16 D3DFMT_L16 #define CM_SURFACE_FORMAT_A16B16G16R16 D3DFMT_A16B16G16R16 #define CM_SURFACE_FORMAT_A16B16G16R16F D3DFMT_A16B16G16R16F #define CM_SURFACE_FORMAT_R10G10B10A2 D3DFMT_A2B10G10R10 #define CM_SURFACE_FORMAT_IRW0 (D3DFORMAT)MAKEFOURCC('I','R','W','0') #define CM_SURFACE_FORMAT_IRW1 (D3DFORMAT)MAKEFOURCC('I','R','W','1') #define CM_SURFACE_FORMAT_IRW2 (D3DFORMAT)MAKEFOURCC('I','R','W','2') #define CM_SURFACE_FORMAT_IRW3 (D3DFORMAT)MAKEFOURCC('I','R','W','3') #define CM_SURFACE_FORMAT_R16_FLOAT D3DFMT_R16F //beryl #define CM_SURFACE_FORMAT_A8P8 D3DFMT_A8P8 #define CM_SURFACE_FORMAT_I420 (D3DFORMAT)MAKEFOURCC('I','4','2','0') #define CM_SURFACE_FORMAT_IMC3 (D3DFORMAT)MAKEFOURCC('I','M','C','3') #define CM_SURFACE_FORMAT_IA44 (D3DFORMAT)MAKEFOURCC('I','A','4','4') #define CM_SURFACE_FORMAT_AI44 (D3DFORMAT)MAKEFOURCC('A','I','4','4') #define CM_SURFACE_FORMAT_P216 (D3DFORMAT)MAKEFOURCC('P','2','1','6') #define CM_SURFACE_FORMAT_Y410 (D3DFORMAT)MAKEFOURCC('Y','4','1','0') #define CM_SURFACE_FORMAT_Y416 (D3DFORMAT)MAKEFOURCC('Y','4','1','6') #define CM_SURFACE_FORMAT_Y210 (D3DFORMAT)MAKEFOURCC('Y','2','1','0') #define CM_SURFACE_FORMAT_Y216 (D3DFORMAT)MAKEFOURCC('Y','2','1','6') #define CM_SURFACE_FORMAT_AYUV (D3DFORMAT)MAKEFOURCC('A','Y','U','V') #define CM_SURFACE_FORMAT_YV12 (D3DFORMAT)MAKEFOURCC('Y','V','1','2') #define CM_SURFACE_FORMAT_400P (D3DFORMAT)MAKEFOURCC('4','0','0','P') #define CM_SURFACE_FORMAT_411P (D3DFORMAT)MAKEFOURCC('4','1','1','P') #define CM_SURFACE_FORMAT_411R (D3DFORMAT)MAKEFOURCC('4','1','1','R') #define CM_SURFACE_FORMAT_422H (D3DFORMAT)MAKEFOURCC('4','2','2','H') #define CM_SURFACE_FORMAT_422V (D3DFORMAT)MAKEFOURCC('4','2','2','V') #define CM_SURFACE_FORMAT_444P (D3DFORMAT)MAKEFOURCC('4','4','4','P') #define CM_SURFACE_FORMAT_RGBP (D3DFORMAT)MAKEFOURCC('R','G','B','P') #define CM_SURFACE_FORMAT_BGRP (D3DFORMAT)MAKEFOURCC('B','G','R','P') #define CM_TEXTURE_ADDRESS_TYPE D3DTEXTUREADDRESS #define CM_TEXTURE_ADDRESS_WRAP D3DTADDRESS_WRAP #define CM_TEXTURE_ADDRESS_MIRROR D3DTADDRESS_MIRROR #define CM_TEXTURE_ADDRESS_CLAMP D3DTADDRESS_CLAMP #define CM_TEXTURE_ADDRESS_BORDER D3DTADDRESS_BORDER #define CM_TEXTURE_ADDRESS_MIRRORONCE D3DTADDRESS_MIRRORONCE #define CM_TEXTURE_FILTER_TYPE D3DTEXTUREFILTERTYPE #define CM_TEXTURE_FILTER_TYPE_NONE D3DTEXF_NONE #define CM_TEXTURE_FILTER_TYPE_POINT D3DTEXF_POINT #define CM_TEXTURE_FILTER_TYPE_LINEAR D3DTEXF_LINEAR #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC D3DTEXF_ANISOTROPIC #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC D3DTEXF_FLATCUBIC #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC D3DTEXF_GAUSSIANCUBIC #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD D3DTEXF_PYRAMIDALQUAD #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD D3DTEXF_GAUSSIANQUAD #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO D3DTEXF_CONVOLUTIONMONO #ifdef CMRT_EMU // CM_KERNEL_FUNCTION macro provides wrong kernel name w/ unexplicit template like CM_KERNEL_FUNCTION(kernel) #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__, (void *)(void (*) (void))__VA_ARGS__ #else #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__ #endif #ifdef CMRT_EMU #define _NAME(...) #__VA_ARGS__, (void (*)(void))__VA_ARGS__ #else #define _NAME(...) #__VA_ARGS__ #endif #endif #define CM_RT_API #define CM_KERNEL_FUNCTION(...) CM_KERNEL_FUNCTION2(__VA_ARGS__) #define CM_1_0 100 #define CM_2_0 200 #define CM_2_1 201 #define CM_2_2 202 #define CM_2_3 203 #define CM_2_4 204 #define CM_3_0 300 #define CM_4_0 400 #define CM_5_0 500 #define CM_6_0 600 #define CM_7_0 700 /* Return codes */ #define CM_SUCCESS 0 #define CM_FAILURE -1 #define CM_NOT_IMPLEMENTED -2 #define CM_SURFACE_ALLOCATION_FAILURE -3 #define CM_OUT_OF_HOST_MEMORY -4 #define CM_SURFACE_FORMAT_NOT_SUPPORTED -5 #define CM_EXCEED_SURFACE_AMOUNT -6 #define CM_EXCEED_KERNEL_ARG_AMOUNT -7 #define CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE -8 #define CM_INVALID_ARG_INDEX -9 #define CM_INVALID_ARG_VALUE -10 #define CM_INVALID_ARG_SIZE -11 #define CM_INVALID_THREAD_INDEX -12 #define CM_INVALID_WIDTH -13 #define CM_INVALID_HEIGHT -14 #define CM_INVALID_DEPTH -15 #define CM_INVALID_COMMON_ISA -16 #define CM_D3DDEVICEMGR_OPEN_HANDLE_FAIL -17 // IDirect3DDeviceManager9::OpenDeviceHandle fail #define CM_D3DDEVICEMGR_DXVA2_E_NEW_VIDEO_DEVICE -18 // IDirect3DDeviceManager9::LockDevice return DXVA2_E_VIDEO_DEVICE_LOCKED #define CM_D3DDEVICEMGR_LOCK_DEVICE_FAIL -19 // IDirect3DDeviceManager9::LockDevice return other fail than DXVA2_E_VIDEO_DEVICE_LOCKED #define CM_EXCEED_SAMPLER_AMOUNT -20 #define CM_EXCEED_MAX_KERNEL_PER_ENQUEUE -21 #define CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE -22 #define CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE -23 #define CM_EXCEED_VME_STATE_G6_AMOUNT -24 #define CM_INVALID_THREAD_SPACE -25 #define CM_EXCEED_MAX_TIMEOUT -26 #define CM_JITDLL_LOAD_FAILURE -27 #define CM_JIT_COMPILE_FAILURE -28 #define CM_JIT_COMPILESIM_FAILURE -29 #define CM_INVALID_THREAD_GROUP_SPACE -30 #define CM_THREAD_ARG_NOT_ALLOWED -31 #define CM_INVALID_GLOBAL_BUFFER_INDEX -32 #define CM_INVALID_BUFFER_HANDLER -33 #define CM_EXCEED_MAX_SLM_SIZE -34 #define CM_JITDLL_OLDER_THAN_ISA -35 #define CM_INVALID_HARDWARE_THREAD_NUMBER -36 #define CM_GTPIN_INVOKE_FAILURE -37 #define CM_INVALIDE_L3_CONFIGURATION -38 #define CM_INVALID_D3D11_TEXTURE2D_USAGE -39 #define CM_INTEL_GFX_NOTFOUND -40 #define CM_GPUCOPY_INVALID_SYSMEM -41 #define CM_GPUCOPY_INVALID_WIDTH -42 #define CM_GPUCOPY_INVALID_STRIDE -43 #define CM_EVENT_DRIVEN_FAILURE -44 #define CM_LOCK_SURFACE_FAIL -45 // Lock surface failed #define CM_INVALID_GENX_BINARY -46 #define CM_FEATURE_NOT_SUPPORTED_IN_DRIVER -47 // driver out-of-sync #define CM_QUERY_DLL_VERSION_FAILURE -48 //Fail in getting DLL file version #define CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL -49 #define CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL -50 #define CM_KERNELPAYLOAD_SETTING_FAILURE -51 #define CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX -52 #define CM_NOT_SET_KERNEL_ARGUMENT -53 #define CM_GPUCOPY_INVALID_SURFACES -54 #define CM_GPUCOPY_INVALID_SIZE -55 #define CM_GPUCOPY_OUT_OF_RESOURCE -56 #define CM_DEVICE_INVALID_D3DDEVICE -57 #define CM_SURFACE_DELAY_DESTROY -58 #define CM_INVALID_VEBOX_STATE -59 #define CM_INVALID_VEBOX_SURFACE -60 #define CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE -61 #define CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE -62 #define CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED -63 #define CM_INVALID_UMD_CONTEXT -64 #define CM_INVALID_LIBVA_SURFACE -65 #define CM_INVALID_LIBVA_INITIALIZE -66 #define CM_KERNEL_THREADSPACE_NOT_SET -67 #define CM_INVALID_KERNEL_THREADSPACE -68 #define CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED -69 #define CM_KERNEL_THREADSPACE_INTEGRITY_FAILED -70 #define CM_INVALID_USERPROVIDED_GENBINARY -71 #define CM_INVALID_PRIVATE_DATA -72 #define CM_INVALID_MOS_RESOURCE_HANDLE -73 #define CM_SURFACE_CACHED -74 #define CM_SURFACE_IN_USE -75 #define CM_INVALID_GPUCOPY_KERNEL -76 #define CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN -77 #define CM_INVALID_MEDIA_WALKING_PATTERN -78 #define CM_FAILED_TO_ALLOCATE_SVM_BUFFER -79 #define CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM -80 #define CM_INVALID_KERNEL_THREADGROUPSPACE -81 #define CM_INVALID_KERNEL_SPILL_CODE -82 #define CM_UMD_DRIVER_NOT_SUPPORTED -83 #define CM_INVALID_GPU_FREQUENCY_VALUE -84 #define CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED -85 #define CM_KERNEL_ARG_SETTING_FAILED -86 #define CM_NO_AVAILABLE_SURFACE -87 #define CM_VA_SURFACE_NOT_SUPPORTED -88 #define CM_TOO_MUCH_THREADS -89 #define CM_NULL_POINTER -90 #define CM_EXCEED_MAX_NUM_2D_ALIASES -91 #define CM_INVALID_PARAM_SIZE -92 #define CM_GT_UNSUPPORTED -93 #define CM_GTPIN_FLAG_NO_LONGER_SUPPORTED -94 #define CM_PLATFORM_UNSUPPORTED_FOR_API -95 #define CM_TASK_MEDIA_RESET -96 #define CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX -97 #define CM_EXCEED_MAX_NUM_BUFFER_ALIASES -98 #define CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED -99 #define CM_FAILED_TO_CREATE_CURBE_SURFACE -100 #define CM_INVALID_CAP_NAME -101 /* End of return codes */ typedef enum _GPU_PLATFORM { PLATFORM_INTEL_UNKNOWN = 0, PLATFORM_INTEL_SNB = 1, //Sandy Bridge PLATFORM_INTEL_IVB = 2, //Ivy Bridge PLATFORM_INTEL_HSW = 3, //Haswell PLATFORM_INTEL_BDW = 4, //Broadwell PLATFORM_INTEL_VLV = 5, //ValleyView PLATFORM_INTEL_CHV = 6, //CherryView PLATFORM_INTEL_SKL = 7, //SKL PLATFORM_INTEL_BXT = 8, //Broxton PLATFORM_INTEL_CNL = 9, //Cannonlake PLATFORM_INTEL_ICL = 10, //Icelake PLATFORM_INTEL_KBL = 11, //Kabylake PLATFORM_INTEL_GLV = 12, //Glenview PLATFORM_INTEL_ICLLP = 13, //IcelakeLP PLATFORM_INTEL_TGLLP = 15,//TigerLakeLP PLATFORM_INTEL_GLK = 16, //GeminiLake PLATFORM_INTEL_CFL = 17, //CofeeLake PLATFORM_INTEL_EHL = 18, //ElkhartLake PLATFORM_INTEL_RKL = 19, //RocketLake PLATFORM_INTEL_DG1 = 20, //DG1 PLATFORM_INTEL_ADL_S = 21, //AlderLake PLATFORM_INTEL_DG2 = 22, //DG2 PLATFORM_INTEL_ADL_P = 23, //AlderLake PLATFORM_INTEL_ADL_N = 24, //AlderLake-N } GPU_PLATFORM; //Time in seconds before kernel should timeout #define CM_MAX_TIMEOUT 2 //Time in milliseconds before kernel should timeout #define CM_MAX_TIMEOUT_MS CM_MAX_TIMEOUT*1000 #define CM_MAX_TIMEOUT_SIM 600000 typedef enum _CM_STATUS { CM_STATUS_QUEUED = 0, CM_STATUS_FLUSHED = 1, CM_STATUS_FINISHED = 2, CM_STATUS_STARTED = 3 } CM_STATUS; enum CM_QUEUE_TYPE { CM_QUEUE_TYPE_NONE = 0, CM_QUEUE_TYPE_RENDER = 1, CM_QUEUE_TYPE_COMPUTE = 2, CM_QUEUE_TYPE_VEBOX = 3 }; enum CM_QUEUE_SSEU_USAGE_HINT_TYPE { CM_QUEUE_SSEU_USAGE_HINT_DEFAULT = 0, CM_QUEUE_SSEU_USAGE_HINT_VME = 1 }; struct CM_QUEUE_CREATE_OPTION { CM_QUEUE_TYPE QueueType : 3; bool RunAloneMode : 1; unsigned int Reserved0 : 3; bool UserGPUContext : 1; unsigned int GPUContext : 8; // 11 - MOS_GPU_CONTEXT_RENDER3 for default, 12 - MOS_GPU_CONTEXT_RENDER4 for second render context handle. CM_QUEUE_SSEU_USAGE_HINT_TYPE SseuUsageHint : 3; unsigned int Reserved2 : 13; }; //********************************************************************** // Constants //********************************************************************** const CM_QUEUE_CREATE_OPTION CM_DEFAULT_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_RENDER, false, 0x0, false, 11, CM_QUEUE_SSEU_USAGE_HINT_DEFAULT, 0x0 }; const CM_QUEUE_CREATE_OPTION CM_VME_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_RENDER, false, 0x0, false, 12, CM_QUEUE_SSEU_USAGE_HINT_VME, 0x0 }; const CM_QUEUE_CREATE_OPTION CM_COMPUTE_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_COMPUTE, false, 0x0, false, 0, CM_QUEUE_SSEU_USAGE_HINT_DEFAULT, 0x0 }; typedef struct _CM_SAMPLER_STATE { CM_TEXTURE_FILTER_TYPE minFilterType; CM_TEXTURE_FILTER_TYPE magFilterType; CM_TEXTURE_ADDRESS_TYPE addressU; CM_TEXTURE_ADDRESS_TYPE addressV; CM_TEXTURE_ADDRESS_TYPE addressW; } CM_SAMPLER_STATE; typedef enum _CM_DEVICE_CAP_NAME { CAP_KERNEL_COUNT_PER_TASK, CAP_KERNEL_BINARY_SIZE, CAP_SAMPLER_COUNT, CAP_SAMPLER_COUNT_PER_KERNEL, CAP_BUFFER_COUNT, CAP_SURFACE2D_COUNT, CAP_SURFACE3D_COUNT, CAP_SURFACE_COUNT_PER_KERNEL, CAP_ARG_COUNT_PER_KERNEL, CAP_ARG_SIZE_PER_KERNEL, CAP_USER_DEFINED_THREAD_COUNT_PER_TASK, CAP_HW_THREAD_COUNT, CAP_SURFACE2D_FORMAT_COUNT, CAP_SURFACE2D_FORMATS, CAP_SURFACE3D_FORMAT_COUNT, CAP_SURFACE3D_FORMATS, CAP_VME_STATE_COUNT, CAP_GPU_PLATFORM, CAP_GT_PLATFORM, CAP_MIN_FREQUENCY, CAP_MAX_FREQUENCY, CAP_L3_CONFIG, CAP_GPU_CURRENT_FREQUENCY, CAP_USER_DEFINED_THREAD_COUNT_PER_TASK_NO_THREAD_ARG, CAP_USER_DEFINED_THREAD_COUNT_PER_MEDIA_WALKER, CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP, CAP_SURFACE2DUP_COUNT, CAP_PLATFORM_INFO, CAP_MAX_BUFFER_SIZE } CM_DEVICE_CAP_NAME; typedef enum _CM_DEPENDENCY_PATTERN { CM_NONE_DEPENDENCY = 0, //All threads run parallel, scanline dispatch CM_WAVEFRONT = 1, CM_WAVEFRONT26 = 2, CM_VERTICAL_DEPENDENCY = 3, CM_HORIZONTAL_DEPENDENCY = 4, } CM_DEPENDENCY_PATTERN; typedef enum _CM_SAMPLER8x8_SURFACE_ { CM_AVS_SURFACE = 0, CM_VA_SURFACE = 1 }CM_SAMPLER8x8_SURFACE; typedef enum _CM_SURFACE_ADDRESS_CONTROL_MODE_ { CM_SURFACE_CLAMP = 0, CM_SURFACE_MIRROR = 1 }CM_SURFACE_ADDRESS_CONTROL_MODE; typedef struct _CM_SURFACE_DETAILS { UINT width; UINT height; UINT depth; CM_SURFACE_FORMAT format; UINT planeIndex; UINT pitch; UINT slicePitch; UINT SurfaceBaseAddress; UINT8 TiledSurface; UINT8 TileWalk; UINT XOffset; UINT YOffset; }CM_SURFACE_DETAILS; typedef struct _CM_AVS_COEFF_TABLE { float FilterCoeff_0_0; float FilterCoeff_0_1; float FilterCoeff_0_2; float FilterCoeff_0_3; float FilterCoeff_0_4; float FilterCoeff_0_5; float FilterCoeff_0_6; float FilterCoeff_0_7; }CM_AVS_COEFF_TABLE; typedef struct _CM_AVS_INTERNEL_COEFF_TABLE { BYTE FilterCoeff_0_0; BYTE FilterCoeff_0_1; BYTE FilterCoeff_0_2; BYTE FilterCoeff_0_3; BYTE FilterCoeff_0_4; BYTE FilterCoeff_0_5; BYTE FilterCoeff_0_6; BYTE FilterCoeff_0_7; }CM_AVS_INTERNEL_COEFF_TABLE; typedef struct _CM_CONVOLVE_COEFF_TABLE { float FilterCoeff_0_0; float FilterCoeff_0_1; float FilterCoeff_0_2; float FilterCoeff_0_3; float FilterCoeff_0_4; float FilterCoeff_0_5; float FilterCoeff_0_6; float FilterCoeff_0_7; float FilterCoeff_0_8; float FilterCoeff_0_9; float FilterCoeff_0_10; float FilterCoeff_0_11; float FilterCoeff_0_12; float FilterCoeff_0_13; float FilterCoeff_0_14; float FilterCoeff_0_15; float FilterCoeff_0_16; float FilterCoeff_0_17; float FilterCoeff_0_18; float FilterCoeff_0_19; float FilterCoeff_0_20; float FilterCoeff_0_21; float FilterCoeff_0_22; float FilterCoeff_0_23; float FilterCoeff_0_24; float FilterCoeff_0_25; float FilterCoeff_0_26; float FilterCoeff_0_27; float FilterCoeff_0_28; float FilterCoeff_0_29; float FilterCoeff_0_30; float FilterCoeff_0_31; }CM_CONVOLVE_COEFF_TABLE; /* * MISC SAMPLER8x8 State */ typedef struct _CM_MISC_STATE { //DWORD 0 union { struct { DWORD Row0 : 16; DWORD Reserved : 8; DWORD Width : 4; DWORD Height : 4; }; struct { DWORD value; }; } DW0; //DWORD 1 union { struct { DWORD Row1 : 16; DWORD Row2 : 16; }; struct { DWORD value; }; } DW1; //DWORD 2 union { struct { DWORD Row3 : 16; DWORD Row4 : 16; }; struct { DWORD value; }; } DW2; //DWORD 3 union { struct { DWORD Row5 : 16; DWORD Row6 : 16; }; struct { DWORD value; }; } DW3; //DWORD 4 union { struct { DWORD Row7 : 16; DWORD Row8 : 16; }; struct { DWORD value; }; } DW4; //DWORD 5 union { struct { DWORD Row9 : 16; DWORD Row10 : 16; }; struct { DWORD value; }; } DW5; //DWORD 6 union { struct { DWORD Row11 : 16; DWORD Row12 : 16; }; struct { DWORD value; }; } DW6; //DWORD 7 union { struct { DWORD Row13 : 16; DWORD Row14 : 16; }; struct { DWORD value; }; } DW7; } CM_MISC_STATE; typedef struct _CM_MISC_STATE_MSG { //DWORD 0 union { struct { DWORD Row0 : 16; DWORD Reserved : 8; DWORD Width : 4; DWORD Height : 4; }; struct { DWORD value; }; }DW0; //DWORD 1 union { struct { DWORD Row1 : 16; DWORD Row2 : 16; }; struct { DWORD value; }; }DW1; //DWORD 2 union { struct { DWORD Row3 : 16; DWORD Row4 : 16; }; struct { DWORD value; }; }DW2; //DWORD 3 union { struct { DWORD Row5 : 16; DWORD Row6 : 16; }; struct { DWORD value; }; }DW3; //DWORD 4 union { struct { DWORD Row7 : 16; DWORD Row8 : 16; }; struct { DWORD value; }; }DW4; //DWORD 5 union { struct { DWORD Row9 : 16; DWORD Row10 : 16; }; struct { DWORD value; }; }DW5; //DWORD 6 union { struct { DWORD Row11 : 16; DWORD Row12 : 16; }; struct { DWORD value; }; }DW6; //DWORD 7 union { struct { DWORD Row13 : 16; DWORD Row14 : 16; }; struct { DWORD value; }; }DW7; } CM_MISC_STATE_MSG; typedef enum _CM_FASTCOPY_OPTION { CM_FASTCOPY_OPTION_NONBLOCKING = 0x00, CM_FASTCOPY_OPTION_BLOCKING = 0x01 } CM_FASTCOPY_OPTION; #include #include #define CM_MIN_SURF_WIDTH 1 #define CM_MIN_SURF_HEIGHT 1 #define CM_MIN_SURF_DEPTH 2 #define CM_MAX_1D_SURF_WIDTH 0X40000000 // 2^30 //IVB+ #define CM_MAX_2D_SURF_WIDTH 16384 #define CM_MAX_2D_SURF_HEIGHT 16384 #define CM_MAX_3D_SURF_WIDTH 2048 #define CM_MAX_3D_SURF_HEIGHT 2048 #define CM_MAX_3D_SURF_DEPTH 2048 #define CM_MAX_OPTION_SIZE_IN_BYTE 512 #define CM_MAX_KERNEL_NAME_SIZE_IN_BYTE 256 #define CM_MAX_ISA_FILE_NAME_SIZE_IN_BYTE 256 #define CM_MAX_THREADSPACE_WIDTH_FOR_MW 511 #define CM_MAX_THREADSPACE_HEIGHT_FOR_MW 511 #define CM_MAX_THREADSPACE_WIDTH_FOR_MO 512 #define CM_MAX_THREADSPACE_HEIGHT_FOR_MO 512 #define CM_MAX_THREADSPACE_WIDTH_SKLUP_FOR_MW 2047 #define CM_MAX_THREADSPACE_HEIGHT_SKLUP_FOR_MW 2047 class CmEvent; typedef void (*callback_function)(CmEvent*, void *); extern class CmEvent *CM_NO_EVENT; struct CM_SAMPLER_STATE_EX; // Cm Device Create Option #define CM_DEVICE_CREATE_OPTION_DEFAULT 0 #define CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE 1 #define CM_DEVICE_CREATE_OPTION_TDR_DISABLE 64 //Work only for DX11 so far #define CM_DEVICE_CREATE_OPTION_SURFACE_REUSE_ENABLE 1024 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET 22 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_DISENABLE (1 << CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET) struct CM_VME_SURFACE_STATE_PARAM; #define CM_MAX_DEPENDENCY_COUNT 8 #define CM_NUM_DWORD_FOR_MW_PARAM 16 /**************** L3/Cache ***************/ typedef enum _MEMORY_OBJECT_CONTROL { MEMORY_OBJECT_CONTROL_SKL_DEFAULT = 0, MEMORY_OBJECT_CONTROL_SKL_NO_L3, MEMORY_OBJECT_CONTROL_SKL_NO_LLC_ELLC, MEMORY_OBJECT_CONTROL_SKL_NO_LLC, MEMORY_OBJECT_CONTROL_SKL_NO_ELLC, MEMORY_OBJECT_CONTROL_SKL_NO_LLC_L3, MEMORY_OBJECT_CONTROL_SKL_NO_ELLC_L3, MEMORY_OBJECT_CONTROL_SKL_NO_CACHE, MEMORY_OBJECT_CONTROL_SKL_COUNT, MEMORY_OBJECT_CONTROL_CNL_DEFAULT = 0, MEMORY_OBJECT_CONTROL_CNL_NO_L3, MEMORY_OBJECT_CONTROL_CNL_NO_LLC_ELLC, MEMORY_OBJECT_CONTROL_CNL_NO_LLC, MEMORY_OBJECT_CONTROL_CNL_NO_ELLC, MEMORY_OBJECT_CONTROL_CNL_NO_LLC_L3, MEMORY_OBJECT_CONTROL_CNL_NO_ELLC_L3, MEMORY_OBJECT_CONTROL_CNL_NO_CACHE, MEMORY_OBJECT_CONTROL_CNL_COUNT, MEMORY_OBJECT_CONTROL_ICL_DEFAULT = 0, MEMORY_OBJECT_CONTROL_ICL_COUNT, MEMORY_OBJECT_CONTROL_UNKNOWN = 0xff } MEMORY_OBJECT_CONTROL; typedef enum _MEMORY_TYPE { CM_USE_PTE, CM_UN_CACHEABLE, CM_WRITE_THROUGH, CM_WRITE_BACK, // BDW MEMORY_TYPE_BDW_UC_WITH_FENCE = 0, MEMORY_TYPE_BDW_UC, MEMORY_TYPE_BDW_WT, MEMORY_TYPE_BDW_WB } MEMORY_TYPE; struct L3ConfigRegisterValues { unsigned int config_register0; unsigned int config_register1; unsigned int config_register2; unsigned int config_register3; }; typedef enum _L3_SUGGEST_CONFIG { BDW_L3_PLANE_DEFAULT = 0, BDW_L3_PLANE_1, BDW_L3_PLANE_2, BDW_L3_PLANE_3, BDW_L3_PLANE_4, BDW_L3_PLANE_5, BDW_L3_PLANE_6, BDW_L3_PLANE_7, BDW_L3_CONFIG_COUNT, SKL_L3_PLANE_DEFAULT = 0, SKL_L3_PLANE_1, SKL_L3_PLANE_2, SKL_L3_PLANE_3, SKL_L3_PLANE_4, SKL_L3_PLANE_5, SKL_L3_PLANE_6, SKL_L3_PLANE_7, SKL_L3_CONFIG_COUNT, CNL_L3_PLANE_DEFAULT = 0, CNL_L3_PLANE_1, CNL_L3_PLANE_2, CNL_L3_PLANE_3, CNL_L3_PLANE_4, CNL_L3_PLANE_5, CNL_L3_PLANE_6, CNL_L3_PLANE_7, CNL_L3_PLANE_8, CNL_L3_CONFIG_COUNT, ICL_L3_PLANE_DEFAULT = 0, ICL_L3_PLANE_1, ICL_L3_PLANE_2, ICL_L3_PLANE_3, ICL_L3_PLANE_4, ICL_L3_PLANE_5, ICL_L3_CONFIG_COUNT, // ICL and CNL have the same recommended L3 settings, with ICL not supporting SLM directly. ICLLP_L3_PLANE_DEFAULT = 0, ICLLP_L3_PLANE_1, ICLLP_L3_PLANE_2, ICLLP_L3_PLANE_3, ICLLP_L3_PLANE_4, ICLLP_L3_PLANE_5, ICLLP_L3_PLANE_6, ICLLP_L3_PLANE_7, ICLLP_L3_PLANE_8, ICLLP_L3_CONFIG_COUNT, TGL_L3_PLANE_DEFAULT = 0, TGL_L3_PLANE_1, TGL_L3_PLANE_2, TGL_L3_PLANE_3, TGL_L3_PLANE_4, TGL_L3_PLANE_5, TGL_L3_PLANE_6, TGL_L3_CONFIG_COUNT, // TGL and TGLLP have the same recommended L3 settings. BDW_SLM_PLANE_DEFAULT = BDW_L3_PLANE_5, SKL_SLM_PLANE_DEFAULT = SKL_L3_PLANE_5 } L3_SUGGEST_CONFIG; /* * AVS SAMPLER8x8 STATE */ #define CM_NUM_COEFF_ROWS 17 #define CM_NUM_COEFF_ROWS_SKL 32 typedef struct _CM_AVS_NONPIPLINED_STATE { bool BypassXAF; bool BypassYAF; BYTE DefaultSharpLvl; BYTE maxDerivative4Pixels; BYTE maxDerivative8Pixels; BYTE transitionArea4Pixels; BYTE transitionArea8Pixels; CM_AVS_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS_SKL]; bool bEnableRGBAdaptive; bool bAdaptiveFilterAllChannels; }CM_AVS_NONPIPLINED_STATE; typedef struct _CM_AVS_INTERNEL_NONPIPLINED_STATE { bool BypassXAF; bool BypassYAF; BYTE DefaultSharpLvl; BYTE maxDerivative4Pixels; BYTE maxDerivative8Pixels; BYTE transitionArea4Pixels; BYTE transitionArea8Pixels; CM_AVS_INTERNEL_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_INTERNEL_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_INTERNEL_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS_SKL]; CM_AVS_INTERNEL_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS_SKL]; bool bEnableRGBAdaptive; bool bAdaptiveFilterAllChannels; }CM_AVS_INTERNEL_NONPIPLINED_STATE; typedef struct _CM_AVS_STATE_MSG { bool AVSTYPE; //true nearest, false adaptive bool EightTapAFEnable; //HSW+ bool BypassIEF; //ignored for BWL, moved to sampler8x8 payload. bool ShuffleOutputWriteback; //SKL mode only to be set when AVS msg sequence is 4x4 or 8x4 bool HDCDirectWriteEnable; unsigned short GainFactor; unsigned char GlobalNoiseEstm; unsigned char StrongEdgeThr; unsigned char WeakEdgeThr; unsigned char StrongEdgeWght; unsigned char RegularWght; unsigned char NonEdgeWght; unsigned short wR3xCoefficient; unsigned short wR3cCoefficient; unsigned short wR5xCoefficient; unsigned short wR5cxCoefficient; unsigned short wR5cCoefficient; //For Non-piplined states unsigned short stateID; CM_AVS_NONPIPLINED_STATE * AvsState; } CM_AVS_STATE_MSG; typedef BYTE CM_AVS_STATE_MSG_EX[4244]; /* * CONVOLVE STATE DATA STRUCTURES */ //*----------------------------------------------------------------------------- //| CM Convolve type for SKL+ //*----------------------------------------------------------------------------- typedef enum _CM_CONVOLVE_SKL_TYPE { CM_CONVOLVE_SKL_TYPE_2D = 0, CM_CONVOLVE_SKL_TYPE_1D = 1, CM_CONVOLVE_SKL_TYPE_1P = 2 } CM_CONVOLVE_SKL_TYPE; #define CM_NUM_CONVOLVE_ROWS 16 #define CM_NUM_CONVOLVE_ROWS_SKL 32 typedef struct _CM_CONVOLVE_STATE_MSG { bool CoeffSize; //true 16-bit, false 8-bit byte SclDwnValue; //Scale down value byte Width; //Kernel Width byte Height; //Kernel Height //SKL mode bool isVertical32Mode; bool isHorizontal32Mode; CM_CONVOLVE_SKL_TYPE nConvolveType; CM_CONVOLVE_COEFF_TABLE Table[CM_NUM_CONVOLVE_ROWS_SKL]; } CM_CONVOLVE_STATE_MSG; enum CM_SAMPLER_STATE_TYPE { CM_SAMPLER8X8_AVS = 0, CM_SAMPLER8X8_CONV = 1, CM_SAMPLER8X8_MISC = 3, CM_SAMPLER8X8_CONV1DH = 4, CM_SAMPLER8X8_CONV1DV = 5, CM_SAMPLER8X8_AVS_EX = 6, CM_SAMPLER8X8_NONE }; struct CM_SAMPLER_8X8_DESCR { CM_SAMPLER_STATE_TYPE stateType; union { CM_AVS_STATE_MSG *avs; CM_AVS_STATE_MSG_EX *avs_ex; CM_CONVOLVE_STATE_MSG *conv; CM_MISC_STATE_MSG *misc; //ERODE/DILATE/MINMAX }; }; struct CM_FLAG; #define CM_NULL_SURFACE 0xFFFF //! //! CM Sampler8X8 //! class CmSampler8x8 { public: CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0; }; /***********END SAMPLER8X8********************/ class CmEvent { public: CM_RT_API virtual INT GetStatus(CM_STATUS& status) = 0; CM_RT_API virtual INT GetExecutionTime(UINT64& time) = 0; CM_RT_API virtual INT WaitForTaskFinished(DWORD dwTimeOutMs = CM_MAX_TIMEOUT_MS) = 0; }; class CmThreadSpace; class CmThreadGroupSpace; class CmKernel { public: CM_RT_API virtual INT SetThreadCount(UINT count) = 0; CM_RT_API virtual INT SetKernelArg(UINT index, size_t size, const void * pValue) = 0; CM_RT_API virtual INT SetThreadArg(UINT threadId, UINT index, size_t size, const void * pValue) = 0; CM_RT_API virtual INT SetStaticBuffer(UINT index, const void * pValue) = 0; CM_RT_API virtual INT SetSurfaceBTI(SurfaceIndex* pSurface, UINT BTIndex) = 0; CM_RT_API virtual INT AssociateThreadSpace(CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT AssociateThreadGroupSpace(CmThreadGroupSpace* & pTGS) = 0; }; class CmTask { public: CM_RT_API virtual INT AddKernel(CmKernel *pKernel) = 0; CM_RT_API virtual INT Reset(void) = 0; CM_RT_API virtual INT AddSync(void) = 0; }; class CmProgram; class SurfaceIndex; class SamplerIndex; class CmBuffer { public: CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0; CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0; CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0; }; class CmBufferUP { public: CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0; CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0; }; class CmBufferSVM; typedef void * CmAbstractSurfaceHandle; class CmSurface2D { public: CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0; #ifdef CM_WIN CM_RT_API virtual INT GetD3DSurface(CmAbstractSurfaceHandle& pD3DSurface) = 0; #endif CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT ReadSurfaceStride(unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT WriteSurfaceStride(const unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0; #ifdef CM_WIN CM_RT_API virtual INT QuerySubresourceIndex(UINT& FirstArraySlice, UINT& FirstMipSlice) = 0; #endif #ifdef CM_LINUX CM_RT_API virtual INT GetVaSurfaceID(VASurfaceID &iVASurface) = 0; #endif }; class CmSurface2DUP { public: CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0; CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0; }; class CmSurface3D { public: CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0; CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0; CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0; CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0; }; class CmSampler { public: CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0; }; class CmThreadSpace { public: CM_RT_API virtual INT AssociateThread(UINT x, UINT y, CmKernel* pKernel, UINT threadId) = 0; CM_RT_API virtual INT SelectThreadDependencyPattern(CM_DEPENDENCY_PATTERN pattern) = 0; }; class CmThreadGroupSpace; class CmVebox; class CmQueue { public: CM_RT_API virtual INT Enqueue(CmTask* pTask, CmEvent* & pEvent, const CmThreadSpace* pTS = NULL) = 0; CM_RT_API virtual INT DestroyEvent(CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueWithGroup(CmTask* pTask, CmEvent* & pEvent, const CmThreadGroupSpace* pTGS = NULL) = 0; CM_RT_API virtual INT EnqueueCopyCPUToGPU(CmSurface2D* pSurface, const unsigned char* pSysMem, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueCopyGPUToCPU(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueInitSurface2D(CmSurface2D* pSurface, const DWORD initValue, CmEvent* &pEvent) = 0; CM_RT_API virtual INT EnqueueCopyGPUToGPU(CmSurface2D* pOutputSurface, CmSurface2D* pInputSurface, UINT option, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueCopyCPUToCPU(unsigned char* pDstSysMem, unsigned char* pSrcSysMem, UINT size, UINT option, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueCopyCPUToGPUFullStride(CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueCopyGPUToCPUFullStride(CmSurface2D* pSurface, unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0; CM_RT_API virtual INT EnqueueWithHints(CmTask* pTask, CmEvent* & pEvent, UINT hints = 0) = 0; CM_RT_API virtual INT EnqueueVebox(CmVebox* pVebox, CmEvent* & pEvent) = 0; }; class CmDevice; typedef void(*IMG_WALKER_FUNTYPE)(void* img, void* arg); EXTERN_C CM_RT_API INT CMRT_GetSurfaceDetails(CmEvent* pEvent, UINT kernIndex, UINT surfBTI, CM_SURFACE_DETAILS& outDetails); EXTERN_C CM_RT_API void CMRT_PrepareGTPinBuffers(void* ptr0, int size0InBytes, void* ptr1, int size1InBytes, void* ptr2, int size2InBytes); EXTERN_C CM_RT_API void CMRT_SetGTPinArguments(char* commandLine, void* gtpinInvokeStruct); EXTERN_C CM_RT_API void CMRT_EnableGTPinMarkers(void); EXTERN_C CM_RT_API INT DestroyCmDevice(CmDevice* &pD); EXTERN_C CM_RT_API UINT CMRT_GetKernelCount(CmEvent *pEvent); EXTERN_C CM_RT_API INT CMRT_GetKernelName(CmEvent *pEvent, UINT index, char** KernelName); EXTERN_C CM_RT_API INT CMRT_GetKernelThreadSpace(CmEvent *pEvent, UINT index, UINT* localWidth, UINT* localHeight, UINT* globalWidth, UINT* globalHeight); EXTERN_C CM_RT_API INT CMRT_GetSubmitTime(CmEvent *pEvent, LARGE_INTEGER* time); EXTERN_C CM_RT_API INT CMRT_GetHWStartTime(CmEvent *pEvent, LARGE_INTEGER* time); EXTERN_C CM_RT_API INT CMRT_GetHWEndTime(CmEvent *pEvent, LARGE_INTEGER* time); EXTERN_C CM_RT_API INT CMRT_GetCompleteTime(CmEvent *pEvent, LARGE_INTEGER* time); EXTERN_C CM_RT_API INT CMRT_SetEventCallback(CmEvent* pEvent, callback_function function, void* user_data); EXTERN_C CM_RT_API INT CMRT_Enqueue(CmQueue* pQueue, CmTask* pTask, CmEvent** pEvent, const CmThreadSpace* pTS = NULL); EXTERN_C CM_RT_API INT CMRT_GetEnqueueTime(CmEvent *pEvent, LARGE_INTEGER* time); EXTERN_C CM_RT_API const char* GetCmErrorString(int Code); #if defined(CM_WIN) namespace CmDx9 { class CmDevice { public: CM_RT_API virtual INT GetD3DDeviceManager(IDirect3DDeviceManager9* & pDeviceManager) = 0; CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(IDirect3DSurface9* pD3DSurf, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(IDirect3DSurface9** pD3DSurf, const UINT surfaceCount, CmSurface2D** pSpurface) = 0; CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0; CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0; CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0; CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0; CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0; CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0; CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0; CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0; CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0; CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0; CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0; CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT SetL3Config(const L3ConfigRegisterValues *l3_c) = 0; CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0; CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0; CM_RT_API virtual INT FlushPrintBuffer() = 0; CM_RT_API virtual INT CreateVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT DestroyVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT CreateBufferSVM(UINT size, void* & pSystMem, uint32_t access_flag, CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferSVM(CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CloneKernel(CmKernel * &pKernelDest, CmKernel * pKernelSrc) = 0; CM_RT_API virtual INT CreateSurface2DAlias(CmSurface2D* p2DSurface, SurfaceIndex* &aliasSurfaceIndex) = 0; CM_RT_API virtual INT CreateHevcVmeSurfaceG10(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyHevcVmeSurfaceG10(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT FlushPrintBufferIntoFile(const char *filename) = 0; CM_RT_API virtual INT CreateThreadGroupSpaceEx(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT thrdSpaceDepth, UINT grpSpaceWidth, UINT grpSpaceHeight, UINT grpSpaceDepth, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT CreateSampler8x8SurfaceEx(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateSamplerSurface2DEx(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateBufferAlias(CmBuffer *pBuffer, SurfaceIndex* &pAliasIndex) = 0; CM_RT_API virtual INT SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex, CM_VME_SURFACE_STATE_PARAM *pSSParam) = 0; CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) = 0; CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0; //adding new functions in the bottom is a must }; } namespace CmDx11 { class CmDevice { public: CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(ID3D11Texture2D* pD3DSurf, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(ID3D11Texture2D** pD3DSurf, const UINT surfaceCount, CmSurface2D** pSpurface) = 0; CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0; CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0; CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0; CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0; CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0; CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0; CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0; CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0; CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0; CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0; CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0; CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT SetL3Config(const L3ConfigRegisterValues *l3_c) = 0; CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0; CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT GetD3D11Device(ID3D11Device* &pD3D11Device) = 0; CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0; CM_RT_API virtual INT FlushPrintBuffer() = 0; CM_RT_API virtual INT CreateSurface2DSubresource(ID3D11Texture2D* pD3D11Texture2D, UINT subresourceCount, CmSurface2D** ppSurfaces, UINT& createdSurfaceCount, UINT option = 0) = 0; CM_RT_API virtual INT CreateSurface2DbySubresourceIndex(ID3D11Texture2D* pD3D11Texture2D, UINT FirstArraySlice, UINT FirstMipSlice, CmSurface2D* &pSurface) = 0; CM_RT_API virtual INT CreateVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT DestroyVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT CreateBufferSVM(UINT size, void* & pSystMem, uint32_t access_flag, CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferSVM(CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CloneKernel(CmKernel * &pKernelDest, CmKernel * pKernelSrc) = 0; CM_RT_API virtual INT CreateSurface2DAlias(CmSurface2D* p2DSurface, SurfaceIndex* &aliasSurfaceIndex) = 0; CM_RT_API virtual INT CreateHevcVmeSurfaceG10(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyHevcVmeSurfaceG10(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT FlushPrintBufferIntoFile(const char *filename) = 0; CM_RT_API virtual INT CreateThreadGroupSpaceEx(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT thrdSpaceDepth, UINT grpSpaceWidth, UINT grpSpaceHeight, UINT grpSpaceDepth, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT CreateSampler8x8SurfaceEx(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateSamplerSurface2DEx(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateBufferAlias(CmBuffer *pBuffer, SurfaceIndex* &pAliasIndex) = 0; CM_RT_API virtual INT SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex, CM_VME_SURFACE_STATE_PARAM *pSSParam) = 0; CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) = 0; CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0; //adding new functions in the bottom is a must }; } #else #if defined(CM_LINUX) namespace CmLinux { class CmDevice { public: CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(VASurfaceID iVASurface, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(VASurfaceID* iVASurface, const UINT surfaceCount, CmSurface2D** pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0; CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0; CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0; CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0; CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0; CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0; CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0; CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0; CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0; CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0; CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0; CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT SetL3Config(const L3ConfigRegisterValues *l3_c) = 0; CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0; CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0; CM_RT_API virtual INT FlushPrintBuffer() = 0; CM_RT_API virtual INT CreateVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT DestroyVebox(CmVebox* & pVebox) = 0; //HSW CM_RT_API virtual INT GetVaDpy(VADisplay* & pva_dpy) = 0; CM_RT_API virtual INT CreateVaSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, VASurfaceID & iVASurface, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateBufferSVM(UINT size, void* & pSystMem, uint32_t access_flag, CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferSVM(CmBufferSVM* & pSurface) = 0; CM_RT_API virtual INT CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CloneKernel(CmKernel * &pKernelDest, CmKernel * pKernelSrc) = 0; CM_RT_API virtual INT CreateSurface2DAlias(CmSurface2D* p2DSurface, SurfaceIndex* &aliasSurfaceIndex) = 0; CM_RT_API virtual INT CreateHevcVmeSurfaceG10(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyHevcVmeSurfaceG10(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT FlushPrintBufferIntoFile(const char *filename) = 0; CM_RT_API virtual INT CreateThreadGroupSpaceEx(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT thrdSpaceDepth, UINT grpSpaceWidth, UINT grpSpaceHeight, UINT grpSpaceDepth, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT CreateSampler8x8SurfaceEx(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateSamplerSurface2DEx(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex, CM_FLAG* pFlag = NULL) = 0; CM_RT_API virtual INT CreateBufferAlias(CmBuffer *pBuffer, SurfaceIndex* &pAliasIndex) = 0; CM_RT_API virtual INT SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex, CM_VME_SURFACE_STATE_PARAM *pSSParam) = 0; CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) = 0; CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0; //adding new functions in the bottom is a must }; } #endif #endif typedef void * AbstractSurfaceHandle; typedef void * AbstractDeviceHandle; typedef L3ConfigRegisterValues L3_CONFIG_REGISTER_VALUES; class CmDevice { public: CM_RT_API virtual INT GetDevice(AbstractDeviceHandle & pDevice) = 0; CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(mfxHDLPair D3DSurfPair, CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT CreateSurface2D(AbstractSurfaceHandle pD3DSurf, CmSurface2D* & pSurface) = 0; //CM_RT_API virtual INT CreateSurface2D( AbstractSurfaceHandle * pD3DSurf, const UINT surfaceCount, CmSurface2D** pSpurface ) = 0; CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0; CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0; CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0; CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0; CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0; CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0; CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0; CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0; CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0; CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0; CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0; CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0; CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0; CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0; CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0; CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0; CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0; CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0; CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0; CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0; CM_RT_API virtual INT SetL3Config(const L3_CONFIG_REGISTER_VALUES *l3_c) = 0; CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0; CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0; CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0; CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0; CM_RT_API virtual INT FlushPrintBuffer() = 0; CM_RT_API virtual INT CreateSurface2DSubresource(AbstractSurfaceHandle pD3D11Texture2D, UINT subresourceCount, CmSurface2D** ppSurfaces, UINT& createdSurfaceCount, UINT option = 0) = 0; CM_RT_API virtual INT CreateSurface2DbySubresourceIndex(AbstractSurfaceHandle pD3D11Texture2D, UINT FirstArraySlice, UINT FirstMipSlice, CmSurface2D* &pSurface) = 0; CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0; }; #if defined(CM_WIN) INT CreateCmDevice(CmDevice* &pD, UINT& version, IDirect3DDeviceManager9 * pD3DDeviceMgr = NULL, UINT mode = CM_DEVICE_CREATE_OPTION_DEFAULT); INT CreateCmDevice(CmDevice* &pD, UINT& version, ID3D11Device * pD3D11Device = NULL, UINT mode = CM_DEVICE_CREATE_OPTION_DEFAULT); INT CreateCmDeviceEmu(CmDevice* &pDevice, UINT& version, IDirect3DDeviceManager9 * pD3DDeviceMgr = NULL); INT CreateCmDeviceEmu(CmDevice* &pDevice, UINT& version, ID3D11Device * pD3D11Device = NULL); INT CreateCmDeviceSim(CmDevice* &pDevice, UINT& version, IDirect3DDeviceManager9 * pD3DDeviceMgr = NULL); INT CreateCmDeviceSim(CmDevice* &pDevice, UINT& version, ID3D11Device * pD3D11Device = NULL); #else //#if defined(CM_WIN) INT CreateCmDevice(CmDevice* &pD, UINT& version, VADisplay va_dpy = NULL, UINT mode = CM_DEVICE_CREATE_OPTION_DEFAULT); INT CreateCmDeviceEmu(CmDevice* &pDevice, UINT& version, VADisplay va_dpy = NULL); INT CreateCmDeviceSim(CmDevice* &pDevice, UINT& version); #endif //#if defined(CM_WIN) INT DestroyCmDevice(CmDevice* &pDevice); INT DestroyCmDeviceEmu(CmDevice* &pDevice); INT DestroyCmDeviceSim(CmDevice* &pDevice); int ReadProgram(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len); int ReadProgramJit(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len); int CreateKernel(CmDevice * device, CmProgram * program, const char * kernelName, const void * fncPnt, CmKernel *& kernel, const char * options = NULL); #ifdef _MSVC_LANG #pragma warning(pop) #endif #if !defined(CM_WIN) #undef LONG #undef ULONG #endif #if defined(__INTEL_COMPILER) #pragma warning(pop) #endif #if defined(__clang__) #pragma clang diagnostic pop #else #if defined(__GNUC__) #pragma GCC diagnostic pop #endif #endif #endif // __CMRT_CROSS_PLATFORM_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include/cmrt_utility.h000066400000000000000000000025231443134507600335650ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CMRT_UTILITY_H__ #define __CMRT_UTILITY_H__ #include "mfx_common.h" void* so_load(const vm_char* so_file_name); void* so_get_addr(void* so_handle, const char* so_func_name); void so_free(void* so_handle); #endif /*__CMRT_UTILITY_H__*/oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include/cmrt_vpp.h000066400000000000000000000047661443134507600327020ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfxdefs.h" #ifdef MFX_ENABLE_KERNELS #include "cmrt_cross_platform.h" #include "genx_fcopy_gen12lp_isa.h" inline mfxStatus InitVppCm(CmDevice* &cmDevice, CmProgram* &cmProgram, CmKernel* &cmKernel, CmQueue* &cmQueue, VideoCORE* &core) { if(cmDevice) { int res = CM_FAILURE; if (nullptr == cmProgram) { eMFXHWType m_platform = core->GetHWType(); switch (m_platform) { case MFX_HW_TGL_LP: case MFX_HW_DG1: case MFX_HW_RKL: case MFX_HW_ADL_S: case MFX_HW_ADL_P: case MFX_HW_ADL_N: res = cmDevice->LoadProgram((void*)genx_fcopy_gen12lp,sizeof(genx_fcopy_gen12lp),cmProgram,"nojitter"); break; default: res = CM_FAILURE; break; } MFX_CHECK(res == CM_SUCCESS, MFX_ERR_DEVICE_FAILED); } if (NULL == cmKernel) { // MbCopyFieLd copies TOP or BOTTOM field from inSurf to OutSurf res = cmDevice->CreateKernel(cmProgram, CM_KERNEL_FUNCTION(MbCopyFieLd), cmKernel); MFX_CHECK(res == CM_SUCCESS, MFX_ERR_DEVICE_FAILED); } if (NULL == cmQueue) { res = cmDevice->CreateQueue(cmQueue); MFX_CHECK(res == CM_SUCCESS, MFX_ERR_DEVICE_FAILED); } } return MFX_ERR_NONE; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/include/cmvm.h000066400000000000000000001233711443134507600320040ustar00rootroot00000000000000// Copyright (c) 2017-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CM_VM_H__ #define __CM_VM_H__ #include #include #include #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnon-virtual-dtor" #else #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #endif #endif typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned char uchar; template class matrix; template class matrix_ref; template class vector; template class vector_ref; template struct cmtype; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; template <> struct cmtype { static const bool value = true; }; #define SIMDCF_WRAPPER(X, SZ, i) X #define SIMDCF_ELEMENT_SKIP(i) #define OFFSET uint namespace cm { template struct pointer_traits { enum { dim = 0 }; typedef ty tail_pointee_type; }; template struct pointer_traits { enum { dim = pointer_traits::dim + 1 }; typedef typename pointer_traits::tail_pointee_type tail_pointee_type; }; template struct pointer_traits { enum { dim = pointer_traits::dim + 1 }; typedef typename pointer_traits::tail_pointee_type tail_pointee_type; }; #ifdef CM_EMU template class array_1d { public: typedef dataTy(*datasTy)[size]; public: array_1d() : datas_(NULL), size_(size) { } array_1d(void * datas) : datas_((datasTy)datas), size_(size) { } public: datasTy datas_; unsigned int size_; }; template class array_2d { public: typedef dataTy(*datasTy)[cols]; public: array_2d(void * datas) : rows_(rows), cols_(cols) { for (unsigned int row = 0; row < rows_; ++row) { array_1ds_[row].datas_ = (datasTy)datas + row; } } public: array_1d array_1ds_[rows]; unsigned int rows_; unsigned int cols_; }; #endif }; template struct is_inttype { static const bool value = false; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; template <> struct is_inttype { static const bool value = true; }; #define SAT 1 namespace CmEmulSys { template struct satur { template static RT saturate(const T val, const int flags) { if ((flags & SAT) == 0) { return (RT)val; } #ifdef max #undef max #undef min #endif const RT t_max = std::numeric_limits::max(); const RT t_min = std::numeric_limits::min(); if (val > t_max) { return t_max; } else if ((val >= 0) && (t_min < 0)) { // RT is "signed" if t_min < 0 // when comparing a signed and a unsigned variable, the signed one cast to unsigned first. return (RT)val; } else if (val < t_min) { return t_min; } else { return (RT)val; } } }; template<> struct satur { template static float saturate(const T val, const int flags) { if ((flags & SAT) == 0) { return (float)val; } if (val < 0.) { return 0; } else if (val > 1.) { return 1.; } else { return (float)val; } } }; template<> struct satur { template static double saturate(const T val, const int flags) { if ((flags & SAT) == 0) { return (double)val; } if (val < 0.) { return 0; } else if (val > 1.) { return 1.; } else { return (double)val; } } }; template struct _SetSatur { static uint SetSatur() { return 0; } }; template <> struct _SetSatur { static uint SetSatur() { return SAT; } }; template <> struct _SetSatur { static uint SetSatur() { return SAT; } }; } /* ::CmEmulSys */ /* Basic stream. Non template class. */ class basic_stream { public: virtual int extract_data(void *buf, uint size = 0xffffffff) = 0; virtual void* get_addr(uint i) = 0; virtual void* get_addr_data() = 0; virtual void* get_addr_obj() = 0; virtual uint get_size_of_element() const = 0; virtual uint get_number_of_elements() const = 0; virtual uint get_size_data() const = 0; virtual uint get_size_object() const = 0; }; // stream template class stream : public basic_stream { static_assert(cmtype::value, "invalid type"); public: typedef T _Type; CM_INLINE int n_elems() const { return SZ; } virtual T get(uint i) const = 0; virtual T& getref(uint i) = 0; virtual void* get_addr(uint i) = 0; virtual void* get_addr_data() = 0; virtual void* get_addr_obj() = 0; int extract_data(void *buf, uint size = 0xffffffff); virtual uint get_size_of_element() const { return sizeof(T); }; virtual uint get_number_of_elements() const { return SZ; }; virtual uint get_size_data() const = 0; virtual uint get_size_object() const = 0; /* merge */ CM_NOINLINE void merge(const T x, const uint c); template void CM_NOINLINE merge(const stream &x, const uint c); template CM_NOINLINE void merge(const stream &x, const stream &c); template CM_NOINLINE void merge(const T x, const stream &c); template CM_NOINLINE void merge(const stream& x, const stream& y, const uint c); template CM_NOINLINE void merge(const T x, const stream& y, const uint c); template CM_NOINLINE void merge(const stream& x, const T y, const uint c); CM_NOINLINE void merge(const T x, const T y, const uint c); template CM_NOINLINE void merge(const stream& x, const stream& y, const stream& c); template CM_NOINLINE void merge(const T x, const stream& y, const stream& c); template CM_NOINLINE void merge(const stream& x, const T y, const stream& c); template CM_NOINLINE void merge(const T x, const T y, const stream& c); // any,all CM_NOINLINE ushort any(void) const; CM_NOINLINE ushort all(void) const; }; // matrix template class matrix : public stream { template friend class matrix_ref; template friend class vector_ref; public: template friend class matrix; template friend class vector; enum { SZ = R*C }; enum { ROWS = R, COLS = C, ELEMS = R*C }; CM_INLINE int n_rows() const { return R; } CM_INLINE int n_cols() const { return C; } template CM_INLINE const vector replicate(OFFSET ioff = 0, OFFSET joff = 0) { return genx_select(ioff, joff); }; template CM_INLINE const vector replicate(OFFSET ioff = 0, OFFSET joff = 0) { return genx_select(ioff, joff); }; template CM_INLINE const vector replicate(OFFSET ioff = 0, OFFSET joff = 0) { return genx_select(ioff, joff); }; template CM_INLINE const vector replicate(OFFSET ioff = 0, OFFSET joff = 0) { return genx_select(ioff, joff); }; virtual T get(uint i) const { return data[i]; } virtual T& getref(uint i) { return data[i]; } virtual void* get_addr(uint i) { return &data[i]; } virtual void* get_addr_data() { #ifdef CMRT_EMU return this; #else return &data[0]; #endif } virtual void* get_addr_obj() { return this; } virtual uint get_size_data() const { #ifdef CMRT_EMU return sizeof(*this); #else return sizeof(data); #endif } virtual uint get_size_object() const { return sizeof(*this); } CM_NOINLINE T operator () (OFFSET i, OFFSET j) const { assert(i < R && j < C); return get(i*C + j); } CM_NOINLINE T& operator () (OFFSET i, OFFSET j) { assert(i < R && j < C); return data[i*C + j]; } template class inner_hack { matrix* m_t; OFFSET _i; public: inner_hack(matrix* m, OFFSET i) :m_t(m) { _i = i; } CM_NOINLINE const T1 operator[](OFFSET j) const { return (*m_t)(_i, j); } CM_NOINLINE T1& operator[](OFFSET j) { return (*m_t)(_i, j); } }; CM_NOINLINE inner_hack operator [] (OFFSET i) const { return inner_hack(this, i); } CM_NOINLINE inner_hack operator [] (OFFSET i) { return inner_hack(this, i); } CM_NOINLINE matrix(); template CM_NOINLINE matrix(const T2 initArray[]); CM_NOINLINE matrix(const matrix& src); template CM_NOINLINE matrix(const T2& src); template CM_NOINLINE matrix(const matrix& src, const uint sat = 0); template CM_NOINLINE matrix(const matrix_ref& src, const uint sat = 0); template CM_NOINLINE matrix(const vector& src) #ifdef CM_EMU : array_2d_(data) #endif { new (this) matrix((matrix&)src); } template CM_NOINLINE matrix(const vector_ref& src) #ifdef CM_EMU : array_2d_(data) #endif { new (this) matrix((matrix_ref&)src); } //operator = CM_NOINLINE matrix& operator = (const matrix& src); template CM_NOINLINE matrix& operator = (const T2 src); template CM_NOINLINE matrix& operator = (const matrix& src); template CM_NOINLINE matrix& operator = (const matrix_ref& src); template CM_NOINLINE matrix& operator = (const vector& src) { return this->operator=((const matrix&)src); }; template CM_NOINLINE matrix& operator = (const vector_ref& src) { return this->operator=((const matrix_ref&)src); }; //selects template CM_NOINLINE vector_ref format(); template CM_NOINLINE matrix_ref format(); template CM_NOINLINE const vector_ref format() const; template CM_NOINLINE const matrix_ref format() const; vector_ref CM_NOINLINE row(OFFSET i); matrix_ref CM_NOINLINE column(OFFSET i); template CM_NOINLINE matrix_ref select(OFFSET ioff = 0, OFFSET joff = 0); template CM_NOINLINE const matrix_ref select(OFFSET ioff = 0, OFFSET joff = 0) const; //1D iselect template CM_NOINLINE vector iselect(const vector& index); template CM_NOINLINE vector iselect(const vector_ref& index); #if _MSC_VER >= 1700 template CM_NOINLINE vector iselect(const vector& index, std::true_type); template CM_NOINLINE vector iselect(const vector& index, std::false_type); template CM_NOINLINE vector iselect(const vector_ref& index, std::true_type); template CM_NOINLINE vector iselect(const vector_ref& index, std::false_type); #endif //2D iselect template CM_NOINLINE vector iselect(const vector& index_x, const vector& index_y); template CM_NOINLINE vector iselect(const vector& index_x, const vector_ref& index_y); template CM_NOINLINE vector iselect(const vector_ref& index_x, const vector& index_y); template CM_NOINLINE vector iselect(const vector_ref& index_x, const vector_ref& index_y); //end of iselect template CM_NOINLINE const vector genx_select(OFFSET ioff = 0, OFFSET joff = 0); matrix_ref CM_NOINLINE select_all(); const matrix_ref CM_NOINLINE select_all() const; // operators +=, -=, ... #define declare_operation(OP) \ template CM_NOINLINE matrix& operator OP (const T2 x);\ template CM_NOINLINE matrix& operator OP (const matrix& x);\ template CM_NOINLINE matrix& operator OP (const matrix_ref& x);\ template CM_NOINLINE matrix& operator OP (const vector& x);\ template CM_NOINLINE matrix& operator OP (const vector_ref& x);\ declare_operation(+= ) // += declare_operation(-= ) // -= declare_operation(*= ) // *= declare_operation(/= ) // /= declare_operation(%= ) // %= declare_operation(&= ) // &= declare_operation(|= ) // |= declare_operation(^= ) // ^= declare_operation(>>= ) // >>= declare_operation(<<= ) // <<= #undef declare_operation // for debug uint id() const { return number; } #ifdef CM_DEBUG virtual std::string type_name() const { std::stringstream ss; ss << "M<" << typeid(T).name() << "," << R << "," << C << ">"; return ss.str(); } virtual std::string obj_name() const { std::stringstream ss; ss << typeid(T).name() << "[" << /*id()*/SZ << "]"; return ss.str(); } #endif /* CM_DEBUG */ private: T data[SZ]; #ifdef CM_EMU cm::array_2d array_2d_; #endif CM_NOINLINE T operator () (uint i) const { assert(i < SZ); return get(i); } CM_NOINLINE T& operator () (uint i) { assert(i < SZ); return data[i]; } uint number; }; //matrix // vector template class vector : public matrix { void assign(const stream &src); template friend class matrix_ref; template friend class vector_ref; public: template friend class matrix; template friend class stream; template CM_INLINE vector replicate(OFFSET joff = 0) { return ((matrix *)this)->template replicate(0, joff); }; template CM_INLINE vector replicate(OFFSET joff = 0) { return ((matrix *)this)->template replicate(0, joff); }; template CM_INLINE vector replicate(OFFSET joff = 0) { return ((matrix *)this)->template replicate(0, joff); }; template CM_INLINE vector replicate(OFFSET joff = 0) { return ((matrix *)this)->template replicate(0, joff); }; CM_NOINLINE vector() : ::matrix() {} template CM_NOINLINE vector(const T2 initArray[]) : ::matrix(initArray) { static_assert(!std::is_floating_point::value, "floating point array initialization values are not supported"); } CM_NOINLINE vector(const vector& src) : ::matrix((const matrix&)src) {} template CM_NOINLINE vector(const T2& src) : ::matrix(src) {} template CM_NOINLINE vector(const matrix& src, uint sat = 0) : ::matrix(src, sat) {} template CM_NOINLINE vector(const matrix_ref& src, uint sat = 0) : ::matrix(src, sat) {} template CM_NOINLINE vector(const vector& src) : ::matrix(src) {} template CM_NOINLINE vector(const vector_ref& src) : ::matrix(src) {} CM_NOINLINE T operator () (OFFSET i) const { assert(i < SZ); return matrix::get(i); } CM_NOINLINE T& operator () (OFFSET i) { assert(i < SZ); return matrix::data[i]; } CM_NOINLINE T operator [] (OFFSET i) const { assert(i < SZ); return matrix::get(i); } CM_NOINLINE T& operator [] (OFFSET i) { assert(i < SZ); return matrix::data[i]; } template CM_NOINLINE vector operator () (const vector& index) { return matrix::template iselect(index); } template CM_NOINLINE vector operator () (const vector_ref& index) { return matrix::template iselect(index); } template CM_NOINLINE vector operator [] (const vector& index) { return matrix::template iselect(index); } template CM_NOINLINE vector operator [] (const vector_ref& index) { return matrix::template iselect(index); } //1D iselect only template CM_NOINLINE vector iselect(const vector& index) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); return matrix::template iselect(index); } template CM_NOINLINE vector iselect(const vector_ref& index) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); return matrix::template iselect(index); } //end of iselect //operator =: call base versions of operator = CM_NOINLINE vector& operator = (const vector& src) { ((matrix*)this)->operator=(src); return *this; } // assignment operator template CM_NOINLINE vector& operator = (const T2 src) { ((matrix*)this)->operator=(src); return *this; } template CM_NOINLINE vector& operator = (const matrix& src) { ((matrix*)this)->operator=(src); return *this; } template CM_NOINLINE vector& operator = (const matrix_ref& src) { ((matrix*)this)->operator=(src); return *this; } template CM_NOINLINE vector& operator = (const vector& src) { ((matrix*)this)->operator=(src); return *this; } template CM_NOINLINE vector& operator = (const vector_ref& src) { ((matrix*)this)->operator=(src); return *this; } //vector select template CM_NOINLINE const vector_ref select(OFFSET joff = 0) const { static_assert(((SZ) >= (C)), "select size is greater than source vector size"); static_assert(((SZ) >= ((C - 1)*(CS)) + 1) || (CS == 1), "select range exceeds source vector bounds"); return ((matrix*)this)->template select<1, 1, C, CS>(0, joff); } template CM_NOINLINE vector_ref select(OFFSET joff = 0) { static_assert(((SZ) >= (C)), "select size is greater than source vector size"); static_assert(((SZ) >= ((C - 1)*(CS)) + 1) || (CS == 1), "select range exceeds source vector bounds"); return ((matrix*)this)->template select<1, 1, C, CS>(0, joff); } //vector genx_select template CM_NOINLINE const vector genx_select(OFFSET joff = 0) { static_assert((!std::is_same::value), "genx_select is not supported for vectors with element type 'double'"); static_assert(((SZ) >= (WD)), "genx_select width is greater than source vector size"); return ((matrix*)this)->template genx_select(0, joff); } }; //vector /* STREAM */ template int stream::extract_data(void *buf, uint size) { uint i; assert(SZ * sizeof(T) <= size); (void)size; for (i = 0; i< SZ; i++) { ((T*)buf)[i] = get(i); } return SZ * sizeof(T); } /* * merge */ template void stream::merge(const T x, const uint c) { T* p; for (uint i = 0; i> i) & 1) != 0) { p = (T*)this->get_addr(i); *p = x; } } } template template void stream::merge(const stream &x, const uint c) { vector in_x; in_x.assign(x); T* p; for (uint i = 0; i> i) & 1) != 0) { p = (T*)this->get_addr(i); *p = in_x.get(i); } } } template template void stream::merge(const stream &x, const stream &c) { vector in_x; in_x.assign(x); vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); *p = (T)in_x.get(i); } } } template template void stream::merge(const T x, const stream &c) { vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); *p = x; } } } template template void stream::merge(const stream& x, const stream& y, const uint c) { vector in_x; in_x.assign(x); vector in_y; in_y.assign(y); T* p; for (uint i = 0; iget_addr(i); if (((c >> i) & 1) != 0) { *p = in_x.get(i); } else { *p = in_y.get(i); } } } template template void stream::merge(const T x, const stream& y, const uint c) { vector in_y; in_y.assign(y); T* p; for (uint i = 0; iget_addr(i); if (((c >> i) & 1) != 0) { *p = x; } else { *p = in_y.get(i); } } } template template void stream::merge(const stream& x, const T y, const uint c) { vector in_x; in_x.assign(x); T* p; for (uint i = 0; iget_addr(i); if (((c >> i) & 1) != 0) { *p = in_x.get(i); } else { *p = y; } } } template void stream::merge(const T x, const T y, const uint c) { T* p; for (uint i = 0; iget_addr(i); if (((c >> i) & 1) != 0) { *p = x; } else { *p = y; } } } template template void stream::merge(const stream& x, const stream& y, const stream& c) { vector in_x; in_x.assign(x); vector in_y; in_y.assign(y); vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); if ((in_c.get(i) & 1) != 0) { *p = in_x.get(i); } else { *p = in_y.get(i); } } } template template void stream::merge(const T x, const stream& y, const stream& c) { vector in_y; in_y.assign(y); vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); if ((in_c.get(i) & 1) != 0) { *p = x; } else { *p = in_y.get(i); } } } template template void stream::merge(const stream& x, const T y, const stream& c) { vector in_x; in_x.assign(x); vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); if ((in_c.get(i) & 1) != 0) { *p = in_x.get(i); } else { *p = y; } } } template template void stream::merge(const T x, const T y, const stream& c) { vector in_c; in_c.assign(c); T* p; for (uint i = 0; iget_addr(i); if ((in_c.get(i) & 1) != 0) { *p = x; } else { *p = y; } } } /* MATRIX */ template template matrix::matrix(const T2 initArray[]) #ifdef CM_EMU : array_2d_(data) #endif { static_assert(!std::is_floating_point::value, "floating point array initialization values are not supported"); typedef typename cm::pointer_traits::tail_pointee_type tail_pointee_type; for (int i = 0; i < SZ; i++) { SIMDCF_WRAPPER(data[i] = (T)((tail_pointee_type *)initArray)[i], SZ, i); } } template matrix::matrix() : #ifdef CM_EMU array_2d_(data), #endif number(0) { } //copy constructor template matrix::matrix(const matrix& src) #ifdef CM_EMU : array_2d_(data) #endif { (*this) = src; } template template matrix::matrix(const T2& src) #ifdef CM_EMU : array_2d_(data) #endif { (*this) = src; } template template matrix::matrix(const matrix& src, const uint sat) #ifdef CM_EMU : array_2d_(data) #endif { static_assert(R*C == R2*C2, "matrices have different dimensions"); uint sat1 = 0; vector in_src; in_src.assign(src); for (uint i = 0; i < SZ; i++) { SIMDCF_WRAPPER((*this)(i) = CmEmulSys::satur::saturate(in_src(i), sat | sat1), SZ, i); } } template template matrix::matrix(const matrix_ref& src, const uint sat) #ifdef CM_EMU : array_2d_(data) #endif { static_assert(R*C == R2*C2, "matrices have different dimensions"); vector in_src; in_src.assign(src); for (uint i = 0; i < SZ; i++) { SIMDCF_WRAPPER((*this)(i) = CmEmulSys::satur::saturate(in_src(i), sat), SZ, i); } } // // matrix operator = // template matrix& matrix::operator = (const matrix& src) { vector in_src; in_src.assign(src); for (uint i = 0; igetref(i) = in_src(i), SZ, i); } return *this; } template template matrix& matrix::operator = (const T2 src) { uint sat1 = 0; for (uint i = 0; i < SZ; i++) { SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate(src, sat1), SZ, i); } return *this; } template template matrix& matrix::operator = (const matrix& src) { static_assert(R*C == R2*C2, "matrices have different dimensions"); uint sat1 = 0; vector in_src; in_src.assign(src); for (uint i = 0; i < SZ; i++) { SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate(in_src(i), sat1), SZ, i); } return *this; } template template matrix& matrix::operator = (const matrix_ref& src) { static_assert(R*C == R2*C2, "matrices have different dimensions"); uint sat1 = 0; vector in_src; in_src.assign(src); for (uint i = 0; i < SZ; i++) { SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate(in_src(i), sat1), SZ, i); } return *this; } #define matrix_operation(OP) \ \ template \ template \ matrix& matrix::operator OP##= (const T2 x) \ { \ static_assert(cmtype::value, "invalid type"); \ uint sat1 = 0; \ for (uint i=0; i < SZ; i++) { \ SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate((*this).get(i) OP x, sat1), SZ, i); \ } \ return *this; \ } \ template \ template \ matrix& matrix::operator OP##= (const matrix& x) \ { \ static_assert(R*C == R2*C2, "matrices have different dimensions"); \ uint sat1 = 0; \ vector in_x; in_x.assign(x); \ for (uint i=0; i < SZ; i++) { \ SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate((*this).get(i) OP in_x(i), sat1), SZ, i);\ } \ return *this; \ } \ template \ template \ matrix& matrix::operator OP##= (const matrix_ref& x) \ { \ static_assert(R*C == R2*C2, "matrices have different dimensions"); \ uint sat1 = 0; \ vector in_x; in_x.assign(x); \ for (uint i=0; i < SZ; i++) { \ SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate((*this).get(i) OP in_x(i), sat1), SZ, i);\ } \ return *this; \ } \ template \ template \ matrix& matrix::operator OP##= (const vector& x) \ { \ uint sat1 = 0; \ vector in_x; in_x.assign(x); \ for (uint i=0; i < SZ; i++) { \ SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate((*this).get(i) OP in_x(i), sat1), SZ, i);\ } \ return *this; \ } \ template \ template \ matrix& matrix::operator OP##= (const vector_ref& x) \ { \ uint sat1 = 0; \ vector in_x; in_x.assign(x); \ for (uint i=0; i < SZ; i++) { \ SIMDCF_WRAPPER(this->getref(i) = CmEmulSys::satur::saturate((*this).get(i) OP in_x(i), sat1), SZ, i);\ } \ return *this; \ } \ matrix_operation(+) // += matrix_operation(-) // -= matrix_operation(*) // *= matrix_operation(/ ) // /= matrix_operation(%) // %= matrix_operation(&) // &= matrix_operation(| ) // |= matrix_operation(^) // ^= matrix_operation(>> ) // >>= matrix_operation(<< ) // <<= #undef matrix_operation /* VECTOR */ template template const vector matrix::genx_select(OFFSET ioff, OFFSET joff) { static_assert((!std::is_same::value), "genx_select is not supported for matrices with element type of 'double'"); static_assert(R2 > 0, "invalid dimensions"); static_assert(WD > 0, "invalid dimensions"); assert(ioff < R); assert(joff < C); vector ret(id()); for (uint i = 0; i < R2*WD; i++) { SIMDCF_WRAPPER(ret(i) = data[C*ioff + joff + (i / WD)*VS + (i%WD)*HS], R2*WD, i); } return ret; } //1D iselect for matrix #if _MSC_VER >= 1700 template template vector matrix::iselect(const vector& index) { return iselect(index, std::is_integral()); } template template vector matrix::iselect(const vector& index, std::true_type) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector& index, std::false_type) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[0], WD, i); } return ret; } template template vector matrix::iselect(const vector_ref& index) { return iselect(index, std::is_integral()); } template template vector matrix::iselect(const vector_ref& index, std::true_type) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector_ref& index, std::false_type) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[0], WD, i); } return ret; } #else template template vector matrix::iselect(const vector& index) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector_ref& index) { static_assert(is_inttype::value, "invalid type"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index.get(i) < SZ), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index.get(i)], WD, i); } return ret; } #endif //below are 2D iselect for matrix template template vector matrix::iselect(const vector& index_x, const vector& index_y) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index_x.get(i) < R), WD, i); SIMDCF_WRAPPER(assert(index_y.get(i) < C), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index_x.get(i)*C + index_y.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector_ref& index_x, const vector& index_y) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index_x.get(i) < R), WD, i); SIMDCF_WRAPPER(assert(index_y.get(i) < C), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index_x.get(i)*C + index_y.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector& index_x, const vector_ref& index_y) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index_x.get(i) < R), WD, i); SIMDCF_WRAPPER(assert(index_y.get(i) < C), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index_x.get(i)*C + index_y.get(i)], WD, i); } return ret; } template template vector matrix::iselect(const vector_ref& index_x, const vector_ref& index_y) { static_assert((std::is_unsigned::value), "iselect index vector element type must be unsigned"); static_assert(WD > 0, "invalid dimensions"); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(assert(index_x.get(i) < R), WD, i); SIMDCF_WRAPPER(assert(index_y.get(i) < C), WD, i); } vector ret(id()); for (uint i = 0; i < WD; i++) { SIMDCF_WRAPPER(ret(i) = data[index_x.get(i)*C + index_y.get(i)], WD, i); } return ret; } // end of iselect for 2D matrix #if defined(__clang__) #pragma clang diagnostic pop #else #if defined(__GNUC__) #pragma GCC diagnostic pop #endif #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/src/000077500000000000000000000000001443134507600300265ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/src/cm_mem_copy.cpp000066400000000000000000003473141443134507600330350ustar00rootroot00000000000000// Copyright (c) 2017-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "cm_mem_copy.h" #include "cm_gpu_copy_code.h" #include "mfx_common_int.h" #include "mfx_platform_caps.h" typedef const mfxU8 mfxUC8; #define ALIGN128(X) (((mfxU32)((X)+127)) & (~ (mfxU32)127)) #define CHECK_CM_STATUS(_sts, _ret) \ if (CM_SUCCESS != _sts) \ { \ MFX_RETURN(_ret); \ } #define CHECK_CM_STATUS_RET_NULL(_sts) \ if (CM_SUCCESS != MFX_STS_TRACE(_sts)) \ { \ return NULL; \ } #define CHECK_CM_NULL_PTR(_ptr, _ret) \ if (NULL == _ptr) \ { \ MFX_RETURN(_ret); \ } CmCopyWrapper::~CmCopyWrapper() { Close(); } #define ADDRESS_PAGE_ALIGNMENT_MASK_X64 0xFFFFFFFFFFFFF000ULL #define ADDRESS_PAGE_ALIGNMENT_MASK_X86 0xFFFFF000 #define INNER_LOOP (4) #define CHECK_CM_HR(HR) \ if(HR != CM_SUCCESS)\ {\ if(pTS) m_pCmDevice->DestroyThreadSpace(pTS);\ if(pGPUCopyTask) m_pCmDevice->DestroyTask(pGPUCopyTask);\ if(pInternalEvent)m_pCmQueue->DestroyEvent(pInternalEvent);\ MFX_RETURN(MFX_ERR_DEVICE_FAILED);\ } bool CmCopyWrapper::isSinglePlainFormat(mfxU32 format) { switch (format) { case MFX_FOURCC_NV12: case MFX_FOURCC_P010: case MFX_FOURCC_YV12: case MFX_FOURCC_NV16: case MFX_FOURCC_P210: case MFX_FOURCC_P016: return false; case MFX_FOURCC_BGR4: case MFX_FOURCC_RGB4: case MFX_FOURCC_P8: case MFX_FOURCC_A2RGB10: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: case MFX_FOURCC_R16: case MFX_FOURCC_AYUV: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_UYVY: case MFX_FOURCC_YUY2: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif return true; } return false; } bool CmCopyWrapper::isNV12LikeFormat(mfxU32 format) { switch (format) { case MFX_FOURCC_NV12: case MFX_FOURCC_P010: case MFX_FOURCC_P016: return true; } return false; } int CmCopyWrapper::getSizePerPixel(mfxU32 format) { switch (format) { case MFX_FOURCC_P8: return 1; case MFX_FOURCC_R16: case MFX_FOURCC_UYVY: case MFX_FOURCC_YUY2: return 2; case MFX_FOURCC_BGR4: case MFX_FOURCC_RGB4: case MFX_FOURCC_A2RGB10: case MFX_FOURCC_AYUV: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_Y410: case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: return 4; case MFX_FOURCC_Y416: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: return 8; } return 0; } bool CmCopyWrapper::isNeedSwapping(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { return (pDst->Info.FourCC == MFX_FOURCC_BGR4 && pSrc->Info.FourCC == MFX_FOURCC_RGB4) || (pDst->Info.FourCC == MFX_FOURCC_RGB4 && pSrc->Info.FourCC == MFX_FOURCC_BGR4) || (pDst->Info.FourCC == MFX_FOURCC_ABGR16 && pSrc->Info.FourCC == MFX_FOURCC_ARGB16) || (pDst->Info.FourCC == MFX_FOURCC_ARGB16 && pSrc->Info.FourCC == MFX_FOURCC_ABGR16); } bool CmCopyWrapper::isNeedShift(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { bool shift = pDst->Info.Shift != pSrc->Info.Shift && pDst->Info.FourCC == pSrc->Info.FourCC; //no support for shift in single plane formats currently. switch (pDst->Info.FourCC) { case MFX_FOURCC_P010: case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: case MFX_FOURCC_P016: case MFX_FOURCC_Y416: return shift; } return false; } CmBufferUPWrapper* CmCopyWrapper::CreateUpBuffer(mfxU8 *pDst, mfxU32 memSize, mfxU32 width, mfxU32 height) { std::lock_guard guard(m_mutex); constexpr size_t CM_MAX_UPBUFFER_TABLE_SIZE = 256; auto it = m_tableSysRelations.find(std::tie(pDst, width, height)); if (m_tableSysRelations.end() != it) { // If caching is switched off, simply recreate each buffer if (it->second.IsFree() && !m_use_cm_buffers_cache) { CmBufferUP* pCmUserBuffer; cmStatus cmSts = m_pCmDevice->CreateBufferUP(memSize, pDst, pCmUserBuffer); CHECK_CM_STATUS_RET_NULL(cmSts); SurfaceIndex* pCmDstIndex; cmSts = pCmUserBuffer->GetIndex(pCmDstIndex); CHECK_CM_STATUS_RET_NULL(cmSts); CmBufferUPWrapper tmp_buf_to_destroy = std::move(it->second); it->second = CmBufferUPWrapper(pCmUserBuffer, pCmDstIndex, m_pCmDevice); } it->second.AddRef(); return &(it->second); } if (m_tableSysRelations.size() == CM_MAX_UPBUFFER_TABLE_SIZE) { // Delete a free buffer auto it_buffer_to_delete = std::find_if(std::begin(m_tableSysRelations), std::end(m_tableSysRelations), [](auto& map_node) { return map_node.second.IsFree(); }); if (it_buffer_to_delete == std::end(m_tableSysRelations)) { std::ignore = MFX_STS_TRACE(MFX_ERR_MEMORY_ALLOC); return nullptr; } m_tableSysRelations.erase(it_buffer_to_delete); } CmBufferUP *pCmUserBuffer; cmStatus cmSts = m_pCmDevice->CreateBufferUP(memSize, pDst, pCmUserBuffer); CHECK_CM_STATUS_RET_NULL(cmSts); SurfaceIndex* pCmDstIndex; cmSts = pCmUserBuffer->GetIndex(pCmDstIndex); CHECK_CM_STATUS_RET_NULL(cmSts); auto insert_pair = m_tableSysRelations.emplace(std::piecewise_construct, std::forward_as_tuple(pDst, width, height), std::forward_as_tuple(CmBufferUPWrapper(pCmUserBuffer, pCmDstIndex, m_pCmDevice))); insert_pair.first->second.AddRef(); return &(insert_pair.first->second); } // CmBufferUP * CmCopyWrapper::CreateUpBuffer(mfxU8 *pDst, mfxU32 memSize) class CmBufferUPWrapperScopedLock { public: CmBufferUPWrapperScopedLock() {} CmBufferUPWrapperScopedLock(CmBufferUPWrapper *buf) { buffers.push_back(buf); } ~CmBufferUPWrapperScopedLock() { for (auto buf : buffers) { if (buf) buf->Release(); } } void Add(CmBufferUPWrapper* buf) { buffers.push_back(buf); } private: std::vector buffers; }; mfxStatus CmCopyWrapper::EnqueueCopySwapRBGPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT sizePerPixel = (format==MFX_FOURCC_ARGB16||format==MFX_FOURCC_ABGR16)? 8: 4;//RGB now UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset)/(stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_readswap_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )slice_copy_height_row/BLOCK_HEIGHT/INNER_LOOP ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &threadHeight ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), &slice_copy_height_row ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 8, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 9, sizeof( UINT ), &start_x ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 10, sizeof( UINT ), &start_y ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if(totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyGPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; UINT sizePerPixel = getSizePerPixel(format); if (sizePerPixel == 0) return MFX_ERR_UNDEFINED_BEHAVIOR; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset)/(stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_read_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )slice_copy_height_row/BLOCK_HEIGHT/INNER_LOOP ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &threadHeight ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), &slice_copy_height_row ); CHECK_CM_HR(hr); /*hr = m_pCmKernel->SetKernelArg( 8, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr);*/ hr = m_pCmKernel->SetKernelArg( 8, sizeof( UINT ), &start_x ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 9, sizeof( UINT ), &start_y ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if(totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyShiftGPUtoCPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT, int bitshift, CmEvent* &) { INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; UINT sizePerPixel = getSizePerPixel(format); if (sizePerPixel == 0) return MFX_ERR_UNDEFINED_BEHAVIOR; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if (stride_in_bytes == 0) { stride_in_bytes = width_byte; } if (height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if (stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if ((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset) / (stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_read_shift_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex(pSurf2DIndexCM); CHECK_CM_HR(hr); threadWidth = (UINT)ceil((double)copy_width_byte / BLOCK_PIXEL_WIDTH / 4); threadHeight = (UINT)ceil((double)slice_copy_height_row / BLOCK_HEIGHT / INNER_LOOP); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount(threadNum); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace(threadWidth, threadHeight, pTS); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(1, sizeof(SurfaceIndex), pBufferIndexCM); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(0, sizeof(SurfaceIndex), pSurf2DIndexCM); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg(2, sizeof(UINT), &stride_in_dwords); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(3, sizeof(UINT), &height_stride_in_rows); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(4, sizeof(UINT), &AddedShiftLeftOffset); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(5, sizeof(UINT), &bitshift); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(6, sizeof(UINT), &threadHeight); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(7, sizeof(UINT), &width_dword); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(8, sizeof(UINT), &slice_copy_height_row); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(9, sizeof(UINT), &start_x); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(10, sizeof(UINT), &start_y); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue(pGPUCopyTask, pInternalEvent, pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if (totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if (hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopySwapRBCPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT sizePerPixel = (format==MFX_FOURCC_ARGB16||format==MFX_FOURCC_ABGR16)? 8: 4;//RGB now UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset)/(stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_writeswap_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )slice_copy_height_row/BLOCK_HEIGHT/INNER_LOOP ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pBufferIndexCM); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM); CHECK_CM_HR(hr); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &slice_copy_height_row ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &threadHeight ); CHECK_CM_HR(hr); //this only works for the kernel surfaceCopy_write_32x32 hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), &start_x ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 8, sizeof( UINT ), &start_y ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if(totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyCPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; UINT sizePerPixel = getSizePerPixel(format); if (sizePerPixel == 0) return MFX_ERR_UNDEFINED_BEHAVIOR; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset)/(stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_write_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )slice_copy_height_row/BLOCK_HEIGHT/INNER_LOOP ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pBufferIndexCM); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM); CHECK_CM_HR(hr); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &slice_copy_height_row ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &threadHeight ); CHECK_CM_HR(hr); //this only works for the kernel surfaceCopy_write_32x32 /*hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr);*/ hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &start_x ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), &start_y ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if(totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyShiftCPUtoGPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, int, const UINT, CmEvent* &) { INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; UINT start_x = 0; UINT start_y = 0; UINT sizePerPixel = getSizePerPixel(format); if (sizePerPixel == 0) return MFX_ERR_UNDEFINED_BEHAVIOR; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * sizePerPixel; //Align the width regarding stride if (stride_in_bytes == 0) { stride_in_bytes = width_byte; } if (height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if (stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if ((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset) / (stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_write_shift_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex(pSurf2DIndexCM); CHECK_CM_HR(hr); threadWidth = (UINT)ceil((double)copy_width_byte / BLOCK_PIXEL_WIDTH / 4); threadHeight = (UINT)ceil((double)slice_copy_height_row / BLOCK_HEIGHT / INNER_LOOP); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount(threadNum); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace(threadWidth, threadHeight, pTS); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg(0, sizeof(SurfaceIndex), pBufferIndexCM); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg(1, sizeof(SurfaceIndex), pSurf2DIndexCM); CHECK_CM_HR(hr); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg(2, sizeof(UINT), &stride_in_dwords); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(3, sizeof(UINT), &slice_copy_height_row); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(4, sizeof(UINT), &AddedShiftLeftOffset); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(5, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(6, sizeof(UINT), &threadHeight); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(7, sizeof(UINT), &start_x); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg(8, sizeof(UINT), &start_y); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue(pGPUCopyTask, pInternalEvent, pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; start_x = 0; start_y += slice_copy_height_row; if (totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if (hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopySwapRBGPUtoGPU( CmSurface2D* pSurfaceIn, CmSurface2D* pSurfaceOut, int width, int height, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT sizePerPixel = (format==MFX_FOURCC_ARGB16||format==MFX_FOURCC_ABGR16)? 8: 4;//RGB now SurfaceIndex *pSurf2DIndexCM_In = NULL; SurfaceIndex *pSurf2DIndexCM_Out = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; CmKernel *m_pCmKernel = 0; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; if ( !pSurfaceIn || !pSurfaceOut ) { return MFX_ERR_NULL_PTR; } hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(SurfaceCopySwap_2DTo2D_32x32), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurfaceOut->GetIndex( pSurf2DIndexCM_Out ); CHECK_CM_HR(hr); hr = pSurfaceIn->GetIndex( pSurf2DIndexCM_In ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )width/BLOCK_PIXEL_WIDTH ); threadHeight = ( UINT )ceil( ( double )height/BLOCK_HEIGHT/INNER_LOOP ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM_In); m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM_Out); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &threadHeight ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &sizePerPixel ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyMirrorGPUtoGPU( CmSurface2D* pSurfaceIn, CmSurface2D* pSurfaceOut, int width, int height, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)format; (void)option; (void)pEvent; INT hr = CM_SUCCESS; // UINT sizePerPixel = (format==MFX_FOURCC_ARGB16||format==MFX_FOURCC_ABGR16)? 8: 4;//RGB now SurfaceIndex *pSurf2DIndexCM_In = NULL; SurfaceIndex *pSurf2DIndexCM_Out = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; CmKernel *m_pCmKernel = 0; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; MFX_CHECK_NULL_PTR2(pSurfaceIn, pSurfaceOut); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(SurfaceMirror_2DTo2D_NV12), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurfaceOut->GetIndex( pSurf2DIndexCM_Out ); CHECK_CM_HR(hr); hr = pSurfaceIn->GetIndex( pSurf2DIndexCM_In ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )width/BLOCK_PIXEL_WIDTH ); threadHeight = ( UINT )ceil( ( double )height/BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM_In); m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM_Out); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &width ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyMirrorNV12GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)format; (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; MFX_CHECK(totalBufferUPSize <= CM_MAX_1D_SURF_WIDTH, MFX_ERR_DEVICE_FAILED); auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, totalBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); CmBufferUPWrapperScopedLock buflock(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceMirror_read_NV12), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )copy_height_row /BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); //hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &threadHeight ); //CHECK_CM_HR(hr); //hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), ©_height_row ); //CHECK_CM_HR(hr); /*hr = m_pCmKernel->SetKernelArg( 9, sizeof( UINT ), &start_x ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 10, sizeof( UINT ), &start_y ); CHECK_CM_HR(hr);*/ hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyNV12GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; UINT byte_per_pixel = (format==MFX_FOURCC_P010 || format == MFX_FOURCC_P016)?2:1; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width*byte_per_pixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH || height>4088)//not supported by kernel now, to be fixed in case of customer requirements { return MFX_ERR_UNDEFINED_BEHAVIOR; } pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; MFX_CHECK(totalBufferUPSize <= CM_MAX_1D_SURF_WIDTH, MFX_ERR_DEVICE_FAILED); auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, totalBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); CmBufferUPWrapperScopedLock buflock(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_read_NV12), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )copy_height_row/BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &heightStride ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &widthStride ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyMirrorNV12CPUtoGPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)format; (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; MFX_CHECK(totalBufferUPSize <= CM_MAX_1D_SURF_WIDTH, MFX_ERR_DEVICE_FAILED); auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, totalBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); CmBufferUPWrapperScopedLock buflock(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceMirror_write_NV12), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )copy_height_row /BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height_stride_in_rows); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyNV12CPUtoGPU(CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, CmEvent* & pEvent ) { (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT height_stride_in_rows = heightStride; UINT byte_per_pixel = (format==MFX_FOURCC_P010 || format == MFX_FOURCC_P016)?2:1; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width*byte_per_pixel; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH || height > 4088)//not supported by kernel now, to be fixed in case of customer requirements { return MFX_ERR_UNDEFINED_BEHAVIOR; } pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; MFX_CHECK(totalBufferUPSize <= CM_MAX_1D_SURF_WIDTH, MFX_ERR_DEVICE_FAILED); auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, totalBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); CmBufferUPWrapperScopedLock buflock(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_write_NV12), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )copy_height_row /BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &stride_in_bytes ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyShiftP010GPUtoCPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, int bitshift, CmEvent* & pEvent ) { (void)format; (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = 0; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL;//(CmEvent*)-1; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_dword = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width*2; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; MFX_CHECK(totalBufferUPSize <= CM_MAX_1D_SURF_WIDTH, MFX_ERR_DEVICE_FAILED); auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, totalBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); CmBufferUPWrapperScopedLock buflock(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_read_P010_shift), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )copy_height_row /BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pBufferIndexCM ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pSurf2DIndexCM ); CHECK_CM_HR(hr); width_dword = (UINT)ceil((double)width_byte / 4); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &width_dword ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &bitshift ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 6, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 7, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); CHECK_CM_HR(hr); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::EnqueueCopyShiftP010CPUtoGPU( CmSurface2D* pSurface, unsigned char* pSysMem, int width, int height, const UINT widthStride, const UINT heightStride, mfxU32 format, const UINT option, int bitshift, CmEvent* & pEvent ) { (void)format; (void)option; (void)pEvent; INT hr = CM_SUCCESS; UINT stride_in_bytes = widthStride; UINT stride_in_dwords = 0; UINT height_stride_in_rows = heightStride; UINT AddedShiftLeftOffset = 0; size_t pLinearAddress = (size_t)pSysMem; size_t pLinearAddressAligned = 0; CmKernel *m_pCmKernel = NULL; SurfaceIndex *pBufferIndexCM = NULL; SurfaceIndex *pSurf2DIndexCM = NULL; CmThreadSpace *pTS = NULL; CmTask *pGPUCopyTask = NULL; CmEvent *pInternalEvent = NULL; UINT threadWidth = 0; UINT threadHeight = 0; UINT threadNum = 0; UINT width_byte = 0; UINT copy_width_byte = 0; UINT copy_height_row = 0; UINT slice_copy_height_row = 0; UINT sliceCopyBufferUPSize = 0; INT totalBufferUPSize = 0; MFX_CHECK_NULL_PTR1(pSurface); width_byte = width * 2; //Align the width regarding stride if(stride_in_bytes == 0) { stride_in_bytes = width_byte; } if(height_stride_in_rows == 0) { height_stride_in_rows = height; } // the actual copy region copy_width_byte = std::min (stride_in_bytes, width_byte); copy_height_row = std::min(height_stride_in_rows, height); // Make sure stride and start address of system memory is 16-byte aligned. // if no padding in system memory , stride_in_bytes = width_byte. if(stride_in_bytes & 0xf) { return MFX_ERR_UNDEFINED_BEHAVIOR; } if((pLinearAddress & 0xf) || (pLinearAddress == 0)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } //Calculate actual total size of system memory totalBufferUPSize = stride_in_bytes * height_stride_in_rows + stride_in_bytes * height/2; CmBufferUPWrapperScopedLock buflock; while (totalBufferUPSize > 0) { pLinearAddressAligned = pLinearAddress & ADDRESS_PAGE_ALIGNMENT_MASK_X64; //Calculate Left Shift offset AddedShiftLeftOffset = (UINT)(pLinearAddress - pLinearAddressAligned); totalBufferUPSize += AddedShiftLeftOffset; if (totalBufferUPSize > CM_MAX_1D_SURF_WIDTH) { slice_copy_height_row = ((CM_MAX_1D_SURF_WIDTH - AddedShiftLeftOffset)/(stride_in_bytes*(BLOCK_HEIGHT * INNER_LOOP))) * (BLOCK_HEIGHT * INNER_LOOP); sliceCopyBufferUPSize = slice_copy_height_row * stride_in_bytes + AddedShiftLeftOffset; } else { slice_copy_height_row = copy_height_row; sliceCopyBufferUPSize = totalBufferUPSize; } auto pCmUpBuffer = CreateUpBuffer((mfxU8*)pLinearAddressAligned, sliceCopyBufferUPSize, width, height); MFX_CHECK(pCmUpBuffer, MFX_ERR_DEVICE_FAILED); buflock.Add(pCmUpBuffer); pBufferIndexCM = pCmUpBuffer->GetIndex(); MFX_CHECK_NULL_PTR1(pBufferIndexCM); hr = m_pCmDevice->CreateKernel(m_pCmProgram, CM_KERNEL_FUNCTION(surfaceCopy_write_P010_shift), m_pCmKernel); CHECK_CM_HR(hr); MFX_CHECK(m_pCmKernel, MFX_ERR_DEVICE_FAILED); hr = pSurface->GetIndex( pSurf2DIndexCM ); CHECK_CM_HR(hr); threadWidth = ( UINT )ceil( ( double )copy_width_byte/BLOCK_PIXEL_WIDTH/4 ); threadHeight = ( UINT )ceil( ( double )slice_copy_height_row/BLOCK_HEIGHT ); threadNum = threadWidth * threadHeight; hr = m_pCmKernel->SetThreadCount( threadNum ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateThreadSpace( threadWidth, threadHeight, pTS ); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 0, sizeof( SurfaceIndex ), pBufferIndexCM); CHECK_CM_HR(hr); m_pCmKernel->SetKernelArg( 1, sizeof( SurfaceIndex ), pSurf2DIndexCM); CHECK_CM_HR(hr); stride_in_dwords = (UINT)ceil((double)stride_in_bytes / 4); hr = m_pCmKernel->SetKernelArg( 2, sizeof( UINT ), &stride_in_dwords ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 3, sizeof( UINT ), &height_stride_in_rows ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 4, sizeof( UINT ), &AddedShiftLeftOffset ); CHECK_CM_HR(hr); hr = m_pCmKernel->SetKernelArg( 5, sizeof( UINT ), &bitshift ); CHECK_CM_HR(hr); hr = m_pCmDevice->CreateTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = pGPUCopyTask->AddKernel( m_pCmKernel ); CHECK_CM_HR(hr); hr = m_pCmQueue->Enqueue( pGPUCopyTask, pInternalEvent, pTS ); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyTask(pGPUCopyTask); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyThreadSpace(pTS); CHECK_CM_HR(hr); hr = m_pCmDevice->DestroyKernel(m_pCmKernel); CHECK_CM_HR(hr); pLinearAddress += sliceCopyBufferUPSize - AddedShiftLeftOffset; totalBufferUPSize -= sliceCopyBufferUPSize; copy_height_row -= slice_copy_height_row; if(totalBufferUPSize > 0) //Intermediate event, we don't need it { hr = m_pCmQueue->DestroyEvent(pInternalEvent); } else //Last one event, need keep or destroy it { hr = pInternalEvent->WaitForTaskFinished(m_timeout); if(hr == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else CHECK_CM_HR(hr); hr = m_pCmQueue->DestroyEvent(pInternalEvent); } CHECK_CM_HR(hr); } return MFX_ERR_NONE; } inline INT GetTimeout(mfxU16 hwDeviceId, eMFXHWType hw_type) { std::ignore = hw_type; std::ignore = hwDeviceId; return CM_MAX_TIMEOUT_MS; } mfxStatus CmCopyWrapper::Initialize(mfxU16 hwDeviceId, eMFXHWType hwtype) { cmStatus cmSts = CM_SUCCESS; if (!m_pCmDevice) return MFX_ERR_DEVICE_FAILED; m_HWType = hwtype; if (m_HWType == MFX_HW_UNKNOWN) return MFX_ERR_UNDEFINED_BEHAVIOR; m_timeout = GetTimeout(hwDeviceId, m_HWType); mfxStatus mfxSts = InitializeSwapKernels(m_HWType); MFX_CHECK_STS(mfxSts); cmSts = m_pCmDevice->CreateQueue(m_pCmQueue); CHECK_CM_STATUS(cmSts, MFX_ERR_DEVICE_FAILED); m_tableCmRelations.clear(); m_tableSysRelations.clear(); return MFX_ERR_NONE; } // mfxStatus CmCopyWrapper::Initialize(void) mfxStatus CmCopyWrapper::InitializeSwapKernels(eMFXHWType hwtype) { if (m_bSwapKernelsInitialized) return MFX_ERR_NONE; cmStatus cmSts = CM_SUCCESS; if (!m_pCmDevice) return MFX_ERR_DEVICE_FAILED; #ifdef MFX_ENABLE_KERNELS switch (hwtype) { case MFX_HW_TGL_LP: case MFX_HW_DG1: case MFX_HW_RKL: case MFX_HW_ADL_S: case MFX_HW_ADL_P: case MFX_HW_ADL_N: cmSts = m_pCmDevice->LoadProgram((void*)genx_copy_kernel_gen12lp,sizeof(genx_copy_kernel_gen12lp),m_pCmProgram,"nojitter"); break; default: cmSts = CM_FAILURE; break; } #endif CHECK_CM_STATUS(cmSts, MFX_ERR_DEVICE_FAILED); m_bSwapKernelsInitialized = true; return MFX_ERR_NONE; } // mfxStatus CmCopyWrapper::InitializeSwapKernels(eMFXHWType hwtype) void CmCopyWrapper::CleanUpCache() { std::lock_guard guard(m_mutex); m_tableCmRelations.clear(); m_tableSysRelations.clear(); } void CmCopyWrapper::Close() { CleanUpCache(); if (!m_pCmDevice) return; if (m_pCmProgram) { std::ignore = MFX_STS_TRACE(m_pCmDevice->DestroyProgram(m_pCmProgram)); m_pCmProgram = nullptr; } if (m_pThreadSpace) { std::ignore = MFX_STS_TRACE(m_pCmDevice->DestroyThreadSpace(m_pThreadSpace)); m_pThreadSpace = nullptr; } if (m_pCmTask1) { std::ignore = MFX_STS_TRACE(m_pCmDevice->DestroyTask(m_pCmTask1)); m_pCmTask1 = nullptr; } if (m_pCmTask2) { std::ignore = MFX_STS_TRACE(m_pCmDevice->DestroyTask(m_pCmTask2)); m_pCmTask2 = nullptr; } std::ignore = MFX_STS_TRACE(DestroyCmDevice(m_pCmDevice)); m_pCmDevice = nullptr; } // mfxStatus CmCopyWrapper::Close() CmSurface2DWrapper* CmCopyWrapper::CreateCmSurface2D(mfxHDLPair surfaceIdPair, mfxU32 width, mfxU32 height) { std::lock_guard guard(m_mutex); constexpr size_t CM_MAX_2DSURFACE_TABLE_SIZE = 256; auto it = m_tableCmRelations.find(std::tie(surfaceIdPair, width, height)); if (m_tableCmRelations.end() != it) { it->second.AddRef(); return &(it->second); } cmStatus cmSts; // CM has limit on amount of surfaces that can be created if (m_tableCmRelations.size() == CM_MAX_2DSURFACE_TABLE_SIZE) { // Delete the oldest free surface (it will delete actually surface with lowest memId, which is most probably the oldest one) auto it_surface_to_delete = std::find_if(std::begin(m_tableCmRelations), std::end(m_tableCmRelations), [](auto& map_node) { return map_node.second.IsFree(); }); if (it_surface_to_delete == std::end(m_tableCmRelations)) { std::ignore = MFX_STS_TRACE(MFX_ERR_MEMORY_ALLOC); return nullptr; } m_tableCmRelations.erase(it_surface_to_delete); } CmSurface2D *pCmSurface2D = nullptr; cmSts = m_pCmDevice->CreateSurface2D(surfaceIdPair, pCmSurface2D); CHECK_CM_STATUS_RET_NULL(cmSts); auto insert_pair = m_tableCmRelations.emplace(std::piecewise_construct, std::forward_as_tuple(surfaceIdPair, width, height), std::forward_as_tuple(CmSurface2DWrapper(pCmSurface2D, m_pCmDevice))); insert_pair.first->second.AddRef(); return &(insert_pair.first->second); } // CmSurface2D * CmCopyWrapper::CreateCmSurface2D(void *pSrc, mfxU32 width, mfxU32 height) mfxStatus CmCopyWrapper::IsCmCopySupported(mfxFrameSurface1 *pSurface, IppiSize roi) { if ((roi.width & 15) || (roi.height & 7)) { return MFX_ERR_UNSUPPORTED; } if(pSurface->Info.FourCC != MFX_FOURCC_NV12) { return MFX_ERR_UNSUPPORTED; } if(pSurface->Data.UV - pSurface->Data.Y != pSurface->Data.Pitch * pSurface->Info.Height) { return MFX_ERR_UNSUPPORTED; } return MFX_ERR_NONE; } // mfxStatus CmCopyWrapper::IsCmCopySupported(mfxFrameSurface1 *pSurface, IppiSize roi) class CmSurface2DWrapperScopedLock { public: CmSurface2DWrapperScopedLock(CmSurface2DWrapper& surf) : surface(surf) {} ~CmSurface2DWrapperScopedLock() { surface.Release(); } private: CmSurface2DWrapper& surface; }; mfxStatus CmCopyWrapper::CopySystemToVideoMemoryAPI(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi) { (void)dstPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::CopySystemToVideoMemoryAPI"); cmStatus cmSts = 0; CmEvent* e = NULL; //CM_STATUS sts; mfxStatus status = MFX_ERR_NONE; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); cmSts = m_pCmQueue->EnqueueCopyCPUToGPUFullStride(*pCmSurface2D, pSrc, srcPitch, srcUVOffset, CM_FASTCOPY_OPTION_NONBLOCKING, e); if (CM_SUCCESS == cmSts) { cmSts = e->WaitForTaskFinished(m_timeout); if(cmSts == CM_EXCEED_MAX_TIMEOUT) { status = MFX_ERR_GPU_HANG; } } else { status = MFX_ERR_DEVICE_FAILED; } m_pCmQueue->DestroyEvent(e); return status; } mfxStatus CmCopyWrapper::CopySystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format) { (void)dstPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::CopySystemToVideoMemory"); cmStatus cmSts = 0; CmEvent* e = CM_NO_EVENT; //CM_STATUS sts; mfxStatus status = MFX_ERR_NONE; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); if(isSinglePlainFormat(format)) status = EnqueueCopyCPUtoGPU(*pCmSurface2D, pSrc, roi.width, roi.height, srcPitch, srcUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); else status = EnqueueCopyNV12CPUtoGPU(*pCmSurface2D, pSrc, roi.width, roi.height, srcPitch, srcUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); if (status == MFX_ERR_GPU_HANG || status == MFX_ERR_NONE) { return status; } else { cmSts = m_pCmQueue->EnqueueCopyCPUToGPUFullStride(*pCmSurface2D, pSrc, srcPitch, srcUVOffset, CM_FASTCOPY_OPTION_BLOCKING, e); if (CM_SUCCESS == cmSts) { status = MFX_ERR_NONE; } else if(cmSts == CM_EXCEED_MAX_TIMEOUT) { status = MFX_ERR_GPU_HANG; } else { status = MFX_ERR_DEVICE_FAILED; } } return status; } mfxStatus CmCopyWrapper::CopySwapSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format) { (void)dstPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::ARGBSwapSystemToVideo"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); mfxStatus sts = EnqueueCopySwapRBCPUtoGPU(*pCmSurface2D, pSrc,roi.width,roi.height, srcPitch, srcUVOffset,format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyShiftSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 bitshift, mfxU32 format) { (void)dstPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::ShiftSystemToVideo"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; mfxStatus sts = MFX_ERR_NONE; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); if (isSinglePlainFormat(format)) sts = EnqueueCopyShiftCPUtoGPU(*pCmSurface2D, pSrc, roi.width, roi.height, srcPitch, srcUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, bitshift, e); else sts = EnqueueCopyShiftP010CPUtoGPU(*pCmSurface2D, pSrc, roi.width, roi.height, srcPitch, srcUVOffset, 0, CM_FASTCOPY_OPTION_BLOCKING, bitshift, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyShiftVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 bitshift, mfxU32 format) { (void)srcPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::ShiftVideoToSystem"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; mfxStatus sts = MFX_ERR_NONE; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); if(isSinglePlainFormat(format)) sts = EnqueueCopyShiftGPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, bitshift, e); else sts = EnqueueCopyShiftP010GPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, 0, CM_FASTCOPY_OPTION_BLOCKING, bitshift, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyVideoToSystemMemoryAPI(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi) { (void)srcPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::CopyVideoToSystemMemoryAPI"); cmStatus cmSts = 0; CmEvent* e = NULL; mfxStatus status = MFX_ERR_NONE; mfxU32 width = roi.width; mfxU32 height = roi.height; auto pCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); cmSts = m_pCmQueue->EnqueueCopyGPUToCPUFullStride(*pCmSurface2D, pDst, dstPitch, dstUVOffset, CM_FASTCOPY_OPTION_NONBLOCKING, e); if (CM_SUCCESS == cmSts) { cmSts = e->WaitForTaskFinished(m_timeout); if (cmSts == CM_EXCEED_MAX_TIMEOUT) { status = MFX_ERR_GPU_HANG; } } else { status = MFX_ERR_DEVICE_FAILED; } m_pCmQueue->DestroyEvent(e); return status; } mfxStatus CmCopyWrapper::CopyVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format) { (void)srcPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::CopyVideoToSystemMemory"); cmStatus cmSts = 0; CmEvent* e = CM_NO_EVENT; mfxStatus status = MFX_ERR_NONE; mfxU32 width = roi.width; mfxU32 height = roi.height; auto pCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); if(isSinglePlainFormat(format)) status = EnqueueCopyGPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); else status = EnqueueCopyNV12GPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); if (status == MFX_ERR_GPU_HANG || status == MFX_ERR_NONE) { return status; } else { cmSts = m_pCmQueue->EnqueueCopyGPUToCPUFullStride(*pCmSurface2D, pDst, dstPitch, dstUVOffset, CM_FASTCOPY_OPTION_BLOCKING, e); if (CM_SUCCESS == cmSts) { status = MFX_ERR_NONE; } else if(cmSts == CM_EXCEED_MAX_TIMEOUT) { status = MFX_ERR_GPU_HANG; } else { status = MFX_ERR_DEVICE_FAILED; } } return status; } mfxStatus CmCopyWrapper::CopySwapVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format) { (void)srcPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::ARGBSwapVideoToSystem"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); mfxStatus sts = EnqueueCopySwapRBGPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyMirrorVideoToSystemMemory(mfxU8 *pDst, mfxU32 dstPitch, mfxU32 dstUVOffset, mfxHDLPair src, mfxU32 srcPitch, IppiSize roi, mfxU32 format) { (void)srcPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::MirrorVideoToSystem"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); mfxStatus sts = EnqueueCopyMirrorNV12GPUtoCPU(*pCmSurface2D, pDst, roi.width, roi.height, dstPitch, dstUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyMirrorSystemToVideoMemory(mfxHDLPair dst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, mfxU32 srcUVOffset, IppiSize roi, mfxU32 format) { (void)dstPitch; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::MirrorSystemToVideo"); CmEvent* e = CM_NO_EVENT; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock(*pCmSurface2D); mfxStatus sts = EnqueueCopyMirrorNV12CPUtoGPU(*pCmSurface2D, pSrc, roi.width, roi.height, srcPitch, srcUVOffset, format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyVideoToVideoMemoryAPI(mfxHDLPair dst, mfxHDLPair src, IppiSize roi) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::CopyVideoToVideoMemoryAPI"); cmStatus cmSts = 0; CmEvent* e = NULL; mfxStatus status = MFX_ERR_NONE; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pDstCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pDstCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_dst(*pDstCmSurface2D); auto pSrcCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pSrcCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_src(*pSrcCmSurface2D); cmSts = m_pCmQueue->EnqueueCopyGPUToGPU(*pDstCmSurface2D, *pSrcCmSurface2D, CM_FASTCOPY_OPTION_NONBLOCKING, e); if (CM_SUCCESS == cmSts) { cmSts = e->WaitForTaskFinished(m_timeout); if (cmSts == CM_EXCEED_MAX_TIMEOUT) { status = MFX_ERR_GPU_HANG; } } else { status = MFX_ERR_DEVICE_FAILED; } m_pCmQueue->DestroyEvent(e); return status; } mfxStatus CmCopyWrapper::CopySwapVideoToVideoMemory(mfxHDLPair dst, mfxHDLPair src, IppiSize roi, mfxU32 format) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::ARGBSwapVideoToVideo"); CmEvent* e = NULL; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pDstCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pDstCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_dst(*pDstCmSurface2D); auto pSrcCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pSrcCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_src(*pSrcCmSurface2D); mfxStatus sts = EnqueueCopySwapRBGPUtoGPU(*pSrcCmSurface2D, *pDstCmSurface2D, width, height, format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxStatus CmCopyWrapper::CopyMirrorVideoToVideoMemory(mfxHDLPair dst, mfxHDLPair src, IppiSize roi, mfxU32 format) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CmCopyWrapper::MirrorVideoToVideo"); CmEvent* e = NULL; mfxU32 width = roi.width; mfxU32 height = roi.height; // create or find already associated cm surface 2d auto pDstCmSurface2D = CreateCmSurface2D(dst, width, height); CHECK_CM_NULL_PTR(pDstCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_dst(*pDstCmSurface2D); auto pSrcCmSurface2D = CreateCmSurface2D(src, width, height); CHECK_CM_NULL_PTR(pSrcCmSurface2D, MFX_ERR_DEVICE_FAILED); CmSurface2DWrapperScopedLock lock_src(*pSrcCmSurface2D); mfxStatus sts = EnqueueCopyMirrorGPUtoGPU(*pSrcCmSurface2D, *pDstCmSurface2D, width, height, format, CM_FASTCOPY_OPTION_BLOCKING, e); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } #define CM_RGB_MAX_GPUCOPY_SURFACE_HEIGHT 4088 #define CM_RGB_SUPPORTED_COPY_SIZE(ROI) (ROI.width <= CM_RGB_MAX_GPUCOPY_SURFACE_HEIGHT && ROI.height <= CM_RGB_MAX_GPUCOPY_SURFACE_HEIGHT ) bool CmCopyWrapper::CheckSurfaceContinuouslyAllocated(const mfxFrameSurface1 &surf) { mfxU32 stride_in_bytes = surf.Data.PitchLow + ((mfxU32)surf.Data.PitchHigh << 16); switch (surf.Info.FourCC) { // Packed formats like YUY2, UYVY, AYUV, Y416, Y210, Y410, A2RGB10, RGB565, RGB3 // does not need to be handled here - they got only one plane with all the luma and chroma data interleaved // Handling semi-planar formats case MFX_FOURCC_P010: case MFX_FOURCC_P016: case MFX_FOURCC_P210: case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: { size_t luma_size_in_bytes = stride_in_bytes * mfx::align2_value(surf.Info.Height, 32); return surf.Data.Y + luma_size_in_bytes == surf.Data.UV; break; } // Handling planar formats case MFX_FOURCC_YV12: { size_t luma_size_in_bytes = stride_in_bytes * mfx::align2_value(surf.Info.Height, 32); size_t chroma_size_in_bytes = luma_size_in_bytes / 4; //stride of the V plane is half the stride of the Y plane; and the V plane contains half as many lines as the Y plane return surf.Data.Y + luma_size_in_bytes == surf.Data.V && surf.Data.V + chroma_size_in_bytes == surf.Data.U; break; } // Handling RGB-like formats case MFX_FOURCC_RGBP: { size_t channel_size_in_bytes = stride_in_bytes * mfx::align2_value(surf.Info.Height, 32); return surf.Data.R + channel_size_in_bytes == surf.Data.G && surf.Data.G + channel_size_in_bytes == surf.Data.B; break; } } return true; } bool CmCopyWrapper::CanUseCmCopy(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { IppiSize roi = {std::min(pSrc->Info.Width, pDst->Info.Width), std::min(pSrc->Info.Height, pDst->Info.Height)}; mfxU8* srcPtr = GetFramePointer(pSrc->Info.FourCC, pSrc->Data); mfxU8* dstPtr = GetFramePointer(pDst->Info.FourCC, pDst->Data); if (NULL != pSrc->Data.MemId && NULL != pDst->Data.MemId) { if (pDst->Info.FourCC != MFX_FOURCC_YV12 && CM_SUPPORTED_COPY_SIZE(roi)) { return true; } } else if (NULL != pSrc->Data.MemId && NULL != dstPtr) { if (!CM_ALIGNED(pDst->Data.Pitch)) return false; mfxI64 verticalPitch = (mfxI64)(pDst->Data.UV - pDst->Data.Y); verticalPitch = (verticalPitch % pDst->Data.Pitch)? 0 : verticalPitch / pDst->Data.Pitch; if (isNV12LikeFormat(pDst->Info.FourCC) && isNV12LikeFormat(pSrc->Info.FourCC) && CM_ALIGNED(pDst->Data.Y) && CM_ALIGNED(pDst->Data.UV) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pDst->Info.Height && verticalPitch <= 16384) { return CheckSurfaceContinuouslyAllocated(*pDst); } else if(isSinglePlainFormat(pDst->Info.FourCC) && isSinglePlainFormat(pSrc->Info.FourCC) && pSrc->Info.Shift == pDst->Info.Shift && CM_ALIGNED(dstPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { return true; } else return false; } else if (NULL != srcPtr && NULL != dstPtr) { return false; } else if (NULL != srcPtr && NULL != pDst->Data.MemId) { if (!CM_ALIGNED(pSrc->Data.Pitch)) return false; mfxI64 verticalPitch = (mfxI64)(pSrc->Data.UV - pSrc->Data.Y); verticalPitch = (verticalPitch % pSrc->Data.Pitch)? 0 : verticalPitch / pSrc->Data.Pitch; if (isNV12LikeFormat(pDst->Info.FourCC) && isNV12LikeFormat(pSrc->Info.FourCC) && CM_ALIGNED(pSrc->Data.Y) && CM_ALIGNED(pSrc->Data.UV) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pSrc->Info.Height && verticalPitch <= 16384) { return true; } else if(isSinglePlainFormat(pDst->Info.FourCC) && isSinglePlainFormat(pSrc->Info.FourCC) && pSrc->Info.Shift == pDst->Info.Shift && CM_ALIGNED(srcPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { return true; } } return false; } mfxStatus CmCopyWrapper::CopyVideoToVideo(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { MFX_CHECK_NULL_PTR2(pDst, pSrc); IppiSize roi = {std::min(pSrc->Info.Width, pDst->Info.Width), std::min(pSrc->Info.Height, pDst->Info.Height)}; // check that region of interest is valid MFX_CHECK(roi.width != 0 && roi.height != 0 && m_HWType != MFX_HW_UNKNOWN, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(pSrc->Data.MemId && pDst->Data.MemId, MFX_ERR_UNDEFINED_BEHAVIOR); if(isNeedSwapping(pSrc,pDst)) return CopySwapVideoToVideoMemory(*reinterpret_cast(pDst->Data.MemId), *reinterpret_cast(pSrc->Data.MemId), roi, pDst->Info.FourCC); else return CopyVideoToVideoMemoryAPI(*reinterpret_cast(pDst->Data.MemId), *reinterpret_cast(pSrc->Data.MemId), roi); } mfxStatus CmCopyWrapper::CopyVideoToSys(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { MFX_CHECK_NULL_PTR2(pDst, pSrc); mfxStatus mfxRes = MFX_ERR_NONE; MFX_AUTO_TRACE("CmCopyWrapper::CopyVideoToSys"); TRACE_EVENT(MFX_TRACE_HOTSPOT_CM_COPY, EVENT_TYPE_INFO, 0, make_event_data(MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY)); IppiSize roi = {std::min(pSrc->Info.Width, pDst->Info.Width), std::min(pSrc->Info.Height, pDst->Info.Height)}; // check that region of interest is valid if (roi.width == 0 || roi.height == 0 || m_HWType == MFX_HW_UNKNOWN) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } mfxU32 dstPitch = pDst->Data.PitchLow + ((mfxU32)pDst->Data.PitchHigh << 16); mfxU8* dstPtr = GetFramePointer(pDst->Info.FourCC, pDst->Data); if (!pSrc->Data.MemId || !dstPtr) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } if (!CM_ALIGNED(pDst->Data.Pitch)) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } mfxI64 verticalPitch = (mfxI64)(pDst->Data.UV - pDst->Data.Y); verticalPitch = (verticalPitch % dstPitch)? 0 : verticalPitch / dstPitch; #ifdef MFX_ENABLE_RGBP if (pDst->Info.FourCC == MFX_FOURCC_RGBP) { verticalPitch = (mfxI64)(pDst->Data.G - pDst->Data.R); verticalPitch = (verticalPitch % dstPitch)? 0 : verticalPitch / dstPitch; } #endif if (isNeedShift(pSrc, pDst) && CM_ALIGNED(dstPtr) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pDst->Info.Height && verticalPitch <= 16384) { mfxRes = CopyShiftVideoToSystemMemory(dstPtr, pDst->Data.Pitch,(mfxU32)verticalPitch, *reinterpret_cast(pSrc->Data.MemId), 0, roi, 16-pDst->Info.BitDepthLuma, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isNV12LikeFormat(pDst->Info.FourCC) && CM_ALIGNED(dstPtr) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pDst->Info.Height && verticalPitch <= 16384) { mfxRes = CopyVideoToSystemMemory(dstPtr, pDst->Data.Pitch, (mfxU32)verticalPitch, *reinterpret_cast(pSrc->Data.MemId), pDst->Info.Height, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isNeedSwapping(pSrc, pDst) && CM_ALIGNED(dstPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { mfxRes = CopySwapVideoToSystemMemory(dstPtr, pDst->Data.Pitch, (mfxU32)pSrc->Info.Height, *reinterpret_cast(pSrc->Data.MemId), 0, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isSinglePlainFormat(pDst->Info.FourCC) && isSinglePlainFormat(pSrc->Info.FourCC) && pSrc->Info.FourCC == pDst->Info.FourCC && pSrc->Info.Shift == pDst->Info.Shift && CM_ALIGNED(dstPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { mfxRes = CopyVideoToSystemMemory(dstPtr, pDst->Data.Pitch, (mfxU32)verticalPitch, *reinterpret_cast(pSrc->Data.MemId), pDst->Info.Height, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } mfxStatus CmCopyWrapper::CopySysToVideo(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { MFX_CHECK_NULL_PTR2(pDst, pSrc); mfxStatus mfxRes = MFX_ERR_NONE; MFX_AUTO_TRACE("CmCopyWrapper::CopySysToVideo"); TRACE_EVENT(MFX_TRACE_HOTSPOT_CM_COPY, EVENT_TYPE_INFO, 0, make_event_data(MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY)); IppiSize roi = {std::min(pSrc->Info.Width, pDst->Info.Width), std::min(pSrc->Info.Height, pDst->Info.Height)}; mfxU8* srcPtr = GetFramePointer(pSrc->Info.FourCC, pSrc->Data); // check that region of interest is valid if (roi.width == 0 || roi.height == 0 || m_HWType == MFX_HW_UNKNOWN) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } if (!srcPtr || !pDst->Data.MemId) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } if (!CM_ALIGNED(pSrc->Data.Pitch)) { mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } // source are placed in system memory, destination is in video memory // use common way to copy frames from system to video, most faster mfxI64 verticalPitch = (mfxI64)(pSrc->Data.UV - pSrc->Data.Y); verticalPitch = (verticalPitch % pSrc->Data.Pitch)? 0 : verticalPitch / pSrc->Data.Pitch; if (isNeedShift(pSrc, pDst) && CM_ALIGNED(srcPtr) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pSrc->Info.Height && verticalPitch <= 16384) { mfxRes = CopyShiftSystemToVideoMemory(*reinterpret_cast(pDst->Data.MemId), 0, pSrc->Data.Y, pSrc->Data.Pitch,(mfxU32)verticalPitch, roi, 16 - pSrc->Info.BitDepthLuma, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isNV12LikeFormat(pSrc->Info.FourCC) && CM_ALIGNED(srcPtr) && CM_SUPPORTED_COPY_SIZE(roi) && verticalPitch >= pSrc->Info.Height && verticalPitch <= 16384) { mfxRes = CopySystemToVideoMemory(*reinterpret_cast(pDst->Data.MemId), 0, pSrc->Data.Y, pSrc->Data.Pitch, (mfxU32)verticalPitch, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isNeedSwapping(pSrc, pDst) && CM_ALIGNED(srcPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { mfxRes = CopySwapSystemToVideoMemory(*reinterpret_cast(pDst->Data.MemId), 0, srcPtr, pSrc->Data.Pitch, (mfxU32)pSrc->Info.Height, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } if (isSinglePlainFormat(pDst->Info.FourCC) && isSinglePlainFormat(pSrc->Info.FourCC) && pSrc->Info.FourCC == pDst->Info.FourCC && pSrc->Info.Shift == pDst->Info.Shift && CM_ALIGNED(srcPtr) && CM_SUPPORTED_COPY_SIZE(roi)) { mfxRes = CopySystemToVideoMemory(*reinterpret_cast(pDst->Data.MemId), 0, srcPtr, pSrc->Data.Pitch, (mfxU32)pSrc->Info.Height, roi, pDst->Info.FourCC); MFX_RETURN(mfxRes); } mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; MFX_RETURN(mfxRes); } cmrt_cross_platform.cpp000066400000000000000000000542161443134507600345450ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/src// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "assert.h" #include "cmrt_cross_platform.h" #ifdef CM_WIN #include #include #pragma comment(lib, "cfgmgr32") #endif const vm_char * DLL_NAME_LINUX = VM_STRING("libigfxcmrt.so.7"); #ifdef CMRT_EMU const char * FUNC_NAME_CREATE_CM_DEVICE = "CreateCmDeviceEmu"; const char * FUNC_NAME_CREATE_CM_DEVICE_EX = "CreateCmDeviceEmu"; const char * FUNC_NAME_DESTROY_CM_DEVICE = "DestroyCmDeviceEmu"; #else //CMRT_EMU const char * FUNC_NAME_CREATE_CM_DEVICE = "CreateCmDevice"; const char * FUNC_NAME_CREATE_CM_DEVICE_EX = "CreateCmDeviceEx"; const char * FUNC_NAME_DESTROY_CM_DEVICE = "DestroyCmDevice"; #endif //CMRT_EMU #if defined(CM_WIN) #define IMPL_FOR_ALL(RET, FUNC, PROTO, PARAM) \ RET FUNC PROTO { \ switch (m_platform) { \ case DX9: return m_dx9->FUNC PARAM; \ case DX11: return m_dx11->FUNC PARAM; \ default: return CM_NOT_IMPLEMENTED; \ } \ } #else // #if defined(CM_WIN) #define IMPL_FOR_ALL(RET, FUNC, PROTO, PARAM) \ RET FUNC PROTO { \ switch (m_platform) { \ case VAAPI: return m_linux->FUNC PARAM; \ default: return CM_NOT_IMPLEMENTED; \ } \ } #endif // #if defined(CM_WIN) #if defined(CM_WIN) #define IMPL_FOR_DX(RET, FUNC, PROTO, PARAM) \ RET FUNC PROTO { \ switch (m_platform) { \ case DX9: return m_dx9->FUNC PARAM; \ case DX11: return m_dx11->FUNC PARAM; \ default: return CM_NOT_IMPLEMENTED; \ } \ } #define IMPL_FOR_DX11(RET, FUNC, PROTO, PARAM) \ RET FUNC PROTO { \ switch (m_platform) { \ case DX11: return m_dx11->FUNC PARAM; \ default: return CM_NOT_IMPLEMENTED; \ } \ } #include "dxgiformat.h" #define CONVERT_FORMAT(FORMAT) \ (m_platform == DX11 ? (D3DFORMAT)ConvertFormatToDx11(FORMAT) : (FORMAT)) namespace { DXGI_FORMAT ConvertFormatToDx11(D3DFORMAT format) { switch ((UINT)format) { case CM_SURFACE_FORMAT_UNKNOWN: return DXGI_FORMAT_UNKNOWN; case CM_SURFACE_FORMAT_A8R8G8B8: return DXGI_FORMAT_B8G8R8A8_UNORM; case CM_SURFACE_FORMAT_X8R8G8B8: return DXGI_FORMAT_B8G8R8X8_UNORM; case CM_SURFACE_FORMAT_A8: return DXGI_FORMAT_A8_UNORM; case CM_SURFACE_FORMAT_P8: return DXGI_FORMAT_P8; case CM_SURFACE_FORMAT_R32F: return DXGI_FORMAT_R32_FLOAT; case CM_SURFACE_FORMAT_NV12: return DXGI_FORMAT_NV12; case CM_SURFACE_FORMAT_UYVY: return DXGI_FORMAT_R8G8_B8G8_UNORM; case CM_SURFACE_FORMAT_YUY2: return DXGI_FORMAT_YUY2; case CM_SURFACE_FORMAT_V8U8: return DXGI_FORMAT_R8G8_SNORM; default: assert(0); return DXGI_FORMAT_UNKNOWN; } } }; #else /* #if defined(CM_WIN) */ #define CONVERT_FORMAT(FORMAT) (FORMAT) #endif /* #if defined(CM_WIN) */ #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnon-virtual-dtor" #else #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #endif #endif enum { DX9 = 1, DX11 = 2, VAAPI = 3 }; #if defined(CM_WIN) typedef INT (* CreateCmDeviceDx9FuncTypeEx)(CmDx9::CmDevice *&, UINT &, IDirect3DDeviceManager9 *, UINT); typedef INT (* CreateCmDeviceDx11FuncTypeEx)(CmDx11::CmDevice *&, UINT &, ID3D11Device *, UINT); typedef INT (* CreateCmDeviceDx9FuncType)(CmDx9::CmDevice *&, UINT &, IDirect3DDeviceManager9 *); typedef INT (* CreateCmDeviceDx11FuncType)(CmDx11::CmDevice *&, UINT &, ID3D11Device *); typedef INT (* DestroyCmDeviceDx9FuncType)(CmDx9::CmDevice *&); typedef INT (* DestroyCmDeviceDx11FuncType)(CmDx11::CmDevice *&); #else // #if defined(CM_WIN) typedef INT (* CreateCmDeviceLinuxFuncTypeEx)(CmLinux::CmDevice *&, UINT &, VADisplay, UINT); typedef INT (* CreateCmDeviceLinuxFuncType)(CmLinux::CmDevice *&, UINT &, VADisplay); typedef INT (* DestroyCmDeviceVAAPIFuncType)(CmLinux::CmDevice *&); #endif // #if defined(CM_WIN) class CmDeviceImpl : public CmDevice { public: void* m_dll; INT m_platform; union { #if defined(CM_WIN) CmDx9::CmDevice * m_dx9; CmDx11::CmDevice * m_dx11; #else CmLinux::CmDevice * m_linux; #endif }; virtual ~CmDeviceImpl(){} INT GetPlatform(){return m_platform;}; INT GetDevice(AbstractDeviceHandle & pDevice) { #if !defined(CM_WIN) (void)pDevice; #endif switch (m_platform) { #if defined(CM_WIN) case DX9: return m_dx9->GetD3DDeviceManager((IDirect3DDeviceManager9 *&)pDevice); case DX11: return m_dx11->GetD3D11Device((ID3D11Device *&)pDevice); #else case VAAPI: return CM_NOT_IMPLEMENTED; #endif default: return CM_NOT_IMPLEMENTED; } } INT CreateSurface2D(mfxHDLPair D3DSurfPair, CmSurface2D *& pSurface) { switch (m_platform) { #if defined(CM_WIN) case DX9: return m_dx9->CreateSurface2D((IDirect3DSurface9 *)D3DSurfPair.first, pSurface); case DX11: return m_dx11->CreateSurface2DbySubresourceIndex((ID3D11Texture2D *)D3DSurfPair.first, static_cast((size_t)D3DSurfPair.second), 0, pSurface); #else case VAAPI: return m_linux->CreateSurface2D(*(VASurfaceID*)D3DSurfPair.first, pSurface); #endif default: return CM_NOT_IMPLEMENTED; } } INT CreateSurface2D(AbstractSurfaceHandle pD3DSurf, CmSurface2D *& pSurface) { switch (m_platform) { #if defined(CM_WIN) case DX9: return m_dx9->CreateSurface2D((IDirect3DSurface9 *)pD3DSurf, pSurface); case DX11: return m_dx11->CreateSurface2D((ID3D11Texture2D *)pD3DSurf, pSurface); #else case VAAPI: return m_linux->CreateSurface2D(*(VASurfaceID*)pD3DSurf, pSurface); #endif default: return CM_NOT_IMPLEMENTED; } } INT CreateSurface2DSubresource(AbstractSurfaceHandle pD3D11Texture2D, UINT subresourceCount, CmSurface2D ** ppSurfaces, UINT & createdSurfaceCount, UINT option) { #if !defined(CM_WIN) (void)pD3D11Texture2D; (void)subresourceCount; (void)ppSurfaces; (void)createdSurfaceCount; (void)option; #endif switch (m_platform) { #if defined(CM_WIN) case DX9: return CM_NOT_IMPLEMENTED; case DX11: return m_dx11->CreateSurface2DSubresource((ID3D11Texture2D *)pD3D11Texture2D, subresourceCount, ppSurfaces, createdSurfaceCount, option); #else case VAAPI: return CM_NOT_IMPLEMENTED; #endif default: return CM_NOT_IMPLEMENTED; } } INT CreateSurface2DbySubresourceIndex(AbstractSurfaceHandle pD3D11Texture2D, UINT FirstArraySlice, UINT FirstMipSlice, CmSurface2D *& pSurface) { #if !defined(CM_WIN) (void)pD3D11Texture2D; (void)FirstArraySlice; (void)FirstMipSlice; (void)pSurface; #endif switch (m_platform) { #if defined(CM_WIN) case DX9: return CM_NOT_IMPLEMENTED; case DX11: return m_dx11->CreateSurface2DbySubresourceIndex((ID3D11Texture2D *)pD3D11Texture2D, FirstArraySlice, FirstMipSlice, pSurface); #else case VAAPI: return CM_NOT_IMPLEMENTED; #endif default: return CM_NOT_IMPLEMENTED; } } IMPL_FOR_ALL(INT, CreateBuffer, (UINT size, CmBuffer *& pSurface), (size, pSurface)); IMPL_FOR_ALL(INT, CreateSurface2D, (UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface), (width, height, CONVERT_FORMAT(format), pSurface)); IMPL_FOR_ALL(INT, CreateSurface3D, (UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface), (width, height, depth, CONVERT_FORMAT(format), pSurface)); IMPL_FOR_ALL(INT, DestroySurface, (CmSurface2D *& pSurface), (pSurface)); IMPL_FOR_ALL(INT, DestroySurface, (CmBuffer *& pSurface), (pSurface)); IMPL_FOR_ALL(INT, DestroySurface, (CmSurface3D *& pSurface), (pSurface)); IMPL_FOR_ALL(INT, CreateQueue, (CmQueue *& pQueue), (pQueue)); IMPL_FOR_ALL(INT, LoadProgram, (void * pCommonISACode, const UINT size, CmProgram *& pProgram, const char * options), (pCommonISACode, size, pProgram, options)); IMPL_FOR_ALL(INT, CreateKernel, (CmProgram * pProgram, const char * kernelName, CmKernel *& pKernel, const char * options), (pProgram, kernelName, pKernel, options)); IMPL_FOR_ALL(INT, CreateKernel, (CmProgram * pProgram, const char * kernelName, const void * fncPnt, CmKernel *& pKernel, const char * options), (pProgram, kernelName, fncPnt, pKernel, options)); IMPL_FOR_ALL(INT, CreateSampler, (const CM_SAMPLER_STATE & sampleState, CmSampler *& pSampler), (sampleState, pSampler)); IMPL_FOR_ALL(INT, DestroyKernel, (CmKernel *& pKernel), (pKernel)); IMPL_FOR_ALL(INT, DestroySampler, (CmSampler *& pSampler), (pSampler)); IMPL_FOR_ALL(INT, DestroyProgram, (CmProgram *& pProgram), (pProgram)); IMPL_FOR_ALL(INT, DestroyThreadSpace, (CmThreadSpace *& pTS), (pTS)); IMPL_FOR_ALL(INT, CreateTask, (CmTask *& pTask), (pTask)); IMPL_FOR_ALL(INT, DestroyTask, (CmTask *& pTask), (pTask)); IMPL_FOR_ALL(INT, GetCaps, (CM_DEVICE_CAP_NAME capName, size_t & capValueSize, void * pCapValue), (capName, capValueSize, pCapValue)); IMPL_FOR_ALL(INT, CreateThreadSpace, (UINT width, UINT height, CmThreadSpace *& pTS), (width, height, pTS)); IMPL_FOR_ALL(INT, CreateBufferUP, (UINT size, void * pSystMem, CmBufferUP *& pSurface), (size, pSystMem, pSurface)); IMPL_FOR_ALL(INT, DestroyBufferUP, (CmBufferUP *& pSurface), (pSurface)); IMPL_FOR_ALL(INT, GetSurface2DInfo, (UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize), (width, height, CONVERT_FORMAT(format), pitch, physicalSize)); IMPL_FOR_ALL(INT, CreateSurface2DUP, (UINT width, UINT height, CM_SURFACE_FORMAT format, void * pSysMem, CmSurface2DUP *& pSurface), (width, height, CONVERT_FORMAT(format), pSysMem, pSurface)); IMPL_FOR_ALL(INT, DestroySurface2DUP, (CmSurface2DUP *& pSurface), (pSurface)); IMPL_FOR_ALL(INT, CreateVmeSurfaceG7_5 , (CmSurface2D * pCurSurface, CmSurface2D ** pForwardSurface, CmSurface2D ** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex *& pVmeIndex), (pCurSurface, pForwardSurface, pBackwardSurface, surfaceCountForward, surfaceCountBackward, pVmeIndex)); IMPL_FOR_ALL(INT, DestroyVmeSurfaceG7_5, (SurfaceIndex *& pVmeIndex), (pVmeIndex)); IMPL_FOR_ALL(INT, CreateSampler8x8, (const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8 *& psmplrState), (smplDescr, psmplrState)); IMPL_FOR_ALL(INT, DestroySampler8x8, (CmSampler8x8 *& pSampler), (pSampler)); IMPL_FOR_ALL(INT, CreateSampler8x8Surface, (CmSurface2D * p2DSurface, SurfaceIndex *& pDIIndex, CM_SAMPLER8x8_SURFACE surf_type, CM_SURFACE_ADDRESS_CONTROL_MODE mode), (p2DSurface, pDIIndex, surf_type, mode)); IMPL_FOR_ALL(INT, DestroySampler8x8Surface, (SurfaceIndex* & pDIIndex), (pDIIndex)); IMPL_FOR_ALL(INT, CreateThreadGroupSpace, (UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace *& pTGS), (thrdSpaceWidth, thrdSpaceHeight, grpSpaceWidth, grpSpaceHeight, pTGS)); IMPL_FOR_ALL(INT, DestroyThreadGroupSpace, (CmThreadGroupSpace *& pTGS), (pTGS)); IMPL_FOR_ALL(INT, SetL3Config, (const L3_CONFIG_REGISTER_VALUES * l3_c), (l3_c)); IMPL_FOR_ALL(INT, SetSuggestedL3Config, (L3_SUGGEST_CONFIG l3_s_c), (l3_s_c)); IMPL_FOR_ALL(INT, SetCaps, (CM_DEVICE_CAP_NAME capName, size_t capValueSize, void * pCapValue), (capName, capValueSize, pCapValue)); IMPL_FOR_ALL(INT, CreateSamplerSurface2D, (CmSurface2D * p2DSurface, SurfaceIndex *& pSamplerSurfaceIndex), (p2DSurface, pSamplerSurfaceIndex)); IMPL_FOR_ALL(INT, CreateSamplerSurface3D, (CmSurface3D * p3DSurface, SurfaceIndex *& pSamplerSurfaceIndex), (p3DSurface, pSamplerSurfaceIndex)); IMPL_FOR_ALL(INT, DestroySamplerSurface, (SurfaceIndex *& pSamplerSurfaceIndex), (pSamplerSurfaceIndex)); IMPL_FOR_ALL(INT, InitPrintBuffer, (size_t printbufsize), (printbufsize)); IMPL_FOR_ALL(INT, FlushPrintBuffer, (), ()); IMPL_FOR_ALL(int32_t, CreateQueueEx, (CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION), (pQueue, QueueCreateOption)); }; #ifdef CM_WIN /*! Function for converting list of "str1\0str2\0str3\0\0" to vector of single strings \param input_str double-null string for parsing \param input_str_len length of input_str, including double null \param output_vec vector for storing found strings */ inline void ConvertDoubleNullTermStringToVector(const wchar_t *input_str, const size_t input_str_len, std::vector &output_vec) { const wchar_t *begin = input_str; const wchar_t *end = input_str + input_str_len; size_t len = 0; if (!input_str) return; while ((begin 0) { output_vec.push_back(begin); begin += len + 1; } } /*! Function for comparing for Intel Device ID \param DeviceID string, containing Device ID for check \return true if Intel Device ID found */ inline bool IsIntelDeviceInstanceID(std::wstring &DeviceID) { if (DeviceID.find(L"VEN_8086") != std::wstring::npos || DeviceID.find(L"ven_8086") != std::wstring::npos) return true; else return false; } /*! Function for looking for MDF in DriverStore \param path allocated memory for storing path to MDF, not less than MAX_PATH \return true if path found */ inline bool GetMDFDriverStorePath(TCHAR *path, DWORD *dwPathSize) { // Obtain a PnP handle to the Intel graphics adapter CONFIGRET result = CR_SUCCESS; std::wstring IntelDeviceID; std::vector Devices; ULONG DeviceIDListSize = 0; PWSTR DeviceIDList = nullptr; wchar_t DisplayGUID[40]; DEVINST DeviceInst; if(StringFromGUID2(GUID_DEVCLASS_DISPLAY, DisplayGUID, sizeof(DisplayGUID))==0) { return false; } do { result = CM_Get_Device_ID_List_SizeW(&DeviceIDListSize, DisplayGUID, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); if (result != CR_SUCCESS) { break; } //This block should be executed once, but if we come here several times we should cleanup before new allocation if (DeviceIDList != nullptr) { delete[] DeviceIDList; DeviceIDList = nullptr; } try { DeviceIDList = new WCHAR[DeviceIDListSize * sizeof(PWSTR)]; /* free in this method */ } catch (...) { return false; } result = CM_Get_Device_ID_ListW(DisplayGUID, DeviceIDList, DeviceIDListSize, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); } while (result == CR_BUFFER_SMALL); if (result != CR_SUCCESS) { if(DeviceIDList!=nullptr) { delete[] DeviceIDList; DeviceIDList = nullptr; } return false; } ConvertDoubleNullTermStringToVector(DeviceIDList, DeviceIDListSize, Devices); delete[] DeviceIDList; DeviceIDList = nullptr; //Look for MDF record for (auto it = Devices.begin(); it != Devices.end(); ++it) { if (IsIntelDeviceInstanceID(*it)) { result = CM_Locate_DevNodeW(&DeviceInst, const_cast((*it).c_str()), CM_LOCATE_DEVNODE_NORMAL); if (result != CR_SUCCESS) { continue; } HKEY hKey_sw; result = CM_Open_DevNode_Key(DeviceInst, KEY_READ, 0, RegDisposition_OpenExisting, &hKey_sw, CM_REGISTRY_SOFTWARE); if (result != CR_SUCCESS) { continue; } ULONG nError; nError = RegQueryValueEx(hKey_sw, _T("DriverStorePathForMDF"), 0, NULL, (LPBYTE)path, dwPathSize); RegCloseKey(hKey_sw); if (ERROR_SUCCESS == nError) { return true; } } } return false; } /* On windows we are looking for CMRT DLL in driver store directory Driver writes 'DriverStorePathForMDF' reg key during install. Use path from driver to load igfx*cmrt*.dll */ void* cm_dll_load(const vm_char *so_file_name) { //mfx_trace_get_reg_string void* handle = NULL; TCHAR path[MAX_PATH] = _T(""); DWORD size = sizeof(path); /* check error(s) */ if (NULL == so_file_name) return NULL; /* try to load from DriverStore, UWD/HKR path */ if (GetMDFDriverStorePath(path, &size)) { wcscat_s(path, MAX_PATH, _T("\\")); wcscat_s(path, MAX_PATH, so_file_name); handle = so_load(path); } return handle; } INT CreateCmDevice(CmDevice *& pD, UINT & version, IDirect3DDeviceManager9 * pD3DDeviceMgr, UINT mode ) { CmDeviceImpl * device = new CmDeviceImpl; device->m_platform = DX9; device->m_dll = cm_dll_load(DLL_NAME_DX9); if (device->m_dll == 0) { delete device; return CM_FAILURE; } CreateCmDeviceDx9FuncTypeEx createFunc = (CreateCmDeviceDx9FuncTypeEx)so_get_addr(device->m_dll, FUNC_NAME_CREATE_CM_DEVICE_EX); if (createFunc == 0) { delete device; return CM_FAILURE; } INT res = createFunc(device->m_dx9, version, pD3DDeviceMgr, mode); if (res != CM_SUCCESS) { delete device; return CM_FAILURE; } pD = device; return CM_SUCCESS; } INT CreateCmDevice(CmDevice* &pD, UINT& version, ID3D11Device * pD3D11Device, UINT mode ) { CmDeviceImpl * device = new CmDeviceImpl; device->m_platform = DX11; device->m_dll = cm_dll_load(DLL_NAME_DX11); if (device->m_dll == 0) { delete device; return CM_FAILURE; } CreateCmDeviceDx11FuncTypeEx createFunc = (CreateCmDeviceDx11FuncTypeEx)so_get_addr(device->m_dll, FUNC_NAME_CREATE_CM_DEVICE_EX); if (createFunc == 0) { delete device; return CM_FAILURE; } INT res = createFunc(device->m_dx11, version, pD3D11Device, mode); if (res != CM_SUCCESS) { delete device; return CM_FAILURE; } pD = device; return CM_SUCCESS; } #else /* #ifdef CM_WIN */ INT CreateCmDevice(CmDevice *& pD, UINT & version, VADisplay va_dpy, UINT mode) { CmDeviceImpl * device = new CmDeviceImpl; device->m_platform = VAAPI; device->m_dll = so_load(DLL_NAME_LINUX); if (device->m_dll == 0) { delete device; return CM_FAILURE; } CreateCmDeviceLinuxFuncTypeEx createFunc = (CreateCmDeviceLinuxFuncTypeEx)so_get_addr(device->m_dll, FUNC_NAME_CREATE_CM_DEVICE_EX); if (createFunc == 0) { delete device; return CM_FAILURE; } INT res = createFunc(device->m_linux, version, va_dpy, mode); if (res != CM_SUCCESS) { delete device; return CM_FAILURE; } pD = device; return CM_SUCCESS; } #endif /* #ifdef CM_WIN */ INT DestroyCmDevice(CmDevice *& pD) { CmDeviceImpl * device = (CmDeviceImpl *)pD; if (pD == 0 || device->m_dll == 0) return CM_SUCCESS; INT res = CM_SUCCESS; if (void* destroyFunc = so_get_addr(device->m_dll, FUNC_NAME_DESTROY_CM_DEVICE)) { switch (device->GetPlatform()) { #if defined(CM_WIN) case DX9: res = ((DestroyCmDeviceDx9FuncType)destroyFunc)(device->m_dx9); break; case DX11: res = ((DestroyCmDeviceDx11FuncType)destroyFunc)(device->m_dx11); break; #else case VAAPI: res = ((DestroyCmDeviceVAAPIFuncType)destroyFunc)(device->m_linux); break; #endif } } so_free(device->m_dll); device->m_dll = 0; #if defined(CM_WIN) device->m_dx9 = 0; device->m_dx11 = 0; #else device->m_linux = 0; #endif delete device; pD = 0; return res; } int ReadProgram(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len) { #ifdef CMRT_EMU (void)buffer; (void)len; return device->LoadProgram(0, 0, program, "nojitter"); #else //CMRT_EMU return device->LoadProgram((void *)buffer, len, program, "nojitter"); #endif //CMRT_EMU } int ReadProgramJit(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len) { #ifdef CMRT_EMU (void)buffer; (void)len; return device->LoadProgram(0, 0, program); #else //CMRT_EMU return device->LoadProgram((void *)buffer, len, program); #endif //CMRT_EMU } int CreateKernel(CmDevice * device, CmProgram * program, const char * kernelName, const void * fncPnt, CmKernel *& kernel, const char * options) { #ifdef CMRT_EMU return device->CreateKernel(program, kernelName, fncPnt, kernel, options); #else //CMRT_EMU (void)fncPnt; return device->CreateKernel(program, kernelName, kernel, options); #endif //CMRT_EMU } CmEvent *CM_NO_EVENT = ((CmEvent *)(-1)); #if defined(__clang__) #pragma clang diagnostic pop #else #if defined(__GNUC__) #pragma GCC diagnostic pop #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/cmrt_cross_platform/src/cmrt_utility.cpp000066400000000000000000000031541443134507600332650ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "cmrt_utility.h" #include void* so_load(const vm_char* so_file_name) { /* check error(s) */ if (NULL == so_file_name) return NULL; return dlopen(so_file_name, RTLD_LAZY); } void* so_get_addr(void* so_handle, const char* so_func_name) { /* check error(s) */ if (NULL == so_handle) return nullptr; return dlsym(so_handle, so_func_name); } void so_free(void* so_handle) { /* check error(s) */ if (NULL == so_handle) return; dlclose(so_handle); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/000077500000000000000000000000001443134507600241165ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/README.md000066400000000000000000000017361443134507600254040ustar00rootroot00000000000000# Intel® oneVPL GPU Runtime Shaders This folder contains Shaders (EU Kernels) used in Intel® Media SDK library and some helper tools to rebuild them. Shaders are provided in 2 forms: 1. Pre-Built c-array 2. CM language sources See also: [Media SDK Binary Kernels](https://github.com/Intel-Media-SDK/MediaSDK/wiki/Media-SDK-Binary-Kernels) wiki page. By default oneVPL library is built against pre-built Shaders. Optionally it is possible to rebuild them from sources configuring with: ```sh cmake -DBUILD_KERNELS=ON ... ``` ## Shaders rebuild prerequisites In order to rebuild the Shaders it is required to have CM compiler (aka CMC) and GenX_IR compiler from Intel Graphics Compiler (aka IGC). They can me downloaded and installed from here: * https://github.com/intel/cm-compiler * https://github.com/intel/intel-graphics-compiler Once you have built CMC and IGC make sure that `cmc` and `GenX_IR` are in the search path: ```sh export PATH=/path/to/cmc:/path/to/GenX_IR:$PATH ``` oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/000077500000000000000000000000001443134507600246645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/isa/000077500000000000000000000000001443134507600254405ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/isa/genx_scd_gen12lp_isa.cpp000066400000000000000000003567451443134507600321460ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_scd_gen12lp_isa.h" const unsigned char genx_scd_gen12lp[23928] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x04,0x00,0x10,0x53,0x75,0x62,0x53,0x61,0x6d,0x70, 0x6c,0x65,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x70,0xb5,0x00,0x00,0x00,0x30,0x12,0x00, 0x00,0xb7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xe5,0x12,0x00,0x00,0x40, 0x08,0x00,0x00,0x10,0x53,0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x6f,0x69, 0x6e,0x74,0x5f,0x74,0x25,0x1b,0x00,0x00,0x14,0x12,0x00,0x00,0x27,0x23,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x0c,0x39,0x2d,0x00,0x00,0x48,0x08,0x00,0x00,0x10,0x53, 0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x62,0x81, 0x35,0x00,0x00,0x7b,0x12,0x00,0x00,0x96,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x0c,0xfc,0x47,0x00,0x00,0x78,0x08,0x00,0x00,0x0d,0x73,0x75,0x72,0x66,0x61,0x63, 0x65,0x43,0x6f,0x70,0x79,0x5f,0x59,0x74,0x50,0x00,0x00,0xb4,0x09,0x00,0x00,0x58, 0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x28,0x5a,0x00,0x00,0x50,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70, 0x6c,0x65,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x70,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30, 0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73, 0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72, 0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67, 0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00, 0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33, 0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30, 0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00, 0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34, 0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30, 0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00, 0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35, 0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30, 0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00, 0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36, 0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30, 0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00, 0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36, 0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30, 0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00, 0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37, 0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30, 0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00, 0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38, 0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30, 0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00, 0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39, 0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30, 0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00, 0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30, 0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30, 0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00, 0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30, 0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30, 0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00, 0x50,0x30,0x31,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x6f,0x69, 0x6e,0x74,0x5f,0x70,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34, 0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69, 0x6d,0x70,0x6c,0x5f,0x75,0x64,0x69,0x76,0x6a,0x6a,0x2e,0x32,0x5f,0x42,0x42,0x5f, 0x31,0x5f,0x32,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73, 0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00, 0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x00,0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x20,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x20, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x20,0x01,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x20,0x01,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x20,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x20,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x20,0x01,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x01,0x00, 0x6e,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x6f,0x00,0x00,0x00,0x01,0x00,0x00,0x70, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00, 0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00, 0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x4c,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00, 0x21,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x4b,0x00,0x00,0x00,0x34,0x00,0x04, 0x00,0xcc,0x09,0x00,0x00,0x64,0x08,0x00,0x00,0x03,0x00,0x71,0x00,0x00,0x00,0x0e, 0x67,0x65,0x6e,0x78,0x5f,0x73,0x63,0x64,0x5f,0x30,0x2e,0x61,0x73,0x6d,0x72,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x00,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x2f,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01, 0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00, 0x06,0x00,0x01,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x06,0x00,0x02,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x63,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x07, 0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01, 0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x3b,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x00,0x08,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06, 0x00,0x01,0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x67,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x68,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x00, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0c,0x00, 0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00, 0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x45,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x00,0x0d,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00, 0x01,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37, 0x00,0x06,0x00,0x01,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0f,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x10,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x00,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x54,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x54,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x03,0x02,0x01,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x01,0x00,0x00,0x59,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff, 0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0xc6,0x01,0x24,0x00,0x00, 0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0xe6,0x01,0x24,0x00,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0xd5,0x01,0xc4,0x01,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x61,0x02,0x00,0x00,0x60,0x01,0x05,0x02,0xe4,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x20,0x01,0x25,0x02,0xd4,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0xc4,0x06,0x00,0x00,0x00, 0x00,0x10,0x06,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x45,0x02,0x64,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x01,0x84,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x65,0x01,0x44,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0xc4,0x06,0x00,0x00,0x00, 0x00,0xd0,0x05,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x02,0x00, 0x05,0x01,0x00,0x01,0x00,0x69,0x07,0x02,0x68,0x92,0x02,0x41,0x00,0x67,0x02,0x02, 0x68,0xe2,0x02,0x11,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0x64,0x01,0x00, 0x01,0x84,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x44,0x02,0x00, 0x01,0xd4,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x02,0x00, 0x01,0xd4,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x01,0x00, 0x06,0x84,0x02,0x00,0x00,0x61,0x00,0x16,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x40,0x04,0x00, 0x00,0x60,0x06,0x25,0x16,0x64,0x02,0x00,0x06,0x44,0x02,0x00,0x00,0x61,0x00,0x16, 0xa2,0x38,0x00,0x01,0x00,0x61,0x05,0x16,0x62,0x00,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x02,0x04,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa0,0x03, 0x80,0x00,0x00,0x05,0x17,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x70,0x02,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x02,0xa4,0x02,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa1,0x03, 0x80,0x00,0x00,0x05,0x18,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x68,0x02,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x02,0xc4,0x02,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa2,0x03, 0x80,0x00,0x00,0x05,0x19,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x80,0x02,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x03,0xe4,0x02,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa3,0x03, 0x80,0x00,0x00,0x05,0x1a,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x20,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x03,0x24,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x05,0x1b,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x40,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x03,0x44,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x05,0x1c,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x78,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x03,0x64,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x1d,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x58,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x03,0x84,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa7,0x03, 0x80,0x00,0x00,0x05,0x1e,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x70,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x03,0xa4,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x05,0x1f,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x68,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x03,0xc4,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa9,0x03, 0x80,0x00,0x00,0x05,0x20,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x80,0x03,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x04,0xe4,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xaa,0x03, 0x80,0x00,0x00,0x05,0x21,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x20,0x04,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x04,0x24,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x05,0x22,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x40,0x04,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x04,0x44,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xac,0x03, 0x80,0x00,0x00,0x05,0x23,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x78,0x04,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x04,0x64,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xad,0x03, 0x80,0x00,0x00,0x05,0x24,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x58,0x04,0x11,0x00,0x61,0x20,0x02, 0x80,0x00,0x00,0x05,0x04,0x05,0x17,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xae,0x03, 0x80,0x00,0x00,0x05,0x25,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x3e,0x00, 0x00,0x60,0x06,0x05,0x16,0x84,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x61,0x21,0x02, 0x80,0x00,0x00,0x05,0x05,0x05,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xaf,0x03, 0x80,0x00,0x00,0x05,0x26,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x7f, 0x64,0x00,0x00,0x10,0x00,0x61,0x22,0x02,0x80,0x00,0x00,0x05,0x06,0x05,0x19,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x06,0x14,0x04,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x0e,0x14,0x04,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x02,0x80,0x00,0x00,0x05,0x07,0x05,0x1a,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x3f,0x00,0x80,0xa0,0x4a,0x45,0x16,0x00,0x00,0x00, 0x00,0x0f,0x00,0x00,0x00,0x61,0x00,0x16,0x62,0x58,0x02,0x11,0x00,0x61,0x24,0x02, 0x80,0x00,0x00,0x05,0x08,0x05,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x16, 0x62,0xc8,0x02,0x11,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x80,0x0a,0x02,0x61,0x25,0x02,0x80,0x00,0x00,0x05,0x09,0x05,0x1c,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x16,0x14,0x04,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x1e,0x14,0x04,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x80,0x00,0x00,0x05,0x0a,0x05,0x1d,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x26,0x14,0x04,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x2e,0x14,0x04,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x27,0x02,0x80,0x00,0x00,0x05,0x0b,0x05,0x1e,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x36,0x14,0x04,0x0a,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x3e,0x14,0x04,0x0b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x28,0x02,0x80,0x00,0x00,0x05,0x0c,0x05,0x1f,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x46,0x14,0x04,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x29,0x02,0x80,0x00,0x00,0x05,0x0d,0x05,0x20,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x4e,0x14,0x04,0x0d,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2a,0x02,0x80,0x00,0x00,0x05,0x0e,0x05,0x21,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x56,0x14,0x04,0x0e,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2b,0x02,0x80,0x00,0x00,0x05,0x0f,0x05,0x22,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x5e,0x14,0x04,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x02,0x80,0x00,0x00,0x05,0x10,0x05,0x23,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x66,0x14,0x04,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2d,0x02,0x80,0x00,0x00,0x05,0x11,0x05,0x24,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x6e,0x14,0x04,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2e,0x02,0x80,0x00,0x00,0x05,0x12,0x05,0x25,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x76,0x14,0x04,0x12,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x2f,0x02,0x80,0x00,0x00,0x05,0x13,0x05,0x26,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x7e,0x14,0x04,0x13,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x16,0x00, 0xc0,0x0c,0x14,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20, 0x70,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00, 0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00, 0x01,0x30,0x00,0x30,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x45,0x06,0xa4,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0xa8,0x38,0x00,0xc1,0xb4,0x38,0xa1,0x00, 0x00,0xa0,0x0a,0x85,0x06,0x44,0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x02,0xc5,0x04,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xa1,0x00, 0x00,0xa0,0x02,0x84,0x06,0x84,0x06,0x02,0x02,0x44,0x05,0x84,0x06,0x61,0x00,0x00, 0x00,0x60,0x0a,0xa5,0x04,0x44,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0x60,0x0a,0xe5,0x04,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00, 0x00,0xa0,0x0a,0x65,0x05,0x84,0x06,0x00,0x0a,0xc4,0x04,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0xa5,0x04,0xa4,0x01,0x00,0x06,0xa4,0x04,0x00,0x02,0x40,0x03,0x00, 0x00,0x60,0x06,0xe5,0x04,0x64,0x01,0x00,0x06,0xe4,0x04,0x00,0x02,0x61,0x03,0x00, 0x00,0x60,0x0a,0x85,0x05,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0xa0,0x02,0xc5,0x05,0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0xa0,0x02,0x25,0x05,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0xa0,0x02,0xa5,0x05,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x80,0x90,0x49,0x65,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02,0x00, 0x00,0xa0,0x02,0x44,0x06,0xc4,0x04,0x82,0x02,0xa4,0x05,0x44,0x06,0x5b,0x04,0x00, 0x00,0xa0,0x02,0xc4,0x05,0x24,0x05,0x82,0x02,0xa4,0x05,0xc4,0x05,0x40,0x01,0x00, 0x00,0xa0,0x0a,0x45,0x06,0x44,0x06,0x00,0x0a,0xc4,0x05,0x00,0x00,0x41,0x01,0x00, 0x00,0xa0,0x0a,0x85,0x06,0x84,0x06,0x00,0x0a,0x44,0x06,0x00,0x00,0x61,0x01,0x00, 0x00,0x60,0x0a,0x25,0x06,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00, 0x00,0x60,0x06,0x25,0x06,0x24,0x06,0x00,0x06,0x84,0x05,0x00,0x00,0x41,0x01,0x00, 0x80,0x60,0x06,0x01,0x20,0x24,0x06,0x00,0x01,0xa4,0x01,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x15,0x24,0x06,0x00,0x06,0xa4,0x01,0x00,0x00,0x40,0x01,0x01, 0xa8,0xe2,0x01,0x31,0x15,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x64,0x01,0x00, 0x42,0xa4,0x01,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0xe5,0x05,0x64,0x06,0x00, 0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x06,0x00, 0x06,0xe4,0x05,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00, 0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0xc4,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70, 0x6c,0x65,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x74,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30, 0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73, 0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72, 0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67, 0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00, 0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33, 0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30, 0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00, 0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34, 0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30, 0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00, 0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35, 0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30, 0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00, 0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36, 0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30, 0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00, 0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36, 0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30, 0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00, 0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37, 0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30, 0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00, 0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38, 0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30, 0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00, 0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39, 0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30, 0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00, 0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30, 0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30, 0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00, 0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30, 0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30, 0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00, 0x50,0x30,0x31,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x6f,0x69, 0x6e,0x74,0x5f,0x74,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34, 0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69, 0x6d,0x70,0x6c,0x5f,0x75,0x64,0x69,0x76,0x6a,0x6a,0x2e,0x31,0x5f,0x42,0x42,0x5f, 0x31,0x5f,0x32,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73, 0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00, 0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x00,0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x20,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x20, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x20,0x01,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x20,0x01,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x20,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x20,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x20,0x01,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x01,0x00, 0x6e,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x6f,0x00,0x00,0x00,0x01,0x00,0x00,0x70, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00, 0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00, 0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x4c,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00, 0x21,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x4b,0x00,0x00,0x00,0x34,0x00,0x04, 0x00,0xb0,0x09,0x00,0x00,0x64,0x08,0x00,0x00,0x03,0x00,0x71,0x00,0x00,0x00,0x0e, 0x67,0x65,0x6e,0x78,0x5f,0x73,0x63,0x64,0x5f,0x31,0x2e,0x61,0x73,0x6d,0x72,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x2d,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00, 0x01,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x2f,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37, 0x00,0x06,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x00,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x62, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01, 0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00, 0x06,0x00,0x01,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x66,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0a,0x00,0x02,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x67,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x41, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0b, 0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06, 0x00,0x01,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x49,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x0f,0x00,0x02,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x10,0x01,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a, 0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c, 0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x58,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0x01,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x01,0x00,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0xc6, 0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0xe6, 0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0xd5, 0x01,0xc4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x02,0x00,0x00,0x60,0x01,0x05, 0x02,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x20,0x01,0x25, 0x02,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0xc4, 0x06,0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x45, 0x02,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5, 0x01,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x65, 0x01,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0xc4, 0x06,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x69,0x07,0x02,0x68,0x92,0x02,0x41, 0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x02,0x00,0x05,0x01,0x00,0x01, 0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0x64,0x01,0x00,0x01,0x84,0x02,0x00, 0x00,0x41,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x44,0x02,0x00,0x01,0xd4,0x01,0x00, 0x00,0x65,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x02,0x00,0x01,0xd4,0x01,0x00, 0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x01,0x00,0x06,0x84,0x02,0x00, 0x00,0x61,0x00,0x16,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x16,0x64,0x02,0x00,0x06,0x44,0x02,0x00,0x00,0x61,0x00,0x16,0xa2,0x38,0x00,0x01, 0x00,0x61,0x05,0x16,0x62,0x00,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5, 0x02,0x04,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05, 0x17,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x70,0x02,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x02,0xa4,0x02,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x68,0x02,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x02,0xc4,0x02,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x19,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x80,0x02,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x02,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x1a,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x20,0x03,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x03,0x24,0x03,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x1b,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x40,0x03,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x03,0x44,0x03,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x78,0x03,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x03,0x64,0x03,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x1d,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x58,0x03,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x03,0x84,0x03,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x70,0x03,0x11, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x03,0xa4,0x03,0x00,0x06,0x64,0x01,0x00, 0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x1f,0x04,0x16,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x68,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5, 0x03,0xc4,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05, 0x20,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x80,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x04,0xe4,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05, 0x21,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x20,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x04,0x24,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05, 0x22,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x40,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65, 0x04,0x44,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x05, 0x23,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x78,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x04,0x64,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x05, 0x24,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x01,0x16,0x62,0x58,0x04,0x11,0x00,0x61,0x20,0x02,0x80,0x00,0x00,0x05, 0x04,0x05,0x17,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xae,0x03,0x80,0x00,0x00,0x05, 0x25,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x3e,0x00,0x00,0x60,0x06,0x05, 0x16,0x84,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x61,0x21,0x02,0x80,0x00,0x00,0x05, 0x05,0x05,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xaf,0x03,0x80,0x00,0x00,0x05, 0x26,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10, 0x00,0x61,0x22,0x02,0x80,0x00,0x00,0x05,0x06,0x05,0x19,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x06,0x14,0x04,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x0e,0x14,0x04,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x23,0x02,0x80,0x00,0x00,0x05,0x07,0x05,0x1a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x3f,0x00,0x80,0xa0,0x4a,0x45,0x16,0x00,0x00,0x00,0x00,0x0f,0x00,0x00, 0x00,0x61,0x00,0x16,0x62,0x58,0x02,0x11,0x00,0x61,0x24,0x02,0x80,0x00,0x00,0x05, 0x08,0x05,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x16,0x62,0xc8,0x02,0x11, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a, 0x02,0x61,0x25,0x02,0x80,0x00,0x00,0x05,0x09,0x05,0x1c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x16,0x14,0x04,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x1e,0x14,0x04,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x26,0x02,0x80,0x00,0x00,0x05,0x0a,0x05,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x26,0x14,0x04,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x2e,0x14,0x04,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x27,0x02,0x80,0x00,0x00,0x05,0x0b,0x05,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x36,0x14,0x04,0x0a,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x3e,0x14,0x04,0x0b,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x28,0x02,0x80,0x00,0x00,0x05,0x0c,0x05,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x46,0x14,0x04,0x0c,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x29,0x02,0x80,0x00,0x00,0x05,0x0d,0x05,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x4e,0x14,0x04,0x0d,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2a,0x02,0x80,0x00,0x00,0x05,0x0e,0x05,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x56,0x14,0x04,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2b,0x02,0x80,0x00,0x00,0x05,0x0f,0x05,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x5e,0x14,0x04,0x0f,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2c,0x02,0x80,0x00,0x00,0x05,0x10,0x05,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x66,0x14,0x04,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2d,0x02,0x80,0x00,0x00,0x05,0x11,0x05,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x6e,0x14,0x04,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2e,0x02,0x80,0x00,0x00,0x05,0x12,0x05,0x25,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x76,0x14,0x04,0x12,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x2f,0x02,0x80,0x00,0x00,0x05,0x13,0x05,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x7e,0x14,0x04,0x13,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x16,0x00,0xc0,0x0c,0x14,0x00, 0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff, 0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30, 0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x45,0x06,0xa4,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0xa8,0x38,0x00,0xc1,0xb4,0x38,0xa1,0x00,0x00,0xa0,0x0a,0x85, 0x06,0x44,0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x02,0xc5, 0x04,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xa1,0x00,0x00,0xa0,0x02,0x84, 0x06,0x84,0x06,0x02,0x02,0x44,0x05,0x84,0x06,0x61,0x00,0x00,0x00,0x60,0x0a,0xa5, 0x04,0x44,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a,0xe5, 0x04,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x65, 0x05,0x84,0x06,0x00,0x0a,0xc4,0x04,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0xa5, 0x04,0xa4,0x01,0x00,0x06,0xa4,0x04,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06,0xe5, 0x04,0x64,0x01,0x00,0x06,0xe4,0x04,0x00,0x02,0x61,0x03,0x00,0x00,0x60,0x0a,0x85, 0x05,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0xa0,0x02,0xc5, 0x05,0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0xa0,0x02,0x25, 0x05,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0xa0,0x02,0xa5, 0x05,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x65, 0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02,0x00,0x00,0xa0,0x02,0x44, 0x06,0xc4,0x04,0x82,0x02,0xa4,0x05,0x44,0x06,0x5b,0x04,0x00,0x00,0xa0,0x02,0xc4, 0x05,0x24,0x05,0x82,0x02,0xa4,0x05,0xc4,0x05,0x40,0x01,0x00,0x00,0xa0,0x0a,0x45, 0x06,0x44,0x06,0x00,0x0a,0xc4,0x05,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0x85, 0x06,0x84,0x06,0x00,0x0a,0x44,0x06,0x00,0x00,0x61,0x01,0x00,0x00,0x60,0x0a,0x25, 0x06,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x25, 0x06,0x24,0x06,0x00,0x06,0x84,0x05,0x00,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01, 0x20,0x24,0x06,0x00,0x01,0xa4,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05, 0x15,0x24,0x06,0x00,0x06,0xa4,0x01,0x00,0x00,0x40,0x01,0x01,0xa8,0xe2,0x01,0x31, 0x15,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x64,0x01,0x00,0x42,0xa4,0x01,0x00, 0x00,0x62,0x07,0x00,0x01,0x60,0x85,0xe5,0x05,0x64,0x06,0x00,0x05,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x06,0x00,0x06,0xe4,0x05,0x00, 0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff, 0xff,0x2d,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x6f, 0x69,0x6e,0x74,0x5f,0x62,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72, 0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72, 0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66, 0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63, 0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63, 0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53, 0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00, 0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33, 0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30, 0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00, 0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34, 0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30, 0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00, 0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35, 0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30, 0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00, 0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35, 0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30, 0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00, 0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36, 0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30, 0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00, 0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37, 0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30, 0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00, 0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38, 0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30, 0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00, 0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39, 0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30, 0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00, 0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39, 0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30, 0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00, 0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30, 0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30, 0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00, 0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31, 0x34,0x00,0x50,0x30,0x31,0x00,0x53,0x75,0x62,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50, 0x6f,0x69,0x6e,0x74,0x5f,0x62,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a, 0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63, 0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x75,0x64,0x69,0x76,0x6a,0x6a,0x5f,0x42,0x42,0x5f, 0x31,0x5f,0x32,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73, 0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00, 0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x54, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x00,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x00,0x00,0x00,0x20,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x20,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x20, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x20,0x01,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x20,0x01,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x20,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x20,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x20,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x20,0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00, 0x00,0x20,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x6f, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x71,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20, 0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00, 0x00,0x28,0x00,0x04,0x00,0x00,0x4d,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x21, 0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x4c,0x00,0x00,0x00,0x34,0x00,0x04,0x00, 0x04,0x0a,0x00,0x00,0x77,0x08,0x00,0x00,0x03,0x00,0x72,0x00,0x00,0x00,0x0e,0x67, 0x65,0x6e,0x78,0x5f,0x73,0x63,0x64,0x5f,0x32,0x2e,0x61,0x73,0x6d,0x73,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00, 0x01,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x2e,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37, 0x00,0x06,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x62, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x36,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x05,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01, 0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x38,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00, 0x06,0x00,0x01,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4b,0x00,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x66,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x09,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x67,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x40, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x0a, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x00,0x0b,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06, 0x00,0x01,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x01,0x01,0x00,0x6c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x00, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x0f,0x00, 0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x10,0x01, 0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x4e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x50,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00, 0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x55,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x59,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0x01,0x00,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00, 0x01,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80, 0x10,0x82,0xc6,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80, 0x10,0x82,0xe6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80, 0x10,0x81,0xd5,0x01,0xc4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x02,0x00,0x00, 0x60,0x01,0x05,0x02,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00, 0x20,0x01,0x25,0x02,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00, 0x00,0x40,0x44,0x07,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x45,0x02,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xa5,0x01,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x65,0x01,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x03,0x00, 0x00,0x40,0x44,0x07,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x65,0x04,0x00,0x00, 0x60,0x86,0x65,0x02,0x44,0x02,0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00, 0x60,0x81,0x85,0x02,0xd4,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x69,0x07,0x02,0x68, 0xaa,0x02,0x41,0x00,0x67,0x03,0x02,0x68,0xe2,0x02,0x11,0x00,0x67,0x03,0x00,0x00, 0x60,0x86,0x85,0x02,0x84,0x02,0x00,0x05,0x01,0x00,0x01,0x00,0x41,0x03,0x00,0x80, 0x60,0x06,0x01,0x20,0x64,0x01,0x00,0x01,0xa4,0x02,0x00,0x00,0x41,0x00,0x00,0x00, 0x60,0x06,0x45,0x02,0x44,0x02,0x00,0x01,0xd4,0x01,0x00,0x00,0x66,0x03,0x00,0x00, 0x60,0x06,0x85,0x02,0x84,0x02,0x00,0x06,0x64,0x02,0x00,0x00,0x49,0x00,0x00,0x00, 0x60,0x06,0x05,0x03,0x64,0x01,0x00,0x06,0xa4,0x02,0x00,0x00,0x61,0x00,0x16,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02, 0x00,0x00,0x19,0x02,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x16,0x84,0x02,0x00,0x06, 0x44,0x02,0x00,0x00,0x61,0x00,0x16,0xa2,0x38,0x00,0x01,0x00,0x61,0x05,0x16,0x62, 0x00,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x02,0x04,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x17,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x68,0x02,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x02,0xc4,0x02,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x80,0x02,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x02,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x19,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x20,0x03,0x11,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x45,0x03,0x24,0x03,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa3,0x03,0x80, 0x00,0x00,0x05,0x1a,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8, 0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x40,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x03,0x44,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x1b,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x78,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x03,0x64,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x58,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x03,0x84,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x1d,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x70,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x03,0xa4,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x68,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x03,0xc4,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x1f,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x80,0x03,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x04,0xe4,0x03,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x20,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x20,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x04,0x24,0x04,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x21,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x40,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x04,0x44,0x04,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x22,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62, 0x78,0x04,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x04,0x64,0x04,0x00,0x06, 0x64,0x01,0x00,0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x05,0x23,0x04,0x16,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x58,0x04,0x11,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0xa5,0x04,0x84,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xad,0x03,0x80, 0x00,0x00,0x05,0x24,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x3d,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x01,0x16,0x62,0x70,0x04,0x11,0x00,0x61,0x20,0x02,0x80, 0x00,0x00,0x05,0x04,0x05,0x17,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xae,0x03,0x80, 0x00,0x00,0x05,0x25,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x3e,0x00,0x00, 0x60,0x06,0x05,0x16,0xa4,0x04,0x00,0x06,0x64,0x01,0x00,0x00,0x61,0x21,0x02,0x80, 0x00,0x00,0x05,0x05,0x05,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xaf,0x03,0x80, 0x00,0x00,0x05,0x26,0x04,0x16,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64, 0x00,0x00,0x10,0x00,0x61,0x22,0x02,0x80,0x00,0x00,0x05,0x06,0x05,0x19,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x06,0x14,0x04,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x0e,0x14,0x04,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x23,0x02,0x80,0x00,0x00,0x05,0x07,0x05,0x1a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x3f,0x00,0x80,0xa0,0x4a,0x45,0x16,0x00,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x61,0x00,0x16,0x62,0x70,0x02,0x11,0x00,0x61,0x24,0x02,0x80, 0x00,0x00,0x05,0x08,0x05,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x16,0x62, 0xc8,0x02,0x11,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x61,0x25,0x02,0x80,0x00,0x00,0x05,0x09,0x05,0x1c,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x16,0x14,0x04,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x1e,0x14,0x04,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x80,0x00,0x00,0x05,0x0a,0x05,0x1d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x26,0x14,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x2e,0x14,0x04,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x27,0x02,0x80,0x00,0x00,0x05,0x0b,0x05,0x1e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x36,0x14,0x04,0x0a,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x3e,0x14,0x04,0x0b,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x28,0x02,0x80,0x00,0x00,0x05,0x0c,0x05,0x1f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x46,0x14,0x04,0x0c,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x29,0x02,0x80,0x00,0x00,0x05,0x0d,0x05,0x20,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x4e,0x14,0x04,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2a,0x02,0x80,0x00,0x00,0x05,0x0e,0x05,0x21,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x56,0x14,0x04,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2b,0x02,0x80,0x00,0x00,0x05,0x0f,0x05,0x22,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x5e,0x14,0x04,0x0f,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2c,0x02,0x80,0x00,0x00,0x05,0x10,0x05,0x23,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x66,0x14,0x04,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2d,0x02,0x80,0x00,0x00,0x05,0x11,0x05,0x24,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x6e,0x14,0x04,0x11,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2e,0x02,0x80,0x00,0x00,0x05,0x12,0x05,0x25,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x76,0x14,0x04,0x12,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x2f,0x02,0x80,0x00,0x00,0x05,0x13,0x05,0x26,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x7e,0x14,0x04,0x13,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x16,0x00,0xc0, 0x0c,0x14,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01, 0x30,0x00,0x30,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x85,0x06,0xa4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0xa8,0x98,0x00,0xc1,0xb4,0x38,0xa1,0x00,0x00, 0xa0,0x0a,0xc5,0x06,0x84,0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x02,0xe5,0x04,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xa1,0x00,0x00, 0xa0,0x02,0xc4,0x06,0xc4,0x06,0x02,0x02,0x64,0x05,0xc4,0x06,0x61,0x00,0x00,0x00, 0x60,0x0a,0xc5,0x04,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00, 0x60,0x0a,0x25,0x05,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00, 0xa0,0x0a,0x85,0x05,0xc4,0x06,0x00,0x0a,0xe4,0x04,0x00,0x00,0x40,0x03,0x00,0x00, 0x60,0x06,0xc5,0x04,0xa4,0x01,0x00,0x06,0xc4,0x04,0x00,0x02,0x40,0x03,0x00,0x00, 0x60,0x06,0x25,0x05,0x64,0x01,0x00,0x06,0x24,0x05,0x00,0x02,0x61,0x03,0x00,0x00, 0x60,0x0a,0xa5,0x05,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00, 0xa0,0x02,0x45,0x06,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00, 0xa0,0x02,0x45,0x05,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00, 0xa0,0x02,0xc5,0x05,0xa4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x65,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02,0x00,0x00, 0xa0,0x02,0x84,0x06,0xe4,0x04,0x82,0x02,0xc4,0x05,0x84,0x06,0x5b,0x04,0x00,0x00, 0xa0,0x02,0x44,0x06,0x44,0x05,0x82,0x02,0xc4,0x05,0x44,0x06,0x40,0x01,0x00,0x00, 0xa0,0x0a,0x85,0x06,0x84,0x06,0x00,0x0a,0x44,0x06,0x00,0x00,0x41,0x01,0x00,0x00, 0xa0,0x0a,0xc5,0x06,0xc4,0x06,0x00,0x0a,0x84,0x06,0x00,0x00,0x61,0x01,0x00,0x00, 0x60,0x0a,0x25,0x06,0xc4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x06,0x25,0x06,0x24,0x06,0x00,0x06,0xa4,0x05,0x00,0x00,0x41,0x01,0x00,0x80, 0x60,0x06,0x01,0x20,0x24,0x06,0x00,0x01,0xa4,0x01,0x00,0x00,0x49,0x00,0x00,0x00, 0x60,0x06,0x05,0x15,0x24,0x06,0x00,0x06,0xa4,0x01,0x00,0x00,0x40,0x01,0x01,0xa8, 0xe2,0x01,0x31,0x15,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x64,0x01,0x00,0x42, 0xa4,0x01,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0xe5,0x05,0x64,0x06,0x00,0x05, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x06,0x00,0x06, 0xe4,0x05,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x2d,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x44,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43, 0x6f,0x70,0x79,0x5f,0x59,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72, 0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72, 0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66, 0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63, 0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63, 0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53, 0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00, 0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33, 0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30, 0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00, 0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34, 0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30, 0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00, 0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35, 0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30, 0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00, 0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35, 0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30, 0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00, 0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36, 0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30, 0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00, 0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37, 0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30, 0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x73,0x75,0x72,0x66,0x61,0x63, 0x65,0x43,0x6f,0x70,0x79,0x5f,0x59,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x54, 0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65, 0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65, 0x74,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x20,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x55,0x40,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x20, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x55,0x40, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x20,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x20,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x55,0x40,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x55,0x40,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x51,0x10,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x51,0x10,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x51,0x10,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x51,0x10,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x20,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x20,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x20,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x4a,0x00,0x00,0x00,0x01,0x00,0x00, 0x4b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00, 0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x77,0x04,0x00,0x00,0x3d,0x05,0x00, 0x00,0x03,0x00,0x4c,0x00,0x00,0x00,0x0e,0x67,0x65,0x6e,0x78,0x5f,0x73,0x63,0x64, 0x5f,0x33,0x2e,0x61,0x73,0x6d,0x4d,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x01, 0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x40,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x00,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x05,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x00, 0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x00,0x00,0x00,0x20,0x00,0x29,0x02,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x29,0x02, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x35,0x02, 0x29,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x02,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x02,0x35,0x02,0x29,0x02,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x02, 0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x02,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x04,0x35,0x02,0x29,0x02, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x00,0x04,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x04,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x04,0x35,0x02, 0x29,0x02,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x06,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x06,0x35,0x02,0x29,0x02,0x00,0x00, 0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x06, 0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x06,0x35,0x02,0x38,0x00,0x07,0x00,0x08,0x08,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x08,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x38,0x00,0x07,0x00, 0x08,0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x36,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x08,0x08,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x46,0x01, 0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x66,0x01, 0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x55,0x01, 0x44,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x69,0x02,0x00,0x00,0x60,0x81,0x85,0x01, 0x64,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x69,0x02,0x00,0x00,0x60,0x81,0xa5,0x01, 0x54,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x12,0x64,0x00,0x00,0x10,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x19,0x02, 0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x12,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x61,0x05,0x12,0x62,0x58,0x01,0x11,0x00,0x61,0x05,0x00,0x80,0xa0,0x0a,0x25,0x12, 0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00, 0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x02,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x30,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x01,0x00,0x01,0x00, 0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x31,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x02,0x00,0x02,0x00, 0x31,0x92,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x32,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x31,0x93,0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x33,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x04,0x00,0x04,0x00, 0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x34,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x05,0x00,0x05,0x00, 0x31,0x95,0x03,0x80,0x00,0x00,0x05,0x07,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x35,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x06,0x00,0x06,0x00, 0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x08,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x36,0x00,0x00,0x60,0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x07,0x00,0x07,0x00, 0x31,0x97,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x12,0x00,0xc0,0x00,0x00,0x00,0x00, 0x61,0x37,0x00,0x80,0xa0,0x4a,0x45,0x12,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00, 0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x12,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02, 0x01,0x21,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x0a, 0x05,0x02,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0c, 0x45,0x02,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e, 0x85,0x02,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10, 0xc5,0x02,0x42,0x00,0x00,0x00,0x00,0x00,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x22,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x05,0x04,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x45,0x04,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x85,0x04,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0xc5,0x04,0x42,0x00,0x00,0x00,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x24,0x02,0x00,0xa0,0x0a,0x05,0x0b,0x05,0x06,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x45,0x06,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x06,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0xc5,0x06,0x42,0x00,0x00,0x00,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x27,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x26,0x02,0x00,0xa0,0x0a,0x85,0x0b,0x05,0x08,0x42,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x45,0x08,0x42,0x00,0x00,0x00,0x00,0x00, 0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x12,0x00,0xc0,0x14,0x0a,0x00,0x00, 0x40,0x38,0x12,0x68,0x5a,0x01,0x81,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f, 0x85,0x08,0x42,0x00,0x00,0x00,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x12,0x00,0xc0,0x14,0x0c,0x00,0x00,0x40,0x39,0x12,0x68,0x5a,0x01,0x01,0x01, 0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0xc5,0x08,0x42,0x00,0x00,0x00,0x00,0x00, 0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x12,0x00,0xc0,0x14,0x0e,0x00,0x00, 0x40,0x3a,0x12,0x68,0x5a,0x01,0x81,0x01,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x12,0x00,0xc0,0x14,0x10,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00, 0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00 }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/isa/genx_scd_gen12lp_isa.h000066400000000000000000000023411443134507600315670ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_SCD_GEN12LP_ISA_H__ #define __GENX_SCD_GEN12LP_ISA_H__ extern const unsigned char genx_scd_gen12lp[23928]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/src/000077500000000000000000000000001443134507600254535ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/asc/src/genx_scd.cpp000066400000000000000000000164201443134507600277540ustar00rootroot00000000000000// Copyright (c) 2017-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "cm/cm.h" #include "cm/cmtl.h" #define INTERDATA_SIZE_SMALL 8 #define INTERDATA_SIZE_BIG 64 // 32x32 and 64x64 blocks #define MVDATA_SIZE 4 // mfxI16Pair #define SINGLE_MVDATA_SIZE 2 // mfxI16Pair #define MBDIST_SIZE 64 // 16*mfxU32 #define DIST_SIZE 4 #define RF_DECISION_LEVEL 10 #define SLICE(VEC, FROM, HOWMANY, STEP) ((VEC).select(FROM)) #define SLICE1(VEC, FROM, HOWMANY) SLICE(VEC, FROM, HOWMANY, 1) #define SELECT_N_ROWS(m, from, nrows) m.select(from) #define SELECT_N_COLS(m, from, ncols) m.select(0, from) #define OUT_BLOCK 16 // output pixels computed per thread /*----------------------------------------------------------------------*/ #define ROUND_UP(offset, round_to) ( ( (offset) + (round_to) - 1) &~ ((round_to) - 1 )) #define ROUND_DOWN(offset, round_to) ( (offset) &~ ( ( round_to) - 1 ) ) #define BLOCK_PIXEL_WIDTH (32) #define BLOCK_HEIGHT (8) #define BLOCK_HEIGHT_NV12 (4) #define SUB_BLOCK_PIXEL_WIDTH (8) #define SUB_BLOCK_HEIGHT (8) #define SUB_BLOCK_HEIGHT_NV12 (4) #define BLOCK_WIDTH (64) #define PADDED_BLOCK_WIDTH (128) #define PADDED_BLOCK_WIDTH_CPU_TO_GPU (80) _GENX_MAIN_ void SubSamplePoint_p(SurfaceIndex ibuf, SurfaceIndex obuf, uint in_width, uint in_height, uint out_width, uint out_height) { vector out = 0; uint ix = get_thread_origin_x(), iy = get_thread_origin_y(), step_h = in_height / out_height, step_w = in_width / out_width, nc = !(step_h % 2), cor = (iy % 2) & nc, //To deal with interlace content offset_x = (ix * step_w * OUT_BLOCK), offset_y = (iy * step_h + cor); matrix pxl; vector lumaVal; #pragma unroll(OUT_BLOCK) for (int i = 0; i < OUT_BLOCK; i++) { read(ibuf, offset_x, offset_y, pxl); out(i) = pxl(0, 0); offset_x += step_w; } write_plane(obuf, GENX_SURFACE_Y_PLANE, (ix * OUT_BLOCK), iy, out); } _GENX_MAIN_ void SubSamplePoint_t(SurfaceIndex ibuf, SurfaceIndex obuf, uint in_width, uint in_height, uint out_width, uint out_height) { vector out = 0; uint ix = get_thread_origin_x(), iy = get_thread_origin_y(), step_h = in_height / out_height, step_w = in_width / out_width, nc = (step_h % 2), cor = (iy % 2) & nc, offset_x = (ix * step_w * OUT_BLOCK), offset_y = (iy * step_h + cor); matrix pxl; matrix lumaVal; #pragma unroll(OUT_BLOCK) for (int i = 0; i < OUT_BLOCK; i++) { read(ibuf, offset_x, offset_y, pxl); out(i) = pxl(0, 0); offset_x += step_w; } write_plane(obuf, GENX_SURFACE_Y_PLANE, (ix * OUT_BLOCK), iy, out); } _GENX_MAIN_ void SubSamplePoint_b(SurfaceIndex ibuf, SurfaceIndex obuf, uint in_width, uint in_height, uint out_width, uint out_height) { vector out = 0; uint ix = get_thread_origin_x(), iy = get_thread_origin_y(), step_h = in_height / out_height, step_w = in_width / out_width, nc = !(step_h % 2), cor = !(iy % 2) | nc, offset_x = (ix * step_w * OUT_BLOCK), offset_y = (iy * step_h + cor); matrix pxl; matrix lumaVal; #pragma unroll(OUT_BLOCK) for (int i = 0; i < OUT_BLOCK; i++) { read(ibuf, offset_x, offset_y, pxl); out(i) = pxl(0, 0); offset_x += step_w; } write_plane(obuf, GENX_SURFACE_Y_PLANE, (ix * OUT_BLOCK), iy, out); } _GENX_MAIN_ void surfaceCopy_Y(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, uint width_dword, uint height, uint width_stride) { (void)width_dword; (void)height; (void)width_stride; //write Y plane matrix inData_m; vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); matrix outData0; matrix outData1; matrix outData2; matrix outData3; int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; read(INBUF_IDX, horizOffset, vertOffset, inData0); read(INBUF_IDX, horizOffset, vertOffset + 1, inData1); read(INBUF_IDX, horizOffset, vertOffset + 2, inData2); read(INBUF_IDX, horizOffset, vertOffset + 3, inData3); read(INBUF_IDX, horizOffset, vertOffset + 4, inData4); read(INBUF_IDX, horizOffset, vertOffset + 5, inData5); read(INBUF_IDX, horizOffset, vertOffset + 6, inData6); read(INBUF_IDX, horizOffset, vertOffset + 7, inData7); outData0 = inData_m.select(0, 0); outData1 = inData_m.select(0, 8); outData2 = inData_m.select(0, 16); outData3 = inData_m.select(0, 24); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset, vertOffset, outData0); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + SUB_BLOCK_PIXEL_WIDTH, vertOffset, outData1); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + SUB_BLOCK_PIXEL_WIDTH*2, vertOffset, outData2); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset + SUB_BLOCK_PIXEL_WIDTH*3, vertOffset, outData3); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/000077500000000000000000000000001443134507600266135ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/isa/000077500000000000000000000000001443134507600273675ustar00rootroot00000000000000genx_copy_kernel_gen12lp_isa.cpp000066400000000000000000333332521443134507600355510ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_copy_kernel_gen12lp_isa.h" const unsigned char genx_copy_kernel_gen12lp[1420042] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x0e,0x00,0x16,0x73,0x75,0x72,0x66,0x61,0x63,0x65, 0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x4e,0x56,0x31,0x32,0xe7, 0x02,0x00,0x00,0x3a,0x12,0x00,0x00,0x3e,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x0c,0x21,0x15,0x00,0x00,0x18,0x05,0x00,0x00,0x15,0x73,0x75,0x72,0x66,0x61,0x63, 0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f,0x4e,0x56,0x31,0x32,0x39, 0x1a,0x00,0x00,0x0d,0xd3,0x00,0x00,0x64,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x0c,0x46,0xed,0x00,0x00,0xa0,0x57,0x00,0x00,0x1c,0x73,0x75,0x72,0x66,0x61,0x63, 0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x50,0x30,0x31,0x30, 0x5f,0x73,0x68,0x69,0x66,0x74,0xe6,0x44,0x01,0x00,0x7b,0x15,0x00,0x00,0xed,0x4d, 0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x61,0x5a,0x01,0x00,0x80,0x06,0x00,0x00, 0x1d,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69, 0x74,0x65,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x33,0x32,0x78,0x33,0x32,0xe1,0x60, 0x01,0x00,0x2a,0x3a,0x00,0x00,0x83,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x0c, 0x0b,0x9b,0x01,0x00,0xc8,0x13,0x00,0x00,0x1c,0x73,0x75,0x72,0x66,0x61,0x63,0x65, 0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f, 0x33,0x32,0x78,0x33,0x32,0xd3,0xae,0x01,0x00,0x0a,0x70,0x03,0x00,0x13,0xec,0x02, 0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xdd,0x1e,0x05,0x00,0x10,0x6e,0x01,0x00,0x18, 0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f,0x77,0x72, 0x69,0x74,0x65,0x5f,0x4e,0x56,0x31,0x32,0xed,0x8c,0x06,0x00,0x4b,0x3b,0x00,0x00, 0x1d,0xa2,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x38,0xc8,0x06,0x00,0xb8,0x18, 0x00,0x00,0x1b,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72, 0x65,0x61,0x64,0x5f,0x50,0x30,0x31,0x30,0x5f,0x73,0x68,0x69,0x66,0x74,0xf0,0xe0, 0x06,0x00,0x21,0xe1,0x00,0x00,0x7c,0x30,0x07,0x00,0x00,0x00,0x00,0x00,0x01,0x0c, 0x11,0xc2,0x07,0x00,0xb0,0x5d,0x00,0x00,0x17,0x73,0x75,0x72,0x66,0x61,0x63,0x65, 0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f,0x72,0x65,0x61,0x64,0x5f,0x4e,0x56,0x31,0x32, 0xc1,0x1f,0x08,0x00,0x27,0x52,0x01,0x00,0x24,0x99,0x08,0x00,0x00,0x00,0x00,0x00, 0x01,0x0c,0xe8,0x71,0x09,0x00,0xe0,0x8f,0x00,0x00,0x19,0x53,0x75,0x72,0x66,0x61, 0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f,0x32,0x44,0x54,0x6f,0x32,0x44,0x5f, 0x4e,0x56,0x31,0x32,0xc8,0x01,0x0a,0x00,0xa7,0x2f,0x00,0x00,0x68,0x12,0x0a,0x00, 0x00,0x00,0x00,0x00,0x01,0x0c,0x6f,0x31,0x0a,0x00,0xb0,0x14,0x00,0x00,0x1c,0x53, 0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x53,0x77,0x61,0x70,0x5f,0x32, 0x44,0x54,0x6f,0x32,0x44,0x5f,0x33,0x32,0x78,0x33,0x32,0x1f,0x46,0x0a,0x00,0x4b, 0x49,0x00,0x00,0xb5,0x5d,0x0a,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x6a,0x8f,0x0a, 0x00,0xc8,0x23,0x00,0x00,0x1b,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70, 0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x73,0x77,0x61,0x70,0x5f,0x33,0x32,0x78,0x33, 0x32,0x32,0xb3,0x0a,0x00,0x29,0x73,0x00,0x00,0x66,0xda,0x0a,0x00,0x00,0x00,0x00, 0x00,0x01,0x0c,0x5b,0x26,0x0b,0x00,0xc8,0x2f,0x00,0x00,0x17,0x73,0x75,0x72,0x66, 0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x33,0x32, 0x78,0x33,0x32,0x23,0x56,0x0b,0x00,0x7c,0x31,0x00,0x00,0x9f,0x67,0x0b,0x00,0x00, 0x00,0x00,0x00,0x01,0x0c,0x9f,0x87,0x0b,0x00,0x98,0x0f,0x00,0x00,0x1a,0x73,0x75, 0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x73,0x77, 0x61,0x70,0x5f,0x33,0x32,0x78,0x33,0x32,0x37,0x97,0x0b,0x00,0xbe,0xfd,0x03,0x00, 0xe4,0xff,0x0c,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xf5,0x94,0x0f,0x00,0x70,0xc1, 0x01,0x00,0x16,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72, 0x65,0x61,0x64,0x5f,0x33,0x32,0x78,0x33,0x32,0x65,0x56,0x11,0x00,0x45,0x05,0x03, 0x00,0x5f,0x75,0x12,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xaa,0x5b,0x14,0x00,0x60, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x73,0x75,0x72,0x66,0x61, 0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x4e,0x56,0x31, 0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f, 0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00, 0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68, 0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25, 0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72, 0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32, 0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33, 0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30, 0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00, 0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34, 0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30, 0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00, 0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34, 0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30, 0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00, 0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35, 0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30, 0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00, 0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36, 0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30, 0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00, 0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37, 0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30, 0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00, 0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38, 0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30, 0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00, 0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38, 0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30, 0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00, 0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39, 0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30, 0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00, 0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30, 0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30, 0x31,0x30,0x37,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f, 0x77,0x72,0x69,0x74,0x65,0x5f,0x4e,0x56,0x31,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f, 0x31,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e, 0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61, 0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x20,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x20,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x20,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x20,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x20, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x20,0x01, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x20,0x01,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x52,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x20,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x20,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x67, 0x00,0x00,0x00,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00, 0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00, 0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00, 0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x38,0x00,0x04, 0x00,0x70,0x0a,0x00,0x00,0xca,0x07,0x00,0x00,0x03,0x00,0x69,0x00,0x00,0x00,0x16, 0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c, 0x5f,0x30,0x2e,0x61,0x73,0x6d,0x6a,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01, 0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x5a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x2f,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x3c,0x03,0x00,0x06,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c, 0x03,0x00,0x06,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00, 0x06,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00, 0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x44,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x37,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x37,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x37,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x67,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x4f,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x68,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x51,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x55,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x51,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x55,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x64,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x07,0x01,0x20,0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x59,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c, 0x00,0x6c,0x00,0x06,0x68,0x72,0x01,0x21,0x00,0x65,0x02,0x03,0x62,0x05,0x02,0xf1, 0xff,0x65,0x00,0x00,0x80,0x10,0x82,0x46,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff, 0x0f,0x69,0x02,0x00,0x00,0x60,0x81,0x05,0x04,0x04,0x03,0x00,0x05,0x03,0x00,0x03, 0x00,0x69,0x00,0x14,0x68,0x72,0x01,0x11,0x00,0x41,0x02,0x20,0x22,0x06,0x04,0x11, 0x06,0x49,0x00,0x07,0xa8,0x02,0x04,0x11,0x06,0x41,0x00,0x1a,0x68,0x72,0x01,0x31, 0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x04,0x08,0x04,0x07,0x05,0x01,0x44,0x01,0x20, 0x00,0x69,0x00,0x20,0x68,0x72,0x01,0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x08,0x21, 0x00,0x41,0x00,0x26,0x68,0x72,0x01,0x51,0x00,0x41,0x00,0x2c,0x68,0x72,0x01,0x61, 0x00,0x41,0x00,0x32,0x68,0x72,0x01,0x71,0x00,0x40,0x04,0x09,0xa8,0x0a,0x08,0x11, 0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x44,0x48, 0x02,0x61,0x02,0x0a,0x62,0x38,0x09,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x0f,0x04,0x09,0x00,0x06,0xa4,0x01,0x00,0x00,0x40,0x00,0x15,0xa8,0x3a,0x09,0x11, 0x14,0x40,0x00,0x1b,0xa8,0x3a,0x09,0x11,0x1a,0x40,0x07,0x21,0xa8,0x3a,0x09,0x11, 0x20,0x40,0x07,0x27,0xa8,0x3a,0x09,0x11,0x26,0x40,0x07,0x2d,0xa8,0x3a,0x09,0x11, 0x2c,0x40,0x07,0x33,0xa8,0x3a,0x09,0x11,0x32,0x31,0xf0,0x04,0x80,0x00,0x00,0x05, 0x0b,0x04,0x0a,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf1,0x04,0x80,0x00,0x00,0x05, 0x10,0x04,0x0f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xe2,0x04,0x80,0x00,0x00,0x05, 0x16,0x04,0x15,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x05, 0x1c,0x04,0x1b,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x05, 0x22,0x04,0x21,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x05, 0x28,0x04,0x27,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x05, 0x2e,0x04,0x2d,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x97,0x04,0x80,0x00,0x00,0x05, 0x34,0x04,0x33,0x00,0xa0,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x81,0x05, 0x05,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x61,0x00,0x58,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a, 0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x58,0x00,0x00,0x00,0x00,0x1f,0x00,0x07, 0x00,0x61,0x04,0x58,0x62,0x00,0x05,0x11,0x00,0x61,0x00,0x58,0x62,0x60,0x04,0x11, 0x00,0x40,0x00,0x59,0x68,0x02,0x05,0x01,0x02,0x40,0x00,0x5a,0x68,0x02,0x05,0x01, 0x04,0x40,0x00,0x5b,0x68,0x02,0x05,0x01,0x06,0x5b,0x00,0x00,0x00,0x60,0x86,0x04, 0x5c,0xc4,0x01,0x05,0x01,0x04,0x03,0x04,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10, 0x00,0x41,0x02,0x20,0x22,0x06,0x5c,0x11,0x06,0x49,0x00,0x5c,0xa8,0x02,0x5c,0x11, 0x06,0x5b,0x01,0x00,0x00,0x60,0x86,0x04,0x5d,0x04,0x5c,0x05,0x01,0x44,0x01,0x20, 0x00,0x69,0x01,0x5d,0x68,0x02,0x5d,0x21,0x00,0x40,0x01,0x5e,0xa8,0x0a,0x5d,0x11, 0x01,0x61,0x01,0x5f,0x62,0x38,0x5e,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x64,0x04,0x5e,0x00,0x06,0xa4,0x01,0x00,0x00,0x40,0x00,0x69,0xa8,0x3a,0x5e,0x11, 0x14,0x40,0x00,0x6e,0xa8,0x3a,0x5e,0x11,0x1a,0x61,0x20,0x38,0x61,0x00,0x0b,0x10, 0x00,0x61,0x00,0x40,0x61,0x00,0x0c,0x10,0x00,0x61,0x21,0x39,0x61,0x00,0x10,0x10, 0x00,0x61,0x00,0x41,0x61,0x00,0x11,0x10,0x00,0x61,0x22,0x3a,0x61,0x00,0x16,0x10, 0x00,0x61,0x00,0x42,0x61,0x00,0x17,0x10,0x00,0x61,0x23,0x3b,0x61,0x00,0x1c,0x10, 0x00,0x61,0x00,0x43,0x61,0x00,0x1d,0x10,0x00,0x61,0x24,0x3c,0x61,0x00,0x22,0x10, 0x00,0x61,0x00,0x44,0x61,0x00,0x23,0x10,0x00,0x61,0x25,0x3d,0x61,0x00,0x28,0x10, 0x00,0x61,0x00,0x45,0x61,0x00,0x29,0x10,0x00,0x61,0x26,0x3e,0x61,0x00,0x2e,0x10, 0x00,0x61,0x00,0x46,0x61,0x00,0x2f,0x10,0x00,0x61,0x27,0x3f,0x61,0x00,0x34,0x10, 0x00,0x61,0x00,0x47,0x61,0x00,0x35,0x10,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x44,0x38,0x00,0x00,0x61,0x38,0x58,0x62,0x00,0x59,0x11, 0x00,0x61,0x00,0x48,0x61,0x00,0x0d,0x10,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x44,0x40,0x00,0x00,0x61,0x00,0x49,0x61,0x00,0x12,0x10, 0x00,0x61,0x00,0x4a,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x4b,0x61,0x00,0x1e,0x10, 0x00,0x61,0x00,0x4c,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x4d,0x61,0x00,0x2a,0x10, 0x00,0x61,0x00,0x4e,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x4f,0x61,0x00,0x36,0x10, 0x00,0x61,0x39,0x58,0x62,0x00,0x5a,0x11,0x00,0x61,0x00,0x50,0x61,0x00,0x0e,0x10, 0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x44,0x48,0x00, 0x00,0x61,0x00,0x51,0x61,0x00,0x13,0x10,0x00,0x61,0x00,0x52,0x61,0x00,0x19,0x10, 0x00,0x61,0x00,0x53,0x61,0x00,0x1f,0x10,0x00,0x61,0x00,0x54,0x61,0x00,0x25,0x10, 0x00,0x61,0x00,0x55,0x61,0x00,0x2b,0x10,0x00,0x61,0x00,0x56,0x61,0x00,0x31,0x10, 0x00,0x61,0x00,0x57,0x61,0x00,0x37,0x10,0x00,0x61,0x3a,0x58,0x62,0x00,0x5b,0x11, 0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x44,0x50,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x44,0x48, 0x02,0x69,0x3b,0x00,0x00,0x60,0x81,0x25,0x58,0x04,0x03,0x00,0x05,0x02,0x00,0x02, 0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x58,0x00,0x00,0x00,0x00,0x1f,0x00,0x03, 0x00,0x61,0x00,0x58,0x62,0x00,0x05,0x11,0x00,0x31,0x4c,0x04,0x80,0x00,0x00,0x05, 0x60,0x04,0x5f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4d,0x04,0x80,0x00,0x00,0x05, 0x65,0x04,0x64,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4e,0x04,0x80,0x00,0x00,0x05, 0x6a,0x04,0x69,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4f,0x04,0x80,0x00,0x00,0x05, 0x6f,0x04,0x6e,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x61,0x2c,0x73,0x60,0x00,0x60,0x10, 0x00,0x61,0x00,0x75,0x60,0x00,0x62,0x10,0x00,0x61,0x2d,0x74,0x61,0x00,0x65,0x10, 0x00,0x61,0x2e,0x75,0x61,0x00,0x6a,0x10,0x00,0x61,0x2f,0x76,0x61,0x00,0x6f,0x10, 0x00,0x61,0x00,0x77,0x61,0x00,0x61,0x10,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x24,0x73,0x00,0x00,0x61,0x00,0x78,0x61,0x00,0x66,0x10, 0x00,0x61,0x00,0x79,0x61,0x00,0x6b,0x10,0x00,0x61,0x00,0x7a,0x61,0x00,0x70,0x10, 0x00,0x61,0x30,0x58,0x62,0x00,0x59,0x11,0x00,0x61,0x00,0x7b,0x61,0x00,0x62,0x10, 0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x24,0x77,0x00, 0x00,0x61,0x00,0x7c,0x61,0x00,0x67,0x10,0x00,0x61,0x00,0x7d,0x61,0x00,0x6c,0x10, 0x00,0x61,0x00,0x7e,0x61,0x00,0x71,0x10,0x00,0x61,0x31,0x58,0x62,0x00,0x5a,0x11, 0x00,0x61,0x00,0x06,0x61,0x00,0x63,0x10,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x24,0x7b,0x00,0x00,0x61,0x00,0x07,0x61,0x00,0x68,0x10, 0x00,0x61,0x00,0x08,0x61,0x00,0x6d,0x10,0x00,0x61,0x00,0x09,0x61,0x00,0x72,0x10, 0x00,0x61,0x32,0x58,0x62,0x00,0x5b,0x11,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x24,0x06,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00, 0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x73,0x75,0x72, 0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f,0x4e,0x56, 0x31,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a, 0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25, 0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25, 0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00, 0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f, 0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54, 0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30, 0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56, 0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37, 0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30, 0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56, 0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35, 0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30, 0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56, 0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33, 0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30, 0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56, 0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31, 0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30, 0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56, 0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39, 0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30, 0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56, 0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37, 0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30, 0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56, 0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35, 0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30, 0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56, 0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33, 0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30, 0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56, 0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31, 0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31, 0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56, 0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39, 0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31, 0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56, 0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37, 0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31, 0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56, 0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35, 0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31, 0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56, 0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33, 0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31, 0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56, 0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31, 0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31, 0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56, 0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39, 0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31, 0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56, 0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37, 0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31, 0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56, 0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35, 0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31, 0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56, 0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33, 0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31, 0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56, 0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31, 0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31, 0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56, 0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39, 0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31, 0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56, 0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37, 0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32, 0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56, 0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35, 0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32, 0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56, 0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33, 0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32, 0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56, 0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31, 0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32, 0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56, 0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39, 0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32, 0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56, 0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37, 0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32, 0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56, 0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35, 0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32, 0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56, 0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33, 0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32, 0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56, 0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31, 0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32, 0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56, 0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39, 0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32, 0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56, 0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37, 0x00,0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32, 0x38,0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56, 0x30,0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35, 0x00,0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32, 0x38,0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56, 0x30,0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33, 0x00,0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32, 0x39,0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56, 0x30,0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31, 0x00,0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33, 0x30,0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56, 0x30,0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39, 0x00,0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33, 0x31,0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56, 0x30,0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37, 0x00,0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33, 0x32,0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56, 0x30,0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35, 0x00,0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33, 0x32,0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56, 0x30,0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33, 0x00,0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33, 0x33,0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56, 0x30,0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31, 0x00,0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33, 0x34,0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56, 0x30,0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39, 0x00,0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33, 0x35,0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56, 0x30,0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37, 0x00,0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33, 0x36,0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56, 0x30,0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35, 0x00,0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33, 0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56, 0x30,0x33,0x37,0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33, 0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33, 0x37,0x36,0x00,0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56, 0x30,0x33,0x37,0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31, 0x00,0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33, 0x38,0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56, 0x30,0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39, 0x00,0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33, 0x39,0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56, 0x30,0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37, 0x00,0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34, 0x30,0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56, 0x30,0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35, 0x00,0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34, 0x30,0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56, 0x30,0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33, 0x00,0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34, 0x31,0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56, 0x30,0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31, 0x00,0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34, 0x32,0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56, 0x30,0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39, 0x00,0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34, 0x33,0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56, 0x30,0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37, 0x00,0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34, 0x34,0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56, 0x30,0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35, 0x00,0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34, 0x34,0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56, 0x30,0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33, 0x00,0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34, 0x35,0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56, 0x30,0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31, 0x00,0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34, 0x36,0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56, 0x30,0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39, 0x00,0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34, 0x37,0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56, 0x30,0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37, 0x00,0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34, 0x38,0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56, 0x30,0x34,0x38,0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35, 0x00,0x56,0x30,0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34, 0x38,0x38,0x00,0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56, 0x30,0x34,0x39,0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33, 0x00,0x56,0x30,0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34, 0x39,0x36,0x00,0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56, 0x30,0x34,0x39,0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31, 0x00,0x56,0x30,0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35, 0x30,0x34,0x00,0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56, 0x30,0x35,0x30,0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39, 0x00,0x56,0x30,0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35, 0x31,0x32,0x00,0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56, 0x30,0x35,0x31,0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37, 0x00,0x56,0x30,0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35, 0x32,0x30,0x00,0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56, 0x30,0x35,0x32,0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35, 0x00,0x56,0x30,0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35, 0x32,0x38,0x00,0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56, 0x30,0x35,0x33,0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33, 0x00,0x56,0x30,0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35, 0x33,0x36,0x00,0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56, 0x30,0x35,0x33,0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31, 0x00,0x56,0x30,0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35, 0x34,0x34,0x00,0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56, 0x30,0x35,0x34,0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39, 0x00,0x56,0x30,0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35, 0x35,0x32,0x00,0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56, 0x30,0x35,0x35,0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37, 0x00,0x56,0x30,0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35, 0x36,0x30,0x00,0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56, 0x30,0x35,0x36,0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35, 0x00,0x56,0x30,0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35, 0x36,0x38,0x00,0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56, 0x30,0x35,0x37,0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33, 0x00,0x56,0x30,0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35, 0x37,0x36,0x00,0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56, 0x30,0x35,0x37,0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31, 0x00,0x56,0x30,0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35, 0x38,0x34,0x00,0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56, 0x30,0x35,0x38,0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39, 0x00,0x56,0x30,0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35, 0x39,0x32,0x00,0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56, 0x30,0x35,0x39,0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37, 0x00,0x56,0x30,0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36, 0x30,0x30,0x00,0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56, 0x30,0x36,0x30,0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35, 0x00,0x56,0x30,0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36, 0x30,0x38,0x00,0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56, 0x30,0x36,0x31,0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33, 0x00,0x56,0x30,0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36, 0x31,0x36,0x00,0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56, 0x30,0x36,0x31,0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31, 0x00,0x56,0x30,0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36, 0x32,0x34,0x00,0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56, 0x30,0x36,0x32,0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39, 0x00,0x56,0x30,0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36, 0x33,0x32,0x00,0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56, 0x30,0x36,0x33,0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37, 0x00,0x56,0x30,0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36, 0x34,0x30,0x00,0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56, 0x30,0x36,0x34,0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35, 0x00,0x56,0x30,0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36, 0x34,0x38,0x00,0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56, 0x30,0x36,0x35,0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33, 0x00,0x56,0x30,0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36, 0x35,0x36,0x00,0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56, 0x30,0x36,0x35,0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31, 0x00,0x56,0x30,0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36, 0x36,0x34,0x00,0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56, 0x30,0x36,0x36,0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39, 0x00,0x56,0x30,0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36, 0x37,0x32,0x00,0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56, 0x30,0x36,0x37,0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37, 0x00,0x56,0x30,0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36, 0x38,0x30,0x00,0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56, 0x30,0x36,0x38,0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35, 0x00,0x56,0x30,0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36, 0x38,0x38,0x00,0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56, 0x30,0x36,0x39,0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33, 0x00,0x56,0x30,0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36, 0x39,0x36,0x00,0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56, 0x30,0x36,0x39,0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31, 0x00,0x56,0x30,0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37, 0x30,0x34,0x00,0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56, 0x30,0x37,0x30,0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39, 0x00,0x56,0x30,0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37, 0x31,0x32,0x00,0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56, 0x30,0x37,0x31,0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37, 0x00,0x56,0x30,0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37, 0x32,0x30,0x00,0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56, 0x30,0x37,0x32,0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35, 0x00,0x56,0x30,0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37, 0x32,0x38,0x00,0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56, 0x30,0x37,0x33,0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33, 0x00,0x56,0x30,0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37, 0x33,0x36,0x00,0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56, 0x30,0x37,0x33,0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31, 0x00,0x56,0x30,0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37, 0x34,0x34,0x00,0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56, 0x30,0x37,0x34,0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39, 0x00,0x56,0x30,0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37, 0x35,0x32,0x00,0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56, 0x30,0x37,0x35,0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37, 0x00,0x56,0x30,0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37, 0x36,0x30,0x00,0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56, 0x30,0x37,0x36,0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35, 0x00,0x56,0x30,0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37, 0x36,0x38,0x00,0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56, 0x30,0x37,0x37,0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33, 0x00,0x56,0x30,0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37, 0x37,0x36,0x00,0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56, 0x30,0x37,0x37,0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31, 0x00,0x56,0x30,0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37, 0x38,0x34,0x00,0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56, 0x30,0x37,0x38,0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39, 0x00,0x56,0x30,0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37, 0x39,0x32,0x00,0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56, 0x30,0x37,0x39,0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37, 0x00,0x56,0x30,0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38, 0x30,0x30,0x00,0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56, 0x30,0x38,0x30,0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35, 0x00,0x56,0x30,0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38, 0x30,0x38,0x00,0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56, 0x30,0x38,0x31,0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33, 0x00,0x56,0x30,0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38, 0x31,0x36,0x00,0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56, 0x30,0x38,0x31,0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31, 0x00,0x56,0x30,0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38, 0x32,0x34,0x00,0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56, 0x30,0x38,0x32,0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39, 0x00,0x56,0x30,0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38, 0x33,0x32,0x00,0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56, 0x30,0x38,0x33,0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37, 0x00,0x56,0x30,0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38, 0x34,0x30,0x00,0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56, 0x30,0x38,0x34,0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35, 0x00,0x56,0x30,0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38, 0x34,0x38,0x00,0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56, 0x30,0x38,0x35,0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33, 0x00,0x56,0x30,0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38, 0x35,0x36,0x00,0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56, 0x30,0x38,0x35,0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31, 0x00,0x56,0x30,0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38, 0x36,0x34,0x00,0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x41, 0x30,0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41, 0x30,0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41, 0x30,0x38,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50, 0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37,0x00,0x50, 0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31,0x00,0x50, 0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31,0x35,0x00,0x50, 0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31,0x39,0x00,0x50, 0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32,0x33,0x00,0x50, 0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32,0x37,0x00,0x50, 0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33,0x31,0x00,0x50, 0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33,0x35,0x00,0x50, 0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33,0x39,0x00,0x50, 0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34,0x33,0x00,0x50, 0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34,0x37,0x00,0x50, 0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35,0x31,0x00,0x73, 0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f, 0x4e,0x56,0x31,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34, 0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69, 0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x69,0x69,0x2e,0x36,0x5f,0x42,0x42,0x5f, 0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f, 0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00, 0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42, 0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f, 0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42, 0x42,0x5f,0x31,0x32,0x5f,0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34, 0x00,0x42,0x42,0x5f,0x31,0x34,0x5f,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f, 0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31, 0x37,0x5f,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42, 0x5f,0x31,0x39,0x5f,0x32,0x30,0x00,0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00, 0x42,0x42,0x5f,0x32,0x31,0x5f,0x32,0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32, 0x33,0x00,0x42,0x42,0x5f,0x32,0x33,0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34, 0x5f,0x32,0x35,0x00,0x42,0x42,0x5f,0x32,0x35,0x5f,0x32,0x36,0x00,0x42,0x42,0x5f, 0x32,0x36,0x5f,0x32,0x37,0x00,0x42,0x42,0x5f,0x32,0x37,0x5f,0x32,0x38,0x00,0x42, 0x42,0x5f,0x32,0x38,0x5f,0x32,0x39,0x00,0x42,0x42,0x5f,0x32,0x39,0x5f,0x33,0x30, 0x00,0x42,0x42,0x5f,0x33,0x30,0x5f,0x33,0x31,0x00,0x42,0x42,0x5f,0x33,0x31,0x5f, 0x33,0x32,0x00,0x42,0x42,0x5f,0x33,0x32,0x5f,0x33,0x33,0x00,0x42,0x42,0x5f,0x33, 0x33,0x5f,0x33,0x34,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41, 0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72, 0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00, 0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x79,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x89,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa9,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xba,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xca,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd8,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xda,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe9,0x00,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xea,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfa,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x19,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x01,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x79,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x89,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x98,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb8,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xba,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc8,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc9,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xca,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd8,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xda,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe8,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe9,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xea,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf9,0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfa,0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb, 0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x19,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x02,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x02,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02, 0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00, 0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00, 0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x20, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x20,0x01, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x23,0x02,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x12,0x01,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x23,0x02,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x12,0x01,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x21,0x01,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x20,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x02,0x00,0x00,0x20,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x02,0x00,0x00,0x20,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x02,0x00,0x00,0x20,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x20,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x20,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00, 0x20,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x50, 0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x20,0x01, 0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x20,0x01,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x20,0x01,0x00,0x62, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x20,0x01,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x20,0x01,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x20,0x01,0x00,0x65,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x20,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6a,0x02,0x00,0x00,0x21,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b, 0x02,0x00,0x00,0x20,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02, 0x00,0x00,0x20,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00, 0x00,0x20,0x01,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00, 0x20,0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x20, 0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x20,0x01, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x20,0x01,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x21,0x01,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x20,0x01,0x00,0x78,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x20,0x01,0x00,0x79,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x20,0x01,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x20,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x02,0x00,0x00,0x20,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x79,0x02,0x00,0x00,0x20,0x01,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7a,0x02,0x00,0x00,0x20,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b, 0x02,0x00,0x00,0x20,0x01,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02, 0x00,0x00,0x20,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00, 0x00,0x20,0x01,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00, 0x20,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x20, 0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x20,0x01, 0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x20,0x01,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x20,0x01,0x00,0x99, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x20,0x01,0x00,0x9b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x20,0x01,0x00,0x9e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x20,0x01,0x00,0xa0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x20,0x01,0x00,0xa2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x20,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x02,0x00,0x00,0x20,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x89,0x02,0x00,0x00,0x21,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x02,0x00,0x00,0x20,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b, 0x02,0x00,0x00,0x20,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02, 0x00,0x00,0x20,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00, 0x00,0x20,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00, 0x20,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x20, 0x01,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x20,0x01, 0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x20,0x01,0x00, 0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x20,0x01,0x00,0xb8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x20,0x01,0x00,0xb9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x20,0x01,0x00,0xbb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x20,0x01,0x00,0xbc,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x20,0x01,0x00,0xbf,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x98,0x02,0x00,0x00,0x20,0x01,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x02,0x00,0x00,0x20,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9a,0x02,0x00,0x00,0x20,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b, 0x02,0x00,0x00,0x20,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02, 0x00,0x00,0x20,0x01,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00, 0x00,0x20,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00, 0x20,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x20, 0x01,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x20,0x01, 0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x20,0x01,0x00, 0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x20,0x01,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x20,0x01,0x00,0xdb,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x20,0x01,0x00,0xdd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x21,0x01,0x00,0xde,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x20,0x01,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x20,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x02,0x00,0x00,0x20,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa9,0x02,0x00,0x00,0x20,0x01,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x02,0x00,0x00,0x20,0x01,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0x02,0x00,0x00,0x20,0x01,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02, 0x00,0x00,0x20,0x01,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00, 0x00,0x12,0x01,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00, 0x21,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x20, 0x01,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x20,0x01, 0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x20,0x01,0x00, 0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x20,0x01,0x00,0xf9, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x20,0x01,0x00,0xfb,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x20,0x01,0x00,0xfd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x20,0x01,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x20,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb8,0x02,0x00,0x00,0x20,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb9,0x02,0x00,0x00,0x20,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xba,0x02,0x00,0x00,0x21,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb, 0x02,0x00,0x00,0x20,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02, 0x00,0x00,0x20,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00, 0x00,0x20,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00, 0x20,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x20, 0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x21,0x01, 0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x20,0x01,0x00, 0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x20,0x01,0x00,0x0e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x20,0x01,0x00,0x10,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x20,0x01,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x20,0x01,0x00,0x15,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x20,0x01,0x00,0x17,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x20,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc8,0x02,0x00,0x00,0x20,0x01,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc9,0x02,0x00,0x00,0x20,0x01,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xca,0x02,0x00,0x00,0x20,0x01,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb, 0x02,0x00,0x00,0x20,0x01,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02, 0x00,0x00,0x20,0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00, 0x00,0x20,0x01,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00, 0x20,0x01,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x20, 0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x21,0x01, 0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x20,0x01,0x00, 0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x20,0x01,0x00,0x2f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x20,0x01,0x00,0x31,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x20,0x01,0x00,0x34,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x20,0x01,0x00,0x35,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x20,0x01,0x00,0x37,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x20,0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd8,0x02,0x00,0x00,0x21,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd9,0x02,0x00,0x00,0x20,0x01,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xda,0x02,0x00,0x00,0x20,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb, 0x02,0x00,0x00,0x20,0x01,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02, 0x00,0x00,0x20,0x01,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00, 0x00,0x20,0x01,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00, 0x20,0x01,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x20, 0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x20,0x01, 0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x20,0x01,0x00, 0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x20,0x01,0x00,0x4f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x20,0x01,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x21,0x01,0x00,0x52,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x20,0x01,0x00,0x53,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x20,0x01,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x20,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe8,0x02,0x00,0x00,0x20,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe9,0x02,0x00,0x00,0x20,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xea,0x02,0x00,0x00,0x12,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb, 0x02,0x00,0x00,0x20,0x01,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02, 0x00,0x00,0x20,0x01,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00, 0x00,0x20,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00, 0x20,0x01,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x20, 0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x20,0x01, 0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x20,0x01,0x00, 0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x20,0x01,0x00,0x6e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x20,0x01,0x00,0x70,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x20,0x01,0x00,0x72,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x20,0x01,0x00,0x74,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x20,0x01,0x00,0x76,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf7,0x02,0x00,0x00,0x20,0x01,0x00,0x77,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0x02,0x00,0x00,0x20,0x01,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf9,0x02,0x00,0x00,0x20,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xfa,0x02,0x00,0x00,0x20,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb, 0x02,0x00,0x00,0x20,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02, 0x00,0x00,0x20,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00, 0x00,0x20,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00, 0x20,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x20, 0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x20,0x01, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x12,0x01,0x00, 0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x21,0x01,0x00,0x8e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x20,0x01,0x00,0x8f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x20,0x01,0x00,0x90,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x20,0x01,0x00,0x92,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x20,0x01,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x20,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x03,0x00,0x00,0x20,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x03,0x00,0x00,0x20,0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x03,0x00,0x00,0x21,0x01,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b, 0x03,0x00,0x00,0x20,0x01,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03, 0x00,0x00,0x20,0x01,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00, 0x00,0x20,0x01,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00, 0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x20, 0x01,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x20,0x01, 0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x20,0x01,0x00, 0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x20,0x01,0x00,0xa7, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x20,0x01,0x00,0xa8,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x21,0x01,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x20,0x01,0x00,0xaa,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x20,0x01,0x00,0xab,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x03,0x00,0x00,0x20,0x01,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x19,0x03,0x00,0x00,0x20,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x1a,0x03,0x00,0x00,0x20,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x03,0x00,0x00,0x20,0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03, 0x00,0x00,0x20,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00, 0x00,0x20,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00, 0x20,0x01,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x20, 0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x20,0x01, 0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x20,0x01,0x00, 0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x20,0x01,0x00,0xc7, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x20,0x01,0x00,0xc9,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x21,0x01,0x00,0xca,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x20,0x01,0x00,0xcb,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x20,0x01,0x00,0xcc,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x20,0x01,0x00,0xce,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x03,0x00,0x00,0x20,0x01,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x20,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x03,0x00,0x00,0x20,0x01,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x03,0x00,0x00,0x20,0x01,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03, 0x00,0x00,0x21,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00, 0x00,0x20,0x01,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00, 0x20,0x01,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x20, 0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x20,0x01, 0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x20,0x01,0x00, 0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x20,0x01,0x00,0xe3, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x20,0x01,0x00,0xe5,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x20,0x01,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x20,0x01,0x00,0xea,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x20,0x01,0x00,0xec,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x20,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x03,0x00,0x00,0x21,0x01,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x03,0x00,0x00,0x20,0x01,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x03,0x00,0x00,0x20,0x01,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x03,0x00,0x00,0x20,0x01,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03, 0x00,0x00,0x20,0x01,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, 0x00,0x20,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00, 0x20,0x01,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x20, 0x01,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x20,0x01, 0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0x20,0x01,0x00, 0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x20,0x01,0x00,0x0d, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x20,0x01,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x20,0x01,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x20,0x01,0x00,0x15,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x20,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x03,0x00,0x00,0x20,0x01,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x03,0x00,0x00,0x20,0x01,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x03,0x00,0x00,0x20,0x01,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x03,0x00,0x00,0x20,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03, 0x00,0x00,0x20,0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00, 0x00,0x20,0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00, 0x20,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x20, 0x01,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x20,0x01, 0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x03,0x00,0x00,0x20,0x01,0x00, 0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x20,0x01,0x00,0x2f, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x20,0x01,0x00,0x32,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x20,0x01,0x00,0x34,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x20,0x01,0x00,0x36,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x20,0x01,0x00,0x3a,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x20,0x01,0x00,0x3b,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x03,0x00,0x00,0x20,0x01,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x03,0x00,0x00,0x20,0x01,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x03,0x00,0x00,0x20,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x03,0x00,0x00,0x20,0x01,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03, 0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x5d, 0x03,0x00,0x00,0x01,0x00,0x00,0x5e,0x03,0x00,0x00,0x01,0x00,0x00,0x5f,0x03,0x00, 0x00,0x01,0x00,0x00,0x60,0x03,0x00,0x00,0x01,0x00,0x00,0x61,0x03,0x00,0x00,0x01, 0x00,0x00,0x62,0x03,0x00,0x00,0x01,0x00,0x00,0x63,0x03,0x00,0x00,0x01,0x00,0x00, 0x64,0x03,0x00,0x00,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x01,0x00,0x00,0x33,0x00, 0x66,0x03,0x00,0x00,0x01,0x00,0x00,0x67,0x03,0x00,0x00,0x01,0x00,0x00,0x68,0x03, 0x00,0x00,0x01,0x00,0x00,0x69,0x03,0x00,0x00,0x01,0x00,0x00,0x6a,0x03,0x00,0x00, 0x01,0x00,0x00,0x6b,0x03,0x00,0x00,0x01,0x00,0x00,0x6c,0x03,0x00,0x00,0x01,0x00, 0x00,0x6d,0x03,0x00,0x00,0x01,0x00,0x00,0x6e,0x03,0x00,0x00,0x01,0x00,0x00,0x6f, 0x03,0x00,0x00,0x01,0x00,0x00,0x70,0x03,0x00,0x00,0x01,0x00,0x00,0x71,0x03,0x00, 0x00,0x01,0x00,0x00,0x72,0x03,0x00,0x00,0x01,0x00,0x00,0x73,0x03,0x00,0x00,0x01, 0x00,0x00,0x74,0x03,0x00,0x00,0x01,0x00,0x00,0x75,0x03,0x00,0x00,0x01,0x00,0x00, 0x76,0x03,0x00,0x00,0x01,0x00,0x00,0x77,0x03,0x00,0x00,0x01,0x00,0x00,0x78,0x03, 0x00,0x00,0x01,0x00,0x00,0x79,0x03,0x00,0x00,0x01,0x00,0x00,0x7a,0x03,0x00,0x00, 0x01,0x00,0x00,0x7b,0x03,0x00,0x00,0x01,0x00,0x00,0x7c,0x03,0x00,0x00,0x01,0x00, 0x00,0x7d,0x03,0x00,0x00,0x01,0x00,0x00,0x7e,0x03,0x00,0x00,0x01,0x00,0x00,0x7f, 0x03,0x00,0x00,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x01,0x00,0x00,0x81,0x03,0x00, 0x00,0x01,0x00,0x00,0x82,0x03,0x00,0x00,0x01,0x00,0x00,0x83,0x03,0x00,0x00,0x01, 0x00,0x00,0x84,0x03,0x00,0x00,0x01,0x00,0x00,0x85,0x03,0x00,0x00,0x01,0x00,0x00, 0x86,0x03,0x00,0x00,0x01,0x00,0x00,0x87,0x03,0x00,0x00,0x01,0x00,0x00,0x88,0x03, 0x00,0x00,0x01,0x00,0x00,0x89,0x03,0x00,0x00,0x01,0x00,0x00,0x8a,0x03,0x00,0x00, 0x01,0x00,0x00,0x8b,0x03,0x00,0x00,0x01,0x00,0x00,0x8c,0x03,0x00,0x00,0x01,0x00, 0x00,0x8d,0x03,0x00,0x00,0x01,0x00,0x00,0x8e,0x03,0x00,0x00,0x01,0x00,0x00,0x8f, 0x03,0x00,0x00,0x01,0x00,0x00,0x90,0x03,0x00,0x00,0x01,0x00,0x00,0x91,0x03,0x00, 0x00,0x01,0x00,0x00,0x92,0x03,0x00,0x00,0x01,0x00,0x00,0x93,0x03,0x00,0x00,0x01, 0x00,0x00,0x94,0x03,0x00,0x00,0x01,0x00,0x00,0x95,0x03,0x00,0x00,0x01,0x00,0x00, 0x96,0x03,0x00,0x00,0x01,0x00,0x00,0x97,0x03,0x00,0x00,0x01,0x00,0x00,0x98,0x03, 0x00,0x00,0x01,0x00,0x00,0x22,0x00,0x99,0x03,0x00,0x00,0x01,0x00,0x9a,0x03,0x00, 0x00,0x01,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x9d, 0x03,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x00, 0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0xa2,0x03,0x00, 0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0xa5, 0x03,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00,0x00,0xaa,0x03,0x00, 0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x00,0x00,0xad, 0x03,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x00, 0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0xb2,0x03,0x00, 0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0xb5, 0x03,0x00,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x00, 0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0xba,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0xbb,0x03,0x00,0x00,0x01,0x00,0x00,0xbc,0x03,0x00,0x00, 0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04, 0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28, 0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x3e,0x02,0x00, 0x00,0x30,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x23, 0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x6f,0x88,0x00,0x00,0x9e,0x4a,0x00,0x00,0x03, 0x00,0xbd,0x03,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f, 0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x31,0x2e,0x61,0x73,0x6d,0xbe,0x03,0x00,0x00, 0x00,0xbf,0x03,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x45,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0,0xff,0xff,0xff,0x0c,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x50,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x01,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x02,0x00,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x01,0x00,0x1d,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x50,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x03,0x00,0x00,0x53,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x32,0x00,0x03,0x00,0x02,0x00, 0x29,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x03,0x00,0x31,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00, 0x54,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8, 0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x04,0x00,0x00,0x53,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x10,0x00,0x00,0x00,0x32,0x00,0x04,0x80,0x03, 0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20, 0x04,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xf0,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x03,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x05,0x00,0x00,0x53, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x05, 0x80,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06, 0x01,0x20,0x04,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x3e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xe8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x03,0x00,0x29,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x00,0x02,0x06,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x06,0x00,0x05,0x00,0x31,0x04,0x00, 0x24,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x58,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x07,0x00,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x07,0x80,0x04,0x00,0x24,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x31,0x05,0x00,0x2c,0x00,0x04,0x02,0x08,0x00,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x08,0x00,0x11,0x00,0x2c, 0x00,0x00,0x02,0x09,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x03,0x00,0x00,0x00,0x32,0x00,0x09,0x00,0x0b,0x00,0x2c,0x00,0x00,0x02,0x0a,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32, 0x00,0x0a,0x80,0x21,0x00,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x14,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x0d,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x15,0x00,0x00,0x02, 0x00,0x3d,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x3c, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x0e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x16,0x00,0x00,0x02, 0x00,0x3c,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x3b, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x0f,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x17,0x00,0x00,0x02, 0x00,0x3b,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x3b,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x05,0x00,0x00,0x02, 0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x3a,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x39, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x0e,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x0b,0x00,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x0b,0x80,0x07,0x00, 0x31,0x06,0x00,0x29,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4c,0x00,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x07,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x4c,0x00,0x00, 0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x03, 0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x13,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x4c, 0x00,0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x00,0x06,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x1f, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x10,0x00,0x21,0x01,0x00, 0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x60,0xfe,0x01,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0xff,0x01,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x03,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0x00, 0x01,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x06, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4b,0x00,0x00,0x00, 0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x00,0x4b,0x00,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x0f,0x00,0x21,0x01, 0x28,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00, 0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x49,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x01,0x01, 0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x03,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0x0c,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x0c,0x80,0x07,0x00,0x29,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x06,0x00,0x31,0x07,0x00,0x2c,0x00,0x04,0x02,0x0d,0x00,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x0d,0x80, 0x09,0x00,0x2c,0x00,0x04,0x02,0x0e,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x0e,0x00,0x08,0x00,0x2c,0x00,0x00, 0x02,0x0f,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x32,0x00,0x0f,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x52, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x52,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4c,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x56,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4c,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c, 0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe0, 0x00,0x24,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe0,0x01,0x25,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4b, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff, 0xff,0x01,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x67,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4b,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b, 0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x6f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x08,0x00,0x2c,0x00,0x00, 0x02,0x10,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0x10,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x4c,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0xe0,0x00,0x25,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x60,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x77, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x09,0x00,0x32,0x00,0x02,0x00, 0x0a,0x00,0x2b,0x00,0x02,0x11,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x11, 0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x79, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00, 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00, 0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c, 0x00,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x02,0x10,0x00, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x4c,0x00,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x80,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x03, 0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x89,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x8a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x4c,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00, 0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x95,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c, 0x00,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x99, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe0,0x01,0x20,0x00, 0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00,0xa3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x03,0x10,0x00,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0xe0,0x03,0x25,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x90,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00, 0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b, 0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x40,0x01,0x01, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb4,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb5,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x96,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00, 0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x98,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0xe0,0x01,0x32,0x00,0x00, 0x00,0x21,0x00,0x31,0x0a,0x00,0x2c,0x00,0x00,0x02,0x12,0x00,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x12,0x80,0x21, 0x00,0x25,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x9b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc2,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xcf, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcf,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00, 0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xc8,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x4c,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xce, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd0,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd1,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x4c,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00, 0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd8,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa8,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe0,0x01, 0x20,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00, 0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe0,0x02,0x25,0x00,0x00,0x00,0x00,0xde, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe3,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xe7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x0b,0x00,0x29, 0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x05,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x11,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x19,0x00,0x00,0x02, 0x00,0x3d,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x3c, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x12,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x1a,0x00,0x00,0x02, 0x00,0x3c,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xef,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x09,0x00,0x00,0x02, 0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x39, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x13,0x00,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x13,0x80, 0x0d,0x00,0x31,0x0c,0x00,0x29,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xeb,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x06,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xf0, 0x00,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x12, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0xf0,0x00,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x1a,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xf0,0x00,0x00, 0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x0f,0x00,0x21, 0x01,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03, 0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xeb,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xff, 0x01,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00, 0xeb,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00, 0xe0,0x00,0x01,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xeb,0x00,0x00,0x00, 0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x01,0x01,0x00, 0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x02,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xef,0x00, 0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xed,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x0e,0x00, 0x21,0x01,0x28,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x02,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x02,0x00,0xed, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x40, 0x01,0x01,0x00,0x02,0x00,0xed,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x02,0x00,0xed,0x00,0x00,0x00,0x00, 0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c, 0x00,0x04,0x02,0x14,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0x14,0x80,0x0d,0x00,0x29,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x00,0x00,0x0c,0x00,0x31,0x0d,0x00,0x2c,0x00,0x04,0x02,0x15,0x00,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x15,0x80,0x0f,0x00,0x2c,0x00,0x04,0x02,0x16,0x00,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x16,0x00,0x0e,0x00,0x2c, 0x00,0x00,0x02,0x17,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x04,0x00,0x00,0x00,0x32,0x00,0x17,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xf1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf6,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfb,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00, 0x00,0xf0,0x00,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x01,0x25,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xef,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x00,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbf,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00, 0xc0,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x0e,0x00,0x2c,0x00,0x00,0x02,0x18, 0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x32,0x00,0x18,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x07, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc2, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x00,0x25,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xef,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x40,0x00, 0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x0f,0x00,0x32,0x00,0x02,0x00,0x10,0x00,0x2b, 0x00,0x02,0x19,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x19,0x80,0x21,0x00, 0x25,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc7,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0xf0,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x14,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x15,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00, 0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x18,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00, 0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00, 0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1c, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x03,0x01,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xce, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00, 0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd0,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40, 0x01,0x10,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0xc0,0x01,0x20,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff, 0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd3,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x02, 0x10,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0, 0x00,0x00,0x00,0x40,0x03,0x10,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x03,0x25,0x00,0x00,0x00,0x00,0x2d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x00,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x32,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x00,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x33,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xef,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x36, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdc, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00, 0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0xc0,0x01,0x32,0x00,0x00,0x00, 0x21,0x00,0x31,0x10,0x00,0x2c,0x00,0x00,0x02,0x1a,0x00,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x1a,0x80,0x21,0x00, 0x25,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xdf,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0xf0,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x41,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00, 0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x45,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe4,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x49, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40,0x01,0x10, 0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xe7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0xc0,0x01,0x20,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0x3f, 0x01,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0x02,0x25,0x00, 0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x53, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xeb,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0xef,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x54,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xef, 0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0xef,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x21,0x00, 0x31,0x11,0x00,0x2c,0x00,0x00,0x02,0x1b,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x1b,0x00,0x17,0x00,0x2c,0x00, 0x00,0x02,0x1c,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01, 0x00,0x00,0x00,0x32,0x00,0x1c,0x80,0x21,0x00,0x29,0x03,0x00,0x00,0x00,0x5f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x5f,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x01,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5f,0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x5e,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x2c,0x00,0x04,0x02,0x1d,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x1d,0x80,0x13,0x00,0x31,0x12,0x00,0x29, 0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x5a,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x08,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x5f, 0x01,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x14, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x5f,0x01,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5a,0x01, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x1c,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x05,0x00, 0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0xf0,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x60,0xfe,0x01,0x00, 0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05, 0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x5a,0x01, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0xe0,0xff, 0x01,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00, 0x5a,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00, 0x60,0x01,0x01,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x05,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x5a,0x01,0x00,0x00, 0x00,0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5c, 0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x04,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x5e,0x01, 0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00, 0x03,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x0c,0x00,0x21,0x01,0x28,0x00,0x01,0x06, 0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf0,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0x5c, 0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x80, 0x01,0x01,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x1e,0x00,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00, 0x1e,0x80,0x13,0x00,0x29,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x12,0x00, 0x31,0x13,0x00,0x2c,0x00,0x04,0x02,0x1f,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x1f,0x80,0x15,0x00,0x2c,0x00, 0x04,0x02,0x20,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x32,0x00,0x20,0x00,0x14,0x00,0x2c,0x00,0x00,0x02,0x21,0x00,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00, 0x21,0x80,0x21,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf2,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f, 0x01,0x00,0x00,0x80,0x01,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00, 0x21,0x00,0x31,0x14,0x00,0x2c,0x00,0x00,0x02,0x22,0x00,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x22,0x80,0x21,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00, 0x00,0x5f,0x01,0x00,0x00,0x80,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e, 0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x15,0x00,0x32,0x00, 0x02,0x00,0x16,0x00,0x2b,0x00,0x02,0x23,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x23,0x80,0x21,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x68,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x5f,0x01,0x00,0x00,0x80,0x01,0x20,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff, 0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00, 0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfa,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x02, 0x10,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f, 0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x03,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfd,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00, 0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x16,0x00,0x2c,0x00,0x00,0x02, 0x24,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x32,0x00,0x24,0x80,0x21,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00, 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0x5f,0x01,0x00,0x00,0x80,0x01,0x20,0x00,0x00,0x00,0x00,0x82,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xfc,0xff,0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00, 0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x84,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x85,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00, 0x80,0x02,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x06,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00, 0x00,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x17,0x00,0x29,0x03,0x00,0x00,0x00, 0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8d,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x8d,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00, 0x09,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8d,0x01,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x11,0x00,0x00,0x02, 0x00,0x3d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01, 0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x1d,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8c,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x01, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x3a,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x25, 0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x32,0x00,0x25,0x80,0x19,0x00,0x31,0x18,0x00,0x29,0x00,0x00,0x00,0x00,0x88,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x8d,0x01,0x00, 0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x0d,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x8d, 0x01,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x19, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x07,0x00,0x02, 0x00,0x8d,0x01,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x8d,0x01,0x00, 0x00,0x0e,0x00,0x21,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x07,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0xfe,0x01,0x00, 0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07, 0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x02,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x88,0x01, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0x00, 0x01,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x07,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x05, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00, 0x88,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00, 0xe0,0x01,0x01,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00, 0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x8c,0x01,0x00,0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8a, 0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x09,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x8c,0x01, 0x00,0x00,0x0d,0x00,0x21,0x01,0x28,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x8c,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x20,0x00,0x01,0x00,0x02,0x00,0x8a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xa0,0x00,0x01, 0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x08,0x00,0x00,0x20,0x01,0x01,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xa0,0x01,0x01,0x00,0x02,0x00,0x8a, 0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x26,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x26,0x80,0x19,0x00,0x29,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x18,0x00,0x31,0x19,0x00,0x2c,0x00,0x04, 0x02,0x27,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0x27,0x80,0x1b,0x00,0x2c,0x00,0x04,0x02,0x28,0x00,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x28, 0x00,0x1a,0x00,0x2c,0x00,0x00,0x02,0x29,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x29,0x80,0x21,0x00,0x25,0x00, 0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x09,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x8d,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x90,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d, 0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x93,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x8d,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x8d,0x01,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65, 0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00, 0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0f,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x01, 0x25,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x11,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x8c,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x8c,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00, 0x8c,0x01,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1a,0x00,0x2c, 0x00,0x00,0x02,0x2a,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x32,0x00,0x2a,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xa2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x01,0x07,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00, 0x00,0x8d,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x17,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x00, 0x25,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x18,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x8c,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x19,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01, 0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1b,0x00,0x32,0x00,0x02, 0x00,0x1c,0x00,0x2b,0x00,0x02,0x2b,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x2b,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x1b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xac,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb1, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x01,0x24,0x00,0x00, 0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb2,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xb2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x8d,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x02,0x10, 0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb7, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb7,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x8d,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xb8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb8,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00, 0x00,0x8d,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d, 0x01,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02, 0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x01,0x20,0x00,0x00,0x00,0x00,0xc2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xfc,0xff,0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc2,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x26,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x20,0x02,0x10, 0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x27,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01, 0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00, 0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x20,0x03,0x10,0x00,0x00,0x00,0x00,0xc8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x03,0x25,0x00, 0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xcb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x2b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x8c,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcc,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8c, 0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8c,0x01,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8c,0x01,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c, 0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00, 0x00,0x8c,0x01,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbf,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x31,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0xa0,0x01, 0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1c,0x00,0x2c,0x00,0x00,0x02,0x2c,0x00,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x2c,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xda,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xde, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x01,0x24,0x00,0x00, 0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdf,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x8d,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x8d,0x01,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d, 0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x39,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x00,0x24,0x00, 0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe7, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3a, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00, 0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00, 0x00,0x00,0x8d,0x01,0x00,0x00,0xa0,0x01,0x20,0x00,0x00,0x00,0x00,0xeb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xfc,0xff,0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xeb,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x20,0x02,0x10,0x00,0x00, 0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xed,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00, 0xa0,0x02,0x25,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x3f,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x8c,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf2,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x8c,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xda,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x8c,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c, 0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x65,0x02,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x20,0x01,0x32,0x00, 0x00,0x00,0x21,0x00,0x31,0x1d,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x44,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xf8,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0xfa,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x46,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xfc, 0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x50,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x02,0x00, 0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x44,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xfd,0x01,0x00,0x00,0x00, 0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x01,0x00,0x00,0x00,0x00,0x37, 0x00,0x06,0x01,0x20,0x04,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xff,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xf8,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf8,0x01,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x05,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf8, 0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xfa,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x02, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfa,0x01,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x05,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfa, 0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0xfc,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x02, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xfc,0x01,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x05,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xfc, 0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xfd,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x0a,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xfd, 0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x08,0x02,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x09,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xfe,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0b,0x02, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xff,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x0a,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xff, 0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x2d,0x00,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x2d,0x80, 0x1f,0x00,0x2c,0x00,0x04,0x02,0x2e,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x2e,0x00,0x1e,0x00,0x2c,0x00,0x00, 0x02,0x2f,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x32,0x00,0x2f,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x5b,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x10, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x10,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x02,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x11,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x02,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x4a,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x14,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x09,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1e, 0x00,0x2c,0x00,0x00,0x02,0x30,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x30,0x80,0x21,0x00,0x25,0x00,0x00,0x00, 0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x15,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x02,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x4c, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x21,0x00,0x31,0x1f,0x00,0x32,0x00,0x02,0x00,0x20,0x00,0x2b,0x00,0x02,0x31, 0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x31,0x80,0x21,0x00,0x25,0x00,0x00, 0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x18,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x1c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x02,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x03,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x04,0x02,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x23, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x23,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x24,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x02,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x27,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x07,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x02, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x02,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x2c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0a,0x02,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x2d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x0b,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21, 0x00,0x31,0x20,0x00,0x2c,0x00,0x00,0x02,0x32,0x00,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x32,0x80,0x21,0x00,0x25, 0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x57,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x02,0x02,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x35,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x03,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x36,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x04,0x02,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x39,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x02, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x02,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0a,0x02,0x00,0x00,0x00,0x00,0x31,0x21, 0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x41, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c, 0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x48,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x49, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x48,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x4d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x03,0x02,0x33,0x00,0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x33,0x00,0x00,0x4e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x22,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb, 0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0xe6,0x01,0x24,0x00, 0x00,0x01,0x0c,0x00,0x0c,0x00,0x6c,0x00,0x00,0x00,0x60,0x86,0x85,0x3f,0xc4,0x01, 0x00,0x05,0x02,0x00,0x02,0x00,0x65,0x02,0x00,0x80,0x10,0x81,0x55,0x40,0xe4,0x01, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x00,0x00,0x80,0x10,0x82,0x46,0x40,0x24,0x00, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x69,0x02,0x00,0x00,0x60,0x81,0x25,0x40,0x54,0x40, 0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x40,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0x24,0x40, 0x00,0x01,0x84,0x3f,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x81,0xc5,0x3f,0x54,0x40, 0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x60,0x81,0xe5,0x3f,0x44,0x40, 0x00,0x05,0x07,0x00,0x07,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x3f,0x24,0x40, 0x00,0x06,0x84,0x3f,0x00,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0x44,0x3f,0x00,0x00, 0x00,0x00,0x08,0x55,0x00,0x00,0x61,0x00,0x04,0x64,0x00,0x00,0x10,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x06, 0x04,0x62,0x80,0x3f,0x11,0x00,0x61,0x00,0x04,0x62,0xc8,0x40,0x11,0x00,0x5b,0x07, 0x00,0x00,0x60,0x86,0x04,0x02,0x04,0x40,0x05,0x01,0x44,0x40,0x20,0x00,0x31,0xa0, 0x03,0x80,0x00,0x00,0x05,0x2b,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x4a,0x05,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x4a,0x85,0x01,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x5b,0x02, 0x00,0x00,0x60,0x06,0x04,0x40,0xa4,0x01,0x01,0x06,0x04,0x40,0x54,0x40,0x5b,0x02, 0x00,0x00,0x60,0x06,0x84,0x01,0x44,0x01,0x01,0x06,0x84,0x01,0x44,0x40,0x41,0x02, 0x20,0x22,0x0e,0x40,0x11,0x3f,0x49,0x00,0x40,0xa8,0x0a,0x40,0x11,0x3f,0x5b,0x00, 0x00,0x00,0x60,0x86,0x04,0x03,0x64,0x01,0x05,0x01,0x54,0x40,0xf8,0xff,0x40,0x07, 0x3f,0xa8,0x02,0x3f,0x11,0x02,0x70,0x05,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01, 0x00,0x35,0x1f,0x00,0x1f,0x00,0x40,0x04,0x40,0xa8,0x02,0x40,0x11,0x02,0x62,0x04, 0x00,0x00,0x60,0x86,0x65,0x3f,0x04,0x03,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x03,0x00,0x55,0x08,0x00,0x08,0x00,0x69,0x05, 0x3f,0x68,0x62,0x3f,0x21,0x00,0x69,0x04,0x3f,0x68,0x3a,0x40,0x21,0x00,0x20,0x00, 0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x49,0x00,0x00,0x61,0x00, 0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x01,0x00,0x49,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x02,0x62,0x80,0x3f,0x11,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x40,0x00,0x20,0x82,0x01,0x00,0x84,0x01,0x00,0x31,0x08,0x00,0x08,0x00,0x31,0xa1, 0x03,0x80,0x00,0x00,0x05,0x3b,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x4a,0x45,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00, 0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x0a,0xa5,0x3f,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x61,0x31, 0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x02,0x68,0x82,0x3f,0x01,0x02,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00, 0x02,0x62,0xc8,0x40,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x84,0x01, 0x00,0x31,0x10,0x00,0x10,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa2, 0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x32, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x40,0x00, 0x00,0x00,0x60,0x86,0xa5,0x3f,0x84,0x01,0x00,0x05,0xf8,0xff,0xf8,0xff,0x31,0xb3, 0x03,0x80,0x00,0x00,0x05,0x41,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x4a,0x45,0x40,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x61,0x33, 0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x02,0x68,0x82,0x3f,0x01,0x04,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00, 0x02,0x62,0xc8,0x40,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x84,0x01, 0x00,0x31,0x18,0x00,0x18,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x33,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x34,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x01,0x00,0x49,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x3f,0x84,0x01, 0x00,0x05,0xf0,0xff,0xf0,0xff,0x31,0xb5,0x03,0x80,0x00,0x00,0x05,0x4e,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x40,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0x61,0x35,0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00, 0x02,0x68,0x82,0x3f,0x01,0x06,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x02,0x62,0xc8,0x40,0x11,0x00,0x40,0x00, 0x00,0x00,0x60,0x86,0xa5,0x3f,0x84,0x01,0x00,0x05,0xe8,0xff,0xe8,0xff,0x31,0xa6, 0x03,0x80,0x00,0x00,0x05,0x45,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x36, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x61,0x00, 0x00,0x00,0xa0,0x4a,0x45,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x31,0xb7, 0x03,0x80,0x00,0x00,0x05,0x52,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x05, 0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00, 0x3f,0xa8,0xa0,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00, 0x00,0x20,0xa8,0x00,0x00,0x00,0x61,0x31,0x02,0xa1,0x00,0x00,0x01,0x00,0x61,0x00, 0x4d,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x50,0x85,0xe5,0x01,0xc4,0x3f, 0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01, 0x00,0x01,0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0xc4,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x3f,0xc4,0x3f, 0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0xc4,0x3f, 0x00,0x16,0xa4,0x3f,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0xff,0xff,0xff,0x69,0x04,0x4d,0x61,0x02,0x02,0x20,0x00,0x70,0x00, 0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x40,0x00,0x51,0x03,0x00,0x03,0x00,0x20,0x00, 0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x2b,0x00,0x00,0x70,0x00, 0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x40,0x00,0x11,0x03,0x00,0x03,0x00,0x20,0x00, 0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x19,0x00,0x00,0x70,0x00, 0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x40,0x00,0x11,0x04,0x00,0x04,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x4f,0x00,0x00,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20, 0x0b,0x61,0x00,0x2b,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x2c,0x10,0x00,0x61,0x00, 0x13,0x61,0x00,0x2d,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x2e,0x10,0x00,0x61,0x00, 0x1b,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x30,0x10,0x00,0x61,0x00, 0x23,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x32,0x10,0x00,0x61,0x22, 0x0c,0x61,0x00,0x03,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x04,0x10,0x00,0x61,0x00, 0x14,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x06,0x10,0x00,0x61,0x00, 0x1c,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x08,0x10,0x00,0x61,0x00, 0x24,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x0a,0x10,0x00,0x61,0x24, 0x0d,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x34,0x10,0x00,0x61,0x00, 0x15,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x36,0x10,0x00,0x61,0x00, 0x1d,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x38,0x10,0x00,0x61,0x00, 0x25,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x3a,0x10,0x00,0x61,0x26, 0x0e,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x46,0x10,0x00,0x61,0x00, 0x16,0x61,0x00,0x47,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x48,0x10,0x00,0x61,0x00, 0x1e,0x61,0x00,0x49,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x4a,0x10,0x00,0x61,0x00, 0x26,0x61,0x00,0x4b,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x4c,0x10,0x00,0x61,0x21, 0x2b,0x61,0x00,0x3b,0x10,0x00,0x61,0x23,0x2c,0x61,0x00,0x41,0x10,0x00,0x61,0x25, 0x2d,0x61,0x00,0x4e,0x10,0x00,0x61,0x27,0x2e,0x61,0x00,0x52,0x10,0x00,0x61,0x00, 0x2f,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x30,0x61,0x00,0x42,0x10,0x00,0x61,0x00, 0x31,0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x32,0x61,0x00,0x53,0x10,0x00,0x61,0x00, 0x33,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x34,0x61,0x00,0x43,0x10,0x00,0x61,0x00, 0x35,0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x36,0x61,0x00,0x54,0x10,0x00,0x61,0x00, 0x37,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x38,0x61,0x00,0x44,0x10,0x00,0x61,0x00, 0x39,0x61,0x00,0x51,0x10,0x00,0x61,0x00,0x3a,0x61,0x00,0x55,0x10,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00, 0x00,0x00,0x50,0x85,0xe5,0x01,0xa4,0x3f,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x68,0x60,0x12,0x11,0x00,0x61,0x00,0x02,0x68,0x38,0x16,0x11,0x00,0x61,0x00, 0x02,0x68,0x98,0x1a,0x11,0x00,0x61,0x00,0x02,0x68,0x90,0x1e,0x11,0x00,0x61,0x00, 0x02,0x68,0xa8,0x22,0x11,0x00,0x61,0x00,0x02,0x68,0xa0,0x26,0x11,0x00,0x61,0x00, 0x02,0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01, 0x00,0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x68,0x60,0x32,0x11,0x00,0x61,0x00, 0x03,0x68,0x38,0x36,0x11,0x00,0x61,0x00,0x03,0x68,0x98,0x3a,0x11,0x00,0x40,0x00, 0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x00, 0x00,0x00,0x68,0x06,0x81,0x01,0x04,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x03,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x05,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x07,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00, 0x01,0x68,0x72,0x3f,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x3f,0x68,0xa8,0x01,0x11,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xfe,0xff,0xff,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x06,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x4c,0x00,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x04, 0x05,0xa8,0xca,0x3f,0x11,0x05,0x40,0x04,0x07,0xa8,0xca,0x3f,0x11,0x07,0x40,0x00, 0x3f,0x68,0xca,0x3f,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x01,0x65,0x07, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x07, 0x05,0xa8,0x22,0x3f,0x11,0x05,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x14,0x17,0x00,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x38,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x02,0x3f,0x21,0x00,0x40,0x00, 0x3f,0xa8,0xca,0x3f,0x11,0x07,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xed,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x15,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x01, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03, 0x02,0x21,0x03,0x4d,0x10,0x08,0x69,0x3e,0x04,0x68,0x5a,0x3f,0x11,0x00,0x41,0x00, 0x08,0x68,0x5a,0x3f,0x31,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f, 0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x03,0x04,0xa8,0x02,0x3f,0x11,0x04,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04, 0x3f,0xa8,0x02,0x3f,0x11,0x08,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x82,0x01,0x21,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x06,0x68,0x02,0x04,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03, 0x02,0x68,0x02,0x3f,0x21,0x00,0x65,0x00,0x04,0x68,0x6a,0x01,0xc1,0xff,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x05, 0x05,0x21,0x03,0x4d,0x10,0x03,0x40,0x05,0x07,0x21,0x03,0x4d,0x10,0x06,0x40,0x05, 0x09,0x21,0x03,0x4d,0x10,0x02,0x40,0x05,0x04,0xa8,0x42,0x3f,0x11,0x04,0x40,0x00, 0x40,0x68,0x02,0x40,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x3f,0x44,0x3f, 0x00,0x05,0x40,0x00,0x40,0x00,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x1a,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0xe4,0x01, 0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x06,0x01,0x68,0x8a,0x40,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00, 0x40,0xa8,0x0a,0x40,0x11,0x3f,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xe5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x14,0x2f,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x02,0x04,0x68,0x02,0x40,0x21,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x03,0x21,0x53,0x4d,0x10,0x01,0x31,0xf6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x31,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03, 0x05,0x21,0x03,0x4d,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x0c,0x32,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x48,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x48,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x01,0x40,0x00, 0x3f,0x68,0xca,0x3f,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01, 0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x01,0x68,0x8a,0x3f,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00, 0x3f,0xa8,0x0a,0x3f,0x11,0x3f,0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x02,0x03,0x68,0x02,0x3f,0x21,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x31,0xfc, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xce, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x02,0x21,0x53,0x4d,0x10,0x01,0x01,0x3a, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x4d,0x10,0x03,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04, 0x00,0x00,0x60,0x86,0x45,0x05,0x04,0x40,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xcd, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xbf, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x3e, 0x06,0x68,0x42,0x3f,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x3f, 0x00,0x05,0x60,0x00,0x60,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x14,0x2b,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x02,0x21,0x53,0x4d,0x10,0x01,0x31,0xb0, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa2, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x46,0x00,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x08,0x00,0x00,0x61,0x00, 0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x45,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x05,0xa8,0xca,0x3f,0x11,0x05,0x40,0x05,0x07,0xa8,0xca,0x3f,0x11,0x07,0x31,0xc3, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xb4, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x34, 0x04,0x68,0x6a,0x01,0x51,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0xc4,0x01, 0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07,0xc4,0x01, 0x00,0x05,0x07,0x00,0x07,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x02,0x24,0x3f, 0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04,0x04,0xa8,0xca,0x3f,0x11,0x04,0x40,0x04, 0x00,0x00,0x60,0x06,0x45,0x05,0x24,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x45,0x07,0x24,0x3f,0x00,0x06,0x24,0x07,0x00,0x00,0x40,0x00, 0x3f,0x68,0xca,0x3f,0x01,0x04,0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x01,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x04,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x07,0x24,0x3f, 0x00,0x06,0x04,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x05,0x24,0x3f, 0x00,0x06,0x04,0x05,0x00,0x00,0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xf5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xf6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x04,0xa8,0x22,0x3f,0x11,0x04,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x05,0x24,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x04, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x35,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x07, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f, 0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x00,0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0xfa, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xfc, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xde, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x02,0x21,0x53,0x4d,0x10,0x01,0x41,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xfd, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xd1, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xc2, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xb0, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x29,0x00,0x00,0x40,0x01, 0x00,0x00,0x60,0x06,0x25,0x07,0x04,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x31, 0x03,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f, 0x00,0x05,0x01,0x00,0x01,0x00,0x31,0xe3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0e,0x00,0x00,0x69,0x03,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x33, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x02,0x68,0x22,0x07,0x21,0x00,0x65,0x00, 0x03,0x68,0x6a,0x01,0xc1,0xff,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x03,0x0a,0x21,0x03,0x4d,0x10,0x02,0x40,0x03, 0x03,0xa8,0x62,0x3f,0x11,0x03,0x41,0x00,0x02,0x68,0x5a,0x3f,0x61,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x4d,0x10,0x04,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x42,0x05,0x21,0x00,0x69,0x04, 0x04,0x68,0x22,0x03,0x21,0x00,0x40,0x04,0x02,0xa8,0x02,0x3f,0x11,0x02,0x41,0x00, 0x00,0x00,0x60,0x86,0x45,0x05,0x84,0x3f,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x03,0x84,0x3f,0x00,0x05,0x07,0x00,0x07,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05, 0x08,0x21,0x03,0x4d,0x10,0x06,0x69,0x04,0x07,0x68,0x62,0x02,0x21,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f,0x00,0x06,0x44,0x05,0x00,0x00,0x40,0x04, 0x3f,0xa8,0x12,0x3f,0x11,0x03,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x49,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x02,0xa8,0x42,0x3f,0x11,0x03,0x69,0x03, 0x06,0x68,0x42,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x4d,0x10,0x04,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x0a,0x21,0x13,0x4d,0x10,0x07,0x69,0x05, 0x04,0x68,0x02,0x3f,0x21,0x00,0x69,0x00,0x07,0x68,0x62,0x03,0x11,0x00,0x41,0x00, 0x03,0x68,0x02,0x03,0x31,0x00,0x31,0xd5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x1e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x08,0x21,0x03,0x4d,0x10,0x06,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x07,0x44,0x3f, 0x00,0x06,0x24,0x07,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x09,0x21,0x03,0x4d,0x10,0x04,0x40,0x05,0x03,0xa8,0x42,0x3f,0x11,0x03,0x31,0xc6, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xf7, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xab, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x40,0x00, 0x40,0x68,0x02,0x40,0x81,0x01,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x06,0x44,0x05, 0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x3f,0x44,0x3f, 0x00,0x05,0x40,0x00,0x40,0x00,0x68,0x36,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x0a,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x07, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x31,0xfa, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xdc, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0xbe, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x33,0x00,0x00,0x31,0xcf, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x37,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x40,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00, 0x05,0xa8,0x42,0x3f,0x11,0x05,0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x3f,0x04,0x68,0x02,0x40,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0x04,0x07,0x00,0x00,0x40,0x00, 0x40,0xa8,0x52,0x40,0x11,0x01,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2d,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07, 0x07,0x68,0x22,0x05,0x21,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x06,0x21,0x03,0x4d,0x10,0x04,0x69,0x00,0x02,0x68,0x5a,0x3f,0x21,0x00,0x69,0x07, 0x04,0x68,0x02,0x40,0x21,0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x31,0x00,0x00,0x31,0xe2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x35,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x39,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x08,0x21,0x03,0x4d,0x10,0x02,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02, 0x09,0x21,0x03,0x4d,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x03,0x21,0x03,0x4d,0x10,0x07,0x31,0xf3, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xc4, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x32,0x00,0x00,0x31,0x98, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x36,0x00,0x00,0x31,0xb9, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x3a,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x3d,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x3d,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa5, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0x96, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x36, 0x04,0x68,0x6a,0x01,0x51,0x00,0x40,0x04,0x05,0xa8,0xca,0x3f,0x11,0x05,0x40,0x04, 0x07,0xa8,0xca,0x3f,0x11,0x07,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x05,0x02,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04, 0x04,0xa8,0xca,0x3f,0x11,0x04,0x40,0x00,0x3f,0x68,0xca,0x3f,0x01,0x04,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xdb, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xc7, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xba, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xac, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1f,0x00,0x00,0x40,0x00, 0x3f,0x68,0x02,0x3f,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x07,0xa8,0x22,0x3f,0x11,0x07,0x40,0x00, 0x02,0xa8,0x22,0x3f,0x11,0x05,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x3b,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f, 0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x3f,0xa8,0xca,0x3f,0x11,0x04,0x31,0xce, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x37, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x04,0xa8,0x52,0x3f,0x11,0x01,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x3f,0x00,0x06,0x84,0x3f,0x00,0x00,0x69,0x00, 0x02,0x68,0x02,0x3f,0x21,0x00,0x31,0xff,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xe1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x42,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x21,0x00,0x00,0x69,0x02,0x07,0x68,0x22,0x05,0x21,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x03,0x4d,0x10,0x02,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x06,0x68,0x02,0x04,0x21,0x00,0x65,0x00, 0x00,0x00,0x60,0x86,0x25,0x05,0xc4,0x01,0x00,0x05,0xfc,0xff,0xfc,0xff,0x41,0x00, 0x02,0x68,0x5a,0x3f,0x31,0x00,0x41,0x00,0x04,0x68,0x5a,0x3f,0x51,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04, 0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x04, 0x02,0xa8,0x02,0x3f,0x11,0x02,0x40,0x04,0x3f,0xa8,0x02,0x3f,0x11,0x04,0x31,0xf3, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3f, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08,0x21,0x03,0x4d,0x10,0x07,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x4d,0x10,0x06,0x01,0x33, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x02,0x21,0x00,0x69,0x06, 0x07,0x68,0x42,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x3f,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x05,0x44,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x69,0x00, 0x05,0x68,0xca,0x05,0x11,0x00,0x31,0xf8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xe9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x16,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x0a,0x21,0x03,0x4d,0x10,0x03,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x08,0x21,0x03,0x4d,0x10,0x07,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x44,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x09,0x21,0x03,0x4d,0x10,0x06,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x3f,0x44,0x3f, 0x00,0x05,0x40,0x00,0x40,0x00,0x31,0xd4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x22,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x40,0x68,0x02,0x40,0x81,0x01,0x65,0x07, 0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x06, 0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xcb, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xe7, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0xba, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x33,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x3a, 0x04,0x68,0x02,0x40,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f, 0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x00,0x40,0xa8,0x52,0x40,0x11,0x01,0x31,0xfc, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xde, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x31,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02, 0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06,0x68,0x5a,0x3f,0x21,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03, 0x03,0x68,0x02,0x40,0x21,0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x35,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x08,0x21,0x03,0x4d,0x10,0x04,0x40,0x03,0x02,0x21,0x03,0x4d,0x10,0x06,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04, 0x05,0x21,0x03,0x4d,0x10,0x03,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x32,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x0c,0x36,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x37,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f, 0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0b,0x61,0x00,0x2b,0x10,0x00,0x61,0x00, 0x0f,0x61,0x00,0x2c,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x2d,0x10,0x00,0x61,0x00, 0x17,0x61,0x00,0x2e,0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x2f,0x10,0x00,0x61,0x00, 0x1f,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x31,0x10,0x00,0x61,0x00, 0x27,0x61,0x00,0x32,0x10,0x00,0x61,0x22,0x0c,0x61,0x00,0x03,0x10,0x00,0x61,0x00, 0x10,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x05,0x10,0x00,0x61,0x00, 0x18,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x07,0x10,0x00,0x61,0x00, 0x20,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x09,0x10,0x00,0x61,0x00, 0x28,0x61,0x00,0x0a,0x10,0x00,0x61,0x24,0x0d,0x61,0x00,0x33,0x10,0x00,0x61,0x00, 0x11,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x35,0x10,0x00,0x61,0x00, 0x19,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x37,0x10,0x00,0x61,0x00, 0x21,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x39,0x10,0x00,0x61,0x00, 0x29,0x61,0x00,0x3a,0x10,0x00,0x61,0x21,0x2b,0x61,0x00,0x3b,0x10,0x00,0x61,0x23, 0x2c,0x61,0x00,0x41,0x10,0x00,0x61,0x25,0x2d,0x61,0x00,0x4e,0x10,0x00,0x61,0x00, 0x2f,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x30,0x61,0x00,0x42,0x10,0x00,0x61,0x00, 0x31,0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x33,0x61,0x00,0x3d,0x10,0x00,0x61,0x00, 0x34,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x35,0x61,0x00,0x50,0x10,0x00,0x61,0x00, 0x37,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x38,0x61,0x00,0x44,0x10,0x00,0x61,0x00, 0x39,0x61,0x00,0x51,0x10,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01,0xa4,0x3f, 0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x68,0x60,0x11,0x11,0x00,0x61,0x00, 0x02,0x68,0x38,0x15,0x11,0x00,0x61,0x00,0x02,0x68,0x98,0x19,0x11,0x00,0x61,0x00, 0x02,0x68,0x90,0x1d,0x11,0x00,0x61,0x00,0x02,0x68,0xa8,0x21,0x11,0x00,0x61,0x00, 0x02,0x68,0xa0,0x25,0x11,0x00,0x61,0x00,0x02,0x68,0x88,0x29,0x11,0x00,0x40,0x07, 0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x40,0x03,0x40,0x03,0x61,0x00, 0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x68,0x60,0x31,0x11,0x00,0x61,0x00,0x03,0x68,0x38,0x35,0x11,0x00,0x61,0x00, 0x03,0x68,0x98,0x39,0x11,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01, 0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x01,0x04,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x03,0x24,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x05,0x44,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x07,0x64,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f, 0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x72,0x3f,0x11,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02, 0x3f,0x68,0xa8,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x04,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x33,0x00,0x00,0x69,0x00,0x05,0x68,0x6a,0x01,0x11,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x41,0x00, 0x07,0x68,0x6a,0x01,0x31,0x00,0x40,0x04,0x05,0xa8,0x22,0x3f,0x11,0x05,0x40,0x00, 0x3f,0x68,0x02,0x3f,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01, 0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x3f,0xa8,0xca,0x3f,0x11,0x07,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0xd8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xc9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x02,0x21,0x53,0x4d,0x10,0x01,0x69,0x3a, 0x06,0x68,0x5a,0x3f,0x11,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f, 0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x03,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x03, 0x06,0xa8,0x02,0x3f,0x11,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x3f,0xa8,0x52,0x3f,0x11,0x01,0x31,0xfc, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00,0x69,0x04, 0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03, 0x02,0x68,0x02,0x3f,0x21,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x03,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x40,0x68,0x02,0x40,0x01,0x01,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x06, 0x05,0x21,0x03,0x4d,0x10,0x04,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x08,0x21,0x03,0x4d,0x10,0x07,0x40,0x06,0x09,0x21,0x03,0x4d,0x10,0x02,0x69,0x05, 0x01,0x68,0x8a,0x40,0x21,0x00,0x40,0x00,0x40,0xa8,0x0a,0x40,0x11,0x3f,0x31,0xdd, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xce, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x65,0x07, 0x00,0x00,0x60,0x86,0x45,0x04,0x04,0x03,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03, 0x02,0x68,0x02,0x40,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x06,0x06,0x21,0x53,0x4d,0x10,0x01,0x31,0xd0, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xc3, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x2f,0x00,0x00,0x40,0x03, 0x03,0x21,0x03,0x4d,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x31,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x31,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x31,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x3f,0x68,0x02,0x3f,0x01,0x01,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x02, 0x04,0x68,0x02,0x3f,0x21,0x00,0x40,0x00,0x3f,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x21,0x03,0x4d,0x10,0x04,0x40,0x03, 0x06,0x21,0x53,0x4d,0x10,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x37,0x03,0x68,0x42,0x3f,0x01,0x04,0x31,0xc1, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xb2, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x36, 0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x40, 0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x03,0x04,0x21,0x03,0x4d,0x10,0x03,0x31,0xb8, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x2b,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x2f,0x00,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x61,0x00, 0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x2f,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x04, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04, 0x05,0xa8,0xca,0x3f,0x11,0x05,0x40,0x04,0x07,0xa8,0xca,0x3f,0x11,0x07,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00, 0x3f,0x68,0x02,0x3f,0x01,0x01,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f, 0x00,0x06,0xe4,0x01,0x00,0x00,0x41,0x00,0x03,0x68,0x6a,0x01,0x51,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x05,0xc4,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x07,0xc4,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x31,0x4a, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x40,0x03, 0x03,0xa8,0x22,0x3f,0x11,0x03,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x05,0x24,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x00, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0x4b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x1b,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04, 0x02,0x21,0x53,0x4d,0x10,0x01,0x40,0x00,0x03,0xa8,0x0a,0x3f,0x11,0x3f,0x41,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xef, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xd0, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xc3, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x27,0x00,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x02, 0x09,0xa8,0x52,0x3f,0x11,0x01,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x04,0x68,0x02,0x03,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x65,0x00,0x00,0x00,0x60,0x86,0x05,0x03,0xc4,0x01, 0x00,0x06,0xfc,0xff,0xff,0x3f,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0d,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05, 0x02,0x68,0x02,0x09,0x21,0x00,0x40,0x03,0x03,0xa8,0x02,0x3f,0x11,0x03,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x06,0x21,0x03,0x4d,0x10,0x04,0x69,0x04, 0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x04, 0x0a,0x21,0x03,0x4d,0x10,0x02,0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x45,0x05,0x84,0x3f,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00, 0x02,0x68,0x5a,0x3f,0x61,0x00,0x41,0x00,0x03,0x68,0x5a,0x3f,0x71,0x00,0x40,0x03, 0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f,0x00,0x06,0x44,0x05,0x00,0x00,0x40,0x03, 0x02,0xa8,0x02,0x3f,0x11,0x02,0x40,0x03,0x3f,0xa8,0x02,0x3f,0x11,0x03,0x31,0xf5, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x08,0x21,0x13,0x4d,0x10,0x07,0x69,0x03,0x09,0x68,0x02,0x02,0x21,0x00,0x01,0x35, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x03,0x4d,0x10,0x04,0x69,0x06, 0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x05, 0x04,0x68,0x02,0x3f,0x21,0x00,0x31,0xd8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x49,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x1d,0x00,0x00,0x40,0x00,0x05,0xa8,0x42,0x3f,0x11,0x05,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x13,0x4d,0x10,0x07,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a,0x21,0x03,0x4d,0x10,0x09,0x01,0x36, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x06,0x21,0x03,0x4d,0x10,0x04,0x40,0x00, 0x40,0x68,0x02,0x40,0x01,0x01,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x29,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f, 0x00,0x06,0x04,0x07,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x02, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07, 0x00,0x00,0x60,0x86,0x45,0x08,0x44,0x05,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x05, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x40,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x32, 0x06,0x68,0x02,0x40,0x21,0x00,0x40,0x00,0x40,0xa8,0x52,0x40,0x11,0x01,0x31,0xea, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xfb, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0xfc, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x33,0x00,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06, 0x02,0x68,0x5a,0x3f,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x4d,0x10,0x06,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07, 0x03,0x68,0x22,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x40,0x21,0x00,0x31,0xdd, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x37,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04, 0x09,0x21,0x03,0x4d,0x10,0x02,0x40,0x02,0x07,0x21,0x03,0x4d,0x10,0x06,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x04,0x21,0x03,0x4d,0x10,0x03,0x31,0xfe, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xcf, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x31,0x00,0x00,0x31,0x90, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x35,0x00,0x00,0x31,0xb3, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x39,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x29,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x29,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x41,0x00, 0x07,0x68,0x6a,0x01,0x31,0x00,0x69,0x00,0x05,0x68,0x6a,0x01,0x11,0x00,0x40,0x00, 0x3f,0x68,0x02,0x3f,0x01,0x01,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01, 0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x07,0xa8,0x22,0x3f,0x11,0x07,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x00, 0x03,0x68,0x6a,0x01,0x51,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x05,0xa8,0xca,0x3f,0x11,0x05,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07, 0x07,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x06,0x3f,0xa8,0xca,0x3f,0x11,0x03,0x69,0x00, 0x03,0x68,0x5a,0x3f,0x11,0x00,0x31,0x44,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xf5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x03,0xa8,0x62,0x3f,0x11,0x03,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x35, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x05,0x68,0x62,0x3f,0x21,0x00,0x69,0x07, 0x01,0x68,0x8a,0x07,0x21,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xf9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x14,0x1f,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06,0x21,0x13,0x4d,0x10,0x05,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02, 0x02,0x21,0x53,0x4d,0x10,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x04,0x68,0x22,0x03,0x21,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f,0x00,0x05,0x03,0x00,0x03,0x00,0x65,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x06,0xfc,0xff,0xff,0x3f,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x03,0x84,0x3f,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04, 0x3f,0xa8,0x12,0x3f,0x11,0x03,0x31,0xf1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xf2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08,0x21,0x03,0x4d,0x10,0x04,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x06,0x68,0x22,0x05,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x02,0x68,0x82,0x01,0x21,0x00,0x69,0x04,0x04,0x68,0x02,0x3f,0x21,0x00,0x31,0xca, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x25,0x05,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x04, 0x09,0x21,0x03,0x4d,0x10,0x06,0x40,0x04,0x07,0x21,0x03,0x4d,0x10,0x02,0x01,0x3a, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x4d,0x10,0x04,0x40,0x00, 0x40,0x68,0x02,0x40,0x01,0x01,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x44,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x06,0x24,0x05, 0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x03,0x03,0x68,0x62,0x40,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x00, 0x40,0xa8,0x02,0x40,0x11,0x03,0x31,0xee,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x14,0x2b,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06, 0x06,0x68,0x5a,0x3f,0x21,0x00,0x69,0x04,0x01,0x68,0x8a,0x40,0x21,0x00,0x31,0xcf, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0xb0, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x33,0x00,0x00,0x40,0x07, 0x04,0x21,0x13,0x4d,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x4d,0x10,0x06,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03, 0x02,0x21,0x53,0x4d,0x10,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x31,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x35,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x25,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x40, 0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x09,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x40, 0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x24,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f, 0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x22, 0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x0a,0x61,0x00,0x2b,0x10,0x00,0x61,0x00, 0x0e,0x61,0x00,0x2c,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x2d,0x10,0x00,0x61,0x00, 0x16,0x61,0x00,0x2e,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x2f,0x10,0x00,0x61,0x00, 0x1e,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x31,0x10,0x00,0x61,0x00, 0x26,0x61,0x00,0x32,0x10,0x00,0x61,0x21,0x2a,0x61,0x00,0x3b,0x10,0x00,0x61,0x24, 0x36,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x3c,0x10,0x00,0x61,0x00, 0x32,0x61,0x00,0x3d,0x10,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01,0xa4,0x3f, 0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x68,0x60,0x0e,0x11,0x00,0x61,0x00, 0x02,0x68,0x38,0x12,0x11,0x00,0x61,0x00,0x02,0x68,0x98,0x16,0x11,0x00,0x61,0x00, 0x02,0x68,0x90,0x1a,0x11,0x00,0x61,0x00,0x02,0x68,0xa8,0x1e,0x11,0x00,0x61,0x00, 0x02,0x68,0xa0,0x22,0x11,0x00,0x61,0x00,0x02,0x68,0x88,0x26,0x11,0x00,0x40,0x07, 0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0xe0,0x02,0xe0,0x02,0x61,0x00, 0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x68,0x60,0x2e,0x11,0x00,0x61,0x00,0x03,0x68,0x38,0x32,0x11,0x00,0x61,0x00, 0x03,0x68,0x98,0x36,0x11,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01, 0x00,0x01,0x40,0x05,0x40,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0x04,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x02,0x24,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x04,0x44,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x68,0x06,0x01,0x06,0x64,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f, 0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x72,0x3f,0x11,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02, 0x3f,0x68,0xa8,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x22,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f, 0x00,0x06,0x84,0x3f,0x00,0x00,0x69,0x00,0x05,0x68,0x5a,0x3f,0x11,0x00,0x41,0x00, 0x08,0x68,0x5a,0x3f,0x31,0x00,0x40,0x00,0x02,0x21,0x13,0x4d,0x10,0x3f,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00, 0x40,0xa8,0x0a,0x40,0x11,0x3f,0x69,0x06,0x03,0x68,0x82,0x01,0x21,0x00,0x40,0x06, 0x05,0xa8,0x02,0x3f,0x11,0x05,0x40,0x06,0x3f,0xa8,0x02,0x3f,0x11,0x08,0x31,0xe8, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x69,0x04, 0x01,0x68,0x8a,0x40,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x4d,0x10,0x03,0x69,0x04, 0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x02,0x68,0x02,0x3f,0x21,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x03,0x21,0x2b,0x4d,0x10,0x3f,0x40,0x03, 0x07,0x21,0x03,0x4d,0x10,0x06,0x40,0x03,0x09,0x21,0x03,0x4d,0x10,0x02,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x53,0x4d,0x10,0x01,0x31,0xba, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xab, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xcc, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x31,0x9d, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x21,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x21,0x00,0x00,0x40,0x00, 0x3f,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x00,0x02,0x21,0x13,0x4d,0x10,0x3f,0x69,0x02, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x04,0x21,0x2b,0x4d,0x10,0x3f,0x40,0x03, 0x03,0x21,0x53,0x4d,0x10,0x01,0x31,0xde,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0a,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x20,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x20,0x00,0x00,0x69,0x00,0x05,0x68,0x5a,0x3f,0x11,0x00,0x41,0x00, 0x08,0x68,0x5a,0x3f,0x31,0x00,0x40,0x00,0x02,0x21,0x13,0x4d,0x10,0x3f,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f,0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x05, 0x05,0xa8,0x62,0x3f,0x11,0x05,0x40,0x05,0x08,0xa8,0x62,0x3f,0x11,0x08,0x31,0xd7, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x69,0x03, 0x03,0x68,0x82,0x01,0x21,0x00,0x69,0x03,0x06,0x68,0x22,0x05,0x21,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03, 0x02,0x68,0x22,0x08,0x21,0x00,0x65,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01, 0x00,0x06,0xfc,0xff,0xff,0x3f,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f, 0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x03,0x09,0x21,0x03,0x4d,0x10,0x02,0x40,0x03, 0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x03, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x41,0x00, 0x02,0x68,0x5a,0x3f,0x61,0x00,0x40,0x07,0x04,0x21,0x03,0x4d,0x10,0x03,0x40,0x07, 0x07,0x21,0x03,0x4d,0x10,0x06,0x69,0x05,0x03,0x68,0x82,0x01,0x21,0x00,0x40,0x04, 0x02,0xa8,0x02,0x3f,0x11,0x02,0x69,0x06,0x06,0x68,0x22,0x05,0x21,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f,0x00,0x05,0x07,0x00,0x07,0x00,0x31,0xe1, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xd2, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00, 0x05,0xa8,0x02,0x40,0x11,0x05,0x69,0x04,0x08,0x68,0x62,0x02,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x03,0x4d,0x10,0x03,0x40,0x05, 0x3f,0xa8,0x52,0x3f,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x4d,0x10,0x06,0x40,0x00, 0x40,0xa8,0x02,0x40,0x11,0x08,0x31,0x40,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x1e,0x00,0x00,0x69,0x05,0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f, 0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x04,0x03,0x68,0x02,0x3f,0x21,0x00,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x13,0x4d,0x10,0x08,0x69,0x04, 0x01,0x68,0x8a,0x40,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07, 0x07,0x68,0x02,0x05,0x21,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x22,0x00,0x00,0x40,0x00,0x06,0x21,0x2b,0x4d,0x10,0x3f,0x40,0x06, 0x02,0x21,0x13,0x4d,0x10,0x05,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06, 0x04,0x21,0x03,0x4d,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x4d,0x10,0x07,0x40,0x06, 0x03,0x21,0x53,0x4d,0x10,0x01,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xda,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2a,0x00,0x00,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x32,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x36,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x1d,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x1d,0x00,0x00,0x69,0x00,0x05,0x68,0x5a,0x3f,0x11,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f,0x00,0x06,0x84,0x3f,0x00,0x00,0x41,0x00, 0x08,0x68,0x5a,0x3f,0x31,0x00,0x40,0x03,0x05,0xa8,0x62,0x3f,0x11,0x05,0x40,0x00, 0x02,0x21,0x13,0x4d,0x10,0x3f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x05,0x03,0x68,0x82,0x01,0x21,0x00,0x40,0x05, 0x08,0xa8,0x02,0x3f,0x11,0x08,0x69,0x05,0x06,0x68,0x22,0x05,0x21,0x00,0x65,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x06,0xfc,0xff,0xff,0x3f,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f,0x00,0x05,0x05,0x00,0x05,0x00,0x31,0xfe, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x40,0x02, 0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x01,0x3e, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x02,0x68,0x02,0x08,0x21,0x00,0x40,0x04, 0x3f,0xa8,0x12,0x3f,0x11,0x05,0x40,0x00,0x40,0xa8,0x02,0x40,0x11,0x05,0x40,0x07, 0x04,0x21,0x03,0x4d,0x10,0x03,0x40,0x07,0x07,0x21,0x03,0x4d,0x10,0x06,0x69,0x06, 0x08,0x68,0x5a,0x3f,0x21,0x00,0x40,0x06,0x09,0x21,0x03,0x4d,0x10,0x02,0x69,0x07, 0x03,0x68,0x82,0x01,0x21,0x00,0x69,0x07,0x06,0x68,0x02,0x3f,0x21,0x00,0x69,0x07, 0x01,0x68,0x8a,0x40,0x21,0x00,0x31,0xff,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xe5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x00,0x02,0x21,0x2b,0x4d,0x10,0x3f,0x01,0x3f, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x4d,0x10,0x03,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04, 0x07,0x21,0x03,0x4d,0x10,0x06,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x09,0x21,0x03,0x4d,0x10,0x08,0x40,0x05,0x03,0x21,0x53,0x4d,0x10,0x01,0x31,0xc7, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb1, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xd2, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x31,0xa0, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0x93, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x32,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x1b,0x00,0x00,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20, 0x0b,0x61,0x00,0x2b,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x2c,0x10,0x00,0x61,0x00, 0x13,0x61,0x00,0x2d,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x2e,0x10,0x00,0x61,0x00, 0x1b,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x30,0x10,0x00,0x61,0x00, 0x23,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x32,0x10,0x00,0x61,0x22, 0x0c,0x61,0x00,0x03,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x04,0x10,0x00,0x61,0x00, 0x14,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x06,0x10,0x00,0x61,0x00, 0x1c,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x08,0x10,0x00,0x61,0x00, 0x24,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x0a,0x10,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21, 0x33,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x37,0x61,0x00,0x3e,0x10,0x00,0x61,0x23, 0x34,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x38,0x61,0x00,0x44,0x10,0x00,0x61,0x00, 0x2b,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x41,0x10,0x00,0x61,0x00, 0x2f,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x30,0x61,0x00,0x42,0x10,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00, 0x00,0x00,0x50,0x85,0xe5,0x01,0xa4,0x3f,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x68,0x60,0x10,0x11,0x00,0x61,0x00,0x02,0x68,0x38,0x14,0x11,0x00,0x61,0x00, 0x02,0x68,0x98,0x18,0x11,0x00,0x61,0x00,0x02,0x68,0x90,0x1c,0x11,0x00,0x61,0x00, 0x02,0x68,0xa8,0x20,0x11,0x00,0x61,0x00,0x02,0x68,0xa0,0x24,0x11,0x00,0x61,0x00, 0x02,0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01, 0x00,0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0c, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x68,0x60,0x30,0x11,0x00,0x61,0x00, 0x03,0x68,0x38,0x34,0x11,0x00,0x61,0x00,0x03,0x68,0x98,0x38,0x11,0x00,0x40,0x00, 0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x00, 0x00,0x00,0x68,0x06,0x81,0x00,0x04,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x02,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x04,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x68,0x06,0x81,0x06,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x3f,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00, 0x01,0x68,0x72,0x3f,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x3f,0x68,0xa8,0x01,0x11,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xfe,0xff,0xff,0x70,0x00, 0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00, 0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x19,0x00,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x40,0x04, 0x05,0xa8,0x22,0x3f,0x11,0x05,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x06, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06, 0x3f,0xa8,0xca,0x3f,0x11,0x07,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0xd8, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xc9, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xaa, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x02,0x21,0x53,0x4d,0x10,0x01,0x69,0x3a, 0x06,0x68,0x5a,0x3f,0x11,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f, 0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x17,0x00,0x00,0x40,0x00,0x03,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x03, 0x06,0xa8,0x02,0x3f,0x11,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x3f,0xa8,0x52,0x3f,0x11,0x01,0x31,0xfc, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00,0x69,0x04, 0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x02,0x68,0x02,0x3f,0x21,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x03,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x40,0x68,0x02,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x06,0x05,0x21,0x03,0x4d,0x10,0x04,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x4d,0x10,0x07,0x40,0x06, 0x09,0x21,0x03,0x4d,0x10,0x02,0x69,0x05,0x01,0x68,0x8a,0x40,0x21,0x00,0x40,0x00, 0x40,0xa8,0x0a,0x40,0x11,0x3f,0x31,0xdd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x18,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x04,0x04,0x03, 0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03, 0x02,0x68,0x02,0x40,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x06,0x06,0x21,0x53,0x4d,0x10,0x01,0x31,0xd1, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x31,0xc2, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2f,0x00,0x00,0x40,0x03, 0x03,0x21,0x03,0x4d,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x30,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x16,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x16,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x02, 0x04,0x68,0x02,0x3f,0x21,0x00,0x40,0x00,0x3f,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x06, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x0c,0x0f,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x21,0x03,0x4d,0x10,0x04,0x40,0x03, 0x06,0x21,0x53,0x4d,0x10,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x36,0x03,0x68,0x42,0x3f,0x01,0x02,0x31,0xc7, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xb0, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x05, 0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x40,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03, 0x04,0x21,0x03,0x4d,0x10,0x03,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x2b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x06,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x14,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x68,0x6a,0x01,0x11,0x00,0x41,0x00, 0x07,0x68,0x6a,0x01,0x31,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01, 0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x05,0xa8,0xca,0x3f,0x11,0x05,0x40,0x04, 0x07,0xa8,0xca,0x3f,0x11,0x07,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01, 0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x41,0x00, 0x03,0x68,0x6a,0x01,0x51,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0xc4,0x01, 0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07,0xc4,0x01, 0x00,0x05,0x07,0x00,0x07,0x00,0x31,0x4a,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0b,0x00,0x00,0x40,0x03,0x03,0xa8,0x22,0x3f,0x11,0x03,0x40,0x03, 0x00,0x00,0x60,0x06,0x25,0x05,0x24,0x3f,0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x00, 0x01,0x68,0x8a,0x3f,0x21,0x00,0x31,0x4b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xfc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x1b,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x02,0x21,0x53,0x4d,0x10,0x01,0x40,0x00, 0x03,0xa8,0x0a,0x3f,0x11,0x3f,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x3f, 0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x27,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f, 0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x03,0x21,0x00,0x40,0x03, 0x09,0xa8,0x52,0x3f,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x65,0x00,0x00,0x00,0x60,0x86,0x05,0x03,0xc4,0x01, 0x00,0x06,0xfc,0xff,0xff,0x3f,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04, 0x02,0x68,0x02,0x09,0x21,0x00,0x40,0x03,0x03,0xa8,0x02,0x3f,0x11,0x03,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x06,0x21,0x03,0x4d,0x10,0x04,0x69,0x04,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05, 0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x04,0x0a,0x21,0x03,0x4d,0x10,0x02,0x69,0x04, 0x04,0x68,0x02,0x03,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x05,0x84,0x3f, 0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x02,0x68,0x5a,0x3f,0x61,0x00,0x41,0x00, 0x03,0x68,0x5a,0x3f,0x71,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x3f, 0x00,0x06,0x44,0x05,0x00,0x00,0x40,0x03,0x02,0xa8,0x02,0x3f,0x11,0x02,0x40,0x03, 0x3f,0xa8,0x02,0x3f,0x11,0x03,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x10,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08,0x21,0x13,0x4d,0x10,0x07,0x69,0x03, 0x09,0x68,0x02,0x02,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x06,0x21,0x03,0x4d,0x10,0x04,0x69,0x06,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05, 0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x05,0x04,0x68,0x02,0x3f,0x21,0x00,0x31,0xd8, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0x49, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xb5, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x40,0x00, 0x05,0xa8,0x42,0x3f,0x11,0x05,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x13,0x4d,0x10,0x07,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x0a,0x21,0x03,0x4d,0x10,0x09,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x06,0x21,0x03,0x4d,0x10,0x04,0x40,0x00, 0x40,0x68,0x02,0x40,0x81,0x00,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a, 0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x28,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x05, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f, 0x00,0x06,0x04,0x07,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x02, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07, 0x00,0x00,0x60,0x86,0x45,0x08,0x44,0x05,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x05, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x40,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x30, 0x06,0x68,0x02,0x40,0x21,0x00,0x40,0x00,0x40,0xa8,0x52,0x40,0x11,0x01,0x31,0xea, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x31,0xfb, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x2f,0x00,0x00,0x31,0xfc, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x33,0x00,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06, 0x02,0x68,0x5a,0x3f,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x4d,0x10,0x06,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07, 0x03,0x68,0x22,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x40,0x21,0x00,0x31,0xdd, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x37,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04, 0x09,0x21,0x03,0x4d,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x4d,0x10,0x03,0x40,0x04, 0x07,0x21,0x03,0x4d,0x10,0x06,0x31,0xfe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x34,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x38,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0e,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0x31,0x00,0x69,0x00, 0x05,0x68,0x6a,0x01,0x11,0x00,0x40,0x00,0x3f,0x68,0x02,0x3f,0x81,0x00,0x65,0x05, 0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05, 0x07,0xa8,0x22,0x3f,0x11,0x07,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01, 0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x00,0x03,0x68,0x6a,0x01,0x51,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x07, 0x05,0xa8,0xca,0x3f,0x11,0x05,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f, 0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x07,0xa8,0x0a,0x3f,0x11,0x3f,0x40,0x06, 0x3f,0xa8,0xca,0x3f,0x11,0x03,0x69,0x00,0x03,0x68,0x5a,0x3f,0x11,0x00,0x31,0x43, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xf4, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03, 0x03,0xa8,0x62,0x3f,0x11,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x05,0x68,0x62,0x3f,0x21,0x00,0x69,0x07, 0x01,0x68,0x8a,0x07,0x21,0x00,0x31,0xe8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04, 0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02, 0x06,0x21,0x13,0x4d,0x10,0x05,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02, 0x02,0x21,0x53,0x4d,0x10,0x01,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06, 0x04,0x68,0x22,0x03,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x84,0x3f, 0x00,0x05,0x03,0x00,0x03,0x00,0x65,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01, 0x00,0x06,0xfc,0xff,0xff,0x3f,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0x84,0x3f, 0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x3f, 0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x3f, 0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04,0x3f,0xa8,0x12,0x3f,0x11,0x03,0x31,0xf7, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xf0, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x10,0x00,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07, 0x08,0x21,0x03,0x4d,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x06,0x68,0x22,0x05,0x21,0x00,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x82,0x01,0x21,0x00,0x69,0x04, 0x04,0x68,0x02,0x3f,0x21,0x00,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x14,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x05,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x04,0x09,0x21,0x03,0x4d,0x10,0x06,0x40,0x04, 0x07,0x21,0x03,0x4d,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x4d,0x10,0x04,0x40,0x00, 0x40,0x68,0x02,0x40,0x81,0x00,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09, 0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x44,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x06,0x24,0x05, 0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x03,0x03,0x68,0x62,0x40,0x21,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x85,0x3f,0x04,0x40,0x00,0x06,0x84,0x3f,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x00, 0x40,0xa8,0x02,0x40,0x11,0x03,0x31,0xee,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x0c,0x2b,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e, 0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x06,0x68,0x5a,0x3f,0x21,0x00,0x69,0x04, 0x01,0x68,0x8a,0x40,0x21,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x0c,0x2f,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x0c,0x33,0x00,0x00,0x40,0x07,0x04,0x21,0x13,0x4d,0x10,0x03,0x01,0x3d, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x4d,0x10,0x06,0x01,0x3f, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x02,0x21,0x53,0x4d,0x10,0x01,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xc2, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xb3, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0xa4, 0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x34,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xe4,0x3f,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x00, 0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x0b,0x68,0x82,0x3f,0x01,0x04,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x05, 0x02,0x62,0x80,0x01,0x11,0x00,0x61,0x00,0x02,0x62,0xc8,0x40,0x11,0x00,0x40,0x00, 0x00,0x00,0x60,0x86,0x25,0x0b,0xe4,0x3f,0x00,0x05,0x60,0x00,0x60,0x00,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x05, 0x02,0x62,0x00,0x0b,0x11,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x06,0x00,0x06,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x0c,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x02,0x62,0x20,0x0b,0x11,0x00,0x61,0x20, 0x51,0x61,0x00,0x2b,0x10,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x14,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x35,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x02,0x62,0x80,0x3f,0x11,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x61,0x00, 0x4d,0x61,0x00,0x2c,0x10,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x05,0x33,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x36,0x02,0x62,0x80,0x01,0x11,0x00,0x61,0x00, 0x49,0x61,0x00,0x2d,0x10,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x37,0x02,0x62,0x00,0x0b,0x11,0x00,0x61,0x00, 0x45,0x61,0x00,0x2e,0x10,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x20,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x02,0x62,0x20,0x0b,0x11,0x00,0x61,0x00, 0x41,0x61,0x00,0x2f,0x10,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x24,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x3b,0x61,0x00,0x30,0x10,0x00,0x61,0x00, 0x37,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x32,0x10,0x00,0x61,0x28, 0x52,0x61,0x00,0x03,0x10,0x00,0x61,0x00,0x4e,0x61,0x00,0x04,0x10,0x00,0x61,0x00, 0x4a,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x46,0x61,0x00,0x06,0x10,0x00,0x61,0x00, 0x42,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x3c,0x61,0x00,0x08,0x10,0x00,0x61,0x00, 0x38,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x0a,0x10,0x00,0x61,0x29, 0x53,0x61,0x00,0x0c,0x10,0x00,0x61,0x00,0x4f,0x61,0x00,0x0d,0x10,0x00,0x61,0x00, 0x4b,0x61,0x00,0x0e,0x10,0x00,0x61,0x00,0x47,0x61,0x00,0x0f,0x10,0x00,0x61,0x00, 0x43,0x61,0x00,0x10,0x10,0x00,0x61,0x00,0x3d,0x61,0x00,0x11,0x10,0x00,0x61,0x00, 0x39,0x61,0x00,0x12,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x13,0x10,0x00,0x61,0x25, 0x54,0x61,0x00,0x14,0x10,0x00,0x61,0x00,0x50,0x61,0x00,0x15,0x10,0x00,0x61,0x00, 0x4c,0x61,0x00,0x16,0x10,0x00,0x61,0x00,0x48,0x61,0x00,0x17,0x10,0x00,0x61,0x00, 0x44,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x3e,0x61,0x00,0x19,0x10,0x00,0x61,0x00, 0x3a,0x61,0x00,0x1a,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x1b,0x10,0x00,0x61,0x26, 0x0d,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x09,0x61,0x00,0x36,0x10,0x00,0x61,0x00, 0x11,0x61,0x00,0x34,0x10,0x00,0x61,0x27,0x12,0x61,0x00,0x1d,0x10,0x00,0x61,0x00, 0x0e,0x61,0x00,0x1e,0x10,0x00,0x61,0x00,0x0a,0x61,0x00,0x1f,0x10,0x00,0x61,0x20, 0x13,0x61,0x00,0x21,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x22,0x10,0x00,0x61,0x00, 0x0b,0x61,0x00,0x23,0x10,0x00,0x61,0x2a,0x14,0x61,0x00,0x25,0x10,0x00,0x61,0x00, 0x10,0x61,0x00,0x26,0x10,0x00,0x61,0x00,0x0c,0x61,0x00,0x27,0x10,0x00,0x61,0x00, 0x35,0x61,0x00,0x20,0x10,0x00,0x61,0x00,0x36,0x61,0x00,0x24,0x10,0x00,0x61,0x00, 0x34,0x61,0x00,0x1c,0x10,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f, 0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x07,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x3f,0x04,0x3f, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x04,0x68,0x6a,0x01,0x11,0x00,0x41,0x00, 0x06,0x68,0x6a,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x04,0x0a,0x02,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40, 0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x3f, 0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x07,0x04,0xa8,0x22,0x3f,0x11,0x04,0x40,0x07, 0x3f,0xa8,0xca,0x3f,0x11,0x06,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x24,0x51,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x24,0x4d,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b, 0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x40, 0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xcd, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x49,0x00,0x00,0x31,0xbe, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x45,0x00,0x00,0x31,0xaf, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x33,0x00,0x00,0x31,0x90, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x11,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x3f,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04, 0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x3f,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x04, 0x00,0x00,0x60,0x86,0x45,0x04,0x04,0x40,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xb1, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x51,0x00,0x00,0x31,0xa2, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0x93, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x33,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x61,0x00, 0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x3f,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00, 0x04,0x68,0x6a,0x01,0x11,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f, 0x00,0x06,0xc4,0x01,0x00,0x00,0x41,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x65,0x05, 0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x3f,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x05, 0x04,0xa8,0xca,0x3f,0x11,0x04,0x31,0xa4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x24,0x51,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06,0xa8,0xca,0x3f,0x11,0x06,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x34, 0x02,0x68,0x6a,0x01,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01, 0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x04,0xc4,0x01, 0x00,0x05,0x06,0x00,0x06,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x02,0xa8,0x22,0x3f,0x11,0x02,0x40,0x04, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04, 0x00,0x00,0x60,0x06,0x25,0x04,0x24,0x3f,0x00,0x06,0x24,0x04,0x00,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0x25,0x06,0xc4,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x31,0xf5, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0xf6, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x49,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0xa8,0x42,0x3f,0x11,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f, 0x00,0x06,0x24,0x06,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01, 0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xe5,0x01,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0x47, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x45,0x00,0x00,0x31,0xe8, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x41,0x00,0x00,0x31,0xc9, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x3b,0x00,0x00,0x31,0xba, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x37,0x00,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37, 0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x07,0x04,0x40, 0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03, 0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07, 0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdb, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xcc, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x33,0x00,0x00,0x31,0xad, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x11,0x00,0x00,0x31,0x9e, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x0d,0x00,0x00,0x31,0xbf, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x09,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x3f,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00, 0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x3f,0x04,0x3f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00, 0x04,0x68,0x6a,0x01,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x3f, 0x00,0x06,0xff,0xff,0xff,0x0f,0x41,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x31,0xa0, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x51,0x00,0x00,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04, 0x04,0xa8,0xca,0x3f,0x11,0x04,0x69,0x30,0x02,0x68,0x6a,0x01,0x21,0x00,0x41,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0xc4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x68,0x00, 0x00,0x00,0x20,0x82,0x05,0x40,0x04,0x40,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x06, 0x06,0xa8,0x22,0x3f,0x11,0x06,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x02,0xa8,0x22,0x3f,0x11,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x04,0x44,0x3f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x06, 0x00,0x00,0x60,0x06,0x25,0x3f,0x24,0x3f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x3f,0x44,0x3f,0x00,0x06,0x04,0x04,0x00,0x00,0x31,0xf1, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0xd2, 0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x49,0x00,0x00,0x68,0x06, 0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05, 0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04, 0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x3f, 0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x32,0x00,0x00,0x60,0x86,0x45,0x05,0x04,0x40, 0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07, 0x00,0xa0,0x24,0x45,0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08, 0x00,0xa0,0x24,0x41,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03, 0x00,0xa0,0x24,0x3b,0x00,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05, 0x00,0xa0,0x24,0x33,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06, 0x00,0xa0,0x24,0x11,0x00,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02, 0x00,0xa0,0x24,0x0d,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0x01, 0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01, 0x02,0x68,0x02,0x40,0xf1,0x01,0x6c,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x01, 0x00,0x05,0x1f,0x00,0x1f,0x00,0x40,0x02,0x40,0xa8,0x02,0x02,0x11,0x40,0x40,0x02, 0x00,0x00,0x60,0x06,0x85,0x01,0xe4,0x01,0x00,0x06,0x84,0x01,0x00,0x00,0x67,0x02, 0x40,0xa8,0x02,0x40,0x11,0x02,0x61,0x00,0x04,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x02, 0x02,0x68,0x3e,0x40,0x11,0x00,0x67,0x04,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01, 0x00,0x06,0xe4,0x01,0x00,0x00,0x38,0xa9,0x00,0x00,0xa0,0x0a,0x45,0x04,0x44,0x02, 0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x25,0x03,0x84,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xc9,0x00,0x00,0xa0,0x02,0x44,0x04,0x44,0x04, 0x02,0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00,0x00,0x60,0x0a,0x25,0x02,0x44,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a,0x45,0x03,0x24,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x05,0x05,0x44,0x04, 0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x02,0x04,0x40, 0x00,0x06,0x24,0x02,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06,0x45,0x03,0x84,0x01, 0x00,0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06,0xe8,0x05,0x05,0x11,0x00,0x61,0x03, 0x03,0x68,0x26,0x02,0x11,0x00,0x61,0x03,0x04,0x68,0x46,0x03,0x11,0x00,0x61,0x03, 0x06,0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x02,0xa8,0x52,0x02,0x11,0x01,0x5b,0x02, 0x00,0x00,0xa0,0x02,0x44,0x02,0x24,0x03,0x82,0x02,0x24,0x06,0x44,0x02,0x5b,0x04, 0x00,0x00,0xa0,0x02,0x04,0x03,0x04,0x04,0x82,0x02,0x24,0x06,0x04,0x03,0x61,0x00, 0x00,0x80,0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x02, 0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02,0x00,0x0a,0x04,0x03,0x00,0x00,0x41,0x01, 0x00,0x00,0xa0,0x0a,0x45,0x04,0x44,0x04,0x00,0x0a,0x44,0x02,0x00,0x00,0x61,0x01, 0x07,0xe8,0x45,0x04,0x11,0x00,0x40,0x01,0x07,0xa8,0x02,0x07,0x11,0x06,0x41,0x01, 0x20,0x22,0x06,0x07,0x11,0x40,0x49,0x00,0x08,0xa8,0x02,0x07,0x11,0x40,0x40,0x07, 0x07,0xa8,0x02,0x07,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01, 0x00,0x06,0x04,0x08,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x84,0x01, 0x00,0x42,0x04,0x40,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0x25,0x07,0x04,0x05, 0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x07,0xa8,0x12,0x07,0x11,0x07,0x67,0x01, 0x40,0xa8,0x02,0x07,0x11,0x02,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80, 0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x44,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63, 0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x50,0x30,0x31,0x30, 0x5f,0x73,0x68,0x69,0x66,0x74,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68, 0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79, 0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61, 0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25, 0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25, 0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25, 0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54, 0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31, 0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30, 0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56, 0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39, 0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30, 0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56, 0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37, 0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30, 0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56, 0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35, 0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30, 0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56, 0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33, 0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30, 0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56, 0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31, 0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30, 0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56, 0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39, 0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30, 0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56, 0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37, 0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30, 0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56, 0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35, 0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30, 0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56, 0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33, 0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31, 0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56, 0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31, 0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31, 0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56, 0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39, 0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31, 0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56, 0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37, 0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69, 0x74,0x65,0x5f,0x50,0x30,0x31,0x30,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x31,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41, 0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72, 0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x20,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x20,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x51,0x20,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x51,0x20,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x20,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x51,0x20,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x51,0x20,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x51,0x20,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x20, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x20,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x51,0x20,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x80,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x23,0x02,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x53,0x80,0x00,0x44,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x53,0x80,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x80,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x20,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x20,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x20,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x20,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00, 0x51,0x20,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x20, 0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x51,0x20, 0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x20,0x01,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x51,0x20,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x20,0x01,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x51,0x20,0x00,0x54,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x53,0x40,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x53,0x40,0x00,0x56,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x53,0x40,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x53,0x40,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x79,0x00,0x00,0x00,0x20,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x7b,0x00, 0x00,0x00,0x01,0x00,0x00,0x7c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24, 0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00, 0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x42, 0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x0a,0x0c,0x00,0x00,0x71,0x09,0x00,0x00,0x03, 0x00,0x7d,0x00,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f, 0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x32,0x2e,0x61,0x73,0x6d,0x7e,0x00,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00, 0x06,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x5c,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x5e,0x00,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x62,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x63,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x64,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x66,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x3c,0x03,0x00,0x06,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x00, 0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x06, 0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x3b,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x3c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0x6c,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x06, 0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x71, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06, 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03, 0x00,0x06,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x76,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x3c,0x03,0x00,0x06,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x7a, 0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x52,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0x7d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0x7d,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7d, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7e,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x6e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x70,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x07,0x01,0x20,0x04,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c, 0x00,0x65,0x00,0x00,0x80,0x10,0x82,0xc6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff, 0x0f,0x65,0x02,0x03,0x62,0x05,0x02,0xf1,0xff,0x69,0x00,0x05,0x68,0x42,0x01,0x21, 0x00,0x69,0x02,0x00,0x00,0x60,0x81,0x05,0x04,0x04,0x03,0x00,0x05,0x03,0x00,0x03, 0x00,0x69,0x00,0x14,0x68,0x42,0x01,0x31,0x00,0x41,0x02,0x20,0x22,0x2e,0x04,0x11, 0x01,0x49,0x00,0x07,0xa8,0x2a,0x04,0x11,0x01,0x41,0x00,0x1a,0x68,0x42,0x01,0xc1, 0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x04,0x08,0x04,0x07,0x05,0x01,0xc4,0x01,0x20, 0x00,0x69,0x00,0x20,0x68,0x42,0x01,0x41,0x00,0x69,0x02,0x08,0x68,0x02,0x08,0x21, 0x00,0x41,0x00,0x26,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x2c,0x68,0x42,0x01,0x81, 0x01,0x41,0x00,0x32,0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x09,0xa8,0x0a,0x08,0x11, 0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x44,0x48, 0x02,0x61,0x02,0x0a,0x62,0x38,0x09,0x11,0x00,0x40,0x00,0x0f,0xa8,0x3a,0x09,0x11, 0x05,0x40,0x00,0x15,0xa8,0x3a,0x09,0x11,0x14,0x40,0x00,0x1b,0xa8,0x3a,0x09,0x11, 0x1a,0x40,0x07,0x21,0xa8,0x3a,0x09,0x11,0x20,0x40,0x07,0x27,0xa8,0x3a,0x09,0x11, 0x26,0x40,0x07,0x2d,0xa8,0x3a,0x09,0x11,0x2c,0x40,0x07,0x33,0xa8,0x3a,0x09,0x11, 0x32,0x31,0xf0,0x04,0x80,0x00,0x00,0x05,0x0b,0x04,0x0a,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xf1,0x04,0x80,0x00,0x00,0x05,0x10,0x04,0x0f,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xe2,0x04,0x80,0x00,0x00,0x05,0x16,0x04,0x15,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x05,0x1c,0x04,0x1b,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x05,0x22,0x04,0x21,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x05,0x28,0x04,0x27,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x05,0x2e,0x04,0x2d,0x00,0xa0,0x00,0x00,0x00, 0x00,0x31,0x97,0x04,0x80,0x00,0x00,0x05,0x34,0x04,0x33,0x00,0xa0,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x60,0x81,0x05,0x06,0xc4,0x01,0x00,0x05,0x07,0x00,0x07, 0x00,0x61,0x00,0x58,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x58,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x04,0x58,0x62,0x00,0x06,0x11, 0x00,0x61,0x00,0x58,0x62,0x60,0x04,0x11,0x00,0x40,0x00,0x59,0x68,0x02,0x06,0x01, 0x02,0x40,0x00,0x5a,0x68,0x02,0x06,0x01,0x04,0x40,0x00,0x5b,0x68,0x02,0x06,0x01, 0x06,0x5b,0x00,0x00,0x00,0x60,0x86,0x04,0x5c,0x64,0x01,0x05,0x01,0x04,0x03,0x04, 0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x41,0x02,0x20,0x22,0x2e,0x5c,0x11, 0x01,0x49,0x00,0x5c,0xa8,0x2a,0x5c,0x11,0x01,0x5b,0x01,0x00,0x00,0x60,0x86,0x04, 0x5d,0x04,0x5c,0x05,0x01,0xc4,0x01,0x20,0x00,0x69,0x01,0x5d,0x68,0x02,0x5d,0x21, 0x00,0x40,0x01,0x5e,0xa8,0x0a,0x5d,0x11,0x01,0x61,0x01,0x5f,0x62,0x38,0x5e,0x11, 0x00,0x40,0x00,0x64,0xa8,0x3a,0x5e,0x11,0x05,0x40,0x00,0x69,0xa8,0x3a,0x5e,0x11, 0x14,0x40,0x00,0x6e,0xa8,0x3a,0x5e,0x11,0x1a,0x69,0x20,0x04,0x00,0x50,0x05,0x05, 0x38,0x05,0x0b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x21,0x04,0x00,0x50,0x05,0x05, 0x39,0x05,0x10,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x22,0x04,0x00,0x50,0x05,0x05, 0x3a,0x05,0x16,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x23,0x04,0x00,0x50,0x05,0x05, 0x3b,0x05,0x1c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x24,0x04,0x00,0x50,0x05,0x05, 0x3c,0x05,0x22,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x25,0x04,0x00,0x50,0x05,0x05, 0x3d,0x05,0x28,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x26,0x04,0x00,0x50,0x05,0x05, 0x3e,0x05,0x2e,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x27,0x04,0x00,0x50,0x05,0x05, 0x3f,0x05,0x34,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x40,0x05,0x0c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x41,0x05,0x11,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x42,0x05,0x17,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x43,0x05,0x1d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x44,0x05,0x23,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x45,0x05,0x29,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x46,0x05,0x2f,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x47,0x05,0x35,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf8,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x44,0x38,0x00,0x00,0x61,0x38,0x58,0x62,0x00,0x59,0x11, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x0d,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x12,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x18,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x1e,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x24,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x2a,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x30,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x05,0x36,0x58,0x05,0xa4,0x01,0x00, 0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x44,0x40,0x00, 0x00,0x61,0x39,0x58,0x62,0x00,0x5a,0x11,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x50,0x05,0x0e,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x51,0x05,0x13,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x52,0x05,0x19,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x53,0x05,0x1f,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x54,0x05,0x25,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x55,0x05,0x2b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x56,0x05,0x31,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x57,0x05,0x37,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xfa,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x44,0x48,0x00,0x00,0x61,0x3a,0x58,0x62,0x00,0x5b,0x11, 0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x44,0x50,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x44,0x48, 0x02,0x69,0x3b,0x00,0x00,0x60,0x81,0x25,0x58,0x04,0x03,0x00,0x05,0x02,0x00,0x02, 0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x58,0x00,0x00,0x00,0x00,0x1f,0x00,0x03, 0x00,0x61,0x00,0x58,0x62,0x00,0x06,0x11,0x00,0x31,0x4c,0x04,0x80,0x00,0x00,0x05, 0x60,0x04,0x5f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4d,0x04,0x80,0x00,0x00,0x05, 0x65,0x04,0x64,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4e,0x04,0x80,0x00,0x00,0x05, 0x6a,0x04,0x69,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x4f,0x04,0x80,0x00,0x00,0x05, 0x6f,0x04,0x6e,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x69,0x2c,0x04,0x00,0x50,0x05,0x05, 0x73,0x05,0x60,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2d,0x04,0x00,0x50,0x05,0x05, 0x74,0x05,0x65,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2e,0x04,0x00,0x50,0x05,0x05, 0x75,0x05,0x6a,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2f,0x04,0x00,0x50,0x05,0x05, 0x76,0x05,0x6f,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x77,0x05,0x61,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x78,0x05,0x66,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x79,0x05,0x6b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x7a,0x05,0x70,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xd0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x24,0x73,0x00,0x00,0x61,0x30,0x58,0x62,0x00,0x59,0x11, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x7b,0x05,0x62,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x7c,0x05,0x67,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x7d,0x05,0x6c,0x58,0x05,0xa4,0x01,0x00, 0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x7e,0x05,0x71,0x58,0x05,0xa4,0x01,0x00, 0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x24,0x77,0x00, 0x00,0x61,0x31,0x58,0x62,0x00,0x5a,0x11,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x02,0x05,0x63,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x03,0x05,0x68,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x04,0x05,0x6d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05, 0x05,0x05,0x72,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xd2,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x58,0x00,0xc0,0x24,0x7b,0x00,0x00,0x61,0x32,0x58,0x62,0x00,0x5b,0x11, 0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x58,0x00,0xc0,0x24,0x02,0x00, 0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00, 0x00,0x1d,0x01,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79, 0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x33,0x32,0x78, 0x33,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a, 0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25, 0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25, 0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00, 0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f, 0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54, 0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30, 0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56, 0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37, 0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30, 0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56, 0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35, 0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30, 0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56, 0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33, 0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30, 0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56, 0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31, 0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30, 0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56, 0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39, 0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30, 0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56, 0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37, 0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30, 0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56, 0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35, 0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30, 0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56, 0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33, 0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30, 0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56, 0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31, 0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31, 0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56, 0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39, 0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31, 0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56, 0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37, 0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31, 0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56, 0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35, 0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31, 0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56, 0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33, 0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31, 0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56, 0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31, 0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31, 0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56, 0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39, 0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31, 0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56, 0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37, 0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31, 0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56, 0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35, 0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31, 0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56, 0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33, 0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31, 0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56, 0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31, 0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31, 0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56, 0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39, 0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31, 0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56, 0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37, 0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32, 0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56, 0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35, 0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32, 0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56, 0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33, 0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32, 0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56, 0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31, 0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32, 0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56, 0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39, 0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32, 0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56, 0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37, 0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32, 0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56, 0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35, 0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32, 0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56, 0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33, 0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32, 0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56, 0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31, 0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32, 0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56, 0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39, 0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32, 0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56, 0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x50,0x30,0x31,0x00,0x50, 0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x73,0x75,0x72,0x66,0x61, 0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x73,0x68,0x69, 0x66,0x74,0x5f,0x33,0x32,0x78,0x33,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00, 0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42, 0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x54,0x30,0x30,0x36, 0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f, 0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00, 0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x31,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62, 0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00, 0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x71,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x81,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82, 0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00, 0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00, 0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x53, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x53,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2, 0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00, 0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00, 0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x53, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x53,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x53,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x53,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb1,0x00,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2, 0x00,0x00,0x00,0x51,0x20,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00, 0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00, 0x00,0x51,0x20,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00, 0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x51, 0x20,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x20,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x51,0x20,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x20,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x51,0x20,0x00,0x44,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x51,0x20,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x20,0x01,0x00,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x51,0x20,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0x51,0x20,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x00,0x00,0x00,0x53,0x80,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc1,0x00,0x00,0x00,0x23,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2, 0x00,0x00,0x00,0x53,0x80,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0x53,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00, 0x00,0x53,0x80,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00, 0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x20, 0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x20,0x01, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x20,0x01,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x20,0x01,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x20,0x01,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x51,0x20,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x20,0x01,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x51,0x20,0x00,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x20,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0x51,0x20,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x20,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd1,0x00,0x00,0x00,0x51,0x20,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2, 0x00,0x00,0x00,0x20,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00, 0x00,0x00,0x51,0x20,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00, 0x00,0x20,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00, 0x51,0x20,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x20, 0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x51,0x20, 0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x51,0x20,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x53,0x80,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x53,0x80,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x53,0x80,0x00,0x6d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x53,0x80,0x00,0x6e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x20,0x01,0x00,0x53,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x20,0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xdf,0x00,0x00,0x00,0x20,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x20,0x01,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe1,0x00,0x00,0x00,0x20,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2, 0x00,0x00,0x00,0x51,0x20,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00, 0x00,0x00,0x20,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00, 0x00,0x51,0x20,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00, 0x20,0x01,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x51, 0x20,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x20,0x01, 0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x51,0x20,0x00, 0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x20,0x01,0x00,0x7e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x51,0x20,0x00,0x8a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x20,0x01,0x00,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x51,0x20,0x00,0x8b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x20,0x01,0x00,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x51,0x20,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xef,0x00,0x00,0x00,0x51,0x20,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x00,0x00,0x00,0x53,0x80,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf1,0x00,0x00,0x00,0x53,0x80,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2, 0x00,0x00,0x00,0x53,0x80,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00, 0x00,0x00,0x53,0x80,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00, 0x00,0x20,0x01,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00, 0x20,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x20, 0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x20,0x01, 0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x20,0x01,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x51,0x20,0x00,0xa8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x20,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x51,0x20,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x20,0x01,0x00,0x9c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x51,0x20,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x20,0x01,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0x51,0x20,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x20,0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x51,0x20,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x20,0x01,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x51,0x20,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00, 0x00,0x20,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00, 0x51,0x20,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x51, 0x20,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x53,0x80, 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x53,0x80,0x00, 0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x53,0x80,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x53,0x80,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x20,0x01,0x00,0x99,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x20,0x01,0x00,0xb5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x20,0x01,0x00,0xb6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x01,0x00,0x00,0x01,0x00,0x00,0x10,0x01,0x00, 0x00,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x01,0x00,0x00,0x12,0x01,0x00,0x00,0x01, 0x00,0x00,0x05,0x00,0x13,0x01,0x00,0x00,0x01,0x00,0x14,0x01,0x00,0x00,0x00,0x00, 0x15,0x01,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x18,0x01,0x00,0x00,0x01,0x00,0x00,0x19,0x01,0x00,0x00,0x01, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00, 0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00, 0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00, 0x30,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00, 0x00,0x00,0x38,0x00,0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x00, 0x26,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x03,0x24,0x00,0x00,0x27,0x16,0x00,0x00, 0x03,0x00,0x1a,0x01,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79, 0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x33,0x2e,0x61,0x73,0x6d,0x1b,0x01,0x00, 0x00,0x00,0x1c,0x01,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x80,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x01,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x01,0x80,0x01,0x00,0x25,0x00,0x00,0x00, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0xb8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0xba,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x00,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0xc0,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc2,0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0xc4,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc5, 0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xc8,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xc8,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc8,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x41,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x43,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x44, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xca,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xca,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcb,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38, 0x00,0x07,0x00,0x20,0x08,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00, 0xce,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x4a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60, 0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcf,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00, 0x00,0x31,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x52, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x04,0x02,0x02,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x02,0x80,0x02,0x00,0x25,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0xd3,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x35,0x03,0x00,0x06,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00, 0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xd7,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xd9,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35, 0x03,0x00,0x06,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x00,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x60,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0xdd,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x52,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x07,0x00,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x65,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x66,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x67,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x6a,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xe2,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe2, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe2,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe2,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xe2,0x00,0x00,0x00, 0x07,0x00,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcb,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6b,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6c,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x6d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe6,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x00,0x00,0x00, 0x00,0x00,0x31,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x04,0x02,0x03,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x03,0x80,0x03,0x00,0x25,0x00, 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xe8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x79,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0xea,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xec, 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xee,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x7f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf2,0x00,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x83, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf4,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0xf5,0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x8d,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xf7,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xf7,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf7, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf7,0x00, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf7,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x8d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x89,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x8a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x8b,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x8d,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0xf9,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0xf9,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0xf9,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf9, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf9,0x00, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x8d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcb,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8e, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00, 0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8f,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20, 0x08,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x90,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xfd,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x91,0x00,0x00, 0x00,0x00,0x00,0x31,0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x04,0x02,0x04,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x04,0x80,0x04,0x00,0x25, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00, 0x9a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x9b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x03,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00, 0x06,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x07,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x35,0x03,0x00,0x06,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x0b,0x01,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xa7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x01,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x05,0x00,0x00,0x02, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaf, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xa9,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0x0e,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0x0e,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0e,0x01, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xac,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x05,0x00,0x00,0x02, 0x00,0xad,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0xae,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaf, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xa9,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04, 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00, 0x00,0x00,0x10,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00, 0x10,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x10, 0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x10,0x01, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcb, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xb0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xb2,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x14,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb3,0x00, 0x00,0x00,0x00,0x00,0x31,0x04,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10, 0x82,0x26,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10, 0x82,0x06,0x53,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10, 0x81,0x15,0x53,0x24,0x02,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x00,0xa0, 0x4a,0x45,0x53,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60, 0x81,0x05,0x03,0x14,0x53,0x00,0x05,0x03,0x00,0x03,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x25,0x53,0x44,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x02,0x20,0x22,0x2e, 0x03,0x11,0x01,0x49,0x00,0x03,0xa8,0x2a,0x03,0x11,0x01,0x41,0x03,0x00,0x80,0x60, 0x06,0x01,0x20,0x24,0x53,0x00,0x01,0x64,0x01,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x06,0x44,0x53,0x04,0x03,0x01,0x06,0x44,0x53,0x04,0x53,0x49,0x00,0x00,0x00,0x60, 0x06,0x05,0x54,0x24,0x53,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x00,0x00,0x60, 0x86,0x45,0x53,0x44,0x53,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x02,0x54,0xa8,0x0a, 0x54,0x11,0x01,0x40,0x02,0x00,0x00,0x60,0x06,0x45,0x53,0x44,0x53,0x00,0x06,0x84, 0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x84,0x53,0xe4,0x01,0x05,0x01,0x04, 0x53,0x80,0x00,0x70,0x02,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x53,0x00,0x56,0x04, 0x54,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0xc4,0x53,0x04,0x02,0x05,0x01,0x14, 0x53,0x08,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30, 0x04,0x00,0x00,0x69,0x00,0x0e,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x14,0x68,0x42, 0x01,0xc1,0x00,0x69,0x00,0x1a,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x20,0x68,0x42, 0x01,0x41,0x01,0x41,0x00,0x26,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2c,0x68,0x42, 0x01,0xc1,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x53,0x00,0x01,0x04, 0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x44,0x53,0x00,0x06,0x24, 0x53,0x00,0x00,0x40,0x07,0x0e,0xa8,0x42,0x53,0x11,0x0e,0x40,0x07,0x14,0xa8,0x42, 0x53,0x11,0x14,0x40,0x07,0x1a,0xa8,0x42,0x53,0x11,0x1a,0x40,0x07,0x20,0xa8,0x42, 0x53,0x11,0x20,0x40,0x07,0x26,0xa8,0x42,0x53,0x11,0x26,0x40,0x07,0x00,0x00,0x60, 0x06,0x45,0x53,0x44,0x53,0x00,0x06,0x04,0x2c,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x0f,0x04,0x0e,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x15,0x04,0x14,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x1b,0x04,0x1a,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x21,0x04,0x20,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x27,0x04,0x26,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x2d,0x44,0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x40,0x04,0x80,0x00, 0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf1,0x04,0x80,0x00, 0x00,0x05,0x0a,0x04,0x09,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xe2,0x04,0x80,0x00, 0x00,0x05,0x10,0x04,0x0f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xd3,0x04,0x80,0x00, 0x00,0x05,0x16,0x04,0x15,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc4,0x04,0x80,0x00, 0x00,0x05,0x1c,0x04,0x1b,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb5,0x04,0x80,0x00, 0x00,0x05,0x22,0x04,0x21,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa6,0x04,0x80,0x00, 0x00,0x05,0x28,0x04,0x27,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x97,0x04,0x80,0x00, 0x00,0x05,0x2e,0x04,0x2d,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x52,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x52,0x00,0x00,0x00,0x00,0x1f, 0x00,0x07,0x00,0x61,0x00,0x52,0x62,0x58,0x53,0x11,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x52,0xc4,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x20,0x04,0x00,0x50, 0x05,0x05,0x32,0x05,0x04,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x21,0x04,0x00,0x50, 0x05,0x05,0x33,0x05,0x0a,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x22,0x04,0x00,0x50, 0x05,0x05,0x34,0x05,0x10,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x23,0x04,0x00,0x50, 0x05,0x05,0x35,0x05,0x16,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x24,0x04,0x00,0x50, 0x05,0x05,0x36,0x05,0x1c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x25,0x04,0x00,0x50, 0x05,0x05,0x37,0x05,0x22,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x26,0x04,0x00,0x50, 0x05,0x05,0x38,0x05,0x28,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x27,0x04,0x00,0x50, 0x05,0x05,0x39,0x05,0x2e,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3a,0x05,0x05,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3b,0x05,0x0b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3c,0x05,0x11,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3d,0x05,0x17,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3e,0x05,0x1d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3f,0x05,0x23,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x40,0x05,0x29,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x41,0x05,0x2f,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf8,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x32,0x00,0x00,0x40,0x38,0x52,0x68,0x5a, 0x53,0x01,0x02,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x42,0x05,0x06,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x43,0x05,0x0c,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x44,0x05,0x12,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x45,0x05,0x18,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x46,0x05,0x1e,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x47,0x05,0x24,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x2a,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x30,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x3a,0x00,0x00,0x40,0x39,0x52,0x68,0x5a,0x53,0x01,0x04,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4a,0x05,0x07,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4b,0x05,0x0d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4c,0x05,0x13,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4d,0x05,0x19,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4e,0x05,0x1f,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4f,0x05,0x25,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x50,0x05,0x2b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x51,0x05,0x31,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xfa,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x42,0x00,0x00,0x40,0x3a,0x52,0x68,0x5a, 0x53,0x01,0x06,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x4a,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xc4,0x01,0x00,0x05,0x03, 0x00,0x03,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x54,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x44,0x02,0x64,0x01,0x05,0x01,0x14, 0x53,0x08,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x02,0x00,0x01,0x44, 0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x44,0x02,0x00,0x06,0x44, 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x53,0x44,0x02,0x00,0x06,0x04, 0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x06,0x44,0x54,0x04,0x03,0x01,0x06,0x44, 0x54,0x04,0x53,0x69,0x01,0x00,0x00,0x60,0x86,0x45,0x54,0x44,0x54,0x00,0x05,0x02, 0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x45,0x54,0x44,0x54,0x00,0x06,0x84, 0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x54,0x00,0x56,0x04, 0x54,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30, 0x04,0x00,0x00,0x69,0x00,0x0e,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x14,0x68,0x42, 0x01,0xc1,0x00,0x69,0x00,0x1a,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x20,0x68,0x42, 0x01,0x41,0x01,0x41,0x00,0x26,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2c,0x68,0x42, 0x01,0xc1,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x54,0x00,0x01,0x04, 0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x44,0x54,0x00,0x06,0x24, 0x53,0x00,0x00,0x40,0x07,0x0e,0xa8,0x42,0x54,0x11,0x0e,0x40,0x07,0x14,0xa8,0x42, 0x54,0x11,0x14,0x40,0x07,0x1a,0xa8,0x42,0x54,0x11,0x1a,0x40,0x07,0x20,0xa8,0x42, 0x54,0x11,0x20,0x40,0x07,0x26,0xa8,0x42,0x54,0x11,0x26,0x40,0x07,0x00,0x00,0x60, 0x06,0x45,0x54,0x44,0x54,0x00,0x06,0x04,0x2c,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x0f,0x04,0x0e,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x15,0x04,0x14,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x1b,0x04,0x1a,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x21,0x04,0x20,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x27,0x04,0x26,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x2d,0x44,0x54,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x4c,0x04,0x80,0x00, 0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xfd,0x04,0x80,0x00, 0x00,0x05,0x0a,0x04,0x09,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xee,0x04,0x80,0x00, 0x00,0x05,0x10,0x04,0x0f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xdf,0x04,0x80,0x00, 0x00,0x05,0x16,0x04,0x15,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc0,0x04,0x80,0x00, 0x00,0x05,0x1c,0x04,0x1b,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb1,0x04,0x80,0x00, 0x00,0x05,0x22,0x04,0x21,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa2,0x04,0x80,0x00, 0x00,0x05,0x28,0x04,0x27,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x93,0x04,0x80,0x00, 0x00,0x05,0x2e,0x04,0x2d,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x3b,0x52,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x52,0x00,0x00,0x00,0x00,0x1f, 0x00,0x07,0x00,0x61,0x00,0x52,0x62,0x58,0x53,0x11,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x52,0x64,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x2c,0x04,0x00,0x50, 0x05,0x05,0x32,0x05,0x04,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2d,0x04,0x00,0x50, 0x05,0x05,0x33,0x05,0x0a,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2e,0x04,0x00,0x50, 0x05,0x05,0x34,0x05,0x10,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x2f,0x04,0x00,0x50, 0x05,0x05,0x35,0x05,0x16,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x20,0x04,0x00,0x50, 0x05,0x05,0x36,0x05,0x1c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x21,0x04,0x00,0x50, 0x05,0x05,0x37,0x05,0x22,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x22,0x04,0x00,0x50, 0x05,0x05,0x38,0x05,0x28,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x23,0x04,0x00,0x50, 0x05,0x05,0x39,0x05,0x2e,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3a,0x05,0x05,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3b,0x05,0x0b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3c,0x05,0x11,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3d,0x05,0x17,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3e,0x05,0x1d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x3f,0x05,0x23,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x40,0x05,0x29,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x41,0x05,0x2f,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf4,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x32,0x00,0x00,0x40,0x34,0x52,0x68,0x5a, 0x53,0x01,0x02,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x42,0x05,0x06,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x43,0x05,0x0c,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x44,0x05,0x12,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x45,0x05,0x18,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x46,0x05,0x1e,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x47,0x05,0x24,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x2a,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x30,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xf5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x3a,0x00,0x00,0x40,0x35,0x52,0x68,0x5a,0x53,0x01,0x04,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4a,0x05,0x07,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4b,0x05,0x0d,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4c,0x05,0x13,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4d,0x05,0x19,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4e,0x05,0x1f,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x4f,0x05,0x25,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x50,0x05,0x2b,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x51,0x05,0x31,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf6,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x42,0x00,0x00,0x40,0x36,0x52,0x68,0x5a, 0x53,0x01,0x06,0x31,0x97,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x4a,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xc4,0x01,0x00,0x05,0x04, 0x00,0x04,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x54,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x44,0x02,0x64,0x01,0x05,0x01,0x14, 0x53,0x08,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x02,0x00,0x01,0x44, 0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x44,0x02,0x00,0x06,0x44, 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x53,0x44,0x02,0x00,0x06,0x04, 0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x06,0x84,0x54,0x04,0x03,0x01,0x06,0x84, 0x54,0x04,0x53,0x69,0x01,0x00,0x00,0x60,0x86,0x85,0x54,0x84,0x54,0x00,0x05,0x02, 0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x85,0x54,0x84,0x54,0x00,0x06,0x84, 0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x84,0x54,0x00,0x56,0x04, 0x54,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x04,0x00,0x00,0x69,0x00,0x0e,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x14,0x68,0x42, 0x01,0xc1,0x00,0x69,0x00,0x1a,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x20,0x68,0x42, 0x01,0x41,0x01,0x41,0x00,0x26,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2c,0x68,0x42, 0x01,0xc1,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x54,0x00,0x01,0x04, 0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x84,0x54,0x00,0x06,0x24, 0x53,0x00,0x00,0x40,0x07,0x0e,0xa8,0x5a,0x54,0x11,0x0e,0x40,0x07,0x14,0xa8,0x5a, 0x54,0x11,0x14,0x40,0x07,0x1a,0xa8,0x5a,0x54,0x11,0x1a,0x40,0x07,0x20,0xa8,0x5a, 0x54,0x11,0x20,0x40,0x07,0x26,0xa8,0x5a,0x54,0x11,0x26,0x40,0x07,0x00,0x00,0x60, 0x06,0x85,0x54,0x84,0x54,0x00,0x06,0x04,0x2c,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x0f,0x04,0x0e,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x15,0x04,0x14,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x1b,0x04,0x1a,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x21,0x04,0x20,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x27,0x04,0x26,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x2d,0x84,0x54,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x48,0x04,0x80,0x00, 0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf9,0x04,0x80,0x00, 0x00,0x05,0x0a,0x04,0x09,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xea,0x04,0x80,0x00, 0x00,0x05,0x10,0x04,0x0f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xdc,0x04,0x80,0x00, 0x00,0x05,0x16,0x04,0x15,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xcd,0x04,0x80,0x00, 0x00,0x05,0x1c,0x04,0x1b,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xbe,0x04,0x80,0x00, 0x00,0x05,0x22,0x04,0x21,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xaf,0x04,0x80,0x00, 0x00,0x05,0x28,0x04,0x27,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x90,0x04,0x80,0x00, 0x00,0x05,0x2e,0x04,0x2d,0x00,0xa0,0x00,0x00,0x00,0x00,0x01,0x37,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x3b,0x52,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x52,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x52,0x62,0x58, 0x53,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x52,0xa4,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x69,0x28,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x04,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x29,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x0a,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2a,0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x10,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2c,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x16,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2d,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x1c,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2e,0x04,0x00,0x50,0x05,0x05,0x37,0x05,0x22,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2f,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x28,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x20,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x2e,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x05,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3b,0x05,0x0b,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x11,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x17,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x05,0x1d,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x23,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x29,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x41,0x05,0x2f,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x32,0x00,0x00,0x40,0x31,0x52,0x68,0x5a,0x53,0x01,0x02,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x42,0x05,0x06,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x43,0x05,0x0c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x44,0x05,0x12,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x45,0x05,0x18,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x46,0x05,0x1e,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x47,0x05,0x24,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x48,0x05,0x2a,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x49,0x05,0x30,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf2,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x3a,0x00,0x00,0x40,0x32,0x52,0x68,0x5a, 0x53,0x01,0x04,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x07,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x0d,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x13,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x19,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x1f,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x05,0x25,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x50,0x05,0x2b,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x51,0x05,0x31,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xf3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44, 0x42,0x00,0x00,0x40,0x33,0x52,0x68,0x5a,0x53,0x01,0x06,0x31,0x94,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x52,0x00,0xc0,0x44,0x4a,0x00,0x00,0x41,0x00,0x00,0x00,0x60, 0x86,0x65,0x01,0xc4,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x61,0x00,0x00,0x00,0xa0, 0x4a,0xc5,0x54,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x86,0x44,0x02,0x64,0x01,0x05,0x01,0x14,0x53,0x08,0x00,0x41,0x01,0x00,0x80,0x60, 0x06,0x01,0x20,0x44,0x02,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60, 0x06,0x05,0x03,0x44,0x02,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60, 0x06,0xe5,0x53,0x44,0x02,0x00,0x06,0x04,0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x06,0xc4,0x54,0x04,0x03,0x01,0x06,0xc4,0x54,0x04,0x53,0x69,0x01,0x00,0x00,0x60, 0x86,0xc5,0x54,0xc4,0x54,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60, 0x06,0xc5,0x54,0xc4,0x54,0x00,0x06,0x84,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60, 0x06,0x01,0x00,0xc4,0x54,0x00,0x56,0x04,0x54,0x00,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x69,0x00,0x0c,0x68,0x42, 0x01,0x31,0x00,0x41,0x00,0x12,0x68,0x42,0x01,0xc1,0x00,0x69,0x00,0x18,0x68,0x42, 0x01,0x41,0x00,0x41,0x00,0x1e,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x24,0x68,0x42, 0x01,0x81,0x01,0x41,0x00,0x2a,0x68,0x42,0x01,0xc1,0x01,0x68,0x00,0x00,0x00,0x20, 0x82,0x45,0x02,0xc4,0x54,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60, 0x06,0x25,0x53,0xc4,0x54,0x00,0x06,0x24,0x53,0x00,0x00,0x40,0x07,0x0c,0xa8,0x6a, 0x54,0x11,0x0c,0x40,0x07,0x12,0xa8,0x6a,0x54,0x11,0x12,0x40,0x07,0x18,0xa8,0x6a, 0x54,0x11,0x18,0x40,0x07,0x1e,0xa8,0x6a,0x54,0x11,0x1e,0x40,0x07,0x24,0xa8,0x6a, 0x54,0x11,0x24,0x40,0x07,0x00,0x00,0x60,0x06,0xc5,0x54,0xc4,0x54,0x00,0x06,0x04, 0x2a,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00, 0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x53,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0d,0x04,0x0c,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x13,0x04,0x12,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x19,0x04,0x18,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x1f,0x04,0x1e,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x25,0x04,0x24,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x2b,0xc4,0x54,0x00,0x01,0x04, 0x00,0x04,0x00,0x31,0x45,0x04,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xf6,0x04,0x80,0x00,0x00,0x05,0x08,0x04,0x07,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x05,0x0e,0x04,0x0d,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x05,0x14,0x04,0x13,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x05,0x1a,0x04,0x19,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x05,0x20,0x04,0x1f,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x05,0x26,0x04,0x25,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x05,0x2c,0x04,0x2b,0x00,0xa0,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x90, 0x00,0x00,0x00,0x61,0x3b,0x50,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x50,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x50,0x62,0x58, 0x53,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x50,0xe4,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x69,0x25,0x04,0x00,0x50,0x05,0x05,0x30,0x05,0x03,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x26,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x08,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x28,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x0e,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x29,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x14,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2a,0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x1a,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2c,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x20,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2d,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x26,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x2e,0x04,0x00,0x50,0x05,0x05,0x37,0x05,0x2c,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x04,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x09,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x0f,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3b,0x05,0x15,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x1b,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x21,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x05,0x27,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x2d,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xff,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44, 0x30,0x00,0x00,0x40,0x3f,0x50,0x68,0x5a,0x53,0x01,0x02,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x40,0x05,0x05,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x41,0x05,0x0a,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x42,0x05,0x10,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x43,0x05,0x16,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x44,0x05,0x1c,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x45,0x05,0x22,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x46,0x05,0x28,0x58,0x05,0xa4,0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50, 0x05,0x05,0x47,0x05,0x2e,0x58,0x05,0xa4,0x01,0x00,0x00,0x31,0xf0,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44,0x38,0x00,0x00,0x40,0x30,0x50,0x68,0x5a, 0x53,0x01,0x04,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x06,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x0b,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x11,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x17,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x1d,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x23,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x29,0x58,0x05,0xa4, 0x01,0x00,0x00,0x69,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x05,0x2f,0x58,0x05,0xa4, 0x01,0x00,0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44, 0x40,0x00,0x00,0x40,0x31,0x50,0x68,0x5a,0x53,0x01,0x06,0x31,0x92,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44,0x48,0x00,0x00,0x61,0x00,0x7f,0x64,0x00, 0x00,0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00, 0x00,0x00,0x00,0xd2,0x0f,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f, 0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x33,0x32, 0x78,0x33,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67, 0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00, 0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00, 0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30, 0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c, 0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00, 0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30, 0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00, 0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33, 0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30, 0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00, 0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34, 0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30, 0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00, 0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35, 0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30, 0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00, 0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36, 0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30, 0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00, 0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36, 0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30, 0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00, 0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37, 0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30, 0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00, 0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38, 0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30, 0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00, 0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39, 0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30, 0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00, 0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30, 0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30, 0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00, 0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30, 0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30, 0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00, 0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31, 0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30, 0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00, 0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32, 0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30, 0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00, 0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33, 0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30, 0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00, 0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34, 0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30, 0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00, 0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34, 0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30, 0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00, 0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35, 0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30, 0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00, 0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36, 0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30, 0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00, 0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37, 0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30, 0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00, 0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38, 0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30, 0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00, 0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38, 0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30, 0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00, 0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39, 0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30, 0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00, 0x56,0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30, 0x35,0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30, 0x32,0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00, 0x56,0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31, 0x33,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30, 0x32,0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00, 0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32, 0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30, 0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00, 0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32, 0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30, 0x32,0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00, 0x56,0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33, 0x37,0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30, 0x32,0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00, 0x56,0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34, 0x35,0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30, 0x32,0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00, 0x56,0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35, 0x33,0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30, 0x32,0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00, 0x56,0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36, 0x31,0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30, 0x32,0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00, 0x56,0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36, 0x39,0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30, 0x32,0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00, 0x56,0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37, 0x37,0x00,0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30, 0x32,0x38,0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00, 0x56,0x30,0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38, 0x35,0x00,0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30, 0x32,0x38,0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00, 0x56,0x30,0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39, 0x33,0x00,0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30, 0x32,0x39,0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00, 0x56,0x30,0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30, 0x31,0x00,0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30, 0x33,0x30,0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00, 0x56,0x30,0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30, 0x39,0x00,0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30, 0x33,0x31,0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00, 0x56,0x30,0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31, 0x37,0x00,0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30, 0x33,0x32,0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00, 0x56,0x30,0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32, 0x35,0x00,0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30, 0x33,0x32,0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00, 0x56,0x30,0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33, 0x33,0x00,0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30, 0x33,0x33,0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00, 0x56,0x30,0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34, 0x31,0x00,0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30, 0x33,0x34,0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00, 0x56,0x30,0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34, 0x39,0x00,0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30, 0x33,0x35,0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00, 0x56,0x30,0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35, 0x37,0x00,0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30, 0x33,0x36,0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00, 0x56,0x30,0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36, 0x35,0x00,0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30, 0x33,0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00, 0x56,0x30,0x33,0x37,0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37, 0x33,0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30, 0x33,0x37,0x36,0x00,0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00, 0x56,0x30,0x33,0x37,0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38, 0x31,0x00,0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30, 0x33,0x38,0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00, 0x56,0x30,0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38, 0x39,0x00,0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30, 0x33,0x39,0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00, 0x56,0x30,0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39, 0x37,0x00,0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30, 0x34,0x30,0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00, 0x56,0x30,0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30, 0x35,0x00,0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30, 0x34,0x30,0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00, 0x56,0x30,0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31, 0x33,0x00,0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30, 0x34,0x31,0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00, 0x56,0x30,0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32, 0x31,0x00,0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30, 0x34,0x32,0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00, 0x56,0x30,0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32, 0x39,0x00,0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30, 0x34,0x33,0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00, 0x56,0x30,0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33, 0x37,0x00,0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30, 0x34,0x34,0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00, 0x56,0x30,0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34, 0x35,0x00,0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30, 0x34,0x34,0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00, 0x56,0x30,0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35, 0x33,0x00,0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30, 0x34,0x35,0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00, 0x56,0x30,0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36, 0x31,0x00,0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30, 0x34,0x36,0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00, 0x56,0x30,0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36, 0x39,0x00,0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30, 0x34,0x37,0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00, 0x56,0x30,0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37, 0x37,0x00,0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30, 0x34,0x38,0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00, 0x56,0x30,0x34,0x38,0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38, 0x35,0x00,0x56,0x30,0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30, 0x34,0x38,0x38,0x00,0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00, 0x56,0x30,0x34,0x39,0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39, 0x33,0x00,0x56,0x30,0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30, 0x34,0x39,0x36,0x00,0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00, 0x56,0x30,0x34,0x39,0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30, 0x31,0x00,0x56,0x30,0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30, 0x35,0x30,0x34,0x00,0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00, 0x56,0x30,0x35,0x30,0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30, 0x39,0x00,0x56,0x30,0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30, 0x35,0x31,0x32,0x00,0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00, 0x56,0x30,0x35,0x31,0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31, 0x37,0x00,0x56,0x30,0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30, 0x35,0x32,0x30,0x00,0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00, 0x56,0x30,0x35,0x32,0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32, 0x35,0x00,0x56,0x30,0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30, 0x35,0x32,0x38,0x00,0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00, 0x56,0x30,0x35,0x33,0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33, 0x33,0x00,0x56,0x30,0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30, 0x35,0x33,0x36,0x00,0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00, 0x56,0x30,0x35,0x33,0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34, 0x31,0x00,0x56,0x30,0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30, 0x35,0x34,0x34,0x00,0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00, 0x56,0x30,0x35,0x34,0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34, 0x39,0x00,0x56,0x30,0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30, 0x35,0x35,0x32,0x00,0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00, 0x56,0x30,0x35,0x35,0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35, 0x37,0x00,0x56,0x30,0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30, 0x35,0x36,0x30,0x00,0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00, 0x56,0x30,0x35,0x36,0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36, 0x35,0x00,0x56,0x30,0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30, 0x35,0x36,0x38,0x00,0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00, 0x56,0x30,0x35,0x37,0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37, 0x33,0x00,0x56,0x30,0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30, 0x35,0x37,0x36,0x00,0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00, 0x56,0x30,0x35,0x37,0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38, 0x31,0x00,0x56,0x30,0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30, 0x35,0x38,0x34,0x00,0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00, 0x56,0x30,0x35,0x38,0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38, 0x39,0x00,0x56,0x30,0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30, 0x35,0x39,0x32,0x00,0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00, 0x56,0x30,0x35,0x39,0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39, 0x37,0x00,0x56,0x30,0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30, 0x36,0x30,0x30,0x00,0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00, 0x56,0x30,0x36,0x30,0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30, 0x35,0x00,0x56,0x30,0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30, 0x36,0x30,0x38,0x00,0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00, 0x56,0x30,0x36,0x31,0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31, 0x33,0x00,0x56,0x30,0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30, 0x36,0x31,0x36,0x00,0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00, 0x56,0x30,0x36,0x31,0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32, 0x31,0x00,0x56,0x30,0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30, 0x36,0x32,0x34,0x00,0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00, 0x56,0x30,0x36,0x32,0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32, 0x39,0x00,0x56,0x30,0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30, 0x36,0x33,0x32,0x00,0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00, 0x56,0x30,0x36,0x33,0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33, 0x37,0x00,0x56,0x30,0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30, 0x36,0x34,0x30,0x00,0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00, 0x56,0x30,0x36,0x34,0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34, 0x35,0x00,0x56,0x30,0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30, 0x36,0x34,0x38,0x00,0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00, 0x56,0x30,0x36,0x35,0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35, 0x33,0x00,0x56,0x30,0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30, 0x36,0x35,0x36,0x00,0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00, 0x56,0x30,0x36,0x35,0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36, 0x31,0x00,0x56,0x30,0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30, 0x36,0x36,0x34,0x00,0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00, 0x56,0x30,0x36,0x36,0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36, 0x39,0x00,0x56,0x30,0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30, 0x36,0x37,0x32,0x00,0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00, 0x56,0x30,0x36,0x37,0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37, 0x37,0x00,0x56,0x30,0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30, 0x36,0x38,0x30,0x00,0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00, 0x56,0x30,0x36,0x38,0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38, 0x35,0x00,0x56,0x30,0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30, 0x36,0x38,0x38,0x00,0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00, 0x56,0x30,0x36,0x39,0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39, 0x33,0x00,0x56,0x30,0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30, 0x36,0x39,0x36,0x00,0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00, 0x56,0x30,0x36,0x39,0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30, 0x31,0x00,0x56,0x30,0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30, 0x37,0x30,0x34,0x00,0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00, 0x56,0x30,0x37,0x30,0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30, 0x39,0x00,0x56,0x30,0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30, 0x37,0x31,0x32,0x00,0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00, 0x56,0x30,0x37,0x31,0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31, 0x37,0x00,0x56,0x30,0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30, 0x37,0x32,0x30,0x00,0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00, 0x56,0x30,0x37,0x32,0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32, 0x35,0x00,0x56,0x30,0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30, 0x37,0x32,0x38,0x00,0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00, 0x56,0x30,0x37,0x33,0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33, 0x33,0x00,0x56,0x30,0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30, 0x37,0x33,0x36,0x00,0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00, 0x56,0x30,0x37,0x33,0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34, 0x31,0x00,0x56,0x30,0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30, 0x37,0x34,0x34,0x00,0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00, 0x56,0x30,0x37,0x34,0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34, 0x39,0x00,0x56,0x30,0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30, 0x37,0x35,0x32,0x00,0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00, 0x56,0x30,0x37,0x35,0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35, 0x37,0x00,0x56,0x30,0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30, 0x37,0x36,0x30,0x00,0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00, 0x56,0x30,0x37,0x36,0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36, 0x35,0x00,0x56,0x30,0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30, 0x37,0x36,0x38,0x00,0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00, 0x56,0x30,0x37,0x37,0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37, 0x33,0x00,0x56,0x30,0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30, 0x37,0x37,0x36,0x00,0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00, 0x56,0x30,0x37,0x37,0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38, 0x31,0x00,0x56,0x30,0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30, 0x37,0x38,0x34,0x00,0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00, 0x56,0x30,0x37,0x38,0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38, 0x39,0x00,0x56,0x30,0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30, 0x37,0x39,0x32,0x00,0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00, 0x56,0x30,0x37,0x39,0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39, 0x37,0x00,0x56,0x30,0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30, 0x38,0x30,0x30,0x00,0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00, 0x56,0x30,0x38,0x30,0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30, 0x35,0x00,0x56,0x30,0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30, 0x38,0x30,0x38,0x00,0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00, 0x56,0x30,0x38,0x31,0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31, 0x33,0x00,0x56,0x30,0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30, 0x38,0x31,0x36,0x00,0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00, 0x56,0x30,0x38,0x31,0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32, 0x31,0x00,0x56,0x30,0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30, 0x38,0x32,0x34,0x00,0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00, 0x56,0x30,0x38,0x32,0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32, 0x39,0x00,0x56,0x30,0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30, 0x38,0x33,0x32,0x00,0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00, 0x56,0x30,0x38,0x33,0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33, 0x37,0x00,0x56,0x30,0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30, 0x38,0x34,0x30,0x00,0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00, 0x56,0x30,0x38,0x34,0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34, 0x35,0x00,0x56,0x30,0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30, 0x38,0x34,0x38,0x00,0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00, 0x56,0x30,0x38,0x35,0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35, 0x33,0x00,0x56,0x30,0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30, 0x38,0x35,0x36,0x00,0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00, 0x56,0x30,0x38,0x35,0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36, 0x31,0x00,0x56,0x30,0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30, 0x38,0x36,0x34,0x00,0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00, 0x56,0x30,0x38,0x36,0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36, 0x39,0x00,0x56,0x30,0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30, 0x38,0x37,0x32,0x00,0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00, 0x56,0x30,0x38,0x37,0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37, 0x37,0x00,0x56,0x30,0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30, 0x38,0x38,0x30,0x00,0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00, 0x56,0x30,0x38,0x38,0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38, 0x35,0x00,0x56,0x30,0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30, 0x38,0x38,0x38,0x00,0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00, 0x56,0x30,0x38,0x39,0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39, 0x33,0x00,0x56,0x30,0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30, 0x38,0x39,0x36,0x00,0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00, 0x56,0x30,0x38,0x39,0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30, 0x31,0x00,0x56,0x30,0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30, 0x39,0x30,0x34,0x00,0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00, 0x56,0x30,0x39,0x30,0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30, 0x39,0x00,0x56,0x30,0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30, 0x39,0x31,0x32,0x00,0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00, 0x56,0x30,0x39,0x31,0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31, 0x37,0x00,0x56,0x30,0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30, 0x39,0x32,0x30,0x00,0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00, 0x56,0x30,0x39,0x32,0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32, 0x35,0x00,0x56,0x30,0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30, 0x39,0x32,0x38,0x00,0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00, 0x56,0x30,0x39,0x33,0x31,0x00,0x56,0x30,0x39,0x33,0x32,0x00,0x56,0x30,0x39,0x33, 0x33,0x00,0x56,0x30,0x39,0x33,0x34,0x00,0x56,0x30,0x39,0x33,0x35,0x00,0x56,0x30, 0x39,0x33,0x36,0x00,0x56,0x30,0x39,0x33,0x37,0x00,0x56,0x30,0x39,0x33,0x38,0x00, 0x56,0x30,0x39,0x33,0x39,0x00,0x56,0x30,0x39,0x34,0x30,0x00,0x56,0x30,0x39,0x34, 0x31,0x00,0x56,0x30,0x39,0x34,0x32,0x00,0x56,0x30,0x39,0x34,0x33,0x00,0x56,0x30, 0x39,0x34,0x34,0x00,0x56,0x30,0x39,0x34,0x35,0x00,0x56,0x30,0x39,0x34,0x36,0x00, 0x56,0x30,0x39,0x34,0x37,0x00,0x56,0x30,0x39,0x34,0x38,0x00,0x56,0x30,0x39,0x34, 0x39,0x00,0x56,0x30,0x39,0x35,0x30,0x00,0x56,0x30,0x39,0x35,0x31,0x00,0x56,0x30, 0x39,0x35,0x32,0x00,0x56,0x30,0x39,0x35,0x33,0x00,0x56,0x30,0x39,0x35,0x34,0x00, 0x56,0x30,0x39,0x35,0x35,0x00,0x56,0x30,0x39,0x35,0x36,0x00,0x56,0x30,0x39,0x35, 0x37,0x00,0x56,0x30,0x39,0x35,0x38,0x00,0x56,0x30,0x39,0x35,0x39,0x00,0x56,0x30, 0x39,0x36,0x30,0x00,0x56,0x30,0x39,0x36,0x31,0x00,0x56,0x30,0x39,0x36,0x32,0x00, 0x56,0x30,0x39,0x36,0x33,0x00,0x56,0x30,0x39,0x36,0x34,0x00,0x56,0x30,0x39,0x36, 0x35,0x00,0x56,0x30,0x39,0x36,0x36,0x00,0x56,0x30,0x39,0x36,0x37,0x00,0x56,0x30, 0x39,0x36,0x38,0x00,0x56,0x30,0x39,0x36,0x39,0x00,0x56,0x30,0x39,0x37,0x30,0x00, 0x56,0x30,0x39,0x37,0x31,0x00,0x56,0x30,0x39,0x37,0x32,0x00,0x56,0x30,0x39,0x37, 0x33,0x00,0x56,0x30,0x39,0x37,0x34,0x00,0x56,0x30,0x39,0x37,0x35,0x00,0x56,0x30, 0x39,0x37,0x36,0x00,0x56,0x30,0x39,0x37,0x37,0x00,0x56,0x30,0x39,0x37,0x38,0x00, 0x56,0x30,0x39,0x37,0x39,0x00,0x56,0x30,0x39,0x38,0x30,0x00,0x56,0x30,0x39,0x38, 0x31,0x00,0x56,0x30,0x39,0x38,0x32,0x00,0x56,0x30,0x39,0x38,0x33,0x00,0x56,0x30, 0x39,0x38,0x34,0x00,0x56,0x30,0x39,0x38,0x35,0x00,0x56,0x30,0x39,0x38,0x36,0x00, 0x56,0x30,0x39,0x38,0x37,0x00,0x56,0x30,0x39,0x38,0x38,0x00,0x56,0x30,0x39,0x38, 0x39,0x00,0x56,0x30,0x39,0x39,0x30,0x00,0x56,0x30,0x39,0x39,0x31,0x00,0x56,0x30, 0x39,0x39,0x32,0x00,0x56,0x30,0x39,0x39,0x33,0x00,0x56,0x30,0x39,0x39,0x34,0x00, 0x56,0x30,0x39,0x39,0x35,0x00,0x56,0x30,0x39,0x39,0x36,0x00,0x56,0x30,0x39,0x39, 0x37,0x00,0x56,0x30,0x39,0x39,0x38,0x00,0x56,0x30,0x39,0x39,0x39,0x00,0x56,0x31, 0x30,0x30,0x30,0x00,0x56,0x31,0x30,0x30,0x31,0x00,0x56,0x31,0x30,0x30,0x32,0x00, 0x56,0x31,0x30,0x30,0x33,0x00,0x56,0x31,0x30,0x30,0x34,0x00,0x56,0x31,0x30,0x30, 0x35,0x00,0x56,0x31,0x30,0x30,0x36,0x00,0x56,0x31,0x30,0x30,0x37,0x00,0x56,0x31, 0x30,0x30,0x38,0x00,0x56,0x31,0x30,0x30,0x39,0x00,0x56,0x31,0x30,0x31,0x30,0x00, 0x56,0x31,0x30,0x31,0x31,0x00,0x56,0x31,0x30,0x31,0x32,0x00,0x56,0x31,0x30,0x31, 0x33,0x00,0x56,0x31,0x30,0x31,0x34,0x00,0x56,0x31,0x30,0x31,0x35,0x00,0x56,0x31, 0x30,0x31,0x36,0x00,0x56,0x31,0x30,0x31,0x37,0x00,0x56,0x31,0x30,0x31,0x38,0x00, 0x56,0x31,0x30,0x31,0x39,0x00,0x56,0x31,0x30,0x32,0x30,0x00,0x56,0x31,0x30,0x32, 0x31,0x00,0x56,0x31,0x30,0x32,0x32,0x00,0x56,0x31,0x30,0x32,0x33,0x00,0x56,0x31, 0x30,0x32,0x34,0x00,0x56,0x31,0x30,0x32,0x35,0x00,0x56,0x31,0x30,0x32,0x36,0x00, 0x56,0x31,0x30,0x32,0x37,0x00,0x56,0x31,0x30,0x32,0x38,0x00,0x56,0x31,0x30,0x32, 0x39,0x00,0x56,0x31,0x30,0x33,0x30,0x00,0x56,0x31,0x30,0x33,0x31,0x00,0x56,0x31, 0x30,0x33,0x32,0x00,0x56,0x31,0x30,0x33,0x33,0x00,0x56,0x31,0x30,0x33,0x34,0x00, 0x56,0x31,0x30,0x33,0x35,0x00,0x56,0x31,0x30,0x33,0x36,0x00,0x56,0x31,0x30,0x33, 0x37,0x00,0x56,0x31,0x30,0x33,0x38,0x00,0x56,0x31,0x30,0x33,0x39,0x00,0x56,0x31, 0x30,0x34,0x30,0x00,0x56,0x31,0x30,0x34,0x31,0x00,0x56,0x31,0x30,0x34,0x32,0x00, 0x56,0x31,0x30,0x34,0x33,0x00,0x56,0x31,0x30,0x34,0x34,0x00,0x56,0x31,0x30,0x34, 0x35,0x00,0x56,0x31,0x30,0x34,0x36,0x00,0x56,0x31,0x30,0x34,0x37,0x00,0x56,0x31, 0x30,0x34,0x38,0x00,0x56,0x31,0x30,0x34,0x39,0x00,0x56,0x31,0x30,0x35,0x30,0x00, 0x56,0x31,0x30,0x35,0x31,0x00,0x56,0x31,0x30,0x35,0x32,0x00,0x56,0x31,0x30,0x35, 0x33,0x00,0x56,0x31,0x30,0x35,0x34,0x00,0x56,0x31,0x30,0x35,0x35,0x00,0x56,0x31, 0x30,0x35,0x36,0x00,0x56,0x31,0x30,0x35,0x37,0x00,0x56,0x31,0x30,0x35,0x38,0x00, 0x56,0x31,0x30,0x35,0x39,0x00,0x56,0x31,0x30,0x36,0x30,0x00,0x56,0x31,0x30,0x36, 0x31,0x00,0x56,0x31,0x30,0x36,0x32,0x00,0x56,0x31,0x30,0x36,0x33,0x00,0x56,0x31, 0x30,0x36,0x34,0x00,0x56,0x31,0x30,0x36,0x35,0x00,0x56,0x31,0x30,0x36,0x36,0x00, 0x56,0x31,0x30,0x36,0x37,0x00,0x56,0x31,0x30,0x36,0x38,0x00,0x56,0x31,0x30,0x36, 0x39,0x00,0x56,0x31,0x30,0x37,0x30,0x00,0x56,0x31,0x30,0x37,0x31,0x00,0x56,0x31, 0x30,0x37,0x32,0x00,0x56,0x31,0x30,0x37,0x33,0x00,0x56,0x31,0x30,0x37,0x34,0x00, 0x56,0x31,0x30,0x37,0x35,0x00,0x56,0x31,0x30,0x37,0x36,0x00,0x56,0x31,0x30,0x37, 0x37,0x00,0x56,0x31,0x30,0x37,0x38,0x00,0x56,0x31,0x30,0x37,0x39,0x00,0x56,0x31, 0x30,0x38,0x30,0x00,0x56,0x31,0x30,0x38,0x31,0x00,0x56,0x31,0x30,0x38,0x32,0x00, 0x56,0x31,0x30,0x38,0x33,0x00,0x56,0x31,0x30,0x38,0x34,0x00,0x56,0x31,0x30,0x38, 0x35,0x00,0x56,0x31,0x30,0x38,0x36,0x00,0x56,0x31,0x30,0x38,0x37,0x00,0x56,0x31, 0x30,0x38,0x38,0x00,0x56,0x31,0x30,0x38,0x39,0x00,0x56,0x31,0x30,0x39,0x30,0x00, 0x56,0x31,0x30,0x39,0x31,0x00,0x56,0x31,0x30,0x39,0x32,0x00,0x56,0x31,0x30,0x39, 0x33,0x00,0x56,0x31,0x30,0x39,0x34,0x00,0x56,0x31,0x30,0x39,0x35,0x00,0x56,0x31, 0x30,0x39,0x36,0x00,0x56,0x31,0x30,0x39,0x37,0x00,0x56,0x31,0x30,0x39,0x38,0x00, 0x56,0x31,0x30,0x39,0x39,0x00,0x56,0x31,0x31,0x30,0x30,0x00,0x56,0x31,0x31,0x30, 0x31,0x00,0x56,0x31,0x31,0x30,0x32,0x00,0x56,0x31,0x31,0x30,0x33,0x00,0x56,0x31, 0x31,0x30,0x34,0x00,0x56,0x31,0x31,0x30,0x35,0x00,0x56,0x31,0x31,0x30,0x36,0x00, 0x56,0x31,0x31,0x30,0x37,0x00,0x56,0x31,0x31,0x30,0x38,0x00,0x56,0x31,0x31,0x30, 0x39,0x00,0x56,0x31,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x31,0x00,0x56,0x31, 0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x31,0x34,0x00, 0x56,0x31,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x31, 0x37,0x00,0x56,0x31,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x31,0x39,0x00,0x56,0x31, 0x31,0x32,0x30,0x00,0x56,0x31,0x31,0x32,0x31,0x00,0x56,0x31,0x31,0x32,0x32,0x00, 0x56,0x31,0x31,0x32,0x33,0x00,0x56,0x31,0x31,0x32,0x34,0x00,0x56,0x31,0x31,0x32, 0x35,0x00,0x56,0x31,0x31,0x32,0x36,0x00,0x56,0x31,0x31,0x32,0x37,0x00,0x56,0x31, 0x31,0x32,0x38,0x00,0x56,0x31,0x31,0x32,0x39,0x00,0x56,0x31,0x31,0x33,0x30,0x00, 0x56,0x31,0x31,0x33,0x31,0x00,0x56,0x31,0x31,0x33,0x32,0x00,0x56,0x31,0x31,0x33, 0x33,0x00,0x56,0x31,0x31,0x33,0x34,0x00,0x56,0x31,0x31,0x33,0x35,0x00,0x56,0x31, 0x31,0x33,0x36,0x00,0x56,0x31,0x31,0x33,0x37,0x00,0x56,0x31,0x31,0x33,0x38,0x00, 0x56,0x31,0x31,0x33,0x39,0x00,0x56,0x31,0x31,0x34,0x30,0x00,0x56,0x31,0x31,0x34, 0x31,0x00,0x56,0x31,0x31,0x34,0x32,0x00,0x56,0x31,0x31,0x34,0x33,0x00,0x56,0x31, 0x31,0x34,0x34,0x00,0x56,0x31,0x31,0x34,0x35,0x00,0x56,0x31,0x31,0x34,0x36,0x00, 0x56,0x31,0x31,0x34,0x37,0x00,0x56,0x31,0x31,0x34,0x38,0x00,0x56,0x31,0x31,0x34, 0x39,0x00,0x56,0x31,0x31,0x35,0x30,0x00,0x56,0x31,0x31,0x35,0x31,0x00,0x56,0x31, 0x31,0x35,0x32,0x00,0x56,0x31,0x31,0x35,0x33,0x00,0x56,0x31,0x31,0x35,0x34,0x00, 0x56,0x31,0x31,0x35,0x35,0x00,0x56,0x31,0x31,0x35,0x36,0x00,0x56,0x31,0x31,0x35, 0x37,0x00,0x56,0x31,0x31,0x35,0x38,0x00,0x56,0x31,0x31,0x35,0x39,0x00,0x56,0x31, 0x31,0x36,0x30,0x00,0x56,0x31,0x31,0x36,0x31,0x00,0x56,0x31,0x31,0x36,0x32,0x00, 0x56,0x31,0x31,0x36,0x33,0x00,0x56,0x31,0x31,0x36,0x34,0x00,0x56,0x31,0x31,0x36, 0x35,0x00,0x56,0x31,0x31,0x36,0x36,0x00,0x56,0x31,0x31,0x36,0x37,0x00,0x56,0x31, 0x31,0x36,0x38,0x00,0x56,0x31,0x31,0x36,0x39,0x00,0x56,0x31,0x31,0x37,0x30,0x00, 0x56,0x31,0x31,0x37,0x31,0x00,0x56,0x31,0x31,0x37,0x32,0x00,0x56,0x31,0x31,0x37, 0x33,0x00,0x56,0x31,0x31,0x37,0x34,0x00,0x56,0x31,0x31,0x37,0x35,0x00,0x56,0x31, 0x31,0x37,0x36,0x00,0x56,0x31,0x31,0x37,0x37,0x00,0x56,0x31,0x31,0x37,0x38,0x00, 0x56,0x31,0x31,0x37,0x39,0x00,0x56,0x31,0x31,0x38,0x30,0x00,0x56,0x31,0x31,0x38, 0x31,0x00,0x56,0x31,0x31,0x38,0x32,0x00,0x56,0x31,0x31,0x38,0x33,0x00,0x56,0x31, 0x31,0x38,0x34,0x00,0x56,0x31,0x31,0x38,0x35,0x00,0x56,0x31,0x31,0x38,0x36,0x00, 0x56,0x31,0x31,0x38,0x37,0x00,0x56,0x31,0x31,0x38,0x38,0x00,0x56,0x31,0x31,0x38, 0x39,0x00,0x56,0x31,0x31,0x39,0x30,0x00,0x56,0x31,0x31,0x39,0x31,0x00,0x56,0x31, 0x31,0x39,0x32,0x00,0x56,0x31,0x31,0x39,0x33,0x00,0x56,0x31,0x31,0x39,0x34,0x00, 0x56,0x31,0x31,0x39,0x35,0x00,0x56,0x31,0x31,0x39,0x36,0x00,0x56,0x31,0x31,0x39, 0x37,0x00,0x56,0x31,0x31,0x39,0x38,0x00,0x56,0x31,0x31,0x39,0x39,0x00,0x56,0x31, 0x32,0x30,0x30,0x00,0x56,0x31,0x32,0x30,0x31,0x00,0x56,0x31,0x32,0x30,0x32,0x00, 0x56,0x31,0x32,0x30,0x33,0x00,0x56,0x31,0x32,0x30,0x34,0x00,0x56,0x31,0x32,0x30, 0x35,0x00,0x56,0x31,0x32,0x30,0x36,0x00,0x56,0x31,0x32,0x30,0x37,0x00,0x56,0x31, 0x32,0x30,0x38,0x00,0x56,0x31,0x32,0x30,0x39,0x00,0x56,0x31,0x32,0x31,0x30,0x00, 0x56,0x31,0x32,0x31,0x31,0x00,0x56,0x31,0x32,0x31,0x32,0x00,0x56,0x31,0x32,0x31, 0x33,0x00,0x56,0x31,0x32,0x31,0x34,0x00,0x56,0x31,0x32,0x31,0x35,0x00,0x56,0x31, 0x32,0x31,0x36,0x00,0x56,0x31,0x32,0x31,0x37,0x00,0x56,0x31,0x32,0x31,0x38,0x00, 0x56,0x31,0x32,0x31,0x39,0x00,0x56,0x31,0x32,0x32,0x30,0x00,0x56,0x31,0x32,0x32, 0x31,0x00,0x56,0x31,0x32,0x32,0x32,0x00,0x56,0x31,0x32,0x32,0x33,0x00,0x56,0x31, 0x32,0x32,0x34,0x00,0x56,0x31,0x32,0x32,0x35,0x00,0x56,0x31,0x32,0x32,0x36,0x00, 0x56,0x31,0x32,0x32,0x37,0x00,0x56,0x31,0x32,0x32,0x38,0x00,0x56,0x31,0x32,0x32, 0x39,0x00,0x56,0x31,0x32,0x33,0x30,0x00,0x56,0x31,0x32,0x33,0x31,0x00,0x56,0x31, 0x32,0x33,0x32,0x00,0x56,0x31,0x32,0x33,0x33,0x00,0x56,0x31,0x32,0x33,0x34,0x00, 0x56,0x31,0x32,0x33,0x35,0x00,0x56,0x31,0x32,0x33,0x36,0x00,0x56,0x31,0x32,0x33, 0x37,0x00,0x56,0x31,0x32,0x33,0x38,0x00,0x56,0x31,0x32,0x33,0x39,0x00,0x56,0x31, 0x32,0x34,0x30,0x00,0x56,0x31,0x32,0x34,0x31,0x00,0x56,0x31,0x32,0x34,0x32,0x00, 0x56,0x31,0x32,0x34,0x33,0x00,0x56,0x31,0x32,0x34,0x34,0x00,0x56,0x31,0x32,0x34, 0x35,0x00,0x56,0x31,0x32,0x34,0x36,0x00,0x56,0x31,0x32,0x34,0x37,0x00,0x56,0x31, 0x32,0x34,0x38,0x00,0x56,0x31,0x32,0x34,0x39,0x00,0x56,0x31,0x32,0x35,0x30,0x00, 0x56,0x31,0x32,0x35,0x31,0x00,0x56,0x31,0x32,0x35,0x32,0x00,0x56,0x31,0x32,0x35, 0x33,0x00,0x56,0x31,0x32,0x35,0x34,0x00,0x56,0x31,0x32,0x35,0x35,0x00,0x56,0x31, 0x32,0x35,0x36,0x00,0x56,0x31,0x32,0x35,0x37,0x00,0x56,0x31,0x32,0x35,0x38,0x00, 0x56,0x31,0x32,0x35,0x39,0x00,0x56,0x31,0x32,0x36,0x30,0x00,0x56,0x31,0x32,0x36, 0x31,0x00,0x56,0x31,0x32,0x36,0x32,0x00,0x56,0x31,0x32,0x36,0x33,0x00,0x56,0x31, 0x32,0x36,0x34,0x00,0x56,0x31,0x32,0x36,0x35,0x00,0x56,0x31,0x32,0x36,0x36,0x00, 0x56,0x31,0x32,0x36,0x37,0x00,0x56,0x31,0x32,0x36,0x38,0x00,0x56,0x31,0x32,0x36, 0x39,0x00,0x56,0x31,0x32,0x37,0x30,0x00,0x56,0x31,0x32,0x37,0x31,0x00,0x56,0x31, 0x32,0x37,0x32,0x00,0x56,0x31,0x32,0x37,0x33,0x00,0x56,0x31,0x32,0x37,0x34,0x00, 0x56,0x31,0x32,0x37,0x35,0x00,0x56,0x31,0x32,0x37,0x36,0x00,0x56,0x31,0x32,0x37, 0x37,0x00,0x56,0x31,0x32,0x37,0x38,0x00,0x56,0x31,0x32,0x37,0x39,0x00,0x56,0x31, 0x32,0x38,0x30,0x00,0x56,0x31,0x32,0x38,0x31,0x00,0x56,0x31,0x32,0x38,0x32,0x00, 0x56,0x31,0x32,0x38,0x33,0x00,0x56,0x31,0x32,0x38,0x34,0x00,0x56,0x31,0x32,0x38, 0x35,0x00,0x56,0x31,0x32,0x38,0x36,0x00,0x56,0x31,0x32,0x38,0x37,0x00,0x56,0x31, 0x32,0x38,0x38,0x00,0x56,0x31,0x32,0x38,0x39,0x00,0x56,0x31,0x32,0x39,0x30,0x00, 0x56,0x31,0x32,0x39,0x31,0x00,0x56,0x31,0x32,0x39,0x32,0x00,0x56,0x31,0x32,0x39, 0x33,0x00,0x56,0x31,0x32,0x39,0x34,0x00,0x56,0x31,0x32,0x39,0x35,0x00,0x56,0x31, 0x32,0x39,0x36,0x00,0x56,0x31,0x32,0x39,0x37,0x00,0x56,0x31,0x32,0x39,0x38,0x00, 0x56,0x31,0x32,0x39,0x39,0x00,0x56,0x31,0x33,0x30,0x30,0x00,0x56,0x31,0x33,0x30, 0x31,0x00,0x56,0x31,0x33,0x30,0x32,0x00,0x56,0x31,0x33,0x30,0x33,0x00,0x56,0x31, 0x33,0x30,0x34,0x00,0x56,0x31,0x33,0x30,0x35,0x00,0x56,0x31,0x33,0x30,0x36,0x00, 0x56,0x31,0x33,0x30,0x37,0x00,0x56,0x31,0x33,0x30,0x38,0x00,0x56,0x31,0x33,0x30, 0x39,0x00,0x56,0x31,0x33,0x31,0x30,0x00,0x56,0x31,0x33,0x31,0x31,0x00,0x56,0x31, 0x33,0x31,0x32,0x00,0x56,0x31,0x33,0x31,0x33,0x00,0x56,0x31,0x33,0x31,0x34,0x00, 0x56,0x31,0x33,0x31,0x35,0x00,0x56,0x31,0x33,0x31,0x36,0x00,0x56,0x31,0x33,0x31, 0x37,0x00,0x56,0x31,0x33,0x31,0x38,0x00,0x56,0x31,0x33,0x31,0x39,0x00,0x56,0x31, 0x33,0x32,0x30,0x00,0x56,0x31,0x33,0x32,0x31,0x00,0x56,0x31,0x33,0x32,0x32,0x00, 0x56,0x31,0x33,0x32,0x33,0x00,0x56,0x31,0x33,0x32,0x34,0x00,0x56,0x31,0x33,0x32, 0x35,0x00,0x56,0x31,0x33,0x32,0x36,0x00,0x56,0x31,0x33,0x32,0x37,0x00,0x56,0x31, 0x33,0x32,0x38,0x00,0x56,0x31,0x33,0x32,0x39,0x00,0x56,0x31,0x33,0x33,0x30,0x00, 0x56,0x31,0x33,0x33,0x31,0x00,0x56,0x31,0x33,0x33,0x32,0x00,0x56,0x31,0x33,0x33, 0x33,0x00,0x56,0x31,0x33,0x33,0x34,0x00,0x56,0x31,0x33,0x33,0x35,0x00,0x56,0x31, 0x33,0x33,0x36,0x00,0x56,0x31,0x33,0x33,0x37,0x00,0x56,0x31,0x33,0x33,0x38,0x00, 0x56,0x31,0x33,0x33,0x39,0x00,0x56,0x31,0x33,0x34,0x30,0x00,0x56,0x31,0x33,0x34, 0x31,0x00,0x56,0x31,0x33,0x34,0x32,0x00,0x56,0x31,0x33,0x34,0x33,0x00,0x56,0x31, 0x33,0x34,0x34,0x00,0x56,0x31,0x33,0x34,0x35,0x00,0x56,0x31,0x33,0x34,0x36,0x00, 0x56,0x31,0x33,0x34,0x37,0x00,0x56,0x31,0x33,0x34,0x38,0x00,0x56,0x31,0x33,0x34, 0x39,0x00,0x56,0x31,0x33,0x35,0x30,0x00,0x56,0x31,0x33,0x35,0x31,0x00,0x56,0x31, 0x33,0x35,0x32,0x00,0x56,0x31,0x33,0x35,0x33,0x00,0x56,0x31,0x33,0x35,0x34,0x00, 0x56,0x31,0x33,0x35,0x35,0x00,0x56,0x31,0x33,0x35,0x36,0x00,0x56,0x31,0x33,0x35, 0x37,0x00,0x56,0x31,0x33,0x35,0x38,0x00,0x56,0x31,0x33,0x35,0x39,0x00,0x56,0x31, 0x33,0x36,0x30,0x00,0x56,0x31,0x33,0x36,0x31,0x00,0x56,0x31,0x33,0x36,0x32,0x00, 0x56,0x31,0x33,0x36,0x33,0x00,0x56,0x31,0x33,0x36,0x34,0x00,0x56,0x31,0x33,0x36, 0x35,0x00,0x56,0x31,0x33,0x36,0x36,0x00,0x56,0x31,0x33,0x36,0x37,0x00,0x56,0x31, 0x33,0x36,0x38,0x00,0x56,0x31,0x33,0x36,0x39,0x00,0x56,0x31,0x33,0x37,0x30,0x00, 0x56,0x31,0x33,0x37,0x31,0x00,0x56,0x31,0x33,0x37,0x32,0x00,0x56,0x31,0x33,0x37, 0x33,0x00,0x56,0x31,0x33,0x37,0x34,0x00,0x56,0x31,0x33,0x37,0x35,0x00,0x56,0x31, 0x33,0x37,0x36,0x00,0x56,0x31,0x33,0x37,0x37,0x00,0x56,0x31,0x33,0x37,0x38,0x00, 0x56,0x31,0x33,0x37,0x39,0x00,0x56,0x31,0x33,0x38,0x30,0x00,0x56,0x31,0x33,0x38, 0x31,0x00,0x56,0x31,0x33,0x38,0x32,0x00,0x56,0x31,0x33,0x38,0x33,0x00,0x56,0x31, 0x33,0x38,0x34,0x00,0x56,0x31,0x33,0x38,0x35,0x00,0x56,0x31,0x33,0x38,0x36,0x00, 0x56,0x31,0x33,0x38,0x37,0x00,0x56,0x31,0x33,0x38,0x38,0x00,0x56,0x31,0x33,0x38, 0x39,0x00,0x56,0x31,0x33,0x39,0x30,0x00,0x56,0x31,0x33,0x39,0x31,0x00,0x56,0x31, 0x33,0x39,0x32,0x00,0x56,0x31,0x33,0x39,0x33,0x00,0x56,0x31,0x33,0x39,0x34,0x00, 0x56,0x31,0x33,0x39,0x35,0x00,0x56,0x31,0x33,0x39,0x36,0x00,0x56,0x31,0x33,0x39, 0x37,0x00,0x56,0x31,0x33,0x39,0x38,0x00,0x56,0x31,0x33,0x39,0x39,0x00,0x56,0x31, 0x34,0x30,0x30,0x00,0x56,0x31,0x34,0x30,0x31,0x00,0x56,0x31,0x34,0x30,0x32,0x00, 0x56,0x31,0x34,0x30,0x33,0x00,0x56,0x31,0x34,0x30,0x34,0x00,0x56,0x31,0x34,0x30, 0x35,0x00,0x56,0x31,0x34,0x30,0x36,0x00,0x56,0x31,0x34,0x30,0x37,0x00,0x56,0x31, 0x34,0x30,0x38,0x00,0x56,0x31,0x34,0x30,0x39,0x00,0x56,0x31,0x34,0x31,0x30,0x00, 0x56,0x31,0x34,0x31,0x31,0x00,0x56,0x31,0x34,0x31,0x32,0x00,0x56,0x31,0x34,0x31, 0x33,0x00,0x56,0x31,0x34,0x31,0x34,0x00,0x56,0x31,0x34,0x31,0x35,0x00,0x56,0x31, 0x34,0x31,0x36,0x00,0x56,0x31,0x34,0x31,0x37,0x00,0x56,0x31,0x34,0x31,0x38,0x00, 0x56,0x31,0x34,0x31,0x39,0x00,0x56,0x31,0x34,0x32,0x30,0x00,0x56,0x31,0x34,0x32, 0x31,0x00,0x56,0x31,0x34,0x32,0x32,0x00,0x56,0x31,0x34,0x32,0x33,0x00,0x56,0x31, 0x34,0x32,0x34,0x00,0x56,0x31,0x34,0x32,0x35,0x00,0x56,0x31,0x34,0x32,0x36,0x00, 0x56,0x31,0x34,0x32,0x37,0x00,0x56,0x31,0x34,0x32,0x38,0x00,0x56,0x31,0x34,0x32, 0x39,0x00,0x56,0x31,0x34,0x33,0x30,0x00,0x56,0x31,0x34,0x33,0x31,0x00,0x56,0x31, 0x34,0x33,0x32,0x00,0x56,0x31,0x34,0x33,0x33,0x00,0x56,0x31,0x34,0x33,0x34,0x00, 0x56,0x31,0x34,0x33,0x35,0x00,0x56,0x31,0x34,0x33,0x36,0x00,0x56,0x31,0x34,0x33, 0x37,0x00,0x56,0x31,0x34,0x33,0x38,0x00,0x56,0x31,0x34,0x33,0x39,0x00,0x56,0x31, 0x34,0x34,0x30,0x00,0x56,0x31,0x34,0x34,0x31,0x00,0x56,0x31,0x34,0x34,0x32,0x00, 0x56,0x31,0x34,0x34,0x33,0x00,0x56,0x31,0x34,0x34,0x34,0x00,0x56,0x31,0x34,0x34, 0x35,0x00,0x56,0x31,0x34,0x34,0x36,0x00,0x56,0x31,0x34,0x34,0x37,0x00,0x56,0x31, 0x34,0x34,0x38,0x00,0x56,0x31,0x34,0x34,0x39,0x00,0x56,0x31,0x34,0x35,0x30,0x00, 0x56,0x31,0x34,0x35,0x31,0x00,0x56,0x31,0x34,0x35,0x32,0x00,0x56,0x31,0x34,0x35, 0x33,0x00,0x56,0x31,0x34,0x35,0x34,0x00,0x56,0x31,0x34,0x35,0x35,0x00,0x56,0x31, 0x34,0x35,0x36,0x00,0x56,0x31,0x34,0x35,0x37,0x00,0x56,0x31,0x34,0x35,0x38,0x00, 0x56,0x31,0x34,0x35,0x39,0x00,0x56,0x31,0x34,0x36,0x30,0x00,0x56,0x31,0x34,0x36, 0x31,0x00,0x56,0x31,0x34,0x36,0x32,0x00,0x56,0x31,0x34,0x36,0x33,0x00,0x56,0x31, 0x34,0x36,0x34,0x00,0x56,0x31,0x34,0x36,0x35,0x00,0x56,0x31,0x34,0x36,0x36,0x00, 0x56,0x31,0x34,0x36,0x37,0x00,0x56,0x31,0x34,0x36,0x38,0x00,0x56,0x31,0x34,0x36, 0x39,0x00,0x56,0x31,0x34,0x37,0x30,0x00,0x56,0x31,0x34,0x37,0x31,0x00,0x56,0x31, 0x34,0x37,0x32,0x00,0x56,0x31,0x34,0x37,0x33,0x00,0x56,0x31,0x34,0x37,0x34,0x00, 0x56,0x31,0x34,0x37,0x35,0x00,0x56,0x31,0x34,0x37,0x36,0x00,0x56,0x31,0x34,0x37, 0x37,0x00,0x56,0x31,0x34,0x37,0x38,0x00,0x56,0x31,0x34,0x37,0x39,0x00,0x56,0x31, 0x34,0x38,0x30,0x00,0x56,0x31,0x34,0x38,0x31,0x00,0x56,0x31,0x34,0x38,0x32,0x00, 0x56,0x31,0x34,0x38,0x33,0x00,0x56,0x31,0x34,0x38,0x34,0x00,0x56,0x31,0x34,0x38, 0x35,0x00,0x56,0x31,0x34,0x38,0x36,0x00,0x56,0x31,0x34,0x38,0x37,0x00,0x56,0x31, 0x34,0x38,0x38,0x00,0x56,0x31,0x34,0x38,0x39,0x00,0x56,0x31,0x34,0x39,0x30,0x00, 0x56,0x31,0x34,0x39,0x31,0x00,0x56,0x31,0x34,0x39,0x32,0x00,0x56,0x31,0x34,0x39, 0x33,0x00,0x56,0x31,0x34,0x39,0x34,0x00,0x56,0x31,0x34,0x39,0x35,0x00,0x56,0x31, 0x34,0x39,0x36,0x00,0x56,0x31,0x34,0x39,0x37,0x00,0x56,0x31,0x34,0x39,0x38,0x00, 0x56,0x31,0x34,0x39,0x39,0x00,0x56,0x31,0x35,0x30,0x30,0x00,0x56,0x31,0x35,0x30, 0x31,0x00,0x56,0x31,0x35,0x30,0x32,0x00,0x56,0x31,0x35,0x30,0x33,0x00,0x56,0x31, 0x35,0x30,0x34,0x00,0x56,0x31,0x35,0x30,0x35,0x00,0x56,0x31,0x35,0x30,0x36,0x00, 0x56,0x31,0x35,0x30,0x37,0x00,0x56,0x31,0x35,0x30,0x38,0x00,0x56,0x31,0x35,0x30, 0x39,0x00,0x56,0x31,0x35,0x31,0x30,0x00,0x56,0x31,0x35,0x31,0x31,0x00,0x56,0x31, 0x35,0x31,0x32,0x00,0x56,0x31,0x35,0x31,0x33,0x00,0x56,0x31,0x35,0x31,0x34,0x00, 0x56,0x31,0x35,0x31,0x35,0x00,0x56,0x31,0x35,0x31,0x36,0x00,0x56,0x31,0x35,0x31, 0x37,0x00,0x56,0x31,0x35,0x31,0x38,0x00,0x56,0x31,0x35,0x31,0x39,0x00,0x56,0x31, 0x35,0x32,0x30,0x00,0x56,0x31,0x35,0x32,0x31,0x00,0x56,0x31,0x35,0x32,0x32,0x00, 0x56,0x31,0x35,0x32,0x33,0x00,0x56,0x31,0x35,0x32,0x34,0x00,0x56,0x31,0x35,0x32, 0x35,0x00,0x56,0x31,0x35,0x32,0x36,0x00,0x56,0x31,0x35,0x32,0x37,0x00,0x56,0x31, 0x35,0x32,0x38,0x00,0x56,0x31,0x35,0x32,0x39,0x00,0x56,0x31,0x35,0x33,0x30,0x00, 0x56,0x31,0x35,0x33,0x31,0x00,0x56,0x31,0x35,0x33,0x32,0x00,0x56,0x31,0x35,0x33, 0x33,0x00,0x56,0x31,0x35,0x33,0x34,0x00,0x56,0x31,0x35,0x33,0x35,0x00,0x56,0x31, 0x35,0x33,0x36,0x00,0x56,0x31,0x35,0x33,0x37,0x00,0x56,0x31,0x35,0x33,0x38,0x00, 0x56,0x31,0x35,0x33,0x39,0x00,0x56,0x31,0x35,0x34,0x30,0x00,0x56,0x31,0x35,0x34, 0x31,0x00,0x56,0x31,0x35,0x34,0x32,0x00,0x56,0x31,0x35,0x34,0x33,0x00,0x56,0x31, 0x35,0x34,0x34,0x00,0x56,0x31,0x35,0x34,0x35,0x00,0x56,0x31,0x35,0x34,0x36,0x00, 0x56,0x31,0x35,0x34,0x37,0x00,0x56,0x31,0x35,0x34,0x38,0x00,0x56,0x31,0x35,0x34, 0x39,0x00,0x56,0x31,0x35,0x35,0x30,0x00,0x56,0x31,0x35,0x35,0x31,0x00,0x56,0x31, 0x35,0x35,0x32,0x00,0x56,0x31,0x35,0x35,0x33,0x00,0x56,0x31,0x35,0x35,0x34,0x00, 0x56,0x31,0x35,0x35,0x35,0x00,0x56,0x31,0x35,0x35,0x36,0x00,0x56,0x31,0x35,0x35, 0x37,0x00,0x56,0x31,0x35,0x35,0x38,0x00,0x56,0x31,0x35,0x35,0x39,0x00,0x56,0x31, 0x35,0x36,0x30,0x00,0x56,0x31,0x35,0x36,0x31,0x00,0x56,0x31,0x35,0x36,0x32,0x00, 0x56,0x31,0x35,0x36,0x33,0x00,0x56,0x31,0x35,0x36,0x34,0x00,0x56,0x31,0x35,0x36, 0x35,0x00,0x56,0x31,0x35,0x36,0x36,0x00,0x56,0x31,0x35,0x36,0x37,0x00,0x56,0x31, 0x35,0x36,0x38,0x00,0x56,0x31,0x35,0x36,0x39,0x00,0x56,0x31,0x35,0x37,0x30,0x00, 0x56,0x31,0x35,0x37,0x31,0x00,0x56,0x31,0x35,0x37,0x32,0x00,0x56,0x31,0x35,0x37, 0x33,0x00,0x56,0x31,0x35,0x37,0x34,0x00,0x56,0x31,0x35,0x37,0x35,0x00,0x56,0x31, 0x35,0x37,0x36,0x00,0x56,0x31,0x35,0x37,0x37,0x00,0x56,0x31,0x35,0x37,0x38,0x00, 0x56,0x31,0x35,0x37,0x39,0x00,0x56,0x31,0x35,0x38,0x30,0x00,0x56,0x31,0x35,0x38, 0x31,0x00,0x56,0x31,0x35,0x38,0x32,0x00,0x56,0x31,0x35,0x38,0x33,0x00,0x56,0x31, 0x35,0x38,0x34,0x00,0x56,0x31,0x35,0x38,0x35,0x00,0x56,0x31,0x35,0x38,0x36,0x00, 0x56,0x31,0x35,0x38,0x37,0x00,0x56,0x31,0x35,0x38,0x38,0x00,0x56,0x31,0x35,0x38, 0x39,0x00,0x56,0x31,0x35,0x39,0x30,0x00,0x56,0x31,0x35,0x39,0x31,0x00,0x56,0x31, 0x35,0x39,0x32,0x00,0x56,0x31,0x35,0x39,0x33,0x00,0x56,0x31,0x35,0x39,0x34,0x00, 0x56,0x31,0x35,0x39,0x35,0x00,0x56,0x31,0x35,0x39,0x36,0x00,0x56,0x31,0x35,0x39, 0x37,0x00,0x56,0x31,0x35,0x39,0x38,0x00,0x56,0x31,0x35,0x39,0x39,0x00,0x56,0x31, 0x36,0x30,0x30,0x00,0x56,0x31,0x36,0x30,0x31,0x00,0x56,0x31,0x36,0x30,0x32,0x00, 0x56,0x31,0x36,0x30,0x33,0x00,0x56,0x31,0x36,0x30,0x34,0x00,0x56,0x31,0x36,0x30, 0x35,0x00,0x56,0x31,0x36,0x30,0x36,0x00,0x56,0x31,0x36,0x30,0x37,0x00,0x56,0x31, 0x36,0x30,0x38,0x00,0x56,0x31,0x36,0x30,0x39,0x00,0x56,0x31,0x36,0x31,0x30,0x00, 0x56,0x31,0x36,0x31,0x31,0x00,0x56,0x31,0x36,0x31,0x32,0x00,0x56,0x31,0x36,0x31, 0x33,0x00,0x56,0x31,0x36,0x31,0x34,0x00,0x56,0x31,0x36,0x31,0x35,0x00,0x56,0x31, 0x36,0x31,0x36,0x00,0x56,0x31,0x36,0x31,0x37,0x00,0x56,0x31,0x36,0x31,0x38,0x00, 0x56,0x31,0x36,0x31,0x39,0x00,0x56,0x31,0x36,0x32,0x30,0x00,0x56,0x31,0x36,0x32, 0x31,0x00,0x56,0x31,0x36,0x32,0x32,0x00,0x56,0x31,0x36,0x32,0x33,0x00,0x56,0x31, 0x36,0x32,0x34,0x00,0x56,0x31,0x36,0x32,0x35,0x00,0x56,0x31,0x36,0x32,0x36,0x00, 0x56,0x31,0x36,0x32,0x37,0x00,0x56,0x31,0x36,0x32,0x38,0x00,0x56,0x31,0x36,0x32, 0x39,0x00,0x56,0x31,0x36,0x33,0x30,0x00,0x56,0x31,0x36,0x33,0x31,0x00,0x56,0x31, 0x36,0x33,0x32,0x00,0x56,0x31,0x36,0x33,0x33,0x00,0x56,0x31,0x36,0x33,0x34,0x00, 0x56,0x31,0x36,0x33,0x35,0x00,0x56,0x31,0x36,0x33,0x36,0x00,0x56,0x31,0x36,0x33, 0x37,0x00,0x56,0x31,0x36,0x33,0x38,0x00,0x56,0x31,0x36,0x33,0x39,0x00,0x56,0x31, 0x36,0x34,0x30,0x00,0x56,0x31,0x36,0x34,0x31,0x00,0x56,0x31,0x36,0x34,0x32,0x00, 0x56,0x31,0x36,0x34,0x33,0x00,0x56,0x31,0x36,0x34,0x34,0x00,0x56,0x31,0x36,0x34, 0x35,0x00,0x56,0x31,0x36,0x34,0x36,0x00,0x56,0x31,0x36,0x34,0x37,0x00,0x56,0x31, 0x36,0x34,0x38,0x00,0x56,0x31,0x36,0x34,0x39,0x00,0x56,0x31,0x36,0x35,0x30,0x00, 0x56,0x31,0x36,0x35,0x31,0x00,0x56,0x31,0x36,0x35,0x32,0x00,0x56,0x31,0x36,0x35, 0x33,0x00,0x56,0x31,0x36,0x35,0x34,0x00,0x56,0x31,0x36,0x35,0x35,0x00,0x56,0x31, 0x36,0x35,0x36,0x00,0x56,0x31,0x36,0x35,0x37,0x00,0x56,0x31,0x36,0x35,0x38,0x00, 0x56,0x31,0x36,0x35,0x39,0x00,0x56,0x31,0x36,0x36,0x30,0x00,0x56,0x31,0x36,0x36, 0x31,0x00,0x56,0x31,0x36,0x36,0x32,0x00,0x56,0x31,0x36,0x36,0x33,0x00,0x56,0x31, 0x36,0x36,0x34,0x00,0x56,0x31,0x36,0x36,0x35,0x00,0x56,0x31,0x36,0x36,0x36,0x00, 0x56,0x31,0x36,0x36,0x37,0x00,0x56,0x31,0x36,0x36,0x38,0x00,0x56,0x31,0x36,0x36, 0x39,0x00,0x56,0x31,0x36,0x37,0x30,0x00,0x56,0x31,0x36,0x37,0x31,0x00,0x56,0x31, 0x36,0x37,0x32,0x00,0x56,0x31,0x36,0x37,0x33,0x00,0x56,0x31,0x36,0x37,0x34,0x00, 0x56,0x31,0x36,0x37,0x35,0x00,0x56,0x31,0x36,0x37,0x36,0x00,0x56,0x31,0x36,0x37, 0x37,0x00,0x56,0x31,0x36,0x37,0x38,0x00,0x56,0x31,0x36,0x37,0x39,0x00,0x56,0x31, 0x36,0x38,0x30,0x00,0x56,0x31,0x36,0x38,0x31,0x00,0x56,0x31,0x36,0x38,0x32,0x00, 0x56,0x31,0x36,0x38,0x33,0x00,0x56,0x31,0x36,0x38,0x34,0x00,0x56,0x31,0x36,0x38, 0x35,0x00,0x56,0x31,0x36,0x38,0x36,0x00,0x56,0x31,0x36,0x38,0x37,0x00,0x56,0x31, 0x36,0x38,0x38,0x00,0x56,0x31,0x36,0x38,0x39,0x00,0x56,0x31,0x36,0x39,0x30,0x00, 0x56,0x31,0x36,0x39,0x31,0x00,0x56,0x31,0x36,0x39,0x32,0x00,0x56,0x31,0x36,0x39, 0x33,0x00,0x56,0x31,0x36,0x39,0x34,0x00,0x56,0x31,0x36,0x39,0x35,0x00,0x56,0x31, 0x36,0x39,0x36,0x00,0x56,0x31,0x36,0x39,0x37,0x00,0x56,0x31,0x36,0x39,0x38,0x00, 0x56,0x31,0x36,0x39,0x39,0x00,0x56,0x31,0x37,0x30,0x30,0x00,0x56,0x31,0x37,0x30, 0x31,0x00,0x56,0x31,0x37,0x30,0x32,0x00,0x56,0x31,0x37,0x30,0x33,0x00,0x56,0x31, 0x37,0x30,0x34,0x00,0x56,0x31,0x37,0x30,0x35,0x00,0x56,0x31,0x37,0x30,0x36,0x00, 0x56,0x31,0x37,0x30,0x37,0x00,0x56,0x31,0x37,0x30,0x38,0x00,0x56,0x31,0x37,0x30, 0x39,0x00,0x56,0x31,0x37,0x31,0x30,0x00,0x56,0x31,0x37,0x31,0x31,0x00,0x56,0x31, 0x37,0x31,0x32,0x00,0x56,0x31,0x37,0x31,0x33,0x00,0x56,0x31,0x37,0x31,0x34,0x00, 0x56,0x31,0x37,0x31,0x35,0x00,0x56,0x31,0x37,0x31,0x36,0x00,0x56,0x31,0x37,0x31, 0x37,0x00,0x56,0x31,0x37,0x31,0x38,0x00,0x56,0x31,0x37,0x31,0x39,0x00,0x56,0x31, 0x37,0x32,0x30,0x00,0x56,0x31,0x37,0x32,0x31,0x00,0x56,0x31,0x37,0x32,0x32,0x00, 0x56,0x31,0x37,0x32,0x33,0x00,0x56,0x31,0x37,0x32,0x34,0x00,0x56,0x31,0x37,0x32, 0x35,0x00,0x56,0x31,0x37,0x32,0x36,0x00,0x56,0x31,0x37,0x32,0x37,0x00,0x56,0x31, 0x37,0x32,0x38,0x00,0x56,0x31,0x37,0x32,0x39,0x00,0x56,0x31,0x37,0x33,0x30,0x00, 0x56,0x31,0x37,0x33,0x31,0x00,0x56,0x31,0x37,0x33,0x32,0x00,0x56,0x31,0x37,0x33, 0x33,0x00,0x56,0x31,0x37,0x33,0x34,0x00,0x56,0x31,0x37,0x33,0x35,0x00,0x56,0x31, 0x37,0x33,0x36,0x00,0x56,0x31,0x37,0x33,0x37,0x00,0x56,0x31,0x37,0x33,0x38,0x00, 0x56,0x31,0x37,0x33,0x39,0x00,0x56,0x31,0x37,0x34,0x30,0x00,0x56,0x31,0x37,0x34, 0x31,0x00,0x56,0x31,0x37,0x34,0x32,0x00,0x56,0x31,0x37,0x34,0x33,0x00,0x56,0x31, 0x37,0x34,0x34,0x00,0x56,0x31,0x37,0x34,0x35,0x00,0x56,0x31,0x37,0x34,0x36,0x00, 0x56,0x31,0x37,0x34,0x37,0x00,0x56,0x31,0x37,0x34,0x38,0x00,0x56,0x31,0x37,0x34, 0x39,0x00,0x56,0x31,0x37,0x35,0x30,0x00,0x56,0x31,0x37,0x35,0x31,0x00,0x56,0x31, 0x37,0x35,0x32,0x00,0x56,0x31,0x37,0x35,0x33,0x00,0x56,0x31,0x37,0x35,0x34,0x00, 0x56,0x31,0x37,0x35,0x35,0x00,0x56,0x31,0x37,0x35,0x36,0x00,0x56,0x31,0x37,0x35, 0x37,0x00,0x56,0x31,0x37,0x35,0x38,0x00,0x56,0x31,0x37,0x35,0x39,0x00,0x56,0x31, 0x37,0x36,0x30,0x00,0x56,0x31,0x37,0x36,0x31,0x00,0x56,0x31,0x37,0x36,0x32,0x00, 0x56,0x31,0x37,0x36,0x33,0x00,0x56,0x31,0x37,0x36,0x34,0x00,0x56,0x31,0x37,0x36, 0x35,0x00,0x56,0x31,0x37,0x36,0x36,0x00,0x56,0x31,0x37,0x36,0x37,0x00,0x56,0x31, 0x37,0x36,0x38,0x00,0x56,0x31,0x37,0x36,0x39,0x00,0x56,0x31,0x37,0x37,0x30,0x00, 0x56,0x31,0x37,0x37,0x31,0x00,0x56,0x31,0x37,0x37,0x32,0x00,0x56,0x31,0x37,0x37, 0x33,0x00,0x56,0x31,0x37,0x37,0x34,0x00,0x56,0x31,0x37,0x37,0x35,0x00,0x56,0x31, 0x37,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x37,0x00,0x56,0x31,0x37,0x37,0x38,0x00, 0x56,0x31,0x37,0x37,0x39,0x00,0x56,0x31,0x37,0x38,0x30,0x00,0x56,0x31,0x37,0x38, 0x31,0x00,0x56,0x31,0x37,0x38,0x32,0x00,0x56,0x31,0x37,0x38,0x33,0x00,0x56,0x31, 0x37,0x38,0x34,0x00,0x56,0x31,0x37,0x38,0x35,0x00,0x56,0x31,0x37,0x38,0x36,0x00, 0x56,0x31,0x37,0x38,0x37,0x00,0x56,0x31,0x37,0x38,0x38,0x00,0x56,0x31,0x37,0x38, 0x39,0x00,0x56,0x31,0x37,0x39,0x30,0x00,0x56,0x31,0x37,0x39,0x31,0x00,0x56,0x31, 0x37,0x39,0x32,0x00,0x56,0x31,0x37,0x39,0x33,0x00,0x56,0x31,0x37,0x39,0x34,0x00, 0x56,0x31,0x37,0x39,0x35,0x00,0x56,0x31,0x37,0x39,0x36,0x00,0x56,0x31,0x37,0x39, 0x37,0x00,0x56,0x31,0x37,0x39,0x38,0x00,0x56,0x31,0x37,0x39,0x39,0x00,0x56,0x31, 0x38,0x30,0x30,0x00,0x56,0x31,0x38,0x30,0x31,0x00,0x56,0x31,0x38,0x30,0x32,0x00, 0x56,0x31,0x38,0x30,0x33,0x00,0x56,0x31,0x38,0x30,0x34,0x00,0x56,0x31,0x38,0x30, 0x35,0x00,0x56,0x31,0x38,0x30,0x36,0x00,0x56,0x31,0x38,0x30,0x37,0x00,0x56,0x31, 0x38,0x30,0x38,0x00,0x56,0x31,0x38,0x30,0x39,0x00,0x56,0x31,0x38,0x31,0x30,0x00, 0x56,0x31,0x38,0x31,0x31,0x00,0x56,0x31,0x38,0x31,0x32,0x00,0x56,0x31,0x38,0x31, 0x33,0x00,0x56,0x31,0x38,0x31,0x34,0x00,0x56,0x31,0x38,0x31,0x35,0x00,0x56,0x31, 0x38,0x31,0x36,0x00,0x56,0x31,0x38,0x31,0x37,0x00,0x56,0x31,0x38,0x31,0x38,0x00, 0x56,0x31,0x38,0x31,0x39,0x00,0x56,0x31,0x38,0x32,0x30,0x00,0x56,0x31,0x38,0x32, 0x31,0x00,0x56,0x31,0x38,0x32,0x32,0x00,0x56,0x31,0x38,0x32,0x33,0x00,0x56,0x31, 0x38,0x32,0x34,0x00,0x56,0x31,0x38,0x32,0x35,0x00,0x56,0x31,0x38,0x32,0x36,0x00, 0x56,0x31,0x38,0x32,0x37,0x00,0x56,0x31,0x38,0x32,0x38,0x00,0x56,0x31,0x38,0x32, 0x39,0x00,0x56,0x31,0x38,0x33,0x30,0x00,0x56,0x31,0x38,0x33,0x31,0x00,0x56,0x31, 0x38,0x33,0x32,0x00,0x56,0x31,0x38,0x33,0x33,0x00,0x56,0x31,0x38,0x33,0x34,0x00, 0x56,0x31,0x38,0x33,0x35,0x00,0x56,0x31,0x38,0x33,0x36,0x00,0x56,0x31,0x38,0x33, 0x37,0x00,0x56,0x31,0x38,0x33,0x38,0x00,0x56,0x31,0x38,0x33,0x39,0x00,0x56,0x31, 0x38,0x34,0x30,0x00,0x56,0x31,0x38,0x34,0x31,0x00,0x56,0x31,0x38,0x34,0x32,0x00, 0x56,0x31,0x38,0x34,0x33,0x00,0x56,0x31,0x38,0x34,0x34,0x00,0x56,0x31,0x38,0x34, 0x35,0x00,0x56,0x31,0x38,0x34,0x36,0x00,0x56,0x31,0x38,0x34,0x37,0x00,0x56,0x31, 0x38,0x34,0x38,0x00,0x56,0x31,0x38,0x34,0x39,0x00,0x56,0x31,0x38,0x35,0x30,0x00, 0x56,0x31,0x38,0x35,0x31,0x00,0x56,0x31,0x38,0x35,0x32,0x00,0x56,0x31,0x38,0x35, 0x33,0x00,0x56,0x31,0x38,0x35,0x34,0x00,0x56,0x31,0x38,0x35,0x35,0x00,0x56,0x31, 0x38,0x35,0x36,0x00,0x56,0x31,0x38,0x35,0x37,0x00,0x56,0x31,0x38,0x35,0x38,0x00, 0x56,0x31,0x38,0x35,0x39,0x00,0x56,0x31,0x38,0x36,0x30,0x00,0x56,0x31,0x38,0x36, 0x31,0x00,0x56,0x31,0x38,0x36,0x32,0x00,0x56,0x31,0x38,0x36,0x33,0x00,0x56,0x31, 0x38,0x36,0x34,0x00,0x56,0x31,0x38,0x36,0x35,0x00,0x56,0x31,0x38,0x36,0x36,0x00, 0x56,0x31,0x38,0x36,0x37,0x00,0x56,0x31,0x38,0x36,0x38,0x00,0x56,0x31,0x38,0x36, 0x39,0x00,0x56,0x31,0x38,0x37,0x30,0x00,0x56,0x31,0x38,0x37,0x31,0x00,0x56,0x31, 0x38,0x37,0x32,0x00,0x56,0x31,0x38,0x37,0x33,0x00,0x56,0x31,0x38,0x37,0x34,0x00, 0x56,0x31,0x38,0x37,0x35,0x00,0x56,0x31,0x38,0x37,0x36,0x00,0x56,0x31,0x38,0x37, 0x37,0x00,0x56,0x31,0x38,0x37,0x38,0x00,0x56,0x31,0x38,0x37,0x39,0x00,0x56,0x31, 0x38,0x38,0x30,0x00,0x56,0x31,0x38,0x38,0x31,0x00,0x56,0x31,0x38,0x38,0x32,0x00, 0x56,0x31,0x38,0x38,0x33,0x00,0x56,0x31,0x38,0x38,0x34,0x00,0x56,0x31,0x38,0x38, 0x35,0x00,0x56,0x31,0x38,0x38,0x36,0x00,0x56,0x31,0x38,0x38,0x37,0x00,0x56,0x31, 0x38,0x38,0x38,0x00,0x56,0x31,0x38,0x38,0x39,0x00,0x56,0x31,0x38,0x39,0x30,0x00, 0x56,0x31,0x38,0x39,0x31,0x00,0x56,0x31,0x38,0x39,0x32,0x00,0x56,0x31,0x38,0x39, 0x33,0x00,0x56,0x31,0x38,0x39,0x34,0x00,0x56,0x31,0x38,0x39,0x35,0x00,0x56,0x31, 0x38,0x39,0x36,0x00,0x56,0x31,0x38,0x39,0x37,0x00,0x56,0x31,0x38,0x39,0x38,0x00, 0x56,0x31,0x38,0x39,0x39,0x00,0x56,0x31,0x39,0x30,0x30,0x00,0x56,0x31,0x39,0x30, 0x31,0x00,0x56,0x31,0x39,0x30,0x32,0x00,0x56,0x31,0x39,0x30,0x33,0x00,0x56,0x31, 0x39,0x30,0x34,0x00,0x56,0x31,0x39,0x30,0x35,0x00,0x56,0x31,0x39,0x30,0x36,0x00, 0x56,0x31,0x39,0x30,0x37,0x00,0x56,0x31,0x39,0x30,0x38,0x00,0x56,0x31,0x39,0x30, 0x39,0x00,0x56,0x31,0x39,0x31,0x30,0x00,0x56,0x31,0x39,0x31,0x31,0x00,0x56,0x31, 0x39,0x31,0x32,0x00,0x56,0x31,0x39,0x31,0x33,0x00,0x56,0x31,0x39,0x31,0x34,0x00, 0x56,0x31,0x39,0x31,0x35,0x00,0x56,0x31,0x39,0x31,0x36,0x00,0x56,0x31,0x39,0x31, 0x37,0x00,0x56,0x31,0x39,0x31,0x38,0x00,0x56,0x31,0x39,0x31,0x39,0x00,0x56,0x31, 0x39,0x32,0x30,0x00,0x56,0x31,0x39,0x32,0x31,0x00,0x56,0x31,0x39,0x32,0x32,0x00, 0x56,0x31,0x39,0x32,0x33,0x00,0x56,0x31,0x39,0x32,0x34,0x00,0x56,0x31,0x39,0x32, 0x35,0x00,0x56,0x31,0x39,0x32,0x36,0x00,0x56,0x31,0x39,0x32,0x37,0x00,0x56,0x31, 0x39,0x32,0x38,0x00,0x56,0x31,0x39,0x32,0x39,0x00,0x56,0x31,0x39,0x33,0x30,0x00, 0x56,0x31,0x39,0x33,0x31,0x00,0x56,0x31,0x39,0x33,0x32,0x00,0x56,0x31,0x39,0x33, 0x33,0x00,0x56,0x31,0x39,0x33,0x34,0x00,0x56,0x31,0x39,0x33,0x35,0x00,0x56,0x31, 0x39,0x33,0x36,0x00,0x56,0x31,0x39,0x33,0x37,0x00,0x56,0x31,0x39,0x33,0x38,0x00, 0x56,0x31,0x39,0x33,0x39,0x00,0x56,0x31,0x39,0x34,0x30,0x00,0x56,0x31,0x39,0x34, 0x31,0x00,0x56,0x31,0x39,0x34,0x32,0x00,0x56,0x31,0x39,0x34,0x33,0x00,0x56,0x31, 0x39,0x34,0x34,0x00,0x56,0x31,0x39,0x34,0x35,0x00,0x56,0x31,0x39,0x34,0x36,0x00, 0x56,0x31,0x39,0x34,0x37,0x00,0x56,0x31,0x39,0x34,0x38,0x00,0x56,0x31,0x39,0x34, 0x39,0x00,0x56,0x31,0x39,0x35,0x30,0x00,0x56,0x31,0x39,0x35,0x31,0x00,0x56,0x31, 0x39,0x35,0x32,0x00,0x56,0x31,0x39,0x35,0x33,0x00,0x56,0x31,0x39,0x35,0x34,0x00, 0x56,0x31,0x39,0x35,0x35,0x00,0x56,0x31,0x39,0x35,0x36,0x00,0x56,0x31,0x39,0x35, 0x37,0x00,0x56,0x31,0x39,0x35,0x38,0x00,0x56,0x31,0x39,0x35,0x39,0x00,0x56,0x31, 0x39,0x36,0x30,0x00,0x56,0x31,0x39,0x36,0x31,0x00,0x56,0x31,0x39,0x36,0x32,0x00, 0x56,0x31,0x39,0x36,0x33,0x00,0x56,0x31,0x39,0x36,0x34,0x00,0x56,0x31,0x39,0x36, 0x35,0x00,0x56,0x31,0x39,0x36,0x36,0x00,0x56,0x31,0x39,0x36,0x37,0x00,0x56,0x31, 0x39,0x36,0x38,0x00,0x56,0x31,0x39,0x36,0x39,0x00,0x56,0x31,0x39,0x37,0x30,0x00, 0x56,0x31,0x39,0x37,0x31,0x00,0x56,0x31,0x39,0x37,0x32,0x00,0x56,0x31,0x39,0x37, 0x33,0x00,0x56,0x31,0x39,0x37,0x34,0x00,0x56,0x31,0x39,0x37,0x35,0x00,0x56,0x31, 0x39,0x37,0x36,0x00,0x56,0x31,0x39,0x37,0x37,0x00,0x56,0x31,0x39,0x37,0x38,0x00, 0x56,0x31,0x39,0x37,0x39,0x00,0x56,0x31,0x39,0x38,0x30,0x00,0x56,0x31,0x39,0x38, 0x31,0x00,0x56,0x31,0x39,0x38,0x32,0x00,0x56,0x31,0x39,0x38,0x33,0x00,0x56,0x31, 0x39,0x38,0x34,0x00,0x56,0x31,0x39,0x38,0x35,0x00,0x56,0x31,0x39,0x38,0x36,0x00, 0x56,0x31,0x39,0x38,0x37,0x00,0x56,0x31,0x39,0x38,0x38,0x00,0x56,0x31,0x39,0x38, 0x39,0x00,0x56,0x31,0x39,0x39,0x30,0x00,0x56,0x31,0x39,0x39,0x31,0x00,0x56,0x31, 0x39,0x39,0x32,0x00,0x56,0x31,0x39,0x39,0x33,0x00,0x56,0x31,0x39,0x39,0x34,0x00, 0x56,0x31,0x39,0x39,0x35,0x00,0x56,0x31,0x39,0x39,0x36,0x00,0x56,0x31,0x39,0x39, 0x37,0x00,0x56,0x31,0x39,0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x39,0x00,0x56,0x32, 0x30,0x30,0x30,0x00,0x56,0x32,0x30,0x30,0x31,0x00,0x56,0x32,0x30,0x30,0x32,0x00, 0x56,0x32,0x30,0x30,0x33,0x00,0x56,0x32,0x30,0x30,0x34,0x00,0x56,0x32,0x30,0x30, 0x35,0x00,0x56,0x32,0x30,0x30,0x36,0x00,0x56,0x32,0x30,0x30,0x37,0x00,0x56,0x32, 0x30,0x30,0x38,0x00,0x56,0x32,0x30,0x30,0x39,0x00,0x56,0x32,0x30,0x31,0x30,0x00, 0x56,0x32,0x30,0x31,0x31,0x00,0x56,0x32,0x30,0x31,0x32,0x00,0x56,0x32,0x30,0x31, 0x33,0x00,0x56,0x32,0x30,0x31,0x34,0x00,0x56,0x32,0x30,0x31,0x35,0x00,0x56,0x32, 0x30,0x31,0x36,0x00,0x56,0x32,0x30,0x31,0x37,0x00,0x56,0x32,0x30,0x31,0x38,0x00, 0x56,0x32,0x30,0x31,0x39,0x00,0x56,0x32,0x30,0x32,0x30,0x00,0x56,0x32,0x30,0x32, 0x31,0x00,0x56,0x32,0x30,0x32,0x32,0x00,0x56,0x32,0x30,0x32,0x33,0x00,0x56,0x32, 0x30,0x32,0x34,0x00,0x56,0x32,0x30,0x32,0x35,0x00,0x56,0x32,0x30,0x32,0x36,0x00, 0x56,0x32,0x30,0x32,0x37,0x00,0x56,0x32,0x30,0x32,0x38,0x00,0x56,0x32,0x30,0x32, 0x39,0x00,0x56,0x32,0x30,0x33,0x30,0x00,0x56,0x32,0x30,0x33,0x31,0x00,0x56,0x32, 0x30,0x33,0x32,0x00,0x56,0x32,0x30,0x33,0x33,0x00,0x56,0x32,0x30,0x33,0x34,0x00, 0x56,0x32,0x30,0x33,0x35,0x00,0x56,0x32,0x30,0x33,0x36,0x00,0x56,0x32,0x30,0x33, 0x37,0x00,0x56,0x32,0x30,0x33,0x38,0x00,0x56,0x32,0x30,0x33,0x39,0x00,0x56,0x32, 0x30,0x34,0x30,0x00,0x56,0x32,0x30,0x34,0x31,0x00,0x56,0x32,0x30,0x34,0x32,0x00, 0x56,0x32,0x30,0x34,0x33,0x00,0x56,0x32,0x30,0x34,0x34,0x00,0x56,0x32,0x30,0x34, 0x35,0x00,0x56,0x32,0x30,0x34,0x36,0x00,0x56,0x32,0x30,0x34,0x37,0x00,0x56,0x32, 0x30,0x34,0x38,0x00,0x56,0x32,0x30,0x34,0x39,0x00,0x56,0x32,0x30,0x35,0x30,0x00, 0x56,0x32,0x30,0x35,0x31,0x00,0x56,0x32,0x30,0x35,0x32,0x00,0x56,0x32,0x30,0x35, 0x33,0x00,0x56,0x32,0x30,0x35,0x34,0x00,0x56,0x32,0x30,0x35,0x35,0x00,0x56,0x32, 0x30,0x35,0x36,0x00,0x56,0x32,0x30,0x35,0x37,0x00,0x56,0x32,0x30,0x35,0x38,0x00, 0x56,0x32,0x30,0x35,0x39,0x00,0x56,0x32,0x30,0x36,0x30,0x00,0x56,0x32,0x30,0x36, 0x31,0x00,0x56,0x32,0x30,0x36,0x32,0x00,0x56,0x32,0x30,0x36,0x33,0x00,0x56,0x32, 0x30,0x36,0x34,0x00,0x56,0x32,0x30,0x36,0x35,0x00,0x56,0x32,0x30,0x36,0x36,0x00, 0x56,0x32,0x30,0x36,0x37,0x00,0x56,0x32,0x30,0x36,0x38,0x00,0x56,0x32,0x30,0x36, 0x39,0x00,0x56,0x32,0x30,0x37,0x30,0x00,0x56,0x32,0x30,0x37,0x31,0x00,0x56,0x32, 0x30,0x37,0x32,0x00,0x56,0x32,0x30,0x37,0x33,0x00,0x56,0x32,0x30,0x37,0x34,0x00, 0x56,0x32,0x30,0x37,0x35,0x00,0x56,0x32,0x30,0x37,0x36,0x00,0x56,0x32,0x30,0x37, 0x37,0x00,0x56,0x32,0x30,0x37,0x38,0x00,0x56,0x32,0x30,0x37,0x39,0x00,0x56,0x32, 0x30,0x38,0x30,0x00,0x56,0x32,0x30,0x38,0x31,0x00,0x56,0x32,0x30,0x38,0x32,0x00, 0x56,0x32,0x30,0x38,0x33,0x00,0x56,0x32,0x30,0x38,0x34,0x00,0x56,0x32,0x30,0x38, 0x35,0x00,0x56,0x32,0x30,0x38,0x36,0x00,0x56,0x32,0x30,0x38,0x37,0x00,0x56,0x32, 0x30,0x38,0x38,0x00,0x56,0x32,0x30,0x38,0x39,0x00,0x56,0x32,0x30,0x39,0x30,0x00, 0x56,0x32,0x30,0x39,0x31,0x00,0x56,0x32,0x30,0x39,0x32,0x00,0x56,0x32,0x30,0x39, 0x33,0x00,0x56,0x32,0x30,0x39,0x34,0x00,0x56,0x32,0x30,0x39,0x35,0x00,0x56,0x32, 0x30,0x39,0x36,0x00,0x56,0x32,0x30,0x39,0x37,0x00,0x56,0x32,0x30,0x39,0x38,0x00, 0x56,0x32,0x30,0x39,0x39,0x00,0x56,0x32,0x31,0x30,0x30,0x00,0x56,0x32,0x31,0x30, 0x31,0x00,0x56,0x32,0x31,0x30,0x32,0x00,0x56,0x32,0x31,0x30,0x33,0x00,0x56,0x32, 0x31,0x30,0x34,0x00,0x56,0x32,0x31,0x30,0x35,0x00,0x56,0x32,0x31,0x30,0x36,0x00, 0x56,0x32,0x31,0x30,0x37,0x00,0x56,0x32,0x31,0x30,0x38,0x00,0x56,0x32,0x31,0x30, 0x39,0x00,0x56,0x32,0x31,0x31,0x30,0x00,0x56,0x32,0x31,0x31,0x31,0x00,0x56,0x32, 0x31,0x31,0x32,0x00,0x56,0x32,0x31,0x31,0x33,0x00,0x56,0x32,0x31,0x31,0x34,0x00, 0x56,0x32,0x31,0x31,0x35,0x00,0x56,0x32,0x31,0x31,0x36,0x00,0x56,0x32,0x31,0x31, 0x37,0x00,0x56,0x32,0x31,0x31,0x38,0x00,0x56,0x32,0x31,0x31,0x39,0x00,0x56,0x32, 0x31,0x32,0x30,0x00,0x56,0x32,0x31,0x32,0x31,0x00,0x56,0x32,0x31,0x32,0x32,0x00, 0x56,0x32,0x31,0x32,0x33,0x00,0x56,0x32,0x31,0x32,0x34,0x00,0x56,0x32,0x31,0x32, 0x35,0x00,0x56,0x32,0x31,0x32,0x36,0x00,0x56,0x32,0x31,0x32,0x37,0x00,0x56,0x32, 0x31,0x32,0x38,0x00,0x56,0x32,0x31,0x32,0x39,0x00,0x56,0x32,0x31,0x33,0x30,0x00, 0x56,0x32,0x31,0x33,0x31,0x00,0x56,0x32,0x31,0x33,0x32,0x00,0x56,0x32,0x31,0x33, 0x33,0x00,0x56,0x32,0x31,0x33,0x34,0x00,0x56,0x32,0x31,0x33,0x35,0x00,0x56,0x32, 0x31,0x33,0x36,0x00,0x56,0x32,0x31,0x33,0x37,0x00,0x56,0x32,0x31,0x33,0x38,0x00, 0x56,0x32,0x31,0x33,0x39,0x00,0x56,0x32,0x31,0x34,0x30,0x00,0x56,0x32,0x31,0x34, 0x31,0x00,0x56,0x32,0x31,0x34,0x32,0x00,0x56,0x32,0x31,0x34,0x33,0x00,0x56,0x32, 0x31,0x34,0x34,0x00,0x56,0x32,0x31,0x34,0x35,0x00,0x56,0x32,0x31,0x34,0x36,0x00, 0x56,0x32,0x31,0x34,0x37,0x00,0x56,0x32,0x31,0x34,0x38,0x00,0x56,0x32,0x31,0x34, 0x39,0x00,0x56,0x32,0x31,0x35,0x30,0x00,0x56,0x32,0x31,0x35,0x31,0x00,0x56,0x32, 0x31,0x35,0x32,0x00,0x56,0x32,0x31,0x35,0x33,0x00,0x56,0x32,0x31,0x35,0x34,0x00, 0x56,0x32,0x31,0x35,0x35,0x00,0x56,0x32,0x31,0x35,0x36,0x00,0x56,0x32,0x31,0x35, 0x37,0x00,0x56,0x32,0x31,0x35,0x38,0x00,0x56,0x32,0x31,0x35,0x39,0x00,0x56,0x32, 0x31,0x36,0x30,0x00,0x56,0x32,0x31,0x36,0x31,0x00,0x56,0x32,0x31,0x36,0x32,0x00, 0x56,0x32,0x31,0x36,0x33,0x00,0x56,0x32,0x31,0x36,0x34,0x00,0x56,0x32,0x31,0x36, 0x35,0x00,0x56,0x32,0x31,0x36,0x36,0x00,0x56,0x32,0x31,0x36,0x37,0x00,0x56,0x32, 0x31,0x36,0x38,0x00,0x56,0x32,0x31,0x36,0x39,0x00,0x56,0x32,0x31,0x37,0x30,0x00, 0x56,0x32,0x31,0x37,0x31,0x00,0x56,0x32,0x31,0x37,0x32,0x00,0x56,0x32,0x31,0x37, 0x33,0x00,0x56,0x32,0x31,0x37,0x34,0x00,0x56,0x32,0x31,0x37,0x35,0x00,0x56,0x32, 0x31,0x37,0x36,0x00,0x56,0x32,0x31,0x37,0x37,0x00,0x56,0x32,0x31,0x37,0x38,0x00, 0x56,0x32,0x31,0x37,0x39,0x00,0x56,0x32,0x31,0x38,0x30,0x00,0x56,0x32,0x31,0x38, 0x31,0x00,0x56,0x32,0x31,0x38,0x32,0x00,0x56,0x32,0x31,0x38,0x33,0x00,0x56,0x32, 0x31,0x38,0x34,0x00,0x56,0x32,0x31,0x38,0x35,0x00,0x56,0x32,0x31,0x38,0x36,0x00, 0x56,0x32,0x31,0x38,0x37,0x00,0x56,0x32,0x31,0x38,0x38,0x00,0x56,0x32,0x31,0x38, 0x39,0x00,0x56,0x32,0x31,0x39,0x30,0x00,0x56,0x32,0x31,0x39,0x31,0x00,0x56,0x32, 0x31,0x39,0x32,0x00,0x56,0x32,0x31,0x39,0x33,0x00,0x56,0x32,0x31,0x39,0x34,0x00, 0x56,0x32,0x31,0x39,0x35,0x00,0x56,0x32,0x31,0x39,0x36,0x00,0x56,0x32,0x31,0x39, 0x37,0x00,0x56,0x32,0x31,0x39,0x38,0x00,0x56,0x32,0x31,0x39,0x39,0x00,0x56,0x32, 0x32,0x30,0x30,0x00,0x56,0x32,0x32,0x30,0x31,0x00,0x56,0x32,0x32,0x30,0x32,0x00, 0x56,0x32,0x32,0x30,0x33,0x00,0x56,0x32,0x32,0x30,0x34,0x00,0x56,0x32,0x32,0x30, 0x35,0x00,0x56,0x32,0x32,0x30,0x36,0x00,0x56,0x32,0x32,0x30,0x37,0x00,0x56,0x32, 0x32,0x30,0x38,0x00,0x56,0x32,0x32,0x30,0x39,0x00,0x56,0x32,0x32,0x31,0x30,0x00, 0x56,0x32,0x32,0x31,0x31,0x00,0x56,0x32,0x32,0x31,0x32,0x00,0x56,0x32,0x32,0x31, 0x33,0x00,0x56,0x32,0x32,0x31,0x34,0x00,0x56,0x32,0x32,0x31,0x35,0x00,0x56,0x32, 0x32,0x31,0x36,0x00,0x56,0x32,0x32,0x31,0x37,0x00,0x56,0x32,0x32,0x31,0x38,0x00, 0x56,0x32,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x32,0x30,0x00,0x56,0x32,0x32,0x32, 0x31,0x00,0x56,0x32,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x32,0x33,0x00,0x56,0x32, 0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x32,0x36,0x00, 0x56,0x32,0x32,0x32,0x37,0x00,0x56,0x32,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x32, 0x39,0x00,0x56,0x32,0x32,0x33,0x30,0x00,0x56,0x32,0x32,0x33,0x31,0x00,0x56,0x32, 0x32,0x33,0x32,0x00,0x56,0x32,0x32,0x33,0x33,0x00,0x56,0x32,0x32,0x33,0x34,0x00, 0x56,0x32,0x32,0x33,0x35,0x00,0x56,0x32,0x32,0x33,0x36,0x00,0x56,0x32,0x32,0x33, 0x37,0x00,0x56,0x32,0x32,0x33,0x38,0x00,0x56,0x32,0x32,0x33,0x39,0x00,0x56,0x32, 0x32,0x34,0x30,0x00,0x56,0x32,0x32,0x34,0x31,0x00,0x56,0x32,0x32,0x34,0x32,0x00, 0x56,0x32,0x32,0x34,0x33,0x00,0x56,0x32,0x32,0x34,0x34,0x00,0x56,0x32,0x32,0x34, 0x35,0x00,0x56,0x32,0x32,0x34,0x36,0x00,0x56,0x32,0x32,0x34,0x37,0x00,0x56,0x32, 0x32,0x34,0x38,0x00,0x56,0x32,0x32,0x34,0x39,0x00,0x56,0x32,0x32,0x35,0x30,0x00, 0x56,0x32,0x32,0x35,0x31,0x00,0x56,0x32,0x32,0x35,0x32,0x00,0x56,0x32,0x32,0x35, 0x33,0x00,0x56,0x32,0x32,0x35,0x34,0x00,0x56,0x32,0x32,0x35,0x35,0x00,0x56,0x32, 0x32,0x35,0x36,0x00,0x56,0x32,0x32,0x35,0x37,0x00,0x56,0x32,0x32,0x35,0x38,0x00, 0x56,0x32,0x32,0x35,0x39,0x00,0x56,0x32,0x32,0x36,0x30,0x00,0x56,0x32,0x32,0x36, 0x31,0x00,0x56,0x32,0x32,0x36,0x32,0x00,0x56,0x32,0x32,0x36,0x33,0x00,0x56,0x32, 0x32,0x36,0x34,0x00,0x56,0x32,0x32,0x36,0x35,0x00,0x56,0x32,0x32,0x36,0x36,0x00, 0x56,0x32,0x32,0x36,0x37,0x00,0x56,0x32,0x32,0x36,0x38,0x00,0x56,0x32,0x32,0x36, 0x39,0x00,0x56,0x32,0x32,0x37,0x30,0x00,0x56,0x32,0x32,0x37,0x31,0x00,0x56,0x32, 0x32,0x37,0x32,0x00,0x56,0x32,0x32,0x37,0x33,0x00,0x56,0x32,0x32,0x37,0x34,0x00, 0x56,0x32,0x32,0x37,0x35,0x00,0x56,0x32,0x32,0x37,0x36,0x00,0x56,0x32,0x32,0x37, 0x37,0x00,0x56,0x32,0x32,0x37,0x38,0x00,0x56,0x32,0x32,0x37,0x39,0x00,0x56,0x32, 0x32,0x38,0x30,0x00,0x56,0x32,0x32,0x38,0x31,0x00,0x56,0x32,0x32,0x38,0x32,0x00, 0x56,0x32,0x32,0x38,0x33,0x00,0x56,0x32,0x32,0x38,0x34,0x00,0x56,0x32,0x32,0x38, 0x35,0x00,0x56,0x32,0x32,0x38,0x36,0x00,0x56,0x32,0x32,0x38,0x37,0x00,0x56,0x32, 0x32,0x38,0x38,0x00,0x56,0x32,0x32,0x38,0x39,0x00,0x56,0x32,0x32,0x39,0x30,0x00, 0x56,0x32,0x32,0x39,0x31,0x00,0x56,0x32,0x32,0x39,0x32,0x00,0x56,0x32,0x32,0x39, 0x33,0x00,0x56,0x32,0x32,0x39,0x34,0x00,0x56,0x32,0x32,0x39,0x35,0x00,0x56,0x32, 0x32,0x39,0x36,0x00,0x56,0x32,0x32,0x39,0x37,0x00,0x56,0x32,0x32,0x39,0x38,0x00, 0x56,0x32,0x32,0x39,0x39,0x00,0x56,0x32,0x33,0x30,0x30,0x00,0x56,0x32,0x33,0x30, 0x31,0x00,0x56,0x32,0x33,0x30,0x32,0x00,0x56,0x32,0x33,0x30,0x33,0x00,0x56,0x32, 0x33,0x30,0x34,0x00,0x56,0x32,0x33,0x30,0x35,0x00,0x56,0x32,0x33,0x30,0x36,0x00, 0x56,0x32,0x33,0x30,0x37,0x00,0x56,0x32,0x33,0x30,0x38,0x00,0x56,0x32,0x33,0x30, 0x39,0x00,0x56,0x32,0x33,0x31,0x30,0x00,0x56,0x32,0x33,0x31,0x31,0x00,0x56,0x32, 0x33,0x31,0x32,0x00,0x56,0x32,0x33,0x31,0x33,0x00,0x56,0x32,0x33,0x31,0x34,0x00, 0x56,0x32,0x33,0x31,0x35,0x00,0x56,0x32,0x33,0x31,0x36,0x00,0x56,0x32,0x33,0x31, 0x37,0x00,0x56,0x32,0x33,0x31,0x38,0x00,0x56,0x32,0x33,0x31,0x39,0x00,0x56,0x32, 0x33,0x32,0x30,0x00,0x56,0x32,0x33,0x32,0x31,0x00,0x56,0x32,0x33,0x32,0x32,0x00, 0x56,0x32,0x33,0x32,0x33,0x00,0x56,0x32,0x33,0x32,0x34,0x00,0x56,0x32,0x33,0x32, 0x35,0x00,0x56,0x32,0x33,0x32,0x36,0x00,0x56,0x32,0x33,0x32,0x37,0x00,0x56,0x32, 0x33,0x32,0x38,0x00,0x56,0x32,0x33,0x32,0x39,0x00,0x56,0x32,0x33,0x33,0x30,0x00, 0x56,0x32,0x33,0x33,0x31,0x00,0x56,0x32,0x33,0x33,0x32,0x00,0x56,0x32,0x33,0x33, 0x33,0x00,0x56,0x32,0x33,0x33,0x34,0x00,0x56,0x32,0x33,0x33,0x35,0x00,0x56,0x32, 0x33,0x33,0x36,0x00,0x56,0x32,0x33,0x33,0x37,0x00,0x56,0x32,0x33,0x33,0x38,0x00, 0x56,0x32,0x33,0x33,0x39,0x00,0x56,0x32,0x33,0x34,0x30,0x00,0x56,0x32,0x33,0x34, 0x31,0x00,0x56,0x32,0x33,0x34,0x32,0x00,0x56,0x32,0x33,0x34,0x33,0x00,0x56,0x32, 0x33,0x34,0x34,0x00,0x56,0x32,0x33,0x34,0x35,0x00,0x56,0x32,0x33,0x34,0x36,0x00, 0x56,0x32,0x33,0x34,0x37,0x00,0x56,0x32,0x33,0x34,0x38,0x00,0x56,0x32,0x33,0x34, 0x39,0x00,0x56,0x32,0x33,0x35,0x30,0x00,0x56,0x32,0x33,0x35,0x31,0x00,0x56,0x32, 0x33,0x35,0x32,0x00,0x56,0x32,0x33,0x35,0x33,0x00,0x56,0x32,0x33,0x35,0x34,0x00, 0x56,0x32,0x33,0x35,0x35,0x00,0x56,0x32,0x33,0x35,0x36,0x00,0x56,0x32,0x33,0x35, 0x37,0x00,0x56,0x32,0x33,0x35,0x38,0x00,0x56,0x32,0x33,0x35,0x39,0x00,0x56,0x32, 0x33,0x36,0x30,0x00,0x56,0x32,0x33,0x36,0x31,0x00,0x56,0x32,0x33,0x36,0x32,0x00, 0x56,0x32,0x33,0x36,0x33,0x00,0x56,0x32,0x33,0x36,0x34,0x00,0x56,0x32,0x33,0x36, 0x35,0x00,0x56,0x32,0x33,0x36,0x36,0x00,0x56,0x32,0x33,0x36,0x37,0x00,0x56,0x32, 0x33,0x36,0x38,0x00,0x56,0x32,0x33,0x36,0x39,0x00,0x56,0x32,0x33,0x37,0x30,0x00, 0x56,0x32,0x33,0x37,0x31,0x00,0x56,0x32,0x33,0x37,0x32,0x00,0x56,0x32,0x33,0x37, 0x33,0x00,0x56,0x32,0x33,0x37,0x34,0x00,0x56,0x32,0x33,0x37,0x35,0x00,0x56,0x32, 0x33,0x37,0x36,0x00,0x56,0x32,0x33,0x37,0x37,0x00,0x56,0x32,0x33,0x37,0x38,0x00, 0x56,0x32,0x33,0x37,0x39,0x00,0x56,0x32,0x33,0x38,0x30,0x00,0x56,0x32,0x33,0x38, 0x31,0x00,0x56,0x32,0x33,0x38,0x32,0x00,0x56,0x32,0x33,0x38,0x33,0x00,0x56,0x32, 0x33,0x38,0x34,0x00,0x56,0x32,0x33,0x38,0x35,0x00,0x56,0x32,0x33,0x38,0x36,0x00, 0x56,0x32,0x33,0x38,0x37,0x00,0x56,0x32,0x33,0x38,0x38,0x00,0x56,0x32,0x33,0x38, 0x39,0x00,0x56,0x32,0x33,0x39,0x30,0x00,0x56,0x32,0x33,0x39,0x31,0x00,0x56,0x32, 0x33,0x39,0x32,0x00,0x56,0x32,0x33,0x39,0x33,0x00,0x56,0x32,0x33,0x39,0x34,0x00, 0x56,0x32,0x33,0x39,0x35,0x00,0x56,0x32,0x33,0x39,0x36,0x00,0x56,0x32,0x33,0x39, 0x37,0x00,0x56,0x32,0x33,0x39,0x38,0x00,0x56,0x32,0x33,0x39,0x39,0x00,0x56,0x32, 0x34,0x30,0x30,0x00,0x56,0x32,0x34,0x30,0x31,0x00,0x56,0x32,0x34,0x30,0x32,0x00, 0x56,0x32,0x34,0x30,0x33,0x00,0x56,0x32,0x34,0x30,0x34,0x00,0x56,0x32,0x34,0x30, 0x35,0x00,0x56,0x32,0x34,0x30,0x36,0x00,0x56,0x32,0x34,0x30,0x37,0x00,0x56,0x32, 0x34,0x30,0x38,0x00,0x56,0x32,0x34,0x30,0x39,0x00,0x56,0x32,0x34,0x31,0x30,0x00, 0x56,0x32,0x34,0x31,0x31,0x00,0x56,0x32,0x34,0x31,0x32,0x00,0x56,0x32,0x34,0x31, 0x33,0x00,0x56,0x32,0x34,0x31,0x34,0x00,0x56,0x32,0x34,0x31,0x35,0x00,0x56,0x32, 0x34,0x31,0x36,0x00,0x56,0x32,0x34,0x31,0x37,0x00,0x56,0x32,0x34,0x31,0x38,0x00, 0x56,0x32,0x34,0x31,0x39,0x00,0x56,0x32,0x34,0x32,0x30,0x00,0x56,0x32,0x34,0x32, 0x31,0x00,0x56,0x32,0x34,0x32,0x32,0x00,0x56,0x32,0x34,0x32,0x33,0x00,0x56,0x32, 0x34,0x32,0x34,0x00,0x56,0x32,0x34,0x32,0x35,0x00,0x56,0x32,0x34,0x32,0x36,0x00, 0x56,0x32,0x34,0x32,0x37,0x00,0x56,0x32,0x34,0x32,0x38,0x00,0x56,0x32,0x34,0x32, 0x39,0x00,0x56,0x32,0x34,0x33,0x30,0x00,0x56,0x32,0x34,0x33,0x31,0x00,0x56,0x32, 0x34,0x33,0x32,0x00,0x56,0x32,0x34,0x33,0x33,0x00,0x56,0x32,0x34,0x33,0x34,0x00, 0x56,0x32,0x34,0x33,0x35,0x00,0x56,0x32,0x34,0x33,0x36,0x00,0x56,0x32,0x34,0x33, 0x37,0x00,0x56,0x32,0x34,0x33,0x38,0x00,0x56,0x32,0x34,0x33,0x39,0x00,0x56,0x32, 0x34,0x34,0x30,0x00,0x56,0x32,0x34,0x34,0x31,0x00,0x56,0x32,0x34,0x34,0x32,0x00, 0x56,0x32,0x34,0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x34,0x00,0x56,0x32,0x34,0x34, 0x35,0x00,0x56,0x32,0x34,0x34,0x36,0x00,0x56,0x32,0x34,0x34,0x37,0x00,0x56,0x32, 0x34,0x34,0x38,0x00,0x56,0x32,0x34,0x34,0x39,0x00,0x56,0x32,0x34,0x35,0x30,0x00, 0x56,0x32,0x34,0x35,0x31,0x00,0x56,0x32,0x34,0x35,0x32,0x00,0x56,0x32,0x34,0x35, 0x33,0x00,0x56,0x32,0x34,0x35,0x34,0x00,0x56,0x32,0x34,0x35,0x35,0x00,0x56,0x32, 0x34,0x35,0x36,0x00,0x56,0x32,0x34,0x35,0x37,0x00,0x56,0x32,0x34,0x35,0x38,0x00, 0x56,0x32,0x34,0x35,0x39,0x00,0x56,0x32,0x34,0x36,0x30,0x00,0x56,0x32,0x34,0x36, 0x31,0x00,0x56,0x32,0x34,0x36,0x32,0x00,0x56,0x32,0x34,0x36,0x33,0x00,0x56,0x32, 0x34,0x36,0x34,0x00,0x56,0x32,0x34,0x36,0x35,0x00,0x56,0x32,0x34,0x36,0x36,0x00, 0x56,0x32,0x34,0x36,0x37,0x00,0x56,0x32,0x34,0x36,0x38,0x00,0x56,0x32,0x34,0x36, 0x39,0x00,0x56,0x32,0x34,0x37,0x30,0x00,0x56,0x32,0x34,0x37,0x31,0x00,0x56,0x32, 0x34,0x37,0x32,0x00,0x56,0x32,0x34,0x37,0x33,0x00,0x56,0x32,0x34,0x37,0x34,0x00, 0x56,0x32,0x34,0x37,0x35,0x00,0x56,0x32,0x34,0x37,0x36,0x00,0x56,0x32,0x34,0x37, 0x37,0x00,0x56,0x32,0x34,0x37,0x38,0x00,0x56,0x32,0x34,0x37,0x39,0x00,0x56,0x32, 0x34,0x38,0x30,0x00,0x56,0x32,0x34,0x38,0x31,0x00,0x56,0x32,0x34,0x38,0x32,0x00, 0x56,0x32,0x34,0x38,0x33,0x00,0x56,0x32,0x34,0x38,0x34,0x00,0x56,0x32,0x34,0x38, 0x35,0x00,0x56,0x32,0x34,0x38,0x36,0x00,0x56,0x32,0x34,0x38,0x37,0x00,0x56,0x32, 0x34,0x38,0x38,0x00,0x56,0x32,0x34,0x38,0x39,0x00,0x56,0x32,0x34,0x39,0x30,0x00, 0x56,0x32,0x34,0x39,0x31,0x00,0x56,0x32,0x34,0x39,0x32,0x00,0x56,0x32,0x34,0x39, 0x33,0x00,0x56,0x32,0x34,0x39,0x34,0x00,0x56,0x32,0x34,0x39,0x35,0x00,0x56,0x32, 0x34,0x39,0x36,0x00,0x56,0x32,0x34,0x39,0x37,0x00,0x56,0x32,0x34,0x39,0x38,0x00, 0x56,0x32,0x34,0x39,0x39,0x00,0x56,0x32,0x35,0x30,0x30,0x00,0x56,0x32,0x35,0x30, 0x31,0x00,0x56,0x32,0x35,0x30,0x32,0x00,0x56,0x32,0x35,0x30,0x33,0x00,0x56,0x32, 0x35,0x30,0x34,0x00,0x56,0x32,0x35,0x30,0x35,0x00,0x56,0x32,0x35,0x30,0x36,0x00, 0x56,0x32,0x35,0x30,0x37,0x00,0x56,0x32,0x35,0x30,0x38,0x00,0x56,0x32,0x35,0x30, 0x39,0x00,0x56,0x32,0x35,0x31,0x30,0x00,0x56,0x32,0x35,0x31,0x31,0x00,0x56,0x32, 0x35,0x31,0x32,0x00,0x56,0x32,0x35,0x31,0x33,0x00,0x56,0x32,0x35,0x31,0x34,0x00, 0x56,0x32,0x35,0x31,0x35,0x00,0x56,0x32,0x35,0x31,0x36,0x00,0x56,0x32,0x35,0x31, 0x37,0x00,0x56,0x32,0x35,0x31,0x38,0x00,0x56,0x32,0x35,0x31,0x39,0x00,0x56,0x32, 0x35,0x32,0x30,0x00,0x56,0x32,0x35,0x32,0x31,0x00,0x56,0x32,0x35,0x32,0x32,0x00, 0x56,0x32,0x35,0x32,0x33,0x00,0x56,0x32,0x35,0x32,0x34,0x00,0x56,0x32,0x35,0x32, 0x35,0x00,0x56,0x32,0x35,0x32,0x36,0x00,0x56,0x32,0x35,0x32,0x37,0x00,0x56,0x32, 0x35,0x32,0x38,0x00,0x56,0x32,0x35,0x32,0x39,0x00,0x56,0x32,0x35,0x33,0x30,0x00, 0x56,0x32,0x35,0x33,0x31,0x00,0x56,0x32,0x35,0x33,0x32,0x00,0x56,0x32,0x35,0x33, 0x33,0x00,0x56,0x32,0x35,0x33,0x34,0x00,0x56,0x32,0x35,0x33,0x35,0x00,0x56,0x32, 0x35,0x33,0x36,0x00,0x56,0x32,0x35,0x33,0x37,0x00,0x56,0x32,0x35,0x33,0x38,0x00, 0x56,0x32,0x35,0x33,0x39,0x00,0x56,0x32,0x35,0x34,0x30,0x00,0x56,0x32,0x35,0x34, 0x31,0x00,0x56,0x32,0x35,0x34,0x32,0x00,0x56,0x32,0x35,0x34,0x33,0x00,0x56,0x32, 0x35,0x34,0x34,0x00,0x56,0x32,0x35,0x34,0x35,0x00,0x56,0x32,0x35,0x34,0x36,0x00, 0x56,0x32,0x35,0x34,0x37,0x00,0x56,0x32,0x35,0x34,0x38,0x00,0x56,0x32,0x35,0x34, 0x39,0x00,0x56,0x32,0x35,0x35,0x30,0x00,0x56,0x32,0x35,0x35,0x31,0x00,0x56,0x32, 0x35,0x35,0x32,0x00,0x56,0x32,0x35,0x35,0x33,0x00,0x56,0x32,0x35,0x35,0x34,0x00, 0x56,0x32,0x35,0x35,0x35,0x00,0x56,0x32,0x35,0x35,0x36,0x00,0x56,0x32,0x35,0x35, 0x37,0x00,0x56,0x32,0x35,0x35,0x38,0x00,0x56,0x32,0x35,0x35,0x39,0x00,0x56,0x32, 0x35,0x36,0x30,0x00,0x56,0x32,0x35,0x36,0x31,0x00,0x56,0x32,0x35,0x36,0x32,0x00, 0x56,0x32,0x35,0x36,0x33,0x00,0x56,0x32,0x35,0x36,0x34,0x00,0x56,0x32,0x35,0x36, 0x35,0x00,0x56,0x32,0x35,0x36,0x36,0x00,0x56,0x32,0x35,0x36,0x37,0x00,0x56,0x32, 0x35,0x36,0x38,0x00,0x56,0x32,0x35,0x36,0x39,0x00,0x56,0x32,0x35,0x37,0x30,0x00, 0x56,0x32,0x35,0x37,0x31,0x00,0x56,0x32,0x35,0x37,0x32,0x00,0x56,0x32,0x35,0x37, 0x33,0x00,0x56,0x32,0x35,0x37,0x34,0x00,0x56,0x32,0x35,0x37,0x35,0x00,0x56,0x32, 0x35,0x37,0x36,0x00,0x56,0x32,0x35,0x37,0x37,0x00,0x56,0x32,0x35,0x37,0x38,0x00, 0x56,0x32,0x35,0x37,0x39,0x00,0x56,0x32,0x35,0x38,0x30,0x00,0x56,0x32,0x35,0x38, 0x31,0x00,0x56,0x32,0x35,0x38,0x32,0x00,0x56,0x32,0x35,0x38,0x33,0x00,0x56,0x32, 0x35,0x38,0x34,0x00,0x56,0x32,0x35,0x38,0x35,0x00,0x56,0x32,0x35,0x38,0x36,0x00, 0x56,0x32,0x35,0x38,0x37,0x00,0x56,0x32,0x35,0x38,0x38,0x00,0x56,0x32,0x35,0x38, 0x39,0x00,0x56,0x32,0x35,0x39,0x30,0x00,0x56,0x32,0x35,0x39,0x31,0x00,0x56,0x32, 0x35,0x39,0x32,0x00,0x56,0x32,0x35,0x39,0x33,0x00,0x56,0x32,0x35,0x39,0x34,0x00, 0x56,0x32,0x35,0x39,0x35,0x00,0x56,0x32,0x35,0x39,0x36,0x00,0x56,0x32,0x35,0x39, 0x37,0x00,0x56,0x32,0x35,0x39,0x38,0x00,0x56,0x32,0x35,0x39,0x39,0x00,0x56,0x32, 0x36,0x30,0x30,0x00,0x56,0x32,0x36,0x30,0x31,0x00,0x56,0x32,0x36,0x30,0x32,0x00, 0x56,0x32,0x36,0x30,0x33,0x00,0x56,0x32,0x36,0x30,0x34,0x00,0x56,0x32,0x36,0x30, 0x35,0x00,0x56,0x32,0x36,0x30,0x36,0x00,0x56,0x32,0x36,0x30,0x37,0x00,0x56,0x32, 0x36,0x30,0x38,0x00,0x56,0x32,0x36,0x30,0x39,0x00,0x56,0x32,0x36,0x31,0x30,0x00, 0x56,0x32,0x36,0x31,0x31,0x00,0x56,0x32,0x36,0x31,0x32,0x00,0x56,0x32,0x36,0x31, 0x33,0x00,0x56,0x32,0x36,0x31,0x34,0x00,0x56,0x32,0x36,0x31,0x35,0x00,0x56,0x32, 0x36,0x31,0x36,0x00,0x56,0x32,0x36,0x31,0x37,0x00,0x56,0x32,0x36,0x31,0x38,0x00, 0x56,0x32,0x36,0x31,0x39,0x00,0x56,0x32,0x36,0x32,0x30,0x00,0x56,0x32,0x36,0x32, 0x31,0x00,0x56,0x32,0x36,0x32,0x32,0x00,0x56,0x32,0x36,0x32,0x33,0x00,0x56,0x32, 0x36,0x32,0x34,0x00,0x56,0x32,0x36,0x32,0x35,0x00,0x56,0x32,0x36,0x32,0x36,0x00, 0x56,0x32,0x36,0x32,0x37,0x00,0x56,0x32,0x36,0x32,0x38,0x00,0x56,0x32,0x36,0x32, 0x39,0x00,0x56,0x32,0x36,0x33,0x30,0x00,0x56,0x32,0x36,0x33,0x31,0x00,0x56,0x32, 0x36,0x33,0x32,0x00,0x56,0x32,0x36,0x33,0x33,0x00,0x56,0x32,0x36,0x33,0x34,0x00, 0x56,0x32,0x36,0x33,0x35,0x00,0x56,0x32,0x36,0x33,0x36,0x00,0x56,0x32,0x36,0x33, 0x37,0x00,0x56,0x32,0x36,0x33,0x38,0x00,0x56,0x32,0x36,0x33,0x39,0x00,0x56,0x32, 0x36,0x34,0x30,0x00,0x56,0x32,0x36,0x34,0x31,0x00,0x56,0x32,0x36,0x34,0x32,0x00, 0x56,0x32,0x36,0x34,0x33,0x00,0x56,0x32,0x36,0x34,0x34,0x00,0x56,0x32,0x36,0x34, 0x35,0x00,0x56,0x32,0x36,0x34,0x36,0x00,0x56,0x32,0x36,0x34,0x37,0x00,0x56,0x32, 0x36,0x34,0x38,0x00,0x56,0x32,0x36,0x34,0x39,0x00,0x56,0x32,0x36,0x35,0x30,0x00, 0x56,0x32,0x36,0x35,0x31,0x00,0x56,0x32,0x36,0x35,0x32,0x00,0x56,0x32,0x36,0x35, 0x33,0x00,0x56,0x32,0x36,0x35,0x34,0x00,0x56,0x32,0x36,0x35,0x35,0x00,0x56,0x32, 0x36,0x35,0x36,0x00,0x56,0x32,0x36,0x35,0x37,0x00,0x56,0x32,0x36,0x35,0x38,0x00, 0x56,0x32,0x36,0x35,0x39,0x00,0x56,0x32,0x36,0x36,0x30,0x00,0x56,0x32,0x36,0x36, 0x31,0x00,0x56,0x32,0x36,0x36,0x32,0x00,0x56,0x32,0x36,0x36,0x33,0x00,0x56,0x32, 0x36,0x36,0x34,0x00,0x56,0x32,0x36,0x36,0x35,0x00,0x56,0x32,0x36,0x36,0x36,0x00, 0x56,0x32,0x36,0x36,0x37,0x00,0x56,0x32,0x36,0x36,0x38,0x00,0x56,0x32,0x36,0x36, 0x39,0x00,0x56,0x32,0x36,0x37,0x30,0x00,0x56,0x32,0x36,0x37,0x31,0x00,0x56,0x32, 0x36,0x37,0x32,0x00,0x56,0x32,0x36,0x37,0x33,0x00,0x56,0x32,0x36,0x37,0x34,0x00, 0x56,0x32,0x36,0x37,0x35,0x00,0x56,0x32,0x36,0x37,0x36,0x00,0x56,0x32,0x36,0x37, 0x37,0x00,0x56,0x32,0x36,0x37,0x38,0x00,0x56,0x32,0x36,0x37,0x39,0x00,0x56,0x32, 0x36,0x38,0x30,0x00,0x56,0x32,0x36,0x38,0x31,0x00,0x56,0x32,0x36,0x38,0x32,0x00, 0x56,0x32,0x36,0x38,0x33,0x00,0x56,0x32,0x36,0x38,0x34,0x00,0x56,0x32,0x36,0x38, 0x35,0x00,0x56,0x32,0x36,0x38,0x36,0x00,0x56,0x32,0x36,0x38,0x37,0x00,0x56,0x32, 0x36,0x38,0x38,0x00,0x56,0x32,0x36,0x38,0x39,0x00,0x56,0x32,0x36,0x39,0x30,0x00, 0x56,0x32,0x36,0x39,0x31,0x00,0x56,0x32,0x36,0x39,0x32,0x00,0x56,0x32,0x36,0x39, 0x33,0x00,0x56,0x32,0x36,0x39,0x34,0x00,0x56,0x32,0x36,0x39,0x35,0x00,0x56,0x32, 0x36,0x39,0x36,0x00,0x56,0x32,0x36,0x39,0x37,0x00,0x56,0x32,0x36,0x39,0x38,0x00, 0x56,0x32,0x36,0x39,0x39,0x00,0x56,0x32,0x37,0x30,0x30,0x00,0x56,0x32,0x37,0x30, 0x31,0x00,0x56,0x32,0x37,0x30,0x32,0x00,0x56,0x32,0x37,0x30,0x33,0x00,0x56,0x32, 0x37,0x30,0x34,0x00,0x56,0x32,0x37,0x30,0x35,0x00,0x56,0x32,0x37,0x30,0x36,0x00, 0x56,0x32,0x37,0x30,0x37,0x00,0x56,0x32,0x37,0x30,0x38,0x00,0x56,0x32,0x37,0x30, 0x39,0x00,0x56,0x32,0x37,0x31,0x30,0x00,0x56,0x32,0x37,0x31,0x31,0x00,0x56,0x32, 0x37,0x31,0x32,0x00,0x56,0x32,0x37,0x31,0x33,0x00,0x56,0x32,0x37,0x31,0x34,0x00, 0x56,0x32,0x37,0x31,0x35,0x00,0x56,0x32,0x37,0x31,0x36,0x00,0x56,0x32,0x37,0x31, 0x37,0x00,0x56,0x32,0x37,0x31,0x38,0x00,0x56,0x32,0x37,0x31,0x39,0x00,0x56,0x32, 0x37,0x32,0x30,0x00,0x56,0x32,0x37,0x32,0x31,0x00,0x56,0x32,0x37,0x32,0x32,0x00, 0x56,0x32,0x37,0x32,0x33,0x00,0x56,0x32,0x37,0x32,0x34,0x00,0x56,0x32,0x37,0x32, 0x35,0x00,0x56,0x32,0x37,0x32,0x36,0x00,0x56,0x32,0x37,0x32,0x37,0x00,0x56,0x32, 0x37,0x32,0x38,0x00,0x56,0x32,0x37,0x32,0x39,0x00,0x56,0x32,0x37,0x33,0x30,0x00, 0x56,0x32,0x37,0x33,0x31,0x00,0x56,0x32,0x37,0x33,0x32,0x00,0x56,0x32,0x37,0x33, 0x33,0x00,0x56,0x32,0x37,0x33,0x34,0x00,0x56,0x32,0x37,0x33,0x35,0x00,0x56,0x32, 0x37,0x33,0x36,0x00,0x56,0x32,0x37,0x33,0x37,0x00,0x56,0x32,0x37,0x33,0x38,0x00, 0x56,0x32,0x37,0x33,0x39,0x00,0x56,0x32,0x37,0x34,0x30,0x00,0x56,0x32,0x37,0x34, 0x31,0x00,0x56,0x32,0x37,0x34,0x32,0x00,0x56,0x32,0x37,0x34,0x33,0x00,0x56,0x32, 0x37,0x34,0x34,0x00,0x56,0x32,0x37,0x34,0x35,0x00,0x56,0x32,0x37,0x34,0x36,0x00, 0x56,0x32,0x37,0x34,0x37,0x00,0x56,0x32,0x37,0x34,0x38,0x00,0x56,0x32,0x37,0x34, 0x39,0x00,0x56,0x32,0x37,0x35,0x30,0x00,0x56,0x32,0x37,0x35,0x31,0x00,0x56,0x32, 0x37,0x35,0x32,0x00,0x56,0x32,0x37,0x35,0x33,0x00,0x56,0x32,0x37,0x35,0x34,0x00, 0x56,0x32,0x37,0x35,0x35,0x00,0x56,0x32,0x37,0x35,0x36,0x00,0x56,0x32,0x37,0x35, 0x37,0x00,0x56,0x32,0x37,0x35,0x38,0x00,0x56,0x32,0x37,0x35,0x39,0x00,0x56,0x32, 0x37,0x36,0x30,0x00,0x56,0x32,0x37,0x36,0x31,0x00,0x56,0x32,0x37,0x36,0x32,0x00, 0x56,0x32,0x37,0x36,0x33,0x00,0x56,0x32,0x37,0x36,0x34,0x00,0x56,0x32,0x37,0x36, 0x35,0x00,0x56,0x32,0x37,0x36,0x36,0x00,0x56,0x32,0x37,0x36,0x37,0x00,0x56,0x32, 0x37,0x36,0x38,0x00,0x56,0x32,0x37,0x36,0x39,0x00,0x56,0x32,0x37,0x37,0x30,0x00, 0x56,0x32,0x37,0x37,0x31,0x00,0x56,0x32,0x37,0x37,0x32,0x00,0x56,0x32,0x37,0x37, 0x33,0x00,0x56,0x32,0x37,0x37,0x34,0x00,0x56,0x32,0x37,0x37,0x35,0x00,0x56,0x32, 0x37,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x37,0x00,0x56,0x32,0x37,0x37,0x38,0x00, 0x56,0x32,0x37,0x37,0x39,0x00,0x56,0x32,0x37,0x38,0x30,0x00,0x56,0x32,0x37,0x38, 0x31,0x00,0x56,0x32,0x37,0x38,0x32,0x00,0x56,0x32,0x37,0x38,0x33,0x00,0x56,0x32, 0x37,0x38,0x34,0x00,0x56,0x32,0x37,0x38,0x35,0x00,0x56,0x32,0x37,0x38,0x36,0x00, 0x56,0x32,0x37,0x38,0x37,0x00,0x56,0x32,0x37,0x38,0x38,0x00,0x56,0x32,0x37,0x38, 0x39,0x00,0x56,0x32,0x37,0x39,0x30,0x00,0x56,0x32,0x37,0x39,0x31,0x00,0x56,0x32, 0x37,0x39,0x32,0x00,0x56,0x32,0x37,0x39,0x33,0x00,0x56,0x32,0x37,0x39,0x34,0x00, 0x56,0x32,0x37,0x39,0x35,0x00,0x56,0x32,0x37,0x39,0x36,0x00,0x56,0x32,0x37,0x39, 0x37,0x00,0x56,0x32,0x37,0x39,0x38,0x00,0x56,0x32,0x37,0x39,0x39,0x00,0x56,0x32, 0x38,0x30,0x30,0x00,0x56,0x32,0x38,0x30,0x31,0x00,0x56,0x32,0x38,0x30,0x32,0x00, 0x56,0x32,0x38,0x30,0x33,0x00,0x56,0x32,0x38,0x30,0x34,0x00,0x56,0x32,0x38,0x30, 0x35,0x00,0x56,0x32,0x38,0x30,0x36,0x00,0x56,0x32,0x38,0x30,0x37,0x00,0x56,0x32, 0x38,0x30,0x38,0x00,0x56,0x32,0x38,0x30,0x39,0x00,0x56,0x32,0x38,0x31,0x30,0x00, 0x56,0x32,0x38,0x31,0x31,0x00,0x56,0x32,0x38,0x31,0x32,0x00,0x56,0x32,0x38,0x31, 0x33,0x00,0x56,0x32,0x38,0x31,0x34,0x00,0x56,0x32,0x38,0x31,0x35,0x00,0x56,0x32, 0x38,0x31,0x36,0x00,0x56,0x32,0x38,0x31,0x37,0x00,0x56,0x32,0x38,0x31,0x38,0x00, 0x56,0x32,0x38,0x31,0x39,0x00,0x56,0x32,0x38,0x32,0x30,0x00,0x56,0x32,0x38,0x32, 0x31,0x00,0x56,0x32,0x38,0x32,0x32,0x00,0x56,0x32,0x38,0x32,0x33,0x00,0x56,0x32, 0x38,0x32,0x34,0x00,0x56,0x32,0x38,0x32,0x35,0x00,0x56,0x32,0x38,0x32,0x36,0x00, 0x56,0x32,0x38,0x32,0x37,0x00,0x56,0x32,0x38,0x32,0x38,0x00,0x56,0x32,0x38,0x32, 0x39,0x00,0x56,0x32,0x38,0x33,0x30,0x00,0x56,0x32,0x38,0x33,0x31,0x00,0x56,0x32, 0x38,0x33,0x32,0x00,0x56,0x32,0x38,0x33,0x33,0x00,0x56,0x32,0x38,0x33,0x34,0x00, 0x56,0x32,0x38,0x33,0x35,0x00,0x56,0x32,0x38,0x33,0x36,0x00,0x56,0x32,0x38,0x33, 0x37,0x00,0x56,0x32,0x38,0x33,0x38,0x00,0x56,0x32,0x38,0x33,0x39,0x00,0x56,0x32, 0x38,0x34,0x30,0x00,0x56,0x32,0x38,0x34,0x31,0x00,0x56,0x32,0x38,0x34,0x32,0x00, 0x56,0x32,0x38,0x34,0x33,0x00,0x56,0x32,0x38,0x34,0x34,0x00,0x56,0x32,0x38,0x34, 0x35,0x00,0x56,0x32,0x38,0x34,0x36,0x00,0x56,0x32,0x38,0x34,0x37,0x00,0x56,0x32, 0x38,0x34,0x38,0x00,0x56,0x32,0x38,0x34,0x39,0x00,0x56,0x32,0x38,0x35,0x30,0x00, 0x56,0x32,0x38,0x35,0x31,0x00,0x56,0x32,0x38,0x35,0x32,0x00,0x56,0x32,0x38,0x35, 0x33,0x00,0x56,0x32,0x38,0x35,0x34,0x00,0x56,0x32,0x38,0x35,0x35,0x00,0x56,0x32, 0x38,0x35,0x36,0x00,0x56,0x32,0x38,0x35,0x37,0x00,0x56,0x32,0x38,0x35,0x38,0x00, 0x56,0x32,0x38,0x35,0x39,0x00,0x56,0x32,0x38,0x36,0x30,0x00,0x56,0x32,0x38,0x36, 0x31,0x00,0x56,0x32,0x38,0x36,0x32,0x00,0x56,0x32,0x38,0x36,0x33,0x00,0x56,0x32, 0x38,0x36,0x34,0x00,0x56,0x32,0x38,0x36,0x35,0x00,0x56,0x32,0x38,0x36,0x36,0x00, 0x56,0x32,0x38,0x36,0x37,0x00,0x56,0x32,0x38,0x36,0x38,0x00,0x56,0x32,0x38,0x36, 0x39,0x00,0x56,0x32,0x38,0x37,0x30,0x00,0x56,0x32,0x38,0x37,0x31,0x00,0x56,0x32, 0x38,0x37,0x32,0x00,0x56,0x32,0x38,0x37,0x33,0x00,0x56,0x32,0x38,0x37,0x34,0x00, 0x56,0x32,0x38,0x37,0x35,0x00,0x56,0x32,0x38,0x37,0x36,0x00,0x56,0x32,0x38,0x37, 0x37,0x00,0x56,0x32,0x38,0x37,0x38,0x00,0x56,0x32,0x38,0x37,0x39,0x00,0x56,0x32, 0x38,0x38,0x30,0x00,0x56,0x32,0x38,0x38,0x31,0x00,0x56,0x32,0x38,0x38,0x32,0x00, 0x56,0x32,0x38,0x38,0x33,0x00,0x56,0x32,0x38,0x38,0x34,0x00,0x56,0x32,0x38,0x38, 0x35,0x00,0x56,0x32,0x38,0x38,0x36,0x00,0x56,0x32,0x38,0x38,0x37,0x00,0x56,0x32, 0x38,0x38,0x38,0x00,0x56,0x32,0x38,0x38,0x39,0x00,0x56,0x32,0x38,0x39,0x30,0x00, 0x56,0x32,0x38,0x39,0x31,0x00,0x56,0x32,0x38,0x39,0x32,0x00,0x56,0x32,0x38,0x39, 0x33,0x00,0x56,0x32,0x38,0x39,0x34,0x00,0x56,0x32,0x38,0x39,0x35,0x00,0x56,0x32, 0x38,0x39,0x36,0x00,0x56,0x32,0x38,0x39,0x37,0x00,0x56,0x32,0x38,0x39,0x38,0x00, 0x56,0x32,0x38,0x39,0x39,0x00,0x56,0x32,0x39,0x30,0x30,0x00,0x56,0x32,0x39,0x30, 0x31,0x00,0x56,0x32,0x39,0x30,0x32,0x00,0x56,0x32,0x39,0x30,0x33,0x00,0x56,0x32, 0x39,0x30,0x34,0x00,0x56,0x32,0x39,0x30,0x35,0x00,0x56,0x32,0x39,0x30,0x36,0x00, 0x56,0x32,0x39,0x30,0x37,0x00,0x56,0x32,0x39,0x30,0x38,0x00,0x56,0x32,0x39,0x30, 0x39,0x00,0x56,0x32,0x39,0x31,0x30,0x00,0x56,0x32,0x39,0x31,0x31,0x00,0x56,0x32, 0x39,0x31,0x32,0x00,0x56,0x32,0x39,0x31,0x33,0x00,0x56,0x32,0x39,0x31,0x34,0x00, 0x56,0x32,0x39,0x31,0x35,0x00,0x56,0x32,0x39,0x31,0x36,0x00,0x56,0x32,0x39,0x31, 0x37,0x00,0x56,0x32,0x39,0x31,0x38,0x00,0x56,0x32,0x39,0x31,0x39,0x00,0x56,0x32, 0x39,0x32,0x30,0x00,0x56,0x32,0x39,0x32,0x31,0x00,0x56,0x32,0x39,0x32,0x32,0x00, 0x56,0x32,0x39,0x32,0x33,0x00,0x56,0x32,0x39,0x32,0x34,0x00,0x56,0x32,0x39,0x32, 0x35,0x00,0x56,0x32,0x39,0x32,0x36,0x00,0x56,0x32,0x39,0x32,0x37,0x00,0x56,0x32, 0x39,0x32,0x38,0x00,0x56,0x32,0x39,0x32,0x39,0x00,0x56,0x32,0x39,0x33,0x30,0x00, 0x56,0x32,0x39,0x33,0x31,0x00,0x56,0x32,0x39,0x33,0x32,0x00,0x56,0x32,0x39,0x33, 0x33,0x00,0x56,0x32,0x39,0x33,0x34,0x00,0x56,0x32,0x39,0x33,0x35,0x00,0x56,0x32, 0x39,0x33,0x36,0x00,0x56,0x32,0x39,0x33,0x37,0x00,0x56,0x32,0x39,0x33,0x38,0x00, 0x56,0x32,0x39,0x33,0x39,0x00,0x56,0x32,0x39,0x34,0x30,0x00,0x56,0x32,0x39,0x34, 0x31,0x00,0x56,0x32,0x39,0x34,0x32,0x00,0x56,0x32,0x39,0x34,0x33,0x00,0x56,0x32, 0x39,0x34,0x34,0x00,0x56,0x32,0x39,0x34,0x35,0x00,0x56,0x32,0x39,0x34,0x36,0x00, 0x56,0x32,0x39,0x34,0x37,0x00,0x56,0x32,0x39,0x34,0x38,0x00,0x56,0x32,0x39,0x34, 0x39,0x00,0x56,0x32,0x39,0x35,0x30,0x00,0x56,0x32,0x39,0x35,0x31,0x00,0x56,0x32, 0x39,0x35,0x32,0x00,0x56,0x32,0x39,0x35,0x33,0x00,0x56,0x32,0x39,0x35,0x34,0x00, 0x56,0x32,0x39,0x35,0x35,0x00,0x56,0x32,0x39,0x35,0x36,0x00,0x56,0x32,0x39,0x35, 0x37,0x00,0x56,0x32,0x39,0x35,0x38,0x00,0x56,0x32,0x39,0x35,0x39,0x00,0x56,0x32, 0x39,0x36,0x30,0x00,0x56,0x32,0x39,0x36,0x31,0x00,0x56,0x32,0x39,0x36,0x32,0x00, 0x56,0x32,0x39,0x36,0x33,0x00,0x56,0x32,0x39,0x36,0x34,0x00,0x56,0x32,0x39,0x36, 0x35,0x00,0x56,0x32,0x39,0x36,0x36,0x00,0x56,0x32,0x39,0x36,0x37,0x00,0x56,0x32, 0x39,0x36,0x38,0x00,0x56,0x32,0x39,0x36,0x39,0x00,0x56,0x32,0x39,0x37,0x30,0x00, 0x56,0x32,0x39,0x37,0x31,0x00,0x56,0x32,0x39,0x37,0x32,0x00,0x56,0x32,0x39,0x37, 0x33,0x00,0x56,0x32,0x39,0x37,0x34,0x00,0x56,0x32,0x39,0x37,0x35,0x00,0x56,0x32, 0x39,0x37,0x36,0x00,0x56,0x32,0x39,0x37,0x37,0x00,0x56,0x32,0x39,0x37,0x38,0x00, 0x56,0x32,0x39,0x37,0x39,0x00,0x56,0x32,0x39,0x38,0x30,0x00,0x56,0x32,0x39,0x38, 0x31,0x00,0x56,0x32,0x39,0x38,0x32,0x00,0x56,0x32,0x39,0x38,0x33,0x00,0x56,0x32, 0x39,0x38,0x34,0x00,0x56,0x32,0x39,0x38,0x35,0x00,0x56,0x32,0x39,0x38,0x36,0x00, 0x56,0x32,0x39,0x38,0x37,0x00,0x56,0x32,0x39,0x38,0x38,0x00,0x56,0x32,0x39,0x38, 0x39,0x00,0x56,0x32,0x39,0x39,0x30,0x00,0x56,0x32,0x39,0x39,0x31,0x00,0x56,0x32, 0x39,0x39,0x32,0x00,0x56,0x32,0x39,0x39,0x33,0x00,0x56,0x32,0x39,0x39,0x34,0x00, 0x56,0x32,0x39,0x39,0x35,0x00,0x56,0x32,0x39,0x39,0x36,0x00,0x56,0x32,0x39,0x39, 0x37,0x00,0x56,0x32,0x39,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x39,0x00,0x56,0x33, 0x30,0x30,0x30,0x00,0x56,0x33,0x30,0x30,0x31,0x00,0x56,0x33,0x30,0x30,0x32,0x00, 0x56,0x33,0x30,0x30,0x33,0x00,0x56,0x33,0x30,0x30,0x34,0x00,0x56,0x33,0x30,0x30, 0x35,0x00,0x56,0x33,0x30,0x30,0x36,0x00,0x56,0x33,0x30,0x30,0x37,0x00,0x56,0x33, 0x30,0x30,0x38,0x00,0x56,0x33,0x30,0x30,0x39,0x00,0x56,0x33,0x30,0x31,0x30,0x00, 0x56,0x33,0x30,0x31,0x31,0x00,0x56,0x33,0x30,0x31,0x32,0x00,0x56,0x33,0x30,0x31, 0x33,0x00,0x56,0x33,0x30,0x31,0x34,0x00,0x56,0x33,0x30,0x31,0x35,0x00,0x56,0x33, 0x30,0x31,0x36,0x00,0x56,0x33,0x30,0x31,0x37,0x00,0x56,0x33,0x30,0x31,0x38,0x00, 0x56,0x33,0x30,0x31,0x39,0x00,0x56,0x33,0x30,0x32,0x30,0x00,0x56,0x33,0x30,0x32, 0x31,0x00,0x56,0x33,0x30,0x32,0x32,0x00,0x56,0x33,0x30,0x32,0x33,0x00,0x56,0x33, 0x30,0x32,0x34,0x00,0x56,0x33,0x30,0x32,0x35,0x00,0x56,0x33,0x30,0x32,0x36,0x00, 0x56,0x33,0x30,0x32,0x37,0x00,0x56,0x33,0x30,0x32,0x38,0x00,0x56,0x33,0x30,0x32, 0x39,0x00,0x56,0x33,0x30,0x33,0x30,0x00,0x56,0x33,0x30,0x33,0x31,0x00,0x56,0x33, 0x30,0x33,0x32,0x00,0x56,0x33,0x30,0x33,0x33,0x00,0x56,0x33,0x30,0x33,0x34,0x00, 0x56,0x33,0x30,0x33,0x35,0x00,0x56,0x33,0x30,0x33,0x36,0x00,0x56,0x33,0x30,0x33, 0x37,0x00,0x56,0x33,0x30,0x33,0x38,0x00,0x56,0x33,0x30,0x33,0x39,0x00,0x56,0x33, 0x30,0x34,0x30,0x00,0x56,0x33,0x30,0x34,0x31,0x00,0x56,0x33,0x30,0x34,0x32,0x00, 0x56,0x33,0x30,0x34,0x33,0x00,0x56,0x33,0x30,0x34,0x34,0x00,0x56,0x33,0x30,0x34, 0x35,0x00,0x56,0x33,0x30,0x34,0x36,0x00,0x56,0x33,0x30,0x34,0x37,0x00,0x56,0x33, 0x30,0x34,0x38,0x00,0x56,0x33,0x30,0x34,0x39,0x00,0x56,0x33,0x30,0x35,0x30,0x00, 0x56,0x33,0x30,0x35,0x31,0x00,0x56,0x33,0x30,0x35,0x32,0x00,0x56,0x33,0x30,0x35, 0x33,0x00,0x56,0x33,0x30,0x35,0x34,0x00,0x56,0x33,0x30,0x35,0x35,0x00,0x56,0x33, 0x30,0x35,0x36,0x00,0x56,0x33,0x30,0x35,0x37,0x00,0x56,0x33,0x30,0x35,0x38,0x00, 0x56,0x33,0x30,0x35,0x39,0x00,0x56,0x33,0x30,0x36,0x30,0x00,0x56,0x33,0x30,0x36, 0x31,0x00,0x56,0x33,0x30,0x36,0x32,0x00,0x56,0x33,0x30,0x36,0x33,0x00,0x56,0x33, 0x30,0x36,0x34,0x00,0x56,0x33,0x30,0x36,0x35,0x00,0x56,0x33,0x30,0x36,0x36,0x00, 0x56,0x33,0x30,0x36,0x37,0x00,0x56,0x33,0x30,0x36,0x38,0x00,0x56,0x33,0x30,0x36, 0x39,0x00,0x56,0x33,0x30,0x37,0x30,0x00,0x56,0x33,0x30,0x37,0x31,0x00,0x56,0x33, 0x30,0x37,0x32,0x00,0x56,0x33,0x30,0x37,0x33,0x00,0x56,0x33,0x30,0x37,0x34,0x00, 0x56,0x33,0x30,0x37,0x35,0x00,0x56,0x33,0x30,0x37,0x36,0x00,0x56,0x33,0x30,0x37, 0x37,0x00,0x56,0x33,0x30,0x37,0x38,0x00,0x56,0x33,0x30,0x37,0x39,0x00,0x56,0x33, 0x30,0x38,0x30,0x00,0x56,0x33,0x30,0x38,0x31,0x00,0x56,0x33,0x30,0x38,0x32,0x00, 0x56,0x33,0x30,0x38,0x33,0x00,0x56,0x33,0x30,0x38,0x34,0x00,0x56,0x33,0x30,0x38, 0x35,0x00,0x56,0x33,0x30,0x38,0x36,0x00,0x56,0x33,0x30,0x38,0x37,0x00,0x56,0x33, 0x30,0x38,0x38,0x00,0x56,0x33,0x30,0x38,0x39,0x00,0x56,0x33,0x30,0x39,0x30,0x00, 0x56,0x33,0x30,0x39,0x31,0x00,0x56,0x33,0x30,0x39,0x32,0x00,0x56,0x33,0x30,0x39, 0x33,0x00,0x56,0x33,0x30,0x39,0x34,0x00,0x56,0x33,0x30,0x39,0x35,0x00,0x56,0x33, 0x30,0x39,0x36,0x00,0x56,0x33,0x30,0x39,0x37,0x00,0x56,0x33,0x30,0x39,0x38,0x00, 0x56,0x33,0x30,0x39,0x39,0x00,0x56,0x33,0x31,0x30,0x30,0x00,0x56,0x33,0x31,0x30, 0x31,0x00,0x56,0x33,0x31,0x30,0x32,0x00,0x56,0x33,0x31,0x30,0x33,0x00,0x56,0x33, 0x31,0x30,0x34,0x00,0x56,0x33,0x31,0x30,0x35,0x00,0x56,0x33,0x31,0x30,0x36,0x00, 0x56,0x33,0x31,0x30,0x37,0x00,0x56,0x33,0x31,0x30,0x38,0x00,0x56,0x33,0x31,0x30, 0x39,0x00,0x56,0x33,0x31,0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x31,0x00,0x56,0x33, 0x31,0x31,0x32,0x00,0x56,0x33,0x31,0x31,0x33,0x00,0x56,0x33,0x31,0x31,0x34,0x00, 0x56,0x33,0x31,0x31,0x35,0x00,0x56,0x33,0x31,0x31,0x36,0x00,0x56,0x33,0x31,0x31, 0x37,0x00,0x56,0x33,0x31,0x31,0x38,0x00,0x56,0x33,0x31,0x31,0x39,0x00,0x56,0x33, 0x31,0x32,0x30,0x00,0x56,0x33,0x31,0x32,0x31,0x00,0x56,0x33,0x31,0x32,0x32,0x00, 0x56,0x33,0x31,0x32,0x33,0x00,0x56,0x33,0x31,0x32,0x34,0x00,0x56,0x33,0x31,0x32, 0x35,0x00,0x56,0x33,0x31,0x32,0x36,0x00,0x56,0x33,0x31,0x32,0x37,0x00,0x56,0x33, 0x31,0x32,0x38,0x00,0x56,0x33,0x31,0x32,0x39,0x00,0x56,0x33,0x31,0x33,0x30,0x00, 0x56,0x33,0x31,0x33,0x31,0x00,0x56,0x33,0x31,0x33,0x32,0x00,0x56,0x33,0x31,0x33, 0x33,0x00,0x56,0x33,0x31,0x33,0x34,0x00,0x56,0x33,0x31,0x33,0x35,0x00,0x56,0x33, 0x31,0x33,0x36,0x00,0x56,0x33,0x31,0x33,0x37,0x00,0x56,0x33,0x31,0x33,0x38,0x00, 0x56,0x33,0x31,0x33,0x39,0x00,0x56,0x33,0x31,0x34,0x30,0x00,0x56,0x33,0x31,0x34, 0x31,0x00,0x56,0x33,0x31,0x34,0x32,0x00,0x56,0x33,0x31,0x34,0x33,0x00,0x56,0x33, 0x31,0x34,0x34,0x00,0x56,0x33,0x31,0x34,0x35,0x00,0x56,0x33,0x31,0x34,0x36,0x00, 0x56,0x33,0x31,0x34,0x37,0x00,0x56,0x33,0x31,0x34,0x38,0x00,0x56,0x33,0x31,0x34, 0x39,0x00,0x56,0x33,0x31,0x35,0x30,0x00,0x56,0x33,0x31,0x35,0x31,0x00,0x56,0x33, 0x31,0x35,0x32,0x00,0x56,0x33,0x31,0x35,0x33,0x00,0x56,0x33,0x31,0x35,0x34,0x00, 0x56,0x33,0x31,0x35,0x35,0x00,0x56,0x33,0x31,0x35,0x36,0x00,0x56,0x33,0x31,0x35, 0x37,0x00,0x56,0x33,0x31,0x35,0x38,0x00,0x56,0x33,0x31,0x35,0x39,0x00,0x56,0x33, 0x31,0x36,0x30,0x00,0x56,0x33,0x31,0x36,0x31,0x00,0x56,0x33,0x31,0x36,0x32,0x00, 0x56,0x33,0x31,0x36,0x33,0x00,0x56,0x33,0x31,0x36,0x34,0x00,0x56,0x33,0x31,0x36, 0x35,0x00,0x56,0x33,0x31,0x36,0x36,0x00,0x56,0x33,0x31,0x36,0x37,0x00,0x56,0x33, 0x31,0x36,0x38,0x00,0x56,0x33,0x31,0x36,0x39,0x00,0x56,0x33,0x31,0x37,0x30,0x00, 0x56,0x33,0x31,0x37,0x31,0x00,0x56,0x33,0x31,0x37,0x32,0x00,0x56,0x33,0x31,0x37, 0x33,0x00,0x56,0x33,0x31,0x37,0x34,0x00,0x56,0x33,0x31,0x37,0x35,0x00,0x56,0x33, 0x31,0x37,0x36,0x00,0x56,0x33,0x31,0x37,0x37,0x00,0x56,0x33,0x31,0x37,0x38,0x00, 0x56,0x33,0x31,0x37,0x39,0x00,0x56,0x33,0x31,0x38,0x30,0x00,0x56,0x33,0x31,0x38, 0x31,0x00,0x56,0x33,0x31,0x38,0x32,0x00,0x56,0x33,0x31,0x38,0x33,0x00,0x56,0x33, 0x31,0x38,0x34,0x00,0x56,0x33,0x31,0x38,0x35,0x00,0x56,0x33,0x31,0x38,0x36,0x00, 0x56,0x33,0x31,0x38,0x37,0x00,0x56,0x33,0x31,0x38,0x38,0x00,0x56,0x33,0x31,0x38, 0x39,0x00,0x56,0x33,0x31,0x39,0x30,0x00,0x56,0x33,0x31,0x39,0x31,0x00,0x56,0x33, 0x31,0x39,0x32,0x00,0x56,0x33,0x31,0x39,0x33,0x00,0x56,0x33,0x31,0x39,0x34,0x00, 0x56,0x33,0x31,0x39,0x35,0x00,0x56,0x33,0x31,0x39,0x36,0x00,0x56,0x33,0x31,0x39, 0x37,0x00,0x56,0x33,0x31,0x39,0x38,0x00,0x56,0x33,0x31,0x39,0x39,0x00,0x56,0x33, 0x32,0x30,0x30,0x00,0x56,0x33,0x32,0x30,0x31,0x00,0x56,0x33,0x32,0x30,0x32,0x00, 0x56,0x33,0x32,0x30,0x33,0x00,0x56,0x33,0x32,0x30,0x34,0x00,0x56,0x33,0x32,0x30, 0x35,0x00,0x56,0x33,0x32,0x30,0x36,0x00,0x56,0x33,0x32,0x30,0x37,0x00,0x56,0x33, 0x32,0x30,0x38,0x00,0x56,0x33,0x32,0x30,0x39,0x00,0x56,0x33,0x32,0x31,0x30,0x00, 0x56,0x33,0x32,0x31,0x31,0x00,0x56,0x33,0x32,0x31,0x32,0x00,0x56,0x33,0x32,0x31, 0x33,0x00,0x56,0x33,0x32,0x31,0x34,0x00,0x56,0x33,0x32,0x31,0x35,0x00,0x56,0x33, 0x32,0x31,0x36,0x00,0x56,0x33,0x32,0x31,0x37,0x00,0x56,0x33,0x32,0x31,0x38,0x00, 0x56,0x33,0x32,0x31,0x39,0x00,0x56,0x33,0x32,0x32,0x30,0x00,0x56,0x33,0x32,0x32, 0x31,0x00,0x56,0x33,0x32,0x32,0x32,0x00,0x56,0x33,0x32,0x32,0x33,0x00,0x56,0x33, 0x32,0x32,0x34,0x00,0x56,0x33,0x32,0x32,0x35,0x00,0x56,0x33,0x32,0x32,0x36,0x00, 0x56,0x33,0x32,0x32,0x37,0x00,0x56,0x33,0x32,0x32,0x38,0x00,0x56,0x33,0x32,0x32, 0x39,0x00,0x56,0x33,0x32,0x33,0x30,0x00,0x56,0x33,0x32,0x33,0x31,0x00,0x56,0x33, 0x32,0x33,0x32,0x00,0x56,0x33,0x32,0x33,0x33,0x00,0x56,0x33,0x32,0x33,0x34,0x00, 0x56,0x33,0x32,0x33,0x35,0x00,0x56,0x33,0x32,0x33,0x36,0x00,0x56,0x33,0x32,0x33, 0x37,0x00,0x56,0x33,0x32,0x33,0x38,0x00,0x56,0x33,0x32,0x33,0x39,0x00,0x56,0x33, 0x32,0x34,0x30,0x00,0x56,0x33,0x32,0x34,0x31,0x00,0x56,0x33,0x32,0x34,0x32,0x00, 0x56,0x33,0x32,0x34,0x33,0x00,0x56,0x33,0x32,0x34,0x34,0x00,0x56,0x33,0x32,0x34, 0x35,0x00,0x56,0x33,0x32,0x34,0x36,0x00,0x56,0x33,0x32,0x34,0x37,0x00,0x56,0x33, 0x32,0x34,0x38,0x00,0x56,0x33,0x32,0x34,0x39,0x00,0x56,0x33,0x32,0x35,0x30,0x00, 0x56,0x33,0x32,0x35,0x31,0x00,0x56,0x33,0x32,0x35,0x32,0x00,0x56,0x33,0x32,0x35, 0x33,0x00,0x56,0x33,0x32,0x35,0x34,0x00,0x56,0x33,0x32,0x35,0x35,0x00,0x56,0x33, 0x32,0x35,0x36,0x00,0x56,0x33,0x32,0x35,0x37,0x00,0x56,0x33,0x32,0x35,0x38,0x00, 0x56,0x33,0x32,0x35,0x39,0x00,0x56,0x33,0x32,0x36,0x30,0x00,0x56,0x33,0x32,0x36, 0x31,0x00,0x56,0x33,0x32,0x36,0x32,0x00,0x56,0x33,0x32,0x36,0x33,0x00,0x56,0x33, 0x32,0x36,0x34,0x00,0x56,0x33,0x32,0x36,0x35,0x00,0x56,0x33,0x32,0x36,0x36,0x00, 0x56,0x33,0x32,0x36,0x37,0x00,0x56,0x33,0x32,0x36,0x38,0x00,0x56,0x33,0x32,0x36, 0x39,0x00,0x56,0x33,0x32,0x37,0x30,0x00,0x56,0x33,0x32,0x37,0x31,0x00,0x56,0x33, 0x32,0x37,0x32,0x00,0x56,0x33,0x32,0x37,0x33,0x00,0x56,0x33,0x32,0x37,0x34,0x00, 0x56,0x33,0x32,0x37,0x35,0x00,0x56,0x33,0x32,0x37,0x36,0x00,0x56,0x33,0x32,0x37, 0x37,0x00,0x56,0x33,0x32,0x37,0x38,0x00,0x56,0x33,0x32,0x37,0x39,0x00,0x56,0x33, 0x32,0x38,0x30,0x00,0x56,0x33,0x32,0x38,0x31,0x00,0x56,0x33,0x32,0x38,0x32,0x00, 0x56,0x33,0x32,0x38,0x33,0x00,0x56,0x33,0x32,0x38,0x34,0x00,0x56,0x33,0x32,0x38, 0x35,0x00,0x56,0x33,0x32,0x38,0x36,0x00,0x56,0x33,0x32,0x38,0x37,0x00,0x56,0x33, 0x32,0x38,0x38,0x00,0x56,0x33,0x32,0x38,0x39,0x00,0x56,0x33,0x32,0x39,0x30,0x00, 0x56,0x33,0x32,0x39,0x31,0x00,0x56,0x33,0x32,0x39,0x32,0x00,0x56,0x33,0x32,0x39, 0x33,0x00,0x56,0x33,0x32,0x39,0x34,0x00,0x56,0x33,0x32,0x39,0x35,0x00,0x56,0x33, 0x32,0x39,0x36,0x00,0x56,0x33,0x32,0x39,0x37,0x00,0x56,0x33,0x32,0x39,0x38,0x00, 0x56,0x33,0x32,0x39,0x39,0x00,0x56,0x33,0x33,0x30,0x30,0x00,0x56,0x33,0x33,0x30, 0x31,0x00,0x56,0x33,0x33,0x30,0x32,0x00,0x56,0x33,0x33,0x30,0x33,0x00,0x56,0x33, 0x33,0x30,0x34,0x00,0x56,0x33,0x33,0x30,0x35,0x00,0x56,0x33,0x33,0x30,0x36,0x00, 0x56,0x33,0x33,0x30,0x37,0x00,0x56,0x33,0x33,0x30,0x38,0x00,0x56,0x33,0x33,0x30, 0x39,0x00,0x56,0x33,0x33,0x31,0x30,0x00,0x56,0x33,0x33,0x31,0x31,0x00,0x56,0x33, 0x33,0x31,0x32,0x00,0x56,0x33,0x33,0x31,0x33,0x00,0x56,0x33,0x33,0x31,0x34,0x00, 0x56,0x33,0x33,0x31,0x35,0x00,0x56,0x33,0x33,0x31,0x36,0x00,0x56,0x33,0x33,0x31, 0x37,0x00,0x56,0x33,0x33,0x31,0x38,0x00,0x56,0x33,0x33,0x31,0x39,0x00,0x56,0x33, 0x33,0x32,0x30,0x00,0x56,0x33,0x33,0x32,0x31,0x00,0x56,0x33,0x33,0x32,0x32,0x00, 0x56,0x33,0x33,0x32,0x33,0x00,0x56,0x33,0x33,0x32,0x34,0x00,0x56,0x33,0x33,0x32, 0x35,0x00,0x56,0x33,0x33,0x32,0x36,0x00,0x56,0x33,0x33,0x32,0x37,0x00,0x56,0x33, 0x33,0x32,0x38,0x00,0x56,0x33,0x33,0x32,0x39,0x00,0x56,0x33,0x33,0x33,0x30,0x00, 0x56,0x33,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x33,0x32,0x00,0x56,0x33,0x33,0x33, 0x33,0x00,0x56,0x33,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x33,0x35,0x00,0x56,0x33, 0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x33,0x38,0x00, 0x56,0x33,0x33,0x33,0x39,0x00,0x56,0x33,0x33,0x34,0x30,0x00,0x56,0x33,0x33,0x34, 0x31,0x00,0x56,0x33,0x33,0x34,0x32,0x00,0x56,0x33,0x33,0x34,0x33,0x00,0x56,0x33, 0x33,0x34,0x34,0x00,0x56,0x33,0x33,0x34,0x35,0x00,0x56,0x33,0x33,0x34,0x36,0x00, 0x56,0x33,0x33,0x34,0x37,0x00,0x56,0x33,0x33,0x34,0x38,0x00,0x56,0x33,0x33,0x34, 0x39,0x00,0x56,0x33,0x33,0x35,0x30,0x00,0x56,0x33,0x33,0x35,0x31,0x00,0x56,0x33, 0x33,0x35,0x32,0x00,0x56,0x33,0x33,0x35,0x33,0x00,0x56,0x33,0x33,0x35,0x34,0x00, 0x56,0x33,0x33,0x35,0x35,0x00,0x56,0x33,0x33,0x35,0x36,0x00,0x56,0x33,0x33,0x35, 0x37,0x00,0x56,0x33,0x33,0x35,0x38,0x00,0x56,0x33,0x33,0x35,0x39,0x00,0x56,0x33, 0x33,0x36,0x30,0x00,0x56,0x33,0x33,0x36,0x31,0x00,0x56,0x33,0x33,0x36,0x32,0x00, 0x56,0x33,0x33,0x36,0x33,0x00,0x56,0x33,0x33,0x36,0x34,0x00,0x56,0x33,0x33,0x36, 0x35,0x00,0x56,0x33,0x33,0x36,0x36,0x00,0x56,0x33,0x33,0x36,0x37,0x00,0x56,0x33, 0x33,0x36,0x38,0x00,0x56,0x33,0x33,0x36,0x39,0x00,0x56,0x33,0x33,0x37,0x30,0x00, 0x56,0x33,0x33,0x37,0x31,0x00,0x56,0x33,0x33,0x37,0x32,0x00,0x56,0x33,0x33,0x37, 0x33,0x00,0x56,0x33,0x33,0x37,0x34,0x00,0x56,0x33,0x33,0x37,0x35,0x00,0x56,0x33, 0x33,0x37,0x36,0x00,0x56,0x33,0x33,0x37,0x37,0x00,0x56,0x33,0x33,0x37,0x38,0x00, 0x56,0x33,0x33,0x37,0x39,0x00,0x56,0x33,0x33,0x38,0x30,0x00,0x56,0x33,0x33,0x38, 0x31,0x00,0x56,0x33,0x33,0x38,0x32,0x00,0x56,0x33,0x33,0x38,0x33,0x00,0x56,0x33, 0x33,0x38,0x34,0x00,0x56,0x33,0x33,0x38,0x35,0x00,0x56,0x33,0x33,0x38,0x36,0x00, 0x56,0x33,0x33,0x38,0x37,0x00,0x56,0x33,0x33,0x38,0x38,0x00,0x56,0x33,0x33,0x38, 0x39,0x00,0x56,0x33,0x33,0x39,0x30,0x00,0x56,0x33,0x33,0x39,0x31,0x00,0x56,0x33, 0x33,0x39,0x32,0x00,0x56,0x33,0x33,0x39,0x33,0x00,0x56,0x33,0x33,0x39,0x34,0x00, 0x56,0x33,0x33,0x39,0x35,0x00,0x56,0x33,0x33,0x39,0x36,0x00,0x56,0x33,0x33,0x39, 0x37,0x00,0x56,0x33,0x33,0x39,0x38,0x00,0x56,0x33,0x33,0x39,0x39,0x00,0x56,0x33, 0x34,0x30,0x30,0x00,0x56,0x33,0x34,0x30,0x31,0x00,0x56,0x33,0x34,0x30,0x32,0x00, 0x56,0x33,0x34,0x30,0x33,0x00,0x56,0x33,0x34,0x30,0x34,0x00,0x56,0x33,0x34,0x30, 0x35,0x00,0x56,0x33,0x34,0x30,0x36,0x00,0x56,0x33,0x34,0x30,0x37,0x00,0x56,0x33, 0x34,0x30,0x38,0x00,0x56,0x33,0x34,0x30,0x39,0x00,0x56,0x33,0x34,0x31,0x30,0x00, 0x56,0x33,0x34,0x31,0x31,0x00,0x56,0x33,0x34,0x31,0x32,0x00,0x56,0x33,0x34,0x31, 0x33,0x00,0x56,0x33,0x34,0x31,0x34,0x00,0x56,0x33,0x34,0x31,0x35,0x00,0x56,0x33, 0x34,0x31,0x36,0x00,0x56,0x33,0x34,0x31,0x37,0x00,0x56,0x33,0x34,0x31,0x38,0x00, 0x56,0x33,0x34,0x31,0x39,0x00,0x56,0x33,0x34,0x32,0x30,0x00,0x56,0x33,0x34,0x32, 0x31,0x00,0x56,0x33,0x34,0x32,0x32,0x00,0x56,0x33,0x34,0x32,0x33,0x00,0x56,0x33, 0x34,0x32,0x34,0x00,0x56,0x33,0x34,0x32,0x35,0x00,0x56,0x33,0x34,0x32,0x36,0x00, 0x56,0x33,0x34,0x32,0x37,0x00,0x56,0x33,0x34,0x32,0x38,0x00,0x56,0x33,0x34,0x32, 0x39,0x00,0x56,0x33,0x34,0x33,0x30,0x00,0x56,0x33,0x34,0x33,0x31,0x00,0x56,0x33, 0x34,0x33,0x32,0x00,0x56,0x33,0x34,0x33,0x33,0x00,0x56,0x33,0x34,0x33,0x34,0x00, 0x56,0x33,0x34,0x33,0x35,0x00,0x56,0x33,0x34,0x33,0x36,0x00,0x56,0x33,0x34,0x33, 0x37,0x00,0x56,0x33,0x34,0x33,0x38,0x00,0x56,0x33,0x34,0x33,0x39,0x00,0x56,0x33, 0x34,0x34,0x30,0x00,0x56,0x33,0x34,0x34,0x31,0x00,0x56,0x33,0x34,0x34,0x32,0x00, 0x56,0x33,0x34,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x34,0x00,0x56,0x33,0x34,0x34, 0x35,0x00,0x56,0x33,0x34,0x34,0x36,0x00,0x56,0x33,0x34,0x34,0x37,0x00,0x56,0x33, 0x34,0x34,0x38,0x00,0x56,0x33,0x34,0x34,0x39,0x00,0x56,0x33,0x34,0x35,0x30,0x00, 0x56,0x33,0x34,0x35,0x31,0x00,0x56,0x33,0x34,0x35,0x32,0x00,0x56,0x33,0x34,0x35, 0x33,0x00,0x56,0x33,0x34,0x35,0x34,0x00,0x56,0x33,0x34,0x35,0x35,0x00,0x56,0x33, 0x34,0x35,0x36,0x00,0x56,0x33,0x34,0x35,0x37,0x00,0x56,0x33,0x34,0x35,0x38,0x00, 0x56,0x33,0x34,0x35,0x39,0x00,0x56,0x33,0x34,0x36,0x30,0x00,0x56,0x33,0x34,0x36, 0x31,0x00,0x56,0x33,0x34,0x36,0x32,0x00,0x56,0x33,0x34,0x36,0x33,0x00,0x56,0x33, 0x34,0x36,0x34,0x00,0x56,0x33,0x34,0x36,0x35,0x00,0x56,0x33,0x34,0x36,0x36,0x00, 0x56,0x33,0x34,0x36,0x37,0x00,0x56,0x33,0x34,0x36,0x38,0x00,0x56,0x33,0x34,0x36, 0x39,0x00,0x56,0x33,0x34,0x37,0x30,0x00,0x56,0x33,0x34,0x37,0x31,0x00,0x56,0x33, 0x34,0x37,0x32,0x00,0x56,0x33,0x34,0x37,0x33,0x00,0x56,0x33,0x34,0x37,0x34,0x00, 0x56,0x33,0x34,0x37,0x35,0x00,0x56,0x33,0x34,0x37,0x36,0x00,0x56,0x33,0x34,0x37, 0x37,0x00,0x56,0x33,0x34,0x37,0x38,0x00,0x56,0x33,0x34,0x37,0x39,0x00,0x56,0x33, 0x34,0x38,0x30,0x00,0x56,0x33,0x34,0x38,0x31,0x00,0x56,0x33,0x34,0x38,0x32,0x00, 0x56,0x33,0x34,0x38,0x33,0x00,0x56,0x33,0x34,0x38,0x34,0x00,0x56,0x33,0x34,0x38, 0x35,0x00,0x56,0x33,0x34,0x38,0x36,0x00,0x56,0x33,0x34,0x38,0x37,0x00,0x56,0x33, 0x34,0x38,0x38,0x00,0x56,0x33,0x34,0x38,0x39,0x00,0x56,0x33,0x34,0x39,0x30,0x00, 0x56,0x33,0x34,0x39,0x31,0x00,0x56,0x33,0x34,0x39,0x32,0x00,0x56,0x33,0x34,0x39, 0x33,0x00,0x56,0x33,0x34,0x39,0x34,0x00,0x56,0x33,0x34,0x39,0x35,0x00,0x56,0x33, 0x34,0x39,0x36,0x00,0x56,0x33,0x34,0x39,0x37,0x00,0x56,0x33,0x34,0x39,0x38,0x00, 0x56,0x33,0x34,0x39,0x39,0x00,0x56,0x33,0x35,0x30,0x30,0x00,0x56,0x33,0x35,0x30, 0x31,0x00,0x56,0x33,0x35,0x30,0x32,0x00,0x56,0x33,0x35,0x30,0x33,0x00,0x56,0x33, 0x35,0x30,0x34,0x00,0x56,0x33,0x35,0x30,0x35,0x00,0x56,0x33,0x35,0x30,0x36,0x00, 0x56,0x33,0x35,0x30,0x37,0x00,0x56,0x33,0x35,0x30,0x38,0x00,0x56,0x33,0x35,0x30, 0x39,0x00,0x56,0x33,0x35,0x31,0x30,0x00,0x56,0x33,0x35,0x31,0x31,0x00,0x56,0x33, 0x35,0x31,0x32,0x00,0x56,0x33,0x35,0x31,0x33,0x00,0x56,0x33,0x35,0x31,0x34,0x00, 0x56,0x33,0x35,0x31,0x35,0x00,0x56,0x33,0x35,0x31,0x36,0x00,0x56,0x33,0x35,0x31, 0x37,0x00,0x56,0x33,0x35,0x31,0x38,0x00,0x56,0x33,0x35,0x31,0x39,0x00,0x56,0x33, 0x35,0x32,0x30,0x00,0x56,0x33,0x35,0x32,0x31,0x00,0x56,0x33,0x35,0x32,0x32,0x00, 0x56,0x33,0x35,0x32,0x33,0x00,0x56,0x33,0x35,0x32,0x34,0x00,0x56,0x33,0x35,0x32, 0x35,0x00,0x56,0x33,0x35,0x32,0x36,0x00,0x56,0x33,0x35,0x32,0x37,0x00,0x56,0x33, 0x35,0x32,0x38,0x00,0x56,0x33,0x35,0x32,0x39,0x00,0x56,0x33,0x35,0x33,0x30,0x00, 0x56,0x33,0x35,0x33,0x31,0x00,0x56,0x33,0x35,0x33,0x32,0x00,0x56,0x33,0x35,0x33, 0x33,0x00,0x56,0x33,0x35,0x33,0x34,0x00,0x56,0x33,0x35,0x33,0x35,0x00,0x56,0x33, 0x35,0x33,0x36,0x00,0x56,0x33,0x35,0x33,0x37,0x00,0x56,0x33,0x35,0x33,0x38,0x00, 0x56,0x33,0x35,0x33,0x39,0x00,0x56,0x33,0x35,0x34,0x30,0x00,0x56,0x33,0x35,0x34, 0x31,0x00,0x56,0x33,0x35,0x34,0x32,0x00,0x56,0x33,0x35,0x34,0x33,0x00,0x56,0x33, 0x35,0x34,0x34,0x00,0x56,0x33,0x35,0x34,0x35,0x00,0x56,0x33,0x35,0x34,0x36,0x00, 0x56,0x33,0x35,0x34,0x37,0x00,0x56,0x33,0x35,0x34,0x38,0x00,0x56,0x33,0x35,0x34, 0x39,0x00,0x56,0x33,0x35,0x35,0x30,0x00,0x56,0x33,0x35,0x35,0x31,0x00,0x56,0x33, 0x35,0x35,0x32,0x00,0x56,0x33,0x35,0x35,0x33,0x00,0x56,0x33,0x35,0x35,0x34,0x00, 0x56,0x33,0x35,0x35,0x35,0x00,0x56,0x33,0x35,0x35,0x36,0x00,0x56,0x33,0x35,0x35, 0x37,0x00,0x56,0x33,0x35,0x35,0x38,0x00,0x56,0x33,0x35,0x35,0x39,0x00,0x56,0x33, 0x35,0x36,0x30,0x00,0x56,0x33,0x35,0x36,0x31,0x00,0x56,0x33,0x35,0x36,0x32,0x00, 0x56,0x33,0x35,0x36,0x33,0x00,0x56,0x33,0x35,0x36,0x34,0x00,0x56,0x33,0x35,0x36, 0x35,0x00,0x56,0x33,0x35,0x36,0x36,0x00,0x56,0x33,0x35,0x36,0x37,0x00,0x56,0x33, 0x35,0x36,0x38,0x00,0x56,0x33,0x35,0x36,0x39,0x00,0x56,0x33,0x35,0x37,0x30,0x00, 0x56,0x33,0x35,0x37,0x31,0x00,0x56,0x33,0x35,0x37,0x32,0x00,0x56,0x33,0x35,0x37, 0x33,0x00,0x56,0x33,0x35,0x37,0x34,0x00,0x56,0x33,0x35,0x37,0x35,0x00,0x56,0x33, 0x35,0x37,0x36,0x00,0x56,0x33,0x35,0x37,0x37,0x00,0x56,0x33,0x35,0x37,0x38,0x00, 0x56,0x33,0x35,0x37,0x39,0x00,0x56,0x33,0x35,0x38,0x30,0x00,0x56,0x33,0x35,0x38, 0x31,0x00,0x56,0x33,0x35,0x38,0x32,0x00,0x56,0x33,0x35,0x38,0x33,0x00,0x56,0x33, 0x35,0x38,0x34,0x00,0x56,0x33,0x35,0x38,0x35,0x00,0x56,0x33,0x35,0x38,0x36,0x00, 0x56,0x33,0x35,0x38,0x37,0x00,0x56,0x33,0x35,0x38,0x38,0x00,0x56,0x33,0x35,0x38, 0x39,0x00,0x56,0x33,0x35,0x39,0x30,0x00,0x56,0x33,0x35,0x39,0x31,0x00,0x41,0x30, 0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30, 0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30, 0x38,0x00,0x41,0x30,0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31, 0x32,0x00,0x41,0x31,0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31, 0x36,0x00,0x41,0x31,0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31,0x39,0x00,0x50,0x30, 0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30, 0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30, 0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31, 0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31, 0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32, 0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32,0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32, 0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32,0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32, 0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33,0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33, 0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33,0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33, 0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33,0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34, 0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34,0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34, 0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34,0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34, 0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35,0x31,0x00,0x50,0x35,0x32,0x00,0x50,0x35, 0x33,0x00,0x50,0x35,0x34,0x00,0x50,0x35,0x35,0x00,0x50,0x35,0x36,0x00,0x50,0x35, 0x37,0x00,0x50,0x35,0x38,0x00,0x50,0x35,0x39,0x00,0x50,0x36,0x30,0x00,0x50,0x36, 0x31,0x00,0x50,0x36,0x32,0x00,0x50,0x36,0x33,0x00,0x50,0x36,0x34,0x00,0x50,0x36, 0x35,0x00,0x50,0x36,0x36,0x00,0x50,0x36,0x37,0x00,0x50,0x36,0x38,0x00,0x50,0x36, 0x39,0x00,0x50,0x37,0x30,0x00,0x50,0x37,0x31,0x00,0x50,0x37,0x32,0x00,0x50,0x37, 0x33,0x00,0x50,0x37,0x34,0x00,0x50,0x37,0x35,0x00,0x50,0x37,0x36,0x00,0x50,0x37, 0x37,0x00,0x50,0x37,0x38,0x00,0x50,0x37,0x39,0x00,0x50,0x38,0x30,0x00,0x50,0x38, 0x31,0x00,0x50,0x38,0x32,0x00,0x50,0x38,0x33,0x00,0x50,0x38,0x34,0x00,0x50,0x38, 0x35,0x00,0x50,0x38,0x36,0x00,0x50,0x38,0x37,0x00,0x50,0x38,0x38,0x00,0x50,0x38, 0x39,0x00,0x50,0x39,0x30,0x00,0x50,0x39,0x31,0x00,0x50,0x39,0x32,0x00,0x50,0x39, 0x33,0x00,0x50,0x39,0x34,0x00,0x50,0x39,0x35,0x00,0x50,0x39,0x36,0x00,0x50,0x39, 0x37,0x00,0x50,0x39,0x38,0x00,0x50,0x39,0x39,0x00,0x50,0x31,0x30,0x30,0x00,0x50, 0x31,0x30,0x31,0x00,0x50,0x31,0x30,0x32,0x00,0x50,0x31,0x30,0x33,0x00,0x50,0x31, 0x30,0x34,0x00,0x50,0x31,0x30,0x35,0x00,0x50,0x31,0x30,0x36,0x00,0x50,0x31,0x30, 0x37,0x00,0x50,0x31,0x30,0x38,0x00,0x50,0x31,0x30,0x39,0x00,0x50,0x31,0x31,0x30, 0x00,0x50,0x31,0x31,0x31,0x00,0x50,0x31,0x31,0x32,0x00,0x50,0x31,0x31,0x33,0x00, 0x50,0x31,0x31,0x34,0x00,0x50,0x31,0x31,0x35,0x00,0x50,0x31,0x31,0x36,0x00,0x50, 0x31,0x31,0x37,0x00,0x50,0x31,0x31,0x38,0x00,0x50,0x31,0x31,0x39,0x00,0x50,0x31, 0x32,0x30,0x00,0x50,0x31,0x32,0x31,0x00,0x50,0x31,0x32,0x32,0x00,0x50,0x31,0x32, 0x33,0x00,0x50,0x31,0x32,0x34,0x00,0x50,0x31,0x32,0x35,0x00,0x50,0x31,0x32,0x36, 0x00,0x50,0x31,0x32,0x37,0x00,0x50,0x31,0x32,0x38,0x00,0x50,0x31,0x32,0x39,0x00, 0x50,0x31,0x33,0x30,0x00,0x50,0x31,0x33,0x31,0x00,0x50,0x31,0x33,0x32,0x00,0x50, 0x31,0x33,0x33,0x00,0x50,0x31,0x33,0x34,0x00,0x50,0x31,0x33,0x35,0x00,0x50,0x31, 0x33,0x36,0x00,0x50,0x31,0x33,0x37,0x00,0x50,0x31,0x33,0x38,0x00,0x50,0x31,0x33, 0x39,0x00,0x50,0x31,0x34,0x30,0x00,0x50,0x31,0x34,0x31,0x00,0x50,0x31,0x34,0x32, 0x00,0x50,0x31,0x34,0x33,0x00,0x50,0x31,0x34,0x34,0x00,0x50,0x31,0x34,0x35,0x00, 0x50,0x31,0x34,0x36,0x00,0x50,0x31,0x34,0x37,0x00,0x50,0x31,0x34,0x38,0x00,0x50, 0x31,0x34,0x39,0x00,0x50,0x31,0x35,0x30,0x00,0x50,0x31,0x35,0x31,0x00,0x50,0x31, 0x35,0x32,0x00,0x50,0x31,0x35,0x33,0x00,0x50,0x31,0x35,0x34,0x00,0x50,0x31,0x35, 0x35,0x00,0x50,0x31,0x35,0x36,0x00,0x50,0x31,0x35,0x37,0x00,0x50,0x31,0x35,0x38, 0x00,0x50,0x31,0x35,0x39,0x00,0x50,0x31,0x36,0x30,0x00,0x50,0x31,0x36,0x31,0x00, 0x50,0x31,0x36,0x32,0x00,0x50,0x31,0x36,0x33,0x00,0x50,0x31,0x36,0x34,0x00,0x50, 0x31,0x36,0x35,0x00,0x50,0x31,0x36,0x36,0x00,0x50,0x31,0x36,0x37,0x00,0x50,0x31, 0x36,0x38,0x00,0x50,0x31,0x36,0x39,0x00,0x50,0x31,0x37,0x30,0x00,0x50,0x31,0x37, 0x31,0x00,0x50,0x31,0x37,0x32,0x00,0x50,0x31,0x37,0x33,0x00,0x50,0x31,0x37,0x34, 0x00,0x50,0x31,0x37,0x35,0x00,0x50,0x31,0x37,0x36,0x00,0x50,0x31,0x37,0x37,0x00, 0x50,0x31,0x37,0x38,0x00,0x50,0x31,0x37,0x39,0x00,0x50,0x31,0x38,0x30,0x00,0x50, 0x31,0x38,0x31,0x00,0x50,0x31,0x38,0x32,0x00,0x50,0x31,0x38,0x33,0x00,0x50,0x31, 0x38,0x34,0x00,0x50,0x31,0x38,0x35,0x00,0x50,0x31,0x38,0x36,0x00,0x50,0x31,0x38, 0x37,0x00,0x50,0x31,0x38,0x38,0x00,0x50,0x31,0x38,0x39,0x00,0x50,0x31,0x39,0x30, 0x00,0x50,0x31,0x39,0x31,0x00,0x50,0x31,0x39,0x32,0x00,0x50,0x31,0x39,0x33,0x00, 0x50,0x31,0x39,0x34,0x00,0x50,0x31,0x39,0x35,0x00,0x50,0x31,0x39,0x36,0x00,0x50, 0x31,0x39,0x37,0x00,0x50,0x31,0x39,0x38,0x00,0x50,0x31,0x39,0x39,0x00,0x50,0x32, 0x30,0x30,0x00,0x50,0x32,0x30,0x31,0x00,0x50,0x32,0x30,0x32,0x00,0x50,0x32,0x30, 0x33,0x00,0x50,0x32,0x30,0x34,0x00,0x50,0x32,0x30,0x35,0x00,0x50,0x32,0x30,0x36, 0x00,0x50,0x32,0x30,0x37,0x00,0x50,0x32,0x30,0x38,0x00,0x50,0x32,0x30,0x39,0x00, 0x50,0x32,0x31,0x30,0x00,0x50,0x32,0x31,0x31,0x00,0x50,0x32,0x31,0x32,0x00,0x50, 0x32,0x31,0x33,0x00,0x50,0x32,0x31,0x34,0x00,0x50,0x32,0x31,0x35,0x00,0x50,0x32, 0x31,0x36,0x00,0x50,0x32,0x31,0x37,0x00,0x50,0x32,0x31,0x38,0x00,0x50,0x32,0x31, 0x39,0x00,0x50,0x32,0x32,0x30,0x00,0x50,0x32,0x32,0x31,0x00,0x50,0x32,0x32,0x32, 0x00,0x50,0x32,0x32,0x33,0x00,0x50,0x32,0x32,0x34,0x00,0x50,0x32,0x32,0x35,0x00, 0x50,0x32,0x32,0x36,0x00,0x50,0x32,0x32,0x37,0x00,0x50,0x32,0x32,0x38,0x00,0x50, 0x32,0x32,0x39,0x00,0x50,0x32,0x33,0x30,0x00,0x50,0x32,0x33,0x31,0x00,0x50,0x32, 0x33,0x32,0x00,0x50,0x32,0x33,0x33,0x00,0x50,0x32,0x33,0x34,0x00,0x50,0x32,0x33, 0x35,0x00,0x50,0x32,0x33,0x36,0x00,0x50,0x32,0x33,0x37,0x00,0x50,0x32,0x33,0x38, 0x00,0x50,0x32,0x33,0x39,0x00,0x50,0x32,0x34,0x30,0x00,0x50,0x32,0x34,0x31,0x00, 0x50,0x32,0x34,0x32,0x00,0x50,0x32,0x34,0x33,0x00,0x50,0x32,0x34,0x34,0x00,0x50, 0x32,0x34,0x35,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f, 0x72,0x65,0x61,0x64,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x33,0x32,0x78,0x33,0x32, 0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d, 0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f, 0x73,0x64,0x69,0x76,0x69,0x69,0x2e,0x35,0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00, 0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42, 0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36, 0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39, 0x00,0x42,0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31, 0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32, 0x5f,0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f, 0x31,0x34,0x5f,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42, 0x42,0x5f,0x31,0x36,0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38, 0x00,0x42,0x42,0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f, 0x32,0x30,0x00,0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32, 0x31,0x5f,0x32,0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42, 0x5f,0x32,0x33,0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00, 0x42,0x42,0x5f,0x32,0x35,0x5f,0x32,0x36,0x00,0x42,0x42,0x5f,0x32,0x36,0x5f,0x32, 0x37,0x00,0x42,0x42,0x5f,0x32,0x37,0x5f,0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x38, 0x5f,0x32,0x39,0x00,0x42,0x42,0x5f,0x32,0x39,0x5f,0x33,0x30,0x00,0x42,0x42,0x5f, 0x33,0x30,0x5f,0x33,0x31,0x00,0x42,0x42,0x5f,0x33,0x31,0x5f,0x33,0x32,0x00,0x42, 0x42,0x5f,0x33,0x32,0x5f,0x33,0x33,0x00,0x42,0x42,0x5f,0x33,0x33,0x5f,0x33,0x34, 0x00,0x42,0x42,0x5f,0x33,0x34,0x5f,0x33,0x35,0x00,0x42,0x42,0x5f,0x33,0x35,0x5f, 0x33,0x36,0x00,0x42,0x42,0x5f,0x33,0x36,0x5f,0x33,0x37,0x00,0x42,0x42,0x5f,0x33, 0x37,0x5f,0x33,0x38,0x00,0x42,0x42,0x5f,0x33,0x38,0x5f,0x33,0x39,0x00,0x42,0x42, 0x5f,0x33,0x39,0x5f,0x34,0x30,0x00,0x42,0x42,0x5f,0x34,0x30,0x5f,0x34,0x31,0x00, 0x42,0x42,0x5f,0x34,0x31,0x5f,0x34,0x32,0x00,0x42,0x42,0x5f,0x34,0x32,0x5f,0x34, 0x33,0x00,0x42,0x42,0x5f,0x34,0x33,0x5f,0x34,0x34,0x00,0x42,0x42,0x5f,0x34,0x34, 0x5f,0x34,0x35,0x00,0x42,0x42,0x5f,0x34,0x35,0x5f,0x34,0x36,0x00,0x42,0x42,0x5f, 0x34,0x36,0x5f,0x34,0x37,0x00,0x42,0x42,0x5f,0x34,0x37,0x5f,0x34,0x38,0x00,0x42, 0x42,0x5f,0x34,0x38,0x5f,0x34,0x39,0x00,0x42,0x42,0x5f,0x34,0x39,0x5f,0x35,0x30, 0x00,0x42,0x42,0x5f,0x35,0x30,0x5f,0x35,0x31,0x00,0x42,0x42,0x5f,0x35,0x31,0x5f, 0x35,0x32,0x00,0x42,0x42,0x5f,0x35,0x32,0x5f,0x35,0x33,0x00,0x42,0x42,0x5f,0x35, 0x33,0x5f,0x35,0x34,0x00,0x42,0x42,0x5f,0x35,0x34,0x5f,0x35,0x35,0x00,0x42,0x42, 0x5f,0x35,0x35,0x5f,0x35,0x36,0x00,0x42,0x42,0x5f,0x35,0x36,0x5f,0x35,0x37,0x00, 0x42,0x42,0x5f,0x35,0x37,0x5f,0x35,0x38,0x00,0x42,0x42,0x5f,0x35,0x38,0x5f,0x35, 0x39,0x00,0x42,0x42,0x5f,0x35,0x39,0x5f,0x36,0x30,0x00,0x42,0x42,0x5f,0x36,0x30, 0x5f,0x36,0x31,0x00,0x42,0x42,0x5f,0x36,0x31,0x5f,0x36,0x32,0x00,0x42,0x42,0x5f, 0x36,0x32,0x5f,0x36,0x33,0x00,0x42,0x42,0x5f,0x36,0x33,0x5f,0x36,0x34,0x00,0x42, 0x42,0x5f,0x36,0x34,0x5f,0x36,0x35,0x00,0x42,0x42,0x5f,0x36,0x35,0x5f,0x36,0x36, 0x00,0x42,0x42,0x5f,0x36,0x36,0x5f,0x36,0x37,0x00,0x42,0x42,0x5f,0x36,0x37,0x5f, 0x36,0x38,0x00,0x42,0x42,0x5f,0x36,0x38,0x5f,0x36,0x39,0x00,0x42,0x42,0x5f,0x36, 0x39,0x5f,0x37,0x30,0x00,0x42,0x42,0x5f,0x37,0x30,0x5f,0x37,0x31,0x00,0x42,0x42, 0x5f,0x37,0x31,0x5f,0x37,0x32,0x00,0x42,0x42,0x5f,0x37,0x32,0x5f,0x37,0x33,0x00, 0x42,0x42,0x5f,0x37,0x33,0x5f,0x37,0x34,0x00,0x42,0x42,0x5f,0x37,0x34,0x5f,0x37, 0x35,0x00,0x42,0x42,0x5f,0x37,0x35,0x5f,0x37,0x36,0x00,0x42,0x42,0x5f,0x37,0x36, 0x5f,0x37,0x37,0x00,0x42,0x42,0x5f,0x37,0x37,0x5f,0x37,0x38,0x00,0x42,0x42,0x5f, 0x37,0x38,0x5f,0x37,0x39,0x00,0x42,0x42,0x5f,0x37,0x39,0x5f,0x38,0x30,0x00,0x42, 0x42,0x5f,0x38,0x30,0x5f,0x38,0x31,0x00,0x42,0x42,0x5f,0x38,0x31,0x5f,0x38,0x32, 0x00,0x42,0x42,0x5f,0x38,0x32,0x5f,0x38,0x33,0x00,0x42,0x42,0x5f,0x38,0x33,0x5f, 0x38,0x34,0x00,0x42,0x42,0x5f,0x38,0x34,0x5f,0x38,0x35,0x00,0x42,0x42,0x5f,0x38, 0x35,0x5f,0x38,0x36,0x00,0x42,0x42,0x5f,0x38,0x36,0x5f,0x38,0x37,0x00,0x42,0x42, 0x5f,0x38,0x37,0x5f,0x38,0x38,0x00,0x42,0x42,0x5f,0x38,0x38,0x5f,0x38,0x39,0x00, 0x42,0x42,0x5f,0x38,0x39,0x5f,0x39,0x30,0x00,0x42,0x42,0x5f,0x39,0x30,0x5f,0x39, 0x31,0x00,0x42,0x42,0x5f,0x39,0x31,0x5f,0x39,0x32,0x00,0x42,0x42,0x5f,0x39,0x32, 0x5f,0x39,0x33,0x00,0x42,0x42,0x5f,0x39,0x33,0x5f,0x39,0x34,0x00,0x42,0x42,0x5f, 0x39,0x34,0x5f,0x39,0x35,0x00,0x42,0x42,0x5f,0x39,0x35,0x5f,0x39,0x36,0x00,0x42, 0x42,0x5f,0x39,0x36,0x5f,0x39,0x37,0x00,0x42,0x42,0x5f,0x39,0x37,0x5f,0x39,0x38, 0x00,0x42,0x42,0x5f,0x39,0x38,0x5f,0x39,0x39,0x00,0x42,0x42,0x5f,0x39,0x39,0x5f, 0x31,0x30,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x30,0x5f,0x31,0x30,0x31,0x00,0x42, 0x42,0x5f,0x31,0x30,0x31,0x5f,0x31,0x30,0x32,0x00,0x42,0x42,0x5f,0x31,0x30,0x32, 0x5f,0x31,0x30,0x33,0x00,0x42,0x42,0x5f,0x31,0x30,0x33,0x5f,0x31,0x30,0x34,0x00, 0x42,0x42,0x5f,0x31,0x30,0x34,0x5f,0x31,0x30,0x35,0x00,0x42,0x42,0x5f,0x31,0x30, 0x35,0x5f,0x31,0x30,0x36,0x00,0x42,0x42,0x5f,0x31,0x30,0x36,0x5f,0x31,0x30,0x37, 0x00,0x42,0x42,0x5f,0x31,0x30,0x37,0x5f,0x31,0x30,0x38,0x00,0x42,0x42,0x5f,0x31, 0x30,0x38,0x5f,0x31,0x30,0x39,0x00,0x42,0x42,0x5f,0x31,0x30,0x39,0x5f,0x31,0x31, 0x30,0x00,0x42,0x42,0x5f,0x31,0x31,0x30,0x5f,0x31,0x31,0x31,0x00,0x42,0x42,0x5f, 0x31,0x31,0x31,0x5f,0x31,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x31,0x32,0x5f,0x31, 0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x31,0x33,0x5f,0x31,0x31,0x34,0x00,0x42,0x42, 0x5f,0x31,0x31,0x34,0x5f,0x31,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x31,0x35,0x5f, 0x31,0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x31,0x36,0x5f,0x31,0x31,0x37,0x00,0x42, 0x42,0x5f,0x31,0x31,0x37,0x5f,0x31,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x31,0x38, 0x5f,0x31,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x31,0x39,0x5f,0x31,0x32,0x30,0x00, 0x42,0x42,0x5f,0x31,0x32,0x30,0x5f,0x31,0x32,0x31,0x00,0x42,0x42,0x5f,0x31,0x32, 0x31,0x5f,0x31,0x32,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x32,0x5f,0x31,0x32,0x33, 0x00,0x42,0x42,0x5f,0x31,0x32,0x33,0x5f,0x31,0x32,0x34,0x00,0x42,0x42,0x5f,0x31, 0x32,0x34,0x5f,0x31,0x32,0x35,0x00,0x42,0x42,0x5f,0x31,0x32,0x35,0x5f,0x31,0x32, 0x36,0x00,0x42,0x42,0x5f,0x31,0x32,0x36,0x5f,0x31,0x32,0x37,0x00,0x42,0x42,0x5f, 0x31,0x32,0x37,0x5f,0x31,0x32,0x38,0x00,0x42,0x42,0x5f,0x31,0x32,0x38,0x5f,0x31, 0x32,0x39,0x00,0x42,0x42,0x5f,0x31,0x32,0x39,0x5f,0x31,0x33,0x30,0x00,0x42,0x42, 0x5f,0x31,0x33,0x30,0x5f,0x31,0x33,0x31,0x00,0x42,0x42,0x5f,0x31,0x33,0x31,0x5f, 0x31,0x33,0x32,0x00,0x42,0x42,0x5f,0x31,0x33,0x32,0x5f,0x31,0x33,0x33,0x00,0x42, 0x42,0x5f,0x31,0x33,0x33,0x5f,0x31,0x33,0x34,0x00,0x42,0x42,0x5f,0x31,0x33,0x34, 0x5f,0x31,0x33,0x35,0x00,0x42,0x42,0x5f,0x31,0x33,0x35,0x5f,0x31,0x33,0x36,0x00, 0x42,0x42,0x5f,0x31,0x33,0x36,0x5f,0x31,0x33,0x37,0x00,0x42,0x42,0x5f,0x31,0x33, 0x37,0x5f,0x31,0x33,0x38,0x00,0x42,0x42,0x5f,0x31,0x33,0x38,0x5f,0x31,0x33,0x39, 0x00,0x42,0x42,0x5f,0x31,0x33,0x39,0x5f,0x31,0x34,0x30,0x00,0x42,0x42,0x5f,0x31, 0x34,0x30,0x5f,0x31,0x34,0x31,0x00,0x42,0x42,0x5f,0x31,0x34,0x31,0x5f,0x31,0x34, 0x32,0x00,0x42,0x42,0x5f,0x31,0x34,0x32,0x5f,0x31,0x34,0x33,0x00,0x42,0x42,0x5f, 0x31,0x34,0x33,0x5f,0x31,0x34,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x34,0x5f,0x31, 0x34,0x35,0x00,0x42,0x42,0x5f,0x31,0x34,0x35,0x5f,0x31,0x34,0x36,0x00,0x42,0x42, 0x5f,0x31,0x34,0x36,0x5f,0x31,0x34,0x37,0x00,0x42,0x42,0x5f,0x31,0x34,0x37,0x5f, 0x31,0x34,0x38,0x00,0x42,0x42,0x5f,0x31,0x34,0x38,0x5f,0x31,0x34,0x39,0x00,0x42, 0x42,0x5f,0x31,0x34,0x39,0x5f,0x31,0x35,0x30,0x00,0x42,0x42,0x5f,0x31,0x35,0x30, 0x5f,0x31,0x35,0x31,0x00,0x42,0x42,0x5f,0x31,0x35,0x31,0x5f,0x31,0x35,0x32,0x00, 0x42,0x42,0x5f,0x31,0x35,0x32,0x5f,0x31,0x35,0x33,0x00,0x42,0x42,0x5f,0x31,0x35, 0x33,0x5f,0x31,0x35,0x34,0x00,0x42,0x42,0x5f,0x31,0x35,0x34,0x5f,0x31,0x35,0x35, 0x00,0x42,0x42,0x5f,0x31,0x35,0x35,0x5f,0x31,0x35,0x36,0x00,0x42,0x42,0x5f,0x31, 0x35,0x36,0x5f,0x31,0x35,0x37,0x00,0x42,0x42,0x5f,0x31,0x35,0x37,0x5f,0x31,0x35, 0x38,0x00,0x42,0x42,0x5f,0x31,0x35,0x38,0x5f,0x31,0x35,0x39,0x00,0x42,0x42,0x5f, 0x31,0x35,0x39,0x5f,0x31,0x36,0x30,0x00,0x42,0x42,0x5f,0x31,0x36,0x30,0x5f,0x31, 0x36,0x31,0x00,0x42,0x42,0x5f,0x31,0x36,0x31,0x5f,0x31,0x36,0x32,0x00,0x42,0x42, 0x5f,0x31,0x36,0x32,0x5f,0x31,0x36,0x33,0x00,0x42,0x42,0x5f,0x31,0x36,0x33,0x5f, 0x31,0x36,0x34,0x00,0x42,0x42,0x5f,0x31,0x36,0x34,0x5f,0x31,0x36,0x35,0x00,0x42, 0x42,0x5f,0x31,0x36,0x35,0x5f,0x31,0x36,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x36, 0x5f,0x31,0x36,0x37,0x00,0x42,0x42,0x5f,0x31,0x36,0x37,0x5f,0x31,0x36,0x38,0x00, 0x42,0x42,0x5f,0x31,0x36,0x38,0x5f,0x31,0x36,0x39,0x00,0x42,0x42,0x5f,0x31,0x36, 0x39,0x5f,0x31,0x37,0x30,0x00,0x42,0x42,0x5f,0x31,0x37,0x30,0x5f,0x31,0x37,0x31, 0x00,0x42,0x42,0x5f,0x31,0x37,0x31,0x5f,0x31,0x37,0x32,0x00,0x42,0x42,0x5f,0x31, 0x37,0x32,0x5f,0x31,0x37,0x33,0x00,0x42,0x42,0x5f,0x31,0x37,0x33,0x5f,0x31,0x37, 0x34,0x00,0x42,0x42,0x5f,0x31,0x37,0x34,0x5f,0x31,0x37,0x35,0x00,0x42,0x42,0x5f, 0x31,0x37,0x35,0x5f,0x31,0x37,0x36,0x00,0x42,0x42,0x5f,0x31,0x37,0x36,0x5f,0x31, 0x37,0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x37,0x5f,0x31,0x37,0x38,0x00,0x42,0x42, 0x5f,0x31,0x37,0x38,0x5f,0x31,0x37,0x39,0x00,0x42,0x42,0x5f,0x31,0x37,0x39,0x5f, 0x31,0x38,0x30,0x00,0x42,0x42,0x5f,0x31,0x38,0x30,0x5f,0x31,0x38,0x31,0x00,0x42, 0x42,0x5f,0x31,0x38,0x31,0x5f,0x31,0x38,0x32,0x00,0x42,0x42,0x5f,0x31,0x38,0x32, 0x5f,0x31,0x38,0x33,0x00,0x42,0x42,0x5f,0x31,0x38,0x33,0x5f,0x31,0x38,0x34,0x00, 0x42,0x42,0x5f,0x31,0x38,0x34,0x5f,0x31,0x38,0x35,0x00,0x42,0x42,0x5f,0x31,0x38, 0x35,0x5f,0x31,0x38,0x36,0x00,0x42,0x42,0x5f,0x31,0x38,0x36,0x5f,0x31,0x38,0x37, 0x00,0x42,0x42,0x5f,0x31,0x38,0x37,0x5f,0x31,0x38,0x38,0x00,0x42,0x42,0x5f,0x31, 0x38,0x38,0x5f,0x31,0x38,0x39,0x00,0x42,0x42,0x5f,0x31,0x38,0x39,0x5f,0x31,0x39, 0x30,0x00,0x42,0x42,0x5f,0x31,0x39,0x30,0x5f,0x31,0x39,0x31,0x00,0x42,0x42,0x5f, 0x31,0x39,0x31,0x5f,0x31,0x39,0x32,0x00,0x42,0x42,0x5f,0x31,0x39,0x32,0x5f,0x31, 0x39,0x33,0x00,0x42,0x42,0x5f,0x31,0x39,0x33,0x5f,0x31,0x39,0x34,0x00,0x54,0x30, 0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00, 0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74, 0x00,0x00,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x04,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x04,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x04,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x04,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x04, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x04,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x04,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x04, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x04,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x04,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x04,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x05,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x05,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x05,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x05, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x05, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x05,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x06,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x06,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x06,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x06,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x06,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x06, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x06,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x06,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x06,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x06,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x06,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x06,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x07,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x07,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x07,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x08,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x08,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x08,0x00, 0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x08,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x08,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x08,0x00, 0x00,0x52,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x08,0x00,0x00, 0x52,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x08,0x00,0x00,0x52, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x08,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x08,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x08,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x08,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x08,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x08,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x08,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x09,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x09,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x09,0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x09,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x09,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x09,0x00,0x00,0x20,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x09,0x00,0x00,0x20,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x09, 0x00,0x00,0x20,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09,0x00, 0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x09,0x00,0x00, 0x20,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x09,0x00,0x00,0x23, 0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x09,0x00,0x00,0x12,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x00,0x00,0x52,0x00,0x02, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x00,0x00,0x52,0x80,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x09,0x00,0x00,0x22,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x09,0x00,0x00,0x52,0x80,0x00,0xbb,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x52,0x80,0x00,0xbc,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x09,0x00,0x00,0x52,0x80,0x00,0xbd,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x23,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x09,0x00,0x00,0x12,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x09,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x09,0x00,0x00,0x21,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x09,0x00,0x00,0x20,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x09, 0x00,0x00,0x20,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x09,0x00, 0x00,0x20,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x09,0x00,0x00, 0x20,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x20, 0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x09,0x00,0x00,0x20,0x01, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x09,0x00,0x00,0x20,0x01,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x09,0x00,0x00,0x20,0x01,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x09,0x00,0x00,0x20,0x01,0x00,0x5a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x09,0x00,0x00,0x50,0x08,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x09,0x00,0x00,0x20,0x01,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x09,0x00,0x00,0x20,0x01,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x20,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x09,0x00,0x00,0x20,0x01,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x09,0x00,0x00,0x20,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x09,0x00,0x00,0x20,0x01,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x09,0x00,0x00,0x20,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x09, 0x00,0x00,0x20,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x09,0x00, 0x00,0x50,0x08,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x09,0x00,0x00, 0x20,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x09,0x00,0x00,0x20, 0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x09,0x00,0x00,0x20,0x01, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x09,0x00,0x00,0x20,0x01,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x09,0x00,0x00,0x20,0x01,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x09,0x00,0x00,0x21,0x01,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x09,0x00,0x00,0x20,0x01,0x00,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x09,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x09,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x20,0x01,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x09,0x00,0x00,0x20,0x01,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x09,0x00,0x00,0x20,0x01,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x09,0x00,0x00,0x20,0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x09,0x00,0x00,0x20,0x01,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x09, 0x00,0x00,0x20,0x01,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x09,0x00, 0x00,0x20,0x01,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x09,0x00,0x00, 0x20,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x09,0x00,0x00,0x20, 0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x09,0x00,0x00,0x20,0x01, 0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x09,0x00,0x00,0x20,0x01,0x00, 0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x20,0x01,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x09,0x00,0x00,0x50,0x08,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x09,0x00,0x00,0x20,0x01,0x00,0x9b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x09,0x00,0x00,0x20,0x01,0x00,0x9d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x09,0x00,0x00,0x20,0x01,0x00,0x9f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x09,0x00,0x00,0x20,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x09,0x00,0x00,0x20,0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x09,0x00,0x00,0x20,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x09,0x00,0x00,0x20,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x09,0x00,0x00,0x21,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x09, 0x00,0x00,0x20,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x09,0x00, 0x00,0x20,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x09,0x00,0x00, 0x20,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x09,0x00,0x00,0x20, 0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x09,0x00,0x00,0x20,0x01, 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x09,0x00,0x00,0x20,0x01,0x00, 0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x09,0x00,0x00,0x20,0x01,0x00,0xb5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x09,0x00,0x00,0x20,0x01,0x00,0xb8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x00,0xba,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x20,0x01,0x00,0xbc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x09,0x00,0x00,0x20,0x01,0x00,0xbe,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x09,0x00,0x00,0x20,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x09,0x00,0x00,0x20,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x09,0x00,0x00,0x50,0x08,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x09,0x00,0x00,0x20,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x09,0x00,0x00,0x20,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x09, 0x00,0x00,0x20,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x09,0x00, 0x00,0x20,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x09,0x00,0x00, 0x20,0x01,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x09,0x00,0x00,0x20, 0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x09,0x00,0x00,0x21,0x01, 0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x09,0x00,0x00,0x20,0x01,0x00, 0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x09,0x00,0x00,0x20,0x01,0x00,0xd3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x09,0x00,0x00,0x20,0x01,0x00,0xd6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x09,0x00,0x00,0x20,0x01,0x00,0xd9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x09,0x00,0x00,0x20,0x01,0x00,0xdc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x09,0x00,0x00,0x20,0x01,0x00,0xd5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x09,0x00,0x00,0x20,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x09,0x00,0x00,0x50,0x08,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x09,0x00,0x00,0x20,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x09,0x00,0x00,0x20,0x01,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x09,0x00,0x00,0x20,0x01,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x09, 0x00,0x00,0x20,0x01,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x09,0x00, 0x00,0x20,0x01,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x09,0x00,0x00, 0x50,0x08,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x09,0x00,0x00,0x20, 0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x09,0x00,0x00,0x20,0x01, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x09,0x00,0x00,0x20,0x01,0x00, 0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x09,0x00,0x00,0x20,0x01,0x00,0xf3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x09,0x00,0x00,0x20,0x01,0x00,0xf5,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x09,0x00,0x00,0x50,0x08,0x00,0xf6,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x09,0x00,0x00,0x21,0x01,0x00,0xf7,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x09,0x00,0x00,0x20,0x01,0x00,0xf8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x20,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x09,0x00,0x00,0x20,0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x09,0x00,0x00,0x50,0x08,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x09,0x00,0x00,0x20,0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x09,0x00,0x00,0x52,0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x09, 0x00,0x00,0x12,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x09,0x00, 0x00,0x21,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x09,0x00,0x00, 0x20,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x09,0x00,0x00,0x20, 0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x09,0x00,0x00,0x20,0x01, 0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x20,0x01,0x00, 0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x09,0x00,0x00,0x20,0x01,0x00,0x0c, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x09,0x00,0x00,0x20,0x01,0x00,0x0e,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x50,0x08,0x00,0x0f,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x09,0x00,0x00,0x20,0x01,0x00,0x11,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x09,0x00,0x00,0x20,0x01,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x09,0x00,0x00,0x20,0x01,0x00,0x15,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x09,0x00,0x00,0x20,0x01,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x09,0x00,0x00,0x20,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x09,0x00,0x00,0x50,0x08,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x09,0x00,0x00,0x20,0x01,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x09, 0x00,0x00,0x20,0x01,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x09,0x00, 0x00,0x20,0x01,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x09,0x00,0x00, 0x20,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x09,0x00,0x00,0x20, 0x01,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x09,0x00,0x00,0x21,0x01, 0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x09,0x00,0x00,0x20,0x01,0x00, 0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x09,0x00,0x00,0x20,0x01,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x09,0x00,0x00,0x20,0x01,0x00,0x29,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x09,0x00,0x00,0x20,0x01,0x00,0x2b,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x09,0x00,0x00,0x20,0x01,0x00,0x2d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x09,0x00,0x00,0x20,0x01,0x00,0x2f,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x09,0x00,0x00,0x20,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x09,0x00,0x00,0x20,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x09,0x00,0x00,0x50,0x08,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x09,0x00,0x00,0x20,0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x09,0x00,0x00,0x20,0x01,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x09, 0x00,0x00,0x20,0x01,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x09,0x00, 0x00,0x20,0x01,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x09,0x00,0x00, 0x20,0x01,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x09,0x00,0x00,0x20, 0x01,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x09,0x00,0x00,0x20,0x01, 0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x09,0x00,0x00,0x21,0x01,0x00, 0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x09,0x00,0x00,0x20,0x01,0x00,0x46, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x09,0x00,0x00,0x20,0x01,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x09,0x00,0x00,0x20,0x01,0x00,0x49,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x09,0x00,0x00,0x20,0x01,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x09,0x00,0x00,0x20,0x01,0x00,0x4d,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x09,0x00,0x00,0x20,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x09,0x00,0x00,0x20,0x01,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x09,0x00,0x00,0x50,0x08,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x09,0x00,0x00,0x20,0x01,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x09,0x00,0x00,0x20,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x09, 0x00,0x00,0x20,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x09,0x00, 0x00,0x20,0x01,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x09,0x00,0x00, 0x20,0x01,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x20, 0x01,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x09,0x00,0x00,0x21,0x01, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x09,0x00,0x00,0x20,0x01,0x00, 0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x09,0x00,0x00,0x20,0x01,0x00,0x63, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x09,0x00,0x00,0x20,0x01,0x00,0x65,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x09,0x00,0x00,0x20,0x01,0x00,0x69,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x09,0x00,0x00,0x50,0x08,0x00,0x6a,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x09,0x00,0x00,0x20,0x01,0x00,0x6c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x09,0x00,0x00,0x20,0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x09,0x00,0x00,0x20,0x01,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x09,0x00,0x00,0x20,0x01,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x09,0x00,0x00,0x50,0x08,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x09,0x00,0x00,0x20,0x01,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x09, 0x00,0x00,0x20,0x01,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x09,0x00, 0x00,0x20,0x01,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x09,0x00,0x00, 0x20,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x09,0x00,0x00,0x50, 0x08,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x09,0x00,0x00,0x21,0x01, 0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x09,0x00,0x00,0x20,0x01,0x00, 0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x09,0x00,0x00,0x20,0x01,0x00,0x7d, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x09,0x00,0x00,0x50,0x08,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x09,0x00,0x00,0x20,0x01,0x00,0x7f,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x52,0x00,0x02,0x83,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x09,0x00,0x00,0x12,0x01,0x00,0x81,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x50,0x08,0x00,0x84,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x09,0x00,0x00,0x20,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x09,0x00,0x00,0x20,0x01,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x09,0x00,0x00,0x20,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x09,0x00,0x00,0x20,0x01,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x09, 0x00,0x00,0x20,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x09,0x00, 0x00,0x50,0x08,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x09,0x00,0x00, 0x20,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x09,0x00,0x00,0x20, 0x01,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x09,0x00,0x00,0x20,0x01, 0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x09,0x00,0x00,0x20,0x01,0x00, 0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x09,0x00,0x00,0x20,0x01,0x00,0x99, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x09,0x00,0x00,0x20,0x01,0x00,0x9b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x09,0x00,0x00,0x20,0x01,0x00,0x9d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x09,0x00,0x00,0x50,0x08,0x00,0x9e,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x09,0x00,0x00,0x20,0x01,0x00,0xa0,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x09,0x00,0x00,0x20,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x09,0x00,0x00,0x20,0x01,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x09,0x00,0x00,0x20,0x01,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x09,0x00,0x00,0x20,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x09,0x00,0x00,0x20,0x01,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x09, 0x00,0x00,0x50,0x08,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x09,0x00, 0x00,0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x09,0x00,0x00, 0x20,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x09,0x00,0x00,0x20, 0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x09,0x00,0x00,0x50,0x08, 0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x09,0x00,0x00,0x50,0x08,0x00, 0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x09,0x00,0x00,0x20,0x01,0x00,0xb4, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x09,0x00,0x00,0x52,0x00,0x02,0xb8,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x09,0x00,0x00,0x12,0x01,0x00,0xb6,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x09,0x00,0x00,0x21,0x01,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x09,0x00,0x00,0x20,0x01,0x00,0xba,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x09,0x00,0x00,0x20,0x01,0x00,0xbb,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x09,0x00,0x00,0x20,0x01,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x09,0x00,0x00,0x20,0x01,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x09,0x00,0x00,0x20,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x09,0x00,0x00,0x20,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x09, 0x00,0x00,0x50,0x08,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x09,0x00, 0x00,0x20,0x01,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x09,0x00,0x00, 0x20,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x09,0x00,0x00,0x20, 0x01,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x09,0x00,0x00,0x20,0x01, 0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x09,0x00,0x00,0x20,0x01,0x00, 0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x09,0x00,0x00,0x50,0x08,0x00,0xcf, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x09,0x00,0x00,0x20,0x01,0x00,0xd1,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x20,0x01,0x00,0xd3,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x20,0x01,0x00,0xd5,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x09,0x00,0x00,0x20,0x01,0x00,0xd7,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x20,0x01,0x00,0xd9,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0a,0x00,0x00,0x21,0x01,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0a,0x00,0x00,0x20,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0a,0x00,0x00,0x20,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0a,0x00,0x00,0x20,0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0a, 0x00,0x00,0x20,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00, 0x00,0x20,0x01,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, 0x20,0x01,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0a,0x00,0x00,0x20, 0x01,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x00,0x00,0x20,0x01, 0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x00,0x00,0x50,0x08,0x00, 0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x20,0x01,0x00,0xed, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x00,0x00,0x20,0x01,0x00,0xef,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x20,0x01,0x00,0xf1,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0a,0x00,0x00,0x20,0x01,0x00,0xf3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0a,0x00,0x00,0x20,0x01,0x00,0xf5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x20,0x01,0x00,0xf7,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0a,0x00,0x00,0x20,0x01,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0a,0x00,0x00,0x21,0x01,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0a,0x00,0x00,0x20,0x01,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0a,0x00,0x00,0x20,0x01,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0a, 0x00,0x00,0x20,0x01,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x00, 0x00,0x20,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0a,0x00,0x00, 0x20,0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0a,0x00,0x00,0x20, 0x01,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0a,0x00,0x00,0x20,0x01, 0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x50,0x08,0x00, 0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0a,0x00,0x00,0x20,0x01,0x00,0x0b, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0a,0x00,0x00,0x20,0x01,0x00,0x0d,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x00,0x00,0x20,0x01,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0a,0x00,0x00,0x20,0x01,0x00,0x11,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0a,0x00,0x00,0x20,0x01,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0a,0x00,0x00,0x20,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0a,0x00,0x00,0x21,0x01,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0a,0x00,0x00,0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0a,0x00,0x00,0x20,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0a,0x00,0x00,0x20,0x01,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0a, 0x00,0x00,0x20,0x01,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x00, 0x00,0x50,0x08,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0a,0x00,0x00, 0x20,0x01,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0a,0x00,0x00,0x20, 0x01,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0a,0x00,0x00,0x20,0x01, 0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0a,0x00,0x00,0x50,0x08,0x00,0x27, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0a,0x00,0x00,0x20,0x01,0x00,0x29,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0a,0x00,0x00,0x20,0x01,0x00,0x2b,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0a,0x00,0x00,0x20,0x01,0x00,0x2c,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0a,0x00,0x00,0x20,0x01,0x00,0x2d,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0a,0x00,0x00,0x50,0x08,0x00,0x2e,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0a,0x00,0x00,0x21,0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0a,0x00,0x00,0x20,0x01,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0a,0x00,0x00,0x20,0x01,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0a,0x00,0x00,0x50,0x08,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0a, 0x00,0x00,0x20,0x01,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0a,0x00, 0x00,0x20,0x01,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0a,0x00,0x00, 0x20,0x01,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0a,0x00,0x00,0x20, 0x01,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0a,0x00,0x00,0x52,0x40, 0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0a,0x00,0x00,0x52,0x40,0x00, 0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0a,0x00,0x00,0x52,0x40,0x00,0x3a, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0a,0x00,0x00,0x52,0x40,0x00,0x3b,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0a,0x00,0x00,0x52,0x40,0x00,0x3c,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0a,0x00,0x00,0x52,0x40,0x00,0x3d,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x52,0x40,0x00,0x3e,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x52,0x40,0x00,0x3f,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0a,0x00,0x00,0x20,0x01,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0a,0x00,0x00,0x20,0x01,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0a,0x00,0x00,0x20,0x01,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0a,0x00,0x00,0x20,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0a, 0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0a,0x00, 0x00,0x20,0x01,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0a,0x00,0x00, 0x20,0x01,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x20, 0x01,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0a,0x00,0x00,0x20,0x01, 0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0a,0x00,0x00,0x20,0x01,0x00,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0a,0x00,0x00,0x20,0x01,0x00,0x56,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0a,0x00,0x00,0x20,0x01,0x00,0x5a,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0a,0x00,0x00,0x20,0x01,0x00,0x5b,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0a,0x00,0x00,0x20,0x01,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0a,0x00,0x00,0x20,0x01,0x00,0x5f,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0a,0x00,0x00,0x20,0x01,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0a,0x00,0x00,0x20,0x01,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0a,0x00,0x00,0x20,0x01,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0a,0x00,0x00,0x20,0x01,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0a, 0x00,0x00,0x20,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0a,0x00, 0x00,0x20,0x01,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0a,0x00,0x00, 0x20,0x01,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0a,0x00,0x00,0x20, 0x01,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0a,0x00,0x00,0x20,0x01, 0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0a,0x00,0x00,0x20,0x01,0x00,0x79, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0a,0x00,0x00,0x20,0x01,0x00,0x7a,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0a,0x00,0x00,0x20,0x01,0x00,0x7b,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0a,0x00,0x00,0x23,0x02,0x00,0x7f,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0a,0x00,0x00,0x12,0x01,0x00,0x80,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0a,0x00,0x00,0x52,0x00,0x02,0x85,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0a,0x00,0x00,0x52,0x80,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0a,0x00,0x00,0x23,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0a,0x00,0x00,0x12,0x01,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0a,0x00,0x00,0x20,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0a, 0x00,0x00,0x21,0x01,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0a,0x00, 0x00,0x20,0x01,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0a,0x00,0x00, 0x20,0x01,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0a,0x00,0x00,0x20, 0x01,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0a,0x00,0x00,0x20,0x01, 0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0a,0x00,0x00,0x20,0x01,0x00,0x94, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0a,0x00,0x00,0x20,0x01,0x00,0x8a,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0a,0x00,0x00,0x20,0x01,0x00,0x8d,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0a,0x00,0x00,0x20,0x01,0x00,0x99,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0a,0x00,0x00,0x50,0x08,0x00,0x9a,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0a,0x00,0x00,0x20,0x01,0x00,0x9c,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0a,0x00,0x00,0x20,0x01,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0a,0x00,0x00,0x20,0x01,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0a,0x00,0x00,0x20,0x01,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0a,0x00,0x00,0x20,0x01,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0a, 0x00,0x00,0x20,0x01,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0a,0x00, 0x00,0x20,0x01,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0a,0x00,0x00, 0x20,0x01,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0a,0x00,0x00,0x50, 0x08,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0a,0x00,0x00,0x20,0x01, 0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xb1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0a,0x00,0x00,0x20,0x01,0x00,0xb3, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0a,0x00,0x00,0x20,0x01,0x00,0xb5,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0a,0x00,0x00,0x20,0x01,0x00,0xb7,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0a,0x00,0x00,0x21,0x01,0x00,0xb8,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0a,0x00,0x00,0x20,0x01,0x00,0xb9,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0a,0x00,0x00,0x20,0x01,0x00,0xba,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0a,0x00,0x00,0x20,0x01,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0a,0x00,0x00,0x20,0x01,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0a,0x00,0x00,0x20,0x01,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0a,0x00,0x00,0x20,0x01,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0a, 0x00,0x00,0x20,0x01,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0a,0x00, 0x00,0x20,0x01,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0a,0x00,0x00, 0x20,0x01,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x20, 0x01,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0a,0x00,0x00,0x20,0x01, 0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0a,0x00,0x00,0x20,0x01,0x00,0xd2, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0a,0x00,0x00,0x20,0x01,0x00,0xd4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0a,0x00,0x00,0x20,0x01,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x50,0x08,0x00,0xd8,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0a,0x00,0x00,0x20,0x01,0x00,0xda,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0a,0x00,0x00,0x20,0x01,0x00,0xdc,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0a,0x00,0x00,0x20,0x01,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0a,0x00,0x00,0x20,0x01,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0a,0x00,0x00,0x20,0x01,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0a,0x00,0x00,0x20,0x01,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0a, 0x00,0x00,0x20,0x01,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0a,0x00, 0x00,0x21,0x01,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0a,0x00,0x00, 0x20,0x01,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0a,0x00,0x00,0x20, 0x01,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0a,0x00,0x00,0x20,0x01, 0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0a,0x00,0x00,0x20,0x01,0x00,0xef, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0a,0x00,0x00,0x20,0x01,0x00,0xf1,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0a,0x00,0x00,0x20,0x01,0x00,0xf4,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0a,0x00,0x00,0x20,0x01,0x00,0xf7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0a,0x00,0x00,0x20,0x01,0x00,0xf9,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0a,0x00,0x00,0x20,0x01,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0a,0x00,0x00,0x20,0x01,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0a,0x00,0x00,0x20,0x01,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0a,0x00,0x00,0x20,0x01,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0a,0x00,0x00,0x50,0x08,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0a,0x00,0x00,0x20,0x01,0x00, 0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0a,0x00,0x00,0x21,0x01,0x00,0x10, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0a,0x00,0x00,0x20,0x01,0x00,0x11,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0a,0x00,0x00,0x20,0x01,0x00,0x12,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0a,0x00,0x00,0x20,0x01,0x00,0x15,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0a,0x00,0x00,0x20,0x01,0x00,0x18,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0a,0x00,0x00,0x20,0x01,0x00,0x1b,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0a,0x00,0x00,0x20,0x01,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0a,0x00,0x00,0x20,0x01,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0a,0x00,0x00,0x50,0x08,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0a,0x00,0x00,0x20,0x01,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0a,0x00,0x00,0x50,0x08, 0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0a,0x00,0x00,0x20,0x01,0x00, 0x2e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0a,0x00,0x00,0x20,0x01,0x00,0x30, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0a,0x00,0x00,0x20,0x01,0x00,0x31,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0a,0x00,0x00,0x20,0x01,0x00,0x32,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0a,0x00,0x00,0x20,0x01,0x00,0x34,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0a,0x00,0x00,0x50,0x08,0x00,0x35,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0a,0x00,0x00,0x21,0x01,0x00,0x36,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0a,0x00,0x00,0x20,0x01,0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0a,0x00,0x00,0x20,0x01,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0a,0x00,0x00,0x20,0x01,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0a,0x00,0x00,0x50,0x08,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0a,0x00, 0x00,0x52,0x00,0x02,0x42,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0a,0x00,0x00, 0x12,0x01,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0a,0x00,0x00,0x21, 0x01,0x00,0x43,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0a,0x00,0x00,0x20,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0a,0x00,0x00,0x20,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x20,0x01,0x00,0x49,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0a,0x00,0x00,0x20,0x01,0x00,0x4b,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0a,0x00,0x00,0x20,0x01,0x00,0x4d,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0a,0x00,0x00,0x50,0x08,0x00,0x4e,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0a,0x00,0x00,0x20,0x01,0x00,0x50,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0a,0x00,0x00,0x20,0x01,0x00,0x52,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0a,0x00,0x00,0x20,0x01,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0a,0x00,0x00,0x20,0x01,0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0a,0x00,0x00,0x20,0x01,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0a, 0x00,0x00,0x50,0x08,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x5b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0a,0x00,0x00,0x20,0x01,0x00, 0x63,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0a,0x00,0x00,0x21,0x01,0x00,0x64, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0a,0x00,0x00,0x20,0x01,0x00,0x65,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0a,0x00,0x00,0x20,0x01,0x00,0x66,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0a,0x00,0x00,0x20,0x01,0x00,0x68,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0a,0x00,0x00,0x20,0x01,0x00,0x6a,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0a,0x00,0x00,0x20,0x01,0x00,0x6c,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0a,0x00,0x00,0x20,0x01,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0a,0x00,0x00,0x20,0x01,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0a,0x00,0x00,0x20,0x01,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0a,0x00,0x00,0x50,0x08,0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x77,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x79,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0a,0x00,0x00,0x20,0x01,0x00, 0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0a,0x00,0x00,0x20,0x01,0x00,0x83, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0a,0x00,0x00,0x21,0x01,0x00,0x84,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0a,0x00,0x00,0x20,0x01,0x00,0x85,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0a,0x00,0x00,0x20,0x01,0x00,0x86,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0a,0x00,0x00,0x20,0x01,0x00,0x88,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0a,0x00,0x00,0x20,0x01,0x00,0x8a,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0a,0x00,0x00,0x20,0x01,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0a,0x00,0x00,0x20,0x01,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0a,0x00,0x00,0x20,0x01,0x00,0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0a,0x00,0x00,0x50,0x08,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0a,0x00,0x00,0x20,0x01,0x00, 0x9f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0a,0x00,0x00,0x21,0x01,0x00,0xa0, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0a,0x00,0x00,0x20,0x01,0x00,0xa1,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0a,0x00,0x00,0x20,0x01,0x00,0xa2,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0a,0x00,0x00,0x20,0x01,0x00,0xa4,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0a,0x00,0x00,0x20,0x01,0x00,0xa8,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x50,0x08,0x00,0xa9,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0b,0x00,0x00,0x20,0x01,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0b,0x00,0x00,0x20,0x01,0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0b,0x00,0x00,0x20,0x01,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0b,0x00,0x00,0x20,0x01,0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b, 0x00,0x00,0x50,0x08,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0b,0x00, 0x00,0x20,0x01,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00, 0x20,0x01,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0b,0x00,0x00,0x20, 0x01,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0b,0x00,0x00,0x20,0x01, 0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x00,0x00,0x50,0x08,0x00, 0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x00,0x00,0x21,0x01,0x00,0xb9, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x20,0x01,0x00,0xba,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x20,0x01,0x00,0xbc,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x00,0x00,0x50,0x08,0x00,0xbd,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0b,0x00,0x00,0x20,0x01,0x00,0xbe,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0b,0x00,0x00,0x52,0x00,0x02,0xc2,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0b,0x00,0x00,0x12,0x01,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0b,0x00,0x00,0x50,0x08,0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0b,0x00,0x00,0x20,0x01,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0b,0x00,0x00,0x20,0x01,0x00,0xc7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0b, 0x00,0x00,0x20,0x01,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0b,0x00, 0x00,0x20,0x01,0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0b,0x00,0x00, 0x20,0x01,0x00,0xcd,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x00,0x00,0x50, 0x08,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x00,0x00,0x20,0x01, 0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0b,0x00,0x00,0x20,0x01,0x00, 0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0b,0x00,0x00,0x20,0x01,0x00,0xd4, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0b,0x00,0x00,0x20,0x01,0x00,0xd6,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0b,0x00,0x00,0x20,0x01,0x00,0xd8,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0b,0x00,0x00,0x20,0x01,0x00,0xda,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0b,0x00,0x00,0x20,0x01,0x00,0xdc,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0b,0x00,0x00,0x50,0x08,0x00,0xdd,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0b,0x00,0x00,0x20,0x01,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0b,0x00,0x00,0x20,0x01,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0b,0x00,0x00,0x20,0x01,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0b,0x00,0x00,0x20,0x01,0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0b, 0x00,0x00,0x20,0x01,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0b,0x00, 0x00,0x20,0x01,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0b,0x00,0x00, 0x50,0x08,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0b,0x00,0x00,0x20, 0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0b,0x00,0x00,0x20,0x01, 0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0b,0x00,0x00,0x20,0x01,0x00, 0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0b,0x00,0x00,0x50,0x08,0x00,0xf1, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0b,0x00,0x00,0x50,0x08,0x00,0xf2,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0b,0x00,0x00,0x20,0x01,0x00,0xf3,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0b,0x00,0x00,0x52,0x00,0x02,0xf7,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0b,0x00,0x00,0x12,0x01,0x00,0xf5,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0b,0x00,0x00,0x21,0x01,0x00,0xf8,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0b,0x00,0x00,0x20,0x01,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0b,0x00,0x00,0x20,0x01,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0b,0x00,0x00,0x20,0x01,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0b,0x00,0x00,0x20,0x01,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0b, 0x00,0x00,0x20,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0b,0x00, 0x00,0x20,0x01,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0b,0x00,0x00, 0x50,0x08,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0b,0x00,0x00,0x20, 0x01,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0b,0x00,0x00,0x20,0x01, 0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0b,0x00,0x00,0x20,0x01,0x00,0x0a, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0b,0x00,0x00,0x20,0x01,0x00,0x0d,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0b,0x00,0x00,0x50,0x08,0x00,0x0e,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0b,0x00,0x00,0x20,0x01,0x00,0x10,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0b,0x00,0x00,0x20,0x01,0x00,0x12,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x20,0x01,0x00,0x14,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0b,0x00,0x00,0x20,0x01,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0b,0x00,0x00,0x20,0x01,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0b,0x00,0x00,0x21,0x01,0x00,0x19,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0b,0x00,0x00,0x20,0x01,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0b, 0x00,0x00,0x20,0x01,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0b,0x00, 0x00,0x20,0x01,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0b,0x00,0x00, 0x20,0x01,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0b,0x00,0x00,0x20, 0x01,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0b,0x00,0x00,0x20,0x01, 0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0b,0x00,0x00,0x20,0x01,0x00,0x29, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x00,0x00,0x50,0x08,0x00,0x2a,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0b,0x00,0x00,0x20,0x01,0x00,0x2c,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0b,0x00,0x00,0x20,0x01,0x00,0x2e,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0b,0x00,0x00,0x20,0x01,0x00,0x30,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0b,0x00,0x00,0x20,0x01,0x00,0x32,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0b,0x00,0x00,0x20,0x01,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0b,0x00,0x00,0x20,0x01,0x00,0x36,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0b,0x00,0x00,0x20,0x01,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0b,0x00,0x00,0x21,0x01,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0b, 0x00,0x00,0x20,0x01,0x00,0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0b,0x00, 0x00,0x20,0x01,0x00,0x3b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0b,0x00,0x00, 0x20,0x01,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0b,0x00,0x00,0x20, 0x01,0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0b,0x00,0x00,0x20,0x01, 0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x43,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0b,0x00,0x00,0x20,0x01,0x00,0x47, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0b,0x00,0x00,0x50,0x08,0x00,0x48,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0b,0x00,0x00,0x20,0x01,0x00,0x4a,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0b,0x00,0x00,0x20,0x01,0x00,0x4c,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0b,0x00,0x00,0x20,0x01,0x00,0x4e,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0b,0x00,0x00,0x20,0x01,0x00,0x50,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0b,0x00,0x00,0x20,0x01,0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0b,0x00,0x00,0x20,0x01,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0b,0x00,0x00,0x21,0x01,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0b,0x00,0x00,0x20,0x01,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0b, 0x00,0x00,0x20,0x01,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0b,0x00, 0x00,0x20,0x01,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0b,0x00,0x00, 0x20,0x01,0x00,0x5d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0b,0x00,0x00,0x50, 0x08,0x00,0x5e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0b,0x00,0x00,0x20,0x01, 0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0b,0x00,0x00,0x20,0x01,0x00,0x64, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0b,0x00,0x00,0x20,0x01,0x00,0x65,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x50,0x08,0x00,0x66,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0b,0x00,0x00,0x20,0x01,0x00,0x68,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0b,0x00,0x00,0x20,0x01,0x00,0x6a,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0b,0x00,0x00,0x20,0x01,0x00,0x6b,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0b,0x00,0x00,0x20,0x01,0x00,0x6c,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0b,0x00,0x00,0x50,0x08,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0b,0x00,0x00,0x21,0x01,0x00,0x6e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0b,0x00,0x00,0x20,0x01,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0b, 0x00,0x00,0x20,0x01,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0b,0x00, 0x00,0x50,0x08,0x00,0x72,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0b,0x00,0x00, 0x20,0x01,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0b,0x00,0x00,0x20, 0x01,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0b,0x00,0x00,0x20,0x01, 0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x76,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0b,0x00,0x00,0x52,0x40,0x00,0x77, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0b,0x00,0x00,0x52,0x40,0x00,0x78,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0b,0x00,0x00,0x52,0x40,0x00,0x79,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0b,0x00,0x00,0x52,0x40,0x00,0x7a,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0b,0x00,0x00,0x52,0x40,0x00,0x7b,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0b,0x00,0x00,0x52,0x40,0x00,0x7c,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0b,0x00,0x00,0x52,0x40,0x00,0x7d,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0b,0x00,0x00,0x52,0x40,0x00,0x7e,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0b,0x00,0x00,0x20,0x01,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0b,0x00,0x00,0x20,0x01,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0b, 0x00,0x00,0x20,0x01,0x00,0x82,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0b,0x00, 0x00,0x20,0x01,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0b,0x00,0x00, 0x20,0x01,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x20, 0x01,0x00,0x8a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0b,0x00,0x00,0x20,0x01, 0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x8d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0b,0x00,0x00,0x20,0x01,0x00,0x8f, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0b,0x00,0x00,0x20,0x01,0x00,0x91,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0b,0x00,0x00,0x20,0x01,0x00,0x93,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0b,0x00,0x00,0x20,0x01,0x00,0x95,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0b,0x00,0x00,0x20,0x01,0x00,0x99,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0b,0x00,0x00,0x20,0x01,0x00,0x9a,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0b,0x00,0x00,0x20,0x01,0x00,0x9c,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0b,0x00,0x00,0x20,0x01,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0b,0x00,0x00,0x20,0x01,0x00,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0b,0x00,0x00,0x20,0x01,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0b, 0x00,0x00,0x20,0x01,0x00,0xa6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0b,0x00, 0x00,0x20,0x01,0x00,0xa7,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0b,0x00,0x00, 0x20,0x01,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0b,0x00,0x00,0x20, 0x01,0x00,0xad,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0b,0x00,0x00,0x20,0x01, 0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0b,0x00,0x00,0x20,0x01,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0b,0x00,0x00,0x20,0x01,0x00,0xb2, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0b,0x00,0x00,0x20,0x01,0x00,0xb6,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x20,0x01,0x00,0xb8,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0b,0x00,0x00,0x20,0x01,0x00,0xb9,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0b,0x00,0x00,0x20,0x01,0x00,0xba,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x23,0x02,0x00,0xc1,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0b,0x00,0x00,0x12,0x01,0x00,0xc2,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0b,0x00,0x00,0x52,0x00,0x02,0xc7,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0b,0x00,0x00,0x52,0x80,0x00,0xb7,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0b,0x00,0x00,0x23,0x02,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0b, 0x00,0x00,0x12,0x01,0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0b,0x00, 0x00,0x20,0x01,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0b,0x00,0x00, 0x21,0x01,0x00,0xc8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x20, 0x01,0x00,0xc9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x20,0x01, 0x00,0xca,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0b,0x00,0x00,0x20,0x01,0x00, 0xcd,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x20,0x01,0x00,0xd0, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x20,0x01,0x00,0xd3,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x20,0x01,0x00,0xd6,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0b,0x00,0x00,0x20,0x01,0x00,0xcc,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0b,0x00,0x00,0x20,0x01,0x00,0xcf,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0b,0x00,0x00,0x20,0x01,0x00,0xdb,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0b,0x00,0x00,0x50,0x08,0x00,0xdc,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0b,0x00,0x00,0x20,0x01,0x00,0xde,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0b,0x00,0x00,0x20,0x01,0x00,0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0b,0x00,0x00,0x20,0x01,0x00,0xe2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0b, 0x00,0x00,0x20,0x01,0x00,0xe3,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0b,0x00, 0x00,0x20,0x01,0x00,0xe5,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0b,0x00,0x00, 0x20,0x01,0x00,0xe8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0b,0x00,0x00,0x20, 0x01,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0b,0x00,0x00,0x20,0x01, 0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0b,0x00,0x00,0x50,0x08,0x00, 0xef,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0b,0x00,0x00,0x20,0x01,0x00,0xf1, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0b,0x00,0x00,0x20,0x01,0x00,0xf3,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0b,0x00,0x00,0x20,0x01,0x00,0xf5,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x20,0x01,0x00,0xf7,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0b,0x00,0x00,0x20,0x01,0x00,0xf9,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0b,0x00,0x00,0x21,0x01,0x00,0xfa,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0b,0x00,0x00,0x20,0x01,0x00,0xfb,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0b,0x00,0x00,0x20,0x01,0x00,0xfc,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0b,0x00,0x00,0x20,0x01,0x00,0xfe,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0b, 0x00,0x00,0x20,0x01,0x00,0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0b,0x00, 0x00,0x20,0x01,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x0c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0b,0x00,0x00,0x20,0x01,0x00, 0x0e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0b,0x00,0x00,0x20,0x01,0x00,0x10, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0b,0x00,0x00,0x20,0x01,0x00,0x12,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0b,0x00,0x00,0x20,0x01,0x00,0x14,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0b,0x00,0x00,0x20,0x01,0x00,0x16,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0b,0x00,0x00,0x20,0x01,0x00,0x19,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0b,0x00,0x00,0x50,0x08,0x00,0x1a,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0b,0x00,0x00,0x20,0x01,0x00,0x1c,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0b,0x00,0x00,0x20,0x01,0x00,0x1e,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0b,0x00,0x00,0x20,0x01,0x00,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x22,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0b, 0x00,0x00,0x20,0x01,0x00,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0b,0x00, 0x00,0x20,0x01,0x00,0x26,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0b,0x00,0x00,0x21, 0x01,0x00,0x29,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x2a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0b,0x00,0x00,0x20,0x01,0x00, 0x2b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0b,0x00,0x00,0x20,0x01,0x00,0x2d, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0b,0x00,0x00,0x20,0x01,0x00,0x2f,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0b,0x00,0x00,0x20,0x01,0x00,0x31,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0b,0x00,0x00,0x20,0x01,0x00,0x33,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0b,0x00,0x00,0x20,0x01,0x00,0x36,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0b,0x00,0x00,0x20,0x01,0x00,0x39,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0b,0x00,0x00,0x20,0x01,0x00,0x3b,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0b,0x00,0x00,0x20,0x01,0x00,0x3d,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0b,0x00,0x00,0x20,0x01,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0b, 0x00,0x00,0x20,0x01,0x00,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0b,0x00, 0x00,0x50,0x08,0x00,0x45,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x47,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x4b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0b,0x00,0x00,0x20,0x01,0x00, 0x4d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0b,0x00,0x00,0x20,0x01,0x00,0x4f, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0b,0x00,0x00,0x20,0x01,0x00,0x51,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0b,0x00,0x00,0x21,0x01,0x00,0x52,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0b,0x00,0x00,0x20,0x01,0x00,0x53,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0b,0x00,0x00,0x20,0x01,0x00,0x54,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0b,0x00,0x00,0x20,0x01,0x00,0x57,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0b,0x00,0x00,0x20,0x01,0x00,0x5a,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0b,0x00,0x00,0x20,0x01,0x00,0x5d,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0b,0x00,0x00,0x20,0x01,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0b, 0x00,0x00,0x50,0x08,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0b,0x00, 0x00,0x20,0x01,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0b,0x00,0x00,0x20,0x01,0x00, 0x6d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0b,0x00,0x00,0x50,0x08,0x00,0x6e, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0b,0x00,0x00,0x20,0x01,0x00,0x70,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0b,0x00,0x00,0x20,0x01,0x00,0x72,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0b,0x00,0x00,0x20,0x01,0x00,0x73,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0b,0x00,0x00,0x20,0x01,0x00,0x74,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x20,0x01,0x00,0x76,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0x00,0x00,0x50,0x08,0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0c,0x00,0x00,0x21,0x01,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0c,0x00,0x00,0x20,0x01,0x00,0x79,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0c,0x00,0x00,0x20,0x01,0x00,0x7a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0c, 0x00,0x00,0x20,0x01,0x00,0x7e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0c,0x00, 0x00,0x50,0x08,0x00,0x7f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, 0x20,0x01,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x52, 0x00,0x02,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0c,0x00,0x00,0x12,0x01, 0x00,0x82,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0c,0x00,0x00,0x21,0x01,0x00, 0x85,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x00,0x00,0x20,0x01,0x00,0x86, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x20,0x01,0x00,0x87,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0c,0x00,0x00,0x20,0x01,0x00,0x89,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x20,0x01,0x00,0x8b,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0c,0x00,0x00,0x20,0x01,0x00,0x8d,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x01,0x00,0x8f,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0c,0x00,0x00,0x50,0x08,0x00,0x90,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0c,0x00,0x00,0x20,0x01,0x00,0x92,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0c,0x00,0x00,0x20,0x01,0x00,0x94,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0c,0x00,0x00,0x20,0x01,0x00,0x96,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0c, 0x00,0x00,0x20,0x01,0x00,0x97,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0c,0x00, 0x00,0x20,0x01,0x00,0x9a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0c,0x00,0x00, 0x50,0x08,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0x00,0x00,0x20, 0x01,0x00,0x9d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0c,0x00,0x00,0x20,0x01, 0x00,0x9f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xa1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x20,0x01,0x00,0xa3, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0c,0x00,0x00,0x20,0x01,0x00,0xa5,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x21,0x01,0x00,0xa6,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0c,0x00,0x00,0x20,0x01,0x00,0xa7,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x20,0x01,0x00,0xa8,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x01,0x00,0xaa,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0c,0x00,0x00,0x20,0x01,0x00,0xac,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0c,0x00,0x00,0x20,0x01,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0c,0x00,0x00,0x20,0x01,0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0c,0x00,0x00,0x20,0x01,0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c, 0x00,0x00,0x20,0x01,0x00,0xb6,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0c,0x00, 0x00,0x50,0x08,0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0c,0x00,0x00, 0x20,0x01,0x00,0xb9,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0c,0x00,0x00,0x20, 0x01,0x00,0xbb,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x20,0x01, 0x00,0xbd,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xbf,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0c,0x00,0x00,0x20,0x01,0x00,0xc1, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0c,0x00,0x00,0x20,0x01,0x00,0xc3,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0c,0x00,0x00,0x20,0x01,0x00,0xc5,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0c,0x00,0x00,0x21,0x01,0x00,0xc6,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0c,0x00,0x00,0x20,0x01,0x00,0xc7,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0c,0x00,0x00,0x20,0x01,0x00,0xc8,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0c,0x00,0x00,0x20,0x01,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0c,0x00,0x00,0x20,0x01,0x00,0xcc,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0c,0x00,0x00,0x20,0x01,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0c,0x00,0x00,0x20,0x01,0x00,0xd0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0c, 0x00,0x00,0x20,0x01,0x00,0xd4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0c,0x00, 0x00,0x50,0x08,0x00,0xd5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0c,0x00,0x00, 0x20,0x01,0x00,0xd7,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0c,0x00,0x00,0x20, 0x01,0x00,0xd9,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0c,0x00,0x00,0x20,0x01, 0x00,0xdb,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xdd,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0c,0x00,0x00,0x20,0x01,0x00,0xdf, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0c,0x00,0x00,0x20,0x01,0x00,0xe1,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0c,0x00,0x00,0x21,0x01,0x00,0xe2,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0c,0x00,0x00,0x20,0x01,0x00,0xe3,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0c,0x00,0x00,0x20,0x01,0x00,0xe4,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0c,0x00,0x00,0x20,0x01,0x00,0xe6,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0c,0x00,0x00,0x20,0x01,0x00,0xea,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0c,0x00,0x00,0x50,0x08,0x00,0xeb,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0c,0x00,0x00,0x20,0x01,0x00,0xed,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0c,0x00,0x00,0x20,0x01,0x00,0xef,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0c, 0x00,0x00,0x20,0x01,0x00,0xf1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0c,0x00, 0x00,0x20,0x01,0x00,0xf2,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0c,0x00,0x00, 0x50,0x08,0x00,0xf3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0c,0x00,0x00,0x20, 0x01,0x00,0xf5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0c,0x00,0x00,0x20,0x01, 0x00,0xf7,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xf8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0c,0x00,0x00,0x20,0x01,0x00,0xf9, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0c,0x00,0x00,0x50,0x08,0x00,0xfa,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0c,0x00,0x00,0x21,0x01,0x00,0xfb,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0c,0x00,0x00,0x20,0x01,0x00,0xfc,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0c,0x00,0x00,0x20,0x01,0x00,0xfe,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0c,0x00,0x00,0x50,0x08,0x00,0xff,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0c,0x00,0x00,0x20,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0c,0x00,0x00,0x52,0x00,0x02,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0c,0x00,0x00,0x12,0x01,0x00,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0c,0x00,0x00,0x50,0x08,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0c, 0x00,0x00,0x20,0x01,0x00,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0c,0x00, 0x00,0x20,0x01,0x00,0x09,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0c,0x00,0x00, 0x20,0x01,0x00,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x20, 0x01,0x00,0x0d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0c,0x00,0x00,0x20,0x01, 0x00,0x0f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0c,0x00,0x00,0x50,0x08,0x00, 0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0c,0x00,0x00,0x20,0x01,0x00,0x12, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0c,0x00,0x00,0x20,0x01,0x00,0x14,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0c,0x00,0x00,0x20,0x01,0x00,0x16,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0c,0x00,0x00,0x20,0x01,0x00,0x18,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0c,0x00,0x00,0x20,0x01,0x00,0x1a,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0c,0x00,0x00,0x20,0x01,0x00,0x1c,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0c,0x00,0x00,0x20,0x01,0x00,0x1e,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0c,0x00,0x00,0x50,0x08,0x00,0x1f,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0c,0x00,0x00,0x20,0x01,0x00,0x21,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0c,0x00,0x00,0x20,0x01,0x00,0x23,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0c, 0x00,0x00,0x20,0x01,0x00,0x25,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0c,0x00, 0x00,0x20,0x01,0x00,0x27,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0c,0x00,0x00, 0x20,0x01,0x00,0x29,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0c,0x00,0x00,0x20, 0x01,0x00,0x2b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0c,0x00,0x00,0x50,0x08, 0x00,0x2c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x2e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0c,0x00,0x00,0x20,0x01,0x00,0x30, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0c,0x00,0x00,0x20,0x01,0x00,0x32,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0c,0x00,0x00,0x50,0x08,0x00,0x33,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0c,0x00,0x00,0x50,0x08,0x00,0x34,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0c,0x00,0x00,0x20,0x01,0x00,0x35,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0c,0x00,0x00,0x52,0x00,0x02,0x39,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0c,0x00,0x00,0x12,0x01,0x00,0x37,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0c,0x00,0x00,0x21,0x01,0x00,0x3a,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0c,0x00,0x00,0x20,0x01,0x00,0x3b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0c,0x00,0x00,0x20,0x01,0x00,0x3c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0c, 0x00,0x00,0x20,0x01,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0c,0x00, 0x00,0x20,0x01,0x00,0x40,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0c,0x00,0x00, 0x20,0x01,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x00,0x00,0x20, 0x01,0x00,0x44,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0c,0x00,0x00,0x50,0x08, 0x00,0x45,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x47,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0c,0x00,0x00,0x20,0x01,0x00,0x49, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0c,0x00,0x00,0x20,0x01,0x00,0x4b,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0c,0x00,0x00,0x20,0x01,0x00,0x4c,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0c,0x00,0x00,0x20,0x01,0x00,0x4f,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0c,0x00,0x00,0x50,0x08,0x00,0x50,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0c,0x00,0x00,0x20,0x01,0x00,0x52,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0c,0x00,0x00,0x20,0x01,0x00,0x54,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0c,0x00,0x00,0x20,0x01,0x00,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0c,0x00,0x00,0x20,0x01,0x00,0x58,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0c,0x00,0x00,0x20,0x01,0x00,0x5a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0c, 0x00,0x00,0x21,0x01,0x00,0x5b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0c,0x00, 0x00,0x20,0x01,0x00,0x5c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0c,0x00,0x00, 0x20,0x01,0x00,0x5d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0c,0x00,0x00,0x20, 0x01,0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0c,0x00,0x00,0x20,0x01, 0x00,0x61,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x63,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0c,0x00,0x00,0x20,0x01,0x00,0x65, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0c,0x00,0x00,0x20,0x01,0x00,0x67,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0c,0x00,0x00,0x20,0x01,0x00,0x6b,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0c,0x00,0x00,0x50,0x08,0x00,0x6c,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0c,0x00,0x00,0x20,0x01,0x00,0x6e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0c,0x00,0x00,0x20,0x01,0x00,0x70,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0c,0x00,0x00,0x20,0x01,0x00,0x72,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0c,0x00,0x00,0x20,0x01,0x00,0x74,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0c,0x00,0x00,0x20,0x01,0x00,0x76,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0c,0x00,0x00,0x20,0x01,0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0c, 0x00,0x00,0x20,0x01,0x00,0x7a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0c,0x00, 0x00,0x21,0x01,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0c,0x00,0x00, 0x20,0x01,0x00,0x7c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0c,0x00,0x00,0x20, 0x01,0x00,0x7d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0c,0x00,0x00,0x20,0x01, 0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x81,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0c,0x00,0x00,0x20,0x01,0x00,0x83, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0c,0x00,0x00,0x20,0x01,0x00,0x85,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x20,0x01,0x00,0x89,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0c,0x00,0x00,0x50,0x08,0x00,0x8a,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0c,0x00,0x00,0x20,0x01,0x00,0x8c,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0c,0x00,0x00,0x20,0x01,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0c,0x00,0x00,0x20,0x01,0x00,0x90,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0c,0x00,0x00,0x20,0x01,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0c,0x00,0x00,0x20,0x01,0x00,0x94,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0c,0x00,0x00,0x20,0x01,0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0c, 0x00,0x00,0x21,0x01,0x00,0x97,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0c,0x00, 0x00,0x20,0x01,0x00,0x98,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0c,0x00,0x00, 0x20,0x01,0x00,0x99,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0c,0x00,0x00,0x20, 0x01,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0c,0x00,0x00,0x20,0x01, 0x00,0x9f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0c,0x00,0x00,0x50,0x08,0x00, 0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0c,0x00,0x00,0x20,0x01,0x00,0xa2, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0c,0x00,0x00,0x20,0x01,0x00,0xa4,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0c,0x00,0x00,0x20,0x01,0x00,0xa6,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0c,0x00,0x00,0x20,0x01,0x00,0xa7,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0c,0x00,0x00,0x50,0x08,0x00,0xa8,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0c,0x00,0x00,0x20,0x01,0x00,0xaa,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0c,0x00,0x00,0x20,0x01,0x00,0xac,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0c,0x00,0x00,0x20,0x01,0x00,0xad,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0c,0x00,0x00,0x20,0x01,0x00,0xae,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0c,0x00,0x00,0x50,0x08,0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0c, 0x00,0x00,0x21,0x01,0x00,0xb0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0c,0x00, 0x00,0x20,0x01,0x00,0xb1,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0c,0x00,0x00, 0x20,0x01,0x00,0xb3,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0c,0x00,0x00,0x50, 0x08,0x00,0xb4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0c,0x00,0x00,0x20,0x01, 0x00,0xb5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0c,0x00,0x00,0x20,0x01,0x00, 0xb6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0c,0x00,0x00,0x20,0x01,0x00,0xb7, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0c,0x00,0x00,0x20,0x01,0x00,0xb8,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0c,0x00,0x00,0x52,0x40,0x00,0xb9,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0c,0x00,0x00,0x52,0x40,0x00,0xba,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0c,0x00,0x00,0x52,0x40,0x00,0xbb,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0c,0x00,0x00,0x52,0x40,0x00,0xbc,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0c,0x00,0x00,0x52,0x40,0x00,0xbd,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0c,0x00,0x00,0x52,0x40,0x00,0xbe,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0c,0x00,0x00,0x52,0x40,0x00,0xbf,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0c,0x00,0x00,0x52,0x40,0x00,0xc0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0c, 0x00,0x00,0x20,0x01,0x00,0xc1,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0c,0x00, 0x00,0x20,0x01,0x00,0xc2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0c,0x00,0x00, 0x20,0x01,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x20, 0x01,0x00,0xc6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0c,0x00,0x00,0x20,0x01, 0x00,0xc8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0c,0x00,0x00,0x20,0x01,0x00, 0xcc,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0c,0x00,0x00,0x20,0x01,0x00,0xcd, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0c,0x00,0x00,0x20,0x01,0x00,0xcf,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0c,0x00,0x00,0x20,0x01,0x00,0xd1,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0c,0x00,0x00,0x20,0x01,0x00,0xd3,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0c,0x00,0x00,0x20,0x01,0x00,0xd5,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0c,0x00,0x00,0x20,0x01,0x00,0xd7,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0c,0x00,0x00,0x20,0x01,0x00,0xdb,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0c,0x00,0x00,0x20,0x01,0x00,0xdc,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0c,0x00,0x00,0x20,0x01,0x00,0xde,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0c,0x00,0x00,0x20,0x01,0x00,0xe0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0c, 0x00,0x00,0x20,0x01,0x00,0xe2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0c,0x00, 0x00,0x20,0x01,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0c,0x00,0x00, 0x20,0x01,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0c,0x00,0x00,0x20, 0x01,0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0c,0x00,0x00,0x20,0x01, 0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0c,0x00,0x00,0x20,0x01,0x00, 0xef,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0c,0x00,0x00,0x20,0x01,0x00,0xf0, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0c,0x00,0x00,0x20,0x01,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0c,0x00,0x00,0x20,0x01,0x00,0xf4,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0c,0x00,0x00,0x20,0x01,0x00,0xf8,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0c,0x00,0x00,0x20,0x01,0x00,0xfa,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0c,0x00,0x00,0x20,0x01,0x00,0xfb,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0c,0x00,0x00,0x20,0x01,0x00,0xfc,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0c,0x00,0x00,0x23,0x02,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0c,0x00,0x00,0x12,0x01,0x00,0x02,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0c,0x00,0x00,0x52,0x00,0x02,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0c, 0x00,0x00,0x52,0x80,0x00,0xf9,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0c,0x00, 0x00,0x23,0x02,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0c,0x00,0x00, 0x12,0x01,0x00,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0c,0x00,0x00,0x20, 0x01,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0c,0x00,0x00,0x21,0x01, 0x00,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x20,0x01,0x00, 0x0a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0c,0x00,0x00,0x20,0x01,0x00,0x0b, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0c,0x00,0x00,0x20,0x01,0x00,0x0e,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0c,0x00,0x00,0x20,0x01,0x00,0x11,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x20,0x01,0x00,0x14,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0c,0x00,0x00,0x20,0x01,0x00,0x17,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0c,0x00,0x00,0x20,0x01,0x00,0x0d,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0c,0x00,0x00,0x20,0x01,0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0c,0x00,0x00,0x20,0x01,0x00,0x1c,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0c,0x00,0x00,0x50,0x08,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0c,0x00,0x00,0x20,0x01,0x00,0x1e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0c, 0x00,0x00,0x20,0x01,0x00,0x20,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0c,0x00, 0x00,0x20,0x01,0x00,0x22,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0c,0x00,0x00, 0x20,0x01,0x00,0x23,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0c,0x00,0x00,0x20, 0x01,0x00,0x25,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0c,0x00,0x00,0x20,0x01, 0x00,0x28,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0c,0x00,0x00,0x20,0x01,0x00, 0x13,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0c,0x00,0x00,0x20,0x01,0x00,0x2e, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0c,0x00,0x00,0x20,0x01,0x00,0x30,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0c,0x00,0x00,0x20,0x01,0x00,0x32,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0c,0x00,0x00,0x20,0x01,0x00,0x34,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0c,0x00,0x00,0x20,0x01,0x00,0x35,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x20,0x01,0x00,0x37,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0d,0x00,0x00,0x21,0x01,0x00,0x38,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0d,0x00,0x00,0x20,0x01,0x00,0x39,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0d,0x00,0x00,0x20,0x01,0x00,0x3a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0d,0x00,0x00,0x20,0x01,0x00,0x3c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0d, 0x00,0x00,0x20,0x01,0x00,0x3e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0d,0x00, 0x00,0x20,0x01,0x00,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0d,0x00,0x00, 0x20,0x01,0x00,0x42,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x20, 0x01,0x00,0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0d,0x00,0x00,0x20,0x01, 0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x4a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0d,0x00,0x00,0x20,0x01,0x00,0x4c, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x00,0x00,0x20,0x01,0x00,0x4e,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x00,0x00,0x20,0x01,0x00,0x50,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0d,0x00,0x00,0x20,0x01,0x00,0x52,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0d,0x00,0x00,0x20,0x01,0x00,0x54,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0d,0x00,0x00,0x20,0x01,0x00,0x57,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0d,0x00,0x00,0x20,0x01,0x00,0x59,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0d,0x00,0x00,0x20,0x01,0x00,0x5b,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0d,0x00,0x00,0x20,0x01,0x00,0x5d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0d,0x00,0x00,0x20,0x01,0x00,0x5e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0d, 0x00,0x00,0x20,0x01,0x00,0x60,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0d,0x00, 0x00,0x20,0x01,0x00,0x62,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0d,0x00,0x00, 0x20,0x01,0x00,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0d,0x00,0x00,0x21, 0x01,0x00,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0d,0x00,0x00,0x20,0x01, 0x00,0x66,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x67,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0d,0x00,0x00,0x20,0x01,0x00,0x69, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0d,0x00,0x00,0x20,0x01,0x00,0x6b,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x00,0x00,0x20,0x01,0x00,0x6d,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0d,0x00,0x00,0x20,0x01,0x00,0x6f,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0d,0x00,0x00,0x20,0x01,0x00,0x72,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0d,0x00,0x00,0x20,0x01,0x00,0x75,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0d,0x00,0x00,0x20,0x01,0x00,0x77,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0d,0x00,0x00,0x20,0x01,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0d,0x00,0x00,0x20,0x01,0x00,0x7b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0d,0x00,0x00,0x20,0x01,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0d, 0x00,0x00,0x20,0x01,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0d,0x00, 0x00,0x20,0x01,0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0d,0x00,0x00, 0x20,0x01,0x00,0x84,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0d,0x00,0x00,0x20, 0x01,0x00,0x86,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0d,0x00,0x00,0x20,0x01, 0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x89,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0d,0x00,0x00,0x20,0x01,0x00,0x8b, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0d,0x00,0x00,0x21,0x01,0x00,0x8c,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x20,0x01,0x00,0x8d,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0d,0x00,0x00,0x20,0x01,0x00,0x8e,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0d,0x00,0x00,0x20,0x01,0x00,0x91,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0d,0x00,0x00,0x20,0x01,0x00,0x94,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0d,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0d,0x00,0x00,0x20,0x01,0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0d,0x00,0x00,0x20,0x01,0x00,0x9a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0d,0x00,0x00,0x20,0x01,0x00,0x9c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0d, 0x00,0x00,0x20,0x01,0x00,0x9e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0d,0x00, 0x00,0x20,0x01,0x00,0xa0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0d,0x00,0x00, 0x20,0x01,0x00,0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0d,0x00,0x00,0x20, 0x01,0x00,0xa6,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0d,0x00,0x00,0x20,0x01, 0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0d,0x00,0x00,0x20,0x01,0x00, 0xa9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0d,0x00,0x00,0x20,0x01,0x00,0xaa, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0d,0x00,0x00,0x20,0x01,0x00,0xac,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0d,0x00,0x00,0x21,0x01,0x00,0xad,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0d,0x00,0x00,0x20,0x01,0x00,0xae,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0d,0x00,0x00,0x20,0x01,0x00,0xaf,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0d,0x00,0x00,0x20,0x01,0x00,0xb3,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0d,0x00,0x00,0x20,0x01,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0d,0x00,0x00,0x52,0x00,0x02,0xb8,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0d,0x00,0x00,0x12,0x01,0x00,0xb6,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0d,0x00,0x00,0x21,0x01,0x00,0xb9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0d, 0x00,0x00,0x20,0x01,0x00,0xba,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0d,0x00, 0x00,0x20,0x01,0x00,0xbb,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0d,0x00,0x00, 0x20,0x01,0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x20, 0x01,0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0d,0x00,0x00,0x20,0x01, 0x00,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0d,0x00,0x00,0x20,0x01,0x00, 0xc3,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0d,0x00,0x00,0x20,0x01,0x00,0xc5, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0d,0x00,0x00,0x20,0x01,0x00,0xc7,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0d,0x00,0x00,0x20,0x01,0x00,0xc9,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0d,0x00,0x00,0x20,0x01,0x00,0xca,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0d,0x00,0x00,0x20,0x01,0x00,0xcd,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0d,0x00,0x00,0x20,0x01,0x00,0xcf,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0d,0x00,0x00,0x20,0x01,0x00,0xd1,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0d,0x00,0x00,0x20,0x01,0x00,0xd3,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0d,0x00,0x00,0x20,0x01,0x00,0xd4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0d,0x00,0x00,0x20,0x01,0x00,0xd6,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0d, 0x00,0x00,0x21,0x01,0x00,0xd7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0d,0x00, 0x00,0x20,0x01,0x00,0xd8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0d,0x00,0x00, 0x20,0x01,0x00,0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0d,0x00,0x00,0x20, 0x01,0x00,0xdb,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0d,0x00,0x00,0x20,0x01, 0x00,0xdd,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0d,0x00,0x00,0x20,0x01,0x00, 0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0d,0x00,0x00,0x20,0x01,0x00,0xe1, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0d,0x00,0x00,0x20,0x01,0x00,0xe3,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0d,0x00,0x00,0x20,0x01,0x00,0xe7,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0d,0x00,0x00,0x20,0x01,0x00,0xe9,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0d,0x00,0x00,0x20,0x01,0x00,0xeb,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0d,0x00,0x00,0x20,0x01,0x00,0xed,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0d,0x00,0x00,0x20,0x01,0x00,0xee,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0d,0x00,0x00,0x20,0x01,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0d,0x00,0x00,0x20,0x01,0x00,0xf2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0d,0x00,0x00,0x20,0x01,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0d, 0x00,0x00,0x21,0x01,0x00,0xf5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0d,0x00, 0x00,0x20,0x01,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0d,0x00,0x00, 0x20,0x01,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0d,0x00,0x00,0x20, 0x01,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0d,0x00,0x00,0x20,0x01, 0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0d,0x00,0x00,0x20,0x01,0x00, 0xfd,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0d,0x00,0x00,0x20,0x01,0x00,0xff, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0d,0x00,0x00,0x20,0x01,0x00,0x03,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0d,0x00,0x00,0x20,0x01,0x00,0x05,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0d,0x00,0x00,0x20,0x01,0x00,0x07,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0d,0x00,0x00,0x20,0x01,0x00,0x09,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0d,0x00,0x00,0x20,0x01,0x00,0x0a,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0d,0x00,0x00,0x20,0x01,0x00,0x0c,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0d,0x00,0x00,0x20,0x01,0x00,0x0e,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0d,0x00,0x00,0x21,0x01,0x00,0x0f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0d,0x00,0x00,0x20,0x01,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0d, 0x00,0x00,0x20,0x01,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0d,0x00, 0x00,0x20,0x01,0x00,0x16,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0d,0x00,0x00, 0x20,0x01,0x00,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0d,0x00,0x00,0x20, 0x01,0x00,0x1a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0d,0x00,0x00,0x20,0x01, 0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0d,0x00,0x00,0x20,0x01,0x00,0x1f, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0d,0x00,0x00,0x20,0x01,0x00,0x21,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0d,0x00,0x00,0x20,0x01,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0d,0x00,0x00,0x20,0x01,0x00,0x23,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0d,0x00,0x00,0x21,0x01,0x00,0x24,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0d,0x00,0x00,0x20,0x01,0x00,0x25,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0d,0x00,0x00,0x20,0x01,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0d,0x00,0x00,0x20,0x01,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0d,0x00,0x00,0x52,0x00,0x02,0x2c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0d,0x00,0x00,0x12,0x01,0x00,0x2a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0d, 0x00,0x00,0x20,0x01,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0d,0x00, 0x00,0x20,0x01,0x00,0x30,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0d,0x00,0x00, 0x20,0x01,0x00,0x32,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0d,0x00,0x00,0x20, 0x01,0x00,0x33,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0d,0x00,0x00,0x20,0x01, 0x00,0x35,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x37,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0d,0x00,0x00,0x20,0x01,0x00,0x39, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0d,0x00,0x00,0x20,0x01,0x00,0x3b,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0d,0x00,0x00,0x20,0x01,0x00,0x3c,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0d,0x00,0x00,0x20,0x01,0x00,0x3e,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0d,0x00,0x00,0x20,0x01,0x00,0x40,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0d,0x00,0x00,0x20,0x01,0x00,0x42,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0d,0x00,0x00,0x20,0x01,0x00,0x44,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0d,0x00,0x00,0x20,0x01,0x00,0x46,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0d,0x00,0x00,0x20,0x01,0x00,0x48,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0d,0x00,0x00,0x20,0x01,0x00,0x49,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0d, 0x00,0x00,0x20,0x01,0x00,0x4b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0d,0x00, 0x00,0x20,0x01,0x00,0x4d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0d,0x00,0x00, 0x20,0x01,0x00,0x4f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0d,0x00,0x00,0x20, 0x01,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0d,0x00,0x00,0x20,0x01, 0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0d,0x00,0x00,0x20,0x01,0x00, 0x54,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0d,0x00,0x00,0x52,0x00,0x02,0x58, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0d,0x00,0x00,0x12,0x01,0x00,0x56,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0d,0x00,0x00,0x21,0x01,0x00,0x59,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0d,0x00,0x00,0x20,0x01,0x00,0x5a,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0d,0x00,0x00,0x20,0x01,0x00,0x5b,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0d,0x00,0x00,0x20,0x01,0x00,0x5d,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0d,0x00,0x00,0x20,0x01,0x00,0x5f,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0d,0x00,0x00,0x20,0x01,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0d,0x00,0x00,0x20,0x01,0x00,0x63,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0d,0x00,0x00,0x20,0x01,0x00,0x65,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0d, 0x00,0x00,0x20,0x01,0x00,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0d,0x00, 0x00,0x20,0x01,0x00,0x69,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0d,0x00,0x00, 0x20,0x01,0x00,0x6a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x20, 0x01,0x00,0x6d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0d,0x00,0x00,0x20,0x01, 0x00,0x6f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0d,0x00,0x00,0x20,0x01,0x00, 0x71,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0d,0x00,0x00,0x20,0x01,0x00,0x73, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0d,0x00,0x00,0x20,0x01,0x00,0x74,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0d,0x00,0x00,0x20,0x01,0x00,0x76,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0d,0x00,0x00,0x21,0x01,0x00,0x77,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0d,0x00,0x00,0x20,0x01,0x00,0x78,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0d,0x00,0x00,0x20,0x01,0x00,0x79,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0d,0x00,0x00,0x20,0x01,0x00,0x7b,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0d,0x00,0x00,0x20,0x01,0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0d,0x00,0x00,0x20,0x01,0x00,0x7f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0d,0x00,0x00,0x20,0x01,0x00,0x81,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0d, 0x00,0x00,0x20,0x01,0x00,0x83,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0d,0x00, 0x00,0x20,0x01,0x00,0x87,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0d,0x00,0x00, 0x20,0x01,0x00,0x89,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0d,0x00,0x00,0x20, 0x01,0x00,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0d,0x00,0x00,0x20,0x01, 0x00,0x8d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0d,0x00,0x00,0x20,0x01,0x00, 0x8e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0d,0x00,0x00,0x20,0x01,0x00,0x90, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0d,0x00,0x00,0x20,0x01,0x00,0x92,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0d,0x00,0x00,0x20,0x01,0x00,0x94,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0d,0x00,0x00,0x21,0x01,0x00,0x95,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0d,0x00,0x00,0x20,0x01,0x00,0x96,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0d,0x00,0x00,0x20,0x01,0x00,0x97,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0d,0x00,0x00,0x20,0x01,0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0d,0x00,0x00,0x20,0x01,0x00,0x9b,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0d,0x00,0x00,0x20,0x01,0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0d,0x00,0x00,0x20,0x01,0x00,0x9f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0d, 0x00,0x00,0x20,0x01,0x00,0xa3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0d,0x00, 0x00,0x20,0x01,0x00,0xa5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0d,0x00,0x00, 0x20,0x01,0x00,0xa7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0d,0x00,0x00,0x20, 0x01,0x00,0xa9,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0d,0x00,0x00,0x20,0x01, 0x00,0xaa,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0d,0x00,0x00,0x20,0x01,0x00, 0xac,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0d,0x00,0x00,0x20,0x01,0x00,0xae, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0d,0x00,0x00,0x21,0x01,0x00,0xaf,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0d,0x00,0x00,0x20,0x01,0x00,0xb0,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0d,0x00,0x00,0x20,0x01,0x00,0xb2,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0d,0x00,0x00,0x20,0x01,0x00,0xb6,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0d,0x00,0x00,0x20,0x01,0x00,0xb8,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0d,0x00,0x00,0x20,0x01,0x00,0xba,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0d,0x00,0x00,0x20,0x01,0x00,0xbc,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0d,0x00,0x00,0x20,0x01,0x00,0xbd,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0d,0x00,0x00,0x20,0x01,0x00,0xbf,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0d, 0x00,0x00,0x20,0x01,0x00,0xc1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0d,0x00, 0x00,0x20,0x01,0x00,0xc2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0d,0x00,0x00, 0x20,0x01,0x00,0xc3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0d,0x00,0x00,0x21, 0x01,0x00,0xc4,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0d,0x00,0x00,0x20,0x01, 0x00,0xc5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0d,0x00,0x00,0x20,0x01,0x00, 0xc7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0d,0x00,0x00,0x20,0x01,0x00,0xc8, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0d,0x00,0x00,0x20,0x01,0x00,0xc9,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0d,0x00,0x00,0x51,0x40,0x00,0xcc,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0d,0x00,0x00,0x20,0x01,0x00,0xca,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0d,0x00,0x00,0x51,0x40,0x00,0xcd,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0d,0x00,0x00,0x20,0x01,0x00,0xcb,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0d,0x00,0x00,0x51,0x40,0x00,0xce,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0d,0x00,0x00,0x52,0x40,0x00,0xcf,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0d,0x00,0x00,0x52,0x40,0x00,0xd0,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0d,0x00,0x00,0x52,0x40,0x00,0xd1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0d, 0x00,0x00,0x52,0x40,0x00,0xd2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0d,0x00, 0x00,0x52,0x40,0x00,0xd3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0d,0x00,0x00, 0x52,0x40,0x00,0xd4,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x52, 0x40,0x00,0xd5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0d,0x00,0x00,0x52,0x40, 0x00,0xd6,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0d,0x00,0x00,0x20,0x01,0x00, 0xd7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0d,0x00,0x00,0x20,0x01,0x00,0xd9, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0d,0x00,0x00,0x20,0x01,0x00,0xdb,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0d,0x00,0x00,0x20,0x01,0x00,0xdd,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0d,0x00,0x00,0x20,0x01,0x00,0xe1,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0d,0x00,0x00,0x20,0x01,0x00,0xe3,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0d,0x00,0x00,0x20,0x01,0x00,0xe5,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0d,0x00,0x00,0x20,0x01,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0d,0x00,0x00,0x20,0x01,0x00,0xe9,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0d,0x00,0x00,0x20,0x01,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0d,0x00,0x00,0x20,0x01,0x00,0xef,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0d, 0x00,0x00,0x20,0x01,0x00,0xf1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0d,0x00, 0x00,0x20,0x01,0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0d,0x00,0x00, 0x20,0x01,0x00,0xf5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0d,0x00,0x00,0x20, 0x01,0x00,0xf7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0d,0x00,0x00,0x20,0x01, 0x00,0xfb,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0d,0x00,0x00,0x20,0x01,0x00, 0xfd,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0d,0x00,0x00,0x20,0x01,0x00,0x01, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0d,0x00,0x00,0x20,0x01,0x00,0x02,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0d,0x00,0x00,0x20,0x01,0x00,0x04,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0d,0x00,0x00,0x20,0x01,0x00,0x07,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0d,0x00,0x00,0x20,0x01,0x00,0x05,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x20,0x01,0x00,0x09,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0e,0x00,0x00,0x20,0x01,0x00,0x0d,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x00,0x02,0x0e,0x00,0x00,0x01,0x00,0x00,0x03,0x0e,0x00,0x00,0x01,0x00, 0x00,0x04,0x0e,0x00,0x00,0x01,0x00,0x00,0x05,0x0e,0x00,0x00,0x01,0x00,0x00,0x06, 0x0e,0x00,0x00,0x01,0x00,0x00,0x07,0x0e,0x00,0x00,0x01,0x00,0x00,0x08,0x0e,0x00, 0x00,0x01,0x00,0x00,0x09,0x0e,0x00,0x00,0x01,0x00,0x00,0x0a,0x0e,0x00,0x00,0x01, 0x00,0x00,0x0b,0x0e,0x00,0x00,0x01,0x00,0x00,0x0c,0x0e,0x00,0x00,0x01,0x00,0x00, 0x0d,0x0e,0x00,0x00,0x01,0x00,0x00,0x0e,0x0e,0x00,0x00,0x01,0x00,0x00,0x0f,0x0e, 0x00,0x00,0x01,0x00,0x00,0x10,0x0e,0x00,0x00,0x01,0x00,0x00,0x11,0x0e,0x00,0x00, 0x01,0x00,0x00,0x12,0x0e,0x00,0x00,0x01,0x00,0x00,0x13,0x0e,0x00,0x00,0x01,0x00, 0x00,0x14,0x0e,0x00,0x00,0x01,0x00,0x00,0x15,0x0e,0x00,0x00,0x01,0x00,0x00,0xf5, 0x00,0x16,0x0e,0x00,0x00,0x01,0x00,0x00,0x17,0x0e,0x00,0x00,0x01,0x00,0x00,0x18, 0x0e,0x00,0x00,0x01,0x00,0x00,0x19,0x0e,0x00,0x00,0x01,0x00,0x00,0x1a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x1b,0x0e,0x00,0x00,0x01,0x00,0x00,0x1c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x1d,0x0e,0x00,0x00,0x01,0x00,0x00,0x1e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x1f,0x0e,0x00,0x00,0x01,0x00,0x00,0x20,0x0e,0x00,0x00,0x01,0x00,0x00,0x21,0x0e, 0x00,0x00,0x01,0x00,0x00,0x22,0x0e,0x00,0x00,0x01,0x00,0x00,0x23,0x0e,0x00,0x00, 0x01,0x00,0x00,0x24,0x0e,0x00,0x00,0x01,0x00,0x00,0x25,0x0e,0x00,0x00,0x01,0x00, 0x00,0x26,0x0e,0x00,0x00,0x01,0x00,0x00,0x27,0x0e,0x00,0x00,0x01,0x00,0x00,0x28, 0x0e,0x00,0x00,0x01,0x00,0x00,0x29,0x0e,0x00,0x00,0x01,0x00,0x00,0x2a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x2b,0x0e,0x00,0x00,0x01,0x00,0x00,0x2c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x2d,0x0e,0x00,0x00,0x01,0x00,0x00,0x2e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x2f,0x0e,0x00,0x00,0x01,0x00,0x00,0x30,0x0e,0x00,0x00,0x01,0x00,0x00,0x31,0x0e, 0x00,0x00,0x01,0x00,0x00,0x32,0x0e,0x00,0x00,0x01,0x00,0x00,0x33,0x0e,0x00,0x00, 0x01,0x00,0x00,0x34,0x0e,0x00,0x00,0x01,0x00,0x00,0x35,0x0e,0x00,0x00,0x01,0x00, 0x00,0x36,0x0e,0x00,0x00,0x01,0x00,0x00,0x37,0x0e,0x00,0x00,0x01,0x00,0x00,0x38, 0x0e,0x00,0x00,0x01,0x00,0x00,0x39,0x0e,0x00,0x00,0x01,0x00,0x00,0x3a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x3b,0x0e,0x00,0x00,0x01,0x00,0x00,0x3c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x3d,0x0e,0x00,0x00,0x01,0x00,0x00,0x3e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x3f,0x0e,0x00,0x00,0x01,0x00,0x00,0x40,0x0e,0x00,0x00,0x01,0x00,0x00,0x41,0x0e, 0x00,0x00,0x01,0x00,0x00,0x42,0x0e,0x00,0x00,0x01,0x00,0x00,0x43,0x0e,0x00,0x00, 0x01,0x00,0x00,0x44,0x0e,0x00,0x00,0x01,0x00,0x00,0x45,0x0e,0x00,0x00,0x01,0x00, 0x00,0x46,0x0e,0x00,0x00,0x01,0x00,0x00,0x47,0x0e,0x00,0x00,0x01,0x00,0x00,0x48, 0x0e,0x00,0x00,0x01,0x00,0x00,0x49,0x0e,0x00,0x00,0x01,0x00,0x00,0x4a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x4b,0x0e,0x00,0x00,0x01,0x00,0x00,0x4c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x4d,0x0e,0x00,0x00,0x01,0x00,0x00,0x4e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x4f,0x0e,0x00,0x00,0x01,0x00,0x00,0x50,0x0e,0x00,0x00,0x01,0x00,0x00,0x51,0x0e, 0x00,0x00,0x01,0x00,0x00,0x52,0x0e,0x00,0x00,0x01,0x00,0x00,0x53,0x0e,0x00,0x00, 0x01,0x00,0x00,0x54,0x0e,0x00,0x00,0x01,0x00,0x00,0x55,0x0e,0x00,0x00,0x01,0x00, 0x00,0x56,0x0e,0x00,0x00,0x01,0x00,0x00,0x57,0x0e,0x00,0x00,0x01,0x00,0x00,0x58, 0x0e,0x00,0x00,0x01,0x00,0x00,0x59,0x0e,0x00,0x00,0x01,0x00,0x00,0x5a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x5b,0x0e,0x00,0x00,0x01,0x00,0x00,0x5c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x5d,0x0e,0x00,0x00,0x01,0x00,0x00,0x5e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x5f,0x0e,0x00,0x00,0x01,0x00,0x00,0x60,0x0e,0x00,0x00,0x01,0x00,0x00,0x61,0x0e, 0x00,0x00,0x01,0x00,0x00,0x62,0x0e,0x00,0x00,0x01,0x00,0x00,0x63,0x0e,0x00,0x00, 0x01,0x00,0x00,0x64,0x0e,0x00,0x00,0x01,0x00,0x00,0x65,0x0e,0x00,0x00,0x01,0x00, 0x00,0x66,0x0e,0x00,0x00,0x01,0x00,0x00,0x67,0x0e,0x00,0x00,0x01,0x00,0x00,0x68, 0x0e,0x00,0x00,0x01,0x00,0x00,0x69,0x0e,0x00,0x00,0x01,0x00,0x00,0x6a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x6b,0x0e,0x00,0x00,0x01,0x00,0x00,0x6c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x6d,0x0e,0x00,0x00,0x01,0x00,0x00,0x6e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x6f,0x0e,0x00,0x00,0x01,0x00,0x00,0x70,0x0e,0x00,0x00,0x01,0x00,0x00,0x71,0x0e, 0x00,0x00,0x01,0x00,0x00,0x72,0x0e,0x00,0x00,0x01,0x00,0x00,0x73,0x0e,0x00,0x00, 0x01,0x00,0x00,0x74,0x0e,0x00,0x00,0x01,0x00,0x00,0x75,0x0e,0x00,0x00,0x01,0x00, 0x00,0x76,0x0e,0x00,0x00,0x01,0x00,0x00,0x77,0x0e,0x00,0x00,0x01,0x00,0x00,0x78, 0x0e,0x00,0x00,0x01,0x00,0x00,0x79,0x0e,0x00,0x00,0x01,0x00,0x00,0x7a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x7b,0x0e,0x00,0x00,0x01,0x00,0x00,0x7c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x7d,0x0e,0x00,0x00,0x01,0x00,0x00,0x7e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x7f,0x0e,0x00,0x00,0x01,0x00,0x00,0x80,0x0e,0x00,0x00,0x01,0x00,0x00,0x81,0x0e, 0x00,0x00,0x01,0x00,0x00,0x82,0x0e,0x00,0x00,0x01,0x00,0x00,0x83,0x0e,0x00,0x00, 0x01,0x00,0x00,0x84,0x0e,0x00,0x00,0x01,0x00,0x00,0x85,0x0e,0x00,0x00,0x01,0x00, 0x00,0x86,0x0e,0x00,0x00,0x01,0x00,0x00,0x87,0x0e,0x00,0x00,0x01,0x00,0x00,0x88, 0x0e,0x00,0x00,0x01,0x00,0x00,0x89,0x0e,0x00,0x00,0x01,0x00,0x00,0x8a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x8b,0x0e,0x00,0x00,0x01,0x00,0x00,0x8c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x8d,0x0e,0x00,0x00,0x01,0x00,0x00,0x8e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x8f,0x0e,0x00,0x00,0x01,0x00,0x00,0x90,0x0e,0x00,0x00,0x01,0x00,0x00,0x91,0x0e, 0x00,0x00,0x01,0x00,0x00,0x92,0x0e,0x00,0x00,0x01,0x00,0x00,0x93,0x0e,0x00,0x00, 0x01,0x00,0x00,0x94,0x0e,0x00,0x00,0x01,0x00,0x00,0x95,0x0e,0x00,0x00,0x01,0x00, 0x00,0x96,0x0e,0x00,0x00,0x01,0x00,0x00,0x97,0x0e,0x00,0x00,0x01,0x00,0x00,0x98, 0x0e,0x00,0x00,0x01,0x00,0x00,0x99,0x0e,0x00,0x00,0x01,0x00,0x00,0x9a,0x0e,0x00, 0x00,0x01,0x00,0x00,0x9b,0x0e,0x00,0x00,0x01,0x00,0x00,0x9c,0x0e,0x00,0x00,0x01, 0x00,0x00,0x9d,0x0e,0x00,0x00,0x01,0x00,0x00,0x9e,0x0e,0x00,0x00,0x01,0x00,0x00, 0x9f,0x0e,0x00,0x00,0x01,0x00,0x00,0xa0,0x0e,0x00,0x00,0x01,0x00,0x00,0xa1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xa2,0x0e,0x00,0x00,0x01,0x00,0x00,0xa3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xa4,0x0e,0x00,0x00,0x01,0x00,0x00,0xa5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xa6,0x0e,0x00,0x00,0x01,0x00,0x00,0xa7,0x0e,0x00,0x00,0x01,0x00,0x00,0xa8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xa9,0x0e,0x00,0x00,0x01,0x00,0x00,0xaa,0x0e,0x00, 0x00,0x01,0x00,0x00,0xab,0x0e,0x00,0x00,0x01,0x00,0x00,0xac,0x0e,0x00,0x00,0x01, 0x00,0x00,0xad,0x0e,0x00,0x00,0x01,0x00,0x00,0xae,0x0e,0x00,0x00,0x01,0x00,0x00, 0xaf,0x0e,0x00,0x00,0x01,0x00,0x00,0xb0,0x0e,0x00,0x00,0x01,0x00,0x00,0xb1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xb2,0x0e,0x00,0x00,0x01,0x00,0x00,0xb3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xb4,0x0e,0x00,0x00,0x01,0x00,0x00,0xb5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xb6,0x0e,0x00,0x00,0x01,0x00,0x00,0xb7,0x0e,0x00,0x00,0x01,0x00,0x00,0xb8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xb9,0x0e,0x00,0x00,0x01,0x00,0x00,0xba,0x0e,0x00, 0x00,0x01,0x00,0x00,0xbb,0x0e,0x00,0x00,0x01,0x00,0x00,0xbc,0x0e,0x00,0x00,0x01, 0x00,0x00,0xbd,0x0e,0x00,0x00,0x01,0x00,0x00,0xbe,0x0e,0x00,0x00,0x01,0x00,0x00, 0xbf,0x0e,0x00,0x00,0x01,0x00,0x00,0xc0,0x0e,0x00,0x00,0x01,0x00,0x00,0xc1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xc2,0x0e,0x00,0x00,0x01,0x00,0x00,0xc3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xc4,0x0e,0x00,0x00,0x01,0x00,0x00,0xc5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xc6,0x0e,0x00,0x00,0x01,0x00,0x00,0xc7,0x0e,0x00,0x00,0x01,0x00,0x00,0xc8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xc9,0x0e,0x00,0x00,0x01,0x00,0x00,0xca,0x0e,0x00, 0x00,0x01,0x00,0x00,0xcb,0x0e,0x00,0x00,0x01,0x00,0x00,0xcc,0x0e,0x00,0x00,0x01, 0x00,0x00,0xcd,0x0e,0x00,0x00,0x01,0x00,0x00,0xce,0x0e,0x00,0x00,0x01,0x00,0x00, 0xcf,0x0e,0x00,0x00,0x01,0x00,0x00,0xd0,0x0e,0x00,0x00,0x01,0x00,0x00,0xd1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xd2,0x0e,0x00,0x00,0x01,0x00,0x00,0xd3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xd4,0x0e,0x00,0x00,0x01,0x00,0x00,0xd5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xd6,0x0e,0x00,0x00,0x01,0x00,0x00,0xd7,0x0e,0x00,0x00,0x01,0x00,0x00,0xd8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xd9,0x0e,0x00,0x00,0x01,0x00,0x00,0xda,0x0e,0x00, 0x00,0x01,0x00,0x00,0xdb,0x0e,0x00,0x00,0x01,0x00,0x00,0xdc,0x0e,0x00,0x00,0x01, 0x00,0x00,0xdd,0x0e,0x00,0x00,0x01,0x00,0x00,0xde,0x0e,0x00,0x00,0x01,0x00,0x00, 0xdf,0x0e,0x00,0x00,0x01,0x00,0x00,0xe0,0x0e,0x00,0x00,0x01,0x00,0x00,0xe1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xe2,0x0e,0x00,0x00,0x01,0x00,0x00,0xe3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xe4,0x0e,0x00,0x00,0x01,0x00,0x00,0xe5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xe6,0x0e,0x00,0x00,0x01,0x00,0x00,0xe7,0x0e,0x00,0x00,0x01,0x00,0x00,0xe8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xe9,0x0e,0x00,0x00,0x01,0x00,0x00,0xea,0x0e,0x00, 0x00,0x01,0x00,0x00,0xeb,0x0e,0x00,0x00,0x01,0x00,0x00,0xec,0x0e,0x00,0x00,0x01, 0x00,0x00,0xed,0x0e,0x00,0x00,0x01,0x00,0x00,0xee,0x0e,0x00,0x00,0x01,0x00,0x00, 0xef,0x0e,0x00,0x00,0x01,0x00,0x00,0xf0,0x0e,0x00,0x00,0x01,0x00,0x00,0xf1,0x0e, 0x00,0x00,0x01,0x00,0x00,0xf2,0x0e,0x00,0x00,0x01,0x00,0x00,0xf3,0x0e,0x00,0x00, 0x01,0x00,0x00,0xf4,0x0e,0x00,0x00,0x01,0x00,0x00,0xf5,0x0e,0x00,0x00,0x01,0x00, 0x00,0xf6,0x0e,0x00,0x00,0x01,0x00,0x00,0xf7,0x0e,0x00,0x00,0x01,0x00,0x00,0xf8, 0x0e,0x00,0x00,0x01,0x00,0x00,0xf9,0x0e,0x00,0x00,0x01,0x00,0x00,0xfa,0x0e,0x00, 0x00,0x01,0x00,0x00,0xfb,0x0e,0x00,0x00,0x01,0x00,0x00,0xfc,0x0e,0x00,0x00,0x01, 0x00,0x00,0xfd,0x0e,0x00,0x00,0x01,0x00,0x00,0xfe,0x0e,0x00,0x00,0x01,0x00,0x00, 0xff,0x0e,0x00,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x01,0x00,0x00,0x01,0x0f, 0x00,0x00,0x01,0x00,0x00,0x02,0x0f,0x00,0x00,0x01,0x00,0x00,0x03,0x0f,0x00,0x00, 0x01,0x00,0x00,0x04,0x0f,0x00,0x00,0x01,0x00,0x00,0x05,0x0f,0x00,0x00,0x01,0x00, 0x00,0x06,0x0f,0x00,0x00,0x01,0x00,0x00,0x07,0x0f,0x00,0x00,0x01,0x00,0x00,0x08, 0x0f,0x00,0x00,0x01,0x00,0x00,0x09,0x0f,0x00,0x00,0x01,0x00,0x00,0x0a,0x0f,0x00, 0x00,0x01,0x00,0x00,0xc2,0x00,0x0b,0x0f,0x00,0x00,0x01,0x00,0x0c,0x0f,0x00,0x00, 0x01,0x00,0x0d,0x0f,0x00,0x00,0x00,0x00,0x0e,0x0f,0x00,0x00,0x00,0x00,0x0f,0x0f, 0x00,0x00,0x00,0x00,0x10,0x0f,0x00,0x00,0x00,0x00,0x11,0x0f,0x00,0x00,0x00,0x00, 0x12,0x0f,0x00,0x00,0x00,0x00,0x13,0x0f,0x00,0x00,0x00,0x00,0x14,0x0f,0x00,0x00, 0x00,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x16,0x0f,0x00,0x00,0x00,0x00,0x17,0x0f, 0x00,0x00,0x00,0x00,0x18,0x0f,0x00,0x00,0x00,0x00,0x19,0x0f,0x00,0x00,0x00,0x00, 0x1a,0x0f,0x00,0x00,0x00,0x00,0x1b,0x0f,0x00,0x00,0x00,0x00,0x1c,0x0f,0x00,0x00, 0x00,0x00,0x1d,0x0f,0x00,0x00,0x00,0x00,0x1e,0x0f,0x00,0x00,0x00,0x00,0x1f,0x0f, 0x00,0x00,0x00,0x00,0x20,0x0f,0x00,0x00,0x00,0x00,0x21,0x0f,0x00,0x00,0x00,0x00, 0x22,0x0f,0x00,0x00,0x00,0x00,0x23,0x0f,0x00,0x00,0x00,0x00,0x24,0x0f,0x00,0x00, 0x00,0x00,0x25,0x0f,0x00,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x00,0x00,0x27,0x0f, 0x00,0x00,0x00,0x00,0x28,0x0f,0x00,0x00,0x00,0x00,0x29,0x0f,0x00,0x00,0x00,0x00, 0x2a,0x0f,0x00,0x00,0x00,0x00,0x2b,0x0f,0x00,0x00,0x00,0x00,0x2c,0x0f,0x00,0x00, 0x00,0x00,0x2d,0x0f,0x00,0x00,0x00,0x00,0x2e,0x0f,0x00,0x00,0x00,0x00,0x2f,0x0f, 0x00,0x00,0x00,0x00,0x30,0x0f,0x00,0x00,0x00,0x00,0x31,0x0f,0x00,0x00,0x00,0x00, 0x32,0x0f,0x00,0x00,0x00,0x00,0x33,0x0f,0x00,0x00,0x00,0x00,0x34,0x0f,0x00,0x00, 0x00,0x00,0x35,0x0f,0x00,0x00,0x00,0x00,0x36,0x0f,0x00,0x00,0x00,0x00,0x37,0x0f, 0x00,0x00,0x00,0x00,0x38,0x0f,0x00,0x00,0x00,0x00,0x39,0x0f,0x00,0x00,0x00,0x00, 0x3a,0x0f,0x00,0x00,0x00,0x00,0x3b,0x0f,0x00,0x00,0x00,0x00,0x3c,0x0f,0x00,0x00, 0x00,0x00,0x3d,0x0f,0x00,0x00,0x00,0x00,0x3e,0x0f,0x00,0x00,0x00,0x00,0x3f,0x0f, 0x00,0x00,0x00,0x00,0x40,0x0f,0x00,0x00,0x00,0x00,0x41,0x0f,0x00,0x00,0x00,0x00, 0x42,0x0f,0x00,0x00,0x00,0x00,0x43,0x0f,0x00,0x00,0x00,0x00,0x44,0x0f,0x00,0x00, 0x00,0x00,0x45,0x0f,0x00,0x00,0x00,0x00,0x46,0x0f,0x00,0x00,0x00,0x00,0x47,0x0f, 0x00,0x00,0x00,0x00,0x48,0x0f,0x00,0x00,0x00,0x00,0x49,0x0f,0x00,0x00,0x00,0x00, 0x4a,0x0f,0x00,0x00,0x00,0x00,0x4b,0x0f,0x00,0x00,0x00,0x00,0x4c,0x0f,0x00,0x00, 0x00,0x00,0x4d,0x0f,0x00,0x00,0x00,0x00,0x4e,0x0f,0x00,0x00,0x00,0x00,0x4f,0x0f, 0x00,0x00,0x00,0x00,0x50,0x0f,0x00,0x00,0x00,0x00,0x51,0x0f,0x00,0x00,0x00,0x00, 0x52,0x0f,0x00,0x00,0x00,0x00,0x53,0x0f,0x00,0x00,0x00,0x00,0x54,0x0f,0x00,0x00, 0x00,0x00,0x55,0x0f,0x00,0x00,0x00,0x00,0x56,0x0f,0x00,0x00,0x00,0x00,0x57,0x0f, 0x00,0x00,0x00,0x00,0x58,0x0f,0x00,0x00,0x00,0x00,0x59,0x0f,0x00,0x00,0x00,0x00, 0x5a,0x0f,0x00,0x00,0x00,0x00,0x5b,0x0f,0x00,0x00,0x00,0x00,0x5c,0x0f,0x00,0x00, 0x00,0x00,0x5d,0x0f,0x00,0x00,0x00,0x00,0x5e,0x0f,0x00,0x00,0x00,0x00,0x5f,0x0f, 0x00,0x00,0x00,0x00,0x60,0x0f,0x00,0x00,0x00,0x00,0x61,0x0f,0x00,0x00,0x00,0x00, 0x62,0x0f,0x00,0x00,0x00,0x00,0x63,0x0f,0x00,0x00,0x00,0x00,0x64,0x0f,0x00,0x00, 0x00,0x00,0x65,0x0f,0x00,0x00,0x00,0x00,0x66,0x0f,0x00,0x00,0x00,0x00,0x67,0x0f, 0x00,0x00,0x00,0x00,0x68,0x0f,0x00,0x00,0x00,0x00,0x69,0x0f,0x00,0x00,0x00,0x00, 0x6a,0x0f,0x00,0x00,0x00,0x00,0x6b,0x0f,0x00,0x00,0x00,0x00,0x6c,0x0f,0x00,0x00, 0x00,0x00,0x6d,0x0f,0x00,0x00,0x00,0x00,0x6e,0x0f,0x00,0x00,0x00,0x00,0x6f,0x0f, 0x00,0x00,0x00,0x00,0x70,0x0f,0x00,0x00,0x00,0x00,0x71,0x0f,0x00,0x00,0x00,0x00, 0x72,0x0f,0x00,0x00,0x00,0x00,0x73,0x0f,0x00,0x00,0x00,0x00,0x74,0x0f,0x00,0x00, 0x00,0x00,0x75,0x0f,0x00,0x00,0x00,0x00,0x76,0x0f,0x00,0x00,0x00,0x00,0x77,0x0f, 0x00,0x00,0x00,0x00,0x78,0x0f,0x00,0x00,0x00,0x00,0x79,0x0f,0x00,0x00,0x00,0x00, 0x7a,0x0f,0x00,0x00,0x00,0x00,0x7b,0x0f,0x00,0x00,0x00,0x00,0x7c,0x0f,0x00,0x00, 0x00,0x00,0x7d,0x0f,0x00,0x00,0x00,0x00,0x7e,0x0f,0x00,0x00,0x00,0x00,0x7f,0x0f, 0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x81,0x0f,0x00,0x00,0x00,0x00, 0x82,0x0f,0x00,0x00,0x00,0x00,0x83,0x0f,0x00,0x00,0x00,0x00,0x84,0x0f,0x00,0x00, 0x00,0x00,0x85,0x0f,0x00,0x00,0x00,0x00,0x86,0x0f,0x00,0x00,0x00,0x00,0x87,0x0f, 0x00,0x00,0x00,0x00,0x88,0x0f,0x00,0x00,0x00,0x00,0x89,0x0f,0x00,0x00,0x00,0x00, 0x8a,0x0f,0x00,0x00,0x00,0x00,0x8b,0x0f,0x00,0x00,0x00,0x00,0x8c,0x0f,0x00,0x00, 0x00,0x00,0x8d,0x0f,0x00,0x00,0x00,0x00,0x8e,0x0f,0x00,0x00,0x00,0x00,0x8f,0x0f, 0x00,0x00,0x00,0x00,0x90,0x0f,0x00,0x00,0x00,0x00,0x91,0x0f,0x00,0x00,0x00,0x00, 0x92,0x0f,0x00,0x00,0x00,0x00,0x93,0x0f,0x00,0x00,0x00,0x00,0x94,0x0f,0x00,0x00, 0x00,0x00,0x95,0x0f,0x00,0x00,0x00,0x00,0x96,0x0f,0x00,0x00,0x00,0x00,0x97,0x0f, 0x00,0x00,0x00,0x00,0x98,0x0f,0x00,0x00,0x00,0x00,0x99,0x0f,0x00,0x00,0x00,0x00, 0x9a,0x0f,0x00,0x00,0x00,0x00,0x9b,0x0f,0x00,0x00,0x00,0x00,0x9c,0x0f,0x00,0x00, 0x00,0x00,0x9d,0x0f,0x00,0x00,0x00,0x00,0x9e,0x0f,0x00,0x00,0x00,0x00,0x9f,0x0f, 0x00,0x00,0x00,0x00,0xa0,0x0f,0x00,0x00,0x00,0x00,0xa1,0x0f,0x00,0x00,0x00,0x00, 0xa2,0x0f,0x00,0x00,0x00,0x00,0xa3,0x0f,0x00,0x00,0x00,0x00,0xa4,0x0f,0x00,0x00, 0x00,0x00,0xa5,0x0f,0x00,0x00,0x00,0x00,0xa6,0x0f,0x00,0x00,0x00,0x00,0xa7,0x0f, 0x00,0x00,0x00,0x00,0xa8,0x0f,0x00,0x00,0x00,0x00,0xa9,0x0f,0x00,0x00,0x00,0x00, 0xaa,0x0f,0x00,0x00,0x00,0x00,0xab,0x0f,0x00,0x00,0x00,0x00,0xac,0x0f,0x00,0x00, 0x00,0x00,0xad,0x0f,0x00,0x00,0x00,0x00,0xae,0x0f,0x00,0x00,0x00,0x00,0xaf,0x0f, 0x00,0x00,0x00,0x00,0xb0,0x0f,0x00,0x00,0x00,0x00,0xb1,0x0f,0x00,0x00,0x00,0x00, 0xb2,0x0f,0x00,0x00,0x00,0x00,0xb3,0x0f,0x00,0x00,0x00,0x00,0xb4,0x0f,0x00,0x00, 0x00,0x00,0xb5,0x0f,0x00,0x00,0x00,0x00,0xb6,0x0f,0x00,0x00,0x00,0x00,0xb7,0x0f, 0x00,0x00,0x00,0x00,0xb8,0x0f,0x00,0x00,0x00,0x00,0xb9,0x0f,0x00,0x00,0x00,0x00, 0xba,0x0f,0x00,0x00,0x00,0x00,0xbb,0x0f,0x00,0x00,0x00,0x00,0xbc,0x0f,0x00,0x00, 0x00,0x00,0xbd,0x0f,0x00,0x00,0x00,0x00,0xbe,0x0f,0x00,0x00,0x00,0x00,0xbf,0x0f, 0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,0x00,0xc1,0x0f,0x00,0x00,0x00,0x00, 0xc2,0x0f,0x00,0x00,0x00,0x00,0xc3,0x0f,0x00,0x00,0x00,0x00,0xc4,0x0f,0x00,0x00, 0x00,0x00,0xc5,0x0f,0x00,0x00,0x00,0x00,0xc6,0x0f,0x00,0x00,0x00,0x00,0xc7,0x0f, 0x00,0x00,0x00,0x00,0xc8,0x0f,0x00,0x00,0x00,0x00,0xc9,0x0f,0x00,0x00,0x00,0x00, 0xca,0x0f,0x00,0x00,0x00,0x00,0xcb,0x0f,0x00,0x00,0x00,0x00,0xcc,0x0f,0x00,0x00, 0x00,0x00,0x00,0x02,0xcd,0x0f,0x00,0x00,0x01,0x00,0x00,0xce,0x0f,0x00,0x00,0x01, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00, 0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00, 0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00, 0x30,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00, 0x00,0x00,0x38,0x00,0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x00, 0x26,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x00,0x27,0x00,0x00,0x00,0x44,0x00,0x04, 0x00,0x00,0x28,0x00,0x00,0x00,0x48,0x00,0x04,0x00,0x33,0x32,0x02,0x00,0xd7,0x3d, 0x01,0x00,0x03,0x00,0xcf,0x0f,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f, 0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x34,0x2e,0x61,0x73,0x6d,0xd0, 0x0f,0x00,0x00,0x00,0xd1,0x0f,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x05,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x01, 0x00,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x01,0x80,0x31,0x00,0x29,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0,0xff, 0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x18,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x02,0x00,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0x03,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x32,0x00,0x02,0x00,0x2b,0x00,0x29,0x00,0x00,0x00,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x04, 0x00,0x00,0x1a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00,0x00, 0x32,0x00,0x04,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0x03,0x00,0x31,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x1b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00, 0x02,0x02,0x05,0x00,0x00,0x1a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x10, 0x00,0x00,0x00,0x32,0x00,0x05,0x80,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x1c,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x04,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff,0xff,0xff,0x29, 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x06,0x00,0x00,0x1a,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x06,0x80,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x1d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe8, 0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x03,0x00,0x29,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x07,0x00,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x07,0x00,0x05,0x00, 0x31,0x04,0x00,0x24,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x1f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x08,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x08,0x80,0x04,0x00,0x31,0x05,0x00,0x2c,0x00,0x04,0x02,0x09, 0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00, 0x32,0x00,0x09,0x00,0x19,0x00,0x2c,0x00,0x00,0x02,0x0a,0x00,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x0a,0x00,0x0f, 0x00,0x2c,0x00,0x00,0x02,0x0b,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x0b,0x80,0x31,0x00,0x25,0x04,0x00,0x00, 0x00,0x20,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x20,0x09,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20, 0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x18, 0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x05,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x09,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x20,0x09,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x20,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x20,0x09,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20, 0x09,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09, 0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00, 0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00, 0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x1a, 0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x1e,0x00, 0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x0b,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x25,0x09, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x25,0x09,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x20,0x09,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02, 0x0c,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x32,0x00,0x0c,0x80,0x07,0x00,0x31,0x06,0x00,0x29,0x00,0x00,0x00,0x00,0x43, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x0f,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x07,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x27,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0xfe,0x01, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x43, 0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60, 0x00,0x01,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00, 0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0x01,0x01,0x00,0x02, 0x00,0x43,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x0d, 0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0x0d,0x80,0x07,0x00,0x29,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0x06,0x00,0x31,0x07,0x00,0x2c,0x00,0x04,0x02,0x0e,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x0e,0x00,0x0b,0x00, 0x2c,0x00,0x04,0x02,0x0f,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x0f,0x80,0x09,0x00,0x25,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x2a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x46, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x02,0x2c,0x00,0x00, 0x02,0x10,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0x10,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x58,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x32,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x09,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x34,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x33,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0, 0x00,0x24,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x35,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x36,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x33, 0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x62, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x37,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x09,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x08,0x00,0x10,0x00,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x68, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x69,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0, 0x02,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x3c,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00, 0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60, 0x01,0x10,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x3f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x02,0x10, 0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x41,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x09,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x09,0x00,0x32,0x00,0x03, 0x00,0x0a,0x00,0x2b,0x00,0x02,0x11,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x11,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x43,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x82,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x80,0x02,0x10, 0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x86,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x87,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46, 0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x96,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x87,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x97,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x51,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x53,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0, 0x00,0x24,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x54,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52, 0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x56,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x57,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x52,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x03,0x10,0x00, 0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x0a,0x00,0x25,0x00,0x00,0x00, 0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x5b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xad,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, 0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46, 0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x02,0x10,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x00,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x61,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xb8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x63,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc2,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x09, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xc5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x69, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x6a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x09,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xc9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc9,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6b,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x68,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00, 0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x68, 0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcf,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6e,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x68,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x03, 0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x0b,0x00,0x2c,0x00,0x04,0x02,0x12,0x00,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x12,0x00,0x0d,0x00,0x25,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x70,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd4,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd5,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x72,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x13,0x00,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x13,0x00,0x0c,0x00,0x10, 0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xda, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xda,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xde,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x76,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x77, 0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x78,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x09,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x79,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x09,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xe6,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7a,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x77,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xe0,0x01,0x32,0x00, 0x00,0x00,0x31,0x00,0x31,0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xea,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xeb,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7c,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x7d,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x7e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x7d,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x7d, 0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x31, 0x00,0x31,0x0d,0x00,0x2c,0x00,0x00,0x02,0x14,0x00,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x14,0x00,0x0e,0x00,0x2c, 0x00,0x00,0x02,0x15,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x15,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x28, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x80,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xf4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xf6, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x82,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x09,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x0e,0x00,0x25,0x00,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x85,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x86,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xfb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfc,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x87,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x88,0x09,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x89,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x88,0x09,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x0f,0x00,0x25, 0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x8a,0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x8a,0x09,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x8a,0x09,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x04,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a, 0x09,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09, 0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00, 0x00,0x1c,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x09,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x0d,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x11,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x15,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x8a,0x09,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x8a,0x09,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x8a,0x09,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a, 0x09,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09, 0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x8a,0x09,0x00, 0x00,0x1e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x16,0x00,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x16,0x80, 0x11,0x00,0x31,0x10,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x06,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x03, 0x01,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x12, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0x03,0x01,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x1a,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x03,0x01,0x00, 0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x26,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x0f,0x00,0x21, 0x01,0x00,0x8b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02, 0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x00,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0xff, 0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00, 0x00,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00, 0xe0,0x00,0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x00, 0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0x01,0x01,0x00, 0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x17,0x00,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x17,0x80,0x11, 0x00,0x29,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x10,0x00,0x31,0x11,0x00, 0x2c,0x00,0x04,0x02,0x18,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x18,0x00,0x15,0x00,0x2c,0x00,0x04,0x02,0x19, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0x19,0x80,0x13,0x00,0x25,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x8d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x07, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x03,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x01,0x24, 0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0d,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x1a,0x00,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x1a, 0x00,0x12,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x92,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x09,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x94,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x96,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x09,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40, 0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x17, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x98,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x09,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9a,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x99,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00, 0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9b, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x9c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x09,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9d,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x99,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40, 0x02,0x10,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x9e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x09,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x13,0x00,0x32, 0x00,0x03,0x00,0x14,0x00,0x2b,0x00,0x02,0x1b,0x00,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0x1b,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0xa0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x28, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x29,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x03,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x01,0x24, 0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2e,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x2f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80, 0x02,0x10,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x32,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x33, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x33,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00, 0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa7,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa9,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00, 0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaa, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xab,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40, 0x02,0x10,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xad,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xae,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa8, 0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x03,0x10,0x00,0x00,0x00,0x00, 0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaf,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xa8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x03, 0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x14,0x00,0x25,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xb1,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4a,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x4b,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00, 0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4e,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01, 0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x52, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x53,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb7,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xb8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x09,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x57,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xba,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xb8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x01,0x10,0x00,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x59,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbb,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbd,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xb8,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x02, 0x10,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xbe,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x09,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x15,0x00,0x2c,0x00, 0x04,0x02,0x1c,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0x1c,0x00,0x17,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbf,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xc0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc1,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x66,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x1d,0x00,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x1d,0x00,0x16,0x00,0x10,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x68, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x69,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc3,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xc4,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x09,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x6d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6d,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc6,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xc4,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x01,0x10,0x00,0x00, 0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x6f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x70,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0xc0,0x01,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x16,0x00,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc8,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xca,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x09,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x31, 0x00,0x31,0x17,0x00,0x2c,0x00,0x00,0x02,0x1e,0x00,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x1e,0x00,0x18,0x00,0x2c, 0x00,0x00,0x02,0x1f,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x1f,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x28, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xcc,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x09, 0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x31,0x00, 0x31,0x18,0x00,0x25,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xd0, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7c,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x03,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd1,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xd2,0x09,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd3,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd2,0x09,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x19,0x00,0x2c,0x00, 0x00,0x02,0x20,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x32,0x00,0x20,0x00,0x21,0x00,0x2c,0x00,0x00,0x02,0x21,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x21,0x80,0x31,0x00,0x25,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x21,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x21,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x21,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x21, 0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x21,0x09, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x21,0x09,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xd4,0x09,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02, 0x22,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x32,0x00,0x22,0x80,0x1b,0x00,0x31,0x1a,0x00,0x29,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x83,0x01, 0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x0c,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x83,0x01,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x01,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x83,0x01,0x00,0x00, 0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x07,0x00, 0x02,0x00,0x83,0x01,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x83,0x01, 0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0xd5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x80,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0xfe,0x01, 0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x80, 0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60, 0x00,0x01,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x03,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00, 0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x02, 0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00, 0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x23, 0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0x23,0x80,0x1b,0x00,0x29,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0x1a,0x00,0x31,0x1b,0x00,0x2c,0x00,0x04,0x02,0x24,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x24,0x00,0x1e,0x00, 0x2c,0x00,0x04,0x02,0x25,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x25,0x80,0x1c,0x00,0x24,0x03,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x09,0x00,0x00,0x00,0x00,0x83, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0xd6,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x87, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x88,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd8, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00, 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x09,0x00,0x00, 0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xd6,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0x26,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x26,0x80,0x31,0x00,0x10,0x00,0x00,0x00, 0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdb,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xd6,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80, 0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x1c,0x00,0x32,0x00,0x03,0x00,0x1d,0x00, 0x2b,0x00,0x02,0x27,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x27,0x80,0x31, 0x00,0x24,0x03,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdc, 0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x91, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xdd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x09,0x00,0x00,0x00,0x00,0x83,0x01, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xde,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x09,0x00, 0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x94,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x94,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0xdc,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x09,0x00,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x98,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xdc,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00, 0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xdc,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00, 0x03,0x10,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xe3,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x09,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x1d,0x00,0x24, 0x03,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x09,0x00, 0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe5,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x09,0x00,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe7,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xe4,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe8,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x09,0x00,0x00,0x00,0x00,0x83, 0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x09, 0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xa9, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xea,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xe4,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x03,0x32, 0x00,0x00,0x00,0x31,0x00,0x31,0x1e,0x00,0x2c,0x00,0x04,0x02,0x28,0x00,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x28, 0x00,0x1f,0x00,0x24,0x03,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xeb,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xec,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xeb,0x09,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xed,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xeb, 0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x29, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x29,0x00,0x31,0x00,0x10,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xeb, 0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x31, 0x00,0x31,0x1f,0x00,0x2c,0x00,0x00,0x02,0x2a,0x00,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x2a,0x00,0x20,0x00,0x2c, 0x00,0x00,0x02,0x2b,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x2b,0x80,0x31,0x00,0x24,0x03,0x00,0x00,0x00,0xb2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x09,0x00,0x00,0x00,0x00,0x83,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x20,0x00,0x24,0x03,0x00, 0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x09,0x00,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xf0,0x09,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x80,0x00, 0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x21,0x00,0x25,0x04,0x00,0x00,0x00,0xf2,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x10,0x00, 0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0x21,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0x21,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x1c,0x00,0x00,0x02,0x00, 0x21,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xf2,0x09,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x04, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xf2,0x09,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x05,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xf2,0x09,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xf2, 0x09,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x2c,0x00,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x2c,0x80,0x23,0x00,0x31,0x22,0x00,0x29,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x05, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0xb8,0x01,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x01, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb8,0x01,0x00, 0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xb5,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x19,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xb8, 0x01,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x26,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x0e, 0x00,0x21,0x01,0x00,0xf3,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x04,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0xb5,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xb5,0x01,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xb5,0x01, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x2d,0x00,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x2d, 0x80,0x23,0x00,0x29,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x22,0x00,0x31, 0x23,0x00,0x2c,0x00,0x04,0x02,0x2e,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x2e,0x00,0x27,0x00,0x2c,0x00,0x04, 0x02,0x2f,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x2f,0x80,0x25,0x00,0x25,0x00,0x00,0x00,0x00,0xb9,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0xf5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbe, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xbe,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xbf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbf,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf8,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x30,0x00, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x30,0x00,0x24,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xfa,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0xb8, 0x01,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0xb8,0x01,0x00, 0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x24,0x00,0x10,0x00,0x00,0x00, 0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0a,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x02,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0a,0x00,0x00,0x00,0x00,0xb8, 0x01,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0a, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xd6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd7,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00, 0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x06,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0a,0x00,0x00, 0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x25, 0x00,0x32,0x00,0x03,0x00,0x26,0x00,0x2b,0x00,0x02,0x31,0x00,0x05,0x00,0x01,0x00, 0x00,0x00,0x32,0x00,0x31,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0xda,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x07,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdf,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xe0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe3,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xe4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe4,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00, 0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe7,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00, 0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe8, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x01,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x11,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x12,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00,0x00,0x00,0xb8, 0x01,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x13,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xf2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x14, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00, 0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x15,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00, 0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x03,0x10,0x00,0x00, 0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xf8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf9,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x17,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00, 0xa0,0x03,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x26,0x00,0x25,0x00,0x00,0x00,0x00, 0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x18,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x19,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xff,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01, 0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x03, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00, 0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x04,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x05,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xb8,0x01,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x09,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x20,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x0a, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x01,0x10, 0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01, 0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x24,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x20,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x02,0x10,0x00,0x00, 0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x12,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x25,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00, 0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x26,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x0a,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x27,0x00, 0x2c,0x00,0x04,0x02,0x32,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x32,0x00,0x29,0x00,0x25,0x00,0x00,0x00,0x00, 0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x28,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x33, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x33,0x00,0x28,0x00,0x10,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x1f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2b,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x2d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0a, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x22, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x01,0x10, 0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x25, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x2f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01, 0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x28,0x00,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x26,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x31,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x32,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x0a,0x00,0x00, 0x00,0x00,0xb8,0x01,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x2a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x31,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x01,0x32,0x00,0x00, 0x00,0x31,0x00,0x31,0x29,0x00,0x2c,0x00,0x00,0x02,0x34,0x00,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x34,0x00,0x2a, 0x00,0x2c,0x00,0x00,0x02,0x35,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x35,0x80,0x31,0x00,0x25,0x00,0x00,0x00, 0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x34,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xb8,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x35,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x36,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00, 0x31,0x00,0x31,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07, 0x00,0x38,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x31,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x32,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x39,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x3a,0x0a,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x20,0x00,0x01,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x3b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x0a,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x2b,0x00, 0x01,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x3c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x3d,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x3e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x19,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x25,0x04, 0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x40,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x41,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x42,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x43, 0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x44,0x0a, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x45,0x0a,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x46,0x0a,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x41,0x0a,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x42,0x0a,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x43,0x0a,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x44,0x0a,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x45,0x0a,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x46,0x0a,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x40,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x41,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x42,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x43, 0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x44,0x0a, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x45,0x0a,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x46,0x0a,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x41,0x0a,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x42,0x0a,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x43,0x0a,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x44,0x0a,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x45,0x0a,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x46,0x0a,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25,0x09,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x36,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x32,0x00,0x36,0x00,0x2e,0x00,0x2c,0x00,0x04,0x02,0x37,0x00,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00, 0x37,0x80,0x2c,0x00,0x25,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00, 0x47,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x02,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x42,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x39,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x49,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x02, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x46, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x47,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x3c,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x38,0x00,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x38,0x80,0x31, 0x00,0x10,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4a,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x3d,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x31,0x00, 0x31,0x2c,0x00,0x32,0x00,0x03,0x00,0x2d,0x00,0x2b,0x00,0x02,0x39,0x00,0x05,0x00, 0x01,0x00,0x00,0x00,0x32,0x00,0x39,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x28, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x4c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x02, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x02,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x3a,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x50, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x02,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x53,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x54,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x54, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x51,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3d, 0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x02,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x3f,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x2d,0x00, 0x25,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x53,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x38,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x55,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x02,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x60,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x3b,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x61,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x57,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x02,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x64,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x3d,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x02, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x2e,0x00,0x2c,0x00,0x04, 0x02,0x3a,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x3a,0x00,0x2f,0x00,0x25,0x00,0x00,0x00,0x00,0x28,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x59,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x02,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x6b,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x3a,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x3b,0x00,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x3b, 0x00,0x31,0x00,0x10,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x6d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x31,0x00,0x31,0x2f,0x00,0x2c,0x00,0x00,0x02,0x3c,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x3c,0x00,0x30,0x00, 0x2c,0x00,0x00,0x02,0x3d,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x3d,0x80,0x31,0x00,0x25,0x00,0x00,0x00,0x00, 0x28,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x5c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x38, 0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x31,0x00,0x31,0x30,0x00,0x25,0x00, 0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6f, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x5d,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x38,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x02,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x3e,0x00,0x00,0x5e, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x3e,0x80,0x61,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x72,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0, 0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x18,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x78,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x3f,0x00,0x00, 0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0x40,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0x3f,0x00,0x5b,0x00,0x29,0x00,0x00,0x00,0x00,0x7d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x02,0x02, 0x41,0x00,0x00,0x60,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00, 0x00,0x32,0x00,0x41,0x00,0x32,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0x33,0x00,0x31,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x61,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00,0x00,0x00, 0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x2c, 0x00,0x02,0x02,0x42,0x00,0x00,0x60,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x10,0x00,0x00,0x00,0x32,0x00,0x42,0x80,0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x7a, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x62,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff,0xff,0xff, 0x29,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03, 0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x43,0x00,0x00,0x60,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x43,0x80,0x33,0x00,0x01,0x00, 0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x63,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xe8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x33,0x00,0x29,0x00,0x00,0x00,0x00,0x7f, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x03,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x44,0x00,0x00,0x7c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x44,0x00,0x35, 0x00,0x31,0x34,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x28,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x65,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x45, 0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x45,0x80,0x34,0x00,0x31,0x35,0x00,0x2c,0x00,0x04,0x02, 0x46,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00, 0x00,0x32,0x00,0x46,0x00,0x49,0x00,0x2c,0x00,0x00,0x02,0x47,0x00,0x00,0x7d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x47,0x00, 0x3f,0x00,0x2c,0x00,0x00,0x02,0x48,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x48,0x80,0x61,0x00,0x25,0x04,0x00, 0x00,0x00,0x66,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x66,0x0a,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x66,0x0a,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x02,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66, 0x0a,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x04,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00, 0x00,0x14,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x05,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x09,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x0d,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x66,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x66,0x0a,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x66,0x0a,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66, 0x0a,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a, 0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00, 0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00, 0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x1e, 0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x07,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x0b,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x0f,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x25,0x09, 0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x25,0x09,0x00, 0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x66,0x0a,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00, 0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04, 0x02,0x49,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x32,0x00,0x49,0x80,0x37,0x00,0x31,0x36,0x00,0x29,0x00,0x00,0x00,0x00, 0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x03,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x85, 0x02,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x0f, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x85,0x02,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x02, 0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x17,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x85,0x02,0x00, 0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x07, 0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x69,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x82,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0xfe, 0x01,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x06,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x02, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00, 0x82,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00, 0x60,0x00,0x01,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x82,0x02,0x00,0x00, 0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0x01,0x01,0x00, 0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06, 0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02, 0x4a,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x32,0x00,0x4a,0x80,0x37,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0x36,0x00,0x31,0x37,0x00,0x2c,0x00,0x04,0x02,0x4b,0x00,0x00,0x76,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x4b,0x00,0x3b, 0x00,0x2c,0x00,0x04,0x02,0x4c,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x4c,0x80,0x39,0x00,0x25,0x00,0x00,0x00, 0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x87,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x6c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x85,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, 0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x92,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x02,0x2c,0x00, 0x00,0x02,0x4d,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x32,0x00,0x4d,0x00,0x38,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x71,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x96, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x97,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x98,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x85,0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x74,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0a,0x00, 0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x76,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00, 0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x77,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x75,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x79,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0a,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x38,0x00,0x10,0x00, 0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x85,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xa7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa8,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa9, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa9,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x90,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00, 0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xad, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x7d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x7e,0x0a,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7f,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x7e,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x00,0x24,0x00,0x00, 0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x80,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x7e,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00, 0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x81,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x7e,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x7e,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x02, 0x10,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x83,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x7e,0x0a,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x39,0x00,0x32,0x00, 0x40,0x00,0x3a,0x00,0x2b,0x00,0x02,0x4e,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x4e,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x85,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbb,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbc,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x87,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xbf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x01,0x24,0x00, 0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc0, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc1,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x85,0x02,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd2,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x02, 0x10,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xc6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00, 0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc9,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcb,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xcc,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcd,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x85,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd0,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x90,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x02, 0x01,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x02,0x01,0x00,0x00, 0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x85,0x02,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x93,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a,0x00, 0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xd9,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xda,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00, 0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x96,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x94,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00, 0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x98,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a, 0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00,0xe3, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9a,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x94,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x03,0x10, 0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe6, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x9b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0a,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x3a,0x00,0x25,0x00,0x00, 0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe8,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x9d,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x85,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xec, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xed,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xfb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xee,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xee,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x85,0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x02,0x10, 0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf2, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf2,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xf3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf8, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf8,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x00,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x01,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xaa, 0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x05, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xab,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xaa,0x0a,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xac,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xaa,0x0a,0x00, 0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x08,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xad,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xaa,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x01,0x01,0x00, 0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xae,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xaa,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaf,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xaa,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00, 0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb0,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xaa,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60, 0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x3b,0x00,0x2c,0x00,0x04,0x02,0x4f,0x00, 0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x4f,0x00,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xb2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x13,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x50,0x00,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x50,0x00,0x3c,0x00, 0x10,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x19,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x1a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1d, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1e,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xb9,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xba,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x0a,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xbb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x0a, 0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x25, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xb9,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0xe0,0x01,0x32, 0x00,0x00,0x00,0x61,0x00,0x31,0x3c,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbe,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xbf,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xc0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xbf,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00, 0x61,0x00,0x31,0x3d,0x00,0x2c,0x00,0x00,0x02,0x51,0x00,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x51,0x00,0x3e,0x00, 0x2c,0x00,0x00,0x02,0x52,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x52,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00, 0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xc4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc5,0x0a,0x00,0x00,0x00,0x00,0x85, 0x02,0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x3e,0x00,0x25,0x00, 0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x37, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc7,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3b,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x3c,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc9,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xca,0x0a,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xcb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xca,0x0a,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x3f,0x00, 0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x0a,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xcc,0x0a,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xcc,0x0a,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x04,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xcc,0x0a,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x05,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc, 0x0a,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x06,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x07,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x09, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x11,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x15,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x19,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xcc,0x0a,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xcc,0x0a,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xcc,0x0a,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc, 0x0a,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xcc,0x0a, 0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x53,0x00,0x00,0x7c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x53, 0x80,0x41,0x00,0x31,0x40,0x00,0x29,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x42,0x03,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x3f,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x42,0x03,0x00,0x00,0x06,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x42,0x03,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x03,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x42,0x03,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x42,0x03,0x00,0x00, 0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0x42,0x03,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f, 0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x42,0x03,0x00,0x00,0x1a,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x42,0x03, 0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x28,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x0f,0x00, 0x21,0x01,0x00,0xcd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x07,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x3f, 0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60, 0xff,0x01,0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x07,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00, 0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x02, 0x00,0x3f,0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00, 0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00,0x05,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x3f,0x03,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0x01,0x01, 0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x54,0x00,0x00,0x7c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x54,0x80, 0x41,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x41,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x40,0x00,0x31,0x41, 0x00,0x2c,0x00,0x04,0x02,0x55,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x55,0x00,0x45,0x00,0x2c,0x00,0x04,0x02, 0x56,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x32,0x00,0x56,0x80,0x43,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xce,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0xcf,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x46,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x42,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x01, 0x24,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x57,0x00,0x00, 0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x57,0x00,0x42,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xd4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x0a,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd6,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xd5,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24, 0x00,0x00,0x00,0x00,0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x51,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xd7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x0a,0x00,0x00,0x00,0x00,0x42,0x03, 0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xd8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x0a,0x00, 0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x55,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd9,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00, 0x40,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x42,0x00,0x10,0x00,0x00,0x00,0x00, 0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x57,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xda,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x0a,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdc,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xdb,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24, 0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xdd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x0a,0x00,0x00,0x00,0x00,0x42,0x03, 0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xde,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x0a,0x00, 0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x60,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00, 0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x63,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x0a,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x43,0x00, 0x32,0x00,0x40,0x00,0x44,0x00,0x2b,0x00,0x02,0x58,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0x58,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00,0x64,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0xe2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x67,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x69,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x42,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x01, 0x24,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x6d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x6e,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6e,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00, 0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x71,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00, 0x72,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x73,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03, 0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xe9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xeb,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24, 0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xec,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00,0x00,0x42,0x03, 0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xed,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00, 0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x7c,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7d,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00, 0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xef,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x80,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x80,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xea,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x03,0x10,0x00,0x00,0x00, 0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x83,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xea,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0, 0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x44,0x00,0x25,0x00,0x00,0x00,0x00,0x84, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xf3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x89,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x8a, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x8b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00, 0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00, 0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42, 0x03,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x91,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x92, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf9,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xfb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00, 0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x96,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x01,0x10,0x00, 0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x99,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfd, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xfa,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00, 0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9c,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0, 0x02,0x10,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x9f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x45,0x00,0x2c, 0x00,0x04,0x02,0x59,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0x59,0x00,0x47,0x00,0x25,0x00,0x00,0x00,0x00,0xa0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x01,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x02,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x03,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa5,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x5a,0x00, 0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x5a,0x00,0x46,0x00,0x10,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xa7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x06,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x07,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x0b,0x00, 0x00,0x00,0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xac,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xac,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x08,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x06,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x01,0x10,0x00, 0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x09, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00, 0x00,0xc0,0x01,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x46,0x00,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb0,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0a,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x0b,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0b,0x0b,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x0b,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00, 0x61,0x00,0x31,0x47,0x00,0x2c,0x00,0x00,0x02,0x5b,0x00,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x5b,0x00,0x48,0x00, 0x2c,0x00,0x00,0x02,0x5c,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x5c,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00, 0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb6,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x0e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42, 0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x61, 0x00,0x31,0x48,0x00,0x25,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x12,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbb,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x42,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x13,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x14,0x0b,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x15,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x14,0x0b,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x49,0x00,0x2c, 0x00,0x00,0x02,0x5d,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x32,0x00,0x5d,0x00,0x51,0x00,0x2c,0x00,0x00,0x02,0x5e,0x00, 0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x5e,0x80,0x61,0x00,0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x67,0x0a,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0x67,0x0a,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x0c,0x00,0x00,0x02,0x00, 0x67,0x0a,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67, 0x0a,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x67,0x0a, 0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x0a,0x00, 0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00, 0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04, 0x02,0x5f,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x32,0x00,0x5f,0x80,0x4b,0x00,0x31,0x4a,0x00,0x29,0x00,0x00,0x00,0x00, 0xbf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xc2, 0x03,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x0c, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xc2,0x03,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbf,0x03, 0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x14,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xc2,0x03,0x00, 0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x07, 0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0xc2, 0x03,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x17,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xbf,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0xfe, 0x01,0x00,0x02,0x00,0xbf,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x08,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0xbf,0x03,0x00,0x00,0x00,0x02, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00, 0xbf,0x03,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00, 0x60,0x00,0x01,0x00,0x02,0x00,0xbf,0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xbf,0x03,0x00,0x00, 0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0x01,0x01,0x00, 0x02,0x00,0xbf,0x03,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08, 0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xbf,0x03,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02, 0x60,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x32,0x00,0x60,0x80,0x4b,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0x4a,0x00,0x31,0x4b,0x00,0x2c,0x00,0x04,0x02,0x61,0x00,0x00,0x76,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x61,0x00,0x4e, 0x00,0x2c,0x00,0x04,0x02,0x62,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x62,0x80,0x4c,0x00,0x24,0x03,0x00,0x00, 0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x0b,0x00,0x00,0x00,0x00, 0xc2,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x18,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x1a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x1b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x0b,0x00, 0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xca,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcb,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1c,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00, 0x00,0x02,0x2c,0x00,0x00,0x02,0x63,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x63,0x80,0x61,0x00,0x10,0x00,0x00, 0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xcc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcd,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00, 0x80,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x4c,0x00,0x32,0x00,0x40,0x00,0x4d, 0x00,0x2b,0x00,0x02,0x64,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x64,0x80, 0x61,0x00,0x24,0x03,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x1e,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0b,0x00,0x00,0x00,0x00,0xc2, 0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x20,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0b, 0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xd3, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x1e,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x22,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0b,0x00,0x00, 0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xd7,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x1e,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x02,0x10,0x00,0x00, 0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd9,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xda,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x24,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00, 0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x25,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0b,0x00,0x00,0x00, 0x00,0xc2,0x03,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x4d,0x00, 0x24,0x03,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0b, 0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xde, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdf,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x27, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x28,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0b,0x00,0x00, 0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xe2,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x26,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x2a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0b,0x00,0x00,0x00,0x00, 0xc2,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x26, 0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00, 0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe8,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2c,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x26,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x03, 0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x4e,0x00,0x2c,0x00,0x04,0x02,0x65,0x00,0x00, 0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x65,0x00,0x4f,0x00,0x24,0x03,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x2d,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x2e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x0b,0x00,0x00,0x00, 0x00,0xc2,0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xed,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xed,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x2d,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02, 0x66,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x66,0x00,0x61,0x00,0x10,0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xef,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x2d,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00, 0x61,0x00,0x31,0x4f,0x00,0x2c,0x00,0x00,0x02,0x67,0x00,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x67,0x00,0x50,0x00, 0x2c,0x00,0x00,0x02,0x68,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x68,0x80,0x61,0x00,0x24,0x03,0x00,0x00,0x00, 0xf1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x0b,0x00,0x00,0x00,0x00,0xc2, 0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x50,0x00,0x24,0x03, 0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x0b,0x00,0x00, 0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x32,0x0b,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x80, 0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x51,0x00,0x25,0x04,0x00,0x00,0x00,0x34, 0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0x67,0x0a,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x67,0x0a,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x34,0x0b,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x34,0x0b,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x05, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x34,0x0b,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x34,0x0b,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x69,0x00, 0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32, 0x00,0x69,0x80,0x53,0x00,0x31,0x52,0x00,0x29,0x00,0x00,0x00,0x00,0xf4,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x03,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xf7,0x03,0x00,0x00, 0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00,0x02,0x00, 0x02,0x00,0xf7,0x03,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xf7,0x03,0x00,0x00,0x0d,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xf7,0x03, 0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00, 0x05,0x00,0x02,0x00,0xf7,0x03,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xf4,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xf7,0x03,0x00,0x00,0x19,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00,0x07,0x00,0x02,0x00, 0xf7,0x03,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x0e,0x00,0x21,0x01,0x00,0x35,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x09,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02, 0x00,0xf4,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00, 0x00,0x60,0xff,0x01,0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00,0x02,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xf4,0x03,0x00, 0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0x00,0x01, 0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x09,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00,0x05,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xf4, 0x03,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0, 0x01,0x01,0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x6a,0x00,0x00, 0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00, 0x6a,0x80,0x53,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x52,0x00, 0x31,0x53,0x00,0x2c,0x00,0x04,0x02,0x6b,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x6b,0x00,0x57,0x00,0x2c,0x00, 0x04,0x02,0x6c,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0x6c,0x80,0x55,0x00,0x25,0x00,0x00,0x00,0x00,0xf8,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x36,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x01,0x07,0x00,0x37,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x38,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xfd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfd,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xfe,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfe,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00, 0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x01,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x6d, 0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0x6d,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x3c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x0b,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x05,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x3d,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0, 0x00,0x24,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x3f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x0b,0x00,0x00,0x00,0x00, 0xf7,0x03,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3d, 0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0a, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x41,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03, 0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x54,0x00,0x10,0x00,0x00, 0x00,0x00,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xf7,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x42,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x0b,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x44,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x43,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0, 0x00,0x24,0x00,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x45,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x0b,0x00,0x00,0x00,0x00, 0xf7,0x03,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x43, 0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00, 0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x47,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03, 0x00,0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x48,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x0b,0x00, 0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0x61,0x00,0x31, 0x55,0x00,0x32,0x00,0x40,0x00,0x56,0x00,0x2b,0x00,0x02,0x6e,0x00,0x05,0x00,0x01, 0x00,0x00,0x00,0x32,0x00,0x6e,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00,0x19,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x49,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x01,0x07,0x00,0x4a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x1e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1e,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x1f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1f,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00, 0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x22,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00, 0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03, 0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x26,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x26, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x03,0x10,0x00,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x28,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x28,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xf7,0x03,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x51,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x53,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0, 0x00,0x24,0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x2e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x54,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00,0x00,0x00,0x00, 0xf7,0x03,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52, 0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00, 0x31,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x56,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03, 0x00,0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x57,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00, 0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x35,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x52,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x03,0x10,0x00, 0x00,0x00,0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00, 0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x56,0x00,0x25,0x00,0x00,0x00, 0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x5b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xf7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x3c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3e,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7, 0x03,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x42,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x02,0x10,0x00, 0x00,0x00,0x00,0x43,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x43, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x43,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x44,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0xf7,0x03,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x45,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x47,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x48,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x62,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x62, 0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00, 0x4b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x64,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x62,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x01, 0x10,0x00,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x4e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x65,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x62,0x0b,0x00,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x62,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x02,0x10,0x00, 0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x51, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x62,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00, 0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x68,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x62,0x0b,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x57, 0x00,0x2c,0x00,0x04,0x02,0x6f,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x6f,0x00,0x59,0x00,0x25,0x00,0x00,0x00, 0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x56,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x6a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xf7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x58,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5a,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02, 0x70,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x70,0x00,0x58,0x00,0x10,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x5d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x5e,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x6e, 0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00, 0x61,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x70,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x6e,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x01, 0x10,0x00,0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x71,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x0b,0x00,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x58,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x65, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x72,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x73,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x74,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x0b,0x00, 0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x69,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x73,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x01,0x32,0x00, 0x00,0x00,0x61,0x00,0x31,0x59,0x00,0x2c,0x00,0x00,0x02,0x71,0x00,0x00,0x76,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x71,0x00, 0x5a,0x00,0x2c,0x00,0x00,0x02,0x72,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x72,0x80,0x61,0x00,0x25,0x00,0x00, 0x00,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6b,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x76,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xf7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x77,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x78,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00,0x32,0x00,0x00, 0x00,0x61,0x00,0x31,0x5a,0x00,0x25,0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x79,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0x7a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x70, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x72,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7b,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x7c,0x0b,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x7d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x7c,0x0b,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x5b, 0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x7e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x75,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x7f,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xbc, 0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x80,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x25, 0x04,0x00,0x00,0x00,0x81,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x82,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x83,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x84,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x85,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x04,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x86, 0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x05,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x87,0x0b, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x06,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x88,0x0b,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x0a,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x81,0x0b,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x82,0x0b,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x83,0x0b,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x84,0x0b,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x85,0x0b,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x86,0x0b,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x87,0x0b,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x81,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x82,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x83,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x84,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x85,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x86, 0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x87,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x88,0x0b,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x81,0x0b,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x82,0x0b,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x83,0x0b,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x84,0x0b,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x85,0x0b,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x86,0x0b,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x87,0x0b,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25,0x09, 0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x04,0x02,0x73,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x32,0x00,0x73,0x00,0x5e,0x00,0x2c,0x00,0x04,0x02,0x74,0x00, 0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x74,0x80,0x5c,0x00,0x25,0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x89,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x81,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x81,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x82,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x82,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x83,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x79, 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x84,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x85,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x04,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x87,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x87,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x7b,0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x75,0x00,0x00,0x76,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x75,0x80, 0x61,0x00,0x10,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x89,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x89,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x7c,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x61, 0x00,0x31,0x5c,0x00,0x32,0x00,0x40,0x00,0x5d,0x00,0x2b,0x00,0x02,0x76,0x00,0x05, 0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x76,0x80,0x61,0x00,0x25,0x00,0x00,0x00,0x00, 0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x8e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x77, 0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x8c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x8e,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x8f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8f,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x91,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x90,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x04, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x92,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x92, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7b,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x93,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x93,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x93,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x94,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x7c,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x95,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x95,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x96,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x96,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7d,0x04,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x97,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x98, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x98,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x7e,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x5d, 0x00,0x25,0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x95,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x9a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x9b,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x9c,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x97,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x9d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x9f,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x7a,0x04,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa0, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa0,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa1,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xa1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7b,0x04,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xa3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xa3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x7c,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa5,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7d, 0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x5e,0x00,0x2c,0x00, 0x04,0x02,0x77,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0x77,0x00,0x5f,0x00,0x25,0x00,0x00,0x00,0x00,0x6a,0x0a, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa6,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x03,0x07,0x00,0x9b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xa8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xaa,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xaa,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x78,0x00,0x00, 0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x78,0x00,0x61,0x00,0x10,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xac, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x61,0x00,0x31,0x5f,0x00,0x2c,0x00,0x00,0x02,0x79,0x00,0x00,0x76,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x79,0x00,0x60, 0x00,0x2c,0x00,0x00,0x02,0x7a,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x7a,0x80,0x61,0x00,0x25,0x00,0x00,0x00, 0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xad,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x9e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x77,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x61,0x00,0x31,0x60,0x00,0x25, 0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xae,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x9f,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x77,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xaf,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x78,0x04,0x00,0x00,0x00,0x00,0x31,0x61,0x00,0x24,0x00,0x00,0x00,0x00,0xb0,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xb1,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xb1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb1, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb0,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x7b,0x00,0x00, 0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x7b,0x80,0x91,0x00,0x01,0x00,0x00,0x00,0x00,0xb1,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xb1,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0xe0,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb6,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x18,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xb7,0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x7c,0x00, 0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c, 0x00,0x04,0x02,0x7d,0x00,0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0x7c,0x00,0x8b,0x00,0x29,0x00,0x00,0x00,0x00,0xbf, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x02, 0x02,0x7e,0x00,0x00,0xa2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00, 0x00,0x00,0x32,0x00,0x7e,0x00,0x62,0x00,0x29,0x00,0x00,0x00,0x00,0xbe,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x63,0x00,0x31,0x62,0x00,0x01,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xa3,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xa1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00,0x00, 0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00, 0x2c,0x00,0x02,0x02,0x7f,0x00,0x00,0xa2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x10,0x00,0x00,0x00,0x32,0x00,0x7f,0x80,0x63,0x00,0x01,0x00,0x00,0x00,0x00, 0xb9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xa4,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbc, 0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff,0xff, 0xff,0x29,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x03,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x80,0x00,0x00,0xa2,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x80,0x80,0x63,0x00,0x01, 0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0xa5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xe8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x63,0x00,0x29,0x00,0x00,0x00,0x00, 0xc1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x81,0x00,0x00,0xbe,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x81,0x00, 0x65,0x00,0x31,0x64,0x00,0x24,0x00,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x0a,0x00,0x00,0x00,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xa7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0a, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0x82,0x00,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x82,0x80,0x64,0x00,0x31,0x65,0x00,0x2c,0x00,0x04, 0x02,0x83,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00, 0x00,0x00,0x32,0x00,0x83,0x00,0x79,0x00,0x2c,0x00,0x00,0x02,0x84,0x00,0x00,0xbf, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x84, 0x00,0x6f,0x00,0x2c,0x00,0x00,0x02,0x85,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x85,0x80,0x91,0x00,0x25,0x04, 0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xa8,0x0b,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xa8,0x0b,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xa8,0x0b,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8, 0x0b,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00, 0x1c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x05,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x09,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x0d,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x11,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xa8,0x0b,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xa8,0x0b,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xa8,0x0b,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8, 0x0b,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b, 0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00, 0x00,0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00, 0x1e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x0b,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x0f,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x13,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x25,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x25,0x09,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x86,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0x86,0x80,0x67,0x00,0x31,0x66,0x00,0x29,0x00,0x00,0x00, 0x00,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x04,0x00,0x00,0x03,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0xc7,0x04,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x04,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0xc7,0x04,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xc7,0x04,0x00,0x00, 0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xc7,0x04,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4, 0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xc7,0x04,0x00,0x00,0x17,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xc7,0x04, 0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00, 0x07,0x00,0x02,0x00,0xc7,0x04,0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0b,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0xab,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xc4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0, 0xfe,0x01,0x00,0x02,0x00,0xc4,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0b,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0xc4,0x04,0x00,0x00,0x00, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0xff,0x01,0x00,0x02, 0x00,0xc4,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00, 0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xc4,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xc4,0x04,0x00, 0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0x01,0x01, 0x00,0x02,0x00,0xc4,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0b,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xc4,0x04,0x00,0x00,0x00,0x07,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0xc6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0x87,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x87,0x80,0x67,0x00,0x29,0x00,0x00,0x00,0x00,0xbe,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x66,0x00,0x31,0x67,0x00,0x2c,0x00,0x04,0x02,0x88,0x00,0x00,0xb5,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x88,0x00, 0x6b,0x00,0x2c,0x00,0x04,0x02,0x89,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x89,0x80,0x69,0x00,0x25,0x00,0x00, 0x00,0x00,0xc8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc9,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xae,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xc7,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaf,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xcb,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xce, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd0,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xcf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x02,0x2c, 0x00,0x00,0x02,0x8a,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x32,0x00,0x8a,0x00,0x68,0x00,0x01,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xd5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xd8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xda, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xda,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xb7,0x0b, 0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xdd, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xde,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xb7,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00, 0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xb7,0x0b,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xe1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xba,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xb7,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xe3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xbb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xb7,0x0b,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x68,0x00,0x10, 0x00,0x00,0x00,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe6,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe7,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xe7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xe9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xea,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xeb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xeb,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xd2,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xec,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xec,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xed,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00, 0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xef,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xbf,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x0b,0x00,0x00,0x00,0x00,0xc7, 0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf1,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xc0,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x00,0x24,0x00, 0x00,0x00,0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf2, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc2, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00, 0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x0b,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc4,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xc0,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60, 0x02,0x10,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xf9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xc5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x0b,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x69,0x00,0x32, 0x00,0x7d,0x00,0x6a,0x00,0x2b,0x00,0x02,0x8b,0x00,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0x8b,0x80,0x91,0x00,0x25,0x00,0x00,0x00,0x00,0xfa,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xfb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xfd,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfd, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0x0e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfe,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xff,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x01,0x24, 0x00,0x00,0x00,0x00,0x12,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x12,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x03, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x03,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x14,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xcc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80, 0x02,0x10,0x00,0x00,0x00,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x07,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x08, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xce,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x0a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00, 0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0x0b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0b, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x0c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0d,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x0e, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x0e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0f,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x11,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x12,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x12,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x13,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40, 0x02,0x01,0x00,0x00,0x00,0x00,0x14,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x15,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x02,0x01,0x00, 0x00,0x00,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x17,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x17,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x18, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x18,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x0b, 0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x1b, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00, 0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x1d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x1e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x0b,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x1f,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1f,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1f,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd9,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xd6,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x00, 0x00,0x00,0x21,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x22,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xda,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x0b,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0x23,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6, 0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x25,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdc,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xd6,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x03, 0x10,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x27,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xdd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x0b,0x00,0x00,0x00,0x00,0xc7, 0x04,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x6a,0x00,0x25,0x00, 0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2a, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xdf,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2c,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7, 0x04,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x3b,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x2e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0x3d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x30,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0xc7,0x04,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x02, 0x10,0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x34,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x35,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x37,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x37,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x38,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x39,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x3a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3a,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3c,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3d,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x3e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x02, 0x01,0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x42, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x02,0x01,0x00,0x00, 0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x35,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x43,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x43,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x44,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x45,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xeb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xec,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x46,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x47,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xed,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x0b,0x00,0x00,0x00,0x00,0xc7, 0x04,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x48,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x0b, 0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x4a, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4a,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4b,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xec,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x01,0x01, 0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xf0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x0b,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0x4e,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4f,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xec,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x02,0x10,0x00,0x00, 0x00,0x00,0x50,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x50,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf2,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00, 0x60,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x6b,0x00,0x2c,0x00,0x04,0x02,0x8c, 0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x8c,0x00,0x6d,0x00,0x25,0x00,0x00,0x00,0x00,0x52,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x53,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0xf4,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x54,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x55, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x57,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x56,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x58,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x58,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x8d,0x00,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x8d,0x00,0x6c, 0x00,0x10,0x00,0x00,0x00,0x00,0x59,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x5a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x59,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x5b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5b,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x5c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x5e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x5f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x59,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x60,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x60,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfa,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xfb,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0x63,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xfc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x0b,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xfb, 0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00, 0x67,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xfb,0x0b,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x01, 0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x6c,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xff,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6c, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6d,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6e,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x0c,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x0c,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x0c,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x01,0x32,0x00,0x00, 0x00,0x91,0x00,0x31,0x6d,0x00,0x2c,0x00,0x00,0x02,0x8e,0x00,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x8e,0x00,0x6e, 0x00,0x2c,0x00,0x00,0x02,0x8f,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x8f,0x80,0x91,0x00,0x25,0x00,0x00,0x00, 0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x73,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x04,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x75,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x05,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x75,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x76,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x06,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x07,0x0c,0x00,0x00,0x00,0x00, 0xc7,0x04,0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x6e,0x00,0x25, 0x00,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x79,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x09,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7a,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7b,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x7c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7d, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7e,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7f,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0b,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x0c,0x0c,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x0d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x0c,0x00,0x00, 0x00,0x00,0xc7,0x04,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x6f, 0x00,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9, 0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xa9,0x0b, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x0e,0x0c,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x04, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x0e,0x0c,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x05,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x0e,0x0c,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x06,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e, 0x0c,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x07,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00, 0x09,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x0d, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x11,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x15,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x19,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x1d,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24, 0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x24,0x09, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x0e,0x0c,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x0e,0x0c,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x0e,0x0c,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x0e, 0x0c,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x90,0x00,0x00, 0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x90,0x80,0x71,0x00,0x31,0x70,0x00,0x29,0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x06, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x84,0x05,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x81,0x05, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x0e,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x84,0x05,0x00, 0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x81,0x05,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x1a,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x84, 0x05,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x0f, 0x00,0x21,0x01,0x00,0x0f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0c,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x81,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0x81,0x05,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0x81,0x05,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x81,0x05,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0x81,0x05,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x81,0x05,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x81,0x05, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0x81,0x05,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x83,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x91,0x00,0x00,0xbe, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x91, 0x80,0x71,0x00,0x29,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x83,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x70,0x00,0x31, 0x71,0x00,0x2c,0x00,0x04,0x02,0x92,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x92,0x00,0x75,0x00,0x2c,0x00,0x04, 0x02,0x93,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x93,0x80,0x73,0x00,0x25,0x00,0x00,0x00,0x00,0x85,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x86,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x10,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x11,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x87,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x89,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8a, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8a,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x8b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8b,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8c,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x14,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x8c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x8d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x8e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8e,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x94,0x00, 0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x94,0x00,0x72,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x90,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x16,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x17,0x0c,0x00,0x00,0x00, 0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x91,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x17,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00, 0x24,0x00,0x00,0x00,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x94,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x19,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x17,0x0c,0x00,0x00,0x00,0x00,0x84, 0x05,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x95,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x95,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x96,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x1a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x17,0x0c, 0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x97,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x17,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00, 0x00,0x40,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x72,0x00,0x10,0x00,0x00,0x00, 0x00,0x98,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x99,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x99,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84, 0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1d,0x0c,0x00,0x00,0x00, 0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x9c,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9d,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1e,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x1d,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00, 0x24,0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x9f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1d,0x0c,0x00,0x00,0x00,0x00,0x84, 0x05,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa0,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xa1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x20,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1d,0x0c, 0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xa2, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1d,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00, 0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0xa4,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xa5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x22,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1d,0x0c,0x00,0x00, 0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x73, 0x00,0x32,0x00,0x7d,0x00,0x74,0x00,0x2b,0x00,0x02,0x95,0x00,0x05,0x00,0x01,0x00, 0x00,0x00,0x32,0x00,0x95,0x80,0x91,0x00,0x25,0x00,0x00,0x00,0x00,0xa6,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa7,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x24,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xa9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xa9,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xaa,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xaa,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xab, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xab,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xac,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xac,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xac,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xad,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xaf,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xaf,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb0,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb1,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xb1,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00, 0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb3,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00, 0x00,0xb4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb5,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84, 0x05,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xb6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x2b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00,0x00, 0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2d,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00, 0x24,0x00,0x00,0x00,0x00,0xba,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xba,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xba,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xbb,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00,0x00,0x00,0x84, 0x05,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c, 0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xbe, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00, 0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xc1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x31,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00, 0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0xc2,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc2,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc2,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x32,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x03,0x10,0x00,0x00, 0x00,0x00,0xc4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc4,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc5,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00, 0xc0,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x74,0x00,0x25,0x00,0x00,0x00,0x00, 0xc6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc7,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x35,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x84, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc9,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x36,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xc9,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xcb,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xcb,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0xcc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcc,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcc,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcd,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x38,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xcd,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05, 0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xcf,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xcf, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x02,0x10,0x00,0x00, 0x00,0x00,0xd0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd0,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd1,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd1,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x84,0x05,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xd2,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd2,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xd3,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xd4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xd5,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0c, 0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xd8, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd8,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd8,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x01,0x10, 0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xda,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xda,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdb, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x3f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdc,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x3c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x02,0x10,0x00,0x00, 0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xde,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xde,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdf,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x41,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00, 0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x42,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0c,0x00,0x00,0x00, 0x00,0x84,0x05,0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x75,0x00, 0x2c,0x00,0x04,0x02,0x96,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x96,0x00,0x77,0x00,0x25,0x00,0x00,0x00,0x00, 0xe2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe3,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x43,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x44,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x84, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe4,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe5,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xe5,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xe6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xe6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe6,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xe7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe7,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x97, 0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x97,0x00,0x76,0x00,0x10,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe8,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xe9,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xea,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xeb,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xec,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xed,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c, 0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xee, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xee,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xee,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xee,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4a,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x01,0x10, 0x00,0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xf0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf1, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x4b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0x84,0x05, 0x00,0x00,0xc0,0x01,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x76,0x00,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf2,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xf3,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4c,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x4d,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0xf4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x4e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x4d,0x0c,0x00,0x00, 0x00,0x00,0x84,0x05,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xf6,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x4d,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x01,0x32,0x00,0x00, 0x00,0x91,0x00,0x31,0x77,0x00,0x2c,0x00,0x00,0x02,0x98,0x00,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x98,0x00,0x78, 0x00,0x2c,0x00,0x00,0x02,0x99,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x99,0x80,0x91,0x00,0x25,0x00,0x00,0x00, 0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf8,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x50,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x84,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xfa,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x51,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x52,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00, 0x91,0x00,0x31,0x78,0x00,0x25,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x54,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfd,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xfe,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xff,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x56,0x0c,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x57,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x0c,0x00,0x00,0x00, 0x00,0x84,0x05,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x79,0x00, 0x2c,0x00,0x00,0x02,0x9a,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x9a,0x00,0x81,0x00,0x2c,0x00,0x00,0x02,0x9b, 0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0x9b,0x80,0x91,0x00,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0xa9,0x0b,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0xa9,0x0b,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x10,0x00,0x00,0x02,0x00, 0xa9,0x0b,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xa9, 0x0b,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xa9,0x0b, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x9c,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0x9c,0x80,0x7b,0x00,0x31,0x7a,0x00,0x29,0x00,0x00,0x00, 0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x04,0x06,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x06,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x04,0x06,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x04,0x06,0x00,0x00, 0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x04,0x06,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01, 0x06,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x04,0x06,0x00,0x00,0x14,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x04,0x06, 0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00, 0x07,0x00,0x02,0x00,0x04,0x06,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0d,0x00,0x00,0x00,0x00, 0x04,0x06,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x59,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x01, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0, 0xfe,0x01,0x00,0x02,0x00,0x01,0x06,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0d,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x01,0x06,0x00,0x00,0x00, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0xff,0x01,0x00,0x02, 0x00,0x01,0x06,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00, 0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x01,0x06,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x01,0x06,0x00, 0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0x01,0x01, 0x00,0x02,0x00,0x01,0x06,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0d,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x01,0x06,0x00,0x00,0x00,0x07,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0x9d,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x9d,0x80,0x7b,0x00,0x29,0x00,0x00,0x00,0x00,0xbe,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x7a,0x00,0x31,0x7b,0x00,0x2c,0x00,0x04,0x02,0x9e,0x00,0x00,0xb5,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x9e,0x00, 0x7e,0x00,0x2c,0x00,0x04,0x02,0x9f,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x9f,0x80,0x7c,0x00,0x24,0x03,0x00, 0x00,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x0c,0x00,0x00,0x00, 0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x5a,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x09,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x5c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x0c,0x00,0x00,0x00,0x00,0x04, 0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0a,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x5d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x0c, 0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x0c, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00, 0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xa0,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xa0,0x80,0x91,0x00,0x10,0x00, 0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x0e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5f, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00, 0x00,0x80,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x7c,0x00,0x32,0x00,0x7d,0x00, 0x7d,0x00,0x2b,0x00,0x02,0xa1,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xa1, 0x80,0x91,0x00,0x24,0x03,0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x60,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x11,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x12,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x61,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0c,0x00,0x00,0x00,0x00, 0x04,0x06,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x13,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x14,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x62,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x60, 0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0x15,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x60,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x64,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0c,0x00, 0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x19,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x19,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1a,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x19,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x65,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x60,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x02,0x10,0x00, 0x00,0x00,0x00,0x1b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1b, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x1b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00, 0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x1d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x1e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x67,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0c,0x00,0x00, 0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x7d, 0x00,0x24,0x03,0x00,0x00,0x00,0x1f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x68, 0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x20,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x21, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x69,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x0c,0x00,0x00,0x00,0x00,0x04,0x06, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x23,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x6a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x0c,0x00, 0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x24,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x25,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6b,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x68,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x26,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x27,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x6c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x0c,0x00,0x00,0x00, 0x00,0x04,0x06,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x29,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x68,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00, 0x00,0x2a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6e,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x68,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00, 0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x7e,0x00,0x2c,0x00,0x04,0x02,0xa2,0x00, 0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0xa2,0x00,0x7f,0x00,0x24,0x03,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x6f,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x2e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x70,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0c,0x00,0x00, 0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x2f,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x6f,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x01,0x2c,0x00,0x00, 0x02,0xa3,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xa3,0x00,0x91,0x00,0x10,0x00,0x00,0x00,0x00,0x31,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x72,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x6f,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x80,0x01,0x32,0x00,0x00, 0x00,0x91,0x00,0x31,0x7f,0x00,0x2c,0x00,0x00,0x02,0xa4,0x00,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xa4,0x00,0x80, 0x00,0x2c,0x00,0x00,0x02,0xa5,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xa5,0x80,0x91,0x00,0x24,0x03,0x00,0x00, 0x00,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x0c,0x00,0x00,0x00,0x00, 0x04,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x80,0x00,0x24, 0x03,0x00,0x00,0x00,0x34,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x0c,0x00, 0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x0c,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00, 0x80,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x81,0x00,0x25,0x04,0x00,0x00,0x00, 0x76,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76, 0x0c,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c, 0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x02,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00, 0x00,0x0c,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x14, 0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x1c,0x00,0x00, 0x02,0x00,0xa9,0x0b,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x76,0x0c,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x76,0x0c,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0xa6, 0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x32,0x00,0xa6,0x80,0x83,0x00,0x31,0x82,0x00,0x29,0x00,0x00,0x00,0x00,0x36,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x06,0x00,0x00,0x01,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x39,0x06,0x00, 0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x39,0x06,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x36,0x06,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x39,0x06,0x00,0x00,0x0d,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x39, 0x06,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0x39,0x06,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x39,0x06,0x00,0x00,0x19, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x07,0x00,0x02, 0x00,0x39,0x06,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0e,0x00,0x00,0x00,0x00,0x39,0x06,0x00, 0x00,0x0e,0x00,0x21,0x01,0x00,0x77,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x36,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0xfe,0x01,0x00, 0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e, 0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x02,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x36,0x06, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x00, 0x01,0x00,0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0e,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x05, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00, 0x36,0x06,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00, 0xe0,0x01,0x01,0x00,0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xa7,0x00, 0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0xa7,0x80,0x83,0x00,0x29,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x82, 0x00,0x31,0x83,0x00,0x2c,0x00,0x04,0x02,0xa8,0x00,0x00,0xb5,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xa8,0x00,0x87,0x00,0x2c, 0x00,0x04,0x02,0xa9,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0xa9,0x80,0x85,0x00,0x25,0x00,0x00,0x00,0x00,0x3a, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3b,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x78,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x01,0x07,0x00,0x79,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x3d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x3f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3f,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x40, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x41,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x41,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00, 0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x43,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x43,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02, 0xaa,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x32,0x00,0xaa,0x00,0x84,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x44,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x7e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x0c,0x00, 0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x47,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x80,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00, 0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x48,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x49,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x81,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x0c,0x00,0x00,0x00, 0x00,0x39,0x06,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x7f,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x4c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x83,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x0c,0x00,0x00,0x00,0x00,0x39, 0x06,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x84,0x00,0x10,0x00, 0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4e,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4f,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x50,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x84,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0c,0x00, 0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x51,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00, 0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x54,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x87,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0c,0x00,0x00,0x00, 0x00,0x39,0x06,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x55,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x55,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x55,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x85,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0x57,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x58,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x89,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0c,0x00,0x00,0x00,0x00,0x39, 0x06,0x00,0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0x59,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x8a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0c, 0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0x91,0x00, 0x31,0x85,0x00,0x32,0x00,0x7d,0x00,0x86,0x00,0x2b,0x00,0x02,0xab,0x00,0x05,0x00, 0x01,0x00,0x00,0x00,0x32,0x00,0xab,0x80,0x91,0x00,0x25,0x00,0x00,0x00,0x00,0x5b, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5c,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x01,0x07,0x00,0x8c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x5e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x80, 0x00,0x24,0x00,0x00,0x00,0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x60,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x60,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x61, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x62,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00, 0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x63,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x63,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x64,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x64,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00, 0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x91,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x66,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x06,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x68,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x03,0x10,0x00, 0x00,0x00,0x00,0x69,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x69,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6a,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6a,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x06,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x93,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c,0x00, 0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00, 0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x6f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x96,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c,0x00,0x00,0x00, 0x00,0x39,0x06,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x71,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x71,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x94,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x74,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x98,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c,0x00,0x00,0x00,0x00,0x39, 0x06,0x00,0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0x75,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x76,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c, 0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x77, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x77,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x77,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9a,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x94,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x03,0x10, 0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7a, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x9b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0c,0x00,0x00,0x00,0x00,0x39,0x06, 0x00,0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x86,0x00,0x25,0x00,0x00, 0x00,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x7c,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x9d,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x7e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x80, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0x81,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x81,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x81,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x82,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x82,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x39,0x06,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x83,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x84,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x02,0x10, 0x00,0x00,0x00,0x00,0x85,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x85,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x85,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x86, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x86,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x06,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x87,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x88,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x89,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x8a,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa3, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xa4,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa6,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xa4,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20, 0x01,0x10,0x00,0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x90,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xa7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0c,0x00,0x00,0x00,0x00, 0x39,0x06,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa8,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xa4,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x02,0x10, 0x00,0x00,0x00,0x00,0x93,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x93,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x93,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xa9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0c,0x00,0x00,0x00,0x00,0x39,0x06, 0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x95,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xaa,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0c,0x00, 0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0x91,0x00,0x31, 0x87,0x00,0x2c,0x00,0x04,0x02,0xac,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xac,0x00,0x89,0x00,0x25,0x00,0x00, 0x00,0x00,0x97,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x98,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xac,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xad,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x9a,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9c, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x01,0x2c,0x00,0x00, 0x02,0xad,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xad,0x00,0x88,0x00,0x10,0x00,0x00,0x00,0x00,0x9d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9e,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x9e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x9f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa0,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaf, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb0,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa1,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xb0,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00, 0x00,0xa3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa4,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa3,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xb0,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20, 0x01,0x10,0x00,0x00,0x00,0x00,0xa5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xa5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xa6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xb3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb0,0x0c,0x00,0x00,0x00,0x00, 0x39,0x06,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x88,0x00,0x01, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xa7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa8,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb4,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x0c, 0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0xab, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb7,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x01,0x32, 0x00,0x00,0x00,0x91,0x00,0x31,0x89,0x00,0x2c,0x00,0x00,0x02,0xae,0x00,0x00,0xb5, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xae, 0x00,0x8a,0x00,0x2c,0x00,0x00,0x02,0xaf,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xaf,0x80,0x91,0x00,0x25,0x00, 0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xad, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xb8,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xba,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x00,0x32,0x00, 0x00,0x00,0x91,0x00,0x31,0x8a,0x00,0x25,0x00,0x00,0x00,0x00,0xb0,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb1,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbb,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0xbc,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xb2,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x06,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb3, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xb4,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbd,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xbe,0x0c,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xb5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xbf,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x0c,0x00, 0x00,0x00,0x00,0x39,0x06,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31, 0x8b,0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0xc0,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xc1, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xbc,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb8,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xc2,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xa1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00, 0x25,0x04,0x00,0x00,0x00,0xc3,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xc4,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xc5,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xc6,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xc7,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x04,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xc8,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x05,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc9, 0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x06,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xca,0x0c, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x0b,0x00,0x00,0x07,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc3,0x0c,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc4,0x0c,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc5,0x0c,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc6,0x0c,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc7,0x0c,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc9,0x0c,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x23,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xca,0x0c,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xc3,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xc4,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xc5,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xc6,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xc7,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x04,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xc8,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x05,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc9, 0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x06,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xca,0x0c, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc3,0x0c,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc4,0x0c,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc5,0x0c,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc6,0x0c,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc7,0x0c,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x25,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x25,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xc9,0x0c,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x25,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xca,0x0c,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25, 0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x04,0x02,0xb0,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xb0,0x00,0x8e,0x00,0x2c,0x00,0x04,0x02,0xb1, 0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0xb1,0x80,0x8c,0x00,0x25,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03, 0x07,0x00,0xcb,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xc2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc3, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x06,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc4,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc5,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0xbb,0x06,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xc6,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xc7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xc7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x06,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xc8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xc8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc9, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc9,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0xbd,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xb2,0x00,0x00,0xb5, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xb2, 0x80,0x91,0x00,0x10,0x00,0x00,0x00,0x00,0xca,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xca,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xcb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xcb,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x91,0x00,0x31,0x8c,0x00,0x32,0x00,0x7d,0x00,0x8d,0x00,0x2b,0x00,0x02,0xb3,0x00, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xb3,0x80,0x91,0x00,0x25,0x00,0x00,0x00, 0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xcc,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xd0,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xb9,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xce,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd1,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xce,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x06,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xd0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd0,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x06,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0xd1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd1,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd2,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd2,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbc, 0x06,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd3,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xd3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xd4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x06,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0xd5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd5, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0xbe,0x06,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xd7,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd7,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xd8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x06,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0xd9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd9,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xda,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xda,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0xc0,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31, 0x8d,0x00,0x25,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xd7,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xdc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xdd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xdd,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0xba,0x06,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xde,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xde,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0xdf,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x06,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe0,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xe1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe1,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0xbc,0x06,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xe2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe2,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe3,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xe3,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x06, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xe5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x06,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0xe6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xe6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe7,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe7,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0xbf,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x8e,0x00,0x2c, 0x00,0x04,0x02,0xb4,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0xb4,0x00,0x8f,0x00,0x25,0x00,0x00,0x00,0x00,0xac, 0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0xdd,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x06, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xde,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x06,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xec,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xec,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0xbb,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xb5,0x00, 0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0xb5,0x00,0x91,0x00,0x10,0x00,0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xed,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xee,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xee,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xbc,0x06,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x91,0x00,0x31,0x8f,0x00,0x2c,0x00,0x00,0x02,0xb6,0x00,0x00,0xb5,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xb6,0x00, 0x90,0x00,0x2c,0x00,0x00,0x02,0xb7,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xb7,0x80,0x91,0x00,0x25,0x00,0x00, 0x00,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xef,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xe0,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xb9,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x91,0x00,0x31,0x90,0x00, 0x25,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xf0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xe1,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xb9,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf1,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf1,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0xba,0x06,0x00,0x00,0x00,0x00,0x31,0x91,0x00,0x10,0x00,0x00,0x00,0x00,0xf2, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf3,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xf3,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xf3,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf2,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0xf4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xb8,0x00, 0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0xb8,0x80,0xc1,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xf3, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0xf7,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0xe0,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf8,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x18,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0xb9, 0x00,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0xba,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xb9,0x00,0xbb,0x00,0x29,0x00,0x00,0x00,0x00, 0xfe,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00, 0x02,0x02,0xbb,0x00,0x00,0xe4,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08, 0x00,0x00,0x00,0x32,0x00,0xbb,0x00,0x92,0x00,0x29,0x00,0x00,0x00,0x00,0xfd,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0x93,0x00,0x31,0x92,0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xe5,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x04,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00, 0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00, 0x00,0x2c,0x00,0x02,0x02,0xbc,0x00,0x00,0xe4,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x10,0x00,0x00,0x00,0x32,0x00,0xbc,0x80,0x93,0x00,0x01,0x00,0x00,0x00, 0x00,0xfb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xe6, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xbc,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x03,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0xbd,0x00,0x00,0xe4,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0xbd,0x80,0x93,0x00, 0x01,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0xe7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xbd,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfd, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xe8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x93,0x00,0x29,0x00,0x00,0x00, 0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0xff,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xff,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00, 0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x00,0x02,0xbe,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0xbe,0x00,0x95,0x00,0x31,0x94,0x00,0x24, 0x00,0x00,0x00,0x00,0x02,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0f,0x00, 0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe9,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0f,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x01, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xbf,0x00,0x00,0x01,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0xbf,0x80,0x94,0x00,0x24,0x03,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x31,0x95,0x00,0x2c,0x00,0x04,0x02,0xc0,0x00,0x00,0xfe,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0xc0,0x00,0xa9,0x00,0x2c,0x00, 0x00,0x02,0xc1,0x00,0x00,0xfe,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03, 0x00,0x00,0x00,0x32,0x00,0xc1,0x00,0x9f,0x00,0x2c,0x00,0x00,0x02,0xc2,0x00,0x00, 0xfe,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00, 0xc2,0x80,0xc1,0x00,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xeb,0x0c,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0xeb,0x0c,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0xeb,0x0c,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xeb, 0x0c,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xeb,0x0c, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xea,0x0c,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xea,0x0c,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xea,0x0c,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea, 0x0c,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00, 0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00, 0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x19, 0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x1d,0x00, 0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x24,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0x24,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x24,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x24, 0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x24,0x09, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x24,0x09,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xea,0x0c,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xea,0x0c,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xea,0x0c,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea, 0x0c,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c, 0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00, 0x00,0x13,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00, 0x17,0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x1b, 0x00,0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x1f,0x00, 0x00,0x02,0x00,0x25,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0xc3,0x00,0x00,0xfd,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xc3,0x80,0x97,0x00,0x31, 0x96,0x00,0x29,0x00,0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x08,0x07,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x05,0x07,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x08,0x07,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x08,0x07,0x00,0x00, 0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x08,0x07,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x05, 0x07,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x08,0x07,0x00,0x00,0x13,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x08,0x07, 0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x08,0x07,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x05,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x08,0x07,0x00,0x00,0x1f,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xec,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0xed, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0x05,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x10,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x05,0x07,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0x05,0x07,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x05,0x07,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x05,0x07,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0x05,0x07,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x10,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x05,0x07,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x05, 0x07,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xc4,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xc4,0x80,0x97,0x00,0x29,0x00, 0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x96,0x00,0x31,0x97,0x00,0x2c,0x00,0x04, 0x02,0xc5,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0xc5,0x00,0x9b,0x00,0x2c,0x00,0x04,0x02,0xc6,0x00,0x00,0xf7, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xc6, 0x80,0x99,0x00,0x25,0x00,0x00,0x00,0x00,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x0a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xf0, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x0b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0c,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x0d, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x0f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00, 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x11,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x12,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x12,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00, 0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x15,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf4,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x15,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08, 0x07,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xc7,0x00,0x00,0xf7,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xc7,0x00,0x98,0x00, 0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x16,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x16,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x17, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x18,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x18,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x0d,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x19,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x19,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x1a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x1b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1c, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xf8,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfa,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x00,0x24,0x00,0x00, 0x00,0x00,0x1f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1f,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x1f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x20,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfb,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00, 0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x22,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xfc,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x08,0x07,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x23,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfd,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x02, 0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0x98,0x00,0x10,0x00,0x00,0x00,0x00,0x24,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x26,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfe,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x26,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00, 0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x27,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x28,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x29,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x29,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x0d,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2a,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x08,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x2b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x2c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x02, 0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2d, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x02,0x01,0x00,0x00, 0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2e,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x02,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00, 0x00,0x31,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60, 0x01,0x10,0x00,0x00,0x00,0x00,0x33,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x33,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x33,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x34,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x04,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0x08,0x07,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x02,0x10, 0x00,0x00,0x00,0x00,0x36,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x06,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07, 0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0x99,0x00,0x32,0x00,0xba, 0x00,0x9a,0x00,0x2b,0x00,0x02,0xc8,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0xc8,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x08,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x3a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x3b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x3b,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0x4c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x3d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x3f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x3f, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x01,0x24,0x00,0x00, 0x00,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x40,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x50,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x41,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x41,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x08,0x07,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x52,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x43,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x43,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x02,0x10, 0x00,0x00,0x00,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x45, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x45,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x46,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x46,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x48,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x49,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x49,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x4a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4b, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4b,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4d,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x11,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08, 0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x12,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x4f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x51,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x51,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x52,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x52,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x53,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x53,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x55,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x46,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x56,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x08,0x07,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x58,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x59,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x17,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08, 0x07,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x5c, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x01,0x01, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x5e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x1a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0x5f,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5f,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x02,0x10,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x61,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x62,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1c,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00, 0x60,0x03,0x10,0x00,0x00,0x00,0x00,0x63,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x63,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x08,0x07,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0x9a,0x00, 0x25,0x00,0x00,0x00,0x00,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x66,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x1f,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x67, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x68,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x68,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x08,0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x77,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x21,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x6a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x6b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x6c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6c,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x7b,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x6e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00, 0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x6f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x70,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00, 0x71,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x25,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x73,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x74,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x74,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x75,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x76,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x76,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x77,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x77,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x78, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x78,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x79,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x79, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08, 0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x7b,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00, 0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x7e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x7e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x02,0x01, 0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x7f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7f,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2b,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00, 0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x81,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00, 0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x83,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2d,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x01, 0x10,0x00,0x00,0x00,0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x86,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08, 0x07,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x02,0x10,0x00, 0x00,0x00,0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x88, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00, 0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00,0x8a,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x8b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x31,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0x9b, 0x00,0x2c,0x00,0x04,0x02,0xc9,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xc9,0x00,0x9d,0x00,0x25,0x00,0x00,0x00, 0x00,0x8c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8d,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x33,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x08,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x8f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x91,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x92,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02, 0xca,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0xca,0x00,0x9c,0x00,0x10,0x00,0x00,0x00,0x00,0x93,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x36,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x96,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x96,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x97,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x97,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x90,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x98,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x38,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x98,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x99,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x9a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x39,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x08,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9c,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3a,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x00, 0x24,0x00,0x00,0x00,0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x9e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08, 0x07,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x3c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0xc1,0x00, 0x31,0x9c,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0xa1,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa1, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa2,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa3,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa3,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x08,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0xa5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xa6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x3e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0x08,0x07,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xa7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0xc1, 0x00,0x31,0x9d,0x00,0x2c,0x00,0x00,0x02,0xcb,0x00,0x00,0xf7,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xcb,0x00,0x9e,0x00,0x2c, 0x00,0x00,0x02,0xcc,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0xcc,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x40,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xab,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x42,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x08,0x07,0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0x9e, 0x00,0x25,0x00,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xae,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x44,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xaf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb0, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb0,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x08,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xb1,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xb1,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x07,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xb3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x46,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08, 0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0xe0,0x00,0x32,0x00, 0x00,0x00,0xc1,0x00,0x31,0x9f,0x00,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x0c,0x00,0x00, 0x02,0x00,0xeb,0x0c,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0xeb,0x0c,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0xeb,0x0c,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xeb, 0x0c,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xeb,0x0c, 0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x48,0x0d,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x02, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x48,0x0d,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x03,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x48,0x0d,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x04,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48, 0x0d,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d, 0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00, 0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x06, 0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x0a,0x00, 0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x0e,0x00,0x00, 0x02,0x00,0x24,0x09,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x12,0x00,0x00,0x02, 0x00,0x24,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x24,0x09,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x24, 0x09,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x24,0x09, 0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x04,0x02,0xcd,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0xcd,0x80,0xa1,0x00,0x31,0xa0,0x00,0x29,0x00,0x00, 0x00,0x00,0xb5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x07,0x00,0x00,0x02, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x07,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0xb8,0x07,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x07, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xb8,0x07,0x00,0x00,0x0a,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xb5,0x07,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xb8,0x07,0x00, 0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x07,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb8,0x07,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xb5,0x07,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xb8,0x07,0x00,0x00,0x16,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x07,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xb8, 0x07,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb5,0x07,0x00,0x00, 0x00,0x07,0x00,0x02,0x00,0xb8,0x07,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x11,0x00,0x00,0x00, 0x00,0xb8,0x07,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0x49,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00, 0xb5,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00, 0xe0,0xfe,0x01,0x00,0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x11,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0xb5,0x07,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0xff,0x01,0x00, 0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11, 0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xb5,0x07, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0x01, 0x01,0x00,0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x11,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0xce,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0xce,0x80,0xa1,0x00,0x29,0x00,0x00,0x00,0x00,0xfd,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0xa0,0x00,0x31,0xa1,0x00,0x2c,0x00,0x04,0x02,0xcf,0x00,0x00,0xf7, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xcf, 0x00,0xa5,0x00,0x2c,0x00,0x04,0x02,0xd0,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xd0,0x80,0xa3,0x00,0x25,0x00, 0x00,0x00,0x00,0xb9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xba, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x4b,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbb,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbc,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbc,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xbe,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbf, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc0,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0xb8,0x07,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xc1,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc1,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xc2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x02, 0x2c,0x00,0x00,0x02,0xd1,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xd1,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xc3,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x50,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xc5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x51,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xc6, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc6,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x01,0x10, 0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xc8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc9, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x53,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xca,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x54,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x02,0x32,0x00,0x00, 0x00,0xc1,0x00,0x31,0xa2,0x00,0x10,0x00,0x00,0x00,0x00,0xcb,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcb,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xcc,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xcd,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x55,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8, 0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xce,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xce,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x00,0x24,0x00, 0x00,0x00,0x00,0xd0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd0, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd0,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd1,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x57, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00, 0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xd3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x58,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd4,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40, 0x02,0x10,0x00,0x00,0x00,0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xd6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x5a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0xb8,0x07,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xa3,0x00,0x32, 0x00,0xba,0x00,0xa4,0x00,0x2b,0x00,0x02,0xd2,0x00,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0xd2,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xd7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x5c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xda, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0xdb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdb,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdb,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdc,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdc,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0xb8,0x07,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xde,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x01,0x24, 0x00,0x00,0x00,0x00,0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xdf,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe0, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe0,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xe1,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe1,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x61,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x80, 0x02,0x10,0x00,0x00,0x00,0x00,0xe3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xe3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe3,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe4,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xe5, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe5,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xe6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00, 0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xe7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x63,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe8,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe9,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x64,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00, 0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xea,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xeb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x65,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0xb8,0x07,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xec,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xee,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x67,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8, 0x07,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0xef,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xef,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xef,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x68,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0xf1, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf2,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf1,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x69,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x03,0x10, 0x00,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xf3,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf4, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x6a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07, 0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xa4,0x00,0x25,0x00,0x00, 0x00,0x00,0xf5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x6c,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xb8,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfa, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xfb,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0xb8,0x07,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x02,0x10, 0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xff,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x01,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x03,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x72,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0xb8,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x00, 0x24,0x00,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x74,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8, 0x07,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0a,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x76, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00, 0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x77,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0x0d,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x03,0x32,0x00,0x00, 0x00,0xc1,0x00,0x31,0xa5,0x00,0x2c,0x00,0x04,0x02,0xd3,0x00,0x00,0xf7,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xd3,0x00,0xa7, 0x00,0x25,0x00,0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x7a,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x11,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x12,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x12,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00, 0x01,0x2c,0x00,0x00,0x02,0xd4,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xd4,0x00,0xa6,0x00,0x10,0x00,0x00,0x00, 0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x15,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x15,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xb8, 0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x16,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x17,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x18, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x7d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07, 0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x7e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x1b,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7f,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x01,0x32,0x00, 0x00,0x00,0xc1,0x00,0x31,0xa6,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x80,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x1e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x1f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x81,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0xb8,0x07,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0xc1, 0x00,0x31,0xa7,0x00,0x2c,0x00,0x00,0x02,0xd5,0x00,0x00,0xf7,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xd5,0x00,0xa8,0x00,0x2c, 0x00,0x00,0x02,0xd6,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0xd6,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x22,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x83,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x84,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x40,0x00,0x32,0x00, 0x00,0x00,0xc1,0x00,0x31,0xa8,0x00,0x25,0x00,0x00,0x00,0x00,0x24,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x85,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x86,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x07,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x87,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0xc0,0x00,0x32,0x00,0x00, 0x00,0xc1,0x00,0x31,0xa9,0x00,0x2c,0x00,0x00,0x02,0xd7,0x00,0x00,0xfe,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0xd7,0x00,0xb1, 0x00,0x2c,0x00,0x00,0x02,0xd8,0x00,0x00,0xfe,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xd8,0x80,0xc1,0x00,0x25,0x04,0x00,0x00, 0x00,0x89,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x89,0x0d,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89, 0x0d,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89,0x0d, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89,0x0d,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89,0x0d,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89,0x0d,0x00,0x00,0x18, 0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x89,0x0d,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0xd9,0x00,0x00,0xfd,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xd9,0x80,0xab,0x00,0x31, 0xaa,0x00,0x29,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x08,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x2c,0x08,0x00,0x00, 0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x2c,0x08,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29, 0x08,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x10,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x2c,0x08, 0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x29,0x08,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x1c,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xec,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x12,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x8a, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0x29,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x12,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x29,0x08,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0x29,0x08,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x29,0x08,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x29,0x08,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0x29,0x08,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x12,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x29,0x08,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x29, 0x08,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2b,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xda,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xda,0x80,0xab,0x00,0x29,0x00, 0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xaa,0x00,0x31,0xab,0x00,0x2c,0x00,0x04, 0x02,0xdb,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0xdb,0x00,0xae,0x00,0x2c,0x00,0x04,0x02,0xdc,0x00,0x00,0xf7, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xdc, 0x80,0xac,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x8b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x2f, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8c,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x01,0x10, 0x00,0x00,0x00,0x00,0x31,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x31,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x31,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x8d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x33,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8e,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x02,0x2c,0x00,0x00, 0x02,0xdd,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0xdd,0x80,0xc1,0x00,0x10,0x00,0x00,0x00,0x00,0x34,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x34,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x02,0x32,0x00,0x00, 0x00,0xc1,0x00,0x31,0xac,0x00,0x32,0x00,0xba,0x00,0xad,0x00,0x2b,0x00,0x02,0xde, 0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xde,0x80,0xc1,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x36,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x90,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x39,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x91,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x3a,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3b,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x92,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x3c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x93,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x2c,0x08,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x3d,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x94,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00, 0x00,0x3f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x40,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00, 0x03,0x10,0x00,0x00,0x00,0x00,0x41,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x41,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x42,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x96,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0x2c,0x08,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xad,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x43,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x44,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x97,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0x2c,0x08,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x45,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x46,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x98,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0x47,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x48,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x49,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x9a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x4a,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4a,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4b,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9b,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x02,0x10,0x00, 0x00,0x00,0x00,0x4c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4d,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9c, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00, 0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xae,0x00,0x2c,0x00,0x04,0x02, 0xdf,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0xdf,0x00,0xaf,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c, 0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4f,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9d,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x50, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9e, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00, 0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xe0,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xe0,0x00,0xc1,0x00,0x10,0x00, 0x00,0x00,0x00,0x52,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x52,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x53,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9f, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00, 0x00,0x80,0x01,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xaf,0x00,0x2c,0x00,0x00,0x02, 0xe1,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x32,0x00,0xe1,0x00,0xb0,0x00,0x2c,0x00,0x00,0x02,0xe2,0x00,0x00,0xf7,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xe2,0x80, 0xc1,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb0,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x2c,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x54,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x80,0x00, 0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb1,0x00,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x10,0x00, 0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0xeb,0x0c,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0xeb,0x0c,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x1c,0x00,0x00,0x02,0x00, 0xeb,0x0c,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x23, 0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x23,0x09, 0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xa1,0x0d,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xa1,0x0d,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x04, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xa1,0x0d,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x05,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xa1,0x0d,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x06,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa1, 0x0d,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x07,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0xe3,0x00,0x00, 0xfd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0xe3,0x80,0xb3,0x00,0x31,0xb2,0x00,0x29,0x00,0x00,0x00,0x00,0x55,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x58,0x08,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x55,0x08,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x58,0x08,0x00,0x00,0x05, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x08,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x58,0x08,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x08, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x58,0x08,0x00,0x00,0x0d,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x55,0x08,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x58,0x08,0x00, 0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x08,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0x58,0x08,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x55,0x08,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x58,0x08,0x00,0x00,0x19,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x08,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x58, 0x08,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x56,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xec,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x13,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x0e, 0x00,0x21,0x01,0x00,0xa2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x13,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0x55,0x08,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x55,0x08,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x55,0x08, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xe4,0x00,0x00,0xfd, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xe4, 0x80,0xb3,0x00,0x29,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xb2,0x00,0x31, 0xb3,0x00,0x2c,0x00,0x04,0x02,0xe5,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xe5,0x00,0xb7,0x00,0x2c,0x00,0x04, 0x02,0xe6,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xe6,0x80,0xb5,0x00,0x25,0x00,0x00,0x00,0x00,0x59,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5a,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0xa4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x5c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0x5d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x5d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5e,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x5f,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5f,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x60,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa7,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x60,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x62,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x62,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xe7,0x00, 0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0xe7,0x00,0xb4,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x63,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa9,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00, 0x64,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x65, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xaa,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08, 0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xab,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x68,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x69,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x68,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x01,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x6a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xad,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x58,0x08,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb4,0x00, 0x10,0x00,0x00,0x00,0x00,0x6b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x6b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x6c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6c,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6d,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xae,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0x6e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x6f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xaf,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x70,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x70,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x70,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb0,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x01,0x10,0x00,0x00, 0x00,0x00,0x72,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x72,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x73,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00, 0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x74,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9, 0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00, 0x75,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb3,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x02, 0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb5,0x00,0x32,0x00,0xba,0x00,0xb6,0x00,0x2b, 0x00,0x02,0xe8,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xe8,0x80,0xc1,0x00, 0x25,0x00,0x00,0x00,0x00,0x77,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xb5,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x79, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7a,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x58,0x08,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb7,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x7c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x7e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7e,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x7f,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7f,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x80,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb9,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x80,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00, 0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x81,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x81,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x81,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x82,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x82,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00, 0x83,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x83,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x84,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x84,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08, 0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x85,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x85,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x86,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x86, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x03,0x01,0x00,0x00, 0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x87,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x88,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbd,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00, 0x00,0x8a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8a,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8b,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbe,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20, 0x01,0x10,0x00,0x00,0x00,0x00,0x8c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x8c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x8d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xbf,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00, 0x58,0x08,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc0,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x02,0x10, 0x00,0x00,0x00,0x00,0x8f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x8f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x8f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x90, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xc1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08, 0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x92,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xc2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00, 0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x03,0x10,0x00,0x00,0x00,0x00,0x93,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc3,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x03,0x32,0x00, 0x00,0x00,0xc1,0x00,0x31,0xb6,0x00,0x25,0x00,0x00,0x00,0x00,0x95,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x96,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0xc5,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x97,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x98,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x98,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x00,0x24,0x00, 0x00,0x00,0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9a,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9a,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x58,0x08,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc8,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x9c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x01, 0x24,0x00,0x00,0x00,0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x9e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9e,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x9f,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa0,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xca,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xa0,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00, 0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xa1,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xa1,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xa2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa2,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00, 0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa3,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcb,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0xa4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xa5,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xcc,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c, 0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0xa6, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa6,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa6,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa7,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa6,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcd,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x01,0x10, 0x00,0x00,0x00,0x00,0xa8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xa8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xa8,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa9, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xce,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08, 0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcf,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x02,0x10,0x00,0x00, 0x00,0x00,0xab,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xab,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xab,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd0,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00, 0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0xad,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xad,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xd1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x58,0x08,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb7,0x00, 0x2c,0x00,0x04,0x02,0xe9,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xe9,0x00,0xb9,0x00,0x25,0x00,0x00,0x00,0x00, 0xaf,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb0,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xd3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x58, 0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb1,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xb1,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xb2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xb2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xb2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xb3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb3,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xea, 0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0xea,0x00,0xb8,0x00,0x10,0x00,0x00,0x00,0x00,0xb4,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb5,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xb6,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd5,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58, 0x08,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xb7,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb7,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd6,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x00,0x24,0x00, 0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb9, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xba,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00, 0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd8,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb8, 0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xbd,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xd9,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x58,0x08,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc1,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xdb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58, 0x08,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xb9,0x00,0x2c,0x00, 0x00,0x02,0xeb,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0xeb,0x00,0xba,0x00,0x2c,0x00,0x00,0x02,0xec,0x00,0x00, 0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00, 0xec,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xc2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0xdc,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xc3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xdd,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00, 0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xba, 0x00,0x25,0x00,0x00,0x00,0x00,0xc4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xc5,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xdf,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x58,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc6, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc6,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x58,0x08,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xc7,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe0,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0c,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x00,0x01,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xc8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0c,0x00,0x00,0x00, 0x00,0x58,0x08,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xbb,0x00, 0x01,0x00,0x00,0x00,0x00,0xc9,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0xe2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xe3,0x0d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xca, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xe4,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe5,0x0d, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcb,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xe6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xe3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe7,0x0d,0x00,0x00,0x00,0x00,0x25,0x04, 0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xe9,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xea,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xeb,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xec, 0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xed,0x0d, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xee,0x0d,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xef,0x0d,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xcc,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xe9,0x0d,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xcc,0x08,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0d,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xcc,0x08,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xeb,0x0d,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xcc,0x08,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xec,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xcc,0x08,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xed,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xcc, 0x08,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xee,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xcc,0x08, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xef,0x0d,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xcc,0x08,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xe9,0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xea,0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xeb,0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xec, 0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x04,0x00,0x22,0x01, 0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xed,0x0d, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x05,0x00,0x22,0x01,0x00, 0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xee,0x0d,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xef,0x0d,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0xcd,0x08,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0xce,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xe9,0x0d,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xce,0x08,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xea,0x0d,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0xce,0x08,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xeb,0x0d,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0xce,0x08,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xec,0x0d,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0xce,0x08,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xed,0x0d,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xce, 0x08,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xee,0x0d,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xce,0x08, 0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xef,0x0d,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xce,0x08,0x00, 0x00,0x07,0x00,0x22,0x01,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0xed,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x32,0x00,0xed,0x00,0xbe,0x00,0x2c,0x00,0x04,0x02,0xee,0x00,0x00, 0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00, 0xee,0x80,0xbc,0x00,0x25,0x00,0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xd7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00, 0xf0,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd8,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xd0,0x08,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xd9,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd9,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd9,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xda,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xda,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd1,0x08, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xdb,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xdb,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xdc,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xdc, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd2,0x08,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xdd,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdd,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdd,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xde,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xde,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xd3,0x08,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xef,0x00,0x00,0xf7,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xef,0x80,0xc1, 0x00,0x10,0x00,0x00,0x00,0x00,0xdf,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xdf,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe0,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe0,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0xd4,0x08,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc1,0x00, 0x31,0xbc,0x00,0x32,0x00,0xba,0x00,0xbd,0x00,0x2b,0x00,0x02,0xf0,0x00,0x05,0x00, 0x01,0x00,0x00,0x00,0x32,0x00,0xf0,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xee, 0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe1,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0xf4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xe2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x08,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe4,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0xd1,0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xe5, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe5,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe5,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xe6,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd2,0x08,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe8,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xd3,0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0xe9,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe9, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf8,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xea,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd4, 0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xec,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x08,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0xed,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xed,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xee,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xee,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0xd6,0x08,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xbd,0x00, 0x25,0x00,0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xef,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xfa,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf0,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf0,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0xd0,0x08,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf1,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf1,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xf2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd1,0x08,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf4,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xd2,0x08,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf5,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf5,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf6,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfd,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0xf6,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd3,0x08,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xf7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xf7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xf7,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xf8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf8,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xd4,0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0xf9,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf9,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xfa,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x08, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xbe,0x00,0x2c,0x00,0x04, 0x02,0xf1,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xf1,0x00,0xbf,0x00,0x25,0x00,0x00,0x00,0x00,0xee,0x0c,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xfb,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xff,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xfc,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x08,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xfd,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xfd,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xfd,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfe, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xfe,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xd1,0x08,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xf2,0x00,0x00,0xf7, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xf2, 0x00,0xc1,0x00,0x10,0x00,0x00,0x00,0x00,0xff,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xff,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x00,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xd2,0x08,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0xc1,0x00,0x31,0xbf,0x00,0x2c,0x00,0x00,0x02,0xf3,0x00,0x00,0xf7,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xf3,0x00,0xc0,0x00, 0x2c,0x00,0x00,0x02,0xf4,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xf4,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00, 0xee,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x01,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xcf, 0x08,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc1,0x00,0x31,0xc0,0x00,0x25,0x00, 0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x02,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x03,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x03,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0, 0x08,0x00,0x00,0x00,0x00,0x31,0xc1,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x06,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00, 0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x06,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00, 0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x10,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x07,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x07,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x07,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x08,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x09,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x09, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x06,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00, 0x00,0x00,0x11,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x11,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x11,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x0c,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x08,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x0d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0e,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x07,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x10,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x0e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x0c,0x00,0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0e,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x0a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x11,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x15,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x11,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x0d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00, 0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x06,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0x13,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x05, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x13,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0xf5,0x00,0x00, 0x05,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x2a,0x00,0xf5,0x00,0x00,0x14,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x15,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x14,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x15,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x12, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x15,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00, 0x80,0x10,0x82,0x66,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00, 0x80,0x10,0x82,0x26,0x45,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00, 0x80,0x10,0x81,0x35,0x45,0x64,0x02,0x00,0x01,0xff,0x0f,0xff,0x0f,0x62,0x00,0x00, 0x00,0x60,0x06,0x45,0x45,0xe4,0x01,0x00,0x56,0x44,0x01,0x00,0x00,0x61,0x02,0x00, 0x00,0x60,0x01,0x05,0x47,0x34,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x25,0x46,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x69,0x02,0x47, 0x68,0x02,0x47,0x31,0x00,0x61,0x00,0x46,0x68,0x58,0x01,0x11,0x00,0x41,0x02,0x20, 0x22,0x2e,0x47,0x11,0x01,0x5b,0x07,0x00,0x00,0x60,0x86,0x04,0x45,0x24,0x02,0x05, 0x01,0x24,0x45,0x80,0x00,0x62,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x02,0x00, 0x56,0x64,0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x84,0x46,0x44,0x02,0x05, 0x01,0x34,0x45,0x08,0x00,0x49,0x00,0x47,0xa8,0x2a,0x47,0x11,0x01,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x2c,0x00,0x04, 0x00,0x00,0x40,0x84,0x45,0x00,0x00,0x00,0x00,0x60,0x6b,0x01,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x85,0x45,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x41,0x03,0x00, 0x80,0x60,0x06,0x01,0x20,0xe4,0x01,0x00,0x01,0x64,0x01,0x00,0x00,0x5b,0x02,0x00, 0x00,0x60,0x06,0x84,0x45,0x04,0x46,0x01,0x06,0x84,0x45,0x24,0x45,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x46,0xe4,0x01,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x02,0x47, 0xa8,0x0a,0x47,0x11,0x45,0x40,0x02,0x46,0xa8,0x0a,0x46,0x11,0x01,0x69,0x02,0x45, 0x68,0x9a,0x47,0x21,0x00,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x64,0x45,0x00, 0x52,0x04,0x46,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x59,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x00,0x45,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x46,0x00,0x00,0x00, 0x00,0xe0,0xff,0xff,0xff,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x44,0x46,0x44,0x45,0x01, 0x06,0x44,0x46,0x24,0x45,0x5b,0x00,0x00,0x00,0x60,0x86,0x84,0x02,0xe4,0x01,0x05, 0x01,0x34,0x45,0xf8,0xff,0x70,0x02,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x46,0x00, 0x35,0x1f,0x00,0x1f,0x00,0x62,0x02,0x00,0x00,0x60,0x86,0xa5,0x45,0x84,0x02,0x00, 0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x84,0x02,0x00, 0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x4e,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x46,0x00, 0x31,0x08,0x00,0x08,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xc5,0x45,0x44,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x01,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03, 0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x46,0x00, 0x31,0x10,0x00,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x46,0x00, 0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x61,0x31,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03, 0x68,0x02,0x45,0x01,0x04,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x46,0x00, 0x31,0x18,0x00,0x18,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x46,0x00, 0x05,0xf0,0xff,0xf0,0xff,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x61,0x32,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03, 0x68,0x02,0x45,0x01,0x06,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x46,0x00, 0x05,0xe8,0xff,0xe8,0xff,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x70,0x02,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x46,0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x2c, 0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85,0x65,0x02,0x24,0x46,0x00, 0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0x24,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x46,0x68,0xca,0x46,0x11,0x00,0x70,0x01,0x40, 0x00,0x60,0x06,0x01,0x00,0x24,0x46,0x00,0x16,0xc4,0x45,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0x70,0x07,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x2f,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x1c,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x56,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x21,0x04, 0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x22,0x04, 0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0f,0x05,0x3d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x13,0x05,0x3e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x3f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x41,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x42,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x43,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2b,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x80,0x03,0x80,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x11,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x46,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x45,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x45,0x00, 0x06,0x24,0x46,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x45,0x00, 0x06,0xe4,0x45,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xd5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xc6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xb7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x40,0x00,0x45, 0x68,0xe2,0x45,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x46,0x64,0x45,0x00, 0x06,0x24,0x46,0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x45,0x64,0x45,0x00, 0x06,0xe4,0x45,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x46,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x39,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x31,0xda,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x16,0x00,0x00,0x69,0x37,0x09, 0x68,0x42,0x01,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0xe4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x3b,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x40,0x06,0x09,0xa8,0x02,0x47,0x11,0x09,0x69,0x03,0x08, 0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x47,0xa8,0x1a,0x47,0x11,0x01,0x31,0xfe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x09,0x21,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x03,0x10,0x08,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05, 0x68,0x02,0x47,0x21,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x07,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x4f,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x45,0x68,0xe2,0x45,0x01,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x46,0x64,0x45,0x00, 0x06,0x24,0x46,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x45,0x64,0x45,0x00, 0x06,0xe4,0x45,0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x20,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x68,0x00,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x45,0x64,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x46,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xe6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xd5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x36,0x06,0x61,0x02,0x2c,0x20,0x00,0x40,0x38,0x03, 0xa8,0x2a,0x47,0x11,0x01,0x31,0xe7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x07, 0x21,0x03,0x06,0x10,0x05,0x69,0x02,0x09,0x68,0x02,0x03,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03,0xa8,0x1a,0x47,0x11,0x01,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x06,0x10,0x09,0x40,0x05,0x05, 0xa8,0x02,0x47,0x11,0x05,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xfa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x06,0x10,0x04,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x08,0x68,0x02,0x03,0x21,0x00,0x69,0x04,0x04, 0x68,0x02,0x47,0x21,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x40,0x03,0x0b,0x21,0x03,0x06,0x10,0x07,0x40,0x03,0x09, 0x21,0x03,0x06,0x10,0x08,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x06,0x10,0x04,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xae,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x4b,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x4b,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x25,0x06,0x64,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x25,0x08,0x64,0x45,0x00,0x06,0x04,0x08,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00, 0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x08,0x44,0x01,0x00, 0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x04,0x64,0x45,0x00, 0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x06,0x64,0x45,0x00, 0x06,0x24,0x06,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x08,0x64,0x45,0x00, 0x06,0x24,0x08,0x00,0x00,0x40,0x00,0x45,0x68,0xe2,0x45,0x01,0x04,0x31,0x40,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0x41,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0x42,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xf3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x40,0x01,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x00,0x08,0xa8,0x7a,0x45,0x11,0x08,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x44,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x28,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04, 0xa8,0x7a,0x45,0x11,0x04,0x68,0x34,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x36,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x38,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xba,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x9b,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x06,0x64,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x24,0x08,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x1b,0x09,0x10,0x02,0x40,0x3c,0x03, 0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x40,0x06,0x06,0xa8,0x02,0x47,0x11,0x06,0x69,0x03,0x04, 0x68,0x02,0x03,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03,0xa8,0x1a,0x47,0x11,0x01,0x31,0xf0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x05, 0x21,0x03,0x09,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x0a,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x03, 0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x03,0x31,0xf1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x08,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x0a,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x06,0x0a, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x47,0x21,0x00,0x31,0xe2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08, 0x21,0x03,0x09,0x10,0x07,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x09,0x10,0x0a,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05, 0x21,0x03,0x09,0x10,0x04,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x46,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x25,0x06,0x64,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x00, 0x00,0x60,0x06,0x25,0x08,0x64,0x45,0x00,0x06,0x04,0x08,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x25,0x04,0x64,0x45,0x00,0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x06,0x64,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x00,0x45, 0x68,0xe2,0x45,0x01,0x04,0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xfa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xfb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x06,0xa8,0x7a,0x45,0x11,0x06,0x40,0x00,0x08, 0xa8,0x7a,0x45,0x11,0x08,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xf7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x68,0x37,0x00, 0x00,0x20,0x82,0x45,0x09,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x92,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04,0xa8,0x7a,0x45,0x11,0x04,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x68,0x02,0x47,0x21,0x00,0x69,0x32,0x07, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0x24,0x06,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x08,0x21,0x03,0x07,0x10,0x05,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x31,0xd3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xc4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x06,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x05,0xa8,0x02,0x47,0x11,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xf6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x06,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x05,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a,0x21,0x03,0x07,0x10,0x03,0x40,0x07,0x0b, 0x21,0x03,0x07,0x10,0x08,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x09, 0x21,0x03,0x07,0x10,0x04,0x69,0x06,0x03,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xe9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xda,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x09,0x21,0x03,0x07,0x10,0x04,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x07,0x10,0x03,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x07,0x10,0x08,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x41,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x04,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x45,0x68,0xe2,0x45,0x01,0x04,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x18,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x3f,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x45,0x64,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x31,0x04,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x09,0x21,0x03,0x04,0x10,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xe4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x08,0x31,0xf5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x03,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x04,0x10,0x09,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x99,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3d,0x00,0x00,0x40,0x00,0x45, 0x68,0xe2,0x45,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x69,0x00,0x09, 0x68,0x42,0x01,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x31,0xba,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x47,0x21,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3a,0x03, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x07,0x47,0xa8,0x02,0x47,0x11,0x09,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x16,0x00,0x00,0x69,0x3e,0x07, 0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x02,0x68,0x9a,0x03,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x07,0x10,0x06,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x0a,0x21,0x03,0x07,0x10,0x05,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x3c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x3c,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x45,0x01,0x04,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x7a,0x45,0x01,0x06,0x31,0xae,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x69,0x00,0x06, 0x61,0x02,0x2c,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x3b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x45,0x68,0xe2,0x45,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47,0xa8,0x2a,0x47,0x11,0x01,0x31,0xe4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xd2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x34,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xf3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06, 0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x3a,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x12,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x16,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1a,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x26,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0b,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06,0xa8,0x7a,0x45,0x11,0x06,0x40,0x06,0x08, 0xa8,0x7a,0x45,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xfa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xc9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xbb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x69,0x37,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04, 0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x34,0x05,0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47,0xa8,0x1a,0x47,0x11,0x01,0x31,0xfd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x34,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x34,0x05, 0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04,0x68,0x02,0x47,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x20,0x00,0x00,0x40,0x39,0x07,0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04,0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07, 0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xf2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x05,0x10,0x03,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x03,0x05,0x10,0x08,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03,0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xd5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x05,0x10,0x03,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x32,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x32,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x7a,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x04, 0xa8,0x7a,0x45,0x11,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x01,0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3d,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x45, 0xa8,0xe2,0x45,0x11,0x08,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3c,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xef,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00,0x00,0x31,0xbe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x28,0x00,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x03,0x10,0x06,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x05,0x31,0xf1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07, 0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06,0x68,0x02,0x47,0x21,0x00,0x31,0xe2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x03,0x10,0x09,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07, 0x21,0x03,0x03,0x10,0x06,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x2e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x04,0x08,0xa8,0x7a,0x45,0x11,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06, 0x68,0x42,0x01,0x81,0x01,0x31,0x44,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xe9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x69,0x07,0x08,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04, 0xa8,0x7a,0x45,0x11,0x04,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x09, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x45,0xa8,0xe2,0x45,0x11,0x06,0x31,0xbd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xdc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x20,0x00,0x00,0x31,0xbf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xee,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05,0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03,0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04, 0x68,0x7a,0x02,0x21,0x00,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xd2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05, 0x21,0x03,0x09,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x09,0x10,0x07,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x09,0x10,0x03,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x2b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x02,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xb8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x69,0x38,0x05,0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x31,0xb9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x18,0x00,0x00,0x40,0x34,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x04,0x31,0xeb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09, 0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a,0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x29,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x38,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x08,0x69,0x36,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x28,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x28,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x45,0x01,0x04,0x69,0x00,0x04, 0x61,0x02,0x2c,0x20,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x31,0xa0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x27,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47,0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06, 0x61,0x02,0x2c,0x20,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x10,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x26,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x26,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x14,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1c,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x24,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x05,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x69,0x00,0x0b,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x09,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x40,0x05,0x03, 0x21,0x1b,0x0b,0x10,0x45,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x05,0x09,0xa8,0x02,0x47,0x11,0x09,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xd6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x05, 0x21,0x03,0x0b,0x10,0x04,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x06,0x00,0x06,0x00,0x40,0x04,0x08,0x21,0x03,0x0b,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x0b,0x10,0x03,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x03,0x0b,0x10,0x04,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x23,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47,0xa8,0x1a,0x47,0x11,0x02,0x69,0x01,0x03, 0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04,0x21,0x03,0x0b,0x10,0x03,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x23,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x22,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x07,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x45,0x69,0x05,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x05,0x0a, 0xa8,0x02,0x47,0x11,0x0a,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xdd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x05,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x03,0x07, 0xa8,0x02,0x47,0x11,0x07,0x40,0x03,0x0a,0xa8,0x02,0x47,0x11,0x0a,0x40,0x03,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x07,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06, 0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x69,0x06,0x04, 0x68,0x02,0x0a,0x21,0x00,0x69,0x06,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xef,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xde,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x03,0x03,0x10,0x08,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x00,0x07, 0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x45,0x40,0x04,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x04,0x0a, 0xa8,0x02,0x47,0x11,0x0a,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x03,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x0a,0x21,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x0a,0x40,0x07,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x40,0x06,0x06,0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x05, 0x68,0x7a,0x02,0x21,0x00,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xe6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xd8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x06, 0x21,0x03,0x03,0x10,0x05,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x03,0x03,0x10,0x08,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x04,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x1f,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06, 0xa8,0x02,0x47,0x11,0x06,0x69,0x00,0x09,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x40,0x05,0x03, 0x21,0x1b,0x09,0x10,0x45,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x09,0x10,0x07,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x1e,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47,0xa8,0x1a,0x47,0x11,0x02,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x01,0x03, 0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04,0x21,0x03,0x09,0x10,0x03,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x1e,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1d,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x45,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x1d,0x00,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x45,0x40,0x03,0x05, 0x21,0x1b,0x03,0x10,0x02,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x1d,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0b,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x7a,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xf2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x69,0x36,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x33,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xf8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x18,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x33,0x05, 0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04,0x68,0x02,0x47,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x40,0x35,0x07,0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04,0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07, 0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xff,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x05,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03,0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xde,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x05,0x10,0x03,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x16,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x16,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x7a,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x31,0xf3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x04, 0xa8,0x7a,0x45,0x11,0x04,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x01,0x31,0x45,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x45,0xa8,0xe2,0x45,0x11,0x08,0x31,0xb4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20,0x00,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x34,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x31,0xe9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x24,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x28,0x00,0x00,0x40,0x04,0x08,0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05,0xa8,0x1a,0x47,0x11,0x01,0x31,0xf7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x03,0x10,0x06,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x05,0x31,0xfd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07, 0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06,0x68,0x02,0x47,0x21,0x00,0x31,0xef,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xdc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x03,0x10,0x09,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07,0x21,0x03,0x03,0x10,0x06,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x12,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06, 0xa8,0x7a,0x45,0x11,0x06,0x40,0x04,0x08,0xa8,0x7a,0x45,0x11,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06, 0x68,0x42,0x01,0x81,0x01,0x31,0x43,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xe5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xc6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x69,0x07,0x08,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04, 0xa8,0x7a,0x45,0x11,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x36,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x45, 0xa8,0xe2,0x45,0x11,0x06,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xd4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xeb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x03,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xed,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xdf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x09,0x10,0x07,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x09,0x10,0x03,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xae,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x91,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06,0xa8,0x7a,0x45,0x11,0x06,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x93,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x32,0x05,0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x18,0x00,0x00,0x40,0x33,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x04,0x31,0xea,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09,0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a, 0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x32,0x05,0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x08,0x69,0x30,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x0c,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x0b,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x45,0x01,0x02,0x69,0x00,0x04, 0x61,0x02,0x2c,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xa7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2c,0x20,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x9a,0x47,0x21,0x00,0x31,0xbc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xae,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x0a,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03, 0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x32,0x03,0x68,0x02,0x45,0x01,0x04,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x31,0xa3,0x03, 0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x33,0x03, 0x68,0x02,0x45,0x01,0x06,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x35,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x36,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x37,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x39,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x3a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x3b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x3c,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05,0x2b,0x05,0x3d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x27,0x05,0x3e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1f,0x05,0x3f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x17,0x05,0x41,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x42,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x43,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x23,0x05,0x44,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x05,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x69,0x3a,0x03,0x68,0x42,0x01,0x41,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x05, 0xa8,0x7a,0x45,0x11,0x05,0x40,0x04,0x07,0xa8,0x7a,0x45,0x11,0x07,0x40,0x04,0x03, 0xa8,0x7a,0x45,0x11,0x03,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xd6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x18,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x24,0x14,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x06,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x05,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x05,0x05,0xa8,0x7a,0x45,0x11,0x05,0x40,0x05,0x07, 0xa8,0x7a,0x45,0x11,0x07,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3d,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x03, 0xa8,0x7a,0x45,0x11,0x03,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x05,0xa8,0x7a,0x45,0x11,0x05,0x40,0x04,0x45, 0xa8,0xe2,0x45,0x11,0x07,0x31,0xf7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x4c,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xce,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xa1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x90,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x0c,0x00,0x00,0x31,0xb2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x05,0xa8,0x7a,0x45,0x11,0x05,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x33,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x81,0x01,0x40,0x06,0x07,0xa8,0x7a,0x45,0x11,0x07,0x40,0x04,0x03, 0xa8,0x7a,0x45,0x11,0x03,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x45,0xa8,0xe2,0x45,0x11,0x05,0x31,0xf5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xfa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xc6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xb8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x99,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x05,0xa8,0x7a,0x45,0x11,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xcb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xbd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x01,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x9f,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xa4,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x9c,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x45,0x64,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xae,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0x91,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x45,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x60,0x06,0xc4,0x45,0x64,0x02,0x01,0x06,0xc4,0x45,0x34,0x45,0x41,0x01,0x00, 0x80,0x60,0x06,0x01,0x20,0xc4,0x45,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x47,0xc4,0x45,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x02,0xc4,0x45,0x00,0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x47, 0xa8,0x0a,0x47,0x11,0x45,0x69,0x01,0x45,0x68,0xaa,0x47,0x21,0x00,0x70,0x01,0x00, 0x00,0x20,0x02,0x01,0x00,0xa4,0x45,0x00,0x52,0x04,0x46,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x59,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x8e,0xdc,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x45,0x11,0x00,0x61,0x07,0x03, 0x62,0xc8,0x02,0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x02,0x00,0x00,0x00, 0x00,0xe0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x70,0x23,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x04,0x02,0x44,0x45,0x01, 0x06,0x04,0x02,0x24,0x45,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x45,0xe4,0x01,0x00, 0x06,0xc4,0x45,0x00,0x02,0x70,0x02,0x40,0x00,0x60,0x86,0x01,0x00,0x04,0x02,0x00, 0x35,0x1f,0x00,0x1f,0x00,0x62,0x02,0x00,0x00,0x60,0x86,0x65,0x45,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x4e,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x08,0x00,0x08,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x00,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x10,0x00,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x21,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x45,0x68,0xa2,0x02,0x81,0xff,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x61,0x32,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x04,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x18,0x00,0x18,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa3,0x03, 0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x45, 0x68,0xa2,0x02,0x01,0xff,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x00,0x00,0x00,0x61,0x33,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03, 0x68,0x02,0x45,0x01,0x06,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0xc8,0x02,0x11,0x00,0x40,0x00,0x45, 0x68,0xa2,0x02,0x81,0xfe,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x02,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x46, 0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x2c,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x50,0x85,0x65,0x02,0x24,0x46,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00, 0x00,0x68,0x06,0x01,0x00,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x46, 0x68,0xca,0x46,0x11,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0x24,0x46,0x00, 0x16,0xc4,0x45,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0xff,0xff,0xff,0x70,0x07,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x2f,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x1c,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x56,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04, 0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x25,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x3d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x3e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x17,0x05,0x3f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1f,0x05,0x41,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x23,0x05,0x42,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x27,0x05,0x43,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2b,0x05,0x44,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x80,0x03,0x80,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x12,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x25,0x46,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0xe5,0x45,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x06,0x00, 0x00,0x60,0x06,0x05,0x06,0xa4,0x45,0x00,0x06,0x24,0x46,0x00,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x05,0x08,0xa4,0x45,0x00,0x06,0xe4,0x45,0x00,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x31,0xca,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xd6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xc8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xb4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x46,0xa4,0x45,0x00,0x06,0x24,0x46,0x00,0x00,0x31,0xbb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x45,0xa4,0x45,0x00,0x06,0xe4,0x45,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x46,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x69,0x07,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x34,0x09,0x68,0x42,0x01,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0xe4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x37,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xcc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x40,0x06,0x09, 0xa8,0x02,0x47,0x11,0x09,0x69,0x03,0x08,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x09,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06, 0x21,0x03,0x03,0x10,0x08,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x07,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x4f,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x05,0x05,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x46,0xa4,0x45,0x00, 0x06,0x24,0x46,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x45,0xa4,0x45,0x00, 0x06,0xe4,0x45,0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x20,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x68,0x00,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x45,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x46,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x31,0xfa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xe8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x38,0x06, 0x61,0x02,0x2c,0x20,0x00,0x40,0x39,0x03,0xa8,0x2a,0x47,0x11,0x01,0x31,0xe4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x07,0x21,0x03,0x06,0x10,0x05,0x69,0x02,0x09, 0x68,0x02,0x03,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03, 0xa8,0x1a,0x47,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x06,0x10,0x09,0x40,0x05,0x05, 0xa8,0x02,0x47,0x11,0x05,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xfd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x06,0x10,0x04,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x08,0x68,0x02,0x03,0x21,0x00,0x69,0x04,0x04, 0x68,0x02,0x47,0x21,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x40,0x03,0x0b,0x21,0x03,0x06,0x10,0x07,0x40,0x03,0x09, 0x21,0x03,0x06,0x10,0x08,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x06,0x10,0x04,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x4b,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x4b,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00, 0x06,0x04,0x06,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x08,0xa4,0x45,0x00, 0x06,0x04,0x08,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x25,0x08,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x05,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x25,0x04,0xa4,0x45,0x00,0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x06,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x08,0xa4,0x45,0x00,0x06,0x24,0x08,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x31,0x40,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0x42,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0x43,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xf5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x40,0x01,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x08,0xa8,0x72,0x45,0x11,0x08,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x44,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x28,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04, 0xa8,0x72,0x45,0x11,0x04,0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x36,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x39,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x97,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x24,0x08,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xdf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x1b,0x09,0x10,0x02,0x40,0x3c,0x03,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xde,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xc1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x40,0x06,0x06, 0xa8,0x02,0x47,0x11,0x06,0x69,0x03,0x04,0x68,0x02,0x03,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x0a, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x04, 0x68,0x02,0x03,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x03,0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x03,0x31,0xf2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x08, 0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b,0x21,0x03,0x09,0x10,0x0a,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x06,0x0a, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x47,0x21,0x00,0x31,0xe3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x09,0x10,0x07,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x09,0x10,0x0a,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05, 0x21,0x03,0x09,0x10,0x04,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x45,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x00, 0x00,0x60,0x06,0x25,0x08,0xa4,0x45,0x00,0x06,0x04,0x08,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x25,0x04,0xa4,0x45,0x00,0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x06,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x31,0x44,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xfb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xfd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x08,0xa8,0x72,0x45,0x11,0x08,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xf7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x68,0x37,0x00, 0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04,0xa8,0x72,0x45,0x11,0x04,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x02,0x47,0x21,0x00,0x69,0x33,0x07,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x08, 0x21,0x03,0x07,0x10,0x05,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x31,0xd5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x40,0x06,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x05, 0xa8,0x02,0x47,0x11,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xf6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x06,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x05,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a, 0x21,0x03,0x07,0x10,0x03,0x40,0x07,0x0b,0x21,0x03,0x07,0x10,0x08,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x09, 0x21,0x03,0x07,0x10,0x04,0x69,0x06,0x03,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xe4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xdb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x09, 0x21,0x03,0x07,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x07,0x10,0x03,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x07,0x10,0x08,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x40,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x04,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x06,0xa4,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x18,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x31,0x00, 0x00,0x60,0x06,0x05,0x05,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xb2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x45,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x32,0x04,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x09,0x21,0x03,0x04,0x10,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xe3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xaa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x08,0x31,0xf8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x03,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x04,0x10,0x09,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x3d,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x69,0x00,0x09,0x68,0x42,0x01,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x47,0x21,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x03,0xa8,0x2a,0x47,0x11,0x01,0x40,0x07,0x47, 0xa8,0x02,0x47,0x11,0x09,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x3e,0x07,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x02, 0x68,0x9a,0x03,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x0a, 0x21,0x03,0x07,0x10,0x05,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x3c,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x72,0x45,0x01,0x06,0x31,0xae,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x69,0x00,0x06, 0x61,0x02,0x2c,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x3b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x33,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xfa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x39,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x22,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03, 0x68,0x60,0x12,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x16,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1a,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1e,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x22,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x26,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0e,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x0b,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xf4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x69,0x3f,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3b,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05, 0x68,0x02,0x47,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x34,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x3b,0x05,0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04, 0x68,0x02,0x47,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x20,0x00,0x00,0x40,0x3d,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06,0x21,0x03,0x05,0x10,0x04,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04, 0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07,0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x31,0xf5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x05,0x10,0x03,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09, 0x21,0x03,0x05,0x10,0x08,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x05,0x10,0x03,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x32,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x32,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x31,0xfb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x04, 0xa8,0x72,0x45,0x11,0x04,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x01,0x31,0x4d,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xe7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xdf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xbc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x69,0x07,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06,0xa8,0x72,0x45,0x11,0x06,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3c,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x08,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x20,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x31,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x31,0xee,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x28,0x00,0x00,0x40,0x04,0x08,0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05,0xa8,0x1a,0x47,0x11,0x01,0x31,0xf2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x03,0x10,0x06,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x05,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07, 0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06,0x68,0x02,0x47,0x21,0x00,0x31,0xe5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xda,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x03,0x10,0x09,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07,0x21,0x03,0x03,0x10,0x06,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x2e,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x04,0x08, 0xa8,0x72,0x45,0x11,0x08,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x31,0x4b,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xed,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xd7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xcf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x69,0x07,0x08, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04,0xa8,0x72,0x45,0x11,0x04,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3f,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0xbc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xd1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x20,0x00,0x00,0x31,0xbe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xe0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x03,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xe3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x09,0x10,0x07,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x09,0x10,0x03,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x96,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x2b,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x01,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x69,0x34,0x05, 0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06,0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x18,0x00,0x00,0x40,0x3b,0x07,0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x04,0x31,0xe7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09, 0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a,0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x29,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x34,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x08,0x69,0x39,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x28,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x28,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x69,0x00,0x04,0x61,0x02,0x2c,0x20,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x27,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2c,0x20,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x9a,0x47,0x21,0x00,0x31,0xba,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x10,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x26,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x09,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x26,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x2c,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x14,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1c,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x24,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x69,0x00,0x0b, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x09, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x2c,0x00,0x00,0x00,0x40,0x05,0x03,0x21,0x33,0x0b,0x10,0x45,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x05,0x09, 0xa8,0x02,0x47,0x11,0x09,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xd4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x05,0x21,0x03,0x0b,0x10,0x04,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x04,0x08, 0x21,0x03,0x0b,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x0b,0x10,0x03,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x0b,0x10,0x04,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x23,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x69,0x01,0x03,0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04, 0x21,0x03,0x0b,0x10,0x03,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x22,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x22,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x69,0x32,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x07, 0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x04, 0x21,0x33,0x03,0x10,0x45,0x69,0x05,0x05,0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x07, 0xa8,0x02,0x47,0x11,0x07,0x40,0x05,0x0a,0xa8,0x02,0x47,0x11,0x0a,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xd1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x06, 0x21,0x03,0x03,0x10,0x05,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x05, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a, 0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x07,0x00,0x07,0x00,0x40,0x03,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x03,0x0a, 0xa8,0x02,0x47,0x11,0x0a,0x40,0x03,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xfe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x07,0x09, 0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x0a,0x21,0x00,0x69,0x06,0x05, 0x68,0x02,0x47,0x21,0x00,0x31,0xe0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xd3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09, 0x21,0x03,0x03,0x10,0x08,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x24,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x69,0x32,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x00,0x07, 0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x33,0x03,0x10,0x45,0x40,0x04,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x04,0x0a, 0xa8,0x02,0x47,0x11,0x0a,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x03,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x0a,0x21,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x0a,0x40,0x07,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x40,0x06,0x06,0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x05, 0x68,0x7a,0x02,0x21,0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xe4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xdb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x06, 0x21,0x03,0x03,0x10,0x05,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x03,0x03,0x10,0x08,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x04,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x1f,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06, 0xa8,0x02,0x47,0x11,0x06,0x69,0x00,0x09,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x2c,0x00,0x00,0x00,0x40,0x05,0x03, 0x21,0x33,0x09,0x10,0x45,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x09,0x10,0x07,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x1e,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47,0xa8,0x1a,0x47,0x11,0x02,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x01,0x03,0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04, 0x21,0x03,0x09,0x10,0x03,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x1e,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x1d,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x69,0x32,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04, 0x21,0x33,0x03,0x10,0x45,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x1d,0x00,0x00,0x40,0x00,0x47,0xa8,0x2a,0x47,0x11,0x01,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x00,0x00,0x00,0x69,0x32,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04, 0x21,0x33,0x03,0x10,0x45,0x40,0x03,0x05,0x21,0x1b,0x03,0x10,0x02,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1d,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x22,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x00,0x00,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xfa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x69,0x34,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x38,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05, 0x68,0x02,0x47,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xcd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x38,0x05,0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04, 0x68,0x02,0x47,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xa1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x36,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06,0x21,0x03,0x05,0x10,0x04,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04, 0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07,0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x05,0x10,0x03,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xd3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09, 0x21,0x03,0x05,0x10,0x08,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x05,0x10,0x03,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x16,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x16,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08, 0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x31,0xf8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x04, 0xa8,0x72,0x45,0x11,0x04,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x01,0x31,0x46,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xe9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xd4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06, 0xa8,0x72,0x45,0x11,0x06,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x08,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xe7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x28,0x00,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x05,0x31,0xf1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06, 0x68,0x02,0x47,0x21,0x00,0x31,0xe0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xde,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x03,0x10,0x09,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07, 0x21,0x03,0x03,0x10,0x06,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x12,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x04,0x08, 0xa8,0x72,0x45,0x11,0x08,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x31,0x48,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xe6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xd9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xc4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x07,0x08, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04,0xa8,0x72,0x45,0x11,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x34,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0xbb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xdd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xef,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x03,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xcc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xe1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xd0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x09,0x10,0x07,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x09,0x10,0x03,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x00,0x00,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xaa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x98,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x3a,0x05,0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x31,0xb6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x18,0x00,0x00,0x40,0x38,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x04,0x31,0xe9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09,0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a, 0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x9d,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x3a,0x05,0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x08,0x69,0x35,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x91,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00,0x05,0x20,0x00,0x20,0x00,0x69,0x00,0x04, 0x61,0x02,0x2c,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xac,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2c,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x00,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0a,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x01,0x21,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xaa,0x03, 0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x3a,0x03, 0x68,0x02,0x45,0x01,0x04,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x38,0x03, 0x68,0x02,0x45,0x01,0x06,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x2a,0x04, 0x00,0x10,0x01,0x05,0x29,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x15,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x11,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x0d,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x28,0x04, 0x00,0x10,0x01,0x05,0x2a,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x16,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x12,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x0e,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x26,0x04, 0x00,0x10,0x01,0x05,0x2b,0x05,0x3d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x3e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x3f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x41,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x13,0x05,0x42,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x0f,0x05,0x43,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x69,0x39,0x03, 0x68,0x42,0x01,0x41,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x05,0xa8,0x72,0x45,0x11,0x05,0x40,0x04,0x07, 0xa8,0x72,0x45,0x11,0x07,0x40,0x04,0x03,0xa8,0x72,0x45,0x11,0x03,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xcb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x31,0xbd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x14,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x68,0x01,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x9f,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x10,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x05,0x05, 0xa8,0x72,0x45,0x11,0x05,0x40,0x05,0x07,0xa8,0x72,0x45,0x11,0x07,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x31,0x03, 0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x03,0xa8,0x72,0x45,0x11,0x03,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x05, 0xa8,0x72,0x45,0x11,0x05,0x40,0x04,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x07,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xf0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x4e,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x18,0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x24,0x14,0x00,0x00,0x31,0xa2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x10,0x00,0x00,0x31,0x95,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x0c,0x00,0x00,0x31,0xba,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x05, 0xa8,0x72,0x45,0x11,0x05,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x03, 0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x81,0x01,0x40,0x06,0x07, 0xa8,0x72,0x45,0x11,0x07,0x40,0x04,0x03,0xa8,0x72,0x45,0x11,0x03,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x05,0x00,0x00,0x31,0xf6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xf9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xc4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xbb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xad,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x97,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x05,0xa8,0x72,0x45,0x11,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xcf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xac,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x90,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x31,0x9e,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0xc4,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x45,0x00,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0xc4,0x45,0x64,0x02,0x01, 0x06,0xc4,0x45,0x34,0x45,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0xc4,0x45,0x00, 0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x47,0xc4,0x45,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x02,0xc4,0x45,0x00, 0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x47,0xa8,0x0a,0x47,0x11,0x45,0x69,0x01,0x45, 0x68,0xaa,0x47,0x21,0x00,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0xa4,0x45,0x00, 0x52,0x04,0x46,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x59,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xae,0xde,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x00,0x45,0x11,0x00,0x61,0x07,0x03,0x62,0xc8,0x02,0x11,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x05,0x02,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x01,0x20,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x50,0x21,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x04,0x02,0x44,0x45,0x01, 0x06,0x04,0x02,0x24,0x45,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x45,0xe4,0x01,0x00, 0x06,0xc4,0x45,0x00,0x02,0x70,0x02,0x40,0x00,0x60,0x86,0x01,0x00,0x04,0x02,0x00, 0x35,0x1f,0x00,0x1f,0x00,0x62,0x02,0x00,0x00,0x60,0x86,0x65,0x45,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x4e,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x08,0x00,0x08,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x00,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x61,0x35,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x10,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x06,0x00,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x45,0x68,0xa2,0x02,0x81,0xff,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x61,0x3a,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x04,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x04,0x02,0x00, 0x31,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x0c,0x00,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x45,0x68,0xa2,0x02,0x01,0xff,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x61,0x38,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x06,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x40,0x00,0x45,0x68,0xa2,0x02,0x81,0xfe,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x28,0x00,0x00,0x00,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xe5,0x45,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x02,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x46, 0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x2c,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x50,0x85,0x65,0x02,0x24,0x46,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00, 0x00,0x68,0x06,0x01,0x00,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x46, 0x68,0xca,0x46,0x11,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0x24,0x46,0x00, 0x16,0xc4,0x45,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0xff,0xff,0xff,0x70,0x07,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x2f,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x1c,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x56,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x04,0x04,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x60,0x00,0x00,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0f,0x05,0x3d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x13,0x05,0x3e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x3f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x41,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x42,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x43,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2b,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x80,0x03,0x80,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x11,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x46,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x45,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x06,0xa4,0x45,0x00, 0x06,0x24,0x46,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x08,0xa4,0x45,0x00, 0x06,0xe4,0x45,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x31,0xc9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xcb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xbd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x46,0xa4,0x45,0x00,0x06,0x24,0x46,0x00,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x45,0xa4,0x45,0x00,0x06,0xe4,0x45,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x46,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3f,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x69,0x07,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x3d,0x09,0x68,0x42,0x01,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0xe4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x3c,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xd0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xce,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x40,0x06,0x09, 0xa8,0x02,0x47,0x11,0x09,0x69,0x03,0x08,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07, 0x68,0x02,0x09,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06, 0x21,0x03,0x03,0x10,0x08,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x07,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x4e,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x05,0x05,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x46,0xa4,0x45,0x00,0x06,0x24,0x46,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x45,0xa4,0x45,0x00,0x06,0xe4,0x45,0x00,0x00,0x31,0xc6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x20,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x45,0xa4,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x46,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xeb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xd4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x3b,0x06,0x61,0x02,0x2c,0x20,0x00,0x40,0x37,0x03, 0xa8,0x2a,0x47,0x11,0x01,0x31,0xed,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x07, 0x21,0x03,0x06,0x10,0x05,0x69,0x02,0x09,0x68,0x02,0x03,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03,0xa8,0x1a,0x47,0x11,0x01,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x06,0x10,0x09,0x40,0x05,0x05, 0xa8,0x02,0x47,0x11,0x05,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xf1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x06,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x05,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x08, 0x68,0x02,0x03,0x21,0x00,0x69,0x04,0x04,0x68,0x02,0x47,0x21,0x00,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x40,0x03,0x0b, 0x21,0x03,0x06,0x10,0x07,0x40,0x03,0x09,0x21,0x03,0x06,0x10,0x08,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x06,0x10,0x04,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x4b,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x4b,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x25,0x08,0xa4,0x45,0x00,0x06,0x04,0x08,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00, 0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x08,0x44,0x01,0x00, 0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x04,0xa4,0x45,0x00, 0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x06,0xa4,0x45,0x00, 0x06,0x24,0x06,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x08,0xa4,0x45,0x00, 0x06,0x24,0x08,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x31,0x45,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0x4a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0x48,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xf6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x40,0x01,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x08, 0xa8,0x72,0x45,0x11,0x08,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x44,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x28,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04, 0xa8,0x72,0x45,0x11,0x04,0x68,0x39,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x34,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x37,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x9c,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3c,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x24,0x08,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xd0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x1b,0x09,0x10,0x02,0x40,0x3e,0x03, 0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x40,0x06,0x06,0xa8,0x02,0x47,0x11,0x06,0x69,0x03,0x04, 0x68,0x02,0x03,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03,0xa8,0x1a,0x47,0x11,0x01,0x31,0xf5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x0a,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x03, 0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x03,0x31,0xfa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x40,0x07,0x08,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x0a,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x06,0x0a, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x47,0x21,0x00,0x31,0xe8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x09,0x10,0x07,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x09,0x10,0x0a,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05,0x21,0x03,0x09,0x10,0x04,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x27,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x45,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x06,0xa4,0x45,0x00, 0x06,0x04,0x06,0x00,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00, 0x05,0x18,0x00,0x18,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x00,0x00,0x60,0x06,0x25,0x08,0xa4,0x45,0x00, 0x06,0x04,0x08,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x04,0xa4,0x45,0x00, 0x06,0x04,0x04,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x06,0xa4,0x45,0x00, 0x06,0x24,0x06,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x31,0x4d,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xf1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x08, 0xa8,0x72,0x45,0x11,0x08,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xfc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xc0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x31,0xbe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x20,0x00,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x68,0x3c,0x00,0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xba,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x98,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04, 0xa8,0x72,0x45,0x11,0x04,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x02,0x47,0x21,0x00,0x69,0x38,0x07,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x24,0x06,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x08, 0x21,0x03,0x07,0x10,0x05,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x40,0x06,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x05, 0xa8,0x02,0x47,0x11,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x06,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x05,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a,0x21,0x03,0x07,0x10,0x03,0x40,0x07,0x0b, 0x21,0x03,0x07,0x10,0x08,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x09, 0x21,0x03,0x07,0x10,0x04,0x69,0x06,0x03,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xed,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xdf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x09,0x21,0x03,0x07,0x10,0x04,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x07,0x10,0x03,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x07,0x10,0x08,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x41,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0xc5,0x45,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x06,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xce,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xb2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x85,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x01,0x31,0xa5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x18,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x32,0x00, 0x00,0x60,0x06,0x05,0x05,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xba,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x45,0xa4,0x45,0x00,0x06,0xc4,0x45,0x00,0x00,0x69,0x05,0x08, 0x68,0x02,0x47,0x21,0x00,0x69,0x3a,0x04,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0xc4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x09,0x21,0x03,0x04,0x10,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xe8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x40,0x00,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x08,0x31,0xfb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x03,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x04,0x10,0x09,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x9d,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3d,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x69,0x00,0x09,0x68,0x42,0x01,0x11,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0xc4,0x45,0x00,0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x47,0x21,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3f,0x03,0xa8,0x2a,0x47,0x11,0x01,0x40,0x07,0x47, 0xa8,0x02,0x47,0x11,0x09,0x31,0xc1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x33,0x07,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x02, 0x68,0x9a,0x03,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x0a, 0x21,0x03,0x07,0x10,0x05,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x3c,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x3c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x72,0x45,0x01,0x06,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x69,0x00,0x06, 0x61,0x02,0x2c,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x45,0xa4,0x45,0x00, 0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x31,0xe8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xd6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x03,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xf9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06, 0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x3a,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x04,0x04,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0e,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x12,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x16,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2a,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x12,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x16,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1a,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x26,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08, 0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xdf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xc1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xbc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1c,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x69,0x30,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04, 0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x3f,0x05,0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47,0xa8,0x1a,0x47,0x11,0x01,0x31,0xfe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x47,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x34,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x40,0x02,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x3f,0x05, 0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04,0x68,0x02,0x47,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x20,0x00,0x00,0x40,0x31,0x07,0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04,0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07, 0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47,0xa8,0x1a,0x47,0x11,0x02,0x31,0xf6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x05,0x10,0x03,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x03,0x05,0x10,0x08,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03,0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08, 0x68,0x02,0x07,0x21,0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xdb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x05,0x10,0x03,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0x9d,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x32,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x32,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08, 0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x31,0xff,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x04,0xa8,0x72,0x45,0x11,0x04,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x01,0x31,0x41,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xec,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06, 0xa8,0x72,0x45,0x11,0x06,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3e,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x08,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x32,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xe3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00,0x00,0x31,0xb5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x28,0x00,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x05,0x31,0xf8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06, 0x68,0x02,0x47,0x21,0x00,0x31,0xe6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xd9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x03,0x10,0x09,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07, 0x21,0x03,0x03,0x10,0x06,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x2e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x04,0x08,0xa8,0x72,0x45,0x11,0x08,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06, 0x68,0x42,0x01,0x81,0x01,0x31,0x4f,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xe1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x10,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x14,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x18,0x00,0x00,0x69,0x07,0x08,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04, 0xa8,0x72,0x45,0x11,0x04,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x30,0x09, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x06,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1c,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08, 0x68,0x42,0x01,0x31,0x00,0x31,0xd2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x20,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x24,0x00,0x00,0x40,0x04,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xe5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a, 0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b,0x21,0x03,0x09,0x10,0x03,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05,0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03,0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04, 0x68,0x7a,0x02,0x21,0x00,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xe8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xd6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05, 0x21,0x03,0x09,0x10,0x04,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x09,0x10,0x07,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b, 0x21,0x03,0x09,0x10,0x03,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x2b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x02,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xbd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xaf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x69,0x3d,0x05,0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06,0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x18,0x00,0x00,0x40,0x3f,0x07,0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x04,0x31,0xec,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06,0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09, 0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a,0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x29,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x01,0x01,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x3d,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x08,0x69,0x37,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x28,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x28,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00,0x05,0x40,0x00,0x40,0x00,0x69,0x00,0x04, 0x61,0x02,0x2c,0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x27,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2c,0x20,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0c,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x10,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x26,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x09,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0xe4,0x45,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x26,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x25,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x05,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x14,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1c,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x24,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x05,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x69,0x00,0x0b,0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x09,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x05,0x00,0x00,0x40,0x05,0x03, 0x21,0x33,0x0b,0x10,0x45,0x69,0x05,0x04,0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x05,0x09,0xa8,0x02,0x47,0x11,0x09,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xdd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x05, 0x21,0x03,0x0b,0x10,0x04,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x06,0x00,0x06,0x00,0x40,0x04,0x08,0x21,0x03,0x0b,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x0b,0x10,0x03,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x03,0x0b,0x10,0x04,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x23,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47,0xa8,0x1a,0x47,0x11,0x02,0x69,0x01,0x03, 0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04,0x21,0x03,0x0b,0x10,0x03,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x22,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x22,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x69,0x3a,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x07,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x04,0x21,0x33,0x03,0x10,0x45,0x69,0x05,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x05,0x07,0xa8,0x02,0x47,0x11,0x07,0x40,0x05,0x0a, 0xa8,0x02,0x47,0x11,0x0a,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xd2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x05,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a,0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x03,0x07, 0xa8,0x02,0x47,0x11,0x07,0x40,0x03,0x0a,0xa8,0x02,0x47,0x11,0x0a,0x40,0x03,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x07,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06, 0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x69,0x06,0x04, 0x68,0x02,0x0a,0x21,0x00,0x69,0x06,0x05,0x68,0x02,0x47,0x21,0x00,0x31,0xe5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x03,0x03,0x10,0x08,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x20,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x69,0x3a,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x00,0x07,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x0a, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x33,0x03,0x10,0x45,0x40,0x04,0x07, 0xa8,0x02,0x47,0x11,0x07,0x40,0x04,0x0a,0xa8,0x02,0x47,0x11,0x0a,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x03,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04, 0x68,0x02,0x0a,0x21,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x0a, 0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x05,0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x07, 0xa8,0x02,0x47,0x11,0x07,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x0a,0x40,0x07,0x09, 0x21,0x03,0x03,0x10,0x08,0x40,0x07,0x0b,0x21,0x03,0x03,0x10,0x04,0x40,0x06,0x06, 0x21,0x03,0x03,0x10,0x05,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x69,0x05,0x04, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x05,0x68,0x7a,0x02,0x21,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xed,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xdf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x18,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x06,0x21,0x03,0x03,0x10,0x05,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x04,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06,0xa8,0x02,0x47,0x11,0x06,0x69,0x00,0x09, 0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x05,0x00,0x00,0x40,0x05,0x03,0x21,0x33,0x09,0x10,0x45,0x40,0x05,0x05, 0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x09,0x10,0x07,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1e,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x01,0x03, 0x68,0x02,0x47,0x21,0x00,0x40,0x01,0x04,0x21,0x03,0x09,0x10,0x03,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x1e,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1d,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x69,0x3a,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04,0x21,0x33,0x03,0x10,0x45,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x1d,0x00,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x01,0x00,0x00,0x69,0x3a,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04,0x21,0x33,0x03,0x10,0x45,0x40,0x03,0x05, 0x21,0x1b,0x03,0x10,0x02,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x1d,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00, 0x55,0x08,0x00,0x08,0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x04,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x05,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x04,0x04,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x45,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x01,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0xc4,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x45,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x45,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06, 0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08,0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xf9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x9d,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x69,0x3d,0x03, 0x61,0x02,0x2c,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x47,0x21,0x00,0x69,0x00,0x08, 0x68,0x42,0x01,0x11,0x00,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x02,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3b,0x05, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x47, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xff,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x05, 0x68,0x02,0x47,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x04,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x18,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x3b,0x05,0x61,0x02,0x2c,0x20,0x00,0x69,0x05,0x04, 0x68,0x02,0x47,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xa2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x34,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x04,0x06,0x21,0x03,0x05,0x10,0x04,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x04, 0xa8,0x02,0x47,0x11,0x04,0x40,0x00,0x07,0xa8,0x1a,0x47,0x11,0x01,0x40,0x05,0x47, 0xa8,0x1a,0x47,0x11,0x02,0x31,0xf5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x05,0x10,0x03,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x03,0x05,0x10,0x08,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x06,0x08,0x68,0x02,0x07,0x21,0x00,0x31,0xc3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x0b, 0x21,0x03,0x05,0x10,0x06,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09, 0x21,0x03,0x05,0x10,0x08,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x05,0x10,0x03,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x16,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x16,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x06,0x08, 0xa8,0x72,0x45,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x31,0xfb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x04, 0xa8,0x72,0x45,0x11,0x04,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x01,0x31,0x44,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xe7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x47,0x21,0x00,0x40,0x03,0x06, 0xa8,0x72,0x45,0x11,0x06,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3f,0x03, 0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x08,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x31,0x05,0xa8,0x2a,0x47,0x11,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xec,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xb0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x28,0x00,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05, 0xa8,0x1a,0x47,0x11,0x01,0x31,0xfe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x51,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x05,0x68,0x42,0x01,0x71,0x00,0x40,0x04,0x08, 0xa8,0x02,0x47,0x11,0x08,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x47,0xa8,0x02,0x47,0x11,0x05,0x31,0xf2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x07,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x07,0x0b,0x21,0x03,0x03,0x10,0x04,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x03,0x10,0x06,0x69,0x06,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x06,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06, 0x68,0x02,0x47,0x21,0x00,0x31,0xe5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xd3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x03,0x10,0x09,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0b, 0x21,0x03,0x03,0x10,0x04,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x07, 0x21,0x03,0x03,0x10,0x06,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x12,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x04,0x08, 0xa8,0x72,0x45,0x11,0x08,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x47,0x68,0x02,0x47,0x81,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x31,0x4b,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xe4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xd7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xcd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x07,0x08, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x04,0xa8,0x72,0x45,0x11,0x04,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3d,0x09,0x61,0x02,0x2c,0x20,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x09,0x10,0x08,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x31,0xd1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xbc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x40,0x04,0x06, 0xa8,0x02,0x47,0x11,0x06,0x40,0x02,0x08,0xa8,0x02,0x47,0x11,0x08,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xe0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x61,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x40,0x03,0x06,0xa8,0x02,0x47,0x11,0x06,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x47, 0xa8,0x02,0x47,0x11,0x08,0x40,0x07,0x0a,0x21,0x03,0x09,0x10,0x07,0x40,0x07,0x0b, 0x21,0x03,0x09,0x10,0x03,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x05, 0x21,0x03,0x09,0x10,0x04,0x69,0x06,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x03, 0x68,0x02,0x47,0x21,0x00,0x69,0x07,0x04,0x68,0x7a,0x02,0x21,0x00,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xe2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xd5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x05,0x21,0x03,0x09,0x10,0x04,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x09,0x10,0x07,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0b,0x21,0x03,0x09,0x10,0x03,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06,0xa8,0x72,0x45,0x11,0x06,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x9b,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x39,0x05,0x61,0x02,0x2c,0x20,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x06, 0x21,0x03,0x05,0x10,0x04,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x31,0xb4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x18,0x00,0x00,0x40,0x3b,0x07, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x47,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x47,0xa8,0x02,0x47,0x11,0x04,0x31,0xe7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06, 0x68,0x02,0x47,0x21,0x00,0x40,0x03,0x09,0x21,0x03,0x05,0x10,0x08,0x40,0x03,0x0a, 0x21,0x03,0x05,0x10,0x03,0x40,0x03,0x0b,0x21,0x03,0x05,0x10,0x06,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x91,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0c,0x00,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x69,0x00,0x08,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x47,0x21,0x00,0x40,0x39,0x05,0xa8,0x2a,0x47,0x11,0x01,0x40,0x03,0x47, 0xa8,0x02,0x47,0x11,0x08,0x69,0x36,0x03,0x61,0x02,0x2c,0x20,0x00,0x69,0x03,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x09,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xa4,0x45,0x00,0x05,0x20,0x00,0x20,0x00,0x69,0x00,0x04, 0x61,0x02,0x2c,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xae,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x47, 0x68,0x02,0x47,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x47,0x21,0x00,0x40,0x00,0x47, 0xa8,0x2a,0x47,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2c,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x47,0x21,0x00,0x31,0xb3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x61,0x35,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0xc8,0x02,0x11,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x05,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x06,0x00,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x39,0x03,0x68,0x02,0x45,0x01,0x04,0x68,0x25,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x23,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x3b,0x03,0x68,0x02,0x45,0x01,0x06,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x25,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x06,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x07,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x08,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x09,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x0a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x0b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x29,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x2b,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x35,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x36,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x37,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x38,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x39,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x3a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x3b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x3c,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x24,0x04,0x00,0x10,0x01,0x05,0x2b,0x05,0x3d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x27,0x05,0x3e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1f,0x05,0x3f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1b,0x05,0x40,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x17,0x05,0x41,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x42,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x43,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x23,0x05,0x44,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x05,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x69,0x37,0x03,0x68,0x42,0x01,0x41,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x05, 0xa8,0x72,0x45,0x11,0x05,0x40,0x04,0x07,0xa8,0x72,0x45,0x11,0x07,0x40,0x04,0x03, 0xa8,0x72,0x45,0x11,0x03,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x18,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x24,0x14,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x06,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x90,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x05,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00, 0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x05,0x05,0xa8,0x72,0x45,0x11,0x05,0x40,0x05,0x07, 0xa8,0x72,0x45,0x11,0x07,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x32,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x03, 0xa8,0x72,0x45,0x11,0x03,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x05,0xa8,0x72,0x45,0x11,0x05,0x40,0x04,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x04,0x07,0x00,0x00,0x31,0xfe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xf5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x43,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xc8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x96,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x0c,0x00,0x00,0x31,0xb9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x05,0xa8,0x72,0x45,0x11,0x05,0x31,0xab,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x41,0x00,0x07, 0x68,0x42,0x01,0xc1,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x81,0x01,0x40,0x06,0x07,0xa8,0x72,0x45,0x11,0x07,0x40,0x04,0x03, 0xa8,0x72,0x45,0x11,0x03,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x04,0x05,0x00,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xf7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0xa4,0x45,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x18,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x24,0x14,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x10,0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x05, 0xa8,0x72,0x45,0x11,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x01,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00, 0x06,0x64,0x02,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x01,0x00, 0x00,0x20,0x82,0x45,0x03,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x95,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x64,0x45,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x93,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x47,0x04,0x47,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x45,0xa4,0x45,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0xa4,0x45,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0x9a,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x89,0xda,0x00,0x00,0x61,0x38,0x00, 0x00,0xa0,0x4a,0x45,0x2b,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x60,0x06,0x44,0x2b,0x64,0x02,0x01,0x06,0x44,0x2b,0x34,0x45,0x41,0x01,0x00, 0x80,0x60,0x06,0x01,0x20,0x44,0x2b,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x2b,0x44,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x2b,0x44,0x2b,0x00,0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x2b, 0xa8,0x0a,0x2b,0x11,0x45,0x69,0x01,0x2b,0x68,0x62,0x2b,0x21,0x00,0x70,0x01,0x00, 0x00,0x20,0x02,0x01,0x00,0x24,0x2b,0x00,0x52,0x04,0x46,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x5c,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xee,0xdf,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x45,0x11,0x00,0x61,0x07,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x85,0x2b,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x46,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x60,0x06,0x84,0x2b,0x44,0x45,0x01,0x06,0x84,0x2b,0x24,0x45,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0xe4,0x01,0x00,0x06,0x44,0x2b,0x00,0x02,0x70,0x02,0x40, 0x00,0x60,0x86,0x01,0x00,0x84,0x2b,0x00,0x35,0x1f,0x00,0x1f,0x00,0x62,0x02,0x00, 0x00,0x60,0x86,0x45,0x2b,0xe4,0x01,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0xe4,0x01,0x00,0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x50,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x31,0x08,0x00,0x08,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x0a,0x85,0x01,0x84,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x61,0x36,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x31,0x10,0x00,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x06,0x04,0x00,0x00,0x31,0xa9,0x03, 0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0x85,0x01,0x84,0x2b,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x61,0x39,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x04,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x31,0x18,0x00,0x18,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x0c,0x01,0x00,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0x85,0x01,0x84,0x2b,0x00,0x05,0xf0,0xff,0xf0,0xff,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x61,0x3b,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x06,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0x85,0x01,0x84,0x2b,0x00,0x05,0xe8,0xff,0xe8,0xff,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x68,0x00,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x01,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x02,0x40, 0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0xa8,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x10,0x0a,0x00,0x00,0x61,0x36,0x03,0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x2c, 0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x50,0x85,0x65,0x02,0x04,0x01,0x00, 0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x60,0x00,0x60,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x68,0x02,0x01,0x11,0x00,0x70,0x01,0x40, 0x00,0x60,0x06,0x01,0x00,0x04,0x01,0x00,0x16,0x84,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0x69,0x04,0x2c, 0x61,0x02,0x03,0x20,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x30,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x1b,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x58,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x96,0xfe,0x00,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0b,0x05,0x46,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x47,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x48,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x4c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x04,0x06,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x09,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0d,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x11,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x15,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x19,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x29,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x24,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x3d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x3e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x3f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x40,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x41,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x42,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x43,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x44,0x58, 0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0x84,0x01,0x00, 0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x12,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x16,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1a,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x26,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01, 0x68,0x5a,0x01,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x01,0x68,0x90,0x01,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x10,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x06,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x85,0x01,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x01, 0x68,0x42,0x01,0xc1,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x01,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x06,0x24,0x2b,0x00, 0x06,0x84,0x01,0x00,0x00,0x40,0x06,0x08,0xa8,0x22,0x2b,0x11,0x01,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00,0x06,0xa4,0x01,0x00,0x00,0x31,0xc7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x02,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b,0x01,0x04,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x01,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x24,0x2b,0x00, 0x06,0x84,0x01,0x00,0x00,0x40,0x00,0x01,0xa8,0x22,0x2b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x3c,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x84,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0xa4,0x01,0x00,0x00,0x69,0x07,0x02,0x68,0x9a,0x2b,0x21,0x00,0x31,0xe0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xd2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xce,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x69,0x35,0x06,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xc3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x40,0x32,0x04, 0xa8,0x2a,0x2b,0x11,0x01,0x40,0x03,0x06,0xa8,0x02,0x2b,0x11,0x06,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x2b, 0xa8,0x1a,0x2b,0x11,0x01,0x31,0xf8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05, 0x68,0x02,0x04,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x08, 0x21,0x03,0x2c,0x10,0x05,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x03,0x2c,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x03,0x40,0x04,0x05, 0x21,0x03,0x2c,0x10,0x04,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x50,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b,0x01,0x04,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1f,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x00, 0x00,0x60,0x06,0x05,0x05,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x01,0x24,0x2b,0x00,0x06,0x84,0x01,0x00,0x00,0x40,0x00,0x01, 0xa8,0x22,0x2b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x01,0x24,0x2b,0x00, 0x06,0xa4,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0xa4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x05, 0x68,0x02,0x2b,0x21,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x06, 0x21,0x03,0x2c,0x10,0x05,0x40,0x31,0x03,0xa8,0x2a,0x2b,0x11,0x01,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x07, 0x68,0x02,0x03,0x21,0x00,0x40,0x05,0x05,0xa8,0x02,0x2b,0x11,0x05,0x40,0x05,0x2b, 0xa8,0x1a,0x2b,0x11,0x02,0x31,0xfe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08, 0x21,0x03,0x2c,0x10,0x04,0x69,0x06,0x03,0x68,0x7a,0x01,0x21,0x00,0x40,0x05,0x09, 0x21,0x03,0x2c,0x10,0x07,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x2b,0x21,0x00,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xd5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x2c,0x10,0x03,0x40,0x03,0x0a,0x21,0x03,0x2c,0x10,0x06,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x04,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x4d,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4d,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x06, 0xa8,0xca,0x2b,0x11,0x06,0x40,0x04,0x08,0xa8,0xca,0x2b,0x11,0x08,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00, 0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x08,0x44,0x01,0x00, 0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x04,0xa8,0xca,0x2b,0x11,0x04,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x06,0x24,0x2b,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x08,0x24,0x2b,0x00,0x06,0x24,0x08,0x00,0x00,0x40,0x00,0x2b, 0x68,0xca,0x2b,0x01,0x04,0x31,0x46,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0x4b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x17,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x44,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x40,0x00,0x08,0xa8,0x22,0x2b,0x11,0x08,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x04, 0xa8,0x22,0x2b,0x11,0x04,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x06,0x24,0x2b,0x00, 0x06,0x24,0x06,0x00,0x00,0x68,0x37,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x24,0x08,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x31,0xfe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xe2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xd5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x1b,0x2c,0x10,0x02,0x40,0x33,0x03, 0xa8,0x2a,0x2b,0x11,0x01,0x69,0x38,0x05,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xda,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x29,0x00,0x00,0x69,0x03,0x04, 0x68,0x02,0x03,0x21,0x00,0x40,0x03,0x05,0xa8,0x02,0x2b,0x11,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x07,0x03, 0x68,0x7a,0x01,0x21,0x00,0x31,0xf6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x40,0x05,0x06,0x21,0x03,0x2c,0x10,0x04,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x05,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x7a,0x02,0x21,0x00,0x40,0x04,0x04, 0x21,0x03,0x2c,0x10,0x03,0x41,0x00,0x05,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x03, 0x68,0x42,0x01,0x71,0x00,0x40,0x06,0x08,0x21,0x03,0x2c,0x10,0x07,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x0a,0x21,0x03,0x2c,0x10,0x09,0x40,0x05,0x05, 0xa8,0x02,0x2b,0x11,0x05,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x2b,0xa8,0x02,0x2b,0x11,0x03,0x31,0x49,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xdb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xf7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x08,0x68,0x7a,0x02,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x07, 0x21,0x03,0x2c,0x10,0x06,0x40,0x03,0x09,0x21,0x03,0x2c,0x10,0x08,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x2c,0x10,0x04,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0x91,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x48,0x00,0x00,0x69,0x00,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06,0xa8,0xca,0x2b,0x11,0x06,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x08, 0xa8,0xca,0x2b,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x04,0xa8,0xca,0x2b,0x11,0x04,0x40,0x05,0x00, 0x00,0x60,0x06,0x45,0x06,0x24,0x2b,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x00,0x2b, 0x68,0xca,0x2b,0x01,0x04,0x31,0x4c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x31,0xf0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xfe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x06,0xa8,0x22,0x2b,0x11,0x06,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xe2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x08, 0xa8,0x22,0x2b,0x11,0x08,0x68,0x32,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x40,0x00,0x04,0xa8,0x22,0x2b,0x11,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x24,0x06,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x00,0x06,0x68,0x42,0x01,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x07,0x21,0x03,0x2c,0x10,0x05,0x41,0x00,0x05, 0x68,0x42,0x01,0x31,0x00,0x31,0xd4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x40,0x06,0x06,0xa8,0x02,0x2b,0x11,0x06,0x40,0x02,0x05, 0xa8,0x02,0x2b,0x11,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xef,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x06,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x05,0x21,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x05, 0x68,0x42,0x01,0x61,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x06,0x08,0x68,0x7a,0x02,0x21,0x00,0x40,0x04,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x40,0x04,0x2b,0xa8,0x02,0x2b,0x11,0x05,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x2c,0x10,0x03,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a,0x21,0x03,0x2c,0x10,0x07,0x69,0x06,0x02, 0x68,0xe2,0x01,0x21,0x00,0x40,0x06,0x04,0x21,0x03,0x2c,0x10,0x08,0x69,0x06,0x03, 0x68,0x02,0x06,0x21,0x00,0x69,0x06,0x07,0x68,0x02,0x2b,0x21,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xec,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x02,0x08, 0x21,0x03,0x2c,0x10,0x03,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x04, 0x21,0x1b,0x2c,0x10,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x07,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x43,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x04,0x00,0x00,0x69,0x00,0x01,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x06, 0xa8,0x22,0x2b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x2b, 0x68,0xca,0x2b,0x01,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x84,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x2b,0x21,0x00,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x17,0x00,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x01, 0xa8,0x22,0x2b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04, 0x21,0x03,0x2c,0x10,0x07,0x41,0x00,0x07,0x68,0x42,0x01,0x31,0x00,0x31,0xeb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xd4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x3b,0x05, 0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x2b,0xa8,0x02,0x2b,0x11,0x07,0x31,0xed,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x08, 0x68,0x02,0x05,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04, 0x68,0x02,0x2b,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x06, 0x21,0x03,0x2c,0x10,0x03,0x40,0x03,0x09,0x21,0x03,0x2c,0x10,0x08,0x40,0x03,0x0a, 0x21,0x03,0x2c,0x10,0x04,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x40,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x33,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x9e,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x2b,0xa8,0xca,0x2b,0x11,0x01,0x69,0x3e,0x04, 0x68,0x42,0x01,0x11,0x00,0x69,0x03,0x02,0x68,0x9a,0x2b,0x21,0x00,0x40,0x30,0x03, 0xa8,0x2a,0x2b,0x11,0x01,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x2b, 0xa8,0x02,0x2b,0x11,0x04,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x03,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x05, 0x68,0x02,0x2b,0x21,0x00,0x40,0x06,0x06,0x21,0x1b,0x2c,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x2c,0x10,0x07,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x05,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x3f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x3e,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x24,0x2b,0x00,0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05, 0x68,0x22,0x2b,0x01,0x06,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x06,0x21,0x03,0x2c,0x10,0x05,0x31,0xb9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x3e,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x2b,0x68,0xca,0x2b,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b,0x11,0x01,0x31,0xe6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x02,0x04, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05, 0x21,0x03,0x2c,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x3c,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x96,0xfe,0x00,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0b,0x05,0x46,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x47,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x48,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x4c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x04,0x06,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x2d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x2e,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x2f,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x30,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x31,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x32,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x33,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x34,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x09,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x23,0x04, 0x00,0x10,0x01,0x05,0x0d,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x11,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x15,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x19,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x29,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x84,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x40,0x03,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xfe,0xff,0x00,0x00,0x61,0x30,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x5a,0x01,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x01, 0x68,0x90,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x0c,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x04,0x04,0x00,0x00,0x69,0x30,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x29,0x40,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06,0xa8,0x22,0x2b,0x11,0x06,0x40,0x06,0x08, 0xa8,0x22,0x2b,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x02,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x12,0x39,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x80,0x80,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xce,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x69,0x3e,0x07, 0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02,0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x2c,0x10,0x02,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x04, 0xa8,0x2a,0x2b,0x11,0x01,0x40,0x06,0x07,0xa8,0x02,0x2b,0x11,0x07,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x2b, 0xa8,0x1a,0x2b,0x11,0x01,0x31,0xe3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05, 0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x04, 0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x52,0xfd,0x00,0x00,0x40,0x04,0x0a, 0x21,0x03,0x2c,0x10,0x03,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x36,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x01,0x01,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x04,0x04,0x68,0x02,0x2b,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x40,0x00,0x06,0xa8,0x2a,0x2b,0x11,0x01,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x05,0x04,0xa8,0x02,0x2b,0x11,0x04,0x40,0x05,0x2b, 0xa8,0x1a,0x2b,0x11,0x02,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09, 0x21,0x03,0x2c,0x10,0x03,0x69,0x06,0x06,0x68,0x7a,0x01,0x21,0x00,0x40,0x05,0x08, 0x21,0x03,0x2c,0x10,0x07,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05, 0x68,0x02,0x04,0x21,0x00,0x69,0x05,0x03,0x68,0x02,0x2b,0x21,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x2c,0x10,0x06,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0a,0xbd,0x00,0x00,0x40,0x03,0x0a,0x21,0x03,0x2c,0x10,0x05,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x03,0x31,0xfd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x34,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x34,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x04,0x04,0x00,0x00,0x69,0x30,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x29,0x40,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x40,0x04,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x02,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x08,0xa8,0x22,0x2b,0x11,0x08,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x39,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x80,0x80,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x06,0x04,0xa8,0x22,0x2b,0x11,0x04,0x40,0x06,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x01,0x31,0x40,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0x4e,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xf2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x01,0x2b, 0xa8,0xca,0x2b,0x11,0x08,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x31,0xf5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xd3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xc8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xba,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05, 0x68,0x02,0x04,0x21,0x00,0x69,0x3a,0x07,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xd9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x27,0x00,0x00,0x69,0x06,0x04, 0x68,0x7a,0x01,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x07, 0xa8,0x02,0x2b,0x11,0x07,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x05,0x21,0x03,0x2c,0x10,0x04,0x31,0xfb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xd6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x71,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x7a,0x02,0x21,0x00,0x41,0x36,0x06, 0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x03,0x2c,0x10,0x08,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x04,0x00,0x00,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x03,0x40,0x04,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x07,0x2b,0xa8,0x02,0x2b,0x11,0x04,0x31,0xd4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xfd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x08, 0x21,0x03,0x2c,0x10,0x07,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x03,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x2c,0x10,0x05,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x30,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x28,0xc0,0x00,0x00,0x40,0x30,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x32,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x44,0x02,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x07,0x06,0xa8,0x22,0x2b,0x11,0x06,0x40,0x07,0x08, 0xa8,0x22,0x2b,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x04,0xa8,0x22,0x2b,0x11,0x04,0x31,0xf0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xfe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x13,0x79,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0x98,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x41,0x00,0x06, 0x68,0x42,0x01,0x81,0x01,0x69,0x38,0x05,0x68,0x42,0x01,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x03,0x2b, 0xa8,0xca,0x2b,0x11,0x06,0x40,0x03,0x05,0xa8,0x02,0x2b,0x11,0x05,0x69,0x00,0x08, 0x68,0x02,0x2b,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x23,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x03,0x2c,0x10,0x08,0x40,0x04,0x04,0x21,0x03,0x2c,0x10,0x03,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c,0x10,0x06,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x96,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0x31,0x00,0x41,0x3b,0x04,0x68,0x42,0x01,0x51,0x00,0x41,0x36,0x07, 0x68,0x42,0x01,0x61,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x08,0xa8,0x02,0x2b,0x11,0x08,0x40,0x04,0x04, 0xa8,0x02,0x2b,0x11,0x04,0x40,0x04,0x2b,0xa8,0x02,0x2b,0x11,0x07,0x69,0x04,0x02, 0x68,0xe2,0x01,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x08, 0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x03,0x21,0x1b,0x2c,0x10,0x02,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x40,0x09,0x00,0x00,0x40,0x04,0x0a, 0x21,0x03,0x2c,0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x09, 0x21,0x03,0x2c,0x10,0x08,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x2d,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x64,0x06,0x00,0x00,0x69,0x33,0x05,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x05, 0xa8,0x22,0x2b,0x11,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x09,0xc0,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xa0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x14,0x13,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x40,0x02,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x04, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x17,0x00,0x00,0x40,0x30,0x06,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x2b, 0xa8,0x02,0x2b,0x11,0x04,0x31,0xe2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x75,0x69,0x00,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x05, 0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x07,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x82,0x00,0x00,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x08,0x04,0x00,0x00,0x40,0x03,0x0a,0x21,0x03,0x2c,0x10,0x05,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x2a,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x57,0x79,0x00,0x00,0x69,0x35,0x07,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x03,0x2b, 0xa8,0x02,0x2b,0x11,0x07,0x69,0x02,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x03,0x21,0x1b,0x2c,0x10,0x02,0x40,0x04,0x06, 0x21,0x03,0x2c,0x10,0x05,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x80,0x82,0x00,0x00,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x2a,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x29,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x24,0x2b,0x00,0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x29,0xc0,0x00,0x00,0x40,0x02,0x04, 0x21,0x1b,0x2c,0x10,0x02,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x29,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x6c,0x06,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x01,0xc0,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0b,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x40,0x06,0x06,0x21,0x03,0x2c,0x10,0x05,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x39,0x00,0x00,0x40,0x02,0x07, 0x21,0x1b,0x2c,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x28,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00, 0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x09,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00, 0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x27,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x96,0xfe,0x00,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0b,0x05,0x46,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x47,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x48,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x17,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1b,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x4c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x84,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x0f,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x13,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1b,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x23,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x27,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x00,0x03,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xfe,0xff,0x00,0x00,0x61,0x30,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x5a,0x01,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x01, 0x68,0x90,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x05,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x9e,0x7d,0x00,0x00,0x69,0x30,0x06,0x68,0x42,0x01,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x21,0x82,0x00,0x00,0x41,0x36,0x09, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x40,0x06,0x09,0xa8,0x02,0x2b,0x11,0x09,0x31,0xec,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x03,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x06,0x02,0x68,0xe2,0x01,0x21,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05, 0x21,0x03,0x2c,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x2c,0x10,0x07,0x40,0x05,0x0a, 0x21,0x03,0x2c,0x10,0x03,0x40,0x05,0x04,0x21,0x1b,0x2c,0x10,0x02,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x24,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x2b, 0xa8,0x1a,0x2b,0x11,0x02,0x69,0x01,0x03,0x68,0x02,0x2b,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x04,0x21,0x03,0x2c,0x10,0x03,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x23,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x9e,0x7d,0x00,0x00,0x69,0x30,0x06, 0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06,0xa8,0x02,0x2b,0x11,0x06,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x21,0x82,0x00,0x00,0x41,0x36,0x09, 0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x03, 0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x09,0xa8,0x02,0x2b,0x11,0x09,0x69,0x06,0x02, 0x68,0xe2,0x01,0x21,0x00,0x40,0x06,0x05,0x21,0x03,0x2c,0x10,0x04,0x40,0x06,0x08, 0x21,0x03,0x2c,0x10,0x07,0x31,0xe8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x40,0x03,0x04,0x21,0x1b,0x2c,0x10,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x41,0x3a,0x05, 0x68,0x42,0x01,0x51,0x00,0x41,0x39,0x08,0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x03,0x40,0x04,0x05, 0xa8,0x02,0x2b,0x11,0x05,0x40,0x04,0x08,0xa8,0x02,0x2b,0x11,0x08,0x40,0x04,0x2b, 0xa8,0x1a,0x2b,0x11,0x02,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xf6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x69,0x03,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x03,0x03, 0x68,0x02,0x08,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04, 0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x03,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x2c,0x10,0x04,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x22,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x9e,0x7d,0x00,0x00,0x69,0x30,0x06,0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x21,0x82,0x00,0x00,0x69,0x02,0x04,0x68,0x7a,0x02,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x03, 0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x41,0x00,0x09,0x68,0x42,0x01,0x31,0x00,0x40,0x05,0x05, 0x21,0x03,0x2c,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x2c,0x10,0x07,0x31,0xdf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x03,0x09, 0xa8,0x02,0x2b,0x11,0x09,0x41,0x31,0x05,0x68,0x42,0x01,0x51,0x00,0x41,0x3c,0x08, 0x68,0x42,0x01,0x61,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x09,0x21,0x00,0x40,0x04,0x05,0xa8,0x02,0x2b,0x11,0x05,0x40,0x04,0x2b, 0xa8,0x02,0x2b,0x11,0x08,0x69,0x04,0x02,0x68,0xe2,0x01,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x03,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x03,0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x04, 0x21,0x1b,0x2c,0x10,0x02,0x40,0x03,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x03,0x31,0xe0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x20,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x9e,0x7d,0x00,0x00,0x69,0x30,0x06,0x68,0x42,0x01,0x11,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x02,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x21,0x82,0x00,0x00,0x69,0x02,0x04,0x68,0x7a,0x02,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x03, 0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x03,0x00,0x03,0x00,0x40,0x05,0x05,0x21,0x03,0x2c,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x2c,0x10,0x07,0x31,0xd3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x1f,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x2b,0xa8,0x1a,0x2b,0x11,0x02,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x01,0x03,0x68,0x02,0x2b,0x21,0x00,0x40,0x01,0x04, 0x21,0x03,0x2c,0x10,0x03,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x1f,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x1e,0x00,0x00,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x1e,0x00,0x00,0x40,0x00,0x2b, 0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x69,0x02,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xaf,0xdf,0x00,0x00,0x40,0x02,0x04,0x21,0x1b,0x2c,0x10,0x02,0x31,0xc6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x1e,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x60,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x96,0xfe,0x00,0x00,0x68,0x20,0x04, 0x00,0x10,0x01,0x05,0x0b,0x05,0x46,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x0f,0x05,0x47,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04, 0x00,0x10,0x01,0x05,0x13,0x05,0x48,0x58,0x01,0xa4,0x01,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x17,0x05,0x49,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1b,0x05,0x4a,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x1f,0x05,0x4b,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x38,0x04,0x00,0x10,0x01,0x05,0x23,0x05,0x4c,0x58, 0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x27,0x05,0x4d,0x58, 0x01,0xa4,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x04,0x06,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04, 0x00,0x10,0x01,0x05,0x0c,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04, 0x00,0x10,0x01,0x05,0x10,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x30,0x04, 0x00,0x10,0x01,0x05,0x14,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x18,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x28,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x84,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x14,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1c,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x24,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x20,0x03,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xfe,0xff,0x00,0x00,0x61,0x30,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x84,0x01,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x5a,0x01,0x11,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x01, 0x68,0x90,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x0c,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x84,0x54,0x00,0x00,0x69,0x30,0x06,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08, 0x68,0x42,0x01,0xc1,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x29,0x02,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x06,0x06,0xa8,0x22,0x2b,0x11,0x06,0x40,0x06,0x08, 0xa8,0x22,0x2b,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x06,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x80,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x12,0x29,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xcd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x9c,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x00,0x69,0x3f,0x07,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x06,0x07, 0xa8,0x02,0x2b,0x11,0x07,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x2b,0xa8,0x1a,0x2b,0x11,0x01,0x31,0xe0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x06, 0x21,0x03,0x2c,0x10,0x05,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x03,0x2c,0x10,0x08,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xfc,0xcf,0x00,0x00,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x03,0x40,0x04,0x05, 0x21,0x03,0x2c,0x10,0x04,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x18,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x04,0x04, 0x68,0x02,0x2b,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x40,0x00,0x06, 0xa8,0x2a,0x2b,0x11,0x01,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x03,0x2c,0x10,0x04,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03, 0x68,0x7a,0x02,0x21,0x00,0x41,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x05,0x04, 0xa8,0x02,0x2b,0x11,0x04,0x40,0x05,0x2b,0xa8,0x1a,0x2b,0x11,0x02,0x31,0xfa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x2c,0x10,0x03,0x69,0x06,0x06, 0x68,0x7a,0x01,0x21,0x00,0x40,0x05,0x08,0x21,0x03,0x2c,0x10,0x07,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x05,0x03, 0x68,0x02,0x2b,0x21,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x2c,0x10,0x06,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xfc,0x4a,0x00,0x00,0x40,0x03,0x0a, 0x21,0x03,0x2c,0x10,0x05,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x03,0x31,0xfb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x16,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x16,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x84,0x54,0x00,0x00,0x69,0x30,0x06, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x29,0x02,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x40,0x04,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x40,0x80,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x08,0xa8,0x22,0x2b,0x11,0x08,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x29,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x06,0x04,0xa8,0x22,0x2b,0x11,0x04,0x40,0x06,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x01,0x31,0x4d,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0x4f,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xf1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x2b,0xa8,0xca,0x2b,0x11,0x08,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x31,0xfc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xe0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xce,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xb2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05, 0x68,0x02,0x04,0x21,0x00,0x69,0x32,0x07,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xd5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x27,0x00,0x00,0x69,0x06,0x04, 0x68,0x7a,0x01,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x07, 0xa8,0x02,0x2b,0x11,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x40,0x05,0x05,0x21,0x03,0x2c,0x10,0x04,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x03, 0x68,0x7a,0x02,0x21,0x00,0x41,0x38,0x06,0x68,0x42,0x01,0x51,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x71,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x06,0x00,0x06,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x03,0x2c,0x10,0x08,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x04,0x01,0x00,0x00,0x40,0x05,0x0a,0x21,0x03,0x2c,0x10,0x03,0x40,0x05,0x06, 0xa8,0x02,0x2b,0x11,0x06,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x06,0x2b,0xa8,0x02,0x2b,0x11,0x04,0x31,0xda,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xfb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x03,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x08, 0x21,0x03,0x2c,0x10,0x07,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09, 0x21,0x03,0x2c,0x10,0x03,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a, 0x21,0x03,0x2c,0x10,0x05,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x24,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x12,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xa8,0xd2,0x00,0x00,0x40,0x30,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x32,0x06, 0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x45,0x00,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x04, 0x68,0x42,0x01,0x41,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x07,0x06,0xa8,0x22,0x2b,0x11,0x06,0x40,0x07,0x08, 0xa8,0x22,0x2b,0x11,0x08,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x04,0xa8,0x22,0x2b,0x11,0x04,0x31,0xfd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xff,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0xa9,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xc1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xbc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xa0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0x9e,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0x81,0x01,0x69,0x3e,0x05, 0x68,0x42,0x01,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x03,0x2b,0xa8,0xca,0x2b,0x11,0x06,0x40,0x03,0x05, 0xa8,0x02,0x2b,0x11,0x05,0x69,0x00,0x08,0x68,0x02,0x2b,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x31,0xa2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x40,0x04,0x04, 0x21,0x03,0x2c,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x2c,0x10,0x06,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x41,0x38,0x04, 0x68,0x42,0x01,0x51,0x00,0x41,0x33,0x07,0x68,0x42,0x01,0x61,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x08, 0xa8,0x02,0x2b,0x11,0x08,0x40,0x04,0x04,0xa8,0x02,0x2b,0x11,0x04,0x40,0x04,0x2b, 0xa8,0x02,0x2b,0x11,0x07,0x69,0x04,0x02,0x68,0xe2,0x01,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x05, 0x68,0x02,0x04,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x03, 0x21,0x1b,0x2c,0x10,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x08,0x41,0x00,0x00,0x40,0x04,0x0a,0x21,0x03,0x2c,0x10,0x09,0x40,0x04,0x06, 0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x96,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0f,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x65,0xd6,0x00,0x00,0x69,0x33,0x05, 0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x05,0xa8,0x22,0x2b,0x11,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x88,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0x9d,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x01,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x41,0x00,0x04, 0x68,0x42,0x01,0x31,0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x40,0x3d,0x06,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x05,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x2b, 0xa8,0x02,0x2b,0x11,0x04,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x67,0xff,0x00,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x05,0x68,0x02,0x2b,0x21,0x00,0x40,0x03,0x08, 0x21,0x03,0x2c,0x10,0x07,0x40,0x03,0x09,0x21,0x03,0x2c,0x10,0x03,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x2c,0x10,0x05,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0d,0x00,0x00,0x40,0x00,0x2b, 0x68,0x02,0x2b,0x81,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x57,0xff,0x00,0x00,0x69,0x35,0x07,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x02, 0x68,0x9a,0x2b,0x21,0x00,0x40,0x37,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x03,0x2b, 0xa8,0x02,0x2b,0x11,0x07,0x69,0x02,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x03,0x21,0x1b,0x2c,0x10,0x02,0x40,0x04,0x06, 0x21,0x03,0x2c,0x10,0x05,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xa0,0x00,0x00,0x00,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0c,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0c,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x24,0x2b,0x00,0x05,0x20,0x00,0x20,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xa9,0xd2,0x00,0x00,0x40,0x02,0x04, 0x21,0x1b,0x2c,0x10,0x02,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x0b,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x6d,0xd6,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x9a,0x2b,0x21,0x00,0x31,0xb9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x06,0x06, 0x21,0x03,0x2c,0x10,0x05,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x12,0x2b,0x00,0x00,0x40,0x02,0x07,0x21,0x1b,0x2c,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x61,0x36,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x03,0x68,0x02,0x45,0x01,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x21,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5e,0xff,0x00,0x00,0x31,0xa7,0x03, 0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x37,0x03, 0x68,0x02,0x45,0x01,0x04,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x48,0x01,0x00,0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05,0x38,0x05,0x46,0x58, 0x01,0xa4,0x01,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x05,0x0c,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x3d,0x03,0x68,0x02,0x45,0x01,0x06,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x04,0x04,0x00,0x00,0x68,0x21,0x04, 0x00,0x10,0x01,0x05,0x34,0x05,0x47,0x58,0x01,0xa4,0x01,0x00,0x00,0x31,0xaf,0x03, 0x80,0x00,0x00,0x05,0x14,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x30,0x05,0x48,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2c,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x24,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x20,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1c,0x05,0x4c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x3c,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x27,0x04, 0x00,0x10,0x01,0x05,0x39,0x05,0x04,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x35,0x05,0x05,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x31,0x05,0x06,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2d,0x05,0x07,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x25,0x05,0x08,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x21,0x05,0x09,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1d,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x3d,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x2d,0x04, 0x00,0x10,0x01,0x05,0x3a,0x05,0x0c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x36,0x05,0x0d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x32,0x05,0x0e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2e,0x05,0x0f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x26,0x05,0x10,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x22,0x05,0x11,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1e,0x05,0x12,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x3e,0x05,0x13,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x2f,0x04, 0x00,0x10,0x01,0x05,0x3b,0x05,0x14,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x37,0x05,0x15,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x33,0x05,0x16,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x2f,0x05,0x17,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x27,0x05,0x18,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x23,0x05,0x19,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x1f,0x05,0x1a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04, 0x00,0x10,0x01,0x05,0x3f,0x05,0x1b,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x05,0x00,0x00,0x70,0x00,0x40, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x40, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xac,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0xc1,0x00,0x69,0x3c,0x03,0x68,0x42,0x01,0x41,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x40,0x04,0x03,0xa8,0x22,0x2b,0x11,0x03,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xde,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xc0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x2c,0x00,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x24,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x68,0x01,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x93,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x05,0x06,0xa8,0x22,0x2b,0x11,0x06,0x31,0xc4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xb5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x34,0x03, 0x68,0x42,0x01,0x41,0x00,0x41,0x35,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x06, 0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x03,0xa8,0x22,0x2b,0x11,0x03,0x40,0x04,0x04, 0xa8,0x22,0x2b,0x11,0x04,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x40,0x04,0x2b,0xa8,0xca,0x2b,0x11,0x06,0x31,0xf6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x47,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x24,0x2c,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x24,0x20,0x00,0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x3c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x38,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x34,0x00,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3d,0x03, 0x68,0x42,0x01,0x41,0x00,0x41,0x3f,0x04,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x40,0x05,0x06, 0xa8,0x22,0x2b,0x11,0x06,0x40,0x04,0x03,0xa8,0x22,0x2b,0x11,0x03,0x40,0x04,0x04, 0xa8,0x22,0x2b,0x11,0x04,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x02,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x24,0x30,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xce,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x2c,0x00,0x00,0x31,0xb0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xa1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0x92,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xb4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xa5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x02,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x31,0x97,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x38,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x38,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x34,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0x01,0x03, 0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01,0x00, 0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00, 0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01,0x01, 0x00,0x60,0x86,0x85,0x02,0x05,0x46,0x22,0x05,0x1f,0x00,0x1f,0x00,0x61,0x00,0x04, 0xa8,0x60,0x00,0xc1,0xb4,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x46,0xa4,0x02,0x00, 0x06,0x24,0x46,0x00,0x00,0x40,0x00,0x46,0xa8,0x5a,0x02,0x11,0x46,0x67,0x02,0x00, 0x00,0x60,0x06,0x25,0x46,0x24,0x46,0x00,0x06,0xa4,0x02,0x00,0x00,0x67,0x02,0x46, 0xa8,0x0a,0x46,0x11,0x02,0x61,0x02,0x00,0x00,0xa0,0x02,0xc5,0x02,0x24,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x03,0x68,0x66,0x46,0x11,0x00,0x38,0xaa,0x00, 0x00,0xa0,0x0a,0x45,0x04,0xc4,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x5b,0xfa,0x00, 0x00,0xa0,0x02,0x44,0x04,0x44,0x04,0x02,0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00, 0x00,0x60,0x0a,0x65,0x02,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0x60,0x0a,0x45,0x03,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00, 0x00,0xa0,0x0a,0x05,0x05,0x44,0x04,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x46,0x00,0x06,0x64,0x02,0x00,0x02,0x40,0x03,0x00, 0x00,0x60,0x06,0x45,0x03,0x04,0x46,0x00,0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06, 0xe8,0x05,0x05,0x11,0x00,0x61,0x03,0x03,0x68,0x7e,0x02,0x11,0x00,0x61,0x03,0x04, 0x68,0x46,0x03,0x11,0x00,0x61,0x03,0x06,0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x00, 0x00,0x60,0x06,0xa5,0x02,0xa4,0x02,0x00,0x06,0x84,0x02,0x00,0x00,0x5b,0x02,0x00, 0x00,0xa0,0x02,0xc4,0x02,0x24,0x03,0x82,0x02,0x24,0x06,0xc4,0x02,0x5b,0x04,0x00, 0x00,0xa0,0x02,0x04,0x03,0x04,0x04,0x82,0x02,0x24,0x06,0x04,0x03,0x61,0x00,0x00, 0x80,0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x02,0x00, 0x00,0xa0,0x0a,0xc5,0x02,0xc4,0x02,0x00,0x0a,0x04,0x03,0x00,0x00,0x41,0x01,0x00, 0x00,0xa0,0x0a,0x45,0x04,0x44,0x04,0x00,0x0a,0xc4,0x02,0x00,0x00,0x61,0x01,0x07, 0xe8,0x45,0x04,0x11,0x00,0x40,0x01,0x07,0xa8,0x02,0x07,0x11,0x06,0x41,0x01,0x20, 0x22,0x16,0x07,0x11,0x46,0x49,0x00,0x08,0xa8,0x12,0x07,0x11,0x46,0x40,0x07,0x07, 0xa8,0x32,0x07,0x11,0x02,0x40,0x02,0x46,0xa8,0x02,0x46,0x31,0x08,0x70,0x01,0x00, 0x00,0x20,0x02,0x01,0x00,0x04,0x46,0x00,0x42,0x24,0x46,0x00,0x00,0x62,0x07,0x00, 0x01,0x60,0x85,0x25,0x07,0x04,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x07, 0xa8,0x12,0x07,0x11,0x07,0x67,0x01,0x46,0xa8,0x32,0x07,0x11,0x02,0x65,0x01,0x00, 0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x04, 0x00,0x00,0x00,0x00,0x00,0x84,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00, 0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f,0x77, 0x72,0x69,0x74,0x65,0x5f,0x4e,0x56,0x31,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30, 0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73, 0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72, 0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67, 0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00, 0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33, 0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30, 0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00, 0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34, 0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30, 0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00, 0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35, 0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30, 0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00, 0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36, 0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30, 0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00, 0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36, 0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30, 0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00, 0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37, 0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30, 0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00, 0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38, 0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30, 0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00, 0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39, 0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30, 0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00, 0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30, 0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30, 0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00, 0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30, 0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30, 0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00, 0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31, 0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30, 0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00, 0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32, 0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30, 0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00, 0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33, 0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30, 0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00, 0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34, 0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30, 0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00, 0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34, 0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30, 0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00, 0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35, 0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30, 0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00, 0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36, 0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30, 0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00, 0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37, 0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30, 0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00, 0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38, 0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30, 0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00, 0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38, 0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30, 0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00, 0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39, 0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30, 0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00, 0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30, 0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30, 0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00, 0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31, 0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30, 0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00, 0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32, 0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30, 0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00, 0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32, 0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30, 0x32,0x33,0x31,0x00,0x41,0x30,0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00, 0x41,0x30,0x33,0x00,0x41,0x30,0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00, 0x41,0x30,0x37,0x00,0x41,0x30,0x38,0x00,0x41,0x30,0x39,0x00,0x41,0x31,0x30,0x00, 0x41,0x31,0x31,0x00,0x41,0x31,0x32,0x00,0x41,0x31,0x33,0x00,0x41,0x31,0x34,0x00, 0x41,0x31,0x35,0x00,0x41,0x31,0x36,0x00,0x41,0x31,0x37,0x00,0x41,0x31,0x38,0x00, 0x41,0x31,0x39,0x00,0x41,0x32,0x30,0x00,0x41,0x32,0x31,0x00,0x41,0x32,0x32,0x00, 0x41,0x32,0x33,0x00,0x41,0x32,0x34,0x00,0x41,0x32,0x35,0x00,0x41,0x32,0x36,0x00, 0x41,0x32,0x37,0x00,0x41,0x32,0x38,0x00,0x41,0x32,0x39,0x00,0x41,0x33,0x30,0x00, 0x41,0x33,0x31,0x00,0x41,0x33,0x32,0x00,0x41,0x33,0x33,0x00,0x41,0x33,0x34,0x00, 0x41,0x33,0x35,0x00,0x41,0x33,0x36,0x00,0x41,0x33,0x37,0x00,0x41,0x33,0x38,0x00, 0x41,0x33,0x39,0x00,0x41,0x34,0x30,0x00,0x41,0x34,0x31,0x00,0x41,0x34,0x32,0x00, 0x41,0x34,0x33,0x00,0x41,0x34,0x34,0x00,0x41,0x34,0x35,0x00,0x41,0x34,0x36,0x00, 0x41,0x34,0x37,0x00,0x41,0x34,0x38,0x00,0x41,0x34,0x39,0x00,0x41,0x35,0x30,0x00, 0x41,0x35,0x31,0x00,0x41,0x35,0x32,0x00,0x41,0x35,0x33,0x00,0x41,0x35,0x34,0x00, 0x41,0x35,0x35,0x00,0x41,0x35,0x36,0x00,0x41,0x35,0x37,0x00,0x41,0x35,0x38,0x00, 0x41,0x35,0x39,0x00,0x41,0x36,0x30,0x00,0x41,0x36,0x31,0x00,0x41,0x36,0x32,0x00, 0x41,0x36,0x33,0x00,0x41,0x36,0x34,0x00,0x41,0x36,0x35,0x00,0x41,0x36,0x36,0x00, 0x41,0x36,0x37,0x00,0x41,0x36,0x38,0x00,0x41,0x36,0x39,0x00,0x41,0x37,0x30,0x00, 0x41,0x37,0x31,0x00,0x41,0x37,0x32,0x00,0x41,0x37,0x33,0x00,0x41,0x37,0x34,0x00, 0x41,0x37,0x35,0x00,0x41,0x37,0x36,0x00,0x41,0x37,0x37,0x00,0x41,0x37,0x38,0x00, 0x41,0x37,0x39,0x00,0x50,0x30,0x31,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x4d, 0x69,0x72,0x72,0x6f,0x72,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x4e,0x56,0x31,0x32, 0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d, 0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f, 0x73,0x64,0x69,0x76,0x69,0x69,0x2e,0x34,0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00, 0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d, 0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67, 0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x44,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x55,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x64,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x74,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x84,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x85,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x94,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x95,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x20,0x01,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x20,0x01,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x20,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x20,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x20,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x20,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x20,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x20,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa4,0x00,0x00,0x00,0x51,0x08,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa5,0x00,0x00,0x00,0x52,0x10,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x54,0x00,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x52,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00, 0x00,0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00, 0x51,0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x51, 0x08,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x51,0x08, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x51,0x08,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x51,0x08,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x51,0x08,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x51,0x08,0x00,0x54,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x54,0x00,0x01,0x5c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x51,0x08,0x00,0x55,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x51,0x08,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb3,0x00,0x00,0x00,0x51,0x08,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb4,0x00,0x00,0x00,0x51,0x08,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb5,0x00,0x00,0x00,0x51,0x08,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x51,0x08,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0x51,0x08,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00, 0x00,0x51,0x08,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00, 0x54,0x00,0x01,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x51, 0x08,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x51,0x08, 0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x51,0x08,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x51,0x08,0x00,0x61, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x51,0x08,0x00,0x62,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x51,0x08,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x51,0x08,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x51,0x08,0x00,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x54,0x00,0x01,0x6e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0x51,0x08,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc4,0x00,0x00,0x00,0x51,0x08,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc5,0x00,0x00,0x00,0x51,0x08,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6, 0x00,0x00,0x00,0x51,0x08,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00, 0x00,0x00,0x51,0x08,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00, 0x00,0x51,0x08,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x51,0x08,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x20, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x20,0x01, 0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x20,0x01,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x20,0x01,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x20,0x01,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x20,0x01,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x51,0x20,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x20,0x01,0x00,0x72,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x51,0x20,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0x20,0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x51,0x20,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd5,0x00,0x00,0x00,0x20,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6, 0x00,0x00,0x00,0x51,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0x52,0x10,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00, 0x00,0x53,0x40,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00, 0x53,0x40,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x53, 0x40,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x53,0x40, 0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x20,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x20,0x01,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x20,0x01,0x00,0x92,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x20,0x01,0x00,0x90,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x01,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x20,0x01,0x00,0x98,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x00,0xe2,0x00,0x00,0x00,0x10,0x00,0x00,0xe3,0x00,0x00,0x00, 0x10,0x00,0x00,0xe4,0x00,0x00,0x00,0x10,0x00,0x00,0xe5,0x00,0x00,0x00,0x10,0x00, 0x00,0xe6,0x00,0x00,0x00,0x10,0x00,0x00,0xe7,0x00,0x00,0x00,0x10,0x00,0x00,0xe8, 0x00,0x00,0x00,0x10,0x00,0x00,0xe9,0x00,0x00,0x00,0x10,0x00,0x00,0xea,0x00,0x00, 0x00,0x10,0x00,0x00,0xeb,0x00,0x00,0x00,0x10,0x00,0x00,0xec,0x00,0x00,0x00,0x10, 0x00,0x00,0xed,0x00,0x00,0x00,0x10,0x00,0x00,0xee,0x00,0x00,0x00,0x10,0x00,0x00, 0xef,0x00,0x00,0x00,0x10,0x00,0x00,0xf0,0x00,0x00,0x00,0x10,0x00,0x00,0xf1,0x00, 0x00,0x00,0x10,0x00,0x00,0xf2,0x00,0x00,0x00,0x10,0x00,0x00,0xf3,0x00,0x00,0x00, 0x10,0x00,0x00,0xf4,0x00,0x00,0x00,0x10,0x00,0x00,0xf5,0x00,0x00,0x00,0x10,0x00, 0x00,0xf6,0x00,0x00,0x00,0x10,0x00,0x00,0xf7,0x00,0x00,0x00,0x10,0x00,0x00,0xf8, 0x00,0x00,0x00,0x10,0x00,0x00,0xf9,0x00,0x00,0x00,0x10,0x00,0x00,0xfa,0x00,0x00, 0x00,0x10,0x00,0x00,0xfb,0x00,0x00,0x00,0x10,0x00,0x00,0xfc,0x00,0x00,0x00,0x10, 0x00,0x00,0xfd,0x00,0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x00, 0xff,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x10,0x00,0x00,0x01,0x01, 0x00,0x00,0x10,0x00,0x00,0x02,0x01,0x00,0x00,0x10,0x00,0x00,0x03,0x01,0x00,0x00, 0x10,0x00,0x00,0x04,0x01,0x00,0x00,0x10,0x00,0x00,0x05,0x01,0x00,0x00,0x10,0x00, 0x00,0x06,0x01,0x00,0x00,0x10,0x00,0x00,0x07,0x01,0x00,0x00,0x10,0x00,0x00,0x08, 0x01,0x00,0x00,0x10,0x00,0x00,0x09,0x01,0x00,0x00,0x10,0x00,0x00,0x0a,0x01,0x00, 0x00,0x10,0x00,0x00,0x0b,0x01,0x00,0x00,0x10,0x00,0x00,0x0c,0x01,0x00,0x00,0x10, 0x00,0x00,0x0d,0x01,0x00,0x00,0x10,0x00,0x00,0x0e,0x01,0x00,0x00,0x10,0x00,0x00, 0x0f,0x01,0x00,0x00,0x10,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x00,0x00,0x11,0x01, 0x00,0x00,0x10,0x00,0x00,0x12,0x01,0x00,0x00,0x10,0x00,0x00,0x13,0x01,0x00,0x00, 0x10,0x00,0x00,0x14,0x01,0x00,0x00,0x10,0x00,0x00,0x15,0x01,0x00,0x00,0x10,0x00, 0x00,0x16,0x01,0x00,0x00,0x10,0x00,0x00,0x17,0x01,0x00,0x00,0x10,0x00,0x00,0x18, 0x01,0x00,0x00,0x10,0x00,0x00,0x19,0x01,0x00,0x00,0x10,0x00,0x00,0x1a,0x01,0x00, 0x00,0x10,0x00,0x00,0x1b,0x01,0x00,0x00,0x10,0x00,0x00,0x1c,0x01,0x00,0x00,0x10, 0x00,0x00,0x1d,0x01,0x00,0x00,0x10,0x00,0x00,0x1e,0x01,0x00,0x00,0x10,0x00,0x00, 0x1f,0x01,0x00,0x00,0x10,0x00,0x00,0x20,0x01,0x00,0x00,0x10,0x00,0x00,0x21,0x01, 0x00,0x00,0x10,0x00,0x00,0x22,0x01,0x00,0x00,0x10,0x00,0x00,0x23,0x01,0x00,0x00, 0x10,0x00,0x00,0x24,0x01,0x00,0x00,0x10,0x00,0x00,0x25,0x01,0x00,0x00,0x10,0x00, 0x00,0x26,0x01,0x00,0x00,0x10,0x00,0x00,0x27,0x01,0x00,0x00,0x10,0x00,0x00,0x28, 0x01,0x00,0x00,0x10,0x00,0x00,0x29,0x01,0x00,0x00,0x10,0x00,0x00,0x2a,0x01,0x00, 0x00,0x10,0x00,0x00,0x2b,0x01,0x00,0x00,0x10,0x00,0x00,0x2c,0x01,0x00,0x00,0x10, 0x00,0x00,0x2d,0x01,0x00,0x00,0x10,0x00,0x00,0x2e,0x01,0x00,0x00,0x10,0x00,0x00, 0x2f,0x01,0x00,0x00,0x10,0x00,0x00,0x30,0x01,0x00,0x00,0x10,0x00,0x00,0x31,0x01, 0x00,0x00,0x10,0x00,0x00,0x01,0x00,0x32,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x33,0x01,0x00,0x00,0x01,0x00,0x34,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x35,0x01, 0x00,0x00,0x01,0x00,0x00,0x36,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24, 0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00, 0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x23, 0x00,0x00,0x00,0x34,0x00,0x04,0x00,0xb1,0x25,0x00,0x00,0x9a,0x15,0x00,0x00,0x03, 0x00,0x37,0x01,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f, 0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x35,0x2e,0x61,0x73,0x6d,0x38,0x01,0x00,0x00, 0x00,0x39,0x01,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0, 0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x80,0xff,0xff, 0xff,0x29,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe0, 0xff,0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x3c,0x03,0x00, 0x06,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c, 0x03,0x00,0x06,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00, 0x06,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xa6,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xa7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xa8,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x67,0x45,0x23,0x01,0x01, 0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x18,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf8, 0xff,0xff,0xff,0x01,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x01, 0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xe8,0xff,0xff,0xff,0x28,0x04,0x01,0x00,0x00, 0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x00,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x01,0x00,0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x18,0x00,0x02,0x03,0x01,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x02,0x00, 0x00,0x04,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x03,0x02,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x02,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x03,0x00,0x00,0x04,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x03,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x01,0x18,0x00,0x02,0x03,0x03,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x04,0x00, 0x00,0x04,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x04,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x04,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x05,0x00,0x00,0x04,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x02,0x10,0x00,0x02,0x03,0x05,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x02,0x18,0x00,0x02,0x03,0x05,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x06,0x00, 0x00,0x04,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x03,0x06,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x06,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x07,0x00,0x00,0x04,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x03,0x10,0x00,0x02,0x03,0x07,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x03,0x18,0x00,0x02,0x03,0x07,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x08,0x00, 0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x03,0x08,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x08,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x09,0x00,0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x04,0x10,0x00,0x02,0x03,0x09,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x04,0x18,0x00,0x02,0x03,0x09,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x0a,0x00, 0x00,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x05,0x00,0x00, 0x02,0x03,0x0a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x0a,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x0b,0x00,0x00,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x05,0x10,0x00,0x02,0x03,0x0b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x05,0x18,0x00,0x02,0x03,0x0b,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x0c,0x00, 0x00,0x04,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x03,0x0c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x0c,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x0d,0x00,0x00,0x04,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x06,0x10,0x00,0x02,0x03,0x0d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x06,0x18,0x00,0x02,0x03,0x0d,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x0e,0x00, 0x00,0x04,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x03,0x0e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x0e,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x0f,0x00,0x00,0x04,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x07,0x10,0x00,0x02,0x03,0x0f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x07,0x18,0x00,0x02,0x03,0x0f,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x10,0x00, 0x00,0x04,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0x10,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x10,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x11,0x00,0x00,0x04,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x11,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x18,0x00,0x02,0x03,0x11,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x12,0x00, 0x00,0x04,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x03,0x12,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x12,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x13,0x00,0x00,0x04,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x13,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x01,0x18,0x00,0x02,0x03,0x13,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x14,0x00, 0x00,0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x14,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x14,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x15,0x00,0x00,0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x02,0x10,0x00,0x02,0x03,0x15,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x02,0x18,0x00,0x02,0x03,0x15,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x16,0x00, 0x00,0x04,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x03,0x16,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x16,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x17,0x00,0x00,0x04,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x03,0x10,0x00,0x02,0x03,0x17,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x03,0x18,0x00,0x02,0x03,0x17,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x18,0x00, 0x00,0x04,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x03,0x18,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x18,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x19,0x00,0x00,0x04,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x04,0x10,0x00,0x02,0x03,0x19,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x04,0x18,0x00,0x02,0x03,0x19,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x1a,0x00, 0x00,0x04,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x05,0x00,0x00, 0x02,0x03,0x1a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x1a,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x1b,0x00,0x00,0x04,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x05,0x10,0x00,0x02,0x03,0x1b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x05,0x18,0x00,0x02,0x03,0x1b,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x1c,0x00, 0x00,0x04,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x03,0x1c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x1c,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x1d,0x00,0x00,0x04,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x06,0x10,0x00,0x02,0x03,0x1d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x06,0x18,0x00,0x02,0x03,0x1d,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x1e,0x00, 0x00,0x04,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x03,0x1e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x1e,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x1f,0x00,0x00,0x04,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x07,0x10,0x00,0x02,0x03,0x1f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x07,0x18,0x00,0x02,0x03,0x1f,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x20,0x00, 0x00,0x04,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0x20,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x20,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x21,0x00,0x00,0x04,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x21,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x18,0x00,0x02,0x03,0x21,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x22,0x00, 0x00,0x04,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x03,0x22,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x22,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x23,0x00,0x00,0x04,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x23,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x01,0x18,0x00,0x02,0x03,0x23,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x24,0x00, 0x00,0x04,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x24,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x24,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x25,0x00,0x00,0x04,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x02,0x10,0x00,0x02,0x03,0x25,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x02,0x18,0x00,0x02,0x03,0x25,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x26,0x00, 0x00,0x04,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x03,0x26,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x26,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x27,0x00,0x00,0x04,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x03,0x10,0x00,0x02,0x03,0x27,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x03,0x18,0x00,0x02,0x03,0x27,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x28,0x00, 0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x03,0x28,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x28,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x29,0x00,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x04,0x10,0x00,0x02,0x03,0x29,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x04,0x18,0x00,0x02,0x03,0x29,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x2a,0x00, 0x00,0x04,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x05,0x00,0x00, 0x02,0x03,0x2a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x2a,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x2b,0x00,0x00,0x04,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x05,0x10,0x00,0x02,0x03,0x2b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x05,0x18,0x00,0x02,0x03,0x2b,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x2c,0x00, 0x00,0x04,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x03,0x2c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x2c,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x2d,0x00,0x00,0x04,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x06,0x10,0x00,0x02,0x03,0x2d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x06,0x18,0x00,0x02,0x03,0x2d,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x2e,0x00, 0x00,0x04,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x03,0x2e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x2e,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x2f,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x07,0x10,0x00,0x02,0x03,0x2f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x07,0x18,0x00,0x02,0x03,0x2f,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x30,0x00, 0x00,0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0x30,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x30,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x31,0x00,0x00,0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x31,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x18,0x00,0x02,0x03,0x31,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x32,0x00, 0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x03,0x32,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x32,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x33,0x00,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x33,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x01,0x18,0x00,0x02,0x03,0x33,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x34,0x00, 0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x34,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x34,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x35,0x00,0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x02,0x10,0x00,0x02,0x03,0x35,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x02,0x18,0x00,0x02,0x03,0x35,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x36,0x00, 0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x03,0x36,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x36,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x37,0x00,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x03,0x10,0x00,0x02,0x03,0x37,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x03,0x18,0x00,0x02,0x03,0x37,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x38,0x00, 0x00,0x04,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x03,0x38,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x38,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x39,0x00,0x00,0x04,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x04,0x10,0x00,0x02,0x03,0x39,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x04,0x18,0x00,0x02,0x03,0x39,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x3a,0x00, 0x00,0x04,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x05,0x00,0x00, 0x02,0x03,0x3a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x3a,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x3b,0x00,0x00,0x04,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x05,0x10,0x00,0x02,0x03,0x3b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x05,0x18,0x00,0x02,0x03,0x3b,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x3c,0x00, 0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x03,0x3c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x3c,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x3d,0x00,0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x06,0x10,0x00,0x02,0x03,0x3d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x06,0x18,0x00,0x02,0x03,0x3d,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x3e,0x00, 0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x03,0x3e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x3e,0x00,0x08,0x00,0x00,0x04,0x20,0x01, 0x28,0x04,0x01,0x3f,0x00,0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x07,0x10,0x00,0x02,0x03,0x3f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x07,0x18,0x00,0x02,0x03,0x3f,0x00,0x08, 0x00,0x00,0x04,0x20,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xd0,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38, 0x00,0x07,0x00,0x20,0x08,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00, 0xd3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60, 0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xd4,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00, 0x00,0x3c,0x03,0x00,0x06,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0xd8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xd9,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xda,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x03,0x00,0x06,0x00,0xdb,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0xdc,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x79, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x0c,0xce, 0x8a,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff, 0xff,0x28,0x04,0x01,0x40,0x00,0x00,0x04,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xde, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x40,0x00,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x40,0x00, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x41, 0x00,0x00,0x04,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x03,0x41,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0xde,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x41,0x00,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x42,0x00,0x00,0x04,0x00,0x7d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x42,0x00, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x02, 0x08,0x00,0x02,0x03,0x42,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00, 0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x28,0x04,0x01,0x43,0x00,0x00,0x04,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xde,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x43,0x00,0x00,0x00,0x00,0x03,0x20, 0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x43, 0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01, 0x44,0x00,0x00,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x03,0x44,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00, 0x00,0xdf,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x44,0x00,0x08,0x00,0x00,0x03, 0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x76,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x45,0x00,0x00,0x04,0x00, 0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x45, 0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x00,0x00,0x00, 0x01,0x08,0x00,0x02,0x03,0x45,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x28,0x04,0x01,0x46,0x00,0x00,0x04,0x00,0x82,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xdf,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x46,0x00,0x00,0x00,0x00,0x03, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03, 0x46,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0x47,0x00,0x00,0x04,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x00,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0x47,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xdf,0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x47,0x00,0x08,0x00,0x00, 0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x75,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x48,0x00,0x00,0x04, 0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03, 0x48,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x08,0x00,0x02,0x03,0x48,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04, 0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x49,0x00,0x00,0x04,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x49,0x00,0x00,0x00,0x00, 0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x49,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x4a,0x00,0x00,0x04,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x03,0x4a,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x4a,0x00,0x08,0x00, 0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x78,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x4b,0x00,0x00, 0x04,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x03,0x4b,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x4b,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29, 0x04,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x4c,0x00,0x00,0x04,0x00,0x8a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x4c,0x00,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x08,0x00, 0x02,0x03,0x4c,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x8b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x28,0x04,0x01,0x4d,0x00,0x00,0x04,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x4d,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x4d,0x00,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x4e,0x00, 0x00,0x04,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x4e,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe1, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x4e,0x00,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x4f,0x00,0x00,0x04,0x00,0x8d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x4f,0x00,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x03,0x08, 0x00,0x02,0x03,0x4f,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x38,0x00,0x07,0x01,0x20, 0x04,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x8e,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00, 0xd2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x89,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0xd3,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x84, 0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x00,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x92,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x94,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x9c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0, 0xb4,0x0c,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x93,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x98,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x99,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00, 0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x99,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xa0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x9e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0x01,0x00,0x00,0xe5,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x01,0x00, 0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x61,0x01,0x04,0x80,0x10,0x41,0x01,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x80,0x10,0x82,0xc6,0x01, 0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x06,0x4b, 0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x15,0x4b, 0xc4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x4b, 0x44,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x60,0x81,0x25,0x4b, 0x14,0x4b,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x4c, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20, 0x24,0x4b,0x00,0x01,0x44,0x01,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x4c, 0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x60,0x81,0x85,0x4b, 0x04,0x4b,0x00,0x05,0x07,0x00,0x07,0x00,0x69,0x00,0x00,0x00,0x60,0x81,0x45,0x4b, 0x14,0x4b,0x00,0x05,0x02,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x4c, 0x24,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x40,0xc4,0x4b, 0x00,0x00,0x00,0x00,0xe0,0x15,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0xc4,0x01, 0xa4,0x01,0x05,0x01,0x04,0x4b,0xe0,0xff,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x00,0x44,0x48,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x4c, 0xc4,0x01,0x00,0x06,0x84,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x02, 0x84,0x01,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x4c, 0x84,0x4c,0x00,0x06,0x04,0x4c,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x04,0x02, 0x64,0x01,0x05,0x01,0x14,0x4b,0x04,0x00,0x69,0x02,0x00,0x00,0x60,0x86,0x85,0x4c, 0x84,0x4c,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x03, 0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x40,0x02,0x00,0x00,0x60,0x86,0xe5,0x01, 0x84,0x4c,0x00,0x05,0x80,0xff,0x80,0xff,0x40,0x06,0x00,0x00,0x60,0x86,0x25,0x02, 0x24,0x02,0x00,0x06,0xe0,0xff,0xff,0x3f,0x61,0x02,0x00,0x80,0xa0,0x0a,0x45,0x04, 0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x06,0x20,0x22,0x2e,0x02,0x11,0x01, 0x31,0xa0,0x04,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x13,0xe4,0x01,0x00,0x06,0x44,0x03,0x00,0x00, 0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x02,0x24,0x02,0x00,0x06,0xc4,0x01,0x00,0x00, 0x49,0x00,0x02,0xa8,0x2a,0x02,0x11,0x01,0x69,0x00,0x00,0x00,0x60,0x86,0xc5,0x01, 0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x05,0x14, 0x04,0x13,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x09, 0xe4,0x01,0x00,0x06,0x64,0x4b,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x0e, 0xe4,0x01,0x00,0x06,0x24,0x03,0x00,0x00,0x40,0x04,0x02,0xa8,0xca,0x02,0x11,0x02, 0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x02,0xe4,0x01,0x00,0x06,0xc4,0x01,0x00,0x00, 0x61,0x31,0x03,0x00,0x50,0x44,0x05,0x13,0x00,0x00,0x00,0x00,0x67,0x45,0x23,0x01, 0x31,0xd2,0x04,0x80,0x00,0x00,0x05,0x0a,0x04,0x09,0x00,0xa0,0x00,0x00,0x00,0x00, 0x31,0xc3,0x04,0x80,0x00,0x00,0x05,0x0f,0x04,0x0e,0x00,0xa0,0x00,0x00,0x00,0x00, 0x31,0xa4,0x04,0x80,0x00,0x00,0x05,0x18,0x04,0x02,0x00,0xa0,0x00,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x03,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00, 0x69,0x00,0x03,0x68,0x22,0x02,0x21,0x00,0x41,0x32,0x09,0x68,0x42,0x01,0x81,0x01, 0x41,0x33,0x0e,0x68,0x42,0x01,0xc1,0x01,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x03,0x00,0x50,0x85,0x05,0x02,0x05,0x13,0x46,0x05,0x18,0x00,0x18,0x00, 0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x04, 0xe4,0x01,0x00,0x06,0x64,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x20, 0xe4,0x01,0x00,0x06,0x04,0x09,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x25, 0xe4,0x01,0x00,0x06,0x04,0x0e,0x00,0x00,0x61,0x04,0x03,0x00,0x90,0x09,0x05,0x2a, 0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x50,0x85,0x85,0x2a, 0x05,0x02,0x46,0x05,0xf8,0xff,0xf8,0xff,0x31,0xd5,0x04,0x80,0x00,0x00,0x05,0x1c, 0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x05,0x21, 0x04,0x20,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x05,0x26, 0x04,0x25,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xa0,0x09,0xa0,0x09,0x40,0x35,0x03,0x00,0x50,0x85,0x05,0x04, 0x05,0x02,0x46,0x05,0xf0,0xff,0xf0,0xff,0x40,0x00,0x03,0x00,0x50,0x85,0x85,0x04, 0x05,0x02,0x46,0x05,0xe8,0xff,0xe8,0xff,0x61,0x20,0x4d,0x61,0x00,0x05,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x04,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xa0,0x09,0xa0,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0xc0,0x09,0xc0,0x09, 0x61,0x22,0x4e,0x61,0x00,0x0a,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0xc0,0x09,0xc0,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xe0,0x09,0xe0,0x09,0x61,0x23,0x4f,0x61,0x00,0x0f,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xe0,0x09,0xe0,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x00,0x0a,0x00,0x0a, 0x61,0x21,0x50,0x61,0x00,0x14,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x00,0x0a,0x00,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x20,0x0a,0x20,0x0a,0x61,0x24,0x51,0x61,0x00,0x18,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x20,0x0a,0x20,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x40,0x0a,0x40,0x0a, 0x61,0x25,0x52,0x61,0x00,0x1c,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x30, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x30, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x40,0x0a,0x40,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x30, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x30, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x60,0x0a,0x60,0x0a,0x61,0x26,0x53,0x61,0x00,0x21,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x31,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x31,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x60,0x0a,0x60,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x31,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x31,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x80,0x0a,0x80,0x0a, 0x61,0x27,0x54,0x61,0x00,0x26,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x32, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x32, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x80,0x0a,0x80,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x32, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x32, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xa0,0x0a,0xa0,0x0a,0x61,0x00,0x55,0x61,0x00,0x06,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xa0,0x0a,0xa0,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0xc0,0x0a,0xc0,0x0a, 0x61,0x00,0x56,0x61,0x00,0x0b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x34, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x34, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0xc0,0x0a,0xc0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x34, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x34, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x57,0x61,0x00,0x10,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x35,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x35,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x35,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x35,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x00,0x0b,0x00,0x0b, 0x61,0x00,0x58,0x61,0x00,0x15,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x36, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x36, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x00,0x0b,0x00,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x36, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x36, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x20,0x0b,0x20,0x0b,0x61,0x00,0x59,0x61,0x00,0x19,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x20,0x0b,0x20,0x0b, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x40,0x0b,0x40,0x0b, 0x61,0x00,0x5a,0x61,0x00,0x1d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x38, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x38, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x40,0x0b,0x40,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x38, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x38, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x60,0x0b,0x60,0x0b,0x61,0x00,0x5b,0x61,0x00,0x22,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x60,0x0b,0x60,0x0b, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x80,0x0b,0x80,0x0b, 0x61,0x00,0x5c,0x61,0x00,0x27,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x80,0x0b,0x80,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xa0,0x0b,0xa0,0x0b,0x61,0x00,0x5d,0x61,0x00,0x07,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xa0,0x0b,0xa0,0x0b, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0xc0,0x0b,0xc0,0x0b, 0x61,0x00,0x5e,0x61,0x00,0x0c,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0xc0,0x0b,0xc0,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xe0,0x0b,0xe0,0x0b,0x61,0x00,0x5f,0x61,0x00,0x11,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xe0,0x0b,0xe0,0x0b, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x00,0x0c,0x00,0x0c, 0x61,0x00,0x60,0x61,0x00,0x16,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x00,0x0c,0x00,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x20,0x0c,0x20,0x0c,0x61,0x00,0x61,0x61,0x00,0x1a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x20,0x0c,0x20,0x0c, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x40,0x0c,0x40,0x0c, 0x61,0x00,0x62,0x61,0x00,0x1e,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x40, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x40, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x40,0x0c,0x40,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x40, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x40, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x60,0x0c,0x60,0x0c,0x61,0x00,0x63,0x61,0x00,0x23,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x60,0x0c,0x60,0x0c, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x80,0x0c,0x80,0x0c, 0x61,0x00,0x64,0x61,0x00,0x28,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x42, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x42, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x80,0x0c,0x80,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x42, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x42, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xa0,0x0c,0xa0,0x0c,0x61,0x00,0x65,0x61,0x00,0x08,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xa0,0x0c,0xa0,0x0c, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0xc0,0x0c,0xc0,0x0c, 0x61,0x00,0x66,0x61,0x00,0x0d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x44, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x44, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0xc0,0x0c,0xc0,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x44, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x44, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0xe0,0x0c,0xe0,0x0c,0x61,0x00,0x67,0x61,0x00,0x12,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x45,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x45,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0xe0,0x0c,0xe0,0x0c, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x45,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x45,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x00,0x0d,0x00,0x0d, 0x61,0x00,0x68,0x61,0x00,0x17,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x46, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x46, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x00,0x0d,0x00,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x46, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x46, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x20,0x0d,0x20,0x0d,0x61,0x00,0x69,0x61,0x00,0x1b,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x47,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x47,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x20,0x0d,0x20,0x0d, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x47,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x47,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x40,0x0d,0x40,0x0d, 0x61,0x00,0x6a,0x61,0x00,0x1f,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x48, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x48, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x40,0x0d,0x40,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x48, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x48, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x2a,0x58,0x01,0x60,0x0d,0x60,0x0d,0x61,0x00,0x6b,0x61,0x00,0x24,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x49,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x49,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x04,0x58,0x01,0x60,0x0d,0x60,0x0d, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x49,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x49,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2a,0x58,0x01,0x80,0x0d,0x80,0x0d, 0x61,0x00,0x6c,0x61,0x00,0x29,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x04,0x58,0x01,0x80,0x0d,0x80,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x10,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x01,0x84,0x4b,0x00,0x05,0x20,0x00,0x20,0x00, 0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00, 0x61,0x00,0x02,0x62,0x58,0x4b,0x11,0x00,0x61,0x00,0x02,0x62,0xc8,0x4b,0x11,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x84,0x4b,0x00,0x05,0x40,0x00,0x40,0x00, 0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x43,0x00,0x00, 0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x05,0x02,0x62,0x68,0x01,0x11,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02, 0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x03,0x84,0x4b,0x00,0x05,0x60,0x00,0x60,0x00, 0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x3b,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x04,0x02,0x62,0x80,0x01,0x11,0x00,0x61,0x00,0x04,0x62,0x38,0x03,0x11,0x00, 0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x33,0x00,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x02,0x62,0x78,0x03,0x11,0x00, 0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x18,0x00,0x00,0x00,0x00,0xce,0x8a,0x46,0x02, 0x31,0xab,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x2b,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x44,0x48,0x02, 0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x19,0x05,0x18,0x46,0x05,0x10,0x00,0x10,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x09,0x04,0x03,0x00,0x06,0x64,0x4b,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x0e,0x04,0x03,0x00,0x06,0x24,0x03,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x13,0x04,0x03,0x00,0x06,0x44,0x03,0x00,0x00, 0x40,0x04,0x03,0x00,0x50,0x85,0x85,0x19,0x05,0x19,0x46,0x05,0xf0,0xff,0xf0,0xff, 0x31,0xfc,0x04,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00, 0x31,0xcd,0x04,0x80,0x00,0x00,0x05,0x0a,0x04,0x09,0x00,0xa0,0x00,0x00,0x00,0x00, 0x31,0xbe,0x04,0x80,0x00,0x00,0x05,0x0f,0x04,0x0e,0x00,0xa0,0x00,0x00,0x00,0x00, 0x31,0xaf,0x04,0x80,0x00,0x00,0x05,0x14,0x04,0x13,0x00,0xa0,0x00,0x00,0x00,0x00, 0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xa0,0x0d,0xa0,0x0d, 0x61,0x2c,0x04,0x00,0x90,0x09,0x05,0x6d,0x05,0x05,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xc0,0x0d,0xc0,0x0d, 0x61,0x2d,0x04,0x00,0x90,0x09,0x05,0x6e,0x05,0x0a,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xe0,0x0d,0xe0,0x0d, 0x61,0x2e,0x04,0x00,0x90,0x09,0x05,0x6f,0x05,0x0f,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x00,0x0e,0x00,0x0e, 0x61,0x2f,0x04,0x00,0x90,0x09,0x05,0x70,0x05,0x14,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x20,0x0e,0x20,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x71,0x05,0x06,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1e,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1e,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x40,0x0e,0x40,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x72,0x05,0x0b,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x60,0x0e,0x60,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x73,0x05,0x10,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x20,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x20,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x80,0x0e,0x80,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x74,0x05,0x15,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x21,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x21,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xa0,0x0e,0xa0,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x75,0x05,0x07,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x22,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x22,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xc0,0x0e,0xc0,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x76,0x05,0x0c,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x23,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x23,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0xe0,0x0e,0xe0,0x0e, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x77,0x05,0x11,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x24,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x24,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x00,0x0f,0x00,0x0f, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x78,0x05,0x16,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x25,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x25,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x20,0x0f,0x20,0x0f, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x79,0x05,0x08,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x26,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x26,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x40,0x0f,0x40,0x0f, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7a,0x05,0x0d,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x27,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x27,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x60,0x0f,0x60,0x0f, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7b,0x05,0x12,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x28,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x28,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x19,0x58,0x01,0x80,0x0f,0x80,0x0f, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7c,0x05,0x17,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x29,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x29,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x3b,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00, 0x61,0x00,0x02,0x62,0x58,0x4b,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02, 0x44,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00, 0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x24,0x26,0x00,0x00, 0x61,0x30,0x02,0x62,0x68,0x01,0x11,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xc0,0x24,0x22,0x00,0x00,0x61,0x31,0x02,0x62,0x80,0x01,0x11,0x00, 0x31,0x92,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x24,0x1e,0x00,0x00, 0x61,0x32,0x02,0x62,0x78,0x03,0x11,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xc0,0x24,0x1a,0x00,0x00,0x31,0x04,0x03,0x80,0x04,0x00,0x00,0x00, 0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80, 0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80, 0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01,0x01,0x00,0x60,0x86,0x05,0x02, 0x85,0x4c,0x22,0x05,0x1f,0x00,0x1f,0x00,0x61,0x00,0x03,0xa8,0x60,0x00,0xc1,0xb4, 0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x4c,0x24,0x02,0x00,0x06,0xa4,0x4c,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x4c,0x04,0x02,0x00,0x06,0x84,0x4c,0x00,0x00, 0x67,0x02,0x00,0x00,0x60,0x06,0xa5,0x4c,0xa4,0x4c,0x00,0x06,0x24,0x02,0x00,0x00, 0x67,0x02,0x00,0x00,0x60,0x06,0x85,0x4c,0x84,0x4c,0x00,0x06,0x04,0x02,0x00,0x00, 0x61,0x02,0x00,0x00,0xa0,0x02,0xc5,0x01,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x02,0x00,0x00,0xa0,0x02,0x65,0x02,0x84,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0xa4,0x00,0x00,0xa0,0x0a,0x45,0x03,0xc4,0x01,0x00,0x10,0x00,0x00,0x00,0x00, 0x5b,0xf4,0x00,0x00,0xa0,0x02,0x44,0x03,0x44,0x03,0x02,0x02,0x24,0x03,0x44,0x03, 0x61,0x00,0x00,0x00,0x60,0x0a,0xe5,0x01,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x03,0x00,0x00,0x60,0x0a,0x85,0x02,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x41,0x03,0x00,0x00,0xa0,0x0a,0x05,0x04,0x44,0x03,0x00,0x0a,0x64,0x02,0x00,0x00, 0x40,0x03,0x00,0x00,0x60,0x06,0xe5,0x01,0xa4,0x4c,0x00,0x06,0xe4,0x01,0x00,0x02, 0x40,0x03,0x00,0x00,0x60,0x06,0x85,0x02,0x84,0x4c,0x00,0x06,0x84,0x02,0x00,0x02, 0x61,0x03,0x05,0xe8,0x05,0x04,0x11,0x00,0x61,0x03,0x00,0x00,0xa0,0x02,0x45,0x02, 0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x03,0x68,0x5e,0x02,0x11,0x00, 0x61,0x03,0x05,0x68,0x66,0x05,0x11,0x00,0x67,0x00,0x02,0xa8,0xca,0x02,0x11,0x02, 0x5b,0x02,0x00,0x00,0xa0,0x02,0xc4,0x01,0x64,0x02,0x82,0x02,0x24,0x05,0xc4,0x01, 0x5b,0x04,0x00,0x00,0xa0,0x02,0x44,0x02,0x04,0x03,0x82,0x02,0x24,0x05,0x44,0x02, 0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, 0x40,0x02,0x00,0x00,0xa0,0x0a,0xc5,0x01,0xc4,0x01,0x00,0x0a,0x44,0x02,0x00,0x00, 0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x03,0x44,0x03,0x00,0x0a,0xc4,0x01,0x00,0x00, 0x61,0x01,0x06,0xe8,0x45,0x03,0x11,0x00,0x40,0x01,0x06,0xa8,0x02,0x06,0x11,0x05, 0x41,0x01,0x20,0x22,0x36,0x06,0x11,0x4c,0x49,0x00,0x07,0xa8,0x32,0x06,0x11,0x4c, 0x40,0x07,0x06,0xa8,0x12,0x06,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x4c, 0x84,0x4c,0x00,0x06,0x04,0x07,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00, 0x84,0x4c,0x00,0x42,0xa4,0x4c,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0x25,0x06, 0x04,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x06,0xa8,0x12,0x06,0x11,0x06, 0x67,0x01,0x00,0x00,0x60,0x06,0x85,0x4c,0x04,0x06,0x00,0x06,0x24,0x02,0x00,0x00, 0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff, 0x2d,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0xc4,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f, 0x72,0x65,0x61,0x64,0x5f,0x50,0x30,0x31,0x30,0x5f,0x73,0x68,0x69,0x66,0x74,0x00, 0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74, 0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f, 0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65, 0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54, 0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32, 0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00, 0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33, 0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30, 0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00, 0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34, 0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30, 0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00, 0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35, 0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30, 0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00, 0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35, 0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30, 0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00, 0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36, 0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30, 0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00, 0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37, 0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30, 0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00, 0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38, 0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30, 0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00, 0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39, 0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30, 0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00, 0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39, 0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30, 0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00, 0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30, 0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30, 0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00, 0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31, 0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30, 0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00, 0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32, 0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30, 0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00, 0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33, 0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30, 0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00, 0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33, 0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30, 0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00, 0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34, 0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30, 0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00, 0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35, 0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30, 0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00, 0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36, 0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30, 0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00, 0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37, 0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30, 0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00, 0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37, 0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30, 0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00, 0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38, 0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30, 0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00, 0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39, 0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30, 0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00, 0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30, 0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30, 0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00, 0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31, 0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30, 0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00, 0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31, 0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30, 0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00, 0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32, 0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30, 0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00, 0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33, 0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30, 0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00, 0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34, 0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30, 0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00, 0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35, 0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30, 0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00, 0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35, 0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30, 0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00, 0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36, 0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30, 0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00, 0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37, 0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30, 0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00, 0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38, 0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30, 0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00, 0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39, 0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30, 0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00, 0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39, 0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30, 0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00, 0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30, 0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30, 0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00, 0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31, 0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30, 0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00, 0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32, 0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30, 0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00, 0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33, 0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30, 0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00, 0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33, 0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30, 0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00, 0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34, 0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30, 0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00, 0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35, 0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30, 0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00, 0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36, 0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30, 0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00, 0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37, 0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x56,0x30, 0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33,0x37,0x36,0x00, 0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30,0x33,0x37, 0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00,0x56,0x30, 0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38,0x34,0x00, 0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30,0x33,0x38, 0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00,0x56,0x30, 0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39,0x32,0x00, 0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30,0x33,0x39, 0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00,0x56,0x30, 0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30,0x30,0x00, 0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30,0x34,0x30, 0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00,0x56,0x30, 0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30,0x38,0x00, 0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30,0x34,0x31, 0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00,0x56,0x30, 0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31,0x36,0x00, 0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30,0x34,0x31, 0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00,0x56,0x30, 0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32,0x34,0x00, 0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30,0x34,0x32, 0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00,0x56,0x30, 0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33,0x32,0x00, 0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30,0x34,0x33, 0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00,0x56,0x30, 0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34,0x30,0x00, 0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30,0x34,0x34, 0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00,0x56,0x30, 0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34,0x38,0x00, 0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30,0x34,0x35, 0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00,0x56,0x30, 0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35,0x36,0x00, 0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30,0x34,0x35, 0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00,0x56,0x30, 0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36,0x34,0x00, 0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30,0x34,0x36, 0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00,0x56,0x30, 0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37,0x32,0x00, 0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30,0x34,0x37, 0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00,0x56,0x30, 0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38,0x30,0x00, 0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30,0x34,0x38, 0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00,0x56,0x30, 0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38,0x38,0x00, 0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30,0x34,0x39, 0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00,0x56,0x30, 0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39,0x36,0x00, 0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30,0x34,0x39, 0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00,0x56,0x30, 0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30,0x34,0x00, 0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30,0x35,0x30, 0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00,0x56,0x30, 0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31,0x32,0x00, 0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30,0x35,0x31, 0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00,0x56,0x30, 0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32,0x30,0x00, 0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30,0x35,0x32, 0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00,0x56,0x30, 0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32,0x38,0x00, 0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30,0x35,0x33, 0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00,0x56,0x30, 0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33,0x36,0x00, 0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30,0x35,0x33, 0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00,0x56,0x30, 0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34,0x34,0x00, 0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30,0x35,0x34, 0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00,0x56,0x30, 0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35,0x32,0x00, 0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30,0x35,0x35, 0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00,0x56,0x30, 0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36,0x30,0x00, 0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30,0x35,0x36, 0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00,0x56,0x30, 0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36,0x38,0x00, 0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30,0x35,0x37, 0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00,0x56,0x30, 0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37,0x36,0x00, 0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30,0x35,0x37, 0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00,0x56,0x30, 0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38,0x34,0x00, 0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30,0x35,0x38, 0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00,0x56,0x30, 0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39,0x32,0x00, 0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30,0x35,0x39, 0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00,0x56,0x30, 0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30,0x30,0x00, 0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30,0x36,0x30, 0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00,0x56,0x30, 0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30,0x38,0x00, 0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30,0x36,0x31, 0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00,0x56,0x30, 0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31,0x36,0x00, 0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30,0x36,0x31, 0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00,0x56,0x30, 0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32,0x34,0x00, 0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30,0x36,0x32, 0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00,0x56,0x30, 0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33,0x32,0x00, 0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30,0x36,0x33, 0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00,0x56,0x30, 0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34,0x30,0x00, 0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30,0x36,0x34, 0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00,0x56,0x30, 0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34,0x38,0x00, 0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30,0x36,0x35, 0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00,0x56,0x30, 0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35,0x36,0x00, 0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56,0x30,0x36,0x35, 0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31,0x00,0x56,0x30, 0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36,0x36,0x34,0x00, 0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56,0x30,0x36,0x36, 0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39,0x00,0x56,0x30, 0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36,0x37,0x32,0x00, 0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56,0x30,0x36,0x37, 0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37,0x00,0x56,0x30, 0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36,0x38,0x30,0x00, 0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56,0x30,0x36,0x38, 0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35,0x00,0x56,0x30, 0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36,0x38,0x38,0x00, 0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56,0x30,0x36,0x39, 0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33,0x00,0x56,0x30, 0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36,0x39,0x36,0x00, 0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56,0x30,0x36,0x39, 0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31,0x00,0x56,0x30, 0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37,0x30,0x34,0x00, 0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56,0x30,0x37,0x30, 0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39,0x00,0x56,0x30, 0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37,0x31,0x32,0x00, 0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56,0x30,0x37,0x31, 0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37,0x00,0x56,0x30, 0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37,0x32,0x30,0x00, 0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56,0x30,0x37,0x32, 0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35,0x00,0x56,0x30, 0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37,0x32,0x38,0x00, 0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56,0x30,0x37,0x33, 0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33,0x00,0x56,0x30, 0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37,0x33,0x36,0x00, 0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56,0x30,0x37,0x33, 0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31,0x00,0x56,0x30, 0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37,0x34,0x34,0x00, 0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56,0x30,0x37,0x34, 0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39,0x00,0x56,0x30, 0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37,0x35,0x32,0x00, 0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56,0x30,0x37,0x35, 0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37,0x00,0x56,0x30, 0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37,0x36,0x30,0x00, 0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56,0x30,0x37,0x36, 0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35,0x00,0x56,0x30, 0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37,0x36,0x38,0x00, 0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56,0x30,0x37,0x37, 0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33,0x00,0x56,0x30, 0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37,0x37,0x36,0x00, 0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56,0x30,0x37,0x37, 0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31,0x00,0x56,0x30, 0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37,0x38,0x34,0x00, 0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56,0x30,0x37,0x38, 0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39,0x00,0x56,0x30, 0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37,0x39,0x32,0x00, 0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56,0x30,0x37,0x39, 0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37,0x00,0x56,0x30, 0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38,0x30,0x30,0x00, 0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56,0x30,0x38,0x30, 0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35,0x00,0x56,0x30, 0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38,0x30,0x38,0x00, 0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56,0x30,0x38,0x31, 0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33,0x00,0x56,0x30, 0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38,0x31,0x36,0x00, 0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56,0x30,0x38,0x31, 0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31,0x00,0x56,0x30, 0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38,0x32,0x34,0x00, 0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56,0x30,0x38,0x32, 0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39,0x00,0x56,0x30, 0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38,0x33,0x32,0x00, 0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56,0x30,0x38,0x33, 0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37,0x00,0x56,0x30, 0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38,0x34,0x30,0x00, 0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56,0x30,0x38,0x34, 0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35,0x00,0x56,0x30, 0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38,0x34,0x38,0x00, 0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56,0x30,0x38,0x35, 0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33,0x00,0x56,0x30, 0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38,0x35,0x36,0x00, 0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56,0x30,0x38,0x35, 0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31,0x00,0x56,0x30, 0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38,0x36,0x34,0x00, 0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x56,0x30,0x38,0x36, 0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36,0x39,0x00,0x56,0x30, 0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30,0x38,0x37,0x32,0x00, 0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00,0x56,0x30,0x38,0x37, 0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37,0x37,0x00,0x56,0x30, 0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30,0x38,0x38,0x30,0x00, 0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00,0x56,0x30,0x38,0x38, 0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38,0x35,0x00,0x56,0x30, 0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30,0x38,0x38,0x38,0x00, 0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00,0x56,0x30,0x38,0x39, 0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39,0x33,0x00,0x56,0x30, 0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30,0x38,0x39,0x36,0x00, 0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00,0x56,0x30,0x38,0x39, 0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30,0x31,0x00,0x56,0x30, 0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30,0x39,0x30,0x34,0x00, 0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00,0x56,0x30,0x39,0x30, 0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30,0x39,0x00,0x56,0x30, 0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30,0x39,0x31,0x32,0x00, 0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00,0x56,0x30,0x39,0x31, 0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31,0x37,0x00,0x56,0x30, 0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30,0x39,0x32,0x30,0x00, 0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00,0x56,0x30,0x39,0x32, 0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32,0x35,0x00,0x56,0x30, 0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30,0x39,0x32,0x38,0x00, 0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00,0x56,0x30,0x39,0x33, 0x31,0x00,0x41,0x30,0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30, 0x33,0x00,0x41,0x30,0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30, 0x37,0x00,0x41,0x30,0x38,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30, 0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30, 0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31, 0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31, 0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31, 0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32, 0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32, 0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33, 0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33, 0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33, 0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34, 0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34, 0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35, 0x31,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65, 0x61,0x64,0x5f,0x50,0x30,0x31,0x30,0x5f,0x73,0x68,0x69,0x66,0x74,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e, 0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69, 0x76,0x69,0x69,0x2e,0x33,0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f, 0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f, 0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37,0x00, 0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42,0x42, 0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00,0x42, 0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x31,0x33, 0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x5f, 0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42,0x42,0x5f,0x31, 0x36,0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38,0x00,0x42,0x42, 0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x32,0x30,0x00, 0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x31,0x5f,0x32, 0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42,0x5f,0x32,0x33, 0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00,0x42,0x42,0x5f, 0x32,0x35,0x5f,0x32,0x36,0x00,0x42,0x42,0x5f,0x32,0x36,0x5f,0x32,0x37,0x00,0x42, 0x42,0x5f,0x32,0x37,0x5f,0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x38,0x5f,0x32,0x39, 0x00,0x42,0x42,0x5f,0x32,0x39,0x5f,0x33,0x30,0x00,0x42,0x42,0x5f,0x33,0x30,0x5f, 0x33,0x31,0x00,0x42,0x42,0x5f,0x33,0x31,0x5f,0x33,0x32,0x00,0x42,0x42,0x5f,0x33, 0x32,0x5f,0x33,0x33,0x00,0x42,0x42,0x5f,0x33,0x33,0x5f,0x33,0x34,0x00,0x54,0x30, 0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00, 0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74, 0x00,0x00,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x52,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x50, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x50,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x50,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x50,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x12,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x52,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x52,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x52,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x52,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x12,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x01,0x00,0x00,0x52,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x52,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x12,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x52,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x52,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x52,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x52,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x52,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02, 0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00, 0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00, 0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x52, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x52,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x52,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x52,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x52,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x02,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x02,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x02,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02, 0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00, 0x00,0x20,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00, 0x20,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x20, 0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x51,0x40, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x51,0x20,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x23,0x02,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x12,0x01,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x52,0x80,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x22,0x02,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x52,0x80,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x52,0x80,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x02,0x00,0x00,0x52,0x20,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x02,0x00,0x00,0x52,0x20,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x52,0x20,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x52,0x20,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x52,0x20,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00, 0x00,0x52,0x20,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00, 0x52,0x20,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x52, 0x20,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x52,0x40, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x52,0x40,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x52,0x40,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x52,0x20,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x52,0x20,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x52,0x20,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x52,0x20,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x23,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x02,0x00,0x00,0x12,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x02,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x21,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x02,0x00,0x00,0x20,0x01,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0x51,0x00,0x01,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00, 0x00,0x20,0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00, 0x20,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x20, 0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x20,0x01, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x20,0x01,0x00, 0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x20,0x01,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x20,0x01,0x00,0x75,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x50,0x08,0x00,0x5f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x20,0x01,0x00,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x20,0x01,0x00,0x79,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x02,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x02,0x00,0x00,0x21,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x02,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x02,0x00,0x00,0x51,0x80,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02, 0x00,0x00,0x20,0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x20,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00, 0x20,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x20, 0x01,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x21,0x01, 0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x20,0x01,0x00, 0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x20,0x01,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x20,0x01,0x00,0x8a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x20,0x01,0x00,0x8b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x20,0x01,0x00,0x8c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x20,0x01,0x00,0x8d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x20,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x02,0x00,0x00,0x21,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x02,0x00,0x00,0x20,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x02,0x00,0x00,0x20,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x02,0x00,0x00,0x20,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02, 0x00,0x00,0x20,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00, 0x00,0x20,0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00, 0x20,0x01,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x20, 0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x20,0x01, 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x20,0x01,0x00, 0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x20,0x01,0x00,0xa5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x20,0x01,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x20,0x01,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x20,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x20,0x01,0x00,0xad,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x20,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x02,0x00,0x00,0x20,0x01,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x02,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x02,0x00,0x00,0x20,0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x02,0x00,0x00,0x20,0x01,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02, 0x00,0x00,0x20,0x01,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00, 0x00,0x20,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00, 0x20,0x01,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x21, 0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x20,0x01, 0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x20,0x01,0x00, 0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x20,0x01,0x00,0xc4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x20,0x01,0x00,0xc6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x20,0x01,0x00,0xca,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x20,0x01,0x00,0xcd,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x20,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x02,0x00,0x00,0x20,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x02,0x00,0x00,0x20,0x01,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x02,0x00,0x00,0x21,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x02,0x00,0x00,0x20,0x01,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02, 0x00,0x00,0x20,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00, 0x00,0x20,0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00, 0x20,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x20, 0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x20,0x01, 0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x20,0x01,0x00, 0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x20,0x01,0x00,0xe4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x20,0x01,0x00,0xe6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x20,0x01,0x00,0xe8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x20,0x01,0x00,0xeb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x20,0x01,0x00,0xed,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x20,0x01,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x02,0x00,0x00,0x20,0x01,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x02,0x00,0x00,0x20,0x01,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x02,0x00,0x00,0x20,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x02,0x00,0x00,0x21,0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x20,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x20,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00, 0x20,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x20,0x01, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x20,0x01,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x12,0x01,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x21,0x01,0x00,0x0a,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x20,0x01,0x00,0x0b,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x51,0x00,0x01,0x09,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x20,0x01,0x00,0x0c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x20,0x01,0x00,0x0e,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x02,0x00,0x00,0x20,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x02,0x00,0x00,0x20,0x01,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x02,0x00,0x00,0x20,0x01,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0x20,0x01,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02, 0x00,0x00,0x21,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00, 0x00,0x20,0x01,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00, 0x51,0x80,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x20, 0x01,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x20,0x01, 0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x21,0x01,0x00, 0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x20,0x01,0x00,0x1f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x20,0x01,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x20,0x01,0x00,0x22,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x20,0x01,0x00,0x23,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x20,0x01,0x00,0x24,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x21,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x02,0x00,0x00,0x20,0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x02,0x00,0x00,0x20,0x01,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x02,0x00,0x00,0x20,0x01,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x02,0x00,0x00,0x20,0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02, 0x00,0x00,0x20,0x01,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00, 0x00,0x20,0x01,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00, 0x20,0x01,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x20, 0x01,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x20,0x01, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x20,0x01,0x00, 0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x20,0x01,0x00,0x3d, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x20,0x01,0x00,0x3f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x20,0x01,0x00,0x41,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x20,0x01,0x00,0x43,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x20,0x01,0x00,0x45,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x21,0x01,0x00,0x46,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x20,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x03,0x00,0x00,0x20,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0x20,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x03,0x00,0x00,0x20,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x20,0x01,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00, 0x00,0x20,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00, 0x21,0x01,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x20, 0x01,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x20,0x01, 0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x20,0x01,0x00, 0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x20,0x01,0x00,0x59, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x20,0x01,0x00,0x5b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x20,0x01,0x00,0x5f,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x20,0x01,0x00,0x61,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x20,0x01,0x00,0x64,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x20,0x01,0x00,0x66,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x03,0x00,0x00,0x20,0x01,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x03,0x00,0x00,0x20,0x01,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x03,0x00,0x00,0x21,0x01,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x03,0x00,0x00,0x20,0x01,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03, 0x00,0x00,0x20,0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00, 0x00,0x20,0x01,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00, 0x20,0x01,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x12, 0x01,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x51,0x00, 0x01,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x20,0x01,0x00, 0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x20,0x01,0x00,0x7c, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x20,0x01,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x51,0x80,0x00,0x77,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x20,0x01,0x00,0x7f,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x20,0x01,0x00,0x80,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x20,0x01,0x00,0x82,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x03,0x00,0x00,0x20,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x03,0x00,0x00,0x20,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x03,0x00,0x00,0x20,0x01,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x20,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03, 0x00,0x00,0x20,0x01,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00, 0x00,0x20,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00, 0x20,0x01,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x20, 0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x20,0x01, 0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x20,0x01,0x00, 0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x20,0x01,0x00,0x98, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x20,0x01,0x00,0x9a,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x20,0x01,0x00,0x9b,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x20,0x01,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x20,0x01,0x00,0x9f,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x20,0x01,0x00,0xa0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x03,0x00,0x00,0x12,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x03,0x00,0x00,0x21,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x03,0x00,0x00,0x20,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x03,0x00,0x00,0x51,0x00,0x01,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03, 0x00,0x00,0x20,0x01,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00, 0x00,0x20,0x01,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00, 0x20,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x20, 0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x20,0x01, 0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x01,0x00, 0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x21,0x01,0x00,0xb6, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x20,0x01,0x00,0xb7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x51,0x80,0x00,0xa5,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x20,0x01,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x20,0x01,0x00,0xba,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x21,0x01,0x00,0xbb,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x03,0x00,0x00,0x20,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0x20,0x01,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x03,0x00,0x00,0x20,0x01,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x03,0x00,0x00,0x20,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03, 0x00,0x00,0x20,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x21,0x01,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00, 0x20,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x20, 0x01,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x20,0x01, 0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x20,0x01,0x00, 0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x20,0x01,0x00,0xcb, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x20,0x01,0x00,0xcd,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x20,0x01,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x20,0x01,0x00,0xd3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x20,0x01,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x20,0x01,0x00,0xd7,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x03,0x00,0x00,0x20,0x01,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x03,0x00,0x00,0x20,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x03,0x00,0x00,0x20,0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x03,0x00,0x00,0x20,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03, 0x00,0x00,0x20,0x01,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00, 0x00,0x21,0x01,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00, 0x20,0x01,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x20, 0x01,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x20,0x01, 0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x20,0x01,0x00, 0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x20,0x01,0x00,0xed, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x20,0x01,0x00,0xee,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x21,0x01,0x00,0xef,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x20,0x01,0x00,0xf0,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x20,0x01,0x00,0xf1,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x20,0x01,0x00,0xf4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x03,0x00,0x00,0x20,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x03,0x00,0x00,0x20,0x01,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x03,0x00,0x00,0x20,0x01,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x03,0x00,0x00,0x20,0x01,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03, 0x00,0x00,0x20,0x01,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00, 0x00,0x20,0x01,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00, 0x20,0x01,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20, 0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x21,0x01, 0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x20,0x01,0x00, 0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x20,0x01,0x00,0x0c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x20,0x01,0x00,0x0e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x20,0x01,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x20,0x01,0x00,0x10,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x51,0x40,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x20,0x01,0x00,0x11,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x03,0x00,0x00,0x51,0x40,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x03,0x00,0x00,0x20,0x01,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x03,0x00,0x00,0x51,0x40,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x03,0x00,0x00,0x51,0x20,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03, 0x00,0x00,0x51,0x20,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00, 0x00,0x51,0x20,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00, 0x51,0x20,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x20, 0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x51,0x20, 0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x20,0x01,0x00, 0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x51,0x20,0x00,0x17, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x20,0x01,0x00,0x29,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x51,0x20,0x00,0x18,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x51,0x20,0x00,0x19,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x20,0x01,0x00,0x2d,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x51,0x20,0x00,0x22,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x03,0x00,0x00,0x51,0x20,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x03,0x00,0x00,0x20,0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x03,0x00,0x00,0x20,0x01,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x03,0x00,0x00,0x20,0x01,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03, 0x00,0x00,0x20,0x01,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00, 0x00,0x20,0x01,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00, 0x20,0x01,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x20, 0x01,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x51,0x20, 0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x20,0x01,0x00, 0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x51,0x20,0x00,0x1b, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x20,0x01,0x00,0x3e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x51,0x20,0x00,0x1c,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x51,0x20,0x00,0x1d,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x20,0x01,0x00,0x42,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x20,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x03,0x00,0x00,0x51,0x20,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x03,0x00,0x00,0x51,0x20,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x03,0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x03,0x00,0x00,0x20,0x01,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03, 0x00,0x00,0x20,0x01,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x20,0x01,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00, 0x20,0x01,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x20, 0x01,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x20,0x01, 0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x20,0x01,0x00, 0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x20,0x01,0x00,0x56, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x20,0x01,0x00,0x5b,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x20,0x01,0x00,0x5f,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x9e,0x03,0x00,0x00,0x01,0x00,0x00,0x9f,0x03, 0x00,0x00,0x01,0x00,0x00,0xa0,0x03,0x00,0x00,0x01,0x00,0x00,0xa1,0x03,0x00,0x00, 0x01,0x00,0x00,0xa2,0x03,0x00,0x00,0x01,0x00,0x00,0xa3,0x03,0x00,0x00,0x01,0x00, 0x00,0xa4,0x03,0x00,0x00,0x01,0x00,0x00,0xa5,0x03,0x00,0x00,0x01,0x00,0x00,0xa6, 0x03,0x00,0x00,0x01,0x00,0x00,0x33,0x00,0xa7,0x03,0x00,0x00,0x01,0x00,0x00,0xa8, 0x03,0x00,0x00,0x01,0x00,0x00,0xa9,0x03,0x00,0x00,0x01,0x00,0x00,0xaa,0x03,0x00, 0x00,0x01,0x00,0x00,0xab,0x03,0x00,0x00,0x01,0x00,0x00,0xac,0x03,0x00,0x00,0x01, 0x00,0x00,0xad,0x03,0x00,0x00,0x01,0x00,0x00,0xae,0x03,0x00,0x00,0x01,0x00,0x00, 0xaf,0x03,0x00,0x00,0x01,0x00,0x00,0xb0,0x03,0x00,0x00,0x01,0x00,0x00,0xb1,0x03, 0x00,0x00,0x01,0x00,0x00,0xb2,0x03,0x00,0x00,0x01,0x00,0x00,0xb3,0x03,0x00,0x00, 0x01,0x00,0x00,0xb4,0x03,0x00,0x00,0x01,0x00,0x00,0xb5,0x03,0x00,0x00,0x01,0x00, 0x00,0xb6,0x03,0x00,0x00,0x01,0x00,0x00,0xb7,0x03,0x00,0x00,0x01,0x00,0x00,0xb8, 0x03,0x00,0x00,0x01,0x00,0x00,0xb9,0x03,0x00,0x00,0x01,0x00,0x00,0xba,0x03,0x00, 0x00,0x01,0x00,0x00,0xbb,0x03,0x00,0x00,0x01,0x00,0x00,0xbc,0x03,0x00,0x00,0x01, 0x00,0x00,0xbd,0x03,0x00,0x00,0x01,0x00,0x00,0xbe,0x03,0x00,0x00,0x01,0x00,0x00, 0xbf,0x03,0x00,0x00,0x01,0x00,0x00,0xc0,0x03,0x00,0x00,0x01,0x00,0x00,0xc1,0x03, 0x00,0x00,0x01,0x00,0x00,0xc2,0x03,0x00,0x00,0x01,0x00,0x00,0xc3,0x03,0x00,0x00, 0x01,0x00,0x00,0xc4,0x03,0x00,0x00,0x01,0x00,0x00,0xc5,0x03,0x00,0x00,0x01,0x00, 0x00,0xc6,0x03,0x00,0x00,0x01,0x00,0x00,0xc7,0x03,0x00,0x00,0x01,0x00,0x00,0xc8, 0x03,0x00,0x00,0x01,0x00,0x00,0xc9,0x03,0x00,0x00,0x01,0x00,0x00,0xca,0x03,0x00, 0x00,0x01,0x00,0x00,0xcb,0x03,0x00,0x00,0x01,0x00,0x00,0xcc,0x03,0x00,0x00,0x01, 0x00,0x00,0xcd,0x03,0x00,0x00,0x01,0x00,0x00,0xce,0x03,0x00,0x00,0x01,0x00,0x00, 0xcf,0x03,0x00,0x00,0x01,0x00,0x00,0xd0,0x03,0x00,0x00,0x01,0x00,0x00,0xd1,0x03, 0x00,0x00,0x01,0x00,0x00,0xd2,0x03,0x00,0x00,0x01,0x00,0x00,0xd3,0x03,0x00,0x00, 0x01,0x00,0x00,0xd4,0x03,0x00,0x00,0x01,0x00,0x00,0xd5,0x03,0x00,0x00,0x01,0x00, 0x00,0xd6,0x03,0x00,0x00,0x01,0x00,0x00,0xd7,0x03,0x00,0x00,0x01,0x00,0x00,0xd8, 0x03,0x00,0x00,0x01,0x00,0x00,0xd9,0x03,0x00,0x00,0x01,0x00,0x00,0x22,0x00,0xda, 0x03,0x00,0x00,0x01,0x00,0xdb,0x03,0x00,0x00,0x01,0x00,0xdc,0x03,0x00,0x00,0x00, 0x00,0xdd,0x03,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0xdf,0x03,0x00, 0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0xe2, 0x03,0x00,0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0xe4,0x03,0x00,0x00,0x00, 0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0xe7,0x03,0x00, 0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0xea, 0x03,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x00, 0x00,0xed,0x03,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0xef,0x03,0x00, 0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0xf2, 0x03,0x00,0x00,0x00,0x00,0xf3,0x03,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x00, 0x00,0xf5,0x03,0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0xf7,0x03,0x00, 0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0xfa, 0x03,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0xfc,0x03,0x00, 0x00,0x01,0x00,0x00,0xfd,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00, 0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00, 0x2c,0x00,0x04,0x00,0x00,0x56,0x02,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x22,0x00, 0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x00, 0x24,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x19,0x91,0x00,0x00,0x08,0x50,0x00,0x00, 0x03,0x00,0xfe,0x03,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79, 0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x36,0x2e,0x61,0x73,0x6d,0xff,0x03,0x00, 0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x45,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0,0xff,0xff,0xff,0x0c, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x68,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x35, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x01,0x00,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x02,0x00, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32, 0x00,0x01,0x00,0x1d,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x68,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x00,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x03,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x32,0x00,0x03,0x00,0x02,0x00,0x29,0x00,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x03,0x00,0x31,0x02,0x00,0x01,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x48,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x6c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff, 0x29,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02, 0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x04,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x10,0x00,0x00,0x00,0x32,0x00,0x04,0x80,0x03,0x00,0x01,0x00, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x6d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x03,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x05,0x00,0x00,0x6b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x05,0x80,0x03,0x00, 0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x6f,0x02,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x70,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x58,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xe8,0xff,0xff,0xff,0x29,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x00,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31, 0x03,0x00,0x29,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x06,0x00,0x00,0x58,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x06,0x00, 0x05,0x00,0x31,0x04,0x00,0x24,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0x07,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x58,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x07,0x80,0x04,0x00,0x24,0x03,0x00,0x00,0x00,0x5f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x31,0x05,0x00,0x2c,0x00,0x04,0x02,0x08,0x00,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00, 0x08,0x00,0x11,0x00,0x2c,0x00,0x00,0x02,0x09,0x00,0x00,0x59,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x09,0x00,0x0b,0x00,0x2c, 0x00,0x00,0x02,0x0a,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x32,0x00,0x0a,0x80,0x21,0x00,0x25,0x04,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0x73,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x73,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x75,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x05, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x06,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x07,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x0a,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x0e,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x12, 0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x16,0x00, 0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x1a,0x00,0x00, 0x02,0x00,0x76,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x1e,0x00,0x00,0x02, 0x00,0x76,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x0b, 0x00,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x7a,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x13,0x00,0x00,0x02,0x00, 0x7b,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x17,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x7d,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x1f,0x00,0x00, 0x02,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x25,0x04,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x05,0x00, 0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x09,0x00,0x00, 0x02,0x00,0x80,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x0d,0x00,0x00,0x02, 0x00,0x80,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x81, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x81,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x81,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x83,0x02, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x0b, 0x00,0x00,0x02,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x64,0x00,0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x2c,0x00,0x04,0x02,0x0b,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x0b,0x80,0x07,0x00,0x31,0x06,0x00, 0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x00, 0x00,0x00,0x01,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x05,0x08,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x60,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x09,0x08, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x65,0x00,0x00,0x00,0x0d,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x11,0x08,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x15,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x06,0x00, 0x02,0x00,0x65,0x00,0x00,0x00,0x19,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x1d,0x08,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x0e,0x00,0x21,0x01,0x00,0x87,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x70,0xfe,0x03, 0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0xf0,0xfe,0x03,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x70,0xff,0x03,0x00,0x02,0x00,0x60, 0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xf0, 0xff,0x03,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0x70,0x00,0x03,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00, 0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xf0,0x00,0x03,0x00,0x02, 0x00,0x60,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x70,0x01,0x03,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xf0,0x01,0x03,0x00,0x02,0x00,0x60,0x00,0x00, 0x00,0x00,0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x01,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x05,0x08,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x64, 0x00,0x00,0x00,0x09,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x0d,0x08,0x21,0x01,0x28,0x00,0x01, 0x02,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x30,0x00, 0x03,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0xb0,0x00,0x03,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x30,0x01,0x03,0x00,0x02,0x00, 0x62,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00, 0xb0,0x01,0x03,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x0c,0x00, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x0c,0x80,0x07,0x00,0x29,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x06, 0x00,0x31,0x07,0x00,0x2c,0x00,0x04,0x02,0x0d,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x0d,0x80,0x09,0x00,0x2c, 0x00,0x04,0x02,0x0e,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x04,0x00,0x00,0x00,0x32,0x00,0x0e,0x00,0x08,0x00,0x2c,0x00,0x00,0x02,0x0f,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32, 0x00,0x0f,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x69,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b, 0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b, 0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b, 0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x94,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x00,0x24,0x00, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00, 0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x9a, 0x02,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x08,0x00,0x2c,0x00, 0x00,0x02,0x10,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0x10,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x88,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x8b,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x8b,0x02,0x00,0x00,0xe0,0x00,0x25,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x60,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xa6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x9a,0x02, 0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x09,0x00,0x32,0x00,0x02, 0x00,0x0a,0x00,0x2b,0x00,0x02,0x11,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x11,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0xa8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xca,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x8b,0x02,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x02,0x10, 0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x9f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x8b,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xa5,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xca, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b, 0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xac,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xae,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x9f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x8b,0x02,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b, 0x02,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xb5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb5,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x01,0x01, 0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xba,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x02,0x10,0x00,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbd,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00, 0x60,0x03,0x10,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0x8b,0x02,0x00,0x00,0xe0,0x03,0x25,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc5,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x9a,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcb,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcc,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x9a,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xd0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd0, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x60, 0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0x21,0x00, 0x31,0x0a,0x00,0x2c,0x00,0x00,0x02,0x12,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x12,0x80,0x21,0x00,0x25,0x00, 0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xca,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b, 0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xd9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xda, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x8b,0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe8,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xce,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x02, 0x10,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe5, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x8b,0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xde,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02, 0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xec, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00, 0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x8b,0x02,0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xf1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00, 0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x8b,0x02,0x00,0x00,0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0xe0,0x02,0x25,0x00,0x00,0x00,0x00, 0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9a, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfd,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x02,0x00, 0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x21, 0x00,0x31,0x0b,0x00,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x73,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x73,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x73, 0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x73,0x02, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x73,0x02,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x09,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x11,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0x15,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x19, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x1d,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0x76,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x76,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x76, 0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x76,0x02, 0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x76,0x02,0x00, 0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00, 0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x07, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x08,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x09, 0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0x81,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x81,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x81, 0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x04,0x02,0x13,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x13,0x80,0x0d,0x00,0x31,0x0c,0x00,0x29,0x00, 0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00,0x00, 0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x09,0x01,0x00,0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x09,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x09,0x01, 0x00,0x00,0x0d,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x15,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00, 0x09,0x01,0x00,0x00,0x19,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x07,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x03,0x00,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x0e,0x00,0x21,0x01,0x00,0xe1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xfe,0x03,0x00,0x02, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00, 0x00,0xe0,0xfe,0x03,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xff,0x03,0x00,0x02,0x00,0x04,0x01,0x00, 0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0xff,0x03, 0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x60,0x00,0x03,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x04,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x00,0x03,0x00,0x02,0x00,0x04, 0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60, 0x01,0x03,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x03,0x00,0x00,0xe0,0x01,0x03,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00, 0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x05,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x08,0x01,0x00, 0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x03, 0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x28,0x00,0x01,0x04,0x00, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x20,0x00,0x03,0x00, 0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04, 0x00,0x00,0xa0,0x00,0x03,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x20,0x01,0x03,0x00,0x02,0x00,0x06,0x01, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xa0,0x01, 0x03,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x14,0x00,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x14, 0x80,0x0d,0x00,0x29,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x0c,0x00,0x31, 0x0d,0x00,0x2c,0x00,0x04,0x02,0x15,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x15,0x80,0x0f,0x00,0x2c,0x00,0x04, 0x02,0x16,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x32,0x00,0x16,0x00,0x0e,0x00,0x2c,0x00,0x00,0x02,0x17,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x17, 0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xe3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0d,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0e,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00, 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x11,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x12,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00, 0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x01, 0x10,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0xc0,0x01,0x25,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1c,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x21, 0x00,0x31,0x0e,0x00,0x2c,0x00,0x00,0x02,0x18,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x18,0x80,0x21,0x00,0x25, 0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xf1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xe4,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0xc0,0x00,0x25,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31, 0x0f,0x00,0x32,0x00,0x02,0x00,0x10,0x00,0x2b,0x00,0x02,0x19,0x00,0x05,0x00,0x01, 0x00,0x00,0x00,0x32,0x00,0x19,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x25,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x80,0x00, 0x24,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2a,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x2b,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00, 0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00, 0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02, 0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x33, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x03,0x10,0x00,0x00, 0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x34,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xe4,0x02,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x3b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0xc0,0x02,0x10,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x43,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00, 0x40,0x03,0x10,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0xe4,0x02,0x00,0x00,0xc0,0x03,0x25,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x48,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4b,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xed,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x09,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0xed,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0b,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0xed,0x02,0x00,0x00,0xc0,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31, 0x10,0x00,0x2c,0x00,0x00,0x02,0x1a,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x1a,0x80,0x21,0x00,0x25,0x00,0x00, 0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x53,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0xe4,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02, 0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x58, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x59,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xe4,0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe4,0x02,0x00,0x00,0x00,0x02,0x10, 0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5e,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xe4,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x13,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0xe4,0x02,0x00,0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x63,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x69, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0xc0,0x02,0x25, 0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x1a,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xed,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xed,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x02,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x1b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x21, 0x00,0x31,0x11,0x00,0x2c,0x00,0x00,0x02,0x1b,0x00,0x00,0x59,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x1b,0x00,0x17,0x00,0x2c, 0x00,0x00,0x02,0x1c,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x01,0x00,0x00,0x00,0x32,0x00,0x1c,0x80,0x21,0x00,0x25,0x04,0x00,0x00,0x00,0x78, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0x73,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x73,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x7f, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x7f,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x7f,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x1d,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0x1d,0x80,0x13,0x00,0x31,0x12,0x00,0x29,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x78,0x01,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x73,0x01,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x78,0x01,0x00,0x00, 0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x78,0x01,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x14,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x78,0x01, 0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00, 0x07,0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x05,0x00,0x00,0x00,0x00, 0x78,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x60,0xfe,0x03,0x00,0x02,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0xe0, 0xfe,0x03,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x05,0x00,0x00,0x60,0xff,0x03,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0xe0,0xff,0x03,0x00,0x02, 0x00,0x73,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00, 0x00,0x60,0x00,0x03,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x05,0x00,0x00,0xe0,0x00,0x03,0x00,0x02,0x00,0x73,0x01,0x00, 0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x60,0x01,0x03, 0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x05,0x00,0x00,0xe0,0x01,0x03,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x07,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x08, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x03,0x00,0x02, 0x00,0x77,0x01,0x00,0x00,0x0c,0x00,0x21,0x01,0x28,0x00,0x01,0x06,0x00,0x00,0x00, 0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1e,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x75,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00, 0x80,0x00,0x03,0x00,0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x75,0x01,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x80,0x01,0x03,0x00, 0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x76, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x1e,0x00,0x00,0x58,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x1e,0x80,0x13, 0x00,0x29,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x12,0x00,0x31,0x13,0x00, 0x2c,0x00,0x04,0x02,0x1f,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x1f,0x80,0x15,0x00,0x2c,0x00,0x04,0x02,0x20, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x32,0x00,0x20,0x00,0x14,0x00,0x2c,0x00,0x00,0x02,0x21,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x21,0x80,0x21, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x7b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00, 0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x80,0x01,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31, 0x14,0x00,0x2c,0x00,0x00,0x02,0x22,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x22,0x80,0x21,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x25,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x80,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x15,0x00,0x32,0x00,0x02,0x00,0x16, 0x00,0x2b,0x00,0x02,0x23,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x23,0x80, 0x21,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x91,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x27,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x28, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00, 0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x89,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x89, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2a,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x80, 0x02,0x10,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x80,0x03,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x90,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93, 0x02,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x93, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x2f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23,0x03, 0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x16,0x00,0x2c,0x00,0x00, 0x02,0x24,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0x24,0x80,0x21,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x31,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0x1f,0x03,0x00,0x00,0x80,0x02,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23, 0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x35,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0x23,0x03,0x00,0x00,0x00,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x17,0x00, 0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x73,0x02,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xa6,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xa6,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x04,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xa6,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x05,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6, 0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x06,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x09, 0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x11,0x00,0x00, 0x02,0x00,0x75,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x15,0x00,0x00,0x02, 0x00,0x75,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x19,0x00,0x00,0x02,0x00, 0x75,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x75, 0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x7f,0x02,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0xa5,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x03, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0xa5,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0xa5,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa5, 0x01,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xa5,0x01, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x25,0x00,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x25, 0x80,0x19,0x00,0x31,0x18,0x00,0x29,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xa1,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x04,0x08, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0xa6,0x01,0x00,0x00,0x08,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa1,0x01,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x0c,0x08,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xa6,0x01,0x00,0x00, 0x10,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0xa6,0x01,0x00,0x00,0x14,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa1, 0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x18,0x08,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xa6,0x01, 0x00,0x00,0x1c,0x08,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x0d,0x00, 0x21,0x01,0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x07,0x00,0x00,0x70,0xfe,0x03,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xf0,0xfe,0x03,0x00,0x02,0x00,0xa1, 0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x70, 0xff,0x03,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x07,0x00,0x00,0xf0,0xff,0x03,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00, 0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x70,0x00,0x03,0x00,0x02, 0x00,0xa1,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00, 0x00,0xf0,0x00,0x03,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x70,0x01,0x03,0x00,0x02,0x00,0xa1,0x01,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xf0,0x01,0x03, 0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x00,0x08,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xa5, 0x01,0x00,0x00,0x04,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x08,0x08,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x0c, 0x08,0x21,0x01,0x28,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x08,0x00,0x00,0x10,0x00,0x03,0x00,0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x90,0x00,0x03,0x00,0x02,0x00, 0xa3,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00, 0x10,0x01,0x03,0x00,0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x08,0x00,0x00,0x90,0x01,0x03,0x00,0x02,0x00,0xa3,0x01,0x00,0x00, 0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0x26,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x26,0x80,0x19,0x00,0x29,0x00,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x18,0x00,0x31,0x19,0x00,0x2c,0x00,0x04,0x02,0x27,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x27,0x80,0x1b,0x00,0x2c,0x00,0x04,0x02,0x28,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x28,0x00,0x1a,0x00, 0x2c,0x00,0x00,0x02,0x29,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x29,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00, 0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x3a, 0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xac,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xad,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xb0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb1,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00, 0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xb4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x01,0x25,0x00,0x00, 0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb7,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x43,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x03, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00, 0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1a,0x00,0x2c,0x00,0x00,0x02, 0x2a,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x32,0x00,0x2a,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xbd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xbe, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x48,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03, 0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x00,0x25,0x00,0x00, 0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x43,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x20, 0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1b,0x00,0x32,0x00,0x02,0x00,0x1c,0x00, 0x2b,0x00,0x02,0x2b,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x2b,0x80,0x21, 0x00,0x25,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x4d,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc5,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xe6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xca,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xcb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcb,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x51,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00, 0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xce,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00, 0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcf, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a, 0x03,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xd2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x03,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x54,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03, 0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x00,0x24,0x00,0x00, 0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd7,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00, 0x20,0x01,0x10,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x57,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0x3a,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x02, 0x10,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a, 0x03,0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x03,0x10,0x00,0x00,0x00,0x00,0xe1, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe1,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x03,0x25, 0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x5d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x43,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x43,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x03,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x03,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x43,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x60,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00, 0x00,0x00,0x43,0x03,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd8, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x62,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0xa0, 0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1c,0x00,0x2c,0x00,0x00,0x02,0x2c,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x2c,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07, 0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf2,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf3, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a, 0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xf7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x01,0x24,0x00, 0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x3a,0x03,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x03,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00, 0x3a,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6a,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x00,0x24, 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x01, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x6b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03, 0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00, 0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x04,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x05,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00, 0x20,0x02,0x10,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00, 0x00,0x3a,0x03,0x00,0x00,0xa0,0x02,0x25,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x03,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x43,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02, 0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x02,0x00,0x00,0x00,0x00,0x43,0x03,0x00, 0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1d,0x00,0x01,0x00,0x00,0x00, 0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x74, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x75,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x03,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x79,0x03,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x7a,0x03,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x74, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x7b,0x03,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x76,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x7c,0x03, 0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x78,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x7d,0x03,0x00,0x00, 0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00, 0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x05, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x06,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x07,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x17,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x18,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x13,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x13,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00, 0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x1b,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x05, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x1c,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x06,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x1d,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x07,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x16, 0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x17,0x02, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x18,0x02,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x15,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x15,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x04,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x04,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x02,0x00, 0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00, 0x00,0x00,0x23,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00, 0x00,0x24,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00, 0x25,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x03,0x00,0x22, 0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x22, 0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x23,0x02, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x24,0x02,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x25,0x02,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x21,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x21,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x21,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x04,0x02,0x2d,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x2d,0x80,0x1f,0x00,0x2c,0x00,0x04, 0x02,0x2e,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x32,0x00,0x2e,0x00,0x1e,0x00,0x2c,0x00,0x00,0x02,0x2f,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x2f, 0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x7e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x28,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x81,0x03,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x03,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x2c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x87,0x03,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1e,0x00,0x2c,0x00,0x00,0x02, 0x30,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x32,0x00,0x30,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x03,0x07,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x30,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x81,0x03,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x31, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x89,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x1f, 0x00,0x32,0x00,0x02,0x00,0x20,0x00,0x2b,0x00,0x02,0x31,0x00,0x05,0x00,0x01,0x00, 0x00,0x00,0x32,0x00,0x31,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x88,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x03,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x81,0x03,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x36, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x36,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x83,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x37,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x03,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x3b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x8f,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x90,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x91,0x03,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x3f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x94, 0x03,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x43,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x87,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x45,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x97,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x98,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x20,0x00,0x2c, 0x00,0x00,0x02,0x32,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x32,0x00,0x32,0x80,0x21,0x00,0x25,0x00,0x00,0x00,0x00,0x88, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x03, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x81,0x03,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x4d, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x50,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x8f,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x91, 0x03,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x54,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x87,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x55,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x97,0x03,0x00,0x00,0x00,0x00,0x31,0x21,0x00,0x34,0x00,0x00,0x00, 0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x61, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x1b,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x63, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00, 0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x60,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x65,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03, 0x02,0x33,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x33,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00, 0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00, 0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c, 0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x06,0x09,0x24,0x00,0x00,0x01,0xff,0x0f,0xff, 0x0f,0x65,0x02,0x09,0x62,0xb5,0x02,0xf1,0xff,0x69,0x00,0x00,0x00,0x60,0x86,0x25, 0x4c,0xc4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x60,0x81,0xe5, 0x4c,0x14,0x09,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x25, 0x09,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01, 0x20,0xe4,0x4c,0x00,0x01,0xc4,0x01,0x00,0x00,0x69,0x06,0x00,0x00,0x60,0x81,0x85, 0x4c,0x04,0x09,0x00,0x05,0x07,0x00,0x07,0x00,0x69,0x00,0x00,0x00,0x60,0x81,0xa5, 0x4c,0x14,0x09,0x00,0x05,0x02,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05, 0x4c,0xe4,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x40,0x44, 0x4c,0x00,0x00,0x00,0x00,0x08,0x5b,0x00,0x00,0x61,0x00,0x04,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x1f,0x00,0x07, 0x00,0x61,0x07,0x04,0x62,0x58,0x4c,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x04,0xe4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x04, 0x02,0xe4,0x01,0x05,0x01,0x14,0x09,0x04,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05, 0x2c,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45, 0x4c,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5, 0x4c,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x41,0x03,0x20,0x22,0x4e,0x02,0x11, 0x01,0x5b,0x03,0x00,0x00,0x60,0x06,0x44,0x4c,0x24,0x09,0x01,0x06,0x44,0x4c,0x04, 0x09,0x49,0x00,0x02,0xa8,0x4a,0x02,0x11,0x01,0x5b,0x04,0x00,0x00,0x60,0x06,0xc4, 0x4c,0x44,0x01,0x01,0x06,0xc4,0x4c,0x04,0x09,0x5b,0x00,0x00,0x00,0x60,0x86,0x04, 0x03,0x64,0x01,0x05,0x01,0x14,0x09,0xf8,0xff,0x40,0x04,0x4c,0xa8,0x42,0x4c,0x11, 0x4c,0x70,0x03,0x40,0x00,0x60,0x86,0x01,0x00,0xc4,0x4c,0x00,0x35,0x1f,0x00,0x1f, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x02,0x00, 0x00,0x62,0x04,0x00,0x00,0x60,0x86,0x65,0x01,0x04,0x03,0x00,0x55,0x08,0x00,0x08, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x03,0x00,0x55,0x08,0x00,0x08, 0x00,0x69,0x05,0x4c,0x68,0x9a,0x4c,0x21,0x00,0x69,0x04,0x00,0x00,0x60,0x86,0x85, 0x01,0x44,0x4c,0x00,0x05,0x02,0x00,0x02,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0x4e,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49, 0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03, 0x00,0x61,0x00,0x02,0x62,0x58,0x4c,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01, 0x00,0xc4,0x4c,0x00,0x31,0x08,0x00,0x08,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05, 0x44,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x5e,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x5c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x5a,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x58,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x56,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x54,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x52,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x60,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x07,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x05,0xa0,0x00,0x00,0x01,0x00,0x61,0x30,0x03,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x09,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x45, 0x01,0xc4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x61,0x31,0x02,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x40,0x00,0x02,0x68,0x5a,0x4c,0x01,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xe4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01, 0x00,0xc4,0x4c,0x00,0x31,0x10,0x00,0x10,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05, 0x34,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x32,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x01,0xc4,0x4c,0x00,0x05,0xf8,0xff,0xf8,0xff,0x31,0xb3,0x03,0x80,0x00,0x00,0x05, 0x48,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5, 0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x61,0x33,0x02,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x40,0x00,0x02,0x68,0x5a,0x4c,0x01,0x04,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xe4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01, 0x00,0xc4,0x4c,0x00,0x31,0x18,0x00,0x18,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05, 0x3c,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x34,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x01,0xc4,0x4c,0x00,0x05,0xf0,0xff,0xf0,0xff,0x31,0xb5,0x03,0x80,0x00,0x00,0x05, 0x4d,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5, 0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x61,0x35,0x02,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x40,0x00,0x02,0x68,0x5a,0x4c,0x01,0x06,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xe4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x01,0xc4,0x4c,0x00,0x05,0xe8,0xff,0xe8,0xff,0x31,0xa6,0x03,0x80,0x00,0x00,0x05, 0x03,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x36,0x00,0x80,0xa0,0x4a,0x45, 0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x02,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5, 0x01,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x05, 0x0b,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x26,0x04,0x00,0x20,0x01,0x05, 0x5e,0x05,0x03,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x5c,0x05,0x04,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x5a,0x05,0x05,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x58,0x05,0x06,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x56,0x05,0x07,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x54,0x05,0x08,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x52,0x05,0x09,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x60,0x05,0x0a,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x27,0x04,0x00,0x20,0x01,0x05, 0x03,0x05,0x0d,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x05,0x05,0x0c,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x07,0x05,0x0b,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x20,0x01,0x05, 0x09,0x05,0x0e,0x58,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x4c,0xa8,0x90,0x00,0x01, 0x00,0x61,0x00,0x0b,0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x51,0xa1,0x00,0x00,0x01, 0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x20,0x2a,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x50,0x85,0x05, 0x02,0x84,0x4c,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01, 0x10,0x04,0x02,0x00,0x01,0x60,0x01,0x60,0x01,0x61,0x00,0x00,0x00,0x68,0x06,0x01, 0x00,0x84,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85, 0x4c,0x84,0x4c,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01, 0x00,0x84,0x4c,0x00,0x16,0x44,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x98,0xff,0xff,0xff,0x69,0x04,0x51,0x61,0x02,0x0b,0x20, 0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x01,0x00,0x51,0x03,0x00,0x03, 0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x2d,0x00, 0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x01,0x00,0x11,0x03,0x00,0x03, 0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x1a,0x00, 0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x01,0x00,0x11,0x04,0x00,0x04, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x54,0x00, 0x00,0x68,0x00,0x5e,0x20,0x33,0x5e,0x10,0x01,0x68,0x00,0x5c,0x20,0x33,0x5c,0x10, 0x01,0x68,0x00,0x5a,0x20,0x33,0x5a,0x10,0x01,0x68,0x00,0x58,0x20,0x33,0x58,0x10, 0x01,0x68,0x00,0x56,0x20,0x33,0x56,0x10,0x01,0x68,0x00,0x54,0x20,0x33,0x54,0x10, 0x01,0x68,0x00,0x52,0x20,0x33,0x52,0x10,0x01,0x68,0x00,0x60,0x20,0x33,0x60,0x10, 0x01,0x68,0x00,0x07,0x20,0x33,0x07,0x10,0x01,0x68,0x00,0x05,0x20,0x33,0x05,0x10, 0x01,0x68,0x00,0x03,0x20,0x33,0x03,0x10,0x01,0x68,0x00,0x09,0x20,0x33,0x09,0x10, 0x01,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x55,0x08,0x00,0x08, 0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x2c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x30,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x31,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x32,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x33,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x34,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x35,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x36,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x37,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1d,0x05,0x38,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x21,0x05,0x39,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x25,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x29,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x24,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x3d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x3e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1a,0x05,0x3f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1e,0x05,0x40,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x22,0x05,0x41,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x26,0x05,0x42,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2a,0x05,0x43,0x58,0x01,0xa4,0x01,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x0f,0x04,0x5e,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x13,0x04,0x5c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x17,0x04,0x5a,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x1b,0x04,0x58,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x1f,0x04,0x56,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x23,0x04,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x27,0x04,0x52,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x2b,0x04,0x60,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05,0x2c,0x05,0x44,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05,0x2d,0x05,0x48,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05,0x2e,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x2f,0x04,0x07,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x30,0x05,0x45,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x31,0x05,0x49,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x32,0x05,0x4e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x33,0x04,0x05,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x34,0x05,0x46,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x35,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x36,0x05,0x4f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x37,0x04,0x03,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x38,0x05,0x47,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x39,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3a,0x05,0x50,0x58,0x01,0xa4,0x01,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x3b,0x04,0x09,0x20,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00, 0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x85,0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15,0x02,0x84,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25,0x02,0x84,0x15,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35,0x02,0x84,0x19,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x02,0x84,0x1d,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x02,0x84,0x21,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x65,0x02,0x84,0x25,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x75,0x02,0x84,0x29,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x84,0x02,0x00,0x01,0x40,0x03,0x40, 0x03,0x61,0x00,0x00,0x00,0x58,0x01,0xc1,0x09,0x84,0x0d,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x0b,0x14,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x0d,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x0f,0x34,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x01,0x44,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x03,0x54,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x05,0x64,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1,0x07,0x74,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15,0x03,0x84,0x31,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25,0x03,0x84,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35,0x03,0x84,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10,0x84,0x02,0x00,0x01,0x80,0x05,0x80, 0x05,0x61,0x00,0x00,0x00,0x58,0x01,0xc1,0x00,0x84,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x58,0x01,0xc1,0x02,0x14,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x58,0x01,0xc1,0x04,0x24,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x58,0x01,0xc1,0x06,0x34,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x55,0x07,0x00,0x07, 0x00,0x40,0x00,0x01,0x68,0x42,0x01,0x11,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x01,0x68,0x38,0x01,0x11, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xfe,0xff, 0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x55,0x06,0x00,0x06, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x06,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x55,0x04,0x00,0x04, 0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x04,0x00,0x04, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x4e,0x00, 0x00,0x69,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x08,0x64,0x4c,0x00,0x06,0x04,0x08,0x00, 0x00,0x40,0x00,0x4c,0x68,0xe2,0x4c,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81, 0x01,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x07,0x06,0xa8,0x7a,0x4c,0x11,0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x05, 0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00,0x00,0x69,0x07,0x09,0x68,0x02,0x4c,0x21, 0x00,0x68,0x38,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45, 0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x40,0x00,0x4c,0xa8,0xe2,0x4c,0x11,0x08,0x31,0xdc,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcd,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x00,0x04,0xa8,0x4a,0x4c,0x11, 0x01,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45, 0x02,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x07,0x03,0x21,0x03,0x51,0x10,0x09,0x69,0x3e,0x07,0x68,0x6a,0x01,0x11, 0x00,0x41,0x00,0x09,0x68,0x6a,0x01,0x31,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x40,0x03,0x07,0xa8,0x02,0x4c,0x11, 0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11,0x09,0x31,0xf6,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x04,0x06,0x21,0x03,0x51,0x10, 0x05,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x02,0x07,0x21, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x03,0x68,0x02,0x4c,0x21,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x04,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x03,0x08,0x21,0x03,0x51,0x10, 0x02,0x40,0x03,0x0a,0x21,0x03,0x51,0x10,0x03,0x40,0x37,0x00,0x00,0x60,0x06,0x05, 0x06,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x18,0x00,0x18,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85, 0x01,0x84,0x01,0x00,0x05,0x40,0x00,0x40,0x00,0x31,0xd0,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xc1,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45, 0x05,0x04,0x04,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x02,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45, 0x07,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x06,0x04,0x68,0x42,0x4c,0x21, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x31,0xf2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x2c,0x00, 0x00,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x30,0x00, 0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x02,0x68,0x42,0x4c,0x21,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x32,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x05,0x21,0x03,0x51,0x10,0x04,0x40,0x02,0x06,0x21,0x03,0x51,0x10, 0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2f,0x00, 0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x33,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x4a,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x02,0x00,0x02, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x4a,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81,0x01,0x40,0x00,0x4c,0x68,0xe2,0x4c,0x01, 0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x06,0x02,0x68,0x02,0x4c,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65, 0x4c,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x00,0x4c,0xa8,0x4a,0x4c,0x11, 0x01,0x31,0xea,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00, 0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00, 0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x02,0x04,0x68,0x02,0x4c,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x00,0x00,0x00,0x20,0x82,0x45, 0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x31,0xfc,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x07,0x03,0x21,0x03,0x51,0x10,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x05,0x21,0x03,0x51,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x06,0x44,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xcd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x3e,0x07,0x68,0x5a,0x01,0x01, 0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x40,0x3d,0x03,0x68,0x5a,0x01,0x01,0x06,0x31,0xc6,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x14,0x2c,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45, 0x02,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x08,0x21,0x03,0x51,0x10, 0x03,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2e,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2f,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x48,0x00, 0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x08,0x00, 0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x48,0x00, 0x00,0x69,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x08,0x64,0x4c,0x00,0x06,0x04,0x08,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00, 0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00, 0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00, 0x00,0x31,0x94,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0xc4,0x01,0x00,0x05,0x18,0x00,0x18, 0x00,0x69,0x31,0x03,0x68,0x6a,0x01,0x41,0x00,0x41,0x32,0x05,0x68,0x6a,0x01,0x41, 0x01,0x41,0x34,0x02,0x68,0x6a,0x01,0xc1,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x45, 0x06,0x64,0x4c,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x03,0x64,0x4c,0x00,0x06,0x04,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x05,0x64,0x4c,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x02,0x64,0x4c,0x00,0x06,0x04,0x02,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x07,0x44,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x04,0x24,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x09,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x4c,0x68,0xe2,0x4c,0x01, 0x04,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x24,0x02,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xc8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1c,0x00, 0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x20,0x00, 0x00,0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00, 0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x28,0x00, 0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81,0x01,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x03,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x05,0x64,0x4c,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x02,0x64,0x4c,0x00,0x06,0x04,0x08,0x00,0x00,0x40,0x00,0x03,0xa8,0x7a,0x4c,0x11, 0x03,0x40,0x00,0x05,0xa8,0x7a,0x4c,0x11,0x05,0x68,0x38,0x00,0x00,0x20,0x82,0x45, 0x04,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x24,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x05,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x24,0x02,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x04,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x03,0x68,0x02,0x4c,0x21, 0x00,0x31,0xec,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00, 0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00, 0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00, 0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00, 0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x24,0x06,0x00, 0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x51,0x10, 0x03,0x40,0x36,0x04,0xa8,0x4a,0x4c,0x11,0x01,0x40,0x00,0x4c,0xa8,0xe2,0x4c,0x11, 0x02,0x41,0x00,0x03,0x68,0x6a,0x01,0x31,0x00,0x69,0x00,0x02,0x68,0x6a,0x01,0x11, 0x00,0x69,0x04,0x05,0x68,0x02,0x04,0x21,0x00,0x40,0x03,0x03,0xa8,0x62,0x4c,0x11, 0x03,0x40,0x03,0x02,0xa8,0x62,0x4c,0x11,0x02,0x40,0x00,0x04,0xa8,0x12,0x4c,0x11, 0x4c,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x07,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x0b,0x21,0x03,0x51,0x10,0x05,0x69,0x06,0x08,0x68,0xca,0x03,0x21, 0x00,0x69,0x06,0x06,0x68,0xca,0x02,0x21,0x00,0x69,0x06,0x05,0x68,0x02,0x04,0x21, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0xc4,0x01,0x00,0x05,0x06,0x00,0x06, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0xc4,0x01,0x00,0x05,0x05,0x00,0x05, 0x00,0x41,0x00,0x04,0x68,0x6a,0x01,0x71,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xf0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x03,0x04,0x4c,0x00,0x06,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x02,0x04,0x4c,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11, 0x04,0x31,0x41,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x0f,0x00, 0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x13,0x51,0x10, 0x08,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x13,0x51,0x10, 0x06,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x0a,0x21,0x03,0x51,0x10, 0x05,0x69,0x07,0x08,0x68,0xca,0x03,0x21,0x00,0x69,0x07,0x06,0x68,0xca,0x02,0x21, 0x00,0x69,0x06,0x05,0x68,0x02,0x4c,0x21,0x00,0x31,0x42,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xd3,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xe4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x03,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25, 0x02,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x07,0x21,0x13,0x51,0x10,0x06,0x01,0x34,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x09,0x21,0x13,0x51,0x10,0x08,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x05,0x0a,0x21,0x03,0x51,0x10,0x05,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x06,0x84,0x01,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x00,0x05,0xa8,0x5a,0x01,0x11, 0x08,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x01,0x84,0x01,0x00,0x05,0x40,0x00,0x40, 0x00,0x31,0xe9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00, 0x00,0x31,0xda,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x27,0x00, 0x00,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x2b,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0b,0x24,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x4c,0x44,0x4c,0x00,0x05,0x18,0x00,0x18, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x07,0x24,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x05,0x00,0x00,0x60,0x06,0x25, 0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x00,0x06,0xa8,0x5a,0x01,0x11, 0x06,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x35,0x00,0x00,0x20,0x82,0x45, 0x0a,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xeb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x2c,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x14,0x30,0x00,0x00,0x31,0xfe,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x14,0x34,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x14,0x38,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x25, 0x03,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x02,0xa8,0x42,0x4c,0x11, 0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x4c,0x00,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x04,0x08,0x00, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x07,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x03,0x00, 0x00,0x31,0xf6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x2e,0x00, 0x00,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x32,0x00, 0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x36,0x00, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x02,0x08,0x68,0x42,0x4c,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x07,0x07,0x68,0x22,0x03,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x07,0x04,0x68,0x02,0x02,0x21,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x3a,0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x07,0x09,0x21,0x13,0x51,0x10,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10,0x08,0x40,0x04,0x06,0x21,0x03,0x51,0x10, 0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x05,0x21,0x03,0x51,0x10, 0x04,0x31,0xd1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x2f,0x00, 0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x33,0x00, 0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x37,0x00, 0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x3b,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x40,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x06,0x00,0x06, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x40,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00, 0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00, 0x00,0x69,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1, 0x00,0x69,0x38,0x03,0x68,0x6a,0x01,0x41,0x00,0x41,0x39,0x05,0x68,0x6a,0x01,0x41, 0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x08,0x64,0x4c,0x00,0x06,0x04,0x08,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x03,0x64,0x4c,0x00,0x06,0x04,0x03,0x00, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x64,0x4c,0x00,0x06,0x04,0x05,0x00, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x4c,0x68,0xe2,0x4c,0x01,0x04,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x09,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x14,0x1c,0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x14,0x20,0x00,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81, 0x01,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x03,0x64,0x4c,0x00,0x06,0x04,0x06,0x00, 0x00,0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x35,0x00,0x00,0x60,0x06,0x05,0x02,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x40,0x00,0x08,0xa8,0x7a,0x4c,0x11,0x08,0x31,0xce,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x03,0xa8,0x7a,0x4c,0x11, 0x03,0x69,0x07,0x06,0x68,0x62,0x4c,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x04,0x24,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45, 0x0a,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3e,0x07,0xa8,0x4a,0x4c,0x11, 0x01,0x40,0x00,0x4c,0xa8,0xe2,0x4c,0x11,0x05,0x69,0x00,0x05,0x68,0x6a,0x01,0x11, 0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x12,0x00, 0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x16,0x00, 0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x02,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x05,0xa8,0x62,0x4c,0x11, 0x05,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x13,0x51,0x10, 0x06,0x69,0x07,0x08,0x68,0x02,0x07,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x06,0xc4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xe7,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xd0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x22,0x00,0x00,0x40,0x00,0x07,0xa8,0x12,0x4c,0x11, 0x4c,0x40,0x03,0x03,0x21,0x03,0x51,0x10,0x08,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x06,0x04,0x4c,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x07,0x02,0x68,0x22,0x05,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x05,0xc4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x31,0xf1,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xd2,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x13,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x04,0x68,0x22,0x06,0x21,0x00,0x40,0x02,0x4c,0xa8,0x12,0x4c,0x11, 0x05,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x03,0x68,0x02,0x07,0x21, 0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x03,0x51,0x10, 0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10, 0x04,0x40,0x03,0x08,0x21,0x03,0x51,0x10,0x03,0x69,0x05,0x02,0x68,0x02,0x4c,0x21, 0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00, 0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1b,0x00, 0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1f,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x06,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x03,0x51,0x10, 0x02,0x40,0x38,0x08,0xa8,0x5a,0x01,0x11,0x06,0x31,0xa9,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x23,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x04,0x24,0x06,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x03,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85, 0x01,0x84,0x01,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x2c,0x00, 0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x30,0x00, 0x00,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x34,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x4c,0x44,0x4c,0x00,0x05,0x18,0x00,0x18, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x69,0x04,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x4c,0x00,0x05,0x02,0x00,0x02, 0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2e,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x04,0x06,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x3c,0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x05,0x00, 0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x32,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x03,0x08,0x68,0x02,0x02,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x42,0x4c,0x21, 0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x36,0x00, 0x00,0x40,0x07,0x07,0x21,0x13,0x51,0x10,0x05,0x01,0x39,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x03,0x09,0x21,0x03,0x51,0x10,0x08,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x03,0x21,0x03,0x51,0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x2f,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x33,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x37,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0x3a,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05, 0x0c,0x05,0x2c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x10,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x14,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x18,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1c,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x20,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x24,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x28,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05, 0x0d,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x11,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x15,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x19,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1d,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x21,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x25,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x29,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x24,0x04,0x00,0x10,0x01,0x05, 0x0e,0x05,0x3c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x12,0x05,0x3d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x16,0x05,0x3e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1a,0x05,0x3f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1e,0x05,0x40,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x22,0x05,0x41,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x26,0x05,0x42,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x2a,0x05,0x43,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05, 0x2c,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05, 0x2d,0x05,0x48,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x25,0x04,0x00,0x10,0x01,0x05, 0x2e,0x05,0x4d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x30,0x05,0x45,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x31,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x32,0x05,0x4e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x34,0x05,0x46,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x35,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x36,0x05,0x4f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x38,0x05,0x47,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x39,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x3a,0x05,0x50,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x85, 0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x02,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x02,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x02,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45, 0x02,0x04,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55, 0x02,0x04,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x65, 0x02,0x04,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x75, 0x02,0x04,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x61,0x00,0x00,0x00,0x58,0x01,0x81, 0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0b,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0d,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0f,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x01,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x03,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x05,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x07,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x03,0x04,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x03,0x04,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x03,0x04,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00,0x00,0x58,0x01,0x81, 0x00,0x04,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x81, 0x02,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x81, 0x04,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x81, 0x06,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x42,0x01,0x11, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x61,0x02,0x01,0x68,0x38,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x35,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x68,0x6a,0x01,0x31, 0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x01, 0x01,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00, 0x00,0x40,0x05,0x06,0xa8,0x7a,0x4c,0x11,0x06,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x03,0x68,0x02,0x4c,0x21,0x00,0x40,0x06,0x4c,0xa8,0xe2,0x4c,0x11, 0x08,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x00,0x08,0x68,0x6a,0x01,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x02,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x04,0x21,0x03,0x51,0x10, 0x03,0x41,0x00,0x03,0x68,0x6a,0x01,0x31,0x00,0x31,0xe9,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00,0x00,0x40,0x04,0x08,0xa8,0x02,0x4c,0x11, 0x08,0x40,0x39,0x05,0xa8,0x4a,0x4c,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11, 0x03,0x31,0xec,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x02,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x04,0x68,0x02,0x4c,0x21,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x05,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x10,0x00,0x10,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10, 0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x07,0x21,0x03,0x51,0x10,0x06,0x40,0x06,0x0a,0x21,0x03,0x51,0x10, 0x04,0x69,0x05,0x03,0x68,0x42,0x4c,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x4c,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xde,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x06,0x04,0x05,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x02,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x04,0x68,0x42,0x4c,0x21, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x07,0x21,0x03,0x51,0x10, 0x03,0x31,0xd6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x2c,0x00, 0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x30,0x00, 0x00,0x40,0x03,0x05,0x21,0x03,0x51,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb0,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x32,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x32,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x32,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x01, 0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4c,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x69,0x02,0x05,0x68,0x02,0x4c,0x21,0x00,0x40,0x00,0x4c,0xa8,0x4a,0x4c,0x11, 0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x04,0x02,0x68,0x02,0x4c,0x21,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x14,0x10,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45, 0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x07,0x06,0x21,0x03,0x51,0x10, 0x05,0x40,0x03,0x07,0x21,0x03,0x51,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x33,0x04,0x68,0x5a,0x01,0x01, 0x04,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e,0x00, 0x00,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x4c,0x00,0x06,0xff,0xff,0xff, 0x0f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x40,0x03,0x05,0x21,0x03,0x51,0x10,0x04,0x31,0xb8,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x14,0x2c,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x31,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0x31,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x68,0x6a,0x01,0x31, 0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05, 0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x08,0x64,0x4c,0x00,0x06,0x04,0x08,0x00,0x00,0x69,0x3b,0x03,0x68,0x6a,0x01,0x41, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x04,0x03,0xa8,0x7a,0x4c,0x11,0x03,0x31,0xcc,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00,0x00,0x31,0xba,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x01, 0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0xc4,0x01,0x00,0x05,0x18,0x00,0x18, 0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x41,0x3c,0x05,0x68,0x6a,0x01,0x41,0x01,0x41,0x3d,0x02,0x68,0x6a,0x01,0xc1, 0x01,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1c,0x00, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x08,0x04,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x24,0x06,0x00, 0x00,0x40,0x04,0x05,0xa8,0x7a,0x4c,0x11,0x05,0x69,0x3e,0x04,0x68,0x02,0x4c,0x21, 0x00,0x40,0x05,0x4c,0xa8,0xe2,0x4c,0x11,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x05,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x00,0x02,0x68,0x6a,0x01,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x03,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x06,0x68,0xca,0x08,0x21, 0x00,0x40,0x07,0x05,0x21,0x03,0x51,0x10,0x04,0x41,0x00,0x04,0x68,0x6a,0x01,0x31, 0x00,0x31,0xef,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x20,0x00, 0x00,0x31,0xf6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x24,0x00, 0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x28,0x00, 0x00,0x40,0x05,0x02,0xa8,0x62,0x4c,0x11,0x02,0x40,0x02,0x04,0xa8,0x62,0x4c,0x11, 0x04,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x13,0x51,0x10, 0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x06,0x04,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00, 0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00, 0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x22,0x02,0x21, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x05,0x05,0x68,0x22,0x04,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x07,0x68,0x22,0x06,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x02,0xc4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x04,0xc4,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x06,0xc4,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x02,0x04,0x4c,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25, 0x04,0x04,0x4c,0x00,0x06,0x24,0x04,0x00,0x00,0x40,0x03,0x4c,0xa8,0x12,0x4c,0x11, 0x06,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x51,0x10, 0x03,0x40,0x07,0x0a,0x21,0x03,0x51,0x10,0x05,0x40,0x07,0x0b,0x21,0x03,0x51,0x10, 0x07,0x69,0x06,0x03,0x68,0x22,0x02,0x21,0x00,0x69,0x06,0x05,0x68,0x22,0x04,0x21, 0x00,0x69,0x06,0x07,0x68,0x02,0x4c,0x21,0x00,0x31,0xe8,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd9,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x40,0x00,0x06,0xa8,0x5a,0x01,0x11, 0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x02,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x0a,0x21,0x03,0x51,0x10, 0x05,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x0b,0x21,0x03,0x51,0x10,0x07,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x10,0x00,0x10,0x00,0x31,0xc3,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x08,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x05,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x03,0x24,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25, 0x04,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x02,0xa8,0x42,0x4c,0x11, 0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x4c,0x00,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x04,0x00, 0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x2c,0x00, 0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x30,0x00, 0x00,0x31,0xe5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x34,0x00, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x05,0x08,0x68,0x02,0x02,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x07,0x05,0x68,0x22,0x04,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x09,0x68,0x42,0x4c,0x21,0x00,0x31,0xce,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x38,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x03,0x21,0x13,0x51,0x10,0x02,0x40,0x03,0x06,0x21,0x03,0x51,0x10, 0x05,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x51,0x10, 0x09,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x51,0x10, 0x08,0x31,0xda,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2e,0x00, 0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x32,0x00, 0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x36,0x00, 0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x3a,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x2b,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x06,0x00,0x06, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x2b,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xa0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0c,0x00, 0x00,0x31,0x91,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x10,0x00, 0x00,0x69,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1, 0x00,0x69,0x30,0x03,0x68,0x6a,0x01,0x41,0x00,0x41,0x31,0x05,0x68,0x6a,0x01,0x41, 0x01,0x40,0x00,0x4c,0x68,0x02,0x4c,0x01,0x01,0x40,0x05,0x00,0x00,0x60,0x06,0x25, 0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x05,0x08,0xa8,0x7a,0x4c,0x11, 0x08,0x40,0x05,0x03,0xa8,0x7a,0x4c,0x11,0x03,0x40,0x05,0x4c,0xa8,0xe2,0x4c,0x11, 0x05,0x69,0x00,0x05,0x68,0x6a,0x01,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x02,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x06,0x68,0x62,0x4c,0x21, 0x00,0x40,0x04,0x05,0xa8,0x62,0x4c,0x11,0x05,0x31,0xc8,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x14,0x14,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x14,0x18,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x08,0x68,0x22,0x05,0x21, 0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x13,0x51,0x10, 0x06,0x40,0x39,0x02,0xa8,0x4a,0x4c,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x05,0xc4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x06,0xc4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xf2,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x14,0x1c,0x00,0x00,0x31,0xe3,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x14,0x20,0x00,0x00,0x69,0x03,0x03,0x68,0x02,0x02,0x21, 0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x06,0x04,0x4c,0x00,0x06,0x24,0x06,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x00,0x02,0xa8,0x12,0x4c,0x11,0x4c,0x40,0x06,0x4c,0xa8,0x12,0x4c,0x11, 0x05,0x31,0xfb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0e,0x00, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x51,0x10, 0x08,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x04,0x21,0x03,0x51,0x10,0x03,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x06,0x07,0x68,0x22,0x06,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x4c,0x21, 0x00,0x69,0x06,0x03,0x68,0x02,0x02,0x21,0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xdc,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25, 0x06,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x05,0x0a,0x21,0x03,0x51,0x10, 0x07,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x04,0x21,0x03,0x51,0x10,0x03,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10,0x08,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x10,0x00,0x10,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x22,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x06,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x02,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x07,0x24,0x06,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x05,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x3e,0x04,0x68,0x42,0x4c,0x21, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x05,0x00, 0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2c,0x00, 0x00,0x31,0xef,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x30,0x00, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x05,0x07,0x68,0x22,0x05,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x02,0x68,0x42,0x4c,0x21,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x14,0x34,0x00,0x00,0x40,0x06,0x08,0x21,0x03,0x51,0x10, 0x04,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x03,0x51,0x10, 0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03,0x21,0x03,0x51,0x10, 0x02,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2e,0x00, 0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x32,0x00, 0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x36,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x27,0x00, 0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x01,0x00,0x11,0x02,0x00,0x02, 0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x09,0x00, 0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0xe4,0x01,0x00,0x11,0x01,0x00,0x01, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x26,0x00, 0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x55,0x08,0x00,0x08, 0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x2c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x1c,0x05,0x30,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x20,0x05,0x31,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x24,0x05,0x32,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x28,0x05,0x33,0x58,0x01,0xa4,0x01,0x00, 0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05, 0x34,0x05,0x46,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x38,0x05,0x47,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x2c,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x30,0x05,0x45,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x33,0x00,0x00,0x50,0x85,0x85, 0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x02,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x02,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x02,0x04,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45, 0x02,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55, 0x02,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x65, 0x02,0x04,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x75, 0x02,0x04,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00,0x00,0x58,0x01,0x81, 0x09,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0b,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0d,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x0f,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x01,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x03,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x05,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0x81, 0x07,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x03,0x04,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x03,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x03,0x04,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00,0x00,0x58,0x01,0x01, 0x00,0x04,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x01, 0x02,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x01, 0x04,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x01, 0x06,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x42,0x01,0x11, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x61,0x02,0x01,0x68,0x38,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x23,0x00,0x00,0x40,0x00,0x03,0xa8,0x4a,0x4c,0x11, 0x01,0x69,0x00,0x06,0x68,0x6a,0x01,0x11,0x00,0x41,0x00,0x09,0x68,0x6a,0x01,0x31, 0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x33,0x02,0x21,0x1b,0x51,0x10, 0x4c,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x69,0x06,0x04,0x68,0x02,0x03,0x21,0x00,0x40,0x06,0x06,0xa8,0x02,0x4c,0x11, 0x06,0x40,0x06,0x4c,0xa8,0x02,0x4c,0x11,0x09,0x31,0xe8,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x03,0x05,0x21,0x03,0x51,0x10, 0x04,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x03,0x02,0x68,0x02,0x4c,0x21,0x00,0x69,0x07,0x04,0x68,0x42,0x4c,0x21, 0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00, 0x00,0x40,0x00,0x03,0x21,0x0b,0x51,0x10,0x01,0x40,0x04,0x08,0x21,0x03,0x51,0x10, 0x07,0x40,0x04,0x0a,0x21,0x03,0x51,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x05,0x21,0x03,0x51,0x10,0x04,0x31,0xba,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xcc,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x30,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x22,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x22,0x00,0x00,0x40,0x00,0x4c,0xa8,0x4a,0x4c,0x11, 0x01,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x33,0x02,0x21,0x1b,0x51,0x10, 0x4c,0x69,0x02,0x03,0x68,0x02,0x4c,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x05,0x21,0x0b,0x51,0x10, 0x01,0x40,0x03,0x04,0x21,0x03,0x51,0x10,0x03,0x31,0xde,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x21,0x00,0x00,0x40,0x00,0x03,0xa8,0x4a,0x4c,0x11, 0x01,0x69,0x00,0x06,0x68,0x6a,0x01,0x11,0x00,0x69,0x02,0x04,0x68,0x02,0x03,0x21, 0x00,0x40,0x02,0x06,0xa8,0x62,0x4c,0x11,0x06,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x33,0x02,0x21,0x1b,0x51,0x10,0x4c,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x41,0x00,0x09,0x68,0x6a,0x01,0x31, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x04,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x06,0x05,0x21,0x03,0x51,0x10,0x04,0x69,0x06,0x07,0x68,0x22,0x06,0x21, 0x00,0x31,0xe7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00, 0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00, 0x00,0x40,0x04,0x09,0xa8,0x62,0x4c,0x11,0x09,0x69,0x04,0x03,0x68,0x22,0x4c,0x21, 0x00,0x40,0x03,0x08,0x21,0x03,0x51,0x10,0x07,0x41,0x32,0x05,0x68,0x6a,0x01,0x51, 0x00,0x31,0xa3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x02,0x68,0x22,0x09,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x51,0x10, 0x03,0x40,0x03,0x05,0xa8,0x02,0x4c,0x11,0x05,0x41,0x33,0x08,0x68,0x6a,0x01,0x61, 0x00,0x41,0x00,0x03,0x68,0x6a,0x01,0x71,0x00,0x40,0x05,0x0a,0x21,0x03,0x51,0x10, 0x02,0x69,0x04,0x06,0x68,0x62,0x05,0x21,0x00,0x40,0x04,0x08,0xa8,0x02,0x4c,0x11, 0x08,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11,0x03,0x31,0xc4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xf5,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x40,0x00,0x06,0xa8,0x42,0x4c,0x11, 0x06,0x40,0x04,0x07,0x21,0x13,0x51,0x10,0x06,0x69,0x04,0x02,0x68,0x02,0x08,0x21, 0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4c,0x21, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x06,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x09,0x00, 0x00,0x31,0xd0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00, 0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10, 0x02,0x40,0x04,0x0b,0x21,0x03,0x51,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x22,0x06,0x21, 0x00,0x69,0x07,0x02,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x04,0x68,0x42,0x4c,0x21, 0x00,0x31,0xd8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x24,0x00, 0x00,0x40,0x00,0x05,0x21,0x0b,0x51,0x10,0x01,0x40,0x04,0x08,0x21,0x03,0x51,0x10, 0x07,0x40,0x04,0x03,0x21,0x03,0x51,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10, 0x04,0x31,0xf9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x28,0x00, 0x00,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2c,0x00, 0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x30,0x00, 0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x34,0x00, 0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x38,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x1f,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x06,0x00,0x06, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x1f,0x00, 0x00,0x40,0x00,0x03,0xa8,0x4a,0x4c,0x11,0x01,0x41,0x00,0x09,0x68,0x6a,0x01,0x31, 0x00,0x69,0x02,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x33,0x02,0x21,0x1b,0x51,0x10,0x4c,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x00,0x06,0x68,0x6a,0x01,0x11, 0x00,0x40,0x05,0x09,0xa8,0x02,0x4c,0x11,0x09,0x40,0x05,0x05,0x21,0x03,0x51,0x10, 0x04,0x31,0xde,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00, 0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x04,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x04,0x06,0xa8,0x62,0x4c,0x11,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x02,0x68,0x02,0x09,0x21,0x00,0x41,0x3f,0x05,0x68,0x6a,0x01,0x51, 0x00,0x69,0x04,0x03,0x68,0x22,0x4c,0x21,0x00,0x69,0x04,0x07,0x68,0x22,0x06,0x21, 0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10,0x02,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11, 0x05,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x06,0x00, 0x00,0x40,0x06,0x04,0x21,0x03,0x51,0x10,0x03,0x40,0x06,0x08,0x21,0x03,0x51,0x10, 0x07,0x69,0x05,0x06,0x68,0x62,0x4c,0x21,0x00,0x69,0x05,0x09,0x68,0x02,0x02,0x21, 0x00,0x69,0x05,0x03,0x68,0x42,0x4c,0x21,0x00,0x31,0xc6,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xf7,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xd1,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x40,0x03,0x07,0x21,0x13,0x51,0x10, 0x06,0x40,0x36,0x08,0x21,0x0b,0x51,0x10,0x01,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x0a,0x21,0x03,0x51,0x10,0x09,0x01,0x31,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x04,0x21,0x03,0x51,0x10,0x03,0x31,0xc2,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x34,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x90,0x1d,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x55,0x08,0x00,0x08,0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05, 0x0c,0x05,0x2c,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x10,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x14,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x18,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1c,0x05,0x30,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x20,0x05,0x31,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x24,0x05,0x32,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x28,0x05,0x33,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x22,0x04,0x00,0x10,0x01,0x05, 0x0d,0x05,0x34,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x11,0x05,0x35,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x15,0x05,0x36,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x19,0x05,0x37,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x1d,0x05,0x38,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x21,0x05,0x39,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x25,0x05,0x3a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x29,0x05,0x3b,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x21,0x04,0x00,0x10,0x01,0x05, 0x2c,0x05,0x44,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x23,0x04,0x00,0x10,0x01,0x05, 0x2d,0x05,0x48,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x30,0x05,0x45,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x31,0x05,0x49,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x34,0x05,0x46,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x35,0x05,0x4a,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x38,0x05,0x47,0x58,0x01,0xa4,0x01,0x00,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x39,0x05,0x4b,0x58,0x01,0xa4,0x01,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x69,0x35,0x00,0x00,0x50,0x85,0x85, 0x02,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x02,0x84,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x02,0x84,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x02,0x84,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45, 0x02,0x84,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55, 0x02,0x84,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x65, 0x02,0x84,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x75, 0x02,0x84,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x20,0x03,0x20,0x03,0x61,0x00,0x00,0x00,0x58,0x01,0xc1, 0x09,0x84,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x0b,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x0d,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x0f,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x01,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x03,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x05,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x58,0x01,0xc1, 0x07,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15, 0x03,0x84,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25, 0x03,0x84,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35, 0x03,0x84,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01, 0x10,0x84,0x02,0x00,0x01,0x80,0x05,0x80,0x05,0x61,0x00,0x00,0x00,0x58,0x01,0x41, 0x00,0x84,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x41, 0x02,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x41, 0x04,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x58,0x01,0x41, 0x06,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x44,0x01,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x42,0x01,0x11, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x61,0x02,0x01,0x68,0x38,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x19,0x00,0x00,0x68,0x35,0x00,0x00,0x20,0x82,0x05, 0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x68,0x6a,0x01,0x31, 0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81, 0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00, 0x00,0x40,0x05,0x06,0xa8,0x7a,0x4c,0x11,0x06,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x04,0x03,0x68,0x02,0x4c,0x21,0x00,0x40,0x06,0x4c,0xa8,0xe2,0x4c,0x11, 0x08,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x00,0x08,0x68,0x6a,0x01,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x02,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x04,0x21,0x03,0x51,0x10, 0x03,0x41,0x00,0x03,0x68,0x6a,0x01,0x31,0x00,0x31,0xe9,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x18,0x00,0x00,0x40,0x04,0x08,0xa8,0x02,0x4c,0x11, 0x08,0x40,0x39,0x05,0xa8,0x4a,0x4c,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x4c,0xa8,0x02,0x4c,0x11, 0x03,0x31,0xec,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x02,0x08,0x21, 0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x4c,0x21, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x05,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x4c,0x44,0x4c,0x00,0x05,0x08,0x00,0x08, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x07,0x21,0x03,0x51,0x10,0x06,0x40,0x06,0x0a,0x21,0x03,0x51,0x10, 0x04,0x69,0x05,0x03,0x68,0x42,0x4c,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x4c,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xde,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x06,0x04,0x05,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x02,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x04,0x68,0x42,0x4c,0x21, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x07,0x21,0x03,0x51,0x10,0x03,0x31,0xd1,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xc2,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x30,0x00,0x00,0x40,0x03,0x05,0x21,0x03,0x51,0x10, 0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2d,0x00, 0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x31,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x17,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x02,0x00,0x02, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x16,0x00, 0x00,0x68,0x35,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65, 0x4c,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4c,0x21, 0x00,0x40,0x00,0x4c,0xa8,0x4a,0x4c,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45, 0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x04,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x02,0x4c,0x21, 0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00, 0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x07,0x06,0x21,0x03,0x51,0x10,0x05,0x40,0x03,0x07,0x21,0x03,0x51,0x10, 0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x30,0x04,0x68,0x5a,0x01,0x01,0x02,0x31,0xc4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x4c,0x00,0x06,0xff,0xff,0xff, 0x0f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x40,0x03,0x05,0x21,0x03,0x51,0x10,0x04,0x31,0xb8,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x90,0x15,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x15,0x00,0x00,0x68,0x35,0x00,0x00,0x20,0x82,0x05, 0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x68,0x6a,0x01,0x31, 0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05, 0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x08,0x64,0x4c,0x00,0x06,0x04,0x08,0x00,0x00,0x69,0x3b,0x03,0x68,0x6a,0x01,0x41, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x24,0x08,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x04,0x03,0xa8,0x7a,0x4c,0x11,0x03,0x31,0xcc,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xba,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x18,0x00,0x00,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0xc4,0x01,0x00,0x05,0x18,0x00,0x18, 0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x41,0x3c,0x05,0x68,0x6a,0x01,0x41,0x01,0x41,0x3d,0x02,0x68,0x6a,0x01,0xc1, 0x01,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x08,0x04,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x06,0x64,0x4c,0x00,0x06,0x24,0x06,0x00, 0x00,0x40,0x04,0x05,0xa8,0x7a,0x4c,0x11,0x05,0x69,0x3e,0x04,0x68,0x02,0x4c,0x21, 0x00,0x40,0x05,0x4c,0xa8,0xe2,0x4c,0x11,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x05,0x00,0x01,0x04,0x00,0x04, 0x00,0x69,0x00,0x02,0x68,0x6a,0x01,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x03,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x06,0x68,0xca,0x08,0x21, 0x00,0x40,0x07,0x05,0x21,0x03,0x51,0x10,0x04,0x41,0x00,0x04,0x68,0x6a,0x01,0x31, 0x00,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00, 0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00, 0x00,0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28,0x00, 0x00,0x40,0x05,0x02,0xa8,0x62,0x4c,0x11,0x02,0x40,0x02,0x04,0xa8,0x62,0x4c,0x11, 0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x05,0x07,0x21,0x13,0x51,0x10,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x06,0x04,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x31,0xf3,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x69,0x05,0x03,0x68,0x22,0x02,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x22,0x04,0x21, 0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x22,0x06,0x21, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0xc4,0x01,0x00,0x05,0x05,0x00,0x05, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x04,0xc4,0x01,0x00,0x05,0x06,0x00,0x06, 0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0xc4,0x01,0x00,0x05,0x07,0x00,0x07, 0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x02,0x04,0x4c,0x00,0x06,0x24,0x02,0x00, 0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x04,0x04,0x4c,0x00,0x06,0x24,0x04,0x00, 0x00,0x40,0x03,0x4c,0xa8,0x12,0x4c,0x11,0x06,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x07,0x09,0x21,0x03,0x51,0x10,0x03,0x40,0x07,0x0a,0x21,0x03,0x51,0x10, 0x05,0x40,0x07,0x0b,0x21,0x03,0x51,0x10,0x07,0x69,0x06,0x03,0x68,0x22,0x02,0x21, 0x00,0x69,0x06,0x05,0x68,0x22,0x04,0x21,0x00,0x69,0x06,0x07,0x68,0x02,0x4c,0x21, 0x00,0x31,0xe7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00, 0x00,0x31,0xd8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00, 0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1d,0x00, 0x00,0x40,0x00,0x06,0xa8,0x5a,0x01,0x11,0x06,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25, 0x02,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10,0x03,0x01,0x38,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x0a,0x21,0x03,0x51,0x10,0x05,0x01,0x39,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x0b,0x21,0x03,0x51,0x10,0x07,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x08,0x00,0x08,0x00,0x31,0xc0,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0b,0x00,0xa0,0x0c,0x29,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x08,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x05,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x03,0x24,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x30,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x06,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x04,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00, 0x00,0x40,0x00,0x02,0xa8,0x42,0x4c,0x11,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0x25, 0x02,0x44,0x4c,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45, 0x4c,0x44,0x4c,0x00,0x06,0x04,0x04,0x00,0x00,0x31,0xfc,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x05,0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0xe5,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x34,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x07,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x08,0x68,0x02,0x02,0x21, 0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x68,0x22,0x04,0x21, 0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x42,0x4c,0x21, 0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x38,0x00, 0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x03,0x21,0x13,0x51,0x10, 0x02,0x40,0x03,0x06,0x21,0x03,0x51,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x07,0x21,0x03,0x51,0x10,0x08,0x01,0x01,0x00,0xe8,0x01,0x00,0x11, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x51,0x10, 0x09,0x31,0xda,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2d,0x00, 0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x31,0x00, 0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x35,0x00, 0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x39,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0f,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x06,0x00,0x06, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0f,0x00, 0x00,0x68,0x35,0x00,0x00,0x20,0x82,0x05,0x02,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff, 0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00, 0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00, 0x00,0x69,0x00,0x06,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x08,0x68,0x6a,0x01,0xc1, 0x00,0x69,0x33,0x03,0x68,0x6a,0x01,0x41,0x00,0x41,0x36,0x05,0x68,0x6a,0x01,0x41, 0x01,0x40,0x00,0x4c,0x68,0x02,0x4c,0x81,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25, 0x06,0x64,0x4c,0x00,0x06,0x04,0x06,0x00,0x00,0x40,0x05,0x08,0xa8,0x7a,0x4c,0x11, 0x08,0x40,0x05,0x03,0xa8,0x7a,0x4c,0x11,0x03,0x40,0x05,0x4c,0xa8,0xe2,0x4c,0x11, 0x05,0x69,0x00,0x05,0x68,0x6a,0x01,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x07,0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x02,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x06,0x68,0x62,0x4c,0x21, 0x00,0x40,0x04,0x05,0xa8,0x62,0x4c,0x11,0x05,0x31,0xc7,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb8,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x0c,0x18,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x09,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x07,0x21,0x13,0x51,0x10,0x06,0x69,0x04,0x08,0x68,0x22,0x05,0x21, 0x00,0x40,0x38,0x02,0xa8,0x4a,0x4c,0x11,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x06,0xc4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x05,0xc4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xe0,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x69,0x03,0x03,0x68,0x02,0x02,0x21, 0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x06,0x04,0x4c,0x00,0x06,0x24,0x06,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03, 0x02,0x40,0x00,0x02,0xa8,0x12,0x4c,0x11,0x4c,0x40,0x05,0x4c,0xa8,0x12,0x4c,0x11, 0x05,0x31,0xfb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0d,0x00, 0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x51,0x10, 0x08,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x04,0x21,0x03,0x51,0x10, 0x03,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x07,0x68,0x22,0x06,0x21, 0x00,0x69,0x04,0x08,0x68,0x02,0x4c,0x21,0x00,0x69,0x06,0x03,0x68,0x02,0x02,0x21, 0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00, 0x00,0x31,0xdc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x06,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x05,0x0a,0x21,0x03,0x51,0x10,0x07,0x01,0x34,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x04,0x21,0x03,0x51,0x10,0x03,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x06,0x09,0x21,0x03,0x51,0x10,0x08,0x40,0x00,0x00,0x00,0x60,0x86,0x45, 0x4c,0x44,0x4c,0x00,0x05,0x08,0x00,0x08,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x06,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x02,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x07,0x24,0x06,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x05,0x44,0x4c,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x3e,0x04,0x68,0x42,0x4c,0x21, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x4c,0x44,0x4c,0x00,0x06,0x04,0x05,0x00, 0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2c,0x00, 0x00,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x30,0x00, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x22,0x05,0x21, 0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x02,0x68,0x42,0x4c,0x21, 0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x34,0x00, 0x00,0x40,0x06,0x08,0x21,0x03,0x51,0x10,0x04,0x01,0x35,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x03,0x09,0x21,0x03,0x51,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x31,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x04,0x03,0x21,0x03,0x51,0x10,0x02,0x31,0xc2,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x0c,0x31,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x0c,0x35,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x40,0x00,0x02,0x68,0x5a,0x4c,0x01, 0x02,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x25, 0x02,0x84,0x4c,0x00,0x05,0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x05,0x03,0x62,0x00,0x02,0x11, 0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xe4,0x4c,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x84,0x4c,0x00,0x05,0x60,0x00,0x60, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11, 0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x05,0x03,0x62,0x20,0x02,0x11, 0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x55,0x06,0x00,0x06, 0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x0c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x03,0x62,0x40,0x02,0x11, 0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x4d,0x05,0x2c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x14,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x39,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x03, 0x00,0x61,0x00,0x03,0x62,0x58,0x4c,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x03,0xa4,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x48,0x05,0x2d,0x58,0x01,0xa4,0x01,0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x05, 0x1c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x03,0x62,0x00,0x02,0x11, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x44,0x05,0x2e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x20,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x3b,0x03,0x62,0x20,0x02,0x11,0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05, 0x40,0x05,0x2f,0x58,0x01,0xa4,0x01,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05, 0x24,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x34,0x03,0x62,0x40,0x02,0x11, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3c,0x05,0x30,0x58,0x01,0xa4,0x01,0x00, 0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x05,0x28,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x38,0x05,0x31,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x34,0x05,0x32,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2c,0x05,0x33,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x27,0x04,0x00,0x10,0x01,0x05,0x4e,0x05,0x04,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x49,0x05,0x05,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x45,0x05,0x06,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x41,0x05,0x07,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3d,0x05,0x08,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x39,0x05,0x09,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x35,0x05,0x0a,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2d,0x05,0x0b,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x28,0x04,0x00,0x10,0x01,0x05,0x4f,0x05,0x0c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x4a,0x05,0x0d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x46,0x05,0x0e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x42,0x05,0x0f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3e,0x05,0x10,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3a,0x05,0x11,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x36,0x05,0x12,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2e,0x05,0x13,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x29,0x04,0x00,0x10,0x01,0x05,0x50,0x05,0x14,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x4b,0x05,0x15,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x47,0x05,0x16,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x43,0x05,0x17,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3f,0x05,0x18,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x3b,0x05,0x19,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x37,0x05,0x1a,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x2f,0x05,0x1b,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x20,0x04,0x00,0x10,0x01,0x05,0x0a,0x05,0x1f,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x2b,0x04,0x00,0x10,0x01,0x05,0x0b,0x05,0x23,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0e,0x05,0x1e,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x24,0x04,0x00,0x10,0x01,0x05,0x0c,0x05,0x27,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x0f,0x05,0x22,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x10,0x05,0x26,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x2c,0x04,0x00,0x10,0x01,0x05,0x0d,0x05,0x2b,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x11,0x05,0x2a,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x12,0x05,0x1d,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x13,0x05,0x21,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x14,0x05,0x25,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x15,0x05,0x29,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x16,0x05,0x1c,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x17,0x05,0x20,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x18,0x05,0x24,0x58,0x01,0xa4,0x01,0x00, 0x00,0x68,0x00,0x04,0x00,0x10,0x01,0x05,0x19,0x05,0x28,0x58,0x01,0xa4,0x01,0x00, 0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x55,0x04,0x00,0x04, 0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x04,0x00,0x04, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x06,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4c,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x69,0x00,0x05,0x68,0x6a,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0xc1, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x4c,0x00,0x06,0xff,0xff,0xff, 0x0f,0x40,0x07,0x05,0xa8,0x7a,0x4c,0x11,0x05,0x40,0x07,0x4c,0xa8,0xe2,0x4c,0x11, 0x07,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x4d,0x00, 0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x64,0x4c,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x02,0x44,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xdf,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x24,0x48,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x24,0x44,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x24,0x40,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x24,0x16,0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x24,0x12,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01, 0x00,0x64,0x01,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x4c,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65, 0x4c,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45, 0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x02,0x04,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x03,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x04,0x44,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xb4,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x24,0x48,0x00,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x24,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x04,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05, 0x4c,0x04,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05, 0x03,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00,0x00,0x69,0x00,0x05,0x68,0x6a,0x01,0x31, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a, 0x02,0x41,0x00,0x07,0x68,0x6a,0x01,0xc1,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45, 0x02,0x04,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25, 0x05,0x64,0x4c,0x00,0x06,0x04,0x05,0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x24,0x48,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x07,0x64,0x4c,0x00,0x06,0x04,0x07,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45, 0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x02,0x68,0x6a,0x01,0x41, 0x00,0x41,0x38,0x04,0x68,0x6a,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x05,0xc4,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x02,0xa8,0x7a,0x4c,0x11, 0x02,0x40,0x04,0x04,0xa8,0x7a,0x4c,0x11,0x04,0x40,0x04,0x00,0x00,0x60,0x06,0x25, 0x05,0x64,0x4c,0x00,0x06,0x24,0x05,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25, 0x07,0xc4,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00,0x31,0xf9,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x24,0x44,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45, 0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25, 0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00,0x00,0x40,0x00,0x05,0xa8,0x5a,0x01,0x11, 0x05,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x04,0x00,0x01,0x04,0x00,0x04, 0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x4c,0x64,0x4c,0x00,0x06,0x24,0x07,0x00, 0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x07,0x00,0x00,0x31,0x4a,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x24,0x40,0x00,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x24,0x3c,0x00,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x24,0x34,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45, 0x04,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x02,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x84,0x01,0x00,0x01,0x04,0x00,0x04, 0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45, 0x03,0x44,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11, 0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04, 0x00,0x31,0xce,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x2c,0x00, 0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x16,0x00, 0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x12,0x00, 0x00,0x31,0x91,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x0e,0x00, 0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x0a,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00, 0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x06,0x00,0x06, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00, 0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4c,0x04,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4c,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a, 0x02,0x69,0x00,0x05,0x68,0x6a,0x01,0x31,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45, 0x02,0x04,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45, 0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0x94,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x04,0x00,0xa0,0x24,0x48,0x00,0x00,0x41,0x00,0x07,0x68,0x6a,0x01,0xc1, 0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x64,0x4c,0x00,0x06,0x04,0x05,0x00, 0x00,0x69,0x33,0x02,0x68,0x6a,0x01,0x41,0x00,0x41,0x34,0x04,0x68,0x6a,0x01,0x41, 0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x4c,0x44,0x4c,0x00,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x4c,0x84,0x01,0x00,0x06,0x24,0x4c,0x00, 0x00,0x40,0x06,0x07,0xa8,0x7a,0x4c,0x11,0x07,0x68,0x06,0x00,0x00,0x20,0x82,0x45, 0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x02,0xa8,0x7a,0x4c,0x11, 0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x01,0x84,0x01,0x00,0x06,0x04,0x05,0x00, 0x00,0x40,0x07,0x4c,0xa8,0xe2,0x4c,0x11,0x04,0x31,0xc5,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x24,0x44,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45, 0x07,0x24,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45, 0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x03,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x02,0x84,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45, 0x09,0x64,0x4c,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x35,0x00,0x00,0x60,0x86,0x45, 0x06,0x44,0x4c,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xd6,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x08,0x00,0xa0,0x24,0x40,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xa0,0x24,0x3c,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x09,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x06,0x00,0xa0,0x24,0x16,0x00,0x00,0x31,0xea,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x07,0x00,0xa0,0x24,0x12,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x02,0x00,0xa0,0x24,0x0e,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10, 0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff, 0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30, 0x00,0x6c,0x01,0x02,0x68,0xca,0x09,0xf1,0x01,0x6c,0x00,0x02,0x68,0x5a,0x01,0xf1, 0x01,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x09,0x24,0x02,0x00,0x06,0x24,0x09,0x00, 0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x01,0x04,0x02,0x00,0x06,0x84,0x01,0x00, 0x00,0x67,0x02,0x00,0x00,0x60,0x06,0x25,0x09,0x24,0x09,0x00,0x06,0x24,0x02,0x00, 0x00,0x61,0x00,0x04,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x02,0x00,0x00,0xa0,0x02,0x45, 0x02,0x24,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x02,0x00,0x00,0x38,0xac,0x00,0x00,0xa0,0x0a,0x45, 0x04,0x44,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x25, 0x03,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xcc,0x00,0x00,0xa0,0x02,0x44, 0x04,0x44,0x04,0x02,0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00,0x00,0x60,0x0a,0x65, 0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a,0x45, 0x03,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x05, 0x05,0x44,0x04,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65, 0x02,0x24,0x09,0x00,0x06,0x64,0x02,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06,0x45, 0x03,0x84,0x01,0x00,0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06,0xe8,0x05,0x05,0x11, 0x00,0x61,0x03,0x03,0x68,0x7e,0x02,0x11,0x00,0x61,0x03,0x04,0x68,0x46,0x03,0x11, 0x00,0x61,0x03,0x06,0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x02,0xa8,0xca,0x02,0x11, 0x02,0x5b,0x02,0x00,0x00,0xa0,0x02,0x44,0x02,0x24,0x03,0x82,0x02,0x24,0x06,0x44, 0x02,0x5b,0x04,0x00,0x00,0xa0,0x02,0x04,0x03,0x04,0x04,0x82,0x02,0x24,0x06,0x04, 0x03,0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01, 0x00,0x40,0x02,0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02,0x00,0x0a,0x04,0x03,0x00, 0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x04,0x44,0x04,0x00,0x0a,0x44,0x02,0x00, 0x00,0x61,0x01,0x07,0xe8,0x45,0x04,0x11,0x00,0x40,0x01,0x07,0xa8,0x02,0x07,0x11, 0x06,0x41,0x01,0x20,0x22,0x16,0x07,0x11,0x09,0x49,0x00,0x08,0xa8,0x12,0x07,0x11, 0x09,0x40,0x07,0x07,0xa8,0x12,0x07,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85, 0x01,0x84,0x01,0x00,0x06,0x04,0x08,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01, 0x00,0x84,0x01,0x00,0x42,0x24,0x09,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0x25, 0x07,0x04,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x07,0xa8,0x12,0x07,0x11, 0x07,0x67,0x01,0x00,0x00,0x60,0x06,0x25,0x09,0x04,0x07,0x00,0x06,0x24,0x02,0x00, 0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff, 0xff,0x2d,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x44,0x4c,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x06,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x4d,0x69,0x72,0x72, 0x6f,0x72,0x5f,0x72,0x65,0x61,0x64,0x5f,0x4e,0x56,0x31,0x32,0x00,0x25,0x6e,0x75, 0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68, 0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64, 0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25, 0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00, 0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c, 0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00, 0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25, 0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54, 0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32, 0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30, 0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56, 0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38, 0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30, 0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56, 0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36, 0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30, 0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56, 0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34, 0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30, 0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56, 0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32, 0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30, 0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56, 0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30, 0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30, 0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56, 0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38, 0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30, 0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56, 0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36, 0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30, 0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56, 0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34, 0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30, 0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56, 0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32, 0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31, 0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56, 0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30, 0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31, 0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56, 0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38, 0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31, 0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56, 0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36, 0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31, 0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56, 0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34, 0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31, 0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56, 0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32, 0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31, 0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56, 0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30, 0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31, 0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56, 0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38, 0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31, 0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56, 0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36, 0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31, 0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56, 0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34, 0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31, 0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56, 0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32, 0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31, 0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56, 0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30, 0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31, 0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56, 0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38, 0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32, 0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x56, 0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30,0x32,0x30,0x36, 0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x56,0x30,0x32, 0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x56, 0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30,0x32,0x31,0x34, 0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x56,0x30,0x32, 0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56, 0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32, 0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32, 0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56, 0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30, 0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00,0x56,0x30,0x32, 0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33,0x35,0x00,0x56, 0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30,0x32,0x33,0x38, 0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00,0x56,0x30,0x32, 0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34,0x33,0x00,0x56, 0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30,0x32,0x34,0x36, 0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00,0x56,0x30,0x32, 0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35,0x31,0x00,0x56, 0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30,0x32,0x35,0x34, 0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00,0x56,0x30,0x32, 0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35,0x39,0x00,0x56, 0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30,0x32,0x36,0x32, 0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00,0x56,0x30,0x32, 0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36,0x37,0x00,0x56, 0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30,0x32,0x37,0x30, 0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00,0x56,0x30,0x32, 0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37,0x35,0x00,0x56, 0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30,0x32,0x37,0x38, 0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00,0x56,0x30,0x32, 0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38,0x33,0x00,0x56, 0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30,0x32,0x38,0x36, 0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00,0x56,0x30,0x32, 0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39,0x31,0x00,0x56, 0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30,0x32,0x39,0x34, 0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00,0x56,0x30,0x32, 0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39,0x39,0x00,0x56, 0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30,0x33,0x30,0x32, 0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00,0x56,0x30,0x33, 0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30,0x37,0x00,0x56, 0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30,0x33,0x31,0x30, 0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00,0x56,0x30,0x33, 0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31,0x35,0x00,0x56, 0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30,0x33,0x31,0x38, 0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00,0x56,0x30,0x33, 0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32,0x33,0x00,0x56, 0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30,0x33,0x32,0x36, 0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00,0x56,0x30,0x33, 0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33,0x31,0x00,0x56, 0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30,0x33,0x33,0x34, 0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00,0x56,0x30,0x33, 0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33,0x39,0x00,0x56, 0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30,0x33,0x34,0x32, 0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00,0x56,0x30,0x33, 0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34,0x37,0x00,0x56, 0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30,0x33,0x35,0x30, 0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00,0x56,0x30,0x33, 0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35,0x35,0x00,0x56, 0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30,0x33,0x35,0x38, 0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00,0x56,0x30,0x33, 0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36,0x33,0x00,0x56, 0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30,0x33,0x36,0x36, 0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00,0x56,0x30,0x33, 0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37,0x31,0x00,0x56, 0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x56,0x30,0x33,0x37,0x34, 0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33,0x37,0x36,0x00,0x56,0x30,0x33, 0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30,0x33,0x37,0x39,0x00,0x56, 0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00,0x56,0x30,0x33,0x38,0x32, 0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38,0x34,0x00,0x56,0x30,0x33, 0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30,0x33,0x38,0x37,0x00,0x56, 0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00,0x56,0x30,0x33,0x39,0x30, 0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39,0x32,0x00,0x56,0x30,0x33, 0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30,0x33,0x39,0x35,0x00,0x56, 0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00,0x56,0x30,0x33,0x39,0x38, 0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30,0x30,0x00,0x56,0x30,0x34, 0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30,0x34,0x30,0x33,0x00,0x56, 0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00,0x56,0x30,0x34,0x30,0x36, 0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30,0x38,0x00,0x56,0x30,0x34, 0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30,0x34,0x31,0x31,0x00,0x56, 0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00,0x56,0x30,0x34,0x31,0x34, 0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31,0x36,0x00,0x56,0x30,0x34, 0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30,0x34,0x31,0x39,0x00,0x56, 0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00,0x56,0x30,0x34,0x32,0x32, 0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32,0x34,0x00,0x56,0x30,0x34, 0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30,0x34,0x32,0x37,0x00,0x56, 0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00,0x56,0x30,0x34,0x33,0x30, 0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33,0x32,0x00,0x56,0x30,0x34, 0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30,0x34,0x33,0x35,0x00,0x56, 0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00,0x56,0x30,0x34,0x33,0x38, 0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34,0x30,0x00,0x56,0x30,0x34, 0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30,0x34,0x34,0x33,0x00,0x56, 0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00,0x56,0x30,0x34,0x34,0x36, 0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34,0x38,0x00,0x56,0x30,0x34, 0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30,0x34,0x35,0x31,0x00,0x56, 0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00,0x56,0x30,0x34,0x35,0x34, 0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35,0x36,0x00,0x56,0x30,0x34, 0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30,0x34,0x35,0x39,0x00,0x56, 0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00,0x56,0x30,0x34,0x36,0x32, 0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36,0x34,0x00,0x56,0x30,0x34, 0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30,0x34,0x36,0x37,0x00,0x56, 0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00,0x56,0x30,0x34,0x37,0x30, 0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37,0x32,0x00,0x56,0x30,0x34, 0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30,0x34,0x37,0x35,0x00,0x56, 0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00,0x56,0x30,0x34,0x37,0x38, 0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38,0x30,0x00,0x56,0x30,0x34, 0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30,0x34,0x38,0x33,0x00,0x56, 0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00,0x56,0x30,0x34,0x38,0x36, 0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38,0x38,0x00,0x56,0x30,0x34, 0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30,0x34,0x39,0x31,0x00,0x56, 0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00,0x56,0x30,0x34,0x39,0x34, 0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39,0x36,0x00,0x56,0x30,0x34, 0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30,0x34,0x39,0x39,0x00,0x56, 0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00,0x56,0x30,0x35,0x30,0x32, 0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30,0x34,0x00,0x56,0x30,0x35, 0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30,0x35,0x30,0x37,0x00,0x56, 0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00,0x56,0x30,0x35,0x31,0x30, 0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31,0x32,0x00,0x56,0x30,0x35, 0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30,0x35,0x31,0x35,0x00,0x56, 0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00,0x56,0x30,0x35,0x31,0x38, 0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32,0x30,0x00,0x56,0x30,0x35, 0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30,0x35,0x32,0x33,0x00,0x56, 0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00,0x56,0x30,0x35,0x32,0x36, 0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32,0x38,0x00,0x56,0x30,0x35, 0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30,0x35,0x33,0x31,0x00,0x56, 0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00,0x56,0x30,0x35,0x33,0x34, 0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33,0x36,0x00,0x56,0x30,0x35, 0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30,0x35,0x33,0x39,0x00,0x56, 0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00,0x56,0x30,0x35,0x34,0x32, 0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34,0x34,0x00,0x56,0x30,0x35, 0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30,0x35,0x34,0x37,0x00,0x56, 0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00,0x56,0x30,0x35,0x35,0x30, 0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35,0x32,0x00,0x56,0x30,0x35, 0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30,0x35,0x35,0x35,0x00,0x56, 0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00,0x56,0x30,0x35,0x35,0x38, 0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36,0x30,0x00,0x56,0x30,0x35, 0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30,0x35,0x36,0x33,0x00,0x56, 0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00,0x56,0x30,0x35,0x36,0x36, 0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36,0x38,0x00,0x56,0x30,0x35, 0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30,0x35,0x37,0x31,0x00,0x56, 0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00,0x56,0x30,0x35,0x37,0x34, 0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37,0x36,0x00,0x56,0x30,0x35, 0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30,0x35,0x37,0x39,0x00,0x56, 0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00,0x56,0x30,0x35,0x38,0x32, 0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38,0x34,0x00,0x56,0x30,0x35, 0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30,0x35,0x38,0x37,0x00,0x56, 0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00,0x56,0x30,0x35,0x39,0x30, 0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39,0x32,0x00,0x56,0x30,0x35, 0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30,0x35,0x39,0x35,0x00,0x56, 0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00,0x56,0x30,0x35,0x39,0x38, 0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30,0x30,0x00,0x56,0x30,0x36, 0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30,0x36,0x30,0x33,0x00,0x56, 0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00,0x56,0x30,0x36,0x30,0x36, 0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30,0x38,0x00,0x56,0x30,0x36, 0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30,0x36,0x31,0x31,0x00,0x56, 0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00,0x56,0x30,0x36,0x31,0x34, 0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31,0x36,0x00,0x56,0x30,0x36, 0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30,0x36,0x31,0x39,0x00,0x56, 0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00,0x56,0x30,0x36,0x32,0x32, 0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32,0x34,0x00,0x56,0x30,0x36, 0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30,0x36,0x32,0x37,0x00,0x56, 0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00,0x56,0x30,0x36,0x33,0x30, 0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33,0x32,0x00,0x56,0x30,0x36, 0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30,0x36,0x33,0x35,0x00,0x56, 0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00,0x56,0x30,0x36,0x33,0x38, 0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34,0x30,0x00,0x56,0x30,0x36, 0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30,0x36,0x34,0x33,0x00,0x56, 0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00,0x56,0x30,0x36,0x34,0x36, 0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34,0x38,0x00,0x56,0x30,0x36, 0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30,0x36,0x35,0x31,0x00,0x56, 0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00,0x56,0x30,0x36,0x35,0x34, 0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35,0x36,0x00,0x56,0x30,0x36, 0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56,0x30,0x36,0x35,0x39,0x00,0x56, 0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31,0x00,0x56,0x30,0x36,0x36,0x32, 0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36,0x36,0x34,0x00,0x56,0x30,0x36, 0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56,0x30,0x36,0x36,0x37,0x00,0x56, 0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39,0x00,0x56,0x30,0x36,0x37,0x30, 0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36,0x37,0x32,0x00,0x56,0x30,0x36, 0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56,0x30,0x36,0x37,0x35,0x00,0x56, 0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37,0x00,0x56,0x30,0x36,0x37,0x38, 0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36,0x38,0x30,0x00,0x56,0x30,0x36, 0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56,0x30,0x36,0x38,0x33,0x00,0x56, 0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35,0x00,0x56,0x30,0x36,0x38,0x36, 0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36,0x38,0x38,0x00,0x56,0x30,0x36, 0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56,0x30,0x36,0x39,0x31,0x00,0x56, 0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33,0x00,0x56,0x30,0x36,0x39,0x34, 0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36,0x39,0x36,0x00,0x56,0x30,0x36, 0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56,0x30,0x36,0x39,0x39,0x00,0x56, 0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31,0x00,0x56,0x30,0x37,0x30,0x32, 0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37,0x30,0x34,0x00,0x56,0x30,0x37, 0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56,0x30,0x37,0x30,0x37,0x00,0x56, 0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39,0x00,0x56,0x30,0x37,0x31,0x30, 0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37,0x31,0x32,0x00,0x56,0x30,0x37, 0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56,0x30,0x37,0x31,0x35,0x00,0x56, 0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37,0x00,0x56,0x30,0x37,0x31,0x38, 0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37,0x32,0x30,0x00,0x56,0x30,0x37, 0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56,0x30,0x37,0x32,0x33,0x00,0x56, 0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35,0x00,0x56,0x30,0x37,0x32,0x36, 0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37,0x32,0x38,0x00,0x56,0x30,0x37, 0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56,0x30,0x37,0x33,0x31,0x00,0x56, 0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33,0x00,0x56,0x30,0x37,0x33,0x34, 0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37,0x33,0x36,0x00,0x56,0x30,0x37, 0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56,0x30,0x37,0x33,0x39,0x00,0x56, 0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31,0x00,0x56,0x30,0x37,0x34,0x32, 0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37,0x34,0x34,0x00,0x56,0x30,0x37, 0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56,0x30,0x37,0x34,0x37,0x00,0x56, 0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39,0x00,0x56,0x30,0x37,0x35,0x30, 0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37,0x35,0x32,0x00,0x56,0x30,0x37, 0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56,0x30,0x37,0x35,0x35,0x00,0x56, 0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37,0x00,0x56,0x30,0x37,0x35,0x38, 0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37,0x36,0x30,0x00,0x56,0x30,0x37, 0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56,0x30,0x37,0x36,0x33,0x00,0x56, 0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35,0x00,0x56,0x30,0x37,0x36,0x36, 0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37,0x36,0x38,0x00,0x56,0x30,0x37, 0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56,0x30,0x37,0x37,0x31,0x00,0x56, 0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33,0x00,0x56,0x30,0x37,0x37,0x34, 0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37,0x37,0x36,0x00,0x56,0x30,0x37, 0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56,0x30,0x37,0x37,0x39,0x00,0x56, 0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31,0x00,0x56,0x30,0x37,0x38,0x32, 0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37,0x38,0x34,0x00,0x56,0x30,0x37, 0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56,0x30,0x37,0x38,0x37,0x00,0x56, 0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39,0x00,0x56,0x30,0x37,0x39,0x30, 0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37,0x39,0x32,0x00,0x56,0x30,0x37, 0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56,0x30,0x37,0x39,0x35,0x00,0x56, 0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37,0x00,0x56,0x30,0x37,0x39,0x38, 0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38,0x30,0x30,0x00,0x56,0x30,0x38, 0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56,0x30,0x38,0x30,0x33,0x00,0x56, 0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35,0x00,0x56,0x30,0x38,0x30,0x36, 0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38,0x30,0x38,0x00,0x56,0x30,0x38, 0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56,0x30,0x38,0x31,0x31,0x00,0x56, 0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33,0x00,0x56,0x30,0x38,0x31,0x34, 0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38,0x31,0x36,0x00,0x56,0x30,0x38, 0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56,0x30,0x38,0x31,0x39,0x00,0x56, 0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31,0x00,0x56,0x30,0x38,0x32,0x32, 0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38,0x32,0x34,0x00,0x56,0x30,0x38, 0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56,0x30,0x38,0x32,0x37,0x00,0x56, 0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39,0x00,0x56,0x30,0x38,0x33,0x30, 0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38,0x33,0x32,0x00,0x56,0x30,0x38, 0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56,0x30,0x38,0x33,0x35,0x00,0x56, 0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37,0x00,0x56,0x30,0x38,0x33,0x38, 0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38,0x34,0x30,0x00,0x56,0x30,0x38, 0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56,0x30,0x38,0x34,0x33,0x00,0x56, 0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35,0x00,0x56,0x30,0x38,0x34,0x36, 0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38,0x34,0x38,0x00,0x56,0x30,0x38, 0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56,0x30,0x38,0x35,0x31,0x00,0x56, 0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33,0x00,0x56,0x30,0x38,0x35,0x34, 0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38,0x35,0x36,0x00,0x56,0x30,0x38, 0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56,0x30,0x38,0x35,0x39,0x00,0x56, 0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31,0x00,0x56,0x30,0x38,0x36,0x32, 0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38,0x36,0x34,0x00,0x56,0x30,0x38, 0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x56,0x30,0x38,0x36,0x37,0x00,0x56, 0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36,0x39,0x00,0x56,0x30,0x38,0x37,0x30, 0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30,0x38,0x37,0x32,0x00,0x56,0x30,0x38, 0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00,0x56,0x30,0x38,0x37,0x35,0x00,0x56, 0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37,0x37,0x00,0x56,0x30,0x38,0x37,0x38, 0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30,0x38,0x38,0x30,0x00,0x56,0x30,0x38, 0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00,0x56,0x30,0x38,0x38,0x33,0x00,0x56, 0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38,0x35,0x00,0x56,0x30,0x38,0x38,0x36, 0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30,0x38,0x38,0x38,0x00,0x56,0x30,0x38, 0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00,0x56,0x30,0x38,0x39,0x31,0x00,0x56, 0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39,0x33,0x00,0x56,0x30,0x38,0x39,0x34, 0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30,0x38,0x39,0x36,0x00,0x56,0x30,0x38, 0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00,0x56,0x30,0x38,0x39,0x39,0x00,0x56, 0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30,0x31,0x00,0x56,0x30,0x39,0x30,0x32, 0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30,0x39,0x30,0x34,0x00,0x56,0x30,0x39, 0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00,0x56,0x30,0x39,0x30,0x37,0x00,0x56, 0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30,0x39,0x00,0x56,0x30,0x39,0x31,0x30, 0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30,0x39,0x31,0x32,0x00,0x56,0x30,0x39, 0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00,0x56,0x30,0x39,0x31,0x35,0x00,0x56, 0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31,0x37,0x00,0x56,0x30,0x39,0x31,0x38, 0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30,0x39,0x32,0x30,0x00,0x56,0x30,0x39, 0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00,0x56,0x30,0x39,0x32,0x33,0x00,0x56, 0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32,0x35,0x00,0x56,0x30,0x39,0x32,0x36, 0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30,0x39,0x32,0x38,0x00,0x56,0x30,0x39, 0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00,0x56,0x30,0x39,0x33,0x31,0x00,0x56, 0x30,0x39,0x33,0x32,0x00,0x56,0x30,0x39,0x33,0x33,0x00,0x56,0x30,0x39,0x33,0x34, 0x00,0x56,0x30,0x39,0x33,0x35,0x00,0x56,0x30,0x39,0x33,0x36,0x00,0x56,0x30,0x39, 0x33,0x37,0x00,0x56,0x30,0x39,0x33,0x38,0x00,0x56,0x30,0x39,0x33,0x39,0x00,0x56, 0x30,0x39,0x34,0x30,0x00,0x56,0x30,0x39,0x34,0x31,0x00,0x56,0x30,0x39,0x34,0x32, 0x00,0x56,0x30,0x39,0x34,0x33,0x00,0x56,0x30,0x39,0x34,0x34,0x00,0x56,0x30,0x39, 0x34,0x35,0x00,0x56,0x30,0x39,0x34,0x36,0x00,0x56,0x30,0x39,0x34,0x37,0x00,0x56, 0x30,0x39,0x34,0x38,0x00,0x56,0x30,0x39,0x34,0x39,0x00,0x56,0x30,0x39,0x35,0x30, 0x00,0x56,0x30,0x39,0x35,0x31,0x00,0x56,0x30,0x39,0x35,0x32,0x00,0x56,0x30,0x39, 0x35,0x33,0x00,0x56,0x30,0x39,0x35,0x34,0x00,0x56,0x30,0x39,0x35,0x35,0x00,0x56, 0x30,0x39,0x35,0x36,0x00,0x56,0x30,0x39,0x35,0x37,0x00,0x56,0x30,0x39,0x35,0x38, 0x00,0x56,0x30,0x39,0x35,0x39,0x00,0x56,0x30,0x39,0x36,0x30,0x00,0x56,0x30,0x39, 0x36,0x31,0x00,0x56,0x30,0x39,0x36,0x32,0x00,0x56,0x30,0x39,0x36,0x33,0x00,0x56, 0x30,0x39,0x36,0x34,0x00,0x56,0x30,0x39,0x36,0x35,0x00,0x56,0x30,0x39,0x36,0x36, 0x00,0x56,0x30,0x39,0x36,0x37,0x00,0x56,0x30,0x39,0x36,0x38,0x00,0x56,0x30,0x39, 0x36,0x39,0x00,0x56,0x30,0x39,0x37,0x30,0x00,0x56,0x30,0x39,0x37,0x31,0x00,0x56, 0x30,0x39,0x37,0x32,0x00,0x56,0x30,0x39,0x37,0x33,0x00,0x56,0x30,0x39,0x37,0x34, 0x00,0x56,0x30,0x39,0x37,0x35,0x00,0x56,0x30,0x39,0x37,0x36,0x00,0x56,0x30,0x39, 0x37,0x37,0x00,0x56,0x30,0x39,0x37,0x38,0x00,0x56,0x30,0x39,0x37,0x39,0x00,0x56, 0x30,0x39,0x38,0x30,0x00,0x56,0x30,0x39,0x38,0x31,0x00,0x56,0x30,0x39,0x38,0x32, 0x00,0x56,0x30,0x39,0x38,0x33,0x00,0x56,0x30,0x39,0x38,0x34,0x00,0x56,0x30,0x39, 0x38,0x35,0x00,0x56,0x30,0x39,0x38,0x36,0x00,0x56,0x30,0x39,0x38,0x37,0x00,0x56, 0x30,0x39,0x38,0x38,0x00,0x56,0x30,0x39,0x38,0x39,0x00,0x56,0x30,0x39,0x39,0x30, 0x00,0x56,0x30,0x39,0x39,0x31,0x00,0x56,0x30,0x39,0x39,0x32,0x00,0x56,0x30,0x39, 0x39,0x33,0x00,0x56,0x30,0x39,0x39,0x34,0x00,0x56,0x30,0x39,0x39,0x35,0x00,0x56, 0x30,0x39,0x39,0x36,0x00,0x56,0x30,0x39,0x39,0x37,0x00,0x56,0x30,0x39,0x39,0x38, 0x00,0x56,0x30,0x39,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x30,0x00,0x56,0x31,0x30, 0x30,0x31,0x00,0x56,0x31,0x30,0x30,0x32,0x00,0x56,0x31,0x30,0x30,0x33,0x00,0x56, 0x31,0x30,0x30,0x34,0x00,0x56,0x31,0x30,0x30,0x35,0x00,0x56,0x31,0x30,0x30,0x36, 0x00,0x56,0x31,0x30,0x30,0x37,0x00,0x56,0x31,0x30,0x30,0x38,0x00,0x56,0x31,0x30, 0x30,0x39,0x00,0x56,0x31,0x30,0x31,0x30,0x00,0x56,0x31,0x30,0x31,0x31,0x00,0x56, 0x31,0x30,0x31,0x32,0x00,0x56,0x31,0x30,0x31,0x33,0x00,0x56,0x31,0x30,0x31,0x34, 0x00,0x56,0x31,0x30,0x31,0x35,0x00,0x56,0x31,0x30,0x31,0x36,0x00,0x56,0x31,0x30, 0x31,0x37,0x00,0x56,0x31,0x30,0x31,0x38,0x00,0x56,0x31,0x30,0x31,0x39,0x00,0x56, 0x31,0x30,0x32,0x30,0x00,0x56,0x31,0x30,0x32,0x31,0x00,0x56,0x31,0x30,0x32,0x32, 0x00,0x56,0x31,0x30,0x32,0x33,0x00,0x56,0x31,0x30,0x32,0x34,0x00,0x56,0x31,0x30, 0x32,0x35,0x00,0x56,0x31,0x30,0x32,0x36,0x00,0x56,0x31,0x30,0x32,0x37,0x00,0x56, 0x31,0x30,0x32,0x38,0x00,0x56,0x31,0x30,0x32,0x39,0x00,0x56,0x31,0x30,0x33,0x30, 0x00,0x56,0x31,0x30,0x33,0x31,0x00,0x56,0x31,0x30,0x33,0x32,0x00,0x56,0x31,0x30, 0x33,0x33,0x00,0x56,0x31,0x30,0x33,0x34,0x00,0x56,0x31,0x30,0x33,0x35,0x00,0x56, 0x31,0x30,0x33,0x36,0x00,0x56,0x31,0x30,0x33,0x37,0x00,0x56,0x31,0x30,0x33,0x38, 0x00,0x56,0x31,0x30,0x33,0x39,0x00,0x56,0x31,0x30,0x34,0x30,0x00,0x56,0x31,0x30, 0x34,0x31,0x00,0x56,0x31,0x30,0x34,0x32,0x00,0x56,0x31,0x30,0x34,0x33,0x00,0x56, 0x31,0x30,0x34,0x34,0x00,0x56,0x31,0x30,0x34,0x35,0x00,0x56,0x31,0x30,0x34,0x36, 0x00,0x56,0x31,0x30,0x34,0x37,0x00,0x56,0x31,0x30,0x34,0x38,0x00,0x56,0x31,0x30, 0x34,0x39,0x00,0x56,0x31,0x30,0x35,0x30,0x00,0x56,0x31,0x30,0x35,0x31,0x00,0x56, 0x31,0x30,0x35,0x32,0x00,0x56,0x31,0x30,0x35,0x33,0x00,0x56,0x31,0x30,0x35,0x34, 0x00,0x56,0x31,0x30,0x35,0x35,0x00,0x56,0x31,0x30,0x35,0x36,0x00,0x56,0x31,0x30, 0x35,0x37,0x00,0x56,0x31,0x30,0x35,0x38,0x00,0x56,0x31,0x30,0x35,0x39,0x00,0x56, 0x31,0x30,0x36,0x30,0x00,0x56,0x31,0x30,0x36,0x31,0x00,0x56,0x31,0x30,0x36,0x32, 0x00,0x56,0x31,0x30,0x36,0x33,0x00,0x56,0x31,0x30,0x36,0x34,0x00,0x56,0x31,0x30, 0x36,0x35,0x00,0x56,0x31,0x30,0x36,0x36,0x00,0x56,0x31,0x30,0x36,0x37,0x00,0x56, 0x31,0x30,0x36,0x38,0x00,0x56,0x31,0x30,0x36,0x39,0x00,0x56,0x31,0x30,0x37,0x30, 0x00,0x56,0x31,0x30,0x37,0x31,0x00,0x56,0x31,0x30,0x37,0x32,0x00,0x56,0x31,0x30, 0x37,0x33,0x00,0x56,0x31,0x30,0x37,0x34,0x00,0x56,0x31,0x30,0x37,0x35,0x00,0x56, 0x31,0x30,0x37,0x36,0x00,0x56,0x31,0x30,0x37,0x37,0x00,0x56,0x31,0x30,0x37,0x38, 0x00,0x56,0x31,0x30,0x37,0x39,0x00,0x56,0x31,0x30,0x38,0x30,0x00,0x56,0x31,0x30, 0x38,0x31,0x00,0x56,0x31,0x30,0x38,0x32,0x00,0x56,0x31,0x30,0x38,0x33,0x00,0x56, 0x31,0x30,0x38,0x34,0x00,0x56,0x31,0x30,0x38,0x35,0x00,0x56,0x31,0x30,0x38,0x36, 0x00,0x56,0x31,0x30,0x38,0x37,0x00,0x56,0x31,0x30,0x38,0x38,0x00,0x56,0x31,0x30, 0x38,0x39,0x00,0x56,0x31,0x30,0x39,0x30,0x00,0x56,0x31,0x30,0x39,0x31,0x00,0x56, 0x31,0x30,0x39,0x32,0x00,0x56,0x31,0x30,0x39,0x33,0x00,0x56,0x31,0x30,0x39,0x34, 0x00,0x56,0x31,0x30,0x39,0x35,0x00,0x56,0x31,0x30,0x39,0x36,0x00,0x56,0x31,0x30, 0x39,0x37,0x00,0x56,0x31,0x30,0x39,0x38,0x00,0x56,0x31,0x30,0x39,0x39,0x00,0x56, 0x31,0x31,0x30,0x30,0x00,0x56,0x31,0x31,0x30,0x31,0x00,0x56,0x31,0x31,0x30,0x32, 0x00,0x56,0x31,0x31,0x30,0x33,0x00,0x56,0x31,0x31,0x30,0x34,0x00,0x56,0x31,0x31, 0x30,0x35,0x00,0x56,0x31,0x31,0x30,0x36,0x00,0x56,0x31,0x31,0x30,0x37,0x00,0x56, 0x31,0x31,0x30,0x38,0x00,0x56,0x31,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x31,0x30, 0x00,0x56,0x31,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x31,0x32,0x00,0x56,0x31,0x31, 0x31,0x33,0x00,0x56,0x31,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x31,0x35,0x00,0x56, 0x31,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x31,0x38, 0x00,0x56,0x31,0x31,0x31,0x39,0x00,0x56,0x31,0x31,0x32,0x30,0x00,0x56,0x31,0x31, 0x32,0x31,0x00,0x56,0x31,0x31,0x32,0x32,0x00,0x56,0x31,0x31,0x32,0x33,0x00,0x56, 0x31,0x31,0x32,0x34,0x00,0x56,0x31,0x31,0x32,0x35,0x00,0x56,0x31,0x31,0x32,0x36, 0x00,0x56,0x31,0x31,0x32,0x37,0x00,0x56,0x31,0x31,0x32,0x38,0x00,0x56,0x31,0x31, 0x32,0x39,0x00,0x56,0x31,0x31,0x33,0x30,0x00,0x56,0x31,0x31,0x33,0x31,0x00,0x56, 0x31,0x31,0x33,0x32,0x00,0x56,0x31,0x31,0x33,0x33,0x00,0x56,0x31,0x31,0x33,0x34, 0x00,0x56,0x31,0x31,0x33,0x35,0x00,0x56,0x31,0x31,0x33,0x36,0x00,0x56,0x31,0x31, 0x33,0x37,0x00,0x56,0x31,0x31,0x33,0x38,0x00,0x56,0x31,0x31,0x33,0x39,0x00,0x56, 0x31,0x31,0x34,0x30,0x00,0x56,0x31,0x31,0x34,0x31,0x00,0x56,0x31,0x31,0x34,0x32, 0x00,0x56,0x31,0x31,0x34,0x33,0x00,0x56,0x31,0x31,0x34,0x34,0x00,0x56,0x31,0x31, 0x34,0x35,0x00,0x56,0x31,0x31,0x34,0x36,0x00,0x56,0x31,0x31,0x34,0x37,0x00,0x56, 0x31,0x31,0x34,0x38,0x00,0x56,0x31,0x31,0x34,0x39,0x00,0x56,0x31,0x31,0x35,0x30, 0x00,0x56,0x31,0x31,0x35,0x31,0x00,0x56,0x31,0x31,0x35,0x32,0x00,0x56,0x31,0x31, 0x35,0x33,0x00,0x56,0x31,0x31,0x35,0x34,0x00,0x56,0x31,0x31,0x35,0x35,0x00,0x56, 0x31,0x31,0x35,0x36,0x00,0x56,0x31,0x31,0x35,0x37,0x00,0x56,0x31,0x31,0x35,0x38, 0x00,0x56,0x31,0x31,0x35,0x39,0x00,0x56,0x31,0x31,0x36,0x30,0x00,0x56,0x31,0x31, 0x36,0x31,0x00,0x56,0x31,0x31,0x36,0x32,0x00,0x56,0x31,0x31,0x36,0x33,0x00,0x56, 0x31,0x31,0x36,0x34,0x00,0x56,0x31,0x31,0x36,0x35,0x00,0x56,0x31,0x31,0x36,0x36, 0x00,0x56,0x31,0x31,0x36,0x37,0x00,0x56,0x31,0x31,0x36,0x38,0x00,0x56,0x31,0x31, 0x36,0x39,0x00,0x56,0x31,0x31,0x37,0x30,0x00,0x56,0x31,0x31,0x37,0x31,0x00,0x56, 0x31,0x31,0x37,0x32,0x00,0x56,0x31,0x31,0x37,0x33,0x00,0x56,0x31,0x31,0x37,0x34, 0x00,0x56,0x31,0x31,0x37,0x35,0x00,0x56,0x31,0x31,0x37,0x36,0x00,0x56,0x31,0x31, 0x37,0x37,0x00,0x56,0x31,0x31,0x37,0x38,0x00,0x56,0x31,0x31,0x37,0x39,0x00,0x56, 0x31,0x31,0x38,0x30,0x00,0x56,0x31,0x31,0x38,0x31,0x00,0x56,0x31,0x31,0x38,0x32, 0x00,0x56,0x31,0x31,0x38,0x33,0x00,0x56,0x31,0x31,0x38,0x34,0x00,0x56,0x31,0x31, 0x38,0x35,0x00,0x56,0x31,0x31,0x38,0x36,0x00,0x56,0x31,0x31,0x38,0x37,0x00,0x56, 0x31,0x31,0x38,0x38,0x00,0x56,0x31,0x31,0x38,0x39,0x00,0x56,0x31,0x31,0x39,0x30, 0x00,0x56,0x31,0x31,0x39,0x31,0x00,0x56,0x31,0x31,0x39,0x32,0x00,0x56,0x31,0x31, 0x39,0x33,0x00,0x56,0x31,0x31,0x39,0x34,0x00,0x56,0x31,0x31,0x39,0x35,0x00,0x56, 0x31,0x31,0x39,0x36,0x00,0x56,0x31,0x31,0x39,0x37,0x00,0x56,0x31,0x31,0x39,0x38, 0x00,0x56,0x31,0x31,0x39,0x39,0x00,0x56,0x31,0x32,0x30,0x30,0x00,0x56,0x31,0x32, 0x30,0x31,0x00,0x56,0x31,0x32,0x30,0x32,0x00,0x56,0x31,0x32,0x30,0x33,0x00,0x56, 0x31,0x32,0x30,0x34,0x00,0x56,0x31,0x32,0x30,0x35,0x00,0x56,0x31,0x32,0x30,0x36, 0x00,0x56,0x31,0x32,0x30,0x37,0x00,0x56,0x31,0x32,0x30,0x38,0x00,0x56,0x31,0x32, 0x30,0x39,0x00,0x56,0x31,0x32,0x31,0x30,0x00,0x56,0x31,0x32,0x31,0x31,0x00,0x56, 0x31,0x32,0x31,0x32,0x00,0x56,0x31,0x32,0x31,0x33,0x00,0x56,0x31,0x32,0x31,0x34, 0x00,0x56,0x31,0x32,0x31,0x35,0x00,0x56,0x31,0x32,0x31,0x36,0x00,0x56,0x31,0x32, 0x31,0x37,0x00,0x56,0x31,0x32,0x31,0x38,0x00,0x56,0x31,0x32,0x31,0x39,0x00,0x56, 0x31,0x32,0x32,0x30,0x00,0x56,0x31,0x32,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x32, 0x00,0x56,0x31,0x32,0x32,0x33,0x00,0x56,0x31,0x32,0x32,0x34,0x00,0x56,0x31,0x32, 0x32,0x35,0x00,0x56,0x31,0x32,0x32,0x36,0x00,0x56,0x31,0x32,0x32,0x37,0x00,0x56, 0x31,0x32,0x32,0x38,0x00,0x56,0x31,0x32,0x32,0x39,0x00,0x56,0x31,0x32,0x33,0x30, 0x00,0x56,0x31,0x32,0x33,0x31,0x00,0x56,0x31,0x32,0x33,0x32,0x00,0x56,0x31,0x32, 0x33,0x33,0x00,0x56,0x31,0x32,0x33,0x34,0x00,0x56,0x31,0x32,0x33,0x35,0x00,0x56, 0x31,0x32,0x33,0x36,0x00,0x56,0x31,0x32,0x33,0x37,0x00,0x56,0x31,0x32,0x33,0x38, 0x00,0x56,0x31,0x32,0x33,0x39,0x00,0x56,0x31,0x32,0x34,0x30,0x00,0x56,0x31,0x32, 0x34,0x31,0x00,0x56,0x31,0x32,0x34,0x32,0x00,0x56,0x31,0x32,0x34,0x33,0x00,0x56, 0x31,0x32,0x34,0x34,0x00,0x56,0x31,0x32,0x34,0x35,0x00,0x56,0x31,0x32,0x34,0x36, 0x00,0x56,0x31,0x32,0x34,0x37,0x00,0x56,0x31,0x32,0x34,0x38,0x00,0x56,0x31,0x32, 0x34,0x39,0x00,0x56,0x31,0x32,0x35,0x30,0x00,0x56,0x31,0x32,0x35,0x31,0x00,0x56, 0x31,0x32,0x35,0x32,0x00,0x56,0x31,0x32,0x35,0x33,0x00,0x56,0x31,0x32,0x35,0x34, 0x00,0x56,0x31,0x32,0x35,0x35,0x00,0x56,0x31,0x32,0x35,0x36,0x00,0x56,0x31,0x32, 0x35,0x37,0x00,0x56,0x31,0x32,0x35,0x38,0x00,0x56,0x31,0x32,0x35,0x39,0x00,0x56, 0x31,0x32,0x36,0x30,0x00,0x56,0x31,0x32,0x36,0x31,0x00,0x56,0x31,0x32,0x36,0x32, 0x00,0x56,0x31,0x32,0x36,0x33,0x00,0x56,0x31,0x32,0x36,0x34,0x00,0x56,0x31,0x32, 0x36,0x35,0x00,0x56,0x31,0x32,0x36,0x36,0x00,0x56,0x31,0x32,0x36,0x37,0x00,0x56, 0x31,0x32,0x36,0x38,0x00,0x56,0x31,0x32,0x36,0x39,0x00,0x56,0x31,0x32,0x37,0x30, 0x00,0x56,0x31,0x32,0x37,0x31,0x00,0x56,0x31,0x32,0x37,0x32,0x00,0x41,0x30,0x30, 0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30,0x34, 0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30,0x38, 0x00,0x41,0x30,0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31,0x32, 0x00,0x41,0x31,0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31,0x36, 0x00,0x41,0x31,0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31,0x39,0x00,0x41,0x32,0x30, 0x00,0x41,0x32,0x31,0x00,0x41,0x32,0x32,0x00,0x41,0x32,0x33,0x00,0x41,0x32,0x34, 0x00,0x41,0x32,0x35,0x00,0x41,0x32,0x36,0x00,0x41,0x32,0x37,0x00,0x41,0x32,0x38, 0x00,0x41,0x32,0x39,0x00,0x41,0x33,0x30,0x00,0x41,0x33,0x31,0x00,0x41,0x33,0x32, 0x00,0x41,0x33,0x33,0x00,0x41,0x33,0x34,0x00,0x41,0x33,0x35,0x00,0x41,0x33,0x36, 0x00,0x41,0x33,0x37,0x00,0x41,0x33,0x38,0x00,0x41,0x33,0x39,0x00,0x41,0x34,0x30, 0x00,0x41,0x34,0x31,0x00,0x41,0x34,0x32,0x00,0x41,0x34,0x33,0x00,0x41,0x34,0x34, 0x00,0x41,0x34,0x35,0x00,0x41,0x34,0x36,0x00,0x41,0x34,0x37,0x00,0x41,0x34,0x38, 0x00,0x41,0x34,0x39,0x00,0x41,0x35,0x30,0x00,0x41,0x35,0x31,0x00,0x41,0x35,0x32, 0x00,0x41,0x35,0x33,0x00,0x41,0x35,0x34,0x00,0x41,0x35,0x35,0x00,0x41,0x35,0x36, 0x00,0x41,0x35,0x37,0x00,0x41,0x35,0x38,0x00,0x41,0x35,0x39,0x00,0x41,0x36,0x30, 0x00,0x41,0x36,0x31,0x00,0x41,0x36,0x32,0x00,0x41,0x36,0x33,0x00,0x41,0x36,0x34, 0x00,0x41,0x36,0x35,0x00,0x41,0x36,0x36,0x00,0x41,0x36,0x37,0x00,0x41,0x36,0x38, 0x00,0x41,0x36,0x39,0x00,0x41,0x37,0x30,0x00,0x41,0x37,0x31,0x00,0x41,0x37,0x32, 0x00,0x41,0x37,0x33,0x00,0x41,0x37,0x34,0x00,0x41,0x37,0x35,0x00,0x41,0x37,0x36, 0x00,0x41,0x37,0x37,0x00,0x41,0x37,0x38,0x00,0x41,0x37,0x39,0x00,0x41,0x38,0x30, 0x00,0x41,0x38,0x31,0x00,0x41,0x38,0x32,0x00,0x41,0x38,0x33,0x00,0x41,0x38,0x34, 0x00,0x41,0x38,0x35,0x00,0x41,0x38,0x36,0x00,0x41,0x38,0x37,0x00,0x41,0x38,0x38, 0x00,0x41,0x38,0x39,0x00,0x41,0x39,0x30,0x00,0x41,0x39,0x31,0x00,0x41,0x39,0x32, 0x00,0x41,0x39,0x33,0x00,0x41,0x39,0x34,0x00,0x41,0x39,0x35,0x00,0x41,0x39,0x36, 0x00,0x41,0x39,0x37,0x00,0x41,0x39,0x38,0x00,0x41,0x39,0x39,0x00,0x41,0x31,0x30, 0x30,0x00,0x41,0x31,0x30,0x31,0x00,0x41,0x31,0x30,0x32,0x00,0x41,0x31,0x30,0x33, 0x00,0x41,0x31,0x30,0x34,0x00,0x41,0x31,0x30,0x35,0x00,0x41,0x31,0x30,0x36,0x00, 0x41,0x31,0x30,0x37,0x00,0x41,0x31,0x30,0x38,0x00,0x41,0x31,0x30,0x39,0x00,0x41, 0x31,0x31,0x30,0x00,0x41,0x31,0x31,0x31,0x00,0x41,0x31,0x31,0x32,0x00,0x41,0x31, 0x31,0x33,0x00,0x41,0x31,0x31,0x34,0x00,0x41,0x31,0x31,0x35,0x00,0x41,0x31,0x31, 0x36,0x00,0x41,0x31,0x31,0x37,0x00,0x41,0x31,0x31,0x38,0x00,0x41,0x31,0x31,0x39, 0x00,0x41,0x31,0x32,0x30,0x00,0x41,0x31,0x32,0x31,0x00,0x41,0x31,0x32,0x32,0x00, 0x41,0x31,0x32,0x33,0x00,0x41,0x31,0x32,0x34,0x00,0x41,0x31,0x32,0x35,0x00,0x41, 0x31,0x32,0x36,0x00,0x41,0x31,0x32,0x37,0x00,0x41,0x31,0x32,0x38,0x00,0x41,0x31, 0x32,0x39,0x00,0x41,0x31,0x33,0x30,0x00,0x41,0x31,0x33,0x31,0x00,0x41,0x31,0x33, 0x32,0x00,0x41,0x31,0x33,0x33,0x00,0x41,0x31,0x33,0x34,0x00,0x41,0x31,0x33,0x35, 0x00,0x41,0x31,0x33,0x36,0x00,0x41,0x31,0x33,0x37,0x00,0x41,0x31,0x33,0x38,0x00, 0x41,0x31,0x33,0x39,0x00,0x41,0x31,0x34,0x30,0x00,0x41,0x31,0x34,0x31,0x00,0x41, 0x31,0x34,0x32,0x00,0x41,0x31,0x34,0x33,0x00,0x41,0x31,0x34,0x34,0x00,0x41,0x31, 0x34,0x35,0x00,0x41,0x31,0x34,0x36,0x00,0x41,0x31,0x34,0x37,0x00,0x41,0x31,0x34, 0x38,0x00,0x41,0x31,0x34,0x39,0x00,0x41,0x31,0x35,0x30,0x00,0x41,0x31,0x35,0x31, 0x00,0x41,0x31,0x35,0x32,0x00,0x41,0x31,0x35,0x33,0x00,0x41,0x31,0x35,0x34,0x00, 0x41,0x31,0x35,0x35,0x00,0x41,0x31,0x35,0x36,0x00,0x41,0x31,0x35,0x37,0x00,0x41, 0x31,0x35,0x38,0x00,0x41,0x31,0x35,0x39,0x00,0x41,0x31,0x36,0x30,0x00,0x41,0x31, 0x36,0x31,0x00,0x41,0x31,0x36,0x32,0x00,0x41,0x31,0x36,0x33,0x00,0x41,0x31,0x36, 0x34,0x00,0x41,0x31,0x36,0x35,0x00,0x41,0x31,0x36,0x36,0x00,0x41,0x31,0x36,0x37, 0x00,0x41,0x31,0x36,0x38,0x00,0x41,0x31,0x36,0x39,0x00,0x41,0x31,0x37,0x30,0x00, 0x41,0x31,0x37,0x31,0x00,0x41,0x31,0x37,0x32,0x00,0x41,0x31,0x37,0x33,0x00,0x41, 0x31,0x37,0x34,0x00,0x41,0x31,0x37,0x35,0x00,0x41,0x31,0x37,0x36,0x00,0x41,0x31, 0x37,0x37,0x00,0x41,0x31,0x37,0x38,0x00,0x41,0x31,0x37,0x39,0x00,0x41,0x31,0x38, 0x30,0x00,0x41,0x31,0x38,0x31,0x00,0x41,0x31,0x38,0x32,0x00,0x41,0x31,0x38,0x33, 0x00,0x41,0x31,0x38,0x34,0x00,0x41,0x31,0x38,0x35,0x00,0x41,0x31,0x38,0x36,0x00, 0x41,0x31,0x38,0x37,0x00,0x41,0x31,0x38,0x38,0x00,0x41,0x31,0x38,0x39,0x00,0x41, 0x31,0x39,0x30,0x00,0x41,0x31,0x39,0x31,0x00,0x41,0x31,0x39,0x32,0x00,0x41,0x31, 0x39,0x33,0x00,0x41,0x31,0x39,0x34,0x00,0x41,0x31,0x39,0x35,0x00,0x41,0x31,0x39, 0x36,0x00,0x41,0x31,0x39,0x37,0x00,0x41,0x31,0x39,0x38,0x00,0x41,0x31,0x39,0x39, 0x00,0x41,0x32,0x30,0x30,0x00,0x41,0x32,0x30,0x31,0x00,0x41,0x32,0x30,0x32,0x00, 0x41,0x32,0x30,0x33,0x00,0x41,0x32,0x30,0x34,0x00,0x41,0x32,0x30,0x35,0x00,0x41, 0x32,0x30,0x36,0x00,0x41,0x32,0x30,0x37,0x00,0x41,0x32,0x30,0x38,0x00,0x41,0x32, 0x30,0x39,0x00,0x41,0x32,0x31,0x30,0x00,0x41,0x32,0x31,0x31,0x00,0x41,0x32,0x31, 0x32,0x00,0x41,0x32,0x31,0x33,0x00,0x41,0x32,0x31,0x34,0x00,0x41,0x32,0x31,0x35, 0x00,0x41,0x32,0x31,0x36,0x00,0x41,0x32,0x31,0x37,0x00,0x41,0x32,0x31,0x38,0x00, 0x41,0x32,0x31,0x39,0x00,0x41,0x32,0x32,0x30,0x00,0x41,0x32,0x32,0x31,0x00,0x41, 0x32,0x32,0x32,0x00,0x41,0x32,0x32,0x33,0x00,0x41,0x32,0x32,0x34,0x00,0x41,0x32, 0x32,0x35,0x00,0x41,0x32,0x32,0x36,0x00,0x41,0x32,0x32,0x37,0x00,0x41,0x32,0x32, 0x38,0x00,0x41,0x32,0x32,0x39,0x00,0x41,0x32,0x33,0x30,0x00,0x41,0x32,0x33,0x31, 0x00,0x41,0x32,0x33,0x32,0x00,0x41,0x32,0x33,0x33,0x00,0x41,0x32,0x33,0x34,0x00, 0x41,0x32,0x33,0x35,0x00,0x41,0x32,0x33,0x36,0x00,0x41,0x32,0x33,0x37,0x00,0x41, 0x32,0x33,0x38,0x00,0x41,0x32,0x33,0x39,0x00,0x41,0x32,0x34,0x30,0x00,0x41,0x32, 0x34,0x31,0x00,0x41,0x32,0x34,0x32,0x00,0x41,0x32,0x34,0x33,0x00,0x41,0x32,0x34, 0x34,0x00,0x41,0x32,0x34,0x35,0x00,0x41,0x32,0x34,0x36,0x00,0x41,0x32,0x34,0x37, 0x00,0x41,0x32,0x34,0x38,0x00,0x41,0x32,0x34,0x39,0x00,0x41,0x32,0x35,0x30,0x00, 0x41,0x32,0x35,0x31,0x00,0x41,0x32,0x35,0x32,0x00,0x41,0x32,0x35,0x33,0x00,0x41, 0x32,0x35,0x34,0x00,0x41,0x32,0x35,0x35,0x00,0x41,0x32,0x35,0x36,0x00,0x41,0x32, 0x35,0x37,0x00,0x41,0x32,0x35,0x38,0x00,0x41,0x32,0x35,0x39,0x00,0x41,0x32,0x36, 0x30,0x00,0x41,0x32,0x36,0x31,0x00,0x41,0x32,0x36,0x32,0x00,0x41,0x32,0x36,0x33, 0x00,0x41,0x32,0x36,0x34,0x00,0x41,0x32,0x36,0x35,0x00,0x41,0x32,0x36,0x36,0x00, 0x41,0x32,0x36,0x37,0x00,0x41,0x32,0x36,0x38,0x00,0x41,0x32,0x36,0x39,0x00,0x41, 0x32,0x37,0x30,0x00,0x41,0x32,0x37,0x31,0x00,0x41,0x32,0x37,0x32,0x00,0x41,0x32, 0x37,0x33,0x00,0x41,0x32,0x37,0x34,0x00,0x41,0x32,0x37,0x35,0x00,0x41,0x32,0x37, 0x36,0x00,0x41,0x32,0x37,0x37,0x00,0x41,0x32,0x37,0x38,0x00,0x41,0x32,0x37,0x39, 0x00,0x41,0x32,0x38,0x30,0x00,0x41,0x32,0x38,0x31,0x00,0x41,0x32,0x38,0x32,0x00, 0x41,0x32,0x38,0x33,0x00,0x41,0x32,0x38,0x34,0x00,0x41,0x32,0x38,0x35,0x00,0x41, 0x32,0x38,0x36,0x00,0x41,0x32,0x38,0x37,0x00,0x41,0x32,0x38,0x38,0x00,0x50,0x30, 0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30, 0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30, 0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31, 0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31, 0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32, 0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32,0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32, 0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32,0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32, 0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33,0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33, 0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33,0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33, 0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33,0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34, 0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34,0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34, 0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34,0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34, 0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35,0x31,0x00,0x50,0x35,0x32,0x00,0x50,0x35, 0x33,0x00,0x50,0x35,0x34,0x00,0x50,0x35,0x35,0x00,0x50,0x35,0x36,0x00,0x50,0x35, 0x37,0x00,0x50,0x35,0x38,0x00,0x50,0x35,0x39,0x00,0x50,0x36,0x30,0x00,0x50,0x36, 0x31,0x00,0x50,0x36,0x32,0x00,0x50,0x36,0x33,0x00,0x50,0x36,0x34,0x00,0x50,0x36, 0x35,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f, 0x72,0x65,0x61,0x64,0x5f,0x4e,0x56,0x31,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31, 0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e, 0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x69,0x69,0x2e, 0x32,0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00, 0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42, 0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37, 0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x31, 0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31, 0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x31,0x33,0x00,0x42,0x42,0x5f, 0x31,0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x5f,0x31,0x35,0x00,0x42, 0x42,0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x5f,0x31,0x37, 0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x38,0x5f, 0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x32,0x30,0x00,0x42,0x42,0x5f,0x32, 0x30,0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x31,0x5f,0x32,0x32,0x00,0x42,0x42, 0x5f,0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42,0x5f,0x32,0x33,0x5f,0x32,0x34,0x00, 0x42,0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00,0x42,0x42,0x5f,0x32,0x35,0x5f,0x32, 0x36,0x00,0x42,0x42,0x5f,0x32,0x36,0x5f,0x32,0x37,0x00,0x42,0x42,0x5f,0x32,0x37, 0x5f,0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x38,0x5f,0x32,0x39,0x00,0x42,0x42,0x5f, 0x32,0x39,0x5f,0x33,0x30,0x00,0x42,0x42,0x5f,0x33,0x30,0x5f,0x33,0x31,0x00,0x42, 0x42,0x5f,0x33,0x31,0x5f,0x33,0x32,0x00,0x42,0x42,0x5f,0x33,0x32,0x5f,0x33,0x33, 0x00,0x42,0x42,0x5f,0x33,0x33,0x5f,0x33,0x34,0x00,0x42,0x42,0x5f,0x33,0x34,0x5f, 0x33,0x35,0x00,0x42,0x42,0x5f,0x33,0x35,0x5f,0x33,0x36,0x00,0x42,0x42,0x5f,0x33, 0x36,0x5f,0x33,0x37,0x00,0x42,0x42,0x5f,0x33,0x37,0x5f,0x33,0x38,0x00,0x42,0x42, 0x5f,0x33,0x38,0x5f,0x33,0x39,0x00,0x42,0x42,0x5f,0x33,0x39,0x5f,0x34,0x30,0x00, 0x42,0x42,0x5f,0x34,0x30,0x5f,0x34,0x31,0x00,0x42,0x42,0x5f,0x34,0x31,0x5f,0x34, 0x32,0x00,0x42,0x42,0x5f,0x34,0x32,0x5f,0x34,0x33,0x00,0x54,0x30,0x30,0x36,0x00, 0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42, 0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00, 0x00,0x00,0xd9,0x04,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x53,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x23,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8f,0x00,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xde,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4e,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5e,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5f,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00, 0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x23, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7f,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xae,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xce,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xde,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdf,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x01,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1, 0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01, 0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00, 0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2f,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31, 0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00, 0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x51,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xae,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaf,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1, 0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x02, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x02,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbf,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1, 0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x02, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x02,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xce,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcf,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1, 0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x02, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x02,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x53,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xde,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdf,0x02,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1, 0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x02, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x02,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00, 0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x53,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1, 0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x03,0x00, 0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00, 0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x20, 0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x20,0x01, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x20,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x20,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x20,0x01,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x51,0x40,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x51,0x20,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x23,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x12,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x03,0x00,0x00,0x51,0x08,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0x03,0x00,0x00,0x52,0x10,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x03,0x00,0x00,0x54,0x00,0x04,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x03,0x00,0x00,0x52,0x10,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x03, 0x00,0x00,0x51,0x08,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x03,0x00, 0x00,0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x03,0x00,0x00, 0x51,0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x51, 0x08,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x51,0x08, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x51,0x08,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x51,0x08,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x51,0x08,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x51,0x08,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x51,0x08,0x00,0x54,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x51,0x08,0x00,0x55,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x51,0x08,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4e,0x03,0x00,0x00,0x51,0x08,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x03,0x00,0x00,0x51,0x08,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x03,0x00,0x00,0x51,0x08,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51, 0x03,0x00,0x00,0x51,0x08,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x03, 0x00,0x00,0x51,0x08,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x03,0x00, 0x00,0x51,0x08,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x03,0x00,0x00, 0x51,0x08,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x51, 0x08,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x51,0x08, 0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x51,0x08,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x51,0x08,0x00,0x61, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x51,0x08,0x00,0x62,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x51,0x08,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x51,0x08,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x51,0x08,0x00,0x65,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x51,0x08,0x00,0x66,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5e,0x03,0x00,0x00,0x51,0x08,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5f,0x03,0x00,0x00,0x51,0x08,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x03,0x00,0x00,0x51,0x08,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61, 0x03,0x00,0x00,0x53,0x40,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x03, 0x00,0x00,0x52,0x10,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x03,0x00, 0x00,0x53,0x00,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x03,0x00,0x00, 0x53,0x40,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x53, 0x40,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x23,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x23,0x02,0x00, 0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x12,0x01,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x12,0x01,0x00,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x23,0x02,0x00,0x84,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x12,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0x03,0x00,0x00,0x12,0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x03,0x00,0x00,0x21,0x01,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x03,0x00,0x00,0x20,0x01,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71, 0x03,0x00,0x00,0x21,0x01,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x03, 0x00,0x00,0x12,0x08,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x03,0x00, 0x00,0x23,0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x03,0x00,0x00, 0x12,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03,0x00,0x00,0x12, 0x04,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00,0x00,0x20,0x01, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x21,0x01,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x20,0x01,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x20,0x01,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x20,0x01,0x00,0x9b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x20,0x01,0x00,0x9e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x20,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x03,0x00,0x00,0x20,0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7f,0x03,0x00,0x00,0x20,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x03,0x00,0x00,0x50,0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81, 0x03,0x00,0x00,0x20,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x03, 0x00,0x00,0x20,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x03,0x00, 0x00,0x20,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x03,0x00,0x00, 0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x21, 0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x20,0x01, 0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00,0x20,0x01,0x00, 0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x20,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x20,0x01,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x21,0x01,0x00,0xb5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x20,0x01,0x00,0xb6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x20,0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8e,0x03,0x00,0x00,0x20,0x01,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8f,0x03,0x00,0x00,0x20,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x03,0x00,0x00,0x20,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91, 0x03,0x00,0x00,0x20,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x03, 0x00,0x00,0x20,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x03,0x00, 0x00,0x21,0x01,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x03,0x00,0x00, 0x20,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x20, 0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x20,0x01, 0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x20,0x01,0x00, 0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x20,0x01,0x00,0xca, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x20,0x01,0x00,0xcc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x20,0x01,0x00,0xce,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x20,0x01,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x20,0x01,0x00,0xd4,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x20,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9e,0x03,0x00,0x00,0x20,0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9f,0x03,0x00,0x00,0x20,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x03,0x00,0x00,0x20,0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1, 0x03,0x00,0x00,0x20,0x01,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x03, 0x00,0x00,0x20,0x01,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x03,0x00, 0x00,0x20,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00, 0x20,0x01,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x03,0x00,0x00,0x20, 0x01,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x20,0x01, 0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x20,0x01,0x00, 0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x20,0x01,0x00,0xee, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x20,0x01,0x00,0xf0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x21,0x01,0x00,0xf1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x20,0x01,0x00,0xf2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x20,0x01,0x00,0xf3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x20,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xae,0x03,0x00,0x00,0x20,0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaf,0x03,0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x03,0x00,0x00,0x20,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1, 0x03,0x00,0x00,0x20,0x01,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x03,0x00, 0x00,0x20,0x01,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00, 0x20,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x21, 0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x20,0x01, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x20,0x01,0x00, 0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x20,0x01,0x00,0x09, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x20,0x01,0x00,0x0b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x20,0x01,0x00,0x0d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x20,0x01,0x00,0x10,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x20,0x01,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x20,0x01,0x00,0x15,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0x03,0x00,0x00,0x20,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xbf,0x03,0x00,0x00,0x20,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x03,0x00,0x00,0x20,0x01,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc1, 0x03,0x00,0x00,0x20,0x01,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x03, 0x00,0x00,0x20,0x01,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x03,0x00, 0x00,0x20,0x01,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00, 0x20,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x20, 0x01,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x21,0x01, 0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x01,0x00, 0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x20,0x01,0x00,0x2a, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x20,0x01,0x00,0x2c,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x20,0x01,0x00,0x31,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x20,0x01,0x00,0x33,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x20,0x01,0x00,0x34,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x51,0x08,0x00,0x35,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xce,0x03,0x00,0x00,0x54,0x00,0x04,0x73,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xcf,0x03,0x00,0x00,0x51,0x08,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x03,0x00,0x00,0x51,0x08,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd1, 0x03,0x00,0x00,0x51,0x08,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x03, 0x00,0x00,0x51,0x08,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x03,0x00, 0x00,0x51,0x08,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00, 0x51,0x08,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x51, 0x08,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x51,0x08, 0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x51,0x08,0x00, 0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x51,0x08,0x00,0x3f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x51,0x08,0x00,0x40,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x51,0x08,0x00,0x41,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x51,0x08,0x00,0x42,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x51,0x08,0x00,0x43,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x51,0x08,0x00,0x44,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xde,0x03,0x00,0x00,0x51,0x08,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xdf,0x03,0x00,0x00,0x51,0x08,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x03,0x00,0x00,0x51,0x08,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe1, 0x03,0x00,0x00,0x51,0x08,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x03, 0x00,0x00,0x51,0x08,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x03,0x00, 0x00,0x51,0x08,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x03,0x00,0x00, 0x51,0x08,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x03,0x00,0x00,0x51, 0x08,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x52,0x10, 0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x53,0x00,0x01, 0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x20,0x01,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x23,0x02,0x00,0x5c,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x12,0x01,0x00,0x5f,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x12,0x01,0x00,0x5d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x20,0x01,0x00,0x5c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x23,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x03,0x00,0x00,0x12,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x03,0x00,0x00,0x12,0x01,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x03,0x00,0x00,0x21,0x01,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf1, 0x03,0x00,0x00,0x20,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x03, 0x00,0x00,0x21,0x01,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x03,0x00, 0x00,0x12,0x08,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00, 0x23,0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x03,0x00,0x00,0x12, 0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x12,0x04, 0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x21,0x01,0x00, 0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x20,0x01,0x00,0x75, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x20,0x01,0x00,0x76,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x20,0x01,0x00,0x78,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x20,0x01,0x00,0x7c,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x20,0x01,0x00,0x7e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x20,0x01,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x20,0x01,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0x03,0x00,0x00,0x21,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x20,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x20,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04, 0x00,0x00,0x20,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x00, 0x00,0x21,0x01,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00, 0x20,0x01,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x20, 0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x20,0x01, 0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x20,0x01,0x00, 0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x20,0x01,0x00,0x8e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x21,0x01,0x00,0x8f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x20,0x01,0x00,0x90,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x20,0x01,0x00,0x91,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x20,0x01,0x00,0x93,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x20,0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x04,0x00,0x00,0x20,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x04,0x00,0x00,0x20,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x04,0x00,0x00,0x20,0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x04,0x00,0x00,0x20,0x01,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x04, 0x00,0x00,0x20,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x20,0x01,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x04,0x00,0x00, 0x20,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x20, 0x01,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x20,0x01, 0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x20,0x01,0x00, 0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x20,0x01,0x00,0xaf, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x21,0x01,0x00,0xb0,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x20,0x01,0x00,0xb1,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x20,0x01,0x00,0xb3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x20,0x01,0x00,0xb6,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x20,0x01,0x00,0xb8,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x04,0x00,0x00,0x20,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x04,0x00,0x00,0x20,0x01,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x04,0x00,0x00,0x21,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x20,0x01,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x04, 0x00,0x00,0x20,0x01,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x04,0x00, 0x00,0x20,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00, 0x20,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x20, 0x01,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x04,0x00,0x00,0x20,0x01, 0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x20,0x01,0x00, 0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x20,0x01,0x00,0xce, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x20,0x01,0x00,0xd0,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0x20,0x01,0x00,0xd2,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x20,0x01,0x00,0xd4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x21,0x01,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x20,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0x04,0x00,0x00,0x20,0x01,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x2f,0x04,0x00,0x00,0x20,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x04,0x00,0x00,0x20,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31, 0x04,0x00,0x00,0x20,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x04, 0x00,0x00,0x21,0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x04,0x00, 0x00,0x12,0x08,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x04,0x00,0x00, 0x23,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x12, 0x01,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00,0x12,0x04, 0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00,0x20,0x01,0x00, 0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x20,0x01,0x00,0xed, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x20,0x01,0x00,0xef,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00,0x20,0x01,0x00,0xf0,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x20,0x01,0x00,0xf1,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x20,0x01,0x00,0xf3,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x20,0x01,0x00,0xf5,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x04,0x00,0x00,0x20,0x01,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x20,0x01,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x04,0x00,0x00,0x20,0x01,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x04,0x00,0x00,0x20,0x01,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x04, 0x00,0x00,0x20,0x01,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x04,0x00, 0x00,0x20,0x01,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x04,0x00,0x00, 0x20,0x01,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x04,0x00,0x00,0x20, 0x01,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x20,0x01, 0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x20,0x01,0x00, 0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x20,0x01,0x00,0x0b, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x20,0x01,0x00,0x0c,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x20,0x01,0x00,0x0e,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x20,0x01,0x00,0x10,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x20,0x01,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x51,0x08,0x00,0x12,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x4e,0x04,0x00,0x00,0x54,0x00,0x04,0x42,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x04,0x00,0x00,0x51,0x08,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x04,0x00,0x00,0x51,0x08,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x51, 0x04,0x00,0x00,0x51,0x08,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x04, 0x00,0x00,0x51,0x08,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x00, 0x00,0x51,0x08,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x51,0x08,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x04,0x00,0x00,0x51, 0x08,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x04,0x00,0x00,0x51,0x08, 0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00,0x51,0x08,0x00, 0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x51,0x08,0x00,0x1c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x51,0x08,0x00,0x1d,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x51,0x08,0x00,0x1e,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x51,0x08,0x00,0x1f,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x51,0x08,0x00,0x20,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x51,0x08,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x5e,0x04,0x00,0x00,0x52,0x10,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x5f,0x04,0x00,0x00,0x53,0x00,0x01,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x04,0x00,0x00,0x23,0x02,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61, 0x04,0x00,0x00,0x12,0x01,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x04, 0x00,0x00,0x12,0x01,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x04,0x00, 0x00,0x20,0x01,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x04,0x00,0x00, 0x23,0x02,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x12, 0x01,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0x12,0x01, 0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x21,0x01,0x00, 0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x01,0x00,0x36, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x21,0x01,0x00,0x3a,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x12,0x08,0x00,0x3c,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x23,0x02,0x00,0x39,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x12,0x01,0x00,0x3e,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x12,0x04,0x00,0x3f,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0x04,0x00,0x00,0x21,0x01,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x04,0x00,0x00,0x20,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x04,0x00,0x00,0x20,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x71, 0x04,0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x04, 0x00,0x00,0x20,0x01,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x04,0x00, 0x00,0x20,0x01,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00, 0x20,0x01,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x20, 0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x04,0x00,0x00,0x21,0x01, 0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00,0x20,0x01,0x00, 0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x20,0x01,0x00,0x55, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x04,0x00,0x00,0x20,0x01,0x00,0x56,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x21,0x01,0x00,0x57,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x20,0x01,0x00,0x58,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x20,0x01,0x00,0x5a,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x20,0x01,0x00,0x5b,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x04,0x00,0x00,0x20,0x01,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x7f,0x04,0x00,0x00,0x20,0x01,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x04,0x00,0x00,0x21,0x01,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x81, 0x04,0x00,0x00,0x20,0x01,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x04, 0x00,0x00,0x20,0x01,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x20,0x01,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x04,0x00,0x00, 0x20,0x01,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x04,0x00,0x00,0x20, 0x01,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x04,0x00,0x00,0x20,0x01, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x04,0x00,0x00,0x20,0x01,0x00, 0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x20,0x01,0x00,0x6f, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0x00,0x00,0x20,0x01,0x00,0x71,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00,0x20,0x01,0x00,0x73,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x20,0x01,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x20,0x01,0x00,0x78,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x20,0x01,0x00,0x7a,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x8e,0x04,0x00,0x00,0x20,0x01,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x8f,0x04,0x00,0x00,0x20,0x01,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x04,0x00,0x00,0x21,0x01,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x91, 0x04,0x00,0x00,0x20,0x01,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x04, 0x00,0x00,0x20,0x01,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x04,0x00, 0x00,0x20,0x01,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x04,0x00,0x00, 0x20,0x01,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x04,0x00,0x00,0x20, 0x01,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x04,0x00,0x00,0x20,0x01, 0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00,0x21,0x01,0x00, 0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x04,0x00,0x00,0x20,0x01,0x00,0x8c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x20,0x01,0x00,0x8d,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x00,0x90,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x20,0x01,0x00,0x92,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x20,0x01,0x00,0x94,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x20,0x01,0x00,0x98,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x9e,0x04,0x00,0x00,0x20,0x01,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x9f,0x04,0x00,0x00,0x20,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x04,0x00,0x00,0x20,0x01,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa1, 0x04,0x00,0x00,0x20,0x01,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x04, 0x00,0x00,0x20,0x01,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x04,0x00, 0x00,0x21,0x01,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x04,0x00,0x00, 0x20,0x01,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x04,0x00,0x00,0x20, 0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x04,0x00,0x00,0x20,0x01, 0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00,0x20,0x01,0x00, 0xab,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x20,0x01,0x00,0xb0, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x20,0x01,0x00,0xb2,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x20,0x01,0x00,0xb4,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x51,0x20,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x51,0x20,0x00,0xe5,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x51,0x20,0x00,0xea,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xae,0x04,0x00,0x00,0x51,0x20,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xaf,0x04,0x00,0x00,0x51,0x08,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x04,0x00,0x00,0x54,0x80,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb1, 0x04,0x00,0x00,0x51,0x08,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x04, 0x00,0x00,0x54,0x80,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x04,0x00, 0x00,0x51,0x08,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00, 0x54,0x80,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x04,0x00,0x00,0x51, 0x08,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x54,0x80, 0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x51,0x08,0x00, 0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x54,0x80,0x00,0xda, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x04,0x00,0x00,0x51,0x08,0x00,0xbb,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x54,0x80,0x00,0xdb,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x51,0x08,0x00,0xbc,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x54,0x80,0x00,0xdc,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x51,0x08,0x00,0xbd,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0x04,0x00,0x00,0x54,0x80,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xbf,0x04,0x00,0x00,0x51,0x08,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x04,0x00,0x00,0x51,0x08,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc1, 0x04,0x00,0x00,0x51,0x08,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x04, 0x00,0x00,0x51,0x08,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x04,0x00, 0x00,0x51,0x08,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00, 0x51,0x08,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x04,0x00,0x00,0x51, 0x08,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x04,0x00,0x00,0x51,0x08, 0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x51,0x08,0x00, 0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x51,0x08,0x00,0xc7, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x04,0x00,0x00,0x51,0x08,0x00,0xc8,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00,0x51,0x08,0x00,0xc9,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x51,0x08,0x00,0xca,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x51,0x08,0x00,0xcb,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x51,0x08,0x00,0xcc,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xce,0x04,0x00,0x00,0x51,0x08,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xcf,0x04,0x00,0x00,0x51,0x08,0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x04,0x00,0x00,0x51,0x08,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd1, 0x04,0x00,0x00,0x51,0x08,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x04, 0x00,0x00,0x51,0x08,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x04,0x00, 0x00,0x51,0x08,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x04,0x00,0x00, 0x51,0x08,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x51, 0x08,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x04,0x00,0x00,0x51,0x08, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00,0x52,0x10,0x00, 0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x53,0x40,0x00,0xf4, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x04,0x00,0x00,0x53,0x40,0x00,0xf5,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x53,0x40,0x00,0xf6,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x53,0x40,0x00,0xf7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x20,0x01,0x00,0xf9,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x20,0x01,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xde,0x04,0x00,0x00,0x20,0x01,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xdf,0x04,0x00,0x00,0x20,0x01,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x04,0x00,0x00,0x20,0x01,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe1, 0x04,0x00,0x00,0x20,0x01,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x04, 0x00,0x00,0x20,0x01,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x04,0x00, 0x00,0x20,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x04,0x00,0x00, 0x20,0x01,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x04,0x00,0x00,0x20, 0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x04,0x00,0x00,0x20,0x01, 0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x04,0x00,0x00,0x20,0x01,0x00, 0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0x20,0x01,0x00,0x14, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x20,0x01,0x00,0x16,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x20,0x01,0x00,0x1a,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x20,0x01,0x00,0x1d,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x20,0x01,0x00,0x1f,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x20,0x01,0x00,0x21,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x04,0x00,0x00,0x20,0x01,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x04,0x00,0x00,0x20,0x01,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x04,0x00,0x00,0x20,0x01,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf1, 0x04,0x00,0x00,0x20,0x01,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x04, 0x00,0x00,0x20,0x01,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf3, 0x04,0x00,0x00,0x01,0x00,0x00,0xf4,0x04,0x00,0x00,0x10,0x00,0x00,0xf5,0x04,0x00, 0x00,0x10,0x00,0x00,0xf6,0x04,0x00,0x00,0x10,0x00,0x00,0xf7,0x04,0x00,0x00,0x10, 0x00,0x00,0xf8,0x04,0x00,0x00,0x10,0x00,0x00,0xf9,0x04,0x00,0x00,0x10,0x00,0x00, 0xfa,0x04,0x00,0x00,0x10,0x00,0x00,0xfb,0x04,0x00,0x00,0x10,0x00,0x00,0xfc,0x04, 0x00,0x00,0x10,0x00,0x00,0xfd,0x04,0x00,0x00,0x10,0x00,0x00,0xfe,0x04,0x00,0x00, 0x10,0x00,0x00,0xff,0x04,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x00,0x00,0x10,0x00, 0x00,0x01,0x05,0x00,0x00,0x10,0x00,0x00,0x02,0x05,0x00,0x00,0x10,0x00,0x00,0x03, 0x05,0x00,0x00,0x10,0x00,0x00,0x04,0x05,0x00,0x00,0x10,0x00,0x00,0x05,0x05,0x00, 0x00,0x10,0x00,0x00,0x06,0x05,0x00,0x00,0x10,0x00,0x00,0x07,0x05,0x00,0x00,0x10, 0x00,0x00,0x08,0x05,0x00,0x00,0x10,0x00,0x00,0x09,0x05,0x00,0x00,0x10,0x00,0x00, 0x0a,0x05,0x00,0x00,0x10,0x00,0x00,0x0b,0x05,0x00,0x00,0x10,0x00,0x00,0x0c,0x05, 0x00,0x00,0x10,0x00,0x00,0x0d,0x05,0x00,0x00,0x10,0x00,0x00,0x0e,0x05,0x00,0x00, 0x10,0x00,0x00,0x0f,0x05,0x00,0x00,0x10,0x00,0x00,0x10,0x05,0x00,0x00,0x10,0x00, 0x00,0x11,0x05,0x00,0x00,0x10,0x00,0x00,0x12,0x05,0x00,0x00,0x10,0x00,0x00,0x13, 0x05,0x00,0x00,0x10,0x00,0x00,0x14,0x05,0x00,0x00,0x10,0x00,0x00,0x15,0x05,0x00, 0x00,0x10,0x00,0x00,0x16,0x05,0x00,0x00,0x10,0x00,0x00,0x17,0x05,0x00,0x00,0x10, 0x00,0x00,0x18,0x05,0x00,0x00,0x10,0x00,0x00,0x19,0x05,0x00,0x00,0x10,0x00,0x00, 0x1a,0x05,0x00,0x00,0x10,0x00,0x00,0x1b,0x05,0x00,0x00,0x10,0x00,0x00,0x1c,0x05, 0x00,0x00,0x10,0x00,0x00,0x1d,0x05,0x00,0x00,0x10,0x00,0x00,0x1e,0x05,0x00,0x00, 0x10,0x00,0x00,0x1f,0x05,0x00,0x00,0x10,0x00,0x00,0x20,0x05,0x00,0x00,0x10,0x00, 0x00,0x21,0x05,0x00,0x00,0x10,0x00,0x00,0x22,0x05,0x00,0x00,0x10,0x00,0x00,0x23, 0x05,0x00,0x00,0x10,0x00,0x00,0x24,0x05,0x00,0x00,0x10,0x00,0x00,0x25,0x05,0x00, 0x00,0x10,0x00,0x00,0x26,0x05,0x00,0x00,0x10,0x00,0x00,0x27,0x05,0x00,0x00,0x10, 0x00,0x00,0x28,0x05,0x00,0x00,0x10,0x00,0x00,0x29,0x05,0x00,0x00,0x10,0x00,0x00, 0x2a,0x05,0x00,0x00,0x10,0x00,0x00,0x2b,0x05,0x00,0x00,0x10,0x00,0x00,0x2c,0x05, 0x00,0x00,0x10,0x00,0x00,0x2d,0x05,0x00,0x00,0x10,0x00,0x00,0x2e,0x05,0x00,0x00, 0x10,0x00,0x00,0x2f,0x05,0x00,0x00,0x10,0x00,0x00,0x30,0x05,0x00,0x00,0x10,0x00, 0x00,0x31,0x05,0x00,0x00,0x10,0x00,0x00,0x32,0x05,0x00,0x00,0x10,0x00,0x00,0x33, 0x05,0x00,0x00,0x10,0x00,0x00,0x34,0x05,0x00,0x00,0x10,0x00,0x00,0x35,0x05,0x00, 0x00,0x10,0x00,0x00,0x36,0x05,0x00,0x00,0x10,0x00,0x00,0x37,0x05,0x00,0x00,0x10, 0x00,0x00,0x38,0x05,0x00,0x00,0x10,0x00,0x00,0x39,0x05,0x00,0x00,0x10,0x00,0x00, 0x3a,0x05,0x00,0x00,0x10,0x00,0x00,0x3b,0x05,0x00,0x00,0x10,0x00,0x00,0x3c,0x05, 0x00,0x00,0x10,0x00,0x00,0x3d,0x05,0x00,0x00,0x10,0x00,0x00,0x3e,0x05,0x00,0x00, 0x10,0x00,0x00,0x3f,0x05,0x00,0x00,0x10,0x00,0x00,0x40,0x05,0x00,0x00,0x10,0x00, 0x00,0x41,0x05,0x00,0x00,0x10,0x00,0x00,0x42,0x05,0x00,0x00,0x10,0x00,0x00,0x43, 0x05,0x00,0x00,0x10,0x00,0x00,0x44,0x05,0x00,0x00,0x01,0x00,0x00,0x45,0x05,0x00, 0x00,0x01,0x00,0x00,0x46,0x05,0x00,0x00,0x01,0x00,0x00,0x47,0x05,0x00,0x00,0x01, 0x00,0x00,0x48,0x05,0x00,0x00,0x08,0x00,0x00,0x49,0x05,0x00,0x00,0x01,0x00,0x00, 0x4a,0x05,0x00,0x00,0x04,0x00,0x00,0x4b,0x05,0x00,0x00,0x01,0x00,0x00,0x4c,0x05, 0x00,0x00,0x10,0x00,0x00,0x4d,0x05,0x00,0x00,0x10,0x00,0x00,0x4e,0x05,0x00,0x00, 0x10,0x00,0x00,0x4f,0x05,0x00,0x00,0x10,0x00,0x00,0x50,0x05,0x00,0x00,0x10,0x00, 0x00,0x51,0x05,0x00,0x00,0x10,0x00,0x00,0x52,0x05,0x00,0x00,0x10,0x00,0x00,0x53, 0x05,0x00,0x00,0x10,0x00,0x00,0x54,0x05,0x00,0x00,0x10,0x00,0x00,0x55,0x05,0x00, 0x00,0x10,0x00,0x00,0x56,0x05,0x00,0x00,0x10,0x00,0x00,0x57,0x05,0x00,0x00,0x10, 0x00,0x00,0x58,0x05,0x00,0x00,0x10,0x00,0x00,0x59,0x05,0x00,0x00,0x10,0x00,0x00, 0x5a,0x05,0x00,0x00,0x10,0x00,0x00,0x5b,0x05,0x00,0x00,0x10,0x00,0x00,0x5c,0x05, 0x00,0x00,0x10,0x00,0x00,0x5d,0x05,0x00,0x00,0x10,0x00,0x00,0x5e,0x05,0x00,0x00, 0x10,0x00,0x00,0x5f,0x05,0x00,0x00,0x10,0x00,0x00,0x60,0x05,0x00,0x00,0x10,0x00, 0x00,0x61,0x05,0x00,0x00,0x10,0x00,0x00,0x62,0x05,0x00,0x00,0x10,0x00,0x00,0x63, 0x05,0x00,0x00,0x10,0x00,0x00,0x64,0x05,0x00,0x00,0x10,0x00,0x00,0x65,0x05,0x00, 0x00,0x10,0x00,0x00,0x66,0x05,0x00,0x00,0x10,0x00,0x00,0x67,0x05,0x00,0x00,0x10, 0x00,0x00,0x68,0x05,0x00,0x00,0x10,0x00,0x00,0x69,0x05,0x00,0x00,0x10,0x00,0x00, 0x6a,0x05,0x00,0x00,0x10,0x00,0x00,0x6b,0x05,0x00,0x00,0x10,0x00,0x00,0x6c,0x05, 0x00,0x00,0x10,0x00,0x00,0x6d,0x05,0x00,0x00,0x10,0x00,0x00,0x6e,0x05,0x00,0x00, 0x10,0x00,0x00,0x6f,0x05,0x00,0x00,0x10,0x00,0x00,0x70,0x05,0x00,0x00,0x10,0x00, 0x00,0x71,0x05,0x00,0x00,0x10,0x00,0x00,0x72,0x05,0x00,0x00,0x10,0x00,0x00,0x73, 0x05,0x00,0x00,0x10,0x00,0x00,0x74,0x05,0x00,0x00,0x10,0x00,0x00,0x75,0x05,0x00, 0x00,0x10,0x00,0x00,0x76,0x05,0x00,0x00,0x10,0x00,0x00,0x77,0x05,0x00,0x00,0x10, 0x00,0x00,0x78,0x05,0x00,0x00,0x10,0x00,0x00,0x79,0x05,0x00,0x00,0x10,0x00,0x00, 0x7a,0x05,0x00,0x00,0x10,0x00,0x00,0x7b,0x05,0x00,0x00,0x10,0x00,0x00,0x7c,0x05, 0x00,0x00,0x10,0x00,0x00,0x7d,0x05,0x00,0x00,0x10,0x00,0x00,0x7e,0x05,0x00,0x00, 0x10,0x00,0x00,0x7f,0x05,0x00,0x00,0x10,0x00,0x00,0x80,0x05,0x00,0x00,0x10,0x00, 0x00,0x81,0x05,0x00,0x00,0x10,0x00,0x00,0x82,0x05,0x00,0x00,0x10,0x00,0x00,0x83, 0x05,0x00,0x00,0x10,0x00,0x00,0x84,0x05,0x00,0x00,0x10,0x00,0x00,0x85,0x05,0x00, 0x00,0x10,0x00,0x00,0x86,0x05,0x00,0x00,0x10,0x00,0x00,0x87,0x05,0x00,0x00,0x10, 0x00,0x00,0x88,0x05,0x00,0x00,0x01,0x00,0x00,0x89,0x05,0x00,0x00,0x01,0x00,0x00, 0x8a,0x05,0x00,0x00,0x01,0x00,0x00,0x8b,0x05,0x00,0x00,0x01,0x00,0x00,0x8c,0x05, 0x00,0x00,0x08,0x00,0x00,0x8d,0x05,0x00,0x00,0x01,0x00,0x00,0x8e,0x05,0x00,0x00, 0x04,0x00,0x00,0x8f,0x05,0x00,0x00,0x01,0x00,0x00,0x90,0x05,0x00,0x00,0x08,0x00, 0x00,0x91,0x05,0x00,0x00,0x01,0x00,0x00,0x92,0x05,0x00,0x00,0x04,0x00,0x00,0x93, 0x05,0x00,0x00,0x01,0x00,0x00,0x94,0x05,0x00,0x00,0x10,0x00,0x00,0x95,0x05,0x00, 0x00,0x10,0x00,0x00,0x96,0x05,0x00,0x00,0x10,0x00,0x00,0x97,0x05,0x00,0x00,0x10, 0x00,0x00,0x98,0x05,0x00,0x00,0x10,0x00,0x00,0x99,0x05,0x00,0x00,0x10,0x00,0x00, 0x9a,0x05,0x00,0x00,0x10,0x00,0x00,0x9b,0x05,0x00,0x00,0x10,0x00,0x00,0x9c,0x05, 0x00,0x00,0x10,0x00,0x00,0x9d,0x05,0x00,0x00,0x10,0x00,0x00,0x9e,0x05,0x00,0x00, 0x10,0x00,0x00,0x9f,0x05,0x00,0x00,0x10,0x00,0x00,0xa0,0x05,0x00,0x00,0x10,0x00, 0x00,0xa1,0x05,0x00,0x00,0x10,0x00,0x00,0xa2,0x05,0x00,0x00,0x10,0x00,0x00,0xa3, 0x05,0x00,0x00,0x10,0x00,0x00,0xa4,0x05,0x00,0x00,0x10,0x00,0x00,0xa5,0x05,0x00, 0x00,0x10,0x00,0x00,0xa6,0x05,0x00,0x00,0x10,0x00,0x00,0xa7,0x05,0x00,0x00,0x10, 0x00,0x00,0xa8,0x05,0x00,0x00,0x10,0x00,0x00,0xa9,0x05,0x00,0x00,0x10,0x00,0x00, 0xaa,0x05,0x00,0x00,0x10,0x00,0x00,0xab,0x05,0x00,0x00,0x10,0x00,0x00,0xac,0x05, 0x00,0x00,0x10,0x00,0x00,0xad,0x05,0x00,0x00,0x10,0x00,0x00,0xae,0x05,0x00,0x00, 0x10,0x00,0x00,0xaf,0x05,0x00,0x00,0x10,0x00,0x00,0xb0,0x05,0x00,0x00,0x10,0x00, 0x00,0xb1,0x05,0x00,0x00,0x10,0x00,0x00,0xb2,0x05,0x00,0x00,0x10,0x00,0x00,0xb3, 0x05,0x00,0x00,0x10,0x00,0x00,0xb4,0x05,0x00,0x00,0x10,0x00,0x00,0xb5,0x05,0x00, 0x00,0x10,0x00,0x00,0xb6,0x05,0x00,0x00,0x10,0x00,0x00,0xb7,0x05,0x00,0x00,0x10, 0x00,0x00,0xb8,0x05,0x00,0x00,0x10,0x00,0x00,0xb9,0x05,0x00,0x00,0x10,0x00,0x00, 0xba,0x05,0x00,0x00,0x10,0x00,0x00,0xbb,0x05,0x00,0x00,0x10,0x00,0x00,0xbc,0x05, 0x00,0x00,0x01,0x00,0x00,0xbd,0x05,0x00,0x00,0x01,0x00,0x00,0xbe,0x05,0x00,0x00, 0x01,0x00,0x00,0xbf,0x05,0x00,0x00,0x01,0x00,0x00,0xc0,0x05,0x00,0x00,0x08,0x00, 0x00,0xc1,0x05,0x00,0x00,0x01,0x00,0x00,0xc2,0x05,0x00,0x00,0x04,0x00,0x00,0xc3, 0x05,0x00,0x00,0x01,0x00,0x00,0xc4,0x05,0x00,0x00,0x10,0x00,0x00,0xc5,0x05,0x00, 0x00,0x10,0x00,0x00,0xc6,0x05,0x00,0x00,0x10,0x00,0x00,0xc7,0x05,0x00,0x00,0x10, 0x00,0x00,0xc8,0x05,0x00,0x00,0x10,0x00,0x00,0xc9,0x05,0x00,0x00,0x10,0x00,0x00, 0xca,0x05,0x00,0x00,0x10,0x00,0x00,0xcb,0x05,0x00,0x00,0x10,0x00,0x00,0xcc,0x05, 0x00,0x00,0x10,0x00,0x00,0xcd,0x05,0x00,0x00,0x10,0x00,0x00,0xce,0x05,0x00,0x00, 0x10,0x00,0x00,0xcf,0x05,0x00,0x00,0x10,0x00,0x00,0xd0,0x05,0x00,0x00,0x10,0x00, 0x00,0xd1,0x05,0x00,0x00,0x10,0x00,0x00,0xd2,0x05,0x00,0x00,0x10,0x00,0x00,0xd3, 0x05,0x00,0x00,0x10,0x00,0x00,0xd4,0x05,0x00,0x00,0x10,0x00,0x00,0xd5,0x05,0x00, 0x00,0x10,0x00,0x00,0xd6,0x05,0x00,0x00,0x10,0x00,0x00,0xd7,0x05,0x00,0x00,0x10, 0x00,0x00,0xd8,0x05,0x00,0x00,0x10,0x00,0x00,0xd9,0x05,0x00,0x00,0x10,0x00,0x00, 0xda,0x05,0x00,0x00,0x10,0x00,0x00,0xdb,0x05,0x00,0x00,0x10,0x00,0x00,0xdc,0x05, 0x00,0x00,0x10,0x00,0x00,0xdd,0x05,0x00,0x00,0x10,0x00,0x00,0xde,0x05,0x00,0x00, 0x10,0x00,0x00,0xdf,0x05,0x00,0x00,0x10,0x00,0x00,0xe0,0x05,0x00,0x00,0x10,0x00, 0x00,0xe1,0x05,0x00,0x00,0x10,0x00,0x00,0xe2,0x05,0x00,0x00,0x10,0x00,0x00,0xe3, 0x05,0x00,0x00,0x10,0x00,0x00,0xe4,0x05,0x00,0x00,0x10,0x00,0x00,0xe5,0x05,0x00, 0x00,0x10,0x00,0x00,0xe6,0x05,0x00,0x00,0x10,0x00,0x00,0xe7,0x05,0x00,0x00,0x10, 0x00,0x00,0xe8,0x05,0x00,0x00,0x10,0x00,0x00,0xe9,0x05,0x00,0x00,0x10,0x00,0x00, 0xea,0x05,0x00,0x00,0x10,0x00,0x00,0xeb,0x05,0x00,0x00,0x10,0x00,0x00,0xec,0x05, 0x00,0x00,0x10,0x00,0x00,0xed,0x05,0x00,0x00,0x10,0x00,0x00,0xee,0x05,0x00,0x00, 0x10,0x00,0x00,0xef,0x05,0x00,0x00,0x10,0x00,0x00,0xf0,0x05,0x00,0x00,0x10,0x00, 0x00,0xf1,0x05,0x00,0x00,0x10,0x00,0x00,0xf2,0x05,0x00,0x00,0x10,0x00,0x00,0xf3, 0x05,0x00,0x00,0x10,0x00,0x00,0xf4,0x05,0x00,0x00,0x10,0x00,0x00,0xf5,0x05,0x00, 0x00,0x10,0x00,0x00,0xf6,0x05,0x00,0x00,0x10,0x00,0x00,0xf7,0x05,0x00,0x00,0x10, 0x00,0x00,0xf8,0x05,0x00,0x00,0x10,0x00,0x00,0xf9,0x05,0x00,0x00,0x10,0x00,0x00, 0xfa,0x05,0x00,0x00,0x10,0x00,0x00,0xfb,0x05,0x00,0x00,0x10,0x00,0x00,0xfc,0x05, 0x00,0x00,0x10,0x00,0x00,0xfd,0x05,0x00,0x00,0x10,0x00,0x00,0xfe,0x05,0x00,0x00, 0x10,0x00,0x00,0xff,0x05,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x10,0x00, 0x00,0x01,0x06,0x00,0x00,0x10,0x00,0x00,0x02,0x06,0x00,0x00,0x10,0x00,0x00,0x03, 0x06,0x00,0x00,0x10,0x00,0x00,0x04,0x06,0x00,0x00,0x10,0x00,0x00,0x05,0x06,0x00, 0x00,0x10,0x00,0x00,0x06,0x06,0x00,0x00,0x10,0x00,0x00,0x07,0x06,0x00,0x00,0x10, 0x00,0x00,0x08,0x06,0x00,0x00,0x10,0x00,0x00,0x09,0x06,0x00,0x00,0x10,0x00,0x00, 0x0a,0x06,0x00,0x00,0x10,0x00,0x00,0x0b,0x06,0x00,0x00,0x10,0x00,0x00,0x0c,0x06, 0x00,0x00,0x10,0x00,0x00,0x0d,0x06,0x00,0x00,0x10,0x00,0x00,0x0e,0x06,0x00,0x00, 0x10,0x00,0x00,0x0f,0x06,0x00,0x00,0x10,0x00,0x00,0x10,0x06,0x00,0x00,0x10,0x00, 0x00,0x11,0x06,0x00,0x00,0x10,0x00,0x00,0x12,0x06,0x00,0x00,0x10,0x00,0x00,0x13, 0x06,0x00,0x00,0x10,0x00,0x00,0x41,0x00,0x14,0x06,0x00,0x00,0x01,0x00,0x00,0x15, 0x06,0x00,0x00,0x01,0x00,0x00,0x16,0x06,0x00,0x00,0x01,0x00,0x00,0x17,0x06,0x00, 0x00,0x01,0x00,0x00,0x18,0x06,0x00,0x00,0x01,0x00,0x00,0x19,0x06,0x00,0x00,0x01, 0x00,0x00,0x1a,0x06,0x00,0x00,0x01,0x00,0x00,0x1b,0x06,0x00,0x00,0x01,0x00,0x00, 0x1c,0x06,0x00,0x00,0x01,0x00,0x00,0x1d,0x06,0x00,0x00,0x01,0x00,0x00,0x1e,0x06, 0x00,0x00,0x01,0x00,0x00,0x1f,0x06,0x00,0x00,0x01,0x00,0x00,0x20,0x06,0x00,0x00, 0x01,0x00,0x00,0x21,0x06,0x00,0x00,0x01,0x00,0x00,0x22,0x06,0x00,0x00,0x01,0x00, 0x00,0x23,0x06,0x00,0x00,0x01,0x00,0x00,0x24,0x06,0x00,0x00,0x01,0x00,0x00,0x25, 0x06,0x00,0x00,0x01,0x00,0x00,0x26,0x06,0x00,0x00,0x01,0x00,0x00,0x27,0x06,0x00, 0x00,0x01,0x00,0x00,0x28,0x06,0x00,0x00,0x01,0x00,0x00,0x29,0x06,0x00,0x00,0x01, 0x00,0x00,0x2a,0x06,0x00,0x00,0x01,0x00,0x00,0x2b,0x06,0x00,0x00,0x01,0x00,0x00, 0x2c,0x06,0x00,0x00,0x01,0x00,0x00,0x2d,0x06,0x00,0x00,0x01,0x00,0x00,0x2e,0x06, 0x00,0x00,0x01,0x00,0x00,0x2f,0x06,0x00,0x00,0x01,0x00,0x00,0x30,0x06,0x00,0x00, 0x01,0x00,0x00,0x31,0x06,0x00,0x00,0x01,0x00,0x00,0x32,0x06,0x00,0x00,0x01,0x00, 0x00,0x33,0x06,0x00,0x00,0x01,0x00,0x00,0x34,0x06,0x00,0x00,0x01,0x00,0x00,0x35, 0x06,0x00,0x00,0x01,0x00,0x00,0x36,0x06,0x00,0x00,0x01,0x00,0x00,0x37,0x06,0x00, 0x00,0x01,0x00,0x00,0x38,0x06,0x00,0x00,0x01,0x00,0x00,0x39,0x06,0x00,0x00,0x01, 0x00,0x00,0x3a,0x06,0x00,0x00,0x01,0x00,0x00,0x3b,0x06,0x00,0x00,0x01,0x00,0x00, 0x3c,0x06,0x00,0x00,0x01,0x00,0x00,0x3d,0x06,0x00,0x00,0x01,0x00,0x00,0x3e,0x06, 0x00,0x00,0x01,0x00,0x00,0x3f,0x06,0x00,0x00,0x01,0x00,0x00,0x40,0x06,0x00,0x00, 0x01,0x00,0x00,0x41,0x06,0x00,0x00,0x01,0x00,0x00,0x42,0x06,0x00,0x00,0x01,0x00, 0x00,0x43,0x06,0x00,0x00,0x01,0x00,0x00,0x44,0x06,0x00,0x00,0x01,0x00,0x00,0x45, 0x06,0x00,0x00,0x01,0x00,0x00,0x46,0x06,0x00,0x00,0x01,0x00,0x00,0x47,0x06,0x00, 0x00,0x01,0x00,0x00,0x48,0x06,0x00,0x00,0x01,0x00,0x00,0x49,0x06,0x00,0x00,0x01, 0x00,0x00,0x4a,0x06,0x00,0x00,0x01,0x00,0x00,0x4b,0x06,0x00,0x00,0x01,0x00,0x00, 0x4c,0x06,0x00,0x00,0x01,0x00,0x00,0x4d,0x06,0x00,0x00,0x01,0x00,0x00,0x4e,0x06, 0x00,0x00,0x01,0x00,0x00,0x4f,0x06,0x00,0x00,0x01,0x00,0x00,0x50,0x06,0x00,0x00, 0x01,0x00,0x00,0x51,0x06,0x00,0x00,0x01,0x00,0x00,0x52,0x06,0x00,0x00,0x01,0x00, 0x00,0x53,0x06,0x00,0x00,0x01,0x00,0x00,0x54,0x06,0x00,0x00,0x01,0x00,0x00,0x2b, 0x00,0x55,0x06,0x00,0x00,0x01,0x00,0x56,0x06,0x00,0x00,0x01,0x00,0x57,0x06,0x00, 0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x00,0x00,0x59,0x06,0x00,0x00,0x00,0x00,0x5a, 0x06,0x00,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x00,0x00,0x5c,0x06,0x00,0x00,0x00, 0x00,0x5d,0x06,0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x00,0x00,0x5f,0x06,0x00, 0x00,0x00,0x00,0x60,0x06,0x00,0x00,0x00,0x00,0x61,0x06,0x00,0x00,0x00,0x00,0x62, 0x06,0x00,0x00,0x00,0x00,0x63,0x06,0x00,0x00,0x00,0x00,0x64,0x06,0x00,0x00,0x00, 0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x00,0x00,0x67,0x06,0x00, 0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x00,0x00,0x69,0x06,0x00,0x00,0x00,0x00,0x6a, 0x06,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x00, 0x00,0x6d,0x06,0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x00,0x00,0x6f,0x06,0x00, 0x00,0x00,0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x71,0x06,0x00,0x00,0x00,0x00,0x72, 0x06,0x00,0x00,0x00,0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x74,0x06,0x00,0x00,0x00, 0x00,0x75,0x06,0x00,0x00,0x00,0x00,0x76,0x06,0x00,0x00,0x00,0x00,0x77,0x06,0x00, 0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x7a, 0x06,0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x7c,0x06,0x00,0x00,0x00, 0x00,0x7d,0x06,0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00,0x00,0x00,0x7f,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x80,0x06,0x00,0x00,0x01,0x00,0x00,0x81,0x06,0x00,0x00, 0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04, 0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28, 0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x28,0x03,0x00, 0x00,0x30,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x23, 0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x51,0xd8,0x00,0x00,0xd6,0x79,0x00,0x00,0x03, 0x00,0x82,0x06,0x00,0x00,0x16,0x67,0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f, 0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x37,0x2e,0x61,0x73,0x6d,0x83,0x06,0x00,0x00, 0x00,0x84,0x06,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xe0,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x67,0x45,0x23,0x01,0x01,0x03,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0x18,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf8,0xff,0xff, 0xff,0x01,0x03,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x01,0x03,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0xe8,0xff,0xff,0xff,0x2c,0x00,0x02,0x02,0x01,0x00,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0x02,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x26,0x00,0x24,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x39, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x38,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x03,0x00,0x00, 0x3c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x32,0x00, 0x03,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x03,0x00, 0x31,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06, 0x01,0x20,0x04,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x3e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x04,0x00, 0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x10,0x00,0x00,0x00,0x32, 0x00,0x04,0x80,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x06,0x01,0x20,0x04,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xf0,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00,0x00,0x00,0x2c,0x00,0x02,0x02, 0x05,0x00,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00, 0x00,0x32,0x00,0x05,0x80,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x3f,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x03,0x00,0x00,0x00, 0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x03, 0x00,0x29,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x06,0x00,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x06,0x00,0x05, 0x00,0x31,0x04,0x00,0x24,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x28,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x43,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x07, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x07,0x80,0x04,0x00,0x24,0x03,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x31,0x05,0x00,0x2c,0x00,0x04,0x02,0x08,0x00,0x00,0x43, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x08, 0x00,0x17,0x00,0x2c,0x00,0x00,0x02,0x09,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x09,0x00,0x0e,0x00,0x2c,0x00, 0x00,0x02,0x0a,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x32,0x00,0x0a,0x80,0x2a,0x00,0x29,0x03,0x00,0x00,0x00,0x44,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28, 0x04,0x01,0x01,0x00,0x00,0x04,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x03,0x00,0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x01,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x02,0x00,0x00,0x04,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0x02,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x03,0x18,0x00,0x02, 0x03,0x02,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28, 0x04,0x01,0x03,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x07,0x00,0x00,0x02,0x03,0x03,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x03,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x04,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x07,0x10,0x00,0x02,0x03,0x04,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x07,0x18,0x00,0x02, 0x03,0x04,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x05,0x00,0x00,0x04,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0b,0x00,0x00,0x02,0x03,0x05,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0b,0x08,0x00,0x02,0x03,0x05,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x06,0x00,0x00,0x04,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0b,0x10,0x00,0x02,0x03,0x06,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0b,0x18,0x00,0x02, 0x03,0x06,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28, 0x04,0x01,0x07,0x00,0x00,0x04,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0f,0x00,0x00,0x02,0x03,0x07,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0f,0x08,0x00,0x02,0x03,0x07,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x08,0x00,0x00,0x04,0x00,0x4d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0f,0x10,0x00,0x02,0x03,0x08,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0f,0x18,0x00,0x02, 0x03,0x08,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x28, 0x04,0x01,0x09,0x00,0x00,0x04,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x13,0x00,0x00,0x02,0x03,0x09,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x13,0x08,0x00,0x02,0x03,0x09,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0a,0x00,0x00,0x04,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x13,0x10,0x00,0x02,0x03,0x0a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x13,0x18,0x00,0x02, 0x03,0x0a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x28, 0x04,0x01,0x0b,0x00,0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x17,0x00,0x00,0x02,0x03,0x0b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x17,0x08,0x00,0x02,0x03,0x0b,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0c,0x00,0x00,0x04,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x17,0x10,0x00,0x02,0x03,0x0c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x17,0x18,0x00,0x02, 0x03,0x0c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x28, 0x04,0x01,0x0d,0x00,0x00,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1b,0x00,0x00,0x02,0x03,0x0d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1b,0x08,0x00,0x02,0x03,0x0d,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0e,0x00,0x00,0x04,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1b,0x10,0x00,0x02,0x03,0x0e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1b,0x18,0x00,0x02, 0x03,0x0e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4e,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x28, 0x04,0x01,0x0f,0x00,0x00,0x04,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1f,0x00,0x00,0x02,0x03,0x0f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1f,0x08,0x00,0x02,0x03,0x0f,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x10,0x00,0x00,0x04,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1f,0x10,0x00,0x02,0x03,0x10,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1f,0x18,0x00,0x02, 0x03,0x10,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x4f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28, 0x04,0x01,0x11,0x00,0x00,0x04,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x02,0x00,0x00,0x02,0x03,0x11,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x11,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x12,0x00,0x00,0x04,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0x12,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x02,0x18,0x00,0x02, 0x03,0x12,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x50,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28, 0x04,0x01,0x13,0x00,0x00,0x04,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x06,0x00,0x00,0x02,0x03,0x13,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x13,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x14,0x00,0x00,0x04,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x06,0x10,0x00,0x02,0x03,0x14,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x06,0x18,0x00,0x02, 0x03,0x14,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x15,0x00,0x00,0x04,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0a,0x00,0x00,0x02,0x03,0x15,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0a,0x08,0x00,0x02,0x03,0x15,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x16,0x00,0x00,0x04,0x00,0x54,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0a,0x10,0x00,0x02,0x03,0x16,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0a,0x18,0x00,0x02, 0x03,0x16,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28, 0x04,0x01,0x17,0x00,0x00,0x04,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0e,0x00,0x00,0x02,0x03,0x17,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0e,0x08,0x00,0x02,0x03,0x17,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x18,0x00,0x00,0x04,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0e,0x10,0x00,0x02,0x03,0x18,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0e,0x18,0x00,0x02, 0x03,0x18,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x28, 0x04,0x01,0x19,0x00,0x00,0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x12,0x00,0x00,0x02,0x03,0x19,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x12,0x08,0x00,0x02,0x03,0x19,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1a,0x00,0x00,0x04,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x12,0x10,0x00,0x02,0x03,0x1a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x12,0x18,0x00,0x02, 0x03,0x1a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x28, 0x04,0x01,0x1b,0x00,0x00,0x04,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x16,0x00,0x00,0x02,0x03,0x1b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x16,0x08,0x00,0x02,0x03,0x1b,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1c,0x00,0x00,0x04,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x16,0x10,0x00,0x02,0x03,0x1c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x16,0x18,0x00,0x02, 0x03,0x1c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x28, 0x04,0x01,0x1d,0x00,0x00,0x04,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1a,0x00,0x00,0x02,0x03,0x1d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1a,0x08,0x00,0x02,0x03,0x1d,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1e,0x00,0x00,0x04,0x00,0x58,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1a,0x10,0x00,0x02,0x03,0x1e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1a,0x18,0x00,0x02, 0x03,0x1e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x28, 0x04,0x01,0x1f,0x00,0x00,0x04,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1e,0x00,0x00,0x02,0x03,0x1f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1e,0x08,0x00,0x02,0x03,0x1f,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x20,0x00,0x00,0x04,0x00,0x59,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1e,0x10,0x00,0x02,0x03,0x20,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1e,0x18,0x00,0x02, 0x03,0x20,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28, 0x04,0x01,0x21,0x00,0x00,0x04,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x03,0x21,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x21,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x22,0x00,0x00,0x04,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x22,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x01,0x18,0x00,0x02, 0x03,0x22,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28, 0x04,0x01,0x23,0x00,0x00,0x04,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x05,0x00,0x00,0x02,0x03,0x23,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x23,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x24,0x00,0x00,0x04,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x05,0x10,0x00,0x02,0x03,0x24,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x05,0x18,0x00,0x02, 0x03,0x24,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x25,0x00,0x00,0x04,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x09,0x00,0x00,0x02,0x03,0x25,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x09,0x08,0x00,0x02,0x03,0x25,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x26,0x00,0x00,0x04,0x00,0x5c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x09,0x10,0x00,0x02,0x03,0x26,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x09,0x18,0x00,0x02, 0x03,0x26,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28, 0x04,0x01,0x27,0x00,0x00,0x04,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0d,0x00,0x00,0x02,0x03,0x27,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0d,0x08,0x00,0x02,0x03,0x27,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x28,0x00,0x00,0x04,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0d,0x10,0x00,0x02,0x03,0x28,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0d,0x18,0x00,0x02, 0x03,0x28,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x28, 0x04,0x01,0x29,0x00,0x00,0x04,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x11,0x00,0x00,0x02,0x03,0x29,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x11,0x08,0x00,0x02,0x03,0x29,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2a,0x00,0x00,0x04,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x11,0x10,0x00,0x02,0x03,0x2a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x11,0x18,0x00,0x02, 0x03,0x2a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5c,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x28, 0x04,0x01,0x2b,0x00,0x00,0x04,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x15,0x00,0x00,0x02,0x03,0x2b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x15,0x08,0x00,0x02,0x03,0x2b,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2c,0x00,0x00,0x04,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x15,0x10,0x00,0x02,0x03,0x2c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x15,0x18,0x00,0x02, 0x03,0x2c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x28, 0x04,0x01,0x2d,0x00,0x00,0x04,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x19,0x00,0x00,0x02,0x03,0x2d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x19,0x08,0x00,0x02,0x03,0x2d,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2e,0x00,0x00,0x04,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x19,0x10,0x00,0x02,0x03,0x2e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x19,0x18,0x00,0x02, 0x03,0x2e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5e,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x28, 0x04,0x01,0x2f,0x00,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1d,0x00,0x00,0x02,0x03,0x2f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1d,0x08,0x00,0x02,0x03,0x2f,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x30,0x00,0x00,0x04,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1d,0x10,0x00,0x02,0x03,0x30,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1d,0x18,0x00,0x02, 0x03,0x30,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x28, 0x04,0x01,0x31,0x00,0x00,0x04,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x03,0x31,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x31,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x32,0x00,0x00,0x04,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x32,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x18,0x00,0x02, 0x03,0x32,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x60,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x28, 0x04,0x01,0x33,0x00,0x00,0x04,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x04,0x00,0x00,0x02,0x03,0x33,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x33,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x34,0x00,0x00,0x04,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x04,0x10,0x00,0x02,0x03,0x34,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x04,0x18,0x00,0x02, 0x03,0x34,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x61,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x35,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x08,0x00,0x00,0x02,0x03,0x35,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x08,0x08,0x00,0x02,0x03,0x35,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x36,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x08,0x10,0x00,0x02,0x03,0x36,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x08,0x18,0x00,0x02, 0x03,0x36,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x62,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28, 0x04,0x01,0x37,0x00,0x00,0x04,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x0c,0x00,0x00,0x02,0x03,0x37,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0c,0x08,0x00,0x02,0x03,0x37,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x38,0x00,0x00,0x04,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x0c,0x10,0x00,0x02,0x03,0x38,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x0c,0x18,0x00,0x02, 0x03,0x38,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x63,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x04,0x00,0x22,0x01,0x28, 0x04,0x01,0x39,0x00,0x00,0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x10,0x00,0x00,0x02,0x03,0x39,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x10,0x08,0x00,0x02,0x03,0x39,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3a,0x00,0x00,0x04,0x00,0x66,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x10,0x10,0x00,0x02,0x03,0x3a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x10,0x18,0x00,0x02, 0x03,0x3a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x64,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x05,0x00,0x22,0x01,0x28, 0x04,0x01,0x3b,0x00,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x14,0x00,0x00,0x02,0x03,0x3b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x14,0x08,0x00,0x02,0x03,0x3b,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3c,0x00,0x00,0x04,0x00,0x67,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x14,0x10,0x00,0x02,0x03,0x3c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x14,0x18,0x00,0x02, 0x03,0x3c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x06,0x00,0x22,0x01,0x28, 0x04,0x01,0x3d,0x00,0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x18,0x00,0x00,0x02,0x03,0x3d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x18,0x08,0x00,0x02,0x03,0x3d,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3e,0x00,0x00,0x04,0x00,0x68,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x18,0x10,0x00,0x02,0x03,0x3e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x18,0x18,0x00,0x02, 0x03,0x3e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x03,0x00,0x00,0x07,0x00,0x22,0x01,0x28, 0x04,0x01,0x3f,0x00,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x1c,0x00,0x00,0x02,0x03,0x3f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1c,0x08,0x00,0x02,0x03,0x3f,0x00,0x08,0x00, 0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x40,0x00,0x00,0x04,0x00,0x69,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x1c,0x10,0x00,0x02,0x03,0x40,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x1c,0x18,0x00,0x02, 0x03,0x40,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x0c,0xce,0x8a, 0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x08,0x00, 0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff, 0x28,0x04,0x01,0x41,0x00,0x00,0x04,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03, 0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x41,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x41,0x00,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x42,0x00, 0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x07,0x00,0x00, 0x02,0x03,0x42,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x03,0x00,0x00,0x07,0x08,0x00,0x02,0x03,0x42,0x00,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03, 0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x43,0x00,0x00,0x04,0x00,0x6e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0b,0x00,0x00,0x02,0x03,0x43,0x00,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0b,0x08, 0x00,0x02,0x03,0x43,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x03,0x00,0x22, 0x01,0x28,0x04,0x01,0x44,0x00,0x00,0x04,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x03,0x00,0x00,0x0f,0x00,0x00,0x02,0x03,0x44,0x00,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0f,0x08,0x00,0x02,0x03,0x44,0x00, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x45, 0x00,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x02,0x00, 0x00,0x02,0x03,0x45,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0x69,0x03,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x45,0x00,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x46,0x00,0x00,0x04,0x00,0x71, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x46,0x00, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x06, 0x08,0x00,0x02,0x03,0x46,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x02,0x00, 0x22,0x01,0x28,0x04,0x01,0x47,0x00,0x00,0x04,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x69,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x03,0x47,0x00,0x00,0x00,0x00,0x03,0x20, 0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0a,0x08,0x00,0x02,0x03,0x47, 0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01, 0x48,0x00,0x00,0x04,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0e, 0x00,0x00,0x02,0x03,0x48,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x03,0x00,0x00,0x0e,0x08,0x00,0x02,0x03,0x48,0x00,0x08,0x00,0x00,0x03, 0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x49,0x00,0x00,0x04,0x00, 0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x49, 0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00, 0x01,0x08,0x00,0x02,0x03,0x49,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x03,0x00,0x00,0x01, 0x00,0x22,0x01,0x28,0x04,0x01,0x4a,0x00,0x00,0x04,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x03,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x4a,0x00,0x00,0x00,0x00,0x03, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x05,0x08,0x00,0x02,0x03, 0x4a,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x03,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04, 0x01,0x4b,0x00,0x00,0x04,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00, 0x09,0x00,0x00,0x02,0x03,0x4b,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x09,0x08,0x00,0x02,0x03,0x4b,0x00,0x08,0x00,0x00, 0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6b,0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x4c,0x00,0x00,0x04, 0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0d,0x00,0x00,0x02,0x03, 0x4c,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x0d,0x08,0x00,0x02,0x03,0x4c,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x4d,0x00,0x00,0x04,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x4d,0x00,0x00,0x00,0x00, 0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x4d,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28, 0x04,0x01,0x4e,0x00,0x00,0x04,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x04,0x00,0x00,0x02,0x03,0x4e,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0x4e,0x00,0x08,0x00, 0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x4f,0x00,0x00, 0x04,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x08,0x00,0x00,0x02, 0x03,0x4f,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03, 0x00,0x00,0x08,0x08,0x00,0x02,0x03,0x4f,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29, 0x04,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x50,0x00,0x00,0x04,0x00,0x7b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0c,0x00,0x00,0x02,0x03,0x50,0x00,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x0c,0x08,0x00, 0x02,0x03,0x50,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x2c,0x00,0x00,0x02,0x0b,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32, 0x00,0x0b,0x00,0x08,0x00,0x24,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x31,0x06,0x00,0x24,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x07, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x03,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00, 0x01,0x51,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x51,0x00,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x51,0x00,0x00,0x20,0x00, 0x01,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x03,0x51,0x00,0x00,0x40,0x00,0x01,0x22,0x01,0x28,0x00,0x01,0x52,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x04,0x00,0x00,0x03,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x03,0x52,0x00,0x00, 0x40,0x00,0x01,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x0c,0x00, 0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x0c,0x00,0x06,0x00,0x25,0x00,0x00,0x00,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x0d,0x00,0x00,0x83,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x0d,0x00, 0x08,0x00,0x31,0x07,0x00,0x24,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x07,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x01,0x53, 0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x73,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x03,0x53,0x00,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x88,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x53,0x00,0x00,0x20,0x00,0x01,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x53, 0x00,0x00,0x40,0x00,0x01,0x22,0x01,0x28,0x00,0x01,0x54,0x00,0x00,0x00,0x00,0x95, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x04,0x00,0x00,0x03,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x88,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x03,0x54,0x00,0x00,0x40,0x00, 0x01,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00, 0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x0e,0x00,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x0e,0x80,0x07,0x00,0x31,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x0f,0x00,0x00,0x76,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x32,0x00,0x0f,0x80,0x0a,0x00, 0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10, 0x32,0x54,0x76,0x10,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32, 0x10,0x32,0x10,0x02,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x18,0x00,0x00, 0x00,0x31,0x09,0x00,0x01,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x03, 0x01,0x55,0x00,0x00,0x03,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x91,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x55,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x24,0x00,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x56,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x7a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x56,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x56,0x00,0x00, 0xe0,0xfe,0x01,0x00,0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x56,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x91,0x00,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x56,0x00,0x00,0xe0,0xff,0x01,0x00, 0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x56, 0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x56,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x91,0x00, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x56,0x00,0x00,0x60,0x01, 0x01,0x00,0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x56,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x91,0x00,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x28,0x02,0x01,0x57,0x00,0x00,0x02,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x57,0x00,0x00,0x00,0x00,0x01,0x20,0x01, 0x28,0x00,0x01,0x58,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x58,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x58,0x00,0x00,0x80,0x00,0x01,0x00,0x02,0x00,0x94,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x58,0x00,0x00,0x00,0x01,0x01, 0x00,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x58,0x00,0x00,0x80,0x01,0x01,0x00,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x03,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00, 0x02,0x10,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x10,0x80,0x09,0x00,0x31,0x0a,0x00,0x2c,0x00, 0x04,0x02,0x11,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x32,0x00,0x11,0x80,0x0c,0x00,0x2c,0x00,0x04,0x02,0x12,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00, 0x12,0x00,0x0b,0x00,0x2c,0x00,0x00,0x02,0x13,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x13,0x80,0x2a,0x00,0x25, 0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x7e,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x96,0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x01,0x10, 0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x96,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa4,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa5,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x85,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0xe0,0x00,0x24,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x60,0x01,0x10,0x00,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xab,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x89,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0xe0,0x01,0x25,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x8c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb0,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x8f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0x95,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x90,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xe0,0x00,0x32, 0x00,0x00,0x00,0x2a,0x00,0x31,0x0b,0x00,0x2c,0x00,0x00,0x02,0x14,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x14, 0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x92, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb8,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xe0,0x00, 0x25,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x96,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbe, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x98,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x60,0x00,0x32,0x00, 0x00,0x00,0x2a,0x00,0x31,0x0c,0x00,0x32,0x00,0x02,0x00,0x0d,0x00,0x2b,0x00,0x02, 0x15,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x15,0x80,0x2a,0x00,0x25,0x00, 0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x9a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96, 0x00,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xc6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x96,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x02, 0x10,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xcd,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xde,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xde,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00, 0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96, 0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x40,0x01,0x01, 0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00, 0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdb,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xdc,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x96,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xde,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00, 0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x03, 0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa9,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xe0,0x00,0x24, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xaa,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0x60,0x01,0x10,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xea,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0x60,0x02,0x10,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0xe0,0x02,0x10,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xed,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x60,0x03,0x10,0x00,0x00,0x00, 0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xef, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaf,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xe0, 0x03,0x25,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xb1,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf4,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x95,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf9,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x95,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xfb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x95,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xba,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x0d,0x00,0x2c,0x00,0x00, 0x02,0x16,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0x16,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x80,0x00,0x24, 0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbf,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x80, 0x01,0x24,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x0f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x14,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x15, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x96,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x40, 0x02,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x1b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0xc0,0x02,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xc6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xe0,0x00,0x24,0x00,0x00, 0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc8,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0x60,0x01,0x10,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x60,0x02, 0x10,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x96, 0x00,0x00,0x00,0xe0,0x02,0x25,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xcd,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2d,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x30, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x31,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd0, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x32,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x95, 0x00,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x0e,0x00,0x29,0x03, 0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x59,0x00,0x00,0x04,0x00,0x35,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x59,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x02,0x08,0x00,0x02, 0x03,0x59,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x5a,0x00,0x00,0x04, 0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x02,0x10,0x00,0x02,0x03, 0x5a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x02,0x18,0x00,0x02,0x03,0x5a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x5b,0x00,0x00,0x04,0x00,0x36,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x5b,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x06,0x08,0x00,0x02, 0x03,0x5b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x5c,0x00,0x00,0x04, 0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x06,0x10,0x00,0x02,0x03, 0x5c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x06,0x18,0x00,0x02,0x03,0x5c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x5d,0x00,0x00,0x04,0x00,0x37,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x03,0x5d,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0a,0x08,0x00,0x02, 0x03,0x5d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x5e,0x00,0x00,0x04, 0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0a,0x10,0x00,0x02,0x03, 0x5e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x0a,0x18,0x00,0x02,0x03,0x5e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x5f,0x00,0x00,0x04,0x00,0x38,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x0e,0x00,0x00,0x02,0x03,0x5f,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0e,0x08,0x00,0x02, 0x03,0x5f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x60,0x00,0x00,0x04, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0e,0x10,0x00,0x02,0x03, 0x60,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x0e,0x18,0x00,0x02,0x03,0x60,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x61,0x00,0x00,0x04,0x00,0x39,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x12,0x00,0x00,0x02,0x03,0x61,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x12,0x08,0x00,0x02, 0x03,0x61,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x62,0x00,0x00,0x04, 0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x12,0x10,0x00,0x02,0x03, 0x62,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x12,0x18,0x00,0x02,0x03,0x62,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x63,0x00,0x00,0x04,0x00,0x3a,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x03,0x63,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x16,0x08,0x00,0x02, 0x03,0x63,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x64,0x00,0x00,0x04, 0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x16,0x10,0x00,0x02,0x03, 0x64,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x16,0x18,0x00,0x02,0x03,0x64,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x65,0x00,0x00,0x04,0x00,0x3b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x1a,0x00,0x00,0x02,0x03,0x65,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1a,0x08,0x00,0x02, 0x03,0x65,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x66,0x00,0x00,0x04, 0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1a,0x10,0x00,0x02,0x03, 0x66,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x1a,0x18,0x00,0x02,0x03,0x66,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x67,0x00,0x00,0x04,0x00,0x3c,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x1e,0x00,0x00,0x02,0x03,0x67,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1e,0x08,0x00,0x02, 0x03,0x67,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x68,0x00,0x00,0x04, 0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1e,0x10,0x00,0x02,0x03, 0x68,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x1e,0x18,0x00,0x02,0x03,0x68,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x69,0x00,0x00,0x04,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x69,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x69,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x6a,0x00,0x00,0x04, 0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x01,0x10,0x00,0x02,0x03, 0x6a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x01,0x18,0x00,0x02,0x03,0x6a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x6b,0x00,0x00,0x04,0x00,0x3e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x6b,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x05,0x08,0x00,0x02, 0x03,0x6b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x6c,0x00,0x00,0x04, 0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x05,0x10,0x00,0x02,0x03, 0x6c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x05,0x18,0x00,0x02,0x03,0x6c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x6d,0x00,0x00,0x04,0x00,0x3f,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x09,0x00,0x00,0x02,0x03,0x6d,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x09,0x08,0x00,0x02, 0x03,0x6d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x6e,0x00,0x00,0x04, 0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x09,0x10,0x00,0x02,0x03, 0x6e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x09,0x18,0x00,0x02,0x03,0x6e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x6f,0x00,0x00,0x04,0x00,0x40,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x0d,0x00,0x00,0x02,0x03,0x6f,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0d,0x08,0x00,0x02, 0x03,0x6f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x70,0x00,0x00,0x04, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0d,0x10,0x00,0x02,0x03, 0x70,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x0d,0x18,0x00,0x02,0x03,0x70,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x71,0x00,0x00,0x04,0x00,0x41,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x11,0x00,0x00,0x02,0x03,0x71,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x11,0x08,0x00,0x02, 0x03,0x71,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x72,0x00,0x00,0x04, 0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x11,0x10,0x00,0x02,0x03, 0x72,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x11,0x18,0x00,0x02,0x03,0x72,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x73,0x00,0x00,0x04,0x00,0x42,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x15,0x00,0x00,0x02,0x03,0x73,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x15,0x08,0x00,0x02, 0x03,0x73,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x74,0x00,0x00,0x04, 0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x15,0x10,0x00,0x02,0x03, 0x74,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x15,0x18,0x00,0x02,0x03,0x74,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x75,0x00,0x00,0x04,0x00,0x43,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x19,0x00,0x00,0x02,0x03,0x75,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x19,0x08,0x00,0x02, 0x03,0x75,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x76,0x00,0x00,0x04, 0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x19,0x10,0x00,0x02,0x03, 0x76,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x19,0x18,0x00,0x02,0x03,0x76,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x77,0x00,0x00,0x04,0x00,0x44,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x1d,0x00,0x00,0x02,0x03,0x77,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1d,0x08,0x00,0x02, 0x03,0x77,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x78,0x00,0x00,0x04, 0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1d,0x10,0x00,0x02,0x03, 0x78,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x1d,0x18,0x00,0x02,0x03,0x78,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x79,0x00,0x00,0x04,0x00,0x45,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x79,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x79,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x7a,0x00,0x00,0x04, 0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x10,0x00,0x02,0x03, 0x7a,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x00,0x18,0x00,0x02,0x03,0x7a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x7b,0x00,0x00,0x04,0x00,0x46,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x7b,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x04,0x08,0x00,0x02, 0x03,0x7b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x7c,0x00,0x00,0x04, 0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x04,0x10,0x00,0x02,0x03, 0x7c,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x04,0x18,0x00,0x02,0x03,0x7c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x7d,0x00,0x00,0x04,0x00,0x47,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x03,0x7d,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x08,0x08,0x00,0x02, 0x03,0x7d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x7e,0x00,0x00,0x04, 0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x08,0x10,0x00,0x02,0x03, 0x7e,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x08,0x18,0x00,0x02,0x03,0x7e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x7f,0x00,0x00,0x04,0x00,0x48,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x0c,0x00,0x00,0x02,0x03,0x7f,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0c,0x08,0x00,0x02, 0x03,0x7f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x80,0x00,0x00,0x04, 0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0c,0x10,0x00,0x02,0x03, 0x80,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x0c,0x18,0x00,0x02,0x03,0x80,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x81,0x00,0x00,0x04,0x00,0x49,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x10,0x00,0x00,0x02,0x03,0x81,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x10,0x08,0x00,0x02, 0x03,0x81,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x82,0x00,0x00,0x04, 0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x10,0x10,0x00,0x02,0x03, 0x82,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x10,0x18,0x00,0x02,0x03,0x82,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x83,0x00,0x00,0x04,0x00,0x4a,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x14,0x00,0x00,0x02,0x03,0x83,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x14,0x08,0x00,0x02, 0x03,0x83,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x84,0x00,0x00,0x04, 0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x14,0x10,0x00,0x02,0x03, 0x84,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x14,0x18,0x00,0x02,0x03,0x84,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x85,0x00,0x00,0x04,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x18,0x00,0x00,0x02,0x03,0x85,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x18,0x08,0x00,0x02, 0x03,0x85,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x86,0x00,0x00,0x04, 0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x18,0x10,0x00,0x02,0x03, 0x86,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x18,0x18,0x00,0x02,0x03,0x86,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x87,0x00,0x00,0x04,0x00,0x4c,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x03,0x87,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0x08,0x00,0x02, 0x03,0x87,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x88,0x00,0x00,0x04, 0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0x10,0x00,0x02,0x03, 0x88,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x1c,0x18,0x00,0x02,0x03,0x88,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x04, 0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x0c,0xce,0x8a,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x4e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x10, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x4f,0x01, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0xf0,0xff,0xff,0xff,0x28,0x04,0x01,0x89,0x00,0x00,0x04,0x00,0x4d,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x89,0x00,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x02,0x08,0x00, 0x02,0x03,0x89,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x01,0x00,0x22,0x01, 0x28,0x04,0x01,0x8a,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03, 0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x8a,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x06,0x08,0x00,0x02,0x03,0x8a,0x00,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x8b,0x00, 0x00,0x04,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x0a,0x00,0x00, 0x02,0x03,0x8b,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed, 0x03,0x00,0x00,0x0a,0x08,0x00,0x02,0x03,0x8b,0x00,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03, 0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x8c,0x00,0x00,0x04,0x00,0x52,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x0e,0x00,0x00,0x02,0x03,0x8c,0x00,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x0e,0x08, 0x00,0x02,0x03,0x8c,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x28,0x04,0x01,0x8d,0x00,0x00,0x04,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x8d,0x00,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x8d,0x00, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x8e, 0x00,0x00,0x04,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x05,0x00, 0x00,0x02,0x03,0x8e,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0xed,0x03,0x00,0x00,0x05,0x08,0x00,0x02,0x03,0x8e,0x00,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x03,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x8f,0x00,0x00,0x04,0x00,0x55, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x09,0x00,0x00,0x02,0x03,0x8f,0x00, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x09, 0x08,0x00,0x02,0x03,0x8f,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00, 0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x03,0x00, 0x22,0x01,0x28,0x04,0x01,0x90,0x00,0x00,0x04,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xed,0x03,0x00,0x00,0x0d,0x00,0x00,0x02,0x03,0x90,0x00,0x00,0x00,0x00,0x03,0x20, 0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x0d,0x08,0x00,0x02,0x03,0x90, 0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01, 0x91,0x00,0x00,0x04,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x03,0x91,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00, 0x00,0xed,0x03,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x91,0x00,0x08,0x00,0x00,0x03, 0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x92,0x00,0x00,0x04,0x00, 0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x92, 0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00, 0x04,0x08,0x00,0x02,0x03,0x92,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x03,0x00,0x00,0x02, 0x00,0x22,0x01,0x28,0x04,0x01,0x93,0x00,0x00,0x04,0x00,0x59,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xed,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x03,0x93,0x00,0x00,0x00,0x00,0x03, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x08,0x08,0x00,0x02,0x03, 0x93,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0x94,0x00,0x00,0x04,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xed,0x03,0x00,0x00, 0x0c,0x00,0x00,0x02,0x03,0x94,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xed,0x03,0x00,0x00,0x0c,0x08,0x00,0x02,0x03,0x94,0x00,0x08,0x00,0x00, 0x03,0x20,0x01,0x2c,0x00,0x04,0x02,0x17,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x32,0x00,0x17,0x80,0x13,0x00,0x2c,0x00, 0x00,0x02,0x18,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00, 0x00,0x00,0x00,0x32,0x00,0x18,0x00,0x11,0x00,0x24,0x00,0x00,0x00,0x00,0x5b,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x31,0x0f,0x00,0x24,0x00,0x00,0x00,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x5f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x28,0x00,0x01,0x95,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x95,0x00,0x00,0x00,0x00,0x01,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x95, 0x00,0x00,0x20,0x00,0x01,0x22,0x01,0x28,0x00,0x01,0x96,0x00,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x04,0x00,0x00,0x03,0x96,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x60,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x04,0x02,0x19,0x00,0x00,0xf2,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x19,0x00,0x0f,0x00, 0x25,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x02,0x1a,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x00,0x00,0x00,0x00,0x32,0x00,0x1a,0x00,0x11,0x00,0x31,0x10,0x00,0x24,0x00,0x00, 0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x64,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x28,0x00,0x01,0x97,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xf4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00, 0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x97,0x00,0x00,0x00,0x00, 0x01,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x00,0x00,0x02, 0x03,0x97,0x00,0x00,0x20,0x00,0x01,0x22,0x01,0x28,0x00,0x01,0x98,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf5,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x04,0x00,0x00,0x03,0x98,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x62,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x1b,0x00,0x00,0x62,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x1b,0x80, 0x10,0x00,0x31,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x2c,0x00,0x02,0x02,0x1c,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x10,0x00,0x00,0x00,0x32,0x00,0x1c,0x80,0x13,0x00,0x29,0x03,0x00,0x00, 0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x54,0x76,0x10, 0x03,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x10,0x32,0x10,0x02, 0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x10,0x00,0x00,0x00,0x31,0x12,0x00, 0x01,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00, 0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x03,0x01,0x99,0x00,0x00, 0x03,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf9,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x03,0x99,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x24,0x00,0x00,0x00,0x00,0x6f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x9a,0x00,0x00,0x00,0x00,0x73,0x01,0x00, 0x00,0x0d,0x00,0x21,0x01,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x9a,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x6e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9a,0x00,0x00,0xe0,0xfe,0x01,0x00, 0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9a, 0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x02,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x9a,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x6e,0x01, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9a,0x00,0x00,0x60,0x00, 0x01,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x9a,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x05, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9a,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00, 0x6e,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9a,0x00,0x00, 0xe0,0x01,0x01,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x02,0x01, 0x9b,0x00,0x00,0x02,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfc,0x03, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x03,0x9b,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x28,0x00,0x01,0x9c, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9c,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x9c,0x00,0x00,0x80,0x00,0x01,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x9c,0x00,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0x71, 0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9c,0x00,0x00,0x80, 0x01,0x01,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x1d,0x00,0x00, 0x6a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x1d,0x80,0x12,0x00,0x31,0x13,0x00,0x2c,0x00,0x04,0x02,0x1e,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x1e,0x80,0x15,0x00,0x2c,0x00,0x04,0x02,0x1f,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x1f,0x00,0x14,0x00, 0x2c,0x00,0x00,0x02,0x20,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x20,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00, 0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfd,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x73, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x79,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, 0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x7d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x02, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00, 0x00,0xc0,0x00,0x24,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0x73,0x01,0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0x81,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x81,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x01,0x25,0x00,0x00, 0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x84,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x01, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x08, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00, 0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x14,0x00,0x2c,0x00,0x00,0x02, 0x21,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x32,0x00,0x21,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x0a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x8a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x8b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x0b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x00,0x25,0x00,0x00, 0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x0d,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0e,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x40, 0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x15,0x00,0x32,0x00,0x02,0x00,0x16,0x00, 0x2b,0x00,0x02,0x22,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x22,0x80,0x2a, 0x00,0x25,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x10,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x92, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x92,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0xb3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x97,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00,0x98, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00, 0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00, 0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9c,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73, 0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x9f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x03,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x17,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x00,0x24,0x00,0x00, 0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xb9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00, 0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x40,0x02, 0x10,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0xc0,0x02,0x10,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x40,0x03,0x10,0x00,0x00,0x00,0x00,0xae, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1e,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x03,0x25, 0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x20,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x01,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x01,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0x72,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0x72,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa5, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x25,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0xc0, 0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x16,0x00,0x2c,0x00,0x00,0x02,0x23,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x23,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xbf,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc1,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73, 0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xc4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x01,0x24,0x00, 0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x73,0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x01,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x2c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2d,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x00,0x24, 0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xce, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x2e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01, 0x00,0x00,0x40,0x01,0x10,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0x73,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xd1,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00, 0x40,0x02,0x10,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0xc0,0x02,0x25,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x01,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd8,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x72,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x34,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdc,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x36, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x72,0x01,0x00, 0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x17,0x00,0x2c,0x00,0x00,0x02, 0x24,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x32,0x00,0x24,0x00,0x1d,0x00,0x2c,0x00,0x00,0x02,0x25,0x00,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x25,0x80, 0x2a,0x00,0x01,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2c,0x00, 0x02,0x02,0x26,0x00,0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x06, 0x00,0x00,0x00,0x32,0x00,0x26,0x00,0x19,0x00,0x29,0x03,0x00,0x00,0x00,0xde,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x54,0x76,0x10,0x03,0x00,0x00, 0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xdf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x10,0x32,0x10,0x02,0x00,0x00,0x00, 0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x7b,0x00,0xe9,0x01,0x00,0x00, 0x7b,0x00,0xe8,0x01,0x00,0x00,0x31,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xde,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x28,0x03,0x01,0x9d,0x00,0x00,0x03,0x00,0xe9,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x9d,0x00,0x00,0x00,0x00,0x01, 0x20,0x01,0x24,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x9e,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x3b, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9e,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x9e,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9e,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0xe4,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9e,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x9e,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xe4,0x01,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x9e,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x9e,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x9e,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xe4, 0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0xe6,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x02,0x01,0x9f,0x00,0x00,0x02,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x9f,0x00,0x00, 0x00,0x00,0x01,0x20,0x01,0x28,0x00,0x01,0xa0,0x00,0x00,0x00,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0xa0,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xe7,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xa0,0x00,0x00,0x80,0x00,0x01,0x00, 0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xa0, 0x00,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x02,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0xa0,0x00,0x00,0x80,0x01,0x01,0x00,0x02,0x00,0xe7,0x01, 0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x27,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x27,0x80,0x18,0x00, 0x31,0x19,0x00,0x2c,0x00,0x04,0x02,0x28,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x28,0x80,0x1b,0x00,0x2c,0x00, 0x04,0x02,0x29,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x32,0x00,0x29,0x00,0x1a,0x00,0x2c,0x00,0x00,0x02,0x2a,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00, 0x2a,0x80,0x2a,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00, 0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xec,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x01, 0x10,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9, 0x01,0x00,0x00,0x80,0x01,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8e, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00, 0x2a,0x00,0x31,0x1a,0x00,0x2c,0x00,0x00,0x02,0x2b,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x2b,0x80,0x2a,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0xe9,0x01,0x00,0x00,0x80,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe8, 0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x1b,0x00,0x32,0x00, 0x02,0x00,0x1c,0x00,0x2b,0x00,0x02,0x2c,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x2c,0x80,0x2a,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00, 0x01,0x10,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x44,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0xe9,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x45,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x02,0x10, 0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x46,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01, 0x00,0x00,0x80,0x02,0x10,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x47,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0xfe,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfe,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x48,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x80,0x03,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x49,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe8, 0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4a,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x4b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0xe8,0x01,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x1c,0x00, 0x2c,0x00,0x00,0x02,0x2d,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x2d,0x80,0x2a,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4c,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00, 0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0xe9,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4e,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x03,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x4f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe9, 0x01,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x50,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x80,0x02,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x51,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x01,0x32,0x00,0x00,0x00,0x2a,0x00, 0x31,0x1d,0x00,0x29,0x03,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0xa1,0x00,0x00,0x04, 0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x03, 0xa1,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x01,0x08,0x00,0x02,0x03,0xa1,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xa2,0x00,0x00,0x04,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x01,0x10,0x00,0x02,0x03,0xa2,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03,0xa2,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0xa3,0x00,0x00,0x04, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x05,0x00,0x00,0x02,0x03, 0xa3,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x05,0x08,0x00,0x02,0x03,0xa3,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xa4,0x00,0x00,0x04,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x05,0x10,0x00,0x02,0x03,0xa4,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x05,0x18,0x00,0x02,0x03,0xa4,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0xa5,0x00,0x00,0x04, 0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x09,0x00,0x00,0x02,0x03, 0xa5,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x09,0x08,0x00,0x02,0x03,0xa5,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xa6,0x00,0x00,0x04,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x09,0x10,0x00,0x02,0x03,0xa6,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x09,0x18,0x00,0x02,0x03,0xa6,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0xa7,0x00,0x00,0x04, 0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x0d,0x00,0x00,0x02,0x03, 0xa7,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x0d,0x08,0x00,0x02,0x03,0xa7,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xa8,0x00,0x00,0x04,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x0d,0x10,0x00,0x02,0x03,0xa8,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x0d,0x18,0x00,0x02,0x03,0xa8,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04,0x01,0xa9,0x00,0x00,0x04, 0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x11,0x00,0x00,0x02,0x03, 0xa9,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x11,0x08,0x00,0x02,0x03,0xa9,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xaa,0x00,0x00,0x04,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x11,0x10,0x00,0x02,0x03,0xaa,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x11,0x18,0x00,0x02,0x03,0xaa,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04,0x01,0xab,0x00,0x00,0x04, 0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x15,0x00,0x00,0x02,0x03, 0xab,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x15,0x08,0x00,0x02,0x03,0xab,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xac,0x00,0x00,0x04,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x15,0x10,0x00,0x02,0x03,0xac,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x15,0x18,0x00,0x02,0x03,0xac,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04,0x01,0xad,0x00,0x00,0x04, 0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x19,0x00,0x00,0x02,0x03, 0xad,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x19,0x08,0x00,0x02,0x03,0xad,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xae,0x00,0x00,0x04,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x19,0x10,0x00,0x02,0x03,0xae,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x19,0x18,0x00,0x02,0x03,0xae,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04,0x01,0xaf,0x00,0x00,0x04, 0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x1d,0x00,0x00,0x02,0x03, 0xaf,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x1d,0x08,0x00,0x02,0x03,0xaf,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xb0,0x00,0x00,0x04,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x1d,0x10,0x00,0x02,0x03,0xb0,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x1d,0x18,0x00,0x02,0x03,0xb0,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0xb1,0x00,0x00,0x04, 0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x03, 0xb1,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x00,0x08,0x00,0x02,0x03,0xb1,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xb2,0x00,0x00,0x04,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x00,0x10,0x00,0x02,0x03,0xb2,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03,0xb2,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0xb3,0x00,0x00,0x04, 0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x03, 0xb3,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x04,0x08,0x00,0x02,0x03,0xb3,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xb4,0x00,0x00,0x04,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x04,0x10,0x00,0x02,0x03,0xb4,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x04,0x18,0x00,0x02,0x03,0xb4,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0xb5,0x00,0x00,0x04, 0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x08,0x00,0x00,0x02,0x03, 0xb5,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x08,0x08,0x00,0x02,0x03,0xb5,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xb6,0x00,0x00,0x04,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x08,0x10,0x00,0x02,0x03,0xb6,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x08,0x18,0x00,0x02,0x03,0xb6,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0xb7,0x00,0x00,0x04, 0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x03, 0xb7,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x0c,0x08,0x00,0x02,0x03,0xb7,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xb8,0x00,0x00,0x04,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x0c,0x10,0x00,0x02,0x03,0xb8,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x0c,0x18,0x00,0x02,0x03,0xb8,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04,0x01,0xb9,0x00,0x00,0x04, 0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x10,0x00,0x00,0x02,0x03, 0xb9,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x10,0x08,0x00,0x02,0x03,0xb9,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xba,0x00,0x00,0x04,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x10,0x10,0x00,0x02,0x03,0xba,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x10,0x18,0x00,0x02,0x03,0xba,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04,0x01,0xbb,0x00,0x00,0x04, 0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x03, 0xbb,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x14,0x08,0x00,0x02,0x03,0xbb,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xbc,0x00,0x00,0x04,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x14,0x10,0x00,0x02,0x03,0xbc,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x14,0x18,0x00,0x02,0x03,0xbc,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04,0x01,0xbd,0x00,0x00,0x04, 0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x18,0x00,0x00,0x02,0x03, 0xbd,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x18,0x08,0x00,0x02,0x03,0xbd,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xbe,0x00,0x00,0x04,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x18,0x10,0x00,0x02,0x03,0xbe,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x18,0x18,0x00,0x02,0x03,0xbe,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04,0x01,0xbf,0x00,0x00,0x04, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x1c,0x00,0x00,0x02,0x03, 0xbf,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00, 0x00,0x1c,0x08,0x00,0x02,0x03,0xbf,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04, 0x01,0xc0,0x00,0x00,0x04,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x04,0x00,0x00, 0x1c,0x10,0x00,0x02,0x03,0xc0,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x1c,0x18,0x00,0x02,0x03,0xc0,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x0c,0xce,0x8a,0x46,0x02,0x01,0x03,0x00,0x00, 0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x24,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03, 0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x28,0x04,0x01,0xc1,0x00,0x00, 0x04,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x01,0x00,0x00,0x02, 0x03,0xc1,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04, 0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xc1,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29, 0x04,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00, 0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0xc2,0x00,0x00,0x04,0x00,0x25,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0xc2,0x00,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x05,0x08,0x00, 0x02,0x03,0xc2,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x26, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x02,0x00,0x22,0x01, 0x28,0x04,0x01,0xc3,0x00,0x00,0x04,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04, 0x00,0x00,0x09,0x00,0x00,0x02,0x03,0xc3,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x09,0x08,0x00,0x02,0x03,0xc3,0x00,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0xc4,0x00, 0x00,0x04,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x0d,0x00,0x00, 0x02,0x03,0xc4,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65, 0x04,0x00,0x00,0x0d,0x08,0x00,0x02,0x03,0xc4,0x00,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x03, 0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0xc5,0x00,0x00,0x04,0x00,0x28,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0xc5,0x00,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x00,0x08, 0x00,0x02,0x03,0xc5,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x01,0x00,0x22, 0x01,0x28,0x04,0x01,0xc6,0x00,0x00,0x04,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x65, 0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0xc6,0x00,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x04,0x08,0x00,0x02,0x03,0xc6,0x00, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6a,0x03,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0xc7, 0x00,0x00,0x04,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x08,0x00, 0x00,0x02,0x03,0xc7,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0x65,0x04,0x00,0x00,0x08,0x08,0x00,0x02,0x03,0xc7,0x00,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x03,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0xc8,0x00,0x00,0x04,0x00,0x2b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x03,0xc8,0x00, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x0c, 0x08,0x00,0x02,0x03,0xc8,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x2c,0x00,0x04,0x02, 0x2e,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00, 0x00,0x32,0x00,0x2e,0x80,0x22,0x00,0x2c,0x00,0x00,0x02,0x2f,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x2f,0x00, 0x20,0x00,0x24,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x31,0x1e,0x00,0x24,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x07,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x80, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x01,0xc9,0x00, 0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x28,0x00,0x01,0xca,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00, 0x00,0x03,0xca,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc9,0x00,0x00,0x00,0x00, 0x01,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c, 0x00,0x04,0x02,0x30,0x00,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x30,0x00,0x1e,0x00,0x25,0x00,0x00, 0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x32,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0x31,0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x00,0x00, 0x00,0x32,0x00,0x31,0x00,0x20,0x00,0x31,0x1f,0x00,0x24,0x00,0x00,0x00,0x00,0x33, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x03,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x35,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x34,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x28,0x00,0x01,0xcb,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x01,0xcc,0x00,0x00, 0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x03,0xcc,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0xcb,0x00,0x00,0x00,0x00,0x01,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x32,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x32,0x00,0x00,0x32,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x32, 0x80,0x1f,0x00,0x31,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x33,0x00,0x00,0x6e,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x32,0x00,0x33,0x80,0x22,0x00,0x29,0x03,0x00, 0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x54,0x76, 0x10,0x03,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x10,0x32,0x10, 0x02,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x31,0x21, 0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x03,0x00,0x00, 0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x03,0x01,0xcd,0x00, 0x00,0x03,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x70,0x04,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0xcd,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x24,0x00,0x00,0x00,0x00,0x3e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0xce,0x00,0x00,0x00,0x00,0x42,0x02, 0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x72,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0xce,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x3d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xce,0x00,0x00,0xe0,0xfe,0x01, 0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0xce,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0xce,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x3d, 0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xce,0x00,0x00,0x60, 0x00,0x01,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0xce,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00, 0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xce,0x00,0x00,0x60,0x01,0x01,0x00,0x02, 0x00,0x3d,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xce,0x00, 0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x01, 0x02,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x02, 0x01,0xcf,0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0xcf,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x28,0x00,0x01, 0xd0,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xd0,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0xd0,0x00,0x00,0x80,0x00,0x01,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xd0,0x00,0x00,0x00,0x01,0x01,0x00,0x02,0x00, 0x40,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0xd0,0x00,0x00, 0x80,0x01,0x01,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x34,0x00, 0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x34,0x80,0x21,0x00,0x31,0x22,0x00,0x2c,0x00,0x04,0x02,0x35, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0x35,0x80,0x24,0x00,0x2c,0x00,0x04,0x02,0x36,0x00,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x36,0x00,0x23, 0x00,0x2c,0x00,0x00,0x02,0x37,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x37,0x80,0x2a,0x00,0x25,0x00,0x00,0x00, 0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x44,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x42,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00, 0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x48,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, 0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42, 0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00, 0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4d, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x79,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02, 0x00,0x00,0xa0,0x00,0x24,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x50,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7b,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x01,0x25,0x00, 0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x53, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x7d,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x41,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x41, 0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x56, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x7f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02, 0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x23,0x00,0x2c,0x00,0x00, 0x02,0x38,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0x38,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x57,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0x81,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x82,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42, 0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x83,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x00,0x25,0x00, 0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x84,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x41,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x85,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x20,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x24,0x00,0x32,0x00,0x02,0x00,0x25, 0x00,0x2b,0x00,0x02,0x39,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x39,0x80, 0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x87,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x61,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00,0x00,0x00,0x82,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x89,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00, 0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x66,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x01,0x24,0x00,0x00,0x00,0x00, 0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02, 0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6a, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x02,0x10,0x00,0x00, 0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x6b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x42,0x02,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x03,0x01, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42, 0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x00,0x24,0x00, 0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x73,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x90, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00, 0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x77,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x92,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x20, 0x02,0x10,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x93,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00, 0x42,0x02,0x00,0x00,0xa0,0x02,0x10,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x20,0x03,0x10,0x00,0x00,0x00,0x00, 0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x03, 0x25,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x97,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x41,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x81,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x41,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x02, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x02,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x99,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x41,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9a,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0xa0,0x00, 0x01,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x9b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00, 0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9c,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0xa0,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x25,0x00,0x2c,0x00,0x00,0x02,0x3a, 0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0x3a,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x00,0x24,0x00,0x00, 0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x90,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x42,0x02,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80,0x01,0x24, 0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x95,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x42,0x02,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x02,0x00,0x00,0x80, 0x02,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xa3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00, 0x00,0x42,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x00, 0x24,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42, 0x02,0x00,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xa6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03, 0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xa0, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa1,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa7, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x42,0x02,0x00, 0x00,0x20,0x02,0x10,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xa8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00, 0x00,0x00,0x42,0x02,0x00,0x00,0xa0,0x02,0x25,0x00,0x00,0x00,0x00,0xa4,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0xaa,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x02,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa8,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xab,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86, 0x03,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xab, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xad,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x03,0x00,0x00,0x00,0x00,0x41,0x02, 0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x26,0x00,0x01,0x00,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x80,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xac,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xe0,0xff,0xff,0x3f,0x01,0x00,0x00,0x00,0x00,0xad, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xad,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x39,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xaf, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0xb3,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xb0,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x02,0x00,0x00,0x00,0x00, 0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x04,0x00,0x00,0x00,0x00,0x37,0x00, 0x06,0x01,0x20,0x04,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0xb2,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01, 0x20,0x04,0x00,0xaf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0xb3,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04, 0x00,0xb0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xb4,0x04,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04, 0x01,0xd1,0x00,0x00,0x04,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xd1,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb6,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xd1,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xd2,0x00,0x00,0x04,0x00,0xb6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb6,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xd2,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xd2,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0xd3,0x00,0x00,0x04,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xd3,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb8,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xd3,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xd4,0x00,0x00,0x04,0x00,0xb7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb8,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xd4,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xd4,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04, 0x01,0xd5,0x00,0x00,0x04,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xd5,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xba,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xd5,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xd6,0x00,0x00,0x04,0x00,0xb8,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xba,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xd6,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xd6,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0xd7,0x00,0x00,0x04,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xd7,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbc,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xd7,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xd8,0x00,0x00,0x04,0x00,0xb9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbc,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xd8,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xd8,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04, 0x01,0xd9,0x00,0x00,0x04,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xd9,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xd9,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xda,0x00,0x00,0x04,0x00,0xba,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbe,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xda,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xda,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04, 0x01,0xdb,0x00,0x00,0x04,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xdb,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc0,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xdb,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xdc,0x00,0x00,0x04,0x00,0xbb,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc0,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xdc,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xdc,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04, 0x01,0xdd,0x00,0x00,0x04,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xdd,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc2,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xdd,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xde,0x00,0x00,0x04,0x00,0xbc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xde,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xde,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04, 0x01,0xdf,0x00,0x00,0x04,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0xdf,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0xdf,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xe0,0x00,0x00,0x04,0x00,0xbd,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc4,0x04,0x00,0x00,0x03,0x10,0x00,0x02,0x03,0xe0,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x03,0x18,0x00,0x02,0x03, 0xe0,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04, 0x01,0xe1,0x00,0x00,0x04,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xe1,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb6,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xe1,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xe2,0x00,0x00,0x04,0x00,0xbe,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb6,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xe2,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xe2,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc6,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0xe3,0x00,0x00,0x04,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xe3,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb8,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xe3,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xe4,0x00,0x00,0x04,0x00,0xbf,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb8,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xe4,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xe4,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04, 0x01,0xe5,0x00,0x00,0x04,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xe5,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xba,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xe5,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xe6,0x00,0x00,0x04,0x00,0xc0,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xba,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xe6,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xe6,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0xe7,0x00,0x00,0x04,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xe7,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbc,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xe7,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xe8,0x00,0x00,0x04,0x00,0xc1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbc,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xe8,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xe8,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc9,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04, 0x01,0xe9,0x00,0x00,0x04,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xe9,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xe9,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xea,0x00,0x00,0x04,0x00,0xc2,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbe,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xea,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xea,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xca,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04, 0x01,0xeb,0x00,0x00,0x04,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xeb,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc0,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xeb,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xec,0x00,0x00,0x04,0x00,0xc3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc0,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xec,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xec,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcb,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04, 0x01,0xed,0x00,0x00,0x04,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xed,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc2,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xed,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xee,0x00,0x00,0x04,0x00,0xc4,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xee,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xee,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04, 0x01,0xef,0x00,0x00,0x04,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00, 0x02,0x00,0x00,0x02,0x03,0xef,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0xef,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xf0,0x00,0x00,0x04,0x00,0xc5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc4,0x04,0x00,0x00,0x02,0x10,0x00,0x02,0x03,0xf0,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x02,0x18,0x00,0x02,0x03, 0xf0,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcd,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04, 0x01,0xf1,0x00,0x00,0x04,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xf1,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb6,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xf1,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xf2,0x00,0x00,0x04,0x00,0xc6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb6,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xf2,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xf2,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0xf3,0x00,0x00,0x04,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xf3,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb8,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xf3,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xf4,0x00,0x00,0x04,0x00,0xc7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb8,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xf4,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xf4,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04, 0x01,0xf5,0x00,0x00,0x04,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xf5,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xba,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xf5,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xf6,0x00,0x00,0x04,0x00,0xc8,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xba,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xf6,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xf6,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd0,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0xf7,0x00,0x00,0x04,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xf7,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbc,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xf7,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xf8,0x00,0x00,0x04,0x00,0xc9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbc,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xf8,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xf8,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04, 0x01,0xf9,0x00,0x00,0x04,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xf9,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xf9,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xfa,0x00,0x00,0x04,0x00,0xca,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbe,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xfa,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xfa,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd2,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04, 0x01,0xfb,0x00,0x00,0x04,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xfb,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc0,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xfb,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xfc,0x00,0x00,0x04,0x00,0xcb,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc0,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xfc,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xfc,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd3,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04, 0x01,0xfd,0x00,0x00,0x04,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xfd,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc2,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xfd,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0xfe,0x00,0x00,0x04,0x00,0xcc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0xfe,0x00,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0xfe,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04, 0x01,0xff,0x00,0x00,0x04,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0xff,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0xff,0x00,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0xcd,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc4,0x04,0x00,0x00,0x01,0x10,0x00,0x02,0x03,0x00,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x01,0x18,0x00,0x02,0x03, 0x00,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd5,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04, 0x01,0x01,0x01,0x00,0x04,0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x01,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x02,0x01,0x00,0x04,0x00,0xce,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb6,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x02,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x02,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd6,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0x03,0x01,0x00,0x04,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x03,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb8,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x03,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x04,0x01,0x00,0x04,0x00,0xcf,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb8,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x04,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x04,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04, 0x01,0x05,0x01,0x00,0x04,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x05,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xba,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x05,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x06,0x01,0x00,0x04,0x00,0xd0,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xba,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x06,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x06,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd8,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0x07,0x01,0x00,0x04,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x07,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbc,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x07,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x08,0x01,0x00,0x04,0x00,0xd1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbc,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x08,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x08,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xd9,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x28,0x04, 0x01,0x09,0x01,0x00,0x04,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x09,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x09,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x0a,0x01,0x00,0x04,0x00,0xd2,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xbe,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x0a,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x0a,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xda,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x28,0x04, 0x01,0x0b,0x01,0x00,0x04,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x0b,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc0,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x0b,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x0c,0x01,0x00,0x04,0x00,0xd3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc0,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x0c,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x0c,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdb,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x28,0x04, 0x01,0x0d,0x01,0x00,0x04,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x0d,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc2,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x0d,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x0e,0x01,0x00,0x04,0x00,0xd4,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x0e,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x0e,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdc,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x28,0x04, 0x01,0x0f,0x01,0x00,0x04,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x45, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x0f,0x01,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x0f,0x01,0x08,0x00,0x00, 0x04,0x20,0x01,0x28,0x04,0x01,0x10,0x01,0x00,0x04,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc4,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x03,0x10,0x01,0x00,0x00,0x00,0x04, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x18,0x00,0x02,0x03, 0x10,0x01,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xdf,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x0c,0xce,0x8a,0x46, 0x02,0x01,0x03,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x28, 0x04,0x01,0x11,0x01,0x00,0x04,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x04,0x00, 0x00,0x03,0x00,0x00,0x02,0x03,0x11,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x11,0x01,0x08,0x00, 0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x12,0x01,0x00, 0x04,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x03,0x00,0x00,0x02, 0x03,0x12,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x04, 0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x12,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29, 0x04,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00, 0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x13,0x01,0x00,0x04,0x00,0xe3,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x13,0x01,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x03,0x08,0x00, 0x02,0x03,0x13,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x03,0x00,0x22,0x01, 0x28,0x04,0x01,0x14,0x01,0x00,0x04,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x04, 0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x14,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x14,0x01,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x15,0x01, 0x00,0x04,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x15,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xde, 0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x15,0x01,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02, 0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x16,0x01,0x00,0x04,0x00,0xe7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x16,0x01,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x02,0x08, 0x00,0x02,0x03,0x16,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00, 0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x02,0x00,0x22, 0x01,0x28,0x04,0x01,0x17,0x01,0x00,0x04,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0, 0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x17,0x01,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x17,0x01, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x18, 0x01,0x00,0x04,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x02,0x00, 0x00,0x02,0x03,0x18,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0xe1,0x04,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x18,0x01,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x19,0x01,0x00,0x04,0x00,0xeb, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x19,0x01, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x01, 0x08,0x00,0x02,0x03,0x19,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00, 0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x28,0x04,0x01,0x1a,0x01,0x00,0x04,0x00,0xec,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xdf,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x1a,0x01,0x00,0x00,0x00,0x03,0x20, 0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x1a, 0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xed,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01, 0x1b,0x01,0x00,0x04,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x01, 0x00,0x00,0x02,0x03,0x1b,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00, 0x00,0xe0,0x04,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x1b,0x01,0x08,0x00,0x00,0x03, 0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xea,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x1c,0x01,0x00,0x04,0x00, 0xee,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x1c, 0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x04,0x00,0x00, 0x01,0x08,0x00,0x02,0x03,0x1c,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00, 0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x28,0x04,0x01,0x1d,0x01,0x00,0x04,0x00,0xf0,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xde,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x1d,0x01,0x00,0x00,0x00,0x03, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03, 0x1d,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xf1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04, 0x01,0x1e,0x01,0x00,0x04,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x1e,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xdf,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x1e,0x01,0x08,0x00,0x00, 0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xef,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x1f,0x01,0x00,0x04, 0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x03, 0x1f,0x01,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x04,0x00, 0x00,0x00,0x08,0x00,0x02,0x03,0x1f,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04, 0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x20,0x01,0x00,0x04,0x00,0xf3,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xe1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x20,0x01,0x00,0x00,0x00, 0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x20,0x01,0x08,0x00,0x00,0x03,0x20,0x01,0x2c,0x00,0x04,0x02,0x3b,0x00,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x3b,0x80,0x28,0x00,0x2c,0x00,0x04,0x02,0x3c,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x3c,0x00,0x27,0x00,0x2c, 0x00,0x00,0x02,0x3d,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x04,0x00,0x00,0x00,0x32,0x00,0x3d,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0xf8, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf8,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0xd6,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xd7, 0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xfc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x02,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0xd9,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe4,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x03,0x07,0x00,0xe5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf4,0x02,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x00,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x02,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x2a,0x00,0x31,0x27,0x00,0x2c,0x00,0x00,0x02,0x3e,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x3e,0x80, 0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd6,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x02, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd7,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x03,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xe7,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0xf4,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x28,0x00, 0x32,0x00,0x02,0x00,0x29,0x00,0x2b,0x00,0x02,0x3f,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0x3f,0x80,0x2a,0x00,0x25,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd6, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd7,0x02,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x08,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0xd8,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xea,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd9,0x02, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x0d, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xda,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0xdb,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x02,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x13, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x13,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xdd,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xf4,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x17,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x18,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xf7,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x31, 0x29,0x00,0x2c,0x00,0x00,0x02,0x40,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x40,0x80,0x2a,0x00,0x25,0x00,0x00, 0x00,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x19,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0xd6,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x1a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1b, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x1b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xd7,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x1c,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x02,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x20,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0xd9,0x02,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x21, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xda,0x02,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x24,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0xdb,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x25,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xf4,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x02,0x00,0x00,0x00,0x00, 0x31,0x2a,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x28, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x28,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x29,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xad,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xad, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x2a,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x2c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x34,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0, 0xb4,0x0c,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x30,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x31,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00, 0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x31,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x33,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x35,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xad,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x36,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0x41,0x00,0x00,0xf6,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x41,0x00, 0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x38,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x61,0x01,0x04,0x80,0x10,0x41,0x01,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x80,0x10,0x82,0x06,0x02, 0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x48, 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x65,0x02,0x48,0x62,0x9d,0x02,0xf1,0xff, 0x65,0x00,0x00,0x80,0x10,0x82,0xe6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f, 0x69,0x02,0x00,0x00,0x60,0x81,0x25,0x48,0x64,0x48,0x00,0x05,0x03,0x00,0x03,0x00, 0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x48,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff, 0x5b,0x05,0x00,0x00,0x60,0x06,0x84,0x48,0x64,0x01,0x01,0x06,0x84,0x48,0x64,0x48, 0x41,0x03,0x00,0x80,0x60,0x06,0x01,0x20,0x24,0x48,0x00,0x01,0x44,0x01,0x00,0x00, 0x69,0x00,0x47,0x68,0x42,0x01,0x21,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x47, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x81,0xc5,0x47, 0x64,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x00,0x00,0x60,0x81,0xe5,0x47, 0xe4,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x5b,0x07,0x00,0x00,0x60,0x06,0x44,0x48, 0xa4,0x01,0x01,0x06,0x44,0x48,0xe4,0x01,0x62,0x07,0x00,0x00,0x60,0x86,0x25,0x47, 0x84,0x48,0x00,0x55,0x08,0x00,0x08,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x48, 0x24,0x48,0x00,0x06,0x44,0x01,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x40,0x84,0x47, 0x00,0x00,0x00,0x00,0xe8,0x8c,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x05,0x02, 0x00,0x00,0x00,0x00,0x67,0x45,0x23,0x01,0x70,0x05,0x40,0x00,0x60,0x86,0x01,0x00, 0x44,0x48,0x00,0x35,0x1f,0x00,0x1f,0x00,0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x03, 0x05,0x02,0x46,0x05,0x18,0x00,0x18,0x00,0x40,0x05,0x48,0xa8,0x1a,0x48,0x11,0x47, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x84,0x48,0x00,0x55,0x08,0x00,0x08,0x00, 0x61,0x03,0x03,0x00,0x90,0x09,0x05,0x5a,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x03,0x00,0x50,0x85,0x85,0x5a,0x05,0x03,0x46,0x05,0xf8,0xff,0xf8,0xff, 0x40,0x00,0x03,0x00,0x50,0x85,0x05,0x59,0x05,0x03,0x46,0x05,0xf0,0xff,0xf0,0xff, 0x40,0x00,0x03,0x00,0x50,0x85,0x85,0x59,0x05,0x03,0x46,0x05,0xe8,0xff,0xe8,0xff, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x72,0x00,0x00, 0x61,0x00,0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02, 0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x02,0x62,0x80,0x47,0x11,0x00, 0x61,0x00,0x02,0x62,0xc8,0x48,0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x51, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x33, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x00,0x80,0xa0,0x4a,0x45,0x02, 0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02, 0xc4,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x5b,0x04,0x00,0x00,0x60,0x06,0x04,0x51, 0xc4,0x01,0x01,0x06,0x04,0x51,0x64,0x48,0x31,0xb1,0x03,0x80,0x00,0x00,0x05,0x3f, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x41,0x01,0x20,0x22,0x2e,0x51,0x11,0x01, 0x49,0x00,0x51,0xa8,0x2a,0x51,0x11,0x01,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00, 0x44,0x48,0x00,0x31,0x08,0x00,0x08,0x00,0x40,0x02,0x51,0xa8,0x1a,0x51,0x11,0x47, 0x69,0x00,0x47,0x68,0x3a,0x48,0x21,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x48, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x03,0x47,0x68,0x9a,0x51,0x21,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x47,0x44,0x48,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00, 0x61,0x31,0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x02,0x68,0x82,0x47,0x01,0x02, 0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00, 0x61,0x00,0x02,0x62,0xc8,0x48,0x11,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00, 0x44,0x48,0x00,0x31,0x10,0x00,0x10,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x03, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x32,0x00,0x80,0xa0,0x4a,0x45,0x02, 0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02, 0xc4,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x47, 0x44,0x48,0x00,0x05,0xf8,0xff,0xf8,0xff,0x31,0xb3,0x03,0x80,0x00,0x00,0x05,0x3b, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x48, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x61,0x33,0x02,0x64,0x00,0x00,0x10,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02, 0x40,0x00,0x02,0x68,0x82,0x47,0x01,0x04,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02, 0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x02,0x62,0xc8,0x48,0x11,0x00, 0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x44,0x48,0x00,0x31,0x18,0x00,0x18,0x00, 0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x2b,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00, 0x61,0x34,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00, 0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02, 0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x47,0x44,0x48,0x00,0x05,0xf0,0xff,0xf0,0xff, 0x31,0xb5,0x03,0x80,0x00,0x00,0x05,0x43,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x48,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00, 0x61,0x35,0x02,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x00,0x02,0x68,0x82,0x47,0x01,0x06, 0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00, 0x61,0x00,0x02,0x62,0xc8,0x48,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x47, 0x44,0x48,0x00,0x05,0xe8,0xff,0xe8,0xff,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x49, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x36,0x00,0x80,0xa0,0x4a,0x45,0x02, 0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02, 0xc4,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x48, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x05,0x53, 0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x05,0x40,0x00,0x60,0x86,0x01,0x00, 0x84,0x47,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x47,0xa8,0xa8,0x00,0x01,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00, 0x00,0x00,0x00,0x20,0xa8,0x00,0x00,0x00,0x61,0x31,0x02,0xa1,0x00,0x00,0x01,0x00, 0x61,0x00,0x52,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x50,0x85,0xe5,0x01, 0xa4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10, 0xe4,0x01,0x00,0x01,0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00, 0xa4,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x47, 0xa4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00, 0xa4,0x47,0x00,0x16,0x84,0x47,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0xff,0xff,0xff,0x69,0x04,0x52,0x61,0x02,0x02,0x20,0x00, 0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x64,0x48,0x00,0x51,0x03,0x00,0x03,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x4a,0x00,0x00, 0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x64,0x48,0x00,0x11,0x03,0x00,0x03,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x2a,0x00,0x00, 0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x64,0x48,0x00,0x11,0x04,0x00,0x04,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x87,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x20,0x57,0x61,0x00,0x33,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x57,0x61,0x00,0x34,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x12,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x12,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x12,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x12,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x57,0x61,0x00,0x35,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x16, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x16, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x16, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x16, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x57,0x61,0x00,0x36,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x57,0x61,0x00,0x37,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x57,0x61,0x00,0x38,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x22,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x22,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x22,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x22,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xe0,0x0a,0xe0,0x0a, 0x61,0x00,0x57,0x61,0x00,0x39,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x26, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x26, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x26, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x26, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x33,0x61,0x00,0x3a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x22,0x33,0x61,0x00,0x03,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x33,0x61,0x00,0x04,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x11,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x11,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x11,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x11,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x33,0x61,0x00,0x05,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x15, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x15, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x15, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x15, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x33,0x61,0x00,0x06,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x19,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x19,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x19,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x19,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x33,0x61,0x00,0x07,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x33,0x61,0x00,0x08,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x21,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x21,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x21,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x21,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x06,0x60,0x06, 0x61,0x00,0x33,0x61,0x00,0x09,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x25, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x25, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x06,0x60,0x06,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x25, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x25, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x0a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x29,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x29,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x29,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x29,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x24,0x04,0x61,0x00,0x2b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x2c,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x10,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x10,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x10,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x10,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x2d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x14, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x14, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x14, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x14, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x2e,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x18,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x18,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x18,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x18,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x2f,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x30,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x20,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x20,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x20,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x31,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x24, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x24, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x24, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x24, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x32,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x28,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x28,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x28,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x28,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x26,0x04,0x61,0x00,0x49,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x4a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x4b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x13, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x13, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x13, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x13, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x4c,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x17,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x17,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x17,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x17,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x4d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x4e,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x4f,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x23, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x23, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x23, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x23, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x50,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x27,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x27,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x27,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x27,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x02,0x00,0x00,0x00,0x00,0xce,0x8a,0x46,0x02, 0x61,0x21,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3f,0x58,0x00,0x00,0x00,0x00,0x00, 0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x03,0x05,0x02,0x46,0x05,0x10,0x00,0x10,0x00, 0x40,0x01,0x03,0x00,0x50,0x85,0x85,0x03,0x05,0x03,0x46,0x05,0xf0,0xff,0xf0,0xff, 0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x04,0x03,0x00,0x50,0x05,0x05,0x2e,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2e,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x40,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x32,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x32,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x41,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x36,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x36,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x42,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x3a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x3a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x23,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3b,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3c,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x31,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x31,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3d,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x35,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x35,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3e,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x25,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x43,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x44,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x30,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x30,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x45,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x34,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x34,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x46,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x38,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x38,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x27,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x53,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x54,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x55,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x56,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x00,0x00,0x00,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0xa5,0x47,0x84,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00,0x5b,0x01,0x00,0x00,0x50,0x85,0x04,0x02, 0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01, 0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x02,0x00,0x00,0x10,0x81,0x01,0x10, 0x04,0x02,0x00,0x01,0x60,0x01,0x60,0x01,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x04, 0x80,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x05, 0x00,0x01,0x11,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x10,0x81,0x01,0x10, 0xe4,0x01,0x00,0x01,0x60,0x01,0x60,0x01,0x61,0x03,0x04,0x00,0x68,0x06,0x01,0x00, 0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x03,0x00,0x68,0x06,0x01,0x01, 0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47, 0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x20,0x02,0x01,0x00, 0xc4,0x47,0x00,0x52,0x24,0x47,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0xff,0xff,0xff,0x68,0x00,0x40,0x00,0x20,0x82,0xe5,0x47, 0x24,0x47,0x00,0x11,0x01,0x00,0x01,0x00,0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00, 0x5b,0x02,0x00,0x00,0x50,0x85,0x04,0x02,0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01,0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00, 0x40,0x02,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x02,0x00,0x01,0x60,0x05,0x60,0x05, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x04,0x80,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x05,0x00,0x01,0x11,0x00,0x00,0x00,0x00,0x00, 0x40,0x05,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x60,0x05,0x60,0x05, 0x61,0x03,0x04,0x00,0x68,0x06,0x01,0x00,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00, 0x61,0x03,0x03,0x00,0x68,0x06,0x01,0x01,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47,0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00, 0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0xc4,0x47,0x00,0x16,0xe4,0x47,0x00,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xff,0xff,0xff, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47,0x84,0x47,0x00,0x05,0x18,0x00,0x18,0x00, 0x70,0x01,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x47,0x00,0x31,0x18,0x00,0x18,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x51,0x00,0x00,0x00,0x00,0x10,0x32,0x54,0x76, 0x61,0x00,0x02,0x00,0x50,0x44,0x85,0x48,0x00,0x00,0x00,0x00,0x10,0x32,0x10,0x32, 0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x47,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x41,0x03,0x03,0x00,0x50,0x85,0x85,0x51,0x85,0x51,0x46,0x05,0x80,0x00,0x80,0x00, 0x41,0x03,0x02,0x00,0x50,0x85,0x85,0x48,0x85,0x48,0x34,0x05,0x80,0x00,0x80,0x00, 0x40,0x03,0x00,0x00,0x60,0x06,0xe5,0x01,0xa4,0x47,0x00,0x06,0x84,0x47,0x00,0x00, 0x69,0x01,0x00,0x00,0x50,0x85,0x05,0x02,0xe4,0x01,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x03,0x00,0x50,0x05,0x15,0x02,0x04,0x02,0x00,0x05,0x85,0x51,0x46,0x00, 0x40,0x01,0x03,0x00,0x10,0x81,0x01,0x10,0x15,0x02,0x46,0x01,0x60,0x01,0x60,0x01, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0x05,0x04,0xa4,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x04,0x00,0x01,0x00,0x03,0x00,0x03, 0x61,0x03,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x02,0x00,0x50,0x05,0x15,0x04,0x04,0x02,0x00,0x05,0x85,0x48,0x34,0x00, 0x40,0x01,0x02,0x00,0x10,0x81,0x01,0x10,0x15,0x04,0x34,0x01,0x60,0x05,0x60,0x05, 0x61,0x00,0x02,0x00,0x60,0x06,0x05,0x05,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x04,0x00,0x01,0x60,0x05,0x60,0x05, 0x61,0x02,0x00,0x00,0x68,0x06,0x01,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x02,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x04,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x06,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x47,0xa4,0x47,0x00,0x05,0x01,0x00,0x01,0x00, 0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0xa4,0x47,0x00,0x16,0xc4,0x47,0x00,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xfe,0xff,0xff, 0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x55,0x06,0x00,0x06,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x06,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x55,0x04,0x00,0x04,0x00, 0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x04,0x00,0x04,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x72,0x00,0x00, 0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x07, 0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x47, 0x44,0x47,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x01, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x07,0x05,0xa8,0x42,0x47,0x11,0x05,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01, 0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x03, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x38,0x00,0x00,0x20,0x82,0x45,0x02, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x02,0x48,0x21,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00, 0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0d,0x00,0x00, 0x31,0xed,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00, 0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x01,0x00,0x00,0x20,0x82,0x45,0x06, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x02,0x21,0x03,0x52,0x10,0x08, 0x69,0x3e,0x04,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00, 0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x19,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x48,0x00,0x06,0x44,0x01,0x00,0x00, 0x40,0x03,0x04,0xa8,0x02,0x48,0x11,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x48,0xa8,0x02,0x48,0x11,0x08, 0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0e,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x03,0x68,0x82,0x01,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x06,0x68,0x02,0x04,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x03,0x02,0x68,0x02,0x48,0x21,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x04,0x05,0x21,0x03,0x52,0x10,0x03, 0x40,0x00,0x04,0xa8,0x7a,0x47,0x11,0x47,0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x06, 0x40,0x05,0x09,0x21,0x03,0x52,0x10,0x02,0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x01, 0x40,0x00,0x47,0x68,0xe2,0x47,0x01,0x04,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x69,0x06,0x01,0x68,0x8a,0x51,0x21,0x00,0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x47, 0x40,0x00,0x51,0xa8,0x2a,0x51,0x11,0x01,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xe5,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x14,0x2f,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x02, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x02,0x04,0x68,0x02,0x51,0x21,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x06,0x03,0x21,0x53,0x52,0x10,0x01,0x31,0xf6,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x31,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05,0x21,0x03,0x52,0x10,0x04, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2e,0x00,0x00, 0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x32,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x6e,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x02,0x00,0x02,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x6e,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x01, 0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x47,0x44,0x47,0x00,0x05,0x40,0x00,0x40,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x06,0x01,0x68,0x8a,0x48,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x48,0xa8,0x2a,0x48,0x11,0x01, 0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00, 0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00, 0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x02,0x03,0x68,0x02,0x48,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x51, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x31,0xfc,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x02,0x21,0x53,0x52,0x10,0x01, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x05, 0x04,0x51,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x3e,0x06,0x68,0x7a,0x47,0x01,0x04, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x64,0x47,0x00,0x05,0x60,0x00,0x60,0x00, 0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x2b,0x00,0x00, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x02,0x21,0x53,0x52,0x10,0x01, 0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2d,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2e,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x6b,0x00,0x00, 0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00, 0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x6b,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00, 0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x07, 0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06, 0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08, 0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x34,0x04,0x68,0x42,0x01,0x41,0x01, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00, 0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x05,0x02, 0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x04, 0x44,0x47,0x00,0x06,0x04,0x04,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x05, 0x44,0x47,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x07, 0x44,0x47,0x00,0x06,0x24,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x47, 0x44,0x47,0x00,0x05,0x40,0x00,0x40,0x00,0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09, 0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02, 0x44,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x04,0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00, 0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00, 0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00, 0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1f,0x00,0x00, 0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x23,0x00,0x00, 0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x27,0x00,0x00, 0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01, 0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x04,0xa8,0x42,0x47,0x11,0x04, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x44,0x47,0x00,0x06,0x24,0x05,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x07,0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x05,0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x35,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xba,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x07,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06, 0x44,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x00,0x01,0x68,0x8a,0x48,0x21,0x00, 0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x3c,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00, 0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00, 0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x19,0x00,0x00, 0x31,0xfe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00, 0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00, 0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x45,0x05, 0x04,0x48,0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x06,0x02,0x21,0x53,0x52,0x10,0x01,0x40,0x30,0x03,0xa8,0x2a,0x48,0x11,0x01, 0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x25,0x00,0x00, 0x31,0xd2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x29,0x00,0x00, 0x69,0x02,0x04,0x68,0x02,0x03,0x21,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x07, 0x04,0x48,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x07,0x06,0x68,0x42,0x05,0x21,0x00,0x40,0x00,0x03,0xa8,0x02,0x48,0x11,0x47, 0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x05,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00, 0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0e,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x06,0x09,0x21,0x03,0x52,0x10,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x06,0x02,0x68,0x22,0x07,0x21,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x45,0x05, 0x04,0x48,0x00,0x06,0x44,0x05,0x00,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00, 0x41,0x00,0x03,0x68,0x42,0x01,0x71,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x07,0x08,0x21,0x03,0x52,0x10,0x06,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x07, 0x04,0x48,0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x06,0x06,0x68,0x42,0x05,0x21,0x00, 0x40,0x04,0x48,0xa8,0x02,0x48,0x11,0x03,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x07,0x0a,0x21,0x03,0x52,0x10,0x02, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x07,0x09,0x21,0x03,0x52,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x06, 0x69,0x06,0x02,0x68,0x22,0x07,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x48,0x21,0x00, 0x31,0xd9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00, 0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00, 0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x22,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x07,0x64,0x47,0x00,0x06,0x04,0x47,0x00,0x00, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x52,0x10,0x02, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x52,0x10,0x04, 0x40,0x36,0x08,0xa8,0x7a,0x47,0x11,0x05,0x40,0x00,0x04,0xa8,0x7a,0x47,0x11,0x07, 0x40,0x00,0x47,0x68,0xe2,0x47,0x01,0x04,0x31,0xdb,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x06, 0x44,0x05,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02, 0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x47,0xa8,0x7a,0x47,0x11,0x47, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09, 0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xea,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x14,0x33,0x00,0x00,0x31,0x9d,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x14,0x37,0x00,0x00,0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x01, 0x68,0x3b,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x05,0xa8,0x7a,0x47,0x11,0x05,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00, 0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x2d,0x00,0x00, 0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x31,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x51,0x00,0x06,0x24,0x05,0x00,0x00, 0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x07,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x30,0x02,0xa8,0x2a,0x51,0x11,0x01,0x40,0x00,0x51,0xa8,0x52,0x51,0x11,0x01, 0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x35,0x00,0x00, 0x40,0x06,0x08,0x21,0x03,0x52,0x10,0x06,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x09,0x68,0x02,0x02,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x07,0x03,0x68,0x22,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00, 0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x39,0x00,0x00, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x52,0x10,0x09, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03, 0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x32,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x36,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x3a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x63,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x63,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00, 0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00, 0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00, 0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00, 0x41,0x36,0x04,0x68,0x42,0x01,0x41,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x07, 0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x04,0x44,0x47,0x00,0x06,0x04,0x04,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x47,0x44,0x47,0x00,0x05,0x40,0x00,0x40,0x00, 0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x01,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06, 0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08, 0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09, 0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01, 0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x02,0xa8,0x42,0x47,0x11,0x05, 0x31,0xfb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00, 0x31,0xe7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00, 0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00, 0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1f,0x00,0x00, 0x40,0x00,0x07,0xa8,0x42,0x47,0x11,0x07,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x0a, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x3b,0x00,0x00,0x20,0x82,0x45,0x06, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x04,0x00,0x00,0x69,0x00,0x02,0x68,0x02,0x48,0x21,0x00, 0x31,0xff,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00, 0x31,0xed,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00, 0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x48,0x00,0x06,0x44,0x01,0x00,0x00, 0x40,0x05,0x04,0xa8,0x52,0x48,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x03,0x52,0x10,0x02, 0x41,0x00,0x02,0x68,0x42,0x01,0x31,0x00,0x31,0xe0,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x42,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x21,0x00,0x00,0x69,0x05,0x07,0x68,0x22,0x05,0x21,0x00, 0x40,0x02,0x02,0xa8,0x02,0x48,0x11,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06,0x68,0x02,0x04,0x21,0x00, 0x40,0x00,0x05,0xa8,0x62,0x48,0x11,0x47,0x41,0x00,0x04,0x68,0x42,0x01,0x51,0x00, 0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x52,0x10,0x07, 0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x03,0x68,0x02,0x02,0x21,0x00, 0x40,0x03,0x48,0xa8,0x02,0x48,0x11,0x04,0x69,0x05,0x07,0x68,0x22,0x05,0x21,0x00, 0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00, 0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x09,0x21,0x03,0x52,0x10,0x06, 0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x52,0x10,0x03, 0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x52,0x10,0x07, 0x69,0x05,0x06,0x68,0x02,0x48,0x21,0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x02, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05, 0x64,0x47,0x00,0x06,0x04,0x47,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x03,0x09,0x21,0x03,0x52,0x10,0x06,0x40,0x35,0x08,0xa8,0x7a,0x47,0x11,0x05, 0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x22,0x00,0x00, 0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x02,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x47,0x68,0xe2,0x47,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x14,0x2f,0x00,0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x33,0x00,0x00,0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x01, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x47,0xa8,0x7a,0x47,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x04,0x68,0x02,0x51,0x21,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x05, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x3c,0x06,0xa8,0x2a,0x51,0x11,0x01,0x40,0x00,0x51,0xa8,0x52,0x51,0x11,0x01, 0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x31,0x00,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x08,0x68,0x02,0x06,0x21,0x00, 0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x02,0x68,0x02,0x51,0x21,0x00, 0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x35,0x00,0x00, 0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x52,0x10,0x04, 0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x09,0x21,0x03,0x52,0x10,0x08, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03,0x21,0x03,0x52,0x10,0x02, 0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2e,0x00,0x00, 0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x32,0x00,0x00, 0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x36,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x5d,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x01,0x26,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x49,0x61,0x00,0x33,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x34,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x11, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x11, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x11, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x11, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x35,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x15,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x15,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x15,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x15,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x36,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x19, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x19, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x19, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x19, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x37,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x38,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x21, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x21, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x21, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x21, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x39,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x25,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x25,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x25,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x25,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x3a,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x29, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x29, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x29, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x29, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x22,0x49,0x61,0x00,0x03,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x04,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x10, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x10, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x10, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x10, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x05,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x14,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x14,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x14,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x14,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x06,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x18, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x18, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x18, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x18, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x07,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x49,0x61,0x00,0x08,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x20, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x20, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x20, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x20, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x20,0x09,0x20,0x09,0x61,0x00,0x49,0x61,0x00,0x09,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x24,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x24,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x20,0x09,0x20,0x09, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x24,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x24,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x0a,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x28, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x28, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x28, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x28, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x24,0x04,0x61,0x00,0x2b,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x2c,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x2d,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x13,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x13,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x13,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x13,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x2e,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x17, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x17, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x17, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x17, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x2f,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x30,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x31,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x23,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x23,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x23,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x23,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x61,0x00,0x32,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x27, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x27, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x27, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x27, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x02, 0x00,0x00,0x00,0x00,0xce,0x8a,0x46,0x02,0x61,0x21,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x3f,0x58,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x03, 0x05,0x02,0x46,0x05,0x10,0x00,0x10,0x00,0x40,0x01,0x03,0x00,0x50,0x85,0x85,0x03, 0x05,0x03,0x46,0x05,0xf0,0xff,0xf0,0xff,0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x04,0x03,0x00,0x50,0x05,0x05,0x2d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x40,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x31, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x31, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x41,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x35, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x35, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x42,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x39, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x39, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x23,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x3b,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x3c,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x30, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x30, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x3d,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x34, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x34, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x3e,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x38, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x38, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x25,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x43,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x44,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x45,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x33, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x33, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04, 0x05,0x46,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x37, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x37, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00, 0x84,0x47,0x00,0x51,0x08,0x00,0x08,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0xa5,0x47, 0x84,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00, 0x5b,0x01,0x00,0x00,0x50,0x85,0x04,0x02,0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01,0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00, 0x40,0x02,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x02,0x00,0x01,0x60,0x01,0x60,0x01, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x04,0x80,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 0x40,0x04,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x60,0x01,0x60,0x01, 0x61,0x02,0x04,0x00,0x68,0x06,0x01,0x00,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47,0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00, 0x70,0x01,0x40,0x00,0x20,0x02,0x01,0x00,0xc4,0x47,0x00,0x52,0x24,0x47,0x00,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xff,0xff,0xff, 0x68,0x00,0x40,0x00,0x20,0x82,0xe5,0x47,0x24,0x47,0x00,0x11,0x01,0x00,0x01,0x00, 0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x50,0x85,0x04,0x02, 0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0xe5,0x01, 0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x02,0x00,0x00,0x10,0x81,0x01,0x10, 0x04,0x02,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x04, 0x80,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x10,0x81,0x01,0x10, 0xe4,0x01,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x02,0x04,0x00,0x68,0x06,0x01,0x00, 0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47, 0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00, 0xc4,0x47,0x00,0x16,0xe4,0x47,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47, 0x84,0x47,0x00,0x05,0x10,0x00,0x10,0x00,0x70,0x01,0x40,0x00,0x20,0x82,0x01,0x00, 0xc4,0x47,0x00,0x31,0x10,0x00,0x10,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x51, 0x00,0x00,0x00,0x00,0x10,0x32,0x54,0x76,0x61,0x00,0x02,0x00,0x50,0x44,0x85,0x48, 0x00,0x00,0x00,0x00,0x10,0x32,0x10,0x32,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x47, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x41,0x03,0x03,0x00,0x50,0x85,0x85,0x51, 0x85,0x51,0x46,0x05,0x80,0x00,0x80,0x00,0x41,0x03,0x02,0x00,0x50,0x85,0x85,0x48, 0x85,0x48,0x34,0x05,0x80,0x00,0x80,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0xe5,0x01, 0xa4,0x47,0x00,0x06,0x84,0x47,0x00,0x00,0x69,0x01,0x00,0x00,0x50,0x85,0x05,0x02, 0xe4,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x03,0x00,0x50,0x05,0x15,0x02, 0x04,0x02,0x00,0x05,0x85,0x51,0x46,0x00,0x40,0x01,0x03,0x00,0x10,0x81,0x01,0x10, 0x15,0x02,0x46,0x01,0x60,0x01,0x60,0x01,0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x05,0x04, 0xa4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10, 0x04,0x04,0x00,0x01,0x00,0x03,0x00,0x03,0x61,0x03,0x00,0x00,0x68,0x06,0x81,0x09, 0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0b, 0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0d, 0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0f, 0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x01, 0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x03, 0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x05, 0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x07, 0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x15,0x04, 0x04,0x02,0x00,0x05,0x85,0x48,0x34,0x00,0x40,0x01,0x02,0x00,0x10,0x81,0x01,0x10, 0x15,0x04,0x34,0x01,0x60,0x05,0x60,0x05,0x61,0x00,0x02,0x00,0x60,0x06,0x05,0x05, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10, 0x04,0x04,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x02,0x00,0x00,0x68,0x06,0x01,0x00, 0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x02, 0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x04, 0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x06, 0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x47, 0xa4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00, 0xa4,0x47,0x00,0x16,0xc4,0x47,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x4c,0x00,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00, 0x40,0x04,0x05,0xa8,0x42,0x47,0x11,0x05,0x40,0x00,0x48,0x68,0x02,0x48,0x01,0x01, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x06,0x01,0x68,0x8a,0x48,0x21,0x00,0x31,0xd8,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xc9,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x02,0x02,0x21,0x53,0x52,0x10,0x01,0x69,0x3a,0x06,0x68,0x42,0x01,0x11,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00, 0x40,0x00,0x03,0xa8,0x2a,0x48,0x11,0x01,0x40,0x03,0x06,0xa8,0x02,0x48,0x11,0x06, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x04,0x48,0xa8,0x52,0x48,0x11,0x01,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x02,0x68,0x02,0x48,0x21,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x03,0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x51,0x68,0x02,0x51,0x01,0x01,0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x47, 0x40,0x06,0x05,0x21,0x03,0x52,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x52,0x10,0x07, 0x40,0x06,0x09,0x21,0x03,0x52,0x10,0x02,0x69,0x05,0x01,0x68,0x8a,0x51,0x21,0x00, 0x40,0x00,0x51,0xa8,0x2a,0x51,0x11,0x01,0x31,0xdd,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x04, 0x04,0x03,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x02,0x68,0x02,0x51,0x21,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x06,0x06,0x21,0x53,0x52,0x10,0x01,0x31,0xd1,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x14,0x2f,0x00,0x00,0x40,0x03,0x03,0x21,0x03,0x52,0x10,0x02, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x2d,0x00,0x00, 0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x31,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x49,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x02,0x00,0x02,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x49,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x48,0x68,0x02,0x48,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00,0x69,0x02,0x04,0x68,0x02,0x48,0x21,0x00, 0x40,0x00,0x48,0xa8,0x2a,0x48,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x02, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x01,0x68,0x8a,0x48,0x21,0x00, 0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00, 0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x51,0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x07,0x05,0x21,0x03,0x52,0x10,0x04,0x40,0x03,0x06,0x21,0x53,0x52,0x10,0x01, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x37,0x03,0x68,0x7a,0x47,0x01,0x04,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00, 0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0x04,0x51,0x00,0x06,0xff,0xff,0xff,0x0f, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x03,0x04,0x21,0x03,0x52,0x10,0x03,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x2b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x48,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30, 0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x47,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00, 0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47, 0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x07,0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00, 0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x00,0x48,0x68,0x02,0x48,0x01,0x01,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06, 0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08, 0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01, 0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00,0x41,0x00,0x03,0x68,0x42,0x01,0x41,0x01, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00, 0x31,0x4a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00, 0x40,0x03,0x03,0xa8,0x42,0x47,0x11,0x03,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x24,0x05,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x24,0x07,0x00,0x00, 0x69,0x00,0x01,0x68,0x8a,0x48,0x21,0x00,0x31,0x4b,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x1b,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06, 0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x02,0x21,0x53,0x52,0x10,0x01, 0x40,0x00,0x03,0xa8,0x2a,0x48,0x11,0x01,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x05, 0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xe1,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x45,0x05, 0x04,0x48,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x02,0x09,0xa8,0x52,0x48,0x11,0x01, 0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x00,0x03,0xa8,0x02,0x48,0x11,0x47,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x69,0x05,0x00,0x00,0x60,0x86,0x25,0x07, 0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x04,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x06,0x02,0x68,0x02,0x09,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x05, 0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00, 0x41,0x00,0x09,0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x03,0x68,0x42,0x01,0x71,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x48,0x00,0x06,0x44,0x05,0x00,0x00, 0x40,0x03,0x09,0xa8,0x02,0x48,0x11,0x09,0x40,0x03,0x48,0xa8,0x02,0x48,0x11,0x03, 0x31,0xf5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x07,0x08,0x21,0x13,0x52,0x10,0x07,0x40,0x07,0x0a,0x21,0x03,0x52,0x10,0x02, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x03,0x52,0x10,0x04, 0x69,0x06,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00, 0x69,0x06,0x02,0x68,0x02,0x09,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x48,0x21,0x00, 0x31,0xe8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00, 0x31,0xd9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00, 0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d,0x00,0x00, 0x40,0x00,0x47,0xa8,0x7a,0x47,0x11,0x47,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x05, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x08,0x21,0x13,0x52,0x10,0x07,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x0a,0x21,0x03,0x52,0x10,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x06,0x21,0x03,0x52,0x10,0x04,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x29,0x00,0x00,0x40,0x00,0x05,0xa8,0x7a,0x47,0x11,0x05, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x51,0x68,0x02,0x51,0x01,0x01,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x08,0x44,0x05,0x00,0x06,0xff,0xff,0xff,0x0f, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x07,0x31,0xba,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x14,0x2b,0x00,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x2f,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x51,0x00,0x06,0x24,0x05,0x00,0x00, 0x40,0x3b,0x02,0xa8,0x2a,0x51,0x11,0x01,0x40,0x00,0x51,0xa8,0x52,0x51,0x11,0x01, 0x31,0xdc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x33,0x00,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x03,0x52,0x10,0x06, 0x69,0x04,0x09,0x68,0x02,0x02,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x06,0x03,0x68,0x22,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00, 0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x37,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x03,0x0a,0x21,0x03,0x52,0x10,0x09,0x40,0x02,0x07,0x21,0x03,0x52,0x10,0x06, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x04,0x21,0x03,0x52,0x10,0x03, 0x31,0xfe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d,0x00,0x00, 0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x31,0x00,0x00, 0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x35,0x00,0x00, 0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x39,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x42,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x06,0x00,0x06,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x42,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00, 0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x41,0x00,0x03,0x68,0x42,0x01,0x41,0x01, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02, 0x40,0x00,0x48,0x68,0x02,0x48,0x01,0x01,0x40,0x07,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x07,0x07,0xa8,0x42,0x47,0x11,0x07, 0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01,0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00, 0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x03,0x00,0x00, 0x69,0x00,0x03,0x68,0x42,0x01,0x11,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06, 0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08, 0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x03,0xa8,0x62,0x48,0x11,0x03, 0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x00,0x05,0x68,0x62,0x48,0x21,0x00,0x40,0x00,0x07,0xa8,0x2a,0x48,0x11,0x01, 0x31,0xf9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x13,0x00,0x00, 0x31,0xe5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x17,0x00,0x00, 0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x1b,0x00,0x00, 0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1f,0x00,0x00, 0x69,0x01,0x01,0x68,0x8a,0x07,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x03,0x06,0x21,0x13,0x52,0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x07,0x04,0x68,0x22,0x03,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05, 0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x03, 0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x06,0x02,0x21,0x53,0x52,0x10,0x01,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05, 0x04,0x48,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x00,0x01,0xa8,0x8a,0x48,0x11,0x47, 0x40,0x05,0x48,0xa8,0x12,0x48,0x11,0x03,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x07,0x08,0x21,0x03,0x52,0x10,0x04,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x06,0x68,0x22,0x05,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x02,0x68,0x82,0x01,0x21,0x00,0x69,0x04,0x04,0x68,0x02,0x48,0x21,0x00, 0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00, 0x40,0x00,0x47,0xa8,0x7a,0x47,0x11,0x47,0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x05, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x05,0x09,0x21,0x03,0x52,0x10,0x06, 0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x03,0x52,0x10,0x04, 0x40,0x00,0x51,0x68,0x02,0x51,0x01,0x01,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x05, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x06,0x24,0x05,0x00,0x06,0xff,0xff,0xff,0x0f, 0x69,0x04,0x01,0x68,0x8a,0x51,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03, 0x04,0x51,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x51,0xa8,0x02,0x51,0x11,0x03, 0x31,0xde,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x2b,0x00,0x00, 0x31,0xef,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x14,0x2f,0x00,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x06,0x68,0x22,0x03,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x03,0x02,0x68,0x02,0x51,0x21,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x14,0x33,0x00,0x00,0x40,0x07,0x04,0x21,0x53,0x52,0x10,0x01, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x52,0x10,0x06, 0x40,0x03,0x05,0x21,0x03,0x52,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x31,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x35,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00, 0x64,0x48,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00, 0x64,0x48,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x3d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x84,0x47,0x00,0x05,0xff,0xff,0xff,0xff,0x70,0x01,0x40,0x00,0x20,0x82,0x01,0x00, 0xe4,0x01,0x00,0x31,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x51, 0x00,0x00,0x00,0x00,0x10,0x32,0x54,0x76,0x61,0x00,0x02,0x00,0x50,0x44,0x85,0x48, 0x00,0x00,0x00,0x00,0x10,0x32,0x10,0x32,0x61,0x00,0x47,0xa8,0xa8,0x00,0x01,0x00, 0x41,0x03,0x03,0x00,0x50,0x85,0x85,0x51,0x85,0x51,0x46,0x05,0x80,0x00,0x80,0x00, 0x41,0x03,0x02,0x00,0x50,0x85,0x85,0x48,0x85,0x48,0x34,0x05,0x80,0x00,0x80,0x00, 0x40,0x03,0x00,0x00,0x60,0x06,0xe5,0x01,0xa4,0x47,0x00,0x06,0x84,0x47,0x00,0x00, 0x69,0x01,0x00,0x00,0x50,0x85,0x05,0x02,0xe4,0x01,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x03,0x00,0x50,0x05,0x15,0x02,0x04,0x02,0x00,0x05,0x85,0x51,0x46,0x00, 0x40,0x01,0x03,0x00,0x10,0x81,0x01,0x10,0x15,0x02,0x46,0x01,0x60,0x01,0x60,0x01, 0x61,0x22,0x03,0x00,0x60,0x06,0x05,0x03,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0x05,0x04,0xa4,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x04,0x00,0x01,0x00,0x03,0x00,0x03, 0x61,0x03,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x02,0x00,0x50,0x05,0x15,0x04,0x04,0x02,0x00,0x05,0x85,0x48,0x34,0x00, 0x40,0x01,0x02,0x00,0x10,0x81,0x01,0x10,0x15,0x04,0x34,0x01,0x60,0x05,0x60,0x05, 0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x02,0x00,0x60,0x06,0x05,0x05, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10, 0x04,0x04,0x00,0x01,0x60,0x05,0x60,0x05,0x61,0x02,0x00,0x00,0x68,0x06,0x01,0x00, 0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x02, 0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x04, 0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x06, 0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x47, 0xa4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00, 0xa4,0x47,0x00,0x16,0x84,0x47,0x00,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0xfe,0xff,0xff,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x3b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01, 0x04,0x48,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x22,0x05,0x68,0x42,0x01,0x11,0x00, 0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x02,0x21,0x2b,0x52,0x10,0x47, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x00,0x51,0xa8,0x2a,0x51,0x11,0x01,0x69,0x06,0x03,0x68,0x82,0x01,0x21,0x00, 0x40,0x06,0x05,0xa8,0x02,0x48,0x11,0x05,0x40,0x06,0x48,0xa8,0x02,0x48,0x11,0x08, 0x31,0xe9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00, 0x69,0x04,0x01,0x68,0x8a,0x51,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03, 0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x02,0x48,0x21,0x00, 0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x40,0x00,0x03,0x21,0x1b,0x52,0x10,0x47,0x40,0x03,0x07,0x21,0x03,0x52,0x10,0x06, 0x40,0x03,0x09,0x21,0x03,0x52,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x53,0x52,0x10,0x01, 0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00, 0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00, 0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2f,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x3a,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x02,0x00,0x02,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x39,0x00,0x00, 0x40,0x00,0x48,0xa8,0x2a,0x48,0x11,0x01,0x40,0x00,0x02,0x21,0x2b,0x52,0x10,0x47, 0x69,0x02,0x01,0x68,0x8a,0x48,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x22,0x04,0x21,0x1b,0x52,0x10,0x47, 0x40,0x03,0x03,0x21,0x53,0x52,0x10,0x01,0x31,0xdf,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00, 0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x39,0x00,0x00, 0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00, 0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x39,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x48,0x00,0x06,0x44,0x01,0x00,0x00, 0x69,0x22,0x05,0x68,0x42,0x01,0x11,0x00,0x69,0x02,0x03,0x68,0x82,0x01,0x21,0x00, 0x40,0x02,0x05,0xa8,0x62,0x48,0x11,0x05,0x40,0x00,0x02,0x21,0x2b,0x52,0x10,0x47, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03,0x69,0x04,0x06,0x68,0x22,0x05,0x21,0x00, 0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00, 0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x41,0x00,0x08,0x68,0x42,0x01,0x31,0x00,0x40,0x00,0x47,0xa8,0x02,0x48,0x11,0x47, 0x40,0x03,0x07,0x21,0x03,0x52,0x10,0x06,0x41,0x37,0x04,0x68,0x42,0x01,0x51,0x00, 0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00, 0x40,0x04,0x08,0xa8,0x62,0x48,0x11,0x08,0x69,0x04,0x01,0x68,0x8a,0x47,0x21,0x00, 0x40,0x03,0x04,0xa8,0x02,0x48,0x11,0x04,0x41,0x30,0x07,0x68,0x42,0x01,0x61,0x00, 0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x22,0x08,0x21,0x00, 0x40,0x04,0x03,0x21,0x53,0x52,0x10,0x01,0x69,0x04,0x05,0x68,0x62,0x04,0x21,0x00, 0x40,0x04,0x07,0xa8,0x02,0x48,0x11,0x07,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x40,0x00,0x05,0xa8,0x02,0x51,0x11,0x05, 0x40,0x06,0x09,0x21,0x03,0x52,0x10,0x02,0x40,0x05,0x06,0x21,0x13,0x52,0x10,0x05, 0x40,0x04,0x48,0xa8,0x52,0x48,0x11,0x01,0x69,0x06,0x02,0x68,0x02,0x07,0x21,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x51,0x00,0x06,0x44,0x01,0x00,0x00, 0x40,0x00,0x51,0xa8,0x02,0x51,0x11,0x08,0x31,0xe2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xf1,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xd3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x03,0x09,0x21,0x03,0x52,0x10,0x02,0x69,0x02,0x01,0x68,0x8a,0x51,0x21,0x00, 0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x03,0x68,0x02,0x48,0x21,0x00, 0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x22,0x05,0x21,0x00, 0x69,0x07,0x02,0x68,0x02,0x05,0x21,0x00,0x31,0xd9,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x23,0x00,0x00,0x40,0x00,0x04,0x21,0x1b,0x52,0x10,0x47, 0x40,0x04,0x0a,0x21,0x03,0x52,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x52,0x10,0x02, 0x40,0x07,0x03,0x21,0x53,0x52,0x10,0x01,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x27,0x00,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00, 0x31,0xdb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2f,0x00,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x20,0x00,0xe8,0x01,0x00,0x11,0x00, 0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x33,0x00,0x00, 0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x37,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x36,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x06,0x00,0x06,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x36,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x48,0x00,0x06,0x44,0x01,0x00,0x00, 0x41,0x22,0x08,0x68,0x42,0x01,0x31,0x00,0x69,0x02,0x03,0x68,0x82,0x01,0x21,0x00, 0x40,0x00,0x02,0x21,0x2b,0x52,0x10,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x00,0x05,0x68,0x42,0x01,0x11,0x00, 0x40,0x05,0x08,0xa8,0x02,0x48,0x11,0x08,0x40,0x05,0x04,0x21,0x03,0x52,0x10,0x03, 0x31,0xdf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00, 0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x40,0x00,0x47,0xa8,0x02,0x48,0x11,0x47,0x40,0x04,0x05,0xa8,0x62,0x48,0x11,0x05, 0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x02,0x08,0x21,0x00, 0x41,0x38,0x04,0x68,0x42,0x01,0x51,0x00,0x69,0x04,0x01,0x68,0x8a,0x47,0x21,0x00, 0x69,0x04,0x06,0x68,0x22,0x05,0x21,0x00,0x40,0x04,0x09,0x21,0x03,0x52,0x10,0x02, 0x40,0x04,0x48,0xa8,0x02,0x48,0x11,0x04,0x40,0x00,0x02,0xa8,0x2a,0x51,0x11,0x01, 0x40,0x00,0x51,0xa8,0x02,0x51,0x11,0x05,0x40,0x06,0x03,0x21,0x53,0x52,0x10,0x01, 0x40,0x06,0x07,0x21,0x03,0x52,0x10,0x06,0x69,0x05,0x05,0x68,0x62,0x48,0x21,0x00, 0x69,0x05,0x08,0x68,0x02,0x02,0x21,0x00,0x69,0x05,0x01,0x68,0x8a,0x51,0x21,0x00, 0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00, 0x31,0xf5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00, 0x31,0xd6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00, 0x40,0x03,0x06,0x21,0x13,0x52,0x10,0x05,0x40,0x34,0x07,0x21,0x1b,0x52,0x10,0x47, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x52,0x10,0x08, 0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03,0x21,0x53,0x52,0x10,0x01, 0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1f,0x00,0x00, 0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x2f,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x20,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x33,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x20,0x43,0x61,0x00,0x33,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x34,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x10,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x10,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x10,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x10,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x35,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x14, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x14, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x14, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x14, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x36,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x18,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x18,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x18,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x18,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x37,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x38,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x20,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x20,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x20,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x39,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x24, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x24, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x24, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x24, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x3a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x28,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x28,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x28,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x28,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x22,0x43,0x61,0x00,0x03,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x04,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x0f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x0f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x0f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x0f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x05,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x13, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x13, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x13, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x13, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x06,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x17,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x17,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x17,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x17,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x07,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x43,0x61,0x00,0x08,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x1f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x1f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x1f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x1f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x60,0x08,0x60,0x08, 0x61,0x00,0x43,0x61,0x00,0x09,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x23, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x23, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x60,0x08,0x60,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x23, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x23, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0x80,0x00,0x80,0x00,0x61,0x00,0x04,0x61,0x00,0x0a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x27,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x27,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x27,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x27,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x02,0x00,0x00,0x00,0x00,0xce,0x8a,0x46,0x02, 0x61,0x21,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3f,0x58,0x00,0x00,0x00,0x00,0x00, 0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x03,0x05,0x02,0x46,0x05,0x10,0x00,0x10,0x00, 0x40,0x01,0x03,0x00,0x50,0x85,0x85,0x03,0x05,0x03,0x46,0x05,0xf0,0xff,0xf0,0xff, 0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0xc4,0x03,0x00,0x50,0x05,0x05,0x2c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x40,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x30,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x30,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x41,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x34,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x34,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x42,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x38,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x38,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x23,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3b,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3c,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3d,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x03,0x58,0x01,0x80,0x00,0x80,0x00, 0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x04,0x05,0x3e,0x58,0x00,0x00,0x00,0x00,0x00, 0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x40,0x00,0x20,0x82,0x01,0x00,0x84,0x47,0x00,0x51,0x08,0x00,0x08,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x03,0x00,0x00, 0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x00,0x00,0x00,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0xa5,0x47,0x84,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00,0x69,0x01,0x00,0x00,0x50,0x85,0xe5,0x01, 0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00,0x5b,0x03,0x00,0x00,0x50,0x85,0x04,0x02, 0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x11,0x10, 0x04,0x02,0x00,0x01,0x60,0x01,0x60,0x01,0x40,0x03,0x00,0x00,0x10,0x81,0x01,0x10, 0xe4,0x01,0x00,0x01,0x60,0x01,0x60,0x01,0x61,0x00,0x03,0x00,0x68,0x06,0x01,0x00, 0x00,0x10,0x11,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47, 0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x40,0x00,0x20,0x02,0x01,0x00, 0xc4,0x47,0x00,0x52,0x24,0x47,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0xff,0xff,0xff,0x68,0x00,0x40,0x00,0x20,0x82,0xe5,0x47, 0x24,0x47,0x00,0x11,0x01,0x00,0x01,0x00,0x61,0x00,0x47,0xa8,0xa0,0x00,0x01,0x00, 0x20,0x00,0x40,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00, 0x69,0x02,0x00,0x00,0x50,0x85,0xe5,0x01,0xc4,0x47,0x00,0x05,0x07,0x00,0x07,0x00, 0x5b,0x00,0x00,0x00,0x50,0x85,0x04,0x02,0xa4,0x47,0x05,0x05,0xc4,0x47,0x80,0x00, 0x40,0x01,0x00,0x00,0x10,0x81,0x11,0x10,0x04,0x02,0x00,0x01,0x60,0x05,0x60,0x05, 0x40,0x03,0x00,0x00,0x10,0x81,0x01,0x10,0xe4,0x01,0x00,0x01,0x60,0x05,0x60,0x05, 0x61,0x00,0x03,0x00,0x68,0x06,0x01,0x00,0x00,0x10,0x11,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47,0xc4,0x47,0x00,0x05,0x01,0x00,0x01,0x00, 0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0xc4,0x47,0x00,0x16,0xe4,0x47,0x00,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xff,0xff,0xff, 0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x47,0x84,0x47,0x00,0x05,0x08,0x00,0x08,0x00, 0x70,0x01,0x40,0x00,0x20,0x82,0x01,0x00,0xc4,0x47,0x00,0x31,0x08,0x00,0x08,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x51,0x00,0x00,0x00,0x00,0x10,0x32,0x54,0x76, 0x61,0x00,0x02,0x00,0x50,0x44,0x85,0x48,0x00,0x00,0x00,0x00,0x10,0x32,0x10,0x32, 0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x47,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x41,0x03,0x03,0x00,0x50,0x85,0x85,0x51,0x85,0x51,0x46,0x05,0x80,0x00,0x80,0x00, 0x41,0x03,0x02,0x00,0x50,0x85,0x85,0x48,0x85,0x48,0x34,0x05,0x80,0x00,0x80,0x00, 0x40,0x03,0x00,0x00,0x60,0x06,0xe5,0x01,0xa4,0x47,0x00,0x06,0x84,0x47,0x00,0x00, 0x69,0x01,0x00,0x00,0x50,0x85,0x05,0x02,0xe4,0x01,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x03,0x00,0x50,0x05,0x15,0x02,0x04,0x02,0x00,0x05,0x85,0x51,0x46,0x00, 0x40,0x01,0x03,0x00,0x10,0x81,0x01,0x10,0x15,0x02,0x46,0x01,0x60,0x01,0x60,0x01, 0x61,0x00,0x03,0x00,0x60,0x06,0x05,0x03,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x50,0x85,0x05,0x04,0xa4,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x04,0x00,0x01,0x00,0x03,0x00,0x03, 0x61,0x03,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x02,0x00,0x50,0x05,0x15,0x04,0x04,0x02,0x00,0x05,0x85,0x48,0x34,0x00, 0x40,0x01,0x02,0x00,0x10,0x81,0x01,0x10,0x15,0x04,0x34,0x01,0x60,0x05,0x60,0x05, 0x61,0x00,0x02,0x00,0x60,0x06,0x05,0x05,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x10,0x81,0x01,0x10,0x04,0x04,0x00,0x01,0x60,0x05,0x60,0x05, 0x61,0x02,0x00,0x00,0x68,0x06,0x01,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x02,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x04,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x06,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x47,0xa4,0x47,0x00,0x05,0x01,0x00,0x01,0x00, 0x70,0x01,0x40,0x00,0x60,0x06,0x01,0x00,0xa4,0x47,0x00,0x16,0xc4,0x47,0x00,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xfe,0xff,0xff, 0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x55,0x06,0x00,0x06,0x00, 0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x55,0x04,0x00,0x04,0x00, 0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x04,0x00,0x04,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x28,0x00,0x00, 0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47, 0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00,0x40,0x04,0x05,0xa8,0x42,0x47,0x11,0x05, 0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x02, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06, 0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x01,0x68,0x8a,0x48,0x21,0x00, 0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00, 0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x31,0xab,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x02,0x21,0x53,0x52,0x10,0x01, 0x69,0x3b,0x06,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x40,0x00,0x03,0xa8,0x2a,0x48,0x11,0x01, 0x40,0x03,0x06,0xa8,0x02,0x48,0x11,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x48,0xa8,0x52,0x48,0x11,0x01, 0x31,0xfd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00, 0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x03,0x02,0x68,0x02,0x48,0x21,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x03, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x00, 0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x47,0x40,0x06,0x05,0x21,0x03,0x52,0x10,0x04, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x52,0x10,0x07, 0x40,0x06,0x09,0x21,0x03,0x52,0x10,0x02,0x69,0x05,0x01,0x68,0x8a,0x51,0x21,0x00, 0x40,0x00,0x51,0xa8,0x2a,0x51,0x11,0x01,0x31,0xde,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x04, 0x04,0x03,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x03,0x02,0x68,0x02,0x51,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x06,0x06,0x21,0x53,0x52,0x10,0x01, 0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2f,0x00,0x00, 0x40,0x03,0x03,0x21,0x03,0x52,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x30,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x25,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x25,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00, 0x69,0x02,0x04,0x68,0x02,0x48,0x21,0x00,0x40,0x00,0x48,0xa8,0x2a,0x48,0x11,0x01, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x04,0x01,0x68,0x8a,0x48,0x21,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x51, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x21,0x03,0x52,0x10,0x04, 0x40,0x03,0x06,0x21,0x53,0x52,0x10,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x38,0x03,0x68,0x7a,0x47,0x01,0x02, 0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0c,0x00,0x00, 0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x02, 0x04,0x51,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x04,0x21,0x03,0x52,0x10,0x03, 0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2c,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x24,0x00,0x00, 0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00, 0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x24,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01,0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00, 0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00, 0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02, 0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05, 0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x07, 0x44,0x47,0x00,0x06,0x04,0x07,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x24,0x07,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01,0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00, 0x41,0x00,0x03,0x68,0x42,0x01,0x41,0x01,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05, 0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x07, 0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00,0x31,0x4b,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x40,0x03,0x03,0xa8,0x42,0x47,0x11,0x03, 0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x05,0x44,0x47,0x00,0x06,0x24,0x05,0x00,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x24,0x07,0x00,0x00,0x69,0x00,0x01,0x68,0x8a,0x48,0x21,0x00, 0x31,0x4c,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00, 0x31,0xfe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00, 0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x1b,0x00,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04, 0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x04,0x02,0x21,0x53,0x52,0x10,0x01,0x40,0x00,0x03,0xa8,0x2a,0x48,0x11,0x01, 0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x31,0xf0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00, 0x31,0xe1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x23,0x00,0x00, 0x31,0xd2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x27,0x00,0x00, 0x40,0x02,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x48,0x00,0x06,0x24,0x05,0x00,0x00, 0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x03,0x21,0x00, 0x40,0x03,0x09,0xa8,0x52,0x48,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x03,0xa8,0x02,0x48,0x11,0x47, 0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0c,0x00,0x00, 0x69,0x05,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x06,0x21,0x03,0x52,0x10,0x04,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x05,0x02,0x68,0x02,0x09,0x21,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x05, 0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00, 0x41,0x00,0x09,0x68,0x42,0x01,0x61,0x00,0x41,0x00,0x03,0x68,0x42,0x01,0x71,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x05,0x04,0x48,0x00,0x06,0x44,0x05,0x00,0x00, 0x40,0x03,0x09,0xa8,0x02,0x48,0x11,0x09,0x40,0x03,0x48,0xa8,0x02,0x48,0x11,0x03, 0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00, 0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08,0x21,0x13,0x52,0x10,0x07, 0x40,0x07,0x0a,0x21,0x03,0x52,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x03,0x52,0x10,0x04, 0x69,0x06,0x00,0x00,0x60,0x86,0x25,0x07,0x44,0x05,0x00,0x05,0x02,0x00,0x02,0x00, 0x69,0x06,0x02,0x68,0x02,0x09,0x21,0x00,0x69,0x06,0x04,0x68,0x02,0x48,0x21,0x00, 0x31,0xe5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00, 0x31,0xd8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00, 0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00, 0x40,0x00,0x47,0xa8,0x7a,0x47,0x11,0x47,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x05, 0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x13,0x52,0x10,0x07, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x05,0x0a,0x21,0x03,0x52,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x52,0x10,0x04, 0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x20,0x00,0x00, 0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x24,0x00,0x00, 0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00, 0x40,0x00,0x05,0xa8,0x7a,0x47,0x11,0x05,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x02, 0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x08,0x44,0x05,0x00,0x06,0xff,0xff,0xff,0x0f, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02, 0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x07,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x2f,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x05, 0x04,0x51,0x00,0x06,0x24,0x05,0x00,0x00,0x40,0x3c,0x02,0xa8,0x2a,0x51,0x11,0x01, 0x40,0x00,0x51,0xa8,0x52,0x51,0x11,0x01,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x0c,0x33,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x03,0x52,0x10,0x06, 0x69,0x04,0x09,0x68,0x02,0x02,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x06,0x03,0x68,0x22,0x05,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x51,0x21,0x00, 0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x37,0x00,0x00, 0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x0a,0x21,0x03,0x52,0x10,0x09, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03, 0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x31,0xff,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x0a,0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x34,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x38,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x1e,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x1e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xe5,0x01, 0x04,0x48,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x03,0xa8,0x42,0x47,0x11,0x47, 0x69,0x00,0x05,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x07,0x68,0x42,0x01,0xc1,0x00, 0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x01,0x00,0x06,0xff,0xff,0xff,0x0f, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x04,0x00,0x04,0x00, 0x41,0x00,0x03,0x68,0x42,0x01,0x41,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x48,0x68,0x02,0x48,0x81,0x00, 0x40,0x07,0x00,0x00,0x60,0x06,0x25,0x05,0x44,0x47,0x00,0x06,0x04,0x05,0x00,0x00, 0x40,0x07,0x07,0xa8,0x42,0x47,0x11,0x07,0x40,0x06,0x00,0x00,0x60,0x06,0xe5,0x01, 0x44,0x47,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x03,0x00,0x00,0x69,0x00,0x03,0x68,0x42,0x01,0x11,0x00, 0x31,0xf3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x0b,0x00,0x00, 0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x05,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x02, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x03,0xa8,0x62,0x48,0x11,0x03, 0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x00,0x05,0x68,0x62,0x48,0x21,0x00, 0x40,0x00,0x07,0xa8,0x2a,0x48,0x11,0x01,0x31,0xf5,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xe8,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xba,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00, 0x40,0x02,0x06,0x21,0x13,0x52,0x10,0x05,0x69,0x02,0x01,0x68,0x8a,0x07,0x21,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x04,0x68,0x22,0x03,0x21,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x05,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x02,0x21,0x53,0x52,0x10,0x01, 0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x05,0x04,0x48,0x00,0x06,0x24,0x05,0x00,0x00, 0x40,0x00,0x01,0xa8,0x8a,0x48,0x11,0x47,0x40,0x05,0x48,0xa8,0x12,0x48,0x11,0x03, 0x31,0xf6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00, 0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x10,0x00,0x00, 0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x08,0x21,0x03,0x52,0x10,0x04, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x06,0x68,0x22,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x02,0x68,0x82,0x01,0x21,0x00, 0x69,0x04,0x04,0x68,0x02,0x48,0x21,0x00,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x00,0x47,0xa8,0x7a,0x47,0x11,0x47, 0x68,0x00,0x00,0x00,0x20,0x82,0x25,0x05,0x04,0x51,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x05,0x09,0x21,0x03,0x52,0x10,0x06,0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x02, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x08,0x21,0x03,0x52,0x10,0x04, 0x40,0x00,0x51,0x68,0x02,0x51,0x81,0x00,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x00,0x47,0xa8,0xe2,0x47,0x11,0x05, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x06,0x24,0x05,0x00,0x06,0xff,0xff,0xff,0x0f, 0x69,0x04,0x01,0x68,0x8a,0x51,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03, 0x04,0x51,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x51,0xa8,0x02,0x51,0x11,0x03, 0x31,0xdf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x2b,0x00,0x00, 0x31,0xe0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x0c,0x2f,0x00,0x00, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07, 0x64,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x04,0x06,0x68,0x22,0x03,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00, 0x69,0x03,0x02,0x68,0x02,0x51,0x21,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x0c,0x33,0x00,0x00,0x40,0x07,0x04,0x21,0x53,0x52,0x10,0x01, 0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x52,0x10,0x06, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02, 0x40,0x04,0x05,0x21,0x03,0x52,0x10,0x02,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x0c,0x30,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x0c,0x34,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02, 0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00, 0x61,0x00,0x03,0x62,0x80,0x47,0x11,0x00,0x61,0x00,0x03,0x62,0xc8,0x48,0x11,0x00, 0x5b,0x00,0x00,0x00,0x60,0x86,0x04,0x02,0xc4,0x01,0x05,0x01,0x64,0x48,0x04,0x00, 0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x47,0x64,0x47,0x00,0x06,0xe0,0xff,0xff,0x3f, 0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xe4,0x47,0x00,0x05,0x20,0x00,0x20,0x00, 0x41,0x03,0x20,0x22,0x2e,0x02,0x11,0x01,0x40,0x00,0x14,0x68,0x82,0x47,0x01,0x04, 0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x47,0x64,0x47,0x00,0x06,0x44,0x48,0x00,0x00, 0x49,0x00,0x02,0xa8,0x2a,0x02,0x11,0x01,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x05,0x03,0x62,0x80,0x01,0x11,0x00,0x40,0x02,0x47,0xa8,0xe2,0x47,0x11,0x02, 0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x0c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x00,0x02,0x68,0x82,0x47,0x01,0x06,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x61,0x06,0x03,0x62,0x00,0x14,0x11,0x00,0x40,0x00,0x48,0xa8,0x2a,0x48,0x11,0x48, 0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x15,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x03,0x62,0x00,0x02,0x11,0x00, 0x69,0x02,0x48,0x68,0x02,0x48,0x21,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x1d, 0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x38,0x00,0x80,0xa0,0x4a,0x45,0x03, 0x00,0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x03,0x62,0x80,0x47,0x11,0x00, 0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xc4,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02, 0x69,0x07,0x00,0x00,0x60,0x86,0x45,0x47,0x64,0x47,0x00,0x05,0x02,0x00,0x02,0x00, 0x31,0xb7,0x03,0x80,0x00,0x00,0x05,0x25,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x61,0x37,0x03,0x62,0x80,0x01,0x11,0x00,0x40,0x07,0x48,0x68,0x02,0x48,0x01,0xf8, 0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x29,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x61,0x36,0x03,0x62,0x00,0x14,0x11,0x00,0x31,0x9c,0x03,0x80,0x00,0x00,0x05,0x2d, 0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3c,0x03,0x62,0x00,0x02,0x11,0x00, 0x31,0x9b,0x03,0x80,0x00,0x00,0x05,0x31,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x07,0x20,0x07, 0x61,0x25,0x39,0x61,0x00,0x04,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x38, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x38, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x07,0x20,0x07,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x38, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x38, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x07,0xa0,0x07,0x61,0x00,0x3d,0x61,0x00,0x05,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x07,0xa0,0x07, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3c,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3c,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0x20,0x08,0x20,0x08, 0x61,0x00,0x41,0x61,0x00,0x06,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x40, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x40, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0x20,0x08,0x20,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x40, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x40, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x07,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x44,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x44,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x44,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x44,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x08,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x09,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x50,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x50,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x50,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x50,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x0a,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x54, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x54, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x54, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x54, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x0b,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x58,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x58,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x58,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x58,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x29,0x45,0x61,0x00,0x0c,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x37, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x37, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x37, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x37, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x0d,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x0e,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x0f,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x10,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x11,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x12,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x53, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x53, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x53, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x53, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x13,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x57,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x57,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x57,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x57,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x2a,0x45,0x61,0x00,0x15,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x36, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x36, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x36, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x36, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x16,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3a,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3a,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x17,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x18,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x42,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x42,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x42,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x42,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x19,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x1a,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4e,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4e,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4e,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4e,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x1b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x52, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x52, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x52, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x52, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x1c,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x56,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x56,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x56,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x56,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x28,0x45,0x61,0x00,0x1d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x35, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x35, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x35, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x35, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x1e,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x1f,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x20,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x21,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x49, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x49, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x49, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x49, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x22,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x45,0x61,0x00,0x23,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x51, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x51, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x51, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x51, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x5a,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x45,0x61,0x00,0x24,0x10,0x00, 0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x55,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x55,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x59,0x58,0x01,0xa0,0x08,0xa0,0x08, 0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x55,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x55,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00, 0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x02,0x00,0x00,0x00,0x00,0xce,0x8a,0x46,0x02, 0x61,0x27,0x04,0x00,0x90,0x09,0x05,0x45,0x05,0x25,0x58,0x00,0x00,0x00,0x00,0x00, 0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x03, 0x05,0x02,0x46,0x05,0x10,0x00,0x10,0x00,0x40,0x01,0x03,0x00,0x50,0x85,0x85,0x03, 0x05,0x03,0x46,0x05,0xf0,0xff,0xf0,0xff,0x40,0x01,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x04,0x03,0x00,0x50,0x05,0x05,0x0c, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0c, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x26,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x10, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x10, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x27,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x14, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x14, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x28,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x18, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x18, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x26,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x29,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x0b, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0b, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2a,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x0f, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0f, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2b,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x13, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x13, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2c,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x17, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x17, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x2c,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2d,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x0a, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0a, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2e,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x0e, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0e, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x2f,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x12, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x12, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x30,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x16, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x16, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x2b,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x31,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x09, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x09, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x32,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x0d, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x0d, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x33,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x11, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x11, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10, 0x05,0x03,0x58,0x01,0xa0,0x08,0xa0,0x08,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x45, 0x05,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x15, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x15, 0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x06,0x00,0x06,0x00,0x20,0x00,0x40,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x06,0x00,0x00,0x40,0x00,0x01,0xa8,0x8a,0x48,0x11,0x47, 0x69,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02, 0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x47,0x64,0x47,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x47,0x00,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x07,0x04,0xa8,0x02,0x48,0x11,0x04,0x40,0x07,0x48,0xa8,0x02,0x48,0x11,0x06, 0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x35,0x00,0x00, 0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x39,0x00,0x00, 0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x02, 0x64,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x3d,0x00,0x00, 0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x41,0x00,0x00, 0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xa0,0x24,0x09,0x00,0x00, 0x31,0x92,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x0d,0x00,0x00, 0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00, 0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x47,0x00,0x15,0x02,0x00,0x02,0x00, 0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x47,0x64,0x47,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x48,0xa8,0x02,0x48,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x04, 0x64,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x24,0x35,0x00,0x00,0x31,0x94,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x24,0x39,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x04,0x00,0xa0,0x24,0x09,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x04,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30, 0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x69,0x00,0x04,0x68,0x42,0x01,0x31,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02, 0x40,0x00,0x01,0xa8,0x8a,0x48,0x11,0x47,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00, 0x40,0x05,0x04,0xa8,0x62,0x48,0x11,0x04,0x31,0xd6,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x24,0x35,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x06,0xa8,0x62,0x48,0x11,0x06, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x69,0x36,0x02,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x04, 0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07, 0x24,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x04,0x02,0xa8,0x02,0x48,0x11,0x02, 0x40,0x04,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x48,0x00,0x06,0xe4,0x01,0x00,0x00, 0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x04,0x04,0x48,0x00,0x06,0x24,0x04,0x00,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x06,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00, 0x31,0xf7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x39,0x00,0x00, 0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x3d,0x00,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x47,0x64,0x47,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x47,0xa8,0x42,0x47,0x11,0x47,0x40,0x00,0x04,0xa8,0x42,0x47,0x11,0x04, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x05,0x48,0xa8,0x12,0x48,0x11,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00, 0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03, 0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x44,0x47,0x00,0x06,0x04,0x06,0x00,0x00, 0x31,0x49,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x41,0x00,0x00, 0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x49,0x00,0x00, 0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x4d,0x00,0x00, 0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x51,0x00,0x00, 0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00, 0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x07,0x64,0x47,0x00,0x06,0xff,0xff,0xff,0x0f, 0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08, 0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00, 0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05, 0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x24,0x55,0x00,0x00,0x31,0xce,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x24,0x09,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x24,0x0d,0x00,0x00,0x31,0x90,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x24,0x11,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x24,0x15,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00, 0x24,0x47,0x00,0x15,0x06,0x00,0x06,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02, 0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10, 0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x01,0xa8,0x8a,0x48,0x11,0x47, 0x69,0x00,0x04,0x68,0x42,0x01,0x31,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x24,0x35,0x00,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00, 0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x03,0x04,0xa8,0x62,0x48,0x11,0x04,0x69,0x32,0x02,0x68,0x42,0x01,0x41,0x00, 0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00, 0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x47,0x64,0x47,0x00,0x01,0x02,0x00,0x02,0x00, 0x40,0x00,0x47,0xa8,0x42,0x47,0x11,0x47,0x40,0x07,0x06,0xa8,0x02,0x48,0x11,0x06, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x04,0x00,0x01,0x04,0x00,0x04,0x00, 0x40,0x06,0x02,0xa8,0x02,0x48,0x11,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47, 0x44,0x47,0x00,0x06,0x04,0x04,0x00,0x00,0x40,0x07,0x48,0xa8,0x52,0x48,0x11,0x01, 0x31,0xf3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x39,0x00,0x00, 0x31,0xc4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x3d,0x00,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x02,0x00,0x01,0x04,0x00,0x04,0x00, 0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00, 0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03, 0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x34,0x00,0x00,0x60,0x86,0x45,0x05, 0x64,0x47,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x07,0x00,0xa0,0x24,0x41,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x08,0x00,0xa0,0x24,0x49,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x03,0x00,0xa0,0x24,0x4d,0x00,0x00,0x31,0x98,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x05,0x00,0xa0,0x24,0x09,0x00,0x00,0x31,0xe9,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x06,0x00,0xa0,0x24,0x0d,0x00,0x00,0x31,0xba,0x04,0x80,0x00,0x00,0x01,0x00, 0x04,0x02,0x00,0xa0,0x24,0x11,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00, 0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00, 0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff, 0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00, 0x6c,0x01,0x02,0x68,0x7a,0x47,0xf1,0x01,0x6c,0x00,0x00,0x00,0x60,0x86,0xe5,0x01, 0x84,0x01,0x00,0x05,0x1f,0x00,0x1f,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x47, 0x04,0x02,0x00,0x06,0x64,0x47,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x01, 0xe4,0x01,0x00,0x06,0x84,0x01,0x00,0x00,0x67,0x02,0x47,0xa8,0xe2,0x47,0x11,0x02, 0x61,0x00,0x04,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x02,0x00,0x00,0xa0,0x02,0x45,0x02, 0x64,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x60,0x06,0x85,0x01, 0x84,0x01,0x00,0x06,0xe4,0x01,0x00,0x00,0x38,0xab,0x00,0x00,0xa0,0x0a,0x45,0x04, 0x44,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x25,0x03, 0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xcb,0x00,0x00,0xa0,0x02,0x44,0x04, 0x44,0x04,0x02,0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00,0x00,0x60,0x0a,0x25,0x02, 0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a,0x45,0x03, 0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x05,0x05, 0x44,0x04,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x25,0x02, 0x64,0x47,0x00,0x06,0x24,0x02,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06,0x45,0x03, 0x84,0x01,0x00,0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06,0xe8,0x05,0x05,0x11,0x00, 0x61,0x03,0x03,0x68,0x26,0x02,0x11,0x00,0x61,0x03,0x04,0x68,0x46,0x03,0x11,0x00, 0x61,0x03,0x06,0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x02,0xa8,0x52,0x02,0x11,0x01, 0x5b,0x02,0x00,0x00,0xa0,0x02,0x44,0x02,0x24,0x03,0x82,0x02,0x24,0x06,0x44,0x02, 0x5b,0x04,0x00,0x00,0xa0,0x02,0x04,0x03,0x04,0x04,0x82,0x02,0x24,0x06,0x04,0x03, 0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, 0x40,0x02,0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02,0x00,0x0a,0x04,0x03,0x00,0x00, 0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x04,0x44,0x04,0x00,0x0a,0x44,0x02,0x00,0x00, 0x61,0x01,0x07,0xe8,0x45,0x04,0x11,0x00,0x40,0x01,0x07,0xa8,0x02,0x07,0x11,0x06, 0x41,0x01,0x20,0x22,0x1e,0x07,0x11,0x47,0x49,0x00,0x08,0xa8,0x1a,0x07,0x11,0x47, 0x40,0x07,0x07,0xa8,0x02,0x07,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x01, 0x84,0x01,0x00,0x06,0x04,0x08,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00, 0x84,0x01,0x00,0x42,0x64,0x47,0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0x25,0x07, 0x04,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x07,0xa8,0x12,0x07,0x11,0x07, 0x67,0x01,0x47,0xa8,0x9a,0x07,0x11,0x02,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80, 0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x84,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x53,0x75,0x72,0x66, 0x61,0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f,0x32,0x44,0x54,0x6f,0x32,0x44, 0x5f,0x4e,0x56,0x31,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72, 0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72, 0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66, 0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63, 0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63, 0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53, 0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00, 0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33, 0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30, 0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00, 0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34, 0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30, 0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00, 0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35, 0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30, 0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00, 0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35, 0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30, 0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00, 0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36, 0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30, 0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00, 0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37, 0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30, 0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00, 0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38, 0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30, 0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00, 0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39, 0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30, 0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00, 0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39, 0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30, 0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00, 0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30, 0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30, 0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00, 0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31, 0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30, 0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00, 0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32, 0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30, 0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00, 0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33, 0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30, 0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00, 0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33, 0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30, 0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00, 0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34, 0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30, 0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00, 0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35, 0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30, 0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00, 0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36, 0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30, 0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00, 0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37, 0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30, 0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00, 0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37, 0x38,0x00,0x41,0x30,0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30, 0x33,0x00,0x41,0x30,0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30, 0x37,0x00,0x41,0x30,0x38,0x00,0x41,0x30,0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31, 0x31,0x00,0x41,0x31,0x32,0x00,0x41,0x31,0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31, 0x35,0x00,0x41,0x31,0x36,0x00,0x41,0x31,0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31, 0x39,0x00,0x41,0x32,0x30,0x00,0x41,0x32,0x31,0x00,0x41,0x32,0x32,0x00,0x41,0x32, 0x33,0x00,0x41,0x32,0x34,0x00,0x41,0x32,0x35,0x00,0x41,0x32,0x36,0x00,0x41,0x32, 0x37,0x00,0x41,0x32,0x38,0x00,0x41,0x32,0x39,0x00,0x41,0x33,0x30,0x00,0x41,0x33, 0x31,0x00,0x41,0x33,0x32,0x00,0x41,0x33,0x33,0x00,0x41,0x33,0x34,0x00,0x41,0x33, 0x35,0x00,0x41,0x33,0x36,0x00,0x41,0x33,0x37,0x00,0x41,0x33,0x38,0x00,0x41,0x33, 0x39,0x00,0x41,0x34,0x30,0x00,0x41,0x34,0x31,0x00,0x41,0x34,0x32,0x00,0x41,0x34, 0x33,0x00,0x41,0x34,0x34,0x00,0x41,0x34,0x35,0x00,0x41,0x34,0x36,0x00,0x41,0x34, 0x37,0x00,0x41,0x34,0x38,0x00,0x41,0x34,0x39,0x00,0x41,0x35,0x30,0x00,0x41,0x35, 0x31,0x00,0x41,0x35,0x32,0x00,0x41,0x35,0x33,0x00,0x41,0x35,0x34,0x00,0x41,0x35, 0x35,0x00,0x41,0x35,0x36,0x00,0x41,0x35,0x37,0x00,0x41,0x35,0x38,0x00,0x41,0x35, 0x39,0x00,0x41,0x36,0x30,0x00,0x41,0x36,0x31,0x00,0x41,0x36,0x32,0x00,0x41,0x36, 0x33,0x00,0x41,0x36,0x34,0x00,0x41,0x36,0x35,0x00,0x41,0x36,0x36,0x00,0x41,0x36, 0x37,0x00,0x41,0x36,0x38,0x00,0x41,0x36,0x39,0x00,0x41,0x37,0x30,0x00,0x41,0x37, 0x31,0x00,0x41,0x37,0x32,0x00,0x41,0x37,0x33,0x00,0x41,0x37,0x34,0x00,0x41,0x37, 0x35,0x00,0x41,0x37,0x36,0x00,0x41,0x37,0x37,0x00,0x41,0x37,0x38,0x00,0x41,0x37, 0x39,0x00,0x53,0x75,0x72,0x66,0x61,0x63,0x65,0x4d,0x69,0x72,0x72,0x6f,0x72,0x5f, 0x32,0x44,0x54,0x6f,0x32,0x44,0x5f,0x4e,0x56,0x31,0x32,0x5f,0x42,0x42,0x5f,0x30, 0x5f,0x31,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d, 0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54, 0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x67,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x53,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x20,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x77,0x00,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79, 0x00,0x00,0x00,0x51,0x08,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00, 0x00,0x00,0x52,0x10,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00, 0x00,0x54,0x00,0x01,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 0x52,0x10,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x51, 0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x51,0x08, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x08,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x51,0x08,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x51,0x08,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x08,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x08,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x51,0x08,0x00,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x54,0x00,0x01,0x44,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x51,0x08,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x87,0x00,0x00,0x00,0x51,0x08,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x88,0x00,0x00,0x00,0x51,0x08,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89, 0x00,0x00,0x00,0x51,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x51,0x08,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x51,0x08,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, 0x51,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x51, 0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x54,0x00, 0x01,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x51,0x08,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x51,0x08,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x08,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x51,0x08,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x51,0x08,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x51,0x08,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x51,0x08,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x97,0x00,0x00,0x00,0x54,0x00,0x01,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x98,0x00,0x00,0x00,0x51,0x08,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 0x00,0x00,0x00,0x51,0x08,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0x51,0x08,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00, 0x00,0x51,0x08,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, 0x51,0x08,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x51, 0x08,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x51,0x08, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x20,0x01,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x20,0x01,0x00,0x5a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x20,0x01,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x20,0x01,0x00,0x5e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x20,0x01,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x51,0x20,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x51,0x20,0x00,0x68,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0x51,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa7,0x00,0x00,0x00,0x51,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0x00,0x00,0x00,0x52,0x10,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9, 0x00,0x00,0x00,0x53,0x40,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0x53,0x40,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00, 0x00,0x53,0x40,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00, 0x53,0x40,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0xad,0x00,0x00, 0x00,0x10,0x00,0x00,0xae,0x00,0x00,0x00,0x10,0x00,0x00,0xaf,0x00,0x00,0x00,0x10, 0x00,0x00,0xb0,0x00,0x00,0x00,0x10,0x00,0x00,0xb1,0x00,0x00,0x00,0x10,0x00,0x00, 0xb2,0x00,0x00,0x00,0x10,0x00,0x00,0xb3,0x00,0x00,0x00,0x10,0x00,0x00,0xb4,0x00, 0x00,0x00,0x10,0x00,0x00,0xb5,0x00,0x00,0x00,0x10,0x00,0x00,0xb6,0x00,0x00,0x00, 0x10,0x00,0x00,0xb7,0x00,0x00,0x00,0x10,0x00,0x00,0xb8,0x00,0x00,0x00,0x10,0x00, 0x00,0xb9,0x00,0x00,0x00,0x10,0x00,0x00,0xba,0x00,0x00,0x00,0x10,0x00,0x00,0xbb, 0x00,0x00,0x00,0x10,0x00,0x00,0xbc,0x00,0x00,0x00,0x10,0x00,0x00,0xbd,0x00,0x00, 0x00,0x10,0x00,0x00,0xbe,0x00,0x00,0x00,0x10,0x00,0x00,0xbf,0x00,0x00,0x00,0x10, 0x00,0x00,0xc0,0x00,0x00,0x00,0x10,0x00,0x00,0xc1,0x00,0x00,0x00,0x10,0x00,0x00, 0xc2,0x00,0x00,0x00,0x10,0x00,0x00,0xc3,0x00,0x00,0x00,0x10,0x00,0x00,0xc4,0x00, 0x00,0x00,0x10,0x00,0x00,0xc5,0x00,0x00,0x00,0x10,0x00,0x00,0xc6,0x00,0x00,0x00, 0x10,0x00,0x00,0xc7,0x00,0x00,0x00,0x10,0x00,0x00,0xc8,0x00,0x00,0x00,0x10,0x00, 0x00,0xc9,0x00,0x00,0x00,0x10,0x00,0x00,0xca,0x00,0x00,0x00,0x10,0x00,0x00,0xcb, 0x00,0x00,0x00,0x10,0x00,0x00,0xcc,0x00,0x00,0x00,0x10,0x00,0x00,0xcd,0x00,0x00, 0x00,0x10,0x00,0x00,0xce,0x00,0x00,0x00,0x10,0x00,0x00,0xcf,0x00,0x00,0x00,0x10, 0x00,0x00,0xd0,0x00,0x00,0x00,0x10,0x00,0x00,0xd1,0x00,0x00,0x00,0x10,0x00,0x00, 0xd2,0x00,0x00,0x00,0x10,0x00,0x00,0xd3,0x00,0x00,0x00,0x10,0x00,0x00,0xd4,0x00, 0x00,0x00,0x10,0x00,0x00,0xd5,0x00,0x00,0x00,0x10,0x00,0x00,0xd6,0x00,0x00,0x00, 0x10,0x00,0x00,0xd7,0x00,0x00,0x00,0x10,0x00,0x00,0xd8,0x00,0x00,0x00,0x10,0x00, 0x00,0xd9,0x00,0x00,0x00,0x10,0x00,0x00,0xda,0x00,0x00,0x00,0x10,0x00,0x00,0xdb, 0x00,0x00,0x00,0x10,0x00,0x00,0xdc,0x00,0x00,0x00,0x10,0x00,0x00,0xdd,0x00,0x00, 0x00,0x10,0x00,0x00,0xde,0x00,0x00,0x00,0x10,0x00,0x00,0xdf,0x00,0x00,0x00,0x10, 0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0x00,0x00,0xe1,0x00,0x00,0x00,0x10,0x00,0x00, 0xe2,0x00,0x00,0x00,0x10,0x00,0x00,0xe3,0x00,0x00,0x00,0x10,0x00,0x00,0xe4,0x00, 0x00,0x00,0x10,0x00,0x00,0xe5,0x00,0x00,0x00,0x10,0x00,0x00,0xe6,0x00,0x00,0x00, 0x10,0x00,0x00,0xe7,0x00,0x00,0x00,0x10,0x00,0x00,0xe8,0x00,0x00,0x00,0x10,0x00, 0x00,0xe9,0x00,0x00,0x00,0x10,0x00,0x00,0xea,0x00,0x00,0x00,0x10,0x00,0x00,0xeb, 0x00,0x00,0x00,0x10,0x00,0x00,0xec,0x00,0x00,0x00,0x10,0x00,0x00,0xed,0x00,0x00, 0x00,0x10,0x00,0x00,0xee,0x00,0x00,0x00,0x10,0x00,0x00,0xef,0x00,0x00,0x00,0x10, 0x00,0x00,0xf0,0x00,0x00,0x00,0x10,0x00,0x00,0xf1,0x00,0x00,0x00,0x10,0x00,0x00, 0xf2,0x00,0x00,0x00,0x10,0x00,0x00,0xf3,0x00,0x00,0x00,0x10,0x00,0x00,0xf4,0x00, 0x00,0x00,0x10,0x00,0x00,0xf5,0x00,0x00,0x00,0x10,0x00,0x00,0xf6,0x00,0x00,0x00, 0x10,0x00,0x00,0xf7,0x00,0x00,0x00,0x10,0x00,0x00,0xf8,0x00,0x00,0x00,0x10,0x00, 0x00,0xf9,0x00,0x00,0x00,0x10,0x00,0x00,0xfa,0x00,0x00,0x00,0x10,0x00,0x00,0xfb, 0x00,0x00,0x00,0x10,0x00,0x00,0xfc,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01, 0x00,0xfd,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0xfe,0x00,0x00,0x00,0x01,0x00,0x00, 0xff,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00, 0xaf,0x1e,0x00,0x00,0xf8,0x10,0x00,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x16,0x67, 0x65,0x6e,0x78,0x5f,0x63,0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f, 0x38,0x2e,0x61,0x73,0x6d,0x01,0x01,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x01,0x00, 0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x7a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x7d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2e,0x00,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x08,0x67,0x45,0x23,0x01,0x01,0x03,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0x18,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xf8,0xff,0xff,0xff,0x01,0x03,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x01,0x03,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x08,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0xe8,0xff,0xff,0xff,0x28,0x04,0x01,0x00,0x00,0x00,0x04,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x00,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x01,0x00,0x00,0x04, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x03, 0x01,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x00,0x18,0x00,0x02,0x03,0x01,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x02,0x00,0x00,0x04,0x00,0x34,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x02,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x02,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x03,0x00,0x00,0x04, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x10,0x00,0x02,0x03, 0x03,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x01,0x18,0x00,0x02,0x03,0x03,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x04,0x00,0x00,0x04,0x00,0x35,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x04,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x02,0x08,0x00,0x02, 0x03,0x04,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x05,0x00,0x00,0x04, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x02,0x10,0x00,0x02,0x03, 0x05,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x02,0x18,0x00,0x02,0x03,0x05,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x06,0x00,0x00,0x04,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x06,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x08,0x00,0x02, 0x03,0x06,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x07,0x00,0x00,0x04, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x10,0x00,0x02,0x03, 0x07,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x03,0x18,0x00,0x02,0x03,0x07,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x08,0x00,0x00,0x04,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x08,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x04,0x08,0x00,0x02, 0x03,0x08,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x09,0x00,0x00,0x04, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x04,0x10,0x00,0x02,0x03, 0x09,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x04,0x18,0x00,0x02,0x03,0x09,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x0a,0x00,0x00,0x04,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x0a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x05,0x08,0x00,0x02, 0x03,0x0a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0b,0x00,0x00,0x04, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x05,0x10,0x00,0x02,0x03, 0x0b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x05,0x18,0x00,0x02,0x03,0x0b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x0c,0x00,0x00,0x04,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x0c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x06,0x08,0x00,0x02, 0x03,0x0c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0d,0x00,0x00,0x04, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x06,0x10,0x00,0x02,0x03, 0x0d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x06,0x18,0x00,0x02,0x03,0x0d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x0e,0x00,0x00,0x04,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x03,0x0e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x07,0x08,0x00,0x02, 0x03,0x0e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x0f,0x00,0x00,0x04, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x07,0x10,0x00,0x02,0x03, 0x0f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x07,0x18,0x00,0x02,0x03,0x0f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x10,0x00,0x00,0x04,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x10,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x10,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x11,0x00,0x00,0x04, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x03, 0x11,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x00,0x18,0x00,0x02,0x03,0x11,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x12,0x00,0x00,0x04,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x12,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x12,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x13,0x00,0x00,0x04, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x01,0x10,0x00,0x02,0x03, 0x13,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x01,0x18,0x00,0x02,0x03,0x13,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x14,0x00,0x00,0x04,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x14,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x02,0x08,0x00,0x02, 0x03,0x14,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x15,0x00,0x00,0x04, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x02,0x10,0x00,0x02,0x03, 0x15,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x02,0x18,0x00,0x02,0x03,0x15,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x16,0x00,0x00,0x04,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x16,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x03,0x08,0x00,0x02, 0x03,0x16,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x17,0x00,0x00,0x04, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x03,0x10,0x00,0x02,0x03, 0x17,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x03,0x18,0x00,0x02,0x03,0x17,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x18,0x00,0x00,0x04,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x18,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x04,0x08,0x00,0x02, 0x03,0x18,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x19,0x00,0x00,0x04, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x04,0x10,0x00,0x02,0x03, 0x19,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x04,0x18,0x00,0x02,0x03,0x19,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x1a,0x00,0x00,0x04,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x1a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x05,0x08,0x00,0x02, 0x03,0x1a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1b,0x00,0x00,0x04, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x05,0x10,0x00,0x02,0x03, 0x1b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x05,0x18,0x00,0x02,0x03,0x1b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x1c,0x00,0x00,0x04,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x1c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x06,0x08,0x00,0x02, 0x03,0x1c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1d,0x00,0x00,0x04, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x06,0x10,0x00,0x02,0x03, 0x1d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x06,0x18,0x00,0x02,0x03,0x1d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x1e,0x00,0x00,0x04,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x03,0x1e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x07,0x08,0x00,0x02, 0x03,0x1e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x1f,0x00,0x00,0x04, 0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x07,0x10,0x00,0x02,0x03, 0x1f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x07,0x18,0x00,0x02,0x03,0x1f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x20,0x00,0x00,0x04,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x20,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x20,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x21,0x00,0x00,0x04, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x03, 0x21,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x00,0x18,0x00,0x02,0x03,0x21,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x22,0x00,0x00,0x04,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x22,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x22,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x23,0x00,0x00,0x04, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x01,0x10,0x00,0x02,0x03, 0x23,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x01,0x18,0x00,0x02,0x03,0x23,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x24,0x00,0x00,0x04,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x24,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x02,0x08,0x00,0x02, 0x03,0x24,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x25,0x00,0x00,0x04, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x02,0x10,0x00,0x02,0x03, 0x25,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x02,0x18,0x00,0x02,0x03,0x25,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x26,0x00,0x00,0x04,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x26,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x03,0x08,0x00,0x02, 0x03,0x26,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x27,0x00,0x00,0x04, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x03,0x10,0x00,0x02,0x03, 0x27,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x03,0x18,0x00,0x02,0x03,0x27,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x28,0x00,0x00,0x04,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x28,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x04,0x08,0x00,0x02, 0x03,0x28,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x29,0x00,0x00,0x04, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x04,0x10,0x00,0x02,0x03, 0x29,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x04,0x18,0x00,0x02,0x03,0x29,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x2a,0x00,0x00,0x04,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x2a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x05,0x08,0x00,0x02, 0x03,0x2a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2b,0x00,0x00,0x04, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x05,0x10,0x00,0x02,0x03, 0x2b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x05,0x18,0x00,0x02,0x03,0x2b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x2c,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x2c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x06,0x08,0x00,0x02, 0x03,0x2c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2d,0x00,0x00,0x04, 0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x06,0x10,0x00,0x02,0x03, 0x2d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x06,0x18,0x00,0x02,0x03,0x2d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x2e,0x00,0x00,0x04,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x03,0x2e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x07,0x08,0x00,0x02, 0x03,0x2e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x2f,0x00,0x00,0x04, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x07,0x10,0x00,0x02,0x03, 0x2f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x07,0x18,0x00,0x02,0x03,0x2f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x30,0x00,0x00,0x04,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x30,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x03,0x30,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x31,0x00,0x00,0x04, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x03, 0x31,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x00,0x18,0x00,0x02,0x03,0x31,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x32,0x00,0x00,0x04,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x32,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x32,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x33,0x00,0x00,0x04, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x01,0x10,0x00,0x02,0x03, 0x33,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x01,0x18,0x00,0x02,0x03,0x33,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x34,0x00,0x00,0x04,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x34,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x02,0x08,0x00,0x02, 0x03,0x34,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x35,0x00,0x00,0x04, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x02,0x10,0x00,0x02,0x03, 0x35,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x02,0x18,0x00,0x02,0x03,0x35,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x36,0x00,0x00,0x04,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x36,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x03,0x08,0x00,0x02, 0x03,0x36,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x37,0x00,0x00,0x04, 0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x03,0x10,0x00,0x02,0x03, 0x37,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x03,0x18,0x00,0x02,0x03,0x37,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x28,0x04,0x01,0x38,0x00,0x00,0x04,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x03,0x38,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x04,0x08,0x00,0x02, 0x03,0x38,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x39,0x00,0x00,0x04, 0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x04,0x10,0x00,0x02,0x03, 0x39,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x04,0x18,0x00,0x02,0x03,0x39,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x28,0x04,0x01,0x3a,0x00,0x00,0x04,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x03,0x3a,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x05,0x08,0x00,0x02, 0x03,0x3a,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3b,0x00,0x00,0x04, 0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x05,0x10,0x00,0x02,0x03, 0x3b,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x05,0x18,0x00,0x02,0x03,0x3b,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x28,0x04,0x01,0x3c,0x00,0x00,0x04,0x00,0x54,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x03,0x3c,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x06,0x08,0x00,0x02, 0x03,0x3c,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3d,0x00,0x00,0x04, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x06,0x10,0x00,0x02,0x03, 0x3d,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x06,0x18,0x00,0x02,0x03,0x3d,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x28,0x04,0x01,0x3e,0x00,0x00,0x04,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x03,0x3e,0x00,0x00,0x00,0x00, 0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x07,0x08,0x00,0x02, 0x03,0x3e,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x28,0x04,0x01,0x3f,0x00,0x00,0x04, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x07,0x10,0x00,0x02,0x03, 0x3f,0x00,0x00,0x00,0x00,0x04,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x07,0x18,0x00,0x02,0x03,0x3f,0x00,0x08,0x00,0x00,0x04,0x20,0x01,0x29,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x80,0xff,0xff, 0xff,0x0c,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xe0,0xff,0xff,0xff,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xa5,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x29,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe0,0xff,0xff,0xff,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xe0,0xff,0xff,0xff,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4d, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe0,0xff,0xff,0xff, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04, 0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xaa,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x7c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0xab,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x7d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xac,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x20,0x04,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xad,0x00,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x62,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x0c,0xce,0x8a,0x46,0x02,0x01,0x03,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x28,0x04,0x01,0x40,0x00,0x00,0x04, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03, 0x40,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00, 0x00,0x00,0x08,0x00,0x02,0x03,0x40,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04, 0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x41,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x41,0x00,0x00,0x00,0x00, 0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x03,0x41,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28, 0x04,0x01,0x42,0x00,0x00,0x04,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x03,0x42,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03, 0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x42,0x00,0x08,0x00, 0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x43,0x00,0x00, 0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x03,0x43,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x43,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29, 0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01,0x44,0x00,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x44,0x00,0x00,0x00, 0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x08,0x00, 0x02,0x03,0x44,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x28,0x04,0x01,0x45,0x00,0x00,0x04,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x45,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29, 0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x45,0x00,0x08, 0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x46,0x00, 0x00,0x04,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x03,0x46,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb0, 0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03,0x46,0x00,0x08,0x00,0x00,0x03,0x20,0x01, 0x29,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04,0x01,0x47,0x00,0x00,0x04,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x47,0x00,0x00, 0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x03,0x08, 0x00,0x02,0x03,0x47,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x28,0x04,0x01,0x48,0x00,0x00,0x04,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x48,0x00,0x00,0x00,0x00,0x03,0x20,0x01, 0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x48,0x00, 0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x49, 0x00,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x03,0x49,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00, 0xb1,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x03,0x49,0x00,0x08,0x00,0x00,0x03,0x20, 0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x28,0x04,0x01,0x4a,0x00,0x00,0x04,0x00,0x71, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x4a,0x00, 0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x02, 0x08,0x00,0x02,0x03,0x4a,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x28,0x04,0x01,0x4b,0x00,0x00,0x04,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xb1,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x03,0x4b,0x00,0x00,0x00,0x00,0x03,0x20, 0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x4b, 0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x28,0x04,0x01, 0x4c,0x00,0x00,0x04,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x03,0x4c,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x03,0x4c,0x00,0x08,0x00,0x00,0x03, 0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x28,0x04,0x01,0x4d,0x00,0x00,0x04,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x03,0x4d, 0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00, 0x01,0x08,0x00,0x02,0x03,0x4d,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00, 0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x28,0x04,0x01,0x4e,0x00,0x00,0x04,0x00,0x77,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x03,0x4e,0x00,0x00,0x00,0x00,0x03, 0x20,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x03, 0x4e,0x00,0x08,0x00,0x00,0x03,0x20,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x28,0x04, 0x01,0x4f,0x00,0x00,0x04,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00, 0x03,0x00,0x00,0x02,0x03,0x4f,0x00,0x00,0x00,0x00,0x03,0x20,0x01,0x29,0x03,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x03,0x4f,0x00,0x08,0x00,0x00, 0x03,0x20,0x01,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0xa5,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x67,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x07,0x01,0x20,0x04,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6d,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x07,0x01,0x20,0x04,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x73,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07, 0x01,0x20,0x04,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x61, 0x01,0x04,0x80,0x10,0x41,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65, 0x00,0x00,0x80,0x10,0x82,0x66,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x68, 0x00,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x69, 0x02,0x00,0x00,0x60,0x81,0x05,0x04,0x64,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x65, 0x02,0x03,0x62,0x05,0x02,0xf1,0xff,0x61,0x00,0x05,0x64,0x00,0x00,0x10,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x69, 0x03,0x00,0x00,0x60,0x81,0x25,0x05,0x04,0x03,0x00,0x05,0x03,0x00,0x03,0x00,0x61, 0x00,0x00,0x80,0xa0,0x4a,0x45,0x05,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61, 0x06,0x05,0x62,0x00,0x04,0x11,0x00,0x40,0x00,0x0e,0x68,0x02,0x04,0x01,0x02,0x31, 0xa0,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x50,0x44,0x05,0x29,0x00,0x00,0x00,0x00,0x67,0x45,0x23,0x01,0x40, 0x00,0x17,0x68,0x02,0x04,0x01,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01, 0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x05,0x62,0x00,0x0e,0x11,0x00,0x40, 0x00,0x20,0x68,0x02,0x04,0x01,0x06,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x0f,0x04, 0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x04,0x03,0x00,0x50,0x85,0x05,0x2a,0x05, 0x29,0x46,0x05,0x18,0x00,0x18,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01, 0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x04,0x05,0x62,0x00,0x17,0x11,0x00,0x61, 0x02,0x03,0x00,0x90,0x09,0x05,0x2b,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x31, 0xa2,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x40, 0x00,0x03,0x00,0x50,0x85,0x85,0x2b,0x05,0x2a,0x46,0x05,0xf8,0xff,0xf8,0xff,0x01, 0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x61, 0x05,0x05,0x62,0x00,0x20,0x11,0x00,0x40,0x00,0x03,0x00,0x50,0x85,0x05,0x2c,0x05, 0x2a,0x46,0x05,0xf0,0xff,0xf0,0xff,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x21,0x04, 0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x03,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0xc0,0x09,0xc0,0x09,0x40,0x00,0x03,0x00,0x50,0x85,0x85,0x2c,0x05, 0x2a,0x46,0x05,0xe8,0xff,0xe8,0xff,0x61,0x20,0x4e,0x61,0x00,0x06,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x2d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x2d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x04,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0xc0,0x09,0xc0,0x09,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x2d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x2d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xe0,0x09,0xe0,0x09,0x61, 0x00,0x4f,0x61,0x00,0x07,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x2e,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x2e,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xe0,0x09,0xe0,0x09,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x2e,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x2e,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x00,0x0a,0x00,0x0a,0x61,0x00,0x50,0x61,0x00,0x08,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x00,0x0a,0x00,0x0a,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x2f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x2f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x20,0x0a,0x20,0x0a,0x61, 0x00,0x51,0x61,0x00,0x09,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x30,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x30,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x20,0x0a,0x20,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x30,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x30,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x40,0x0a,0x40,0x0a,0x61,0x00,0x52,0x61,0x00,0x0a,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x31,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x31,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x40,0x0a,0x40,0x0a,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x31,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x31,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x60,0x0a,0x60,0x0a,0x61, 0x00,0x53,0x61,0x00,0x0b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x32,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x32,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x60,0x0a,0x60,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x32,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x32,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x80,0x0a,0x80,0x0a,0x61,0x00,0x54,0x61,0x00,0x0c,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x80,0x0a,0x80,0x0a,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x33,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x33,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xa0,0x0a,0xa0,0x0a,0x61, 0x00,0x55,0x61,0x00,0x0d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x34,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x34,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xa0,0x0a,0xa0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x34,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x34,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0xc0,0x0a,0xc0,0x0a,0x61,0x21,0x56,0x61,0x00,0x0f,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x35,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x35,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0xc0,0x0a,0xc0,0x0a,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x35,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x35,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61, 0x00,0x57,0x61,0x00,0x10,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x36,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x36,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xe0,0x0a,0xe0,0x0a,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x36,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x36,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x00,0x0b,0x00,0x0b,0x61,0x00,0x58,0x61,0x00,0x11,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x00,0x0b,0x00,0x0b,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x37,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x37,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x20,0x0b,0x20,0x0b,0x61, 0x00,0x59,0x61,0x00,0x12,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x38,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x38,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x20,0x0b,0x20,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x38,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x38,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x40,0x0b,0x40,0x0b,0x61,0x00,0x5a,0x61,0x00,0x13,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x40,0x0b,0x40,0x0b,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x39,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x39,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x60,0x0b,0x60,0x0b,0x61, 0x00,0x5b,0x61,0x00,0x14,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3a,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3a,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x60,0x0b,0x60,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3a,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3a,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x80,0x0b,0x80,0x0b,0x61,0x00,0x5c,0x61,0x00,0x15,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x80,0x0b,0x80,0x0b,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x3b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x3b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xa0,0x0b,0xa0,0x0b,0x61, 0x00,0x5d,0x61,0x00,0x16,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3c,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3c,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xa0,0x0b,0xa0,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3c,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3c,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0xc0,0x0b,0xc0,0x0b,0x61,0x22,0x5e,0x61,0x00,0x18,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x3d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x3d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0xc0,0x0b,0xc0,0x0b,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x3d,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x3d,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xe0,0x0b,0xe0,0x0b,0x61, 0x00,0x5f,0x61,0x00,0x19,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x3e,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x3e,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xe0,0x0b,0xe0,0x0b,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x3e,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x3e,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x00,0x0c,0x00,0x0c,0x61,0x00,0x60,0x61,0x00,0x1a,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x3f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x3f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x00,0x0c,0x00,0x0c,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x3f,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x3f,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x20,0x0c,0x20,0x0c,0x61, 0x00,0x61,0x61,0x00,0x1b,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x40,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x40,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x20,0x0c,0x20,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x40,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x40,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x40,0x0c,0x40,0x0c,0x61,0x00,0x62,0x61,0x00,0x1c,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x40,0x0c,0x40,0x0c,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x41,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x41,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x60,0x0c,0x60,0x0c,0x61, 0x00,0x63,0x61,0x00,0x1d,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x42,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x42,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x60,0x0c,0x60,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x42,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x42,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x80,0x0c,0x80,0x0c,0x61,0x00,0x64,0x61,0x00,0x1e,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x80,0x0c,0x80,0x0c,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x43,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x43,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xa0,0x0c,0xa0,0x0c,0x61, 0x00,0x65,0x61,0x00,0x1f,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x44,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x44,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xa0,0x0c,0xa0,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x44,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x44,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0xc0,0x0c,0xc0,0x0c,0x61,0x23,0x66,0x61,0x00,0x21,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x45,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x45,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0xc0,0x0c,0xc0,0x0c,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x45,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x45,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xe0,0x0c,0xe0,0x0c,0x61, 0x00,0x67,0x61,0x00,0x22,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x46,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x46,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xe0,0x0c,0xe0,0x0c,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x46,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x46,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x00,0x0d,0x00,0x0d,0x61,0x00,0x68,0x61,0x00,0x23,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x47,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x47,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x00,0x0d,0x00,0x0d,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x47,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x47,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x20,0x0d,0x20,0x0d,0x61, 0x00,0x69,0x61,0x00,0x24,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x48,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x48,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x20,0x0d,0x20,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x48,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x48,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x40,0x0d,0x40,0x0d,0x61,0x00,0x6a,0x61,0x00,0x25,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x49,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x49,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x40,0x0d,0x40,0x0d,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x49,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x49,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0x60,0x0d,0x60,0x0d,0x61, 0x00,0x6b,0x61,0x00,0x26,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4a,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4a,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0x60,0x0d,0x60,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4a,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4a,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2b,0x58,0x01,0x80,0x0d,0x80,0x0d,0x61,0x00,0x6c,0x61,0x00,0x27,0x10,0x00,0x61, 0x01,0x03,0x00,0x00,0x00,0x05,0x4b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0x45,0x4b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2c,0x58,0x01,0x80,0x0d,0x80,0x0d,0x61, 0x00,0x03,0x00,0x00,0x00,0x85,0x4b,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61, 0x00,0x03,0x00,0x00,0x00,0xc5,0x4b,0x00,0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05,0x2b,0x58,0x01,0xa0,0x0d,0xa0,0x0d,0x61, 0x00,0x6d,0x61,0x00,0x28,0x10,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0x05,0x4c,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x45,0x4c,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x2c,0x58,0x01,0xa0,0x0d,0xa0,0x0d,0x61,0x00,0x03,0x00,0x00,0x00,0x85,0x4c,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xc5,0x4c,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x04,0x4d,0x44, 0x01,0x05,0x01,0x64,0x01,0x80,0xff,0x40,0x00,0x02,0xa8,0x42,0x01,0x31,0x0e,0x40, 0x02,0x01,0x68,0x9a,0x4d,0x01,0xfe,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24, 0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x04,0x44, 0x01,0x00,0x06,0x04,0x17,0x00,0x02,0x40,0x04,0x03,0x68,0x62,0x02,0x01,0xfe,0x61, 0x04,0x05,0x62,0x78,0x01,0x11,0x00,0x40,0x00,0x07,0xa8,0x42,0x01,0x31,0x20,0x31, 0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xc0,0x44,0x2d,0x00,0x00,0x40, 0x04,0x06,0x68,0x22,0x04,0x01,0xfe,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x61, 0x04,0x05,0x62,0x20,0x03,0x11,0x00,0x40,0x03,0x08,0x68,0x02,0x07,0x01,0xfe,0x31, 0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xc0,0x44,0x35,0x00,0x00,0x01, 0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61, 0x03,0x05,0x62,0x00,0x06,0x11,0x00,0x61,0x00,0x03,0x00,0x50,0x40,0x05,0x19,0x00, 0x00,0x00,0x00,0xce,0x8a,0x46,0x02,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x05,0x00,0xc0,0x44,0x3d,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x61, 0x03,0x05,0x62,0x00,0x08,0x11,0x00,0x40,0x02,0x03,0x00,0x50,0x85,0x05,0x1a,0x05, 0x19,0x46,0x05,0x10,0x00,0x10,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x05,0x00,0xc0,0x44,0x45,0x00,0x00,0x69,0x37,0x00,0x00,0x60,0x81,0x25,0x05,0x04, 0x03,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x05,0x00, 0x00,0x00,0x00,0x1f,0x00,0x03,0x00,0x61,0x00,0x05,0x62,0x00,0x04,0x11,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x40, 0x05,0x03,0x00,0x50,0x85,0x85,0x1a,0x05,0x1a,0x46,0x05,0xf0,0xff,0xf0,0xff,0x31, 0xb8,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x61, 0x38,0x05,0x62,0x00,0x0e,0x11,0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x05,0x0d,0x04, 0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x39,0x05,0x62,0x00,0x17,0x11,0x00,0x31, 0x9a,0x03,0x80,0x00,0x00,0x05,0x11,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x61, 0x3a,0x05,0x62,0x00,0x20,0x11,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x05,0x15,0x04, 0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x04,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xc0,0x0d,0xc0,0x0d,0x61,0x28,0x04,0x00,0x90,0x09,0x05,0x6e,0x05, 0x09,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1b,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1b,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xe0,0x0d,0xe0,0x0d,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x6f,0x05, 0x0a,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1c,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1c,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x00,0x0e,0x00,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x70,0x05, 0x0b,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1d,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1d,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x20,0x0e,0x20,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x71,0x05, 0x0c,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1e,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1e,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x40,0x0e,0x40,0x0e,0x61,0x29,0x04,0x00,0x90,0x09,0x05,0x72,0x05, 0x0d,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x1f,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x1f,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x60,0x0e,0x60,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x73,0x05, 0x0e,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x20,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x20,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x80,0x0e,0x80,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x74,0x05, 0x0f,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x21,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x21,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xa0,0x0e,0xa0,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x75,0x05, 0x10,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x22,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x22,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xc0,0x0e,0xc0,0x0e,0x61,0x2a,0x04,0x00,0x90,0x09,0x05,0x76,0x05, 0x11,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x23,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x23,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xe0,0x0e,0xe0,0x0e,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x77,0x05, 0x12,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x24,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x24,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x00,0x0f,0x00,0x0f,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x78,0x05, 0x13,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x25,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x25,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x20,0x0f,0x20,0x0f,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x79,0x05, 0x14,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x26,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x26,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x40,0x0f,0x40,0x0f,0x61,0x2b,0x04,0x00,0x90,0x09,0x05,0x7a,0x05, 0x15,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x27,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x27,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x60,0x0f,0x60,0x0f,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7b,0x05, 0x16,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x28,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x28,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0x80,0x0f,0x80,0x0f,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7c,0x05, 0x17,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x29,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x29,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x10,0x81,0x01,0x10,0x05, 0x1a,0x58,0x01,0xa0,0x0f,0xa0,0x0f,0x61,0x00,0x04,0x00,0x90,0x09,0x05,0x7d,0x05, 0x18,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x50,0x05,0x05,0x2a,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x05,0x85,0x2a,0x00, 0x80,0xf1,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x62,0x78,0x01,0x11,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x61, 0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x05,0x00,0xc0,0x24,0x1b,0x00,0x00,0x61,0x3c,0x05,0x62,0x20,0x03,0x11,0x00,0x31, 0x9d,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xc0,0x24,0x1f,0x00,0x00,0x61, 0x3d,0x05,0x62,0x00,0x06,0x11,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x05,0x00,0xc0,0x24,0x23,0x00,0x00,0x61,0x3e,0x05,0x62,0x00,0x08,0x11,0x00,0x31, 0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xc0,0x24,0x27,0x00,0x00,0x31, 0x04,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x35, 0x01,0x00,0x00,0x53,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x53,0x77, 0x61,0x70,0x5f,0x32,0x44,0x54,0x6f,0x32,0x44,0x5f,0x33,0x32,0x78,0x33,0x32,0x00, 0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74, 0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f, 0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65, 0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54, 0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32, 0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00, 0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33, 0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30, 0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00, 0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34, 0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30, 0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00, 0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35, 0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30, 0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00, 0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35, 0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30, 0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00, 0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36, 0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30, 0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00, 0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37, 0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30, 0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00, 0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38, 0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30, 0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00, 0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39, 0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30, 0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00, 0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39, 0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30, 0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00, 0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30, 0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30, 0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00, 0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31, 0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30, 0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00, 0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32, 0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30, 0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00, 0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33, 0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30, 0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00, 0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33, 0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30, 0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00, 0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34, 0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30, 0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00, 0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35, 0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30, 0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00, 0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36, 0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30, 0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00, 0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37, 0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30, 0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00, 0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37, 0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30, 0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00, 0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38, 0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30, 0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00, 0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39, 0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30, 0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00, 0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30, 0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30, 0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00, 0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31, 0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30, 0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00, 0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31, 0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30, 0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00, 0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32, 0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30, 0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00, 0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33, 0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30, 0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00, 0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34, 0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30, 0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00, 0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35, 0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30, 0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00, 0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35, 0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30, 0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00, 0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36, 0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30, 0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00, 0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37, 0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30, 0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00, 0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38, 0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30, 0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00, 0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39, 0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30, 0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00, 0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39, 0x39,0x00,0x50,0x30,0x31,0x00,0x53,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70, 0x79,0x53,0x77,0x61,0x70,0x5f,0x32,0x44,0x54,0x6f,0x32,0x44,0x5f,0x33,0x32,0x78, 0x33,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32, 0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42, 0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f, 0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f, 0x39,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e, 0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61, 0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x1a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x27,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x67,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68, 0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x76,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x77,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x85,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x86,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x87,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00, 0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x54, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x54,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x97,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa6,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa7,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb5,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb6,0x00,0x00,0x00,0x20,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb7,0x00,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8, 0x00,0x00,0x00,0x51,0x40,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00, 0x00,0x51,0x40,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00, 0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x51, 0x40,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x20,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x53,0x80,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x53,0x80,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x53,0x80,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x53,0x80,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x53,0x20,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x53,0x20,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x54,0x40,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0x54,0x40,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc6,0x00,0x00,0x00,0x54,0x40,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc7,0x00,0x00,0x00,0x54,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x54,0x40,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0x54,0x40,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00, 0x00,0x54,0x40,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00, 0x54,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x54, 0x40,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x54,0x40, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x54,0x40,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x54,0x40,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x54,0x40,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x54,0x00,0x01,0x4c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x54,0x40,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x51,0x10,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x51,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0x20,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd6,0x00,0x00,0x00,0x51,0x40,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x51,0x40,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8, 0x00,0x00,0x00,0x51,0x40,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00, 0x00,0x00,0x53,0x80,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00, 0x00,0x53,0x80,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00, 0x53,0x80,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x53, 0x80,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x53,0x20, 0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x53,0x20,0x00, 0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x54,0x40,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x54,0x40,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x54,0x40,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x54,0x40,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x54,0x40,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x54,0x40,0x00,0x63,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe5,0x00,0x00,0x00,0x54,0x40,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe6,0x00,0x00,0x00,0x54,0x40,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe7,0x00,0x00,0x00,0x54,0x40,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8, 0x00,0x00,0x00,0x54,0x40,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0x54,0x40,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00, 0x00,0x54,0x40,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00, 0x54,0x40,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x54, 0x00,0x01,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x54,0x40, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x51,0x10,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x51,0x10,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x20,0x01,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x51,0x40,0x00,0x91,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x51,0x40,0x00,0x92,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x51,0x40,0x00,0x93,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x53,0x80,0x00,0x91,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf5,0x00,0x00,0x00,0x53,0x80,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf6,0x00,0x00,0x00,0x53,0x80,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf7,0x00,0x00,0x00,0x53,0x80,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0x00,0x00,0x00,0x53,0x20,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00, 0x00,0x00,0x53,0x20,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00, 0x00,0x54,0x40,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00, 0x54,0x40,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54, 0x40,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x54,0x40, 0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x54,0x40,0x00, 0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x54,0x40,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x54,0x40,0x00,0x89,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x40,0x00,0x8a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x54,0x40,0x00,0x8b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x54,0x40,0x00,0x8c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x54,0x40,0x00,0x8d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x54,0x40,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x01,0x00,0x00,0x54,0x40,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x07,0x01,0x00,0x00,0x54,0x00,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x54,0x40,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x51,0x10,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00, 0x00,0x51,0x10,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00, 0x20,0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x51, 0x40,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x51,0x40, 0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x51,0x40,0x00, 0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x53,0x80,0x00,0xb6, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53,0x80,0x00,0xb7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x80,0x00,0xb8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x80,0x00,0xbb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0xb9,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x20,0x00,0xba,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x15,0x01,0x00,0x00,0x54,0x40,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x16,0x01,0x00,0x00,0x54,0x40,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x17,0x01,0x00,0x00,0x54,0x40,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x01,0x00,0x00,0x54,0x40,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01, 0x00,0x00,0x54,0x40,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00, 0x00,0x54,0x40,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00, 0x54,0x40,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x54, 0x40,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x54,0x40, 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x54,0x40,0x00, 0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x54,0x40,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x54,0x40,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x54,0x40,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x54,0x00,0x01,0xbb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x54,0x40,0x00,0xb5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x51,0x10,0x00,0xb9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x25,0x01,0x00,0x00,0x51,0x10,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x26,0x01,0x00,0x00,0x01,0x00,0x00,0x09,0x00,0x27,0x01, 0x00,0x00,0x01,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00, 0x2a,0x01,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00, 0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x2f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x30,0x01,0x00,0x00,0x01,0x00,0x00,0x31,0x01,0x00, 0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00, 0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00, 0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x5d,0x31,0x00, 0x00,0xee,0x17,0x00,0x00,0x03,0x00,0x32,0x01,0x00,0x00,0x16,0x67,0x65,0x6e,0x78, 0x5f,0x63,0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x39,0x2e,0x61, 0x73,0x6d,0x33,0x01,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x01,0x00,0x30,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xc0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc2,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0x01,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x32,0x00,0x01,0x00,0x01,0x00,0x29,0x03,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x02, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc4,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc4,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x06, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc4,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc4,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc4,0x00,0x00, 0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc4,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc4,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x02, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc5,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc5,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x06, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc5,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc5,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc5,0x00,0x00, 0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc5,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc5,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x02, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc6,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc6,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x06, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc6,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc6,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc6,0x00,0x00, 0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc6,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc6,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x02, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc7,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc7,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x06, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xc7,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc7,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc7,0x00,0x00, 0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xc7,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x02, 0x00,0x31,0x01,0x00,0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x47,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcb, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x47,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x47,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x47,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcd, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x47,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x47,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x47,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x47,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x48,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcf, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x48,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x48,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xce,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x48,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x48,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x48,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x48,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x48,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x48,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x48,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x48,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x49,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd3, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x49,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x49,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x49,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x49,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd5, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x49,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x49,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x49,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xd7,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd8, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xd7,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd7,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xd7,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0xd6,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd7,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xd7,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xd7,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xd7,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd7,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xd7,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd7,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xd7,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x31,0x02,0x00,0x29,0x04,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xda, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbc,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xbe, 0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc2,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4c,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbc,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xdd,0x00,0x00,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x00,0x00,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x71,0x00,0x00,0x00,0x00,0x00,0x32,0x00, 0x01,0x00,0x03,0x00,0x29,0x03,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdf,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xdf,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xdf,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xdf,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xdf,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdf,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xdf,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xdf,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xdf,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe0,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe0,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe0,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe0,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe0,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe0,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe1,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe1,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x58,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe1,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe1,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe1,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe1,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe1,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe1,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe1,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5d, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe2,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe2,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe2,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xe2,0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe4, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe2,0x00, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xe3,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe2,0x00,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xe2,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x04,0x00,0x31,0x03, 0x00,0x29,0x04,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6c, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe6,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6c,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xdc,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6c, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe8,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6c,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6c,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xdc,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xdd,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xdd,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6e, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xee,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6e,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6e,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xed,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xde,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6e, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x6e,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6e,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6e,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xef,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xde,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf2, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xf3,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xf2,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xf2,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf2,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf2,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x71,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf2, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xf2,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf2,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xf2,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf2,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf2,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x31,0x04,0x00,0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xf5,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xdd,0x00,0x00,0x00,0x00,0x00, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdb,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x71,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x73,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00, 0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x00,0x00,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf8,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x05, 0x00,0x29,0x03,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfa, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfa,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfa,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfa,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfa,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfa,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfa, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfa,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfa,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfa,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfa,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfa,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfa,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfb, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfb,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfb,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfb,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfb,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfb,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfb, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfb,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfb,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfb,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfb,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfb,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfc, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfc,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfc,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfc,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfc,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfc, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfc,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfc,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfc,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfc,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfc,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfd, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfd,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfd,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfd,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfd,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfd,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0xfd,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfd, 0x00,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0xfd,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfd,0x00,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xfd,0x00,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfd,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfd,0x00,0x00, 0x00,0x06,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x06,0x00,0x31,0x05,0x00,0x29,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x91,0x00,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x91,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x91,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x91,0x00,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf7,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x91,0x00,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x91,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x91,0x00,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x91,0x00, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x91,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x91,0x00,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x85,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf7,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x00,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x92,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x92,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x00,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf8,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x00,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x92,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x06, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x00,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x00, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x92,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x07,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x00,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf8,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x93,0x00,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x93,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x93,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x93,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x09,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x93,0x00,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x93,0x00,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x93,0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0a, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x93,0x00,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x93,0x00, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x93,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x0b,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x93,0x00,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x8d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x01,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x0d,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0c, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x01, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x0d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x01,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x96,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x01,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x0d,0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x01,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x01, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x0d,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x01,0x00,0x00,0x06,0x01, 0x23,0x01,0x31,0x06,0x00,0x29,0x04,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x07,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xf8,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07, 0x00,0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0xf9,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20, 0x08,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf6,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x96,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x99,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x01,0x00,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x13,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x14,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xbb,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x07,0x00,0x29,0x03, 0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x15,0x01,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x15,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9a, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x15,0x01, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x15,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9b,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x15,0x01,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x15,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x15,0x01,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x15,0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9c, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x15,0x01,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x15,0x01, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x15,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9d,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x15,0x01,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x15,0x01,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x16,0x01,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x16,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9e, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x16,0x01, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x16,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9f,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x16,0x01,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x16,0x01,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x16,0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa0, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x16,0x01,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x16,0x01, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x16,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xa1,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x16,0x01,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x17,0x01,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x17,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa2, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x17,0x01, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x17,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xa3,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x17,0x01,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x17,0x01,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x17,0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x17,0x01,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x17,0x01, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x17,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xa5,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x17,0x01,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0xa4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x01,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x18,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x01, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x18,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xa7,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x01,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x01,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x18,0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x19, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x01,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x01, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x18,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x1a,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x01,0x00,0x00,0x06,0x01, 0x23,0x01,0x32,0x00,0x00,0x00,0x08,0x00,0x31,0x07,0x00,0x29,0x04,0x00,0x00,0x00, 0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb6, 0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1b,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb6,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1c,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb6,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb6, 0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb6,0x00,0x00,0x00,0x06, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb6,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1e,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb6,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xaa,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb7, 0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb7,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb7,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb7, 0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb7,0x00,0x00,0x00,0x06, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb7,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x22,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb7,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb8, 0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb8,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x24,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb8,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb8, 0x00,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb8,0x00,0x00,0x00,0x06, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xb8,0x00,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb8,0x00,0x00,0x00,0x06,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xb2,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x28, 0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x28,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x29,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x28,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x28, 0x01,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb9,0x00,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x28,0x01,0x00,0x00,0x06, 0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x28,0x01,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x28,0x01,0x00,0x00,0x06,0x01,0x23,0x01,0x31, 0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x2a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xbb,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x13,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x14,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xc3, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xbb,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82, 0xa6,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82, 0x86,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81, 0x85,0x2e,0xa4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x69,0x02,0x00,0x00,0x60,0x81, 0x65,0x2e,0x84,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x69,0x02,0x00,0x00,0x60,0x81, 0xa5,0x2e,0x84,0x2e,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x02,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x40,0x04,0x00,0x00,0x60,0x86,0x45,0x2e,0x64,0x2e,0x00,0x05,0x20,0x00, 0x20,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x02,0x62,0x78,0x2e,0x11,0x00,0x61,0x06,0x00,0x80,0xa0,0x0a, 0x25,0x02,0xa4,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x25,0x2e,0x64,0x2e,0x00,0x05,0x40,0x00,0x40,0x00,0x31,0xa0,0x03,0x80,0x00,0x00, 0x05,0x26,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x05,0x02,0x62,0x40,0x2e,0x11,0x00,0x40,0x00,0x2e,0x68,0x7a,0x2e, 0x01,0x06,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x02,0x62,0x20,0x2e, 0x11,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x01,0x00,0x15,0x04,0x00, 0x04,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x16,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x02,0x62,0x00,0x2e, 0x11,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x05,0x0e,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04, 0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x26,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x28,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2a,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2c,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1e,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x20,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x22,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x24,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x18,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x1c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x16,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x18,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1a,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1c,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x0e,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x10,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x20,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x26,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x28,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x26,0x60,0x00,0x02,0x10,0x00,0x61,0x02,0x28,0x60,0x00,0x04, 0x10,0x00,0x61,0x21,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x22,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x24,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x22,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x24,0x60,0x00,0x04, 0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x23,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x2a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x2c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x1e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x20,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x0e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x10,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x2a,0x60,0x00,0x06,0x10,0x00,0x61,0x07,0x2c,0x60,0x00,0x08, 0x10,0x00,0x61,0x07,0x1e,0x60,0x00,0x0a,0x10,0x00,0x61,0x07,0x20,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x0e,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x10,0x60,0x00,0x04, 0x10,0x00,0x61,0x22,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x16,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x18,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x1a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x1c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x14,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x12,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x16,0x60,0x00,0x06,0x10,0x00,0x61,0x06,0x18,0x60,0x00,0x08, 0x10,0x00,0x61,0x06,0x1a,0x60,0x00,0x0a,0x10,0x00,0x61,0x06,0x1c,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x14,0x60,0x00,0x02,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x02,0x64,0x00,0x00, 0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x02,0x62,0x78,0x2e,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x02,0xa4,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x12,0x60,0x00,0x04, 0x10,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x26, 0x00,0x00,0x61,0x34,0x02,0x62,0x40,0x2e,0x11,0x00,0x69,0x00,0x00,0x00,0x60,0x86, 0x65,0x01,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x1e,0x00,0x00,0x61,0x35,0x02,0x62,0x20,0x2e, 0x11,0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0xc4,0x2e,0x64,0x01,0x05,0x01,0x84,0x2e, 0x08,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x16, 0x00,0x00,0x61,0x36,0x02,0x62,0x00,0x2e,0x11,0x00,0x31,0x97,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x0e,0x00,0x00,0x61,0x37,0x02,0x62,0x78,0x2e, 0x11,0x00,0x61,0x03,0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x26,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x38,0x02,0x62,0x40,0x2e,0x11,0x00,0x31,0x99,0x03,0x80,0x00,0x00, 0x05,0x1e,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x39,0x02,0x62,0x20,0x2e, 0x11,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x16,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x3a,0x02,0x62,0x00,0x2e,0x11,0x00,0x31,0x9b,0x03,0x80,0x00,0x00, 0x05,0x0e,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x28,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x26,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x28,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x26,0x05,0x02,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x28,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x06,0x24,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x08,0x24,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x29,0x03,0x00,0x90,0x09,0x07,0x0a,0x24,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0c,0x24,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x06,0x04,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x08,0x04,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0c,0x04,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x06,0x14,0x2a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x08,0x14,0x2c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0a,0x14,0x1e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0c,0x14,0x20,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x22,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x24,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2a,0x05,0x06,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2c,0x05,0x08,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1e,0x05,0x0a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x20,0x05,0x0c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x22,0x05,0x02,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x24,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x2a,0x03,0x00,0x90,0x09,0x07,0x06,0x24,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x08,0x24,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0a,0x24,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0c,0x24,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x2b,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x06,0x04,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x08,0x04,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x06,0x14,0x16,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x08,0x14,0x18,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0a,0x14,0x1a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0c,0x14,0x1c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x0e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x10,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x16,0x05,0x06,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x18,0x05,0x08,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1a,0x05,0x0a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1c,0x05,0x0c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x0e,0x05,0x02,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x10,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x14,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x12,0x20,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03, 0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x28,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x26,0x60,0x00,0x02, 0x10,0x00,0x61,0x02,0x28,0x60,0x00,0x04,0x10,0x00,0x61,0x29,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x06,0x14,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x08,0x14,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0a,0x14,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0c,0x14,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x22,0x60,0x00,0x02, 0x10,0x00,0x61,0x06,0x24,0x60,0x00,0x04,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x06,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0c,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2b,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x06,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x08,0x0c,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0a,0x0c,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0c,0x0c,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x2a,0x60,0x00,0x06, 0x10,0x00,0x61,0x07,0x2c,0x60,0x00,0x08,0x10,0x00,0x61,0x07,0x1e,0x60,0x00,0x0a, 0x10,0x00,0x61,0x07,0x20,0x60,0x00,0x0c,0x10,0x00,0x61,0x06,0x0e,0x60,0x00,0x02, 0x10,0x00,0x61,0x06,0x10,0x60,0x00,0x04,0x10,0x00,0x61,0x2a,0x04,0x00,0x00,0x00, 0x07,0x06,0x14,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x08,0x14,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0a,0x14,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0c,0x14,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x06,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x08,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x06,0x0c,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x08,0x0c,0x18,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0a,0x0c,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0c,0x0c,0x1c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x16,0x60,0x00,0x06, 0x10,0x00,0x61,0x06,0x18,0x60,0x00,0x08,0x10,0x00,0x61,0x06,0x1a,0x60,0x00,0x0a, 0x10,0x00,0x61,0x06,0x1c,0x60,0x00,0x0c,0x10,0x00,0x61,0x06,0x14,0x60,0x00,0x02, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80, 0x0a,0x02,0x61,0x00,0x02,0x64,0x00,0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x02,0x62,0x78,0x2e, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0xc4,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x12,0x60,0x00,0x04,0x10,0x00,0x31,0xac,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x26,0x00,0x00,0x61,0x3c,0x02,0x62,0x40,0x2e, 0x11,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x04,0x00, 0x04,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x1e, 0x00,0x00,0x61,0x3d,0x02,0x62,0x20,0x2e,0x11,0x00,0x5b,0x02,0x00,0x00,0x60,0x86, 0x84,0x01,0x64,0x01,0x05,0x01,0x84,0x2e,0x08,0x00,0x31,0xae,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x16,0x00,0x00,0x61,0x3e,0x02,0x62,0x00,0x2e, 0x11,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x0e, 0x00,0x00,0x61,0x3f,0x02,0x62,0x78,0x2e,0x11,0x00,0x61,0x03,0x00,0x80,0xa0,0x0a, 0x25,0x02,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x31,0xa0,0x03,0x80,0x00,0x00, 0x05,0x26,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x02,0x62,0x40,0x2e, 0x11,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x31,0x02,0x62,0x20,0x2e,0x11,0x00,0x31,0x92,0x03,0x80,0x00,0x00, 0x05,0x16,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x32,0x02,0x62,0x00,0x2e, 0x11,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x05,0x0e,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04, 0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x26,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x28,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2a,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2c,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1e,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x20,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x22,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x24,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x18,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x1c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x16,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x18,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1a,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1c,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x0e,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x10,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x20,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x33,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x06,0x14,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x28,0x60,0x00,0x04, 0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x21,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x26,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x2a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x24,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x26,0x60,0x00,0x02,0x10,0x00,0x61,0x07,0x2a,0x60,0x00,0x06, 0x10,0x00,0x61,0x06,0x24,0x60,0x00,0x04,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0c,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x04,0x00,0x00,0x00, 0x07,0x06,0x14,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x08,0x0c,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0a,0x0c,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0c,0x0c,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x06,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x06,0x0c,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x2c,0x60,0x00,0x08, 0x10,0x00,0x61,0x07,0x1e,0x60,0x00,0x0a,0x10,0x00,0x61,0x07,0x20,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x22,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x16,0x60,0x00,0x06, 0x10,0x00,0x61,0x06,0x10,0x60,0x00,0x04,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x08,0x14,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0a,0x14,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x0c,0x14,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x02,0x14,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x06,0x14,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x07,0x04,0x14,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x08,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x02,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x06,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x17,0x04,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x08,0x0c,0x18,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0a,0x0c,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x0c,0x0c,0x1c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x02,0x0c,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x06,0x0c,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x0e,0x04,0x0c,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x18,0x60,0x00,0x08, 0x10,0x00,0x61,0x06,0x1a,0x60,0x00,0x0a,0x10,0x00,0x61,0x06,0x1c,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x0e,0x60,0x00,0x02,0x10,0x00,0x61,0x00,0x02,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80, 0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x02,0x62,0x78,0x2e,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x02,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x12,0x60,0x00,0x06, 0x10,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x26, 0x00,0x00,0x61,0x34,0x02,0x62,0x40,0x2e,0x11,0x00,0x61,0x00,0x14,0x60,0x00,0x04, 0x10,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x1e, 0x00,0x00,0x61,0x35,0x02,0x62,0x20,0x2e,0x11,0x00,0x41,0x00,0x03,0x68,0x42,0x01, 0x81,0x01,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x16, 0x00,0x00,0x61,0x36,0x02,0x62,0x00,0x2e,0x11,0x00,0x5b,0x02,0x00,0x00,0x60,0x86, 0x44,0x01,0x04,0x03,0x05,0x01,0x84,0x2e,0x08,0x00,0x31,0xa7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x0e,0x00,0x00,0x61,0x37,0x02,0x62,0x78,0x2e, 0x11,0x00,0x61,0x02,0x00,0x80,0xa0,0x0a,0x25,0x02,0x44,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x26,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x38,0x02,0x62,0x40,0x2e,0x11,0x00,0x31,0x99,0x03,0x80,0x00,0x00, 0x05,0x1e,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x39,0x02,0x62,0x20,0x2e, 0x11,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x16,0x04,0x02,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x3a,0x02,0x62,0x00,0x2e,0x11,0x00,0x31,0x9b,0x03,0x80,0x00,0x00, 0x05,0x0e,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x28,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x26,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09, 0x05,0x28,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x29,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2a,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x2c,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1e,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x20,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x22,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x24,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x2a,0x03,0x00,0x90,0x09, 0x07,0x06,0x24,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x08,0x24,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0a,0x24,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x0c,0x24,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2b,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x06,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x08,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x06,0x14,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x08,0x14,0x18,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0a,0x14,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x0c,0x14,0x1c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x16,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x18,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1a,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x1c,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x0e,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09, 0x05,0x10,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x02,0x24,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x07,0x04,0x24,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x02,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09, 0x27,0x04,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x02,0x14,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09, 0x16,0x04,0x14,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x28,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x26,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x28,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x26,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x28,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x26,0x60,0x00,0x02,0x10,0x00,0x61,0x02,0x28,0x60,0x00,0x04, 0x10,0x00,0x61,0x29,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x22,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x24,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x22,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x24,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x22,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x24,0x60,0x00,0x04, 0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x2a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x2c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x1e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x20,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x2b,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x2a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x2c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x1e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x20,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x0e,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x10,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x0e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x10,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x2a,0x60,0x00,0x06,0x10,0x00,0x61,0x07,0x2c,0x60,0x00,0x08, 0x10,0x00,0x61,0x07,0x1e,0x60,0x00,0x0a,0x10,0x00,0x61,0x07,0x20,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x0e,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x10,0x60,0x00,0x04, 0x10,0x00,0x61,0x2a,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x16,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x1a,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x1c,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x14,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x12,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x16,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x18,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x1a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x1c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x14,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x12,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x16,0x60,0x00,0x06,0x10,0x00,0x61,0x06,0x18,0x60,0x00,0x08, 0x10,0x00,0x61,0x06,0x1a,0x60,0x00,0x0a,0x10,0x00,0x61,0x06,0x1c,0x60,0x00,0x0c, 0x10,0x00,0x61,0x06,0x14,0x60,0x00,0x02,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x02,0x64,0x00,0x00, 0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x02,0x62,0x78,0x2e,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x02,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x12,0x60,0x00,0x04, 0x10,0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x26, 0x00,0x00,0x61,0x3c,0x02,0x62,0x40,0x2e,0x11,0x00,0x61,0x00,0x7f,0x64,0x00,0x00, 0x10,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x1e, 0x00,0x00,0x61,0x3d,0x02,0x62,0x20,0x2e,0x11,0x00,0x31,0x9e,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x16,0x00,0x00,0x61,0x3e,0x02,0x62,0x00,0x2e, 0x11,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x44,0x0e, 0x00,0x00,0x31,0x03,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00, 0x00,0x00,0xf8,0x01,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70, 0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x73,0x77,0x61,0x70,0x5f,0x33,0x32,0x78,0x33, 0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f, 0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00, 0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68, 0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25, 0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72, 0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32, 0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33, 0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30, 0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00, 0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34, 0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30, 0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00, 0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34, 0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30, 0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00, 0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35, 0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30, 0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00, 0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36, 0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30, 0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00, 0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37, 0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30, 0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00, 0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38, 0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30, 0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00, 0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38, 0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30, 0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00, 0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39, 0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30, 0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00, 0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30, 0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30, 0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00, 0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31, 0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30, 0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00, 0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32, 0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30, 0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00, 0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32, 0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30, 0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00, 0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33, 0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30, 0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00, 0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34, 0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30, 0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00, 0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35, 0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30, 0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00, 0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36, 0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30, 0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00, 0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36, 0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30, 0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00, 0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37, 0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30, 0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00, 0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38, 0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30, 0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00, 0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39, 0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30, 0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00, 0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30, 0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30, 0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00, 0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30, 0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30, 0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00, 0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31, 0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30, 0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00, 0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32, 0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30, 0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00, 0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33, 0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30, 0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00, 0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34, 0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30, 0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00, 0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34, 0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30, 0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00, 0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35, 0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30, 0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00, 0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36, 0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30, 0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00, 0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37, 0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30, 0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00, 0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38, 0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30, 0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00, 0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38, 0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30, 0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00, 0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39, 0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30, 0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00, 0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30, 0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30, 0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00, 0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31, 0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30, 0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00, 0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32, 0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30, 0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00, 0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32, 0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30, 0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00, 0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33, 0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30, 0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00, 0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34, 0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30, 0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00, 0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35, 0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30, 0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00, 0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36, 0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30, 0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00, 0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36, 0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30, 0x33,0x37,0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33,0x00, 0x56,0x30,0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33,0x37, 0x36,0x00,0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30, 0x33,0x37,0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00, 0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38, 0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30, 0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00, 0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39, 0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30, 0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00, 0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30, 0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30, 0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00, 0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30, 0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30, 0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00, 0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31, 0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30, 0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00, 0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32, 0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30, 0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00, 0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33, 0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30, 0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00, 0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34, 0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30, 0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00, 0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34, 0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30, 0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00, 0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35, 0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30, 0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00, 0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36, 0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30, 0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00, 0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37, 0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30, 0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00, 0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38, 0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30, 0x34,0x38,0x33,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00, 0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37,0x00, 0x50,0x30,0x38,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f, 0x77,0x72,0x69,0x74,0x65,0x73,0x77,0x61,0x70,0x5f,0x33,0x32,0x78,0x33,0x32,0x5f, 0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42, 0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34, 0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37, 0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42, 0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00, 0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x31, 0x33,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e, 0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61, 0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x1a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x54, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x76,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x77,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x85,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x86,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x87,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x96,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x97,0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98, 0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00, 0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x54, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x54,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb5,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb7,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc6,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc7,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd6,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8, 0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00, 0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00, 0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00, 0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x54, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x54,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x54,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe5,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf5,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf7,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x07,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x15,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x16,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x17,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x01,0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01, 0x00,0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00, 0x00,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00, 0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x54, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x54,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x54,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x25,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x26,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01, 0x00,0x00,0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00, 0x00,0x51,0x20,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00, 0x20,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x51, 0x20,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x20,0x01, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x51,0x20,0x00, 0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x20,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x51,0x20,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x20,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x51,0x20,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x20,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x51,0x20,0x00,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x35,0x01,0x00,0x00,0x20,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x36,0x01,0x00,0x00,0x51,0x20,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x37,0x01,0x00,0x00,0x53,0x40,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x01,0x00,0x00,0x53,0x40,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01, 0x00,0x00,0x53,0x40,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00, 0x00,0x53,0x40,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00, 0x53,0x40,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x53, 0x40,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x53,0x40, 0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x53,0x20,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x53,0x40,0x00,0x65, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x53,0x20,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x54,0x40,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x54,0x40,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x54,0x40,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x54,0x40,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x45,0x01,0x00,0x00,0x54,0x40,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0x54,0x40,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x47,0x01,0x00,0x00,0x54,0x40,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x01,0x00,0x00,0x54,0x40,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01, 0x00,0x00,0x54,0x40,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00, 0x00,0x54,0x40,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00, 0x54,0x40,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x54, 0x40,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x54,0x40, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x54,0x40,0x00, 0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x54,0x80,0x00,0x65, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x51,0x10,0x00,0x63,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x51,0x10,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x20,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x55,0x01,0x00,0x00,0x20,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x56,0x01,0x00,0x00,0x20,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x57,0x01,0x00,0x00,0x20,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58, 0x01,0x00,0x00,0x51,0x20,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01, 0x00,0x00,0x20,0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00, 0x00,0x51,0x20,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00, 0x20,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x51, 0x20,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x20,0x01, 0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x51,0x20,0x00, 0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x20,0x01,0x00,0x79, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x51,0x20,0x00,0xa1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x51,0x20,0x00,0xa2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x51,0x20,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x01,0x00,0x00,0x53,0x40,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x66,0x01,0x00,0x00,0x53,0x40,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x67,0x01,0x00,0x00,0x53,0x40,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68, 0x01,0x00,0x00,0x53,0x40,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01, 0x00,0x00,0x53,0x40,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00, 0x00,0x53,0x40,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00, 0x53,0x40,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x53, 0x20,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x53,0x40, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x53,0x20,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x54,0x40,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x54,0x40,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x54,0x40,0x00,0x91,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x54,0x40,0x00,0x92,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x54,0x40,0x00,0x93,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x54,0x40,0x00,0x94,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x75,0x01,0x00,0x00,0x54,0x40,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x76,0x01,0x00,0x00,0x54,0x40,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x77,0x01,0x00,0x00,0x54,0x40,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, 0x01,0x00,0x00,0x54,0x40,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01, 0x00,0x00,0x54,0x40,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00, 0x00,0x54,0x40,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00, 0x54,0x40,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x54, 0x40,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x54,0x80, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x51,0x10,0x00, 0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x51,0x10,0x00,0xa5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x20,0x01,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x20,0x01,0x00,0xab,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x20,0x01,0x00,0xac,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x20,0x01,0x00,0xad,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x20,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x85,0x01,0x00,0x00,0x51,0x20,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x86,0x01,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x87,0x01,0x00,0x00,0x51,0x20,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x20,0x01,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01, 0x00,0x00,0x51,0x20,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00, 0x00,0x20,0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x51,0x20,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x20, 0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x51,0x20, 0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x20,0x01,0x00, 0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x51,0x20,0x00,0xe3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x20,0x01,0x00,0xbe,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x51,0x20,0x00,0xe4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x53,0x40,0x00,0xde,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x53,0x40,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x53,0x40,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x95,0x01,0x00,0x00,0x53,0x40,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x96,0x01,0x00,0x00,0x53,0x40,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x97,0x01,0x00,0x00,0x53,0x40,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98, 0x01,0x00,0x00,0x53,0x40,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01, 0x00,0x00,0x53,0x20,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00, 0x00,0x53,0x40,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00, 0x53,0x20,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x54, 0x40,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x54,0x40, 0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x54,0x40,0x00, 0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x54,0x40,0x00,0xd3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x54,0x40,0x00,0xd4,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x54,0x40,0x00,0xd5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x54,0x40,0x00,0xd6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x54,0x40,0x00,0xd7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x54,0x40,0x00,0xd8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa5,0x01,0x00,0x00,0x54,0x40,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa6,0x01,0x00,0x00,0x54,0x40,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa7,0x01,0x00,0x00,0x54,0x40,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0x01,0x00,0x00,0x54,0x40,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01, 0x00,0x00,0x54,0x40,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00, 0x00,0x54,0x80,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00, 0x51,0x10,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x51, 0x10,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x20,0x01, 0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x20,0x01,0x00, 0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x20,0x01,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x20,0x01,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x01,0x00,0xf2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x51,0x20,0x00,0x1e,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x51,0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb5,0x01,0x00,0x00,0x20,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb6,0x01,0x00,0x00,0x51,0x20,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb7,0x01,0x00,0x00,0x20,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8, 0x01,0x00,0x00,0x51,0x20,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01, 0x00,0x00,0x20,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00, 0x00,0x51,0x20,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00, 0x20,0x01,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x51, 0x20,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x20,0x01, 0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x51,0x20,0x00, 0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x53,0x40,0x00,0x1e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x53,0x40,0x00,0x1f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x53,0x40,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x53,0x40,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x53,0x40,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x53,0x40,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc5,0x01,0x00,0x00,0x53,0x40,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc6,0x01,0x00,0x00,0x53,0x20,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc7,0x01,0x00,0x00,0x53,0x40,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8, 0x01,0x00,0x00,0x53,0x20,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01, 0x00,0x00,0x54,0x40,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00, 0x00,0x54,0x40,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00, 0x54,0x40,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x54, 0x40,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x54,0x40, 0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x54,0x40,0x00, 0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x54,0x40,0x00,0x16, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x54,0x40,0x00,0x17,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x54,0x40,0x00,0x18,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x54,0x40,0x00,0x19,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x54,0x40,0x00,0x1a,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x54,0x40,0x00,0x1b,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd5,0x01,0x00,0x00,0x54,0x40,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd6,0x01,0x00,0x00,0x54,0x40,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd7,0x01,0x00,0x00,0x54,0x80,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8, 0x01,0x00,0x00,0x51,0x10,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01, 0x00,0x00,0x51,0x10,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00, 0x00,0x20,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00, 0x20,0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x20, 0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x20,0x01, 0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xde,0x01,0x00, 0x00,0x01,0x00,0x00,0xdf,0x01,0x00,0x00,0x01,0x00,0x00,0xe0,0x01,0x00,0x00,0x01, 0x00,0x00,0xe1,0x01,0x00,0x00,0x01,0x00,0x00,0xe2,0x01,0x00,0x00,0x01,0x00,0x00, 0xe3,0x01,0x00,0x00,0x01,0x00,0x00,0xe4,0x01,0x00,0x00,0x01,0x00,0x00,0xe5,0x01, 0x00,0x00,0x01,0x00,0x00,0x0d,0x00,0xe6,0x01,0x00,0x00,0x01,0x00,0xe7,0x01,0x00, 0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0xea, 0x01,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00, 0x00,0xed,0x01,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0xef,0x01,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0xf2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0xf3,0x01,0x00,0x00,0x01,0x00,0x00,0xf4,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20, 0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00, 0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22, 0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00, 0x00,0x24,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00, 0x04,0x00,0x00,0x26,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x6f,0x4b,0x00,0x00,0xba, 0x27,0x00,0x00,0x03,0x00,0xf5,0x01,0x00,0x00,0x17,0x67,0x65,0x6e,0x78,0x5f,0x63, 0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x31,0x30,0x2e,0x61,0x73, 0x6d,0xf6,0x01,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x80,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x01,0x80,0x03,0x00, 0x25,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x01,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x34,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x01,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x38,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3a, 0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x01,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x65,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00, 0x02,0x00,0x01,0x00,0x29,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x3d,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x3d,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x3d,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x3d,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x3d,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x3d,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x3e,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x43, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x3e,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x3e,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x3e,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x3e,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x3e,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x3e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x3f,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x3f,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x3f,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x3f,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x3f,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x3f,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x3f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x40,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x40,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x40,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x40,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x40,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x40,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x40,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x41,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x41,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x41,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x41,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x41,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x41,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x41,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x42,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x42,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x42,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x42,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x42,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x42,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x43,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x43,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x43,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x43,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x4c,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x43,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x43,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x43,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x45,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x45,0x01,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x45,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x45,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x44,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x45,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x45,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x02,0x00,0x31,0x01, 0x00,0x29,0x04,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x5c, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x48,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x5c,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x5c,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x5c,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x47,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5c,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x30,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x5d, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4a,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x5d,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x5d,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x5d,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x49,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5d,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x32,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x5e, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x5e,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x5e,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x5e,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x4b,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5e,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x34,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x5f, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x5f,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x5f,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x4d,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x5f,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x36,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x60, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x60,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x60,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x4f,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x60,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x61, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x52,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x61,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x51,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x61,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x3a,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x62, 0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x62,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x53,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x62,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x53,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x62,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x62,0x00,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x3c,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x55, 0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x55,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x55,0x01,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x55,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x55,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x55,0x01,0x00, 0x00,0x02,0x01,0x23,0x01,0x31,0x02,0x00,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x57,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x67,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x3a,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x68, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x3a,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x30,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x34,0x01, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x3a,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x58,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x67,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x5b, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x68,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x00,0x00,0x00,0x00,0x00, 0x31,0x03,0x00,0x24,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x03,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x03,0x80,0x06,0x00,0x25,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x5e,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x60,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x62,0x01,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x66,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x67,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x01,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x7e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x6a,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xa6, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x04,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x04,0x00, 0x29,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6b,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x6b,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x81,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6b,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x6b,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x6b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6b,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6b, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6c,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x6c,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x83,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6c,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x6c,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x83,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6c,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6c, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x6d,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x85,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x6d,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6d, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6e,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x6e,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x87,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6e,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x6e,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x87,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6e, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6f,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x6f,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x89,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6f,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x6f,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x89,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x6f,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6f,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6f, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x70,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x8b,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x70,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x70,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x70, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x71,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x71,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x8d,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x71,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x71,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8d,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x71,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x71,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x71, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x73,0x01, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x73,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x73,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x73,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x01,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x73,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x73,0x01,0x00,0x00, 0x02,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x05,0x00,0x31,0x04,0x00,0x29,0x04,0x00, 0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x9d,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x9d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x76,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9e,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x9e,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9e,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x9e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x78,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9e,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x60,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9f,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x9f,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9f,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x9f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x7a,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9f,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0xa0,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x7c,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0xa1,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xa1,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x7e,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa2,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0xa2,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7f,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa2,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xa2,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa2,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x68,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa3,0x00,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0xa3,0x00,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa3,0x00,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xa3,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x82,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa3,0x00,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6a,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x83,0x01,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x83,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x83,0x01,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xa5,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x83,0x01,0x00,0x00,0x02,0x01,0x23, 0x01,0x31,0x05,0x00,0x29,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xa7,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xa8,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x64,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x00,0x6a,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8, 0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xa9,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x64,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x00,0x6a,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa9, 0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x64,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x00,0x6a,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa, 0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x86,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xa7,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xa8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xac,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x88,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xa9,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xaa,0x00,0x00,0x00,0x00,0x00,0x31,0x06,0x00,0x24, 0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x05,0x00, 0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x05,0x80,0x09,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x8b,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8d, 0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8f,0x01,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xb9,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x91,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x93,0x01,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xbd, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbf,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x97,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xe7,0x00,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x02,0x06,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x06,0x00,0x07,0x00,0x29,0x03,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x98,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x98,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x98,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x98,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc3, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x98,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x99,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x99,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x99,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x99,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc5, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x99,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9a,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x9a,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9a,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x9a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc7, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9a,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9b,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x9b,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc8,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9b,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x9b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9b,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9c,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x9c,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xca,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9c,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x9c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9c,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x9d,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x9d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9e,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x9e,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9e,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x9e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf, 0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9e,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x01,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xa0,0x01,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9f,0x01,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x01,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa0,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xa1, 0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x01,0x00,0x00,0x02,0x01,0x23,0x01, 0x32,0x00,0x00,0x00,0x08,0x00,0x31,0x07,0x00,0x29,0x04,0x00,0x00,0x00,0xa2,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xde,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xde,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xde,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xde, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa3,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xde,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdf,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa5,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdf,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xdf, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa5,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xdf,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe0,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa7,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe0, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa7,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe0,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa8,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe1,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa9,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe1,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe1, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa9,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe1,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xaa,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe2,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe2,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe2, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe2,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xac,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe3,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe3,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xad,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe3,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe3, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xad,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe3,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xae,0x01, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe4,0x00,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xaf,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe4,0x00,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe4, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe4,0x00,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb0,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xb0,0x01,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xe6,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xb0,0x01,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb0, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe6,0x00,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xb0,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x31,0x08,0x00, 0x29,0x04,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x8d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe8,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe8, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x97,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x8d,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x93,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x97,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x8d,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xea,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x93,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xea, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x97,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x8d,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x93,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x97,0x01, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xe8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xec, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xb4,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xe9,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xb3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0xeb,0x00,0x00,0x00,0x00,0x00,0x31,0x09,0x00,0x10,0x00,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xf0, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf2,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x07,0x00,0x00,0xf2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x07,0x80,0x0c,0x00,0x25,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x01,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xf7,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0xbc,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf8,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xbe, 0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x01,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfd, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xfd,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0xc2,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x01,0x00, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x02,0x08,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00, 0x00,0x00,0x32,0x00,0x08,0x00,0x0a,0x00,0x29,0x03,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xc5,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc5,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc5,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc5,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xc5,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xc6,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc6,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc6,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc6,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xc6,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xc7,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc7,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x07, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc7,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc7,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xc7,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x07,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x08,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xc8,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc8,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc8,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc8,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xc8,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x09,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xc9,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc9,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0b, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc9,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc9,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xc9,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x0b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xca,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xca,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0d, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xca,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xca,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xca,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x0d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xcb,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xcb,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0f, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xcb,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcb,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xcb,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xcd,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xcd,0x01,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xce, 0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xcd,0x01,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcd,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xcd,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x32,0x00,0x00,0x00, 0x0b,0x00,0x31,0x0a,0x00,0x29,0x04,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x1e,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1e,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1e, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x1e,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1e,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x1e,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xb8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x11,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x1f,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1f,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1f, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd2,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x1f,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1f,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x1f,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x20,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x20,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x20,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x20,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x15,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x21,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x21,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x21,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x21,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x21,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x22, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x22,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x22,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x22,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x19,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x23,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x23,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x23, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xda,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x23,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x23,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x23,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x1b,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x24,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x24,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x24, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xdc,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x24,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x24,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x24,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x1d,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xdd,0x01,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdd,0x01,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdd, 0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x26,0x01,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xdd,0x01,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xdd,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xdd,0x01,0x00,0x00,0x02,0x01,0x23,0x01,0x31,0x0b,0x00,0x29,0x04,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0xdf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28, 0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0xbc,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29, 0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc0,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x29,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0xbc,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a, 0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc0,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2a,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0xbc,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b, 0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc0,0x01, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2b,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0x58, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x28,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x2a,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe3,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x01, 0x00,0x00,0x00,0x00,0x31,0x0c,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10, 0x82,0x26,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10, 0x82,0x46,0x3f,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10, 0x81,0x55,0x3f,0x24,0x02,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x00,0xa0, 0x4a,0xc5,0x3f,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60, 0x81,0x05,0x03,0x54,0x3f,0x00,0x05,0x03,0x00,0x03,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x25,0x3f,0x44,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x02,0x20,0x22,0x2e, 0x03,0x11,0x01,0x49,0x00,0x03,0xa8,0x2a,0x03,0x11,0x01,0x41,0x03,0x00,0x80,0x60, 0x06,0x01,0x20,0x24,0x3f,0x00,0x01,0x64,0x01,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x06,0xc4,0x3f,0x04,0x03,0x01,0x06,0xc4,0x3f,0x44,0x3f,0x49,0x00,0x00,0x00,0x60, 0x06,0x05,0x40,0x24,0x3f,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x00,0x00,0x60, 0x86,0xc5,0x3f,0xc4,0x3f,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x02,0x40,0xa8,0x0a, 0x40,0x11,0x01,0x40,0x02,0x00,0x00,0x60,0x06,0xc5,0x3f,0xc4,0x3f,0x00,0x06,0x84, 0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x04,0x3f,0xe4,0x01,0x05,0x01,0x44, 0x3f,0x80,0x00,0x70,0x02,0x00,0x00,0x60,0x06,0x01,0x00,0xc4,0x3f,0x00,0x56,0x04, 0x40,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86,0x84,0x3f,0x04,0x02,0x05,0x01,0x54, 0x3f,0x08,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x0b,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x03, 0x00,0x03,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00,0x00,0x20, 0x82,0x45,0x03,0xc4,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x40,0x00,0x00,0x00,0x60, 0x06,0x65,0x01,0xc4,0x3f,0x00,0x06,0x24,0x3f,0x00,0x00,0x40,0x05,0x00,0x00,0x60, 0x06,0x25,0x02,0xc4,0x3f,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x05,0x06,0xa8,0x6a, 0x3f,0x11,0x06,0x31,0xd0,0x04,0x80,0x00,0x00,0x05,0x1b,0x04,0x03,0x00,0xa0,0x00, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04, 0x00,0x04,0x00,0x69,0x30,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60, 0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x00,0x00,0x60, 0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x06,0x68,0x42, 0x01,0xc1,0x01,0x40,0x04,0x03,0xa8,0x6a,0x3f,0x11,0x03,0x40,0x04,0x00,0x00,0x60, 0x06,0x65,0x01,0xc4,0x3f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00,0x00,0x60, 0x06,0x25,0x02,0xc4,0x3f,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x04,0x00,0x00,0x60, 0x06,0xc5,0x3f,0xc4,0x3f,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0xf1,0x04,0x80,0x00, 0x00,0x05,0x2f,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf2,0x04,0x80,0x00, 0x00,0x05,0x2b,0x04,0x05,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x20, 0x82,0x45,0x08,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20, 0x82,0x45,0x03,0xc4,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01, 0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04, 0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20, 0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x43,0x04,0x80,0x00, 0x00,0x05,0x27,0x04,0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc4,0x04,0x80,0x00, 0x00,0x05,0x23,0x04,0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb5,0x04,0x80,0x00, 0x00,0x05,0x3b,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa6,0x04,0x80,0x00, 0x00,0x05,0x33,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x97,0x04,0x80,0x00, 0x00,0x05,0x37,0x04,0x05,0x00,0xa0,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0xc4,0x01,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x61,0x20,0x03,0x00,0x90, 0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x00,0x90, 0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90, 0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90, 0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01, 0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x18, 0x00,0x00,0x00,0x61,0x21,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x22,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x23,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x2f,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x31,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x2b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x2d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2f,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x31,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2b,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2d,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x24,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x26,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x27,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x33,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x35,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x37,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x39,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x33,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x35,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x37,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x39,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x25,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x3d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x3b,0x20,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x03,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x61,0x20,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x1b,0x60,0x00, 0x03,0x10,0x00,0x61,0x02,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x23,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x34,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x21,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x22,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00, 0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x27,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x2f,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x31,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x2b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x2d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x37,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x39,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x07,0x2f,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x31,0x60,0x00, 0x09,0x10,0x00,0x61,0x07,0x2b,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x2d,0x60,0x00, 0x0d,0x10,0x00,0x61,0x06,0x37,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x39,0x60,0x00, 0x05,0x10,0x00,0x61,0x24,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x26,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x25,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x25,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x33,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x35,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x3d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x3b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x23,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x25,0x60,0x00, 0x09,0x10,0x00,0x61,0x06,0x33,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x35,0x60,0x00, 0x0d,0x10,0x00,0x61,0x05,0x3b,0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x3d,0x60,0x00, 0x03,0x10,0x00,0x61,0x06,0x07,0x61,0x00,0x23,0x10,0x00,0x61,0x05,0x08,0x61,0x00, 0x33,0x10,0x00,0x61,0x00,0x09,0x61,0x00,0x37,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x05,0x61,0x00, 0x2b,0x10,0x00,0x61,0x00,0x06,0x61,0x00,0x27,0x10,0x00,0x61,0x07,0x0a,0x61,0x00, 0x3b,0x10,0x00,0x61,0x00,0x03,0x61,0x00,0x1b,0x10,0x00,0x61,0x00,0x04,0x61,0x00, 0x2f,0x10,0x00,0x61,0x00,0x23,0x64,0x00,0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x23,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x23,0x62,0x00, 0x3f,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x23,0x84,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x0b,0x61,0x00,0x1c,0x10,0x00,0x31,0xa8,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44,0x03,0x00,0x00,0x61,0x00,0x0c,0x61,0x00, 0x30,0x10,0x00,0x61,0x00,0x0d,0x61,0x00,0x2c,0x10,0x00,0x61,0x00,0x0e,0x61,0x00, 0x28,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x10,0x61,0x00, 0x34,0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x12,0x61,0x00, 0x3c,0x10,0x00,0x40,0x38,0x23,0x68,0x02,0x3f,0x01,0x02,0x61,0x00,0x13,0x61,0x00, 0x1d,0x10,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x0b,0x00,0x00,0x61,0x00,0x14,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x15,0x61,0x00, 0x2d,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x29,0x10,0x00,0x61,0x00,0x17,0x61,0x00, 0x25,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x19,0x61,0x00, 0x39,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x3d,0x10,0x00,0x40,0x39,0x23,0x68,0x02, 0x3f,0x01,0x04,0x61,0x00,0x1f,0x61,0x00,0x26,0x10,0x00,0x31,0xaa,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44,0x13,0x00,0x00,0x61,0x00,0x20,0x61,0x00, 0x36,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x22,0x61,0x00, 0x3e,0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x1e,0x10,0x00,0x61,0x00,0x1c,0x61,0x00, 0x32,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x2e,0x10,0x00,0x40,0x3a,0x23,0x68,0x02, 0x3f,0x01,0x06,0x61,0x00,0x1e,0x61,0x00,0x2a,0x10,0x00,0x31,0x9b,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44,0x1b,0x00,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x65,0x01,0xa4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0xa0, 0x4a,0x85,0x3f,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x86,0x44,0x02,0x64,0x01,0x05,0x01,0x54,0x3f,0x08,0x00,0x41,0x01,0x00,0x80,0x60, 0x06,0x01,0x20,0x44,0x02,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60, 0x06,0x05,0x03,0x44,0x02,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60, 0x06,0x65,0x3f,0x44,0x02,0x00,0x06,0x04,0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0x60, 0x06,0x84,0x3f,0x04,0x03,0x01,0x06,0x84,0x3f,0x44,0x3f,0x69,0x01,0x00,0x00,0x60, 0x86,0x85,0x3f,0x84,0x3f,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60, 0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x84,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60, 0x06,0x01,0x00,0x84,0x3f,0x00,0x56,0x04,0x40,0x00,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0b,0x00,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x06,0x68,0x42, 0x01,0xc1,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x3f,0x00,0x01,0x04, 0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00, 0x04,0x48,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x84,0x3f,0x00,0x06,0x24, 0x3f,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0x25,0x02,0x84,0x3f,0x00,0x06,0x24, 0x02,0x00,0x00,0x40,0x05,0x06,0xa8,0x5a,0x3f,0x11,0x06,0x01,0x3b,0x00,0xe8,0x01, 0x00,0x11,0x00,0x31,0xdc,0x04,0x80,0x00,0x00,0x05,0x1b,0x04,0x03,0x00,0xa0,0x00, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04, 0x00,0x04,0x00,0x69,0x3c,0x03,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60, 0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x41,0x00,0x00,0x00,0x60, 0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x06,0x68,0x42, 0x01,0xc1,0x01,0x40,0x04,0x03,0xa8,0x5a,0x3f,0x11,0x03,0x40,0x04,0x00,0x00,0x60, 0x06,0x65,0x01,0x84,0x3f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x04,0x00,0x00,0x60, 0x06,0x25,0x02,0x84,0x3f,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x04,0x00,0x00,0x60, 0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x04,0x06,0x00,0x00,0x31,0xfd,0x04,0x80,0x00, 0x00,0x05,0x2f,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xfe,0x04,0x80,0x00, 0x00,0x05,0x2b,0x04,0x05,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x20, 0x82,0x45,0x08,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20, 0x82,0x45,0x03,0x84,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01, 0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20, 0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01, 0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04, 0x00,0x04,0x00,0x31,0x4f,0x04,0x80,0x00,0x00,0x05,0x27,0x04,0x07,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x05,0x23,0x04,0x08,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x05,0x3b,0x04,0x03,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xa2,0x04,0x80,0x00,0x00,0x05,0x33,0x04,0x04,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00,0x05,0x37,0x04,0x05,0x00,0xa0,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x01,0x00,0x15,0x04, 0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x06, 0x00,0x00,0x00,0x61,0x2c,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x33,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x01, 0x80,0x00,0x00,0x61,0x2d,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2e,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2f,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x2f,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x31,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x2b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x2d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2f,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x31,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2b,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2d,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x20,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x22,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x23,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x33,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x35,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x37,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x39,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x33,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x35,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x37,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x39,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x21,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x3d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x3b,0x20,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98, 0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x06, 0x00,0x00,0x00,0x61,0x2c,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x33,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x1d,0x60,0x00, 0x05,0x10,0x00,0x61,0x2f,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00, 0x00,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x2d,0x04,0x00,0x00, 0x00,0x07,0x07,0x14,0x2f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x09,0x14,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2e,0x04,0x00,0x00, 0x00,0x07,0x0b,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x0d,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x27,0x60,0x00, 0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x07,0x04,0x2f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x09,0x04,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0b,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0d,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x37,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x07,0x0c,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x09,0x0c,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0b,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0d,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x37,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x37,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x2f,0x60,0x00, 0x07,0x10,0x00,0x61,0x07,0x31,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x2b,0x60,0x00, 0x0b,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x37,0x60,0x00, 0x03,0x10,0x00,0x61,0x06,0x39,0x60,0x00,0x05,0x10,0x00,0x61,0x20,0x04,0x00,0x00, 0x00,0x07,0x07,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x09,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x04,0x00,0x00, 0x00,0x07,0x0b,0x14,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x0d,0x14,0x35,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x3d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x09,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0b,0x04,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0d,0x04,0x35,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x3d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x07,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x09,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0b,0x0c,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0d,0x0c,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x3d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x3b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x23,0x60,0x00, 0x07,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x33,0x60,0x00, 0x0b,0x10,0x00,0x61,0x06,0x35,0x60,0x00,0x0d,0x10,0x00,0x61,0x05,0x3b,0x60,0x00, 0x05,0x10,0x00,0x61,0x07,0x3d,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x07,0x61,0x00, 0x23,0x10,0x00,0x61,0x05,0x08,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x09,0x61,0x00, 0x37,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x05,0x61,0x00,0x2b,0x10,0x00,0x61,0x00,0x06,0x61,0x00, 0x27,0x10,0x00,0x61,0x07,0x0a,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x03,0x61,0x00, 0x1b,0x10,0x00,0x61,0x00,0x04,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x23,0x64,0x00, 0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x23,0x00,0x00,0x00,0x00,0x1f, 0x00,0x07,0x00,0x61,0x00,0x23,0x62,0x00,0x3f,0x11,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x23,0x64,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0b,0x61,0x00, 0x1c,0x10,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x03,0x00,0x00,0x61,0x00,0x0c,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x0d,0x61,0x00, 0x2c,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x28,0x10,0x00,0x61,0x00,0x0f,0x61,0x00, 0x24,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x11,0x61,0x00, 0x38,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x3c,0x10,0x00,0x40,0x34,0x23,0x68,0x02, 0x3f,0x01,0x02,0x61,0x00,0x13,0x61,0x00,0x1d,0x10,0x00,0x31,0xa5,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44,0x0b,0x00,0x00,0x61,0x00,0x14,0x61,0x00, 0x31,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x2d,0x10,0x00,0x61,0x00,0x16,0x61,0x00, 0x29,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x25,0x10,0x00,0x61,0x00,0x18,0x61,0x00, 0x35,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x1a,0x61,0x00, 0x3d,0x10,0x00,0x40,0x35,0x23,0x68,0x02,0x3f,0x01,0x04,0x61,0x00,0x1f,0x61,0x00, 0x26,0x10,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x13,0x00,0x00,0x61,0x00,0x20,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x21,0x61,0x00, 0x3a,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x1b,0x61,0x00, 0x1e,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1d,0x61,0x00, 0x2e,0x10,0x00,0x40,0x36,0x23,0x68,0x02,0x3f,0x01,0x06,0x61,0x00,0x1e,0x61,0x00, 0x2a,0x10,0x00,0x31,0x97,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x1b,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xa4,0x01,0x00,0x05,0x04, 0x00,0x04,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x3f,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x44,0x02,0x64,0x01,0x05,0x01,0x54, 0x3f,0x08,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x02,0x00,0x01,0x44, 0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x44,0x02,0x00,0x06,0x44, 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x3f,0x44,0x02,0x00,0x06,0x04, 0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x06,0x84,0x3f,0x04,0x03,0x01,0x06,0x84, 0x3f,0x44,0x3f,0x69,0x01,0x00,0x00,0x60,0x86,0x85,0x3f,0x84,0x3f,0x00,0x05,0x02, 0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x84, 0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x84,0x3f,0x00,0x56,0x04, 0x40,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60, 0x0b,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x03, 0x00,0x03,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00,0x68,0x00,0x00,0x00,0x20, 0x82,0x45,0x03,0x84,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x40,0x00,0x00,0x00,0x60, 0x06,0x65,0x01,0x84,0x3f,0x00,0x06,0x24,0x3f,0x00,0x00,0x40,0x05,0x00,0x00,0x60, 0x06,0x25,0x02,0x84,0x3f,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x05,0x06,0xa8,0x5a, 0x3f,0x11,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x08,0x00,0x00,0x31,0xd8,0x04,0x80,0x00, 0x00,0x05,0x1b,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20, 0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20, 0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20, 0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x03,0x68,0x42, 0x01,0x41,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x14, 0x00,0x14,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x01,0x00,0x05,0x18, 0x00,0x18,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x01,0x40,0x04,0x03,0xa8,0x5a, 0x3f,0x11,0x03,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x01,0x84,0x3f,0x00,0x06,0x64, 0x01,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x25,0x02,0x84,0x3f,0x00,0x06,0x24, 0x02,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x04, 0x06,0x00,0x00,0x31,0xf9,0x04,0x80,0x00,0x00,0x05,0x2f,0x04,0x04,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xfa,0x04,0x80,0x00,0x00,0x05,0x2b,0x04,0x05,0x00,0xa0,0x00, 0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x03,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x3f,0x00,0x01,0x04, 0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01, 0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04, 0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01, 0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x02,0x00,0x01,0x04, 0x00,0x04,0x00,0x31,0x4c,0x04,0x80,0x00,0x00,0x05,0x27,0x04,0x07,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x05,0x23,0x04,0x08,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x05,0x3b,0x04,0x03,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x05,0x33,0x04,0x04,0x00,0xa0,0x00, 0x00,0x00,0x00,0x31,0x90,0x04,0x80,0x00,0x00,0x05,0x37,0x04,0x05,0x00,0xa0,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x01,0x00,0x15,0x04, 0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00, 0xc0,0x00,0x00,0x61,0x28,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x30,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00, 0x30,0x00,0x00,0x61,0x29,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2a,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2c,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x2f,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x31,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x2b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x2d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x2f,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x31,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x2b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x2d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2f,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x31,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2b,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2d,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x2d,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2f,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x20,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x33,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x35,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x37,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x39,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x33,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x35,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x37,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x39,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x33,0x05,0x0b,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x35,0x05,0x0d,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x37,0x05,0x03,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x39,0x05,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x2e,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x3d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x3b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x3d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x3b,0x20,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98, 0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00, 0xc0,0x00,0x00,0x61,0x28,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x30,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x1d,0x60,0x00, 0x05,0x10,0x00,0x61,0x2c,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00, 0x00,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x29,0x04,0x00,0x00, 0x00,0x07,0x07,0x14,0x2f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x09,0x14,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2a,0x04,0x00,0x00, 0x00,0x07,0x0b,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x0d,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x27,0x60,0x00, 0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x07,0x04,0x2f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x09,0x04,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0b,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0d,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x37,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x07,0x0c,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x09,0x0c,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0b,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0d,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x37,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x37,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x2f,0x60,0x00, 0x07,0x10,0x00,0x61,0x07,0x31,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x2b,0x60,0x00, 0x0b,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x37,0x60,0x00, 0x03,0x10,0x00,0x61,0x06,0x39,0x60,0x00,0x05,0x10,0x00,0x61,0x2d,0x04,0x00,0x00, 0x00,0x07,0x07,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x09,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2f,0x04,0x00,0x00, 0x00,0x07,0x0b,0x14,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x0d,0x14,0x35,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2e,0x04,0x00,0x00, 0x00,0x07,0x03,0x14,0x3d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x07,0x05,0x14,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x09,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0b,0x04,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x0d,0x04,0x35,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x03,0x04,0x3d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00, 0x00,0x17,0x05,0x04,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x07,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x09,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0b,0x0c,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x0d,0x0c,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x03,0x0c,0x3d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00, 0x00,0x0e,0x05,0x0c,0x3b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x23,0x60,0x00, 0x07,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x33,0x60,0x00, 0x0b,0x10,0x00,0x61,0x06,0x35,0x60,0x00,0x0d,0x10,0x00,0x61,0x05,0x3b,0x60,0x00, 0x05,0x10,0x00,0x61,0x07,0x3d,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x07,0x61,0x00, 0x23,0x10,0x00,0x61,0x05,0x08,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x09,0x61,0x00, 0x37,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x05,0x61,0x00,0x2b,0x10,0x00,0x61,0x00,0x06,0x61,0x00, 0x27,0x10,0x00,0x61,0x07,0x0a,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x03,0x61,0x00, 0x1b,0x10,0x00,0x61,0x00,0x04,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x23,0x64,0x00, 0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x23,0x00,0x00,0x00,0x00,0x1f, 0x00,0x07,0x00,0x61,0x00,0x23,0x62,0x00,0x3f,0x11,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x23,0x64,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0b,0x61,0x00, 0x1c,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x03,0x00,0x00,0x61,0x00,0x0c,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x0d,0x61,0x00, 0x2c,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x28,0x10,0x00,0x61,0x00,0x0f,0x61,0x00, 0x24,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x11,0x61,0x00, 0x38,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x3c,0x10,0x00,0x40,0x31,0x23,0x68,0x02, 0x3f,0x01,0x02,0x61,0x00,0x13,0x61,0x00,0x1d,0x10,0x00,0x31,0xa2,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44,0x0b,0x00,0x00,0x61,0x00,0x14,0x61,0x00, 0x31,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x2d,0x10,0x00,0x61,0x00,0x16,0x61,0x00, 0x29,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x25,0x10,0x00,0x61,0x00,0x18,0x61,0x00, 0x35,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x1a,0x61,0x00, 0x3d,0x10,0x00,0x40,0x32,0x23,0x68,0x02,0x3f,0x01,0x04,0x61,0x00,0x1f,0x61,0x00, 0x26,0x10,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x13,0x00,0x00,0x61,0x00,0x20,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x21,0x61,0x00, 0x3a,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x1b,0x61,0x00, 0x1e,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1d,0x61,0x00, 0x2e,0x10,0x00,0x40,0x33,0x23,0x68,0x02,0x3f,0x01,0x06,0x61,0x00,0x1e,0x61,0x00, 0x2a,0x10,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x23,0x00,0xc0,0x44, 0x1b,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0xa4,0x01,0x00,0x05,0x18, 0x00,0x18,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x3f,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x86,0x04,0x03,0x24,0x02,0x05,0x01,0x54, 0x3f,0x08,0x00,0x41,0x01,0x20,0x22,0x2e,0x03,0x11,0x01,0x49,0x00,0x04,0xa8,0x2a, 0x03,0x11,0x01,0x5b,0x01,0x00,0x00,0x60,0x06,0x84,0x3f,0x04,0x04,0x01,0x06,0x84, 0x3f,0x44,0x3f,0x40,0x00,0x3f,0xa8,0x3a,0x03,0x11,0x02,0x69,0x02,0x00,0x00,0x60, 0x86,0x85,0x3f,0x84,0x3f,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x60, 0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x84,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x60, 0x06,0x01,0x00,0x84,0x3f,0x00,0x56,0x04,0x40,0x00,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x69,0x00,0x04,0x68,0x42, 0x01,0x31,0x00,0x41,0x00,0x06,0x68,0x42,0x01,0xc1,0x00,0x40,0x00,0x00,0x00,0x60, 0x06,0x25,0x3f,0x84,0x3f,0x00,0x06,0x24,0x3f,0x00,0x00,0x40,0x03,0x04,0xa8,0x5a, 0x3f,0x11,0x04,0x40,0x03,0x06,0xa8,0x5a,0x3f,0x11,0x06,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x04,0x00,0x00,0x20, 0x82,0x45,0x03,0x24,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20, 0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20, 0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb5,0x04,0x80,0x00, 0x00,0x05,0x2a,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa6,0x04,0x80,0x00, 0x00,0x05,0x26,0x04,0x05,0x00,0xa0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x90,0x08,0x00,0x00,0x31,0x98,0x04,0x80,0x00, 0x00,0x05,0x22,0x04,0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x69,0x00,0x01,0x68,0x42, 0x01,0x41,0x00,0x41,0x35,0x03,0x68,0x42,0x01,0x41,0x01,0x41,0x36,0x05,0x68,0x42, 0x01,0x81,0x01,0x41,0x38,0x07,0x68,0x42,0x01,0xc1,0x01,0x68,0x00,0x00,0x00,0x20, 0x82,0x45,0x02,0x84,0x3f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x05,0x01,0xa8,0x5a, 0x3f,0x11,0x01,0x40,0x05,0x03,0xa8,0x5a,0x3f,0x11,0x03,0x40,0x05,0x05,0xa8,0x5a, 0x3f,0x11,0x05,0x40,0x05,0x00,0x00,0x60,0x06,0x85,0x3f,0x84,0x3f,0x00,0x06,0x04, 0x07,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x05,0x1a,0x04,0x02,0x00,0xa0,0x00, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04, 0x00,0x04,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x08,0x84,0x3f,0x00,0x01,0x04, 0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20, 0x82,0x45,0x02,0x04,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xca,0x04,0x80,0x00, 0x00,0x05,0x32,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xbc,0x04,0x80,0x00, 0x00,0x05,0x2e,0x04,0x06,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xad,0x04,0x80,0x00, 0x00,0x05,0x3a,0x04,0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00, 0x00,0x05,0x36,0x04,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0xc4,0x01,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x29,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x1a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x3a,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x1c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x1a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x1c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x1a,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x1c,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1a,0x05,0x02,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1c,0x05,0x04,0x46,0x00,0x00, 0x00,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x25,0x03,0x00,0x90, 0x09,0x07,0x06,0x24,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x3d,0x03,0x00,0x90, 0x09,0x07,0x08,0x24,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x26,0x03,0x00,0x90, 0x09,0x07,0x0a,0x24,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x0c,0x24,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x28,0x03,0x00,0x90, 0x09,0x07,0x02,0x24,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x04,0x24,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x06,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x08,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x0a,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x0c,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x02,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x04,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x06,0x14,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x08,0x14,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x0a,0x14,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x0c,0x14,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x02,0x14,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x04,0x14,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x2a,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x2c,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x26,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x28,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x22,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x24,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x2e,0x03,0x00,0x90, 0x09,0x07,0x06,0x24,0x36,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x08,0x24,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2a,0x03,0x00,0x90, 0x09,0x07,0x0a,0x24,0x32,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x0c,0x24,0x34,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x03,0x00,0x90, 0x09,0x07,0x02,0x24,0x2e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x04,0x24,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x06,0x04,0x36,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x08,0x04,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x0a,0x04,0x32,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x0c,0x04,0x34,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x02,0x04,0x2e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x04,0x04,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x06,0x14,0x36,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x08,0x14,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x0a,0x14,0x32,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x0c,0x14,0x34,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x02,0x14,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x04,0x14,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x36,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x38,0x05,0x08,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x32,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x34,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x2e,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90, 0x09,0x05,0x30,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x2d,0x03,0x00,0x90, 0x09,0x07,0x02,0x24,0x3c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x07,0x04,0x24,0x3a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x02,0x04,0x3c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90, 0x09,0x27,0x04,0x04,0x3a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x02,0x14,0x3c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90, 0x09,0x16,0x04,0x14,0x3a,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x29,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x1a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x3a,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x1c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x1a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x1c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x1a,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x1c,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x1a,0x60,0x00,0x02,0x10,0x00,0x61,0x02,0x1c,0x60,0x00, 0x04,0x10,0x00,0x61,0x28,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x22,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x24,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x22,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x24,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x22,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x24,0x20,0x00,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x25,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x2a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x3d,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x2c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x26,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x26,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x28,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x22,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x24,0x60,0x00, 0x04,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x2a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x2c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x26,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x28,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2c,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x2e,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x30,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x2a,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x2c,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x26,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x28,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x2e,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x30,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x2e,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x30,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x07,0x2a,0x60,0x00,0x06,0x10,0x00,0x61,0x07,0x2c,0x60,0x00, 0x08,0x10,0x00,0x61,0x07,0x26,0x60,0x00,0x0a,0x10,0x00,0x61,0x07,0x28,0x60,0x00, 0x0c,0x10,0x00,0x61,0x06,0x2e,0x60,0x00,0x02,0x10,0x00,0x61,0x06,0x30,0x60,0x00, 0x04,0x10,0x00,0x61,0x2e,0x04,0x00,0x00,0x00,0x07,0x06,0x14,0x36,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x08,0x14,0x38,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2a,0x04,0x00,0x00,0x00,0x07,0x0a,0x14,0x32,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0c,0x14,0x34,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x2d,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x3c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x3a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x06,0x04,0x36,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x08,0x04,0x38,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0a,0x04,0x32,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0c,0x04,0x34,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x3c,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x3a,0x30,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x06,0x0c,0x36,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x08,0x0c,0x38,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0a,0x0c,0x32,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0c,0x0c,0x34,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x3c,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x3a,0x20,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x36,0x60,0x00,0x06,0x10,0x00,0x61,0x06,0x38,0x60,0x00, 0x08,0x10,0x00,0x61,0x06,0x32,0x60,0x00,0x0a,0x10,0x00,0x61,0x06,0x34,0x60,0x00, 0x0c,0x10,0x00,0x61,0x05,0x3a,0x60,0x00,0x04,0x10,0x00,0x61,0x07,0x3c,0x60,0x00, 0x02,0x10,0x00,0x61,0x06,0x06,0x61,0x00,0x36,0x10,0x00,0x61,0x05,0x07,0x61,0x00, 0x32,0x10,0x00,0x61,0x00,0x08,0x61,0x00,0x2e,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x04,0x61,0x00, 0x26,0x10,0x00,0x61,0x00,0x05,0x61,0x00,0x22,0x10,0x00,0x61,0x07,0x09,0x61,0x00, 0x3a,0x10,0x00,0x61,0x00,0x02,0x61,0x00,0x1a,0x10,0x00,0x61,0x00,0x03,0x61,0x00, 0x2a,0x10,0x00,0x61,0x00,0x22,0x64,0x00,0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x22,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x22,0x62,0x00, 0x3f,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x22,0x44,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x0a,0x61,0x00,0x1b,0x10,0x00,0x31,0xaf,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x22,0x00,0xc0,0x44,0x02,0x00,0x00,0x61,0x00,0x0b,0x61,0x00, 0x2b,0x10,0x00,0x61,0x00,0x0c,0x61,0x00,0x27,0x10,0x00,0x61,0x00,0x0d,0x61,0x00, 0x23,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x0f,0x61,0x00, 0x33,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x11,0x61,0x00, 0x3b,0x10,0x00,0x40,0x3f,0x22,0x68,0x02,0x3f,0x01,0x02,0x61,0x00,0x12,0x61,0x00, 0x1c,0x10,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x22,0x00,0xc0,0x44, 0x0a,0x00,0x00,0x61,0x00,0x13,0x61,0x00,0x2c,0x10,0x00,0x61,0x00,0x14,0x61,0x00, 0x28,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x16,0x61,0x00, 0x38,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x18,0x61,0x00, 0x30,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x3c,0x10,0x00,0x40,0x30,0x22,0x68,0x02, 0x3f,0x01,0x04,0x61,0x00,0x1e,0x61,0x00,0x39,0x10,0x00,0x31,0xa1,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x22,0x00,0xc0,0x44,0x12,0x00,0x00,0x61,0x00,0x1f,0x61,0x00, 0x35,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x21,0x61,0x00, 0x3d,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x1d,0x10,0x00,0x61,0x00,0x1b,0x61,0x00, 0x2d,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x29,0x10,0x00,0x40,0x31,0x22,0x68,0x02, 0x3f,0x01,0x06,0x61,0x00,0x1d,0x61,0x00,0x25,0x10,0x00,0x31,0x92,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x22,0x00,0xc0,0x44,0x1a,0x00,0x00,0x61,0x00,0x7f,0x64,0x00, 0x00,0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00, 0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f, 0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x33,0x32,0x78,0x33,0x32,0x00,0x25, 0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25, 0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79, 0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73, 0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76, 0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69, 0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30, 0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30, 0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00, 0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56, 0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35, 0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30, 0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56, 0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33, 0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30, 0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56, 0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31, 0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30, 0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56, 0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39, 0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30, 0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56, 0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37, 0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30, 0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56, 0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35, 0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30, 0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56, 0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33, 0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30, 0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56, 0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31, 0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30, 0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56, 0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39, 0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31, 0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56, 0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37, 0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31, 0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56, 0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35, 0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31, 0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56, 0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33, 0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31, 0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56, 0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31, 0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31, 0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56, 0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39, 0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31, 0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56, 0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37, 0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31, 0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56, 0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35, 0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31, 0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56, 0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33, 0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31, 0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56, 0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31, 0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31, 0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56, 0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39, 0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31, 0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56, 0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37, 0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31, 0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56, 0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35, 0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31, 0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56, 0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30,0x33, 0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30,0x32, 0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x56, 0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31,0x31, 0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30,0x32, 0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x56, 0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39, 0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32, 0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56, 0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x50,0x30,0x31,0x00,0x50, 0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x73,0x75,0x72,0x66,0x61, 0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x33,0x32,0x78, 0x33,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32, 0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42, 0x42,0x5f,0x34,0x5f,0x35,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00, 0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65, 0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x20, 0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x20,0x01, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x20,0x01,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x20,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x20,0x01,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x20,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x20,0x01,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0x20,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x00,0x00,0x00,0x20,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x00,0x00,0x00,0x20,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x20,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x20,0x01,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00, 0x20,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x20, 0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x20,0x01, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x20,0x01,0x00, 0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x20,0x01,0x00,0x52, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x20,0x01,0x00,0x6e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x20,0x01,0x00,0x6f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x20,0x01,0x00,0x70,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x20,0x01,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x20,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x20,0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x00,0x00,0x00,0x20,0x01,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x00,0x00,0x00,0x20,0x01,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00, 0x00,0x00,0x20,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x20,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00, 0x20,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x20, 0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x20,0x01, 0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x20,0x01,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x20,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x20,0x01,0x00,0x9d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x20,0x01,0x00,0xa0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x20,0x01,0x00,0xa3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x20,0x01,0x00,0xa6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x20,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x00,0x00,0x00,0x20,0x01,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x00,0x00,0x00,0x20,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x00,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x00,0x00,0x00,0x20,0x01,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x00,0xde,0x00,0x00,0x00,0x01,0x00,0x00, 0xdf,0x00,0x00,0x00,0x01,0x00,0x00,0xe0,0x00,0x00,0x00,0x01,0x00,0x00,0x05,0x00, 0xe1,0x00,0x00,0x00,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0xe6,0x00,0x00,0x00,0x01,0x00,0x00,0xe7,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00, 0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21, 0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00, 0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x38,0x00, 0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x83,0x1f,0x00,0x00,0xf9, 0x11,0x00,0x00,0x03,0x00,0xe8,0x00,0x00,0x00,0x17,0x67,0x65,0x6e,0x78,0x5f,0x63, 0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x31,0x31,0x2e,0x61,0x73, 0x6d,0xe9,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x80,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x01,0x80,0x01,0x00, 0x25,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x00,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x40, 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x43,0x00,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x34,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08,0x00, 0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00,0x07, 0x00,0x20,0x08,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xc1,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a, 0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x02,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x02,0x80,0x02, 0x00,0x25,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00, 0x06,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x59,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x5a,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35, 0x03,0x00,0x06,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x63,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00, 0x06,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x68,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x69,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x6b,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x00,0x69,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x6c,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6c,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x00,0x69,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x07,0x00,0x00, 0x02,0x00,0x69,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x6a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xca,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x6b,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38,0x00, 0x07,0x00,0x20,0x08,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc9,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x6c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xcc, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x6d,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x03,0x00,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x03,0x80, 0x03,0x00,0x25,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xcd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x7c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x7d,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x35,0x03,0x00,0x06,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x80,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x82, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03, 0x00,0x06,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x89,0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x8b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x8c,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00, 0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x89,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x83,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x89,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x83,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x89,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x90,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x83,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x89,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x07,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00,0x20, 0x08,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd4,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x8d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xd5,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8e,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x38, 0x00,0x07,0x00,0x20,0x08,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd4, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8f,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00, 0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x90,0x00,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x04,0x00,0x00,0x97,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x04, 0x80,0x04,0x00,0x25,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35, 0x03,0x00,0x06,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00, 0x06,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0x9e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x9f,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa0, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa0,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x35,0x03,0x00,0x06,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xa2,0x00, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00, 0xa4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xa5,0x00,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xa7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xa8,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35, 0x03,0x00,0x06,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xab,0x00,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x00,0xad,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0xae,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00, 0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xab,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xab,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xab,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x9c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x9f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xab,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x38,0x00,0x07,0x00, 0x20,0x08,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0xaf,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xb0,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x38,0x00,0x07,0x00,0x20,0x08,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xdf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x20,0x08, 0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0xb2,0x00,0x00,0x00,0x00,0x00,0x31,0x04,0x00,0x34,0x00,0x00,0x00,0x68, 0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65, 0x00,0x00,0x80,0x10,0x82,0x06,0x52,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65, 0x02,0x52,0x62,0xb5,0x02,0xf1,0xff,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x52,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x81,0x05,0x03,0x14, 0x52,0x00,0x05,0x03,0x00,0x03,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x52,0x44, 0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x41,0x02,0x20,0x22,0x2e,0x03,0x11,0x01,0x49, 0x00,0x03,0xa8,0x2a,0x03,0x11,0x01,0x41,0x03,0x00,0x80,0x60,0x06,0x01,0x20,0x24, 0x52,0x00,0x01,0x64,0x01,0x00,0x00,0x5b,0x02,0x00,0x00,0x60,0x06,0x44,0x52,0x04, 0x03,0x01,0x06,0x44,0x52,0x04,0x52,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x53,0x24, 0x52,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x86,0x45,0x52,0x44, 0x52,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x02,0x53,0xa8,0x0a,0x53,0x11,0x01,0x40, 0x02,0x00,0x00,0x60,0x06,0x45,0x52,0x44,0x52,0x00,0x06,0x84,0x01,0x00,0x00,0x5b, 0x00,0x00,0x00,0x60,0x86,0x84,0x52,0xc4,0x01,0x05,0x01,0x04,0x52,0x80,0x00,0x70, 0x02,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x52,0x00,0x56,0x04,0x53,0x00,0x00,0x5b, 0x00,0x00,0x00,0x60,0x86,0xc4,0x52,0xe4,0x01,0x05,0x01,0x14,0x52,0x08,0x00,0x20, 0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x69, 0x00,0x0d,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x13,0x68,0x42,0x01,0xc1,0x00,0x69, 0x00,0x19,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x1f,0x68,0x42,0x01,0x41,0x01,0x41, 0x00,0x25,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2b,0x68,0x42,0x01,0xc1,0x01,0x68, 0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x52,0x00,0x01,0x04,0x00,0x04,0x00,0x40, 0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x44,0x52,0x00,0x06,0x24,0x52,0x00,0x00,0x40, 0x07,0x0d,0xa8,0x42,0x52,0x11,0x0d,0x40,0x07,0x13,0xa8,0x42,0x52,0x11,0x13,0x40, 0x07,0x19,0xa8,0x42,0x52,0x11,0x19,0x40,0x07,0x1f,0xa8,0x42,0x52,0x11,0x1f,0x40, 0x07,0x25,0xa8,0x42,0x52,0x11,0x25,0x40,0x07,0x00,0x00,0x60,0x06,0x45,0x52,0x44, 0x52,0x00,0x06,0x04,0x2b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04, 0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04, 0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0e,0x04, 0x0d,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x14,0x04, 0x13,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x1a,0x04, 0x19,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x20,0x04, 0x1f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x26,0x04, 0x25,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x2c,0x44, 0x52,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x40,0x04,0x80,0x00,0x00,0x05,0x03,0x04, 0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf1,0x04,0x80,0x00,0x00,0x05,0x09,0x04, 0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xe2,0x04,0x80,0x00,0x00,0x05,0x0f,0x04, 0x0e,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x05,0x15,0x04, 0x14,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x05,0x1b,0x04, 0x1a,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x05,0x21,0x04, 0x20,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x05,0x27,0x04, 0x26,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x97,0x04,0x80,0x00,0x00,0x05,0x2d,0x04, 0x2c,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x51,0x64,0x00,0x00,0x10,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61, 0x00,0x00,0x80,0xa0,0x4a,0x45,0x51,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61, 0x00,0x51,0x62,0x58,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x51,0xc4, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x31,0x61,0x00,0x03,0x10,0x00,0x61, 0x00,0x39,0x61,0x00,0x04,0x10,0x00,0x61,0x21,0x32,0x61,0x00,0x09,0x10,0x00,0x61, 0x00,0x3a,0x61,0x00,0x0a,0x10,0x00,0x61,0x22,0x33,0x61,0x00,0x0f,0x10,0x00,0x61, 0x00,0x3b,0x61,0x00,0x10,0x10,0x00,0x61,0x23,0x34,0x61,0x00,0x15,0x10,0x00,0x61, 0x00,0x3c,0x61,0x00,0x16,0x10,0x00,0x61,0x24,0x35,0x61,0x00,0x1b,0x10,0x00,0x61, 0x00,0x3d,0x61,0x00,0x1c,0x10,0x00,0x61,0x25,0x36,0x61,0x00,0x21,0x10,0x00,0x61, 0x00,0x3e,0x61,0x00,0x22,0x10,0x00,0x61,0x26,0x37,0x61,0x00,0x27,0x10,0x00,0x61, 0x00,0x3f,0x61,0x00,0x28,0x10,0x00,0x61,0x27,0x38,0x61,0x00,0x2d,0x10,0x00,0x61, 0x00,0x40,0x61,0x00,0x2e,0x10,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x31,0x00,0x00,0x40,0x38,0x51,0x68,0x5a,0x52,0x01,0x02,0x61, 0x00,0x41,0x61,0x00,0x05,0x10,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x39,0x00,0x00,0x61,0x00,0x42,0x61,0x00,0x0b,0x10,0x00,0x61, 0x00,0x43,0x61,0x00,0x11,0x10,0x00,0x61,0x00,0x44,0x61,0x00,0x17,0x10,0x00,0x61, 0x00,0x45,0x61,0x00,0x1d,0x10,0x00,0x61,0x00,0x46,0x61,0x00,0x23,0x10,0x00,0x61, 0x00,0x47,0x61,0x00,0x29,0x10,0x00,0x61,0x00,0x48,0x61,0x00,0x2f,0x10,0x00,0x40, 0x39,0x51,0x68,0x5a,0x52,0x01,0x04,0x61,0x00,0x49,0x61,0x00,0x06,0x10,0x00,0x31, 0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x41,0x00,0x00,0x61, 0x00,0x4a,0x61,0x00,0x0c,0x10,0x00,0x61,0x00,0x4b,0x61,0x00,0x12,0x10,0x00,0x61, 0x00,0x4c,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x4d,0x61,0x00,0x1e,0x10,0x00,0x61, 0x00,0x4e,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x4f,0x61,0x00,0x2a,0x10,0x00,0x61, 0x00,0x50,0x61,0x00,0x30,0x10,0x00,0x40,0x3a,0x51,0x68,0x5a,0x52,0x01,0x06,0x31, 0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x49,0x00,0x00,0x69, 0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xa4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61, 0x00,0x00,0x00,0xa0,0x4a,0x45,0x53,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x86,0x04,0x02,0x64,0x01,0x05,0x01,0x14,0x52,0x08,0x00,0x41, 0x01,0x20,0x22,0x2e,0x02,0x11,0x01,0x49,0x00,0x03,0xa8,0x2a,0x02,0x11,0x01,0x40, 0x00,0x00,0x00,0x60,0x06,0x65,0x52,0x04,0x02,0x00,0x06,0xe4,0x01,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x06,0x44,0x53,0x04,0x03,0x01,0x06,0x44,0x53,0x04,0x52,0x69, 0x01,0x00,0x00,0x60,0x86,0x45,0x53,0x44,0x53,0x00,0x05,0x02,0x00,0x02,0x00,0x40, 0x01,0x00,0x00,0x60,0x06,0x45,0x53,0x44,0x53,0x00,0x06,0x84,0x01,0x00,0x00,0x70, 0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x53,0x00,0x56,0x04,0x53,0x00,0x00,0x20, 0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x69, 0x00,0x0d,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x13,0x68,0x42,0x01,0xc1,0x00,0x69, 0x00,0x19,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x1f,0x68,0x42,0x01,0x41,0x01,0x41, 0x00,0x25,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2b,0x68,0x42,0x01,0xc1,0x01,0x68, 0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x44,0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x40, 0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x44,0x53,0x00,0x06,0x24,0x52,0x00,0x00,0x40, 0x07,0x0d,0xa8,0x42,0x53,0x11,0x0d,0x40,0x07,0x13,0xa8,0x42,0x53,0x11,0x13,0x40, 0x07,0x19,0xa8,0x42,0x53,0x11,0x19,0x40,0x07,0x1f,0xa8,0x42,0x53,0x11,0x1f,0x40, 0x07,0x25,0xa8,0x42,0x53,0x11,0x25,0x40,0x07,0x00,0x00,0x60,0x06,0x45,0x53,0x44, 0x53,0x00,0x06,0x04,0x2b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04, 0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04, 0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0e,0x04, 0x0d,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x14,0x04, 0x13,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x1a,0x04, 0x19,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x20,0x04, 0x1f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x26,0x04, 0x25,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x2c,0x44, 0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x4c,0x04,0x80,0x00,0x00,0x05,0x03,0x04, 0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x05,0x09,0x04, 0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xee,0x04,0x80,0x00,0x00,0x05,0x0f,0x04, 0x0e,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00,0x05,0x15,0x04, 0x14,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x05,0x1b,0x04, 0x1a,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x05,0x21,0x04, 0x20,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xa2,0x04,0x80,0x00,0x00,0x05,0x27,0x04, 0x26,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00,0x05,0x2d,0x04, 0x2c,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x3b,0x51,0x64,0x00,0x00,0x10,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61, 0x00,0x00,0x80,0xa0,0x4a,0x45,0x51,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61, 0x00,0x51,0x62,0x58,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x51,0x64, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x31,0x61,0x00,0x03,0x10,0x00,0x61, 0x00,0x39,0x61,0x00,0x04,0x10,0x00,0x61,0x2d,0x32,0x61,0x00,0x09,0x10,0x00,0x61, 0x00,0x3a,0x61,0x00,0x0a,0x10,0x00,0x61,0x2e,0x33,0x61,0x00,0x0f,0x10,0x00,0x61, 0x00,0x3b,0x61,0x00,0x10,0x10,0x00,0x61,0x2f,0x34,0x61,0x00,0x15,0x10,0x00,0x61, 0x00,0x3c,0x61,0x00,0x16,0x10,0x00,0x61,0x20,0x35,0x61,0x00,0x1b,0x10,0x00,0x61, 0x00,0x3d,0x61,0x00,0x1c,0x10,0x00,0x61,0x21,0x36,0x61,0x00,0x21,0x10,0x00,0x61, 0x00,0x3e,0x61,0x00,0x22,0x10,0x00,0x61,0x22,0x37,0x61,0x00,0x27,0x10,0x00,0x61, 0x00,0x3f,0x61,0x00,0x28,0x10,0x00,0x61,0x23,0x38,0x61,0x00,0x2d,0x10,0x00,0x61, 0x00,0x40,0x61,0x00,0x2e,0x10,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x31,0x00,0x00,0x40,0x34,0x51,0x68,0x5a,0x52,0x01,0x02,0x61, 0x00,0x41,0x61,0x00,0x05,0x10,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x39,0x00,0x00,0x61,0x00,0x42,0x61,0x00,0x0b,0x10,0x00,0x61, 0x00,0x43,0x61,0x00,0x11,0x10,0x00,0x61,0x00,0x44,0x61,0x00,0x17,0x10,0x00,0x61, 0x00,0x45,0x61,0x00,0x1d,0x10,0x00,0x61,0x00,0x46,0x61,0x00,0x23,0x10,0x00,0x61, 0x00,0x47,0x61,0x00,0x29,0x10,0x00,0x61,0x00,0x48,0x61,0x00,0x2f,0x10,0x00,0x40, 0x35,0x51,0x68,0x5a,0x52,0x01,0x04,0x61,0x00,0x49,0x61,0x00,0x06,0x10,0x00,0x31, 0xa6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x41,0x00,0x00,0x61, 0x00,0x4a,0x61,0x00,0x0c,0x10,0x00,0x61,0x00,0x4b,0x61,0x00,0x12,0x10,0x00,0x61, 0x00,0x4c,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x4d,0x61,0x00,0x1e,0x10,0x00,0x61, 0x00,0x4e,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x4f,0x61,0x00,0x2a,0x10,0x00,0x61, 0x00,0x50,0x61,0x00,0x30,0x10,0x00,0x40,0x36,0x51,0x68,0x5a,0x52,0x01,0x06,0x31, 0x97,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x49,0x00,0x00,0x69, 0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xa4,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x61, 0x00,0x00,0x00,0xa0,0x4a,0x85,0x53,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x86,0x04,0x02,0x64,0x01,0x05,0x01,0x14,0x52,0x08,0x00,0x41, 0x01,0x20,0x22,0x2e,0x02,0x11,0x01,0x49,0x00,0x03,0xa8,0x2a,0x02,0x11,0x01,0x40, 0x00,0x00,0x00,0x60,0x06,0xa5,0x52,0x04,0x02,0x00,0x06,0xe4,0x01,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x06,0x84,0x53,0x04,0x03,0x01,0x06,0x84,0x53,0x04,0x52,0x69, 0x01,0x00,0x00,0x60,0x86,0x85,0x53,0x84,0x53,0x00,0x05,0x02,0x00,0x02,0x00,0x40, 0x01,0x00,0x00,0x60,0x06,0x85,0x53,0x84,0x53,0x00,0x06,0x84,0x01,0x00,0x00,0x70, 0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x84,0x53,0x00,0x56,0x04,0x53,0x00,0x00,0x20, 0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x69, 0x00,0x0d,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x13,0x68,0x42,0x01,0xc1,0x00,0x69, 0x00,0x19,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x1f,0x68,0x42,0x01,0x41,0x01,0x41, 0x00,0x25,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2b,0x68,0x42,0x01,0xc1,0x01,0x68, 0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x84,0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x40, 0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x84,0x53,0x00,0x06,0x24,0x52,0x00,0x00,0x40, 0x07,0x0d,0xa8,0x5a,0x53,0x11,0x0d,0x40,0x07,0x13,0xa8,0x5a,0x53,0x11,0x13,0x40, 0x07,0x19,0xa8,0x5a,0x53,0x11,0x19,0x40,0x07,0x1f,0xa8,0x5a,0x53,0x11,0x1f,0x40, 0x07,0x25,0xa8,0x5a,0x53,0x11,0x25,0x40,0x07,0x00,0x00,0x60,0x06,0x85,0x53,0x84, 0x53,0x00,0x06,0x04,0x2b,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04, 0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04, 0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0e,0x04, 0x0d,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x14,0x04, 0x13,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x1a,0x04, 0x19,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x20,0x04, 0x1f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x26,0x04, 0x25,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x2c,0x84, 0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x48,0x04,0x80,0x00,0x00,0x05,0x03,0x04, 0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf9,0x04,0x80,0x00,0x00,0x05,0x09,0x04, 0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xea,0x04,0x80,0x00,0x00,0x05,0x0f,0x04, 0x0e,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00,0x05,0x15,0x04, 0x14,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x05,0x1b,0x04, 0x1a,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x05,0x21,0x04, 0x20,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x05,0x27,0x04, 0x26,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x90,0x04,0x80,0x00,0x00,0x05,0x2d,0x04, 0x2c,0x00,0xa0,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01, 0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3b,0x51,0x64,0x00,0x00,0x10,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61, 0x00,0x00,0x80,0xa0,0x4a,0x45,0x51,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61, 0x00,0x51,0x62,0x58,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x51,0xa4, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x28,0x31,0x61,0x00,0x03,0x10,0x00,0x61, 0x00,0x39,0x61,0x00,0x04,0x10,0x00,0x61,0x29,0x32,0x61,0x00,0x09,0x10,0x00,0x61, 0x00,0x3a,0x61,0x00,0x0a,0x10,0x00,0x61,0x2a,0x33,0x61,0x00,0x0f,0x10,0x00,0x61, 0x00,0x3b,0x61,0x00,0x10,0x10,0x00,0x61,0x2c,0x34,0x61,0x00,0x15,0x10,0x00,0x61, 0x00,0x3c,0x61,0x00,0x16,0x10,0x00,0x61,0x2d,0x35,0x61,0x00,0x1b,0x10,0x00,0x61, 0x00,0x3d,0x61,0x00,0x1c,0x10,0x00,0x61,0x2e,0x36,0x61,0x00,0x21,0x10,0x00,0x61, 0x00,0x3e,0x61,0x00,0x22,0x10,0x00,0x61,0x2f,0x37,0x61,0x00,0x27,0x10,0x00,0x61, 0x00,0x3f,0x61,0x00,0x28,0x10,0x00,0x61,0x20,0x38,0x61,0x00,0x2d,0x10,0x00,0x61, 0x00,0x40,0x61,0x00,0x2e,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x31,0x00,0x00,0x40,0x31,0x51,0x68,0x5a,0x52,0x01,0x02,0x61, 0x00,0x41,0x61,0x00,0x05,0x10,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x51,0x00,0xc0,0x44,0x39,0x00,0x00,0x61,0x00,0x42,0x61,0x00,0x0b,0x10,0x00,0x61, 0x00,0x43,0x61,0x00,0x11,0x10,0x00,0x61,0x00,0x44,0x61,0x00,0x17,0x10,0x00,0x61, 0x00,0x45,0x61,0x00,0x1d,0x10,0x00,0x61,0x00,0x46,0x61,0x00,0x23,0x10,0x00,0x61, 0x00,0x47,0x61,0x00,0x29,0x10,0x00,0x61,0x00,0x48,0x61,0x00,0x2f,0x10,0x00,0x40, 0x32,0x51,0x68,0x5a,0x52,0x01,0x04,0x61,0x00,0x49,0x61,0x00,0x06,0x10,0x00,0x31, 0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x41,0x00,0x00,0x61, 0x00,0x4a,0x61,0x00,0x0c,0x10,0x00,0x61,0x00,0x4b,0x61,0x00,0x12,0x10,0x00,0x61, 0x00,0x4c,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x4d,0x61,0x00,0x1e,0x10,0x00,0x61, 0x00,0x4e,0x61,0x00,0x24,0x10,0x00,0x61,0x00,0x4f,0x61,0x00,0x2a,0x10,0x00,0x61, 0x00,0x50,0x61,0x00,0x30,0x10,0x00,0x40,0x33,0x51,0x68,0x5a,0x52,0x01,0x06,0x31, 0x94,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x51,0x00,0xc0,0x44,0x49,0x00,0x00,0x41, 0x00,0x00,0x00,0x60,0x86,0x65,0x01,0xa4,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x61, 0x00,0x00,0x00,0xa0,0x4a,0xc5,0x53,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x86,0x04,0x02,0x64,0x01,0x05,0x01,0x14,0x52,0x08,0x00,0x41, 0x01,0x20,0x22,0x2e,0x02,0x11,0x01,0x49,0x00,0x03,0xa8,0x2a,0x02,0x11,0x01,0x40, 0x00,0x00,0x00,0x60,0x06,0xe5,0x52,0x04,0x02,0x00,0x06,0xe4,0x01,0x00,0x00,0x5b, 0x02,0x00,0x00,0x60,0x06,0xc4,0x53,0x04,0x03,0x01,0x06,0xc4,0x53,0x04,0x52,0x69, 0x01,0x00,0x00,0x60,0x86,0xc5,0x53,0xc4,0x53,0x00,0x05,0x02,0x00,0x02,0x00,0x40, 0x01,0x00,0x00,0x60,0x06,0xc5,0x53,0xc4,0x53,0x00,0x06,0x84,0x01,0x00,0x00,0x70, 0x01,0x00,0x00,0x60,0x06,0x01,0x00,0xc4,0x53,0x00,0x56,0x04,0x53,0x00,0x00,0x20, 0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x69, 0x00,0x0c,0x68,0x42,0x01,0x31,0x00,0x41,0x00,0x12,0x68,0x42,0x01,0xc1,0x00,0x69, 0x00,0x18,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x1e,0x68,0x42,0x01,0x41,0x01,0x41, 0x00,0x24,0x68,0x42,0x01,0x81,0x01,0x41,0x00,0x2a,0x68,0x42,0x01,0xc1,0x01,0x68, 0x00,0x00,0x00,0x20,0x82,0x45,0x02,0xc4,0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x40, 0x00,0x00,0x00,0x60,0x06,0x25,0x52,0xc4,0x53,0x00,0x06,0x24,0x52,0x00,0x00,0x40, 0x07,0x0c,0xa8,0x6a,0x53,0x11,0x0c,0x40,0x07,0x12,0xa8,0x6a,0x53,0x11,0x12,0x40, 0x07,0x18,0xa8,0x6a,0x53,0x11,0x18,0x40,0x07,0x1e,0xa8,0x6a,0x53,0x11,0x1e,0x40, 0x07,0x24,0xa8,0x6a,0x53,0x11,0x24,0x40,0x07,0x00,0x00,0x60,0x06,0xc5,0x53,0xc4, 0x53,0x00,0x06,0x04,0x2a,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04, 0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24, 0x52,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0d,0x04, 0x0c,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x13,0x04, 0x12,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x19,0x04, 0x18,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x1f,0x04, 0x1e,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x25,0x04, 0x24,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x2b,0xc4, 0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x45,0x04,0x80,0x00,0x00,0x05,0x03,0x04, 0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xf6,0x04,0x80,0x00,0x00,0x05,0x08,0x04, 0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x05,0x0e,0x04, 0x0d,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x05,0x14,0x04, 0x13,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x05,0x1a,0x04, 0x19,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x05,0x20,0x04, 0x1f,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x05,0x26,0x04, 0x25,0x00,0xa0,0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x05,0x2c,0x04, 0x2b,0x00,0xa0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00, 0x00,0x00,0x20,0x90,0x00,0x00,0x00,0x61,0x3b,0x50,0x64,0x00,0x00,0x10,0x00,0x40, 0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61, 0x00,0x00,0x80,0xa0,0x4a,0x45,0x50,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61, 0x00,0x50,0x62,0x58,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x50,0xe4, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x25,0x30,0x61,0x00,0x03,0x10,0x00,0x61, 0x00,0x38,0x61,0x00,0x04,0x10,0x00,0x61,0x26,0x31,0x61,0x00,0x08,0x10,0x00,0x61, 0x00,0x39,0x61,0x00,0x09,0x10,0x00,0x61,0x28,0x32,0x61,0x00,0x0e,0x10,0x00,0x61, 0x00,0x3a,0x61,0x00,0x0f,0x10,0x00,0x61,0x29,0x33,0x61,0x00,0x14,0x10,0x00,0x61, 0x00,0x3b,0x61,0x00,0x15,0x10,0x00,0x61,0x2a,0x34,0x61,0x00,0x1a,0x10,0x00,0x61, 0x00,0x3c,0x61,0x00,0x1b,0x10,0x00,0x61,0x2c,0x35,0x61,0x00,0x20,0x10,0x00,0x61, 0x00,0x3d,0x61,0x00,0x21,0x10,0x00,0x61,0x2d,0x36,0x61,0x00,0x26,0x10,0x00,0x61, 0x00,0x3e,0x61,0x00,0x27,0x10,0x00,0x61,0x2e,0x37,0x61,0x00,0x2c,0x10,0x00,0x61, 0x00,0x3f,0x61,0x00,0x2d,0x10,0x00,0x31,0xaf,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x50,0x00,0xc0,0x44,0x30,0x00,0x00,0x40,0x3f,0x50,0x68,0x5a,0x52,0x01,0x02,0x61, 0x00,0x40,0x61,0x00,0x05,0x10,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x01,0x00,0x04, 0x50,0x00,0xc0,0x44,0x38,0x00,0x00,0x61,0x00,0x41,0x61,0x00,0x0a,0x10,0x00,0x61, 0x00,0x42,0x61,0x00,0x10,0x10,0x00,0x61,0x00,0x43,0x61,0x00,0x16,0x10,0x00,0x61, 0x00,0x44,0x61,0x00,0x1c,0x10,0x00,0x61,0x00,0x45,0x61,0x00,0x22,0x10,0x00,0x61, 0x00,0x46,0x61,0x00,0x28,0x10,0x00,0x61,0x00,0x47,0x61,0x00,0x2e,0x10,0x00,0x40, 0x30,0x50,0x68,0x5a,0x52,0x01,0x04,0x61,0x00,0x48,0x61,0x00,0x06,0x10,0x00,0x31, 0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44,0x40,0x00,0x00,0x61, 0x00,0x49,0x61,0x00,0x0b,0x10,0x00,0x61,0x00,0x4a,0x61,0x00,0x11,0x10,0x00,0x61, 0x00,0x4b,0x61,0x00,0x17,0x10,0x00,0x61,0x00,0x4c,0x61,0x00,0x1d,0x10,0x00,0x61, 0x00,0x4d,0x61,0x00,0x23,0x10,0x00,0x61,0x00,0x4e,0x61,0x00,0x29,0x10,0x00,0x61, 0x00,0x4f,0x61,0x00,0x2f,0x10,0x00,0x40,0x31,0x50,0x68,0x5a,0x52,0x01,0x06,0x31, 0x92,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x50,0x00,0xc0,0x44,0x48,0x00,0x00,0x61, 0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c, 0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0xe8,0x11,0x00,0x00,0x73,0x75,0x72,0x66,0x61, 0x63,0x65,0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x73,0x77,0x61,0x70,0x5f, 0x33,0x32,0x78,0x33,0x32,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72, 0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72, 0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66, 0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63, 0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63, 0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53, 0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00, 0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33, 0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30, 0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00, 0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34, 0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30, 0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00, 0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35, 0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30, 0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00, 0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35, 0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30, 0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00, 0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36, 0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30, 0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00, 0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37, 0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30, 0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00, 0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38, 0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30, 0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00, 0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39, 0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30, 0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00, 0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39, 0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30, 0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00, 0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30, 0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30, 0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00, 0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31, 0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30, 0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00, 0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32, 0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30, 0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00, 0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33, 0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30, 0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00, 0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33, 0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30, 0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00, 0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34, 0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30, 0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00, 0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35, 0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30, 0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00, 0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36, 0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30, 0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00, 0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37, 0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30, 0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00, 0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37, 0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30, 0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00, 0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38, 0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30, 0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00, 0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39, 0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30, 0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00, 0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30, 0x32,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30, 0x32,0x30,0x35,0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00, 0x56,0x30,0x32,0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31, 0x30,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30, 0x32,0x31,0x33,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00, 0x56,0x30,0x32,0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31, 0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30, 0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00, 0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32, 0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30, 0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00, 0x56,0x30,0x32,0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33, 0x34,0x00,0x56,0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30, 0x32,0x33,0x37,0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00, 0x56,0x30,0x32,0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34, 0x32,0x00,0x56,0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30, 0x32,0x34,0x35,0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00, 0x56,0x30,0x32,0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35, 0x30,0x00,0x56,0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30, 0x32,0x35,0x33,0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00, 0x56,0x30,0x32,0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35, 0x38,0x00,0x56,0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30, 0x32,0x36,0x31,0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00, 0x56,0x30,0x32,0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36, 0x36,0x00,0x56,0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30, 0x32,0x36,0x39,0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00, 0x56,0x30,0x32,0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37, 0x34,0x00,0x56,0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30, 0x32,0x37,0x37,0x00,0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00, 0x56,0x30,0x32,0x38,0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38, 0x32,0x00,0x56,0x30,0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30, 0x32,0x38,0x35,0x00,0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00, 0x56,0x30,0x32,0x38,0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39, 0x30,0x00,0x56,0x30,0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30, 0x32,0x39,0x33,0x00,0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00, 0x56,0x30,0x32,0x39,0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39, 0x38,0x00,0x56,0x30,0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30, 0x33,0x30,0x31,0x00,0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00, 0x56,0x30,0x33,0x30,0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30, 0x36,0x00,0x56,0x30,0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30, 0x33,0x30,0x39,0x00,0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00, 0x56,0x30,0x33,0x31,0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31, 0x34,0x00,0x56,0x30,0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30, 0x33,0x31,0x37,0x00,0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00, 0x56,0x30,0x33,0x32,0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32, 0x32,0x00,0x56,0x30,0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30, 0x33,0x32,0x35,0x00,0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00, 0x56,0x30,0x33,0x32,0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33, 0x30,0x00,0x56,0x30,0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30, 0x33,0x33,0x33,0x00,0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00, 0x56,0x30,0x33,0x33,0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33, 0x38,0x00,0x56,0x30,0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30, 0x33,0x34,0x31,0x00,0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00, 0x56,0x30,0x33,0x34,0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34, 0x36,0x00,0x56,0x30,0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30, 0x33,0x34,0x39,0x00,0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00, 0x56,0x30,0x33,0x35,0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35, 0x34,0x00,0x56,0x30,0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30, 0x33,0x35,0x37,0x00,0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00, 0x56,0x30,0x33,0x36,0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36, 0x32,0x00,0x56,0x30,0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30, 0x33,0x36,0x35,0x00,0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00, 0x56,0x30,0x33,0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37, 0x30,0x00,0x56,0x30,0x33,0x37,0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30, 0x33,0x37,0x33,0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00, 0x56,0x30,0x33,0x37,0x36,0x00,0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37, 0x38,0x00,0x56,0x30,0x33,0x37,0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30, 0x33,0x38,0x31,0x00,0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00, 0x56,0x30,0x33,0x38,0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38, 0x36,0x00,0x56,0x30,0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30, 0x33,0x38,0x39,0x00,0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00, 0x56,0x30,0x33,0x39,0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39, 0x34,0x00,0x56,0x30,0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30, 0x33,0x39,0x37,0x00,0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00, 0x56,0x30,0x34,0x30,0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30, 0x32,0x00,0x56,0x30,0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30, 0x34,0x30,0x35,0x00,0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00, 0x56,0x30,0x34,0x30,0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31, 0x30,0x00,0x56,0x30,0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30, 0x34,0x31,0x33,0x00,0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00, 0x56,0x30,0x34,0x31,0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31, 0x38,0x00,0x56,0x30,0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30, 0x34,0x32,0x31,0x00,0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00, 0x56,0x30,0x34,0x32,0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32, 0x36,0x00,0x56,0x30,0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30, 0x34,0x32,0x39,0x00,0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00, 0x56,0x30,0x34,0x33,0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33, 0x34,0x00,0x56,0x30,0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30, 0x34,0x33,0x37,0x00,0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00, 0x56,0x30,0x34,0x34,0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34, 0x32,0x00,0x56,0x30,0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30, 0x34,0x34,0x35,0x00,0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00, 0x56,0x30,0x34,0x34,0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35, 0x30,0x00,0x56,0x30,0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30, 0x34,0x35,0x33,0x00,0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00, 0x56,0x30,0x34,0x35,0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35, 0x38,0x00,0x56,0x30,0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30, 0x34,0x36,0x31,0x00,0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00, 0x56,0x30,0x34,0x36,0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36, 0x36,0x00,0x56,0x30,0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30, 0x34,0x36,0x39,0x00,0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00, 0x56,0x30,0x34,0x37,0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37, 0x34,0x00,0x56,0x30,0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30, 0x34,0x37,0x37,0x00,0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00, 0x56,0x30,0x34,0x38,0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38, 0x32,0x00,0x56,0x30,0x34,0x38,0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30, 0x34,0x38,0x35,0x00,0x56,0x30,0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00, 0x56,0x30,0x34,0x38,0x38,0x00,0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39, 0x30,0x00,0x56,0x30,0x34,0x39,0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30, 0x34,0x39,0x33,0x00,0x56,0x30,0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00, 0x56,0x30,0x34,0x39,0x36,0x00,0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39, 0x38,0x00,0x56,0x30,0x34,0x39,0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30, 0x35,0x30,0x31,0x00,0x56,0x30,0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00, 0x56,0x30,0x35,0x30,0x34,0x00,0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30, 0x36,0x00,0x56,0x30,0x35,0x30,0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30, 0x35,0x30,0x39,0x00,0x56,0x30,0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00, 0x56,0x30,0x35,0x31,0x32,0x00,0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31, 0x34,0x00,0x56,0x30,0x35,0x31,0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30, 0x35,0x31,0x37,0x00,0x56,0x30,0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00, 0x56,0x30,0x35,0x32,0x30,0x00,0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32, 0x32,0x00,0x56,0x30,0x35,0x32,0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30, 0x35,0x32,0x35,0x00,0x56,0x30,0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00, 0x56,0x30,0x35,0x32,0x38,0x00,0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33, 0x30,0x00,0x56,0x30,0x35,0x33,0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30, 0x35,0x33,0x33,0x00,0x56,0x30,0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00, 0x56,0x30,0x35,0x33,0x36,0x00,0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33, 0x38,0x00,0x56,0x30,0x35,0x33,0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30, 0x35,0x34,0x31,0x00,0x56,0x30,0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00, 0x56,0x30,0x35,0x34,0x34,0x00,0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34, 0x36,0x00,0x56,0x30,0x35,0x34,0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30, 0x35,0x34,0x39,0x00,0x56,0x30,0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00, 0x56,0x30,0x35,0x35,0x32,0x00,0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35, 0x34,0x00,0x56,0x30,0x35,0x35,0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30, 0x35,0x35,0x37,0x00,0x56,0x30,0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00, 0x56,0x30,0x35,0x36,0x30,0x00,0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36, 0x32,0x00,0x56,0x30,0x35,0x36,0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30, 0x35,0x36,0x35,0x00,0x56,0x30,0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00, 0x56,0x30,0x35,0x36,0x38,0x00,0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37, 0x30,0x00,0x56,0x30,0x35,0x37,0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30, 0x35,0x37,0x33,0x00,0x56,0x30,0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00, 0x56,0x30,0x35,0x37,0x36,0x00,0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37, 0x38,0x00,0x56,0x30,0x35,0x37,0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30, 0x35,0x38,0x31,0x00,0x56,0x30,0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00, 0x56,0x30,0x35,0x38,0x34,0x00,0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38, 0x36,0x00,0x56,0x30,0x35,0x38,0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30, 0x35,0x38,0x39,0x00,0x56,0x30,0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00, 0x56,0x30,0x35,0x39,0x32,0x00,0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39, 0x34,0x00,0x56,0x30,0x35,0x39,0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30, 0x35,0x39,0x37,0x00,0x56,0x30,0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00, 0x56,0x30,0x36,0x30,0x30,0x00,0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30, 0x32,0x00,0x56,0x30,0x36,0x30,0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30, 0x36,0x30,0x35,0x00,0x56,0x30,0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00, 0x56,0x30,0x36,0x30,0x38,0x00,0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31, 0x30,0x00,0x56,0x30,0x36,0x31,0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30, 0x36,0x31,0x33,0x00,0x56,0x30,0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00, 0x56,0x30,0x36,0x31,0x36,0x00,0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31, 0x38,0x00,0x56,0x30,0x36,0x31,0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30, 0x36,0x32,0x31,0x00,0x56,0x30,0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00, 0x56,0x30,0x36,0x32,0x34,0x00,0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32, 0x36,0x00,0x56,0x30,0x36,0x32,0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30, 0x36,0x32,0x39,0x00,0x56,0x30,0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00, 0x56,0x30,0x36,0x33,0x32,0x00,0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33, 0x34,0x00,0x56,0x30,0x36,0x33,0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30, 0x36,0x33,0x37,0x00,0x56,0x30,0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00, 0x56,0x30,0x36,0x34,0x30,0x00,0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34, 0x32,0x00,0x56,0x30,0x36,0x34,0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30, 0x36,0x34,0x35,0x00,0x56,0x30,0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00, 0x56,0x30,0x36,0x34,0x38,0x00,0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35, 0x30,0x00,0x56,0x30,0x36,0x35,0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30, 0x36,0x35,0x33,0x00,0x56,0x30,0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00, 0x56,0x30,0x36,0x35,0x36,0x00,0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35, 0x38,0x00,0x56,0x30,0x36,0x35,0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30, 0x36,0x36,0x31,0x00,0x56,0x30,0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00, 0x56,0x30,0x36,0x36,0x34,0x00,0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36, 0x36,0x00,0x56,0x30,0x36,0x36,0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30, 0x36,0x36,0x39,0x00,0x56,0x30,0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00, 0x56,0x30,0x36,0x37,0x32,0x00,0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37, 0x34,0x00,0x56,0x30,0x36,0x37,0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30, 0x36,0x37,0x37,0x00,0x56,0x30,0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00, 0x56,0x30,0x36,0x38,0x30,0x00,0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38, 0x32,0x00,0x56,0x30,0x36,0x38,0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30, 0x36,0x38,0x35,0x00,0x56,0x30,0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00, 0x56,0x30,0x36,0x38,0x38,0x00,0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39, 0x30,0x00,0x56,0x30,0x36,0x39,0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30, 0x36,0x39,0x33,0x00,0x56,0x30,0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00, 0x56,0x30,0x36,0x39,0x36,0x00,0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39, 0x38,0x00,0x56,0x30,0x36,0x39,0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30, 0x37,0x30,0x31,0x00,0x56,0x30,0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00, 0x56,0x30,0x37,0x30,0x34,0x00,0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30, 0x36,0x00,0x56,0x30,0x37,0x30,0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30, 0x37,0x30,0x39,0x00,0x56,0x30,0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00, 0x56,0x30,0x37,0x31,0x32,0x00,0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31, 0x34,0x00,0x56,0x30,0x37,0x31,0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30, 0x37,0x31,0x37,0x00,0x56,0x30,0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00, 0x56,0x30,0x37,0x32,0x30,0x00,0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32, 0x32,0x00,0x56,0x30,0x37,0x32,0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30, 0x37,0x32,0x35,0x00,0x56,0x30,0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00, 0x56,0x30,0x37,0x32,0x38,0x00,0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33, 0x30,0x00,0x56,0x30,0x37,0x33,0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30, 0x37,0x33,0x33,0x00,0x56,0x30,0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00, 0x56,0x30,0x37,0x33,0x36,0x00,0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33, 0x38,0x00,0x56,0x30,0x37,0x33,0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30, 0x37,0x34,0x31,0x00,0x56,0x30,0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00, 0x56,0x30,0x37,0x34,0x34,0x00,0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34, 0x36,0x00,0x56,0x30,0x37,0x34,0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30, 0x37,0x34,0x39,0x00,0x56,0x30,0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00, 0x56,0x30,0x37,0x35,0x32,0x00,0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35, 0x34,0x00,0x56,0x30,0x37,0x35,0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30, 0x37,0x35,0x37,0x00,0x56,0x30,0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00, 0x56,0x30,0x37,0x36,0x30,0x00,0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36, 0x32,0x00,0x56,0x30,0x37,0x36,0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30, 0x37,0x36,0x35,0x00,0x56,0x30,0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00, 0x56,0x30,0x37,0x36,0x38,0x00,0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37, 0x30,0x00,0x56,0x30,0x37,0x37,0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30, 0x37,0x37,0x33,0x00,0x56,0x30,0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00, 0x56,0x30,0x37,0x37,0x36,0x00,0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37, 0x38,0x00,0x56,0x30,0x37,0x37,0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30, 0x37,0x38,0x31,0x00,0x56,0x30,0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00, 0x56,0x30,0x37,0x38,0x34,0x00,0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38, 0x36,0x00,0x56,0x30,0x37,0x38,0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30, 0x37,0x38,0x39,0x00,0x56,0x30,0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00, 0x56,0x30,0x37,0x39,0x32,0x00,0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39, 0x34,0x00,0x56,0x30,0x37,0x39,0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30, 0x37,0x39,0x37,0x00,0x56,0x30,0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00, 0x56,0x30,0x38,0x30,0x30,0x00,0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30, 0x32,0x00,0x56,0x30,0x38,0x30,0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30, 0x38,0x30,0x35,0x00,0x56,0x30,0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00, 0x56,0x30,0x38,0x30,0x38,0x00,0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31, 0x30,0x00,0x56,0x30,0x38,0x31,0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30, 0x38,0x31,0x33,0x00,0x56,0x30,0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00, 0x56,0x30,0x38,0x31,0x36,0x00,0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31, 0x38,0x00,0x56,0x30,0x38,0x31,0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30, 0x38,0x32,0x31,0x00,0x56,0x30,0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00, 0x56,0x30,0x38,0x32,0x34,0x00,0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32, 0x36,0x00,0x56,0x30,0x38,0x32,0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30, 0x38,0x32,0x39,0x00,0x56,0x30,0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00, 0x56,0x30,0x38,0x33,0x32,0x00,0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33, 0x34,0x00,0x56,0x30,0x38,0x33,0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30, 0x38,0x33,0x37,0x00,0x56,0x30,0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00, 0x56,0x30,0x38,0x34,0x30,0x00,0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34, 0x32,0x00,0x56,0x30,0x38,0x34,0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30, 0x38,0x34,0x35,0x00,0x56,0x30,0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00, 0x56,0x30,0x38,0x34,0x38,0x00,0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35, 0x30,0x00,0x56,0x30,0x38,0x35,0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30, 0x38,0x35,0x33,0x00,0x56,0x30,0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00, 0x56,0x30,0x38,0x35,0x36,0x00,0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35, 0x38,0x00,0x56,0x30,0x38,0x35,0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30, 0x38,0x36,0x31,0x00,0x56,0x30,0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00, 0x56,0x30,0x38,0x36,0x34,0x00,0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36, 0x36,0x00,0x56,0x30,0x38,0x36,0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30, 0x38,0x36,0x39,0x00,0x56,0x30,0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00, 0x56,0x30,0x38,0x37,0x32,0x00,0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37, 0x34,0x00,0x56,0x30,0x38,0x37,0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30, 0x38,0x37,0x37,0x00,0x56,0x30,0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00, 0x56,0x30,0x38,0x38,0x30,0x00,0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38, 0x32,0x00,0x56,0x30,0x38,0x38,0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30, 0x38,0x38,0x35,0x00,0x56,0x30,0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00, 0x56,0x30,0x38,0x38,0x38,0x00,0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39, 0x30,0x00,0x56,0x30,0x38,0x39,0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30, 0x38,0x39,0x33,0x00,0x56,0x30,0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00, 0x56,0x30,0x38,0x39,0x36,0x00,0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39, 0x38,0x00,0x56,0x30,0x38,0x39,0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30, 0x39,0x30,0x31,0x00,0x56,0x30,0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00, 0x56,0x30,0x39,0x30,0x34,0x00,0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30, 0x36,0x00,0x56,0x30,0x39,0x30,0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30, 0x39,0x30,0x39,0x00,0x56,0x30,0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00, 0x56,0x30,0x39,0x31,0x32,0x00,0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31, 0x34,0x00,0x56,0x30,0x39,0x31,0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30, 0x39,0x31,0x37,0x00,0x56,0x30,0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00, 0x56,0x30,0x39,0x32,0x30,0x00,0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32, 0x32,0x00,0x56,0x30,0x39,0x32,0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30, 0x39,0x32,0x35,0x00,0x56,0x30,0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00, 0x56,0x30,0x39,0x32,0x38,0x00,0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33, 0x30,0x00,0x56,0x30,0x39,0x33,0x31,0x00,0x56,0x30,0x39,0x33,0x32,0x00,0x56,0x30, 0x39,0x33,0x33,0x00,0x56,0x30,0x39,0x33,0x34,0x00,0x56,0x30,0x39,0x33,0x35,0x00, 0x56,0x30,0x39,0x33,0x36,0x00,0x56,0x30,0x39,0x33,0x37,0x00,0x56,0x30,0x39,0x33, 0x38,0x00,0x56,0x30,0x39,0x33,0x39,0x00,0x56,0x30,0x39,0x34,0x30,0x00,0x56,0x30, 0x39,0x34,0x31,0x00,0x56,0x30,0x39,0x34,0x32,0x00,0x56,0x30,0x39,0x34,0x33,0x00, 0x56,0x30,0x39,0x34,0x34,0x00,0x56,0x30,0x39,0x34,0x35,0x00,0x56,0x30,0x39,0x34, 0x36,0x00,0x56,0x30,0x39,0x34,0x37,0x00,0x56,0x30,0x39,0x34,0x38,0x00,0x56,0x30, 0x39,0x34,0x39,0x00,0x56,0x30,0x39,0x35,0x30,0x00,0x56,0x30,0x39,0x35,0x31,0x00, 0x56,0x30,0x39,0x35,0x32,0x00,0x56,0x30,0x39,0x35,0x33,0x00,0x56,0x30,0x39,0x35, 0x34,0x00,0x56,0x30,0x39,0x35,0x35,0x00,0x56,0x30,0x39,0x35,0x36,0x00,0x56,0x30, 0x39,0x35,0x37,0x00,0x56,0x30,0x39,0x35,0x38,0x00,0x56,0x30,0x39,0x35,0x39,0x00, 0x56,0x30,0x39,0x36,0x30,0x00,0x56,0x30,0x39,0x36,0x31,0x00,0x56,0x30,0x39,0x36, 0x32,0x00,0x56,0x30,0x39,0x36,0x33,0x00,0x56,0x30,0x39,0x36,0x34,0x00,0x56,0x30, 0x39,0x36,0x35,0x00,0x56,0x30,0x39,0x36,0x36,0x00,0x56,0x30,0x39,0x36,0x37,0x00, 0x56,0x30,0x39,0x36,0x38,0x00,0x56,0x30,0x39,0x36,0x39,0x00,0x56,0x30,0x39,0x37, 0x30,0x00,0x56,0x30,0x39,0x37,0x31,0x00,0x56,0x30,0x39,0x37,0x32,0x00,0x56,0x30, 0x39,0x37,0x33,0x00,0x56,0x30,0x39,0x37,0x34,0x00,0x56,0x30,0x39,0x37,0x35,0x00, 0x56,0x30,0x39,0x37,0x36,0x00,0x56,0x30,0x39,0x37,0x37,0x00,0x56,0x30,0x39,0x37, 0x38,0x00,0x56,0x30,0x39,0x37,0x39,0x00,0x56,0x30,0x39,0x38,0x30,0x00,0x56,0x30, 0x39,0x38,0x31,0x00,0x56,0x30,0x39,0x38,0x32,0x00,0x56,0x30,0x39,0x38,0x33,0x00, 0x56,0x30,0x39,0x38,0x34,0x00,0x56,0x30,0x39,0x38,0x35,0x00,0x56,0x30,0x39,0x38, 0x36,0x00,0x56,0x30,0x39,0x38,0x37,0x00,0x56,0x30,0x39,0x38,0x38,0x00,0x56,0x30, 0x39,0x38,0x39,0x00,0x56,0x30,0x39,0x39,0x30,0x00,0x56,0x30,0x39,0x39,0x31,0x00, 0x56,0x30,0x39,0x39,0x32,0x00,0x56,0x30,0x39,0x39,0x33,0x00,0x56,0x30,0x39,0x39, 0x34,0x00,0x56,0x30,0x39,0x39,0x35,0x00,0x56,0x30,0x39,0x39,0x36,0x00,0x56,0x30, 0x39,0x39,0x37,0x00,0x56,0x30,0x39,0x39,0x38,0x00,0x56,0x30,0x39,0x39,0x39,0x00, 0x56,0x31,0x30,0x30,0x30,0x00,0x56,0x31,0x30,0x30,0x31,0x00,0x56,0x31,0x30,0x30, 0x32,0x00,0x56,0x31,0x30,0x30,0x33,0x00,0x56,0x31,0x30,0x30,0x34,0x00,0x56,0x31, 0x30,0x30,0x35,0x00,0x56,0x31,0x30,0x30,0x36,0x00,0x56,0x31,0x30,0x30,0x37,0x00, 0x56,0x31,0x30,0x30,0x38,0x00,0x56,0x31,0x30,0x30,0x39,0x00,0x56,0x31,0x30,0x31, 0x30,0x00,0x56,0x31,0x30,0x31,0x31,0x00,0x56,0x31,0x30,0x31,0x32,0x00,0x56,0x31, 0x30,0x31,0x33,0x00,0x56,0x31,0x30,0x31,0x34,0x00,0x56,0x31,0x30,0x31,0x35,0x00, 0x56,0x31,0x30,0x31,0x36,0x00,0x56,0x31,0x30,0x31,0x37,0x00,0x56,0x31,0x30,0x31, 0x38,0x00,0x56,0x31,0x30,0x31,0x39,0x00,0x56,0x31,0x30,0x32,0x30,0x00,0x56,0x31, 0x30,0x32,0x31,0x00,0x56,0x31,0x30,0x32,0x32,0x00,0x56,0x31,0x30,0x32,0x33,0x00, 0x56,0x31,0x30,0x32,0x34,0x00,0x56,0x31,0x30,0x32,0x35,0x00,0x56,0x31,0x30,0x32, 0x36,0x00,0x56,0x31,0x30,0x32,0x37,0x00,0x56,0x31,0x30,0x32,0x38,0x00,0x56,0x31, 0x30,0x32,0x39,0x00,0x56,0x31,0x30,0x33,0x30,0x00,0x56,0x31,0x30,0x33,0x31,0x00, 0x56,0x31,0x30,0x33,0x32,0x00,0x56,0x31,0x30,0x33,0x33,0x00,0x56,0x31,0x30,0x33, 0x34,0x00,0x56,0x31,0x30,0x33,0x35,0x00,0x56,0x31,0x30,0x33,0x36,0x00,0x56,0x31, 0x30,0x33,0x37,0x00,0x56,0x31,0x30,0x33,0x38,0x00,0x56,0x31,0x30,0x33,0x39,0x00, 0x56,0x31,0x30,0x34,0x30,0x00,0x56,0x31,0x30,0x34,0x31,0x00,0x56,0x31,0x30,0x34, 0x32,0x00,0x56,0x31,0x30,0x34,0x33,0x00,0x56,0x31,0x30,0x34,0x34,0x00,0x56,0x31, 0x30,0x34,0x35,0x00,0x56,0x31,0x30,0x34,0x36,0x00,0x56,0x31,0x30,0x34,0x37,0x00, 0x56,0x31,0x30,0x34,0x38,0x00,0x56,0x31,0x30,0x34,0x39,0x00,0x56,0x31,0x30,0x35, 0x30,0x00,0x56,0x31,0x30,0x35,0x31,0x00,0x56,0x31,0x30,0x35,0x32,0x00,0x56,0x31, 0x30,0x35,0x33,0x00,0x56,0x31,0x30,0x35,0x34,0x00,0x56,0x31,0x30,0x35,0x35,0x00, 0x56,0x31,0x30,0x35,0x36,0x00,0x56,0x31,0x30,0x35,0x37,0x00,0x56,0x31,0x30,0x35, 0x38,0x00,0x56,0x31,0x30,0x35,0x39,0x00,0x56,0x31,0x30,0x36,0x30,0x00,0x56,0x31, 0x30,0x36,0x31,0x00,0x56,0x31,0x30,0x36,0x32,0x00,0x56,0x31,0x30,0x36,0x33,0x00, 0x56,0x31,0x30,0x36,0x34,0x00,0x56,0x31,0x30,0x36,0x35,0x00,0x56,0x31,0x30,0x36, 0x36,0x00,0x56,0x31,0x30,0x36,0x37,0x00,0x56,0x31,0x30,0x36,0x38,0x00,0x56,0x31, 0x30,0x36,0x39,0x00,0x56,0x31,0x30,0x37,0x30,0x00,0x56,0x31,0x30,0x37,0x31,0x00, 0x56,0x31,0x30,0x37,0x32,0x00,0x56,0x31,0x30,0x37,0x33,0x00,0x56,0x31,0x30,0x37, 0x34,0x00,0x56,0x31,0x30,0x37,0x35,0x00,0x56,0x31,0x30,0x37,0x36,0x00,0x56,0x31, 0x30,0x37,0x37,0x00,0x56,0x31,0x30,0x37,0x38,0x00,0x56,0x31,0x30,0x37,0x39,0x00, 0x56,0x31,0x30,0x38,0x30,0x00,0x56,0x31,0x30,0x38,0x31,0x00,0x56,0x31,0x30,0x38, 0x32,0x00,0x56,0x31,0x30,0x38,0x33,0x00,0x56,0x31,0x30,0x38,0x34,0x00,0x56,0x31, 0x30,0x38,0x35,0x00,0x56,0x31,0x30,0x38,0x36,0x00,0x56,0x31,0x30,0x38,0x37,0x00, 0x56,0x31,0x30,0x38,0x38,0x00,0x56,0x31,0x30,0x38,0x39,0x00,0x56,0x31,0x30,0x39, 0x30,0x00,0x56,0x31,0x30,0x39,0x31,0x00,0x56,0x31,0x30,0x39,0x32,0x00,0x56,0x31, 0x30,0x39,0x33,0x00,0x56,0x31,0x30,0x39,0x34,0x00,0x56,0x31,0x30,0x39,0x35,0x00, 0x56,0x31,0x30,0x39,0x36,0x00,0x56,0x31,0x30,0x39,0x37,0x00,0x56,0x31,0x30,0x39, 0x38,0x00,0x56,0x31,0x30,0x39,0x39,0x00,0x56,0x31,0x31,0x30,0x30,0x00,0x56,0x31, 0x31,0x30,0x31,0x00,0x56,0x31,0x31,0x30,0x32,0x00,0x56,0x31,0x31,0x30,0x33,0x00, 0x56,0x31,0x31,0x30,0x34,0x00,0x56,0x31,0x31,0x30,0x35,0x00,0x56,0x31,0x31,0x30, 0x36,0x00,0x56,0x31,0x31,0x30,0x37,0x00,0x56,0x31,0x31,0x30,0x38,0x00,0x56,0x31, 0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x31,0x00, 0x56,0x31,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x31, 0x34,0x00,0x56,0x31,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x31,0x36,0x00,0x56,0x31, 0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x31,0x39,0x00, 0x56,0x31,0x31,0x32,0x30,0x00,0x56,0x31,0x31,0x32,0x31,0x00,0x56,0x31,0x31,0x32, 0x32,0x00,0x56,0x31,0x31,0x32,0x33,0x00,0x56,0x31,0x31,0x32,0x34,0x00,0x56,0x31, 0x31,0x32,0x35,0x00,0x56,0x31,0x31,0x32,0x36,0x00,0x56,0x31,0x31,0x32,0x37,0x00, 0x56,0x31,0x31,0x32,0x38,0x00,0x56,0x31,0x31,0x32,0x39,0x00,0x56,0x31,0x31,0x33, 0x30,0x00,0x56,0x31,0x31,0x33,0x31,0x00,0x56,0x31,0x31,0x33,0x32,0x00,0x56,0x31, 0x31,0x33,0x33,0x00,0x56,0x31,0x31,0x33,0x34,0x00,0x56,0x31,0x31,0x33,0x35,0x00, 0x56,0x31,0x31,0x33,0x36,0x00,0x56,0x31,0x31,0x33,0x37,0x00,0x56,0x31,0x31,0x33, 0x38,0x00,0x56,0x31,0x31,0x33,0x39,0x00,0x56,0x31,0x31,0x34,0x30,0x00,0x56,0x31, 0x31,0x34,0x31,0x00,0x56,0x31,0x31,0x34,0x32,0x00,0x56,0x31,0x31,0x34,0x33,0x00, 0x56,0x31,0x31,0x34,0x34,0x00,0x56,0x31,0x31,0x34,0x35,0x00,0x56,0x31,0x31,0x34, 0x36,0x00,0x56,0x31,0x31,0x34,0x37,0x00,0x56,0x31,0x31,0x34,0x38,0x00,0x56,0x31, 0x31,0x34,0x39,0x00,0x56,0x31,0x31,0x35,0x30,0x00,0x56,0x31,0x31,0x35,0x31,0x00, 0x56,0x31,0x31,0x35,0x32,0x00,0x56,0x31,0x31,0x35,0x33,0x00,0x56,0x31,0x31,0x35, 0x34,0x00,0x56,0x31,0x31,0x35,0x35,0x00,0x56,0x31,0x31,0x35,0x36,0x00,0x56,0x31, 0x31,0x35,0x37,0x00,0x56,0x31,0x31,0x35,0x38,0x00,0x56,0x31,0x31,0x35,0x39,0x00, 0x56,0x31,0x31,0x36,0x30,0x00,0x56,0x31,0x31,0x36,0x31,0x00,0x56,0x31,0x31,0x36, 0x32,0x00,0x56,0x31,0x31,0x36,0x33,0x00,0x56,0x31,0x31,0x36,0x34,0x00,0x56,0x31, 0x31,0x36,0x35,0x00,0x56,0x31,0x31,0x36,0x36,0x00,0x56,0x31,0x31,0x36,0x37,0x00, 0x56,0x31,0x31,0x36,0x38,0x00,0x56,0x31,0x31,0x36,0x39,0x00,0x56,0x31,0x31,0x37, 0x30,0x00,0x56,0x31,0x31,0x37,0x31,0x00,0x56,0x31,0x31,0x37,0x32,0x00,0x56,0x31, 0x31,0x37,0x33,0x00,0x56,0x31,0x31,0x37,0x34,0x00,0x56,0x31,0x31,0x37,0x35,0x00, 0x56,0x31,0x31,0x37,0x36,0x00,0x56,0x31,0x31,0x37,0x37,0x00,0x56,0x31,0x31,0x37, 0x38,0x00,0x56,0x31,0x31,0x37,0x39,0x00,0x56,0x31,0x31,0x38,0x30,0x00,0x56,0x31, 0x31,0x38,0x31,0x00,0x56,0x31,0x31,0x38,0x32,0x00,0x56,0x31,0x31,0x38,0x33,0x00, 0x56,0x31,0x31,0x38,0x34,0x00,0x56,0x31,0x31,0x38,0x35,0x00,0x56,0x31,0x31,0x38, 0x36,0x00,0x56,0x31,0x31,0x38,0x37,0x00,0x56,0x31,0x31,0x38,0x38,0x00,0x56,0x31, 0x31,0x38,0x39,0x00,0x56,0x31,0x31,0x39,0x30,0x00,0x56,0x31,0x31,0x39,0x31,0x00, 0x56,0x31,0x31,0x39,0x32,0x00,0x56,0x31,0x31,0x39,0x33,0x00,0x56,0x31,0x31,0x39, 0x34,0x00,0x56,0x31,0x31,0x39,0x35,0x00,0x56,0x31,0x31,0x39,0x36,0x00,0x56,0x31, 0x31,0x39,0x37,0x00,0x56,0x31,0x31,0x39,0x38,0x00,0x56,0x31,0x31,0x39,0x39,0x00, 0x56,0x31,0x32,0x30,0x30,0x00,0x56,0x31,0x32,0x30,0x31,0x00,0x56,0x31,0x32,0x30, 0x32,0x00,0x56,0x31,0x32,0x30,0x33,0x00,0x56,0x31,0x32,0x30,0x34,0x00,0x56,0x31, 0x32,0x30,0x35,0x00,0x56,0x31,0x32,0x30,0x36,0x00,0x56,0x31,0x32,0x30,0x37,0x00, 0x56,0x31,0x32,0x30,0x38,0x00,0x56,0x31,0x32,0x30,0x39,0x00,0x56,0x31,0x32,0x31, 0x30,0x00,0x56,0x31,0x32,0x31,0x31,0x00,0x56,0x31,0x32,0x31,0x32,0x00,0x56,0x31, 0x32,0x31,0x33,0x00,0x56,0x31,0x32,0x31,0x34,0x00,0x56,0x31,0x32,0x31,0x35,0x00, 0x56,0x31,0x32,0x31,0x36,0x00,0x56,0x31,0x32,0x31,0x37,0x00,0x56,0x31,0x32,0x31, 0x38,0x00,0x56,0x31,0x32,0x31,0x39,0x00,0x56,0x31,0x32,0x32,0x30,0x00,0x56,0x31, 0x32,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x32,0x00,0x56,0x31,0x32,0x32,0x33,0x00, 0x56,0x31,0x32,0x32,0x34,0x00,0x56,0x31,0x32,0x32,0x35,0x00,0x56,0x31,0x32,0x32, 0x36,0x00,0x56,0x31,0x32,0x32,0x37,0x00,0x56,0x31,0x32,0x32,0x38,0x00,0x56,0x31, 0x32,0x32,0x39,0x00,0x56,0x31,0x32,0x33,0x30,0x00,0x56,0x31,0x32,0x33,0x31,0x00, 0x56,0x31,0x32,0x33,0x32,0x00,0x56,0x31,0x32,0x33,0x33,0x00,0x56,0x31,0x32,0x33, 0x34,0x00,0x56,0x31,0x32,0x33,0x35,0x00,0x56,0x31,0x32,0x33,0x36,0x00,0x56,0x31, 0x32,0x33,0x37,0x00,0x56,0x31,0x32,0x33,0x38,0x00,0x56,0x31,0x32,0x33,0x39,0x00, 0x56,0x31,0x32,0x34,0x30,0x00,0x56,0x31,0x32,0x34,0x31,0x00,0x56,0x31,0x32,0x34, 0x32,0x00,0x56,0x31,0x32,0x34,0x33,0x00,0x56,0x31,0x32,0x34,0x34,0x00,0x56,0x31, 0x32,0x34,0x35,0x00,0x56,0x31,0x32,0x34,0x36,0x00,0x56,0x31,0x32,0x34,0x37,0x00, 0x56,0x31,0x32,0x34,0x38,0x00,0x56,0x31,0x32,0x34,0x39,0x00,0x56,0x31,0x32,0x35, 0x30,0x00,0x56,0x31,0x32,0x35,0x31,0x00,0x56,0x31,0x32,0x35,0x32,0x00,0x56,0x31, 0x32,0x35,0x33,0x00,0x56,0x31,0x32,0x35,0x34,0x00,0x56,0x31,0x32,0x35,0x35,0x00, 0x56,0x31,0x32,0x35,0x36,0x00,0x56,0x31,0x32,0x35,0x37,0x00,0x56,0x31,0x32,0x35, 0x38,0x00,0x56,0x31,0x32,0x35,0x39,0x00,0x56,0x31,0x32,0x36,0x30,0x00,0x56,0x31, 0x32,0x36,0x31,0x00,0x56,0x31,0x32,0x36,0x32,0x00,0x56,0x31,0x32,0x36,0x33,0x00, 0x56,0x31,0x32,0x36,0x34,0x00,0x56,0x31,0x32,0x36,0x35,0x00,0x56,0x31,0x32,0x36, 0x36,0x00,0x56,0x31,0x32,0x36,0x37,0x00,0x56,0x31,0x32,0x36,0x38,0x00,0x56,0x31, 0x32,0x36,0x39,0x00,0x56,0x31,0x32,0x37,0x30,0x00,0x56,0x31,0x32,0x37,0x31,0x00, 0x56,0x31,0x32,0x37,0x32,0x00,0x56,0x31,0x32,0x37,0x33,0x00,0x56,0x31,0x32,0x37, 0x34,0x00,0x56,0x31,0x32,0x37,0x35,0x00,0x56,0x31,0x32,0x37,0x36,0x00,0x56,0x31, 0x32,0x37,0x37,0x00,0x56,0x31,0x32,0x37,0x38,0x00,0x56,0x31,0x32,0x37,0x39,0x00, 0x56,0x31,0x32,0x38,0x30,0x00,0x56,0x31,0x32,0x38,0x31,0x00,0x56,0x31,0x32,0x38, 0x32,0x00,0x56,0x31,0x32,0x38,0x33,0x00,0x56,0x31,0x32,0x38,0x34,0x00,0x56,0x31, 0x32,0x38,0x35,0x00,0x56,0x31,0x32,0x38,0x36,0x00,0x56,0x31,0x32,0x38,0x37,0x00, 0x56,0x31,0x32,0x38,0x38,0x00,0x56,0x31,0x32,0x38,0x39,0x00,0x56,0x31,0x32,0x39, 0x30,0x00,0x56,0x31,0x32,0x39,0x31,0x00,0x56,0x31,0x32,0x39,0x32,0x00,0x56,0x31, 0x32,0x39,0x33,0x00,0x56,0x31,0x32,0x39,0x34,0x00,0x56,0x31,0x32,0x39,0x35,0x00, 0x56,0x31,0x32,0x39,0x36,0x00,0x56,0x31,0x32,0x39,0x37,0x00,0x56,0x31,0x32,0x39, 0x38,0x00,0x56,0x31,0x32,0x39,0x39,0x00,0x56,0x31,0x33,0x30,0x30,0x00,0x56,0x31, 0x33,0x30,0x31,0x00,0x56,0x31,0x33,0x30,0x32,0x00,0x56,0x31,0x33,0x30,0x33,0x00, 0x56,0x31,0x33,0x30,0x34,0x00,0x56,0x31,0x33,0x30,0x35,0x00,0x56,0x31,0x33,0x30, 0x36,0x00,0x56,0x31,0x33,0x30,0x37,0x00,0x56,0x31,0x33,0x30,0x38,0x00,0x56,0x31, 0x33,0x30,0x39,0x00,0x56,0x31,0x33,0x31,0x30,0x00,0x56,0x31,0x33,0x31,0x31,0x00, 0x56,0x31,0x33,0x31,0x32,0x00,0x56,0x31,0x33,0x31,0x33,0x00,0x56,0x31,0x33,0x31, 0x34,0x00,0x56,0x31,0x33,0x31,0x35,0x00,0x56,0x31,0x33,0x31,0x36,0x00,0x56,0x31, 0x33,0x31,0x37,0x00,0x56,0x31,0x33,0x31,0x38,0x00,0x56,0x31,0x33,0x31,0x39,0x00, 0x56,0x31,0x33,0x32,0x30,0x00,0x56,0x31,0x33,0x32,0x31,0x00,0x56,0x31,0x33,0x32, 0x32,0x00,0x56,0x31,0x33,0x32,0x33,0x00,0x56,0x31,0x33,0x32,0x34,0x00,0x56,0x31, 0x33,0x32,0x35,0x00,0x56,0x31,0x33,0x32,0x36,0x00,0x56,0x31,0x33,0x32,0x37,0x00, 0x56,0x31,0x33,0x32,0x38,0x00,0x56,0x31,0x33,0x32,0x39,0x00,0x56,0x31,0x33,0x33, 0x30,0x00,0x56,0x31,0x33,0x33,0x31,0x00,0x56,0x31,0x33,0x33,0x32,0x00,0x56,0x31, 0x33,0x33,0x33,0x00,0x56,0x31,0x33,0x33,0x34,0x00,0x56,0x31,0x33,0x33,0x35,0x00, 0x56,0x31,0x33,0x33,0x36,0x00,0x56,0x31,0x33,0x33,0x37,0x00,0x56,0x31,0x33,0x33, 0x38,0x00,0x56,0x31,0x33,0x33,0x39,0x00,0x56,0x31,0x33,0x34,0x30,0x00,0x56,0x31, 0x33,0x34,0x31,0x00,0x56,0x31,0x33,0x34,0x32,0x00,0x56,0x31,0x33,0x34,0x33,0x00, 0x56,0x31,0x33,0x34,0x34,0x00,0x56,0x31,0x33,0x34,0x35,0x00,0x56,0x31,0x33,0x34, 0x36,0x00,0x56,0x31,0x33,0x34,0x37,0x00,0x56,0x31,0x33,0x34,0x38,0x00,0x56,0x31, 0x33,0x34,0x39,0x00,0x56,0x31,0x33,0x35,0x30,0x00,0x56,0x31,0x33,0x35,0x31,0x00, 0x56,0x31,0x33,0x35,0x32,0x00,0x56,0x31,0x33,0x35,0x33,0x00,0x56,0x31,0x33,0x35, 0x34,0x00,0x56,0x31,0x33,0x35,0x35,0x00,0x56,0x31,0x33,0x35,0x36,0x00,0x56,0x31, 0x33,0x35,0x37,0x00,0x56,0x31,0x33,0x35,0x38,0x00,0x56,0x31,0x33,0x35,0x39,0x00, 0x56,0x31,0x33,0x36,0x30,0x00,0x56,0x31,0x33,0x36,0x31,0x00,0x56,0x31,0x33,0x36, 0x32,0x00,0x56,0x31,0x33,0x36,0x33,0x00,0x56,0x31,0x33,0x36,0x34,0x00,0x56,0x31, 0x33,0x36,0x35,0x00,0x56,0x31,0x33,0x36,0x36,0x00,0x56,0x31,0x33,0x36,0x37,0x00, 0x56,0x31,0x33,0x36,0x38,0x00,0x56,0x31,0x33,0x36,0x39,0x00,0x56,0x31,0x33,0x37, 0x30,0x00,0x56,0x31,0x33,0x37,0x31,0x00,0x56,0x31,0x33,0x37,0x32,0x00,0x56,0x31, 0x33,0x37,0x33,0x00,0x56,0x31,0x33,0x37,0x34,0x00,0x56,0x31,0x33,0x37,0x35,0x00, 0x56,0x31,0x33,0x37,0x36,0x00,0x56,0x31,0x33,0x37,0x37,0x00,0x56,0x31,0x33,0x37, 0x38,0x00,0x56,0x31,0x33,0x37,0x39,0x00,0x56,0x31,0x33,0x38,0x30,0x00,0x56,0x31, 0x33,0x38,0x31,0x00,0x56,0x31,0x33,0x38,0x32,0x00,0x56,0x31,0x33,0x38,0x33,0x00, 0x56,0x31,0x33,0x38,0x34,0x00,0x56,0x31,0x33,0x38,0x35,0x00,0x56,0x31,0x33,0x38, 0x36,0x00,0x56,0x31,0x33,0x38,0x37,0x00,0x56,0x31,0x33,0x38,0x38,0x00,0x56,0x31, 0x33,0x38,0x39,0x00,0x56,0x31,0x33,0x39,0x30,0x00,0x56,0x31,0x33,0x39,0x31,0x00, 0x56,0x31,0x33,0x39,0x32,0x00,0x56,0x31,0x33,0x39,0x33,0x00,0x56,0x31,0x33,0x39, 0x34,0x00,0x56,0x31,0x33,0x39,0x35,0x00,0x56,0x31,0x33,0x39,0x36,0x00,0x56,0x31, 0x33,0x39,0x37,0x00,0x56,0x31,0x33,0x39,0x38,0x00,0x56,0x31,0x33,0x39,0x39,0x00, 0x56,0x31,0x34,0x30,0x30,0x00,0x56,0x31,0x34,0x30,0x31,0x00,0x56,0x31,0x34,0x30, 0x32,0x00,0x56,0x31,0x34,0x30,0x33,0x00,0x56,0x31,0x34,0x30,0x34,0x00,0x56,0x31, 0x34,0x30,0x35,0x00,0x56,0x31,0x34,0x30,0x36,0x00,0x56,0x31,0x34,0x30,0x37,0x00, 0x56,0x31,0x34,0x30,0x38,0x00,0x56,0x31,0x34,0x30,0x39,0x00,0x56,0x31,0x34,0x31, 0x30,0x00,0x56,0x31,0x34,0x31,0x31,0x00,0x56,0x31,0x34,0x31,0x32,0x00,0x56,0x31, 0x34,0x31,0x33,0x00,0x56,0x31,0x34,0x31,0x34,0x00,0x56,0x31,0x34,0x31,0x35,0x00, 0x56,0x31,0x34,0x31,0x36,0x00,0x56,0x31,0x34,0x31,0x37,0x00,0x56,0x31,0x34,0x31, 0x38,0x00,0x56,0x31,0x34,0x31,0x39,0x00,0x56,0x31,0x34,0x32,0x30,0x00,0x56,0x31, 0x34,0x32,0x31,0x00,0x56,0x31,0x34,0x32,0x32,0x00,0x56,0x31,0x34,0x32,0x33,0x00, 0x56,0x31,0x34,0x32,0x34,0x00,0x56,0x31,0x34,0x32,0x35,0x00,0x56,0x31,0x34,0x32, 0x36,0x00,0x56,0x31,0x34,0x32,0x37,0x00,0x56,0x31,0x34,0x32,0x38,0x00,0x56,0x31, 0x34,0x32,0x39,0x00,0x56,0x31,0x34,0x33,0x30,0x00,0x56,0x31,0x34,0x33,0x31,0x00, 0x56,0x31,0x34,0x33,0x32,0x00,0x56,0x31,0x34,0x33,0x33,0x00,0x56,0x31,0x34,0x33, 0x34,0x00,0x56,0x31,0x34,0x33,0x35,0x00,0x56,0x31,0x34,0x33,0x36,0x00,0x56,0x31, 0x34,0x33,0x37,0x00,0x56,0x31,0x34,0x33,0x38,0x00,0x56,0x31,0x34,0x33,0x39,0x00, 0x56,0x31,0x34,0x34,0x30,0x00,0x56,0x31,0x34,0x34,0x31,0x00,0x56,0x31,0x34,0x34, 0x32,0x00,0x56,0x31,0x34,0x34,0x33,0x00,0x56,0x31,0x34,0x34,0x34,0x00,0x56,0x31, 0x34,0x34,0x35,0x00,0x56,0x31,0x34,0x34,0x36,0x00,0x56,0x31,0x34,0x34,0x37,0x00, 0x56,0x31,0x34,0x34,0x38,0x00,0x56,0x31,0x34,0x34,0x39,0x00,0x56,0x31,0x34,0x35, 0x30,0x00,0x56,0x31,0x34,0x35,0x31,0x00,0x56,0x31,0x34,0x35,0x32,0x00,0x56,0x31, 0x34,0x35,0x33,0x00,0x56,0x31,0x34,0x35,0x34,0x00,0x56,0x31,0x34,0x35,0x35,0x00, 0x56,0x31,0x34,0x35,0x36,0x00,0x56,0x31,0x34,0x35,0x37,0x00,0x56,0x31,0x34,0x35, 0x38,0x00,0x56,0x31,0x34,0x35,0x39,0x00,0x56,0x31,0x34,0x36,0x30,0x00,0x56,0x31, 0x34,0x36,0x31,0x00,0x56,0x31,0x34,0x36,0x32,0x00,0x56,0x31,0x34,0x36,0x33,0x00, 0x56,0x31,0x34,0x36,0x34,0x00,0x56,0x31,0x34,0x36,0x35,0x00,0x56,0x31,0x34,0x36, 0x36,0x00,0x56,0x31,0x34,0x36,0x37,0x00,0x56,0x31,0x34,0x36,0x38,0x00,0x56,0x31, 0x34,0x36,0x39,0x00,0x56,0x31,0x34,0x37,0x30,0x00,0x56,0x31,0x34,0x37,0x31,0x00, 0x56,0x31,0x34,0x37,0x32,0x00,0x56,0x31,0x34,0x37,0x33,0x00,0x56,0x31,0x34,0x37, 0x34,0x00,0x56,0x31,0x34,0x37,0x35,0x00,0x56,0x31,0x34,0x37,0x36,0x00,0x56,0x31, 0x34,0x37,0x37,0x00,0x56,0x31,0x34,0x37,0x38,0x00,0x56,0x31,0x34,0x37,0x39,0x00, 0x56,0x31,0x34,0x38,0x30,0x00,0x56,0x31,0x34,0x38,0x31,0x00,0x56,0x31,0x34,0x38, 0x32,0x00,0x56,0x31,0x34,0x38,0x33,0x00,0x56,0x31,0x34,0x38,0x34,0x00,0x56,0x31, 0x34,0x38,0x35,0x00,0x56,0x31,0x34,0x38,0x36,0x00,0x56,0x31,0x34,0x38,0x37,0x00, 0x56,0x31,0x34,0x38,0x38,0x00,0x56,0x31,0x34,0x38,0x39,0x00,0x56,0x31,0x34,0x39, 0x30,0x00,0x56,0x31,0x34,0x39,0x31,0x00,0x56,0x31,0x34,0x39,0x32,0x00,0x56,0x31, 0x34,0x39,0x33,0x00,0x56,0x31,0x34,0x39,0x34,0x00,0x56,0x31,0x34,0x39,0x35,0x00, 0x56,0x31,0x34,0x39,0x36,0x00,0x56,0x31,0x34,0x39,0x37,0x00,0x56,0x31,0x34,0x39, 0x38,0x00,0x56,0x31,0x34,0x39,0x39,0x00,0x56,0x31,0x35,0x30,0x30,0x00,0x56,0x31, 0x35,0x30,0x31,0x00,0x56,0x31,0x35,0x30,0x32,0x00,0x56,0x31,0x35,0x30,0x33,0x00, 0x56,0x31,0x35,0x30,0x34,0x00,0x56,0x31,0x35,0x30,0x35,0x00,0x56,0x31,0x35,0x30, 0x36,0x00,0x56,0x31,0x35,0x30,0x37,0x00,0x56,0x31,0x35,0x30,0x38,0x00,0x56,0x31, 0x35,0x30,0x39,0x00,0x56,0x31,0x35,0x31,0x30,0x00,0x56,0x31,0x35,0x31,0x31,0x00, 0x56,0x31,0x35,0x31,0x32,0x00,0x56,0x31,0x35,0x31,0x33,0x00,0x56,0x31,0x35,0x31, 0x34,0x00,0x56,0x31,0x35,0x31,0x35,0x00,0x56,0x31,0x35,0x31,0x36,0x00,0x56,0x31, 0x35,0x31,0x37,0x00,0x56,0x31,0x35,0x31,0x38,0x00,0x56,0x31,0x35,0x31,0x39,0x00, 0x56,0x31,0x35,0x32,0x30,0x00,0x56,0x31,0x35,0x32,0x31,0x00,0x56,0x31,0x35,0x32, 0x32,0x00,0x56,0x31,0x35,0x32,0x33,0x00,0x56,0x31,0x35,0x32,0x34,0x00,0x56,0x31, 0x35,0x32,0x35,0x00,0x56,0x31,0x35,0x32,0x36,0x00,0x56,0x31,0x35,0x32,0x37,0x00, 0x56,0x31,0x35,0x32,0x38,0x00,0x56,0x31,0x35,0x32,0x39,0x00,0x56,0x31,0x35,0x33, 0x30,0x00,0x56,0x31,0x35,0x33,0x31,0x00,0x56,0x31,0x35,0x33,0x32,0x00,0x56,0x31, 0x35,0x33,0x33,0x00,0x56,0x31,0x35,0x33,0x34,0x00,0x56,0x31,0x35,0x33,0x35,0x00, 0x56,0x31,0x35,0x33,0x36,0x00,0x56,0x31,0x35,0x33,0x37,0x00,0x56,0x31,0x35,0x33, 0x38,0x00,0x56,0x31,0x35,0x33,0x39,0x00,0x56,0x31,0x35,0x34,0x30,0x00,0x56,0x31, 0x35,0x34,0x31,0x00,0x56,0x31,0x35,0x34,0x32,0x00,0x56,0x31,0x35,0x34,0x33,0x00, 0x56,0x31,0x35,0x34,0x34,0x00,0x56,0x31,0x35,0x34,0x35,0x00,0x56,0x31,0x35,0x34, 0x36,0x00,0x56,0x31,0x35,0x34,0x37,0x00,0x56,0x31,0x35,0x34,0x38,0x00,0x56,0x31, 0x35,0x34,0x39,0x00,0x56,0x31,0x35,0x35,0x30,0x00,0x56,0x31,0x35,0x35,0x31,0x00, 0x56,0x31,0x35,0x35,0x32,0x00,0x56,0x31,0x35,0x35,0x33,0x00,0x56,0x31,0x35,0x35, 0x34,0x00,0x56,0x31,0x35,0x35,0x35,0x00,0x56,0x31,0x35,0x35,0x36,0x00,0x56,0x31, 0x35,0x35,0x37,0x00,0x56,0x31,0x35,0x35,0x38,0x00,0x56,0x31,0x35,0x35,0x39,0x00, 0x56,0x31,0x35,0x36,0x30,0x00,0x56,0x31,0x35,0x36,0x31,0x00,0x56,0x31,0x35,0x36, 0x32,0x00,0x56,0x31,0x35,0x36,0x33,0x00,0x56,0x31,0x35,0x36,0x34,0x00,0x56,0x31, 0x35,0x36,0x35,0x00,0x56,0x31,0x35,0x36,0x36,0x00,0x56,0x31,0x35,0x36,0x37,0x00, 0x56,0x31,0x35,0x36,0x38,0x00,0x56,0x31,0x35,0x36,0x39,0x00,0x56,0x31,0x35,0x37, 0x30,0x00,0x56,0x31,0x35,0x37,0x31,0x00,0x56,0x31,0x35,0x37,0x32,0x00,0x56,0x31, 0x35,0x37,0x33,0x00,0x56,0x31,0x35,0x37,0x34,0x00,0x56,0x31,0x35,0x37,0x35,0x00, 0x56,0x31,0x35,0x37,0x36,0x00,0x56,0x31,0x35,0x37,0x37,0x00,0x56,0x31,0x35,0x37, 0x38,0x00,0x56,0x31,0x35,0x37,0x39,0x00,0x56,0x31,0x35,0x38,0x30,0x00,0x56,0x31, 0x35,0x38,0x31,0x00,0x56,0x31,0x35,0x38,0x32,0x00,0x56,0x31,0x35,0x38,0x33,0x00, 0x56,0x31,0x35,0x38,0x34,0x00,0x56,0x31,0x35,0x38,0x35,0x00,0x56,0x31,0x35,0x38, 0x36,0x00,0x56,0x31,0x35,0x38,0x37,0x00,0x56,0x31,0x35,0x38,0x38,0x00,0x56,0x31, 0x35,0x38,0x39,0x00,0x56,0x31,0x35,0x39,0x30,0x00,0x56,0x31,0x35,0x39,0x31,0x00, 0x56,0x31,0x35,0x39,0x32,0x00,0x56,0x31,0x35,0x39,0x33,0x00,0x56,0x31,0x35,0x39, 0x34,0x00,0x56,0x31,0x35,0x39,0x35,0x00,0x56,0x31,0x35,0x39,0x36,0x00,0x56,0x31, 0x35,0x39,0x37,0x00,0x56,0x31,0x35,0x39,0x38,0x00,0x56,0x31,0x35,0x39,0x39,0x00, 0x56,0x31,0x36,0x30,0x30,0x00,0x56,0x31,0x36,0x30,0x31,0x00,0x56,0x31,0x36,0x30, 0x32,0x00,0x56,0x31,0x36,0x30,0x33,0x00,0x56,0x31,0x36,0x30,0x34,0x00,0x56,0x31, 0x36,0x30,0x35,0x00,0x56,0x31,0x36,0x30,0x36,0x00,0x56,0x31,0x36,0x30,0x37,0x00, 0x56,0x31,0x36,0x30,0x38,0x00,0x56,0x31,0x36,0x30,0x39,0x00,0x56,0x31,0x36,0x31, 0x30,0x00,0x56,0x31,0x36,0x31,0x31,0x00,0x56,0x31,0x36,0x31,0x32,0x00,0x56,0x31, 0x36,0x31,0x33,0x00,0x56,0x31,0x36,0x31,0x34,0x00,0x56,0x31,0x36,0x31,0x35,0x00, 0x56,0x31,0x36,0x31,0x36,0x00,0x56,0x31,0x36,0x31,0x37,0x00,0x56,0x31,0x36,0x31, 0x38,0x00,0x56,0x31,0x36,0x31,0x39,0x00,0x56,0x31,0x36,0x32,0x30,0x00,0x56,0x31, 0x36,0x32,0x31,0x00,0x56,0x31,0x36,0x32,0x32,0x00,0x56,0x31,0x36,0x32,0x33,0x00, 0x56,0x31,0x36,0x32,0x34,0x00,0x56,0x31,0x36,0x32,0x35,0x00,0x56,0x31,0x36,0x32, 0x36,0x00,0x56,0x31,0x36,0x32,0x37,0x00,0x56,0x31,0x36,0x32,0x38,0x00,0x56,0x31, 0x36,0x32,0x39,0x00,0x56,0x31,0x36,0x33,0x30,0x00,0x56,0x31,0x36,0x33,0x31,0x00, 0x56,0x31,0x36,0x33,0x32,0x00,0x56,0x31,0x36,0x33,0x33,0x00,0x56,0x31,0x36,0x33, 0x34,0x00,0x56,0x31,0x36,0x33,0x35,0x00,0x56,0x31,0x36,0x33,0x36,0x00,0x56,0x31, 0x36,0x33,0x37,0x00,0x56,0x31,0x36,0x33,0x38,0x00,0x56,0x31,0x36,0x33,0x39,0x00, 0x56,0x31,0x36,0x34,0x30,0x00,0x56,0x31,0x36,0x34,0x31,0x00,0x56,0x31,0x36,0x34, 0x32,0x00,0x56,0x31,0x36,0x34,0x33,0x00,0x56,0x31,0x36,0x34,0x34,0x00,0x56,0x31, 0x36,0x34,0x35,0x00,0x56,0x31,0x36,0x34,0x36,0x00,0x56,0x31,0x36,0x34,0x37,0x00, 0x56,0x31,0x36,0x34,0x38,0x00,0x56,0x31,0x36,0x34,0x39,0x00,0x56,0x31,0x36,0x35, 0x30,0x00,0x56,0x31,0x36,0x35,0x31,0x00,0x56,0x31,0x36,0x35,0x32,0x00,0x56,0x31, 0x36,0x35,0x33,0x00,0x56,0x31,0x36,0x35,0x34,0x00,0x56,0x31,0x36,0x35,0x35,0x00, 0x56,0x31,0x36,0x35,0x36,0x00,0x56,0x31,0x36,0x35,0x37,0x00,0x56,0x31,0x36,0x35, 0x38,0x00,0x56,0x31,0x36,0x35,0x39,0x00,0x56,0x31,0x36,0x36,0x30,0x00,0x56,0x31, 0x36,0x36,0x31,0x00,0x56,0x31,0x36,0x36,0x32,0x00,0x56,0x31,0x36,0x36,0x33,0x00, 0x56,0x31,0x36,0x36,0x34,0x00,0x56,0x31,0x36,0x36,0x35,0x00,0x56,0x31,0x36,0x36, 0x36,0x00,0x56,0x31,0x36,0x36,0x37,0x00,0x56,0x31,0x36,0x36,0x38,0x00,0x56,0x31, 0x36,0x36,0x39,0x00,0x56,0x31,0x36,0x37,0x30,0x00,0x56,0x31,0x36,0x37,0x31,0x00, 0x56,0x31,0x36,0x37,0x32,0x00,0x56,0x31,0x36,0x37,0x33,0x00,0x56,0x31,0x36,0x37, 0x34,0x00,0x56,0x31,0x36,0x37,0x35,0x00,0x56,0x31,0x36,0x37,0x36,0x00,0x56,0x31, 0x36,0x37,0x37,0x00,0x56,0x31,0x36,0x37,0x38,0x00,0x56,0x31,0x36,0x37,0x39,0x00, 0x56,0x31,0x36,0x38,0x30,0x00,0x56,0x31,0x36,0x38,0x31,0x00,0x56,0x31,0x36,0x38, 0x32,0x00,0x56,0x31,0x36,0x38,0x33,0x00,0x56,0x31,0x36,0x38,0x34,0x00,0x56,0x31, 0x36,0x38,0x35,0x00,0x56,0x31,0x36,0x38,0x36,0x00,0x56,0x31,0x36,0x38,0x37,0x00, 0x56,0x31,0x36,0x38,0x38,0x00,0x56,0x31,0x36,0x38,0x39,0x00,0x56,0x31,0x36,0x39, 0x30,0x00,0x56,0x31,0x36,0x39,0x31,0x00,0x56,0x31,0x36,0x39,0x32,0x00,0x56,0x31, 0x36,0x39,0x33,0x00,0x56,0x31,0x36,0x39,0x34,0x00,0x56,0x31,0x36,0x39,0x35,0x00, 0x56,0x31,0x36,0x39,0x36,0x00,0x56,0x31,0x36,0x39,0x37,0x00,0x56,0x31,0x36,0x39, 0x38,0x00,0x56,0x31,0x36,0x39,0x39,0x00,0x56,0x31,0x37,0x30,0x30,0x00,0x56,0x31, 0x37,0x30,0x31,0x00,0x56,0x31,0x37,0x30,0x32,0x00,0x56,0x31,0x37,0x30,0x33,0x00, 0x56,0x31,0x37,0x30,0x34,0x00,0x56,0x31,0x37,0x30,0x35,0x00,0x56,0x31,0x37,0x30, 0x36,0x00,0x56,0x31,0x37,0x30,0x37,0x00,0x56,0x31,0x37,0x30,0x38,0x00,0x56,0x31, 0x37,0x30,0x39,0x00,0x56,0x31,0x37,0x31,0x30,0x00,0x56,0x31,0x37,0x31,0x31,0x00, 0x56,0x31,0x37,0x31,0x32,0x00,0x56,0x31,0x37,0x31,0x33,0x00,0x56,0x31,0x37,0x31, 0x34,0x00,0x56,0x31,0x37,0x31,0x35,0x00,0x56,0x31,0x37,0x31,0x36,0x00,0x56,0x31, 0x37,0x31,0x37,0x00,0x56,0x31,0x37,0x31,0x38,0x00,0x56,0x31,0x37,0x31,0x39,0x00, 0x56,0x31,0x37,0x32,0x30,0x00,0x56,0x31,0x37,0x32,0x31,0x00,0x56,0x31,0x37,0x32, 0x32,0x00,0x56,0x31,0x37,0x32,0x33,0x00,0x56,0x31,0x37,0x32,0x34,0x00,0x56,0x31, 0x37,0x32,0x35,0x00,0x56,0x31,0x37,0x32,0x36,0x00,0x56,0x31,0x37,0x32,0x37,0x00, 0x56,0x31,0x37,0x32,0x38,0x00,0x56,0x31,0x37,0x32,0x39,0x00,0x56,0x31,0x37,0x33, 0x30,0x00,0x56,0x31,0x37,0x33,0x31,0x00,0x56,0x31,0x37,0x33,0x32,0x00,0x56,0x31, 0x37,0x33,0x33,0x00,0x56,0x31,0x37,0x33,0x34,0x00,0x56,0x31,0x37,0x33,0x35,0x00, 0x56,0x31,0x37,0x33,0x36,0x00,0x56,0x31,0x37,0x33,0x37,0x00,0x56,0x31,0x37,0x33, 0x38,0x00,0x56,0x31,0x37,0x33,0x39,0x00,0x56,0x31,0x37,0x34,0x30,0x00,0x56,0x31, 0x37,0x34,0x31,0x00,0x56,0x31,0x37,0x34,0x32,0x00,0x56,0x31,0x37,0x34,0x33,0x00, 0x56,0x31,0x37,0x34,0x34,0x00,0x56,0x31,0x37,0x34,0x35,0x00,0x56,0x31,0x37,0x34, 0x36,0x00,0x56,0x31,0x37,0x34,0x37,0x00,0x56,0x31,0x37,0x34,0x38,0x00,0x56,0x31, 0x37,0x34,0x39,0x00,0x56,0x31,0x37,0x35,0x30,0x00,0x56,0x31,0x37,0x35,0x31,0x00, 0x56,0x31,0x37,0x35,0x32,0x00,0x56,0x31,0x37,0x35,0x33,0x00,0x56,0x31,0x37,0x35, 0x34,0x00,0x56,0x31,0x37,0x35,0x35,0x00,0x56,0x31,0x37,0x35,0x36,0x00,0x56,0x31, 0x37,0x35,0x37,0x00,0x56,0x31,0x37,0x35,0x38,0x00,0x56,0x31,0x37,0x35,0x39,0x00, 0x56,0x31,0x37,0x36,0x30,0x00,0x56,0x31,0x37,0x36,0x31,0x00,0x56,0x31,0x37,0x36, 0x32,0x00,0x56,0x31,0x37,0x36,0x33,0x00,0x56,0x31,0x37,0x36,0x34,0x00,0x56,0x31, 0x37,0x36,0x35,0x00,0x56,0x31,0x37,0x36,0x36,0x00,0x56,0x31,0x37,0x36,0x37,0x00, 0x56,0x31,0x37,0x36,0x38,0x00,0x56,0x31,0x37,0x36,0x39,0x00,0x56,0x31,0x37,0x37, 0x30,0x00,0x56,0x31,0x37,0x37,0x31,0x00,0x56,0x31,0x37,0x37,0x32,0x00,0x56,0x31, 0x37,0x37,0x33,0x00,0x56,0x31,0x37,0x37,0x34,0x00,0x56,0x31,0x37,0x37,0x35,0x00, 0x56,0x31,0x37,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x37,0x00,0x56,0x31,0x37,0x37, 0x38,0x00,0x56,0x31,0x37,0x37,0x39,0x00,0x56,0x31,0x37,0x38,0x30,0x00,0x56,0x31, 0x37,0x38,0x31,0x00,0x56,0x31,0x37,0x38,0x32,0x00,0x56,0x31,0x37,0x38,0x33,0x00, 0x56,0x31,0x37,0x38,0x34,0x00,0x56,0x31,0x37,0x38,0x35,0x00,0x56,0x31,0x37,0x38, 0x36,0x00,0x56,0x31,0x37,0x38,0x37,0x00,0x56,0x31,0x37,0x38,0x38,0x00,0x56,0x31, 0x37,0x38,0x39,0x00,0x56,0x31,0x37,0x39,0x30,0x00,0x56,0x31,0x37,0x39,0x31,0x00, 0x56,0x31,0x37,0x39,0x32,0x00,0x56,0x31,0x37,0x39,0x33,0x00,0x56,0x31,0x37,0x39, 0x34,0x00,0x56,0x31,0x37,0x39,0x35,0x00,0x56,0x31,0x37,0x39,0x36,0x00,0x56,0x31, 0x37,0x39,0x37,0x00,0x56,0x31,0x37,0x39,0x38,0x00,0x56,0x31,0x37,0x39,0x39,0x00, 0x56,0x31,0x38,0x30,0x30,0x00,0x56,0x31,0x38,0x30,0x31,0x00,0x56,0x31,0x38,0x30, 0x32,0x00,0x56,0x31,0x38,0x30,0x33,0x00,0x56,0x31,0x38,0x30,0x34,0x00,0x56,0x31, 0x38,0x30,0x35,0x00,0x56,0x31,0x38,0x30,0x36,0x00,0x56,0x31,0x38,0x30,0x37,0x00, 0x56,0x31,0x38,0x30,0x38,0x00,0x56,0x31,0x38,0x30,0x39,0x00,0x56,0x31,0x38,0x31, 0x30,0x00,0x56,0x31,0x38,0x31,0x31,0x00,0x56,0x31,0x38,0x31,0x32,0x00,0x56,0x31, 0x38,0x31,0x33,0x00,0x56,0x31,0x38,0x31,0x34,0x00,0x56,0x31,0x38,0x31,0x35,0x00, 0x56,0x31,0x38,0x31,0x36,0x00,0x56,0x31,0x38,0x31,0x37,0x00,0x56,0x31,0x38,0x31, 0x38,0x00,0x56,0x31,0x38,0x31,0x39,0x00,0x56,0x31,0x38,0x32,0x30,0x00,0x56,0x31, 0x38,0x32,0x31,0x00,0x56,0x31,0x38,0x32,0x32,0x00,0x56,0x31,0x38,0x32,0x33,0x00, 0x56,0x31,0x38,0x32,0x34,0x00,0x56,0x31,0x38,0x32,0x35,0x00,0x56,0x31,0x38,0x32, 0x36,0x00,0x56,0x31,0x38,0x32,0x37,0x00,0x56,0x31,0x38,0x32,0x38,0x00,0x56,0x31, 0x38,0x32,0x39,0x00,0x56,0x31,0x38,0x33,0x30,0x00,0x56,0x31,0x38,0x33,0x31,0x00, 0x56,0x31,0x38,0x33,0x32,0x00,0x56,0x31,0x38,0x33,0x33,0x00,0x56,0x31,0x38,0x33, 0x34,0x00,0x56,0x31,0x38,0x33,0x35,0x00,0x56,0x31,0x38,0x33,0x36,0x00,0x56,0x31, 0x38,0x33,0x37,0x00,0x56,0x31,0x38,0x33,0x38,0x00,0x56,0x31,0x38,0x33,0x39,0x00, 0x56,0x31,0x38,0x34,0x30,0x00,0x56,0x31,0x38,0x34,0x31,0x00,0x56,0x31,0x38,0x34, 0x32,0x00,0x56,0x31,0x38,0x34,0x33,0x00,0x56,0x31,0x38,0x34,0x34,0x00,0x56,0x31, 0x38,0x34,0x35,0x00,0x56,0x31,0x38,0x34,0x36,0x00,0x56,0x31,0x38,0x34,0x37,0x00, 0x56,0x31,0x38,0x34,0x38,0x00,0x56,0x31,0x38,0x34,0x39,0x00,0x56,0x31,0x38,0x35, 0x30,0x00,0x56,0x31,0x38,0x35,0x31,0x00,0x56,0x31,0x38,0x35,0x32,0x00,0x56,0x31, 0x38,0x35,0x33,0x00,0x56,0x31,0x38,0x35,0x34,0x00,0x56,0x31,0x38,0x35,0x35,0x00, 0x56,0x31,0x38,0x35,0x36,0x00,0x56,0x31,0x38,0x35,0x37,0x00,0x56,0x31,0x38,0x35, 0x38,0x00,0x56,0x31,0x38,0x35,0x39,0x00,0x56,0x31,0x38,0x36,0x30,0x00,0x56,0x31, 0x38,0x36,0x31,0x00,0x56,0x31,0x38,0x36,0x32,0x00,0x56,0x31,0x38,0x36,0x33,0x00, 0x56,0x31,0x38,0x36,0x34,0x00,0x56,0x31,0x38,0x36,0x35,0x00,0x56,0x31,0x38,0x36, 0x36,0x00,0x56,0x31,0x38,0x36,0x37,0x00,0x56,0x31,0x38,0x36,0x38,0x00,0x56,0x31, 0x38,0x36,0x39,0x00,0x56,0x31,0x38,0x37,0x30,0x00,0x56,0x31,0x38,0x37,0x31,0x00, 0x56,0x31,0x38,0x37,0x32,0x00,0x56,0x31,0x38,0x37,0x33,0x00,0x56,0x31,0x38,0x37, 0x34,0x00,0x56,0x31,0x38,0x37,0x35,0x00,0x56,0x31,0x38,0x37,0x36,0x00,0x56,0x31, 0x38,0x37,0x37,0x00,0x56,0x31,0x38,0x37,0x38,0x00,0x56,0x31,0x38,0x37,0x39,0x00, 0x56,0x31,0x38,0x38,0x30,0x00,0x56,0x31,0x38,0x38,0x31,0x00,0x56,0x31,0x38,0x38, 0x32,0x00,0x56,0x31,0x38,0x38,0x33,0x00,0x56,0x31,0x38,0x38,0x34,0x00,0x56,0x31, 0x38,0x38,0x35,0x00,0x56,0x31,0x38,0x38,0x36,0x00,0x56,0x31,0x38,0x38,0x37,0x00, 0x56,0x31,0x38,0x38,0x38,0x00,0x56,0x31,0x38,0x38,0x39,0x00,0x56,0x31,0x38,0x39, 0x30,0x00,0x56,0x31,0x38,0x39,0x31,0x00,0x56,0x31,0x38,0x39,0x32,0x00,0x56,0x31, 0x38,0x39,0x33,0x00,0x56,0x31,0x38,0x39,0x34,0x00,0x56,0x31,0x38,0x39,0x35,0x00, 0x56,0x31,0x38,0x39,0x36,0x00,0x56,0x31,0x38,0x39,0x37,0x00,0x56,0x31,0x38,0x39, 0x38,0x00,0x56,0x31,0x38,0x39,0x39,0x00,0x56,0x31,0x39,0x30,0x30,0x00,0x56,0x31, 0x39,0x30,0x31,0x00,0x56,0x31,0x39,0x30,0x32,0x00,0x56,0x31,0x39,0x30,0x33,0x00, 0x56,0x31,0x39,0x30,0x34,0x00,0x56,0x31,0x39,0x30,0x35,0x00,0x56,0x31,0x39,0x30, 0x36,0x00,0x56,0x31,0x39,0x30,0x37,0x00,0x56,0x31,0x39,0x30,0x38,0x00,0x56,0x31, 0x39,0x30,0x39,0x00,0x56,0x31,0x39,0x31,0x30,0x00,0x56,0x31,0x39,0x31,0x31,0x00, 0x56,0x31,0x39,0x31,0x32,0x00,0x56,0x31,0x39,0x31,0x33,0x00,0x56,0x31,0x39,0x31, 0x34,0x00,0x56,0x31,0x39,0x31,0x35,0x00,0x56,0x31,0x39,0x31,0x36,0x00,0x56,0x31, 0x39,0x31,0x37,0x00,0x56,0x31,0x39,0x31,0x38,0x00,0x56,0x31,0x39,0x31,0x39,0x00, 0x56,0x31,0x39,0x32,0x30,0x00,0x56,0x31,0x39,0x32,0x31,0x00,0x56,0x31,0x39,0x32, 0x32,0x00,0x56,0x31,0x39,0x32,0x33,0x00,0x56,0x31,0x39,0x32,0x34,0x00,0x56,0x31, 0x39,0x32,0x35,0x00,0x56,0x31,0x39,0x32,0x36,0x00,0x56,0x31,0x39,0x32,0x37,0x00, 0x56,0x31,0x39,0x32,0x38,0x00,0x56,0x31,0x39,0x32,0x39,0x00,0x56,0x31,0x39,0x33, 0x30,0x00,0x56,0x31,0x39,0x33,0x31,0x00,0x56,0x31,0x39,0x33,0x32,0x00,0x56,0x31, 0x39,0x33,0x33,0x00,0x56,0x31,0x39,0x33,0x34,0x00,0x56,0x31,0x39,0x33,0x35,0x00, 0x56,0x31,0x39,0x33,0x36,0x00,0x56,0x31,0x39,0x33,0x37,0x00,0x56,0x31,0x39,0x33, 0x38,0x00,0x56,0x31,0x39,0x33,0x39,0x00,0x56,0x31,0x39,0x34,0x30,0x00,0x56,0x31, 0x39,0x34,0x31,0x00,0x56,0x31,0x39,0x34,0x32,0x00,0x56,0x31,0x39,0x34,0x33,0x00, 0x56,0x31,0x39,0x34,0x34,0x00,0x56,0x31,0x39,0x34,0x35,0x00,0x56,0x31,0x39,0x34, 0x36,0x00,0x56,0x31,0x39,0x34,0x37,0x00,0x56,0x31,0x39,0x34,0x38,0x00,0x56,0x31, 0x39,0x34,0x39,0x00,0x56,0x31,0x39,0x35,0x30,0x00,0x56,0x31,0x39,0x35,0x31,0x00, 0x56,0x31,0x39,0x35,0x32,0x00,0x56,0x31,0x39,0x35,0x33,0x00,0x56,0x31,0x39,0x35, 0x34,0x00,0x56,0x31,0x39,0x35,0x35,0x00,0x56,0x31,0x39,0x35,0x36,0x00,0x56,0x31, 0x39,0x35,0x37,0x00,0x56,0x31,0x39,0x35,0x38,0x00,0x56,0x31,0x39,0x35,0x39,0x00, 0x56,0x31,0x39,0x36,0x30,0x00,0x56,0x31,0x39,0x36,0x31,0x00,0x56,0x31,0x39,0x36, 0x32,0x00,0x56,0x31,0x39,0x36,0x33,0x00,0x56,0x31,0x39,0x36,0x34,0x00,0x56,0x31, 0x39,0x36,0x35,0x00,0x56,0x31,0x39,0x36,0x36,0x00,0x56,0x31,0x39,0x36,0x37,0x00, 0x56,0x31,0x39,0x36,0x38,0x00,0x56,0x31,0x39,0x36,0x39,0x00,0x56,0x31,0x39,0x37, 0x30,0x00,0x56,0x31,0x39,0x37,0x31,0x00,0x56,0x31,0x39,0x37,0x32,0x00,0x56,0x31, 0x39,0x37,0x33,0x00,0x56,0x31,0x39,0x37,0x34,0x00,0x56,0x31,0x39,0x37,0x35,0x00, 0x56,0x31,0x39,0x37,0x36,0x00,0x56,0x31,0x39,0x37,0x37,0x00,0x56,0x31,0x39,0x37, 0x38,0x00,0x56,0x31,0x39,0x37,0x39,0x00,0x56,0x31,0x39,0x38,0x30,0x00,0x56,0x31, 0x39,0x38,0x31,0x00,0x56,0x31,0x39,0x38,0x32,0x00,0x56,0x31,0x39,0x38,0x33,0x00, 0x56,0x31,0x39,0x38,0x34,0x00,0x56,0x31,0x39,0x38,0x35,0x00,0x56,0x31,0x39,0x38, 0x36,0x00,0x56,0x31,0x39,0x38,0x37,0x00,0x56,0x31,0x39,0x38,0x38,0x00,0x56,0x31, 0x39,0x38,0x39,0x00,0x56,0x31,0x39,0x39,0x30,0x00,0x56,0x31,0x39,0x39,0x31,0x00, 0x56,0x31,0x39,0x39,0x32,0x00,0x56,0x31,0x39,0x39,0x33,0x00,0x56,0x31,0x39,0x39, 0x34,0x00,0x56,0x31,0x39,0x39,0x35,0x00,0x56,0x31,0x39,0x39,0x36,0x00,0x56,0x31, 0x39,0x39,0x37,0x00,0x56,0x31,0x39,0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x39,0x00, 0x56,0x32,0x30,0x30,0x30,0x00,0x56,0x32,0x30,0x30,0x31,0x00,0x56,0x32,0x30,0x30, 0x32,0x00,0x56,0x32,0x30,0x30,0x33,0x00,0x56,0x32,0x30,0x30,0x34,0x00,0x56,0x32, 0x30,0x30,0x35,0x00,0x56,0x32,0x30,0x30,0x36,0x00,0x56,0x32,0x30,0x30,0x37,0x00, 0x56,0x32,0x30,0x30,0x38,0x00,0x56,0x32,0x30,0x30,0x39,0x00,0x56,0x32,0x30,0x31, 0x30,0x00,0x56,0x32,0x30,0x31,0x31,0x00,0x56,0x32,0x30,0x31,0x32,0x00,0x56,0x32, 0x30,0x31,0x33,0x00,0x56,0x32,0x30,0x31,0x34,0x00,0x56,0x32,0x30,0x31,0x35,0x00, 0x56,0x32,0x30,0x31,0x36,0x00,0x56,0x32,0x30,0x31,0x37,0x00,0x56,0x32,0x30,0x31, 0x38,0x00,0x56,0x32,0x30,0x31,0x39,0x00,0x56,0x32,0x30,0x32,0x30,0x00,0x56,0x32, 0x30,0x32,0x31,0x00,0x56,0x32,0x30,0x32,0x32,0x00,0x56,0x32,0x30,0x32,0x33,0x00, 0x56,0x32,0x30,0x32,0x34,0x00,0x56,0x32,0x30,0x32,0x35,0x00,0x56,0x32,0x30,0x32, 0x36,0x00,0x56,0x32,0x30,0x32,0x37,0x00,0x56,0x32,0x30,0x32,0x38,0x00,0x56,0x32, 0x30,0x32,0x39,0x00,0x56,0x32,0x30,0x33,0x30,0x00,0x56,0x32,0x30,0x33,0x31,0x00, 0x56,0x32,0x30,0x33,0x32,0x00,0x56,0x32,0x30,0x33,0x33,0x00,0x56,0x32,0x30,0x33, 0x34,0x00,0x56,0x32,0x30,0x33,0x35,0x00,0x56,0x32,0x30,0x33,0x36,0x00,0x56,0x32, 0x30,0x33,0x37,0x00,0x56,0x32,0x30,0x33,0x38,0x00,0x56,0x32,0x30,0x33,0x39,0x00, 0x56,0x32,0x30,0x34,0x30,0x00,0x56,0x32,0x30,0x34,0x31,0x00,0x56,0x32,0x30,0x34, 0x32,0x00,0x56,0x32,0x30,0x34,0x33,0x00,0x56,0x32,0x30,0x34,0x34,0x00,0x56,0x32, 0x30,0x34,0x35,0x00,0x56,0x32,0x30,0x34,0x36,0x00,0x56,0x32,0x30,0x34,0x37,0x00, 0x56,0x32,0x30,0x34,0x38,0x00,0x56,0x32,0x30,0x34,0x39,0x00,0x56,0x32,0x30,0x35, 0x30,0x00,0x56,0x32,0x30,0x35,0x31,0x00,0x56,0x32,0x30,0x35,0x32,0x00,0x56,0x32, 0x30,0x35,0x33,0x00,0x56,0x32,0x30,0x35,0x34,0x00,0x56,0x32,0x30,0x35,0x35,0x00, 0x56,0x32,0x30,0x35,0x36,0x00,0x56,0x32,0x30,0x35,0x37,0x00,0x56,0x32,0x30,0x35, 0x38,0x00,0x56,0x32,0x30,0x35,0x39,0x00,0x56,0x32,0x30,0x36,0x30,0x00,0x56,0x32, 0x30,0x36,0x31,0x00,0x56,0x32,0x30,0x36,0x32,0x00,0x56,0x32,0x30,0x36,0x33,0x00, 0x56,0x32,0x30,0x36,0x34,0x00,0x56,0x32,0x30,0x36,0x35,0x00,0x56,0x32,0x30,0x36, 0x36,0x00,0x56,0x32,0x30,0x36,0x37,0x00,0x56,0x32,0x30,0x36,0x38,0x00,0x56,0x32, 0x30,0x36,0x39,0x00,0x56,0x32,0x30,0x37,0x30,0x00,0x56,0x32,0x30,0x37,0x31,0x00, 0x56,0x32,0x30,0x37,0x32,0x00,0x56,0x32,0x30,0x37,0x33,0x00,0x56,0x32,0x30,0x37, 0x34,0x00,0x56,0x32,0x30,0x37,0x35,0x00,0x56,0x32,0x30,0x37,0x36,0x00,0x56,0x32, 0x30,0x37,0x37,0x00,0x56,0x32,0x30,0x37,0x38,0x00,0x56,0x32,0x30,0x37,0x39,0x00, 0x56,0x32,0x30,0x38,0x30,0x00,0x56,0x32,0x30,0x38,0x31,0x00,0x56,0x32,0x30,0x38, 0x32,0x00,0x56,0x32,0x30,0x38,0x33,0x00,0x56,0x32,0x30,0x38,0x34,0x00,0x56,0x32, 0x30,0x38,0x35,0x00,0x56,0x32,0x30,0x38,0x36,0x00,0x56,0x32,0x30,0x38,0x37,0x00, 0x56,0x32,0x30,0x38,0x38,0x00,0x56,0x32,0x30,0x38,0x39,0x00,0x56,0x32,0x30,0x39, 0x30,0x00,0x56,0x32,0x30,0x39,0x31,0x00,0x56,0x32,0x30,0x39,0x32,0x00,0x56,0x32, 0x30,0x39,0x33,0x00,0x56,0x32,0x30,0x39,0x34,0x00,0x56,0x32,0x30,0x39,0x35,0x00, 0x56,0x32,0x30,0x39,0x36,0x00,0x56,0x32,0x30,0x39,0x37,0x00,0x56,0x32,0x30,0x39, 0x38,0x00,0x56,0x32,0x30,0x39,0x39,0x00,0x56,0x32,0x31,0x30,0x30,0x00,0x56,0x32, 0x31,0x30,0x31,0x00,0x56,0x32,0x31,0x30,0x32,0x00,0x56,0x32,0x31,0x30,0x33,0x00, 0x56,0x32,0x31,0x30,0x34,0x00,0x56,0x32,0x31,0x30,0x35,0x00,0x56,0x32,0x31,0x30, 0x36,0x00,0x56,0x32,0x31,0x30,0x37,0x00,0x56,0x32,0x31,0x30,0x38,0x00,0x56,0x32, 0x31,0x30,0x39,0x00,0x56,0x32,0x31,0x31,0x30,0x00,0x56,0x32,0x31,0x31,0x31,0x00, 0x56,0x32,0x31,0x31,0x32,0x00,0x56,0x32,0x31,0x31,0x33,0x00,0x56,0x32,0x31,0x31, 0x34,0x00,0x56,0x32,0x31,0x31,0x35,0x00,0x56,0x32,0x31,0x31,0x36,0x00,0x56,0x32, 0x31,0x31,0x37,0x00,0x56,0x32,0x31,0x31,0x38,0x00,0x56,0x32,0x31,0x31,0x39,0x00, 0x56,0x32,0x31,0x32,0x30,0x00,0x56,0x32,0x31,0x32,0x31,0x00,0x56,0x32,0x31,0x32, 0x32,0x00,0x56,0x32,0x31,0x32,0x33,0x00,0x56,0x32,0x31,0x32,0x34,0x00,0x56,0x32, 0x31,0x32,0x35,0x00,0x56,0x32,0x31,0x32,0x36,0x00,0x56,0x32,0x31,0x32,0x37,0x00, 0x56,0x32,0x31,0x32,0x38,0x00,0x56,0x32,0x31,0x32,0x39,0x00,0x56,0x32,0x31,0x33, 0x30,0x00,0x56,0x32,0x31,0x33,0x31,0x00,0x56,0x32,0x31,0x33,0x32,0x00,0x56,0x32, 0x31,0x33,0x33,0x00,0x56,0x32,0x31,0x33,0x34,0x00,0x56,0x32,0x31,0x33,0x35,0x00, 0x56,0x32,0x31,0x33,0x36,0x00,0x56,0x32,0x31,0x33,0x37,0x00,0x56,0x32,0x31,0x33, 0x38,0x00,0x56,0x32,0x31,0x33,0x39,0x00,0x56,0x32,0x31,0x34,0x30,0x00,0x56,0x32, 0x31,0x34,0x31,0x00,0x56,0x32,0x31,0x34,0x32,0x00,0x56,0x32,0x31,0x34,0x33,0x00, 0x56,0x32,0x31,0x34,0x34,0x00,0x56,0x32,0x31,0x34,0x35,0x00,0x56,0x32,0x31,0x34, 0x36,0x00,0x56,0x32,0x31,0x34,0x37,0x00,0x56,0x32,0x31,0x34,0x38,0x00,0x56,0x32, 0x31,0x34,0x39,0x00,0x56,0x32,0x31,0x35,0x30,0x00,0x56,0x32,0x31,0x35,0x31,0x00, 0x56,0x32,0x31,0x35,0x32,0x00,0x56,0x32,0x31,0x35,0x33,0x00,0x56,0x32,0x31,0x35, 0x34,0x00,0x56,0x32,0x31,0x35,0x35,0x00,0x56,0x32,0x31,0x35,0x36,0x00,0x56,0x32, 0x31,0x35,0x37,0x00,0x56,0x32,0x31,0x35,0x38,0x00,0x56,0x32,0x31,0x35,0x39,0x00, 0x56,0x32,0x31,0x36,0x30,0x00,0x56,0x32,0x31,0x36,0x31,0x00,0x56,0x32,0x31,0x36, 0x32,0x00,0x56,0x32,0x31,0x36,0x33,0x00,0x56,0x32,0x31,0x36,0x34,0x00,0x56,0x32, 0x31,0x36,0x35,0x00,0x56,0x32,0x31,0x36,0x36,0x00,0x56,0x32,0x31,0x36,0x37,0x00, 0x56,0x32,0x31,0x36,0x38,0x00,0x56,0x32,0x31,0x36,0x39,0x00,0x56,0x32,0x31,0x37, 0x30,0x00,0x56,0x32,0x31,0x37,0x31,0x00,0x56,0x32,0x31,0x37,0x32,0x00,0x56,0x32, 0x31,0x37,0x33,0x00,0x56,0x32,0x31,0x37,0x34,0x00,0x56,0x32,0x31,0x37,0x35,0x00, 0x56,0x32,0x31,0x37,0x36,0x00,0x56,0x32,0x31,0x37,0x37,0x00,0x56,0x32,0x31,0x37, 0x38,0x00,0x56,0x32,0x31,0x37,0x39,0x00,0x56,0x32,0x31,0x38,0x30,0x00,0x56,0x32, 0x31,0x38,0x31,0x00,0x56,0x32,0x31,0x38,0x32,0x00,0x56,0x32,0x31,0x38,0x33,0x00, 0x56,0x32,0x31,0x38,0x34,0x00,0x56,0x32,0x31,0x38,0x35,0x00,0x56,0x32,0x31,0x38, 0x36,0x00,0x56,0x32,0x31,0x38,0x37,0x00,0x56,0x32,0x31,0x38,0x38,0x00,0x56,0x32, 0x31,0x38,0x39,0x00,0x56,0x32,0x31,0x39,0x30,0x00,0x56,0x32,0x31,0x39,0x31,0x00, 0x56,0x32,0x31,0x39,0x32,0x00,0x56,0x32,0x31,0x39,0x33,0x00,0x56,0x32,0x31,0x39, 0x34,0x00,0x56,0x32,0x31,0x39,0x35,0x00,0x56,0x32,0x31,0x39,0x36,0x00,0x56,0x32, 0x31,0x39,0x37,0x00,0x56,0x32,0x31,0x39,0x38,0x00,0x56,0x32,0x31,0x39,0x39,0x00, 0x56,0x32,0x32,0x30,0x30,0x00,0x56,0x32,0x32,0x30,0x31,0x00,0x56,0x32,0x32,0x30, 0x32,0x00,0x56,0x32,0x32,0x30,0x33,0x00,0x56,0x32,0x32,0x30,0x34,0x00,0x56,0x32, 0x32,0x30,0x35,0x00,0x56,0x32,0x32,0x30,0x36,0x00,0x56,0x32,0x32,0x30,0x37,0x00, 0x56,0x32,0x32,0x30,0x38,0x00,0x56,0x32,0x32,0x30,0x39,0x00,0x56,0x32,0x32,0x31, 0x30,0x00,0x56,0x32,0x32,0x31,0x31,0x00,0x56,0x32,0x32,0x31,0x32,0x00,0x56,0x32, 0x32,0x31,0x33,0x00,0x56,0x32,0x32,0x31,0x34,0x00,0x56,0x32,0x32,0x31,0x35,0x00, 0x56,0x32,0x32,0x31,0x36,0x00,0x56,0x32,0x32,0x31,0x37,0x00,0x56,0x32,0x32,0x31, 0x38,0x00,0x56,0x32,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x32,0x30,0x00,0x56,0x32, 0x32,0x32,0x31,0x00,0x56,0x32,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x32,0x33,0x00, 0x56,0x32,0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x32, 0x36,0x00,0x56,0x32,0x32,0x32,0x37,0x00,0x56,0x32,0x32,0x32,0x38,0x00,0x56,0x32, 0x32,0x32,0x39,0x00,0x56,0x32,0x32,0x33,0x30,0x00,0x56,0x32,0x32,0x33,0x31,0x00, 0x56,0x32,0x32,0x33,0x32,0x00,0x56,0x32,0x32,0x33,0x33,0x00,0x56,0x32,0x32,0x33, 0x34,0x00,0x56,0x32,0x32,0x33,0x35,0x00,0x56,0x32,0x32,0x33,0x36,0x00,0x56,0x32, 0x32,0x33,0x37,0x00,0x56,0x32,0x32,0x33,0x38,0x00,0x56,0x32,0x32,0x33,0x39,0x00, 0x56,0x32,0x32,0x34,0x30,0x00,0x56,0x32,0x32,0x34,0x31,0x00,0x56,0x32,0x32,0x34, 0x32,0x00,0x56,0x32,0x32,0x34,0x33,0x00,0x56,0x32,0x32,0x34,0x34,0x00,0x56,0x32, 0x32,0x34,0x35,0x00,0x56,0x32,0x32,0x34,0x36,0x00,0x56,0x32,0x32,0x34,0x37,0x00, 0x56,0x32,0x32,0x34,0x38,0x00,0x56,0x32,0x32,0x34,0x39,0x00,0x56,0x32,0x32,0x35, 0x30,0x00,0x56,0x32,0x32,0x35,0x31,0x00,0x56,0x32,0x32,0x35,0x32,0x00,0x56,0x32, 0x32,0x35,0x33,0x00,0x56,0x32,0x32,0x35,0x34,0x00,0x56,0x32,0x32,0x35,0x35,0x00, 0x56,0x32,0x32,0x35,0x36,0x00,0x56,0x32,0x32,0x35,0x37,0x00,0x56,0x32,0x32,0x35, 0x38,0x00,0x56,0x32,0x32,0x35,0x39,0x00,0x56,0x32,0x32,0x36,0x30,0x00,0x56,0x32, 0x32,0x36,0x31,0x00,0x56,0x32,0x32,0x36,0x32,0x00,0x56,0x32,0x32,0x36,0x33,0x00, 0x56,0x32,0x32,0x36,0x34,0x00,0x56,0x32,0x32,0x36,0x35,0x00,0x56,0x32,0x32,0x36, 0x36,0x00,0x56,0x32,0x32,0x36,0x37,0x00,0x56,0x32,0x32,0x36,0x38,0x00,0x56,0x32, 0x32,0x36,0x39,0x00,0x56,0x32,0x32,0x37,0x30,0x00,0x56,0x32,0x32,0x37,0x31,0x00, 0x56,0x32,0x32,0x37,0x32,0x00,0x56,0x32,0x32,0x37,0x33,0x00,0x56,0x32,0x32,0x37, 0x34,0x00,0x56,0x32,0x32,0x37,0x35,0x00,0x56,0x32,0x32,0x37,0x36,0x00,0x56,0x32, 0x32,0x37,0x37,0x00,0x56,0x32,0x32,0x37,0x38,0x00,0x56,0x32,0x32,0x37,0x39,0x00, 0x56,0x32,0x32,0x38,0x30,0x00,0x56,0x32,0x32,0x38,0x31,0x00,0x56,0x32,0x32,0x38, 0x32,0x00,0x56,0x32,0x32,0x38,0x33,0x00,0x56,0x32,0x32,0x38,0x34,0x00,0x56,0x32, 0x32,0x38,0x35,0x00,0x56,0x32,0x32,0x38,0x36,0x00,0x56,0x32,0x32,0x38,0x37,0x00, 0x56,0x32,0x32,0x38,0x38,0x00,0x56,0x32,0x32,0x38,0x39,0x00,0x56,0x32,0x32,0x39, 0x30,0x00,0x56,0x32,0x32,0x39,0x31,0x00,0x56,0x32,0x32,0x39,0x32,0x00,0x56,0x32, 0x32,0x39,0x33,0x00,0x56,0x32,0x32,0x39,0x34,0x00,0x56,0x32,0x32,0x39,0x35,0x00, 0x56,0x32,0x32,0x39,0x36,0x00,0x56,0x32,0x32,0x39,0x37,0x00,0x56,0x32,0x32,0x39, 0x38,0x00,0x56,0x32,0x32,0x39,0x39,0x00,0x56,0x32,0x33,0x30,0x30,0x00,0x56,0x32, 0x33,0x30,0x31,0x00,0x56,0x32,0x33,0x30,0x32,0x00,0x56,0x32,0x33,0x30,0x33,0x00, 0x56,0x32,0x33,0x30,0x34,0x00,0x56,0x32,0x33,0x30,0x35,0x00,0x56,0x32,0x33,0x30, 0x36,0x00,0x56,0x32,0x33,0x30,0x37,0x00,0x56,0x32,0x33,0x30,0x38,0x00,0x56,0x32, 0x33,0x30,0x39,0x00,0x56,0x32,0x33,0x31,0x30,0x00,0x56,0x32,0x33,0x31,0x31,0x00, 0x56,0x32,0x33,0x31,0x32,0x00,0x56,0x32,0x33,0x31,0x33,0x00,0x56,0x32,0x33,0x31, 0x34,0x00,0x56,0x32,0x33,0x31,0x35,0x00,0x56,0x32,0x33,0x31,0x36,0x00,0x56,0x32, 0x33,0x31,0x37,0x00,0x56,0x32,0x33,0x31,0x38,0x00,0x56,0x32,0x33,0x31,0x39,0x00, 0x56,0x32,0x33,0x32,0x30,0x00,0x56,0x32,0x33,0x32,0x31,0x00,0x56,0x32,0x33,0x32, 0x32,0x00,0x56,0x32,0x33,0x32,0x33,0x00,0x56,0x32,0x33,0x32,0x34,0x00,0x56,0x32, 0x33,0x32,0x35,0x00,0x56,0x32,0x33,0x32,0x36,0x00,0x56,0x32,0x33,0x32,0x37,0x00, 0x56,0x32,0x33,0x32,0x38,0x00,0x56,0x32,0x33,0x32,0x39,0x00,0x56,0x32,0x33,0x33, 0x30,0x00,0x56,0x32,0x33,0x33,0x31,0x00,0x56,0x32,0x33,0x33,0x32,0x00,0x56,0x32, 0x33,0x33,0x33,0x00,0x56,0x32,0x33,0x33,0x34,0x00,0x56,0x32,0x33,0x33,0x35,0x00, 0x56,0x32,0x33,0x33,0x36,0x00,0x56,0x32,0x33,0x33,0x37,0x00,0x56,0x32,0x33,0x33, 0x38,0x00,0x56,0x32,0x33,0x33,0x39,0x00,0x56,0x32,0x33,0x34,0x30,0x00,0x56,0x32, 0x33,0x34,0x31,0x00,0x56,0x32,0x33,0x34,0x32,0x00,0x56,0x32,0x33,0x34,0x33,0x00, 0x56,0x32,0x33,0x34,0x34,0x00,0x56,0x32,0x33,0x34,0x35,0x00,0x56,0x32,0x33,0x34, 0x36,0x00,0x56,0x32,0x33,0x34,0x37,0x00,0x56,0x32,0x33,0x34,0x38,0x00,0x56,0x32, 0x33,0x34,0x39,0x00,0x56,0x32,0x33,0x35,0x30,0x00,0x56,0x32,0x33,0x35,0x31,0x00, 0x56,0x32,0x33,0x35,0x32,0x00,0x56,0x32,0x33,0x35,0x33,0x00,0x56,0x32,0x33,0x35, 0x34,0x00,0x56,0x32,0x33,0x35,0x35,0x00,0x56,0x32,0x33,0x35,0x36,0x00,0x56,0x32, 0x33,0x35,0x37,0x00,0x56,0x32,0x33,0x35,0x38,0x00,0x56,0x32,0x33,0x35,0x39,0x00, 0x56,0x32,0x33,0x36,0x30,0x00,0x56,0x32,0x33,0x36,0x31,0x00,0x56,0x32,0x33,0x36, 0x32,0x00,0x56,0x32,0x33,0x36,0x33,0x00,0x56,0x32,0x33,0x36,0x34,0x00,0x56,0x32, 0x33,0x36,0x35,0x00,0x56,0x32,0x33,0x36,0x36,0x00,0x56,0x32,0x33,0x36,0x37,0x00, 0x56,0x32,0x33,0x36,0x38,0x00,0x56,0x32,0x33,0x36,0x39,0x00,0x56,0x32,0x33,0x37, 0x30,0x00,0x56,0x32,0x33,0x37,0x31,0x00,0x56,0x32,0x33,0x37,0x32,0x00,0x56,0x32, 0x33,0x37,0x33,0x00,0x56,0x32,0x33,0x37,0x34,0x00,0x56,0x32,0x33,0x37,0x35,0x00, 0x56,0x32,0x33,0x37,0x36,0x00,0x56,0x32,0x33,0x37,0x37,0x00,0x56,0x32,0x33,0x37, 0x38,0x00,0x56,0x32,0x33,0x37,0x39,0x00,0x56,0x32,0x33,0x38,0x30,0x00,0x56,0x32, 0x33,0x38,0x31,0x00,0x56,0x32,0x33,0x38,0x32,0x00,0x56,0x32,0x33,0x38,0x33,0x00, 0x56,0x32,0x33,0x38,0x34,0x00,0x56,0x32,0x33,0x38,0x35,0x00,0x56,0x32,0x33,0x38, 0x36,0x00,0x56,0x32,0x33,0x38,0x37,0x00,0x56,0x32,0x33,0x38,0x38,0x00,0x56,0x32, 0x33,0x38,0x39,0x00,0x56,0x32,0x33,0x39,0x30,0x00,0x56,0x32,0x33,0x39,0x31,0x00, 0x56,0x32,0x33,0x39,0x32,0x00,0x56,0x32,0x33,0x39,0x33,0x00,0x56,0x32,0x33,0x39, 0x34,0x00,0x56,0x32,0x33,0x39,0x35,0x00,0x56,0x32,0x33,0x39,0x36,0x00,0x56,0x32, 0x33,0x39,0x37,0x00,0x56,0x32,0x33,0x39,0x38,0x00,0x56,0x32,0x33,0x39,0x39,0x00, 0x56,0x32,0x34,0x30,0x30,0x00,0x56,0x32,0x34,0x30,0x31,0x00,0x56,0x32,0x34,0x30, 0x32,0x00,0x56,0x32,0x34,0x30,0x33,0x00,0x56,0x32,0x34,0x30,0x34,0x00,0x56,0x32, 0x34,0x30,0x35,0x00,0x56,0x32,0x34,0x30,0x36,0x00,0x56,0x32,0x34,0x30,0x37,0x00, 0x56,0x32,0x34,0x30,0x38,0x00,0x56,0x32,0x34,0x30,0x39,0x00,0x56,0x32,0x34,0x31, 0x30,0x00,0x56,0x32,0x34,0x31,0x31,0x00,0x56,0x32,0x34,0x31,0x32,0x00,0x56,0x32, 0x34,0x31,0x33,0x00,0x56,0x32,0x34,0x31,0x34,0x00,0x56,0x32,0x34,0x31,0x35,0x00, 0x56,0x32,0x34,0x31,0x36,0x00,0x56,0x32,0x34,0x31,0x37,0x00,0x56,0x32,0x34,0x31, 0x38,0x00,0x56,0x32,0x34,0x31,0x39,0x00,0x56,0x32,0x34,0x32,0x30,0x00,0x56,0x32, 0x34,0x32,0x31,0x00,0x56,0x32,0x34,0x32,0x32,0x00,0x56,0x32,0x34,0x32,0x33,0x00, 0x56,0x32,0x34,0x32,0x34,0x00,0x56,0x32,0x34,0x32,0x35,0x00,0x56,0x32,0x34,0x32, 0x36,0x00,0x56,0x32,0x34,0x32,0x37,0x00,0x56,0x32,0x34,0x32,0x38,0x00,0x56,0x32, 0x34,0x32,0x39,0x00,0x56,0x32,0x34,0x33,0x30,0x00,0x56,0x32,0x34,0x33,0x31,0x00, 0x56,0x32,0x34,0x33,0x32,0x00,0x56,0x32,0x34,0x33,0x33,0x00,0x56,0x32,0x34,0x33, 0x34,0x00,0x56,0x32,0x34,0x33,0x35,0x00,0x56,0x32,0x34,0x33,0x36,0x00,0x56,0x32, 0x34,0x33,0x37,0x00,0x56,0x32,0x34,0x33,0x38,0x00,0x56,0x32,0x34,0x33,0x39,0x00, 0x56,0x32,0x34,0x34,0x30,0x00,0x56,0x32,0x34,0x34,0x31,0x00,0x56,0x32,0x34,0x34, 0x32,0x00,0x56,0x32,0x34,0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x34,0x00,0x56,0x32, 0x34,0x34,0x35,0x00,0x56,0x32,0x34,0x34,0x36,0x00,0x56,0x32,0x34,0x34,0x37,0x00, 0x56,0x32,0x34,0x34,0x38,0x00,0x56,0x32,0x34,0x34,0x39,0x00,0x56,0x32,0x34,0x35, 0x30,0x00,0x56,0x32,0x34,0x35,0x31,0x00,0x56,0x32,0x34,0x35,0x32,0x00,0x56,0x32, 0x34,0x35,0x33,0x00,0x56,0x32,0x34,0x35,0x34,0x00,0x56,0x32,0x34,0x35,0x35,0x00, 0x56,0x32,0x34,0x35,0x36,0x00,0x56,0x32,0x34,0x35,0x37,0x00,0x56,0x32,0x34,0x35, 0x38,0x00,0x56,0x32,0x34,0x35,0x39,0x00,0x56,0x32,0x34,0x36,0x30,0x00,0x56,0x32, 0x34,0x36,0x31,0x00,0x56,0x32,0x34,0x36,0x32,0x00,0x56,0x32,0x34,0x36,0x33,0x00, 0x56,0x32,0x34,0x36,0x34,0x00,0x56,0x32,0x34,0x36,0x35,0x00,0x56,0x32,0x34,0x36, 0x36,0x00,0x56,0x32,0x34,0x36,0x37,0x00,0x56,0x32,0x34,0x36,0x38,0x00,0x56,0x32, 0x34,0x36,0x39,0x00,0x56,0x32,0x34,0x37,0x30,0x00,0x56,0x32,0x34,0x37,0x31,0x00, 0x56,0x32,0x34,0x37,0x32,0x00,0x56,0x32,0x34,0x37,0x33,0x00,0x56,0x32,0x34,0x37, 0x34,0x00,0x56,0x32,0x34,0x37,0x35,0x00,0x56,0x32,0x34,0x37,0x36,0x00,0x56,0x32, 0x34,0x37,0x37,0x00,0x56,0x32,0x34,0x37,0x38,0x00,0x56,0x32,0x34,0x37,0x39,0x00, 0x56,0x32,0x34,0x38,0x30,0x00,0x56,0x32,0x34,0x38,0x31,0x00,0x56,0x32,0x34,0x38, 0x32,0x00,0x56,0x32,0x34,0x38,0x33,0x00,0x56,0x32,0x34,0x38,0x34,0x00,0x56,0x32, 0x34,0x38,0x35,0x00,0x56,0x32,0x34,0x38,0x36,0x00,0x56,0x32,0x34,0x38,0x37,0x00, 0x56,0x32,0x34,0x38,0x38,0x00,0x56,0x32,0x34,0x38,0x39,0x00,0x56,0x32,0x34,0x39, 0x30,0x00,0x56,0x32,0x34,0x39,0x31,0x00,0x56,0x32,0x34,0x39,0x32,0x00,0x56,0x32, 0x34,0x39,0x33,0x00,0x56,0x32,0x34,0x39,0x34,0x00,0x56,0x32,0x34,0x39,0x35,0x00, 0x56,0x32,0x34,0x39,0x36,0x00,0x56,0x32,0x34,0x39,0x37,0x00,0x56,0x32,0x34,0x39, 0x38,0x00,0x56,0x32,0x34,0x39,0x39,0x00,0x56,0x32,0x35,0x30,0x30,0x00,0x56,0x32, 0x35,0x30,0x31,0x00,0x56,0x32,0x35,0x30,0x32,0x00,0x56,0x32,0x35,0x30,0x33,0x00, 0x56,0x32,0x35,0x30,0x34,0x00,0x56,0x32,0x35,0x30,0x35,0x00,0x56,0x32,0x35,0x30, 0x36,0x00,0x56,0x32,0x35,0x30,0x37,0x00,0x56,0x32,0x35,0x30,0x38,0x00,0x56,0x32, 0x35,0x30,0x39,0x00,0x56,0x32,0x35,0x31,0x30,0x00,0x56,0x32,0x35,0x31,0x31,0x00, 0x56,0x32,0x35,0x31,0x32,0x00,0x56,0x32,0x35,0x31,0x33,0x00,0x56,0x32,0x35,0x31, 0x34,0x00,0x56,0x32,0x35,0x31,0x35,0x00,0x56,0x32,0x35,0x31,0x36,0x00,0x56,0x32, 0x35,0x31,0x37,0x00,0x56,0x32,0x35,0x31,0x38,0x00,0x56,0x32,0x35,0x31,0x39,0x00, 0x56,0x32,0x35,0x32,0x30,0x00,0x56,0x32,0x35,0x32,0x31,0x00,0x56,0x32,0x35,0x32, 0x32,0x00,0x56,0x32,0x35,0x32,0x33,0x00,0x56,0x32,0x35,0x32,0x34,0x00,0x56,0x32, 0x35,0x32,0x35,0x00,0x56,0x32,0x35,0x32,0x36,0x00,0x56,0x32,0x35,0x32,0x37,0x00, 0x56,0x32,0x35,0x32,0x38,0x00,0x56,0x32,0x35,0x32,0x39,0x00,0x56,0x32,0x35,0x33, 0x30,0x00,0x56,0x32,0x35,0x33,0x31,0x00,0x56,0x32,0x35,0x33,0x32,0x00,0x56,0x32, 0x35,0x33,0x33,0x00,0x56,0x32,0x35,0x33,0x34,0x00,0x56,0x32,0x35,0x33,0x35,0x00, 0x56,0x32,0x35,0x33,0x36,0x00,0x56,0x32,0x35,0x33,0x37,0x00,0x56,0x32,0x35,0x33, 0x38,0x00,0x56,0x32,0x35,0x33,0x39,0x00,0x56,0x32,0x35,0x34,0x30,0x00,0x56,0x32, 0x35,0x34,0x31,0x00,0x56,0x32,0x35,0x34,0x32,0x00,0x56,0x32,0x35,0x34,0x33,0x00, 0x56,0x32,0x35,0x34,0x34,0x00,0x56,0x32,0x35,0x34,0x35,0x00,0x56,0x32,0x35,0x34, 0x36,0x00,0x56,0x32,0x35,0x34,0x37,0x00,0x56,0x32,0x35,0x34,0x38,0x00,0x56,0x32, 0x35,0x34,0x39,0x00,0x56,0x32,0x35,0x35,0x30,0x00,0x56,0x32,0x35,0x35,0x31,0x00, 0x56,0x32,0x35,0x35,0x32,0x00,0x56,0x32,0x35,0x35,0x33,0x00,0x56,0x32,0x35,0x35, 0x34,0x00,0x56,0x32,0x35,0x35,0x35,0x00,0x56,0x32,0x35,0x35,0x36,0x00,0x56,0x32, 0x35,0x35,0x37,0x00,0x56,0x32,0x35,0x35,0x38,0x00,0x56,0x32,0x35,0x35,0x39,0x00, 0x56,0x32,0x35,0x36,0x30,0x00,0x56,0x32,0x35,0x36,0x31,0x00,0x56,0x32,0x35,0x36, 0x32,0x00,0x56,0x32,0x35,0x36,0x33,0x00,0x56,0x32,0x35,0x36,0x34,0x00,0x56,0x32, 0x35,0x36,0x35,0x00,0x56,0x32,0x35,0x36,0x36,0x00,0x56,0x32,0x35,0x36,0x37,0x00, 0x56,0x32,0x35,0x36,0x38,0x00,0x56,0x32,0x35,0x36,0x39,0x00,0x56,0x32,0x35,0x37, 0x30,0x00,0x56,0x32,0x35,0x37,0x31,0x00,0x56,0x32,0x35,0x37,0x32,0x00,0x56,0x32, 0x35,0x37,0x33,0x00,0x56,0x32,0x35,0x37,0x34,0x00,0x56,0x32,0x35,0x37,0x35,0x00, 0x56,0x32,0x35,0x37,0x36,0x00,0x56,0x32,0x35,0x37,0x37,0x00,0x56,0x32,0x35,0x37, 0x38,0x00,0x56,0x32,0x35,0x37,0x39,0x00,0x56,0x32,0x35,0x38,0x30,0x00,0x56,0x32, 0x35,0x38,0x31,0x00,0x56,0x32,0x35,0x38,0x32,0x00,0x56,0x32,0x35,0x38,0x33,0x00, 0x56,0x32,0x35,0x38,0x34,0x00,0x56,0x32,0x35,0x38,0x35,0x00,0x56,0x32,0x35,0x38, 0x36,0x00,0x56,0x32,0x35,0x38,0x37,0x00,0x56,0x32,0x35,0x38,0x38,0x00,0x56,0x32, 0x35,0x38,0x39,0x00,0x56,0x32,0x35,0x39,0x30,0x00,0x56,0x32,0x35,0x39,0x31,0x00, 0x56,0x32,0x35,0x39,0x32,0x00,0x56,0x32,0x35,0x39,0x33,0x00,0x56,0x32,0x35,0x39, 0x34,0x00,0x56,0x32,0x35,0x39,0x35,0x00,0x56,0x32,0x35,0x39,0x36,0x00,0x56,0x32, 0x35,0x39,0x37,0x00,0x56,0x32,0x35,0x39,0x38,0x00,0x56,0x32,0x35,0x39,0x39,0x00, 0x56,0x32,0x36,0x30,0x30,0x00,0x56,0x32,0x36,0x30,0x31,0x00,0x56,0x32,0x36,0x30, 0x32,0x00,0x56,0x32,0x36,0x30,0x33,0x00,0x56,0x32,0x36,0x30,0x34,0x00,0x56,0x32, 0x36,0x30,0x35,0x00,0x56,0x32,0x36,0x30,0x36,0x00,0x56,0x32,0x36,0x30,0x37,0x00, 0x56,0x32,0x36,0x30,0x38,0x00,0x56,0x32,0x36,0x30,0x39,0x00,0x56,0x32,0x36,0x31, 0x30,0x00,0x56,0x32,0x36,0x31,0x31,0x00,0x56,0x32,0x36,0x31,0x32,0x00,0x56,0x32, 0x36,0x31,0x33,0x00,0x56,0x32,0x36,0x31,0x34,0x00,0x56,0x32,0x36,0x31,0x35,0x00, 0x56,0x32,0x36,0x31,0x36,0x00,0x56,0x32,0x36,0x31,0x37,0x00,0x56,0x32,0x36,0x31, 0x38,0x00,0x56,0x32,0x36,0x31,0x39,0x00,0x56,0x32,0x36,0x32,0x30,0x00,0x56,0x32, 0x36,0x32,0x31,0x00,0x56,0x32,0x36,0x32,0x32,0x00,0x56,0x32,0x36,0x32,0x33,0x00, 0x56,0x32,0x36,0x32,0x34,0x00,0x56,0x32,0x36,0x32,0x35,0x00,0x56,0x32,0x36,0x32, 0x36,0x00,0x56,0x32,0x36,0x32,0x37,0x00,0x56,0x32,0x36,0x32,0x38,0x00,0x56,0x32, 0x36,0x32,0x39,0x00,0x56,0x32,0x36,0x33,0x30,0x00,0x56,0x32,0x36,0x33,0x31,0x00, 0x56,0x32,0x36,0x33,0x32,0x00,0x56,0x32,0x36,0x33,0x33,0x00,0x56,0x32,0x36,0x33, 0x34,0x00,0x56,0x32,0x36,0x33,0x35,0x00,0x56,0x32,0x36,0x33,0x36,0x00,0x56,0x32, 0x36,0x33,0x37,0x00,0x56,0x32,0x36,0x33,0x38,0x00,0x56,0x32,0x36,0x33,0x39,0x00, 0x56,0x32,0x36,0x34,0x30,0x00,0x56,0x32,0x36,0x34,0x31,0x00,0x56,0x32,0x36,0x34, 0x32,0x00,0x56,0x32,0x36,0x34,0x33,0x00,0x56,0x32,0x36,0x34,0x34,0x00,0x56,0x32, 0x36,0x34,0x35,0x00,0x56,0x32,0x36,0x34,0x36,0x00,0x56,0x32,0x36,0x34,0x37,0x00, 0x56,0x32,0x36,0x34,0x38,0x00,0x56,0x32,0x36,0x34,0x39,0x00,0x56,0x32,0x36,0x35, 0x30,0x00,0x56,0x32,0x36,0x35,0x31,0x00,0x56,0x32,0x36,0x35,0x32,0x00,0x56,0x32, 0x36,0x35,0x33,0x00,0x56,0x32,0x36,0x35,0x34,0x00,0x56,0x32,0x36,0x35,0x35,0x00, 0x56,0x32,0x36,0x35,0x36,0x00,0x56,0x32,0x36,0x35,0x37,0x00,0x56,0x32,0x36,0x35, 0x38,0x00,0x56,0x32,0x36,0x35,0x39,0x00,0x56,0x32,0x36,0x36,0x30,0x00,0x56,0x32, 0x36,0x36,0x31,0x00,0x56,0x32,0x36,0x36,0x32,0x00,0x56,0x32,0x36,0x36,0x33,0x00, 0x56,0x32,0x36,0x36,0x34,0x00,0x56,0x32,0x36,0x36,0x35,0x00,0x56,0x32,0x36,0x36, 0x36,0x00,0x56,0x32,0x36,0x36,0x37,0x00,0x56,0x32,0x36,0x36,0x38,0x00,0x56,0x32, 0x36,0x36,0x39,0x00,0x56,0x32,0x36,0x37,0x30,0x00,0x56,0x32,0x36,0x37,0x31,0x00, 0x56,0x32,0x36,0x37,0x32,0x00,0x56,0x32,0x36,0x37,0x33,0x00,0x56,0x32,0x36,0x37, 0x34,0x00,0x56,0x32,0x36,0x37,0x35,0x00,0x56,0x32,0x36,0x37,0x36,0x00,0x56,0x32, 0x36,0x37,0x37,0x00,0x56,0x32,0x36,0x37,0x38,0x00,0x56,0x32,0x36,0x37,0x39,0x00, 0x56,0x32,0x36,0x38,0x30,0x00,0x56,0x32,0x36,0x38,0x31,0x00,0x56,0x32,0x36,0x38, 0x32,0x00,0x56,0x32,0x36,0x38,0x33,0x00,0x56,0x32,0x36,0x38,0x34,0x00,0x56,0x32, 0x36,0x38,0x35,0x00,0x56,0x32,0x36,0x38,0x36,0x00,0x56,0x32,0x36,0x38,0x37,0x00, 0x56,0x32,0x36,0x38,0x38,0x00,0x56,0x32,0x36,0x38,0x39,0x00,0x56,0x32,0x36,0x39, 0x30,0x00,0x56,0x32,0x36,0x39,0x31,0x00,0x56,0x32,0x36,0x39,0x32,0x00,0x56,0x32, 0x36,0x39,0x33,0x00,0x56,0x32,0x36,0x39,0x34,0x00,0x56,0x32,0x36,0x39,0x35,0x00, 0x56,0x32,0x36,0x39,0x36,0x00,0x56,0x32,0x36,0x39,0x37,0x00,0x56,0x32,0x36,0x39, 0x38,0x00,0x56,0x32,0x36,0x39,0x39,0x00,0x56,0x32,0x37,0x30,0x30,0x00,0x56,0x32, 0x37,0x30,0x31,0x00,0x56,0x32,0x37,0x30,0x32,0x00,0x56,0x32,0x37,0x30,0x33,0x00, 0x56,0x32,0x37,0x30,0x34,0x00,0x56,0x32,0x37,0x30,0x35,0x00,0x56,0x32,0x37,0x30, 0x36,0x00,0x56,0x32,0x37,0x30,0x37,0x00,0x56,0x32,0x37,0x30,0x38,0x00,0x56,0x32, 0x37,0x30,0x39,0x00,0x56,0x32,0x37,0x31,0x30,0x00,0x56,0x32,0x37,0x31,0x31,0x00, 0x56,0x32,0x37,0x31,0x32,0x00,0x56,0x32,0x37,0x31,0x33,0x00,0x56,0x32,0x37,0x31, 0x34,0x00,0x56,0x32,0x37,0x31,0x35,0x00,0x56,0x32,0x37,0x31,0x36,0x00,0x56,0x32, 0x37,0x31,0x37,0x00,0x56,0x32,0x37,0x31,0x38,0x00,0x56,0x32,0x37,0x31,0x39,0x00, 0x56,0x32,0x37,0x32,0x30,0x00,0x56,0x32,0x37,0x32,0x31,0x00,0x56,0x32,0x37,0x32, 0x32,0x00,0x56,0x32,0x37,0x32,0x33,0x00,0x56,0x32,0x37,0x32,0x34,0x00,0x56,0x32, 0x37,0x32,0x35,0x00,0x56,0x32,0x37,0x32,0x36,0x00,0x56,0x32,0x37,0x32,0x37,0x00, 0x56,0x32,0x37,0x32,0x38,0x00,0x56,0x32,0x37,0x32,0x39,0x00,0x56,0x32,0x37,0x33, 0x30,0x00,0x56,0x32,0x37,0x33,0x31,0x00,0x56,0x32,0x37,0x33,0x32,0x00,0x56,0x32, 0x37,0x33,0x33,0x00,0x56,0x32,0x37,0x33,0x34,0x00,0x56,0x32,0x37,0x33,0x35,0x00, 0x56,0x32,0x37,0x33,0x36,0x00,0x56,0x32,0x37,0x33,0x37,0x00,0x56,0x32,0x37,0x33, 0x38,0x00,0x56,0x32,0x37,0x33,0x39,0x00,0x56,0x32,0x37,0x34,0x30,0x00,0x56,0x32, 0x37,0x34,0x31,0x00,0x56,0x32,0x37,0x34,0x32,0x00,0x56,0x32,0x37,0x34,0x33,0x00, 0x56,0x32,0x37,0x34,0x34,0x00,0x56,0x32,0x37,0x34,0x35,0x00,0x56,0x32,0x37,0x34, 0x36,0x00,0x56,0x32,0x37,0x34,0x37,0x00,0x56,0x32,0x37,0x34,0x38,0x00,0x56,0x32, 0x37,0x34,0x39,0x00,0x56,0x32,0x37,0x35,0x30,0x00,0x56,0x32,0x37,0x35,0x31,0x00, 0x56,0x32,0x37,0x35,0x32,0x00,0x56,0x32,0x37,0x35,0x33,0x00,0x56,0x32,0x37,0x35, 0x34,0x00,0x56,0x32,0x37,0x35,0x35,0x00,0x56,0x32,0x37,0x35,0x36,0x00,0x56,0x32, 0x37,0x35,0x37,0x00,0x56,0x32,0x37,0x35,0x38,0x00,0x56,0x32,0x37,0x35,0x39,0x00, 0x56,0x32,0x37,0x36,0x30,0x00,0x56,0x32,0x37,0x36,0x31,0x00,0x56,0x32,0x37,0x36, 0x32,0x00,0x56,0x32,0x37,0x36,0x33,0x00,0x56,0x32,0x37,0x36,0x34,0x00,0x56,0x32, 0x37,0x36,0x35,0x00,0x56,0x32,0x37,0x36,0x36,0x00,0x56,0x32,0x37,0x36,0x37,0x00, 0x56,0x32,0x37,0x36,0x38,0x00,0x56,0x32,0x37,0x36,0x39,0x00,0x56,0x32,0x37,0x37, 0x30,0x00,0x56,0x32,0x37,0x37,0x31,0x00,0x56,0x32,0x37,0x37,0x32,0x00,0x56,0x32, 0x37,0x37,0x33,0x00,0x56,0x32,0x37,0x37,0x34,0x00,0x56,0x32,0x37,0x37,0x35,0x00, 0x56,0x32,0x37,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x37,0x00,0x56,0x32,0x37,0x37, 0x38,0x00,0x56,0x32,0x37,0x37,0x39,0x00,0x56,0x32,0x37,0x38,0x30,0x00,0x56,0x32, 0x37,0x38,0x31,0x00,0x56,0x32,0x37,0x38,0x32,0x00,0x56,0x32,0x37,0x38,0x33,0x00, 0x56,0x32,0x37,0x38,0x34,0x00,0x56,0x32,0x37,0x38,0x35,0x00,0x56,0x32,0x37,0x38, 0x36,0x00,0x56,0x32,0x37,0x38,0x37,0x00,0x56,0x32,0x37,0x38,0x38,0x00,0x56,0x32, 0x37,0x38,0x39,0x00,0x56,0x32,0x37,0x39,0x30,0x00,0x56,0x32,0x37,0x39,0x31,0x00, 0x56,0x32,0x37,0x39,0x32,0x00,0x56,0x32,0x37,0x39,0x33,0x00,0x56,0x32,0x37,0x39, 0x34,0x00,0x56,0x32,0x37,0x39,0x35,0x00,0x56,0x32,0x37,0x39,0x36,0x00,0x56,0x32, 0x37,0x39,0x37,0x00,0x56,0x32,0x37,0x39,0x38,0x00,0x56,0x32,0x37,0x39,0x39,0x00, 0x56,0x32,0x38,0x30,0x30,0x00,0x56,0x32,0x38,0x30,0x31,0x00,0x56,0x32,0x38,0x30, 0x32,0x00,0x56,0x32,0x38,0x30,0x33,0x00,0x56,0x32,0x38,0x30,0x34,0x00,0x56,0x32, 0x38,0x30,0x35,0x00,0x56,0x32,0x38,0x30,0x36,0x00,0x56,0x32,0x38,0x30,0x37,0x00, 0x56,0x32,0x38,0x30,0x38,0x00,0x56,0x32,0x38,0x30,0x39,0x00,0x56,0x32,0x38,0x31, 0x30,0x00,0x56,0x32,0x38,0x31,0x31,0x00,0x56,0x32,0x38,0x31,0x32,0x00,0x56,0x32, 0x38,0x31,0x33,0x00,0x56,0x32,0x38,0x31,0x34,0x00,0x56,0x32,0x38,0x31,0x35,0x00, 0x56,0x32,0x38,0x31,0x36,0x00,0x56,0x32,0x38,0x31,0x37,0x00,0x56,0x32,0x38,0x31, 0x38,0x00,0x56,0x32,0x38,0x31,0x39,0x00,0x56,0x32,0x38,0x32,0x30,0x00,0x56,0x32, 0x38,0x32,0x31,0x00,0x56,0x32,0x38,0x32,0x32,0x00,0x56,0x32,0x38,0x32,0x33,0x00, 0x56,0x32,0x38,0x32,0x34,0x00,0x56,0x32,0x38,0x32,0x35,0x00,0x56,0x32,0x38,0x32, 0x36,0x00,0x56,0x32,0x38,0x32,0x37,0x00,0x56,0x32,0x38,0x32,0x38,0x00,0x56,0x32, 0x38,0x32,0x39,0x00,0x56,0x32,0x38,0x33,0x30,0x00,0x56,0x32,0x38,0x33,0x31,0x00, 0x56,0x32,0x38,0x33,0x32,0x00,0x56,0x32,0x38,0x33,0x33,0x00,0x56,0x32,0x38,0x33, 0x34,0x00,0x56,0x32,0x38,0x33,0x35,0x00,0x56,0x32,0x38,0x33,0x36,0x00,0x56,0x32, 0x38,0x33,0x37,0x00,0x56,0x32,0x38,0x33,0x38,0x00,0x56,0x32,0x38,0x33,0x39,0x00, 0x56,0x32,0x38,0x34,0x30,0x00,0x56,0x32,0x38,0x34,0x31,0x00,0x56,0x32,0x38,0x34, 0x32,0x00,0x56,0x32,0x38,0x34,0x33,0x00,0x56,0x32,0x38,0x34,0x34,0x00,0x56,0x32, 0x38,0x34,0x35,0x00,0x56,0x32,0x38,0x34,0x36,0x00,0x56,0x32,0x38,0x34,0x37,0x00, 0x56,0x32,0x38,0x34,0x38,0x00,0x56,0x32,0x38,0x34,0x39,0x00,0x56,0x32,0x38,0x35, 0x30,0x00,0x56,0x32,0x38,0x35,0x31,0x00,0x56,0x32,0x38,0x35,0x32,0x00,0x56,0x32, 0x38,0x35,0x33,0x00,0x56,0x32,0x38,0x35,0x34,0x00,0x56,0x32,0x38,0x35,0x35,0x00, 0x56,0x32,0x38,0x35,0x36,0x00,0x56,0x32,0x38,0x35,0x37,0x00,0x56,0x32,0x38,0x35, 0x38,0x00,0x56,0x32,0x38,0x35,0x39,0x00,0x56,0x32,0x38,0x36,0x30,0x00,0x56,0x32, 0x38,0x36,0x31,0x00,0x56,0x32,0x38,0x36,0x32,0x00,0x56,0x32,0x38,0x36,0x33,0x00, 0x56,0x32,0x38,0x36,0x34,0x00,0x56,0x32,0x38,0x36,0x35,0x00,0x56,0x32,0x38,0x36, 0x36,0x00,0x56,0x32,0x38,0x36,0x37,0x00,0x56,0x32,0x38,0x36,0x38,0x00,0x56,0x32, 0x38,0x36,0x39,0x00,0x56,0x32,0x38,0x37,0x30,0x00,0x56,0x32,0x38,0x37,0x31,0x00, 0x56,0x32,0x38,0x37,0x32,0x00,0x56,0x32,0x38,0x37,0x33,0x00,0x56,0x32,0x38,0x37, 0x34,0x00,0x56,0x32,0x38,0x37,0x35,0x00,0x56,0x32,0x38,0x37,0x36,0x00,0x56,0x32, 0x38,0x37,0x37,0x00,0x56,0x32,0x38,0x37,0x38,0x00,0x56,0x32,0x38,0x37,0x39,0x00, 0x56,0x32,0x38,0x38,0x30,0x00,0x56,0x32,0x38,0x38,0x31,0x00,0x56,0x32,0x38,0x38, 0x32,0x00,0x56,0x32,0x38,0x38,0x33,0x00,0x56,0x32,0x38,0x38,0x34,0x00,0x56,0x32, 0x38,0x38,0x35,0x00,0x56,0x32,0x38,0x38,0x36,0x00,0x56,0x32,0x38,0x38,0x37,0x00, 0x56,0x32,0x38,0x38,0x38,0x00,0x56,0x32,0x38,0x38,0x39,0x00,0x56,0x32,0x38,0x39, 0x30,0x00,0x56,0x32,0x38,0x39,0x31,0x00,0x56,0x32,0x38,0x39,0x32,0x00,0x56,0x32, 0x38,0x39,0x33,0x00,0x56,0x32,0x38,0x39,0x34,0x00,0x56,0x32,0x38,0x39,0x35,0x00, 0x56,0x32,0x38,0x39,0x36,0x00,0x56,0x32,0x38,0x39,0x37,0x00,0x56,0x32,0x38,0x39, 0x38,0x00,0x56,0x32,0x38,0x39,0x39,0x00,0x56,0x32,0x39,0x30,0x30,0x00,0x56,0x32, 0x39,0x30,0x31,0x00,0x56,0x32,0x39,0x30,0x32,0x00,0x56,0x32,0x39,0x30,0x33,0x00, 0x56,0x32,0x39,0x30,0x34,0x00,0x56,0x32,0x39,0x30,0x35,0x00,0x56,0x32,0x39,0x30, 0x36,0x00,0x56,0x32,0x39,0x30,0x37,0x00,0x56,0x32,0x39,0x30,0x38,0x00,0x56,0x32, 0x39,0x30,0x39,0x00,0x56,0x32,0x39,0x31,0x30,0x00,0x56,0x32,0x39,0x31,0x31,0x00, 0x56,0x32,0x39,0x31,0x32,0x00,0x56,0x32,0x39,0x31,0x33,0x00,0x56,0x32,0x39,0x31, 0x34,0x00,0x56,0x32,0x39,0x31,0x35,0x00,0x56,0x32,0x39,0x31,0x36,0x00,0x56,0x32, 0x39,0x31,0x37,0x00,0x56,0x32,0x39,0x31,0x38,0x00,0x56,0x32,0x39,0x31,0x39,0x00, 0x56,0x32,0x39,0x32,0x30,0x00,0x56,0x32,0x39,0x32,0x31,0x00,0x56,0x32,0x39,0x32, 0x32,0x00,0x56,0x32,0x39,0x32,0x33,0x00,0x56,0x32,0x39,0x32,0x34,0x00,0x56,0x32, 0x39,0x32,0x35,0x00,0x56,0x32,0x39,0x32,0x36,0x00,0x56,0x32,0x39,0x32,0x37,0x00, 0x56,0x32,0x39,0x32,0x38,0x00,0x56,0x32,0x39,0x32,0x39,0x00,0x56,0x32,0x39,0x33, 0x30,0x00,0x56,0x32,0x39,0x33,0x31,0x00,0x56,0x32,0x39,0x33,0x32,0x00,0x56,0x32, 0x39,0x33,0x33,0x00,0x56,0x32,0x39,0x33,0x34,0x00,0x56,0x32,0x39,0x33,0x35,0x00, 0x56,0x32,0x39,0x33,0x36,0x00,0x56,0x32,0x39,0x33,0x37,0x00,0x56,0x32,0x39,0x33, 0x38,0x00,0x56,0x32,0x39,0x33,0x39,0x00,0x56,0x32,0x39,0x34,0x30,0x00,0x56,0x32, 0x39,0x34,0x31,0x00,0x56,0x32,0x39,0x34,0x32,0x00,0x56,0x32,0x39,0x34,0x33,0x00, 0x56,0x32,0x39,0x34,0x34,0x00,0x56,0x32,0x39,0x34,0x35,0x00,0x56,0x32,0x39,0x34, 0x36,0x00,0x56,0x32,0x39,0x34,0x37,0x00,0x56,0x32,0x39,0x34,0x38,0x00,0x56,0x32, 0x39,0x34,0x39,0x00,0x56,0x32,0x39,0x35,0x30,0x00,0x56,0x32,0x39,0x35,0x31,0x00, 0x56,0x32,0x39,0x35,0x32,0x00,0x56,0x32,0x39,0x35,0x33,0x00,0x56,0x32,0x39,0x35, 0x34,0x00,0x56,0x32,0x39,0x35,0x35,0x00,0x56,0x32,0x39,0x35,0x36,0x00,0x56,0x32, 0x39,0x35,0x37,0x00,0x56,0x32,0x39,0x35,0x38,0x00,0x56,0x32,0x39,0x35,0x39,0x00, 0x56,0x32,0x39,0x36,0x30,0x00,0x56,0x32,0x39,0x36,0x31,0x00,0x56,0x32,0x39,0x36, 0x32,0x00,0x56,0x32,0x39,0x36,0x33,0x00,0x56,0x32,0x39,0x36,0x34,0x00,0x56,0x32, 0x39,0x36,0x35,0x00,0x56,0x32,0x39,0x36,0x36,0x00,0x56,0x32,0x39,0x36,0x37,0x00, 0x56,0x32,0x39,0x36,0x38,0x00,0x56,0x32,0x39,0x36,0x39,0x00,0x56,0x32,0x39,0x37, 0x30,0x00,0x56,0x32,0x39,0x37,0x31,0x00,0x56,0x32,0x39,0x37,0x32,0x00,0x56,0x32, 0x39,0x37,0x33,0x00,0x56,0x32,0x39,0x37,0x34,0x00,0x56,0x32,0x39,0x37,0x35,0x00, 0x56,0x32,0x39,0x37,0x36,0x00,0x56,0x32,0x39,0x37,0x37,0x00,0x56,0x32,0x39,0x37, 0x38,0x00,0x56,0x32,0x39,0x37,0x39,0x00,0x56,0x32,0x39,0x38,0x30,0x00,0x56,0x32, 0x39,0x38,0x31,0x00,0x56,0x32,0x39,0x38,0x32,0x00,0x56,0x32,0x39,0x38,0x33,0x00, 0x56,0x32,0x39,0x38,0x34,0x00,0x56,0x32,0x39,0x38,0x35,0x00,0x56,0x32,0x39,0x38, 0x36,0x00,0x56,0x32,0x39,0x38,0x37,0x00,0x56,0x32,0x39,0x38,0x38,0x00,0x56,0x32, 0x39,0x38,0x39,0x00,0x56,0x32,0x39,0x39,0x30,0x00,0x56,0x32,0x39,0x39,0x31,0x00, 0x56,0x32,0x39,0x39,0x32,0x00,0x56,0x32,0x39,0x39,0x33,0x00,0x56,0x32,0x39,0x39, 0x34,0x00,0x56,0x32,0x39,0x39,0x35,0x00,0x56,0x32,0x39,0x39,0x36,0x00,0x56,0x32, 0x39,0x39,0x37,0x00,0x56,0x32,0x39,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x39,0x00, 0x56,0x33,0x30,0x30,0x30,0x00,0x56,0x33,0x30,0x30,0x31,0x00,0x56,0x33,0x30,0x30, 0x32,0x00,0x56,0x33,0x30,0x30,0x33,0x00,0x56,0x33,0x30,0x30,0x34,0x00,0x56,0x33, 0x30,0x30,0x35,0x00,0x56,0x33,0x30,0x30,0x36,0x00,0x56,0x33,0x30,0x30,0x37,0x00, 0x56,0x33,0x30,0x30,0x38,0x00,0x56,0x33,0x30,0x30,0x39,0x00,0x56,0x33,0x30,0x31, 0x30,0x00,0x56,0x33,0x30,0x31,0x31,0x00,0x56,0x33,0x30,0x31,0x32,0x00,0x56,0x33, 0x30,0x31,0x33,0x00,0x56,0x33,0x30,0x31,0x34,0x00,0x56,0x33,0x30,0x31,0x35,0x00, 0x56,0x33,0x30,0x31,0x36,0x00,0x56,0x33,0x30,0x31,0x37,0x00,0x56,0x33,0x30,0x31, 0x38,0x00,0x56,0x33,0x30,0x31,0x39,0x00,0x56,0x33,0x30,0x32,0x30,0x00,0x56,0x33, 0x30,0x32,0x31,0x00,0x56,0x33,0x30,0x32,0x32,0x00,0x56,0x33,0x30,0x32,0x33,0x00, 0x56,0x33,0x30,0x32,0x34,0x00,0x56,0x33,0x30,0x32,0x35,0x00,0x56,0x33,0x30,0x32, 0x36,0x00,0x56,0x33,0x30,0x32,0x37,0x00,0x56,0x33,0x30,0x32,0x38,0x00,0x56,0x33, 0x30,0x32,0x39,0x00,0x56,0x33,0x30,0x33,0x30,0x00,0x56,0x33,0x30,0x33,0x31,0x00, 0x56,0x33,0x30,0x33,0x32,0x00,0x56,0x33,0x30,0x33,0x33,0x00,0x56,0x33,0x30,0x33, 0x34,0x00,0x56,0x33,0x30,0x33,0x35,0x00,0x56,0x33,0x30,0x33,0x36,0x00,0x56,0x33, 0x30,0x33,0x37,0x00,0x56,0x33,0x30,0x33,0x38,0x00,0x56,0x33,0x30,0x33,0x39,0x00, 0x56,0x33,0x30,0x34,0x30,0x00,0x56,0x33,0x30,0x34,0x31,0x00,0x56,0x33,0x30,0x34, 0x32,0x00,0x56,0x33,0x30,0x34,0x33,0x00,0x56,0x33,0x30,0x34,0x34,0x00,0x56,0x33, 0x30,0x34,0x35,0x00,0x56,0x33,0x30,0x34,0x36,0x00,0x56,0x33,0x30,0x34,0x37,0x00, 0x56,0x33,0x30,0x34,0x38,0x00,0x56,0x33,0x30,0x34,0x39,0x00,0x56,0x33,0x30,0x35, 0x30,0x00,0x56,0x33,0x30,0x35,0x31,0x00,0x56,0x33,0x30,0x35,0x32,0x00,0x56,0x33, 0x30,0x35,0x33,0x00,0x56,0x33,0x30,0x35,0x34,0x00,0x56,0x33,0x30,0x35,0x35,0x00, 0x56,0x33,0x30,0x35,0x36,0x00,0x56,0x33,0x30,0x35,0x37,0x00,0x56,0x33,0x30,0x35, 0x38,0x00,0x56,0x33,0x30,0x35,0x39,0x00,0x56,0x33,0x30,0x36,0x30,0x00,0x56,0x33, 0x30,0x36,0x31,0x00,0x56,0x33,0x30,0x36,0x32,0x00,0x56,0x33,0x30,0x36,0x33,0x00, 0x56,0x33,0x30,0x36,0x34,0x00,0x56,0x33,0x30,0x36,0x35,0x00,0x56,0x33,0x30,0x36, 0x36,0x00,0x56,0x33,0x30,0x36,0x37,0x00,0x56,0x33,0x30,0x36,0x38,0x00,0x56,0x33, 0x30,0x36,0x39,0x00,0x56,0x33,0x30,0x37,0x30,0x00,0x56,0x33,0x30,0x37,0x31,0x00, 0x56,0x33,0x30,0x37,0x32,0x00,0x56,0x33,0x30,0x37,0x33,0x00,0x56,0x33,0x30,0x37, 0x34,0x00,0x56,0x33,0x30,0x37,0x35,0x00,0x56,0x33,0x30,0x37,0x36,0x00,0x56,0x33, 0x30,0x37,0x37,0x00,0x56,0x33,0x30,0x37,0x38,0x00,0x56,0x33,0x30,0x37,0x39,0x00, 0x56,0x33,0x30,0x38,0x30,0x00,0x56,0x33,0x30,0x38,0x31,0x00,0x56,0x33,0x30,0x38, 0x32,0x00,0x56,0x33,0x30,0x38,0x33,0x00,0x56,0x33,0x30,0x38,0x34,0x00,0x56,0x33, 0x30,0x38,0x35,0x00,0x56,0x33,0x30,0x38,0x36,0x00,0x56,0x33,0x30,0x38,0x37,0x00, 0x56,0x33,0x30,0x38,0x38,0x00,0x56,0x33,0x30,0x38,0x39,0x00,0x56,0x33,0x30,0x39, 0x30,0x00,0x56,0x33,0x30,0x39,0x31,0x00,0x56,0x33,0x30,0x39,0x32,0x00,0x56,0x33, 0x30,0x39,0x33,0x00,0x56,0x33,0x30,0x39,0x34,0x00,0x56,0x33,0x30,0x39,0x35,0x00, 0x56,0x33,0x30,0x39,0x36,0x00,0x56,0x33,0x30,0x39,0x37,0x00,0x56,0x33,0x30,0x39, 0x38,0x00,0x56,0x33,0x30,0x39,0x39,0x00,0x56,0x33,0x31,0x30,0x30,0x00,0x56,0x33, 0x31,0x30,0x31,0x00,0x56,0x33,0x31,0x30,0x32,0x00,0x56,0x33,0x31,0x30,0x33,0x00, 0x56,0x33,0x31,0x30,0x34,0x00,0x56,0x33,0x31,0x30,0x35,0x00,0x56,0x33,0x31,0x30, 0x36,0x00,0x56,0x33,0x31,0x30,0x37,0x00,0x56,0x33,0x31,0x30,0x38,0x00,0x56,0x33, 0x31,0x30,0x39,0x00,0x56,0x33,0x31,0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x31,0x00, 0x56,0x33,0x31,0x31,0x32,0x00,0x56,0x33,0x31,0x31,0x33,0x00,0x56,0x33,0x31,0x31, 0x34,0x00,0x56,0x33,0x31,0x31,0x35,0x00,0x56,0x33,0x31,0x31,0x36,0x00,0x56,0x33, 0x31,0x31,0x37,0x00,0x56,0x33,0x31,0x31,0x38,0x00,0x56,0x33,0x31,0x31,0x39,0x00, 0x56,0x33,0x31,0x32,0x30,0x00,0x56,0x33,0x31,0x32,0x31,0x00,0x56,0x33,0x31,0x32, 0x32,0x00,0x56,0x33,0x31,0x32,0x33,0x00,0x56,0x33,0x31,0x32,0x34,0x00,0x56,0x33, 0x31,0x32,0x35,0x00,0x56,0x33,0x31,0x32,0x36,0x00,0x56,0x33,0x31,0x32,0x37,0x00, 0x56,0x33,0x31,0x32,0x38,0x00,0x56,0x33,0x31,0x32,0x39,0x00,0x56,0x33,0x31,0x33, 0x30,0x00,0x56,0x33,0x31,0x33,0x31,0x00,0x56,0x33,0x31,0x33,0x32,0x00,0x56,0x33, 0x31,0x33,0x33,0x00,0x56,0x33,0x31,0x33,0x34,0x00,0x56,0x33,0x31,0x33,0x35,0x00, 0x56,0x33,0x31,0x33,0x36,0x00,0x56,0x33,0x31,0x33,0x37,0x00,0x56,0x33,0x31,0x33, 0x38,0x00,0x56,0x33,0x31,0x33,0x39,0x00,0x56,0x33,0x31,0x34,0x30,0x00,0x56,0x33, 0x31,0x34,0x31,0x00,0x56,0x33,0x31,0x34,0x32,0x00,0x56,0x33,0x31,0x34,0x33,0x00, 0x56,0x33,0x31,0x34,0x34,0x00,0x56,0x33,0x31,0x34,0x35,0x00,0x56,0x33,0x31,0x34, 0x36,0x00,0x56,0x33,0x31,0x34,0x37,0x00,0x56,0x33,0x31,0x34,0x38,0x00,0x56,0x33, 0x31,0x34,0x39,0x00,0x56,0x33,0x31,0x35,0x30,0x00,0x56,0x33,0x31,0x35,0x31,0x00, 0x56,0x33,0x31,0x35,0x32,0x00,0x56,0x33,0x31,0x35,0x33,0x00,0x56,0x33,0x31,0x35, 0x34,0x00,0x56,0x33,0x31,0x35,0x35,0x00,0x56,0x33,0x31,0x35,0x36,0x00,0x56,0x33, 0x31,0x35,0x37,0x00,0x56,0x33,0x31,0x35,0x38,0x00,0x56,0x33,0x31,0x35,0x39,0x00, 0x56,0x33,0x31,0x36,0x30,0x00,0x56,0x33,0x31,0x36,0x31,0x00,0x56,0x33,0x31,0x36, 0x32,0x00,0x56,0x33,0x31,0x36,0x33,0x00,0x56,0x33,0x31,0x36,0x34,0x00,0x56,0x33, 0x31,0x36,0x35,0x00,0x56,0x33,0x31,0x36,0x36,0x00,0x56,0x33,0x31,0x36,0x37,0x00, 0x56,0x33,0x31,0x36,0x38,0x00,0x56,0x33,0x31,0x36,0x39,0x00,0x56,0x33,0x31,0x37, 0x30,0x00,0x56,0x33,0x31,0x37,0x31,0x00,0x56,0x33,0x31,0x37,0x32,0x00,0x56,0x33, 0x31,0x37,0x33,0x00,0x56,0x33,0x31,0x37,0x34,0x00,0x56,0x33,0x31,0x37,0x35,0x00, 0x56,0x33,0x31,0x37,0x36,0x00,0x56,0x33,0x31,0x37,0x37,0x00,0x56,0x33,0x31,0x37, 0x38,0x00,0x56,0x33,0x31,0x37,0x39,0x00,0x56,0x33,0x31,0x38,0x30,0x00,0x56,0x33, 0x31,0x38,0x31,0x00,0x56,0x33,0x31,0x38,0x32,0x00,0x56,0x33,0x31,0x38,0x33,0x00, 0x56,0x33,0x31,0x38,0x34,0x00,0x56,0x33,0x31,0x38,0x35,0x00,0x56,0x33,0x31,0x38, 0x36,0x00,0x56,0x33,0x31,0x38,0x37,0x00,0x56,0x33,0x31,0x38,0x38,0x00,0x56,0x33, 0x31,0x38,0x39,0x00,0x56,0x33,0x31,0x39,0x30,0x00,0x56,0x33,0x31,0x39,0x31,0x00, 0x56,0x33,0x31,0x39,0x32,0x00,0x56,0x33,0x31,0x39,0x33,0x00,0x56,0x33,0x31,0x39, 0x34,0x00,0x56,0x33,0x31,0x39,0x35,0x00,0x56,0x33,0x31,0x39,0x36,0x00,0x56,0x33, 0x31,0x39,0x37,0x00,0x56,0x33,0x31,0x39,0x38,0x00,0x56,0x33,0x31,0x39,0x39,0x00, 0x56,0x33,0x32,0x30,0x30,0x00,0x56,0x33,0x32,0x30,0x31,0x00,0x56,0x33,0x32,0x30, 0x32,0x00,0x56,0x33,0x32,0x30,0x33,0x00,0x56,0x33,0x32,0x30,0x34,0x00,0x56,0x33, 0x32,0x30,0x35,0x00,0x56,0x33,0x32,0x30,0x36,0x00,0x56,0x33,0x32,0x30,0x37,0x00, 0x56,0x33,0x32,0x30,0x38,0x00,0x56,0x33,0x32,0x30,0x39,0x00,0x56,0x33,0x32,0x31, 0x30,0x00,0x56,0x33,0x32,0x31,0x31,0x00,0x56,0x33,0x32,0x31,0x32,0x00,0x56,0x33, 0x32,0x31,0x33,0x00,0x56,0x33,0x32,0x31,0x34,0x00,0x56,0x33,0x32,0x31,0x35,0x00, 0x56,0x33,0x32,0x31,0x36,0x00,0x56,0x33,0x32,0x31,0x37,0x00,0x56,0x33,0x32,0x31, 0x38,0x00,0x56,0x33,0x32,0x31,0x39,0x00,0x56,0x33,0x32,0x32,0x30,0x00,0x56,0x33, 0x32,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x32,0x00,0x56,0x33,0x32,0x32,0x33,0x00, 0x56,0x33,0x32,0x32,0x34,0x00,0x56,0x33,0x32,0x32,0x35,0x00,0x56,0x33,0x32,0x32, 0x36,0x00,0x56,0x33,0x32,0x32,0x37,0x00,0x56,0x33,0x32,0x32,0x38,0x00,0x56,0x33, 0x32,0x32,0x39,0x00,0x56,0x33,0x32,0x33,0x30,0x00,0x56,0x33,0x32,0x33,0x31,0x00, 0x56,0x33,0x32,0x33,0x32,0x00,0x56,0x33,0x32,0x33,0x33,0x00,0x56,0x33,0x32,0x33, 0x34,0x00,0x56,0x33,0x32,0x33,0x35,0x00,0x56,0x33,0x32,0x33,0x36,0x00,0x56,0x33, 0x32,0x33,0x37,0x00,0x56,0x33,0x32,0x33,0x38,0x00,0x56,0x33,0x32,0x33,0x39,0x00, 0x56,0x33,0x32,0x34,0x30,0x00,0x56,0x33,0x32,0x34,0x31,0x00,0x56,0x33,0x32,0x34, 0x32,0x00,0x56,0x33,0x32,0x34,0x33,0x00,0x56,0x33,0x32,0x34,0x34,0x00,0x56,0x33, 0x32,0x34,0x35,0x00,0x56,0x33,0x32,0x34,0x36,0x00,0x56,0x33,0x32,0x34,0x37,0x00, 0x56,0x33,0x32,0x34,0x38,0x00,0x56,0x33,0x32,0x34,0x39,0x00,0x56,0x33,0x32,0x35, 0x30,0x00,0x56,0x33,0x32,0x35,0x31,0x00,0x56,0x33,0x32,0x35,0x32,0x00,0x56,0x33, 0x32,0x35,0x33,0x00,0x56,0x33,0x32,0x35,0x34,0x00,0x56,0x33,0x32,0x35,0x35,0x00, 0x56,0x33,0x32,0x35,0x36,0x00,0x56,0x33,0x32,0x35,0x37,0x00,0x56,0x33,0x32,0x35, 0x38,0x00,0x56,0x33,0x32,0x35,0x39,0x00,0x56,0x33,0x32,0x36,0x30,0x00,0x56,0x33, 0x32,0x36,0x31,0x00,0x56,0x33,0x32,0x36,0x32,0x00,0x56,0x33,0x32,0x36,0x33,0x00, 0x56,0x33,0x32,0x36,0x34,0x00,0x56,0x33,0x32,0x36,0x35,0x00,0x56,0x33,0x32,0x36, 0x36,0x00,0x56,0x33,0x32,0x36,0x37,0x00,0x56,0x33,0x32,0x36,0x38,0x00,0x56,0x33, 0x32,0x36,0x39,0x00,0x56,0x33,0x32,0x37,0x30,0x00,0x56,0x33,0x32,0x37,0x31,0x00, 0x56,0x33,0x32,0x37,0x32,0x00,0x56,0x33,0x32,0x37,0x33,0x00,0x56,0x33,0x32,0x37, 0x34,0x00,0x56,0x33,0x32,0x37,0x35,0x00,0x56,0x33,0x32,0x37,0x36,0x00,0x56,0x33, 0x32,0x37,0x37,0x00,0x56,0x33,0x32,0x37,0x38,0x00,0x56,0x33,0x32,0x37,0x39,0x00, 0x56,0x33,0x32,0x38,0x30,0x00,0x56,0x33,0x32,0x38,0x31,0x00,0x56,0x33,0x32,0x38, 0x32,0x00,0x56,0x33,0x32,0x38,0x33,0x00,0x56,0x33,0x32,0x38,0x34,0x00,0x56,0x33, 0x32,0x38,0x35,0x00,0x56,0x33,0x32,0x38,0x36,0x00,0x56,0x33,0x32,0x38,0x37,0x00, 0x56,0x33,0x32,0x38,0x38,0x00,0x56,0x33,0x32,0x38,0x39,0x00,0x56,0x33,0x32,0x39, 0x30,0x00,0x56,0x33,0x32,0x39,0x31,0x00,0x56,0x33,0x32,0x39,0x32,0x00,0x56,0x33, 0x32,0x39,0x33,0x00,0x56,0x33,0x32,0x39,0x34,0x00,0x56,0x33,0x32,0x39,0x35,0x00, 0x56,0x33,0x32,0x39,0x36,0x00,0x56,0x33,0x32,0x39,0x37,0x00,0x56,0x33,0x32,0x39, 0x38,0x00,0x56,0x33,0x32,0x39,0x39,0x00,0x56,0x33,0x33,0x30,0x30,0x00,0x56,0x33, 0x33,0x30,0x31,0x00,0x56,0x33,0x33,0x30,0x32,0x00,0x56,0x33,0x33,0x30,0x33,0x00, 0x56,0x33,0x33,0x30,0x34,0x00,0x56,0x33,0x33,0x30,0x35,0x00,0x56,0x33,0x33,0x30, 0x36,0x00,0x56,0x33,0x33,0x30,0x37,0x00,0x56,0x33,0x33,0x30,0x38,0x00,0x56,0x33, 0x33,0x30,0x39,0x00,0x56,0x33,0x33,0x31,0x30,0x00,0x56,0x33,0x33,0x31,0x31,0x00, 0x56,0x33,0x33,0x31,0x32,0x00,0x56,0x33,0x33,0x31,0x33,0x00,0x56,0x33,0x33,0x31, 0x34,0x00,0x56,0x33,0x33,0x31,0x35,0x00,0x56,0x33,0x33,0x31,0x36,0x00,0x56,0x33, 0x33,0x31,0x37,0x00,0x56,0x33,0x33,0x31,0x38,0x00,0x56,0x33,0x33,0x31,0x39,0x00, 0x56,0x33,0x33,0x32,0x30,0x00,0x56,0x33,0x33,0x32,0x31,0x00,0x56,0x33,0x33,0x32, 0x32,0x00,0x56,0x33,0x33,0x32,0x33,0x00,0x56,0x33,0x33,0x32,0x34,0x00,0x56,0x33, 0x33,0x32,0x35,0x00,0x56,0x33,0x33,0x32,0x36,0x00,0x56,0x33,0x33,0x32,0x37,0x00, 0x56,0x33,0x33,0x32,0x38,0x00,0x56,0x33,0x33,0x32,0x39,0x00,0x56,0x33,0x33,0x33, 0x30,0x00,0x56,0x33,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x33,0x32,0x00,0x56,0x33, 0x33,0x33,0x33,0x00,0x56,0x33,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x33,0x35,0x00, 0x56,0x33,0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x33, 0x38,0x00,0x56,0x33,0x33,0x33,0x39,0x00,0x56,0x33,0x33,0x34,0x30,0x00,0x56,0x33, 0x33,0x34,0x31,0x00,0x56,0x33,0x33,0x34,0x32,0x00,0x56,0x33,0x33,0x34,0x33,0x00, 0x56,0x33,0x33,0x34,0x34,0x00,0x56,0x33,0x33,0x34,0x35,0x00,0x56,0x33,0x33,0x34, 0x36,0x00,0x56,0x33,0x33,0x34,0x37,0x00,0x56,0x33,0x33,0x34,0x38,0x00,0x56,0x33, 0x33,0x34,0x39,0x00,0x56,0x33,0x33,0x35,0x30,0x00,0x56,0x33,0x33,0x35,0x31,0x00, 0x56,0x33,0x33,0x35,0x32,0x00,0x56,0x33,0x33,0x35,0x33,0x00,0x56,0x33,0x33,0x35, 0x34,0x00,0x56,0x33,0x33,0x35,0x35,0x00,0x56,0x33,0x33,0x35,0x36,0x00,0x56,0x33, 0x33,0x35,0x37,0x00,0x56,0x33,0x33,0x35,0x38,0x00,0x56,0x33,0x33,0x35,0x39,0x00, 0x56,0x33,0x33,0x36,0x30,0x00,0x56,0x33,0x33,0x36,0x31,0x00,0x56,0x33,0x33,0x36, 0x32,0x00,0x56,0x33,0x33,0x36,0x33,0x00,0x56,0x33,0x33,0x36,0x34,0x00,0x56,0x33, 0x33,0x36,0x35,0x00,0x56,0x33,0x33,0x36,0x36,0x00,0x56,0x33,0x33,0x36,0x37,0x00, 0x56,0x33,0x33,0x36,0x38,0x00,0x56,0x33,0x33,0x36,0x39,0x00,0x56,0x33,0x33,0x37, 0x30,0x00,0x56,0x33,0x33,0x37,0x31,0x00,0x56,0x33,0x33,0x37,0x32,0x00,0x56,0x33, 0x33,0x37,0x33,0x00,0x56,0x33,0x33,0x37,0x34,0x00,0x56,0x33,0x33,0x37,0x35,0x00, 0x56,0x33,0x33,0x37,0x36,0x00,0x56,0x33,0x33,0x37,0x37,0x00,0x56,0x33,0x33,0x37, 0x38,0x00,0x56,0x33,0x33,0x37,0x39,0x00,0x56,0x33,0x33,0x38,0x30,0x00,0x56,0x33, 0x33,0x38,0x31,0x00,0x56,0x33,0x33,0x38,0x32,0x00,0x56,0x33,0x33,0x38,0x33,0x00, 0x56,0x33,0x33,0x38,0x34,0x00,0x56,0x33,0x33,0x38,0x35,0x00,0x56,0x33,0x33,0x38, 0x36,0x00,0x56,0x33,0x33,0x38,0x37,0x00,0x56,0x33,0x33,0x38,0x38,0x00,0x56,0x33, 0x33,0x38,0x39,0x00,0x56,0x33,0x33,0x39,0x30,0x00,0x56,0x33,0x33,0x39,0x31,0x00, 0x56,0x33,0x33,0x39,0x32,0x00,0x56,0x33,0x33,0x39,0x33,0x00,0x56,0x33,0x33,0x39, 0x34,0x00,0x56,0x33,0x33,0x39,0x35,0x00,0x56,0x33,0x33,0x39,0x36,0x00,0x56,0x33, 0x33,0x39,0x37,0x00,0x56,0x33,0x33,0x39,0x38,0x00,0x56,0x33,0x33,0x39,0x39,0x00, 0x56,0x33,0x34,0x30,0x30,0x00,0x56,0x33,0x34,0x30,0x31,0x00,0x56,0x33,0x34,0x30, 0x32,0x00,0x56,0x33,0x34,0x30,0x33,0x00,0x56,0x33,0x34,0x30,0x34,0x00,0x56,0x33, 0x34,0x30,0x35,0x00,0x56,0x33,0x34,0x30,0x36,0x00,0x56,0x33,0x34,0x30,0x37,0x00, 0x56,0x33,0x34,0x30,0x38,0x00,0x56,0x33,0x34,0x30,0x39,0x00,0x56,0x33,0x34,0x31, 0x30,0x00,0x56,0x33,0x34,0x31,0x31,0x00,0x56,0x33,0x34,0x31,0x32,0x00,0x56,0x33, 0x34,0x31,0x33,0x00,0x56,0x33,0x34,0x31,0x34,0x00,0x56,0x33,0x34,0x31,0x35,0x00, 0x56,0x33,0x34,0x31,0x36,0x00,0x56,0x33,0x34,0x31,0x37,0x00,0x56,0x33,0x34,0x31, 0x38,0x00,0x56,0x33,0x34,0x31,0x39,0x00,0x56,0x33,0x34,0x32,0x30,0x00,0x56,0x33, 0x34,0x32,0x31,0x00,0x56,0x33,0x34,0x32,0x32,0x00,0x56,0x33,0x34,0x32,0x33,0x00, 0x56,0x33,0x34,0x32,0x34,0x00,0x56,0x33,0x34,0x32,0x35,0x00,0x56,0x33,0x34,0x32, 0x36,0x00,0x56,0x33,0x34,0x32,0x37,0x00,0x56,0x33,0x34,0x32,0x38,0x00,0x56,0x33, 0x34,0x32,0x39,0x00,0x56,0x33,0x34,0x33,0x30,0x00,0x56,0x33,0x34,0x33,0x31,0x00, 0x56,0x33,0x34,0x33,0x32,0x00,0x56,0x33,0x34,0x33,0x33,0x00,0x56,0x33,0x34,0x33, 0x34,0x00,0x56,0x33,0x34,0x33,0x35,0x00,0x56,0x33,0x34,0x33,0x36,0x00,0x56,0x33, 0x34,0x33,0x37,0x00,0x56,0x33,0x34,0x33,0x38,0x00,0x56,0x33,0x34,0x33,0x39,0x00, 0x56,0x33,0x34,0x34,0x30,0x00,0x56,0x33,0x34,0x34,0x31,0x00,0x56,0x33,0x34,0x34, 0x32,0x00,0x56,0x33,0x34,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x34,0x00,0x56,0x33, 0x34,0x34,0x35,0x00,0x56,0x33,0x34,0x34,0x36,0x00,0x56,0x33,0x34,0x34,0x37,0x00, 0x56,0x33,0x34,0x34,0x38,0x00,0x56,0x33,0x34,0x34,0x39,0x00,0x56,0x33,0x34,0x35, 0x30,0x00,0x56,0x33,0x34,0x35,0x31,0x00,0x56,0x33,0x34,0x35,0x32,0x00,0x56,0x33, 0x34,0x35,0x33,0x00,0x56,0x33,0x34,0x35,0x34,0x00,0x56,0x33,0x34,0x35,0x35,0x00, 0x56,0x33,0x34,0x35,0x36,0x00,0x56,0x33,0x34,0x35,0x37,0x00,0x56,0x33,0x34,0x35, 0x38,0x00,0x56,0x33,0x34,0x35,0x39,0x00,0x56,0x33,0x34,0x36,0x30,0x00,0x56,0x33, 0x34,0x36,0x31,0x00,0x56,0x33,0x34,0x36,0x32,0x00,0x56,0x33,0x34,0x36,0x33,0x00, 0x56,0x33,0x34,0x36,0x34,0x00,0x56,0x33,0x34,0x36,0x35,0x00,0x56,0x33,0x34,0x36, 0x36,0x00,0x56,0x33,0x34,0x36,0x37,0x00,0x56,0x33,0x34,0x36,0x38,0x00,0x56,0x33, 0x34,0x36,0x39,0x00,0x56,0x33,0x34,0x37,0x30,0x00,0x56,0x33,0x34,0x37,0x31,0x00, 0x56,0x33,0x34,0x37,0x32,0x00,0x56,0x33,0x34,0x37,0x33,0x00,0x56,0x33,0x34,0x37, 0x34,0x00,0x56,0x33,0x34,0x37,0x35,0x00,0x56,0x33,0x34,0x37,0x36,0x00,0x56,0x33, 0x34,0x37,0x37,0x00,0x56,0x33,0x34,0x37,0x38,0x00,0x56,0x33,0x34,0x37,0x39,0x00, 0x56,0x33,0x34,0x38,0x30,0x00,0x56,0x33,0x34,0x38,0x31,0x00,0x56,0x33,0x34,0x38, 0x32,0x00,0x56,0x33,0x34,0x38,0x33,0x00,0x56,0x33,0x34,0x38,0x34,0x00,0x56,0x33, 0x34,0x38,0x35,0x00,0x56,0x33,0x34,0x38,0x36,0x00,0x56,0x33,0x34,0x38,0x37,0x00, 0x56,0x33,0x34,0x38,0x38,0x00,0x56,0x33,0x34,0x38,0x39,0x00,0x56,0x33,0x34,0x39, 0x30,0x00,0x56,0x33,0x34,0x39,0x31,0x00,0x56,0x33,0x34,0x39,0x32,0x00,0x56,0x33, 0x34,0x39,0x33,0x00,0x56,0x33,0x34,0x39,0x34,0x00,0x56,0x33,0x34,0x39,0x35,0x00, 0x56,0x33,0x34,0x39,0x36,0x00,0x56,0x33,0x34,0x39,0x37,0x00,0x56,0x33,0x34,0x39, 0x38,0x00,0x56,0x33,0x34,0x39,0x39,0x00,0x56,0x33,0x35,0x30,0x30,0x00,0x56,0x33, 0x35,0x30,0x31,0x00,0x56,0x33,0x35,0x30,0x32,0x00,0x56,0x33,0x35,0x30,0x33,0x00, 0x56,0x33,0x35,0x30,0x34,0x00,0x56,0x33,0x35,0x30,0x35,0x00,0x56,0x33,0x35,0x30, 0x36,0x00,0x56,0x33,0x35,0x30,0x37,0x00,0x56,0x33,0x35,0x30,0x38,0x00,0x56,0x33, 0x35,0x30,0x39,0x00,0x56,0x33,0x35,0x31,0x30,0x00,0x56,0x33,0x35,0x31,0x31,0x00, 0x56,0x33,0x35,0x31,0x32,0x00,0x56,0x33,0x35,0x31,0x33,0x00,0x56,0x33,0x35,0x31, 0x34,0x00,0x56,0x33,0x35,0x31,0x35,0x00,0x56,0x33,0x35,0x31,0x36,0x00,0x56,0x33, 0x35,0x31,0x37,0x00,0x56,0x33,0x35,0x31,0x38,0x00,0x56,0x33,0x35,0x31,0x39,0x00, 0x56,0x33,0x35,0x32,0x30,0x00,0x56,0x33,0x35,0x32,0x31,0x00,0x56,0x33,0x35,0x32, 0x32,0x00,0x56,0x33,0x35,0x32,0x33,0x00,0x56,0x33,0x35,0x32,0x34,0x00,0x56,0x33, 0x35,0x32,0x35,0x00,0x56,0x33,0x35,0x32,0x36,0x00,0x56,0x33,0x35,0x32,0x37,0x00, 0x56,0x33,0x35,0x32,0x38,0x00,0x56,0x33,0x35,0x32,0x39,0x00,0x56,0x33,0x35,0x33, 0x30,0x00,0x56,0x33,0x35,0x33,0x31,0x00,0x56,0x33,0x35,0x33,0x32,0x00,0x56,0x33, 0x35,0x33,0x33,0x00,0x56,0x33,0x35,0x33,0x34,0x00,0x56,0x33,0x35,0x33,0x35,0x00, 0x56,0x33,0x35,0x33,0x36,0x00,0x56,0x33,0x35,0x33,0x37,0x00,0x56,0x33,0x35,0x33, 0x38,0x00,0x56,0x33,0x35,0x33,0x39,0x00,0x56,0x33,0x35,0x34,0x30,0x00,0x56,0x33, 0x35,0x34,0x31,0x00,0x56,0x33,0x35,0x34,0x32,0x00,0x56,0x33,0x35,0x34,0x33,0x00, 0x56,0x33,0x35,0x34,0x34,0x00,0x56,0x33,0x35,0x34,0x35,0x00,0x56,0x33,0x35,0x34, 0x36,0x00,0x56,0x33,0x35,0x34,0x37,0x00,0x56,0x33,0x35,0x34,0x38,0x00,0x56,0x33, 0x35,0x34,0x39,0x00,0x56,0x33,0x35,0x35,0x30,0x00,0x56,0x33,0x35,0x35,0x31,0x00, 0x56,0x33,0x35,0x35,0x32,0x00,0x56,0x33,0x35,0x35,0x33,0x00,0x56,0x33,0x35,0x35, 0x34,0x00,0x56,0x33,0x35,0x35,0x35,0x00,0x56,0x33,0x35,0x35,0x36,0x00,0x56,0x33, 0x35,0x35,0x37,0x00,0x56,0x33,0x35,0x35,0x38,0x00,0x56,0x33,0x35,0x35,0x39,0x00, 0x56,0x33,0x35,0x36,0x30,0x00,0x56,0x33,0x35,0x36,0x31,0x00,0x56,0x33,0x35,0x36, 0x32,0x00,0x56,0x33,0x35,0x36,0x33,0x00,0x56,0x33,0x35,0x36,0x34,0x00,0x56,0x33, 0x35,0x36,0x35,0x00,0x56,0x33,0x35,0x36,0x36,0x00,0x56,0x33,0x35,0x36,0x37,0x00, 0x56,0x33,0x35,0x36,0x38,0x00,0x56,0x33,0x35,0x36,0x39,0x00,0x56,0x33,0x35,0x37, 0x30,0x00,0x56,0x33,0x35,0x37,0x31,0x00,0x56,0x33,0x35,0x37,0x32,0x00,0x56,0x33, 0x35,0x37,0x33,0x00,0x56,0x33,0x35,0x37,0x34,0x00,0x56,0x33,0x35,0x37,0x35,0x00, 0x56,0x33,0x35,0x37,0x36,0x00,0x56,0x33,0x35,0x37,0x37,0x00,0x56,0x33,0x35,0x37, 0x38,0x00,0x56,0x33,0x35,0x37,0x39,0x00,0x56,0x33,0x35,0x38,0x30,0x00,0x56,0x33, 0x35,0x38,0x31,0x00,0x56,0x33,0x35,0x38,0x32,0x00,0x56,0x33,0x35,0x38,0x33,0x00, 0x56,0x33,0x35,0x38,0x34,0x00,0x56,0x33,0x35,0x38,0x35,0x00,0x56,0x33,0x35,0x38, 0x36,0x00,0x56,0x33,0x35,0x38,0x37,0x00,0x56,0x33,0x35,0x38,0x38,0x00,0x56,0x33, 0x35,0x38,0x39,0x00,0x56,0x33,0x35,0x39,0x30,0x00,0x56,0x33,0x35,0x39,0x31,0x00, 0x56,0x33,0x35,0x39,0x32,0x00,0x56,0x33,0x35,0x39,0x33,0x00,0x56,0x33,0x35,0x39, 0x34,0x00,0x56,0x33,0x35,0x39,0x35,0x00,0x56,0x33,0x35,0x39,0x36,0x00,0x56,0x33, 0x35,0x39,0x37,0x00,0x56,0x33,0x35,0x39,0x38,0x00,0x56,0x33,0x35,0x39,0x39,0x00, 0x56,0x33,0x36,0x30,0x30,0x00,0x56,0x33,0x36,0x30,0x31,0x00,0x56,0x33,0x36,0x30, 0x32,0x00,0x56,0x33,0x36,0x30,0x33,0x00,0x56,0x33,0x36,0x30,0x34,0x00,0x56,0x33, 0x36,0x30,0x35,0x00,0x56,0x33,0x36,0x30,0x36,0x00,0x56,0x33,0x36,0x30,0x37,0x00, 0x56,0x33,0x36,0x30,0x38,0x00,0x56,0x33,0x36,0x30,0x39,0x00,0x56,0x33,0x36,0x31, 0x30,0x00,0x56,0x33,0x36,0x31,0x31,0x00,0x56,0x33,0x36,0x31,0x32,0x00,0x56,0x33, 0x36,0x31,0x33,0x00,0x56,0x33,0x36,0x31,0x34,0x00,0x56,0x33,0x36,0x31,0x35,0x00, 0x56,0x33,0x36,0x31,0x36,0x00,0x56,0x33,0x36,0x31,0x37,0x00,0x56,0x33,0x36,0x31, 0x38,0x00,0x56,0x33,0x36,0x31,0x39,0x00,0x56,0x33,0x36,0x32,0x30,0x00,0x56,0x33, 0x36,0x32,0x31,0x00,0x56,0x33,0x36,0x32,0x32,0x00,0x56,0x33,0x36,0x32,0x33,0x00, 0x56,0x33,0x36,0x32,0x34,0x00,0x56,0x33,0x36,0x32,0x35,0x00,0x56,0x33,0x36,0x32, 0x36,0x00,0x56,0x33,0x36,0x32,0x37,0x00,0x56,0x33,0x36,0x32,0x38,0x00,0x56,0x33, 0x36,0x32,0x39,0x00,0x56,0x33,0x36,0x33,0x30,0x00,0x56,0x33,0x36,0x33,0x31,0x00, 0x56,0x33,0x36,0x33,0x32,0x00,0x56,0x33,0x36,0x33,0x33,0x00,0x56,0x33,0x36,0x33, 0x34,0x00,0x56,0x33,0x36,0x33,0x35,0x00,0x56,0x33,0x36,0x33,0x36,0x00,0x56,0x33, 0x36,0x33,0x37,0x00,0x56,0x33,0x36,0x33,0x38,0x00,0x56,0x33,0x36,0x33,0x39,0x00, 0x56,0x33,0x36,0x34,0x30,0x00,0x56,0x33,0x36,0x34,0x31,0x00,0x56,0x33,0x36,0x34, 0x32,0x00,0x56,0x33,0x36,0x34,0x33,0x00,0x56,0x33,0x36,0x34,0x34,0x00,0x56,0x33, 0x36,0x34,0x35,0x00,0x56,0x33,0x36,0x34,0x36,0x00,0x56,0x33,0x36,0x34,0x37,0x00, 0x56,0x33,0x36,0x34,0x38,0x00,0x56,0x33,0x36,0x34,0x39,0x00,0x56,0x33,0x36,0x35, 0x30,0x00,0x56,0x33,0x36,0x35,0x31,0x00,0x56,0x33,0x36,0x35,0x32,0x00,0x56,0x33, 0x36,0x35,0x33,0x00,0x56,0x33,0x36,0x35,0x34,0x00,0x56,0x33,0x36,0x35,0x35,0x00, 0x56,0x33,0x36,0x35,0x36,0x00,0x56,0x33,0x36,0x35,0x37,0x00,0x56,0x33,0x36,0x35, 0x38,0x00,0x56,0x33,0x36,0x35,0x39,0x00,0x56,0x33,0x36,0x36,0x30,0x00,0x56,0x33, 0x36,0x36,0x31,0x00,0x56,0x33,0x36,0x36,0x32,0x00,0x56,0x33,0x36,0x36,0x33,0x00, 0x56,0x33,0x36,0x36,0x34,0x00,0x56,0x33,0x36,0x36,0x35,0x00,0x56,0x33,0x36,0x36, 0x36,0x00,0x56,0x33,0x36,0x36,0x37,0x00,0x56,0x33,0x36,0x36,0x38,0x00,0x56,0x33, 0x36,0x36,0x39,0x00,0x56,0x33,0x36,0x37,0x30,0x00,0x56,0x33,0x36,0x37,0x31,0x00, 0x56,0x33,0x36,0x37,0x32,0x00,0x56,0x33,0x36,0x37,0x33,0x00,0x56,0x33,0x36,0x37, 0x34,0x00,0x56,0x33,0x36,0x37,0x35,0x00,0x56,0x33,0x36,0x37,0x36,0x00,0x56,0x33, 0x36,0x37,0x37,0x00,0x56,0x33,0x36,0x37,0x38,0x00,0x56,0x33,0x36,0x37,0x39,0x00, 0x56,0x33,0x36,0x38,0x30,0x00,0x56,0x33,0x36,0x38,0x31,0x00,0x56,0x33,0x36,0x38, 0x32,0x00,0x56,0x33,0x36,0x38,0x33,0x00,0x56,0x33,0x36,0x38,0x34,0x00,0x56,0x33, 0x36,0x38,0x35,0x00,0x56,0x33,0x36,0x38,0x36,0x00,0x56,0x33,0x36,0x38,0x37,0x00, 0x56,0x33,0x36,0x38,0x38,0x00,0x56,0x33,0x36,0x38,0x39,0x00,0x56,0x33,0x36,0x39, 0x30,0x00,0x56,0x33,0x36,0x39,0x31,0x00,0x56,0x33,0x36,0x39,0x32,0x00,0x56,0x33, 0x36,0x39,0x33,0x00,0x56,0x33,0x36,0x39,0x34,0x00,0x56,0x33,0x36,0x39,0x35,0x00, 0x56,0x33,0x36,0x39,0x36,0x00,0x56,0x33,0x36,0x39,0x37,0x00,0x56,0x33,0x36,0x39, 0x38,0x00,0x56,0x33,0x36,0x39,0x39,0x00,0x56,0x33,0x37,0x30,0x30,0x00,0x56,0x33, 0x37,0x30,0x31,0x00,0x56,0x33,0x37,0x30,0x32,0x00,0x56,0x33,0x37,0x30,0x33,0x00, 0x56,0x33,0x37,0x30,0x34,0x00,0x56,0x33,0x37,0x30,0x35,0x00,0x56,0x33,0x37,0x30, 0x36,0x00,0x56,0x33,0x37,0x30,0x37,0x00,0x56,0x33,0x37,0x30,0x38,0x00,0x56,0x33, 0x37,0x30,0x39,0x00,0x56,0x33,0x37,0x31,0x30,0x00,0x56,0x33,0x37,0x31,0x31,0x00, 0x56,0x33,0x37,0x31,0x32,0x00,0x56,0x33,0x37,0x31,0x33,0x00,0x56,0x33,0x37,0x31, 0x34,0x00,0x56,0x33,0x37,0x31,0x35,0x00,0x56,0x33,0x37,0x31,0x36,0x00,0x56,0x33, 0x37,0x31,0x37,0x00,0x56,0x33,0x37,0x31,0x38,0x00,0x56,0x33,0x37,0x31,0x39,0x00, 0x56,0x33,0x37,0x32,0x30,0x00,0x56,0x33,0x37,0x32,0x31,0x00,0x56,0x33,0x37,0x32, 0x32,0x00,0x56,0x33,0x37,0x32,0x33,0x00,0x56,0x33,0x37,0x32,0x34,0x00,0x56,0x33, 0x37,0x32,0x35,0x00,0x56,0x33,0x37,0x32,0x36,0x00,0x56,0x33,0x37,0x32,0x37,0x00, 0x56,0x33,0x37,0x32,0x38,0x00,0x56,0x33,0x37,0x32,0x39,0x00,0x56,0x33,0x37,0x33, 0x30,0x00,0x56,0x33,0x37,0x33,0x31,0x00,0x56,0x33,0x37,0x33,0x32,0x00,0x56,0x33, 0x37,0x33,0x33,0x00,0x56,0x33,0x37,0x33,0x34,0x00,0x56,0x33,0x37,0x33,0x35,0x00, 0x56,0x33,0x37,0x33,0x36,0x00,0x56,0x33,0x37,0x33,0x37,0x00,0x56,0x33,0x37,0x33, 0x38,0x00,0x56,0x33,0x37,0x33,0x39,0x00,0x56,0x33,0x37,0x34,0x30,0x00,0x56,0x33, 0x37,0x34,0x31,0x00,0x56,0x33,0x37,0x34,0x32,0x00,0x56,0x33,0x37,0x34,0x33,0x00, 0x56,0x33,0x37,0x34,0x34,0x00,0x56,0x33,0x37,0x34,0x35,0x00,0x56,0x33,0x37,0x34, 0x36,0x00,0x56,0x33,0x37,0x34,0x37,0x00,0x56,0x33,0x37,0x34,0x38,0x00,0x56,0x33, 0x37,0x34,0x39,0x00,0x56,0x33,0x37,0x35,0x30,0x00,0x56,0x33,0x37,0x35,0x31,0x00, 0x56,0x33,0x37,0x35,0x32,0x00,0x56,0x33,0x37,0x35,0x33,0x00,0x56,0x33,0x37,0x35, 0x34,0x00,0x56,0x33,0x37,0x35,0x35,0x00,0x56,0x33,0x37,0x35,0x36,0x00,0x56,0x33, 0x37,0x35,0x37,0x00,0x56,0x33,0x37,0x35,0x38,0x00,0x56,0x33,0x37,0x35,0x39,0x00, 0x56,0x33,0x37,0x36,0x30,0x00,0x56,0x33,0x37,0x36,0x31,0x00,0x56,0x33,0x37,0x36, 0x32,0x00,0x56,0x33,0x37,0x36,0x33,0x00,0x56,0x33,0x37,0x36,0x34,0x00,0x56,0x33, 0x37,0x36,0x35,0x00,0x56,0x33,0x37,0x36,0x36,0x00,0x56,0x33,0x37,0x36,0x37,0x00, 0x56,0x33,0x37,0x36,0x38,0x00,0x56,0x33,0x37,0x36,0x39,0x00,0x56,0x33,0x37,0x37, 0x30,0x00,0x56,0x33,0x37,0x37,0x31,0x00,0x56,0x33,0x37,0x37,0x32,0x00,0x56,0x33, 0x37,0x37,0x33,0x00,0x56,0x33,0x37,0x37,0x34,0x00,0x56,0x33,0x37,0x37,0x35,0x00, 0x56,0x33,0x37,0x37,0x36,0x00,0x56,0x33,0x37,0x37,0x37,0x00,0x56,0x33,0x37,0x37, 0x38,0x00,0x56,0x33,0x37,0x37,0x39,0x00,0x56,0x33,0x37,0x38,0x30,0x00,0x56,0x33, 0x37,0x38,0x31,0x00,0x56,0x33,0x37,0x38,0x32,0x00,0x56,0x33,0x37,0x38,0x33,0x00, 0x56,0x33,0x37,0x38,0x34,0x00,0x56,0x33,0x37,0x38,0x35,0x00,0x56,0x33,0x37,0x38, 0x36,0x00,0x56,0x33,0x37,0x38,0x37,0x00,0x56,0x33,0x37,0x38,0x38,0x00,0x56,0x33, 0x37,0x38,0x39,0x00,0x56,0x33,0x37,0x39,0x30,0x00,0x56,0x33,0x37,0x39,0x31,0x00, 0x56,0x33,0x37,0x39,0x32,0x00,0x56,0x33,0x37,0x39,0x33,0x00,0x56,0x33,0x37,0x39, 0x34,0x00,0x56,0x33,0x37,0x39,0x35,0x00,0x56,0x33,0x37,0x39,0x36,0x00,0x56,0x33, 0x37,0x39,0x37,0x00,0x56,0x33,0x37,0x39,0x38,0x00,0x56,0x33,0x37,0x39,0x39,0x00, 0x56,0x33,0x38,0x30,0x30,0x00,0x56,0x33,0x38,0x30,0x31,0x00,0x56,0x33,0x38,0x30, 0x32,0x00,0x56,0x33,0x38,0x30,0x33,0x00,0x56,0x33,0x38,0x30,0x34,0x00,0x56,0x33, 0x38,0x30,0x35,0x00,0x56,0x33,0x38,0x30,0x36,0x00,0x56,0x33,0x38,0x30,0x37,0x00, 0x56,0x33,0x38,0x30,0x38,0x00,0x56,0x33,0x38,0x30,0x39,0x00,0x56,0x33,0x38,0x31, 0x30,0x00,0x56,0x33,0x38,0x31,0x31,0x00,0x56,0x33,0x38,0x31,0x32,0x00,0x56,0x33, 0x38,0x31,0x33,0x00,0x56,0x33,0x38,0x31,0x34,0x00,0x56,0x33,0x38,0x31,0x35,0x00, 0x56,0x33,0x38,0x31,0x36,0x00,0x56,0x33,0x38,0x31,0x37,0x00,0x56,0x33,0x38,0x31, 0x38,0x00,0x56,0x33,0x38,0x31,0x39,0x00,0x56,0x33,0x38,0x32,0x30,0x00,0x56,0x33, 0x38,0x32,0x31,0x00,0x56,0x33,0x38,0x32,0x32,0x00,0x56,0x33,0x38,0x32,0x33,0x00, 0x56,0x33,0x38,0x32,0x34,0x00,0x56,0x33,0x38,0x32,0x35,0x00,0x56,0x33,0x38,0x32, 0x36,0x00,0x56,0x33,0x38,0x32,0x37,0x00,0x56,0x33,0x38,0x32,0x38,0x00,0x56,0x33, 0x38,0x32,0x39,0x00,0x56,0x33,0x38,0x33,0x30,0x00,0x56,0x33,0x38,0x33,0x31,0x00, 0x56,0x33,0x38,0x33,0x32,0x00,0x56,0x33,0x38,0x33,0x33,0x00,0x56,0x33,0x38,0x33, 0x34,0x00,0x56,0x33,0x38,0x33,0x35,0x00,0x56,0x33,0x38,0x33,0x36,0x00,0x56,0x33, 0x38,0x33,0x37,0x00,0x56,0x33,0x38,0x33,0x38,0x00,0x56,0x33,0x38,0x33,0x39,0x00, 0x56,0x33,0x38,0x34,0x30,0x00,0x56,0x33,0x38,0x34,0x31,0x00,0x56,0x33,0x38,0x34, 0x32,0x00,0x56,0x33,0x38,0x34,0x33,0x00,0x56,0x33,0x38,0x34,0x34,0x00,0x56,0x33, 0x38,0x34,0x35,0x00,0x56,0x33,0x38,0x34,0x36,0x00,0x56,0x33,0x38,0x34,0x37,0x00, 0x56,0x33,0x38,0x34,0x38,0x00,0x56,0x33,0x38,0x34,0x39,0x00,0x56,0x33,0x38,0x35, 0x30,0x00,0x56,0x33,0x38,0x35,0x31,0x00,0x56,0x33,0x38,0x35,0x32,0x00,0x56,0x33, 0x38,0x35,0x33,0x00,0x56,0x33,0x38,0x35,0x34,0x00,0x56,0x33,0x38,0x35,0x35,0x00, 0x56,0x33,0x38,0x35,0x36,0x00,0x56,0x33,0x38,0x35,0x37,0x00,0x56,0x33,0x38,0x35, 0x38,0x00,0x56,0x33,0x38,0x35,0x39,0x00,0x56,0x33,0x38,0x36,0x30,0x00,0x56,0x33, 0x38,0x36,0x31,0x00,0x56,0x33,0x38,0x36,0x32,0x00,0x56,0x33,0x38,0x36,0x33,0x00, 0x56,0x33,0x38,0x36,0x34,0x00,0x56,0x33,0x38,0x36,0x35,0x00,0x56,0x33,0x38,0x36, 0x36,0x00,0x56,0x33,0x38,0x36,0x37,0x00,0x56,0x33,0x38,0x36,0x38,0x00,0x56,0x33, 0x38,0x36,0x39,0x00,0x56,0x33,0x38,0x37,0x30,0x00,0x56,0x33,0x38,0x37,0x31,0x00, 0x56,0x33,0x38,0x37,0x32,0x00,0x56,0x33,0x38,0x37,0x33,0x00,0x56,0x33,0x38,0x37, 0x34,0x00,0x56,0x33,0x38,0x37,0x35,0x00,0x56,0x33,0x38,0x37,0x36,0x00,0x56,0x33, 0x38,0x37,0x37,0x00,0x56,0x33,0x38,0x37,0x38,0x00,0x56,0x33,0x38,0x37,0x39,0x00, 0x56,0x33,0x38,0x38,0x30,0x00,0x56,0x33,0x38,0x38,0x31,0x00,0x56,0x33,0x38,0x38, 0x32,0x00,0x56,0x33,0x38,0x38,0x33,0x00,0x56,0x33,0x38,0x38,0x34,0x00,0x56,0x33, 0x38,0x38,0x35,0x00,0x56,0x33,0x38,0x38,0x36,0x00,0x56,0x33,0x38,0x38,0x37,0x00, 0x56,0x33,0x38,0x38,0x38,0x00,0x56,0x33,0x38,0x38,0x39,0x00,0x56,0x33,0x38,0x39, 0x30,0x00,0x56,0x33,0x38,0x39,0x31,0x00,0x56,0x33,0x38,0x39,0x32,0x00,0x56,0x33, 0x38,0x39,0x33,0x00,0x56,0x33,0x38,0x39,0x34,0x00,0x56,0x33,0x38,0x39,0x35,0x00, 0x56,0x33,0x38,0x39,0x36,0x00,0x56,0x33,0x38,0x39,0x37,0x00,0x56,0x33,0x38,0x39, 0x38,0x00,0x56,0x33,0x38,0x39,0x39,0x00,0x56,0x33,0x39,0x30,0x30,0x00,0x56,0x33, 0x39,0x30,0x31,0x00,0x56,0x33,0x39,0x30,0x32,0x00,0x56,0x33,0x39,0x30,0x33,0x00, 0x56,0x33,0x39,0x30,0x34,0x00,0x56,0x33,0x39,0x30,0x35,0x00,0x56,0x33,0x39,0x30, 0x36,0x00,0x56,0x33,0x39,0x30,0x37,0x00,0x56,0x33,0x39,0x30,0x38,0x00,0x56,0x33, 0x39,0x30,0x39,0x00,0x56,0x33,0x39,0x31,0x30,0x00,0x56,0x33,0x39,0x31,0x31,0x00, 0x56,0x33,0x39,0x31,0x32,0x00,0x56,0x33,0x39,0x31,0x33,0x00,0x56,0x33,0x39,0x31, 0x34,0x00,0x56,0x33,0x39,0x31,0x35,0x00,0x56,0x33,0x39,0x31,0x36,0x00,0x56,0x33, 0x39,0x31,0x37,0x00,0x56,0x33,0x39,0x31,0x38,0x00,0x56,0x33,0x39,0x31,0x39,0x00, 0x56,0x33,0x39,0x32,0x30,0x00,0x56,0x33,0x39,0x32,0x31,0x00,0x56,0x33,0x39,0x32, 0x32,0x00,0x56,0x33,0x39,0x32,0x33,0x00,0x56,0x33,0x39,0x32,0x34,0x00,0x56,0x33, 0x39,0x32,0x35,0x00,0x56,0x33,0x39,0x32,0x36,0x00,0x56,0x33,0x39,0x32,0x37,0x00, 0x56,0x33,0x39,0x32,0x38,0x00,0x56,0x33,0x39,0x32,0x39,0x00,0x56,0x33,0x39,0x33, 0x30,0x00,0x56,0x33,0x39,0x33,0x31,0x00,0x56,0x33,0x39,0x33,0x32,0x00,0x56,0x33, 0x39,0x33,0x33,0x00,0x56,0x33,0x39,0x33,0x34,0x00,0x56,0x33,0x39,0x33,0x35,0x00, 0x56,0x33,0x39,0x33,0x36,0x00,0x56,0x33,0x39,0x33,0x37,0x00,0x56,0x33,0x39,0x33, 0x38,0x00,0x56,0x33,0x39,0x33,0x39,0x00,0x56,0x33,0x39,0x34,0x30,0x00,0x56,0x33, 0x39,0x34,0x31,0x00,0x56,0x33,0x39,0x34,0x32,0x00,0x56,0x33,0x39,0x34,0x33,0x00, 0x56,0x33,0x39,0x34,0x34,0x00,0x56,0x33,0x39,0x34,0x35,0x00,0x56,0x33,0x39,0x34, 0x36,0x00,0x56,0x33,0x39,0x34,0x37,0x00,0x56,0x33,0x39,0x34,0x38,0x00,0x56,0x33, 0x39,0x34,0x39,0x00,0x56,0x33,0x39,0x35,0x30,0x00,0x56,0x33,0x39,0x35,0x31,0x00, 0x56,0x33,0x39,0x35,0x32,0x00,0x56,0x33,0x39,0x35,0x33,0x00,0x56,0x33,0x39,0x35, 0x34,0x00,0x56,0x33,0x39,0x35,0x35,0x00,0x56,0x33,0x39,0x35,0x36,0x00,0x56,0x33, 0x39,0x35,0x37,0x00,0x56,0x33,0x39,0x35,0x38,0x00,0x56,0x33,0x39,0x35,0x39,0x00, 0x56,0x33,0x39,0x36,0x30,0x00,0x56,0x33,0x39,0x36,0x31,0x00,0x56,0x33,0x39,0x36, 0x32,0x00,0x56,0x33,0x39,0x36,0x33,0x00,0x56,0x33,0x39,0x36,0x34,0x00,0x56,0x33, 0x39,0x36,0x35,0x00,0x56,0x33,0x39,0x36,0x36,0x00,0x56,0x33,0x39,0x36,0x37,0x00, 0x56,0x33,0x39,0x36,0x38,0x00,0x56,0x33,0x39,0x36,0x39,0x00,0x56,0x33,0x39,0x37, 0x30,0x00,0x56,0x33,0x39,0x37,0x31,0x00,0x56,0x33,0x39,0x37,0x32,0x00,0x56,0x33, 0x39,0x37,0x33,0x00,0x56,0x33,0x39,0x37,0x34,0x00,0x56,0x33,0x39,0x37,0x35,0x00, 0x56,0x33,0x39,0x37,0x36,0x00,0x56,0x33,0x39,0x37,0x37,0x00,0x56,0x33,0x39,0x37, 0x38,0x00,0x56,0x33,0x39,0x37,0x39,0x00,0x56,0x33,0x39,0x38,0x30,0x00,0x56,0x33, 0x39,0x38,0x31,0x00,0x56,0x33,0x39,0x38,0x32,0x00,0x56,0x33,0x39,0x38,0x33,0x00, 0x56,0x33,0x39,0x38,0x34,0x00,0x56,0x33,0x39,0x38,0x35,0x00,0x56,0x33,0x39,0x38, 0x36,0x00,0x56,0x33,0x39,0x38,0x37,0x00,0x56,0x33,0x39,0x38,0x38,0x00,0x56,0x33, 0x39,0x38,0x39,0x00,0x56,0x33,0x39,0x39,0x30,0x00,0x56,0x33,0x39,0x39,0x31,0x00, 0x56,0x33,0x39,0x39,0x32,0x00,0x56,0x33,0x39,0x39,0x33,0x00,0x56,0x33,0x39,0x39, 0x34,0x00,0x56,0x33,0x39,0x39,0x35,0x00,0x56,0x33,0x39,0x39,0x36,0x00,0x56,0x33, 0x39,0x39,0x37,0x00,0x56,0x33,0x39,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x39,0x00, 0x56,0x34,0x30,0x30,0x30,0x00,0x56,0x34,0x30,0x30,0x31,0x00,0x56,0x34,0x30,0x30, 0x32,0x00,0x56,0x34,0x30,0x30,0x33,0x00,0x56,0x34,0x30,0x30,0x34,0x00,0x56,0x34, 0x30,0x30,0x35,0x00,0x56,0x34,0x30,0x30,0x36,0x00,0x56,0x34,0x30,0x30,0x37,0x00, 0x56,0x34,0x30,0x30,0x38,0x00,0x56,0x34,0x30,0x30,0x39,0x00,0x56,0x34,0x30,0x31, 0x30,0x00,0x56,0x34,0x30,0x31,0x31,0x00,0x56,0x34,0x30,0x31,0x32,0x00,0x56,0x34, 0x30,0x31,0x33,0x00,0x56,0x34,0x30,0x31,0x34,0x00,0x56,0x34,0x30,0x31,0x35,0x00, 0x56,0x34,0x30,0x31,0x36,0x00,0x56,0x34,0x30,0x31,0x37,0x00,0x56,0x34,0x30,0x31, 0x38,0x00,0x56,0x34,0x30,0x31,0x39,0x00,0x56,0x34,0x30,0x32,0x30,0x00,0x56,0x34, 0x30,0x32,0x31,0x00,0x56,0x34,0x30,0x32,0x32,0x00,0x56,0x34,0x30,0x32,0x33,0x00, 0x56,0x34,0x30,0x32,0x34,0x00,0x56,0x34,0x30,0x32,0x35,0x00,0x56,0x34,0x30,0x32, 0x36,0x00,0x56,0x34,0x30,0x32,0x37,0x00,0x56,0x34,0x30,0x32,0x38,0x00,0x56,0x34, 0x30,0x32,0x39,0x00,0x56,0x34,0x30,0x33,0x30,0x00,0x56,0x34,0x30,0x33,0x31,0x00, 0x56,0x34,0x30,0x33,0x32,0x00,0x56,0x34,0x30,0x33,0x33,0x00,0x56,0x34,0x30,0x33, 0x34,0x00,0x56,0x34,0x30,0x33,0x35,0x00,0x56,0x34,0x30,0x33,0x36,0x00,0x56,0x34, 0x30,0x33,0x37,0x00,0x56,0x34,0x30,0x33,0x38,0x00,0x56,0x34,0x30,0x33,0x39,0x00, 0x56,0x34,0x30,0x34,0x30,0x00,0x56,0x34,0x30,0x34,0x31,0x00,0x56,0x34,0x30,0x34, 0x32,0x00,0x56,0x34,0x30,0x34,0x33,0x00,0x56,0x34,0x30,0x34,0x34,0x00,0x56,0x34, 0x30,0x34,0x35,0x00,0x56,0x34,0x30,0x34,0x36,0x00,0x56,0x34,0x30,0x34,0x37,0x00, 0x56,0x34,0x30,0x34,0x38,0x00,0x56,0x34,0x30,0x34,0x39,0x00,0x56,0x34,0x30,0x35, 0x30,0x00,0x56,0x34,0x30,0x35,0x31,0x00,0x56,0x34,0x30,0x35,0x32,0x00,0x56,0x34, 0x30,0x35,0x33,0x00,0x56,0x34,0x30,0x35,0x34,0x00,0x56,0x34,0x30,0x35,0x35,0x00, 0x56,0x34,0x30,0x35,0x36,0x00,0x56,0x34,0x30,0x35,0x37,0x00,0x56,0x34,0x30,0x35, 0x38,0x00,0x56,0x34,0x30,0x35,0x39,0x00,0x56,0x34,0x30,0x36,0x30,0x00,0x56,0x34, 0x30,0x36,0x31,0x00,0x56,0x34,0x30,0x36,0x32,0x00,0x56,0x34,0x30,0x36,0x33,0x00, 0x56,0x34,0x30,0x36,0x34,0x00,0x56,0x34,0x30,0x36,0x35,0x00,0x56,0x34,0x30,0x36, 0x36,0x00,0x56,0x34,0x30,0x36,0x37,0x00,0x56,0x34,0x30,0x36,0x38,0x00,0x56,0x34, 0x30,0x36,0x39,0x00,0x56,0x34,0x30,0x37,0x30,0x00,0x56,0x34,0x30,0x37,0x31,0x00, 0x56,0x34,0x30,0x37,0x32,0x00,0x56,0x34,0x30,0x37,0x33,0x00,0x56,0x34,0x30,0x37, 0x34,0x00,0x56,0x34,0x30,0x37,0x35,0x00,0x56,0x34,0x30,0x37,0x36,0x00,0x56,0x34, 0x30,0x37,0x37,0x00,0x56,0x34,0x30,0x37,0x38,0x00,0x56,0x34,0x30,0x37,0x39,0x00, 0x56,0x34,0x30,0x38,0x30,0x00,0x56,0x34,0x30,0x38,0x31,0x00,0x56,0x34,0x30,0x38, 0x32,0x00,0x56,0x34,0x30,0x38,0x33,0x00,0x56,0x34,0x30,0x38,0x34,0x00,0x56,0x34, 0x30,0x38,0x35,0x00,0x56,0x34,0x30,0x38,0x36,0x00,0x56,0x34,0x30,0x38,0x37,0x00, 0x56,0x34,0x30,0x38,0x38,0x00,0x41,0x30,0x30,0x00,0x41,0x30,0x31,0x00,0x41,0x30, 0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30,0x34,0x00,0x41,0x30,0x35,0x00,0x41,0x30, 0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30,0x38,0x00,0x41,0x30,0x39,0x00,0x41,0x31, 0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31,0x32,0x00,0x41,0x31,0x33,0x00,0x41,0x31, 0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31,0x36,0x00,0x41,0x31,0x37,0x00,0x41,0x31, 0x38,0x00,0x41,0x31,0x39,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30, 0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30, 0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31, 0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31, 0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31, 0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32, 0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32, 0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33, 0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33, 0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33, 0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34, 0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34, 0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35, 0x31,0x00,0x50,0x35,0x32,0x00,0x50,0x35,0x33,0x00,0x50,0x35,0x34,0x00,0x50,0x35, 0x35,0x00,0x50,0x35,0x36,0x00,0x50,0x35,0x37,0x00,0x50,0x35,0x38,0x00,0x50,0x35, 0x39,0x00,0x50,0x36,0x30,0x00,0x50,0x36,0x31,0x00,0x50,0x36,0x32,0x00,0x50,0x36, 0x33,0x00,0x50,0x36,0x34,0x00,0x50,0x36,0x35,0x00,0x50,0x36,0x36,0x00,0x50,0x36, 0x37,0x00,0x50,0x36,0x38,0x00,0x50,0x36,0x39,0x00,0x50,0x37,0x30,0x00,0x50,0x37, 0x31,0x00,0x50,0x37,0x32,0x00,0x50,0x37,0x33,0x00,0x50,0x37,0x34,0x00,0x50,0x37, 0x35,0x00,0x50,0x37,0x36,0x00,0x50,0x37,0x37,0x00,0x50,0x37,0x38,0x00,0x50,0x37, 0x39,0x00,0x50,0x38,0x30,0x00,0x50,0x38,0x31,0x00,0x50,0x38,0x32,0x00,0x50,0x38, 0x33,0x00,0x50,0x38,0x34,0x00,0x50,0x38,0x35,0x00,0x50,0x38,0x36,0x00,0x50,0x38, 0x37,0x00,0x50,0x38,0x38,0x00,0x50,0x38,0x39,0x00,0x50,0x39,0x30,0x00,0x50,0x39, 0x31,0x00,0x50,0x39,0x32,0x00,0x50,0x39,0x33,0x00,0x50,0x39,0x34,0x00,0x50,0x39, 0x35,0x00,0x50,0x39,0x36,0x00,0x50,0x39,0x37,0x00,0x50,0x39,0x38,0x00,0x50,0x39, 0x39,0x00,0x50,0x31,0x30,0x30,0x00,0x50,0x31,0x30,0x31,0x00,0x50,0x31,0x30,0x32, 0x00,0x50,0x31,0x30,0x33,0x00,0x50,0x31,0x30,0x34,0x00,0x50,0x31,0x30,0x35,0x00, 0x50,0x31,0x30,0x36,0x00,0x50,0x31,0x30,0x37,0x00,0x50,0x31,0x30,0x38,0x00,0x50, 0x31,0x30,0x39,0x00,0x50,0x31,0x31,0x30,0x00,0x50,0x31,0x31,0x31,0x00,0x50,0x31, 0x31,0x32,0x00,0x50,0x31,0x31,0x33,0x00,0x50,0x31,0x31,0x34,0x00,0x50,0x31,0x31, 0x35,0x00,0x50,0x31,0x31,0x36,0x00,0x50,0x31,0x31,0x37,0x00,0x50,0x31,0x31,0x38, 0x00,0x50,0x31,0x31,0x39,0x00,0x50,0x31,0x32,0x30,0x00,0x50,0x31,0x32,0x31,0x00, 0x50,0x31,0x32,0x32,0x00,0x50,0x31,0x32,0x33,0x00,0x50,0x31,0x32,0x34,0x00,0x50, 0x31,0x32,0x35,0x00,0x50,0x31,0x32,0x36,0x00,0x50,0x31,0x32,0x37,0x00,0x50,0x31, 0x32,0x38,0x00,0x50,0x31,0x32,0x39,0x00,0x50,0x31,0x33,0x30,0x00,0x50,0x31,0x33, 0x31,0x00,0x50,0x31,0x33,0x32,0x00,0x50,0x31,0x33,0x33,0x00,0x50,0x31,0x33,0x34, 0x00,0x50,0x31,0x33,0x35,0x00,0x50,0x31,0x33,0x36,0x00,0x50,0x31,0x33,0x37,0x00, 0x50,0x31,0x33,0x38,0x00,0x50,0x31,0x33,0x39,0x00,0x50,0x31,0x34,0x30,0x00,0x50, 0x31,0x34,0x31,0x00,0x50,0x31,0x34,0x32,0x00,0x50,0x31,0x34,0x33,0x00,0x50,0x31, 0x34,0x34,0x00,0x50,0x31,0x34,0x35,0x00,0x50,0x31,0x34,0x36,0x00,0x50,0x31,0x34, 0x37,0x00,0x50,0x31,0x34,0x38,0x00,0x50,0x31,0x34,0x39,0x00,0x50,0x31,0x35,0x30, 0x00,0x50,0x31,0x35,0x31,0x00,0x50,0x31,0x35,0x32,0x00,0x50,0x31,0x35,0x33,0x00, 0x50,0x31,0x35,0x34,0x00,0x50,0x31,0x35,0x35,0x00,0x50,0x31,0x35,0x36,0x00,0x50, 0x31,0x35,0x37,0x00,0x50,0x31,0x35,0x38,0x00,0x50,0x31,0x35,0x39,0x00,0x50,0x31, 0x36,0x30,0x00,0x50,0x31,0x36,0x31,0x00,0x50,0x31,0x36,0x32,0x00,0x50,0x31,0x36, 0x33,0x00,0x50,0x31,0x36,0x34,0x00,0x50,0x31,0x36,0x35,0x00,0x50,0x31,0x36,0x36, 0x00,0x50,0x31,0x36,0x37,0x00,0x50,0x31,0x36,0x38,0x00,0x50,0x31,0x36,0x39,0x00, 0x50,0x31,0x37,0x30,0x00,0x50,0x31,0x37,0x31,0x00,0x50,0x31,0x37,0x32,0x00,0x50, 0x31,0x37,0x33,0x00,0x50,0x31,0x37,0x34,0x00,0x50,0x31,0x37,0x35,0x00,0x50,0x31, 0x37,0x36,0x00,0x50,0x31,0x37,0x37,0x00,0x50,0x31,0x37,0x38,0x00,0x50,0x31,0x37, 0x39,0x00,0x50,0x31,0x38,0x30,0x00,0x50,0x31,0x38,0x31,0x00,0x50,0x31,0x38,0x32, 0x00,0x50,0x31,0x38,0x33,0x00,0x50,0x31,0x38,0x34,0x00,0x50,0x31,0x38,0x35,0x00, 0x50,0x31,0x38,0x36,0x00,0x50,0x31,0x38,0x37,0x00,0x50,0x31,0x38,0x38,0x00,0x50, 0x31,0x38,0x39,0x00,0x50,0x31,0x39,0x30,0x00,0x50,0x31,0x39,0x31,0x00,0x50,0x31, 0x39,0x32,0x00,0x50,0x31,0x39,0x33,0x00,0x50,0x31,0x39,0x34,0x00,0x50,0x31,0x39, 0x35,0x00,0x50,0x31,0x39,0x36,0x00,0x50,0x31,0x39,0x37,0x00,0x50,0x31,0x39,0x38, 0x00,0x50,0x31,0x39,0x39,0x00,0x50,0x32,0x30,0x30,0x00,0x50,0x32,0x30,0x31,0x00, 0x50,0x32,0x30,0x32,0x00,0x50,0x32,0x30,0x33,0x00,0x50,0x32,0x30,0x34,0x00,0x50, 0x32,0x30,0x35,0x00,0x50,0x32,0x30,0x36,0x00,0x50,0x32,0x30,0x37,0x00,0x50,0x32, 0x30,0x38,0x00,0x50,0x32,0x30,0x39,0x00,0x50,0x32,0x31,0x30,0x00,0x50,0x32,0x31, 0x31,0x00,0x50,0x32,0x31,0x32,0x00,0x50,0x32,0x31,0x33,0x00,0x50,0x32,0x31,0x34, 0x00,0x50,0x32,0x31,0x35,0x00,0x50,0x32,0x31,0x36,0x00,0x50,0x32,0x31,0x37,0x00, 0x50,0x32,0x31,0x38,0x00,0x50,0x32,0x31,0x39,0x00,0x50,0x32,0x32,0x30,0x00,0x50, 0x32,0x32,0x31,0x00,0x50,0x32,0x32,0x32,0x00,0x50,0x32,0x32,0x33,0x00,0x50,0x32, 0x32,0x34,0x00,0x50,0x32,0x32,0x35,0x00,0x50,0x32,0x32,0x36,0x00,0x50,0x32,0x32, 0x37,0x00,0x50,0x32,0x32,0x38,0x00,0x50,0x32,0x32,0x39,0x00,0x50,0x32,0x33,0x30, 0x00,0x50,0x32,0x33,0x31,0x00,0x50,0x32,0x33,0x32,0x00,0x50,0x32,0x33,0x33,0x00, 0x50,0x32,0x33,0x34,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79, 0x5f,0x72,0x65,0x61,0x64,0x73,0x77,0x61,0x70,0x5f,0x33,0x32,0x78,0x33,0x32,0x5f, 0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f, 0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73, 0x64,0x69,0x76,0x69,0x69,0x2e,0x31,0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42, 0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f, 0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f, 0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00, 0x42,0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31, 0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f, 0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f,0x31, 0x34,0x5f,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42,0x42, 0x5f,0x31,0x36,0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38,0x00, 0x42,0x42,0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x32, 0x30,0x00,0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x31, 0x5f,0x32,0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42,0x5f, 0x32,0x33,0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00,0x42, 0x42,0x5f,0x32,0x35,0x5f,0x32,0x36,0x00,0x42,0x42,0x5f,0x32,0x36,0x5f,0x32,0x37, 0x00,0x42,0x42,0x5f,0x32,0x37,0x5f,0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x38,0x5f, 0x32,0x39,0x00,0x42,0x42,0x5f,0x32,0x39,0x5f,0x33,0x30,0x00,0x42,0x42,0x5f,0x33, 0x30,0x5f,0x33,0x31,0x00,0x42,0x42,0x5f,0x33,0x31,0x5f,0x33,0x32,0x00,0x42,0x42, 0x5f,0x33,0x32,0x5f,0x33,0x33,0x00,0x42,0x42,0x5f,0x33,0x33,0x5f,0x33,0x34,0x00, 0x42,0x42,0x5f,0x33,0x34,0x5f,0x33,0x35,0x00,0x42,0x42,0x5f,0x33,0x35,0x5f,0x33, 0x36,0x00,0x42,0x42,0x5f,0x33,0x36,0x5f,0x33,0x37,0x00,0x42,0x42,0x5f,0x33,0x37, 0x5f,0x33,0x38,0x00,0x42,0x42,0x5f,0x33,0x38,0x5f,0x33,0x39,0x00,0x42,0x42,0x5f, 0x33,0x39,0x5f,0x34,0x30,0x00,0x42,0x42,0x5f,0x34,0x30,0x5f,0x34,0x31,0x00,0x42, 0x42,0x5f,0x34,0x31,0x5f,0x34,0x32,0x00,0x42,0x42,0x5f,0x34,0x32,0x5f,0x34,0x33, 0x00,0x42,0x42,0x5f,0x34,0x33,0x5f,0x34,0x34,0x00,0x42,0x42,0x5f,0x34,0x34,0x5f, 0x34,0x35,0x00,0x42,0x42,0x5f,0x34,0x35,0x5f,0x34,0x36,0x00,0x42,0x42,0x5f,0x34, 0x36,0x5f,0x34,0x37,0x00,0x42,0x42,0x5f,0x34,0x37,0x5f,0x34,0x38,0x00,0x42,0x42, 0x5f,0x34,0x38,0x5f,0x34,0x39,0x00,0x42,0x42,0x5f,0x34,0x39,0x5f,0x35,0x30,0x00, 0x42,0x42,0x5f,0x35,0x30,0x5f,0x35,0x31,0x00,0x42,0x42,0x5f,0x35,0x31,0x5f,0x35, 0x32,0x00,0x42,0x42,0x5f,0x35,0x32,0x5f,0x35,0x33,0x00,0x42,0x42,0x5f,0x35,0x33, 0x5f,0x35,0x34,0x00,0x42,0x42,0x5f,0x35,0x34,0x5f,0x35,0x35,0x00,0x42,0x42,0x5f, 0x35,0x35,0x5f,0x35,0x36,0x00,0x42,0x42,0x5f,0x35,0x36,0x5f,0x35,0x37,0x00,0x42, 0x42,0x5f,0x35,0x37,0x5f,0x35,0x38,0x00,0x42,0x42,0x5f,0x35,0x38,0x5f,0x35,0x39, 0x00,0x42,0x42,0x5f,0x35,0x39,0x5f,0x36,0x30,0x00,0x42,0x42,0x5f,0x36,0x30,0x5f, 0x36,0x31,0x00,0x42,0x42,0x5f,0x36,0x31,0x5f,0x36,0x32,0x00,0x42,0x42,0x5f,0x36, 0x32,0x5f,0x36,0x33,0x00,0x42,0x42,0x5f,0x36,0x33,0x5f,0x36,0x34,0x00,0x42,0x42, 0x5f,0x36,0x34,0x5f,0x36,0x35,0x00,0x42,0x42,0x5f,0x36,0x35,0x5f,0x36,0x36,0x00, 0x42,0x42,0x5f,0x36,0x36,0x5f,0x36,0x37,0x00,0x42,0x42,0x5f,0x36,0x37,0x5f,0x36, 0x38,0x00,0x42,0x42,0x5f,0x36,0x38,0x5f,0x36,0x39,0x00,0x42,0x42,0x5f,0x36,0x39, 0x5f,0x37,0x30,0x00,0x42,0x42,0x5f,0x37,0x30,0x5f,0x37,0x31,0x00,0x42,0x42,0x5f, 0x37,0x31,0x5f,0x37,0x32,0x00,0x42,0x42,0x5f,0x37,0x32,0x5f,0x37,0x33,0x00,0x42, 0x42,0x5f,0x37,0x33,0x5f,0x37,0x34,0x00,0x42,0x42,0x5f,0x37,0x34,0x5f,0x37,0x35, 0x00,0x42,0x42,0x5f,0x37,0x35,0x5f,0x37,0x36,0x00,0x42,0x42,0x5f,0x37,0x36,0x5f, 0x37,0x37,0x00,0x42,0x42,0x5f,0x37,0x37,0x5f,0x37,0x38,0x00,0x42,0x42,0x5f,0x37, 0x38,0x5f,0x37,0x39,0x00,0x42,0x42,0x5f,0x37,0x39,0x5f,0x38,0x30,0x00,0x42,0x42, 0x5f,0x38,0x30,0x5f,0x38,0x31,0x00,0x42,0x42,0x5f,0x38,0x31,0x5f,0x38,0x32,0x00, 0x42,0x42,0x5f,0x38,0x32,0x5f,0x38,0x33,0x00,0x42,0x42,0x5f,0x38,0x33,0x5f,0x38, 0x34,0x00,0x42,0x42,0x5f,0x38,0x34,0x5f,0x38,0x35,0x00,0x42,0x42,0x5f,0x38,0x35, 0x5f,0x38,0x36,0x00,0x42,0x42,0x5f,0x38,0x36,0x5f,0x38,0x37,0x00,0x42,0x42,0x5f, 0x38,0x37,0x5f,0x38,0x38,0x00,0x42,0x42,0x5f,0x38,0x38,0x5f,0x38,0x39,0x00,0x42, 0x42,0x5f,0x38,0x39,0x5f,0x39,0x30,0x00,0x42,0x42,0x5f,0x39,0x30,0x5f,0x39,0x31, 0x00,0x42,0x42,0x5f,0x39,0x31,0x5f,0x39,0x32,0x00,0x42,0x42,0x5f,0x39,0x32,0x5f, 0x39,0x33,0x00,0x42,0x42,0x5f,0x39,0x33,0x5f,0x39,0x34,0x00,0x42,0x42,0x5f,0x39, 0x34,0x5f,0x39,0x35,0x00,0x42,0x42,0x5f,0x39,0x35,0x5f,0x39,0x36,0x00,0x42,0x42, 0x5f,0x39,0x36,0x5f,0x39,0x37,0x00,0x42,0x42,0x5f,0x39,0x37,0x5f,0x39,0x38,0x00, 0x42,0x42,0x5f,0x39,0x38,0x5f,0x39,0x39,0x00,0x42,0x42,0x5f,0x39,0x39,0x5f,0x31, 0x30,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x30,0x5f,0x31,0x30,0x31,0x00,0x42,0x42, 0x5f,0x31,0x30,0x31,0x5f,0x31,0x30,0x32,0x00,0x42,0x42,0x5f,0x31,0x30,0x32,0x5f, 0x31,0x30,0x33,0x00,0x42,0x42,0x5f,0x31,0x30,0x33,0x5f,0x31,0x30,0x34,0x00,0x42, 0x42,0x5f,0x31,0x30,0x34,0x5f,0x31,0x30,0x35,0x00,0x42,0x42,0x5f,0x31,0x30,0x35, 0x5f,0x31,0x30,0x36,0x00,0x42,0x42,0x5f,0x31,0x30,0x36,0x5f,0x31,0x30,0x37,0x00, 0x42,0x42,0x5f,0x31,0x30,0x37,0x5f,0x31,0x30,0x38,0x00,0x42,0x42,0x5f,0x31,0x30, 0x38,0x5f,0x31,0x30,0x39,0x00,0x42,0x42,0x5f,0x31,0x30,0x39,0x5f,0x31,0x31,0x30, 0x00,0x42,0x42,0x5f,0x31,0x31,0x30,0x5f,0x31,0x31,0x31,0x00,0x42,0x42,0x5f,0x31, 0x31,0x31,0x5f,0x31,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x31,0x32,0x5f,0x31,0x31, 0x33,0x00,0x42,0x42,0x5f,0x31,0x31,0x33,0x5f,0x31,0x31,0x34,0x00,0x42,0x42,0x5f, 0x31,0x31,0x34,0x5f,0x31,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x31,0x35,0x5f,0x31, 0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x31,0x36,0x5f,0x31,0x31,0x37,0x00,0x42,0x42, 0x5f,0x31,0x31,0x37,0x5f,0x31,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x31,0x38,0x5f, 0x31,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x31,0x39,0x5f,0x31,0x32,0x30,0x00,0x42, 0x42,0x5f,0x31,0x32,0x30,0x5f,0x31,0x32,0x31,0x00,0x42,0x42,0x5f,0x31,0x32,0x31, 0x5f,0x31,0x32,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x32,0x5f,0x31,0x32,0x33,0x00, 0x42,0x42,0x5f,0x31,0x32,0x33,0x5f,0x31,0x32,0x34,0x00,0x42,0x42,0x5f,0x31,0x32, 0x34,0x5f,0x31,0x32,0x35,0x00,0x42,0x42,0x5f,0x31,0x32,0x35,0x5f,0x31,0x32,0x36, 0x00,0x42,0x42,0x5f,0x31,0x32,0x36,0x5f,0x31,0x32,0x37,0x00,0x42,0x42,0x5f,0x31, 0x32,0x37,0x5f,0x31,0x32,0x38,0x00,0x42,0x42,0x5f,0x31,0x32,0x38,0x5f,0x31,0x32, 0x39,0x00,0x42,0x42,0x5f,0x31,0x32,0x39,0x5f,0x31,0x33,0x30,0x00,0x42,0x42,0x5f, 0x31,0x33,0x30,0x5f,0x31,0x33,0x31,0x00,0x42,0x42,0x5f,0x31,0x33,0x31,0x5f,0x31, 0x33,0x32,0x00,0x42,0x42,0x5f,0x31,0x33,0x32,0x5f,0x31,0x33,0x33,0x00,0x42,0x42, 0x5f,0x31,0x33,0x33,0x5f,0x31,0x33,0x34,0x00,0x42,0x42,0x5f,0x31,0x33,0x34,0x5f, 0x31,0x33,0x35,0x00,0x42,0x42,0x5f,0x31,0x33,0x35,0x5f,0x31,0x33,0x36,0x00,0x42, 0x42,0x5f,0x31,0x33,0x36,0x5f,0x31,0x33,0x37,0x00,0x42,0x42,0x5f,0x31,0x33,0x37, 0x5f,0x31,0x33,0x38,0x00,0x42,0x42,0x5f,0x31,0x33,0x38,0x5f,0x31,0x33,0x39,0x00, 0x42,0x42,0x5f,0x31,0x33,0x39,0x5f,0x31,0x34,0x30,0x00,0x42,0x42,0x5f,0x31,0x34, 0x30,0x5f,0x31,0x34,0x31,0x00,0x42,0x42,0x5f,0x31,0x34,0x31,0x5f,0x31,0x34,0x32, 0x00,0x42,0x42,0x5f,0x31,0x34,0x32,0x5f,0x31,0x34,0x33,0x00,0x42,0x42,0x5f,0x31, 0x34,0x33,0x5f,0x31,0x34,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x34,0x5f,0x31,0x34, 0x35,0x00,0x42,0x42,0x5f,0x31,0x34,0x35,0x5f,0x31,0x34,0x36,0x00,0x42,0x42,0x5f, 0x31,0x34,0x36,0x5f,0x31,0x34,0x37,0x00,0x42,0x42,0x5f,0x31,0x34,0x37,0x5f,0x31, 0x34,0x38,0x00,0x42,0x42,0x5f,0x31,0x34,0x38,0x5f,0x31,0x34,0x39,0x00,0x42,0x42, 0x5f,0x31,0x34,0x39,0x5f,0x31,0x35,0x30,0x00,0x42,0x42,0x5f,0x31,0x35,0x30,0x5f, 0x31,0x35,0x31,0x00,0x42,0x42,0x5f,0x31,0x35,0x31,0x5f,0x31,0x35,0x32,0x00,0x42, 0x42,0x5f,0x31,0x35,0x32,0x5f,0x31,0x35,0x33,0x00,0x42,0x42,0x5f,0x31,0x35,0x33, 0x5f,0x31,0x35,0x34,0x00,0x42,0x42,0x5f,0x31,0x35,0x34,0x5f,0x31,0x35,0x35,0x00, 0x42,0x42,0x5f,0x31,0x35,0x35,0x5f,0x31,0x35,0x36,0x00,0x42,0x42,0x5f,0x31,0x35, 0x36,0x5f,0x31,0x35,0x37,0x00,0x42,0x42,0x5f,0x31,0x35,0x37,0x5f,0x31,0x35,0x38, 0x00,0x42,0x42,0x5f,0x31,0x35,0x38,0x5f,0x31,0x35,0x39,0x00,0x42,0x42,0x5f,0x31, 0x35,0x39,0x5f,0x31,0x36,0x30,0x00,0x42,0x42,0x5f,0x31,0x36,0x30,0x5f,0x31,0x36, 0x31,0x00,0x42,0x42,0x5f,0x31,0x36,0x31,0x5f,0x31,0x36,0x32,0x00,0x42,0x42,0x5f, 0x31,0x36,0x32,0x5f,0x31,0x36,0x33,0x00,0x42,0x42,0x5f,0x31,0x36,0x33,0x5f,0x31, 0x36,0x34,0x00,0x42,0x42,0x5f,0x31,0x36,0x34,0x5f,0x31,0x36,0x35,0x00,0x42,0x42, 0x5f,0x31,0x36,0x35,0x5f,0x31,0x36,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x36,0x5f, 0x31,0x36,0x37,0x00,0x42,0x42,0x5f,0x31,0x36,0x37,0x5f,0x31,0x36,0x38,0x00,0x42, 0x42,0x5f,0x31,0x36,0x38,0x5f,0x31,0x36,0x39,0x00,0x42,0x42,0x5f,0x31,0x36,0x39, 0x5f,0x31,0x37,0x30,0x00,0x42,0x42,0x5f,0x31,0x37,0x30,0x5f,0x31,0x37,0x31,0x00, 0x42,0x42,0x5f,0x31,0x37,0x31,0x5f,0x31,0x37,0x32,0x00,0x42,0x42,0x5f,0x31,0x37, 0x32,0x5f,0x31,0x37,0x33,0x00,0x42,0x42,0x5f,0x31,0x37,0x33,0x5f,0x31,0x37,0x34, 0x00,0x42,0x42,0x5f,0x31,0x37,0x34,0x5f,0x31,0x37,0x35,0x00,0x42,0x42,0x5f,0x31, 0x37,0x35,0x5f,0x31,0x37,0x36,0x00,0x42,0x42,0x5f,0x31,0x37,0x36,0x5f,0x31,0x37, 0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x37,0x5f,0x31,0x37,0x38,0x00,0x42,0x42,0x5f, 0x31,0x37,0x38,0x5f,0x31,0x37,0x39,0x00,0x42,0x42,0x5f,0x31,0x37,0x39,0x5f,0x31, 0x38,0x30,0x00,0x42,0x42,0x5f,0x31,0x38,0x30,0x5f,0x31,0x38,0x31,0x00,0x42,0x42, 0x5f,0x31,0x38,0x31,0x5f,0x31,0x38,0x32,0x00,0x42,0x42,0x5f,0x31,0x38,0x32,0x5f, 0x31,0x38,0x33,0x00,0x42,0x42,0x5f,0x31,0x38,0x33,0x5f,0x31,0x38,0x34,0x00,0x42, 0x42,0x5f,0x31,0x38,0x34,0x5f,0x31,0x38,0x35,0x00,0x42,0x42,0x5f,0x31,0x38,0x35, 0x5f,0x31,0x38,0x36,0x00,0x42,0x42,0x5f,0x31,0x38,0x36,0x5f,0x31,0x38,0x37,0x00, 0x42,0x42,0x5f,0x31,0x38,0x37,0x5f,0x31,0x38,0x38,0x00,0x42,0x42,0x5f,0x31,0x38, 0x38,0x5f,0x31,0x38,0x39,0x00,0x42,0x42,0x5f,0x31,0x38,0x39,0x5f,0x31,0x39,0x30, 0x00,0x42,0x42,0x5f,0x31,0x39,0x30,0x5f,0x31,0x39,0x31,0x00,0x42,0x42,0x5f,0x31, 0x39,0x31,0x5f,0x31,0x39,0x32,0x00,0x42,0x42,0x5f,0x31,0x39,0x32,0x5f,0x31,0x39, 0x33,0x00,0x42,0x42,0x5f,0x31,0x39,0x33,0x5f,0x31,0x39,0x34,0x00,0x42,0x42,0x5f, 0x31,0x39,0x34,0x5f,0x31,0x39,0x35,0x00,0x42,0x42,0x5f,0x31,0x39,0x35,0x5f,0x31, 0x39,0x36,0x00,0x42,0x42,0x5f,0x31,0x39,0x36,0x5f,0x31,0x39,0x37,0x00,0x42,0x42, 0x5f,0x31,0x39,0x37,0x5f,0x31,0x39,0x38,0x00,0x42,0x42,0x5f,0x31,0x39,0x38,0x5f, 0x31,0x39,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x39,0x5f,0x32,0x30,0x30,0x00,0x42, 0x42,0x5f,0x32,0x30,0x30,0x5f,0x32,0x30,0x31,0x00,0x42,0x42,0x5f,0x32,0x30,0x31, 0x5f,0x32,0x30,0x32,0x00,0x42,0x42,0x5f,0x32,0x30,0x32,0x5f,0x32,0x30,0x33,0x00, 0x42,0x42,0x5f,0x32,0x30,0x33,0x5f,0x32,0x30,0x34,0x00,0x42,0x42,0x5f,0x32,0x30, 0x34,0x5f,0x32,0x30,0x35,0x00,0x42,0x42,0x5f,0x32,0x30,0x35,0x5f,0x32,0x30,0x36, 0x00,0x42,0x42,0x5f,0x32,0x30,0x36,0x5f,0x32,0x30,0x37,0x00,0x42,0x42,0x5f,0x32, 0x30,0x37,0x5f,0x32,0x30,0x38,0x00,0x42,0x42,0x5f,0x32,0x30,0x38,0x5f,0x32,0x30, 0x39,0x00,0x42,0x42,0x5f,0x32,0x30,0x39,0x5f,0x32,0x31,0x30,0x00,0x42,0x42,0x5f, 0x32,0x31,0x30,0x5f,0x32,0x31,0x31,0x00,0x42,0x42,0x5f,0x32,0x31,0x31,0x5f,0x32, 0x31,0x32,0x00,0x42,0x42,0x5f,0x32,0x31,0x32,0x5f,0x32,0x31,0x33,0x00,0x42,0x42, 0x5f,0x32,0x31,0x33,0x5f,0x32,0x31,0x34,0x00,0x42,0x42,0x5f,0x32,0x31,0x34,0x5f, 0x32,0x31,0x35,0x00,0x42,0x42,0x5f,0x32,0x31,0x35,0x5f,0x32,0x31,0x36,0x00,0x42, 0x42,0x5f,0x32,0x31,0x36,0x5f,0x32,0x31,0x37,0x00,0x42,0x42,0x5f,0x32,0x31,0x37, 0x5f,0x32,0x31,0x38,0x00,0x42,0x42,0x5f,0x32,0x31,0x38,0x5f,0x32,0x31,0x39,0x00, 0x42,0x42,0x5f,0x32,0x31,0x39,0x5f,0x32,0x32,0x30,0x00,0x42,0x42,0x5f,0x32,0x32, 0x30,0x5f,0x32,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x32,0x31,0x5f,0x32,0x32,0x32, 0x00,0x42,0x42,0x5f,0x32,0x32,0x32,0x5f,0x32,0x32,0x33,0x00,0x42,0x42,0x5f,0x32, 0x32,0x33,0x5f,0x32,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x32,0x34,0x5f,0x32,0x32, 0x35,0x00,0x42,0x42,0x5f,0x32,0x32,0x35,0x5f,0x32,0x32,0x36,0x00,0x42,0x42,0x5f, 0x32,0x32,0x36,0x5f,0x32,0x32,0x37,0x00,0x42,0x42,0x5f,0x32,0x32,0x37,0x5f,0x32, 0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x32,0x38,0x5f,0x32,0x32,0x39,0x00,0x42,0x42, 0x5f,0x32,0x32,0x39,0x5f,0x32,0x33,0x30,0x00,0x42,0x42,0x5f,0x32,0x33,0x30,0x5f, 0x32,0x33,0x31,0x00,0x42,0x42,0x5f,0x32,0x33,0x31,0x5f,0x32,0x33,0x32,0x00,0x42, 0x42,0x5f,0x32,0x33,0x32,0x5f,0x32,0x33,0x33,0x00,0x42,0x42,0x5f,0x32,0x33,0x33, 0x5f,0x32,0x33,0x34,0x00,0x42,0x42,0x5f,0x32,0x33,0x34,0x5f,0x32,0x33,0x35,0x00, 0x42,0x42,0x5f,0x32,0x33,0x35,0x5f,0x32,0x33,0x36,0x00,0x42,0x42,0x5f,0x32,0x33, 0x36,0x5f,0x32,0x33,0x37,0x00,0x42,0x42,0x5f,0x32,0x33,0x37,0x5f,0x32,0x33,0x38, 0x00,0x42,0x42,0x5f,0x32,0x33,0x38,0x5f,0x32,0x33,0x39,0x00,0x42,0x42,0x5f,0x32, 0x33,0x39,0x5f,0x32,0x34,0x30,0x00,0x42,0x42,0x5f,0x32,0x34,0x30,0x5f,0x32,0x34, 0x31,0x00,0x42,0x42,0x5f,0x32,0x34,0x31,0x5f,0x32,0x34,0x32,0x00,0x54,0x30,0x30, 0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e, 0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00, 0x00,0x00,0x00,0x00,0xd9,0x0f,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00, 0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00, 0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x02, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x02,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x02, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x02, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x51,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x03, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x03,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x03,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x03, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x03,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x03, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x04,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x04,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x04,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x04,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x04, 0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x04,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x04,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x04,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x04,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x04,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x04,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x04,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x04, 0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x04, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x04, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x05, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x05,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x05,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x05,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x05, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x05,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x05,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x05,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x05,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x05,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x05,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x05, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x05,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x05,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x05, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x05,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x05,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x05,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x05,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x05,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x05, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x05,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x05,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x05,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x05,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x05,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x05,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x05,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x05,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x06,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x06,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x06, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x06,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x06,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x06,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x06,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x06, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x06,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x06,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x06,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x06,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x06,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x06,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x06,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x06,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x06, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x06,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x06,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x06,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x06,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x06,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x06, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x06,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x06,0x00,0x00, 0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x06,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x07, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x07,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x07,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x07,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x07, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x07,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x07,0x00,0x00, 0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x07,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x07,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x07,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x07, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x07,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x07,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x07,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x07,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x07, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x07,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x07,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x07,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x07,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x07,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x07,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x08,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x08, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x08,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x08,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x08,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x08,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x08,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x08,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x08, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x08,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x08,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x08,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x08,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x08, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x08,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x08,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x08,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x08,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x08,0x00,0x00,0x51,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x08,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x08, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x08,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x08,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x08,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x08,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x09,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x09,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x09,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x09,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x09, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x09,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x09,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x09,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x09,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x09,0x00,0x00,0x51,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x09,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x09,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x09,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x09,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x09,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x09,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x09,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x09, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x09,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x09,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x09,0x00,0x00,0x51, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x09,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x09,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x09, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x09,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x09, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x09,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x09,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x09,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x09, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x09,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x09,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x09,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x09,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x09,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x09,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x09,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x09,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x09,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x09, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x09,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x09,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x09,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x09,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x09,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x09,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x09, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x09,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x09,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x09,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x09,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x09,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x09,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x09,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x09,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x09,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x09, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x09,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x09,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x09,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x09,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x09,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x09,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x09,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x09,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x09,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x09,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x09,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x09,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x09,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x09, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x09,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x09,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x09,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x09,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x09,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x09,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x09,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x20,0x01,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x20,0x01,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x09,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0a,0x00,0x00,0x20,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0a,0x00,0x00,0x20,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0a,0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0a,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0a, 0x00,0x00,0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0a,0x00, 0x00,0x23,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00,0x00, 0x12,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x53, 0x00,0x02,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0a,0x00,0x00,0x53,0x20, 0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x00,0x00,0x53,0x20,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x00,0x00,0x54,0x40,0x00,0x5f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x54,0x00,0x04,0x72,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x00,0x00,0x54,0x40,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x54,0x40,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0a,0x00,0x00,0x54,0x40,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0a,0x00,0x00,0x54,0x40,0x00,0x63,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0a,0x00,0x00,0x54,0x40,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0a,0x00,0x00,0x54,0x40,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0a,0x00,0x00,0x54,0x40,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0a,0x00,0x00,0x54,0x40,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0a, 0x00,0x00,0x54,0x40,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0a,0x00, 0x00,0x54,0x40,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x00,0x00, 0x54,0x40,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0a,0x00,0x00,0x54, 0x40,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0a,0x00,0x00,0x54,0x40, 0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0a,0x00,0x00,0x51,0x10,0x00, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x51,0x10,0x00,0x6e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0a,0x00,0x00,0x23,0x02,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0a,0x00,0x00,0x12,0x01,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x00,0x00,0x20,0x01,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0a,0x00,0x00,0x21,0x01,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0a,0x00,0x00,0x20,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0a,0x00,0x00,0x20,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0a,0x00,0x00,0x20,0x01,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0a,0x00,0x00,0x20,0x01,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0a,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0a, 0x00,0x00,0x20,0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0a,0x00, 0x00,0x20,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x00,0x00, 0x20,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0a,0x00,0x00,0x20, 0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0a,0x00,0x00,0x50,0x08, 0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0a,0x00,0x00,0x20,0x01,0x00, 0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0a,0x00,0x00,0x20,0x01,0x00,0x8a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0a,0x00,0x00,0x20,0x01,0x00,0x8c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0a,0x00,0x00,0x20,0x01,0x00,0x8d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0a,0x00,0x00,0x20,0x01,0x00,0x8e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0a,0x00,0x00,0x20,0x01,0x00,0x91,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0a,0x00,0x00,0x20,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0a,0x00,0x00,0x20,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0a,0x00,0x00,0x20,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0a,0x00,0x00,0x20,0x01,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0a,0x00,0x00,0x50,0x08,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0a, 0x00,0x00,0x20,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0a,0x00, 0x00,0x20,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0a,0x00,0x00, 0x20,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0a,0x00,0x00,0x20, 0x01,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0a,0x00,0x00,0x20,0x01, 0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0a,0x00,0x00,0x21,0x01,0x00, 0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0a,0x00,0x00,0x20,0x01,0x00,0xa6, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0a,0x00,0x00,0x20,0x01,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0a,0x00,0x00,0x20,0x01,0x00,0xa9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0a,0x00,0x00,0x20,0x01,0x00,0xab,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0a,0x00,0x00,0x20,0x01,0x00,0xad,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x20,0x01,0x00,0xaf,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0a,0x00,0x00,0x20,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0a,0x00,0x00,0x20,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0a,0x00,0x00,0x20,0x01,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0a,0x00,0x00,0x20,0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0a, 0x00,0x00,0x20,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0a,0x00, 0x00,0x20,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0a,0x00,0x00, 0x20,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0a,0x00,0x00,0x20, 0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x20,0x01, 0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0a,0x00,0x00,0x50,0x08,0x00, 0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0a,0x00,0x00,0x20,0x01,0x00,0xc6, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0a,0x00,0x00,0x20,0x01,0x00,0xc8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0a,0x00,0x00,0x20,0x01,0x00,0xca,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0a,0x00,0x00,0x20,0x01,0x00,0xcc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0a,0x00,0x00,0x20,0x01,0x00,0xce,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0a,0x00,0x00,0x20,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0a,0x00,0x00,0x20,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0a,0x00,0x00,0x21,0x01,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0a,0x00,0x00,0x20,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0a,0x00,0x00,0x20,0x01,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0a, 0x00,0x00,0x20,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0a,0x00, 0x00,0x20,0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0a,0x00,0x00, 0x20,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0a,0x00,0x00,0x20, 0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0a,0x00,0x00,0x20,0x01, 0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0a,0x00,0x00,0x20,0x01,0x00, 0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0a,0x00,0x00,0x20,0x01,0x00,0xe3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0a,0x00,0x00,0x20,0x01,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0a,0x00,0x00,0x20,0x01,0x00,0xe7,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0a,0x00,0x00,0x20,0x01,0x00,0xe9,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0a,0x00,0x00,0x20,0x01,0x00,0xec,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0a,0x00,0x00,0x50,0x08,0x00,0xed,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0a,0x00,0x00,0x20,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0a,0x00,0x00,0x20,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0a,0x00,0x00,0x20,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0a,0x00,0x00,0x20,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0a, 0x00,0x00,0x20,0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0a,0x00, 0x00,0x20,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0a,0x00,0x00, 0x21,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0a,0x00,0x00,0x20, 0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0a,0x00,0x00,0x20,0x01, 0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0a,0x00,0x00,0x20,0x01,0x00, 0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x20,0x01,0x00,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0a,0x00,0x00,0x20,0x01,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0a,0x00,0x00,0x20,0x01,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0a,0x00,0x00,0x20,0x01,0x00,0x07,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0a,0x00,0x00,0x50,0x08,0x00,0x08,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0a,0x00,0x00,0x20,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0a,0x00,0x00,0x20,0x01,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0a,0x00,0x00,0x20,0x01,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0a,0x00,0x00,0x20,0x01,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0a,0x00,0x00,0x20,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0a, 0x00,0x00,0x50,0x08,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0a,0x00, 0x00,0x20,0x01,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0a,0x00,0x00, 0x20,0x01,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0a,0x00,0x00,0x20, 0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0a,0x00,0x00,0x20,0x01, 0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0a,0x00,0x00,0x20,0x01,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0a,0x00,0x00,0x50,0x08,0x00,0x1b, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0a,0x00,0x00,0x21,0x01,0x00,0x1c,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0a,0x00,0x00,0x20,0x01,0x00,0x1d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0a,0x00,0x00,0x20,0x01,0x00,0x1e,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0a,0x00,0x00,0x20,0x01,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0a,0x00,0x00,0x50,0x08,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0a,0x00,0x00,0x20,0x01,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0a,0x00,0x00,0x12,0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0a,0x00,0x00,0x53,0x00,0x02,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0a,0x00,0x00,0x53,0x20,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0a, 0x00,0x00,0x53,0x20,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0a,0x00, 0x00,0x54,0x40,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0a,0x00,0x00, 0x54,0x00,0x04,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0a,0x00,0x00,0x54, 0x40,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x54,0x40, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0a,0x00,0x00,0x54,0x40,0x00, 0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0a,0x00,0x00,0x54,0x40,0x00,0x3a, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0a,0x00,0x00,0x54,0x40,0x00,0x3b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0a,0x00,0x00,0x54,0x40,0x00,0x3c,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0a,0x00,0x00,0x54,0x40,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x54,0x40,0x00,0x3e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0a,0x00,0x00,0x54,0x40,0x00,0x3f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0a,0x00,0x00,0x54,0x40,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0a,0x00,0x00,0x54,0x40,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0a,0x00,0x00,0x54,0x40,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0a,0x00,0x00,0x54,0x40,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0a, 0x00,0x00,0x51,0x10,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0a,0x00, 0x00,0x51,0x10,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0a,0x00,0x00, 0x21,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0a,0x00,0x00,0x20, 0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0a,0x00,0x00,0x20,0x01, 0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0a,0x00,0x00,0x20,0x01,0x00, 0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0a,0x00,0x00,0x20,0x01,0x00,0x4d, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0a,0x00,0x00,0x20,0x01,0x00,0x4f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0a,0x00,0x00,0x20,0x01,0x00,0x51,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0a,0x00,0x00,0x50,0x08,0x00,0x52,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0a,0x00,0x00,0x20,0x01,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0a,0x00,0x00,0x20,0x01,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x20,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0a,0x00,0x00,0x20,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0a,0x00,0x00,0x20,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0a,0x00,0x00,0x50,0x08,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0a, 0x00,0x00,0x20,0x01,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0a,0x00, 0x00,0x20,0x01,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x00,0x00, 0x20,0x01,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0a,0x00,0x00,0x20, 0x01,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0a,0x00,0x00,0x20,0x01, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0a,0x00,0x00,0x21,0x01,0x00, 0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0a,0x00,0x00,0x20,0x01,0x00,0x67, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0a,0x00,0x00,0x20,0x01,0x00,0x68,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0a,0x00,0x00,0x20,0x01,0x00,0x6a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0a,0x00,0x00,0x20,0x01,0x00,0x6c,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0a,0x00,0x00,0x20,0x01,0x00,0x6e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0a,0x00,0x00,0x20,0x01,0x00,0x70,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0a,0x00,0x00,0x20,0x01,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0a,0x00,0x00,0x20,0x01,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0a,0x00,0x00,0x50,0x08,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0a,0x00,0x00,0x20,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0a, 0x00,0x00,0x20,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0a,0x00, 0x00,0x20,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0a,0x00,0x00, 0x20,0x01,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0a,0x00,0x00,0x20, 0x01,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0a,0x00,0x00,0x20,0x01, 0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0a,0x00,0x00,0x20,0x01,0x00, 0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0a,0x00,0x00,0x21,0x01,0x00,0x84, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0a,0x00,0x00,0x20,0x01,0x00,0x85,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0a,0x00,0x00,0x20,0x01,0x00,0x86,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0a,0x00,0x00,0x20,0x01,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0a,0x00,0x00,0x20,0x01,0x00,0x8a,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0a,0x00,0x00,0x20,0x01,0x00,0x8c,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0a,0x00,0x00,0x20,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0a,0x00,0x00,0x20,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0a,0x00,0x00,0x50,0x08,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0a,0x00,0x00,0x20,0x01,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0a, 0x00,0x00,0x20,0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0a,0x00, 0x00,0x20,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0a,0x00,0x00, 0x20,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0a,0x00,0x00,0x20, 0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0a,0x00,0x00,0x20,0x01, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0a,0x00,0x00,0x21,0x01,0x00, 0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0a,0x00,0x00,0x20,0x01,0x00,0x9f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0a,0x00,0x00,0x20,0x01,0x00,0xa0,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x20,0x01,0x00,0xa2,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0a,0x00,0x00,0x20,0x01,0x00,0xa5,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0a,0x00,0x00,0x50,0x08,0x00,0xa6,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0a,0x00,0x00,0x20,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0a,0x00,0x00,0x20,0x01,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0a,0x00,0x00,0x20,0x01,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0a,0x00,0x00,0x20,0x01,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0a,0x00,0x00,0x50,0x08,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0a, 0x00,0x00,0x20,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0a,0x00, 0x00,0x20,0x01,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0a,0x00,0x00, 0x20,0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0a,0x00,0x00,0x20, 0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0a,0x00,0x00,0x50,0x08, 0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0a,0x00,0x00,0x21,0x01,0x00, 0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0a,0x00,0x00,0x20,0x01,0x00,0xb5, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0a,0x00,0x00,0x20,0x01,0x00,0xb7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0a,0x00,0x00,0x50,0x08,0x00,0xb8,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0a,0x00,0x00,0x20,0x01,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0a,0x00,0x00,0x12,0x01,0x00,0xbb,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0a,0x00,0x00,0x53,0x00,0x02,0xcc,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0a,0x00,0x00,0x53,0x20,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0a,0x00,0x00,0x54,0x40,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0a,0x00,0x00,0x54,0x00,0x04,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0a,0x00,0x00,0x54,0x40,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0a, 0x00,0x00,0x54,0x40,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0a,0x00, 0x00,0x54,0x40,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0a,0x00,0x00, 0x54,0x40,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0a,0x00,0x00,0x54, 0x40,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0a,0x00,0x00,0x54,0x40, 0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0a,0x00,0x00,0x51,0x10,0x00, 0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0a,0x00,0x00,0x50,0x08,0x00,0xcd, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0a,0x00,0x00,0x20,0x01,0x00,0xcf,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0a,0x00,0x00,0x20,0x01,0x00,0xd1,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0a,0x00,0x00,0x20,0x01,0x00,0xd3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0a,0x00,0x00,0x20,0x01,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0a,0x00,0x00,0x20,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0a,0x00,0x00,0x50,0x08,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0a,0x00,0x00,0x20,0x01,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0a,0x00,0x00,0x20,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x0a,0x00,0x00,0x20,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0a, 0x00,0x00,0x20,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0a,0x00, 0x00,0x20,0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0a,0x00,0x00, 0x20,0x01,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0a,0x00,0x00,0x20, 0x01,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0a,0x00,0x00,0x50,0x08, 0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0a,0x00,0x00,0x20,0x01,0x00, 0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0a,0x00,0x00,0x20,0x01,0x00,0xe9, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0a,0x00,0x00,0x20,0x01,0x00,0xeb,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0a,0x00,0x00,0x20,0x01,0x00,0xed,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x0a,0x00,0x00,0x20,0x01,0x00,0xef,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x0a,0x00,0x00,0x20,0x01,0x00,0xf0,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x0a,0x00,0x00,0x50,0x08,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0b,0x00,0x00,0x20,0x01,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0b,0x00,0x00,0x20,0x01,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0b,0x00,0x00,0x20,0x01,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0b,0x00,0x00,0x50,0x08,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0b, 0x00,0x00,0x50,0x08,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x00, 0x00,0x20,0x01,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0b,0x00,0x00, 0x12,0x01,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00,0x53, 0x00,0x02,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0b,0x00,0x00,0x53,0x20, 0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0b,0x00,0x00,0x54,0x40,0x00, 0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x00,0x00,0x54,0x00,0x04,0x0c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x00,0x00,0x54,0x40,0x00,0x05,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x54,0x40,0x00,0x06,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x54,0x40,0x00,0x07,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0b,0x00,0x00,0x54,0x40,0x00,0x08,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0b,0x00,0x00,0x54,0x40,0x00,0x09,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0b,0x00,0x00,0x54,0x40,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0b,0x00,0x00,0x51,0x10,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0b,0x00,0x00,0x21,0x01,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0b,0x00,0x00,0x20,0x01,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0b, 0x00,0x00,0x20,0x01,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0b,0x00, 0x00,0x20,0x01,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0b,0x00,0x00, 0x20,0x01,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0b,0x00,0x00,0x20, 0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x00,0x00,0x20,0x01, 0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x00,0x00,0x50,0x08,0x00, 0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0b,0x00,0x00,0x20,0x01,0x00,0x1a, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0b,0x00,0x00,0x20,0x01,0x00,0x1c,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0b,0x00,0x00,0x20,0x01,0x00,0x1e,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0b,0x00,0x00,0x20,0x01,0x00,0x1f,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0b,0x00,0x00,0x20,0x01,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0b,0x00,0x00,0x50,0x08,0x00,0x22,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0b,0x00,0x00,0x20,0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0b,0x00,0x00,0x20,0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0b,0x00,0x00,0x20,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0b,0x00,0x00,0x20,0x01,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0b, 0x00,0x00,0x20,0x01,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0b,0x00, 0x00,0x21,0x01,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0b,0x00,0x00, 0x20,0x01,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0b,0x00,0x00,0x20, 0x01,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0b,0x00,0x00,0x20,0x01, 0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0b,0x00,0x00,0x20,0x01,0x00, 0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0b,0x00,0x00,0x20,0x01,0x00,0x34, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0b,0x00,0x00,0x20,0x01,0x00,0x36,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0b,0x00,0x00,0x20,0x01,0x00,0x38,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0b,0x00,0x00,0x20,0x01,0x00,0x3b,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0b,0x00,0x00,0x50,0x08,0x00,0x3c,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0b,0x00,0x00,0x20,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0b,0x00,0x00,0x20,0x01,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0b,0x00,0x00,0x20,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0b,0x00,0x00,0x20,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0b,0x00,0x00,0x20,0x01,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0b, 0x00,0x00,0x20,0x01,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0b,0x00, 0x00,0x20,0x01,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0b,0x00,0x00, 0x21,0x01,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0b,0x00,0x00,0x20, 0x01,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0b,0x00,0x00,0x20,0x01, 0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0b,0x00,0x00,0x20,0x01,0x00, 0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0b,0x00,0x00,0x20,0x01,0x00,0x50, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0b,0x00,0x00,0x20,0x01,0x00,0x52,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0b,0x00,0x00,0x20,0x01,0x00,0x54,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0b,0x00,0x00,0x20,0x01,0x00,0x57,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0b,0x00,0x00,0x50,0x08,0x00,0x58,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0b,0x00,0x00,0x20,0x01,0x00,0x5a,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0b,0x00,0x00,0x20,0x01,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0b,0x00,0x00,0x20,0x01,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0b,0x00,0x00,0x20,0x01,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0b,0x00,0x00,0x20,0x01,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0b, 0x00,0x00,0x20,0x01,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0b,0x00, 0x00,0x21,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0b,0x00,0x00, 0x20,0x01,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0b,0x00,0x00,0x20, 0x01,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0b,0x00,0x00,0x20,0x01, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0b,0x00,0x00,0x20,0x01,0x00, 0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0b,0x00,0x00,0x50,0x08,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0b,0x00,0x00,0x20,0x01,0x00,0x6e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x00,0x00,0x20,0x01,0x00,0x70,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0b,0x00,0x00,0x20,0x01,0x00,0x71,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0b,0x00,0x00,0x20,0x01,0x00,0x72,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0b,0x00,0x00,0x50,0x08,0x00,0x73,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0b,0x00,0x00,0x20,0x01,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0b,0x00,0x00,0x20,0x01,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0b,0x00,0x00,0x20,0x01,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0b,0x00,0x00,0x20,0x01,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0b, 0x00,0x00,0x50,0x08,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0b,0x00, 0x00,0x21,0x01,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0b,0x00,0x00, 0x20,0x01,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0b,0x00,0x00,0x20, 0x01,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0b,0x00,0x00,0x50,0x08, 0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0b,0x00,0x00,0x20,0x01,0x00, 0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0b,0x00,0x00,0x53,0x40,0x00,0x9e, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0b,0x00,0x00,0x53,0x40,0x00,0x9f,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0b,0x00,0x00,0x53,0x40,0x00,0xa0,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0b,0x00,0x00,0x53,0x40,0x00,0xa1,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0b,0x00,0x00,0x53,0x40,0x00,0xa2,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0b,0x00,0x00,0x53,0x40,0x00,0xa3,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0b,0x00,0x00,0x53,0x40,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0b,0x00,0x00,0x53,0x20,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0b,0x00,0x00,0x53,0x40,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0b,0x00,0x00,0x53,0x20,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0b, 0x00,0x00,0x54,0x40,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0b,0x00, 0x00,0x54,0x80,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0b,0x00,0x00, 0x54,0x40,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0b,0x00,0x00,0x54, 0x40,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0b,0x00,0x00,0x54,0x80, 0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0b,0x00,0x00,0x54,0x40,0x00, 0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0b,0x00,0x00,0x54,0x40,0x00,0x92, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0b,0x00,0x00,0x54,0x80,0x00,0xa0,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0b,0x00,0x00,0x54,0x40,0x00,0x93,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x54,0x40,0x00,0x94,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0b,0x00,0x00,0x54,0x80,0x00,0xa1,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0b,0x00,0x00,0x54,0x40,0x00,0x95,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0b,0x00,0x00,0x54,0x40,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0b,0x00,0x00,0x54,0x80,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0b,0x00,0x00,0x54,0x40,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0b,0x00,0x00,0x54,0x40,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0b, 0x00,0x00,0x54,0x80,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0b,0x00, 0x00,0x54,0x40,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0b,0x00,0x00, 0x54,0x40,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0b,0x00,0x00,0x54, 0x80,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0b,0x00,0x00,0x54,0x40, 0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0b,0x00,0x00,0x54,0x80,0x00, 0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0b,0x00,0x00,0x51,0x10,0x00,0x9c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0b,0x00,0x00,0x51,0x10,0x00,0x9d,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0b,0x00,0x00,0x20,0x01,0x00,0xa6,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0b,0x00,0x00,0x20,0x01,0x00,0xa7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0b,0x00,0x00,0x20,0x01,0x00,0xa9,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0b,0x00,0x00,0x20,0x01,0x00,0xab,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0b,0x00,0x00,0x20,0x01,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0b,0x00,0x00,0x20,0x01,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0b,0x00,0x00,0x20,0x01,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0b,0x00,0x00,0x20,0x01,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0b, 0x00,0x00,0x20,0x01,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0b,0x00, 0x00,0x20,0x01,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0b,0x00,0x00, 0x20,0x01,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0b,0x00,0x00,0x20, 0x01,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x20,0x01, 0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0b,0x00,0x00,0x20,0x01,0x00, 0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0b,0x00,0x00,0x20,0x01,0x00,0xc1, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0b,0x00,0x00,0x20,0x01,0x00,0xc3,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0b,0x00,0x00,0x20,0x01,0x00,0xc5,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0b,0x00,0x00,0x20,0x01,0x00,0xc7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0b,0x00,0x00,0x20,0x01,0x00,0xca,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0b,0x00,0x00,0x20,0x01,0x00,0xcb,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0b,0x00,0x00,0x20,0x01,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0b,0x00,0x00,0x20,0x01,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0b,0x00,0x00,0x20,0x01,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0b,0x00,0x00,0x20,0x01,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0b, 0x00,0x00,0x20,0x01,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0b,0x00, 0x00,0x23,0x02,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0b,0x00,0x00, 0x12,0x01,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0b,0x00,0x00,0x53, 0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0b,0x00,0x00,0x53,0x20, 0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0b,0x00,0x00,0x53,0x20,0x00, 0xfc,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0b,0x00,0x00,0x54,0x40,0x00,0xed, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0b,0x00,0x00,0x54,0x00,0x04,0x00,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0b,0x00,0x00,0x54,0x40,0x00,0xee,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x54,0x40,0x00,0xef,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0b,0x00,0x00,0x54,0x40,0x00,0xf0,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0b,0x00,0x00,0x54,0x40,0x00,0xf1,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0b,0x00,0x00,0x54,0x40,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0b,0x00,0x00,0x54,0x40,0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0b,0x00,0x00,0x54,0x40,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0b,0x00,0x00,0x54,0x40,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0b, 0x00,0x00,0x54,0x40,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0b,0x00, 0x00,0x54,0x40,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0b,0x00,0x00, 0x54,0x40,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0b,0x00,0x00,0x54, 0x40,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x54,0x40, 0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x51,0x10,0x00, 0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0b,0x00,0x00,0x51,0x10,0x00,0xfc, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x23,0x02,0x00,0xd9,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x12,0x01,0x00,0xfe,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x20,0x01,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0b,0x00,0x00,0x21,0x01,0x00,0x01,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0b,0x00,0x00,0x20,0x01,0x00,0x02,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0b,0x00,0x00,0x20,0x01,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0b,0x00,0x00,0x20,0x01,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0b,0x00,0x00,0x20,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0b,0x00,0x00,0x20,0x01,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0b, 0x00,0x00,0x20,0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0b,0x00, 0x00,0x20,0x01,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0b,0x00,0x00, 0x20,0x01,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0b,0x00,0x00,0x20, 0x01,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0b,0x00,0x00,0x50,0x08, 0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0b,0x00,0x00,0x20,0x01,0x00, 0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0b,0x00,0x00,0x20,0x01,0x00,0x18, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0b,0x00,0x00,0x20,0x01,0x00,0x1a,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0b,0x00,0x00,0x20,0x01,0x00,0x1b,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0b,0x00,0x00,0x20,0x01,0x00,0x1c,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x20,0x01,0x00,0x1f,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0b,0x00,0x00,0x20,0x01,0x00,0x21,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0b,0x00,0x00,0x20,0x01,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0b,0x00,0x00,0x20,0x01,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0b,0x00,0x00,0x20,0x01,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0b,0x00,0x00,0x50,0x08,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0b, 0x00,0x00,0x20,0x01,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0b,0x00, 0x00,0x20,0x01,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0b,0x00,0x00, 0x20,0x01,0x00,0x2f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0b,0x00,0x00,0x20, 0x01,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0b,0x00,0x00,0x20,0x01, 0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0b,0x00,0x00,0x21,0x01,0x00, 0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0b,0x00,0x00,0x20,0x01,0x00,0x34, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0b,0x00,0x00,0x20,0x01,0x00,0x35,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0b,0x00,0x00,0x20,0x01,0x00,0x37,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0b,0x00,0x00,0x20,0x01,0x00,0x39,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0b,0x00,0x00,0x20,0x01,0x00,0x3b,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0b,0x00,0x00,0x20,0x01,0x00,0x3d,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0b,0x00,0x00,0x20,0x01,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0b,0x00,0x00,0x20,0x01,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0b,0x00,0x00,0x20,0x01,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0b,0x00,0x00,0x20,0x01,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0b, 0x00,0x00,0x20,0x01,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0b,0x00, 0x00,0x20,0x01,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0b,0x00,0x00, 0x20,0x01,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0b,0x00,0x00,0x20, 0x01,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0b,0x00,0x00,0x20,0x01, 0x00,0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0b,0x00,0x00,0x50,0x08,0x00, 0x52,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0b,0x00,0x00,0x20,0x01,0x00,0x54, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0b,0x00,0x00,0x20,0x01,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0b,0x00,0x00,0x20,0x01,0x00,0x58,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0b,0x00,0x00,0x20,0x01,0x00,0x5a,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0b,0x00,0x00,0x20,0x01,0x00,0x5c,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0b,0x00,0x00,0x20,0x01,0x00,0x5e,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0b,0x00,0x00,0x20,0x01,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0b,0x00,0x00,0x21,0x01,0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0b,0x00,0x00,0x20,0x01,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0b,0x00,0x00,0x20,0x01,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0b, 0x00,0x00,0x20,0x01,0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0b,0x00, 0x00,0x20,0x01,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0b,0x00,0x00, 0x20,0x01,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0b,0x00,0x00,0x20, 0x01,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0b,0x00,0x00,0x20,0x01, 0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0b,0x00,0x00,0x20,0x01,0x00, 0x6f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0b,0x00,0x00,0x20,0x01,0x00,0x71, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0b,0x00,0x00,0x20,0x01,0x00,0x73,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0b,0x00,0x00,0x20,0x01,0x00,0x75,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0b,0x00,0x00,0x20,0x01,0x00,0x77,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0b,0x00,0x00,0x20,0x01,0x00,0x7a,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0b,0x00,0x00,0x50,0x08,0x00,0x7b,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0b,0x00,0x00,0x20,0x01,0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0b,0x00,0x00,0x20,0x01,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0b,0x00,0x00,0x20,0x01,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x0b,0x00,0x00,0x20,0x01,0x00,0x83,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0b, 0x00,0x00,0x20,0x01,0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0b,0x00, 0x00,0x20,0x01,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0b,0x00,0x00, 0x21,0x01,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0b,0x00,0x00,0x20, 0x01,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0b,0x00,0x00,0x20,0x01, 0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0b,0x00,0x00,0x20,0x01,0x00, 0x8b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0b,0x00,0x00,0x20,0x01,0x00,0x8d, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0b,0x00,0x00,0x20,0x01,0x00,0x90,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0b,0x00,0x00,0x20,0x01,0x00,0x92,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x0b,0x00,0x00,0x20,0x01,0x00,0x95,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x0b,0x00,0x00,0x50,0x08,0x00,0x96,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x0b,0x00,0x00,0x20,0x01,0x00,0x98,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0c,0x00,0x00,0x20,0x01,0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0c,0x00,0x00,0x20,0x01,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0c,0x00,0x00,0x20,0x01,0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0c,0x00,0x00,0x20,0x01,0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0c, 0x00,0x00,0x50,0x08,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0c,0x00, 0x00,0x20,0x01,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0c,0x00,0x00, 0x20,0x01,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x20, 0x01,0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x20,0x01, 0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0c,0x00,0x00,0x20,0x01,0x00, 0xa8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0c,0x00,0x00,0x50,0x08,0x00,0xa9, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x00,0x00,0x21,0x01,0x00,0xaa,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x20,0x01,0x00,0xab,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0c,0x00,0x00,0x20,0x01,0x00,0xac,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x20,0x01,0x00,0xb0,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0c,0x00,0x00,0x50,0x08,0x00,0xb1,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x01,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0c,0x00,0x00,0x12,0x01,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0c,0x00,0x00,0x53,0x00,0x02,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0c,0x00,0x00,0x53,0x20,0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0c, 0x00,0x00,0x53,0x20,0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0c,0x00, 0x00,0x54,0x40,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0c,0x00,0x00, 0x54,0x00,0x04,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0c,0x00,0x00,0x54, 0x40,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0x00,0x00,0x54,0x40, 0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0c,0x00,0x00,0x54,0x40,0x00, 0xc7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0c,0x00,0x00,0x54,0x40,0x00,0xc8, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x54,0x40,0x00,0xc9,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0c,0x00,0x00,0x54,0x40,0x00,0xca,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x54,0x40,0x00,0xcb,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0c,0x00,0x00,0x54,0x40,0x00,0xcc,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x54,0x40,0x00,0xcd,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0c,0x00,0x00,0x54,0x40,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0c,0x00,0x00,0x54,0x40,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0c,0x00,0x00,0x54,0x40,0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0c,0x00,0x00,0x54,0x40,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0c, 0x00,0x00,0x51,0x10,0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c,0x00, 0x00,0x51,0x10,0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0c,0x00,0x00, 0x21,0x01,0x00,0xd5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0c,0x00,0x00,0x20, 0x01,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0c,0x00,0x00,0x20,0x01, 0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x20,0x01,0x00, 0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0c,0x00,0x00,0x20,0x01,0x00,0xdb, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0c,0x00,0x00,0x20,0x01,0x00,0xdd,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0c,0x00,0x00,0x20,0x01,0x00,0xdf,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0c,0x00,0x00,0x50,0x08,0x00,0xe0,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0c,0x00,0x00,0x20,0x01,0x00,0xe2,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0c,0x00,0x00,0x20,0x01,0x00,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0c,0x00,0x00,0x20,0x01,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0c,0x00,0x00,0x20,0x01,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0c,0x00,0x00,0x20,0x01,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0c,0x00,0x00,0x50,0x08,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0c, 0x00,0x00,0x20,0x01,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0c,0x00, 0x00,0x20,0x01,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0c,0x00,0x00, 0x20,0x01,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0c,0x00,0x00,0x20, 0x01,0x00,0xf2,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0c,0x00,0x00,0x20,0x01, 0x00,0xf3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0c,0x00,0x00,0x21,0x01,0x00, 0xf4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0c,0x00,0x00,0x20,0x01,0x00,0xf5, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0c,0x00,0x00,0x20,0x01,0x00,0xf6,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0c,0x00,0x00,0x20,0x01,0x00,0xf8,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0c,0x00,0x00,0x20,0x01,0x00,0xfa,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0c,0x00,0x00,0x20,0x01,0x00,0xfc,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0c,0x00,0x00,0x20,0x01,0x00,0xfe,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0c,0x00,0x00,0x20,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0c,0x00,0x00,0x20,0x01,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0c,0x00,0x00,0x50,0x08,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0c,0x00,0x00,0x20,0x01,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0c, 0x00,0x00,0x20,0x01,0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0c,0x00, 0x00,0x20,0x01,0x00,0x0a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0c,0x00,0x00, 0x20,0x01,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0c,0x00,0x00,0x20, 0x01,0x00,0x0e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0c,0x00,0x00,0x20,0x01, 0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0c,0x00,0x00,0x20,0x01,0x00, 0x11,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0c,0x00,0x00,0x21,0x01,0x00,0x12, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0c,0x00,0x00,0x20,0x01,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0c,0x00,0x00,0x20,0x01,0x00,0x14,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0c,0x00,0x00,0x20,0x01,0x00,0x16,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0c,0x00,0x00,0x20,0x01,0x00,0x18,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0c,0x00,0x00,0x20,0x01,0x00,0x1a,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0c,0x00,0x00,0x20,0x01,0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0c,0x00,0x00,0x20,0x01,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0c,0x00,0x00,0x50,0x08,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0c,0x00,0x00,0x20,0x01,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0c, 0x00,0x00,0x20,0x01,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0c,0x00, 0x00,0x20,0x01,0x00,0x26,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0c,0x00,0x00, 0x20,0x01,0x00,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0c,0x00,0x00,0x20, 0x01,0x00,0x2a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x20,0x01, 0x00,0x2b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0c,0x00,0x00,0x21,0x01,0x00, 0x2c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0c,0x00,0x00,0x20,0x01,0x00,0x2d, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0c,0x00,0x00,0x20,0x01,0x00,0x2e,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0c,0x00,0x00,0x20,0x01,0x00,0x30,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0c,0x00,0x00,0x20,0x01,0x00,0x33,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0c,0x00,0x00,0x50,0x08,0x00,0x34,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0c,0x00,0x00,0x20,0x01,0x00,0x36,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0c,0x00,0x00,0x20,0x01,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0c,0x00,0x00,0x20,0x01,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0c,0x00,0x00,0x20,0x01,0x00,0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0c,0x00,0x00,0x50,0x08,0x00,0x3b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0c, 0x00,0x00,0x20,0x01,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0c,0x00, 0x00,0x20,0x01,0x00,0x3e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0c,0x00,0x00, 0x20,0x01,0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0c,0x00,0x00,0x20, 0x01,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0c,0x00,0x00,0x50,0x08, 0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0c,0x00,0x00,0x21,0x01,0x00, 0x42,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0c,0x00,0x00,0x20,0x01,0x00,0x43, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0c,0x00,0x00,0x20,0x01,0x00,0x45,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0c,0x00,0x00,0x50,0x08,0x00,0x46,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0c,0x00,0x00,0x20,0x01,0x00,0x47,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0c,0x00,0x00,0x12,0x01,0x00,0x49,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0c,0x00,0x00,0x53,0x00,0x02,0x5a,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0c,0x00,0x00,0x53,0x20,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0c,0x00,0x00,0x54,0x40,0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0c,0x00,0x00,0x54,0x00,0x04,0x5a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0c,0x00,0x00,0x54,0x40,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0c, 0x00,0x00,0x54,0x40,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0c,0x00, 0x00,0x54,0x40,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0c,0x00,0x00, 0x54,0x40,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0c,0x00,0x00,0x54, 0x40,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x00,0x00,0x54,0x40, 0x00,0x58,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0c,0x00,0x00,0x51,0x10,0x00, 0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0c,0x00,0x00,0x50,0x08,0x00,0x5b, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0c,0x00,0x00,0x20,0x01,0x00,0x5d,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0c,0x00,0x00,0x20,0x01,0x00,0x5f,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0c,0x00,0x00,0x20,0x01,0x00,0x61,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0c,0x00,0x00,0x20,0x01,0x00,0x63,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0c,0x00,0x00,0x20,0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0c,0x00,0x00,0x50,0x08,0x00,0x65,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0c,0x00,0x00,0x20,0x01,0x00,0x67,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0c,0x00,0x00,0x20,0x01,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0c,0x00,0x00,0x20,0x01,0x00,0x6b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0c, 0x00,0x00,0x20,0x01,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0c,0x00, 0x00,0x20,0x01,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0c,0x00,0x00, 0x20,0x01,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0c,0x00,0x00,0x20, 0x01,0x00,0x72,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0c,0x00,0x00,0x50,0x08, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0c,0x00,0x00,0x20,0x01,0x00, 0x75,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0c,0x00,0x00,0x20,0x01,0x00,0x77, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0c,0x00,0x00,0x20,0x01,0x00,0x79,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0c,0x00,0x00,0x20,0x01,0x00,0x7b,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0c,0x00,0x00,0x20,0x01,0x00,0x7d,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0c,0x00,0x00,0x20,0x01,0x00,0x7e,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0c,0x00,0x00,0x50,0x08,0x00,0x7f,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0c,0x00,0x00,0x20,0x01,0x00,0x81,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0c,0x00,0x00,0x20,0x01,0x00,0x83,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0c,0x00,0x00,0x20,0x01,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0c,0x00,0x00,0x50,0x08,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0c, 0x00,0x00,0x50,0x08,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0c,0x00, 0x00,0x20,0x01,0x00,0x87,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0c,0x00,0x00, 0x12,0x01,0x00,0x89,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0c,0x00,0x00,0x53, 0x00,0x02,0x9a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0c,0x00,0x00,0x53,0x20, 0x00,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0c,0x00,0x00,0x54,0x40,0x00, 0x92,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0c,0x00,0x00,0x54,0x00,0x04,0x9a, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0c,0x00,0x00,0x54,0x40,0x00,0x93,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0c,0x00,0x00,0x54,0x40,0x00,0x94,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x54,0x40,0x00,0x95,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0c,0x00,0x00,0x54,0x40,0x00,0x96,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0c,0x00,0x00,0x54,0x40,0x00,0x97,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0c,0x00,0x00,0x54,0x40,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0c,0x00,0x00,0x51,0x10,0x00,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0c,0x00,0x00,0x21,0x01,0x00,0x9b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0c,0x00,0x00,0x20,0x01,0x00,0x9c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0c, 0x00,0x00,0x20,0x01,0x00,0x9d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0c,0x00, 0x00,0x20,0x01,0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0c,0x00,0x00, 0x20,0x01,0x00,0xa1,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0c,0x00,0x00,0x20, 0x01,0x00,0xa3,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0c,0x00,0x00,0x20,0x01, 0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0c,0x00,0x00,0x50,0x08,0x00, 0xa6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0c,0x00,0x00,0x20,0x01,0x00,0xa8, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0c,0x00,0x00,0x20,0x01,0x00,0xaa,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0c,0x00,0x00,0x20,0x01,0x00,0xac,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0c,0x00,0x00,0x20,0x01,0x00,0xad,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0c,0x00,0x00,0x20,0x01,0x00,0xaf,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0c,0x00,0x00,0x50,0x08,0x00,0xb0,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0c,0x00,0x00,0x20,0x01,0x00,0xb2,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0c,0x00,0x00,0x20,0x01,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0c,0x00,0x00,0x20,0x01,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0c,0x00,0x00,0x20,0x01,0x00,0xb8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0c, 0x00,0x00,0x20,0x01,0x00,0xb9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0c,0x00, 0x00,0x21,0x01,0x00,0xba,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0c,0x00,0x00, 0x20,0x01,0x00,0xbb,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0c,0x00,0x00,0x20, 0x01,0x00,0xbc,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0c,0x00,0x00,0x20,0x01, 0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0c,0x00,0x00,0x20,0x01,0x00, 0xc0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0c,0x00,0x00,0x20,0x01,0x00,0xc2, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0c,0x00,0x00,0x20,0x01,0x00,0xc4,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0c,0x00,0x00,0x20,0x01,0x00,0xc6,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0c,0x00,0x00,0x20,0x01,0x00,0xc9,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0c,0x00,0x00,0x50,0x08,0x00,0xca,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0c,0x00,0x00,0x20,0x01,0x00,0xcc,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0c,0x00,0x00,0x20,0x01,0x00,0xce,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0c,0x00,0x00,0x20,0x01,0x00,0xd0,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0c,0x00,0x00,0x20,0x01,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0c,0x00,0x00,0x20,0x01,0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0c, 0x00,0x00,0x20,0x01,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0c,0x00, 0x00,0x20,0x01,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0c,0x00,0x00, 0x21,0x01,0x00,0xd8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0c,0x00,0x00,0x20, 0x01,0x00,0xd9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x20,0x01, 0x00,0xda,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0c,0x00,0x00,0x20,0x01,0x00, 0xdc,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0c,0x00,0x00,0x20,0x01,0x00,0xde, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0c,0x00,0x00,0x20,0x01,0x00,0xe0,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0c,0x00,0x00,0x20,0x01,0x00,0xe2,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0c,0x00,0x00,0x20,0x01,0x00,0xe5,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0c,0x00,0x00,0x50,0x08,0x00,0xe6,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0c,0x00,0x00,0x20,0x01,0x00,0xe8,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0c,0x00,0x00,0x20,0x01,0x00,0xea,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0c,0x00,0x00,0x20,0x01,0x00,0xec,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0c,0x00,0x00,0x20,0x01,0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0c,0x00,0x00,0x20,0x01,0x00,0xf0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0c, 0x00,0x00,0x20,0x01,0x00,0xf1,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0c,0x00, 0x00,0x21,0x01,0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0c,0x00,0x00, 0x20,0x01,0x00,0xf3,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0c,0x00,0x00,0x20, 0x01,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0c,0x00,0x00,0x20,0x01, 0x00,0xf6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0c,0x00,0x00,0x20,0x01,0x00, 0xf9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0c,0x00,0x00,0x50,0x08,0x00,0xfa, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0c,0x00,0x00,0x20,0x01,0x00,0xfc,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0c,0x00,0x00,0x20,0x01,0x00,0xfe,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0c,0x00,0x00,0x20,0x01,0x00,0xff,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0c,0x00,0x00,0x20,0x01,0x00,0x00,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0c,0x00,0x00,0x50,0x08,0x00,0x01,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0c,0x00,0x00,0x20,0x01,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0c,0x00,0x00,0x20,0x01,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0c,0x00,0x00,0x20,0x01,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0c,0x00,0x00,0x20,0x01,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0c, 0x00,0x00,0x50,0x08,0x00,0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0c,0x00, 0x00,0x21,0x01,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0c,0x00,0x00, 0x20,0x01,0x00,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0c,0x00,0x00,0x20, 0x01,0x00,0x0b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0c,0x00,0x00,0x50,0x08, 0x00,0x0c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0c,0x00,0x00,0x20,0x01,0x00, 0x0d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0c,0x00,0x00,0x53,0x40,0x00,0x2c, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0c,0x00,0x00,0x53,0x40,0x00,0x2d,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0c,0x00,0x00,0x53,0x40,0x00,0x2e,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0c,0x00,0x00,0x53,0x40,0x00,0x2f,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0c,0x00,0x00,0x53,0x40,0x00,0x30,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0c,0x00,0x00,0x53,0x40,0x00,0x31,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0c,0x00,0x00,0x53,0x40,0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0c,0x00,0x00,0x53,0x20,0x00,0x2a,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0c,0x00,0x00,0x53,0x40,0x00,0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x0c,0x00,0x00,0x53,0x20,0x00,0x2b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0c, 0x00,0x00,0x54,0x40,0x00,0x1c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0c,0x00, 0x00,0x54,0x80,0x00,0x2c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0c,0x00,0x00, 0x54,0x40,0x00,0x1d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0c,0x00,0x00,0x54, 0x40,0x00,0x1e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0c,0x00,0x00,0x54,0x80, 0x00,0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0c,0x00,0x00,0x54,0x40,0x00, 0x1f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0c,0x00,0x00,0x54,0x40,0x00,0x20, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0c,0x00,0x00,0x54,0x80,0x00,0x2e,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0c,0x00,0x00,0x54,0x40,0x00,0x21,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x0c,0x00,0x00,0x54,0x40,0x00,0x22,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x0c,0x00,0x00,0x54,0x80,0x00,0x2f,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x0c,0x00,0x00,0x54,0x40,0x00,0x23,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0d,0x00,0x00,0x54,0x40,0x00,0x24,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0d,0x00,0x00,0x54,0x80,0x00,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0d,0x00,0x00,0x54,0x40,0x00,0x25,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0d,0x00,0x00,0x54,0x40,0x00,0x26,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0d, 0x00,0x00,0x54,0x80,0x00,0x31,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0d,0x00, 0x00,0x54,0x40,0x00,0x27,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0d,0x00,0x00, 0x54,0x40,0x00,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0d,0x00,0x00,0x54, 0x80,0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x54,0x40, 0x00,0x29,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0d,0x00,0x00,0x54,0x80,0x00, 0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0d,0x00,0x00,0x51,0x10,0x00,0x2a, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0d,0x00,0x00,0x51,0x10,0x00,0x2b,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x00,0x00,0x20,0x01,0x00,0x34,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x00,0x00,0x20,0x01,0x00,0x35,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0d,0x00,0x00,0x20,0x01,0x00,0x37,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0d,0x00,0x00,0x20,0x01,0x00,0x39,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0d,0x00,0x00,0x20,0x01,0x00,0x3b,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0d,0x00,0x00,0x20,0x01,0x00,0x3e,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0d,0x00,0x00,0x20,0x01,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0d,0x00,0x00,0x20,0x01,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0d, 0x00,0x00,0x20,0x01,0x00,0x43,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0d,0x00, 0x00,0x20,0x01,0x00,0x45,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0d,0x00,0x00, 0x20,0x01,0x00,0x47,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0d,0x00,0x00,0x20, 0x01,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0d,0x00,0x00,0x20,0x01, 0x00,0x4c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0d,0x00,0x00,0x20,0x01,0x00, 0x4d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0d,0x00,0x00,0x20,0x01,0x00,0x4f, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0d,0x00,0x00,0x20,0x01,0x00,0x51,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0d,0x00,0x00,0x20,0x01,0x00,0x53,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x00,0x00,0x20,0x01,0x00,0x55,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0d,0x00,0x00,0x20,0x01,0x00,0x58,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0d,0x00,0x00,0x20,0x01,0x00,0x59,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0d,0x00,0x00,0x20,0x01,0x00,0x5b,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0d,0x00,0x00,0x20,0x01,0x00,0x5e,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0d,0x00,0x00,0x20,0x01,0x00,0x5f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0d,0x00,0x00,0x20,0x01,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0d, 0x00,0x00,0x20,0x01,0x00,0x63,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0d,0x00, 0x00,0x23,0x02,0x00,0x6e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0d,0x00,0x00, 0x12,0x01,0x00,0x6f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0d,0x00,0x00,0x53, 0x00,0x02,0x92,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0d,0x00,0x00,0x53,0x20, 0x00,0x8d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0d,0x00,0x00,0x53,0x20,0x00, 0x8e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0d,0x00,0x00,0x54,0x40,0x00,0x7f, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0d,0x00,0x00,0x54,0x00,0x04,0x92,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0d,0x00,0x00,0x54,0x40,0x00,0x80,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x54,0x40,0x00,0x81,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0d,0x00,0x00,0x54,0x40,0x00,0x82,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0d,0x00,0x00,0x54,0x40,0x00,0x83,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0d,0x00,0x00,0x54,0x40,0x00,0x84,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0d,0x00,0x00,0x54,0x40,0x00,0x85,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0d,0x00,0x00,0x54,0x40,0x00,0x86,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0d,0x00,0x00,0x54,0x40,0x00,0x87,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0d, 0x00,0x00,0x54,0x40,0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0d,0x00, 0x00,0x54,0x40,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0d,0x00,0x00, 0x54,0x40,0x00,0x8a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0d,0x00,0x00,0x54, 0x40,0x00,0x8b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0d,0x00,0x00,0x54,0x40, 0x00,0x8c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0d,0x00,0x00,0x51,0x10,0x00, 0x8d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0d,0x00,0x00,0x51,0x10,0x00,0x8e, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0d,0x00,0x00,0x23,0x02,0x00,0x6b,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0d,0x00,0x00,0x12,0x01,0x00,0x90,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0d,0x00,0x00,0x20,0x01,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0d,0x00,0x00,0x21,0x01,0x00,0x93,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0d,0x00,0x00,0x20,0x01,0x00,0x94,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0d,0x00,0x00,0x20,0x01,0x00,0x95,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0d,0x00,0x00,0x20,0x01,0x00,0x97,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0d,0x00,0x00,0x20,0x01,0x00,0x99,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0d,0x00,0x00,0x20,0x01,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0d, 0x00,0x00,0x20,0x01,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0d,0x00, 0x00,0x20,0x01,0x00,0xa0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0d,0x00,0x00, 0x20,0x01,0x00,0xa2,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0d,0x00,0x00,0x20, 0x01,0x00,0xa5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0d,0x00,0x00,0x50,0x08, 0x00,0xa6,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0d,0x00,0x00,0x20,0x01,0x00, 0xa8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0d,0x00,0x00,0x20,0x01,0x00,0xaa, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0d,0x00,0x00,0x20,0x01,0x00,0xac,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0d,0x00,0x00,0x20,0x01,0x00,0xad,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0d,0x00,0x00,0x20,0x01,0x00,0xae,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0d,0x00,0x00,0x20,0x01,0x00,0xb1,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0d,0x00,0x00,0x20,0x01,0x00,0xb3,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0d,0x00,0x00,0x20,0x01,0x00,0xb5,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0d,0x00,0x00,0x20,0x01,0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0d,0x00,0x00,0x20,0x01,0x00,0xba,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0d,0x00,0x00,0x50,0x08,0x00,0xbb,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0d, 0x00,0x00,0x20,0x01,0x00,0xbd,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0d,0x00, 0x00,0x20,0x01,0x00,0xbf,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0d,0x00,0x00, 0x20,0x01,0x00,0xc1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0d,0x00,0x00,0x20, 0x01,0x00,0xc3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0d,0x00,0x00,0x20,0x01, 0x00,0xc4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0d,0x00,0x00,0x21,0x01,0x00, 0xc5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0d,0x00,0x00,0x20,0x01,0x00,0xc6, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0d,0x00,0x00,0x20,0x01,0x00,0xc7,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0d,0x00,0x00,0x20,0x01,0x00,0xc9,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0d,0x00,0x00,0x20,0x01,0x00,0xcb,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0d,0x00,0x00,0x20,0x01,0x00,0xcd,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0d,0x00,0x00,0x20,0x01,0x00,0xcf,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0d,0x00,0x00,0x20,0x01,0x00,0xd1,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0d,0x00,0x00,0x20,0x01,0x00,0xd3,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0d,0x00,0x00,0x20,0x01,0x00,0xd6,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0d,0x00,0x00,0x20,0x01,0x00,0xd8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0d, 0x00,0x00,0x20,0x01,0x00,0xda,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0d,0x00, 0x00,0x20,0x01,0x00,0xdc,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0d,0x00,0x00, 0x20,0x01,0x00,0xde,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0d,0x00,0x00,0x20, 0x01,0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0d,0x00,0x00,0x20,0x01, 0x00,0xe3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0d,0x00,0x00,0x50,0x08,0x00, 0xe4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0d,0x00,0x00,0x20,0x01,0x00,0xe6, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0d,0x00,0x00,0x20,0x01,0x00,0xe8,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0d,0x00,0x00,0x20,0x01,0x00,0xea,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0d,0x00,0x00,0x20,0x01,0x00,0xec,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0d,0x00,0x00,0x20,0x01,0x00,0xee,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0d,0x00,0x00,0x20,0x01,0x00,0xf0,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0d,0x00,0x00,0x20,0x01,0x00,0xf1,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0d,0x00,0x00,0x21,0x01,0x00,0xf2,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0d,0x00,0x00,0x20,0x01,0x00,0xf3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0d,0x00,0x00,0x20,0x01,0x00,0xf4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0d, 0x00,0x00,0x20,0x01,0x00,0xf6,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0d,0x00, 0x00,0x20,0x01,0x00,0xf8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0d,0x00,0x00, 0x20,0x01,0x00,0xfa,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0d,0x00,0x00,0x20, 0x01,0x00,0xfc,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0d,0x00,0x00,0x20,0x01, 0x00,0xfe,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0d,0x00,0x00,0x20,0x01,0x00, 0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0d,0x00,0x00,0x20,0x01,0x00,0x03, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0d,0x00,0x00,0x20,0x01,0x00,0x05,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0d,0x00,0x00,0x20,0x01,0x00,0x07,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0d,0x00,0x00,0x20,0x01,0x00,0x09,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0d,0x00,0x00,0x20,0x01,0x00,0x0c,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0d,0x00,0x00,0x50,0x08,0x00,0x0d,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0d,0x00,0x00,0x20,0x01,0x00,0x0f,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0d,0x00,0x00,0x20,0x01,0x00,0x11,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0d,0x00,0x00,0x20,0x01,0x00,0x13,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0d,0x00,0x00,0x20,0x01,0x00,0x15,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0d, 0x00,0x00,0x20,0x01,0x00,0x17,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0d,0x00, 0x00,0x20,0x01,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0d,0x00,0x00, 0x21,0x01,0x00,0x19,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0d,0x00,0x00,0x20, 0x01,0x00,0x1a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0d,0x00,0x00,0x20,0x01, 0x00,0x1b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0d,0x00,0x00,0x20,0x01,0x00, 0x1d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0d,0x00,0x00,0x20,0x01,0x00,0x1f, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0d,0x00,0x00,0x20,0x01,0x00,0x22,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0d,0x00,0x00,0x20,0x01,0x00,0x24,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0d,0x00,0x00,0x20,0x01,0x00,0x27,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0d,0x00,0x00,0x50,0x08,0x00,0x28,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0d,0x00,0x00,0x20,0x01,0x00,0x2a,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0d,0x00,0x00,0x20,0x01,0x00,0x2c,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0d,0x00,0x00,0x20,0x01,0x00,0x2d,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0d,0x00,0x00,0x20,0x01,0x00,0x2f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0d,0x00,0x00,0x20,0x01,0x00,0x32,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0d, 0x00,0x00,0x50,0x08,0x00,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0d,0x00, 0x00,0x20,0x01,0x00,0x35,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0d,0x00,0x00, 0x20,0x01,0x00,0x36,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0d,0x00,0x00,0x20, 0x01,0x00,0x37,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0d,0x00,0x00,0x20,0x01, 0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0d,0x00,0x00,0x20,0x01,0x00, 0x3a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0d,0x00,0x00,0x50,0x08,0x00,0x3b, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0d,0x00,0x00,0x21,0x01,0x00,0x3c,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0d,0x00,0x00,0x20,0x01,0x00,0x3d,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0d,0x00,0x00,0x20,0x01,0x00,0x3e,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0d,0x00,0x00,0x20,0x01,0x00,0x42,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0d,0x00,0x00,0x50,0x08,0x00,0x43,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0d,0x00,0x00,0x20,0x01,0x00,0x44,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0d,0x00,0x00,0x12,0x01,0x00,0x46,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0d,0x00,0x00,0x53,0x00,0x02,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0d,0x00,0x00,0x53,0x20,0x00,0x64,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0d, 0x00,0x00,0x53,0x20,0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0d,0x00, 0x00,0x54,0x40,0x00,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0d,0x00,0x00, 0x54,0x00,0x04,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0d,0x00,0x00,0x54, 0x40,0x00,0x57,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x54,0x40, 0x00,0x58,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0d,0x00,0x00,0x54,0x40,0x00, 0x59,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0d,0x00,0x00,0x54,0x40,0x00,0x5a, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0d,0x00,0x00,0x54,0x40,0x00,0x5b,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0d,0x00,0x00,0x54,0x40,0x00,0x5c,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0d,0x00,0x00,0x54,0x40,0x00,0x5d,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0d,0x00,0x00,0x54,0x40,0x00,0x5e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0d,0x00,0x00,0x54,0x40,0x00,0x5f,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0d,0x00,0x00,0x54,0x40,0x00,0x60,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0d,0x00,0x00,0x54,0x40,0x00,0x61,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0d,0x00,0x00,0x54,0x40,0x00,0x62,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0d,0x00,0x00,0x54,0x40,0x00,0x63,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0d, 0x00,0x00,0x51,0x10,0x00,0x64,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0d,0x00, 0x00,0x51,0x10,0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0d,0x00,0x00, 0x21,0x01,0x00,0x67,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0d,0x00,0x00,0x20, 0x01,0x00,0x68,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0d,0x00,0x00,0x20,0x01, 0x00,0x69,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0d,0x00,0x00,0x20,0x01,0x00, 0x6b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0d,0x00,0x00,0x20,0x01,0x00,0x6d, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0d,0x00,0x00,0x20,0x01,0x00,0x6f,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0d,0x00,0x00,0x20,0x01,0x00,0x71,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0d,0x00,0x00,0x50,0x08,0x00,0x72,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0d,0x00,0x00,0x20,0x01,0x00,0x74,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0d,0x00,0x00,0x20,0x01,0x00,0x76,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0d,0x00,0x00,0x20,0x01,0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0d,0x00,0x00,0x20,0x01,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0d,0x00,0x00,0x20,0x01,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0d,0x00,0x00,0x50,0x08,0x00,0x7c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0d, 0x00,0x00,0x20,0x01,0x00,0x7e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0d,0x00, 0x00,0x20,0x01,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0d,0x00,0x00, 0x20,0x01,0x00,0x82,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0d,0x00,0x00,0x20, 0x01,0x00,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0d,0x00,0x00,0x20,0x01, 0x00,0x85,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0d,0x00,0x00,0x21,0x01,0x00, 0x86,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0d,0x00,0x00,0x20,0x01,0x00,0x87, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0d,0x00,0x00,0x20,0x01,0x00,0x88,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0d,0x00,0x00,0x20,0x01,0x00,0x8a,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0d,0x00,0x00,0x20,0x01,0x00,0x8c,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0d,0x00,0x00,0x20,0x01,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0d,0x00,0x00,0x20,0x01,0x00,0x90,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0d,0x00,0x00,0x20,0x01,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0d,0x00,0x00,0x20,0x01,0x00,0x95,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0d,0x00,0x00,0x50,0x08,0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0d,0x00,0x00,0x20,0x01,0x00,0x98,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0d, 0x00,0x00,0x20,0x01,0x00,0x9a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0d,0x00, 0x00,0x20,0x01,0x00,0x9c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0d,0x00,0x00, 0x20,0x01,0x00,0x9e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0d,0x00,0x00,0x20, 0x01,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0d,0x00,0x00,0x20,0x01, 0x00,0xa2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0d,0x00,0x00,0x20,0x01,0x00, 0xa3,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0d,0x00,0x00,0x21,0x01,0x00,0xa4, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0d,0x00,0x00,0x20,0x01,0x00,0xa5,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0d,0x00,0x00,0x20,0x01,0x00,0xa6,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0d,0x00,0x00,0x20,0x01,0x00,0xa8,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0d,0x00,0x00,0x20,0x01,0x00,0xaa,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0d,0x00,0x00,0x20,0x01,0x00,0xac,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0d,0x00,0x00,0x20,0x01,0x00,0xae,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0d,0x00,0x00,0x20,0x01,0x00,0xb1,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0d,0x00,0x00,0x50,0x08,0x00,0xb2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0d,0x00,0x00,0x20,0x01,0x00,0xb4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0d, 0x00,0x00,0x20,0x01,0x00,0xb6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0d,0x00, 0x00,0x20,0x01,0x00,0xb8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0d,0x00,0x00, 0x20,0x01,0x00,0xba,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0d,0x00,0x00,0x20, 0x01,0x00,0xbc,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x20,0x01, 0x00,0xbd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0d,0x00,0x00,0x21,0x01,0x00, 0xbe,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0d,0x00,0x00,0x20,0x01,0x00,0xbf, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0d,0x00,0x00,0x20,0x01,0x00,0xc0,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0d,0x00,0x00,0x20,0x01,0x00,0xc2,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0d,0x00,0x00,0x20,0x01,0x00,0xc5,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0d,0x00,0x00,0x50,0x08,0x00,0xc6,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0d,0x00,0x00,0x20,0x01,0x00,0xc8,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0d,0x00,0x00,0x20,0x01,0x00,0xca,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0d,0x00,0x00,0x20,0x01,0x00,0xcb,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0d,0x00,0x00,0x20,0x01,0x00,0xcc,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x0d,0x00,0x00,0x50,0x08,0x00,0xcd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0d, 0x00,0x00,0x20,0x01,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0d,0x00, 0x00,0x20,0x01,0x00,0xd0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0d,0x00,0x00, 0x20,0x01,0x00,0xd1,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0d,0x00,0x00,0x20, 0x01,0x00,0xd2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0d,0x00,0x00,0x50,0x08, 0x00,0xd3,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0d,0x00,0x00,0x21,0x01,0x00, 0xd4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0d,0x00,0x00,0x20,0x01,0x00,0xd5, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0d,0x00,0x00,0x20,0x01,0x00,0xd7,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0d,0x00,0x00,0x50,0x08,0x00,0xd8,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x0d,0x00,0x00,0x20,0x01,0x00,0xd9,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x0d,0x00,0x00,0x12,0x01,0x00,0xdb,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x0d,0x00,0x00,0x53,0x00,0x02,0xec,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x53,0x20,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0e,0x00,0x00,0x54,0x40,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0e,0x00,0x00,0x54,0x00,0x04,0xec,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0e,0x00,0x00,0x54,0x40,0x00,0xe5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e, 0x00,0x00,0x54,0x40,0x00,0xe6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0e,0x00, 0x00,0x54,0x40,0x00,0xe7,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0e,0x00,0x00, 0x54,0x40,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0e,0x00,0x00,0x54, 0x40,0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0e,0x00,0x00,0x54,0x40, 0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0e,0x00,0x00,0x51,0x10,0x00, 0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0e,0x00,0x00,0x50,0x08,0x00,0xed, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0e,0x00,0x00,0x20,0x01,0x00,0xef,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0e,0x00,0x00,0x20,0x01,0x00,0xf1,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x00,0x00,0x20,0x01,0x00,0xf3,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0e,0x00,0x00,0x20,0x01,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0e,0x00,0x00,0x20,0x01,0x00,0xf6,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0e,0x00,0x00,0x50,0x08,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0e,0x00,0x00,0x20,0x01,0x00,0xf9,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0e,0x00,0x00,0x20,0x01,0x00,0xfb,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0e,0x00,0x00,0x20,0x01,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0e, 0x00,0x00,0x20,0x01,0x00,0xff,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0e,0x00, 0x00,0x20,0x01,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0e,0x00,0x00, 0x20,0x01,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0e,0x00,0x00,0x20, 0x01,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0e,0x00,0x00,0x50,0x08, 0x00,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0e,0x00,0x00,0x20,0x01,0x00, 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0e,0x00,0x00,0x20,0x01,0x00,0x09, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0e,0x00,0x00,0x20,0x01,0x00,0x0b,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0e,0x00,0x00,0x20,0x01,0x00,0x0d,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0e,0x00,0x00,0x20,0x01,0x00,0x0f,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0e,0x00,0x00,0x20,0x01,0x00,0x10,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0e,0x00,0x00,0x50,0x08,0x00,0x11,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0e,0x00,0x00,0x20,0x01,0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0e,0x00,0x00,0x20,0x01,0x00,0x15,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0e,0x00,0x00,0x20,0x01,0x00,0x16,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0e,0x00,0x00,0x50,0x08,0x00,0x17,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0e, 0x00,0x00,0x50,0x08,0x00,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0e,0x00, 0x00,0x20,0x01,0x00,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0e,0x00,0x00, 0x12,0x01,0x00,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0e,0x00,0x00,0x53, 0x00,0x02,0x2c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0e,0x00,0x00,0x53,0x20, 0x00,0x2b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0e,0x00,0x00,0x54,0x40,0x00, 0x24,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0e,0x00,0x00,0x54,0x00,0x04,0x2c, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0e,0x00,0x00,0x54,0x40,0x00,0x25,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0e,0x00,0x00,0x54,0x40,0x00,0x26,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0e,0x00,0x00,0x54,0x40,0x00,0x27,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0e,0x00,0x00,0x54,0x40,0x00,0x28,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0e,0x00,0x00,0x54,0x40,0x00,0x29,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0e,0x00,0x00,0x54,0x40,0x00,0x2a,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0e,0x00,0x00,0x51,0x10,0x00,0x2b,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0e,0x00,0x00,0x21,0x01,0x00,0x2d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0e,0x00,0x00,0x20,0x01,0x00,0x2e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0e, 0x00,0x00,0x20,0x01,0x00,0x2f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0e,0x00, 0x00,0x20,0x01,0x00,0x31,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0e,0x00,0x00, 0x20,0x01,0x00,0x33,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0e,0x00,0x00,0x20, 0x01,0x00,0x35,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0e,0x00,0x00,0x20,0x01, 0x00,0x37,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0e,0x00,0x00,0x50,0x08,0x00, 0x38,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0e,0x00,0x00,0x20,0x01,0x00,0x3a, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0e,0x00,0x00,0x20,0x01,0x00,0x3c,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0e,0x00,0x00,0x20,0x01,0x00,0x3e,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0e,0x00,0x00,0x20,0x01,0x00,0x3f,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0e,0x00,0x00,0x20,0x01,0x00,0x41,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0e,0x00,0x00,0x50,0x08,0x00,0x42,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0e,0x00,0x00,0x20,0x01,0x00,0x44,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0e,0x00,0x00,0x20,0x01,0x00,0x46,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0e,0x00,0x00,0x20,0x01,0x00,0x48,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0e,0x00,0x00,0x20,0x01,0x00,0x4a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0e, 0x00,0x00,0x20,0x01,0x00,0x4b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0e,0x00, 0x00,0x21,0x01,0x00,0x4c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0e,0x00,0x00, 0x20,0x01,0x00,0x4d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0e,0x00,0x00,0x20, 0x01,0x00,0x4e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0e,0x00,0x00,0x20,0x01, 0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0e,0x00,0x00,0x20,0x01,0x00, 0x52,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0e,0x00,0x00,0x20,0x01,0x00,0x54, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0e,0x00,0x00,0x20,0x01,0x00,0x56,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0e,0x00,0x00,0x20,0x01,0x00,0x58,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0e,0x00,0x00,0x20,0x01,0x00,0x5b,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0e,0x00,0x00,0x50,0x08,0x00,0x5c,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0e,0x00,0x00,0x20,0x01,0x00,0x5e,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0e,0x00,0x00,0x20,0x01,0x00,0x60,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0e,0x00,0x00,0x20,0x01,0x00,0x62,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0e,0x00,0x00,0x20,0x01,0x00,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0e,0x00,0x00,0x20,0x01,0x00,0x66,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0e, 0x00,0x00,0x20,0x01,0x00,0x68,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0e,0x00, 0x00,0x20,0x01,0x00,0x69,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0e,0x00,0x00, 0x21,0x01,0x00,0x6a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0e,0x00,0x00,0x20, 0x01,0x00,0x6b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0e,0x00,0x00,0x20,0x01, 0x00,0x6c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0e,0x00,0x00,0x20,0x01,0x00, 0x6e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0e,0x00,0x00,0x20,0x01,0x00,0x70, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0e,0x00,0x00,0x20,0x01,0x00,0x72,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0e,0x00,0x00,0x20,0x01,0x00,0x74,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0e,0x00,0x00,0x20,0x01,0x00,0x77,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0e,0x00,0x00,0x50,0x08,0x00,0x78,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0e,0x00,0x00,0x20,0x01,0x00,0x7a,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0e,0x00,0x00,0x20,0x01,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0e,0x00,0x00,0x20,0x01,0x00,0x7e,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0e,0x00,0x00,0x20,0x01,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0e,0x00,0x00,0x20,0x01,0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0e, 0x00,0x00,0x20,0x01,0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0e,0x00, 0x00,0x21,0x01,0x00,0x84,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0e,0x00,0x00, 0x20,0x01,0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0e,0x00,0x00,0x20, 0x01,0x00,0x86,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0e,0x00,0x00,0x20,0x01, 0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0e,0x00,0x00,0x20,0x01,0x00, 0x8b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0e,0x00,0x00,0x50,0x08,0x00,0x8c, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0e,0x00,0x00,0x20,0x01,0x00,0x8e,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0e,0x00,0x00,0x20,0x01,0x00,0x90,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0e,0x00,0x00,0x20,0x01,0x00,0x91,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0e,0x00,0x00,0x20,0x01,0x00,0x92,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0e,0x00,0x00,0x50,0x08,0x00,0x93,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0e,0x00,0x00,0x20,0x01,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0e,0x00,0x00,0x20,0x01,0x00,0x96,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0e,0x00,0x00,0x20,0x01,0x00,0x97,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0e,0x00,0x00,0x20,0x01,0x00,0x98,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0e, 0x00,0x00,0x50,0x08,0x00,0x99,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0e,0x00, 0x00,0x21,0x01,0x00,0x9a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0e,0x00,0x00, 0x20,0x01,0x00,0x9b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0e,0x00,0x00,0x20, 0x01,0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0e,0x00,0x00,0x50,0x08, 0x00,0x9e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0e,0x00,0x00,0x20,0x01,0x00, 0x9f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0e,0x00,0x00,0x53,0x40,0x00,0xbe, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0e,0x00,0x00,0x53,0x40,0x00,0xbf,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0e,0x00,0x00,0x53,0x40,0x00,0xc0,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0e,0x00,0x00,0x53,0x40,0x00,0xc1,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0e,0x00,0x00,0x53,0x40,0x00,0xc2,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0e,0x00,0x00,0x53,0x40,0x00,0xc3,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0e,0x00,0x00,0x53,0x40,0x00,0xc4,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0e,0x00,0x00,0x53,0x20,0x00,0xbc,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0e,0x00,0x00,0x53,0x40,0x00,0xc5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0e,0x00,0x00,0x53,0x20,0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0e, 0x00,0x00,0x54,0x40,0x00,0xae,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0e,0x00, 0x00,0x54,0x80,0x00,0xbe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0e,0x00,0x00, 0x54,0x40,0x00,0xaf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0e,0x00,0x00,0x54, 0x40,0x00,0xb0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0e,0x00,0x00,0x54,0x80, 0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0e,0x00,0x00,0x54,0x40,0x00, 0xb1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0e,0x00,0x00,0x54,0x40,0x00,0xb2, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0e,0x00,0x00,0x54,0x80,0x00,0xc0,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0e,0x00,0x00,0x54,0x40,0x00,0xb3,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0e,0x00,0x00,0x54,0x40,0x00,0xb4,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0e,0x00,0x00,0x54,0x80,0x00,0xc1,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0e,0x00,0x00,0x54,0x40,0x00,0xb5,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0e,0x00,0x00,0x54,0x40,0x00,0xb6,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0e,0x00,0x00,0x54,0x80,0x00,0xc2,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0e,0x00,0x00,0x54,0x40,0x00,0xb7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0e,0x00,0x00,0x54,0x40,0x00,0xb8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0e, 0x00,0x00,0x54,0x80,0x00,0xc3,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0e,0x00, 0x00,0x54,0x40,0x00,0xb9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0e,0x00,0x00, 0x54,0x40,0x00,0xba,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0e,0x00,0x00,0x54, 0x80,0x00,0xc4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0e,0x00,0x00,0x54,0x40, 0x00,0xbb,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0e,0x00,0x00,0x54,0x80,0x00, 0xc5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0e,0x00,0x00,0x51,0x10,0x00,0xbc, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0e,0x00,0x00,0x51,0x10,0x00,0xbd,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0e,0x00,0x00,0x20,0x01,0x00,0xc6,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0e,0x00,0x00,0x20,0x01,0x00,0xc7,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0e,0x00,0x00,0x20,0x01,0x00,0xc9,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0e,0x00,0x00,0x20,0x01,0x00,0xcb,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0e,0x00,0x00,0x20,0x01,0x00,0xcd,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0e,0x00,0x00,0x20,0x01,0x00,0xd0,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0e,0x00,0x00,0x20,0x01,0x00,0xd1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0e,0x00,0x00,0x20,0x01,0x00,0xd3,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0e, 0x00,0x00,0x20,0x01,0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0e,0x00, 0x00,0x20,0x01,0x00,0xd7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0e,0x00,0x00, 0x20,0x01,0x00,0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0e,0x00,0x00,0x20, 0x01,0x00,0xdb,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0e,0x00,0x00,0x20,0x01, 0x00,0xde,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0e,0x00,0x00,0x20,0x01,0x00, 0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0e,0x00,0x00,0x20,0x01,0x00,0xe1, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0e,0x00,0x00,0x20,0x01,0x00,0xe3,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0e,0x00,0x00,0x20,0x01,0x00,0xe5,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0e,0x00,0x00,0x20,0x01,0x00,0xe7,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0e,0x00,0x00,0x20,0x01,0x00,0xea,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0e,0x00,0x00,0x20,0x01,0x00,0xeb,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0e,0x00,0x00,0x20,0x01,0x00,0xed,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0e,0x00,0x00,0x20,0x01,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0e,0x00,0x00,0x20,0x01,0x00,0xf1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0e,0x00,0x00,0x20,0x01,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0e, 0x00,0x00,0x20,0x01,0x00,0xf5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0e,0x00, 0x00,0x23,0x02,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0e,0x00,0x00, 0x12,0x01,0x00,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0e,0x00,0x00,0x53, 0x00,0x02,0x23,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0e,0x00,0x00,0x53,0x20, 0x00,0x1e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0e,0x00,0x00,0x53,0x20,0x00, 0x1f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0e,0x00,0x00,0x54,0x40,0x00,0x10, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0e,0x00,0x00,0x54,0x00,0x04,0x23,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0e,0x00,0x00,0x54,0x40,0x00,0x11,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x54,0x40,0x00,0x12,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0e,0x00,0x00,0x54,0x40,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0e,0x00,0x00,0x54,0x40,0x00,0x14,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0e,0x00,0x00,0x54,0x40,0x00,0x15,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0e,0x00,0x00,0x54,0x40,0x00,0x16,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0e,0x00,0x00,0x54,0x40,0x00,0x17,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0e,0x00,0x00,0x54,0x40,0x00,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0e, 0x00,0x00,0x54,0x40,0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0e,0x00, 0x00,0x54,0x40,0x00,0x1a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0e,0x00,0x00, 0x54,0x40,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0e,0x00,0x00,0x54, 0x40,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0e,0x00,0x00,0x54,0x40, 0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0e,0x00,0x00,0x51,0x10,0x00, 0x1e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0e,0x00,0x00,0x51,0x10,0x00,0x1f, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0e,0x00,0x00,0x23,0x02,0x00,0xfa,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0e,0x00,0x00,0x12,0x01,0x00,0x21,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0e,0x00,0x00,0x20,0x01,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0e,0x00,0x00,0x21,0x01,0x00,0x24,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0e,0x00,0x00,0x20,0x01,0x00,0x25,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0e,0x00,0x00,0x20,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0e,0x00,0x00,0x20,0x01,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0e,0x00,0x00,0x20,0x01,0x00,0x2a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0e,0x00,0x00,0x20,0x01,0x00,0x2c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0e, 0x00,0x00,0x20,0x01,0x00,0x2f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0e,0x00, 0x00,0x20,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0e,0x00,0x00, 0x20,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0e,0x00,0x00,0x20, 0x01,0x00,0x34,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0e,0x00,0x00,0x50,0x08, 0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0e,0x00,0x00,0x20,0x01,0x00, 0x36,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0e,0x00,0x00,0x20,0x01,0x00,0x37, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0e,0x00,0x00,0x20,0x01,0x00,0x38,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0e,0x00,0x00,0x20,0x01,0x00,0x39,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0e,0x00,0x00,0x20,0x01,0x00,0x3a,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0e,0x00,0x00,0x20,0x01,0x00,0x3d,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0e,0x00,0x00,0x20,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0e,0x00,0x00,0x20,0x01,0x00,0x43,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0e,0x00,0x00,0x20,0x01,0x00,0x45,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0e,0x00,0x00,0x20,0x01,0x00,0x46,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0e,0x00,0x00,0x20,0x01,0x00,0x47,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0e, 0x00,0x00,0x20,0x01,0x00,0x48,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0e,0x00, 0x00,0x20,0x01,0x00,0x49,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0e,0x00,0x00, 0x21,0x01,0x00,0x4a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0e,0x00,0x00,0x20, 0x01,0x00,0x4b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0e,0x00,0x00,0x20,0x01, 0x00,0x4c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0e,0x00,0x00,0x20,0x01,0x00, 0x4e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0e,0x00,0x00,0x20,0x01,0x00,0x50, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0e,0x00,0x00,0x20,0x01,0x00,0x52,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0e,0x00,0x00,0x20,0x01,0x00,0x54,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0e,0x00,0x00,0x20,0x01,0x00,0x56,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0e,0x00,0x00,0x20,0x01,0x00,0x58,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0e,0x00,0x00,0x20,0x01,0x00,0x5b,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0e,0x00,0x00,0x20,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0e,0x00,0x00,0x20,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0e,0x00,0x00,0x20,0x01,0x00,0x63,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf3, 0x0e,0x00,0x00,0x20,0x01,0x00,0x65,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0e, 0x00,0x00,0x20,0x01,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0e,0x00, 0x00,0x20,0x01,0x00,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0e,0x00,0x00, 0x20,0x01,0x00,0x68,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0e,0x00,0x00,0x20, 0x01,0x00,0x69,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0e,0x00,0x00,0x20,0x01, 0x00,0x6a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0e,0x00,0x00,0x20,0x01,0x00, 0x6b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0e,0x00,0x00,0x21,0x01,0x00,0x6c, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0e,0x00,0x00,0x20,0x01,0x00,0x6d,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0e,0x00,0x00,0x20,0x01,0x00,0x6e,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xfd,0x0e,0x00,0x00,0x20,0x01,0x00,0x70,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x0e,0x00,0x00,0x20,0x01,0x00,0x72,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0x0e,0x00,0x00,0x20,0x01,0x00,0x74,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x00,0x00,0x20,0x01,0x00,0x76,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0f,0x00,0x00,0x20,0x01,0x00,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x0f,0x00,0x00,0x20,0x01,0x00,0x7b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x0f,0x00,0x00,0x20,0x01,0x00,0x82,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0f, 0x00,0x00,0x20,0x01,0x00,0x84,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,0x00, 0x00,0x20,0x01,0x00,0x85,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0f,0x00,0x00, 0x20,0x01,0x00,0x86,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0f,0x00,0x00,0x20, 0x01,0x00,0x87,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0f,0x00,0x00,0x20,0x01, 0x00,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0f,0x00,0x00,0x20,0x01,0x00, 0x89,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0f,0x00,0x00,0x21,0x01,0x00,0x8a, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0f,0x00,0x00,0x20,0x01,0x00,0x8b,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0f,0x00,0x00,0x20,0x01,0x00,0x8c,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x0d,0x0f,0x00,0x00,0x20,0x01,0x00,0x8e,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x0f,0x00,0x00,0x20,0x01,0x00,0x90,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x0f,0x00,0x00,0x20,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x0f,0x00,0x00,0x20,0x01,0x00,0x96,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x11,0x0f,0x00,0x00,0x20,0x01,0x00,0x98,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0f,0x00,0x00,0x20,0x01,0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x13, 0x0f,0x00,0x00,0x20,0x01,0x00,0x9a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0f, 0x00,0x00,0x20,0x01,0x00,0x9e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0f,0x00, 0x00,0x20,0x01,0x00,0xa0,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0f,0x00,0x00, 0x20,0x01,0x00,0xa1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0f,0x00,0x00,0x20, 0x01,0x00,0xa2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0f,0x00,0x00,0x20,0x01, 0x00,0xa3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0f,0x00,0x00,0x20,0x01,0x00, 0xa5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0f,0x00,0x00,0x21,0x01,0x00,0xa6, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0f,0x00,0x00,0x20,0x01,0x00,0xa7,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0f,0x00,0x00,0x20,0x01,0x00,0xa8,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x0f,0x00,0x00,0x20,0x01,0x00,0xac,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x0f,0x00,0x00,0x20,0x01,0x00,0xad,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x0f,0x00,0x00,0x12,0x01,0x00,0xaf,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x0f,0x00,0x00,0x53,0x00,0x02,0xcf,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x0f,0x00,0x00,0x53,0x20,0x00,0xcd,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x0f,0x00,0x00,0x53,0x20,0x00,0xce,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x0f,0x00,0x00,0x54,0x40,0x00,0xbf,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0f, 0x00,0x00,0x54,0x00,0x04,0xcf,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0f,0x00, 0x00,0x54,0x40,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0f,0x00,0x00, 0x54,0x40,0x00,0xc1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0f,0x00,0x00,0x54, 0x40,0x00,0xc2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0f,0x00,0x00,0x54,0x40, 0x00,0xc3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0f,0x00,0x00,0x54,0x40,0x00, 0xc4,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0f,0x00,0x00,0x54,0x40,0x00,0xc5, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0f,0x00,0x00,0x54,0x40,0x00,0xc6,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0f,0x00,0x00,0x54,0x40,0x00,0xc7,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x0f,0x00,0x00,0x54,0x40,0x00,0xc8,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x0f,0x00,0x00,0x54,0x40,0x00,0xc9,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x0f,0x00,0x00,0x54,0x40,0x00,0xca,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x0f,0x00,0x00,0x54,0x40,0x00,0xcb,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x0f,0x00,0x00,0x54,0x40,0x00,0xcc,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x0f,0x00,0x00,0x51,0x10,0x00,0xcd,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x0f,0x00,0x00,0x51,0x10,0x00,0xce,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0f, 0x00,0x00,0x21,0x01,0x00,0xd0,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0f,0x00, 0x00,0x20,0x01,0x00,0xd1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0f,0x00,0x00, 0x20,0x01,0x00,0xd2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0f,0x00,0x00,0x20, 0x01,0x00,0xd7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0f,0x00,0x00,0x20,0x01, 0x00,0xd9,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0f,0x00,0x00,0x20,0x01,0x00, 0xda,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0f,0x00,0x00,0x20,0x01,0x00,0xdb, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0f,0x00,0x00,0x20,0x01,0x00,0xdc,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0f,0x00,0x00,0x20,0x01,0x00,0xde,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x0f,0x00,0x00,0x20,0x01,0x00,0xe0,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x0f,0x00,0x00,0x20,0x01,0x00,0xe1,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x0f,0x00,0x00,0x20,0x01,0x00,0xe2,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x0f,0x00,0x00,0x20,0x01,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x0f,0x00,0x00,0x20,0x01,0x00,0xe4,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x0f,0x00,0x00,0x21,0x01,0x00,0xe5,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x0f,0x00,0x00,0x20,0x01,0x00,0xe6,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x0f, 0x00,0x00,0x20,0x01,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0f,0x00, 0x00,0x20,0x01,0x00,0xef,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0f,0x00,0x00, 0x20,0x01,0x00,0xf1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0f,0x00,0x00,0x20, 0x01,0x00,0xf2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0f,0x00,0x00,0x20,0x01, 0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0f,0x00,0x00,0x20,0x01,0x00, 0xf4,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0f,0x00,0x00,0x20,0x01,0x00,0xf5, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0f,0x00,0x00,0x20,0x01,0x00,0xf6,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0f,0x00,0x00,0x20,0x01,0x00,0xf7,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x0f,0x00,0x00,0x21,0x01,0x00,0xf8,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x0f,0x00,0x00,0x20,0x01,0x00,0xf9,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x0f,0x00,0x00,0x20,0x01,0x00,0xfa,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x0f,0x00,0x00,0x20,0x01,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x0f,0x00,0x00,0x20,0x01,0x00,0x03,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x0f,0x00,0x00,0x20,0x01,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x0f,0x00,0x00,0x20,0x01,0x00,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x0f, 0x00,0x00,0x20,0x01,0x00,0x06,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0f,0x00, 0x00,0x20,0x01,0x00,0x07,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0f,0x00,0x00, 0x20,0x01,0x00,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0f,0x00,0x00,0x21, 0x01,0x00,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0f,0x00,0x00,0x20,0x01, 0x00,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0f,0x00,0x00,0x20,0x01,0x00, 0x0e,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0f,0x00,0x00,0x20,0x01,0x00,0x10, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0f,0x00,0x00,0x20,0x01,0x00,0x11,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0f,0x00,0x00,0x20,0x01,0x00,0x12,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x0f,0x00,0x00,0x20,0x01,0x00,0x13,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x0f,0x00,0x00,0x20,0x01,0x00,0x15,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x0f,0x00,0x00,0x20,0x01,0x00,0x16,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x0f,0x00,0x00,0x20,0x01,0x00,0x17,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x0f,0x00,0x00,0x20,0x01,0x00,0x18,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x0f,0x00,0x00,0x21,0x01,0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x0f,0x00,0x00,0x20,0x01,0x00,0x1a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x0f, 0x00,0x00,0x20,0x01,0x00,0x1c,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0f,0x00, 0x00,0x20,0x01,0x00,0x1d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0f,0x00,0x00, 0x12,0x01,0x00,0x1f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0f,0x00,0x00,0x53, 0x00,0x02,0x30,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0f,0x00,0x00,0x53,0x20, 0x00,0x2f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0f,0x00,0x00,0x54,0x40,0x00, 0x28,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0f,0x00,0x00,0x54,0x00,0x04,0x30, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0f,0x00,0x00,0x54,0x40,0x00,0x29,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0f,0x00,0x00,0x54,0x40,0x00,0x2a,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00,0x54,0x40,0x00,0x2b,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x0f,0x00,0x00,0x54,0x40,0x00,0x2c,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x0f,0x00,0x00,0x54,0x40,0x00,0x2d,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x0f,0x00,0x00,0x54,0x40,0x00,0x2e,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x0f,0x00,0x00,0x51,0x10,0x00,0x2f,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x0f,0x00,0x00,0x20,0x01,0x00,0x32,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x0f,0x00,0x00,0x20,0x01,0x00,0x33,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x0f, 0x00,0x00,0x20,0x01,0x00,0x34,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0f,0x00, 0x00,0x20,0x01,0x00,0x35,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0f,0x00,0x00, 0x20,0x01,0x00,0x36,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0f,0x00,0x00,0x20, 0x01,0x00,0x38,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0f,0x00,0x00,0x20,0x01, 0x00,0x39,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0f,0x00,0x00,0x20,0x01,0x00, 0x3a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0f,0x00,0x00,0x20,0x01,0x00,0x3b, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0f,0x00,0x00,0x20,0x01,0x00,0x3c,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0f,0x00,0x00,0x20,0x01,0x00,0x3d,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x0f,0x00,0x00,0x20,0x01,0x00,0x3e,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x0f,0x00,0x00,0x20,0x01,0x00,0x40,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x0f,0x00,0x00,0x20,0x01,0x00,0x41,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0f,0x00,0x00,0x20,0x01,0x00,0x42,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x0f,0x00,0x00,0x20,0x01,0x00,0x43,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x0f,0x00,0x00,0x20,0x01,0x00,0x44,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x0f,0x00,0x00,0x20,0x01,0x00,0x45,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0f, 0x00,0x00,0x20,0x01,0x00,0x47,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0f,0x00, 0x00,0x20,0x01,0x00,0x48,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0f,0x00,0x00, 0x20,0x01,0x00,0x49,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0f,0x00,0x00,0x20, 0x01,0x00,0x4a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0f,0x00,0x00,0x12,0x01, 0x00,0x4c,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0f,0x00,0x00,0x53,0x00,0x02, 0x5d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0f,0x00,0x00,0x53,0x20,0x00,0x5c, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0f,0x00,0x00,0x54,0x40,0x00,0x55,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0f,0x00,0x00,0x54,0x00,0x04,0x5d,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x0f,0x00,0x00,0x54,0x40,0x00,0x56,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x0f,0x00,0x00,0x54,0x40,0x00,0x57,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x0f,0x00,0x00,0x54,0x40,0x00,0x58,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x0f,0x00,0x00,0x54,0x40,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x0f,0x00,0x00,0x54,0x40,0x00,0x5a,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x0f,0x00,0x00,0x54,0x40,0x00,0x5b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x0f,0x00,0x00,0x51,0x10,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0f, 0x00,0x00,0x21,0x01,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0f,0x00, 0x00,0x20,0x01,0x00,0x5f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0f,0x00,0x00, 0x20,0x01,0x00,0x60,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0f,0x00,0x00,0x20, 0x01,0x00,0x65,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0f,0x00,0x00,0x20,0x01, 0x00,0x67,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0f,0x00,0x00,0x20,0x01,0x00, 0x68,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0f,0x00,0x00,0x20,0x01,0x00,0x69, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0f,0x00,0x00,0x20,0x01,0x00,0x6a,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0f,0x00,0x00,0x20,0x01,0x00,0x6c,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x0f,0x00,0x00,0x20,0x01,0x00,0x6e,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x0f,0x00,0x00,0x20,0x01,0x00,0x6f,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x0f,0x00,0x00,0x20,0x01,0x00,0x70,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0f,0x00,0x00,0x20,0x01,0x00,0x71,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x0f,0x00,0x00,0x20,0x01,0x00,0x72,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x0f,0x00,0x00,0x21,0x01,0x00,0x73,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x0f,0x00,0x00,0x20,0x01,0x00,0x74,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x0f, 0x00,0x00,0x20,0x01,0x00,0x75,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0f,0x00, 0x00,0x20,0x01,0x00,0x7d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0f,0x00,0x00, 0x20,0x01,0x00,0x7f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0f,0x00,0x00,0x20, 0x01,0x00,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0f,0x00,0x00,0x20,0x01, 0x00,0x81,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0f,0x00,0x00,0x20,0x01,0x00, 0x82,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0f,0x00,0x00,0x20,0x01,0x00,0x83, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0f,0x00,0x00,0x20,0x01,0x00,0x84,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0f,0x00,0x00,0x20,0x01,0x00,0x85,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xad,0x0f,0x00,0x00,0x21,0x01,0x00,0x86,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xae,0x0f,0x00,0x00,0x20,0x01,0x00,0x87,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0xaf,0x0f,0x00,0x00,0x20,0x01,0x00,0x88,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0x0f,0x00,0x00,0x20,0x01,0x00,0x8f,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xb1,0x0f,0x00,0x00,0x20,0x01,0x00,0x91,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xb2,0x0f,0x00,0x00,0x20,0x01,0x00,0x92,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb3, 0x0f,0x00,0x00,0x20,0x01,0x00,0x93,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x0f, 0x00,0x00,0x20,0x01,0x00,0x94,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0f,0x00, 0x00,0x20,0x01,0x00,0x95,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0f,0x00,0x00, 0x20,0x01,0x00,0x96,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0f,0x00,0x00,0x21, 0x01,0x00,0x97,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0f,0x00,0x00,0x20,0x01, 0x00,0x98,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0f,0x00,0x00,0x20,0x01,0x00, 0x9c,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0f,0x00,0x00,0x20,0x01,0x00,0x9e, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0f,0x00,0x00,0x20,0x01,0x00,0x9f,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0f,0x00,0x00,0x20,0x01,0x00,0xa0,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xbd,0x0f,0x00,0x00,0x20,0x01,0x00,0xa1,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xbe,0x0f,0x00,0x00,0x20,0x01,0x00,0xa3,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0x0f,0x00,0x00,0x20,0x01,0x00,0xa4,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x0f,0x00,0x00,0x20,0x01,0x00,0xa5,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xc1,0x0f,0x00,0x00,0x20,0x01,0x00,0xa6,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xc2,0x0f,0x00,0x00,0x21,0x01,0x00,0xa7,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc3, 0x0f,0x00,0x00,0x20,0x01,0x00,0xa8,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0f, 0x00,0x00,0x20,0x01,0x00,0xaa,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0f,0x00, 0x00,0x20,0x01,0x00,0xab,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0f,0x00,0x00, 0x53,0x40,0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0f,0x00,0x00,0x53, 0x40,0x00,0xce,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0f,0x00,0x00,0x53,0x40, 0x00,0xcf,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0f,0x00,0x00,0x53,0x40,0x00, 0xd0,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0f,0x00,0x00,0x53,0x40,0x00,0xd1, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0f,0x00,0x00,0x53,0x40,0x00,0xd2,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0f,0x00,0x00,0x53,0x40,0x00,0xd3,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xcd,0x0f,0x00,0x00,0x53,0x20,0x00,0xcb,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xce,0x0f,0x00,0x00,0x53,0x40,0x00,0xd4,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0xcf,0x0f,0x00,0x00,0x53,0x20,0x00,0xcc,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0x0f,0x00,0x00,0x54,0x40,0x00,0xbd,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xd1,0x0f,0x00,0x00,0x54,0x80,0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0x0f,0x00,0x00,0x54,0x40,0x00,0xbe,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd3, 0x0f,0x00,0x00,0x54,0x40,0x00,0xbf,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x0f, 0x00,0x00,0x54,0x80,0x00,0xce,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0f,0x00, 0x00,0x54,0x40,0x00,0xc0,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0f,0x00,0x00, 0x54,0x40,0x00,0xc1,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0f,0x00,0x00,0x54, 0x80,0x00,0xcf,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0f,0x00,0x00,0x54,0x40, 0x00,0xc2,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0f,0x00,0x00,0x54,0x40,0x00, 0xc3,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0f,0x00,0x00,0x54,0x80,0x00,0xd0, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0f,0x00,0x00,0x54,0x40,0x00,0xc4,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0f,0x00,0x00,0x54,0x40,0x00,0xc5,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xdd,0x0f,0x00,0x00,0x54,0x80,0x00,0xd1,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xde,0x0f,0x00,0x00,0x54,0x40,0x00,0xc6,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0xdf,0x0f,0x00,0x00,0x54,0x40,0x00,0xc7,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x0f,0x00,0x00,0x54,0x80,0x00,0xd2,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xe1,0x0f,0x00,0x00,0x54,0x40,0x00,0xc8,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0x0f,0x00,0x00,0x54,0x40,0x00,0xc9,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe3, 0x0f,0x00,0x00,0x54,0x80,0x00,0xd3,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x0f, 0x00,0x00,0x54,0x40,0x00,0xca,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0f,0x00, 0x00,0x54,0x80,0x00,0xd4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0f,0x00,0x00, 0x51,0x10,0x00,0xcb,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0f,0x00,0x00,0x51, 0x10,0x00,0xcc,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0f,0x00,0x00,0x20,0x01, 0x00,0xd5,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0f,0x00,0x00,0x20,0x01,0x00, 0xdb,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0f,0x00,0x00,0x20,0x01,0x00,0xe3, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0f,0x00,0x00,0x20,0x01,0x00,0xea,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0f,0x00,0x00,0x20,0x01,0x00,0xee,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xed,0x0f,0x00,0x00,0x20,0x01,0x00,0xef,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0xee,0x0f,0x00,0x00,0x20,0x01,0x00,0xf1,0x09,0x00,0x00,0x00, 0x00,0x00,0x00,0xef,0x0f,0x00,0x00,0x20,0x01,0x00,0xf4,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x0f,0x00,0x00,0x20,0x01,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0xf1,0x0f,0x00,0x00,0x20,0x01,0x00,0xf6,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0x0f,0x00,0x00,0x20,0x01,0x00,0xfa,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x00,0xf3,0x0f,0x00,0x00,0x01,0x00,0x00,0xf4,0x0f,0x00,0x00,0x01,0x00,0x00,0xf5, 0x0f,0x00,0x00,0x01,0x00,0x00,0xf6,0x0f,0x00,0x00,0x01,0x00,0x00,0xf7,0x0f,0x00, 0x00,0x01,0x00,0x00,0xf8,0x0f,0x00,0x00,0x01,0x00,0x00,0xf9,0x0f,0x00,0x00,0x01, 0x00,0x00,0xfa,0x0f,0x00,0x00,0x01,0x00,0x00,0xfb,0x0f,0x00,0x00,0x01,0x00,0x00, 0xfc,0x0f,0x00,0x00,0x01,0x00,0x00,0xfd,0x0f,0x00,0x00,0x01,0x00,0x00,0xfe,0x0f, 0x00,0x00,0x01,0x00,0x00,0xff,0x0f,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00, 0x01,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x00,0x00,0x02,0x10,0x00,0x00,0x01,0x00, 0x00,0x03,0x10,0x00,0x00,0x01,0x00,0x00,0x04,0x10,0x00,0x00,0x01,0x00,0x00,0x05, 0x10,0x00,0x00,0x01,0x00,0x00,0x06,0x10,0x00,0x00,0x01,0x00,0x00,0xea,0x00,0x07, 0x10,0x00,0x00,0x01,0x00,0x00,0x08,0x10,0x00,0x00,0x01,0x00,0x00,0x09,0x10,0x00, 0x00,0x01,0x00,0x00,0x0a,0x10,0x00,0x00,0x01,0x00,0x00,0x0b,0x10,0x00,0x00,0x01, 0x00,0x00,0x0c,0x10,0x00,0x00,0x01,0x00,0x00,0x0d,0x10,0x00,0x00,0x01,0x00,0x00, 0x0e,0x10,0x00,0x00,0x01,0x00,0x00,0x0f,0x10,0x00,0x00,0x01,0x00,0x00,0x10,0x10, 0x00,0x00,0x01,0x00,0x00,0x11,0x10,0x00,0x00,0x01,0x00,0x00,0x12,0x10,0x00,0x00, 0x01,0x00,0x00,0x13,0x10,0x00,0x00,0x01,0x00,0x00,0x14,0x10,0x00,0x00,0x01,0x00, 0x00,0x15,0x10,0x00,0x00,0x01,0x00,0x00,0x16,0x10,0x00,0x00,0x01,0x00,0x00,0x17, 0x10,0x00,0x00,0x01,0x00,0x00,0x18,0x10,0x00,0x00,0x01,0x00,0x00,0x19,0x10,0x00, 0x00,0x01,0x00,0x00,0x1a,0x10,0x00,0x00,0x01,0x00,0x00,0x1b,0x10,0x00,0x00,0x01, 0x00,0x00,0x1c,0x10,0x00,0x00,0x01,0x00,0x00,0x1d,0x10,0x00,0x00,0x01,0x00,0x00, 0x1e,0x10,0x00,0x00,0x01,0x00,0x00,0x1f,0x10,0x00,0x00,0x01,0x00,0x00,0x20,0x10, 0x00,0x00,0x01,0x00,0x00,0x21,0x10,0x00,0x00,0x01,0x00,0x00,0x22,0x10,0x00,0x00, 0x01,0x00,0x00,0x23,0x10,0x00,0x00,0x01,0x00,0x00,0x24,0x10,0x00,0x00,0x01,0x00, 0x00,0x25,0x10,0x00,0x00,0x01,0x00,0x00,0x26,0x10,0x00,0x00,0x01,0x00,0x00,0x27, 0x10,0x00,0x00,0x01,0x00,0x00,0x28,0x10,0x00,0x00,0x01,0x00,0x00,0x29,0x10,0x00, 0x00,0x01,0x00,0x00,0x2a,0x10,0x00,0x00,0x01,0x00,0x00,0x2b,0x10,0x00,0x00,0x01, 0x00,0x00,0x2c,0x10,0x00,0x00,0x01,0x00,0x00,0x2d,0x10,0x00,0x00,0x01,0x00,0x00, 0x2e,0x10,0x00,0x00,0x01,0x00,0x00,0x2f,0x10,0x00,0x00,0x01,0x00,0x00,0x30,0x10, 0x00,0x00,0x01,0x00,0x00,0x31,0x10,0x00,0x00,0x01,0x00,0x00,0x32,0x10,0x00,0x00, 0x01,0x00,0x00,0x33,0x10,0x00,0x00,0x01,0x00,0x00,0x34,0x10,0x00,0x00,0x01,0x00, 0x00,0x35,0x10,0x00,0x00,0x01,0x00,0x00,0x36,0x10,0x00,0x00,0x01,0x00,0x00,0x37, 0x10,0x00,0x00,0x01,0x00,0x00,0x38,0x10,0x00,0x00,0x01,0x00,0x00,0x39,0x10,0x00, 0x00,0x01,0x00,0x00,0x3a,0x10,0x00,0x00,0x01,0x00,0x00,0x3b,0x10,0x00,0x00,0x01, 0x00,0x00,0x3c,0x10,0x00,0x00,0x01,0x00,0x00,0x3d,0x10,0x00,0x00,0x01,0x00,0x00, 0x3e,0x10,0x00,0x00,0x01,0x00,0x00,0x3f,0x10,0x00,0x00,0x01,0x00,0x00,0x40,0x10, 0x00,0x00,0x01,0x00,0x00,0x41,0x10,0x00,0x00,0x01,0x00,0x00,0x42,0x10,0x00,0x00, 0x01,0x00,0x00,0x43,0x10,0x00,0x00,0x01,0x00,0x00,0x44,0x10,0x00,0x00,0x01,0x00, 0x00,0x45,0x10,0x00,0x00,0x01,0x00,0x00,0x46,0x10,0x00,0x00,0x01,0x00,0x00,0x47, 0x10,0x00,0x00,0x01,0x00,0x00,0x48,0x10,0x00,0x00,0x01,0x00,0x00,0x49,0x10,0x00, 0x00,0x01,0x00,0x00,0x4a,0x10,0x00,0x00,0x01,0x00,0x00,0x4b,0x10,0x00,0x00,0x01, 0x00,0x00,0x4c,0x10,0x00,0x00,0x01,0x00,0x00,0x4d,0x10,0x00,0x00,0x01,0x00,0x00, 0x4e,0x10,0x00,0x00,0x01,0x00,0x00,0x4f,0x10,0x00,0x00,0x01,0x00,0x00,0x50,0x10, 0x00,0x00,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x01,0x00,0x00,0x52,0x10,0x00,0x00, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x01,0x00,0x00,0x54,0x10,0x00,0x00,0x01,0x00, 0x00,0x55,0x10,0x00,0x00,0x01,0x00,0x00,0x56,0x10,0x00,0x00,0x01,0x00,0x00,0x57, 0x10,0x00,0x00,0x01,0x00,0x00,0x58,0x10,0x00,0x00,0x01,0x00,0x00,0x59,0x10,0x00, 0x00,0x01,0x00,0x00,0x5a,0x10,0x00,0x00,0x01,0x00,0x00,0x5b,0x10,0x00,0x00,0x01, 0x00,0x00,0x5c,0x10,0x00,0x00,0x01,0x00,0x00,0x5d,0x10,0x00,0x00,0x01,0x00,0x00, 0x5e,0x10,0x00,0x00,0x01,0x00,0x00,0x5f,0x10,0x00,0x00,0x01,0x00,0x00,0x60,0x10, 0x00,0x00,0x01,0x00,0x00,0x61,0x10,0x00,0x00,0x01,0x00,0x00,0x62,0x10,0x00,0x00, 0x01,0x00,0x00,0x63,0x10,0x00,0x00,0x01,0x00,0x00,0x64,0x10,0x00,0x00,0x01,0x00, 0x00,0x65,0x10,0x00,0x00,0x01,0x00,0x00,0x66,0x10,0x00,0x00,0x01,0x00,0x00,0x67, 0x10,0x00,0x00,0x01,0x00,0x00,0x68,0x10,0x00,0x00,0x01,0x00,0x00,0x69,0x10,0x00, 0x00,0x01,0x00,0x00,0x6a,0x10,0x00,0x00,0x01,0x00,0x00,0x6b,0x10,0x00,0x00,0x01, 0x00,0x00,0x6c,0x10,0x00,0x00,0x01,0x00,0x00,0x6d,0x10,0x00,0x00,0x01,0x00,0x00, 0x6e,0x10,0x00,0x00,0x01,0x00,0x00,0x6f,0x10,0x00,0x00,0x01,0x00,0x00,0x70,0x10, 0x00,0x00,0x01,0x00,0x00,0x71,0x10,0x00,0x00,0x01,0x00,0x00,0x72,0x10,0x00,0x00, 0x01,0x00,0x00,0x73,0x10,0x00,0x00,0x01,0x00,0x00,0x74,0x10,0x00,0x00,0x01,0x00, 0x00,0x75,0x10,0x00,0x00,0x01,0x00,0x00,0x76,0x10,0x00,0x00,0x01,0x00,0x00,0x77, 0x10,0x00,0x00,0x01,0x00,0x00,0x78,0x10,0x00,0x00,0x01,0x00,0x00,0x79,0x10,0x00, 0x00,0x01,0x00,0x00,0x7a,0x10,0x00,0x00,0x01,0x00,0x00,0x7b,0x10,0x00,0x00,0x01, 0x00,0x00,0x7c,0x10,0x00,0x00,0x01,0x00,0x00,0x7d,0x10,0x00,0x00,0x01,0x00,0x00, 0x7e,0x10,0x00,0x00,0x01,0x00,0x00,0x7f,0x10,0x00,0x00,0x01,0x00,0x00,0x80,0x10, 0x00,0x00,0x01,0x00,0x00,0x81,0x10,0x00,0x00,0x01,0x00,0x00,0x82,0x10,0x00,0x00, 0x01,0x00,0x00,0x83,0x10,0x00,0x00,0x01,0x00,0x00,0x84,0x10,0x00,0x00,0x01,0x00, 0x00,0x85,0x10,0x00,0x00,0x01,0x00,0x00,0x86,0x10,0x00,0x00,0x01,0x00,0x00,0x87, 0x10,0x00,0x00,0x01,0x00,0x00,0x88,0x10,0x00,0x00,0x01,0x00,0x00,0x89,0x10,0x00, 0x00,0x01,0x00,0x00,0x8a,0x10,0x00,0x00,0x01,0x00,0x00,0x8b,0x10,0x00,0x00,0x01, 0x00,0x00,0x8c,0x10,0x00,0x00,0x01,0x00,0x00,0x8d,0x10,0x00,0x00,0x01,0x00,0x00, 0x8e,0x10,0x00,0x00,0x01,0x00,0x00,0x8f,0x10,0x00,0x00,0x01,0x00,0x00,0x90,0x10, 0x00,0x00,0x01,0x00,0x00,0x91,0x10,0x00,0x00,0x01,0x00,0x00,0x92,0x10,0x00,0x00, 0x01,0x00,0x00,0x93,0x10,0x00,0x00,0x01,0x00,0x00,0x94,0x10,0x00,0x00,0x01,0x00, 0x00,0x95,0x10,0x00,0x00,0x01,0x00,0x00,0x96,0x10,0x00,0x00,0x01,0x00,0x00,0x97, 0x10,0x00,0x00,0x01,0x00,0x00,0x98,0x10,0x00,0x00,0x01,0x00,0x00,0x99,0x10,0x00, 0x00,0x01,0x00,0x00,0x9a,0x10,0x00,0x00,0x01,0x00,0x00,0x9b,0x10,0x00,0x00,0x01, 0x00,0x00,0x9c,0x10,0x00,0x00,0x01,0x00,0x00,0x9d,0x10,0x00,0x00,0x01,0x00,0x00, 0x9e,0x10,0x00,0x00,0x01,0x00,0x00,0x9f,0x10,0x00,0x00,0x01,0x00,0x00,0xa0,0x10, 0x00,0x00,0x01,0x00,0x00,0xa1,0x10,0x00,0x00,0x01,0x00,0x00,0xa2,0x10,0x00,0x00, 0x01,0x00,0x00,0xa3,0x10,0x00,0x00,0x01,0x00,0x00,0xa4,0x10,0x00,0x00,0x01,0x00, 0x00,0xa5,0x10,0x00,0x00,0x01,0x00,0x00,0xa6,0x10,0x00,0x00,0x01,0x00,0x00,0xa7, 0x10,0x00,0x00,0x01,0x00,0x00,0xa8,0x10,0x00,0x00,0x01,0x00,0x00,0xa9,0x10,0x00, 0x00,0x01,0x00,0x00,0xaa,0x10,0x00,0x00,0x01,0x00,0x00,0xab,0x10,0x00,0x00,0x01, 0x00,0x00,0xac,0x10,0x00,0x00,0x01,0x00,0x00,0xad,0x10,0x00,0x00,0x01,0x00,0x00, 0xae,0x10,0x00,0x00,0x01,0x00,0x00,0xaf,0x10,0x00,0x00,0x01,0x00,0x00,0xb0,0x10, 0x00,0x00,0x01,0x00,0x00,0xb1,0x10,0x00,0x00,0x01,0x00,0x00,0xb2,0x10,0x00,0x00, 0x01,0x00,0x00,0xb3,0x10,0x00,0x00,0x01,0x00,0x00,0xb4,0x10,0x00,0x00,0x01,0x00, 0x00,0xb5,0x10,0x00,0x00,0x01,0x00,0x00,0xb6,0x10,0x00,0x00,0x01,0x00,0x00,0xb7, 0x10,0x00,0x00,0x01,0x00,0x00,0xb8,0x10,0x00,0x00,0x01,0x00,0x00,0xb9,0x10,0x00, 0x00,0x01,0x00,0x00,0xba,0x10,0x00,0x00,0x01,0x00,0x00,0xbb,0x10,0x00,0x00,0x01, 0x00,0x00,0xbc,0x10,0x00,0x00,0x01,0x00,0x00,0xbd,0x10,0x00,0x00,0x01,0x00,0x00, 0xbe,0x10,0x00,0x00,0x01,0x00,0x00,0xbf,0x10,0x00,0x00,0x01,0x00,0x00,0xc0,0x10, 0x00,0x00,0x01,0x00,0x00,0xc1,0x10,0x00,0x00,0x01,0x00,0x00,0xc2,0x10,0x00,0x00, 0x01,0x00,0x00,0xc3,0x10,0x00,0x00,0x01,0x00,0x00,0xc4,0x10,0x00,0x00,0x01,0x00, 0x00,0xc5,0x10,0x00,0x00,0x01,0x00,0x00,0xc6,0x10,0x00,0x00,0x01,0x00,0x00,0xc7, 0x10,0x00,0x00,0x01,0x00,0x00,0xc8,0x10,0x00,0x00,0x01,0x00,0x00,0xc9,0x10,0x00, 0x00,0x01,0x00,0x00,0xca,0x10,0x00,0x00,0x01,0x00,0x00,0xcb,0x10,0x00,0x00,0x01, 0x00,0x00,0xcc,0x10,0x00,0x00,0x01,0x00,0x00,0xcd,0x10,0x00,0x00,0x01,0x00,0x00, 0xce,0x10,0x00,0x00,0x01,0x00,0x00,0xcf,0x10,0x00,0x00,0x01,0x00,0x00,0xd0,0x10, 0x00,0x00,0x01,0x00,0x00,0xd1,0x10,0x00,0x00,0x01,0x00,0x00,0xd2,0x10,0x00,0x00, 0x01,0x00,0x00,0xd3,0x10,0x00,0x00,0x01,0x00,0x00,0xd4,0x10,0x00,0x00,0x01,0x00, 0x00,0xd5,0x10,0x00,0x00,0x01,0x00,0x00,0xd6,0x10,0x00,0x00,0x01,0x00,0x00,0xd7, 0x10,0x00,0x00,0x01,0x00,0x00,0xd8,0x10,0x00,0x00,0x01,0x00,0x00,0xd9,0x10,0x00, 0x00,0x01,0x00,0x00,0xda,0x10,0x00,0x00,0x01,0x00,0x00,0xdb,0x10,0x00,0x00,0x01, 0x00,0x00,0xdc,0x10,0x00,0x00,0x01,0x00,0x00,0xdd,0x10,0x00,0x00,0x01,0x00,0x00, 0xde,0x10,0x00,0x00,0x01,0x00,0x00,0xdf,0x10,0x00,0x00,0x01,0x00,0x00,0xe0,0x10, 0x00,0x00,0x01,0x00,0x00,0xe1,0x10,0x00,0x00,0x01,0x00,0x00,0xe2,0x10,0x00,0x00, 0x01,0x00,0x00,0xe3,0x10,0x00,0x00,0x01,0x00,0x00,0xe4,0x10,0x00,0x00,0x01,0x00, 0x00,0xe5,0x10,0x00,0x00,0x01,0x00,0x00,0xe6,0x10,0x00,0x00,0x01,0x00,0x00,0xe7, 0x10,0x00,0x00,0x01,0x00,0x00,0xe8,0x10,0x00,0x00,0x01,0x00,0x00,0xe9,0x10,0x00, 0x00,0x01,0x00,0x00,0xea,0x10,0x00,0x00,0x01,0x00,0x00,0xeb,0x10,0x00,0x00,0x01, 0x00,0x00,0xec,0x10,0x00,0x00,0x01,0x00,0x00,0xed,0x10,0x00,0x00,0x01,0x00,0x00, 0xee,0x10,0x00,0x00,0x01,0x00,0x00,0xef,0x10,0x00,0x00,0x01,0x00,0x00,0xf0,0x10, 0x00,0x00,0x01,0x00,0x00,0xf2,0x00,0xf1,0x10,0x00,0x00,0x01,0x00,0xf2,0x10,0x00, 0x00,0x01,0x00,0xf3,0x10,0x00,0x00,0x00,0x00,0xf4,0x10,0x00,0x00,0x00,0x00,0xf5, 0x10,0x00,0x00,0x00,0x00,0xf6,0x10,0x00,0x00,0x00,0x00,0xf7,0x10,0x00,0x00,0x00, 0x00,0xf8,0x10,0x00,0x00,0x00,0x00,0xf9,0x10,0x00,0x00,0x00,0x00,0xfa,0x10,0x00, 0x00,0x00,0x00,0xfb,0x10,0x00,0x00,0x00,0x00,0xfc,0x10,0x00,0x00,0x00,0x00,0xfd, 0x10,0x00,0x00,0x00,0x00,0xfe,0x10,0x00,0x00,0x00,0x00,0xff,0x10,0x00,0x00,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0x00,0x02,0x11,0x00, 0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x00,0x00,0x04,0x11,0x00,0x00,0x00,0x00,0x05, 0x11,0x00,0x00,0x00,0x00,0x06,0x11,0x00,0x00,0x00,0x00,0x07,0x11,0x00,0x00,0x00, 0x00,0x08,0x11,0x00,0x00,0x00,0x00,0x09,0x11,0x00,0x00,0x00,0x00,0x0a,0x11,0x00, 0x00,0x00,0x00,0x0b,0x11,0x00,0x00,0x00,0x00,0x0c,0x11,0x00,0x00,0x00,0x00,0x0d, 0x11,0x00,0x00,0x00,0x00,0x0e,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x00,0x00,0x00, 0x00,0x10,0x11,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x12,0x11,0x00, 0x00,0x00,0x00,0x13,0x11,0x00,0x00,0x00,0x00,0x14,0x11,0x00,0x00,0x00,0x00,0x15, 0x11,0x00,0x00,0x00,0x00,0x16,0x11,0x00,0x00,0x00,0x00,0x17,0x11,0x00,0x00,0x00, 0x00,0x18,0x11,0x00,0x00,0x00,0x00,0x19,0x11,0x00,0x00,0x00,0x00,0x1a,0x11,0x00, 0x00,0x00,0x00,0x1b,0x11,0x00,0x00,0x00,0x00,0x1c,0x11,0x00,0x00,0x00,0x00,0x1d, 0x11,0x00,0x00,0x00,0x00,0x1e,0x11,0x00,0x00,0x00,0x00,0x1f,0x11,0x00,0x00,0x00, 0x00,0x20,0x11,0x00,0x00,0x00,0x00,0x21,0x11,0x00,0x00,0x00,0x00,0x22,0x11,0x00, 0x00,0x00,0x00,0x23,0x11,0x00,0x00,0x00,0x00,0x24,0x11,0x00,0x00,0x00,0x00,0x25, 0x11,0x00,0x00,0x00,0x00,0x26,0x11,0x00,0x00,0x00,0x00,0x27,0x11,0x00,0x00,0x00, 0x00,0x28,0x11,0x00,0x00,0x00,0x00,0x29,0x11,0x00,0x00,0x00,0x00,0x2a,0x11,0x00, 0x00,0x00,0x00,0x2b,0x11,0x00,0x00,0x00,0x00,0x2c,0x11,0x00,0x00,0x00,0x00,0x2d, 0x11,0x00,0x00,0x00,0x00,0x2e,0x11,0x00,0x00,0x00,0x00,0x2f,0x11,0x00,0x00,0x00, 0x00,0x30,0x11,0x00,0x00,0x00,0x00,0x31,0x11,0x00,0x00,0x00,0x00,0x32,0x11,0x00, 0x00,0x00,0x00,0x33,0x11,0x00,0x00,0x00,0x00,0x34,0x11,0x00,0x00,0x00,0x00,0x35, 0x11,0x00,0x00,0x00,0x00,0x36,0x11,0x00,0x00,0x00,0x00,0x37,0x11,0x00,0x00,0x00, 0x00,0x38,0x11,0x00,0x00,0x00,0x00,0x39,0x11,0x00,0x00,0x00,0x00,0x3a,0x11,0x00, 0x00,0x00,0x00,0x3b,0x11,0x00,0x00,0x00,0x00,0x3c,0x11,0x00,0x00,0x00,0x00,0x3d, 0x11,0x00,0x00,0x00,0x00,0x3e,0x11,0x00,0x00,0x00,0x00,0x3f,0x11,0x00,0x00,0x00, 0x00,0x40,0x11,0x00,0x00,0x00,0x00,0x41,0x11,0x00,0x00,0x00,0x00,0x42,0x11,0x00, 0x00,0x00,0x00,0x43,0x11,0x00,0x00,0x00,0x00,0x44,0x11,0x00,0x00,0x00,0x00,0x45, 0x11,0x00,0x00,0x00,0x00,0x46,0x11,0x00,0x00,0x00,0x00,0x47,0x11,0x00,0x00,0x00, 0x00,0x48,0x11,0x00,0x00,0x00,0x00,0x49,0x11,0x00,0x00,0x00,0x00,0x4a,0x11,0x00, 0x00,0x00,0x00,0x4b,0x11,0x00,0x00,0x00,0x00,0x4c,0x11,0x00,0x00,0x00,0x00,0x4d, 0x11,0x00,0x00,0x00,0x00,0x4e,0x11,0x00,0x00,0x00,0x00,0x4f,0x11,0x00,0x00,0x00, 0x00,0x50,0x11,0x00,0x00,0x00,0x00,0x51,0x11,0x00,0x00,0x00,0x00,0x52,0x11,0x00, 0x00,0x00,0x00,0x53,0x11,0x00,0x00,0x00,0x00,0x54,0x11,0x00,0x00,0x00,0x00,0x55, 0x11,0x00,0x00,0x00,0x00,0x56,0x11,0x00,0x00,0x00,0x00,0x57,0x11,0x00,0x00,0x00, 0x00,0x58,0x11,0x00,0x00,0x00,0x00,0x59,0x11,0x00,0x00,0x00,0x00,0x5a,0x11,0x00, 0x00,0x00,0x00,0x5b,0x11,0x00,0x00,0x00,0x00,0x5c,0x11,0x00,0x00,0x00,0x00,0x5d, 0x11,0x00,0x00,0x00,0x00,0x5e,0x11,0x00,0x00,0x00,0x00,0x5f,0x11,0x00,0x00,0x00, 0x00,0x60,0x11,0x00,0x00,0x00,0x00,0x61,0x11,0x00,0x00,0x00,0x00,0x62,0x11,0x00, 0x00,0x00,0x00,0x63,0x11,0x00,0x00,0x00,0x00,0x64,0x11,0x00,0x00,0x00,0x00,0x65, 0x11,0x00,0x00,0x00,0x00,0x66,0x11,0x00,0x00,0x00,0x00,0x67,0x11,0x00,0x00,0x00, 0x00,0x68,0x11,0x00,0x00,0x00,0x00,0x69,0x11,0x00,0x00,0x00,0x00,0x6a,0x11,0x00, 0x00,0x00,0x00,0x6b,0x11,0x00,0x00,0x00,0x00,0x6c,0x11,0x00,0x00,0x00,0x00,0x6d, 0x11,0x00,0x00,0x00,0x00,0x6e,0x11,0x00,0x00,0x00,0x00,0x6f,0x11,0x00,0x00,0x00, 0x00,0x70,0x11,0x00,0x00,0x00,0x00,0x71,0x11,0x00,0x00,0x00,0x00,0x72,0x11,0x00, 0x00,0x00,0x00,0x73,0x11,0x00,0x00,0x00,0x00,0x74,0x11,0x00,0x00,0x00,0x00,0x75, 0x11,0x00,0x00,0x00,0x00,0x76,0x11,0x00,0x00,0x00,0x00,0x77,0x11,0x00,0x00,0x00, 0x00,0x78,0x11,0x00,0x00,0x00,0x00,0x79,0x11,0x00,0x00,0x00,0x00,0x7a,0x11,0x00, 0x00,0x00,0x00,0x7b,0x11,0x00,0x00,0x00,0x00,0x7c,0x11,0x00,0x00,0x00,0x00,0x7d, 0x11,0x00,0x00,0x00,0x00,0x7e,0x11,0x00,0x00,0x00,0x00,0x7f,0x11,0x00,0x00,0x00, 0x00,0x80,0x11,0x00,0x00,0x00,0x00,0x81,0x11,0x00,0x00,0x00,0x00,0x82,0x11,0x00, 0x00,0x00,0x00,0x83,0x11,0x00,0x00,0x00,0x00,0x84,0x11,0x00,0x00,0x00,0x00,0x85, 0x11,0x00,0x00,0x00,0x00,0x86,0x11,0x00,0x00,0x00,0x00,0x87,0x11,0x00,0x00,0x00, 0x00,0x88,0x11,0x00,0x00,0x00,0x00,0x89,0x11,0x00,0x00,0x00,0x00,0x8a,0x11,0x00, 0x00,0x00,0x00,0x8b,0x11,0x00,0x00,0x00,0x00,0x8c,0x11,0x00,0x00,0x00,0x00,0x8d, 0x11,0x00,0x00,0x00,0x00,0x8e,0x11,0x00,0x00,0x00,0x00,0x8f,0x11,0x00,0x00,0x00, 0x00,0x90,0x11,0x00,0x00,0x00,0x00,0x91,0x11,0x00,0x00,0x00,0x00,0x92,0x11,0x00, 0x00,0x00,0x00,0x93,0x11,0x00,0x00,0x00,0x00,0x94,0x11,0x00,0x00,0x00,0x00,0x95, 0x11,0x00,0x00,0x00,0x00,0x96,0x11,0x00,0x00,0x00,0x00,0x97,0x11,0x00,0x00,0x00, 0x00,0x98,0x11,0x00,0x00,0x00,0x00,0x99,0x11,0x00,0x00,0x00,0x00,0x9a,0x11,0x00, 0x00,0x00,0x00,0x9b,0x11,0x00,0x00,0x00,0x00,0x9c,0x11,0x00,0x00,0x00,0x00,0x9d, 0x11,0x00,0x00,0x00,0x00,0x9e,0x11,0x00,0x00,0x00,0x00,0x9f,0x11,0x00,0x00,0x00, 0x00,0xa0,0x11,0x00,0x00,0x00,0x00,0xa1,0x11,0x00,0x00,0x00,0x00,0xa2,0x11,0x00, 0x00,0x00,0x00,0xa3,0x11,0x00,0x00,0x00,0x00,0xa4,0x11,0x00,0x00,0x00,0x00,0xa5, 0x11,0x00,0x00,0x00,0x00,0xa6,0x11,0x00,0x00,0x00,0x00,0xa7,0x11,0x00,0x00,0x00, 0x00,0xa8,0x11,0x00,0x00,0x00,0x00,0xa9,0x11,0x00,0x00,0x00,0x00,0xaa,0x11,0x00, 0x00,0x00,0x00,0xab,0x11,0x00,0x00,0x00,0x00,0xac,0x11,0x00,0x00,0x00,0x00,0xad, 0x11,0x00,0x00,0x00,0x00,0xae,0x11,0x00,0x00,0x00,0x00,0xaf,0x11,0x00,0x00,0x00, 0x00,0xb0,0x11,0x00,0x00,0x00,0x00,0xb1,0x11,0x00,0x00,0x00,0x00,0xb2,0x11,0x00, 0x00,0x00,0x00,0xb3,0x11,0x00,0x00,0x00,0x00,0xb4,0x11,0x00,0x00,0x00,0x00,0xb5, 0x11,0x00,0x00,0x00,0x00,0xb6,0x11,0x00,0x00,0x00,0x00,0xb7,0x11,0x00,0x00,0x00, 0x00,0xb8,0x11,0x00,0x00,0x00,0x00,0xb9,0x11,0x00,0x00,0x00,0x00,0xba,0x11,0x00, 0x00,0x00,0x00,0xbb,0x11,0x00,0x00,0x00,0x00,0xbc,0x11,0x00,0x00,0x00,0x00,0xbd, 0x11,0x00,0x00,0x00,0x00,0xbe,0x11,0x00,0x00,0x00,0x00,0xbf,0x11,0x00,0x00,0x00, 0x00,0xc0,0x11,0x00,0x00,0x00,0x00,0xc1,0x11,0x00,0x00,0x00,0x00,0xc2,0x11,0x00, 0x00,0x00,0x00,0xc3,0x11,0x00,0x00,0x00,0x00,0xc4,0x11,0x00,0x00,0x00,0x00,0xc5, 0x11,0x00,0x00,0x00,0x00,0xc6,0x11,0x00,0x00,0x00,0x00,0xc7,0x11,0x00,0x00,0x00, 0x00,0xc8,0x11,0x00,0x00,0x00,0x00,0xc9,0x11,0x00,0x00,0x00,0x00,0xca,0x11,0x00, 0x00,0x00,0x00,0xcb,0x11,0x00,0x00,0x00,0x00,0xcc,0x11,0x00,0x00,0x00,0x00,0xcd, 0x11,0x00,0x00,0x00,0x00,0xce,0x11,0x00,0x00,0x00,0x00,0xcf,0x11,0x00,0x00,0x00, 0x00,0xd0,0x11,0x00,0x00,0x00,0x00,0xd1,0x11,0x00,0x00,0x00,0x00,0xd2,0x11,0x00, 0x00,0x00,0x00,0xd3,0x11,0x00,0x00,0x00,0x00,0xd4,0x11,0x00,0x00,0x00,0x00,0xd5, 0x11,0x00,0x00,0x00,0x00,0xd6,0x11,0x00,0x00,0x00,0x00,0xd7,0x11,0x00,0x00,0x00, 0x00,0xd8,0x11,0x00,0x00,0x00,0x00,0xd9,0x11,0x00,0x00,0x00,0x00,0xda,0x11,0x00, 0x00,0x00,0x00,0xdb,0x11,0x00,0x00,0x00,0x00,0xdc,0x11,0x00,0x00,0x00,0x00,0xdd, 0x11,0x00,0x00,0x00,0x00,0xde,0x11,0x00,0x00,0x00,0x00,0xdf,0x11,0x00,0x00,0x00, 0x00,0xe0,0x11,0x00,0x00,0x00,0x00,0xe1,0x11,0x00,0x00,0x00,0x00,0xe2,0x11,0x00, 0x00,0x00,0x00,0x00,0x02,0xe3,0x11,0x00,0x00,0x01,0x00,0x00,0xe4,0x11,0x00,0x00, 0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04, 0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28, 0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00, 0x00,0x30,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24, 0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00,0x04,0x00, 0x00,0x26,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x00,0x27,0x00,0x00,0x00,0x44,0x00, 0x04,0x00,0x00,0x28,0x00,0x00,0x00,0x48,0x00,0x04,0x00,0x79,0x94,0x02,0x00,0x45, 0x69,0x01,0x00,0x03,0x00,0xe5,0x11,0x00,0x00,0x17,0x67,0x65,0x6e,0x78,0x5f,0x63, 0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x31,0x32,0x2e,0x61,0x73, 0x6d,0xe6,0x11,0x00,0x00,0x00,0xe7,0x11,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xf1,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xf2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0xe0,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x01, 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xf0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00, 0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xe8,0xff,0xff,0xff,0x24,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x14,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x04,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x02,0x00,0x00,0x05, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x2c,0x00,0x02, 0x02,0x03,0x00,0x00,0x05,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x10,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x04,0x00,0x00,0x05,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x05,0x00,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x2c,0x00,0x02,0x02, 0x06,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00, 0x00,0x32,0x00,0x01,0x80,0x3d,0x00,0x29,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x45,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x06,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x4a,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x07, 0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x32,0x00,0x06,0x00,0x35,0x00,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x05,0x00,0x31,0x02,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32, 0x00,0x03,0x00,0x03,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x05, 0x00,0x31,0x03,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x07,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x05,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x04,0x00,0x29,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x05,0x00,0x31,0x04,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x68,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x31,0x05,0x00,0x29,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x00,0x02,0x08,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x08,0x00,0x07,0x00,0x31,0x06,0x00,0x24,0x00, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x09,0x00,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x09, 0x80,0x06,0x00,0x31,0x07,0x00,0x2c,0x00,0x04,0x02,0x0a,0x00,0x00,0x4c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x0a,0x00,0x1f, 0x00,0x2c,0x00,0x00,0x02,0x0b,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x0b,0x00,0x13,0x00,0x2c,0x00,0x00,0x02, 0x0c,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x32,0x00,0x0c,0x80,0x3d,0x00,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x4a,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x4a, 0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x09,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x15,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x0a,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x16,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x0b,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x17,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05,0x00,0x08,0x00,0x29,0x03,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x02,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x04, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x04,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x06,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x08, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x08,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x0a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x0a,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x55, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x0a,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x0c, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x0c,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x0e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x0e,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x0e,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x10, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x10,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x12,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x12,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x12,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x14, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x14,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x16,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5c,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x16,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x5b, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x16,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x18, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x18,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x1a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x1a,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x5d, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00, 0x1a,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x0e,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x1c, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0f,0x0a,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0a,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x0a, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00,0x00,0x1c,0x00,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x0f,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0a,0x00, 0x00,0x1e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0e,0x0a,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x0f,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0a,0x00,0x00,0x1e,0x01,0x23, 0x01,0x32,0x00,0x00,0x00,0x09,0x00,0x31,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0x10, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x00,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x12,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x02,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x12,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x13, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x04,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x14,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x13,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x14,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x06,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x13,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x14,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x06,0x00,0x00, 0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x15, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x08,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x16,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x15,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x16,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x0a,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x15,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x0a,0x00,0x00, 0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x17, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x0c,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x18,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x17,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x18,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x0e,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x17,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x0e,0x00,0x00, 0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x19, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x10,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x19,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x1a,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x12,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x19,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1a,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x12,0x00,0x00, 0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x1b, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x14,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x1c,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1b,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x1c,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x16,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1b,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1c,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x16,0x00,0x00, 0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x1d, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x18,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x1e,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1d,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x1e,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x1a,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1d,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1e,0x0a,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1a,0x00,0x00, 0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x1c,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x11,0x0a, 0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x11,0x0a,0x00,0x00,0x1e,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x11,0x0a,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x11,0x0a,0x00,0x00,0x1e,0x01,0x23,0x01,0x31,0x09, 0x00,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x1f, 0x0a,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x1e,0x00,0x00,0x02,0x00,0x20,0x0a,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04, 0x02,0x0d,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x32,0x00,0x0d,0x80,0x0b,0x00,0x31,0x0a,0x00,0x29,0x00,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x03,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x72, 0x00,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x0f, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x17,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x72,0x00,0x00, 0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x07, 0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x22,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x6f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0xfe, 0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x02, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00, 0x6f,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x60,0x00,0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00, 0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0x01,0x01,0x00, 0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02, 0x0e,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x32,0x00,0x0e,0x80,0x0b,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0x0a,0x00,0x31,0x0b,0x00,0x2c,0x00,0x04,0x02,0x0f,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x0f,0x00,0x0f, 0x00,0x2c,0x00,0x04,0x02,0x10,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x10,0x80,0x0d,0x00,0x25,0x00,0x00,0x00, 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x74,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x25,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x26,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x11,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32, 0x00,0x11,0x00,0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x81,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2e,0x0a,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x2e,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x00,0x01,0x00, 0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x30,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2e,0x0a,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x31,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x2e,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x01, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x32,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x2e,0x0a,0x00, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0x3d,0x00,0x31, 0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x90,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x92,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x36,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x01, 0x01,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x99,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x39,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0a,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x3c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0a,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x02, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x3e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0a,0x00, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0x3d,0x00,0x31, 0x0d,0x00,0x32,0x00,0x07,0x00,0x0e,0x00,0x2b,0x00,0x02,0x12,0x00,0x05,0x00,0x01, 0x00,0x00,0x00,0x32,0x00,0x12,0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0x40,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x41,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xaa, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xac,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xad, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xb4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x03,0x01,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xb5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb5,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x48,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72, 0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xbd,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xbf,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x4e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x4f,0x0a,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x50,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x4f,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x00,0x01,0x00, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x51,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x4f,0x0a,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x4f,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x01, 0x01,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x53,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x4f,0x0a,0x00, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0xcd,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x54,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x4f,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x4f, 0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x03,0x01,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x56,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x4f,0x0a,0x00,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x0e,0x00,0x25,0x00,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd3,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x58,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x59,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xd9,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdd,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xde,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72, 0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe2,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe4,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x62,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x63,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x02, 0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xeb, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x64,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x65,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x66,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x0a,0x00,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x65,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60, 0x01,0x01,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x0a, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x69, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00, 0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x65,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x6b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x65,0x0a,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x0f,0x00,0x2c,0x00, 0x04,0x02,0x13,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0x13,0x00,0x11,0x00,0x25,0x00,0x00,0x00,0x00,0xf9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0x6d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfe, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x01,0x2c,0x00,0x00, 0x02,0x14,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x14,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72, 0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x73,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x0a,0x00,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x74,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0, 0x00,0x01,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x76,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x0a, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x77, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00, 0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x10,0x00,0x01,0x00,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x72,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x78,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x79,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x7a, 0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x7c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x7a,0x0a,0x00,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x11,0x00,0x2c,0x00,0x00, 0x02,0x15,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0x15,0x00,0x12,0x00,0x2c,0x00,0x00,0x02,0x16,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x16, 0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x7d, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x19,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7f,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x80,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x60,0x00,0x32,0x00,0x00, 0x00,0x3d,0x00,0x31,0x12,0x00,0x25,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x81,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x82,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1f, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x72,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x00, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x84,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0a,0x00,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x85,0x0a,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xe0,0x00,0x32, 0x00,0x00,0x00,0x3d,0x00,0x31,0x13,0x00,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x4a,0x00, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x14, 0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00, 0x4a,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x09,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x15, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x1d,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x0a,0x00,0x00, 0x02,0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x16, 0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x1e,0x00,0x00,0x02,0x00, 0x69,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x17,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x17, 0x80,0x15,0x00,0x31,0x14,0x00,0x29,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x25,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x06,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x46,0x01,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x01,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x46,0x01,0x00,0x00, 0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0x46,0x01,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25, 0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x1a,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x46,0x01, 0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x21,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x28,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x0f,0x00, 0x21,0x01,0x00,0x87,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x02,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x25, 0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60, 0xff,0x01,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x02,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00, 0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x02, 0x00,0x25,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00, 0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x25,0x01,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0x01,0x01, 0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x18,0x00,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x18,0x80, 0x15,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x14,0x00,0x31,0x15, 0x00,0x32,0x00,0x05,0x00,0x16,0x00,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x02, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x29,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x02,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x29, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x06, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x06,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x2b, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x0a, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2d,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x0a,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x2d, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x0e, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x0e,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x2f, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x12, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x12,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x31, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x16, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x33,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x16,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x33, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x34,0x01,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x1a, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x35,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x1a,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x88,0x0a,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x35, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x0a,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x8a,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x1e, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x0a,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x88,0x0a,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8a,0x0a, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0a,0x00,0x00,0x1e,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x89,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0a,0x00, 0x00,0x1c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x8a,0x0a,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x88,0x0a,0x00,0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x17, 0x00,0x31,0x16,0x00,0x29,0x04,0x00,0x00,0x00,0x8b,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8d, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x02,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x8b,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8d,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x8b,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8d,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x37,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8f, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x06,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8f,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x8e,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x04,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8f,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x90,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x91, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x0a,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x90,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x91,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x90,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x08,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x91,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x3b,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x93, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x0e,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x92,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x93,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x92,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x0c,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x93,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x0c,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x94,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x12,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x94,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x94,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x10,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x95,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x3f,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x96,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x97, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x16,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x96,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x97,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x96,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x14,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x97,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x14,0x00,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x41,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x98,0x0a,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x99, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x1a,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x98,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x99,0x0a,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x98,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x18,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x99,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x8c,0x0a,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x45, 0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x1e,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8c,0x0a, 0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x8c,0x0a,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x44,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8c,0x0a,0x00,0x00,0x1c,0x01, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8c,0x0a,0x00,0x00,0x1e,0x01,0x23,0x01,0x31,0x17,0x00,0x29,0x04,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x9a,0x0a,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x9b, 0x0a,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x19,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x19,0x00, 0x1b,0x00,0x2c,0x00,0x04,0x02,0x1a,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x1a,0x80,0x19,0x00,0x25,0x00,0x00, 0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x9d,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x4e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x50,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x1b, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0x1b,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xa2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa3,0x0a,0x00,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x53,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa4,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xa3,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa3,0x0a, 0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x57, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa6, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa3,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xa3,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x02,0x32,0x00,0x00,0x00, 0x3d,0x00,0x31,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00, 0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x5c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xa8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa9,0x0a,0x00,0x00,0x00,0x00,0x46,0x01, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaa,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0xa9,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xab,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa9,0x0a,0x00,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xa9,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xad,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa9,0x0a,0x00,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xae,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xa9,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0, 0x02,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x19,0x00,0x32,0x00,0x07,0x00,0x1a,0x00, 0x2b,0x00,0x02,0x1c,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x1c,0x80,0x3d, 0x00,0x25,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xb0,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x69, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x69,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46, 0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x71,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x73,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x74,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x46,0x01,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x0a,0x00,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x77,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xb8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xba,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x0a, 0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x7b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbb, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xb8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xbd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x0a,0x00,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbe,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xb8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x03,0x01,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xbf,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xb8,0x0a,0x00,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x1a,0x00, 0x25,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc1,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x87,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x46,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x8d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x90, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x90,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc8,0x0a, 0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x93, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc9, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x95,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xc8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xcb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc8,0x0a,0x00,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcc,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xc8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xcd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc8,0x0a,0x00,0x00,0x00, 0x00,0x46,0x01,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xce,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xc8,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x03, 0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x1b,0x00,0x2c,0x00,0x04,0x02,0x1d,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x1d,0x00,0x1d,0x00,0x25,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0xd0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa1,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x1e,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x1e, 0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd3,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd4, 0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaa, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xd6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0a,0x00,0x00,0x00,0x00,0x46,0x01, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0,0x01,0x32,0x00,0x00, 0x00,0x3d,0x00,0x31,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd9,0x0a,0x00,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xd9,0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xdb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd9,0x0a, 0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x3d,0x00, 0x31,0x1d,0x00,0x2c,0x00,0x00,0x02,0x1f,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x1f,0x00,0x1e,0x00,0x2c,0x00, 0x00,0x02,0x20,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x32,0x00,0x20,0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xdc,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xdd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0a,0x00, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x3d,0x00,0x31, 0x1e,0x00,0x25,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xe0,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb6,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x46,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xe2, 0x0a,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xe3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xe2,0x0a,0x00,0x00,0x00,0x00,0x46,0x01, 0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x1f,0x00,0x2c,0x00,0x00, 0x02,0x21,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x32,0x00,0x21,0x00,0x29,0x00,0x2c,0x00,0x00,0x02,0x22,0x00,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x22, 0x80,0x3d,0x00,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x4a,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x0c,0x00, 0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xcc,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x4a, 0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xcc,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x23,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x23,0x80,0x21,0x00,0x31,0x20, 0x00,0x29,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x08, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x03,0x00,0x02, 0x00,0xcc,0x01,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x10,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xcc,0x01,0x00, 0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x06, 0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xba,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x1c,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01, 0x03,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0xe4,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xfe, 0x01,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00, 0xba,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00, 0xe0,0xff,0x01,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x03,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xba,0x01,0x00,0x00, 0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x00,0x01,0x00, 0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03, 0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x06,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xba,0x01, 0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x04,0x02,0x24,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x24,0x80,0x21,0x00,0x29,0x00,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x20,0x00,0x31,0x21,0x00,0x32,0x00,0x05,0x00, 0x22,0x00,0x29,0x03,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xe5,0x0a,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x01,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00, 0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x0a,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe, 0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x04,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xe5,0x0a,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xe5,0x0a,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x01,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00, 0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x0a,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x0c,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a, 0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xe5,0x0a,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xe5,0x0a,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x01,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00, 0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x0a,0x00,0x00,0x10,0x00,0x00, 0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2, 0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x14,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a, 0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xe5,0x0a,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xe5,0x0a,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x01,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00, 0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x0a,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe6, 0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe5,0x0a,0x00,0x00,0x1c,0x02,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xe6,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe5,0x0a, 0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe6,0x0a,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xe5,0x0a,0x00,0x00,0x1c,0x01,0x23,0x01,0x32,0x00,0x00,0x00, 0x23,0x00,0x31,0x22,0x00,0x29,0x04,0x00,0x00,0x00,0xe7,0x0a,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xe7,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xe7,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8, 0x0a,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xe9,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x04, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe9,0x0a,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xe8,0x0a,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe9,0x0a, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8,0x0a,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc5,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x0a,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xea,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x08,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xea,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8, 0x0a,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xeb,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x0c, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x0a,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xe8,0x0a,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xeb,0x0a, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8,0x0a,0x00,0x00,0x0c,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xc7,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x0a,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xec,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x10,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xec,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8, 0x0a,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xed,0x0a,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x14, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xed,0x0a,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xe8,0x0a,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xed,0x0a, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8,0x0a,0x00,0x00,0x14,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xc9,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xee,0x0a,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xee,0x0a,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x18,0x00,0x24, 0x01,0x29,0x05,0x00,0x00,0x00,0xee,0x0a,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8, 0x0a,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe8,0x0a,0x00,0x00,0x1c, 0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0xe8,0x0a,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xcb,0x01, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe8,0x0a,0x00,0x00,0x1c,0x01,0x23,0x01,0x31, 0x23,0x00,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00, 0xef,0x0a,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x25,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x25, 0x00,0x26,0x00,0x2c,0x00,0x04,0x02,0x26,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x26,0x80,0x24,0x00,0x24,0x03, 0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x0a,0x00,0x00, 0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xce,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xf0,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xf2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x0a, 0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xd2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf3, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xf0,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02, 0x27,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x32,0x00,0x27,0x80,0x3d,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf5,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xf0,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80,0x02, 0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x24,0x00,0x32,0x00,0x07,0x00,0x25,0x00,0x2b, 0x00,0x02,0x28,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x28,0x80,0x3d,0x00, 0x24,0x03,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x0a, 0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xda,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xf6,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xf9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x0a,0x00,0x00,0x00,0x00,0xcc, 0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfa,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xf6,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xfb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x0a,0x00,0x00,0x00, 0x00,0xcc,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xf6,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xfd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x0a,0x00, 0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31, 0x25,0x00,0x24,0x03,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xfe,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xff,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x0a,0x00,0x00,0x00,0x00,0xcc, 0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x00,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xfe,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x01,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x0a,0x00,0x00,0x00, 0x00,0xcc,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x02,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xfe,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x03,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x0a,0x00, 0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x0a,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x26,0x00,0x2c,0x00,0x04,0x02,0x29, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x29,0x00,0x27,0x00,0x24,0x03,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x0b,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x06,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x0b,0x00, 0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x07,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x0b,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x01,0x2c,0x00,0x00,0x02,0x2a,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x2a,0x00,0x3d,0x00,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x08,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x0b,0x00,0x00,0x00,0x00, 0xcc,0x01,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x27,0x00,0x2c, 0x00,0x00,0x02,0x2b,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x32,0x00,0x2b,0x00,0x28,0x00,0x2c,0x00,0x00,0x02,0x2c,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32, 0x00,0x2c,0x80,0x3d,0x00,0x24,0x03,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x09,0x0b,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x3d,0x00,0x31,0x28,0x00,0x24,0x03,0x00,0x00,0x00,0xf8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x0a,0x0b,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0a, 0x0b,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00,0x3d, 0x00,0x31,0x29,0x00,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x4a,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x0c,0x02,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x4a,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x0d, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x0c,0x02,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x15,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x2d,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x2d,0x80,0x2b,0x00,0x31, 0x2a,0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0c,0x02,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfa,0x01,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x05,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x0c,0x02,0x00,0x00, 0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x0c,0x02,0x00,0x00,0x0d,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfa, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x11,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x0c,0x02, 0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x19,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xfa,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x1d,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x21,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x04,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x0e,0x00,0x21,0x01,0x00,0x0c, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x04,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0xfa,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xfa,0x01,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x04,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xfa, 0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x2e,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x2e,0x80,0x2b,0x00,0x29,0x00, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x2a,0x00,0x31,0x2b,0x00,0x32,0x00,0x05, 0x00,0x2c,0x00,0x29,0x03,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0b,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xfd,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00, 0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d, 0x0b,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfe,0x01,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x0d,0x0b,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0b,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xff,0x01, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x08,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00, 0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x0c,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d, 0x0b,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x0d,0x0b,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0b,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x01,0x02, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x10,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00, 0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x10,0x00, 0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x14,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d, 0x0b,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x02,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x0d,0x0b,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x0d,0x0b,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x03,0x02, 0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x18,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00, 0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x0e,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0b,0x00,0x00,0x1c,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d, 0x0b,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0e,0x0b,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x0d,0x0b,0x00,0x00,0x1c,0x01,0x23,0x01,0x32,0x00,0x00, 0x00,0x2d,0x00,0x31,0x2c,0x00,0x29,0x04,0x00,0x00,0x00,0x0f,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x0f,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0f,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x10,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x11,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x11,0x0b,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x10,0x0b,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x11, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x10,0x0b,0x00,0x00,0x04,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x05,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x12,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x08,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x10,0x0b,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00, 0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x13,0x0b,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x10,0x0b,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x13, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x10,0x0b,0x00,0x00,0x0c,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x07,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x14,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x14,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x10,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x14,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x10,0x0b,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x15,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00, 0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x15,0x0b,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x10,0x0b,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x15, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x10,0x0b,0x00,0x00,0x14,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x09,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x16,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x10,0x0b,0x00,0x00,0x18,0x00, 0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x16,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x10,0x0b,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x10,0x0b,0x00,0x00, 0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x10,0x0b,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0b, 0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x10,0x0b,0x00,0x00,0x1c,0x01,0x23,0x01, 0x31,0x2d,0x00,0x29,0x04,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x17,0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x2f,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00, 0x2f,0x00,0x31,0x00,0x2c,0x00,0x04,0x02,0x30,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x30,0x80,0x2f,0x00,0x25, 0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x19,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x10,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x0c,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x16, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x02,0x2c,0x00,0x00, 0x02,0x31,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00, 0x00,0x00,0x32,0x00,0x31,0x00,0x2e,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x1e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b, 0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x19, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x20, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x1f,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00, 0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x22,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x02,0x32,0x00, 0x00,0x00,0x3d,0x00,0x31,0x2e,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x24,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0b,0x00,0x00,0x00,0x00, 0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x26,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x27,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0b,0x00,0x00, 0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x28,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0, 0x01,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0b, 0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2a, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x2f,0x00,0x32,0x00,0x07,0x00, 0x30,0x00,0x2b,0x00,0x02,0x32,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x32, 0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x2c, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x30, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x31,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x0c,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x30,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00, 0x02,0x01,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x37,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x39,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3a, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x0b, 0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x3d, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x35, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x36,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x34,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00, 0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x37,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x0b,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x34,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x02,0x01,0x00, 0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x39,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x0b,0x00,0x00,0x00, 0x00,0x0c,0x02,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3a,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x34,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x03, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x3b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x0b,0x00, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31, 0x30,0x00,0x25,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x3d,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x0c,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x41,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x55, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x56,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x44,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00, 0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x45,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x0b,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x44,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x01,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x47,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x0b,0x00,0x00,0x00, 0x00,0x0c,0x02,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x48,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x44,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x02, 0x01,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x49,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x0b,0x00, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x63,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4a,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00, 0x20,0x03,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x31,0x00,0x2c,0x00,0x04,0x02,0x33, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x33,0x00,0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0x4c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x67, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x34,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x34,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x4f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x50,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02, 0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x51,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x50,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0,0x00,0x01,0x00,0x00, 0x00,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x52,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x50,0x0b,0x00,0x00,0x00,0x00, 0x0c,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x53,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x50,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0xa0,0x01,0x32, 0x00,0x00,0x00,0x3d,0x00,0x31,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x54,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0b, 0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x57,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x55,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00, 0x3d,0x00,0x31,0x33,0x00,0x2c,0x00,0x00,0x02,0x35,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x35,0x00,0x34,0x00, 0x2c,0x00,0x00,0x02,0x36,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x36,0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00, 0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x58,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0c, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x5a, 0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x3d, 0x00,0x31,0x34,0x00,0x25,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x5c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5d,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x5e,0x0b,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x5f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x5e,0x0b,0x00,0x00,0x00,0x00, 0x0c,0x02,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x35,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x69,0x05,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x68,0x05,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x9e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4a,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x02, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x02,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x02, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x02,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05,0x00,0x36,0x00,0x29, 0x03,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x60,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x60,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x80,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x60,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x60, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x60,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x60,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x60,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x60,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x61,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x61,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x82,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x61,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x61, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x61,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x61,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x61,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x61,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x62,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x62,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x84,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x62,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x62, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x84,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x62,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x62,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x62,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x62,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x63,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x63,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x86,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x63,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x63, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x86,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x63,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x63,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x63,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x63,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x64,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x64,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x88,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x64,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x64, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x88,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x64,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x64,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x64,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x64,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x65,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x65,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x8a,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x65,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x65, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8a,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x65,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x65,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x65,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x65,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x66,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x66,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x8c,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x66,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x66, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8c,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x66,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x66,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x66,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x66,0x0b, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x67,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x68,0x0b,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x0b,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x68,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x67,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x68,0x0b,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x68, 0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x67,0x0b,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x68,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x69,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x68,0x0b,0x00,0x00,0x02, 0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x37,0x00,0x31,0x36,0x00,0x29,0x04,0x00,0x00, 0x00,0x6a,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6b,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6c,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x6b,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6a,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x6b,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x6c,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6b,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x6a,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x6b,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6c, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6b,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x6d,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6e,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x6e,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x6e,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x6f,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6e,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x6e,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6f, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6e,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x70,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x71,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x71,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x71,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x71,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x70,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x71,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x72, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x71,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x73,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x74,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x74,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x74,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x75,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x74,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x73,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x74,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x75, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x74,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x76,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x77,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x77,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x77,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x78,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x77,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x76,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x77,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x78, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x77,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x79,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x7a,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x7a,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x7a,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x7b,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x7a,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x79,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x7a,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x7b, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x7a,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x7c,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x7d,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x7d,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x7d,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x7e,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x7d,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7c,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x7d,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x7e, 0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x7d,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x7f,0x0b,0x00,0x00,0x00,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x7f,0x0b,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9c,0x02,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x7f,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x7f,0x0b,0x00,0x00, 0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x7f,0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x9d, 0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x7f,0x0b,0x00,0x00,0x02,0x01,0x23,0x01, 0x31,0x37,0x00,0x29,0x04,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x80,0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa5,0x02, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x81,0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x2c, 0x00,0x04,0x02,0x37,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x32,0x00,0x37,0x00,0x3a,0x00,0x2c,0x00,0x04,0x02,0x38,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x38,0x80,0x38,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x82,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9e,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xa8,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x9f,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xaa,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xa0,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xab,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xac,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xa1,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x86,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa2,0x02,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x39,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x39,0x80,0x3d,0x00,0x01,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xaf,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0xa3,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x3d, 0x00,0x31,0x38,0x00,0x32,0x00,0x07,0x00,0x39,0x00,0x2b,0x00,0x02,0x3a,0x00,0x05, 0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x3a,0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00, 0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x87,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9e, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x88,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9f,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xb6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0xa1,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xb8,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xa2,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb9,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xba,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xa3,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa5,0x02,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x39,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x03,0x07,0x00,0x8e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9e,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x9f,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc2, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0xa1,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc5, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0xa2,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x93,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa3,0x02, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x02,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x3a,0x00,0x2c,0x00,0x04,0x02,0x3b,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x3b,0x00,0x3b,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x94,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9e,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xcc,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x9f,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xce,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xce,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xa0,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x3c,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x3c,0x00,0x3d,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa1,0x02,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x3d,0x00,0x31,0x3b,0x00,0x2c,0x00,0x00,0x02,0x3d,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32, 0x00,0x3d,0x00,0x3c,0x00,0x2c,0x00,0x00,0x02,0x3e,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x3e,0x80,0x3d,0x00, 0x25,0x00,0x00,0x00,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x97,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x9e,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x3d,0x00, 0x31,0x3c,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x98, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9e,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd2,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x9f,0x02,0x00,0x00,0x00,0x00,0x31,0x3d,0x00,0x29,0x00,0x00, 0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xd4,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x2c,0x00,0x04,0x02,0x3f,0x00,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x3f,0x80,0x79,0x00,0x01, 0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00, 0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x06,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xd8,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x40,0x00,0x00,0xd3,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x06,0x00, 0x71,0x00,0x29,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x3e,0x00,0x29,0x00,0x00,0x00,0x00, 0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x41,0x00,0x31,0x3e,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xda,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x00,0x3f, 0x00,0x29,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x41,0x00,0x31,0x3f,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x9a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x05,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x02,0x00,0x40,0x00,0x29,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0x41,0x00,0x31,0x40,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x0a,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x05, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x41,0x00, 0x29,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02, 0x41,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00, 0x00,0x32,0x00,0x41,0x00,0x43,0x00,0x31,0x42,0x00,0x24,0x00,0x00,0x00,0x00,0xdd, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0xde,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xdc,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x2c,0x00,0x00,0x02,0x42,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x42,0x80,0x42,0x00,0x31, 0x43,0x00,0x2c,0x00,0x04,0x02,0x43,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x43,0x00,0x5b,0x00,0x2c,0x00,0x00, 0x02,0x44,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00, 0x00,0x00,0x32,0x00,0x44,0x00,0x4f,0x00,0x2c,0x00,0x00,0x02,0x45,0x00,0x00,0xda, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x45, 0x80,0x79,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xd8,0x02,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0c,0x00, 0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xd8, 0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0f,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x1b,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x07, 0x00,0x22,0x01,0x32,0x00,0x05,0x00,0x44,0x00,0x29,0x03,0x00,0x00,0x00,0xdf,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xe0,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x02,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe0,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x04,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xe2,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x06,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe2,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xe1,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe3,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x08,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x0a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xe4,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x0a,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe4,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xe3,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x0a,0x00,0x00,0x02, 0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe5,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x0c,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x0e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xe6,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x0e,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe6,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x0e,0x00,0x00,0x02, 0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe7,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x10,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x12,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xe8,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x12,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xe8,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xe7,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x12,0x00,0x00,0x02, 0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x14,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x16,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xea,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x16,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xe9,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x16,0x00,0x00,0x02, 0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x02, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x18,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x1a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0xec,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x1a,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x9d,0x0b,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xeb,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x1a,0x00,0x00,0x02, 0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x0b, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x1c,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x9f,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0b,0x00, 0x00,0x1e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x0b,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x9f,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0b,0x00,0x00,0x1e,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d, 0x0b,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x9f,0x0b,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x9d,0x0b,0x00,0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00, 0x00,0x45,0x00,0x31,0x44,0x00,0x29,0x04,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xa2,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x02,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa2,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xee,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa3,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xa4,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x06,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa3,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa3,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa4,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xf0,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa5,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xa6,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x0a,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa5,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa5,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa6,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0xf2,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa7,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xa8,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x0e,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa7,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa8,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa7,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0xf4,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xaa,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x12,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xaa,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xaa,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0xf6,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x16,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xac,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0xf8,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xae,0x0b,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x1a,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xae,0x0b,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xae,0x0b,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0xfa,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x1e,0x02, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0xa1,0x0b,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfc,0x02,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa1,0x0b,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa1,0x0b,0x00,0x00, 0x1c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xa1,0x0b,0x00,0x00,0x1e,0x01,0x23,0x01,0x31,0x45,0x00,0x29,0x04,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xaf,0x0b,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x1e,0x00,0x00,0x02, 0x00,0xb0,0x0b,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x46,0x00,0x00, 0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x46,0x80,0x47,0x00,0x31,0x46,0x00,0x29,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x07, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x00,0x03,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x02, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x0f,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x03,0x00, 0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xfd,0x02,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x1b,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x00, 0x03,0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x10, 0x00,0x21,0x01,0x00,0xb2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x06,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0xfd,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xfd,0x02,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xfd,0x02, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x47,0x00,0x00,0xd9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x47, 0x80,0x47,0x00,0x29,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x46,0x00,0x31, 0x47,0x00,0x2c,0x00,0x04,0x02,0x48,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x48,0x00,0x4b,0x00,0x2c,0x00,0x04, 0x02,0x49,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x49,0x80,0x49,0x00,0x25,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0xb5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x06,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x08,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x09,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x03,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x4a,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x4a,0x00,0x48, 0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0b,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0d, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0d,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x14,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbd,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60, 0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xbf,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x0b, 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x17, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x18,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc0, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x19,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x1b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xc2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x48,0x00,0x01,0x00, 0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1d,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc4,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x01,0x01, 0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x24,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00, 0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x26,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x26,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x27,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x03,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0, 0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xcb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x2e, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcc, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x30,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xce,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x49,0x00,0x32,0x00, 0x40,0x00,0x4a,0x00,0x2b,0x00,0x02,0x4b,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x4b,0x80,0x79,0x00,0x25,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x36,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x38,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x39,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd4,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x40, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x42,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x43,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x47,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x49,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00, 0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4b, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x4c,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x03,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x03,0x01, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x52,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xde,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xdf,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60, 0x00,0x01,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0b, 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x55, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x56,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x57,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xdf,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00, 0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x5a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0b,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe4,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xdf,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x02,0x01,0x00, 0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0b,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x60,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xdf,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x03, 0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x4a,0x00,0x25,0x00,0x00,0x00,0x00,0x60,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0xe8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x63,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x63,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x65, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x67,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x68, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x69,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xed,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xee,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6e,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x6f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x70, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x70,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x72,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x78,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x79,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf4,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf5, 0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0x7c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7d, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xf6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x0b,0x00,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xf5,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x00, 0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xf8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x0b,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf9,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xf5,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x02,0x01, 0x00,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xfa,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x0b,0x00,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfb,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xf5,0x0b,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60, 0x03,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x4b,0x00,0x2c,0x00,0x04,0x02,0x4c,0x00, 0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x4c,0x00,0x4d,0x00,0x25,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xfd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x8b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8c,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x4d,0x00,0x00, 0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x4d,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8f,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x90,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x91,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x96, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x03,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x01,0x00,0x00, 0x00,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x06,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x04,0x0c,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x07,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x01,0x32, 0x00,0x00,0x00,0x79,0x00,0x31,0x4c,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9f,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa0,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x09,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x0a,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x0a,0x0c,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0c,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x0a,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x01, 0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x4d,0x00,0x2c,0x00,0x00,0x02,0x4e,0x00,0x00, 0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00, 0x4e,0x00,0x4e,0x00,0x2c,0x00,0x00,0x02,0x4f,0x00,0x00,0xd7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x4f,0x80,0x79,0x00,0x25, 0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xa5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x0d,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa6,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x0f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0c,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31, 0x4e,0x00,0x25,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x12,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xac,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xad,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xad,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xb1,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x14,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x15, 0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x79, 0x00,0x31,0x4f,0x00,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xd8,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0xd8,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0d, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x15,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x69,0x05, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0e, 0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x50,0x00,0x00,0xd9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x50,0x80,0x51,0x00,0x31, 0x50,0x00,0x29,0x00,0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd4,0x03,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb3,0x03,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0xd4,0x03,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xd4,0x03,0x00,0x00, 0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0xd4,0x03,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb3, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd4,0x03,0x00,0x00,0x12,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xd4,0x03, 0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0xd4,0x03,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xb3,0x03,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xd4,0x03,0x00,0x00,0x1e,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x07,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0x17, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x07,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0xb3,0x03,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xb3,0x03,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x07,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xb3, 0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb5,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x51,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x51,0x80,0x51,0x00,0x29,0x00, 0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x50,0x00,0x31,0x51,0x00,0x32,0x00,0x05, 0x00,0x52,0x00,0x29,0x03,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb7,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x06,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x04,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xb9,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x0a,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x08,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x08,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0xbb,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x0e,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x0c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x0c,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0xbd,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x12,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x10,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x10,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0xbf,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x16,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x14,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x14,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0xc1,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x03, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x1a,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x18,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x18,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x18,0x0c,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x18,0x0c,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x19,0x0c,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x18,0x0c,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x1a,0x0c, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x1e,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x19,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x18,0x0c,0x00, 0x00,0x1c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x1a,0x0c,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x18,0x0c,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x19,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18,0x0c,0x00,0x00,0x1c,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x1a,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x18, 0x0c,0x00,0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x53,0x00,0x31,0x52,0x00, 0x29,0x04,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x1b,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1b,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x1e,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x1e,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x04,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x1e,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x21,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x20,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x08,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x21,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x21,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x0a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x22,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x22,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x0c,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x22,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x23,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x0e,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x0c,0x00,0x00, 0x02,0x00,0xca,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x24,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x24,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x10,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x24,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x25,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x12,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x10,0x00,0x00, 0x02,0x00,0xcc,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0xcd,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x26,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x26,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x14,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x27,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x16,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x28,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x28,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x18,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x28,0x0c,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x1a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1c,0x0c, 0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xd2,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x1c,0x0c,0x00,0x00,0x1c,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x1c,0x0c,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xd2,0x03,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x1c,0x0c,0x00,0x00, 0x1e,0x01,0x23,0x01,0x31,0x53,0x00,0x29,0x04,0x00,0x00,0x00,0xd4,0x03,0x00,0x00, 0x1c,0x00,0x00,0x02,0x00,0x2a,0x0c,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x2b,0x0c,0x00,0x00,0x00, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x52,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x52,0x00,0x57,0x00,0x2c,0x00, 0x04,0x02,0x53,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0x53,0x80,0x55,0x00,0x25,0x00,0x00,0x00,0x00,0xd5,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0x2d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xd8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xda, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdc,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xdd, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xde,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x03,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x54,0x00,0x00,0xd7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x54,0x00, 0x54,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xe0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x32,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x34,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x33,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x35,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x0c,0x00,0x00,0x00,0x00, 0xd4,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xe5,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x36,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x33,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x37,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x0c,0x00,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x02,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x54, 0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xe8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe9, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x3a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0c,0x00, 0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xed,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00, 0xf1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf2, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x3d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03, 0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x02,0x32,0x00,0x00, 0x00,0x79,0x00,0x31,0x55,0x00,0x32,0x00,0x40,0x00,0x56,0x00,0x2b,0x00,0x02,0x55, 0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x55,0x80,0x79,0x00,0x25,0x00,0x00, 0x00,0x00,0xf4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf5,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x40,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x41,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xf7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xfb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xfd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfd,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xff,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4, 0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00, 0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x04, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x47,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x4a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00, 0xd4,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x4c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x0d,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0e,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4d,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0, 0x02,0x01,0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x4e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c, 0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x11,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x48,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x56,0x00,0x25,0x00,0x00,0x00, 0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x51,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xd4,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x52,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x53,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x19, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1b,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x1c, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1d,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x1e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x57,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x0c,0x00,0x00,0x00,0x00, 0xd4,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x22,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x58,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x5a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x0c,0x00,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x25,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x58,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x5c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x0c, 0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2a,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5d, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00, 0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x58,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00, 0x79,0x00,0x31,0x57,0x00,0x2c,0x00,0x04,0x02,0x56,0x00,0x00,0xd7,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x56,0x00,0x59,0x00, 0x25,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x60,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x31,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x62,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03, 0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x57,0x00,0x00,0xd7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x57,0x00,0x58,0x00,0x01, 0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x32,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x33,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x64,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x36,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x65,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0c,0x00,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x64,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x67,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0c,0x00, 0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x01,0x32,0x00,0x00,0x00,0x79,0x00,0x31, 0x58,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x3b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x68,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6a,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x69,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x3e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x0c,0x00,0x00,0x00,0x00, 0xd4,0x03,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x59,0x00,0x2c, 0x00,0x00,0x02,0x58,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x32,0x00,0x58,0x00,0x5a,0x00,0x2c,0x00,0x00,0x02,0x59,0x00, 0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32, 0x00,0x59,0x80,0x79,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x6c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x41,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x6d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x0c,0x00,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x5a,0x00,0x25,0x00, 0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x43, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x70,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xd4,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x44,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xd4, 0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x45,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x71,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x0c,0x00,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x72,0x0c,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0xc0,0x00, 0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x5b,0x00,0x2c,0x00,0x00,0x02,0x5a,0x00,0x00, 0xda,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00, 0x5a,0x00,0x65,0x00,0x2c,0x00,0x00,0x02,0x5b,0x00,0x00,0xda,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x5b,0x80,0x79,0x00,0x29, 0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xd8, 0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5a,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0xd8,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5a,0x04, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x2c, 0x00,0x04,0x02,0x5c,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0x5c,0x80,0x5d,0x00,0x31,0x5c,0x00,0x29,0x00,0x00, 0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x5a,0x04,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x5a,0x04,0x00,0x00,0x08,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x5a,0x04,0x00, 0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x5a,0x04,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x48,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x5a,0x04,0x00,0x00,0x14,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x5a, 0x04,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00, 0x00,0x07,0x00,0x02,0x00,0x5a,0x04,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x49,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x08,0x00,0x00,0x00, 0x00,0x5a,0x04,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x74,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00, 0x48,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00, 0xe0,0xfe,0x01,0x00,0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x08,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x48,0x04,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0xff,0x01,0x00, 0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08, 0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x48,0x04, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0x01, 0x01,0x00,0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x08,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0x5d,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0x5d,0x80,0x5d,0x00,0x29,0x00,0x00,0x00,0x00,0xd9,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0x5c,0x00,0x31,0x5d,0x00,0x32,0x00,0x05,0x00,0x5e,0x00,0x29,0x03, 0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x75,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4b, 0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x75,0x0c,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x4c,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x04,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x75,0x0c,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x4c,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00, 0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x75,0x0c,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4d, 0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x75,0x0c,0x00,0x00,0x08,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x4d,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x4e,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x0c,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x75,0x0c,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00, 0x00,0x0c,0x00,0x00,0x02,0x00,0x4e,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00, 0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x75,0x0c,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4f, 0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x75,0x0c,0x00,0x00,0x10,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x4f,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x50,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x14,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x75,0x0c,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00, 0x00,0x14,0x00,0x00,0x02,0x00,0x50,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00, 0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x75,0x0c,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x51, 0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x75,0x0c,0x00,0x00,0x18,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x75,0x0c,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x51,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x76,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x75,0x0c,0x00,0x00,0x1c,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x75,0x0c,0x00,0x00,0x1c,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x5f,0x00,0x31,0x5e, 0x00,0x29,0x04,0x00,0x00,0x00,0x77,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78, 0x0c,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x0c,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x77,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x0c, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x04,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x79,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00, 0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x79,0x0c,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78, 0x0c,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x0c,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x7a,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x08, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x0c, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x0c,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x7b,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00, 0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7b,0x0c,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78, 0x0c,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x0c,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x7c,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x10, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x0c, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x14,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x7d,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00, 0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x7d,0x0c,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78, 0x0c,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x0c,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x7e,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x18, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0x58,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x04, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x78,0x0c,0x00,0x00,0x1c,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x78,0x0c,0x00, 0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x78,0x0c,0x00,0x00,0x1c,0x01,0x23,0x01,0x31,0x5f,0x00,0x29,0x04, 0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x7f,0x0c,0x00,0x00, 0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x5e,0x00,0x00,0xd7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x5e,0x00,0x62,0x00,0x2c, 0x00,0x04,0x02,0x5f,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0x5f,0x80,0x60,0x00,0x24,0x03,0x00,0x00,0x00,0x5b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x80,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x81,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x80,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x5e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x82,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x80,0x0c,0x00,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x83,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x80,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x84,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x80,0x0c,0x00,0x00, 0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x60,0x00,0x00,0xd7, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x60, 0x80,0x79,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x85,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x80,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00, 0x79,0x00,0x31,0x60,0x00,0x32,0x00,0x40,0x00,0x61,0x00,0x2b,0x00,0x02,0x61,0x00, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x61,0x80,0x79,0x00,0x24,0x03,0x00,0x00, 0x00,0x65,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x0c,0x00,0x00,0x00,0x00, 0x5a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x87,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x86,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x88,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x0c,0x00,0x00, 0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x6a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x89,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x8a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x0c, 0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x6e, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8b, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x86,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x72,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x8d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x86,0x0c,0x00,0x00,0x00,0x00,0x5a, 0x04,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x61,0x00,0x24,0x03, 0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x8e,0x0c,0x00,0x00, 0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x75,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x8e,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x90,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x8e,0x0c, 0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x78, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x79,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x91, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x8e,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x92,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x8e,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00, 0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x7d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x93,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x8e,0x0c,0x00,0x00,0x00,0x00,0x5a, 0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x94,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x8e,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x03,0x32,0x00, 0x00,0x00,0x79,0x00,0x31,0x62,0x00,0x2c,0x00,0x04,0x02,0x62,0x00,0x00,0xd7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x62,0x00, 0x63,0x00,0x24,0x03,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x95,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x81,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x96,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x0c,0x00,0x00,0x00,0x00,0x5a, 0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x82,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x82,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x95,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x01,0x2c,0x00, 0x00,0x02,0x63,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0x63,0x00,0x79,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x98,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x95,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00, 0x80,0x01,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x63,0x00,0x2c,0x00,0x00,0x02,0x64, 0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x32,0x00,0x64,0x00,0x64,0x00,0x2c,0x00,0x00,0x02,0x65,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x65,0x80,0x79, 0x00,0x24,0x03,0x00,0x00,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x99, 0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x79, 0x00,0x31,0x64,0x00,0x24,0x03,0x00,0x00,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x99,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x9a,0x0c,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x87,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x9b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x0c,0x00,0x00,0x00, 0x00,0x5a,0x04,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x65,0x00, 0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x00, 0xd8,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00, 0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0xd8,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a, 0x04,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x05, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x0d,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00, 0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x19,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a, 0x04,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01, 0x2c,0x00,0x04,0x02,0x66,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x66,0x80,0x67,0x00,0x31,0x66,0x00,0x29,0x00, 0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x04,0x00,0x00, 0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x9a,0x04,0x00,0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88, 0x04,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x9a,0x04,0x00,0x00,0x09,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x9a,0x04, 0x00,0x00,0x0d,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x9a,0x04,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x88,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x9a,0x04,0x00,0x00,0x15,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x00, 0x9a,0x04,0x00,0x00,0x19,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x88,0x04,0x00, 0x00,0x00,0x07,0x00,0x02,0x00,0x9a,0x04,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x89,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x09,0x00,0x00, 0x00,0x00,0x9a,0x04,0x00,0x00,0x0e,0x00,0x21,0x01,0x00,0x9c,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0xfe,0x01,0x00,0x02, 0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00, 0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x88,0x04,0x00, 0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0xff,0x01, 0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x09,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00,0x04,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x88, 0x04,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60, 0x01,0x01,0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x09,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x88,0x04,0x00,0x00,0x00, 0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c, 0x00,0x04,0x02,0x67,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0x67,0x80,0x67,0x00,0x29,0x00,0x00,0x00,0x00,0xd9, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x00,0x00,0x66,0x00,0x31,0x67,0x00,0x32,0x00,0x05,0x00,0x68,0x00,0x29, 0x03,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x8b,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0c,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8c,0x04,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x8c,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x9d,0x0c,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x8c,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00, 0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x8d,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0c,0x00,0x00,0x08,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x8d, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x8e,0x04,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x8e,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x0c, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x9d,0x0c,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00, 0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x8f,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0c,0x00,0x00,0x10,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x8f, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x04,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x90,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x14, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x9d,0x0c,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x90,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00, 0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x91,0x04,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0c,0x00,0x00,0x18,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x9d,0x0c,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x91, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9e,0x0c,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x9e,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0c,0x00,0x00,0x1c, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x0c,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x9d,0x0c,0x00,0x00,0x1c,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x69,0x00,0x31, 0x68,0x00,0x29,0x04,0x00,0x00,0x00,0x9f,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xa0,0x0c,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9f,0x0c,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0x9f,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00, 0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x92,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa1, 0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x04,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xa1,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c, 0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xa1,0x0c,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x93,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xa0,0x0c,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa2,0x0c,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa2,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00, 0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa3, 0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x0c,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xa3,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c, 0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xa3,0x0c,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x95,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xa0,0x0c,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x0c,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa4,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00, 0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x10,0x00,0x00, 0x02,0x00,0x96,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa5, 0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x14,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xa5,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c, 0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xa5,0x0c,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x97,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xa0,0x0c,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x0c,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0xa6,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00, 0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x18,0x00,0x00, 0x02,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x99, 0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa0,0x0c,0x00,0x00,0x1c,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa0,0x0c, 0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xa0,0x0c,0x00,0x00,0x1c,0x01,0x23,0x01,0x31,0x69,0x00,0x29, 0x04,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xa7,0x0c,0x00, 0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x68,0x00,0x00,0xd7,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x68,0x00,0x6d,0x00, 0x2c,0x00,0x04,0x02,0x69,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x69,0x80,0x6b,0x00,0x25,0x00,0x00,0x00,0x00, 0x9b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa8,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xa9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9a, 0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xaa,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xa0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0xa1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa2,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xa3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa4,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x6a,0x00,0x00, 0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x6a,0x00,0x6a,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0xa6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xae,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x0c,0x00,0x00,0x00,0x00, 0x9a,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb0,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xaf,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb1,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x0c,0x00,0x00, 0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xab,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xab,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb2,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xaf,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0, 0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x0c, 0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x79,0x00, 0x31,0x6a,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xaf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xb0,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb4,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb5, 0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xb7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04, 0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x01,0x01,0x00,0x00, 0x00,0x00,0xb7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xb8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xb9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00, 0x9a,0x04,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xba,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xb5,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x02,0x32, 0x00,0x00,0x00,0x79,0x00,0x31,0x6b,0x00,0x32,0x00,0x40,0x00,0x6c,0x00,0x2b,0x00, 0x02,0x6b,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x6b,0x80,0x79,0x00,0x25, 0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xbb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xbc,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbc,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xbd,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbe,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbf,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x02,0x01,0x00,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc5,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xc6, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc7,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc7,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xc8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04, 0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xc9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0xca,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xc3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x0c,0x00,0x00,0x00,0x00, 0x9a,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcb,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc5,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x0c,0x00,0x00, 0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xcf,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0, 0x01,0x01,0x00,0x00,0x00,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xc8,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x0c, 0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0xd3, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd4,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc9, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00, 0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xcb,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc4,0x0c,0x00,0x00,0x00,0x00,0x9a, 0x04,0x00,0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x6c,0x00,0x25,0x00, 0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd9, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xcd,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xda,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xce,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdb,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a, 0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xcf,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe1,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00, 0x00,0xe2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0xe6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0c,0x00,0x00, 0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xe7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd5,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xd4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0, 0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd6,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0c, 0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xeb, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xec,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00, 0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xed,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd8,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xd4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00, 0x00,0xef,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xf0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x0c,0x00,0x00,0x00,0x00,0x9a, 0x04,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf1,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xd4,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x03,0x32,0x00, 0x00,0x00,0x79,0x00,0x31,0x6d,0x00,0x2c,0x00,0x04,0x02,0x6c,0x00,0x00,0xd7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x6c,0x00, 0x6f,0x00,0x25,0x00,0x00,0x00,0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xf3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xdc,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf5,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf7,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x04,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x6d,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x6d,0x00,0x6e, 0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xf8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf9, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xfa,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xe0,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0xfb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xe1,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe0,0x0c,0x00, 0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0xfd,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfe,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xe0,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00, 0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe3,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe0, 0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x79, 0x00,0x31,0x6e,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xe4,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe5,0x0c,0x00,0x00,0x00,0x00, 0x9a,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xe5,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe7,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xe5,0x0c,0x00,0x00, 0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x6f, 0x00,0x2c,0x00,0x00,0x02,0x6e,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x6e,0x00,0x70,0x00,0x2c,0x00,0x00,0x02, 0x6f,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x32,0x00,0x6f,0x80,0x79,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0xe8,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe9,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x0c,0x00,0x00,0x00, 0x00,0x9a,0x04,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x70,0x00, 0x25,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xec,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x9a,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0a,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0b,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x0c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xed,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xee,0x0c,0x00, 0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xee,0x0c,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00, 0xa0,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x71,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x69,0x05,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x0a,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x68, 0x05,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8, 0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd8,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x02,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x2d,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x05,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x30,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x05, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x2d,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x05,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x30,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x05, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x2d,0x05,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x05,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x30,0x05,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x32,0x05, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05,0x00,0x72,0x00,0x29,0x03,0x00,0x00,0x00, 0x0e,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf0,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf0, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf0,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x0f,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf0,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0e,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf0,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0f,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf0,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf0,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf0,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x0f,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf1,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf1, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x10,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf1,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x11,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf1,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf1,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x11,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf1,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf1,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf1,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x11,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x12,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf2,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf2, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x12,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf2,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x13,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf2,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x12,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf2,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x13,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf2,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf2,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf2,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x13,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x14,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf3,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf3, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x14,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf3,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf3,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x14,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf3,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x15,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf3,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf3,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf3,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x15,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x16,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf4,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x17,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf4, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x16,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf4,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x17,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf4,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x16,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf4,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x17,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf4,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf4,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf4,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x17,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x18,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf5,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf5, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x18,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf5,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x19,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf5,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf5,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x19,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf5,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf5,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf5,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x19,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x1a,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf6,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x1b,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf6, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x1a,0x05,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf6,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x1b,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf6,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf6,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x1b,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf6,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xf6,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xf6,0x0c,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x1b,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf7,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf8,0x0c,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0xf9,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xf8, 0x0c,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xf7,0x0c,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xf8,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0xf9,0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xf8,0x0c,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xf7,0x0c,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xf8,0x0c,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xf9,0x0c, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xf8,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x32, 0x00,0x00,0x00,0x73,0x00,0x31,0x72,0x00,0x29,0x04,0x00,0x00,0x00,0xfa,0x0c,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xfb,0x0c,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xfc,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfb,0x0c,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfa,0x0c,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xfb,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfc, 0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfb,0x0c,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xfa,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfb,0x0c, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x0c,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xfb,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x1d,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xfd,0x0c,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xfe,0x0c,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xff,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xfe,0x0c,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xfd,0x0c,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xfe,0x0c,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xff, 0x0c,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xfe,0x0c,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xfd,0x0c,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xfe,0x0c, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xff,0x0c,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xfe,0x0c,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2d,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x1f,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x01,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x02,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x01,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x01,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x02, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x01,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x01,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x02,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x01,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x21,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x03,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x05,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x04,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x05, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x04,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x04,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x05,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x04,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2f,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x23,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x06,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x07,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x07,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x06,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x07,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x08, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x07,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x06,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x07,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x25,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x0a,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x0b,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0a,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x0a,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0b, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0a,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x09,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0a,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0b,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x0a,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x31,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x27,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x0e,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0d,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x0d,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0e, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0d,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x0c,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0d,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x0e,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x0d,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x32,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x29,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2a,0x05,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x0f,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2b, 0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0f,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0f,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x0f,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x31,0x73,0x00,0x29, 0x04,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x0d,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x05,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x11,0x0d,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x70, 0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x32,0x00,0x70,0x00,0x76,0x00,0x2c,0x00,0x04,0x02,0x71,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x71,0x80,0x74, 0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x12,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x35,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x36, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x36,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x2d,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x14,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x38,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x2e, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3a,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x15,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x3a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x2f,0x05,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x3c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x05,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x02,0x72,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x32,0x00,0x72,0x80,0x79,0x00,0x01,0x00,0x00,0x00,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x3d,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x31,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x74,0x00, 0x32,0x00,0x40,0x00,0x75,0x00,0x2b,0x00,0x02,0x73,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0x73,0x80,0x79,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x03,0x07,0x00,0x17,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x05,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x40,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x05,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x42,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x2e,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x43,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x44,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x2f,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x46,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x30, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x47,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x48,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x05,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x4a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x4b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4b,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x79,0x00,0x31,0x75,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x1e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4e,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x4f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x50,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x50,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x2e,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x51,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x52,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x52,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x2f,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x53,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x54,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x22,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x54,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x05,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x05,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x57,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x57, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x79,0x00,0x31,0x76,0x00,0x2c,0x00,0x04,0x02,0x74,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x74,0x00,0x77, 0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x58,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x24,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x59,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5a,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x2d,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x26,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x2e, 0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x75,0x00,0x00,0xd7,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x75,0x00,0x79,0x00, 0x01,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x5d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5d, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x2f,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x79,0x00,0x31,0x77,0x00,0x2c,0x00,0x00,0x02,0x76,0x00,0x00,0xd7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x76,0x00,0x78, 0x00,0x2c,0x00,0x00,0x02,0x77,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x77,0x80,0x79,0x00,0x25,0x00,0x00,0x00, 0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5e,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x27,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x79,0x00,0x31,0x78,0x00,0x25, 0x00,0x00,0x00,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x5f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x28,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x60,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x60,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x2d,0x05,0x00,0x00,0x00,0x00,0x31,0x79,0x00,0x24,0x00,0x00,0x00,0x00,0x61,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x62,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x63,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x78,0x00,0x00, 0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x78,0x80,0xb5,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x62,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x06,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x67,0x05,0x00,0x00,0x00,0x00,0x2c, 0x00,0x04,0x02,0x79,0x00,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0x06,0x00,0xad,0x00,0x29,0x00,0x00,0x00,0x00,0x6c, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04, 0x00,0x7a,0x00,0x29,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x7d,0x00,0x31, 0x7a,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0x03,0x00,0x7b,0x00,0x29,0x00,0x00,0x00,0x00,0x6b,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0x7d,0x00,0x31,0x7b,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x7c,0x00,0x29, 0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x7d,0x00,0x31,0x7c,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x31,0x7d,0x00,0x29,0x00,0x00,0x00,0x00,0x6e,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x6d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x7a,0x00,0x00,0x6b,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x7a,0x00,0x7f,0x00,0x31, 0x7e,0x00,0x24,0x00,0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x0a,0x00,0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0a,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x6e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x6e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x7b,0x00,0x00, 0x6e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x7b,0x80,0x7e,0x00,0x31,0x7f,0x00,0x2c,0x00,0x04,0x02,0x7c,0x00, 0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32, 0x00,0x7c,0x00,0x97,0x00,0x2c,0x00,0x00,0x02,0x7d,0x00,0x00,0x6c,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x7d,0x00,0x8b,0x00, 0x2c,0x00,0x00,0x02,0x7e,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x7e,0x80,0xb5,0x00,0x29,0x03,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67, 0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0x67,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x05,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x11,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1d,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0x0a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x12,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1e,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0x0b,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0x0f,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x13,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1f,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05,0x00,0x80, 0x00,0x29,0x03,0x00,0x00,0x00,0x71,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x71,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x72,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x72,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x71,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x72,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x73,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x74,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x73,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x04, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x74,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x04,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x74,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x73,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x74,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x75,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x76,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x75,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x08, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x76,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x08,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x76,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0x75,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x76,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x78,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x77,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x0c, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x0c,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x0c,0x00, 0x00,0x02,0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x79,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7a,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x79,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x10, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x10,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x10,0x00, 0x00,0x02,0x00,0x79,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x7a,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x7b,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x7b,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x14, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x14,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x7b,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x7c,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7e,0x05,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x7d,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x18, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x05, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x18,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0d,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0x7d,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x2d,0x0d,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x7e,0x05,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d, 0x0d,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x0d,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x2e,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0d,0x00,0x00,0x1c, 0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2f,0x0d,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x2d,0x0d,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2e,0x0d, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00,0x00,0x1c,0x01,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x2f,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0d,0x00, 0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0x81,0x00,0x31,0x80,0x00,0x29,0x04, 0x00,0x00,0x00,0x30,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x32,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x30, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x32,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x30,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x32,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x02,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x33,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x34,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x33, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x04,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x34,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x33,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x34,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x06,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x81,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x82,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x35,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x36,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x35, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x08,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x36,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x35,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x36,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x0a,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x83,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x0a,0x00,0x00,0x02,0x00,0x84,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x37,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x38,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x37, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x0c,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x38,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x37,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x38,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x0e,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x0c,0x00,0x00,0x02,0x00, 0x85,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x0e,0x00,0x00,0x02,0x00,0x86,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x39,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x3a,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x10,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x3a,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x39,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x3a,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x12,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x10,0x00,0x00,0x02,0x00, 0x87,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x12,0x00,0x00,0x02,0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x3b,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x3c,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x3b, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x14,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x3c,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x3b,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x3c,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x16,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x89,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x16,0x00,0x00,0x02,0x00,0x8a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x3d,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x3e,0x0d,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x3d, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x18,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x3e,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x3d,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x3e,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x1a,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x18,0x00,0x00,0x02,0x00, 0x8b,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x1a,0x00,0x00,0x02,0x00,0x8c,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x31,0x0d,0x00,0x00, 0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x31,0x0d,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8d, 0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d,0x00,0x00,0x1c,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x31,0x0d, 0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0x8e,0x05,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x31,0x0d,0x00,0x00,0x1e,0x01, 0x23,0x01,0x31,0x81,0x00,0x29,0x04,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0x3f,0x0d,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x40,0x0d,0x00,0x00,0x00,0x00,0x22, 0x01,0x2c,0x00,0x04,0x02,0x7f,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x7f,0x80,0x83,0x00,0x31,0x82,0x00,0x29, 0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x05,0x00, 0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x92,0x05,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x8f,0x05,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x92,0x05,0x00,0x00,0x0b,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x92, 0x05,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x92,0x05,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x92,0x05,0x00,0x00,0x17, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x92,0x05,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8f,0x05, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x92,0x05,0x00,0x00,0x1f,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x90,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0b,0x00, 0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x42,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0xfe,0x01,0x00, 0x02,0x00,0x8f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b, 0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x8f,0x05,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x8f,0x05, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0xff, 0x01,0x00,0x02,0x00,0x8f,0x05,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0b,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x8f,0x05,0x00,0x00,0x00,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00, 0x8f,0x05,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00, 0x60,0x01,0x01,0x00,0x02,0x00,0x8f,0x05,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x8f,0x05,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x91,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0x80,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x80,0x80,0x83,0x00,0x29,0x00,0x00,0x00,0x00, 0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x82,0x00,0x31,0x83,0x00,0x2c,0x00,0x04,0x02,0x81,0x00, 0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32, 0x00,0x81,0x00,0x87,0x00,0x2c,0x00,0x04,0x02,0x82,0x00,0x00,0x66,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x82,0x80,0x85,0x00, 0x25,0x00,0x00,0x00,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x94,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x45,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x95, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x96,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x96,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x97,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x98,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x98,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x99,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x48,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x9a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x9c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x9c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x02,0x2c,0x00, 0x00,0x02,0x83,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x32,0x00,0x83,0x00,0x84,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x9d,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x9d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x9f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa1, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0xa2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa3,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa4,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa5,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xa6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x4d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x0d,0x00, 0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa8,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x50,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x4e, 0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00, 0xab,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x51,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x0d,0x00,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x4e,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x02,0x32,0x00,0x00, 0x00,0xb5,0x00,0x31,0x84,0x00,0x01,0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x53,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xaf,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb0, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0xb1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb2,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xb3, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb4,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb4,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xb5,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb6,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xb6,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x57,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xb8,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40, 0x02,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xb9,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x02,0x01,0x00, 0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xba, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xbb,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x59,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x00, 0x01,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x5a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x59,0x0d,0x00, 0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x59,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xc1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x59, 0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00, 0xc2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x5d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x59,0x0d,0x00,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc4,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x59,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x02,0x32,0x00,0x00, 0x00,0xb5,0x00,0x31,0x85,0x00,0x32,0x00,0x79,0x00,0x86,0x00,0x2b,0x00,0x02,0x84, 0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x84,0x80,0xb5,0x00,0x25,0x00,0x00, 0x00,0x00,0xc5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc6,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x60,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc7,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x61,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xc8,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xc9,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x62,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0xcb,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xcc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xcc,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xcd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xce,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0xcf,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd0, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd0,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x92,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xd1,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd2,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x66,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92, 0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xd3,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd4,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x67,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xd4,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00, 0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0xd5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd5,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0xd6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xd7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd7,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd9,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x92,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xdb,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xdd,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x02, 0x01,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xdf,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdf, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x02,0x01,0x00,0x00, 0x00,0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe1,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe2,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe3,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xe4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x6e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0d,0x00, 0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xe5,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe6,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x70,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xe7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6f, 0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00, 0xe9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xea, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x72,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0d,0x00,0x00,0x00,0x00,0x92,0x05, 0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xeb,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xec,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xeb,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x6f,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x02,0x01,0x00,0x00, 0x00,0x00,0xed,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xee,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x74,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0d,0x00,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xef,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x6f,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x03,0x01, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x76,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0d,0x00,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x86, 0x00,0x25,0x00,0x00,0x00,0x00,0xf2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xf3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x78,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xf4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf5,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x92,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf7,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf7,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92, 0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xf9,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xfa,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xfb,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfd,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0xfe,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xff,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xff,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x02,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x04, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x06,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x07, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x08,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x09,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x83,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x0a,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x0b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40, 0x03,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x0c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x0d,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x84, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x85,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00, 0x00,0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x11,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x87,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0d,0x00,0x00,0x00,0x00,0x92, 0x05,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x12,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x12,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x01,0x01,0x00, 0x00,0x00,0x00,0x14,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x15,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x89,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0d,0x00,0x00,0x00, 0x00,0x92,0x05,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x16,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x16,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8a,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x85,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x02, 0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x8b,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0d,0x00, 0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00,0xb5,0x00,0x31, 0x87,0x00,0x2c,0x00,0x04,0x02,0x85,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x85,0x00,0x89,0x00,0x25,0x00,0x00, 0x00,0x00,0x19,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1a,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x8d,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1b,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x1c,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1e,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8f,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x1e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00, 0x01,0x2c,0x00,0x00,0x02,0x86,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x86,0x00,0x88,0x00,0x01,0x00,0x00,0x00, 0x00,0x1f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x20,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x20,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x21,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x21,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x23,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x91,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x23,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x25,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x25, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x26,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x26,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x93,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x94,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x29,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x2a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x95,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0d,0x00,0x00,0x00,0x00,0x92, 0x05,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x96,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x94,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x2d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x97,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x0d,0x00,0x00,0x00, 0x00,0x92,0x05,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x88,0x00, 0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x2e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2f, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x30,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x92,0x05,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x31,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x31,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x32,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x99,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x0d,0x00,0x00,0x00,0x00, 0x92,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x34,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9b,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x9a,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0xe0,0x00,0x01, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x36,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x9c,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x0d,0x00,0x00, 0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x89, 0x00,0x2c,0x00,0x00,0x02,0x87,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x87,0x00,0x8a,0x00,0x2c,0x00,0x00,0x02, 0x88,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x32,0x00,0x88,0x80,0xb5,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x0d,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x37,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x9d,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x39,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x39,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x3a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x3b,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9f,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xa0,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60, 0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x8a,0x00,0x25,0x00,0x00,0x00,0x00,0x3c, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xa2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x3f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x40,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x40,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x92,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x41, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x41,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x92,0x05,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x43,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xa4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xa5,0x0d, 0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa6, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xa5,0x0d,0x00,0x00,0x00,0x00,0x92,0x05,0x00, 0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x8b,0x00,0x29,0x03,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x67,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x10,0x00,0x00, 0x02,0x00,0x67,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x05, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x11,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1d, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0x0a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x12,0x00,0x00, 0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x69,0x05, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1e, 0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02, 0x89,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x32,0x00,0x89,0x80,0x8d,0x00,0x31,0x8c,0x00,0x29,0x00,0x00,0x00,0x00,0x45, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x06,0x00,0x00,0x02,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x66,0x06, 0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x66,0x06,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x45,0x06,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x66,0x06,0x00,0x00,0x0e,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x66,0x06,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x45,0x06,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x66,0x06,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x66,0x06,0x00,0x00, 0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x07,0x00, 0x02,0x00,0x66,0x06,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x46, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x66,0x06, 0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0xa7,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x45,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0xfe,0x01, 0x00,0x02,0x00,0x45,0x06,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0c,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x45,0x06,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x45, 0x06,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60, 0x00,0x01,0x00,0x02,0x00,0x45,0x06,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0c,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x45,0x06,0x00,0x00,0x00, 0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0x01,0x01,0x00,0x02, 0x00,0x45,0x06,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00, 0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x45,0x06,0x00,0x00,0x00,0x07,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x47,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x8a, 0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0x8a,0x80,0x8d,0x00,0x29,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x47,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0x8c,0x00,0x31,0x8d,0x00,0x32,0x00,0x05,0x00,0x8e,0x00,0x29,0x03,0x00,0x00,0x00, 0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x00,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x49,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x49,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x02, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x49,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x49,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4a,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x04,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x4b,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4a,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x4b,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x06, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4b,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x06,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4a,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x4b,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4c,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x08,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4c,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x4d,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x0a, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x0a,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x4c,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x0a,0x00, 0x00,0x02,0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x4e,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x0c,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x4f,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4e,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x4f,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x0e, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x4f,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x0e,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x4e,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x0e,0x00, 0x00,0x02,0x00,0x4f,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x50,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x10,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x50,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x51,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x12, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x12,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x50,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x12,0x00, 0x00,0x02,0x00,0x51,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x52,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x14,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x53,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x16, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x52,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x53,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x16,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x52,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x16,0x00, 0x00,0x02,0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x54,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x18,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x55,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x1a, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x06,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x55,0x06, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x1a,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x54,0x06,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x1a,0x00, 0x00,0x02,0x00,0x55,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xa9,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x1c,0x02,0x24, 0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa8, 0x0d,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x0d,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0xaa,0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xa8,0x0d,0x00,0x00,0x1e, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xa9,0x0d,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xa8,0x0d,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xaa,0x0d, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xa8,0x0d,0x00,0x00,0x1e,0x01,0x23,0x01,0x32, 0x00,0x00,0x00,0x8f,0x00,0x31,0x8e,0x00,0x29,0x04,0x00,0x00,0x00,0xab,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xad,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xab,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xad, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xab,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xad,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x57,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xae,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xaf,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xae,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xaf, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x06,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xae,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xaf,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x58,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x59,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb0,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xb1,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x0a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb0,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb1, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x0a,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xb0,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xb1,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x5a,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x5b,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb2,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xb3,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x0e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb2,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb3, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x0e,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xb2,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xb3,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x5c,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x0e,0x00,0x00,0x02,0x00, 0x5d,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb4,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xb5,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x12,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb4,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb5, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x12,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xb4,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xb5,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x5e,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x12,0x00,0x00,0x02,0x00, 0x5f,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb6,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xb7,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x16,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb6,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb7, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x16,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xb6,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xb7,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x60,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x61,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb8,0x0d,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0xb9,0x0d,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x1a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb8,0x0d,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb9, 0x0d,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x1a,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0xb8,0x0d,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xb9,0x0d,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x62,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1a,0x00,0x00,0x02,0x00, 0x63,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x06,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xac,0x0d,0x00,0x00, 0x1e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x06,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xac,0x0d,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x65, 0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xac,0x0d,0x00,0x00,0x1e,0x00,0x24,0x01, 0x29,0x05,0x00,0x00,0x00,0x64,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x0d, 0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xac,0x0d,0x00,0x00,0x1e,0x01,0x23,0x01,0x31,0x8f,0x00,0x29, 0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xba,0x0d,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x1e,0x00, 0x00,0x02,0x00,0xbb,0x0d,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x8b, 0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x32,0x00,0x8b,0x00,0x93,0x00,0x2c,0x00,0x04,0x02,0x8c,0x00,0x00,0x66,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x8c,0x80,0x91, 0x00,0x25,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x68,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xbd,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x69,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6a, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6a,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x6b,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbf,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6c,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66, 0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x6d,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc0,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x6e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x02,0x2c, 0x00,0x00,0x02,0x8d,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x32,0x00,0x8d,0x00,0x90,0x00,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x71,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x72,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc2,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xc3,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x74,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xc4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc3,0x0d,0x00,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x75,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc5,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xc3,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x77,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xc6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc3,0x0d,0x00,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xc3,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x02, 0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x90,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7a,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x66,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x7c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc8,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0d,0x00,0x00, 0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x7d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xcb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0d, 0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x81, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcc, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcd,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x85,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xce,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0d,0x00,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x91,0x00,0x32,0x00, 0x79,0x00,0x92,0x00,0x2b,0x00,0x02,0x8e,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x8e,0x80,0xb5,0x00,0x25,0x00,0x00,0x00,0x00,0x86,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x87,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xd0,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x89,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x89,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x8a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x8b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8b,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x66,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x90,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x93,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x93, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x94,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x94,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x95,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd7,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xd8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x97,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x98,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd9,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x0d,0x00,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xda,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xd8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xdb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x0d,0x00,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x9d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdc,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xd8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x02, 0x01,0x00,0x00,0x00,0x00,0x9f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xdd,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x0d,0x00, 0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xa1,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa2,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xde,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xd8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00, 0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xd8, 0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0xb5, 0x00,0x31,0x92,0x00,0x25,0x00,0x00,0x00,0x00,0xa4,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xa5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0xe1,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xa6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xa7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa7,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0xa8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa9, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa9,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xaa,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xab,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe4,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xab,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66, 0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xac,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xad,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe5,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xad,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xae,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb0,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xb1,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xb2,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe7,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xe8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xb3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe9,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xe8,0x0d,0x00,0x00,0x00, 0x00,0x66,0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xb5,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb6,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xea,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0xe8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0xb7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xb8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xeb,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xe8,0x0d,0x00, 0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xb9,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xba,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xec,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0xe8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00, 0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xbc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xed,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xe8, 0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbd, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xee,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xe8,0x0d,0x00,0x00,0x00,0x00,0x66,0x06, 0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x93,0x00,0x2c,0x00,0x04, 0x02,0x8f,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x8f,0x00,0x95,0x00,0x25,0x00,0x00,0x00,0x00,0xbe,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xbf,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xef,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0xf0,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xc1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xc1,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0xc2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xc3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc3,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02, 0x90,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x90,0x00,0x94,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc4,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xc5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0xc6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xf3,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf4,0x0d,0x00,0x00,0x00,0x00, 0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xc7,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc8,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf5,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0xf4,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0xc9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xca,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xf6,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf4,0x0d,0x00,0x00, 0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcb,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0xf4,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0xc0, 0x01,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x94,0x00,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xcc,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf8,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0xf9,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0xce,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xfa,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0xf9,0x0d,0x00,0x00,0x00,0x00,0x66, 0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfb,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0xf9,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x01,0x32,0x00, 0x00,0x00,0xb5,0x00,0x31,0x95,0x00,0x2c,0x00,0x00,0x02,0x91,0x00,0x00,0x66,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x91,0x00, 0x96,0x00,0x2c,0x00,0x00,0x02,0x92,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x92,0x80,0xb5,0x00,0x25,0x00,0x00, 0x00,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd1,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xfc,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0x66,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd2,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xd3,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfd,0x0d,0x00,0x00,0x00,0x00,0x21, 0x01,0xfe,0x0d,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x32,0x00,0x00, 0x00,0xb5,0x00,0x31,0x96,0x00,0x25,0x00,0x00,0x00,0x00,0xd4,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xff,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd6, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd7,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xd8,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x02,0x0e,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xd9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x03,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x02,0x0e,0x00,0x00, 0x00,0x00,0x66,0x06,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x97, 0x00,0x2c,0x00,0x00,0x02,0x93,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x93,0x00,0xa1,0x00,0x2c,0x00,0x00,0x02, 0x94,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0x94,0x80,0xb5,0x00,0x29,0x03,0x00,0x00,0x00,0xec,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xec,0x06,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0x67,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x06, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67,0x05,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x67, 0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x95,0x00,0x00,0x6b,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x95,0x80, 0x99,0x00,0x31,0x98,0x00,0x29,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xec,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xda,0x06,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xec,0x06,0x00,0x00,0x04,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xec, 0x06,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0xec,0x06,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xec,0x06,0x00,0x00,0x10, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0xec,0x06,0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xda,0x06, 0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xec,0x06,0x00,0x00,0x18,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xec,0x06,0x00, 0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x41,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x0d,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x0d,0x00,0x21, 0x01,0x00,0x04,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d, 0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xda,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xda,0x06, 0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0xff, 0x01,0x00,0x02,0x00,0xda,0x06,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0d,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xda,0x06,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00, 0xda,0x06,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00, 0xe0,0x00,0x01,0x00,0x02,0x00,0xda,0x06,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xda,0x06,0x00,0x00, 0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0x01,0x01,0x00, 0x02,0x00,0xda,0x06,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xdc, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x96,0x00,0x00,0x6b,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x96,0x80,0x99, 0x00,0x29,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x98,0x00,0x31,0x99,0x00, 0x32,0x00,0x05,0x00,0x9a,0x00,0x29,0x03,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0xdd,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x05,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x05,0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xde, 0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x0e,0x00,0x00,0x04,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xde,0x06, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0xdf,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x08,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x05,0x0e,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0xdf,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00, 0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x05,0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe0, 0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x0e,0x00,0x00,0x0c,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xe0,0x06, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x06,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0xe1,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x10,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe1,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x05,0x0e,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0xe1,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xe2,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00, 0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xe2,0x06,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x05,0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe2, 0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x0e,0x00,0x00,0x14,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xe2,0x06, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe3,0x06,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0xe3,0x06,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x05,0x0e,0x00,0x00,0x18,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe3,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x05,0x0e,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x05,0x0e,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0xe3,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x06,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x0e,0x00,0x00, 0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x0e,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x05,0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x06, 0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x0e,0x00,0x00,0x1c,0x01,0x23,0x01, 0x32,0x00,0x00,0x00,0x9b,0x00,0x31,0x9a,0x00,0x29,0x04,0x00,0x00,0x00,0x07,0x0e, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x07,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x07,0x0e,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08, 0x0e,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x09,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x04, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0xe5,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x0a,0x0e, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x08,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x0a,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00, 0x00,0x08,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0a,0x0e,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xe6,0x06,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08, 0x0e,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x0b,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x0c, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0xe7,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x0c,0x0e, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x10,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x0c,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00, 0x00,0x10,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0c,0x0e,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x0d,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08, 0x0e,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x0d,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x0d,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x14, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x14,0x00,0x00,0x02, 0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x0e,0x0e, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x18,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x0e,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00, 0x00,0x18,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x0e,0x0e,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08, 0x0e,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xeb,0x06,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x08,0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xeb,0x06,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x0e,0x00,0x00,0x1c, 0x01,0x23,0x01,0x31,0x9b,0x00,0x29,0x04,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x0f,0x0e,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02, 0x97,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x32,0x00,0x97,0x00,0x9e,0x00,0x2c,0x00,0x04,0x02,0x98,0x00,0x00,0x66,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x98,0x80, 0x9c,0x00,0x24,0x03,0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xee,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xef,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x11,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0e,0x00,0x00,0x00,0x00,0xec, 0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf0,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf1,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf0,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x12,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0xf2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xf3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x13,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0e,0x00,0x00,0x00, 0x00,0xec,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xf4,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x14,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x02, 0x2c,0x00,0x00,0x02,0x99,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x99,0x80,0xb5,0x00,0x01,0x00,0x00,0x00,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf6, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x15,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0e,0x00,0x00,0x00,0x00,0xec,0x06, 0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x9c,0x00,0x32,0x00,0x79, 0x00,0x9d,0x00,0x2b,0x00,0x02,0x9a,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x9a,0x80,0xb5,0x00,0x24,0x03,0x00,0x00,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0d,0x00,0x00,0x00,0x00, 0x21,0x01,0x16,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xf9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x17,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x16,0x0e,0x00,0x00,0x00, 0x00,0xec,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfb,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfa,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x16,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x19,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x16,0x0e,0x00, 0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xfe,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1a,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x16,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x16, 0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0x02,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x1c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x16,0x0e,0x00,0x00,0x00,0x00,0xec,0x06, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x16,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x03,0x32,0x00,0x00, 0x00,0xb5,0x00,0x31,0x9d,0x00,0x24,0x03,0x00,0x00,0x00,0x05,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x1e,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x1f,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0e,0x00, 0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x09,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x20,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x0a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x1e, 0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x22,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0e,0x00,0x00,0x00,0x00,0xec,0x06, 0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x0e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x1e,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x24,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x1e,0x0e,0x00,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0x9e,0x00,0x2c, 0x00,0x04,0x02,0x9b,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0x9b,0x00,0x9f,0x00,0x24,0x03,0x00,0x00,0x00,0x11, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0e,0x00,0x00,0x00,0x00,0xec,0x06, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x12,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x12,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x26,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x14,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x15,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x27,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0e,0x00,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x9c,0x00,0x00,0x66,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x9c,0x00,0xb5, 0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x16,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x28,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0e, 0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0xb5,0x00, 0x31,0x9f,0x00,0x2c,0x00,0x00,0x02,0x9d,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x9d,0x00,0xa0,0x00,0x2c,0x00, 0x00,0x02,0x9e,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x32,0x00,0x9e,0x80,0xb5,0x00,0x24,0x03,0x00,0x00,0x00,0x17,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xa0,0x00,0x24,0x03,0x00,0x00, 0x00,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x0e,0x00,0x00,0x00,0x00, 0xec,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x19,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2b,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x0e,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x80,0x00,0x32, 0x00,0x00,0x00,0xb5,0x00,0x31,0xa1,0x00,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x08,0x00,0x00, 0x02,0x00,0x67,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c, 0x07,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x67,0x05, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x14, 0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x1c,0x00,0x00,0x02,0x00, 0x67,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x09,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c, 0x07,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x15, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x1d,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x9f,0x00,0x00,0x6b, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x9f, 0x80,0xa3,0x00,0x31,0xa2,0x00,0x29,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x07,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x1a,0x07,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x2c,0x07,0x00,0x00,0x05,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x2c,0x07,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1a,0x07,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x2c,0x07,0x00,0x00,0x0d,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2c,0x07,0x00,0x00, 0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0x2c,0x07,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1a, 0x07,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x2c,0x07,0x00,0x00,0x19,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x2c,0x07, 0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1b,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x41,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x28,0x00,0x01,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x0e,0x00, 0x21,0x01,0x00,0x2c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0e,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x1a,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x1a, 0x07,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60, 0xff,0x01,0x00,0x02,0x00,0x1a,0x07,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0e,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x1a,0x07,0x00,0x00,0x00, 0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x00,0x01,0x00,0x02, 0x00,0x1a,0x07,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00, 0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x1a,0x07,0x00,0x00,0x00,0x05,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x1a,0x07,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0x01,0x01, 0x00,0x02,0x00,0x1a,0x07,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x1c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xa0,0x00,0x00,0x6b,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xa0,0x80, 0xa3,0x00,0x29,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xa2,0x00,0x31,0xa3, 0x00,0x32,0x00,0x05,0x00,0xa4,0x00,0x29,0x03,0x00,0x00,0x00,0x1d,0x07,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x1d,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x2d,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00, 0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x1e,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0e,0x00,0x00,0x04,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x1e, 0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x07,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x1f,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x08, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x07,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x2d,0x0e,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e, 0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x1f,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00, 0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x20,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0e,0x00,0x00,0x0c,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x20, 0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x21,0x07,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x21,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x10, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x21,0x07,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x2d,0x0e,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x22,0x07,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00, 0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x22,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x22,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0e,0x00,0x00,0x14,0x01,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x22, 0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x07,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00, 0x00,0x00,0x23,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x18, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x07,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0x2d,0x0e,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x2d,0x0e, 0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x23,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x2e,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2d,0x0e,0x00, 0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x2e,0x0e,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x2d,0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x2e,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2d,0x0e,0x00,0x00,0x1c,0x01,0x23, 0x01,0x32,0x00,0x00,0x00,0xa5,0x00,0x31,0xa4,0x00,0x29,0x04,0x00,0x00,0x00,0x2f, 0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x00,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x2f,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x2f,0x0e,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x07,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x30,0x0e,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x0e,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0x31,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00, 0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x25,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x32, 0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x08,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x32,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e, 0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x32,0x0e,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x26,0x07,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x30,0x0e,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x0e,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0x33,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00, 0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x0c,0x00,0x00, 0x02,0x00,0x27,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x34, 0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x10,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x34,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e, 0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x34,0x0e,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x28,0x07,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x35,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x30,0x0e,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x35,0x0e,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0x35,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00, 0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0x29,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x36, 0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x18,0x02,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x36,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e, 0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x36,0x0e,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x2a,0x07,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x30,0x0e,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x07,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x30,0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05, 0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x30,0x0e,0x00,0x00, 0x1c,0x01,0x23,0x01,0x31,0xa5,0x00,0x29,0x04,0x00,0x00,0x00,0x2c,0x07,0x00,0x00, 0x1c,0x00,0x00,0x02,0x00,0x37,0x0e,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04, 0x02,0xa1,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0xa1,0x00,0xa9,0x00,0x2c,0x00,0x04,0x02,0xa2,0x00,0x00,0x66, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xa2, 0x80,0xa7,0x00,0x25,0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x2e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x39, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x30,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x30,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x31, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x32,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x32,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x34,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x34,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x35,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x36,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3d,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x36,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0xa3,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xa3,0x00,0xa6,0x00,0x01,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x37,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x3f,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x01,0x00, 0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x3a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x40,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x0e,0x00,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x41,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x3f,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01, 0x01,0x00,0x00,0x00,0x00,0x3d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x42,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x0e,0x00, 0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3f,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00, 0x20,0x02,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xa6,0x00,0x01,0x00,0x00,0x00,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x40, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x40,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x41,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x42,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x44,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0e, 0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x43, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00, 0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x46,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x45,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00, 0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x48,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x48,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0e,0x00,0x00,0x00,0x00,0x2c, 0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x49,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4a,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x45,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x02,0x01,0x00, 0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x4b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x4a,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0e,0x00,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xa7,0x00, 0x32,0x00,0x79,0x00,0xa8,0x00,0x2b,0x00,0x02,0xa4,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0xa4,0x80,0xb5,0x00,0x25,0x00,0x00,0x00,0x00,0x4c,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x4d,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4b,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x01,0x07,0x00,0x4c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x4f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x4f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x51,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x51,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x52,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x53, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x53,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x54,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x50,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x55,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x56,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x51,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x57,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00, 0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x58,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x59,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5a,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x5b,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x53,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x54,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x01,0x00, 0x00,0x00,0x00,0x5d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x5e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x55,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x0e,0x00,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x5f,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x54,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01, 0x01,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x62,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x57,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x0e,0x00, 0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x63,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x64,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00, 0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x66,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x54, 0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00, 0x67,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x68, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x5a,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07, 0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x54,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x03,0x32,0x00,0x00, 0x00,0xb5,0x00,0x31,0xa8,0x00,0x25,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0x5d,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x6c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6d, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x6e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x6f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6f,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x70, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x71,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x71,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x61,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x73,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07, 0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x75,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x62,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x75,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80, 0x02,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x76,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x76,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x77, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x78,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x64,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x65,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0e,0x00, 0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7c,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x66,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00, 0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x64, 0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00, 0x7f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x68,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07, 0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x81,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x69,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x64,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x02,0x01,0x00,0x00, 0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6a,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x0e,0x00,0x00,0x00,0x00, 0x2c,0x07,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xa9,0x00,0x2c, 0x00,0x04,0x02,0xa5,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0xa5,0x00,0xab,0x00,0x25,0x00,0x00,0x00,0x00,0x84, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x85,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6b,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x01,0x07,0x00,0x6c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x89,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x89,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x01,0x2c,0x00, 0x00,0x02,0xa6,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0xa6,0x00,0xaa,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8a,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8a,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x8b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x8c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x6f,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x0e,0x00,0x00, 0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x70,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0, 0x00,0x01,0x00,0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x72,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x0e, 0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x91,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00, 0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xaa,0x00,0x01,0x00,0x00,0x00, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x92,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x93,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x74,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x75,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x01,0x00, 0x00,0x00,0x00,0x94,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x76,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0e,0x00,0x00,0x00, 0x00,0x2c,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x96,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x77,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x75,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x01, 0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xab,0x00,0x2c,0x00,0x00,0x02,0xa7,0x00,0x00, 0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00, 0xa7,0x00,0xac,0x00,0x2c,0x00,0x00,0x02,0xa8,0x00,0x00,0x66,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xa8,0x80,0xb5,0x00,0x25, 0x00,0x00,0x00,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x97,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x78,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x98,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x20,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x79,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x7a,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20,0x00,0x32, 0x00,0x00,0x00,0xb5,0x00,0x31,0xac,0x00,0x25,0x00,0x00,0x00,0x00,0x9a,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9b,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7b,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0x7c,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x9c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x07,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x9d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x9e,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7d,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x7e,0x0e,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x7f,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x7e,0x0e, 0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0xb5,0x00, 0x31,0xad,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x6a,0x05,0x00,0x00,0x00, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2a,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x05,0x00,0x00,0x00,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2a, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x05,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0xbe,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x67,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67, 0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x67,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x07, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x07,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x07, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x07,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xbe,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x68,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc0,0x07, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x68, 0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc5,0x07,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05, 0x00,0xae,0x00,0x29,0x03,0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x80,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa1,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x80,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x80,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa1,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x80,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa0,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x80,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xa1,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x80, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x80,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa0,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x80,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa1,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa2,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x81,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x81,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xa2,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x81,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa3,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x81,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa2,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x81,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xa3,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x81, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x81,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa2,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x81,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa3,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x82,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x82,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xa4,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x82,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa5,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x82,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa4,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x82,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xa5,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x82, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x82,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa4,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x82,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa5,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa6,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x83,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x83,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xa6,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x83,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa7,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x83,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa6,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x83,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xa7,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x83, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x83,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa6,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x83,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa7,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x84,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x84,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x84,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x84,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xa8,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x84,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x84, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x84,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x84,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa9,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x85,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xab,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x85,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x85,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x85,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xaa,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x85,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x85, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x85,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x85,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xab,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x86,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xad,0x07, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x86,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x86,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x86,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xac,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x86,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x86, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x86,0x0e,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xac,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x86,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x07,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x87,0x0e,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x88,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x0e, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x88,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29, 0x03,0x00,0x00,0x00,0x87,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x88,0x0e,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x89,0x0e,0x00,0x00,0x00,0x02, 0x00,0x04,0x00,0x88,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x87,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88,0x0e,0x00,0x00,0x00,0x01,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x89,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x88, 0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0xaf,0x00,0x31,0xae,0x00, 0x29,0x04,0x00,0x00,0x00,0x8a,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8b,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8c,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8b,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x8a,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8b,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8c,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x8b,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x8a,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x8b,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x8c,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8b,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xae,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xbe, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xaf,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x8d,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8e,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8f,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8e,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x8d,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8e,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x8f,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x8e,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x8d,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x8e,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x8f,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8e,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb0,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xbf, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb1,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x90,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x91,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x91,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x90,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x91,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x92,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x91,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x90,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x91,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x92,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x91,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb2,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc0, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb3,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x93,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x94,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x94,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x93,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x94,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x94,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x93,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x94,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x95,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x94,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc1, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb5,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x96,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x97,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x98,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x97,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x96,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x97,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x98,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x97,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x97,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x98,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x97,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb6,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc2, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb7,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x99,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9a,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9b,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x9a,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x99,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9a,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9b,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x9a,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x99,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x9a,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x9b,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9a,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc3,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb8,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc3, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb9,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x9c,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9d,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x0e,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x9d,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x9c,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9d,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x9d,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x9c,0x0e,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0x9e,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9d,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc4,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xba,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc4, 0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xbb,0x07,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0xbc,0x07,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x9f,0x0e, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x9f,0x0e,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0xbc,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x9f,0x0e,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x9f,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xbc,0x07,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0x9f,0x0e,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x9f,0x0e,0x00,0x00, 0x02,0x01,0x23,0x01,0x31,0xaf,0x00,0x29,0x04,0x00,0x00,0x00,0xc5,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa0,0x0e,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xc5,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa1,0x0e,0x00,0x00,0x00, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xa9,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xa9,0x00,0xb2,0x00,0x2c,0x00, 0x04,0x02,0xaa,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0xaa,0x80,0xb0,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x0d, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x03,0x07,0x00,0xa2,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x07,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x07,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xc9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xca,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xca, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xcb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xcc,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xcc,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0xc1,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xcd, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xce,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xce,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0xc2,0x07,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xab,0x00,0x00,0x66,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xab,0x80, 0xb5,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xcf,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc3,0x07,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0xb5,0x00,0x31,0xb0,0x00,0x32,0x00,0x79,0x00,0xb1,0x00,0x2b,0x00, 0x02,0xac,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xac,0x80,0xb5,0x00,0x25, 0x00,0x00,0x00,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xd0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xa7,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0xbe,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd1,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd2,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0xbf,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd3,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd4,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xd4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x07,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaa,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xd6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc1,0x07,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xd7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd8, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc2,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xda,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xda,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0xc3,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdb, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdc,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xdc,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0xc4,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xdd,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc5,0x07, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xb1,0x00,0x25,0x00,0x00, 0x00,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xde,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xae,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0xbe,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdf,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaf,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xe0,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe1,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb0,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xe3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xe4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xe4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc1,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xe5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xe6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0xc2,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe8,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0xc3,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe9,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc4, 0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xb2,0x00,0x2c,0x00, 0x04,0x02,0xad,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0xad,0x00,0xb3,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x0d, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x03,0x07,0x00,0xb4,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x07,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xeb,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xec,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x07,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xed,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xee, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x07,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x02,0xae,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xae,0x00,0xb5,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xef,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xef,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xc1, 0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xb5,0x00,0x31,0xb3,0x00,0x2c,0x00, 0x00,0x02,0xaf,0x00,0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0xaf,0x00,0xb4,0x00,0x2c,0x00,0x00,0x02,0xb0,0x00,0x00, 0x66,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00, 0xb0,0x80,0xb5,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00, 0xb7,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x07,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0xb5,0x00,0x31,0xb4,0x00,0x25,0x00,0x00,0x00,0x00,0x43,0x0d,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x43,0x0d,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x03,0x07,0x00,0xb8,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xbe,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xf2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0d, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xf2,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x07,0x00,0x00,0x00,0x00,0x31,0xb5, 0x00,0x10,0x00,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xf3,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x2c,0x00,0x04,0x02,0xb1,0x00,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0xb1,0x80,0xf1,0x00,0x01, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0xf4,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00, 0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x06,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x07,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xb2,0x00,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x06,0x00, 0xe9,0x00,0x29,0x00,0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0xb6,0x00,0x29,0x00,0x00,0x00,0x00, 0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0xb9,0x00,0x31,0xb6,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x6a,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xfb,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x00,0xb7, 0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xb9,0x00,0x31,0xb7,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xba,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x05,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x02,0x00,0xb8,0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00, 0x00,0xb9,0x00,0x31,0xb8,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x0a,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x68,0x05, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x31,0xb9,0x00,0x29,0x00,0x00,0x00,0x00,0xfe, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x01,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x00,0x02,0xb3,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0xb3,0x00,0xbb,0x00,0x31,0xba,0x00,0x24,0x00,0x00, 0x00,0x00,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0f,0x00,0x00,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0xfe,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xfe,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xb4,0x00,0x00,0xfe,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0xb4,0x80, 0xba,0x00,0x24,0x03,0x00,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x31,0xbb, 0x00,0x2c,0x00,0x04,0x02,0xb5,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0xb5,0x00,0xd3,0x00,0x2c,0x00,0x00,0x02, 0xb6,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00, 0x00,0x32,0x00,0xb6,0x00,0xc7,0x00,0x2c,0x00,0x00,0x02,0xb7,0x00,0x00,0xfb,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0xb7,0x80, 0xf1,0x00,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf9,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0c,0x00,0x00, 0x02,0x00,0xf9,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xf9,0x07, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x18, 0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0d,0x00,0x00, 0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a,0x05, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x19, 0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0e,0x00,0x00, 0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x69,0x05, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x1a, 0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x68,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0x07,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0f,0x00,0x00, 0x02,0x00,0x68,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x68,0x05, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x1b, 0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x68,0x05,0x00,0x00,0x07,0x00, 0x22,0x01,0x32,0x00,0x05,0x00,0xbc,0x00,0x29,0x03,0x00,0x00,0x00,0x02,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x02,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x03, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x02,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x03,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x06,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x05, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x06,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x04,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x05,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x0a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x07, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x0a,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x06,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x07,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x08,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x0e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x09, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x0e,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x08,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x0e,0x00,0x00,0x02,0x00, 0x09,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x12,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0b, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x12,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x0a,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x12,0x00,0x00,0x02,0x00, 0x0b,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x16,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0d, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x16,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x0c,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x0d,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x1a,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x0f, 0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x1a,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xbd,0x0e,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x0e,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x1a,0x00,0x00,0x02,0x00, 0x0f,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x0e,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xbf,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00, 0x1e,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x0e,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xbd,0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbf, 0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xbd,0x0e,0x00,0x00,0x1e,0x00,0x24,0x01, 0x29,0x04,0x00,0x00,0x00,0xbe,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbd,0x0e, 0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xbf,0x0e,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xbd,0x0e,0x00,0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00,0x00, 0xbd,0x00,0x31,0xbc,0x00,0x29,0x04,0x00,0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc2,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x02,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc2,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x00, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xc2,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x11,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc3,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc4,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x06,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xc3,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc4,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xc3,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x04, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc5,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc6,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x0a,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xc5,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc6,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xc5,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x08, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xc6,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x15,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc7,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xc8,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x0e,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xc7,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xc8,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xc7,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x0c, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xc8,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x16,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x17,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xc9,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xca,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x12,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xc9,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xca,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xc9,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x10, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xca,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x18,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x19,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xcc,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x16,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xcb,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x14, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcc,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x1a,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x1b,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x0e,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xce,0x0e,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x1a,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x0e,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x0e,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0xcd,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x18, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xce,0x0e,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x1d,0x08,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x1f,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x1e,0x02,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xc1, 0x0e,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x08,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0xc1,0x0e,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x1e,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xc1,0x0e,0x00,0x00,0x1c, 0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x1f,0x08,0x00,0x00,0x00,0x01,0x00,0x03, 0x00,0xc1,0x0e,0x00,0x00,0x1e,0x01,0x23,0x01,0x31,0xbd,0x00,0x29,0x04,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xcf,0x0e,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x1e,0x00,0x00,0x02,0x00, 0xd0,0x0e,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xb8,0x00,0x00,0xfa, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xb8, 0x80,0xbf,0x00,0x31,0xbe,0x00,0x29,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x23,0x08,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x20,0x08,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x23,0x08,0x00,0x00,0x07,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x23,0x08,0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x20,0x08,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x23,0x08,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x08,0x00,0x00, 0x13,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0x23,0x08,0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x20, 0x08,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x23,0x08,0x00,0x00,0x1b,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x23,0x08, 0x00,0x00,0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd1,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x28,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x10,0x00, 0x21,0x01,0x00,0xd2,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x10,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x20,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x20, 0x08,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60, 0xff,0x01,0x00,0x02,0x00,0x20,0x08,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x10,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x20,0x08,0x00,0x00,0x00, 0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0x00,0x01,0x00,0x02, 0x00,0x20,0x08,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00, 0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x20,0x08,0x00,0x00,0x00,0x05,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x20,0x08,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0x01,0x01, 0x00,0x02,0x00,0x20,0x08,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x22,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xb9,0x00,0x00,0xfa,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xb9,0x80, 0xbf,0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xbe,0x00,0x31,0xbf, 0x00,0x2c,0x00,0x04,0x02,0xba,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xba,0x00,0xc3,0x00,0x2c,0x00,0x04,0x02, 0xbb,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00, 0x00,0x32,0x00,0xbb,0x80,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0x24,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd4,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0xd5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x29,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x29,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x2a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2b, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2b,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2d,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23, 0x08,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xbc,0x00,0x00,0xf8,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xbc,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2f, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x30,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x23,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x31,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x31,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x32,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x32,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x33,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x33,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x34, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xdd,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x36,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xdf,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x00,0x01,0x00,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x37,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xe0,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00, 0x23,0x08,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x01,0x01, 0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x39,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe2,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x02,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x3b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x3b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x3c, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3c,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3e,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe4,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23, 0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x3f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x41,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x41,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x42,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x42,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x43,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0x44,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x45,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe7,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x46,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe8,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60, 0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x47,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x48,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xea, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x49,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xeb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00, 0xf1,0x00,0x31,0xc1,0x00,0x32,0x00,0xb2,0x00,0xc2,0x00,0x2b,0x00,0x02,0xbd,0x00, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xbd,0x80,0xf1,0x00,0x25,0x00,0x00,0x00, 0x00,0x4a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x4b,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xed,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x23,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4d,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xee,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x4d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xef,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x4f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x52,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x53,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x54, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x55,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x55,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x23,0x08,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x56,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x57,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x59,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x5a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5a,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x5b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5c, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5c,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5d,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23, 0x08,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x5e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x5f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x5f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x60,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x60,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x61,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x62,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x23,0x08,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x63,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf8,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x64,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x65,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xf9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfa,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xfb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x68,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x02, 0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x69,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xfd,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6a,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00, 0x60,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0xf1, 0x00,0x31,0xc2,0x00,0x25,0x00,0x00,0x00,0x00,0x6c,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x6d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x01,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x6e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x6f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6f,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x70,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x71, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x71,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x04,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x73,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23, 0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x75,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x05,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x75,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x76,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x77,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x77,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x79,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x79,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x7a,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7a,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x08,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x7c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x7d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x7e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7e, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7f,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7f,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x80,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x80,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x23,0x08,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x81,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x81,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08, 0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x82,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x09,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x83, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0a, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00, 0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x85,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0b,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x86,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x0c,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0d,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x02,0x01,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0e,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0f,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x03, 0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xc3,0x00,0x2c,0x00,0x04,0x02,0xbe,0x00,0x00, 0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0xbe,0x00,0xc5,0x00,0x25,0x00,0x00,0x00,0x00,0x8a,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x11,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x8c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x8d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8d,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x8e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8f,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xbf,0x00,0x00,0xf8, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xbf, 0x00,0xc4,0x00,0x01,0x00,0x00,0x00,0x00,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x14,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x92,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x92,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x93,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x93,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x23,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x94,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x94,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x95,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0, 0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x96,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x16,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x97,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x17,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x00, 0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x18,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9a,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00, 0xe0,0x01,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xc4,0x00,0x01,0x00,0x00,0x00,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23, 0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x9c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x9d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x01,0x01, 0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x9e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1a,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23, 0x08,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa0,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x00,0x01,0x00, 0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa1,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1c,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x23,0x08,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xc5,0x00, 0x2c,0x00,0x00,0x02,0xc0,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xc0,0x00,0xc6,0x00,0x2c,0x00,0x00,0x02,0xc1, 0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x32,0x00,0xc1,0x80,0xf1,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x1d,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xa3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0xa4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa4,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa5, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x60,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x1f,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08, 0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xc6,0x00,0x25,0x00,0x00, 0x00,0x00,0xa6,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa7,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x21,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0x23,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa9,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xa9,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0xaa,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xaa,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xab,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xab,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x23,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0x60, 0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xad,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x24,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x23,0x08,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0xf1,0x00, 0x31,0xc7,0x00,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xf9,0x07,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0c,0x00, 0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xcf,0x08,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xf9, 0x07,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0x18,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xcf,0x08,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0d,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xcf,0x08,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xcf,0x08,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x69,0x05,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0e,0x00, 0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xcf,0x08,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x69, 0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0x1a,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xcf,0x08,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x69,0x05,0x00,0x00,0x07, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xc2,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xc2,0x80,0xc9,0x00,0x31,0xc8, 0x00,0x29,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf, 0x08,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0xcf,0x08,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xcf,0x08,0x00,0x00,0x0a, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x03,0x00,0x02, 0x00,0xcf,0x08,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x08, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xcf,0x08,0x00,0x00,0x12,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xcf,0x08,0x00, 0x00,0x16,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x00,0x06, 0x00,0x02,0x00,0xcf,0x08,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xae,0x08,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xcf,0x08,0x00,0x00,0x1e,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01, 0x11,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0x25,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0xfe, 0x01,0x00,0x02,0x00,0xae,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x11,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xae,0x08,0x00,0x00,0x00,0x01, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00, 0xae,0x08,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00, 0xe0,0xff,0x01,0x00,0x02,0x00,0xae,0x08,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x11,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xae,0x08,0x00,0x00, 0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0x00,0x01,0x00, 0x02,0x00,0xae,0x08,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11, 0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xae,0x08,0x00,0x00,0x00,0x06,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xae,0x08, 0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb0,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x04,0x02,0xc3,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xc3,0x80,0xc9,0x00,0x29,0x00,0x00, 0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xc8,0x00,0x31,0xc9,0x00,0x32,0x00,0x05,0x00, 0xca,0x00,0x29,0x03,0x00,0x00,0x00,0xb1,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb1,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb1, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb2,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb1,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb2,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb3,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb4,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb3,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x04,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb4,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb3, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x04,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb4,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x06,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x04, 0x00,0x00,0x02,0x00,0xb3,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xb4,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb5,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb5,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x08,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb5, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x08,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb6,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x0a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x08, 0x00,0x00,0x02,0x00,0xb5,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0xb6,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb7,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x0c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb7, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x0c,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x0e,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0xb7,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0xb8,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x10,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb9, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x10,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x12,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0xba,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x14,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbb, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x14,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x16,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x14, 0x00,0x00,0x02,0x00,0xbb,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0xbc,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbd,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x08,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xbd,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x18,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbe,0x08,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbd, 0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x18,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xbe,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x1a,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x26,0x0f,0x00,0x00,0x18, 0x00,0x00,0x02,0x00,0xbd,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x26,0x0f,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0xbe,0x08,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x27,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0x26,0x0f,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x0f,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x0f,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0x27,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x26,0x0f,0x00,0x00, 0x1c,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x0f,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x26,0x0f,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x27, 0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f,0x00,0x00,0x1c,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x28,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x26,0x0f, 0x00,0x00,0x1e,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0xcb,0x00,0x31,0xca,0x00,0x29, 0x04,0x00,0x00,0x00,0x29,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x29,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x2b,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x29,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x2b,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbf,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x2c,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2d,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x06,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x2c,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x04,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x2d,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x06,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x2c,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x2d,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x06, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0xc1,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc2,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x2e,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x2f,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x0a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x2e,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x08,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x2f,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x0a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x2e,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x2f,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x0a, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0xc3,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0xc4,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x30,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x0e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x30,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x0c,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x31,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x0e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x30,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x31,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x0e, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0xc5,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0xc6,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x32,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x12,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x32,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x10,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x33,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x12,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x32,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x33,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x12, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0xc7,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x12,0x00,0x00,0x02,0x00,0xc8,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x34,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x35,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x16,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x34,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x14,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x35,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x16,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x34,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x35,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x16, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x14,0x00,0x00,0x02, 0x00,0xc9,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x16,0x00,0x00,0x02,0x00,0xca,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x36,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x37,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x1a,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x36,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x18,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x37,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x1a,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x36,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x37,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x1a, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0xcb,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0xcc,0x08,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xcd,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x2a,0x0f,0x00, 0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x08,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x1e,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xcd,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a,0x0f,0x00,0x00,0x1c,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x08,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x2a, 0x0f,0x00,0x00,0x1e,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xcd,0x08,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x1c,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xce,0x08,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x2a,0x0f,0x00,0x00,0x1e, 0x01,0x23,0x01,0x31,0xcb,0x00,0x29,0x04,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x38,0x0f,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0xcf,0x08,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x39,0x0f,0x00,0x00,0x00,0x00, 0x22,0x01,0x2c,0x00,0x04,0x02,0xc4,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xc4,0x00,0xcf,0x00,0x2c,0x00,0x04, 0x02,0xc5,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xc5,0x80,0xcd,0x00,0x25,0x00,0x00,0x00,0x00,0xd0,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd1,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x02,0x07,0x00,0x3b,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd2,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xd3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xd4,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd4,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xd5,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd5,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd6,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xcf,0x08,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xc6,0x00,0x00,0xf8,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xc6,0x00,0xcc, 0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xd7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x3d,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0xcf,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd8,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xda,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x3f,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdb,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xdc,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x41,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x02,0x32,0x00,0x00,0x00,0xf1, 0x00,0x31,0xcc,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xdd,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80, 0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xde,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x42,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0xcf,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xdf,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe0,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdf,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe1,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x44,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x45,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe4, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x47,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xcd,0x00,0x32,0x00,0xb2, 0x00,0xce,0x00,0x2b,0x00,0x02,0xc7,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0xc7,0x80,0xf1,0x00,0x25,0x00,0x00,0x00,0x00,0xe5,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xe6,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x49,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xe8,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe8,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe9, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe9,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xea,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf, 0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xec,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xed,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xed,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xee,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xee,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xef,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf1,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x4c,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf2,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4d,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40, 0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x4e,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf4,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf5,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x50,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xf6,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x51,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf, 0x08,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x03,0x32,0x00, 0x00,0x00,0xf1,0x00,0x31,0xce,0x00,0x25,0x00,0x00,0x00,0x00,0xf8,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf9,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x53,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x54,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xfb,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xfb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xfc,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfc,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfd, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfd,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xfe,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf, 0x08,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xff,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xff,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00, 0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x01,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x56,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf, 0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x57,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x58,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0xcf,0x08,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x01, 0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x06,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x5a,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x07,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00, 0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5c,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x03,0x32,0x00,0x00,0x00,0xf1, 0x00,0x31,0xcf,0x00,0x2c,0x00,0x04,0x02,0xc8,0x00,0x00,0xf8,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xc8,0x00,0xd1,0x00,0x25, 0x00,0x00,0x00,0x00,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x5e,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0b,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xcf,0x08,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x0c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00, 0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xc9,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xc9,0x00,0xd0,0x00,0x01,0x00, 0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x0d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0d,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0e,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5f,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x10,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x60,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x11,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00, 0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x62,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x01,0x32,0x00,0x00,0x00, 0xf1,0x00,0x31,0xd0,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x13,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x14,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x15, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x64,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x65,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x01,0x32,0x00,0x00, 0x00,0xf1,0x00,0x31,0xd1,0x00,0x2c,0x00,0x00,0x02,0xca,0x00,0x00,0xf8,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xca,0x00,0xd2, 0x00,0x2c,0x00,0x00,0x02,0xcb,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xcb,0x80,0xf1,0x00,0x25,0x00,0x00,0x00, 0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x17,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x66,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xcf,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x18,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x40,0x00, 0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xd2,0x00,0x25,0x00,0x00,0x00,0x00,0x19,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1a,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x68,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x02,0x07,0x00,0x69,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1b,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x1b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x08,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x1c,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6a,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00, 0xcf,0x08,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1d,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6b,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0xc0,0x00,0x32, 0x00,0x00,0x00,0xf1,0x00,0x31,0xd3,0x00,0x2c,0x00,0x00,0x02,0xcc,0x00,0x00,0xfb, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0xcc, 0x00,0xdd,0x00,0x2c,0x00,0x00,0x02,0xcd,0x00,0x00,0xfb,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xcd,0x80,0xf1,0x00,0x29,0x03, 0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xf9,0x07,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xf9,0x07, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x30,0x09,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x05,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x18,0x00,0x00,0x02,0x00, 0xf9,0x07,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x30,0x09,0x00, 0x00,0x1c,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00, 0x04,0x02,0xce,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0xce,0x80,0xd5,0x00,0x31,0xd4,0x00,0x29,0x00,0x00,0x00, 0x00,0x1e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x30,0x09,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1e,0x09,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x30,0x09,0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x30,0x09,0x00,0x00, 0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x30,0x09,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1e, 0x09,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x30,0x09,0x00,0x00,0x14,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x30,0x09, 0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x00, 0x07,0x00,0x02,0x00,0x30,0x09,0x00,0x00,0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x1f,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x12,0x00,0x00,0x00,0x00, 0x30,0x09,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x6c,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x1e, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0, 0xfe,0x01,0x00,0x02,0x00,0x1e,0x09,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x12,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x1e,0x09,0x00,0x00,0x00, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0xff,0x01,0x00,0x02, 0x00,0x1e,0x09,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00, 0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x1e,0x09,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x1e,0x09,0x00, 0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0x01,0x01, 0x00,0x02,0x00,0x1e,0x09,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x12,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x1e,0x09,0x00,0x00,0x00,0x07,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0xcf,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xcf,0x80,0xd5,0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0xd4,0x00,0x31,0xd5,0x00,0x32,0x00,0x05,0x00,0xd6,0x00,0x29,0x03,0x00, 0x00,0x00,0x21,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x00, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x21,0x09,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x0f,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x21,0x09, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x22,0x09,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x22,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x04,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x22,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d, 0x0f,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x08, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x23,0x09,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x0f,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x23,0x09, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x0f,0x00,0x00,0x08,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x23,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x24,0x09,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x24,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x0c,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x24,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d, 0x0f,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00, 0x0c,0x00,0x00,0x02,0x00,0x24,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x25,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x10, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x25,0x09,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x0f,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x09, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x0f,0x00,0x00,0x10,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x25,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x26,0x09,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x26,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x14,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x26,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d, 0x0f,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0x26,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x27,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x18, 0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x27,0x09,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x6d,0x0f,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x27,0x09, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d,0x0f,0x00,0x00,0x18,0x01,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x6d,0x0f,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x27,0x09,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x6e,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00, 0x6e,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x6d,0x0f,0x00,0x00,0x1c,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x6e,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x6d, 0x0f,0x00,0x00,0x1c,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0xd7,0x00,0x31,0xd6,0x00, 0x29,0x04,0x00,0x00,0x00,0x6f,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f, 0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x0f,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x6f,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x0f,0x00,0x00,0x00,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x0f,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x71,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00, 0x04,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x71,0x0f,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x70,0x0f,0x00,0x00,0x04,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x29,0x09,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x72,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f, 0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x0f,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x08,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x72,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x0f,0x00,0x00,0x08,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x2a,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x0f,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x73,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00, 0x0c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x73,0x0f,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x70,0x0f,0x00,0x00,0x0c,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x2b,0x09,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x74,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f, 0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x0f,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x10,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x74,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x0f,0x00,0x00,0x10,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x10,0x00,0x00,0x02,0x00, 0x2c,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x0f,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x75,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00, 0x14,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x75,0x0f,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x70,0x0f,0x00,0x00,0x14,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x2d,0x09,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x76,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f, 0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x0f,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x18,0x00,0x24,0x01,0x29,0x05,0x00,0x00, 0x00,0x76,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x70,0x0f,0x00,0x00,0x18,0x01, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x18,0x00,0x00,0x02,0x00, 0x2e,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2f,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x0f,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x2f,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x70,0x0f,0x00,0x00, 0x1c,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x2f,0x09,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0x70,0x0f,0x00,0x00,0x1c,0x01,0x23,0x01,0x31,0xd7,0x00,0x29,0x04,0x00, 0x00,0x00,0x30,0x09,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x77,0x0f,0x00,0x00,0x00, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xd0,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xd0,0x00,0xda,0x00,0x2c,0x00, 0x04,0x02,0xd1,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0xd1,0x80,0xd8,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x33,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x79,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x34,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7a,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7b,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xd2, 0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0xd2,0x80,0xf1,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x36,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7c,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x02,0x32, 0x00,0x00,0x00,0xf1,0x00,0x31,0xd8,0x00,0x32,0x00,0xb2,0x00,0xd9,0x00,0x2b,0x00, 0x02,0xd3,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xd3,0x80,0xf1,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x37,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x38,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x7d,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00, 0x30,0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x39,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7e,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x3a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x7f,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3b,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x80,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00, 0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x3c,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x81,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3d,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x82, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x83,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x03,0x32,0x00,0x00,0x00, 0xf1,0x00,0x31,0xd9,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x84,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x41,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x85,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x42,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x43,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x87,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x30,0x09,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x44,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x45,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x89,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xf1,0x00,0x31, 0xda,0x00,0x2c,0x00,0x04,0x02,0xd4,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xd4,0x00,0xdb,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x46,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x47, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x8a,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x48,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8b,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x01,0x2c,0x00,0x00, 0x02,0xd5,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xd5,0x00,0xf1,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x49,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8c,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80, 0x01,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xdb,0x00,0x2c,0x00,0x00,0x02,0xd6,0x00, 0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32, 0x00,0xd6,0x00,0xdc,0x00,0x2c,0x00,0x00,0x02,0xd7,0x00,0x00,0xf8,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xd7,0x80,0xf1,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0xf1,0x00,0x31,0xdc,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30, 0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4a,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8d,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x80,0x00,0x32,0x00, 0x00,0x00,0xf1,0x00,0x31,0xdd,0x00,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5d,0x09,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x08,0x00,0x00,0x02, 0x00,0xf9,0x07,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09, 0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0xf9,0x07,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x14,0x00, 0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0xf9, 0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x5d,0x09,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x09,0x00,0x00,0x02, 0x00,0x6a,0x05,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09, 0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x6a,0x05,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x15,0x00, 0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x6a, 0x05,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xd8,0x00,0x00,0xfa,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xd8,0x80, 0xdf,0x00,0x31,0xde,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x09,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x4b,0x09,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x5d,0x09,0x00,0x00,0x05,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x5d, 0x09,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0x5d,0x09,0x00,0x00,0x0d,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x4b,0x09,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x5d,0x09,0x00,0x00,0x11, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0x5d,0x09,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x09, 0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x5d,0x09,0x00,0x00,0x19,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x5d,0x09,0x00, 0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4c,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd1,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x00,0x01,0x13,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x0e,0x00,0x21, 0x01,0x00,0x8e,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13, 0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x4b,0x09, 0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0xff, 0x01,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x13,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00, 0x4b,0x09,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00, 0xe0,0x00,0x01,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x13,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x4b,0x09,0x00,0x00, 0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0x01,0x01,0x00, 0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4d, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xd9,0x00,0x00,0xfa,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xd9,0x80,0xdf, 0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0xde,0x00,0x31,0xdf,0x00, 0x32,0x00,0x05,0x00,0xe0,0x00,0x29,0x03,0x00,0x00,0x00,0x4e,0x09,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x4e,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8f,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x4f,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00, 0x04,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x4f,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x8f,0x0f,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x4f, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8f,0x0f,0x00,0x00,0x04,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4f,0x09, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x50,0x09,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x08,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x50,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x08,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x50,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8f,0x0f,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x50,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x51,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00, 0x0c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x51,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x8f,0x0f,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x51, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8f,0x0f,0x00,0x00,0x0c,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x51,0x09, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x09,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x10,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x52,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x10,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x52,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8f,0x0f,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00, 0x00,0x10,0x00,0x00,0x02,0x00,0x52,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x53,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00, 0x14,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x8f,0x0f,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x53, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8f,0x0f,0x00,0x00,0x14,0x01,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x53,0x09, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x54,0x09,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x18,0x02,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0x54,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00,0x18,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x54,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x8f,0x0f,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x8f,0x0f,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x54,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x90,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x0f,0x00,0x00, 0x1c,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0x90,0x0f,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0x8f,0x0f,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x90, 0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x8f,0x0f,0x00,0x00,0x1c,0x01,0x23,0x01, 0x32,0x00,0x00,0x00,0xe1,0x00,0x31,0xe0,0x00,0x29,0x04,0x00,0x00,0x00,0x91,0x0f, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x91,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x91,0x0f,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x09,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x93,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92, 0x0f,0x00,0x00,0x04,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x93,0x0f,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x04,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x93,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x04, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x04,0x00,0x00,0x02, 0x00,0x56,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x94,0x0f, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x08,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x94,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00, 0x00,0x08,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x94,0x0f,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x08,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x57,0x09,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92, 0x0f,0x00,0x00,0x0c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x95,0x0f,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x0c,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x95,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x0c, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x96,0x0f, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x10,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x96,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00, 0x00,0x10,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x0f,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x10,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x97,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92, 0x0f,0x00,0x00,0x14,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x97,0x0f,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x14,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x97,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x14, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x14,0x00,0x00,0x02, 0x00,0x5a,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x98,0x0f, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x18,0x02,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x98,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00, 0x00,0x18,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0x98,0x0f,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x18,0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x5b,0x09,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x92, 0x0f,0x00,0x00,0x1c,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x5c,0x09,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x92,0x0f,0x00,0x00,0x1c,0x00,0x24,0x01,0x29,0x05,0x00, 0x00,0x00,0x5c,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x92,0x0f,0x00,0x00,0x1c, 0x01,0x23,0x01,0x31,0xe1,0x00,0x29,0x04,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x99,0x0f,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x04,0x02, 0xda,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x32,0x00,0xda,0x00,0xe5,0x00,0x2c,0x00,0x04,0x02,0xdb,0x00,0x00,0xf8,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xdb,0x80, 0xe3,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x5f,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x9b,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x60,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x61,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x61,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x62,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x5d,0x09,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x63,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x63,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x64,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x64,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x02, 0x2c,0x00,0x00,0x02,0xdc,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xdc,0x00,0xe2,0x00,0x01,0x00,0x00,0x00,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x65,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9d,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x66,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x67,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x9e,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x68,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9f, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00, 0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x69,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x6a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa1,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d, 0x09,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xe2,0x00,0x01,0x00, 0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x6b,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x6b,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6c,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa2,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0x6d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x6e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xa3,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6f,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa4, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00, 0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x70,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x71,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa6,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d, 0x09,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa7,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x02,0x32,0x00, 0x00,0x00,0xf1,0x00,0x31,0xe3,0x00,0x32,0x00,0xb2,0x00,0xe4,0x00,0x2b,0x00,0x02, 0xdd,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xdd,0x80,0xf1,0x00,0x25,0x00, 0x00,0x00,0x00,0x73,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x74, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xa9,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x76,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d, 0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x77,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x77,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x78,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x78,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x79,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x79,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x7a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7a,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7b,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x5d,0x09,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x7c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00, 0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x7d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xab,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x7e,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7f,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xac,0x0f, 0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00, 0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xad,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xae,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09, 0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xaf,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x02,0x01,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x83,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xb0,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x03,0x01, 0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x85,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb2,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xe4, 0x00,0x25,0x00,0x00,0x00,0x00,0x86,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x87,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xb4,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x88,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x89,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8a,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d, 0x09,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x8b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x8c,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x8c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8d,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x8e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8e,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x8f,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb6,0x0f,0x00,0x00,0x00, 0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0x90,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x91,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb7,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00, 0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x92,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20, 0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x93,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xba, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00, 0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x95,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbb,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00, 0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x96,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xbc,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d, 0x09,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xe5,0x00,0x2c,0x00, 0x04,0x02,0xde,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0xde,0x00,0xe7,0x00,0x25,0x00,0x00,0x00,0x00,0x97,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x98,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbd,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x01,0x07,0x00,0xbe,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x99,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x99,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x9a,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9a, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x01,0x2c,0x00,0x00, 0x02,0xdf,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xdf,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9b,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x5d, 0x09,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x9c,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbf,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde, 0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00, 0x9d,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9e, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xc0,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09, 0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x01,0x00,0x00, 0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xa0,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xc2,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00, 0x5d,0x09,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xe6,0x00,0x01, 0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xa1,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xc3,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d, 0x09,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xa2,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc4,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa4,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xc5,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00, 0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xe7,0x00, 0x2c,0x00,0x00,0x02,0xe0,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xe0,0x00,0xe8,0x00,0x2c,0x00,0x00,0x02,0xe1, 0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x32,0x00,0xe1,0x80,0xf1,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa5,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0xc6,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xa6,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xc7,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e, 0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0xf1,0x00, 0x31,0xe8,0x00,0x25,0x00,0x00,0x00,0x00,0xa7,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xa8,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0xc9, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa9,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa9,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x5d,0x09,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf6, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xaa,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0xde,0x0e,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xab,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xcb,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xde,0x0e,0x00, 0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0xf1,0x00,0x31, 0xe9,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x08,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xba,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xac,0x09,0x00,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xba,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0xad,0x09,0x00,0x00,0x00,0x00,0x37,0x00, 0x06,0x00,0x20,0x08,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0xae,0x09,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00, 0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf9,0x07,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd1,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf9,0x07,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd2, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd3,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x07, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf9,0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xcd,0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xac,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x09,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd1,0x09,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xac,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd2, 0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd3,0x09,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xac,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xcd,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0xad,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x09,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd1,0x09,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0xad,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd2, 0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd3,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xad,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xad,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xcd,0x09,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xae,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0xae,0x09,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xcf,0x09,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0xae,0x09,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xae,0x09,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd1,0x09,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0xae,0x09,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd2, 0x09,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xae,0x09,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xd3,0x09,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xae,0x09, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0xae,0x09,0x00,0x00,0x07,0x00,0x22,0x01,0x32,0x00,0x05,0x00, 0xea,0x00,0x29,0x03,0x00,0x00,0x00,0xaf,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xcc,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xcc,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xaf,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xcc,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xcc,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xaf, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcc,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb0,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcc,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcc,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaf,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xcc,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb0,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xcd,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xcd,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb1,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xcd,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb2,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xcd,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb1, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcd,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb2,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcd,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcd,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb1,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xcd,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb2,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb3,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xce,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb4,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xce,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb3,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xce,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb4,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xce,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb3, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xce,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb4,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xce,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xce,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb3,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xce,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb4,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb5,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xcf,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xcf,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb5,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xcf,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb6,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xcf,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb5, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcf,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb6,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xcf,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xcf,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb5,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xcf,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb6,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb7,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xd0,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xd0,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb7,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd0,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xd0,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb7, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd0,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd0,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd0,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb7,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xd0,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xb8,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb9,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xd1,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xd1,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xb9,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd1,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xba,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xd1,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xb9, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd1,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xba,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd1,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd1,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb9,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xd1,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xba,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xbb,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xd2,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x09,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xd2,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xbb,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd2,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xbc,0x09,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xd2,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xbb, 0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd2,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xbc,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd2,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xd2,0x0f,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbb,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0xd2,0x0f,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xbc,0x09,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xd3,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00, 0xd4,0x0f,0x00,0x00,0x00,0x02,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xd5,0x0f,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0xd4,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xd3,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd4,0x0f,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xd5,0x0f,0x00,0x00,0x00,0x02,0x00, 0x04,0x00,0xd4,0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd3, 0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd4,0x0f,0x00,0x00,0x00,0x01,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xd5,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd4,0x0f, 0x00,0x00,0x02,0x01,0x23,0x01,0x32,0x00,0x00,0x00,0xeb,0x00,0x31,0xea,0x00,0x29, 0x04,0x00,0x00,0x00,0xd6,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xd7,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xd7,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd6,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd7,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xd7, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xd6,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xd7,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xd8,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xd7,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbd,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xbe,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xd9,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xda,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xdb,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xda,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xd9,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xda,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xdb,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xda, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xd9,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xda,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xdb,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xda,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbf,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc0,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xdc,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xdd,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xde,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xdd,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xdc,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdd,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xde,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xdd, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xdc,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xdd,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xde,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xdd,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc1,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc2,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xdf,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe0,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe1,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe0,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xdf,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe0,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe1,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe0, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xdf,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe0,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xe1,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe0,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc3,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc4,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xe2,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe3,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe4,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe3,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xe2,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe3,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe4,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe3, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe2,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe3,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xe4,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe3,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc5,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc6,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xe5,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe6,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xe7,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe6,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xe5,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe6,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xe7,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe6, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe5,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe6,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xe7,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe6,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd2,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc7,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd2,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc8,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xe8,0x0f,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xe9,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x0f,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xe9,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xe8,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe9,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xea,0x0f,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xe9, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xe8,0x0f,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xe9,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xea,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xe9,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc9,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x09, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xca,0x09,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xcb,0x09,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xeb,0x0f,0x00, 0x00,0x00,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x09,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0xeb,0x0f,0x00,0x00,0x02,0x02,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0xcb,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xeb,0x0f,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x09,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xeb, 0x0f,0x00,0x00,0x02,0x00,0x24,0x01,0x29,0x05,0x00,0x00,0x00,0xcb,0x09,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xeb,0x0f,0x00,0x00,0x00,0x01,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xcc,0x09,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xeb,0x0f,0x00,0x00,0x02, 0x01,0x23,0x01,0x31,0xeb,0x00,0x29,0x04,0x00,0x00,0x00,0xd4,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xec,0x0f,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0xd4,0x09,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xed,0x0f,0x00,0x00,0x00,0x00, 0x22,0x01,0x2c,0x00,0x04,0x02,0xe2,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xe2,0x00,0xee,0x00,0x2c,0x00,0x04, 0x02,0xe3,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xe3,0x80,0xec,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd5,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xee,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcd,0x09,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xd6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x09,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xd7,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd7,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xd8,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd8,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd9,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xd9,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xd1,0x09,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xe4,0x00,0x00,0xf8,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xe4,0x80,0xf1, 0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xda,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xda,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd2,0x09,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0xf1,0x00,0x31,0xec,0x00,0x32,0x00,0xb2,0x00,0xed,0x00,0x2b,0x00,0x02, 0xe5,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xe5,0x80,0xf1,0x00,0x25,0x00, 0x00,0x00,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xdb, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xef,0x0f,0x00,0x00,0x00,0x00, 0x21,0x01,0xcd,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdc,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xdc,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce, 0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0xdd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x09,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xde,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xde,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xdf,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xdf,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xd1,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe0,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe0,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xd2,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe1,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe1,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xd3,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xe2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd4,0x09,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xed,0x00,0x25,0x00,0x00,0x00, 0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe3,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0xcd,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe4,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x15,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xe4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x09,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe5,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdb,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0xe5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x09,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xe6,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe6, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xe7,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x0e,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe7,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xd1,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xe8,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xd2,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe9,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xe9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd3,0x09, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xee,0x00,0x2c,0x00,0x04, 0x02,0xe6,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xe6,0x00,0xef,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xea,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xf1,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcd,0x09,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xeb,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0xeb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x09,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xec,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0e,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xec,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xcf,0x09,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0xe7,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0xe7,0x00,0xf1,0x00,0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xed,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb9,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xed,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xf1,0x00,0x31,0xef,0x00,0x2c,0x00,0x00, 0x02,0xe8,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0xe8,0x00,0xf0,0x00,0x2c,0x00,0x00,0x02,0xe9,0x00,0x00,0xf8, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xe9, 0x80,0xf1,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xee,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xf2, 0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcd,0x09,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0xf1,0x00,0x31,0xf0,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x0e,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd3,0x0e,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xef,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03, 0x07,0x00,0xf3,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0xcd,0x09,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xf0,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x0e,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf0, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x09,0x00,0x00,0x00,0x00,0x31,0xf1,0x00, 0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e, 0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0xf3,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0xff,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf2,0x09,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf3,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf2,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf3,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf1,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xf1,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf1,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xff,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf4,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0xf4,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0xf4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xfc,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x0f,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf5,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf6, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0xf6,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xf6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xf7,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x0f,0x00, 0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xf8,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00, 0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xf8,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfe,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf9,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfe,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf5,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfa,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xfb,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x21, 0x01,0x0c,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xfb,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0xfc,0x09, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0xfb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf7,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfc,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x02,0x0a,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf3,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x03,0x02,0xea,0x00,0x00,0xf6,0x0f,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf4,0x0f,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0xea,0x00,0x00,0x01,0x0a, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x01,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff, 0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x66,0x02,0x24,0x00,0x00, 0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x66,0x49,0x24,0x00,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x55,0x52,0x64,0x02,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86,0x25,0x4a,0xa4,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x61,0x02,0x00,0x00,0x60,0x01,0x05,0x4b,0x54,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x60,0x06,0x45,0x49,0xe4,0x01,0x00, 0x56,0x64,0x01,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x49,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x49,0x84,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x60,0x86,0x84,0x52,0x24,0x02,0x05, 0x01,0x64,0x49,0x80,0x00,0x69,0x05,0x4b,0x68,0x02,0x4b,0x31,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x2c,0x00,0x05, 0x00,0x00,0x40,0x04,0x49,0x00,0x00,0x00,0x00,0xb0,0xbe,0x01,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x45,0x4a,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x41,0x03,0x00, 0x80,0x60,0x06,0x01,0x20,0x44,0x49,0x00,0x01,0x64,0x01,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x4a,0x44,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x41,0x06,0x20, 0x22,0x2e,0x4b,0x11,0x01,0x5b,0x04,0x00,0x00,0x60,0x06,0x44,0x4a,0x84,0x49,0x01, 0x06,0x44,0x4a,0x64,0x49,0x49,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x62,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0xc4,0x01,0x00,0x56,0x44,0x01,0x00,0x00,0x40,0x02,0x4b, 0xa8,0x2a,0x4b,0x11,0x4a,0x40,0x06,0x4a,0xa8,0x0a,0x4a,0x11,0x01,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x85,0x49,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x69,0x03,0x4a, 0x68,0x9a,0x4b,0x21,0x00,0x5b,0x02,0x00,0x00,0x60,0x06,0x84,0x49,0x64,0x02,0x01, 0x06,0x84,0x49,0x64,0x49,0x70,0x02,0x00,0x00,0x20,0x02,0x01,0x00,0x64,0x4a,0x00, 0x52,0x04,0x4a,0x00,0x00,0x70,0x02,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00, 0x35,0x1f,0x00,0x1f,0x00,0x61,0x00,0x02,0xe2,0x9e,0x30,0x11,0x00,0x70,0x00,0x00, 0x00,0x20,0x82,0x01,0x00,0x84,0x49,0x00,0x31,0x18,0x00,0x18,0x00,0x61,0x00,0x52, 0xe2,0x3e,0x31,0x11,0x00,0x61,0x00,0x49,0xe2,0x9e,0x30,0x11,0x00,0x70,0x00,0x00, 0x00,0x20,0x82,0x01,0x00,0x84,0x49,0x00,0x31,0x10,0x00,0x10,0x00,0x61,0x05,0x00, 0x80,0x10,0x01,0x01,0x31,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x75,0x49,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x20,0x82,0x01,0x00,0x84,0x49,0x00,0x31,0x08,0x00,0x08,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0x25,0x52,0x84,0x52,0x00,0x05,0x20,0x00,0x20,0x00,0x40,0x00,0x52, 0x68,0x5a,0x52,0x01,0x04,0x40,0x00,0x00,0x00,0x60,0x86,0x25,0x49,0x84,0x52,0x00, 0x05,0x60,0x00,0x60,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x45,0x48,0x44,0x01,0x00, 0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x25,0x48,0x44,0x01,0x00, 0x05,0x0c,0x00,0x0c,0x00,0x69,0x00,0x48,0x68,0x42,0x01,0x41,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x14,0x00,0x14,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0xe5,0x48,0x44,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0xc5,0x48,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0xa5,0x48,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x85,0x48,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x65,0x48,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x5b,0x00,0x00, 0x00,0x60,0x86,0x44,0x4b,0x44,0x02,0x05,0x01,0x54,0x52,0x08,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0xc5,0x01,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00, 0x00,0x60,0x86,0x85,0x01,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0xe5,0x49,0x84,0x49,0x00,0x05,0xf8,0xff,0xf8,0xff,0x40,0x00,0x00, 0x00,0x60,0x86,0xc5,0x49,0x84,0x49,0x00,0x05,0xf0,0xff,0xf0,0xff,0x40,0x00,0x49, 0x68,0x5a,0x49,0x81,0xfe,0x61,0x00,0x49,0xe2,0xae,0x30,0x11,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x04,0x02,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x6c,0x00,0x00,0x61,0x00,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x58,0x52,0x11,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x44,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00, 0x00,0x60,0x86,0x84,0x02,0x44,0x49,0x05,0x01,0x54,0x52,0xf8,0xff,0x31,0xa0,0x03, 0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x01,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x62,0x00,0x00, 0x00,0x60,0x86,0x85,0x4a,0x84,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x00,0x4a, 0xe2,0xae,0x31,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x44,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x5b,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x4a,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xc5,0x4a,0x84,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x44,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x74,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x4a,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xc5,0x4a,0xe4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x01,0x00,0x00,0x61,0x31,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x44,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x64,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x4a,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xc5,0x4a,0xc4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x00,0x00,0x00,0x61,0x32,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x44,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x4a,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x4a,0x68,0xa0,0x49,0x11,0x00,0x70,0x01,0x80, 0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x4b, 0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x2f,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x50,0x85,0x65,0x02,0x24,0x4b,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0xe0,0x05,0xe0,0x05,0x61,0x00,0x00, 0x00,0x68,0x06,0x01,0x00,0x24,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x4b, 0x68,0xca,0x4b,0x11,0x00,0x70,0x01,0x80,0x00,0x60,0x06,0x01,0x00,0x24,0x4b,0x00, 0x16,0xc4,0x4a,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0xff,0xff,0xff,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xe4,0x4a,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x38,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xe4,0x4a,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x20,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xe4,0x4a,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x69,0x00,0x00,0x61,0x20,0x0f,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x61,0x22,0x11,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15, 0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x1d, 0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d, 0x61,0x00,0x3f,0x10,0x00,0x61,0x23,0x12,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x1e, 0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x26, 0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e, 0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x06,0x2b,0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x68,0x60,0x16,0x11,0x00,0x61,0x00,0x03, 0x68,0x38,0x1a,0x11,0x00,0x61,0x00,0x03,0x68,0x98,0x1e,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x22,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x26,0x11,0x00,0x61,0x00,0x03, 0x68,0xa0,0x2a,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2e,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0xe0,0x03,0xe0,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x4a,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0f,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x02,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x35,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x36,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a, 0xa8,0xe2,0x4a,0x11,0x48,0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x39,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x07,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xdb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x3c,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x07,0x02,0x68,0x9a,0x0b,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x37,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xf4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05, 0x68,0x02,0x4b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x35,0x06,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xf6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xd7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xe8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xb9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x40,0x02,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x03, 0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08, 0x21,0x03,0x06,0x10,0x03,0x40,0x3a,0x07,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x05,0x05,0x68,0x02,0x0b,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x07,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x06,0x10,0x05,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x04,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x06,0x10,0x08,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xcd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xae,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x59,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0xa4,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x58,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0x93,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x31,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x30,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x33,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xc5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xb6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x31,0x97,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2b,0x00,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x32,0x00, 0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x35,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x37,0x08,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x09,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xd9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xca,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3a,0x05, 0x68,0x02,0x4b,0x21,0x00,0x69,0x00,0x06,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x08, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x31,0xfb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xfc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xfd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xee,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x69,0x02,0x02, 0x68,0x9a,0x08,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x09,0x21,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x3d,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x09,0xa8,0x0a,0x4b,0x11,0x48,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x31,0x07, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x31,0xe0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x07,0x05, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x07, 0x68,0x02,0x4b,0x21,0x00,0x40,0x05,0x0c,0x21,0x03,0x06,0x10,0x05,0x40,0x05,0x0d, 0x21,0x03,0x06,0x10,0x08,0x40,0x05,0x04,0x21,0x03,0x06,0x10,0x03,0x40,0x05,0x05, 0x21,0x03,0x06,0x10,0x0a,0x40,0x05,0x08,0x21,0x03,0x06,0x10,0x07,0x31,0xd2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xc4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x54,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0x99,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x31,0xfa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xfb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xec,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xdd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xce,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x40,0x3b,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x3f,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x69,0x30,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x07, 0x68,0x02,0x06,0x21,0x00,0x31,0xd2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xc4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x40,0x06,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x40,0x34,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x36,0x05, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x37,0x08,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x04,0x10,0x0a,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x4f,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x3f,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x31,0xd0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x06,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x30,0x04,0x61,0x02,0x2f,0x20,0x00,0x40,0x32,0x08, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xc4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x04,0x09,0x21,0x1b,0x04,0x10,0x02,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xf5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x4d,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x31,0xb9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x69,0x04,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x39,0x03,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x3f,0x07,0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x02, 0x68,0x9a,0x03,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x07,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x09,0x21,0x03,0x07,0x10,0x05,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xad,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4b,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x4b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x4a,0x01,0x04,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x7a,0x4a,0x01,0x06,0x31,0xaf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4a,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xe3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xd2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x33,0x03, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x4b,0x21,0x00,0x31,0xf4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xc5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06, 0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x49,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0f,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x61,0x22,0x11,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15, 0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x1d, 0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d, 0x61,0x00,0x3f,0x10,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03, 0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x29,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xc0,0x03,0xc0,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x04,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x33,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f, 0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b, 0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x69,0x38,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x39,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4b,0x21,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0c, 0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03,0x10,0x04,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x3d,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xb3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3b,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x04,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x32,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0c, 0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03, 0x21,0x03,0x04,0x10,0x08,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x3b,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x3b,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x39,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3a,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0x9f,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3f,0x06,0xa8,0x52,0x4b,0x11,0x48,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2b,0x00,0x00,0x69,0x00,0x08, 0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02,0x68,0x9a,0x4b,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05, 0x21,0x03,0x08,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08,0x10,0x07,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x40,0x31,0x09,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x33,0x05, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x32,0x0a,0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x48,0x40,0x05,0x0c,0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b, 0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04, 0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x40,0x04,0x0d, 0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x1b,0x08,0x10,0x02,0x31,0xf4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x38,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x39,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xfa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xeb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xdc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x69,0x00,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x07,0x61,0x02,0x2f,0x20,0x00,0x40,0x3c,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03,0x68,0x7a,0x02,0x21,0x00,0x31,0xfd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xde,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xcf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x03,0x08, 0x21,0x03,0x07,0x10,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04, 0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05, 0x68,0x02,0x09,0x21,0x00,0x31,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x31,0x08, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x30,0x04,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06, 0x21,0x03,0x07,0x10,0x0a,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x35,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xda,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x1b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b, 0x21,0x1b,0x04,0x10,0x02,0x31,0xfb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x33,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x69,0x37,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x38,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b,0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xbf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x32,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x32,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x4a,0x01,0x04,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x31,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x31,0xb4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x30,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xe4,0x4a,0x00, 0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x0c,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xe4,0x4a,0x00, 0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x30,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0d,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x11, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x19, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x29, 0x61,0x00,0x0b,0x10,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xc4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x40,0x03,0x40,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x6a,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0e,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x0d,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x61,0x31,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0d,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x15,0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1d, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x19,0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x21, 0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x25,0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x29, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x04,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x01,0x00,0x00,0x69,0x00,0x0c,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x03, 0x21,0x1b,0x0c,0x10,0x4a,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x40,0x00,0x06,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x09, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x38,0x03,0xa8,0x1a,0x4b,0x11,0x01,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x0a, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x03,0x21,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05, 0x21,0x03,0x0c,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x0c,0x10,0x07,0x40,0x05,0x0b, 0x21,0x03,0x0c,0x10,0x0a,0x40,0x05,0x04,0x21,0x1b,0x0c,0x10,0x02,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x29,0x00,0x00,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x01,0x03, 0x21,0x1b,0x0c,0x10,0x02,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x29,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x29,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x07,0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x05,0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0a,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x40,0x05,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x05,0x09, 0x21,0x03,0x03,0x10,0x08,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x69,0x04,0x0b,0x68,0x02,0x0a,0x21,0x00,0x40,0x3e,0x04, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3f,0x06,0xa8,0x32,0x4b,0x11,0x48,0x40,0x31,0x09, 0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x40,0x05,0x0c, 0x21,0x03,0x03,0x10,0x0b,0x69,0x05,0x02,0x68,0x9a,0x04,0x21,0x00,0x69,0x05,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x04, 0x68,0x02,0x4b,0x21,0x00,0x31,0xd0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x05,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08, 0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x0a,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x04,0x31,0xc3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x27,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x07,0xa8,0x52,0x4b,0x11,0x48,0x69,0x03,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x4a,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0a, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x36,0x04, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x37,0x06,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x04,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c, 0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08, 0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x26,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x09,0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x03,0x00,0x03,0x00,0x40,0x05,0x03, 0x21,0x1b,0x09,0x10,0x4a,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x09,0x10,0x07,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x25,0x00,0x00,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03, 0x21,0x1b,0x09,0x10,0x02,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x25,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x25,0x00,0x00,0x69,0x00,0x03,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x25,0x00,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x40,0x03,0x05,0x21,0x1b,0x03,0x10,0x02,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x24,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0e, 0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1e, 0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26, 0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b,0x10,0x00,0x61,0x21,0x0f, 0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x17, 0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x27, 0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x37,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xc4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0c,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x80,0x03,0x80,0x03,0x61,0x00,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xc4,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x6a,0x4a,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a,0x68,0xa0,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0e,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x12,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x16,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1a,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1e,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x22,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x26,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0e,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x16,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x12, 0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x16,0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1e, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x1a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x22,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x26,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x2a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x1a,0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x22, 0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x26,0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x2a, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x0a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xf4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x98,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x69,0x34,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x35,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x01,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x4b,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x1c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x37,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x3e,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x1a,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0xa4,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x1a,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x96,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x35,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xba,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x9b,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x07,0x03, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xad,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08,0x10,0x04,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08,0x10,0x07,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x40,0x3c,0x09,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3f,0x05, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x3e,0x0a,0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x48,0x40,0x05,0x0c,0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b, 0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04, 0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x40,0x04,0x0d, 0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x1b,0x08,0x10,0x02,0x31,0xf1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x17,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xa5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x35,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xf6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xe7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x00,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x07, 0x61,0x02,0x2f,0x20,0x00,0x40,0x38,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03, 0x68,0x7a,0x02,0x21,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xcc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x07,0x10,0x05,0x40,0x3c,0x08,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3d,0x04, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xcf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x04,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c, 0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03,0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x14,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x95,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xd6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xf7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x12,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x69,0x32,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x34,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x9d,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x12,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x11,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x4a,0x01,0x02,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x31,0xaf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x11,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x10,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x44,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x27,0x61,0x00,0x04,0x10,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x34,0x03, 0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x23,0x61,0x00,0x05,0x10,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x35,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x1f,0x61,0x00,0x06,0x10,0x00,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x61,0x24,0x28,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x61,0x25,0x29,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x1d, 0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x15, 0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d, 0x61,0x00,0x3f,0x10,0x00,0x61,0x26,0x2a,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x26, 0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x1e, 0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e, 0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x29, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x23,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x25, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x1f,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x21, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x0f,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x17,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x19, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x13,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x15, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b,0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x04,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xe7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x31,0xd8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x31,0xc9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1f,0x00,0x00,0x31,0xba,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x1b,0x00,0x00,0x31,0xab,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x17,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x13,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xcf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xee,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x31,0xd1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x24,0x17,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x24,0x13,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x0f,0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x24,0x2b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x35,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xb6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x24,0x17,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x24,0x13,0x00,0x00,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x02,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x31,0x91,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x02,0x00,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x84,0x02,0x24,0x4a,0x01, 0x06,0x84,0x02,0x54,0x52,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x84,0x02,0x00, 0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x4b,0x84,0x02,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x02,0x84,0x02,0x00, 0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x4b,0xa8,0x2a,0x4b,0x11,0x4a,0x69,0x01,0x4a, 0x68,0x9a,0x4b,0x21,0x00,0x70,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x64,0x4a,0x00, 0x52,0x04,0x4a,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x6e,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x9e,0xf9,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x58,0x52,0x11,0x00,0x61,0x07,0x03, 0x62,0x60,0x02,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0x44,0x49,0x00, 0x06,0x84,0x02,0x00,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x20,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x60,0x06,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x70,0x01,0x80,0x00,0x60,0x86,0x01,0x00,0x84,0x02,0x00, 0x55,0x08,0x00,0x08,0x00,0x62,0x00,0x00,0x00,0x60,0x86,0x25,0x4a,0x84,0x02,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x00,0x4a,0xe2,0x96,0x31,0x11,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x44,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0xa4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x0a,0xa5,0x4a,0x84,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x61,0x32,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x74,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x21,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x4a,0xe4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x61,0x34,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x64,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x0a,0xa5,0x4a,0xc4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x61,0x35,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa6,0x03, 0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x4a, 0x68,0xa8,0x49,0x11,0x00,0x70,0x01,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x4a,0xa8,0x88,0x00,0x01,0x00,0x61,0x00,0x2f, 0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85,0x65,0x02,0xe4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xe0,0x05,0xe0,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0xe4,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x4a,0xe4,0x4a,0x00, 0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x80,0x00,0x60,0x06,0x01,0x00,0xe4,0x4a,0x00, 0x16,0xa4,0x4a,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0xff,0xff,0xff,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x20,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x6a,0x00,0x00,0x61,0x22,0x0f,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x06,0x10,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0a,0x40,0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x09,0x10,0x00,0x61,0x32,0x27, 0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x0b,0x10,0x00,0x01,0x24,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x11, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x61,0x39,0x19, 0x61,0x00,0x3a,0x10,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x36,0x1d, 0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x3d,0x10,0x00,0x61,0x37,0x29,0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d, 0x61,0x00,0x3f,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x26,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x23,0x12,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x42,0x10,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x1e,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2a, 0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f, 0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x06,0x2b, 0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03, 0x68,0x60,0x16,0x11,0x00,0x61,0x00,0x03,0x68,0x38,0x1a,0x11,0x00,0x61,0x00,0x03, 0x68,0x98,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x26,0x11,0x00,0x61,0x00,0x03,0x68,0xa0,0x2a,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2e,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xe0,0x03,0xe0,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x12,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x0f,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xf7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xd8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xc9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xba,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xab,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x39,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a, 0xa8,0xe2,0x4a,0x11,0x48,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3d,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x07,0x02,0x68,0x9a,0x4b,0x21,0x00,0x31,0xec,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xce,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x3e,0x08, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x01,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x07,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0c, 0x21,0x1b,0x03,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x5c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x3a,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xf7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05, 0x68,0x02,0x4b,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x06, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xeb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x40,0x02,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x03,0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08, 0x21,0x03,0x06,0x10,0x03,0x40,0x3c,0x07,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x69,0x05,0x05,0x68,0x02,0x0b,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x07,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x06,0x10,0x05,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x04,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x06,0x10,0x08,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x5a,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x59,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0x96,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x34,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x32,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xd7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xc8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xb9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x31,0x9a,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2b,0x00,0x00,0x40,0x02,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x35,0x00, 0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x3a,0x08,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00, 0x00,0x60,0x06,0x05,0x09,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xdd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xcc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3c,0x05,0x68,0x02,0x4b,0x21,0x00,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x08,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xff,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xfe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xe0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x2d,0x00,0x00,0x69,0x02,0x02,0x68,0x9a,0x08,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x09,0x21,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x31,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x09, 0xa8,0x0a,0x4b,0x11,0x48,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x34,0x07, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x31,0xe2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x07,0x05, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x7a,0x02,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x0a, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x4b,0x21,0x00,0x40,0x05,0x0c, 0x21,0x03,0x06,0x10,0x05,0x40,0x05,0x0d,0x21,0x03,0x06,0x10,0x08,0x40,0x05,0x04, 0x21,0x03,0x06,0x10,0x03,0x40,0x05,0x05,0x21,0x03,0x06,0x10,0x0a,0x40,0x05,0x08, 0x21,0x03,0x06,0x10,0x07,0x31,0xd5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x55,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0x9d,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x3b,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3d,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xee,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xd1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x3c,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xc3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xd4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x96,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x40,0x3f,0x09, 0xa8,0x7a,0x4a,0x11,0x48,0x40,0x33,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x4b,0x21,0x00,0x69,0x32,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xd5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xc7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xb8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x29,0x00,0x00,0x40,0x06,0x05, 0x21,0x1b,0x04,0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x40,0x37,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x39,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3a,0x08, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x04,0x10,0x0a,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x50,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x33,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x31,0xd2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xc6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x06,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x32,0x04, 0x61,0x02,0x2f,0x20,0x00,0x40,0x35,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x4a,0x4b,0x11,0x48,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x04,0x09,0x21,0x1b,0x04,0x10,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xf8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x4d,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x4b,0x21,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x03, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b,0xa8,0x52,0x4b,0x11,0x48,0x31,0xcc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x33,0x07, 0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x02,0x68,0x9a,0x03,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x07,0x10,0x06,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x09,0x21,0x03,0x07,0x10,0x05,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x4c,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x4c,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x4a,0x01,0x04,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x7a,0x4a,0x01,0x06,0x31,0xa3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x4b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xe6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xd5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x36,0x03, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05, 0x68,0x02,0x4b,0x21,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x4a,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x22,0x0f, 0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17, 0x61,0x00,0x06,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x40,0x00,0x00,0x61,0x3c,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x09,0x10,0x00,0x61,0x32,0x27,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x10, 0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18, 0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20, 0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28, 0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x37,0x10,0x00,0x01,0x25,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x11,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15, 0x61,0x00,0x39,0x10,0x00,0x61,0x39,0x19,0x61,0x00,0x3a,0x10,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x36,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x37,0x29, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x29,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0xc0,0x03,0xc0,0x03,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x14,0x22,0x00,0x00,0x61,0x31,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a,0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x04,0x22,0x00,0x00,0x61,0x31,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x34,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x03,0x00,0x00,0x61,0x36,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x04,0x22,0x00,0x00,0x61,0x31,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x34,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b, 0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xfb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x69,0x3b,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3d,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x3d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xb6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3f,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x04,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x35,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x3c,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3c,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xad,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0x9c,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x3c,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xef,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xde,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xc1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xb0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0x93,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x07,0x03, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x33,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xa2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x2b,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x02,0x03,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05, 0x21,0x03,0x08,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a, 0x21,0x03,0x08,0x10,0x07,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x40,0x34,0x09, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x36,0x05,0xa8,0x32,0x4b,0x11,0x48,0x40,0x35,0x0a, 0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x40,0x05,0x0c, 0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07, 0x21,0x03,0x08,0x10,0x06,0x40,0x04,0x0d,0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03, 0x21,0x1b,0x08,0x10,0x02,0x31,0xf7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x38,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x31,0xad,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xef,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xde,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3f,0x07,0x61,0x02,0x2f,0x20,0x00,0x40,0x3e,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03,0x68,0x7a,0x02,0x21,0x00,0x31,0xf1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xd0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xc3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x03,0x08, 0x21,0x03,0x07,0x10,0x06,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04, 0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05, 0x68,0x02,0x09,0x21,0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x34,0x08, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x32,0x04,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c, 0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03,0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x99,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x36,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xca,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xbb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xad,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x4a,0x4b,0x11,0x48,0x31,0xdc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x1b,0x04,0x10,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b, 0x21,0x1b,0x04,0x10,0x02,0x31,0xff,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x34,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x69,0x3a,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x3b,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b,0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x33,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x33,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02, 0x68,0xe2,0x4a,0x01,0x04,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x32,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x31,0xb7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x04,0x07, 0x21,0x03,0x06,0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x31,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x0c,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x31,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x34,0x0d,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x11, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06,0x10,0x00,0x61,0x39,0x19, 0x61,0x00,0x07,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x50,0x00,0x00,0x00,0x61,0x31,0x1d,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x0a,0x10,0x00,0x61,0x35,0x29, 0x61,0x00,0x0b,0x10,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x70,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x72,0x00,0x00,0x61,0x31,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a,0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xfe,0xff,0xff,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x70,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0d,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x06,0x22,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x61,0x34,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0d, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x15, 0x60,0x00,0x07,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x06,0x22,0x00,0x00,0x61,0x04,0x1d,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x19, 0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x21,0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x25, 0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x29,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x40,0x00,0x00,0x69,0x3c,0x0c, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x03,0x21,0x1b,0x0c,0x10,0x4a,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x40,0x00,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x09,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x3b,0x03, 0xa8,0x1a,0x4b,0x11,0x01,0x69,0x04,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x03,0x21,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05,0x21,0x03,0x0c,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x0c,0x10,0x07,0x40,0x05,0x0b,0x21,0x03,0x0c,0x10,0x0a,0x40,0x05,0x04, 0x21,0x1b,0x0c,0x10,0x02,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x2a,0x00,0x00,0x40,0x00,0x4b,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x01,0x03,0x21,0x1b,0x0c,0x10,0x02,0x31,0x91,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2a,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x29,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x07, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x05, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0a, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x4a,0x40,0x05,0x06, 0x21,0x03,0x03,0x10,0x05,0x40,0x05,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x04,0x0b, 0x68,0x02,0x0a,0x21,0x00,0x40,0x30,0x04,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x33,0x06, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x34,0x09,0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x48,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0a,0x50,0x00,0x00,0x40,0x05,0x0c,0x21,0x03,0x03,0x10,0x0b,0x69,0x05,0x02, 0x68,0x9a,0x04,0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x0a, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x4b,0x21,0x00,0x31,0xd2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x05, 0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0b, 0x21,0x03,0x03,0x10,0x0a,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0c, 0x21,0x03,0x03,0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x03,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x07, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x03,0x05,0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06, 0x21,0x03,0x03,0x10,0x05,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0a,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x09, 0x21,0x03,0x03,0x10,0x08,0x40,0x39,0x04,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3a,0x06, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b, 0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x04,0x21,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09, 0x68,0x02,0x4b,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0a,0x50,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05, 0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x27,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x06,0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x09, 0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x40,0x05,0x03,0x21,0x1b,0x09,0x10,0x4a,0x40,0x05,0x05, 0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x09,0x10,0x07,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x26,0x00,0x00,0x40,0x00,0x4b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03,0x21,0x1b,0x09,0x10,0x02,0x31,0x94,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x26,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x25,0x00,0x00,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x4a,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x25,0x00,0x00,0x40,0x00,0x4b, 0xa8,0x2a,0x4b,0x11,0x01,0x69,0x00,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x4a,0x40,0x03,0x05, 0x21,0x1b,0x03,0x10,0x02,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x25,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x22,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a, 0x61,0x00,0x07,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x04,0x22,0x00,0x00,0x61,0x31,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x34,0x22, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a, 0x61,0x00,0x0b,0x10,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x0f, 0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x17, 0x61,0x00,0x32,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x0a,0x40,0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x27, 0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x37,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x80,0x03,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x94,0x02,0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x60,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x12,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x16,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x0e,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x12,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x16,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x1a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x22,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x26,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1a,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1e,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x22,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x26,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2a,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x01,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x35,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0e, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x12,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x16,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x12,0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x16, 0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1e,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x1a, 0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x22,0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x26, 0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x2a,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x69,0x37,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x38,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x4b,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x76,0x00,0x00,0x00,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x1c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xb3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x3a,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x30,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x66,0x00,0x00,0x00,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1b,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1a,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x99,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xea,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xdb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xcd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xbc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x9f,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x07,0x03, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3f,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x02,0x03,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05, 0x21,0x03,0x08,0x10,0x04,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a, 0x21,0x03,0x08,0x10,0x07,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x40,0x3e,0x09, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x33,0x05,0xa8,0x32,0x4b,0x11,0x48,0x40,0x30,0x0a, 0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x74,0x02,0x00,0x00,0x40,0x05,0x0c, 0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07, 0x21,0x03,0x08,0x10,0x06,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0d, 0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x1b,0x08,0x10,0x02,0x31,0xf4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x17,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xa8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xf9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xea,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xdb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x00,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3a,0x07, 0x61,0x02,0x2f,0x20,0x00,0x40,0x3b,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03, 0x68,0x7a,0x02,0x21,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x07,0x10,0x05,0x40,0x3e,0x08,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x31,0x04, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x04,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x76,0x00,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06, 0x21,0x03,0x07,0x10,0x0a,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x14,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xd9,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xfa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xad,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x12,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x69,0x35,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x37,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09, 0x21,0x03,0x03,0x10,0x08,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x12,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x11,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x4a,0x01,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xa3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x11,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x10,0x00,0x00,0x61,0x32,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x61,0x22,0x27,0x61,0x00,0x04,0x10,0x00,0x01,0x21,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x23, 0x61,0x00,0x05,0x10,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x38,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x1f,0x61,0x00,0x06,0x10,0x00,0x01,0x23,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3c,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x61,0x27,0x28,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x37,0x29,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3a,0x10,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x36,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x39,0x19, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x11, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x61,0x29,0x2a, 0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x42,0x10,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x1e, 0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e, 0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x29, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x23,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x25, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x1f,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x21, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x0f,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x17,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x19, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x13,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x15, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b,0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x04,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xea,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x31,0xdb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x31,0xcd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1f,0x00,0x00,0x31,0xbc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x1b,0x00,0x00,0x31,0xaf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x17,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x13,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x31,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xc3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xe0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x24,0x17,0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x24,0x13,0x00,0x00,0x31,0x95,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x0f,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x24,0x2b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xb9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x24,0x17,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x24,0x13,0x00,0x00,0x31,0x9f,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x90,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x94,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x31,0x96,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xa4,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0x85,0x4a,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x60,0x06,0x84,0x4a,0x64,0x02,0x01,0x06,0x84,0x4a,0x54,0x52,0x41,0x01,0x00, 0x80,0x60,0x06,0x01,0x20,0x84,0x4a,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x4b,0x84,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x02,0x84,0x4a,0x00,0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x4b, 0xa8,0x2a,0x4b,0x11,0x4a,0x69,0x01,0x4a,0x68,0x9a,0x4b,0x21,0x00,0x70,0x01,0x80, 0x00,0x20,0x02,0x01,0x00,0x64,0x4a,0x00,0x52,0x04,0x4a,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x6e,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xfe,0xfd,0x00,0x00,0x61,0x30,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x58,0x52,0x11,0x00,0x61,0x07,0x03, 0x62,0x60,0x02,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x4a,0x44,0x49,0x00, 0x06,0x84,0x4a,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x05,0x00,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa5,0x03, 0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x01,0x80, 0x00,0x60,0x86,0x01,0x00,0x84,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x62,0x00,0x00, 0x00,0x60,0x86,0x25,0x4a,0x84,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x00,0x4a, 0xe2,0x96,0x31,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x44,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x5d,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x4a,0x84,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x01,0x00,0x00,0x61,0x35,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x74,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x12,0x00,0x00,0x00,0x31,0xa7,0x03, 0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x0a,0xa5,0x4a,0xe4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x61,0x37,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x64,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x00,0x00,0x00,0x31,0xa8,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x0a,0xa5,0x4a,0xc4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x61,0x38,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x4a,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x48,0x00,0x00,0x00,0x31,0xa9,0x03, 0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x4a, 0x68,0xa8,0x49,0x11,0x00,0x70,0x01,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x4a,0xa8,0x88,0x00,0x01,0x00,0x61,0x00,0x2f, 0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85,0x65,0x02,0xe4,0x4a,0x00, 0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xe0,0x05,0xe0,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0xe4,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x4a,0xe4,0x4a,0x00, 0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x80,0x00,0x60,0x06,0x01,0x00,0xe4,0x4a,0x00, 0x16,0xa4,0x4a,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0xff,0xff,0xff,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x38,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x20,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x6a,0x00,0x00,0x61,0x25,0x0f,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x06,0x10,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x5b,0x40,0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x09,0x10,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x27, 0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x0b,0x10,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x90,0x00,0x00,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x20,0x01,0x00,0x00,0x61,0x22,0x11, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x19, 0x61,0x00,0x3a,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x3a,0x29, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x40,0x02,0x00,0x00,0x61,0x23,0x12, 0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1a, 0x61,0x00,0x42,0x10,0x00,0x61,0x32,0x1e,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2a, 0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f, 0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x06,0x2b, 0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03, 0x68,0x60,0x16,0x11,0x00,0x61,0x00,0x03,0x68,0x38,0x1a,0x11,0x00,0x61,0x00,0x03, 0x68,0x98,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x26,0x11,0x00,0x61,0x00,0x03,0x68,0xa0,0x2a,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2e,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xe0,0x03,0xe0,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x12,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x0f,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xfa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xdb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xcd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xbc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xaf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xd1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x31,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x07,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x31,0xee,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x30,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x07,0x02,0x68,0x9a,0x0b,0x21,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x3c,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xfa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x06, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x40,0x02,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x03,0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x06,0x10,0x03,0x40,0x3e,0x07, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b,0xa8,0x32,0x4b,0x11,0x48,0x31,0xb3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x69,0x05,0x05, 0x68,0x02,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x07,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c, 0x21,0x03,0x06,0x10,0x05,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x06,0x10,0x04,0x40,0x04,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x04,0x04, 0x21,0x03,0x06,0x10,0x08,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x5a,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x04,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x59,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x37,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x35,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x39,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xe8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x14,0x27,0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x14,0x2b,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x68,0x38,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x31,0xcf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x3d,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x3c,0x08, 0xa8,0x7a,0x4a,0x11,0x48,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x09,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0b,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x3e,0x05,0x68,0x02,0x4b,0x21,0x00,0x69,0x00,0x06, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x08,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xf3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xf0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xe2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x2d,0x00,0x00,0x69,0x02,0x02,0x68,0x9a,0x08,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x09,0x21,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x34,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x09,0xa8,0x0a,0x4b,0x11,0x48,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x37,0x07, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x31,0xe5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x07,0x05, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x7a,0x02,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x07, 0x68,0x02,0x4b,0x21,0x00,0x40,0x05,0x0c,0x21,0x03,0x06,0x10,0x05,0x40,0x05,0x0d, 0x21,0x03,0x06,0x10,0x08,0x40,0x05,0x04,0x21,0x03,0x06,0x10,0x03,0x40,0x05,0x05, 0x21,0x03,0x06,0x10,0x0a,0x40,0x05,0x08,0x21,0x03,0x06,0x10,0x07,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0xad,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x55,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xaf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0x91,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x31,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x31,0xfe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xf3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xe0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xc2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x3e,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xc6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xd7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x40,0x33,0x09,0xa8,0x7a,0x4a,0x11,0x48,0x40,0x36,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x69,0x35,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x07, 0x68,0x02,0x06,0x21,0x00,0x31,0xd8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x40,0x06,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x31,0xcd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x40,0x3a,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x3d,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3c,0x08, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xcf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x08,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x09,0x40,0x04,0x0b, 0x21,0x03,0x04,0x10,0x0a,0x31,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x51,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4a,0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x36,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x31,0xb7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x31,0xd5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x06,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x35,0x04, 0x61,0x02,0x2f,0x20,0x00,0x40,0x38,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x4a,0x4b,0x11,0x48,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x04,0x09,0x21,0x1b,0x04,0x10,0x02,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xfb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x4e,0x00,0x00,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x4b,0x21,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x31,0x03,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xb3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x69,0x36,0x07,0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x02, 0x68,0x9a,0x03,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x09, 0x21,0x03,0x07,0x10,0x05,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x4c,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x4c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x4a,0x01,0x04,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05, 0x68,0x7a,0x4a,0x01,0x06,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x69,0x00,0x06,0x61,0x02,0x2f,0x20,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07, 0x21,0x03,0x06,0x10,0x05,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x4b,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x01,0x40,0x00,0x4a, 0x68,0xe2,0x4a,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4b, 0xa8,0x2a,0x4b,0x11,0x01,0x31,0xe9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xd8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x39,0x03,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x4b,0x21,0x00,0x31,0xfa,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xcb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06, 0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x4a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x25,0x0f,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x06,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5b,0x40,0x00,0x00,0x61,0x3c,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x09,0x10,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x27, 0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x0b,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00,0x00,0x00,0x61,0x21,0x10, 0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18, 0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20, 0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28, 0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x37,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x20,0x01,0x00,0x00,0x61,0x22,0x11, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x19,0x61,0x00,0x3a,0x10,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x3a,0x29, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x29,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0xc0,0x03,0xc0,0x03,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xb4,0x20,0x00,0x00,0x61,0x31,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02, 0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a,0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x34,0x20,0x00,0x00,0x61,0x31,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x03,0x00,0x00,0x61,0x39,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x34,0x22,0x00,0x00,0x61,0x31,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b,0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xff,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xd1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xce,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xb3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x69,0x3f,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x31,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04, 0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x01,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09, 0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4b,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x0c, 0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03,0x10,0x04,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3e,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2f,0x20,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06, 0xa8,0x2a,0x4b,0x11,0x01,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x23,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05, 0x21,0x1b,0x04,0x10,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x33,0x09,0xa8,0x52,0x4b,0x11,0x48,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x38,0x05, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b,0xa8,0x32,0x4b,0x11,0x48,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4b,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0c, 0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03, 0x21,0x03,0x04,0x10,0x08,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x3c,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x3c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x40,0x31,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3e,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4b,0x11,0x01,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x36,0x06,0xa8,0x52,0x4b,0x11,0x48,0x31,0xa5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2b,0x00,0x00,0x69,0x00,0x08, 0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02,0x68,0x9a,0x4b,0x21,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09, 0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08,0x10,0x04,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08,0x10,0x07,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x40,0x37,0x09,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x39,0x05, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x38,0x0a,0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x48,0x40,0x05,0x0c,0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b, 0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04, 0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x40,0x04,0x0d, 0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x1b,0x08,0x10,0x02,0x31,0xfa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x39,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xa1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x31,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xfe,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xe3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xd0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x69,0x00,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x33,0x07, 0x61,0x02,0x2f,0x20,0x00,0x40,0x30,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03, 0x68,0x7a,0x02,0x21,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x31,0xd2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x23,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x07,0x10,0x05,0x40,0x37,0x08,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x35,0x04, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x04,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06, 0x21,0x03,0x07,0x10,0x0a,0x31,0xc8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x36,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xde,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1b,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xf3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x34,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x69,0x3c,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x3f,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09, 0x21,0x03,0x03,0x10,0x08,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x33,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x33,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x4a,0x01,0x04,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x32,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x31,0xba,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x13,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xac,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x32,0x00,0x00,0x70,0x00,0x80, 0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x0c,0x00,0x00,0x70,0x00,0x80, 0x00,0x20,0x82,0x01,0x00,0xc4,0x4a,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x31,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x25,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x84,0x04,0x00,0x00,0x61,0x34,0x0d,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x11, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06,0x10,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x19,0x61,0x00,0x07,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x50,0x02,0x00,0x00,0x61,0x31,0x1d, 0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x25, 0x61,0x00,0x0a,0x10,0x00,0x61,0x38,0x29,0x61,0x00,0x0b,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x03,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x40,0x03,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x7d,0x70,0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x80,0x03,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x0d,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x36,0x20,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x00,0x03,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0d,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x15,0x60,0x00,0x07,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x36,0x20,0x00,0x00,0x61,0x04,0x1d, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x19,0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x21, 0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x25,0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x29, 0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x04,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x5b,0x40,0x00,0x00,0x69,0x3c,0x0c,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x03, 0x21,0x1b,0x0c,0x10,0x4a,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x40,0x00,0x06,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x09, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x3f,0x03,0xa8,0x1a,0x4b,0x11,0x01,0x69,0x04,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x0a, 0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x03,0x21,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05, 0x21,0x03,0x0c,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x0c,0x10,0x07,0x40,0x05,0x0b, 0x21,0x03,0x0c,0x10,0x0a,0x40,0x05,0x04,0x21,0x1b,0x0c,0x10,0x02,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x2a,0x00,0x00,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x01,0x03, 0x21,0x1b,0x0c,0x10,0x02,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x2a,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x2a,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x07,0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x05,0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0a,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x40,0x05,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x05,0x09, 0x21,0x03,0x03,0x10,0x08,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x69,0x04,0x0b,0x68,0x02,0x0a,0x21,0x00,0x40,0x32,0x04, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x36,0x06,0xa8,0x32,0x4b,0x11,0x48,0x40,0x37,0x09, 0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5b,0x50,0x00,0x00,0x40,0x05,0x0c, 0x21,0x03,0x03,0x10,0x0b,0x69,0x05,0x02,0x68,0x9a,0x04,0x21,0x00,0x69,0x05,0x07, 0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x04, 0x68,0x02,0x4b,0x21,0x00,0x31,0xd5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x05,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08, 0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x0a,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x04,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x28,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x07,0xa8,0x52,0x4b,0x11,0x48,0x69,0x03,0x05, 0x68,0x7a,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03,0x10,0x4a,0x69,0x04,0x08, 0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x03,0x10,0x05,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x0a, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x09,0x21,0x03,0x03,0x10,0x08,0x40,0x3d,0x04, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x3c,0x06,0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b, 0xa8,0x0a,0x4b,0x11,0x48,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x04,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x4b,0x21,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5b,0x50,0x00,0x00,0x40,0x04,0x0c, 0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x08, 0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x27,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x00,0x09,0x61,0x02,0x2f,0x20,0x00,0x69,0x03,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x03,0x00,0x03,0x00,0x40,0x05,0x03, 0x21,0x1b,0x09,0x10,0x4a,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08, 0x21,0x03,0x09,0x10,0x07,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0x26,0x00,0x00,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03, 0x21,0x1b,0x09,0x10,0x02,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x26,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0x00,0x00,0x69,0x00,0x03,0x61,0x02,0x2f,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x25,0x00,0x00,0x40,0x00,0x4b,0xa8,0x2a,0x4b,0x11,0x01,0x69,0x00,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04, 0x21,0x1b,0x03,0x10,0x4a,0x40,0x03,0x05,0x21,0x1b,0x03,0x10,0x02,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x25,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x25,0x0e, 0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16, 0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x34,0x22,0x00,0x00,0x61,0x31,0x1e, 0x61,0x00,0x08,0x10,0x00,0x61,0x37,0x22,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26, 0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00,0x00,0x00,0x61,0x21,0x0f, 0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x17, 0x61,0x00,0x32,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x4b,0x40,0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x27, 0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x37,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0xa4,0x4a,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x61,0x07,0x03, 0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x80,0x03,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xf4,0x24,0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0xa4,0x4a,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x4a,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x4a, 0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x00,0x03,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x12,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x16,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x0e,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x12,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05,0x00,0x90,0x09,0x05,0x16,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x1a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x22,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x26,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1a,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x1e,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x22,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x90,0x09,0x05,0x26,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x2a,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x01,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x38,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0e, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x12,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x12,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x16,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x1a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x12,0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x16, 0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1e,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x1a, 0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x22,0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x26, 0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x2a,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xfa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x69,0x3a,0x03, 0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02,0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3b,0x05, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x08,0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x02,0x40,0x00,0x4b, 0xa8,0x1a,0x4b,0x11,0x01,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x03,0x10,0x06,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x03,0x10,0x09,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xf4,0x03,0x00,0x00,0x40,0x04,0x0c,0x21,0x1b,0x03,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x03,0x10,0x04,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x1c,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x31,0xb6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xb2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x3c,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x03,0x08, 0x21,0x03,0x04,0x10,0x07,0x40,0x32,0x05,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x32,0x4b,0x11,0x48,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03, 0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x69,0x04,0x06, 0x68,0x02,0x05,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08, 0x68,0x02,0x4b,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x36,0x03,0x00,0x00,0x40,0x04,0x0c,0x21,0x1b,0x04,0x10,0x02,0x40,0x04,0x07, 0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x1b,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1b,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x9d,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x02, 0xa8,0xe2,0x4a,0x11,0x48,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xec,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xc1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xbe,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x93,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x07,0x03, 0xa8,0x2a,0x4b,0x11,0x01,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x07,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x33,0x06, 0xa8,0x52,0x4b,0x11,0x48,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2f,0x20,0x00,0x69,0x00,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04, 0x68,0x02,0x03,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x4a,0x4b,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x1b,0x08,0x10,0x02,0x40,0x05,0x05, 0x21,0x03,0x08,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a, 0x21,0x03,0x08,0x10,0x07,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x02,0x68,0x9a,0x0b,0x21,0x00,0x40,0x30,0x09, 0xa8,0x1a,0x4b,0x11,0x01,0x40,0x36,0x05,0xa8,0x32,0x4b,0x11,0x48,0x40,0x32,0x0a, 0xa8,0x0a,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x1a,0x4b,0x11,0x48,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xe4,0x23,0x00,0x00,0x40,0x05,0x0c, 0x21,0x1b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07, 0x21,0x03,0x08,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0d, 0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x1b,0x08,0x10,0x02,0x31,0xf7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x17,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x02,0xa8,0xe2,0x4a,0x11,0x48,0x31,0xab,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00, 0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x4b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xfd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xec,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x00,0x06, 0x68,0x02,0x4b,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3c,0x07, 0x61,0x02,0x2f,0x20,0x00,0x40,0x3f,0x09,0xa8,0x52,0x4b,0x11,0x48,0x69,0x07,0x03, 0x68,0x7a,0x02,0x21,0x00,0x31,0xf1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x00,0x0b, 0xa8,0x4a,0x4b,0x11,0x48,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a, 0x21,0x03,0x07,0x10,0x05,0x40,0x30,0x08,0xa8,0x1a,0x4b,0x11,0x01,0x40,0x34,0x04, 0xa8,0x32,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x0a,0x4b,0x11,0x48,0x31,0xc6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x69,0x05,0x06, 0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x9a,0x08,0x21,0x00,0x69,0x04,0x09, 0x68,0x02,0x04,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a, 0x68,0x02,0x4b,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xb4,0x03,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07,0x10,0x06,0x40,0x04,0x03, 0x21,0x1b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07,0x10,0x09,0x40,0x04,0x06, 0x21,0x03,0x07,0x10,0x0a,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x15,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x4a,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x4b,0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x09, 0xa8,0x52,0x4b,0x11,0x48,0x40,0x00,0x4b,0xa8,0x4a,0x4b,0x11,0x48,0x31,0xdd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x1b,0x04,0x10,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a, 0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x1b,0x04,0x10,0x02,0x31,0xfc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x13,0x00,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x69,0x38,0x03,0x61,0x02,0x2f,0x20,0x00,0x69,0x02,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x40,0x3a,0x05,0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x4b, 0xa8,0x52,0x4b,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08, 0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x1b,0x03,0x10,0x02,0x01,0x3b,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09, 0x21,0x03,0x03,0x10,0x08,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x13,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x12,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x12,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x02,0x68,0xe2,0x4a,0x01,0x02,0x69,0x00,0x04, 0x61,0x02,0x2f,0x20,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x1b,0x04,0x10,0x02,0x31,0xa6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x11,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4b, 0x68,0x02,0x4b,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4b,0x21,0x00,0x40,0x00,0x4b, 0xa8,0x2a,0x4b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2f,0x20,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02, 0x68,0x9a,0x4b,0x21,0x00,0x31,0xb7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x06,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x10,0x00,0x00,0x61,0x35,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x03, 0x62,0x60,0x02,0x11,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x27, 0x61,0x00,0x04,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x12,0x00,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x3a,0x03,0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x23, 0x61,0x00,0x05,0x10,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3b,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x1f,0x61,0x00,0x06,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x48,0x00,0x00,0x00,0x31,0xad,0x03, 0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x01,0x40,0x00,0x00,0x61,0x3c,0x1b, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x13, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x0b,0x10,0x00,0x61,0x2a,0x28,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x2b,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x05,0x00,0x00,0x61,0x37,0x29, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3a,0x10,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x1d, 0x61,0x00,0x3b,0x10,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x19, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x11, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x61,0x2d,0x2a, 0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x42,0x10,0x00,0x61,0x39,0x1e,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x1a, 0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x12, 0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x23, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x25,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x1f, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x21,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x0f, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x17, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x19,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x13, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x15,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b, 0x60,0x00,0x05,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x03,0x10,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09, 0xa8,0x7a,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xec,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x1f,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x24,0x17,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x05,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x90,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x13,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x84,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09, 0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x34,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x84,0x01,0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1f,0x00,0x00,0x31,0xd7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x1b,0x00,0x00,0x31,0xc5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x17,0x00,0x00,0x31,0xb9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x13,0x00,0x00,0x31,0x98,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0f,0x00,0x00,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x2b,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x31,0xab,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x07,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x09, 0xa8,0x7a,0x4a,0x11,0x48,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x4a,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0xc4,0x01,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1f,0x00,0x00,0x31,0xcf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x1b,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x17,0x00,0x00,0x31,0xae,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x13,0x00,0x00,0x31,0x93,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x64,0x4a,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x05,0x64,0x4a,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x27,0x00,0x00,0x31,0xb0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x23,0x00,0x00,0x31,0xa6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x1f,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x92,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x1b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x4a,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x31,0x97,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4b,0x04,0x4b,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x4a,0x64,0x4a,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4b,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x4a,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x27,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x23,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0xa4,0x01,0x00, 0x05,0x18,0x00,0x18,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x2f,0x00,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x44,0x2f,0x64,0x02,0x01, 0x06,0x44,0x2f,0x54,0x52,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x2f,0x00, 0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x2f,0x44,0x2f,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x2f,0x44,0x2f,0x00, 0x06,0x44,0x02,0x00,0x00,0x40,0x02,0x2f,0xa8,0x2a,0x2f,0x11,0x4a,0x69,0x01,0x2f, 0x68,0x62,0x2f,0x21,0x00,0x70,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x24,0x2f,0x00, 0x52,0x04,0x4a,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x71,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xfe,0xff,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x58,0x52,0x11,0x00,0x61,0x07,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x49,0x44,0x49,0x00, 0x06,0x44,0x2f,0x00,0x02,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x4a,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x70,0x01,0x80,0x00,0x60,0x86,0x01,0x00,0x44,0x49,0x00, 0x55,0x08,0x00,0x08,0x00,0x62,0x00,0x00,0x00,0x60,0x86,0x45,0x2f,0x44,0x49,0x00, 0x55,0x08,0x00,0x08,0x00,0x61,0x00,0x2f,0xe2,0x9e,0x31,0x11,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x44,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0xa4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xa5,0x2f,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x00,0x49, 0x68,0x58,0x49,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x01,0x00,0x00,0x61,0x38,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x74,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x92,0x00,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x05,0x30,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x2f,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x00,0x49,0x68,0x80,0x49,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x61,0x3a,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x52,0x11,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x84,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x31,0x64,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01,0x00,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x05,0x38,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0xa0,0x4a,0xa5,0x2f,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x00,0x49, 0x68,0x68,0x49,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x61,0x3b,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x2f,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x48,0x02,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x05,0x40,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x70,0x07,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x2f,0xa8,0x90,0x00,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x2c,0x00,0x00,0x61,0x38,0x03, 0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x52,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x69,0x04,0x00, 0x00,0x50,0x85,0x65,0x02,0x84,0x2f,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x60,0x00,0x60,0x00,0x61,0x00,0x00, 0x00,0x68,0x06,0x01,0x00,0x84,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x86,0x85,0x2f,0x84,0x2f,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x80, 0x00,0x60,0x06,0x01,0x00,0x84,0x2f,0x00,0x16,0x04,0x49,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xff,0xff,0xff,0x69,0x04,0x52, 0x61,0x02,0x03,0x20,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xa4,0x2f,0x00, 0x51,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x3b,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xa4,0x2f,0x00, 0x11,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x21,0x00,0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0xa4,0x2f,0x00, 0x11,0x04,0x00,0x04,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x6d,0x00,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x6d,0xde,0x00,0x00,0x61,0x37,0x0f, 0x61,0x00,0x4a,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x4b,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x00,0x00,0x00,0x61,0x3d,0x17, 0x61,0x00,0x4c,0x10,0x00,0x61,0x37,0x1b,0x61,0x00,0x4d,0x10,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x1f,0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x51,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x90,0x04,0x00,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x20,0x08,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x11, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x19, 0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x29, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x40,0x22,0x00,0x00,0x61,0x23,0x12, 0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1a, 0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2a, 0x61,0x00,0x46,0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x47,0x10,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x48,0x02,0x00,0x00,0x61,0x20,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05, 0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05, 0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x02,0x24,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x04,0x24,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x02,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x04,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x02,0x14,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x04,0x14,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x48,0x02,0x00,0x00,0x61,0x20,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f, 0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x11,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15,0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17, 0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19,0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27, 0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29,0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x02,0x14,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x04,0x14,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x02,0x04,0x2d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x04,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x02,0x0c,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x04,0x0c,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f, 0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21,0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23, 0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25,0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x06,0x2b, 0x60,0x00,0x04,0x10,0x00,0x61,0x07,0x2d,0x60,0x00,0x02,0x10,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x04,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03, 0x68,0x60,0x16,0x11,0x00,0x61,0x00,0x03,0x68,0x38,0x1a,0x11,0x00,0x61,0x00,0x03, 0x68,0x98,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x22,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x26,0x11,0x00,0x61,0x00,0x03,0x68,0xa0,0x2a,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2e,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xe0,0x03,0xe0,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x12,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2f,0x68,0x92,0x49,0x11,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49, 0x68,0x58,0x2f,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x10,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00, 0x06,0x04,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x06,0x00,0x06,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x40,0x00,0x2f,0x68,0xca,0x2f,0x01,0x04,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x01,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x2f, 0xa8,0xca,0x2f,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xf4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xd0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xc6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb2,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa7,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x03,0x21,0x1b,0x52,0x10,0x02,0x40,0x30,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x01,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x12,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x06,0x68,0x82,0x48,0x21,0x00,0x69,0x06,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2f,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x08, 0x21,0x03,0x52,0x10,0x05,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xc8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0x9b,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x5f,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0xca,0x2f,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x05,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x2f,0x68,0x02,0x2f,0x81,0x01,0x68,0x00,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xcf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9e,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x40,0x00,0x48, 0xa8,0x22,0x2f,0x11,0x48,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x03, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0xe4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06,0x68,0x02,0x03,0x21,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x2f,0xa8,0x32,0x2f,0x11,0x48,0x31,0xc3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x40,0x07,0x05, 0x21,0x1b,0x52,0x10,0x02,0x69,0x06,0x03,0x68,0x7a,0x01,0x21,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x06,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x82,0x48,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x06, 0x68,0x02,0x2f,0x21,0x00,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xd6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04, 0x21,0x03,0x52,0x10,0x08,0x40,0x03,0x09,0x21,0x1b,0x52,0x10,0x02,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05,0x21,0x03,0x52,0x10,0x03,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x99,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x5c,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x30,0x64,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x5c,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x06,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0x9b,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x08,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00,0x06,0x04,0x48,0x00,0x00,0x40,0x38,0x00, 0x00,0x60,0x06,0x05,0x03,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3a,0x00, 0x00,0x60,0x06,0x05,0x05,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x3b,0x00, 0x00,0x60,0x06,0x05,0x07,0x24,0x2f,0x00,0x06,0x84,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0xca,0x2f,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xfd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xff,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xfc,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xee,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x31,0xd1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2b,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x01,0x24,0x2f,0x00, 0x06,0xc4,0x01,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x3d,0x00,0x00,0x20,0x82,0x45,0x09,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x07,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xe4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xf6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0xe4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x84,0x01,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x32,0x06, 0xa8,0x2a,0x2f,0x11,0x01,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x03, 0x68,0x82,0x48,0x21,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x2d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x48,0x04,0x2f,0x00, 0x06,0x84,0x48,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x1b,0x52,0x10,0x02,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04, 0x21,0x03,0x52,0x10,0x03,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x48,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xe8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xda,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x07,0x07, 0x68,0x72,0x48,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09, 0x21,0x1b,0x52,0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x7a,0x01,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x04, 0x68,0x5a,0x48,0x21,0x00,0x69,0x06,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x05,0x03, 0x21,0x03,0x52,0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x04,0x40,0x04,0x05, 0x21,0x1b,0x52,0x10,0x02,0x31,0xfd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x2e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x57,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0x94,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00, 0x06,0x04,0x48,0x00,0x00,0x40,0x33,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x2f,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x34,0x00,0x00,0x60,0x06,0x05,0x05,0x24,0x2f,0x00, 0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x2f,0x68,0xca,0x2f,0x01,0x04,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x0a,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xf0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xf6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xe2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xd7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x23,0x00,0x00,0x31,0xc5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x01,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x03,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x08,0x64,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x30,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x07,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xd8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x3b,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05, 0x68,0x02,0x04,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06, 0x68,0x82,0x48,0x21,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x29,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x03, 0x21,0x1b,0x52,0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x07, 0x21,0x03,0x52,0x10,0x06,0x40,0x00,0x2f,0xa8,0x0a,0x2f,0x11,0x48,0x31,0xde,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x05, 0x68,0x72,0x48,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x03, 0x68,0x7a,0x01,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x2f,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09, 0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x40,0x04,0x04, 0x21,0x03,0x52,0x10,0x03,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08, 0x21,0x03,0x52,0x10,0x07,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1e,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x22,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x26,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x52,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00, 0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x03,0x00,0x03,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x13,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x2f,0x68,0xca,0x2f,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x40,0x00,0x2f,0x68,0x02,0x2f,0x81,0x01,0x68,0x00,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x69,0x05,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xda,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbb,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x05, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x2f,0xa8,0x4a,0x2f,0x11,0x48,0x31,0xbd,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x04,0x21,0x1b,0x52,0x10,0x02,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x05,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06, 0x68,0x82,0x48,0x21,0x00,0x69,0x05,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xcf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x40,0x03,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x03,0x52,0x10,0x06,0x40,0x04,0x09,0x21,0x1b,0x52,0x10,0x02,0x31,0xfc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xce,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x4f,0x00,0x00,0x40,0x00,0x2f, 0x68,0xca,0x2f,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x2f,0x68,0x02,0x2f,0x81,0x01,0x01,0x01,0x00, 0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x69,0x03,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x34,0x03,0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x2f, 0xa8,0x52,0x2f,0x11,0x48,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x03,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x2f,0x21,0x00,0x31,0xb6,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x07,0x06, 0x21,0x1b,0x52,0x10,0x02,0x40,0x03,0x08,0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x52,0x10,0x04,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x95,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4e,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x4e,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0x24,0x2f,0x00,0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05, 0x68,0x22,0x2f,0x01,0x06,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x0f,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x02,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x06,0x21,0x03,0x52,0x10,0x05,0x31,0xb8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xaa,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4d,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x01,0x40,0x00,0x2f,0x68,0xca,0x2f,0x01,0x04,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x2f,0xa8,0x2a,0x2f,0x11,0x01,0x31,0xeb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xdd,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x68,0x02,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x02,0x04, 0x68,0x02,0x2f,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x03, 0x21,0x1b,0x52,0x10,0x02,0x31,0xff,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x12,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x4c,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x6d,0xde,0x00,0x00,0x61,0x37,0x0f, 0x61,0x00,0x4a,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x4b,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x00,0x00,0x00,0x61,0x3d,0x17, 0x61,0x00,0x4c,0x10,0x00,0x61,0x37,0x1b,0x61,0x00,0x4d,0x10,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x1f,0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x51,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x90,0x04,0x00,0x00,0x61,0x21,0x10,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x14, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1c, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x24, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x2c, 0x61,0x00,0x37,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x20,0x08,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x11, 0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x19, 0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x29, 0x61,0x00,0x3e,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x3f,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x04,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x19,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x21,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x29,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0xc0,0x03,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xff,0x7f,0x00,0x00,0x61,0x3f,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2f,0x68,0x92,0x49,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49, 0x68,0x58,0x2f,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x24,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x5a,0xab,0x00,0x00,0x61,0xf0,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x00,0x14,0x00,0x00,0x61,0x37,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x01,0x40,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x11,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x15,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x17,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x19,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1d,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1f,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x21,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x23,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x25,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x27,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x29,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x24,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x5a,0xab,0x00,0x00,0x61,0x20,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x00,0x14,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x11,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x0f,0x60,0x00,0x03,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x01,0x40,0x00,0x00,0x61,0x02,0x11, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x37,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1d, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x15,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x15,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x19,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x29,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x13,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x15, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x17,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x19, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x27,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x29, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x21,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x25,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x2d,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x2b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x21,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x25,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x2d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x2b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x1f,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x21, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x23,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x25, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x2b,0x60,0x00,0x04,0x10,0x00,0x61,0x07,0x2d, 0x60,0x00,0x02,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x0a,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xe3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xd4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xc0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xb6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1f,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x01,0x31,0xa7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x82,0x48,0x21,0x00,0x69,0x05,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2f,0x21,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x07,0x40,0x04,0x09, 0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03,0x31,0xc5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x3f,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x40,0x34,0x05,0xa8,0x2a,0x2f,0x11,0x01,0x31,0xbb,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x05,0x04, 0x21,0x1b,0x52,0x10,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x2f,0xa8,0x32,0x2f,0x11,0x48,0x31,0xcd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x82,0x48,0x21,0x00,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x06,0x01,0x3d,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x04,0x68,0x7a,0x01,0x21,0x00,0x69,0x05,0x06, 0x68,0x02,0x2f,0x21,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x52,0x10,0x08,0x40,0x05,0x09,0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x52,0x10,0x04,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x52,0x10,0x06,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x21,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x3d,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x64,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x3d,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x01,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xc6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xb2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xa7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0x95,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x35,0x03, 0xa8,0x2a,0x2f,0x11,0x01,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x27,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x03,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x04, 0x68,0x82,0x48,0x21,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x14,0x2b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x48,0x04,0x2f,0x00, 0x06,0x84,0x48,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06, 0x21,0x1b,0x52,0x10,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x48,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xea,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xdb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x07,0x03, 0x68,0x7a,0x01,0x21,0x00,0x69,0x07,0x07,0x68,0x72,0x48,0x21,0x00,0x40,0x03,0x09, 0x21,0x1b,0x52,0x10,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x5a,0x48,0x21,0x00,0x69,0x06,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x52,0x10,0x03,0x40,0x05,0x04, 0x21,0x03,0x52,0x10,0x07,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08, 0x21,0x03,0x52,0x10,0x05,0x40,0x04,0x03,0x21,0x1b,0x52,0x10,0x02,0x31,0xff,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xcc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xa1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0x93,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x3a,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48, 0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2f,0x68,0x02,0x2f,0x01,0x01,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0x96,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x17,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x36,0x06,0xa8,0x2a,0x2f,0x11,0x01,0x31,0xe2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x1b,0x00,0x00,0x31,0xd7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1f,0x00,0x00,0x31,0xa5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x23,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x03, 0x68,0x82,0x48,0x21,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x14,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x1b,0x52,0x10,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04, 0x21,0x03,0x52,0x10,0x03,0x40,0x00,0x2f,0xa8,0x0a,0x2f,0x11,0x48,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xab,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x07, 0x68,0x72,0x48,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x7a,0x01,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x2f,0x21,0x00,0x40,0x04,0x09,0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x03, 0x21,0x03,0x52,0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x04,0x31,0xcd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xbc,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x9e,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x37,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc3,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x17,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x34,0x05, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x2f,0xa8,0x4a,0x2f,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x04,0x21,0x1b,0x52,0x10,0x02,0x69,0x06,0x06, 0x68,0x02,0x05,0x21,0x00,0x69,0x06,0x08,0x68,0x82,0x48,0x21,0x00,0x69,0x06,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x14,0x1b,0x00,0x00,0x40,0x03,0x07,0x21,0x03,0x52,0x10,0x06,0x40,0x02,0x09, 0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x03,0x52,0x10,0x08,0x31,0xf6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xc2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x34,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x31,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x2f,0xa8,0x52,0x2f,0x11,0x48,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x02,0x07, 0x68,0x02,0x2f,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x1b,0x52,0x10,0x02,0x40,0x03,0x06,0x21,0x03,0x52,0x10,0x05,0x40,0x03,0x08, 0x21,0x03,0x52,0x10,0x07,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x11,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x15,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x34,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x34,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x24,0x2f,0x00, 0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x04,0x21,0x1b,0x52,0x10,0x02,0x31,0xab,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xad,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x33,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x2f,0x21,0x00,0x40,0x00,0x2f, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xbf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xac,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x13,0x00,0x00,0x40,0x06,0x06, 0x21,0x03,0x52,0x10,0x05,0x40,0x02,0x07,0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xbe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x32,0x00,0x00,0x70,0x00,0x80, 0x00,0x20,0x82,0x01,0x00,0xa4,0x2f,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0c,0x00,0x00,0x70,0x00,0x80, 0x00,0x20,0x82,0x01,0x00,0xa4,0x2f,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x32,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xd8,0xde,0x00,0x00,0x61,0x20,0x0b, 0x61,0x00,0x4a,0x10,0x00,0x61,0x30,0x0f,0x61,0x00,0x4b,0x10,0x00,0x61,0x30,0x13, 0x61,0x00,0x4c,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0x02,0x20,0x00,0x00,0x61,0x30,0x17,0x61,0x00,0x4d,0x10,0x00,0x61,0x30,0x1b, 0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x4f,0x10,0x00,0x61,0x30,0x23, 0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x51,0x10,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00, 0x00,0x50,0x85,0x65,0x02,0x04,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03, 0x68,0x60,0x0f,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x13,0x11,0x00,0x61,0x07,0x03, 0x68,0x98,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1b,0x11,0x00,0x61,0x07,0x03, 0x68,0xa8,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x23,0x11,0x00,0x61,0x07,0x03, 0x68,0x88,0x27,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00, 0x01,0x00,0x03,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xff,0x7f,0x00,0x00,0x61,0x3f,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0b,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x01,0x68,0x02,0x49,0x11,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49, 0x68,0x00,0x01,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0xfe,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xff,0xfb,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x0b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x0b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x0b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x02,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x02,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x02,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7b,0x00,0x00,0x61,0x3f,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x3a,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x03,0x0b, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x0f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x0f,0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x13, 0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1b,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x09,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x05,0x14,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x02,0x14,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x09,0x0c,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x02,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x02,0x0c,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x17, 0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x1f,0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x23, 0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x27,0x60,0x00,0x02,0x10,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2f,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x03, 0x21,0x13,0x52,0x10,0x2f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x06,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06, 0x68,0x82,0x48,0x21,0x00,0x69,0x06,0x08,0x68,0x6a,0x48,0x21,0x00,0x69,0x06,0x02, 0x68,0xe2,0x01,0x21,0x00,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05,0x21,0x03,0x52,0x10,0x04,0x40,0x05,0x07, 0x21,0x03,0x52,0x10,0x06,0x40,0x05,0x09,0x21,0x03,0x52,0x10,0x08,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x1b,0x52,0x10,0x02,0x31,0xc4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x92,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x2b,0x00,0x00,0x40,0x00,0x2f, 0xa8,0x32,0x2f,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x32,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03,0x21,0x1b,0x52,0x10,0x02,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x2b,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x01,0x01,0x30,0x64,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00, 0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x2a,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2f,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00,0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x48,0x04,0x2f,0x00,0x06,0x84,0x48,0x00,0x00,0x69,0x06,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x06,0x06,0x68,0x82,0x48,0x21,0x00,0x69,0x06,0x08, 0x68,0x6a,0x48,0x21,0x00,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x48,0x40,0x00,0x03, 0x21,0x13,0x52,0x10,0x2f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x07,0x02,0x68,0xe2,0x01,0x21,0x00,0x40,0x07,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x07,0x07,0x21,0x03,0x52,0x10,0x06,0x40,0x07,0x09, 0x21,0x03,0x52,0x10,0x08,0x69,0x00,0x04,0x68,0x72,0x48,0x21,0x00,0x69,0x00,0x06, 0x68,0x5a,0x48,0x21,0x00,0x69,0x07,0x08,0x68,0x02,0x2f,0x21,0x00,0x31,0xf5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xe9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xd8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xca,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x03,0x21,0x1b,0x52,0x10,0x02,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x52,0x10,0x04,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x52,0x10,0x08,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xbd,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x9c,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x29,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x02,0x04,0x2f,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00,0x06,0xa4,0x48,0x00,0x00,0x69,0x05,0x04, 0x68,0x7a,0x02,0x21,0x00,0x69,0x05,0x06,0x68,0x82,0x48,0x21,0x00,0x40,0x00,0x2f, 0xa8,0x0a,0x2f,0x11,0x48,0x40,0x00,0x03,0x21,0x13,0x52,0x10,0x2f,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x07,0x08, 0x68,0x6a,0x48,0x21,0x00,0x69,0x07,0x02,0x68,0xe2,0x01,0x21,0x00,0x40,0x07,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x07,0x07,0x21,0x03,0x52,0x10,0x06,0x69,0x07,0x04, 0x68,0x72,0x48,0x21,0x00,0x69,0x07,0x06,0x68,0x02,0x2f,0x21,0x00,0x31,0xfe,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xc3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x06,0x09, 0x21,0x03,0x52,0x10,0x08,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x03, 0x21,0x1b,0x52,0x10,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05, 0x21,0x03,0x52,0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x52,0x10,0x06,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x17,0x00,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1f,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x27,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x02,0x04,0x2f,0x00, 0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x69,0x02,0x04,0x68,0x7a,0x02,0x21,0x00,0x69,0x02,0x06, 0x68,0x82,0x48,0x21,0x00,0x40,0x00,0x03,0x21,0x13,0x52,0x10,0x2f,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x03,0x00,0x03,0x00,0x40,0x05,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x05,0x07,0x21,0x03,0x52,0x10,0x06,0x31,0xd7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0x99,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x26,0x00,0x00,0x40,0x00,0x2f, 0xa8,0x4a,0x2f,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03,0x21,0x1b,0x52,0x10,0x02,0x31,0x98,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x26,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x26,0x00,0x00,0x40,0x00,0x03, 0x21,0x13,0x52,0x10,0x2f,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x26,0x00,0x00,0x40,0x00,0x2f,0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x03, 0x21,0x13,0x52,0x10,0x2f,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04, 0x21,0x1b,0x52,0x10,0x02,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0b,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x25,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00, 0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x24,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xd8,0xde,0x00,0x00,0x61,0x20,0x0b,0x61,0x00,0x4a,0x10,0x00,0x61,0x30,0x0f, 0x61,0x00,0x4b,0x10,0x00,0x61,0x30,0x13,0x61,0x00,0x4c,0x10,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x02,0x20,0x00,0x00,0x61,0x30,0x17, 0x61,0x00,0x4d,0x10,0x00,0x61,0x30,0x1b,0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x1f, 0x61,0x00,0x4f,0x10,0x00,0x61,0x30,0x23,0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x27, 0x61,0x00,0x51,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x90,0x04,0x00,0x00,0x61,0x21,0x0c,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x10, 0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x18, 0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x20, 0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x36,0x10,0x00,0x61,0x00,0x28, 0x61,0x00,0x37,0x10,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x65,0x02,0x04,0x49,0x00, 0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03, 0x68,0x38,0x14,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03, 0x68,0x90,0x1c,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03, 0x68,0xa0,0x24,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x01,0x10,0x64,0x02,0x00,0x01,0x20,0x03,0x20,0x03,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7f,0x00,0x00,0x61,0x3f,0x00, 0x00,0x68,0x06,0x81,0x09,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00, 0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80, 0x00,0x60,0x86,0x01,0x00,0x04,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2f, 0x68,0x92,0x49,0x11,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0x58,0x2f,0x11,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0xfb,0x00,0x00,0x61,0x07,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x0f,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x05, 0x00,0x90,0x09,0x05,0x13,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x09,0x24,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x03,0x24,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x05,0x24,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x07,0x24,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x09,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x05,0x04,0x1f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x07,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x09,0x14,0x17,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x03,0x14,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x05,0x14,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x07,0x14,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x17,0x05,0x09,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x1f,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x05, 0x00,0x90,0x09,0x05,0x23,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x07,0x02,0x24,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03, 0x00,0x90,0x09,0x27,0x02,0x04,0x27,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x90,0x09,0x16,0x02,0x14,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7b,0x00,0x00,0x61,0x3f,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x0b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x3a,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x0f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x3a,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x13,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x0b,0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x05,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x07,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x03,0x14,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x05,0x0c,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x07,0x0c,0x13,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x17,0x03,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x00,0x00,0x0e,0x03,0x0c,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04, 0x00,0x00,0x00,0x07,0x09,0x14,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x0f, 0x60,0x00,0x05,0x10,0x00,0x61,0x05,0x13,0x60,0x00,0x07,0x10,0x00,0x61,0x04,0x1b, 0x60,0x00,0x03,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x17,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x17,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1f,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x23,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x27,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x23,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x27,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x17,0x60,0x00,0x09,0x10,0x00,0x61,0x04,0x1f, 0x60,0x00,0x05,0x10,0x00,0x61,0x04,0x23,0x60,0x00,0x07,0x10,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x55,0x05,0x00,0x05,0x00,0x61,0x05,0x27, 0x60,0x00,0x02,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x0a,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x06,0x00,0x06,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xcc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbe,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xa3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0x91,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x01,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x82,0x48,0x21,0x00,0x69,0x05,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2f,0x21,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x07,0x40,0x04,0x09, 0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x52,0x10,0x03,0x31,0xc0,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xa2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x97,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x1d,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00, 0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x40,0x3c,0x05,0xa8,0x2a,0x2f,0x11,0x01,0x31,0xb5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x05,0x04, 0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x06, 0x68,0x02,0x05,0x21,0x00,0x40,0x00,0x2f,0xa8,0x32,0x2f,0x11,0x48,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x31,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x82,0x48,0x21,0x00,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x33,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x52,0x10,0x06,0x01,0x39,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x04,0x68,0x7a,0x01,0x21,0x00,0x69,0x05,0x06, 0x68,0x02,0x2f,0x21,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x03,0x52,0x10,0x08,0x40,0x05,0x09,0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x05, 0x21,0x03,0x52,0x10,0x04,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07, 0x21,0x03,0x52,0x10,0x06,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00, 0xa0,0x0c,0x18,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x1c,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x1b,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x64,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x1b,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x01,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xac,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xde,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xc3,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xb1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xa4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0x90,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x40,0x30,0x03, 0xa8,0x2a,0x2f,0x11,0x01,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x69,0x00,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00,0x06,0xc4,0x48,0x00,0x00,0x01,0x3e,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07, 0x68,0x02,0x03,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x04, 0x68,0x82,0x48,0x21,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x0c,0x27,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x48,0x04,0x2f,0x00, 0x06,0x84,0x48,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06, 0x21,0x1b,0x52,0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x03,0x52,0x10,0x04,0x40,0x00,0x2f,0xa8,0x1a,0x2f,0x11,0x48,0x69,0x00,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xe7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xd5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x14,0x00,0x00,0x69,0x07,0x03, 0x68,0x7a,0x01,0x21,0x00,0x69,0x07,0x07,0x68,0x72,0x48,0x21,0x00,0x40,0x03,0x09, 0x21,0x1b,0x52,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x5a,0x48,0x21,0x00,0x69,0x06,0x02,0x68,0x9a,0x2f,0x21,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x52,0x10,0x03,0x40,0x05,0x04, 0x21,0x03,0x52,0x10,0x07,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08, 0x21,0x03,0x52,0x10,0x05,0x40,0x04,0x03,0x21,0x1b,0x52,0x10,0x02,0x31,0xf8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xcb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xad,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x9f,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x17,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x05,0x04,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48, 0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00, 0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2f,0x68,0x02,0x2f,0x81,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xbc,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xae,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0x93,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x13,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x08,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x07,0x00, 0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00,0x06,0xe4,0x48,0x00,0x00,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x40,0x33,0x06,0xa8,0x2a,0x2f,0x11,0x01,0x31,0xe1,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xd4,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa0,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x69,0x00,0x02, 0x68,0x9a,0x2f,0x21,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07, 0x68,0x02,0x06,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x03, 0x68,0x82,0x48,0x21,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x0c,0x23,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x48,0x04,0x2f,0x00, 0x06,0xc4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x48,0x04,0x2f,0x00, 0x06,0xa4,0x48,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0x21,0x1b,0x52,0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08, 0x21,0x03,0x52,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04, 0x21,0x03,0x52,0x10,0x03,0x40,0x00,0x2f,0xa8,0x0a,0x2f,0x11,0x48,0x31,0xd2,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xc7,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa5,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x69,0x07,0x00, 0x00,0x60,0x86,0x65,0x02,0xc4,0x48,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x07, 0x68,0x72,0x48,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05, 0x68,0x7a,0x01,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04, 0x68,0x02,0x2f,0x21,0x00,0x40,0x04,0x09,0x21,0x1b,0x52,0x10,0x02,0x40,0x04,0x03, 0x21,0x03,0x52,0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x52,0x10,0x05,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x52,0x10,0x04,0x31,0xc9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xbb,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x9a,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x14,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00, 0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xbf,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xad,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0x9c,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x3c,0x05, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x48,0x04,0x2f,0x00, 0x06,0xe4,0x48,0x00,0x00,0x40,0x00,0x2f,0xa8,0x4a,0x2f,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x04, 0x21,0x1b,0x52,0x10,0x02,0x69,0x06,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x06,0x08, 0x68,0x82,0x48,0x21,0x00,0x69,0x06,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xde,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x17,0x00,0x00,0x40,0x03,0x07, 0x21,0x03,0x52,0x10,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03, 0x21,0x03,0x52,0x10,0x08,0x40,0x04,0x09,0x21,0x1b,0x52,0x10,0x02,0x31,0xf3,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xc1,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa4,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0x90,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x12,0x00,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x9a,0x2f,0x21,0x00,0x40,0x3d,0x04, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x2f,0xa8,0x52,0x2f,0x11,0x48,0x01,0x3c,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x05,0x68,0x02,0x04,0x21,0x00,0x69,0x02,0x07, 0x68,0x02,0x2f,0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03, 0x21,0x1b,0x52,0x10,0x02,0x40,0x03,0x06,0x21,0x03,0x52,0x10,0x05,0x40,0x03,0x08, 0x21,0x03,0x52,0x10,0x07,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x0c,0x10,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00, 0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x12,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x12,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x65,0x02,0x24,0x2f,0x00, 0x05,0x20,0x00,0x20,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00, 0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x04,0x21,0x1b,0x52,0x10,0x02,0x31,0xa5,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x11,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x65,0x02,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2f, 0x68,0x02,0x2f,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x2f,0x21,0x00,0x40,0x00,0x2f, 0xa8,0x2a,0x2f,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x02,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x64,0x02,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x9a,0x2f,0x21,0x00,0x31,0xb8,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x06,0x06, 0x21,0x03,0x52,0x10,0x05,0x40,0x02,0x07,0x21,0x1b,0x52,0x10,0x02,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xba,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xaf,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x10,0x00,0x00,0x61,0x38,0x03, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00, 0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x52,0x11,0x00,0x61,0x00,0x00, 0x80,0xa0,0x0a,0x25,0x03,0x84,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x20,0x01,0x00,0x00,0x61,0x22,0x38, 0x61,0x00,0x4a,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x30,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x20,0xda,0xde,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x3d,0x03,0x62,0x00,0x52,0x11,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00,0x00,0x00,0x61,0x21,0x34, 0x61,0x00,0x4b,0x10,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xac,0x03, 0x80,0x00,0x00,0x05,0x0c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3c,0x03, 0x62,0x20,0x49,0x11,0x00,0x61,0x00,0x30,0x61,0x00,0x4c,0x10,0x00,0x31,0xae,0x03, 0x80,0x00,0x00,0x05,0x14,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x28, 0x61,0x00,0x4d,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x20, 0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x50,0x10,0x00,0x61,0x00,0x3c, 0x61,0x00,0x51,0x10,0x00,0x61,0x2d,0x39,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x35, 0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x31,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x29, 0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x21, 0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x3d, 0x61,0x00,0x0b,0x10,0x00,0x61,0x2c,0x3a,0x61,0x00,0x0c,0x10,0x00,0x61,0x00,0x36, 0x61,0x00,0x0d,0x10,0x00,0x61,0x00,0x32,0x61,0x00,0x0e,0x10,0x00,0x61,0x00,0x2a, 0x61,0x00,0x0f,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x10,0x10,0x00,0x61,0x00,0x22, 0x61,0x00,0x11,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x12,0x10,0x00,0x61,0x00,0x3e, 0x61,0x00,0x13,0x10,0x00,0x61,0x2e,0x3b,0x61,0x00,0x14,0x10,0x00,0x61,0x00,0x37, 0x61,0x00,0x15,0x10,0x00,0x61,0x00,0x33,0x61,0x00,0x16,0x10,0x00,0x61,0x00,0x2b, 0x61,0x00,0x17,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x18,0x10,0x00,0x61,0x00,0x23, 0x61,0x00,0x19,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x1a,0x10,0x00,0x61,0x00,0x3f, 0x61,0x00,0x1b,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x38,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x3a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x38,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x3a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x38,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x3a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x38,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x3a,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x34,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x36,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x30,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x32,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x28,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x34,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x36,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x30,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x32,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x28,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x34,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x36,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x30,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x32,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x28,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x2a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x34,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x36,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x30,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x32,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x28,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x2a,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x07,0x24,0x24,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x09,0x24,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0b,0x24,0x20,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x0d,0x24,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x03,0x24,0x1c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x05,0x24,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x07,0x04,0x24,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x09,0x04,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0b,0x04,0x20,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x0d,0x04,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x03,0x04,0x1c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x05,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x07,0x14,0x24,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x09,0x14,0x26,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0b,0x14,0x20,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x0d,0x14,0x22,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x03,0x14,0x1c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x05,0x14,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x24,0x05,0x07,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x26,0x05,0x09,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x20,0x05,0x0b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x22,0x05,0x0d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1c,0x05,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x90,0x09,0x05,0x1e,0x05,0x05,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x02,0x24,0x3e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x07,0x04,0x24,0x3c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x02,0x04,0x3e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x27,0x04,0x04,0x3c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x02,0x14,0x3e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x90,0x09,0x16,0x04,0x14,0x3c,0x20, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x38,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x3a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x38,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x3a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x38,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x3a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x38,0x60,0x00,0x03,0x10,0x00,0x61,0x02,0x3a, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x28,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x28,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x2a,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x28,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x2a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x34,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x36,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x30,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x32,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x28,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x2a, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x34,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x36,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x30,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x32,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x03,0x14,0x1c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x05,0x14,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x34,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x36,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x30,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x32,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x03,0x04,0x1c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x05,0x04,0x1e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x03,0x0c,0x1c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x05,0x0c,0x1e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x34,0x60,0x00,0x07,0x10,0x00,0x61,0x07,0x36, 0x60,0x00,0x09,0x10,0x00,0x61,0x07,0x30,0x60,0x00,0x0b,0x10,0x00,0x61,0x07,0x32, 0x60,0x00,0x0d,0x10,0x00,0x61,0x06,0x1c,0x60,0x00,0x03,0x10,0x00,0x61,0x06,0x1e, 0x60,0x00,0x05,0x10,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x07,0x14,0x24,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x09,0x14,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0b,0x14,0x20,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x0d,0x14,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x02,0x14,0x3e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x14,0x3c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x07,0x04,0x24,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x09,0x04,0x26,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0b,0x04,0x20,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x0d,0x04,0x22,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x02,0x04,0x3e,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x17,0x04,0x04,0x3c,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x07,0x0c,0x24,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x09,0x0c,0x26,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0b,0x0c,0x20,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x0d,0x0c,0x22,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x02,0x0c,0x3e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x0e,0x04,0x0c,0x3c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x24,0x60,0x00,0x07,0x10,0x00,0x61,0x06,0x26, 0x60,0x00,0x09,0x10,0x00,0x61,0x06,0x20,0x60,0x00,0x0b,0x10,0x00,0x61,0x06,0x22, 0x60,0x00,0x0d,0x10,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x05,0x00,0x05,0x00,0x61,0x06,0x3c,0x60,0x00,0x04,0x10,0x00,0x61,0x07,0x3e, 0x60,0x00,0x02,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x05,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x06,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xef,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xd0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xc1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x31,0xb2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xa4,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x24,0x00,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x3f,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x95,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x64,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x01,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xc7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xb8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xaa,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00, 0xa0,0x24,0x28,0x00,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xa0,0x24,0x24,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x20,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x1c,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00, 0xa0,0x24,0x3c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00, 0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x48,0x24,0x2f,0x00, 0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x48,0xa8,0x22,0x2f,0x11,0x48,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x01,0x24,0x2f,0x00,0x06,0xe4,0x01,0x00,0x00,0x65,0x07,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xb6,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xa9,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x06,0x24,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00, 0x00,0x20,0x82,0x45,0x07,0x04,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00, 0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00, 0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdf,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x31,0xc0,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xb1,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xa2,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0x94,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x68,0x00,0x00, 0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x01,0x24,0x2f,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x48,0x24,0x2f,0x00,0x06,0x44,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00, 0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00, 0x00,0x20,0x82,0x45,0x05,0x44,0x48,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00, 0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc5,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xb7,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xa8,0x04, 0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x20,0x00,0x00, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00,0x06,0x24,0x48,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x35,0x00, 0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2f,0x00, 0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00, 0x06,0xff,0xff,0xff,0x0f,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x38,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2f,0x04,0x2f,0x00, 0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2f,0x24,0x2f,0x00, 0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2f,0x00, 0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2f,0x00, 0x01,0x04,0x00,0x04,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00, 0xa0,0x24,0x38,0x00,0x00,0x31,0x9d,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00, 0xa0,0x24,0x34,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0x01,0x03, 0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01,0x00, 0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00, 0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01,0x01, 0x00,0x60,0x86,0x85,0x02,0x85,0x49,0x22,0x05,0x1f,0x00,0x1f,0x00,0x61,0x00,0x04, 0xa8,0x60,0x00,0xc1,0xb4,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x49,0xa4,0x02,0x00, 0x06,0xa4,0x49,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x02,0x00, 0x06,0x84,0x49,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06,0xa5,0x49,0xa4,0x49,0x00, 0x06,0xa4,0x02,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00, 0x06,0x84,0x02,0x00,0x00,0x61,0x02,0x00,0x00,0xa0,0x02,0xc5,0x02,0xa4,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0xa0,0x02,0x25,0x03,0x84,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x38,0xae,0x00,0x00,0xa0,0x0a,0x45,0x04,0xc4,0x02,0x00, 0x10,0x00,0x00,0x00,0x00,0x5b,0xfe,0x00,0x00,0xa0,0x02,0x44,0x04,0x44,0x04,0x02, 0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00,0x00,0x60,0x0a,0x65,0x02,0xc4,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a,0x45,0x03,0x24,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x05,0x05,0x44,0x04,0x00, 0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x65,0x02,0xa4,0x49,0x00, 0x06,0x64,0x02,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06,0x45,0x03,0x84,0x49,0x00, 0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06,0xe8,0x05,0x05,0x11,0x00,0x61,0x03,0x03, 0x68,0x7e,0x02,0x11,0x00,0x61,0x03,0x04,0x68,0x46,0x03,0x11,0x00,0x61,0x03,0x06, 0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x00,0x00,0x60,0x06,0xa5,0x02,0xa4,0x02,0x00, 0x06,0x84,0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0xa0,0x02,0xc4,0x02,0x24,0x03,0x82, 0x02,0x24,0x06,0xc4,0x02,0x5b,0x04,0x00,0x00,0xa0,0x02,0x04,0x03,0x04,0x04,0x82, 0x02,0x24,0x06,0x04,0x03,0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x05,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x00,0x40,0x02,0x00,0x00,0xa0,0x0a,0xc5,0x02,0xc4,0x02,0x00, 0x0a,0x04,0x03,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x04,0x44,0x04,0x00, 0x0a,0xc4,0x02,0x00,0x00,0x61,0x01,0x07,0xe8,0x45,0x04,0x11,0x00,0x40,0x01,0x07, 0xa8,0x02,0x07,0x11,0x06,0x41,0x01,0x20,0x22,0x36,0x07,0x11,0x49,0x49,0x00,0x08, 0xa8,0x32,0x07,0x11,0x49,0x40,0x07,0x07,0xa8,0x32,0x07,0x11,0x02,0x40,0x02,0x00, 0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x04,0x08,0x00,0x02,0x70,0x01,0x00, 0x00,0x20,0x02,0x01,0x00,0x84,0x49,0x00,0x42,0xa4,0x49,0x00,0x00,0x62,0x07,0x00, 0x01,0x60,0x85,0x25,0x07,0x04,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x07, 0xa8,0x12,0x07,0x11,0x07,0x67,0x01,0x00,0x00,0x60,0x06,0x85,0x49,0x04,0x07,0x00, 0x06,0xa4,0x02,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00, 0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x49,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0e,0x00,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65, 0x43,0x6f,0x70,0x79,0x5f,0x72,0x65,0x61,0x64,0x5f,0x33,0x32,0x78,0x33,0x32,0x00, 0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74, 0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f, 0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65, 0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54, 0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32, 0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00, 0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33, 0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30, 0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00, 0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34, 0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30, 0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00, 0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35, 0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30, 0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00, 0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35, 0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30, 0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00, 0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36, 0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30, 0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00, 0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37, 0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30, 0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00, 0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38, 0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30, 0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00, 0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39, 0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30, 0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00, 0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39, 0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30, 0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00, 0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30, 0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30, 0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00, 0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31, 0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30, 0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00, 0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32, 0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30, 0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00, 0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33, 0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30, 0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00, 0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33, 0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30, 0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00, 0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34, 0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30, 0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00, 0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35, 0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30, 0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00, 0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36, 0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30, 0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00, 0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37, 0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30, 0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00, 0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37, 0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30, 0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00, 0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38, 0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30, 0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00, 0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39, 0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30, 0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00, 0x56,0x30,0x32,0x30,0x31,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30, 0x33,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30, 0x32,0x30,0x36,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00, 0x56,0x30,0x32,0x30,0x39,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31, 0x31,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30, 0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00, 0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31, 0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30, 0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00, 0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32, 0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30, 0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00, 0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33, 0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30, 0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00, 0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34, 0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30, 0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00, 0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35, 0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30, 0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00, 0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35, 0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30, 0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00, 0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36, 0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30, 0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00, 0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37, 0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30, 0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00, 0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38, 0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30, 0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00, 0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39, 0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30, 0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00, 0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39, 0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30, 0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00, 0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30, 0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30, 0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00, 0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31, 0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30, 0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00, 0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32, 0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30, 0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00, 0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33, 0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30, 0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00, 0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33, 0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30, 0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00, 0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34, 0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30, 0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00, 0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35, 0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30, 0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00, 0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36, 0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30, 0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00, 0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37, 0x31,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x56,0x30, 0x33,0x37,0x34,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33,0x37,0x36,0x00, 0x56,0x30,0x33,0x37,0x37,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30,0x33,0x37, 0x39,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00,0x56,0x30, 0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38,0x34,0x00, 0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30,0x33,0x38, 0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00,0x56,0x30, 0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39,0x32,0x00, 0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30,0x33,0x39, 0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00,0x56,0x30, 0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30,0x30,0x00, 0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30,0x34,0x30, 0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00,0x56,0x30, 0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30,0x38,0x00, 0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30,0x34,0x31, 0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00,0x56,0x30, 0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31,0x36,0x00, 0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30,0x34,0x31, 0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00,0x56,0x30, 0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32,0x34,0x00, 0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30,0x34,0x32, 0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00,0x56,0x30, 0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33,0x32,0x00, 0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30,0x34,0x33, 0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00,0x56,0x30, 0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34,0x30,0x00, 0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30,0x34,0x34, 0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00,0x56,0x30, 0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34,0x38,0x00, 0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30,0x34,0x35, 0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00,0x56,0x30, 0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35,0x36,0x00, 0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30,0x34,0x35, 0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00,0x56,0x30, 0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36,0x34,0x00, 0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30,0x34,0x36, 0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00,0x56,0x30, 0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37,0x32,0x00, 0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30,0x34,0x37, 0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00,0x56,0x30, 0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38,0x30,0x00, 0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30,0x34,0x38, 0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00,0x56,0x30, 0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38,0x38,0x00, 0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30,0x34,0x39, 0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00,0x56,0x30, 0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39,0x36,0x00, 0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30,0x34,0x39, 0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00,0x56,0x30, 0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30,0x34,0x00, 0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30,0x35,0x30, 0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00,0x56,0x30, 0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31,0x32,0x00, 0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30,0x35,0x31, 0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00,0x56,0x30, 0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32,0x30,0x00, 0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30,0x35,0x32, 0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00,0x56,0x30, 0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32,0x38,0x00, 0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30,0x35,0x33, 0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00,0x56,0x30, 0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33,0x36,0x00, 0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30,0x35,0x33, 0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00,0x56,0x30, 0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34,0x34,0x00, 0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30,0x35,0x34, 0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00,0x56,0x30, 0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35,0x32,0x00, 0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30,0x35,0x35, 0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00,0x56,0x30, 0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36,0x30,0x00, 0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30,0x35,0x36, 0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00,0x56,0x30, 0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36,0x38,0x00, 0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30,0x35,0x37, 0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00,0x56,0x30, 0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37,0x36,0x00, 0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30,0x35,0x37, 0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00,0x56,0x30, 0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38,0x34,0x00, 0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30,0x35,0x38, 0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00,0x56,0x30, 0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39,0x32,0x00, 0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30,0x35,0x39, 0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00,0x56,0x30, 0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30,0x30,0x00, 0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30,0x36,0x30, 0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00,0x56,0x30, 0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30,0x38,0x00, 0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30,0x36,0x31, 0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00,0x56,0x30, 0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31,0x36,0x00, 0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30,0x36,0x31, 0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00,0x56,0x30, 0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32,0x34,0x00, 0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30,0x36,0x32, 0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00,0x56,0x30, 0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33,0x32,0x00, 0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30,0x36,0x33, 0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00,0x56,0x30, 0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34,0x30,0x00, 0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30,0x36,0x34, 0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00,0x56,0x30, 0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34,0x38,0x00, 0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30,0x36,0x35, 0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00,0x56,0x30, 0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35,0x36,0x00, 0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56,0x30,0x36,0x35, 0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31,0x00,0x56,0x30, 0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36,0x36,0x34,0x00, 0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56,0x30,0x36,0x36, 0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39,0x00,0x56,0x30, 0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36,0x37,0x32,0x00, 0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56,0x30,0x36,0x37, 0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37,0x00,0x56,0x30, 0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36,0x38,0x30,0x00, 0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56,0x30,0x36,0x38, 0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35,0x00,0x56,0x30, 0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36,0x38,0x38,0x00, 0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56,0x30,0x36,0x39, 0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33,0x00,0x56,0x30, 0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36,0x39,0x36,0x00, 0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56,0x30,0x36,0x39, 0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31,0x00,0x56,0x30, 0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37,0x30,0x34,0x00, 0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56,0x30,0x37,0x30, 0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39,0x00,0x56,0x30, 0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37,0x31,0x32,0x00, 0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56,0x30,0x37,0x31, 0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37,0x00,0x56,0x30, 0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37,0x32,0x30,0x00, 0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56,0x30,0x37,0x32, 0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35,0x00,0x56,0x30, 0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37,0x32,0x38,0x00, 0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56,0x30,0x37,0x33, 0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33,0x00,0x56,0x30, 0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37,0x33,0x36,0x00, 0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56,0x30,0x37,0x33, 0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31,0x00,0x56,0x30, 0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37,0x34,0x34,0x00, 0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56,0x30,0x37,0x34, 0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39,0x00,0x56,0x30, 0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37,0x35,0x32,0x00, 0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56,0x30,0x37,0x35, 0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37,0x00,0x56,0x30, 0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37,0x36,0x30,0x00, 0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56,0x30,0x37,0x36, 0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35,0x00,0x56,0x30, 0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37,0x36,0x38,0x00, 0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56,0x30,0x37,0x37, 0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33,0x00,0x56,0x30, 0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37,0x37,0x36,0x00, 0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56,0x30,0x37,0x37, 0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31,0x00,0x56,0x30, 0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37,0x38,0x34,0x00, 0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56,0x30,0x37,0x38, 0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39,0x00,0x56,0x30, 0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37,0x39,0x32,0x00, 0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56,0x30,0x37,0x39, 0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37,0x00,0x56,0x30, 0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38,0x30,0x30,0x00, 0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56,0x30,0x38,0x30, 0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35,0x00,0x56,0x30, 0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38,0x30,0x38,0x00, 0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56,0x30,0x38,0x31, 0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33,0x00,0x56,0x30, 0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38,0x31,0x36,0x00, 0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56,0x30,0x38,0x31, 0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31,0x00,0x56,0x30, 0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38,0x32,0x34,0x00, 0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56,0x30,0x38,0x32, 0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39,0x00,0x56,0x30, 0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38,0x33,0x32,0x00, 0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56,0x30,0x38,0x33, 0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37,0x00,0x56,0x30, 0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38,0x34,0x30,0x00, 0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56,0x30,0x38,0x34, 0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35,0x00,0x56,0x30, 0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38,0x34,0x38,0x00, 0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56,0x30,0x38,0x35, 0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33,0x00,0x56,0x30, 0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38,0x35,0x36,0x00, 0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56,0x30,0x38,0x35, 0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31,0x00,0x56,0x30, 0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38,0x36,0x34,0x00, 0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x56,0x30,0x38,0x36, 0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36,0x39,0x00,0x56,0x30, 0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30,0x38,0x37,0x32,0x00, 0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00,0x56,0x30,0x38,0x37, 0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37,0x37,0x00,0x56,0x30, 0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30,0x38,0x38,0x30,0x00, 0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00,0x56,0x30,0x38,0x38, 0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38,0x35,0x00,0x56,0x30, 0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30,0x38,0x38,0x38,0x00, 0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00,0x56,0x30,0x38,0x39, 0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39,0x33,0x00,0x56,0x30, 0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30,0x38,0x39,0x36,0x00, 0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00,0x56,0x30,0x38,0x39, 0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30,0x31,0x00,0x56,0x30, 0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30,0x39,0x30,0x34,0x00, 0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00,0x56,0x30,0x39,0x30, 0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30,0x39,0x00,0x56,0x30, 0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30,0x39,0x31,0x32,0x00, 0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00,0x56,0x30,0x39,0x31, 0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31,0x37,0x00,0x56,0x30, 0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30,0x39,0x32,0x30,0x00, 0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00,0x56,0x30,0x39,0x32, 0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32,0x35,0x00,0x56,0x30, 0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30,0x39,0x32,0x38,0x00, 0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00,0x56,0x30,0x39,0x33, 0x31,0x00,0x56,0x30,0x39,0x33,0x32,0x00,0x56,0x30,0x39,0x33,0x33,0x00,0x56,0x30, 0x39,0x33,0x34,0x00,0x56,0x30,0x39,0x33,0x35,0x00,0x56,0x30,0x39,0x33,0x36,0x00, 0x56,0x30,0x39,0x33,0x37,0x00,0x56,0x30,0x39,0x33,0x38,0x00,0x56,0x30,0x39,0x33, 0x39,0x00,0x56,0x30,0x39,0x34,0x30,0x00,0x56,0x30,0x39,0x34,0x31,0x00,0x56,0x30, 0x39,0x34,0x32,0x00,0x56,0x30,0x39,0x34,0x33,0x00,0x56,0x30,0x39,0x34,0x34,0x00, 0x56,0x30,0x39,0x34,0x35,0x00,0x56,0x30,0x39,0x34,0x36,0x00,0x56,0x30,0x39,0x34, 0x37,0x00,0x56,0x30,0x39,0x34,0x38,0x00,0x56,0x30,0x39,0x34,0x39,0x00,0x56,0x30, 0x39,0x35,0x30,0x00,0x56,0x30,0x39,0x35,0x31,0x00,0x56,0x30,0x39,0x35,0x32,0x00, 0x56,0x30,0x39,0x35,0x33,0x00,0x56,0x30,0x39,0x35,0x34,0x00,0x56,0x30,0x39,0x35, 0x35,0x00,0x56,0x30,0x39,0x35,0x36,0x00,0x56,0x30,0x39,0x35,0x37,0x00,0x56,0x30, 0x39,0x35,0x38,0x00,0x56,0x30,0x39,0x35,0x39,0x00,0x56,0x30,0x39,0x36,0x30,0x00, 0x56,0x30,0x39,0x36,0x31,0x00,0x56,0x30,0x39,0x36,0x32,0x00,0x56,0x30,0x39,0x36, 0x33,0x00,0x56,0x30,0x39,0x36,0x34,0x00,0x56,0x30,0x39,0x36,0x35,0x00,0x56,0x30, 0x39,0x36,0x36,0x00,0x56,0x30,0x39,0x36,0x37,0x00,0x56,0x30,0x39,0x36,0x38,0x00, 0x56,0x30,0x39,0x36,0x39,0x00,0x56,0x30,0x39,0x37,0x30,0x00,0x56,0x30,0x39,0x37, 0x31,0x00,0x56,0x30,0x39,0x37,0x32,0x00,0x56,0x30,0x39,0x37,0x33,0x00,0x56,0x30, 0x39,0x37,0x34,0x00,0x56,0x30,0x39,0x37,0x35,0x00,0x56,0x30,0x39,0x37,0x36,0x00, 0x56,0x30,0x39,0x37,0x37,0x00,0x56,0x30,0x39,0x37,0x38,0x00,0x56,0x30,0x39,0x37, 0x39,0x00,0x56,0x30,0x39,0x38,0x30,0x00,0x56,0x30,0x39,0x38,0x31,0x00,0x56,0x30, 0x39,0x38,0x32,0x00,0x56,0x30,0x39,0x38,0x33,0x00,0x56,0x30,0x39,0x38,0x34,0x00, 0x56,0x30,0x39,0x38,0x35,0x00,0x56,0x30,0x39,0x38,0x36,0x00,0x56,0x30,0x39,0x38, 0x37,0x00,0x56,0x30,0x39,0x38,0x38,0x00,0x56,0x30,0x39,0x38,0x39,0x00,0x56,0x30, 0x39,0x39,0x30,0x00,0x56,0x30,0x39,0x39,0x31,0x00,0x56,0x30,0x39,0x39,0x32,0x00, 0x56,0x30,0x39,0x39,0x33,0x00,0x56,0x30,0x39,0x39,0x34,0x00,0x56,0x30,0x39,0x39, 0x35,0x00,0x56,0x30,0x39,0x39,0x36,0x00,0x56,0x30,0x39,0x39,0x37,0x00,0x56,0x30, 0x39,0x39,0x38,0x00,0x56,0x30,0x39,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x30,0x00, 0x56,0x31,0x30,0x30,0x31,0x00,0x56,0x31,0x30,0x30,0x32,0x00,0x56,0x31,0x30,0x30, 0x33,0x00,0x56,0x31,0x30,0x30,0x34,0x00,0x56,0x31,0x30,0x30,0x35,0x00,0x56,0x31, 0x30,0x30,0x36,0x00,0x56,0x31,0x30,0x30,0x37,0x00,0x56,0x31,0x30,0x30,0x38,0x00, 0x56,0x31,0x30,0x30,0x39,0x00,0x56,0x31,0x30,0x31,0x30,0x00,0x56,0x31,0x30,0x31, 0x31,0x00,0x56,0x31,0x30,0x31,0x32,0x00,0x56,0x31,0x30,0x31,0x33,0x00,0x56,0x31, 0x30,0x31,0x34,0x00,0x56,0x31,0x30,0x31,0x35,0x00,0x56,0x31,0x30,0x31,0x36,0x00, 0x56,0x31,0x30,0x31,0x37,0x00,0x56,0x31,0x30,0x31,0x38,0x00,0x56,0x31,0x30,0x31, 0x39,0x00,0x56,0x31,0x30,0x32,0x30,0x00,0x56,0x31,0x30,0x32,0x31,0x00,0x56,0x31, 0x30,0x32,0x32,0x00,0x56,0x31,0x30,0x32,0x33,0x00,0x56,0x31,0x30,0x32,0x34,0x00, 0x56,0x31,0x30,0x32,0x35,0x00,0x56,0x31,0x30,0x32,0x36,0x00,0x56,0x31,0x30,0x32, 0x37,0x00,0x56,0x31,0x30,0x32,0x38,0x00,0x56,0x31,0x30,0x32,0x39,0x00,0x56,0x31, 0x30,0x33,0x30,0x00,0x56,0x31,0x30,0x33,0x31,0x00,0x56,0x31,0x30,0x33,0x32,0x00, 0x56,0x31,0x30,0x33,0x33,0x00,0x56,0x31,0x30,0x33,0x34,0x00,0x56,0x31,0x30,0x33, 0x35,0x00,0x56,0x31,0x30,0x33,0x36,0x00,0x56,0x31,0x30,0x33,0x37,0x00,0x56,0x31, 0x30,0x33,0x38,0x00,0x56,0x31,0x30,0x33,0x39,0x00,0x56,0x31,0x30,0x34,0x30,0x00, 0x56,0x31,0x30,0x34,0x31,0x00,0x56,0x31,0x30,0x34,0x32,0x00,0x56,0x31,0x30,0x34, 0x33,0x00,0x56,0x31,0x30,0x34,0x34,0x00,0x56,0x31,0x30,0x34,0x35,0x00,0x56,0x31, 0x30,0x34,0x36,0x00,0x56,0x31,0x30,0x34,0x37,0x00,0x56,0x31,0x30,0x34,0x38,0x00, 0x56,0x31,0x30,0x34,0x39,0x00,0x56,0x31,0x30,0x35,0x30,0x00,0x56,0x31,0x30,0x35, 0x31,0x00,0x56,0x31,0x30,0x35,0x32,0x00,0x56,0x31,0x30,0x35,0x33,0x00,0x56,0x31, 0x30,0x35,0x34,0x00,0x56,0x31,0x30,0x35,0x35,0x00,0x56,0x31,0x30,0x35,0x36,0x00, 0x56,0x31,0x30,0x35,0x37,0x00,0x56,0x31,0x30,0x35,0x38,0x00,0x56,0x31,0x30,0x35, 0x39,0x00,0x56,0x31,0x30,0x36,0x30,0x00,0x56,0x31,0x30,0x36,0x31,0x00,0x56,0x31, 0x30,0x36,0x32,0x00,0x56,0x31,0x30,0x36,0x33,0x00,0x56,0x31,0x30,0x36,0x34,0x00, 0x56,0x31,0x30,0x36,0x35,0x00,0x56,0x31,0x30,0x36,0x36,0x00,0x56,0x31,0x30,0x36, 0x37,0x00,0x56,0x31,0x30,0x36,0x38,0x00,0x56,0x31,0x30,0x36,0x39,0x00,0x56,0x31, 0x30,0x37,0x30,0x00,0x56,0x31,0x30,0x37,0x31,0x00,0x56,0x31,0x30,0x37,0x32,0x00, 0x56,0x31,0x30,0x37,0x33,0x00,0x56,0x31,0x30,0x37,0x34,0x00,0x56,0x31,0x30,0x37, 0x35,0x00,0x56,0x31,0x30,0x37,0x36,0x00,0x56,0x31,0x30,0x37,0x37,0x00,0x56,0x31, 0x30,0x37,0x38,0x00,0x56,0x31,0x30,0x37,0x39,0x00,0x56,0x31,0x30,0x38,0x30,0x00, 0x56,0x31,0x30,0x38,0x31,0x00,0x56,0x31,0x30,0x38,0x32,0x00,0x56,0x31,0x30,0x38, 0x33,0x00,0x56,0x31,0x30,0x38,0x34,0x00,0x56,0x31,0x30,0x38,0x35,0x00,0x56,0x31, 0x30,0x38,0x36,0x00,0x56,0x31,0x30,0x38,0x37,0x00,0x56,0x31,0x30,0x38,0x38,0x00, 0x56,0x31,0x30,0x38,0x39,0x00,0x56,0x31,0x30,0x39,0x30,0x00,0x56,0x31,0x30,0x39, 0x31,0x00,0x56,0x31,0x30,0x39,0x32,0x00,0x56,0x31,0x30,0x39,0x33,0x00,0x56,0x31, 0x30,0x39,0x34,0x00,0x56,0x31,0x30,0x39,0x35,0x00,0x56,0x31,0x30,0x39,0x36,0x00, 0x56,0x31,0x30,0x39,0x37,0x00,0x56,0x31,0x30,0x39,0x38,0x00,0x56,0x31,0x30,0x39, 0x39,0x00,0x56,0x31,0x31,0x30,0x30,0x00,0x56,0x31,0x31,0x30,0x31,0x00,0x56,0x31, 0x31,0x30,0x32,0x00,0x56,0x31,0x31,0x30,0x33,0x00,0x56,0x31,0x31,0x30,0x34,0x00, 0x56,0x31,0x31,0x30,0x35,0x00,0x56,0x31,0x31,0x30,0x36,0x00,0x56,0x31,0x31,0x30, 0x37,0x00,0x56,0x31,0x31,0x30,0x38,0x00,0x56,0x31,0x31,0x30,0x39,0x00,0x56,0x31, 0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x31,0x32,0x00, 0x56,0x31,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x31, 0x35,0x00,0x56,0x31,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x31,0x37,0x00,0x56,0x31, 0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x31,0x39,0x00,0x56,0x31,0x31,0x32,0x30,0x00, 0x56,0x31,0x31,0x32,0x31,0x00,0x56,0x31,0x31,0x32,0x32,0x00,0x56,0x31,0x31,0x32, 0x33,0x00,0x56,0x31,0x31,0x32,0x34,0x00,0x56,0x31,0x31,0x32,0x35,0x00,0x56,0x31, 0x31,0x32,0x36,0x00,0x56,0x31,0x31,0x32,0x37,0x00,0x56,0x31,0x31,0x32,0x38,0x00, 0x56,0x31,0x31,0x32,0x39,0x00,0x56,0x31,0x31,0x33,0x30,0x00,0x56,0x31,0x31,0x33, 0x31,0x00,0x56,0x31,0x31,0x33,0x32,0x00,0x56,0x31,0x31,0x33,0x33,0x00,0x56,0x31, 0x31,0x33,0x34,0x00,0x56,0x31,0x31,0x33,0x35,0x00,0x56,0x31,0x31,0x33,0x36,0x00, 0x56,0x31,0x31,0x33,0x37,0x00,0x56,0x31,0x31,0x33,0x38,0x00,0x56,0x31,0x31,0x33, 0x39,0x00,0x56,0x31,0x31,0x34,0x30,0x00,0x56,0x31,0x31,0x34,0x31,0x00,0x56,0x31, 0x31,0x34,0x32,0x00,0x56,0x31,0x31,0x34,0x33,0x00,0x56,0x31,0x31,0x34,0x34,0x00, 0x56,0x31,0x31,0x34,0x35,0x00,0x56,0x31,0x31,0x34,0x36,0x00,0x56,0x31,0x31,0x34, 0x37,0x00,0x56,0x31,0x31,0x34,0x38,0x00,0x56,0x31,0x31,0x34,0x39,0x00,0x56,0x31, 0x31,0x35,0x30,0x00,0x56,0x31,0x31,0x35,0x31,0x00,0x56,0x31,0x31,0x35,0x32,0x00, 0x56,0x31,0x31,0x35,0x33,0x00,0x56,0x31,0x31,0x35,0x34,0x00,0x56,0x31,0x31,0x35, 0x35,0x00,0x56,0x31,0x31,0x35,0x36,0x00,0x56,0x31,0x31,0x35,0x37,0x00,0x56,0x31, 0x31,0x35,0x38,0x00,0x56,0x31,0x31,0x35,0x39,0x00,0x56,0x31,0x31,0x36,0x30,0x00, 0x56,0x31,0x31,0x36,0x31,0x00,0x56,0x31,0x31,0x36,0x32,0x00,0x56,0x31,0x31,0x36, 0x33,0x00,0x56,0x31,0x31,0x36,0x34,0x00,0x56,0x31,0x31,0x36,0x35,0x00,0x56,0x31, 0x31,0x36,0x36,0x00,0x56,0x31,0x31,0x36,0x37,0x00,0x56,0x31,0x31,0x36,0x38,0x00, 0x56,0x31,0x31,0x36,0x39,0x00,0x56,0x31,0x31,0x37,0x30,0x00,0x56,0x31,0x31,0x37, 0x31,0x00,0x56,0x31,0x31,0x37,0x32,0x00,0x56,0x31,0x31,0x37,0x33,0x00,0x56,0x31, 0x31,0x37,0x34,0x00,0x56,0x31,0x31,0x37,0x35,0x00,0x56,0x31,0x31,0x37,0x36,0x00, 0x56,0x31,0x31,0x37,0x37,0x00,0x56,0x31,0x31,0x37,0x38,0x00,0x56,0x31,0x31,0x37, 0x39,0x00,0x56,0x31,0x31,0x38,0x30,0x00,0x56,0x31,0x31,0x38,0x31,0x00,0x56,0x31, 0x31,0x38,0x32,0x00,0x56,0x31,0x31,0x38,0x33,0x00,0x56,0x31,0x31,0x38,0x34,0x00, 0x56,0x31,0x31,0x38,0x35,0x00,0x56,0x31,0x31,0x38,0x36,0x00,0x56,0x31,0x31,0x38, 0x37,0x00,0x56,0x31,0x31,0x38,0x38,0x00,0x56,0x31,0x31,0x38,0x39,0x00,0x56,0x31, 0x31,0x39,0x30,0x00,0x56,0x31,0x31,0x39,0x31,0x00,0x56,0x31,0x31,0x39,0x32,0x00, 0x56,0x31,0x31,0x39,0x33,0x00,0x56,0x31,0x31,0x39,0x34,0x00,0x56,0x31,0x31,0x39, 0x35,0x00,0x56,0x31,0x31,0x39,0x36,0x00,0x56,0x31,0x31,0x39,0x37,0x00,0x56,0x31, 0x31,0x39,0x38,0x00,0x56,0x31,0x31,0x39,0x39,0x00,0x56,0x31,0x32,0x30,0x30,0x00, 0x56,0x31,0x32,0x30,0x31,0x00,0x56,0x31,0x32,0x30,0x32,0x00,0x56,0x31,0x32,0x30, 0x33,0x00,0x56,0x31,0x32,0x30,0x34,0x00,0x56,0x31,0x32,0x30,0x35,0x00,0x56,0x31, 0x32,0x30,0x36,0x00,0x56,0x31,0x32,0x30,0x37,0x00,0x56,0x31,0x32,0x30,0x38,0x00, 0x56,0x31,0x32,0x30,0x39,0x00,0x56,0x31,0x32,0x31,0x30,0x00,0x56,0x31,0x32,0x31, 0x31,0x00,0x56,0x31,0x32,0x31,0x32,0x00,0x56,0x31,0x32,0x31,0x33,0x00,0x56,0x31, 0x32,0x31,0x34,0x00,0x56,0x31,0x32,0x31,0x35,0x00,0x56,0x31,0x32,0x31,0x36,0x00, 0x56,0x31,0x32,0x31,0x37,0x00,0x56,0x31,0x32,0x31,0x38,0x00,0x56,0x31,0x32,0x31, 0x39,0x00,0x56,0x31,0x32,0x32,0x30,0x00,0x56,0x31,0x32,0x32,0x31,0x00,0x56,0x31, 0x32,0x32,0x32,0x00,0x56,0x31,0x32,0x32,0x33,0x00,0x56,0x31,0x32,0x32,0x34,0x00, 0x56,0x31,0x32,0x32,0x35,0x00,0x56,0x31,0x32,0x32,0x36,0x00,0x56,0x31,0x32,0x32, 0x37,0x00,0x56,0x31,0x32,0x32,0x38,0x00,0x56,0x31,0x32,0x32,0x39,0x00,0x56,0x31, 0x32,0x33,0x30,0x00,0x56,0x31,0x32,0x33,0x31,0x00,0x56,0x31,0x32,0x33,0x32,0x00, 0x56,0x31,0x32,0x33,0x33,0x00,0x56,0x31,0x32,0x33,0x34,0x00,0x56,0x31,0x32,0x33, 0x35,0x00,0x56,0x31,0x32,0x33,0x36,0x00,0x56,0x31,0x32,0x33,0x37,0x00,0x56,0x31, 0x32,0x33,0x38,0x00,0x56,0x31,0x32,0x33,0x39,0x00,0x56,0x31,0x32,0x34,0x30,0x00, 0x56,0x31,0x32,0x34,0x31,0x00,0x56,0x31,0x32,0x34,0x32,0x00,0x56,0x31,0x32,0x34, 0x33,0x00,0x56,0x31,0x32,0x34,0x34,0x00,0x56,0x31,0x32,0x34,0x35,0x00,0x56,0x31, 0x32,0x34,0x36,0x00,0x56,0x31,0x32,0x34,0x37,0x00,0x56,0x31,0x32,0x34,0x38,0x00, 0x56,0x31,0x32,0x34,0x39,0x00,0x56,0x31,0x32,0x35,0x30,0x00,0x56,0x31,0x32,0x35, 0x31,0x00,0x56,0x31,0x32,0x35,0x32,0x00,0x56,0x31,0x32,0x35,0x33,0x00,0x56,0x31, 0x32,0x35,0x34,0x00,0x56,0x31,0x32,0x35,0x35,0x00,0x56,0x31,0x32,0x35,0x36,0x00, 0x56,0x31,0x32,0x35,0x37,0x00,0x56,0x31,0x32,0x35,0x38,0x00,0x56,0x31,0x32,0x35, 0x39,0x00,0x56,0x31,0x32,0x36,0x30,0x00,0x56,0x31,0x32,0x36,0x31,0x00,0x56,0x31, 0x32,0x36,0x32,0x00,0x56,0x31,0x32,0x36,0x33,0x00,0x56,0x31,0x32,0x36,0x34,0x00, 0x56,0x31,0x32,0x36,0x35,0x00,0x56,0x31,0x32,0x36,0x36,0x00,0x56,0x31,0x32,0x36, 0x37,0x00,0x56,0x31,0x32,0x36,0x38,0x00,0x56,0x31,0x32,0x36,0x39,0x00,0x56,0x31, 0x32,0x37,0x30,0x00,0x56,0x31,0x32,0x37,0x31,0x00,0x56,0x31,0x32,0x37,0x32,0x00, 0x56,0x31,0x32,0x37,0x33,0x00,0x56,0x31,0x32,0x37,0x34,0x00,0x56,0x31,0x32,0x37, 0x35,0x00,0x56,0x31,0x32,0x37,0x36,0x00,0x56,0x31,0x32,0x37,0x37,0x00,0x56,0x31, 0x32,0x37,0x38,0x00,0x56,0x31,0x32,0x37,0x39,0x00,0x56,0x31,0x32,0x38,0x30,0x00, 0x56,0x31,0x32,0x38,0x31,0x00,0x56,0x31,0x32,0x38,0x32,0x00,0x56,0x31,0x32,0x38, 0x33,0x00,0x56,0x31,0x32,0x38,0x34,0x00,0x56,0x31,0x32,0x38,0x35,0x00,0x56,0x31, 0x32,0x38,0x36,0x00,0x56,0x31,0x32,0x38,0x37,0x00,0x56,0x31,0x32,0x38,0x38,0x00, 0x56,0x31,0x32,0x38,0x39,0x00,0x56,0x31,0x32,0x39,0x30,0x00,0x56,0x31,0x32,0x39, 0x31,0x00,0x56,0x31,0x32,0x39,0x32,0x00,0x56,0x31,0x32,0x39,0x33,0x00,0x56,0x31, 0x32,0x39,0x34,0x00,0x56,0x31,0x32,0x39,0x35,0x00,0x56,0x31,0x32,0x39,0x36,0x00, 0x56,0x31,0x32,0x39,0x37,0x00,0x56,0x31,0x32,0x39,0x38,0x00,0x56,0x31,0x32,0x39, 0x39,0x00,0x56,0x31,0x33,0x30,0x30,0x00,0x56,0x31,0x33,0x30,0x31,0x00,0x56,0x31, 0x33,0x30,0x32,0x00,0x56,0x31,0x33,0x30,0x33,0x00,0x56,0x31,0x33,0x30,0x34,0x00, 0x56,0x31,0x33,0x30,0x35,0x00,0x56,0x31,0x33,0x30,0x36,0x00,0x56,0x31,0x33,0x30, 0x37,0x00,0x56,0x31,0x33,0x30,0x38,0x00,0x56,0x31,0x33,0x30,0x39,0x00,0x56,0x31, 0x33,0x31,0x30,0x00,0x56,0x31,0x33,0x31,0x31,0x00,0x56,0x31,0x33,0x31,0x32,0x00, 0x56,0x31,0x33,0x31,0x33,0x00,0x56,0x31,0x33,0x31,0x34,0x00,0x56,0x31,0x33,0x31, 0x35,0x00,0x56,0x31,0x33,0x31,0x36,0x00,0x56,0x31,0x33,0x31,0x37,0x00,0x56,0x31, 0x33,0x31,0x38,0x00,0x56,0x31,0x33,0x31,0x39,0x00,0x56,0x31,0x33,0x32,0x30,0x00, 0x56,0x31,0x33,0x32,0x31,0x00,0x56,0x31,0x33,0x32,0x32,0x00,0x56,0x31,0x33,0x32, 0x33,0x00,0x56,0x31,0x33,0x32,0x34,0x00,0x56,0x31,0x33,0x32,0x35,0x00,0x56,0x31, 0x33,0x32,0x36,0x00,0x56,0x31,0x33,0x32,0x37,0x00,0x56,0x31,0x33,0x32,0x38,0x00, 0x56,0x31,0x33,0x32,0x39,0x00,0x56,0x31,0x33,0x33,0x30,0x00,0x56,0x31,0x33,0x33, 0x31,0x00,0x56,0x31,0x33,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x33,0x00,0x56,0x31, 0x33,0x33,0x34,0x00,0x56,0x31,0x33,0x33,0x35,0x00,0x56,0x31,0x33,0x33,0x36,0x00, 0x56,0x31,0x33,0x33,0x37,0x00,0x56,0x31,0x33,0x33,0x38,0x00,0x56,0x31,0x33,0x33, 0x39,0x00,0x56,0x31,0x33,0x34,0x30,0x00,0x56,0x31,0x33,0x34,0x31,0x00,0x56,0x31, 0x33,0x34,0x32,0x00,0x56,0x31,0x33,0x34,0x33,0x00,0x56,0x31,0x33,0x34,0x34,0x00, 0x56,0x31,0x33,0x34,0x35,0x00,0x56,0x31,0x33,0x34,0x36,0x00,0x56,0x31,0x33,0x34, 0x37,0x00,0x56,0x31,0x33,0x34,0x38,0x00,0x56,0x31,0x33,0x34,0x39,0x00,0x56,0x31, 0x33,0x35,0x30,0x00,0x56,0x31,0x33,0x35,0x31,0x00,0x56,0x31,0x33,0x35,0x32,0x00, 0x56,0x31,0x33,0x35,0x33,0x00,0x56,0x31,0x33,0x35,0x34,0x00,0x56,0x31,0x33,0x35, 0x35,0x00,0x56,0x31,0x33,0x35,0x36,0x00,0x56,0x31,0x33,0x35,0x37,0x00,0x56,0x31, 0x33,0x35,0x38,0x00,0x56,0x31,0x33,0x35,0x39,0x00,0x56,0x31,0x33,0x36,0x30,0x00, 0x56,0x31,0x33,0x36,0x31,0x00,0x56,0x31,0x33,0x36,0x32,0x00,0x56,0x31,0x33,0x36, 0x33,0x00,0x56,0x31,0x33,0x36,0x34,0x00,0x56,0x31,0x33,0x36,0x35,0x00,0x56,0x31, 0x33,0x36,0x36,0x00,0x56,0x31,0x33,0x36,0x37,0x00,0x56,0x31,0x33,0x36,0x38,0x00, 0x56,0x31,0x33,0x36,0x39,0x00,0x56,0x31,0x33,0x37,0x30,0x00,0x56,0x31,0x33,0x37, 0x31,0x00,0x56,0x31,0x33,0x37,0x32,0x00,0x56,0x31,0x33,0x37,0x33,0x00,0x56,0x31, 0x33,0x37,0x34,0x00,0x56,0x31,0x33,0x37,0x35,0x00,0x56,0x31,0x33,0x37,0x36,0x00, 0x56,0x31,0x33,0x37,0x37,0x00,0x56,0x31,0x33,0x37,0x38,0x00,0x56,0x31,0x33,0x37, 0x39,0x00,0x56,0x31,0x33,0x38,0x30,0x00,0x56,0x31,0x33,0x38,0x31,0x00,0x56,0x31, 0x33,0x38,0x32,0x00,0x56,0x31,0x33,0x38,0x33,0x00,0x56,0x31,0x33,0x38,0x34,0x00, 0x56,0x31,0x33,0x38,0x35,0x00,0x56,0x31,0x33,0x38,0x36,0x00,0x56,0x31,0x33,0x38, 0x37,0x00,0x56,0x31,0x33,0x38,0x38,0x00,0x56,0x31,0x33,0x38,0x39,0x00,0x56,0x31, 0x33,0x39,0x30,0x00,0x56,0x31,0x33,0x39,0x31,0x00,0x56,0x31,0x33,0x39,0x32,0x00, 0x56,0x31,0x33,0x39,0x33,0x00,0x56,0x31,0x33,0x39,0x34,0x00,0x56,0x31,0x33,0x39, 0x35,0x00,0x56,0x31,0x33,0x39,0x36,0x00,0x56,0x31,0x33,0x39,0x37,0x00,0x56,0x31, 0x33,0x39,0x38,0x00,0x56,0x31,0x33,0x39,0x39,0x00,0x56,0x31,0x34,0x30,0x30,0x00, 0x56,0x31,0x34,0x30,0x31,0x00,0x56,0x31,0x34,0x30,0x32,0x00,0x56,0x31,0x34,0x30, 0x33,0x00,0x56,0x31,0x34,0x30,0x34,0x00,0x56,0x31,0x34,0x30,0x35,0x00,0x56,0x31, 0x34,0x30,0x36,0x00,0x56,0x31,0x34,0x30,0x37,0x00,0x56,0x31,0x34,0x30,0x38,0x00, 0x56,0x31,0x34,0x30,0x39,0x00,0x56,0x31,0x34,0x31,0x30,0x00,0x56,0x31,0x34,0x31, 0x31,0x00,0x56,0x31,0x34,0x31,0x32,0x00,0x56,0x31,0x34,0x31,0x33,0x00,0x56,0x31, 0x34,0x31,0x34,0x00,0x56,0x31,0x34,0x31,0x35,0x00,0x56,0x31,0x34,0x31,0x36,0x00, 0x56,0x31,0x34,0x31,0x37,0x00,0x56,0x31,0x34,0x31,0x38,0x00,0x56,0x31,0x34,0x31, 0x39,0x00,0x56,0x31,0x34,0x32,0x30,0x00,0x56,0x31,0x34,0x32,0x31,0x00,0x56,0x31, 0x34,0x32,0x32,0x00,0x56,0x31,0x34,0x32,0x33,0x00,0x56,0x31,0x34,0x32,0x34,0x00, 0x56,0x31,0x34,0x32,0x35,0x00,0x56,0x31,0x34,0x32,0x36,0x00,0x56,0x31,0x34,0x32, 0x37,0x00,0x56,0x31,0x34,0x32,0x38,0x00,0x56,0x31,0x34,0x32,0x39,0x00,0x56,0x31, 0x34,0x33,0x30,0x00,0x56,0x31,0x34,0x33,0x31,0x00,0x56,0x31,0x34,0x33,0x32,0x00, 0x56,0x31,0x34,0x33,0x33,0x00,0x56,0x31,0x34,0x33,0x34,0x00,0x56,0x31,0x34,0x33, 0x35,0x00,0x56,0x31,0x34,0x33,0x36,0x00,0x56,0x31,0x34,0x33,0x37,0x00,0x56,0x31, 0x34,0x33,0x38,0x00,0x56,0x31,0x34,0x33,0x39,0x00,0x56,0x31,0x34,0x34,0x30,0x00, 0x56,0x31,0x34,0x34,0x31,0x00,0x56,0x31,0x34,0x34,0x32,0x00,0x56,0x31,0x34,0x34, 0x33,0x00,0x56,0x31,0x34,0x34,0x34,0x00,0x56,0x31,0x34,0x34,0x35,0x00,0x56,0x31, 0x34,0x34,0x36,0x00,0x56,0x31,0x34,0x34,0x37,0x00,0x56,0x31,0x34,0x34,0x38,0x00, 0x56,0x31,0x34,0x34,0x39,0x00,0x56,0x31,0x34,0x35,0x30,0x00,0x56,0x31,0x34,0x35, 0x31,0x00,0x56,0x31,0x34,0x35,0x32,0x00,0x56,0x31,0x34,0x35,0x33,0x00,0x56,0x31, 0x34,0x35,0x34,0x00,0x56,0x31,0x34,0x35,0x35,0x00,0x56,0x31,0x34,0x35,0x36,0x00, 0x56,0x31,0x34,0x35,0x37,0x00,0x56,0x31,0x34,0x35,0x38,0x00,0x56,0x31,0x34,0x35, 0x39,0x00,0x56,0x31,0x34,0x36,0x30,0x00,0x56,0x31,0x34,0x36,0x31,0x00,0x56,0x31, 0x34,0x36,0x32,0x00,0x56,0x31,0x34,0x36,0x33,0x00,0x56,0x31,0x34,0x36,0x34,0x00, 0x56,0x31,0x34,0x36,0x35,0x00,0x56,0x31,0x34,0x36,0x36,0x00,0x56,0x31,0x34,0x36, 0x37,0x00,0x56,0x31,0x34,0x36,0x38,0x00,0x56,0x31,0x34,0x36,0x39,0x00,0x56,0x31, 0x34,0x37,0x30,0x00,0x56,0x31,0x34,0x37,0x31,0x00,0x56,0x31,0x34,0x37,0x32,0x00, 0x56,0x31,0x34,0x37,0x33,0x00,0x56,0x31,0x34,0x37,0x34,0x00,0x56,0x31,0x34,0x37, 0x35,0x00,0x56,0x31,0x34,0x37,0x36,0x00,0x56,0x31,0x34,0x37,0x37,0x00,0x56,0x31, 0x34,0x37,0x38,0x00,0x56,0x31,0x34,0x37,0x39,0x00,0x56,0x31,0x34,0x38,0x30,0x00, 0x56,0x31,0x34,0x38,0x31,0x00,0x56,0x31,0x34,0x38,0x32,0x00,0x56,0x31,0x34,0x38, 0x33,0x00,0x56,0x31,0x34,0x38,0x34,0x00,0x56,0x31,0x34,0x38,0x35,0x00,0x56,0x31, 0x34,0x38,0x36,0x00,0x56,0x31,0x34,0x38,0x37,0x00,0x56,0x31,0x34,0x38,0x38,0x00, 0x56,0x31,0x34,0x38,0x39,0x00,0x56,0x31,0x34,0x39,0x30,0x00,0x56,0x31,0x34,0x39, 0x31,0x00,0x56,0x31,0x34,0x39,0x32,0x00,0x56,0x31,0x34,0x39,0x33,0x00,0x56,0x31, 0x34,0x39,0x34,0x00,0x56,0x31,0x34,0x39,0x35,0x00,0x56,0x31,0x34,0x39,0x36,0x00, 0x56,0x31,0x34,0x39,0x37,0x00,0x56,0x31,0x34,0x39,0x38,0x00,0x56,0x31,0x34,0x39, 0x39,0x00,0x56,0x31,0x35,0x30,0x30,0x00,0x56,0x31,0x35,0x30,0x31,0x00,0x56,0x31, 0x35,0x30,0x32,0x00,0x56,0x31,0x35,0x30,0x33,0x00,0x56,0x31,0x35,0x30,0x34,0x00, 0x56,0x31,0x35,0x30,0x35,0x00,0x56,0x31,0x35,0x30,0x36,0x00,0x56,0x31,0x35,0x30, 0x37,0x00,0x56,0x31,0x35,0x30,0x38,0x00,0x56,0x31,0x35,0x30,0x39,0x00,0x56,0x31, 0x35,0x31,0x30,0x00,0x56,0x31,0x35,0x31,0x31,0x00,0x56,0x31,0x35,0x31,0x32,0x00, 0x56,0x31,0x35,0x31,0x33,0x00,0x56,0x31,0x35,0x31,0x34,0x00,0x56,0x31,0x35,0x31, 0x35,0x00,0x56,0x31,0x35,0x31,0x36,0x00,0x56,0x31,0x35,0x31,0x37,0x00,0x56,0x31, 0x35,0x31,0x38,0x00,0x56,0x31,0x35,0x31,0x39,0x00,0x56,0x31,0x35,0x32,0x30,0x00, 0x56,0x31,0x35,0x32,0x31,0x00,0x56,0x31,0x35,0x32,0x32,0x00,0x56,0x31,0x35,0x32, 0x33,0x00,0x56,0x31,0x35,0x32,0x34,0x00,0x56,0x31,0x35,0x32,0x35,0x00,0x56,0x31, 0x35,0x32,0x36,0x00,0x56,0x31,0x35,0x32,0x37,0x00,0x56,0x31,0x35,0x32,0x38,0x00, 0x56,0x31,0x35,0x32,0x39,0x00,0x56,0x31,0x35,0x33,0x30,0x00,0x56,0x31,0x35,0x33, 0x31,0x00,0x56,0x31,0x35,0x33,0x32,0x00,0x56,0x31,0x35,0x33,0x33,0x00,0x56,0x31, 0x35,0x33,0x34,0x00,0x56,0x31,0x35,0x33,0x35,0x00,0x56,0x31,0x35,0x33,0x36,0x00, 0x56,0x31,0x35,0x33,0x37,0x00,0x56,0x31,0x35,0x33,0x38,0x00,0x56,0x31,0x35,0x33, 0x39,0x00,0x56,0x31,0x35,0x34,0x30,0x00,0x56,0x31,0x35,0x34,0x31,0x00,0x56,0x31, 0x35,0x34,0x32,0x00,0x56,0x31,0x35,0x34,0x33,0x00,0x56,0x31,0x35,0x34,0x34,0x00, 0x56,0x31,0x35,0x34,0x35,0x00,0x56,0x31,0x35,0x34,0x36,0x00,0x56,0x31,0x35,0x34, 0x37,0x00,0x56,0x31,0x35,0x34,0x38,0x00,0x56,0x31,0x35,0x34,0x39,0x00,0x56,0x31, 0x35,0x35,0x30,0x00,0x56,0x31,0x35,0x35,0x31,0x00,0x56,0x31,0x35,0x35,0x32,0x00, 0x56,0x31,0x35,0x35,0x33,0x00,0x56,0x31,0x35,0x35,0x34,0x00,0x56,0x31,0x35,0x35, 0x35,0x00,0x56,0x31,0x35,0x35,0x36,0x00,0x56,0x31,0x35,0x35,0x37,0x00,0x56,0x31, 0x35,0x35,0x38,0x00,0x56,0x31,0x35,0x35,0x39,0x00,0x56,0x31,0x35,0x36,0x30,0x00, 0x56,0x31,0x35,0x36,0x31,0x00,0x56,0x31,0x35,0x36,0x32,0x00,0x56,0x31,0x35,0x36, 0x33,0x00,0x56,0x31,0x35,0x36,0x34,0x00,0x56,0x31,0x35,0x36,0x35,0x00,0x56,0x31, 0x35,0x36,0x36,0x00,0x56,0x31,0x35,0x36,0x37,0x00,0x56,0x31,0x35,0x36,0x38,0x00, 0x56,0x31,0x35,0x36,0x39,0x00,0x56,0x31,0x35,0x37,0x30,0x00,0x56,0x31,0x35,0x37, 0x31,0x00,0x56,0x31,0x35,0x37,0x32,0x00,0x56,0x31,0x35,0x37,0x33,0x00,0x56,0x31, 0x35,0x37,0x34,0x00,0x56,0x31,0x35,0x37,0x35,0x00,0x56,0x31,0x35,0x37,0x36,0x00, 0x56,0x31,0x35,0x37,0x37,0x00,0x56,0x31,0x35,0x37,0x38,0x00,0x56,0x31,0x35,0x37, 0x39,0x00,0x56,0x31,0x35,0x38,0x30,0x00,0x56,0x31,0x35,0x38,0x31,0x00,0x56,0x31, 0x35,0x38,0x32,0x00,0x56,0x31,0x35,0x38,0x33,0x00,0x56,0x31,0x35,0x38,0x34,0x00, 0x56,0x31,0x35,0x38,0x35,0x00,0x56,0x31,0x35,0x38,0x36,0x00,0x56,0x31,0x35,0x38, 0x37,0x00,0x56,0x31,0x35,0x38,0x38,0x00,0x56,0x31,0x35,0x38,0x39,0x00,0x56,0x31, 0x35,0x39,0x30,0x00,0x56,0x31,0x35,0x39,0x31,0x00,0x56,0x31,0x35,0x39,0x32,0x00, 0x56,0x31,0x35,0x39,0x33,0x00,0x56,0x31,0x35,0x39,0x34,0x00,0x56,0x31,0x35,0x39, 0x35,0x00,0x56,0x31,0x35,0x39,0x36,0x00,0x56,0x31,0x35,0x39,0x37,0x00,0x56,0x31, 0x35,0x39,0x38,0x00,0x56,0x31,0x35,0x39,0x39,0x00,0x56,0x31,0x36,0x30,0x30,0x00, 0x56,0x31,0x36,0x30,0x31,0x00,0x56,0x31,0x36,0x30,0x32,0x00,0x56,0x31,0x36,0x30, 0x33,0x00,0x56,0x31,0x36,0x30,0x34,0x00,0x56,0x31,0x36,0x30,0x35,0x00,0x56,0x31, 0x36,0x30,0x36,0x00,0x56,0x31,0x36,0x30,0x37,0x00,0x56,0x31,0x36,0x30,0x38,0x00, 0x56,0x31,0x36,0x30,0x39,0x00,0x56,0x31,0x36,0x31,0x30,0x00,0x56,0x31,0x36,0x31, 0x31,0x00,0x56,0x31,0x36,0x31,0x32,0x00,0x56,0x31,0x36,0x31,0x33,0x00,0x56,0x31, 0x36,0x31,0x34,0x00,0x56,0x31,0x36,0x31,0x35,0x00,0x56,0x31,0x36,0x31,0x36,0x00, 0x56,0x31,0x36,0x31,0x37,0x00,0x56,0x31,0x36,0x31,0x38,0x00,0x56,0x31,0x36,0x31, 0x39,0x00,0x56,0x31,0x36,0x32,0x30,0x00,0x56,0x31,0x36,0x32,0x31,0x00,0x56,0x31, 0x36,0x32,0x32,0x00,0x56,0x31,0x36,0x32,0x33,0x00,0x56,0x31,0x36,0x32,0x34,0x00, 0x56,0x31,0x36,0x32,0x35,0x00,0x56,0x31,0x36,0x32,0x36,0x00,0x56,0x31,0x36,0x32, 0x37,0x00,0x56,0x31,0x36,0x32,0x38,0x00,0x56,0x31,0x36,0x32,0x39,0x00,0x56,0x31, 0x36,0x33,0x30,0x00,0x56,0x31,0x36,0x33,0x31,0x00,0x56,0x31,0x36,0x33,0x32,0x00, 0x56,0x31,0x36,0x33,0x33,0x00,0x56,0x31,0x36,0x33,0x34,0x00,0x56,0x31,0x36,0x33, 0x35,0x00,0x56,0x31,0x36,0x33,0x36,0x00,0x56,0x31,0x36,0x33,0x37,0x00,0x56,0x31, 0x36,0x33,0x38,0x00,0x56,0x31,0x36,0x33,0x39,0x00,0x56,0x31,0x36,0x34,0x30,0x00, 0x56,0x31,0x36,0x34,0x31,0x00,0x56,0x31,0x36,0x34,0x32,0x00,0x56,0x31,0x36,0x34, 0x33,0x00,0x56,0x31,0x36,0x34,0x34,0x00,0x56,0x31,0x36,0x34,0x35,0x00,0x56,0x31, 0x36,0x34,0x36,0x00,0x56,0x31,0x36,0x34,0x37,0x00,0x56,0x31,0x36,0x34,0x38,0x00, 0x56,0x31,0x36,0x34,0x39,0x00,0x56,0x31,0x36,0x35,0x30,0x00,0x56,0x31,0x36,0x35, 0x31,0x00,0x56,0x31,0x36,0x35,0x32,0x00,0x56,0x31,0x36,0x35,0x33,0x00,0x56,0x31, 0x36,0x35,0x34,0x00,0x56,0x31,0x36,0x35,0x35,0x00,0x56,0x31,0x36,0x35,0x36,0x00, 0x56,0x31,0x36,0x35,0x37,0x00,0x56,0x31,0x36,0x35,0x38,0x00,0x56,0x31,0x36,0x35, 0x39,0x00,0x56,0x31,0x36,0x36,0x30,0x00,0x56,0x31,0x36,0x36,0x31,0x00,0x56,0x31, 0x36,0x36,0x32,0x00,0x56,0x31,0x36,0x36,0x33,0x00,0x56,0x31,0x36,0x36,0x34,0x00, 0x56,0x31,0x36,0x36,0x35,0x00,0x56,0x31,0x36,0x36,0x36,0x00,0x56,0x31,0x36,0x36, 0x37,0x00,0x56,0x31,0x36,0x36,0x38,0x00,0x56,0x31,0x36,0x36,0x39,0x00,0x56,0x31, 0x36,0x37,0x30,0x00,0x56,0x31,0x36,0x37,0x31,0x00,0x56,0x31,0x36,0x37,0x32,0x00, 0x56,0x31,0x36,0x37,0x33,0x00,0x56,0x31,0x36,0x37,0x34,0x00,0x56,0x31,0x36,0x37, 0x35,0x00,0x56,0x31,0x36,0x37,0x36,0x00,0x56,0x31,0x36,0x37,0x37,0x00,0x56,0x31, 0x36,0x37,0x38,0x00,0x56,0x31,0x36,0x37,0x39,0x00,0x56,0x31,0x36,0x38,0x30,0x00, 0x56,0x31,0x36,0x38,0x31,0x00,0x56,0x31,0x36,0x38,0x32,0x00,0x56,0x31,0x36,0x38, 0x33,0x00,0x56,0x31,0x36,0x38,0x34,0x00,0x56,0x31,0x36,0x38,0x35,0x00,0x56,0x31, 0x36,0x38,0x36,0x00,0x56,0x31,0x36,0x38,0x37,0x00,0x56,0x31,0x36,0x38,0x38,0x00, 0x56,0x31,0x36,0x38,0x39,0x00,0x56,0x31,0x36,0x39,0x30,0x00,0x56,0x31,0x36,0x39, 0x31,0x00,0x56,0x31,0x36,0x39,0x32,0x00,0x56,0x31,0x36,0x39,0x33,0x00,0x56,0x31, 0x36,0x39,0x34,0x00,0x56,0x31,0x36,0x39,0x35,0x00,0x56,0x31,0x36,0x39,0x36,0x00, 0x56,0x31,0x36,0x39,0x37,0x00,0x56,0x31,0x36,0x39,0x38,0x00,0x56,0x31,0x36,0x39, 0x39,0x00,0x56,0x31,0x37,0x30,0x30,0x00,0x56,0x31,0x37,0x30,0x31,0x00,0x56,0x31, 0x37,0x30,0x32,0x00,0x56,0x31,0x37,0x30,0x33,0x00,0x56,0x31,0x37,0x30,0x34,0x00, 0x56,0x31,0x37,0x30,0x35,0x00,0x56,0x31,0x37,0x30,0x36,0x00,0x56,0x31,0x37,0x30, 0x37,0x00,0x56,0x31,0x37,0x30,0x38,0x00,0x56,0x31,0x37,0x30,0x39,0x00,0x56,0x31, 0x37,0x31,0x30,0x00,0x56,0x31,0x37,0x31,0x31,0x00,0x56,0x31,0x37,0x31,0x32,0x00, 0x56,0x31,0x37,0x31,0x33,0x00,0x56,0x31,0x37,0x31,0x34,0x00,0x56,0x31,0x37,0x31, 0x35,0x00,0x56,0x31,0x37,0x31,0x36,0x00,0x56,0x31,0x37,0x31,0x37,0x00,0x56,0x31, 0x37,0x31,0x38,0x00,0x56,0x31,0x37,0x31,0x39,0x00,0x56,0x31,0x37,0x32,0x30,0x00, 0x56,0x31,0x37,0x32,0x31,0x00,0x56,0x31,0x37,0x32,0x32,0x00,0x56,0x31,0x37,0x32, 0x33,0x00,0x56,0x31,0x37,0x32,0x34,0x00,0x56,0x31,0x37,0x32,0x35,0x00,0x56,0x31, 0x37,0x32,0x36,0x00,0x56,0x31,0x37,0x32,0x37,0x00,0x56,0x31,0x37,0x32,0x38,0x00, 0x56,0x31,0x37,0x32,0x39,0x00,0x56,0x31,0x37,0x33,0x30,0x00,0x56,0x31,0x37,0x33, 0x31,0x00,0x56,0x31,0x37,0x33,0x32,0x00,0x56,0x31,0x37,0x33,0x33,0x00,0x56,0x31, 0x37,0x33,0x34,0x00,0x56,0x31,0x37,0x33,0x35,0x00,0x56,0x31,0x37,0x33,0x36,0x00, 0x56,0x31,0x37,0x33,0x37,0x00,0x56,0x31,0x37,0x33,0x38,0x00,0x56,0x31,0x37,0x33, 0x39,0x00,0x56,0x31,0x37,0x34,0x30,0x00,0x56,0x31,0x37,0x34,0x31,0x00,0x56,0x31, 0x37,0x34,0x32,0x00,0x56,0x31,0x37,0x34,0x33,0x00,0x56,0x31,0x37,0x34,0x34,0x00, 0x56,0x31,0x37,0x34,0x35,0x00,0x56,0x31,0x37,0x34,0x36,0x00,0x56,0x31,0x37,0x34, 0x37,0x00,0x56,0x31,0x37,0x34,0x38,0x00,0x56,0x31,0x37,0x34,0x39,0x00,0x56,0x31, 0x37,0x35,0x30,0x00,0x56,0x31,0x37,0x35,0x31,0x00,0x56,0x31,0x37,0x35,0x32,0x00, 0x56,0x31,0x37,0x35,0x33,0x00,0x56,0x31,0x37,0x35,0x34,0x00,0x56,0x31,0x37,0x35, 0x35,0x00,0x56,0x31,0x37,0x35,0x36,0x00,0x56,0x31,0x37,0x35,0x37,0x00,0x56,0x31, 0x37,0x35,0x38,0x00,0x56,0x31,0x37,0x35,0x39,0x00,0x56,0x31,0x37,0x36,0x30,0x00, 0x56,0x31,0x37,0x36,0x31,0x00,0x56,0x31,0x37,0x36,0x32,0x00,0x56,0x31,0x37,0x36, 0x33,0x00,0x56,0x31,0x37,0x36,0x34,0x00,0x56,0x31,0x37,0x36,0x35,0x00,0x56,0x31, 0x37,0x36,0x36,0x00,0x56,0x31,0x37,0x36,0x37,0x00,0x56,0x31,0x37,0x36,0x38,0x00, 0x56,0x31,0x37,0x36,0x39,0x00,0x56,0x31,0x37,0x37,0x30,0x00,0x56,0x31,0x37,0x37, 0x31,0x00,0x56,0x31,0x37,0x37,0x32,0x00,0x56,0x31,0x37,0x37,0x33,0x00,0x56,0x31, 0x37,0x37,0x34,0x00,0x56,0x31,0x37,0x37,0x35,0x00,0x56,0x31,0x37,0x37,0x36,0x00, 0x56,0x31,0x37,0x37,0x37,0x00,0x56,0x31,0x37,0x37,0x38,0x00,0x56,0x31,0x37,0x37, 0x39,0x00,0x56,0x31,0x37,0x38,0x30,0x00,0x56,0x31,0x37,0x38,0x31,0x00,0x56,0x31, 0x37,0x38,0x32,0x00,0x56,0x31,0x37,0x38,0x33,0x00,0x56,0x31,0x37,0x38,0x34,0x00, 0x56,0x31,0x37,0x38,0x35,0x00,0x56,0x31,0x37,0x38,0x36,0x00,0x56,0x31,0x37,0x38, 0x37,0x00,0x56,0x31,0x37,0x38,0x38,0x00,0x56,0x31,0x37,0x38,0x39,0x00,0x56,0x31, 0x37,0x39,0x30,0x00,0x56,0x31,0x37,0x39,0x31,0x00,0x56,0x31,0x37,0x39,0x32,0x00, 0x56,0x31,0x37,0x39,0x33,0x00,0x56,0x31,0x37,0x39,0x34,0x00,0x56,0x31,0x37,0x39, 0x35,0x00,0x56,0x31,0x37,0x39,0x36,0x00,0x56,0x31,0x37,0x39,0x37,0x00,0x56,0x31, 0x37,0x39,0x38,0x00,0x56,0x31,0x37,0x39,0x39,0x00,0x56,0x31,0x38,0x30,0x30,0x00, 0x56,0x31,0x38,0x30,0x31,0x00,0x56,0x31,0x38,0x30,0x32,0x00,0x56,0x31,0x38,0x30, 0x33,0x00,0x56,0x31,0x38,0x30,0x34,0x00,0x56,0x31,0x38,0x30,0x35,0x00,0x56,0x31, 0x38,0x30,0x36,0x00,0x56,0x31,0x38,0x30,0x37,0x00,0x56,0x31,0x38,0x30,0x38,0x00, 0x56,0x31,0x38,0x30,0x39,0x00,0x56,0x31,0x38,0x31,0x30,0x00,0x56,0x31,0x38,0x31, 0x31,0x00,0x56,0x31,0x38,0x31,0x32,0x00,0x56,0x31,0x38,0x31,0x33,0x00,0x56,0x31, 0x38,0x31,0x34,0x00,0x56,0x31,0x38,0x31,0x35,0x00,0x56,0x31,0x38,0x31,0x36,0x00, 0x56,0x31,0x38,0x31,0x37,0x00,0x56,0x31,0x38,0x31,0x38,0x00,0x56,0x31,0x38,0x31, 0x39,0x00,0x56,0x31,0x38,0x32,0x30,0x00,0x56,0x31,0x38,0x32,0x31,0x00,0x56,0x31, 0x38,0x32,0x32,0x00,0x56,0x31,0x38,0x32,0x33,0x00,0x56,0x31,0x38,0x32,0x34,0x00, 0x56,0x31,0x38,0x32,0x35,0x00,0x56,0x31,0x38,0x32,0x36,0x00,0x56,0x31,0x38,0x32, 0x37,0x00,0x56,0x31,0x38,0x32,0x38,0x00,0x56,0x31,0x38,0x32,0x39,0x00,0x56,0x31, 0x38,0x33,0x30,0x00,0x56,0x31,0x38,0x33,0x31,0x00,0x56,0x31,0x38,0x33,0x32,0x00, 0x56,0x31,0x38,0x33,0x33,0x00,0x56,0x31,0x38,0x33,0x34,0x00,0x56,0x31,0x38,0x33, 0x35,0x00,0x56,0x31,0x38,0x33,0x36,0x00,0x56,0x31,0x38,0x33,0x37,0x00,0x56,0x31, 0x38,0x33,0x38,0x00,0x56,0x31,0x38,0x33,0x39,0x00,0x56,0x31,0x38,0x34,0x30,0x00, 0x56,0x31,0x38,0x34,0x31,0x00,0x56,0x31,0x38,0x34,0x32,0x00,0x56,0x31,0x38,0x34, 0x33,0x00,0x56,0x31,0x38,0x34,0x34,0x00,0x56,0x31,0x38,0x34,0x35,0x00,0x56,0x31, 0x38,0x34,0x36,0x00,0x56,0x31,0x38,0x34,0x37,0x00,0x56,0x31,0x38,0x34,0x38,0x00, 0x56,0x31,0x38,0x34,0x39,0x00,0x56,0x31,0x38,0x35,0x30,0x00,0x56,0x31,0x38,0x35, 0x31,0x00,0x56,0x31,0x38,0x35,0x32,0x00,0x56,0x31,0x38,0x35,0x33,0x00,0x56,0x31, 0x38,0x35,0x34,0x00,0x56,0x31,0x38,0x35,0x35,0x00,0x56,0x31,0x38,0x35,0x36,0x00, 0x56,0x31,0x38,0x35,0x37,0x00,0x56,0x31,0x38,0x35,0x38,0x00,0x56,0x31,0x38,0x35, 0x39,0x00,0x56,0x31,0x38,0x36,0x30,0x00,0x56,0x31,0x38,0x36,0x31,0x00,0x56,0x31, 0x38,0x36,0x32,0x00,0x56,0x31,0x38,0x36,0x33,0x00,0x56,0x31,0x38,0x36,0x34,0x00, 0x56,0x31,0x38,0x36,0x35,0x00,0x56,0x31,0x38,0x36,0x36,0x00,0x56,0x31,0x38,0x36, 0x37,0x00,0x56,0x31,0x38,0x36,0x38,0x00,0x56,0x31,0x38,0x36,0x39,0x00,0x56,0x31, 0x38,0x37,0x30,0x00,0x56,0x31,0x38,0x37,0x31,0x00,0x56,0x31,0x38,0x37,0x32,0x00, 0x56,0x31,0x38,0x37,0x33,0x00,0x56,0x31,0x38,0x37,0x34,0x00,0x56,0x31,0x38,0x37, 0x35,0x00,0x56,0x31,0x38,0x37,0x36,0x00,0x56,0x31,0x38,0x37,0x37,0x00,0x56,0x31, 0x38,0x37,0x38,0x00,0x56,0x31,0x38,0x37,0x39,0x00,0x56,0x31,0x38,0x38,0x30,0x00, 0x56,0x31,0x38,0x38,0x31,0x00,0x56,0x31,0x38,0x38,0x32,0x00,0x56,0x31,0x38,0x38, 0x33,0x00,0x56,0x31,0x38,0x38,0x34,0x00,0x56,0x31,0x38,0x38,0x35,0x00,0x56,0x31, 0x38,0x38,0x36,0x00,0x56,0x31,0x38,0x38,0x37,0x00,0x56,0x31,0x38,0x38,0x38,0x00, 0x56,0x31,0x38,0x38,0x39,0x00,0x56,0x31,0x38,0x39,0x30,0x00,0x56,0x31,0x38,0x39, 0x31,0x00,0x56,0x31,0x38,0x39,0x32,0x00,0x56,0x31,0x38,0x39,0x33,0x00,0x56,0x31, 0x38,0x39,0x34,0x00,0x56,0x31,0x38,0x39,0x35,0x00,0x56,0x31,0x38,0x39,0x36,0x00, 0x56,0x31,0x38,0x39,0x37,0x00,0x56,0x31,0x38,0x39,0x38,0x00,0x56,0x31,0x38,0x39, 0x39,0x00,0x56,0x31,0x39,0x30,0x30,0x00,0x56,0x31,0x39,0x30,0x31,0x00,0x56,0x31, 0x39,0x30,0x32,0x00,0x56,0x31,0x39,0x30,0x33,0x00,0x56,0x31,0x39,0x30,0x34,0x00, 0x56,0x31,0x39,0x30,0x35,0x00,0x56,0x31,0x39,0x30,0x36,0x00,0x56,0x31,0x39,0x30, 0x37,0x00,0x56,0x31,0x39,0x30,0x38,0x00,0x56,0x31,0x39,0x30,0x39,0x00,0x56,0x31, 0x39,0x31,0x30,0x00,0x56,0x31,0x39,0x31,0x31,0x00,0x56,0x31,0x39,0x31,0x32,0x00, 0x56,0x31,0x39,0x31,0x33,0x00,0x56,0x31,0x39,0x31,0x34,0x00,0x56,0x31,0x39,0x31, 0x35,0x00,0x56,0x31,0x39,0x31,0x36,0x00,0x56,0x31,0x39,0x31,0x37,0x00,0x56,0x31, 0x39,0x31,0x38,0x00,0x56,0x31,0x39,0x31,0x39,0x00,0x56,0x31,0x39,0x32,0x30,0x00, 0x56,0x31,0x39,0x32,0x31,0x00,0x56,0x31,0x39,0x32,0x32,0x00,0x56,0x31,0x39,0x32, 0x33,0x00,0x56,0x31,0x39,0x32,0x34,0x00,0x56,0x31,0x39,0x32,0x35,0x00,0x56,0x31, 0x39,0x32,0x36,0x00,0x56,0x31,0x39,0x32,0x37,0x00,0x56,0x31,0x39,0x32,0x38,0x00, 0x56,0x31,0x39,0x32,0x39,0x00,0x56,0x31,0x39,0x33,0x30,0x00,0x56,0x31,0x39,0x33, 0x31,0x00,0x56,0x31,0x39,0x33,0x32,0x00,0x56,0x31,0x39,0x33,0x33,0x00,0x56,0x31, 0x39,0x33,0x34,0x00,0x56,0x31,0x39,0x33,0x35,0x00,0x56,0x31,0x39,0x33,0x36,0x00, 0x56,0x31,0x39,0x33,0x37,0x00,0x56,0x31,0x39,0x33,0x38,0x00,0x56,0x31,0x39,0x33, 0x39,0x00,0x56,0x31,0x39,0x34,0x30,0x00,0x56,0x31,0x39,0x34,0x31,0x00,0x56,0x31, 0x39,0x34,0x32,0x00,0x56,0x31,0x39,0x34,0x33,0x00,0x56,0x31,0x39,0x34,0x34,0x00, 0x56,0x31,0x39,0x34,0x35,0x00,0x56,0x31,0x39,0x34,0x36,0x00,0x56,0x31,0x39,0x34, 0x37,0x00,0x56,0x31,0x39,0x34,0x38,0x00,0x56,0x31,0x39,0x34,0x39,0x00,0x56,0x31, 0x39,0x35,0x30,0x00,0x56,0x31,0x39,0x35,0x31,0x00,0x56,0x31,0x39,0x35,0x32,0x00, 0x56,0x31,0x39,0x35,0x33,0x00,0x56,0x31,0x39,0x35,0x34,0x00,0x56,0x31,0x39,0x35, 0x35,0x00,0x56,0x31,0x39,0x35,0x36,0x00,0x56,0x31,0x39,0x35,0x37,0x00,0x56,0x31, 0x39,0x35,0x38,0x00,0x56,0x31,0x39,0x35,0x39,0x00,0x56,0x31,0x39,0x36,0x30,0x00, 0x56,0x31,0x39,0x36,0x31,0x00,0x56,0x31,0x39,0x36,0x32,0x00,0x56,0x31,0x39,0x36, 0x33,0x00,0x56,0x31,0x39,0x36,0x34,0x00,0x56,0x31,0x39,0x36,0x35,0x00,0x56,0x31, 0x39,0x36,0x36,0x00,0x56,0x31,0x39,0x36,0x37,0x00,0x56,0x31,0x39,0x36,0x38,0x00, 0x56,0x31,0x39,0x36,0x39,0x00,0x56,0x31,0x39,0x37,0x30,0x00,0x56,0x31,0x39,0x37, 0x31,0x00,0x56,0x31,0x39,0x37,0x32,0x00,0x56,0x31,0x39,0x37,0x33,0x00,0x56,0x31, 0x39,0x37,0x34,0x00,0x56,0x31,0x39,0x37,0x35,0x00,0x56,0x31,0x39,0x37,0x36,0x00, 0x56,0x31,0x39,0x37,0x37,0x00,0x56,0x31,0x39,0x37,0x38,0x00,0x56,0x31,0x39,0x37, 0x39,0x00,0x56,0x31,0x39,0x38,0x30,0x00,0x56,0x31,0x39,0x38,0x31,0x00,0x56,0x31, 0x39,0x38,0x32,0x00,0x56,0x31,0x39,0x38,0x33,0x00,0x56,0x31,0x39,0x38,0x34,0x00, 0x56,0x31,0x39,0x38,0x35,0x00,0x56,0x31,0x39,0x38,0x36,0x00,0x56,0x31,0x39,0x38, 0x37,0x00,0x56,0x31,0x39,0x38,0x38,0x00,0x56,0x31,0x39,0x38,0x39,0x00,0x56,0x31, 0x39,0x39,0x30,0x00,0x56,0x31,0x39,0x39,0x31,0x00,0x56,0x31,0x39,0x39,0x32,0x00, 0x56,0x31,0x39,0x39,0x33,0x00,0x56,0x31,0x39,0x39,0x34,0x00,0x56,0x31,0x39,0x39, 0x35,0x00,0x56,0x31,0x39,0x39,0x36,0x00,0x56,0x31,0x39,0x39,0x37,0x00,0x56,0x31, 0x39,0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x39,0x00,0x56,0x32,0x30,0x30,0x30,0x00, 0x56,0x32,0x30,0x30,0x31,0x00,0x56,0x32,0x30,0x30,0x32,0x00,0x56,0x32,0x30,0x30, 0x33,0x00,0x56,0x32,0x30,0x30,0x34,0x00,0x56,0x32,0x30,0x30,0x35,0x00,0x56,0x32, 0x30,0x30,0x36,0x00,0x56,0x32,0x30,0x30,0x37,0x00,0x56,0x32,0x30,0x30,0x38,0x00, 0x56,0x32,0x30,0x30,0x39,0x00,0x56,0x32,0x30,0x31,0x30,0x00,0x56,0x32,0x30,0x31, 0x31,0x00,0x56,0x32,0x30,0x31,0x32,0x00,0x56,0x32,0x30,0x31,0x33,0x00,0x56,0x32, 0x30,0x31,0x34,0x00,0x56,0x32,0x30,0x31,0x35,0x00,0x56,0x32,0x30,0x31,0x36,0x00, 0x56,0x32,0x30,0x31,0x37,0x00,0x56,0x32,0x30,0x31,0x38,0x00,0x56,0x32,0x30,0x31, 0x39,0x00,0x56,0x32,0x30,0x32,0x30,0x00,0x56,0x32,0x30,0x32,0x31,0x00,0x56,0x32, 0x30,0x32,0x32,0x00,0x56,0x32,0x30,0x32,0x33,0x00,0x56,0x32,0x30,0x32,0x34,0x00, 0x56,0x32,0x30,0x32,0x35,0x00,0x56,0x32,0x30,0x32,0x36,0x00,0x56,0x32,0x30,0x32, 0x37,0x00,0x56,0x32,0x30,0x32,0x38,0x00,0x56,0x32,0x30,0x32,0x39,0x00,0x56,0x32, 0x30,0x33,0x30,0x00,0x56,0x32,0x30,0x33,0x31,0x00,0x56,0x32,0x30,0x33,0x32,0x00, 0x56,0x32,0x30,0x33,0x33,0x00,0x56,0x32,0x30,0x33,0x34,0x00,0x56,0x32,0x30,0x33, 0x35,0x00,0x56,0x32,0x30,0x33,0x36,0x00,0x56,0x32,0x30,0x33,0x37,0x00,0x56,0x32, 0x30,0x33,0x38,0x00,0x56,0x32,0x30,0x33,0x39,0x00,0x56,0x32,0x30,0x34,0x30,0x00, 0x56,0x32,0x30,0x34,0x31,0x00,0x56,0x32,0x30,0x34,0x32,0x00,0x56,0x32,0x30,0x34, 0x33,0x00,0x56,0x32,0x30,0x34,0x34,0x00,0x56,0x32,0x30,0x34,0x35,0x00,0x56,0x32, 0x30,0x34,0x36,0x00,0x56,0x32,0x30,0x34,0x37,0x00,0x56,0x32,0x30,0x34,0x38,0x00, 0x56,0x32,0x30,0x34,0x39,0x00,0x56,0x32,0x30,0x35,0x30,0x00,0x56,0x32,0x30,0x35, 0x31,0x00,0x56,0x32,0x30,0x35,0x32,0x00,0x56,0x32,0x30,0x35,0x33,0x00,0x56,0x32, 0x30,0x35,0x34,0x00,0x56,0x32,0x30,0x35,0x35,0x00,0x56,0x32,0x30,0x35,0x36,0x00, 0x56,0x32,0x30,0x35,0x37,0x00,0x56,0x32,0x30,0x35,0x38,0x00,0x56,0x32,0x30,0x35, 0x39,0x00,0x56,0x32,0x30,0x36,0x30,0x00,0x56,0x32,0x30,0x36,0x31,0x00,0x56,0x32, 0x30,0x36,0x32,0x00,0x56,0x32,0x30,0x36,0x33,0x00,0x56,0x32,0x30,0x36,0x34,0x00, 0x56,0x32,0x30,0x36,0x35,0x00,0x56,0x32,0x30,0x36,0x36,0x00,0x56,0x32,0x30,0x36, 0x37,0x00,0x56,0x32,0x30,0x36,0x38,0x00,0x56,0x32,0x30,0x36,0x39,0x00,0x56,0x32, 0x30,0x37,0x30,0x00,0x56,0x32,0x30,0x37,0x31,0x00,0x56,0x32,0x30,0x37,0x32,0x00, 0x56,0x32,0x30,0x37,0x33,0x00,0x56,0x32,0x30,0x37,0x34,0x00,0x56,0x32,0x30,0x37, 0x35,0x00,0x56,0x32,0x30,0x37,0x36,0x00,0x56,0x32,0x30,0x37,0x37,0x00,0x56,0x32, 0x30,0x37,0x38,0x00,0x56,0x32,0x30,0x37,0x39,0x00,0x56,0x32,0x30,0x38,0x30,0x00, 0x56,0x32,0x30,0x38,0x31,0x00,0x56,0x32,0x30,0x38,0x32,0x00,0x56,0x32,0x30,0x38, 0x33,0x00,0x56,0x32,0x30,0x38,0x34,0x00,0x56,0x32,0x30,0x38,0x35,0x00,0x56,0x32, 0x30,0x38,0x36,0x00,0x56,0x32,0x30,0x38,0x37,0x00,0x56,0x32,0x30,0x38,0x38,0x00, 0x56,0x32,0x30,0x38,0x39,0x00,0x56,0x32,0x30,0x39,0x30,0x00,0x56,0x32,0x30,0x39, 0x31,0x00,0x56,0x32,0x30,0x39,0x32,0x00,0x56,0x32,0x30,0x39,0x33,0x00,0x56,0x32, 0x30,0x39,0x34,0x00,0x56,0x32,0x30,0x39,0x35,0x00,0x56,0x32,0x30,0x39,0x36,0x00, 0x56,0x32,0x30,0x39,0x37,0x00,0x56,0x32,0x30,0x39,0x38,0x00,0x56,0x32,0x30,0x39, 0x39,0x00,0x56,0x32,0x31,0x30,0x30,0x00,0x56,0x32,0x31,0x30,0x31,0x00,0x56,0x32, 0x31,0x30,0x32,0x00,0x56,0x32,0x31,0x30,0x33,0x00,0x56,0x32,0x31,0x30,0x34,0x00, 0x56,0x32,0x31,0x30,0x35,0x00,0x56,0x32,0x31,0x30,0x36,0x00,0x56,0x32,0x31,0x30, 0x37,0x00,0x56,0x32,0x31,0x30,0x38,0x00,0x56,0x32,0x31,0x30,0x39,0x00,0x56,0x32, 0x31,0x31,0x30,0x00,0x56,0x32,0x31,0x31,0x31,0x00,0x56,0x32,0x31,0x31,0x32,0x00, 0x56,0x32,0x31,0x31,0x33,0x00,0x56,0x32,0x31,0x31,0x34,0x00,0x56,0x32,0x31,0x31, 0x35,0x00,0x56,0x32,0x31,0x31,0x36,0x00,0x56,0x32,0x31,0x31,0x37,0x00,0x56,0x32, 0x31,0x31,0x38,0x00,0x56,0x32,0x31,0x31,0x39,0x00,0x56,0x32,0x31,0x32,0x30,0x00, 0x56,0x32,0x31,0x32,0x31,0x00,0x56,0x32,0x31,0x32,0x32,0x00,0x56,0x32,0x31,0x32, 0x33,0x00,0x56,0x32,0x31,0x32,0x34,0x00,0x56,0x32,0x31,0x32,0x35,0x00,0x56,0x32, 0x31,0x32,0x36,0x00,0x56,0x32,0x31,0x32,0x37,0x00,0x56,0x32,0x31,0x32,0x38,0x00, 0x56,0x32,0x31,0x32,0x39,0x00,0x56,0x32,0x31,0x33,0x30,0x00,0x56,0x32,0x31,0x33, 0x31,0x00,0x56,0x32,0x31,0x33,0x32,0x00,0x56,0x32,0x31,0x33,0x33,0x00,0x56,0x32, 0x31,0x33,0x34,0x00,0x56,0x32,0x31,0x33,0x35,0x00,0x56,0x32,0x31,0x33,0x36,0x00, 0x56,0x32,0x31,0x33,0x37,0x00,0x56,0x32,0x31,0x33,0x38,0x00,0x56,0x32,0x31,0x33, 0x39,0x00,0x56,0x32,0x31,0x34,0x30,0x00,0x56,0x32,0x31,0x34,0x31,0x00,0x56,0x32, 0x31,0x34,0x32,0x00,0x56,0x32,0x31,0x34,0x33,0x00,0x56,0x32,0x31,0x34,0x34,0x00, 0x56,0x32,0x31,0x34,0x35,0x00,0x56,0x32,0x31,0x34,0x36,0x00,0x56,0x32,0x31,0x34, 0x37,0x00,0x56,0x32,0x31,0x34,0x38,0x00,0x56,0x32,0x31,0x34,0x39,0x00,0x56,0x32, 0x31,0x35,0x30,0x00,0x56,0x32,0x31,0x35,0x31,0x00,0x56,0x32,0x31,0x35,0x32,0x00, 0x56,0x32,0x31,0x35,0x33,0x00,0x56,0x32,0x31,0x35,0x34,0x00,0x56,0x32,0x31,0x35, 0x35,0x00,0x56,0x32,0x31,0x35,0x36,0x00,0x56,0x32,0x31,0x35,0x37,0x00,0x56,0x32, 0x31,0x35,0x38,0x00,0x56,0x32,0x31,0x35,0x39,0x00,0x56,0x32,0x31,0x36,0x30,0x00, 0x56,0x32,0x31,0x36,0x31,0x00,0x56,0x32,0x31,0x36,0x32,0x00,0x56,0x32,0x31,0x36, 0x33,0x00,0x56,0x32,0x31,0x36,0x34,0x00,0x56,0x32,0x31,0x36,0x35,0x00,0x56,0x32, 0x31,0x36,0x36,0x00,0x56,0x32,0x31,0x36,0x37,0x00,0x56,0x32,0x31,0x36,0x38,0x00, 0x56,0x32,0x31,0x36,0x39,0x00,0x56,0x32,0x31,0x37,0x30,0x00,0x56,0x32,0x31,0x37, 0x31,0x00,0x56,0x32,0x31,0x37,0x32,0x00,0x56,0x32,0x31,0x37,0x33,0x00,0x56,0x32, 0x31,0x37,0x34,0x00,0x56,0x32,0x31,0x37,0x35,0x00,0x56,0x32,0x31,0x37,0x36,0x00, 0x56,0x32,0x31,0x37,0x37,0x00,0x56,0x32,0x31,0x37,0x38,0x00,0x56,0x32,0x31,0x37, 0x39,0x00,0x56,0x32,0x31,0x38,0x30,0x00,0x56,0x32,0x31,0x38,0x31,0x00,0x56,0x32, 0x31,0x38,0x32,0x00,0x56,0x32,0x31,0x38,0x33,0x00,0x56,0x32,0x31,0x38,0x34,0x00, 0x56,0x32,0x31,0x38,0x35,0x00,0x56,0x32,0x31,0x38,0x36,0x00,0x56,0x32,0x31,0x38, 0x37,0x00,0x56,0x32,0x31,0x38,0x38,0x00,0x56,0x32,0x31,0x38,0x39,0x00,0x56,0x32, 0x31,0x39,0x30,0x00,0x56,0x32,0x31,0x39,0x31,0x00,0x56,0x32,0x31,0x39,0x32,0x00, 0x56,0x32,0x31,0x39,0x33,0x00,0x56,0x32,0x31,0x39,0x34,0x00,0x56,0x32,0x31,0x39, 0x35,0x00,0x56,0x32,0x31,0x39,0x36,0x00,0x56,0x32,0x31,0x39,0x37,0x00,0x56,0x32, 0x31,0x39,0x38,0x00,0x56,0x32,0x31,0x39,0x39,0x00,0x56,0x32,0x32,0x30,0x30,0x00, 0x56,0x32,0x32,0x30,0x31,0x00,0x56,0x32,0x32,0x30,0x32,0x00,0x56,0x32,0x32,0x30, 0x33,0x00,0x56,0x32,0x32,0x30,0x34,0x00,0x56,0x32,0x32,0x30,0x35,0x00,0x56,0x32, 0x32,0x30,0x36,0x00,0x56,0x32,0x32,0x30,0x37,0x00,0x56,0x32,0x32,0x30,0x38,0x00, 0x56,0x32,0x32,0x30,0x39,0x00,0x56,0x32,0x32,0x31,0x30,0x00,0x56,0x32,0x32,0x31, 0x31,0x00,0x56,0x32,0x32,0x31,0x32,0x00,0x56,0x32,0x32,0x31,0x33,0x00,0x56,0x32, 0x32,0x31,0x34,0x00,0x56,0x32,0x32,0x31,0x35,0x00,0x56,0x32,0x32,0x31,0x36,0x00, 0x56,0x32,0x32,0x31,0x37,0x00,0x56,0x32,0x32,0x31,0x38,0x00,0x56,0x32,0x32,0x31, 0x39,0x00,0x56,0x32,0x32,0x32,0x30,0x00,0x56,0x32,0x32,0x32,0x31,0x00,0x56,0x32, 0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x32,0x33,0x00,0x56,0x32,0x32,0x32,0x34,0x00, 0x56,0x32,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x32,0x36,0x00,0x56,0x32,0x32,0x32, 0x37,0x00,0x56,0x32,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x32,0x39,0x00,0x56,0x32, 0x32,0x33,0x30,0x00,0x56,0x32,0x32,0x33,0x31,0x00,0x56,0x32,0x32,0x33,0x32,0x00, 0x56,0x32,0x32,0x33,0x33,0x00,0x56,0x32,0x32,0x33,0x34,0x00,0x56,0x32,0x32,0x33, 0x35,0x00,0x56,0x32,0x32,0x33,0x36,0x00,0x56,0x32,0x32,0x33,0x37,0x00,0x56,0x32, 0x32,0x33,0x38,0x00,0x56,0x32,0x32,0x33,0x39,0x00,0x56,0x32,0x32,0x34,0x30,0x00, 0x56,0x32,0x32,0x34,0x31,0x00,0x56,0x32,0x32,0x34,0x32,0x00,0x56,0x32,0x32,0x34, 0x33,0x00,0x56,0x32,0x32,0x34,0x34,0x00,0x56,0x32,0x32,0x34,0x35,0x00,0x56,0x32, 0x32,0x34,0x36,0x00,0x56,0x32,0x32,0x34,0x37,0x00,0x56,0x32,0x32,0x34,0x38,0x00, 0x56,0x32,0x32,0x34,0x39,0x00,0x56,0x32,0x32,0x35,0x30,0x00,0x56,0x32,0x32,0x35, 0x31,0x00,0x56,0x32,0x32,0x35,0x32,0x00,0x56,0x32,0x32,0x35,0x33,0x00,0x56,0x32, 0x32,0x35,0x34,0x00,0x56,0x32,0x32,0x35,0x35,0x00,0x56,0x32,0x32,0x35,0x36,0x00, 0x56,0x32,0x32,0x35,0x37,0x00,0x56,0x32,0x32,0x35,0x38,0x00,0x56,0x32,0x32,0x35, 0x39,0x00,0x56,0x32,0x32,0x36,0x30,0x00,0x56,0x32,0x32,0x36,0x31,0x00,0x56,0x32, 0x32,0x36,0x32,0x00,0x56,0x32,0x32,0x36,0x33,0x00,0x56,0x32,0x32,0x36,0x34,0x00, 0x56,0x32,0x32,0x36,0x35,0x00,0x56,0x32,0x32,0x36,0x36,0x00,0x56,0x32,0x32,0x36, 0x37,0x00,0x56,0x32,0x32,0x36,0x38,0x00,0x56,0x32,0x32,0x36,0x39,0x00,0x56,0x32, 0x32,0x37,0x30,0x00,0x56,0x32,0x32,0x37,0x31,0x00,0x56,0x32,0x32,0x37,0x32,0x00, 0x56,0x32,0x32,0x37,0x33,0x00,0x56,0x32,0x32,0x37,0x34,0x00,0x56,0x32,0x32,0x37, 0x35,0x00,0x56,0x32,0x32,0x37,0x36,0x00,0x56,0x32,0x32,0x37,0x37,0x00,0x56,0x32, 0x32,0x37,0x38,0x00,0x56,0x32,0x32,0x37,0x39,0x00,0x56,0x32,0x32,0x38,0x30,0x00, 0x56,0x32,0x32,0x38,0x31,0x00,0x56,0x32,0x32,0x38,0x32,0x00,0x56,0x32,0x32,0x38, 0x33,0x00,0x56,0x32,0x32,0x38,0x34,0x00,0x56,0x32,0x32,0x38,0x35,0x00,0x56,0x32, 0x32,0x38,0x36,0x00,0x56,0x32,0x32,0x38,0x37,0x00,0x56,0x32,0x32,0x38,0x38,0x00, 0x56,0x32,0x32,0x38,0x39,0x00,0x56,0x32,0x32,0x39,0x30,0x00,0x56,0x32,0x32,0x39, 0x31,0x00,0x56,0x32,0x32,0x39,0x32,0x00,0x56,0x32,0x32,0x39,0x33,0x00,0x56,0x32, 0x32,0x39,0x34,0x00,0x56,0x32,0x32,0x39,0x35,0x00,0x56,0x32,0x32,0x39,0x36,0x00, 0x56,0x32,0x32,0x39,0x37,0x00,0x56,0x32,0x32,0x39,0x38,0x00,0x56,0x32,0x32,0x39, 0x39,0x00,0x56,0x32,0x33,0x30,0x30,0x00,0x56,0x32,0x33,0x30,0x31,0x00,0x56,0x32, 0x33,0x30,0x32,0x00,0x56,0x32,0x33,0x30,0x33,0x00,0x56,0x32,0x33,0x30,0x34,0x00, 0x56,0x32,0x33,0x30,0x35,0x00,0x56,0x32,0x33,0x30,0x36,0x00,0x56,0x32,0x33,0x30, 0x37,0x00,0x56,0x32,0x33,0x30,0x38,0x00,0x56,0x32,0x33,0x30,0x39,0x00,0x56,0x32, 0x33,0x31,0x30,0x00,0x56,0x32,0x33,0x31,0x31,0x00,0x56,0x32,0x33,0x31,0x32,0x00, 0x56,0x32,0x33,0x31,0x33,0x00,0x56,0x32,0x33,0x31,0x34,0x00,0x56,0x32,0x33,0x31, 0x35,0x00,0x56,0x32,0x33,0x31,0x36,0x00,0x56,0x32,0x33,0x31,0x37,0x00,0x56,0x32, 0x33,0x31,0x38,0x00,0x56,0x32,0x33,0x31,0x39,0x00,0x56,0x32,0x33,0x32,0x30,0x00, 0x56,0x32,0x33,0x32,0x31,0x00,0x56,0x32,0x33,0x32,0x32,0x00,0x56,0x32,0x33,0x32, 0x33,0x00,0x56,0x32,0x33,0x32,0x34,0x00,0x56,0x32,0x33,0x32,0x35,0x00,0x56,0x32, 0x33,0x32,0x36,0x00,0x56,0x32,0x33,0x32,0x37,0x00,0x56,0x32,0x33,0x32,0x38,0x00, 0x56,0x32,0x33,0x32,0x39,0x00,0x56,0x32,0x33,0x33,0x30,0x00,0x56,0x32,0x33,0x33, 0x31,0x00,0x56,0x32,0x33,0x33,0x32,0x00,0x56,0x32,0x33,0x33,0x33,0x00,0x56,0x32, 0x33,0x33,0x34,0x00,0x56,0x32,0x33,0x33,0x35,0x00,0x56,0x32,0x33,0x33,0x36,0x00, 0x56,0x32,0x33,0x33,0x37,0x00,0x56,0x32,0x33,0x33,0x38,0x00,0x56,0x32,0x33,0x33, 0x39,0x00,0x56,0x32,0x33,0x34,0x30,0x00,0x56,0x32,0x33,0x34,0x31,0x00,0x56,0x32, 0x33,0x34,0x32,0x00,0x56,0x32,0x33,0x34,0x33,0x00,0x56,0x32,0x33,0x34,0x34,0x00, 0x56,0x32,0x33,0x34,0x35,0x00,0x56,0x32,0x33,0x34,0x36,0x00,0x56,0x32,0x33,0x34, 0x37,0x00,0x56,0x32,0x33,0x34,0x38,0x00,0x56,0x32,0x33,0x34,0x39,0x00,0x56,0x32, 0x33,0x35,0x30,0x00,0x56,0x32,0x33,0x35,0x31,0x00,0x56,0x32,0x33,0x35,0x32,0x00, 0x56,0x32,0x33,0x35,0x33,0x00,0x56,0x32,0x33,0x35,0x34,0x00,0x56,0x32,0x33,0x35, 0x35,0x00,0x56,0x32,0x33,0x35,0x36,0x00,0x56,0x32,0x33,0x35,0x37,0x00,0x56,0x32, 0x33,0x35,0x38,0x00,0x56,0x32,0x33,0x35,0x39,0x00,0x56,0x32,0x33,0x36,0x30,0x00, 0x56,0x32,0x33,0x36,0x31,0x00,0x56,0x32,0x33,0x36,0x32,0x00,0x56,0x32,0x33,0x36, 0x33,0x00,0x56,0x32,0x33,0x36,0x34,0x00,0x56,0x32,0x33,0x36,0x35,0x00,0x56,0x32, 0x33,0x36,0x36,0x00,0x56,0x32,0x33,0x36,0x37,0x00,0x56,0x32,0x33,0x36,0x38,0x00, 0x56,0x32,0x33,0x36,0x39,0x00,0x56,0x32,0x33,0x37,0x30,0x00,0x56,0x32,0x33,0x37, 0x31,0x00,0x56,0x32,0x33,0x37,0x32,0x00,0x56,0x32,0x33,0x37,0x33,0x00,0x56,0x32, 0x33,0x37,0x34,0x00,0x56,0x32,0x33,0x37,0x35,0x00,0x56,0x32,0x33,0x37,0x36,0x00, 0x56,0x32,0x33,0x37,0x37,0x00,0x56,0x32,0x33,0x37,0x38,0x00,0x56,0x32,0x33,0x37, 0x39,0x00,0x56,0x32,0x33,0x38,0x30,0x00,0x56,0x32,0x33,0x38,0x31,0x00,0x56,0x32, 0x33,0x38,0x32,0x00,0x56,0x32,0x33,0x38,0x33,0x00,0x56,0x32,0x33,0x38,0x34,0x00, 0x56,0x32,0x33,0x38,0x35,0x00,0x56,0x32,0x33,0x38,0x36,0x00,0x56,0x32,0x33,0x38, 0x37,0x00,0x56,0x32,0x33,0x38,0x38,0x00,0x56,0x32,0x33,0x38,0x39,0x00,0x56,0x32, 0x33,0x39,0x30,0x00,0x56,0x32,0x33,0x39,0x31,0x00,0x56,0x32,0x33,0x39,0x32,0x00, 0x56,0x32,0x33,0x39,0x33,0x00,0x56,0x32,0x33,0x39,0x34,0x00,0x56,0x32,0x33,0x39, 0x35,0x00,0x56,0x32,0x33,0x39,0x36,0x00,0x56,0x32,0x33,0x39,0x37,0x00,0x56,0x32, 0x33,0x39,0x38,0x00,0x56,0x32,0x33,0x39,0x39,0x00,0x56,0x32,0x34,0x30,0x30,0x00, 0x56,0x32,0x34,0x30,0x31,0x00,0x56,0x32,0x34,0x30,0x32,0x00,0x56,0x32,0x34,0x30, 0x33,0x00,0x56,0x32,0x34,0x30,0x34,0x00,0x56,0x32,0x34,0x30,0x35,0x00,0x56,0x32, 0x34,0x30,0x36,0x00,0x56,0x32,0x34,0x30,0x37,0x00,0x56,0x32,0x34,0x30,0x38,0x00, 0x56,0x32,0x34,0x30,0x39,0x00,0x56,0x32,0x34,0x31,0x30,0x00,0x56,0x32,0x34,0x31, 0x31,0x00,0x56,0x32,0x34,0x31,0x32,0x00,0x56,0x32,0x34,0x31,0x33,0x00,0x56,0x32, 0x34,0x31,0x34,0x00,0x56,0x32,0x34,0x31,0x35,0x00,0x56,0x32,0x34,0x31,0x36,0x00, 0x56,0x32,0x34,0x31,0x37,0x00,0x56,0x32,0x34,0x31,0x38,0x00,0x56,0x32,0x34,0x31, 0x39,0x00,0x56,0x32,0x34,0x32,0x30,0x00,0x56,0x32,0x34,0x32,0x31,0x00,0x56,0x32, 0x34,0x32,0x32,0x00,0x56,0x32,0x34,0x32,0x33,0x00,0x56,0x32,0x34,0x32,0x34,0x00, 0x56,0x32,0x34,0x32,0x35,0x00,0x56,0x32,0x34,0x32,0x36,0x00,0x56,0x32,0x34,0x32, 0x37,0x00,0x56,0x32,0x34,0x32,0x38,0x00,0x56,0x32,0x34,0x32,0x39,0x00,0x56,0x32, 0x34,0x33,0x30,0x00,0x56,0x32,0x34,0x33,0x31,0x00,0x56,0x32,0x34,0x33,0x32,0x00, 0x56,0x32,0x34,0x33,0x33,0x00,0x56,0x32,0x34,0x33,0x34,0x00,0x56,0x32,0x34,0x33, 0x35,0x00,0x56,0x32,0x34,0x33,0x36,0x00,0x56,0x32,0x34,0x33,0x37,0x00,0x56,0x32, 0x34,0x33,0x38,0x00,0x56,0x32,0x34,0x33,0x39,0x00,0x56,0x32,0x34,0x34,0x30,0x00, 0x56,0x32,0x34,0x34,0x31,0x00,0x56,0x32,0x34,0x34,0x32,0x00,0x56,0x32,0x34,0x34, 0x33,0x00,0x56,0x32,0x34,0x34,0x34,0x00,0x56,0x32,0x34,0x34,0x35,0x00,0x56,0x32, 0x34,0x34,0x36,0x00,0x56,0x32,0x34,0x34,0x37,0x00,0x56,0x32,0x34,0x34,0x38,0x00, 0x56,0x32,0x34,0x34,0x39,0x00,0x56,0x32,0x34,0x35,0x30,0x00,0x56,0x32,0x34,0x35, 0x31,0x00,0x56,0x32,0x34,0x35,0x32,0x00,0x56,0x32,0x34,0x35,0x33,0x00,0x56,0x32, 0x34,0x35,0x34,0x00,0x56,0x32,0x34,0x35,0x35,0x00,0x56,0x32,0x34,0x35,0x36,0x00, 0x56,0x32,0x34,0x35,0x37,0x00,0x56,0x32,0x34,0x35,0x38,0x00,0x56,0x32,0x34,0x35, 0x39,0x00,0x56,0x32,0x34,0x36,0x30,0x00,0x56,0x32,0x34,0x36,0x31,0x00,0x56,0x32, 0x34,0x36,0x32,0x00,0x56,0x32,0x34,0x36,0x33,0x00,0x56,0x32,0x34,0x36,0x34,0x00, 0x56,0x32,0x34,0x36,0x35,0x00,0x56,0x32,0x34,0x36,0x36,0x00,0x56,0x32,0x34,0x36, 0x37,0x00,0x56,0x32,0x34,0x36,0x38,0x00,0x56,0x32,0x34,0x36,0x39,0x00,0x56,0x32, 0x34,0x37,0x30,0x00,0x56,0x32,0x34,0x37,0x31,0x00,0x56,0x32,0x34,0x37,0x32,0x00, 0x56,0x32,0x34,0x37,0x33,0x00,0x56,0x32,0x34,0x37,0x34,0x00,0x56,0x32,0x34,0x37, 0x35,0x00,0x56,0x32,0x34,0x37,0x36,0x00,0x56,0x32,0x34,0x37,0x37,0x00,0x56,0x32, 0x34,0x37,0x38,0x00,0x56,0x32,0x34,0x37,0x39,0x00,0x56,0x32,0x34,0x38,0x30,0x00, 0x56,0x32,0x34,0x38,0x31,0x00,0x56,0x32,0x34,0x38,0x32,0x00,0x56,0x32,0x34,0x38, 0x33,0x00,0x56,0x32,0x34,0x38,0x34,0x00,0x56,0x32,0x34,0x38,0x35,0x00,0x56,0x32, 0x34,0x38,0x36,0x00,0x56,0x32,0x34,0x38,0x37,0x00,0x56,0x32,0x34,0x38,0x38,0x00, 0x56,0x32,0x34,0x38,0x39,0x00,0x56,0x32,0x34,0x39,0x30,0x00,0x56,0x32,0x34,0x39, 0x31,0x00,0x56,0x32,0x34,0x39,0x32,0x00,0x56,0x32,0x34,0x39,0x33,0x00,0x56,0x32, 0x34,0x39,0x34,0x00,0x56,0x32,0x34,0x39,0x35,0x00,0x56,0x32,0x34,0x39,0x36,0x00, 0x56,0x32,0x34,0x39,0x37,0x00,0x56,0x32,0x34,0x39,0x38,0x00,0x56,0x32,0x34,0x39, 0x39,0x00,0x56,0x32,0x35,0x30,0x30,0x00,0x56,0x32,0x35,0x30,0x31,0x00,0x56,0x32, 0x35,0x30,0x32,0x00,0x56,0x32,0x35,0x30,0x33,0x00,0x56,0x32,0x35,0x30,0x34,0x00, 0x56,0x32,0x35,0x30,0x35,0x00,0x56,0x32,0x35,0x30,0x36,0x00,0x56,0x32,0x35,0x30, 0x37,0x00,0x56,0x32,0x35,0x30,0x38,0x00,0x56,0x32,0x35,0x30,0x39,0x00,0x56,0x32, 0x35,0x31,0x30,0x00,0x56,0x32,0x35,0x31,0x31,0x00,0x56,0x32,0x35,0x31,0x32,0x00, 0x56,0x32,0x35,0x31,0x33,0x00,0x56,0x32,0x35,0x31,0x34,0x00,0x56,0x32,0x35,0x31, 0x35,0x00,0x56,0x32,0x35,0x31,0x36,0x00,0x56,0x32,0x35,0x31,0x37,0x00,0x56,0x32, 0x35,0x31,0x38,0x00,0x56,0x32,0x35,0x31,0x39,0x00,0x56,0x32,0x35,0x32,0x30,0x00, 0x56,0x32,0x35,0x32,0x31,0x00,0x56,0x32,0x35,0x32,0x32,0x00,0x56,0x32,0x35,0x32, 0x33,0x00,0x56,0x32,0x35,0x32,0x34,0x00,0x56,0x32,0x35,0x32,0x35,0x00,0x56,0x32, 0x35,0x32,0x36,0x00,0x56,0x32,0x35,0x32,0x37,0x00,0x56,0x32,0x35,0x32,0x38,0x00, 0x56,0x32,0x35,0x32,0x39,0x00,0x56,0x32,0x35,0x33,0x30,0x00,0x56,0x32,0x35,0x33, 0x31,0x00,0x56,0x32,0x35,0x33,0x32,0x00,0x56,0x32,0x35,0x33,0x33,0x00,0x56,0x32, 0x35,0x33,0x34,0x00,0x56,0x32,0x35,0x33,0x35,0x00,0x56,0x32,0x35,0x33,0x36,0x00, 0x56,0x32,0x35,0x33,0x37,0x00,0x56,0x32,0x35,0x33,0x38,0x00,0x56,0x32,0x35,0x33, 0x39,0x00,0x56,0x32,0x35,0x34,0x30,0x00,0x56,0x32,0x35,0x34,0x31,0x00,0x56,0x32, 0x35,0x34,0x32,0x00,0x56,0x32,0x35,0x34,0x33,0x00,0x56,0x32,0x35,0x34,0x34,0x00, 0x56,0x32,0x35,0x34,0x35,0x00,0x56,0x32,0x35,0x34,0x36,0x00,0x56,0x32,0x35,0x34, 0x37,0x00,0x56,0x32,0x35,0x34,0x38,0x00,0x56,0x32,0x35,0x34,0x39,0x00,0x56,0x32, 0x35,0x35,0x30,0x00,0x56,0x32,0x35,0x35,0x31,0x00,0x56,0x32,0x35,0x35,0x32,0x00, 0x56,0x32,0x35,0x35,0x33,0x00,0x56,0x32,0x35,0x35,0x34,0x00,0x56,0x32,0x35,0x35, 0x35,0x00,0x56,0x32,0x35,0x35,0x36,0x00,0x56,0x32,0x35,0x35,0x37,0x00,0x56,0x32, 0x35,0x35,0x38,0x00,0x56,0x32,0x35,0x35,0x39,0x00,0x56,0x32,0x35,0x36,0x30,0x00, 0x56,0x32,0x35,0x36,0x31,0x00,0x56,0x32,0x35,0x36,0x32,0x00,0x56,0x32,0x35,0x36, 0x33,0x00,0x56,0x32,0x35,0x36,0x34,0x00,0x56,0x32,0x35,0x36,0x35,0x00,0x56,0x32, 0x35,0x36,0x36,0x00,0x56,0x32,0x35,0x36,0x37,0x00,0x56,0x32,0x35,0x36,0x38,0x00, 0x56,0x32,0x35,0x36,0x39,0x00,0x56,0x32,0x35,0x37,0x30,0x00,0x56,0x32,0x35,0x37, 0x31,0x00,0x56,0x32,0x35,0x37,0x32,0x00,0x56,0x32,0x35,0x37,0x33,0x00,0x56,0x32, 0x35,0x37,0x34,0x00,0x56,0x32,0x35,0x37,0x35,0x00,0x56,0x32,0x35,0x37,0x36,0x00, 0x56,0x32,0x35,0x37,0x37,0x00,0x56,0x32,0x35,0x37,0x38,0x00,0x56,0x32,0x35,0x37, 0x39,0x00,0x56,0x32,0x35,0x38,0x30,0x00,0x56,0x32,0x35,0x38,0x31,0x00,0x56,0x32, 0x35,0x38,0x32,0x00,0x56,0x32,0x35,0x38,0x33,0x00,0x56,0x32,0x35,0x38,0x34,0x00, 0x56,0x32,0x35,0x38,0x35,0x00,0x56,0x32,0x35,0x38,0x36,0x00,0x56,0x32,0x35,0x38, 0x37,0x00,0x56,0x32,0x35,0x38,0x38,0x00,0x56,0x32,0x35,0x38,0x39,0x00,0x56,0x32, 0x35,0x39,0x30,0x00,0x56,0x32,0x35,0x39,0x31,0x00,0x56,0x32,0x35,0x39,0x32,0x00, 0x56,0x32,0x35,0x39,0x33,0x00,0x56,0x32,0x35,0x39,0x34,0x00,0x56,0x32,0x35,0x39, 0x35,0x00,0x56,0x32,0x35,0x39,0x36,0x00,0x56,0x32,0x35,0x39,0x37,0x00,0x56,0x32, 0x35,0x39,0x38,0x00,0x56,0x32,0x35,0x39,0x39,0x00,0x56,0x32,0x36,0x30,0x30,0x00, 0x56,0x32,0x36,0x30,0x31,0x00,0x56,0x32,0x36,0x30,0x32,0x00,0x56,0x32,0x36,0x30, 0x33,0x00,0x56,0x32,0x36,0x30,0x34,0x00,0x56,0x32,0x36,0x30,0x35,0x00,0x56,0x32, 0x36,0x30,0x36,0x00,0x56,0x32,0x36,0x30,0x37,0x00,0x56,0x32,0x36,0x30,0x38,0x00, 0x56,0x32,0x36,0x30,0x39,0x00,0x56,0x32,0x36,0x31,0x30,0x00,0x56,0x32,0x36,0x31, 0x31,0x00,0x56,0x32,0x36,0x31,0x32,0x00,0x56,0x32,0x36,0x31,0x33,0x00,0x56,0x32, 0x36,0x31,0x34,0x00,0x56,0x32,0x36,0x31,0x35,0x00,0x56,0x32,0x36,0x31,0x36,0x00, 0x56,0x32,0x36,0x31,0x37,0x00,0x56,0x32,0x36,0x31,0x38,0x00,0x56,0x32,0x36,0x31, 0x39,0x00,0x56,0x32,0x36,0x32,0x30,0x00,0x56,0x32,0x36,0x32,0x31,0x00,0x56,0x32, 0x36,0x32,0x32,0x00,0x56,0x32,0x36,0x32,0x33,0x00,0x56,0x32,0x36,0x32,0x34,0x00, 0x56,0x32,0x36,0x32,0x35,0x00,0x56,0x32,0x36,0x32,0x36,0x00,0x56,0x32,0x36,0x32, 0x37,0x00,0x56,0x32,0x36,0x32,0x38,0x00,0x56,0x32,0x36,0x32,0x39,0x00,0x56,0x32, 0x36,0x33,0x30,0x00,0x56,0x32,0x36,0x33,0x31,0x00,0x56,0x32,0x36,0x33,0x32,0x00, 0x56,0x32,0x36,0x33,0x33,0x00,0x56,0x32,0x36,0x33,0x34,0x00,0x56,0x32,0x36,0x33, 0x35,0x00,0x56,0x32,0x36,0x33,0x36,0x00,0x56,0x32,0x36,0x33,0x37,0x00,0x56,0x32, 0x36,0x33,0x38,0x00,0x56,0x32,0x36,0x33,0x39,0x00,0x56,0x32,0x36,0x34,0x30,0x00, 0x56,0x32,0x36,0x34,0x31,0x00,0x56,0x32,0x36,0x34,0x32,0x00,0x56,0x32,0x36,0x34, 0x33,0x00,0x56,0x32,0x36,0x34,0x34,0x00,0x56,0x32,0x36,0x34,0x35,0x00,0x56,0x32, 0x36,0x34,0x36,0x00,0x56,0x32,0x36,0x34,0x37,0x00,0x56,0x32,0x36,0x34,0x38,0x00, 0x56,0x32,0x36,0x34,0x39,0x00,0x56,0x32,0x36,0x35,0x30,0x00,0x56,0x32,0x36,0x35, 0x31,0x00,0x56,0x32,0x36,0x35,0x32,0x00,0x56,0x32,0x36,0x35,0x33,0x00,0x56,0x32, 0x36,0x35,0x34,0x00,0x56,0x32,0x36,0x35,0x35,0x00,0x56,0x32,0x36,0x35,0x36,0x00, 0x56,0x32,0x36,0x35,0x37,0x00,0x56,0x32,0x36,0x35,0x38,0x00,0x56,0x32,0x36,0x35, 0x39,0x00,0x56,0x32,0x36,0x36,0x30,0x00,0x56,0x32,0x36,0x36,0x31,0x00,0x56,0x32, 0x36,0x36,0x32,0x00,0x56,0x32,0x36,0x36,0x33,0x00,0x56,0x32,0x36,0x36,0x34,0x00, 0x56,0x32,0x36,0x36,0x35,0x00,0x56,0x32,0x36,0x36,0x36,0x00,0x56,0x32,0x36,0x36, 0x37,0x00,0x56,0x32,0x36,0x36,0x38,0x00,0x56,0x32,0x36,0x36,0x39,0x00,0x56,0x32, 0x36,0x37,0x30,0x00,0x56,0x32,0x36,0x37,0x31,0x00,0x56,0x32,0x36,0x37,0x32,0x00, 0x56,0x32,0x36,0x37,0x33,0x00,0x56,0x32,0x36,0x37,0x34,0x00,0x56,0x32,0x36,0x37, 0x35,0x00,0x56,0x32,0x36,0x37,0x36,0x00,0x56,0x32,0x36,0x37,0x37,0x00,0x56,0x32, 0x36,0x37,0x38,0x00,0x56,0x32,0x36,0x37,0x39,0x00,0x56,0x32,0x36,0x38,0x30,0x00, 0x56,0x32,0x36,0x38,0x31,0x00,0x56,0x32,0x36,0x38,0x32,0x00,0x56,0x32,0x36,0x38, 0x33,0x00,0x56,0x32,0x36,0x38,0x34,0x00,0x56,0x32,0x36,0x38,0x35,0x00,0x56,0x32, 0x36,0x38,0x36,0x00,0x56,0x32,0x36,0x38,0x37,0x00,0x56,0x32,0x36,0x38,0x38,0x00, 0x56,0x32,0x36,0x38,0x39,0x00,0x56,0x32,0x36,0x39,0x30,0x00,0x56,0x32,0x36,0x39, 0x31,0x00,0x56,0x32,0x36,0x39,0x32,0x00,0x56,0x32,0x36,0x39,0x33,0x00,0x56,0x32, 0x36,0x39,0x34,0x00,0x56,0x32,0x36,0x39,0x35,0x00,0x56,0x32,0x36,0x39,0x36,0x00, 0x56,0x32,0x36,0x39,0x37,0x00,0x56,0x32,0x36,0x39,0x38,0x00,0x56,0x32,0x36,0x39, 0x39,0x00,0x56,0x32,0x37,0x30,0x30,0x00,0x56,0x32,0x37,0x30,0x31,0x00,0x56,0x32, 0x37,0x30,0x32,0x00,0x56,0x32,0x37,0x30,0x33,0x00,0x56,0x32,0x37,0x30,0x34,0x00, 0x56,0x32,0x37,0x30,0x35,0x00,0x56,0x32,0x37,0x30,0x36,0x00,0x56,0x32,0x37,0x30, 0x37,0x00,0x56,0x32,0x37,0x30,0x38,0x00,0x56,0x32,0x37,0x30,0x39,0x00,0x56,0x32, 0x37,0x31,0x30,0x00,0x56,0x32,0x37,0x31,0x31,0x00,0x56,0x32,0x37,0x31,0x32,0x00, 0x56,0x32,0x37,0x31,0x33,0x00,0x56,0x32,0x37,0x31,0x34,0x00,0x56,0x32,0x37,0x31, 0x35,0x00,0x56,0x32,0x37,0x31,0x36,0x00,0x56,0x32,0x37,0x31,0x37,0x00,0x56,0x32, 0x37,0x31,0x38,0x00,0x56,0x32,0x37,0x31,0x39,0x00,0x56,0x32,0x37,0x32,0x30,0x00, 0x56,0x32,0x37,0x32,0x31,0x00,0x56,0x32,0x37,0x32,0x32,0x00,0x56,0x32,0x37,0x32, 0x33,0x00,0x56,0x32,0x37,0x32,0x34,0x00,0x56,0x32,0x37,0x32,0x35,0x00,0x56,0x32, 0x37,0x32,0x36,0x00,0x56,0x32,0x37,0x32,0x37,0x00,0x56,0x32,0x37,0x32,0x38,0x00, 0x56,0x32,0x37,0x32,0x39,0x00,0x56,0x32,0x37,0x33,0x30,0x00,0x56,0x32,0x37,0x33, 0x31,0x00,0x56,0x32,0x37,0x33,0x32,0x00,0x56,0x32,0x37,0x33,0x33,0x00,0x56,0x32, 0x37,0x33,0x34,0x00,0x56,0x32,0x37,0x33,0x35,0x00,0x56,0x32,0x37,0x33,0x36,0x00, 0x56,0x32,0x37,0x33,0x37,0x00,0x56,0x32,0x37,0x33,0x38,0x00,0x56,0x32,0x37,0x33, 0x39,0x00,0x56,0x32,0x37,0x34,0x30,0x00,0x56,0x32,0x37,0x34,0x31,0x00,0x56,0x32, 0x37,0x34,0x32,0x00,0x56,0x32,0x37,0x34,0x33,0x00,0x56,0x32,0x37,0x34,0x34,0x00, 0x56,0x32,0x37,0x34,0x35,0x00,0x56,0x32,0x37,0x34,0x36,0x00,0x56,0x32,0x37,0x34, 0x37,0x00,0x56,0x32,0x37,0x34,0x38,0x00,0x56,0x32,0x37,0x34,0x39,0x00,0x56,0x32, 0x37,0x35,0x30,0x00,0x56,0x32,0x37,0x35,0x31,0x00,0x56,0x32,0x37,0x35,0x32,0x00, 0x56,0x32,0x37,0x35,0x33,0x00,0x56,0x32,0x37,0x35,0x34,0x00,0x56,0x32,0x37,0x35, 0x35,0x00,0x56,0x32,0x37,0x35,0x36,0x00,0x56,0x32,0x37,0x35,0x37,0x00,0x56,0x32, 0x37,0x35,0x38,0x00,0x56,0x32,0x37,0x35,0x39,0x00,0x56,0x32,0x37,0x36,0x30,0x00, 0x56,0x32,0x37,0x36,0x31,0x00,0x56,0x32,0x37,0x36,0x32,0x00,0x56,0x32,0x37,0x36, 0x33,0x00,0x56,0x32,0x37,0x36,0x34,0x00,0x56,0x32,0x37,0x36,0x35,0x00,0x56,0x32, 0x37,0x36,0x36,0x00,0x56,0x32,0x37,0x36,0x37,0x00,0x56,0x32,0x37,0x36,0x38,0x00, 0x56,0x32,0x37,0x36,0x39,0x00,0x56,0x32,0x37,0x37,0x30,0x00,0x56,0x32,0x37,0x37, 0x31,0x00,0x56,0x32,0x37,0x37,0x32,0x00,0x56,0x32,0x37,0x37,0x33,0x00,0x56,0x32, 0x37,0x37,0x34,0x00,0x56,0x32,0x37,0x37,0x35,0x00,0x56,0x32,0x37,0x37,0x36,0x00, 0x56,0x32,0x37,0x37,0x37,0x00,0x56,0x32,0x37,0x37,0x38,0x00,0x56,0x32,0x37,0x37, 0x39,0x00,0x56,0x32,0x37,0x38,0x30,0x00,0x56,0x32,0x37,0x38,0x31,0x00,0x56,0x32, 0x37,0x38,0x32,0x00,0x56,0x32,0x37,0x38,0x33,0x00,0x56,0x32,0x37,0x38,0x34,0x00, 0x56,0x32,0x37,0x38,0x35,0x00,0x56,0x32,0x37,0x38,0x36,0x00,0x56,0x32,0x37,0x38, 0x37,0x00,0x56,0x32,0x37,0x38,0x38,0x00,0x56,0x32,0x37,0x38,0x39,0x00,0x56,0x32, 0x37,0x39,0x30,0x00,0x56,0x32,0x37,0x39,0x31,0x00,0x56,0x32,0x37,0x39,0x32,0x00, 0x56,0x32,0x37,0x39,0x33,0x00,0x56,0x32,0x37,0x39,0x34,0x00,0x56,0x32,0x37,0x39, 0x35,0x00,0x56,0x32,0x37,0x39,0x36,0x00,0x56,0x32,0x37,0x39,0x37,0x00,0x56,0x32, 0x37,0x39,0x38,0x00,0x56,0x32,0x37,0x39,0x39,0x00,0x56,0x32,0x38,0x30,0x30,0x00, 0x56,0x32,0x38,0x30,0x31,0x00,0x56,0x32,0x38,0x30,0x32,0x00,0x56,0x32,0x38,0x30, 0x33,0x00,0x56,0x32,0x38,0x30,0x34,0x00,0x56,0x32,0x38,0x30,0x35,0x00,0x56,0x32, 0x38,0x30,0x36,0x00,0x56,0x32,0x38,0x30,0x37,0x00,0x56,0x32,0x38,0x30,0x38,0x00, 0x56,0x32,0x38,0x30,0x39,0x00,0x56,0x32,0x38,0x31,0x30,0x00,0x56,0x32,0x38,0x31, 0x31,0x00,0x56,0x32,0x38,0x31,0x32,0x00,0x56,0x32,0x38,0x31,0x33,0x00,0x56,0x32, 0x38,0x31,0x34,0x00,0x56,0x32,0x38,0x31,0x35,0x00,0x56,0x32,0x38,0x31,0x36,0x00, 0x56,0x32,0x38,0x31,0x37,0x00,0x56,0x32,0x38,0x31,0x38,0x00,0x56,0x32,0x38,0x31, 0x39,0x00,0x56,0x32,0x38,0x32,0x30,0x00,0x56,0x32,0x38,0x32,0x31,0x00,0x56,0x32, 0x38,0x32,0x32,0x00,0x56,0x32,0x38,0x32,0x33,0x00,0x56,0x32,0x38,0x32,0x34,0x00, 0x56,0x32,0x38,0x32,0x35,0x00,0x56,0x32,0x38,0x32,0x36,0x00,0x56,0x32,0x38,0x32, 0x37,0x00,0x56,0x32,0x38,0x32,0x38,0x00,0x56,0x32,0x38,0x32,0x39,0x00,0x56,0x32, 0x38,0x33,0x30,0x00,0x56,0x32,0x38,0x33,0x31,0x00,0x56,0x32,0x38,0x33,0x32,0x00, 0x56,0x32,0x38,0x33,0x33,0x00,0x56,0x32,0x38,0x33,0x34,0x00,0x56,0x32,0x38,0x33, 0x35,0x00,0x56,0x32,0x38,0x33,0x36,0x00,0x56,0x32,0x38,0x33,0x37,0x00,0x56,0x32, 0x38,0x33,0x38,0x00,0x56,0x32,0x38,0x33,0x39,0x00,0x56,0x32,0x38,0x34,0x30,0x00, 0x56,0x32,0x38,0x34,0x31,0x00,0x56,0x32,0x38,0x34,0x32,0x00,0x56,0x32,0x38,0x34, 0x33,0x00,0x56,0x32,0x38,0x34,0x34,0x00,0x56,0x32,0x38,0x34,0x35,0x00,0x56,0x32, 0x38,0x34,0x36,0x00,0x56,0x32,0x38,0x34,0x37,0x00,0x56,0x32,0x38,0x34,0x38,0x00, 0x56,0x32,0x38,0x34,0x39,0x00,0x56,0x32,0x38,0x35,0x30,0x00,0x56,0x32,0x38,0x35, 0x31,0x00,0x56,0x32,0x38,0x35,0x32,0x00,0x56,0x32,0x38,0x35,0x33,0x00,0x56,0x32, 0x38,0x35,0x34,0x00,0x56,0x32,0x38,0x35,0x35,0x00,0x56,0x32,0x38,0x35,0x36,0x00, 0x56,0x32,0x38,0x35,0x37,0x00,0x56,0x32,0x38,0x35,0x38,0x00,0x56,0x32,0x38,0x35, 0x39,0x00,0x56,0x32,0x38,0x36,0x30,0x00,0x56,0x32,0x38,0x36,0x31,0x00,0x56,0x32, 0x38,0x36,0x32,0x00,0x56,0x32,0x38,0x36,0x33,0x00,0x56,0x32,0x38,0x36,0x34,0x00, 0x56,0x32,0x38,0x36,0x35,0x00,0x56,0x32,0x38,0x36,0x36,0x00,0x56,0x32,0x38,0x36, 0x37,0x00,0x56,0x32,0x38,0x36,0x38,0x00,0x56,0x32,0x38,0x36,0x39,0x00,0x56,0x32, 0x38,0x37,0x30,0x00,0x56,0x32,0x38,0x37,0x31,0x00,0x56,0x32,0x38,0x37,0x32,0x00, 0x56,0x32,0x38,0x37,0x33,0x00,0x56,0x32,0x38,0x37,0x34,0x00,0x56,0x32,0x38,0x37, 0x35,0x00,0x56,0x32,0x38,0x37,0x36,0x00,0x56,0x32,0x38,0x37,0x37,0x00,0x56,0x32, 0x38,0x37,0x38,0x00,0x56,0x32,0x38,0x37,0x39,0x00,0x56,0x32,0x38,0x38,0x30,0x00, 0x56,0x32,0x38,0x38,0x31,0x00,0x56,0x32,0x38,0x38,0x32,0x00,0x56,0x32,0x38,0x38, 0x33,0x00,0x56,0x32,0x38,0x38,0x34,0x00,0x56,0x32,0x38,0x38,0x35,0x00,0x56,0x32, 0x38,0x38,0x36,0x00,0x56,0x32,0x38,0x38,0x37,0x00,0x56,0x32,0x38,0x38,0x38,0x00, 0x56,0x32,0x38,0x38,0x39,0x00,0x56,0x32,0x38,0x39,0x30,0x00,0x56,0x32,0x38,0x39, 0x31,0x00,0x56,0x32,0x38,0x39,0x32,0x00,0x56,0x32,0x38,0x39,0x33,0x00,0x56,0x32, 0x38,0x39,0x34,0x00,0x56,0x32,0x38,0x39,0x35,0x00,0x56,0x32,0x38,0x39,0x36,0x00, 0x56,0x32,0x38,0x39,0x37,0x00,0x56,0x32,0x38,0x39,0x38,0x00,0x56,0x32,0x38,0x39, 0x39,0x00,0x56,0x32,0x39,0x30,0x30,0x00,0x56,0x32,0x39,0x30,0x31,0x00,0x56,0x32, 0x39,0x30,0x32,0x00,0x56,0x32,0x39,0x30,0x33,0x00,0x56,0x32,0x39,0x30,0x34,0x00, 0x56,0x32,0x39,0x30,0x35,0x00,0x56,0x32,0x39,0x30,0x36,0x00,0x56,0x32,0x39,0x30, 0x37,0x00,0x56,0x32,0x39,0x30,0x38,0x00,0x56,0x32,0x39,0x30,0x39,0x00,0x56,0x32, 0x39,0x31,0x30,0x00,0x56,0x32,0x39,0x31,0x31,0x00,0x56,0x32,0x39,0x31,0x32,0x00, 0x56,0x32,0x39,0x31,0x33,0x00,0x56,0x32,0x39,0x31,0x34,0x00,0x56,0x32,0x39,0x31, 0x35,0x00,0x56,0x32,0x39,0x31,0x36,0x00,0x56,0x32,0x39,0x31,0x37,0x00,0x56,0x32, 0x39,0x31,0x38,0x00,0x56,0x32,0x39,0x31,0x39,0x00,0x56,0x32,0x39,0x32,0x30,0x00, 0x56,0x32,0x39,0x32,0x31,0x00,0x56,0x32,0x39,0x32,0x32,0x00,0x56,0x32,0x39,0x32, 0x33,0x00,0x56,0x32,0x39,0x32,0x34,0x00,0x56,0x32,0x39,0x32,0x35,0x00,0x56,0x32, 0x39,0x32,0x36,0x00,0x56,0x32,0x39,0x32,0x37,0x00,0x56,0x32,0x39,0x32,0x38,0x00, 0x56,0x32,0x39,0x32,0x39,0x00,0x56,0x32,0x39,0x33,0x30,0x00,0x56,0x32,0x39,0x33, 0x31,0x00,0x56,0x32,0x39,0x33,0x32,0x00,0x56,0x32,0x39,0x33,0x33,0x00,0x56,0x32, 0x39,0x33,0x34,0x00,0x56,0x32,0x39,0x33,0x35,0x00,0x56,0x32,0x39,0x33,0x36,0x00, 0x56,0x32,0x39,0x33,0x37,0x00,0x56,0x32,0x39,0x33,0x38,0x00,0x56,0x32,0x39,0x33, 0x39,0x00,0x56,0x32,0x39,0x34,0x30,0x00,0x56,0x32,0x39,0x34,0x31,0x00,0x56,0x32, 0x39,0x34,0x32,0x00,0x56,0x32,0x39,0x34,0x33,0x00,0x56,0x32,0x39,0x34,0x34,0x00, 0x56,0x32,0x39,0x34,0x35,0x00,0x56,0x32,0x39,0x34,0x36,0x00,0x56,0x32,0x39,0x34, 0x37,0x00,0x56,0x32,0x39,0x34,0x38,0x00,0x56,0x32,0x39,0x34,0x39,0x00,0x56,0x32, 0x39,0x35,0x30,0x00,0x56,0x32,0x39,0x35,0x31,0x00,0x56,0x32,0x39,0x35,0x32,0x00, 0x56,0x32,0x39,0x35,0x33,0x00,0x56,0x32,0x39,0x35,0x34,0x00,0x56,0x32,0x39,0x35, 0x35,0x00,0x56,0x32,0x39,0x35,0x36,0x00,0x56,0x32,0x39,0x35,0x37,0x00,0x56,0x32, 0x39,0x35,0x38,0x00,0x56,0x32,0x39,0x35,0x39,0x00,0x56,0x32,0x39,0x36,0x30,0x00, 0x56,0x32,0x39,0x36,0x31,0x00,0x56,0x32,0x39,0x36,0x32,0x00,0x56,0x32,0x39,0x36, 0x33,0x00,0x56,0x32,0x39,0x36,0x34,0x00,0x56,0x32,0x39,0x36,0x35,0x00,0x56,0x32, 0x39,0x36,0x36,0x00,0x56,0x32,0x39,0x36,0x37,0x00,0x56,0x32,0x39,0x36,0x38,0x00, 0x56,0x32,0x39,0x36,0x39,0x00,0x56,0x32,0x39,0x37,0x30,0x00,0x56,0x32,0x39,0x37, 0x31,0x00,0x56,0x32,0x39,0x37,0x32,0x00,0x56,0x32,0x39,0x37,0x33,0x00,0x56,0x32, 0x39,0x37,0x34,0x00,0x56,0x32,0x39,0x37,0x35,0x00,0x56,0x32,0x39,0x37,0x36,0x00, 0x56,0x32,0x39,0x37,0x37,0x00,0x56,0x32,0x39,0x37,0x38,0x00,0x56,0x32,0x39,0x37, 0x39,0x00,0x56,0x32,0x39,0x38,0x30,0x00,0x56,0x32,0x39,0x38,0x31,0x00,0x56,0x32, 0x39,0x38,0x32,0x00,0x56,0x32,0x39,0x38,0x33,0x00,0x56,0x32,0x39,0x38,0x34,0x00, 0x56,0x32,0x39,0x38,0x35,0x00,0x56,0x32,0x39,0x38,0x36,0x00,0x56,0x32,0x39,0x38, 0x37,0x00,0x56,0x32,0x39,0x38,0x38,0x00,0x56,0x32,0x39,0x38,0x39,0x00,0x56,0x32, 0x39,0x39,0x30,0x00,0x56,0x32,0x39,0x39,0x31,0x00,0x56,0x32,0x39,0x39,0x32,0x00, 0x56,0x32,0x39,0x39,0x33,0x00,0x56,0x32,0x39,0x39,0x34,0x00,0x56,0x32,0x39,0x39, 0x35,0x00,0x56,0x32,0x39,0x39,0x36,0x00,0x56,0x32,0x39,0x39,0x37,0x00,0x56,0x32, 0x39,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x39,0x00,0x56,0x33,0x30,0x30,0x30,0x00, 0x56,0x33,0x30,0x30,0x31,0x00,0x56,0x33,0x30,0x30,0x32,0x00,0x56,0x33,0x30,0x30, 0x33,0x00,0x56,0x33,0x30,0x30,0x34,0x00,0x56,0x33,0x30,0x30,0x35,0x00,0x56,0x33, 0x30,0x30,0x36,0x00,0x56,0x33,0x30,0x30,0x37,0x00,0x56,0x33,0x30,0x30,0x38,0x00, 0x56,0x33,0x30,0x30,0x39,0x00,0x56,0x33,0x30,0x31,0x30,0x00,0x56,0x33,0x30,0x31, 0x31,0x00,0x56,0x33,0x30,0x31,0x32,0x00,0x56,0x33,0x30,0x31,0x33,0x00,0x56,0x33, 0x30,0x31,0x34,0x00,0x56,0x33,0x30,0x31,0x35,0x00,0x56,0x33,0x30,0x31,0x36,0x00, 0x56,0x33,0x30,0x31,0x37,0x00,0x56,0x33,0x30,0x31,0x38,0x00,0x56,0x33,0x30,0x31, 0x39,0x00,0x56,0x33,0x30,0x32,0x30,0x00,0x56,0x33,0x30,0x32,0x31,0x00,0x56,0x33, 0x30,0x32,0x32,0x00,0x56,0x33,0x30,0x32,0x33,0x00,0x56,0x33,0x30,0x32,0x34,0x00, 0x56,0x33,0x30,0x32,0x35,0x00,0x56,0x33,0x30,0x32,0x36,0x00,0x56,0x33,0x30,0x32, 0x37,0x00,0x56,0x33,0x30,0x32,0x38,0x00,0x56,0x33,0x30,0x32,0x39,0x00,0x56,0x33, 0x30,0x33,0x30,0x00,0x56,0x33,0x30,0x33,0x31,0x00,0x56,0x33,0x30,0x33,0x32,0x00, 0x56,0x33,0x30,0x33,0x33,0x00,0x56,0x33,0x30,0x33,0x34,0x00,0x56,0x33,0x30,0x33, 0x35,0x00,0x56,0x33,0x30,0x33,0x36,0x00,0x56,0x33,0x30,0x33,0x37,0x00,0x56,0x33, 0x30,0x33,0x38,0x00,0x56,0x33,0x30,0x33,0x39,0x00,0x56,0x33,0x30,0x34,0x30,0x00, 0x56,0x33,0x30,0x34,0x31,0x00,0x56,0x33,0x30,0x34,0x32,0x00,0x56,0x33,0x30,0x34, 0x33,0x00,0x56,0x33,0x30,0x34,0x34,0x00,0x56,0x33,0x30,0x34,0x35,0x00,0x56,0x33, 0x30,0x34,0x36,0x00,0x56,0x33,0x30,0x34,0x37,0x00,0x56,0x33,0x30,0x34,0x38,0x00, 0x56,0x33,0x30,0x34,0x39,0x00,0x56,0x33,0x30,0x35,0x30,0x00,0x56,0x33,0x30,0x35, 0x31,0x00,0x56,0x33,0x30,0x35,0x32,0x00,0x56,0x33,0x30,0x35,0x33,0x00,0x56,0x33, 0x30,0x35,0x34,0x00,0x56,0x33,0x30,0x35,0x35,0x00,0x56,0x33,0x30,0x35,0x36,0x00, 0x56,0x33,0x30,0x35,0x37,0x00,0x56,0x33,0x30,0x35,0x38,0x00,0x56,0x33,0x30,0x35, 0x39,0x00,0x56,0x33,0x30,0x36,0x30,0x00,0x56,0x33,0x30,0x36,0x31,0x00,0x56,0x33, 0x30,0x36,0x32,0x00,0x56,0x33,0x30,0x36,0x33,0x00,0x56,0x33,0x30,0x36,0x34,0x00, 0x56,0x33,0x30,0x36,0x35,0x00,0x56,0x33,0x30,0x36,0x36,0x00,0x56,0x33,0x30,0x36, 0x37,0x00,0x56,0x33,0x30,0x36,0x38,0x00,0x56,0x33,0x30,0x36,0x39,0x00,0x56,0x33, 0x30,0x37,0x30,0x00,0x56,0x33,0x30,0x37,0x31,0x00,0x56,0x33,0x30,0x37,0x32,0x00, 0x56,0x33,0x30,0x37,0x33,0x00,0x56,0x33,0x30,0x37,0x34,0x00,0x56,0x33,0x30,0x37, 0x35,0x00,0x56,0x33,0x30,0x37,0x36,0x00,0x56,0x33,0x30,0x37,0x37,0x00,0x56,0x33, 0x30,0x37,0x38,0x00,0x56,0x33,0x30,0x37,0x39,0x00,0x56,0x33,0x30,0x38,0x30,0x00, 0x56,0x33,0x30,0x38,0x31,0x00,0x56,0x33,0x30,0x38,0x32,0x00,0x56,0x33,0x30,0x38, 0x33,0x00,0x56,0x33,0x30,0x38,0x34,0x00,0x56,0x33,0x30,0x38,0x35,0x00,0x56,0x33, 0x30,0x38,0x36,0x00,0x56,0x33,0x30,0x38,0x37,0x00,0x56,0x33,0x30,0x38,0x38,0x00, 0x56,0x33,0x30,0x38,0x39,0x00,0x56,0x33,0x30,0x39,0x30,0x00,0x56,0x33,0x30,0x39, 0x31,0x00,0x56,0x33,0x30,0x39,0x32,0x00,0x56,0x33,0x30,0x39,0x33,0x00,0x56,0x33, 0x30,0x39,0x34,0x00,0x56,0x33,0x30,0x39,0x35,0x00,0x56,0x33,0x30,0x39,0x36,0x00, 0x56,0x33,0x30,0x39,0x37,0x00,0x56,0x33,0x30,0x39,0x38,0x00,0x56,0x33,0x30,0x39, 0x39,0x00,0x56,0x33,0x31,0x30,0x30,0x00,0x56,0x33,0x31,0x30,0x31,0x00,0x56,0x33, 0x31,0x30,0x32,0x00,0x56,0x33,0x31,0x30,0x33,0x00,0x56,0x33,0x31,0x30,0x34,0x00, 0x56,0x33,0x31,0x30,0x35,0x00,0x56,0x33,0x31,0x30,0x36,0x00,0x56,0x33,0x31,0x30, 0x37,0x00,0x56,0x33,0x31,0x30,0x38,0x00,0x56,0x33,0x31,0x30,0x39,0x00,0x56,0x33, 0x31,0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x31,0x00,0x56,0x33,0x31,0x31,0x32,0x00, 0x56,0x33,0x31,0x31,0x33,0x00,0x56,0x33,0x31,0x31,0x34,0x00,0x56,0x33,0x31,0x31, 0x35,0x00,0x56,0x33,0x31,0x31,0x36,0x00,0x56,0x33,0x31,0x31,0x37,0x00,0x56,0x33, 0x31,0x31,0x38,0x00,0x56,0x33,0x31,0x31,0x39,0x00,0x56,0x33,0x31,0x32,0x30,0x00, 0x56,0x33,0x31,0x32,0x31,0x00,0x56,0x33,0x31,0x32,0x32,0x00,0x56,0x33,0x31,0x32, 0x33,0x00,0x56,0x33,0x31,0x32,0x34,0x00,0x56,0x33,0x31,0x32,0x35,0x00,0x56,0x33, 0x31,0x32,0x36,0x00,0x56,0x33,0x31,0x32,0x37,0x00,0x56,0x33,0x31,0x32,0x38,0x00, 0x56,0x33,0x31,0x32,0x39,0x00,0x56,0x33,0x31,0x33,0x30,0x00,0x56,0x33,0x31,0x33, 0x31,0x00,0x56,0x33,0x31,0x33,0x32,0x00,0x56,0x33,0x31,0x33,0x33,0x00,0x56,0x33, 0x31,0x33,0x34,0x00,0x56,0x33,0x31,0x33,0x35,0x00,0x56,0x33,0x31,0x33,0x36,0x00, 0x56,0x33,0x31,0x33,0x37,0x00,0x56,0x33,0x31,0x33,0x38,0x00,0x56,0x33,0x31,0x33, 0x39,0x00,0x56,0x33,0x31,0x34,0x30,0x00,0x56,0x33,0x31,0x34,0x31,0x00,0x56,0x33, 0x31,0x34,0x32,0x00,0x56,0x33,0x31,0x34,0x33,0x00,0x56,0x33,0x31,0x34,0x34,0x00, 0x56,0x33,0x31,0x34,0x35,0x00,0x56,0x33,0x31,0x34,0x36,0x00,0x56,0x33,0x31,0x34, 0x37,0x00,0x56,0x33,0x31,0x34,0x38,0x00,0x56,0x33,0x31,0x34,0x39,0x00,0x56,0x33, 0x31,0x35,0x30,0x00,0x56,0x33,0x31,0x35,0x31,0x00,0x56,0x33,0x31,0x35,0x32,0x00, 0x56,0x33,0x31,0x35,0x33,0x00,0x56,0x33,0x31,0x35,0x34,0x00,0x56,0x33,0x31,0x35, 0x35,0x00,0x56,0x33,0x31,0x35,0x36,0x00,0x56,0x33,0x31,0x35,0x37,0x00,0x56,0x33, 0x31,0x35,0x38,0x00,0x56,0x33,0x31,0x35,0x39,0x00,0x56,0x33,0x31,0x36,0x30,0x00, 0x56,0x33,0x31,0x36,0x31,0x00,0x56,0x33,0x31,0x36,0x32,0x00,0x56,0x33,0x31,0x36, 0x33,0x00,0x56,0x33,0x31,0x36,0x34,0x00,0x56,0x33,0x31,0x36,0x35,0x00,0x56,0x33, 0x31,0x36,0x36,0x00,0x56,0x33,0x31,0x36,0x37,0x00,0x56,0x33,0x31,0x36,0x38,0x00, 0x56,0x33,0x31,0x36,0x39,0x00,0x56,0x33,0x31,0x37,0x30,0x00,0x56,0x33,0x31,0x37, 0x31,0x00,0x56,0x33,0x31,0x37,0x32,0x00,0x56,0x33,0x31,0x37,0x33,0x00,0x56,0x33, 0x31,0x37,0x34,0x00,0x56,0x33,0x31,0x37,0x35,0x00,0x56,0x33,0x31,0x37,0x36,0x00, 0x56,0x33,0x31,0x37,0x37,0x00,0x56,0x33,0x31,0x37,0x38,0x00,0x56,0x33,0x31,0x37, 0x39,0x00,0x56,0x33,0x31,0x38,0x30,0x00,0x56,0x33,0x31,0x38,0x31,0x00,0x56,0x33, 0x31,0x38,0x32,0x00,0x56,0x33,0x31,0x38,0x33,0x00,0x56,0x33,0x31,0x38,0x34,0x00, 0x56,0x33,0x31,0x38,0x35,0x00,0x56,0x33,0x31,0x38,0x36,0x00,0x56,0x33,0x31,0x38, 0x37,0x00,0x56,0x33,0x31,0x38,0x38,0x00,0x56,0x33,0x31,0x38,0x39,0x00,0x56,0x33, 0x31,0x39,0x30,0x00,0x56,0x33,0x31,0x39,0x31,0x00,0x56,0x33,0x31,0x39,0x32,0x00, 0x56,0x33,0x31,0x39,0x33,0x00,0x56,0x33,0x31,0x39,0x34,0x00,0x56,0x33,0x31,0x39, 0x35,0x00,0x56,0x33,0x31,0x39,0x36,0x00,0x56,0x33,0x31,0x39,0x37,0x00,0x56,0x33, 0x31,0x39,0x38,0x00,0x56,0x33,0x31,0x39,0x39,0x00,0x56,0x33,0x32,0x30,0x30,0x00, 0x56,0x33,0x32,0x30,0x31,0x00,0x56,0x33,0x32,0x30,0x32,0x00,0x56,0x33,0x32,0x30, 0x33,0x00,0x56,0x33,0x32,0x30,0x34,0x00,0x56,0x33,0x32,0x30,0x35,0x00,0x56,0x33, 0x32,0x30,0x36,0x00,0x56,0x33,0x32,0x30,0x37,0x00,0x56,0x33,0x32,0x30,0x38,0x00, 0x56,0x33,0x32,0x30,0x39,0x00,0x56,0x33,0x32,0x31,0x30,0x00,0x56,0x33,0x32,0x31, 0x31,0x00,0x56,0x33,0x32,0x31,0x32,0x00,0x56,0x33,0x32,0x31,0x33,0x00,0x56,0x33, 0x32,0x31,0x34,0x00,0x56,0x33,0x32,0x31,0x35,0x00,0x56,0x33,0x32,0x31,0x36,0x00, 0x56,0x33,0x32,0x31,0x37,0x00,0x56,0x33,0x32,0x31,0x38,0x00,0x56,0x33,0x32,0x31, 0x39,0x00,0x56,0x33,0x32,0x32,0x30,0x00,0x56,0x33,0x32,0x32,0x31,0x00,0x56,0x33, 0x32,0x32,0x32,0x00,0x56,0x33,0x32,0x32,0x33,0x00,0x41,0x30,0x30,0x00,0x41,0x30, 0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30,0x34,0x00,0x41,0x30, 0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30,0x38,0x00,0x41,0x30, 0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31,0x32,0x00,0x41,0x31, 0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31,0x36,0x00,0x41,0x31, 0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31,0x39,0x00,0x50,0x30,0x31,0x00,0x50,0x30, 0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30, 0x36,0x00,0x50,0x30,0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31, 0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31, 0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31, 0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32, 0x32,0x00,0x50,0x32,0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32, 0x36,0x00,0x50,0x32,0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33, 0x30,0x00,0x50,0x33,0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33, 0x34,0x00,0x50,0x33,0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33, 0x38,0x00,0x50,0x33,0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34, 0x32,0x00,0x50,0x34,0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34, 0x36,0x00,0x50,0x34,0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35, 0x30,0x00,0x50,0x35,0x31,0x00,0x50,0x35,0x32,0x00,0x50,0x35,0x33,0x00,0x50,0x35, 0x34,0x00,0x50,0x35,0x35,0x00,0x50,0x35,0x36,0x00,0x50,0x35,0x37,0x00,0x50,0x35, 0x38,0x00,0x50,0x35,0x39,0x00,0x50,0x36,0x30,0x00,0x50,0x36,0x31,0x00,0x50,0x36, 0x32,0x00,0x50,0x36,0x33,0x00,0x50,0x36,0x34,0x00,0x50,0x36,0x35,0x00,0x50,0x36, 0x36,0x00,0x50,0x36,0x37,0x00,0x50,0x36,0x38,0x00,0x50,0x36,0x39,0x00,0x50,0x37, 0x30,0x00,0x50,0x37,0x31,0x00,0x50,0x37,0x32,0x00,0x50,0x37,0x33,0x00,0x50,0x37, 0x34,0x00,0x50,0x37,0x35,0x00,0x50,0x37,0x36,0x00,0x50,0x37,0x37,0x00,0x50,0x37, 0x38,0x00,0x50,0x37,0x39,0x00,0x50,0x38,0x30,0x00,0x50,0x38,0x31,0x00,0x50,0x38, 0x32,0x00,0x50,0x38,0x33,0x00,0x50,0x38,0x34,0x00,0x50,0x38,0x35,0x00,0x50,0x38, 0x36,0x00,0x50,0x38,0x37,0x00,0x50,0x38,0x38,0x00,0x50,0x38,0x39,0x00,0x50,0x39, 0x30,0x00,0x50,0x39,0x31,0x00,0x50,0x39,0x32,0x00,0x50,0x39,0x33,0x00,0x50,0x39, 0x34,0x00,0x50,0x39,0x35,0x00,0x50,0x39,0x36,0x00,0x50,0x39,0x37,0x00,0x50,0x39, 0x38,0x00,0x50,0x39,0x39,0x00,0x50,0x31,0x30,0x30,0x00,0x50,0x31,0x30,0x31,0x00, 0x50,0x31,0x30,0x32,0x00,0x50,0x31,0x30,0x33,0x00,0x50,0x31,0x30,0x34,0x00,0x50, 0x31,0x30,0x35,0x00,0x50,0x31,0x30,0x36,0x00,0x50,0x31,0x30,0x37,0x00,0x50,0x31, 0x30,0x38,0x00,0x50,0x31,0x30,0x39,0x00,0x50,0x31,0x31,0x30,0x00,0x50,0x31,0x31, 0x31,0x00,0x50,0x31,0x31,0x32,0x00,0x50,0x31,0x31,0x33,0x00,0x50,0x31,0x31,0x34, 0x00,0x50,0x31,0x31,0x35,0x00,0x50,0x31,0x31,0x36,0x00,0x50,0x31,0x31,0x37,0x00, 0x50,0x31,0x31,0x38,0x00,0x50,0x31,0x31,0x39,0x00,0x50,0x31,0x32,0x30,0x00,0x50, 0x31,0x32,0x31,0x00,0x50,0x31,0x32,0x32,0x00,0x50,0x31,0x32,0x33,0x00,0x50,0x31, 0x32,0x34,0x00,0x50,0x31,0x32,0x35,0x00,0x50,0x31,0x32,0x36,0x00,0x50,0x31,0x32, 0x37,0x00,0x50,0x31,0x32,0x38,0x00,0x50,0x31,0x32,0x39,0x00,0x50,0x31,0x33,0x30, 0x00,0x50,0x31,0x33,0x31,0x00,0x50,0x31,0x33,0x32,0x00,0x50,0x31,0x33,0x33,0x00, 0x50,0x31,0x33,0x34,0x00,0x50,0x31,0x33,0x35,0x00,0x50,0x31,0x33,0x36,0x00,0x50, 0x31,0x33,0x37,0x00,0x50,0x31,0x33,0x38,0x00,0x50,0x31,0x33,0x39,0x00,0x50,0x31, 0x34,0x30,0x00,0x50,0x31,0x34,0x31,0x00,0x50,0x31,0x34,0x32,0x00,0x50,0x31,0x34, 0x33,0x00,0x50,0x31,0x34,0x34,0x00,0x50,0x31,0x34,0x35,0x00,0x50,0x31,0x34,0x36, 0x00,0x50,0x31,0x34,0x37,0x00,0x50,0x31,0x34,0x38,0x00,0x50,0x31,0x34,0x39,0x00, 0x50,0x31,0x35,0x30,0x00,0x50,0x31,0x35,0x31,0x00,0x50,0x31,0x35,0x32,0x00,0x50, 0x31,0x35,0x33,0x00,0x50,0x31,0x35,0x34,0x00,0x50,0x31,0x35,0x35,0x00,0x50,0x31, 0x35,0x36,0x00,0x50,0x31,0x35,0x37,0x00,0x50,0x31,0x35,0x38,0x00,0x50,0x31,0x35, 0x39,0x00,0x50,0x31,0x36,0x30,0x00,0x50,0x31,0x36,0x31,0x00,0x50,0x31,0x36,0x32, 0x00,0x50,0x31,0x36,0x33,0x00,0x50,0x31,0x36,0x34,0x00,0x50,0x31,0x36,0x35,0x00, 0x50,0x31,0x36,0x36,0x00,0x50,0x31,0x36,0x37,0x00,0x50,0x31,0x36,0x38,0x00,0x50, 0x31,0x36,0x39,0x00,0x50,0x31,0x37,0x30,0x00,0x50,0x31,0x37,0x31,0x00,0x50,0x31, 0x37,0x32,0x00,0x50,0x31,0x37,0x33,0x00,0x50,0x31,0x37,0x34,0x00,0x50,0x31,0x37, 0x35,0x00,0x50,0x31,0x37,0x36,0x00,0x50,0x31,0x37,0x37,0x00,0x50,0x31,0x37,0x38, 0x00,0x50,0x31,0x37,0x39,0x00,0x50,0x31,0x38,0x30,0x00,0x50,0x31,0x38,0x31,0x00, 0x50,0x31,0x38,0x32,0x00,0x50,0x31,0x38,0x33,0x00,0x50,0x31,0x38,0x34,0x00,0x50, 0x31,0x38,0x35,0x00,0x50,0x31,0x38,0x36,0x00,0x50,0x31,0x38,0x37,0x00,0x50,0x31, 0x38,0x38,0x00,0x50,0x31,0x38,0x39,0x00,0x50,0x31,0x39,0x30,0x00,0x50,0x31,0x39, 0x31,0x00,0x50,0x31,0x39,0x32,0x00,0x50,0x31,0x39,0x33,0x00,0x50,0x31,0x39,0x34, 0x00,0x50,0x31,0x39,0x35,0x00,0x50,0x31,0x39,0x36,0x00,0x50,0x31,0x39,0x37,0x00, 0x50,0x31,0x39,0x38,0x00,0x50,0x31,0x39,0x39,0x00,0x50,0x32,0x30,0x30,0x00,0x50, 0x32,0x30,0x31,0x00,0x50,0x32,0x30,0x32,0x00,0x50,0x32,0x30,0x33,0x00,0x50,0x32, 0x30,0x34,0x00,0x50,0x32,0x30,0x35,0x00,0x50,0x32,0x30,0x36,0x00,0x50,0x32,0x30, 0x37,0x00,0x50,0x32,0x30,0x38,0x00,0x50,0x32,0x30,0x39,0x00,0x50,0x32,0x31,0x30, 0x00,0x50,0x32,0x31,0x31,0x00,0x50,0x32,0x31,0x32,0x00,0x50,0x32,0x31,0x33,0x00, 0x50,0x32,0x31,0x34,0x00,0x50,0x32,0x31,0x35,0x00,0x50,0x32,0x31,0x36,0x00,0x50, 0x32,0x31,0x37,0x00,0x50,0x32,0x31,0x38,0x00,0x50,0x32,0x31,0x39,0x00,0x50,0x32, 0x32,0x30,0x00,0x50,0x32,0x32,0x31,0x00,0x50,0x32,0x32,0x32,0x00,0x50,0x32,0x32, 0x33,0x00,0x50,0x32,0x32,0x34,0x00,0x50,0x32,0x32,0x35,0x00,0x50,0x32,0x32,0x36, 0x00,0x50,0x32,0x32,0x37,0x00,0x50,0x32,0x32,0x38,0x00,0x50,0x32,0x32,0x39,0x00, 0x50,0x32,0x33,0x30,0x00,0x50,0x32,0x33,0x31,0x00,0x50,0x32,0x33,0x32,0x00,0x50, 0x32,0x33,0x33,0x00,0x73,0x75,0x72,0x66,0x61,0x63,0x65,0x43,0x6f,0x70,0x79,0x5f, 0x72,0x65,0x61,0x64,0x5f,0x33,0x32,0x78,0x33,0x32,0x5f,0x42,0x42,0x5f,0x30,0x5f, 0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69, 0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x69,0x69, 0x5f,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42, 0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f, 0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f, 0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x31,0x30, 0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f, 0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x31,0x33,0x00,0x42,0x42,0x5f,0x31, 0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x5f,0x31,0x35,0x00,0x42,0x42, 0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x5f,0x31,0x37,0x00, 0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x38,0x5f,0x31, 0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x32,0x30,0x00,0x42,0x42,0x5f,0x32,0x30, 0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x31,0x5f,0x32,0x32,0x00,0x42,0x42,0x5f, 0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42,0x5f,0x32,0x33,0x5f,0x32,0x34,0x00,0x42, 0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00,0x42,0x42,0x5f,0x32,0x35,0x5f,0x32,0x36, 0x00,0x42,0x42,0x5f,0x32,0x36,0x5f,0x32,0x37,0x00,0x42,0x42,0x5f,0x32,0x37,0x5f, 0x32,0x38,0x00,0x42,0x42,0x5f,0x32,0x38,0x5f,0x32,0x39,0x00,0x42,0x42,0x5f,0x32, 0x39,0x5f,0x33,0x30,0x00,0x42,0x42,0x5f,0x33,0x30,0x5f,0x33,0x31,0x00,0x42,0x42, 0x5f,0x33,0x31,0x5f,0x33,0x32,0x00,0x42,0x42,0x5f,0x33,0x32,0x5f,0x33,0x33,0x00, 0x42,0x42,0x5f,0x33,0x33,0x5f,0x33,0x34,0x00,0x42,0x42,0x5f,0x33,0x34,0x5f,0x33, 0x35,0x00,0x42,0x42,0x5f,0x33,0x35,0x5f,0x33,0x36,0x00,0x42,0x42,0x5f,0x33,0x36, 0x5f,0x33,0x37,0x00,0x42,0x42,0x5f,0x33,0x37,0x5f,0x33,0x38,0x00,0x42,0x42,0x5f, 0x33,0x38,0x5f,0x33,0x39,0x00,0x42,0x42,0x5f,0x33,0x39,0x5f,0x34,0x30,0x00,0x42, 0x42,0x5f,0x34,0x30,0x5f,0x34,0x31,0x00,0x42,0x42,0x5f,0x34,0x31,0x5f,0x34,0x32, 0x00,0x42,0x42,0x5f,0x34,0x32,0x5f,0x34,0x33,0x00,0x42,0x42,0x5f,0x34,0x33,0x5f, 0x34,0x34,0x00,0x42,0x42,0x5f,0x34,0x34,0x5f,0x34,0x35,0x00,0x42,0x42,0x5f,0x34, 0x35,0x5f,0x34,0x36,0x00,0x42,0x42,0x5f,0x34,0x36,0x5f,0x34,0x37,0x00,0x42,0x42, 0x5f,0x34,0x37,0x5f,0x34,0x38,0x00,0x42,0x42,0x5f,0x34,0x38,0x5f,0x34,0x39,0x00, 0x42,0x42,0x5f,0x34,0x39,0x5f,0x35,0x30,0x00,0x42,0x42,0x5f,0x35,0x30,0x5f,0x35, 0x31,0x00,0x42,0x42,0x5f,0x35,0x31,0x5f,0x35,0x32,0x00,0x42,0x42,0x5f,0x35,0x32, 0x5f,0x35,0x33,0x00,0x42,0x42,0x5f,0x35,0x33,0x5f,0x35,0x34,0x00,0x42,0x42,0x5f, 0x35,0x34,0x5f,0x35,0x35,0x00,0x42,0x42,0x5f,0x35,0x35,0x5f,0x35,0x36,0x00,0x42, 0x42,0x5f,0x35,0x36,0x5f,0x35,0x37,0x00,0x42,0x42,0x5f,0x35,0x37,0x5f,0x35,0x38, 0x00,0x42,0x42,0x5f,0x35,0x38,0x5f,0x35,0x39,0x00,0x42,0x42,0x5f,0x35,0x39,0x5f, 0x36,0x30,0x00,0x42,0x42,0x5f,0x36,0x30,0x5f,0x36,0x31,0x00,0x42,0x42,0x5f,0x36, 0x31,0x5f,0x36,0x32,0x00,0x42,0x42,0x5f,0x36,0x32,0x5f,0x36,0x33,0x00,0x42,0x42, 0x5f,0x36,0x33,0x5f,0x36,0x34,0x00,0x42,0x42,0x5f,0x36,0x34,0x5f,0x36,0x35,0x00, 0x42,0x42,0x5f,0x36,0x35,0x5f,0x36,0x36,0x00,0x42,0x42,0x5f,0x36,0x36,0x5f,0x36, 0x37,0x00,0x42,0x42,0x5f,0x36,0x37,0x5f,0x36,0x38,0x00,0x42,0x42,0x5f,0x36,0x38, 0x5f,0x36,0x39,0x00,0x42,0x42,0x5f,0x36,0x39,0x5f,0x37,0x30,0x00,0x42,0x42,0x5f, 0x37,0x30,0x5f,0x37,0x31,0x00,0x42,0x42,0x5f,0x37,0x31,0x5f,0x37,0x32,0x00,0x42, 0x42,0x5f,0x37,0x32,0x5f,0x37,0x33,0x00,0x42,0x42,0x5f,0x37,0x33,0x5f,0x37,0x34, 0x00,0x42,0x42,0x5f,0x37,0x34,0x5f,0x37,0x35,0x00,0x42,0x42,0x5f,0x37,0x35,0x5f, 0x37,0x36,0x00,0x42,0x42,0x5f,0x37,0x36,0x5f,0x37,0x37,0x00,0x42,0x42,0x5f,0x37, 0x37,0x5f,0x37,0x38,0x00,0x42,0x42,0x5f,0x37,0x38,0x5f,0x37,0x39,0x00,0x42,0x42, 0x5f,0x37,0x39,0x5f,0x38,0x30,0x00,0x42,0x42,0x5f,0x38,0x30,0x5f,0x38,0x31,0x00, 0x42,0x42,0x5f,0x38,0x31,0x5f,0x38,0x32,0x00,0x42,0x42,0x5f,0x38,0x32,0x5f,0x38, 0x33,0x00,0x42,0x42,0x5f,0x38,0x33,0x5f,0x38,0x34,0x00,0x42,0x42,0x5f,0x38,0x34, 0x5f,0x38,0x35,0x00,0x42,0x42,0x5f,0x38,0x35,0x5f,0x38,0x36,0x00,0x42,0x42,0x5f, 0x38,0x36,0x5f,0x38,0x37,0x00,0x42,0x42,0x5f,0x38,0x37,0x5f,0x38,0x38,0x00,0x42, 0x42,0x5f,0x38,0x38,0x5f,0x38,0x39,0x00,0x42,0x42,0x5f,0x38,0x39,0x5f,0x39,0x30, 0x00,0x42,0x42,0x5f,0x39,0x30,0x5f,0x39,0x31,0x00,0x42,0x42,0x5f,0x39,0x31,0x5f, 0x39,0x32,0x00,0x42,0x42,0x5f,0x39,0x32,0x5f,0x39,0x33,0x00,0x42,0x42,0x5f,0x39, 0x33,0x5f,0x39,0x34,0x00,0x42,0x42,0x5f,0x39,0x34,0x5f,0x39,0x35,0x00,0x42,0x42, 0x5f,0x39,0x35,0x5f,0x39,0x36,0x00,0x42,0x42,0x5f,0x39,0x36,0x5f,0x39,0x37,0x00, 0x42,0x42,0x5f,0x39,0x37,0x5f,0x39,0x38,0x00,0x42,0x42,0x5f,0x39,0x38,0x5f,0x39, 0x39,0x00,0x42,0x42,0x5f,0x39,0x39,0x5f,0x31,0x30,0x30,0x00,0x42,0x42,0x5f,0x31, 0x30,0x30,0x5f,0x31,0x30,0x31,0x00,0x42,0x42,0x5f,0x31,0x30,0x31,0x5f,0x31,0x30, 0x32,0x00,0x42,0x42,0x5f,0x31,0x30,0x32,0x5f,0x31,0x30,0x33,0x00,0x42,0x42,0x5f, 0x31,0x30,0x33,0x5f,0x31,0x30,0x34,0x00,0x42,0x42,0x5f,0x31,0x30,0x34,0x5f,0x31, 0x30,0x35,0x00,0x42,0x42,0x5f,0x31,0x30,0x35,0x5f,0x31,0x30,0x36,0x00,0x42,0x42, 0x5f,0x31,0x30,0x36,0x5f,0x31,0x30,0x37,0x00,0x42,0x42,0x5f,0x31,0x30,0x37,0x5f, 0x31,0x30,0x38,0x00,0x42,0x42,0x5f,0x31,0x30,0x38,0x5f,0x31,0x30,0x39,0x00,0x42, 0x42,0x5f,0x31,0x30,0x39,0x5f,0x31,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x31,0x30, 0x5f,0x31,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x31,0x5f,0x31,0x31,0x32,0x00, 0x42,0x42,0x5f,0x31,0x31,0x32,0x5f,0x31,0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x31, 0x33,0x5f,0x31,0x31,0x34,0x00,0x42,0x42,0x5f,0x31,0x31,0x34,0x5f,0x31,0x31,0x35, 0x00,0x42,0x42,0x5f,0x31,0x31,0x35,0x5f,0x31,0x31,0x36,0x00,0x42,0x42,0x5f,0x31, 0x31,0x36,0x5f,0x31,0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x31,0x37,0x5f,0x31,0x31, 0x38,0x00,0x42,0x42,0x5f,0x31,0x31,0x38,0x5f,0x31,0x31,0x39,0x00,0x42,0x42,0x5f, 0x31,0x31,0x39,0x5f,0x31,0x32,0x30,0x00,0x42,0x42,0x5f,0x31,0x32,0x30,0x5f,0x31, 0x32,0x31,0x00,0x42,0x42,0x5f,0x31,0x32,0x31,0x5f,0x31,0x32,0x32,0x00,0x42,0x42, 0x5f,0x31,0x32,0x32,0x5f,0x31,0x32,0x33,0x00,0x42,0x42,0x5f,0x31,0x32,0x33,0x5f, 0x31,0x32,0x34,0x00,0x42,0x42,0x5f,0x31,0x32,0x34,0x5f,0x31,0x32,0x35,0x00,0x42, 0x42,0x5f,0x31,0x32,0x35,0x5f,0x31,0x32,0x36,0x00,0x42,0x42,0x5f,0x31,0x32,0x36, 0x5f,0x31,0x32,0x37,0x00,0x42,0x42,0x5f,0x31,0x32,0x37,0x5f,0x31,0x32,0x38,0x00, 0x42,0x42,0x5f,0x31,0x32,0x38,0x5f,0x31,0x32,0x39,0x00,0x42,0x42,0x5f,0x31,0x32, 0x39,0x5f,0x31,0x33,0x30,0x00,0x42,0x42,0x5f,0x31,0x33,0x30,0x5f,0x31,0x33,0x31, 0x00,0x42,0x42,0x5f,0x31,0x33,0x31,0x5f,0x31,0x33,0x32,0x00,0x42,0x42,0x5f,0x31, 0x33,0x32,0x5f,0x31,0x33,0x33,0x00,0x42,0x42,0x5f,0x31,0x33,0x33,0x5f,0x31,0x33, 0x34,0x00,0x42,0x42,0x5f,0x31,0x33,0x34,0x5f,0x31,0x33,0x35,0x00,0x42,0x42,0x5f, 0x31,0x33,0x35,0x5f,0x31,0x33,0x36,0x00,0x42,0x42,0x5f,0x31,0x33,0x36,0x5f,0x31, 0x33,0x37,0x00,0x42,0x42,0x5f,0x31,0x33,0x37,0x5f,0x31,0x33,0x38,0x00,0x42,0x42, 0x5f,0x31,0x33,0x38,0x5f,0x31,0x33,0x39,0x00,0x42,0x42,0x5f,0x31,0x33,0x39,0x5f, 0x31,0x34,0x30,0x00,0x42,0x42,0x5f,0x31,0x34,0x30,0x5f,0x31,0x34,0x31,0x00,0x42, 0x42,0x5f,0x31,0x34,0x31,0x5f,0x31,0x34,0x32,0x00,0x42,0x42,0x5f,0x31,0x34,0x32, 0x5f,0x31,0x34,0x33,0x00,0x42,0x42,0x5f,0x31,0x34,0x33,0x5f,0x31,0x34,0x34,0x00, 0x42,0x42,0x5f,0x31,0x34,0x34,0x5f,0x31,0x34,0x35,0x00,0x42,0x42,0x5f,0x31,0x34, 0x35,0x5f,0x31,0x34,0x36,0x00,0x42,0x42,0x5f,0x31,0x34,0x36,0x5f,0x31,0x34,0x37, 0x00,0x42,0x42,0x5f,0x31,0x34,0x37,0x5f,0x31,0x34,0x38,0x00,0x42,0x42,0x5f,0x31, 0x34,0x38,0x5f,0x31,0x34,0x39,0x00,0x42,0x42,0x5f,0x31,0x34,0x39,0x5f,0x31,0x35, 0x30,0x00,0x42,0x42,0x5f,0x31,0x35,0x30,0x5f,0x31,0x35,0x31,0x00,0x42,0x42,0x5f, 0x31,0x35,0x31,0x5f,0x31,0x35,0x32,0x00,0x42,0x42,0x5f,0x31,0x35,0x32,0x5f,0x31, 0x35,0x33,0x00,0x42,0x42,0x5f,0x31,0x35,0x33,0x5f,0x31,0x35,0x34,0x00,0x42,0x42, 0x5f,0x31,0x35,0x34,0x5f,0x31,0x35,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x35,0x5f, 0x31,0x35,0x36,0x00,0x42,0x42,0x5f,0x31,0x35,0x36,0x5f,0x31,0x35,0x37,0x00,0x42, 0x42,0x5f,0x31,0x35,0x37,0x5f,0x31,0x35,0x38,0x00,0x42,0x42,0x5f,0x31,0x35,0x38, 0x5f,0x31,0x35,0x39,0x00,0x42,0x42,0x5f,0x31,0x35,0x39,0x5f,0x31,0x36,0x30,0x00, 0x42,0x42,0x5f,0x31,0x36,0x30,0x5f,0x31,0x36,0x31,0x00,0x42,0x42,0x5f,0x31,0x36, 0x31,0x5f,0x31,0x36,0x32,0x00,0x42,0x42,0x5f,0x31,0x36,0x32,0x5f,0x31,0x36,0x33, 0x00,0x42,0x42,0x5f,0x31,0x36,0x33,0x5f,0x31,0x36,0x34,0x00,0x42,0x42,0x5f,0x31, 0x36,0x34,0x5f,0x31,0x36,0x35,0x00,0x42,0x42,0x5f,0x31,0x36,0x35,0x5f,0x31,0x36, 0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x36,0x5f,0x31,0x36,0x37,0x00,0x42,0x42,0x5f, 0x31,0x36,0x37,0x5f,0x31,0x36,0x38,0x00,0x42,0x42,0x5f,0x31,0x36,0x38,0x5f,0x31, 0x36,0x39,0x00,0x42,0x42,0x5f,0x31,0x36,0x39,0x5f,0x31,0x37,0x30,0x00,0x42,0x42, 0x5f,0x31,0x37,0x30,0x5f,0x31,0x37,0x31,0x00,0x42,0x42,0x5f,0x31,0x37,0x31,0x5f, 0x31,0x37,0x32,0x00,0x42,0x42,0x5f,0x31,0x37,0x32,0x5f,0x31,0x37,0x33,0x00,0x42, 0x42,0x5f,0x31,0x37,0x33,0x5f,0x31,0x37,0x34,0x00,0x42,0x42,0x5f,0x31,0x37,0x34, 0x5f,0x31,0x37,0x35,0x00,0x42,0x42,0x5f,0x31,0x37,0x35,0x5f,0x31,0x37,0x36,0x00, 0x42,0x42,0x5f,0x31,0x37,0x36,0x5f,0x31,0x37,0x37,0x00,0x42,0x42,0x5f,0x31,0x37, 0x37,0x5f,0x31,0x37,0x38,0x00,0x42,0x42,0x5f,0x31,0x37,0x38,0x5f,0x31,0x37,0x39, 0x00,0x42,0x42,0x5f,0x31,0x37,0x39,0x5f,0x31,0x38,0x30,0x00,0x42,0x42,0x5f,0x31, 0x38,0x30,0x5f,0x31,0x38,0x31,0x00,0x42,0x42,0x5f,0x31,0x38,0x31,0x5f,0x31,0x38, 0x32,0x00,0x42,0x42,0x5f,0x31,0x38,0x32,0x5f,0x31,0x38,0x33,0x00,0x42,0x42,0x5f, 0x31,0x38,0x33,0x5f,0x31,0x38,0x34,0x00,0x42,0x42,0x5f,0x31,0x38,0x34,0x5f,0x31, 0x38,0x35,0x00,0x42,0x42,0x5f,0x31,0x38,0x35,0x5f,0x31,0x38,0x36,0x00,0x42,0x42, 0x5f,0x31,0x38,0x36,0x5f,0x31,0x38,0x37,0x00,0x42,0x42,0x5f,0x31,0x38,0x37,0x5f, 0x31,0x38,0x38,0x00,0x42,0x42,0x5f,0x31,0x38,0x38,0x5f,0x31,0x38,0x39,0x00,0x42, 0x42,0x5f,0x31,0x38,0x39,0x5f,0x31,0x39,0x30,0x00,0x42,0x42,0x5f,0x31,0x39,0x30, 0x5f,0x31,0x39,0x31,0x00,0x42,0x42,0x5f,0x31,0x39,0x31,0x5f,0x31,0x39,0x32,0x00, 0x42,0x42,0x5f,0x31,0x39,0x32,0x5f,0x31,0x39,0x33,0x00,0x42,0x42,0x5f,0x31,0x39, 0x33,0x5f,0x31,0x39,0x34,0x00,0x42,0x42,0x5f,0x31,0x39,0x34,0x5f,0x31,0x39,0x35, 0x00,0x42,0x42,0x5f,0x31,0x39,0x35,0x5f,0x31,0x39,0x36,0x00,0x42,0x42,0x5f,0x31, 0x39,0x36,0x5f,0x31,0x39,0x37,0x00,0x42,0x42,0x5f,0x31,0x39,0x37,0x5f,0x31,0x39, 0x38,0x00,0x42,0x42,0x5f,0x31,0x39,0x38,0x5f,0x31,0x39,0x39,0x00,0x42,0x42,0x5f, 0x31,0x39,0x39,0x5f,0x32,0x30,0x30,0x00,0x42,0x42,0x5f,0x32,0x30,0x30,0x5f,0x32, 0x30,0x31,0x00,0x42,0x42,0x5f,0x32,0x30,0x31,0x5f,0x32,0x30,0x32,0x00,0x54,0x30, 0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00, 0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74, 0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x51,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x51,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x02,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x51,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x03, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x03,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x03,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x04, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x04,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x04,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x04,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x04,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x04,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x04,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x04,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x04, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x04,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x04, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x04,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x04,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x04,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x04,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x04,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x04,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x04,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x05,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x05,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x05,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x05,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x05,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x05,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x05, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x05,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x51,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x05,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x05, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x05, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x05,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x05,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x05,0x00,0x00,0x51,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x05, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x05,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x05,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x05,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x05, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x05,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x05,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x05,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x05,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x06,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x06,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x06,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x06,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x06, 0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x06,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x06,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x06,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x06,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x06,0x00, 0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x06,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x06, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x06,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x06,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x06, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x06,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x06,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x06,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x06,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x06,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x06,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x07,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x07,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x07,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x07,0x00, 0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x07,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x07,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x07,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x07, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x07,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x07,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x07,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x07,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x07,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x07,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x07, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x07,0x00, 0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x07,0x00,0x00, 0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x07,0x00,0x00,0x51, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x07,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x07,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x07,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x07, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x07,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x07,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x08,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x08,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x08,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x08,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x08,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x08,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x08, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x08,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x08,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x20,0x01,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x08,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x08,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x08,0x00,0x00,0x20,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x08,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x08,0x00,0x00,0x23,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x08, 0x00,0x00,0x12,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x08,0x00, 0x00,0x23,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x08,0x00,0x00, 0x12,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x08,0x00,0x00,0x20, 0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x08,0x00,0x00,0x21,0x01, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x08,0x00,0x00,0x20,0x01,0x00, 0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x08,0x00,0x00,0x20,0x01,0x00,0x56, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x08,0x00,0x00,0x20,0x01,0x00,0x58,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x08,0x00,0x00,0x20,0x01,0x00,0x5a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x20,0x01,0x00,0x5c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x08,0x00,0x00,0x20,0x01,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x08,0x00,0x00,0x20,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x08,0x00,0x00,0x20,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x08,0x00,0x00,0x20,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x08,0x00,0x00,0x50,0x08,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x08,0x00,0x00,0x20,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x08, 0x00,0x00,0x20,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x08,0x00, 0x00,0x20,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x00,0x00, 0x20,0x01,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x00,0x20, 0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x08,0x00,0x00,0x20,0x01, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x08,0x00,0x00,0x20,0x01,0x00, 0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x08,0x00,0x00,0x20,0x01,0x00,0x76, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x00,0x00,0x20,0x01,0x00,0x78,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x08,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x08,0x00,0x00,0x50,0x08,0x00,0x7c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x08,0x00,0x00,0x20,0x01,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x20,0x01,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x08,0x00,0x00,0x20,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x08,0x00,0x00,0x20,0x01,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x08,0x00,0x00,0x20,0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x08,0x00,0x00,0x21,0x01,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x08, 0x00,0x00,0x20,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x08,0x00, 0x00,0x20,0x01,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x08,0x00,0x00, 0x20,0x01,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x08,0x00,0x00,0x20, 0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x08,0x00,0x00,0x20,0x01, 0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x08,0x00,0x00,0x20,0x01,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x08,0x00,0x00,0x20,0x01,0x00,0x92, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x08,0x00,0x00,0x20,0x01,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x08,0x00,0x00,0x20,0x01,0x00,0x97,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x08,0x00,0x00,0x20,0x01,0x00,0x99,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x08,0x00,0x00,0x20,0x01,0x00,0x9b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x20,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x20,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x08,0x00,0x00,0x20,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x08,0x00,0x00,0x20,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x08,0x00,0x00,0x50,0x08,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x08, 0x00,0x00,0x20,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x08,0x00, 0x00,0x20,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x08,0x00,0x00, 0x20,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x08,0x00,0x00,0x20, 0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x08,0x00,0x00,0x20,0x01, 0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x08,0x00,0x00,0x20,0x01,0x00, 0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x08,0x00,0x00,0x20,0x01,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x08,0x00,0x00,0x21,0x01,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x08,0x00,0x00,0x20,0x01,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x08,0x00,0x00,0x20,0x01,0x00,0xb5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x08,0x00,0x00,0x20,0x01,0x00,0xb7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x08,0x00,0x00,0x20,0x01,0x00,0xb9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x08,0x00,0x00,0x20,0x01,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x08,0x00,0x00,0x20,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x08,0x00,0x00,0x20,0x01,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x08,0x00,0x00,0x20,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x08, 0x00,0x00,0x20,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x08,0x00, 0x00,0x20,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x08,0x00,0x00, 0x20,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x08,0x00,0x00,0x20, 0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x08,0x00,0x00,0x20,0x01, 0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x08,0x00,0x00,0x50,0x08,0x00, 0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x08,0x00,0x00,0x20,0x01,0x00,0xd0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x08,0x00,0x00,0x20,0x01,0x00,0xd2,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x08,0x00,0x00,0x20,0x01,0x00,0xd4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x08,0x00,0x00,0x20,0x01,0x00,0xd6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x08,0x00,0x00,0x20,0x01,0x00,0xd8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x08,0x00,0x00,0x20,0x01,0x00,0xd9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x08,0x00,0x00,0x21,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x08,0x00,0x00,0x20,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x08,0x00,0x00,0x20,0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x08,0x00,0x00,0x20,0x01,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x08, 0x00,0x00,0x20,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x08,0x00, 0x00,0x20,0x01,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x08,0x00,0x00, 0x20,0x01,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x00,0x00,0x20, 0x01,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x08,0x00,0x00,0x50,0x08, 0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x08,0x00,0x00,0x20,0x01,0x00, 0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x08,0x00,0x00,0x20,0x01,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x08,0x00,0x00,0x20,0x01,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x08,0x00,0x00,0x20,0x01,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x08,0x00,0x00,0x20,0x01,0x00,0xf3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x08,0x00,0x00,0x50,0x08,0x00,0xf4,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x08,0x00,0x00,0x20,0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x08,0x00,0x00,0x20,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x08,0x00,0x00,0x20,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x08,0x00,0x00,0x20,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x08, 0x00,0x00,0x50,0x08,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x08,0x00, 0x00,0x21,0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x08,0x00,0x00, 0x20,0x01,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x08,0x00,0x00,0x20, 0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x08,0x00,0x00,0x20,0x01, 0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x08,0x00,0x00,0x50,0x08,0x00, 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x08,0x00,0x00,0x20,0x01,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x08,0x00,0x00,0x12,0x01,0x00,0x07,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x08,0x00,0x00,0x21,0x01,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x08,0x00,0x00,0x20,0x01,0x00,0x0b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x08,0x00,0x00,0x20,0x01,0x00,0x0c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x08,0x00,0x00,0x20,0x01,0x00,0x0e,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x08,0x00,0x00,0x20,0x01,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x08,0x00,0x00,0x20,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x08,0x00,0x00,0x20,0x01,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x08,0x00,0x00,0x50,0x08,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x08, 0x00,0x00,0x20,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x08,0x00, 0x00,0x20,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x08,0x00,0x00, 0x20,0x01,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x08,0x00,0x00,0x20, 0x01,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x08,0x00,0x00,0x20,0x01, 0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x08,0x00,0x00,0x50,0x08,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x08,0x00,0x00,0x20,0x01,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x08,0x00,0x00,0x20,0x01,0x00,0x23,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x08,0x00,0x00,0x20,0x01,0x00,0x25,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x08,0x00,0x00,0x20,0x01,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x08,0x00,0x00,0x20,0x01,0x00,0x28,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x08,0x00,0x00,0x21,0x01,0x00,0x29,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x08,0x00,0x00,0x20,0x01,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x08,0x00,0x00,0x20,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x08,0x00,0x00,0x20,0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x08,0x00,0x00,0x20,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x08, 0x00,0x00,0x20,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x08,0x00, 0x00,0x20,0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x08,0x00,0x00, 0x20,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x08,0x00,0x00,0x20, 0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x08,0x00,0x00,0x50,0x08, 0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x08,0x00,0x00,0x20,0x01,0x00, 0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x08,0x00,0x00,0x20,0x01,0x00,0x3d, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x08,0x00,0x00,0x20,0x01,0x00,0x3f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x08,0x00,0x00,0x20,0x01,0x00,0x41,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x08,0x00,0x00,0x20,0x01,0x00,0x43,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x08,0x00,0x00,0x20,0x01,0x00,0x45,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x08,0x00,0x00,0x20,0x01,0x00,0x46,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x08,0x00,0x00,0x21,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x08,0x00,0x00,0x20,0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x08,0x00,0x00,0x20,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x08,0x00,0x00,0x20,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x08, 0x00,0x00,0x20,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x08,0x00, 0x00,0x20,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x08,0x00,0x00, 0x20,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x08,0x00,0x00,0x20, 0x01,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x08,0x00,0x00,0x50,0x08, 0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x20,0x01,0x00, 0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x08,0x00,0x00,0x20,0x01,0x00,0x59, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x08,0x00,0x00,0x20,0x01,0x00,0x5b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x08,0x00,0x00,0x20,0x01,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x08,0x00,0x00,0x20,0x01,0x00,0x5f,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x08,0x00,0x00,0x20,0x01,0x00,0x60,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x08,0x00,0x00,0x21,0x01,0x00,0x61,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x08,0x00,0x00,0x20,0x01,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x08,0x00,0x00,0x20,0x01,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x08,0x00,0x00,0x20,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x08,0x00,0x00,0x20,0x01,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x08, 0x00,0x00,0x50,0x08,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x08,0x00, 0x00,0x20,0x01,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x08,0x00,0x00, 0x20,0x01,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x08,0x00,0x00,0x20, 0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x08,0x00,0x00,0x20,0x01, 0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x08,0x00,0x00,0x50,0x08,0x00, 0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x08,0x00,0x00,0x20,0x01,0x00,0x72, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x08,0x00,0x00,0x20,0x01,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x08,0x00,0x00,0x20,0x01,0x00,0x74,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x08,0x00,0x00,0x20,0x01,0x00,0x75,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x08,0x00,0x00,0x50,0x08,0x00,0x76,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x08,0x00,0x00,0x21,0x01,0x00,0x77,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x08,0x00,0x00,0x20,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x08,0x00,0x00,0x20,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x08,0x00,0x00,0x50,0x08,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x08,0x00,0x00,0x20,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x08, 0x00,0x00,0x12,0x01,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x08,0x00, 0x00,0x50,0x08,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x08,0x00,0x00, 0x20,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x08,0x00,0x00,0x20, 0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x08,0x00,0x00,0x20,0x01, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x08,0x00,0x00,0x20,0x01,0x00, 0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x08,0x00,0x00,0x20,0x01,0x00,0x8a, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x08,0x00,0x00,0x50,0x08,0x00,0x8b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x08,0x00,0x00,0x20,0x01,0x00,0x8d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x08,0x00,0x00,0x20,0x01,0x00,0x8f,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x08,0x00,0x00,0x20,0x01,0x00,0x91,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x08,0x00,0x00,0x20,0x01,0x00,0x93,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x08,0x00,0x00,0x20,0x01,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x08,0x00,0x00,0x20,0x01,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x08,0x00,0x00,0x20,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x08,0x00,0x00,0x50,0x08,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x08, 0x00,0x00,0x20,0x01,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x08,0x00, 0x00,0x20,0x01,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x08,0x00,0x00, 0x20,0x01,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x08,0x00,0x00,0x20, 0x01,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x08,0x00,0x00,0x20,0x01, 0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x08,0x00,0x00,0x20,0x01,0x00, 0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x08,0x00,0x00,0x50,0x08,0x00,0xa5, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x20,0x01,0x00,0xa7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x08,0x00,0x00,0x20,0x01,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x08,0x00,0x00,0x20,0x01,0x00,0xaa,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x08,0x00,0x00,0x50,0x08,0x00,0xab,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x50,0x08,0x00,0xac,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x08,0x00,0x00,0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x08,0x00,0x00,0x12,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x08,0x00,0x00,0x21,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x08,0x00,0x00,0x20,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x08, 0x00,0x00,0x20,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x08,0x00, 0x00,0x20,0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x08,0x00,0x00, 0x20,0x01,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x00,0x00,0x20, 0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x08,0x00,0x00,0x20,0x01, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x08,0x00,0x00,0x50,0x08,0x00, 0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x08,0x00,0x00,0x20,0x01,0x00,0xbf, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x08,0x00,0x00,0x20,0x01,0x00,0xc1,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x08,0x00,0x00,0x20,0x01,0x00,0xc3,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x08,0x00,0x00,0x20,0x01,0x00,0xc4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x08,0x00,0x00,0x20,0x01,0x00,0xc6,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x50,0x08,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x09,0x00,0x00,0x20,0x01,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x09,0x00,0x00,0x20,0x01,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x09,0x00,0x00,0x20,0x01,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x09,0x00,0x00,0x20,0x01,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09, 0x00,0x00,0x20,0x01,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x09,0x00, 0x00,0x21,0x01,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x09,0x00,0x00, 0x20,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x00,0x00,0x20, 0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x00,0x00,0x20,0x01, 0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x20,0x01,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09,0x00,0x00,0x20,0x01,0x00,0xd9, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x09,0x00,0x00,0x20,0x01,0x00,0xdb,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x00,0x20,0x01,0x00,0xdd,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x00,0x00,0x20,0x01,0x00,0xe0,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x09,0x00,0x00,0x50,0x08,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x09,0x00,0x00,0x20,0x01,0x00,0xe3,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x09,0x00,0x00,0x20,0x01,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x09,0x00,0x00,0x20,0x01,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x09,0x00,0x00,0x20,0x01,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x09,0x00,0x00,0x20,0x01,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x09, 0x00,0x00,0x20,0x01,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09,0x00, 0x00,0x20,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x09,0x00,0x00, 0x21,0x01,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x09,0x00,0x00,0x20, 0x01,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x09,0x00,0x00,0x20,0x01, 0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x00,0x00,0x20,0x01,0x00, 0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x09,0x00,0x00,0x20,0x01,0x00,0xf5, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x09,0x00,0x00,0x20,0x01,0x00,0xf7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x09,0x00,0x00,0x20,0x01,0x00,0xf9,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x09,0x00,0x00,0x20,0x01,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x09,0x00,0x00,0x50,0x08,0x00,0xfd,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x20,0x01,0x00,0xff,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x09,0x00,0x00,0x20,0x01,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x09,0x00,0x00,0x20,0x01,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x09,0x00,0x00,0x20,0x01,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x09,0x00,0x00,0x20,0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x09, 0x00,0x00,0x20,0x01,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x09,0x00, 0x00,0x21,0x01,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x09,0x00,0x00, 0x20,0x01,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00,0x20, 0x01,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x09,0x00,0x00,0x20,0x01, 0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x09,0x00,0x00,0x20,0x01,0x00, 0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x09,0x00,0x00,0x50,0x08,0x00,0x11, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x09,0x00,0x00,0x20,0x01,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x09,0x00,0x00,0x20,0x01,0x00,0x15,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x09,0x00,0x00,0x20,0x01,0x00,0x16,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x09,0x00,0x00,0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x09,0x00,0x00,0x50,0x08,0x00,0x18,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x09,0x00,0x00,0x20,0x01,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x09,0x00,0x00,0x20,0x01,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x09,0x00,0x00,0x20,0x01,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x09,0x00,0x00,0x20,0x01,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x09, 0x00,0x00,0x50,0x08,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x09,0x00, 0x00,0x21,0x01,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x09,0x00,0x00, 0x20,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x09,0x00,0x00,0x20, 0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x09,0x00,0x00,0x50,0x08, 0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x09,0x00,0x00,0x20,0x01,0x00, 0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x09,0x00,0x00,0x20,0x01,0x00,0x2d, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x09,0x00,0x00,0x20,0x01,0x00,0x2e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x09,0x00,0x00,0x20,0x01,0x00,0x30,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x09,0x00,0x00,0x20,0x01,0x00,0x32,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x09,0x00,0x00,0x20,0x01,0x00,0x34,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x20,0x01,0x00,0x37,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x09,0x00,0x00,0x20,0x01,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x09,0x00,0x00,0x20,0x01,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x09,0x00,0x00,0x20,0x01,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x09,0x00,0x00,0x20,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x09, 0x00,0x00,0x20,0x01,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x09,0x00, 0x00,0x20,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x09,0x00,0x00, 0x20,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x09,0x00,0x00,0x20, 0x01,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x09,0x00,0x00,0x20,0x01, 0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x09,0x00,0x00,0x20,0x01,0x00, 0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x09,0x00,0x00,0x20,0x01,0x00,0x4c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x09,0x00,0x00,0x20,0x01,0x00,0x4e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x09,0x00,0x00,0x20,0x01,0x00,0x51,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x09,0x00,0x00,0x20,0x01,0x00,0x52,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x09,0x00,0x00,0x20,0x01,0x00,0x54,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x09,0x00,0x00,0x20,0x01,0x00,0x57,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x09,0x00,0x00,0x20,0x01,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x09,0x00,0x00,0x20,0x01,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x09,0x00,0x00,0x20,0x01,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x09,0x00,0x00,0x23,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x09, 0x00,0x00,0x12,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x09,0x00, 0x00,0x23,0x02,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x09,0x00,0x00, 0x12,0x01,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x09,0x00,0x00,0x20, 0x01,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x09,0x00,0x00,0x21,0x01, 0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x09,0x00,0x00,0x20,0x01,0x00, 0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x09,0x00,0x00,0x20,0x01,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x09,0x00,0x00,0x20,0x01,0x00,0x6e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x09,0x00,0x00,0x20,0x01,0x00,0x70,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x20,0x01,0x00,0x72,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x09,0x00,0x00,0x20,0x01,0x00,0x75,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x09,0x00,0x00,0x20,0x01,0x00,0x77,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x09,0x00,0x00,0x20,0x01,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x09,0x00,0x00,0x20,0x01,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x09,0x00,0x00,0x50,0x08,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x09,0x00,0x00,0x20,0x01,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x09, 0x00,0x00,0x20,0x01,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x09,0x00, 0x00,0x20,0x01,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x09,0x00,0x00, 0x20,0x01,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x09,0x00,0x00,0x20, 0x01,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x09,0x00,0x00,0x20,0x01, 0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x09,0x00,0x00,0x20,0x01,0x00, 0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x09,0x00,0x00,0x20,0x01,0x00,0x8c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x09,0x00,0x00,0x20,0x01,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x09,0x00,0x00,0x20,0x01,0x00,0x91,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x09,0x00,0x00,0x50,0x08,0x00,0x92,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x09,0x00,0x00,0x20,0x01,0x00,0x94,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x09,0x00,0x00,0x20,0x01,0x00,0x96,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x09,0x00,0x00,0x20,0x01,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x09,0x00,0x00,0x20,0x01,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x09,0x00,0x00,0x20,0x01,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x09,0x00,0x00,0x21,0x01,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x09, 0x00,0x00,0x20,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x09,0x00, 0x00,0x20,0x01,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x09,0x00,0x00, 0x20,0x01,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x09,0x00,0x00,0x20, 0x01,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x09,0x00,0x00,0x20,0x01, 0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x09,0x00,0x00,0x20,0x01,0x00, 0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x09,0x00,0x00,0x20,0x01,0x00,0xa8, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x09,0x00,0x00,0x20,0x01,0x00,0xaa,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x09,0x00,0x00,0x20,0x01,0x00,0xad,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x09,0x00,0x00,0x20,0x01,0x00,0xaf,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x09,0x00,0x00,0x20,0x01,0x00,0xb1,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x20,0x01,0x00,0xb3,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x09,0x00,0x00,0x20,0x01,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x09,0x00,0x00,0x20,0x01,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x09,0x00,0x00,0x20,0x01,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x09,0x00,0x00,0x50,0x08,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x09, 0x00,0x00,0x20,0x01,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x09,0x00, 0x00,0x20,0x01,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x09,0x00,0x00, 0x20,0x01,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x09,0x00,0x00,0x20, 0x01,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x09,0x00,0x00,0x20,0x01, 0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x09,0x00,0x00,0x20,0x01,0x00, 0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x09,0x00,0x00,0x20,0x01,0x00,0xc8, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x09,0x00,0x00,0x21,0x01,0x00,0xc9,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x20,0x01,0x00,0xca,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x09,0x00,0x00,0x20,0x01,0x00,0xcb,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x09,0x00,0x00,0x20,0x01,0x00,0xcd,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x09,0x00,0x00,0x20,0x01,0x00,0xcf,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x09,0x00,0x00,0x20,0x01,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x09,0x00,0x00,0x20,0x01,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x09,0x00,0x00,0x20,0x01,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x09,0x00,0x00,0x20,0x01,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x09, 0x00,0x00,0x20,0x01,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x09,0x00, 0x00,0x20,0x01,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x09,0x00,0x00, 0x20,0x01,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x09,0x00,0x00,0x20, 0x01,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x09,0x00,0x00,0x20,0x01, 0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x09,0x00,0x00,0x50,0x08,0x00, 0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x09,0x00,0x00,0x20,0x01,0x00,0xe6, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x09,0x00,0x00,0x20,0x01,0x00,0xe8,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x09,0x00,0x00,0x20,0x01,0x00,0xea,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x09,0x00,0x00,0x20,0x01,0x00,0xec,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x09,0x00,0x00,0x20,0x01,0x00,0xee,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x09,0x00,0x00,0x20,0x01,0x00,0xef,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x09,0x00,0x00,0x21,0x01,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x09,0x00,0x00,0x20,0x01,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x09,0x00,0x00,0x20,0x01,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x09,0x00,0x00,0x20,0x01,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x09, 0x00,0x00,0x20,0x01,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x09,0x00, 0x00,0x20,0x01,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x09,0x00,0x00, 0x20,0x01,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x09,0x00,0x00,0x20, 0x01,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x09,0x00,0x00,0x50,0x08, 0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x09,0x00,0x00,0x20,0x01,0x00, 0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x09,0x00,0x00,0x20,0x01,0x00,0x03, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x09,0x00,0x00,0x20,0x01,0x00,0x04,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x09,0x00,0x00,0x20,0x01,0x00,0x06,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x09,0x00,0x00,0x20,0x01,0x00,0x09,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x09,0x00,0x00,0x50,0x08,0x00,0x0a,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x09,0x00,0x00,0x20,0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x09,0x00,0x00,0x20,0x01,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x09,0x00,0x00,0x20,0x01,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x09,0x00,0x00,0x20,0x01,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x09,0x00,0x00,0x20,0x01,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x09, 0x00,0x00,0x50,0x08,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x09,0x00, 0x00,0x21,0x01,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x09,0x00,0x00, 0x20,0x01,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x09,0x00,0x00,0x20, 0x01,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x09,0x00,0x00,0x20,0x01, 0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x09,0x00,0x00,0x50,0x08,0x00, 0x1a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x09,0x00,0x00,0x20,0x01,0x00,0x1b, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x09,0x00,0x00,0x12,0x01,0x00,0x1d,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x09,0x00,0x00,0x21,0x01,0x00,0x20,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x09,0x00,0x00,0x20,0x01,0x00,0x21,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x09,0x00,0x00,0x20,0x01,0x00,0x22,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x09,0x00,0x00,0x20,0x01,0x00,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x09,0x00,0x00,0x20,0x01,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x09,0x00,0x00,0x20,0x01,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x09,0x00,0x00,0x20,0x01,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x09,0x00,0x00,0x50,0x08,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x09, 0x00,0x00,0x20,0x01,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x09,0x00, 0x00,0x20,0x01,0x00,0x2f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x09,0x00,0x00, 0x20,0x01,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x09,0x00,0x00,0x20, 0x01,0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x09,0x00,0x00,0x20,0x01, 0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x09,0x00,0x00,0x50,0x08,0x00, 0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x09,0x00,0x00,0x20,0x01,0x00,0x37, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x09,0x00,0x00,0x20,0x01,0x00,0x39,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x09,0x00,0x00,0x20,0x01,0x00,0x3b,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x09,0x00,0x00,0x20,0x01,0x00,0x3d,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x09,0x00,0x00,0x20,0x01,0x00,0x3e,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x21,0x01,0x00,0x3f,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x09,0x00,0x00,0x20,0x01,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x09,0x00,0x00,0x20,0x01,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x09,0x00,0x00,0x20,0x01,0x00,0x43,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x09,0x00,0x00,0x20,0x01,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x09, 0x00,0x00,0x20,0x01,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x09,0x00, 0x00,0x20,0x01,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x09,0x00,0x00, 0x20,0x01,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x09,0x00,0x00,0x20, 0x01,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x09,0x00,0x00,0x50,0x08, 0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x09,0x00,0x00,0x20,0x01,0x00, 0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x09,0x00,0x00,0x20,0x01,0x00,0x53, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x09,0x00,0x00,0x20,0x01,0x00,0x55,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x09,0x00,0x00,0x20,0x01,0x00,0x57,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x09,0x00,0x00,0x20,0x01,0x00,0x59,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x09,0x00,0x00,0x20,0x01,0x00,0x5b,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x09,0x00,0x00,0x20,0x01,0x00,0x5c,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x09,0x00,0x00,0x21,0x01,0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x09,0x00,0x00,0x20,0x01,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x09,0x00,0x00,0x20,0x01,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x09,0x00,0x00,0x20,0x01,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x09, 0x00,0x00,0x20,0x01,0x00,0x63,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x09,0x00, 0x00,0x20,0x01,0x00,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x09,0x00,0x00, 0x20,0x01,0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x09,0x00,0x00,0x20, 0x01,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x09,0x00,0x00,0x50,0x08, 0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x09,0x00,0x00,0x20,0x01,0x00, 0x6d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x09,0x00,0x00,0x20,0x01,0x00,0x6f, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x09,0x00,0x00,0x20,0x01,0x00,0x71,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x09,0x00,0x00,0x20,0x01,0x00,0x73,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x09,0x00,0x00,0x20,0x01,0x00,0x75,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x09,0x00,0x00,0x20,0x01,0x00,0x76,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x09,0x00,0x00,0x21,0x01,0x00,0x77,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x09,0x00,0x00,0x20,0x01,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x09,0x00,0x00,0x20,0x01,0x00,0x79,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x09,0x00,0x00,0x20,0x01,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x09,0x00,0x00,0x20,0x01,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x09, 0x00,0x00,0x50,0x08,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x09,0x00, 0x00,0x20,0x01,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x09,0x00,0x00, 0x20,0x01,0x00,0x83,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x09,0x00,0x00,0x20, 0x01,0x00,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x09,0x00,0x00,0x20,0x01, 0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x09,0x00,0x00,0x50,0x08,0x00, 0x86,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x09,0x00,0x00,0x20,0x01,0x00,0x88, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x09,0x00,0x00,0x20,0x01,0x00,0x89,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x09,0x00,0x00,0x20,0x01,0x00,0x8a,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x09,0x00,0x00,0x20,0x01,0x00,0x8b,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x09,0x00,0x00,0x50,0x08,0x00,0x8c,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x21,0x01,0x00,0x8d,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0a,0x00,0x00,0x20,0x01,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0a,0x00,0x00,0x20,0x01,0x00,0x90,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0a,0x00,0x00,0x50,0x08,0x00,0x91,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0a,0x00,0x00,0x20,0x01,0x00,0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0a, 0x00,0x00,0x12,0x01,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00, 0x00,0x50,0x08,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, 0x20,0x01,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0a,0x00,0x00,0x20, 0x01,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x00,0x00,0x20,0x01, 0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x9f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x20,0x01,0x00,0xa0, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x00,0x00,0x50,0x08,0x00,0xa1,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0a,0x00,0x00,0x20,0x01,0x00,0xa3,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0a,0x00,0x00,0x20,0x01,0x00,0xa5,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0a,0x00,0x00,0x20,0x01,0x00,0xa7,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x20,0x01,0x00,0xa9,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0a,0x00,0x00,0x20,0x01,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0a,0x00,0x00,0x20,0x01,0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0a,0x00,0x00,0x20,0x01,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0a,0x00,0x00,0x50,0x08,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0a, 0x00,0x00,0x20,0x01,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x00, 0x00,0x20,0x01,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0a,0x00,0x00, 0x20,0x01,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0a,0x00,0x00,0x20, 0x01,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0a,0x00,0x00,0x20,0x01, 0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0a,0x00,0x00,0x50,0x08,0x00,0xbb, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0a,0x00,0x00,0x20,0x01,0x00,0xbd,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x00,0x00,0x20,0x01,0x00,0xbf,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0a,0x00,0x00,0x20,0x01,0x00,0xc0,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0a,0x00,0x00,0x50,0x08,0x00,0xc1,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0a,0x00,0x00,0x50,0x08,0x00,0xc2,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0a,0x00,0x00,0x20,0x01,0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0a,0x00,0x00,0x12,0x01,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0a,0x00,0x00,0x21,0x01,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0a,0x00,0x00,0x20,0x01,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0a, 0x00,0x00,0x20,0x01,0x00,0xca,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x00, 0x00,0x20,0x01,0x00,0xcc,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0a,0x00,0x00, 0x20,0x01,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0a,0x00,0x00,0x20, 0x01,0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0a,0x00,0x00,0x20,0x01, 0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0a,0x00,0x00,0x50,0x08,0x00, 0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0a,0x00,0x00,0x20,0x01,0x00,0xd5, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0a,0x00,0x00,0x20,0x01,0x00,0xd7,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0a,0x00,0x00,0x20,0x01,0x00,0xd9,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0a,0x00,0x00,0x20,0x01,0x00,0xda,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0a,0x00,0x00,0x20,0x01,0x00,0xdc,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0a,0x00,0x00,0x50,0x08,0x00,0xdd,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0a,0x00,0x00,0x20,0x01,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0a,0x00,0x00,0x20,0x01,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0a,0x00,0x00,0x20,0x01,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0a,0x00,0x00,0x20,0x01,0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0a, 0x00,0x00,0x20,0x01,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0a,0x00, 0x00,0x21,0x01,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0a,0x00,0x00, 0x20,0x01,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0a,0x00,0x00,0x20, 0x01,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0a,0x00,0x00,0x20,0x01, 0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xed,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0a,0x00,0x00,0x20,0x01,0x00,0xef, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0a,0x00,0x00,0x20,0x01,0x00,0xf1,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0a,0x00,0x00,0x20,0x01,0x00,0xf3,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0a,0x00,0x00,0x20,0x01,0x00,0xf6,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0a,0x00,0x00,0x50,0x08,0x00,0xf7,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x20,0x01,0x00,0xf9,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0a,0x00,0x00,0x20,0x01,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0a,0x00,0x00,0x20,0x01,0x00,0xfd,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0a,0x00,0x00,0x20,0x01,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0a,0x00,0x00,0x20,0x01,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0a, 0x00,0x00,0x20,0x01,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0a,0x00, 0x00,0x20,0x01,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0a,0x00,0x00, 0x21,0x01,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x20, 0x01,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0a,0x00,0x00,0x20,0x01, 0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0a,0x00,0x00,0x20,0x01,0x00,0x0b, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0a,0x00,0x00,0x20,0x01,0x00,0x0d,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0a,0x00,0x00,0x20,0x01,0x00,0x0f,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0a,0x00,0x00,0x20,0x01,0x00,0x12,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0a,0x00,0x00,0x50,0x08,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0a,0x00,0x00,0x20,0x01,0x00,0x15,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0a,0x00,0x00,0x20,0x01,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0a,0x00,0x00,0x20,0x01,0x00,0x19,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0a,0x00,0x00,0x20,0x01,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0a,0x00,0x00,0x20,0x01,0x00,0x1d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0a, 0x00,0x00,0x20,0x01,0x00,0x1e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0a,0x00, 0x00,0x21,0x01,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0a,0x00,0x00, 0x20,0x01,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0a,0x00,0x00,0x20, 0x01,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0a,0x00,0x00,0x20,0x01, 0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x26,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0a,0x00,0x00,0x50,0x08,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0a,0x00,0x00,0x20,0x01,0x00,0x29,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0a,0x00,0x00,0x20,0x01,0x00,0x2b,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0a,0x00,0x00,0x20,0x01,0x00,0x2c,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0a,0x00,0x00,0x20,0x01,0x00,0x2d,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0a,0x00,0x00,0x50,0x08,0x00,0x2e,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0a,0x00,0x00,0x20,0x01,0x00,0x30,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0a,0x00,0x00,0x20,0x01,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0a,0x00,0x00,0x20,0x01,0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0a,0x00,0x00,0x20,0x01,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0a, 0x00,0x00,0x50,0x08,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0a,0x00, 0x00,0x21,0x01,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0a,0x00,0x00, 0x20,0x01,0x00,0x36,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0a,0x00,0x00,0x20, 0x01,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0a,0x00,0x00,0x50,0x08, 0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0a,0x00,0x00,0x20,0x01,0x00,0x43, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0a,0x00,0x00,0x20,0x01,0x00,0x44,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0a,0x00,0x00,0x20,0x01,0x00,0x46,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0a,0x00,0x00,0x20,0x01,0x00,0x48,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0a,0x00,0x00,0x20,0x01,0x00,0x4a,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0a,0x00,0x00,0x20,0x01,0x00,0x4d,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0a,0x00,0x00,0x20,0x01,0x00,0x4e,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0a,0x00,0x00,0x20,0x01,0x00,0x50,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0a,0x00,0x00,0x20,0x01,0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0a,0x00,0x00,0x20,0x01,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0a, 0x00,0x00,0x20,0x01,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0a,0x00, 0x00,0x20,0x01,0x00,0x58,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0a,0x00,0x00, 0x20,0x01,0x00,0x5b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0a,0x00,0x00,0x20, 0x01,0x00,0x5c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0a,0x00,0x00,0x20,0x01, 0x00,0x5e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0a,0x00,0x00,0x20,0x01,0x00,0x62, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0a,0x00,0x00,0x20,0x01,0x00,0x64,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0a,0x00,0x00,0x20,0x01,0x00,0x67,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0a,0x00,0x00,0x20,0x01,0x00,0x68,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0a,0x00,0x00,0x20,0x01,0x00,0x6a,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0a,0x00,0x00,0x20,0x01,0x00,0x6d,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0a,0x00,0x00,0x20,0x01,0x00,0x6e,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0a,0x00,0x00,0x20,0x01,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0a,0x00,0x00,0x20,0x01,0x00,0x72,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0a,0x00,0x00,0x23,0x02,0x00,0x7d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0a, 0x00,0x00,0x12,0x01,0x00,0x7e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0a,0x00, 0x00,0x23,0x02,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0a,0x00,0x00, 0x12,0x01,0x00,0x81,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0a,0x00,0x00,0x20, 0x01,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0a,0x00,0x00,0x21,0x01, 0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0a,0x00,0x00,0x20,0x01,0x00, 0x85,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0a,0x00,0x00,0x20,0x01,0x00,0x86, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0a,0x00,0x00,0x20,0x01,0x00,0x88,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0a,0x00,0x00,0x20,0x01,0x00,0x8a,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x20,0x01,0x00,0x8c,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0a,0x00,0x00,0x20,0x01,0x00,0x8f,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0a,0x00,0x00,0x20,0x01,0x00,0x91,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0a,0x00,0x00,0x20,0x01,0x00,0x93,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0a,0x00,0x00,0x20,0x01,0x00,0x96,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0a,0x00,0x00,0x50,0x08,0x00,0x97,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0a,0x00,0x00,0x20,0x01,0x00,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0a, 0x00,0x00,0x20,0x01,0x00,0x9b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0a,0x00, 0x00,0x20,0x01,0x00,0x9d,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0a,0x00,0x00, 0x20,0x01,0x00,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0a,0x00,0x00,0x20, 0x01,0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0a,0x00,0x00,0x20,0x01, 0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0a,0x00,0x00,0x20,0x01,0x00, 0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0a,0x00,0x00,0x20,0x01,0x00,0xa6, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0a,0x00,0x00,0x20,0x01,0x00,0xa8,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0a,0x00,0x00,0x20,0x01,0x00,0xab,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0a,0x00,0x00,0x50,0x08,0x00,0xac,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0a,0x00,0x00,0x20,0x01,0x00,0xae,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0a,0x00,0x00,0x20,0x01,0x00,0xb0,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0a,0x00,0x00,0x20,0x01,0x00,0xb2,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0a,0x00,0x00,0x20,0x01,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0a,0x00,0x00,0x20,0x01,0x00,0xb5,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0a,0x00,0x00,0x21,0x01,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0a, 0x00,0x00,0x20,0x01,0x00,0xb7,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x00, 0x00,0x20,0x01,0x00,0xb8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0a,0x00,0x00, 0x20,0x01,0x00,0xba,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0a,0x00,0x00,0x20, 0x01,0x00,0xbc,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0a,0x00,0x00,0x20,0x01, 0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0a,0x00,0x00,0x20,0x01,0x00, 0xc0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0a,0x00,0x00,0x20,0x01,0x00,0xc2, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0a,0x00,0x00,0x20,0x01,0x00,0xc4,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0a,0x00,0x00,0x20,0x01,0x00,0xc7,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0a,0x00,0x00,0x20,0x01,0x00,0xc9,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0a,0x00,0x00,0x20,0x01,0x00,0xcb,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0a,0x00,0x00,0x20,0x01,0x00,0xcd,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0a,0x00,0x00,0x20,0x01,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0a,0x00,0x00,0x20,0x01,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0a,0x00,0x00,0x20,0x01,0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0a,0x00,0x00,0x50,0x08,0x00,0xd5,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0a, 0x00,0x00,0x20,0x01,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0a,0x00, 0x00,0x20,0x01,0x00,0xd9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0a,0x00,0x00, 0x20,0x01,0x00,0xdb,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0a,0x00,0x00,0x20, 0x01,0x00,0xdd,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0a,0x00,0x00,0x20,0x01, 0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0a,0x00,0x00,0x20,0x01,0x00, 0xe1,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0a,0x00,0x00,0x20,0x01,0x00,0xe2, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0a,0x00,0x00,0x21,0x01,0x00,0xe3,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0a,0x00,0x00,0x20,0x01,0x00,0xe4,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0a,0x00,0x00,0x20,0x01,0x00,0xe5,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0a,0x00,0x00,0x20,0x01,0x00,0xe7,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0a,0x00,0x00,0x20,0x01,0x00,0xe9,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0a,0x00,0x00,0x20,0x01,0x00,0xeb,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0a,0x00,0x00,0x20,0x01,0x00,0xed,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0a,0x00,0x00,0x20,0x01,0x00,0xef,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0a,0x00,0x00,0x20,0x01,0x00,0xf2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0a, 0x00,0x00,0x20,0x01,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0a,0x00, 0x00,0x20,0x01,0x00,0xf6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0a,0x00,0x00, 0x20,0x01,0x00,0xf8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0a,0x00,0x00,0x20, 0x01,0x00,0xfa,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0a,0x00,0x00,0x20,0x01, 0x00,0xfd,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0a,0x00,0x00,0x50,0x08,0x00, 0xfe,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0a,0x00,0x00,0x20,0x01,0x00,0x00, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0a,0x00,0x00,0x20,0x01,0x00,0x02,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0a,0x00,0x00,0x20,0x01,0x00,0x04,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0a,0x00,0x00,0x20,0x01,0x00,0x06,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0a,0x00,0x00,0x20,0x01,0x00,0x08,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0a,0x00,0x00,0x20,0x01,0x00,0x09,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0a,0x00,0x00,0x21,0x01,0x00,0x0a,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0a,0x00,0x00,0x20,0x01,0x00,0x0b,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0a,0x00,0x00,0x20,0x01,0x00,0x0c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0a,0x00,0x00,0x20,0x01,0x00,0x0e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x15,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x18,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0a,0x00,0x00,0x50,0x08, 0x00,0x19,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0a,0x00,0x00,0x20,0x01,0x00, 0x1b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0a,0x00,0x00,0x20,0x01,0x00,0x1d, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0a,0x00,0x00,0x20,0x01,0x00,0x1e,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0a,0x00,0x00,0x20,0x01,0x00,0x20,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0a,0x00,0x00,0x20,0x01,0x00,0x23,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0a,0x00,0x00,0x50,0x08,0x00,0x24,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0a,0x00,0x00,0x20,0x01,0x00,0x26,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0a,0x00,0x00,0x20,0x01,0x00,0x27,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0a,0x00,0x00,0x20,0x01,0x00,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0a,0x00,0x00,0x20,0x01,0x00,0x29,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0a,0x00,0x00,0x20,0x01,0x00,0x2b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0a, 0x00,0x00,0x50,0x08,0x00,0x2c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0a,0x00, 0x00,0x21,0x01,0x00,0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x2e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x2f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x33,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0a,0x00,0x00,0x50,0x08,0x00, 0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0a,0x00,0x00,0x20,0x01,0x00,0x35, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0a,0x00,0x00,0x12,0x01,0x00,0x37,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0a,0x00,0x00,0x21,0x01,0x00,0x3a,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0a,0x00,0x00,0x20,0x01,0x00,0x3b,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0a,0x00,0x00,0x20,0x01,0x00,0x3c,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0a,0x00,0x00,0x20,0x01,0x00,0x3e,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0a,0x00,0x00,0x20,0x01,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0a,0x00,0x00,0x20,0x01,0x00,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0a,0x00,0x00,0x20,0x01,0x00,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0a,0x00,0x00,0x50,0x08,0x00,0x45,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0a, 0x00,0x00,0x20,0x01,0x00,0x47,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0a,0x00, 0x00,0x20,0x01,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0a,0x00,0x00, 0x20,0x01,0x00,0x4b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0a,0x00,0x00,0x20, 0x01,0x00,0x4c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0a,0x00,0x00,0x20,0x01, 0x00,0x4e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0a,0x00,0x00,0x50,0x08,0x00, 0x4f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0a,0x00,0x00,0x20,0x01,0x00,0x51, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0a,0x00,0x00,0x20,0x01,0x00,0x53,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0a,0x00,0x00,0x20,0x01,0x00,0x55,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0a,0x00,0x00,0x20,0x01,0x00,0x57,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0a,0x00,0x00,0x20,0x01,0x00,0x58,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x21,0x01,0x00,0x59,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0b,0x00,0x00,0x20,0x01,0x00,0x5a,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0b,0x00,0x00,0x20,0x01,0x00,0x5b,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0b,0x00,0x00,0x20,0x01,0x00,0x5d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0b,0x00,0x00,0x20,0x01,0x00,0x5f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b, 0x00,0x00,0x20,0x01,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0b,0x00, 0x00,0x20,0x01,0x00,0x63,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00, 0x20,0x01,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0b,0x00,0x00,0x20, 0x01,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0b,0x00,0x00,0x50,0x08, 0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x6b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x00,0x00,0x20,0x01,0x00,0x6d, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x20,0x01,0x00,0x6f,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0b,0x00,0x00,0x20,0x01,0x00,0x71,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x00,0x00,0x20,0x01,0x00,0x73,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0b,0x00,0x00,0x20,0x01,0x00,0x75,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0b,0x00,0x00,0x20,0x01,0x00,0x76,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0b,0x00,0x00,0x21,0x01,0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0b,0x00,0x00,0x20,0x01,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0b,0x00,0x00,0x20,0x01,0x00,0x79,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0b,0x00,0x00,0x20,0x01,0x00,0x7b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0b, 0x00,0x00,0x20,0x01,0x00,0x7d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0b,0x00, 0x00,0x20,0x01,0x00,0x7f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0b,0x00,0x00, 0x20,0x01,0x00,0x81,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x00,0x00,0x20, 0x01,0x00,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x00,0x00,0x50,0x08, 0x00,0x85,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x87,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0b,0x00,0x00,0x20,0x01,0x00,0x89, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0b,0x00,0x00,0x20,0x01,0x00,0x8b,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0b,0x00,0x00,0x20,0x01,0x00,0x8d,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0b,0x00,0x00,0x20,0x01,0x00,0x8f,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0b,0x00,0x00,0x20,0x01,0x00,0x90,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0b,0x00,0x00,0x21,0x01,0x00,0x91,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0b,0x00,0x00,0x20,0x01,0x00,0x92,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0b,0x00,0x00,0x20,0x01,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0b,0x00,0x00,0x20,0x01,0x00,0x95,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0b,0x00,0x00,0x20,0x01,0x00,0x98,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0b, 0x00,0x00,0x50,0x08,0x00,0x99,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0b,0x00, 0x00,0x20,0x01,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0b,0x00,0x00, 0x20,0x01,0x00,0x9d,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0b,0x00,0x00,0x20, 0x01,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0b,0x00,0x00,0x20,0x01, 0x00,0x9f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0b,0x00,0x00,0x50,0x08,0x00, 0xa0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0b,0x00,0x00,0x20,0x01,0x00,0xa2, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0b,0x00,0x00,0x20,0x01,0x00,0xa3,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0b,0x00,0x00,0x20,0x01,0x00,0xa4,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0b,0x00,0x00,0x20,0x01,0x00,0xa5,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0b,0x00,0x00,0x50,0x08,0x00,0xa6,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0b,0x00,0x00,0x21,0x01,0x00,0xa7,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0b,0x00,0x00,0x20,0x01,0x00,0xa8,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0b,0x00,0x00,0x20,0x01,0x00,0xaa,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0b,0x00,0x00,0x50,0x08,0x00,0xab,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0b,0x00,0x00,0x20,0x01,0x00,0xac,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0b, 0x00,0x00,0x12,0x01,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0b,0x00, 0x00,0x50,0x08,0x00,0xb1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0b,0x00,0x00, 0x20,0x01,0x00,0xb3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0b,0x00,0x00,0x20, 0x01,0x00,0xb5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0b,0x00,0x00,0x20,0x01, 0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0b,0x00,0x00,0x20,0x01,0x00, 0xb9,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0b,0x00,0x00,0x20,0x01,0x00,0xba, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0b,0x00,0x00,0x50,0x08,0x00,0xbb,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0b,0x00,0x00,0x20,0x01,0x00,0xbd,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0b,0x00,0x00,0x20,0x01,0x00,0xbf,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0b,0x00,0x00,0x20,0x01,0x00,0xc1,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x20,0x01,0x00,0xc3,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0b,0x00,0x00,0x20,0x01,0x00,0xc5,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0b,0x00,0x00,0x20,0x01,0x00,0xc7,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0b,0x00,0x00,0x20,0x01,0x00,0xc8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0b,0x00,0x00,0x50,0x08,0x00,0xc9,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0b, 0x00,0x00,0x20,0x01,0x00,0xcb,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0b,0x00, 0x00,0x20,0x01,0x00,0xcd,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0b,0x00,0x00, 0x20,0x01,0x00,0xcf,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0b,0x00,0x00,0x20, 0x01,0x00,0xd1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0b,0x00,0x00,0x20,0x01, 0x00,0xd3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0b,0x00,0x00,0x20,0x01,0x00, 0xd4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0b,0x00,0x00,0x50,0x08,0x00,0xd5, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x00,0x00,0x20,0x01,0x00,0xd7,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0b,0x00,0x00,0x20,0x01,0x00,0xd9,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0b,0x00,0x00,0x20,0x01,0x00,0xda,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0b,0x00,0x00,0x50,0x08,0x00,0xdb,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0b,0x00,0x00,0x50,0x08,0x00,0xdc,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0b,0x00,0x00,0x20,0x01,0x00,0xdd,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0b,0x00,0x00,0x12,0x01,0x00,0xdf,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0b,0x00,0x00,0x21,0x01,0x00,0xe2,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0b,0x00,0x00,0x20,0x01,0x00,0xe3,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0b, 0x00,0x00,0x20,0x01,0x00,0xe4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0b,0x00, 0x00,0x20,0x01,0x00,0xe6,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0b,0x00,0x00, 0x20,0x01,0x00,0xe8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0b,0x00,0x00,0x20, 0x01,0x00,0xea,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0b,0x00,0x00,0x20,0x01, 0x00,0xec,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0b,0x00,0x00,0x50,0x08,0x00, 0xed,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0b,0x00,0x00,0x20,0x01,0x00,0xef, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0b,0x00,0x00,0x20,0x01,0x00,0xf1,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0b,0x00,0x00,0x20,0x01,0x00,0xf3,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0b,0x00,0x00,0x20,0x01,0x00,0xf4,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0b,0x00,0x00,0x20,0x01,0x00,0xf6,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0b,0x00,0x00,0x50,0x08,0x00,0xf7,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0b,0x00,0x00,0x20,0x01,0x00,0xf9,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0b,0x00,0x00,0x20,0x01,0x00,0xfb,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0b,0x00,0x00,0x20,0x01,0x00,0xfd,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0b,0x00,0x00,0x20,0x01,0x00,0xff,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0b, 0x00,0x00,0x20,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0b,0x00, 0x00,0x21,0x01,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0b,0x00,0x00, 0x20,0x01,0x00,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0b,0x00,0x00,0x20, 0x01,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0b,0x00,0x00,0x20,0x01, 0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0b,0x00,0x00,0x20,0x01,0x00,0x09, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0b,0x00,0x00,0x20,0x01,0x00,0x0b,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x20,0x01,0x00,0x0d,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0b,0x00,0x00,0x20,0x01,0x00,0x10,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0b,0x00,0x00,0x50,0x08,0x00,0x11,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0b,0x00,0x00,0x20,0x01,0x00,0x13,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0b,0x00,0x00,0x20,0x01,0x00,0x15,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0b,0x00,0x00,0x20,0x01,0x00,0x17,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0b,0x00,0x00,0x20,0x01,0x00,0x19,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0b,0x00,0x00,0x20,0x01,0x00,0x1b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0b, 0x00,0x00,0x20,0x01,0x00,0x1d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0b,0x00, 0x00,0x20,0x01,0x00,0x1e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0b,0x00,0x00, 0x21,0x01,0x00,0x1f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0b,0x00,0x00,0x20, 0x01,0x00,0x20,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0b,0x00,0x00,0x20,0x01, 0x00,0x21,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x23,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0b,0x00,0x00,0x20,0x01,0x00,0x25, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0b,0x00,0x00,0x20,0x01,0x00,0x27,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0b,0x00,0x00,0x20,0x01,0x00,0x29,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0b,0x00,0x00,0x20,0x01,0x00,0x2c,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0b,0x00,0x00,0x50,0x08,0x00,0x2d,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0b,0x00,0x00,0x20,0x01,0x00,0x2f,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0b,0x00,0x00,0x20,0x01,0x00,0x31,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0b,0x00,0x00,0x20,0x01,0x00,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0b,0x00,0x00,0x20,0x01,0x00,0x35,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0b,0x00,0x00,0x20,0x01,0x00,0x37,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0b, 0x00,0x00,0x20,0x01,0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0b,0x00, 0x00,0x21,0x01,0x00,0x39,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0b,0x00,0x00, 0x20,0x01,0x00,0x3a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0b,0x00,0x00,0x20, 0x01,0x00,0x3b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0b,0x00,0x00,0x20,0x01, 0x00,0x3d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x40,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0b,0x00,0x00,0x50,0x08,0x00,0x41, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0b,0x00,0x00,0x20,0x01,0x00,0x43,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0b,0x00,0x00,0x20,0x01,0x00,0x45,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0b,0x00,0x00,0x20,0x01,0x00,0x46,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0b,0x00,0x00,0x20,0x01,0x00,0x47,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0b,0x00,0x00,0x50,0x08,0x00,0x48,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0b,0x00,0x00,0x20,0x01,0x00,0x4a,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x0b,0x00,0x00,0x20,0x01,0x00,0x4b,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x0b,0x00,0x00,0x20,0x01,0x00,0x4c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x0b,0x00,0x00,0x20,0x01,0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x0b, 0x00,0x00,0x50,0x08,0x00,0x4e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x0b,0x00, 0x00,0x21,0x01,0x00,0x4f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x0b,0x00,0x00, 0x20,0x01,0x00,0x50,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0b,0x00,0x00,0x20, 0x01,0x00,0x52,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x0b,0x00,0x00,0x50,0x08, 0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x0b,0x00,0x00,0x20,0x01,0x00, 0x54,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x0b,0x00,0x00,0x20,0x01,0x00,0x5d, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x0b,0x00,0x00,0x20,0x01,0x00,0x5e,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x0b,0x00,0x00,0x20,0x01,0x00,0x60,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x0b,0x00,0x00,0x20,0x01,0x00,0x62,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x0b,0x00,0x00,0x20,0x01,0x00,0x64,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0x20,0x01,0x00,0x67,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x0b,0x00,0x00,0x20,0x01,0x00,0x68,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x0b,0x00,0x00,0x20,0x01,0x00,0x6a,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x0b,0x00,0x00,0x20,0x01,0x00,0x6c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x6e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x0b, 0x00,0x00,0x20,0x01,0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x0b,0x00, 0x00,0x20,0x01,0x00,0x72,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x75,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x76,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x0b,0x00,0x00,0x20,0x01,0x00, 0x7a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x0b,0x00,0x00,0x20,0x01,0x00,0x7c, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x0b,0x00,0x00,0x20,0x01,0x00,0x7e,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x0b,0x00,0x00,0x20,0x01,0x00,0x81,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x0b,0x00,0x00,0x20,0x01,0x00,0x82,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x0b,0x00,0x00,0x20,0x01,0x00,0x84,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x0b,0x00,0x00,0x20,0x01,0x00,0x87,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x0b,0x00,0x00,0x20,0x01,0x00,0x88,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x0b,0x00,0x00,0x20,0x01,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x0b,0x00,0x00,0x20,0x01,0x00,0x8c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x0b,0x00,0x00,0x23,0x02,0x00,0x95,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x0b, 0x00,0x00,0x12,0x01,0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x0b,0x00, 0x00,0x23,0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x0b,0x00,0x00, 0x12,0x01,0x00,0x9a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x0b,0x00,0x00,0x21,0x01, 0x00,0x9d,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x0b,0x00,0x00,0x20,0x01,0x00, 0x9e,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x0b,0x00,0x00,0x20,0x01,0x00,0x9f, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x0b,0x00,0x00,0x20,0x01,0x00,0xa1,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x0b,0x00,0x00,0x20,0x01,0x00,0xa3,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x20,0x01,0x00,0xa5,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x0b,0x00,0x00,0x20,0x01,0x00,0xa8,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x0b,0x00,0x00,0x20,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x0b,0x00,0x00,0x20,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x0b,0x00,0x00,0x20,0x01,0x00,0xad,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x0b,0x00,0x00,0x50,0x08,0x00,0x98,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x0b,0x00,0x00,0x20,0x01,0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x0b, 0x00,0x00,0x20,0x01,0x00,0xb0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x0b,0x00, 0x00,0x20,0x01,0x00,0xb1,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0b,0x00,0x00, 0x20,0x01,0x00,0xb2,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0b,0x00,0x00,0x20, 0x01,0x00,0xb3,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x0b,0x00,0x00,0x20,0x01, 0x00,0xb6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x0b,0x00,0x00,0x20,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x0b,0x00,0x00,0x20,0x01,0x00,0xbc, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x0b,0x00,0x00,0x20,0x01,0x00,0xbe,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x0b,0x00,0x00,0x20,0x01,0x00,0xbf,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x0b,0x00,0x00,0x20,0x01,0x00,0xc0,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x0b,0x00,0x00,0x20,0x01,0x00,0xc1,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x0b,0x00,0x00,0x20,0x01,0x00,0xc2,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x0b,0x00,0x00,0x21,0x01,0x00,0xc3,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x0b,0x00,0x00,0x20,0x01,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x0b,0x00,0x00,0x20,0x01,0x00,0xc5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x0b,0x00,0x00,0x20,0x01,0x00,0xc7,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x0b, 0x00,0x00,0x20,0x01,0x00,0xc9,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0b,0x00, 0x00,0x20,0x01,0x00,0xcb,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x0b,0x00,0x00, 0x20,0x01,0x00,0xcd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0b,0x00,0x00,0x20, 0x01,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x0b,0x00,0x00,0x20,0x01, 0x00,0xd1,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x0b,0x00,0x00,0x20,0x01,0x00, 0xd4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x0b,0x00,0x00,0x20,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x0b,0x00,0x00,0x20,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x0b,0x00,0x00,0x20,0x01,0x00,0xdc,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x0b,0x00,0x00,0x20,0x01,0x00,0xde,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x0b,0x00,0x00,0x20,0x01,0x00,0xdf,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x0b,0x00,0x00,0x20,0x01,0x00,0xe0,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x0b,0x00,0x00,0x20,0x01,0x00,0xe1,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x0b,0x00,0x00,0x20,0x01,0x00,0xe2,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x0b,0x00,0x00,0x20,0x01,0x00,0xe3,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x0b,0x00,0x00,0x20,0x01,0x00,0xe4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x0b, 0x00,0x00,0x21,0x01,0x00,0xe5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x0b,0x00, 0x00,0x20,0x01,0x00,0xe6,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x0b,0x00,0x00, 0x20,0x01,0x00,0xe7,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x0b,0x00,0x00,0x20, 0x01,0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x0b,0x00,0x00,0x20,0x01, 0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x0b,0x00,0x00,0x20,0x01,0x00, 0xed,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x0b,0x00,0x00,0x20,0x01,0x00,0xef, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x0b,0x00,0x00,0x20,0x01,0x00,0xf1,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x0b,0x00,0x00,0x20,0x01,0x00,0xf4,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x0b,0x00,0x00,0x20,0x01,0x00,0xfb,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x0b,0x00,0x00,0x20,0x01,0x00,0xfd,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0b,0x00,0x00,0x20,0x01,0x00,0xfe,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x0b,0x00,0x00,0x20,0x01,0x00,0xff,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x0b,0x00,0x00,0x20,0x01,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x0b,0x00,0x00,0x20,0x01,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x0b,0x00,0x00,0x20,0x01,0x00,0x02,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x0b, 0x00,0x00,0x21,0x01,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x0b,0x00, 0x00,0x20,0x01,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x0b,0x00,0x00, 0x20,0x01,0x00,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0b,0x00,0x00,0x20, 0x01,0x00,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x0b,0x00,0x00,0x20,0x01, 0x00,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x0b,0x00,0x00,0x20,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x0b,0x00,0x00,0x20,0x01,0x00,0x0f, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0b,0x00,0x00,0x20,0x01,0x00,0x11,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x0b,0x00,0x00,0x20,0x01,0x00,0x12,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0b,0x00,0x00,0x20,0x01,0x00,0x13,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x0b,0x00,0x00,0x20,0x01,0x00,0x17,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x20,0x01,0x00,0x19,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0x00,0x00,0x20,0x01,0x00,0x1a,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x0c,0x00,0x00,0x20,0x01,0x00,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x0c,0x00,0x00,0x20,0x01,0x00,0x1c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x0c,0x00,0x00,0x20,0x01,0x00,0x1e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0c, 0x00,0x00,0x21,0x01,0x00,0x1f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0c,0x00, 0x00,0x20,0x01,0x00,0x20,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, 0x20,0x01,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x20, 0x01,0x00,0x25,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0c,0x00,0x00,0x20,0x01, 0x00,0x26,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0c,0x00,0x00,0x12,0x01,0x00, 0x28,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x00,0x00,0x21,0x01,0x00,0x2b, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x20,0x01,0x00,0x2c,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0c,0x00,0x00,0x20,0x01,0x00,0x2d,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x20,0x01,0x00,0x32,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x0c,0x00,0x00,0x20,0x01,0x00,0x34,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x01,0x00,0x35,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x0c,0x00,0x00,0x20,0x01,0x00,0x36,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x0c,0x00,0x00,0x20,0x01,0x00,0x37,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x0c,0x00,0x00,0x20,0x01,0x00,0x39,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x0c,0x00,0x00,0x20,0x01,0x00,0x3b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x0c, 0x00,0x00,0x20,0x01,0x00,0x3c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0c,0x00, 0x00,0x20,0x01,0x00,0x3d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x0c,0x00,0x00, 0x20,0x01,0x00,0x3e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0x00,0x00,0x20, 0x01,0x00,0x3f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0c,0x00,0x00,0x21,0x01, 0x00,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x41,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x20,0x01,0x00,0x42, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x0c,0x00,0x00,0x20,0x01,0x00,0x4a,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0c,0x00,0x00,0x20,0x01,0x00,0x4c,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x0c,0x00,0x00,0x20,0x01,0x00,0x4d,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x0c,0x00,0x00,0x20,0x01,0x00,0x4e,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x01,0x00,0x4f,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x0c,0x00,0x00,0x20,0x01,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x0c,0x00,0x00,0x20,0x01,0x00,0x51,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x0c,0x00,0x00,0x20,0x01,0x00,0x52,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x0c,0x00,0x00,0x21,0x01,0x00,0x53,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c, 0x00,0x00,0x20,0x01,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0c,0x00, 0x00,0x20,0x01,0x00,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x0c,0x00,0x00, 0x20,0x01,0x00,0x5c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0c,0x00,0x00,0x20, 0x01,0x00,0x5e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x0c,0x00,0x00,0x20,0x01, 0x00,0x5f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x60,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x0c,0x00,0x00,0x20,0x01,0x00,0x61, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x0c,0x00,0x00,0x20,0x01,0x00,0x62,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0c,0x00,0x00,0x20,0x01,0x00,0x63,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x0c,0x00,0x00,0x21,0x01,0x00,0x64,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x0c,0x00,0x00,0x20,0x01,0x00,0x65,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x0c,0x00,0x00,0x20,0x01,0x00,0x69,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x0c,0x00,0x00,0x20,0x01,0x00,0x6b,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x0c,0x00,0x00,0x20,0x01,0x00,0x6c,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x0c,0x00,0x00,0x20,0x01,0x00,0x6d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x0c,0x00,0x00,0x20,0x01,0x00,0x6e,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x0c, 0x00,0x00,0x20,0x01,0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x0c,0x00, 0x00,0x20,0x01,0x00,0x71,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x0c,0x00,0x00, 0x20,0x01,0x00,0x72,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0c,0x00,0x00,0x20, 0x01,0x00,0x73,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x0c,0x00,0x00,0x21,0x01, 0x00,0x74,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x75,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x0c,0x00,0x00,0x20,0x01,0x00,0x77, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0c,0x00,0x00,0x20,0x01,0x00,0x78,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x0c,0x00,0x00,0x12,0x01,0x00,0x7a,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x0c,0x00,0x00,0x20,0x01,0x00,0x7e,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x0c,0x00,0x00,0x20,0x01,0x00,0x7f,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x0c,0x00,0x00,0x20,0x01,0x00,0x80,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x0c,0x00,0x00,0x20,0x01,0x00,0x81,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x0c,0x00,0x00,0x20,0x01,0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x0c,0x00,0x00,0x20,0x01,0x00,0x84,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x0c,0x00,0x00,0x20,0x01,0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x0c, 0x00,0x00,0x20,0x01,0x00,0x86,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0c,0x00, 0x00,0x20,0x01,0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x0c,0x00,0x00, 0x20,0x01,0x00,0x88,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0c,0x00,0x00,0x20, 0x01,0x00,0x89,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x0c,0x00,0x00,0x20,0x01, 0x00,0x8a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x8c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x0c,0x00,0x00,0x20,0x01,0x00,0x8d, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x0c,0x00,0x00,0x20,0x01,0x00,0x8e,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x0c,0x00,0x00,0x20,0x01,0x00,0x8f,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x0c,0x00,0x00,0x20,0x01,0x00,0x90,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x0c,0x00,0x00,0x20,0x01,0x00,0x91,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x0c,0x00,0x00,0x20,0x01,0x00,0x93,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x0c,0x00,0x00,0x20,0x01,0x00,0x94,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x0c,0x00,0x00,0x20,0x01,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x0c,0x00,0x00,0x20,0x01,0x00,0x96,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x0c,0x00,0x00,0x12,0x01,0x00,0x98,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0c, 0x00,0x00,0x21,0x01,0x00,0x9b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x0c,0x00, 0x00,0x20,0x01,0x00,0x9c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x0c,0x00,0x00, 0x20,0x01,0x00,0x9d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0c,0x00,0x00,0x20, 0x01,0x00,0xa2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x0c,0x00,0x00,0x20,0x01, 0x00,0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xa5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x0c,0x00,0x00,0x20,0x01,0x00,0xa6, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x0c,0x00,0x00,0x20,0x01,0x00,0xa7,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x0c,0x00,0x00,0x20,0x01,0x00,0xa9,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x0c,0x00,0x00,0x20,0x01,0x00,0xab,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x0c,0x00,0x00,0x20,0x01,0x00,0xac,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x0c,0x00,0x00,0x20,0x01,0x00,0xad,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x0c,0x00,0x00,0x20,0x01,0x00,0xae,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x0c,0x00,0x00,0x20,0x01,0x00,0xaf,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x0c,0x00,0x00,0x21,0x01,0x00,0xb0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x0c,0x00,0x00,0x20,0x01,0x00,0xb1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0c, 0x00,0x00,0x20,0x01,0x00,0xb2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0c,0x00, 0x00,0x20,0x01,0x00,0xba,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x0c,0x00,0x00, 0x20,0x01,0x00,0xbc,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x0c,0x00,0x00,0x20, 0x01,0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x0c,0x00,0x00,0x20,0x01, 0x00,0xbe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x0c,0x00,0x00,0x20,0x01,0x00,0xc0, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x0c,0x00,0x00,0x20,0x01,0x00,0xc1,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x0c,0x00,0x00,0x20,0x01,0x00,0xc2,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x0c,0x00,0x00,0x21,0x01,0x00,0xc3,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x0c,0x00,0x00,0x20,0x01,0x00,0xc4,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x0c,0x00,0x00,0x20,0x01,0x00,0xc5,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x0c,0x00,0x00,0x20,0x01,0x00,0xcc,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x0c,0x00,0x00,0x20,0x01,0x00,0xce,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x0c,0x00,0x00,0x20,0x01,0x00,0xcf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x0c,0x00,0x00,0x20,0x01,0x00,0xd0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x0c, 0x00,0x00,0x20,0x01,0x00,0xd1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x0c,0x00, 0x00,0x20,0x01,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x0c,0x00,0x00, 0x20,0x01,0x00,0xd3,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x00,0x00,0x21, 0x01,0x00,0xd4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x0c,0x00,0x00,0x20,0x01, 0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0c,0x00,0x00,0x20,0x01,0x00, 0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x0c,0x00,0x00,0x20,0x01,0x00,0xdb, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0c,0x00,0x00,0x20,0x01,0x00,0xdc,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x0c,0x00,0x00,0x20,0x01,0x00,0xdd,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x0c,0x00,0x00,0x20,0x01,0x00,0xde,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x0c,0x00,0x00,0x20,0x01,0x00,0xe0,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0c,0x00,0x00,0x20,0x01,0x00,0xe1,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x0c,0x00,0x00,0x20,0x01,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x0c,0x00,0x00,0x20,0x01,0x00,0xe3,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x0c,0x00,0x00,0x21,0x01,0x00,0xe4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x0c,0x00,0x00,0x20,0x01,0x00,0xe5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x0c, 0x00,0x00,0x20,0x01,0x00,0xe7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x0c,0x00, 0x00,0x20,0x01,0x00,0xe8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0c,0x00,0x00, 0x20,0x01,0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0c,0x00,0x00,0x20, 0x01,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x0c,0x00,0x00,0x20,0x01, 0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x0c,0x00,0x00,0x20,0x01,0x00, 0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x0c,0x00,0x00,0x20,0x01,0x00,0x0d, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x0c,0x00,0x00,0x20,0x01,0x00,0x0e,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x0c,0x00,0x00,0x20,0x01,0x00,0x10,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x0c,0x00,0x00,0x20,0x01,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x0c,0x00,0x00,0x20,0x01,0x00,0x11,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x0c,0x00,0x00,0x20,0x01,0x00,0x15,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x0c,0x00,0x00,0x20,0x01,0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x00,0x92,0x0c,0x00,0x00,0x01,0x00,0x00,0x93,0x0c,0x00,0x00,0x01,0x00, 0x00,0x94,0x0c,0x00,0x00,0x01,0x00,0x00,0x95,0x0c,0x00,0x00,0x01,0x00,0x00,0x96, 0x0c,0x00,0x00,0x01,0x00,0x00,0x97,0x0c,0x00,0x00,0x01,0x00,0x00,0x98,0x0c,0x00, 0x00,0x01,0x00,0x00,0x99,0x0c,0x00,0x00,0x01,0x00,0x00,0x9a,0x0c,0x00,0x00,0x01, 0x00,0x00,0x9b,0x0c,0x00,0x00,0x01,0x00,0x00,0x9c,0x0c,0x00,0x00,0x01,0x00,0x00, 0x9d,0x0c,0x00,0x00,0x01,0x00,0x00,0x9e,0x0c,0x00,0x00,0x01,0x00,0x00,0x9f,0x0c, 0x00,0x00,0x01,0x00,0x00,0xa0,0x0c,0x00,0x00,0x01,0x00,0x00,0xa1,0x0c,0x00,0x00, 0x01,0x00,0x00,0xa2,0x0c,0x00,0x00,0x01,0x00,0x00,0xa3,0x0c,0x00,0x00,0x01,0x00, 0x00,0xa4,0x0c,0x00,0x00,0x01,0x00,0x00,0xa5,0x0c,0x00,0x00,0x01,0x00,0x00,0xe9, 0x00,0xa6,0x0c,0x00,0x00,0x01,0x00,0x00,0xa7,0x0c,0x00,0x00,0x01,0x00,0x00,0xa8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xa9,0x0c,0x00,0x00,0x01,0x00,0x00,0xaa,0x0c,0x00, 0x00,0x01,0x00,0x00,0xab,0x0c,0x00,0x00,0x01,0x00,0x00,0xac,0x0c,0x00,0x00,0x01, 0x00,0x00,0xad,0x0c,0x00,0x00,0x01,0x00,0x00,0xae,0x0c,0x00,0x00,0x01,0x00,0x00, 0xaf,0x0c,0x00,0x00,0x01,0x00,0x00,0xb0,0x0c,0x00,0x00,0x01,0x00,0x00,0xb1,0x0c, 0x00,0x00,0x01,0x00,0x00,0xb2,0x0c,0x00,0x00,0x01,0x00,0x00,0xb3,0x0c,0x00,0x00, 0x01,0x00,0x00,0xb4,0x0c,0x00,0x00,0x01,0x00,0x00,0xb5,0x0c,0x00,0x00,0x01,0x00, 0x00,0xb6,0x0c,0x00,0x00,0x01,0x00,0x00,0xb7,0x0c,0x00,0x00,0x01,0x00,0x00,0xb8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xb9,0x0c,0x00,0x00,0x01,0x00,0x00,0xba,0x0c,0x00, 0x00,0x01,0x00,0x00,0xbb,0x0c,0x00,0x00,0x01,0x00,0x00,0xbc,0x0c,0x00,0x00,0x01, 0x00,0x00,0xbd,0x0c,0x00,0x00,0x01,0x00,0x00,0xbe,0x0c,0x00,0x00,0x01,0x00,0x00, 0xbf,0x0c,0x00,0x00,0x01,0x00,0x00,0xc0,0x0c,0x00,0x00,0x01,0x00,0x00,0xc1,0x0c, 0x00,0x00,0x01,0x00,0x00,0xc2,0x0c,0x00,0x00,0x01,0x00,0x00,0xc3,0x0c,0x00,0x00, 0x01,0x00,0x00,0xc4,0x0c,0x00,0x00,0x01,0x00,0x00,0xc5,0x0c,0x00,0x00,0x01,0x00, 0x00,0xc6,0x0c,0x00,0x00,0x01,0x00,0x00,0xc7,0x0c,0x00,0x00,0x01,0x00,0x00,0xc8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xc9,0x0c,0x00,0x00,0x01,0x00,0x00,0xca,0x0c,0x00, 0x00,0x01,0x00,0x00,0xcb,0x0c,0x00,0x00,0x01,0x00,0x00,0xcc,0x0c,0x00,0x00,0x01, 0x00,0x00,0xcd,0x0c,0x00,0x00,0x01,0x00,0x00,0xce,0x0c,0x00,0x00,0x01,0x00,0x00, 0xcf,0x0c,0x00,0x00,0x01,0x00,0x00,0xd0,0x0c,0x00,0x00,0x01,0x00,0x00,0xd1,0x0c, 0x00,0x00,0x01,0x00,0x00,0xd2,0x0c,0x00,0x00,0x01,0x00,0x00,0xd3,0x0c,0x00,0x00, 0x01,0x00,0x00,0xd4,0x0c,0x00,0x00,0x01,0x00,0x00,0xd5,0x0c,0x00,0x00,0x01,0x00, 0x00,0xd6,0x0c,0x00,0x00,0x01,0x00,0x00,0xd7,0x0c,0x00,0x00,0x01,0x00,0x00,0xd8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xd9,0x0c,0x00,0x00,0x01,0x00,0x00,0xda,0x0c,0x00, 0x00,0x01,0x00,0x00,0xdb,0x0c,0x00,0x00,0x01,0x00,0x00,0xdc,0x0c,0x00,0x00,0x01, 0x00,0x00,0xdd,0x0c,0x00,0x00,0x01,0x00,0x00,0xde,0x0c,0x00,0x00,0x01,0x00,0x00, 0xdf,0x0c,0x00,0x00,0x01,0x00,0x00,0xe0,0x0c,0x00,0x00,0x01,0x00,0x00,0xe1,0x0c, 0x00,0x00,0x01,0x00,0x00,0xe2,0x0c,0x00,0x00,0x01,0x00,0x00,0xe3,0x0c,0x00,0x00, 0x01,0x00,0x00,0xe4,0x0c,0x00,0x00,0x01,0x00,0x00,0xe5,0x0c,0x00,0x00,0x01,0x00, 0x00,0xe6,0x0c,0x00,0x00,0x01,0x00,0x00,0xe7,0x0c,0x00,0x00,0x01,0x00,0x00,0xe8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xe9,0x0c,0x00,0x00,0x01,0x00,0x00,0xea,0x0c,0x00, 0x00,0x01,0x00,0x00,0xeb,0x0c,0x00,0x00,0x01,0x00,0x00,0xec,0x0c,0x00,0x00,0x01, 0x00,0x00,0xed,0x0c,0x00,0x00,0x01,0x00,0x00,0xee,0x0c,0x00,0x00,0x01,0x00,0x00, 0xef,0x0c,0x00,0x00,0x01,0x00,0x00,0xf0,0x0c,0x00,0x00,0x01,0x00,0x00,0xf1,0x0c, 0x00,0x00,0x01,0x00,0x00,0xf2,0x0c,0x00,0x00,0x01,0x00,0x00,0xf3,0x0c,0x00,0x00, 0x01,0x00,0x00,0xf4,0x0c,0x00,0x00,0x01,0x00,0x00,0xf5,0x0c,0x00,0x00,0x01,0x00, 0x00,0xf6,0x0c,0x00,0x00,0x01,0x00,0x00,0xf7,0x0c,0x00,0x00,0x01,0x00,0x00,0xf8, 0x0c,0x00,0x00,0x01,0x00,0x00,0xf9,0x0c,0x00,0x00,0x01,0x00,0x00,0xfa,0x0c,0x00, 0x00,0x01,0x00,0x00,0xfb,0x0c,0x00,0x00,0x01,0x00,0x00,0xfc,0x0c,0x00,0x00,0x01, 0x00,0x00,0xfd,0x0c,0x00,0x00,0x01,0x00,0x00,0xfe,0x0c,0x00,0x00,0x01,0x00,0x00, 0xff,0x0c,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x01,0x00,0x00,0x01,0x0d, 0x00,0x00,0x01,0x00,0x00,0x02,0x0d,0x00,0x00,0x01,0x00,0x00,0x03,0x0d,0x00,0x00, 0x01,0x00,0x00,0x04,0x0d,0x00,0x00,0x01,0x00,0x00,0x05,0x0d,0x00,0x00,0x01,0x00, 0x00,0x06,0x0d,0x00,0x00,0x01,0x00,0x00,0x07,0x0d,0x00,0x00,0x01,0x00,0x00,0x08, 0x0d,0x00,0x00,0x01,0x00,0x00,0x09,0x0d,0x00,0x00,0x01,0x00,0x00,0x0a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x0b,0x0d,0x00,0x00,0x01,0x00,0x00,0x0c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x0d,0x0d,0x00,0x00,0x01,0x00,0x00,0x0e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x0f,0x0d,0x00,0x00,0x01,0x00,0x00,0x10,0x0d,0x00,0x00,0x01,0x00,0x00,0x11,0x0d, 0x00,0x00,0x01,0x00,0x00,0x12,0x0d,0x00,0x00,0x01,0x00,0x00,0x13,0x0d,0x00,0x00, 0x01,0x00,0x00,0x14,0x0d,0x00,0x00,0x01,0x00,0x00,0x15,0x0d,0x00,0x00,0x01,0x00, 0x00,0x16,0x0d,0x00,0x00,0x01,0x00,0x00,0x17,0x0d,0x00,0x00,0x01,0x00,0x00,0x18, 0x0d,0x00,0x00,0x01,0x00,0x00,0x19,0x0d,0x00,0x00,0x01,0x00,0x00,0x1a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x1b,0x0d,0x00,0x00,0x01,0x00,0x00,0x1c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x1d,0x0d,0x00,0x00,0x01,0x00,0x00,0x1e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x1f,0x0d,0x00,0x00,0x01,0x00,0x00,0x20,0x0d,0x00,0x00,0x01,0x00,0x00,0x21,0x0d, 0x00,0x00,0x01,0x00,0x00,0x22,0x0d,0x00,0x00,0x01,0x00,0x00,0x23,0x0d,0x00,0x00, 0x01,0x00,0x00,0x24,0x0d,0x00,0x00,0x01,0x00,0x00,0x25,0x0d,0x00,0x00,0x01,0x00, 0x00,0x26,0x0d,0x00,0x00,0x01,0x00,0x00,0x27,0x0d,0x00,0x00,0x01,0x00,0x00,0x28, 0x0d,0x00,0x00,0x01,0x00,0x00,0x29,0x0d,0x00,0x00,0x01,0x00,0x00,0x2a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x2b,0x0d,0x00,0x00,0x01,0x00,0x00,0x2c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x2d,0x0d,0x00,0x00,0x01,0x00,0x00,0x2e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x2f,0x0d,0x00,0x00,0x01,0x00,0x00,0x30,0x0d,0x00,0x00,0x01,0x00,0x00,0x31,0x0d, 0x00,0x00,0x01,0x00,0x00,0x32,0x0d,0x00,0x00,0x01,0x00,0x00,0x33,0x0d,0x00,0x00, 0x01,0x00,0x00,0x34,0x0d,0x00,0x00,0x01,0x00,0x00,0x35,0x0d,0x00,0x00,0x01,0x00, 0x00,0x36,0x0d,0x00,0x00,0x01,0x00,0x00,0x37,0x0d,0x00,0x00,0x01,0x00,0x00,0x38, 0x0d,0x00,0x00,0x01,0x00,0x00,0x39,0x0d,0x00,0x00,0x01,0x00,0x00,0x3a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x3b,0x0d,0x00,0x00,0x01,0x00,0x00,0x3c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x3d,0x0d,0x00,0x00,0x01,0x00,0x00,0x3e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x3f,0x0d,0x00,0x00,0x01,0x00,0x00,0x40,0x0d,0x00,0x00,0x01,0x00,0x00,0x41,0x0d, 0x00,0x00,0x01,0x00,0x00,0x42,0x0d,0x00,0x00,0x01,0x00,0x00,0x43,0x0d,0x00,0x00, 0x01,0x00,0x00,0x44,0x0d,0x00,0x00,0x01,0x00,0x00,0x45,0x0d,0x00,0x00,0x01,0x00, 0x00,0x46,0x0d,0x00,0x00,0x01,0x00,0x00,0x47,0x0d,0x00,0x00,0x01,0x00,0x00,0x48, 0x0d,0x00,0x00,0x01,0x00,0x00,0x49,0x0d,0x00,0x00,0x01,0x00,0x00,0x4a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x4b,0x0d,0x00,0x00,0x01,0x00,0x00,0x4c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x4d,0x0d,0x00,0x00,0x01,0x00,0x00,0x4e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x4f,0x0d,0x00,0x00,0x01,0x00,0x00,0x50,0x0d,0x00,0x00,0x01,0x00,0x00,0x51,0x0d, 0x00,0x00,0x01,0x00,0x00,0x52,0x0d,0x00,0x00,0x01,0x00,0x00,0x53,0x0d,0x00,0x00, 0x01,0x00,0x00,0x54,0x0d,0x00,0x00,0x01,0x00,0x00,0x55,0x0d,0x00,0x00,0x01,0x00, 0x00,0x56,0x0d,0x00,0x00,0x01,0x00,0x00,0x57,0x0d,0x00,0x00,0x01,0x00,0x00,0x58, 0x0d,0x00,0x00,0x01,0x00,0x00,0x59,0x0d,0x00,0x00,0x01,0x00,0x00,0x5a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x5b,0x0d,0x00,0x00,0x01,0x00,0x00,0x5c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x5d,0x0d,0x00,0x00,0x01,0x00,0x00,0x5e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x5f,0x0d,0x00,0x00,0x01,0x00,0x00,0x60,0x0d,0x00,0x00,0x01,0x00,0x00,0x61,0x0d, 0x00,0x00,0x01,0x00,0x00,0x62,0x0d,0x00,0x00,0x01,0x00,0x00,0x63,0x0d,0x00,0x00, 0x01,0x00,0x00,0x64,0x0d,0x00,0x00,0x01,0x00,0x00,0x65,0x0d,0x00,0x00,0x01,0x00, 0x00,0x66,0x0d,0x00,0x00,0x01,0x00,0x00,0x67,0x0d,0x00,0x00,0x01,0x00,0x00,0x68, 0x0d,0x00,0x00,0x01,0x00,0x00,0x69,0x0d,0x00,0x00,0x01,0x00,0x00,0x6a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x6b,0x0d,0x00,0x00,0x01,0x00,0x00,0x6c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x6d,0x0d,0x00,0x00,0x01,0x00,0x00,0x6e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x6f,0x0d,0x00,0x00,0x01,0x00,0x00,0x70,0x0d,0x00,0x00,0x01,0x00,0x00,0x71,0x0d, 0x00,0x00,0x01,0x00,0x00,0x72,0x0d,0x00,0x00,0x01,0x00,0x00,0x73,0x0d,0x00,0x00, 0x01,0x00,0x00,0x74,0x0d,0x00,0x00,0x01,0x00,0x00,0x75,0x0d,0x00,0x00,0x01,0x00, 0x00,0x76,0x0d,0x00,0x00,0x01,0x00,0x00,0x77,0x0d,0x00,0x00,0x01,0x00,0x00,0x78, 0x0d,0x00,0x00,0x01,0x00,0x00,0x79,0x0d,0x00,0x00,0x01,0x00,0x00,0x7a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x7b,0x0d,0x00,0x00,0x01,0x00,0x00,0x7c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x7d,0x0d,0x00,0x00,0x01,0x00,0x00,0x7e,0x0d,0x00,0x00,0x01,0x00,0x00, 0x7f,0x0d,0x00,0x00,0x01,0x00,0x00,0x80,0x0d,0x00,0x00,0x01,0x00,0x00,0x81,0x0d, 0x00,0x00,0x01,0x00,0x00,0x82,0x0d,0x00,0x00,0x01,0x00,0x00,0x83,0x0d,0x00,0x00, 0x01,0x00,0x00,0x84,0x0d,0x00,0x00,0x01,0x00,0x00,0x85,0x0d,0x00,0x00,0x01,0x00, 0x00,0x86,0x0d,0x00,0x00,0x01,0x00,0x00,0x87,0x0d,0x00,0x00,0x01,0x00,0x00,0x88, 0x0d,0x00,0x00,0x01,0x00,0x00,0x89,0x0d,0x00,0x00,0x01,0x00,0x00,0x8a,0x0d,0x00, 0x00,0x01,0x00,0x00,0x8b,0x0d,0x00,0x00,0x01,0x00,0x00,0x8c,0x0d,0x00,0x00,0x01, 0x00,0x00,0x8d,0x0d,0x00,0x00,0x01,0x00,0x00,0x8e,0x0d,0x00,0x00,0x01,0x00,0x00, 0xca,0x00,0x8f,0x0d,0x00,0x00,0x01,0x00,0x90,0x0d,0x00,0x00,0x01,0x00,0x91,0x0d, 0x00,0x00,0x00,0x00,0x92,0x0d,0x00,0x00,0x00,0x00,0x93,0x0d,0x00,0x00,0x00,0x00, 0x94,0x0d,0x00,0x00,0x00,0x00,0x95,0x0d,0x00,0x00,0x00,0x00,0x96,0x0d,0x00,0x00, 0x00,0x00,0x97,0x0d,0x00,0x00,0x00,0x00,0x98,0x0d,0x00,0x00,0x00,0x00,0x99,0x0d, 0x00,0x00,0x00,0x00,0x9a,0x0d,0x00,0x00,0x00,0x00,0x9b,0x0d,0x00,0x00,0x00,0x00, 0x9c,0x0d,0x00,0x00,0x00,0x00,0x9d,0x0d,0x00,0x00,0x00,0x00,0x9e,0x0d,0x00,0x00, 0x00,0x00,0x9f,0x0d,0x00,0x00,0x00,0x00,0xa0,0x0d,0x00,0x00,0x00,0x00,0xa1,0x0d, 0x00,0x00,0x00,0x00,0xa2,0x0d,0x00,0x00,0x00,0x00,0xa3,0x0d,0x00,0x00,0x00,0x00, 0xa4,0x0d,0x00,0x00,0x00,0x00,0xa5,0x0d,0x00,0x00,0x00,0x00,0xa6,0x0d,0x00,0x00, 0x00,0x00,0xa7,0x0d,0x00,0x00,0x00,0x00,0xa8,0x0d,0x00,0x00,0x00,0x00,0xa9,0x0d, 0x00,0x00,0x00,0x00,0xaa,0x0d,0x00,0x00,0x00,0x00,0xab,0x0d,0x00,0x00,0x00,0x00, 0xac,0x0d,0x00,0x00,0x00,0x00,0xad,0x0d,0x00,0x00,0x00,0x00,0xae,0x0d,0x00,0x00, 0x00,0x00,0xaf,0x0d,0x00,0x00,0x00,0x00,0xb0,0x0d,0x00,0x00,0x00,0x00,0xb1,0x0d, 0x00,0x00,0x00,0x00,0xb2,0x0d,0x00,0x00,0x00,0x00,0xb3,0x0d,0x00,0x00,0x00,0x00, 0xb4,0x0d,0x00,0x00,0x00,0x00,0xb5,0x0d,0x00,0x00,0x00,0x00,0xb6,0x0d,0x00,0x00, 0x00,0x00,0xb7,0x0d,0x00,0x00,0x00,0x00,0xb8,0x0d,0x00,0x00,0x00,0x00,0xb9,0x0d, 0x00,0x00,0x00,0x00,0xba,0x0d,0x00,0x00,0x00,0x00,0xbb,0x0d,0x00,0x00,0x00,0x00, 0xbc,0x0d,0x00,0x00,0x00,0x00,0xbd,0x0d,0x00,0x00,0x00,0x00,0xbe,0x0d,0x00,0x00, 0x00,0x00,0xbf,0x0d,0x00,0x00,0x00,0x00,0xc0,0x0d,0x00,0x00,0x00,0x00,0xc1,0x0d, 0x00,0x00,0x00,0x00,0xc2,0x0d,0x00,0x00,0x00,0x00,0xc3,0x0d,0x00,0x00,0x00,0x00, 0xc4,0x0d,0x00,0x00,0x00,0x00,0xc5,0x0d,0x00,0x00,0x00,0x00,0xc6,0x0d,0x00,0x00, 0x00,0x00,0xc7,0x0d,0x00,0x00,0x00,0x00,0xc8,0x0d,0x00,0x00,0x00,0x00,0xc9,0x0d, 0x00,0x00,0x00,0x00,0xca,0x0d,0x00,0x00,0x00,0x00,0xcb,0x0d,0x00,0x00,0x00,0x00, 0xcc,0x0d,0x00,0x00,0x00,0x00,0xcd,0x0d,0x00,0x00,0x00,0x00,0xce,0x0d,0x00,0x00, 0x00,0x00,0xcf,0x0d,0x00,0x00,0x00,0x00,0xd0,0x0d,0x00,0x00,0x00,0x00,0xd1,0x0d, 0x00,0x00,0x00,0x00,0xd2,0x0d,0x00,0x00,0x00,0x00,0xd3,0x0d,0x00,0x00,0x00,0x00, 0xd4,0x0d,0x00,0x00,0x00,0x00,0xd5,0x0d,0x00,0x00,0x00,0x00,0xd6,0x0d,0x00,0x00, 0x00,0x00,0xd7,0x0d,0x00,0x00,0x00,0x00,0xd8,0x0d,0x00,0x00,0x00,0x00,0xd9,0x0d, 0x00,0x00,0x00,0x00,0xda,0x0d,0x00,0x00,0x00,0x00,0xdb,0x0d,0x00,0x00,0x00,0x00, 0xdc,0x0d,0x00,0x00,0x00,0x00,0xdd,0x0d,0x00,0x00,0x00,0x00,0xde,0x0d,0x00,0x00, 0x00,0x00,0xdf,0x0d,0x00,0x00,0x00,0x00,0xe0,0x0d,0x00,0x00,0x00,0x00,0xe1,0x0d, 0x00,0x00,0x00,0x00,0xe2,0x0d,0x00,0x00,0x00,0x00,0xe3,0x0d,0x00,0x00,0x00,0x00, 0xe4,0x0d,0x00,0x00,0x00,0x00,0xe5,0x0d,0x00,0x00,0x00,0x00,0xe6,0x0d,0x00,0x00, 0x00,0x00,0xe7,0x0d,0x00,0x00,0x00,0x00,0xe8,0x0d,0x00,0x00,0x00,0x00,0xe9,0x0d, 0x00,0x00,0x00,0x00,0xea,0x0d,0x00,0x00,0x00,0x00,0xeb,0x0d,0x00,0x00,0x00,0x00, 0xec,0x0d,0x00,0x00,0x00,0x00,0xed,0x0d,0x00,0x00,0x00,0x00,0xee,0x0d,0x00,0x00, 0x00,0x00,0xef,0x0d,0x00,0x00,0x00,0x00,0xf0,0x0d,0x00,0x00,0x00,0x00,0xf1,0x0d, 0x00,0x00,0x00,0x00,0xf2,0x0d,0x00,0x00,0x00,0x00,0xf3,0x0d,0x00,0x00,0x00,0x00, 0xf4,0x0d,0x00,0x00,0x00,0x00,0xf5,0x0d,0x00,0x00,0x00,0x00,0xf6,0x0d,0x00,0x00, 0x00,0x00,0xf7,0x0d,0x00,0x00,0x00,0x00,0xf8,0x0d,0x00,0x00,0x00,0x00,0xf9,0x0d, 0x00,0x00,0x00,0x00,0xfa,0x0d,0x00,0x00,0x00,0x00,0xfb,0x0d,0x00,0x00,0x00,0x00, 0xfc,0x0d,0x00,0x00,0x00,0x00,0xfd,0x0d,0x00,0x00,0x00,0x00,0xfe,0x0d,0x00,0x00, 0x00,0x00,0xff,0x0d,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x01,0x0e, 0x00,0x00,0x00,0x00,0x02,0x0e,0x00,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x00,0x00, 0x04,0x0e,0x00,0x00,0x00,0x00,0x05,0x0e,0x00,0x00,0x00,0x00,0x06,0x0e,0x00,0x00, 0x00,0x00,0x07,0x0e,0x00,0x00,0x00,0x00,0x08,0x0e,0x00,0x00,0x00,0x00,0x09,0x0e, 0x00,0x00,0x00,0x00,0x0a,0x0e,0x00,0x00,0x00,0x00,0x0b,0x0e,0x00,0x00,0x00,0x00, 0x0c,0x0e,0x00,0x00,0x00,0x00,0x0d,0x0e,0x00,0x00,0x00,0x00,0x0e,0x0e,0x00,0x00, 0x00,0x00,0x0f,0x0e,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0x00,0x00,0x00,0x11,0x0e, 0x00,0x00,0x00,0x00,0x12,0x0e,0x00,0x00,0x00,0x00,0x13,0x0e,0x00,0x00,0x00,0x00, 0x14,0x0e,0x00,0x00,0x00,0x00,0x15,0x0e,0x00,0x00,0x00,0x00,0x16,0x0e,0x00,0x00, 0x00,0x00,0x17,0x0e,0x00,0x00,0x00,0x00,0x18,0x0e,0x00,0x00,0x00,0x00,0x19,0x0e, 0x00,0x00,0x00,0x00,0x1a,0x0e,0x00,0x00,0x00,0x00,0x1b,0x0e,0x00,0x00,0x00,0x00, 0x1c,0x0e,0x00,0x00,0x00,0x00,0x1d,0x0e,0x00,0x00,0x00,0x00,0x1e,0x0e,0x00,0x00, 0x00,0x00,0x1f,0x0e,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x00,0x21,0x0e, 0x00,0x00,0x00,0x00,0x22,0x0e,0x00,0x00,0x00,0x00,0x23,0x0e,0x00,0x00,0x00,0x00, 0x24,0x0e,0x00,0x00,0x00,0x00,0x25,0x0e,0x00,0x00,0x00,0x00,0x26,0x0e,0x00,0x00, 0x00,0x00,0x27,0x0e,0x00,0x00,0x00,0x00,0x28,0x0e,0x00,0x00,0x00,0x00,0x29,0x0e, 0x00,0x00,0x00,0x00,0x2a,0x0e,0x00,0x00,0x00,0x00,0x2b,0x0e,0x00,0x00,0x00,0x00, 0x2c,0x0e,0x00,0x00,0x00,0x00,0x2d,0x0e,0x00,0x00,0x00,0x00,0x2e,0x0e,0x00,0x00, 0x00,0x00,0x2f,0x0e,0x00,0x00,0x00,0x00,0x30,0x0e,0x00,0x00,0x00,0x00,0x31,0x0e, 0x00,0x00,0x00,0x00,0x32,0x0e,0x00,0x00,0x00,0x00,0x33,0x0e,0x00,0x00,0x00,0x00, 0x34,0x0e,0x00,0x00,0x00,0x00,0x35,0x0e,0x00,0x00,0x00,0x00,0x36,0x0e,0x00,0x00, 0x00,0x00,0x37,0x0e,0x00,0x00,0x00,0x00,0x38,0x0e,0x00,0x00,0x00,0x00,0x39,0x0e, 0x00,0x00,0x00,0x00,0x3a,0x0e,0x00,0x00,0x00,0x00,0x3b,0x0e,0x00,0x00,0x00,0x00, 0x3c,0x0e,0x00,0x00,0x00,0x00,0x3d,0x0e,0x00,0x00,0x00,0x00,0x3e,0x0e,0x00,0x00, 0x00,0x00,0x3f,0x0e,0x00,0x00,0x00,0x00,0x40,0x0e,0x00,0x00,0x00,0x00,0x41,0x0e, 0x00,0x00,0x00,0x00,0x42,0x0e,0x00,0x00,0x00,0x00,0x43,0x0e,0x00,0x00,0x00,0x00, 0x44,0x0e,0x00,0x00,0x00,0x00,0x45,0x0e,0x00,0x00,0x00,0x00,0x46,0x0e,0x00,0x00, 0x00,0x00,0x47,0x0e,0x00,0x00,0x00,0x00,0x48,0x0e,0x00,0x00,0x00,0x00,0x49,0x0e, 0x00,0x00,0x00,0x00,0x4a,0x0e,0x00,0x00,0x00,0x00,0x4b,0x0e,0x00,0x00,0x00,0x00, 0x4c,0x0e,0x00,0x00,0x00,0x00,0x4d,0x0e,0x00,0x00,0x00,0x00,0x4e,0x0e,0x00,0x00, 0x00,0x00,0x4f,0x0e,0x00,0x00,0x00,0x00,0x50,0x0e,0x00,0x00,0x00,0x00,0x51,0x0e, 0x00,0x00,0x00,0x00,0x52,0x0e,0x00,0x00,0x00,0x00,0x53,0x0e,0x00,0x00,0x00,0x00, 0x54,0x0e,0x00,0x00,0x00,0x00,0x55,0x0e,0x00,0x00,0x00,0x00,0x56,0x0e,0x00,0x00, 0x00,0x00,0x57,0x0e,0x00,0x00,0x00,0x00,0x58,0x0e,0x00,0x00,0x00,0x00,0x00,0x02, 0x59,0x0e,0x00,0x00,0x01,0x00,0x00,0x5a,0x0e,0x00,0x00,0x01,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00, 0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21, 0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00, 0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x38,0x00, 0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x00,0x26,0x00,0x00,0x00, 0x40,0x00,0x04,0x00,0x00,0x27,0x00,0x00,0x00,0x44,0x00,0x04,0x00,0xbc,0xe5,0x01, 0x00,0x89,0x1f,0x01,0x00,0x03,0x00,0x5b,0x0e,0x00,0x00,0x17,0x67,0x65,0x6e,0x78, 0x5f,0x63,0x6f,0x70,0x79,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x31,0x33,0x2e, 0x61,0x73,0x6d,0x5c,0x0e,0x00,0x00,0x00,0x5d,0x0e,0x00,0x00,0x01,0x00,0x30,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x80,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x04, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x01,0x00,0x29, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x20,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0xe0,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x60,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0c,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x14,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xf0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xe8,0xff,0xff, 0xff,0x24,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x05,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x02,0x00, 0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x18,0x00,0x00,0x00,0x2c, 0x00,0x02,0x02,0x03,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x10,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x04,0x00,0x00,0x24,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x05,0x00,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x32,0x00, 0x01,0x80,0x33,0x00,0x29,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0xf8,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x45, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x06,0x00,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x05, 0x00,0x2d,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x02,0x00,0x29,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x00,0x00,0x05,0x00,0x31,0x02,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x00, 0x03,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x05,0x00,0x31,0x03, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x02,0x00,0x04,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x05,0x00,0x31,0x04,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x77, 0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x05, 0x00,0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00, 0x02,0x07,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00, 0x00,0x00,0x32,0x00,0x07,0x00,0x07,0x00,0x31,0x06,0x00,0x24,0x00,0x00,0x00,0x00, 0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x08,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x08,0x80,0x06,0x00, 0x31,0x07,0x00,0x2c,0x00,0x04,0x02,0x09,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x09,0x00,0x1b,0x00,0x2c,0x00, 0x00,0x02,0x0a,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03, 0x00,0x00,0x00,0x32,0x00,0x0a,0x00,0x11,0x00,0x2c,0x00,0x00,0x02,0x0b,0x00,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00, 0x0b,0x80,0x33,0x00,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x49,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x49,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0d, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x15,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0e, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x1a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0f, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x17,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x1b,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x0c,0x00,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x0c,0x80,0x09,0x00,0x31, 0x08,0x00,0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x53,0x00,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x53,0x00,0x00,0x00, 0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x53,0x00,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x13,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x53,0x00, 0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x1f,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x2d, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0x50,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x50,0x00,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x50, 0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x0d,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x0d,0x80,0x09,0x00,0x29,0x00, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x08,0x00,0x31,0x09,0x00,0x2c,0x00,0x04, 0x02,0x0e,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0x0e,0x00,0x0d,0x00,0x2c,0x00,0x04,0x02,0x0f,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x0f, 0x80,0x0b,0x00,0x25,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x30, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x34,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0x10,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x10,0x00,0x0a,0x00,0x01,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x36,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x39,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x08,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x3c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x08,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3d,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x02, 0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x73, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x76, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x42,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0, 0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x43, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x45,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x44,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x46,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x08,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x44,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x01,0x01,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x48,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x08,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x44,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x02, 0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x0b,0x00,0x32,0x00,0x06,0x00,0x0c,0x00,0x2b, 0x00,0x02,0x11,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x11,0x80,0x33,0x00, 0x25,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x4b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x91,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x93, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x93,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x94,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x52,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53, 0x00,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x98,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x56,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x57,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x02, 0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa2, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa3,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x5a,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x5b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x08,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5c,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x5a,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x5d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x08,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x5a,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x02, 0x01,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x5f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x08,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x60,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x60,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x5a, 0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x33, 0x00,0x31,0x0c,0x00,0x25,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0x63,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb6,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb8, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xb9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x66,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53, 0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x67,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc0,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcb,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x08,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x70,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x00,0x01, 0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x72,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x08,0x00,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xd3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x70,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0, 0x01,0x01,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x74,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x08, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0xd7, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd8,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x70,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x76,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x70,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00, 0x33,0x00,0x31,0x0d,0x00,0x2c,0x00,0x04,0x02,0x12,0x00,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x12,0x00,0x0f,0x00, 0x25,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x78,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xdc, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x13,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x13,0x00,0x0e,0x00,0x01, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe1,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe7, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7e,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x7f,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x80,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x08,0x00,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xec,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x81,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x7f,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60, 0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x82,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x7f,0x08, 0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0x33,0x00, 0x31,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xef, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf1,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf2,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x84,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x08,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x87,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x33, 0x00,0x31,0x0f,0x00,0x2c,0x00,0x00,0x02,0x14,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x14,0x00,0x10,0x00,0x2c, 0x00,0x00,0x02,0x15,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x15,0x80,0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x2e, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x88,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xfa,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x8a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x08,0x00,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x10,0x00,0x25,0x00,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x8d,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x53,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x53,0x00,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x90,0x08,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x91,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x90,0x08,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x11,0x00,0x29, 0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x49, 0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x05,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x19,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x78, 0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x1a,0x00,0x00,0x02, 0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c, 0x00,0x04,0x02,0x16,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0x16,0x80,0x13,0x00,0x31,0x12,0x00,0x29,0x00,0x00, 0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x02, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x09,0x01,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x0a,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x09,0x01,0x00, 0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x06,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x16,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x09, 0x01,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00, 0x00,0x07,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x02,0x00,0x00,0x00, 0x00,0x09,0x01,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0x92,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00, 0x06,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00, 0xe0,0xfe,0x01,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x02,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x06,0x01,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0xff,0x01,0x00, 0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02, 0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x06,0x01, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x60,0x01, 0x01,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0x17,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0x17,0x80,0x13,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0x12,0x00,0x31,0x13,0x00,0x2c,0x00,0x04,0x02,0x18,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x18, 0x00,0x17,0x00,0x2c,0x00,0x04,0x02,0x19,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x19,0x80,0x15,0x00,0x25,0x00, 0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x94,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0c,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x95,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09, 0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x96,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02, 0x1a,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x32,0x00,0x1a,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x99,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x08,0x00, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x16,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9b,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x9a, 0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x9d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x08,0x00,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9e,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x02,0x32,0x00,0x00, 0x00,0x33,0x00,0x31,0x14,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x9f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x08,0x00,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa1,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xa0,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xa2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x08,0x00,0x00,0x00, 0x00,0x09,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa3,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0xa0,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x01, 0x01,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xa4,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x08,0x00, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0xc0,0x02,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x15,0x00,0x32,0x00,0x06,0x00,0x16, 0x00,0x2b,0x00,0x02,0x1b,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x1b,0x80, 0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xa7,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2c,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x09,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xaa,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xab,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x34, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x36,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x37,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x09,0x01,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xae,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x08,0x00, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb0,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xaf, 0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xb2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x08,0x00,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb3,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0xaf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x02,0x01,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xb4,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x08,0x00,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb5,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xaf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x03,0x01, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xb6,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x08,0x00,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x16, 0x00,0x25,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xb8,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4a,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xba,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09, 0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x52,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x53,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbe,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xbf, 0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x57, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xc0,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x08,0x00,0x00,0x00,0x00,0x09,0x01, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0xbf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xc2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x08,0x00,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc3,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xbf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc4,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xbf,0x08,0x00,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc5,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xbf,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40, 0x03,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x17,0x00,0x2c,0x00,0x04,0x02,0x1c,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x1c,0x00,0x19,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xc7,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x64,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x66,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x1d,0x00,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x1d,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x69,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xca, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcb,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcc,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xcb,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xcd,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xcb,0x08,0x00,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xce,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xcb,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0xc0,0x01,0x32,0x00, 0x00,0x00,0x33,0x00,0x31,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xcf,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x08,0x00, 0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x71,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x72,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd1,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd2,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd0, 0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x33, 0x00,0x31,0x19,0x00,0x2c,0x00,0x00,0x02,0x1e,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x1e,0x00,0x1a,0x00,0x2c, 0x00,0x00,0x02,0x1f,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x1f,0x80,0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x2e, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xd3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd4,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd5,0x08, 0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x33,0x00, 0x31,0x1a,0x00,0x25,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xd7, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x79,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x09,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd8,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xd9,0x08,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xda,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xd9,0x08,0x00,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x1b,0x00,0x2c,0x00, 0x00,0x02,0x20,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x32,0x00,0x20,0x00,0x23,0x00,0x2c,0x00,0x00,0x02,0x21,0x00,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x21,0x80,0x33,0x00,0x29,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x49,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x49,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x80,0x01,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x22,0x00,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x22,0x80,0x1d,0x00,0x31, 0x1c,0x00,0x29,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7d,0x01,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x80,0x01,0x00,0x00, 0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x80,0x01,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7d, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x10,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x80,0x01, 0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x7d,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x1c,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x03,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0xdb, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x03,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0x7d,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x7d,0x01,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x7d, 0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x23,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x23,0x80,0x1d,0x00,0x29,0x00, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x1c,0x00,0x31,0x1d,0x00,0x2c,0x00,0x04, 0x02,0x24,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0x24,0x00,0x20,0x00,0x2c,0x00,0x04,0x02,0x25,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x25, 0x80,0x1e,0x00,0x24,0x03,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0xdc,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xdd,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x08,0x00,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xde,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xdc,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xdf,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x08,0x00,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe0,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xdc,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0x26,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x26,0x80,0x33,0x00,0x01,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe1,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xdc,0x08,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x1e,0x00,0x32,0x00, 0x06,0x00,0x1f,0x00,0x2b,0x00,0x02,0x27,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x27,0x80,0x33,0x00,0x24,0x03,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xe2,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xe2,0x08,0x00,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe4,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xe2,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe5,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xe2,0x08, 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x92, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x93,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xe2,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x94,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe7,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xe2,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe8,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xe2,0x08,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xe2,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x03,0x32,0x00, 0x00,0x00,0x33,0x00,0x31,0x1f,0x00,0x24,0x03,0x00,0x00,0x00,0x99,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xea,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xeb,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x08, 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x9c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xec, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xed,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0xea,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xee,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x08,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xea,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xf0,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xea,0x08,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x20,0x00, 0x2c,0x00,0x04,0x02,0x28,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x28,0x00,0x21,0x00,0x24,0x03,0x00,0x00,0x00, 0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf1,0x08,0x00,0x00,0x00,0x00,0x80, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf2,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xf1,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xf3,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf1,0x08,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x29,0x00,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x29,0x00, 0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf4,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf1, 0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x33, 0x00,0x31,0x21,0x00,0x2c,0x00,0x00,0x02,0x2a,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x2a,0x00,0x22,0x00,0x2c, 0x00,0x00,0x02,0x2b,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x2b,0x80,0x33,0x00,0x24,0x03,0x00,0x00,0x00,0xab, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf5,0x08,0x00,0x00,0x00,0x00,0x80,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x22,0x00,0x24,0x03,0x00, 0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf6,0x08,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0xf6,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00, 0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x23,0x00,0x29,0x03,0x00,0x00,0x00,0xb1,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x49,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xb1,0x01,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x49, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x49,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x09,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xb1,0x01,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00, 0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x1d,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x2c,0x00,0x00, 0x4a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x2c,0x80,0x25,0x00,0x31,0x24,0x00,0x29,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x05, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0xb1,0x01,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x01, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x0d,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb1,0x01,0x00, 0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xae,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x19,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xb1, 0x01,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x0e, 0x00,0x21,0x01,0x00,0xf8,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x04,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0xae,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xae,0x01,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xae,0x01, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x2d,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x2d, 0x80,0x25,0x00,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x24,0x00,0x31, 0x25,0x00,0x2c,0x00,0x04,0x02,0x2e,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x2e,0x00,0x29,0x00,0x2c,0x00,0x04, 0x02,0x2f,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x2f,0x80,0x27,0x00,0x25,0x00,0x00,0x00,0x00,0xb2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf9,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0xfa,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb7,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb9,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xb1,0x01,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x30,0x00,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x30,0x00,0x26, 0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xbd,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x02,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x00,0x00,0x00,0x00,0xb1, 0x01,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x01,0x01,0x00, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x04,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x00,0x00,0x00, 0x00,0xb1,0x01,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x26,0x00, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xc6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x06,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x07,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x09,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x08,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x06,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20, 0x01,0x01,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x09,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x09, 0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xce, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcf,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0a, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x06,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0b,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x06,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00, 0x33,0x00,0x31,0x27,0x00,0x32,0x00,0x06,0x00,0x28,0x00,0x2b,0x00,0x02,0x31,0x00, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x31,0x80,0x33,0x00,0x25,0x00,0x00,0x00, 0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x0d,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xb1,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd8, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xda,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xdb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdc,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0xb1,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x13,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xe1,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x14, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x15,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x17,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x09,0x00,0x00,0x00,0x00,0xb1, 0x01,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x15,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x01,0x01,0x00, 0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x19,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x09,0x00,0x00,0x00, 0x00,0xb1,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1a,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x15,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x02, 0x01,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x1b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x09,0x00, 0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xee,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1c,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x15,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00, 0xa0,0x03,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x28,0x00,0x25,0x00,0x00,0x00,0x00, 0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x1e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb1, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf6,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf8,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xf9,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xb1,0x01,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x24,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x09,0x00,0x00,0x00,0x00,0xb1, 0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x26,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x27,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x09,0x00,0x00,0x00, 0x00,0xb1,0x01,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x28,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x01, 0x01,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x29,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x09,0x00, 0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x06,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x07,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2a,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00, 0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0x33, 0x00,0x31,0x29,0x00,0x2c,0x00,0x04,0x02,0x32,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x32,0x00,0x2b,0x00,0x25, 0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x2d,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0xb1,0x01,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00, 0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x33,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x33,0x00,0x2a,0x00,0x01,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x31,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x32,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x09,0x00,0x00,0x00,0x00, 0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x31,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x20,0x01,0x01, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x34,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x09,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x2a, 0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x18,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x35, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x19,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x37,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x36,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x38,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x09,0x00,0x00,0x00,0x00,0xb1, 0x01,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x2b,0x00,0x2c,0x00, 0x00,0x02,0x34,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0x34,0x00,0x2c,0x00,0x2c,0x00,0x00,0x02,0x35,0x00,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00, 0x35,0x80,0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x39,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x1e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x3a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x09,0x00,0x00,0x00,0x00,0xb1,0x01, 0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x2c,0x00,0x25,0x00,0x00, 0x00,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x3d,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xb1,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x01, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x3e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x09,0x00,0x00,0x00,0x00, 0xb1,0x01,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x3f,0x09,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0xa0,0x00,0x32, 0x00,0x00,0x00,0x33,0x00,0x31,0x2d,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x27, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x79,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04, 0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x26,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2c,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x2c,0x00,0x04,0x02,0x36,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x36,0x00,0x30,0x00,0x2c,0x00,0x04, 0x02,0x37,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0x37,0x80,0x2e,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x41,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x31,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x33,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x28,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x35,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x38,0x00,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x38,0x80,0x33, 0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x36,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x02,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x33,0x00,0x31,0x2e,0x00,0x32,0x00,0x06,0x00,0x2f,0x00,0x2b,0x00,0x02, 0x39,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x39,0x80,0x33,0x00,0x25,0x00, 0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x37, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x46,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x48,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x3f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x41,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x43,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2b,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x02,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x2f,0x00,0x25,0x00,0x00,0x00, 0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x45,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x4d,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2a,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x02, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x30,0x00,0x2c,0x00,0x04, 0x02,0x3a,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x3a,0x00,0x31,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x53,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x02,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x55,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0x3b,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x3b,0x00,0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x02, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x31,0x31,0x00,0x2c,0x00,0x00, 0x02,0x3c,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0x3c,0x00,0x32,0x00,0x2c,0x00,0x00,0x02,0x3d,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x3d, 0x80,0x33,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x56, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x33,0x00,0x31,0x32,0x00,0x25,0x00,0x00,0x00,0x00,0x2e,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03, 0x07,0x00,0x57,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x59, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x02,0x00,0x00,0x00,0x00,0x31,0x33,0x00, 0x29,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x3e,0x00,0x00,0x58,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x23,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x3e,0x80, 0x65,0x00,0x01,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x5a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x45,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x5f,0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x3f,0x00, 0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32, 0x00,0x05,0x00,0x5f,0x00,0x29,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x34,0x00,0x29,0x00, 0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x37,0x00,0x31,0x34,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00, 0x03,0x00,0x35,0x00,0x29,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x37,0x00, 0x31,0x35,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x36,0x00,0x29,0x00,0x00,0x00,0x00,0x60, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x00,0x00,0x37,0x00,0x31,0x36,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x29,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x77,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x60, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x31,0x37,0x00,0x29,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x65,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x00,0x02,0x40,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x00,0x00,0x00,0x32,0x00,0x40,0x00,0x39,0x00,0x31,0x38,0x00,0x24,0x00,0x00, 0x00,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x05,0x00,0x00,0x00, 0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5b,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x63,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x41,0x00,0x00,0x63,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x41,0x80, 0x38,0x00,0x31,0x39,0x00,0x2c,0x00,0x04,0x02,0x42,0x00,0x00,0x61,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x42,0x00,0x4d,0x00, 0x2c,0x00,0x00,0x02,0x43,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x43,0x00,0x43,0x00,0x2c,0x00,0x00,0x02,0x44, 0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x32,0x00,0x44,0x80,0x65,0x00,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x5f,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x0c,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0x5f,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x5f,0x02, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x09,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x15,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x0a,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x0e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x16,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x0b,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x0f,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x17,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x1b,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x45,0x00,0x00,0x60,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x45,0x80,0x3b, 0x00,0x31,0x3a,0x00,0x29,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x69,0x02,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x66, 0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x07,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x69,0x02, 0x00,0x00,0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00, 0x03,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x66,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x13,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x05,0x00,0x02,0x00, 0x69,0x02,0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x66,0x02,0x00, 0x00,0x00,0x06,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x69,0x02,0x00,0x00, 0x1f,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x28,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x10,0x00,0x21,0x01, 0x00,0x5d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00, 0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x66,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0xff,0x01, 0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x06,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x03,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x66, 0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0, 0x00,0x01,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x06,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00, 0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0xe0,0x01,0x01,0x00,0x02, 0x00,0x66,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x68,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x46,0x00,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x46,0x80,0x3b,0x00, 0x29,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x3a,0x00,0x31,0x3b,0x00,0x2c, 0x00,0x04,0x02,0x47,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x32,0x00,0x47,0x00,0x3f,0x00,0x2c,0x00,0x04,0x02,0x48,0x00, 0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x48,0x80,0x3d,0x00,0x25,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x60,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x6f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x70,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x71,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00, 0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x49,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x49,0x00,0x3c,0x00,0x01,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69, 0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x66,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x7b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x68,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x6a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x09,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6b,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x69,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x01, 0x01,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x6c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x09,0x00, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00, 0x60,0x02,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x3c,0x00,0x01,0x00,0x00,0x00,0x00, 0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x86, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x86,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x00,0x01, 0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00, 0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x73,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x09,0x00,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x75,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x74,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x00,0x01,0x00, 0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x76,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x09,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x77,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x74,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x01, 0x01,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x78,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x09,0x00, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x79,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x74,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00, 0xe0,0x02,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x3d,0x00,0x32,0x00,0x3f,0x00,0x3e, 0x00,0x2b,0x00,0x02,0x4a,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x4a,0x80, 0x65,0x00,0x25,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x7b,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x9f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xa0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa7, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa9,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xaa, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xab,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x69,0x02,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb0,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0xb1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb2, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb2,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xb3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x86,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69, 0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x87,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00, 0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x03,0x01, 0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb9,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xba,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x89,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x8a,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x8b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x8a,0x09,0x00,0x00,0x00, 0x00,0x69,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8c,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x8a,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x01, 0x01,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x8d,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x8a,0x09,0x00, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xc2,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8e,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x8a,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00, 0x60,0x02,0x01,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x8a, 0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00, 0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc7, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x90,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x8a,0x09,0x00,0x00,0x00,0x00,0x69,0x02, 0x00,0x00,0x60,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x91,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x8a,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x03,0x32,0x00,0x00, 0x00,0x65,0x00,0x31,0x3e,0x00,0x25,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x92,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x93,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xcc, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xce,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xcf, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x69,0x02,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02, 0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x98,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80, 0x02,0x01,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x03,0x01,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd7, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd7,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9a,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69, 0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9b,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xdf,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe1,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe2,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x9f,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x09,0x00,0x00, 0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xe5,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa1,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xa0,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0, 0x00,0x01,0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xa2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x09, 0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xe9, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xea,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa3, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xeb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa4,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xa0,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00, 0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xee,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xa0,0x09,0x00,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa6,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0xa0,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x03,0x32,0x00, 0x00,0x00,0x65,0x00,0x31,0x3f,0x00,0x2c,0x00,0x04,0x02,0x4b,0x00,0x00,0x5e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x4b,0x00, 0x41,0x00,0x25,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xa8,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x4c,0x00,0x00,0x5e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x4c,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xf7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xf8, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf8,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xf9,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xac,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69, 0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xad,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00, 0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x01,0x01, 0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xff,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xae,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xaf,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x09, 0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x02, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb1, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xaf,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb2,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0xaf,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00, 0x65,0x00,0x31,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x07,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x08,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb5, 0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00, 0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0c, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xb6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xb5,0x09,0x00,0x00,0x00,0x00,0x69,0x02, 0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb7,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xb5,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x01,0x32,0x00,0x00, 0x00,0x65,0x00,0x31,0x41,0x00,0x2c,0x00,0x00,0x02,0x4d,0x00,0x00,0x5e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x4d,0x00,0x42, 0x00,0x2c,0x00,0x00,0x02,0x4e,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x4e,0x80,0x65,0x00,0x25,0x00,0x00,0x00, 0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xb8,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xba,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x09,0x00,0x00,0x00,0x00, 0x69,0x02,0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x42,0x00,0x25, 0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xbd,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x69,0x02,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x18, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x69,0x02,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x19,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbf,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xc0,0x09,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xc1,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x09,0x00,0x00, 0x00,0x00,0x69,0x02,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x43, 0x00,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0x5f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x5f,0x02,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x0d,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x19,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x0e,0x00,0x00,0x02, 0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x78,0x04,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x1a,0x00, 0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00,0x22, 0x01,0x2c,0x00,0x04,0x02,0x4f,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x4f,0x80,0x45,0x00,0x31,0x44,0x00,0x29, 0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x03,0x00, 0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x1c,0x03,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x0a,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x1f, 0x03,0x00,0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x16, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x1f,0x03,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x03, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x1f,0x03,0x00,0x00,0x1e,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x07,0x00, 0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0xc2,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0xfe,0x01,0x00, 0x02,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07, 0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x1c,0x03,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x1c,0x03, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0xff, 0x01,0x00,0x02,0x00,0x1c,0x03,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x07,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x1c,0x03,0x00,0x00,0x00,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00, 0x1c,0x03,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x07,0x00,0x00, 0x60,0x01,0x01,0x00,0x02,0x00,0x1c,0x03,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x07,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x1c,0x03,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0x50,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x50,0x80,0x45,0x00,0x29,0x00,0x00,0x00,0x00, 0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x44,0x00,0x31,0x45,0x00,0x2c,0x00,0x04,0x02,0x51,0x00, 0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32, 0x00,0x51,0x00,0x49,0x00,0x2c,0x00,0x04,0x02,0x52,0x00,0x00,0x5e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x52,0x80,0x47,0x00, 0x25,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc4,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x22, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x23,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x1f,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc7,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x29,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x02,0x2c,0x00, 0x00,0x02,0x53,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x32,0x00,0x53,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc9,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xca, 0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x2c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2d, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xcb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xca,0x09,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcc,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xca,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xcd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xca,0x09,0x00,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xce,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xca,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x02,0x32, 0x00,0x00,0x00,0x65,0x00,0x31,0x46,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f, 0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xcf,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00, 0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd1,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xd2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00, 0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3b,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd3,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0, 0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xd5,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x09,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x47,0x00,0x32,0x00,0x3f, 0x00,0x48,0x00,0x2b,0x00,0x02,0x54,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x54,0x80,0x65,0x00,0x25,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0xd7,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x42,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x43,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x44, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x44,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x45,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f, 0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x4d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x4d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xde,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdf, 0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x50,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xe0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x09,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xdf,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xe2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x09,0x00,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x56,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe3,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xdf,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x09,0x00,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x5a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe5,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xdf,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40, 0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x09, 0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0x65,0x00, 0x31,0x48,0x00,0x25,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xe8, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x60,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x61, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x1f,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x63,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xeb,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xec,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00, 0x02,0x01,0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x68,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x69,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xee,0x09,0x00,0x00,0x00,0x00,0x21, 0x01,0xef,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xf0,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x09,0x00,0x00,0x00,0x00, 0x1f,0x03,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf1,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0xef,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x01, 0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xf2,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x09,0x00,0x00, 0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x73,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf3,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0xef,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40, 0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xf4,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x09, 0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x76,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf5, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00, 0x00,0x40,0x03,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x49,0x00,0x2c,0x00,0x04,0x02, 0x55,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0x55,0x00,0x4b,0x00,0x25,0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0xf7,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x7a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7c,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x56, 0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x56,0x00,0x4a,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xfa,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0x1f, 0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x83,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xfd,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00, 0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0xfb,0x09,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0xc0,0x01, 0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x4a,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xff,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0a,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x87,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x88, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x01,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0a,0x00,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x0a,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x01,0x32,0x00,0x00, 0x00,0x65,0x00,0x31,0x4b,0x00,0x2c,0x00,0x00,0x02,0x57,0x00,0x00,0x5e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x57,0x00,0x4c, 0x00,0x2c,0x00,0x00,0x02,0x58,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x58,0x80,0x65,0x00,0x25,0x00,0x00,0x00, 0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x1f,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x0a,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00, 0x65,0x00,0x31,0x4c,0x00,0x25,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x07,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x8f,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x90,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x08,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x09,0x0a,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x0a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x09,0x0a,0x00,0x00,0x00, 0x00,0x1f,0x03,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x4d,0x00, 0x2c,0x00,0x00,0x02,0x59,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x59,0x00,0x55,0x00,0x2c,0x00,0x00,0x02,0x5a, 0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0x5a,0x80,0x65,0x00,0x29,0x03,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x96,0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x08,0x00,0x00,0x02,0x00, 0x5f,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x0c,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x14,0x00,0x00, 0x02,0x00,0x5f,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x96, 0x03,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x5f,0x02, 0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x5b,0x00,0x00,0x60,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x5b,0x80,0x4f, 0x00,0x31,0x4e,0x00,0x29,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x93, 0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x04,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x96,0x03, 0x00,0x00,0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00, 0x03,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x93,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x10,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x05,0x00,0x02,0x00, 0x96,0x03,0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x93,0x03,0x00, 0x00,0x00,0x06,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x96,0x03,0x00,0x00, 0x1c,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x28,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x0d,0x00,0x21,0x01, 0x00,0x0b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00, 0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x93,0x03,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0xff,0x01, 0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x08,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x03,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x93, 0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0, 0x00,0x01,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x08,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00, 0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0xe0,0x01,0x01,0x00,0x02, 0x00,0x93,0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x95,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x5c,0x00,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x5c,0x80,0x4f,0x00, 0x29,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x4e,0x00,0x31,0x4f,0x00,0x2c, 0x00,0x04,0x02,0x5d,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x05,0x00,0x00,0x00,0x32,0x00,0x5d,0x00,0x52,0x00,0x2c,0x00,0x04,0x02,0x5e,0x00, 0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x5e,0x80,0x50,0x00,0x24,0x03,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x0c,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x0d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x0a,0x00,0x00, 0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0e,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x0f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x0a, 0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x9e, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x10, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x5f,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x5f,0x80,0x65,0x00,0x01,0x00, 0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x11,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x0a,0x00,0x00,0x00, 0x00,0x96,0x03,0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x50,0x00, 0x32,0x00,0x3f,0x00,0x51,0x00,0x2b,0x00,0x02,0x60,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0x60,0x80,0x65,0x00,0x24,0x03,0x00,0x00,0x00,0xa1,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x12,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x13,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x0a, 0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xa4, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa5,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x14, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x15,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x12,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x16,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x0a,0x00,0x00,0x00,0x00,0x96, 0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xaa,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x17,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x12,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x18,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x12,0x0a,0x00,0x00,0x00, 0x00,0x96,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x12,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x03, 0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x51,0x00,0x24,0x03,0x00,0x00,0x00,0xaf,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x1a,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x1a,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x1a,0x0a,0x00,0x00,0x00,0x00,0x96, 0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x1a,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x1a,0x0a,0x00,0x00,0x00, 0x00,0x96,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1f,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x1a,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x20,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x1a,0x0a,0x00, 0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0x65,0x00,0x31, 0x52,0x00,0x2c,0x00,0x04,0x02,0x61,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x61,0x00,0x53,0x00,0x24,0x03,0x00, 0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x0a,0x00,0x00,0x00, 0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x23,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x0a,0x00, 0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x62,0x00,0x00, 0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x62,0x00,0x65,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x24,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x21,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x80,0x01,0x32,0x00,0x00, 0x00,0x65,0x00,0x31,0x53,0x00,0x2c,0x00,0x00,0x02,0x63,0x00,0x00,0x5e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x63,0x00,0x54, 0x00,0x2c,0x00,0x00,0x02,0x64,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x64,0x80,0x65,0x00,0x24,0x03,0x00,0x00, 0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x0a,0x00,0x00,0x00,0x00, 0x96,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x54,0x00,0x24, 0x03,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0a,0x00, 0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x27,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x0a,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00, 0x80,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x55,0x00,0x29,0x03,0x00,0x00,0x00, 0xc7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x5f, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0x08,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xc7,0x03,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x10,0x00,0x00,0x02, 0x00,0x5f,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03, 0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x5f,0x02,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x1c,0x00, 0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xc7,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xc7,0x03,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x11,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03, 0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x1d,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x65, 0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x32,0x00,0x65,0x80,0x57,0x00,0x31,0x56,0x00,0x29,0x00,0x00,0x00,0x00,0xc4,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x01,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xc7,0x03,0x00, 0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xc4,0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x0d,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xc7, 0x03,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x19, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x07,0x00,0x02, 0x00,0xc7,0x03,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc5,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0xc7,0x03,0x00, 0x00,0x0e,0x00,0x21,0x01,0x00,0x28,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x09,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xc4,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0xfe,0x01,0x00, 0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09, 0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x02,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xc4,0x03, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0x00, 0x01,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x09,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x05, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00, 0xc4,0x03,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x09,0x00,0x00, 0xe0,0x01,0x01,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x66,0x00, 0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32, 0x00,0x66,0x80,0x57,0x00,0x29,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x56, 0x00,0x31,0x57,0x00,0x2c,0x00,0x04,0x02,0x67,0x00,0x00,0x5e,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x67,0x00,0x5b,0x00,0x2c, 0x00,0x04,0x02,0x68,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0x68,0x80,0x59,0x00,0x25,0x00,0x00,0x00,0x00,0xc8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x01,0x07,0x00,0x2a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xcd,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcf,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd1, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd1,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0x69,0x00,0x00,0x5e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x69, 0x00,0x58,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x0a,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x31,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x30,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x32,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x0a,0x00,0x00,0x00, 0x00,0xc7,0x03,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x30,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x01, 0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x34,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x0a,0x00, 0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x65,0x00,0x31, 0x58,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xdd,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x35,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x36,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20, 0x00,0x01,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x37,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x0a, 0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0xe0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe1,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00, 0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe2,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x39,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x36,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00, 0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xe5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x0a,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3b,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x36,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x02,0x32,0x00, 0x00,0x00,0x65,0x00,0x31,0x59,0x00,0x32,0x00,0x3f,0x00,0x5a,0x00,0x2b,0x00,0x02, 0x6a,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x6a,0x80,0x65,0x00,0x25,0x00, 0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x3d,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7, 0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf0,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00, 0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf2,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xf3,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf4,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf4,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xf5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00, 0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xf7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x44,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0a,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x45,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x47,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0a,0x00,0x00,0x00, 0x00,0xc7,0x03,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x48,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x45,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x01, 0x01,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x49,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0a,0x00, 0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4a,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x45, 0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x04, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x4c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03, 0x00,0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x5a,0x00,0x25,0x00,0x00, 0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x06,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x4e,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0xc7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x50,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x0a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x0c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x0e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0e,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x10, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x10,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x11,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7, 0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x54,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0a,0x00,0x00,0x00, 0x00,0xc7,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x55,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00, 0x01,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x57,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0a,0x00, 0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x18,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x19,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x58,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x59,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x55, 0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00, 0x1c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1d, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x5a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03, 0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5b,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x55,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x03,0x32,0x00,0x00, 0x00,0x65,0x00,0x31,0x5b,0x00,0x2c,0x00,0x04,0x02,0x6b,0x00,0x00,0x5e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x6b,0x00,0x5d, 0x00,0x25,0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x5d,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x22, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x22,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7, 0x03,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x6c,0x00,0x00,0x5e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x6c,0x00,0x5c,0x00, 0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x25, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x26,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x60,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x61,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x62,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x61,0x0a,0x00,0x00, 0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x2a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x61,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x20, 0x01,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x64,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x61,0x0a, 0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x65,0x00, 0x31,0x5c,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x2e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x65,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x0a,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x66,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x68,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x0a,0x00,0x00,0x00, 0x00,0xc7,0x03,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x5d,0x00, 0x2c,0x00,0x00,0x02,0x6d,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x6d,0x00,0x5e,0x00,0x2c,0x00,0x00,0x02,0x6e, 0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x32,0x00,0x6e,0x80,0x65,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01, 0x07,0x00,0x69,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x6b,0x0a,0x00,0x00,0x00,0x00, 0xc7,0x03,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x5e,0x00,0x25, 0x00,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x36,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x6d,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xc7,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x37,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0xc7,0x03,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03, 0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x6e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x6f,0x0a,0x00,0x00, 0x00,0x00,0xc7,0x03,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x70,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x6f,0x0a,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0xa0, 0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x5f,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00,0x00,0x00,0x00, 0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x78,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3c, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5f,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3c, 0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x04,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3c, 0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x04,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3c, 0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x3f,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x04,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x6f,0x00,0x00,0x5e,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x6f,0x00,0x62,0x00,0x2c, 0x00,0x04,0x02,0x70,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x07,0x00,0x00,0x00,0x32,0x00,0x70,0x80,0x60,0x00,0x25,0x00,0x00,0x00,0x00,0x5e, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x43,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x71,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x44,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x45,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x72,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x45,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x04,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x47,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x04,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x49,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x49,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x3e,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x4a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4b,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x3f,0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x71,0x00,0x00,0x5e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x71, 0x80,0x65,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x4c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x04,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x60,0x00,0x32,0x00,0x3f,0x00,0x61,0x00,0x2b, 0x00,0x02,0x72,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x72,0x80,0x65,0x00, 0x25,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x4d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x76,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x3b,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x4f,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x3c,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x78,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x79,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x04,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x55,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x04,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x57,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x40,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x58,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x59,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x41,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x42, 0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x61,0x00,0x25,0x00, 0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x7d,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x3b,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5c,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x5d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3c, 0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7f,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x04,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x04,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x63,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x65,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x65,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x40,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x66,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x41,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x62,0x00,0x2c, 0x00,0x04,0x02,0x73,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x32,0x00,0x73,0x00,0x63,0x00,0x25,0x00,0x00,0x00,0x00,0x5e, 0x09,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x03,0x07,0x00,0x83,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x84,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x04,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x6b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x04,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x02,0x74,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x32,0x00,0x74,0x00,0x65,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6c,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x6c,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x3e,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x65,0x00,0x31,0x63,0x00,0x2c, 0x00,0x00,0x02,0x75,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x32,0x00,0x75,0x00,0x64,0x00,0x2c,0x00,0x00,0x02,0x76,0x00, 0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32, 0x00,0x76,0x80,0x65,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x09,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07, 0x00,0x86,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x04,0x00,0x00,0x00,0x00,0x32, 0x00,0x00,0x00,0x65,0x00,0x31,0x64,0x00,0x25,0x00,0x00,0x00,0x00,0x5e,0x09,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x87,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x3b,0x04,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x09,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x04,0x00,0x00,0x00,0x00,0x31, 0x65,0x00,0x24,0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x2c,0x00,0x04,0x02,0x77,0x00,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x23,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x77,0x80,0x97,0x00, 0x01,0x00,0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x45, 0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08, 0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x76,0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x78,0x00,0x00,0x71, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x05, 0x00,0x91,0x00,0x29,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x66,0x00,0x29,0x00,0x00,0x00, 0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x00,0x00,0x69,0x00,0x31,0x66,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7b,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x00, 0x67,0x00,0x29,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x69,0x00,0x31,0x67, 0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0x02,0x00,0x68,0x00,0x29,0x00,0x00,0x00,0x00,0x7a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0x69,0x00,0x31,0x68,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x77, 0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x69, 0x00,0x29,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x7f,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00, 0x02,0x79,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00, 0x00,0x00,0x32,0x00,0x79,0x00,0x6b,0x00,0x31,0x6a,0x00,0x24,0x00,0x00,0x00,0x00, 0x7e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0a,0x00,0x00,0x00,0x00,0x7f, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x7d,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x7a,0x00,0x00,0x7d,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x7a,0x80,0x6a,0x00, 0x31,0x6b,0x00,0x2c,0x00,0x04,0x02,0x7b,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x32,0x00,0x7b,0x00,0x7f,0x00,0x2c,0x00, 0x00,0x02,0x7c,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03, 0x00,0x00,0x00,0x32,0x00,0x7c,0x00,0x75,0x00,0x2c,0x00,0x00,0x02,0x7d,0x00,0x00, 0x7b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00, 0x7d,0x80,0x97,0x00,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x76,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x76,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0d, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x15,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0e, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x16,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x1a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x0f, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x17,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x1b,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x7e,0x00,0x00,0x7a,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x7e,0x80,0x6d,0x00,0x31, 0x6c,0x00,0x29,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x04,0x00,0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x04,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x83,0x04,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x83,0x04,0x00,0x00, 0x0b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0x83,0x04,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x83,0x04,0x00,0x00,0x13,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x83,0x04, 0x00,0x00,0x17,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x83,0x04,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x80,0x04,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x83,0x04,0x00,0x00,0x1f,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x0b,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0x8d, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0b,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0x80,0x04,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x80,0x04,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0b,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0x80,0x04,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x80, 0x04,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x82,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x7f,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x7f,0x80,0x6d,0x00,0x29,0x00, 0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x6c,0x00,0x31,0x6d,0x00,0x2c,0x00,0x04, 0x02,0x80,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0x80,0x00,0x71,0x00,0x2c,0x00,0x04,0x02,0x81,0x00,0x00,0x75, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x81, 0x80,0x6f,0x00,0x25,0x00,0x00,0x00,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x90, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x87,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x87,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x88, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x89,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x93,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x94,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x8d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0x82,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x82,0x00,0x6e,0x00,0x01,0x00,0x00,0x00, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x95,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x90,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x92,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x96,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x92,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x93,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x94, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x95,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x95,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x96,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x97,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x98,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x99,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x9a,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x0a,0x00,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9b,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x99,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x9d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x9c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x0a,0x00,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x9d,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x99,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x02, 0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x6e,0x00,0x01,0x00,0x00,0x00,0x00,0x9f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa0,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa0,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x83,0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xa1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xa1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x00, 0x01,0x00,0x00,0x00,0x00,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xa3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa3, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa5,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xa6, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa7,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa7,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xa8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa9,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xaa,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0, 0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xab,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xac,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa3, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xad,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xa4,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00, 0x00,0xaf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xb0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xa6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0a,0x00,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0xb1,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa7,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xa4,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x01,0x01,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xa8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xa4,0x0a,0x00,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa9,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xa4,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x02, 0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x6f,0x00,0x32,0x00,0x78,0x00,0x70,0x00,0x2b, 0x00,0x02,0x83,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x83,0x80,0x97,0x00, 0x25,0x00,0x00,0x00,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0xb7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xab,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb8, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb9,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xad,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xbb,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xbd,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xbf,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xc1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc1,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00, 0xc2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc3, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc3,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0xc4,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc5,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83, 0x04,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0xc6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xc6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0xc7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xc8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc8,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0xc9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xca,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xca,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0xcb,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x83,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xce,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xd0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x02, 0x01,0x00,0x00,0x00,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd2, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x03,0x01,0x00,0x00, 0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xd3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd3,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xd4,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xba,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00, 0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xbb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x0a,0x00,0x00,0x00,0x00,0x83, 0x04,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd9,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbc,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0xba,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x01,0x01,0x00, 0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xdb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xbd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x0a,0x00,0x00,0x00, 0x00,0x83,0x04,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdc,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xbe,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0xba,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x02, 0x01,0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xbf,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x0a,0x00, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0xe0,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc0,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xba,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00, 0x60,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xba, 0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0x97, 0x00,0x31,0x70,0x00,0x25,0x00,0x00,0x00,0x00,0xe3,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xe4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00, 0xc3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xe5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xe6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe6,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0xe7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xe8,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xe9,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xea,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83, 0x04,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0xec,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0xee,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80,0x02,0x01, 0x00,0x00,0x00,0x00,0xef,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf0,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xf1,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf1,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xf2,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf3,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xca,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xf3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0xf4,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xcb,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xf5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0xf6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xf7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf7, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0xf8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xf9,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf9,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0xfa, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfb,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfb,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xfc,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xfd,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0xfe,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xcf,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x0a,0x00,0x00,0x00,0x00, 0x83,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xff,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd1,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xd0,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x00,0x01, 0x00,0x00,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x0a,0x00,0x00, 0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x03,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x04,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd3,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xd0,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0, 0x01,0x01,0x00,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x0a, 0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x07, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x08,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd5, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00, 0x00,0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0xd0,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00, 0x97,0x00,0x31,0x71,0x00,0x2c,0x00,0x04,0x02,0x84,0x00,0x00,0x75,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x84,0x00,0x73,0x00, 0x25,0x00,0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x0b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xd8,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0c, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0d,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0d,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xda,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x0f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x85,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x85,0x00,0x72,0x00,0x01, 0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x11,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x12,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x12,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x14,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdc,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x14,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x16,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x01, 0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x17,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x17, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x18,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x19,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xde,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0xdf,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x00,0x01, 0x00,0x00,0x00,0x00,0x1a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x1b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xe0,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0a,0x00,0x00, 0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x1c,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1d,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe1,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0xdf,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60, 0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x1e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xe2,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x0a, 0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0x97,0x00, 0x31,0x72,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0x1f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x1f, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00,0x00, 0x00,0x00,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x21,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x21,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x74, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x22,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x22,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x23,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xe4,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xe5,0x0a,0x00, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xe5,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00, 0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe7,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xe5, 0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x01,0x32,0x00,0x00,0x00,0x97, 0x00,0x31,0x73,0x00,0x2c,0x00,0x00,0x02,0x86,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x86,0x00,0x74,0x00,0x2c, 0x00,0x00,0x02,0x87,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x87,0x80,0x97,0x00,0x25,0x00,0x00,0x00,0x00,0x8e, 0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x28,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0xe8,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x2a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x2a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x2b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x2c, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xea,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xeb,0x0a,0x00,0x00,0x00,0x00,0x83,0x04, 0x00,0x00,0x60,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x74,0x00,0x25,0x00,0x00, 0x00,0x00,0x2d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2e,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xed,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x83,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2f,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x30,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xee,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x30,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x31,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x31,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x32,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x32,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x83,0x04,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x33,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xef,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0xf0,0x0a,0x00,0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x35,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xf1,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x0a,0x00,0x00,0x00,0x00, 0x83,0x04,0x00,0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x75,0x00,0x29, 0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x39,0x05,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x76, 0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0x10,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x39,0x05,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x18,0x00,0x00,0x02, 0x00,0x76,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x05,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x39,0x05,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x39,0x05,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x19,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x39,0x05,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x78, 0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x39,0x05,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x1a,0x00,0x00,0x02, 0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c, 0x00,0x04,0x02,0x88,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x32,0x00,0x88,0x80,0x77,0x00,0x31,0x76,0x00,0x29,0x00,0x00, 0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x05,0x00,0x00,0x02, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x39,0x05,0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x05, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x39,0x05,0x00,0x00,0x0a,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x39,0x05,0x00, 0x00,0x0e,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x39,0x05,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x36,0x05,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x39,0x05,0x00,0x00,0x16,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x39, 0x05,0x00,0x00,0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x36,0x05,0x00,0x00, 0x00,0x07,0x00,0x02,0x00,0x39,0x05,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x37,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0c,0x00,0x00,0x00, 0x00,0x39,0x05,0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0xf2,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00, 0x36,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00, 0xe0,0xfe,0x01,0x00,0x02,0x00,0x36,0x05,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x36,0x05,0x00,0x00, 0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0xff,0x01,0x00, 0x02,0x00,0x36,0x05,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c, 0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x36,0x05,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x36,0x05, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x60,0x01, 0x01,0x00,0x02,0x00,0x36,0x05,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0c,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x36,0x05,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00, 0x04,0x02,0x89,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07, 0x00,0x00,0x00,0x32,0x00,0x89,0x80,0x77,0x00,0x29,0x00,0x00,0x00,0x00,0x7a,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x00,0x00,0x76,0x00,0x31,0x77,0x00,0x2c,0x00,0x04,0x02,0x8a,0x00,0x00,0x75, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x8a, 0x00,0x7b,0x00,0x2c,0x00,0x04,0x02,0x8b,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x8b,0x80,0x79,0x00,0x25,0x00, 0x00,0x00,0x00,0x3a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3b, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xf4,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3d,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf5,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x3d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf6,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x3f,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x41,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x43,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x43,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02, 0x8c,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00, 0x00,0x32,0x00,0x8c,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x45,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xf9,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00, 0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x46,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x47,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfb,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x48,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x49,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfc,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfa, 0x0a,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x4a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4b, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xfd,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4c,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xfe,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0xfa,0x0a,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x02,0x32,0x00,0x00, 0x00,0x97,0x00,0x31,0x78,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x4d,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x4d,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00, 0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x4e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x4f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xff,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x00,0x00,0x00,0x00,0x39, 0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x51,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x50,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x52,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x53,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x02,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x00,0x00,0x00, 0x00,0x39,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x54,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x55,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x54,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x01, 0x01,0x00,0x00,0x00,0x00,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x57,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x05,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x04,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x00, 0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x58,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0xc0,0x02,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x79,0x00,0x32,0x00,0x78,0x00,0x7a, 0x00,0x2b,0x00,0x02,0x8d,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x8d,0x80, 0x97,0x00,0x25,0x00,0x00,0x00,0x00,0x59,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x5a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x07,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x5b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x5c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5c,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5e,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5e,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x39,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x60,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x60,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00, 0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x00,0x63,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x64, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x65,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x66,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x74, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x67,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x67,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x39,0x05,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x0e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0f,0x0b,0x00, 0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x10,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x0f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x6d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x11,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0f, 0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x6e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6f, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x12,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x70,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x13,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x0f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x02,0x01,0x00,0x00, 0x00,0x00,0x72,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x73,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x14,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0f,0x0b,0x00,0x00,0x00,0x00, 0x39,0x05,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x75,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x15,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x0f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x03,0x01, 0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x76,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x16,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x0f,0x0b,0x00,0x00, 0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x03,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x7a, 0x00,0x25,0x00,0x00,0x00,0x00,0x77,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x18,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x79,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7a, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7a,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x7b,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x7c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39, 0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7e,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x7e,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00, 0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x7f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x02,0x01, 0x00,0x00,0x00,0x00,0x81,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x82,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x82,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x83,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x83,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x84,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x24,0x03,0x00,0x00,0x00,0x85,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f, 0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00, 0x86,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x87, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x20,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x21,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x8a,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x8b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x22,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00, 0x39,0x05,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8d,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x02,0x01, 0x00,0x00,0x00,0x00,0x8e,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x8f,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x24,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00, 0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x90,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x25,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40, 0x03,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x7b,0x00,0x2c,0x00,0x04,0x02,0x8e,0x00, 0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x8e,0x00,0x7d,0x00,0x25,0x00,0x00,0x00,0x00,0x91,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x92,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0x27,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x94,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x94,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0x95,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x96,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x96,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x8f,0x00,0x00, 0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0x8f,0x00,0x7c,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x97,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x97,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x98,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x99,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2a, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9b,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9a,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x2b,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x9c,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x9d,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x2d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x0b,0x00,0x00,0x00,0x00,0x39, 0x05,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2e,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x2b,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0xc0,0x01,0x32,0x00, 0x00,0x00,0x97,0x00,0x31,0x7c,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x9f,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x03,0x00,0x00,0x00,0xa0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x2f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x0b,0x00, 0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa2,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x31,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00, 0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xa3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x32,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x30, 0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x01,0x32,0x00,0x00,0x00,0x97, 0x00,0x31,0x7d,0x00,0x2c,0x00,0x00,0x02,0x90,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x90,0x00,0x7e,0x00,0x2c, 0x00,0x00,0x02,0x91,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x91,0x80,0x97,0x00,0x25,0x00,0x00,0x00,0x00,0x8e, 0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa4,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x33,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa5,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x24,0x03,0x00,0x00,0x00,0xa6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x34,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x0b, 0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0x97,0x00, 0x31,0x7e,0x00,0x25,0x00,0x00,0x00,0x00,0xa7,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xa8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x37, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xa9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa9,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x39,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xaa,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xab,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x38,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x39,0x0b,0x00,0x00,0x00,0x00,0x39,0x05,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xac,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x3a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x0b,0x00,0x00,0x00,0x00,0x39, 0x05,0x00,0x00,0xc0,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x7f,0x00,0x2c,0x00, 0x00,0x02,0x92,0x00,0x00,0x7b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x32,0x00,0x92,0x00,0x87,0x00,0x2c,0x00,0x00,0x02,0x93,0x00,0x00, 0x7b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00, 0x93,0x80,0x97,0x00,0x29,0x03,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x76,0x04, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x0c, 0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0xb0,0x05,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x14,0x00,0x00,0x02,0x00, 0x76,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xb0,0x05,0x00, 0x00,0x18,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00, 0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x94,0x00,0x00,0x7a,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x94,0x80,0x81,0x00,0x31, 0x80,0x00,0x29,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x05,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0xb0,0x05,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xb0,0x05,0x00,0x00, 0x08,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x03,0x00, 0x02,0x00,0xb0,0x05,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad, 0x05,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x05,0x00,0x00,0x10,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xb0,0x05, 0x00,0x00,0x14,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x05,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0xb0,0x05,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xad,0x05,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xb0,0x05,0x00,0x00,0x1c,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00, 0x01,0x0d,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x3b, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60, 0xfe,0x01,0x00,0x02,0x00,0xad,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x0d,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0xad,0x05,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0xff,0x01,0x00,0x02, 0x00,0xad,0x05,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00, 0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xad,0x05,0x00,0x00,0x00,0x03,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0xad,0x05,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0x00,0x01, 0x00,0x02,0x00,0xad,0x05,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x0d,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xad,0x05,0x00,0x00,0x00,0x06,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0xad, 0x05,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xaf,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x95,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x95,0x80,0x81,0x00,0x29,0x00, 0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x80,0x00,0x31,0x81,0x00,0x2c,0x00,0x04, 0x02,0x96,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00, 0x00,0x00,0x32,0x00,0x96,0x00,0x84,0x00,0x2c,0x00,0x04,0x02,0x97,0x00,0x00,0x75, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x97, 0x80,0x82,0x00,0x24,0x03,0x00,0x00,0x00,0xb1,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x3c,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0xb2,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xb3,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x3d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0b,0x00,0x00,0x00,0x00, 0xb0,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb5,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x3c,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0xb6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xb7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x3f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0b,0x00,0x00, 0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xb8,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb9,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb8,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x40,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00, 0x02,0x2c,0x00,0x00,0x02,0x98,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0x98,0x80,0x97,0x00,0x01,0x00,0x00,0x00, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xba,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x41,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x3c,0x0b,0x00,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x82,0x00,0x32,0x00, 0x78,0x00,0x83,0x00,0x2b,0x00,0x02,0x99,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0x99,0x80,0x97,0x00,0x24,0x03,0x00,0x00,0x00,0xbb,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x42,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xbc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xbd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x43,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x0b,0x00,0x00, 0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xbe,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbf,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x44,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x42,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0xc0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xc1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x45,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x0b, 0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xc2, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc3,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x46, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xc4,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc4,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x42,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00, 0x00,0xc6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x48,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x42,0x0b,0x00,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc8,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x42,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x03,0x32,0x00, 0x00,0x00,0x97,0x00,0x31,0x83,0x00,0x24,0x03,0x00,0x00,0x00,0xc9,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x4a,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0xca,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xcb,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x0b, 0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xcc, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcd,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4c, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xce,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcf,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xce,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x4a,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0xd0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x4e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x0b,0x00,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xd2,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd3,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x4a,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x02,0x01,0x00, 0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x50,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x0b,0x00,0x00,0x00, 0x00,0xb0,0x05,0x00,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x84,0x00, 0x2c,0x00,0x04,0x02,0x9a,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x9a,0x00,0x85,0x00,0x24,0x03,0x00,0x00,0x00, 0xd5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x51,0x0b,0x00,0x00,0x00,0x00,0xb0, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xd6,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd7,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x52,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x51,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0xd8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x53,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x51,0x0b,0x00,0x00,0x00, 0x00,0xb0,0x05,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0x9b,0x00,0x00,0x75,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x9b,0x00, 0x97,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xda,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x54,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x51, 0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0x97, 0x00,0x31,0x85,0x00,0x2c,0x00,0x00,0x02,0x9c,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x9c,0x00,0x86,0x00,0x2c, 0x00,0x00,0x02,0x9d,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x9d,0x80,0x97,0x00,0x24,0x03,0x00,0x00,0x00,0xdb, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x86,0x00,0x24,0x03,0x00, 0x00,0x00,0xdc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x0b,0x00,0x00,0x00, 0x00,0xb0,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdd,0x05,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x57,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x56,0x0b,0x00,0x00,0x00,0x00,0xb0,0x05,0x00,0x00,0x80,0x00, 0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x87,0x00,0x29,0x03,0x00,0x00,0x00,0xe1,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x76,0x04,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x08,0x00, 0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xe1,0x05,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x76, 0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00, 0x14,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x1c,0x00,0x00,0x02, 0x00,0x76,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x09,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xe1,0x05,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00, 0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x1d,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x9e,0x00,0x00, 0x7a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00, 0x9e,0x80,0x89,0x00,0x31,0x88,0x00,0x29,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe1,0x05,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xe1,0x05,0x00,0x00,0x05, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0xe1,0x05,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xde,0x05, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xe1,0x05,0x00,0x00,0x0d,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe1,0x05,0x00, 0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0xe1,0x05,0x00,0x00,0x15,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xde,0x05,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xe1,0x05,0x00,0x00,0x19,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xde,0x05,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xe1, 0x05,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdf,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8c,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x28,0x00,0x01,0x0e,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x0e, 0x00,0x21,0x01,0x00,0x58,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x0e,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00, 0xde,0x05,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00, 0x60,0xff,0x01,0x00,0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0xde,0x05,0x00,0x00, 0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x00,0x01,0x00, 0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e, 0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x05,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x60,0x01,0x01,0x00,0x02,0x00,0xde,0x05, 0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0xe0,0x01, 0x01,0x00,0x02,0x00,0xde,0x05,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x9f,0x00,0x00,0x7a, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x9f, 0x80,0x89,0x00,0x29,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe0,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x88,0x00,0x31, 0x89,0x00,0x2c,0x00,0x04,0x02,0xa0,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xa0,0x00,0x8d,0x00,0x2c,0x00,0x04, 0x02,0xa1,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xa1,0x80,0x8b,0x00,0x25,0x00,0x00,0x00,0x00,0xe2,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe3,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x59,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x01,0x07,0x00,0x5a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xe5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xe5,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x00,0x01, 0x00,0x00,0x00,0x00,0xe6,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xe7,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe7,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0xe8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xe9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe9,0x05,0x00,0x00,0x00, 0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xea,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xeb,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xeb,0x05,0x00,0x00,0x00,0x00,0x21,0x01, 0xe1,0x05,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xa2,0x00,0x00,0x75,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xa2,0x00,0x8a, 0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xec,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xed,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5f, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xee,0x05,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xef,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xee,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x61,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x60,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0xf0,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xf1,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x05,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x62,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0b,0x00,0x00,0x00,0x00,0xe1, 0x05,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0xf2,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xf3,0x05,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf2,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x60,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x01,0x01,0x00, 0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xf4,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x64,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x0b,0x00,0x00,0x00, 0x00,0xe1,0x05,0x00,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x8a,0x00, 0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xf5,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf5, 0x05,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00, 0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xf6,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xf7,0x05,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x65,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x66,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x00,0x01, 0x00,0x00,0x00,0x00,0xf8,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xf9,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x05,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x67,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x0b,0x00,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0xfa,0x05,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfb,0x05,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfa,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x68,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x66,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20, 0x01,0x01,0x00,0x00,0x00,0x00,0xfc,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xfd,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x05, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x69,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x0b, 0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0xfe, 0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x05, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x05,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6a, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x66,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00, 0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x66,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00, 0x97,0x00,0x31,0x8b,0x00,0x32,0x00,0x78,0x00,0x8c,0x00,0x2b,0x00,0x02,0xa3,0x00, 0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xa3,0x80,0x97,0x00,0x25,0x00,0x00,0x00, 0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x6d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xe1,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x08, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x09,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0a,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x0b, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0c,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0xe1,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x0d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x0e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x0f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80, 0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x11,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x74, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x12,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x12,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x76,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x75,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0x14,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x15,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x77,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0b,0x00,0x00,0x00,0x00,0xe1, 0x05,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x16,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x17,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x75,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x01,0x01,0x00, 0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x19,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x79,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0b,0x00,0x00,0x00, 0x00,0xe1,0x05,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x1a,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1b,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1a,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7a,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x75,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x02, 0x01,0x00,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x1d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x7b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0b,0x00, 0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7c,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x75,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00, 0xa0,0x03,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x8c,0x00,0x25,0x00,0x00,0x00,0x00, 0x1f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7d,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x7e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xe1, 0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0x24,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x25,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x26,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x26,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x27,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x28,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x28,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x29,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2a,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x2a,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0xe1,0x05,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x2b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x2c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x2d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x84,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0b,0x00,0x00,0x00,0x00,0xe1, 0x05,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x2f,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x85,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00, 0x00,0x00,0x00,0x30,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x31,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x87,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0b,0x00,0x00,0x00, 0x00,0xe1,0x05,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x32,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x33,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x32,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x88,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x85,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x01, 0x01,0x00,0x00,0x00,0x00,0x34,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x35,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x89,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0b,0x00, 0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x36,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8a,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x85,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00, 0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8b,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x85, 0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x03,0x32,0x00,0x00,0x00,0x97, 0x00,0x31,0x8d,0x00,0x2c,0x00,0x04,0x02,0xa4,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xa4,0x00,0x8f,0x00,0x25, 0x00,0x00,0x00,0x00,0x39,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x3a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x8d,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3b,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3c,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3c,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0xe1,0x05,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x3e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8f,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x3e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00, 0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xa5,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xa5,0x00,0x8e,0x00,0x01,0x00, 0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x3f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x3f,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x41,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x90,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x91,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x00,0x01,0x00,0x00, 0x00,0x00,0x42,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x43,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x92,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x91,0x0b,0x00,0x00,0x00,0x00, 0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x44,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x45,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x44,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x93,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x91,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0x20,0x01,0x01, 0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x46,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x94,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x91,0x0b,0x00,0x00, 0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x01,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x8e, 0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x47,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x48,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x95, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00, 0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x49,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x49,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x97,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x96,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00, 0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x4b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x98,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x96,0x0b,0x00,0x00,0x00,0x00,0xe1, 0x05,0x00,0x00,0x20,0x01,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x8f,0x00,0x2c,0x00, 0x00,0x02,0xa6,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x32,0x00,0xa6,0x00,0x90,0x00,0x2c,0x00,0x00,0x02,0xa7,0x00,0x00, 0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00, 0xa7,0x80,0x97,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x4c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x99,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x4d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x4e, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x9a,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9b,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05, 0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x90,0x00,0x25,0x00,0x00, 0x00,0x00,0x4f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x50,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x9d,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xe1,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x51,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x51,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0xe1,0x05, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x52,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x53,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x9e,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9f,0x0b,0x00,0x00,0x00,0x00, 0xe1,0x05,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x54,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xa0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x9f,0x0b,0x00,0x00,0x00,0x00,0xe1,0x05,0x00,0x00,0xa0,0x00,0x32, 0x00,0x00,0x00,0x97,0x00,0x31,0x91,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x27, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01, 0x79,0x04,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04, 0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x89,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x76,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x57,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x5c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x57,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59, 0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x5c,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x57,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59, 0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x5c,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x55,0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x77,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x06,0x00, 0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x57,0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x58,0x06,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x59, 0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x5a,0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x5b,0x06,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x5c,0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x07,0x00, 0x22,0x01,0x2c,0x00,0x04,0x02,0xa8,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xa8,0x00,0x94,0x00,0x2c,0x00,0x04, 0x02,0xa9,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xa9,0x80,0x92,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xa1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x06,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x5f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x60,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x61,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x61,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x62,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x63,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x63,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x58,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x64,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x65,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x65,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x59,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xaa,0x00,0x00,0x75,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xaa,0x80,0x97, 0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0x66,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x06,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x97,0x00,0x31,0x92,0x00,0x32,0x00,0x78,0x00,0x93,0x00,0x2b,0x00,0x02, 0xab,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xab,0x80,0x97,0x00,0x25,0x00, 0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x67, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xa6,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x55,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x68,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x69,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x69,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x56, 0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x6b,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x6b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x06,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x6d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x6d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x6e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x6f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x6f,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x59,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x71,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x71,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x5a,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x73,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x73,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x5b,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x74,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x74,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x5c,0x06,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x93,0x00,0x25,0x00,0x00,0x00, 0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x75,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xad,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x55,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x77,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0x77,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x06,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaf,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03, 0x07,0x00,0x79,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x7a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x7b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x7b, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x7c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x7d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x7d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x59,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7e, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x7f,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x7f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x5a,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x5b,0x06, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x94,0x00,0x2c,0x00,0x04, 0x02,0xac,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x32,0x00,0xac,0x00,0x95,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x81,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0xb3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x06,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x82,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x83,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x85,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x85,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x57,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02, 0xad,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x32,0x00,0xad,0x00,0x97,0x00,0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x86,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x88,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x86,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x06, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x97,0x00,0x31,0x95,0x00,0x2c,0x00,0x00, 0x02,0xae,0x00,0x00,0x75,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x32,0x00,0xae,0x00,0x96,0x00,0x2c,0x00,0x00,0x02,0xaf,0x00,0x00,0x75, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xaf, 0x80,0x97,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x87,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0xb6, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x06,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x97,0x00,0x31,0x96,0x00,0x25,0x00,0x00,0x00,0x00,0x8e,0x0a,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x0a,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x88,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x73,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03, 0x07,0x00,0xb7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x89,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x0a,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x89, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x56,0x06,0x00,0x00,0x00,0x00,0x31,0x97,0x00, 0x10,0x00,0x00,0x00,0x00,0x8a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0xb0,0x00,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0xb0,0x80,0xc9,0x00,0x01,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x8b,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x00,0x00, 0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x25, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x90,0x06,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xb1,0x00,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0x05,0x00,0xc3, 0x00,0x29,0x00,0x00,0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x01,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x98,0x00,0x29,0x00,0x00,0x00,0x00,0x91, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x00,0x00,0x9b,0x00,0x31,0x98,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x79,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x92,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x00,0x99,0x00, 0x29,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x9b,0x00,0x31,0x99,0x00,0x37, 0x00,0x06,0x00,0x20,0x08,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x03,0x00,0x00,0x00, 0x32,0x00,0x02,0x00,0x9a,0x00,0x29,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0x9b,0x00,0x31,0x9a,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x29,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x04,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x04,0x00,0x00,0x00,0x31,0x9b,0x00,0x29,0x00,0x00,0x00,0x00,0x95,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x93,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x97,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x94,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x98,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x00,0x02,0xb2,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00, 0x00,0x00,0x00,0x32,0x00,0xb2,0x00,0x9d,0x00,0x31,0x9c,0x00,0x24,0x00,0x00,0x00, 0x00,0x96,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x0f,0x00,0x00,0x00,0x00, 0x97,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x0f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x95, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x95,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x95,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xb3,0x00,0x00,0x95,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0xb3,0x80,0x9c, 0x00,0x24,0x03,0x00,0x00,0x00,0x98,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97, 0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x31,0x9d,0x00, 0x2c,0x00,0x04,0x02,0xb4,0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x03,0x00,0x00,0x00,0x32,0x00,0xb4,0x00,0xb1,0x00,0x2c,0x00,0x00,0x02,0xb5, 0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x03,0x00,0x00,0x00, 0x32,0x00,0xb5,0x00,0xa7,0x00,0x2c,0x00,0x00,0x02,0xb6,0x00,0x00,0x92,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0xb6,0x80,0xc9, 0x00,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90, 0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0x90,0x06,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x90,0x06,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x9c,0x06,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x0d,0x00,0x00,0x02, 0x00,0x79,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06, 0x00,0x00,0x11,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x19,0x00, 0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x9c,0x06,0x00,0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x0e,0x00,0x00,0x02, 0x00,0x78,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06, 0x00,0x00,0x12,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x78,0x04,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x1a,0x00, 0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x9c,0x06,0x00,0x00,0x1e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x77, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0x07,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x0b,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x0f,0x00,0x00,0x02, 0x00,0x77,0x04,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06, 0x00,0x00,0x13,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x17,0x00,0x00,0x02,0x00,0x77,0x04,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x1b,0x00, 0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x9c,0x06,0x00,0x00,0x1f,0x00,0x00,0x02,0x00,0x77,0x04,0x00,0x00,0x07,0x00,0x22, 0x01,0x2c,0x00,0x04,0x02,0xb7,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xb7,0x80,0x9f,0x00,0x31,0x9e,0x00,0x29, 0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x06,0x00, 0x00,0x03,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x9c,0x06,0x00,0x00,0x07,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x99,0x06,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x9c,0x06,0x00,0x00,0x0b,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x9c, 0x06,0x00,0x00,0x0f,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x9c,0x06,0x00,0x00,0x13,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x9c,0x06,0x00,0x00,0x17, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x06,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x9c,0x06,0x00,0x00,0x1b,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x06, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x9c,0x06,0x00,0x00,0x1f,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x9a,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x10,0x00, 0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x10,0x00,0x21,0x01,0x00,0xbd,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0xfe,0x01,0x00, 0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10, 0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x99,0x06, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0xff, 0x01,0x00,0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x10,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00, 0x99,0x06,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x00, 0x60,0x01,0x01,0x00,0x02,0x00,0x99,0x06,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x10,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x99,0x06,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0xb8,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xb8,0x80,0x9f,0x00,0x29,0x00,0x00,0x00,0x00, 0x91,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0x9e,0x00,0x31,0x9f,0x00,0x2c,0x00,0x04,0x02,0xb9,0x00, 0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32, 0x00,0xb9,0x00,0xa3,0x00,0x2c,0x00,0x04,0x02,0xba,0x00,0x00,0x8f,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xba,0x80,0xa1,0x00, 0x25,0x00,0x00,0x00,0x00,0x9d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x9e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xc0,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9f, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa0,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa2,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xa2,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xa3,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa4,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xa4,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80, 0x01,0x01,0x00,0x00,0x00,0x00,0xa5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xa6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xa6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x02,0x2c,0x00, 0x00,0x02,0xbb,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x32,0x00,0xbb,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xa7,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xa7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xa9,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xaa, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xab,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xab,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xac,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xac,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xad,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xc8,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00,0x01,0x00,0x00, 0x00,0x00,0xae,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xaf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0xca,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x9c,0x06,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb0,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcb,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x01,0x01, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xb1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xcc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xb2,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xcd,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60, 0x02,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0xb3, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb4,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xb4,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xb5,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xb5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40, 0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xb7,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x00,0x01,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xb8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb8,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb9, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb9,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xba,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xba,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c, 0x06,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xbb,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00, 0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0xbc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0xd1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xbd,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbe,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd2,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0, 0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xbf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xd3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc0,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd4, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00, 0x00,0xe0,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xd5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xc2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xd6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c, 0x06,0x00,0x00,0xe0,0x02,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xa1,0x00,0x32,0x00, 0xb1,0x00,0xa2,0x00,0x2b,0x00,0x02,0xbc,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32, 0x00,0xbc,0x80,0xc9,0x00,0x25,0x00,0x00,0x00,0x00,0xc3,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xc4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07, 0x00,0xd8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0xc5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xc6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc6,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00, 0x00,0xc7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xc8,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xc8,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xc9,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xca,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xca,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x9c,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0xcb,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcc,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0xcc,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0xcd,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xce,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02, 0x07,0x00,0xce,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x02, 0x01,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xd0,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd0, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0xd1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xd2,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xd2,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd3,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xd3,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0xd4,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd5,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xd5,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xd6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xd6,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd7,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd7,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd8, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd8,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd9,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd9,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c, 0x06,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xda,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x01,0x07,0x00,0xda,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00, 0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xdb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xdb,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x03,0x01, 0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xdc,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xe3,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c, 0x06,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xdd,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xde,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdd,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe4,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x00,0x01,0x00, 0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xdf,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xe5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9c,0x06,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe0,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe6,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x01, 0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe1,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xe7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe2,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe8,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0xe0,0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0xe3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xe9,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x03,0x01,0x00,0x00,0x00,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe4, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xea,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06, 0x00,0x00,0xe0,0x03,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xa2,0x00,0x25,0x00,0x00, 0x00,0x00,0xe5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe6,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xec,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe7,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xed,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0xe9,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xee,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0xea,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0xeb,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xec,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0xec,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0xed,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xee,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xee,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0xef,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf0, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf0,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0xf1,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf2,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0xf2,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c, 0x06,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0xf3,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07, 0x00,0xf3,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x00,0x01, 0x00,0x00,0x00,0x00,0xf4,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0xf5,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf5,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0xf6,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf6,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf7,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xf7,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x9c,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf8,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xf8,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00, 0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xf9,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x02, 0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xfa,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xfa, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x03,0x01,0x00,0x00, 0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xfb,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf4, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00, 0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0xfc,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfc,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf5,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xfe,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xf6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c, 0x06,0x00,0x00,0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xff,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf7,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x01,0x01,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0xf8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9c,0x06,0x00,0x00,0x60,0x02,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xf9,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x02, 0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x02,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0xfa,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x03,0x32,0x00,0x00,0x00,0xc9,0x00,0x31, 0xa3,0x00,0x2c,0x00,0x04,0x02,0xbd,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xbd,0x00,0xa5,0x00,0x25,0x00,0x00, 0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x04,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0xfc,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x06,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfd,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x06,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xfe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00, 0x01,0x2c,0x00,0x00,0x02,0xbe,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xbe,0x00,0xa4,0x00,0x01,0x00,0x00,0x00, 0x00,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x0a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x0a,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x0b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0x0c,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x00, 0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x0d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0d, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00, 0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0x0e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x0e,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x01,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00, 0x01,0x00,0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x11,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x12,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x03,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00, 0x60,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x13,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x04,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0xe0,0x01,0x32,0x00,0x00,0x00,0xc9, 0x00,0x31,0xa4,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x00,0x14,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0x14,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x15,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x15,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x16, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x16,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x9c,0x06,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x17,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x05,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00,0x01,0x00, 0x00,0x00,0x00,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x06,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9c,0x06,0x00,0x00,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x1a,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x07,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x01, 0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xa5,0x00,0x2c,0x00,0x00,0x02,0xbf,0x00,0x00, 0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00, 0xbf,0x00,0xa6,0x00,0x2c,0x00,0x00,0x02,0xc0,0x00,0x00,0x8f,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xc0,0x80,0xc9,0x00,0x25, 0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x08,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x1c,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x1d,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x09,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0x1d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00, 0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x1e,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x60,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0a,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00,0x32,0x00,0x00, 0x00,0xc9,0x00,0x31,0xa6,0x00,0x25,0x00,0x00,0x00,0x00,0x1f,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02, 0x07,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x21,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x22,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x22, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x23,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0x23,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x9c,0x06,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x24,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x24,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9c,0x06, 0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x25,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x0e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x9c,0x06,0x00,0x00,0x60,0x00,0x01,0x00,0x00,0x00,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x0f, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9c,0x06,0x00, 0x00,0xe0,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xa7,0x00,0x29,0x03,0x00,0x00, 0x00,0x2a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x90,0x06,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0x08,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x10,0x00,0x00, 0x02,0x00,0x90,0x06,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x18,0x00,0x00,0x02,0x00,0x90,0x06, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x1c, 0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2a,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x11,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x19,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x1d, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x2a,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x06,0x00,0x00,0x02,0x00, 0x78,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0x0a,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x0e,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x12,0x00,0x00, 0x02,0x00,0x78,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0x16,0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x1a,0x00,0x00,0x02,0x00,0x78,0x04, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x1e, 0x00,0x00,0x02,0x00,0x78,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02, 0xc1,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x32,0x00,0xc1,0x80,0xa9,0x00,0x31,0xa8,0x00,0x29,0x00,0x00,0x00,0x00,0x27, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x07,0x00,0x00,0x02,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x2a,0x07, 0x00,0x00,0x06,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x2a,0x07,0x00,0x00,0x0a,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x27,0x07,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x2a,0x07,0x00,0x00,0x0e,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x07,0x00,0x00,0x12,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x07,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x2a,0x07,0x00,0x00,0x16,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x2a,0x07,0x00,0x00, 0x1a,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x07,0x00,0x00,0x00,0x07,0x00, 0x02,0x00,0x2a,0x07,0x00,0x00,0x1e,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x28, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x11,0x00,0x00,0x00,0x00,0x2a,0x07, 0x00,0x00,0x0f,0x00,0x21,0x01,0x00,0x10,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x27,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0xfe,0x01, 0x00,0x02,0x00,0x27,0x07,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x11,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x27,0x07,0x00,0x00,0x00,0x02,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0xe0,0xff,0x01,0x00,0x02,0x00,0x27, 0x07,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60, 0x00,0x01,0x00,0x02,0x00,0x27,0x07,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x11,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x27,0x07,0x00,0x00,0x00, 0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x60,0x01,0x01,0x00,0x02, 0x00,0x27,0x07,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x11,0x00, 0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x27,0x07,0x00,0x00,0x00,0x07,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x29,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0xc2, 0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00, 0x32,0x00,0xc2,0x80,0xa9,0x00,0x29,0x00,0x00,0x00,0x00,0x91,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00, 0xa8,0x00,0x31,0xa9,0x00,0x2c,0x00,0x04,0x02,0xc3,0x00,0x00,0x8f,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xc3,0x00,0xad,0x00, 0x2c,0x00,0x04,0x02,0xc4,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xc4,0x80,0xab,0x00,0x25,0x00,0x00,0x00,0x00, 0x2b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2c,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x11,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x12,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2a, 0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x2e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x13,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x2e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00, 0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x2f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x2f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x30,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x30,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x31,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x31,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xc5,0x00,0x00, 0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0xc5,0x00,0xaa,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x32,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x14,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x33, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x34,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x15, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x16,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x36,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x17,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x18,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x02,0x32,0x00, 0x00,0x00,0xc9,0x00,0x31,0xaa,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x02,0x07,0x00,0x38,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x39,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x19,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x3a, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3b,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1a, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x3d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x1c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x3e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x1d,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x02,0x01,0x00, 0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x3f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x1e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x2a,0x07,0x00,0x00,0xc0,0x02,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xab,0x00, 0x32,0x00,0xb1,0x00,0xac,0x00,0x2b,0x00,0x02,0xc6,0x00,0x05,0x00,0x01,0x00,0x00, 0x00,0x32,0x00,0xc6,0x80,0xc9,0x00,0x25,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x41,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36, 0x02,0x07,0x00,0x20,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x43,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x43,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x00,0x01,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x44,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x45, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x45,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x46,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a, 0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x47,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00, 0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x48,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07, 0x00,0x48,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x49,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x49,0x07, 0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x03,0x01,0x00,0x00,0x00, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x4a,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x22,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00, 0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x4c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x23,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4d, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x24,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07, 0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x4e,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x25,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0,0x01,0x01,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x4f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x26,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x2a,0x07,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x27,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0,0x02,0x01, 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x51,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x28,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x29,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0, 0x03,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xac,0x00,0x25,0x00,0x00,0x00,0x00,0x53, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x54,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0x0f,0x36,0x02,0x07,0x00,0x2b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x55,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x02,0x07,0x00,0x56,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80, 0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x57,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x57,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x58,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x58,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x59, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x59,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5a,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x5a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a, 0x07,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x02,0x07,0x00,0x5b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x5c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x2d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x5d,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5e,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x2e,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0, 0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x5f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x2f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x60,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x30, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0xc0,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x31,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x02,0x01,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x62,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x32,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a, 0x07,0x00,0x00,0xc0,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x63,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x33,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x03,0x32,0x00, 0x00,0x00,0xc9,0x00,0x31,0xad,0x00,0x2c,0x00,0x04,0x02,0xc7,0x00,0x00,0x8f,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xc7,0x00, 0xaf,0x00,0x25,0x00,0x00,0x00,0x00,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x35,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x66,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x66,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x67,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00,0x67,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x2a,0x07,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xc8,0x00,0x00,0x8f,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xc8,0x00,0xae, 0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x68,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x02,0x07,0x00, 0x68,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x69, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x36,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x6a,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6b,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6a,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x37,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x6c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x38,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x2a,0x07,0x00,0x00,0x40,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6d,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x39,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0xc0,0x01,0x32, 0x00,0x00,0x00,0xc9,0x00,0x31,0xae,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x6e,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3a,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x00,0x01,0x00, 0x00,0x00,0x00,0x6f,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x3b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x2a,0x07,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3c,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x01, 0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xaf,0x00,0x2c,0x00,0x00,0x02,0xc9,0x00,0x00, 0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00, 0xc9,0x00,0xb0,0x00,0x2c,0x00,0x00,0x02,0xca,0x00,0x00,0x8f,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xca,0x80,0xc9,0x00,0x25, 0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x72,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x3d,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x3e, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00, 0x00,0x40,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb0,0x00,0x25,0x00,0x00,0x00, 0x00,0x74,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x75,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x02,0x07,0x00,0x40,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x2a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x76,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x02,0x07,0x00,0x76,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x07,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x77,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x41,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x2a,0x07,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x78,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x42,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x2a,0x07,0x00,0x00, 0xc0,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb1,0x00,0x2c,0x00,0x00,0x02,0xcb, 0x00,0x00,0x92,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x32,0x00,0xcb,0x00,0xb9,0x00,0x2c,0x00,0x00,0x02,0xcc,0x00,0x00,0x92,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xcc,0x80,0xc9, 0x00,0x29,0x03,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90, 0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x07,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x7c,0x07,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x0c,0x00,0x00,0x02, 0x00,0x90,0x06,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x07, 0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x90,0x06,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x18,0x00, 0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0x7c,0x07,0x00,0x00,0x1c,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x07,0x00,0x22, 0x01,0x2c,0x00,0x04,0x02,0xcd,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x32,0x00,0xcd,0x80,0xb3,0x00,0x31,0xb2,0x00,0x29, 0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x7c,0x07,0x00,0x00,0x04,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x79,0x07,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x7c,0x07,0x00,0x00,0x08,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x7c, 0x07,0x00,0x00,0x0c,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x7c,0x07,0x00,0x00,0x10,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x7c,0x07,0x00,0x00,0x14, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x79,0x07,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x7c,0x07,0x00,0x00,0x18,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x79,0x07, 0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x7c,0x07,0x00,0x00,0x1c,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x7a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x12,0x00, 0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x0d,0x00,0x21,0x01,0x00,0x43,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0xfe,0x01,0x00, 0x02,0x00,0x79,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12, 0x00,0x00,0xe0,0xfe,0x01,0x00,0x02,0x00,0x79,0x07,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x79,0x07, 0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0xff, 0x01,0x00,0x02,0x00,0x79,0x07,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x03,0x12,0x00,0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x79,0x07,0x00,0x00,0x00,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00, 0x79,0x07,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x12,0x00,0x00, 0x60,0x01,0x01,0x00,0x02,0x00,0x79,0x07,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00, 0x00,0x00,0x03,0x12,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x79,0x07,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x7b,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x2c,0x00,0x04,0x02,0xce,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xce,0x80,0xb3,0x00,0x29,0x00,0x00,0x00,0x00, 0x91,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x00,0x00,0xb2,0x00,0x31,0xb3,0x00,0x2c,0x00,0x04,0x02,0xcf,0x00, 0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32, 0x00,0xcf,0x00,0xb6,0x00,0x2c,0x00,0x04,0x02,0xd0,0x00,0x00,0x8f,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xd0,0x80,0xb4,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x7d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x7e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x07,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x44,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x7c,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x7f,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x45,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x46,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x81,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x47,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00, 0x00,0x02,0x2c,0x00,0x00,0x02,0xd1,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00,0xd1,0x80,0xc9,0x00,0x01,0x00,0x00, 0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x82,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x48,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x7c,0x07,0x00,0x00,0x80,0x02,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb4,0x00,0x32, 0x00,0xb1,0x00,0xb5,0x00,0x2b,0x00,0x02,0xd2,0x00,0x05,0x00,0x01,0x00,0x00,0x00, 0x32,0x00,0xd2,0x80,0xc9,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x84,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x49,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x85,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x4a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x7c,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x86,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4b,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x80,0x01,0x01, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x4c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x88,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4d,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x80, 0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x89,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x4e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8a,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x4f, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00, 0x00,0x80,0x03,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb5,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8b, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x50, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8d,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x51,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x8e,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x52,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c, 0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8f,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x53,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x90,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x54,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x7c,0x07,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x91,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x55,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x03, 0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb6,0x00,0x2c,0x00,0x04,0x02,0xd3,0x00,0x00, 0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0xd3,0x00,0xb7,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x93,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x56,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x94, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x57,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07, 0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xd4,0x00,0x00,0x8f,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xd4,0x00,0xc9,0x00,0x01, 0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x95,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x58,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x7c,0x07,0x00,0x00,0x80,0x01,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb7, 0x00,0x2c,0x00,0x00,0x02,0xd5,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xd5,0x00,0xb8,0x00,0x2c,0x00,0x00,0x02, 0xd6,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x32,0x00,0xd6,0x80,0xc9,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c, 0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb8,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x96,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x59,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x7c, 0x07,0x00,0x00,0x80,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xb9,0x00,0x29,0x03, 0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x90,0x06,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x0c,0x00,0x00,0x02,0x00,0x90,0x06, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x10, 0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x9a,0x07,0x00,0x00,0x14,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x05,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x18,0x00,0x00,0x02,0x00, 0x90,0x06,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00, 0x00,0x1c,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x05,0x00,0x00, 0x02,0x00,0x79,0x04,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0x09,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x0d,0x00,0x00,0x02,0x00,0x79,0x04, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x11, 0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x9a,0x07,0x00,0x00,0x15,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x05,0x00, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x19,0x00,0x00,0x02,0x00, 0x79,0x04,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x9a,0x07,0x00, 0x00,0x1d,0x00,0x00,0x02,0x00,0x79,0x04,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00, 0x04,0x02,0xd7,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x32,0x00,0xd7,0x80,0xbb,0x00,0x31,0xba,0x00,0x29,0x00,0x00,0x00, 0x00,0x97,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x07,0x00,0x00,0x01,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x9a,0x07,0x00,0x00,0x05,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x07,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x9a,0x07,0x00,0x00,0x09,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x9a,0x07,0x00,0x00, 0x0d,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x9a,0x07,0x00,0x00,0x11,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97, 0x07,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x9a,0x07,0x00,0x00,0x15,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x9a,0x07, 0x00,0x00,0x19,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x07,0x00,0x00,0x00, 0x07,0x00,0x02,0x00,0x9a,0x07,0x00,0x00,0x1d,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x98,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x00,0x01,0x13,0x00,0x00,0x00,0x00, 0x9a,0x07,0x00,0x00,0x0e,0x00,0x21,0x01,0x00,0x5a,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0xfe,0x01,0x00,0x02,0x00,0x97, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0, 0xfe,0x01,0x00,0x02,0x00,0x97,0x07,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x03,0x13,0x00,0x00,0x60,0xff,0x01,0x00,0x02,0x00,0x97,0x07,0x00,0x00,0x00, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0xff,0x01,0x00,0x02, 0x00,0x97,0x07,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00, 0x00,0x60,0x00,0x01,0x00,0x02,0x00,0x97,0x07,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x00,0x00,0x00,0x03,0x13,0x00,0x00,0xe0,0x00,0x01,0x00,0x02,0x00,0x97,0x07,0x00, 0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x03,0x13,0x00,0x00,0x60,0x01,0x01, 0x00,0x02,0x00,0x97,0x07,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x03, 0x13,0x00,0x00,0xe0,0x01,0x01,0x00,0x02,0x00,0x97,0x07,0x00,0x00,0x00,0x07,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x99,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x04, 0x02,0xd8,0x00,0x00,0x91,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x07,0x00, 0x00,0x00,0x32,0x00,0xd8,0x80,0xbb,0x00,0x29,0x00,0x00,0x00,0x00,0x91,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x00,0x00,0xba,0x00,0x31,0xbb,0x00,0x2c,0x00,0x04,0x02,0xd9,0x00,0x00,0x8f,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xd9,0x00, 0xbf,0x00,0x2c,0x00,0x04,0x02,0xda,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xda,0x80,0xbd,0x00,0x25,0x00,0x00, 0x00,0x00,0x9b,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9c,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x5c,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9d,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9e,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5d,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0x9e,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07, 0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x9f,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0x9f,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xa0,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x01,0x01,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xa1,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa1,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x02,0x2c,0x00,0x00,0x02,0xdb, 0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0xdb,0x00,0xbc,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x5e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00, 0x00,0xa3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x5f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa5,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x60,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x01,0x01,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xa6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x61,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9a,0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xa7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x62,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x02, 0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xbc,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa8,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x07,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x63,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00, 0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xab,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x64,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x65,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x01,0x01,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xad,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x66,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9a,0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xae,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x67,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x02, 0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xaf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x68,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0,0x02,0x32,0x00,0x00,0x00,0xc9,0x00,0x31, 0xbd,0x00,0x32,0x00,0xb1,0x00,0xbe,0x00,0x2b,0x00,0x02,0xdc,0x00,0x05,0x00,0x01, 0x00,0x00,0x00,0x32,0x00,0xdc,0x80,0xc9,0x00,0x25,0x00,0x00,0x00,0x00,0xb0,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb1,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x69,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x0f,0x36,0x01,0x07,0x00,0x6a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb2,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xb3,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x00, 0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb4, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xb5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb5,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb6,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xb6,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb7,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xb7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07, 0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb8,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x01,0x07,0x00,0xb8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xb9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00, 0xb9,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x03,0x01,0x00, 0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xba, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x6c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07, 0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xbb,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbc,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbb,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6d,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0xbd,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x6e,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x9a,0x07,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xbe,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x6f,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0,0x01,0x01, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x70,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x02,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc0,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x71,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0, 0x02,0x01,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x72,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xc2,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x73, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00, 0x00,0xa0,0x03,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xbe,0x00,0x25,0x00,0x00,0x00, 0x00,0xc3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xc4,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x75,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x9a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc5,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc6,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x01,0x07,0x00,0xc6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00, 0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xc7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xc7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x01, 0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0xc8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc8, 0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x01,0x01,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xc9,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xca,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xca,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0x9a,0x07,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xcb,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x01,0x07,0x00,0xcb,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xcc,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x07,0x00,0x77,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b, 0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xcd, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xce,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x78, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00, 0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xcf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x79,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0xd0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x7a,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0xa0,0x01,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd1,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7b,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x02,0x01,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0xd2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x07,0x00,0x7c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00, 0x00,0x9a,0x07,0x00,0x00,0xa0,0x02,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xd3,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x7d,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x03, 0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xbf,0x00,0x2c,0x00,0x04,0x02,0xdd,0x00,0x00, 0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00, 0xdd,0x00,0xc1,0x00,0x25,0x00,0x00,0x00,0x00,0xd4,0x07,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00, 0x7f,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xd6,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd6,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd7, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xd7,0x07,0x00,0x00,0x00,0x00, 0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x02,0xde,0x00,0x00,0x8f, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xde, 0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x01, 0x07,0x00,0xd8,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x80,0x01, 0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0xd9,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x07,0x00,0x80,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00, 0x9a,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdb,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xda,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x81,0x0c,0x00,0x00,0x00, 0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0,0x00,0x01, 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0xdc,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x07,0x00,0x82,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00, 0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x01,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xdd,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x83,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0, 0x01,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x84,0x0c,0x00,0x00, 0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x00, 0x01,0x00,0x00,0x00,0x00,0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x07,0x00,0x85,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00, 0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0xa0,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe1,0x07,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x86,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00, 0x20,0x01,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc1,0x00,0x2c,0x00,0x00,0x02,0xdf, 0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x32,0x00,0xdf,0x00,0xc2,0x00,0x2c,0x00,0x00,0x02,0xe0,0x00,0x00,0x8f,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x32,0x00,0xe0,0x80,0xc9, 0x00,0x25,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xe2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x87,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07, 0x00,0x88,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a, 0x07,0x00,0x00,0x20,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc2,0x00,0x25,0x00, 0x00,0x00,0x00,0xe4,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe5, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x01,0x07,0x00,0x8a,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x9a,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xe6,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x01,0x07,0x00,0xe6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0x9a, 0x07,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x8d,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xe7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x07,0x00,0x8b,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9, 0x0b,0x00,0x00,0x00,0x00,0x9a,0x07,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00, 0x8d,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xe8, 0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x00, 0x8c,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xc9,0x0b,0x00,0x00,0x00,0x00,0x9a,0x07, 0x00,0x00,0xa0,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc3,0x00,0x37,0x00,0x06, 0x00,0x20,0x08,0x00,0x27,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00, 0x00,0x00,0x00,0x21,0x01,0xe9,0x07,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20, 0x08,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0xea,0x07,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00, 0x29,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0xeb,0x07,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xec,0x07,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xed,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x90,0x06,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf2,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x06,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90, 0x06,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x07,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xe9,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xed,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9,0x07,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xe9,0x07,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x07, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9,0x07,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xe9,0x07,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf2,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9,0x07,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9, 0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x07,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xed,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0xea,0x07,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x07, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xea,0x07,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf2,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xea,0x07,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xea, 0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xec,0x07,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0xeb,0x07,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0xed,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xeb,0x07,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xee,0x07,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0xeb,0x07,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xef,0x07, 0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xeb,0x07,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x03,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xeb,0x07,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xf1,0x07,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0xeb,0x07,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00, 0xf2,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xeb,0x07,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x03,0x00,0x00,0x00,0xf3,0x07,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xeb, 0x07,0x00,0x00,0x07,0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0xe1,0x00,0x00,0x8f,0x06, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0xe1,0x00, 0xc6,0x00,0x2c,0x00,0x04,0x02,0xe2,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0xe2,0x80,0xc4,0x00,0x25,0x00,0x00, 0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf4,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x8d,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xec,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf5,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xf5,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xf6,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xee,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xf7,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xf7,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xf8,0x07,0x00, 0x00,0x00,0x00,0x21,0x01,0xf0,0x07,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0xe3, 0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00, 0x32,0x00,0xe3,0x80,0xc9,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xf9,0x07,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00, 0x00,0x36,0x03,0x07,0x00,0xf9,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xf1,0x07,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc4,0x00,0x32,0x00,0xb1,0x00, 0xc5,0x00,0x2b,0x00,0x02,0xe4,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0xe4, 0x80,0xc9,0x00,0x25,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x8e, 0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xfb,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xfb,0x07,0x00,0x00, 0x00,0x00,0x21,0x01,0xed,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfc,0x07, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x21, 0x01,0xee,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfd,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0xfd,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd0,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x0b, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00, 0xff,0x07,0x00,0x00,0x00,0x00,0x21,0x01,0xf1,0x07,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x00,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0xf2,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x01, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x01,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xf3,0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc5, 0x00,0x25,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x8f,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0xec,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x03, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x03,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0xed,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xee, 0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc7,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x05,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xef,0x07,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0, 0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07, 0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xf0,0x07,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x0b,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x07,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0xf1,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x08,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xf2,0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31, 0xc6,0x00,0x2c,0x00,0x04,0x02,0xe5,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xe5,0x00,0xc7,0x00,0x25,0x00,0x00, 0x00,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x09,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x90,0x0c,0x00,0x00,0x00,0x00,0x21, 0x01,0xec,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0a,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x36,0x03,0x07,0x00,0x0a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x07, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc6,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36, 0x03,0x07,0x00,0x0b,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xee,0x07,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x02,0xe6,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0xe6,0x00,0xc9,0x00,0x01,0x00,0x00,0x00, 0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x0c,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x36,0x03,0x07,0x00,0x0c,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0xef,0x07,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31, 0xc7,0x00,0x2c,0x00,0x00,0x02,0xe7,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0xe7,0x00,0xc8,0x00,0x2c,0x00,0x00, 0x02,0xe8,0x00,0x00,0x8f,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x32,0x00,0xe8,0x80,0xc9,0x00,0x25,0x00,0x00,0x00,0x00,0xbe,0x0b,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0d,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x0f, 0x36,0x03,0x07,0x00,0x91,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xec,0x07,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x31,0xc8,0x00,0x25,0x00,0x00,0x00,0x00, 0xbe,0x0b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x0b,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0x0f,0x36,0x03,0x07,0x00,0x92,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0xec, 0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x06,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8e,0x06,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x0f,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb8,0x0b,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x36,0x03,0x07,0x00,0x0f,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0xed,0x07,0x00,0x00, 0x00,0x00,0x31,0xc9,0x00,0x34,0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x00,0x1e,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00, 0x11,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x12,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x10, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x10,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x1e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1c,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x13,0x08,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x94,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x14,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x15,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x15,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x15,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x16,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x96,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x1d, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x17,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00, 0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x08,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x19, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x0c, 0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x1a,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00, 0x00,0x00,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x1a,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x16,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1b,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x1d,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1d,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x21, 0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x19,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x1e,0x08, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x12,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x1f,0x08,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10, 0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x11,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x1f,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0xe9,0x00,0x00,0x95,0x0c,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x0c,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00, 0xe9,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1e,0x08, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x08,0x00, 0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x21,0x08,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1e,0x08,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x11,0x08,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x21,0x08,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82, 0x46,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82, 0x66,0x48,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81, 0x25,0x51,0x44,0x02,0x00,0x01,0xff,0x0f,0xff,0x0f,0x69,0x00,0x00,0x00,0x60,0x86, 0x25,0x49,0xa4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x02,0x00,0x00,0x60,0x01, 0x05,0x4a,0x24,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x60,0x06, 0x45,0x48,0xe4,0x01,0x00,0x56,0x64,0x01,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x48,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x48,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x07,0x00,0x00,0x60,0x86, 0x44,0x51,0x04,0x02,0x05,0x01,0x64,0x48,0x80,0x00,0x69,0x05,0x4a,0x68,0x02,0x4a, 0x31,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x65,0x01,0x44,0x01,0x00,0x05,0x02,0x00, 0x02,0x00,0x2c,0x00,0x03,0x00,0x00,0x40,0x04,0x48,0x00,0x00,0x00,0x00,0xa0,0x4c, 0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x49,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x41,0x03,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x48,0x00,0x01,0x64,0x01, 0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x49,0x44,0x48,0x00,0x06,0x64,0x01, 0x00,0x00,0x41,0x06,0x20,0x22,0x2e,0x4a,0x11,0x01,0x62,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0xc4,0x01,0x00,0x56,0x44,0x01,0x00,0x00,0x5b,0x05,0x00,0x00,0x60,0x06, 0x44,0x49,0x84,0x48,0x01,0x06,0x44,0x49,0x64,0x48,0x49,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x48,0x00,0x00,0x00,0x00,0xe0,0xff, 0xff,0xff,0x40,0x02,0x4a,0xa8,0x2a,0x4a,0x11,0x49,0x5b,0x02,0x00,0x00,0x60,0x06, 0x84,0x48,0x44,0x02,0x01,0x06,0x84,0x48,0x64,0x48,0x40,0x07,0x49,0xa8,0x0a,0x49, 0x11,0x01,0x69,0x03,0x49,0x68,0x92,0x4a,0x21,0x00,0x70,0x03,0x00,0x00,0x20,0x82, 0x01,0x00,0x84,0x48,0x00,0x31,0x18,0x00,0x18,0x00,0x70,0x02,0x80,0x00,0x20,0x02, 0x01,0x00,0x84,0x49,0x00,0x52,0x04,0x49,0x00,0x00,0x61,0x00,0x48,0xe2,0x9e,0x30, 0x11,0x00,0x70,0x00,0x00,0x00,0x20,0x82,0x01,0x00,0x84,0x48,0x00,0x31,0x10,0x00, 0x10,0x00,0x40,0x00,0x51,0x68,0x42,0x51,0x01,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0xe5,0x48,0x44,0x51,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x25,0x48,0x44,0x51,0x00,0x05,0x60,0x00,0x60,0x00,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x47,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0x25,0x47,0x44,0x01,0x00,0x05,0x0c,0x00,0x0c,0x00,0x69,0x00,0x47,0x68,0x42,0x01, 0x41,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x01,0x00,0x05,0x14,0x00, 0x14,0x00,0x69,0x00,0x48,0x68,0x42,0x01,0x11,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0xe5,0x47,0x44,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0xc5,0x47,0x44,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0xa5,0x47,0x44,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0x85,0x47,0x44,0x01,0x00,0x05,0x07,0x00,0x07,0x00,0x5b,0x00,0x00,0x00,0x60,0x86, 0x44,0x4a,0x24,0x02,0x05,0x01,0x24,0x51,0x08,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0xc5,0x01,0x44,0x01,0x00,0x05,0x18,0x00,0x18,0x00,0x41,0x00,0x00,0x00,0x60,0x86, 0x85,0x01,0x44,0x01,0x00,0x05,0x1c,0x00,0x1c,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0xc5,0x48,0x84,0x48,0x00,0x05,0xf8,0xff,0xf8,0xff,0x40,0x00,0x00,0x00,0x60,0x86, 0xa5,0x48,0x84,0x48,0x00,0x05,0xf0,0xff,0xf0,0xff,0x40,0x00,0x00,0x00,0x60,0x86, 0x65,0x47,0x84,0x48,0x00,0x05,0xe8,0xff,0xe8,0xff,0x70,0x00,0x40,0x00,0x20,0x82, 0x01,0x00,0x84,0x48,0x00,0x31,0x08,0x00,0x08,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x75,0x48,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x84,0x48,0x00,0x35,0x1f,0x00,0x1f,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x4f,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x40,0x51,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x44,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x86, 0x44,0x02,0x44,0x48,0x05,0x01,0x24,0x51,0xf8,0xff,0x31,0xa0,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x60,0x86, 0x65,0x49,0x44,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x44,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x46,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xc5,0x49,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xa5,0x49,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x44,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x11,0x31,0x74,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa1,0x03,0x80,0x00,0x00, 0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xc5,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xa5,0x49,0xc4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x61,0x31,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x80,0x48,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x44,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x11,0x31,0x64,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00, 0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xc5,0x49,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xa5,0x49,0xa4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x61,0x32,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x48,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x44,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xc5,0x49,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x31,0xa3,0x03,0x80,0x00,0x00, 0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xa5,0x49,0x64,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x49,0xa8,0x88,0x00, 0x01,0x00,0x61,0x00,0x2e,0xa1,0x00,0x00,0x01,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85, 0x45,0x02,0xe4,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x05,0xc0,0x05,0x61,0x00,0x00,0x00,0x68,0x06, 0x01,0x00,0xe4,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0xe5,0x49,0xe4,0x49,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0xc0,0x00,0x60,0x06, 0x01,0x00,0xe4,0x49,0x00,0x16,0xa4,0x49,0x00,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xff,0xff,0xff,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xc4,0x49,0x00,0x51,0x03,0x00,0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2a,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xc4,0x49,0x00,0x11,0x03,0x00,0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x19,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xc4,0x49,0x00,0x11,0x04,0x00,0x04,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x4c,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0e,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b,0x10,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x61,0x22,0x10,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39, 0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b, 0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x3d, 0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e,0x10,0x00,0x61,0x23,0x11,0x61,0x00,0x3f, 0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x41, 0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x43, 0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x45, 0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x46,0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85, 0x45,0x02,0xa4,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x15, 0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1d, 0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x25, 0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x29,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2d, 0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x03, 0xc0,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0xa4,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x49,0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0xa8,0x02, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe, 0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0f, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x06, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xd5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x35,0x00,0x00,0x60,0x06,0x05,0x05,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x07,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x09,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x39,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x07,0x02,0x68,0x3a,0x4a,0x21,0x00,0x31,0xea,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xdb,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x3c,0x08,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a,0x11,0x01,0x31,0xce,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x07,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08, 0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0c,0x21,0x2b,0x03, 0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x40,0x04,0x05,0x21,0x03,0x03,0x10,0x04,0x31,0xcf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x46,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x05,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x36,0x00,0x00,0x60,0x06, 0x05,0x07,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x37,0x09,0xa8,0x5a,0x49, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x35,0x06,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x31,0xf6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xd7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xe8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x40,0x02,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x03,0x68,0x42,0x02, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x31,0xca,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x06,0x10,0x03,0x40,0x3a,0x07,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x31,0xbb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x05,0x68,0x02,0x0b, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x07, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x06, 0x10,0x05,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x04,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x06,0x10,0x08,0x31,0xbc,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xcd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x43,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x43,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x30,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x31,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x32,0x00,0x00,0x60,0x06, 0x05,0x07,0x84,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x31,0x97,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2a,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x33,0x00,0x00,0x20,0x82, 0x45,0x09,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x35,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x06,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x37,0x08,0xa8,0x5a,0x49,0x11,0x47,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00,0x00,0x60,0x06, 0x05,0x09,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xd9,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xca,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3a,0x05,0x68,0x02,0x4a,0x21,0x00,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x08,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xfb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xfc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xee,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x31,0xdf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2c, 0x00,0x00,0x69,0x02,0x02,0x68,0x3a,0x08,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x09,0x21,0x00,0x31,0xb0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x3d,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x09,0xa8,0x32,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06, 0x10,0x04,0x40,0x30,0x07,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0xc4,0x47,0x00,0x00,0x40,0x00,0x4a,0xa8,0x0a,0x4a, 0x11,0x47,0x31,0xe1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x69,0x07,0x05,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07, 0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x42,0x02, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x4a, 0x21,0x00,0x40,0x05,0x0c,0x21,0x03,0x06,0x10,0x05,0x40,0x05,0x0d,0x21,0x03,0x06, 0x10,0x08,0x40,0x05,0x04,0x21,0x03,0x06,0x10,0x03,0x40,0x05,0x05,0x21,0x03,0x06, 0x10,0x0a,0x40,0x05,0x08,0x21,0x03,0x06,0x10,0x07,0x31,0xd3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xc4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x3e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x38,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x31,0xfa,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xfb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xec,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xdd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0xce,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x3a,0x00,0x00,0x20,0x82,0x45,0x07,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xd0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0x92,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x40,0x3b,0x09,0xa8,0x5a,0x49,0x11,0x47,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x07,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x69,0x31,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x07,0x68,0x02,0x06, 0x21,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xc4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x40,0x06,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x31,0xc6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x34,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x36,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x37,0x08,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x08, 0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x04, 0x10,0x0a,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x39, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x04, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x05,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x07,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xc2,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb3,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x31,0x04,0x61,0x02,0x2e, 0x20,0x00,0x40,0x33,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xc4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x04,0x09,0x21,0x2b,0x04, 0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04,0x10,0x02,0x31,0xf5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x4a,0x21,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x39,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x3f,0x07,0x61,0x02,0x2e,0x20,0x00,0x69,0x03,0x02,0x68,0x3a,0x03, 0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x04,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x09,0x21,0x03,0x07, 0x10,0x05,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x35, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x35, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x84,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x05,0x68,0x5a,0x49,0x01,0x06,0x31,0xaf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x34,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x49,0x84,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x31,0xe2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x32,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x4a,0x21,0x00,0x31,0xf4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xc5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x03,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06,0x21,0x03,0x03, 0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x33, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0xa4,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x20,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34, 0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36, 0x10,0x00,0x61,0x22,0x10,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38, 0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c, 0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0xa4,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x14,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x18, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1c,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x20, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x24,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x28, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2c,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xa0,0x03,0xa0,0x03,0x61,0x00,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x0a,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xf8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x69,0x38,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x39,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a, 0x11,0x01,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x2e, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xb2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3b,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x33,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x2d,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x2c,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0x9a,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x3a,0x00,0x00,0x60,0x06,0x05,0x05,0x84,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xeb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0x9f,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3f,0x06,0xa8,0x02,0x4a,0x11,0x48,0x31,0xa0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e, 0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08, 0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08,0x10,0x07,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x40,0x31,0x09,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x33,0x05,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x32,0x0a,0xa8,0x32,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a, 0x11,0x47,0x40,0x05,0x0c,0x21,0x2b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08, 0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x40,0x04,0x0d,0x21,0x03,0x08, 0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08,0x10,0x02,0x31,0xf4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x28,0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x29,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x06,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x39,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xfa,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0xeb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xdc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a, 0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3b,0x07,0x61,0x02,0x2e, 0x20,0x00,0x40,0x3c,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02, 0x21,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xde,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09, 0x21,0x00,0x31,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x31,0x08,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x30,0x04,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x26,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xc7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a,0x11,0x47,0x31,0xda,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04,0x10,0x02,0x31,0xfb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x24,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x69,0x37,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x38,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03, 0x10,0x08,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x24, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x23, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x84,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x69,0x00,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x31,0xa3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x23,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x31,0xb4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x12, 0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x22,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xc4,0x49,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x08,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xc4,0x49,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x21,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0d,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06, 0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x0b,0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85, 0x45,0x02,0xa4,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11, 0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19, 0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21, 0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29, 0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0x40,0x03, 0x40,0x03,0x61,0x00,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0xa4,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x49,0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0xa8,0x02, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe, 0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x04, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01, 0x00,0x00,0x69,0x00,0x0c,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00,0x00,0x00,0x40,0x02,0x03,0x21,0x0b,0x0c, 0x10,0x49,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x09,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x38,0x03,0xa8,0x1a,0x4a,0x11,0x01,0x69,0x04,0x04,0x68,0x42,0x02, 0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x0a,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x03,0x21,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05,0x21,0x03,0x0c, 0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x0c,0x10,0x07,0x40,0x05,0x0b,0x21,0x03,0x0c, 0x10,0x0a,0x40,0x05,0x04,0x21,0x2b,0x0c,0x10,0x02,0x31,0xc9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x1f,0x00,0x00,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x01,0x03,0x21,0x2b,0x0c, 0x10,0x02,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x1e, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a,0x11,0x48,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x05,0x68,0x42,0x02,0x21,0x00,0x69,0x03,0x08,0x68,0x02,0x07, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x0a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x05,0x04,0x21,0x0b,0x03, 0x10,0x49,0x40,0x05,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x05,0x09,0x21,0x03,0x03, 0x10,0x08,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x69,0x04,0x0b,0x68,0x02,0x0a,0x21,0x00,0x40,0x3e,0x04,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x3f,0x06,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x31,0x09,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x40,0x05,0x0c,0x21,0x03,0x03, 0x10,0x0b,0x69,0x05,0x02,0x68,0x3a,0x04,0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x06, 0x21,0x00,0x69,0x05,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x4a, 0x21,0x00,0x31,0xd0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x40,0x04,0x05,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03, 0x10,0x07,0x40,0x04,0x0b,0x21,0x03,0x03,0x10,0x0a,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x04,0x31,0xc3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x03,0x05,0x68,0x42,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x0b,0x03, 0x10,0x49,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x03, 0x10,0x05,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x00,0x0a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x03,0x09,0x21,0x03,0x03, 0x10,0x08,0x40,0x36,0x04,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x37,0x06,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x04,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05,0x21,0x2b,0x03, 0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x1b, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a,0x11,0x48,0x69,0x00,0x09,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x04,0x68,0x42,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x00, 0x00,0x00,0x40,0x05,0x03,0x21,0x0b,0x09,0x10,0x49,0x40,0x05,0x05,0x21,0x03,0x09, 0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x09,0x10,0x07,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x01,0x03,0x21,0x2b,0x09,0x10,0x02,0x31,0x91,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x1a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x1a,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04,0x21,0x0b,0x03, 0x10,0x49,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1a, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x69,0x31,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x03,0x04,0x21,0x0b,0x03, 0x10,0x49,0x40,0x03,0x05,0x21,0x2b,0x03,0x10,0x02,0x31,0xa3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x19,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x20,0x0e,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b,0x10,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85, 0x45,0x02,0xa4,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x80,0x03,0x80,0x03,0x61,0x00,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0xa4,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x72,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0xa8,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x0a,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xf4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x69,0x34,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x35,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03, 0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a,0x11,0x01,0x31,0xa9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xca,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x15, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xbf,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xbe,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x37,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x03,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x3e,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a, 0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x13,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x13,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x96,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x35,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xe7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xd8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0xba,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26, 0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3b,0x06,0xa8,0x02,0x4a,0x11,0x48,0x31,0xac,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e, 0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08, 0x10,0x04,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08, 0x10,0x07,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x40,0x3d,0x09,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x3e,0x05,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x3f,0x0a,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x40,0x05,0x0c,0x21,0x2b,0x08, 0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08, 0x10,0x06,0x40,0x04,0x0d,0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08, 0x10,0x02,0x31,0xf1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23, 0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27, 0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x10, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x35,0x00,0x00,0x60,0x06, 0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xf6,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xe7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xd8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a, 0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x07,0x61,0x02,0x2e, 0x20,0x00,0x40,0x38,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02, 0x21,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x26, 0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09, 0x21,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x3d,0x08,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x3c,0x04,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xcf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x0d,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb2,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x95,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04, 0x10,0x02,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04, 0x10,0x02,0x31,0xf7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x0b, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x69,0x32,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x34,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xbb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x0a,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0x84,0x49,0x00,0x05,0x20,0x00,0x20,0x00,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x31,0xae,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xaf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x09,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x00, 0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x31,0xb1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06, 0x10,0x05,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x08, 0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x44,0x4a,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x34,0x03,0x62,0x80,0x48,0x11,0x00,0x61,0x20,0x28,0x61,0x00,0x04, 0x10,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x35,0x03,0x62,0x20,0x48,0x11,0x00,0x61,0x00,0x24,0x61,0x00,0x05, 0x10,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x20,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x0c,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x0b, 0x10,0x00,0x61,0x24,0x29,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x34, 0x10,0x00,0x61,0x00,0x0d,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x36, 0x10,0x00,0x61,0x25,0x2a,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x38, 0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x3c, 0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x3e, 0x10,0x00,0x61,0x26,0x2b,0x61,0x00,0x3f,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x40, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x42, 0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x44, 0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x46, 0x10,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x64,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x84,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x84,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x09,0xa8,0x5a,0x49,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xe7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xd8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xc9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xba,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x05,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x9d,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x05,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x5a,0x49, 0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3c,0x00,0x00,0x60,0x06,0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x84,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x31,0xce,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x84,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xef,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xd1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c,0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x5a,0x49, 0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x35,0x00,0x00,0x60,0x06,0x05,0x03,0x84,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x84,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x9b,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x84,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xcd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x03,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x9f,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x64,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x91,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x49,0x84,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x84,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x45,0x02,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06, 0x44,0x02,0x24,0x49,0x01,0x06,0x44,0x02,0x24,0x51,0x41,0x01,0x00,0x80,0x60,0x06, 0x01,0x20,0x44,0x02,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06, 0x05,0x4a,0x44,0x02,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x02,0x44,0x02,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x02,0x4a,0xa8,0x2a,0x4a, 0x11,0x49,0x69,0x01,0x49,0x68,0x9a,0x4a,0x21,0x00,0x70,0x01,0x80,0x00,0x20,0x02, 0x01,0x00,0x64,0x49,0x00,0x52,0x04,0x49,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x51,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x9e,0xe9,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x40,0x51,0x11,0x00,0x61,0x07,0x03,0x62,0x60,0x02, 0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x44,0x48,0x00,0x06,0x44,0x02, 0x00,0x02,0x01,0x20,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x16,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x60,0x86, 0x25,0x49,0x44,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x44,0x02,0x00,0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x47,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x49,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x49,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x61,0x32,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x11,0x31,0x74,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x21,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa4,0x03,0x80,0x00,0x00, 0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x49,0xc4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x61,0x34,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x80,0x48,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x11,0x31,0x64,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x49,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x49,0xa4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x61,0x35,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x48,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02, 0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x49,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x23,0x00,0xe8,0x01,0x00, 0x11,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x49,0x64,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x01,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x15,0x00,0x00, 0x00,0x00,0x61,0x00,0x49,0xa8,0xa0,0x00,0x01,0x00,0x61,0x00,0x2e,0xa1,0x00,0x00, 0x01,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85,0x45,0x02,0xc4,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x05, 0xc0,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0xc4,0x49,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x49,0xc4,0x49,0x00,0x05,0x01,0x00, 0x01,0x00,0x70,0x01,0xc0,0x00,0x60,0x06,0x01,0x00,0xc4,0x49,0x00,0x16,0x84,0x49, 0x00,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xff, 0xff,0xff,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x51,0x03,0x00, 0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x2a, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x03,0x00, 0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x18, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x04,0x00, 0x04,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x4d, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x22,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x80, 0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x61,0x32,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x10,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x44,0x00, 0x00,0x00,0x61,0x30,0x1c,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b, 0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c,0x10,0x00,0x61,0x37,0x28,0x61,0x00,0x3d, 0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e,0x10,0x00,0x01,0x26,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x23,0x11,0x61,0x00,0x3f,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x40, 0x10,0x00,0x61,0x39,0x19,0x61,0x00,0x41,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x1d,0x61,0x00,0x42, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x44, 0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x46, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x19, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x21, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x29, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x03,0xc0,0x03,0x61,0x00,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0f,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xf7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xd8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0xc9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xba,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x49,0xa8,0xe2,0x49,0x11,0x47,0x31,0xdd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3d,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x07,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x31,0xec,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x00,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x04,0x21,0x2b,0x03, 0x10,0x02,0x40,0x3f,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a, 0x11,0x01,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x07,0x02,0x68,0x3a,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x40,0x04,0x05,0x21,0x03,0x03,0x10,0x04,0x31,0xc3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x3a,0x09,0xa8,0x7a,0x49,0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xf7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x4a, 0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x06,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xeb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x40,0x02,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x02,0x03,0x68,0x42,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x06,0x10,0x03,0x40,0x3c,0x07,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x31,0xbe,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x05,0x68,0x02,0x0b, 0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x07,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x06, 0x10,0x05,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06, 0x10,0x04,0x40,0x04,0x03,0x21,0x2b,0x06,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x06, 0x10,0x08,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x44, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x44, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0x95,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x32,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x34,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x35,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xc8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x31,0x9a,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2a,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x36,0x00,0x00,0x20,0x82, 0x45,0x09,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x38,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x31,0xcb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x3a,0x08,0xa8,0x7a,0x49,0x11,0x47,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06, 0x05,0x09,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xdd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xcc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3c,0x05,0x68,0x02,0x4a, 0x21,0x00,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x08,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x31,0xfe,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xff,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xf1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xe0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28,0x00,0x00,0x31,0xd3,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x69,0x02,0x02,0x68,0x3a,0x08, 0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x06, 0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x09, 0x21,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x31,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x09,0xa8,0x32,0x4a,0x11,0x47,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x32,0x07,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x31,0xe4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x07,0x05,0x68,0x02,0x0b, 0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x42,0x02, 0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x0a,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x4a,0x21,0x00,0x40,0x05,0x0c,0x21,0x03,0x06, 0x10,0x05,0x40,0x05,0x0d,0x21,0x03,0x06,0x10,0x08,0x40,0x05,0x04,0x21,0x03,0x06, 0x10,0x03,0x40,0x05,0x05,0x21,0x03,0x06,0x10,0x0a,0x40,0x05,0x08,0x21,0x03,0x06, 0x10,0x07,0x31,0xd6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x3f, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0x9d,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xfe,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xef,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xd1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x3c,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xd2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0x95,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x40,0x3e,0x09,0xa8,0x7a,0x49,0x11,0x47,0x40,0x33,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x69,0x34,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x07,0x68,0x02,0x06, 0x21,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x40,0x06,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x31,0xc9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x40,0x37,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x39,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x3a,0x08,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xcb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x08, 0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x04, 0x10,0x0a,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x3b, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x33,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x31,0xd4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xc5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x34,0x04,0x61,0x02,0x2e, 0x20,0x00,0x40,0x36,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x40,0x04,0x09,0x21,0x2b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04, 0x10,0x02,0x31,0xf8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x38, 0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10,0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x4a, 0x21,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x03,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a,0x11,0x48,0x31,0xcc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xbe,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x33,0x07,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x02,0x68,0x3a,0x03,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07, 0x10,0x06,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x2b,0x07, 0x10,0x02,0x40,0x04,0x09,0x21,0x03,0x07,0x10,0x05,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x37,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x37,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x05,0x68,0x7a,0x49, 0x01,0x06,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06, 0x10,0x05,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x36, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x31,0xe5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xd6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x35,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x4a,0x21,0x00,0x31,0xf7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x03,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x06,0x21,0x03,0x03, 0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x34, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x22,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x80, 0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x61,0x32,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x01,0x25,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x22,0x10,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38, 0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x44,0x00,0x00,0x00,0x61,0x30,0x1c,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c, 0x10,0x00,0x61,0x37,0x28,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x14,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x18, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1c,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x20, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x24,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x28, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2c,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xa0,0x03,0xa0,0x03,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x38,0x22, 0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49,0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xfe, 0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x0a, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xfb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x69,0x3b,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3d,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a, 0x11,0x01,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x22, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x30, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xb5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x3e,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x36,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x02, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x2e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x2e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x3c,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xee,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0x93,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26,0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x33,0x06,0xa8,0x02,0x4a,0x11,0x48,0x31,0xa2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e, 0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08, 0x10,0x04,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08, 0x10,0x07,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x40,0x34,0x09,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x36,0x05,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x35,0x0a,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x28,0x22,0x00,0x00,0x40,0x05,0x0c,0x21,0x2b,0x08, 0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08,0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08, 0x10,0x06,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0d,0x21,0x03,0x08, 0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08,0x10,0x02,0x31,0xf7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x28,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x2a,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x06,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3d,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0xee,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a, 0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x3e,0x07,0x61,0x02,0x2e, 0x20,0x00,0x40,0x3f,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02, 0x21,0x00,0x31,0xf1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07,0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xc4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07, 0x10,0x05,0x40,0x34,0x08,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x32,0x04,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xc6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08,0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04, 0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x20,0x22,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xca,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a,0x11,0x47,0x31,0xdc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a,0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04,0x10,0x02,0x31,0xfe,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x25,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x69,0x3a,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x3b,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03,0x10,0x02,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03, 0x10,0x08,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x25, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x25, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x64,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x69,0x00,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04, 0x10,0x02,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x24, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a, 0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x31,0xb7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x12, 0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x23,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xa4,0x49,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x08,0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82, 0x01,0x00,0xa4,0x49,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x23,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x22,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x34,0x0d,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06, 0x10,0x00,0x61,0x39,0x19,0x61,0x00,0x07,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x08,0x22,0x00,0x00,0x61,0x31,0x1d,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x0a, 0x10,0x00,0x61,0x35,0x29,0x61,0x00,0x0b,0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85, 0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x70,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11, 0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19, 0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21, 0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29, 0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0x40,0x03, 0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0e,0x90, 0x00,0x00,0x61,0x30,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49,0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xfe, 0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x04, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5e,0x90, 0x00,0x00,0x69,0x30,0x0c,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x0c,0x10,0x49,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x09,0xa8,0x52,0x4a,0x11,0x47,0x40,0x3b,0x03,0xa8,0x1a,0x4a, 0x11,0x01,0x69,0x04,0x04,0x68,0x42,0x02,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x69,0x04,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x03, 0x21,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x40,0x05,0x05,0x21,0x03,0x0c,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x0c, 0x10,0x07,0x40,0x05,0x0b,0x21,0x03,0x0c,0x10,0x0a,0x40,0x05,0x04,0x21,0x2b,0x0c, 0x10,0x02,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x20, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x01,0x03,0x21,0x2b,0x0c,0x10,0x02,0x31,0x91,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x1f,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a, 0x11,0x48,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x69,0x34,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x03,0x05,0x68,0x42,0x02, 0x21,0x00,0x69,0x03,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x0a,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x05,0x04,0x21,0x1b,0x03,0x10,0x49,0x40,0x05,0x06,0x21,0x03,0x03, 0x10,0x05,0x40,0x05,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xb0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x04,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x40,0x30,0x04,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x33,0x06,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x34,0x09,0xa8,0x32,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a, 0x11,0x47,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x1f,0x90, 0x00,0x00,0x40,0x05,0x0c,0x21,0x03,0x03,0x10,0x0b,0x69,0x05,0x02,0x68,0x3a,0x04, 0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x0a,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x4a,0x21,0x00,0x31,0xd2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x05,0x21,0x2b,0x03, 0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0b,0x21,0x03,0x03, 0x10,0x0a,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0c,0x21,0x03,0x03, 0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x1e, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x69,0x34,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x03,0x05,0x68,0x42,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03, 0x10,0x49,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x03, 0x10,0x05,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x00,0x0a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x03,0x09,0x21,0x03,0x03, 0x10,0x08,0x40,0x39,0x04,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x3a,0x06,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xcb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x04,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x4a, 0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x1f,0x90, 0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05,0x21,0x2b,0x03, 0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x1c, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a,0x11,0x48,0x69,0x00,0x09,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x04,0x68,0x42,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x70,0x00,0x00,0x00,0x40,0x05,0x03,0x21,0x1b,0x09, 0x10,0x49,0x40,0x05,0x05,0x21,0x03,0x09,0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x09, 0x10,0x07,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x1b, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x01,0x03,0x21,0x2b,0x09,0x10,0x02,0x31,0x94,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x1b,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x1b,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x69,0x34,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x02,0x04,0x21,0x1b,0x03, 0x10,0x49,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x1a, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x69,0x34,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x49,0x40,0x03,0x05,0x21,0x2b,0x03, 0x10,0x02,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1a, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x22,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x01,0x24,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x0a,0x80,0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34, 0x10,0x00,0x61,0x32,0x27,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x13, 0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1b, 0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x23, 0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2b, 0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0x80,0x03, 0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x9d,0x22, 0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49,0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xfe, 0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0a, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xf7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x69,0x37,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x38,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a, 0x11,0x01,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x00, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xcc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x15, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xb3,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x31,0xb0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x40,0x3a,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x03,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x30,0x05,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x67,0x20, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xc2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x14,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x14,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x99,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x38,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x39,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xdb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26, 0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3e,0x06,0xa8,0x02,0x4a,0x11,0x48,0x31,0xaf,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e, 0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08, 0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08, 0x10,0x07,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x40,0x31,0x09,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x30,0x05,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x33,0x0a,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x1f,0x02, 0x00,0x00,0x40,0x05,0x0c,0x21,0x2b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08, 0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0d,0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08, 0x10,0x02,0x31,0xf4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x10, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xf9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xdb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3a,0x07,0x61,0x02,0x2e,0x20,0x00,0x40,0x3b,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02,0x21,0x00,0x31,0xfd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xdc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07, 0x10,0x06,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07, 0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xc1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x31,0x08,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x3f,0x04,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x1e,0x00,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x0d,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04, 0x10,0x02,0x31,0xfa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0b, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x69,0x35,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x37,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xbe,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0a,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x0a,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x49,0x00,0x05,0x20,0x00,0x20,0x00,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x31,0xa0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x09,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x31,0xb4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x08, 0x00,0x00,0x61,0x32,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x01,0x21,0x00,0xe8,0x01,0x00, 0x11,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x37,0x03,0x62,0x80,0x48,0x11,0x00,0x01,0x22,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x37,0x28,0x61,0x00,0x04,0x10,0x00,0x31,0xa8,0x03,0x80,0x00,0x00, 0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x38,0x03,0x62,0x20,0x48, 0x11,0x00,0x61,0x00,0x24,0x61,0x00,0x05,0x10,0x00,0x01,0x23,0x00,0xe8,0x01,0x00, 0x11,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x20,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x09, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x71,0x92,0x00,0x00,0x61,0x3d,0x0c,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x0b,0x10,0x00,0x61,0x27,0x29,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x31, 0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x0d,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x36,0x10,0x00,0x61,0x28,0x2a,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x39, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x3b, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x3d, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x3e,0x10,0x00,0x61,0x29,0x2b,0x61,0x00,0x3f, 0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x41, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x43, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x45, 0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x46,0x10,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xea,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x31,0xdb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20, 0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18, 0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14, 0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x05, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x91,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x05,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49, 0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xe3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x95,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49, 0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xda,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xcb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xac,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xa0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x93,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x94,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0x96,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0xa4,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x85,0x49,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06, 0x84,0x49,0x44,0x02,0x01,0x06,0x84,0x49,0x24,0x51,0x41,0x01,0x00,0x80,0x60,0x06, 0x01,0x20,0x84,0x49,0x00,0x01,0x44,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06, 0x05,0x4a,0x84,0x49,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x02,0x84,0x49,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x02,0x4a,0xa8,0x2a,0x4a, 0x11,0x49,0x69,0x01,0x49,0x68,0x9a,0x4a,0x21,0x00,0x70,0x01,0x80,0x00,0x20,0x02, 0x01,0x00,0x64,0x49,0x00,0x52,0x04,0x49,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xfe,0xed,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x40,0x51,0x11,0x00,0x61,0x07,0x03,0x62,0x60,0x02, 0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x49,0x44,0x48,0x00,0x06,0x84,0x49, 0x00,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x12,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x60,0x86, 0x25,0x49,0x84,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x48,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x49,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x49,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x61,0x35,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x11,0x31,0x74,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x12,0x00, 0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x49,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x49,0xc4,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x61,0x37,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x80,0x48, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x11,0x31,0x64,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x00, 0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x49,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x49,0xa4,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x61,0x38,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x48, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xa5,0x49,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x48,0x00, 0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x49,0x64,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x01,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x15,0x00,0x00, 0x00,0x00,0x61,0x00,0x49,0xa8,0xa0,0x00,0x01,0x00,0x61,0x00,0x2e,0xa1,0x00,0x00, 0x01,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x50,0x85,0x45,0x02,0xc4,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x05, 0xc0,0x05,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0xc4,0x49,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xc5,0x49,0xc4,0x49,0x00,0x05,0x01,0x00, 0x01,0x00,0x70,0x01,0xc0,0x00,0x60,0x06,0x01,0x00,0xc4,0x49,0x00,0x16,0x84,0x49, 0x00,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xff, 0xff,0xff,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x51,0x03,0x00, 0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x2b, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x03,0x00, 0x03,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x19, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x04,0x00, 0x04,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x4e, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x25,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00, 0x00,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x4a,0x80, 0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x20,0x01,0x00,0x00,0x61,0x22,0x10,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x04,0x02, 0x00,0x00,0x61,0x30,0x1c,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b, 0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c,0x10,0x00,0x61,0x3a,0x28,0x61,0x00,0x3d, 0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x40,0x02, 0x00,0x00,0x61,0x23,0x11,0x61,0x00,0x3f,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x40, 0x10,0x00,0x61,0x3d,0x19,0x61,0x00,0x41,0x10,0x00,0x61,0x3d,0x1d,0x61,0x00,0x42, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x44, 0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x46, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x15,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x19, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1d,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x21, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x25,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x29, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2d,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xc0,0x03,0xc0,0x03,0x61,0x00,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x0f,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xfa,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xdb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x31,0xbc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x49,0xa8,0xe2,0x49,0x11,0x47,0x31,0xd1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10,0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x09,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x31,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x07,0x02,0x68,0x3a,0x4a,0x21,0x00,0x31,0xef,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xd0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xc3,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xb4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x20,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x33,0x08,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a,0x11,0x01,0x31,0xc2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x07,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08, 0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x07,0x21,0x03,0x03,0x10,0x06,0x40,0x04,0x0c,0x21,0x2b,0x03, 0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x48, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3d,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x3c,0x09,0xa8,0x7a,0x49,0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x31,0xfa,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x05,0x68,0x02,0x4a, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3b,0x06,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01,0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xdc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xee,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x24,0x00,0x00,0x40,0x02,0x07,0x21,0x03,0x06, 0x10,0x05,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x03,0x68,0x42,0x02, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x31,0xcf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x06,0x10,0x03,0x40,0x3f,0x07,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x31,0xb0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x05,0x68,0x02,0x0b, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x09,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x07, 0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a, 0x21,0x00,0x40,0x04,0x0c,0x21,0x03,0x06,0x10,0x05,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x04,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x06,0x10,0x08,0x31,0xb3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0xc4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x45,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x45,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0x98,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x35,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x37,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x38,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xe9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xda,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xcb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26, 0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x2a, 0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x68,0x39,0x00,0x00,0x20,0x82,0x45,0x09,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x31,0xce,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x3c,0x08,0xa8,0x7a,0x49, 0x11,0x47,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3e,0x00,0x00,0x60,0x06,0x05,0x09,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x31,0xd1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x0a,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0b,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3f,0x05,0x68,0x02,0x4a,0x21,0x00,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x08,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xf0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xf3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xe2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x31,0xd6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x2c, 0x00,0x00,0x69,0x02,0x02,0x68,0x3a,0x08,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x06,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x09,0x21,0x00,0x31,0xb5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x40,0x34,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x09,0xa8,0x32,0x4a,0x11,0x47,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x06,0x10,0x04,0x40,0x35,0x07,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x31,0xe7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x69,0x07,0x05,0x68,0x02,0x0b, 0x21,0x00,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x42,0x02,0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x0a,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x4a, 0x21,0x00,0x40,0x05,0x0c,0x21,0x03,0x06,0x10,0x05,0x40,0x05,0x0d,0x21,0x03,0x06, 0x10,0x08,0x40,0x05,0x04,0x21,0x03,0x06,0x10,0x03,0x40,0x05,0x05,0x21,0x03,0x06, 0x10,0x0a,0x40,0x05,0x08,0x21,0x03,0x06,0x10,0x07,0x31,0xd9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xca,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x29,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x2d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x40,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xae,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0x91,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x3e,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x31,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xf0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xe3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x08,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x3f,0x00,0x00,0x20,0x82, 0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xc6,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xd5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x40,0x30,0x09,0xa8,0x7a,0x49, 0x11,0x47,0x40,0x36,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x69,0x37,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0b,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x07,0x68,0x02,0x06, 0x21,0x00,0x31,0xd9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x40,0x06,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x40,0x3a,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x3d,0x05,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x3c,0x08,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x08,0x21,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04, 0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04, 0x10,0x09,0x40,0x04,0x0b,0x21,0x03,0x04,0x10,0x0a,0x31,0xc1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x29,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x3c,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x36,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x31,0xd7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xc8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x37,0x04,0x61,0x02,0x2e, 0x20,0x00,0x40,0x39,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xca,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x40,0x04,0x09,0x21,0x2b,0x04,0x10,0x02,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x08,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x05,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04,0x10,0x02,0x31,0xfb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x39,0x00,0x00,0x40,0x00,0x49,0x68,0xe2,0x49, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x01,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x69,0x04,0x06,0x68,0x02,0x4a,0x21,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x31,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xcf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x36,0x07,0x61,0x02,0x2e,0x20,0x00,0x69,0x03,0x02,0x68,0x3a,0x03, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x07, 0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x04,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x09,0x21,0x03,0x07, 0x10,0x05,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x38, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x64,0x49,0x00,0x05,0x40,0x00, 0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x05,0x68,0x7a,0x49,0x01,0x06,0x31,0xa6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x03,0x07,0x21,0x03,0x06,0x10,0x05,0x31,0xb5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x37,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x01,0x40,0x00,0x49,0x68,0xe2,0x49,0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x06,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xe8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xd9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x38,0x03,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x05,0x68,0x02,0x4a,0x21,0x00,0x31,0xfa,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x03,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x35,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00,0x08,0x00,0x61,0x25,0x0e,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00,0x00,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x4a,0x80, 0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x32,0x27,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x20,0x01,0x00,0x00,0x61,0x22,0x10,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x39, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x04,0x02,0x00,0x00,0x61,0x30,0x1c,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3c, 0x10,0x00,0x61,0x3a,0x28,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x3e, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x68,0x60,0x14, 0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x18,0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1c, 0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x20,0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x24, 0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x28,0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2c, 0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0xa0,0x03, 0xa0,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xf8,0x21,0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0a,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xfe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xd1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x69,0x3e,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x31,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03,0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a, 0x11,0x01,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a, 0x21,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x62,0x23, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xb6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x30, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x31,0xb8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x22,0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x30,0x09,0xa8,0x02,0x4a,0x11,0x48,0x31,0xc9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x04,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x39,0x05,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09,0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b, 0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x70,0x22, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04,0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04, 0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04,0x10,0x08,0x31,0xcb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x24,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x2f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x2e,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0x9f,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x31,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xe0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xc4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x36,0x06,0xa8,0x02,0x4a,0x11,0x48,0x31,0xa5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x2a,0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e, 0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08,0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08, 0x10,0x04,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08, 0x10,0x07,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x40,0x37,0x09,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x39,0x05,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x38,0x0a,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x42,0x23, 0x00,0x00,0x40,0x05,0x0c,0x21,0x2b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08, 0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0d,0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08, 0x10,0x02,0x31,0xfa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2c, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x2b, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x31,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xff,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xe0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x30,0x07,0x61,0x02,0x2e, 0x20,0x00,0x40,0x33,0x09,0xa8,0x02,0x4a,0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02, 0x21,0x00,0x31,0xf4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x31,0xd2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x31,0xc6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07,0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07, 0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09,0x21,0x00,0x31,0xc7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x37,0x08,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x35,0x04,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x2a,0x21,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x24,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x28,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x28,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xcc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xbe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xa1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a,0x11,0x47,0x31,0xdf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1a,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04, 0x10,0x02,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x26, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x01,0x01,0x69,0x3c,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x3e,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xb6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x25,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x25,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x49,0x00,0x05,0x40,0x00,0x40,0x00,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x31,0xa9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x24,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e,0x20,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x31,0xba,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x12,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06, 0x10,0x05,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x02,0x00, 0x02,0x00,0x20,0x00,0xc0,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x08, 0x00,0x00,0x70,0x00,0xc0,0x00,0x20,0x82,0x01,0x00,0xa4,0x49,0x00,0x11,0x01,0x00, 0x01,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x23, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x84,0x04,0x00,0x00,0x61,0x34,0x0d,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x06, 0x10,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x19,0x61,0x00,0x07, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x58,0x02, 0x00,0x00,0x61,0x31,0x1d,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x0a,0x10,0x00,0x61,0x38,0x29,0x61,0x00,0x0b, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x03, 0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x11,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x15, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x19,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1d, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x21,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x25, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x29,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x40,0x03,0x40,0x03,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7e,0x90,0x00,0x00,0x61,0x30,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xfe,0x92,0x00,0x00,0x69,0x30,0x0c,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x1b,0x0c, 0x10,0x49,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x31,0xae,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x09,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x3e,0x03,0xa8,0x1a,0x4a,0x11,0x01,0x69,0x04,0x04,0x68,0x42,0x02, 0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x04,0x0a,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x03,0x21,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x40,0x05,0x05,0x21,0x03,0x0c, 0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x0c,0x10,0x07,0x40,0x05,0x0b,0x21,0x03,0x0c, 0x10,0x0a,0x40,0x05,0x04,0x21,0x2b,0x0c,0x10,0x02,0x31,0xc1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x19,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x20,0x00,0x00,0x40,0x00,0x4a,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x01,0x03,0x21,0x2b,0x0c, 0x10,0x02,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x20, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a,0x11,0x48,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x69,0x37,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x05,0x68,0x42,0x02,0x21,0x00,0x69,0x03,0x08,0x68,0x02,0x07, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x0a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x05,0x04,0x21,0x1b,0x03, 0x10,0x49,0x40,0x05,0x06,0x21,0x03,0x03,0x10,0x05,0x40,0x05,0x09,0x21,0x03,0x03, 0x10,0x08,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x69,0x04,0x0b,0x68,0x02,0x0a,0x21,0x00,0x40,0x32,0x04,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x36,0x06,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x37,0x09,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x90, 0x00,0x00,0x40,0x05,0x0c,0x21,0x03,0x03,0x10,0x0b,0x69,0x05,0x02,0x68,0x3a,0x04, 0x21,0x00,0x69,0x05,0x07,0x68,0x02,0x06,0x21,0x00,0x69,0x05,0x0a,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x04,0x68,0x02,0x4a,0x21,0x00,0x31,0xd5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19,0x00,0x00,0x40,0x04,0x05,0x21,0x2b,0x03, 0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0b,0x21,0x03,0x03, 0x10,0x0a,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0c,0x21,0x03,0x03, 0x10,0x04,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x1e, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03, 0x00,0x00,0x69,0x37,0x03,0x61,0x02,0x2e,0x20,0x00,0x40,0x00,0x07,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x03,0x05,0x68,0x42,0x02,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x04,0x21,0x1b,0x03, 0x10,0x49,0x69,0x04,0x08,0x68,0x02,0x07,0x21,0x00,0x40,0x04,0x06,0x21,0x03,0x03, 0x10,0x05,0x31,0xbd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x00,0x0a,0xa8,0x52,0x4a,0x11,0x47,0x40,0x03,0x09,0x21,0x03,0x03, 0x10,0x08,0x40,0x3d,0x04,0xa8,0x1a,0x4a,0x11,0x01,0x40,0x3c,0x06,0xa8,0x4a,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a,0x11,0x47,0x31,0xce,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x15,0x00,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x04,0x21,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x09,0x68,0x02,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x90, 0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x03,0x10,0x0b,0x40,0x04,0x05,0x21,0x2b,0x03, 0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x03,0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x03, 0x10,0x09,0x31,0xc1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1d, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x06,0xa8,0x02,0x4a,0x11,0x48,0x69,0x00,0x09,0x61,0x02,0x2e, 0x20,0x00,0x69,0x03,0x04,0x68,0x42,0x02,0x21,0x00,0x69,0x03,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00, 0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x03, 0x00,0x00,0x40,0x05,0x03,0x21,0x1b,0x09,0x10,0x49,0x40,0x05,0x05,0x21,0x03,0x09, 0x10,0x04,0x40,0x05,0x08,0x21,0x03,0x09,0x10,0x07,0x31,0xb4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11,0x00,0x00,0x31,0x92,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x15,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x1c,0x00,0x00,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x01,0x03,0x21,0x2b,0x09,0x10,0x02,0x31,0x97,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x1b,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x69,0x37,0x03,0x61,0x02,0x2e, 0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x02,0x04,0x21,0x1b,0x03,0x10,0x49,0x31,0x95,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1b,0x00,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a, 0x11,0x01,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03, 0x00,0x00,0x69,0x37,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x03,0x04,0x21,0x1b,0x03,0x10,0x49,0x40,0x03,0x05,0x21,0x2b,0x03, 0x10,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86,0x01,0x00,0x84,0x49,0x00,0x55,0x08,0x00, 0x08,0x00,0x61,0x25,0x0e,0x61,0x00,0x04,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x05, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x09, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x0a,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x0b, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00, 0x00,0x00,0x61,0x21,0x0f,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x31,0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x4a,0x80, 0x00,0x00,0x61,0x3c,0x1b,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x34,0x10,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x32,0x27,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x2b,0x61,0x00,0x36, 0x10,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x84,0x49,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03, 0x00,0x00,0x61,0x07,0x03,0x68,0x60,0x13,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x17, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1b,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1f, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x23,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x27, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2b,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x80,0x03,0x80,0x03,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xfd,0x24,0x00,0x00,0x61,0x31,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x84,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x02,0x68,0x5a,0x49, 0x11,0x00,0x20,0x00,0xc0,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x49,0x68,0x90,0x02,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xfe,0xff,0xff,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0b,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00,0x06,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xfa,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xcb,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xac,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9e,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x69,0x3a,0x03,0x61,0x02,0x2e,0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x3b,0x05,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x08,0xa8,0x02,0x4a, 0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x05,0x04,0x21,0x2b,0x03, 0x10,0x02,0x40,0x00,0x4a,0xa8,0x1a,0x4a,0x11,0x01,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x09,0x68,0x02,0x08, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x03,0x10,0x09,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xfd,0x03, 0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x03,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x03, 0x10,0x04,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xb0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0x94,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x16, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a, 0x11,0x01,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x05,0x21,0x2b,0x04,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06, 0x21,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x40,0x3c,0x09,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x0b,0xa8,0x52,0x4a, 0x11,0x47,0x40,0x03,0x08,0x21,0x03,0x04,0x10,0x07,0x40,0x32,0x05,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x4a,0x4a,0x11,0x47,0x31,0xb7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x69,0x04,0x06,0x68,0x02,0x05, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x08,0x68,0x02,0x4a,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x0a,0x21,0x03,0x04, 0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x3f,0x03,0x00,0x00,0x40,0x04,0x0c,0x21,0x2b,0x04, 0x10,0x02,0x40,0x04,0x07,0x21,0x03,0x04,0x10,0x06,0x40,0x04,0x03,0x21,0x03,0x04, 0x10,0x08,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x23, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x14, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x03, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x14, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xab,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0x9d,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x3b,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x3d,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xec,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xc1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0xbf,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x26, 0x00,0x00,0x40,0x07,0x03,0xa8,0x2a,0x4a,0x11,0x01,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x07,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x30,0x06,0xa8,0x02,0x4a, 0x11,0x48,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x2a, 0x00,0x00,0x69,0x00,0x08,0x61,0x02,0x2e,0x20,0x00,0x69,0x00,0x02,0x68,0x3a,0x4a, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x04,0x68,0x02,0x03,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x09,0x21,0x2b,0x08, 0x10,0x02,0x40,0x05,0x05,0x21,0x03,0x08,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x0a,0x21,0x03,0x08, 0x10,0x07,0x31,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x02,0x68,0x3a,0x0b,0x21,0x00,0x40,0x34,0x09,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x32,0x05,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x36,0x0a,0xa8,0x32,0x4a, 0x11,0x47,0x40,0x00,0x4a,0xa8,0x0a,0x4a,0x11,0x47,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xf5,0x20, 0x00,0x00,0x40,0x05,0x0c,0x21,0x2b,0x08,0x10,0x02,0x69,0x05,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x69,0x05,0x0b,0x68,0x02,0x0a, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x04,0x04,0x21,0x03,0x08, 0x10,0x03,0x40,0x04,0x07,0x21,0x03,0x08,0x10,0x06,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x0d,0x21,0x03,0x08,0x10,0x0b,0x40,0x04,0x03,0x21,0x2b,0x08, 0x10,0x02,0x31,0xf7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0xc5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x23, 0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0d,0x00,0xa0,0x0c,0x27, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x2b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x10, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x08,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03, 0x00,0x00,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x04,0x47, 0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x4a,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xfd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0xec,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xde,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x69,0x00,0x06,0x68,0x02,0x4a,0x21,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x3c,0x07,0x61,0x02,0x2e,0x20,0x00,0x40,0x3e,0x09,0xa8,0x02,0x4a, 0x11,0x48,0x69,0x07,0x03,0x68,0x42,0x02,0x21,0x00,0x31,0xf1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xdf,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x26,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x07, 0x10,0x06,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x04,0x21,0x03,0x07, 0x10,0x03,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x09, 0x21,0x00,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x40,0x00,0x0b,0xa8,0x52,0x4a,0x11,0x47,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x02,0x0a,0x21,0x03,0x07,0x10,0x05,0x40,0x34,0x08,0xa8,0x1a,0x4a, 0x11,0x01,0x40,0x33,0x04,0xa8,0x4a,0x4a,0x11,0x47,0x40,0x00,0x4a,0xa8,0x32,0x4a, 0x11,0x47,0x31,0xc2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x0b,0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x08, 0x21,0x00,0x69,0x04,0x09,0x68,0x02,0x04,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x0a,0x68,0x02,0x4a,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xf8,0x00,0x00,0x00,0x40,0x04,0x0c,0x21,0x03,0x07, 0x10,0x06,0x40,0x04,0x03,0x21,0x2b,0x07,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x07, 0x10,0x09,0x40,0x04,0x06,0x21,0x03,0x07,0x10,0x0a,0x31,0xc6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x0c,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x23,0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x27,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x0d,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x65,0x05,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0x9b,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a, 0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x69,0x00,0x04,0x61,0x02,0x2e,0x20,0x00,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x06,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x09,0xa8,0x02,0x4a,0x11,0x48,0x40,0x00,0x4a,0xa8,0x52,0x4a, 0x11,0x47,0x31,0xdd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x2b,0x04,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x09, 0x21,0x00,0x69,0x04,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x08,0x21,0x03,0x04, 0x10,0x07,0x40,0x04,0x0a,0x21,0x03,0x04,0x10,0x03,0x40,0x04,0x0b,0x21,0x2b,0x04, 0x10,0x02,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0b, 0x00,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x69,0x38,0x03,0x61,0x02,0x2e, 0x20,0x00,0x69,0x02,0x02,0x68,0x3a,0x4a,0x21,0x00,0x40,0x3a,0x05,0xa8,0x2a,0x4a, 0x11,0x01,0x40,0x00,0x4a,0xa8,0x02,0x4a,0x11,0x48,0x69,0x02,0x06,0x68,0x02,0x05, 0x21,0x00,0x69,0x02,0x08,0x68,0x02,0x4a,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x06,0x04,0x21,0x2b,0x03, 0x10,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x03, 0x10,0x06,0x40,0x04,0x09,0x21,0x03,0x03,0x10,0x08,0x31,0xb0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0b,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x0a,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x49,0x00,0x05,0x20,0x00,0x20,0x00,0x69,0x00,0x04,0x61,0x02,0x2e, 0x20,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x02,0x05,0x21,0x2b,0x04, 0x10,0x02,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x0a, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x4a,0x68,0x02,0x4a,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x4a, 0x21,0x00,0x40,0x00,0x4a,0xa8,0x2a,0x4a,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x00,0x06,0x61,0x02,0x2e, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x03, 0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x05,0x02,0x68,0x3a,0x4a,0x21,0x00,0x31,0xb7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x12,0x00,0x00,0x40,0x04,0x07,0x21,0x03,0x06, 0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x03,0x21,0x2b,0x06, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x09, 0x00,0x00,0x61,0x35,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x02,0x11,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x05,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x12,0x00,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00, 0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3a,0x03,0x62,0x80,0x48, 0x11,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x25,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x37,0x28,0x61,0x00,0x04, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x22,0x00,0xe8,0x01,0x00, 0x11,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x3b,0x03,0x62,0x20,0x48,0x11,0x00,0x61,0x00,0x24,0x61,0x00,0x05, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x48,0x00, 0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x20,0x61,0x00,0x06,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x07, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x08,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x09, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x81,0x93,0x00,0x00,0x61,0x3d,0x0c,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x0b,0x10,0x00,0x61,0x2a,0x29,0x61,0x00,0x2f, 0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x30,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x31, 0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x32,0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x33, 0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x34,0x10,0x00,0x61,0x00,0x0d,0x61,0x00,0x35, 0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x36,0x10,0x00,0x61,0x2b,0x2a,0x61,0x00,0x37, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x38,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x39, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x3a,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x3b, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x3c,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x3d, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x3e,0x10,0x00,0x61,0x2d,0x2b,0x61,0x00,0x3f, 0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x40,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x41, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x42,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x43, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x44,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x45, 0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x46,0x10,0x00,0x20,0x00,0xc0,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x70,0x00,0xc0,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0xc0,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xec,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x31,0xde,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20, 0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18, 0x00,0x00,0x31,0xa0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14, 0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x05, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0x94,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x10, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x05, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x05, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49,0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x33,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xe6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20, 0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18, 0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14, 0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10, 0x00,0x00,0x31,0x98,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c, 0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x1c, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47, 0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x07,0x64,0x49,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x09,0xa8,0x7a,0x49,0x11,0x47,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x00,0x00,0x60,0x06, 0x05,0x03,0x64,0x49,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0xc4,0x01,0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0b,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xdc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xce,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x24,0x18,0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x24,0x14,0x00,0x00,0x31,0xaf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0b,0x00,0xa0,0x24,0x10,0x00,0x00,0x31,0x90,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x64,0x49,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x64,0x49,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x24,0x49,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xa2,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x20,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x49,0x64,0x49,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0x96,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x18, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x24,0x49,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x31,0x97,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x4a,0x04,0x4a,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x49,0x64,0x49,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x4a,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x49,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x28, 0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x24, 0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0xa4,0x01,0x00,0x05,0x18,0x00, 0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xa7,0x34, 0x00,0x00,0x61,0x34,0x00,0x00,0xa0,0x4a,0x45,0x2b,0x00,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x5b,0x01,0x00,0x00,0x60,0x06,0x44,0x2b,0x44,0x02,0x01,0x06,0x44,0x2b, 0x24,0x51,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x44,0x2b,0x00,0x01,0x44,0x01, 0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x2b,0x44,0x2b,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x2b,0x44,0x2b,0x00,0x06,0x24,0x02, 0x00,0x00,0x40,0x02,0x2b,0xa8,0x2a,0x2b,0x11,0x49,0x69,0x01,0x2b,0x68,0x62,0x2b, 0x21,0x00,0x70,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x24,0x2b,0x00,0x52,0x04,0x49, 0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x55, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xfe,0xff,0x00,0x00,0x61,0x30,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x40,0x51,0x11,0x00,0x61,0x07,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x48,0x44,0x48,0x00,0x06,0x44,0x2b,0x00,0x02,0x31,0xa8,0x03,0x80,0x00,0x00, 0x05,0x49,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x60,0x86, 0x45,0x2b,0x44,0x48,0x00,0x55,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x60,0x86, 0x01,0x00,0x44,0x48,0x00,0x55,0x08,0x00,0x08,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x4b,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x85,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x40,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x65,0x47,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x61,0x38,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x01,0x30,0x74,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x92,0x00,0x00,0x00,0x31,0xaa,0x03,0x80,0x00,0x00, 0x05,0x2f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x85,0x2b,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x65,0x47,0xc4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x61,0x3a,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x80,0x48,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x01,0x30,0x64,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01, 0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x37,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x2b,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x65,0x47,0xa4,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x61,0x3b,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x20,0x48, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x2b,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x48,0x02,0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00, 0x05,0x3f,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x07,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x2b,0xa8,0x98,0x00, 0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x2c, 0x00,0x00,0x61,0x38,0x03,0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x2c,0xa1,0x00,0x00, 0x01,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x69,0x04,0x00,0x00,0x50,0x85,0x45,0x02,0x64,0x2b,0x00,0x05,0x02,0x00, 0x02,0x00,0x40,0x01,0x00,0x00,0x10,0x81,0x01,0x10,0x44,0x02,0x00,0x01,0x60,0x00, 0x60,0x00,0x61,0x00,0x00,0x00,0x68,0x06,0x01,0x00,0x64,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x2b,0x68,0xe2,0x2b,0x11,0x00,0x70,0x01,0x00,0x00,0x60,0x06, 0x01,0x00,0x64,0x2b,0x00,0x16,0x64,0x47,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0x69,0x04,0x2c,0x61,0x02,0x03, 0x20,0x00,0x70,0x00,0x00,0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x51,0x03,0x00, 0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x2d, 0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x11,0x03,0x00, 0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1a, 0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x82,0x01,0x00,0x84,0x2b,0x00,0x11,0x04,0x00, 0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x51, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x47,0x00,0x55,0x08,0x00, 0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xd8,0xde, 0x00,0x00,0x61,0x20,0x0b,0x61,0x00,0x49,0x10,0x00,0x61,0x30,0x0f,0x61,0x00,0x4a, 0x10,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3d,0x13,0x61,0x00,0x4b, 0x10,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x30,0x17,0x61,0x00,0x4c, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x4d,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x4e, 0x10,0x00,0x61,0x30,0x23,0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x50, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x04,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x21,0x0c,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x34, 0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x36, 0x10,0x00,0x61,0x2b,0x0d,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x11,0x61,0x00,0x38, 0x10,0x00,0x61,0x00,0x15,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x19,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x3c, 0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x29,0x61,0x00,0x3e, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x40,0x22, 0x00,0x00,0x61,0x23,0x0e,0x61,0x00,0x3f,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x40, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x41,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x42, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x43,0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x44, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x45,0x10,0x00,0x61,0x00,0x2a,0x61,0x00,0x46, 0x10,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x64,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x12,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x16, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x1a,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1e, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x22,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x26, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x2a,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x60,0x03,0x60,0x03,0x61,0x00,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2b,0x68,0xe2,0x47, 0x11,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x47,0x68,0xe0,0x2b,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x10,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x06,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x14,0x00,0x00,0x40,0x37,0x00,0x00,0x60,0x06, 0x05,0x08,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x24,0x2b,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xfc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xde,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x13,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x17,0x00,0x00,0x31,0xa0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1b,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x2b,0xa8,0xca,0x2b,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x07,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x31,0xf4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xd3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xc2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x03,0x21,0x2b,0x2c,0x10,0x02,0x40,0x33,0x04,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x00,0x2b,0xa8,0x1a,0x2b,0x11,0x01,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x06,0x06,0x68,0x02,0x48,0x21,0x00,0x69,0x06,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2b,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c,0x10,0x06,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c,0x10,0x02,0x40,0x04,0x08,0x21,0x03,0x2c, 0x10,0x05,0x40,0x04,0x04,0x21,0x03,0x2c,0x10,0x03,0x31,0xa9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xc8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x9b,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x4b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x00,0x00,0x60,0x06,0x05,0x05,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x31,0xcd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1f, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x07,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b,0x11,0x47,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x03,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x06,0x68,0x02,0x03,0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x2b,0xa8,0x4a,0x2b,0x11,0x47,0x31,0xc0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1d,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x21,0x00,0x00,0x40,0x07,0x05,0x21,0x2b,0x2c, 0x10,0x02,0x69,0x06,0x03,0x68,0x7a,0x01,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x2c,0x10,0x06,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x08,0x68,0x02,0x48,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x07,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x06,0x68,0x02,0x2b, 0x21,0x00,0x31,0xf3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xd2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x04,0x21,0x03,0x2c, 0x10,0x08,0x40,0x03,0x09,0x21,0x2b,0x2c,0x10,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x05,0x21,0x03,0x2c,0x10,0x03,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c, 0x10,0x06,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x48, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x05, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x48, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b, 0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f, 0x00,0x00,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x13, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x14, 0x00,0x00,0x40,0x37,0x00,0x00,0x60,0x06,0x05,0x08,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x24,0x2b,0x00,0x06,0x04,0x47, 0x00,0x00,0x40,0x38,0x00,0x00,0x60,0x06,0x05,0x03,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x05,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x3b,0x00,0x00,0x60,0x06,0x05,0x07,0x24,0x2b,0x00,0x06,0x84,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b,0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x31,0xfd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x17, 0x00,0x00,0x31,0xfc,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1b, 0x00,0x00,0x31,0xfe,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1f, 0x00,0x00,0x31,0xe1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x23, 0x00,0x00,0x31,0xdf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x27, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0xc5,0x01,0x24,0x2b,0x00,0x06,0xc4,0x01,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x3d,0x00,0x00,0x20,0x82, 0x45,0x09,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x07,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x31,0xd0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xe4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xf2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0xe4,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x84,0x01, 0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x36,0x06,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xc7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x03,0x68,0x02,0x48, 0x21,0x00,0x31,0xb9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x29, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x47,0x04,0x2b,0x00,0x06,0xa4,0x47, 0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c, 0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x03,0x2c, 0x10,0x03,0x40,0x00,0x2b,0xa8,0x0a,0x2b,0x11,0x47,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xe8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xda,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x16,0x00,0x00,0x69,0x07,0x07,0x68,0x6a,0x47, 0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x68,0x7a,0x01, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x04,0x68,0x72,0x47,0x21,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x05,0x03,0x21,0x03,0x2c,0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x2c, 0x10,0x05,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c, 0x10,0x04,0x40,0x04,0x05,0x21,0x2b,0x2c,0x10,0x02,0x31,0xfd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xbc,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xce,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0xa1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x26,0x00,0x00,0x31,0x9f,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x2a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x43,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0x94,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x14,0x00,0x00,0x40,0x37,0x00,0x00,0x60,0x06, 0x05,0x08,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x24,0x2b,0x00,0x06,0x04,0x47,0x00,0x00,0x40,0x30,0x00,0x00,0x60,0x06, 0x05,0x03,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x34,0x00,0x00,0x60,0x06, 0x05,0x05,0x24,0x2b,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x09,0x04,0x08,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x0a,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x04,0x03,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x04,0x05,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x31,0xf3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x13, 0x00,0x00,0x31,0xf2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x14,0x17, 0x00,0x00,0x31,0xe6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x0a,0x00,0xa0,0x14,0x1b, 0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x1f, 0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x23, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x08,0x44,0x02,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x33,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x04,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x07,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x31,0xc9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xd8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x31,0xea,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x19, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0xc4,0x01,0x00,0x00,0x40,0x3b,0x04,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xcd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1d, 0x00,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x21, 0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x05,0x68,0x02,0x04, 0x21,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06,0x68,0x02,0x48, 0x21,0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x25, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c, 0x10,0x05,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x00,0x2b,0xa8,0x32,0x2b, 0x11,0x47,0x31,0xd1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x69,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x69,0x07,0x05,0x68,0x6a,0x47,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x03,0x68,0x7a,0x01,0x21,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x2b,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c,0x10,0x02,0x40,0x04,0x06,0x21,0x03,0x2c, 0x10,0x05,0x40,0x04,0x04,0x21,0x03,0x2c,0x10,0x03,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c,0x10,0x07,0x31,0xc4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xa3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x3e,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x05,0x06,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f,0x00,0x00,0x31,0xa9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x13,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x17,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x81,0x01,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x69,0x05,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x31,0xda,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x31,0xbb,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x3b,0x05,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x2b,0xa8,0x52,0x2b,0x11,0x47,0x31,0xbd,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x15,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x06,0x04,0x21,0x2b,0x2c,0x10,0x02,0x01,0x38,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x05, 0x21,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x06,0x68,0x02,0x48, 0x21,0x00,0x69,0x05,0x02,0x68,0x3a,0x2b,0x21,0x00,0x31,0xcc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x19,0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x04,0x03,0x21,0x03,0x2c, 0x10,0x06,0x40,0x04,0x09,0x21,0x2b,0x2c,0x10,0x02,0x31,0xfe,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3b,0x00,0x00,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x69,0x03,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x34,0x03,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x2b,0xa8,0x02,0x2b, 0x11,0x48,0x31,0xb3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x11, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x03,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x04,0x68,0x02,0x2b, 0x21,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x15, 0x00,0x00,0x40,0x07,0x06,0x21,0x2b,0x2c,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x14, 0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x2c,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x2c, 0x10,0x04,0x31,0xc6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xb7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0x95,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x3a, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3a, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x24,0x2b,0x00,0x05,0x40,0x00, 0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x05,0x68,0x22,0x2b,0x01,0x06,0x31,0xa9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b,0x00,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x44,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x40,0x03,0x06,0x21,0x03,0x2c, 0x10,0x05,0x31,0xb8,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0d, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x31,0xaa,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x39, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x01,0x40,0x00,0x2b,0x68,0xca,0x2b, 0x01,0x04,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x05,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xeb,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0b, 0x00,0x00,0x31,0xdd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0f, 0x00,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x02,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x06,0x03,0x21,0x2b,0x2c,0x10,0x02,0x31,0xfc,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0d,0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x11,0x00,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x05,0x21,0x03,0x2c,0x10,0x04,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xda,0xfe,0x00,0x00,0x61,0x20,0x0a,0x61,0x00,0x49, 0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x4a,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x4b, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x4c,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x4d, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x4e,0x10,0x00,0x61,0x30,0x22,0x61,0x00,0x4f, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x50,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x04,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x21,0x0b,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x34, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x36, 0x10,0x00,0x61,0x2b,0x0c,0x61,0x00,0x37,0x10,0x00,0x61,0x00,0x10,0x61,0x00,0x38, 0x10,0x00,0x61,0x00,0x14,0x61,0x00,0x39,0x10,0x00,0x61,0x00,0x18,0x61,0x00,0x3a, 0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x3b,0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x3c, 0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x3d,0x10,0x00,0x61,0x00,0x28,0x61,0x00,0x3e, 0x10,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x64,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x10,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x14, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x18,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1c, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x20,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x24, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x28,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x20,0x03,0x20,0x03,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7f,0x00,0x00,0x61,0x3f,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2b,0x68,0xe2,0x47, 0x11,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x47,0x68,0xe0,0x2b,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x0b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x84, 0x00,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xe0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a, 0x00,0x00,0x31,0xd4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xc3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xb2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xa6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x00,0x2b,0xa8,0x1a,0x2b,0x11,0x01,0x31,0xa7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x48,0x21,0x00,0x69,0x05,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2b,0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c, 0x10,0x07,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x20,0x49,0x00,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x2c,0x10,0x03,0x31,0xc5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x32,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x03,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x34,0x05,0xa8,0x2a,0x2b,0x11,0x01,0x31,0xbb,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1e,0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x05,0x04,0x21,0x2b,0x2c,0x10,0x02,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x40,0x00,0x2b,0xa8,0x4a,0x2b, 0x11,0x47,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c, 0x00,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x08,0x68,0x02,0x48, 0x21,0x00,0x69,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x07,0x21,0x03,0x2c, 0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x04,0x68,0x7a,0x01,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x2b, 0x21,0x00,0x31,0xbc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x03,0x2c, 0x10,0x08,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x20,0x41,0x00,0x00,0x40,0x05,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c,0x10,0x06,0x31,0xce,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1c,0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x20,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x31,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x01,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x84,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0e, 0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x12, 0x00,0x00,0x31,0xb6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xa7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0x95,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x84,0x01, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x07,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x35,0x03,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xb9,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22, 0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b,0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x03, 0x21,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x04,0x68,0x02,0x48, 0x21,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x26, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x47,0x04,0x2b,0x00,0x06,0xa4,0x47, 0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c, 0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x00,0x2b,0xa8,0x0a,0x2b,0x11,0x47,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xea,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xdb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x14,0x00,0x00,0x69,0x07,0x03,0x68,0x7a,0x01, 0x21,0x00,0x69,0x07,0x07,0x68,0x6a,0x47,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x20,0x08,0x00,0x00,0x40,0x03,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x05,0x68,0x72,0x47,0x21,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x2c,0x10,0x03,0x40,0x05,0x04,0x21,0x03,0x2c, 0x10,0x07,0x40,0x04,0x08,0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x31,0xfc,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xce,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xb1,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0xaf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x31,0x90,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x28, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x2d, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b, 0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b,0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x01,0x01,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x84, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xb4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a,0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0x92,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x14,0x12,0x00,0x00,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x0c,0x40, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x07,0x48,0xa8,0x02,0x2b,0x11,0x48,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x06,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xe6,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x14,0x16, 0x00,0x00,0x31,0xd7,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x14,0x1a, 0x00,0x00,0x31,0xa5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x1e, 0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b,0x21,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x06,0x03,0x68,0x02,0x48,0x21,0x00,0x31,0xb9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x22,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47,0x00,0x00,0x40,0x07,0x05,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c, 0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x04,0x21,0x03,0x2c, 0x10,0x03,0x40,0x00,0x2b,0xa8,0x32,0x2b,0x11,0x47,0x31,0xd8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xca,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x14,0x00,0x00,0x69,0x07,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x69,0x07,0x07,0x68,0x6a,0x47, 0x21,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x68,0x7a,0x01, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3b,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x2b,0x21,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x04,0x03,0x21,0x03,0x2c,0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x2c, 0x10,0x05,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c, 0x10,0x04,0x31,0xcd,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18, 0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1c, 0x00,0x00,0x31,0xbe,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x20, 0x00,0x00,0x31,0x91,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x24, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x2a, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xbb, 0x00,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x04,0x00,0x00,0x20,0x82, 0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00,0x03,0x00,0x31,0xc0,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a,0x00,0x00,0x31,0xbf,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0e,0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x14,0x12,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x69,0x02,0x02,0x68,0x3a,0x2b,0x21,0x00,0x40,0x34,0x05,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x2b,0xa8,0x52,0x2b, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x06,0x04,0x21,0x2b,0x2c,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x14, 0x00,0x00,0x69,0x06,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x2c,0x49, 0x00,0x00,0x69,0x06,0x08,0x68,0x02,0x48,0x21,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x31,0xd3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x16, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x5a,0x22, 0x00,0x00,0x40,0x03,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x02,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x05,0x03,0x21,0x03,0x2c,0x10,0x08,0x31,0xf2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xc6,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x14,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x18,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x27,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x01,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b,0x21,0x00,0x40,0x3f,0x04,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x2b,0xa8,0x02,0x2b,0x11,0x48,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x02,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xca,0xb6, 0x00,0x00,0x69,0x02,0x07,0x68,0x02,0x2b,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x03,0x06,0x21,0x03,0x2c,0x10,0x05,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x24,0x49,0x00,0x00,0x40,0x03,0x08,0x21,0x03,0x2c, 0x10,0x07,0x31,0xb9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0c, 0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x10, 0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x14, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x26, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x26, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x24,0x2b,0x00,0x05,0x40,0x00, 0x40,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xbb, 0x00,0x00,0x40,0x02,0x04,0x21,0x2b,0x2c,0x10,0x02,0x31,0xab,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xad,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x26,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x01,0x01,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x6e,0xb7,0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x2b, 0x21,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x11,0x08, 0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x2b,0x21,0x00,0x31,0xbc,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x0a,0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x14,0x0e,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x10,0x00,0x00,0x40,0x06,0x06,0x21,0x03,0x2c, 0x10,0x05,0x40,0x02,0x07,0x21,0x2b,0x2c,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xb1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0c,0x00,0x00,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x10,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x24,0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x82, 0x01,0x00,0x84,0x2b,0x00,0x11,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x82, 0x01,0x00,0x84,0x2b,0x00,0x11,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x24,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xda,0xfe, 0x00,0x00,0x61,0x20,0x0a,0x61,0x00,0x49,0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x4a, 0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x4b,0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x4c, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x4d,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x4e, 0x10,0x00,0x61,0x30,0x22,0x61,0x00,0x4f,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x50, 0x10,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x64,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x0e,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x12, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x16,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1a, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x1e,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x22, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x26,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0xe0,0x02,0xe0,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7f, 0x00,0x00,0x61,0x3f,0x00,0x00,0x68,0x06,0x81,0x09,0x04,0x0a,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06,0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x64,0x47,0x00,0x55,0x07,0x00, 0x07,0x00,0x40,0x00,0x01,0x68,0x7a,0x47,0x11,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x61,0x02,0x47,0x68,0x98,0x01, 0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe, 0xff,0xff,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00, 0x05,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x05, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00, 0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x2b,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x03,0x21,0x13,0x2c, 0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xfb,0x00,0x00,0x69,0x06,0x04,0x68,0x42,0x02, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x04,0x00,0x00,0x69,0x06,0x06,0x68,0x02,0x48, 0x21,0x00,0x69,0x06,0x08,0x68,0x82,0x47,0x21,0x00,0x69,0x06,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xef,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00,0x06,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x05,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x05,0x09,0x21,0x03,0x2c, 0x10,0x08,0x40,0x05,0x03,0x21,0x2b,0x2c,0x10,0x02,0x31,0xc4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x21,0x00,0x00,0x40,0x00,0x2b,0xa8,0x4a,0x2b, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x01,0x03,0x21,0x2b,0x2c,0x10,0x02,0x31,0x97,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x47,0x04,0x2b,0x00,0x06,0xa4,0x47, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xfb, 0x00,0x00,0x69,0x06,0x04,0x68,0x42,0x02,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x04,0x00,0x00,0x69,0x06,0x06,0x68,0x02,0x48, 0x21,0x00,0x69,0x06,0x08,0x68,0x82,0x47,0x21,0x00,0x40,0x00,0x2b,0xa8,0x0a,0x2b, 0x11,0x47,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x07,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x07,0x07,0x21,0x03,0x2c,0x10,0x06,0x40,0x07,0x09,0x21,0x03,0x2c, 0x10,0x08,0x69,0x00,0x04,0x68,0x6a,0x47,0x21,0x00,0x69,0x00,0x06,0x68,0x72,0x47, 0x21,0x00,0x69,0x07,0x08,0x68,0x02,0x2b,0x21,0x00,0x31,0xf5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x31,0xe9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xd8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xca,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16,0x00,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x03,0x21,0x2b,0x2c,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c, 0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x09,0x21,0x03,0x2c,0x10,0x08,0x31,0xcb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0xbd,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x22,0x00,0x00,0x31,0x9e,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x26,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x1f,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x02,0x04,0x2b,0x00,0x06,0x44,0x01,0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xfb,0x00,0x00,0x69,0x05,0x04,0x68,0x42,0x02, 0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x04,0x00,0x00,0x69,0x05,0x06,0x68,0x02,0x48, 0x21,0x00,0x40,0x00,0x2b,0xa8,0x32,0x2b,0x11,0x47,0x40,0x00,0x03,0x21,0x13,0x2c, 0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x69,0x07,0x08,0x68,0x82,0x47,0x21,0x00,0x69,0x07,0x00,0x00,0x60,0x86, 0x45,0x02,0x64,0x01,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x07,0x07,0x21,0x03,0x2c,0x10,0x06,0x69,0x07,0x04,0x68,0x6a,0x47, 0x21,0x00,0x69,0x07,0x06,0x68,0x02,0x2b,0x21,0x00,0x31,0xf1,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x31,0xc0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xbf,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x01,0x80,0x00,0x00,0x40,0x06,0x09,0x21,0x03,0x2c, 0x10,0x08,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x2c,0x10,0x04,0x40,0x04,0x07,0x21,0x03,0x2c, 0x10,0x06,0x31,0xc4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xb3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xa2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x31,0x96,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x1d, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x02,0x04,0x2b,0x00,0x06,0x44,0x01, 0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xfb, 0x00,0x00,0x69,0x02,0x04,0x68,0x42,0x02,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x04, 0x00,0x00,0x69,0x02,0x06,0x68,0x02,0x48,0x21,0x00,0x40,0x00,0x03,0x21,0x13,0x2c, 0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00, 0x03,0x00,0x40,0x05,0x05,0x21,0x03,0x2c,0x10,0x04,0x40,0x05,0x07,0x21,0x03,0x2c, 0x10,0x06,0x31,0xd7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0x99,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x1c, 0x00,0x00,0x40,0x00,0x2b,0xa8,0x52,0x2b,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x31,0x98,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x1c, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1c, 0x00,0x00,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x1b,0x00,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x03,0x21,0x13,0x2c,0x10,0x2b,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xfb, 0x00,0x00,0x40,0x02,0x04,0x21,0x2b,0x2c,0x10,0x02,0x31,0xca,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x31,0x9d,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x08,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x24,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xda,0xfe,0x00,0x00,0x61,0x20,0x0a,0x61,0x00,0x49, 0x10,0x00,0x61,0x00,0x0e,0x61,0x00,0x4a,0x10,0x00,0x61,0x00,0x12,0x61,0x00,0x4b, 0x10,0x00,0x61,0x00,0x16,0x61,0x00,0x4c,0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x4d, 0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x4e,0x10,0x00,0x61,0x30,0x22,0x61,0x00,0x4f, 0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x50,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x04,0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x21,0x0b,0x61,0x00,0x2f,0x10,0x00,0x61,0x00,0x0f,0x61,0x00,0x30, 0x10,0x00,0x61,0x00,0x13,0x61,0x00,0x31,0x10,0x00,0x61,0x00,0x17,0x61,0x00,0x32, 0x10,0x00,0x61,0x00,0x1b,0x61,0x00,0x33,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x34, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x35,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x36, 0x10,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x45,0x02,0x64,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x61,0x07,0x03,0x68,0x60,0x0f,0x11,0x00,0x61,0x07,0x03,0x68,0x38,0x13, 0x11,0x00,0x61,0x07,0x03,0x68,0x98,0x17,0x11,0x00,0x61,0x07,0x03,0x68,0x90,0x1b, 0x11,0x00,0x61,0x07,0x03,0x68,0xa8,0x1f,0x11,0x00,0x61,0x07,0x03,0x68,0xa0,0x23, 0x11,0x00,0x61,0x07,0x03,0x68,0x88,0x27,0x11,0x00,0x40,0x07,0x00,0x00,0x10,0x81, 0x01,0x10,0x44,0x02,0x00,0x01,0x00,0x03,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xff,0x7f,0x00,0x00,0x61,0x3f,0x00,0x00,0x68,0x06, 0x81,0x09,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0b,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0d,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x0f,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x01,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x03,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x05,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x68,0x06, 0x81,0x07,0xe4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x64,0x47,0x00,0x55,0x07,0x00,0x07,0x00,0x40,0x00,0x2b,0x68,0xe2,0x47, 0x11,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x61,0x02,0x47,0x68,0xe0,0x2b,0x11,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xfe,0xff,0xff,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0b,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00, 0x06,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0xc4, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xdc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a, 0x00,0x00,0x31,0xce,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x00,0x2b,0xa8,0x1a,0x2b,0x11,0x01,0x31,0xa4,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x05,0x05,0x68,0x02,0x04,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x05,0x07,0x68,0x02,0x48, 0x21,0x00,0x69,0x05,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x03,0x68,0x02,0x2b, 0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x06,0x21,0x03,0x2c, 0x10,0x05,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c, 0x10,0x07,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x24,0x09, 0x00,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c,0x10,0x02,0x40,0x04,0x04,0x21,0x03,0x2c, 0x10,0x03,0x31,0xc3,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x16, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x03,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x03,0x02,0x68,0x3a,0x2b,0x21,0x00,0x40,0x3e,0x05,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xb5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x40,0x00,0x48,0xa8,0x02,0x2b,0x11,0x48,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x05,0x04,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x06,0x06,0x68,0x02,0x05,0x21,0x00,0x40,0x00,0x2b,0xa8,0x4a,0x2b, 0x11,0x47,0x31,0xc9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0b, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x08,0x68,0x02,0x48,0x21,0x00,0x69,0x07,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x04,0x07,0x21,0x03,0x2c, 0x10,0x06,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x04,0x68,0x7a,0x01,0x21,0x00,0x69,0x05,0x06,0x68,0x02,0x2b, 0x21,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x03,0x21,0x03,0x2c,0x10,0x08,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x04,0x49, 0x00,0x00,0x40,0x05,0x09,0x21,0x2b,0x2c,0x10,0x02,0x40,0x04,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x04,0x07,0x21,0x03,0x2c,0x10,0x06,0x31,0xcb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13,0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x14,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41, 0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x14,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b,0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06, 0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x01,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xae,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x80,0xc4,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x31,0xc0,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12,0x00,0x00,0x31,0xbf,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1a,0x00,0x00,0x31,0x93,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1e,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x84,0x01,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x07,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x33,0x03,0xa8,0x2a,0x2b,0x11,0x01,0x31,0xb2,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22,0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82, 0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x07,0x68,0x02,0x03, 0x21,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x04,0x68,0x02,0x48, 0x21,0x00,0x31,0xb6,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x26, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x47,0x04,0x2b,0x00,0x06,0xa4,0x47, 0x00,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x06,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c, 0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05,0x21,0x03,0x2c, 0x10,0x04,0x40,0x00,0x2b,0xa8,0x0a,0x2b,0x11,0x47,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xe7,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xd5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x31,0xb9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x13,0x00,0x00,0x69,0x07,0x03,0x68,0x7a,0x01, 0x21,0x00,0x69,0x07,0x07,0x68,0x6a,0x47,0x21,0x00,0x01,0x35,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x03,0x09,0x21,0x2b,0x2c,0x10,0x02,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x68,0x72,0x47, 0x21,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b,0x21,0x00,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x05,0x06,0x21,0x03,0x2c,0x10,0x03,0x40,0x05,0x04,0x21,0x03,0x2c, 0x10,0x07,0x40,0x04,0x08,0x21,0x03,0x2c,0x10,0x05,0x40,0x04,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x31,0xf8,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x31,0xcb,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1b, 0x00,0x00,0x31,0xba,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x1f, 0x00,0x00,0x31,0xad,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x23, 0x00,0x00,0x31,0x9c,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x27, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x11, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0x3b, 0x00,0x00,0x40,0x3f,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b,0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x81,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0xc4, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x04,0x04,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a, 0x00,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x03,0x40, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x08,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x40,0x07,0x48,0xa8,0x02,0x2b,0x11,0x48,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x06,0xa8,0x2a,0x2b, 0x11,0x01,0x31,0xef,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x16, 0x00,0x00,0x31,0xd4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x1a, 0x00,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1e, 0x00,0x00,0x69,0x00,0x02,0x68,0x3a,0x2b,0x21,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x03,0x07,0x68,0x02,0x06, 0x21,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x06,0x03,0x68,0x02,0x48, 0x21,0x00,0x31,0xb2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x22, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x47,0x04,0x2b,0x00,0x06,0xe4,0x47, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x04,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x47,0x04,0x2b,0x00,0x06,0xc4,0x47, 0x00,0x00,0x40,0x07,0x05,0x21,0x2b,0x2c,0x10,0x02,0x01,0x34,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x06,0x08,0x21,0x03,0x2c,0x10,0x07,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x04,0x21,0x03,0x2c,0x10,0x03,0x40,0x00,0x2b,0xa8,0x32,0x2b, 0x11,0x47,0x31,0xd6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x0b, 0x00,0x00,0x31,0xc7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa5,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x69,0x07,0x00,0x00,0x60,0x86,0x45,0x02,0xe4,0x47,0x00,0x05,0x02,0x00, 0x02,0x00,0x69,0x07,0x07,0x68,0x6a,0x47,0x21,0x00,0x01,0x36,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x05,0x68,0x7a,0x01,0x21,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x35,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x04,0x04,0x68,0x02,0x2b, 0x21,0x00,0x40,0x04,0x09,0x21,0x2b,0x2c,0x10,0x02,0x40,0x04,0x03,0x21,0x03,0x2c, 0x10,0x07,0x40,0x04,0x06,0x21,0x03,0x2c,0x10,0x05,0x01,0x37,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x04,0x08,0x21,0x03,0x2c,0x10,0x04,0x31,0xc9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17,0x00,0x00,0x31,0xa8,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x1b,0x00,0x00,0x31,0xbb,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x1f,0x00,0x00,0x31,0x9a,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x23,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0d,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00,0x03,0x00,0x65,0x05,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff,0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xbb,0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x80,0x44, 0x00,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xbc,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a, 0x00,0x00,0x31,0xad,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e, 0x00,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x0c,0x12, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x3e,0x05,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x48,0xa8,0x02,0x2b, 0x11,0x48,0x40,0x00,0x2b,0xa8,0x52,0x2b,0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02,0x0a,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x06,0x04,0x21,0x2b,0x2c, 0x10,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xc0,0x06, 0x00,0x00,0x69,0x06,0x06,0x68,0x02,0x05,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x2d,0xc9,0x00,0x00,0x69,0x06,0x08,0x68,0x02,0x48, 0x21,0x00,0x69,0x06,0x02,0x68,0x3a,0x2b,0x21,0x00,0x31,0xd1,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x16,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0x12,0x00,0x00,0x00,0x40,0x03,0x07,0x21,0x03,0x2c, 0x10,0x06,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08, 0x03,0x02,0x40,0x04,0x03,0x21,0x03,0x2c,0x10,0x08,0x40,0x04,0x09,0x21,0x2b,0x2c, 0x10,0x02,0x31,0xf0,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0b, 0x00,0x00,0x31,0xcf,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0xa4,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x31,0x93,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x09,0x00,0xa0,0x0c,0x17, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x0b, 0x00,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x69,0x02,0x02,0x68,0x3a,0x2b, 0x21,0x00,0x40,0x3d,0x04,0xa8,0x2a,0x2b,0x11,0x01,0x40,0x00,0x2b,0xa8,0x02,0x2b, 0x11,0x48,0x01,0x3e,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x05,0x68,0x02,0x04, 0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0xff,0xbf, 0x00,0x00,0x69,0x02,0x07,0x68,0x02,0x2b,0x21,0x00,0x40,0x05,0x03,0x21,0x2b,0x2c, 0x10,0x02,0x40,0x03,0x06,0x21,0x03,0x2c,0x10,0x05,0x40,0x03,0x08,0x21,0x03,0x2c, 0x10,0x07,0x31,0xb2,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0b, 0x00,0x00,0x31,0xa6,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0f, 0x00,0x00,0x31,0x97,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xa0,0x0c,0x13, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0a, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00, 0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x0a, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x02,0x24,0x2b,0x00,0x05,0x20,0x00, 0x20,0x00,0x65,0x03,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x7f,0xbb, 0x00,0x00,0x40,0x02,0x04,0x21,0x2b,0x2c,0x10,0x02,0x31,0xa5,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xa9,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x0a,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x45,0x02,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x2b,0x68,0x02,0x2b, 0x81,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x69,0x02,0x05,0x68,0x02,0x2b,0x21,0x00,0x40,0x00,0x2b,0xa8,0x2a,0x2b, 0x11,0x01,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x02, 0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x02,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x69,0x04,0x02,0x68,0x3a,0x2b,0x21,0x00,0x31,0xb8,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x0c,0x0a,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x0c,0x0e,0x00,0x00,0x40,0x06,0x06,0x21,0x03,0x2c, 0x10,0x05,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x09, 0x00,0x00,0x40,0x02,0x07,0x21,0x2b,0x2c,0x10,0x02,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x08,0x03,0x02,0x31,0xba,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x0c,0x0b,0x00,0x00,0x31,0xac,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x0c,0x0f,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x61,0x38,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x51,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0x64,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x05,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x30,0x25,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42, 0x01,0x00,0x00,0x00,0x00,0x20,0xda,0xbf,0x00,0x00,0x31,0xae,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3e,0x03,0x62,0x80,0x48, 0x11,0x00,0x61,0x28,0x38,0x61,0x00,0x49,0x10,0x00,0x31,0xad,0x03,0x80,0x00,0x00, 0x05,0x0c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3d,0x03,0x62,0x20,0x48, 0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x90,0x00, 0x00,0x00,0x61,0x21,0x34,0x61,0x00,0x4a,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00, 0x05,0x14,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x30,0x61,0x00,0x4b, 0x10,0x00,0x61,0x00,0x2c,0x61,0x00,0x4c,0x10,0x00,0x61,0x00,0x24,0x61,0x00,0x4d, 0x10,0x00,0x61,0x00,0x20,0x61,0x00,0x4e,0x10,0x00,0x61,0x00,0x1c,0x61,0x00,0x4f, 0x10,0x00,0x61,0x00,0x3c,0x61,0x00,0x50,0x10,0x00,0x61,0x2e,0x39,0x61,0x00,0x04, 0x10,0x00,0x61,0x00,0x35,0x61,0x00,0x05,0x10,0x00,0x61,0x00,0x31,0x61,0x00,0x06, 0x10,0x00,0x61,0x00,0x2d,0x61,0x00,0x07,0x10,0x00,0x61,0x00,0x25,0x61,0x00,0x08, 0x10,0x00,0x61,0x00,0x21,0x61,0x00,0x09,0x10,0x00,0x61,0x00,0x1d,0x61,0x00,0x0a, 0x10,0x00,0x61,0x00,0x3d,0x61,0x00,0x0b,0x10,0x00,0x61,0x2d,0x3a,0x61,0x00,0x0c, 0x10,0x00,0x61,0x00,0x36,0x61,0x00,0x0d,0x10,0x00,0x61,0x00,0x32,0x61,0x00,0x0e, 0x10,0x00,0x61,0x00,0x2e,0x61,0x00,0x0f,0x10,0x00,0x61,0x00,0x26,0x61,0x00,0x10, 0x10,0x00,0x61,0x00,0x22,0x61,0x00,0x11,0x10,0x00,0x61,0x00,0x1e,0x61,0x00,0x12, 0x10,0x00,0x61,0x00,0x3e,0x61,0x00,0x13,0x10,0x00,0x61,0x21,0x3b,0x61,0x00,0x14, 0x10,0x00,0x61,0x00,0x37,0x61,0x00,0x15,0x10,0x00,0x61,0x00,0x33,0x61,0x00,0x16, 0x10,0x00,0x61,0x00,0x2f,0x61,0x00,0x17,0x10,0x00,0x61,0x00,0x27,0x61,0x00,0x18, 0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x19,0x10,0x00,0x61,0x00,0x1f,0x61,0x00,0x1a, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x30,0x40,0x02, 0x00,0x00,0x61,0x23,0x3f,0x61,0x00,0x1b,0x10,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x55,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x06,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x06,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x06,0x00, 0x06,0x00,0x31,0xe0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38, 0x00,0x00,0x31,0xd2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34, 0x00,0x00,0x31,0xc5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30, 0x00,0x00,0x31,0xb8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x2c, 0x00,0x00,0x31,0xab,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x24, 0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0x9f,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x05, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b,0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06, 0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0xc5,0x01,0x24,0x2b,0x00,0x06,0xc4,0x01,0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x84,0x01,0x00,0x00,0x31,0xc1,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0xb3,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x31,0xa4,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30,0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x06,0x24,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x07,0x04,0x47,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x01,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0xc4,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82, 0x45,0x05,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xd6,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x2c,0x00,0x00,0x31,0xc7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x24,0x00,0x00,0x31,0xb9,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20,0x00,0x00,0x31,0xaa,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x1c,0x00,0x00,0x31,0x9c,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x3c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x40,0x00,0x00,0x00,0x60,0x06, 0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x47,0x24,0x2b,0x00,0x06,0x24,0x47,0x00,0x00,0x40,0x00,0x47,0xa8,0x22,0x2b, 0x11,0x47,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x2b,0x00,0x06,0xe4,0x01, 0x00,0x00,0x65,0x07,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0xc4,0x01, 0x00,0x00,0x31,0xbd,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38, 0x00,0x00,0x31,0xae,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34, 0x00,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x06,0x24,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x07,0x00,0x00,0x20,0x82,0x45,0x07,0x04,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x01,0x3d,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x07,0x00,0x00,0x20,0x82, 0x45,0x03,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x68,0x05,0x00,0x00,0x20,0x82,0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00, 0x04,0x00,0x31,0xd0,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30, 0x00,0x00,0x31,0xc2,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x06,0x00,0xa0,0x24,0x2c, 0x00,0x00,0x31,0xb5,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xa0,0x24,0x24, 0x00,0x00,0x31,0xa8,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x20, 0x00,0x00,0x31,0x9b,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x1c, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x55,0x03,0x00, 0x03,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x01,0x24,0x2b,0x00,0x06,0x64,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x47,0x24,0x2b,0x00,0x06,0x44,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x65,0x04,0x00,0x00,0x60,0x86,0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff, 0xff,0x0f,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x04,0x64,0x01,0x00,0x01,0x04,0x00, 0x04,0x00,0x68,0x04,0x00,0x00,0x20,0x82,0x45,0x05,0x44,0x47,0x00,0x01,0x04,0x00, 0x04,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x2b,0x00,0x15,0x03,0x00, 0x03,0x00,0x31,0xcf,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38, 0x00,0x00,0x31,0xb1,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34, 0x00,0x00,0x31,0xa3,0x04,0x80,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xa0,0x24,0x30, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x2b,0x24,0x2b,0x00,0x06,0x24,0x47, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04, 0x0a,0x02,0x01,0x3f,0x00,0xe8,0x01,0x00,0x11,0x00,0x68,0x02,0x00,0x00,0x20,0x82, 0x45,0x03,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0x94,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x2c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86, 0x01,0x00,0x44,0x2b,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x02,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x31,0x96,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82, 0x05,0x2b,0x04,0x2b,0x00,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x25,0x2b,0x24,0x2b,0x00,0x06,0x64,0x01,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x04,0x0a,0x02,0x65,0x03,0x00,0x00,0x60,0x86, 0x45,0x03,0x04,0x2b,0x00,0x06,0xff,0xff,0xff,0x0f,0x68,0x03,0x00,0x00,0x20,0x82, 0x45,0x04,0x24,0x2b,0x00,0x01,0x04,0x00,0x04,0x00,0x31,0xa7,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x24,0x38,0x00,0x00,0x31,0x99,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x04,0x00,0xa0,0x24,0x34,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00, 0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00, 0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb, 0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00, 0x30,0x00,0x6c,0x01,0x01,0x00,0x60,0x86,0x85,0x02,0x85,0x48,0x22,0x05,0x1f,0x00, 0x1f,0x00,0x61,0x00,0x04,0xa8,0x60,0x00,0xc1,0xb4,0x40,0x02,0x00,0x00,0x60,0x06, 0xa5,0x48,0xa4,0x02,0x00,0x06,0xa4,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06, 0x85,0x48,0x84,0x02,0x00,0x06,0x84,0x48,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06, 0xa5,0x48,0xa4,0x48,0x00,0x06,0xa4,0x02,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06, 0x85,0x48,0x84,0x48,0x00,0x06,0x84,0x02,0x00,0x00,0x61,0x02,0x00,0x00,0xa0,0x02, 0x45,0x02,0xa4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0xa0,0x02, 0x25,0x03,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xaa,0x00,0x00,0xa0,0x0a, 0x45,0x04,0x44,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x5b,0xfa,0x00,0x00,0xa0,0x02, 0x44,0x04,0x44,0x04,0x02,0x02,0x24,0x04,0x44,0x04,0x61,0x00,0x00,0x00,0x60,0x0a, 0x65,0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x60,0x0a, 0x45,0x03,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a, 0x05,0x05,0x44,0x04,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x06, 0x65,0x02,0xa4,0x48,0x00,0x06,0x64,0x02,0x00,0x02,0x40,0x03,0x00,0x00,0x60,0x06, 0x45,0x03,0x84,0x48,0x00,0x06,0x44,0x03,0x00,0x02,0x61,0x03,0x06,0xe8,0x05,0x05, 0x11,0x00,0x61,0x03,0x03,0x68,0x7e,0x02,0x11,0x00,0x61,0x03,0x04,0x68,0x46,0x03, 0x11,0x00,0x61,0x03,0x06,0x68,0x66,0x06,0x11,0x00,0x67,0x00,0x00,0x00,0x60,0x06, 0xa5,0x02,0xa4,0x02,0x00,0x06,0x84,0x02,0x00,0x00,0x5b,0x02,0x00,0x00,0xa0,0x02, 0x44,0x02,0x24,0x03,0x82,0x02,0x24,0x06,0x44,0x02,0x5b,0x04,0x00,0x00,0xa0,0x02, 0x04,0x03,0x04,0x04,0x82,0x02,0x24,0x06,0x04,0x03,0x61,0x00,0x00,0x80,0x90,0x49, 0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x02,0x00,0x00,0xa0,0x0a, 0x45,0x02,0x44,0x02,0x00,0x0a,0x04,0x03,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a, 0x45,0x04,0x44,0x04,0x00,0x0a,0x44,0x02,0x00,0x00,0x61,0x01,0x07,0xe8,0x45,0x04, 0x11,0x00,0x40,0x01,0x07,0xa8,0x02,0x07,0x11,0x06,0x41,0x01,0x20,0x22,0x36,0x07, 0x11,0x48,0x49,0x00,0x08,0xa8,0x32,0x07,0x11,0x48,0x40,0x07,0x07,0xa8,0x32,0x07, 0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0x85,0x48,0x84,0x48,0x00,0x06,0x04,0x08, 0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0x84,0x48,0x00,0x42,0xa4,0x48, 0x00,0x00,0x62,0x07,0x00,0x01,0x60,0x85,0x25,0x07,0x04,0x05,0x00,0x05,0x00,0x00, 0x00,0x00,0x40,0x01,0x07,0xa8,0x12,0x07,0x11,0x07,0x67,0x01,0x00,0x00,0x60,0x06, 0x85,0x48,0x04,0x07,0x00,0x06,0xa4,0x02,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82, 0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x03,0x00,0x00,0x00, 0x00,0x00,0x04,0x48,0x00,0x00,0x00,0x00,0x00,0x00 }; genx_copy_kernel_gen12lp_isa.h000066400000000000000000000023731443134507600352050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_COPY_KERNEL_GEN12LP_ISA_H__ #define __GENX_COPY_KERNEL_GEN12LP_ISA_H__ extern const unsigned char genx_copy_kernel_gen12lp[1420042]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/src/000077500000000000000000000000001443134507600274025ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/copy_kernels/src/genx_copy_kernel.cpp000066400000000000000000011620551443134507600334530ustar00rootroot00000000000000// Copyright (c) 1985-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include /*----------------------------------------------------------------------*/ #define ROUND_UP(offset, round_to) ( ( (offset) + (round_to) - 1) &~ ((round_to) - 1 )) #define ROUND_DOWN(offset, round_to) ( (offset) &~ ( ( round_to) - 1 ) ) #define BLOCK_PIXEL_WIDTH (32) #define BLOCK_HEIGHT (8) #define BLOCK_HEIGHT_NV12 (4) #define SUB_BLOCK_PIXEL_WIDTH (8) #define SUB_BLOCK_HEIGHT (8) #define SUB_BLOCK_HEIGHT_NV12 (4) #define BLOCK_WIDTH (64) #define PADDED_BLOCK_WIDTH (128) #define PADDED_BLOCK_WIDTH_CPU_TO_GPU (80) #define MIN(x, y) (x < y ? x:y) /*32 index*/ const ushort indexTable[32] = {0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10, 0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00}; extern "C" _GENX_MAIN_ void surfaceCopy_write_NV12(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height,int ShiftLeftOffsetInBytes, int width_stride, int height_stride) { //write Y plane matrix inData_m; vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); matrix outData0; matrix outData1; matrix outData2; matrix outData3; int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_byte = (( vertOffset * (width_stride>>2) + horizOffset ) << 2) + ShiftLeftOffsetInBytes; read(DWALIGNED(INBUF_IDX), linear_offset_byte, inData0); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride, inData1); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 2, inData2); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 3, inData3); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 4, inData4); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 5, inData5); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 6, inData6); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_stride * 7, inData7); outData0 = inData_m.select(0, 0); outData1 = inData_m.select(0, 8); outData2 = inData_m.select(0, 16); outData3 = inData_m.select(0, 24); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte, vertOffset, outData0); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset, outData1); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset, outData2); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset, outData3); //write UV plane matrix inData_NV12_m; vector_ref inData_NV12_0 = inData_NV12_m.row(0); vector_ref inData_NV12_1 = inData_NV12_m.row(1); vector_ref inData_NV12_2 = inData_NV12_m.row(2); vector_ref inData_NV12_3 = inData_NV12_m.row(3); matrix outData_NV12_0; matrix outData_NV12_1; matrix outData_NV12_2; matrix outData_NV12_3; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; uint linear_offset_NV12_byte = (( (width_stride>>2) * ( height_stride + vertOffset_NV12 ) + horizOffset_NV12 ) << 2) + ShiftLeftOffsetInBytes; read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte, inData_NV12_0); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_stride, inData_NV12_1); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_stride * 2, inData_NV12_2); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_stride * 3, inData_NV12_3); outData_NV12_0 = inData_NV12_m.select(0, 0); outData_NV12_1 = inData_NV12_m.select(0, 8); outData_NV12_2 = inData_NV12_m.select(0, 16); outData_NV12_3 = inData_NV12_m.select(0, 24); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, outData_NV12_0); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, outData_NV12_1); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, outData_NV12_2); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, outData_NV12_3); } extern "C" _GENX_MAIN_ void surfaceCopy_read_NV12(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int height_stride, int width_stride) { //Y plane matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector_ref outData0(outData_m.row(0)); vector_ref outData1(outData_m.row(1)); vector_ref outData2(outData_m.row(2)); vector_ref outData3(outData_m.row(3)); vector_ref outData4(outData_m.row(4)); vector_ref outData5(outData_m.row(5)); vector_ref outData6(outData_m.row(6)); vector_ref outData7(outData_m.row(7)); //UV plane matrix inData_NV12_0; matrix inData_NV12_1; matrix inData_NV12_2; matrix inData_NV12_3; matrix outData_NV12_m; vector_ref outData_NV12_0 = outData_NV12_m.row(0); vector_ref outData_NV12_1 = outData_NV12_m.row(1); vector_ref outData_NV12_2 = outData_NV12_m.row(2); vector_ref outData_NV12_3 = outData_NV12_m.row(3); int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * (width_stride>>2) + horizOffset + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2) ; uint linear_offset_NV12_dword = (width_stride>>2) * ( height_stride + vertOffset_NV12 ) + horizOffset_NV12 + (ShiftLeftOffsetInBytes/4); uint linear_offset_NV12_byte = (linear_offset_NV12_dword << 2) ; uint last_block_height = 8; if(height - vertOffset < BLOCK_HEIGHT) { last_block_height = height - vertOffset; } if (width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; outData_NV12_m.select(0, 0) = inData_NV12_0; outData_NV12_m.select(0, 8) = inData_NV12_1; outData_NV12_m.select(0, 16) = inData_NV12_2; outData_NV12_m.select(0, 24) = inData_NV12_3; switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_stride * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_stride * 7, outData7); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 3, outData_NV12_3); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); break; default: break; } } else // for the unaligned most right blocks { uint block_width = width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); if (block_width > 8) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i=0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; outData_NV12_m.select(0, 0) = inData_NV12_0; outData_NV12_m.select(0, 8) = inData_NV12_1; outData_NV12_m.select(0, 16) = inData_NV12_2; outData_NV12_m.select(0, 24) = inData_NV12_3; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 24 + i) = outData_m.select(0, 24); outData_NV12_m.select(0, 24 + i) = outData_NV12_m.select(0, 24); } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2), elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 7, elment_offset, outData7.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4 * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride * 3, outData_NV12_3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2) * 3, elment_offset, outData_NV12_3.select<8, 1>(24)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2), elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2), elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + (width_stride>>2) * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_stride, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(24)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_stride, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + (width_stride>>2), elment_offset, outData1.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); break; default: break; } break; case 3: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_NV12_m.select(0, 0) = inData_NV12_0; outData_NV12_m.select(0, 8) = inData_NV12_1; outData_NV12_m.select(0, 16) = inData_NV12_2; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 16 + i) = outData_m.select(0, 16); outData_NV12_m.select(0, 16 + i) = outData_NV12_m.select(0, 16); } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2), elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 7, elment_offset, outData7.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2) * 3, elment_offset, outData_NV12_3.select<8, 1>(16)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2), elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2), elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(16)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + (width_stride>>2), elment_offset, outData1.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); break; default: break; } break; case 2: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_NV12_m.select(0, 0) = inData_NV12_0; outData_NV12_m.select(0, 8) = inData_NV12_1; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 8 + i) = outData_m.select(0, 8); outData_NV12_m.select(0, 8 + i) = outData_NV12_m.select(0, 8); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2), elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 7, elment_offset, outData7.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 3, outData_NV12_3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2) * 3, elment_offset, outData_NV12_3.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2), elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2), elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_stride, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_stride, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + (width_stride>>2), elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); break; default: break; } break; case 1: outData_m.select(0, 0) = inData0; outData_NV12_m.select(0, 0) = inData_NV12_0; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, i) = outData_m.select(0, 0); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, 0); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2), elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 7, elment_offset, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2) * 3, elment_offset, outData_NV12_3.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2), elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2) * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); break; case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2), elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2) * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + (width_stride>>2), elment_offset, outData_NV12_1.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + (width_stride>>2), elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); break; default: break; } break; default: break; } } } extern "C" _GENX_MAIN_ void surfaceCopy_write_P010_shift(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int stride_dword, int stride_height,int ShiftLeftOffsetInBytes, int bitshift) { //write Y plane matrix inData_m; vector_ref inData0(inData_m.row(0).format()); vector_ref inData1(inData_m.row(1).format()); vector_ref inData2(inData_m.row(2).format()); vector_ref inData3(inData_m.row(3).format()); vector_ref inData4(inData_m.row(4).format()); vector_ref inData5(inData_m.row(5).format()); vector_ref inData6(inData_m.row(6).format()); vector_ref inData7(inData_m.row(7).format()); matrix outData0; matrix outData1; matrix outData2; matrix outData3; int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int width_byte = stride_dword << 2; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_byte = (( vertOffset * stride_dword + horizOffset ) << 2) + ShiftLeftOffsetInBytes; read(DWALIGNED(INBUF_IDX), linear_offset_byte, inData0); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte, inData1); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 2, inData2); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 3, inData3); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 4, inData4); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 5, inData5); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 6, inData6); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 7, inData7); outData0.format() = inData_m.select(0, 0)<() = inData_m.select(0, 16)<() = inData_m.select(0, 32)<() = inData_m.select(0, 48)< inData_NV12_m; vector_ref inData_NV12_0 = inData_NV12_m.row(0).format(); vector_ref inData_NV12_1 = inData_NV12_m.row(1).format(); vector_ref inData_NV12_2 = inData_NV12_m.row(2).format(); vector_ref inData_NV12_3 = inData_NV12_m.row(3).format(); matrix outData_NV12_0; matrix outData_NV12_1; matrix outData_NV12_2; matrix outData_NV12_3; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; uint linear_offset_NV12_byte = (( stride_dword * ( stride_height + vertOffset_NV12 ) + horizOffset_NV12 ) << 2) + ShiftLeftOffsetInBytes; read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte, inData_NV12_0); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte, inData_NV12_1); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte * 2, inData_NV12_2); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte * 3, inData_NV12_3); outData_NV12_0.format() = inData_NV12_m.select(0, 0)<() = inData_NV12_m.select(0, 16)<() = inData_NV12_m.select(0, 32)<() = inData_NV12_m.select(0, 48)<> 1, outData_NV12_0); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, outData_NV12_1); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, outData_NV12_2); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, outData_NV12_3); } inline _GENX_ void surfaceCopy_write_shift_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int bitshift, int horizOffset, int vertOffset, int dst2D_start_x, int dst2D_start_y) { int srcBuffer_linear_offset_byte = ((vertOffset * width_dword + horizOffset) << 2) + srcBuffer_ShiftLeftOffsetInBytes; int width_byte = width_dword << 2; int dst2D_horizOffset_byte = dst2D_start_x + (horizOffset << 2); int dst2D_vertOffset_row = dst2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; if (srcBuffer_linear_offset_byte < width_byte * height + srcBuffer_ShiftLeftOffsetInBytes) { matrix inData_m; vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); matrix outData0; matrix outData1; matrix outData2; matrix outData3; read(INBUF_IDX, srcBuffer_linear_offset_byte, inData0); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte, inData1); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 2, inData2); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 3, inData3); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 4, inData4); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 5, inData5); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 6, inData6); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 7, inData7); outData0.format() = inData_m.select(0, 0).format()<() = inData_m.select(0, 8).format()<< bitshift; outData2.format() = inData_m.select(0, 16).format()<< bitshift; outData3.format() = inData_m.select(0, 24).format()<< bitshift; write(OUTBUF_IDX, dst2D_horizOffset_byte, dst2D_vertOffset_row, outData0); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte, dst2D_vertOffset_row, outData1); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte * 2, dst2D_vertOffset_row, outData2); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte * 3, dst2D_vertOffset_row, outData3); } } extern "C" _GENX_MAIN_ void surfaceCopy_write_shift_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int bitshift, int threadHeight, int dst2D_start_x, int dst2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; surfaceCopy_write_shift_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, bitshift, horizOffset, vertOffset, dst2D_start_x, dst2D_start_y); surfaceCopy_write_shift_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, bitshift, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight, dst2D_start_x, dst2D_start_y); surfaceCopy_write_shift_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, bitshift, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 2, dst2D_start_x, dst2D_start_y); surfaceCopy_write_shift_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, bitshift, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 3, dst2D_start_x, dst2D_start_y); } inline _GENX_ void surfaceCopy_read_shift_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height_stride_in_rows, int ShiftLeftOffsetInBytes, int bitshift, int horizOffset, int vertOffset, int width_in_dword_no_padding, int height_no_padding, int src2D_start_x, int src2D_start_y) { int copy_width_dword = MIN(width_in_dword_no_padding, width_dword); int copy_height = MIN(height_no_padding, height_stride_in_rows); int width_byte = width_dword << 2; int horizOffset_byte = src2D_start_x + (horizOffset << 2); int vertOffset_row = src2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * width_dword + horizOffset + (ShiftLeftOffsetInBytes / 4); uint linear_offset_byte = (linear_offset_dword << 2); if (linear_offset_byte < width_byte * copy_height + ShiftLeftOffsetInBytes) { matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector_ref outData0 = outData_m.row(0); vector_ref outData1 = outData_m.row(1); vector_ref outData2 = outData_m.row(2); vector_ref outData3 = outData_m.row(3); vector_ref outData4 = outData_m.row(4); vector_ref outData5 = outData_m.row(5); vector_ref outData6 = outData_m.row(6); vector_ref outData7 = outData_m.row(7); uint last_block_height = 8; if (copy_height - vertOffset < BLOCK_HEIGHT) { last_block_height = copy_height - vertOffset; } if (copy_width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte * 2, vertOffset_row, inData2); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte * 3, vertOffset_row, inData3); outData_m.select(0, 0).format() = inData0.format() >> bitshift; outData_m.select(0, 8).format() = inData1.format() >> bitshift; outData_m.select(0, 16).format() = inData2.format() >> bitshift; outData_m.select(0, 24).format() = inData3.format() >> bitshift; switch (last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); break; default: break; } switch (last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0); break; default: break; } } else // for the unaligned most right blocks { uint block_width = copy_width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); if (block_width > 8) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte * 2, vertOffset_row, inData2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte * 3, vertOffset_row, inData3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i = 0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: outData_m.select(0, 0).format() = inData0.format() >> bitshift; outData_m.select(0, 8).format() = inData1.format() >> bitshift; outData_m.select(0, 16).format() = inData2.format() >> bitshift; outData_m.select(0, 24).format() = inData3.format() >> bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i++) { outData_m.select(0, 24 + i) = outData_m.select(0, 24); } switch (last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 7, elment_offset, outData7.select<8, 1>(24)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); break; default: break; } switch (last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); break; default: break; } break; case 3: outData_m.select(0, 0).format() = inData0.format() >> bitshift; outData_m.select(0, 8).format() = inData1.format() >> bitshift; outData_m.select(0, 16).format() = inData2.format() >> bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i++) { outData_m.select(0, 16 + i) = outData_m.select(0, 16); } switch (last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 7, elment_offset, outData7.select<8, 1>(16)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); break; default: break; } switch (last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); break; default: break; } break; case 2: outData_m.select(0, 0).format() = inData0.format() >> bitshift; outData_m.select(0, 8).format() = inData1.format() >> bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i++) { outData_m.select(0, 8 + i) = outData_m.select(0, 8); } switch (last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 7, elment_offset, outData7.select<8, 1>(8)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); break; default: break; } switch (last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); break; default: break; } break; case 1: outData_m.select(0, 0).format() = inData0.format() >> bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i++) { outData_m.select(0, i) = outData_m.select(0, 0); } switch (last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 7, elment_offset, outData7.select<8, 1>(0)); break; case 7: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); break; case 5: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); break; default: break; } switch (last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); break; case 3: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); break; case 1: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); break; default: break; } break; default: break; } } } } extern "C" _GENX_MAIN_ void surfaceCopy_read_shift_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int bitshift, int threadHeight, int width_in_dword_no_padding, int height_no_padding, int src2D_start_x, int src2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; #pragma unroll for (int i = 0; i< 4; i++) { surfaceCopy_read_shift_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, ShiftLeftOffsetInBytes, bitshift, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * i, width_in_dword_no_padding, height_no_padding, src2D_start_x, src2D_start_y); } } extern "C" _GENX_MAIN_ void surfaceMirror_write_NV12(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int stride_dword, int stride_height,int ShiftLeftOffsetInBytes, int width_dword) { //write Y plane matrix inData_m; vector idx(indexTable); vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); vector_ref idxUV = idx.select<16,1>(16); matrix outData0; matrix outData1; matrix outData2; matrix outData3; int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; int width_byte = stride_dword << 2; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * stride_dword + (ShiftLeftOffsetInBytes/4) + (width_dword - horizOffset) - BLOCK_PIXEL_WIDTH; uint linear_offset_byte = (linear_offset_dword << 2); uint linear_offset_NV12_dword = stride_dword * ( stride_height + vertOffset_NV12 ) + (ShiftLeftOffsetInBytes>>2) + (width_dword - horizOffset_NV12 - BLOCK_PIXEL_WIDTH); uint linear_offset_NV12_byte = (linear_offset_NV12_dword << 2); read(DWALIGNED(INBUF_IDX), linear_offset_byte, inData0); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte, inData1); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 2, inData2); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 3, inData3); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 4, inData4); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 5, inData5); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 6, inData6); read(DWALIGNED(INBUF_IDX), linear_offset_byte + width_byte * 7, inData7); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData0.row(i) = inData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData1.row(i) = inData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData2.row(i) = inData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData3.row(i) = inData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24).format().iselect(idx).format(); /*outData0 = inData_m.select(0, 0); outData1 = inData_m.select(0, 8); outData2 = inData_m.select(0, 16); outData3 = inData_m.select(0, 24);*/ write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte, vertOffset, outData3); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset, outData2); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset, outData1); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset, outData0); //write UV plane matrix inData_NV12_m; vector_ref inData_NV12_0 = inData_NV12_m.row(0); vector_ref inData_NV12_1 = inData_NV12_m.row(1); vector_ref inData_NV12_2 = inData_NV12_m.row(2); vector_ref inData_NV12_3 = inData_NV12_m.row(3); matrix outData_NV12_0; matrix outData_NV12_1; matrix outData_NV12_2; matrix outData_NV12_3; //uint linear_offset_NV12_byte = (( stride_dword * ( stride_height + vertOffset_NV12 ) + horizOffset_NV12 ) << 2) + ShiftLeftOffsetInBytes; read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte, inData_NV12_0); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte, inData_NV12_1); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte * 2, inData_NV12_2); read(DWALIGNED(INBUF_IDX), linear_offset_NV12_byte + width_byte * 3, inData_NV12_3); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_0.row(i) = inData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_1.row(i) = inData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_2.row(i) = inData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_3.row(i) = inData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24).format().iselect(idxUV).format(); /*outData_NV12_0 = inData_NV12_m.select(0, 0); outData_NV12_1 = inData_NV12_m.select(0, 8); outData_NV12_2 = inData_NV12_m.select(0, 16); outData_NV12_3 = inData_NV12_m.select(0, 24);*/ write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, outData_NV12_3); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, outData_NV12_2); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, outData_NV12_1); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, outData_NV12_0); } extern "C" _GENX_MAIN_ void surfaceCopy_read_P010_shift(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int bitshift, int stride_dword, int stride_height) { //Y plane matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector_ref outData0(outData_m.row(0).format()); vector_ref outData1(outData_m.row(1).format()); vector_ref outData2(outData_m.row(2).format()); vector_ref outData3(outData_m.row(3).format()); vector_ref outData4(outData_m.row(4).format()); vector_ref outData5(outData_m.row(5).format()); vector_ref outData6(outData_m.row(6).format()); vector_ref outData7(outData_m.row(7).format()); //UV plane matrix inData_NV12_0; matrix inData_NV12_1; matrix inData_NV12_2; matrix inData_NV12_3; matrix outData_NV12_m; vector_ref outData_NV12_0 = outData_NV12_m.row(0).format(); vector_ref outData_NV12_1 = outData_NV12_m.row(1).format(); vector_ref outData_NV12_2 = outData_NV12_m.row(2).format(); vector_ref outData_NV12_3 = outData_NV12_m.row(3).format(); int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; int width_byte = stride_dword << 2; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * stride_dword + horizOffset + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2); uint linear_offset_NV12_dword = stride_dword * ( stride_height + vertOffset_NV12 ) + horizOffset_NV12 + (ShiftLeftOffsetInBytes/4); uint linear_offset_NV12_byte = (linear_offset_NV12_dword << 2); uint last_block_height = 8; if(height - vertOffset < BLOCK_HEIGHT) { last_block_height = height - vertOffset; } if (width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); outData_m.select(0, 0) = inData0.format()>>bitshift; outData_m.select(0, 16) = inData1.format()>>bitshift; outData_m.select(0, 32) = inData2.format()>>bitshift; outData_m.select(0, 48) = inData3.format()>>bitshift; outData_NV12_m.select(0, 0) = inData_NV12_0.format()>>bitshift; outData_NV12_m.select(0, 16) = inData_NV12_1.format()>>bitshift; outData_NV12_m.select(0, 32) = inData_NV12_2.format()>>bitshift; outData_NV12_m.select(0, 48) = inData_NV12_3.format()>>bitshift; switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 3, outData_NV12_3); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); break; default: break; } } else // for the unaligned most right blocks { uint block_width = width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); if (block_width > 8) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i=0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: outData_m.select(0, 0) = inData0.format()>>bitshift; outData_m.select(0, 16) = inData1.format()>>bitshift; outData_m.select(0, 32) = inData2.format()>>bitshift; outData_m.select(0, 48) = inData3.format()>>bitshift; outData_NV12_m.select(0, 0) = inData_NV12_0.format()>>bitshift; outData_NV12_m.select(0, 16) = inData_NV12_1.format()>>bitshift; outData_NV12_m.select(0, 32) = inData_NV12_2.format()>>bitshift; outData_NV12_m.select(0, 48) = inData_NV12_3.format()>>bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 24 + i) = outData_m.select(0, 24); outData_NV12_m.select(0, 24 + i) = outData_NV12_m.select(0, 24); } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 7, elment_offset, outData7.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte * 3, outData_NV12_3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(24)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 5, elment_offset, outData5.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + width_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); break; default: break; } break; case 3: outData_m.select(0, 0) = inData0.format()>>bitshift; outData_m.select(0, 16) = inData1.format()>>bitshift; outData_m.select(0, 32) = inData2.format()>>bitshift; outData_NV12_m.select(0, 0) = inData_NV12_0.format()>>bitshift; outData_NV12_m.select(0, 16) = inData_NV12_1.format()>>bitshift; outData_NV12_m.select(0, 32) = inData_NV12_2.format()>>bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 16 + i) = outData_m.select(0, 16); outData_NV12_m.select(0, 16 + i) = outData_NV12_m.select(0, 16); } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 7, elment_offset, outData7.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(16)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 5, elment_offset, outData5.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); break; default: break; } break; case 2: outData_m.select(0, 0) = inData0.format()>>bitshift; outData_m.select(0, 16) = inData1.format()>>bitshift; outData_NV12_m.select(0, 0) = inData_NV12_0.format()>>bitshift; outData_NV12_m.select(0, 16) = inData_NV12_1.format()>>bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 8 + i) = outData_m.select(0, 8); outData_NV12_m.select(0, 8 + i) = outData_NV12_m.select(0, 8); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 7, elment_offset, outData7.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 3, outData_NV12_3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + width_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); break; default: break; } break; case 1: outData_m.select(0, 0) = inData0.format()>>bitshift; outData_NV12_m.select(0, 0) = inData_NV12_0.format()>>bitshift; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, i) = outData_m.select(0, 0); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, 0); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 7, elment_offset, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); break; case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); break; default: break; } break; default: break; } } } //*/ extern "C" _GENX_MAIN_ void surfaceMirror_read_NV12(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int stride_dword, int height,int ShiftLeftOffsetInBytes, int width_dword, int height_stride) { //Y plane matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix inData4; vector idx(indexTable); matrix outData_m; vector_ref outData0(outData_m.row(0)); vector_ref outData1(outData_m.row(1)); vector_ref outData2(outData_m.row(2)); vector_ref outData3(outData_m.row(3)); vector_ref outData4(outData_m.row(4)); vector_ref outData5(outData_m.row(5)); vector_ref outData6(outData_m.row(6)); vector_ref outData7(outData_m.row(7)); vector_ref idxUV = idx.select<16,1>(16); //UV plane matrix inData_NV12_0; matrix inData_NV12_1; matrix inData_NV12_2; matrix inData_NV12_3; matrix outData_NV12_m; vector_ref outData_NV12_0 = outData_NV12_m.row(0); vector_ref outData_NV12_1 = outData_NV12_m.row(1); vector_ref outData_NV12_2 = outData_NV12_m.row(2); vector_ref outData_NV12_3 = outData_NV12_m.row(3); int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; int horizOffset_NV12 = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset_NV12 = get_thread_origin_y() * BLOCK_HEIGHT_NV12; int width_byte = width_dword << 2; int stride_byte = stride_dword << 2; int horizOffset_byte = horizOffset << 2; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint last_block_height = 8; if(height - vertOffset < BLOCK_HEIGHT) { last_block_height = height - vertOffset; } if (width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { uint linear_offset_dword = vertOffset * stride_dword + (ShiftLeftOffsetInBytes/4) + (width_dword - horizOffset) - BLOCK_PIXEL_WIDTH; uint linear_offset_byte = (linear_offset_dword << 2); uint linear_offset_NV12_dword = stride_dword * ( height_stride + vertOffset_NV12 ) + (ShiftLeftOffsetInBytes/4) + (width_dword - horizOffset_NV12 - BLOCK_PIXEL_WIDTH); uint linear_offset_NV12_byte = (linear_offset_NV12_dword << 2); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24) = inData0.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData1.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData2.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData3.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24) = inData_NV12_0.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData_NV12_1.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData_NV12_2.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData_NV12_3.row(i).format().iselect(idxUV).format(); switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 7, outData7); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 3, outData_NV12_3); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0); break; default: break; } } else // for the unaligned most right blocks { //for mirroring most right read being written to most left border, so no pixel offset required. uint linear_offset_dword = vertOffset * stride_dword + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2); uint linear_offset_NV12_dword = stride_dword * ( height_stride + vertOffset_NV12 ) + (ShiftLeftOffsetInBytes/4); uint linear_offset_NV12_byte = (linear_offset_NV12_dword << 2); uint block_width = width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset, inData0); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte, vertOffset >> 1, inData_NV12_0); if (block_width > 8) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset, inData1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte, vertOffset >> 1, inData_NV12_1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset, inData2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*2, vertOffset >> 1, inData_NV12_2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset, inData3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset_byte + sub_block_width_byte*3, vertOffset >> 1, inData_NV12_3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i=0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24) = inData0.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData1.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData2.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData3.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 24) = inData_NV12_0.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData_NV12_1.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData_NV12_2.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData_NV12_3.row(i).format().iselect(idxUV).format(); //Padding unused by the first one pixel in the last sub block for (int i = 0; i < last_block_height; i ++) { outData_m.row(i).select<24, 1>(0) = outData_m.row(i).select<24, 1>(last_block_size); } for (int i = 0; i < last_block_height/2; i ++) outData_NV12_m.row(i).select<24, 1>(0) = outData_NV12_m.row(i).select<24, 1>(last_block_size); for (int i = 24; i < 24+last_block_size; i ++) { outData_m.select(0, i) = outData_m.select(0, i+last_block_size); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, i+last_block_size); } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 7, elment_offset, outData7.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte * 3, outData_NV12_3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(24)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 5, elment_offset, outData5.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4 * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte * 2, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(24)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword * 3, elment_offset, outData3.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_dword * 4, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64 + stride_byte, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(24)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + stride_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + stride_dword, elment_offset, outData1.select<8, 1>(24)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + 64, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 24, elment_offset, outData_NV12_0.select<8, 1>(24)); break; default: break; } break; case 3: #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData0.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData1.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData2.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 16) = inData_NV12_0.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData_NV12_1.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData_NV12_2.row(i).format().iselect(idxUV).format(); if(last_block_size<8){ for (int i = 0; i < last_block_height; i ++) { outData_m.row(i).select<16, 1>(0) = outData_m.row(i).select<16, 1>(last_block_size); } for (int i = 0; i < last_block_height/2; i ++) outData_NV12_m.row(i).select<16, 1>(0) = outData_NV12_m.row(i).select<16, 1>(last_block_size); for (int i = 16; i < 16+last_block_size; i ++) { outData_m.select(0, i) = outData_m.select(0, i+last_block_size); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, i+last_block_size); } } switch(last_block_height) { case 8: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 7, elment_offset, outData7.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 3, outData_NV12_3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(16)); break; case 6: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 5, elment_offset, outData5.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(16)); break; case 4: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword * 3, elment_offset, outData3.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(16)); break; case 2: //write Y plane to buffer write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + stride_dword, elment_offset, outData1.select<8, 1>(16)); //write UV plane to buffer write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 16, elment_offset, outData_NV12_0.select<8, 1>(16)); break; default: break; } break; case 2: #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData0.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData1.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 8) = inData_NV12_0.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_m.select<1, 1, SUB_BLOCK_PIXEL_WIDTH, 1>(i, 0) = inData_NV12_1.row(i).format().iselect(idxUV).format(); if(last_block_size<8){ for (int i = 0; i < last_block_height; i ++) { outData_m.row(i).select<8, 1>(0) = outData_m.row(i).select<8, 1>(last_block_size); } for (int i = 0; i < last_block_height/2; i ++) outData_NV12_m.row(i).select<8, 1>(0) = outData_NV12_m.row(i).select<8, 1>(last_block_size); for (int i = 8; i < 8+last_block_size; i ++) { outData_m.select(0, i) = outData_m.select(0, i+last_block_size); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, i+last_block_size); } } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 7, elment_offset, outData7.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 3, outData_NV12_3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte * 2, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(8)); break; case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_byte + stride_byte, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8 + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + stride_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + stride_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_NV12_byte, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + 8, elment_offset, outData_NV12_0.select<8, 1>(8)); break; default: break; } break; case 1: if(last_block_size<8){ for (int i = 0; i < last_block_size; i ++) { outData_m.select(0, i) = outData_m.select(0, i+last_block_size); outData_NV12_m.select(0, i) = outData_NV12_m.select(0, i+last_block_size); } } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 7, elment_offset, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 3, elment_offset, outData_NV12_3.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword * 2, elment_offset, outData_NV12_2.select<8, 1>(0)); break; case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword + stride_dword, elment_offset, outData_NV12_1.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + stride_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_NV12_dword, elment_offset, outData_NV12_0.select<8, 1>(0)); break; default: break; } break; default: break; } } } extern "C" _GENX_MAIN_ void SurfaceMirror_2DTo2D_NV12(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width, int height) { //copy Y plane matrix outData1; matrix outData2; matrix outData3; matrix outData4; matrix outData5; vector idx(indexTable); int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset*4, vertOffset, outData1); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, outData2); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, outData3); read_plane(INBUF_IDX, GENX_SURFACE_Y_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, outData4); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData5.row(i) = outData1.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData1.row(i) = outData2.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData2.row(i) = outData3.row(i).format().iselect(idx).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT; i++) outData3.row(i) = outData4.row(i).format().iselect(idx).format(); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, width - horizOffset*4 - BLOCK_PIXEL_WIDTH, vertOffset, outData5); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4) - BLOCK_PIXEL_WIDTH, vertOffset, outData1); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2) - BLOCK_PIXEL_WIDTH, vertOffset, outData2); write_plane(OUTBUF_IDX, GENX_SURFACE_Y_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3) - BLOCK_PIXEL_WIDTH, vertOffset, outData3); //copy UV plane vector_ref idxUV = idx.select<16,1>(16); matrix outData_NV12_1; matrix outData_NV12_2; matrix outData_NV12_3; matrix outData_NV12_4; matrix outData_NV12_5; read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset*4, vertOffset/2, outData_NV12_1); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset/2, outData_NV12_2); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset/2, outData_NV12_3); read_plane(INBUF_IDX, GENX_SURFACE_UV_PLANE, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset/2, outData_NV12_4); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_5.row(i) = outData_NV12_1.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_1.row(i) = outData_NV12_2.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_2.row(i) = outData_NV12_3.row(i).format().iselect(idxUV).format(); #pragma unroll for(int i = 0; i < SUB_BLOCK_HEIGHT_NV12; i++) outData_NV12_3.row(i) = outData_NV12_4.row(i).format().iselect(idxUV).format(); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, width - horizOffset*4 - BLOCK_PIXEL_WIDTH, vertOffset/2, outData_NV12_5); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4) - BLOCK_PIXEL_WIDTH, vertOffset/2, outData_NV12_1); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2) - BLOCK_PIXEL_WIDTH, vertOffset/2, outData_NV12_2); write_plane(OUTBUF_IDX, GENX_SURFACE_UV_PLANE, width - (horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3) - BLOCK_PIXEL_WIDTH, vertOffset/2, outData_NV12_3); } //*/ inline _GENX_ void swapchannels(vector_ref in,vector_ref temp,int pixel_size) { temp=in; if(pixel_size == 4) { in.select(0)=temp.select(2); in.select(2)=temp.select(0); in.select(1)=temp.select(1); } else { vector_ref in16 = in.format(); vector_ref tmp16 = temp.format(); in16.select(0)=tmp16.select(2); in16.select(2)=tmp16.select(0); in16.select(1)=tmp16.select(1); } } inline _GENX_ void SurfaceCopySwap_2DTo2D_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int horizOffset, int vertOffset, int pixel_size) { matrix outData1; matrix outData2; matrix outData3; matrix outData4; vector temp; vector_ref in1 = outData1.select(0,0).format(); vector_ref in2 = outData1.select(SUB_BLOCK_HEIGHT/2,0).format(); vector_ref in3 = outData2.select(0,0).format(); vector_ref in4 = outData2.select(SUB_BLOCK_HEIGHT/2,0).format(); vector_ref in5 = outData3.select(0,0).format(); vector_ref in6 = outData3.select(SUB_BLOCK_HEIGHT/2,0).format(); vector_ref in7 = outData4.select(0,0).format(); vector_ref in8 = outData4.select(SUB_BLOCK_HEIGHT/2,0).format(); read(INBUF_IDX, horizOffset*4, vertOffset, outData1); read(INBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, outData2); read(INBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, outData3); read(INBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, outData4); swapchannels(in1,temp,pixel_size); swapchannels(in2,temp,pixel_size); swapchannels(in3,temp,pixel_size); swapchannels(in4,temp,pixel_size); swapchannels(in5,temp,pixel_size); swapchannels(in6,temp,pixel_size); swapchannels(in7,temp,pixel_size); swapchannels(in8,temp,pixel_size); write(OUTBUF_IDX, horizOffset*4, vertOffset, outData1); write(OUTBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4, vertOffset, outData2); write(OUTBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*2, vertOffset, outData3); write(OUTBUF_IDX, horizOffset*4 + SUB_BLOCK_PIXEL_WIDTH*4*3, vertOffset, outData4); } extern "C" _GENX_MAIN_ void SurfaceCopySwap_2DTo2D_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int threadHeight, int pixel_size) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; SurfaceCopySwap_2DTo2D_32x8(INBUF_IDX, OUTBUF_IDX, horizOffset, vertOffset,pixel_size); SurfaceCopySwap_2DTo2D_32x8(INBUF_IDX, OUTBUF_IDX, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight, pixel_size); SurfaceCopySwap_2DTo2D_32x8(INBUF_IDX, OUTBUF_IDX, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 2, pixel_size); SurfaceCopySwap_2DTo2D_32x8(INBUF_IDX, OUTBUF_IDX, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 3, pixel_size); } inline _GENX_ void surfaceCopy_writeswap_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int horizOffset, int vertOffset, int pixel_size, int dst2D_start_x, int dst2D_start_y) { int srcBuffer_linear_offset_byte = (( vertOffset * width_dword + horizOffset ) << 2) + srcBuffer_ShiftLeftOffsetInBytes; int width_byte = width_dword << 2; int dst2D_horizOffset_byte = dst2D_start_x + (horizOffset << 2); int dst2D_vertOffset_row = dst2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; if (srcBuffer_linear_offset_byte < width_byte * height + srcBuffer_ShiftLeftOffsetInBytes) { matrix inData_m; vector temp; vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); vector_ref inDataSwap0 = inData0.format(); vector_ref inDataSwap1 = inData1.format(); vector_ref inDataSwap2 = inData2.format(); vector_ref inDataSwap3 = inData3.format(); vector_ref inDataSwap4 = inData4.format(); vector_ref inDataSwap5 = inData5.format(); vector_ref inDataSwap6 = inData6.format(); vector_ref inDataSwap7 = inData7.format(); matrix outData0; matrix outData1; matrix outData2; matrix outData3; read(INBUF_IDX, srcBuffer_linear_offset_byte, inData0); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte, inData1); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 2, inData2); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 3, inData3); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 4, inData4); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 5, inData5); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 6, inData6); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 7, inData7); swapchannels(inDataSwap0,temp,pixel_size); swapchannels(inDataSwap1,temp,pixel_size); swapchannels(inDataSwap2,temp,pixel_size); swapchannels(inDataSwap3,temp,pixel_size); swapchannels(inDataSwap4,temp,pixel_size); swapchannels(inDataSwap5,temp,pixel_size); swapchannels(inDataSwap6,temp,pixel_size); swapchannels(inDataSwap7,temp,pixel_size); outData0 = inData_m.select(0, 0); outData1 = inData_m.select(0, 8); outData2 = inData_m.select(0, 16); outData3 = inData_m.select(0, 24); write(OUTBUF_IDX, dst2D_horizOffset_byte, dst2D_vertOffset_row, outData0); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte, dst2D_vertOffset_row, outData1); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte*2, dst2D_vertOffset_row, outData2); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte*3, dst2D_vertOffset_row, outData3); } } extern "C" _GENX_MAIN_ void surfaceCopy_writeswap_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int threadHeight, int pixel_size, int dst2D_start_x, int dst2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; surfaceCopy_writeswap_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset, pixel_size, dst2D_start_x, dst2D_start_y); surfaceCopy_writeswap_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight, pixel_size, dst2D_start_x, dst2D_start_y); surfaceCopy_writeswap_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 2, pixel_size, dst2D_start_x, dst2D_start_y); surfaceCopy_writeswap_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 3, pixel_size, dst2D_start_x, dst2D_start_y); } //BufferUP-->Surface2D inline _GENX_ void surfaceCopy_write_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int horizOffset, int vertOffset, int dst2D_start_x, int dst2D_start_y) { int srcBuffer_linear_offset_byte = (( vertOffset * width_dword + horizOffset ) << 2) + srcBuffer_ShiftLeftOffsetInBytes; int width_byte = width_dword << 2; int dst2D_horizOffset_byte = dst2D_start_x + (horizOffset << 2); int dst2D_vertOffset_row = dst2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; if (srcBuffer_linear_offset_byte < width_byte * height + srcBuffer_ShiftLeftOffsetInBytes) { matrix inData_m; vector_ref inData0(inData_m.row(0)); vector_ref inData1(inData_m.row(1)); vector_ref inData2(inData_m.row(2)); vector_ref inData3(inData_m.row(3)); vector_ref inData4(inData_m.row(4)); vector_ref inData5(inData_m.row(5)); vector_ref inData6(inData_m.row(6)); vector_ref inData7(inData_m.row(7)); matrix outData0; matrix outData1; matrix outData2; matrix outData3; read(INBUF_IDX, srcBuffer_linear_offset_byte, inData0); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte, inData1); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 2, inData2); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 3, inData3); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 4, inData4); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 5, inData5); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 6, inData6); read(INBUF_IDX, srcBuffer_linear_offset_byte + width_byte * 7, inData7); outData0 = inData_m.select(0, 0); outData1 = inData_m.select(0, 8); outData2 = inData_m.select(0, 16); outData3 = inData_m.select(0, 24); write(OUTBUF_IDX, dst2D_horizOffset_byte, dst2D_vertOffset_row, outData0); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte, dst2D_vertOffset_row, outData1); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte*2, dst2D_vertOffset_row, outData2); write(OUTBUF_IDX, dst2D_horizOffset_byte + sub_block_width_byte*3, dst2D_vertOffset_row, outData3); } } extern "C" _GENX_MAIN_ void surfaceCopy_write_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int srcBuffer_ShiftLeftOffsetInBytes, int threadHeight, int dst2D_start_x, int dst2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; surfaceCopy_write_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset, dst2D_start_x, dst2D_start_y); surfaceCopy_write_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight, dst2D_start_x, dst2D_start_y); surfaceCopy_write_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 2, dst2D_start_x, dst2D_start_y); surfaceCopy_write_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, srcBuffer_ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * 3, dst2D_start_x, dst2D_start_y); } /* Height must be 8-row aligned Width_byte must be 128 aligned (Width_byte = width_dword *4) */ /*inline _GENX_ void surfaceCopy_read_aligned_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int horizOffset, int vertOffset, int src2D_start_x, int src2D_start_y) { int width_byte = width_dword << 2; int horizOffset_byte = src2D_start_x + (horizOffset << 2); int vertOffset_row = src2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * width_dword + horizOffset + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2) ; if (linear_offset_byte < width_byte * height + ShiftLeftOffsetInBytes) { matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector_ref outData0(outData_m.row(0)); vector_ref outData1(outData_m.row(1)); vector_ref outData2(outData_m.row(2)); vector_ref outData3(outData_m.row(3)); vector_ref outData4(outData_m.row(4)); vector_ref outData5(outData_m.row(5)); vector_ref outData6(outData_m.row(6)); vector_ref outData7(outData_m.row(7)); read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*2, vertOffset_row, inData2); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*3, vertOffset_row, inData3); outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7); } } extern "C" _GENX_MAIN_ void surfaceCopy_read_aligned_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int threadHeight, int width_in_dword_no_padding, int height_no_padding, int src2D_start_x, int src2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; #pragma unroll for (int i = 0; i< 4; i ++) { surfaceCopy_read_aligned_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height_no_padding, ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * i, src2D_start_x, src2D_start_y); } } */ inline _GENX_ void surfaceCopy_readswap_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height_stride_in_rows, int ShiftLeftOffsetInBytes, int horizOffset, int vertOffset, int width_in_dword_no_padding, int height_no_padding, int pixel_size, int src2D_start_x, int src2D_start_y) { int copy_width_dword = MIN(width_in_dword_no_padding, width_dword); int copy_height = MIN(height_no_padding, height_stride_in_rows); int width_byte = width_dword << 2; int horizOffset_byte = src2D_start_x + (horizOffset << 2); int vertOffset_row = src2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * width_dword + horizOffset + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2) ; if (linear_offset_byte < width_byte * copy_height + ShiftLeftOffsetInBytes) { matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector tempSwappedData; vector_ref outData0 = outData_m.row(0); vector_ref outData1 = outData_m.row(1); vector_ref outData2 = outData_m.row(2); vector_ref outData3 = outData_m.row(3); vector_ref outData4 = outData_m.row(4); vector_ref outData5 = outData_m.row(5); vector_ref outData6 = outData_m.row(6); vector_ref outData7 = outData_m.row(7); vector_ref outSwappedData0 = outData0.format(); vector_ref outSwappedData1 = outData1.format(); vector_ref outSwappedData2 = outData2.format(); vector_ref outSwappedData3 = outData3.format(); vector_ref outSwappedData4 = outData4.format(); vector_ref outSwappedData5 = outData5.format(); vector_ref outSwappedData6 = outData6.format(); vector_ref outSwappedData7 = outData7.format(); uint last_block_height = 8; if(copy_height - vertOffset < BLOCK_HEIGHT) { last_block_height = copy_height - vertOffset; } if (copy_width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*2, vertOffset_row, inData2); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*3, vertOffset_row, inData3); outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; swapchannels(outSwappedData0,tempSwappedData, pixel_size); swapchannels(outSwappedData1,tempSwappedData, pixel_size); swapchannels(outSwappedData2,tempSwappedData, pixel_size); swapchannels(outSwappedData3,tempSwappedData, pixel_size); swapchannels(outSwappedData4,tempSwappedData, pixel_size); swapchannels(outSwappedData5,tempSwappedData, pixel_size); swapchannels(outSwappedData6,tempSwappedData, pixel_size); swapchannels(outSwappedData7,tempSwappedData, pixel_size); switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0); break; default: break; } } else // for the unaligned most right blocks { uint block_width = copy_width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); if (block_width > 8) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*2, vertOffset_row, inData2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*3, vertOffset_row, inData3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i=0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; swapchannels(outSwappedData0,tempSwappedData, pixel_size); swapchannels(outSwappedData1,tempSwappedData, pixel_size); swapchannels(outSwappedData2,tempSwappedData, pixel_size); swapchannels(outSwappedData3,tempSwappedData, pixel_size); swapchannels(outSwappedData4,tempSwappedData, pixel_size); swapchannels(outSwappedData5,tempSwappedData, pixel_size); swapchannels(outSwappedData6,tempSwappedData, pixel_size); swapchannels(outSwappedData7,tempSwappedData, pixel_size); //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 24 + i) = outData_m.select(0, 24); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 7, elment_offset, outData7.select<8, 1>(24)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); break; default: break; } break; case 3: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 16 + i) = outData_m.select(0, 16); } swapchannels(outSwappedData0,tempSwappedData, pixel_size); swapchannels(outSwappedData1,tempSwappedData, pixel_size); swapchannels(outSwappedData2,tempSwappedData, pixel_size); swapchannels(outSwappedData3,tempSwappedData, pixel_size); swapchannels(outSwappedData4,tempSwappedData, pixel_size); swapchannels(outSwappedData5,tempSwappedData, pixel_size); swapchannels(outSwappedData6,tempSwappedData, pixel_size); swapchannels(outSwappedData7,tempSwappedData, pixel_size); switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 7, elment_offset, outData7.select<8, 1>(16)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); break; default: break; } break; case 2: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 8 + i) = outData_m.select(0, 8); } swapchannels(outSwappedData0,tempSwappedData, pixel_size); swapchannels(outSwappedData1,tempSwappedData, pixel_size); swapchannels(outSwappedData2,tempSwappedData, pixel_size); swapchannels(outSwappedData3,tempSwappedData, pixel_size); swapchannels(outSwappedData4,tempSwappedData, pixel_size); swapchannels(outSwappedData5,tempSwappedData, pixel_size); swapchannels(outSwappedData6,tempSwappedData, pixel_size); swapchannels(outSwappedData7,tempSwappedData, pixel_size); switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 7, elment_offset, outData7.select<8, 1>(8)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); break; default: break; } break; case 1: outData_m.select(0, 0) = inData0; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, i) = outData_m.select(0, 0); } swapchannels(outSwappedData0,tempSwappedData, pixel_size); swapchannels(outSwappedData1,tempSwappedData, pixel_size); swapchannels(outSwappedData2,tempSwappedData, pixel_size); swapchannels(outSwappedData3,tempSwappedData, pixel_size); swapchannels(outSwappedData4,tempSwappedData, pixel_size); swapchannels(outSwappedData5,tempSwappedData, pixel_size); swapchannels(outSwappedData6,tempSwappedData, pixel_size); swapchannels(outSwappedData7,tempSwappedData, pixel_size); switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 7, elment_offset, outData7.select<8, 1>(0)); break; case 7: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); break; case 5: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); break; case 3: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); break; case 1: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); break; default: break; } break; default: break; } } } } extern "C" _GENX_MAIN_ void surfaceCopy_readswap_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int threadHeight, int width_in_dword_no_padding, int height_no_padding, int pixel_size, int src2D_start_x, int src2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; #pragma unroll for (int i = 0; i< 4; i ++) { surfaceCopy_readswap_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * i, width_in_dword_no_padding, height_no_padding, pixel_size, src2D_start_x, src2D_start_y); } } inline _GENX_ void surfaceCopy_read_32x8(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height_stride_in_rows, int ShiftLeftOffsetInBytes, int horizOffset, int vertOffset, int width_in_dword_no_padding, int height_no_padding, int src2D_start_x, int src2D_start_y) { int copy_width_dword = MIN(width_in_dword_no_padding, width_dword); int copy_height = MIN(height_no_padding, height_stride_in_rows); int width_byte = width_dword << 2; int horizOffset_byte = src2D_start_x + (horizOffset << 2); int vertOffset_row = src2D_start_y + vertOffset; int sub_block_width_byte = SUB_BLOCK_PIXEL_WIDTH << 2; uint linear_offset_dword = vertOffset * width_dword + horizOffset + (ShiftLeftOffsetInBytes/4); uint linear_offset_byte = (linear_offset_dword << 2) ; if (linear_offset_byte < width_byte * copy_height + ShiftLeftOffsetInBytes) { matrix inData0; matrix inData1; matrix inData2; matrix inData3; matrix outData_m; vector_ref outData0 = outData_m.row(0); vector_ref outData1 = outData_m.row(1); vector_ref outData2 = outData_m.row(2); vector_ref outData3 = outData_m.row(3); vector_ref outData4 = outData_m.row(4); vector_ref outData5 = outData_m.row(5); vector_ref outData6 = outData_m.row(6); vector_ref outData7 = outData_m.row(7); uint last_block_height = 8; if(copy_height - vertOffset < BLOCK_HEIGHT) { last_block_height = copy_height - vertOffset; } if (copy_width_dword - horizOffset >= BLOCK_PIXEL_WIDTH) // for aligned block { read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*2, vertOffset_row, inData2); read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*3, vertOffset_row, inData3); outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0); break; default: break; } } else // for the unaligned most right blocks { uint block_width = copy_width_dword - horizOffset; uint last_block_size = block_width; uint read_times = 1; read(INBUF_IDX, horizOffset_byte, vertOffset_row, inData0); if (block_width > 8) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte, vertOffset_row, inData1); read_times = 2; last_block_size = last_block_size - 8; if (block_width > 16) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*2, vertOffset_row, inData2); read_times = 3; last_block_size = last_block_size - 8; if (block_width > 24) { read(INBUF_IDX, horizOffset_byte + sub_block_width_byte*3, vertOffset_row, inData3); read_times = 4; last_block_size = last_block_size - 8; } } } vector elment_offset(0); for (uint i=0; i < last_block_size; i++) { elment_offset(i) = i; } switch (read_times) { case 4: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; outData_m.select(0, 24) = inData3; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 24 + i) = outData_m.select(0, 24); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 7, outData7.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 7, elment_offset, outData7.select<8, 1>(24)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 6, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 6, elment_offset, outData6.select<8, 1>(24)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 5, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 5, elment_offset, outData5.select<8, 1>(24)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 4, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 4, elment_offset, outData4.select<8, 1>(24)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 3, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 3, elment_offset, outData3.select<8, 1>(24)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte * 2, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword * 2, elment_offset, outData2.select<8, 1>(24)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_byte + 64 + width_byte, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); write(OUTBUF_IDX, linear_offset_dword + 24 + width_dword, elment_offset, outData1.select<8, 1>(24)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + 64, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 24, elment_offset, outData0.select<8, 1>(24)); break; default: break; } break; case 3: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; outData_m.select(0, 16) = inData2; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 16 + i) = outData_m.select(0, 16); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 7, elment_offset, outData7.select<8, 1>(16)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 6, elment_offset, outData6.select<8, 1>(16)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 5, elment_offset, outData5.select<8, 1>(16)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 4, elment_offset, outData4.select<8, 1>(16)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 3, elment_offset, outData3.select<8, 1>(16)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword * 2, elment_offset, outData2.select<8, 1>(16)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); write(OUTBUF_IDX, linear_offset_dword + 16 + width_dword, elment_offset, outData1.select<8, 1>(16)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<16, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 16, elment_offset, outData0.select<8, 1>(16)); break; default: break; } break; case 2: outData_m.select(0, 0) = inData0; outData_m.select(0, 8) = inData1; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, 8 + i) = outData_m.select(0, 8); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 7, outData7.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 7, elment_offset, outData7.select<8, 1>(8)); break; case 7: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 6, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 6, elment_offset, outData6.select<8, 1>(8)); break; case 6: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 5, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 5, elment_offset, outData5.select<8, 1>(8)); break; case 5: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 4, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 4, elment_offset, outData4.select<8, 1>(8)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 3, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 3, elment_offset, outData3.select<8, 1>(8)); break; case 3: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte * 2, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword * 2, elment_offset, outData2.select<8, 1>(8)); break; case 2: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_byte + width_byte, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); write(OUTBUF_IDX, linear_offset_dword + 8 + width_dword, elment_offset, outData1.select<8, 1>(8)); break; case 1: write(OUTBUF_IDX, linear_offset_byte, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + 8, elment_offset, outData0.select<8, 1>(8)); break; default: break; } break; case 1: outData_m.select(0, 0) = inData0; //Padding unused by the first one pixel in the last sub block for (int i = last_block_size; i < SUB_BLOCK_PIXEL_WIDTH; i ++) { outData_m.select(0, i) = outData_m.select(0, 0); } switch(last_block_height) { case 8: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 7, elment_offset, outData7.select<8, 1>(0)); break; case 7: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 6, elment_offset, outData6.select<8, 1>(0)); break; case 6: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 5, elment_offset, outData5.select<8, 1>(0)); break; case 5: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 4, elment_offset, outData4.select<8, 1>(0)); break; default: break; } switch(last_block_height) { case 4: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 3, elment_offset, outData3.select<8, 1>(0)); break; case 3: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword * 2, elment_offset, outData2.select<8, 1>(0)); break; case 2: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); write(OUTBUF_IDX, linear_offset_dword + width_dword, elment_offset, outData1.select<8, 1>(0)); break; case 1: write(OUTBUF_IDX, linear_offset_dword, elment_offset, outData0.select<8, 1>(0)); break; default: break; } break; default: break; } } } } extern "C" _GENX_MAIN_ void surfaceCopy_read_32x32(SurfaceIndex INBUF_IDX, SurfaceIndex OUTBUF_IDX, int width_dword, int height, int ShiftLeftOffsetInBytes, int threadHeight, int width_in_dword_no_padding, int height_no_padding, int src2D_start_x, int src2D_start_y) { int horizOffset = get_thread_origin_x() * BLOCK_PIXEL_WIDTH; int vertOffset = get_thread_origin_y() * BLOCK_HEIGHT; #pragma unroll for (int i = 0; i< 4; i ++) { surfaceCopy_read_32x8(INBUF_IDX, OUTBUF_IDX, width_dword, height, ShiftLeftOffsetInBytes, horizOffset, vertOffset + SUB_BLOCK_HEIGHT * threadHeight * i, width_in_dword_no_padding, height_no_padding, src2D_start_x, src2D_start_y); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/000077500000000000000000000000001443134507600262335ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/isa/000077500000000000000000000000001443134507600270075ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/isa/genx_fcopy_cmcode_isa.h000066400000000000000000000023451443134507600334730ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_FCOPY_CMCODE_ISA_H__ #define __GENX_FCOPY_CMCODE_ISA_H__ extern const unsigned char genx_fcopy_cmcode[13136]; #endif genx_fcopy_gen12lp_isa.cpp000066400000000000000000001374451443134507600337770ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_fcopy_gen12lp_isa.h" const unsigned char genx_fcopy_gen12lp[9427] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x01,0x00,0x0b,0x4d,0x62,0x43,0x6f,0x70,0x79,0x46, 0x69,0x65,0x4c,0x64,0x32,0x00,0x00,0x00,0xa9,0x15,0x00,0x00,0x35,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x0c,0xdb,0x15,0x00,0x00,0xf8,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x4d,0x62,0x43,0x6f,0x70,0x79,0x46,0x69,0x65,0x4c, 0x64,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f, 0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00, 0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68, 0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25, 0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72, 0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32, 0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33, 0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30, 0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00, 0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34, 0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30, 0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00, 0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34, 0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30, 0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00, 0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35, 0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30, 0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00, 0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36, 0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30, 0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00, 0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37, 0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30, 0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00, 0x56,0x30,0x30,0x37,0x38,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30, 0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30, 0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31, 0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x4d,0x62,0x43,0x6f,0x70,0x79, 0x46,0x69,0x65,0x4c,0x64,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x42,0x42,0x5f, 0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x42,0x42,0x5f,0x33,0x5f, 0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00, 0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42, 0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f, 0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x54, 0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65, 0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65, 0x74,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x55,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x55,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x55, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x55,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x55,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x55,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x55,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x20,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x20,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x51,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x51,0x40,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x51, 0x20,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x51,0x20, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x20,0x01,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x20,0x01,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x40,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51,0x40,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x40,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x20,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x51,0x40,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x51,0x40,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x51,0x20,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x51,0x40,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x20,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x49, 0x00,0x00,0x00,0x01,0x00,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0x4b,0x00,0x00, 0x00,0x01,0x00,0x00,0x4c,0x00,0x00,0x00,0x01,0x00,0x00,0x4d,0x00,0x00,0x00,0x01, 0x00,0x00,0x4e,0x00,0x00,0x00,0x01,0x00,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x00, 0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x00,0x52,0x00, 0x00,0x00,0x01,0x00,0x00,0x53,0x00,0x00,0x00,0x01,0x00,0x00,0x54,0x00,0x00,0x00, 0x01,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x00,0x00,0x0c,0x00,0x56,0x00,0x00,0x00, 0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x00,0x63,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00, 0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00, 0x28,0x00,0x04,0x00,0x5d,0x0f,0x00,0x00,0x4c,0x06,0x00,0x00,0x03,0x00,0x64,0x00, 0x00,0x00,0x10,0x67,0x65,0x6e,0x78,0x5f,0x66,0x63,0x6f,0x70,0x79,0x5f,0x30,0x2e, 0x61,0x73,0x6d,0x65,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x30,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x2c,0x00,0x02,0x02,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x05,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x08,0x00,0x37,0x00,0x06,0x00, 0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x27,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x02,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x32, 0x00,0x02,0x00,0x05,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x37, 0x00,0x06,0x01,0x10,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x07, 0x01,0x10,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x03, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00, 0x32,0x00,0x03,0x00,0x02,0x00,0x2c,0x00,0x00,0x02,0x04,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x01, 0x00,0x2c,0x00,0x00,0x02,0x05,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x32,0x00,0x05,0x80,0x0b,0x00,0x29,0x02,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x02,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x03,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x04,0x04,0x00, 0x02,0x00,0x3e,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d, 0x00,0x00,0x00,0x05,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x05,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x07, 0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x02,0x04,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x03,0x04,0x00,0x02,0x00,0x40,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x32,0x00,0x00,0x00,0x04,0x00,0x31,0x01,0x00,0x29,0x02,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x3d,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x07,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x40,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x03,0x04,0x22,0x01,0x32,0x00,0x00,0x00,0x04,0x00,0x31,0x02,0x00,0x2c,0x00, 0x00,0x02,0x06,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x32,0x00,0x06,0x00,0x03,0x00,0x2c,0x00,0x00,0x02,0x07,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00, 0x07,0x80,0x0b,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3e,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x32,0x00,0x00,0x00, 0x04,0x00,0x31,0x03,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x3d,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x02,0x04,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x03,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x04,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x04,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x07,0x04,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x02,0x04,0x00,0x02,0x00,0x40, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x03,0x04,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x31,0x04,0x00, 0x38,0x00,0x07,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x07,0x01,0x10,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x0b,0x00,0x31,0x05,0x00,0x24,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x10,0x08,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2f,0x00,0x00, 0x00,0x00,0x00,0x37,0x00,0x07,0x01,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x02,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x04,0x00,0x00,0x00,0x32,0x00,0x08,0x00,0x06,0x00,0x2c,0x00,0x00,0x02, 0x09,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00, 0x00,0x32,0x00,0x09,0x80,0x07,0x00,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x02,0x04,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x03,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x04,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x05,0x04, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x07,0x04,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x02,0x04,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x03,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x04,0x04,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x05,0x04, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x07,0x04,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x02,0x04,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x03,0x04,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x04,0x04,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x05,0x04, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x07,0x04,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x32,0x00,0x00,0x00,0x07,0x00,0x31,0x06,0x00, 0x2b,0x00,0x02,0x0a,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x0a,0x80,0x07, 0x00,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x3e,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x3e,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x47,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x47,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x31,0x07,0x00,0x38,0x00,0x07,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x30,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x07,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00, 0x38,0x00,0x07,0x01,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x0b,0x00,0x31,0x08,0x00,0x24,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x36,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x06,0x01,0x10, 0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x0b,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x32,0x00, 0x0b,0x00,0x09,0x00,0x2c,0x00,0x00,0x02,0x0c,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x32,0x00,0x0c,0x80,0x0b,0x00,0x29, 0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00, 0x00,0x00,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x02,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x04,0x04,0x45, 0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x4a, 0x00,0x00,0x00,0x06,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x04,0x45,0x02,0x29,0x03,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x02, 0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0x4b,0x00,0x00,0x00,0x04,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x04,0x45,0x02,0x29, 0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00, 0x00,0x00,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x02,0x04,0x45,0x02,0x29,0x03,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x04,0x04,0x45, 0x02,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x4d, 0x00,0x00,0x00,0x06,0x04,0x45,0x02,0x32,0x00,0x00,0x00,0x0a,0x00,0x31,0x09,0x00, 0x2b,0x00,0x02,0x0d,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x0d,0x80,0x0b, 0x00,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x45,0x02,0x29,0x03,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x04, 0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x4a,0x00,0x00,0x00,0x06,0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x29, 0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x4b,0x00,0x00, 0x00,0x02,0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x04,0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x00,0x45, 0x02,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x02,0x00,0x45,0x02,0x29,0x03,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x04, 0x00,0x45,0x02,0x29,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x4d,0x00,0x00,0x00,0x06,0x00,0x45,0x02,0x31,0x0a,0x00,0x38,0x00,0x07,0x00, 0x10,0x10,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x38,0x00,0x07,0x01,0x10,0x08,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00, 0x00,0x00,0x00,0x00,0x31,0x0b,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10, 0x82,0x66,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10, 0x82,0x86,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10, 0x81,0x75,0x01,0x64,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x35,0x05,0x00,0x05,0x00,0x61,0x02,0x00,0x00,0x60, 0x01,0xa5,0x01,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00,0x00,0x60, 0x81,0xc5,0x01,0x84,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x69,0x02,0x00,0x00,0x60, 0x86,0xe5,0x01,0xa4,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x61,0x00,0x53,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00, 0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x53,0x00,0x00,0x00,0x00,0x0f, 0x00,0x0f,0x00,0x61,0x06,0x53,0x62,0x68,0x01,0x11,0x00,0x61,0x06,0x00,0x80,0xa0, 0x0a,0x25,0x53,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x35,0x03,0x00,0x03,0x00,0x31,0xa0,0x03,0x80,0x00, 0x00,0x05,0x02,0x04,0x53,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x61,0x00,0x54,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x00,0x89,0x02,0x69,0x00,0x12,0x68,0x72,0x01,0x31,0x00,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x54,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x00,0x54,0x62,0x68, 0x01,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x54,0xe4,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x55,0x02, 0x00,0x02,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x0a,0x04,0x54,0x00,0xc0,0x00, 0x00,0x00,0x00,0x61,0x31,0x00,0x80,0xa0,0x4a,0x45,0x54,0x00,0x00,0x00,0x00,0x0f, 0x00,0x07,0x00,0x61,0x06,0x54,0x62,0x60,0x12,0x11,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x31,0xa2,0x03,0x80,0x00, 0x00,0x05,0x13,0x04,0x54,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x00,0x49,0x02,0x31,0x43,0x03,0x80,0x00, 0x00,0x05,0x17,0x04,0x54,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x03,0x00,0x03,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0c,0x00,0x00,0x01,0x21,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x85,0x02,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0b,0x85,0x03,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x85,0x04,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x85,0x05,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x85,0x06,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x85,0x07,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0x85,0x08,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x85,0x09,0x34,0x00,0x00, 0x00,0x00,0x00,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x02,0x00,0xa0, 0x0a,0x85,0x17,0x85,0x13,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x18,0x85,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x19,0x85,0x15,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x1a,0x85,0x16,0x34,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x01,0x21,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x0a,0x85,0x02,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0b,0x85,0x03,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x85,0x04,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x05,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x85,0x06,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x07,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x85,0x08,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x09,0x34,0x00,0x00, 0x00,0x00,0x00,0x01,0x23,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x22,0x02,0x00,0xa0, 0x0a,0x05,0x17,0x85,0x13,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x18,0x85,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x19,0x85,0x15,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x1a,0x85,0x16,0x34,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0a,0x00,0x00,0x01,0x01,0x00,0xe8,0x01, 0x00,0x11,0x00,0x01,0x21,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0, 0x0a,0x05,0x0a,0x05,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x0b,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x0c,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x0d,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x0e,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x0f,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x10,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x11,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x23,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x05,0x17,0x05,0x13,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x14,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x05,0x15,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x16,0x34,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, 0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x21,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x05,0x02,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0b,0x05,0x03,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x05,0x04,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x05,0x05,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x05,0x06,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x05,0x07,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0x05,0x08,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x05,0x09,0x34,0x00,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x23,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x85,0x17,0x05,0x13,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x14,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x05,0x15,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x16,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x55,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x55,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x00,0x55,0x62,0x68, 0x01,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x55,0xe4,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x55,0x00,0xc0,0x44, 0x0a,0x00,0x00,0x61,0x34,0x00,0x80,0xa0,0x4a,0x45,0x55,0x00,0x00,0x00,0x00,0x0f, 0x00,0x07,0x00,0x61,0x00,0x55,0x62,0x60,0x12,0x11,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x31,0xa5,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x55,0x00,0xc0,0x24,0x17,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x08,0x00,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x25,0x12,0xa4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x61,0x00,0x56,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x56,0x00,0x00,0x00,0x00,0x0f, 0x00,0x0f,0x00,0x61,0x00,0x56,0x62,0x68,0x01,0x11,0x00,0x61,0x05,0x56,0x62,0xc8, 0x12,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x45,0x12,0x24,0x12,0x00,0x05,0x10, 0x00,0x10,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x1f,0x04,0x56,0x00,0xc0,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x36,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x01,0x00,0x80,0xa0,0x0a,0x25,0x56,0x44,0x12,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x04, 0x00,0x04,0x00,0x31,0xa7,0x03,0x80,0x00,0x00,0x05,0x27,0x04,0x56,0x00,0xc0,0x00, 0x00,0x00,0x00,0x69,0x37,0x00,0x00,0x60,0x86,0x25,0x56,0xa4,0x01,0x00,0x05,0x03, 0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x56,0x00,0x00,0x00,0x00,0x0f, 0x00,0x07,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01, 0x00,0x49,0x02,0x31,0xa8,0x03,0x80,0x00,0x00,0x05,0x1b,0x04,0x56,0x00,0xc0,0x00, 0x00,0x00,0x00,0x61,0x38,0x00,0x80,0xa0,0x4a,0x45,0x56,0x00,0x00,0x00,0x00,0x0f, 0x00,0x0f,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x56,0xe4,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01, 0x00,0x89,0x02,0x31,0xa9,0x03,0x80,0x00,0x00,0x05,0x2f,0x04,0x56,0x00,0xc0,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0, 0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x05, 0x00,0x05,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60, 0x03,0x00,0x00,0x01,0x26,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0, 0x0a,0x85,0x1f,0x05,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x20,0x85,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x21,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x22,0x85,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x23,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x24,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x25,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x26,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x27,0x02,0x00,0xa0, 0x0a,0x85,0x27,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x28,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x29,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x2a,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x2b,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x2c,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x2d,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x2e,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x29,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x28,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x05,0x1b,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x30,0x85,0x1b,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x31,0x05,0x1c,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x85,0x1c,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x05,0x1d,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x34,0x85,0x1d,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x05,0x1e,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x85,0x1e,0x34,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01, 0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x01,0x00,0x00,0x01,0x26,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x20,0x02,0x00,0xa0, 0x0a,0x05,0x1f,0x05,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x20,0x85,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x21,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x22,0x85,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x23,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x24,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x25,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x26,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x27,0x02,0x00,0xa0, 0x0a,0x05,0x27,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x28,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x29,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x2a,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x2b,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x2c,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x2d,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x2e,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x29,0x00,0xe8,0x01, 0x00,0x11,0x00,0x61,0x28,0x02,0x00,0xa0,0x0a,0x05,0x2f,0x05,0x1b,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x30,0x85,0x1b,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x31,0x05,0x1c,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x32,0x85,0x1c,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x05,0x1d,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x34,0x85,0x1d,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x35,0x05,0x1e,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x36,0x85,0x1e,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x57,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x57,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x00,0x57,0x62,0x68, 0x01,0x11,0x00,0x61,0x00,0x57,0x62,0xc8,0x12,0x11,0x00,0x31,0x96,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x57,0x00,0xc0,0x44,0x1f,0x00,0x00,0x61,0x36,0x00,0x80,0xa0, 0x0a,0x25,0x57,0x44,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x97,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x57,0x00,0xc0,0x44,0x27,0x00,0x00,0x61,0x37,0x00,0x80,0xa0, 0x0a,0x25,0x57,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x31,0xa9,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x57,0x00,0xc0,0x44,0x2f,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x69,0x00,0x00,0x00,0x60, 0x86,0x65,0x12,0xa4,0x01,0x00,0x05,0x05,0x00,0x05,0x00,0x61,0x00,0x58,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00, 0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x58,0x00,0x00,0x00,0x00,0x0f, 0x00,0x0f,0x00,0x61,0x00,0x58,0x62,0x68,0x01,0x11,0x00,0x61,0x05,0x00,0x80,0xa0, 0x0a,0x25,0x58,0x64,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x06,0x00,0x06,0x00,0x31,0xaa,0x03,0x80,0x00, 0x00,0x05,0x37,0x04,0x58,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x3a,0x00,0x00,0x60, 0x86,0x25,0x58,0x64,0x12,0x00,0x05,0x10,0x00,0x10,0x00,0x31,0x9b,0x03,0x80,0x00, 0x00,0x05,0x3f,0x04,0x58,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3b,0x00,0x80,0xa0, 0x0a,0x25,0x58,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x01,0x00,0x89,0x02,0x31,0xac,0x03,0x80,0x00, 0x00,0x05,0x47,0x04,0x58,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x86,0x01,0x00,0x44,0x01,0x00,0x15,0x07,0x00,0x07,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x61,0x2a,0x03,0x00,0xa0, 0x0a,0x05,0x37,0x85,0x37,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x03,0x00,0xa0, 0x0a,0x05,0x4f,0x85,0x47,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x50,0x85,0x49,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x51,0x85,0x4b,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x52,0x85,0x4d,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x38,0x85,0x39,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x39,0x85,0x3b,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3a,0x85,0x3d,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x2b,0x03,0x00,0xa0, 0x0a,0x05,0x3b,0x85,0x3f,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3c,0x85,0x41,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3d,0x85,0x43,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3e,0x85,0x45,0x44,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10, 0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x61,0xfa,0x03,0x00,0xa0, 0x0a,0x05,0x37,0x05,0x37,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x03,0x00,0xa0, 0x0a,0x05,0x4f,0x05,0x47,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x50,0x05,0x49,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x51,0x05,0x4b,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x52,0x05,0x4d,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x38,0x05,0x39,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x39,0x05,0x3b,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00,0xa0, 0x0a,0x05,0x3a,0x05,0x3d,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x2b,0x03,0x00,0xa0, 0x0a,0x05,0x3b,0x05,0x3f,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3c,0x05,0x41,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3d,0x05,0x43,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0, 0x0a,0x05,0x3e,0x05,0x45,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x59,0x64,0x00, 0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x59,0x00,0x00,0x00,0x00,0x0f, 0x00,0x0f,0x00,0x61,0x00,0x59,0x62,0x68,0x01,0x11,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x59,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9d,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x59,0x00,0xc0,0x44,0x37,0x00,0x00,0x69,0x3d,0x00,0x00,0x60, 0x86,0x25,0x59,0xa4,0x01,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x59,0x00,0x00,0x00,0x00,0x0f,0x00,0x07,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x31,0xae,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x59,0x00,0xc0,0x24,0x4f,0x00,0x00,0x61,0x00,0x7f,0x64,0x00, 0x00,0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00, 0x00,0x00,0x00 }; genx_fcopy_gen12lp_isa.h000066400000000000000000000023441443134507600334310ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GEN_FCOPY_GEN12LP_ISA_H__ #define __GEN_FCOPY_GEN12LP_ISA_H__ extern const unsigned char genx_fcopy_gen12lp[9427]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/src/000077500000000000000000000000001443134507600270225ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/field_copy/src/genx_fcopy.cpp000066400000000000000000000132151443134507600316710ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include typedef unsigned char uint1; // unsigned byte typedef char int1; // byte extern "C" _GENX_MAIN_ void MbCopyFieLd(SurfaceIndex InSurfIndex, SurfaceIndex OutSurfIndex, int fieldMask) { // Luma only uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); uint ix = mbX << 4; // 16x16 uint iy = mbY << 4; if (fieldMask > 5) { matrix inMbY0; matrix inMbY1; matrix outMbY; matrix inMbUV; matrix outMbUV; read_plane(InSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2, inMbY0); read_plane(InSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2 + 16, inMbY1); read_plane(InSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy, inMbUV); switch (fieldMask) { case 0x6: // TFF2FIELD outMbY.select<8,1,16,1>(0,0) = inMbY0.select<8,2,16,1>(0,0); outMbY.select<8,1,16,1>(8,0) = inMbY1.select<8,2,16,1>(0,0); outMbUV.select<8,1,16,1>(0,0) = inMbUV.select<8,2,16,1>(0,0); break; case 0x7: // BFF2FIELD outMbY.select<8,1,16,1>(0,0) = inMbY0.select<8,2,16,1>(1,0); outMbY.select<8,1,16,1>(8,0) = inMbY1.select<8,2,16,1>(1,0); outMbUV.select<8,1,16,1>(0,0) = inMbUV.select<8,2,16,1>(1,0); break; default: return; } write_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, outMbY); write_plane(OutSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy / 2, outMbUV); } else if (fieldMask > 3) { matrix inMbY; matrix outMbY0; matrix outMbY1; matrix inMbUV; matrix outMbUV; read_plane(InSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, inMbY); read_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2, outMbY0); read_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2 + 16, outMbY1); read_plane(InSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy / 2, inMbUV); read_plane(OutSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy, outMbUV); switch (fieldMask) { case 0x4: // FIELD2TFF outMbY0.select<8,2,16,1>(0,0) = inMbY.select<8,1,16,1>(0,0); outMbY1.select<8,2,16,1>(0,0) = inMbY.select<8,1,16,1>(8,0); outMbUV.select<8,2,16,1>(0,0) = inMbUV.select<8,1,16,1>(0,0); break; case 0x5: // FIELD2BFF outMbY0.select<8,2,16,1>(1,0) = inMbY.select<8,1,16,1>(0,0); outMbY1.select<8,2,16,1>(1,0) = inMbY.select<8,1,16,1>(8,0); outMbUV.select<8,2,16,1>(1,0) = inMbUV.select<8,1,16,1>(0,0); break; } write_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2, outMbY0); write_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy * 2 + 16, outMbY1); write_plane(OutSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy, outMbUV); } else { matrix inMbY; matrix outMbY; matrix inMbUV; matrix outMbUV; read_plane(InSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, inMbY); read_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, outMbY); read_plane(InSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy / 2, inMbUV); read_plane(OutSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy / 2, outMbUV); switch (fieldMask) { case 0x0: // TFF2TFF outMbY.select<8,2,16,1>(0,0) = inMbY.select<8,2,16,1>(0,0); outMbUV.select<4,2,16,1>(0,0) = inMbUV.select<4,2,16,1>(0,0); break; case 0x1: // TFF2BFF outMbY.select<8,2,16,1>(1,0) = inMbY.select<8,2,16,1>(0,0); outMbUV.select<4,2,16,1>(1,0) = inMbUV.select<4,2,16,1>(0,0); break; case 0x2: // BFF2TFF outMbY.select<8,2,16,1>(0,0) = inMbY.select<8,2,16,1>(1,0); outMbUV.select<4,2,16,1>(0,0) = inMbUV.select<4,2,16,1>(1,0); break; case 0x3: // BTFF2BFF outMbY.select<8,2,16,1>(1,0) = inMbY.select<8,2,16,1>(1,0); outMbUV.select<4,2,16,1>(1,0) = inMbUV.select<4,2,16,1>(1,0); break; default: return; } write_plane(OutSurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, outMbY); write_plane(OutSurfIndex, GENX_SURFACE_UV_PLANE, ix, iy / 2, outMbUV); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/000077500000000000000000000000001443134507600261165ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/isa/000077500000000000000000000000001443134507600266725ustar00rootroot00000000000000genx_histogram_gen12lp_isa.cpp000066400000000000000000011277031443134507600345340ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_histogram_gen12lp_isa.h" const unsigned char genx_histogram_gen12lp[60429] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x02,0x00,0x11,0x48,0x69,0x73,0x74,0x6f,0x67,0x72, 0x61,0x6d,0x53,0x4c,0x4d,0x46,0x72,0x61,0x6d,0x65,0x65,0x00,0x00,0x00,0x05,0x44, 0x00,0x00,0xa3,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x6a,0x44,0x00,0x00, 0x58,0x1d,0x00,0x00,0x12,0x48,0x69,0x73,0x74,0x6f,0x67,0x72,0x61,0x6d,0x53,0x4c, 0x4d,0x46,0x69,0x65,0x6c,0x64,0x73,0xc2,0x61,0x00,0x00,0x03,0x62,0x00,0x00,0x3e, 0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xc5,0xc3,0x00,0x00,0x48,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x48,0x69,0x73,0x74,0x6f,0x67,0x72, 0x61,0x6d,0x53,0x4c,0x4d,0x46,0x72,0x61,0x6d,0x65,0x00,0x25,0x6e,0x75,0x6c,0x6c, 0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65, 0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78, 0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72, 0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25, 0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73, 0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62, 0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00, 0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35, 0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33, 0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30, 0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56, 0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31, 0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30, 0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56, 0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39, 0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30, 0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56, 0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37, 0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30, 0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56, 0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35, 0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30, 0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56, 0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33, 0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30, 0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56, 0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31, 0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30, 0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56, 0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39, 0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30, 0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56, 0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37, 0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31, 0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56, 0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35, 0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31, 0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56, 0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33, 0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31, 0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56, 0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31, 0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31, 0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56, 0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39, 0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31, 0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56, 0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37, 0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31, 0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56, 0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35, 0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31, 0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56, 0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33, 0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31, 0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56, 0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31, 0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31, 0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56, 0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39, 0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31, 0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56, 0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37, 0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x41,0x30,0x30, 0x00,0x41,0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30,0x34, 0x00,0x41,0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30,0x38, 0x00,0x41,0x30,0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31,0x32, 0x00,0x41,0x31,0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31,0x36, 0x00,0x41,0x31,0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31,0x39,0x00,0x41,0x32,0x30, 0x00,0x41,0x32,0x31,0x00,0x41,0x32,0x32,0x00,0x41,0x32,0x33,0x00,0x41,0x32,0x34, 0x00,0x41,0x32,0x35,0x00,0x41,0x32,0x36,0x00,0x41,0x32,0x37,0x00,0x41,0x32,0x38, 0x00,0x41,0x32,0x39,0x00,0x41,0x33,0x30,0x00,0x41,0x33,0x31,0x00,0x50,0x30,0x31, 0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35, 0x00,0x50,0x30,0x36,0x00,0x48,0x69,0x73,0x74,0x6f,0x67,0x72,0x61,0x6d,0x53,0x4c, 0x4d,0x46,0x72,0x61,0x6d,0x65,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x32,0x00,0x42,0x42, 0x5f,0x31,0x5f,0x33,0x00,0x42,0x42,0x5f,0x32,0x5f,0x34,0x00,0x42,0x42,0x5f,0x33, 0x5f,0x35,0x00,0x42,0x42,0x5f,0x34,0x5f,0x36,0x00,0x42,0x42,0x5f,0x35,0x5f,0x37, 0x00,0x42,0x42,0x5f,0x36,0x5f,0x38,0x00,0x42,0x42,0x5f,0x37,0x5f,0x39,0x00,0x42, 0x42,0x5f,0x38,0x5f,0x31,0x30,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37, 0x00,0x53,0x4c,0x4d,0x53,0x69,0x7a,0x65,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65, 0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x52,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x50,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x50,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x50,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x79,0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x23,0x02, 0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x20,0x01,0x00, 0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x50,0x10,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x53,0x10,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x23,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x20,0x01,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x89,0x00,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x00,0x00,0x00,0x20,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b, 0x00,0x00,0x00,0x52,0x20,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0x52,0x20,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00, 0x00,0x52,0x20,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00, 0x52,0x20,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x52, 0x20,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x52,0x20, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x52,0x20,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x52,0x20,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x50,0x10,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x50,0x00,0x01,0x41,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x50,0x10,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x50,0x10,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x50,0x10,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x50,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x00,0x00,0x00,0x50,0x10,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0x50,0x10,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b, 0x00,0x00,0x00,0x50,0x10,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x50,0x10,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x50,0x10,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00, 0x50,0x10,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x50, 0x10,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x50,0x10, 0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x50,0x10,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x50,0x10,0x00,0x5f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x50,0x10,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x52,0x10,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x50,0x10,0x00,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x50,0x08,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x50,0x08,0x00,0x70,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0x50,0x08,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa9,0x00,0x00,0x00,0x50,0x08,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x00,0x00,0x00,0x50,0x08,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0x00,0x00,0x00,0x50,0x08,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x50,0x08,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00, 0x00,0x50,0x08,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xae,0x00, 0x00,0x00,0x08,0x00,0x00,0xaf,0x00,0x00,0x00,0x08,0x00,0x00,0xb0,0x00,0x00,0x00, 0x08,0x00,0x00,0xb1,0x00,0x00,0x00,0x08,0x00,0x00,0xb2,0x00,0x00,0x00,0x08,0x00, 0x00,0xb3,0x00,0x00,0x00,0x08,0x00,0x00,0xb4,0x00,0x00,0x00,0x08,0x00,0x00,0xb5, 0x00,0x00,0x00,0x08,0x00,0x00,0xb6,0x00,0x00,0x00,0x08,0x00,0x00,0xb7,0x00,0x00, 0x00,0x08,0x00,0x00,0xb8,0x00,0x00,0x00,0x08,0x00,0x00,0xb9,0x00,0x00,0x00,0x08, 0x00,0x00,0xba,0x00,0x00,0x00,0x08,0x00,0x00,0xbb,0x00,0x00,0x00,0x08,0x00,0x00, 0xbc,0x00,0x00,0x00,0x08,0x00,0x00,0xbd,0x00,0x00,0x00,0x08,0x00,0x00,0xbe,0x00, 0x00,0x00,0x08,0x00,0x00,0xbf,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x00,0x00, 0x08,0x00,0x00,0xc1,0x00,0x00,0x00,0x08,0x00,0x00,0xc2,0x00,0x00,0x00,0x08,0x00, 0x00,0xc3,0x00,0x00,0x00,0x08,0x00,0x00,0xc4,0x00,0x00,0x00,0x08,0x00,0x00,0xc5, 0x00,0x00,0x00,0x08,0x00,0x00,0xc6,0x00,0x00,0x00,0x08,0x00,0x00,0xc7,0x00,0x00, 0x00,0x08,0x00,0x00,0xc8,0x00,0x00,0x00,0x08,0x00,0x00,0xc9,0x00,0x00,0x00,0x08, 0x00,0x00,0xca,0x00,0x00,0x00,0x08,0x00,0x00,0xcb,0x00,0x00,0x00,0x08,0x00,0x00, 0xcc,0x00,0x00,0x00,0x08,0x00,0x00,0xcd,0x00,0x00,0x00,0x08,0x00,0x00,0x06,0x00, 0xce,0x00,0x00,0x00,0x01,0x00,0x00,0xcf,0x00,0x00,0x00,0x01,0x00,0x00,0xd0,0x00, 0x00,0x00,0x01,0x00,0x00,0xd1,0x00,0x00,0x00,0x01,0x00,0x00,0xd2,0x00,0x00,0x00, 0x01,0x00,0x00,0xd3,0x00,0x00,0x00,0x01,0x00,0x00,0x09,0x00,0xd4,0x00,0x00,0x00, 0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00, 0xda,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0xdd,0x00,0x00,0x00,0x01,0x00,0x00,0xde,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00, 0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00, 0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00, 0x30,0x00,0x04,0x00,0x00,0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x10,0x24,0x00, 0x00,0x00,0x40,0x00,0x0c,0x00,0x18,0x25,0x00,0x00,0x00,0x60,0x00,0x0c,0x00,0x08, 0x26,0x00,0x00,0x00,0x4c,0x00,0x0c,0x00,0x43,0x34,0x00,0x00,0xc2,0x0f,0x00,0x00, 0x03,0x00,0xdf,0x00,0x00,0x00,0x01,0x04,0xe0,0x00,0x00,0x00,0x14,0x67,0x65,0x6e, 0x78,0x5f,0x68,0x69,0x73,0x74,0x6f,0x67,0x72,0x61,0x6d,0x5f,0x30,0x2e,0x61,0x73, 0x6d,0xe1,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x00,0x25,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x25,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x02, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x08,0x10,0x32,0x54,0x76,0x10,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x04,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x63,0x00,0x00, 0x00,0x00,0x08,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0x20,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x00,0x01,0x00,0x00,0x32,0x00,0x01,0x80,0x02,0x00,0x29,0x04, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x01,0x00,0x29,0x04,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x24,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x0f, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x02,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x00,0x01,0x00,0x00,0x32,0x00,0x02,0x00,0x01,0x00,0x31,0x02, 0x00,0x29,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x0a,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x0c, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x0e,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x12,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x14,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x16,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00, 0x00,0x18,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x1a,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x1c,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x1e,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x2c,0x00,0x04,0x02,0x03,0x00,0x00,0x8c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x03,0x00,0x05,0x00,0x31,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x8d,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x04,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x04,0x80,0x04, 0x00,0x31,0x05,0x00,0x2c,0x00,0x04,0x02,0x05,0x00,0x00,0x8e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x05,0x80, 0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x38,0x00,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x38,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x38,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x05,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x24,0x05,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x28,0x03,0x01,0x00,0x00,0x00,0x03,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x01,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00, 0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x01,0x00,0x02, 0x03,0x00,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x04, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x00,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x05,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x06,0x00, 0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x01,0x00,0x02, 0x03,0x00,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x03,0x01,0x01,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x91,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x01,0x00,0x00,0x01,0x00, 0x02,0x03,0x01,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00, 0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x01,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00,0x03,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x04, 0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x05,0x00,0x00,0x01,0x00, 0x02,0x03,0x01,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00, 0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x01,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00,0x07,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x02,0x00,0x00,0x03,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x02, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x02,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x02,0x00,0x01,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x02,0x00, 0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x02,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x00,0x00,0x01, 0x00,0x02,0x03,0x02,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x02,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x02, 0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x02,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x02,0x00,0x05,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x02,0x00, 0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x02,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x02,0x00,0x07,0x00,0x00,0x01, 0x00,0x02,0x03,0x02,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x03,0x01,0x03,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x91,0x00,0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x03, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x03,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x03,0x00,0x01,0x00,0x00, 0x01,0x00,0x02,0x03,0x03,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x03,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03, 0x03,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x03,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x03,0x00,0x03,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x03, 0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x03,0x00,0x04,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x03,0x00,0x05,0x00,0x00, 0x01,0x00,0x02,0x03,0x03,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x03,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03, 0x03,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x03,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x03,0x00,0x07,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x04,0x00,0x00, 0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x04,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x04,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x01, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x04,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x02,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x00, 0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x04,0x00,0x04,0x00,0x00,0x01,0x00,0x02, 0x03,0x04,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x04,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x05, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x04,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x06,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x04,0x00,0x07,0x00, 0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x03,0x01,0x05,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00, 0x03,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x01, 0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x02,0x00,0x00,0x01,0x00, 0x02,0x03,0x05,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00, 0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x05,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00,0x04,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x05, 0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x06,0x00,0x00,0x01,0x00, 0x02,0x03,0x05,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x05,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00, 0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x06, 0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x03,0x06,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x06,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x06, 0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x06,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x06,0x00,0x02,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x06,0x00, 0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x06,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x06,0x00,0x04,0x00,0x00,0x01, 0x00,0x02,0x03,0x06,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x06,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x06, 0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x06,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x06,0x00,0x06,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x06,0x00, 0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x06,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x07,0x00,0x00,0x03,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00, 0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x07,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07, 0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x07,0x00,0x01,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07,0x00,0x02,0x00,0x00, 0x01,0x00,0x02,0x03,0x07,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03, 0x07,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x07,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x07,0x00,0x04,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07, 0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x07,0x00,0x05,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07,0x00,0x06,0x00,0x00, 0x01,0x00,0x02,0x03,0x07,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x07,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03, 0x07,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03, 0x01,0x08,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x08,0x00,0x01,0x00,0x00,0x01,0x00,0x02, 0x03,0x08,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x08,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x02, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x08,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x03,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x08,0x00,0x04,0x00, 0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x08,0x00,0x05,0x00,0x00,0x01,0x00,0x02, 0x03,0x08,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x08,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x06, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x08,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x08,0x00,0x07,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x09,0x00,0x00,0x03,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x08,0x22,0x01, 0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x09,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x01,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x02, 0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x03,0x00,0x00,0x01,0x00, 0x02,0x03,0x09,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00, 0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x09,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x05,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x06, 0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x07,0x00,0x00,0x01,0x00, 0x02,0x03,0x09,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x03,0x01,0x0a,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x0a,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0a,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0a,0x00,0x01,0x00,0x00,0x01, 0x00,0x02,0x03,0x0a,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x0a,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x0a, 0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x0a,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x0a,0x00,0x03,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0a,0x00, 0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x0a,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0a,0x00,0x05,0x00,0x00,0x01, 0x00,0x02,0x03,0x0a,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x0a,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x0a, 0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x0a,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x0a,0x00,0x07,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x0b,0x00,0x00,0x03, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x00,0x00,0x00,0x01,0x08, 0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x0b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x0b,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x0b,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x0b,0x00,0x01,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0b, 0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x0b,0x00,0x02,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0b,0x00,0x03,0x00,0x00, 0x01,0x00,0x02,0x03,0x0b,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0b,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03, 0x0b,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x0b,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x0b,0x00,0x05,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0b, 0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x0b,0x00,0x06,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0b,0x00,0x07,0x00,0x00, 0x01,0x00,0x02,0x03,0x0b,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x03,0x01,0x0c,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03, 0x0c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x01,0x00, 0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x02,0x00,0x00,0x01,0x00,0x02, 0x03,0x0c,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x0c,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x03, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x0c,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x04,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x05,0x00, 0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x06,0x00,0x00,0x01,0x00,0x02, 0x03,0x0c,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x0c,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x07, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x0d,0x00, 0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x94,0x00,0x00,0x00, 0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x0d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00, 0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x0d,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00,0x02,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x03, 0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x04,0x00,0x00,0x01,0x00, 0x02,0x03,0x0d,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00, 0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x0d,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00,0x06,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0d,0x00,0x07, 0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x0e,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x94,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x03,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0e,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00, 0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x0e,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00,0x02,0x00,0x00,0x01, 0x00,0x02,0x03,0x0e,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x0e, 0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x0e,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x0e,0x00,0x04,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00, 0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x0e,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00,0x06,0x00,0x00,0x01, 0x00,0x02,0x03,0x0e,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x0e,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x0e, 0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01, 0x0f,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x94,0x00, 0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x0f,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x03,0x0f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0f,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03, 0x0f,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x0f,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x0f,0x00,0x02,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0f, 0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x0f,0x00,0x03,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0f,0x00,0x04,0x00,0x00, 0x01,0x00,0x02,0x03,0x0f,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0f,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03, 0x0f,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x0f,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x0f,0x00,0x06,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x0f, 0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x0f,0x00,0x07,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x10,0x00,0x00,0x03,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x10,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x01,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x02,0x00, 0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x03,0x00,0x00,0x01,0x00,0x02, 0x03,0x10,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x10,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x04, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x10,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x05,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x06,0x00, 0x00,0x01,0x00,0x02,0x03,0x10,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x07,0x00,0x00,0x01,0x00,0x02, 0x03,0x10,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x03,0x01,0x11,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x95,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x01,0x00,0x00,0x01,0x00, 0x02,0x03,0x11,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00, 0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x11,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00,0x03,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x04, 0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x05,0x00,0x00,0x01,0x00, 0x02,0x03,0x11,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00, 0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x11,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x11,0x00,0x07,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x12,0x00,0x00,0x03,0x00, 0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x12, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x12,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x01,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00, 0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x03,0x00,0x00,0x01, 0x00,0x02,0x03,0x12,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x12, 0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x12,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x05,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00, 0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x07,0x00,0x00,0x01, 0x00,0x02,0x03,0x12,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x03,0x01,0x13,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x95,0x00,0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x13, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x13,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x13,0x00,0x01,0x00,0x00, 0x01,0x00,0x02,0x03,0x13,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x13,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03, 0x13,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x13,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x13,0x00,0x03,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x13, 0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x13,0x00,0x04,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x13,0x00,0x05,0x00,0x00, 0x01,0x00,0x02,0x03,0x13,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x13,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03, 0x13,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x13,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x13,0x00,0x07,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x14,0x00,0x00, 0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x14,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x14,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x14,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x01, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x14,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x02,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x14,0x00,0x03,0x00, 0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x14,0x00,0x04,0x00,0x00,0x01,0x00,0x02, 0x03,0x14,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x14,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x05, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x14,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x06,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x14,0x00,0x07,0x00, 0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x03,0x01,0x15,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00, 0x03,0x15,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x01, 0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x02,0x00,0x00,0x01,0x00, 0x02,0x03,0x15,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00, 0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x15,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00,0x04,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x05, 0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x06,0x00,0x00,0x01,0x00, 0x02,0x03,0x15,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x15,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00, 0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x16, 0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x16,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x03,0x16,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x16,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x16, 0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x16,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x16,0x00,0x02,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x16,0x00, 0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x16,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x16,0x00,0x04,0x00,0x00,0x01, 0x00,0x02,0x03,0x16,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x16,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x16, 0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x16,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x16,0x00,0x06,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x16,0x00, 0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x16,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x17,0x00,0x00,0x03,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x00,0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00, 0x00,0x00,0x03,0x17,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x17,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17, 0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x17,0x00,0x01,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17,0x00,0x02,0x00,0x00, 0x01,0x00,0x02,0x03,0x17,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03, 0x17,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x17,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x17,0x00,0x04,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17, 0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x17,0x00,0x05,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17,0x00,0x06,0x00,0x00, 0x01,0x00,0x02,0x03,0x17,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x17,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03, 0x17,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03, 0x01,0x18,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x18,0x00,0x01,0x00,0x00,0x01,0x00,0x02, 0x03,0x18,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x18,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x02, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x18,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x03,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x18,0x00,0x04,0x00, 0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x18,0x00,0x05,0x00,0x00,0x01,0x00,0x02, 0x03,0x18,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x18,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x06, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x18,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x07,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x19,0x00,0x00,0x03,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x08,0x22,0x01, 0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x19,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00,0x01,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x02, 0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x03,0x00,0x00,0x01,0x00, 0x02,0x03,0x19,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00, 0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x19,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00,0x05,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x06, 0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x19,0x00,0x07,0x00,0x00,0x01,0x00, 0x02,0x03,0x19,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x03,0x01,0x1a,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x97,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x1a,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1a,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1a,0x00,0x01,0x00,0x00,0x01, 0x00,0x02,0x03,0x1a,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x1a,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x1a, 0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x1a,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x1a,0x00,0x03,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1a,0x00, 0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x1a,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1a,0x00,0x05,0x00,0x00,0x01, 0x00,0x02,0x03,0x1a,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x1a,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x1a, 0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x1a,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x1a,0x00,0x07,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x1b,0x00,0x00,0x03, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x08, 0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x1b,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x1b,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x01,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b, 0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x02,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x03,0x00,0x00, 0x01,0x00,0x02,0x03,0x1b,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03, 0x1b,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x1b,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x05,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b, 0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x06,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x07,0x00,0x00, 0x01,0x00,0x02,0x03,0x1b,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x03,0x01,0x1c,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x03, 0x1c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1c,0x00,0x01,0x00, 0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1c,0x00,0x02,0x00,0x00,0x01,0x00,0x02, 0x03,0x1c,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x1c,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x03, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x1c,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x04,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1c,0x00,0x05,0x00, 0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1c,0x00,0x06,0x00,0x00,0x01,0x00,0x02, 0x03,0x1c,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x1c,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x07, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x1d,0x00, 0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x00,0x00,0x00, 0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x1d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00, 0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x1d,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00,0x02,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x03, 0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x04,0x00,0x00,0x01,0x00, 0x02,0x03,0x1d,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00, 0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x1d,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00,0x06,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1d,0x00,0x07, 0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x1e,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x03,0x1e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1e,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00, 0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x1e,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00,0x02,0x00,0x00,0x01, 0x00,0x02,0x03,0x1e,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x1e, 0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x1e,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x1e,0x00,0x04,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00, 0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x1e,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00,0x06,0x00,0x00,0x01, 0x00,0x02,0x03,0x1e,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x1e,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x1e, 0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01, 0x1f,0x00,0x00,0x03,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x00, 0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x03,0x1f,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x03,0x1f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1f,0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03, 0x1f,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x1f,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x1f,0x00,0x02,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1f, 0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x1f,0x00,0x03,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1f,0x00,0x04,0x00,0x00, 0x01,0x00,0x02,0x03,0x1f,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1f,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03, 0x1f,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x1f,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x1f,0x00,0x06,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1f, 0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x1f,0x00,0x07,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x03,0x00,0x31,0x06,0x00,0x59,0x29, 0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32, 0x54,0x76,0x10,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00, 0x7d,0x00,0x04,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x03,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x45,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x80,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x01,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00, 0x7d,0x00,0x04,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x40,0x01,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x03,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00, 0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x80,0x01,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x01, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x02,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00, 0x7d,0x00,0x04,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x40,0x02,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x03,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x55,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x56, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x80,0x02,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x02, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x03,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00, 0x7d,0x00,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x40,0x03,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x03,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x40,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x80,0x03,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0x5f,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x03, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x32,0x00,0x01,0x80,0x08,0x00,0x31,0x07,0x00,0x29,0x04,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x24,0x04,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00, 0x67,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x7b,0x00, 0x68,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x7b,0x00,0x69,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x67,0x00, 0x00,0x00,0x00,0x04,0x22,0x01,0x7b,0x00,0x6a,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x7b,0x00,0x6b,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x67,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x01,0x00, 0x04,0x00,0x67,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x67,0x00, 0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x04,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00, 0x67,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x67,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x03,0x00, 0x04,0x00,0x67,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x67,0x00,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x67,0x00, 0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xac,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x71,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xad,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xae,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x78,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xaf,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x79, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xb0,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x28,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00, 0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x7e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x7f,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xb1,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x30,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xb2,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x38,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x85, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x62,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xb3,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x63, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x06,0x00,0x00,0x87, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x01,0x00,0x00,0x32,0x00,0x06, 0x00,0x07,0x00,0x31,0x08,0x00,0x34,0x00,0x00,0x00,0x41,0x01,0x00,0x80,0x60,0x06, 0x01,0x20,0x84,0x02,0x00,0x01,0x44,0x03,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06, 0x05,0x56,0x84,0x02,0x00,0x06,0x44,0x03,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44, 0x05,0x05,0x00,0x00,0x00,0x00,0x10,0x32,0x54,0x76,0x40,0x02,0x56,0xa8,0x12,0x56, 0x11,0x03,0x41,0x02,0x03,0x00,0x50,0x85,0x05,0x55,0x05,0x05,0x46,0x05,0x04,0x00, 0x04,0x00,0x41,0x02,0x20,0x22,0x1e,0x56,0x11,0x02,0x49,0x00,0x56,0xa8,0x1a,0x56, 0x11,0x02,0x41,0x00,0x00,0x80,0x60,0x06,0x01,0x20,0xa4,0x02,0x00,0x01,0x64,0x02, 0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x32,0xa4,0x02,0x00,0x06,0x64,0x02, 0x00,0x00,0x40,0x03,0x56,0xa8,0x02,0x56,0x11,0x03,0x41,0x02,0x20,0x22,0x16,0x32, 0x11,0x02,0x49,0x00,0x31,0xa8,0x12,0x32,0x11,0x02,0x40,0x07,0x03,0x00,0x50,0x85, 0x85,0x55,0x05,0x55,0x46,0x05,0x20,0x00,0x20,0x00,0x41,0x02,0x20,0x22,0x06,0x31, 0x11,0x02,0x49,0x00,0x31,0xa8,0x02,0x31,0x11,0x02,0x41,0x01,0x20,0x22,0x2e,0x31, 0x11,0x02,0x49,0x00,0x31,0xa8,0x2a,0x31,0x11,0x02,0x41,0x01,0x20,0x22,0x0e,0x31, 0x11,0x02,0x49,0x00,0x31,0xa8,0x0a,0x31,0x11,0x02,0x41,0x00,0x00,0x80,0x60,0x06, 0x01,0x20,0xe4,0x00,0x00,0x01,0x24,0x02,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06, 0x05,0x04,0xe4,0x00,0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x01,0x04,0xa8,0x4a,0x04, 0x11,0x00,0x41,0x01,0x20,0x22,0x06,0x04,0x11,0x02,0x49,0x00,0x04,0xa8,0x02,0x04, 0x11,0x02,0x41,0x00,0x20,0x22,0x0e,0x32,0x11,0x02,0x40,0x02,0x04,0xa8,0x12,0x04, 0x11,0x00,0x49,0x00,0x57,0xa8,0x0a,0x32,0x11,0x02,0x69,0x00,0x32,0x68,0x02,0x32, 0x61,0x00,0x41,0x02,0x20,0x22,0x06,0x57,0x11,0x04,0x49,0x00,0x57,0xa8,0x02,0x57, 0x11,0x04,0x41,0x03,0x20,0x22,0x0e,0x32,0x11,0x02,0x40,0x02,0x57,0xa8,0x02,0x56, 0x11,0x57,0x69,0x00,0x56,0x68,0x02,0x56,0x61,0x00,0x49,0x00,0x32,0xa8,0x0a,0x32, 0x11,0x02,0x70,0x02,0x00,0x00,0x20,0x82,0x01,0x00,0x04,0x56,0x00,0x51,0x00,0x01, 0x00,0x01,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x55,0x04,0x56,0x00,0x05,0x05,0x55, 0x58,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x61,0x02,0x04,0x00,0x90,0x09,0x05,0x33,0x05,0x55,0x58,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x01,0x68,0xa0,0x56,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x02,0x04,0x00,0x60,0x81,0x05,0x04,0x05,0x33,0x58,0x05,0x02,0x00, 0x02,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xc5,0x01,0xc4,0x01,0x00,0x06,0x04,0x32, 0x00,0x00,0x61,0x00,0x06,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x08,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x0a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0c,0xa0,0x00,0x00, 0x01,0x00,0x70,0x05,0x80,0x00,0x20,0x82,0x01,0x00,0xc4,0x01,0x00,0x51,0x00,0x01, 0x00,0x01,0x31,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x04,0xfc,0xc1,0x44,0x06, 0x94,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x33,0x58,0x05,0x04,0x32, 0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xff, 0xff,0xff,0x61,0x00,0x34,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x36,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x38,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3a,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x3c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3e,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x40,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x42,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x44,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x46,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x48,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4a,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x4c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4e,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x50,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x52,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x57,0xa8,0x60,0x00,0x01,0x00,0x70,0x00,0x80,0x00,0x20,0x02, 0x01,0x00,0x04,0x57,0x00,0x52,0x44,0x01,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x57,0xa8,0x2a,0x57, 0x31,0x01,0x40,0x04,0x57,0x68,0xca,0x57,0x11,0x00,0x70,0x02,0x80,0x00,0x20,0x02, 0x01,0x00,0x04,0x57,0x00,0x52,0x44,0x01,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x70,0x03,0x80,0x00,0x20,0x02, 0x01,0x00,0x24,0x57,0x00,0x52,0x64,0x01,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x13,0x00,0x00,0x40,0x00,0x01,0x00,0x60,0x06, 0x85,0x03,0x05,0x57,0x22,0x06,0x85,0x01,0x22,0x00,0x61,0x30,0x04,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00, 0x89,0x02,0x69,0x03,0x04,0x68,0x5a,0x03,0x51,0x00,0x69,0x00,0x00,0x00,0x60,0x86, 0x25,0x04,0xa4,0x03,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x04,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x31,0x91,0x03,0x80,0x00,0x00, 0x05,0x05,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x21,0x05,0x00,0x50,0x80, 0x05,0x0d,0x05,0x05,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x0d,0x46,0x01,0x80,0x06,0x80,0x06,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x0f,0x05,0x06,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x11,0x05,0x07,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x13,0x05,0x08,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x15,0x05,0x09,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x17,0x05,0x0a,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x19,0x05,0x0b,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05,0x00,0x50,0x80, 0x05,0x1b,0x05,0x0c,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x0d,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x0e,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x0e,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x0f,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x0f,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x10,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x10,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x11,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x11,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x12,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x12,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x13,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x13,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x14,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x14,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x15,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x15,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x16,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x16,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x17,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x17,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x18,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x18,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x19,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x19,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x1a,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x1a,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x1b,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x1b,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x05,0x1c,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03,0x00,0x10,0x81, 0x01,0x10,0x85,0x1c,0x46,0x01,0x80,0x06,0x80,0x06,0x40,0x02,0x00,0x00,0x68,0x86, 0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x68,0x86, 0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x57,0xa8,0x02,0x57, 0x11,0x31,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xec, 0xff,0xff,0x65,0x30,0x03,0x80,0x20,0x82,0x05,0x04,0x44,0x00,0x00,0x02,0x00,0x00, 0x00,0x7f,0x31,0x92,0x00,0x80,0x00,0x00,0x00,0x00,0x0c,0x04,0x08,0x30,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x05,0x05,0x00,0x00,0x00,0x00,0x10,0x32, 0x54,0x76,0x65,0x00,0x03,0x80,0x20,0x82,0x05,0x27,0x44,0x00,0x00,0x02,0x00,0x00, 0x00,0x7f,0x61,0x02,0x03,0x00,0x60,0x05,0x05,0x54,0x05,0x05,0x46,0x00,0x00,0x00, 0x00,0x00,0x41,0x01,0x20,0x61,0x04,0x54,0x40,0x00,0x61,0x00,0x03,0x00,0x60,0x06, 0x05,0x07,0x01,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x09,0x01,0x20,0x46,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0a,0x01,0x20,0x46,0x05,0x60,0x00,0x60,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0b,0x01,0x20,0x46,0x05,0x80,0x00,0x80,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0c,0x01,0x20,0x46,0x05,0xa0,0x00,0xa0,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0d,0x01,0x20,0x46,0x05,0xc0,0x00,0xc0,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0e,0x01,0x20,0x46,0x05,0xe0,0x00,0xe0,0x00,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x0f,0x01,0x20,0x46,0x05,0x00,0x01,0x00,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x10,0x01,0x20,0x46,0x05,0x20,0x01,0x20,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x11,0x01,0x20,0x46,0x05,0x40,0x01,0x40,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x12,0x01,0x20,0x46,0x05,0x60,0x01,0x60,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x13,0x01,0x20,0x46,0x05,0x80,0x01,0x80,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x14,0x01,0x20,0x46,0x05,0xa0,0x01,0xa0,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x15,0x01,0x20,0x46,0x05,0xc0,0x01,0xc0,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x16,0x01,0x20,0x46,0x05,0xe0,0x01,0xe0,0x01,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x17,0x01,0x20,0x46,0x05,0x00,0x02,0x00,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x18,0x01,0x20,0x46,0x05,0x20,0x02,0x20,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x19,0x01,0x20,0x46,0x05,0x40,0x02,0x40,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1a,0x01,0x20,0x46,0x05,0x60,0x02,0x60,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1b,0x01,0x20,0x46,0x05,0x80,0x02,0x80,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1c,0x01,0x20,0x46,0x05,0xa0,0x02,0xa0,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1d,0x01,0x20,0x46,0x05,0xc0,0x02,0xc0,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1e,0x01,0x20,0x46,0x05,0xe0,0x02,0xe0,0x02,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x1f,0x01,0x20,0x46,0x05,0x00,0x03,0x00,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x20,0x01,0x20,0x46,0x05,0x20,0x03,0x20,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x21,0x01,0x20,0x46,0x05,0x40,0x03,0x40,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x22,0x01,0x20,0x46,0x05,0x60,0x03,0x60,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x23,0x01,0x20,0x46,0x05,0x80,0x03,0x80,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x24,0x01,0x20,0x46,0x05,0xa0,0x03,0xa0,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x25,0x01,0x20,0x46,0x05,0xc0,0x03,0xc0,0x03,0x40,0x00,0x03,0x00,0x60,0x86, 0x05,0x26,0x01,0x20,0x46,0x05,0xe0,0x03,0xe0,0x03,0x40,0x00,0x08,0x61,0x02,0x07, 0x00,0x02,0x31,0x93,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x07,0xfc,0xcf,0x14,0x34, 0x20,0x00,0x31,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x09,0xfc,0xcf,0x14,0x36, 0x20,0x00,0x31,0x45,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0b,0xfc,0xcf,0x14,0x38, 0x20,0x00,0x31,0x46,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0d,0xfc,0xcf,0x14,0x3a, 0x20,0x00,0x31,0x47,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0f,0xfc,0xcf,0x14,0x3c, 0x20,0x00,0x31,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x11,0xfc,0xcf,0x14,0x3e, 0x20,0x00,0x31,0x49,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x13,0xfc,0xcf,0x14,0x40, 0x20,0x00,0x31,0x4a,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x15,0xfc,0xcf,0x14,0x42, 0x20,0x00,0x31,0x4b,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x17,0xfc,0xcf,0x14,0x44, 0x20,0x00,0x31,0x4c,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x19,0xfc,0xcf,0x14,0x46, 0x20,0x00,0x31,0x4d,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x1b,0xfc,0xcf,0x14,0x48, 0x20,0x00,0x31,0xfe,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x1d,0xfc,0xcf,0x14,0x4a, 0x20,0x00,0x31,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x1f,0xfc,0xcf,0x14,0x4c, 0x20,0x00,0x31,0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x21,0xfc,0xcf,0x14,0x4e, 0x20,0x00,0x31,0xc1,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x23,0xfc,0xcf,0x14,0x50, 0x20,0x00,0x31,0xa2,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x25,0xfc,0xcf,0x14,0x52, 0x20,0x00,0x31,0x43,0x00,0x80,0x00,0x00,0x00,0x00,0x0c,0x27,0x08,0x30,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03, 0x00,0x00,0x69,0x00,0x04,0x00,0x60,0x81,0x05,0x04,0x05,0x55,0x58,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x03,0x00,0x60,0x06,0x01,0x20,0x04,0x56,0x00,0x06,0x05,0x54, 0x46,0x00,0x31,0xa7,0x04,0x00,0x00,0x00,0x44,0x06,0x14,0x04,0xfc,0xc1,0x00,0x00, 0x14,0x00,0x40,0x3b,0x18,0x68,0x02,0x56,0x81,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x40,0x3d,0x1c,0x68,0x02,0x56, 0x01,0x01,0x69,0x3b,0x03,0x00,0x60,0x86,0x05,0x17,0x01,0x20,0x46,0x05,0x02,0x00, 0x02,0x00,0x40,0x04,0x03,0x00,0x60,0x06,0x01,0x20,0x04,0x18,0x00,0x06,0x05,0x54, 0x46,0x00,0x40,0x3f,0x1f,0x68,0x02,0x56,0x81,0x01,0x01,0x27,0x00,0xe8,0x01,0x00, 0x11,0x00,0x01,0x34,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x36,0x02,0x00,0xa0,0x0a, 0x07,0x0e,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x27,0x0e,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x47,0x0e,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x67,0x0e,0x05,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x3e,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x07,0x1d,0xa1,0x02,0x1c,0x01,0x54,0x31,0xab,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x17,0x00,0xc0,0x0c,0x0e,0x00,0x00,0x69,0x3c,0x03,0x00,0x60,0x86, 0x05,0x1a,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x40,0x31,0x23,0x68,0x02,0x56, 0x01,0x02,0x31,0xb4,0x03,0x00,0x00,0x00,0x05,0x1b,0x04,0x1a,0x00,0xc0,0x0c,0x0f, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x61,0x38,0x02,0x00,0xa0,0x0a,0x07,0x10,0x85,0x06,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x20,0xa1,0x02,0x1f,0x01,0x54,0x69,0x06,0x1e,0x61,0x02,0x1d, 0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97, 0x00,0x02,0x61,0x00,0x02,0x00,0xa0,0x0a,0x27,0x10,0x85,0x08,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x47,0x10,0x85,0x0a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x67,0x10,0x85,0x0c,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x32,0x26,0x68,0x02,0x56,0x81,0x02,0x31,0xa5,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x1e,0x00,0xc0,0x0c,0x10,0x00,0x00,0x40,0x07,0x03,0x00,0x60,0x06, 0x01,0x20,0x04,0x23,0x00,0x06,0x05,0x54,0x46,0x00,0x01,0x30,0x00,0xe8,0x01,0x00, 0x11,0x00,0x69,0x07,0x21,0x61,0x02,0x20,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x40,0x00,0x2a,0x68,0x02,0x56, 0x01,0x03,0x31,0xb6,0x03,0x00,0x00,0x00,0x05,0x22,0x04,0x21,0x00,0xc0,0x0c,0x11, 0x00,0x00,0x01,0x38,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x39,0x02,0x00,0xa0,0x0a, 0x07,0x12,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00, 0x11,0x00,0x40,0x06,0x27,0xa1,0x02,0x26,0x01,0x54,0x69,0x00,0x03,0x00,0x60,0x86, 0x05,0x25,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x27,0x12,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x47,0x12,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x67,0x12,0x05,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x2d,0x68,0x02,0x56, 0x81,0x03,0x31,0xa7,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x25,0x00,0xc0,0x0c,0x12, 0x00,0x00,0x40,0x07,0x03,0x00,0x60,0x06,0x01,0x20,0x04,0x2a,0x00,0x06,0x05,0x54, 0x46,0x00,0x69,0x07,0x28,0x61,0x02,0x27,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x01,0x39,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x3a,0x02,0x00,0xa0,0x0a,0x07,0x14,0x85,0x07,0x34,0x00,0x00,0x00, 0x00,0x00,0x31,0xb8,0x03,0x00,0x00,0x00,0x05,0x29,0x04,0x28,0x00,0xc0,0x0c,0x13, 0x00,0x00,0x40,0x05,0x2e,0xa1,0x02,0x2d,0x01,0x54,0x69,0x00,0x03,0x00,0x60,0x86, 0x05,0x2c,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x27,0x14,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x47,0x14,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x67,0x14,0x85,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x69,0x06,0x2f,0x61,0x02,0x2e, 0x20,0x00,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x2c,0x00,0xc0,0x0c,0x14, 0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7, 0x10,0x02,0x40,0x00,0x56,0xa8,0x02,0x56,0x11,0x32,0x31,0xba,0x03,0x00,0x00,0x00, 0x05,0x30,0x04,0x2f,0x00,0xc0,0x0c,0x15,0x00,0x00,0x70,0x01,0x00,0x00,0x20,0x82, 0x01,0x00,0x04,0x56,0x00,0x51,0x00,0x01,0x00,0x01,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x55,0x05,0x55,0x58,0x05,0x04,0x32,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xfc,0xff,0xff,0x61,0x00,0x7f,0x64,0x00,0x00, 0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00, 0x00,0x00,0x92,0x01,0x00,0x00,0x48,0x69,0x73,0x74,0x6f,0x67,0x72,0x61,0x6d,0x53, 0x4c,0x4d,0x46,0x69,0x65,0x6c,0x64,0x73,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25, 0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25, 0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00, 0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70, 0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30, 0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30, 0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32, 0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53, 0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56, 0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36, 0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30, 0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56, 0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34, 0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30, 0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56, 0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32, 0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30, 0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56, 0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30, 0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30, 0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56, 0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38, 0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30, 0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56, 0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36, 0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30, 0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56, 0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34, 0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30, 0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56, 0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32, 0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30, 0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56, 0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30, 0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31, 0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56, 0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38, 0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31, 0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56, 0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36, 0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31, 0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56, 0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34, 0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31, 0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56, 0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32, 0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31, 0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56, 0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30, 0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31, 0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56, 0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38, 0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31, 0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56, 0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36, 0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31, 0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56, 0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34, 0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31, 0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56, 0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32, 0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31, 0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56, 0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30, 0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31, 0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56, 0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38, 0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31, 0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56, 0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36, 0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31, 0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x56, 0x30,0x32,0x30,0x32,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x56,0x30,0x32,0x30,0x34, 0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x56,0x30,0x32, 0x30,0x37,0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x56, 0x30,0x32,0x31,0x30,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x56,0x30,0x32,0x31,0x32, 0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x56,0x30,0x32, 0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56, 0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30, 0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32, 0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56, 0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38, 0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32, 0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56, 0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36, 0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32, 0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56, 0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34,0x33,0x00,0x41,0x30,0x30,0x00,0x41, 0x30,0x31,0x00,0x41,0x30,0x32,0x00,0x41,0x30,0x33,0x00,0x41,0x30,0x34,0x00,0x41, 0x30,0x35,0x00,0x41,0x30,0x36,0x00,0x41,0x30,0x37,0x00,0x41,0x30,0x38,0x00,0x41, 0x30,0x39,0x00,0x41,0x31,0x30,0x00,0x41,0x31,0x31,0x00,0x41,0x31,0x32,0x00,0x41, 0x31,0x33,0x00,0x41,0x31,0x34,0x00,0x41,0x31,0x35,0x00,0x41,0x31,0x36,0x00,0x41, 0x31,0x37,0x00,0x41,0x31,0x38,0x00,0x41,0x31,0x39,0x00,0x41,0x32,0x30,0x00,0x41, 0x32,0x31,0x00,0x41,0x32,0x32,0x00,0x41,0x32,0x33,0x00,0x41,0x32,0x34,0x00,0x41, 0x32,0x35,0x00,0x41,0x32,0x36,0x00,0x41,0x32,0x37,0x00,0x41,0x32,0x38,0x00,0x41, 0x32,0x39,0x00,0x41,0x33,0x30,0x00,0x41,0x33,0x31,0x00,0x41,0x33,0x32,0x00,0x41, 0x33,0x33,0x00,0x41,0x33,0x34,0x00,0x41,0x33,0x35,0x00,0x41,0x33,0x36,0x00,0x41, 0x33,0x37,0x00,0x41,0x33,0x38,0x00,0x41,0x33,0x39,0x00,0x41,0x34,0x30,0x00,0x41, 0x34,0x31,0x00,0x41,0x34,0x32,0x00,0x41,0x34,0x33,0x00,0x41,0x34,0x34,0x00,0x41, 0x34,0x35,0x00,0x41,0x34,0x36,0x00,0x41,0x34,0x37,0x00,0x41,0x34,0x38,0x00,0x41, 0x34,0x39,0x00,0x41,0x35,0x30,0x00,0x41,0x35,0x31,0x00,0x41,0x35,0x32,0x00,0x41, 0x35,0x33,0x00,0x41,0x35,0x34,0x00,0x41,0x35,0x35,0x00,0x41,0x35,0x36,0x00,0x41, 0x35,0x37,0x00,0x41,0x35,0x38,0x00,0x41,0x35,0x39,0x00,0x41,0x36,0x30,0x00,0x41, 0x36,0x31,0x00,0x41,0x36,0x32,0x00,0x41,0x36,0x33,0x00,0x41,0x36,0x34,0x00,0x41, 0x36,0x35,0x00,0x41,0x36,0x36,0x00,0x41,0x36,0x37,0x00,0x41,0x36,0x38,0x00,0x41, 0x36,0x39,0x00,0x41,0x37,0x30,0x00,0x41,0x37,0x31,0x00,0x41,0x37,0x32,0x00,0x41, 0x37,0x33,0x00,0x41,0x37,0x34,0x00,0x41,0x37,0x35,0x00,0x41,0x37,0x36,0x00,0x41, 0x37,0x37,0x00,0x41,0x37,0x38,0x00,0x41,0x37,0x39,0x00,0x41,0x38,0x30,0x00,0x41, 0x38,0x31,0x00,0x41,0x38,0x32,0x00,0x41,0x38,0x33,0x00,0x41,0x38,0x34,0x00,0x41, 0x38,0x35,0x00,0x41,0x38,0x36,0x00,0x41,0x38,0x37,0x00,0x41,0x38,0x38,0x00,0x41, 0x38,0x39,0x00,0x41,0x39,0x30,0x00,0x41,0x39,0x31,0x00,0x41,0x39,0x32,0x00,0x41, 0x39,0x33,0x00,0x41,0x39,0x34,0x00,0x41,0x39,0x35,0x00,0x41,0x39,0x36,0x00,0x41, 0x39,0x37,0x00,0x41,0x39,0x38,0x00,0x41,0x39,0x39,0x00,0x41,0x31,0x30,0x30,0x00, 0x41,0x31,0x30,0x31,0x00,0x41,0x31,0x30,0x32,0x00,0x41,0x31,0x30,0x33,0x00,0x41, 0x31,0x30,0x34,0x00,0x41,0x31,0x30,0x35,0x00,0x41,0x31,0x30,0x36,0x00,0x41,0x31, 0x30,0x37,0x00,0x41,0x31,0x30,0x38,0x00,0x41,0x31,0x30,0x39,0x00,0x41,0x31,0x31, 0x30,0x00,0x41,0x31,0x31,0x31,0x00,0x41,0x31,0x31,0x32,0x00,0x41,0x31,0x31,0x33, 0x00,0x41,0x31,0x31,0x34,0x00,0x41,0x31,0x31,0x35,0x00,0x41,0x31,0x31,0x36,0x00, 0x41,0x31,0x31,0x37,0x00,0x41,0x31,0x31,0x38,0x00,0x41,0x31,0x31,0x39,0x00,0x41, 0x31,0x32,0x30,0x00,0x41,0x31,0x32,0x31,0x00,0x41,0x31,0x32,0x32,0x00,0x41,0x31, 0x32,0x33,0x00,0x41,0x31,0x32,0x34,0x00,0x41,0x31,0x32,0x35,0x00,0x41,0x31,0x32, 0x36,0x00,0x41,0x31,0x32,0x37,0x00,0x41,0x31,0x32,0x38,0x00,0x41,0x31,0x32,0x39, 0x00,0x41,0x31,0x33,0x30,0x00,0x41,0x31,0x33,0x31,0x00,0x41,0x31,0x33,0x32,0x00, 0x41,0x31,0x33,0x33,0x00,0x41,0x31,0x33,0x34,0x00,0x41,0x31,0x33,0x35,0x00,0x41, 0x31,0x33,0x36,0x00,0x41,0x31,0x33,0x37,0x00,0x41,0x31,0x33,0x38,0x00,0x41,0x31, 0x33,0x39,0x00,0x41,0x31,0x34,0x30,0x00,0x41,0x31,0x34,0x31,0x00,0x41,0x31,0x34, 0x32,0x00,0x41,0x31,0x34,0x33,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50, 0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x48, 0x69,0x73,0x74,0x6f,0x67,0x72,0x61,0x6d,0x53,0x4c,0x4d,0x46,0x69,0x65,0x6c,0x64, 0x73,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x32,0x00,0x42,0x42,0x5f,0x31,0x5f,0x33,0x00, 0x42,0x42,0x5f,0x32,0x5f,0x34,0x00,0x42,0x42,0x5f,0x33,0x5f,0x35,0x00,0x42,0x42, 0x5f,0x34,0x5f,0x36,0x00,0x42,0x42,0x5f,0x35,0x5f,0x37,0x00,0x42,0x42,0x5f,0x36, 0x5f,0x38,0x00,0x42,0x42,0x5f,0x37,0x5f,0x39,0x00,0x42,0x42,0x5f,0x38,0x5f,0x31, 0x30,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x53,0x4c,0x4d,0x53, 0x69,0x7a,0x65,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67, 0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x52,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x51,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x44,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x55,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x64,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x74,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x84,0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x85,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x50, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x50,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x50,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x50,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x94,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x95,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x50, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa4,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00, 0x00,0x23,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00, 0x20,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x50, 0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x53,0x10, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x23,0x02,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x20,0x01,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x20,0x01,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x20,0x01,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x20,0x01,0x00,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x20,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb3,0x00,0x00,0x00,0x52,0x20,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb4,0x00,0x00,0x00,0x52,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb5,0x00,0x00,0x00,0x52,0x20,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6, 0x00,0x00,0x00,0x52,0x10,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0x52,0x20,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00, 0x00,0x52,0x10,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00, 0x52,0x20,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x52, 0x10,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x52,0x20, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x52,0x10,0x00, 0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x52,0x20,0x00,0x3e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x52,0x10,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x52,0x20,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x52,0x10,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x52,0x20,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x52,0x10,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0x50,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc4,0x00,0x00,0x00,0x50,0x00,0x02,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc5,0x00,0x00,0x00,0x50,0x10,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6, 0x00,0x00,0x00,0x50,0x10,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00, 0x00,0x00,0x50,0x10,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00, 0x00,0x50,0x10,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x50,0x10,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x50, 0x10,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x50,0x10, 0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x50,0x10,0x00, 0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x50,0x10,0x00,0x5d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x50,0x10,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x50,0x10,0x00,0x61,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x50,0x10,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x50,0x10,0x00,0x65,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x50,0x10,0x00,0x67,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0x50,0x10,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x50,0x10,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd5,0x00,0x00,0x00,0x50,0x10,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6, 0x00,0x00,0x00,0x50,0x10,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0x50,0x10,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00, 0x00,0x50,0x10,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00, 0x50,0x10,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x50, 0x10,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x50,0x10, 0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x50,0x10,0x00, 0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x50,0x10,0x00,0x7d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x50,0x10,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x50,0x10,0x00,0x81,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x50,0x10,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x50,0x10,0x00,0x85,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x50,0x10,0x00,0x87,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe3,0x00,0x00,0x00,0x50,0x10,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe4,0x00,0x00,0x00,0x52,0x10,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe5,0x00,0x00,0x00,0x50,0x10,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6, 0x00,0x00,0x00,0x50,0x08,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0x50,0x08,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00, 0x00,0x50,0x08,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00, 0x50,0x08,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x50, 0x08,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x50,0x08, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x50,0x08,0x00, 0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x50,0x08,0x00,0xad, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0xee,0x00,0x00,0x00,0x08,0x00,0x00, 0xef,0x00,0x00,0x00,0x01,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x00,0xf1,0x00, 0x00,0x00,0x01,0x00,0x00,0xf2,0x00,0x00,0x00,0x01,0x00,0x00,0xf3,0x00,0x00,0x00, 0x01,0x00,0x00,0xf4,0x00,0x00,0x00,0x01,0x00,0x00,0xf5,0x00,0x00,0x00,0x01,0x00, 0x00,0xf6,0x00,0x00,0x00,0x01,0x00,0x00,0xf7,0x00,0x00,0x00,0x08,0x00,0x00,0xf8, 0x00,0x00,0x00,0x01,0x00,0x00,0xf9,0x00,0x00,0x00,0x01,0x00,0x00,0xfa,0x00,0x00, 0x00,0x01,0x00,0x00,0xfb,0x00,0x00,0x00,0x01,0x00,0x00,0xfc,0x00,0x00,0x00,0x01, 0x00,0x00,0xfd,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0x01,0x00,0x00, 0xff,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x00,0x01,0x01, 0x00,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x00, 0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x00,0x01,0x00, 0x00,0x06,0x01,0x00,0x00,0x01,0x00,0x00,0x07,0x01,0x00,0x00,0x01,0x00,0x00,0x08, 0x01,0x00,0x00,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x08,0x00,0x00,0x0a,0x01,0x00, 0x00,0x01,0x00,0x00,0x0b,0x01,0x00,0x00,0x01,0x00,0x00,0x0c,0x01,0x00,0x00,0x01, 0x00,0x00,0x0d,0x01,0x00,0x00,0x01,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x00,0x00, 0x0f,0x01,0x00,0x00,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x01,0x00,0x00,0x11,0x01, 0x00,0x00,0x01,0x00,0x00,0x12,0x01,0x00,0x00,0x08,0x00,0x00,0x13,0x01,0x00,0x00, 0x01,0x00,0x00,0x14,0x01,0x00,0x00,0x01,0x00,0x00,0x15,0x01,0x00,0x00,0x01,0x00, 0x00,0x16,0x01,0x00,0x00,0x01,0x00,0x00,0x17,0x01,0x00,0x00,0x01,0x00,0x00,0x18, 0x01,0x00,0x00,0x01,0x00,0x00,0x19,0x01,0x00,0x00,0x01,0x00,0x00,0x1a,0x01,0x00, 0x00,0x01,0x00,0x00,0x1b,0x01,0x00,0x00,0x08,0x00,0x00,0x1c,0x01,0x00,0x00,0x01, 0x00,0x00,0x1d,0x01,0x00,0x00,0x01,0x00,0x00,0x1e,0x01,0x00,0x00,0x01,0x00,0x00, 0x1f,0x01,0x00,0x00,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x01,0x00,0x00,0x22,0x01,0x00,0x00,0x01,0x00,0x00,0x23,0x01,0x00,0x00, 0x01,0x00,0x00,0x24,0x01,0x00,0x00,0x08,0x00,0x00,0x25,0x01,0x00,0x00,0x01,0x00, 0x00,0x26,0x01,0x00,0x00,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x01,0x00,0x00,0x28, 0x01,0x00,0x00,0x01,0x00,0x00,0x29,0x01,0x00,0x00,0x01,0x00,0x00,0x2a,0x01,0x00, 0x00,0x01,0x00,0x00,0x2b,0x01,0x00,0x00,0x01,0x00,0x00,0x2c,0x01,0x00,0x00,0x01, 0x00,0x00,0x2d,0x01,0x00,0x00,0x08,0x00,0x00,0x2e,0x01,0x00,0x00,0x01,0x00,0x00, 0x2f,0x01,0x00,0x00,0x01,0x00,0x00,0x30,0x01,0x00,0x00,0x01,0x00,0x00,0x31,0x01, 0x00,0x00,0x01,0x00,0x00,0x32,0x01,0x00,0x00,0x01,0x00,0x00,0x33,0x01,0x00,0x00, 0x01,0x00,0x00,0x34,0x01,0x00,0x00,0x01,0x00,0x00,0x35,0x01,0x00,0x00,0x01,0x00, 0x00,0x36,0x01,0x00,0x00,0x08,0x00,0x00,0x37,0x01,0x00,0x00,0x01,0x00,0x00,0x38, 0x01,0x00,0x00,0x01,0x00,0x00,0x39,0x01,0x00,0x00,0x01,0x00,0x00,0x3a,0x01,0x00, 0x00,0x01,0x00,0x00,0x3b,0x01,0x00,0x00,0x01,0x00,0x00,0x3c,0x01,0x00,0x00,0x01, 0x00,0x00,0x3d,0x01,0x00,0x00,0x01,0x00,0x00,0x3e,0x01,0x00,0x00,0x01,0x00,0x00, 0x3f,0x01,0x00,0x00,0x08,0x00,0x00,0x40,0x01,0x00,0x00,0x01,0x00,0x00,0x41,0x01, 0x00,0x00,0x01,0x00,0x00,0x42,0x01,0x00,0x00,0x01,0x00,0x00,0x43,0x01,0x00,0x00, 0x01,0x00,0x00,0x44,0x01,0x00,0x00,0x01,0x00,0x00,0x45,0x01,0x00,0x00,0x01,0x00, 0x00,0x46,0x01,0x00,0x00,0x01,0x00,0x00,0x47,0x01,0x00,0x00,0x01,0x00,0x00,0x48, 0x01,0x00,0x00,0x08,0x00,0x00,0x49,0x01,0x00,0x00,0x01,0x00,0x00,0x4a,0x01,0x00, 0x00,0x01,0x00,0x00,0x4b,0x01,0x00,0x00,0x01,0x00,0x00,0x4c,0x01,0x00,0x00,0x01, 0x00,0x00,0x4d,0x01,0x00,0x00,0x01,0x00,0x00,0x4e,0x01,0x00,0x00,0x01,0x00,0x00, 0x4f,0x01,0x00,0x00,0x01,0x00,0x00,0x50,0x01,0x00,0x00,0x01,0x00,0x00,0x51,0x01, 0x00,0x00,0x08,0x00,0x00,0x52,0x01,0x00,0x00,0x01,0x00,0x00,0x53,0x01,0x00,0x00, 0x01,0x00,0x00,0x54,0x01,0x00,0x00,0x01,0x00,0x00,0x55,0x01,0x00,0x00,0x01,0x00, 0x00,0x56,0x01,0x00,0x00,0x01,0x00,0x00,0x57,0x01,0x00,0x00,0x01,0x00,0x00,0x58, 0x01,0x00,0x00,0x01,0x00,0x00,0x59,0x01,0x00,0x00,0x01,0x00,0x00,0x5a,0x01,0x00, 0x00,0x08,0x00,0x00,0x5b,0x01,0x00,0x00,0x01,0x00,0x00,0x5c,0x01,0x00,0x00,0x01, 0x00,0x00,0x5d,0x01,0x00,0x00,0x01,0x00,0x00,0x5e,0x01,0x00,0x00,0x01,0x00,0x00, 0x5f,0x01,0x00,0x00,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x01,0x00,0x00,0x61,0x01, 0x00,0x00,0x01,0x00,0x00,0x62,0x01,0x00,0x00,0x01,0x00,0x00,0x63,0x01,0x00,0x00, 0x08,0x00,0x00,0x64,0x01,0x00,0x00,0x01,0x00,0x00,0x65,0x01,0x00,0x00,0x01,0x00, 0x00,0x66,0x01,0x00,0x00,0x01,0x00,0x00,0x67,0x01,0x00,0x00,0x01,0x00,0x00,0x68, 0x01,0x00,0x00,0x01,0x00,0x00,0x69,0x01,0x00,0x00,0x01,0x00,0x00,0x6a,0x01,0x00, 0x00,0x01,0x00,0x00,0x6b,0x01,0x00,0x00,0x01,0x00,0x00,0x6c,0x01,0x00,0x00,0x08, 0x00,0x00,0x6d,0x01,0x00,0x00,0x01,0x00,0x00,0x6e,0x01,0x00,0x00,0x01,0x00,0x00, 0x6f,0x01,0x00,0x00,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x01,0x00,0x00,0x71,0x01, 0x00,0x00,0x01,0x00,0x00,0x72,0x01,0x00,0x00,0x01,0x00,0x00,0x73,0x01,0x00,0x00, 0x01,0x00,0x00,0x74,0x01,0x00,0x00,0x01,0x00,0x00,0x75,0x01,0x00,0x00,0x08,0x00, 0x00,0x76,0x01,0x00,0x00,0x01,0x00,0x00,0x77,0x01,0x00,0x00,0x01,0x00,0x00,0x78, 0x01,0x00,0x00,0x01,0x00,0x00,0x79,0x01,0x00,0x00,0x01,0x00,0x00,0x7a,0x01,0x00, 0x00,0x01,0x00,0x00,0x7b,0x01,0x00,0x00,0x01,0x00,0x00,0x7c,0x01,0x00,0x00,0x01, 0x00,0x00,0x7d,0x01,0x00,0x00,0x01,0x00,0x00,0x06,0x00,0x7e,0x01,0x00,0x00,0x01, 0x00,0x00,0x7f,0x01,0x00,0x00,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x00,0x00, 0x81,0x01,0x00,0x00,0x01,0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x00,0x00,0x83,0x01, 0x00,0x00,0x01,0x00,0x00,0x09,0x00,0x84,0x01,0x00,0x00,0x01,0x00,0x85,0x01,0x00, 0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00, 0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x8d, 0x01,0x00,0x00,0x01,0x00,0x00,0x8e,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00, 0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x21,0x00, 0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00, 0x23,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x10,0x24,0x00,0x00,0x00,0x40,0x00,0x0c, 0x00,0x18,0x25,0x00,0x00,0x00,0x60,0x00,0x0c,0x00,0x08,0x26,0x00,0x00,0x00,0x4c, 0x00,0x0c,0x00,0x03,0x48,0x00,0x00,0x00,0x1a,0x00,0x00,0x03,0x00,0x8f,0x01,0x00, 0x00,0x01,0x04,0x90,0x01,0x00,0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x68,0x69,0x73, 0x74,0x6f,0x67,0x72,0x61,0x6d,0x5f,0x31,0x2e,0x61,0x73,0x6d,0x91,0x01,0x00,0x00, 0x01,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x25,0x00,0x00,0x00, 0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x03, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x54, 0x76,0x10,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x04,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x20,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00, 0x04,0x02,0x01,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00, 0x02,0x00,0x00,0x32,0x00,0x01,0x80,0x02,0x00,0x29,0x04,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x31,0x01,0x00,0x29,0x04,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x04, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x06,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x02,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00, 0x02,0x00,0x00,0x32,0x00,0x02,0x00,0x01,0x00,0x31,0x02,0x00,0x29,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x04,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x06,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x0a,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x0e,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x10,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x12,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x14,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x16,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x18,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x1a, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x1c,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x1e,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x22,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x24,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x26,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x28,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x2a,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x2e,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x30,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x32,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x34,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x36,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x38,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x3a, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x3c,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x3e,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x31, 0x03,0x00,0x2c,0x00,0x04,0x02,0x03,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x03,0x00,0x05,0x00, 0x31,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0xb5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00, 0x04,0x02,0x04,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x04,0x80,0x04,0x00,0x31,0x05,0x00,0x2c, 0x00,0x04,0x02,0x05,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x05,0x80,0x06,0x00,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0xb7,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x38,0x00,0x00,0x00,0x00, 0x00,0x29,0x05,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x24,0x05,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x24,0x05,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x38,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x05,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x24,0x05,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x24,0x05,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x28,0x03,0x01,0x00,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00,0x04, 0x00,0x00,0x28,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x00, 0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x02,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x03,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x04,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x04,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x05,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x00,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x05,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x05,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x06,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x00,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x06,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x07,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x06,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x07, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x00,0x00,0x07,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x08,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x08,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03, 0x01,0x09,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb9, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x0a,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x0a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0a,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00,0x01, 0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x0b,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x0b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0b,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09,0x00, 0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x0c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0c,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x09, 0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x03,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x0d,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x0d,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0d,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x09,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x04,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x0e,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x0c,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0e,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x09,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x05,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x0f,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x0d,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x0f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x0f, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x09,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x06,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x10,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00,0x0e, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x10,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x09,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x09,0x00,0x07,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x11,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xba,0x00,0x00,0x00,0x00, 0x0f,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x11,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x11,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x03,0x01,0x12,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbb,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00,0x04,0x00,0x00, 0x28,0x00,0x01,0x13,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x13,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x13,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x01,0x00,0x00,0x01, 0x00,0x02,0x03,0x12,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x14,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x14, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x14,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x02,0x00,0x00, 0x01,0x00,0x02,0x03,0x12,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x15,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x15,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x15,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x03,0x00, 0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x16,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x16,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00,0x04, 0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x17,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x17,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x17,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12,0x00, 0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x18,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x18,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x12, 0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x06,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x19,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x19,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x19,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x12,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x12,0x00,0x07,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x1a,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x1a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x1b, 0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x03,0x1b,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x1c,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x1c, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1c,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x01,0x00,0x00, 0x01,0x00,0x02,0x03,0x1b,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x1d,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x1d,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1d,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x02,0x00, 0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x1e,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x1e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1e,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00,0x03, 0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x1f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x1f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x1f,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b,0x00, 0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x20,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x20,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x1b, 0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x05,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x21,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x21,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x21,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x1b,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x06,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x22,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0e,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x22,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x22,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x1b,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x1b,0x00,0x07,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x23,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x0f,0x21, 0x01,0x01,0x04,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00,0x04,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x23,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x23,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x24,0x00,0x00,0x03, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x24,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00, 0x01,0x25,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x25,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x25,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x01,0x00,0x00,0x01,0x00,0x02, 0x03,0x24,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x00,0x01,0x26,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbe,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x26,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x26,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x02,0x00,0x00,0x01,0x00, 0x02,0x03,0x24,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x00,0x01,0x27,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbe,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x27,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x27,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x03,0x00,0x00,0x01, 0x00,0x02,0x03,0x24,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x28,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x28, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x28,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x04,0x00,0x00, 0x01,0x00,0x02,0x03,0x24,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x29,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x29,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x05,0x00, 0x00,0x01,0x00,0x02,0x03,0x24,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x2a,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x2a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2a,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00,0x06, 0x00,0x00,0x01,0x00,0x02,0x03,0x24,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x24,0x00, 0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x24,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x2c,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x2d,0x00,0x00, 0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x2d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x00,0x01,0x2e,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbe,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x2e,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x01,0x00,0x00,0x01,0x00, 0x02,0x03,0x2d,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x00,0x01,0x2f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbe,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x2f,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x02,0x00,0x00,0x01, 0x00,0x02,0x03,0x2d,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x30,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x30, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x03,0x00,0x00, 0x01,0x00,0x02,0x03,0x2d,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x31,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x31,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x04,0x00, 0x00,0x01,0x00,0x02,0x03,0x2d,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x32,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x32,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x32,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x05, 0x00,0x00,0x01,0x00,0x02,0x03,0x2d,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x33,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x33,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00, 0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x2d,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x34,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x0e,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x34,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x05,0x03,0x00,0x04,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00,0x04, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x2d,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03, 0x2d,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00, 0x01,0x35,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe, 0x00,0x00,0x00,0x00,0x0f,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00, 0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x35,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x03,0x01,0x36,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x36,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x37,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x37,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x37,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x36,0x00, 0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x38,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x38,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x38,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x36, 0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x02,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x39,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x39,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x39,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x36,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x03,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x3a,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x03,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x3a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x36,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x04,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x3b,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x04,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x3b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3b, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x36,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x05,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x3c,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x05, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x3c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x3c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x36,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x06,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x3d,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00, 0x06,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x3d,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x3d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x36,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x36,0x00,0x07, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x3e,0x00, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x3e,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x3e,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x03,0x01,0x3f,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xbf,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x3f,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x40,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x3f, 0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x01,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x41,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x41,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x41,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x3f,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x02,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x42,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x0a,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x42,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x42,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x3f,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x03,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x43,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x0b,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x43, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x3f,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x04,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x44,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x0c, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x44,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x3f,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x05,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x45,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00, 0x0d,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x45,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x45,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x3f,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x06, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x46,0x00, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00, 0x00,0x0e,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x46,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x46,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x05,0x03,0x00,0x04,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x05,0x03,0x00,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x3f,0x00,0x07, 0x00,0x00,0x01,0x00,0x02,0x03,0x3f,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x47,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x0f,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x47,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x47,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x48,0x00,0x00,0x03, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc1,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x48,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00, 0x01,0x49,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc2, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x49,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x49,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x01,0x00,0x00,0x01,0x00,0x02, 0x03,0x48,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x00,0x01,0x4a,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc2,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x4a,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x4a,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x02,0x00,0x00,0x01,0x00, 0x02,0x03,0x48,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x00,0x01,0x4b,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc2,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x4b,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x4b,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x03,0x00,0x00,0x01, 0x00,0x02,0x03,0x48,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x4c,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x4c, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x4c,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x04,0x00,0x00, 0x01,0x00,0x02,0x03,0x48,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x4d,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x4d,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x4d,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x05,0x00, 0x00,0x01,0x00,0x02,0x03,0x48,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x4e,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x4e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x4e,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00,0x06, 0x00,0x00,0x01,0x00,0x02,0x03,0x48,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x4f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x4f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x4f,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x48,0x00, 0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x48,0x00,0x07,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x50,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x50,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x51,0x00,0x00, 0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc1,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x51,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x00,0x01,0x52,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc2,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x52,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x52,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x01,0x00,0x00,0x01,0x00, 0x02,0x03,0x51,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x00,0x01,0x53,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc2,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x53,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x53,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x02,0x00,0x00,0x01, 0x00,0x02,0x03,0x51,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x54,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x54, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x54,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x03,0x00,0x00, 0x01,0x00,0x02,0x03,0x51,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x55,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x55,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x55,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x04,0x00, 0x00,0x01,0x00,0x02,0x03,0x51,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x56,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x56,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00,0x05, 0x00,0x00,0x01,0x00,0x02,0x03,0x51,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x57,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x57,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51,0x00, 0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x51,0x00,0x06,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x58,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0e,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x58,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x58,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x51, 0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x51,0x00,0x07,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x59,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x0f,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x59,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x59,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x5a,0x00, 0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x5a,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x5a,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x00,0x01,0x5b,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x5b,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5b,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a,0x00,0x01,0x00,0x00,0x01, 0x00,0x02,0x03,0x5a,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x5c,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x5c, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a,0x00,0x02,0x00,0x00, 0x01,0x00,0x02,0x03,0x5a,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x5d,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x5d,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5d,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a,0x00,0x03,0x00, 0x00,0x01,0x00,0x02,0x03,0x5a,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x5e,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5e,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a,0x00,0x04, 0x00,0x00,0x01,0x00,0x02,0x03,0x5a,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x5f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x5f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5f,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a,0x00, 0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x5a,0x00,0x05,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x60,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x60,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x60,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x5a, 0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x5a,0x00,0x06,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x61,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x61,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x61,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x5a,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x5a,0x00,0x07,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x62,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x62,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01,0x63, 0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x63,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x03,0x63,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x28,0x00,0x01,0x64,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x64,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x63,0x00,0x01,0x00,0x00, 0x01,0x00,0x02,0x03,0x63,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x65,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x65,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x65,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x63,0x00,0x02,0x00, 0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x66,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x66,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x66,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x63,0x00,0x03, 0x00,0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x67,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x67,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x67,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x63,0x00, 0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x04,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x68,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x68,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x68,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x63, 0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x05,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x69,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x69,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x69,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x63,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x06,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x6a,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0e,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x6a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x6a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x63,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x63,0x00,0x07,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x6b,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x0f,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x6b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x6b, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03,0x01, 0x6c,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc5,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x6c,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x03,0x6c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00, 0x00,0x00,0x28,0x00,0x01,0x6d,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x03, 0x6d,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x6d,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x6c,0x00,0x01,0x00, 0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x6e,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x6e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x6e,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x6c,0x00,0x02, 0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x6f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x6f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x6f,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x6c,0x00, 0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x03,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x70,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x70,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x70,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x6c, 0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x04,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x71,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x71,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x6c,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x05,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x72,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x05,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x72,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x72,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x6c,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x06,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x73,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x06,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x73,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x73, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x6c,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x6c,0x00,0x07,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x74,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x74,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x74,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x03, 0x01,0x75,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc5, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x75,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x28,0x00,0x01,0x76,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00, 0x03,0x76,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x76,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x75,0x00,0x01, 0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x77,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x77,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x77,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x75,0x00, 0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x02,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x78,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x78,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x75, 0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x03,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x79,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x79,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x79,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x75,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x04,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x7a,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x0c,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x7a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x7a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x75,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x05,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x7b,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x0d,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x7b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x7b, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x75,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x06,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x7c,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x0e, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x7c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x7c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x75,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x75,0x00,0x07,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x7d,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x00,0x00,0x00,0x00, 0x0f,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x7d,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x7d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28, 0x03,0x01,0x7e,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x7e,0x00,0x00, 0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01, 0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x7f,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x03,0x7f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x7f,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x7e,0x00, 0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x01,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x80,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x7e, 0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x02,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x81,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x81,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x81,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x7e,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x03,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x03,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x82,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x7e,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x04,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x83,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x04,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x83, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x7e,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x05,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x84,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x05, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x84,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x7e,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x06,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x85,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00, 0x06,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x85,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x85,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x7e,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x7e,0x00,0x07, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x86,0x00, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00, 0x00,0x07,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x86,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x86,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x28,0x03,0x01,0x87,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xc7,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x03,0x87,0x00, 0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00, 0x00,0x00,0x03,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x88,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x87, 0x00,0x01,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x01,0x00,0x00,0x01,0x21,0x01, 0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x09,0x21,0x01,0x01, 0x00,0x00,0x00,0x03,0x89,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x89,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x87,0x00,0x02,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x02,0x00,0x00,0x01,0x21, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x0a,0x21,0x01, 0x01,0x00,0x00,0x00,0x03,0x8a,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x8a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x87,0x00,0x03,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x03,0x00,0x00,0x01, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8b,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x0b,0x21, 0x01,0x01,0x00,0x00,0x00,0x03,0x8b,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x8b, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x87,0x00,0x04,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x04,0x00,0x00, 0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8c,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x0c, 0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03, 0x8c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x87,0x00,0x05,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x05,0x00, 0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8d,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00, 0x0d,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x8d,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x03,0x8d,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x87,0x00,0x06,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00,0x06, 0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8e,0x00, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00,0x00, 0x00,0x0e,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x8e,0x00,0x00,0x00,0x00,0x01,0x00, 0x02,0x03,0x8e,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x87,0x00,0x07,0x00,0x00,0x01,0x00,0x02,0x03,0x87,0x00, 0x07,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x8f, 0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc8,0x00,0x00, 0x00,0x00,0x0f,0x21,0x01,0x01,0x00,0x00,0x00,0x03,0x8f,0x00,0x00,0x00,0x00,0x01, 0x00,0x02,0x03,0x8f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x01,0x01,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x00,0x00,0x03,0x00,0x31,0x06,0x00,0x59,0x29,0x03,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x10,0x32,0x54,0x76,0x10,0x03,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x4b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xcb,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x01,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xce,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x01,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x55,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xcf,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x01,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x01,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x02,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x02,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x5d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xd3,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x02,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x02,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x03,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x03,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xd7,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x03,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x03,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x04,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xda,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x04,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x04,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x04,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x05,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x73,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xde,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x05,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xdf,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x05,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x77,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x05,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x06,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x06,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x7d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xe3,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x06,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x7f,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x06,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x00,0x07,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00, 0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x40,0x07,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xe7,0x00,0x00, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x07,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xc0,0x07,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x7d, 0x00,0x04,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc0, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x32,0x00, 0x01,0x80,0x08,0x00,0x31,0x07,0x00,0x29,0x04,0x00,0x00,0x00,0x8d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x24,0x04,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x8f,0x00,0x00,0x00,0x74, 0x04,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00, 0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x90,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x7b,0x00,0x91,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x00,0x04,0x22, 0x01,0x7b,0x00,0x92,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x7b,0x00,0x93, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x8f,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x8f,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x01, 0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x00,0x00,0x00, 0x00,0x02,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x00,0x8f,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x8f,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x03, 0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x8f,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x24,0x03,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xec,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x96, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x08,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7b,0x00,0x99,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xed,0x00,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x24,0x03,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xee,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x18,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7b,0x00,0xa0,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xef,0x00,0x00, 0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x24,0x03,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x28,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7b,0x00,0xa7,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xf1,0x00,0x00, 0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00, 0x00,0x01,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x24,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x7d,0x00,0x03,0x00, 0x00,0x07,0xf2,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xab, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x38,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x24,0x03,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x02,0x00,0x00, 0x00,0x7b,0x00,0x8a,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x00,0x07,0xf3,0x00,0x00, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a, 0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb2,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x06,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x00,0x02,0x00,0x00,0x32,0x00,0x06,0x00,0x07,0x00,0x31,0x08, 0x00,0x34,0x00,0x00,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x84,0x02,0x00, 0x01,0x44,0x03,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x63,0x84,0x02,0x00, 0x06,0x44,0x03,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x03,0x00,0x00,0x00, 0x00,0x10,0x32,0x54,0x76,0x40,0x02,0x63,0xa8,0x12,0x63,0x11,0x03,0x41,0x02,0x03, 0x00,0x50,0x85,0x05,0x62,0x85,0x03,0x46,0x05,0x04,0x00,0x04,0x00,0x41,0x02,0x20, 0x22,0x1e,0x63,0x11,0x02,0x49,0x00,0x63,0xa8,0x1a,0x63,0x11,0x02,0x41,0x00,0x00, 0x80,0x60,0x06,0x01,0x20,0xa4,0x02,0x00,0x01,0x64,0x02,0x00,0x00,0x49,0x00,0x00, 0x00,0x60,0x06,0x05,0x1f,0xa4,0x02,0x00,0x06,0x64,0x02,0x00,0x00,0x40,0x03,0x63, 0xa8,0x02,0x63,0x11,0x03,0x41,0x02,0x20,0x22,0x16,0x1f,0x11,0x02,0x49,0x00,0x1e, 0xa8,0x12,0x1f,0x11,0x02,0x40,0x07,0x03,0x00,0x50,0x85,0x85,0x62,0x05,0x62,0x46, 0x05,0x20,0x00,0x20,0x00,0x41,0x02,0x20,0x22,0x06,0x1e,0x11,0x02,0x49,0x00,0x1e, 0xa8,0x02,0x1e,0x11,0x02,0x41,0x01,0x20,0x22,0x2e,0x1e,0x11,0x02,0x49,0x00,0x1e, 0xa8,0x2a,0x1e,0x11,0x02,0x41,0x01,0x20,0x22,0x0e,0x1e,0x11,0x02,0x49,0x00,0x1e, 0xa8,0x0a,0x1e,0x11,0x02,0x41,0x00,0x00,0x80,0x60,0x06,0x01,0x20,0xe4,0x00,0x00, 0x01,0x24,0x02,0x00,0x00,0x49,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0xe4,0x00,0x00, 0x06,0x24,0x02,0x00,0x00,0x40,0x01,0x04,0xa8,0x4a,0x04,0x11,0x00,0x41,0x01,0x20, 0x22,0x06,0x04,0x11,0x02,0x49,0x00,0x04,0xa8,0x02,0x04,0x11,0x02,0x41,0x00,0x20, 0x22,0x0e,0x1f,0x11,0x02,0x40,0x02,0x04,0xa8,0x12,0x04,0x11,0x00,0x49,0x00,0x64, 0xa8,0x0a,0x1f,0x11,0x02,0x69,0x00,0x1f,0x68,0x02,0x1f,0x61,0x00,0x41,0x02,0x20, 0x22,0x06,0x64,0x11,0x04,0x49,0x00,0x64,0xa8,0x02,0x64,0x11,0x04,0x41,0x03,0x20, 0x22,0x0e,0x1f,0x11,0x02,0x40,0x02,0x64,0xa8,0x02,0x63,0x11,0x64,0x69,0x00,0x63, 0x68,0x02,0x63,0x61,0x00,0x49,0x00,0x1f,0xa8,0x0a,0x1f,0x11,0x02,0x70,0x02,0x00, 0x00,0x20,0x82,0x01,0x00,0x04,0x63,0x00,0x51,0x00,0x02,0x00,0x02,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x62,0x04,0x63,0x00,0x05,0x05,0x62,0x58,0x00,0x20,0x00,0x00, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x61,0x02,0x04, 0x00,0x90,0x09,0x05,0x20,0x05,0x62,0x58,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x1e, 0x68,0x60,0x63,0x11,0x00,0x01,0x30,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x04, 0x00,0x60,0x81,0x05,0x04,0x05,0x20,0x58,0x05,0x02,0x00,0x02,0x00,0x40,0x02,0x1e, 0xa8,0xca,0x1e,0x11,0x1f,0x61,0x00,0x06,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x08, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0c, 0xa0,0x00,0x00,0x01,0x00,0x70,0x05,0x80,0x00,0x20,0x82,0x01,0x00,0x24,0x1e,0x00, 0x51,0x00,0x02,0x00,0x02,0x31,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x04,0xfc, 0xc1,0x44,0x06,0x94,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x20,0x05,0x20,0x58, 0x05,0x04,0x1f,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x90,0xff,0xff,0xff,0x61,0x00,0x21,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x23, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x25,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x27, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x29,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2b, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2d,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2f, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x31,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x33, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x35,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x37, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x39,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3b, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3d,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3f, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x41,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x43, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x45,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x47, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x49,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4b, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4d,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4f, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x51,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x53, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x55,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x57, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x59,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x5b, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x5d,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x5f, 0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x64,0xa8,0x60,0x00,0x01,0x00,0x70,0x00,0x80, 0x00,0x20,0x02,0x01,0x00,0x04,0x64,0x00,0x52,0x44,0x01,0x00,0x00,0x20,0x00,0x80, 0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x64, 0xa8,0x2a,0x64,0x31,0x01,0x40,0x04,0x64,0x68,0xca,0x64,0x11,0x00,0x70,0x02,0x80, 0x00,0x20,0x02,0x01,0x00,0x04,0x64,0x00,0x52,0x44,0x01,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x70,0x03,0x80, 0x00,0x20,0x02,0x01,0x00,0x24,0x64,0x00,0x52,0x64,0x01,0x00,0x00,0x20,0x00,0x80, 0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x1a,0x00,0x00,0x40,0x00,0x01, 0x00,0x60,0x06,0x85,0x03,0x05,0x64,0x22,0x06,0x85,0x01,0x22,0x00,0x61,0x30,0x04, 0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x00,0x89,0x02,0x69,0x03,0x04,0x68,0x5a,0x03,0x51,0x00,0x69,0x00,0x00, 0x00,0x60,0x86,0x25,0x04,0xa4,0x03,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x1f,0x00,0x07,0x00,0x31,0x91,0x03, 0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x21,0x05, 0x00,0x50,0x80,0x05,0x0d,0x05,0x05,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x01,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x0d,0x20,0x01,0x20,0x04,0x20,0x04,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x0f,0x05,0x06,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x11,0x05,0x07,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x13,0x05,0x08,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x15,0x05,0x09,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x17,0x05,0x0a,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x19,0x05,0x0b,0x46,0x05,0x02,0x00,0x02,0x00,0x69,0x00,0x05, 0x00,0x50,0x80,0x05,0x1b,0x05,0x0c,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x1d,0x14,0x0d,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x01,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x0e,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x1d,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x0f,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x04,0x14,0x0f,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x01,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x10,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x05,0x14,0x11,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x11,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x04,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x12,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x04,0x14,0x15,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x06,0x14,0x13,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x07,0x14,0x17,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x13,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x07,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x14,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x05,0x14,0x1b,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x08,0x14,0x19,0x20,0x05,0x00,0x04,0x00,0x04,0x40,0x03,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x06,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x15,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x16,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x04,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x17,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x18,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x07,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x19,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x1a,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x08,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x1b,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x04,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x14,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x24,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x34,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x44,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x54,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x64,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0x74,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x03, 0x00,0x10,0x81,0x01,0x10,0x04,0x1c,0x20,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x84,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x10,0x00,0x10,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0x94,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x20,0x00,0x20,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xa4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x30,0x00,0x30,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xb4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x40,0x00,0x40,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xc4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x50,0x00,0x50,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xd4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x60,0x00,0x60,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x81,0x10,0xe4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x80,0x00,0x80,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00, 0x00,0x68,0x86,0x01,0x70,0x00,0x70,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x00, 0x00,0x10,0x81,0x01,0x10,0xf4,0x05,0x00,0x01,0x20,0x04,0x20,0x04,0x40,0x02,0x00, 0x00,0x68,0x86,0x01,0x00,0x00,0x00,0x01,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x64, 0xa8,0x02,0x64,0x11,0x1e,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0xe5,0xff,0xff,0x65,0x30,0x03,0x80,0x20,0x82,0x05,0x04,0x44,0x00,0x00, 0x02,0x00,0x00,0x00,0x7f,0x31,0x92,0x00,0x80,0x00,0x00,0x00,0x00,0x0c,0x04,0x08, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x03,0x00,0x00,0x00, 0x00,0x10,0x32,0x54,0x76,0x65,0x32,0x03,0x80,0x20,0x82,0x05,0x04,0x44,0x00,0x00, 0x02,0x00,0x00,0x00,0x7f,0x61,0x02,0x03,0x00,0x60,0x05,0x05,0x61,0x85,0x03,0x46, 0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x20,0x61,0x04,0x61,0x40,0x00,0x61,0x00,0x03, 0x00,0x60,0x06,0x05,0x06,0x01,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03, 0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x03, 0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46,0x05,0x60,0x00,0x60,0x00,0x40,0x03,0x07, 0x61,0x02,0x06,0x00,0x02,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0x80,0x00,0x80,0x00,0x31,0xa3,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x21,0x20,0x00,0x31,0xb4,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x23,0x20,0x00,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0xa0,0x00,0xa0,0x00,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0xc0,0x00,0xc0,0x00,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0xe0,0x00,0xe0,0x00,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0x00,0x01,0x00,0x01,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0x20,0x01,0x20,0x01,0x40,0x33,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0x40,0x01,0x40,0x01,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0x60,0x01,0x60,0x01,0x40,0x34,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0x80,0x01,0x80,0x01,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0xa0,0x01,0xa0,0x01,0x31,0xf5,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x25,0x20,0x00,0x31,0xf6,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x27,0x20,0x00,0x31,0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x29,0x20,0x00,0x31,0xb8,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x2b,0x20,0x00,0x31,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x2d,0x20,0x00,0x40,0x35,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0xc0,0x01,0xc0,0x01,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0xe0,0x01,0xe0,0x01,0x40,0x36,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0x00,0x02,0x00,0x02,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0x20,0x02,0x20,0x02,0x40,0x37,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0x40,0x02,0x40,0x02,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0x60,0x02,0x60,0x02,0x40,0x38,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0x80,0x02,0x80,0x02,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0xa0,0x02,0xa0,0x02,0x40,0x39,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0xc0,0x02,0xc0,0x02,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0xe0,0x02,0xe0,0x02,0x31,0xfa,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x2f,0x20,0x00,0x31,0xfb,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x31,0x20,0x00,0x31,0xdc,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x33,0x20,0x00,0x31,0xbd,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x35,0x20,0x00,0x31,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x37,0x20,0x00,0x40,0x3a,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0x00,0x03,0x00,0x03,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0x20,0x03,0x20,0x03,0x40,0x3b,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0x40,0x03,0x40,0x03,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0x60,0x03,0x60,0x03,0x40,0x3c,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0x80,0x03,0x80,0x03,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0xa0,0x03,0xa0,0x03,0x40,0x3d,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0xc0,0x03,0xc0,0x03,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0xe0,0x03,0xe0,0x03,0x40,0x3e,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0x00,0x04,0x00,0x04,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0x20,0x04,0x20,0x04,0x31,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x39,0x20,0x00,0x31,0xf0,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x3b,0x20,0x00,0x31,0xd1,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x3d,0x20,0x00,0x31,0xb3,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x3f,0x20,0x00,0x31,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x41,0x20,0x00,0x40,0x3f,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0x40,0x04,0x40,0x04,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0x60,0x04,0x60,0x04,0x40,0x30,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0x80,0x04,0x80,0x04,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0xa0,0x04,0xa0,0x04,0x40,0x31,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0xc0,0x04,0xc0,0x04,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0xe0,0x04,0xe0,0x04,0x40,0x33,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0x00,0x05,0x00,0x05,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0x20,0x05,0x20,0x05,0x40,0x34,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0x40,0x05,0x40,0x05,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0x60,0x05,0x60,0x05,0x31,0xf2,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x43,0x20,0x00,0x31,0xf5,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x45,0x20,0x00,0x31,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x47,0x20,0x00,0x31,0xb7,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x49,0x20,0x00,0x31,0x98,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x4b,0x20,0x00,0x40,0x32,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0x80,0x05,0x80,0x05,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0xa0,0x05,0xa0,0x05,0x40,0x35,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0xc0,0x05,0xc0,0x05,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0xe0,0x05,0xe0,0x05,0x40,0x36,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0x00,0x06,0x00,0x06,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0x20,0x06,0x20,0x06,0x40,0x37,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0x40,0x06,0x40,0x06,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0x60,0x06,0x60,0x06,0x40,0x38,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0x80,0x06,0x80,0x06,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0xa0,0x06,0xa0,0x06,0x31,0xf9,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x4d,0x20,0x00,0x31,0xfa,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x4f,0x20,0x00,0x31,0xdb,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x51,0x20,0x00,0x31,0xbc,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x53,0x20,0x00,0x31,0x9d,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x55,0x20,0x00,0x40,0x39,0x03,0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46, 0x05,0xc0,0x06,0xc0,0x06,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0b,0x01,0x20,0x46, 0x05,0xe0,0x06,0xe0,0x06,0x40,0x3a,0x03,0x00,0x60,0x86,0x05,0x0c,0x01,0x20,0x46, 0x05,0x00,0x07,0x00,0x07,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0d,0x01,0x20,0x46, 0x05,0x20,0x07,0x20,0x07,0x40,0x3b,0x03,0x00,0x60,0x86,0x05,0x0e,0x01,0x20,0x46, 0x05,0x40,0x07,0x40,0x07,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x0f,0x01,0x20,0x46, 0x05,0x60,0x07,0x60,0x07,0x40,0x3c,0x03,0x00,0x60,0x86,0x05,0x06,0x01,0x20,0x46, 0x05,0x80,0x07,0x80,0x07,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46, 0x05,0xa0,0x07,0xa0,0x07,0x40,0x3d,0x03,0x00,0x60,0x86,0x05,0x08,0x01,0x20,0x46, 0x05,0xc0,0x07,0xc0,0x07,0x40,0x00,0x03,0x00,0x60,0x86,0x05,0x09,0x01,0x20,0x46, 0x05,0xe0,0x07,0xe0,0x07,0x31,0xfe,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0a,0xfc, 0xcf,0x14,0x57,0x20,0x00,0x31,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0xfc, 0xcf,0x14,0x59,0x20,0x00,0x31,0xd0,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x0e,0xfc, 0xcf,0x14,0x5b,0x20,0x00,0x31,0xb1,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x06,0xfc, 0xcf,0x14,0x5d,0x20,0x00,0x31,0x92,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x08,0xfc, 0xcf,0x14,0x5f,0x20,0x00,0x31,0x43,0x00,0x80,0x00,0x00,0x00,0x00,0x0c,0x04,0x08, 0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x03,0x00,0x00,0x01,0x25,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x33,0x04, 0x00,0x60,0x81,0x05,0x04,0x05,0x62,0x58,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x01, 0x68,0xa2,0x63,0x81,0x00,0x01,0x36,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa7,0x04, 0x00,0x00,0x00,0x44,0x06,0x14,0x04,0xfc,0xc1,0x00,0x00,0x14,0x00,0x40,0x00,0x03, 0x00,0x60,0x06,0x01,0x20,0x04,0x63,0x00,0x06,0x05,0x61,0x46,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x40,0x00,0x02, 0x68,0xa2,0x63,0x01,0x01,0x40,0x04,0x16,0xa1,0x6a,0x01,0x01,0x61,0x69,0x37,0x03, 0x00,0x60,0x86,0x05,0x05,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x03, 0x68,0x9a,0x63,0x81,0x01,0x01,0x27,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x34,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x30,0x02,0x00,0xa0,0x0a,0x07,0x0e,0x05,0x06,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x27,0x0e,0x05,0x08,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x47,0x0e,0x05,0x0a,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x67,0x0e,0x05,0x0c,0x34, 0x00,0x00,0x00,0x00,0x00,0x69,0x07,0x17,0x61,0x02,0x16,0x20,0x00,0x31,0xa8,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x05,0x00,0xc0,0x0c,0x0e,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x07,0x10,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x40,0x07,0x03, 0x00,0x60,0x06,0x01,0x20,0xc4,0x02,0x00,0x06,0x05,0x61,0x46,0x00,0x31,0xc4,0x03, 0x00,0x00,0x00,0x05,0x18,0x04,0x17,0x00,0xc0,0x0c,0x0f,0x00,0x00,0x40,0x00,0x01, 0x68,0xa2,0x63,0x01,0x02,0x61,0x00,0x02,0x00,0xa0,0x0a,0x07,0x12,0x05,0x07,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x07,0x14,0x85,0x07,0x34, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0xa1,0x7a,0x03,0x01,0x61,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x27,0x10,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x69,0x00,0x03, 0x00,0x60,0x86,0x05,0x07,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x47,0x10,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x67,0x10,0x85,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02, 0x68,0xa2,0x63,0x81,0x02,0x31,0xa9,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x07,0x00, 0xc0,0x0c,0x10,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x27,0x12,0x05,0x09,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x27,0x14,0x85,0x09,0x34, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x38,0x00, 0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x05,0x61,0x02,0x04,0x20,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x40,0x00,0x03, 0x00,0x60,0x06,0x01,0x20,0xc4,0x01,0x00,0x06,0x05,0x61,0x46,0x00,0x31,0xba,0x03, 0x00,0x00,0x00,0x05,0x08,0x04,0x05,0x00,0xc0,0x0c,0x11,0x00,0x00,0x40,0x00,0x03, 0x68,0x9a,0x63,0x01,0x03,0x40,0x07,0x06,0xa1,0x6a,0x02,0x01,0x61,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x47,0x12,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x03, 0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x67,0x12,0x05,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01, 0x68,0xa2,0x63,0x81,0x03,0x31,0xab,0x03,0x00,0x00,0x00,0x01,0x00,0x04,0x0a,0x00, 0xc0,0x0c,0x12,0x00,0x00,0x01,0x3a,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x05, 0xa1,0x7a,0x03,0x01,0x61,0x01,0x39,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x07,0x07, 0x61,0x02,0x06,0x20,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0xb7,0x10,0x02,0x61,0x00,0x02,0x00,0xa0,0x0a,0x47,0x14,0x85,0x0b,0x34, 0x00,0x00,0x00,0x00,0x00,0x31,0xb5,0x03,0x00,0x00,0x00,0x05,0x04,0x04,0x07,0x00, 0xc0,0x0c,0x13,0x00,0x00,0x40,0x05,0x03,0x00,0x60,0x06,0x01,0x20,0xc4,0x01,0x00, 0x06,0x05,0x61,0x46,0x00,0x69,0xda,0x08,0x61,0x02,0x05,0x20,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x67,0x14,0x85,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x97,0x00,0x02,0x69,0x3b,0x03, 0x00,0x60,0x86,0x05,0x0a,0x01,0x20,0x46,0x05,0x02,0x00,0x02,0x00,0x31,0xb6,0x03, 0x00,0x00,0x00,0x01,0x00,0x04,0x08,0x00,0xc0,0x0c,0x14,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0xb7,0x10,0x02,0x40,0x00,0x63, 0xa8,0x02,0x63,0x11,0x1f,0x31,0xb7,0x03,0x00,0x00,0x00,0x05,0x06,0x04,0x0a,0x00, 0xc0,0x0c,0x15,0x00,0x00,0x70,0x01,0x00,0x00,0x20,0x82,0x01,0x00,0x04,0x63,0x00, 0x51,0x00,0x02,0x00,0x02,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x62,0x05,0x62,0x58, 0x05,0x04,0x1f,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0xfc,0xff,0xff,0x61,0x00,0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0x01,0x03, 0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00 }; genx_histogram_gen12lp_isa.h000066400000000000000000000023631443134507600341720ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_HISTOGRAM_GEN12LP_ISA_H__ #define __GENX_HISTOGRAM_GEN12LP_ISA_H__ extern const unsigned char genx_histogram_gen12lp[60429]; #endif genx_simple_me_gen12lp_isa.cpp000066400000000000000000055143121443134507600345110ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_simple_me_gen12lp_isa.h" const unsigned char genx_simple_me_gen12lp[292284] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x05,0x00,0x0e,0x44,0x6f,0x77,0x6e,0x53,0x61,0x6d, 0x70,0x6c,0x65,0x4d,0x42,0x32,0x58,0xc4,0x00,0x00,0x00,0x81,0x1b,0x00,0x00,0xb4, 0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x45,0x1c,0x00,0x00,0x48,0x0a,0x00, 0x00,0x0e,0x44,0x6f,0x77,0x6e,0x53,0x61,0x6d,0x70,0x6c,0x65,0x4d,0x42,0x34,0x58, 0x8d,0x26,0x00,0x00,0xc9,0x75,0x00,0x00,0xed,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x0c,0x56,0x9c,0x00,0x00,0xb8,0x2d,0x00,0x00,0x07,0x45,0x6e,0x63,0x4d,0x42, 0x5f,0x49,0x0e,0xca,0x00,0x00,0x23,0xbc,0x00,0x00,0x88,0x1d,0x01,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0x31,0x86,0x01,0x00,0x18,0x49,0x00,0x00,0x07,0x45,0x6e,0x63, 0x4d,0x42,0x5f,0x50,0x49,0xcf,0x01,0x00,0xf9,0xe2,0x00,0x00,0xd8,0x30,0x02,0x00, 0x00,0x00,0x00,0x00,0x01,0x0c,0x42,0xb2,0x02,0x00,0x00,0x5c,0x00,0x00,0x07,0x45, 0x6e,0x63,0x4d,0x42,0x5f,0x42,0x42,0x0e,0x03,0x00,0x1a,0xff,0x00,0x00,0x7b,0x7b, 0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x5c,0x0d,0x04,0x00,0x60,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x44,0x6f,0x77,0x6e,0x53,0x61,0x6d,0x70, 0x6c,0x65,0x4d,0x42,0x32,0x58,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68, 0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79, 0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61, 0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25, 0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25, 0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25, 0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54, 0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31, 0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30, 0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56, 0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39, 0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30, 0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56, 0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37, 0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30, 0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56, 0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35, 0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30, 0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56, 0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33, 0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30, 0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56, 0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31, 0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30, 0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56, 0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39, 0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30, 0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56, 0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37, 0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30, 0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56, 0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35, 0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30, 0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56, 0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33, 0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31, 0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56, 0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31, 0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31, 0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56, 0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39, 0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31, 0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56, 0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37, 0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31, 0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56, 0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35, 0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31, 0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56, 0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33, 0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31, 0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56, 0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31, 0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31, 0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56, 0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39, 0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31, 0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56, 0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37, 0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31, 0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56, 0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35, 0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x44,0x6f,0x77,0x6e,0x53,0x61,0x6d,0x70,0x6c, 0x65,0x4d,0x42,0x32,0x58,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x54,0x30,0x30, 0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e, 0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00, 0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x71,0x00,0x00,0x00,0x20,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x20,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73, 0x00,0x00,0x00,0x55,0x00,0x01,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x51,0x08,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00, 0x00,0x51,0x08,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00, 0x51,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x51, 0x08,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x08, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x08,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x51,0x08,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x51,0x08,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x51,0x08,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x51,0x08,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x51,0x08,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x08,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x51,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x81,0x00,0x00,0x00,0x51,0x08,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x51,0x08,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0x00,0x00,0x00,0x51,0x08,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x55,0x00,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00, 0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x55, 0x00,0x01,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x51,0x08, 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x51,0x08,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x51,0x08,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x51,0x08,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x51,0x08,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x51,0x08,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x08,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x51,0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x00,0x00,0x00,0x51,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x91,0x00,0x00,0x00,0x51,0x08,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x92,0x00,0x00,0x00,0x51,0x08,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0x00,0x00,0x00,0x51,0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x51,0x08,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00, 0x00,0x51,0x08,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00, 0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x51, 0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x55,0x00, 0x01,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x53,0x20,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x53,0x20,0x00,0x6f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x53,0x20,0x00,0x70,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x53,0x20,0x00,0x71,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x53,0x20,0x00,0x72,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x53,0x20,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x53,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x53,0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa1,0x00,0x00,0x00,0x52,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x00,0x00,0x00,0x52,0x20,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3, 0x00,0x00,0x00,0x52,0x20,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x52,0x20,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00, 0x00,0x52,0x20,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00, 0x52,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x52, 0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x52,0x20, 0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x20,0x01,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x20,0x01,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xab,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0xac,0x00,0x00,0x00,0x01,0x00,0x00,0xad,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04, 0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x4d,0x0e,0x00,0x00,0x34,0x0d, 0x00,0x00,0x03,0x00,0xae,0x00,0x00,0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x73,0x69, 0x6d,0x70,0x6c,0x65,0x5f,0x6d,0x65,0x5f,0x30,0x2e,0x61,0x73,0x6d,0xaf,0x00,0x00, 0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0x77,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x79,0x00,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x28,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x06, 0x00,0x10,0x10,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x8b,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x7a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x01, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x84,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x05, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0x77,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x8d, 0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2c,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x04,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x99,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2c,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0x8a,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x9e,0x00,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8f,0x00, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x92,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x94,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x9a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07, 0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x44, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x48,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x5f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x53,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xa2,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa3, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x57,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x58,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa4,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5c,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5d,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xae,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x03,0x00, 0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x73, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0x76,0x00,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x38,0x00,0x07,0x00,0x10,0x10,0x00,0xaf,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x76,0x00,0x00,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00, 0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x95,0x01,0x04,0x02,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x04,0x64,0x00,0x00,0x10,0x00,0x69,0x02,0x01, 0x00,0x60,0x81,0x05,0x03,0x85,0x01,0x22,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x03,0x04, 0x62,0x00,0x03,0x11,0x00,0x61,0x00,0x04,0x62,0xc8,0x03,0x11,0x00,0x40,0x00,0x1d, 0x68,0x02,0x03,0x01,0x01,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00, 0xc0,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x30,0x00, 0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x04,0x62,0x00,0x1d,0x11,0x00,0x61,0x00,0x7f, 0x64,0x00,0x00,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x04,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x31,0x04,0x68,0xca,0x03,0x01,0x01,0x61,0x00,0x04, 0x62,0x00,0x03,0x11,0x00,0x31,0x92,0x03,0x80,0x00,0x00,0x05,0x26,0x04,0x04,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x32,0x04,0x62,0x00,0x1d,0x11,0x00,0x31,0x93,0x03, 0x80,0x00,0x00,0x05,0x3e,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x33,0x00, 0x00,0x60,0x81,0x05,0x04,0x84,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x69,0x00,0x00, 0x00,0x60,0x81,0x25,0x04,0x94,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x20,0x02, 0x00,0xa0,0x0a,0x05,0x0d,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x0f,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x11,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x13,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x15,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x17,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x19,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x1b,0x05,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x02, 0x00,0xa0,0x0a,0x85,0x0d,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x0f,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x11,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x13,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x15,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x17,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x19,0x05,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x1b,0x05,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x02, 0x00,0xa0,0x0a,0x05,0x2e,0x05,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x30,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x32,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x34,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x36,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x38,0x05,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x3a,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x3c,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x02, 0x00,0xa0,0x0a,0x85,0x2e,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x30,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x32,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x34,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x36,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x38,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x3a,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x3c,0x05,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x0e,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x10,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x12,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x14,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x16,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x18,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x1a,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x1c,0x85,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x0e,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x10,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x12,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x14,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x16,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x18,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x1a,0x85,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x1c,0x85,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x2f,0x85,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x31,0x85,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x33,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x35,0x85,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x37,0x85,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x39,0x85,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x3b,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x3d,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x2f,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x31,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x33,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x35,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x37,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x39,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x3b,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x0a,0x85,0x3d,0x85,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x46,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x4a,0x05,0x0f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x4e,0x05,0x11,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x52,0x05,0x13,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x56,0x05,0x15,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x5a,0x05,0x17,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x5e,0x05,0x19,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x62,0x05,0x1b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x66,0x05,0x2e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x6a,0x05,0x30,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x6e,0x05,0x32,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x72,0x05,0x34,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x76,0x05,0x36,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x7a,0x05,0x38,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x02,0x05,0x3a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05, 0x00,0x50,0x00,0x05,0x07,0x05,0x3c,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x48,0x05,0x0e,0x46,0x05,0x05,0x46,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x4c,0x05,0x10,0x46,0x05,0x05,0x4a,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x50,0x05,0x12,0x46,0x05,0x05,0x4e,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x54,0x05,0x14,0x46,0x05,0x05,0x52,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x58,0x05,0x16,0x46,0x05,0x05,0x56,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x5c,0x05,0x18,0x46,0x05,0x05,0x5a,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x60,0x05,0x1a,0x46,0x05,0x05,0x5e,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x64,0x05,0x1c,0x46,0x05,0x05,0x62,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x68,0x05,0x2f,0x46,0x05,0x05,0x66,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x6c,0x05,0x31,0x46,0x05,0x05,0x6a,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x70,0x05,0x33,0x46,0x05,0x05,0x6e,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x74,0x05,0x35,0x46,0x05,0x05,0x72,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x78,0x05,0x37,0x46,0x05,0x05,0x76,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x7c,0x05,0x39,0x46,0x05,0x05,0x7a,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x05,0x05,0x3b,0x46,0x05,0x05,0x02,0x46,0x00,0x40,0x00,0x05, 0x00,0x50,0x00,0x05,0x09,0x05,0x3d,0x46,0x05,0x05,0x07,0x46,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x01,0x20,0x04,0x48,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x0c,0x04,0x4c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x0d,0x04,0x50,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x0e,0x04,0x54,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x0f,0x04,0x58,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x10,0x04,0x5c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x11,0x04,0x60,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x12,0x04,0x64,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x13,0x04,0x68,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x14,0x04,0x6c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x15,0x04,0x70,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x16,0x04,0x74,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x17,0x04,0x78,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x18,0x04,0x7c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x19,0x04,0x05,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x85,0x05,0x1a,0x04,0x09,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x1b,0x01,0x20,0x58,0x05,0x14,0x48,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x1c,0x05,0x0c,0x58,0x05,0x14,0x4c,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x1d,0x05,0x0d,0x58,0x05,0x14,0x50,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x1e,0x05,0x0e,0x58,0x05,0x14,0x54,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x1f,0x05,0x0f,0x58,0x05,0x14,0x58,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x20,0x05,0x10,0x58,0x05,0x14,0x5c,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x21,0x05,0x11,0x58,0x05,0x14,0x60,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x22,0x05,0x12,0x58,0x05,0x14,0x64,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x23,0x05,0x13,0x58,0x05,0x14,0x68,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x24,0x05,0x14,0x58,0x05,0x14,0x6c,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x25,0x05,0x15,0x58,0x05,0x14,0x70,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x26,0x05,0x16,0x58,0x05,0x14,0x74,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x27,0x05,0x17,0x58,0x05,0x14,0x78,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x28,0x05,0x18,0x58,0x05,0x14,0x7c,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x29,0x05,0x19,0x58,0x05,0x14,0x05,0x20,0x00,0x40,0x00,0x04, 0x00,0x50,0x05,0x05,0x2a,0x05,0x1a,0x58,0x05,0x14,0x09,0x20,0x00,0x68,0x00,0x05, 0x00,0x10,0x81,0x05,0x1b,0x05,0x1b,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05, 0x00,0x10,0x81,0x05,0x1d,0x05,0x1d,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05, 0x00,0x10,0x81,0x05,0x1f,0x05,0x1f,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05, 0x00,0x10,0x81,0x05,0x21,0x05,0x21,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05, 0x00,0x10,0x81,0x05,0x23,0x05,0x23,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05, 0x00,0x10,0x81,0x05,0x25,0x05,0x25,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05, 0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05, 0x00,0x10,0x81,0x05,0x29,0x05,0x29,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x2b,0x04,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x2c,0x04,0x1d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x2d,0x04,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x2e,0x04,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x2f,0x04,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x30,0x04,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x31,0x04,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05, 0x00,0x00,0x00,0x05,0x32,0x04,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x94,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xc0,0x44,0x2b,0x00,0x00,0x31,0x00,0x03, 0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0xa2,0x02,0x00, 0x00,0x44,0x6f,0x77,0x6e,0x53,0x61,0x6d,0x70,0x6c,0x65,0x4d,0x42,0x34,0x58,0x00, 0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74, 0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f, 0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65, 0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54, 0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32, 0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00, 0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33, 0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30, 0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00, 0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34, 0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30, 0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00, 0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35, 0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30, 0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00, 0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35, 0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30, 0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00, 0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36, 0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30, 0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00, 0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37, 0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30, 0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00, 0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38, 0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30, 0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00, 0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39, 0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30, 0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00, 0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39, 0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30, 0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00, 0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30, 0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30, 0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00, 0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31, 0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30, 0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00, 0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32, 0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30, 0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00, 0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33, 0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30, 0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00, 0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33, 0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30, 0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00, 0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34, 0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30, 0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00, 0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35, 0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30, 0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00, 0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36, 0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30, 0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00, 0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37, 0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30, 0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00, 0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37, 0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30, 0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00, 0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38, 0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30, 0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00, 0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39, 0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69, 0x6e,0x67,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65, 0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64, 0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x4e,0x6f, 0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x4e, 0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x34,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x35, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30, 0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32, 0x30,0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30, 0x32,0x30,0x38,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x32,0x30,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00, 0x56,0x30,0x32,0x31,0x30,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67, 0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e, 0x67,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x56,0x30, 0x32,0x31,0x34,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x56,0x30,0x32,0x31,0x36,0x00, 0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31, 0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30, 0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00, 0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32, 0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30, 0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00, 0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33, 0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30, 0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00, 0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34, 0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30, 0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00, 0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35, 0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30, 0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00, 0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35, 0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30, 0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00, 0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36, 0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30, 0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00, 0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37, 0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30, 0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00, 0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38, 0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30, 0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00, 0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39, 0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30, 0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00, 0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39, 0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30, 0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00, 0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30, 0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30, 0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00, 0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31, 0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30, 0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00, 0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32, 0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30, 0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00, 0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33, 0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30, 0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00, 0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33, 0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30, 0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00, 0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34, 0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30, 0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00, 0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35, 0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30, 0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00, 0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36, 0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30, 0x33,0x36,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39, 0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37,0x31,0x00,0x56,0x30,0x33, 0x37,0x32,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x56, 0x30,0x33,0x37,0x35,0x00,0x56,0x30,0x33,0x37,0x36,0x00,0x56,0x30,0x33,0x37,0x37, 0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30,0x33,0x37,0x39,0x00,0x56,0x30,0x33, 0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00,0x56,0x30,0x33,0x38,0x32,0x00,0x56, 0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38,0x34,0x00,0x56,0x30,0x33,0x38,0x35, 0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30,0x33,0x38,0x37,0x00,0x56,0x30,0x33, 0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00,0x56,0x30,0x33,0x39,0x30,0x00,0x56, 0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39,0x32,0x00,0x56,0x30,0x33,0x39,0x33, 0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30,0x33,0x39,0x35,0x00,0x56,0x30,0x33, 0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00,0x56,0x30,0x33,0x39,0x38,0x00,0x56, 0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30,0x30,0x00,0x56,0x30,0x34,0x30,0x31, 0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30,0x34,0x30,0x33,0x00,0x56,0x30,0x34, 0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00,0x56,0x30,0x34,0x30,0x36,0x00,0x56, 0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30,0x38,0x00,0x56,0x30,0x34,0x30,0x39, 0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30,0x34,0x31,0x31,0x00,0x56,0x30,0x34, 0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00,0x56,0x30,0x34,0x31,0x34,0x00,0x56, 0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31,0x36,0x00,0x56,0x30,0x34,0x31,0x37, 0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30,0x34,0x31,0x39,0x00,0x56,0x30,0x34, 0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00,0x56,0x30,0x34,0x32,0x32,0x00,0x56, 0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32,0x34,0x00,0x56,0x30,0x34,0x32,0x35, 0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30,0x34,0x32,0x37,0x00,0x56,0x30,0x34, 0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00,0x56,0x30,0x34,0x33,0x30,0x00,0x56, 0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33,0x32,0x00,0x56,0x30,0x34,0x33,0x33, 0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30,0x34,0x33,0x35,0x00,0x56,0x30,0x34, 0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00,0x56,0x30,0x34,0x33,0x38,0x00,0x56, 0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34,0x30,0x00,0x56,0x30,0x34,0x34,0x31, 0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30,0x34,0x34,0x33,0x00,0x56,0x30,0x34, 0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00,0x56,0x30,0x34,0x34,0x36,0x00,0x56, 0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34,0x38,0x00,0x56,0x30,0x34,0x34,0x39, 0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30,0x34,0x35,0x31,0x00,0x56,0x30,0x34, 0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00,0x56,0x30,0x34,0x35,0x34,0x00,0x56, 0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35,0x36,0x00,0x56,0x30,0x34,0x35,0x37, 0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30,0x34,0x35,0x39,0x00,0x56,0x30,0x34, 0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00,0x56,0x30,0x34,0x36,0x32,0x00,0x56, 0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36,0x34,0x00,0x56,0x30,0x34,0x36,0x35, 0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30,0x34,0x36,0x37,0x00,0x56,0x30,0x34, 0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00,0x56,0x30,0x34,0x37,0x30,0x00,0x56, 0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37,0x32,0x00,0x56,0x30,0x34,0x37,0x33, 0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30,0x34,0x37,0x35,0x00,0x56,0x30,0x34, 0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00,0x56,0x30,0x34,0x37,0x38,0x00,0x56, 0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38,0x30,0x00,0x56,0x30,0x34,0x38,0x31, 0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30,0x34,0x38,0x33,0x00,0x56,0x30,0x34, 0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00,0x56,0x30,0x34,0x38,0x36,0x00,0x56, 0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38,0x38,0x00,0x56,0x30,0x34,0x38,0x39, 0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30,0x34,0x39,0x31,0x00,0x56,0x30,0x34, 0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00,0x56,0x30,0x34,0x39,0x34,0x00,0x56, 0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39,0x36,0x00,0x56,0x30,0x34,0x39,0x37, 0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30,0x34,0x39,0x39,0x00,0x56,0x30,0x35, 0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00,0x56,0x30,0x35,0x30,0x32,0x00,0x56, 0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30,0x34,0x00,0x56,0x30,0x35,0x30,0x35, 0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30,0x35,0x30,0x37,0x00,0x56,0x30,0x35, 0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00,0x56,0x30,0x35,0x31,0x30,0x00,0x56, 0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31,0x32,0x00,0x56,0x30,0x35,0x31,0x33, 0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30,0x35,0x31,0x35,0x00,0x56,0x30,0x35, 0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00,0x56,0x30,0x35,0x31,0x38,0x00,0x56, 0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32,0x30,0x00,0x56,0x30,0x35,0x32,0x31, 0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30,0x35,0x32,0x33,0x00,0x56,0x30,0x35, 0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00,0x56,0x30,0x35,0x32,0x36,0x00,0x56, 0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32,0x38,0x00,0x56,0x30,0x35,0x32,0x39, 0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30,0x35,0x33,0x31,0x00,0x56,0x30,0x35, 0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00,0x56,0x30,0x35,0x33,0x34,0x00,0x56, 0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33,0x36,0x00,0x56,0x30,0x35,0x33,0x37, 0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30,0x35,0x33,0x39,0x00,0x56,0x30,0x35, 0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00,0x56,0x30,0x35,0x34,0x32,0x00,0x56, 0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34,0x34,0x00,0x56,0x30,0x35,0x34,0x35, 0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30,0x35,0x34,0x37,0x00,0x56,0x30,0x35, 0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00,0x56,0x30,0x35,0x35,0x30,0x00,0x56, 0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35,0x32,0x00,0x56,0x30,0x35,0x35,0x33, 0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30,0x35,0x35,0x35,0x00,0x56,0x30,0x35, 0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00,0x56,0x30,0x35,0x35,0x38,0x00,0x56, 0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36,0x30,0x00,0x56,0x30,0x35,0x36,0x31, 0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30,0x35,0x36,0x33,0x00,0x56,0x30,0x35, 0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00,0x56,0x30,0x35,0x36,0x36,0x00,0x56, 0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36,0x38,0x00,0x56,0x30,0x35,0x36,0x39, 0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30,0x35,0x37,0x31,0x00,0x56,0x30,0x35, 0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00,0x56,0x30,0x35,0x37,0x34,0x00,0x56, 0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37,0x36,0x00,0x56,0x30,0x35,0x37,0x37, 0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30,0x35,0x37,0x39,0x00,0x56,0x30,0x35, 0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00,0x56,0x30,0x35,0x38,0x32,0x00,0x56, 0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38,0x34,0x00,0x56,0x30,0x35,0x38,0x35, 0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30,0x35,0x38,0x37,0x00,0x56,0x30,0x35, 0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00,0x56,0x30,0x35,0x39,0x30,0x00,0x56, 0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39,0x32,0x00,0x56,0x30,0x35,0x39,0x33, 0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30,0x35,0x39,0x35,0x00,0x56,0x30,0x35, 0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00,0x56,0x30,0x35,0x39,0x38,0x00,0x56, 0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30,0x30,0x00,0x56,0x30,0x36,0x30,0x31, 0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30,0x36,0x30,0x33,0x00,0x56,0x30,0x36, 0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00,0x56,0x30,0x36,0x30,0x36,0x00,0x56, 0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30,0x38,0x00,0x56,0x30,0x36,0x30,0x39, 0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30,0x36,0x31,0x31,0x00,0x56,0x30,0x36, 0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00,0x56,0x30,0x36,0x31,0x34,0x00,0x56, 0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31,0x36,0x00,0x56,0x30,0x36,0x31,0x37, 0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30,0x36,0x31,0x39,0x00,0x56,0x30,0x36, 0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00,0x56,0x30,0x36,0x32,0x32,0x00,0x56, 0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32,0x34,0x00,0x56,0x30,0x36,0x32,0x35, 0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30,0x36,0x32,0x37,0x00,0x56,0x30,0x36, 0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00,0x56,0x30,0x36,0x33,0x30,0x00,0x56, 0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33,0x32,0x00,0x56,0x30,0x36,0x33,0x33, 0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30,0x36,0x33,0x35,0x00,0x56,0x30,0x36, 0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00,0x56,0x30,0x36,0x33,0x38,0x00,0x56, 0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34,0x30,0x00,0x56,0x30,0x36,0x34,0x31, 0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30,0x36,0x34,0x33,0x00,0x56,0x30,0x36, 0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00,0x56,0x30,0x36,0x34,0x36,0x00,0x56, 0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34,0x38,0x00,0x56,0x30,0x36,0x34,0x39, 0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30,0x36,0x35,0x31,0x00,0x56,0x30,0x36, 0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00,0x56,0x30,0x36,0x35,0x34,0x00,0x56, 0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35,0x36,0x00,0x44,0x6f,0x77,0x6e,0x53, 0x61,0x6d,0x70,0x6c,0x65,0x4d,0x42,0x34,0x58,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31, 0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x41,0x73,0x6d,0x4e,0x61, 0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72, 0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x1a,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xbf,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc1,0x00,0x00,0x00,0x00, 0xc2,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc3, 0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xc5,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc9,0x00,0x00,0x00,0x00, 0xca,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xcb, 0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xcd,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xcf,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0x00,0x00,0x00,0x00, 0xd2,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd3, 0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xd5,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd7,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd9,0x00,0x00,0x00,0x00, 0xda,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xdb, 0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xdd,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x79,0x01,0x00, 0x00,0x00,0x7a,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7c,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8a,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8b,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8c,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9a,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9b,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9c,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xaa,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xab,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xac,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x54, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x20,0x01, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x20,0x01,0x00, 0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x55,0x00,0x01,0x28, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x51,0x08,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x51,0x08,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x51,0x08,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x51,0x08,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x51,0x08,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xba,0x01,0x00,0x00,0x51,0x08,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbb,0x01,0x00,0x00,0x51,0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbc,0x01,0x00,0x00,0x51,0x08,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd, 0x01,0x00,0x00,0x51,0x08,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01, 0x00,0x00,0x51,0x08,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00, 0x00,0x51,0x08,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00, 0x51,0x08,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x51, 0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x51,0x08, 0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x51,0x08,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x51,0x08,0x00,0x3d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x20,0x01,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x55,0x00,0x01,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x55,0x00,0x01,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x51,0x08,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xca,0x01,0x00,0x00,0x51,0x08,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcb,0x01,0x00,0x00,0x51,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcc,0x01,0x00,0x00,0x51,0x08,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd, 0x01,0x00,0x00,0x51,0x08,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01, 0x00,0x00,0x51,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00, 0x00,0x51,0x08,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00, 0x51,0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x51, 0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x51,0x08, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x51,0x08,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x51,0x08,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x51,0x08,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x51,0x08,0x00,0x4b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x51,0x08,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x51,0x08,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x55,0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xda,0x01,0x00,0x00,0x53,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdb,0x01,0x00,0x00,0x53,0x20,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdc,0x01,0x00,0x00,0x53,0x20,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd, 0x01,0x00,0x00,0x53,0x20,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01, 0x00,0x00,0x53,0x20,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00, 0x00,0x53,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00, 0x53,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x53, 0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x52,0x20, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x52,0x20,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x52,0x20,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x52,0x20,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x52,0x20,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x52,0x20,0x00,0x73,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x52,0x20,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x52,0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xea,0x01,0x00,0x00,0x20,0x01,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xeb,0x01,0x00,0x00,0x55,0x00,0x01,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xec,0x01,0x00,0x00,0x51,0x08,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed, 0x01,0x00,0x00,0x51,0x08,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01, 0x00,0x00,0x51,0x08,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00, 0x00,0x51,0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00, 0x51,0x08,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x51, 0x08,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x51,0x08, 0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x51,0x08,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x51,0x08,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x51,0x08,0x00,0x85,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x51,0x08,0x00,0x86,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x51,0x08,0x00,0x87,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x51,0x08,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x51,0x08,0x00,0x89,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfa,0x01,0x00,0x00,0x51,0x08,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfb,0x01,0x00,0x00,0x51,0x08,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x01,0x00,0x00,0x20,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd, 0x01,0x00,0x00,0x55,0x00,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01, 0x00,0x00,0x55,0x00,0x01,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00, 0x00,0x51,0x08,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x51,0x08,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x51, 0x08,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x51,0x08, 0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x51,0x08,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x51,0x08,0x00,0x91, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x51,0x08,0x00,0x92,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x51,0x08,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x51,0x08,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x51,0x08,0x00,0x95,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x51,0x08,0x00,0x96,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0a,0x02,0x00,0x00,0x51,0x08,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0b,0x02,0x00,0x00,0x51,0x08,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0c,0x02,0x00,0x00,0x51,0x08,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d, 0x02,0x00,0x00,0x51,0x08,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02, 0x00,0x00,0x51,0x08,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00, 0x00,0x55,0x00,0x01,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00, 0x53,0x20,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x53, 0x20,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x53,0x20, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x53,0x20,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x53,0x20,0x00,0xc0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x53,0x20,0x00,0xc1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x53,0x20,0x00,0xc2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x53,0x20,0x00,0xc3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x52,0x20,0x00,0xbc,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x52,0x20,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1a,0x02,0x00,0x00,0x52,0x20,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1b,0x02,0x00,0x00,0x52,0x20,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1c,0x02,0x00,0x00,0x52,0x20,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d, 0x02,0x00,0x00,0x52,0x20,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02, 0x00,0x00,0x52,0x20,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00, 0x00,0x52,0x20,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00, 0x20,0x01,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x55, 0x00,0x01,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x51,0x08, 0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x51,0x08,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x51,0x08,0x00,0xdc, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x51,0x08,0x00,0xdd,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x51,0x08,0x00,0xde,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x51,0x08,0x00,0xdf,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x51,0x08,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x51,0x08,0x00,0xe1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2a,0x02,0x00,0x00,0x51,0x08,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2b,0x02,0x00,0x00,0x51,0x08,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2c,0x02,0x00,0x00,0x51,0x08,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d, 0x02,0x00,0x00,0x51,0x08,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02, 0x00,0x00,0x51,0x08,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00, 0x00,0x51,0x08,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00, 0x51,0x08,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x51, 0x08,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x55,0x00, 0x01,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x20,0x01,0x00, 0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x55,0x00,0x01,0xd8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x51,0x08,0x00,0xea,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x51,0x08,0x00,0xeb,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x51,0x08,0x00,0xec,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x51,0x08,0x00,0xed,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x51,0x08,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3a,0x02,0x00,0x00,0x51,0x08,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3b,0x02,0x00,0x00,0x51,0x08,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3c,0x02,0x00,0x00,0x51,0x08,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d, 0x02,0x00,0x00,0x51,0x08,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02, 0x00,0x00,0x51,0x08,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00, 0x00,0x51,0x08,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x51,0x08,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x51, 0x08,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x51,0x08, 0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x51,0x08,0x00, 0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x51,0x08,0x00,0xf9, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x55,0x00,0x01,0xd9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x53,0x20,0x00,0x1a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x53,0x20,0x00,0x1b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x53,0x20,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x53,0x20,0x00,0x1d,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x4a,0x02,0x00,0x00,0x53,0x20,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x4b,0x02,0x00,0x00,0x53,0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x4c,0x02,0x00,0x00,0x53,0x20,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4d, 0x02,0x00,0x00,0x53,0x20,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02, 0x00,0x00,0x52,0x20,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00, 0x00,0x52,0x20,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00, 0x52,0x20,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x52, 0x20,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x52,0x20, 0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x52,0x20,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x52,0x20,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x52,0x20,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x55,0x00,0x01,0x22,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x51,0x08,0x00,0x26,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x51,0x08,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x51,0x08,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0x02,0x00,0x00,0x51,0x08,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x5b,0x02,0x00,0x00,0x51,0x08,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x51,0x08,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5d, 0x02,0x00,0x00,0x51,0x08,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02, 0x00,0x00,0x51,0x08,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00, 0x00,0x51,0x08,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00, 0x51,0x08,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x51, 0x08,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x51,0x08, 0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x51,0x08,0x00, 0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x51,0x08,0x00,0x33, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x51,0x08,0x00,0x34,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x51,0x08,0x00,0x35,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x55,0x00,0x01,0x23,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x55,0x00,0x01,0x24,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x51,0x08,0x00,0x36,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x6a,0x02,0x00,0x00,0x51,0x08,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x6b,0x02,0x00,0x00,0x51,0x08,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x02,0x00,0x00,0x51,0x08,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6d, 0x02,0x00,0x00,0x51,0x08,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02, 0x00,0x00,0x51,0x08,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00, 0x00,0x51,0x08,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00, 0x51,0x08,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x51, 0x08,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x51,0x08, 0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x51,0x08,0x00, 0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x51,0x08,0x00,0x41, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x51,0x08,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x51,0x08,0x00,0x43,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x51,0x08,0x00,0x44,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x51,0x08,0x00,0x45,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x79,0x02,0x00,0x00,0x55,0x00,0x01,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x7a,0x02,0x00,0x00,0x53,0x20,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x7b,0x02,0x00,0x00,0x53,0x20,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x7c,0x02,0x00,0x00,0x53,0x20,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d, 0x02,0x00,0x00,0x53,0x20,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02, 0x00,0x00,0x53,0x20,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00, 0x00,0x53,0x20,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00, 0x53,0x20,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x53, 0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x52,0x20, 0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x52,0x20,0x00, 0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x52,0x20,0x00,0x68, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x52,0x20,0x00,0x69,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x52,0x20,0x00,0x6a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x52,0x20,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x52,0x20,0x00,0x6c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x52,0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x8a,0x02,0x00,0x00,0x53,0x20,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x8b,0x02,0x00,0x00,0x53,0x20,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x8c,0x02,0x00,0x00,0x53,0x20,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8d, 0x02,0x00,0x00,0x53,0x20,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02, 0x00,0x00,0x53,0x20,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00, 0x00,0x53,0x20,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00, 0x53,0x20,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x53, 0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x52,0x20, 0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x52,0x20,0x00, 0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x52,0x20,0x00,0xa0, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x52,0x20,0x00,0xa1,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x52,0x20,0x00,0xa2,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x52,0x20,0x00,0xa3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x52,0x20,0x00,0xa4,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x52,0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x9a,0x02,0x00,0x00,0x20,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9b,0x02,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x9c,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x9d,0x02, 0x00,0x00,0x01,0x00,0x00,0x9e,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24, 0x00,0x04,0x00,0x25,0x40,0x00,0x00,0xa4,0x35,0x00,0x00,0x03,0x00,0x9f,0x02,0x00, 0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x73,0x69,0x6d,0x70,0x6c,0x65,0x5f,0x6d,0x65, 0x5f,0x31,0x2e,0x61,0x73,0x6d,0xa0,0x02,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x01, 0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x06,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x37,0x00,0x06,0x00, 0x10,0x10,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0xa9,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xaa, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xaf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb7,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xba,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xbb,0x01, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xab, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xae,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb0,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2a,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb3, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xb6,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb8,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x00,0x00,0x00, 0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xbd,0x01,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00, 0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x02,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2c,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00, 0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x06,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcd,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00, 0x06,0x00,0x10,0x10,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0xbe,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc3, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xc6,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc8,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcb, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x52,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x4e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xcf,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x50,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd0,0x01, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x51,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd1,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x52, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd1,0x01,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xd6,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00, 0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xd8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xdc,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6e,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x72,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00, 0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xdf, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0xe0,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x77,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x77,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe7, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00, 0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x04,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x77,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x77,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xef, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00, 0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00, 0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf2,0x01,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xe3,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x79,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe5,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00, 0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x79,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe8, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x03,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00, 0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xeb,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x05,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x79,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00, 0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x79,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x07,0x04,0x22,0x01, 0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xbc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0xf3,0x01,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00, 0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x02,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00, 0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x06,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x03,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00, 0x06,0x00,0x10,0x10,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x04,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0xf4,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x7b,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x7b,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf9, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xfc,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x7b,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x7b,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x01, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7b,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x9e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x86,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x88,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xad,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb5,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb9,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x9c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x05,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x06, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x9e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x06,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x9f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x07,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa0, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa1,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa2,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa3,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xb7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xb9,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x0c,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00, 0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x0e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x12,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0xc4,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0xbc,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xbd,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xbf,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0xc0,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc3,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xa7, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x16,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00, 0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x04,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00, 0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd5,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x00, 0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xba,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x02, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x18, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x1b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xd6,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xd6,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x20, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x23,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xd6,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd6,0x00,0x00,0x00, 0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x28,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00, 0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x02,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd8,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd8,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00, 0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x06,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd8,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00, 0x06,0x00,0x10,0x10,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x3a,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x2a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xd9,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2c,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xd9,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2f, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x32,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xd9,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xd9,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x37, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xd9,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xd9,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xfd,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xfe,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe2, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe4,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe6,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe8,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xea,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xec,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xef,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x0b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x0f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x3b,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xfc,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3c,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xfd,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfe, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3d,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xff,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x01,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x15, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x42,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00, 0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x44,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x48,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1a,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1e,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x37,0x00,0x06,0x00, 0x10,0x10,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x4b,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x4c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x51,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x59,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x06,0x00,0x10,0x10, 0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x5c,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x4c,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00, 0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x23,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4f, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x01,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x23,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x54,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00, 0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x23,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x57, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x05,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x5a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x23,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xdf, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x5d,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x24,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x61,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x64, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01, 0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x04,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x24,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00, 0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01, 0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0xf1,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x02, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5f, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x62,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x25,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x64,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x25,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x67, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x6a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x25,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x25,0x01,0x00,0x00, 0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x26,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x52,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3e, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x40,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x42,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x44,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x59,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x61,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x46, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x65,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x59, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5b,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x72,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x74,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x51,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x52, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x75,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x7a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x7e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x6f, 0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x67,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0x68,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x69,0x01,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6a,0x01,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6b,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0x6b,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x7a,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0x6c,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00, 0x01,0x00,0x23,0x01,0x01,0x05,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x89,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x74,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x76, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x78,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7a,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7c,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x91,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x95,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x99,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7e,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x90,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x91, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x82,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x93,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x82,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x84, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x84,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x89,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x85,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x85,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8c,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x8a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x8e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa6, 0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa0,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xa6,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00, 0xa3,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x06,0x00,0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x38,0x00,0x07,0x00,0x10,0x10,0x00,0x8f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xa6,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00, 0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x95,0x01,0x04,0x02, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x04,0x64,0x00,0x00,0x10,0x00,0x69,0x02, 0x01,0x00,0x60,0x81,0x05,0x03,0x85,0x01,0x22,0x05,0x06,0x00,0x06,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x03, 0x04,0x62,0x00,0x03,0x11,0x00,0x61,0x00,0x04,0x62,0xc8,0x03,0x11,0x00,0x40,0x00, 0x1d,0x68,0x02,0x03,0x01,0x01,0x31,0xa0,0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x26,0x68,0x22,0x03,0x01,0x01,0x01,0x30, 0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x02,0x04,0x62,0x00,0x1d,0x11,0x00,0x61,0x00, 0x7f,0x64,0x00,0x00,0x10,0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x1e,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x31,0x04,0x62,0x00,0x03,0x11,0x00,0x61,0x04, 0x04,0x62,0x60,0x26,0x11,0x00,0x31,0x92,0x03,0x80,0x00,0x00,0x05,0x27,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x32,0x04,0x62,0x00,0x1d,0x11,0x00,0x31,0x93, 0x03,0x80,0x00,0x00,0x05,0x3f,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x33, 0x04,0x62,0xc8,0x03,0x11,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x15,0x05,0x09, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x05,0x0a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x05,0x07, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x85,0x09, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x02,0x00,0xa0,0x0a,0x85,0x15,0x05,0x22, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x17,0x05,0x23, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x85,0x0a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x05,0x0b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x05,0x0c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x05,0x20, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x16,0x85,0x22, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x85,0x23, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x05,0x24, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1b,0x05,0x25, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x57,0x05,0x15, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x5b,0x05,0x17, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x05,0x05, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x05,0x1e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x85,0x07, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x05,0x08, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x85,0x0b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1c,0x85,0x0c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x12,0x85,0x20, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x13,0x05,0x21, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x85,0x24, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1c,0x85,0x25, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x05,0x3b,0x05,0x2d, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3d,0x05,0x2e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x05,0x3f, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3b,0x05,0x45, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3d,0x05,0x46, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x11, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x05,0x19, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x63,0x05,0x1b, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x59,0x05,0x16, 0x46,0x05,0x05,0x57,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5d,0x05,0x18, 0x46,0x05,0x05,0x5b,0x46,0x00,0x40,0x00,0x3f,0x68,0x02,0x03,0x01,0x02,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x0e,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x0e,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x0d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x10,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x14,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x14,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x3c,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x3e,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x3c,0x85,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x3e,0x85,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x53,0x05,0x13,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x09,0x05,0x3d,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x51,0x05,0x12,0x46,0x05,0x05,0x4f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x61,0x05,0x1a,0x46,0x05,0x05,0x5f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x65,0x05,0x1c,0x46,0x05,0x05,0x63,0x46,0x00,0x40,0x00, 0x58,0x68,0x02,0x03,0x01,0x03,0x61,0x00,0x04,0x62,0x00,0x3f,0x11,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x05,0x05,0x3b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x2f,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x11,0x04,0x59,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x49,0x05,0x0e,0x46,0x05,0x05,0x47,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x12,0x04,0x5d,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x31,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x32,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x33,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x34,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x35,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x36,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x37,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x38,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x39,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x3a,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0x94, 0x03,0x80,0x00,0x00,0x05,0x40,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x55,0x05,0x14,0x46,0x05,0x05,0x53,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x3e,0x46,0x05,0x05,0x09,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x07,0x05,0x3c,0x46,0x05,0x05,0x05,0x46,0x00,0x61,0x34, 0x04,0x62,0x00,0x58,0x11,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x30,0x85,0x27, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x30,0x85,0x3f, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x13,0x04,0x61, 0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x67,0x05,0x2f, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x14,0x04,0x65, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x22,0x05,0x11, 0x58,0x05,0x14,0x59,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x23,0x05,0x12, 0x58,0x05,0x14,0x5d,0x20,0x00,0x31,0x95,0x03,0x80,0x00,0x00,0x05,0x59,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x35,0x04,0x62,0x00,0x3f,0x11,0x00,0x61,0x00, 0x04,0x62,0x60,0x26,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x0b, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x07, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x69,0x05,0x30, 0x46,0x05,0x05,0x67,0x46,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x24,0x05,0x13, 0x58,0x05,0x14,0x61,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x25,0x05,0x14, 0x58,0x05,0x14,0x65,0x20,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x61,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x36,0x04,0x62,0x00,0x58,0x11,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2e,0x01,0x20,0x58,0x05,0x14,0x0b,0x20,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x1b,0x58,0x05,0x14,0x07,0x20,0x00,0x31,0x97, 0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x31,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x0f,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x32,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x33,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x35,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x05,0x00,0x50,0x00,0x05,0x6b,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x10,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x34,0x85,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x36,0x85,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x4b,0x05,0x0f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x6f,0x05,0x33,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x73,0x05,0x35,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x05,0x00,0x50,0x00,0x05,0x6d,0x05,0x32,0x46,0x05,0x05,0x6b,0x46,0x00,0x40,0x04, 0x05,0x00,0x50,0x00,0x05,0x4d,0x05,0x10,0x46,0x05,0x05,0x4b,0x46,0x00,0x40,0x04, 0x05,0x00,0x50,0x00,0x05,0x71,0x05,0x34,0x46,0x05,0x05,0x6f,0x46,0x00,0x40,0x04, 0x05,0x00,0x50,0x00,0x05,0x75,0x05,0x36,0x46,0x05,0x05,0x73,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x69,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x05, 0x04,0x00,0x50,0x85,0x05,0x16,0x04,0x6d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x0d,0x04,0x49,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x06, 0x04,0x00,0x50,0x85,0x05,0x0e,0x04,0x4d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x06, 0x04,0x00,0x50,0x85,0x05,0x17,0x04,0x71,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x06, 0x04,0x00,0x50,0x85,0x05,0x18,0x04,0x75,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x27,0x01,0x20,0x58,0x05,0x14,0x69,0x20,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x16,0x58,0x05,0x14,0x6d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x51,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x10,0x04,0x55,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x1e,0x05,0x0d,0x58,0x05,0x14,0x49,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x1f,0x05,0x0e,0x58,0x05,0x14,0x4d,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x29,0x05,0x17,0x58,0x05,0x14,0x71,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x2a,0x05,0x18,0x58,0x05,0x14,0x75,0x20,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x37,0x05,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x39,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x24, 0x02,0x00,0xa0,0x0a,0x05,0x48,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x54,0x05,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x25, 0x02,0x00,0xa0,0x0a,0x85,0x48,0x05,0x59,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x54,0x05,0x5f,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x20,0x01,0x20,0x58,0x05,0x14,0x51,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x21,0x05,0x10,0x58,0x05,0x14,0x55,0x20,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x38,0x85,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x3a,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x22,0x05,0x22,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x1e,0x05,0x1e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x29,0x05,0x29,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x77,0x05,0x37,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x7b,0x05,0x39,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x50,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x50,0x05,0x5d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x49,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x49,0x85,0x59,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x48,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x52,0x05,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x52,0x05,0x5e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x55,0x85,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x55,0x85,0x5f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x37,0x04,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x54,0x46,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x24,0x05,0x24,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x20,0x05,0x20,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x79,0x05,0x38,0x46,0x05,0x05,0x77,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x7d,0x05,0x3a,0x46,0x05,0x05,0x7b,0x46,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x53,0x85,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x53,0x85,0x5e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x26, 0x02,0x00,0xa0,0x0a,0x05,0x6b,0x05,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x27, 0x02,0x00,0xa0,0x0a,0x85,0x6b,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x69,0x05,0x61,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x69,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x51,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x51,0x85,0x5d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x33,0x04,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x34,0x04,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x2f,0x04,0x1e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x30,0x04,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x39,0x04,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x49,0x46,0x05,0x05,0x0d,0x46,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x38,0x04,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x22,0x05,0x52,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x1e,0x05,0x50,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x28,0x05,0x55,0x46,0x05,0x05,0x26,0x46,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4c,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4c,0x05,0x5b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4b,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x6c,0x85,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x6c,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x6a,0x85,0x61,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x6a,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x6d,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4a,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x75,0x05,0x67,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x75,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x35,0x04,0x24,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x36,0x04,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x31,0x04,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x32,0x04,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x19,0x04,0x79,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x77,0x05,0x68,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x77,0x05,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1a,0x04,0x7d,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x44,0x05,0x6b,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x07,0x68,0x22,0x03,0x01,0x02,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x40,0x05,0x69, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x24,0x05,0x53, 0x46,0x05,0x05,0x22,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x20,0x05,0x51, 0x46,0x05,0x05,0x1e,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4d,0x85,0x42, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4e,0x05,0x43, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4d,0x85,0x5b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4e,0x05,0x5c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x71,0x05,0x65, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x71,0x05,0x09, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x76,0x85,0x67, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x15,0x05,0x4c, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x61,0x04,0x0f, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x67,0x04,0x28, 0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4f,0x85,0x43, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x57,0x85,0x47, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x62,0x00,0x03,0x11,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4b,0x85,0x5a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x6f,0x05,0x64,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x6f,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4a,0x05,0x5a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x76,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x56,0x05,0x47,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x78,0x85,0x68,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x78,0x85,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x5d,0x05,0x77,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x62,0x60,0x07,0x11,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x42,0x05,0x6a, 0x46,0x05,0x05,0x40,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x59,0x05,0x75, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x46,0x05,0x6c, 0x46,0x05,0x05,0x44,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4f,0x85,0x5c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x73,0x05,0x66, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x74,0x85,0x66, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x72,0x85,0x65, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2b,0x05,0x19, 0x58,0x05,0x14,0x79,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2c,0x05,0x1a, 0x58,0x05,0x14,0x7d,0x20,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x50,0x05,0x71, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x17,0x05,0x4d, 0x46,0x05,0x05,0x15,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x66,0x04,0x24, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x65,0x04,0x20, 0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x19,0x05,0x4e, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x57,0x85,0x60, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x70,0x85,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x70,0x85,0x08, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x73,0x05,0x0a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x74,0x85,0x0a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x72,0x85,0x09, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x56,0x05,0x60, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x77,0x05,0x67, 0x58,0x05,0x14,0x28,0x20,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5b,0x05,0x76, 0x46,0x05,0x05,0x59,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x71,0x05,0x61, 0x58,0x05,0x14,0x0f,0x20,0x00,0x31,0x98,0x03,0x80,0x00,0x00,0x05,0x08,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4c,0x05,0x6f, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x05,0x78, 0x46,0x05,0x05,0x5d,0x46,0x00,0x40,0x00,0x29,0x68,0x22,0x03,0x01,0x03,0x61,0x38, 0x04,0x62,0x00,0x1d,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x69,0x04,0x42, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x6a,0x04,0x46, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x1b,0x05,0x4f, 0x46,0x05,0x05,0x19,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x75,0x05,0x65, 0x58,0x05,0x14,0x20,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x76,0x05,0x66, 0x58,0x05,0x14,0x24,0x20,0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x05,0x21,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x4e,0x05,0x70, 0x46,0x05,0x05,0x4c,0x46,0x00,0x61,0x39,0x04,0x62,0x00,0x03,0x11,0x00,0x61,0x07, 0x04,0x62,0x60,0x29,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x5b, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x70,0x04,0x5f, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x79,0x05,0x69, 0x58,0x05,0x14,0x42,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x7a,0x05,0x6a, 0x58,0x05,0x14,0x46,0x20,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x40,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3a,0x04,0x62,0x00,0x1d,0x11,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x05,0x01,0x20,0x58,0x05,0x14,0x5b,0x20,0x00,0x40,0x05, 0x04,0x00,0x50,0x05,0x05,0x06,0x05,0x70,0x58,0x05,0x14,0x5f,0x20,0x00,0x31,0x9b, 0x03,0x80,0x00,0x00,0x05,0x59,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x2b,0x05,0x2b,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x6d,0x05,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x11,0x05,0x4a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x3a,0x04,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x04,0x00,0x00,0x00,0x05,0x3b,0x04,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x2a,0x05,0x56,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x6e,0x85,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x6e,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x54,0x05,0x73,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x48,0x05,0x6d,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x05,0x00,0x50,0x00,0x05,0x13,0x05,0x4b,0x46,0x05,0x05,0x11,0x46,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x3c,0x04,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x3d,0x04,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x05,0x00,0x50,0x00,0x05,0x2c,0x05,0x57,0x46,0x05,0x05,0x2a,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x52,0x05,0x72,0x46,0x05,0x05,0x50,0x46,0x00,0x40,0x06, 0x05,0x00,0x50,0x00,0x05,0x4a,0x05,0x6e,0x46,0x05,0x05,0x48,0x46,0x00,0x40,0x07, 0x05,0x00,0x50,0x00,0x05,0x56,0x05,0x74,0x46,0x05,0x05,0x54,0x46,0x00,0x40,0x07, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x13,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x63,0x04,0x17,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x05, 0x04,0x00,0x50,0x85,0x05,0x6d,0x04,0x52,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x05, 0x04,0x00,0x50,0x85,0x05,0x6b,0x04,0x4a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x05, 0x04,0x00,0x50,0x85,0x05,0x6e,0x04,0x56,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x28, 0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x29, 0x02,0x00,0xa0,0x0a,0x85,0x16,0x05,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x72,0x01,0x20,0x58,0x05,0x14,0x13,0x20,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x14,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x64,0x04,0x1b,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x6c,0x04,0x4e,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x05,0x05,0x05,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x12,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x2c,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x15,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2a, 0x02,0x00,0xa0,0x0a,0x05,0x48,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2b, 0x02,0x00,0xa0,0x0a,0x85,0x48,0x05,0x59,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x73,0x05,0x63,0x58,0x05,0x14,0x17,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x7d,0x05,0x6d,0x58,0x05,0x14,0x52,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x7b,0x05,0x6b,0x58,0x05,0x14,0x4a,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x7e,0x05,0x6e,0x58,0x05,0x14,0x56,0x20,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x69,0x05,0x14,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x17,0x85,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4a,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4a,0x05,0x5a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6d,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x10,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x13,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x65,0x05,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4c,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4c,0x05,0x5b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x49,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x49,0x85,0x59,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x74,0x05,0x64,0x58,0x05,0x14,0x1b,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x7c,0x05,0x6c,0x58,0x05,0x14,0x4e,0x20,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x3d,0x04,0x05,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x3e,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x78,0x01,0x20,0x58,0x05,0x14,0x2c,0x20,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4b,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4b,0x85,0x5a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x4a,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x6f,0x05,0x17,0x46,0x05,0x05,0x6d,0x46,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4e,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4e,0x05,0x5c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x6b,0x05,0x15,0x46,0x05,0x05,0x69,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x05,0x05,0x48,0x46,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x75,0x05,0x75,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x79,0x05,0x79,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x11,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x71,0x05,0x71,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x61,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x67,0x05,0x13,0x46,0x05,0x05,0x65,0x46,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1e,0x85,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1f,0x05,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x20,0x85,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4d,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4d,0x85,0x5b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1c,0x05,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1c,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x4f,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x4f,0x85,0x5c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x49,0x46,0x05,0x05,0x05,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x4e,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x4b,0x46,0x05,0x05,0x0a,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x4c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1f,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x20,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x50,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x50,0x05,0x5d,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x73,0x05,0x73,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x7b,0x05,0x7b,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x77,0x05,0x77,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x2a,0x04,0x6f,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x63,0x05,0x11,0x46,0x05,0x05,0x61,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x28,0x04,0x6b,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x04,0x62,0x00,0x3f,0x11,0x00,0x61,0x00,0x04,0x62,0x60,0x07,0x11,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x19,0x85,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1e,0x85,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1b,0x85,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x33,0x04,0x75,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x34,0x04,0x76,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x37,0x04,0x79,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x38,0x04,0x7a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x2f,0x04,0x71,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x30,0x04,0x72,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x4f,0x46,0x05,0x05,0x12,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x4d,0x46,0x05,0x05,0x0e,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x75,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x79,0x05,0x1c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x71,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x51,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x51,0x85,0x5d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x52,0x05,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x52,0x05,0x5e,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x40,0x04,0x08,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x41,0x04,0x0c,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x50,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x31,0x04,0x73,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x32,0x04,0x74,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x39,0x04,0x7b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x3a,0x04,0x7c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x35,0x04,0x77,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x36,0x04,0x78,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x2a,0x58,0x05,0x14,0x6f,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x28,0x58,0x05,0x14,0x6b,0x20,0x00,0x31,0x9c, 0x03,0x80,0x00,0x00,0x05,0x69,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x73,0x05,0x19,0x46,0x05,0x05,0x71,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x7b,0x05,0x1e,0x46,0x05,0x05,0x79,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x77,0x05,0x1b,0x46,0x05,0x05,0x75,0x46,0x00,0x61,0x3c, 0x04,0x62,0x00,0x58,0x11,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x53,0x85,0x45, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x53,0x85,0x5e, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x43,0x04,0x14, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x42,0x04,0x10, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x18,0x05,0x51, 0x46,0x05,0x05,0x16,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x52, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x50,0x05,0x40, 0x58,0x05,0x14,0x08,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x51,0x05,0x41, 0x58,0x05,0x14,0x0c,0x20,0x00,0x31,0x9d,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3d,0x04,0x62,0x00,0x3f,0x11,0x00,0x61,0x00, 0x04,0x62,0x60,0x29,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x67, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x26,0x04,0x63, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2b,0x04,0x73, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x7b, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2c,0x04,0x77, 0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x1c,0x05,0x53, 0x46,0x05,0x05,0x1a,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x52,0x05,0x42, 0x58,0x05,0x14,0x10,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x53,0x05,0x43, 0x58,0x05,0x14,0x14,0x20,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x05,0x0e,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3e,0x04,0x62,0x00,0x58,0x11,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x49,0x01,0x20,0x58,0x05,0x14,0x67,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x26,0x58,0x05,0x14,0x63,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x2b,0x58,0x05,0x14,0x73,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x2d,0x58,0x05,0x14,0x7b,0x20,0x00,0x40,0x07, 0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x2c,0x58,0x05,0x14,0x77,0x20,0x00,0x31,0x9f, 0x03,0x80,0x00,0x00,0x05,0x26,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x7d,0x05,0x7d,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x54,0x05,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x54,0x05,0x5f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x56,0x05,0x47,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x56,0x05,0x60,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x04,0x00,0x00,0x00,0x85,0x3b,0x04,0x7d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x3c,0x04,0x7e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x7d,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x55,0x85,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x55,0x85,0x5f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x57,0x85,0x47,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x57,0x85,0x60,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x22,0x05,0x56,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x50,0x00,0x05,0x1e,0x05,0x54,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x05,0x00,0x50,0x00,0x05,0x02,0x05,0x20,0x46,0x05,0x05,0x7d,0x46,0x00,0x40,0x03, 0x05,0x00,0x50,0x00,0x05,0x24,0x05,0x57,0x46,0x05,0x05,0x22,0x46,0x00,0x40,0x03, 0x05,0x00,0x50,0x00,0x05,0x20,0x05,0x55,0x46,0x05,0x05,0x1e,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x44,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x45,0x04,0x1c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x04, 0x04,0x00,0x50,0x85,0x05,0x47,0x04,0x24,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x04, 0x04,0x00,0x50,0x85,0x05,0x46,0x04,0x20,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x3e,0x04,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x02,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x54,0x05,0x44,0x58,0x05,0x14,0x18,0x20,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x55,0x05,0x45,0x58,0x05,0x14,0x1c,0x20,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x57,0x05,0x47,0x58,0x05,0x14,0x24,0x20,0x00,0x40,0x06, 0x04,0x00,0x50,0x05,0x05,0x56,0x05,0x46,0x58,0x05,0x14,0x20,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x4f,0x01,0x20,0x58,0x05,0x14,0x02,0x20,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x4a,0x05,0x4a,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x52,0x05,0x52,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x4c,0x05,0x4c,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x54,0x05,0x54,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x06, 0x05,0x00,0x10,0x81,0x05,0x56,0x05,0x56,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2c, 0x02,0x00,0xa0,0x0a,0x05,0x73,0x05,0x6a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x7b,0x05,0x6e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x77,0x05,0x6c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2d, 0x02,0x00,0xa0,0x0a,0x85,0x73,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x77,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x7b,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x7d,0x05,0x6f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x7d,0x05,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x50,0x05,0x50,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x48,0x05,0x48,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x4e,0x05,0x4e,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x71,0x05,0x69,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x75,0x05,0x6b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x79,0x05,0x6d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x74,0x85,0x6a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x7c,0x85,0x6e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x78,0x85,0x6c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x71,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x74,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x75,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x78,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x79,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x7c,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x02,0x85,0x6f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x03,0x05,0x70,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x02,0x85,0x0c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x03,0x05,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5c,0x04,0x4b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x64,0x04,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5d,0x04,0x4c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x65,0x04,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x68,0x04,0x57,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x43,0x05,0x73,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x4b,0x05,0x77,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x53,0x05,0x7b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x57,0x05,0x7d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x2e, 0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x22,0x05,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1e,0x05,0x12,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2f, 0x02,0x00,0xa0,0x0a,0x85,0x16,0x05,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1e,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x22,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1c,0x05,0x11,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1c,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x24,0x05,0x15,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x24,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x20,0x05,0x13,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x20,0x05,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x72,0x85,0x69,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x76,0x85,0x6b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x7a,0x85,0x6d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x05,0x85,0x70,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x72,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x76,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x7a,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x05,0x85,0x0d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5e,0x04,0x4d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x66,0x04,0x55,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x67,0x04,0x56,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x61,0x04,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x59,0x04,0x48,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5f,0x04,0x4e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x60,0x04,0x4f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x3f,0x05,0x71,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x45,0x05,0x74,0x46,0x05,0x05,0x43,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x69,0x05,0x02,0x46,0x05,0x05,0x57,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6b,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x55,0x05,0x7c,0x46,0x05,0x05,0x53,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x75,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x4d,0x05,0x78,0x46,0x05,0x05,0x4b,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x79,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x23,0x85,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1f,0x85,0x12,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x17,0x85,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1b,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1f,0x85,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x23,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x19,0x85,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x1d,0x85,0x11,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x1d,0x85,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x25,0x85,0x15,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x25,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x21,0x85,0x13,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x85,0x21,0x85,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6f,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x07,0x05,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x73,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x02,0x05,0x1e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x7b,0x05,0x1c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x77,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5b,0x04,0x4a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x63,0x04,0x52,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x62,0x04,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x05,0x5a,0x04,0x49,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x41,0x05,0x72,0x46,0x05,0x05,0x3f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x6d,0x05,0x05,0x46,0x05,0x05,0x6b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x51,0x05,0x7a,0x46,0x05,0x05,0x4f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x49,0x05,0x76,0x46,0x05,0x05,0x47,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x23,0x46,0x05,0x05,0x0b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x09,0x05,0x21,0x46,0x05,0x05,0x07,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x7d,0x05,0x1d,0x46,0x05,0x05,0x7b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x11,0x05,0x25,0x46,0x05,0x05,0x0f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x71,0x05,0x17,0x46,0x05,0x05,0x6f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x05,0x05,0x1f,0x46,0x05,0x05,0x02,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x79,0x05,0x1b,0x46,0x05,0x05,0x77,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x75,0x05,0x19,0x46,0x05,0x05,0x73,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x14,0x04,0x45,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x16,0x04,0x4d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x18,0x04,0x55,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x13,0x04,0x41,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1a,0x04,0x6d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x15,0x04,0x49,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x09,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x21,0x04,0x0d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1e,0x04,0x7d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x11,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x51,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x05,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x71,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1d,0x04,0x79,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x19,0x04,0x69,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x75,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x23,0x05,0x14,0x58,0x05,0x14,0x45,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x26,0x05,0x16,0x58,0x05,0x14,0x4d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x18,0x58,0x05,0x14,0x55,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x22,0x05,0x13,0x58,0x05,0x14,0x41,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2a,0x05,0x1a,0x58,0x05,0x14,0x6d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x25,0x05,0x15,0x58,0x05,0x14,0x49,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x20,0x58,0x05,0x14,0x09,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x1e,0x58,0x05,0x14,0x7d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x27,0x01,0x20,0x58,0x05,0x14,0x51,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x1f,0x58,0x05,0x14,0x05,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2b,0x05,0x1b,0x58,0x05,0x14,0x71,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x1d,0x58,0x05,0x14,0x79,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x29,0x05,0x19,0x58,0x05,0x14,0x69,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2c,0x05,0x1c,0x58,0x05,0x14,0x75,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x41,0x05,0x21,0x58,0x05,0x14,0x0d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x42,0x05,0x24,0x58,0x05,0x14,0x11,0x20,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x22,0x05,0x22,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x25,0x05,0x25,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x3f,0x05,0x3f,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x29,0x05,0x29,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x2b,0x05,0x2b,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x41,0x05,0x41,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x59,0x04,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x5b,0x04,0x25,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x5d,0x04,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x65,0x04,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x63,0x04,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x5f,0x04,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x61,0x04,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x04,0x00,0x00,0x00,0x85,0x67,0x04,0x41,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x43,0x05,0x2f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x57,0x05,0x39,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x53,0x05,0x37,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x4b,0x05,0x33,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6b,0x05,0x3b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x35,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6f,0x05,0x3d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x5a,0x04,0x23,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x5c,0x04,0x26,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x5e,0x04,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x66,0x04,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x64,0x04,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x60,0x04,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x62,0x04,0x2c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x00,0x00,0x85,0x68,0x04,0x42,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x73,0x05,0x59,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x77,0x05,0x5b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x7b,0x05,0x5d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x65,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x63,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x02,0x05,0x5f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x07,0x05,0x61,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x13,0x05,0x67,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x45,0x05,0x30,0x46,0x05,0x05,0x43,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x69,0x05,0x3a,0x46,0x05,0x05,0x57,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x55,0x05,0x38,0x46,0x05,0x05,0x53,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x4d,0x05,0x34,0x46,0x05,0x05,0x4b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x6d,0x05,0x3c,0x46,0x05,0x05,0x6b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x51,0x05,0x36,0x46,0x05,0x05,0x4f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x49,0x05,0x32,0x46,0x05,0x05,0x47,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x71,0x05,0x3e,0x46,0x05,0x05,0x6f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x75,0x05,0x5a,0x46,0x05,0x05,0x73,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x79,0x05,0x5c,0x46,0x05,0x05,0x77,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x7d,0x05,0x5e,0x46,0x05,0x05,0x7b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x11,0x05,0x66,0x46,0x05,0x05,0x0f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x64,0x46,0x05,0x05,0x0b,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x05,0x05,0x60,0x46,0x05,0x05,0x02,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x09,0x05,0x62,0x46,0x05,0x05,0x07,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x15,0x05,0x68,0x46,0x05,0x05,0x13,0x46,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x45,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x69,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x55,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x19,0x04,0x4d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1d,0x04,0x6d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1a,0x04,0x51,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x18,0x04,0x49,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1e,0x04,0x71,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x75,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x79,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x21,0x04,0x7d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x11,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x0d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x22,0x04,0x05,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x09,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x85,0x05,0x26,0x04,0x15,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x27,0x01,0x20,0x58,0x05,0x14,0x45,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2c,0x05,0x1c,0x58,0x05,0x14,0x69,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2b,0x05,0x1b,0x58,0x05,0x14,0x55,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x29,0x05,0x19,0x58,0x05,0x14,0x4d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x1d,0x58,0x05,0x14,0x6d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2a,0x05,0x1a,0x58,0x05,0x14,0x51,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x18,0x58,0x05,0x14,0x49,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x1e,0x58,0x05,0x14,0x71,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x2f,0x05,0x1f,0x58,0x05,0x14,0x75,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x30,0x05,0x20,0x58,0x05,0x14,0x79,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x21,0x58,0x05,0x14,0x7d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x25,0x58,0x05,0x14,0x11,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x24,0x58,0x05,0x14,0x0d,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x22,0x58,0x05,0x14,0x05,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x23,0x58,0x05,0x14,0x09,0x20,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x26,0x58,0x05,0x14,0x15,0x20,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x2b,0x05,0x2b,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x29,0x05,0x29,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00, 0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x2f,0x05,0x2f,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x31,0x05,0x31,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x33,0x05,0x33,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07, 0x05,0x00,0x10,0x81,0x05,0x35,0x05,0x35,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x39,0x04,0x2b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x38,0x04,0x29,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x37,0x04,0x27,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x3a,0x04,0x2d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x3b,0x04,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x3c,0x04,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x3d,0x04,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x00,0x00,0x05,0x3e,0x04,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x60,0x81,0x05,0x04,0x84,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x69,0x00, 0x00,0x00,0x60,0x81,0x25,0x04,0x94,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa0, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x04,0x00,0xc0,0x44,0x37,0x00,0x00,0x31,0x00, 0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x1e,0x04, 0x00,0x00,0x45,0x6e,0x63,0x4d,0x42,0x5f,0x49,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00, 0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30, 0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73, 0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72, 0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67, 0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00, 0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33, 0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30, 0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00, 0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34, 0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30, 0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00, 0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35, 0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30, 0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00, 0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36, 0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30, 0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00, 0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36, 0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30, 0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00, 0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37, 0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30, 0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00, 0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38, 0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30, 0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00, 0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39, 0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30, 0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00, 0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30, 0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30, 0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00, 0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30, 0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30, 0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00, 0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31, 0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30, 0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00, 0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32, 0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30, 0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00, 0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33, 0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30, 0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00, 0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34, 0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30, 0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00, 0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34, 0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30, 0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00, 0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35, 0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30, 0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00, 0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36, 0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30, 0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00, 0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37, 0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30, 0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00, 0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38, 0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30, 0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00, 0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38, 0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30, 0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00, 0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39, 0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30, 0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x32, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30, 0x33,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32, 0x30,0x34,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30, 0x32,0x30,0x35,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x32,0x30,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00, 0x56,0x30,0x32,0x30,0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67, 0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e, 0x67,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69, 0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65, 0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x4e,0x6f,0x57,0x69,0x64, 0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x4e,0x6f, 0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x4e, 0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x37,0x00, 0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32, 0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30, 0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00, 0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32, 0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30, 0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00, 0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33, 0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30, 0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00, 0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34, 0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30, 0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00, 0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35, 0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30, 0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00, 0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36, 0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30, 0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00, 0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36, 0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30, 0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00, 0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37, 0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30, 0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00, 0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38, 0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30, 0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00, 0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39, 0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30, 0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00, 0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30, 0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30, 0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00, 0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30, 0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30, 0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00, 0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31, 0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30, 0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00, 0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32, 0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30, 0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00, 0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33, 0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30, 0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00, 0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34, 0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30, 0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00, 0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34, 0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30, 0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00, 0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35, 0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30, 0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00, 0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36, 0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30, 0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00, 0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37,0x31,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x4e,0x6f, 0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x4e, 0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x35,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x36, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37, 0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33, 0x37,0x38,0x00,0x56,0x30,0x33,0x37,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00, 0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38, 0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30, 0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00, 0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39, 0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30, 0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00, 0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30, 0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30, 0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00, 0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30, 0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30, 0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00, 0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31, 0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30, 0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00, 0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32, 0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30, 0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00, 0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33, 0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30, 0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00, 0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34, 0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30, 0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00, 0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34, 0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30, 0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00, 0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35, 0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30, 0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00, 0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36, 0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30, 0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00, 0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37, 0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30, 0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00, 0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38, 0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30, 0x34,0x38,0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00, 0x56,0x30,0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38, 0x38,0x00,0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30, 0x34,0x39,0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00, 0x56,0x30,0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39, 0x36,0x00,0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30, 0x34,0x39,0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00, 0x56,0x30,0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30, 0x34,0x00,0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30, 0x35,0x30,0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00, 0x56,0x30,0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31, 0x32,0x00,0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30, 0x35,0x31,0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00, 0x56,0x30,0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32, 0x30,0x00,0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30, 0x35,0x32,0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00, 0x56,0x30,0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32, 0x38,0x00,0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30, 0x35,0x33,0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00, 0x56,0x30,0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33, 0x36,0x00,0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30, 0x35,0x33,0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00, 0x56,0x30,0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34, 0x34,0x00,0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30, 0x35,0x34,0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00, 0x56,0x30,0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35, 0x32,0x00,0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30, 0x35,0x35,0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00, 0x56,0x30,0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36, 0x30,0x00,0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30, 0x35,0x36,0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00, 0x56,0x30,0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36, 0x38,0x00,0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30, 0x35,0x37,0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00, 0x56,0x30,0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37, 0x36,0x00,0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30, 0x35,0x37,0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00, 0x56,0x30,0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38, 0x34,0x00,0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30, 0x35,0x38,0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00, 0x56,0x30,0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39, 0x32,0x00,0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30, 0x35,0x39,0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00, 0x56,0x30,0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30, 0x30,0x00,0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30, 0x36,0x30,0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00, 0x56,0x30,0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30, 0x38,0x00,0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30, 0x36,0x31,0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00, 0x56,0x30,0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31, 0x36,0x00,0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30, 0x36,0x31,0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00, 0x56,0x30,0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32, 0x34,0x00,0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30, 0x36,0x32,0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00, 0x56,0x30,0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33, 0x32,0x00,0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30, 0x36,0x33,0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00, 0x56,0x30,0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34, 0x30,0x00,0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30, 0x36,0x34,0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00, 0x56,0x30,0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34, 0x38,0x00,0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30, 0x36,0x35,0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00, 0x56,0x30,0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35, 0x36,0x00,0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56,0x30, 0x36,0x35,0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31,0x00, 0x56,0x30,0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36,0x36, 0x34,0x00,0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56,0x30, 0x36,0x36,0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39,0x00, 0x56,0x30,0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36,0x37, 0x32,0x00,0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56,0x30, 0x36,0x37,0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37,0x00, 0x56,0x30,0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36,0x38, 0x30,0x00,0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56,0x30, 0x36,0x38,0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35,0x00, 0x56,0x30,0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36,0x38, 0x38,0x00,0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56,0x30, 0x36,0x39,0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33,0x00, 0x56,0x30,0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36,0x39, 0x36,0x00,0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56,0x30, 0x36,0x39,0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31,0x00, 0x56,0x30,0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37,0x30, 0x34,0x00,0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56,0x30, 0x37,0x30,0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39,0x00, 0x56,0x30,0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37,0x31, 0x32,0x00,0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56,0x30, 0x37,0x31,0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37,0x00, 0x56,0x30,0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37,0x32, 0x30,0x00,0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56,0x30, 0x37,0x32,0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35,0x00, 0x56,0x30,0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37,0x32, 0x38,0x00,0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56,0x30, 0x37,0x33,0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33,0x00, 0x56,0x30,0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37,0x33, 0x36,0x00,0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56,0x30, 0x37,0x33,0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31,0x00, 0x56,0x30,0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37,0x34, 0x34,0x00,0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56,0x30, 0x37,0x34,0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39,0x00, 0x56,0x30,0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37,0x35, 0x32,0x00,0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56,0x30, 0x37,0x35,0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37,0x00, 0x56,0x30,0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37,0x36, 0x30,0x00,0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56,0x30, 0x37,0x36,0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35,0x00, 0x56,0x30,0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37,0x36, 0x38,0x00,0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56,0x30, 0x37,0x37,0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33,0x00, 0x56,0x30,0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37,0x37, 0x36,0x00,0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56,0x30, 0x37,0x37,0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31,0x00, 0x56,0x30,0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37,0x38, 0x34,0x00,0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56,0x30, 0x37,0x38,0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39,0x00, 0x56,0x30,0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37,0x39, 0x32,0x00,0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56,0x30, 0x37,0x39,0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37,0x00, 0x56,0x30,0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38,0x30, 0x30,0x00,0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56,0x30, 0x38,0x30,0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35,0x00, 0x56,0x30,0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38,0x30, 0x38,0x00,0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56,0x30, 0x38,0x31,0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33,0x00, 0x56,0x30,0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38,0x31, 0x36,0x00,0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56,0x30, 0x38,0x31,0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31,0x00, 0x56,0x30,0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38,0x32, 0x34,0x00,0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56,0x30, 0x38,0x32,0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39,0x00, 0x56,0x30,0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38,0x33, 0x32,0x00,0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56,0x30, 0x38,0x33,0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37,0x00, 0x56,0x30,0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38,0x34, 0x30,0x00,0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56,0x30, 0x38,0x34,0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35,0x00, 0x56,0x30,0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38,0x34, 0x38,0x00,0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56,0x30, 0x38,0x35,0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33,0x00, 0x56,0x30,0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38,0x35, 0x36,0x00,0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56,0x30, 0x38,0x35,0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31,0x00, 0x56,0x30,0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38,0x36, 0x34,0x00,0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x56,0x30, 0x38,0x36,0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36,0x39,0x00, 0x56,0x30,0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30,0x38,0x37, 0x32,0x00,0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00,0x56,0x30, 0x38,0x37,0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37,0x37,0x00, 0x56,0x30,0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30,0x38,0x38, 0x30,0x00,0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00,0x56,0x30, 0x38,0x38,0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38,0x35,0x00, 0x56,0x30,0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30,0x38,0x38, 0x38,0x00,0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00,0x56,0x30, 0x38,0x39,0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39,0x33,0x00, 0x56,0x30,0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30,0x38,0x39, 0x36,0x00,0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00,0x56,0x30, 0x38,0x39,0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30,0x31,0x00, 0x56,0x30,0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30,0x39,0x30, 0x34,0x00,0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00,0x56,0x30, 0x39,0x30,0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30,0x39,0x00, 0x56,0x30,0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30,0x39,0x31, 0x32,0x00,0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00,0x56,0x30, 0x39,0x31,0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31,0x37,0x00, 0x56,0x30,0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30,0x39,0x32, 0x30,0x00,0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00,0x56,0x30, 0x39,0x32,0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32,0x35,0x00, 0x56,0x30,0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30,0x39,0x32, 0x38,0x00,0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00,0x56,0x30, 0x39,0x33,0x31,0x00,0x56,0x30,0x39,0x33,0x32,0x00,0x56,0x30,0x39,0x33,0x33,0x00, 0x56,0x30,0x39,0x33,0x34,0x00,0x56,0x30,0x39,0x33,0x35,0x00,0x56,0x30,0x39,0x33, 0x36,0x00,0x56,0x30,0x39,0x33,0x37,0x00,0x56,0x30,0x39,0x33,0x38,0x00,0x56,0x30, 0x39,0x33,0x39,0x00,0x56,0x30,0x39,0x34,0x30,0x00,0x56,0x30,0x39,0x34,0x31,0x00, 0x56,0x30,0x39,0x34,0x32,0x00,0x56,0x30,0x39,0x34,0x33,0x00,0x56,0x30,0x39,0x34, 0x34,0x00,0x56,0x30,0x39,0x34,0x35,0x00,0x56,0x30,0x39,0x34,0x36,0x00,0x56,0x30, 0x39,0x34,0x37,0x00,0x56,0x30,0x39,0x34,0x38,0x00,0x56,0x30,0x39,0x34,0x39,0x00, 0x56,0x30,0x39,0x35,0x30,0x00,0x56,0x30,0x39,0x35,0x31,0x00,0x56,0x30,0x39,0x35, 0x32,0x00,0x56,0x30,0x39,0x35,0x33,0x00,0x56,0x30,0x39,0x35,0x34,0x00,0x56,0x30, 0x39,0x35,0x35,0x00,0x56,0x30,0x39,0x35,0x36,0x00,0x56,0x30,0x39,0x35,0x37,0x00, 0x56,0x30,0x39,0x35,0x38,0x00,0x56,0x30,0x39,0x35,0x39,0x00,0x56,0x30,0x39,0x36, 0x30,0x00,0x56,0x30,0x39,0x36,0x31,0x00,0x56,0x30,0x39,0x36,0x32,0x00,0x56,0x30, 0x39,0x36,0x33,0x00,0x56,0x30,0x39,0x36,0x34,0x00,0x56,0x30,0x39,0x36,0x35,0x00, 0x56,0x30,0x39,0x36,0x36,0x00,0x56,0x30,0x39,0x36,0x37,0x00,0x56,0x30,0x39,0x36, 0x38,0x00,0x56,0x30,0x39,0x36,0x39,0x00,0x56,0x30,0x39,0x37,0x30,0x00,0x56,0x30, 0x39,0x37,0x31,0x00,0x56,0x30,0x39,0x37,0x32,0x00,0x56,0x30,0x39,0x37,0x33,0x00, 0x56,0x30,0x39,0x37,0x34,0x00,0x56,0x30,0x39,0x37,0x35,0x00,0x56,0x30,0x39,0x37, 0x36,0x00,0x56,0x30,0x39,0x37,0x37,0x00,0x56,0x30,0x39,0x37,0x38,0x00,0x56,0x30, 0x39,0x37,0x39,0x00,0x56,0x30,0x39,0x38,0x30,0x00,0x56,0x30,0x39,0x38,0x31,0x00, 0x56,0x30,0x39,0x38,0x32,0x00,0x56,0x30,0x39,0x38,0x33,0x00,0x56,0x30,0x39,0x38, 0x34,0x00,0x56,0x30,0x39,0x38,0x35,0x00,0x56,0x30,0x39,0x38,0x36,0x00,0x56,0x30, 0x39,0x38,0x37,0x00,0x56,0x30,0x39,0x38,0x38,0x00,0x56,0x30,0x39,0x38,0x39,0x00, 0x56,0x30,0x39,0x39,0x30,0x00,0x56,0x30,0x39,0x39,0x31,0x00,0x56,0x30,0x39,0x39, 0x32,0x00,0x56,0x30,0x39,0x39,0x33,0x00,0x56,0x30,0x39,0x39,0x34,0x00,0x56,0x30, 0x39,0x39,0x35,0x00,0x56,0x30,0x39,0x39,0x36,0x00,0x56,0x30,0x39,0x39,0x37,0x00, 0x56,0x30,0x39,0x39,0x38,0x00,0x56,0x30,0x39,0x39,0x39,0x00,0x56,0x31,0x30,0x30, 0x30,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30, 0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37,0x00,0x50,0x30, 0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31, 0x32,0x00,0x50,0x31,0x33,0x00,0x45,0x6e,0x63,0x4d,0x42,0x5f,0x49,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x31,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32, 0x5f,0x33,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72, 0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x75,0x72,0x65,0x6d,0x6a, 0x6a,0x2e,0x36,0x5f,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f, 0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37,0x00, 0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42,0x42, 0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00,0x42, 0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30, 0x37,0x00,0x54,0x30,0x30,0x38,0x00,0x54,0x30,0x30,0x39,0x00,0x54,0x30,0x31,0x30, 0x00,0x54,0x30,0x31,0x31,0x00,0x54,0x30,0x31,0x32,0x00,0x41,0x73,0x6d,0x4e,0x61, 0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72, 0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x1a,0x00,0x00,0x00, 0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x12,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x54,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x55,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xc4,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc8,0x00,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xca,0x00, 0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xcc,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd0,0x00,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd2,0x00, 0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xd4,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xd6,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd8,0x00,0x00,0x00,0x00,0xd9, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xda,0x00, 0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xdc,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0xe1, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe2,0x00, 0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7e,0x01,0x00,0x00,0x00,0x7f,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x00, 0x00,0x81,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x82,0x01,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x84,0x01,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x86,0x01,0x00,0x00,0x00,0x87,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x88,0x01,0x00,0x00, 0x00,0x89,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x8a,0x01,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x8d,0x01,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x54,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00, 0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x51,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02, 0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x02,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00, 0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x24,0x14,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x02,0x00,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x02,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x02,0x00,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02, 0x00,0x00,0x14,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00, 0x00,0x24,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00, 0x21,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x24,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02, 0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x53,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x51,0x38,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x02,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x02,0x00,0x00,0x12,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02, 0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00, 0x00,0x20,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00, 0x20,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x55, 0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x51,0x08, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x51,0x08,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x51,0x08,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x51,0x08,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x51,0x08,0x00,0x37,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x51,0x08,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x51,0x08,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x51,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x02,0x00,0x00,0x51,0x08,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x02,0x00,0x00,0x51,0x08,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x02,0x00,0x00,0x51,0x08,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x02,0x00,0x00,0x51,0x08,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02, 0x00,0x00,0x51,0x08,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00, 0x00,0x51,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00, 0x51,0x08,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x51, 0x08,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x20,0x01, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x55,0x00,0x01, 0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x20,0x01,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x55,0x00,0x01,0x31,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x51,0x08,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x51,0x08,0x00,0x44,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x51,0x08,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x51,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x51,0x08,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x02,0x00,0x00,0x51,0x08,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x02,0x00,0x00,0x51,0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x02,0x00,0x00,0x51,0x08,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02, 0x00,0x00,0x51,0x08,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00, 0x00,0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00, 0x51,0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x51, 0x08,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x51,0x08, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x51,0x08,0x00, 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x51,0x08,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x51,0x08,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x55,0x00,0x01,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x53,0x20,0x00,0x73,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x53,0x20,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x53,0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x02,0x00,0x00,0x53,0x20,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x02,0x00,0x00,0x53,0x20,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x02,0x00,0x00,0x53,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x02,0x00,0x00,0x53,0x20,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02, 0x00,0x00,0x53,0x20,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00, 0x00,0x52,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00, 0x52,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x52, 0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x52,0x20, 0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x52,0x20,0x00, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x52,0x20,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x52,0x20,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x52,0x20,0x00,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x55,0x00,0x01,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x51,0x08,0x00,0x81,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x02,0x00,0x00,0x51,0x08,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x02,0x00,0x00,0x51,0x08,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x02,0x00,0x00,0x51,0x08,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x02,0x00,0x00,0x51,0x08,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02, 0x00,0x00,0x51,0x08,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00, 0x00,0x51,0x08,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00, 0x51,0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x51, 0x08,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x51,0x08, 0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x51,0x08,0x00, 0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x51,0x08,0x00,0x8c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x51,0x08,0x00,0x8d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x51,0x08,0x00,0x8e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x51,0x08,0x00,0x8f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x51,0x08,0x00,0x90,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x02,0x00,0x00,0x55,0x00,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x55,0x00,0x01,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x02,0x00,0x00,0x51,0x08,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x02,0x00,0x00,0x51,0x08,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02, 0x00,0x00,0x51,0x08,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00, 0x00,0x51,0x08,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00, 0x51,0x08,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x51, 0x08,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x51,0x08, 0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x51,0x08,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x51,0x08,0x00,0x99, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x51,0x08,0x00,0x9a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x51,0x08,0x00,0x9b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x51,0x08,0x00,0x9c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x51,0x08,0x00,0x9d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x51,0x08,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x02,0x00,0x00,0x51,0x08,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x02,0x00,0x00,0x51,0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x02,0x00,0x00,0x55,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x02,0x00,0x00,0x53,0x20,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02, 0x00,0x00,0x53,0x20,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00, 0x00,0x53,0x20,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00, 0x53,0x20,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x53, 0x20,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x53,0x20, 0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x53,0x20,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x53,0x20,0x00,0xc8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x52,0x20,0x00,0xc1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x52,0x20,0x00,0xc2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x52,0x20,0x00,0xc3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x52,0x20,0x00,0xc4,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x52,0x20,0x00,0xc5,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x02,0x00,0x00,0x52,0x20,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x02,0x00,0x00,0x52,0x20,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x02,0x00,0x00,0x52,0x20,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x02,0x00,0x00,0x20,0x01,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02, 0x00,0x00,0x55,0x00,0x01,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00, 0x00,0x51,0x08,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x51,0x08,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x51, 0x08,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x51,0x08, 0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x51,0x08,0x00, 0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x51,0x08,0x00,0xe4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x51,0x08,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x51,0x08,0x00,0xe6,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x51,0x08,0x00,0xe7,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x51,0x08,0x00,0xe8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x51,0x08,0x00,0xe9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x03,0x00,0x00,0x51,0x08,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x51,0x08,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x03,0x00,0x00,0x51,0x08,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x03,0x00,0x00,0x51,0x08,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03, 0x00,0x00,0x51,0x08,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00, 0x00,0x55,0x00,0x01,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00, 0x20,0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x55, 0x00,0x01,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x51,0x08, 0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x51,0x08,0x00, 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x51,0x08,0x00,0xf1, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x51,0x08,0x00,0xf2,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x51,0x08,0x00,0xf3,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x51,0x08,0x00,0xf4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x51,0x08,0x00,0xf5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x51,0x08,0x00,0xf6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x03,0x00,0x00,0x51,0x08,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x03,0x00,0x00,0x51,0x08,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x03,0x00,0x00,0x51,0x08,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x03,0x00,0x00,0x51,0x08,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03, 0x00,0x00,0x51,0x08,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00, 0x00,0x51,0x08,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00, 0x51,0x08,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x51, 0x08,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x55,0x00, 0x01,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x53,0x20,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x53,0x20,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x53,0x20,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x53,0x20,0x00,0x22,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x53,0x20,0x00,0x23,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x53,0x20,0x00,0x24,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x53,0x20,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x53,0x20,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x03,0x00,0x00,0x52,0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x03,0x00,0x00,0x52,0x20,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x03,0x00,0x00,0x52,0x20,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03, 0x00,0x00,0x52,0x20,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x52,0x20,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00, 0x52,0x20,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x52, 0x20,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x52,0x20, 0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x55,0x00,0x01, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x51,0x08,0x00,0x2b, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x51,0x08,0x00,0x2c,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x51,0x08,0x00,0x2d,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x51,0x08,0x00,0x2e,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x51,0x08,0x00,0x2f,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x51,0x08,0x00,0x30,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x03,0x00,0x00,0x51,0x08,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x03,0x00,0x00,0x51,0x08,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x03,0x00,0x00,0x51,0x08,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x03,0x00,0x00,0x51,0x08,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03, 0x00,0x00,0x51,0x08,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00, 0x00,0x51,0x08,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00, 0x51,0x08,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x51, 0x08,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x51,0x08, 0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x51,0x08,0x00, 0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x55,0x00,0x01,0x28, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x55,0x00,0x01,0x29,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x51,0x08,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0x51,0x08,0x00,0x3c,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x51,0x08,0x00,0x3d,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x51,0x08,0x00,0x3e,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x03,0x00,0x00,0x51,0x08,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x03,0x00,0x00,0x51,0x08,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x03,0x00,0x00,0x51,0x08,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x03,0x00,0x00,0x51,0x08,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03, 0x00,0x00,0x51,0x08,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00, 0x00,0x51,0x08,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00, 0x51,0x08,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x51, 0x08,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x51,0x08, 0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x51,0x08,0x00, 0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x51,0x08,0x00,0x49, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x51,0x08,0x00,0x4a,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x55,0x00,0x01,0x2a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x03,0x00,0x00,0x53,0x20,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x53,0x20,0x00,0x6c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x53,0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x03,0x00,0x00,0x53,0x20,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x03,0x00,0x00,0x53,0x20,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x03,0x00,0x00,0x53,0x20,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x03,0x00,0x00,0x53,0x20,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03, 0x00,0x00,0x53,0x20,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00, 0x00,0x52,0x20,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00, 0x52,0x20,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x52, 0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x52,0x20, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x52,0x20,0x00, 0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x52,0x20,0x00,0x70, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x52,0x20,0x00,0x71,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x52,0x20,0x00,0x72,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x53,0x20,0x00,0xa3,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x53,0x20,0x00,0xa4,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x03,0x00,0x00,0x53,0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x03,0x00,0x00,0x53,0x20,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x03,0x00,0x00,0x53,0x20,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x03,0x00,0x00,0x53,0x20,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x03,0x00,0x00,0x53,0x20,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03, 0x00,0x00,0x53,0x20,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x52,0x20,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00, 0x52,0x20,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x52, 0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x52,0x20, 0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x52,0x20,0x00, 0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x52,0x20,0x00,0xa8, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x52,0x20,0x00,0xa9,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x52,0x20,0x00,0xaa,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x20,0x01,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x03,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x20,0x01,0x00,0xac,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x03,0x00,0x00,0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x03,0x00,0x00,0x55,0x00,0x01,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x03,0x00,0x00,0x51,0x08,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x03,0x00,0x00,0x51,0x08,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03, 0x00,0x00,0x51,0x08,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x51,0x08,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00, 0x51,0x08,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x51, 0x08,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x51,0x08, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x51,0x08,0x00, 0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x51,0x08,0x00,0xbe, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x51,0x08,0x00,0xbf,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x51,0x08,0x00,0xc0,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x51,0x08,0x00,0xc1,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x51,0x08,0x00,0xc2,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x51,0x08,0x00,0xc3,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x03,0x00,0x00,0x51,0x08,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x03,0x00,0x00,0x51,0x08,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x03,0x00,0x00,0x20,0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x03,0x00,0x00,0x55,0x00,0x01,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03, 0x00,0x00,0x20,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00, 0x00,0x55,0x00,0x01,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00, 0x51,0x08,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x51, 0x08,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x51,0x08, 0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x51,0x08,0x00, 0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x51,0x08,0x00,0xca, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x51,0x08,0x00,0xcb,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x51,0x08,0x00,0xcc,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x51,0x08,0x00,0xcd,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x51,0x08,0x00,0xce,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x51,0x08,0x00,0xcf,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x03,0x00,0x00,0x51,0x08,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x03,0x00,0x00,0x51,0x08,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x03,0x00,0x00,0x51,0x08,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x03,0x00,0x00,0x51,0x08,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03, 0x00,0x00,0x51,0x08,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00, 0x00,0x51,0x08,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00, 0x55,0x00,0x01,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x53, 0x20,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x53,0x20, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x53,0x20,0x00, 0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x53,0x20,0x00,0xf9, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x53,0x20,0x00,0xfa,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x53,0x20,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x53,0x20,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x53,0x20,0x00,0xfd,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x52,0x20,0x00,0xf6,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x03,0x00,0x00,0x52,0x20,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x03,0x00,0x00,0x52,0x20,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x03,0x00,0x00,0x52,0x20,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x03,0x00,0x00,0x52,0x20,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03, 0x00,0x00,0x52,0x20,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00, 0x00,0x52,0x20,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00, 0x52,0x20,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x20, 0x01,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x20,0x01, 0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x12,0x01,0x00, 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x51,0x08,0x00,0x05, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x20,0x01,0x00,0x06,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x20,0x01,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x23,0x02,0x00,0x03,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x21,0x02,0x00,0x1e,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x21,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x03,0x00,0x00,0x20,0x01,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x03,0x00,0x00,0x55,0x40,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x03,0x00,0x00,0x04,0x01,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x03,0x00,0x00,0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03, 0x00,0x00,0x20,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00, 0x00,0x24,0x10,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00, 0x20,0x01,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x55, 0x20,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x23,0x08, 0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x21,0x07,0x00, 0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x21,0x02,0x00,0x3c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x20,0x01,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x04,0x01,0x00,0x23,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x20,0x01,0x00,0xff,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x20,0x01,0x00,0x24,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x55,0x20,0x00,0x25,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x03,0x00,0x00,0x20,0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x03,0x00,0x00,0x55,0x10,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x03,0x00,0x00,0x21,0x05,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x20,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03, 0x00,0x00,0x20,0x01,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00, 0x00,0x51,0x08,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00, 0x20,0x01,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x55, 0x20,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x53,0x10, 0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x13,0x04,0x00, 0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x53,0x10,0x00,0x33, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x13,0x04,0x00,0x34,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x24,0x14,0x00,0x38,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x13,0x08,0x00,0x36,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x53,0x40,0x00,0x41,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x23,0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x23,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x03,0x00,0x00,0x51,0x20,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x03,0x00,0x00,0x55,0x80,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x03,0x00,0x00,0x13,0x01,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03, 0x00,0x00,0x54,0x40,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00, 0x00,0x25,0x08,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00, 0x55,0x40,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x05, 0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x05,0x01, 0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x25,0x08,0x00, 0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x53,0x20,0x00,0x49, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x23,0x0a,0x00,0x38,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x51,0x08,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x51,0x40,0x00,0x4c,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x21,0x01,0x00,0x4a,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x53,0x70,0x00,0x50,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x03,0x00,0x00,0x20,0x01,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x03,0x00,0x00,0x21,0x01,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x03,0x00,0x00,0x55,0xe0,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x03,0x00,0x00,0x51,0x10,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03, 0x00,0x00,0x24,0x04,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00, 0x00,0x55,0x40,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00, 0x53,0x20,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x20, 0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x50,0x08, 0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x50,0x08,0x00, 0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x51,0x08,0x00,0x58, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x51,0x08,0x00,0x5a,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x51,0x08,0x00,0x5c,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x51,0x08,0x00,0x5e,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x51,0x08,0x00,0x60,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x03,0x00,0x00,0x51,0x08,0x00,0x62,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x03,0x00,0x00,0x51,0x08,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x03,0x00,0x00,0x51,0x08,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x03,0x00,0x00,0x21,0x01,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0x20,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03, 0x00,0x00,0x21,0x01,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00, 0x00,0x20,0x01,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00, 0x20,0x01,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0xfb, 0x03,0x00,0x00,0x01,0x00,0x00,0xfc,0x03,0x00,0x00,0x01,0x00,0x00,0xfd,0x03,0x00, 0x00,0x01,0x00,0x00,0xfe,0x03,0x00,0x00,0x01,0x00,0x00,0xff,0x03,0x00,0x00,0x01, 0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x00,0x00,0x01,0x04,0x00,0x00,0x08,0x00,0x00, 0x02,0x04,0x00,0x00,0x01,0x00,0x00,0x03,0x04,0x00,0x00,0x08,0x00,0x00,0x04,0x04, 0x00,0x00,0x01,0x00,0x00,0x05,0x04,0x00,0x00,0x10,0x00,0x00,0x06,0x04,0x00,0x00, 0x08,0x00,0x00,0x07,0x04,0x00,0x00,0x01,0x00,0x00,0x0c,0x00,0x08,0x04,0x00,0x00, 0x01,0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x00,0x00,0x0b,0x04, 0x00,0x00,0x01,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x00,0x00, 0x0e,0x04,0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00, 0x00,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x07,0x14,0x04,0x00,0x00,0x01,0x00,0x00,0x15,0x04,0x00, 0x00,0x01,0x00,0x00,0x16,0x04,0x00,0x00,0x01,0x00,0x00,0x17,0x04,0x00,0x00,0x01, 0x00,0x00,0x18,0x04,0x00,0x00,0x01,0x00,0x00,0x19,0x04,0x00,0x00,0x01,0x00,0x00, 0x1a,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00, 0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x02,0x0b,0x00,0x00,0x00,0x34,0x00, 0x04,0x00,0x2a,0x0c,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x20,0x20,0x00,0x00,0x00, 0x40,0x00,0x10,0x00,0x2f,0x68,0x00,0x00,0xf4,0x53,0x00,0x00,0x03,0x00,0x1b,0x04, 0x00,0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x73,0x69,0x6d,0x70,0x6c,0x65,0x5f,0x6d, 0x65,0x5f,0x32,0x2e,0x61,0x73,0x6d,0x1c,0x04,0x00,0x00,0x00,0x1d,0x04,0x00,0x00, 0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x03,0x00, 0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00, 0x06,0x05,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00, 0x12,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x04,0x02,0x01,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x14,0x21,0x01, 0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x01,0x00,0x2c,0x00,0x00,0x02, 0x02,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x04,0x00,0x00, 0x00,0x32,0x00,0x02,0x80,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x77,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x79, 0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x88,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x8b,0x02,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x7c,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7e,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x81,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x84,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x86,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x89,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x8d,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x9e,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x8e,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x94,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x32,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x99,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x9c,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x62,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xa4,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa5, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x61,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa6,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x62, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xa7,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xab,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xaf,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xb0,0x02,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb2,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb5,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xba,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbd,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00,0x37,0x00,0x07, 0x00,0x10,0x10,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0xc2,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0xb1,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e, 0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb3,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xb4,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x7e,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb6,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xb9,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e, 0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbb,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xbc,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x05, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x7e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbe,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xc3,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xc4,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcc,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd1,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0xd4,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xc4,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xc5,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xca,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcc,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xcd,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x80,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcf,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xd2,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x85,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x89,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x9d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xb0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xb1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb5,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbd,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xd5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa1,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa2,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa3,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xb6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xb8,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xda,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xdb, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xae,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xdc,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xaf,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xdc,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb0, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xdd,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xe1,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc3,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc4, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc8, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x77,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xe6,0x02,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe8,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xda,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xee,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xda,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf3,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xf7,0x02,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xe9,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb, 0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xdb,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xf1,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb, 0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf3,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xf4,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xdb,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf6,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf8,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xf9,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xfa,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xff,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdd,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x02,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x07,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdd,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x0a,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xfd,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x02,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x08,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe1,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe3,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe5,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe7,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xea,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xfb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfd, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x0b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xff,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x01,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x16,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x18,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x10,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x11, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x0c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x12,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x0d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x12,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x0e, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x13,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x17,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x1a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xaf,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x1b, 0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x1d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x25,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x04,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2a,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00, 0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xc1,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x03,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x20,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28, 0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x03, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x28,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x28,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28, 0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2a,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x2b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x07, 0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xaf,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2f,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x32,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x37,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3a,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x07,0x04,0x22, 0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3e,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x30,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x32,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x35,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x38,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3a,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x3b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3d,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x37,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x52,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x61,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x3f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4c,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x40,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x4d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x68,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4e,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x41,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x41, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x42,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x51,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x42,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x52, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x43,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x69,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25, 0x05,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x48,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x49,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0x6b,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x75,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6f,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0x6f,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x7d,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x70, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7f,0x01,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x72,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x01, 0x05,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x89,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x75,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x77,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x79,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x95,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x99,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x50,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x51, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x52,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x89,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x52,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x53,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8c,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8e,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x90,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xa2,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25, 0x05,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x59,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x5d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5d,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29, 0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa6, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xab,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x38, 0x00,0x08,0x00,0x10,0x10,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x60, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xab,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x02,0x00,0x31,0x01,0x00,0x2c,0x00,0x00,0x02,0x03,0x00,0x00,0x26,0x00,0x00, 0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x80,0x02, 0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xae,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00, 0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x63,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0, 0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb0,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x6e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0, 0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb0,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x75,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x64,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x67,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2, 0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x6a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb2,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x6f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2, 0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x72,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb2,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xb3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x61,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x77,0x03,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x79,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x7c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7e,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x03, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb4,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x81,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x86,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x87,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x07, 0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x74,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x76,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x88,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb5,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7c,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x7f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5, 0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x81,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x82,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb5,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x84,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x87,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdd, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xde,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xca,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xce,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd0,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xec,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe7,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xd8,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe9,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xd9,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x8b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xda,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x8b,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8c, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xdd,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xde,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8d,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8e,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe0,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe1,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe2,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe3,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe4,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe5,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x25,0x05,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00, 0x00,0x00,0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x93,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00, 0x00,0x25,0x05,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00, 0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x97,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x98,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00, 0x00,0x29,0x05,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfe,0x01,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xfe,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfe,0x01, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x06,0x00, 0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xfe,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x38,0x00,0x08,0x00,0x10,0x10,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xfe,0x01,0x00,0x00,0x00,0x00,0x31, 0x02,0x00,0x24,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x10,0x21,0x01, 0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x33,0x00,0x00,0x00,0x03,0x00,0x24,0x00,0x00,0x00,0x00,0x02,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x0a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00, 0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x02,0x00,0x08,0x02,0x05,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x02,0x00,0x00,0x00,0x37,0x00,0x0c,0x00,0x04,0x01,0x00,0x9d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x07,0x02,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00, 0x00,0x02,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00, 0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x05,0x00,0x31,0x04,0x00,0x29,0x00,0x00,0x00, 0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x7b,0x00,0x0b,0x02,0x00, 0x00,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x05,0x00,0x06,0x00, 0x18,0x02,0x0a,0x02,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x37,0x00,0x0c,0x00,0x04,0x01,0x00,0x9d,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00, 0x00,0x02,0x05,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00, 0x00,0x00,0x00,0x32,0x00,0x05,0x80,0x04,0x00,0x31,0x05,0x00,0x29,0x00,0x00,0x00, 0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00, 0x05,0x00,0x03,0x00,0x08,0x02,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x03,0x1c,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1c,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x22,0x22,0x22,0x22,0x29,0x01,0x00,0x00,0x00,0xa0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x01,0x02,0x06,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x06,0x80,0x06,0x00,0x24,0x00,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xc0, 0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0xa3,0x03,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xa0,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x02, 0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa3,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x05,0x1f,0x00,0x00,0x00,0x2c,0x03, 0x01,0x02,0x07,0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x00, 0x00,0x00,0x00,0x2a,0x03,0x07,0x00,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x05,0x22,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x37,0x00,0x08,0x00,0x04, 0x10,0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa6,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x18,0x02,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xa7,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x03,0x24,0x01,0x24, 0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x37,0x00,0x08,0x01,0x04, 0x08,0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xa9,0x03,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xaa,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x02,0x00,0x00,0x00,0x01,0x23,0x01,0x29, 0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x7c,0x00, 0x00,0x00,0x31,0x06,0x00,0x29,0x02,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xab,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0xab,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x01,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x3b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x6c,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x22,0x22,0x22,0x22, 0x29,0x01,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x08,0x00,0x00,0x68,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x08,0x00,0x0b, 0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x3c,0x02,0x00,0x0a, 0x00,0xad,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x02,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x05,0x1f,0x00,0x00,0x00,0x2c,0x03,0x01,0x02,0x09, 0x00,0x00,0xae,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x00,0x00,0x00,0x00, 0x2a,0x03,0x09,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x22, 0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x00,0x00,0x00, 0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x32, 0x00,0x06,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0xff,0x37,0x00,0x08,0x00,0x20,0x01,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xb1,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x06, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xab,0x03,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x25,0x02,0x00,0x00, 0x00,0x04,0x22,0x01,0x24,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x01, 0x10,0x01,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0xb3,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xb4, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x27,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x32,0x00,0x00,0x00,0x0a,0x00,0x31,0x07,0x00,0x01, 0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x00,0x20,0x01,0x00,0xb5,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2a, 0x02,0x00,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x0a,0x00,0x00,0x21,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x12,0x21,0x01,0x32,0x00,0x0a, 0x00,0x08,0x00,0x29,0x02,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xab,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb7,0x03,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x03,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0x2a,0x02,0x00, 0x00,0x00,0x13,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x00,0x00,0x09, 0x00,0x31,0x08,0x00,0x29,0x02,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xab, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb7,0x03,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xb7,0x03, 0x00,0x00,0x00,0x06,0x21,0x01,0x31,0x09,0x00,0x24,0x00,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0xff,0x37,0x00,0x08,0x01,0x20,0x01,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xb9,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2d,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x31,0x0a, 0x00,0x29,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x30, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x20,0x04,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x04,0x01,0x02, 0x0b,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x2a,0x04,0x0b,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x00, 0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x37,0x02, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x2a, 0x04,0x0b,0x00,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00, 0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xbd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x02,0x00,0x00,0x00,0x10,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xbe,0x03,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x20,0x03,0x00, 0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x03,0x00,0x02,0x0c,0x00,0x00, 0x35,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x03, 0x0c,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x02,0x00,0x00, 0x00,0x14,0x22,0x01,0x00,0x37,0x02,0x00,0x00,0x00,0x13,0x21,0x01,0x29,0x03,0x00, 0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0x36,0x02,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x03,0x7c,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x0b,0x00,0x29, 0x03,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x00,0x10, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x00,0xa8,0x00,0x29,0x03, 0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x01,0x07,0x00,0x02,0x05,0x01, 0x60,0x00,0x40,0x00,0x29,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x01,0x01,0x00, 0x02,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x41,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xc1,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00, 0x05,0x00,0x02,0x00,0xc2,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x41,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x05,0x00,0x02,0x00, 0xc3,0x03,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x41,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00, 0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0xc3,0x03,0x00,0x00, 0x00,0x02,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xc4,0x03,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0xfe,0xff,0xff,0xff, 0x29,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x01,0x07,0x00,0x02,0x00,0xc3,0x03, 0x00,0x00,0x00,0x07,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x01, 0x1c,0x00,0x02,0x00,0xc4,0x03,0x00,0x00,0x01,0x1c,0x21,0x01,0x05,0x05,0x7f,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x04,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x3f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x78,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x03,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x08,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0xc5,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x74,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x20,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x01,0x1d,0x00,0x02,0x00,0x40,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00, 0x41,0x02,0x00,0x00,0x02,0x04,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x01,0x04,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x48, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xc3,0x03,0x00,0x00,0x03,0x06,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x01,0x07,0x00,0x02,0x00,0x37,0x02, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x01, 0x02,0x00,0x02,0x00,0xab,0x03,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0xab,0x03,0x00,0x00,0x00,0x05, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00, 0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x25,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e, 0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x04,0x04,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x03,0x00,0x00,0x00, 0x03,0x21,0x01,0x05,0x05,0xf0,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0xc8,0x03, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x46,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x05,0x04, 0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc7,0x03,0x00,0x00,0x00,0x07,0x21,0x01,0x05,0x05,0xf0,0xff,0xff,0xff, 0x21,0x00,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x00,0x11,0x00,0x02,0x00,0x47,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xca,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x01,0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x00,0x12,0x00,0x02,0x00,0xcb,0x03,0x00, 0x00,0x00,0x05,0x23,0x01,0x29,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x0a, 0x00,0x02,0x00,0xcd,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x49,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xce,0x03,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x02,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1c, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x49,0x02,0x00,0x00, 0x01,0x04,0x00,0x02,0x00,0x38,0x02,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x41,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xcf,0x03, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x49,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x2d,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x09,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x20,0x78, 0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0xd2,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x4c,0x02,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0xf8,0xc0,0x1f,0x1f,0x20,0x02,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4d,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4d,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x4d,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x21,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x04,0x0e,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x4d,0x02, 0x00,0x00,0x00,0x03,0x21,0x01,0x05,0x05,0x80,0xff,0xff,0xff,0x29,0x01,0x00,0x00, 0x00,0xd5,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x50,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x20,0x00,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x50,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xd1,0x03,0x00,0x00, 0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x00,0x09,0x00, 0x02,0x00,0xd1,0x03,0x00,0x00,0x00,0x06,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x52, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x36,0x02,0x0a,0x00,0xd9,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x51,0x02,0x00,0x00,0x00,0x00,0x5c,0x01,0x01,0x03,0x00,0x00,0x00,0x53, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x56,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x20,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x54,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x7f,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00, 0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01, 0xbf,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x05,0x00, 0x02,0x05,0x01,0xdf,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x05,0x01,0xef,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x55, 0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01,0xf7,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x01,0xfb,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0xfd, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0xfe,0x00,0x00,0x00,0x73,0x08,0x03,0x00,0x00,0x0c,0xda,0x03,0x00,0x00, 0x00,0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x0a,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00, 0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x58,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xdd, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x21,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02, 0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x53,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x5d, 0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02, 0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0x53,0x02,0x00,0x00, 0x00,0x02,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05, 0x00,0x01,0x00,0x08,0x02,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xdf, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x03,0x21,0x01, 0x00,0x53,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x5e,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xe0,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21, 0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00, 0x00,0x00,0x04,0x21,0x01,0x00,0x53,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x5d,0x00, 0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x60, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0x53,0x02,0x00,0x00,0x00, 0x05,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00, 0x01,0x00,0x08,0x02,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xe2,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x00, 0x53,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x64,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xe3,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00, 0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00, 0x00,0x07,0x21,0x01,0x00,0x53,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x5d,0x00,0x04, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x66,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x03, 0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x72,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x69,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe5,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6a, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x6b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07, 0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x70,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c, 0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x70,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xe6,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x0d,0x00,0x00,0x68, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2a,0x00,0x0d,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xe6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0xe4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00, 0x00,0x61,0x01,0x03,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x04,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x05, 0x62,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x02,0x18,0x02,0x65,0x00,0x00,0x80,0x10,0x82,0x06, 0x61,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x31,0xb1,0x03,0x80,0x00,0x00,0x05, 0x66,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x80,0x10,0x82,0xa6, 0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x61,0x02,0x00,0x00,0x20,0x01,0x05, 0x6c,0x04,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x80,0x10,0x81,0x15, 0x61,0xa4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x01,0x00,0x00,0x60,0x01,0x25, 0x6c,0x14,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x50,0x80,0x25, 0x61,0x94,0x62,0x00,0x05,0x01,0x00,0x01,0x00,0x5b,0x01,0x00,0x00,0x20,0x02,0x44, 0x61,0x04,0x6c,0x01,0x01,0x14,0x61,0x24,0x61,0x70,0x21,0x00,0x00,0x50,0x84,0x01, 0x00,0xa4,0x66,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xb8,0x2d,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x84,0x01, 0x00,0xa4,0x66,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x37,0x00,0x00,0x69,0x07,0x01,0x00,0x60,0x86,0x85, 0x02,0x05,0x6c,0x22,0x05,0x06,0x00,0x06,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f, 0x00,0x61,0x04,0x03,0x62,0x58,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25, 0x03,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x1c,0x68,0x5a,0x02,0x01, 0x01,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x40,0x00,0x25,0x68,0x72,0x02,0x01,0x01,0x01,0x32,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x02,0x03,0x62,0x00,0x1c,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x25, 0x1c,0x84,0x02,0x00,0x05,0x30,0x00,0x30,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05, 0x1d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x33,0x03,0x62,0x58,0x02,0x11, 0x00,0x61,0x04,0x03,0x62,0x60,0x25,0x11,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05, 0x26,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x34,0x03,0x62,0x00,0x1c,0x11, 0x00,0x31,0x95,0x03,0x80,0x00,0x00,0x05,0x3e,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x35,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x05,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x05,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x06,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x23,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x05,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x16,0x05,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x85,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0x05,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x04,0x05,0x00,0x50,0x00,0x05,0x4a,0x05,0x0e,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x17,0x85,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x05,0x00,0x50,0x00,0x05,0x5a,0x05,0x16,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x24,0x02,0x00,0xa0,0x0a,0x05,0x30,0x05,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x25,0x02,0x00,0xa0,0x0a,0x85,0x30,0x05,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x06,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x07,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x85,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x12,0x05,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4e,0x05,0x10,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x4c,0x05,0x0f,0x46,0x05,0x05,0x4a,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x31,0x85,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x31,0x85,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5c,0x05,0x17,0x46,0x05,0x05,0x5a,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x30,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x07,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x08,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x05,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x13,0x85,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x14,0x05,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1b,0x85,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x52,0x05,0x12,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x50,0x05,0x11,0x46,0x05,0x05,0x4e,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x1a,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x85,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2e,0x05,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x32,0x05,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x36,0x05,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x38,0x05,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2e,0x05,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x05,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x05,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x38,0x05,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5e,0x05,0x18,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x31,0x46,0x05,0x05,0x0e,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x08,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x85,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x15,0x85,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x46,0x05,0x0c,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x56,0x05,0x14,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x54,0x05,0x13,0x46,0x05,0x05,0x52,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x5c,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x1b,0x46,0x05,0x05,0x06,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2f,0x85,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x85,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x34,0x05,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x37,0x85,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x39,0x85,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x85,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x85,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x34,0x05,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x37,0x85,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x39,0x85,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x2e,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1f,0x05,0x38,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x19,0x46,0x05,0x05,0x5e,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x32,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x36,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x48,0x05,0x0d,0x46,0x05,0x05,0x46,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x58,0x05,0x15,0x46,0x05,0x05,0x56,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x35,0x85,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3a,0x05,0x2c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3c,0x05,0x2d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x85,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3a,0x05,0x44,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3c,0x05,0x45,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x34,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x21,0x05,0x39,0x46,0x05,0x05,0x1f,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x1d,0x05,0x37,0x46,0x05,0x05,0x1a,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x2f,0x46,0x05,0x05,0x0a,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x33,0x46,0x05,0x05,0x12,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x41,0x01,0x20,0x58,0x05,0x14,0x5c,0x20, 0x00,0x40,0x00,0x5c,0x68,0x5a,0x02,0x01,0x02,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x32,0x04,0x04,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x33,0x04,0x08,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x3b,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x3d,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x3b,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x3d,0x85,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x23,0x05,0x3a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x28,0x05,0x3c,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x18,0x05,0x35,0x46,0x05,0x05,0x16,0x46,0x00,0x61,0x07,0x03,0x62,0x00,0x5c,0x11, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2e,0x04,0x50,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x30,0x04,0x58,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x39,0x04,0x21,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x38,0x04,0x1d,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2f,0x04,0x54,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x34,0x04,0x0c,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2c,0x04,0x48,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x4c,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x10,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x42,0x05,0x32,0x58,0x05,0x14,0x04,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x43,0x05,0x33,0x58,0x05,0x14,0x08,0x20, 0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x3b,0x46,0x05,0x05,0x23,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2a,0x05,0x3d,0x46,0x05,0x05,0x28,0x46, 0x00,0x61,0x36,0x03,0x62,0x20,0x1c,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3e,0x05,0x2e,0x58,0x05,0x14,0x50,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x40,0x05,0x30,0x58,0x05,0x14,0x58,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3f,0x05,0x2f,0x58,0x05,0x14,0x54,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x44,0x05,0x34,0x58,0x05,0x14,0x0c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3c,0x05,0x2c,0x58,0x05,0x14,0x48,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x45,0x01,0x20,0x58,0x05,0x14,0x10,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3d,0x05,0x2d,0x58,0x05,0x14,0x4c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x48,0x05,0x38,0x58,0x05,0x14,0x1d,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x49,0x05,0x39,0x58,0x05,0x14,0x21,0x20,0x00,0x31,0x97,0x03,0x80,0x00,0x00,0x05, 0x1d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01, 0x20,0x04,0x26,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x3b,0x04,0x2a,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x37,0x03,0x62,0x00,0x5c,0x11, 0x00,0x61,0x00,0x03,0x62,0x60,0x25,0x11,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x42,0x05,0x42,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x40,0x05,0x40,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x3e,0x05,0x3e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x44,0x05,0x44,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x3c,0x05,0x3c,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x4a,0x01,0x20,0x58,0x05,0x14,0x26,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05, 0x4b,0x05,0x3b,0x58,0x05,0x14,0x2a,0x20,0x00,0x31,0x98,0x03,0x80,0x00,0x00,0x05, 0x25,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x38,0x03,0x62,0x20,0x1c,0x11, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x52,0x04,0x42,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x53,0x04,0x43,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x50,0x04,0x40,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x51,0x04,0x41,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x4e,0x04,0x3e,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x4f,0x04,0x3f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x54,0x04,0x44,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x4d,0x04,0x3d,0x20,0x00,0x00,0x00,0x00, 0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x14,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x37,0x04,0x18,0x20,0x05,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x48,0x05,0x48,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x4a,0x05,0x4a,0x46,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x46,0x01,0x20,0x58,0x05,0x14,0x14,0x20, 0x00,0x40,0x04,0x04,0x00,0x50,0x05,0x05,0x47,0x05,0x37,0x58,0x05,0x14,0x18,0x20, 0x00,0x61,0x26,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x05,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x27,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x05,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x05,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x06,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x07,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x85,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0x05,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x12,0x05,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x59,0x04,0x49,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x5a,0x04,0x4a,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x46,0x05,0x46,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x49,0x05,0x0e,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x05,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x16,0x05,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x06,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x07,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x85,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x13,0x85,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x08,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x14,0x05,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x05,0x10,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5d,0x05,0x0f,0x46,0x05,0x05,0x49,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x12,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x55,0x04,0x45,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x85,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x17,0x85,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x56,0x04,0x46,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x16,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x45,0x05,0x0c,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x08,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x15,0x85,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x28,0x02,0x00,0xa0,0x0a,0x05,0x2f,0x05,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x29,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x05,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x11,0x46,0x05,0x05,0x5f,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x13,0x46,0x05,0x05,0x06,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x14,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x58,0x04,0x48,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x85,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x57,0x04,0x47,0x20,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x17,0x46,0x05,0x05,0x0e,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x18,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x0d,0x46,0x05,0x05,0x45,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1b,0x85,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x30,0x85,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x31,0x05,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x05,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x30,0x85,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x31,0x05,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x05,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1f,0x05,0x2f,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x1a,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x15,0x46,0x05,0x05,0x0a,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2d,0x05,0x25,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x37,0x05,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2d,0x05,0x3d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x37,0x05,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x19,0x46,0x05,0x05,0x12,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x32,0x85,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x34,0x85,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x35,0x05,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x85,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x34,0x85,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x05,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x23,0x05,0x31,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x21,0x05,0x30,0x46,0x05,0x05,0x1f,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x18,0x05,0x1b,0x46,0x05,0x05,0x16,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x33,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2e,0x85,0x25,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x38,0x85,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x39,0x05,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2e,0x85,0x3d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x38,0x85,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x39,0x05,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x37,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x2d,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x4c,0x04,0x3c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x36,0x85,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3a,0x85,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3b,0x05,0x2c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x85,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3b,0x05,0x44,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x25,0x05,0x32,0x46,0x05,0x05,0x23,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3c,0x85,0x2c,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x34,0x46,0x05,0x05,0x27,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x35,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3a,0x85,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x18,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x1d,0x05,0x2e,0x46,0x05,0x05,0x1a,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x38,0x46,0x05,0x05,0x2f,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x33,0x05,0x39,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3c,0x85,0x44,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x36,0x46,0x05,0x05,0x2b,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x37,0x05,0x3b,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x04,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x3a,0x46,0x05,0x05,0x33,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x0f,0x01,0x20,0x58,0x05,0x14,0x18,0x20, 0x00,0x40,0x03,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x3c,0x46,0x05,0x05,0x37,0x46, 0x00,0x40,0x00,0x18,0x68,0x72,0x02,0x01,0x02,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x3e,0x04,0x08,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x3f,0x04,0x0c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x40,0x04,0x10,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01, 0x20,0x04,0x04,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x41,0x04,0x14,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x45,0x04,0x25,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x46,0x04,0x29,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x43,0x04,0x1d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x44,0x04,0x21,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62,0x58,0x02,0x11, 0x00,0x61,0x07,0x03,0x62,0x60,0x18,0x11,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05, 0x5b,0x04,0x4b,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x3b,0x04,0x47,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x3c,0x04,0x5d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x5f,0x04,0x39,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x4b,0x04,0x35,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x0b,0x05,0x3e,0x58,0x05,0x14,0x08,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x0c,0x05,0x3f,0x58,0x05,0x14,0x0c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x0a,0x01,0x20,0x58,0x05,0x14,0x04,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x0e,0x05,0x41,0x58,0x05,0x14,0x14,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x12,0x05,0x45,0x58,0x05,0x14,0x25,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x13,0x05,0x46,0x58,0x05,0x14,0x29,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x0d,0x05,0x40,0x58,0x05,0x14,0x10,0x20,0x00,0x40,0x00,0x3d,0x68,0x72,0x02,0x01, 0x03,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x10,0x05,0x43,0x58,0x05,0x14,0x1d,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x11,0x05,0x44,0x58,0x05,0x14,0x21,0x20, 0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x1d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x3a,0x03,0x62,0x00,0x1c,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x06,0x05,0x3b,0x58,0x05,0x14,0x47,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x07,0x05,0x3c,0x58,0x05,0x14,0x5d,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x17,0x05,0x5f,0x58,0x05,0x14,0x39,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x16,0x05,0x4b,0x58,0x05,0x14,0x35,0x20,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x05, 0x35,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3b,0x03,0x62,0x58,0x02,0x11, 0x00,0x61,0x07,0x03,0x62,0x60,0x3d,0x11,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x0e,0x05,0x0e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x12,0x05,0x12,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x0c,0x05,0x0c,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x10,0x05,0x10,0x46,0x01,0x02,0x00,0x02,0x00,0x31,0xec,0x03,0x80,0x00,0x00,0x05, 0x3e,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3c,0x03,0x62,0x00,0x1c,0x11, 0x00,0x61,0x06,0x04,0x00,0x00,0x00,0x85,0x4f,0x04,0x0b,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x04,0x00,0x00,0x00,0x85,0x52,0x04,0x0e,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x53,0x04,0x0f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x56,0x04,0x12,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x50,0x04,0x0c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x51,0x04,0x0d,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x54,0x04,0x10,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x55,0x04,0x11,0x20,0x00,0x00,0x00,0x00, 0x00,0x31,0x9d,0x03,0x80,0x00,0x00,0x05,0x0b,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x31,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x49,0x04,0x2d,0x20,0x05,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x06,0x05,0x06,0x46,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x15,0x01,0x20,0x58,0x05,0x14,0x31,0x20, 0x00,0x61,0x2b,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x05,0x3a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x30,0x85,0x3a,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x05,0x04,0x00,0x50,0x05,0x05,0x14,0x05,0x49,0x58,0x05,0x14,0x2d,0x20, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2d,0x05,0x39,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2e,0x85,0x39,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x4c,0x04,0x06,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x05,0x3c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x34,0x85,0x3c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x31,0x05,0x3b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x85,0x3b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x2c,0x02,0x00,0xa0,0x0a,0x05,0x46,0x05,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4a,0x05,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x47,0x85,0x3e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x48,0x05,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4b,0x85,0x40,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x5d,0x05,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x5f,0x05,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x04,0x85,0x42,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x05,0x05,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x06,0x85,0x43,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x49,0x85,0x3f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x4e,0x04,0x0a,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x4d,0x04,0x07,0x20,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x14,0x05,0x14,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x2d,0x02,0x00,0xa0,0x0a,0x85,0x46,0x05,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4a,0x05,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x47,0x85,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x48,0x05,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x04,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x46,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4b,0x85,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x5d,0x05,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x05,0x00,0x50,0x00,0x05,0x42,0x05,0x4a,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x49,0x85,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x5f,0x05,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x3e,0x05,0x48,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x3b,0x05,0x47,0x46,0x05,0x05,0x39,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x5e,0x85,0x41,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x08,0x85,0x44,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x09,0x05,0x45,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0a,0x85,0x45,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x07,0x05,0x44,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x5e,0x85,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x05,0x05,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x46,0x05,0x5d,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x44,0x05,0x4b,0x46,0x05,0x05,0x42,0x46, 0x00,0x61,0x2a,0x02,0x00,0xa0,0x0a,0x05,0x25,0x05,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x27,0x05,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x25,0x05,0x35,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x27,0x05,0x36,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x04,0x85,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x40,0x05,0x49,0x46,0x05,0x05,0x3e,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4a,0x05,0x5f,0x46,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x16,0x05,0x16,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2b,0x05,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2b,0x05,0x38,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x06,0x85,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x48,0x05,0x5e,0x46,0x05,0x05,0x46,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x05,0x05,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x57,0x04,0x13,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x26,0x85,0x1d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x28,0x85,0x1e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x29,0x05,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x26,0x85,0x35,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x28,0x85,0x36,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x29,0x05,0x37,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x07,0x05,0x11,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x09,0x05,0x12,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x58,0x04,0x14,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x19,0x05,0x27,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5d,0x05,0x04,0x46,0x05,0x05,0x4a,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x13,0x05,0x25,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2c,0x85,0x20,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x05,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x34,0x85,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2c,0x85,0x38,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x31,0x05,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x32,0x85,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2d,0x05,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x06,0x46,0x05,0x05,0x5f,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x23,0x05,0x2b,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2a,0x85,0x1f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2f,0x05,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2a,0x85,0x37,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x08,0x85,0x11,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x85,0x12,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x59,0x04,0x15,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x5a,0x04,0x16,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x09,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x1d,0x05,0x28,0x46,0x05,0x05,0x19,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x07,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1f,0x05,0x29,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x15,0x05,0x26,0x46,0x05,0x05,0x13,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2e,0x85,0x21,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x2d,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x25,0x05,0x2c,0x46,0x05,0x05,0x23,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x30,0x85,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x0a,0x46,0x05,0x05,0x0d,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x08,0x46,0x05,0x05,0x06,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x2f,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x21,0x05,0x2a,0x46,0x05,0x05,0x1f,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x2e,0x46,0x05,0x05,0x27,0x46, 0x00,0x40,0x03,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x30,0x46,0x05,0x05,0x2b,0x46, 0x00,0x40,0x05,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x0b,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x05,0x2c,0x04,0x0f,0x20,0x05,0x02,0x00,0x02, 0x00,0x61,0x00,0x03,0x62,0x00,0x5c,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x18,0x11, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x42,0x01,0x20,0x58,0x05,0x14,0x0b,0x20, 0x00,0x40,0x04,0x04,0x00,0x50,0x05,0x05,0x43,0x05,0x2c,0x58,0x05,0x14,0x0f,0x20, 0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x12,0x04,0x1d,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x15,0x20,0x05,0x02,0x00,0x02, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x31,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x01,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x32,0x46,0x05,0x05,0x2f,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x33,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2f,0x01,0x20,0x58,0x05,0x14,0x15,0x20, 0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x30,0x05,0x12,0x58,0x05,0x14,0x1d,0x20, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x5b,0x04,0x17,0x20,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x14,0x04,0x25,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x44,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x48,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x13,0x04,0x21,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x3b,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x40,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x27,0x04,0x5d,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x28,0x04,0x04,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x29,0x20,0x05,0x02,0x00,0x02, 0x00,0x61,0x3e,0x03,0x62,0x20,0x1c,0x11,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x37,0x05,0x34,0x46,0x05,0x05,0x35,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x19,0x04,0x2d,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x1a,0x04,0x31,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x2f,0x05,0x2f,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3e,0x05,0x23,0x58,0x05,0x14,0x44,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3f,0x05,0x24,0x58,0x05,0x14,0x48,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x33,0x05,0x13,0x58,0x05,0x14,0x21,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3b,0x05,0x1f,0x58,0x05,0x14,0x3b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x34,0x05,0x14,0x58,0x05,0x14,0x25,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x35,0x01,0x20,0x58,0x05,0x14,0x29,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3c,0x05,0x20,0x58,0x05,0x14,0x40,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x40,0x05,0x27,0x58,0x05,0x14,0x5d,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x41,0x05,0x28,0x58,0x05,0x14,0x04,0x20,0x00,0x31,0x9f,0x03,0x80,0x00,0x00,0x05, 0x22,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3f,0x03,0x62,0x00,0x5c,0x11, 0x00,0x61,0x00,0x03,0x62,0x60,0x3d,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01, 0x20,0x04,0x37,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x36,0x05,0x19,0x58,0x05,0x14,0x2d,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x39,0x05,0x1a,0x58,0x05,0x14,0x31,0x20,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05, 0x44,0x04,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05, 0x45,0x04,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x05, 0x2a,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x03,0x62,0x20,0x1c,0x11, 0x00,0x61,0x2e,0x02,0x00,0xa0,0x0a,0x05,0x11,0x05,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x85,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x05,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x85,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x85,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1d,0x85,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1e,0x05,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x05,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x21,0x85,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1f,0x85,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x85,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x05,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x20,0x05,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x01,0x20,0x58,0x05,0x14,0x37,0x20, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x05,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x85,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x05,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x33,0x05,0x33,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3e,0x05,0x3e,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x40,0x05,0x40,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x35,0x05,0x35,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x39,0x05,0x39,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x2f,0x02,0x00,0xa0,0x0a,0x85,0x11,0x05,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x13,0x05,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3b,0x05,0x3b,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1b,0x05,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1e,0x05,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x47,0x04,0x34,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x12,0x85,0x22,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x14,0x85,0x23,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x15,0x05,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x17,0x05,0x25,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x05,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x85,0x26,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1d,0x85,0x27,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x34,0x05,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x22,0x05,0x11,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x13,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x21,0x02,0x00,0xa0,0x0a,0x85,0x34,0x05,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x42,0x05,0x42,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1f,0x85,0x28,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x20,0x05,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x5f,0x04,0x3e,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x04,0x04,0x3f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x05,0x04,0x40,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x06,0x04,0x41,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x49,0x04,0x36,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x4a,0x04,0x39,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x37,0x85,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x38,0x05,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3e,0x05,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3f,0x85,0x0f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x40,0x05,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x41,0x85,0x10,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x05,0x0b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x39,0x85,0x0c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x1e,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x1b,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x46,0x04,0x33,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x16,0x85,0x24,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x85,0x25,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x21,0x85,0x29,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x48,0x04,0x35,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x4b,0x04,0x3a,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x32,0x05,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x38,0x05,0x2d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3d,0x85,0x2f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x5d,0x04,0x3b,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x5e,0x04,0x3c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x36,0x05,0x2c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1b,0x05,0x34,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x85,0x2a,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x24,0x05,0x12,0x46,0x05,0x05,0x22,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x28,0x05,0x14,0x46,0x05,0x05,0x26,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x35,0x85,0x2b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x85,0x0a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3a,0x05,0x2e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3b,0x85,0x2e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3c,0x05,0x2f,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2a,0x05,0x15,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2e,0x05,0x17,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x05,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3d,0x85,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3a,0x05,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3b,0x85,0x0d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3c,0x05,0x0e,0x34,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x11,0x05,0x1f,0x46,0x05,0x05,0x0f,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x13,0x05,0x20,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x1d,0x46,0x05,0x05,0x0b,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x37,0x85,0x2c,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x07,0x04,0x42,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x08,0x04,0x43,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3e,0x05,0x30,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3f,0x85,0x30,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x40,0x05,0x31,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x41,0x85,0x31,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x39,0x85,0x2d,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x38,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1f,0x05,0x36,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x1d,0x05,0x35,0x46,0x05,0x05,0x1b,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x42,0x05,0x19,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x30,0x05,0x18,0x46,0x05,0x05,0x2e,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2c,0x05,0x16,0x46,0x05,0x05,0x2a,0x46, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x85,0x09,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x34,0x05,0x3c,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x17,0x05,0x32,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x15,0x05,0x21,0x46,0x05,0x05,0x13,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2e,0x05,0x3a,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2a,0x05,0x39,0x46,0x05,0x05,0x26,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x09,0x05,0x1a,0x46,0x05,0x05,0x42,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x21,0x05,0x37,0x46,0x05,0x05,0x1f,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x38,0x05,0x3e,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x19,0x05,0x33,0x46,0x05,0x05,0x17,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x36,0x05,0x3d,0x46,0x05,0x05,0x34,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x32,0x05,0x3b,0x46,0x05,0x05,0x2e,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3c,0x05,0x40,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x05,0x05,0x00,0x50,0x00,0x05,0x3a,0x05,0x3f,0x46,0x05,0x05,0x38,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x24,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x03,0x05,0x00,0x50,0x00,0x05,0x3e,0x05,0x41,0x46,0x05,0x05,0x3c,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x60,0x04,0x0d,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0b,0x04,0x11,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0c,0x04,0x15,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x2a,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x42,0x04,0x2c,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x43,0x04,0x30,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x5c,0x04,0x09,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x21,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0f,0x04,0x19,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x17,0x04,0x1d,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x36,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x18,0x04,0x32,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x13,0x01,0x20,0x58,0x05,0x14,0x24,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x28,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x3e,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x3a,0x20,0x05,0x02,0x00,0x02, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x34,0x05,0x4c,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x27,0x05,0x60,0x58,0x05,0x14,0x0d,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2f,0x05,0x1b,0x58,0x05,0x14,0x2a,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1f,0x05,0x42,0x58,0x05,0x14,0x2c,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x20,0x05,0x43,0x58,0x05,0x14,0x30,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x26,0x05,0x5c,0x58,0x05,0x14,0x09,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x1c,0x58,0x05,0x14,0x21,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x14,0x01,0x20,0x58,0x05,0x14,0x28,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2c,0x05,0x0f,0x58,0x05,0x14,0x19,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x17,0x58,0x05,0x14,0x1d,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x30,0x05,0x18,0x58,0x05,0x14,0x32,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x23,0x58,0x05,0x14,0x36,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x0b,0x58,0x05,0x14,0x11,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x29,0x05,0x0c,0x58,0x05,0x14,0x15,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x25,0x58,0x05,0x14,0x3a,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x24,0x58,0x05,0x14,0x3e,0x20, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x38,0x05,0x4e,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3c,0x05,0x50,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x36,0x05,0x4d,0x46,0x05,0x05,0x34,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4c,0x05,0x54,0x46,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x1f,0x05,0x1f,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x26,0x05,0x26,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x2e,0x05,0x2e,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x40,0x05,0x52,0x46,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x13,0x05,0x13,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x2c,0x05,0x2c,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x30,0x05,0x30,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x28,0x05,0x28,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x32,0x05,0x32,0x46,0x01,0x02,0x00,0x02, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x3a,0x05,0x4f,0x46,0x05,0x05,0x38,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x3e,0x05,0x51,0x46,0x05,0x05,0x3c,0x46, 0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x4e,0x05,0x55,0x46,0x05,0x05,0x4c,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x50,0x05,0x56,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x42,0x05,0x53,0x46,0x05,0x05,0x40,0x46, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x54,0x05,0x58,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x46,0x04,0x1f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x48,0x04,0x26,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x5f,0x04,0x2e,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x44,0x04,0x13,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x5d,0x04,0x2c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x05,0x04,0x30,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x4a,0x04,0x28,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x07,0x04,0x32,0x20,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x52,0x05,0x57,0x46,0x05,0x05,0x50,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x56,0x05,0x59,0x46,0x05,0x05,0x54,0x46, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x47,0x04,0x20,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x49,0x04,0x27,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x04,0x04,0x2f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x45,0x04,0x14,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x5e,0x04,0x2d,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x06,0x04,0x31,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x4b,0x04,0x29,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x08,0x04,0x33,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0d,0x05,0x46,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x11,0x05,0x48,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1d,0x05,0x5f,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x09,0x05,0x44,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x19,0x05,0x5d,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x21,0x05,0x05,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x15,0x05,0x4a,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x25,0x05,0x07,0x46,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x58,0x05,0x5a,0x46,0x00,0x00,0x00,0x00, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0f,0x05,0x47,0x46,0x05,0x05,0x0d,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x13,0x05,0x49,0x46,0x05,0x05,0x11,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x1f,0x05,0x04,0x46,0x05,0x05,0x1d,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0b,0x05,0x45,0x46,0x05,0x05,0x09,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x1b,0x05,0x5e,0x46,0x05,0x05,0x19,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x23,0x05,0x06,0x46,0x05,0x05,0x21,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x17,0x05,0x4b,0x46,0x05,0x05,0x15,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x08,0x46,0x05,0x05,0x25,0x46, 0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x5a,0x05,0x5b,0x46,0x05,0x05,0x58,0x46, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2a,0x04,0x3a,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2b,0x04,0x3e,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2c,0x04,0x42,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2e,0x04,0x52,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2f,0x04,0x56,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x4e,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x36,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x32,0x04,0x0f,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x33,0x04,0x13,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x38,0x04,0x1f,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x31,0x04,0x0b,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x35,0x04,0x1b,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x23,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x34,0x04,0x17,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3c,0x04,0x27,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x30,0x04,0x5a,0x20,0x05,0x02,0x00,0x02, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x41,0x05,0x2a,0x58,0x05,0x14,0x3a,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x44,0x05,0x2b,0x58,0x05,0x14,0x3e,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x45,0x05,0x2c,0x58,0x05,0x14,0x42,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x47,0x05,0x2e,0x58,0x05,0x14,0x52,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x2f,0x58,0x05,0x14,0x56,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x46,0x05,0x2d,0x58,0x05,0x14,0x4e,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x29,0x58,0x05,0x14,0x36,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x32,0x58,0x05,0x14,0x0f,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x33,0x58,0x05,0x14,0x13,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x31,0x58,0x05,0x14,0x0b,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x50,0x01,0x20,0x58,0x05,0x14,0x23,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x34,0x58,0x05,0x14,0x17,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x51,0x05,0x3c,0x58,0x05,0x14,0x27,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x30,0x58,0x05,0x14,0x5a,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x35,0x58,0x05,0x14,0x1b,0x20, 0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x05,0x38,0x58,0x05,0x14,0x1f,0x20, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x44,0x05,0x44,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x46,0x05,0x46,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x40,0x05,0x40,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x4a,0x05,0x4a,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x4c,0x05,0x4c,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x50,0x05,0x50,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x48,0x05,0x48,0x46,0x01,0x02,0x00,0x02, 0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x4e,0x05,0x4e,0x46,0x01,0x02,0x00,0x02, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x53,0x04,0x44,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x54,0x04,0x46,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x52,0x04,0x40,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x56,0x04,0x4a,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x57,0x04,0x4c,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x59,0x04,0x50,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x55,0x04,0x48,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x58,0x04,0x4e,0x20,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x03,0x68,0x02,0x6c,0x41,0x00,0x69,0x00,0x03,0x68,0xca,0x6c,0x41, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a, 0x02,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xc0,0x44,0x52,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0a,0x00, 0x00,0x70,0x00,0x00,0x00,0x50,0x84,0x01,0x00,0xa4,0x66,0x00,0x15,0x02,0x00,0x02, 0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0a,0x00, 0x00,0x69,0x00,0x01,0x68,0xaa,0x6c,0x51,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x85, 0x02,0x24,0x6c,0x00,0x05,0x05,0x00,0x05,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89, 0x02,0x40,0x04,0x1c,0x68,0x72,0x01,0x01,0x01,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x00,0x03,0x62,0x70,0x01,0x11, 0x00,0x61,0x06,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11, 0x00,0x61,0x04,0x03,0x62,0x00,0x1c,0x11,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05, 0x1d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x34,0x00,0x00,0x60,0x86,0x25, 0x03,0x84,0x02,0x00,0x05,0x10,0x00,0x10,0x00,0x61,0x00,0x03,0x62,0x70,0x01,0x11, 0x00,0x31,0x95,0x03,0x80,0x00,0x00,0x05,0x25,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x35,0x03,0x62,0x00,0x1c,0x11,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05, 0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x36,0x03,0x68,0x02,0x6c,0x41, 0x00,0x69,0x00,0x03,0x68,0xca,0x6c,0x41,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x23,0x02,0x00,0xa0,0x0a,0x05, 0x0c,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x10,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x14,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x18,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x24,0x02,0x00,0xa0,0x0a,0x85, 0x0c,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x10,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x14,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x18,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x0d,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x0e,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x11,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x12,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x15,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x16,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x19,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x1a,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x0d,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x0e,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x11,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x12,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x15,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x16,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x19,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x1a,0x05,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x45,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x4d,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x55,0x05,0x14,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x5d,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x25,0x02,0x00,0xa0,0x0a,0x05, 0x2d,0x05,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x2f,0x05,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x31,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x33,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x35,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x37,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x39,0x05,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x3b,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x00,0xa0,0x0a,0x85, 0x2d,0x05,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x2f,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x31,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x33,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x35,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x37,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x39,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x3b,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x0f,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x13,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x17,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x1b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x0f,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x13,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x17,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x1b,0x85,0x24,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x49,0x05,0x0e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x51,0x05,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x59,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x47,0x05,0x0d,0x46,0x05,0x05,0x45,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x4f,0x05,0x11,0x46,0x05,0x05,0x4d,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x57,0x05,0x15,0x46,0x05,0x05,0x55,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x5f,0x05,0x19,0x46,0x05,0x05,0x5d,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x04,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x2e,0x85,0x25,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x30,0x85,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x32,0x85,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x34,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x36,0x85,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x38,0x85,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x3a,0x85,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05, 0x3c,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x2e,0x85,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x30,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x32,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x34,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x36,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x38,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x3a,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85, 0x3c,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x1c,0x05,0x37,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x08,0x05,0x2d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x20,0x05,0x39,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x0c,0x05,0x2f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x10,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x14,0x05,0x33,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x18,0x05,0x35,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05, 0x24,0x05,0x3b,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x4b,0x05,0x0f,0x46,0x05,0x05,0x49,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x53,0x05,0x13,0x46,0x05,0x05,0x51,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x5b,0x05,0x17,0x46,0x05,0x05,0x59,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x06,0x05,0x1b,0x46,0x05,0x05,0x04,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x1e,0x05,0x38,0x46,0x05,0x05,0x1c,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x0a,0x05,0x2e,0x46,0x05,0x05,0x08,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x22,0x05,0x3a,0x46,0x05,0x05,0x20,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05, 0x26,0x05,0x3c,0x46,0x05,0x05,0x24,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x0e,0x05,0x30,0x46,0x05,0x05,0x0c,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x12,0x05,0x32,0x46,0x05,0x05,0x10,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x16,0x05,0x34,0x46,0x05,0x05,0x14,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05, 0x1a,0x05,0x36,0x46,0x05,0x05,0x18,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x28,0x04,0x47,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2a,0x04,0x4f,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2c,0x04,0x57,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x29,0x04,0x4b,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2b,0x04,0x53,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2d,0x04,0x5b,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2f,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x35,0x04,0x1e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x2e,0x04,0x5f,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x37,0x04,0x26,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01, 0x20,0x04,0x0a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x31,0x04,0x0e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x32,0x04,0x12,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x33,0x04,0x16,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x34,0x04,0x1a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05, 0x36,0x04,0x22,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x38,0x05,0x28,0x58,0x05,0x14,0x47,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3a,0x05,0x2a,0x58,0x05,0x14,0x4f,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3c,0x05,0x2c,0x58,0x05,0x14,0x57,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x39,0x05,0x29,0x58,0x05,0x14,0x4b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3b,0x05,0x2b,0x58,0x05,0x14,0x53,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3d,0x05,0x2d,0x58,0x05,0x14,0x5b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3f,0x05,0x2f,0x58,0x05,0x14,0x06,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x45,0x05,0x35,0x58,0x05,0x14,0x1e,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x3e,0x05,0x2e,0x58,0x05,0x14,0x5f,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x40,0x01,0x20,0x58,0x05,0x14,0x0a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x41,0x05,0x31,0x58,0x05,0x14,0x0e,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x42,0x05,0x32,0x58,0x05,0x14,0x12,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x43,0x05,0x33,0x58,0x05,0x14,0x16,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x44,0x05,0x34,0x58,0x05,0x14,0x1a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x46,0x05,0x36,0x58,0x05,0x14,0x22,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05, 0x47,0x05,0x37,0x58,0x05,0x14,0x26,0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x3a,0x05,0x3a,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05, 0x3c,0x05,0x3c,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x3e,0x05,0x3e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x40,0x05,0x40,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x42,0x05,0x42,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x44,0x05,0x44,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05, 0x46,0x05,0x46,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x48,0x04,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x49,0x04,0x3a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4a,0x04,0x3c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4b,0x04,0x3e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4c,0x04,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4d,0x04,0x42,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4e,0x04,0x44,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05, 0x4f,0x04,0x46,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x97,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x03,0x00,0xc0,0x44,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x80,0xa5, 0x01,0x84,0x62,0x00,0x05,0x01,0x00,0x01,0x00,0x69,0x00,0x61,0x68,0x9a,0x6c,0x41, 0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x85,0x61,0x24,0x6c,0x00,0x05,0x04,0x00,0x04, 0x00,0x61,0x00,0x6d,0x68,0xc8,0x6c,0x11,0x00,0x61,0x04,0x00,0x00,0x20,0x01,0xe5, 0x6a,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x00,0x00,0x40,0x44, 0x6c,0x00,0x00,0x00,0x00,0xb8,0x0e,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5, 0x01,0x24,0x6c,0x00,0x05,0x0a,0x00,0x0a,0x00,0x61,0x00,0x03,0xa1,0x00,0x00,0x01, 0x00,0x66,0x02,0x00,0x00,0x60,0x06,0x05,0x03,0xa4,0x01,0x00,0x01,0x04,0x61,0x00, 0x00,0x66,0x00,0x00,0x00,0x60,0x06,0xa5,0x61,0xa4,0x01,0x00,0x01,0x04,0x61,0x00, 0x00,0x31,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x04,0x30,0x00,0x00,0x00, 0x02,0x69,0x00,0x61,0x68,0xa2,0x6c,0x21,0x00,0x61,0x00,0x04,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x00,0x19, 0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x61,0x04,0x04,0x62,0x68,0x61,0x11,0x00,0x61,0x00,0x04,0x62,0xc8,0x6c,0x11, 0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xc0,0x00,0x00,0x00, 0x00,0x65,0x29,0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x05,0x00,0x15,0xff,0x00,0xff, 0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00, 0x00,0x61,0x38,0x04,0x00,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x07,0x00,0x00,0x90,0x09,0x05,0x03,0xa4,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0x9a,0x04,0x00,0x00,0x00,0x0c,0x04,0x0c,0x03,0x0c,0x30,0x00,0x00,0x00, 0x02,0x61,0x00,0x05,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0xc4,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x05,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x61,0x00,0x05,0x62,0x68,0x61,0x11, 0x00,0x61,0x00,0x05,0x62,0xc8,0x6c,0x11,0x00,0x61,0x2a,0x00,0x00,0x20,0x05,0x01, 0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05, 0x06,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x65,0x2b,0x00,0x00,0x60,0x86,0x01, 0x00,0x04,0x06,0x00,0x15,0xff,0x00,0xff,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x61,0x38,0x04,0x00,0x90,0x49,0x05, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9c,0x04,0x00,0x00,0x00,0x00, 0x00,0x0c,0x03,0x06,0x30,0x00,0x00,0x00,0x02,0x70,0x00,0x00,0x00,0x10,0x81,0x01, 0x00,0x04,0x61,0x00,0x21,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x35, 0x61,0x00,0x00,0x00,0x00,0x1c,0x00,0x1c,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05, 0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x85, 0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a,0x05, 0x68,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x20,0x00,0x00,0x91,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5, 0x01,0x44,0x61,0x00,0x05,0x06,0x00,0x06,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11, 0x00,0x40,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0xa4,0x01,0x00,0x05,0xc0,0xff,0xc0, 0xff,0x61,0x00,0x08,0x64,0x00,0x00,0x10,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x05, 0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x68,0x7a,0x61,0xc1, 0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x08,0x00,0x00,0x00,0x00,0x03,0x00,0x0f, 0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x08,0x84,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x29, 0x02,0x61,0x00,0x00,0x00,0x90,0x49,0x35,0x61,0x00,0x00,0x00,0x00,0x7c,0x00,0x7c, 0x00,0x31,0xbe,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x08,0x00,0xc0,0x00,0x00,0x00, 0x00,0x69,0x3e,0x08,0x68,0xca,0x6c,0x31,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x08,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x44,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x31,0xaf,0x03,0x80,0x00,0x00,0x05, 0x0b,0x04,0x08,0x00,0xc0,0x00,0x00,0x00,0x00,0x65,0x2d,0x00,0x00,0x40,0x84,0x06, 0x06,0x0c,0x04,0x00,0x05,0x1f,0x00,0x1f,0x00,0x61,0x00,0x68,0x68,0x20,0x04,0x11, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x25,0x68,0x44,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0x03,0x83,0x00,0x10,0x80,0x01,0x00,0x04,0x06,0x00,0x21,0x00,0x00,0x00, 0x00,0x62,0x02,0x83,0x11,0x00,0x80,0x06,0x07,0x05,0x68,0x46,0x05,0x22,0x00,0x22, 0x00,0x61,0x2e,0x04,0x00,0x00,0x00,0x85,0x67,0x1c,0x09,0x30,0x00,0x00,0x00,0x00, 0x00,0x61,0x02,0x03,0x00,0x00,0x00,0x05,0x68,0x04,0x07,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x2f,0x03,0x00,0x90,0x09,0x05,0x67,0x14,0x0b,0x20,0x00,0x00,0x00,0x00, 0x00,0x70,0x00,0x80,0x00,0x20,0x82,0x01,0x00,0x24,0x6d,0x00,0x15,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x01,0x00,0xa0,0x4a,0x85,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x6a,0xa8,0xa0,0x00,0x01,0x00,0x61,0x00,0x01,0x00,0x90,0x49,0x85, 0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05, 0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x6b,0xa8,0x90,0x00,0x01, 0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x55,0x68,0x00,0x00,0x00,0x00,0x6c,0x00,0x6c, 0x00,0x61,0x00,0x01,0x00,0xa0,0x4a,0xa5,0x6b,0x00,0x00,0x00,0x00,0x22,0x22,0x22, 0x22,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x04,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x01,0x44,0x61,0x00,0x01,0x24,0x61,0x00, 0x02,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28, 0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x69,0x02,0x00,0x00,0x60,0x86,0x45, 0x03,0xa4,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x45, 0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa0,0x04,0x80,0x00,0x00,0x05, 0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x20,0x00,0x00,0x40,0x84,0x06, 0x06,0x0c,0x04,0x00,0x05,0x1f,0x00,0x1f,0x00,0x70,0x01,0x83,0x00,0x10,0x80,0x01, 0x00,0x04,0x06,0x00,0x21,0x00,0x00,0x00,0x00,0x62,0x00,0x83,0x11,0x00,0x84,0x06, 0x07,0x25,0x04,0x46,0x05,0x22,0x00,0x22,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0xa5, 0x6b,0x04,0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19, 0x02,0x69,0x00,0x6c,0x68,0xca,0x6c,0x31,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x25, 0x03,0x84,0x61,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x78,0x61,0x11, 0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x65,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x05,0x03,0x68,0xca,0x6c,0xf1, 0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x00, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00,0x19, 0x02,0x61,0x00,0x68,0xa8,0x88,0x00,0x01,0x00,0x31,0xb3,0x03,0x80,0x00,0x00,0x05, 0x05,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a,0x85, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x6a,0xa8,0xa0,0x00,0x01, 0x00,0x61,0x21,0x02,0x00,0xa0,0x0a,0x25,0x6a,0x05,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xa5,0x6a,0x85,0x04,0x22,0x00,0x00,0x00,0x00, 0x00,0x61,0x23,0x04,0x80,0x40,0x04,0x85,0x68,0x05,0x05,0x46,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00, 0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x61,0x64,0x61,0x00,0x05,0xfc,0xff,0xfc, 0xff,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x25, 0x03,0x84,0x61,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x61,0x05,0x03,0x62,0x80,0x61,0x11, 0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x05,0x04,0x94,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x69,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x70,0x01,0x00,0x00,0x10,0x01,0x01,0x00,0x04,0x61,0x00,0x55,0x04,0x04,0x00, 0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x61,0x24,0x02,0x00,0xa0,0x0a,0x05,0x6a,0x05,0x69,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x6a,0x84,0x69,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x03,0x00,0x00,0x00,0xa5,0x6a,0x9c,0x69,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x68,0x84,0x6c,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x61,0x24,0x02,0x00,0xa0,0x0a,0x05,0x6a,0x05,0x69,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x85,0x6a,0x85,0x69,0x22,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xc5,0x6a,0xc4,0x69,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x6c,0x68,0xca,0x6c,0x31,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10, 0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00,0x19, 0x02,0x40,0x03,0x03,0x68,0xca,0x6c,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45, 0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x80,0x61,0x11, 0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x95,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x31,0xa5,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00, 0x00,0x61,0x25,0x02,0x00,0xa0,0x0a,0x65,0x68,0x05,0x04,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xe5,0x68,0x84,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x04,0x00,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x05,0x85,0x6a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x02,0x00,0x90,0x09,0x05,0x03,0x94,0x6c,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x02,0x02,0x00,0x00,0x00,0x85,0x6a,0x04,0x05,0x20,0x00,0x00,0x00,0x00, 0x00,0x65,0x02,0x04,0x00,0x50,0x85,0x01,0x00,0x05,0x03,0x58,0x25,0x01,0x00,0x01, 0x00,0x61,0x02,0x00,0x80,0x50,0x00,0x05,0x08,0x9c,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x00,0x04,0x11,0x50,0x80,0x05,0x04,0x05,0x6a,0x46,0x05,0x00,0x00,0x00, 0x00,0x62,0x07,0x04,0x11,0x50,0x80,0x05,0x06,0x65,0x68,0x46,0x05,0x00,0x00,0x00, 0x00,0x65,0x00,0x03,0x00,0x50,0x85,0x01,0x00,0x44,0x68,0x00,0x15,0x01,0x00,0x01, 0x00,0x61,0x07,0x02,0x00,0x50,0x00,0x05,0x07,0xe5,0x68,0x34,0x00,0x00,0x00,0x00, 0x00,0x62,0x05,0x03,0x01,0x50,0x00,0x05,0x09,0xa5,0x6a,0x46,0x05,0x04,0x08,0x00, 0x00,0x61,0x05,0x04,0x00,0x00,0x00,0x05,0x6a,0x04,0x04,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x05,0x04,0x00,0x00,0x00,0x05,0x6b,0x04,0x06,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x55,0x68,0x00,0x00,0x00,0x00,0x7c,0x00,0x7c, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x85,0x6c,0x44,0x68,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x02,0x00,0x00,0x00,0x85,0x6b,0x04,0x07,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x06,0x03,0x00,0x00,0x00,0xa5,0x6a,0x04,0x09,0x20,0x00,0x00,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x50,0x85,0x05,0x11,0x94,0x6c,0x00,0x05,0x03,0x00,0x03, 0x00,0x69,0x04,0x00,0x00,0x50,0x85,0x05,0x10,0x84,0x6c,0x00,0x05,0x02,0x00,0x02, 0x00,0x65,0x02,0x00,0x00,0x50,0x85,0x05,0x11,0x04,0x11,0x00,0x05,0x08,0x00,0x08, 0x00,0x65,0x02,0x00,0x00,0x50,0x85,0x05,0x10,0x04,0x10,0x00,0x05,0x04,0x00,0x04, 0x00,0x67,0x02,0x00,0x00,0x50,0x85,0x05,0x11,0x04,0x11,0x00,0x05,0x08,0x00,0x08, 0x00,0x65,0x07,0x00,0x00,0x50,0x05,0x55,0x68,0x54,0x68,0x00,0x05,0x34,0x61,0x00, 0x00,0x67,0x03,0x00,0x00,0x50,0x85,0x05,0x10,0x04,0x10,0x00,0x05,0x04,0x00,0x04, 0x00,0x40,0x03,0x00,0x00,0x50,0x85,0x05,0x11,0x04,0x11,0x00,0x05,0x74,0x00,0x74, 0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x61,0x3c,0x00,0x80,0xa0,0x4a,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0x00,0x40,0x04,0x00,0x00,0x50,0x85,0x05,0x10,0x04,0x10,0x00,0x05,0x78,0x00,0x78, 0x00,0x65,0x04,0x00,0x00,0x50,0x05,0x05,0x11,0x04,0x11,0x00,0x05,0x54,0x68,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xe5,0x05,0x00,0x00,0x00,0x00,0x60,0x00,0x40, 0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x06,0x12,0x14,0x68,0x00,0x01,0x04,0x00,0x04, 0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x06,0x15,0x34,0x68,0x00,0x01,0x04,0x00,0x04, 0x00,0x41,0x06,0x03,0x00,0x60,0x06,0x05,0x04,0x04,0x03,0x00,0x05,0x85,0x02,0x46, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xe5,0x05,0xe4,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x06,0x00,0x00,0x50,0x05,0x05,0x11,0x04,0x11,0x00,0x05,0x04,0x10,0x00, 0x00,0x61,0x00,0x04,0xa1,0x88,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x25, 0x05,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05, 0x05,0x05,0x62,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06, 0x13,0x1c,0x68,0x00,0x05,0xf0,0xff,0xf0,0xff,0x65,0x00,0x00,0x00,0x40,0x84,0x06, 0x16,0x3c,0x68,0x00,0x05,0xf0,0xff,0xf0,0xff,0x61,0x07,0x00,0x80,0x50,0x04,0x05, 0x14,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45, 0x04,0x64,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55, 0x04,0x84,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x68,0xe0,0x62,0x11, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x04,0xa4,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x05,0x17,0x04,0x15,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xe6,0x05,0xe4,0x05,0x00,0x05,0x7f,0x00,0x7f, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x45,0x05,0x44,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x40,0x04,0xee,0x05,0x04,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06,0x05,0x04,0x05,0x00,0x05,0xfe,0xff,0xfe, 0xff,0x61,0x00,0x0a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0c,0xa0,0x00,0x00,0x01, 0x00,0x61,0x00,0x0e,0xa0,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01, 0x10,0x64,0x01,0x00,0x06,0x00,0x20,0x78,0x10,0x61,0x05,0x08,0x60,0x00,0x04,0x10, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0a,0x05,0x63,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x0a,0x84,0x63,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05,0x0d,0xc5,0x65,0x22,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x45,0x0d,0x25,0x6a,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x0d,0xa5,0x6a,0x22,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x85,0x67,0x34,0x00,0x00,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x40,0x04,0x86,0x0e,0x04,0x13,0x00,0x05,0x04,0x14,0x00, 0x00,0x66,0x00,0x00,0x00,0x40,0x04,0x8e,0x0e,0x04,0x16,0x00,0x05,0x04,0x17,0x00, 0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x95,0x0e,0xcc,0x6b,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xa5,0x0e,0x14,0x6b,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xe5,0x0e,0x24,0x66,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x67,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x25,0x6b,0x34,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x3e,0x0d,0x1c,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x1f,0x00,0x00,0x00,0x00,0xf8,0xc0,0x1f, 0x1f,0x31,0xa6,0x04,0x00,0x00,0x00,0x05,0x18,0x04,0x08,0x00,0xd0,0x00,0x00,0x00, 0x00,0x61,0x01,0x01,0x00,0x50,0x04,0x05,0x20,0x04,0x1f,0x20,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x22,0xa0,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x45, 0x26,0x44,0x61,0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x84,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x61,0x00,0x00,0x00,0x00,0x41,0x16, 0x22,0x00,0x00,0x00,0x00,0x0e,0x00,0x0e,0x00,0x65,0xd6,0x01,0x00,0x40,0x04,0x06, 0x1f,0x04,0x18,0x20,0x05,0x05,0x20,0x22,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x25, 0x22,0x85,0x18,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0x50,0x04,0x05, 0x21,0x0c,0x1f,0x20,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x60,0x86,0x65, 0x22,0xc4,0x18,0x00,0x05,0xff,0x00,0xff,0x00,0x65,0x02,0x01,0x00,0x40,0x04,0x0e, 0x1f,0x0c,0x18,0x20,0x05,0x05,0x21,0x22,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x85, 0x22,0x64,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x80,0x50,0x04,0x05, 0x24,0x14,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x95, 0x22,0x64,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x40,0x04,0x06, 0x25,0x0c,0x1f,0x00,0x05,0x04,0x24,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x06, 0x22,0x04,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x84,0x1e, 0x22,0x1c,0x1f,0x00,0x05,0x80,0xff,0x80,0xff,0x66,0x03,0x00,0x00,0x40,0x84,0x0e, 0x22,0x04,0x25,0x00,0x05,0x20,0x00,0x20,0x00,0x31,0x98,0x04,0x80,0x00,0x00,0x01, 0x00,0x04,0x26,0x00,0xa0,0x14,0x22,0x00,0x00,0x31,0x49,0x03,0x80,0x00,0x00,0x0c, 0x27,0x0c,0x00,0x00,0xa0,0x00,0x00,0x78,0x02,0x61,0x29,0x03,0x80,0x20,0x02,0x01, 0x00,0x05,0x27,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x24,0x05, 0x29,0x45,0x02,0x46,0x01,0x14,0x61,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x24,0x05, 0x28,0x05,0x02,0x46,0x01,0x04,0x61,0x00,0x00,0x61,0x02,0x2a,0x61,0x00,0x29,0x10, 0x00,0x69,0x00,0x29,0x61,0x02,0x29,0xa0,0x00,0x61,0x00,0x03,0x00,0xa0,0x4a,0x05, 0x2b,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0xc4,0x01,0x00,0x02,0x00,0x81,0x01,0x02,0x61,0x00,0x2c,0xa1,0x00,0x00,0x01, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x2b,0x00,0x00,0x00,0x00,0xbf,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x2b,0x00,0x00,0x00,0x00,0xdf,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x2b,0x00,0x00,0x00,0x00,0xef,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x2b,0x00,0x00,0x00,0x00,0xf7,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x2b,0x00,0x00,0x00,0x00,0xfb,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x25,0x2b,0x00,0x00,0x00,0x00,0xfd,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x2b,0x00,0x00,0x00,0x00,0xfe,0x00,0x00, 0x00,0x66,0x07,0x2c,0xa8,0x02,0x29,0x11,0x28,0x31,0xaa,0x03,0x00,0x00,0x00,0x01, 0x00,0x04,0x28,0x00,0xc0,0x14,0x2a,0x00,0x00,0x31,0x9b,0x04,0x00,0x00,0x00,0x00, 0x00,0x0c,0x2c,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x2d,0xa1,0x00,0x00,0x01, 0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x2d,0x24,0x29,0x00,0x06,0x24,0x28,0x00, 0x00,0x31,0x9c,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x2d,0x02,0x30,0x00,0x00,0x00, 0x02,0x61,0x00,0x2e,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05, 0x2e,0x44,0x29,0x00,0x06,0x44,0x28,0x00,0x00,0x31,0x9d,0x04,0x00,0x00,0x00,0x00, 0x00,0x0c,0x2e,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x2f,0xa1,0x00,0x00,0x01, 0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x2f,0x64,0x29,0x00,0x06,0x64,0x28,0x00, 0x00,0x31,0x9e,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x2f,0x02,0x30,0x00,0x00,0x00, 0x02,0x61,0x00,0x30,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05, 0x30,0x84,0x29,0x00,0x06,0x84,0x28,0x00,0x00,0x31,0x9f,0x04,0x00,0x00,0x00,0x00, 0x00,0x0c,0x30,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x31,0xa1,0x00,0x00,0x01, 0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x31,0xa4,0x29,0x00,0x06,0xa4,0x28,0x00, 0x00,0x31,0x90,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x31,0x02,0x30,0x00,0x00,0x00, 0x02,0x61,0x00,0x32,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x32,0xa8,0xfa,0x29,0x11, 0x28,0x31,0x91,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x32,0x02,0x30,0x00,0x00,0x00, 0x02,0x61,0x00,0x33,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05, 0x33,0xe4,0x29,0x00,0x06,0xe4,0x28,0x00,0x00,0x31,0x93,0x04,0x00,0x00,0x00,0x00, 0x00,0x0c,0x33,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x7f,0x64,0x00,0x00,0x10, 0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff, 0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30, 0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x85,0x02,0xe4,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x61,0x00,0x07,0xa8,0x00,0x00,0xc1,0xb4,0x61,0x02,0x6d,0xe8,0x5d,0x02,0x11, 0x00,0x38,0x44,0x00,0x00,0xa0,0x0a,0x05,0x06,0x84,0x02,0x00,0x10,0x00,0x00,0x00, 0x00,0x40,0x01,0x6d,0xa8,0x82,0x6a,0x31,0x6d,0x5b,0xb4,0x00,0x00,0xa0,0x02,0x04, 0x06,0x04,0x06,0x02,0x02,0x04,0x07,0x04,0x06,0x01,0x00,0x00,0x00,0x00,0x42,0x01, 0x00,0x00,0x00,0x00,0x20,0x84,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0xa0,0x02,0x05, 0x03,0x05,0x6d,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x04,0xe8,0x25,0x03,0x11, 0x00,0x41,0x03,0x08,0x28,0x10,0x06,0x11,0x03,0x40,0x02,0x04,0xa8,0x22,0x6d,0x31, 0x04,0x61,0x02,0x09,0xe8,0x05,0x08,0x11,0x00,0x61,0x02,0x05,0x68,0x06,0x04,0x11, 0x00,0x61,0x02,0x0a,0x68,0x06,0x09,0x11,0x00,0x5b,0x01,0x00,0x00,0xa0,0x02,0x84, 0x02,0x24,0x03,0x82,0x02,0x04,0x0a,0x84,0x02,0x5b,0x03,0x00,0x00,0xa0,0x02,0x04, 0x03,0x04,0x05,0x82,0x02,0x04,0x0a,0x04,0x03,0x40,0x01,0x00,0x00,0xa0,0x0a,0x85, 0x02,0x84,0x02,0x00,0x0a,0x04,0x03,0x00,0x00,0x41,0x01,0x06,0x28,0x08,0x06,0x11, 0x02,0x61,0x01,0x0b,0xe8,0x05,0x06,0x11,0x00,0x40,0x01,0x0b,0xa8,0x02,0x0b,0x11, 0x09,0x41,0x01,0x20,0x22,0x56,0x0b,0x11,0x6a,0x49,0x00,0x0b,0xa8,0x52,0x0b,0x11, 0x6a,0x40,0x01,0x6d,0xa8,0xca,0x6d,0x31,0x0b,0x70,0x01,0x00,0x00,0x20,0x02,0x01, 0x00,0x24,0x6d,0x00,0x52,0xe4,0x6a,0x00,0x00,0x61,0x00,0x00,0x01,0xa0,0x4a,0xe5, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x25, 0x6d,0x24,0x6d,0x00,0x06,0xe4,0x6a,0x00,0x02,0x65,0x01,0x00,0x00,0x20,0x82,0x01, 0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00, 0x00,0x44,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x04,0x00,0x00,0x45,0x6e,0x63, 0x4d,0x42,0x5f,0x50,0x00,0x25,0x6e,0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65, 0x61,0x64,0x5f,0x78,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25, 0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64, 0x5f,0x7a,0x00,0x25,0x74,0x73,0x63,0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67, 0x00,0x25,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70, 0x00,0x25,0x68,0x77,0x5f,0x69,0x64,0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72, 0x30,0x00,0x25,0x63,0x65,0x30,0x00,0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f, 0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53, 0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56, 0x30,0x30,0x33,0x32,0x00,0x56,0x30,0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34, 0x00,0x56,0x30,0x30,0x33,0x35,0x00,0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30, 0x33,0x37,0x00,0x56,0x30,0x30,0x33,0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56, 0x30,0x30,0x34,0x30,0x00,0x56,0x30,0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32, 0x00,0x56,0x30,0x30,0x34,0x33,0x00,0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30, 0x34,0x35,0x00,0x56,0x30,0x30,0x34,0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56, 0x30,0x30,0x34,0x38,0x00,0x56,0x30,0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30, 0x00,0x56,0x30,0x30,0x35,0x31,0x00,0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30, 0x35,0x33,0x00,0x56,0x30,0x30,0x35,0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56, 0x30,0x30,0x35,0x36,0x00,0x56,0x30,0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38, 0x00,0x56,0x30,0x30,0x35,0x39,0x00,0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30, 0x36,0x31,0x00,0x56,0x30,0x30,0x36,0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56, 0x30,0x30,0x36,0x34,0x00,0x56,0x30,0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36, 0x00,0x56,0x30,0x30,0x36,0x37,0x00,0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30, 0x36,0x39,0x00,0x56,0x30,0x30,0x37,0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56, 0x30,0x30,0x37,0x32,0x00,0x56,0x30,0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34, 0x00,0x56,0x30,0x30,0x37,0x35,0x00,0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30, 0x37,0x37,0x00,0x56,0x30,0x30,0x37,0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56, 0x30,0x30,0x38,0x30,0x00,0x56,0x30,0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32, 0x00,0x56,0x30,0x30,0x38,0x33,0x00,0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30, 0x38,0x35,0x00,0x56,0x30,0x30,0x38,0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56, 0x30,0x30,0x38,0x38,0x00,0x56,0x30,0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30, 0x00,0x56,0x30,0x30,0x39,0x31,0x00,0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30, 0x39,0x33,0x00,0x56,0x30,0x30,0x39,0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56, 0x30,0x30,0x39,0x36,0x00,0x56,0x30,0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38, 0x00,0x56,0x30,0x30,0x39,0x39,0x00,0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31, 0x30,0x31,0x00,0x56,0x30,0x31,0x30,0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56, 0x30,0x31,0x30,0x34,0x00,0x56,0x30,0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36, 0x00,0x56,0x30,0x31,0x30,0x37,0x00,0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31, 0x30,0x39,0x00,0x56,0x30,0x31,0x31,0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56, 0x30,0x31,0x31,0x32,0x00,0x56,0x30,0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34, 0x00,0x56,0x30,0x31,0x31,0x35,0x00,0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31, 0x31,0x37,0x00,0x56,0x30,0x31,0x31,0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56, 0x30,0x31,0x32,0x30,0x00,0x56,0x30,0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32, 0x00,0x56,0x30,0x31,0x32,0x33,0x00,0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31, 0x32,0x35,0x00,0x56,0x30,0x31,0x32,0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56, 0x30,0x31,0x32,0x38,0x00,0x56,0x30,0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30, 0x00,0x56,0x30,0x31,0x33,0x31,0x00,0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31, 0x33,0x33,0x00,0x56,0x30,0x31,0x33,0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56, 0x30,0x31,0x33,0x36,0x00,0x56,0x30,0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38, 0x00,0x56,0x30,0x31,0x33,0x39,0x00,0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31, 0x34,0x31,0x00,0x56,0x30,0x31,0x34,0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56, 0x30,0x31,0x34,0x34,0x00,0x56,0x30,0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36, 0x00,0x56,0x30,0x31,0x34,0x37,0x00,0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31, 0x34,0x39,0x00,0x56,0x30,0x31,0x35,0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56, 0x30,0x31,0x35,0x32,0x00,0x56,0x30,0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34, 0x00,0x56,0x30,0x31,0x35,0x35,0x00,0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31, 0x35,0x37,0x00,0x56,0x30,0x31,0x35,0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56, 0x30,0x31,0x36,0x30,0x00,0x56,0x30,0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32, 0x00,0x56,0x30,0x31,0x36,0x33,0x00,0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31, 0x36,0x35,0x00,0x56,0x30,0x31,0x36,0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56, 0x30,0x31,0x36,0x38,0x00,0x56,0x30,0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30, 0x00,0x56,0x30,0x31,0x37,0x31,0x00,0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31, 0x37,0x33,0x00,0x56,0x30,0x31,0x37,0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56, 0x30,0x31,0x37,0x36,0x00,0x56,0x30,0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38, 0x00,0x56,0x30,0x31,0x37,0x39,0x00,0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31, 0x38,0x31,0x00,0x56,0x30,0x31,0x38,0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56, 0x30,0x31,0x38,0x34,0x00,0x56,0x30,0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36, 0x00,0x56,0x30,0x31,0x38,0x37,0x00,0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31, 0x38,0x39,0x00,0x56,0x30,0x31,0x39,0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56, 0x30,0x31,0x39,0x32,0x00,0x56,0x30,0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34, 0x00,0x56,0x30,0x31,0x39,0x35,0x00,0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31, 0x39,0x37,0x00,0x56,0x30,0x31,0x39,0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56, 0x30,0x32,0x30,0x30,0x00,0x56,0x30,0x32,0x30,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64, 0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x32,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x33,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x4e,0x6f, 0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x4e, 0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x36,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x37, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30, 0x38,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32, 0x30,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30, 0x32,0x31,0x30,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x32,0x31,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00, 0x56,0x30,0x32,0x31,0x32,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67, 0x00,0x56,0x30,0x32,0x31,0x33,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e, 0x67,0x00,0x56,0x30,0x32,0x31,0x34,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69, 0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x35,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65, 0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38, 0x00,0x56,0x30,0x32,0x31,0x39,0x00,0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32, 0x32,0x31,0x00,0x56,0x30,0x32,0x32,0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56, 0x30,0x32,0x32,0x34,0x00,0x56,0x30,0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36, 0x00,0x56,0x30,0x32,0x32,0x37,0x00,0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32, 0x32,0x39,0x00,0x56,0x30,0x32,0x33,0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56, 0x30,0x32,0x33,0x32,0x00,0x56,0x30,0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34, 0x00,0x56,0x30,0x32,0x33,0x35,0x00,0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32, 0x33,0x37,0x00,0x56,0x30,0x32,0x33,0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56, 0x30,0x32,0x34,0x30,0x00,0x56,0x30,0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32, 0x00,0x56,0x30,0x32,0x34,0x33,0x00,0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32, 0x34,0x35,0x00,0x56,0x30,0x32,0x34,0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56, 0x30,0x32,0x34,0x38,0x00,0x56,0x30,0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30, 0x00,0x56,0x30,0x32,0x35,0x31,0x00,0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32, 0x35,0x33,0x00,0x56,0x30,0x32,0x35,0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56, 0x30,0x32,0x35,0x36,0x00,0x56,0x30,0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38, 0x00,0x56,0x30,0x32,0x35,0x39,0x00,0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32, 0x36,0x31,0x00,0x56,0x30,0x32,0x36,0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56, 0x30,0x32,0x36,0x34,0x00,0x56,0x30,0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36, 0x00,0x56,0x30,0x32,0x36,0x37,0x00,0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32, 0x36,0x39,0x00,0x56,0x30,0x32,0x37,0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56, 0x30,0x32,0x37,0x32,0x00,0x56,0x30,0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34, 0x00,0x56,0x30,0x32,0x37,0x35,0x00,0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32, 0x37,0x37,0x00,0x56,0x30,0x32,0x37,0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56, 0x30,0x32,0x38,0x30,0x00,0x56,0x30,0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32, 0x00,0x56,0x30,0x32,0x38,0x33,0x00,0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32, 0x38,0x35,0x00,0x56,0x30,0x32,0x38,0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56, 0x30,0x32,0x38,0x38,0x00,0x56,0x30,0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30, 0x00,0x56,0x30,0x32,0x39,0x31,0x00,0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32, 0x39,0x33,0x00,0x56,0x30,0x32,0x39,0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56, 0x30,0x32,0x39,0x36,0x00,0x56,0x30,0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38, 0x00,0x56,0x30,0x32,0x39,0x39,0x00,0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33, 0x30,0x31,0x00,0x56,0x30,0x33,0x30,0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56, 0x30,0x33,0x30,0x34,0x00,0x56,0x30,0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36, 0x00,0x56,0x30,0x33,0x30,0x37,0x00,0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33, 0x30,0x39,0x00,0x56,0x30,0x33,0x31,0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56, 0x30,0x33,0x31,0x32,0x00,0x56,0x30,0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34, 0x00,0x56,0x30,0x33,0x31,0x35,0x00,0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33, 0x31,0x37,0x00,0x56,0x30,0x33,0x31,0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56, 0x30,0x33,0x32,0x30,0x00,0x56,0x30,0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32, 0x00,0x56,0x30,0x33,0x32,0x33,0x00,0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33, 0x32,0x35,0x00,0x56,0x30,0x33,0x32,0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56, 0x30,0x33,0x32,0x38,0x00,0x56,0x30,0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30, 0x00,0x56,0x30,0x33,0x33,0x31,0x00,0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33, 0x33,0x33,0x00,0x56,0x30,0x33,0x33,0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56, 0x30,0x33,0x33,0x36,0x00,0x56,0x30,0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38, 0x00,0x56,0x30,0x33,0x33,0x39,0x00,0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33, 0x34,0x31,0x00,0x56,0x30,0x33,0x34,0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56, 0x30,0x33,0x34,0x34,0x00,0x56,0x30,0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36, 0x00,0x56,0x30,0x33,0x34,0x37,0x00,0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33, 0x34,0x39,0x00,0x56,0x30,0x33,0x35,0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56, 0x30,0x33,0x35,0x32,0x00,0x56,0x30,0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34, 0x00,0x56,0x30,0x33,0x35,0x35,0x00,0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33, 0x35,0x37,0x00,0x56,0x30,0x33,0x35,0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56, 0x30,0x33,0x36,0x30,0x00,0x56,0x30,0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32, 0x00,0x56,0x30,0x33,0x36,0x33,0x00,0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33, 0x36,0x35,0x00,0x56,0x30,0x33,0x36,0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56, 0x30,0x33,0x36,0x38,0x00,0x56,0x30,0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30, 0x00,0x56,0x30,0x33,0x37,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e, 0x67,0x00,0x56,0x30,0x33,0x37,0x32,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69, 0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x33,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x34,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65, 0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x35,0x00,0x4e,0x6f,0x57,0x69,0x64, 0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x36,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x37,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30, 0x33,0x37,0x39,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x33,0x38,0x30,0x00,0x56,0x30,0x33,0x38,0x31,0x00,0x56,0x30,0x33,0x38,0x32, 0x00,0x56,0x30,0x33,0x38,0x33,0x00,0x56,0x30,0x33,0x38,0x34,0x00,0x56,0x30,0x33, 0x38,0x35,0x00,0x56,0x30,0x33,0x38,0x36,0x00,0x56,0x30,0x33,0x38,0x37,0x00,0x56, 0x30,0x33,0x38,0x38,0x00,0x56,0x30,0x33,0x38,0x39,0x00,0x56,0x30,0x33,0x39,0x30, 0x00,0x56,0x30,0x33,0x39,0x31,0x00,0x56,0x30,0x33,0x39,0x32,0x00,0x56,0x30,0x33, 0x39,0x33,0x00,0x56,0x30,0x33,0x39,0x34,0x00,0x56,0x30,0x33,0x39,0x35,0x00,0x56, 0x30,0x33,0x39,0x36,0x00,0x56,0x30,0x33,0x39,0x37,0x00,0x56,0x30,0x33,0x39,0x38, 0x00,0x56,0x30,0x33,0x39,0x39,0x00,0x56,0x30,0x34,0x30,0x30,0x00,0x56,0x30,0x34, 0x30,0x31,0x00,0x56,0x30,0x34,0x30,0x32,0x00,0x56,0x30,0x34,0x30,0x33,0x00,0x56, 0x30,0x34,0x30,0x34,0x00,0x56,0x30,0x34,0x30,0x35,0x00,0x56,0x30,0x34,0x30,0x36, 0x00,0x56,0x30,0x34,0x30,0x37,0x00,0x56,0x30,0x34,0x30,0x38,0x00,0x56,0x30,0x34, 0x30,0x39,0x00,0x56,0x30,0x34,0x31,0x30,0x00,0x56,0x30,0x34,0x31,0x31,0x00,0x56, 0x30,0x34,0x31,0x32,0x00,0x56,0x30,0x34,0x31,0x33,0x00,0x56,0x30,0x34,0x31,0x34, 0x00,0x56,0x30,0x34,0x31,0x35,0x00,0x56,0x30,0x34,0x31,0x36,0x00,0x56,0x30,0x34, 0x31,0x37,0x00,0x56,0x30,0x34,0x31,0x38,0x00,0x56,0x30,0x34,0x31,0x39,0x00,0x56, 0x30,0x34,0x32,0x30,0x00,0x56,0x30,0x34,0x32,0x31,0x00,0x56,0x30,0x34,0x32,0x32, 0x00,0x56,0x30,0x34,0x32,0x33,0x00,0x56,0x30,0x34,0x32,0x34,0x00,0x56,0x30,0x34, 0x32,0x35,0x00,0x56,0x30,0x34,0x32,0x36,0x00,0x56,0x30,0x34,0x32,0x37,0x00,0x56, 0x30,0x34,0x32,0x38,0x00,0x56,0x30,0x34,0x32,0x39,0x00,0x56,0x30,0x34,0x33,0x30, 0x00,0x56,0x30,0x34,0x33,0x31,0x00,0x56,0x30,0x34,0x33,0x32,0x00,0x56,0x30,0x34, 0x33,0x33,0x00,0x56,0x30,0x34,0x33,0x34,0x00,0x56,0x30,0x34,0x33,0x35,0x00,0x56, 0x30,0x34,0x33,0x36,0x00,0x56,0x30,0x34,0x33,0x37,0x00,0x56,0x30,0x34,0x33,0x38, 0x00,0x56,0x30,0x34,0x33,0x39,0x00,0x56,0x30,0x34,0x34,0x30,0x00,0x56,0x30,0x34, 0x34,0x31,0x00,0x56,0x30,0x34,0x34,0x32,0x00,0x56,0x30,0x34,0x34,0x33,0x00,0x56, 0x30,0x34,0x34,0x34,0x00,0x56,0x30,0x34,0x34,0x35,0x00,0x56,0x30,0x34,0x34,0x36, 0x00,0x56,0x30,0x34,0x34,0x37,0x00,0x56,0x30,0x34,0x34,0x38,0x00,0x56,0x30,0x34, 0x34,0x39,0x00,0x56,0x30,0x34,0x35,0x30,0x00,0x56,0x30,0x34,0x35,0x31,0x00,0x56, 0x30,0x34,0x35,0x32,0x00,0x56,0x30,0x34,0x35,0x33,0x00,0x56,0x30,0x34,0x35,0x34, 0x00,0x56,0x30,0x34,0x35,0x35,0x00,0x56,0x30,0x34,0x35,0x36,0x00,0x56,0x30,0x34, 0x35,0x37,0x00,0x56,0x30,0x34,0x35,0x38,0x00,0x56,0x30,0x34,0x35,0x39,0x00,0x56, 0x30,0x34,0x36,0x30,0x00,0x56,0x30,0x34,0x36,0x31,0x00,0x56,0x30,0x34,0x36,0x32, 0x00,0x56,0x30,0x34,0x36,0x33,0x00,0x56,0x30,0x34,0x36,0x34,0x00,0x56,0x30,0x34, 0x36,0x35,0x00,0x56,0x30,0x34,0x36,0x36,0x00,0x56,0x30,0x34,0x36,0x37,0x00,0x56, 0x30,0x34,0x36,0x38,0x00,0x56,0x30,0x34,0x36,0x39,0x00,0x56,0x30,0x34,0x37,0x30, 0x00,0x56,0x30,0x34,0x37,0x31,0x00,0x56,0x30,0x34,0x37,0x32,0x00,0x56,0x30,0x34, 0x37,0x33,0x00,0x56,0x30,0x34,0x37,0x34,0x00,0x56,0x30,0x34,0x37,0x35,0x00,0x56, 0x30,0x34,0x37,0x36,0x00,0x56,0x30,0x34,0x37,0x37,0x00,0x56,0x30,0x34,0x37,0x38, 0x00,0x56,0x30,0x34,0x37,0x39,0x00,0x56,0x30,0x34,0x38,0x30,0x00,0x56,0x30,0x34, 0x38,0x31,0x00,0x56,0x30,0x34,0x38,0x32,0x00,0x56,0x30,0x34,0x38,0x33,0x00,0x56, 0x30,0x34,0x38,0x34,0x00,0x56,0x30,0x34,0x38,0x35,0x00,0x56,0x30,0x34,0x38,0x36, 0x00,0x56,0x30,0x34,0x38,0x37,0x00,0x56,0x30,0x34,0x38,0x38,0x00,0x56,0x30,0x34, 0x38,0x39,0x00,0x56,0x30,0x34,0x39,0x30,0x00,0x56,0x30,0x34,0x39,0x31,0x00,0x56, 0x30,0x34,0x39,0x32,0x00,0x56,0x30,0x34,0x39,0x33,0x00,0x56,0x30,0x34,0x39,0x34, 0x00,0x56,0x30,0x34,0x39,0x35,0x00,0x56,0x30,0x34,0x39,0x36,0x00,0x56,0x30,0x34, 0x39,0x37,0x00,0x56,0x30,0x34,0x39,0x38,0x00,0x56,0x30,0x34,0x39,0x39,0x00,0x56, 0x30,0x35,0x30,0x30,0x00,0x56,0x30,0x35,0x30,0x31,0x00,0x56,0x30,0x35,0x30,0x32, 0x00,0x56,0x30,0x35,0x30,0x33,0x00,0x56,0x30,0x35,0x30,0x34,0x00,0x56,0x30,0x35, 0x30,0x35,0x00,0x56,0x30,0x35,0x30,0x36,0x00,0x56,0x30,0x35,0x30,0x37,0x00,0x56, 0x30,0x35,0x30,0x38,0x00,0x56,0x30,0x35,0x30,0x39,0x00,0x56,0x30,0x35,0x31,0x30, 0x00,0x56,0x30,0x35,0x31,0x31,0x00,0x56,0x30,0x35,0x31,0x32,0x00,0x56,0x30,0x35, 0x31,0x33,0x00,0x56,0x30,0x35,0x31,0x34,0x00,0x56,0x30,0x35,0x31,0x35,0x00,0x56, 0x30,0x35,0x31,0x36,0x00,0x56,0x30,0x35,0x31,0x37,0x00,0x56,0x30,0x35,0x31,0x38, 0x00,0x56,0x30,0x35,0x31,0x39,0x00,0x56,0x30,0x35,0x32,0x30,0x00,0x56,0x30,0x35, 0x32,0x31,0x00,0x56,0x30,0x35,0x32,0x32,0x00,0x56,0x30,0x35,0x32,0x33,0x00,0x56, 0x30,0x35,0x32,0x34,0x00,0x56,0x30,0x35,0x32,0x35,0x00,0x56,0x30,0x35,0x32,0x36, 0x00,0x56,0x30,0x35,0x32,0x37,0x00,0x56,0x30,0x35,0x32,0x38,0x00,0x56,0x30,0x35, 0x32,0x39,0x00,0x56,0x30,0x35,0x33,0x30,0x00,0x56,0x30,0x35,0x33,0x31,0x00,0x56, 0x30,0x35,0x33,0x32,0x00,0x56,0x30,0x35,0x33,0x33,0x00,0x56,0x30,0x35,0x33,0x34, 0x00,0x56,0x30,0x35,0x33,0x35,0x00,0x56,0x30,0x35,0x33,0x36,0x00,0x56,0x30,0x35, 0x33,0x37,0x00,0x56,0x30,0x35,0x33,0x38,0x00,0x56,0x30,0x35,0x33,0x39,0x00,0x56, 0x30,0x35,0x34,0x30,0x00,0x56,0x30,0x35,0x34,0x31,0x00,0x56,0x30,0x35,0x34,0x32, 0x00,0x56,0x30,0x35,0x34,0x33,0x00,0x56,0x30,0x35,0x34,0x34,0x00,0x56,0x30,0x35, 0x34,0x35,0x00,0x56,0x30,0x35,0x34,0x36,0x00,0x56,0x30,0x35,0x34,0x37,0x00,0x56, 0x30,0x35,0x34,0x38,0x00,0x56,0x30,0x35,0x34,0x39,0x00,0x56,0x30,0x35,0x35,0x30, 0x00,0x56,0x30,0x35,0x35,0x31,0x00,0x56,0x30,0x35,0x35,0x32,0x00,0x56,0x30,0x35, 0x35,0x33,0x00,0x56,0x30,0x35,0x35,0x34,0x00,0x56,0x30,0x35,0x35,0x35,0x00,0x56, 0x30,0x35,0x35,0x36,0x00,0x56,0x30,0x35,0x35,0x37,0x00,0x56,0x30,0x35,0x35,0x38, 0x00,0x56,0x30,0x35,0x35,0x39,0x00,0x56,0x30,0x35,0x36,0x30,0x00,0x56,0x30,0x35, 0x36,0x31,0x00,0x56,0x30,0x35,0x36,0x32,0x00,0x56,0x30,0x35,0x36,0x33,0x00,0x56, 0x30,0x35,0x36,0x34,0x00,0x56,0x30,0x35,0x36,0x35,0x00,0x56,0x30,0x35,0x36,0x36, 0x00,0x56,0x30,0x35,0x36,0x37,0x00,0x56,0x30,0x35,0x36,0x38,0x00,0x56,0x30,0x35, 0x36,0x39,0x00,0x56,0x30,0x35,0x37,0x30,0x00,0x56,0x30,0x35,0x37,0x31,0x00,0x56, 0x30,0x35,0x37,0x32,0x00,0x56,0x30,0x35,0x37,0x33,0x00,0x56,0x30,0x35,0x37,0x34, 0x00,0x56,0x30,0x35,0x37,0x35,0x00,0x56,0x30,0x35,0x37,0x36,0x00,0x56,0x30,0x35, 0x37,0x37,0x00,0x56,0x30,0x35,0x37,0x38,0x00,0x56,0x30,0x35,0x37,0x39,0x00,0x56, 0x30,0x35,0x38,0x30,0x00,0x56,0x30,0x35,0x38,0x31,0x00,0x56,0x30,0x35,0x38,0x32, 0x00,0x56,0x30,0x35,0x38,0x33,0x00,0x56,0x30,0x35,0x38,0x34,0x00,0x56,0x30,0x35, 0x38,0x35,0x00,0x56,0x30,0x35,0x38,0x36,0x00,0x56,0x30,0x35,0x38,0x37,0x00,0x56, 0x30,0x35,0x38,0x38,0x00,0x56,0x30,0x35,0x38,0x39,0x00,0x56,0x30,0x35,0x39,0x30, 0x00,0x56,0x30,0x35,0x39,0x31,0x00,0x56,0x30,0x35,0x39,0x32,0x00,0x56,0x30,0x35, 0x39,0x33,0x00,0x56,0x30,0x35,0x39,0x34,0x00,0x56,0x30,0x35,0x39,0x35,0x00,0x56, 0x30,0x35,0x39,0x36,0x00,0x56,0x30,0x35,0x39,0x37,0x00,0x56,0x30,0x35,0x39,0x38, 0x00,0x56,0x30,0x35,0x39,0x39,0x00,0x56,0x30,0x36,0x30,0x30,0x00,0x56,0x30,0x36, 0x30,0x31,0x00,0x56,0x30,0x36,0x30,0x32,0x00,0x56,0x30,0x36,0x30,0x33,0x00,0x56, 0x30,0x36,0x30,0x34,0x00,0x56,0x30,0x36,0x30,0x35,0x00,0x56,0x30,0x36,0x30,0x36, 0x00,0x56,0x30,0x36,0x30,0x37,0x00,0x56,0x30,0x36,0x30,0x38,0x00,0x56,0x30,0x36, 0x30,0x39,0x00,0x56,0x30,0x36,0x31,0x30,0x00,0x56,0x30,0x36,0x31,0x31,0x00,0x56, 0x30,0x36,0x31,0x32,0x00,0x56,0x30,0x36,0x31,0x33,0x00,0x56,0x30,0x36,0x31,0x34, 0x00,0x56,0x30,0x36,0x31,0x35,0x00,0x56,0x30,0x36,0x31,0x36,0x00,0x56,0x30,0x36, 0x31,0x37,0x00,0x56,0x30,0x36,0x31,0x38,0x00,0x56,0x30,0x36,0x31,0x39,0x00,0x56, 0x30,0x36,0x32,0x30,0x00,0x56,0x30,0x36,0x32,0x31,0x00,0x56,0x30,0x36,0x32,0x32, 0x00,0x56,0x30,0x36,0x32,0x33,0x00,0x56,0x30,0x36,0x32,0x34,0x00,0x56,0x30,0x36, 0x32,0x35,0x00,0x56,0x30,0x36,0x32,0x36,0x00,0x56,0x30,0x36,0x32,0x37,0x00,0x56, 0x30,0x36,0x32,0x38,0x00,0x56,0x30,0x36,0x32,0x39,0x00,0x56,0x30,0x36,0x33,0x30, 0x00,0x56,0x30,0x36,0x33,0x31,0x00,0x56,0x30,0x36,0x33,0x32,0x00,0x56,0x30,0x36, 0x33,0x33,0x00,0x56,0x30,0x36,0x33,0x34,0x00,0x56,0x30,0x36,0x33,0x35,0x00,0x56, 0x30,0x36,0x33,0x36,0x00,0x56,0x30,0x36,0x33,0x37,0x00,0x56,0x30,0x36,0x33,0x38, 0x00,0x56,0x30,0x36,0x33,0x39,0x00,0x56,0x30,0x36,0x34,0x30,0x00,0x56,0x30,0x36, 0x34,0x31,0x00,0x56,0x30,0x36,0x34,0x32,0x00,0x56,0x30,0x36,0x34,0x33,0x00,0x56, 0x30,0x36,0x34,0x34,0x00,0x56,0x30,0x36,0x34,0x35,0x00,0x56,0x30,0x36,0x34,0x36, 0x00,0x56,0x30,0x36,0x34,0x37,0x00,0x56,0x30,0x36,0x34,0x38,0x00,0x56,0x30,0x36, 0x34,0x39,0x00,0x56,0x30,0x36,0x35,0x30,0x00,0x56,0x30,0x36,0x35,0x31,0x00,0x56, 0x30,0x36,0x35,0x32,0x00,0x56,0x30,0x36,0x35,0x33,0x00,0x56,0x30,0x36,0x35,0x34, 0x00,0x56,0x30,0x36,0x35,0x35,0x00,0x56,0x30,0x36,0x35,0x36,0x00,0x56,0x30,0x36, 0x35,0x37,0x00,0x56,0x30,0x36,0x35,0x38,0x00,0x56,0x30,0x36,0x35,0x39,0x00,0x56, 0x30,0x36,0x36,0x30,0x00,0x56,0x30,0x36,0x36,0x31,0x00,0x56,0x30,0x36,0x36,0x32, 0x00,0x56,0x30,0x36,0x36,0x33,0x00,0x56,0x30,0x36,0x36,0x34,0x00,0x56,0x30,0x36, 0x36,0x35,0x00,0x56,0x30,0x36,0x36,0x36,0x00,0x56,0x30,0x36,0x36,0x37,0x00,0x56, 0x30,0x36,0x36,0x38,0x00,0x56,0x30,0x36,0x36,0x39,0x00,0x56,0x30,0x36,0x37,0x30, 0x00,0x56,0x30,0x36,0x37,0x31,0x00,0x56,0x30,0x36,0x37,0x32,0x00,0x56,0x30,0x36, 0x37,0x33,0x00,0x56,0x30,0x36,0x37,0x34,0x00,0x56,0x30,0x36,0x37,0x35,0x00,0x56, 0x30,0x36,0x37,0x36,0x00,0x56,0x30,0x36,0x37,0x37,0x00,0x56,0x30,0x36,0x37,0x38, 0x00,0x56,0x30,0x36,0x37,0x39,0x00,0x56,0x30,0x36,0x38,0x30,0x00,0x56,0x30,0x36, 0x38,0x31,0x00,0x56,0x30,0x36,0x38,0x32,0x00,0x56,0x30,0x36,0x38,0x33,0x00,0x56, 0x30,0x36,0x38,0x34,0x00,0x56,0x30,0x36,0x38,0x35,0x00,0x56,0x30,0x36,0x38,0x36, 0x00,0x56,0x30,0x36,0x38,0x37,0x00,0x56,0x30,0x36,0x38,0x38,0x00,0x56,0x30,0x36, 0x38,0x39,0x00,0x56,0x30,0x36,0x39,0x30,0x00,0x56,0x30,0x36,0x39,0x31,0x00,0x56, 0x30,0x36,0x39,0x32,0x00,0x56,0x30,0x36,0x39,0x33,0x00,0x56,0x30,0x36,0x39,0x34, 0x00,0x56,0x30,0x36,0x39,0x35,0x00,0x56,0x30,0x36,0x39,0x36,0x00,0x56,0x30,0x36, 0x39,0x37,0x00,0x56,0x30,0x36,0x39,0x38,0x00,0x56,0x30,0x36,0x39,0x39,0x00,0x56, 0x30,0x37,0x30,0x30,0x00,0x56,0x30,0x37,0x30,0x31,0x00,0x56,0x30,0x37,0x30,0x32, 0x00,0x56,0x30,0x37,0x30,0x33,0x00,0x56,0x30,0x37,0x30,0x34,0x00,0x56,0x30,0x37, 0x30,0x35,0x00,0x56,0x30,0x37,0x30,0x36,0x00,0x56,0x30,0x37,0x30,0x37,0x00,0x56, 0x30,0x37,0x30,0x38,0x00,0x56,0x30,0x37,0x30,0x39,0x00,0x56,0x30,0x37,0x31,0x30, 0x00,0x56,0x30,0x37,0x31,0x31,0x00,0x56,0x30,0x37,0x31,0x32,0x00,0x56,0x30,0x37, 0x31,0x33,0x00,0x56,0x30,0x37,0x31,0x34,0x00,0x56,0x30,0x37,0x31,0x35,0x00,0x56, 0x30,0x37,0x31,0x36,0x00,0x56,0x30,0x37,0x31,0x37,0x00,0x56,0x30,0x37,0x31,0x38, 0x00,0x56,0x30,0x37,0x31,0x39,0x00,0x56,0x30,0x37,0x32,0x30,0x00,0x56,0x30,0x37, 0x32,0x31,0x00,0x56,0x30,0x37,0x32,0x32,0x00,0x56,0x30,0x37,0x32,0x33,0x00,0x56, 0x30,0x37,0x32,0x34,0x00,0x56,0x30,0x37,0x32,0x35,0x00,0x56,0x30,0x37,0x32,0x36, 0x00,0x56,0x30,0x37,0x32,0x37,0x00,0x56,0x30,0x37,0x32,0x38,0x00,0x56,0x30,0x37, 0x32,0x39,0x00,0x56,0x30,0x37,0x33,0x30,0x00,0x56,0x30,0x37,0x33,0x31,0x00,0x56, 0x30,0x37,0x33,0x32,0x00,0x56,0x30,0x37,0x33,0x33,0x00,0x56,0x30,0x37,0x33,0x34, 0x00,0x56,0x30,0x37,0x33,0x35,0x00,0x56,0x30,0x37,0x33,0x36,0x00,0x56,0x30,0x37, 0x33,0x37,0x00,0x56,0x30,0x37,0x33,0x38,0x00,0x56,0x30,0x37,0x33,0x39,0x00,0x56, 0x30,0x37,0x34,0x30,0x00,0x56,0x30,0x37,0x34,0x31,0x00,0x56,0x30,0x37,0x34,0x32, 0x00,0x56,0x30,0x37,0x34,0x33,0x00,0x56,0x30,0x37,0x34,0x34,0x00,0x56,0x30,0x37, 0x34,0x35,0x00,0x56,0x30,0x37,0x34,0x36,0x00,0x56,0x30,0x37,0x34,0x37,0x00,0x56, 0x30,0x37,0x34,0x38,0x00,0x56,0x30,0x37,0x34,0x39,0x00,0x56,0x30,0x37,0x35,0x30, 0x00,0x56,0x30,0x37,0x35,0x31,0x00,0x56,0x30,0x37,0x35,0x32,0x00,0x56,0x30,0x37, 0x35,0x33,0x00,0x56,0x30,0x37,0x35,0x34,0x00,0x56,0x30,0x37,0x35,0x35,0x00,0x56, 0x30,0x37,0x35,0x36,0x00,0x56,0x30,0x37,0x35,0x37,0x00,0x56,0x30,0x37,0x35,0x38, 0x00,0x56,0x30,0x37,0x35,0x39,0x00,0x56,0x30,0x37,0x36,0x30,0x00,0x56,0x30,0x37, 0x36,0x31,0x00,0x56,0x30,0x37,0x36,0x32,0x00,0x56,0x30,0x37,0x36,0x33,0x00,0x56, 0x30,0x37,0x36,0x34,0x00,0x56,0x30,0x37,0x36,0x35,0x00,0x56,0x30,0x37,0x36,0x36, 0x00,0x56,0x30,0x37,0x36,0x37,0x00,0x56,0x30,0x37,0x36,0x38,0x00,0x56,0x30,0x37, 0x36,0x39,0x00,0x56,0x30,0x37,0x37,0x30,0x00,0x56,0x30,0x37,0x37,0x31,0x00,0x56, 0x30,0x37,0x37,0x32,0x00,0x56,0x30,0x37,0x37,0x33,0x00,0x56,0x30,0x37,0x37,0x34, 0x00,0x56,0x30,0x37,0x37,0x35,0x00,0x56,0x30,0x37,0x37,0x36,0x00,0x56,0x30,0x37, 0x37,0x37,0x00,0x56,0x30,0x37,0x37,0x38,0x00,0x56,0x30,0x37,0x37,0x39,0x00,0x56, 0x30,0x37,0x38,0x30,0x00,0x56,0x30,0x37,0x38,0x31,0x00,0x56,0x30,0x37,0x38,0x32, 0x00,0x56,0x30,0x37,0x38,0x33,0x00,0x56,0x30,0x37,0x38,0x34,0x00,0x56,0x30,0x37, 0x38,0x35,0x00,0x56,0x30,0x37,0x38,0x36,0x00,0x56,0x30,0x37,0x38,0x37,0x00,0x56, 0x30,0x37,0x38,0x38,0x00,0x56,0x30,0x37,0x38,0x39,0x00,0x56,0x30,0x37,0x39,0x30, 0x00,0x56,0x30,0x37,0x39,0x31,0x00,0x56,0x30,0x37,0x39,0x32,0x00,0x56,0x30,0x37, 0x39,0x33,0x00,0x56,0x30,0x37,0x39,0x34,0x00,0x56,0x30,0x37,0x39,0x35,0x00,0x56, 0x30,0x37,0x39,0x36,0x00,0x56,0x30,0x37,0x39,0x37,0x00,0x56,0x30,0x37,0x39,0x38, 0x00,0x56,0x30,0x37,0x39,0x39,0x00,0x56,0x30,0x38,0x30,0x30,0x00,0x56,0x30,0x38, 0x30,0x31,0x00,0x56,0x30,0x38,0x30,0x32,0x00,0x56,0x30,0x38,0x30,0x33,0x00,0x56, 0x30,0x38,0x30,0x34,0x00,0x56,0x30,0x38,0x30,0x35,0x00,0x56,0x30,0x38,0x30,0x36, 0x00,0x56,0x30,0x38,0x30,0x37,0x00,0x56,0x30,0x38,0x30,0x38,0x00,0x56,0x30,0x38, 0x30,0x39,0x00,0x56,0x30,0x38,0x31,0x30,0x00,0x56,0x30,0x38,0x31,0x31,0x00,0x56, 0x30,0x38,0x31,0x32,0x00,0x56,0x30,0x38,0x31,0x33,0x00,0x56,0x30,0x38,0x31,0x34, 0x00,0x56,0x30,0x38,0x31,0x35,0x00,0x56,0x30,0x38,0x31,0x36,0x00,0x56,0x30,0x38, 0x31,0x37,0x00,0x56,0x30,0x38,0x31,0x38,0x00,0x56,0x30,0x38,0x31,0x39,0x00,0x56, 0x30,0x38,0x32,0x30,0x00,0x56,0x30,0x38,0x32,0x31,0x00,0x56,0x30,0x38,0x32,0x32, 0x00,0x56,0x30,0x38,0x32,0x33,0x00,0x56,0x30,0x38,0x32,0x34,0x00,0x56,0x30,0x38, 0x32,0x35,0x00,0x56,0x30,0x38,0x32,0x36,0x00,0x56,0x30,0x38,0x32,0x37,0x00,0x56, 0x30,0x38,0x32,0x38,0x00,0x56,0x30,0x38,0x32,0x39,0x00,0x56,0x30,0x38,0x33,0x30, 0x00,0x56,0x30,0x38,0x33,0x31,0x00,0x56,0x30,0x38,0x33,0x32,0x00,0x56,0x30,0x38, 0x33,0x33,0x00,0x56,0x30,0x38,0x33,0x34,0x00,0x56,0x30,0x38,0x33,0x35,0x00,0x56, 0x30,0x38,0x33,0x36,0x00,0x56,0x30,0x38,0x33,0x37,0x00,0x56,0x30,0x38,0x33,0x38, 0x00,0x56,0x30,0x38,0x33,0x39,0x00,0x56,0x30,0x38,0x34,0x30,0x00,0x56,0x30,0x38, 0x34,0x31,0x00,0x56,0x30,0x38,0x34,0x32,0x00,0x56,0x30,0x38,0x34,0x33,0x00,0x56, 0x30,0x38,0x34,0x34,0x00,0x56,0x30,0x38,0x34,0x35,0x00,0x56,0x30,0x38,0x34,0x36, 0x00,0x56,0x30,0x38,0x34,0x37,0x00,0x56,0x30,0x38,0x34,0x38,0x00,0x56,0x30,0x38, 0x34,0x39,0x00,0x56,0x30,0x38,0x35,0x30,0x00,0x56,0x30,0x38,0x35,0x31,0x00,0x56, 0x30,0x38,0x35,0x32,0x00,0x56,0x30,0x38,0x35,0x33,0x00,0x56,0x30,0x38,0x35,0x34, 0x00,0x56,0x30,0x38,0x35,0x35,0x00,0x56,0x30,0x38,0x35,0x36,0x00,0x56,0x30,0x38, 0x35,0x37,0x00,0x56,0x30,0x38,0x35,0x38,0x00,0x56,0x30,0x38,0x35,0x39,0x00,0x56, 0x30,0x38,0x36,0x30,0x00,0x56,0x30,0x38,0x36,0x31,0x00,0x56,0x30,0x38,0x36,0x32, 0x00,0x56,0x30,0x38,0x36,0x33,0x00,0x56,0x30,0x38,0x36,0x34,0x00,0x56,0x30,0x38, 0x36,0x35,0x00,0x56,0x30,0x38,0x36,0x36,0x00,0x56,0x30,0x38,0x36,0x37,0x00,0x56, 0x30,0x38,0x36,0x38,0x00,0x56,0x30,0x38,0x36,0x39,0x00,0x56,0x30,0x38,0x37,0x30, 0x00,0x56,0x30,0x38,0x37,0x31,0x00,0x56,0x30,0x38,0x37,0x32,0x00,0x56,0x30,0x38, 0x37,0x33,0x00,0x56,0x30,0x38,0x37,0x34,0x00,0x56,0x30,0x38,0x37,0x35,0x00,0x56, 0x30,0x38,0x37,0x36,0x00,0x56,0x30,0x38,0x37,0x37,0x00,0x56,0x30,0x38,0x37,0x38, 0x00,0x56,0x30,0x38,0x37,0x39,0x00,0x56,0x30,0x38,0x38,0x30,0x00,0x56,0x30,0x38, 0x38,0x31,0x00,0x56,0x30,0x38,0x38,0x32,0x00,0x56,0x30,0x38,0x38,0x33,0x00,0x56, 0x30,0x38,0x38,0x34,0x00,0x56,0x30,0x38,0x38,0x35,0x00,0x56,0x30,0x38,0x38,0x36, 0x00,0x56,0x30,0x38,0x38,0x37,0x00,0x56,0x30,0x38,0x38,0x38,0x00,0x56,0x30,0x38, 0x38,0x39,0x00,0x56,0x30,0x38,0x39,0x30,0x00,0x56,0x30,0x38,0x39,0x31,0x00,0x56, 0x30,0x38,0x39,0x32,0x00,0x56,0x30,0x38,0x39,0x33,0x00,0x56,0x30,0x38,0x39,0x34, 0x00,0x56,0x30,0x38,0x39,0x35,0x00,0x56,0x30,0x38,0x39,0x36,0x00,0x56,0x30,0x38, 0x39,0x37,0x00,0x56,0x30,0x38,0x39,0x38,0x00,0x56,0x30,0x38,0x39,0x39,0x00,0x56, 0x30,0x39,0x30,0x30,0x00,0x56,0x30,0x39,0x30,0x31,0x00,0x56,0x30,0x39,0x30,0x32, 0x00,0x56,0x30,0x39,0x30,0x33,0x00,0x56,0x30,0x39,0x30,0x34,0x00,0x56,0x30,0x39, 0x30,0x35,0x00,0x56,0x30,0x39,0x30,0x36,0x00,0x56,0x30,0x39,0x30,0x37,0x00,0x56, 0x30,0x39,0x30,0x38,0x00,0x56,0x30,0x39,0x30,0x39,0x00,0x56,0x30,0x39,0x31,0x30, 0x00,0x56,0x30,0x39,0x31,0x31,0x00,0x56,0x30,0x39,0x31,0x32,0x00,0x56,0x30,0x39, 0x31,0x33,0x00,0x56,0x30,0x39,0x31,0x34,0x00,0x56,0x30,0x39,0x31,0x35,0x00,0x56, 0x30,0x39,0x31,0x36,0x00,0x56,0x30,0x39,0x31,0x37,0x00,0x56,0x30,0x39,0x31,0x38, 0x00,0x56,0x30,0x39,0x31,0x39,0x00,0x56,0x30,0x39,0x32,0x30,0x00,0x56,0x30,0x39, 0x32,0x31,0x00,0x56,0x30,0x39,0x32,0x32,0x00,0x56,0x30,0x39,0x32,0x33,0x00,0x56, 0x30,0x39,0x32,0x34,0x00,0x56,0x30,0x39,0x32,0x35,0x00,0x56,0x30,0x39,0x32,0x36, 0x00,0x56,0x30,0x39,0x32,0x37,0x00,0x56,0x30,0x39,0x32,0x38,0x00,0x56,0x30,0x39, 0x32,0x39,0x00,0x56,0x30,0x39,0x33,0x30,0x00,0x56,0x30,0x39,0x33,0x31,0x00,0x56, 0x30,0x39,0x33,0x32,0x00,0x56,0x30,0x39,0x33,0x33,0x00,0x56,0x30,0x39,0x33,0x34, 0x00,0x56,0x30,0x39,0x33,0x35,0x00,0x56,0x30,0x39,0x33,0x36,0x00,0x56,0x30,0x39, 0x33,0x37,0x00,0x56,0x30,0x39,0x33,0x38,0x00,0x56,0x30,0x39,0x33,0x39,0x00,0x56, 0x30,0x39,0x34,0x30,0x00,0x56,0x30,0x39,0x34,0x31,0x00,0x56,0x30,0x39,0x34,0x32, 0x00,0x56,0x30,0x39,0x34,0x33,0x00,0x56,0x30,0x39,0x34,0x34,0x00,0x56,0x30,0x39, 0x34,0x35,0x00,0x56,0x30,0x39,0x34,0x36,0x00,0x56,0x30,0x39,0x34,0x37,0x00,0x56, 0x30,0x39,0x34,0x38,0x00,0x56,0x30,0x39,0x34,0x39,0x00,0x56,0x30,0x39,0x35,0x30, 0x00,0x56,0x30,0x39,0x35,0x31,0x00,0x56,0x30,0x39,0x35,0x32,0x00,0x56,0x30,0x39, 0x35,0x33,0x00,0x56,0x30,0x39,0x35,0x34,0x00,0x56,0x30,0x39,0x35,0x35,0x00,0x56, 0x30,0x39,0x35,0x36,0x00,0x56,0x30,0x39,0x35,0x37,0x00,0x56,0x30,0x39,0x35,0x38, 0x00,0x56,0x30,0x39,0x35,0x39,0x00,0x56,0x30,0x39,0x36,0x30,0x00,0x56,0x30,0x39, 0x36,0x31,0x00,0x56,0x30,0x39,0x36,0x32,0x00,0x56,0x30,0x39,0x36,0x33,0x00,0x56, 0x30,0x39,0x36,0x34,0x00,0x56,0x30,0x39,0x36,0x35,0x00,0x56,0x30,0x39,0x36,0x36, 0x00,0x56,0x30,0x39,0x36,0x37,0x00,0x56,0x30,0x39,0x36,0x38,0x00,0x56,0x30,0x39, 0x36,0x39,0x00,0x56,0x30,0x39,0x37,0x30,0x00,0x56,0x30,0x39,0x37,0x31,0x00,0x56, 0x30,0x39,0x37,0x32,0x00,0x56,0x30,0x39,0x37,0x33,0x00,0x56,0x30,0x39,0x37,0x34, 0x00,0x56,0x30,0x39,0x37,0x35,0x00,0x56,0x30,0x39,0x37,0x36,0x00,0x56,0x30,0x39, 0x37,0x37,0x00,0x56,0x30,0x39,0x37,0x38,0x00,0x56,0x30,0x39,0x37,0x39,0x00,0x56, 0x30,0x39,0x38,0x30,0x00,0x56,0x30,0x39,0x38,0x31,0x00,0x56,0x30,0x39,0x38,0x32, 0x00,0x56,0x30,0x39,0x38,0x33,0x00,0x56,0x30,0x39,0x38,0x34,0x00,0x56,0x30,0x39, 0x38,0x35,0x00,0x56,0x30,0x39,0x38,0x36,0x00,0x56,0x30,0x39,0x38,0x37,0x00,0x56, 0x30,0x39,0x38,0x38,0x00,0x56,0x30,0x39,0x38,0x39,0x00,0x56,0x30,0x39,0x39,0x30, 0x00,0x56,0x30,0x39,0x39,0x31,0x00,0x56,0x30,0x39,0x39,0x32,0x00,0x56,0x30,0x39, 0x39,0x33,0x00,0x56,0x30,0x39,0x39,0x34,0x00,0x56,0x30,0x39,0x39,0x35,0x00,0x56, 0x30,0x39,0x39,0x36,0x00,0x56,0x30,0x39,0x39,0x37,0x00,0x56,0x30,0x39,0x39,0x38, 0x00,0x56,0x30,0x39,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x30,0x00,0x56,0x31,0x30, 0x30,0x31,0x00,0x56,0x31,0x30,0x30,0x32,0x00,0x56,0x31,0x30,0x30,0x33,0x00,0x56, 0x31,0x30,0x30,0x34,0x00,0x56,0x31,0x30,0x30,0x35,0x00,0x56,0x31,0x30,0x30,0x36, 0x00,0x56,0x31,0x30,0x30,0x37,0x00,0x56,0x31,0x30,0x30,0x38,0x00,0x56,0x31,0x30, 0x30,0x39,0x00,0x56,0x31,0x30,0x31,0x30,0x00,0x56,0x31,0x30,0x31,0x31,0x00,0x56, 0x31,0x30,0x31,0x32,0x00,0x56,0x31,0x30,0x31,0x33,0x00,0x56,0x31,0x30,0x31,0x34, 0x00,0x56,0x31,0x30,0x31,0x35,0x00,0x56,0x31,0x30,0x31,0x36,0x00,0x56,0x31,0x30, 0x31,0x37,0x00,0x56,0x31,0x30,0x31,0x38,0x00,0x56,0x31,0x30,0x31,0x39,0x00,0x56, 0x31,0x30,0x32,0x30,0x00,0x56,0x31,0x30,0x32,0x31,0x00,0x56,0x31,0x30,0x32,0x32, 0x00,0x56,0x31,0x30,0x32,0x33,0x00,0x56,0x31,0x30,0x32,0x34,0x00,0x56,0x31,0x30, 0x32,0x35,0x00,0x56,0x31,0x30,0x32,0x36,0x00,0x56,0x31,0x30,0x32,0x37,0x00,0x56, 0x31,0x30,0x32,0x38,0x00,0x56,0x31,0x30,0x32,0x39,0x00,0x56,0x31,0x30,0x33,0x30, 0x00,0x56,0x31,0x30,0x33,0x31,0x00,0x56,0x31,0x30,0x33,0x32,0x00,0x56,0x31,0x30, 0x33,0x33,0x00,0x56,0x31,0x30,0x33,0x34,0x00,0x56,0x31,0x30,0x33,0x35,0x00,0x56, 0x31,0x30,0x33,0x36,0x00,0x56,0x31,0x30,0x33,0x37,0x00,0x56,0x31,0x30,0x33,0x38, 0x00,0x56,0x31,0x30,0x33,0x39,0x00,0x56,0x31,0x30,0x34,0x30,0x00,0x56,0x31,0x30, 0x34,0x31,0x00,0x56,0x31,0x30,0x34,0x32,0x00,0x56,0x31,0x30,0x34,0x33,0x00,0x56, 0x31,0x30,0x34,0x34,0x00,0x56,0x31,0x30,0x34,0x35,0x00,0x56,0x31,0x30,0x34,0x36, 0x00,0x56,0x31,0x30,0x34,0x37,0x00,0x56,0x31,0x30,0x34,0x38,0x00,0x56,0x31,0x30, 0x34,0x39,0x00,0x56,0x31,0x30,0x35,0x30,0x00,0x56,0x31,0x30,0x35,0x31,0x00,0x56, 0x31,0x30,0x35,0x32,0x00,0x56,0x31,0x30,0x35,0x33,0x00,0x56,0x31,0x30,0x35,0x34, 0x00,0x56,0x31,0x30,0x35,0x35,0x00,0x56,0x31,0x30,0x35,0x36,0x00,0x56,0x31,0x30, 0x35,0x37,0x00,0x56,0x31,0x30,0x35,0x38,0x00,0x56,0x31,0x30,0x35,0x39,0x00,0x56, 0x31,0x30,0x36,0x30,0x00,0x56,0x31,0x30,0x36,0x31,0x00,0x56,0x31,0x30,0x36,0x32, 0x00,0x56,0x31,0x30,0x36,0x33,0x00,0x56,0x31,0x30,0x36,0x34,0x00,0x56,0x31,0x30, 0x36,0x35,0x00,0x56,0x31,0x30,0x36,0x36,0x00,0x56,0x31,0x30,0x36,0x37,0x00,0x56, 0x31,0x30,0x36,0x38,0x00,0x56,0x31,0x30,0x36,0x39,0x00,0x56,0x31,0x30,0x37,0x30, 0x00,0x56,0x31,0x30,0x37,0x31,0x00,0x56,0x31,0x30,0x37,0x32,0x00,0x56,0x31,0x30, 0x37,0x33,0x00,0x56,0x31,0x30,0x37,0x34,0x00,0x56,0x31,0x30,0x37,0x35,0x00,0x56, 0x31,0x30,0x37,0x36,0x00,0x56,0x31,0x30,0x37,0x37,0x00,0x56,0x31,0x30,0x37,0x38, 0x00,0x56,0x31,0x30,0x37,0x39,0x00,0x56,0x31,0x30,0x38,0x30,0x00,0x56,0x31,0x30, 0x38,0x31,0x00,0x56,0x31,0x30,0x38,0x32,0x00,0x56,0x31,0x30,0x38,0x33,0x00,0x56, 0x31,0x30,0x38,0x34,0x00,0x56,0x31,0x30,0x38,0x35,0x00,0x56,0x31,0x30,0x38,0x36, 0x00,0x56,0x31,0x30,0x38,0x37,0x00,0x56,0x31,0x30,0x38,0x38,0x00,0x56,0x31,0x30, 0x38,0x39,0x00,0x56,0x31,0x30,0x39,0x30,0x00,0x56,0x31,0x30,0x39,0x31,0x00,0x56, 0x31,0x30,0x39,0x32,0x00,0x56,0x31,0x30,0x39,0x33,0x00,0x56,0x31,0x30,0x39,0x34, 0x00,0x56,0x31,0x30,0x39,0x35,0x00,0x56,0x31,0x30,0x39,0x36,0x00,0x56,0x31,0x30, 0x39,0x37,0x00,0x56,0x31,0x30,0x39,0x38,0x00,0x56,0x31,0x30,0x39,0x39,0x00,0x56, 0x31,0x31,0x30,0x30,0x00,0x56,0x31,0x31,0x30,0x31,0x00,0x56,0x31,0x31,0x30,0x32, 0x00,0x56,0x31,0x31,0x30,0x33,0x00,0x56,0x31,0x31,0x30,0x34,0x00,0x56,0x31,0x31, 0x30,0x35,0x00,0x56,0x31,0x31,0x30,0x36,0x00,0x56,0x31,0x31,0x30,0x37,0x00,0x56, 0x31,0x31,0x30,0x38,0x00,0x56,0x31,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x31,0x30, 0x00,0x56,0x31,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x31,0x32,0x00,0x56,0x31,0x31, 0x31,0x33,0x00,0x56,0x31,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x31,0x35,0x00,0x56, 0x31,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x31,0x38, 0x00,0x56,0x31,0x31,0x31,0x39,0x00,0x56,0x31,0x31,0x32,0x30,0x00,0x56,0x31,0x31, 0x32,0x31,0x00,0x56,0x31,0x31,0x32,0x32,0x00,0x56,0x31,0x31,0x32,0x33,0x00,0x56, 0x31,0x31,0x32,0x34,0x00,0x56,0x31,0x31,0x32,0x35,0x00,0x56,0x31,0x31,0x32,0x36, 0x00,0x56,0x31,0x31,0x32,0x37,0x00,0x56,0x31,0x31,0x32,0x38,0x00,0x56,0x31,0x31, 0x32,0x39,0x00,0x56,0x31,0x31,0x33,0x30,0x00,0x56,0x31,0x31,0x33,0x31,0x00,0x56, 0x31,0x31,0x33,0x32,0x00,0x50,0x30,0x31,0x00,0x50,0x30,0x32,0x00,0x50,0x30,0x33, 0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30,0x36,0x00,0x50,0x30,0x37, 0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31, 0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31,0x35, 0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31,0x39, 0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32,0x33, 0x00,0x50,0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32,0x37, 0x00,0x50,0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33,0x31, 0x00,0x50,0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33,0x35, 0x00,0x50,0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33,0x38,0x00,0x50,0x33,0x39, 0x00,0x50,0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34,0x32,0x00,0x50,0x34,0x33, 0x00,0x50,0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34,0x36,0x00,0x50,0x34,0x37, 0x00,0x50,0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35,0x30,0x00,0x50,0x35,0x31, 0x00,0x50,0x35,0x32,0x00,0x50,0x35,0x33,0x00,0x50,0x35,0x34,0x00,0x50,0x35,0x35, 0x00,0x50,0x35,0x36,0x00,0x50,0x35,0x37,0x00,0x50,0x35,0x38,0x00,0x50,0x35,0x39, 0x00,0x50,0x36,0x30,0x00,0x50,0x36,0x31,0x00,0x50,0x36,0x32,0x00,0x50,0x36,0x33, 0x00,0x50,0x36,0x34,0x00,0x50,0x36,0x35,0x00,0x50,0x36,0x36,0x00,0x50,0x36,0x37, 0x00,0x50,0x36,0x38,0x00,0x45,0x6e,0x63,0x4d,0x42,0x5f,0x50,0x5f,0x42,0x42,0x5f, 0x30,0x5f,0x31,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f, 0x33,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69, 0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x75,0x72,0x65,0x6d,0x6a,0x6a, 0x2e,0x35,0x5f,0x42,0x42,0x5f,0x33,0x5f,0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35, 0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00,0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42, 0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42,0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f, 0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42, 0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x31,0x33,0x00, 0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34,0x00,0x42,0x42,0x5f,0x31,0x34,0x5f,0x31, 0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f,0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x36, 0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x31,0x38,0x00,0x5f,0x5a,0x32, 0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f, 0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x73,0x73,0x2e,0x34,0x5f,0x42,0x42, 0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x32,0x30,0x00, 0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00,0x42,0x42,0x5f,0x32,0x31,0x5f,0x32, 0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32,0x33,0x00,0x42,0x42,0x5f,0x32,0x33, 0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34,0x5f,0x32,0x35,0x00,0x54,0x30,0x30, 0x36,0x00,0x54,0x30,0x30,0x37,0x00,0x54,0x30,0x30,0x38,0x00,0x54,0x30,0x30,0x39, 0x00,0x54,0x30,0x31,0x30,0x00,0x54,0x30,0x31,0x31,0x00,0x54,0x30,0x31,0x32,0x00, 0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65, 0x72,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x4d,0x04,0x00, 0x00,0x1a,0x00,0x00,0x00,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0x00, 0xc7,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc8, 0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xca,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xcc,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd0, 0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xd2,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd4,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd6,0x00,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd8, 0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xda,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xdc,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00, 0xdf,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0, 0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xe2,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf9,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfa,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0a,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x51,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7e,0x01,0x00, 0x00,0x00,0x7f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x80,0x01,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x82,0x01,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x84,0x01,0x00,0x00,0x00,0x85,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x86,0x01,0x00, 0x00,0x00,0x87,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x88,0x01,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x8a,0x01,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8d,0x01,0x00,0x00,0x00,0x8e,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01, 0x00,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x51,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf9,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfa,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfb,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0a,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00, 0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02, 0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x51,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02, 0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x02,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x04,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x51,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x24,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x24,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x21,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x02,0x00,0x00,0x52,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x02,0x00,0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x02,0x00,0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x02,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x04, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02, 0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00, 0x00,0x54,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x53,0x60,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x51,0x48,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x54,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02, 0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x15,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x15,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x15,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x02,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x02,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x23,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x02,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x54, 0x80,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x55,0x20, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x12,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x20,0x01,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x20,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x20,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x55,0x00,0x01,0x2d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x51,0x08,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x51,0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x02,0x00,0x00,0x51,0x08,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x02,0x00,0x00,0x51,0x08,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x02,0x00,0x00,0x51,0x08,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec, 0x02,0x00,0x00,0x51,0x08,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02, 0x00,0x00,0x51,0x08,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00, 0x00,0x51,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00, 0x51,0x08,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x51, 0x08,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x51,0x08, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x51,0x08,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x51,0x08,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x51,0x08,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x51,0x08,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x51,0x08,0x00,0x42,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf7,0x02,0x00,0x00,0x20,0x01,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x55,0x00,0x01,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf9,0x02,0x00,0x00,0x20,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfa,0x02,0x00,0x00,0x55,0x00,0x01,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfb,0x02,0x00,0x00,0x51,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x02,0x00,0x00,0x51,0x08,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02, 0x00,0x00,0x51,0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00, 0x00,0x51,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00, 0x51,0x08,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x51, 0x08,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x51,0x08, 0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x51,0x08,0x00, 0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x51,0x08,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x51,0x08,0x00,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x51,0x08,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x51,0x08,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x51,0x08,0x00,0x4f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x51,0x08,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0x03,0x00,0x00,0x51,0x08,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0a,0x03,0x00,0x00,0x51,0x08,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x03,0x00,0x00,0x55,0x00,0x01,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x03,0x00,0x00,0x53,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03, 0x00,0x00,0x53,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00, 0x00,0x53,0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00, 0x53,0x20,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x53, 0x20,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x53,0x20, 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x53,0x20,0x00, 0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x53,0x20,0x00,0x7a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x52,0x20,0x00,0x73,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x52,0x20,0x00,0x74,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x52,0x20,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x52,0x20,0x00,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x52,0x20,0x00,0x77,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x03,0x00,0x00,0x52,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x03,0x00,0x00,0x52,0x20,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x03,0x00,0x00,0x52,0x20,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x03,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03, 0x00,0x00,0x55,0x00,0x01,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00, 0x00,0x51,0x08,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x51,0x08,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x51, 0x08,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x51,0x08, 0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x51,0x08,0x00, 0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x51,0x08,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x51,0x08,0x00,0x87,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x51,0x08,0x00,0x88,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x51,0x08,0x00,0x89,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x51,0x08,0x00,0x8a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x51,0x08,0x00,0x8b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x51,0x08,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x03,0x00,0x00,0x51,0x08,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x03,0x00,0x00,0x51,0x08,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x03,0x00,0x00,0x51,0x08,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03, 0x00,0x00,0x51,0x08,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00, 0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00, 0x55,0x00,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x55, 0x00,0x01,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x51,0x08, 0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x51,0x08,0x00, 0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x51,0x08,0x00,0x93, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x51,0x08,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x51,0x08,0x00,0x95,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x51,0x08,0x00,0x96,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x03,0x00,0x00,0x51,0x08,0x00,0x97,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x51,0x08,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x03,0x00,0x00,0x51,0x08,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x03,0x00,0x00,0x51,0x08,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x03,0x00,0x00,0x51,0x08,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x03,0x00,0x00,0x51,0x08,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03, 0x00,0x00,0x51,0x08,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00, 0x00,0x51,0x08,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00, 0x51,0x08,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x51, 0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0x55,0x00, 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x53,0x20,0x00, 0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x53,0x20,0x00,0xc2, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x53,0x20,0x00,0xc3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x53,0x20,0x00,0xc4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x53,0x20,0x00,0xc5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x53,0x20,0x00,0xc6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x53,0x20,0x00,0xc7,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x03,0x00,0x00,0x53,0x20,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x03,0x00,0x00,0x52,0x20,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x03,0x00,0x00,0x52,0x20,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x03,0x00,0x00,0x52,0x20,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03, 0x00,0x00,0x52,0x20,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00, 0x00,0x52,0x20,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00, 0x52,0x20,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x52, 0x20,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x03,0x00,0x00,0x52,0x20, 0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x20,0x01,0x00, 0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x55,0x00,0x01,0xda, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x51,0x08,0x00,0xdf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x51,0x08,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x51,0x08,0x00,0xe1,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x51,0x08,0x00,0xe2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x51,0x08,0x00,0xe3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x03,0x00,0x00,0x51,0x08,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x03,0x00,0x00,0x51,0x08,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x03,0x00,0x00,0x51,0x08,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x03,0x00,0x00,0x51,0x08,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03, 0x00,0x00,0x51,0x08,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00, 0x00,0x51,0x08,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00, 0x51,0x08,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x51, 0x08,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x51,0x08, 0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x51,0x08,0x00, 0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x03,0x00,0x00,0x51,0x08,0x00,0xee, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x55,0x00,0x01,0xdb,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x03,0x00,0x00,0x20,0x01,0x00,0xdc,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x55,0x00,0x01,0xdd,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x51,0x08,0x00,0xef,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x51,0x08,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x03,0x00,0x00,0x51,0x08,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x03,0x00,0x00,0x51,0x08,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x03,0x00,0x00,0x51,0x08,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x03,0x00,0x00,0x51,0x08,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03, 0x00,0x00,0x51,0x08,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00, 0x00,0x51,0x08,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00, 0x51,0x08,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x51, 0x08,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x51,0x08, 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x03,0x00,0x00,0x51,0x08,0x00, 0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x51,0x08,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x51,0x08,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x03,0x00,0x00,0x51,0x08,0x00,0xfd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x03,0x00,0x00,0x51,0x08,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x55,0x00,0x01,0xde,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x53,0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x03,0x00,0x00,0x53,0x20,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x03,0x00,0x00,0x53,0x20,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x03,0x00,0x00,0x53,0x20,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x03,0x00,0x00,0x53,0x20,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03, 0x00,0x00,0x53,0x20,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00, 0x00,0x53,0x20,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00, 0x53,0x20,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x52, 0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x52,0x20, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x52,0x20,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x52,0x20,0x00,0x22, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x52,0x20,0x00,0x23,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x52,0x20,0x00,0x24,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x52,0x20,0x00,0x25,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x03,0x00,0x00,0x52,0x20,0x00,0x26,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x55,0x00,0x01,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x03,0x00,0x00,0x51,0x08,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x03,0x00,0x00,0x51,0x08,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x03,0x00,0x00,0x51,0x08,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x03,0x00,0x00,0x51,0x08,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03, 0x00,0x00,0x51,0x08,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00, 0x00,0x51,0x08,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00, 0x51,0x08,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x51, 0x08,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x51,0x08, 0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x51,0x08,0x00, 0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x51,0x08,0x00,0x35, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x51,0x08,0x00,0x36,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x51,0x08,0x00,0x37,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x51,0x08,0x00,0x38,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x51,0x08,0x00,0x39,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x03,0x00,0x00,0x51,0x08,0x00,0x3a,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x03,0x00,0x00,0x55,0x00,0x01,0x28,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x03,0x00,0x00,0x55,0x00,0x01,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x03,0x00,0x00,0x51,0x08,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x03,0x00,0x00,0x51,0x08,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03, 0x00,0x00,0x51,0x08,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x03,0x00, 0x00,0x51,0x08,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00, 0x51,0x08,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x51, 0x08,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x51,0x08, 0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x51,0x08,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x51,0x08,0x00,0x43, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x51,0x08,0x00,0x44,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x03,0x00,0x00,0x51,0x08,0x00,0x45,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x51,0x08,0x00,0x46,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x51,0x08,0x00,0x47,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0x51,0x08,0x00,0x48,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x03,0x00,0x00,0x51,0x08,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x03,0x00,0x00,0x51,0x08,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x03,0x00,0x00,0x55,0x00,0x01,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x03,0x00,0x00,0x53,0x20,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03, 0x00,0x00,0x53,0x20,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00, 0x00,0x53,0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00, 0x53,0x20,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x53, 0x20,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x53,0x20, 0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x53,0x20,0x00, 0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x53,0x20,0x00,0x72, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x03,0x00,0x00,0x52,0x20,0x00,0x6b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x52,0x20,0x00,0x6c,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x52,0x20,0x00,0x6d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x52,0x20,0x00,0x6e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x52,0x20,0x00,0x6f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x03,0x00,0x00,0x52,0x20,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x03,0x00,0x00,0x52,0x20,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x03,0x00,0x00,0x52,0x20,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x03,0x00,0x00,0x53,0x20,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x03, 0x00,0x00,0x53,0x20,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x03,0x00, 0x00,0x53,0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00, 0x53,0x20,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x53, 0x20,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x53,0x20, 0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x53,0x20,0x00, 0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x53,0x20,0x00,0xaa, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x52,0x20,0x00,0xa3,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x52,0x20,0x00,0xa4,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x52,0x20,0x00,0xa5,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x52,0x20,0x00,0xa6,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x03,0x00,0x00,0x52,0x20,0x00,0xa7,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x03,0x00,0x00,0x52,0x20,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x03,0x00,0x00,0x52,0x20,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x03,0x00,0x00,0x52,0x20,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x03,0x00,0x00,0x20,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x03, 0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x03,0x00, 0x00,0x20,0x01,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x03,0x00,0x00, 0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x55, 0x00,0x01,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x51,0x08, 0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x51,0x08,0x00, 0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x51,0x08,0x00,0xb6, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x51,0x08,0x00,0xb7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x51,0x08,0x00,0xb8,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x51,0x08,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x51,0x08,0x00,0xba,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0x51,0x08,0x00,0xbb,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x03,0x00,0x00,0x51,0x08,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x03,0x00,0x00,0x51,0x08,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x03,0x00,0x00,0x51,0x08,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x03,0x00,0x00,0x51,0x08,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x03, 0x00,0x00,0x51,0x08,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x03,0x00, 0x00,0x51,0x08,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00, 0x51,0x08,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x51, 0x08,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x20,0x01, 0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x55,0x00,0x01, 0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x20,0x01,0x00,0xb1, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x03,0x00,0x00,0x55,0x00,0x01,0xb2,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x03,0x00,0x00,0x51,0x08,0x00,0xc4,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x51,0x08,0x00,0xc5,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x51,0x08,0x00,0xc6,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x51,0x08,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x03,0x00,0x00,0x51,0x08,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x03,0x00,0x00,0x51,0x08,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x03,0x00,0x00,0x51,0x08,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec, 0x03,0x00,0x00,0x51,0x08,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x03, 0x00,0x00,0x51,0x08,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x03,0x00, 0x00,0x51,0x08,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00, 0x51,0x08,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x51, 0x08,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x51,0x08, 0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x51,0x08,0x00, 0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x03,0x00,0x00,0x51,0x08,0x00,0xd2, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0x51,0x08,0x00,0xd3,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x03,0x00,0x00,0x55,0x00,0x01,0xb3,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x53,0x20,0x00,0xf4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x53,0x20,0x00,0xf5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x53,0x20,0x00,0xf6,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf9,0x03,0x00,0x00,0x53,0x20,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xfa,0x03,0x00,0x00,0x53,0x20,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xfb,0x03,0x00,0x00,0x53,0x20,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x03,0x00,0x00,0x53,0x20,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x03, 0x00,0x00,0x53,0x20,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00, 0x00,0x52,0x20,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00, 0x52,0x20,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x52, 0x20,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x52,0x20, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x52,0x20,0x00, 0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x52,0x20,0x00,0xf9, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,0x52,0x20,0x00,0xfa,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x52,0x20,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x12,0x01,0x00,0xfd,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x21,0x02,0x00,0x63,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x21,0x02,0x00,0x64,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0x04,0x00,0x00,0x21,0x07,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x0a,0x04,0x00,0x00,0x51,0x08,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x04,0x00,0x00,0x20,0x01,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x04,0x00,0x00,0x20,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x04, 0x00,0x00,0x23,0x02,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x04,0x00, 0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00, 0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x55, 0x40,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x54,0x40, 0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x05,0x01,0x00, 0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x04,0x01,0x00,0x1a, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x20,0x01,0x00,0x1f,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x24,0x04,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x20,0x01,0x00,0x26,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x17,0x04,0x00,0x00,0x55,0x40,0x00,0x2d,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x54,0x40,0x00,0x2d,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x04,0x00,0x00,0x05,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x04,0x00,0x00,0x04,0x01,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x04,0x00,0x00,0x20,0x01,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x04,0x00,0x00,0x20,0x01,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x04, 0x00,0x00,0x05,0x01,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x04,0x00, 0x00,0x55,0x40,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00, 0x20,0x01,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x54, 0x40,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x05,0x01, 0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x04,0x00,0x00,0x55,0x40,0x00, 0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x04,0x00,0x00,0x20,0x01,0x00,0x39, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x20,0x01,0x00,0x3c,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x55,0x40,0x00,0x3d,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x04,0x00,0x00,0x20,0x01,0x00,0x3e,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x20,0x01,0x00,0x34,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x05,0x01,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x05,0x01,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x04,0x00,0x00,0x05,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x04,0x00,0x00,0x05,0x01,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x04,0x00,0x00,0x05,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x04, 0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x04,0x00, 0x00,0x24,0x10,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00, 0x20,0x01,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x55, 0x20,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x04,0x00,0x00,0x23,0x08, 0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x04,0x00,0x00,0x20,0x01,0x00, 0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x04,0x00,0x00,0x20,0x01,0x00,0x4c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x04,0x00,0x00,0x51,0x08,0x00,0x4d,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x20,0x01,0x00,0x4e,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00,0x55,0x20,0x00,0x4f,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x04,0x00,0x00,0x20,0x01,0x00,0x50,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x55,0x10,0x00,0x51,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x04,0x00,0x00,0x21,0x04,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x04,0x00,0x00,0x55,0x20,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x04,0x00,0x00,0x20,0x01,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x04,0x00,0x00,0x55,0x10,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x04, 0x00,0x00,0x23,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x04,0x00, 0x00,0x23,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x04,0x00,0x00, 0x23,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x51, 0x10,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00,0x21,0x02, 0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x55,0x40,0x00, 0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x04,0x00,0x00,0x20,0x02,0x00,0x69, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x04,0x00,0x00,0x55,0x80,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x04,0x00,0x00,0x21,0x02,0x00,0x77,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x54,0x40,0x00,0x7b,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x20,0x02,0x00,0x77,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x53,0x20,0x00,0x95,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x04,0x00,0x00,0x54,0x40,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x04,0x00,0x00,0x25,0x08,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x04,0x00,0x00,0x55,0x40,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x04,0x00,0x00,0x05,0x01,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x04, 0x00,0x00,0x05,0x01,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x04,0x00, 0x00,0x25,0x08,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00, 0x53,0x20,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x23, 0x0a,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x51,0x08, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x51,0x40,0x00, 0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x21,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0x52,0x70,0x00,0x8c,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x04,0x00,0x00,0x20,0x01,0x00,0x85,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x04,0x00,0x00,0x04,0x01,0x00,0x88,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x04,0x00,0x00,0x20,0x01,0x00,0x89,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x04,0x00,0x00,0x51,0x38,0x00,0x96,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x04,0x00,0x00,0x51,0x30,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x04,0x00,0x00,0x55,0xc0,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x04,0x00,0x00,0x53,0x90,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x04,0x00,0x00,0x20,0x01,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x04, 0x00,0x00,0x55,0x40,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x04,0x00, 0x00,0x55,0x20,0x01,0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00, 0x51,0x40,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x55, 0x00,0x01,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x52,0x70, 0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x20,0x01,0x00, 0x93,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x51,0x38,0x00,0x8c, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x04,0x00,0x00,0x55,0xe0,0x00,0x96,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x51,0x10,0x00,0xa6,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0x13,0x01,0x00,0x9f,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x54,0x40,0x00,0xa6,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x04,0x00,0x00,0x04,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x04,0x00,0x00,0x13,0x04,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x04,0x00,0x00,0x04,0x04,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x04,0x00,0x00,0x13,0x01,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x04,0x00,0x00,0x04,0x01,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x04, 0x00,0x00,0x53,0x20,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x04,0x00, 0x00,0x20,0x01,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00, 0x50,0x08,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x50, 0x08,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x51,0x08, 0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x04,0x00,0x00,0x51,0x08,0x00, 0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x51,0x08,0x00,0xb1, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x04,0x00,0x00,0x51,0x08,0x00,0xb3,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x51,0x08,0x00,0xb5,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x04,0x00,0x00,0x51,0x08,0x00,0xb7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x04,0x00,0x00,0x51,0x08,0x00,0xb9,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x04,0x00,0x00,0x51,0x08,0x00,0xbb,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x04,0x00,0x00,0x21,0x01,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x04,0x00,0x00,0x21,0x01,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x04,0x00,0x00,0x20,0x01,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x04,0x00,0x00,0x20,0x01,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x04, 0x00,0x00,0x20,0x01,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x04,0x00, 0x00,0x20,0x01,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00, 0x7f,0x04,0x00,0x00,0x01,0x00,0x00,0x80,0x04,0x00,0x00,0x01,0x00,0x00,0x81,0x04, 0x00,0x00,0x01,0x00,0x00,0x82,0x04,0x00,0x00,0x01,0x00,0x00,0x83,0x04,0x00,0x00, 0x01,0x00,0x00,0x84,0x04,0x00,0x00,0x01,0x00,0x00,0x85,0x04,0x00,0x00,0x01,0x00, 0x00,0x86,0x04,0x00,0x00,0x01,0x00,0x00,0x87,0x04,0x00,0x00,0x08,0x00,0x00,0x88, 0x04,0x00,0x00,0x20,0x00,0x00,0x89,0x04,0x00,0x00,0x20,0x00,0x00,0x8a,0x04,0x00, 0x00,0x02,0x00,0x00,0x8b,0x04,0x00,0x00,0x01,0x00,0x00,0x8c,0x04,0x00,0x00,0x01, 0x00,0x00,0x8d,0x04,0x00,0x00,0x08,0x00,0x00,0x8e,0x04,0x00,0x00,0x20,0x00,0x00, 0x8f,0x04,0x00,0x00,0x20,0x00,0x00,0x90,0x04,0x00,0x00,0x02,0x00,0x00,0x91,0x04, 0x00,0x00,0x01,0x00,0x00,0x92,0x04,0x00,0x00,0x20,0x00,0x00,0x93,0x04,0x00,0x00, 0x20,0x00,0x00,0x94,0x04,0x00,0x00,0x02,0x00,0x00,0x95,0x04,0x00,0x00,0x20,0x00, 0x00,0x96,0x04,0x00,0x00,0x20,0x00,0x00,0x97,0x04,0x00,0x00,0x02,0x00,0x00,0x98, 0x04,0x00,0x00,0x01,0x00,0x00,0x99,0x04,0x00,0x00,0x01,0x00,0x00,0x9a,0x04,0x00, 0x00,0x01,0x00,0x00,0x9b,0x04,0x00,0x00,0x01,0x00,0x00,0x9c,0x04,0x00,0x00,0x02, 0x00,0x00,0x9d,0x04,0x00,0x00,0x01,0x00,0x00,0x9e,0x04,0x00,0x00,0x01,0x00,0x00, 0x9f,0x04,0x00,0x00,0x01,0x00,0x00,0xa0,0x04,0x00,0x00,0x01,0x00,0x00,0xa1,0x04, 0x00,0x00,0x01,0x00,0x00,0xa2,0x04,0x00,0x00,0x02,0x00,0x00,0xa3,0x04,0x00,0x00, 0x02,0x00,0x00,0xa4,0x04,0x00,0x00,0x02,0x00,0x00,0xa5,0x04,0x00,0x00,0x02,0x00, 0x00,0xa6,0x04,0x00,0x00,0x02,0x00,0x00,0xa7,0x04,0x00,0x00,0x02,0x00,0x00,0xa8, 0x04,0x00,0x00,0x02,0x00,0x00,0xa9,0x04,0x00,0x00,0x02,0x00,0x00,0xaa,0x04,0x00, 0x00,0x02,0x00,0x00,0xab,0x04,0x00,0x00,0x02,0x00,0x00,0xac,0x04,0x00,0x00,0x20, 0x00,0x00,0xad,0x04,0x00,0x00,0x01,0x00,0x00,0xae,0x04,0x00,0x00,0x01,0x00,0x00, 0xaf,0x04,0x00,0x00,0x01,0x00,0x00,0xb0,0x04,0x00,0x00,0x01,0x00,0x00,0xb1,0x04, 0x00,0x00,0x01,0x00,0x00,0xb2,0x04,0x00,0x00,0x01,0x00,0x00,0xb3,0x04,0x00,0x00, 0x01,0x00,0x00,0xb4,0x04,0x00,0x00,0x01,0x00,0x00,0xb5,0x04,0x00,0x00,0x01,0x00, 0x00,0xb6,0x04,0x00,0x00,0x01,0x00,0x00,0xb7,0x04,0x00,0x00,0x01,0x00,0x00,0xb8, 0x04,0x00,0x00,0x01,0x00,0x00,0xb9,0x04,0x00,0x00,0x01,0x00,0x00,0xba,0x04,0x00, 0x00,0x01,0x00,0x00,0xbb,0x04,0x00,0x00,0x01,0x00,0x00,0xbc,0x04,0x00,0x00,0x04, 0x00,0x00,0xbd,0x04,0x00,0x00,0x01,0x00,0x00,0xbe,0x04,0x00,0x00,0x01,0x00,0x00, 0xbf,0x04,0x00,0x00,0x01,0x00,0x00,0xc0,0x04,0x00,0x00,0x02,0x00,0x00,0xc1,0x04, 0x00,0x00,0x01,0x00,0x00,0xc2,0x04,0x00,0x00,0x01,0x00,0x00,0x19,0x00,0xc3,0x04, 0x00,0x00,0x01,0x00,0xc4,0x04,0x00,0x00,0x00,0x00,0xc5,0x04,0x00,0x00,0x00,0x00, 0xc6,0x04,0x00,0x00,0x01,0x00,0xc7,0x04,0x00,0x00,0x00,0x00,0xc8,0x04,0x00,0x00, 0x00,0x00,0xc9,0x04,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00,0x00,0x00,0xcb,0x04, 0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x00,0x00, 0xce,0x04,0x00,0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x00,0x00,0xd0,0x04,0x00,0x00, 0x00,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0xd3,0x04, 0x00,0x00,0x00,0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x01,0x00, 0xd6,0x04,0x00,0x00,0x00,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0xd8,0x04,0x00,0x00, 0x00,0x00,0xd9,0x04,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00,0x00,0x00,0xdb,0x04, 0x00,0x00,0x00,0x00,0x00,0x07,0xdc,0x04,0x00,0x00,0x01,0x00,0x00,0xdd,0x04,0x00, 0x00,0x01,0x00,0x00,0xde,0x04,0x00,0x00,0x01,0x00,0x00,0xdf,0x04,0x00,0x00,0x01, 0x00,0x00,0xe0,0x04,0x00,0x00,0x01,0x00,0x00,0xe1,0x04,0x00,0x00,0x01,0x00,0x00, 0xe2,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00, 0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x02,0x0b,0x00,0x00,0x00,0x34,0x00, 0x04,0x00,0x2a,0x0c,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x20,0x20,0x00,0x00,0x00, 0x40,0x00,0x10,0x00,0xf0,0x80,0x00,0x00,0x09,0x62,0x00,0x00,0x03,0x00,0xe3,0x04, 0x00,0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x73,0x69,0x6d,0x70,0x6c,0x65,0x5f,0x6d, 0x65,0x5f,0x33,0x2e,0x61,0x73,0x6d,0xe4,0x04,0x00,0x00,0x00,0xe5,0x04,0x00,0x00, 0x01,0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x09,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0xce, 0x02,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x06,0x05,0x00,0x08,0x00,0x00,0x00,0xcf, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xce,0x02,0x00,0x00,0x00,0x12,0x21,0x01,0x05,0x03,0x01,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x01,0x00,0x00, 0xcf,0x02,0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00, 0x01,0x00,0x01,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00,0xcf,0x02,0x00,0x00,0x00, 0x14,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00,0x02,0x80,0x02,0x00,0x24, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xd2,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xd4, 0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd8,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdb,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe0,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe3,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00, 0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00, 0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xe6,0x02,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xd7,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd9,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdc,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xdf,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f, 0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe1,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe4,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0xe8,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xe9,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xf4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x31,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0xf9,0x02,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xe9,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xef,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x32,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf4,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xf7,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x62,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xff,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x61,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x62, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x02,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x06,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x0a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0b,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x10,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x15,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x18,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x1b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00,0x37,0x00,0x07, 0x00,0x10,0x10,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x1d,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x0c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e, 0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0e,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x0f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x7e,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x11,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x14,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e, 0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x16,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x17,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x05, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x18,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x7e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x19,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x1a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x1e,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1f,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2c,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x2d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0x1c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2f,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1f,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x25,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x80,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2a,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x2d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x85,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x89,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x9d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xb0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xb1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb5,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbd,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x30,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa1,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa2,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa3,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xb6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa7,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xb8,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x35,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x36,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x36, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xae,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x37,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xaf,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x37,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb0, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x38,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x3b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x3c,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x3f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc3,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xcf,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc4, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1,0x00,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0xd7,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc8, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x20, 0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xd2,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x43,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xda,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4b,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xda,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4e,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x51,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x07,0x04,0x22, 0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x52,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x44,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb, 0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x46,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x47,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xdb,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x49,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x4c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb, 0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x4e,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xdb,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x51,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x54,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x55,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x5b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdd,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x60,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x62,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x63,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdd,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x65,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x55,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x56,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x58,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x5b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde, 0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5d,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x5e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x60,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x63,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x64,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde, 0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe1,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe3,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe5,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe7,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xea,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xfb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfd, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x0f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x66,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xff,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x01,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x16,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x6a,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x18,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x6b,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x6c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6c, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x0c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x0d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6d,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x0e, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x6e,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6f,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x71,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x72,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x73,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0x75,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x0a,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x76, 0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x02, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00, 0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x04,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x82,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x83,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x06, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x27,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00, 0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x1c,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x87,0x03,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x77,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x7b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x02,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28, 0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7d,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x7e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x03, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x28,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x80,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00, 0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x83,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x06,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28, 0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x85,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x07, 0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x0a,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x88,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x8b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8d,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x90,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29, 0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x92,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x95,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x98,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x07,0x04,0x22, 0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x53,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x99,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x89,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x8b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8d,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x8e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00, 0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x93,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x05,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x94,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a, 0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x95,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x96,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x06, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x98,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x37,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x52,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x9a,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x60,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x9b,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9c, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x67,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x9d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9d,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x52, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9e,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x53,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25, 0x05,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xa4,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa5,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xa7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xa8,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa9,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0x6b,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x75,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6f,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0x6f,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00, 0x7d,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x70, 0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7f,0x01,0x00,0x00, 0x00,0x10,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x72,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x01, 0x05,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x89,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x75,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x77,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x79,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x95,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x99,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xab,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xab,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xac,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xac, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xad,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x89,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xad,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xae,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8c,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8e,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x90,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xa2,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25, 0x05,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb4,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25, 0x05,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x03,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00, 0xb7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb8,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02, 0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29, 0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xa6, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xab,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01, 0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x38, 0x00,0x08,0x00,0x10,0x10,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xab,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x02,0x00,0x31,0x01,0x00,0x2c,0x00,0x00,0x02,0x03,0x00,0x00,0xcf,0x02,0x00, 0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x32,0x00,0x03,0x80,0x02, 0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00, 0xbc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbd,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0xbe,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xbf,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xc5,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x03,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae, 0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xc8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x04, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00, 0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xcd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x07,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae, 0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10, 0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0xcf,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xbd,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xd0,0x03,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb0,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc3,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00, 0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xc6,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x03,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0, 0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc8,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xc9,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x05, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb0,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcb,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00, 0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xce,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x07,0x04,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07, 0x00,0x10,0x10,0x00,0xbc,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0xd2,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd5,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x01, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb2,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd8,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00, 0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x04,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2, 0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdd,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x05, 0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb2,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe0,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00, 0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10, 0x10,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0xe3,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xd3,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xd6,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x01,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3, 0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd8,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x03, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb3,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdb,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00, 0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xde,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x05,0x04,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3, 0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe0,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x07, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xb3,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xb4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb6, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd6,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb8,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbe,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xe3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xe4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xec,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe4,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd4,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe4,0x03,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd5, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe5,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd6,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe5,0x03,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd8,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd9,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xda,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xed,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xea,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xeb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xe2,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xeb, 0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xe3,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xec,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xed,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00, 0x00,0x25,0x05,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00, 0x00,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xf0,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00, 0x00,0x25,0x05,0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2, 0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00, 0x00,0x00,0xf3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x03,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0xfc,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf5,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00, 0xfc,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xf8, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00, 0x05,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00, 0x00,0x00,0xfc,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x38,0x00,0x08,0x00,0x10,0x10,0x00, 0xba,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0xfc,0x01,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0xfd, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x02,0x00,0x00,0x00,0x10,0x21,0x01, 0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf4,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x33,0x00,0x00,0x00,0x03,0x00,0x20,0x00,0x00,0x00,0x00,0xff,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x22,0x22,0x22,0x22,0x29,0x01,0x00,0x00,0x00,0xf5,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x22,0x22,0x22,0x22,0x29, 0x01,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x60,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x65,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x01,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x04,0x00,0x11,0x00, 0x24,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0a,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00, 0x02,0x00,0x08,0x02,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x0c,0x00, 0x04,0x01,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x0b,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x05,0x00,0x00,0x0c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x05,0x00,0x05, 0x00,0x31,0x04,0x00,0x29,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x0e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x7b,0x00,0x0f,0x02,0x00,0x00,0x5d,0x00,0x04,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x01,0x05,0x00,0x06,0x00,0x18,0x02,0x0e,0x02,0x00,0x00,0x00,0x00, 0x0f,0x02,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x0c,0x00, 0x04,0x01,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfa,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x11, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x06,0x00,0x00,0x11,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x06,0x80,0x04, 0x00,0x31,0x05,0x00,0x29,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x08,0x02,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x20, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff, 0x29,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00, 0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x15,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00, 0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x01,0x02,0x07,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x07,0x80,0x06,0x00,0x24,0x00,0x00, 0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x17,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xc0,0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0xfd,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xfe,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x18,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05, 0x30,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xff,0x03,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x04,0x05,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x2c,0x00,0x01,0x02,0x08,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00,0x08,0x00,0x00,0x1c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x20, 0x03,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x03,0x00,0x02,0x09, 0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00, 0x2a,0x03,0x09,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x22, 0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x02,0x00,0x00,0x01,0x06, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfe,0x03,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x1f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x0a,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x2a,0x01,0x0a,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1e,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2b,0x85, 0x02,0x0b,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x0b,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x01,0x00,0x02,0x0c,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x01,0x0c, 0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x05,0x60,0x00,0x00,0x00,0x31,0x06,0x00,0x29,0x00,0x00,0x00, 0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x23,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00, 0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x0d,0x00, 0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32, 0x00,0x0d,0x00,0x09,0x00,0x22,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xce,0x02,0x00,0x00,0x00,0x12,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0x03,0x01,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x3c,0x02,0x00,0x0a, 0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x04,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x07,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x01,0x02,0x0e,0x00,0x00, 0x27,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00, 0x0e,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2b,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x03,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00, 0x00,0x00,0x2c,0x03,0x00,0x02,0x0f,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x03,0x0f,0x00,0x00,0x64,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x05,0x22,0x00,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x05,0x04,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x10,0x00,0x00,0x09,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x01,0x10,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2d,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2b, 0x85,0x02,0x11,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x11, 0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff, 0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x01,0x00,0x02,0x12,0x00,0x00, 0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x01, 0x12,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x12,0x00,0x00,0x66,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x00,0x66,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2f,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x07,0x80,0x07,0x00,0x01,0x00, 0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xc0,0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0x0a, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x02,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0b,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x05,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x04,0x00,0x00,0x00,0x08,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05, 0x08,0x00,0x00,0x00,0x31,0x07,0x00,0x29,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x05,0x10,0x00,0x00,0x00,0x2c,0x00,0x04,0x02,0x13,0x00, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xce,0x02,0x00,0x00,0x00,0x12, 0x21,0x01,0x32,0x00,0x13,0x80,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x35,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x40,0x00,0x00,0x00,0x3c,0x02,0x00,0x0a,0x00,0x0d,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x0e,0x04,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0e,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x04,0x05, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x04,0x00, 0x00,0x00,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x39,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x14,0x00,0x00,0x11,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x01,0x14,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x2b,0x85,0x02,0x15,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a, 0x00,0x15,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff, 0xff,0xff,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x01,0x00,0x02,0x16, 0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00, 0x2a,0x01,0x16,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01, 0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x16,0x00,0x00,0x66,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x00, 0x66,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x44,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x09,0x00, 0x31,0x08,0x00,0x32,0x00,0x07,0x80,0x09,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xc0,0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0x12,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x13,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x17,0x00,0x00,0x14,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x2a,0x01,0x17,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3d,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2b,0x85, 0x02,0x18,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x18,0x00, 0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x00, 0x33,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x01,0x00,0x02,0x19,0x00,0x00,0x33, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x01,0x19, 0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x19,0x00,0x00,0x66,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x00,0x66,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x31,0x09,0x00,0x21,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x18,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x16,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1a,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x1a,0x00,0x00,0x20,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x1a,0x00,0x0a,0x00,0x01, 0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x37,0x00,0x08,0x00,0x04, 0x10,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x48,0x02,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x1c,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x02,0x00,0x00,0x00,0x03,0x24,0x01,0x24, 0x00,0x00,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x37,0x00,0x08,0x01,0x04, 0x08,0x00,0x1b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1d,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x1e,0x04,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x1f,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x01,0x23,0x01,0x31, 0x0a,0x00,0x2c,0x00,0x00,0x02,0x1b,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x1b,0x00,0x10,0x00,0x2c,0x00,0x01, 0x02,0x1c,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x1d,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x1d,0x00,0x0d,0x00,0x01,0x00,0x00, 0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x4c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x00,0x20,0x01,0x00,0x20,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x4d,0x02,0x00, 0x00,0x00,0x00,0x32,0x00,0x1c,0x00,0x0b,0x00,0x29,0x02,0x00,0x00,0x00,0xf7,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x22,0x04,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x14, 0x00,0x02,0x00,0x4d,0x02,0x00,0x00,0x00,0x13,0x21,0x01,0x32,0x00,0x00,0x00,0x0c, 0x00,0x31,0x0b,0x00,0x29,0x02,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x22,0x04,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x22,0x04, 0x00,0x00,0x00,0x06,0x21,0x01,0x31,0x0c,0x00,0x24,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0xff,0x37,0x00,0x08,0x01,0x20,0x01,0x00,0x20,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x04,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x4f,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x32,0x00,0x00,0x00,0x10, 0x00,0x31,0x0d,0x00,0x01,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff, 0x32,0x00,0x1c,0x00,0x0e,0x00,0x37,0x00,0x08,0x00,0x10,0x01,0x00,0xba,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x04, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xf7,0x03,0x00,0x00, 0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00, 0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x51,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf7,0x03,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x56,0x02, 0x00,0x00,0x00,0x14,0x00,0x02,0x00,0x52,0x02,0x00,0x00,0x00,0x0f,0x21,0x01,0x32, 0x00,0x00,0x00,0x0f,0x00,0x31,0x0e,0x00,0x37,0x00,0x08,0x00,0x20,0x01,0x00,0xba, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x25,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x28,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xf7,0x03, 0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xf7,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x53,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x05, 0x00,0x02,0x00,0x53,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x31,0x0f,0x00,0x24,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x01,0x10,0x01,0x00,0xba,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x04, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x31,0x10,0x00,0x45,0x01,0x00, 0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x45,0x01,0x00,0x00,0x58, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x45,0x01,0x00,0x00,0x45,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x58,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x00,0x02,0x1e,0x00,0x00,0x44,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2a,0x01,0x1e,0x00,0x00,0x66, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00,0x00,0x02,0x1f,0x00,0x00, 0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x02,0x20,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x02,0x21,0x00,0x02,0x20,0x00,0x02,0x1f,0x00, 0x2a,0x00,0x21,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01, 0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x5a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x22,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x5a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x2c,0x00,0x00,0x02,0x22,0x00,0x00,0x5a,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x22,0x00, 0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05, 0x03,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x46,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x46,0x02,0x00,0x00,0x00, 0x01,0x21,0x01,0x2c,0x00,0x00,0x02,0x23,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x23,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00, 0x00,0x2c,0x01,0x01,0x02,0x24,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x25,0x00,0x00,0x59,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x26, 0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x02,0x27,0x00,0x02,0x26,0x00,0x02,0x25,0x00,0x21,0x01,0x00, 0x00,0x02,0x28,0x00,0x02,0x27,0x00,0x02,0x24,0x00,0x2a,0x01,0x28,0x00,0x00,0x5e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00, 0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x29,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x29,0x00,0x00,0x2b,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x31,0x11,0x00,0x29,0x00,0x00,0x00,0x00,0x67,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x7b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2c,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00, 0x05,0x00,0x02,0x00,0x2d,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2e,0x04,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbd,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x01, 0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x04,0x00,0x00, 0x00,0x16,0x22,0x01,0x05,0x01,0xf0,0xff,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x31, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x03,0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x12,0x00,0x29, 0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x02, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6b,0x02,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x04,0x00,0x00, 0x00,0x12,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x04,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x04, 0x00,0x00,0x00,0x11,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x6d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x26,0x01, 0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x70, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x20,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x6f,0x02, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00, 0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x69,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00,0x00, 0x71,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x69,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x10,0x00,0x00,0x00,0x10,0x30,0x04, 0x00,0x00,0x00,0x16,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6b,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x2a,0x00,0x00,0x6f,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x2a, 0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x04,0x02, 0x2b,0x00,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x71,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x2a,0x01,0x2b,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x10,0x6b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7b,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x20,0x01, 0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0xfc,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x73, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x7b,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x2c,0x01,0x02,0x02,0x2c,0x00,0x00, 0x6e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x2a,0x01,0x2c,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x30,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x05,0x00,0x00, 0x00,0x10,0x30,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x20,0x01,0x00,0x00,0x00,0x76, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0xfc,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x7b,0x02,0x00, 0x00,0x00,0x04,0x22,0x01,0x2c,0x01,0x04,0x02,0x2d,0x00,0x00,0x75,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2a,0x01,0x2d,0x00,0x00,0x76, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x76,0x02, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x03,0xfe,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x2e,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x33,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x01,0x70, 0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x02,0x00, 0x00,0x00,0x00,0x24,0x01,0x05,0x05,0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00, 0x01,0x0a,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x01, 0x07,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x20,0x00,0x00,0x00, 0x00,0x30,0x04,0x00,0x00,0x01,0x1c,0x00,0x02,0x00,0x30,0x04,0x00,0x00,0x01,0x1c, 0x21,0x01,0x05,0x05,0x7f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x30,0x04,0x00, 0x00,0x01,0x1d,0x00,0x02,0x00,0x16,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x95,0x02,0x00,0x00, 0x00,0x06,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01,0x06,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x36,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x03,0x06,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x37,0x04,0x00, 0x00,0x01,0x07,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x02, 0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0xf7,0x03,0x00,0x00, 0x00,0x01,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x01,0x06,0x00, 0x02,0x00,0xf7,0x03,0x00,0x00,0x00,0x05,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x7d, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x25,0x00,0x00,0x00,0x00,0x7e,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05, 0x04,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x38,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x05,0x05,0xf0,0xff,0xff, 0xff,0x21,0x00,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x7f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x25,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02, 0x00,0x00,0x00,0x06,0x21,0x01,0x05,0x04,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x04,0x00,0x00,0x00,0x07, 0x21,0x01,0x05,0x05,0xf0,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x39,0x04,0x00, 0x00,0x00,0x11,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x39,0x04,0x00,0x00, 0x00,0x12,0x00,0x02,0x00,0x3c,0x04,0x00,0x00,0x00,0x05,0x23,0x01,0x29,0x00,0x00, 0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0x3e,0x04,0x00,0x00,0x00, 0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x07,0x00,0x02, 0x00,0x3f,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x83,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x62,0x02,0x00, 0x00,0x00,0x01,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x30,0x04,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05,0x02,0x00,0x00, 0x00,0x29,0x02,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28, 0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01,0x04,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x40,0x04, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x83,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x20,0x78, 0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0x43,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x86,0x02,0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c, 0x02,0x00,0x00,0x06,0x06,0x22,0x01,0x00,0x8c,0x02,0x00,0x00,0x06,0x04,0x22,0x01, 0x01,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x20, 0x00,0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x04,0x00, 0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x2e,0x00,0x00,0x45,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x2e,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2a,0x00,0x2e,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0xff,0xff,0xff,0xff,0x00,0x42,0x04,0x00,0x00,0x00,0x05,0x21,0x01,0x2c,0x00,0x01, 0x02,0x2f,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x30,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x23,0x00,0x00,0x00,0x02,0x31, 0x00,0x02,0x2f,0x00,0x2c,0x00,0x01,0x02,0x32,0x00,0x00,0x8a,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x33,0x00, 0x02,0x30,0x00,0x02,0x31,0x00,0x20,0x00,0x00,0x00,0x02,0x34,0x00,0x02,0x2f,0x00, 0x02,0x32,0x00,0x21,0x00,0x00,0x00,0x02,0x35,0x00,0x02,0x34,0x00,0x02,0x33,0x00, 0x2a,0x00,0x35,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x05,0x03,0xff, 0xff,0xff,0xff,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x2e,0x00, 0x00,0x42,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x00, 0x42,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x8e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01, 0xff,0xff,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x00,0x02,0x00, 0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x29,0x04,0x00,0x00,0x00,0x46,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00, 0x00,0x00,0x46,0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x2c,0x00,0x00,0x02,0x36,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x05,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x02,0x37,0x00,0x02,0x36,0x00,0x02, 0x35,0x00,0x32,0x00,0x37,0x80,0x13,0x00,0x29,0x04,0x00,0x00,0x00,0x47,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x95,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x28,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x48, 0x04,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x48,0x04,0x00,0x00,0x00,0x0d,0x21,0x01, 0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00, 0x00,0x47,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x95,0x02,0x00, 0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0xc0,0x98, 0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09,0x00,0x4a,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x90,0x02,0x00,0x00,0x00,0x00,0x49,0x04,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x04,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x20,0x00,0x00, 0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0x4c,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x04, 0x00,0x00,0x00,0x15,0x00,0x02,0x00,0x4c,0x04,0x00,0x00,0x00,0x19,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x16,0x00,0x02,0x00,0x4c,0x04,0x00, 0x00,0x00,0x1a,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x00,0x0e, 0x00,0x02,0x00,0x30,0x04,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05,0x04,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32, 0x04,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x2c,0x00,0x00, 0x02,0x38,0x00,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00, 0x00,0x00,0x32,0x00,0x38,0x00,0x13,0x00,0x29,0x04,0x00,0x00,0x00,0x4d,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x95,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x91,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4d, 0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x03,0x00,0x22,0x01, 0x20,0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x02,0x14,0x00,0x02,0x00,0x4b,0x04, 0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x4e,0x04,0x00,0x00,0x02,0x15,0x00,0x02,0x00,0x4b,0x04,0x00,0x00,0x00,0x15, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x02,0x16,0x00,0x02,0x00, 0x4b,0x04,0x00,0x00,0x00,0x16,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x93,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x60,0x78,0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00, 0x50,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x94,0x02,0x00,0x00,0x00,0x00,0x4f,0x04, 0x00,0x00,0x00,0x00,0x31,0x13,0x00,0x29,0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00, 0x00,0x06,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x00, 0x05,0x21,0x01,0x2c,0x00,0x04,0x02,0x39,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x06, 0x21,0x01,0x00,0x4f,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x32,0x00,0x39,0x00,0x16, 0x00,0x32,0x00,0x2f,0x00,0x14,0x00,0x2c,0x00,0x04,0x02,0x3a,0x00,0x00,0x42,0x04, 0x00,0x00,0x00,0x05,0x21,0x01,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x3a,0x80,0x15,0x00,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x96,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8c, 0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00, 0x03,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x96,0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x04, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x05,0x00,0x00,0x02, 0x00,0x8c,0x02,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02, 0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x32, 0x00,0x00,0x00,0x18,0x00,0x31,0x14,0x00,0x2c,0x00,0x00,0x02,0x3b,0x00,0x00,0x8a, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x3b, 0x00,0x17,0x00,0x31,0x15,0x00,0x2c,0x00,0x04,0x02,0x3c,0x00,0x00,0x42,0x04,0x00, 0x00,0x00,0x04,0x21,0x01,0x00,0x4f,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x32,0x00, 0x3c,0x00,0x16,0x00,0x29,0x00,0x00,0x00,0x00,0x46,0x04,0x00,0x00,0x06,0x01,0x00, 0x02,0x00,0x51,0x04,0x00,0x00,0x06,0x01,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x4f, 0x04,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x06,0x04,0x22,0x01, 0x32,0x00,0x00,0x00,0x18,0x00,0x31,0x16,0x00,0x21,0x00,0x00,0x00,0x02,0x3d,0x00, 0x02,0x32,0x00,0x02,0x31,0x00,0x32,0x00,0x3d,0x80,0x17,0x00,0x29,0x05,0x00,0x00, 0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0x8c,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0x8c,0x02,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96, 0x02,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x8c,0x02, 0x00,0x00,0x06,0x00,0x22,0x01,0x32,0x00,0x00,0x00,0x18,0x00,0x31,0x17,0x00,0x29, 0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x05,0x02,0x00,0x00, 0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0x8c,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96, 0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x8c,0x02, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x06, 0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00,0x06,0x00,0x22,0x01,0x31,0x18,0x00,0x2c, 0x02,0x02,0x02,0x3e,0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0x4f, 0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x2a,0x02,0x3e,0x00,0x00,0x97,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x20,0x00,0x00,0x00, 0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x04,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x05,0xc0,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x98,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x04,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x05, 0x1f,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x05,0x0e,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x52,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x05,0x05,0x1f,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x9a,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x9c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0xcf,0xff,0xff,0xff,0x29, 0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x52,0x04,0x00, 0x00,0x00,0x01,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff, 0xff,0x21,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa6,0x02,0x00,0x00,0x00,0x01,0x21,0x01, 0x2c,0x00,0x00,0x02,0x3f,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x19,0x21,0x01,0x05, 0x04,0x00,0x00,0x00,0x00,0x2a,0x00,0x3f,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x40,0x00, 0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a, 0x00,0x40,0x00,0x00,0x54,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x04,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x9f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x02,0x00, 0x02,0x05,0x05,0x0e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x2a,0x02,0x3e, 0x00,0x00,0x57,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x55,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x21,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x2c,0x00, 0x01,0x02,0x41,0x00,0x00,0x4f,0x04,0x00,0x00,0x00,0x05,0x21,0x01,0x05,0x02,0xff, 0xff,0x00,0x00,0x2a,0x00,0x41,0x00,0x00,0x59,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x55,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0xa3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x04,0x00,0x00,0x00,0x04,0x22,0x01,0x20,0x00, 0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x46,0x04,0x00,0x00, 0x00,0x06,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xa4, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x02,0x00,0x00,0x00,0x19,0x22,0x01, 0x20,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x46,0x04, 0x00,0x00,0x06,0x00,0x21,0x01,0x05,0x01,0x0f,0x0f,0x0f,0x0f,0x29,0x00,0x00,0x00, 0x00,0xa4,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x29, 0x01,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xa4,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x03, 0x00,0x02,0x00,0xa4,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x20,0x01,0x00,0x00,0x00, 0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x03,0x01, 0x00,0x00,0x00,0x2c,0x01,0x00,0x02,0x42,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x42,0x80,0x00,0x53,0x04,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x00, 0x00,0x02,0x43,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x03,0x00, 0x00,0x00,0x00,0x29,0x00,0x43,0x80,0x00,0x53,0x04,0x00,0x00,0x00,0x03,0x00,0x02, 0x00,0xa3,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x04, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x4f,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x4f,0x04,0x00, 0x00,0x00,0x04,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x00,0x0c, 0x00,0x02,0x00,0x4f,0x04,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x00,0x00,0x00,0x00, 0x53,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x46,0x04,0x00,0x00,0x06,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x36, 0x04,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00, 0x01,0x03,0x00,0x02,0x00,0x36,0x04,0x00,0x00,0x01,0x01,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x5b,0x04,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x36,0x04,0x00,0x00,0x01, 0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x01,0x05,0x00,0x02, 0x00,0x36,0x04,0x00,0x00,0x01,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x04, 0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x46,0x04,0x00,0x00,0x01,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x36,0x02,0x0a,0x00,0x5c, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xa6,0x02,0x00,0x00,0x00,0x00,0x5c,0x01,0x01, 0x03,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03, 0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x20,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x29,0x00,0x00, 0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x7f,0x00,0x00,0x00, 0x29,0x03,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00, 0x06,0x00,0x02,0x05,0x01,0xbf,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x02, 0x00,0x00,0x00,0x05,0x00,0x02,0x05,0x01,0xdf,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xaa,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0xef,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01,0xf7,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05, 0x01,0xfb,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x01, 0x00,0x02,0x05,0x01,0xfd,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xfe,0x00,0x00,0x00,0x73,0x08,0x03,0x00,0x00, 0x0c,0x5d,0x04,0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0xab,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x0a,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x5f, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x21,0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x5d, 0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02, 0xad,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xa8,0x02,0x00,0x00, 0x00,0x01,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05, 0x00,0x01,0x00,0x08,0x02,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x61, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x02,0x21,0x01, 0x00,0xa8,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xb1,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x62,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21, 0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00, 0x00,0x00,0x03,0x21,0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x5d,0x00, 0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xb3, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0xb4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xa8,0x02,0x00,0x00,0x00, 0x04,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00, 0x01,0x00,0x08,0x02,0xb5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x64,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00, 0xa8,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xb7,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x65,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00, 0x00,0x00,0x00,0x65,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00, 0x00,0x06,0x21,0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x5d,0x00,0x04, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xb9,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xba, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xab,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x07, 0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01, 0x00,0x08,0x02,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x30,0x12,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xbf,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07, 0x08,0x00,0x80,0x3f,0x29,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0xbe, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x30, 0x03,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xcb, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xc2,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xc4,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6b,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00, 0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6c,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0xcb,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xc9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x0c,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xcb,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xca, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcb,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00, 0xcd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x44,0x00,0x00, 0x6a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2a,0x00,0x44,0x00,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x68,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00, 0x00,0x00,0x61,0x01,0x03,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x04,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00, 0x05,0x63,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x02,0x18,0x02,0x68,0x00,0x00,0x80,0x10,0x82, 0xa6,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x31,0xb1,0x03,0x80,0x00,0x00, 0x05,0x68,0x04,0x04,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10,0x82, 0x06,0x67,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81, 0x15,0x67,0xa4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x25,0x67,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0x60,0x01, 0x05,0x69,0x05,0x67,0x22,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x01,0x00,0x60,0x86, 0x85,0x67,0x05,0x69,0x22,0x05,0x04,0x00,0x04,0x00,0x40,0x20,0x00,0x00,0x50,0x80, 0x85,0x02,0x94,0x63,0x00,0x05,0x01,0x00,0x01,0x00,0x5b,0x01,0x00,0x00,0x20,0x02, 0x44,0x67,0x04,0x69,0x01,0x01,0x14,0x67,0x84,0x02,0x70,0x21,0x00,0x00,0x50,0x84, 0x01,0x00,0xa4,0x68,0x00,0x55,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x2e,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x84, 0x01,0x00,0xa4,0x68,0x00,0x15,0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x69,0x00,0x01,0x68,0xaa,0x69, 0x61,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x24,0x69,0x00,0x05,0x06,0x00, 0x06,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x05,0x03,0x62,0x70,0x01, 0x11,0x00,0x61,0x05,0x00,0x80,0xa0,0x0a,0x25,0x03,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x02,0xa4,0x01,0x00,0x05,0x10,0x00, 0x10,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x02,0xe4,0x01,0x00,0x05,0x10,0x00, 0x10,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x32,0x00,0xe8,0x01,0x00, 0x11,0x00,0x61,0x02,0x03,0x62,0x58,0x02,0x11,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0xc5,0x02,0xa4,0x01,0x00,0x05,0x20,0x00,0x20,0x00,0x31,0xa3,0x03,0x80,0x00,0x00, 0x05,0x1c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x33,0x03,0x62,0x70,0x01, 0x11,0x00,0x61,0x04,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xe5,0x02,0xa4,0x01,0x00,0x05,0x30,0x00, 0x30,0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x04,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x04,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x05,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x05,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x06,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x06,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x07,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x07,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x08,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x08,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x09,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x09,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0b,0x34,0x00,0x00,0x00, 0x00,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x34,0x03,0x62,0x58,0x02,0x11,0x00,0x61,0x23,0x02,0x00,0xa0,0x0a, 0x85,0x0c,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xa5,0x03,0x80,0x00,0x00, 0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x12,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0d,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0e,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x10,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x13,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x14,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x18,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1a,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00, 0x05,0x38,0x05,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0f,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x16,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x11,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x15,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x19,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1b,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00, 0x05,0x3c,0x05,0x14,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x3a,0x05,0x13,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x17,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00, 0x05,0x40,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x05,0x00,0x50,0x00, 0x05,0x36,0x05,0x11,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x24,0x02,0x00,0xa0,0x0a, 0x05,0x24,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x25,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x26,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x27,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x04,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x28,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x29,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2a,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1c,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1d,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1e,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1f,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x20,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x25,0x02,0x00,0xa0,0x0a, 0x85,0x26,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x28,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1d,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x06,0x05,0x0d,0x46,0x05,0x05,0x04,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x08,0x05,0x0e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x24,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x29,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2a,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1c,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x0c,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x2e,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x21,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x22,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x23,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x27,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1e,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1f,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x20,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x21,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x22,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x23,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2b,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x38,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x0a,0x05,0x0f,0x46,0x05,0x05,0x08,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x30,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x32,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x3e,0x05,0x15,0x46,0x05,0x05,0x3c,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x25,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x04,0x05,0x19,0x46,0x05,0x05,0x2e,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x08,0x05,0x1b,0x46,0x05,0x05,0x0c,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x0e,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x12,0x05,0x27,0x46,0x05,0x05,0x30,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x14,0x05,0x29,0x46,0x05,0x05,0x32,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x2c,0x05,0x17,0x46,0x05,0x05,0x40,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x18,0x05,0x1e,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x1a,0x05,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x10,0x05,0x25,0x46,0x05,0x05,0x0e,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x2e,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x16,0x05,0x1c,0x46,0x05,0x05,0x34,0x46,0x00,0x40,0x04,0x05,0x00,0x50,0x00, 0x05,0x0e,0x05,0x22,0x46,0x05,0x05,0x1a,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x24,0x05,0x23,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x28,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x01,0x20,0x04,0x3e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85, 0x05,0x1e,0x04,0x2c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x1f,0x04,0x04,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x1c,0x04,0x3a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x1a,0x04,0x12,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x1b,0x04,0x14,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x23,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62,0x68,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x20,0x46,0x05,0x05,0x2e, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x01,0x20,0x58,0x05,0x14,0x3e, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x1e,0x58,0x05,0x14,0x2c, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x1f,0x58,0x05,0x14,0x04, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x1c,0x58,0x05,0x14,0x3a, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x1a,0x58,0x05,0x14,0x12, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x1b,0x58,0x05,0x14,0x14, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x28,0x58,0x05,0x14,0x06, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x06,0x05,0x23,0x58,0x05,0x14,0x18, 0x20,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x2b,0x46,0x05,0x05,0x24, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x36,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x0a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x0c,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x0e,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x05,0x04,0x00,0x50,0x85,0x05,0x2b,0x04,0x26,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x30,0x01,0x20,0x58,0x05,0x14,0x36, 0x20,0x00,0x40,0x05,0x04,0x00,0x50,0x05,0x05,0x2f,0x05,0x29,0x58,0x05,0x14,0x0a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x22,0x04,0x16,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x07,0x05,0x24,0x58,0x05,0x14,0x0c, 0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x25,0x58,0x05,0x14,0x0e, 0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x0b,0x05,0x2b,0x58,0x05,0x14,0x26, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x08,0x20,0x05,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x32,0x05,0x32,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x30,0x05,0x30,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x2e,0x05,0x2e,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x36,0x03,0x62,0x80,0x02,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x21,0x04,0x10,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x05, 0x05,0x3d,0x05,0x22,0x58,0x05,0x14,0x16,0x20,0x00,0x68,0x07,0x05,0x00,0x10,0x81, 0x05,0x06,0x05,0x06,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81, 0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x35,0x01,0x20,0x58,0x05,0x14,0x08,0x20,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x05,0x0c,0x04,0x32,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x0d,0x04,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x05,0x04,0x04,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x05,0x04,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x08,0x04,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x09,0x04,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x97,0x03,0x80,0x00,0x00, 0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x62,0x68,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x26,0x02,0x00,0xa0,0x0a,0x05,0x23,0x85,0x19,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x24,0x05,0x1a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x25,0x85,0x1c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x26,0x05,0x1d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x27,0x85,0x1d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x28,0x05,0x1e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x29,0x85,0x1e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2a,0x05,0x1f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2b,0x85,0x1f,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x21,0x58,0x05,0x14,0x10, 0x20,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x22,0x05,0x19,0x34,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3c,0x05,0x3c,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x14,0x04,0x06,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x15,0x04,0x07,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x16,0x04,0x0a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x17,0x04,0x0b,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x20,0x05,0x18,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x21,0x85,0x18,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x06,0x85,0x1a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x07,0x05,0x1b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0a,0x85,0x1b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0b,0x05,0x1c,0x34,0x00,0x00,0x00, 0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x38,0x03,0x62,0x80,0x02,0x11,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x12,0x04,0x3c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x13,0x04,0x3d,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x99,0x03,0x80,0x00,0x00, 0x05,0x3c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x34,0x05,0x34,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x27,0x02,0x00,0xa0,0x0a, 0x85,0x20,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x21,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x22,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x00,0x00, 0x05,0x0e,0x04,0x34,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x0f,0x04,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x28,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2a,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x23,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x24,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x07,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x05,0x10,0x04,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x11,0x04,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x29,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2b,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x06,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0b,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x25,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x26,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00, 0x05,0x44,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x28,0x02,0x00,0xa0,0x0a, 0x05,0x34,0x05,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x35,0x85,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x36,0x05,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x37,0x85,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x18,0x05,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x38,0x05,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x39,0x85,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3a,0x05,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3b,0x85,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2c,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2d,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2e,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2f,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x1a,0x05,0x21,0x46,0x05,0x05,0x18,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x1c,0x05,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x29,0x02,0x00,0xa0,0x0a, 0x85,0x34,0x05,0x3c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x38,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x39,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x3a,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x3b,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x20,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x3e,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x30,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x31,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x32,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x33,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2e,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x30,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x1e,0x05,0x23,0x46,0x05,0x05,0x1c,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0a,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x48,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x35,0x85,0x3c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x36,0x05,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x18,0x05,0x29,0x46,0x05,0x05,0x3e,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x1c,0x05,0x2b,0x46,0x05,0x05,0x20,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x22,0x05,0x34,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x27,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x46,0x05,0x06,0x46,0x05,0x05,0x44,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x32,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2f,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x3e,0x05,0x2e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x2a,0x05,0x30,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x31,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x4c,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x37,0x85,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2c,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2d,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x4a,0x05,0x0a,0x46,0x05,0x05,0x48,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x06,0x05,0x36,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x40,0x05,0x35,0x46,0x05,0x05,0x22,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x33,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x20,0x05,0x2f,0x46,0x05,0x05,0x3e,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x0a,0x05,0x38,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x22,0x05,0x31,0x46,0x05,0x05,0x2a,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x32,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x4e,0x05,0x25,0x46,0x05,0x05,0x4c,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x42,0x05,0x37,0x46,0x05,0x05,0x06,0x46,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0xa5,0x02,0xe4,0x01,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x50,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x24,0x05,0x39,0x46,0x05,0x05,0x0a,0x46,0x00,0x40,0x06,0x05,0x00,0x50,0x00, 0x05,0x06,0x05,0x33,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x44,0x05,0x3a,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x36,0x04,0x1a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x2f,0x04,0x1c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x01,0x20,0x04,0x1e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x33,0x04,0x20,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x34,0x04,0x22,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62,0x70,0x01, 0x11,0x00,0x61,0x07,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x3c,0x05,0x27,0x46,0x05,0x05,0x50, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x3b,0x46,0x05,0x05,0x44, 0x46,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x36,0x58,0x05,0x14,0x1a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x01,0x20,0x58,0x05,0x14,0x1e, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x45,0x05,0x2f,0x58,0x05,0x14,0x1c, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x1b,0x05,0x33,0x58,0x05,0x14,0x20, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x34,0x58,0x05,0x14,0x22, 0x20,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x48,0x05,0x2c,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x4a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0b,0x04,0x46,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x03,0x05,0x00,0x50,0x00,0x05,0x28,0x05,0x2d,0x46,0x05,0x05,0x48, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2e,0x04,0x18,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x35,0x04,0x06,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2c,0x04,0x4e,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x3c,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3b,0x01,0x20,0x58,0x05,0x14,0x4a, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x0b,0x58,0x05,0x14,0x46, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x40,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x31,0x04,0x26,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x05,0x32,0x04,0x28,0x20,0x05,0x02,0x00, 0x02,0x00,0x61,0x3a,0x03,0x62,0x58,0x02,0x11,0x00,0x40,0x07,0x04,0x00,0x50,0x05, 0x05,0x44,0x05,0x2e,0x58,0x05,0x14,0x18,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05, 0x05,0x3e,0x05,0x2c,0x58,0x05,0x14,0x4e,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05, 0x05,0x3f,0x05,0x2d,0x58,0x05,0x14,0x3c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x0b,0x05,0x35,0x58,0x05,0x14,0x06,0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2a,0x02,0x00,0xa0,0x0a, 0x05,0x06,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x1c,0x68,0x82,0x01, 0x01,0x03,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3a,0x05,0x3a,0x46,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x01,0x20,0x58,0x05,0x14,0x40, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x31,0x58,0x05,0x14,0x26, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1a,0x05,0x32,0x58,0x05,0x14,0x28, 0x20,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x3b,0x03,0x62,0x70,0x01,0x11,0x00,0x61,0x06,0x03,0x62,0x60,0x1c, 0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x42,0x20,0x05,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x44,0x05,0x44,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3e,0x05,0x3e,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x04,0x04,0x38,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x05,0x04,0x39,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x08,0x04,0x3a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x09,0x04,0x3b,0x20,0x00,0x00,0x00, 0x00,0x00,0x31,0x9c,0x03,0x80,0x00,0x00,0x05,0x34,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x3c,0x03,0x62,0x58,0x02,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x49,0x01,0x20,0x58,0x05,0x14,0x42,0x20,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x85,0x0e,0x04,0x44,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x85,0x0c,0x04,0x3e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x0d,0x04,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x9d,0x03,0x80,0x00,0x00, 0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x01,0x20,0x04,0x24,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x1a,0x05,0x1a,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x4c,0x01,0x20,0x58,0x05,0x14,0x24,0x20,0x00,0x68,0x07,0x05,0x00,0x10,0x81, 0x05,0x48,0x05,0x48,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2b,0x02,0x00,0xa0,0x0a, 0x85,0x06,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x18,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x28,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x85,0x15,0x04,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x18,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x28,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x24,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x24,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1b,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1b,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x07,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x07,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x17,0x04,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x4c,0x05,0x4c,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2c,0x02,0x00,0xa0,0x0a, 0x05,0x1d,0x05,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1e,0x85,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1f,0x05,0x35,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0b,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x20,0x85,0x35,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x19,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x26,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x27,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x29,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x0f,0x04,0x45,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2a,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x14,0x04,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x19,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x26,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x29,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2a,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x16,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2b,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x11,0x04,0x49,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2d,0x05,0x38,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2e,0x85,0x38,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2f,0x05,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0b,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2d,0x02,0x00,0xa0,0x0a, 0x85,0x2c,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x21,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x22,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x45,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1a,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1a,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0a,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0a,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x23,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x49,0x05,0x1b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x30,0x85,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x3f,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x38,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x22,0x85,0x36,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x2c,0x85,0x37,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1d,0x05,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x21,0x05,0x36,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x23,0x05,0x37,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2d,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1f,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2f,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x36,0x05,0x07,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x27,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2b,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x10,0x04,0x48,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x32,0x85,0x3a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3c,0x85,0x3b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x12,0x04,0x4c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x31,0x05,0x3a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x51,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x33,0x05,0x3b,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x06,0x05,0x29,0x46,0x05,0x05,0x3f,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x47,0x05,0x1a,0x46,0x05,0x05,0x45,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x4b,0x05,0x0a,0x46,0x05,0x05,0x49,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x3a,0x05,0x19,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x25,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x25,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x1e,0x85,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x2e,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x31,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x3f,0x05,0x2f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x1a,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x45,0x05,0x23,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x49,0x05,0x2d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x38,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x20,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x30,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x18,0x05,0x2b,0x46,0x05,0x05,0x34,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x3d,0x05,0x27,0x46,0x05,0x05,0x51,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x3c,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x32,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x33,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x28,0x05,0x2e,0x46,0x05,0x05,0x49,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x41,0x05,0x1e,0x46,0x05,0x05,0x38,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00, 0x05,0x2a,0x05,0x30,0x46,0x05,0x05,0x3f,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x34,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x26,0x05,0x2c,0x46,0x05,0x05,0x45,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00, 0x05,0x43,0x05,0x20,0x46,0x05,0x05,0x1a,0x46,0x00,0x40,0x03,0x05,0x00,0x50,0x00, 0x05,0x1d,0x05,0x32,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x85,0x13,0x04,0x4d,0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x1f,0x04,0x36,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x05,0x00,0x50,0x00, 0x05,0x38,0x05,0x33,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x04,0x00,0x50,0x85, 0x05,0x2d,0x04,0x41,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85, 0x01,0x20,0x04,0x28,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x2c,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85, 0x05,0x30,0x04,0x26,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85, 0x05,0x2e,0x04,0x43,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x32,0x04,0x2a,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00, 0x05,0x4d,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x68,0x02, 0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x3c,0x46,0x05,0x05,0x38, 0x46,0x00,0x40,0x04,0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x25,0x46,0x05,0x05,0x4d, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x35,0x01,0x20,0x58,0x05,0x14,0x28, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x2c,0x58,0x05,0x14,0x18, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x52,0x05,0x30,0x58,0x05,0x14,0x26, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x1f,0x58,0x05,0x14,0x36, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4d,0x05,0x2d,0x58,0x05,0x14,0x41, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x2e,0x58,0x05,0x14,0x43, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x32,0x58,0x05,0x14,0x2a, 0x20,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x05,0x27,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x21,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x01,0x05,0x00,0x50,0x00,0x05,0x24,0x05,0x22,0x46,0x05,0x05,0x0a, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x4b,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0b,0x04,0x47,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x33,0x04,0x1d,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x34,0x04,0x1a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x3a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x05,0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x20,0x58,0x05,0x14,0x4b, 0x20,0x00,0x40,0x05,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x0b,0x58,0x05,0x14,0x47, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x05,0x2f,0x04,0x24,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x01,0x20,0x58,0x05,0x14,0x3a, 0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x0b,0x05,0x34,0x58,0x05,0x14,0x1a, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x33,0x58,0x05,0x14,0x1d, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x3d,0x20,0x05,0x02,0x00, 0x02,0x00,0x68,0x06,0x05,0x00,0x10,0x81,0x05,0x3f,0x05,0x3f,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x3e,0x03,0x62,0x80,0x02,0x11,0x00,0x40,0x07,0x04,0x00,0x50,0x05, 0x05,0x51,0x05,0x2f,0x58,0x05,0x14,0x24,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x05,0x23,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x35,0x05,0x35,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81, 0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81, 0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x46,0x01,0x20,0x58,0x05,0x14,0x3d,0x20,0x00,0x61,0x07,0x04,0x00,0x00,0x00, 0x05,0x18,0x04,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x19,0x04,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x9f,0x03,0x80,0x00,0x00, 0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3f,0x03,0x62,0x68,0x02, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x1c,0x11,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x4d,0x05,0x4d,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85, 0x01,0x20,0x04,0x4f,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81, 0x05,0x51,0x05,0x51,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2e,0x02,0x00,0xa0,0x0a, 0x05,0x2f,0x05,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x30,0x85,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x31,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x32,0x85,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x33,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x34,0x85,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x37,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3a,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3b,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x3c,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05, 0x05,0x49,0x05,0x23,0x58,0x05,0x14,0x06,0x20,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x24,0x04,0x36,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x25,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x26,0x04,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x06,0x04,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x07,0x04,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00, 0x05,0x23,0x04,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x36,0x85,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0a,0x05,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0b,0x85,0x2b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x38,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x39,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x35,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00, 0x05,0x27,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x03,0x62,0x80,0x02, 0x11,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1f,0x04,0x4d,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x20,0x04,0x4e,0x20,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x45,0x01,0x20,0x58,0x05,0x14,0x4f, 0x20,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x22,0x04,0x52,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x21,0x04,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x4d,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x68,0x03,0x05,0x00,0x10,0x81,0x05,0x45,0x05,0x45,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x2f,0x02,0x00,0xa0,0x0a,0x85,0x2f,0x05,0x3d,0x34,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x49,0x05,0x49,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x30,0x85,0x3d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x31,0x05,0x3e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x05,0x40,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x39,0x05,0x43,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x1a,0x04,0x45,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1b,0x04,0x46,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x33,0x05,0x3f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x05,0x41,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x37,0x05,0x42,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3b,0x05,0x44,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x32,0x85,0x3e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x85,0x40,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3a,0x85,0x43,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1d,0x04,0x49,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1e,0x04,0x4a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x45,0x05,0x27,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x46,0x85,0x27,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x47,0x05,0x28,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x48,0x85,0x28,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x2f,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x59,0x05,0x35,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x49,0x05,0x29,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4a,0x85,0x29,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4b,0x05,0x2a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4c,0x85,0x2a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3d,0x05,0x2b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3e,0x85,0x2b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1c,0x05,0x2c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3f,0x85,0x2c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x21,0x02,0x00,0xa0,0x0a,0x85,0x49,0x05,0x4f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4a,0x85,0x4f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4b,0x05,0x50,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4c,0x85,0x50,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x30,0x46,0x05,0x05,0x27, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x31,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x39,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x34,0x85,0x3f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0b,0x85,0x41,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x38,0x85,0x42,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3c,0x85,0x44,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x55,0x05,0x33,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5d,0x05,0x0a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x61,0x05,0x37,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x45,0x05,0x4d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x47,0x05,0x4e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3d,0x05,0x51,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1c,0x05,0x52,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x3b,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x40,0x05,0x2d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x41,0x85,0x2d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x42,0x05,0x2e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x43,0x85,0x2e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x40,0x05,0x53,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5b,0x05,0x36,0x46,0x05,0x05,0x59, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x3a,0x46,0x05,0x05,0x4f, 0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x42,0x05,0x54,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x32,0x46,0x05,0x05,0x2b, 0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x46,0x85,0x4d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x48,0x85,0x4e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3e,0x85,0x51,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x43,0x85,0x54,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3f,0x85,0x52,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x41,0x85,0x53,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x57,0x05,0x34,0x46,0x05,0x05,0x55, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x05,0x0b,0x46,0x05,0x05,0x5d, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x59,0x05,0x3d,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4f,0x05,0x1c,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x3c,0x46,0x05,0x05,0x2f, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x45,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x4d,0x05,0x38,0x46,0x05,0x05,0x61, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x51,0x05,0x47,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x53,0x05,0x49,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3b,0x05,0x40,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x44,0x05,0x42,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x55,0x05,0x4b,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x3e,0x46,0x05,0x05,0x59, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x3f,0x46,0x05,0x05,0x4f, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x33,0x05,0x46,0x46,0x05,0x05,0x31, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x48,0x46,0x05,0x05,0x51, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x4a,0x46,0x05,0x05,0x53, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x49,0x04,0x2d,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3e,0x04,0x4d,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3f,0x04,0x5f,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x41,0x46,0x05,0x05,0x3b, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x46,0x05,0x43,0x46,0x05,0x05,0x44, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x29,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x4a,0x04,0x57,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x37,0x05,0x4c,0x46,0x05,0x05,0x55, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3d,0x04,0x5b,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x01,0x20,0x58,0x05,0x14,0x29, 0x20,0x00,0x40,0x04,0x04,0x00,0x50,0x05,0x05,0x3b,0x05,0x4a,0x58,0x05,0x14,0x57, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x4c,0x05,0x49,0x58,0x05,0x14,0x2d, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x29,0x05,0x3f,0x58,0x05,0x14,0x5f, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2a,0x05,0x3e,0x58,0x05,0x14,0x4d, 0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x46,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x31,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x27,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x40,0x04,0x2b,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x42,0x04,0x35,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x41,0x04,0x0a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x43,0x04,0x33,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x45,0x04,0x39,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x44,0x04,0x37,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2e,0x04,0x2f,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x3d,0x58,0x05,0x14,0x5b, 0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x29,0x05,0x29,0x46,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x01,0x20,0x58,0x05,0x14,0x46, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x2d,0x58,0x05,0x14,0x31, 0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x4b,0x05,0x4b,0x46,0x01,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x48,0x05,0x1c,0x58,0x05,0x14,0x27, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x40,0x58,0x05,0x14,0x2b, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x50,0x05,0x42,0x58,0x05,0x14,0x35, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x51,0x05,0x41,0x58,0x05,0x14,0x0a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x05,0x43,0x58,0x05,0x14,0x33, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x53,0x05,0x45,0x58,0x05,0x14,0x39, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x52,0x05,0x44,0x58,0x05,0x14,0x37, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x54,0x05,0x2e,0x58,0x05,0x14,0x2f, 0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3b,0x05,0x3b,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1a,0x04,0x29,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1b,0x04,0x2a,0x20,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3d,0x05,0x3d,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x08,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x06,0x04,0x4b,0x20,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x48,0x05,0x48,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x4f,0x05,0x4f,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x51,0x05,0x51,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x53,0x05,0x53,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x0c,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x05,0x46,0x05,0x05,0x0a, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x09,0x46,0x05,0x05,0x29, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x0e,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x07,0x04,0x4c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x10,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x12,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x18,0x04,0x3b,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x25,0x04,0x3d,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x26,0x04,0x3e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x16,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x06,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x14,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1d,0x04,0x48,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1f,0x04,0x4f,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x21,0x04,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x23,0x04,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x0d,0x46,0x05,0x05,0x2d, 0x46,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x19,0x04,0x3c,0x20,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x33,0x05,0x0f,0x46,0x05,0x05,0x31, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x37,0x05,0x11,0x46,0x05,0x05,0x35, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x17,0x46,0x05,0x05,0x0a, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x15,0x46,0x05,0x05,0x3d, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x07,0x46,0x05,0x05,0x29, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x18,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x3b,0x05,0x13,0x46,0x05,0x05,0x39, 0x46,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1e,0x04,0x49,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x20,0x04,0x50,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x22,0x04,0x52,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x24,0x04,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x1a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x1d,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x23,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x21,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x25,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x1f,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x19,0x46,0x05,0x05,0x2d, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x1b,0x46,0x05,0x05,0x31, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x1e,0x46,0x05,0x05,0x35, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x24,0x46,0x05,0x05,0x16, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x22,0x46,0x05,0x05,0x3d, 0x46,0x00,0x40,0x06,0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x20,0x46,0x05,0x05,0x39, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x18,0x05,0x26,0x46,0x05,0x05,0x29, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x2f,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1a,0x04,0x27,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1d,0x04,0x33,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x21,0x04,0x08,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x3b,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x2b,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1e,0x04,0x37,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x12,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x16,0x04,0x0e,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x17,0x04,0x10,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x22,0x04,0x0c,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x0a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x04,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x14,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x26,0x04,0x06,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x18,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x1c,0x58,0x05,0x14,0x2f, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x1a,0x58,0x05,0x14,0x27, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x1d,0x58,0x05,0x14,0x33, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x21,0x58,0x05,0x14,0x08, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x1f,0x58,0x05,0x14,0x3b, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x1b,0x58,0x05,0x14,0x2b, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x1e,0x58,0x05,0x14,0x37, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x23,0x58,0x05,0x14,0x12, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x05,0x16,0x58,0x05,0x14,0x0e, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x17,0x58,0x05,0x14,0x10, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x22,0x58,0x05,0x14,0x0c, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x01,0x20,0x58,0x05,0x14,0x04, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x27,0x05,0x24,0x58,0x05,0x14,0x14, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x25,0x58,0x05,0x14,0x0a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1a,0x05,0x26,0x58,0x05,0x14,0x06, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1b,0x05,0x29,0x58,0x05,0x14,0x18, 0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x31,0x05,0x31,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x35,0x05,0x35,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x3f,0x05,0x3f,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x3d,0x05,0x3d,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x39,0x05,0x39,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x1a,0x05,0x1a,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0d,0x04,0x31,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0c,0x04,0x2d,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0e,0x04,0x35,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x11,0x04,0x3f,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x10,0x04,0x3d,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0f,0x04,0x39,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x12,0x04,0x27,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x13,0x04,0x1a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x67,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0xa4,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa2,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xc0,0x44,0x0c,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0a,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x84, 0x01,0x00,0xa4,0x68,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x0a,0x00,0x00,0x69,0x00,0x01,0x68,0xaa,0x69, 0x51,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0x24,0x69,0x00,0x05,0x05,0x00, 0x05,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x05,0x03,0x62,0x70,0x01, 0x11,0x00,0x61,0x05,0x00,0x80,0xa0,0x0a,0x25,0x03,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x85,0x02,0xa4,0x01,0x00,0x05,0x10,0x00, 0x10,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x01,0x33,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x01,0x03,0x62,0x58,0x02, 0x11,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x40,0x34,0x00,0x00,0x60,0x86,0x25,0x03,0xe4,0x01,0x00,0x05,0x10,0x00, 0x10,0x00,0x61,0x00,0x03,0x62,0x70,0x01,0x11,0x00,0x61,0x23,0x02,0x00,0xa0,0x0a, 0x05,0x0c,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0d,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0e,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0f,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x10,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x11,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x12,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x13,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x14,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x15,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x16,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x17,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x18,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x19,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1a,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x1b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0x95,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x35,0x03,0x62,0x58,0x02, 0x11,0x00,0x61,0x24,0x02,0x00,0xa0,0x0a,0x85,0x0c,0x05,0x1c,0x34,0x00,0x00,0x00, 0x00,0x00,0x31,0xa6,0x03,0x80,0x00,0x00,0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0e,0x05,0x1d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0d,0x85,0x1c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0f,0x85,0x1d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x10,0x05,0x1e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x12,0x05,0x1f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x18,0x05,0x22,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1a,0x05,0x23,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x11,0x85,0x1e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x14,0x05,0x20,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x16,0x05,0x21,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x34,0x05,0x10,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x13,0x85,0x1f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x19,0x85,0x22,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1b,0x85,0x23,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x38,0x05,0x12,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x15,0x85,0x20,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x06,0x05,0x00,0x50,0x00,0x05,0x36,0x05,0x11,0x46,0x05,0x05,0x34, 0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x17,0x85,0x21,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x3c,0x05,0x14,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x50,0x00,0x05,0x40,0x05,0x16,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x06,0x05,0x00,0x50,0x00,0x05,0x3a,0x05,0x13,0x46,0x05,0x05,0x38, 0x46,0x00,0x61,0x25,0x02,0x00,0xa0,0x0a,0x05,0x24,0x05,0x04,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x25,0x85,0x04,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x26,0x05,0x05,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x27,0x85,0x05,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1c,0x05,0x08,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1d,0x85,0x08,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1e,0x05,0x09,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1f,0x85,0x09,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x0c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x0e,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x26,0x02,0x00,0xa0,0x0a,0x85,0x24,0x05,0x2c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x28,0x05,0x06,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x29,0x85,0x06,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2a,0x05,0x07,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2b,0x85,0x07,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x20,0x05,0x0a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x21,0x85,0x0a,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x22,0x05,0x0b,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x23,0x85,0x0b,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x0d,0x46,0x05,0x05,0x04, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x0f,0x46,0x05,0x05,0x08, 0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x25,0x85,0x2c,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x26,0x05,0x2d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x28,0x05,0x2e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x29,0x85,0x2e,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2a,0x05,0x2f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2b,0x85,0x2f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x1a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x24,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2e,0x05,0x18,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1c,0x05,0x30,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1e,0x05,0x31,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x20,0x05,0x32,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x22,0x05,0x33,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x27,0x85,0x2d,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1d,0x85,0x30,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1f,0x85,0x31,0x34,0x00,0x00,0x00, 0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x1b,0x46,0x05,0x05,0x0c, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x25,0x46,0x05,0x05,0x0e, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x19,0x46,0x05,0x05,0x2e, 0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x30,0x05,0x26,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x21,0x85,0x32,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x23,0x85,0x33,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x34,0x05,0x2a,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x38,0x05,0x1c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x20,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x24,0x05,0x22,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2e,0x05,0x1e,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x32,0x05,0x28,0x46,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x3e,0x05,0x15,0x46,0x05,0x05,0x3c, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2c,0x05,0x17,0x46,0x05,0x05,0x40, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x27,0x46,0x05,0x05,0x30, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x18,0x05,0x1d,0x46,0x05,0x05,0x38, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x21,0x46,0x05,0x05,0x1a, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x1f,0x46,0x05,0x05,0x2e, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x29,0x46,0x05,0x05,0x32, 0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x2b,0x46,0x05,0x05,0x34, 0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x23,0x46,0x05,0x05,0x24, 0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2a,0x04,0x36,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x10,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1e,0x04,0x04,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x28,0x04,0x06,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x3e,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1d,0x04,0x2c,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x22,0x04,0x18,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x12,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x08,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x0a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x14,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2b,0x04,0x3a,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x21,0x04,0x16,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x0c,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x0e,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x26,0x20,0x05,0x02,0x00, 0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x30,0x05,0x2a,0x58,0x05,0x14,0x36, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x20,0x58,0x05,0x14,0x10, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x1e,0x58,0x05,0x14,0x04, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x28,0x58,0x05,0x14,0x06, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x1c,0x58,0x05,0x14,0x3e, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x1d,0x58,0x05,0x14,0x2c, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x01,0x20,0x58,0x05,0x14,0x12, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x1f,0x58,0x05,0x14,0x08, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2f,0x05,0x29,0x58,0x05,0x14,0x0a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x1b,0x58,0x05,0x14,0x14, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x2b,0x58,0x05,0x14,0x3a, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x21,0x58,0x05,0x14,0x16, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x06,0x05,0x22,0x58,0x05,0x14,0x18, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x07,0x05,0x23,0x58,0x05,0x14,0x0c, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x24,0x58,0x05,0x14,0x0e, 0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x0b,0x05,0x25,0x58,0x05,0x14,0x26, 0x20,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x32,0x05,0x32,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x34,0x05,0x34,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x2e,0x05,0x2e,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x30,0x05,0x30,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x3c,0x05,0x3c,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x06,0x05,0x06,0x46,0x01,0x02,0x00, 0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00, 0x02,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x12,0x04,0x32,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x14,0x04,0x38,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x13,0x04,0x34,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x10,0x04,0x2e,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x11,0x04,0x30,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x15,0x04,0x3c,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x16,0x04,0x06,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x17,0x04,0x0a,0x20,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x67,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0xa4,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa7,0x03,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xc0,0x44,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x80, 0xa5,0x01,0x84,0x63,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xa5,0x08,0x24,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x20,0x01, 0x05,0x08,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x00,0x00,0x40, 0xc4,0x67,0x00,0x00,0x00,0x00,0x08,0x21,0x00,0x00,0x65,0x03,0x00,0x00,0x60,0x86, 0xc5,0x0e,0xa4,0x08,0x00,0x05,0xff,0x00,0xff,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a, 0x45,0x69,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x66,0x02,0x00,0x00,0x60,0x06, 0x01,0x00,0xc4,0x0e,0x00,0x16,0x84,0x67,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a, 0xc5,0x67,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x61,0x00,0x02,0x00,0xa0,0x4a, 0x05,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a, 0x85,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a, 0x05,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a, 0x85,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0f,0xa8,0xa0,0x00, 0x01,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x10,0xa8,0x90,0x00,0x01,0x00,0x61,0x00,0x0e,0xa8,0x88,0x00, 0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x45,0xa6,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x49,0x85,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0e, 0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x01,0x24,0x69,0x00,0x05,0x0a,0x00, 0x0a,0x00,0x61,0x00,0x03,0xa1,0x00,0x00,0x01,0x00,0x66,0x02,0x00,0x00,0x60,0x06, 0x05,0x03,0xa4,0x01,0x00,0x01,0x04,0x67,0x00,0x00,0x66,0x00,0x00,0x00,0x60,0x06, 0x85,0x02,0xa4,0x01,0x00,0x01,0x04,0x67,0x00,0x00,0x31,0xa8,0x04,0x00,0x00,0x00, 0x00,0x00,0x0c,0x03,0x04,0x30,0x00,0x00,0x00,0x02,0x69,0x00,0x01,0x68,0x02,0x69, 0x21,0x00,0x61,0x00,0x04,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x04,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x61,0x04,0x04,0x62,0x00,0x01, 0x11,0x00,0x61,0x00,0x04,0x62,0xc8,0x69,0x11,0x00,0x31,0x99,0x03,0x80,0x00,0x00, 0x05,0x05,0x04,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x65,0x29,0x00,0x00,0x60,0x86, 0x01,0x00,0x04,0x05,0x00,0x15,0xff,0x00,0xff,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x61,0x38,0x04,0x00,0x90,0x49, 0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x90,0x09, 0x05,0x03,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9a,0x04,0x00,0x00,0x00, 0x0c,0x04,0x0c,0x03,0x0c,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x05,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x00, 0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x05,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x61,0x00,0x05,0x62,0x00,0x01,0x11,0x00,0x61,0x00,0x05,0x62,0xc8,0x69, 0x11,0x00,0x61,0x2a,0x00,0x00,0x20,0x05,0x01,0x00,0x04,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0xab,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x05,0x00,0xc0,0x00,0x00, 0x00,0x00,0x65,0x2b,0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x06,0x00,0x15,0xff,0x00, 0xff,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xff, 0xff,0xff,0x61,0x38,0x04,0x00,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x9c,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x06,0x30,0x00,0x00, 0x00,0x02,0x70,0x00,0x80,0x00,0x10,0x81,0x01,0x00,0x04,0x67,0x00,0x21,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45,0x46,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x08,0x00,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0x61,0x00,0x01,0x00,0x90,0x49,0xa5,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x49,0xe5,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01, 0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x01,0x44,0x67,0x00,0x05,0x06,0x00, 0x06,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43, 0x28,0x02,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x00,0x00,0x60,0x86, 0x45,0x03,0xa4,0x01,0x00,0x05,0xc0,0xff,0xc0,0xff,0x61,0x00,0x00,0x80,0x90,0x49, 0xa5,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x31,0xad,0x04,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x46,0x08,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x65,0x2d,0x00,0x00,0x40,0x84, 0x02,0x00,0x04,0x04,0x00,0x25,0x30,0x00,0x30,0x00,0x68,0x00,0x00,0x00,0x00,0x80, 0x86,0x02,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x62,0x04,0x00,0x01,0x50,0x85, 0xb5,0x02,0xa4,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x40,0x84, 0x96,0x02,0x84,0x02,0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x02,0x00,0x00,0x50,0x00, 0xb5,0x02,0x84,0x02,0x00,0x05,0xb4,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x80, 0xa5,0x01,0x94,0x02,0x00,0x05,0xff,0xff,0xff,0xff,0x65,0x02,0x03,0x00,0x50,0x85, 0x01,0x00,0xb4,0x02,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x60,0x04, 0x05,0x08,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x03,0x11,0x00,0x84, 0x06,0x06,0x25,0x04,0x46,0x05,0x22,0x00,0x22,0x00,0x61,0x04,0x00,0x80,0x20,0x02, 0x01,0x30,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09, 0x85,0x0e,0x65,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x85, 0xe5,0x10,0x65,0x05,0x22,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x20,0x00, 0x01,0x30,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x03,0x00,0x00,0x00, 0x45,0x69,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x01,0xa0,0x4a, 0x05,0x08,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x70,0x01,0x01,0x00,0x60,0x86, 0x01,0x00,0x04,0x08,0x00,0x15,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x85, 0xa5,0x10,0xa4,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80, 0x01,0x00,0xa4,0x08,0x00,0x11,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x26,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x36,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x56,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0xc5,0x10,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x00,0x90,0x49, 0xe5,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x49, 0xe5,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x67,0x00,0x00,0x00,0x60,0x80, 0xa5,0x01,0x94,0x63,0x00,0x06,0xff,0xff,0xff,0x03,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x40,0x02,0x00,0x00,0x60,0x06, 0xa5,0x01,0xa4,0x01,0x00,0x06,0x44,0x67,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49, 0xa5,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x69,0x02,0x00,0x00,0x60,0x86, 0x65,0x08,0xa4,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x61,0x00,0x08,0xa8,0x90,0x00, 0x01,0x00,0x01,0x3c,0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x02,0x00,0x80,0xa0,0x0a, 0x45,0x03,0x64,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x2e,0x00,0x00,0x40,0x84, 0x02,0x00,0x04,0x04,0x00,0x25,0x30,0x00,0x30,0x00,0x68,0x00,0x00,0x00,0x00,0x80, 0x86,0x02,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x62,0x06,0x00,0x01,0x50,0x85, 0xb5,0x02,0xa4,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x40,0x84, 0x96,0x02,0x84,0x02,0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x02,0x00,0x00,0x50,0x00, 0xb5,0x02,0x84,0x02,0x00,0x05,0xb4,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x80, 0xa5,0x01,0x94,0x02,0x00,0x05,0xff,0xff,0xff,0xff,0x65,0x02,0x03,0x00,0x50,0x85, 0x01,0x00,0xb4,0x02,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x60,0x04, 0xc5,0x10,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x03,0x11,0x00,0x84, 0x06,0x06,0x25,0x04,0x46,0x05,0x22,0x00,0x22,0x00,0x61,0x04,0x00,0x80,0x20,0x02, 0x01,0x30,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x03,0x00,0x00,0x00, 0xc5,0x67,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x85, 0xe5,0x0e,0x65,0x05,0x22,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x20,0x00, 0x01,0x30,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x01,0xa0,0x4a, 0xc5,0x10,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x70,0x01,0x01,0x00,0x60,0x86, 0x01,0x00,0xc4,0x10,0x00,0x15,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x85, 0x05,0x03,0xa4,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x09, 0x85,0x0e,0x65,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x05, 0xa5,0x10,0xa5,0x10,0x22,0x05,0x05,0x03,0x22,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x03,0x64,0x08,0x00,0x05,0xc0,0xff,0xc0,0xff,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x61,0x00,0x00,0x00,0x00,0x45, 0x26,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x31,0xbf,0x04,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x2f,0x00,0x00,0x00,0x80, 0xa6,0x01,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x61,0x00,0x00,0x00,0x60,0x04, 0xa5,0x08,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x40,0x84, 0xa6,0x01,0xa4,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x01,0x00,0x00,0x60,0x00, 0x85,0x08,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00, 0xa5,0x01,0x94,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x36,0x08,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x70,0x02,0x00,0x00,0x10,0x01, 0x01,0x00,0x04,0x67,0x00,0x55,0xa4,0x01,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x03,0x64,0x08,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x61,0x00,0x00,0x80,0x90,0x49, 0x05,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x31,0xb0,0x04,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45, 0x56,0x08,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x68,0x20,0x00,0x00,0x00,0x80, 0xa6,0x01,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x65,0x01,0x00,0x00,0x40,0x84, 0xa6,0x01,0xa4,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x40,0x01,0x00,0x00,0x60,0x80, 0xe5,0x01,0xa4,0x01,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x01,0x00,0x80,0x20,0x02, 0x01,0x30,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x85, 0xe5,0x0f,0x65,0x05,0x22,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x20,0x00, 0x01,0x30,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x11,0x60,0x84, 0x85,0x02,0x44,0x04,0x00,0x05,0xff,0xff,0xff,0xff,0x70,0x01,0x01,0x00,0x60,0x86, 0x01,0x00,0x84,0x02,0x00,0x15,0x00,0x00,0x00,0x00,0x62,0x07,0x01,0x01,0x50,0x85, 0x05,0x07,0x04,0x06,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x09, 0x85,0x0e,0x65,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x05, 0xa5,0x10,0xa5,0x10,0x22,0x05,0x05,0x07,0x22,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x45,0x03,0x64,0x08,0x00,0x05,0xc0,0xff,0xc0,0xff,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x40,0x00,0x00,0x00,0x60,0x86, 0xa5,0x01,0x84,0x08,0x00,0x05,0xff,0xff,0xff,0xff,0x31,0xb1,0x04,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x80,0x20,0x02, 0x01,0x30,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49, 0x85,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x62,0x21,0x01,0x01,0x50,0x85, 0xe5,0x0f,0x65,0x05,0x22,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x20,0x02, 0x01,0x30,0x84,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x01,0xa0,0x4a, 0xa5,0x08,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x70,0x01,0x01,0x00,0x60,0x86, 0x01,0x00,0xa4,0x08,0x00,0x15,0x00,0x00,0x00,0x00,0x62,0x05,0x01,0x01,0x50,0x85, 0x05,0x06,0x84,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x09, 0x85,0x0e,0x65,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x05, 0xa5,0x10,0xa5,0x10,0x22,0x05,0x05,0x06,0x22,0x00,0x61,0x00,0x00,0x80,0x50,0x04, 0xa5,0x01,0x44,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04, 0x85,0x02,0x54,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x40,0x04, 0xa6,0x0e,0x34,0x08,0x00,0x05,0xa4,0x01,0x00,0x00,0x61,0x3c,0x00,0x80,0x50,0x04, 0x05,0x03,0x24,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80, 0x01,0x00,0x44,0x08,0x00,0x11,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x40,0x04, 0xa6,0x0e,0xa4,0x0e,0x00,0x05,0x84,0x02,0x00,0x00,0x66,0x01,0x00,0x00,0x40,0x04, 0xa6,0x0e,0xa4,0x0e,0x00,0x05,0x04,0x03,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00, 0x29,0x02,0x40,0x00,0x03,0x68,0x5a,0x67,0xc1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a, 0x25,0x03,0xa4,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x93,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x33,0x03,0x68,0xca,0x69, 0x31,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x03,0x00, 0x07,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00, 0x19,0x02,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x23,0x04,0x00,0x00,0x00,0x05,0x0e,0x1c,0x04,0x30,0x00,0x00,0x00, 0x00,0x00,0x61,0x24,0x03,0x00,0x90,0x09,0x85,0x69,0x14,0x06,0x20,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0x34,0x08,0x00,0x11,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03, 0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0x24,0x08,0x00,0x11,0x00,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x10,0x80,0x01,0x00,0x54,0x08,0x00,0x21,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x40,0x00,0x01,0x68,0x5a,0x67,0xc1,0xff,0x61,0x00,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00, 0x19,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0xa4,0x67,0x00,0x05,0xff,0xff, 0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x61,0x05,0x03,0x62,0x00,0x01,0x11,0x00,0x31,0x95,0x03,0x80,0x00,0x00, 0x05,0x03,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x61,0x25,0x02,0x00,0xa0,0x0a, 0x05,0x0f,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x0f,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x00,0x00, 0xa5,0x0f,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x61,0x25,0x02,0x00,0xa0,0x0a, 0x05,0x0f,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a, 0x85,0x0f,0x85,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xc5,0x0f,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x69,0x68,0xca,0x69, 0x31,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x40,0x03,0x03,0x68,0xca,0x69, 0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x61,0x00,0x03,0x62,0x00,0x01,0x11,0x00,0x31,0x96,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x00,0xa0,0x0a, 0x05,0x10,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x85,0x10,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x40,0x00,0x01,0x68,0x72,0x67, 0xf1,0xff,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x67, 0x11,0x00,0x61,0x06,0x03,0x62,0x60,0x01,0x11,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a, 0x05,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa8,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a, 0x85,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0f,0xa8,0xa0,0x00, 0x01,0x00,0x61,0x28,0x04,0x80,0x40,0x04,0x25,0x0f,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x02,0x00,0xa0,0x0a,0x85,0x02,0x25,0x0f,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0xa5,0x0f,0xfc,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x67, 0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x01,0x11,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a, 0x05,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00, 0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x4a, 0x85,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0f,0xa8,0xa0,0x00, 0x01,0x00,0x61,0x29,0x02,0x00,0xa0,0x0a,0x25,0x0f,0x05,0x04,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xa5,0x0f,0x85,0x04,0x22,0x00,0x00,0x00, 0x00,0x00,0x69,0x00,0x69,0x68,0xca,0x69,0x31,0x00,0x61,0x00,0x03,0x64,0x00,0x00, 0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00, 0x19,0x02,0x40,0x03,0x03,0x68,0xca,0x69,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a, 0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x67, 0x11,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00, 0x00,0x00,0x61,0x2a,0x04,0x80,0x40,0x04,0x25,0x10,0x05,0x04,0x46,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x01,0x00,0x50,0x05,0x85,0x02,0xe5,0x0f,0x22,0x55,0xe5,0x0e, 0x22,0x00,0x62,0x00,0x01,0x00,0x50,0x05,0xe5,0x0f,0xe5,0x10,0x22,0x55,0xe5,0x0f, 0x22,0x00,0x62,0x00,0x01,0x00,0x50,0x05,0xa5,0x01,0xe5,0x0e,0x22,0x55,0xe5,0x10, 0x22,0x00,0x67,0x02,0x01,0x00,0x50,0x05,0x85,0x02,0x85,0x02,0x22,0x05,0xe5,0x0f, 0x22,0x00,0x70,0x00,0x01,0x00,0x50,0x85,0x01,0x00,0xa5,0x10,0x22,0x15,0x01,0x00, 0x01,0x00,0x67,0x02,0x01,0x00,0x50,0x05,0x85,0x02,0x85,0x02,0x22,0x05,0xa5,0x01, 0x22,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x61,0x02,0x01,0x11,0x90,0x09,0x85,0x0e,0x85,0x02,0x22,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x0e,0x00,0x15,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x45,0x03,0x04,0x08,0x00,0x05,0xe4,0x10, 0x00,0x00,0x70,0x00,0x00,0x11,0x10,0x81,0x01,0x00,0x04,0x67,0x00,0x11,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x25,0x04,0xc4,0x10,0x00,0x05,0xe4,0x0e, 0x00,0x00,0x62,0x06,0x00,0x01,0x50,0x85,0x15,0x03,0x04,0x03,0x00,0x05,0x00,0x00, 0x00,0x00,0x66,0x04,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x03,0x00,0x15,0xf4,0x10, 0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x85,0x02,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x62,0x00,0x00,0x01,0x50,0x85,0x05,0x04,0x04,0x03,0x00,0x05,0x00,0x00, 0x00,0x00,0x66,0x05,0x00,0x00,0x60,0x06,0x01,0x00,0x24,0x04,0x00,0x15,0xf4,0x0e, 0x00,0x00,0x62,0x00,0x00,0x01,0x50,0x85,0xa5,0x01,0x04,0x03,0x00,0x05,0x00,0x00, 0x00,0x00,0x70,0x06,0x01,0x00,0x50,0x85,0x01,0x00,0x15,0x03,0x22,0x25,0x00,0x00, 0x00,0x00,0x70,0x02,0x81,0x00,0x50,0x85,0x01,0x00,0xa5,0x01,0x22,0x25,0x00,0x00, 0x00,0x00,0x70,0x05,0x01,0x11,0x50,0x85,0x01,0x00,0x05,0x04,0x22,0x25,0x00,0x00, 0x00,0x00,0x62,0x07,0x81,0x01,0x10,0x81,0x05,0x05,0x84,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x62,0x00,0x01,0x01,0x10,0x81,0x95,0x02,0x84,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x66,0x01,0x01,0x00,0x10,0x01,0x01,0x00,0x95,0x02,0x22,0x21,0x05,0x05, 0x22,0x00,0x62,0x00,0x01,0x01,0x50,0x85,0x05,0x06,0x04,0x03,0x00,0x05,0x00,0x00, 0x00,0x00,0x70,0x01,0x01,0x00,0x50,0x85,0x01,0x00,0x04,0x06,0x00,0x25,0x00,0x00, 0x00,0x00,0x62,0x00,0x01,0x11,0x50,0x85,0xe5,0x0e,0x85,0x0e,0x22,0x05,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x49,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x22,0xa4,0x63,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xe5,0x0f,0x44,0x68,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x02,0x01,0x00,0x60,0x84,0xa5,0x10,0xb5,0x22,0x22,0x06,0xf0,0xff, 0x01,0x00,0x61,0x00,0x00,0x00,0x90,0x49,0xf5,0x0f,0x00,0x00,0x00,0x00,0x04,0x00, 0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x22,0x84,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x22,0xa4,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x22,0x68,0xe0,0x63,0x11,0x00,0x68,0x05,0x01,0x00,0x20,0x82, 0xa5,0x10,0xa5,0x10,0x22,0x01,0x01,0x00,0x01,0x00,0x2c,0x00,0x05,0x00,0x00,0x40, 0x84,0x67,0x00,0x00,0x00,0x00,0x98,0x10,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x49, 0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x6c,0x00,0x01,0x00,0x50,0x85, 0xa5,0x02,0x85,0x0e,0x22,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x00,0x00,0x90,0x09, 0xb5,0x01,0xe4,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0x90,0x09, 0xc5,0x02,0xa5,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x50,0x85, 0xd5,0x02,0xb4,0x02,0x00,0x05,0xfe,0xff,0xfe,0xff,0x40,0x03,0x01,0x00,0x50,0x05, 0x05,0x03,0xa5,0x01,0x22,0x05,0xa4,0x10,0x20,0x02,0x69,0x00,0x00,0x00,0x50,0x84, 0xe5,0x01,0x8c,0x63,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x01,0x00,0x50,0xa4, 0x25,0x03,0xb5,0x22,0x22,0x05,0x10,0x00,0x10,0x00,0x40,0x04,0x01,0x00,0x50,0x05, 0xc5,0x02,0xc5,0x02,0x22,0x05,0xa4,0x10,0x20,0x02,0x70,0x04,0x01,0x00,0x50,0x05, 0x01,0x00,0xa5,0x02,0x22,0x35,0x05,0x03,0x22,0x00,0x69,0x00,0x00,0x00,0x50,0x84, 0x85,0x02,0x94,0x63,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00,0x50,0x85, 0x95,0x02,0xe4,0x01,0x00,0x05,0x10,0x00,0x10,0x00,0x40,0x05,0x01,0x00,0x50,0x05, 0x25,0x03,0x25,0x03,0x22,0x05,0xa5,0x01,0x22,0x00,0x61,0x05,0x01,0x11,0x90,0x09, 0x25,0x03,0xc5,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x01,0x00,0x50,0x05, 0x01,0x00,0xa5,0x02,0x22,0x55,0x05,0x03,0x22,0x02,0x40,0x04,0x01,0x00,0x50,0x85, 0x25,0x04,0x85,0x02,0x22,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x01,0x50,0x25, 0x25,0x03,0xa5,0x01,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x01,0x00,0x50,0x85, 0x25,0x04,0x25,0x04,0x22,0x05,0xfc,0xff,0xfc,0xff,0x40,0x02,0x01,0x00,0x50,0x05, 0x05,0x04,0x25,0x03,0x22,0x05,0x45,0x22,0x22,0x00,0x40,0x02,0x01,0x00,0x50,0x05, 0x25,0x04,0x25,0x04,0x22,0x05,0x45,0x22,0x22,0x02,0x70,0x02,0x01,0x00,0x50,0x05, 0x01,0x00,0x85,0x02,0x22,0x35,0x05,0x04,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x04, 0x05,0x05,0xb5,0x22,0x22,0x05,0x45,0x22,0x22,0x00,0x61,0x03,0x01,0x11,0x90,0x09, 0x25,0x03,0x25,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50,0xa4, 0x25,0x05,0xb5,0x22,0x22,0x05,0x05,0x00,0x05,0x00,0x40,0x00,0x01,0x00,0x60,0x80, 0x85,0x02,0xb5,0x22,0x22,0x05,0x70,0x00,0x70,0x00,0x40,0x03,0x01,0x00,0x50,0x05, 0x05,0x05,0x05,0x05,0x22,0x05,0x25,0x03,0x22,0x00,0x65,0x03,0x01,0x00,0x50,0x85, 0x25,0x05,0x25,0x05,0x22,0x05,0xfc,0xff,0xfc,0xff,0x68,0x03,0x01,0x00,0x20,0x82, 0x85,0x02,0x85,0x02,0x22,0x01,0x03,0x00,0x03,0x00,0x70,0x03,0x01,0x00,0x50,0x85, 0x01,0x00,0x05,0x05,0x22,0x55,0x01,0x00,0x01,0x00,0x40,0x03,0x01,0x00,0x50,0x05, 0x25,0x05,0x25,0x05,0x22,0x05,0x45,0x22,0x22,0x02,0x65,0x03,0x01,0x00,0x40,0x84, 0xa6,0x01,0x84,0x02,0x30,0x05,0x0f,0x00,0x0f,0x00,0x61,0x00,0x01,0x11,0x90,0x09, 0x25,0x05,0x25,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xe5,0x23,0xe4,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x80, 0x06,0x03,0x74,0x69,0x00,0x01,0x04,0x00,0x04,0x00,0x69,0x04,0x00,0x00,0x40,0x84, 0xe6,0x01,0xb4,0x01,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50,0x04, 0x05,0x04,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x50,0x85, 0x35,0x05,0x34,0x05,0x00,0x05,0xfe,0xff,0xfe,0xff,0x68,0x00,0x00,0x00,0x00,0x80, 0xa6,0x01,0x54,0x69,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a, 0x05,0x23,0x05,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0x45,0x23,0x44,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x24,0xa0,0x00,0x00, 0x01,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x16,0x03,0x7c,0x69,0x00,0x05,0xf0,0xff, 0xf0,0xff,0x61,0x00,0x00,0x00,0x40,0x04,0xee,0x23,0xa4,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x07,0x00,0x00,0x40,0x84,0xe6,0x23,0xe4,0x23,0x00,0x05,0x7f,0x00, 0x7f,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xb6,0x01,0x5c,0x69,0x00,0x05,0xf0,0xff, 0xf0,0xff,0x61,0x07,0x01,0x00,0x90,0x09,0x05,0x22,0x25,0x05,0x22,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x80,0x50,0x04,0x85,0x02,0xa4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x04,0x56,0x23,0xe4,0x01,0x00,0x05,0x04,0x04, 0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x24,0xc5,0x64,0x22,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x05,0x25,0x85,0x0e,0x22,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x24,0x05,0x64,0x34,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x24,0x84,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x05,0x04,0x04,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x09,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0b,0xa0,0x00,0x00, 0x01,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x24,0x67,0x00,0x06,0x00,0x20, 0x78,0x10,0x61,0x07,0x05,0x60,0x00,0x22,0x10,0x00,0x61,0x06,0x07,0x60,0x00,0x24, 0x10,0x00,0x61,0x00,0x09,0x68,0x80,0x0e,0x11,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a, 0x05,0x0a,0xc5,0x66,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x45,0x0a,0x25,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a, 0xc5,0x0a,0xa5,0x0f,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0b,0x05,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x04, 0x86,0x0b,0xb4,0x01,0x00,0x05,0x84,0x02,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x04, 0x8e,0x0b,0x14,0x03,0x00,0x05,0x04,0x04,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04, 0x95,0x0b,0xec,0x67,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09, 0xa5,0x0b,0x14,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a, 0xe5,0x0b,0x24,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x05,0x0c,0x85,0x69,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a, 0x85,0x0c,0x25,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00, 0x3e,0x0a,0x1c,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84, 0x06,0x03,0x04,0x23,0x00,0x15,0x01,0x00,0x01,0x00,0x31,0xab,0x04,0x00,0x00,0x00, 0x05,0x1b,0x04,0x05,0x00,0xd0,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x80, 0x05,0x04,0x04,0x03,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x03,0xe2,0xb6,0x30, 0x11,0x00,0x61,0x02,0x00,0x80,0x20,0x02,0x01,0x30,0x04,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x00,0x80,0x00,0x40,0x84,0x02,0x00,0x74,0x22,0x00,0x25,0x02,0x00, 0x02,0x00,0x61,0x2b,0x00,0x01,0x10,0x45,0x45,0x1b,0x00,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0x61,0x00,0x67,0xe2,0x96,0x31,0x11,0x00,0x61,0x00,0x14,0xa0,0x00,0x00, 0x01,0x00,0x61,0x00,0x1a,0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x65,0x14,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x45,0x14,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x62,0x00,0x00,0x11,0x10,0x81, 0x05,0x0d,0x54,0x1b,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x00,0x50,0x00, 0xa5,0x01,0x25,0x21,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x80,0x00,0x10,0x01, 0x01,0x00,0x04,0x0d,0x00,0x31,0x04,0x68,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x00, 0x85,0x02,0x35,0x21,0x22,0x05,0xa5,0x01,0x22,0x00,0x61,0x00,0x05,0xe2,0x06,0x31, 0x11,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xa5,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x04,0x00,0x00,0x50,0x05,0x95,0x67,0x84,0x02,0x00,0x05,0x94,0x02, 0x00,0x00,0x62,0x03,0x80,0x01,0x10,0x81,0xb5,0x01,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x01,0x90,0x49,0x95,0x67,0x00,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0x67,0x02,0x80,0x00,0x10,0x81,0x01,0x00,0xb4,0x01,0x00,0x21,0x01,0x00, 0x01,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x14,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x67,0xe2,0x9e,0x31,0x11,0x00,0x70,0x04,0x80,0x00,0x50,0x85, 0x01,0x00,0x94,0x67,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x75,0x67,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01, 0x01,0x31,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81, 0x85,0x02,0xa4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x80,0x10,0x01, 0x01,0x31,0x64,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81, 0x95,0x02,0xa4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x01,0x80,0x00,0x10,0x01, 0x01,0x00,0x84,0x02,0x00,0x21,0x94,0x02,0x00,0x00,0x61,0x00,0x03,0xe2,0x06,0x31, 0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x25,0x03,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x74,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0xb5,0x01,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x65,0x01,0x80,0x00,0x10,0x01,0x01,0x00,0x24,0x03,0x00,0x21,0xb4,0x01, 0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0xb5,0x01,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x05,0x04,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x04,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x04,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x66,0x01,0x80,0x00,0x10,0x01,0x01,0x00,0x04,0x04,0x00,0x21,0x14,0x04, 0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x85,0x02,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x62,0x00,0x80,0x11,0x10,0x81,0x55,0x1b,0x04,0x0d,0x00,0x05,0xff,0xff, 0xff,0xff,0x66,0x02,0x00,0x00,0x10,0x01,0x01,0x00,0xb4,0x01,0x00,0x21,0x84,0x02, 0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x61,0x00,0x03,0x60,0x00,0x22,0x10,0x00,0x61,0x00,0x05,0x60,0x00,0x24, 0x10,0x00,0x61,0x00,0x07,0x60,0x00,0x65,0x10,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x01,0x10,0x24,0x67,0x00,0x06,0x00,0xc0,0x98,0x0c,0x65,0x04,0x00,0x00,0x40,0x84, 0x6e,0x03,0x6c,0x03,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90,0x09, 0x05,0x03,0x05,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8,0x60,0x00, 0x01,0x00,0x61,0x00,0x06,0x61,0x00,0x25,0x10,0x00,0x65,0x00,0x00,0x00,0x40,0x84, 0x02,0x00,0x6c,0x63,0x00,0x15,0x30,0x00,0x30,0x00,0x31,0xac,0x04,0x00,0x00,0x00, 0x05,0x0b,0x04,0x03,0x00,0x80,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x84, 0x76,0x22,0x74,0x22,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x2c,0x14,0x60,0x00,0x0b, 0x10,0x00,0x61,0x00,0x1a,0x61,0x00,0x11,0x10,0x00,0x65,0x00,0x00,0x00,0x40,0x84, 0xa6,0x24,0x04,0x0b,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x04, 0xae,0x24,0xcc,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04, 0xb6,0x24,0xd4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x61,0x07,0x03,0x60,0x00,0x22, 0x10,0x00,0x61,0x03,0x05,0x60,0x00,0x24,0x10,0x00,0x61,0x00,0x07,0x60,0x00,0x0c, 0x10,0x00,0x61,0x00,0x09,0x60,0x00,0x0e,0x10,0x00,0x40,0x00,0x00,0x00,0x60,0x86, 0x01,0x10,0x24,0x67,0x00,0x06,0x00,0x60,0x78,0x10,0x65,0x00,0x00,0x00,0x40,0x84, 0xa6,0x05,0xa4,0x24,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x04, 0xae,0x05,0xac,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04, 0xb6,0x05,0xb4,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9d,0x04,0x00,0x00,0x00, 0x05,0x14,0x04,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x70,0x2d,0x00,0x00,0x10,0x01, 0x01,0x00,0x64,0x1b,0x00,0x51,0x44,0x14,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09, 0x65,0x14,0x64,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09, 0x55,0x14,0x54,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01, 0x01,0x30,0x84,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x01, 0x01,0x00,0x54,0x1b,0x00,0x51,0x04,0x68,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x14,0x05,0x1b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x15,0x05,0x1c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x16,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x17,0x05,0x1e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x18,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x19,0x05,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00, 0x05,0x1a,0x05,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x85, 0x01,0x00,0x94,0x67,0x00,0x15,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x70,0x07,0x00,0x00,0x10,0x01, 0x01,0x00,0x44,0x1b,0x00,0x51,0x44,0x14,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x61,0x00,0x1a,0x68,0xc8,0x21, 0x11,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x1a,0x45,0x21,0x34,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01, 0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xa5,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x74,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x02,0x00,0x01,0x10,0x81,0xb5,0x01,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x64,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0x85,0x02,0xa4,0x01,0x00,0x01,0x00,0x00, 0x00,0x00,0x66,0x01,0x00,0x00,0x10,0x01,0x01,0x00,0xb4,0x01,0x00,0x21,0x84,0x02, 0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x14,0x05,0x1b,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x15,0x05,0x1c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x16,0x05,0x1d,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x17,0x05,0x1e,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x18,0x05,0x1f,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x19,0x05,0x20,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x1a,0x05,0x21,0x46,0x00,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x55,0x1b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x15,0x05,0x1c,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x16,0x05,0x1d,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x17,0x05,0x1e,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x18,0x05,0x1f,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x19,0x05,0x20,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x00,0x00,0x00,0x05,0x1a,0x05,0x21,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x14,0x05,0x1b,0x46,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xa5,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x01,0x00,0x65,0x02,0x00,0x00,0x40,0x84,0xe6,0x01,0x14,0x14,0x00,0x05,0x1f,0x00, 0x1f,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06,0x06,0x04,0x63,0x00,0x05,0x80,0xff, 0x80,0xff,0x61,0x00,0x00,0x80,0x50,0x04,0x15,0x06,0x0c,0x14,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x00,0x80,0x00,0x10,0x80,0x01,0x00,0xcc,0x14,0x00,0x11,0x00,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xb6,0x01,0x0c,0x14,0x00,0x05,0xc0,0xff, 0xc0,0xff,0x61,0x05,0x00,0x80,0x50,0x04,0xc5,0x02,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x04,0x00,0x00,0x40,0x04,0x06,0x06,0x04,0x06,0x00,0x05,0x14,0x06, 0x00,0x00,0x62,0x07,0x80,0x01,0x50,0x85,0x05,0x07,0xa4,0x01,0x00,0x05,0x00,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x46,0x03,0x1c,0x14,0x00,0x05,0x1f,0x00, 0x1f,0x00,0x66,0x04,0x00,0x00,0x40,0x04,0xb6,0x01,0xb4,0x01,0x00,0x05,0xc4,0x02, 0x00,0x00,0x65,0x03,0x80,0x00,0x50,0x85,0x01,0x00,0x04,0x07,0x00,0x15,0x01,0x00, 0x01,0x00,0x61,0x05,0x00,0x80,0x50,0x00,0xc5,0x02,0x04,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x04,0x00,0x00,0x40,0x84,0x36,0x03,0x44,0x03,0x00,0x05,0x80,0xff, 0x80,0xff,0x62,0x02,0x80,0x01,0x50,0x00,0x05,0x08,0x0c,0x14,0x00,0x05,0xc4,0x02, 0x00,0x00,0x61,0x00,0x04,0xa0,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x40,0x84, 0x06,0x04,0x04,0x14,0x00,0x05,0xcf,0xff,0xcf,0xff,0x61,0x03,0x00,0x00,0x40,0x04, 0x0e,0x04,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45, 0x16,0x04,0x00,0x00,0x00,0x00,0x0e,0x00,0x0e,0x00,0x61,0x06,0x00,0x00,0x40,0x04, 0x1e,0x04,0x34,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x10,0x01, 0x01,0x00,0x44,0x14,0x00,0x31,0x64,0x14,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84, 0x06,0x03,0x04,0x14,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x00,0x00,0x40,0x45, 0x26,0x03,0x00,0x00,0x00,0x00,0x0e,0x00,0x0e,0x00,0x66,0x00,0x00,0x00,0x40,0x84, 0x16,0x03,0xb4,0x01,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x05,0x02,0x00,0x50,0x00, 0x45,0x03,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01,0x50,0x85, 0x85,0x02,0xa4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x62,0x02,0x02,0x01,0x50,0x00, 0x05,0x09,0x04,0x03,0x20,0x05,0x45,0x03,0x34,0x00,0x70,0x00,0x00,0x00,0x10,0x81, 0x01,0x00,0x54,0x14,0x00,0x21,0xff,0xff,0xff,0xff,0x61,0x02,0x02,0x00,0x40,0x04, 0x05,0x04,0x04,0x09,0x20,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x60,0x86, 0x45,0x06,0xc4,0x14,0x00,0x05,0xff,0x00,0xff,0x00,0x66,0x02,0x00,0x00,0x40,0x84, 0x06,0x0a,0x04,0x04,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50,0x00, 0xa5,0x01,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x60,0x00, 0x25,0x04,0xcd,0x14,0x22,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x01,0x50,0x00, 0x05,0x07,0x04,0x0a,0x00,0x05,0xa4,0x01,0x00,0x00,0x65,0x07,0x01,0x00,0x50,0x85, 0x01,0x00,0x85,0x02,0x22,0x15,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x60,0x86, 0x45,0x04,0x04,0x1a,0x00,0x06,0x0f,0x0f,0x0f,0x0f,0x61,0x00,0x01,0x11,0xa0,0x0a, 0x25,0x04,0x85,0x14,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x50,0x85, 0x01,0x00,0xa4,0x02,0x00,0x15,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x61,0x00,0x00,0x00,0xa0,0x4a, 0x65,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x00,0x90,0x09, 0x85,0x04,0x64,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09, 0x95,0x04,0x44,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09, 0xc5,0x04,0x45,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x68,0x20,0x1a, 0x11,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25,0x05,0x04,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35,0x05,0x14,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x05,0x24,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x05,0x34,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x05,0x68,0x98,0x15,0x11,0x00,0x69,0x00,0x00,0x00,0x60,0x86, 0x45,0x03,0x44,0x67,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x40,0x04, 0x06,0x04,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x11,0xa0,0x0a, 0x65,0x04,0x44,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00, 0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x04,0x00,0x00,0x31,0x4f,0x03,0x80,0x00,0x00, 0x0c,0x06,0x0c,0x00,0x00,0xa0,0x00,0x00,0x78,0x02,0x61,0x2f,0x03,0x80,0x20,0x02, 0x01,0x00,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x24, 0x05,0x08,0x45,0x02,0x46,0x01,0x14,0x67,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x24, 0x05,0x07,0x05,0x02,0x46,0x01,0x04,0x67,0x00,0x00,0x61,0x02,0x09,0x61,0x00,0x08, 0x10,0x00,0x69,0x00,0x08,0x61,0x02,0x08,0xa0,0x00,0x61,0x00,0x03,0x00,0xa0,0x4a, 0x05,0x0a,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82, 0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x81,0x01,0x02,0x61,0x3e,0x03,0xa1,0x00,0x00, 0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x0a,0x00,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x0a,0x00,0x00,0x00,0x00,0xdf,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x0a,0x00,0x00,0x00,0x00,0xef,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x0a,0x00,0x00,0x00,0x00,0xf7,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x0a,0x00,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x25,0x0a,0x00,0x00,0x00,0x00,0xfd,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x0a,0x00,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0x66,0x07,0x03,0xa8,0x02,0x08,0x11,0x07,0x31,0xa0,0x03,0x00,0x00,0x00, 0x01,0x00,0x04,0x07,0x00,0xc0,0x14,0x09,0x00,0x00,0x31,0x91,0x04,0x00,0x00,0x00, 0x00,0x00,0x0c,0x03,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x04,0xa1,0x00,0x00, 0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x08,0x00,0x06,0x24,0x07, 0x00,0x00,0x31,0x93,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x02,0x30,0x00,0x00, 0x00,0x02,0x61,0x00,0x05,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0x44,0x08,0x00,0x06,0x44,0x07,0x00,0x00,0x31,0x94,0x04,0x00,0x00,0x00, 0x00,0x00,0x0c,0x05,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x06,0xa1,0x00,0x00, 0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x08,0x00,0x06,0x64,0x07, 0x00,0x00,0x31,0x95,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x02,0x30,0x00,0x00, 0x00,0x02,0x61,0x30,0x09,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06, 0x05,0x09,0x84,0x08,0x00,0x06,0x84,0x07,0x00,0x00,0x31,0x96,0x04,0x00,0x00,0x00, 0x00,0x00,0x0c,0x09,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x31,0x03,0xa1,0x00,0x00, 0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0xa4,0x08,0x00,0x06,0xa4,0x07, 0x00,0x00,0x31,0x98,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x02,0x30,0x00,0x00, 0x00,0x02,0x61,0x33,0x04,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x04,0xa8,0xfa,0x08, 0x11,0x07,0x31,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x02,0x30,0x00,0x00, 0x00,0x02,0x61,0x34,0x05,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06, 0x05,0x05,0xe4,0x08,0x00,0x06,0xe4,0x07,0x00,0x00,0x31,0x9a,0x04,0x00,0x00,0x00, 0x00,0x00,0x0c,0x05,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x7f,0x64,0x00,0x00, 0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00, 0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb, 0xff,0xff,0x61,0x01,0x00,0x00,0xa0,0x05,0xe5,0x01,0xf4,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x05,0xa5,0x01,0xe4,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0xab,0x00,0x00,0xa0,0x0a,0xe5,0x01,0xe4,0x01,0x00,0x10,0x00,0x00, 0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x8a,0xa5,0x01,0xa4,0x01,0x00,0x0a,0x08,0x00, 0x80,0x3f,0x41,0x9b,0x00,0x00,0xa0,0x0a,0xa5,0x01,0xa4,0x01,0x00,0x0a,0xe4,0x01, 0x00,0x00,0x61,0x01,0x00,0x00,0x60,0x0a,0x85,0x02,0xa4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x90,0x09,0xe5,0x0f,0x84,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x2d,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x84,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb, 0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00, 0x30,0x00,0x61,0x01,0x02,0x68,0x96,0x08,0x11,0x00,0x61,0x00,0x02,0xa8,0x88,0x00, 0xc1,0xb4,0x61,0x02,0x00,0x00,0x60,0x0a,0x85,0x08,0x84,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x4c,0x00,0x00,0xa0,0x0a,0xc5,0x02,0x84,0x02,0x00,0x10,0x00,0x00, 0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x85,0x08,0x04,0x08,0x00,0x06,0x84,0x08, 0x00,0x02,0x5b,0xbc,0x00,0x00,0xa0,0x02,0xc4,0x02,0xc4,0x02,0x02,0x02,0xe4,0x02, 0xc4,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20,0x84,0x00, 0x00,0x00,0x61,0x02,0x01,0x00,0xa0,0x02,0x05,0x03,0x85,0x08,0x22,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x60,0x0a,0xa5,0x01,0x24,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x45,0x03,0xc4,0x02,0x00,0x0a,0x24,0x03, 0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x01,0xa4,0x08,0x00,0x06,0xa4,0x01, 0x00,0x02,0x61,0x02,0x04,0xe8,0x45,0x03,0x11,0x00,0x61,0x02,0x00,0x00,0xa0,0x02, 0xa5,0x02,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x04,0x68,0x66,0x04, 0x11,0x00,0x5b,0x01,0x00,0x00,0xa0,0x02,0x84,0x02,0x24,0x03,0x82,0x02,0x24,0x04, 0x84,0x02,0x5b,0x03,0x00,0x00,0xa0,0x02,0x04,0x03,0xa4,0x02,0x82,0x02,0x24,0x04, 0x04,0x03,0x40,0x01,0x00,0x00,0xa0,0x0a,0x85,0x02,0x84,0x02,0x00,0x0a,0x04,0x03, 0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0xc5,0x02,0xc4,0x02,0x00,0x0a,0x84,0x02, 0x00,0x00,0x61,0x01,0x05,0xe8,0x6d,0x02,0x11,0x00,0x40,0x01,0x05,0xa8,0x02,0x05, 0x11,0x04,0x41,0x01,0x20,0x22,0x06,0x05,0x11,0x08,0x49,0x00,0x05,0xa8,0x02,0x05, 0x11,0x08,0x40,0x01,0x00,0x00,0x60,0x06,0xa5,0x08,0xa4,0x08,0x00,0x06,0x04,0x05, 0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0xa4,0x08,0x00,0x52,0x04,0x08, 0x00,0x00,0x61,0x00,0x00,0x01,0xa0,0x4a,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0xa5,0x08,0xa4,0x08,0x00,0x06,0x04,0x08, 0x00,0x02,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb, 0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0xc4,0x67,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x05,0x00,0x00,0x45,0x6e,0x63,0x4d,0x42,0x5f,0x42,0x00,0x25,0x6e, 0x75,0x6c,0x6c,0x00,0x25,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x25,0x74, 0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x78,0x00,0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00, 0x25,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x25,0x74,0x73,0x63, 0x00,0x25,0x72,0x30,0x00,0x25,0x61,0x72,0x67,0x00,0x25,0x72,0x65,0x74,0x76,0x61, 0x6c,0x00,0x25,0x73,0x70,0x00,0x25,0x66,0x70,0x00,0x25,0x68,0x77,0x5f,0x69,0x64, 0x00,0x25,0x73,0x72,0x30,0x00,0x25,0x63,0x72,0x30,0x00,0x25,0x63,0x65,0x30,0x00, 0x25,0x64,0x62,0x67,0x30,0x00,0x25,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00, 0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54, 0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x30,0x30,0x33,0x32,0x00,0x56,0x30, 0x30,0x33,0x33,0x00,0x56,0x30,0x30,0x33,0x34,0x00,0x56,0x30,0x30,0x33,0x35,0x00, 0x56,0x30,0x30,0x33,0x36,0x00,0x56,0x30,0x30,0x33,0x37,0x00,0x56,0x30,0x30,0x33, 0x38,0x00,0x56,0x30,0x30,0x33,0x39,0x00,0x56,0x30,0x30,0x34,0x30,0x00,0x56,0x30, 0x30,0x34,0x31,0x00,0x56,0x30,0x30,0x34,0x32,0x00,0x56,0x30,0x30,0x34,0x33,0x00, 0x56,0x30,0x30,0x34,0x34,0x00,0x56,0x30,0x30,0x34,0x35,0x00,0x56,0x30,0x30,0x34, 0x36,0x00,0x56,0x30,0x30,0x34,0x37,0x00,0x56,0x30,0x30,0x34,0x38,0x00,0x56,0x30, 0x30,0x34,0x39,0x00,0x56,0x30,0x30,0x35,0x30,0x00,0x56,0x30,0x30,0x35,0x31,0x00, 0x56,0x30,0x30,0x35,0x32,0x00,0x56,0x30,0x30,0x35,0x33,0x00,0x56,0x30,0x30,0x35, 0x34,0x00,0x56,0x30,0x30,0x35,0x35,0x00,0x56,0x30,0x30,0x35,0x36,0x00,0x56,0x30, 0x30,0x35,0x37,0x00,0x56,0x30,0x30,0x35,0x38,0x00,0x56,0x30,0x30,0x35,0x39,0x00, 0x56,0x30,0x30,0x36,0x30,0x00,0x56,0x30,0x30,0x36,0x31,0x00,0x56,0x30,0x30,0x36, 0x32,0x00,0x56,0x30,0x30,0x36,0x33,0x00,0x56,0x30,0x30,0x36,0x34,0x00,0x56,0x30, 0x30,0x36,0x35,0x00,0x56,0x30,0x30,0x36,0x36,0x00,0x56,0x30,0x30,0x36,0x37,0x00, 0x56,0x30,0x30,0x36,0x38,0x00,0x56,0x30,0x30,0x36,0x39,0x00,0x56,0x30,0x30,0x37, 0x30,0x00,0x56,0x30,0x30,0x37,0x31,0x00,0x56,0x30,0x30,0x37,0x32,0x00,0x56,0x30, 0x30,0x37,0x33,0x00,0x56,0x30,0x30,0x37,0x34,0x00,0x56,0x30,0x30,0x37,0x35,0x00, 0x56,0x30,0x30,0x37,0x36,0x00,0x56,0x30,0x30,0x37,0x37,0x00,0x56,0x30,0x30,0x37, 0x38,0x00,0x56,0x30,0x30,0x37,0x39,0x00,0x56,0x30,0x30,0x38,0x30,0x00,0x56,0x30, 0x30,0x38,0x31,0x00,0x56,0x30,0x30,0x38,0x32,0x00,0x56,0x30,0x30,0x38,0x33,0x00, 0x56,0x30,0x30,0x38,0x34,0x00,0x56,0x30,0x30,0x38,0x35,0x00,0x56,0x30,0x30,0x38, 0x36,0x00,0x56,0x30,0x30,0x38,0x37,0x00,0x56,0x30,0x30,0x38,0x38,0x00,0x56,0x30, 0x30,0x38,0x39,0x00,0x56,0x30,0x30,0x39,0x30,0x00,0x56,0x30,0x30,0x39,0x31,0x00, 0x56,0x30,0x30,0x39,0x32,0x00,0x56,0x30,0x30,0x39,0x33,0x00,0x56,0x30,0x30,0x39, 0x34,0x00,0x56,0x30,0x30,0x39,0x35,0x00,0x56,0x30,0x30,0x39,0x36,0x00,0x56,0x30, 0x30,0x39,0x37,0x00,0x56,0x30,0x30,0x39,0x38,0x00,0x56,0x30,0x30,0x39,0x39,0x00, 0x56,0x30,0x31,0x30,0x30,0x00,0x56,0x30,0x31,0x30,0x31,0x00,0x56,0x30,0x31,0x30, 0x32,0x00,0x56,0x30,0x31,0x30,0x33,0x00,0x56,0x30,0x31,0x30,0x34,0x00,0x56,0x30, 0x31,0x30,0x35,0x00,0x56,0x30,0x31,0x30,0x36,0x00,0x56,0x30,0x31,0x30,0x37,0x00, 0x56,0x30,0x31,0x30,0x38,0x00,0x56,0x30,0x31,0x30,0x39,0x00,0x56,0x30,0x31,0x31, 0x30,0x00,0x56,0x30,0x31,0x31,0x31,0x00,0x56,0x30,0x31,0x31,0x32,0x00,0x56,0x30, 0x31,0x31,0x33,0x00,0x56,0x30,0x31,0x31,0x34,0x00,0x56,0x30,0x31,0x31,0x35,0x00, 0x56,0x30,0x31,0x31,0x36,0x00,0x56,0x30,0x31,0x31,0x37,0x00,0x56,0x30,0x31,0x31, 0x38,0x00,0x56,0x30,0x31,0x31,0x39,0x00,0x56,0x30,0x31,0x32,0x30,0x00,0x56,0x30, 0x31,0x32,0x31,0x00,0x56,0x30,0x31,0x32,0x32,0x00,0x56,0x30,0x31,0x32,0x33,0x00, 0x56,0x30,0x31,0x32,0x34,0x00,0x56,0x30,0x31,0x32,0x35,0x00,0x56,0x30,0x31,0x32, 0x36,0x00,0x56,0x30,0x31,0x32,0x37,0x00,0x56,0x30,0x31,0x32,0x38,0x00,0x56,0x30, 0x31,0x32,0x39,0x00,0x56,0x30,0x31,0x33,0x30,0x00,0x56,0x30,0x31,0x33,0x31,0x00, 0x56,0x30,0x31,0x33,0x32,0x00,0x56,0x30,0x31,0x33,0x33,0x00,0x56,0x30,0x31,0x33, 0x34,0x00,0x56,0x30,0x31,0x33,0x35,0x00,0x56,0x30,0x31,0x33,0x36,0x00,0x56,0x30, 0x31,0x33,0x37,0x00,0x56,0x30,0x31,0x33,0x38,0x00,0x56,0x30,0x31,0x33,0x39,0x00, 0x56,0x30,0x31,0x34,0x30,0x00,0x56,0x30,0x31,0x34,0x31,0x00,0x56,0x30,0x31,0x34, 0x32,0x00,0x56,0x30,0x31,0x34,0x33,0x00,0x56,0x30,0x31,0x34,0x34,0x00,0x56,0x30, 0x31,0x34,0x35,0x00,0x56,0x30,0x31,0x34,0x36,0x00,0x56,0x30,0x31,0x34,0x37,0x00, 0x56,0x30,0x31,0x34,0x38,0x00,0x56,0x30,0x31,0x34,0x39,0x00,0x56,0x30,0x31,0x35, 0x30,0x00,0x56,0x30,0x31,0x35,0x31,0x00,0x56,0x30,0x31,0x35,0x32,0x00,0x56,0x30, 0x31,0x35,0x33,0x00,0x56,0x30,0x31,0x35,0x34,0x00,0x56,0x30,0x31,0x35,0x35,0x00, 0x56,0x30,0x31,0x35,0x36,0x00,0x56,0x30,0x31,0x35,0x37,0x00,0x56,0x30,0x31,0x35, 0x38,0x00,0x56,0x30,0x31,0x35,0x39,0x00,0x56,0x30,0x31,0x36,0x30,0x00,0x56,0x30, 0x31,0x36,0x31,0x00,0x56,0x30,0x31,0x36,0x32,0x00,0x56,0x30,0x31,0x36,0x33,0x00, 0x56,0x30,0x31,0x36,0x34,0x00,0x56,0x30,0x31,0x36,0x35,0x00,0x56,0x30,0x31,0x36, 0x36,0x00,0x56,0x30,0x31,0x36,0x37,0x00,0x56,0x30,0x31,0x36,0x38,0x00,0x56,0x30, 0x31,0x36,0x39,0x00,0x56,0x30,0x31,0x37,0x30,0x00,0x56,0x30,0x31,0x37,0x31,0x00, 0x56,0x30,0x31,0x37,0x32,0x00,0x56,0x30,0x31,0x37,0x33,0x00,0x56,0x30,0x31,0x37, 0x34,0x00,0x56,0x30,0x31,0x37,0x35,0x00,0x56,0x30,0x31,0x37,0x36,0x00,0x56,0x30, 0x31,0x37,0x37,0x00,0x56,0x30,0x31,0x37,0x38,0x00,0x56,0x30,0x31,0x37,0x39,0x00, 0x56,0x30,0x31,0x38,0x30,0x00,0x56,0x30,0x31,0x38,0x31,0x00,0x56,0x30,0x31,0x38, 0x32,0x00,0x56,0x30,0x31,0x38,0x33,0x00,0x56,0x30,0x31,0x38,0x34,0x00,0x56,0x30, 0x31,0x38,0x35,0x00,0x56,0x30,0x31,0x38,0x36,0x00,0x56,0x30,0x31,0x38,0x37,0x00, 0x56,0x30,0x31,0x38,0x38,0x00,0x56,0x30,0x31,0x38,0x39,0x00,0x56,0x30,0x31,0x39, 0x30,0x00,0x56,0x30,0x31,0x39,0x31,0x00,0x56,0x30,0x31,0x39,0x32,0x00,0x56,0x30, 0x31,0x39,0x33,0x00,0x56,0x30,0x31,0x39,0x34,0x00,0x56,0x30,0x31,0x39,0x35,0x00, 0x56,0x30,0x31,0x39,0x36,0x00,0x56,0x30,0x31,0x39,0x37,0x00,0x56,0x30,0x31,0x39, 0x38,0x00,0x56,0x30,0x31,0x39,0x39,0x00,0x56,0x30,0x32,0x30,0x30,0x00,0x56,0x30, 0x32,0x30,0x31,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x32,0x30,0x32,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00, 0x56,0x30,0x32,0x30,0x33,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67, 0x00,0x56,0x30,0x32,0x30,0x34,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e, 0x67,0x00,0x56,0x30,0x32,0x30,0x35,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69, 0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e, 0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65, 0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x38,0x00,0x4e,0x6f,0x57,0x69,0x64, 0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x30,0x39,0x00,0x4e,0x6f,0x57,0x69, 0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x30,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x31,0x00,0x4e,0x6f, 0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x32,0x00,0x4e, 0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x33,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31,0x34, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32,0x31, 0x35,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x32, 0x31,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30, 0x32,0x31,0x37,0x00,0x56,0x30,0x32,0x31,0x38,0x00,0x56,0x30,0x32,0x31,0x39,0x00, 0x56,0x30,0x32,0x32,0x30,0x00,0x56,0x30,0x32,0x32,0x31,0x00,0x56,0x30,0x32,0x32, 0x32,0x00,0x56,0x30,0x32,0x32,0x33,0x00,0x56,0x30,0x32,0x32,0x34,0x00,0x56,0x30, 0x32,0x32,0x35,0x00,0x56,0x30,0x32,0x32,0x36,0x00,0x56,0x30,0x32,0x32,0x37,0x00, 0x56,0x30,0x32,0x32,0x38,0x00,0x56,0x30,0x32,0x32,0x39,0x00,0x56,0x30,0x32,0x33, 0x30,0x00,0x56,0x30,0x32,0x33,0x31,0x00,0x56,0x30,0x32,0x33,0x32,0x00,0x56,0x30, 0x32,0x33,0x33,0x00,0x56,0x30,0x32,0x33,0x34,0x00,0x56,0x30,0x32,0x33,0x35,0x00, 0x56,0x30,0x32,0x33,0x36,0x00,0x56,0x30,0x32,0x33,0x37,0x00,0x56,0x30,0x32,0x33, 0x38,0x00,0x56,0x30,0x32,0x33,0x39,0x00,0x56,0x30,0x32,0x34,0x30,0x00,0x56,0x30, 0x32,0x34,0x31,0x00,0x56,0x30,0x32,0x34,0x32,0x00,0x56,0x30,0x32,0x34,0x33,0x00, 0x56,0x30,0x32,0x34,0x34,0x00,0x56,0x30,0x32,0x34,0x35,0x00,0x56,0x30,0x32,0x34, 0x36,0x00,0x56,0x30,0x32,0x34,0x37,0x00,0x56,0x30,0x32,0x34,0x38,0x00,0x56,0x30, 0x32,0x34,0x39,0x00,0x56,0x30,0x32,0x35,0x30,0x00,0x56,0x30,0x32,0x35,0x31,0x00, 0x56,0x30,0x32,0x35,0x32,0x00,0x56,0x30,0x32,0x35,0x33,0x00,0x56,0x30,0x32,0x35, 0x34,0x00,0x56,0x30,0x32,0x35,0x35,0x00,0x56,0x30,0x32,0x35,0x36,0x00,0x56,0x30, 0x32,0x35,0x37,0x00,0x56,0x30,0x32,0x35,0x38,0x00,0x56,0x30,0x32,0x35,0x39,0x00, 0x56,0x30,0x32,0x36,0x30,0x00,0x56,0x30,0x32,0x36,0x31,0x00,0x56,0x30,0x32,0x36, 0x32,0x00,0x56,0x30,0x32,0x36,0x33,0x00,0x56,0x30,0x32,0x36,0x34,0x00,0x56,0x30, 0x32,0x36,0x35,0x00,0x56,0x30,0x32,0x36,0x36,0x00,0x56,0x30,0x32,0x36,0x37,0x00, 0x56,0x30,0x32,0x36,0x38,0x00,0x56,0x30,0x32,0x36,0x39,0x00,0x56,0x30,0x32,0x37, 0x30,0x00,0x56,0x30,0x32,0x37,0x31,0x00,0x56,0x30,0x32,0x37,0x32,0x00,0x56,0x30, 0x32,0x37,0x33,0x00,0x56,0x30,0x32,0x37,0x34,0x00,0x56,0x30,0x32,0x37,0x35,0x00, 0x56,0x30,0x32,0x37,0x36,0x00,0x56,0x30,0x32,0x37,0x37,0x00,0x56,0x30,0x32,0x37, 0x38,0x00,0x56,0x30,0x32,0x37,0x39,0x00,0x56,0x30,0x32,0x38,0x30,0x00,0x56,0x30, 0x32,0x38,0x31,0x00,0x56,0x30,0x32,0x38,0x32,0x00,0x56,0x30,0x32,0x38,0x33,0x00, 0x56,0x30,0x32,0x38,0x34,0x00,0x56,0x30,0x32,0x38,0x35,0x00,0x56,0x30,0x32,0x38, 0x36,0x00,0x56,0x30,0x32,0x38,0x37,0x00,0x56,0x30,0x32,0x38,0x38,0x00,0x56,0x30, 0x32,0x38,0x39,0x00,0x56,0x30,0x32,0x39,0x30,0x00,0x56,0x30,0x32,0x39,0x31,0x00, 0x56,0x30,0x32,0x39,0x32,0x00,0x56,0x30,0x32,0x39,0x33,0x00,0x56,0x30,0x32,0x39, 0x34,0x00,0x56,0x30,0x32,0x39,0x35,0x00,0x56,0x30,0x32,0x39,0x36,0x00,0x56,0x30, 0x32,0x39,0x37,0x00,0x56,0x30,0x32,0x39,0x38,0x00,0x56,0x30,0x32,0x39,0x39,0x00, 0x56,0x30,0x33,0x30,0x30,0x00,0x56,0x30,0x33,0x30,0x31,0x00,0x56,0x30,0x33,0x30, 0x32,0x00,0x56,0x30,0x33,0x30,0x33,0x00,0x56,0x30,0x33,0x30,0x34,0x00,0x56,0x30, 0x33,0x30,0x35,0x00,0x56,0x30,0x33,0x30,0x36,0x00,0x56,0x30,0x33,0x30,0x37,0x00, 0x56,0x30,0x33,0x30,0x38,0x00,0x56,0x30,0x33,0x30,0x39,0x00,0x56,0x30,0x33,0x31, 0x30,0x00,0x56,0x30,0x33,0x31,0x31,0x00,0x56,0x30,0x33,0x31,0x32,0x00,0x56,0x30, 0x33,0x31,0x33,0x00,0x56,0x30,0x33,0x31,0x34,0x00,0x56,0x30,0x33,0x31,0x35,0x00, 0x56,0x30,0x33,0x31,0x36,0x00,0x56,0x30,0x33,0x31,0x37,0x00,0x56,0x30,0x33,0x31, 0x38,0x00,0x56,0x30,0x33,0x31,0x39,0x00,0x56,0x30,0x33,0x32,0x30,0x00,0x56,0x30, 0x33,0x32,0x31,0x00,0x56,0x30,0x33,0x32,0x32,0x00,0x56,0x30,0x33,0x32,0x33,0x00, 0x56,0x30,0x33,0x32,0x34,0x00,0x56,0x30,0x33,0x32,0x35,0x00,0x56,0x30,0x33,0x32, 0x36,0x00,0x56,0x30,0x33,0x32,0x37,0x00,0x56,0x30,0x33,0x32,0x38,0x00,0x56,0x30, 0x33,0x32,0x39,0x00,0x56,0x30,0x33,0x33,0x30,0x00,0x56,0x30,0x33,0x33,0x31,0x00, 0x56,0x30,0x33,0x33,0x32,0x00,0x56,0x30,0x33,0x33,0x33,0x00,0x56,0x30,0x33,0x33, 0x34,0x00,0x56,0x30,0x33,0x33,0x35,0x00,0x56,0x30,0x33,0x33,0x36,0x00,0x56,0x30, 0x33,0x33,0x37,0x00,0x56,0x30,0x33,0x33,0x38,0x00,0x56,0x30,0x33,0x33,0x39,0x00, 0x56,0x30,0x33,0x34,0x30,0x00,0x56,0x30,0x33,0x34,0x31,0x00,0x56,0x30,0x33,0x34, 0x32,0x00,0x56,0x30,0x33,0x34,0x33,0x00,0x56,0x30,0x33,0x34,0x34,0x00,0x56,0x30, 0x33,0x34,0x35,0x00,0x56,0x30,0x33,0x34,0x36,0x00,0x56,0x30,0x33,0x34,0x37,0x00, 0x56,0x30,0x33,0x34,0x38,0x00,0x56,0x30,0x33,0x34,0x39,0x00,0x56,0x30,0x33,0x35, 0x30,0x00,0x56,0x30,0x33,0x35,0x31,0x00,0x56,0x30,0x33,0x35,0x32,0x00,0x56,0x30, 0x33,0x35,0x33,0x00,0x56,0x30,0x33,0x35,0x34,0x00,0x56,0x30,0x33,0x35,0x35,0x00, 0x56,0x30,0x33,0x35,0x36,0x00,0x56,0x30,0x33,0x35,0x37,0x00,0x56,0x30,0x33,0x35, 0x38,0x00,0x56,0x30,0x33,0x35,0x39,0x00,0x56,0x30,0x33,0x36,0x30,0x00,0x56,0x30, 0x33,0x36,0x31,0x00,0x56,0x30,0x33,0x36,0x32,0x00,0x56,0x30,0x33,0x36,0x33,0x00, 0x56,0x30,0x33,0x36,0x34,0x00,0x56,0x30,0x33,0x36,0x35,0x00,0x56,0x30,0x33,0x36, 0x36,0x00,0x56,0x30,0x33,0x36,0x37,0x00,0x56,0x30,0x33,0x36,0x38,0x00,0x56,0x30, 0x33,0x36,0x39,0x00,0x56,0x30,0x33,0x37,0x30,0x00,0x56,0x30,0x33,0x37,0x31,0x00, 0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37,0x32, 0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x37, 0x33,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33, 0x37,0x34,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30, 0x33,0x37,0x35,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56, 0x30,0x33,0x37,0x36,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00, 0x56,0x30,0x33,0x37,0x37,0x00,0x4e,0x6f,0x57,0x69,0x64,0x65,0x6e,0x69,0x6e,0x67, 0x00,0x56,0x30,0x33,0x37,0x38,0x00,0x56,0x30,0x33,0x37,0x39,0x00,0x4e,0x6f,0x57, 0x69,0x64,0x65,0x6e,0x69,0x6e,0x67,0x00,0x56,0x30,0x33,0x38,0x30,0x00,0x56,0x30, 0x33,0x38,0x31,0x00,0x56,0x30,0x33,0x38,0x32,0x00,0x56,0x30,0x33,0x38,0x33,0x00, 0x56,0x30,0x33,0x38,0x34,0x00,0x56,0x30,0x33,0x38,0x35,0x00,0x56,0x30,0x33,0x38, 0x36,0x00,0x56,0x30,0x33,0x38,0x37,0x00,0x56,0x30,0x33,0x38,0x38,0x00,0x56,0x30, 0x33,0x38,0x39,0x00,0x56,0x30,0x33,0x39,0x30,0x00,0x56,0x30,0x33,0x39,0x31,0x00, 0x56,0x30,0x33,0x39,0x32,0x00,0x56,0x30,0x33,0x39,0x33,0x00,0x56,0x30,0x33,0x39, 0x34,0x00,0x56,0x30,0x33,0x39,0x35,0x00,0x56,0x30,0x33,0x39,0x36,0x00,0x56,0x30, 0x33,0x39,0x37,0x00,0x56,0x30,0x33,0x39,0x38,0x00,0x56,0x30,0x33,0x39,0x39,0x00, 0x56,0x30,0x34,0x30,0x30,0x00,0x56,0x30,0x34,0x30,0x31,0x00,0x56,0x30,0x34,0x30, 0x32,0x00,0x56,0x30,0x34,0x30,0x33,0x00,0x56,0x30,0x34,0x30,0x34,0x00,0x56,0x30, 0x34,0x30,0x35,0x00,0x56,0x30,0x34,0x30,0x36,0x00,0x56,0x30,0x34,0x30,0x37,0x00, 0x56,0x30,0x34,0x30,0x38,0x00,0x56,0x30,0x34,0x30,0x39,0x00,0x56,0x30,0x34,0x31, 0x30,0x00,0x56,0x30,0x34,0x31,0x31,0x00,0x56,0x30,0x34,0x31,0x32,0x00,0x56,0x30, 0x34,0x31,0x33,0x00,0x56,0x30,0x34,0x31,0x34,0x00,0x56,0x30,0x34,0x31,0x35,0x00, 0x56,0x30,0x34,0x31,0x36,0x00,0x56,0x30,0x34,0x31,0x37,0x00,0x56,0x30,0x34,0x31, 0x38,0x00,0x56,0x30,0x34,0x31,0x39,0x00,0x56,0x30,0x34,0x32,0x30,0x00,0x56,0x30, 0x34,0x32,0x31,0x00,0x56,0x30,0x34,0x32,0x32,0x00,0x56,0x30,0x34,0x32,0x33,0x00, 0x56,0x30,0x34,0x32,0x34,0x00,0x56,0x30,0x34,0x32,0x35,0x00,0x56,0x30,0x34,0x32, 0x36,0x00,0x56,0x30,0x34,0x32,0x37,0x00,0x56,0x30,0x34,0x32,0x38,0x00,0x56,0x30, 0x34,0x32,0x39,0x00,0x56,0x30,0x34,0x33,0x30,0x00,0x56,0x30,0x34,0x33,0x31,0x00, 0x56,0x30,0x34,0x33,0x32,0x00,0x56,0x30,0x34,0x33,0x33,0x00,0x56,0x30,0x34,0x33, 0x34,0x00,0x56,0x30,0x34,0x33,0x35,0x00,0x56,0x30,0x34,0x33,0x36,0x00,0x56,0x30, 0x34,0x33,0x37,0x00,0x56,0x30,0x34,0x33,0x38,0x00,0x56,0x30,0x34,0x33,0x39,0x00, 0x56,0x30,0x34,0x34,0x30,0x00,0x56,0x30,0x34,0x34,0x31,0x00,0x56,0x30,0x34,0x34, 0x32,0x00,0x56,0x30,0x34,0x34,0x33,0x00,0x56,0x30,0x34,0x34,0x34,0x00,0x56,0x30, 0x34,0x34,0x35,0x00,0x56,0x30,0x34,0x34,0x36,0x00,0x56,0x30,0x34,0x34,0x37,0x00, 0x56,0x30,0x34,0x34,0x38,0x00,0x56,0x30,0x34,0x34,0x39,0x00,0x56,0x30,0x34,0x35, 0x30,0x00,0x56,0x30,0x34,0x35,0x31,0x00,0x56,0x30,0x34,0x35,0x32,0x00,0x56,0x30, 0x34,0x35,0x33,0x00,0x56,0x30,0x34,0x35,0x34,0x00,0x56,0x30,0x34,0x35,0x35,0x00, 0x56,0x30,0x34,0x35,0x36,0x00,0x56,0x30,0x34,0x35,0x37,0x00,0x56,0x30,0x34,0x35, 0x38,0x00,0x56,0x30,0x34,0x35,0x39,0x00,0x56,0x30,0x34,0x36,0x30,0x00,0x56,0x30, 0x34,0x36,0x31,0x00,0x56,0x30,0x34,0x36,0x32,0x00,0x56,0x30,0x34,0x36,0x33,0x00, 0x56,0x30,0x34,0x36,0x34,0x00,0x56,0x30,0x34,0x36,0x35,0x00,0x56,0x30,0x34,0x36, 0x36,0x00,0x56,0x30,0x34,0x36,0x37,0x00,0x56,0x30,0x34,0x36,0x38,0x00,0x56,0x30, 0x34,0x36,0x39,0x00,0x56,0x30,0x34,0x37,0x30,0x00,0x56,0x30,0x34,0x37,0x31,0x00, 0x56,0x30,0x34,0x37,0x32,0x00,0x56,0x30,0x34,0x37,0x33,0x00,0x56,0x30,0x34,0x37, 0x34,0x00,0x56,0x30,0x34,0x37,0x35,0x00,0x56,0x30,0x34,0x37,0x36,0x00,0x56,0x30, 0x34,0x37,0x37,0x00,0x56,0x30,0x34,0x37,0x38,0x00,0x56,0x30,0x34,0x37,0x39,0x00, 0x56,0x30,0x34,0x38,0x30,0x00,0x56,0x30,0x34,0x38,0x31,0x00,0x56,0x30,0x34,0x38, 0x32,0x00,0x56,0x30,0x34,0x38,0x33,0x00,0x56,0x30,0x34,0x38,0x34,0x00,0x56,0x30, 0x34,0x38,0x35,0x00,0x56,0x30,0x34,0x38,0x36,0x00,0x56,0x30,0x34,0x38,0x37,0x00, 0x56,0x30,0x34,0x38,0x38,0x00,0x56,0x30,0x34,0x38,0x39,0x00,0x56,0x30,0x34,0x39, 0x30,0x00,0x56,0x30,0x34,0x39,0x31,0x00,0x56,0x30,0x34,0x39,0x32,0x00,0x56,0x30, 0x34,0x39,0x33,0x00,0x56,0x30,0x34,0x39,0x34,0x00,0x56,0x30,0x34,0x39,0x35,0x00, 0x56,0x30,0x34,0x39,0x36,0x00,0x56,0x30,0x34,0x39,0x37,0x00,0x56,0x30,0x34,0x39, 0x38,0x00,0x56,0x30,0x34,0x39,0x39,0x00,0x56,0x30,0x35,0x30,0x30,0x00,0x56,0x30, 0x35,0x30,0x31,0x00,0x56,0x30,0x35,0x30,0x32,0x00,0x56,0x30,0x35,0x30,0x33,0x00, 0x56,0x30,0x35,0x30,0x34,0x00,0x56,0x30,0x35,0x30,0x35,0x00,0x56,0x30,0x35,0x30, 0x36,0x00,0x56,0x30,0x35,0x30,0x37,0x00,0x56,0x30,0x35,0x30,0x38,0x00,0x56,0x30, 0x35,0x30,0x39,0x00,0x56,0x30,0x35,0x31,0x30,0x00,0x56,0x30,0x35,0x31,0x31,0x00, 0x56,0x30,0x35,0x31,0x32,0x00,0x56,0x30,0x35,0x31,0x33,0x00,0x56,0x30,0x35,0x31, 0x34,0x00,0x56,0x30,0x35,0x31,0x35,0x00,0x56,0x30,0x35,0x31,0x36,0x00,0x56,0x30, 0x35,0x31,0x37,0x00,0x56,0x30,0x35,0x31,0x38,0x00,0x56,0x30,0x35,0x31,0x39,0x00, 0x56,0x30,0x35,0x32,0x30,0x00,0x56,0x30,0x35,0x32,0x31,0x00,0x56,0x30,0x35,0x32, 0x32,0x00,0x56,0x30,0x35,0x32,0x33,0x00,0x56,0x30,0x35,0x32,0x34,0x00,0x56,0x30, 0x35,0x32,0x35,0x00,0x56,0x30,0x35,0x32,0x36,0x00,0x56,0x30,0x35,0x32,0x37,0x00, 0x56,0x30,0x35,0x32,0x38,0x00,0x56,0x30,0x35,0x32,0x39,0x00,0x56,0x30,0x35,0x33, 0x30,0x00,0x56,0x30,0x35,0x33,0x31,0x00,0x56,0x30,0x35,0x33,0x32,0x00,0x56,0x30, 0x35,0x33,0x33,0x00,0x56,0x30,0x35,0x33,0x34,0x00,0x56,0x30,0x35,0x33,0x35,0x00, 0x56,0x30,0x35,0x33,0x36,0x00,0x56,0x30,0x35,0x33,0x37,0x00,0x56,0x30,0x35,0x33, 0x38,0x00,0x56,0x30,0x35,0x33,0x39,0x00,0x56,0x30,0x35,0x34,0x30,0x00,0x56,0x30, 0x35,0x34,0x31,0x00,0x56,0x30,0x35,0x34,0x32,0x00,0x56,0x30,0x35,0x34,0x33,0x00, 0x56,0x30,0x35,0x34,0x34,0x00,0x56,0x30,0x35,0x34,0x35,0x00,0x56,0x30,0x35,0x34, 0x36,0x00,0x56,0x30,0x35,0x34,0x37,0x00,0x56,0x30,0x35,0x34,0x38,0x00,0x56,0x30, 0x35,0x34,0x39,0x00,0x56,0x30,0x35,0x35,0x30,0x00,0x56,0x30,0x35,0x35,0x31,0x00, 0x56,0x30,0x35,0x35,0x32,0x00,0x56,0x30,0x35,0x35,0x33,0x00,0x56,0x30,0x35,0x35, 0x34,0x00,0x56,0x30,0x35,0x35,0x35,0x00,0x56,0x30,0x35,0x35,0x36,0x00,0x56,0x30, 0x35,0x35,0x37,0x00,0x56,0x30,0x35,0x35,0x38,0x00,0x56,0x30,0x35,0x35,0x39,0x00, 0x56,0x30,0x35,0x36,0x30,0x00,0x56,0x30,0x35,0x36,0x31,0x00,0x56,0x30,0x35,0x36, 0x32,0x00,0x56,0x30,0x35,0x36,0x33,0x00,0x56,0x30,0x35,0x36,0x34,0x00,0x56,0x30, 0x35,0x36,0x35,0x00,0x56,0x30,0x35,0x36,0x36,0x00,0x56,0x30,0x35,0x36,0x37,0x00, 0x56,0x30,0x35,0x36,0x38,0x00,0x56,0x30,0x35,0x36,0x39,0x00,0x56,0x30,0x35,0x37, 0x30,0x00,0x56,0x30,0x35,0x37,0x31,0x00,0x56,0x30,0x35,0x37,0x32,0x00,0x56,0x30, 0x35,0x37,0x33,0x00,0x56,0x30,0x35,0x37,0x34,0x00,0x56,0x30,0x35,0x37,0x35,0x00, 0x56,0x30,0x35,0x37,0x36,0x00,0x56,0x30,0x35,0x37,0x37,0x00,0x56,0x30,0x35,0x37, 0x38,0x00,0x56,0x30,0x35,0x37,0x39,0x00,0x56,0x30,0x35,0x38,0x30,0x00,0x56,0x30, 0x35,0x38,0x31,0x00,0x56,0x30,0x35,0x38,0x32,0x00,0x56,0x30,0x35,0x38,0x33,0x00, 0x56,0x30,0x35,0x38,0x34,0x00,0x56,0x30,0x35,0x38,0x35,0x00,0x56,0x30,0x35,0x38, 0x36,0x00,0x56,0x30,0x35,0x38,0x37,0x00,0x56,0x30,0x35,0x38,0x38,0x00,0x56,0x30, 0x35,0x38,0x39,0x00,0x56,0x30,0x35,0x39,0x30,0x00,0x56,0x30,0x35,0x39,0x31,0x00, 0x56,0x30,0x35,0x39,0x32,0x00,0x56,0x30,0x35,0x39,0x33,0x00,0x56,0x30,0x35,0x39, 0x34,0x00,0x56,0x30,0x35,0x39,0x35,0x00,0x56,0x30,0x35,0x39,0x36,0x00,0x56,0x30, 0x35,0x39,0x37,0x00,0x56,0x30,0x35,0x39,0x38,0x00,0x56,0x30,0x35,0x39,0x39,0x00, 0x56,0x30,0x36,0x30,0x30,0x00,0x56,0x30,0x36,0x30,0x31,0x00,0x56,0x30,0x36,0x30, 0x32,0x00,0x56,0x30,0x36,0x30,0x33,0x00,0x56,0x30,0x36,0x30,0x34,0x00,0x56,0x30, 0x36,0x30,0x35,0x00,0x56,0x30,0x36,0x30,0x36,0x00,0x56,0x30,0x36,0x30,0x37,0x00, 0x56,0x30,0x36,0x30,0x38,0x00,0x56,0x30,0x36,0x30,0x39,0x00,0x56,0x30,0x36,0x31, 0x30,0x00,0x56,0x30,0x36,0x31,0x31,0x00,0x56,0x30,0x36,0x31,0x32,0x00,0x56,0x30, 0x36,0x31,0x33,0x00,0x56,0x30,0x36,0x31,0x34,0x00,0x56,0x30,0x36,0x31,0x35,0x00, 0x56,0x30,0x36,0x31,0x36,0x00,0x56,0x30,0x36,0x31,0x37,0x00,0x56,0x30,0x36,0x31, 0x38,0x00,0x56,0x30,0x36,0x31,0x39,0x00,0x56,0x30,0x36,0x32,0x30,0x00,0x56,0x30, 0x36,0x32,0x31,0x00,0x56,0x30,0x36,0x32,0x32,0x00,0x56,0x30,0x36,0x32,0x33,0x00, 0x56,0x30,0x36,0x32,0x34,0x00,0x56,0x30,0x36,0x32,0x35,0x00,0x56,0x30,0x36,0x32, 0x36,0x00,0x56,0x30,0x36,0x32,0x37,0x00,0x56,0x30,0x36,0x32,0x38,0x00,0x56,0x30, 0x36,0x32,0x39,0x00,0x56,0x30,0x36,0x33,0x30,0x00,0x56,0x30,0x36,0x33,0x31,0x00, 0x56,0x30,0x36,0x33,0x32,0x00,0x56,0x30,0x36,0x33,0x33,0x00,0x56,0x30,0x36,0x33, 0x34,0x00,0x56,0x30,0x36,0x33,0x35,0x00,0x56,0x30,0x36,0x33,0x36,0x00,0x56,0x30, 0x36,0x33,0x37,0x00,0x56,0x30,0x36,0x33,0x38,0x00,0x56,0x30,0x36,0x33,0x39,0x00, 0x56,0x30,0x36,0x34,0x30,0x00,0x56,0x30,0x36,0x34,0x31,0x00,0x56,0x30,0x36,0x34, 0x32,0x00,0x56,0x30,0x36,0x34,0x33,0x00,0x56,0x30,0x36,0x34,0x34,0x00,0x56,0x30, 0x36,0x34,0x35,0x00,0x56,0x30,0x36,0x34,0x36,0x00,0x56,0x30,0x36,0x34,0x37,0x00, 0x56,0x30,0x36,0x34,0x38,0x00,0x56,0x30,0x36,0x34,0x39,0x00,0x56,0x30,0x36,0x35, 0x30,0x00,0x56,0x30,0x36,0x35,0x31,0x00,0x56,0x30,0x36,0x35,0x32,0x00,0x56,0x30, 0x36,0x35,0x33,0x00,0x56,0x30,0x36,0x35,0x34,0x00,0x56,0x30,0x36,0x35,0x35,0x00, 0x56,0x30,0x36,0x35,0x36,0x00,0x56,0x30,0x36,0x35,0x37,0x00,0x56,0x30,0x36,0x35, 0x38,0x00,0x56,0x30,0x36,0x35,0x39,0x00,0x56,0x30,0x36,0x36,0x30,0x00,0x56,0x30, 0x36,0x36,0x31,0x00,0x56,0x30,0x36,0x36,0x32,0x00,0x56,0x30,0x36,0x36,0x33,0x00, 0x56,0x30,0x36,0x36,0x34,0x00,0x56,0x30,0x36,0x36,0x35,0x00,0x56,0x30,0x36,0x36, 0x36,0x00,0x56,0x30,0x36,0x36,0x37,0x00,0x56,0x30,0x36,0x36,0x38,0x00,0x56,0x30, 0x36,0x36,0x39,0x00,0x56,0x30,0x36,0x37,0x30,0x00,0x56,0x30,0x36,0x37,0x31,0x00, 0x56,0x30,0x36,0x37,0x32,0x00,0x56,0x30,0x36,0x37,0x33,0x00,0x56,0x30,0x36,0x37, 0x34,0x00,0x56,0x30,0x36,0x37,0x35,0x00,0x56,0x30,0x36,0x37,0x36,0x00,0x56,0x30, 0x36,0x37,0x37,0x00,0x56,0x30,0x36,0x37,0x38,0x00,0x56,0x30,0x36,0x37,0x39,0x00, 0x56,0x30,0x36,0x38,0x30,0x00,0x56,0x30,0x36,0x38,0x31,0x00,0x56,0x30,0x36,0x38, 0x32,0x00,0x56,0x30,0x36,0x38,0x33,0x00,0x56,0x30,0x36,0x38,0x34,0x00,0x56,0x30, 0x36,0x38,0x35,0x00,0x56,0x30,0x36,0x38,0x36,0x00,0x56,0x30,0x36,0x38,0x37,0x00, 0x56,0x30,0x36,0x38,0x38,0x00,0x56,0x30,0x36,0x38,0x39,0x00,0x56,0x30,0x36,0x39, 0x30,0x00,0x56,0x30,0x36,0x39,0x31,0x00,0x56,0x30,0x36,0x39,0x32,0x00,0x56,0x30, 0x36,0x39,0x33,0x00,0x56,0x30,0x36,0x39,0x34,0x00,0x56,0x30,0x36,0x39,0x35,0x00, 0x56,0x30,0x36,0x39,0x36,0x00,0x56,0x30,0x36,0x39,0x37,0x00,0x56,0x30,0x36,0x39, 0x38,0x00,0x56,0x30,0x36,0x39,0x39,0x00,0x56,0x30,0x37,0x30,0x30,0x00,0x56,0x30, 0x37,0x30,0x31,0x00,0x56,0x30,0x37,0x30,0x32,0x00,0x56,0x30,0x37,0x30,0x33,0x00, 0x56,0x30,0x37,0x30,0x34,0x00,0x56,0x30,0x37,0x30,0x35,0x00,0x56,0x30,0x37,0x30, 0x36,0x00,0x56,0x30,0x37,0x30,0x37,0x00,0x56,0x30,0x37,0x30,0x38,0x00,0x56,0x30, 0x37,0x30,0x39,0x00,0x56,0x30,0x37,0x31,0x30,0x00,0x56,0x30,0x37,0x31,0x31,0x00, 0x56,0x30,0x37,0x31,0x32,0x00,0x56,0x30,0x37,0x31,0x33,0x00,0x56,0x30,0x37,0x31, 0x34,0x00,0x56,0x30,0x37,0x31,0x35,0x00,0x56,0x30,0x37,0x31,0x36,0x00,0x56,0x30, 0x37,0x31,0x37,0x00,0x56,0x30,0x37,0x31,0x38,0x00,0x56,0x30,0x37,0x31,0x39,0x00, 0x56,0x30,0x37,0x32,0x30,0x00,0x56,0x30,0x37,0x32,0x31,0x00,0x56,0x30,0x37,0x32, 0x32,0x00,0x56,0x30,0x37,0x32,0x33,0x00,0x56,0x30,0x37,0x32,0x34,0x00,0x56,0x30, 0x37,0x32,0x35,0x00,0x56,0x30,0x37,0x32,0x36,0x00,0x56,0x30,0x37,0x32,0x37,0x00, 0x56,0x30,0x37,0x32,0x38,0x00,0x56,0x30,0x37,0x32,0x39,0x00,0x56,0x30,0x37,0x33, 0x30,0x00,0x56,0x30,0x37,0x33,0x31,0x00,0x56,0x30,0x37,0x33,0x32,0x00,0x56,0x30, 0x37,0x33,0x33,0x00,0x56,0x30,0x37,0x33,0x34,0x00,0x56,0x30,0x37,0x33,0x35,0x00, 0x56,0x30,0x37,0x33,0x36,0x00,0x56,0x30,0x37,0x33,0x37,0x00,0x56,0x30,0x37,0x33, 0x38,0x00,0x56,0x30,0x37,0x33,0x39,0x00,0x56,0x30,0x37,0x34,0x30,0x00,0x56,0x30, 0x37,0x34,0x31,0x00,0x56,0x30,0x37,0x34,0x32,0x00,0x56,0x30,0x37,0x34,0x33,0x00, 0x56,0x30,0x37,0x34,0x34,0x00,0x56,0x30,0x37,0x34,0x35,0x00,0x56,0x30,0x37,0x34, 0x36,0x00,0x56,0x30,0x37,0x34,0x37,0x00,0x56,0x30,0x37,0x34,0x38,0x00,0x56,0x30, 0x37,0x34,0x39,0x00,0x56,0x30,0x37,0x35,0x30,0x00,0x56,0x30,0x37,0x35,0x31,0x00, 0x56,0x30,0x37,0x35,0x32,0x00,0x56,0x30,0x37,0x35,0x33,0x00,0x56,0x30,0x37,0x35, 0x34,0x00,0x56,0x30,0x37,0x35,0x35,0x00,0x56,0x30,0x37,0x35,0x36,0x00,0x56,0x30, 0x37,0x35,0x37,0x00,0x56,0x30,0x37,0x35,0x38,0x00,0x56,0x30,0x37,0x35,0x39,0x00, 0x56,0x30,0x37,0x36,0x30,0x00,0x56,0x30,0x37,0x36,0x31,0x00,0x56,0x30,0x37,0x36, 0x32,0x00,0x56,0x30,0x37,0x36,0x33,0x00,0x56,0x30,0x37,0x36,0x34,0x00,0x56,0x30, 0x37,0x36,0x35,0x00,0x56,0x30,0x37,0x36,0x36,0x00,0x56,0x30,0x37,0x36,0x37,0x00, 0x56,0x30,0x37,0x36,0x38,0x00,0x56,0x30,0x37,0x36,0x39,0x00,0x56,0x30,0x37,0x37, 0x30,0x00,0x56,0x30,0x37,0x37,0x31,0x00,0x56,0x30,0x37,0x37,0x32,0x00,0x56,0x30, 0x37,0x37,0x33,0x00,0x56,0x30,0x37,0x37,0x34,0x00,0x56,0x30,0x37,0x37,0x35,0x00, 0x56,0x30,0x37,0x37,0x36,0x00,0x56,0x30,0x37,0x37,0x37,0x00,0x56,0x30,0x37,0x37, 0x38,0x00,0x56,0x30,0x37,0x37,0x39,0x00,0x56,0x30,0x37,0x38,0x30,0x00,0x56,0x30, 0x37,0x38,0x31,0x00,0x56,0x30,0x37,0x38,0x32,0x00,0x56,0x30,0x37,0x38,0x33,0x00, 0x56,0x30,0x37,0x38,0x34,0x00,0x56,0x30,0x37,0x38,0x35,0x00,0x56,0x30,0x37,0x38, 0x36,0x00,0x56,0x30,0x37,0x38,0x37,0x00,0x56,0x30,0x37,0x38,0x38,0x00,0x56,0x30, 0x37,0x38,0x39,0x00,0x56,0x30,0x37,0x39,0x30,0x00,0x56,0x30,0x37,0x39,0x31,0x00, 0x56,0x30,0x37,0x39,0x32,0x00,0x56,0x30,0x37,0x39,0x33,0x00,0x56,0x30,0x37,0x39, 0x34,0x00,0x56,0x30,0x37,0x39,0x35,0x00,0x56,0x30,0x37,0x39,0x36,0x00,0x56,0x30, 0x37,0x39,0x37,0x00,0x56,0x30,0x37,0x39,0x38,0x00,0x56,0x30,0x37,0x39,0x39,0x00, 0x56,0x30,0x38,0x30,0x30,0x00,0x56,0x30,0x38,0x30,0x31,0x00,0x56,0x30,0x38,0x30, 0x32,0x00,0x56,0x30,0x38,0x30,0x33,0x00,0x56,0x30,0x38,0x30,0x34,0x00,0x56,0x30, 0x38,0x30,0x35,0x00,0x56,0x30,0x38,0x30,0x36,0x00,0x56,0x30,0x38,0x30,0x37,0x00, 0x56,0x30,0x38,0x30,0x38,0x00,0x56,0x30,0x38,0x30,0x39,0x00,0x56,0x30,0x38,0x31, 0x30,0x00,0x56,0x30,0x38,0x31,0x31,0x00,0x56,0x30,0x38,0x31,0x32,0x00,0x56,0x30, 0x38,0x31,0x33,0x00,0x56,0x30,0x38,0x31,0x34,0x00,0x56,0x30,0x38,0x31,0x35,0x00, 0x56,0x30,0x38,0x31,0x36,0x00,0x56,0x30,0x38,0x31,0x37,0x00,0x56,0x30,0x38,0x31, 0x38,0x00,0x56,0x30,0x38,0x31,0x39,0x00,0x56,0x30,0x38,0x32,0x30,0x00,0x56,0x30, 0x38,0x32,0x31,0x00,0x56,0x30,0x38,0x32,0x32,0x00,0x56,0x30,0x38,0x32,0x33,0x00, 0x56,0x30,0x38,0x32,0x34,0x00,0x56,0x30,0x38,0x32,0x35,0x00,0x56,0x30,0x38,0x32, 0x36,0x00,0x56,0x30,0x38,0x32,0x37,0x00,0x56,0x30,0x38,0x32,0x38,0x00,0x56,0x30, 0x38,0x32,0x39,0x00,0x56,0x30,0x38,0x33,0x30,0x00,0x56,0x30,0x38,0x33,0x31,0x00, 0x56,0x30,0x38,0x33,0x32,0x00,0x56,0x30,0x38,0x33,0x33,0x00,0x56,0x30,0x38,0x33, 0x34,0x00,0x56,0x30,0x38,0x33,0x35,0x00,0x56,0x30,0x38,0x33,0x36,0x00,0x56,0x30, 0x38,0x33,0x37,0x00,0x56,0x30,0x38,0x33,0x38,0x00,0x56,0x30,0x38,0x33,0x39,0x00, 0x56,0x30,0x38,0x34,0x30,0x00,0x56,0x30,0x38,0x34,0x31,0x00,0x56,0x30,0x38,0x34, 0x32,0x00,0x56,0x30,0x38,0x34,0x33,0x00,0x56,0x30,0x38,0x34,0x34,0x00,0x56,0x30, 0x38,0x34,0x35,0x00,0x56,0x30,0x38,0x34,0x36,0x00,0x56,0x30,0x38,0x34,0x37,0x00, 0x56,0x30,0x38,0x34,0x38,0x00,0x56,0x30,0x38,0x34,0x39,0x00,0x56,0x30,0x38,0x35, 0x30,0x00,0x56,0x30,0x38,0x35,0x31,0x00,0x56,0x30,0x38,0x35,0x32,0x00,0x56,0x30, 0x38,0x35,0x33,0x00,0x56,0x30,0x38,0x35,0x34,0x00,0x56,0x30,0x38,0x35,0x35,0x00, 0x56,0x30,0x38,0x35,0x36,0x00,0x56,0x30,0x38,0x35,0x37,0x00,0x56,0x30,0x38,0x35, 0x38,0x00,0x56,0x30,0x38,0x35,0x39,0x00,0x56,0x30,0x38,0x36,0x30,0x00,0x56,0x30, 0x38,0x36,0x31,0x00,0x56,0x30,0x38,0x36,0x32,0x00,0x56,0x30,0x38,0x36,0x33,0x00, 0x56,0x30,0x38,0x36,0x34,0x00,0x56,0x30,0x38,0x36,0x35,0x00,0x56,0x30,0x38,0x36, 0x36,0x00,0x56,0x30,0x38,0x36,0x37,0x00,0x56,0x30,0x38,0x36,0x38,0x00,0x56,0x30, 0x38,0x36,0x39,0x00,0x56,0x30,0x38,0x37,0x30,0x00,0x56,0x30,0x38,0x37,0x31,0x00, 0x56,0x30,0x38,0x37,0x32,0x00,0x56,0x30,0x38,0x37,0x33,0x00,0x56,0x30,0x38,0x37, 0x34,0x00,0x56,0x30,0x38,0x37,0x35,0x00,0x56,0x30,0x38,0x37,0x36,0x00,0x56,0x30, 0x38,0x37,0x37,0x00,0x56,0x30,0x38,0x37,0x38,0x00,0x56,0x30,0x38,0x37,0x39,0x00, 0x56,0x30,0x38,0x38,0x30,0x00,0x56,0x30,0x38,0x38,0x31,0x00,0x56,0x30,0x38,0x38, 0x32,0x00,0x56,0x30,0x38,0x38,0x33,0x00,0x56,0x30,0x38,0x38,0x34,0x00,0x56,0x30, 0x38,0x38,0x35,0x00,0x56,0x30,0x38,0x38,0x36,0x00,0x56,0x30,0x38,0x38,0x37,0x00, 0x56,0x30,0x38,0x38,0x38,0x00,0x56,0x30,0x38,0x38,0x39,0x00,0x56,0x30,0x38,0x39, 0x30,0x00,0x56,0x30,0x38,0x39,0x31,0x00,0x56,0x30,0x38,0x39,0x32,0x00,0x56,0x30, 0x38,0x39,0x33,0x00,0x56,0x30,0x38,0x39,0x34,0x00,0x56,0x30,0x38,0x39,0x35,0x00, 0x56,0x30,0x38,0x39,0x36,0x00,0x56,0x30,0x38,0x39,0x37,0x00,0x56,0x30,0x38,0x39, 0x38,0x00,0x56,0x30,0x38,0x39,0x39,0x00,0x56,0x30,0x39,0x30,0x30,0x00,0x56,0x30, 0x39,0x30,0x31,0x00,0x56,0x30,0x39,0x30,0x32,0x00,0x56,0x30,0x39,0x30,0x33,0x00, 0x56,0x30,0x39,0x30,0x34,0x00,0x56,0x30,0x39,0x30,0x35,0x00,0x56,0x30,0x39,0x30, 0x36,0x00,0x56,0x30,0x39,0x30,0x37,0x00,0x56,0x30,0x39,0x30,0x38,0x00,0x56,0x30, 0x39,0x30,0x39,0x00,0x56,0x30,0x39,0x31,0x30,0x00,0x56,0x30,0x39,0x31,0x31,0x00, 0x56,0x30,0x39,0x31,0x32,0x00,0x56,0x30,0x39,0x31,0x33,0x00,0x56,0x30,0x39,0x31, 0x34,0x00,0x56,0x30,0x39,0x31,0x35,0x00,0x56,0x30,0x39,0x31,0x36,0x00,0x56,0x30, 0x39,0x31,0x37,0x00,0x56,0x30,0x39,0x31,0x38,0x00,0x56,0x30,0x39,0x31,0x39,0x00, 0x56,0x30,0x39,0x32,0x30,0x00,0x56,0x30,0x39,0x32,0x31,0x00,0x56,0x30,0x39,0x32, 0x32,0x00,0x56,0x30,0x39,0x32,0x33,0x00,0x56,0x30,0x39,0x32,0x34,0x00,0x56,0x30, 0x39,0x32,0x35,0x00,0x56,0x30,0x39,0x32,0x36,0x00,0x56,0x30,0x39,0x32,0x37,0x00, 0x56,0x30,0x39,0x32,0x38,0x00,0x56,0x30,0x39,0x32,0x39,0x00,0x56,0x30,0x39,0x33, 0x30,0x00,0x56,0x30,0x39,0x33,0x31,0x00,0x56,0x30,0x39,0x33,0x32,0x00,0x56,0x30, 0x39,0x33,0x33,0x00,0x56,0x30,0x39,0x33,0x34,0x00,0x56,0x30,0x39,0x33,0x35,0x00, 0x56,0x30,0x39,0x33,0x36,0x00,0x56,0x30,0x39,0x33,0x37,0x00,0x56,0x30,0x39,0x33, 0x38,0x00,0x56,0x30,0x39,0x33,0x39,0x00,0x56,0x30,0x39,0x34,0x30,0x00,0x56,0x30, 0x39,0x34,0x31,0x00,0x56,0x30,0x39,0x34,0x32,0x00,0x56,0x30,0x39,0x34,0x33,0x00, 0x56,0x30,0x39,0x34,0x34,0x00,0x56,0x30,0x39,0x34,0x35,0x00,0x56,0x30,0x39,0x34, 0x36,0x00,0x56,0x30,0x39,0x34,0x37,0x00,0x56,0x30,0x39,0x34,0x38,0x00,0x56,0x30, 0x39,0x34,0x39,0x00,0x56,0x30,0x39,0x35,0x30,0x00,0x56,0x30,0x39,0x35,0x31,0x00, 0x56,0x30,0x39,0x35,0x32,0x00,0x56,0x30,0x39,0x35,0x33,0x00,0x56,0x30,0x39,0x35, 0x34,0x00,0x56,0x30,0x39,0x35,0x35,0x00,0x56,0x30,0x39,0x35,0x36,0x00,0x56,0x30, 0x39,0x35,0x37,0x00,0x56,0x30,0x39,0x35,0x38,0x00,0x56,0x30,0x39,0x35,0x39,0x00, 0x56,0x30,0x39,0x36,0x30,0x00,0x56,0x30,0x39,0x36,0x31,0x00,0x56,0x30,0x39,0x36, 0x32,0x00,0x56,0x30,0x39,0x36,0x33,0x00,0x56,0x30,0x39,0x36,0x34,0x00,0x56,0x30, 0x39,0x36,0x35,0x00,0x56,0x30,0x39,0x36,0x36,0x00,0x56,0x30,0x39,0x36,0x37,0x00, 0x56,0x30,0x39,0x36,0x38,0x00,0x56,0x30,0x39,0x36,0x39,0x00,0x56,0x30,0x39,0x37, 0x30,0x00,0x56,0x30,0x39,0x37,0x31,0x00,0x56,0x30,0x39,0x37,0x32,0x00,0x56,0x30, 0x39,0x37,0x33,0x00,0x56,0x30,0x39,0x37,0x34,0x00,0x56,0x30,0x39,0x37,0x35,0x00, 0x56,0x30,0x39,0x37,0x36,0x00,0x56,0x30,0x39,0x37,0x37,0x00,0x56,0x30,0x39,0x37, 0x38,0x00,0x56,0x30,0x39,0x37,0x39,0x00,0x56,0x30,0x39,0x38,0x30,0x00,0x56,0x30, 0x39,0x38,0x31,0x00,0x56,0x30,0x39,0x38,0x32,0x00,0x56,0x30,0x39,0x38,0x33,0x00, 0x56,0x30,0x39,0x38,0x34,0x00,0x56,0x30,0x39,0x38,0x35,0x00,0x56,0x30,0x39,0x38, 0x36,0x00,0x56,0x30,0x39,0x38,0x37,0x00,0x56,0x30,0x39,0x38,0x38,0x00,0x56,0x30, 0x39,0x38,0x39,0x00,0x56,0x30,0x39,0x39,0x30,0x00,0x56,0x30,0x39,0x39,0x31,0x00, 0x56,0x30,0x39,0x39,0x32,0x00,0x56,0x30,0x39,0x39,0x33,0x00,0x56,0x30,0x39,0x39, 0x34,0x00,0x56,0x30,0x39,0x39,0x35,0x00,0x56,0x30,0x39,0x39,0x36,0x00,0x56,0x30, 0x39,0x39,0x37,0x00,0x56,0x30,0x39,0x39,0x38,0x00,0x56,0x30,0x39,0x39,0x39,0x00, 0x56,0x31,0x30,0x30,0x30,0x00,0x56,0x31,0x30,0x30,0x31,0x00,0x56,0x31,0x30,0x30, 0x32,0x00,0x56,0x31,0x30,0x30,0x33,0x00,0x56,0x31,0x30,0x30,0x34,0x00,0x56,0x31, 0x30,0x30,0x35,0x00,0x56,0x31,0x30,0x30,0x36,0x00,0x56,0x31,0x30,0x30,0x37,0x00, 0x56,0x31,0x30,0x30,0x38,0x00,0x56,0x31,0x30,0x30,0x39,0x00,0x56,0x31,0x30,0x31, 0x30,0x00,0x56,0x31,0x30,0x31,0x31,0x00,0x56,0x31,0x30,0x31,0x32,0x00,0x56,0x31, 0x30,0x31,0x33,0x00,0x56,0x31,0x30,0x31,0x34,0x00,0x56,0x31,0x30,0x31,0x35,0x00, 0x56,0x31,0x30,0x31,0x36,0x00,0x56,0x31,0x30,0x31,0x37,0x00,0x56,0x31,0x30,0x31, 0x38,0x00,0x56,0x31,0x30,0x31,0x39,0x00,0x56,0x31,0x30,0x32,0x30,0x00,0x56,0x31, 0x30,0x32,0x31,0x00,0x56,0x31,0x30,0x32,0x32,0x00,0x56,0x31,0x30,0x32,0x33,0x00, 0x56,0x31,0x30,0x32,0x34,0x00,0x56,0x31,0x30,0x32,0x35,0x00,0x56,0x31,0x30,0x32, 0x36,0x00,0x56,0x31,0x30,0x32,0x37,0x00,0x56,0x31,0x30,0x32,0x38,0x00,0x56,0x31, 0x30,0x32,0x39,0x00,0x56,0x31,0x30,0x33,0x30,0x00,0x56,0x31,0x30,0x33,0x31,0x00, 0x56,0x31,0x30,0x33,0x32,0x00,0x56,0x31,0x30,0x33,0x33,0x00,0x56,0x31,0x30,0x33, 0x34,0x00,0x56,0x31,0x30,0x33,0x35,0x00,0x56,0x31,0x30,0x33,0x36,0x00,0x56,0x31, 0x30,0x33,0x37,0x00,0x56,0x31,0x30,0x33,0x38,0x00,0x56,0x31,0x30,0x33,0x39,0x00, 0x56,0x31,0x30,0x34,0x30,0x00,0x56,0x31,0x30,0x34,0x31,0x00,0x56,0x31,0x30,0x34, 0x32,0x00,0x56,0x31,0x30,0x34,0x33,0x00,0x56,0x31,0x30,0x34,0x34,0x00,0x56,0x31, 0x30,0x34,0x35,0x00,0x56,0x31,0x30,0x34,0x36,0x00,0x56,0x31,0x30,0x34,0x37,0x00, 0x56,0x31,0x30,0x34,0x38,0x00,0x56,0x31,0x30,0x34,0x39,0x00,0x56,0x31,0x30,0x35, 0x30,0x00,0x56,0x31,0x30,0x35,0x31,0x00,0x56,0x31,0x30,0x35,0x32,0x00,0x56,0x31, 0x30,0x35,0x33,0x00,0x56,0x31,0x30,0x35,0x34,0x00,0x56,0x31,0x30,0x35,0x35,0x00, 0x56,0x31,0x30,0x35,0x36,0x00,0x56,0x31,0x30,0x35,0x37,0x00,0x56,0x31,0x30,0x35, 0x38,0x00,0x56,0x31,0x30,0x35,0x39,0x00,0x56,0x31,0x30,0x36,0x30,0x00,0x56,0x31, 0x30,0x36,0x31,0x00,0x56,0x31,0x30,0x36,0x32,0x00,0x56,0x31,0x30,0x36,0x33,0x00, 0x56,0x31,0x30,0x36,0x34,0x00,0x56,0x31,0x30,0x36,0x35,0x00,0x56,0x31,0x30,0x36, 0x36,0x00,0x56,0x31,0x30,0x36,0x37,0x00,0x56,0x31,0x30,0x36,0x38,0x00,0x56,0x31, 0x30,0x36,0x39,0x00,0x56,0x31,0x30,0x37,0x30,0x00,0x56,0x31,0x30,0x37,0x31,0x00, 0x56,0x31,0x30,0x37,0x32,0x00,0x56,0x31,0x30,0x37,0x33,0x00,0x56,0x31,0x30,0x37, 0x34,0x00,0x56,0x31,0x30,0x37,0x35,0x00,0x56,0x31,0x30,0x37,0x36,0x00,0x56,0x31, 0x30,0x37,0x37,0x00,0x56,0x31,0x30,0x37,0x38,0x00,0x56,0x31,0x30,0x37,0x39,0x00, 0x56,0x31,0x30,0x38,0x30,0x00,0x56,0x31,0x30,0x38,0x31,0x00,0x56,0x31,0x30,0x38, 0x32,0x00,0x56,0x31,0x30,0x38,0x33,0x00,0x56,0x31,0x30,0x38,0x34,0x00,0x56,0x31, 0x30,0x38,0x35,0x00,0x56,0x31,0x30,0x38,0x36,0x00,0x56,0x31,0x30,0x38,0x37,0x00, 0x56,0x31,0x30,0x38,0x38,0x00,0x56,0x31,0x30,0x38,0x39,0x00,0x56,0x31,0x30,0x39, 0x30,0x00,0x56,0x31,0x30,0x39,0x31,0x00,0x56,0x31,0x30,0x39,0x32,0x00,0x56,0x31, 0x30,0x39,0x33,0x00,0x56,0x31,0x30,0x39,0x34,0x00,0x56,0x31,0x30,0x39,0x35,0x00, 0x56,0x31,0x30,0x39,0x36,0x00,0x56,0x31,0x30,0x39,0x37,0x00,0x56,0x31,0x30,0x39, 0x38,0x00,0x56,0x31,0x30,0x39,0x39,0x00,0x56,0x31,0x31,0x30,0x30,0x00,0x56,0x31, 0x31,0x30,0x31,0x00,0x56,0x31,0x31,0x30,0x32,0x00,0x56,0x31,0x31,0x30,0x33,0x00, 0x56,0x31,0x31,0x30,0x34,0x00,0x56,0x31,0x31,0x30,0x35,0x00,0x56,0x31,0x31,0x30, 0x36,0x00,0x56,0x31,0x31,0x30,0x37,0x00,0x56,0x31,0x31,0x30,0x38,0x00,0x56,0x31, 0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x31,0x00, 0x56,0x31,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x31, 0x34,0x00,0x56,0x31,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x31,0x36,0x00,0x56,0x31, 0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x31,0x39,0x00, 0x56,0x31,0x31,0x32,0x30,0x00,0x56,0x31,0x31,0x32,0x31,0x00,0x56,0x31,0x31,0x32, 0x32,0x00,0x56,0x31,0x31,0x32,0x33,0x00,0x56,0x31,0x31,0x32,0x34,0x00,0x56,0x31, 0x31,0x32,0x35,0x00,0x56,0x31,0x31,0x32,0x36,0x00,0x56,0x31,0x31,0x32,0x37,0x00, 0x56,0x31,0x31,0x32,0x38,0x00,0x56,0x31,0x31,0x32,0x39,0x00,0x56,0x31,0x31,0x33, 0x30,0x00,0x56,0x31,0x31,0x33,0x31,0x00,0x56,0x31,0x31,0x33,0x32,0x00,0x56,0x31, 0x31,0x33,0x33,0x00,0x56,0x31,0x31,0x33,0x34,0x00,0x56,0x31,0x31,0x33,0x35,0x00, 0x56,0x31,0x31,0x33,0x36,0x00,0x56,0x31,0x31,0x33,0x37,0x00,0x56,0x31,0x31,0x33, 0x38,0x00,0x56,0x31,0x31,0x33,0x39,0x00,0x56,0x31,0x31,0x34,0x30,0x00,0x56,0x31, 0x31,0x34,0x31,0x00,0x56,0x31,0x31,0x34,0x32,0x00,0x56,0x31,0x31,0x34,0x33,0x00, 0x56,0x31,0x31,0x34,0x34,0x00,0x56,0x31,0x31,0x34,0x35,0x00,0x56,0x31,0x31,0x34, 0x36,0x00,0x56,0x31,0x31,0x34,0x37,0x00,0x56,0x31,0x31,0x34,0x38,0x00,0x56,0x31, 0x31,0x34,0x39,0x00,0x56,0x31,0x31,0x35,0x30,0x00,0x56,0x31,0x31,0x35,0x31,0x00, 0x56,0x31,0x31,0x35,0x32,0x00,0x56,0x31,0x31,0x35,0x33,0x00,0x56,0x31,0x31,0x35, 0x34,0x00,0x56,0x31,0x31,0x35,0x35,0x00,0x56,0x31,0x31,0x35,0x36,0x00,0x56,0x31, 0x31,0x35,0x37,0x00,0x56,0x31,0x31,0x35,0x38,0x00,0x56,0x31,0x31,0x35,0x39,0x00, 0x56,0x31,0x31,0x36,0x30,0x00,0x56,0x31,0x31,0x36,0x31,0x00,0x56,0x31,0x31,0x36, 0x32,0x00,0x56,0x31,0x31,0x36,0x33,0x00,0x56,0x31,0x31,0x36,0x34,0x00,0x56,0x31, 0x31,0x36,0x35,0x00,0x56,0x31,0x31,0x36,0x36,0x00,0x56,0x31,0x31,0x36,0x37,0x00, 0x56,0x31,0x31,0x36,0x38,0x00,0x56,0x31,0x31,0x36,0x39,0x00,0x56,0x31,0x31,0x37, 0x30,0x00,0x56,0x31,0x31,0x37,0x31,0x00,0x56,0x31,0x31,0x37,0x32,0x00,0x56,0x31, 0x31,0x37,0x33,0x00,0x56,0x31,0x31,0x37,0x34,0x00,0x56,0x31,0x31,0x37,0x35,0x00, 0x56,0x31,0x31,0x37,0x36,0x00,0x56,0x31,0x31,0x37,0x37,0x00,0x56,0x31,0x31,0x37, 0x38,0x00,0x56,0x31,0x31,0x37,0x39,0x00,0x56,0x31,0x31,0x38,0x30,0x00,0x56,0x31, 0x31,0x38,0x31,0x00,0x56,0x31,0x31,0x38,0x32,0x00,0x56,0x31,0x31,0x38,0x33,0x00, 0x56,0x31,0x31,0x38,0x34,0x00,0x56,0x31,0x31,0x38,0x35,0x00,0x56,0x31,0x31,0x38, 0x36,0x00,0x56,0x31,0x31,0x38,0x37,0x00,0x56,0x31,0x31,0x38,0x38,0x00,0x56,0x31, 0x31,0x38,0x39,0x00,0x56,0x31,0x31,0x39,0x30,0x00,0x56,0x31,0x31,0x39,0x31,0x00, 0x56,0x31,0x31,0x39,0x32,0x00,0x56,0x31,0x31,0x39,0x33,0x00,0x56,0x31,0x31,0x39, 0x34,0x00,0x56,0x31,0x31,0x39,0x35,0x00,0x56,0x31,0x31,0x39,0x36,0x00,0x56,0x31, 0x31,0x39,0x37,0x00,0x56,0x31,0x31,0x39,0x38,0x00,0x56,0x31,0x31,0x39,0x39,0x00, 0x56,0x31,0x32,0x30,0x30,0x00,0x56,0x31,0x32,0x30,0x31,0x00,0x56,0x31,0x32,0x30, 0x32,0x00,0x56,0x31,0x32,0x30,0x33,0x00,0x56,0x31,0x32,0x30,0x34,0x00,0x56,0x31, 0x32,0x30,0x35,0x00,0x56,0x31,0x32,0x30,0x36,0x00,0x56,0x31,0x32,0x30,0x37,0x00, 0x56,0x31,0x32,0x30,0x38,0x00,0x56,0x31,0x32,0x30,0x39,0x00,0x56,0x31,0x32,0x31, 0x30,0x00,0x56,0x31,0x32,0x31,0x31,0x00,0x56,0x31,0x32,0x31,0x32,0x00,0x56,0x31, 0x32,0x31,0x33,0x00,0x56,0x31,0x32,0x31,0x34,0x00,0x56,0x31,0x32,0x31,0x35,0x00, 0x56,0x31,0x32,0x31,0x36,0x00,0x56,0x31,0x32,0x31,0x37,0x00,0x56,0x31,0x32,0x31, 0x38,0x00,0x56,0x31,0x32,0x31,0x39,0x00,0x56,0x31,0x32,0x32,0x30,0x00,0x56,0x31, 0x32,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x32,0x00,0x56,0x31,0x32,0x32,0x33,0x00, 0x56,0x31,0x32,0x32,0x34,0x00,0x56,0x31,0x32,0x32,0x35,0x00,0x56,0x31,0x32,0x32, 0x36,0x00,0x56,0x31,0x32,0x32,0x37,0x00,0x56,0x31,0x32,0x32,0x38,0x00,0x56,0x31, 0x32,0x32,0x39,0x00,0x56,0x31,0x32,0x33,0x30,0x00,0x56,0x31,0x32,0x33,0x31,0x00, 0x56,0x31,0x32,0x33,0x32,0x00,0x56,0x31,0x32,0x33,0x33,0x00,0x56,0x31,0x32,0x33, 0x34,0x00,0x56,0x31,0x32,0x33,0x35,0x00,0x56,0x31,0x32,0x33,0x36,0x00,0x56,0x31, 0x32,0x33,0x37,0x00,0x56,0x31,0x32,0x33,0x38,0x00,0x56,0x31,0x32,0x33,0x39,0x00, 0x56,0x31,0x32,0x34,0x30,0x00,0x56,0x31,0x32,0x34,0x31,0x00,0x56,0x31,0x32,0x34, 0x32,0x00,0x56,0x31,0x32,0x34,0x33,0x00,0x56,0x31,0x32,0x34,0x34,0x00,0x56,0x31, 0x32,0x34,0x35,0x00,0x56,0x31,0x32,0x34,0x36,0x00,0x50,0x30,0x31,0x00,0x50,0x30, 0x32,0x00,0x50,0x30,0x33,0x00,0x50,0x30,0x34,0x00,0x50,0x30,0x35,0x00,0x50,0x30, 0x36,0x00,0x50,0x30,0x37,0x00,0x50,0x30,0x38,0x00,0x50,0x30,0x39,0x00,0x50,0x31, 0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31, 0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31, 0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x50,0x32, 0x32,0x00,0x50,0x32,0x33,0x00,0x50,0x32,0x34,0x00,0x50,0x32,0x35,0x00,0x50,0x32, 0x36,0x00,0x50,0x32,0x37,0x00,0x50,0x32,0x38,0x00,0x50,0x32,0x39,0x00,0x50,0x33, 0x30,0x00,0x50,0x33,0x31,0x00,0x50,0x33,0x32,0x00,0x50,0x33,0x33,0x00,0x50,0x33, 0x34,0x00,0x50,0x33,0x35,0x00,0x50,0x33,0x36,0x00,0x50,0x33,0x37,0x00,0x50,0x33, 0x38,0x00,0x50,0x33,0x39,0x00,0x50,0x34,0x30,0x00,0x50,0x34,0x31,0x00,0x50,0x34, 0x32,0x00,0x50,0x34,0x33,0x00,0x50,0x34,0x34,0x00,0x50,0x34,0x35,0x00,0x50,0x34, 0x36,0x00,0x50,0x34,0x37,0x00,0x50,0x34,0x38,0x00,0x50,0x34,0x39,0x00,0x50,0x35, 0x30,0x00,0x50,0x35,0x31,0x00,0x50,0x35,0x32,0x00,0x50,0x35,0x33,0x00,0x50,0x35, 0x34,0x00,0x50,0x35,0x35,0x00,0x50,0x35,0x36,0x00,0x50,0x35,0x37,0x00,0x50,0x35, 0x38,0x00,0x50,0x35,0x39,0x00,0x50,0x36,0x30,0x00,0x50,0x36,0x31,0x00,0x50,0x36, 0x32,0x00,0x50,0x36,0x33,0x00,0x50,0x36,0x34,0x00,0x50,0x36,0x35,0x00,0x50,0x36, 0x36,0x00,0x50,0x36,0x37,0x00,0x50,0x36,0x38,0x00,0x50,0x36,0x39,0x00,0x50,0x37, 0x30,0x00,0x50,0x37,0x31,0x00,0x50,0x37,0x32,0x00,0x50,0x37,0x33,0x00,0x50,0x37, 0x34,0x00,0x50,0x37,0x35,0x00,0x50,0x37,0x36,0x00,0x50,0x37,0x37,0x00,0x50,0x37, 0x38,0x00,0x50,0x37,0x39,0x00,0x50,0x38,0x30,0x00,0x50,0x38,0x31,0x00,0x50,0x38, 0x32,0x00,0x50,0x38,0x33,0x00,0x50,0x38,0x34,0x00,0x50,0x38,0x35,0x00,0x50,0x38, 0x36,0x00,0x50,0x38,0x37,0x00,0x50,0x38,0x38,0x00,0x50,0x38,0x39,0x00,0x50,0x39, 0x30,0x00,0x50,0x39,0x31,0x00,0x50,0x39,0x32,0x00,0x50,0x39,0x33,0x00,0x50,0x39, 0x34,0x00,0x50,0x39,0x35,0x00,0x50,0x39,0x36,0x00,0x50,0x39,0x37,0x00,0x50,0x39, 0x38,0x00,0x50,0x39,0x39,0x00,0x50,0x31,0x30,0x30,0x00,0x50,0x31,0x30,0x31,0x00, 0x50,0x31,0x30,0x32,0x00,0x50,0x31,0x30,0x33,0x00,0x50,0x31,0x30,0x34,0x00,0x45, 0x6e,0x63,0x4d,0x42,0x5f,0x42,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31,0x00,0x42,0x42, 0x5f,0x31,0x5f,0x32,0x00,0x42,0x42,0x5f,0x32,0x5f,0x33,0x00,0x5f,0x5a,0x32,0x34, 0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69, 0x6d,0x70,0x6c,0x5f,0x75,0x72,0x65,0x6d,0x6a,0x6a,0x5f,0x42,0x42,0x5f,0x33,0x5f, 0x34,0x00,0x42,0x42,0x5f,0x34,0x5f,0x35,0x00,0x42,0x42,0x5f,0x35,0x5f,0x36,0x00, 0x42,0x42,0x5f,0x36,0x5f,0x37,0x00,0x42,0x42,0x5f,0x37,0x5f,0x38,0x00,0x42,0x42, 0x5f,0x38,0x5f,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x31,0x30,0x00,0x42,0x42,0x5f, 0x31,0x30,0x5f,0x31,0x31,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x31,0x32,0x00,0x42, 0x42,0x5f,0x31,0x32,0x5f,0x31,0x33,0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x31,0x34, 0x00,0x42,0x42,0x5f,0x31,0x34,0x5f,0x31,0x35,0x00,0x42,0x42,0x5f,0x31,0x35,0x5f, 0x31,0x36,0x00,0x42,0x42,0x5f,0x31,0x36,0x5f,0x31,0x37,0x00,0x42,0x42,0x5f,0x31, 0x37,0x5f,0x31,0x38,0x00,0x42,0x42,0x5f,0x31,0x38,0x5f,0x31,0x39,0x00,0x42,0x42, 0x5f,0x31,0x39,0x5f,0x32,0x30,0x00,0x42,0x42,0x5f,0x32,0x30,0x5f,0x32,0x31,0x00, 0x42,0x42,0x5f,0x32,0x31,0x5f,0x32,0x32,0x00,0x42,0x42,0x5f,0x32,0x32,0x5f,0x32, 0x33,0x00,0x42,0x42,0x5f,0x32,0x33,0x5f,0x32,0x34,0x00,0x42,0x42,0x5f,0x32,0x34, 0x5f,0x32,0x35,0x00,0x42,0x42,0x5f,0x32,0x35,0x5f,0x32,0x36,0x00,0x42,0x42,0x5f, 0x32,0x36,0x5f,0x32,0x37,0x00,0x42,0x42,0x5f,0x32,0x37,0x5f,0x32,0x38,0x00,0x42, 0x42,0x5f,0x32,0x38,0x5f,0x32,0x39,0x00,0x42,0x42,0x5f,0x32,0x39,0x5f,0x33,0x30, 0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e, 0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x73,0x73,0x5f, 0x42,0x42,0x5f,0x33,0x30,0x5f,0x33,0x31,0x00,0x42,0x42,0x5f,0x33,0x31,0x5f,0x33, 0x32,0x00,0x42,0x42,0x5f,0x33,0x32,0x5f,0x33,0x33,0x00,0x42,0x42,0x5f,0x33,0x33, 0x5f,0x33,0x34,0x00,0x42,0x42,0x5f,0x33,0x34,0x5f,0x33,0x35,0x00,0x42,0x42,0x5f, 0x33,0x35,0x5f,0x33,0x36,0x00,0x42,0x42,0x5f,0x33,0x36,0x5f,0x33,0x37,0x00,0x42, 0x42,0x5f,0x33,0x37,0x5f,0x33,0x38,0x00,0x54,0x30,0x30,0x36,0x00,0x54,0x30,0x30, 0x37,0x00,0x54,0x30,0x30,0x38,0x00,0x54,0x30,0x30,0x39,0x00,0x54,0x30,0x31,0x30, 0x00,0x54,0x30,0x31,0x31,0x00,0x54,0x30,0x31,0x32,0x00,0x41,0x73,0x6d,0x4e,0x61, 0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72,0x00,0x54,0x61,0x72, 0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x1a,0x00,0x00,0x00, 0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x51, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00, 0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xc4,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc8,0x00,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xca,0x00, 0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xcc,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd0,0x00,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd2,0x00, 0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xd4,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xd6,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd8,0x00,0x00,0x00,0x00,0xd9, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xda,0x00, 0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xdc,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0xe1, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe2,0x00, 0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x00,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x54,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7e,0x01,0x00,0x00,0x00,0x7f,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x00, 0x00,0x81,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x82,0x01,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x84,0x01,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x86,0x01,0x00,0x00,0x00,0x87,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x88,0x01,0x00,0x00, 0x00,0x89,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x8a,0x01,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x8d,0x01,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x01,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x54,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x01,0x00,0x00,0x51,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01, 0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00, 0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00, 0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x54,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x01,0x00,0x00,0x54,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02, 0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00, 0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00, 0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x54, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x54,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x54,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x54,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02, 0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x51,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x02,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x04,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x02,0x00,0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x02, 0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x02,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x04,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x02,0x00,0x00,0x23,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x02,0x00,0x00,0x54,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x02, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x02,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x54, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x51,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x24,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x02,0x00,0x00,0x24,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02,0x00,0x00, 0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x14,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x14,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x02,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x02,0x00, 0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00, 0x14,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x04, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x02, 0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x04,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x02,0x00,0x00,0x24,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x02,0x00,0x00,0x21,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x02,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x02,0x00, 0x00,0x23,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02,0x00,0x00, 0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x52,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x23,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x02, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x02,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x23, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x02,0x00,0x00,0x25,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x02,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x02, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x02,0x00, 0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00, 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x15,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x02, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x02,0x00, 0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x51,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x02, 0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x02,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00, 0x55,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x54, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x02,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x02,0x00,0x00,0x15,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x02,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x02,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x02, 0x00,0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x02,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00, 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x04, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x13,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x15,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x02,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x02,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x02,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x02,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x02, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x02,0x00, 0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00, 0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00,0x00,0x14, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00,0x21,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x13,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x03,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x03,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x03,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x03,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03, 0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x03,0x00, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x03,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x03,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x03,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x03,0x00,0x00,0x54,0x80,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x03,0x00,0x00,0x55,0x20,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x03, 0x00,0x00,0x12,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x20,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x03,0x00,0x00, 0x20,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x03,0x00,0x00,0x20, 0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x00,0x55,0x00, 0x01,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x03,0x00,0x00,0x51,0x08,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x03,0x00,0x00,0x51,0x08,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x03,0x00,0x00,0x51,0x08,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x51,0x08,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x51,0x08,0x00,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x51,0x08,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x51,0x08,0x00,0x39,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x03,0x00,0x00,0x51,0x08,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x03,0x00,0x00,0x51,0x08,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x03,0x00,0x00,0x51,0x08,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x03,0x00,0x00,0x51,0x08,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03, 0x00,0x00,0x51,0x08,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x03,0x00, 0x00,0x51,0x08,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x03,0x00,0x00, 0x51,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x51, 0x08,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x03,0x00,0x00,0x51,0x08, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x20,0x01,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x55,0x00,0x01,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x03,0x00,0x00,0x20,0x01,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x55,0x00,0x01,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0x51,0x08,0x00,0x43,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x51,0x08,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x51,0x08,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x03,0x00,0x00,0x51,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x03,0x00,0x00,0x51,0x08,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x03,0x00,0x00,0x51,0x08,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x03,0x00,0x00,0x51,0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x03, 0x00,0x00,0x51,0x08,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x03,0x00, 0x00,0x51,0x08,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03,0x00,0x00, 0x51,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x51, 0x08,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x51,0x08, 0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x51,0x08,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x51,0x08,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x51,0x08,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x03,0x00,0x00,0x51,0x08,0x00,0x52,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x03,0x00,0x00,0x55,0x00,0x01,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x53,0x20,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x53,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x03,0x00,0x00,0x53,0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x03,0x00,0x00,0x53,0x20,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x03,0x00,0x00,0x53,0x20,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x03,0x00,0x00,0x53,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x03, 0x00,0x00,0x53,0x20,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x03,0x00, 0x00,0x53,0x20,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x03,0x00,0x00, 0x52,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x52, 0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x52,0x20, 0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x52,0x20,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x52,0x20,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x52,0x20,0x00,0x78,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x52,0x20,0x00,0x79,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x52,0x20,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x00,0x20,0x01,0x00,0x7b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x03,0x00,0x00,0x55,0x00,0x01,0x7c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x03,0x00,0x00,0x51,0x08,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x03,0x00,0x00,0x51,0x08,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x03,0x00,0x00,0x51,0x08,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x03,0x00,0x00,0x51,0x08,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x03, 0x00,0x00,0x51,0x08,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x03,0x00, 0x00,0x51,0x08,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x03,0x00,0x00, 0x51,0x08,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x51, 0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x51,0x08, 0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x03,0x00,0x00,0x51,0x08,0x00, 0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x51,0x08,0x00,0x8b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x51,0x08,0x00,0x8c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x51,0x08,0x00,0x8d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x51,0x08,0x00,0x8e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x03,0x00,0x00,0x51,0x08,0x00,0x8f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x51,0x08,0x00,0x90,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x03,0x00,0x00,0x20,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x03,0x00,0x00,0x55,0x00,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x03,0x00,0x00,0x55,0x00,0x01,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x03,0x00,0x00,0x51,0x08,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x03, 0x00,0x00,0x51,0x08,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x03,0x00, 0x00,0x51,0x08,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x03,0x00,0x00, 0x51,0x08,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x51, 0x08,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x51,0x08, 0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x03,0x00,0x00,0x51,0x08,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x03,0x00,0x00,0x51,0x08,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x51,0x08,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x51,0x08,0x00,0x9a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x51,0x08,0x00,0x9b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x03,0x00,0x00,0x51,0x08,0x00,0x9c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x51,0x08,0x00,0x9d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x03,0x00,0x00,0x51,0x08,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x03,0x00,0x00,0x51,0x08,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x03,0x00,0x00,0x51,0x08,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x03,0x00,0x00,0x55,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x03, 0x00,0x00,0x53,0x20,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x03,0x00, 0x00,0x53,0x20,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x03,0x00,0x00, 0x53,0x20,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x53, 0x20,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x03,0x00,0x00,0x53,0x20, 0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x53,0x20,0x00, 0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x53,0x20,0x00,0xc7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x53,0x20,0x00,0xc8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x52,0x20,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x03,0x00,0x00,0x52,0x20,0x00,0xc2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x52,0x20,0x00,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x52,0x20,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x03,0x00,0x00,0x52,0x20,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x03,0x00,0x00,0x52,0x20,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x03,0x00,0x00,0x52,0x20,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x03,0x00,0x00,0x52,0x20,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x03, 0x00,0x00,0x20,0x01,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x03,0x00, 0x00,0x55,0x00,0x01,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x03,0x00,0x00, 0x51,0x08,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x03,0x00,0x00,0x51, 0x08,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x51,0x08, 0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x51,0x08,0x00, 0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x51,0x08,0x00,0xe3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x51,0x08,0x00,0xe4,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x03,0x00,0x00,0x51,0x08,0x00,0xe5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x51,0x08,0x00,0xe6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x51,0x08,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x03,0x00,0x00,0x51,0x08,0x00,0xe8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x03,0x00,0x00,0x51,0x08,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x03,0x00,0x00,0x51,0x08,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x03,0x00,0x00,0x51,0x08,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x03,0x00,0x00,0x51,0x08,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x03, 0x00,0x00,0x51,0x08,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x03,0x00, 0x00,0x51,0x08,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x03,0x00,0x00, 0x55,0x00,0x01,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x03,0x00,0x00,0x20, 0x01,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x55,0x00, 0x01,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x00,0x51,0x08,0x00, 0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x51,0x08,0x00,0xf0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x51,0x08,0x00,0xf1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x51,0x08,0x00,0xf2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x51,0x08,0x00,0xf3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x51,0x08,0x00,0xf4,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x03,0x00,0x00,0x51,0x08,0x00,0xf5,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x03,0x00,0x00,0x51,0x08,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x03,0x00,0x00,0x51,0x08,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x03,0x00,0x00,0x51,0x08,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x03,0x00,0x00,0x51,0x08,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x03, 0x00,0x00,0x51,0x08,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x03,0x00, 0x00,0x51,0x08,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x03,0x00,0x00, 0x51,0x08,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x51, 0x08,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x00,0x00,0x51,0x08, 0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x55,0x00,0x01, 0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x53,0x20,0x00,0x1f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x53,0x20,0x00,0x20,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x53,0x20,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x53,0x20,0x00,0x22,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x53,0x20,0x00,0x23,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x03,0x00,0x00,0x53,0x20,0x00,0x24,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x03,0x00,0x00,0x53,0x20,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x03,0x00,0x00,0x53,0x20,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x03,0x00,0x00,0x52,0x20,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x03,0x00,0x00,0x52,0x20,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x03, 0x00,0x00,0x52,0x20,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x03,0x00, 0x00,0x52,0x20,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x03,0x00,0x00, 0x52,0x20,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x03,0x00,0x00,0x52, 0x20,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x52,0x20, 0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x03,0x00,0x00,0x52,0x20,0x00, 0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x03,0x00,0x00,0x55,0x00,0x01,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x51,0x08,0x00,0x2b,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x03,0x00,0x00,0x51,0x08,0x00,0x2c,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x51,0x08,0x00,0x2d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x51,0x08,0x00,0x2e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x03,0x00,0x00,0x51,0x08,0x00,0x2f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x03,0x00,0x00,0x51,0x08,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x03,0x00,0x00,0x51,0x08,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x03,0x00,0x00,0x51,0x08,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x03,0x00,0x00,0x51,0x08,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03, 0x00,0x00,0x51,0x08,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x03,0x00, 0x00,0x51,0x08,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x03,0x00,0x00, 0x51,0x08,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x03,0x00,0x00,0x51, 0x08,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x51,0x08, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x51,0x08,0x00, 0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x51,0x08,0x00,0x3a, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x03,0x00,0x00,0x55,0x00,0x01,0x28,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x55,0x00,0x01,0x29,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x51,0x08,0x00,0x3b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x51,0x08,0x00,0x3c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x51,0x08,0x00,0x3d,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x03,0x00,0x00,0x51,0x08,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x03,0x00,0x00,0x51,0x08,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x03,0x00,0x00,0x51,0x08,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x03,0x00,0x00,0x51,0x08,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x03, 0x00,0x00,0x51,0x08,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x03,0x00, 0x00,0x51,0x08,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x03,0x00,0x00, 0x51,0x08,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x51, 0x08,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x51,0x08, 0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x51,0x08,0x00, 0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x03,0x00,0x00,0x51,0x08,0x00,0x48, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x51,0x08,0x00,0x49,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x51,0x08,0x00,0x4a,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x55,0x00,0x01,0x2a,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x53,0x20,0x00,0x6b,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf3,0x03,0x00,0x00,0x53,0x20,0x00,0x6c,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0x03,0x00,0x00,0x53,0x20,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x03,0x00,0x00,0x53,0x20,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x03,0x00,0x00,0x53,0x20,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf7, 0x03,0x00,0x00,0x53,0x20,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03, 0x00,0x00,0x53,0x20,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x03,0x00, 0x00,0x53,0x20,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x03,0x00,0x00, 0x52,0x20,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x52, 0x20,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x52,0x20, 0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x52,0x20,0x00, 0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x52,0x20,0x00,0x6f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x52,0x20,0x00,0x70,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x52,0x20,0x00,0x71,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x52,0x20,0x00,0x72,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x53,0x20,0x00,0xa3,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x53,0x20,0x00,0xa4,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x04,0x00,0x00,0x53,0x20,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x04,0x00,0x00,0x53,0x20,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x04,0x00,0x00,0x53,0x20,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x04,0x00,0x00,0x53,0x20,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04, 0x00,0x00,0x53,0x20,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x00, 0x00,0x53,0x20,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x00,0x00, 0x52,0x20,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x52, 0x20,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x52,0x20, 0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x52,0x20,0x00, 0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x52,0x20,0x00,0xa7, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x52,0x20,0x00,0xa8,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x52,0x20,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x52,0x20,0x00,0xaa,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x20,0x01,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x04,0x00,0x00,0x20,0x01,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x15,0x04,0x00,0x00,0x20,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x16,0x04,0x00,0x00,0x55,0x00,0x01,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17, 0x04,0x00,0x00,0x51,0x08,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04, 0x00,0x00,0x51,0x08,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x04,0x00, 0x00,0x51,0x08,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x04,0x00,0x00, 0x51,0x08,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x51, 0x08,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x51,0x08, 0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x51,0x08,0x00, 0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x04,0x00,0x00,0x51,0x08,0x00,0xbb, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x51,0x08,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x51,0x08,0x00,0xbd,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x51,0x08,0x00,0xbe,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x04,0x00,0x00,0x51,0x08,0x00,0xbf,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x04,0x00,0x00,0x51,0x08,0x00,0xc0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x04,0x00,0x00,0x51,0x08,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x04,0x00,0x00,0x51,0x08,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x04,0x00,0x00,0x51,0x08,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x20,0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x04, 0x00,0x00,0x55,0x00,0x01,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x20,0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00, 0x55,0x00,0x01,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x04,0x00,0x00,0x51, 0x08,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x51,0x08, 0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x51,0x08,0x00, 0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x51,0x08,0x00,0xc7, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x51,0x08,0x00,0xc8,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x51,0x08,0x00,0xc9,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x04,0x00,0x00,0x51,0x08,0x00,0xca,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x04,0x00,0x00,0x51,0x08,0x00,0xcb,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x04,0x00,0x00,0x51,0x08,0x00,0xcc,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x04,0x00,0x00,0x51,0x08,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x04,0x00,0x00,0x51,0x08,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x04,0x00,0x00,0x51,0x08,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x04,0x00,0x00,0x51,0x08,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04, 0x00,0x00,0x51,0x08,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x04,0x00, 0x00,0x51,0x08,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x04,0x00,0x00, 0x51,0x08,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x04,0x00,0x00,0x55, 0x00,0x01,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x53,0x20, 0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x53,0x20,0x00, 0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x53,0x20,0x00,0xf6, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x04,0x00,0x00,0x53,0x20,0x00,0xf7,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x53,0x20,0x00,0xf8,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00,0x53,0x20,0x00,0xf9,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x53,0x20,0x00,0xfa,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x04,0x00,0x00,0x53,0x20,0x00,0xfb,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x04,0x00,0x00,0x52,0x20,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x04,0x00,0x00,0x52,0x20,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x04,0x00,0x00,0x52,0x20,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x04,0x00,0x00,0x52,0x20,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x04, 0x00,0x00,0x52,0x20,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x04,0x00, 0x00,0x52,0x20,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x04,0x00,0x00, 0x52,0x20,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x52, 0x20,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x12,0x01, 0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x04,0x00,0x00,0x21,0x02,0x00, 0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x21,0x02,0x00,0x82, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x04,0x00,0x00,0x21,0x07,0x00,0x52,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0x51,0x08,0x00,0x0a,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x20,0x01,0x00,0x0b,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x20,0x01,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x23,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x04,0x00,0x00,0x21,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x04,0x00,0x00,0x20,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x04,0x00,0x00,0x55,0x40,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x04,0x00,0x00,0x54,0x40,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x04, 0x00,0x00,0x05,0x01,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x04,0x00, 0x00,0x21,0x02,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x04,0x00,0x00, 0x21,0x02,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x04, 0x01,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x20,0x01, 0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x04,0x00,0x00,0x23,0x04,0x00, 0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x04,0x00,0x00,0x24,0x04,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x04,0x00,0x00,0x20,0x01,0x00,0x28,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x55,0x40,0x00,0x29,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x00,0x00,0x54,0x40,0x00,0x29,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x05,0x01,0x00,0x2b,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x04,0x00,0x00,0x21,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x04,0x00,0x00,0x04,0x01,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x04,0x00,0x00,0x20,0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x04,0x00,0x00,0x23,0x04,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x04,0x00,0x00,0x20,0x01,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x04, 0x00,0x00,0x05,0x01,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x04,0x00, 0x00,0x55,0x40,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x04,0x00,0x00, 0x20,0x01,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x04,0x00,0x00,0x20, 0x01,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x04,0x00,0x00,0x54,0x40, 0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x04,0x00,0x00,0x05,0x01,0x00, 0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x04,0x00,0x00,0x21,0x02,0x00,0x40, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x04,0x00,0x00,0x55,0x40,0x00,0x37,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x20,0x01,0x00,0x38,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x04,0x00,0x00,0x23,0x04,0x00,0x3e,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x04,0x00,0x00,0x20,0x01,0x00,0x39,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x55,0x40,0x00,0x3a,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x04,0x00,0x00,0x05,0x01,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x04,0x00,0x00,0x05,0x01,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x04,0x00,0x00,0x05,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x04,0x00,0x00,0x05,0x01,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04, 0x00,0x00,0x05,0x01,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x04,0x00, 0x00,0x24,0x08,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x04,0x00,0x00, 0x24,0x08,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x04,0x00,0x00,0x20, 0x01,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x24,0x10, 0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x04,0x00,0x00,0x20,0x01,0x00, 0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x04,0x00,0x00,0x55,0x20,0x00,0x46, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x23,0x08,0x00,0x85,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x20,0x01,0x00,0x47,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x04,0x00,0x00,0x20,0x01,0x00,0x48,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x04,0x00,0x00,0x51,0x08,0x00,0x49,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x04,0x00,0x00,0x20,0x01,0x00,0x4a,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x04,0x00,0x00,0x55,0x20,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x04,0x00,0x00,0x20,0x01,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x04,0x00,0x00,0x55,0x10,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x04,0x00,0x00,0x21,0x04,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04, 0x00,0x00,0x55,0x20,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0x00, 0x00,0x20,0x01,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x04,0x00,0x00, 0x55,0x10,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x13, 0x01,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x20,0x01, 0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x54,0x40,0x00, 0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x21,0x02,0x00,0x58, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x04,0x00,0x00,0x13,0x02,0x00,0x5a,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x13,0x02,0x00,0x5d,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x05,0x01,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x04,0x00,0x00,0x22,0x04,0x00,0x58,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x04,0x00,0x00,0x13,0x01,0x00,0x64,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x04,0x00,0x00,0x21,0x06,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x04,0x00,0x00,0x13,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x04,0x00,0x00,0x13,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x04,0x00,0x00,0x15,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x04, 0x00,0x00,0x21,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x04,0x00, 0x00,0x13,0x01,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x04,0x00,0x00, 0x13,0x01,0x00,0x7f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x23, 0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x23,0x02, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x51,0x10,0x00, 0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x04,0x00,0x00,0x21,0x02,0x00,0x8b, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x04,0x00,0x00,0x55,0x40,0x00,0xac,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x20,0x02,0x00,0x8b,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x04,0x00,0x00,0x55,0x80,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x04,0x00,0x00,0x21,0x02,0x00,0x99,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x04,0x00,0x00,0x20,0x02,0x00,0x99,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x04,0x00,0x00,0x21,0x02,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x04,0x00,0x00,0x54,0x40,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x04,0x00,0x00,0x20,0x02,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x04,0x00,0x00,0x05,0x01,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x04, 0x00,0x00,0x13,0x01,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x04,0x00, 0x00,0x05,0x01,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00, 0x13,0x01,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x53, 0x20,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x53,0x20, 0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x04,0x00,0x00,0x54,0x40,0x00, 0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x04,0x00,0x00,0x25,0x08,0x00,0x83, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x55,0x40,0x00,0xb4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x04,0x00,0x00,0x05,0x01,0x00,0xaf,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0x04,0x00,0x00,0x05,0x01,0x00,0xb1,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x25,0x08,0x00,0x82,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x53,0x20,0x00,0xb4,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xb4,0x04,0x00,0x00,0x23,0x0a,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xb5,0x04,0x00,0x00,0x51,0x08,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xb6,0x04,0x00,0x00,0x51,0x40,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb7, 0x04,0x00,0x00,0x21,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x04, 0x00,0x00,0x52,0x70,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x04,0x00, 0x00,0x20,0x01,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x04,0x00,0x00, 0x04,0x01,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x04,0x00,0x00,0x20, 0x01,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x04,0x00,0x00,0x51,0x38, 0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x04,0x00,0x00,0x51,0x30,0x00, 0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x04,0x00,0x00,0x55,0xc0,0x00,0xc0, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x53,0xb0,0x00,0xc1,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x20,0x01,0x00,0xbf,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xc1,0x04,0x00,0x00,0x55,0x40,0x00,0xc7,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0x04,0x00,0x00,0x55,0x60,0x01,0xc1,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xc3,0x04,0x00,0x00,0x13,0x01,0x00,0xc3,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xc4,0x04,0x00,0x00,0x51,0x40,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xc5,0x04,0x00,0x00,0x55,0x00,0x01,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xc6,0x04,0x00,0x00,0x52,0x70,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc7, 0x04,0x00,0x00,0x20,0x01,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x04, 0x00,0x00,0x51,0x38,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x04,0x00, 0x00,0x51,0x10,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x04,0x00,0x00, 0x13,0x01,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x04,0x00,0x00,0x54, 0x40,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x04,0x00,0x00,0x04,0x01, 0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x13,0x04,0x00, 0xd3,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x04,0x00,0x00,0x04,0x04,0x00,0xce, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x04,0x00,0x00,0x13,0x01,0x00,0xd5,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x04,0x00,0x00,0x04,0x01,0x00,0xd4,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xd1,0x04,0x00,0x00,0x24,0x0c,0x00,0xea,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x54,0xe0,0x00,0xc8,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xd3,0x04,0x00,0x00,0x50,0x38,0x00,0xc8,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xd4,0x04,0x00,0x00,0x21,0x01,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0x04,0x00,0x00,0x05,0x01,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x04,0x00,0x00,0x05,0x01,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd7, 0x04,0x00,0x00,0x04,0x04,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x04, 0x00,0x00,0x04,0x01,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x04,0x00, 0x00,0x13,0x03,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x04,0x00,0x00, 0x13,0x02,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x04,0x00,0x00,0x13, 0x02,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x04,0x00,0x00,0x13,0x02, 0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x04,0x00,0x00,0x13,0x04,0x00, 0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x04,0x00,0x00,0x13,0x04,0x00,0xe9, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x04,0x00,0x00,0x53,0x20,0x00,0xec,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x04,0x00,0x00,0x20,0x01,0x00,0xed,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0xe1,0x04,0x00,0x00,0x50,0x08,0x00,0xee,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0xe2,0x04,0x00,0x00,0x50,0x08,0x00,0xf1,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0xe3,0x04,0x00,0x00,0x51,0x08,0x00,0xf3,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xe4,0x04,0x00,0x00,0x51,0x08,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0xe5,0x04,0x00,0x00,0x51,0x08,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0xe6,0x04,0x00,0x00,0x51,0x08,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe7, 0x04,0x00,0x00,0x51,0x08,0x00,0xfb,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x04, 0x00,0x00,0x51,0x08,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x04,0x00, 0x00,0x51,0x08,0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x04,0x00,0x00, 0x51,0x08,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x04,0x00,0x00,0x21, 0x01,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x04,0x00,0x00,0x21,0x01, 0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x04,0x00,0x00,0x20,0x01,0x00, 0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x04,0x00,0x00,0x20,0x01,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x04,0x00,0x00,0x20,0x01,0x00,0x0a,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x04,0x00,0x00,0x20,0x01,0x00,0x0e,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0xf1,0x04,0x00,0x00,0x01,0x00,0x00, 0xf2,0x04,0x00,0x00,0x01,0x00,0x00,0xf3,0x04,0x00,0x00,0x01,0x00,0x00,0xf4,0x04, 0x00,0x00,0x01,0x00,0x00,0xf5,0x04,0x00,0x00,0x01,0x00,0x00,0xf6,0x04,0x00,0x00, 0x01,0x00,0x00,0xf7,0x04,0x00,0x00,0x01,0x00,0x00,0xf8,0x04,0x00,0x00,0x01,0x00, 0x00,0xf9,0x04,0x00,0x00,0x08,0x00,0x00,0xfa,0x04,0x00,0x00,0x20,0x00,0x00,0xfb, 0x04,0x00,0x00,0x04,0x00,0x00,0xfc,0x04,0x00,0x00,0x01,0x00,0x00,0xfd,0x04,0x00, 0x00,0x01,0x00,0x00,0xfe,0x04,0x00,0x00,0x08,0x00,0x00,0xff,0x04,0x00,0x00,0x20, 0x00,0x00,0x00,0x05,0x00,0x00,0x04,0x00,0x00,0x01,0x05,0x00,0x00,0x20,0x00,0x00, 0x02,0x05,0x00,0x00,0x01,0x00,0x00,0x03,0x05,0x00,0x00,0x20,0x00,0x00,0x04,0x05, 0x00,0x00,0x04,0x00,0x00,0x05,0x05,0x00,0x00,0x04,0x00,0x00,0x06,0x05,0x00,0x00, 0x01,0x00,0x00,0x07,0x05,0x00,0x00,0x01,0x00,0x00,0x08,0x05,0x00,0x00,0x01,0x00, 0x00,0x09,0x05,0x00,0x00,0x01,0x00,0x00,0x0a,0x05,0x00,0x00,0x01,0x00,0x00,0x0b, 0x05,0x00,0x00,0x01,0x00,0x00,0x0c,0x05,0x00,0x00,0x02,0x00,0x00,0x0d,0x05,0x00, 0x00,0x01,0x00,0x00,0x0e,0x05,0x00,0x00,0x01,0x00,0x00,0x0f,0x05,0x00,0x00,0x02, 0x00,0x00,0x10,0x05,0x00,0x00,0x04,0x00,0x00,0x11,0x05,0x00,0x00,0x04,0x00,0x00, 0x12,0x05,0x00,0x00,0x04,0x00,0x00,0x13,0x05,0x00,0x00,0x04,0x00,0x00,0x14,0x05, 0x00,0x00,0x01,0x00,0x00,0x15,0x05,0x00,0x00,0x01,0x00,0x00,0x16,0x05,0x00,0x00, 0x02,0x00,0x00,0x17,0x05,0x00,0x00,0x01,0x00,0x00,0x18,0x05,0x00,0x00,0x01,0x00, 0x00,0x19,0x05,0x00,0x00,0x02,0x00,0x00,0x1a,0x05,0x00,0x00,0x01,0x00,0x00,0x1b, 0x05,0x00,0x00,0x02,0x00,0x00,0x1c,0x05,0x00,0x00,0x01,0x00,0x00,0x1d,0x05,0x00, 0x00,0x02,0x00,0x00,0x1e,0x05,0x00,0x00,0x01,0x00,0x00,0x1f,0x05,0x00,0x00,0x01, 0x00,0x00,0x20,0x05,0x00,0x00,0x01,0x00,0x00,0x21,0x05,0x00,0x00,0x01,0x00,0x00, 0x22,0x05,0x00,0x00,0x01,0x00,0x00,0x23,0x05,0x00,0x00,0x01,0x00,0x00,0x24,0x05, 0x00,0x00,0x02,0x00,0x00,0x25,0x05,0x00,0x00,0x01,0x00,0x00,0x26,0x05,0x00,0x00, 0x02,0x00,0x00,0x27,0x05,0x00,0x00,0x01,0x00,0x00,0x28,0x05,0x00,0x00,0x01,0x00, 0x00,0x29,0x05,0x00,0x00,0x02,0x00,0x00,0x2a,0x05,0x00,0x00,0x01,0x00,0x00,0x2b, 0x05,0x00,0x00,0x01,0x00,0x00,0x2c,0x05,0x00,0x00,0x01,0x00,0x00,0x2d,0x05,0x00, 0x00,0x01,0x00,0x00,0x2e,0x05,0x00,0x00,0x02,0x00,0x00,0x2f,0x05,0x00,0x00,0x02, 0x00,0x00,0x30,0x05,0x00,0x00,0x02,0x00,0x00,0x31,0x05,0x00,0x00,0x02,0x00,0x00, 0x32,0x05,0x00,0x00,0x02,0x00,0x00,0x33,0x05,0x00,0x00,0x02,0x00,0x00,0x34,0x05, 0x00,0x00,0x02,0x00,0x00,0x35,0x05,0x00,0x00,0x02,0x00,0x00,0x36,0x05,0x00,0x00, 0x01,0x00,0x00,0x37,0x05,0x00,0x00,0x01,0x00,0x00,0x38,0x05,0x00,0x00,0x20,0x00, 0x00,0x39,0x05,0x00,0x00,0x01,0x00,0x00,0x3a,0x05,0x00,0x00,0x01,0x00,0x00,0x3b, 0x05,0x00,0x00,0x01,0x00,0x00,0x3c,0x05,0x00,0x00,0x01,0x00,0x00,0x3d,0x05,0x00, 0x00,0x01,0x00,0x00,0x3e,0x05,0x00,0x00,0x01,0x00,0x00,0x3f,0x05,0x00,0x00,0x01, 0x00,0x00,0x40,0x05,0x00,0x00,0x01,0x00,0x00,0x41,0x05,0x00,0x00,0x01,0x00,0x00, 0x42,0x05,0x00,0x00,0x01,0x00,0x00,0x43,0x05,0x00,0x00,0x01,0x00,0x00,0x44,0x05, 0x00,0x00,0x01,0x00,0x00,0x45,0x05,0x00,0x00,0x01,0x00,0x00,0x46,0x05,0x00,0x00, 0x01,0x00,0x00,0x47,0x05,0x00,0x00,0x01,0x00,0x00,0x48,0x05,0x00,0x00,0x01,0x00, 0x00,0x49,0x05,0x00,0x00,0x04,0x00,0x00,0x4a,0x05,0x00,0x00,0x01,0x00,0x00,0x4b, 0x05,0x00,0x00,0x01,0x00,0x00,0x4c,0x05,0x00,0x00,0x01,0x00,0x00,0x4d,0x05,0x00, 0x00,0x04,0x00,0x00,0x4e,0x05,0x00,0x00,0x02,0x00,0x00,0x4f,0x05,0x00,0x00,0x01, 0x00,0x00,0x50,0x05,0x00,0x00,0x04,0x00,0x00,0x51,0x05,0x00,0x00,0x02,0x00,0x00, 0x52,0x05,0x00,0x00,0x04,0x00,0x00,0x53,0x05,0x00,0x00,0x02,0x00,0x00,0x54,0x05, 0x00,0x00,0x04,0x00,0x00,0x55,0x05,0x00,0x00,0x04,0x00,0x00,0x56,0x05,0x00,0x00, 0x02,0x00,0x00,0x57,0x05,0x00,0x00,0x01,0x00,0x00,0x58,0x05,0x00,0x00,0x01,0x00, 0x00,0x26,0x00,0x59,0x05,0x00,0x00,0x01,0x00,0x5a,0x05,0x00,0x00,0x00,0x00,0x5b, 0x05,0x00,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x01,0x00,0x5d,0x05,0x00,0x00,0x00, 0x00,0x5e,0x05,0x00,0x00,0x00,0x00,0x5f,0x05,0x00,0x00,0x00,0x00,0x60,0x05,0x00, 0x00,0x00,0x00,0x61,0x05,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x00,0x00,0x00,0x63, 0x05,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x00,0x00,0x00,0x65,0x05,0x00,0x00,0x00, 0x00,0x66,0x05,0x00,0x00,0x00,0x00,0x67,0x05,0x00,0x00,0x00,0x00,0x68,0x05,0x00, 0x00,0x00,0x00,0x69,0x05,0x00,0x00,0x00,0x00,0x6a,0x05,0x00,0x00,0x00,0x00,0x6b, 0x05,0x00,0x00,0x00,0x00,0x6c,0x05,0x00,0x00,0x00,0x00,0x6d,0x05,0x00,0x00,0x00, 0x00,0x6e,0x05,0x00,0x00,0x00,0x00,0x6f,0x05,0x00,0x00,0x00,0x00,0x70,0x05,0x00, 0x00,0x00,0x00,0x71,0x05,0x00,0x00,0x00,0x00,0x72,0x05,0x00,0x00,0x00,0x00,0x73, 0x05,0x00,0x00,0x00,0x00,0x74,0x05,0x00,0x00,0x00,0x00,0x75,0x05,0x00,0x00,0x00, 0x00,0x76,0x05,0x00,0x00,0x00,0x00,0x77,0x05,0x00,0x00,0x01,0x00,0x78,0x05,0x00, 0x00,0x00,0x00,0x79,0x05,0x00,0x00,0x00,0x00,0x7a,0x05,0x00,0x00,0x00,0x00,0x7b, 0x05,0x00,0x00,0x00,0x00,0x7c,0x05,0x00,0x00,0x00,0x00,0x7d,0x05,0x00,0x00,0x00, 0x00,0x7e,0x05,0x00,0x00,0x00,0x00,0x00,0x07,0x7f,0x05,0x00,0x00,0x01,0x00,0x00, 0x80,0x05,0x00,0x00,0x01,0x00,0x00,0x81,0x05,0x00,0x00,0x01,0x00,0x00,0x82,0x05, 0x00,0x00,0x01,0x00,0x00,0x83,0x05,0x00,0x00,0x01,0x00,0x00,0x84,0x05,0x00,0x00, 0x01,0x00,0x00,0x85,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02, 0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04, 0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c, 0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x02,0x0b,0x00,0x00, 0x00,0x34,0x00,0x04,0x00,0x2a,0x0c,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x20,0x20, 0x00,0x00,0x00,0x40,0x00,0x10,0x00,0x67,0x91,0x00,0x00,0xb3,0x6d,0x00,0x00,0x03, 0x00,0x86,0x05,0x00,0x00,0x14,0x67,0x65,0x6e,0x78,0x5f,0x73,0x69,0x6d,0x70,0x6c, 0x65,0x5f,0x6d,0x65,0x5f,0x34,0x2e,0x61,0x73,0x6d,0x87,0x05,0x00,0x00,0x00,0x88, 0x05,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x21,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x06,0x00,0x09,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00, 0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x06,0x05,0x00,0x08,0x00, 0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x03,0x00,0x00,0x00,0x12,0x21,0x01,0x05,0x03, 0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x17,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02, 0x01,0x00,0x00,0x15,0x03,0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x04,0x00,0x00, 0x00,0x32,0x00,0x01,0x00,0x01,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00,0x15,0x03, 0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00,0x02,0x80, 0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10, 0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x1a,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1b,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x1c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1e, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x01,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x1f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x21,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x23,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00, 0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x26, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x05,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x27,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2d,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x2b,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x03,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x1b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1c,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x1d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1e,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x21,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x22,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x03,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2f,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x24,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x25,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x26,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2f,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00, 0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x2a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2f,0x00,0x00,0x00,0x07,0x04, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00, 0x07,0x00,0x10,0x10,0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x2e,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x2f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x37,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x3a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x31,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3c, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00, 0x10,0x10,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x3f,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x2f, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x31,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x32,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x32,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x34,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x35,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x32,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x37, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x3a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x32,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3c,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x3d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x32,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x32,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3d,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x63, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x55,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x61,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x40, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x53,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x40,0x03, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x54,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x41,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x41,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x42,0x03,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x43,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x44,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5d,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x45,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x46,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x46,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x47,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x61,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x47,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x62,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x48, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x49,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x49,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4a,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0x4b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4c, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4d,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x4e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4e,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0x4f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x79,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0x7b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x50,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x19,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x51,0x03, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x53, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x54,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x57,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7c,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x58,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x59,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7c,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5b, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x5c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x5e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7c,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x60,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x00,0x00,0x00, 0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00, 0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x19,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x63,0x03,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0x52,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x53,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x54, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x55,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00, 0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x56,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x57,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x02,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x58,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x7e,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x59,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x5a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5b,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x7e,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5c, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x5d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00, 0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x5e,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x5f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x06,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x7e,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x61,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00, 0x07,0x00,0x10,0x10,0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x64,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x67,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7f,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x6d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7f,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x72, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00, 0x10,0x10,0x00,0x62,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x75,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x65, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x66,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x67,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x68,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x80,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x6b,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x80,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6d, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x70,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x80,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x73,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x80,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x85, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x87,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x89,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x92,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xb1, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa3,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xb9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xab,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbd, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaf,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x76, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xa1,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x76,0x03, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xa2,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x77,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa3, 0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x77,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa7,0x00,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x79,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x7a,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xba, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x7b,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x7c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x7c,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x7d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xaf,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x7d,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0x7e, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x7f,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7f,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x80,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x82, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x83,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x83,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x84,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0x85,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc1,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xcc,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc2,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0xc3,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0xc4,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd1, 0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc5,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0xd4,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc6,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0xc7,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0xc7,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc8,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0xc8,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x01,0x00,0x00,0x00,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x20,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x18,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x87,0x03, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x89, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x8c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xda,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8e,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x8f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xda,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x94,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xda,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x97,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x00,0x00,0x00, 0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x2b,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x98,0x03,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xdb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x89,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x8a,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8b,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xdb,0x00,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8c, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x8d,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00, 0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x8f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x03,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x90,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xdb,0x00,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x91,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x92,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x93,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xdb,0x00,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x94, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x95,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00, 0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x96,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x97,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xdb,0x00,0x00,0x00,0x07,0x04, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x30,0x00,0x00,0x00,0x37,0x00, 0x07,0x00,0x10,0x10,0x00,0x18,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x9a,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x9b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9d,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x9e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdd,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xa3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x00,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xa6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdd,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x00, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00, 0x10,0x10,0x00,0x2b,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0xab,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x9b, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x9c,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9d,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x9e,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x9f,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xde,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa0,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xa1,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa2,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xde,0x00,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa3, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xa4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa5,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xa6,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xde,0x00,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xa8,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xa9,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xaa,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xde,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe3, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x02,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe7,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe9,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xeb,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x0f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x17, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x09,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0d,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xac, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xff,0x00,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xac,0x03, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x00,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xad,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x01, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xad,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x03,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xae,0x03,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x04,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xaf,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xb0,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x18, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xb1,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1a,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x0a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xb2,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x0c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xb3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x0d,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xb3,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x0e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xb4, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb5,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb5,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb6,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xb7,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xb9,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb9,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xba,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xba,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xbb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x01, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x25,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x80,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x37,0x00,0x07,0x00,0x10,0x10, 0x00,0x50,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0xbc,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xbd,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xbe,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00, 0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x01,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01, 0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x03,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00, 0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x05,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01, 0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xcb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x07,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x62, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0xcd,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xbd,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xbe,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xbf,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x28,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc0,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc1,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc2,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x28,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc3, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x03,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01, 0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xc6,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x04,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x28,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xc8,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xc9,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00, 0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xca,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x28,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xcb, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x07,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xcc,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x01, 0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x50,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xce,0x03, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd0, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xd3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x29,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xd6,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd8, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xdb,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x29,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdd,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xde,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x01,0x00,0x00, 0x07,0x04,0x22,0x01,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x62,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x99,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0xdf,0x03,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xcf,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd0,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd2,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2a,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd3, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01, 0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd5,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xd6,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x03,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd7,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xd8,0x03,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0xd9,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00, 0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x03,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2a,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdb, 0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x06,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0xdc,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01, 0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xdd,0x03,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0xde,0x03,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x07,0x04, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x53, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x54,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x3d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x55,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3f, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x56,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x41,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x43,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x5d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4b,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5c, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x61,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4d,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0xe1,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x5e,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x61,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56, 0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0xe2,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x68,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xe3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x01,0x00, 0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0xe3,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x52,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe4, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x53,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe4,0x03, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x54,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe5,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x56,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x57,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe6,0x03,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xe7,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xe9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xea, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xeb,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xeb,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xec,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xec,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xed,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xee, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xef,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xef,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0x6b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x74,0x01,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0x6b,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6c,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0x6c,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6d,0x01, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x7a,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00, 0x6f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7c,0x01,0x00, 0x00,0x00,0x10,0x00,0x02,0x00,0x6f,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04, 0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x70,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0x70,0x01,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x7f, 0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x71,0x01, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x04,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x04,0x00,0x00, 0x00,0x82,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x72,0x01,0x00,0x00,0x01,0x00, 0x23,0x01,0x01,0x05,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xca,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x75,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x77, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x79,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7b,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7d,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7f,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x95, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x87,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x99, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8b,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa1, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00, 0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x93,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x94, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0xf1,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x96,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xf2,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xf2,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x98,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0xf3,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x89,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0xf3,0x03,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x8b,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf4,0x03, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x8c,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf5,0x03,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8d, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf5,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8e,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8f,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf6,0x03,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x90,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x91,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf7,0x03,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x25,0x05,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf8,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xf9,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xfa, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xfb,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfb,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfc,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05, 0x00,0x00,0x00,0xfd,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x03,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xfe, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00, 0x00,0x00,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa3,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xa5,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x03,0x00,0x00, 0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab, 0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xa8,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x06, 0x00,0x00,0x02,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00, 0x00,0xab,0x01,0x00,0x00,0x07,0x00,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x38,0x00,0x08,0x00,0x10,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xab,0x01,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x02,0x00,0x31,0x01,0x00,0x2c,0x00,0x00,0x02,0x03,0x00,0x00, 0x15,0x03,0x00,0x00,0x00,0x14,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x32,0x00, 0x03,0x80,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x05,0x00,0x00,0x00,0x37,0x00,0x07,0x00, 0x10,0x10,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x04,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x05, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01, 0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x01,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xae,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00, 0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xae,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0d, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x04,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01, 0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x05,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xae,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x12,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00, 0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xae,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xaf, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x10,0x00,0x00,0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x15,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x16,0x04, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x06, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x09,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x02,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0a,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xb0,0x01,0x00,0x00,0x02,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0b,0x04,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00, 0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xb0,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x0e, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x04,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x0f,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01, 0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x11,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x06,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xb0,0x01,0x00,0x00,0x06,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb0,0x01,0x00,0x00, 0x07,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x10,0x00,0x00,0x00, 0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x17,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x18,0x04,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0x19,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01, 0x00,0x00,0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x1e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x02,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb2,0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x20,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00, 0x04,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb2,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x23, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x05,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01, 0x00,0x00,0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x26,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x06,0x04, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb2,0x01,0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x28,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x37,0x00, 0x07,0x00,0x10,0x10,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x17,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x19,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xb3,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x04,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00, 0x01,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1d,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xb3,0x01,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1e, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x02,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x1f,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01, 0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x03,0x04,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x04,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x22,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xb3,0x01,0x00,0x00,0x04,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x23,0x04,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x24,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00, 0x05,0x04,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0xb3,0x01,0x00,0x00,0x06,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x26, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x06,0x04,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb3,0x01, 0x00,0x00,0x07,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x07,0x04,0x22,0x01,0x01,0x05,0x00,0x00, 0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00, 0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd7,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xd9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbe,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc0,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc4,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc6,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x05,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x05,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x05,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x05,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05, 0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd1,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00, 0x00,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xe9,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xed,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf1,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x2a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xd4,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x2a,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd5,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd6,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2b,0x04, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd7,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2c,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd8, 0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2c,0x04,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd9,0x01, 0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xda,0x01,0x00, 0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2d,0x04,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdb,0x01,0x00,0x00, 0x00,0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdc,0x01,0x00,0x00,0x00, 0x01,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2e,0x04,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x01, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x01,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x2f,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xef, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x01,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x30,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf1,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x31,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xe2,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x31,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf3,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xe3,0x01,0x00,0x00,0x00,0x01,0x23,0x01,0x25,0x05,0x00,0x00, 0x00,0x32,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x33,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x34,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x35,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00, 0x00,0x36,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x37,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02, 0x02,0x00,0x00,0x00,0x25,0x05,0x00,0x00,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x38,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00, 0x25,0x05,0x00,0x00,0x00,0x39,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00, 0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00, 0xf5,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05, 0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x04,0x00,0x00, 0x02,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc, 0x01,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xfa,0x01, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x05,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x07, 0x00,0x00,0x02,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x38,0x00,0x08,0x00, 0x10,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x01,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0xfc,0x01,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x03,0x00,0x00,0x00, 0x10,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x07,0x03, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x03,0x00,0x20,0x00,0x00,0x00,0x00, 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x22,0x22,0x22,0x22,0x29,0x01,0x00,0x00,0x00,0x3b,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x22,0x22, 0x22,0x22,0x29,0x01,0x00,0x00,0x00,0x3c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x03,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x3d, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x81,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x04,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x04, 0x00,0x1c,0x00,0x24,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0a,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x03,0x00,0x00,0x00,0x3e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0x3e,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01, 0x00,0x05,0x00,0x02,0x00,0x08,0x02,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37, 0x00,0x0c,0x00,0x04,0x01,0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x05,0x00,0x00, 0x0d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00, 0x05,0x00,0x05,0x00,0x31,0x04,0x00,0x29,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x0f, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x7b,0x00,0x10,0x02,0x00,0x00,0x5d,0x00,0x04,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x05,0x00,0x06,0x00,0x18,0x02,0x0f,0x02,0x00, 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x37, 0x00,0x0c,0x00,0x04,0x01,0x00,0x3f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x11,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x06,0x00,0x00, 0x12,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00, 0x06,0x80,0x04,0x00,0x31,0x05,0x00,0x29,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x08, 0x02,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00, 0x29,0x01,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0xff, 0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x01,0x02, 0x07,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x00,0x00,0x00, 0x00,0x32,0x00,0x07,0x80,0x06,0x00,0x24,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x06, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xc0,0xff,0xff,0xff,0x3c, 0x02,0x00,0x0a,0x00,0x43,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x04,0x00,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x44,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x04,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x05,0x01,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x08,0x00,0x00,0x19,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00,0x08,0x00,0x00, 0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1c,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x03,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c, 0x03,0x00,0x02,0x09,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0x00,0x00,0x00,0x00,0x2a,0x03,0x09,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x05,0x22,0x00,0x00,0x00,0x00,0x44,0x04,0x00,0x00,0x00,0x04,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02, 0x00,0x00,0x01,0x03,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47,0x04,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x01,0x04,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x04,0x00,0x00,0x00,0x08, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x44,0x04,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x1e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x0a,0x00,0x00,0x4a,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x2a,0x01,0x0a,0x00,0x00,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x48,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2c,0x02, 0x02,0x02,0x0b,0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff, 0xff,0xff,0xff,0x2a,0x02,0x0b,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x01,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x02,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x05,0x60,0x00,0x00,0x00,0x31,0x06,0x00,0x29,0x00,0x00,0x00,0x00, 0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00,0x3e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff, 0x29,0x01,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x40,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x0c,0x00,0x00,0x4c, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x0c, 0x00,0x09,0x00,0x22,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x14,0x03,0x00,0x00,0x00,0x12,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0x03,0x01, 0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00, 0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x3c,0x02,0x00,0x0a,0x00,0x4d, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x04,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x2b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x50,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00, 0x00,0x2c,0x00,0x01,0x02,0x0d,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00,0x0d,0x00,0x00,0x2d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x03, 0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x03,0x00,0x02,0x0e,0x00, 0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a, 0x03,0x0e,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x22,0x00, 0x00,0x00,0x00,0x4e,0x04,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x00,0x00,0x00,0x00, 0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x02,0x00,0x00,0x01,0x03,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x29, 0x02,0x00,0x00,0x01,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4e,0x04,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4e,0x04,0x00,0x00,0x00, 0x0c,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x52,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b, 0x85,0x02,0x0f,0x00,0x00,0x53,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x01,0x0f, 0x00,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2c,0x02,0x02,0x02,0x10,0x00,0x00, 0x54,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x2a,0x02, 0x10,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2b,0x05,0x02,0x11,0x00,0x05, 0x00,0xff,0xff,0xff,0xff,0x32,0x00,0x07,0x80,0x07,0x00,0x01,0x00,0x00,0x00,0x00, 0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xc0,0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0x55,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x31,0x02,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x32, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x02,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x56,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x56,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x57,0x04,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x34,0x02,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x57,0x04,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x11,0x00,0x00, 0x58,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x08,0x00,0x00,0x00,0x31,0x07,0x00,0x29,0x00, 0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x10,0x00,0x00, 0x00,0x2c,0x00,0x04,0x02,0x12,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x14,0x03,0x00,0x00,0x00,0x12,0x21,0x01,0x32,0x00,0x12,0x80,0x08,0x00,0x01, 0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x40,0x00,0x00,0x00,0x3c,0x02,0x00,0x0a,0x00, 0x59,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x5a,0x04,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x04,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x04,0x05,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5b, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x05,0x01,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x01,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x5c,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x01,0x04, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x04,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3e,0x02,0x00, 0x00,0x00,0x01,0x00,0x02,0x00,0x5d,0x04,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b,0x85,0x02,0x13,0x00,0x00, 0x5e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x01,0x13,0x00,0x00,0x3e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x2c,0x02,0x02,0x02,0x14,0x00,0x00,0x5f,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x2a,0x02,0x14,0x00,0x00,0x40,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x05,0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x09,0x00,0x31,0x08, 0x00,0x32,0x00,0x07,0x80,0x09,0x00,0x01,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xc0, 0xff,0xff,0xff,0x3c,0x02,0x00,0x0a,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x61,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x01,0x03,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x5c,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x01,0x04, 0x21,0x01,0x2a,0x01,0x11,0x00,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2c,0x02, 0x02,0x02,0x15,0x00,0x00,0x5f,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff, 0xff,0xff,0xff,0x2a,0x02,0x15,0x00,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x31, 0x09,0x00,0x21,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x63,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x64,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x21,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x21,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x66,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x01,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x06, 0x00,0x02,0x00,0x22,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x42,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x41, 0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x42,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00, 0x02,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x02, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x21,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x67,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x67,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x69,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x68,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x68, 0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x2c,0x00,0x00,0x02,0x16,0x00,0x00,0x20,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x16,0x00, 0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x37,0x00, 0x08,0x00,0x04,0x10,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x01,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x44,0x02,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x6a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02,0x00,0x00,0x00,0x03, 0x24,0x01,0x24,0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x37,0x00, 0x08,0x01,0x04,0x08,0x00,0x69,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6b,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x6c,0x04,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00, 0x00,0x6d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x02,0x00,0x00,0x00,0x01, 0x23,0x01,0x31,0x0a,0x00,0x2c,0x00,0x00,0x02,0x17,0x00,0x00,0x3b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x17,0x00,0x10,0x00, 0x2c,0x00,0x01,0x02,0x18,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x04,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x19,0x00,0x00,0x3d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x32,0x00,0x19,0x00,0x0d,0x00, 0x01,0x00,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x00,0x20,0x01,0x00,0x6e, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x49,0x02,0x00,0x00,0x00,0x00,0x32,0x00,0x18,0x00,0x0b,0x00,0x29,0x02,0x00,0x00, 0x00,0x3d,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x04,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x70,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x52,0x02,0x00, 0x00,0x00,0x14,0x00,0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x13,0x21,0x01,0x32,0x00, 0x00,0x00,0x0c,0x00,0x31,0x0b,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x70,0x04,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x70,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x31,0x0c,0x00,0x24,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x4a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x01,0x20,0x01,0x00,0x6e,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x71,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x72,0x04,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x84,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x4b,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x32,0x00, 0x00,0x00,0x10,0x00,0x31,0x0d,0x00,0x01,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0xff,0x32,0x00,0x18,0x00,0x0e,0x00,0x37,0x00,0x08,0x00,0x10,0x01,0x00, 0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x73,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x74,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x3d, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x4d,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x04,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x03,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0x4e,0x02,0x00,0x00,0x00,0x0f, 0x21,0x01,0x32,0x00,0x00,0x00,0x0f,0x00,0x31,0x0e,0x00,0x37,0x00,0x08,0x00,0x20, 0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x73,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x76,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00, 0x00,0x3d,0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x3d,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x4f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x3d,0x04,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x4f,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x31,0x0f, 0x00,0x24,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x08,0x01,0x10,0x01,0x00, 0x00,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x78,0x04,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x84,0x02,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x31,0x10,0x00, 0x45,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x45,0x00, 0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x45,0x00,0x00,0x00, 0x54,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x03,0x21, 0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x45,0x00,0x00,0x00,0x88,0x02, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x69,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x2c,0x00,0x00,0x02,0x1a,0x00,0x00,0x79, 0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x32,0x00,0x1a, 0x00,0x1b,0x00,0x20,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x15,0x03,0x00,0x00,0x00,0x16,0x21,0x01,0x05,0x05,0x40,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x1b,0x00,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x32,0x00,0x1b,0x00,0x12,0x00,0x24,0x00,0x00, 0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x06,0x00,0x00,0x00,0x3c,0x02,0x00,0x0b,0x00,0x7a,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x7b,0x04,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x7c,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x01,0x03, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7c,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x57,0x02,0x00,0x00,0x01,0x04,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x58,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x01,0x18,0x00,0x00,0x00, 0x2c,0x01,0x01,0x02,0x1c,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0x00,0x00,0x00,0x2a,0x01,0x1c,0x00,0x00,0x7d,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01, 0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x2b,0x00,0x02,0x1e,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x2c, 0x00,0x00,0x02,0x1d,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x00,0x00,0xff,0x32,0x00,0x1d,0x80,0x11,0x00,0x20,0x00,0x00,0x00,0x00,0x5b, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x03,0x21,0x01, 0x05,0x01,0xff,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x1e,0x00,0x00,0x5b,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x31,0x11,0x00,0x2a,0x00, 0x1e,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x1f,0x00,0x00,0x5c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x1f,0x00, 0x00,0x7e,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05, 0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x20,0x02,0x00,0x00,0x00, 0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7b,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x04,0x05, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00,0x00,0x20, 0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x02,0x04,0x02,0x20, 0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x03,0x00,0x00,0x00, 0x2c,0x02,0x00,0x02,0x21,0x00,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x02,0x22,0x00,0x02,0x21,0x00,0x02, 0x20,0x00,0x2a,0x02,0x22,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x02,0x23, 0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00, 0x2a,0x02,0x23,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x62,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x00,0x62,0x02,0x00,0x00,0x00,0x01,0x23,0x01,0x21,0x00,0x00,0x00,0x00, 0x81,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x31,0x12,0x00,0x2c,0x00,0x00,0x02,0x24,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x25,0x00,0x02, 0x07,0x00,0x02,0x24,0x00,0x2a,0x00,0x25,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01, 0x01,0x02,0x26,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00, 0x00,0x00,0x00,0x29,0x01,0x26,0x00,0x00,0x82,0x04,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x82,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x26,0x00,0x00,0x82,0x04, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x82,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x2a, 0x01,0x26,0x00,0x00,0x83,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x67,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x2a,0x01,0x26,0x00,0x00,0x84,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x45,0x01,0x00,0x00,0x6a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x42, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x45,0x01,0x00,0x00,0x6c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x42,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x45,0x01,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x42,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x45,0x01,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02, 0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x06,0x22,0x01,0x45, 0x01,0x00,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00, 0x00,0x0a,0x22,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x08,0x22,0x01,0x45,0x01,0x00, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x06, 0x22,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x0a,0x22,0x01,0x22,0x01,0x00,0x00,0x00, 0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x87, 0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2b,0x00,0x02,0x2c,0x00,0x05,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x27,0x00,0x00,0x69,0x02,0x00,0x00,0x00, 0x01,0x21,0x01,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02, 0x28,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x85,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x32,0x00,0x28,0x00,0x15,0x00,0x32,0x00,0x27,0x00,0x13,0x00, 0x2c,0x01,0x00,0x02,0x29,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x00, 0x85,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x29,0x00,0x00,0x87,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x2b,0x00, 0x02,0x2a,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x14,0x00,0x31, 0x13,0x00,0x2c,0x00,0x01,0x02,0x2a,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x00,0x85,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x14,0x00,0x2a,0x00,0x2a, 0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x2b,0x00,0x00,0x70,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x2b,0x00,0x00, 0x87,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x32,0x00,0x00,0x00,0x16,0x00,0x31,0x15,0x00,0x32,0x00,0x27,0x00,0x16,0x00, 0x2c,0x00,0x01,0x02,0x2c,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x00, 0x69,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x16,0x00,0x2a,0x00,0x2c,0x00,0x00, 0x71,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x2d,0x00,0x00,0x71,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x2d,0x00,0x00,0x87,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x25, 0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x07,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x79,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x2c,0x00,0x00, 0x02,0x2e,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00, 0x00,0x00,0x29,0x00,0x2e,0x80,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x2f,0x00,0x00,0x88,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x04,0x00,0x00,0x00,0x00,0x2a,0x00,0x2f,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c, 0x00,0x00,0x02,0x30,0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03, 0x00,0x00,0x00,0x00,0x2a,0x00,0x30,0x00,0x00,0x87,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c, 0x00,0x00,0x02,0x31,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03, 0x00,0x00,0x00,0x00,0x29,0x00,0x31,0x80,0x00,0x86,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2b,0x00,0x02,0x38,0x00,0x05,0x00,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x32,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x03,0x21, 0x01,0x00,0x85,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x32,0x00,0x32,0x00,0x19,0x00, 0x2c,0x00,0x00,0x02,0x33,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x00, 0x85,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x32,0x00,0x33,0x00,0x17,0x00,0x2c,0x01, 0x00,0x02,0x34,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0x85,0x04, 0x00,0x00,0x00,0x01,0x21,0x01,0x2a,0x01,0x34,0x00,0x00,0x79,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x0a,0x22,0x01,0x00,0x79,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x2b,0x00,0x02,0x35,0x00,0x05,0x00,0x00,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x18,0x00,0x31,0x17,0x00,0x2c,0x00,0x01,0x02,0x35,0x00,0x00, 0x69,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0x85,0x04,0x00,0x00,0x00,0x01,0x21, 0x01,0x31,0x18,0x00,0x2a,0x00,0x35,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01, 0x02,0x36,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00, 0x00,0x00,0x2a,0x01,0x36,0x00,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x42,0x02,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x32,0x00,0x00,0x00,0x1a,0x00,0x31,0x19,0x00,0x2c,0x00,0x00,0x02,0x37,0x00, 0x00,0x69,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x03, 0x21,0x01,0x32,0x00,0x37,0x00,0x1a,0x00,0x2c,0x00,0x01,0x02,0x38,0x00,0x00,0x69, 0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0x69,0x02,0x00,0x00,0x00,0x03,0x21,0x01, 0x31,0x1a,0x00,0x2a,0x00,0x38,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0x02, 0x39,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x2a,0x01,0x39,0x00,0x00,0x87,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x42, 0x02,0x00,0x00,0x00,0x06,0x22,0x01,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x25,0x00,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02, 0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x04,0x07,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x3a,0x00,0x00,0x7c, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x00,0x3a, 0x80,0x00,0x86,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x2c,0x00,0x00,0x02,0x3b,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x04,0x00,0x00,0x00,0x00,0x2a,0x00,0x3b,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x3c,0x00, 0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a, 0x00,0x3c,0x00,0x00,0x88,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00, 0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x3d,0x00, 0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x00,0x3d,0x80,0x00,0x86,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x1d,0x00,0x31,0x1b,0x00,0x29,0x01,0x00,0x00,0x00, 0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x32,0x00,0x00,0x00,0x1d,0x00,0x31,0x1c,0x00,0x29,0x01,0x00,0x00,0x00,0x88, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x31,0x1d,0x00,0x29,0x00,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xac,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x89,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x05,0x00,0x02,0x00, 0x8a,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8b,0x04,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x00,0x05,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8a,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x8c, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x04,0x00,0x00,0x00,0x16,0x22,0x01, 0x05,0x01,0xf0,0xff,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x8e,0x04,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x03,0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1e,0x00,0x29,0x00,0x00,0x00,0x00, 0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x02,0x00,0x00,0x29,0x01, 0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x04,0x00,0x00,0x00,0x12,0x21,0x01, 0x24,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x04,0x00,0x00,0x00,0x11, 0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x10,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x91, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00, 0x00,0x92,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x92,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8b, 0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00,0x00,0x93,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8b,0x02, 0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x10,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8d,0x04,0x00,0x00,0x00,0x16,0x22, 0x01,0x2c,0x01,0x02,0x02,0x3e,0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x3e,0x00,0x00,0x96,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x92,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x04,0x02,0x3f,0x00,0x00,0x91, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x93,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x2a,0x01,0x3f,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x8d,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x20,0x01,0x00,0x00,0x00,0x9e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0xfc,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xac,0x02,0x00, 0x00,0x00,0x04,0x22,0x01,0x2c,0x01,0x02,0x02,0x40,0x00,0x00,0x90,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x40, 0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x8d,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x98, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x05,0x00,0x00,0x00,0x10,0x8d,0x04, 0x00,0x00,0x00,0x16,0x22,0x01,0x20,0x01,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xfc,0xff, 0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x98,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xac,0x02,0x00,0x00,0x00,0x04,0x22, 0x01,0x2c,0x01,0x04,0x02,0x41,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x01,0x00,0x00,0x00,0x2a,0x01,0x41,0x00,0x00,0x98,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x96,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x01, 0x00,0x02,0x00,0x98,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff, 0xff,0x29,0x01,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x90,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x01,0xf0, 0xff,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x91,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x26, 0x01,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00, 0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x20,0x00,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x9a, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00, 0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x99,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00, 0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x99,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x01,0x00,0x00,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x8d,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x2c,0x01,0x02,0x02,0x42,0x00, 0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9c,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x2a,0x01,0x42,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x2c,0x01,0x04,0x02,0x43,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x9c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x43,0x00,0x00,0x9f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x8d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x9d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac, 0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x9e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xac,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x2c,0x01,0x02,0x02,0x44,0x00,0x00,0x90,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01, 0x44,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00, 0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x8d,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x05,0x00,0x00,0x00,0x10,0x8d, 0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x20,0x01,0x00,0x00,0x00,0xa1,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xfc, 0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xac,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x2c,0x01,0x04,0x02,0x45,0x00,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2a,0x01,0x45,0x00,0x00,0xa1,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9f,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0xa1,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff, 0xff,0xff,0x29,0x01,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x8b,0x04,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00, 0x00,0x00,0x00,0x8b,0x04,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x28,0x00,0x00,0x00, 0x00,0x02,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x92,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x93,0x04,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x01,0x70,0x00,0x00,0x00, 0x25,0x01,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x03,0x00,0x00,0x00,0x20,0x01,0x00,0x00, 0x00,0xa3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x02,0x00,0x00,0x00,0x00, 0x24,0x01,0x05,0x05,0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xa4,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x05, 0x04,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x01,0x0a,0x00, 0x02,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x01,0x0b,0x00,0x02, 0x00,0x8d,0x04,0x00,0x00,0x01,0x0a,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8b,0x04, 0x00,0x00,0x01,0x07,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x20, 0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x01,0x1c,0x00,0x02,0x00,0x8d,0x04,0x00, 0x00,0x01,0x1c,0x21,0x01,0x05,0x05,0x7f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x8d,0x04,0x00,0x00,0x01,0x1d,0x00,0x02,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x04,0x07,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x00,0x95,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xa6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x46,0x00,0x00,0xa6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x46,0x00,0x00,0x96, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x05,0x03,0x55, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x8d,0x04,0x00,0x00,0x01,0x1f,0x00,0x02, 0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xa8,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x04,0x07,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x97,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x97,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x01,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x00,0x00, 0x02,0x47,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00, 0x00,0x00,0x2a,0x00,0x47,0x00,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x03,0x00,0x00,0x00,0x00,0x05,0x03,0xaa,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00, 0x8d,0x04,0x00,0x00,0x01,0x1f,0x00,0x02,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x8d,0x04,0x00,0x00,0x01,0x1f,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xab, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x28,0x00,0x00,0x00,0x01,0x06,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x99,0x04, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x99,0x04,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x87,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x9a,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01, 0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x9a,0x04,0x00,0x00,0x00,0x02,0x00, 0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xb3, 0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x03,0x06,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0x9b,0x04,0x00,0x00,0x01,0x07,0x00,0x02,0x00,0x52,0x02, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x01, 0x02,0x00,0x02,0x00,0x3d,0x04,0x00,0x00,0x00,0x01,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0xb3,0x02,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x3d,0x04,0x00,0x00,0x00,0x05, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00, 0xb4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x25,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83, 0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x04,0x04,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x04,0x00,0x00,0x00, 0x03,0x21,0x01,0x05,0x05,0xf0,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x9d,0x04, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x9e,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xb1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x05,0x04, 0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9c,0x04,0x00,0x00,0x00,0x07,0x21,0x01,0x05,0x05,0xf0,0xff,0xff,0xff, 0x21,0x00,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x00,0x11,0x00,0x02,0x00,0xb2,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x01,0x00,0x00,0x00,0x9d,0x04,0x00,0x00,0x00,0x12,0x00,0x02,0x00,0xa0,0x04,0x00, 0x00,0x00,0x05,0x23,0x01,0x29,0x00,0x00,0x00,0x00,0xa1,0x04,0x00,0x00,0x00,0x0a, 0x00,0x02,0x00,0xa2,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xb4,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0xa3,0x04,0x00,0x00,0x00,0x01,0x21, 0x01,0x29,0x02,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x85, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb4,0x02,0x00,0x00, 0x01,0x04,0x00,0x02,0x00,0x84,0x02,0x00,0x00,0x00,0x01,0x22,0x01,0x20,0x00,0x00, 0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x04,0x00,0x00,0x00, 0x0e,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xc7,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x29, 0x00,0x00,0x00,0x00,0xc7,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x01,0x04,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xa4,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xb3, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa4,0x04,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x00,0x20,0x78,0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00, 0x00,0x00,0x08,0x07,0x00,0xa7,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xb7,0x02,0x00, 0x00,0x00,0x00,0xa6,0x04,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xb8,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x02,0x00,0x00,0x06,0x06,0x22,0x01,0x00, 0xc9,0x02,0x00,0x00,0x06,0x04,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xbb,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb8, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x20,0x00,0x00,0x00,0x00,0xb9,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8d,0x04,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x01, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa8,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x2b, 0x85,0x02,0x48,0x00,0x00,0xa9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x48, 0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff, 0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x48,0x00,0x00,0xbc,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x00,0xa6,0x04,0x00, 0x00,0x00,0x05,0x21,0x01,0x2c,0x00,0x01,0x02,0x49,0x00,0x00,0xb5,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x4a,0x00, 0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x23,0x00,0x00,0x00,0x02,0x4b,0x00,0x02,0x49,0x00,0x2c,0x00,0x01,0x02, 0x4c,0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x02,0x4d,0x00,0x02,0x4a,0x00,0x02,0x4b,0x00,0x20,0x00, 0x00,0x00,0x02,0x4e,0x00,0x02,0x49,0x00,0x02,0x4c,0x00,0x21,0x00,0x00,0x00,0x02, 0x4f,0x00,0x02,0x4e,0x00,0x02,0x4d,0x00,0x2a,0x00,0x4f,0x00,0x00,0xa6,0x04,0x00, 0x00,0x00,0x05,0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x00,0xbc,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x2a,0x00,0x48,0x00,0x00,0xa6,0x04,0x00,0x00,0x00,0x04,0x00, 0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x00,0xa6,0x04,0x00,0x00,0x00,0x04,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xbe,0x02, 0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01,0xff,0xff,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xbe,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x01,0xff,0xff,0xff,0xff,0x29, 0x04,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x06,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x50,0x00,0x00,0xb9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x02,0x51,0x00,0x02,0x50,0x00,0x02,0x4f,0x00,0x32,0x00,0x51,0x80,0x1f,0x00, 0x29,0x04,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0xab,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x02,0x00, 0x22,0x01,0x20,0x00,0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x00,0x0d,0x00,0x02,0x00, 0xac,0x04,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x21,0x00, 0x00,0x00,0x00,0xac,0x04,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0xac,0x04,0x00,0x00, 0x00,0x0d,0x21,0x01,0x05,0x05,0x07,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xc0, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x01,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xac,0x02, 0x00,0x00,0x00,0x02,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0xab,0x04,0x00,0x00,0x03, 0x00,0x00,0x02,0x00,0xc7,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x00,0x00,0x00, 0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x00,0xc0,0xb8,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00, 0x00,0x06,0x0b,0x00,0xae,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0xc0,0x02,0x00,0x00, 0x00,0x00,0xad,0x04,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xaa,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00, 0x06,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x00,0x14,0x00, 0x02,0x00,0xb0,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x00,0x15,0x00,0x02,0x00,0xb0,0x04, 0x00,0x00,0x00,0x19,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xaf,0x04,0x00,0x00,0x00, 0x16,0x00,0x02,0x00,0xb0,0x04,0x00,0x00,0x00,0x1a,0x21,0x01,0x20,0x00,0x00,0x00, 0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x04,0x00,0x00,0x00,0x0e, 0x21,0x01,0x05,0x03,0xfb,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0xc2,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x04,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x03, 0x04,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x52,0x00,0x00,0xb0,0x04,0x00,0x00,0x00, 0x19,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00,0x52,0x00,0x00,0xb1,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xc2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8d,0x04,0x00, 0x00,0x00,0x0e,0x00,0x02,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00, 0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x04,0x00,0x00, 0x00,0x0d,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x53,0x00, 0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x32, 0x00,0x53,0x00,0x1f,0x00,0x29,0x04,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0xb2,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xb2,0x04,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0xc1, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xb2,0x04,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00,0x03,0x00,0x22,0x01,0x20,0x00,0x00, 0x00,0x00,0xb3,0x04,0x00,0x00,0x02,0x14,0x00,0x02,0x00,0xaf,0x04,0x00,0x00,0x00, 0x14,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xb3,0x04, 0x00,0x00,0x02,0x15,0x00,0x02,0x00,0xaf,0x04,0x00,0x00,0x00,0x15,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xb3,0x04,0x00,0x00,0x02,0x16,0x00,0x02,0x00,0xaf,0x04,0x00, 0x00,0x00,0x16,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x60,0x78, 0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0xb5,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0xc6,0x02,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00, 0x00,0x31,0x1f,0x00,0x29,0x00,0x00,0x00,0x00,0xb4,0x04,0x00,0x00,0x00,0x06,0x00, 0x02,0x00,0xa6,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb4, 0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0xa6,0x04,0x00,0x00,0x00,0x05,0x21,0x01, 0x2c,0x00,0x04,0x02,0x54,0x00,0x00,0xa6,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x00, 0xb4,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x32,0x00,0x54,0x00,0x22,0x00,0x32,0x00, 0x49,0x00,0x20,0x00,0x2c,0x00,0x04,0x02,0x55,0x00,0x00,0xa6,0x04,0x00,0x00,0x00, 0x05,0x21,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x55,0x00, 0x24,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x31,0x20,0x00,0x2c,0x00,0x00,0x02,0x56, 0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00, 0x32,0x00,0x56,0x00,0x23,0x00,0x31,0x21,0x00,0x2c,0x00,0x04,0x02,0x57,0x00,0x00, 0xa6,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xb4,0x04,0x00,0x00,0x00,0x04,0x21, 0x01,0x32,0x00,0x57,0x00,0x22,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x04,0x00,0x00, 0x06,0x01,0x00,0x02,0x00,0xb6,0x04,0x00,0x00,0x06,0x01,0x21,0x01,0x29,0x02,0x00, 0x00,0x00,0xb4,0x04,0x00,0x00,0x06,0x04,0x00,0x02,0x00,0xa6,0x04,0x00,0x00,0x06, 0x04,0x22,0x01,0x32,0x00,0x00,0x00,0x25,0x00,0x31,0x22,0x00,0x21,0x00,0x00,0x00, 0x02,0x58,0x00,0x02,0x4c,0x00,0x02,0x4b,0x00,0x32,0x00,0x58,0x00,0x24,0x00,0x31, 0x23,0x00,0x29,0x00,0x00,0x00,0x00,0xa6,0x04,0x00,0x00,0x00,0x05,0x00,0x02,0x05, 0x02,0x00,0x00,0x00,0x00,0x31,0x24,0x00,0x29,0x03,0x00,0x00,0x00,0xaa,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xaa,0x04,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0xb6,0x04,0x00,0x00, 0x06,0x00,0x22,0x01,0x31,0x25,0x00,0x2c,0x02,0x02,0x02,0x59,0x00,0x00,0xb4,0x04, 0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xb4,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x2a, 0x02,0x59,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00, 0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xce,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05, 0xf8,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x05,0xc0,0xff,0xff,0xff, 0x20,0x00,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02, 0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x05,0x1f,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00, 0xce,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00, 0x00,0x02,0x00,0x02,0x05,0x05,0x0e,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xcd, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x03,0x21,0x01, 0x05,0x05,0x1f,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00, 0x03,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x80,0xff, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x00, 0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x05,0xcf,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0xc8,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x20,0x00,0x00, 0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x04,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0xd0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xec,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x2c,0x00,0x00,0x02,0x5a,0x00,0x00,0xc8, 0x02,0x00,0x00,0x00,0x19,0x21,0x01,0x05,0x05,0x00,0x00,0x00,0x00,0x2a,0x00,0x5a, 0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0x01,0x00, 0x00,0x00,0x2c,0x00,0x00,0x02,0x5b,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x5b,0x00,0x00,0xb8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb9,0x04,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xba,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xec,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x05,0x0e,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xce,0x02,0x00, 0x00,0x00,0x03,0x21,0x01,0x2a,0x02,0x59,0x00,0x00,0xbb,0x04,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbc,0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb9,0x04,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x21,0x00,0x00,0x00,0x00,0xd4, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x05,0x04,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x5c,0x00,0x00,0xb4,0x04,0x00, 0x00,0x00,0x05,0x21,0x01,0x05,0x02,0xff,0xff,0x00,0x00,0x2a,0x00,0x5c,0x00,0x00, 0xbd,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb9,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xec, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x01,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x04, 0x00,0x00,0x00,0x04,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0xaa,0x04,0x00,0x00,0x00,0x06,0x21,0x01,0x05,0x01,0xff,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x02, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xbf,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x04,0x00,0x00,0x00,0x19,0x22,0x01,0x20,0x00, 0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xaa,0x04,0x00,0x00, 0x06,0x00,0x21,0x01,0x05,0x01,0x0f,0x0f,0x0f,0x0f,0x25,0x00,0x00,0x00,0x00,0xd7, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x04,0x00,0x00,0x06,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0xc2,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0f,0x0f, 0x0f,0x0f,0x20,0x00,0x00,0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x02,0x00,0x00, 0x00,0x1a,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd8, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x04,0x00,0x00,0x00,0x1a,0x21,0x01, 0x05,0x04,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0xc3,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x05,0x03,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc0,0x04,0x00,0x00,0x00,0x1a,0x21,0x01,0x05,0x04,0x04,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xc4,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x05,0x03,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0xc5, 0x04,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xc0,0x04,0x00,0x00,0x00,0x1a,0x21,0x01, 0x05,0x04,0x06,0x00,0x00,0x00,0x2c,0x02,0x00,0x02,0x5d,0x00,0x00,0xc6,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x2a,0x02,0x5d,0x00,0x00, 0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03, 0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xdb,0x02, 0x00,0x00,0x00,0x02,0x21,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x01,0x00,0x02, 0x5e,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x2a,0x01,0x5e,0x00,0x00,0xc7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5, 0x04,0x00,0x00,0x00,0x01,0x22,0x01,0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x00,0x02,0x5f,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x05, 0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x5f,0x00,0x00,0xc7,0x04,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0xc5,0x04,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0xc5,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x00,0x00,0x00,0x00,0xe5, 0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xdd,0x02,0x00,0x00,0x00,0x04,0x21,0x01, 0x2c,0x02,0x00,0x02,0x60,0x00,0x00,0xc6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x02,0x01,0x00,0x00,0x00,0x2a,0x02,0x60,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x01,0x01,0x02,0x61,0x00, 0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a, 0x01,0x61,0x00,0x00,0xc8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x04,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0xc5,0x04,0x00,0x00,0x00,0x02,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xe0,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x2a,0x01,0x61,0x00,0x00,0xc9,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc5,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc5,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x2c,0x02,0x00,0x02,0x62,0x00,0x00, 0xc6,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x02,0x00,0x00,0x00,0x2a,0x02, 0x62,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0xe3,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01, 0x00,0x00,0x00,0x2c,0x01,0x00,0x02,0x63,0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x01,0x63,0x00,0x00,0xca,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x04,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xc5, 0x04,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xe5,0x02,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x20,0x02,0x00, 0x00,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x04,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x02,0x00,0x02,0x64,0x00,0x00, 0xe6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x02, 0x64,0x00,0x00,0xcb,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x04,0x00,0x00, 0x00,0x04,0x22,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0xbf, 0x04,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x23,0x01, 0x20,0x02,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x04, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x03,0x00,0x00,0x00,0x2c,0x02,0x00,0x02, 0x65,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00, 0x00,0x2a,0x02,0x65,0x00,0x00,0xcc,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0xff,0x00,0x00,0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x08,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xbf,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xe9,0x02,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x01,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xb7,0x04, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x20, 0x01,0x00,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0xeb,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xca,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x2c,0x01,0x00,0x02,0x66,0x00,0x00,0xeb,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x01,0x66,0x80, 0x00,0xb7,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x2c,0x00,0x00,0x02,0x67,0x00,0x00,0xeb,0x02,0x00,0x00,0x00,0x02,0x21, 0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x00,0x67,0x80,0x00,0xb7,0x04,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xcd,0x04,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x00, 0x06,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x00,0x09,0x00,0x02, 0x00,0xb4,0x04,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0xcd,0x04, 0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xb4,0x04,0x00,0x00,0x06,0x04,0x22,0x01,0x29, 0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xaa,0x04,0x00, 0x00,0x06,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x01,0x02, 0x00,0x02,0x00,0x99,0x04,0x00,0x00,0x01,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xcd,0x04,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x99,0x04,0x00,0x00,0x01,0x01,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x99, 0x04,0x00,0x00,0x01,0x02,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xcd,0x04,0x00,0x00, 0x01,0x05,0x00,0x02,0x00,0x99,0x04,0x00,0x00,0x01,0x03,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xb7,0x04,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0xaa,0x04,0x00,0x00,0x01, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xb7,0x04,0x00,0x00,0x01,0x04,0x00,0x02, 0x00,0xaa,0x04,0x00,0x00,0x01,0x01,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0xed,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x36,0x02,0x0a,0x00,0xce,0x04,0x00,0x00,0x00,0x00,0x21, 0x01,0xec,0x02,0x00,0x00,0x00,0x00,0x5c,0x01,0x01,0x03,0x00,0x00,0x00,0xee,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x20,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0xf1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x20, 0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x7f,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xf0, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x06,0x00,0x02,0x05,0x01,0xbf, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x05,0x00,0x02, 0x05,0x01,0xdf,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x05,0x01,0xef,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf0,0x02, 0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01,0xf7,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xf0,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x01,0xfb,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0xfd,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0xfe,0x00,0x00,0x00,0x73,0x08,0x03,0x00,0x00,0x0c,0xcf,0x04,0x00,0x00,0x00, 0x00,0xd0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x0a,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd1,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xd1, 0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xee,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xf3,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd2,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21, 0x00,0x00,0x00,0x00,0xd2,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0xee,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x5d,0x00, 0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xf5, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03, 0x00,0x00,0x00,0xd3,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xd3,0x04,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xee,0x02,0x00,0x00,0x00, 0x02,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00, 0x01,0x00,0x08,0x02,0xf7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd4,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xd4,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x00, 0xee,0x02,0x00,0x00,0x00,0x03,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xf9,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xfa,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd5,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00, 0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00, 0x00,0x04,0x21,0x01,0x00,0xee,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x5d,0x00,0x04, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xfb,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xfc, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfc,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xd6,0x04,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xee,0x02,0x00,0x00,0x00,0x05, 0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01, 0x00,0x08,0x02,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd7,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00,0x00,0x00,0xd7,0x04,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xee, 0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x5d,0x00,0x04,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0xff,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xd8,0x04,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x21,0x00,0x00, 0x00,0x00,0xd8,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00, 0x07,0x21,0x01,0x00,0xee,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x5d,0x00,0x04,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x08,0x02,0x01,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x1e,0x00, 0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x29,0x00,0x00,0x00, 0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07,0x08,0x00,0x80,0x3f,0x29,0x00, 0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x03,0x00,0x00, 0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x05, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xd9,0x04, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x30,0x03,0x00,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x08, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x08,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x04,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdc,0x04,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c, 0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x12, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0f,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x10, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x0f,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x11,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0e,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x13,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x13,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xda,0x04,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x13,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x68,0x00,0x00,0xdc,0x04,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x68,0x00,0x00, 0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x07, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xda,0x04, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x61,0x01,0x03,0xa2, 0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02, 0x00,0x04,0x48,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x05,0x64,0x04,0x03,0x00,0xa0, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02, 0x00,0x02,0x18,0x02,0x68,0x00,0x00,0x80,0x10,0x82,0xe6,0x01,0x24,0x00,0x00,0x01, 0x0c,0x00,0x0c,0x00,0x31,0xb1,0x03,0x80,0x00,0x00,0x05,0x69,0x04,0x04,0x00,0xa0, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x06,0x68,0x24,0x00,0x00,0x01, 0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x15,0x68,0xe4,0x01,0x00,0x01, 0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x00,0xa0,0x0a,0x25,0x68,0x64,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0x60,0x01,0x05,0x6a,0x05,0x68,0x22,0x00, 0x00,0x00,0x00,0x00,0x69,0x01,0x01,0x00,0x60,0x86,0x85,0x68,0x05,0x6a,0x22,0x05, 0x04,0x00,0x04,0x00,0x40,0x20,0x00,0x00,0x50,0x80,0x85,0x02,0x94,0x64,0x00,0x05, 0x01,0x00,0x01,0x00,0x5b,0x01,0x00,0x00,0x20,0x02,0x44,0x68,0x04,0x6a,0x01,0x01, 0x14,0x68,0x84,0x02,0x70,0x21,0x00,0x00,0x50,0x84,0x01,0x00,0xa4,0x69,0x00,0x55, 0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x2e,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x84,0x01,0x00,0xa4,0x69,0x00,0x15, 0x04,0x00,0x04,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x38,0x00,0x00,0x69,0x00,0x01,0x68,0x8a,0x6a,0x61,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0x85,0x02,0x24,0x6a,0x00,0x05,0x06,0x00,0x06,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x0f,0x00,0x0f,0x00,0x61,0x05,0x03,0x62,0x80,0x01,0x11,0x00,0x61,0x05,0x00,0x80, 0xa0,0x0a,0x25,0x03,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0xa5,0x02,0xe4,0x01,0x00,0x05,0x10,0x00,0x10,0x00,0x31,0xa2,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0xc5,0x02,0x84,0x02,0x00,0x05,0x10,0x00,0x10,0x00,0x01,0x32,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x02,0x03,0x62,0x70,0x02,0x11,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0xe5,0x02,0xe4,0x01,0x00,0x05,0x20,0x00,0x20,0x00,0x31,0xa3,0x03,0x80, 0x00,0x00,0x05,0x1c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x33,0x03,0x62, 0x80,0x01,0x11,0x00,0x61,0x04,0x00,0x80,0xa0,0x0a,0x25,0x03,0xc4,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x22,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x04,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x04,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x06,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x06,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x07,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x07,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x08,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x08,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x09,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x09,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0b,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0b,0x34,0x00, 0x00,0x00,0x00,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x34,0x03,0x62,0x70,0x02,0x11,0x00,0x61,0x23,0x02,0x00, 0xa0,0x0a,0x85,0x0c,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xa5,0x03,0x80, 0x00,0x00,0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x12,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0d,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0e,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x10,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x13,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x14,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x18,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1a,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x38,0x05,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0f,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x16,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x11,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x15,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x19,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1b,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x34,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x3c,0x05,0x14,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x3a,0x05,0x13,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x17,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x40,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x05,0x00, 0x50,0x00,0x05,0x36,0x05,0x11,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x24,0x02,0x00, 0xa0,0x0a,0x05,0x24,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x25,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x26,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x27,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x04,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x28,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x29,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2a,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1c,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1d,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1e,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1f,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x20,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x25,0x02,0x00, 0xa0,0x0a,0x85,0x26,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x28,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1d,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x06,0x05,0x0d,0x46,0x05,0x05,0x04,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x08,0x05,0x0e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x24,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x29,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2a,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1c,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0c,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x2e,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x21,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x22,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x23,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2b,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x27,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1e,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1f,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x20,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x21,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x22,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x23,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2b,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x38,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x0a,0x05,0x0f,0x46,0x05,0x05,0x08,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x30,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x32,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x3e,0x05,0x15,0x46,0x05,0x05,0x3c,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x25,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x04,0x05,0x19,0x46,0x05,0x05,0x2e,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x08,0x05,0x1b,0x46,0x05,0x05,0x0c,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0e,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x34,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x12,0x05,0x27,0x46,0x05,0x05,0x30,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x14,0x05,0x29,0x46,0x05,0x05,0x32,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x2c,0x05,0x17,0x46,0x05,0x05,0x40,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x18,0x05,0x1e,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x1a,0x05,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x10,0x05,0x25,0x46,0x05,0x05,0x0e,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x2e,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x16,0x05,0x1c,0x46,0x05,0x05,0x34,0x46,0x00,0x40,0x04,0x05,0x00, 0x50,0x00,0x05,0x0e,0x05,0x22,0x46,0x05,0x05,0x1a,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x24,0x05,0x23,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x28,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x3e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x05,0x1e,0x04,0x2c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1f,0x04,0x04,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1c,0x04,0x3a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1a,0x04,0x12,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1b,0x04,0x14,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x23,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62, 0x80,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x20,0x46,0x05, 0x05,0x2e,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x01,0x20,0x58,0x05, 0x14,0x3e,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x33,0x05,0x1e,0x58,0x05, 0x14,0x2c,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x34,0x05,0x1f,0x58,0x05, 0x14,0x04,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x1c,0x58,0x05, 0x14,0x3a,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x1a,0x58,0x05, 0x14,0x12,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x1b,0x58,0x05, 0x14,0x14,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x28,0x58,0x05, 0x14,0x06,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x06,0x05,0x23,0x58,0x05, 0x14,0x18,0x20,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x2b,0x46,0x05, 0x05,0x24,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x36,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x0a,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x08,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x0c,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x0e,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x06,0x04,0x00,0x50,0x85,0x05,0x2b,0x04,0x26,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x30,0x01,0x20,0x58,0x05, 0x14,0x36,0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x2f,0x05,0x29,0x58,0x05, 0x14,0x0a,0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x20,0x58,0x05, 0x14,0x08,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x16,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x2c,0x68,0x82,0x01,0x01,0x03,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x07,0x05,0x24,0x58,0x05,0x14,0x0c,0x20,0x00,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x0a,0x05,0x25,0x58,0x05,0x14,0x0e,0x20,0x00,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x0b,0x05,0x2b,0x58,0x05,0x14,0x26,0x20,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x32,0x05,0x32,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x30,0x05,0x30,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x2e,0x05,0x2e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x34,0x05,0x34,0x46,0x01,0x02,0x00,0x02,0x00,0x01,0x36,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x07,0x03,0x62,0x00,0x2c,0x11,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x21,0x04,0x10,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x3d,0x01,0x20,0x58,0x05,0x14,0x16,0x20,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x06,0x05,0x06,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x0c,0x04,0x32,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x0d,0x04,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x08,0x04,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x09,0x04,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x04,0x04,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x05,0x04,0x2f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x0e,0x04,0x34,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x97,0x03,0x80, 0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x37,0x03,0x62, 0x80,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xc4,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x00,0xa0,0x0a,0x05,0x20,0x05,0x18,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x23,0x85,0x19,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x24,0x05,0x1a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x25,0x85,0x1c,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x26,0x05,0x1d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x27,0x85,0x1d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x28,0x05,0x1e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x29,0x85,0x1e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2a,0x05,0x1f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2b,0x85,0x1f,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x38,0x05,0x21,0x58,0x05, 0x14,0x10,0x20,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x22,0x05,0x19,0x34,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3c,0x05,0x3c,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x14,0x04,0x06,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x15,0x04,0x07,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x16,0x04,0x0a,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x17,0x04,0x0b,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x21,0x85,0x18,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x06,0x85,0x1a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x07,0x05,0x1b,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0a,0x85,0x1b,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0b,0x05,0x1c,0x34,0x00, 0x00,0x00,0x00,0x00,0x31,0x98,0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x38,0x03,0x62,0x00,0x2c,0x11,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x13,0x04,0x3d,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x99,0x03,0x80, 0x00,0x00,0x05,0x3d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x27,0x02,0x00, 0xa0,0x0a,0x85,0x20,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x0f,0x04,0x35,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x21,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x22,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00, 0x00,0x00,0x05,0x10,0x04,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x28,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2a,0x05,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x12,0x04,0x3c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x23,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x24,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x07,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x11,0x04,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x29,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2b,0x85,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x06,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0b,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x25,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x26,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x45,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0a,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x49,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x27,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x28,0x02,0x00, 0xa0,0x0a,0x05,0x35,0x05,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x36,0x85,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x37,0x05,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x38,0x85,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x18,0x05,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x39,0x05,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3a,0x85,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3b,0x05,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3c,0x85,0x1b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2d,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2e,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2f,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x30,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x1a,0x05,0x21,0x46,0x05,0x05,0x18,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x1c,0x05,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x29,0x02,0x00, 0xa0,0x0a,0x85,0x35,0x05,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x39,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x3a,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x3b,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x3c,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x20,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x3f,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x31,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x32,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x33,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x34,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2f,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x31,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x1e,0x05,0x23,0x46,0x05,0x05,0x1c,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x36,0x85,0x3d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x37,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x18,0x05,0x29,0x46,0x05,0x05,0x3f,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x1c,0x05,0x2b,0x46,0x05,0x05,0x20,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x22,0x05,0x35,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x47,0x05,0x06,0x46,0x05,0x05,0x45,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x30,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x32,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x33,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x3f,0x05,0x2f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x2a,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x4d,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x4b,0x05,0x0a,0x46,0x05,0x05,0x49,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x38,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2d,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2e,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x06,0x05,0x37,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x41,0x05,0x36,0x46,0x05,0x05,0x22,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x34,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x20,0x05,0x30,0x46,0x05,0x05,0x3f,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0a,0x05,0x39,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x22,0x05,0x32,0x46,0x05,0x05,0x2a,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x35,0x05,0x33,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x4f,0x05,0x25,0x46,0x05,0x05,0x4d,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x43,0x05,0x38,0x46,0x05,0x05,0x06,0x46,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0xc5,0x02,0x84,0x02,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x51,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x24,0x05,0x3a,0x46,0x05,0x05,0x0a,0x46,0x00,0x40,0x06,0x05,0x00, 0x50,0x00,0x05,0x06,0x05,0x34,0x46,0x05,0x05,0x35,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x45,0x05,0x3b,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x37,0x04,0x1a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x30,0x04,0x1c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x1e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x34,0x04,0x20,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x35,0x04,0x22,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62, 0x80,0x01,0x11,0x00,0x61,0x07,0x00,0x80,0xa0,0x0a,0x25,0x03,0xc4,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x27,0x46,0x05, 0x05,0x51,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x26,0x05,0x3c,0x46,0x05, 0x05,0x45,0x46,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x37,0x58,0x05, 0x14,0x1a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x01,0x20,0x58,0x05, 0x14,0x1e,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x46,0x05,0x30,0x58,0x05, 0x14,0x1c,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x1b,0x05,0x34,0x58,0x05, 0x14,0x20,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x35,0x58,0x05, 0x14,0x22,0x20,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x1c,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x49,0x05,0x2d,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x4b,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x0b,0x04,0x47,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x03,0x05,0x00,0x50,0x00,0x05,0x28,0x05,0x2e,0x46,0x05, 0x05,0x49,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x36,0x04,0x06,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2f,0x04,0x18,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x4f,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x01,0x20,0x58,0x05, 0x14,0x4b,0x20,0x00,0x40,0x06,0x04,0x00,0x50,0x05,0x05,0x3b,0x05,0x0b,0x58,0x05, 0x14,0x47,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x3d,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x31,0x04,0x41,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x32,0x04,0x26,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x05,0x33,0x04,0x28,0x20,0x05, 0x02,0x00,0x02,0x00,0x61,0x3a,0x03,0x62,0x70,0x02,0x11,0x00,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x0b,0x05,0x36,0x58,0x05,0x14,0x06,0x20,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x39,0x05,0x39,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x45,0x05,0x2f,0x58,0x05,0x14,0x18,0x20,0x00,0x40,0x07,0x04,0x00, 0x50,0x05,0x05,0x3f,0x05,0x2d,0x58,0x05,0x14,0x4f,0x20,0x00,0x61,0x2a,0x02,0x00, 0xa0,0x0a,0x05,0x06,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x1c,0x68, 0x5a,0x02,0x01,0x03,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3b,0x05,0x3b,0x46,0x01, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x01,0x20,0x58,0x05, 0x14,0x3d,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x31,0x58,0x05, 0x14,0x41,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x32,0x58,0x05, 0x14,0x26,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1a,0x05,0x33,0x58,0x05, 0x14,0x28,0x20,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x3b,0x03,0x62,0x80,0x01,0x11,0x00,0x61,0x07,0x03,0x62, 0x60,0x1c,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x43,0x20,0x05, 0x02,0x00,0x02,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x04,0x04,0x39,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x05,0x04,0x3a,0x20,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x45,0x05,0x45,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x08,0x04,0x3b,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x09,0x04,0x3c,0x20,0x00, 0x00,0x00,0x00,0x00,0x31,0x9c,0x03,0x80,0x00,0x00,0x05,0x35,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3f,0x05,0x3f,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x3c,0x03,0x62,0x70,0x02,0x11,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x4a,0x01,0x20,0x58,0x05,0x14,0x43,0x20,0x00,0x61,0x06,0x04,0x00, 0x00,0x00,0x85,0x0e,0x04,0x45,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x00,0x00,0x85,0x0c,0x04,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x0d,0x04,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x9d,0x03,0x80, 0x00,0x00,0x05,0x3e,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x24,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x1a,0x05,0x1a,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x2b,0x02,0x00, 0xa0,0x0a,0x85,0x06,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x4d,0x01,0x20,0x58,0x05,0x14,0x24,0x20,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x07,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x18,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x49,0x05,0x49,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x85,0x17,0x04,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x07,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x18,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x85,0x15,0x04,0x1b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x24,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0b,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1b,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x2c,0x02,0x00, 0xa0,0x0a,0x05,0x1d,0x05,0x35,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1e,0x85,0x35,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x20,0x85,0x36,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1f,0x05,0x36,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x35,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x28,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2a,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x28,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2a,0x05,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x24,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1b,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x19,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x26,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x19,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x4d,0x05,0x4d,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0b,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2d,0x85,0x38,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2e,0x05,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x22,0x85,0x37,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x23,0x05,0x38,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2f,0x85,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x30,0x05,0x3a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x21,0x05,0x37,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x31,0x85,0x3a,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x37,0x05,0x07,0x46,0x05,0x05,0x35,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x39,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x27,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x29,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x0f,0x04,0x46,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x16,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x26,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x29,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x14,0x04,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2b,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2b,0x85,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x11,0x04,0x4a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x2d,0x02,0x00, 0xa0,0x0a,0x85,0x2d,0x85,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1d,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x35,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x21,0x05,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x22,0x85,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x46,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0a,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0a,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1a,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1a,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x23,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x4a,0x05,0x1b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x40,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x27,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3d,0x85,0x3c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x33,0x85,0x3b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x34,0x05,0x3c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2e,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x32,0x05,0x3b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1f,0x05,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x30,0x05,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x32,0x05,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x3b,0x05,0x19,0x46,0x05,0x05,0x39,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x25,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x25,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x10,0x04,0x49,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x12,0x04,0x4d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x85,0x13,0x04,0x4e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x52,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1e,0x85,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x06,0x05,0x29,0x46,0x05,0x05,0x40,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x18,0x05,0x2b,0x46,0x05,0x05,0x35,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x39,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x48,0x05,0x1a,0x46,0x05,0x05,0x46,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x4c,0x05,0x0a,0x46,0x05,0x05,0x4a,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x4e,0x05,0x0b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x33,0x85,0x44,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2f,0x85,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x20,0x85,0x3f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x31,0x85,0x43,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x40,0x05,0x30,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x35,0x05,0x32,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x1a,0x05,0x1f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x46,0x05,0x23,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x4a,0x05,0x2e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0a,0x05,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x50,0x05,0x25,0x46,0x05,0x05,0x4e,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x3e,0x05,0x27,0x46,0x05,0x05,0x52,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x42,0x05,0x1e,0x46,0x05,0x05,0x39,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x3d,0x85,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x34,0x05,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x2a,0x05,0x31,0x46,0x05,0x05,0x40,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x28,0x05,0x2f,0x46,0x05,0x05,0x4a,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x24,0x05,0x22,0x46,0x05,0x05,0x0a,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x26,0x05,0x2d,0x46,0x05,0x05,0x46,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x1d,0x05,0x33,0x46,0x05,0x05,0x35,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x44,0x05,0x20,0x46,0x05,0x05,0x1a,0x46,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x39,0x05,0x34,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1f,0x04,0x37,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x05,0x2e,0x04,0x42,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x05,0x32,0x04,0x28,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x0a,0x04,0x3b,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x05,0x30,0x04,0x24,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x2d,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x05,0x31,0x04,0x26,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x33,0x04,0x2a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x44,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x34,0x04,0x1d,0x20,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x03,0x62, 0x80,0x02,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xc4,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x1a,0x05,0x3d,0x46,0x05, 0x05,0x39,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4e,0x05,0x2e,0x58,0x05, 0x14,0x42,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x32,0x58,0x05, 0x14,0x28,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x52,0x05,0x30,0x58,0x05, 0x14,0x24,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x2d,0x58,0x05, 0x14,0x18,0x20,0x00,0x40,0x07,0x04,0x00,0x50,0x05,0x05,0x53,0x05,0x31,0x58,0x05, 0x14,0x26,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4f,0x01,0x20,0x58,0x05, 0x14,0x44,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x1f,0x58,0x05, 0x14,0x37,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x0a,0x58,0x05, 0x14,0x3b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x37,0x05,0x33,0x58,0x05, 0x14,0x2a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x0a,0x05,0x34,0x58,0x05, 0x14,0x1d,0x20,0x00,0x31,0x9e,0x03,0x80,0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x48,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x4c,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x35,0x04,0x1a,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x01,0x20,0x58,0x05, 0x14,0x48,0x20,0x00,0x40,0x03,0x04,0x00,0x50,0x05,0x05,0x41,0x05,0x20,0x58,0x05, 0x14,0x4c,0x20,0x00,0x40,0x03,0x04,0x00,0x50,0x05,0x05,0x0b,0x05,0x35,0x58,0x05, 0x14,0x1a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x3e,0x20,0x05, 0x02,0x00,0x02,0x00,0x68,0x03,0x05,0x00,0x10,0x81,0x05,0x40,0x05,0x40,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x3e,0x03,0x62,0x00,0x2c,0x11,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x23,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x39,0x05,0x39,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x36,0x05,0x36,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x47,0x01,0x20,0x58,0x05,0x14,0x3e,0x20,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x18,0x04,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x19,0x04,0x41,0x20,0x00,0x00,0x00,0x00,0x00,0x31,0x9f,0x03,0x80, 0x00,0x00,0x05,0x3e,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x3f,0x03,0x62, 0x80,0x02,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x1c,0x11,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x50,0x20,0x05,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x52,0x05,0x52,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00, 0x10,0x81,0x05,0x4e,0x05,0x4e,0x46,0x01,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x4a,0x05,0x23,0x58,0x05,0x14,0x06,0x20,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x24,0x04,0x37,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00, 0x00,0x00,0x05,0x25,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x26,0x04,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x2e,0x02,0x00, 0xa0,0x0a,0x05,0x27,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x28,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x29,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2a,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2b,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x35,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x38,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3b,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3c,0x05,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3d,0x85,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x06,0x04,0x39,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x07,0x04,0x3a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x00,0x00,0x05,0x23,0x04,0x36,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x37,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0a,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0b,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x39,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3a,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x36,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80, 0x00,0x00,0x05,0x2d,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x30,0x03,0x62, 0x00,0x2c,0x11,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x46,0x01,0x20,0x58,0x05, 0x14,0x50,0x20,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x22,0x04,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1f,0x04,0x4e,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x20,0x04,0x4f,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x21,0x04,0x52,0x20,0x00, 0x00,0x00,0x00,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x4e,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x68,0x05,0x05,0x00,0x10,0x81,0x05,0x46,0x05,0x46,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x2f,0x02,0x00,0xa0,0x0a,0x85,0x27,0x05,0x3e,0x34,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x4a,0x05,0x4a,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x28,0x85,0x3e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x29,0x05,0x3f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x00,0x00,0x05,0x1a,0x04,0x46,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1b,0x04,0x47,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3c,0x05,0x45,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2a,0x85,0x3f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x2b,0x05,0x40,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x36,0x05,0x41,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3a,0x05,0x44,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x05,0x1d,0x04,0x4a,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x05,0x1e,0x04,0x4b,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0a,0x05,0x42,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x38,0x05,0x43,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3d,0x85,0x45,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x35,0x85,0x40,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x20,0x02,0x00,0xa0,0x0a,0x05,0x46,0x05,0x2d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x47,0x85,0x2d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2c,0x05,0x27,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x48,0x05,0x2e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x49,0x85,0x2e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4a,0x05,0x2f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4b,0x85,0x2f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4c,0x05,0x30,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x4d,0x85,0x30,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3e,0x05,0x31,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3f,0x85,0x31,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2e,0x05,0x28,0x46,0x05, 0x05,0x2c,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x30,0x05,0x29,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x21,0x02,0x00,0xa0,0x0a,0x85,0x46,0x05,0x4e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x48,0x05,0x4f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2c,0x05,0x3c,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x37,0x85,0x41,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x39,0x85,0x43,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3b,0x85,0x44,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x56,0x05,0x2b,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5a,0x05,0x36,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1c,0x05,0x32,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x40,0x85,0x32,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x41,0x05,0x33,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x42,0x85,0x33,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x43,0x05,0x34,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4a,0x05,0x50,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4b,0x85,0x50,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4c,0x05,0x51,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x4d,0x85,0x51,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x41,0x05,0x54,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x43,0x05,0x55,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x32,0x05,0x2a,0x46,0x05, 0x05,0x30,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x50,0x05,0x3a,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x0b,0x85,0x42,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5e,0x05,0x0a,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x62,0x05,0x38,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x47,0x85,0x4e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x49,0x85,0x4f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3e,0x05,0x52,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x3f,0x85,0x52,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x1c,0x05,0x53,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x40,0x85,0x53,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x3d,0x46,0x05, 0x05,0x2c,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x30,0x05,0x46,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x52,0x05,0x48,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x44,0x85,0x34,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x44,0x85,0x55,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x58,0x05,0x35,0x46,0x05, 0x05,0x56,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x5c,0x05,0x37,0x46,0x05, 0x05,0x5a,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x3b,0x46,0x05, 0x05,0x50,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x85,0x42,0x85,0x54,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3c,0x05,0x41,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x45,0x05,0x43,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x60,0x05,0x0b,0x46,0x05, 0x05,0x5e,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x4e,0x05,0x39,0x46,0x05, 0x05,0x62,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x34,0x05,0x47,0x46,0x05, 0x05,0x30,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x56,0x05,0x4c,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x36,0x05,0x49,0x46,0x05, 0x05,0x52,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x5a,0x05,0x3e,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x50,0x05,0x1c,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x54,0x05,0x4a,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x30,0x05,0x42,0x46,0x05, 0x05,0x3c,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x44,0x46,0x05, 0x05,0x45,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x32,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2d,0x04,0x2e,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x38,0x05,0x4d,0x46,0x05, 0x05,0x56,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x3a,0x05,0x3f,0x46,0x05, 0x05,0x5a,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x40,0x46,0x05, 0x05,0x50,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x4b,0x46,0x05, 0x05,0x54,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3f,0x04,0x4e,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x40,0x04,0x60,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x3e,0x04,0x5c,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x4a,0x04,0x58,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x07,0x04,0x00,0x50,0x85,0x05,0x46,0x04,0x47,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4c,0x01,0x20,0x58,0x05, 0x14,0x32,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x32,0x04,0x30,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x41,0x04,0x29,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x36,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x27,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x44,0x04,0x34,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x45,0x04,0x3a,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4b,0x05,0x2d,0x58,0x05, 0x14,0x2e,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x42,0x04,0x0a,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x33,0x04,0x2b,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x2f,0x04,0x38,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x40,0x58,0x05, 0x14,0x60,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x3f,0x58,0x05, 0x14,0x4e,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x05,0x3e,0x58,0x05, 0x14,0x5c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3c,0x05,0x4a,0x58,0x05, 0x14,0x58,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x46,0x58,0x05, 0x14,0x47,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x05,0x32,0x58,0x05, 0x14,0x30,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x51,0x01,0x20,0x58,0x05, 0x14,0x36,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x49,0x05,0x1c,0x58,0x05, 0x14,0x27,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x50,0x05,0x44,0x58,0x05, 0x14,0x34,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x54,0x05,0x45,0x58,0x05, 0x14,0x3a,0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x4b,0x05,0x4b,0x46,0x01, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x52,0x05,0x42,0x58,0x05, 0x14,0x0a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x55,0x05,0x33,0x58,0x05, 0x14,0x2b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x53,0x05,0x2f,0x58,0x05, 0x14,0x38,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x4a,0x05,0x41,0x58,0x05, 0x14,0x29,0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3c,0x05,0x3c,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x3e,0x05,0x3e,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x08,0x46,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x50,0x05,0x50,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x06,0x04,0x4b,0x20,0x00, 0x00,0x00,0x00,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x54,0x05,0x54,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x52,0x05,0x52,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x49,0x05,0x49,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x07,0x04,0x00,0x00,0x00,0x85,0x1a,0x04,0x2d,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1b,0x04,0x2e,0x20,0x00, 0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x27,0x05,0x05,0x46,0x05, 0x05,0x0a,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x2b,0x05,0x09,0x46,0x05, 0x05,0x29,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x0c,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x0e,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x10,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x07,0x04,0x4c,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x12,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x18,0x04,0x3c,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x19,0x04,0x3d,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x25,0x04,0x3e,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x16,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x06,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x14,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1f,0x04,0x50,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x23,0x04,0x54,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x21,0x04,0x52,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1d,0x04,0x49,0x20,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x2f,0x05,0x0d,0x46,0x05, 0x05,0x2d,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x33,0x05,0x0f,0x46,0x05, 0x05,0x31,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x37,0x05,0x11,0x46,0x05, 0x05,0x35,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x3b,0x05,0x13,0x46,0x05, 0x05,0x39,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x08,0x05,0x17,0x46,0x05, 0x05,0x0a,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x04,0x05,0x15,0x46,0x05, 0x05,0x3d,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0c,0x05,0x07,0x46,0x05, 0x05,0x29,0x46,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x2d,0x05,0x18,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x26,0x04,0x3f,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x20,0x04,0x51,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x24,0x04,0x55,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x22,0x04,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x00,0x00,0x85,0x1e,0x04,0x4a,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x31,0x05,0x1a,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x35,0x05,0x1d,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x1f,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x16,0x05,0x23,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x21,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x29,0x05,0x25,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x0e,0x05,0x19,0x46,0x05, 0x05,0x2d,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x10,0x05,0x1b,0x46,0x05, 0x05,0x31,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x12,0x05,0x1e,0x46,0x05, 0x05,0x35,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x14,0x05,0x20,0x46,0x05, 0x05,0x39,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x06,0x05,0x24,0x46,0x05, 0x05,0x16,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x0a,0x05,0x22,0x46,0x05, 0x05,0x3d,0x46,0x00,0x40,0x07,0x05,0x00,0x50,0x00,0x05,0x18,0x05,0x26,0x46,0x05, 0x05,0x29,0x46,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1c,0x04,0x2f,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1a,0x04,0x27,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1d,0x04,0x33,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1f,0x04,0x3b,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x21,0x04,0x08,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1b,0x04,0x2b,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x1e,0x04,0x37,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x23,0x04,0x12,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x20,0x04,0x04,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x16,0x04,0x0e,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x17,0x04,0x10,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x24,0x04,0x14,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x01,0x20,0x04,0x0c,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x25,0x04,0x0a,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x26,0x04,0x06,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x85,0x05,0x29,0x04,0x18,0x20,0x05, 0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x31,0x05,0x1c,0x58,0x05, 0x14,0x2f,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2d,0x05,0x1a,0x58,0x05, 0x14,0x27,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x32,0x05,0x1d,0x58,0x05, 0x14,0x33,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x36,0x05,0x1f,0x58,0x05, 0x14,0x3b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3a,0x05,0x21,0x58,0x05, 0x14,0x08,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x2e,0x05,0x1b,0x58,0x05, 0x14,0x2b,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x35,0x05,0x1e,0x58,0x05, 0x14,0x37,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x40,0x05,0x23,0x58,0x05, 0x14,0x12,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x39,0x05,0x20,0x58,0x05, 0x14,0x04,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3e,0x05,0x16,0x58,0x05, 0x14,0x0e,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3f,0x05,0x17,0x58,0x05, 0x14,0x10,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x3d,0x01,0x20,0x58,0x05, 0x14,0x0c,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x27,0x05,0x24,0x58,0x05, 0x14,0x14,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x28,0x05,0x25,0x58,0x05, 0x14,0x0a,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1a,0x05,0x26,0x58,0x05, 0x14,0x06,0x20,0x00,0x40,0x00,0x04,0x00,0x50,0x05,0x05,0x1b,0x05,0x29,0x58,0x05, 0x14,0x18,0x20,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x31,0x05,0x31,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x2d,0x05,0x2d,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x00,0x05,0x00,0x10,0x81,0x05,0x35,0x05,0x35,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x39,0x05,0x39,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x3f,0x05,0x3f,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x3d,0x05,0x3d,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x27,0x05,0x27,0x46,0x01, 0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00,0x10,0x81,0x05,0x1a,0x05,0x1a,0x46,0x01, 0x02,0x00,0x02,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0d,0x04,0x31,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0c,0x04,0x2d,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0e,0x04,0x35,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x0f,0x04,0x39,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x11,0x04,0x3f,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x10,0x04,0x3d,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x12,0x04,0x27,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x00,0x00,0x05,0x13,0x04,0x1a,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x58,0x68,0x11,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x03,0xa4,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa2,0x03,0x80, 0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xc0,0x44,0x0c,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x0a,0x00,0x00,0x70,0x00,0x00,0x00, 0x50,0x84,0x01,0x00,0xa4,0x69,0x00,0x15,0x02,0x00,0x02,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0a,0x00,0x00,0x69,0x00,0x01,0x68, 0x8a,0x6a,0x51,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x85,0x02,0x24,0x6a,0x00,0x05, 0x05,0x00,0x05,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x61,0x05,0x03,0x62, 0x80,0x01,0x11,0x00,0x61,0x05,0x00,0x80,0xa0,0x0a,0x25,0x03,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0xa5,0x02,0xe4,0x01,0x00,0x05, 0x10,0x00,0x10,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0xe8,0x01,0x00,0x11,0x00,0x01,0x33,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x01,0x03,0x62,0x70,0x02,0x11,0x00,0x31,0x94,0x03,0x80, 0x00,0x00,0x05,0x1c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x34,0x00,0x00, 0x60,0x86,0x25,0x03,0x84,0x02,0x00,0x05,0x10,0x00,0x10,0x00,0x61,0x00,0x03,0x62, 0x80,0x01,0x11,0x00,0x61,0x23,0x02,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x04,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0x85,0x04,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0f,0x85,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x06,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x11,0x85,0x06,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x12,0x05,0x07,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x13,0x85,0x07,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x14,0x05,0x08,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x15,0x85,0x08,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x16,0x05,0x09,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x17,0x85,0x09,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x18,0x05,0x0a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x19,0x85,0x0a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1a,0x05,0x0b,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x85,0x0b,0x34,0x00, 0x00,0x00,0x00,0x00,0x31,0x95,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x35,0x03,0x62,0x70,0x02,0x11,0x00,0x61,0x24,0x02,0x00, 0xa0,0x0a,0x85,0x0c,0x05,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xa6,0x03,0x80, 0x00,0x00,0x05,0x2c,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0e,0x05,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0d,0x85,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0f,0x85,0x1d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x10,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x12,0x05,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x18,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1a,0x05,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x11,0x85,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x14,0x05,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x16,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x34,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x13,0x85,0x1f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x19,0x85,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1b,0x85,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x38,0x05,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x15,0x85,0x20,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x05,0x00, 0x50,0x00,0x05,0x36,0x05,0x11,0x46,0x05,0x05,0x34,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x17,0x85,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x3c,0x05,0x14,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x50,0x00,0x05,0x40,0x05,0x16,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x05,0x00, 0x50,0x00,0x05,0x3a,0x05,0x13,0x46,0x05,0x05,0x38,0x46,0x00,0x61,0x25,0x02,0x00, 0xa0,0x0a,0x05,0x24,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x25,0x85,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x26,0x05,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x27,0x85,0x05,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1c,0x05,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1d,0x85,0x08,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1e,0x05,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1f,0x85,0x09,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x04,0x05,0x0c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x08,0x05,0x0e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x00, 0xa0,0x0a,0x85,0x24,0x05,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x28,0x05,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x29,0x85,0x06,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2a,0x05,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2b,0x85,0x07,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x20,0x05,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x21,0x85,0x0a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x22,0x05,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x23,0x85,0x0b,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x06,0x05,0x0d,0x46,0x05,0x05,0x04,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x0a,0x05,0x0f,0x46,0x05,0x05,0x08,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x25,0x85,0x2c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x26,0x05,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x28,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x29,0x85,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2a,0x05,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x2b,0x85,0x2f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0c,0x05,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x0e,0x05,0x24,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x2e,0x05,0x18,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1c,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1e,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x20,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x22,0x05,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x27,0x85,0x2d,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1d,0x85,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x1f,0x85,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x08,0x05,0x1b,0x46,0x05,0x05,0x0c,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x10,0x05,0x25,0x46,0x05,0x05,0x0e,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x04,0x05,0x19,0x46,0x05,0x05,0x2e,0x46,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x30,0x05,0x26,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x21,0x85,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x23,0x85,0x33,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x34,0x05,0x2a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x38,0x05,0x1c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x1a,0x05,0x20,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x24,0x05,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x2e,0x05,0x1e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x50,0x00,0x05,0x32,0x05,0x28,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x3e,0x05,0x15,0x46,0x05,0x05,0x3c,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x2c,0x05,0x17,0x46,0x05,0x05,0x40,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x12,0x05,0x27,0x46,0x05,0x05,0x30,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x18,0x05,0x1d,0x46,0x05,0x05,0x38,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x0e,0x05,0x21,0x46,0x05,0x05,0x1a,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x0c,0x05,0x1f,0x46,0x05,0x05,0x2e,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x14,0x05,0x29,0x46,0x05,0x05,0x32,0x46,0x00,0x40,0x00,0x05,0x00, 0x50,0x00,0x05,0x16,0x05,0x2b,0x46,0x05,0x05,0x34,0x46,0x00,0x40,0x07,0x05,0x00, 0x50,0x00,0x05,0x26,0x05,0x23,0x46,0x05,0x05,0x24,0x46,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x2a,0x04,0x36,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x20,0x04,0x10,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1e,0x04,0x04,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x28,0x04,0x06,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1c,0x04,0x3e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1d,0x04,0x2c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x22,0x04,0x18,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x01,0x20,0x04,0x12,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1f,0x04,0x08,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x29,0x04,0x0a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x1b,0x04,0x14,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x2b,0x04,0x3a,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x21,0x04,0x16,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x23,0x04,0x0c,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x24,0x04,0x0e,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x85,0x05,0x25,0x04,0x26,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x30,0x05,0x2a,0x58,0x05,0x14,0x36,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x38,0x05,0x20,0x58,0x05,0x14,0x10,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x34,0x05,0x1e,0x58,0x05,0x14,0x04,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x2e,0x05,0x28,0x58,0x05,0x14,0x06,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x32,0x05,0x1c,0x58,0x05,0x14,0x3e,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x33,0x05,0x1d,0x58,0x05,0x14,0x2c,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x39,0x01,0x20,0x58,0x05,0x14,0x12,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x35,0x05,0x1f,0x58,0x05,0x14,0x08,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x2f,0x05,0x29,0x58,0x05,0x14,0x0a,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x3c,0x05,0x1b,0x58,0x05,0x14,0x14,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x31,0x05,0x2b,0x58,0x05,0x14,0x3a,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x3d,0x05,0x21,0x58,0x05,0x14,0x16,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x06,0x05,0x22,0x58,0x05,0x14,0x18,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x07,0x05,0x23,0x58,0x05,0x14,0x0c,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x0a,0x05,0x24,0x58,0x05,0x14,0x0e,0x20,0x00,0x40,0x00,0x04,0x00, 0x50,0x05,0x05,0x0b,0x05,0x25,0x58,0x05,0x14,0x26,0x20,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x32,0x05,0x32,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x38,0x05,0x38,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x34,0x05,0x34,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x2e,0x05,0x2e,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x30,0x05,0x30,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x3c,0x05,0x3c,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x06,0x05,0x06,0x46,0x01,0x02,0x00,0x02,0x00,0x68,0x07,0x05,0x00, 0x10,0x81,0x05,0x0a,0x05,0x0a,0x46,0x01,0x02,0x00,0x02,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x12,0x04,0x32,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x14,0x04,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x13,0x04,0x34,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x10,0x04,0x2e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x11,0x04,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x15,0x04,0x3c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x16,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00, 0x00,0x00,0x05,0x17,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x62, 0x58,0x68,0x11,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x03,0xa4,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x31,0xa7,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xc0, 0x44,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x80,0xe5,0x01,0x84,0x64,0x00,0x05, 0x01,0x00,0x01,0x00,0x61,0x00,0x09,0x68,0xc8,0x6a,0x11,0x00,0x61,0x02,0x00,0x00, 0x20,0x01,0x45,0x09,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x00, 0x00,0x40,0xc4,0x68,0x00,0x00,0x00,0x00,0x80,0x2d,0x00,0x00,0x65,0x03,0x00,0x00, 0x60,0x86,0xe5,0x11,0x24,0x09,0x00,0x05,0xff,0x00,0xff,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x85,0x0f,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x66,0x02,0x00,0x00, 0x60,0x06,0x01,0x00,0xe4,0x11,0x00,0x16,0x84,0x68,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0xc5,0x0f,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x61,0x00,0x02,0x00, 0xa0,0x4a,0x45,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x4a,0x05,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x4a,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x85,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x10,0xa8, 0xa0,0x00,0x01,0x00,0x61,0x00,0x02,0x00,0xa0,0x4a,0x05,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x11,0xa8,0x90,0x00,0x01,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0xe6,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x49,0xa5,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x90,0x49,0xc5,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x16,0x00,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0xe5,0x01,0x24,0x6a,0x00,0x05,0x0a,0x00,0x0a,0x00,0x61,0x00,0x03,0xa1, 0x00,0x00,0x01,0x00,0x66,0x02,0x00,0x00,0x60,0x06,0x05,0x03,0xe4,0x01,0x00,0x01, 0x04,0x68,0x00,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x85,0x02,0xe4,0x01,0x00,0x01, 0x04,0x68,0x00,0x00,0x31,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x04,0x30, 0x00,0x00,0x00,0x02,0x69,0x00,0x01,0x68,0x02,0x6a,0x21,0x00,0x61,0x00,0x04,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02, 0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x61,0x04,0x04,0x62,0x00,0x01,0x11,0x00,0x61,0x00,0x04,0x62, 0xc8,0x6a,0x11,0x00,0x31,0x99,0x03,0x80,0x00,0x00,0x05,0x05,0x04,0x04,0x00,0xc0, 0x00,0x00,0x00,0x00,0x65,0x29,0x00,0x00,0x60,0x86,0x01,0x00,0x04,0x05,0x00,0x15, 0xff,0x00,0xff,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0x00,0x00,0x00,0x61,0x38,0x04,0x00,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00,0x90,0x09,0x05,0x03,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x9a,0x04,0x00,0x00,0x00,0x0c,0x04,0x0c,0x03,0x0c,0x30, 0x00,0x00,0x00,0x02,0x61,0x00,0x05,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x05,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x61,0x00,0x05,0x62, 0x00,0x01,0x11,0x00,0x61,0x00,0x05,0x62,0xc8,0x6a,0x11,0x00,0x61,0x2a,0x00,0x00, 0x20,0x05,0x01,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xab,0x03,0x80, 0x00,0x00,0x05,0x06,0x04,0x05,0x00,0xc0,0x00,0x00,0x00,0x00,0x65,0x2b,0x00,0x00, 0x60,0x86,0x01,0x00,0x04,0x06,0x00,0x15,0xff,0x00,0xff,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x61,0x38,0x04,0x00, 0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9c,0x04,0x00, 0x00,0x00,0x00,0x00,0x0c,0x03,0x06,0x30,0x00,0x00,0x00,0x02,0x70,0x00,0x00,0x00, 0x10,0x81,0x01,0x00,0x04,0x68,0x00,0x21,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0x66,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x10,0x41,0xf5,0x09,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x02,0x00, 0x90,0x49,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0xf5,0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0xe5,0x01,0x44,0x68,0x00,0x05,0x06,0x00,0x06,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x01,0x3c,0x00,0xe8, 0x01,0x00,0x11,0x00,0x40,0x02,0x00,0x00,0x60,0x86,0x45,0x03,0xe4,0x01,0x00,0x05, 0xc0,0xff,0xc0,0xff,0x61,0x00,0x00,0x80,0x90,0x49,0xa5,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x31,0xad,0x04,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xa0, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x45,0x66,0x68,0x00,0x00,0x00,0x00, 0x60,0x00,0x60,0x00,0x65,0x2d,0x00,0x00,0x40,0x84,0x02,0x00,0x04,0x04,0x00,0x25, 0x30,0x00,0x30,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x86,0x02,0x0c,0x04,0x00,0x01, 0x05,0x00,0x05,0x00,0x62,0x04,0x00,0x01,0x50,0x85,0x05,0x06,0xa4,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x40,0x84,0x96,0x02,0x84,0x02,0x00,0x05, 0x01,0x00,0x01,0x00,0x65,0x02,0x00,0x00,0x50,0x00,0x05,0x06,0x84,0x02,0x00,0x05, 0x04,0x06,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x80,0xe5,0x01,0x94,0x02,0x00,0x05, 0xff,0xff,0xff,0xff,0x65,0x02,0x03,0x00,0x50,0x85,0x01,0x00,0x04,0x06,0x00,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x60,0x04,0x05,0x03,0x44,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x03,0x11,0x00,0x84,0x06,0x07,0x25,0x04,0x46,0x05, 0x22,0x00,0x22,0x00,0x61,0x04,0x00,0x80,0x20,0x02,0x01,0x30,0xe4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x60,0x04,0x25,0x03,0x64,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x11,0xa0,0x4a,0x05,0x03,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x61,0x00,0x08,0x68,0x78,0x05,0x11,0x00,0x70,0x02,0x02,0x00, 0x50,0x85,0x01,0x00,0x05,0x03,0x34,0x35,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x25,0x08,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x03,0x00, 0x00,0x00,0x85,0x0f,0x04,0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x00,0x00,0xf5,0x09,0x04,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x11, 0x90,0x49,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00, 0x10,0x80,0x01,0x00,0x24,0x09,0x00,0x11,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0xd6,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0xe6,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0xc5,0x6a,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x25,0x07,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x02,0x00, 0x90,0x49,0xc5,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x49,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x67,0x00,0x00,0x00, 0x60,0x80,0xe5,0x01,0x94,0x64,0x00,0x06,0xff,0xff,0xff,0x03,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x40,0x02,0x00,0x00, 0x60,0x06,0xe5,0x01,0xe4,0x01,0x00,0x06,0x44,0x68,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xa5,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x69,0x02,0x00,0x00, 0x60,0x86,0x45,0x08,0xe4,0x01,0x00,0x05,0x06,0x00,0x06,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0xf4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3c,0x00,0xe8, 0x01,0x00,0x11,0x00,0x61,0x02,0x00,0x80,0xa0,0x0a,0x45,0x03,0x44,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xa0, 0x00,0x00,0x00,0x00,0x65,0x2e,0x00,0x00,0x40,0x84,0x02,0x00,0x04,0x04,0x00,0x25, 0x30,0x00,0x30,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x86,0x02,0x0c,0x04,0x00,0x01, 0x05,0x00,0x05,0x00,0x62,0x06,0x00,0x01,0x50,0x85,0x05,0x06,0xa4,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x40,0x84,0x96,0x02,0x84,0x02,0x00,0x05, 0x01,0x00,0x01,0x00,0x65,0x02,0x00,0x00,0x50,0x00,0x05,0x06,0x84,0x02,0x00,0x05, 0x04,0x06,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x80,0xe5,0x01,0x94,0x02,0x00,0x05, 0xff,0xff,0xff,0xff,0x65,0x02,0x03,0x00,0x50,0x85,0x01,0x00,0x04,0x06,0x00,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x07,0x84,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x03,0x11,0x00,0x84,0x06,0x07,0x25,0x04,0x46,0x05, 0x22,0x00,0x22,0x00,0x61,0x04,0x00,0x80,0x20,0x02,0x01,0x30,0xe4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x02,0x03,0x00,0x00,0x00,0xc5,0x0f,0x04,0x07,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x60,0x04,0x25,0x07,0x44,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x60,0x04,0x45,0x07,0x64,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x11,0xa0,0x4a,0x25,0x07,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x61,0x00,0x07,0x68,0xe0,0x05,0x11,0x00,0x70,0x02,0x02,0x00, 0x50,0x85,0x01,0x00,0x25,0x07,0x34,0x35,0xff,0xff,0xff,0xff,0x61,0x00,0x02,0x11, 0x90,0x49,0x65,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x20,0x42,0x01,0x30,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x45,0x03,0x44,0x08,0x00,0x05,0xc0,0xff,0xc0,0xff,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x61,0x00,0x00,0x00, 0x00,0x45,0xd6,0x09,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x31,0xbf,0x04,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x2f,0x00,0x00, 0x00,0x80,0xe6,0x01,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x61,0x00,0x00,0x00, 0x60,0x04,0xa5,0x07,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00, 0x40,0x84,0xe6,0x01,0xe4,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00, 0x60,0x04,0xc5,0x07,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x80,0x85,0x02,0xe4,0x01,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x01,0x00,0x80, 0x20,0x02,0x01,0x30,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x00,0xe5,0x01,0x94,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x45,0x06,0x07,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x70,0x02,0x80,0x00, 0x10,0x01,0x01,0x00,0x04,0x68,0x00,0x55,0xe4,0x01,0x00,0x00,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x45,0x03,0x44,0x08,0x00,0x05,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x61,0x00,0x00,0x00, 0x00,0x45,0xe6,0x09,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x31,0xb0,0x04,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x68,0x20,0x00,0x00, 0x00,0x80,0xe6,0x01,0x0c,0x04,0x00,0x01,0x05,0x00,0x05,0x00,0x61,0x00,0x00,0x00, 0x60,0x04,0xc5,0x6a,0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00, 0x40,0x84,0xe6,0x01,0xe4,0x01,0x00,0x05,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00, 0x60,0x04,0xe5,0x6a,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x80,0x85,0x02,0xe4,0x01,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xc5,0x68,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x80, 0x20,0x02,0x01,0x30,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xe5,0x68,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x11, 0xa0,0x4a,0xc5,0x6a,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x70,0x01,0x02,0x00, 0x50,0x85,0x01,0x00,0xc5,0x6a,0x34,0x35,0xff,0xff,0xff,0xff,0x61,0x00,0x02,0x11, 0x90,0x49,0xc5,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0xf4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x45,0x03,0x44,0x08,0x00,0x05,0xc0,0xff,0xc0,0xff,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x43,0x28,0x02,0x62,0x00,0x01,0x01, 0x60,0x86,0xc5,0x6a,0xa5,0x07,0x22,0x05,0xff,0xff,0xff,0xff,0x31,0xb1,0x04,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xa0,0x00,0x00,0x00,0x00,0x70,0x01,0x02,0x00, 0x50,0x85,0x01,0x00,0xc5,0x6a,0x34,0x35,0xff,0xff,0xff,0xff,0x61,0x21,0x00,0x00, 0xa0,0x0a,0xc5,0x68,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xe5,0x68,0x84,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x11, 0x90,0x49,0xc5,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0xe5,0x01,0x64,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x85,0x02,0xe4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x00,0x00, 0x40,0x04,0xe6,0x10,0x04,0x07,0x00,0x05,0xe4,0x01,0x00,0x00,0x61,0x3c,0x00,0x80, 0x50,0x04,0x05,0x03,0xd4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00, 0x10,0x80,0x01,0x00,0x64,0x68,0x00,0x11,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00, 0x40,0x04,0xe6,0x10,0xe4,0x10,0x00,0x05,0x84,0x02,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x05,0x09,0x05,0x08,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x65,0x09,0x25,0x08,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x25,0x09,0x65,0x07,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x85,0x09,0x85,0x07,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x01,0x00, 0x90,0x09,0x45,0x09,0xc5,0x68,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0xa5,0x09,0xe5,0x68,0x22,0x00,0x00,0x00,0x00,0x00,0x66,0x07,0x00,0x00, 0x40,0x04,0xe6,0x10,0xe4,0x10,0x00,0x05,0x04,0x03,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xc6,0x68,0xf4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xde,0x68,0xfc,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xce,0x68,0x24,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xd6,0x68,0xc4,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xe6,0x68,0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0xee,0x68,0xe4,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x40,0x00,0x03,0x68,0x5a,0x68,0xc1,0xff,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x03,0xa4,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x93,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x33,0x03,0x68, 0xca,0x6a,0x31,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x03,0x00,0x07,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x01,0x00,0x19,0x02,0x31,0xa4,0x03,0x80,0x00,0x00,0x05,0x06,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x23,0x04,0x00,0x00,0x00,0x45,0x6a,0x1c,0x04,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x24,0x03,0x00,0x90,0x09,0x05,0x0f,0x14,0x06,0x20,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0x04,0x07,0x00,0x11, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x03,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0xd4,0x09,0x00,0x11, 0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x10,0x80,0x01,0x00,0xe4,0x09,0x00,0x21, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x68,0x01,0x00,0x00,0x40,0x00,0x01,0x68,0x5a,0x68,0xc1,0xff,0x61,0x00,0x03,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x00,0x00,0x19,0x02,0x40,0x00,0x00,0x00,0x60,0x86,0x25,0x03,0xa4,0x68,0x00,0x05, 0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x61,0x05,0x03,0x62,0x00,0x01,0x11,0x00,0x31,0x95,0x03,0x80, 0x00,0x00,0x05,0x03,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x61,0x25,0x02,0x00, 0xa0,0x0a,0x05,0x10,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x85,0x10,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00, 0x00,0x00,0xa5,0x10,0x9c,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x61,0x25,0x02,0x00, 0xa0,0x0a,0x05,0x10,0x05,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x0a,0x85,0x10,0x85,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xc5,0x10,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x6a,0x68, 0xca,0x6a,0x31,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x40,0x03,0x03,0x68, 0xca,0x6a,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x61,0x00,0x03,0x62,0x00,0x01,0x11,0x00,0x31,0x96,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x26,0x02,0x00, 0xa0,0x0a,0x05,0x11,0x05,0x04,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x85,0x11,0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x40,0x00,0x01,0x68, 0x72,0x68,0xf1,0xff,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x61,0x00,0x03,0x62, 0x58,0x68,0x11,0x00,0x61,0x06,0x03,0x62,0x60,0x01,0x11,0x00,0x61,0x00,0x02,0x00, 0xa0,0x4a,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa8,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x85,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x10,0xa8, 0xa0,0x00,0x01,0x00,0x61,0x28,0x04,0x80,0x40,0x04,0x25,0x10,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x02,0x00,0xa0,0x0a,0x85,0x02,0x25,0x10,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x00,0x00,0xa5,0x10,0xfc,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x61,0x00,0x03,0x62, 0x58,0x68,0x11,0x00,0x61,0x00,0x03,0x62,0x60,0x01,0x11,0x00,0x61,0x00,0x02,0x00, 0xa0,0x4a,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa9,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x85,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x10,0xa8, 0xa0,0x00,0x01,0x00,0x61,0x29,0x02,0x00,0xa0,0x0a,0x25,0x10,0x05,0x04,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xa5,0x10,0x85,0x04,0x22,0x00, 0x00,0x00,0x00,0x00,0x69,0x00,0x6a,0x68,0xca,0x6a,0x31,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x10,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x01,0x00,0x19,0x02,0x40,0x03,0x03,0x68,0xca,0x6a,0xf1,0xff,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x61,0x00,0x03,0x62, 0x58,0x68,0x11,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x2a,0x04,0x80,0x40,0x04,0x25,0x11,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0xe5,0x01,0xcc,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x05,0x03,0xe4,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x95,0x02,0xd4,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x15,0x04,0xec,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x86,0x02,0xc4,0x68,0x00,0x55, 0xe4,0x01,0x00,0x00,0x62,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0xdc,0x68,0x00,0x55, 0x04,0x03,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0xd6,0x09,0x84,0x02,0x00,0x55, 0x94,0x02,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0xde,0x09,0x04,0x04,0x00,0x55, 0x14,0x04,0x00,0x00,0x70,0x01,0x00,0x00,0x50,0x85,0x01,0x00,0xd4,0x09,0x00,0x15, 0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x08,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x02,0x00,0xb4,0x69,0x00,0x15, 0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x00,0x00,0x45,0xc6,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0x01,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x45,0x03,0x44,0x68,0x00,0x05, 0x06,0x00,0x06,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xa4,0x01,0x00,0x02, 0x00,0x43,0x28,0x02,0x61,0x00,0x00,0x80,0x90,0x49,0x85,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x31,0xbb,0x04,0x80,0x00,0x00,0x05,0x07,0x04,0x03,0x00,0xa0, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x69,0x2b,0x00,0x00,0x60,0x86,0xe5,0x01,0x44,0x07,0x00,0x05, 0x18,0x00,0x18,0x00,0x61,0x00,0x6a,0x68,0x78,0x08,0x11,0x00,0x70,0x02,0x01,0x00, 0x60,0x86,0x01,0x00,0xe4,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x25,0x6a,0x84,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x06,0x01,0x01, 0x50,0x85,0x05,0x04,0x84,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00, 0x60,0x86,0x01,0x00,0xe4,0x01,0x00,0x16,0x00,0x00,0x00,0xff,0x40,0x03,0x02,0x00, 0x50,0x85,0x05,0x6a,0x05,0x6a,0x34,0x05,0x01,0x00,0x01,0x00,0x61,0x03,0x01,0x00, 0x00,0x00,0xe5,0x09,0x04,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x65,0x00,0x80,0x00, 0x60,0x86,0x01,0x00,0x64,0x07,0x00,0x25,0xff,0x00,0xff,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x68,0x00,0x00,0x00, 0x00,0x80,0x46,0x04,0x0c,0x07,0x00,0x01,0x05,0x00,0x05,0x00,0x62,0x02,0x80,0x01, 0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00, 0x40,0x84,0x46,0x04,0x44,0x04,0x00,0x05,0x01,0x00,0x01,0x00,0x70,0x02,0x01,0x00, 0x50,0x85,0x01,0x00,0x84,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01, 0x50,0x85,0x05,0x03,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x07,0x02,0x00, 0x10,0x81,0x01,0x00,0x05,0x6a,0x34,0x51,0x03,0x00,0x03,0x00,0x61,0x02,0x01,0x00, 0x00,0x00,0xf5,0x09,0x04,0x03,0x20,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x02,0x00, 0x50,0x80,0x05,0x04,0xe5,0x09,0x34,0x05,0x01,0x00,0x01,0x00,0x70,0x01,0x02,0x01, 0x50,0x85,0x01,0x00,0x05,0x04,0x34,0x15,0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01, 0x50,0x85,0x05,0x05,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x65,0x07,0x02,0x00, 0x50,0x80,0x01,0x00,0x44,0x04,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x00,0x02,0x11, 0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x01,0x00, 0x50,0x05,0x06,0x06,0x04,0x05,0x20,0x05,0x14,0x05,0x20,0x00,0x66,0x01,0x00,0x00, 0x50,0x05,0x85,0x02,0x24,0x06,0x00,0x05,0x04,0x06,0x00,0x00,0x61,0x01,0x00,0x00, 0x00,0x00,0xc6,0x09,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00, 0x60,0x86,0x01,0x00,0xe4,0x11,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x30,0xf4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x80,0x01, 0x10,0x81,0x95,0x02,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01, 0x10,0x81,0x85,0x02,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x65,0x02,0x00,0x00, 0x10,0x01,0x01,0x00,0x84,0x02,0x00,0x21,0x94,0x02,0x00,0x00,0x61,0x00,0x01,0x00, 0x50,0x00,0x05,0x05,0xcd,0x68,0x22,0x00,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x01, 0x50,0x85,0x05,0x04,0x04,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x50,0x00,0x05,0x07,0xe5,0x68,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x01,0x00, 0x50,0x85,0x01,0x00,0x04,0x04,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0xe5,0x01,0xd4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01, 0xa0,0x0a,0x25,0x09,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01, 0xa0,0x0a,0x85,0x09,0x64,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x07,0x01,0x01, 0x50,0x00,0x05,0x06,0xc4,0x68,0x00,0x05,0x05,0x05,0x22,0x00,0x62,0x03,0x01,0x00, 0x50,0x05,0x85,0x02,0x25,0x09,0x22,0x55,0x05,0x09,0x22,0x00,0x62,0x00,0x01,0x00, 0x50,0x05,0xa5,0x02,0x45,0x09,0x22,0x55,0x25,0x09,0x22,0x00,0x62,0x04,0x01,0x00, 0x50,0x05,0x05,0x03,0x85,0x09,0x22,0x55,0x65,0x09,0x22,0x00,0x62,0x00,0x01,0x00, 0x50,0x05,0x25,0x03,0xa5,0x09,0x22,0x55,0x85,0x09,0x22,0x00,0x62,0x07,0x01,0x01, 0x50,0x00,0x05,0x08,0xdc,0x68,0x00,0x05,0x05,0x07,0x22,0x00,0x62,0x00,0x01,0x00, 0x50,0x05,0xc5,0x02,0x05,0x09,0x22,0x55,0x45,0x09,0x22,0x00,0x62,0x00,0x01,0x00, 0x50,0x05,0x45,0x03,0x65,0x09,0x22,0x55,0xa5,0x09,0x22,0x00,0x61,0x07,0x01,0x00, 0x00,0x00,0xcd,0x68,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x67,0x07,0x01,0x00, 0x50,0x05,0xa5,0x02,0xa5,0x02,0x22,0x05,0x85,0x02,0x22,0x00,0x67,0x06,0x01,0x00, 0x50,0x05,0x25,0x03,0x25,0x03,0x22,0x05,0x05,0x03,0x22,0x00,0x70,0x00,0x00,0x00, 0x50,0x00,0x01,0x00,0xc4,0x68,0x00,0x15,0xe4,0x01,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x01,0x00, 0x00,0x00,0xe5,0x68,0x04,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x70,0x06,0x80,0x00, 0x50,0x00,0x01,0x00,0xcc,0x68,0x00,0x15,0xe4,0x01,0x00,0x00,0x67,0x06,0x01,0x00, 0x50,0x05,0xa5,0x11,0xa5,0x02,0x22,0x05,0xc5,0x02,0x22,0x00,0x67,0x06,0x01,0x00, 0x50,0x05,0xc5,0x11,0x25,0x03,0x22,0x05,0x45,0x03,0x22,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x00,0x80,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0xe5,0x01,0xd4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x01,0x00, 0x50,0x00,0x01,0x00,0xd4,0x68,0x00,0x15,0xe4,0x01,0x00,0x00,0x61,0x00,0x01,0x01, 0x90,0x09,0xa5,0x11,0x45,0x09,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0xe5,0x01,0xd4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00, 0x50,0x00,0x01,0x00,0xd4,0x68,0x00,0x25,0xe4,0x01,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x62,0x01,0x00,0x01, 0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x01,0x01,0x00, 0x50,0x85,0x01,0x00,0x84,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01, 0x90,0x09,0xa5,0x11,0x25,0x09,0x22,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x20,0x00,0x80,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x00,0xe5,0x01,0xc4,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00, 0x50,0x00,0x01,0x00,0xd4,0x68,0x00,0x25,0xe4,0x01,0x00,0x00,0x61,0x00,0x09,0xe2, 0x8e,0x30,0x11,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x61,0x02,0x00,0x80,0x10,0x01,0x01,0x30,0xe4,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x06,0x03,0xd4,0x09,0x00,0x01, 0x07,0x00,0x07,0x00,0x62,0x03,0x00,0x01,0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x15,0x04,0xc4,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x02,0x01,0x00,0x50,0x85,0x01,0x00,0x84,0x02,0x00,0x25, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x85,0x02,0xdc,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x09,0xa5,0x11,0x05,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x03,0x00,0x15, 0x01,0x00,0x01,0x00,0x70,0x03,0x80,0x00,0x50,0x00,0x01,0x00,0xdc,0x68,0x00,0x15, 0x84,0x02,0x00,0x00,0x61,0x00,0x00,0x11,0xa0,0x4a,0xa5,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0xd4,0x09,0x00,0x11, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0xe5,0x09,0xc5,0x11,0x22,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x00,0x85,0x06,0x04,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x04,0x00,0x15, 0x01,0x00,0x01,0x00,0x62,0x07,0x00,0x01,0x50,0x00,0x05,0x05,0x04,0x04,0x00,0x05, 0x14,0x04,0x00,0x00,0x65,0x01,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x05,0x00,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x11,0xa0,0x4a,0xa5,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0xe5,0x01,0xdc,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x80,0x00,0x50,0x00,0x01,0x00,0xe4,0x68,0x00,0x15, 0xe4,0x01,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0xe5,0x01,0xdc,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x81,0x00,0x50,0x00,0x01,0x00,0xec,0x68,0x00,0x15, 0xe4,0x01,0x00,0x00,0x61,0x00,0x81,0x01,0x90,0x09,0xe5,0x09,0xa5,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x41,0x01,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0xe5,0x01,0xdc,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x80,0x00,0x50,0x00,0x01,0x00,0xec,0x68,0x00,0x25, 0xe4,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x62,0x01,0x80,0x01,0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x70,0x01,0x81,0x00,0x50,0x85,0x01,0x00,0x84,0x02,0x00,0x25, 0x00,0x00,0x00,0x00,0x61,0x00,0x81,0x01,0x90,0x09,0xe5,0x09,0x85,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0xe5,0x01,0xdc,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x80,0x00,0x50,0x00,0x01,0x00,0xe4,0x68,0x00,0x15, 0xe4,0x01,0x00,0x00,0x20,0x00,0x80,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0xe5,0x01,0xdc,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x50,0x00,0x01,0x00,0xec,0x68,0x00,0x25, 0xe4,0x01,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x06,0x03,0xdc,0x09,0x00,0x01, 0x07,0x00,0x07,0x00,0x62,0x02,0x00,0x01,0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x15,0x04,0xc4,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x02,0x01,0x00,0x50,0x85,0x01,0x00,0x84,0x02,0x00,0x25, 0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x01,0x50,0x05,0xc5,0x11,0x65,0x09,0x22,0x05, 0xe5,0x09,0x22,0x00,0x65,0x05,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x03,0x00,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x11,0xa0,0x4a,0xc5,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x80,0x01,0x00,0xdc,0x09,0x00,0x11, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x00,0x85,0x06,0x04,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x04,0x00,0x15, 0x01,0x00,0x01,0x00,0x62,0x07,0x00,0x01,0x50,0x00,0x05,0x05,0x04,0x04,0x00,0x05, 0x14,0x04,0x00,0x00,0x65,0x01,0x00,0x00,0x50,0x80,0x01,0x00,0x04,0x05,0x00,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x11,0xa0,0x4a,0xc5,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x00,0x00,0xd5,0x09,0xc5,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x00,0x00,0xd5,0x09,0xc5,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x49,0x05,0x24,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x24,0xa4,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x05,0x09,0x44,0x69,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x60,0x84,0x25,0x09,0xb5,0x24,0x22,0x06, 0xf0,0xff,0x01,0x00,0x61,0x00,0x00,0x00,0x90,0x49,0x15,0x09,0x00,0x00,0x00,0x00, 0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x24,0x84,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x24,0xa4,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x24,0x68,0xe0,0x64,0x11,0x00,0x68,0x05,0x01,0x00, 0x20,0x82,0x25,0x09,0x25,0x09,0x22,0x01,0x01,0x00,0x01,0x00,0x2c,0x00,0x05,0x00, 0x00,0x40,0x84,0x68,0x00,0x00,0x00,0x00,0xb8,0x14,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x49,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x6c,0x00,0x01,0x00, 0x50,0x85,0xc5,0x02,0xa5,0x11,0x22,0x05,0x02,0x00,0x02,0x00,0x61,0x07,0x00,0x00, 0x90,0x09,0x95,0x02,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00, 0x90,0x09,0x05,0x03,0xc5,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x50,0x85,0x15,0x03,0xd4,0x02,0x00,0x05,0xfe,0xff,0xfe,0xff,0x40,0x03,0x01,0x00, 0x50,0x05,0x25,0x03,0x85,0x02,0x22,0x05,0x24,0x09,0x20,0x02,0x69,0x00,0x00,0x00, 0x50,0x84,0xe5,0x01,0x8c,0x64,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x00,0x01,0x00, 0x50,0x85,0x45,0x03,0x85,0x02,0x22,0x05,0x10,0x00,0x10,0x00,0x40,0x04,0x01,0x00, 0x50,0x05,0x05,0x03,0x05,0x03,0x22,0x05,0x24,0x09,0x20,0x02,0x70,0x04,0x01,0x00, 0x50,0x05,0x01,0x00,0xc5,0x02,0x22,0x35,0x25,0x03,0x22,0x00,0x69,0x00,0x00,0x00, 0x50,0x84,0xa5,0x02,0x94,0x64,0x00,0x05,0x04,0x00,0x04,0x00,0x40,0x05,0x00,0x00, 0x50,0x85,0xb5,0x02,0xe4,0x01,0x00,0x05,0x10,0x00,0x10,0x00,0x40,0x05,0x01,0x00, 0x50,0x24,0x65,0x03,0xb5,0x24,0x22,0x05,0x45,0x03,0x22,0x00,0x61,0x05,0x01,0x11, 0x90,0x09,0x65,0x03,0x05,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x01,0x00, 0x50,0x05,0x01,0x00,0xc5,0x02,0x22,0x55,0x25,0x03,0x22,0x02,0x40,0x04,0x01,0x00, 0x50,0x85,0x25,0x04,0xa5,0x02,0x22,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x01, 0x50,0x25,0x65,0x03,0x85,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x01,0x00, 0x50,0x85,0x25,0x04,0x25,0x04,0x22,0x05,0xfc,0xff,0xfc,0xff,0x40,0x02,0x01,0x00, 0x50,0x05,0x05,0x04,0x65,0x03,0x22,0x05,0x45,0x24,0x22,0x00,0x40,0x02,0x01,0x00, 0x50,0x05,0x45,0x04,0x25,0x04,0x22,0x05,0x45,0x24,0x22,0x02,0x70,0x02,0x01,0x00, 0x50,0x05,0x01,0x00,0xa5,0x02,0x22,0x35,0x05,0x04,0x22,0x00,0x40,0x00,0x01,0x00, 0x50,0x04,0x05,0x05,0xb5,0x24,0x22,0x05,0x45,0x24,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x84,0xc5,0x02,0xb5,0x24,0x22,0x06,0xf0,0xff,0x01,0x00,0x61,0x04,0x01,0x11, 0x90,0x09,0x65,0x03,0x45,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x50,0xa4,0x25,0x05,0xb5,0x24,0x22,0x05,0x05,0x00,0x05,0x00,0x6c,0x00,0x01,0x00, 0x50,0x85,0x05,0x04,0xc5,0x11,0x22,0x05,0x02,0x00,0x02,0x00,0x68,0x04,0x01,0x00, 0x20,0x82,0xc5,0x02,0xc5,0x02,0x22,0x01,0x01,0x00,0x01,0x00,0x40,0x04,0x01,0x00, 0x50,0x05,0x05,0x05,0x05,0x05,0x22,0x05,0x65,0x03,0x22,0x00,0x65,0x04,0x01,0x00, 0x50,0x85,0x25,0x05,0x25,0x05,0x22,0x05,0xfc,0xff,0xfc,0xff,0x61,0x04,0x01,0x00, 0x90,0x09,0x45,0x04,0x05,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x01,0x00, 0x50,0x05,0x65,0x04,0x85,0x02,0x22,0x05,0xc4,0x02,0x20,0x02,0x70,0x04,0x01,0x00, 0x50,0x85,0x01,0x00,0x05,0x05,0x22,0x55,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00, 0x50,0x85,0x55,0x04,0x14,0x04,0x00,0x05,0xfe,0xff,0xfe,0xff,0x40,0x05,0x01,0x00, 0x50,0x05,0x25,0x05,0x25,0x05,0x22,0x05,0x45,0x24,0x22,0x02,0x61,0x00,0x01,0x11, 0x90,0x09,0x25,0x05,0x65,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x01,0x00, 0x50,0x05,0x45,0x04,0x45,0x04,0x22,0x05,0xc4,0x02,0x20,0x02,0x70,0x06,0x01,0x00, 0x50,0x05,0x01,0x00,0x05,0x04,0x22,0x35,0x65,0x04,0x22,0x00,0x40,0x00,0x01,0x00, 0x50,0x24,0x45,0x03,0xb5,0x24,0x22,0x05,0x45,0x03,0x22,0x00,0x61,0x03,0x01,0x11, 0x90,0x09,0x45,0x03,0x45,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x01,0x00, 0x50,0x05,0x01,0x00,0x05,0x04,0x22,0x55,0x65,0x04,0x22,0x02,0x40,0x00,0x01,0x00, 0x50,0x05,0x25,0x04,0x25,0x04,0x22,0x05,0x45,0x24,0x22,0x02,0x61,0x00,0x01,0x01, 0x50,0x25,0x45,0x03,0x85,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x50,0x04,0x05,0x05,0xb5,0x24,0x22,0x05,0x45,0x24,0x22,0x00,0x40,0x02,0x01,0x00, 0x50,0x05,0x05,0x03,0x45,0x03,0x22,0x05,0x45,0x24,0x22,0x00,0x65,0x07,0x00,0x00, 0x50,0x85,0x35,0x05,0x34,0x05,0x00,0x05,0xfe,0xff,0xfe,0xff,0x70,0x02,0x01,0x00, 0x50,0x05,0x01,0x00,0xa5,0x02,0x22,0x35,0x05,0x03,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x80,0x85,0x02,0xb5,0x24,0x22,0x05,0x70,0x00,0x70,0x00,0x61,0x07,0x01,0x11, 0x90,0x09,0x45,0x03,0x25,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x01,0x00, 0x90,0x09,0x05,0x24,0x25,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x00,0x80,0x06,0x03,0xd4,0x09,0x00,0x01,0x07,0x00,0x07,0x00,0x68,0x04,0x01,0x00, 0x20,0x82,0x85,0x02,0x85,0x02,0x22,0x01,0x03,0x00,0x03,0x00,0x40,0x04,0x01,0x00, 0x50,0x05,0x05,0x05,0x05,0x05,0x22,0x05,0x45,0x03,0x22,0x00,0x40,0x00,0x01,0x00, 0x50,0xa4,0x25,0x05,0xb5,0x24,0x22,0x05,0x05,0x00,0x05,0x00,0x67,0x04,0x00,0x00, 0x40,0x84,0x06,0x03,0x04,0x03,0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x04,0x01,0x00, 0x40,0x84,0x06,0x04,0x84,0x02,0x30,0x05,0x0f,0x00,0x0f,0x00,0x70,0x04,0x01,0x00, 0x50,0x85,0x01,0x00,0x05,0x05,0x22,0x55,0x01,0x00,0x01,0x00,0x65,0x04,0x01,0x00, 0x50,0x85,0x25,0x05,0x25,0x05,0x22,0x05,0xfc,0xff,0xfc,0xff,0x61,0x03,0x00,0x80, 0x50,0x04,0x05,0x06,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x01,0x00, 0x50,0x05,0x25,0x05,0x25,0x05,0x22,0x05,0x45,0x24,0x22,0x02,0x68,0x00,0x00,0x00, 0x00,0x80,0x06,0x04,0xdc,0x09,0x00,0x01,0x07,0x00,0x07,0x00,0x61,0x00,0x01,0x11, 0x90,0x09,0x25,0x05,0x45,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x07,0x00,0x00, 0x50,0x80,0x01,0x00,0x04,0x03,0x00,0x15,0x01,0x00,0x01,0x00,0x67,0x03,0x00,0x00, 0x40,0x84,0x06,0x04,0x04,0x04,0x00,0x05,0x01,0x00,0x01,0x00,0x62,0x06,0x00,0x01, 0x50,0x85,0x85,0x02,0x04,0x05,0x00,0x05,0x55,0x00,0x55,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xe5,0x25,0xe4,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x40,0x84,0xe6,0x01,0x14,0x04,0x00,0x05,0x04,0x00,0x04,0x00,0x65,0x04,0x00,0x00, 0x50,0x80,0x01,0x00,0x04,0x04,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x04,0x00,0x00, 0x40,0x04,0xfe,0x25,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x45,0x25,0x44,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00, 0x40,0x04,0x56,0x25,0xe4,0x01,0x00,0x05,0x04,0x06,0x00,0x00,0x62,0x00,0x00,0x01, 0x50,0x85,0xe5,0x01,0x04,0x05,0x00,0x05,0xaa,0x00,0xaa,0x00,0x61,0x04,0x00,0x80, 0x50,0x04,0x05,0x06,0xfc,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x50,0x85,0x35,0x05,0x34,0x05,0x00,0x05,0xfe,0xff,0xfe,0xff,0x68,0x00,0x00,0x00, 0x00,0x80,0x06,0x03,0xb4,0x0f,0x00,0x01,0x04,0x00,0x04,0x00,0x66,0x03,0x00,0x00, 0x40,0x04,0xfe,0x25,0xe4,0x01,0x00,0x05,0x04,0x06,0x00,0x00,0x68,0x00,0x00,0x00, 0x00,0x80,0xe6,0x01,0x94,0x0f,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x01,0x00, 0xa0,0x0a,0x05,0x25,0x05,0x64,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x26,0xa0, 0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x16,0x03,0xbc,0x0f,0x00,0x05, 0xf0,0xff,0xf0,0xff,0x61,0x00,0x00,0x00,0x40,0x04,0xee,0x25,0xe4,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xe6,0x25,0xe4,0x25,0x00,0x05, 0x7f,0x00,0x7f,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x86,0x02,0x9c,0x0f,0x00,0x05, 0xf0,0xff,0xf0,0xff,0x61,0x00,0x00,0x00,0x40,0x04,0x5e,0x25,0x54,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x01,0x00,0x90,0x09,0x25,0x24,0x25,0x05,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80,0x50,0x04,0x05,0x04,0x04,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80,0x50,0x04,0x95,0x02,0xe4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x26,0xc5,0x65,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x05,0x27,0xa5,0x11,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x25,0x27,0xc5,0x11,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x05,0x26,0x05,0x65,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x85,0x26,0x84,0x65,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x49,0x05,0x0b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x0d,0xa0,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x01,0x10,0x24,0x68,0x00,0x06,0x00,0x20,0x78,0x10,0x61,0x07,0x07,0x60, 0x00,0x24,0x10,0x00,0x61,0x05,0x09,0x60,0x00,0x26,0x10,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x05,0x0b,0xa5,0x11,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x25,0x0b,0xc5,0x11,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x0a,0x05,0x0c,0xc5,0x67,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x45,0x0c,0x25,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0xa0,0x0a,0xc5,0x0c,0xa5,0x10,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0d,0x45,0x6a,0x34,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00, 0x40,0x04,0x86,0x0d,0x84,0x02,0x00,0x05,0x94,0x02,0x00,0x00,0x66,0x00,0x00,0x00, 0x40,0x04,0x8e,0x0d,0x14,0x03,0x00,0x05,0x04,0x04,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x95,0x0d,0xec,0x0f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x90,0x09,0xa5,0x0d,0x14,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0xe5,0x0d,0x24,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x0e,0x05,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x0a,0x85,0x0e,0x25,0x11,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x3e,0x0c,0x1c,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x40,0x84,0x06,0x03,0x04,0x25,0x00,0x15,0x01,0x00,0x01,0x00,0x31,0xac,0x04,0x00, 0x00,0x00,0x05,0x16,0x04,0x07,0x00,0xd0,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x80,0x05,0x04,0x04,0x03,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x03,0xe2, 0xb6,0x30,0x11,0x00,0x61,0x02,0x00,0x80,0x20,0x02,0x01,0x30,0x04,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x80,0x00,0x40,0x84,0x02,0x00,0x74,0x24,0x00,0x25, 0x02,0x00,0x02,0x00,0x61,0x2c,0x00,0x01,0x10,0x45,0x45,0x16,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x61,0x00,0x68,0xe2,0x96,0x31,0x11,0x00,0x61,0x00,0x1d,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x23,0xa1,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00, 0xa0,0x4a,0x65,0x1d,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x4a,0x45,0x1d,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x62,0x00,0x00,0x11, 0x10,0x81,0x05,0x05,0x54,0x16,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x01,0x00, 0x50,0x00,0xe5,0x01,0x25,0x1c,0x22,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x80,0x00, 0x10,0x01,0x01,0x00,0x04,0x05,0x00,0x31,0x04,0x69,0x00,0x00,0x40,0x02,0x01,0x00, 0x50,0x00,0x85,0x02,0x35,0x1c,0x22,0x05,0xe5,0x01,0x22,0x00,0x61,0x00,0x05,0xe2, 0xb6,0x31,0x11,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x50,0x05,0x95,0x68,0x84,0x02,0x00,0x05, 0x94,0x02,0x00,0x00,0x62,0x03,0x80,0x01,0x10,0x81,0x85,0x02,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x01,0x90,0x49,0x95,0x68,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x67,0x02,0x80,0x00,0x10,0x81,0x01,0x00,0x84,0x02,0x00,0x21, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x14,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x68,0xe2,0x9e,0x31,0x11,0x00,0x70,0x04,0x80,0x00, 0x50,0x85,0x01,0x00,0x94,0x68,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x75,0x68,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80, 0x10,0x01,0x01,0x31,0x14,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01, 0x10,0x81,0x05,0x03,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x05,0x00,0x80, 0x10,0x01,0x01,0x31,0x64,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01, 0x10,0x81,0x25,0x03,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x01,0x80,0x00, 0x10,0x01,0x01,0x00,0x04,0x03,0x00,0x21,0x24,0x03,0x00,0x00,0x61,0x00,0x04,0xe2, 0x06,0x31,0x11,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x84,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x04,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x74,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x85,0x02,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x65,0x01,0x80,0x00,0x10,0x01,0x01,0x00,0x14,0x04,0x00,0x21, 0x84,0x02,0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0x85,0x02,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x05,0x06,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x04,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x05,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x66,0x01,0x80,0x00,0x10,0x01,0x01,0x00,0x04,0x06,0x00,0x21, 0x14,0x05,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x95,0x02,0xe4,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x11,0x10,0x81,0x55,0x16,0x04,0x05,0x00,0x05, 0xff,0xff,0xff,0xff,0x66,0x02,0x00,0x00,0x10,0x01,0x01,0x00,0x84,0x02,0x00,0x21, 0x94,0x02,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0x01,0x00,0x00,0x61,0x00,0x03,0x60,0x00,0x24,0x10,0x00,0x65,0x01,0x00,0x00, 0x40,0x84,0x6e,0x03,0x6c,0x03,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x05,0x60, 0x00,0x26,0x10,0x00,0x61,0x00,0x07,0x60,0x00,0x66,0x10,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x01,0x10,0x24,0x68,0x00,0x06,0x00,0xc0,0xb8,0x0c,0x61,0x00,0x01,0x00, 0x90,0x09,0x05,0x03,0x05,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x25,0x03,0x25,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x66,0x06,0x00,0x00, 0x40,0x84,0x6e,0x03,0x6c,0x03,0x00,0x05,0x07,0x00,0x07,0x00,0x61,0x00,0x06,0x61, 0x00,0x27,0x10,0x00,0x66,0x00,0x00,0x00,0x50,0x80,0x85,0x02,0x74,0x24,0x00,0x05, 0x04,0x00,0x04,0x00,0x31,0xad,0x04,0x00,0x00,0x00,0x05,0x0b,0x04,0x03,0x00,0x80, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x50,0x80,0xe5,0x01,0x74,0x24,0x00,0x05, 0xfb,0x00,0xfb,0x00,0x70,0x2d,0x00,0x00,0x50,0x84,0x01,0x00,0xcc,0x0b,0x00,0x15, 0x00,0x00,0x00,0x00,0x61,0x00,0x1d,0x60,0x00,0x0b,0x10,0x00,0x61,0x04,0x00,0x11, 0x90,0x09,0xe5,0x01,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x40,0x84,0x02,0x00,0x6c,0x64,0x00,0x15,0x30,0x00,0x30,0x00,0x61,0x00,0x23,0x61, 0x00,0x11,0x10,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xa6,0x26,0x04,0x0b,0x00,0x05, 0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0xae,0x26,0xcc,0x0b,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0xb6,0x26,0xd4,0x0b,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x06,0x00,0x00,0x40,0x04,0x76,0x24,0xe4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00,0x61,0x02,0x03,0x60,0x00,0x24,0x10,0x00,0x61,0x04,0x05,0x60, 0x00,0x26,0x10,0x00,0x61,0x00,0x07,0x60,0x00,0x0c,0x10,0x00,0x61,0x00,0x09,0x60, 0x00,0x0e,0x10,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x24,0x68,0x00,0x06, 0x00,0x60,0x78,0x10,0x65,0x00,0x00,0x00,0x40,0x84,0xa6,0x05,0xa4,0x26,0x00,0x05, 0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0xae,0x05,0xac,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0xb6,0x05,0xb4,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x9e,0x04,0x00,0x00,0x00,0x05,0x1d,0x04,0x03,0x00,0xd0, 0x00,0x00,0x00,0x00,0x70,0x2e,0x00,0x00,0x10,0x01,0x01,0x00,0x64,0x16,0x00,0x51, 0x44,0x1d,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x65,0x1d,0x64,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x1d,0x54,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xc8,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x84,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x01,0x01,0x00,0x54,0x16,0x00,0x51, 0x04,0x69,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x01,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x85,0x01,0x00,0x94,0x68,0x00,0x15, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xc8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x01,0x01,0x00,0x44,0x16,0x00,0x51, 0x44,0x1d,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x61,0x00,0x23,0x68,0xc8,0x1c,0x11,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x23,0x45,0x1c,0x34,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x30,0x74,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x01, 0x10,0x81,0x85,0x02,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x30,0x64,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01, 0x10,0x81,0x95,0x02,0xe4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x10,0x01,0x01,0x00,0x84,0x02,0x00,0x21,0x94,0x02,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x90,0x49,0x55,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x1d,0x61, 0x00,0x16,0x10,0x00,0x61,0x00,0x23,0x61,0x00,0x1c,0x10,0x00,0x65,0x02,0x00,0x00, 0x40,0x84,0xd6,0x02,0x14,0x1d,0x00,0x05,0x1f,0x00,0x1f,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00, 0x40,0x84,0xc6,0x02,0x0c,0x1d,0x00,0x05,0xc0,0xff,0xc0,0xff,0x65,0x00,0x00,0x00, 0x40,0x84,0x06,0x07,0x04,0x64,0x00,0x05,0x80,0xff,0x80,0xff,0x61,0x00,0x00,0x80, 0x50,0x04,0x15,0x07,0x0c,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00, 0x50,0x84,0x01,0x00,0xcc,0x1d,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x06,0x00,0x80, 0x50,0x04,0x45,0x03,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00, 0x40,0x04,0x06,0x07,0x04,0x07,0x00,0x05,0x14,0x07,0x00,0x00,0x62,0x07,0x80,0x01, 0x50,0x85,0x05,0x08,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x66,0x03,0x00,0x00, 0x40,0x04,0xc6,0x02,0xc4,0x02,0x00,0x05,0x44,0x03,0x00,0x00,0x65,0x00,0x00,0x00, 0x40,0x84,0x06,0x04,0x1c,0x1d,0x00,0x05,0x1f,0x00,0x1f,0x00,0x65,0x03,0x80,0x00, 0x50,0x85,0x01,0x00,0x04,0x08,0x00,0x15,0x01,0x00,0x01,0x00,0x66,0x03,0x00,0x00, 0x40,0x84,0x16,0x03,0xc4,0x02,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x06,0x00,0x80, 0x50,0x00,0xc5,0x02,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x04,0x00,0x00, 0x40,0x84,0x36,0x03,0x04,0x04,0x00,0x05,0x80,0xff,0x80,0xff,0x62,0x02,0x80,0x01, 0x50,0x00,0x45,0x03,0x0c,0x1d,0x00,0x05,0xc4,0x02,0x00,0x00,0x61,0x00,0x05,0xa0, 0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06,0x05,0x04,0x1d,0x00,0x05, 0xcf,0xff,0xcf,0xff,0x61,0x03,0x00,0x00,0x40,0x04,0x0e,0x05,0x44,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0x16,0x05,0x00,0x00,0x00,0x00, 0x0e,0x00,0x0e,0x00,0x61,0x06,0x00,0x00,0x40,0x04,0x1e,0x05,0x34,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x10,0x01,0x01,0x00,0x44,0x1d,0x00,0x31, 0x64,0x1d,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06,0x03,0x04,0x1d,0x00,0x05, 0xf8,0xff,0xf8,0xff,0x61,0x00,0x00,0x00,0x40,0x45,0x26,0x03,0x00,0x00,0x00,0x00, 0x0e,0x00,0x0e,0x00,0x61,0x04,0x02,0x00,0x50,0x00,0x05,0x04,0x05,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01,0x50,0x85,0x85,0x02,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x62,0x02,0x02,0x01,0x50,0x00,0x05,0x09,0x04,0x03,0x20,0x05, 0x05,0x04,0x34,0x00,0x70,0x00,0x00,0x00,0x10,0x81,0x01,0x00,0x54,0x1d,0x00,0x21, 0xff,0xff,0xff,0xff,0x61,0x02,0x02,0x00,0x40,0x04,0x05,0x05,0x04,0x09,0x20,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x06,0x03,0x04,0x1d,0x00,0x05, 0x03,0x00,0x03,0x00,0x66,0x02,0x00,0x00,0x40,0x84,0x06,0x0a,0x04,0x05,0x00,0x05, 0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x15,0x0a,0x04,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x16,0x03,0xd4,0x1d,0x00,0x05, 0x03,0x00,0x03,0x00,0x62,0x02,0x00,0x01,0x50,0x00,0x05,0x08,0x04,0x0a,0x00,0x05, 0x14,0x0a,0x00,0x00,0x70,0x05,0x02,0x00,0x10,0x80,0x01,0x00,0x04,0x03,0x00,0x11, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x36,0x03,0xd4,0x1d,0x00,0x01, 0x02,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x80,0x06,0x04,0xd4,0x1d,0x00,0x01, 0x04,0x00,0x04,0x00,0x61,0x04,0x00,0x00,0x40,0x04,0x06,0x05,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01,0x50,0x85,0x05,0x08,0xe4,0x01,0x00,0x05, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x20,0x82,0xc5,0x02,0x04,0x23,0x00,0x01, 0x04,0x00,0x04,0x00,0x61,0x07,0x00,0x80,0x50,0x00,0xc5,0x07,0x14,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x40,0x84,0x1e,0x03,0x34,0x03,0x00,0x05, 0x03,0x00,0x03,0x00,0x65,0x06,0x00,0x00,0x40,0x84,0x26,0x03,0x04,0x04,0x00,0x05, 0x03,0x00,0x03,0x00,0x65,0x05,0x01,0x00,0x50,0x85,0x01,0x00,0x05,0x08,0x22,0x15, 0x01,0x00,0x01,0x00,0x61,0x00,0x07,0xa8,0xa8,0x00,0x01,0x00,0x68,0x00,0x00,0x00, 0x00,0x80,0x2e,0x03,0xd4,0x1d,0x00,0x01,0x06,0x00,0x06,0x00,0x65,0x07,0x00,0x00, 0x60,0x86,0xa5,0x07,0xc4,0x02,0x00,0x06,0x0f,0x0f,0x0f,0x0f,0x62,0x05,0x01,0x01, 0x50,0x00,0xc5,0x02,0x1d,0x03,0x22,0x05,0xc4,0x07,0x00,0x00,0x65,0x00,0x00,0x00, 0x50,0x85,0x01,0x00,0x24,0x08,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x02,0x01,0x00, 0x40,0x04,0x1d,0x03,0xc4,0x02,0x20,0x00,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x01, 0x50,0x00,0xe5,0x02,0x2c,0x03,0x00,0x05,0xc4,0x07,0x00,0x00,0x70,0x00,0x02,0x00, 0x10,0x80,0x01,0x00,0x04,0x03,0x00,0x11,0x01,0x00,0x01,0x00,0x61,0x02,0x00,0x00, 0x40,0x04,0x2e,0x03,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01, 0x50,0x85,0x35,0x03,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x05,0x01,0x00, 0x50,0x00,0x25,0x09,0x15,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x01,0x00, 0x50,0x00,0x05,0x04,0x25,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x03,0x01,0x00, 0x50,0x85,0x01,0x00,0x35,0x03,0x22,0x25,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00, 0x60,0x86,0x85,0x07,0x04,0x23,0x00,0x06,0x0f,0x0f,0x0f,0x0f,0x62,0x03,0x01,0x01, 0x50,0x00,0x05,0x09,0x1c,0x03,0x00,0x05,0x05,0x04,0x22,0x00,0x62,0x05,0x01,0x01, 0x50,0x00,0x05,0x0a,0x14,0x03,0x00,0x05,0x25,0x09,0x22,0x00,0x70,0x00,0x02,0x00, 0x10,0x80,0x01,0x00,0x04,0x03,0x00,0x11,0x02,0x00,0x02,0x00,0x61,0x02,0x01,0x00, 0x40,0x04,0x15,0x03,0x04,0x0a,0x20,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x01, 0x50,0x85,0x05,0x08,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00, 0x50,0x00,0xc5,0x02,0x15,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x01,0x00, 0x50,0x85,0x01,0x00,0x05,0x08,0x22,0x15,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00, 0x60,0x86,0x45,0x07,0xc4,0x1d,0x00,0x05,0xff,0x00,0xff,0x00,0x62,0x03,0x01,0x01, 0x50,0x00,0xc5,0x07,0x04,0x09,0x20,0x05,0xc5,0x02,0x22,0x00,0x61,0x00,0x01,0x00, 0xa0,0x4a,0x25,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x01,0x00, 0x40,0x04,0x25,0x03,0xc4,0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x00,0x00,0x25,0x05,0xcd,0x1d,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x02,0x02,0x00, 0x50,0x80,0x01,0x00,0x15,0x03,0x34,0x15,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x03,0x0a,0x02,0x62,0x00,0x02,0x01, 0x50,0x80,0x05,0x0b,0x85,0x07,0x34,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x02,0x00, 0x50,0x80,0x01,0x00,0x15,0x03,0x34,0x15,0x03,0x00,0x03,0x00,0x61,0x02,0x02,0x00, 0x00,0x00,0x45,0x05,0x04,0x0b,0x20,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x02,0x11, 0x50,0x80,0x05,0x04,0xa5,0x07,0x34,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x01,0x00, 0x50,0x85,0x01,0x00,0x85,0x02,0x22,0x15,0x01,0x00,0x01,0x00,0x61,0x02,0x02,0x00, 0x00,0x00,0xa5,0x07,0x04,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x11, 0xa0,0x0a,0x25,0x05,0x85,0x1d,0x22,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x50,0x85,0x01,0x00,0xa4,0x02,0x00,0x15,0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x00, 0x90,0x09,0x85,0x05,0x64,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x90,0x09,0x95,0x05,0x44,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x05,0x45,0x23,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x06,0x68, 0x20,0x23,0x11,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x25,0x06,0x04,0x27,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x35,0x06,0x14,0x27,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x45,0x06,0x24,0x27,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x06,0x34,0x27,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x06,0x68,0x98,0x1e,0x11,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x85,0x06,0x24,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0x45,0x03,0x44,0x68,0x00,0x05,0x02,0x00,0x02,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x65,0x05,0xa4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x11, 0xa0,0x0a,0x65,0x05,0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9f,0x04,0x80, 0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xa0,0x14,0x05,0x00,0x00,0x31,0x40,0x03,0x80, 0x00,0x00,0x0c,0x04,0x0c,0x00,0x00,0xa0,0x00,0x00,0x78,0x02,0x61,0x20,0x03,0x80, 0x20,0x02,0x01,0x00,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00, 0x60,0x24,0x05,0x08,0x45,0x02,0x46,0x01,0x14,0x68,0x00,0x00,0x40,0x00,0x03,0x00, 0x60,0x24,0x05,0x07,0x05,0x02,0x46,0x01,0x04,0x68,0x00,0x00,0x61,0x02,0x09,0x61, 0x00,0x08,0x10,0x00,0x69,0x00,0x08,0x61,0x02,0x08,0xa0,0x00,0x61,0x00,0x03,0x00, 0xa0,0x4a,0x05,0x0a,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02,0x00,0x81,0x01,0x02,0x61,0x3f,0x03,0xa1, 0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xc5,0x0a,0x00,0x00,0x00,0x00, 0xbf,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0xa5,0x0a,0x00,0x00,0x00,0x00, 0xdf,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x85,0x0a,0x00,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x65,0x0a,0x00,0x00,0x00,0x00, 0xf7,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x45,0x0a,0x00,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x25,0x0a,0x00,0x00,0x00,0x00, 0xfd,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x4a,0x05,0x0a,0x00,0x00,0x00,0x00, 0xfe,0x00,0x00,0x00,0x66,0x07,0x03,0xa8,0x02,0x08,0x11,0x07,0x31,0xa1,0x03,0x00, 0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xc0,0x14,0x09,0x00,0x00,0x31,0x93,0x04,0x00, 0x00,0x00,0x00,0x00,0x0c,0x03,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x04,0xa1, 0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x04,0x24,0x08,0x00,0x06, 0x24,0x07,0x00,0x00,0x31,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x02,0x30, 0x00,0x00,0x00,0x02,0x61,0x00,0x05,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00, 0x60,0x06,0x05,0x05,0x44,0x08,0x00,0x06,0x44,0x07,0x00,0x00,0x31,0x95,0x04,0x00, 0x00,0x00,0x00,0x00,0x0c,0x05,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x06,0xa1, 0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x06,0x64,0x08,0x00,0x06, 0x64,0x07,0x00,0x00,0x31,0x96,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x02,0x30, 0x00,0x00,0x00,0x02,0x61,0x31,0x09,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00, 0x60,0x06,0x05,0x09,0x84,0x08,0x00,0x06,0x84,0x07,0x00,0x00,0x31,0x98,0x04,0x00, 0x00,0x00,0x00,0x00,0x0c,0x09,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x33,0x03,0xa1, 0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x60,0x06,0x05,0x03,0xa4,0x08,0x00,0x06, 0xa4,0x07,0x00,0x00,0x31,0x99,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x03,0x02,0x30, 0x00,0x00,0x00,0x02,0x61,0x34,0x04,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x04,0xa8, 0xfa,0x08,0x11,0x07,0x31,0x9a,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x02,0x30, 0x00,0x00,0x00,0x02,0x61,0x35,0x05,0xa1,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00, 0x60,0x06,0x05,0x05,0xe4,0x08,0x00,0x06,0xe4,0x07,0x00,0x00,0x31,0x9b,0x04,0x00, 0x00,0x00,0x00,0x00,0x0c,0x05,0x02,0x30,0x00,0x00,0x00,0x02,0x61,0x00,0x7f,0x64, 0x00,0x00,0x10,0x00,0x31,0x01,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x61,0x01,0x00,0x00,0xa0,0x05,0x85,0x02,0x14,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x05,0xe5,0x01,0x04,0x09,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0xac,0x00,0x00,0xa0,0x0a,0x85,0x02,0x84,0x02,0x00,0x10, 0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x8a,0xe5,0x01,0xe4,0x01,0x00,0x0a, 0x08,0x00,0x80,0x3f,0x41,0x9c,0x00,0x00,0xa0,0x0a,0xe5,0x01,0xe4,0x01,0x00,0x0a, 0x84,0x02,0x00,0x00,0x61,0x01,0x03,0xe8,0x85,0x01,0x11,0x00,0x61,0x01,0x00,0x00, 0x90,0x09,0x05,0x09,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x05,0x00, 0x00,0x00,0x00,0x00,0x84,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x61,0x01,0x00,0x00, 0xa0,0x02,0x85,0x02,0x44,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0xa8, 0x88,0x00,0xc1,0xb4,0x61,0x02,0x09,0xe8,0x5d,0x02,0x11,0x00,0x38,0x4d,0x00,0x00, 0xa0,0x0a,0xc5,0x02,0x84,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x09,0xa8, 0x42,0x09,0x31,0x09,0x5b,0xbd,0x00,0x00,0xa0,0x02,0xc4,0x02,0xc4,0x02,0x02,0x02, 0xe4,0x02,0xc4,0x02,0x01,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x20, 0x84,0x00,0x00,0x00,0x61,0x02,0x01,0x00,0xa0,0x02,0x05,0x03,0x05,0x09,0x22,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x60,0x0a,0xe5,0x01,0x24,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00,0xa0,0x0a,0x45,0x03,0xc4,0x02,0x00,0x0a, 0x24,0x03,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x09,0x00,0x06, 0xe4,0x01,0x00,0x02,0x61,0x02,0x04,0xe8,0x45,0x03,0x11,0x00,0x61,0x02,0x00,0x00, 0xa0,0x02,0xa5,0x02,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x04,0x68, 0x66,0x04,0x11,0x00,0x5b,0x01,0x00,0x00,0xa0,0x02,0x84,0x02,0x24,0x03,0x82,0x02, 0x24,0x04,0x84,0x02,0x5b,0x03,0x00,0x00,0xa0,0x02,0x04,0x03,0xa4,0x02,0x82,0x02, 0x24,0x04,0x04,0x03,0x40,0x01,0x00,0x00,0xa0,0x0a,0x85,0x02,0x84,0x02,0x00,0x0a, 0x04,0x03,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0xc5,0x02,0xc4,0x02,0x00,0x0a, 0x84,0x02,0x00,0x00,0x61,0x01,0x05,0xe8,0x6d,0x02,0x11,0x00,0x40,0x01,0x05,0xa8, 0x02,0x05,0x11,0x04,0x41,0x01,0x20,0x22,0x2e,0x05,0x11,0x09,0x49,0x00,0x05,0xa8, 0x2a,0x05,0x11,0x09,0x40,0x01,0x09,0xa8,0xca,0x09,0x31,0x05,0x70,0x01,0x00,0x00, 0x20,0x02,0x01,0x00,0x24,0x09,0x00,0x52,0x44,0x09,0x00,0x00,0x61,0x00,0x00,0x01, 0xa0,0x4a,0x45,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x06,0x25,0x09,0x24,0x09,0x00,0x06,0x44,0x09,0x00,0x02,0x65,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00, 0x00,0x00,0x00,0x00,0xc4,0x68,0x00,0x00,0x00,0x00,0x00,0x00 }; genx_simple_me_gen12lp_isa.h000066400000000000000000000023641443134507600341500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/isa// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_SIMPLE_ME_GEN12LP_ISA_H__ #define __GENX_SIMPLE_ME_GEN12LP_ISA_H__ extern const unsigned char genx_simple_me_gen12lp[292284]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/src/000077500000000000000000000000001443134507600267055ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/src/genx_histogram.cpp000066400000000000000000000021411443134507600324250ustar00rootroot00000000000000// Copyright (c) 2015-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/src/genx_simple_me.cpp000066400000000000000000002777161443134507600324300ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #define MBDATA_SIZE 64 //sizeof(OutObject_t) #define CURBEDATA_SIZE 160 //sizeof(EncCURBEData_t) enum { LIST_0 = 0, LIST_1 = 1 }; enum { FRW = 0, BWD = 1 }; enum { INTRA_MB_FLAG = 0x20 }; #define VME_COPY_DWORD(dst, r, c, src, srcIdx) \ (dst.row(r).format().select<1, 1>(c) = src.format().select<1, 1>(srcIdx)) #define VME_SET_DWORD(dst, r, c, src) \ (dst.row(r).format().select<1, 1>(c) = src.format().select<1, 1>(0)) #define VME_SET_NEIGHBOUR_AVAILABILITY(value) \ { \ vector mask; \ vector leftMask = 0x7c; \ vector upperLeftMask = 0x7c; \ vector upperMask = 0x7c; \ vector upperRightMask = 0x7c; \ vector res; \ /* select left blocks mask */ \ mask = leftBlockNonIntra[0]; \ leftMask.merge(0x1c, mask); \ /* select upper-left blocks mask */ \ mask = upperLeftBlockNonIntra[0]; \ upperLeftMask.merge(0x74, mask); \ /* select upper blocks mask */ \ mask = upperBlockNonIntra[0]; \ upperMask.merge(0x6c, mask); \ /* select upper-right blocks mask */ \ mask = upperRightBlockNonIntra[0]; \ upperRightMask.merge(0x78, mask); \ /* create the mask and save */ \ res = leftMask & upperMask & upperRightMask & upperLeftMask;\ value = res[0]; \ } #define VME_SET_NEIGHBOUR_AVAILABILITY_INTER(uni, neighborMbMask) \ { \ (uni.row(1).format().select<1, 1>(29) = neighborMbMask[0]); \ } #define GET_MBDATA_GET_INTRA_MODE(obj) \ ((obj[0] >> 4) & 3) #define GET_MBDATA_IntraMbFlag(obj) \ ((obj[1] >> 5) & 1) #define GET_MBDATA_MV(mv, mbData, listId) \ mv = (mbData.format()[11 + listId]); #define GET_MBDATA_GET_REF_INDEX(mbData, listId) \ ((char) (mbData.format()[2 + listId])) #define SET_MBDATA_MV(mbData, listId, mv) \ (mbData.format()[11 + listId]) = mv; #define VME_CLEAR_UNIInput_IntraCornerSwap(p) (VME_Input_S1(p, uchar, 1, 28) &= 0x7f) #define VME_SET_CornerNeighborPixel0(p, v) \ (VME_Input_S1(p, uchar, 1, 7) = v) #define VME_SET_CornerNeighborPixel1(p, v) \ (VME_Input_S1(p, uchar, 2, 15) = v) #define VME_SET_CornerNeighborPixelChroma(p, v) \ (VME_Input_S1(p, ushort, 2, 10) = v) #define VME_SET_LeftMbIntraModes(sic, leftMbIntraModes) \ { \ sic.row(2).format().select<1, 1>(16) = (leftMbIntraModes[2] >> 4) | \ (leftMbIntraModes[3] & 0xf0); \ sic.row(2).format().select<1, 1>(17) = (leftMbIntraModes[6] >> 4) | \ (leftMbIntraModes[7] & 0xf0); \ } #define VME_SET_UpperMbIntraModes(sic, upperMbIntraModes) \ { \ sic.row(2).format().select<2, 1>(18) = upperMbIntraModes.select<2, 2>(5);\ } #define VME_INIT_PACK(mbData) \ {mbData = 0;} #define VME_COPY_MB_INTRA_MODE_TYPE(vector, startIdx, srcMatrix) \ vector[startIdx] = VME_Input_G1(srcMatrix, uchar, 0, 0) & 0x0f8 /* clear InterMbMode & SkipMbFlag */; \ vector[startIdx + 1] = (VME_Input_G1(srcMatrix, uchar, 0, 1) & 0x0c0) | \ INTRA_MB_FLAG | \ (VME_Input_G1(srcMatrix, uchar, 0, 2) & 0x01f); \ /* CodedPatternDC */ \ vector[startIdx + 2] = 0x0e; \ /* num MVs and ExtendedForm, ExtendedForm is ignored. HW always set to 0 and default using Extended form*/ \ vector[startIdx + 3] = (VME_Input_G1(srcMatrix, uchar, 0, 3) & 0x1f) | 0x80; /* MV Quantity*/ /*ExtendedForm = (VME_Input_G1(srcMatrix, uchar, 0, 2) & 0x80) |\ // ExtendedForm */ #define VME_GET_UNIInput_SkipModeEn(p) (VME_Output_S1(p, uchar, 1, 0) & 0x1) #define VME_GET_UNIInput_FTEnable(p) (VME_Output_S1(p, uchar, 0, 14) & 0x2) #define VME_SET_UNIInput_BlkSkipEnable(p) (VME_Input_S1(p, uchar, 0, 14) |= 0x08) #define VME_CLEAR_UNIInput_NonSkipModeAdded(p) (VME_Input_S1(p, uchar, 1, 28) &= 0x0bf) #define VME_CLEAR_UNIInput_NonSkipMvAdded(p) (VME_Input_S1(p, uchar, 1, 28) &= 0x0df) #define GET_CURBE_T8x8FlagForInterEn(obj) \ ((obj[0] >> 7) & 1) #define GET_CURBE_SubPelMode(obj) \ ((obj[13] >> 4) & 3) #define GET_CURBE_FTQSkipEnable(obj) \ ((obj[14] >> 1) & 1) #define GET_CURBE_LenSP(obj) \ (obj[8]) #define GET_CURBE_SliceMacroblockHeight(obj) \ (obj[16] + 1) #define GET_CURBE_PictureHeight(obj) \ (obj[17] + 1) #define GET_CURBE_PictureWidth(obj) \ (obj[18] + 1) #define SET_CURBE_PictureHeight(obj, h) \ (obj[17] = h - 1) #define SET_CURBE_PictureWidth(obj, w) \ (obj[18] = w - 1) #define GET_CURBE_QpPrimeY(obj) \ (obj[52]) #define GET_CURBE_FTXCoeffThresh(obj) \ ((obj).format ().select<2, 1> (14)) #define GET_CURBE_SkipVal(obj) \ (obj.format ()[64]) #define GET_CURBE_AllFractional(obj) \ ((obj[145] >> 2) & 1) #define GET_CURBE_isFwdFrameShortTermRef(obj) \ ((obj[150] >> 6) & 1) #define GET_CURBE_CurLayerDQId(obj) \ (obj[148]) enum { INTRA_TYPES_OFFSET = 4 }; enum { PREDSLICE = 0, BPREDSLICE = 1, INTRASLICE = 2 }; _GENX_ inline void SetUpVmeIntra(matrix_ref uniIn, matrix_ref sicIn, vector_ref CURBEData, SurfaceIndex SrcSurfIndex, SurfaceIndex MBDataSurfIndex, uint mbX, uint mbY) { vector leftMbIntraModes = 0x22, upperMbIntraModes = 0x22; matrix leftBlockValues = 0; matrix topBlocksValues = 0; matrix chromaLeftBlockValues = 0; matrix chromaTopBlocksValues = 0; vector leftBlockNonIntra = 1, upperBlockNonIntra = 1, upperRightBlockNonIntra = 1, upperLeftBlockNonIntra = 1; uint x = mbX * 16; uint y = mbY * 16; int offset = 0; const ushort topPresent = ushort(mbY % GET_CURBE_SliceMacroblockHeight(CURBEData)); // read picture's width in MB units uint PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); uint MbIndex = PicWidthInMB * mbY + mbX; cm_wait(); // read left macroblock info if (mbX) { // read left macroblock intra types { vector leftMbInfo; vector mask; // read left macroblock parameters offset = (MbIndex - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, leftMbInfo); // copy left macroblock intra types leftMbIntraModes.select<4, 1> (0) = leftMbInfo.select<4, 1> (4); leftMbIntraModes.select<4, 1> (4) = leftMbInfo.select<4, 1> (8); mask = (0 < (leftMbInfo[1] & 0x1f)); leftMbIntraModes.merge(0x22, mask); leftBlockNonIntra = 0; } // read luminance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y, temp); leftBlockValues = temp.select<16, 1, 1, 1> (0, 3); } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2, temp); chromaLeftBlockValues = temp.select<8, 1, 2, 1> (0, 2); } } // read upper macroblock info if (topPresent) { // read upper macroblock intra types { vector upperMbInfo; vector mask; // read upper macroblock parameters offset = (MbIndex - PicWidthInMB) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperMbInfo); // copy upper macroblock intra types upperMbIntraModes = upperMbInfo.select<8, 1> (4); mask = (0 < (upperMbInfo[1] & 0x1f)); upperMbIntraModes.merge(0x22, mask); upperBlockNonIntra = 0; } // read neighbor samples if (mbX) { upperLeftBlockNonIntra = 0; // read a macroblock neighbors somewhere in the middle if (mbX + 1 < PicWidthInMB) { upperRightBlockNonIntra = 0; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, topBlocksValues); } // read a right-most macroblock neighbors else { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, temp); topBlocksValues.select<1, 1, 20, 1> (0, 0) = temp; topBlocksValues.select<1, 1, 8, 1> (0, 20) = temp.row(0)[19]; } // read chrominance samples read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2 - 1, chromaTopBlocksValues); } // read a left-most macroblock neighbor else { upperRightBlockNonIntra = 0; // read luminance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x, y - 1, temp); topBlocksValues.select<1, 1, 24, 1> (0, 4) = temp; } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x, y / 2 - 1, temp); chromaTopBlocksValues.select<1, 1, 16, 1> (0, 4) = temp; } } { vector mask = 0; mask.select<4, 1> (0) = upperLeftBlockNonIntra[0]; topBlocksValues.select<1, 1, 20, 1> (0, 0).merge(0, mask); chromaTopBlocksValues.merge(0, mask); // upper-right pixels can be used only when B macroblock is available. mask = upperRightBlockNonIntra[0]; topBlocksValues.select<1, 1, 8, 1> (0, 20).merge(topBlocksValues.row(0)[19], mask.select<8, 1> (0)); } } INIT_VME_UNIINPUT(uniIn); INIT_VME_SICINPUT(sicIn); // copy dwords from CURBE data into universal VME header // register M0 // M0.0 Reference 0 Delta // M0.1 Reference 1 Delta // M0.2 Source X/Y VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 VME_COPY_DWORD(uniIn, 0, 3, CURBEData, 3); // M0.4 reserved // M0.5 VME_COPY_DWORD(uniIn, 0, 5, CURBEData, 5); // M0.6 debug // M0.7 debug // register M1 // M1.0/1.1/1.2 uniIn.row(1).format().select<3, 1> (0) = CURBEData.format().select<3, 1> (0); VME_CLEAR_UNIInput_SkipModeEn(uniIn); // M1.3 Weighted SAD // M1.4 Cost center 0 for HSW; MBZ for BDW // M1.5 Cost center 1 for HSW; MBZ for BDW // M1.6 Fwd/Bwd Block RefID // M1.7 various prediction parameters VME_COPY_DWORD(uniIn, 1, 7, CURBEData, 7); VME_CLEAR_UNIInput_IntraCornerSwap(uniIn); VME_SET_NEIGHBOUR_AVAILABILITY((uniIn.row(1).format().select<1, 1> (29))); // register M2 // M2.0/2.1/2.2/2.3/2.4 uniIn.row(2).format().select<5, 1> (0) = CURBEData.format().select<5, 1> (8); // M2.5 FBR parameters // M2.6 SIC Forward Transform Coeff Threshold Matrix // M2.7 SIC Forward Transform Coeff Threshold Matrix // BDW+ // M3.0 FWD Cost center 0 Delta X and Y // M3.1 BWD Cost center 0 Delta X and Y // M3.2 FWD Cost center 1 Delta X and Y // M3.3 BWD Cost center 1 Delta X and Y // M3.4 FWD Cost center 2 Delta X and Y // M3.5 BWD Cost center 2 Delta X and Y // M3.6 FWD Cost center 3 Delta X and Y // M3.7 BWD Cost center 3 Delta X and Y // // set up the SIC message // // register M0 // M0.0 Ref0 Skip Center 0 // M0.1 Ref1 Skip Center 0 // M0.2 Ref0 Skip Center 1 // M0.3 Ref1 Skip Center 1 // M0.4 Ref0 Skip Center 2 // M0.5 Ref1 Skip Center 2 // M0.6 Ref0 Skip Center 3 // M0.3 Ref1 Skip Center 3 // register M1 // M1.0 ACV Intra 4x4/8x8 mode mask // M1.1 AVC Intra Modes sicIn.row(1).format().select<2, 1> (0) = CURBEData.format().select<2, 1> (30); VME_SET_CornerNeighborPixel0(sicIn, topBlocksValues(0, 3)); // M1.2-1.7 Neighbor pixel Luma values sicIn.row(1).format().select<6, 1> (2) = topBlocksValues.format().select<6, 1> (1); // register M2 // M2.0-2.3 Neighbor pixel luma values sicIn.row(2).format().select<4, 1> (0) = leftBlockValues.format().select<4, 1> (0); // M2.4 Intra Predictor Mode VME_SET_LeftMbIntraModes(sicIn, leftMbIntraModes); VME_SET_UpperMbIntraModes(sicIn, upperMbIntraModes); // M2.5 Corner pixel chroma value VME_SET_CornerNeighborPixelChroma(sicIn, (chromaTopBlocksValues.format().select<1, 1>(1))); // M2.6 reserved // M2.7 Penalties for non-DC modes VME_COPY_DWORD(sicIn, 2, 7, CURBEData, 33); // register M3 // M3.0-3.3 Neighbor pixel chroma values sicIn.row(3).format().select<4, 1> (0) = chromaLeftBlockValues.format().select<4, 1> (0); // M3.4-3.7 Neighbor pixel chroma values sicIn.row(3).format().select<4, 1> (4) = chromaTopBlocksValues.format().select<4, 1> (1); } // void SetUpVmeIntra(matrix_ref uniIn, _GENX_ inline void SetUpOutDataISlice(vector_ref MBData, /* vector_ref CURBEData, */ matrix_ref uniOut, uint mbX, uint mbY) { uint PicWidthInMB, PicHeightInMBs; //picture width/height in MB unit MBData = 0; /* // read picture's width in MB units PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); PicHeightInMBs = GET_CURBE_PictureHeight(CURBEData); */ // DW0 MB flags and modes VME_COPY_MB_INTRA_MODE_TYPE(MBData, 0, uniOut); // DW1 & DW2 intra luma modes MBData.format().select<2, 1> (1) = uniOut.row(0).format().select<2, 1> (4); // DW3 intra macroblock struct (ChromaIntraPredMode & IntraPredAvailFlags) MBData.format()[3] = VME_Output_S1(uniOut, uint, 0, 6) & 0x0ff; // DW4 intra cost ushort distIntra; VME_GET_UNIOutput_BestIntraDistortion(uniOut, distIntra); MBData.format()[8] = distIntra; MBData.format()[9] = distIntra; } // void SetUpOutDataISlice(vector_ref MBData, extern "C" _GENX_MAIN_ void DownSampleMB2X(SurfaceIndex SurfIndex, SurfaceIndex Surf2XIndex) { // Luma only uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); uint ix = mbX << 5; // src 32x32 uint iy = mbY << 5; uint ox2x = mbX << 4; // dst 16x16 uint oy2x = mbY << 4; matrix inMb; matrix outMb2x; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 16, inMb.select<16,1,16,1>(16,16)); matrix sum16x32_16; sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x = sum16x32_16.select<16,1,16,1>(0,0) >> 2; write_plane(Surf2XIndex, GENX_SURFACE_Y_PLANE, ox2x, oy2x, outMb2x); } extern "C" _GENX_MAIN_ void DownSampleMB4X(SurfaceIndex SurfIndex, SurfaceIndex Surf4XIndex) { // Luma only uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); uint ix = mbX << 6; // src 64x64 uint iy = mbY << 6; uint ox2x = mbX << 4; // dst 16x16 uint oy2x = mbY << 4; matrix inMb; matrix outMb2x; matrix outMb4x; matrix sum16x32_16; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 0, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 0, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 16, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 0, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 0, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 16, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(0,16) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 32, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 32, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 48, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 48, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(16,0) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 32, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 32, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 48, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 48, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(16,16) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; sum16x32_16.select<16,1,32,1>(0,0) = outMb2x.select<16,2,32,1>(0,0) + outMb2x.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb4x = sum16x32_16.select<16,1,16,1>(0,0) >> 2; write_plane(Surf4XIndex, GENX_SURFACE_Y_PLANE, ox2x, oy2x, outMb4x); } _GENX_ inline void DownSampleMB2Xf(SurfaceIndex SurfIndex, SurfaceIndex Surf2XIndex, uint mbX, uint mbY) { // Luma only uint ix = mbX << 5; // src 32x32 uint iy = mbY << 5; uint ox2x = mbX << 4; // dst 16x16 uint oy2x = mbY << 4; matrix inMb; matrix outMb2x; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix, iy, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 16, inMb.select<16,1,16,1>(16,16)); matrix sum16x32_16; sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x = sum16x32_16.select<16,1,16,1>(0,0) >> 2; write_plane(Surf2XIndex, GENX_SURFACE_Y_PLANE, ox2x, oy2x, outMb2x); } _GENX_ inline void DownSampleMB4Xf(SurfaceIndex SurfIndex, SurfaceIndex Surf4XIndex, uint mbX, uint mbY) { // Luma only uint ix = mbX << 6; // src 64x64 uint iy = mbY << 6; uint ox2x = mbX << 4; // dst 16x16 uint oy2x = mbY << 4; matrix inMb; matrix outMb2x; matrix outMb4x; matrix sum16x32_16; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 0, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 0, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 16, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 0, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 0, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 16, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 16, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(0,16) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 32, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 32, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 0, iy + 48, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 16, iy + 48, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(16,0) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 32, inMb.select<16,1,16,1>(0,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 32, inMb.select<16,1,16,1>(0,16)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 32, iy + 48, inMb.select<16,1,16,1>(16,0)); read_plane(SurfIndex, GENX_SURFACE_Y_PLANE, ix + 48, iy + 48, inMb.select<16,1,16,1>(16,16)); sum16x32_16.select<16,1,32,1>(0,0) = inMb.select<16,2,32,1>(0,0) + inMb.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb2x.select<16,1,16,1>(16,16) = sum16x32_16.select<16,1,16,1>(0,0) >> 2; sum16x32_16.select<16,1,32,1>(0,0) = outMb2x.select<16,2,32,1>(0,0) + outMb2x.select<16,2,32,1>(1,0); sum16x32_16.select<16,1,16,1>(0,0) = sum16x32_16.select<16,1,16,2>(0,0) + sum16x32_16.select<16,1,16,2>(0,1); sum16x32_16.select<16,1,16,1>(0,0) += 2; outMb4x = sum16x32_16.select<16,1,16,1>(0,0) >> 2; write_plane(Surf4XIndex, GENX_SURFACE_Y_PLANE, ox2x, oy2x, outMb4x); } extern "C" _GENX_MAIN_ void EncMB_I(SurfaceIndex CurbeDataSurfIndex, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex /*FwdFrmMBDataSurfIndex*/) { // cm_wait(); uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); vector CURBEData; read(CurbeDataSurfIndex,0,CURBEData.select<128,1>()); read(CurbeDataSurfIndex,128,CURBEData.select<32,1>(128)); // read picture's width in MB units uint PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); uint MbIndex = PicWidthInMB * mbY + mbX; int offset; #ifndef MFX_ENABLE_DOWN_SAMPLE_KERNELS // down scale uint LaScaleFactor = GET_CURBE_CurLayerDQId(CURBEData); if (LaScaleFactor == 2) { DownSampleMB2Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } else if (LaScaleFactor == 4) { DownSampleMB4Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } #endif // declare parameters for VME matrix uniIn; matrix sicIn; matrix best_uniOut; SetUpVmeIntra(uniIn, sicIn, CURBEData, SrcSurfIndex, MBDataSurfIndex, mbX, mbY); // call intra/skip motion estimation run_vme_sic(uniIn, sicIn, VMEInterPredictionSurfIndex, best_uniOut); // // write the result // vector MBData; // pack the VME result SetUpOutDataISlice(MBData/*, CURBEData*/, best_uniOut, mbX, mbY); // write back updated MB data offset = MbIndex * MBDATA_SIZE; write(MBDataSurfIndex, offset, MBData.select(0)); cm_fence(); cm_signal(); } _GENX_ inline void GetMedianVector(vector_ref mvMedian, vector mvA, vector mvB, vector mvC) { vector tmpMvA; vector maskA, maskB, maskC; tmpMvA = mvA; maskA = (mvA > mvB); maskB = (mvB > mvC); maskC = (mvC > mvA); mvA.merge(mvB, maskA); mvB.merge(mvC, maskB); mvC.merge(tmpMvA, maskC); mvMedian = mvA ^ mvB ^ mvC; } // void GetMedianVector(vector_ref mvMedian, _GENX_ inline void GetNeighbourParamP(matrix_ref leftBlockValues, matrix_ref topBlocksValues, matrix_ref chromaLeftBlockValues, matrix_ref chromaTopBlocksValues, vector_ref leftMbIntraModes, vector_ref upperMbIntraModes, vector_ref neighborMbMask, vector_ref mvPred, vector_ref skipMvPred, SurfaceIndex SrcSurfIndex, SurfaceIndex MBDataSurfIndex, vector_ref CURBEData, uint x, uint y, uint mbIndex, uint PicWidthInMB) { vector mvA, mvB, mvC, tmp, equalMV; vector equalMask, equalNum = 0; vector refIdxA, refIdxB, refIdxC, refIdxD; // neighbors mask vector leftMask = 0; vector upperMask = 0; vector upperRightMask = 0; vector upperLeftMask = 0; const uint mbX = x / 16; const uint mbY = y / 16; const uchar topPresent = mbY % GET_CURBE_SliceMacroblockHeight(CURBEData); // reset output(s) leftBlockValues = 0; topBlocksValues = 0; chromaLeftBlockValues = 0; chromaTopBlocksValues = 0; leftMbIntraModes = 0x2222; upperMbIntraModes = 0x2222; neighborMbMask = 0; mvPred = 0; skipMvPred = 0; // there are no neighbors if (0 == (x | topPresent)) { return; } cm_wait(); // read left macroblock parameters refIdxA = -1; mvA = 0; if (mbX) { vector leftMbData; vector intraMbFlagMask; uchar intraMbFlag, intraMbMode; int offset; // read intra types offset = (mbIndex - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, leftMbData); intraMbMode = GET_MBDATA_GET_INTRA_MODE(leftMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(leftMbData); intraMbFlagMask = (intraMbFlag & (0 < intraMbMode)); leftMbIntraModes.merge(leftMbData.select<8, 1> (INTRA_TYPES_OFFSET), intraMbFlagMask); leftMask = 0x60; // read motion vector GET_MBDATA_MV(tmp.format()[0], leftMbData, LIST_0); // read reference index refIdxA = GET_MBDATA_GET_REF_INDEX(leftMbData, 0); // check if the macroblock has forward motion vector. // In P slice we need to only check for not-INTRA type. mvA.merge(tmp, (intraMbFlag - 1)); refIdxA.merge(uint(-1), intraMbFlag); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask = (0 == refIdxA[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } // read upper macroblock parameters refIdxB = -1; mvB = 0; refIdxC = -1; mvC = 0; if (topPresent) { vector upperMbData; vector intraMbFlagMask; uchar intraMbFlag, intraMbMode, intraMbFlagD = 0; int offset; // read intra types offset = (mbIndex - PicWidthInMB) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperMbData); intraMbMode = GET_MBDATA_GET_INTRA_MODE(upperMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(upperMbData); intraMbFlagMask = (intraMbFlag & (0 < intraMbMode)); upperMbIntraModes.merge(upperMbData.select<8, 1> (INTRA_TYPES_OFFSET), intraMbFlagMask); upperMask = 0x10; // read motion vector GET_MBDATA_MV(tmp.format()[0], upperMbData, LIST_0); // read reference index refIdxB = GET_MBDATA_GET_REF_INDEX(upperMbData, 0); // check if the macroblock has forward motion vector. // In P slice we need to only check for not-INTRA type. mvB.merge(tmp, (intraMbFlag - 1)); refIdxB.merge(uint(-1), intraMbFlag); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask = (0 == refIdxB[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; // read macroblock type for upper left neighbor if (mbX) { vector upperLeftMbData; // read intra types offset = (mbIndex - PicWidthInMB - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperLeftMbData); intraMbFlagD = GET_MBDATA_IntraMbFlag(upperLeftMbData); upperLeftMask = 0x08; // read reference index refIdxD = GET_MBDATA_GET_REF_INDEX(upperLeftMbData, 0); } // read third macroblock if (mbX + 1 < PicWidthInMB) { vector upperRightMbData; // read intra types offset = (mbIndex - PicWidthInMB + 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperRightMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(upperRightMbData); upperRightMask = 0x04; // read motion vector GET_MBDATA_MV(tmp.format()[0], upperRightMbData, LIST_0); // read reference index refIdxC = GET_MBDATA_GET_REF_INDEX(upperRightMbData, 0); // check if the macroblock has forward motion vector. // In P slice we need to only check for not-INTRA type. mvC.merge(tmp, (intraMbFlag - 1)); refIdxC.merge(uint(-1), intraMbFlag); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask = (0 == refIdxC[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } // read fourth macroblock else if (mbX) { vector upperLeftMbData; // read motion vector offset = (mbIndex - PicWidthInMB - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperLeftMbData); GET_MBDATA_MV(tmp.format()[0], upperLeftMbData, LIST_0); // check if the macroblock has forward motion vector. // In P slice we need to only check for not-INTRA type. mvC.merge(tmp, (intraMbFlagD - 1)); refIdxC.merge(uint(-1), refIdxD, intraMbFlagD); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask = (0 == refIdxC[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } } // make neighbor's mask for intra prediction neighborMbMask = leftMask | upperMask | upperLeftMask | upperRightMask; // // read planes // if (leftMask[0]) { // read luminance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y, temp); leftBlockValues = temp.select<16, 1, 1, 1> (0, 3); } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2, temp); chromaLeftBlockValues = temp.select<8, 1, 2, 1> (0, 2); } } if (upperMask[0]) { if (upperLeftMask[0]) { // read luminance samples if (upperRightMask[0]) { read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, topBlocksValues); } else { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, temp); topBlocksValues.select<1, 1, 20, 1> (0, 0) = temp; topBlocksValues.select<1, 1, 8, 1> (0, 20) = temp.row(0)[19]; } // read chrominance samples read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2 - 1, chromaTopBlocksValues); } else { // read luminance samples if (upperRightMask[0]) { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x, y - 1, temp); topBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; topBlocksValues.select<1, 1, 24, 1> (0, 4) = temp; } else { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x, y - 1, temp); topBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; topBlocksValues.select<1, 1, 16, 1> (0, 4) = temp; topBlocksValues.select<1, 1, 8, 1> (0, 20) = temp.row(0)[15]; } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x, y / 2 - 1, temp); chromaTopBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; chromaTopBlocksValues.select<1, 1, 16, 1> (0, 4) = temp; } } } // // calculate motion vector predictor // // select median motion vector { vector maskA, maskB, maskC; GetMedianVector(mvPred, mvA, mvB, mvC); // there is a condition in the standard, that if only one neighbor has // the same refIdx like the current block, the vector from this neighbor // block must be used for prediction. equalMask = (1 == equalNum); mvPred.merge(equalMV, equalMask); skipMvPred = mvPred; // skip vector prediction is not zero if and only if A and B macroblocks // are exists and both of them have non-zero reference indices and vectors. maskA = ((0 == mbX) || (0 == topPresent)); skipMvPred.merge(0, maskA); maskA = (0 == (refIdxA[0] | mvA[0] | mvA[1])); skipMvPred.merge(0, maskA); maskB = (0 == (refIdxB[0] | mvB[0] | mvB[1])); skipMvPred.merge(0, maskB); } } // void GetNeighbourParamP(vector_ref leftMbIntraModes, #define VME_COPY_MB_INTER_MODE_TYPE(vector, startIdx, uniOut) \ /* InterMbMode, SkipMbFlag, IntraMbMode, FieldMbPolarityFlag */ \ vector[startIdx] = VME_Input_G1(uniOut, uchar, 0, 0) & 0x0cf; \ /* MbType5Bits, IntraMbFlag, FieldMbFlag, Transform8x8Flag */ \ vector[startIdx + 1] = VME_Input_G1(uniOut, uchar, 0, 1); \ { \ U8 mbSubShape; \ uchar value; \ VME_GET_UNIOutput_SubMbShape(uniOut, mbSubShape); \ value = vector[startIdx + 1] | (CURBEData[0] & 0x080); \ transformMask = (0 == mbSubShape); \ vector.select<1, 1> (startIdx + 1).merge(value, transformMask); \ } \ /* CodedPatternDC */ \ vector[startIdx + 2] = 0x0e; \ /* num MVs and ExtendedForm, ExtendedForm is ignored. HW always set to 0 and default using Extended form*/ \ vector[startIdx + 3] = (VME_Input_G1(uniOut, uchar, 0, 3) & 0x1f) | 0x80; /* MV Quantity*/ /*ExtendedForm = (VME_Input_G1(srcMatrix, uchar, 0, 2) & 0x80) |\ // ExtendedForm*/ #define _VME_GET_UNIOutput_InterDistortion(uniOut, v) \ (v = VME_Output_S1(uniOut, ushort, 0, 4)) #define VME_SET_UNIOutput_InterDistortion(uniOut, v) \ (VME_Input_S1(uniOut, ushort, 0, 4) = v) #define VME_SET_IMEOutput_Rec0_16x16_Distortion(imeOut, v) \ (VME_Input_S1(imeOut, ushort, 0, 8) = v) #define VME_SET_IMEOutput_Rec0_Distortions(imeOut, v) \ (VME_Input_S1(imeOut, uint, 0, 0) = v); \ (VME_Input_S1(imeOut, uint, 0, 1) = v); \ (VME_Input_S1(imeOut, uint, 0, 2) = v); \ (VME_Input_S1(imeOut, uint, 0, 3) = v) #define VME_SET_IMEOutput_Rec1_16x16_Distortion(imeOut, v) \ (VME_Input_S1(imeOut, ushort, 2, 8) = v) #define VME_SET_IMEOutput_Rec1_Distortions(imeOut, v) \ (VME_Input_S1(imeOut, uint, 2, 0) = v); \ (VME_Input_S1(imeOut, uint, 2, 1) = v); \ (VME_Input_S1(imeOut, uint, 2, 2) = v); \ (VME_Input_S1(imeOut, uint, 2, 3) = v) #define VME_SET_UNIOutput_BestIntraDistortion(uniOut, v) \ (VME_Input_S1(uniOut, ushort, 0, 6) = v) #define VME_SET_IMEInput_Distortions(p, v) \ (p.row(2).format().select<4, 1>(0) = v); \ (p.row(4).format().select<4, 1>(0) = v) #define VME_SET_UNIOutput_SkipRawDistortion(p, v) (VME_Input_S1(p, ushort, 0, 5) = v) #define VME_SET_UNIInput_SkipModeEnable(obj, value) \ (obj.row(1)[0] = ((obj.row(1)[0] & 0x0fe) | (value & 1))) _GENX_ inline void SetRef(matrix uniIn, vector_ref Ref, vector Predictor, vector_ref Search, vector_ref PicSize, short maxMvLenY) { vector Width = (Search - 16) >> 1; vector MaxMvLen; vector RefSize; vector mask; vector res, otherRes; // set up parameters MaxMvLen[0] = 512; MaxMvLen[1] = maxMvLenY / 4; RefSize[0] = PicSize[1] * 16; RefSize[1] = (PicSize[0] + 1) * 16; /* fields and MBAFF are not supported */ // remove quater pixel fraction Predictor >>= 2; // // set the reference position // Ref = Predictor; Ref[1] &= -2; Ref -= Width; res = MaxMvLen - Width; mask = (Predictor > res); otherRes = MaxMvLen - (Search - 16); Ref.merge(otherRes, mask); res = -res; mask = (Predictor < res); otherRes = -MaxMvLen; Ref.merge(otherRes, mask); // // saturate to reference dimension // res = Ref + uniIn.row(0). format().select<2, 1> (4); mask = (RefSize <= res); otherRes = ((RefSize - 1) & ~3) - uniIn.row(0). format().select<2, 1> (4); Ref.merge(otherRes, mask); res = Ref + uniIn.row(0). format().select<2, 1> (4) + Search; mask = (0 >= res); otherRes = ((-Search + 5) & ~3) - uniIn.row(0). format().select<2, 1> (4); Ref.merge(otherRes, mask); Ref[1] &= -2; } // void SetRef(matrix_ref uniIn, enum { MbMode_16x16 = 0, MbMode_16x8 = 1, MbMode_8x16 = 2, MbMode_8x8 = 3 }; _GENX_ inline void SetUpVmePSlice(matrix_ref uniIn, matrix_ref sicIn, matrix_ref Costs, SurfaceIndex SrcSurfIndex, SurfaceIndex MBDataSurfIndex, vector_ref CURBEData, uint x, uint y, uint MbIndex, vector_ref mvPred) { vector leftMbIntraModes, upperMbIntraModes; vector neighborMbMask; vector skipMvPred; matrix leftBlockValues; matrix topBlocksValues; matrix chromaLeftBlockValues; matrix chromaTopBlocksValues; uint PicWidthInMB; // read picture's width in MB units PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); GetNeighbourParamP(leftBlockValues, topBlocksValues, chromaLeftBlockValues, chromaTopBlocksValues, leftMbIntraModes, upperMbIntraModes, neighborMbMask, mvPred, skipMvPred, SrcSurfIndex, MBDataSurfIndex, CURBEData, x, y, MbIndex, PicWidthInMB); // copy dwords from CURBE data into universal VME header // register M0 // M0.0 Reference 0 Delta // M0.1 Reference 1 Delta // M0.2 Source X/Y VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 VME_COPY_DWORD(uniIn, 0, 3, CURBEData, 3); // M0.4 reserved // M0.5 VME_COPY_DWORD(uniIn, 0, 5, CURBEData, 5); SetRef(uniIn, uniIn.row(0).format().select<2, 1> (0), mvPred, uniIn.row(0).format().select<2, 1> (22), CURBEData.format().select<2, 1> (17), CURBEData.format()[68]); // M0.6 debug // M0.7 debug // register M1 // M1.0/1.1/1.2 Search path parameters & start centers uniIn.row(1).format ().select<3, 1> (0) = CURBEData.format ().select<3, 1> (0); { vector Start0; Start0 = uniIn.row(0).format().select<2, 1> (22); Start0 = ((Start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = Start0[0] | (Start0[1] << 4); } // M1.3 Weighted SAD (not used for HSW) // M1.4 Cost center 0 for HSW; MBZ for BDW // M1.5 Cost center 1 for HSW; MBZ for BDW // M1.6 Fwd/Bwd Block RefID (used in B slices only) // M1.7 various prediction parameters VME_COPY_DWORD(uniIn, 1, 7, CURBEData, 7); VME_CLEAR_UNIInput_IntraCornerSwap(uniIn); VME_SET_NEIGHBOUR_AVAILABILITY_INTER(uniIn, neighborMbMask); // register M2 // M2.0 // M2.5 FBR parameters // M2.6/2.7 SIC Forward Transform Coeff Threshold Matrix uniIn.row(2).format ().select<2, 1> (6) = CURBEData.format ().select<2, 1> (14); // BDW+ // register M3 // M3.0 FWD Cost center 0 Delta X and Y VME_COPY_DWORD(uniIn, 3, 0, mvPred, 0); // M3.1 BWD Cost center 0 Delta X and Y // M3.2 FWD Cost center 1 Delta X and Y // M3.3 BWD Cost center 1 Delta X and Y // M3.4 FWD Cost center 2 Delta X and Y // M3.5 BWD Cost center 2 Delta X and Y // M3.6 FWD Cost center 3 Delta X and Y // M3.7 BWD Cost center 3 Delta X and Y // // initialize SIC input // // register M0 // 0.0 Ref0 Skip Center 0 Delta XY VME_SET_DWORD(sicIn, 0, 0, skipMvPred); // 0.1 Ref1 Skip Center 0 Delta XY (not used in P slices) // 0.2 Ref0 Skip Center 1 Delta XY (not used in P slices) // 0.3 Ref1 Skip Center 1 Delta XY (not used in P slices) // 0.4 Ref0 Skip Center 2 Delta XY (not used in P slices) // 0.5 Ref1 Skip Center 2 Delta XY (not used in P slices) // 0.6 Ref0 Skip Center 3 Delta XY (not used in P slices) // 0.7 Ref1 Skip Center 3 Delta XY (not used in P slices) // register M1 // M1.0 ACV Intra 4x4/8x8 mode mask sicIn.row(1).format ().select<2, 1> (0) = CURBEData.format ().select<2, 1> (30); VME_SET_CornerNeighborPixel0(sicIn, topBlocksValues(0, 3)); // M1.2/1.3/1.4/1.5/1.6/1.7 Neighbor pixel Luma values sicIn.row(1).format ().select<6, 1> (2) = topBlocksValues.format ().select<6, 1> (1); // register M2 // M2.0/2.1/2.2/2.3 Neighbor pixel luma values sicIn.row(2).format ().select<4, 1> (0) = leftBlockValues.format ().select<4, 1> (0); // M2.4 Intra Predictor Mode VME_SET_LeftMbIntraModes(sicIn, leftMbIntraModes); VME_SET_UpperMbIntraModes(sicIn, upperMbIntraModes); // M2.5 Corner pixel chroma value VME_SET_CornerNeighborPixelChroma(sicIn, (chromaTopBlocksValues.format().select<1, 1>(1))); // M2.6 reserved // M2.7 Penalties for non-DC modes VME_COPY_DWORD(sicIn, 2, 7, CURBEData, 33); // register M3 // M3.0/3.1/3.2/3.3 Neighbor pixel chroma values sicIn.row(3).format ().select<4, 1> (0) = chromaLeftBlockValues.format ().select<4, 1> (0); // M3.4/3.5/3.6/3.7 Neighbor pixel chroma values sicIn.row(3).format ().select<4, 1> (4) = chromaTopBlocksValues.format ().select<4, 1> (1); // set costs Costs.row(0).format ().select<2, 1> (0) = mvPred; } // void SetUpVmePSlice(matrix_ref uniIn, _GENX_ inline void LoadCosts(matrix_ref uniIn, vector_ref CURBEData) { // copy prepared costs from the CURBE data uniIn.row(2).format().select<5, 1> (0) = CURBEData.format().select<5, 1> (8); } // void LoadCosts(matrix_ref uniIn, _GENX_ inline void LoadSearchPath(matrix_ref imeIn, vector_ref CURBEData) { // copy prepared search pathes from the CURBE data imeIn.format().select<2, 1, 8, 1> (0, 0) = CURBEData.format().select<2, 1, 8, 1> (2, 0); } // void LoadSearchPath(matrix_ref imeIn, _GENX_ inline void PrepareFractionalCall(matrix_ref uniIn, matrix_ref fbrIn, matrix_ref uniOut, uchar CheckBiDir) { U8 FBRMbMode, FBRSubMbShape, FBRSubPredMode; // copy mb mode VME_GET_UNIOutput_InterMbMode(uniOut, FBRMbMode); VME_SET_UNIInput_FBRMbModeInput(uniIn, FBRMbMode); // copy sub mb shape VME_GET_UNIOutput_SubMbShape(uniOut, FBRSubMbShape); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, FBRSubMbShape); // copy sub mb prediction modes VME_GET_UNIOutput_SubMbPredMode(uniOut, FBRSubPredMode); VME_SET_UNIInput_FBRSubPredModeInput(uniIn, FBRSubPredMode); if (!CheckBiDir || FBRSubMbShape) VME_SET_UNIInput_BMEDisableFBR(uniIn); else VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); // copy MVs fbrIn = uniOut.select<4, 1, 32, 1> (1, 0); } // void PrepareFractionalCall(matrix_ref uniIn, template _GENX_ inline void DoInterFramePrediction(SurfaceIndex VMEInterPredictionSurfIndex, matrix_ref uniIn, matrix_ref imeIn, matrix_ref Costs, matrix_ref best_uniOut, vector_ref direct8x8pattern, vector_ref CURBEData) { matrix fbrIn = 0; matrix best_imeOut = 0; VME_SET_UNIOutput_InterDistortion(best_uniOut, -1); VME_SET_IMEOutput_Rec0_16x16_Distortion(best_imeOut, -1); VME_SET_IMEOutput_Rec0_Distortions(best_imeOut, -1); VME_SET_IMEOutput_Rec1_16x16_Distortion(best_imeOut, -1); VME_SET_IMEOutput_Rec1_Distortions(best_imeOut, -1); direct8x8pattern = 0; if (sliceType == PREDSLICE) { { { matrix temp = 0; vector ref0; vector costCenter; matrix uniIn0 = uniIn; matrix imeIn0 = imeIn.select<2, 1, 32, 1> (0, 0); ref0 = uniIn.row(0).format ().select<2, 1> (0); costCenter = uniIn.row(3).format ().select<16, 1> (0); run_vme_ime(uniIn0, imeIn0, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, VMEInterPredictionSurfIndex, ref0, NULL, costCenter, temp); best_uniOut = temp.select<7, 1, 32, 1> (0, 0); best_imeOut.select<2, 1, 32, 1> (0, 0) = temp.select<2, 1, 32, 1> (7, 0); } PrepareFractionalCall(uniIn, fbrIn, best_uniOut, 0); uchar FBRMbMode, FBRSubMbShape, FBRSubPredMode; // copy mb mode FBRMbMode = VME_GET_UNIInput_FBRMbModeInput(uniIn); // copy sub mb shape FBRSubMbShape = VME_GET_UNIInput_FBRSubMBShapeInput(uniIn); // copy sub mb prediction modes FBRSubPredMode = VME_GET_UNIInput_FBRSubPredModeInput(uniIn); if (GET_CURBE_SubPelMode(CURBEData)) { matrix uniIn0 = uniIn; matrix temp; run_vme_fbr(uniIn0, fbrIn, VMEInterPredictionSurfIndex, FBRMbMode, FBRSubMbShape, FBRSubPredMode, temp); best_uniOut = temp; } } } else if (sliceType == BPREDSLICE) { { { matrix temp; vector ref0, ref1; vector costCenter; matrix uniIn0 = uniIn; matrix imeIn0 = imeIn.select<2, 1, 32, 1> (0, 0); ref0 = uniIn.row(0).format ().select<2, 1> (0); ref1 = uniIn.row(0).format ().select<2, 1> (2); costCenter = uniIn.row(3).format ().select<16, 1> (0); run_vme_ime(uniIn0, imeIn0, VME_STREAM_OUT, VME_SEARCH_DUAL_REF_DUAL_REC, VMEInterPredictionSurfIndex, ref0, ref1, costCenter, temp); best_uniOut = temp.select<7, 1, 32, 1> (0, 0); best_imeOut.select<4, 1, 32, 1> (0, 0) = temp.select<4, 1, 32, 1> (7, 0); } PrepareFractionalCall(uniIn, fbrIn, best_uniOut, 1); uchar FBRMbMode, FBRSubMbShape, FBRSubPredMode; // copy mb mode FBRMbMode = VME_GET_UNIInput_FBRMbModeInput(uniIn); // copy sub mb shape FBRSubMbShape = VME_GET_UNIInput_FBRSubMBShapeInput(uniIn); // copy sub mb prediction modes FBRSubPredMode = VME_GET_UNIInput_FBRSubPredModeInput(uniIn); if (GET_CURBE_SubPelMode(CURBEData)) { matrix uniIn0 = uniIn; matrix temp; run_vme_fbr(uniIn0, fbrIn, VMEInterPredictionSurfIndex, FBRMbMode, FBRSubMbShape, FBRSubPredMode, temp); best_uniOut = temp; } } } } // void DoInterFramePrediction(SurfaceIndex VMEInterPredictionSurfIndex, _GENX_ inline void SetUpDataPSlice(matrix_ref uniIn, matrix_ref uniOut, vector_ref MBData, U8 /*direct8x8pattern*/, vector_ref CURBEData, U32 x, U32 y, uint MbIndex) { vector intraPredParam, interPredParam = 0; vector intraMask; vector transformMask; ushort distInter, distIntra, distSkip; vector intraMbType; uchar intraMbFlag; VME_INIT_PACK(MBData); // set the mask to select INTRA data VME_GET_UNIOutput_BestInterDistortion(uniOut, distInter); VME_GET_UNIOutput_BestIntraDistortion(uniOut, distIntra); VME_GET_UNIOutput_SkipRawDistortion(uniOut, distSkip); intraMbFlag = (distInter > distIntra); intraMask = intraMbFlag; // DW0 MB flags and modes VME_COPY_MB_INTRA_MODE_TYPE(intraMbType, 0, uniOut); VME_COPY_MB_INTER_MODE_TYPE(MBData, 0, uniOut); MBData.select<4, 1> (0).merge(intraMbType, intraMask); MBData.select<1, 1> (0).merge(MBData[0] | 4, distSkip != 65535); // DW1-3 intra luma modes & intra macroblock struct intraPredParam = uniOut.row(0).format().select<3, 1> (4); intraPredParam[2] = intraPredParam[2] & 0x0ff; // DW1-3 inter luma modes & inter macroblock struct interPredParam.format().select<2, 1> (0) = uniOut.row(0).select<2, 1> (25); interPredParam[1] = uniOut.row(6).format()[0] & 0x0f0f0f0f; interPredParam[2] = uint(-1); // select correct macroblock parameters MBData.format().select<3, 1> (1) = interPredParam; MBData.format().select<3, 1> (1).merge(intraPredParam, intraMask.select<3, 1> (0)); // DW4 costs MBData.format()[8] = distIntra; MBData.format()[9] = distInter; // DW6-7 sum luma coeffs MBData.format().select<4, 1>(12) = uniOut.row(6).format().select<4, 1>(4); // DW8 num nz luma coeffs MBData.format().select<4, 1>(32) = uniOut.row(6).format().select<4, 1>(4); // DW9-10 cost centers like in HSW (to support multiref in BDW one needs to extend MBData) MBData.format().select<1, 1>(18) = VME_GET_UNIInput_FWDCostCenter0_X(uniIn); MBData.format().select<1, 1>(19) = VME_GET_UNIInput_FWDCostCenter0_Y(uniIn); MBData.format().select<1, 1>(20) = VME_GET_UNIInput_BWDCostCenter0_X(uniIn); MBData.format().select<1, 1>(21) = VME_GET_UNIInput_BWDCostCenter0_Y(uniIn); // copy motion vectors SET_MBDATA_MV(MBData, LIST_0, uniOut.row(1).format()[0]); } // void SetUpDataPSlice(matrix_ref uniIn, extern "C" _GENX_MAIN_ void EncMB_P(SurfaceIndex CurbeDataSurfIndex, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex /*FwdFrmMBDataSurfIndex*/) { // cm_wait(); uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); uint x = mbX * 16; uint y = mbY * 16; int offset = 0; uint PicWidthInMB, PicHeightInMBs; //picture width/height in MB unit vector CURBEData; read(CurbeDataSurfIndex,0,CURBEData.select<128,1>()); read(CurbeDataSurfIndex,128,CURBEData.select<32,1>(128)); // read picture's width in MB units PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); PicHeightInMBs = GET_CURBE_PictureHeight(CURBEData); uint MbIndex = PicWidthInMB * mbY + mbX; vector direct8x8pattern = 0; matrix uniIn = 0; matrix best_uniOut = 0; { // declare parameters for VME matrix imeIn = 0; matrix sicIn = 0; matrix sic_uniOut = 0; matrix Costs = 0; vector mvPred = 0; vector ref0; U8 ftqSkip = 0; // down scale uint LaScaleFactor = GET_CURBE_CurLayerDQId(CURBEData); if (LaScaleFactor == 2) { DownSampleMB2Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } else if (LaScaleFactor == 4) { DownSampleMB4Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } SetUpVmePSlice(uniIn, sicIn, Costs, SrcSurfIndex, MBDataSurfIndex, CURBEData, x, y, MbIndex, mvPred); ftqSkip = VME_GET_UNIInput_FTEnable(uniIn); VME_SET_UNIOutput_BestIntraDistortion(best_uniOut, -1); VME_SET_UNIOutput_InterDistortion(best_uniOut, -1); VME_SET_UNIOutput_SkipRawDistortion(best_uniOut, -1); { LoadCosts(uniIn, CURBEData); LoadSearchPath(imeIn, CURBEData); // call intra/skip motion estimation run_vme_sic(uniIn, sicIn, VMEInterPredictionSurfIndex, sic_uniOut); vector Coeffs = cm_sum(sic_uniOut.row(6).format().select<4, 1> (4)); vector sic_uniOut_DistSkip; vector sic_uniOut_DistInter; uint SkipModeEn = VME_GET_UNIInput_SkipModeEn(uniIn); uchar ifCondition; // get acceptable skip value ushort SkipVal = GET_CURBE_SkipVal(CURBEData); VME_GET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip[0]); _VME_GET_UNIOutput_InterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); Coeffs.merge(ushort(-1), SkipModeEn - 1); sic_uniOut_DistSkip.merge(ushort(-1), SkipModeEn - 1); sic_uniOut_DistInter.merge(ushort(-1), SkipModeEn - 1); ifCondition = (ftqSkip && Coeffs[0]) || (!ftqSkip && sic_uniOut_DistSkip[0] > SkipVal); sic_uniOut_DistSkip.merge(ushort(-1), ifCondition); VME_SET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip[0]); VME_SET_UNIOutput_InterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); if ((!VME_GET_UNIInput_SkipModeEn(uniIn)) || ifCondition) { // Calculate AVC INTER prediction costs DoInterFramePrediction (VMEInterPredictionSurfIndex, uniIn, imeIn, Costs, best_uniOut, direct8x8pattern, CURBEData); } VME_GET_UNIOutput_BestInterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); ushort sic_uniOut_DistIntra; VME_GET_UNIOutput_BestIntraDistortion(sic_uniOut, sic_uniOut_DistIntra); VME_SET_UNIOutput_BestIntraDistortion(best_uniOut, sic_uniOut_DistIntra); VME_GET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip); VME_SET_UNIOutput_SkipRawDistortion(best_uniOut, sic_uniOut_DistSkip); ushort best_uniOut_DistInter; VME_GET_UNIOutput_BestInterDistortion(best_uniOut, best_uniOut_DistInter); if ((sic_uniOut_DistIntra < best_uniOut_DistInter) || (!ftqSkip && sic_uniOut_DistSkip[0] < SkipVal) || (ftqSkip && !Coeffs[0]) || (sic_uniOut_DistInter[0] < best_uniOut_DistInter)) { if (ftqSkip && !Coeffs[0]) { VME_SET_UNIOutput_SkipRawDistortion(sic_uniOut, 0); } direct8x8pattern = 0xf; best_uniOut = sic_uniOut; } else { vector lumanzc = sic_uniOut.row(6).format().select<4, 1>(4); vector chromanzc = sic_uniOut.row(6).format().select<2, 1>(16); vector lumacoeffs = sic_uniOut.row(6).format().select<4, 1>(4); vector chromacoeffs = sic_uniOut.row(6).format().select<2, 1>(10); best_uniOut.row(6).format().select<4, 1>(4) = lumanzc; best_uniOut.row(6).format().select<2, 1>(16) = chromanzc; best_uniOut.row(6).format().select<4, 1>(4) = lumacoeffs; best_uniOut.row(6).format().select<2, 1>(10) = chromacoeffs; } } } // // write the result // vector MBData; // pack the VME result SetUpDataPSlice(uniIn, best_uniOut, MBData, direct8x8pattern[0], CURBEData, x, y, MbIndex); // write back updated MB data offset = MbIndex * MBDATA_SIZE; write(MBDataSurfIndex, offset, MBData); cm_fence(); cm_signal(); } _GENX_ inline void GetNeighbourParamB(matrix_ref leftBlockValues, matrix_ref topBlocksValues, matrix_ref chromaLeftBlockValues, matrix_ref chromaTopBlocksValues, vector_ref leftMbIntraModes, vector_ref upperMbIntraModes, vector_ref neighborMbMask, matrix_ref MV, matrix_ref refIdx, SurfaceIndex SrcSurfIndex, SurfaceIndex MBDataSurfIndex, vector_ref CURBEData, uint x, uint y, uint mbIndex, uint mbWidth) { matrix mvA, mvB, mvC, tmp, equalMV; matrix equalMask, equalNum = 0; matrix refIdxA, refIdxB, refIdxC, refIdxD, tmpRefIdx; // neighbors mask vector leftMask = 0; vector upperMask = 0; vector upperRightMask = 0; vector upperLeftMask = 0; const uint mbX = x / 16; const uint mbY = y / 16; const uchar topPresent = mbY % GET_CURBE_SliceMacroblockHeight(CURBEData); // reset output(s) leftBlockValues = 0; topBlocksValues = 0; chromaLeftBlockValues = 0; chromaTopBlocksValues = 0; leftMbIntraModes = 0x2222; upperMbIntraModes = 0x2222; neighborMbMask = 0; refIdx = -1; MV = 0; // there are no neighbors if (0 == (x | topPresent)) { return; } cm_wait(); // read left macroblock parameters refIdxA = -1; mvA = 0; if (mbX) { vector leftMbData; vector intraMbFlagMask; uchar intraMbFlag, intraMbMode; matrix mvMask = 0; int offset; // read intra types offset = (mbIndex - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, leftMbData); intraMbMode = GET_MBDATA_GET_INTRA_MODE(leftMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(leftMbData); intraMbFlagMask = (intraMbFlag & (0 < intraMbMode)); leftMbIntraModes.merge(leftMbData.select<8, 1> (INTRA_TYPES_OFFSET), intraMbFlagMask); leftMask = 0x60; // read motion vector GET_MBDATA_MV(tmp.format()[0], leftMbData, LIST_0); GET_MBDATA_MV(tmp.format()[1], leftMbData, LIST_1); // read reference index tmpRefIdx.row(FRW) = GET_MBDATA_GET_REF_INDEX(leftMbData, LIST_0); tmpRefIdx.row(BWD) = GET_MBDATA_GET_REF_INDEX(leftMbData, LIST_1); // check if the macroblock has motion vectors. // In B slice we need to check for not-INTRA type and correct reference. refIdxA.merge(tmpRefIdx, (intraMbFlag - 1)); mvMask = (0 <= refIdxA.format ()); mvA.merge(tmp, mvMask); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask.row(FRW) = (0 == refIdxA.row(FRW)[0]); equalMask.row(BWD) = (0 == refIdxA.row(BWD)[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } // read upper macroblock parameters refIdxB = -1; mvB = 0; refIdxC = -1; mvC = 0; if (topPresent) { vector upperMbData; vector intraMbFlagMask; uchar intraMbFlag, intraMbMode, intraMbFlagD = 0; matrix mvMask = 0; int offset; // read intra types offset = (mbIndex - mbWidth) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperMbData); intraMbMode = GET_MBDATA_GET_INTRA_MODE(upperMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(upperMbData); intraMbFlagMask = (intraMbFlag & (0 < intraMbMode)); upperMbIntraModes.merge(upperMbData.select<8, 1> (INTRA_TYPES_OFFSET), intraMbFlagMask); upperMask = 0x10; // read motion vector GET_MBDATA_MV(tmp.format()[0], upperMbData, LIST_0); GET_MBDATA_MV(tmp.format()[1], upperMbData, LIST_1); // read reference index tmpRefIdx.row(FRW) = GET_MBDATA_GET_REF_INDEX(upperMbData, LIST_0); tmpRefIdx.row(BWD) = GET_MBDATA_GET_REF_INDEX(upperMbData, LIST_1); // check if the macroblock has motion vectors. // In B slice we need to check for not-INTRA type and correct reference. refIdxB.merge(tmpRefIdx, (intraMbFlag - 1)); mvMask = (0 <= refIdxB.format ()); mvB.merge(tmp, mvMask); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask.row(FRW) = (0 == refIdxB.row(FRW)[0]); equalMask.row(BWD) = (0 == refIdxB.row(BWD)[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; // read macroblock type for upper left neighbor if (mbX) { vector upperLeftMbData; // read intra types offset = (mbIndex - mbWidth - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperLeftMbData); intraMbFlagD = GET_MBDATA_IntraMbFlag(upperLeftMbData); upperLeftMask = 0x08; // read reference index tmpRefIdx.row(FRW) = GET_MBDATA_GET_REF_INDEX(upperLeftMbData, LIST_0); tmpRefIdx.row(BWD) = GET_MBDATA_GET_REF_INDEX(upperLeftMbData, LIST_1); refIdxD.merge(tmpRefIdx, (intraMbFlagD - 1)); } // read third macroblock if (mbX + 1 < mbWidth) { vector upperRightMbData; // read intra types offset = (mbIndex - mbWidth + 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperRightMbData); intraMbFlag = GET_MBDATA_IntraMbFlag(upperRightMbData); upperRightMask = 0x04; // read motion vector GET_MBDATA_MV(tmp.format()[0], upperRightMbData, LIST_0); GET_MBDATA_MV(tmp.format()[1], upperRightMbData, LIST_1); // read reference index tmpRefIdx.row(FRW) = GET_MBDATA_GET_REF_INDEX(upperRightMbData, LIST_0); tmpRefIdx.row(BWD) = GET_MBDATA_GET_REF_INDEX(upperRightMbData, LIST_1); // check if the macroblock has motion vectors. // In B slice we need to check for not-INTRA type and correct reference. refIdxC.merge(tmpRefIdx, (intraMbFlag - 1)); mvMask = (0 <= refIdxC.format ()); mvC.merge(tmp, mvMask); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask.row(FRW) = (0 == refIdxC.row(FRW)[0]); equalMask.row(BWD) = (0 == refIdxC.row(BWD)[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } // read fourth macroblock else if (mbX) { vector upperLeftMbData; // read motion vector offset = (mbIndex - mbWidth - 1) * MBDATA_SIZE; read(DWALIGNED(MBDataSurfIndex), offset, upperLeftMbData); GET_MBDATA_MV(tmp.format()[0], upperLeftMbData, LIST_0); GET_MBDATA_MV(tmp.format()[1], upperLeftMbData, LIST_1); // check if the macroblock has motion vectors. // In B slice we need to check for not-INTRA type and correct reference. refIdxC.merge(refIdxD, uint(-1), (intraMbFlagD - 1)); mvMask = (0 <= refIdxC.format ()); mvC.merge(tmp, mvMask); // get the equal motion vector, if reference is zero and macroblock is // not-INTRA equalMask.row(FRW) = (0 == refIdxC.row(FRW)[0]); equalMask.row(BWD) = (0 == refIdxC.row(BWD)[0]); equalMV.merge(tmp, equalMask); equalNum += equalMask; } } // make neighbor's mask for intra prediction neighborMbMask = leftMask | upperMask | upperLeftMask | upperRightMask; MV.select<2, 1, 2, 1> (0, 0) = mvA; MV.select<2, 1, 2, 1> (0, 2) = mvB; MV.select<2, 1, 2, 1> (0, 4) = mvC; refIdx.select<2, 1, 1, 1> (0, 0) = refIdxA; refIdx.select<2, 1, 1, 1> (0, 1) = refIdxB; refIdx.select<2, 1, 1, 1> (0, 2) = refIdxC; // // read planes // if (leftMask[0]) { // read luminance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y, temp); leftBlockValues = temp.select<16, 1, 1, 1> (0, 3); } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2, temp); chromaLeftBlockValues = temp.select<8, 1, 2, 1> (0, 2); } } if (upperMask[0]) { if (upperLeftMask[0]) { // read luminance samples if (upperRightMask[0]) { read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, topBlocksValues); } else { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x - 4, y - 1, temp); topBlocksValues.select<1, 1, 20, 1> (0, 0) = temp; topBlocksValues.select<1, 1, 8, 1> (0, 20) = temp.row(0)[19]; } // read chrominance samples read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x - 4, y / 2 - 1, chromaTopBlocksValues); } else { // read luminance samples if (upperRightMask[0]) { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x, y - 1, temp); topBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; topBlocksValues.select<1, 1, 24, 1> (0, 4) = temp; } else { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_Y_PLANE, x, y - 1, temp); topBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; topBlocksValues.select<1, 1, 16, 1> (0, 4) = temp; topBlocksValues.select<1, 1, 8, 1> (0, 20) = temp.row(0)[15]; } // read chrominance samples { matrix temp; read_plane(SrcSurfIndex, GENX_SURFACE_UV_PLANE, x, y / 2 - 1, temp); chromaTopBlocksValues.select<1, 1, 4, 1> (0, 0) = 0; chromaTopBlocksValues.select<1, 1, 16, 1> (0, 4) = temp; } } } } // void GetNeighbourParamB(vector_ref leftMbIntraModes, _GENX_ inline void ComputeBDirectMV(uint x, uint y, uint MbIndex, matrix_ref mv_direct, vector_ref directRefIdx, matrix_ref MV, matrix refIdx, SurfaceIndex FwdFrmMBDataSurfIndex, vector_ref CURBEData) { matrix mvMedian, mvFinal; vector mvMask; vector mvDirectMask; const uchar topPresent = (y / 16) % GET_CURBE_SliceMacroblockHeight(CURBEData); // reset the vector mv_direct = 0; directRefIdx = 0; // nothing to do for first macroblock if (0 == (x | topPresent)) { return; } directRefIdx[LIST_0] = cm_reduced_min (refIdx.row(LIST_0)); directRefIdx[LIST_1] = cm_reduced_min (refIdx.row(LIST_1)); if (-1 == directRefIdx.format ()[0]) { directRefIdx = 0; return; } short isNotMoving = 0; // set 'is not moving' flags if (GET_CURBE_isFwdFrameShortTermRef(CURBEData) == 1) { vector fwdRefMV; vector colMbData; int offset; // read 'colocated' MB info offset = MbIndex * MBDATA_SIZE; read(DWALIGNED(FwdFrmMBDataSurfIndex), offset, colMbData); // read 'colocated' motion vectors GET_MBDATA_MV(fwdRefMV.format ()(0), colMbData, LIST_0); GET_MBDATA_MV(fwdRefMV.format ()(1), colMbData, LIST_1); fwdRefMV += 1; // set flags when vectors lie in [-1..1] mvDirectMask = (2 >= fwdRefMV.format ()); fwdRefMV.format () = mvDirectMask; // remove flags if reference is non-zero mvDirectMask.select<2, 1> (0) = (0 != GET_MBDATA_GET_REF_INDEX(colMbData, LIST_0)); mvDirectMask.select<2, 1> (2) = ((-1 != GET_MBDATA_GET_REF_INDEX(colMbData, LIST_0)) || (0 != GET_MBDATA_GET_REF_INDEX(colMbData, LIST_1))); fwdRefMV.merge(0, mvDirectMask); // remove flags if macroblock is intra mvDirectMask = GET_MBDATA_IntraMbFlag(colMbData); fwdRefMV.merge(0, mvDirectMask.select<4, 1> (0)); fwdRefMV.select<2, 2>(0) &= fwdRefMV.select<2, 2>(1); // both X and Y are not zero isNotMoving = fwdRefMV(0) | fwdRefMV(2); } mvMask = ((0 < x) && (0 == topPresent)); MV.row(LIST_0).format ().select<2, 1> (1).merge(MV.row(LIST_0).format ()[0], mvMask); MV.row(LIST_1).format ().select<2, 1> (1).merge(MV.row(LIST_1).format ()[0], mvMask); refIdx.row(LIST_0).select<2, 1> (1).merge(refIdx.row(LIST_0)[0], mvMask); refIdx.row(LIST_1).select<2, 1> (1).merge(refIdx.row(LIST_1)[0], mvMask); // calculate the median vector GetMedianVector(mvMedian.row(LIST_0), MV.row(LIST_0).select<2, 1> (0), MV.row(LIST_0).select<2, 1> (2), MV.row(LIST_0).select<2, 1> (4)); GetMedianVector(mvMedian.row(LIST_1), MV.row(LIST_1).select<2, 1> (0), MV.row(LIST_1).select<2, 1> (2), MV.row(LIST_1).select<2, 1> (4)); mvFinal = mvMedian; // set L0 motion vectors mvMask = (refIdx.row(LIST_0)[0] != directRefIdx[LIST_0] && refIdx.row(LIST_0)[1] != directRefIdx[LIST_0] && refIdx.row(LIST_0)[2] == directRefIdx(LIST_0)); mvFinal.row(LIST_0).merge(MV.row(LIST_0).select<2, 1> (4), mvMask); mvMask = (refIdx.row(LIST_0)[0] != directRefIdx[LIST_0] && refIdx.row(LIST_0)[1] == directRefIdx[LIST_0] && refIdx.row(LIST_0)[2] != directRefIdx[LIST_0]); mvFinal.row(LIST_0).merge(MV.row(LIST_0).select<2, 1> (2), mvMask); mvMask = (refIdx.row(LIST_0)[0] == directRefIdx[LIST_0] && refIdx.row(LIST_0)[1] != directRefIdx[LIST_0] && refIdx.row(LIST_0)[2] != directRefIdx[LIST_0]); mvFinal.row(LIST_0).merge(MV.row(LIST_0).select<2, 1> (0), mvMask); mv_direct.row(LIST_0).format () = mvFinal.row(LIST_0).format ()[0]; mvDirectMask.select<1, 1> (0) = (directRefIdx[LIST_0] < 0); mv_direct.row(LIST_0).format ().merge(0, mvDirectMask.select<1, 1> (0)); mvDirectMask.select<1, 1> (0) = (directRefIdx[LIST_0] == 0); mvDirectMask.select<1, 1> (0).merge(isNotMoving, mvDirectMask.select<1, 1> (0)); mv_direct.row(LIST_0).format ().merge(0, mvDirectMask.select<1, 1> (0)); // set L1 motion vectors mvMask = (refIdx.row(LIST_1)[0] != directRefIdx[LIST_1] && refIdx.row(LIST_1)[1] != directRefIdx[LIST_1] && refIdx.row(LIST_1)[2] == directRefIdx(LIST_1)); mvFinal.row(LIST_1).merge(MV.row(LIST_1).select<2, 1> (4), mvMask); mvMask = (refIdx.row(LIST_1)[0] != directRefIdx[LIST_1] && refIdx.row(LIST_1)[1] == directRefIdx[LIST_1] && refIdx.row(LIST_1)[2] != directRefIdx[LIST_1]); mvFinal.row(LIST_1).merge(MV.row(LIST_1).select<2, 1> (2), mvMask); mvMask = (refIdx.row(LIST_1)[0] == directRefIdx[LIST_1] && refIdx.row(LIST_1)[1] != directRefIdx[LIST_1] && refIdx.row(LIST_1)[2] != directRefIdx[LIST_1]); mvFinal.row(LIST_1).merge(MV.row(LIST_1).select<2, 1> (0), mvMask); mv_direct.row(LIST_1).format () = mvFinal.row(LIST_1).format ()[0]; mvDirectMask.select<1, 1> (0) = (directRefIdx[LIST_1] < 0); mv_direct.row(LIST_1).format ().merge(0, mvDirectMask.select<1, 1> (0)); mvDirectMask.select<1, 1> (0) = (directRefIdx[LIST_1] == 0); mvDirectMask.select<1, 1> (0).merge(isNotMoving, mvDirectMask.select<1, 1> (0)); mv_direct.row(LIST_1).format ().merge(0, mvDirectMask.select<1, 1> (0)); } // void ComputeBDirectMV(SurfaceIndex MVDataSurfIndex, _GENX_ inline void SetUpVmeBSlice(matrix_ref uniIn, matrix_ref sicIn, matrix_ref Costs, SurfaceIndex SrcSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex, vector_ref CURBEData, uint x, uint y, uint MbIndex, matrix_ref mvPred, vector_ref InitRefIdx) { vector leftMbIntraModes, upperMbIntraModes; vector neighborMbMask; matrix leftBlockValues; matrix topBlocksValues; matrix chromaLeftBlockValues; matrix chromaTopBlocksValues; matrix MV; matrix refIdx; uint mbWidth; matrix B_DirectMV; vector B_DirectMVRefIdx; vector refMask; vector_ref AveL0 = mvPred.row(FRW); vector_ref AveL1 = mvPred.row(BWD); // read picture's width in MB units mbWidth = GET_CURBE_PictureWidth(CURBEData); GetNeighbourParamB(leftBlockValues, topBlocksValues, chromaLeftBlockValues, chromaTopBlocksValues, leftMbIntraModes, upperMbIntraModes, neighborMbMask, MV, refIdx, SrcSurfIndex, MBDataSurfIndex, CURBEData, x, y, MbIndex, mbWidth); ComputeBDirectMV(x, y, MbIndex, B_DirectMV, B_DirectMVRefIdx, MV, refIdx, FwdFrmMBDataSurfIndex, CURBEData); InitRefIdx = 0; refMask = (0 <= B_DirectMVRefIdx); InitRefIdx.merge(B_DirectMVRefIdx, refMask); AveL0[0] = B_DirectMV.row(FRW)[0]; AveL0[1] = B_DirectMV.row(FRW)[1]; AveL1[0] = B_DirectMV.row(BWD)[0]; AveL1[1] = B_DirectMV.row(BWD)[1]; // copy dwords from CURBE data into universal VME header // register M0 // M0.0 Reference 0 Delta // M0.1 Reference 1 Delta // M0.2 Source X/Y VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 VME_COPY_DWORD(uniIn, 0, 3, CURBEData, 3); // M0.4 reserved // M0.5 VME_COPY_DWORD(uniIn, 0, 5, CURBEData, 5); SetRef(uniIn, uniIn.row(0).format().select<2, 1> (0), AveL0, uniIn.row(0).format().select<2, 1> (22), CURBEData.format().select<2, 1> (17), CURBEData.format()[68]); SetRef(uniIn, uniIn.row(0).format().select<2, 1> (2), AveL1, uniIn.row(0).format().select<2, 1> (22), CURBEData.format().select<2, 1> (17), CURBEData.format()[68]); // M0.6 debug // M0.7 debug // register M1 // M1.0/1.1/1.2 Search path parameters & start centers uniIn.row(1).format ().select<3, 1> (0) = CURBEData.format ().select<3, 1> (0); { vector Start0; Start0 = uniIn.row(0).format().select<2, 1> (22); Start0 = ((Start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = Start0[0] | (Start0[1] << 4); uniIn.row(1)[11] = uniIn.row(1)[10]; } // M1.3 Weighted SAD (not used for HSW) // M1.4 Cost center 0 for HSW; MBZ for BDW // M1.5 Cost center 1 for HSW; MBZ for BDW // M1.6 Fwd/Bwd Block RefID (used in B slices only) // M1.7 various prediction parameters VME_COPY_DWORD(uniIn, 1, 7, CURBEData, 7); VME_CLEAR_UNIInput_IntraCornerSwap(uniIn); VME_SET_NEIGHBOUR_AVAILABILITY_INTER(uniIn, neighborMbMask); // update 'skip center enables' variable { vector skipCenterEnables, mask; skipCenterEnables = 0; mask = (0 <= B_DirectMVRefIdx[0]); skipCenterEnables.merge(0x55, mask); uniIn.row(1)[31] = skipCenterEnables[0]; skipCenterEnables = 0; mask = (0 <= B_DirectMVRefIdx[1]); skipCenterEnables.merge(0xaa, mask); uniIn.row(1)[31] |= skipCenterEnables[0]; } // register M2 // M2.0/2.1/2.2/2.3/2.4 // M2.5 FBR parameters // M2.6/2.7 SIC Forward Transform Coeff Threshold Matrix uniIn.row(2).format ().select<2, 1> (6) = CURBEData.format ().select<2, 1> (14); // BDW+ // register M3 // M3.0 FWD Cost center 0 Delta X and Y VME_COPY_DWORD(uniIn, 3, 0, AveL0, 0); // M3.1 BWD Cost center 0 Delta X and Y VME_COPY_DWORD(uniIn, 3, 1, AveL1, 0); // M3.2 FWD Cost center 1 Delta X and Y // M3.3 BWD Cost center 1 Delta X and Y // M3.4 FWD Cost center 2 Delta X and Y // M3.5 BWD Cost center 2 Delta X and Y // M3.6 FWD Cost center 3 Delta X and Y // M3.7 BWD Cost center 3 Delta X and Y // // initialize SIC input // // register M0 // 0.0 Ref0 Skip Center 0 Delta XY VME_COPY_DWORD(sicIn, 0, 0, B_DirectMV.row(0), 0); // 0.1 Ref1 Skip Center 0 Delta XY VME_COPY_DWORD(sicIn, 0, 1, B_DirectMV.row(1), 0); // register M1 // M1.0/1.1 ACV Intra 4x4/8x8 mode mask & intra modes sicIn.row(1).format ().select<2, 1> (0) = CURBEData.format ().select<2, 1> (30); VME_SET_CornerNeighborPixel0(sicIn, topBlocksValues(0, 3)); // M1.2/1.3/1.4/1.5/1.6/1.7 Neighbor pixel Luma values sicIn.row(1).format ().select<6, 1> (2) = topBlocksValues.format ().select<6, 1> (1); // register M2 // M2.0/2.1/2.2/2.3 Neighbor pixel luma values sicIn.row(2).format ().select<4, 1> (0) = leftBlockValues.format ().select<4, 1> (0); // M2.4 Intra Predictor Mode VME_SET_LeftMbIntraModes(sicIn, leftMbIntraModes); VME_SET_UpperMbIntraModes(sicIn, upperMbIntraModes); // M2.5 Corner pixel chroma value VME_SET_CornerNeighborPixelChroma(sicIn, (chromaTopBlocksValues.format().select<1, 1>(1))); // M2.6 reserved // M2.7 Penalties for non-DC modes VME_COPY_DWORD(sicIn, 2, 7, CURBEData, 33); // register M3 // M3.0/3.1/3.2/3.3 Neighbor pixel chroma values sicIn.row(3).format ().select<4, 1> (0) = chromaLeftBlockValues.format ().select<4, 1> (0); // M3.4/3.5/3.6/3.7 Neighbor pixel chroma values sicIn.row(3).format ().select<4, 1> (4) = chromaTopBlocksValues.format ().select<4, 1> (1); // set costs Costs.row(0).format ().select<2, 1> (0) = AveL0; Costs.row(0).format ().select<2, 1> (2) = AveL1; } // void SetUpVmeBSlice(matrix_ref uniIn, _GENX_ inline void SetUpOutDataBSlice(matrix_ref uniIn, matrix_ref uniOut, vector_ref MBData, U8 direct8x8pattern, vector_ref CURBEData, U32 x, U32 y, uint MbIndex) { vector intraPredParam, interPredParam = 0; vector mask, intraMask; vector transformMask; ushort distInter, distIntra, distSkip; vector intraMbType; ushort in_uniOut_MbSubPredMode; vector MbSubPredMode; uchar MbMode; uchar intraMbFlag; VME_INIT_PACK(MBData); // set the mask to select INTRA data VME_GET_UNIOutput_BestInterDistortion(uniOut, distInter); VME_GET_UNIOutput_BestIntraDistortion(uniOut, distIntra); VME_GET_UNIOutput_SkipRawDistortion(uniOut, distSkip); intraMbFlag = (distInter > distIntra); intraMask = intraMbFlag; // DW0 MB flags and modes VME_COPY_MB_INTRA_MODE_TYPE(intraMbType, 0, uniOut); VME_COPY_MB_INTER_MODE_TYPE(MBData, 0, uniOut); MBData.select<4, 1> (0).merge(intraMbType, intraMask); MBData.select<1, 1> (0).merge(MBData[0] | 4, distSkip != 65535); // DW1-3 intra luma modes & intra macroblock struct intraPredParam = uniOut.row(0).format().select<3, 1> (4); intraPredParam[2] = intraPredParam[2] & 0x0ff; // DW1-3 inter luma modes & inter macroblock struct interPredParam.format().select<2, 1> (0) = uniOut.row(0).select<2, 1> (25); interPredParam[1] = uniOut.row(6).format()[0] & 0x0f0f0f0f; interPredParam[2] = (uniOut.row(6).format()[0] >> 4) & 0x0f0f0f0f; // correct reference indices VME_GET_UNIOutput_SubMbPredMode(uniOut, in_uniOut_MbSubPredMode); VME_GET_UNIOutput_InterMbMode(uniOut, MbMode); MbSubPredMode[0] = in_uniOut_MbSubPredMode & 3; MbSubPredMode[1] = (in_uniOut_MbSubPredMode >> 2) & 3; MbSubPredMode[2] = (in_uniOut_MbSubPredMode >> 4) & 3; MbSubPredMode[3] = (in_uniOut_MbSubPredMode >> 6) & 3; mask = (0 == MbMode); MbSubPredMode.select<3, 1> (1).merge(MbSubPredMode[0], mask.select<3, 1> (0)); mask = (1 == MbMode); MbSubPredMode.select<2, 1> (2).merge(MbSubPredMode[1], mask.select<2, 1> (0)); MbSubPredMode.select<2, 1> (0).merge(MbSubPredMode[0], mask.select<2, 1> (0)); mask = (2 == MbMode); MbSubPredMode.select<2, 1> (2).merge(MbSubPredMode.select<2, 1> (0), mask.select<2, 1> (0)); mask = (0 != (MbSubPredMode & 1)); interPredParam.format ().select<4, 1> (4).merge(uchar(-1), mask); mask = (0 == (MbSubPredMode & 3)); interPredParam.format ().select<4, 1> (8).merge(uchar(-1), mask); // select correct macroblock parameters MBData.format().select<3, 1> (1) = interPredParam; MBData.format().select<3, 1> (1).merge(intraPredParam, intraMask.select<3, 1> (0)); // DW4 costs MBData.format()[8] = distIntra; MBData.format()[9] = distInter; // DW6-7 sum luma coeffs MBData.format().select<4, 1>(12) = uniOut.row(6).format().select<4, 1>(4); // DW8 num nz luma coeffs MBData.format().select<4, 1>(32) = uniOut.row(6).format().select<4, 1>(4); // DW9-10 cost centers like in HSW (to support multiref in BDW one needs to extend MBData) MBData.format().select<1, 1>(18) = VME_GET_UNIInput_FWDCostCenter0_X(uniIn); MBData.format().select<1, 1>(19) = VME_GET_UNIInput_FWDCostCenter0_Y(uniIn); MBData.format().select<1, 1>(20) = VME_GET_UNIInput_BWDCostCenter0_X(uniIn); MBData.format().select<1, 1>(21) = VME_GET_UNIInput_BWDCostCenter0_Y(uniIn); // copy motion vectors SET_MBDATA_MV(MBData, LIST_0, uniOut.row(1).format()[0]); SET_MBDATA_MV(MBData, LIST_1, uniOut.row(1).format()[1]); } // void SetUpOutDataBSlice(matrix_ref uniIn, extern "C" _GENX_MAIN_ void EncMB_B(SurfaceIndex CurbeDataSurfIndex, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex) { // cm_wait(); uint mbX = get_thread_origin_x(); uint mbY = get_thread_origin_y(); uint x = mbX * 16; uint y = mbY * 16; int offset = 0; uint PicWidthInMB, PicHeightInMBs; //picture width/height in MB unit vector CURBEData; read(CurbeDataSurfIndex,0,CURBEData.select<128,1>()); read(CurbeDataSurfIndex,128,CURBEData.select<32,1>(128)); // read picture's width in MB units PicWidthInMB = GET_CURBE_PictureWidth(CURBEData); PicHeightInMBs = GET_CURBE_PictureHeight(CURBEData); uint MbIndex = PicWidthInMB * mbY + mbX; vector direct8x8pattern = 0; matrix uniIn = 0; matrix best_uniOut = 0; { // declare parameters for VME matrix imeIn = 0; matrix sicIn = 0; matrix sic_uniOut = 0; matrix Costs = 0; matrix mvPred = 0; vector InitRefIdx = -1; vector ref0; U8 ftqSkip = 0; // down scale uint LaScaleFactor = GET_CURBE_CurLayerDQId(CURBEData); if (LaScaleFactor == 2) { DownSampleMB2Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } else if (LaScaleFactor == 4) { DownSampleMB4Xf(SrcSurfIndexRaw, SrcSurfIndex, mbX, mbY); } SetUpVmeBSlice(uniIn, sicIn, Costs, SrcSurfIndex, MBDataSurfIndex, FwdFrmMBDataSurfIndex, CURBEData, x, y, MbIndex, mvPred, InitRefIdx); ftqSkip = VME_GET_UNIInput_FTEnable(uniIn); VME_SET_UNIOutput_BestIntraDistortion(best_uniOut, -1); VME_SET_UNIOutput_InterDistortion(best_uniOut, -1); VME_SET_UNIOutput_SkipRawDistortion(best_uniOut, -1); { LoadCosts(uniIn, CURBEData); LoadSearchPath(imeIn, CURBEData); // call intra/skip motion estimation run_vme_sic(uniIn, sicIn, VMEInterPredictionSurfIndex, sic_uniOut); vector Coeffs = cm_sum(sic_uniOut.row(6).format().select<4, 1> (4)); vector sic_uniOut_DistSkip; vector sic_uniOut_DistInter; uint SkipModeEn = VME_GET_UNIInput_SkipModeEn(uniIn); uchar ifCondition; // get acceptable skip value ushort SkipVal = GET_CURBE_SkipVal(CURBEData); VME_GET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip[0]); _VME_GET_UNIOutput_InterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); Coeffs.merge(ushort(-1), SkipModeEn - 1); sic_uniOut_DistSkip.merge(ushort(-1), SkipModeEn - 1); sic_uniOut_DistInter.merge(ushort(-1), SkipModeEn - 1); ifCondition = (ftqSkip && Coeffs[0]) || (!ftqSkip && sic_uniOut_DistSkip[0] > SkipVal); sic_uniOut_DistSkip.merge(ushort(-1), ifCondition); VME_SET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip[0]); VME_SET_UNIOutput_InterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); if ((!VME_GET_UNIInput_SkipModeEn(uniIn)) || ifCondition) { // Calculate AVC INTER prediction costs DoInterFramePrediction (VMEInterPredictionSurfIndex, uniIn, imeIn, Costs, best_uniOut, direct8x8pattern, CURBEData); } VME_GET_UNIOutput_BestInterDistortion(sic_uniOut, sic_uniOut_DistInter[0]); ushort sic_uniOut_DistIntra; VME_GET_UNIOutput_BestIntraDistortion(sic_uniOut, sic_uniOut_DistIntra); VME_SET_UNIOutput_BestIntraDistortion(best_uniOut, sic_uniOut_DistIntra); VME_GET_UNIOutput_SkipRawDistortion(sic_uniOut, sic_uniOut_DistSkip); VME_SET_UNIOutput_SkipRawDistortion(best_uniOut, sic_uniOut_DistSkip); ushort best_uniOut_DistInter; VME_GET_UNIOutput_BestInterDistortion(best_uniOut, best_uniOut_DistInter); if ((sic_uniOut_DistIntra < best_uniOut_DistInter) || (!ftqSkip && sic_uniOut_DistSkip[0] < SkipVal) || (ftqSkip && !Coeffs[0]) || (sic_uniOut_DistInter[0] < best_uniOut_DistInter)) { if (ftqSkip && !Coeffs[0]) { VME_SET_UNIOutput_SkipRawDistortion(sic_uniOut, 0); } direct8x8pattern = 0xf; best_uniOut.row(0) = sic_uniOut.row(0); best_uniOut.row(5) = sic_uniOut.row(5); best_uniOut.row(6) = sic_uniOut.row(6); } else { vector lumanzc = sic_uniOut.row(6).format().select<4, 1>(4); vector chromanzc = sic_uniOut.row(6).format().select<2, 1>(16); vector lumacoeffs = sic_uniOut.row(6).format().select<4, 1>(4); vector chromacoeffs = sic_uniOut.row(6).format().select<2, 1>(10); best_uniOut.row(6).format().select<4, 1>(4) = lumanzc; best_uniOut.row(6).format().select<2, 1>(16) = chromanzc; best_uniOut.row(6).format().select<4, 1>(4) = lumacoeffs; best_uniOut.row(6).format().select<2, 1>(10) = chromacoeffs; } } } // // write the result // vector MBData; // pack the VME result SetUpOutDataBSlice(uniIn, best_uniOut, MBData, direct8x8pattern[0], CURBEData, x, y, MbIndex); // write back updated MB data offset = MbIndex * MBDATA_SIZE; write(MBDataSurfIndex, offset, MBData); cm_fence(); cm_signal(); }genx_simple_me_proto.cpp000066400000000000000000000047431443134507600335600ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/h264_encode/src// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef CMRT_EMU #include "mfx_common.h" #include "cmrt_cross_platform.h" #include "cmvm.h" #define SIZE_OF_CURBEDATA 160u extern "C" { void EncMB_I( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex) {} void EncMB_P( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex) {} void EncMB_B( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex) {} void DownSampleMB2X() {} void DownSampleMB4X() {} void HistogramFrame( SurfaceIndex INBUF, SurfaceIndex OUTBUF, uint max_h_pos, uint max_v_pos, uint off_h, uint off_v) {} void HistogramFields( SurfaceIndex INBUF, SurfaceIndex OUTBUF, uint max_h_pos, uint max_v_pos, uint off_h, uint off_v) {} } #endif // CMRT_EMUoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/000077500000000000000000000000001443134507600250475ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/include/000077500000000000000000000000001443134507600264725ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/include/genx_blend_mc.h000066400000000000000000000455671443134507600314500ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include #include #define LMSAD 500 #define WEIGHT_MULTIPLIER 8 #define SELECTION_THRESHOLD 8388608 #define MERGE_LIMIT 256 #define LONG_MV 64 #define DISTANCETH 8 template _GENX_ inline matrix read_plane_ext( SurfaceIndex SURF_IN, int x, int y ) { enum { MAX_SIZE = 256 }; matrix m_in; const int count = (BLOCKH*BLOCKW + MAX_SIZE - 1) / MAX_SIZE, lines = MAX_SIZE / BLOCKW < BLOCKH ? MAX_SIZE / BLOCKW : BLOCKH; const uint done = lines * (count - 1), rest = BLOCKH - done; #pragma unroll for (int i = 0; i < count - 1; i++) read_plane(SURF_IN, GENX_SURFACE_Y_PLANE, x, y + lines * i, m_in.template select(lines*i, 0)); read_plane(SURF_IN, GENX_SURFACE_Y_PLANE, x, y + done, m_in.template select(done, 0)); return m_in; } _GENX_ inline matrix VHpelInterp( SurfaceIndex SURF_REF, short xref, short yref ) { matrix m_ref_vert; matrix m_ref_bkp; m_ref_vert = read_plane_ext<8, 11>(SURF_REF, xref, yref - 1); m_ref_bkp = (m_ref_vert.select<8, 1, 8, 1>(1, 0) + m_ref_vert.select<8, 1, 8, 1>(2, 0)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_vert.select<8, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_vert.select<8, 1, 8, 1>(3, 0); m_ref_bkp += 4; return(cm_shr(m_ref_bkp, 3, SAT)); } _GENX_ inline matrix HHpelInterp( SurfaceIndex SURF_REF, short xref, short yref ) { matrix m_ref_horz; matrix m_ref_bkp; m_ref_horz = read_plane_ext<16, 8>(SURF_REF, xref - 1, yref); m_ref_bkp = (m_ref_horz.select<8, 1, 8, 1>(0, 1) + m_ref_horz.select<8, 1, 8, 1>(0, 2)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_horz.select<8, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_horz.select<8, 1, 8, 1>(0, 3); m_ref_bkp += 4; return(cm_shr(m_ref_bkp, 3, SAT)); } _GENX_ inline matrix DHpelInterp( SurfaceIndex SURF_REF, short xref, short yref ) { matrix m_ref_diag; matrix m_ref_bkp; matrix m_ref_bkp2; m_ref_diag = read_plane_ext<16, 11>(SURF_REF, xref - 1, yref - 1); m_ref_bkp = (m_ref_diag.select<11, 1, 8, 1>(0, 1) + m_ref_diag.select<11, 1, 8, 1>(0, 2)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_diag.select<11, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_diag.select<11, 1, 8, 1>(0, 3); m_ref_bkp2 = (m_ref_bkp.select<8, 1, 8, 1>(1, 0) + m_ref_bkp.select<8, 1, 8, 1>(2, 0)); m_ref_bkp2 *= 5; m_ref_bkp2 -= m_ref_bkp.select<8, 1, 8, 1>(0, 0); m_ref_bkp2 -= m_ref_bkp.select<8, 1, 8, 1>(3, 0); m_ref_bkp2 += 32; return(cm_shr(m_ref_bkp2, 6, SAT)); } enum _HHpelPos { _a, _b }; _GENX_ inline matrix abQpelInterp( SurfaceIndex SURF_REF, short xref, short yref, _HHpelPos pos ) { matrix m_ref; matrix m_ref_horz; matrix m_ref_bkp; m_ref_horz = read_plane_ext<16, 8>(SURF_REF, xref - 1, yref); m_ref_bkp = (m_ref_horz.select<8, 1, 8, 1>(0, 1) + m_ref_horz.select<8, 1, 8, 1>(0, 2)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_horz.select<8, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_horz.select<8, 1, 8, 1>(0, 3); m_ref_bkp += 4; m_ref = cm_shr(m_ref_bkp, 3, SAT); return(cm_avg(m_ref_horz.select<8, 1, 8, 1>(0, 1 + pos), m_ref)); } enum _VHpelPos { _c, _i }; _GENX_ inline matrix ciQpelInterp( SurfaceIndex SURF_REF, short xref, short yref, _VHpelPos pos ) { matrix m_ref; matrix m_ref_vert; matrix m_ref_bkp; m_ref_vert = read_plane_ext<8, 11>(SURF_REF, xref, yref - 1); m_ref_bkp = (m_ref_vert.select<8, 1, 8, 1>(1, 0) + m_ref_vert.select<8, 1, 8, 1>(2, 0)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_vert.select<8, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_vert.select<8, 1, 8, 1>(3, 0); m_ref_bkp += 4; m_ref = cm_shr(m_ref_bkp, 3, SAT); return(cm_avg(m_ref_vert.select<8, 1, 8, 1>(1 + pos, 0), m_ref)); } _GENX_ inline matrix dfjlQpelInterp( SurfaceIndex SURF_REF, short xref, short yref, _VHpelPos yoff, _HHpelPos xoff ) { matrix m_ref; matrix m_ref_diag; matrix m_ref_bkp; matrix m_ref_bkp2; m_ref_diag = read_plane_ext<16, 11>(SURF_REF, xref - 1, yref - 1); m_ref_bkp = (m_ref_diag.select<11, 1, 8, 1>(0, 1) + m_ref_diag.select<11, 1, 8, 1>(0, 2)); m_ref_bkp *= 5; m_ref_bkp -= m_ref_diag.select<11, 1, 8, 1>(0, 0); m_ref_bkp -= m_ref_diag.select<11, 1, 8, 1>(0, 3); m_ref_bkp2 = (m_ref_bkp.select<8, 1, 8, 1>(1, 0) + m_ref_bkp.select<8, 1, 8, 1>(2, 0)); m_ref_bkp2 *= 5; m_ref_bkp2 -= m_ref_bkp.select<8, 1, 8, 1>(0, 0); m_ref_bkp2 -= m_ref_bkp.select<8, 1, 8, 1>(3, 0); m_ref_bkp2 += 32; m_ref = cm_shr(m_ref_bkp2, 6, SAT); return(cm_avg(m_ref_diag.select<8, 1, 8, 1>(1 + yoff, 1 + xoff), m_ref)); } _GENX_ inline matrix ekQpelInterp( SurfaceIndex SURF_REF, short xref, short yref, _VHpelPos yoff ) { matrix m_ref_v, m_ref_d; m_ref_v = HHpelInterp(SURF_REF, xref, yref + yoff); m_ref_d = DHpelInterp(SURF_REF, xref, yref); return(cm_avg(m_ref_v, m_ref_d)); } _GENX_ inline matrix ghQpelInterp( SurfaceIndex SURF_REF, short xref, short yref, _HHpelPos xoff ) { matrix m_ref_h, m_ref_d; m_ref_h = VHpelInterp(SURF_REF, xref + xoff, yref); m_ref_d = DHpelInterp(SURF_REF, xref, yref); return(cm_avg(m_ref_h, m_ref_d)); } _GENX_ inline matrix BlockSPel( SurfaceIndex SURF_REF, int x, int y, vector< short, 2 > mv ) { matrix m_ref = 0; int x0 = x, y0 = y, xref0 = (x0 + mv[0] / 4), yref0 = (y0 + mv[1] / 4), xrem = mv[0] % 4, yrem = mv[1] % 4, val = mv[0] < 0, cor = xrem < 0; xrem = (((xrem + 4) * val) + (xrem * !val)) * (xrem != 0); xref0 += (-1 * val) * cor; val = mv[1] < 0; cor = yrem < 0; yrem = (((yrem + 4) * val) + (yrem * !val)) * (yrem != 0); yref0 += (-1 * val) * cor; if (yrem == 0) { if (xrem == 0) read_plane(SURF_REF, GENX_SURFACE_Y_PLANE, xref0, yref0, m_ref); else if (xrem == 1) m_ref = abQpelInterp(SURF_REF, xref0, yref0, _a); else if (xrem == 2) m_ref = HHpelInterp(SURF_REF, xref0, yref0); else m_ref = abQpelInterp(SURF_REF, xref0, yref0, _b); } else if (yrem == 1) { if (xrem == 0) m_ref = ciQpelInterp(SURF_REF, xref0, yref0, _c); else if (xrem == 1) m_ref = dfjlQpelInterp(SURF_REF, xref0, yref0, _c, _a); else if (xrem == 2) m_ref = ekQpelInterp(SURF_REF, xref0, yref0, _c); else m_ref = dfjlQpelInterp(SURF_REF, xref0, yref0, _c, _b); } else if (yrem == 2) { if (xrem == 0) m_ref = VHpelInterp(SURF_REF, xref0, yref0); else if (xrem == 1) m_ref = ghQpelInterp(SURF_REF, xref0, yref0, _a); else if (xrem == 2) m_ref = DHpelInterp(SURF_REF, xref0, yref0); else m_ref = ghQpelInterp(SURF_REF, xref0, yref0, _b); } else { if (xrem == 0) m_ref = ciQpelInterp(SURF_REF, xref0, yref0, _i); else if (xrem == 1) m_ref = dfjlQpelInterp(SURF_REF, xref0, yref0, _i, _a); else if (xrem == 2) m_ref = ekQpelInterp(SURF_REF, xref0, yref0, _i); else m_ref = dfjlQpelInterp(SURF_REF, xref0, yref0, _i, _b); } return m_ref; } inline _GENX_ vector Genx_RsCs_aprox_8x8Block( matrix rc ) { vector RsCs = 0; vector RsCsT = 0.0f; matrix temp = 0; temp = rc.select<4, 1, 4, 1>(2, 2) - rc.select<4, 1, 4, 1>(3, 2); temp = temp * temp; RsCs.format()[0] = cm_sum(temp) >> 4; matrix temp2 = 0; temp2 = rc.select<4, 1, 4, 1>(2, 2) - rc.select<4, 1, 4, 1>(2, 3); temp2 = temp2 * temp2; RsCs.format()[1] = cm_sum(temp2) >> 4; RsCsT.format()[0] = (float)RsCs.format()[0]; RsCsT.format()[1] = (float)RsCs.format()[1]; RsCsT = cm_sqrt<2>(RsCsT); return RsCsT; } inline _GENX_ matrix Genx_OMC_8x8Block( SurfaceIndex SURF_REF, matrix mv, int x, int y, uchar rc0, uchar rc1, uchar rc2, uchar rc3 ) { matrix r0 = 0, r1 = 0, r2 = 0, r3 = 0, rout = 0; uchar q_val = 0; mv = mv / 4; if (rc0) read_plane(SURF_REF, GENX_SURFACE_Y_PLANE, x + mv.row(0).select<2, 1>(0)[0], y + mv.row(0).select<2, 1>(0)[1], r0); if (rc1) read_plane(SURF_REF, GENX_SURFACE_Y_PLANE, x + mv.row(0).select<2, 1>(2)[0], y + mv.row(0).select<2, 1>(2)[1], r1); if (rc2) read_plane(SURF_REF, GENX_SURFACE_Y_PLANE, x + mv.row(1).select<2, 1>(0)[0], y + mv.row(1).select<2, 1>(0)[1], r2); if (rc3) read_plane(SURF_REF, GENX_SURFACE_Y_PLANE, x + mv.row(1).select<2, 1>(2)[0], y + mv.row(1).select<2, 1>(2)[1], r3); q_val = rc0 + rc1 + rc2 + rc3; // rout = ((r0 * rc0) + (r1 * rc1) + (r2 * rc2) + (r3 * rc3) + (q_val >> 1)) / (q_val); rout = ((r0 + r1 + r2 + r3) + (q_val >> 1)) / (q_val); return rout; } inline _GENX_ int SimIdx_8x8p( matrix T1, matrix T2, short th_val, int size, vector RsCsDiff #if PRINTDEBUG ,uint threadId #endif ) { short val_s = cm_sum(cm_abs(T1 - T2)); #if PRINTDEBUG printf("%d\tSAD: %d\tsize: %d\t", threadId, val_s, size); #endif int val = (val_s * val_s); float size_f = size; short th_origin = th_val; int th = th_origin * th_origin / ((cm_sqrt(size_f + ((RsCsDiff(0) * RsCsDiff(0)) + (RsCsDiff(1) * RsCsDiff(1)))) / 16.0f) + 1.0f); if (th <= val || val > 83968) return 0; int sub = th - val; int sum = th + val; int sel1 = sub < SELECTION_THRESHOLD; int sel2 = !sel1; int ssub = ((sub << WEIGHT_MULTIPLIER) / sum) * sel1; int ssum = (sub / (sum >> WEIGHT_MULTIPLIER)) * sel2; int wfactor = (ssub + ssum); return wfactor; } inline _GENX_ matrix MedianIdx_8x8_3ref( matrix T1, matrix T2, matrix T3 ) { matrix mean = 0; mean.format() = cm_max(cm_min(T1.format(), T3.format()), T2.format()); mean.format() = cm_min(cm_max(T1.format(), T3.format()), mean.format()); return mean; } inline _GENX_ matrix MV_Neighborhood_read( SurfaceIndex SURF_MV, ushort width, ushort height, uint mbX, uint mbY ) { matrix mv8_g4 = 0; uint x = mbX * 8, y = mbY * 8, mv_x = mbX * 4, mv_y = mbY; short x_o = !(x % (width - 8)) << 2, y_o = !(y % (height - 1)); read_plane(SURF_MV, GENX_SURFACE_Y_PLANE, mv_x - 4 + x_o, mv_y - 1 + y_o, mv8_g4); return mv8_g4; } inline _GENX_ matrix OMC_Ref_Generation( SurfaceIndex SURF_REF, ushort width, ushort height, uint mbX, uint mbY, matrix mv8_g4 ) { uint x = mbX * 8, y = mbY * 8, mv_x = mbX * 4, mv_y = mbY; short x_o = !(x % (width - 8)) << 2, y_o = !(y % (height - 1)); ushort picWidthInMB = (width >> 3) - 1, picHeightInMB = (height >> 3) - 1; uchar rc0 = (mbX < picWidthInMB && mbY < picHeightInMB), rc1 = (mbX > 0 && mbY < picHeightInMB), rc2 = (mbX < picWidthInMB && mbY > 0), rc3 = (mbX > 0 && mbY > 0); return(Genx_OMC_8x8Block(SURF_REF, mv8_g4, x, y, rc0, rc1, rc2, rc3)); } inline _GENX_ int mergeStrengthCalculator( matrix refBlock, matrix src, vector RsCsT, short noSC, ushort th, int size #if PRINTDEBUG , uint threadId #endif ) { #if PRINTDEBUG vector RsCsRef = Genx_RsCs_aprox_8x8Block(refBlock); printf("%d\tRefRs: %.4lf\tRefCs: %.4lf\t", threadId, RsCsRef(0), RsCsRef(1)); if (noSC) return(SimIdx_8x8p(refBlock, src.select<8, 1, 8, 1>(2, 2), th, size, RsCsT - RsCsRef, threadId)); //check #else if (noSC) { vector RsCsRef = Genx_RsCs_aprox_8x8Block(refBlock); return(SimIdx_8x8p(refBlock, src.select<8, 1, 8, 1>(2, 2), th, size, RsCsT - RsCsRef)); //check } #endif else return 0; } inline _GENX_ int mergeStrengthCalculator( matrix refBlock, matrix src, vector RsCsT, short noSC, ushort th, int size ) { if (noSC) { vector RsCsRef = Genx_RsCs_aprox_8x8Block(refBlock); #if PRINTDEBUG return(SimIdx_8x8p(refBlock, src.select<8, 1, 8, 1>(2, 2), th, size, RsCsT - RsCsRef, 0)); //check #else return(SimIdx_8x8p(refBlock, src.select<8, 1, 8, 1>(2, 2), th, size, RsCsT - RsCsRef)); //check #endif } else return 0; } inline _GENX_ int mergeStrengthCalculator( matrix refBlock, matrix src, vector RsCsT, short noSC, ushort th, int size ) { if (noSC) { vector RsCsRef = Genx_RsCs_aprox_8x8Block(refBlock); #if PRINTDEBUG return(SimIdx_8x8p(refBlock, src, th, size, RsCsT - RsCsRef, 0)); //check #else return(SimIdx_8x8p(refBlock, src, th, size, RsCsT - RsCsRef)); //check #endif } else return 0; } inline _GENX_ matrixmergeBlocksRef( matrix src, matrix refBlock1, int similarityVal1 #if PRINTDEBUG , uint threadId #endif ) { int norm = MERGE_LIMIT + 1 + similarityVal1, w1 = similarityVal1 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1; #if PRINTDEBUG printf("%d\tW1: %d\tWSrc: %d\t", threadId, w1, srcw); #endif return((src.select<8, 1, 8, 1>(2, 2) * srcw + refBlock1 * w1 + 128) >> 8); } inline _GENX_ matrixmergeBlocksRef( matrix src, matrix refBlock1, int similarityVal1 ) { int norm = MERGE_LIMIT + 1 + similarityVal1, w1 = similarityVal1 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1; return((src.select<8, 1, 8, 1>(2, 2) * srcw + refBlock1 * w1 + 128) >> 8); } inline _GENX_ matrixmergeBlocksRef( matrix src, matrix refBlock1, int similarityVal1 ) { int norm = MERGE_LIMIT + 1 + similarityVal1, w1 = similarityVal1 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1; return((src * srcw + refBlock1 * w1 + 128) >> 8); } inline _GENX_ matrixmergeBlocks2Ref( matrix src, matrix refBlock1, int similarityVal1, matrix refBlock2, int similarityVal2 #if PRINTDEBUG ,uint threadId #endif ) { int norm = MERGE_LIMIT + 1 + similarityVal1 + similarityVal2, w1 = similarityVal1 * MERGE_LIMIT / norm, w2 = similarityVal2 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1 - w2; #if PRINTDEBUG printf("%d\tW1: %d\tW2: %d\tWSrc: %d\t", threadId, w1, w2, srcw); #endif return((src.select<8, 1, 8, 1>(2, 2) * srcw + refBlock1 * w1 + refBlock2 * w2 + 128) >> 8); } inline _GENX_ matrixmergeBlocks2Ref( matrix src, matrix refBlock1, int similarityVal1, matrix refBlock2, int similarityVal2 ) { int norm = MERGE_LIMIT + 1 + similarityVal1 + similarityVal2, w1 = similarityVal1 * MERGE_LIMIT / norm, w2 = similarityVal2 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1 - w2; return((src.select<8, 1, 8, 1>(2, 2) * srcw + refBlock1 * w1 + refBlock2 * w2 + 128) >> 8); } inline _GENX_ matrixmergeBlocks2Ref( matrix src, matrix refBlock1, int similarityVal1, matrix refBlock2, int similarityVal2 ) { int norm = MERGE_LIMIT + 1 + similarityVal1 + similarityVal2, w1 = similarityVal1 * MERGE_LIMIT / norm, w2 = similarityVal2 * MERGE_LIMIT / norm, srcw = MERGE_LIMIT - w1 - w2; return((src * srcw + refBlock1 * w1 + refBlock2 * w2 + 128) >> 8); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/include/genx_me_common.h000066400000000000000000000063451443134507600316450ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include #include #define INTERDATA_SIZE_SMALL 8 #define INTERDATA_SIZE_BIG 64 // 32x32 and 64x64 blocks #define MVDATA_SIZE 4 // mfxI16Pair #define SINGLE_MVDATA_SIZE 2 // mfxI16Pair #define MBDIST_SIZE 64 // 16*mfxU32 #define DIST_SIZE 4 #define SLICE(VEC, FROM, HOWMANY, STEP) ((VEC).select(FROM)) #define SLICE1(VEC, FROM, HOWMANY) SLICE(VEC, FROM, HOWMANY, 1) #define SELECT_N_ROWS(m, from, nrows) m.select(from) #define SELECT_N_COLS(m, from, ncols) m.select(0, from) #define VME_SET_DWORD(dst, r, c, src) \ dst.row(r).format().select<1, 1>(c) = src #define VME_Output_S2(p, t, r, c, n) p.row(r).format().select(c) #define VME_Output_S2a(p, t, c, n) p.format().select(c) #define VME_Output_S4(p, t, r, c, n) p.row(r).format().select(c) #define VME_Output_S4a(p, t, c, n) p.format().select(c) #define VME_GET_IMEOutput_Rec0_8x8_4Distortion(p, v) (v = VME_Output_S2(p, ushort, 7, 4, 4)) #define VME_GET_IMEOutput_Rec1_8x8_4Distortion(p, v) (v = VME_Output_S2(p, ushort, 9, 4, 4)) #define VME_GET_IMEOutput_Rec0_8x8_4Mv(p, v) (v = VME_Output_S2(p, uint, 8, 4, 4)) #define VME_GET_IMEOutput_Rec1_8x8_4Mv(p, v) (v = VME_Output_S2(p, uint,10, 4, 4)) #define VME_GET_IMEOutput_Rec0_16x16_Mv(p, v) (v = VME_Output_S2(p, ushort, 7, 10, 2)) #define VME_GET_IMEOutput_Rec1_16x16_Mv(p, v) (v = VME_Output_S2(p, ushort, 9, 10, 2)) #define VME_GET_FBROutput_Rec0_16x16_Mv(p, v) (v = VME_Output_S2a(p, short, 16, 2)) #define VME_GET_FBROutput_Rec1_16x16_Mv(p, v) (v = VME_Output_S2a(p, short, 18, 2)) #define VME_GET_FBROutput_Rec0_8x8_4Mv(p, v) (v = VME_Output_S4a(p, uint, 8, 4)) #define VME_GET_FBROutput_Rec1_8x8_4Mv(p, v) (v = VME_Output_S4a(p, uint, 9, 4)) #define VME_GET_FBROutput_Dist_16x16_Bi(p, v) (v = VME_Output_S2(p, ushort, 5, 0, 1)) #define VME_GET_FBROutput_Dist_8x8_Bi(p, v) (v = VME_Output_S4(p, ushort, 5, 0, 4)) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/include/genx_sd_common.h000066400000000000000000000210731443134507600316450ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include #include _GENX_ inline matrix Mean4x4Calculator( matrix src ) { matrix mean4x4 = 0; mean4x4(0, 0) = cm_sum(src.select<4, 1, 4, 1>(2, 2)); mean4x4(0, 1) = cm_sum(src.select<4, 1, 4, 1>(2, 4)); mean4x4(0, 2) = cm_sum(src.select<4, 1, 4, 1>(2, 6)); mean4x4(0, 3) = cm_sum(src.select<4, 1, 4, 1>(2, 8)); mean4x4(1, 0) = cm_sum(src.select<4, 1, 4, 1>(4, 2)); mean4x4(1, 1) = cm_sum(src.select<4, 1, 4, 1>(4, 4)); mean4x4(1, 2) = cm_sum(src.select<4, 1, 4, 1>(4, 6)); mean4x4(1, 3) = cm_sum(src.select<4, 1, 4, 1>(4, 8)); mean4x4(2, 0) = cm_sum(src.select<4, 1, 4, 1>(6, 2)); mean4x4(2, 1) = cm_sum(src.select<4, 1, 4, 1>(6, 4)); mean4x4(2, 2) = cm_sum(src.select<4, 1, 4, 1>(6, 6)); mean4x4(2, 3) = cm_sum(src.select<4, 1, 4, 1>(6, 8)); mean4x4(3, 0) = cm_sum(src.select<4, 1, 4, 1>(8, 2)); mean4x4(3, 1) = cm_sum(src.select<4, 1, 4, 1>(8, 4)); mean4x4(3, 2) = cm_sum(src.select<4, 1, 4, 1>(8, 6)); mean4x4(3, 3) = cm_sum(src.select<4, 1, 4, 1>(8, 8)); return (mean4x4 >>= 4); } _GENX_ inline matrix DispersionCalculator( matrix src ) { matrix disper = 0; matrix var = 0; matrix mean4x4 = Mean4x4Calculator(src); var.select<4, 1, 4, 1>(0, 0) = cm_abs(src.select<4, 1, 4, 1>(0, 0) - mean4x4(0, 0)); var.select<4, 1, 4, 1>(0, 4) = cm_abs(src.select<4, 1, 4, 1>(0, 2) - mean4x4(0, 1)); var.select<4, 1, 4, 1>(0, 8) = cm_abs(src.select<4, 1, 4, 1>(0, 4) - mean4x4(0, 2)); var.select<4, 1, 4, 1>(0, 12) = cm_abs(src.select<4, 1, 4, 1>(0, 6) - mean4x4(0, 3)); var.select<4, 1, 4, 1>(4, 0) = cm_abs(src.select<4, 1, 4, 1>(2, 0) - mean4x4(1, 0)); var.select<4, 1, 4, 1>(4, 4) = cm_abs(src.select<4, 1, 4, 1>(2, 2) - mean4x4(1, 1)); var.select<4, 1, 4, 1>(4, 8) = cm_abs(src.select<4, 1, 4, 1>(2, 4) - mean4x4(1, 2)); var.select<4, 1, 4, 1>(4, 12) = cm_abs(src.select<4, 1, 4, 1>(2, 6) - mean4x4(1, 3)); var.select<4, 1, 4, 1>(8, 0) = cm_abs(src.select<4, 1, 4, 1>(4, 0) - mean4x4(2, 0)); var.select<4, 1, 4, 1>(8, 4) = cm_abs(src.select<4, 1, 4, 1>(4, 2) - mean4x4(2, 1)); var.select<4, 1, 4, 1>(8, 8) = cm_abs(src.select<4, 1, 4, 1>(4, 4) - mean4x4(2, 2)); var.select<4, 1, 4, 1>(8, 12) = cm_abs(src.select<4, 1, 4, 1>(4, 6) - mean4x4(2, 3)); var.select<4, 1, 4, 1>(12, 0) = cm_abs(src.select<4, 1, 4, 1>(6, 0) - mean4x4(3, 0)); var.select<4, 1, 4, 1>(12, 4) = cm_abs(src.select<4, 1, 4, 1>(6, 2) - mean4x4(3, 1)); var.select<4, 1, 4, 1>(12, 8) = cm_abs(src.select<4, 1, 4, 1>(6, 4) - mean4x4(3, 2)); var.select<4, 1, 4, 1>(12, 12) = cm_abs(src.select<4, 1, 4, 1>(6, 6) - mean4x4(3, 3)); var *= var; disper(0, 0) = cm_sum(var.select<4, 1, 4, 1>(0, 0)); disper(0, 1) = cm_sum(var.select<4, 1, 4, 1>(0, 4)); disper(0, 2) = cm_sum(var.select<4, 1, 4, 1>(0, 8)); disper(0, 3) = cm_sum(var.select<4, 1, 4, 1>(0, 12)); disper(1, 0) = cm_sum(var.select<4, 1, 4, 1>(4, 0)); disper(1, 1) = cm_sum(var.select<4, 1, 4, 1>(4, 4)); disper(1, 2) = cm_sum(var.select<4, 1, 4, 1>(4, 8)); disper(1, 3) = cm_sum(var.select<4, 1, 4, 1>(4, 12)); disper(2, 0) = cm_sum(var.select<4, 1, 4, 1>(8, 0)); disper(2, 1) = cm_sum(var.select<4, 1, 4, 1>(8, 4)); disper(2, 2) = cm_sum(var.select<4, 1, 4, 1>(8, 8)); disper(2, 3) = cm_sum(var.select<4, 1, 4, 1>(8, 12)); disper(3, 0) = cm_sum(var.select<4, 1, 4, 1>(12, 0)); disper(3, 1) = cm_sum(var.select<4, 1, 4, 1>(12, 4)); disper(3, 2) = cm_sum(var.select<4, 1, 4, 1>(12, 8)); disper(3, 3) = cm_sum(var.select<4, 1, 4, 1>(12, 12)); return(disper >>= 4); } _GENX_ inline matrix SpatialDenoiser_8x8_NV12_Chroma( SurfaceIndex SURF_SRC, matrix src, uint mbX, uint mbY, short th ) { uint x = mbX * 8, y = mbY * 8, xch = mbX * 8, ych = mbY * 4; matrix scm = 0; matrix out = 0; matrix och = 0; if (th > 0) { float stVal = th; read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xch - 2, ych - 1, scm); matrix Disp = DispersionCalculator(src); matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / (stVal / 10.0f))); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / (stVal / 10.0f))); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; matrix k0c = 0.0f, k1c = 0.0f, k2c = 0.0f; k0c.select<4, 1, 4, 2>(0, 0) = k0c.select<4, 1, 4, 2>(0, 1) = k0; k1c.select<4, 1, 4, 2>(0, 0) = k1c.select<4, 1, 4, 2>(0, 1) = k1; k2c.select<4, 1, 4, 2>(0, 0) = k2c.select<4, 1, 4, 2>(0, 1) = k2; och = (scm.select<4, 1, 8, 1>(1, 2) * k0c) + ( (scm.select<4, 1, 8, 1>(1, 0) + scm.select<4, 1, 8, 1>(1, 4) + scm.select<4, 1, 8, 1>(0, 2) + scm.select<4, 1, 8, 1>(2, 2)) * k1c) + ( (scm.select<4, 1, 8, 1>(0, 0) + scm.select<4, 1, 8, 1>(0, 4) + scm.select<4, 1, 8, 1>(2, 0) + scm.select<4, 1, 8, 1>(2, 4)) * k2c) + 0.5f; } else read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xch, ych, och); return och; } _GENX_ inline matrix SpatialDenoiser_8x8_Y( matrix src, short th ) { if (th > 0) { float stVal = th; matrix out = 0; matrix Disp = DispersionCalculator(src); matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / (stVal / 10.0f))); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / (stVal / 10.0f))); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; #pragma unroll for (uint i = 0; i < 4; i++) #pragma unroll for (uint j = 0; j < 4; j++) out.select<2, 1, 2, 1>(i * 2, j * 2) = (src.select<2, 1, 2, 1>(2 + 2 * i, 2 + 2 * j) * k0(i, j)) + ( (src.select<2, 1, 2, 1>(2 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 2 + 2 * j))*k1(i, j)) + ( (src.select<2, 1, 2, 1>(1 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 3 + 2 * j))*k2(i, j)) + 0.5f; return out; } else return src.select<8, 1, 8, 1>(2, 2); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/000077500000000000000000000000001443134507600256235ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_mc_gen12lp_isa.cpp000066400000000000000000023474671443134507600321620ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_mc_gen12lp_isa.h" const unsigned char genx_mc_gen12lp[126750] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x04,0x00,0x18,0x4d,0x63,0x50,0x31,0x36,0x5f,0x34, 0x4d,0x56,0x5f,0x31,0x53,0x55,0x52,0x46,0x5f,0x57,0x49,0x54,0x48,0x5f,0x43,0x48, 0x52,0xbf,0x00,0x00,0x00,0x1f,0x8e,0x00,0x00,0x9b,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0c,0xde,0x8e,0x00,0x00,0xc0,0x33,0x00,0x00,0x18,0x4d,0x63,0x50,0x31, 0x36,0x5f,0x34,0x4d,0x56,0x5f,0x32,0x53,0x55,0x52,0x46,0x5f,0x57,0x49,0x54,0x48, 0x5f,0x43,0x48,0x52,0x9e,0xc2,0x00,0x00,0xfe,0x86,0x00,0x00,0x7d,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x01,0x0c,0x9c,0x49,0x01,0x00,0x60,0x2d,0x00,0x00,0x09,0x4d, 0x43,0x5f,0x4d,0x45,0x52,0x47,0x45,0x34,0xfc,0x76,0x01,0x00,0x25,0x0e,0x00,0x00, 0x08,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x21,0x85,0x01,0x00,0xf8,0x04, 0x00,0x00,0x0e,0x4d,0x43,0x5f,0x56,0x41,0x52,0x5f,0x53,0x43,0x5f,0x43,0x41,0x4c, 0x43,0x19,0x8a,0x01,0x00,0xbd,0x50,0x00,0x00,0x7e,0xb5,0x01,0x00,0x00,0x00,0x00, 0x00,0x01,0x0c,0xd6,0xda,0x01,0x00,0x48,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x03,0x00,0x00,0x4d,0x63,0x50,0x31,0x36,0x5f,0x34,0x4d,0x56,0x5f,0x31,0x53,0x55, 0x52,0x46,0x5f,0x57,0x49,0x54,0x48,0x5f,0x43,0x48,0x52,0x00,0x6e,0x75,0x6c,0x6c, 0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69, 0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62, 0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00, 0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00, 0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00, 0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00, 0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00, 0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00, 0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00, 0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00, 0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00, 0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00, 0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00, 0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00, 0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00, 0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00, 0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00, 0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00, 0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00, 0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31, 0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30, 0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38, 0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00, 0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56, 0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31, 0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32, 0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34, 0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00, 0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56, 0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31, 0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33, 0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30, 0x00,0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00, 0x56,0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56, 0x31,0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31, 0x35,0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35, 0x33,0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36, 0x00,0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00, 0x56,0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56, 0x31,0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31, 0x36,0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36, 0x39,0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32, 0x00,0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00, 0x56,0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56, 0x31,0x37,0x39,0x00,0x56,0x31,0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31, 0x38,0x32,0x00,0x56,0x31,0x38,0x33,0x00,0x56,0x31,0x38,0x34,0x00,0x56,0x31,0x38, 0x35,0x00,0x56,0x31,0x38,0x36,0x00,0x56,0x31,0x38,0x37,0x00,0x56,0x31,0x38,0x38, 0x00,0x56,0x31,0x38,0x39,0x00,0x56,0x31,0x39,0x30,0x00,0x56,0x31,0x39,0x31,0x00, 0x56,0x31,0x39,0x32,0x00,0x56,0x31,0x39,0x33,0x00,0x56,0x31,0x39,0x34,0x00,0x56, 0x31,0x39,0x35,0x00,0x56,0x31,0x39,0x36,0x00,0x56,0x31,0x39,0x37,0x00,0x56,0x31, 0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x00,0x56,0x32,0x30,0x30,0x00,0x56,0x32,0x30, 0x31,0x00,0x56,0x32,0x30,0x32,0x00,0x56,0x32,0x30,0x33,0x00,0x56,0x32,0x30,0x34, 0x00,0x56,0x32,0x30,0x35,0x00,0x56,0x32,0x30,0x36,0x00,0x56,0x32,0x30,0x37,0x00, 0x56,0x32,0x30,0x38,0x00,0x56,0x32,0x30,0x39,0x00,0x56,0x32,0x31,0x30,0x00,0x56, 0x32,0x31,0x31,0x00,0x56,0x32,0x31,0x32,0x00,0x56,0x32,0x31,0x33,0x00,0x56,0x32, 0x31,0x34,0x00,0x56,0x32,0x31,0x35,0x00,0x56,0x32,0x31,0x36,0x00,0x56,0x32,0x31, 0x37,0x00,0x56,0x32,0x31,0x38,0x00,0x56,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x30, 0x00,0x56,0x32,0x32,0x31,0x00,0x56,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x33,0x00, 0x56,0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x36,0x00,0x56, 0x32,0x32,0x37,0x00,0x56,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x39,0x00,0x56,0x32, 0x33,0x30,0x00,0x56,0x32,0x33,0x31,0x00,0x56,0x32,0x33,0x32,0x00,0x56,0x32,0x33, 0x33,0x00,0x56,0x32,0x33,0x34,0x00,0x56,0x32,0x33,0x35,0x00,0x56,0x32,0x33,0x36, 0x00,0x56,0x32,0x33,0x37,0x00,0x56,0x32,0x33,0x38,0x00,0x56,0x32,0x33,0x39,0x00, 0x56,0x32,0x34,0x30,0x00,0x56,0x32,0x34,0x31,0x00,0x56,0x32,0x34,0x32,0x00,0x56, 0x32,0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x00,0x56,0x32,0x34,0x35,0x00,0x56,0x32, 0x34,0x36,0x00,0x56,0x32,0x34,0x37,0x00,0x56,0x32,0x34,0x38,0x00,0x56,0x32,0x34, 0x39,0x00,0x56,0x32,0x35,0x30,0x00,0x56,0x32,0x35,0x31,0x00,0x56,0x32,0x35,0x32, 0x00,0x56,0x32,0x35,0x33,0x00,0x56,0x32,0x35,0x34,0x00,0x56,0x32,0x35,0x35,0x00, 0x56,0x32,0x35,0x36,0x00,0x56,0x32,0x35,0x37,0x00,0x56,0x32,0x35,0x38,0x00,0x56, 0x32,0x35,0x39,0x00,0x56,0x32,0x36,0x30,0x00,0x56,0x32,0x36,0x31,0x00,0x56,0x32, 0x36,0x32,0x00,0x56,0x32,0x36,0x33,0x00,0x56,0x32,0x36,0x34,0x00,0x56,0x32,0x36, 0x35,0x00,0x56,0x32,0x36,0x36,0x00,0x56,0x32,0x36,0x37,0x00,0x56,0x32,0x36,0x38, 0x00,0x56,0x32,0x36,0x39,0x00,0x56,0x32,0x37,0x30,0x00,0x56,0x32,0x37,0x31,0x00, 0x56,0x32,0x37,0x32,0x00,0x56,0x32,0x37,0x33,0x00,0x56,0x32,0x37,0x34,0x00,0x56, 0x32,0x37,0x35,0x00,0x56,0x32,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x00,0x56,0x32, 0x37,0x38,0x00,0x56,0x32,0x37,0x39,0x00,0x56,0x32,0x38,0x30,0x00,0x56,0x32,0x38, 0x31,0x00,0x56,0x32,0x38,0x32,0x00,0x56,0x32,0x38,0x33,0x00,0x56,0x32,0x38,0x34, 0x00,0x56,0x32,0x38,0x35,0x00,0x56,0x32,0x38,0x36,0x00,0x56,0x32,0x38,0x37,0x00, 0x56,0x32,0x38,0x38,0x00,0x56,0x32,0x38,0x39,0x00,0x56,0x32,0x39,0x30,0x00,0x56, 0x32,0x39,0x31,0x00,0x56,0x32,0x39,0x32,0x00,0x56,0x32,0x39,0x33,0x00,0x56,0x32, 0x39,0x34,0x00,0x56,0x32,0x39,0x35,0x00,0x56,0x32,0x39,0x36,0x00,0x56,0x32,0x39, 0x37,0x00,0x56,0x32,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x00,0x56,0x33,0x30,0x30, 0x00,0x56,0x33,0x30,0x31,0x00,0x56,0x33,0x30,0x32,0x00,0x56,0x33,0x30,0x33,0x00, 0x56,0x33,0x30,0x34,0x00,0x56,0x33,0x30,0x35,0x00,0x56,0x33,0x30,0x36,0x00,0x56, 0x33,0x30,0x37,0x00,0x56,0x33,0x30,0x38,0x00,0x56,0x33,0x30,0x39,0x00,0x56,0x33, 0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x00,0x56,0x33,0x31,0x32,0x00,0x56,0x33,0x31, 0x33,0x00,0x56,0x33,0x31,0x34,0x00,0x56,0x33,0x31,0x35,0x00,0x56,0x33,0x31,0x36, 0x00,0x56,0x33,0x31,0x37,0x00,0x56,0x33,0x31,0x38,0x00,0x56,0x33,0x31,0x39,0x00, 0x56,0x33,0x32,0x30,0x00,0x56,0x33,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x00,0x56, 0x33,0x32,0x33,0x00,0x56,0x33,0x32,0x34,0x00,0x56,0x33,0x32,0x35,0x00,0x56,0x33, 0x32,0x36,0x00,0x56,0x33,0x32,0x37,0x00,0x56,0x33,0x32,0x38,0x00,0x56,0x33,0x32, 0x39,0x00,0x56,0x33,0x33,0x30,0x00,0x56,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x32, 0x00,0x56,0x33,0x33,0x33,0x00,0x56,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x35,0x00, 0x56,0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x38,0x00,0x56, 0x33,0x33,0x39,0x00,0x56,0x33,0x34,0x30,0x00,0x56,0x33,0x34,0x31,0x00,0x56,0x33, 0x34,0x32,0x00,0x56,0x33,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x00,0x56,0x33,0x34, 0x35,0x00,0x56,0x33,0x34,0x36,0x00,0x56,0x33,0x34,0x37,0x00,0x56,0x33,0x34,0x38, 0x00,0x56,0x33,0x34,0x39,0x00,0x56,0x33,0x35,0x30,0x00,0x56,0x33,0x35,0x31,0x00, 0x56,0x33,0x35,0x32,0x00,0x56,0x33,0x35,0x33,0x00,0x56,0x33,0x35,0x34,0x00,0x56, 0x33,0x35,0x35,0x00,0x56,0x33,0x35,0x36,0x00,0x56,0x33,0x35,0x37,0x00,0x56,0x33, 0x35,0x38,0x00,0x56,0x33,0x35,0x39,0x00,0x56,0x33,0x36,0x30,0x00,0x56,0x33,0x36, 0x31,0x00,0x56,0x33,0x36,0x32,0x00,0x56,0x33,0x36,0x33,0x00,0x56,0x33,0x36,0x34, 0x00,0x56,0x33,0x36,0x35,0x00,0x56,0x33,0x36,0x36,0x00,0x56,0x33,0x36,0x37,0x00, 0x56,0x33,0x36,0x38,0x00,0x56,0x33,0x36,0x39,0x00,0x56,0x33,0x37,0x30,0x00,0x56, 0x33,0x37,0x31,0x00,0x56,0x33,0x37,0x32,0x00,0x56,0x33,0x37,0x33,0x00,0x56,0x33, 0x37,0x34,0x00,0x56,0x33,0x37,0x35,0x00,0x56,0x33,0x37,0x36,0x00,0x56,0x33,0x37, 0x37,0x00,0x56,0x33,0x37,0x38,0x00,0x56,0x33,0x37,0x39,0x00,0x56,0x33,0x38,0x30, 0x00,0x56,0x33,0x38,0x31,0x00,0x56,0x33,0x38,0x32,0x00,0x56,0x33,0x38,0x33,0x00, 0x56,0x33,0x38,0x34,0x00,0x56,0x33,0x38,0x35,0x00,0x56,0x33,0x38,0x36,0x00,0x56, 0x33,0x38,0x37,0x00,0x56,0x33,0x38,0x38,0x00,0x56,0x33,0x38,0x39,0x00,0x56,0x33, 0x39,0x30,0x00,0x56,0x33,0x39,0x31,0x00,0x56,0x33,0x39,0x32,0x00,0x56,0x33,0x39, 0x33,0x00,0x56,0x33,0x39,0x34,0x00,0x56,0x33,0x39,0x35,0x00,0x56,0x33,0x39,0x36, 0x00,0x56,0x33,0x39,0x37,0x00,0x56,0x33,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x00, 0x56,0x34,0x30,0x30,0x00,0x56,0x34,0x30,0x31,0x00,0x56,0x34,0x30,0x32,0x00,0x56, 0x34,0x30,0x33,0x00,0x56,0x34,0x30,0x34,0x00,0x56,0x34,0x30,0x35,0x00,0x56,0x34, 0x30,0x36,0x00,0x56,0x34,0x30,0x37,0x00,0x56,0x34,0x30,0x38,0x00,0x56,0x34,0x30, 0x39,0x00,0x56,0x34,0x31,0x30,0x00,0x56,0x34,0x31,0x31,0x00,0x56,0x34,0x31,0x32, 0x00,0x56,0x34,0x31,0x33,0x00,0x56,0x34,0x31,0x34,0x00,0x56,0x34,0x31,0x35,0x00, 0x56,0x34,0x31,0x36,0x00,0x56,0x34,0x31,0x37,0x00,0x56,0x34,0x31,0x38,0x00,0x56, 0x34,0x31,0x39,0x00,0x56,0x34,0x32,0x30,0x00,0x56,0x34,0x32,0x31,0x00,0x56,0x34, 0x32,0x32,0x00,0x56,0x34,0x32,0x33,0x00,0x56,0x34,0x32,0x34,0x00,0x56,0x34,0x32, 0x35,0x00,0x56,0x34,0x32,0x36,0x00,0x56,0x34,0x32,0x37,0x00,0x56,0x34,0x32,0x38, 0x00,0x56,0x34,0x32,0x39,0x00,0x56,0x34,0x33,0x30,0x00,0x56,0x34,0x33,0x31,0x00, 0x56,0x34,0x33,0x32,0x00,0x56,0x34,0x33,0x33,0x00,0x56,0x34,0x33,0x34,0x00,0x56, 0x34,0x33,0x35,0x00,0x56,0x34,0x33,0x36,0x00,0x56,0x34,0x33,0x37,0x00,0x56,0x34, 0x33,0x38,0x00,0x56,0x34,0x33,0x39,0x00,0x56,0x34,0x34,0x30,0x00,0x56,0x34,0x34, 0x31,0x00,0x56,0x34,0x34,0x32,0x00,0x56,0x34,0x34,0x33,0x00,0x56,0x34,0x34,0x34, 0x00,0x56,0x34,0x34,0x35,0x00,0x56,0x34,0x34,0x36,0x00,0x56,0x34,0x34,0x37,0x00, 0x56,0x34,0x34,0x38,0x00,0x56,0x34,0x34,0x39,0x00,0x56,0x34,0x35,0x30,0x00,0x56, 0x34,0x35,0x31,0x00,0x56,0x34,0x35,0x32,0x00,0x56,0x34,0x35,0x33,0x00,0x56,0x34, 0x35,0x34,0x00,0x56,0x34,0x35,0x35,0x00,0x56,0x34,0x35,0x36,0x00,0x56,0x34,0x35, 0x37,0x00,0x56,0x34,0x35,0x38,0x00,0x56,0x34,0x35,0x39,0x00,0x56,0x34,0x36,0x30, 0x00,0x56,0x34,0x36,0x31,0x00,0x56,0x34,0x36,0x32,0x00,0x56,0x34,0x36,0x33,0x00, 0x56,0x34,0x36,0x34,0x00,0x56,0x34,0x36,0x35,0x00,0x56,0x34,0x36,0x36,0x00,0x56, 0x34,0x36,0x37,0x00,0x56,0x34,0x36,0x38,0x00,0x56,0x34,0x36,0x39,0x00,0x56,0x34, 0x37,0x30,0x00,0x56,0x34,0x37,0x31,0x00,0x56,0x34,0x37,0x32,0x00,0x56,0x34,0x37, 0x33,0x00,0x56,0x34,0x37,0x34,0x00,0x56,0x34,0x37,0x35,0x00,0x56,0x34,0x37,0x36, 0x00,0x56,0x34,0x37,0x37,0x00,0x56,0x34,0x37,0x38,0x00,0x56,0x34,0x37,0x39,0x00, 0x56,0x34,0x38,0x30,0x00,0x56,0x34,0x38,0x31,0x00,0x56,0x34,0x38,0x32,0x00,0x56, 0x34,0x38,0x33,0x00,0x56,0x34,0x38,0x34,0x00,0x56,0x34,0x38,0x35,0x00,0x56,0x34, 0x38,0x36,0x00,0x56,0x34,0x38,0x37,0x00,0x56,0x34,0x38,0x38,0x00,0x56,0x34,0x38, 0x39,0x00,0x56,0x34,0x39,0x30,0x00,0x56,0x34,0x39,0x31,0x00,0x56,0x34,0x39,0x32, 0x00,0x56,0x34,0x39,0x33,0x00,0x56,0x34,0x39,0x34,0x00,0x56,0x34,0x39,0x35,0x00, 0x56,0x34,0x39,0x36,0x00,0x56,0x34,0x39,0x37,0x00,0x56,0x34,0x39,0x38,0x00,0x56, 0x34,0x39,0x39,0x00,0x56,0x35,0x30,0x30,0x00,0x56,0x35,0x30,0x31,0x00,0x56,0x35, 0x30,0x32,0x00,0x56,0x35,0x30,0x33,0x00,0x56,0x35,0x30,0x34,0x00,0x56,0x35,0x30, 0x35,0x00,0x56,0x35,0x30,0x36,0x00,0x56,0x35,0x30,0x37,0x00,0x56,0x35,0x30,0x38, 0x00,0x56,0x35,0x30,0x39,0x00,0x56,0x35,0x31,0x30,0x00,0x56,0x35,0x31,0x31,0x00, 0x56,0x35,0x31,0x32,0x00,0x56,0x35,0x31,0x33,0x00,0x56,0x35,0x31,0x34,0x00,0x56, 0x35,0x31,0x35,0x00,0x56,0x35,0x31,0x36,0x00,0x56,0x35,0x31,0x37,0x00,0x56,0x35, 0x31,0x38,0x00,0x56,0x35,0x31,0x39,0x00,0x56,0x35,0x32,0x30,0x00,0x56,0x35,0x32, 0x31,0x00,0x56,0x35,0x32,0x32,0x00,0x56,0x35,0x32,0x33,0x00,0x56,0x35,0x32,0x34, 0x00,0x56,0x35,0x32,0x35,0x00,0x56,0x35,0x32,0x36,0x00,0x56,0x35,0x32,0x37,0x00, 0x56,0x35,0x32,0x38,0x00,0x56,0x35,0x32,0x39,0x00,0x56,0x35,0x33,0x30,0x00,0x56, 0x35,0x33,0x31,0x00,0x56,0x35,0x33,0x32,0x00,0x56,0x35,0x33,0x33,0x00,0x56,0x35, 0x33,0x34,0x00,0x56,0x35,0x33,0x35,0x00,0x56,0x35,0x33,0x36,0x00,0x56,0x35,0x33, 0x37,0x00,0x56,0x35,0x33,0x38,0x00,0x56,0x35,0x33,0x39,0x00,0x56,0x35,0x34,0x30, 0x00,0x56,0x35,0x34,0x31,0x00,0x56,0x35,0x34,0x32,0x00,0x56,0x35,0x34,0x33,0x00, 0x56,0x35,0x34,0x34,0x00,0x56,0x35,0x34,0x35,0x00,0x56,0x35,0x34,0x36,0x00,0x56, 0x35,0x34,0x37,0x00,0x56,0x35,0x34,0x38,0x00,0x56,0x35,0x34,0x39,0x00,0x56,0x35, 0x35,0x30,0x00,0x56,0x35,0x35,0x31,0x00,0x56,0x35,0x35,0x32,0x00,0x56,0x35,0x35, 0x33,0x00,0x56,0x35,0x35,0x34,0x00,0x56,0x35,0x35,0x35,0x00,0x56,0x35,0x35,0x36, 0x00,0x56,0x35,0x35,0x37,0x00,0x56,0x35,0x35,0x38,0x00,0x56,0x35,0x35,0x39,0x00, 0x56,0x35,0x36,0x30,0x00,0x56,0x35,0x36,0x31,0x00,0x56,0x35,0x36,0x32,0x00,0x56, 0x35,0x36,0x33,0x00,0x56,0x35,0x36,0x34,0x00,0x56,0x35,0x36,0x35,0x00,0x56,0x35, 0x36,0x36,0x00,0x56,0x35,0x36,0x37,0x00,0x56,0x35,0x36,0x38,0x00,0x56,0x35,0x36, 0x39,0x00,0x56,0x35,0x37,0x30,0x00,0x56,0x35,0x37,0x31,0x00,0x56,0x35,0x37,0x32, 0x00,0x56,0x35,0x37,0x33,0x00,0x56,0x35,0x37,0x34,0x00,0x56,0x35,0x37,0x35,0x00, 0x56,0x35,0x37,0x36,0x00,0x56,0x35,0x37,0x37,0x00,0x56,0x35,0x37,0x38,0x00,0x56, 0x35,0x37,0x39,0x00,0x56,0x35,0x38,0x30,0x00,0x56,0x35,0x38,0x31,0x00,0x56,0x35, 0x38,0x32,0x00,0x56,0x35,0x38,0x33,0x00,0x56,0x35,0x38,0x34,0x00,0x56,0x35,0x38, 0x35,0x00,0x56,0x35,0x38,0x36,0x00,0x56,0x35,0x38,0x37,0x00,0x56,0x35,0x38,0x38, 0x00,0x56,0x35,0x38,0x39,0x00,0x56,0x35,0x39,0x30,0x00,0x56,0x35,0x39,0x31,0x00, 0x56,0x35,0x39,0x32,0x00,0x56,0x35,0x39,0x33,0x00,0x56,0x35,0x39,0x34,0x00,0x56, 0x35,0x39,0x35,0x00,0x56,0x35,0x39,0x36,0x00,0x56,0x35,0x39,0x37,0x00,0x56,0x35, 0x39,0x38,0x00,0x56,0x35,0x39,0x39,0x00,0x56,0x36,0x30,0x30,0x00,0x56,0x36,0x30, 0x31,0x00,0x56,0x36,0x30,0x32,0x00,0x56,0x36,0x30,0x33,0x00,0x56,0x36,0x30,0x34, 0x00,0x56,0x36,0x30,0x35,0x00,0x56,0x36,0x30,0x36,0x00,0x56,0x36,0x30,0x37,0x00, 0x56,0x36,0x30,0x38,0x00,0x56,0x36,0x30,0x39,0x00,0x56,0x36,0x31,0x30,0x00,0x56, 0x36,0x31,0x31,0x00,0x56,0x36,0x31,0x32,0x00,0x56,0x36,0x31,0x33,0x00,0x56,0x36, 0x31,0x34,0x00,0x56,0x36,0x31,0x35,0x00,0x56,0x36,0x31,0x36,0x00,0x56,0x36,0x31, 0x37,0x00,0x56,0x36,0x31,0x38,0x00,0x56,0x36,0x31,0x39,0x00,0x56,0x36,0x32,0x30, 0x00,0x56,0x36,0x32,0x31,0x00,0x56,0x36,0x32,0x32,0x00,0x56,0x36,0x32,0x33,0x00, 0x56,0x36,0x32,0x34,0x00,0x56,0x36,0x32,0x35,0x00,0x56,0x36,0x32,0x36,0x00,0x56, 0x36,0x32,0x37,0x00,0x56,0x36,0x32,0x38,0x00,0x56,0x36,0x32,0x39,0x00,0x56,0x36, 0x33,0x30,0x00,0x56,0x36,0x33,0x31,0x00,0x56,0x36,0x33,0x32,0x00,0x56,0x36,0x33, 0x33,0x00,0x56,0x36,0x33,0x34,0x00,0x56,0x36,0x33,0x35,0x00,0x56,0x36,0x33,0x36, 0x00,0x56,0x36,0x33,0x37,0x00,0x56,0x36,0x33,0x38,0x00,0x56,0x36,0x33,0x39,0x00, 0x56,0x36,0x34,0x30,0x00,0x56,0x36,0x34,0x31,0x00,0x56,0x36,0x34,0x32,0x00,0x56, 0x36,0x34,0x33,0x00,0x56,0x36,0x34,0x34,0x00,0x56,0x36,0x34,0x35,0x00,0x56,0x36, 0x34,0x36,0x00,0x56,0x36,0x34,0x37,0x00,0x56,0x36,0x34,0x38,0x00,0x56,0x36,0x34, 0x39,0x00,0x56,0x36,0x35,0x30,0x00,0x56,0x36,0x35,0x31,0x00,0x56,0x36,0x35,0x32, 0x00,0x56,0x36,0x35,0x33,0x00,0x56,0x36,0x35,0x34,0x00,0x56,0x36,0x35,0x35,0x00, 0x56,0x36,0x35,0x36,0x00,0x56,0x36,0x35,0x37,0x00,0x56,0x36,0x35,0x38,0x00,0x56, 0x36,0x35,0x39,0x00,0x56,0x36,0x36,0x30,0x00,0x56,0x36,0x36,0x31,0x00,0x56,0x36, 0x36,0x32,0x00,0x56,0x36,0x36,0x33,0x00,0x56,0x36,0x36,0x34,0x00,0x56,0x36,0x36, 0x35,0x00,0x56,0x36,0x36,0x36,0x00,0x56,0x36,0x36,0x37,0x00,0x56,0x36,0x36,0x38, 0x00,0x56,0x36,0x36,0x39,0x00,0x56,0x36,0x37,0x30,0x00,0x56,0x36,0x37,0x31,0x00, 0x56,0x36,0x37,0x32,0x00,0x56,0x36,0x37,0x33,0x00,0x56,0x36,0x37,0x34,0x00,0x56, 0x36,0x37,0x35,0x00,0x56,0x36,0x37,0x36,0x00,0x56,0x36,0x37,0x37,0x00,0x56,0x36, 0x37,0x38,0x00,0x56,0x36,0x37,0x39,0x00,0x56,0x36,0x38,0x30,0x00,0x56,0x36,0x38, 0x31,0x00,0x56,0x36,0x38,0x32,0x00,0x56,0x36,0x38,0x33,0x00,0x56,0x36,0x38,0x34, 0x00,0x56,0x36,0x38,0x35,0x00,0x56,0x36,0x38,0x36,0x00,0x56,0x36,0x38,0x37,0x00, 0x56,0x36,0x38,0x38,0x00,0x56,0x36,0x38,0x39,0x00,0x56,0x36,0x39,0x30,0x00,0x56, 0x36,0x39,0x31,0x00,0x56,0x36,0x39,0x32,0x00,0x56,0x36,0x39,0x33,0x00,0x56,0x36, 0x39,0x34,0x00,0x56,0x36,0x39,0x35,0x00,0x56,0x36,0x39,0x36,0x00,0x56,0x36,0x39, 0x37,0x00,0x56,0x36,0x39,0x38,0x00,0x56,0x36,0x39,0x39,0x00,0x56,0x37,0x30,0x30, 0x00,0x56,0x37,0x30,0x31,0x00,0x56,0x37,0x30,0x32,0x00,0x56,0x37,0x30,0x33,0x00, 0x56,0x37,0x30,0x34,0x00,0x56,0x37,0x30,0x35,0x00,0x56,0x37,0x30,0x36,0x00,0x56, 0x37,0x30,0x37,0x00,0x56,0x37,0x30,0x38,0x00,0x56,0x37,0x30,0x39,0x00,0x56,0x37, 0x31,0x30,0x00,0x56,0x37,0x31,0x31,0x00,0x56,0x37,0x31,0x32,0x00,0x56,0x37,0x31, 0x33,0x00,0x56,0x37,0x31,0x34,0x00,0x56,0x37,0x31,0x35,0x00,0x56,0x37,0x31,0x36, 0x00,0x56,0x37,0x31,0x37,0x00,0x56,0x37,0x31,0x38,0x00,0x56,0x37,0x31,0x39,0x00, 0x56,0x37,0x32,0x30,0x00,0x56,0x37,0x32,0x31,0x00,0x56,0x37,0x32,0x32,0x00,0x56, 0x37,0x32,0x33,0x00,0x56,0x37,0x32,0x34,0x00,0x56,0x37,0x32,0x35,0x00,0x56,0x37, 0x32,0x36,0x00,0x56,0x37,0x32,0x37,0x00,0x56,0x37,0x32,0x38,0x00,0x56,0x37,0x32, 0x39,0x00,0x56,0x37,0x33,0x30,0x00,0x56,0x37,0x33,0x31,0x00,0x56,0x37,0x33,0x32, 0x00,0x56,0x37,0x33,0x33,0x00,0x56,0x37,0x33,0x34,0x00,0x56,0x37,0x33,0x35,0x00, 0x56,0x37,0x33,0x36,0x00,0x56,0x37,0x33,0x37,0x00,0x56,0x37,0x33,0x38,0x00,0x56, 0x37,0x33,0x39,0x00,0x56,0x37,0x34,0x30,0x00,0x56,0x37,0x34,0x31,0x00,0x56,0x37, 0x34,0x32,0x00,0x56,0x37,0x34,0x33,0x00,0x56,0x37,0x34,0x34,0x00,0x56,0x37,0x34, 0x35,0x00,0x56,0x37,0x34,0x36,0x00,0x56,0x37,0x34,0x37,0x00,0x56,0x37,0x34,0x38, 0x00,0x56,0x37,0x34,0x39,0x00,0x56,0x37,0x35,0x30,0x00,0x56,0x37,0x35,0x31,0x00, 0x56,0x37,0x35,0x32,0x00,0x56,0x37,0x35,0x33,0x00,0x56,0x37,0x35,0x34,0x00,0x56, 0x37,0x35,0x35,0x00,0x56,0x37,0x35,0x36,0x00,0x56,0x37,0x35,0x37,0x00,0x56,0x37, 0x35,0x38,0x00,0x50,0x31,0x00,0x50,0x32,0x00,0x50,0x33,0x00,0x50,0x34,0x00,0x50, 0x35,0x00,0x50,0x36,0x00,0x50,0x37,0x00,0x50,0x38,0x00,0x50,0x39,0x00,0x50,0x31, 0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32,0x00,0x50,0x31,0x33,0x00,0x50,0x31, 0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36,0x00,0x50,0x31,0x37,0x00,0x50,0x31, 0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30,0x00,0x50,0x32,0x31,0x00,0x4d,0x63, 0x50,0x31,0x36,0x5f,0x34,0x4d,0x56,0x5f,0x31,0x53,0x55,0x52,0x46,0x5f,0x57,0x49, 0x54,0x48,0x5f,0x43,0x48,0x52,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x33,0x39,0x33,0x00, 0x42,0x42,0x5f,0x31,0x5f,0x34,0x30,0x39,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63, 0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c, 0x5f,0x75,0x72,0x65,0x6d,0x6a,0x6a,0x5f,0x42,0x42,0x5f,0x32,0x5f,0x34,0x32,0x36, 0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e, 0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x75,0x32,0x43, 0x4d,0x76,0x62,0x38,0x5f,0x73,0x53,0x5f,0x5f,0x42,0x42,0x5f,0x33,0x5f,0x34,0x34, 0x30,0x00,0x42,0x42,0x5f,0x34,0x5f,0x34,0x34,0x32,0x00,0x42,0x42,0x5f,0x35,0x5f, 0x34,0x34,0x39,0x00,0x42,0x42,0x5f,0x36,0x5f,0x34,0x35,0x35,0x00,0x42,0x42,0x5f, 0x37,0x5f,0x34,0x36,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69, 0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x75,0x64, 0x69,0x76,0x75,0x32,0x43,0x4d,0x76,0x62,0x31,0x36,0x5f,0x6a,0x53,0x5f,0x5f,0x42, 0x42,0x5f,0x38,0x5f,0x34,0x38,0x39,0x00,0x42,0x42,0x5f,0x39,0x5f,0x35,0x30,0x31, 0x00,0x42,0x42,0x5f,0x31,0x30,0x5f,0x35,0x35,0x32,0x00,0x5f,0x5a,0x32,0x34,0x5f, 0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d, 0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x69,0x69,0x5f,0x42,0x42,0x5f,0x31,0x31,0x5f, 0x35,0x35,0x35,0x00,0x42,0x42,0x5f,0x31,0x32,0x5f,0x35,0x37,0x36,0x00,0x42,0x42, 0x5f,0x31,0x33,0x5f,0x35,0x37,0x39,0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x54,0x38, 0x00,0x54,0x39,0x00,0x54,0x31,0x30,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00, 0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x1a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00, 0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x77,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x79,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x27, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x87,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x89,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x97,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x99,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x55,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x55,0x60,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x55,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x55,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa9,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x13, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x13,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb9,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc9,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00, 0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd7,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd9,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe7,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe9,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf9,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x09,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a, 0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x17,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x19,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x57, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x57,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00, 0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x57, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x57,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x57,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x57,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x01,0x00,0x00,0x55,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x01,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x01,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01, 0x00,0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00, 0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01, 0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x01, 0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x02,0x02, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x02,0x01,0x00, 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x01,0x01,0x00,0x25, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x02,0x01,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x05,0x80,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x01,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x77,0x01,0x00,0x00,0x01,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x01,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x79,0x01,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a, 0x01,0x00,0x00,0x01,0x18,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01, 0x00,0x00,0x01,0x30,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00, 0x00,0x01,0x0c,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00, 0x01,0x10,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x04, 0xc0,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x01,0x08, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x04,0x00, 0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x01,0x02,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x01,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x02,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x01,0x10,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x01,0x08,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x87,0x01,0x00,0x00,0x01,0x04,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x01,0x00,0x00,0x01,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x89,0x01,0x00,0x00,0x01,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a, 0x01,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01, 0x00,0x00,0x01,0x01,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00, 0x00,0x02,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00, 0x01,0x01,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x01, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x01,0x01, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x01,0x01,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x01,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x02,0x01,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x03,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x02,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x97,0x01,0x00,0x00,0x03,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x01,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x99,0x01,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a, 0x01,0x00,0x00,0x03,0x08,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01, 0x00,0x00,0x01,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00, 0x00,0x01,0x08,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00, 0x01,0x01,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00, 0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x01, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x40,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x01,0x01,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x01,0x01,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x01,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x01,0x00,0x54,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x04,0x40,0x00,0x55,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x01,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa7,0x01,0x00,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x01,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa9,0x01,0x00,0x00,0x00,0x01,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa, 0x01,0x00,0x00,0x04,0x40,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01, 0x00,0x00,0x01,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00, 0x00,0x01,0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00, 0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x01,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x04,0x40, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x05,0x01,0x00, 0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x05,0x01,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x05,0x01,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x05,0x01,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x04,0x01,0x00,0x70,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x04,0x01,0x00,0x71,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x01,0x10,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb7,0x01,0x00,0x00,0x01,0x10,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x01,0x10,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb9,0x01,0x00,0x00,0x01,0x10,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba, 0x01,0x00,0x00,0x01,0x10,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01, 0x00,0x00,0x01,0x10,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00, 0x00,0x01,0x10,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00, 0x01,0x10,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x01, 0x10,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x01,0x10, 0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x01,0x10,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x01,0x10,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x01,0x10,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x01,0x10,0x00,0x6d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x01,0x10,0x00,0x6e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x01,0x10,0x00,0x6f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x01,0x10,0x00,0x85,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc7,0x01,0x00,0x00,0x01,0x30,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x01,0x00,0x00,0x01,0x08,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc9,0x01,0x00,0x00,0x03,0x08,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca, 0x01,0x00,0x00,0x00,0x08,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01, 0x00,0x00,0x04,0x04,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00, 0x00,0x03,0x08,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00, 0x03,0x10,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x01, 0x04,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x01,0x02, 0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x01,0x01,0x00, 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x01,0x10,0x00,0x79, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x04,0xc0,0x00,0x73,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x01,0x08,0x00,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x01,0x04,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x01,0x02,0x00,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x01,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x01,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd9,0x01,0x00,0x00,0x01,0x10,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda, 0x01,0x00,0x00,0x01,0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01, 0x00,0x00,0x01,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00, 0x00,0x01,0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00, 0x01,0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00, 0x01,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x07,0x02, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x07,0x02,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x03,0x10,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x03,0x20,0x00,0x85,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x03,0x10,0x00,0x87,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x03,0x60,0x00,0x73,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x03,0x10,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x03,0x10,0x00,0x89,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe7,0x01,0x00,0x00,0x01,0x10,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x01,0x00,0x00,0x02,0x10,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe9,0x01,0x00,0x00,0x01,0x10,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea, 0x01,0x00,0x00,0x02,0x10,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01, 0x00,0x00,0x01,0x10,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00, 0x00,0x02,0x10,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00, 0x01,0x10,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x02, 0x10,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x01,0x10, 0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x03,0x20,0x00, 0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x03,0x20,0x00,0x8a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x01,0x10,0x00,0x8f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x03,0x20,0x00,0x8d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x03,0x20,0x00,0x8b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x01,0x08,0x00,0x90,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x01,0x04,0x00,0x91,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf7,0x01,0x00,0x00,0x01,0x02,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x01,0x00,0x00,0x01,0x01,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf9,0x01,0x00,0x00,0x01,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa, 0x01,0x00,0x00,0x03,0x02,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01, 0x00,0x00,0x01,0x01,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00, 0x00,0x03,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00, 0x07,0x01,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x07, 0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x07,0x01, 0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x01,0x00, 0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x01,0x00,0x9b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x01,0x00,0x94,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x01,0x01,0x00,0x9c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0x01,0x00,0x45,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x01,0x01,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x01,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x02,0x00,0x00,0x01,0x01,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x02,0x00,0x00,0x01,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x09,0x02,0x00,0x00,0x01,0x10,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a, 0x02,0x00,0x00,0x01,0x10,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02, 0x00,0x00,0x01,0x10,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00, 0x00,0x01,0x10,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00, 0x01,0x10,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x01, 0x10,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x01,0x10, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x01,0x10,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x10,0x00,0xa4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x10,0x00,0xa5,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x10,0x00,0xa6,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x10,0x00,0xa7,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x03,0x20,0x00,0x3c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x03,0x30,0x00,0xa8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x17,0x02,0x00,0x00,0x03,0x18,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x02,0x00,0x00,0x01,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x19,0x02,0x00,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0x02,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02, 0x00,0x00,0x01,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00, 0x00,0x00,0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00, 0x03,0x08,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x04, 0x60,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x03,0x04, 0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x03,0x02,0x00, 0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x03,0x10,0x00,0xdd, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x03,0x08,0x00,0xb0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x03,0x04,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x03,0x02,0x00,0xb2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x03,0x08,0x00,0xb3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x03,0x04,0x00,0xb4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x27,0x02,0x00,0x00,0x03,0x02,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x28,0x02,0x00,0x00,0x03,0x08,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0x02,0x00,0x00,0x03,0x04,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, 0x02,0x00,0x00,0x03,0x02,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02, 0x00,0x00,0x03,0x08,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00, 0x00,0x03,0x04,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00, 0x03,0x02,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x03, 0x08,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x03,0x04, 0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x03,0x02,0x00, 0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x03,0x08,0x00,0xbf, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x03,0x04,0x00,0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x03,0x02,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x03,0x08,0x00,0xc2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x03,0x04,0x00,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x03,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x37,0x02,0x00,0x00,0x03,0x08,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x02,0x00,0x00,0x04,0x30,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0x02,0x00,0x00,0x03,0x04,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a, 0x02,0x00,0x00,0x03,0x02,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02, 0x00,0x00,0x03,0x08,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00, 0x00,0x03,0x04,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00, 0x03,0x02,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x03, 0x08,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x03,0x04, 0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x03,0x02,0x00, 0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x03,0x08,0x00,0xce, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x03,0x04,0x00,0xcf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x03,0x02,0x00,0xd0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x03,0x08,0x00,0xd1,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x03,0x04,0x00,0xd2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x03,0x02,0x00,0xd3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x47,0x02,0x00,0x00,0x03,0x08,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x03,0x04,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x49,0x02,0x00,0x00,0x03,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x02,0x00,0x00,0x03,0x08,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02, 0x00,0x00,0x03,0x04,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00, 0x00,0x03,0x02,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00, 0x03,0x08,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x03, 0x04,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x03,0x02, 0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x02,0x10,0x00, 0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x01,0x10,0x00,0xeb, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x01,0x10,0x00,0xde,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x01,0x10,0x00,0xdf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x01,0x10,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x01,0x10,0x00,0xed,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x01,0x10,0x00,0xe1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x57,0x02,0x00,0x00,0x01,0x10,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x58,0x02,0x00,0x00,0x01,0x10,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x59,0x02,0x00,0x00,0x01,0x10,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a, 0x02,0x00,0x00,0x01,0x10,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02, 0x00,0x00,0x01,0x10,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00, 0x00,0x01,0x10,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00, 0x01,0x10,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x01, 0x10,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x01,0x10, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x01,0x10,0x00, 0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x03,0x20,0x00,0xea, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x03,0x20,0x00,0xeb,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x03,0x20,0x00,0xec,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x03,0x20,0x00,0xed,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x03,0x20,0x00,0xee,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x03,0x20,0x00,0xef,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x67,0x02,0x00,0x00,0x03,0x20,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x02,0x00,0x00,0x03,0x20,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x69,0x02,0x00,0x00,0x01,0x08,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a, 0x02,0x00,0x00,0x02,0x20,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02, 0x00,0x00,0x02,0x20,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00, 0x00,0x01,0x04,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00, 0x01,0x02,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x01, 0x10,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x01,0x08, 0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x01,0x04,0x00, 0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x01,0x02,0x00,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x01,0x08,0x00,0xf8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x01,0x04,0x00,0xf9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01,0x02,0x00,0xfa,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x01,0x08,0x00,0xfb,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x76,0x02,0x00,0x00,0x01,0x04,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x77,0x02,0x00,0x00,0x01,0x02,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x78,0x02,0x00,0x00,0x01,0x08,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x79,0x02,0x00,0x00,0x02,0x20,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a, 0x02,0x00,0x00,0x02,0x20,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02, 0x00,0x00,0x01,0x04,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00, 0x00,0x01,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00, 0x01,0x08,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x01, 0x04,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x01,0x02, 0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x01,0x08,0x00, 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x01,0x04,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x01,0x02,0x00,0x06,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x01,0x08,0x00,0x07,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x01,0x04,0x00,0x08,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x01,0x02,0x00,0x09,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x86,0x02,0x00,0x00,0x01,0x08,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x87,0x02,0x00,0x00,0x02,0x20,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x88,0x02,0x00,0x00,0x02,0x20,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x89,0x02,0x00,0x00,0x01,0x04,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a, 0x02,0x00,0x00,0x01,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02, 0x00,0x00,0x01,0x08,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00, 0x00,0x01,0x04,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00, 0x01,0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x01, 0x08,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x01,0x04, 0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x01,0x02,0x00, 0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x01,0x08,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x01,0x04,0x00,0x14,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x01,0x02,0x00,0x15,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x01,0x08,0x00,0x16,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x02,0x20,0x00,0xf1,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x02,0x20,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x97,0x02,0x00,0x00,0x01,0x04,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x98,0x02,0x00,0x00,0x01,0x02,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x99,0x02,0x00,0x00,0x01,0x08,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a, 0x02,0x00,0x00,0x01,0x04,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02, 0x00,0x00,0x01,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00, 0x00,0x01,0x08,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00, 0x01,0x04,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x01, 0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x01,0x08, 0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x01,0x04,0x00, 0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x01,0x02,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x10,0x00,0x22,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x07,0x01,0x00,0x23,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x07,0x10,0x00,0x24,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x07,0x10,0x00,0x25,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x07,0x10,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa7,0x02,0x00,0x00,0x07,0x10,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x02,0x00,0x00,0x07,0x10,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa9,0x02,0x00,0x00,0x07,0x10,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa, 0x02,0x00,0x00,0x07,0x10,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02, 0x00,0x00,0x07,0x10,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00, 0x00,0x07,0x10,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00, 0x04,0x60,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x01, 0x10,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x01,0x10, 0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x07,0x10,0x00, 0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x07,0x10,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x01,0x10,0x00,0x31,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x01,0x10,0x00,0x32,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x01,0x10,0x00,0x39,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x01,0x10,0x00,0x3a,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb7,0x02,0x00,0x00,0x01,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb8,0x02,0x00,0x00,0x00,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb9,0x02,0x00,0x00,0x01,0x01,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba, 0x02,0x00,0x00,0x00,0x01,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02, 0x00,0x00,0x03,0x08,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00, 0x00,0x07,0x08,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00, 0x07,0x08,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x01, 0x08,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x01,0x01, 0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x01,0x01,0x00, 0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x00,0x01,0x00,0x44, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x01,0x01,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x07,0x01,0x00,0x50,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x01,0x00,0x47,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x00,0x01,0x00,0x45,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x01,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc7,0x02,0x00,0x00,0x07,0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc8,0x02,0x00,0x00,0x00,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc9,0x02,0x00,0x00,0x07,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca, 0x02,0x00,0x00,0x07,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02, 0x00,0x00,0x01,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00, 0x00,0x00,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00, 0x07,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x01, 0x01,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x01,0x01, 0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x01,0x01,0x00, 0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x10,0x00,0x57, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x01,0x10,0x00,0x58,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x07,0x10,0x00,0x61,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x01,0x10,0x00,0x57,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x10,0x00,0x58,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd6,0x02,0x00,0x00,0x00,0x10,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd7,0x02,0x00,0x00,0x01,0x10,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd8,0x02,0x00,0x00,0x07,0x10,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd9,0x02,0x00,0x00,0x00,0x10,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda, 0x02,0x00,0x00,0x07,0x10,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02, 0x00,0x00,0x07,0x10,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00, 0x00,0x01,0x10,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00, 0x00,0x10,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x07, 0x10,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x01,0x10, 0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x01,0x10,0x00, 0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x01,0x10,0x00,0x65, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x01,0x00,0x66,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x01,0x01,0x00,0x68,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x07,0x01,0x00,0x71,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x01,0x00,0x68,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe6,0x02,0x00,0x00,0x00,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe7,0x02,0x00,0x00,0x01,0x01,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe8,0x02,0x00,0x00,0x07,0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe9,0x02,0x00,0x00,0x01,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea, 0x02,0x00,0x00,0x00,0x01,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02, 0x00,0x00,0x07,0x01,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00, 0x00,0x07,0x01,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00, 0x01,0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x00, 0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x07,0x01, 0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x01,0x01,0x00, 0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0xf1,0x02,0x00,0x00, 0x01,0x00,0x00,0xf2,0x02,0x00,0x00,0x01,0x00,0x00,0xf3,0x02,0x00,0x00,0x01,0x00, 0x00,0xf4,0x02,0x00,0x00,0x01,0x00,0x00,0xf5,0x02,0x00,0x00,0x01,0x00,0x00,0xf6, 0x02,0x00,0x00,0x01,0x00,0x00,0xf7,0x02,0x00,0x00,0x01,0x00,0x00,0xf8,0x02,0x00, 0x00,0x01,0x00,0x00,0xf9,0x02,0x00,0x00,0x01,0x00,0x00,0xfa,0x02,0x00,0x00,0x01, 0x00,0x00,0xfb,0x02,0x00,0x00,0x01,0x00,0x00,0xfc,0x02,0x00,0x00,0x08,0x00,0x00, 0xfd,0x02,0x00,0x00,0x01,0x00,0x00,0xfe,0x02,0x00,0x00,0x01,0x00,0x00,0xff,0x02, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0x00, 0x01,0x00,0x00,0x02,0x03,0x00,0x00,0x01,0x00,0x00,0x03,0x03,0x00,0x00,0x01,0x00, 0x00,0x04,0x03,0x00,0x00,0x10,0x00,0x00,0x05,0x03,0x00,0x00,0x01,0x00,0x00,0x0e, 0x00,0x06,0x03,0x00,0x00,0x01,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x08,0x03,0x00, 0x00,0x01,0x00,0x09,0x03,0x00,0x00,0x01,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x0b, 0x03,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x00,0x0d,0x03,0x00,0x00,0x00, 0x00,0x0e,0x03,0x00,0x00,0x01,0x00,0x0f,0x03,0x00,0x00,0x00,0x00,0x10,0x03,0x00, 0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x01,0x00,0x12,0x03,0x00,0x00,0x00,0x00,0x13, 0x03,0x00,0x00,0x00,0x00,0x00,0x05,0x14,0x03,0x00,0x00,0x01,0x00,0x00,0x15,0x03, 0x00,0x00,0x01,0x00,0x00,0x16,0x03,0x00,0x00,0x01,0x00,0x00,0x17,0x03,0x00,0x00, 0x01,0x00,0x00,0x18,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02, 0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04, 0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c, 0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x20,0x00,0x00, 0x00,0x34,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0xde,0x51, 0x00,0x00,0x41,0x3c,0x00,0x00,0x02,0x00,0x19,0x03,0x00,0x00,0x0d,0x67,0x65,0x6e, 0x78,0x5f,0x6d,0x63,0x5f,0x30,0x2e,0x61,0x73,0x6d,0x1a,0x03,0x00,0x00,0x01,0x00, 0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x76,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00, 0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x03,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x7b, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff, 0xff,0x01,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x37,0x00,0x09, 0x00,0x10,0x0c,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x81, 0x01,0x00,0x00,0x00,0x02,0x23,0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x05,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x81,0x01,0x00,0x00,0x01,0x02,0x23,0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01, 0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x01,0x05,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x81,0x01,0x00, 0x00,0x02,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x06, 0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x02,0x02,0x23,0x01,0x29,0x01,0x00,0x00,0x00, 0x80,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x02,0x05,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x02,0x02,0x00,0x02,0x00,0x81, 0x01,0x00,0x00,0x03,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00, 0x02,0x04,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x03,0x02,0x23,0x01,0x29,0x01,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x02,0x06,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x03, 0x05,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x01,0x00,0x00,0x04,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x01, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x04,0x02,0x23,0x01,0x29, 0x01,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x81,0x01,0x00, 0x00,0x04,0x05,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x06, 0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x05,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x82,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x05,0x02,0x23, 0x01,0x29,0x01,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x81, 0x01,0x00,0x00,0x05,0x05,0x22,0x01,0x2c,0x00,0x00,0x02,0x01,0x00,0x00,0x28,0x00, 0x00,0x00,0x02,0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00, 0x01,0x00,0x01,0x03,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x84,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x10,0x84,0x01,0x00,0x00,0x02,0x14,0x46, 0x02,0x01,0x03,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x84, 0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x10,0x84,0x01,0x00,0x00,0x03,0x14,0x46,0x02, 0x10,0x04,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x03,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00, 0x00,0x04,0x22,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00, 0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x00,0x00,0x00, 0x02,0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00, 0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00, 0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x10,0x84,0x01, 0x00,0x00,0x02,0x05,0x46,0x02,0x10,0x04,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x8b,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x8c,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8d,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8d,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x25,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x90, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x89,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x19,0x01,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00, 0x00,0x01,0x0e,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00, 0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x33,0x80,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00,0x67,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x02,0x00, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x01,0x0f,0x21,0x01,0x05,0x01,0xff,0xff,0xff, 0xff,0x29,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x02,0x00,0x01,0x00,0x00, 0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x94,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff, 0x2c,0x00,0x00,0x02,0x03,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x03,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x08, 0x00,0x08,0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00, 0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x01,0x0e,0x21, 0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0xff, 0xff,0xff,0xff,0x25,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x92,0x01,0x00,0x00,0x01,0x0f,0x21,0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x2c,0x00,0x04,0x02,0x04, 0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9c,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x05,0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00,0x02, 0x06,0x00,0x02,0x05,0x00,0x02,0x04,0x00,0x2a,0x00,0x06,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00, 0x00,0x2c,0x00,0x01,0x02,0x07,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x07,0x00, 0x02,0x04,0x00,0x2a,0x00,0x08,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x01,0x02, 0x09,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x02,0x0a,0x00,0x02,0x09,0x00,0x02,0x05,0x00,0x2a,0x00, 0x0a,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00, 0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x0b,0x00,0x02,0x07, 0x00,0x02,0x09,0x00,0x2a,0x00,0x0b,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x04,0x00,0x00,0x00, 0x29,0x03,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00, 0x03,0x00,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x06,0x80, 0x04,0x00,0x01,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x79,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01, 0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x04,0x00,0x29,0x00,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x08, 0x80,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x02, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x03,0x21, 0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x01,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab, 0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x05,0x00,0x29,0x00,0x00,0x00,0x00,0x5a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00, 0x0a,0x80,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00, 0x04,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x05, 0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x60,0x00,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x01,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb0,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x06,0x00,0x29,0x00,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x0b,0x80,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00, 0x00,0x06,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00, 0x07,0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xb3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x6b,0x00,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x07,0x00,0x01,0x00,0x00,0x00, 0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x04,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x04,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00, 0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbf, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbd,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc9, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xca,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcb,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29, 0x04,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xcd,0x01,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29, 0x04,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x56,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x03,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcf,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x25,0x03,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x2c,0x03,0x00,0x02,0x0c,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd1,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x2a,0x03,0x0c,0x00,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00, 0x00,0x10,0x03,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x01,0x02,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xd5,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x2c,0x00,0x00, 0x02,0x0d,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x01,0x00, 0x00,0x00,0x01,0x21,0x01,0x32,0x00,0x0d,0x80,0x09,0x00,0x01,0x03,0x00,0x00,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x08,0x47, 0x04,0x10,0xd8,0x01,0x00,0x00,0x01,0x08,0x47,0x04,0x01,0x03,0x00,0x00,0x00,0xd7, 0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x02,0x08,0x47,0x04, 0x10,0xd8,0x01,0x00,0x00,0x03,0x08,0x47,0x04,0x10,0x04,0x00,0x00,0x00,0xd7,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0xd9,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xd7, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xda,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xd9,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xda,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdb,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x01,0x03,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01, 0x00,0x00,0x00,0x08,0x47,0x04,0x10,0xd8,0x01,0x00,0x00,0x00,0x0c,0x47,0x04,0x01, 0x03,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xd8,0x01,0x00, 0x00,0x02,0x08,0x47,0x04,0x10,0xd8,0x01,0x00,0x00,0x02,0x0c,0x47,0x04,0x10,0x04, 0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00, 0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xe3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe2,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0xdd,0x01, 0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x19,0x01,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xe5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xe6,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x04,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0xff,0x00, 0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xea,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04, 0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00, 0x02,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xec, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x04,0x00,0x23,0x01, 0x05,0x03,0xff,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x84,0x01,0x00, 0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x84,0x01,0x00,0x00, 0x02,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x84,0x01,0x00,0x00,0x03, 0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x84,0x01,0x00,0x00,0x04,0x02, 0x56,0x02,0x29,0x04,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08, 0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xef,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x08,0xef,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0xf1,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x08,0xf3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x23,0x01, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x00, 0xfa,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0xf8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0xfb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xf8,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfb,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x01,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x00,0x02, 0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x00,0xe5,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x0c,0x00,0x00,0x00, 0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x97,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x04,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x19,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3d,0x29,0x00,0x00,0x00, 0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3f,0x0c, 0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x06,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x2c, 0x00,0x03,0x02,0x0e,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x0f,0x00,0x00,0x08,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x48,0x01,0x00,0x21,0x00,0x00,0x00, 0x02,0x10,0x00,0x02,0x0f,0x00,0x02,0x0e,0x00,0x32,0x00,0x10,0x00,0x0a,0x00,0x0c, 0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c, 0x00,0x04,0x02,0x11,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x00,0x80,0x00,0x2a,0x00,0x11,0x00,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x11, 0x80,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0b,0x00,0x10,0x00, 0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x00,0x00, 0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33, 0x80,0x00,0x00,0x0b,0x00,0x10,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x31,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x01, 0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x33,0x80, 0x00,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x01,0x00,0x00,0x10,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x04,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x84,0x01,0x00,0x00,0x01,0x02,0x56,0x02,0x10, 0x04,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x84,0x01,0x00,0x00,0x02,0x02,0x56,0x02,0x10,0x04, 0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x84,0x01,0x00,0x00,0x03,0x02,0x56,0x02,0x10,0x04,0x00, 0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x84,0x01,0x00,0x00,0x04,0x02,0x56,0x02,0x10,0x04,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00, 0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x15, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x16,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x0f, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x14,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x10,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x11,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x12,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x25,0x04,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00, 0x25,0x04,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00, 0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x1a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00, 0x08,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x1a,0x00, 0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa8, 0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x01,0x00,0x24,0x01, 0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x01,0x12,0x00,0x02,0x00,0xa5,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x01, 0x1e,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x00,0x24,0x01,0x29,0x03,0x00,0x00, 0x00,0xa8,0x00,0x00,0x00,0x02,0x0a,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x02,0x16,0x00,0x02,0x00, 0xa6,0x00,0x00,0x00,0x01,0x00,0x24,0x01,0x29,0x03,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x03, 0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0xa7,0x00,0x00,0x00, 0x01,0x00,0x24,0x01,0x31,0x09,0x00,0x29,0x02,0x00,0x00,0x00,0x1b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1c,0x02,0x00,0x00,0x00,0x0d,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x1c,0x02,0x00,0x00,0x01, 0x03,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x1c,0x02,0x00,0x00,0x01,0x09,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x02, 0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x1c,0x02,0x00,0x00,0x01,0x0f,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x1c,0x02,0x00, 0x00,0x02,0x05,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x01,0x04, 0x00,0x02,0x00,0x1c,0x02,0x00,0x00,0x02,0x0b,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x1b,0x02,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x1d,0x02,0x00,0x00,0x00,0x01,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x1d, 0x02,0x00,0x00,0x00,0x07,0x22,0x01,0x24,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02, 0x00,0x00,0x00,0x2c,0x00,0x02,0x02,0x12,0x00,0x00,0x02,0x02,0x00,0x00,0x02,0x03, 0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x12,0x00,0x0c,0x00,0x37,0x00, 0x09,0x01,0x08,0x04,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x0d,0x00,0x31,0x0c,0x00,0x29,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x02,0x03,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x09,0x01,0x10,0x06,0x00,0x7e,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0xac, 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x12,0x22,0x01,0x00,0x24,0x02,0x00,0x00, 0x00,0x1a,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x1e,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01, 0x06,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x23,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x23,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x25,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x01,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x01,0x14,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x1c,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x02,0x00,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01,0x08,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x02,0x00,0x00, 0x00,0x04,0x22,0x01,0x00,0x28,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00, 0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x02,0x00,0x00,0x00, 0x02,0x22,0x01,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00, 0x00,0x27,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x2a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x2a,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00, 0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x16,0x22, 0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x1e,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x2b, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x02,0x22,0x01, 0x00,0x24,0x02,0x00,0x00,0x01,0x0a,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x2c,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x2b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x2d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x2c, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x02, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x18,0x22,0x01,0x00,0x24,0x02,0x00, 0x00,0x01,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x04,0x22,0x01,0x00,0x24,0x02,0x00,0x00, 0x01,0x0c,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2e,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x2e,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x2f,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x30,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x30,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x01,0x02,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x02,0x0a,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01,0x12,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x02,0x16,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01,0x1e,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x02,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x02,0x00,0x00, 0x00,0x02,0x22,0x01,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x33,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x33,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0c, 0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01,0x14,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x34,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x18,0x22, 0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x35, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x02,0x00,0x00,0x00,0x04,0x22,0x01, 0x00,0x34,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x36,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00, 0x35,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00, 0x00,0x00,0x05,0x00,0x02,0x00,0x36,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x36, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x37,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0e,0x22,0x01,0x00,0x24,0x02, 0x00,0x00,0x01,0x16,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x1a,0x22,0x01,0x00,0x24,0x02,0x00, 0x00,0x02,0x02,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x37,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x38,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x38,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x39,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x24,0x02,0x00,0x00,0x02,0x10,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x01,0x18,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x02,0x1c,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x04,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x3c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x3c,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00, 0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00, 0x02,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x0a,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0x3d,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x0e, 0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x16,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x40, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x40,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x41,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x24, 0x02,0x00,0x00,0x02,0x0c,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x41,0x02,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x10,0x22,0x01,0x00,0x24,0x02, 0x00,0x00,0x02,0x18,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x41,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x42,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x09,0x00, 0x02,0x00,0x43,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x02,0x00,0x00,0x00, 0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3e,0x02,0x00,0x00,0x00,0x06,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x0e, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x3e,0x02,0x00,0x00,0x00,0x12,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x1a,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44, 0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x44,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x02, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0x46,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x46,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00, 0x00,0x08,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x10,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00, 0x14,0x22,0x01,0x00,0x24,0x02,0x00,0x00,0x02,0x1c,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27, 0x02,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x49,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x4a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x1a,0x22,0x01,0x00, 0x3e,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x4a,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x01,0x06,0x22,0x01,0x00,0x3e, 0x02,0x00,0x00,0x00,0x0e,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x4b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x4a,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4b,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4b,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x0c, 0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x02,0x00,0x00, 0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x1c,0x22,0x01,0x00,0x3e,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x3e,0x02,0x00,0x00,0x01,0x08,0x22,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x10, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4d,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x01,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e, 0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x4f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01, 0x02,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00, 0x00,0x00,0x1e,0x22,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x06,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00, 0x01,0x0a,0x22,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x12,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x02,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x27,0x02,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x53, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x01,0x00,0x22,0x01, 0x00,0x3e,0x02,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x53,0x02, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x01,0x0c,0x22,0x01,0x00, 0x3e,0x02,0x00,0x00,0x00,0x14,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x54,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x53, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x55,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x54,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x54,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00, 0x0f,0x00,0x02,0x00,0x55,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x55,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x04,0x00,0x00, 0x00,0x01,0x02,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x00,0x0c,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x02,0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x00,0x18,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x57,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x01,0x04,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x57,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xea,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0xeb,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xeb,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x02,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x01,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x00,0x0e,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01, 0x02,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x00,0x1a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x01,0x06,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x58,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xde,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x04, 0x00,0x02,0x00,0xde,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00, 0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x04,0x22, 0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x59, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x10,0x22,0x01, 0x10,0x56,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x59,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x1c,0x22,0x01,0x10, 0x56,0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x59,0x02,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x08,0x22,0x01,0x10,0x56, 0x02,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x59,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x00,0xdf,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xdf,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xdf,0x00,0x00, 0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x06,0x22,0x01,0x10,0x56,0x02,0x00,0x00, 0x00,0x03,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x12,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00, 0x03,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x24,0x02,0x00,0x00,0x00,0x1e,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x03, 0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x24,0x02,0x00,0x00,0x01,0x0a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x03,0x21, 0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x5a, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xea,0x00,0x00,0x00, 0x00,0x0c,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xea,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00, 0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x0c,0x00,0x02, 0x00,0xe0,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01, 0x02,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x00,0x18,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x01,0x04,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x02,0x00, 0x00,0x00,0x5b,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01, 0x10,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x5b,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x1c, 0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x5b,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xec,0x00,0x00,0x00,0x00, 0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xed,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xed,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01, 0x02,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x00,0x1a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x01,0x06,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x02,0x00, 0x00,0x00,0x5c,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01, 0x12,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x5c,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x1e, 0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x5c,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe1, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x00,0x00,0x00, 0x01,0x04,0x00,0x02,0x00,0xe1,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe1,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x01,0x04,0x00,0x02, 0x00,0xe1,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00,0x5d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x1c,0x22,0x01,0x10, 0x56,0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5d,0x02,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x08,0x22,0x01,0x10,0x56, 0x02,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5d,0x02,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x14,0x22,0x01,0x10,0x56,0x02, 0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x01, 0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x10,0x56,0x02,0x00, 0x00,0x00,0x06,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x5d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xec,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe2, 0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xed,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x01, 0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x24,0x02,0x00,0x00,0x00,0x1e,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x07, 0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x24,0x02,0x00,0x00,0x01,0x0a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x07,0x21, 0x01,0x01,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x01,0x16,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x07,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x02,0x02,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x07,0x21,0x01,0x29, 0x04,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x5e,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x0c, 0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0xec,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x08,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xe3, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00, 0x01,0x0c,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00, 0x00,0x00,0x5f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01, 0x10,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x5f,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x1c, 0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x02,0x00,0x00,0x00, 0x5f,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x08,0x22, 0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x08,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x5f, 0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x14,0x22,0x01, 0x10,0x56,0x02,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x5f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x5f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x05,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0xee,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xee,0x00,0x00,0x00,0x00,0x08,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00, 0x00,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01, 0x12,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x60,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x1e, 0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x02,0x00,0x00,0x00, 0x60,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0a,0x22, 0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x09,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x60, 0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x16,0x22,0x01, 0x10,0x56,0x02,0x00,0x00,0x00,0x09,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x60,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x60,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe4,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x01,0x04, 0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe4,0x00,0x00,0x00,0x01,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xe4, 0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x01,0x14,0x22,0x01,0x10,0x56,0x02, 0x00,0x00,0x00,0x0a,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x00,0x22,0x01,0x10,0x56,0x02,0x00, 0x00,0x00,0x0a,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0c,0x22,0x01,0x10,0x56,0x02,0x00,0x00, 0x00,0x0a,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x01,0x04,0x00, 0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x18,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00, 0x0a,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x61,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe5,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0xe5,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe5,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24, 0x02,0x00,0x00,0x01,0x16,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0b,0x21,0x01, 0x01,0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02, 0x00,0x00,0x02,0x02,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0b,0x21,0x01,0x01, 0x02,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x02,0x0e,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0b,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x02,0x1a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x62,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x0c,0x00,0x02, 0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xee,0x00, 0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xe6,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xe6,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x01,0x0c, 0x00,0x02,0x00,0xe6,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00, 0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x08,0x22, 0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x63, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x14,0x22,0x01, 0x10,0x56,0x02,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x63,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x56,0x02,0x00,0x00,0x00,0x0c,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x63,0x02,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x0c,0x22,0x01,0x10,0x56, 0x02,0x00,0x00,0x00,0x0c,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x63,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x63,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0xf1,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00, 0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0a,0x22, 0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0d,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x64, 0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x16,0x22,0x01, 0x10,0x56,0x02,0x00,0x00,0x00,0x0d,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x64,0x02, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x10, 0x56,0x02,0x00,0x00,0x00,0x0d,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x64,0x02,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x0e,0x22,0x01,0x10,0x56, 0x02,0x00,0x00,0x00,0x0d,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x64,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x64,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x04,0x00,0x02, 0x00,0xe7,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xe7,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xe7,0x00,0x00, 0x00,0x01,0x08,0x23,0x01,0x01,0x02,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x0c,0x22,0x01,0x10,0x56,0x02,0x00,0x00, 0x00,0x0e,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x24,0x02,0x00,0x00,0x02,0x18,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00, 0x0e,0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x3e,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0e, 0x21,0x01,0x01,0x02,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x3e,0x02,0x00,0x00,0x00,0x10,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0e,0x21, 0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x65, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe8,0x00,0x00,0x00,0x00, 0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe8,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01, 0x02,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00, 0x00,0x02,0x0e,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0f,0x21,0x01,0x01,0x02, 0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x24,0x02,0x00,0x00, 0x02,0x1a,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0f,0x21,0x01,0x01,0x02,0x00, 0x00,0x00,0x66,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00, 0x06,0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0f,0x21,0x01,0x01,0x02,0x00,0x00, 0x00,0x66,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x3e,0x02,0x00,0x00,0x00,0x12, 0x22,0x01,0x10,0x56,0x02,0x00,0x00,0x00,0x0f,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x66,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x66,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xe9, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x01,0x0c,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x01,0x0c,0x00,0x02, 0x00,0xe9,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x10,0x05,0x00,0x00,0x00,0x67,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x67,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x68,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x68, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x69,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x69,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6a,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x6b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6b,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6c,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6d,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x6e,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x03,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70, 0x02,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x71,0x02,0x00,0x00,0x00,0x00,0x46,0x02, 0x01,0x02,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x73,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00, 0x00,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x00, 0x04,0x46,0x02,0x00,0x71,0x02,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00, 0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x77,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x76,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x77,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x00, 0x71,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x79,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x78, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x7a,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x79,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x7b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x71,0x02,0x00,0x00, 0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x7b,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x7b,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7c,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x7c,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7d,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x01,0x03,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f, 0x02,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x46,0x02, 0x01,0x02,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x82,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x82,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00, 0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00, 0x04,0x46,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00, 0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x85,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x86,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x00, 0x80,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x87,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x86, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x88,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x87,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x87,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x88,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x89,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7f,0x02,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x80,0x02,0x00,0x00, 0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x89,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x89,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x00,0x07,0x00,0x02,0x00, 0x8b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x01,0x03,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x02,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x46,0x02, 0x01,0x02,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x8f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x90,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x90,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00, 0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00, 0x04,0x46,0x02,0x00,0x8e,0x02,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00, 0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x91,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x93,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0x93,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x93,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x94,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x00, 0x8e,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x95,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x94, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x96,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x95,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x95,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01, 0x02,0x00,0x02,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x97,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8d,0x02,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x8e,0x02,0x00,0x00, 0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x97,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x97,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x98,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x98,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01,0x03,0x00,0x02,0x00, 0x99,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x01,0x03,0x00,0x00,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b, 0x02,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x46,0x02, 0x01,0x02,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x9d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x9e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x9e,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00, 0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00, 0x04,0x46,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00, 0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0xa1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x01,0x05,0x00,0x02,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xa1,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa2,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x00, 0x9c,0x02,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xa3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa2, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa4,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa3,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa3,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01, 0x06,0x00,0x02,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x9b,0x02,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x9c,0x02,0x00,0x00, 0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa5,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa5,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa6,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa6,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x01,0x07,0x00,0x02,0x00, 0xa7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa7,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x25,0x04,0x00,0x00,0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x04,0x00, 0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x03,0x00,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07,0x00,0x00,0x20,0x41,0x03, 0x04,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x24,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xab, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x07,0x00,0x00,0x00,0x40,0x03,0x04,0x00,0x00,0x00,0xab,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x10,0x25,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00,0x00, 0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00, 0x00,0x80,0x40,0x29,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x07,0x00,0x00,0x80,0x3f,0x0c,0x04,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x26,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x03, 0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xac,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x1b,0x03,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xac,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x1b,0x03,0x00,0x00,0x00,0xad, 0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x1b,0x03,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xac,0x02, 0x00,0x00,0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0xaa,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00, 0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x03, 0x00,0xaa,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x03,0x03,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0xab,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x03,0x03,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xab, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x01,0x00,0x22,0x01, 0x03,0x03,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xab,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x03, 0x03,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xab,0x02,0x00, 0x00,0x01,0x00,0x22,0x01,0x00,0xac,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00, 0x00,0x12,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x02,0x00,0x00,0x01,0x12,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb4, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x00,0x14,0x56,0x02, 0x00,0xb3,0x02,0x00,0x00,0x00,0x10,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb5,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x01,0x14,0x56,0x02,0x00, 0xb3,0x02,0x00,0x00,0x01,0x10,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb4,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb3, 0x02,0x00,0x00,0x00,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb3,0x02, 0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb3,0x02,0x00, 0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb3,0x02,0x00,0x00, 0x02,0x02,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x04,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x04,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xb7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00, 0x00,0x04,0x56,0x02,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x56,0x02,0x01,0x04,0x00, 0x00,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x02,0x00,0x00,0x01, 0x04,0x56,0x02,0x00,0xb3,0x02,0x00,0x00,0x01,0x00,0x56,0x02,0x01,0x04,0x00,0x00, 0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xb3,0x02,0x00,0x00,0x01,0x00,0x56,0x02,0x01,0x04,0x00,0x00,0x00, 0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xb3,0x02,0x00,0x00,0x02,0x00,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb8, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xb3,0x02,0x00,0x00,0x01,0x04,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0xb9,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xb3,0x02,0x00,0x00,0x02,0x04,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x33,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x29,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00, 0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2a,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x36,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f, 0x01,0x04,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x04,0x00,0x00, 0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb1,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04, 0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x3a,0x01,0x00,0x00, 0x00,0x00,0x24,0x01,0x32,0x00,0x00,0x00,0x0d,0x00,0x31,0x01,0x00,0x37,0x00,0x09, 0x00,0x08,0x08,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00, 0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x09,0x01,0x08,0x04,0x00,0x1f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbe,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3d, 0x01,0x00,0x00,0x00,0x00,0x31,0x0d,0x00,0x38,0x00,0x0a,0x00,0x08,0x08,0x00,0x1f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x3c,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00, 0x00,0x00,0x38,0x00,0x0a,0x01,0x08,0x04,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x01,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x30,0x03,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e, 0xfb,0xff,0xff,0x29,0x03,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x41,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x1b, 0x03,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x03,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x08,0x00,0x80, 0x3f,0x10,0x03,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x34,0x00,0x00,0x00, 0x30,0x0b,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00, 0xc5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x22,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xc8,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0xc8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0xcc,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x1b,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x51, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xcf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00, 0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x4e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x48,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x4e,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xd3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0xd5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03, 0x02,0x13,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x13,0x00,0x00,0x54,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00, 0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00, 0x00,0x30,0x08,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff, 0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd9,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xd8,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xd8, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x60,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xdd,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0xdd,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x1b,0x04, 0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5c,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x04,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x61, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x5f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x5f,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xd9, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xe0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd9,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xe5,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00, 0x00,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0xe6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x04,0x03,0x02,0x14, 0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x2a,0x04,0x14,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x30,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x91,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xe9,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xed,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0xf1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0, 0xb4,0x0c,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf2,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xee,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf3,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x6f,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00, 0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x6f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf5,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xea,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xf6,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xf6,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xf6,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x15,0x00,0x00,0xec,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x15, 0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xef,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x91,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x67,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x65,0x01, 0x00,0x80,0x10,0x82,0xe6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x68,0x00, 0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x40,0x02, 0x00,0x00,0x60,0x01,0x05,0x26,0xa4,0x01,0x00,0x01,0xe4,0x01,0x00,0x00,0x65,0x02, 0x02,0x62,0x05,0x02,0xf1,0xff,0x69,0x02,0x26,0x68,0x3a,0x26,0x31,0x00,0x40,0x02, 0x00,0x00,0x60,0x01,0x25,0x26,0xa4,0x01,0x00,0x01,0x04,0x02,0x00,0x00,0x61,0x00, 0x03,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x04,0x48,0x02,0x40,0x04,0x00,0x00,0x60,0x86,0x85,0x26,0x44,0x26, 0x00,0x05,0xfe,0xff,0xfe,0xff,0x69,0x04,0x00,0x00,0x60,0x86,0x65,0x26,0x24,0x26, 0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x05,0x27,0x04,0x03, 0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x69,0x02,0x40,0x03, 0x00,0x00,0x60,0x86,0x25,0x04,0x64,0x26,0x00,0x05,0xfe,0xff,0xfe,0xff,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x04,0x00,0x00,0x00,0x00,0x0f,0x00,0x0b,0x00,0x61,0x06, 0x04,0x62,0x58,0x26,0x01,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x2b,0x04,0x04, 0x00,0xc0,0x00,0x00,0x00,0x00,0x70,0x20,0x00,0x00,0x50,0x85,0x01,0x00,0x04,0x29, 0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x21,0x01,0x00,0xa0,0x0a,0x05,0x61,0x05,0x2b, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x45,0x61,0x44,0x2b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x85,0x61,0xa5,0x2b, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x61,0x05,0x2c, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05,0x62,0x44,0x2c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x45,0x62,0xa5,0x2c, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x85,0x62,0x05,0x2d, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x62,0x44,0x2d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05,0x63,0xa5,0x2d, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x45,0x63,0x05,0x2e, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x85,0x63,0x44,0x2e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x63,0xa5,0x2e, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05,0x64,0x05,0x2f, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x45,0x64,0x44,0x2f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x85,0x64,0xa5,0x2f, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0xc5,0x64,0x05,0x30, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x05,0x65,0x44,0x30, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0xa0,0x0a,0x45,0x65,0xa5,0x30, 0x22,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x2b,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x02,0xa5,0x2d, 0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x05,0xa5,0x2e, 0x54,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x60,0x00,0x05,0x03,0x25,0x2d, 0x54,0x05,0x05,0x02,0x46,0x00,0x61,0x00,0x04,0x00,0x50,0x20,0x05,0x02,0x2d,0x2d, 0x54,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x03,0x00,0x60,0x00,0x05,0x04,0x25,0x2e, 0x54,0x05,0x05,0x05,0x46,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x0a,0x25,0x2d, 0x54,0x05,0x05,0x02,0x58,0x00,0x41,0x04,0x20,0x24,0x06,0x03,0x60,0x03,0x49,0x00, 0x03,0xa1,0x02,0x03,0x00,0x03,0x41,0x04,0x20,0x24,0x06,0x04,0x60,0x04,0x49,0x00, 0x04,0xa1,0x02,0x04,0x00,0x04,0x41,0x05,0x20,0x24,0x06,0x0a,0x60,0x0a,0x49,0x00, 0x0a,0xa1,0x02,0x0a,0x00,0x0a,0x41,0x00,0x20,0x24,0x06,0x0b,0x60,0x0b,0x49,0x00, 0x0b,0xa1,0x02,0x0b,0x00,0x0b,0x40,0x05,0x06,0xa1,0x02,0x04,0x00,0x03,0x40,0x02, 0x05,0xa1,0x02,0x0b,0x00,0x0a,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x07,0x85,0x06, 0x34,0x06,0x05,0x06,0x34,0x00,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x03,0x85,0x05, 0x34,0x06,0x05,0x05,0x34,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x08,0x45,0x07, 0x22,0x06,0x05,0x07,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x04,0x45,0x03, 0x22,0x06,0x05,0x03,0x22,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x08, 0x00,0x06,0x24,0x08,0x00,0x00,0x40,0x02,0x06,0xa8,0x12,0x04,0x11,0x04,0x68,0x02, 0x00,0x00,0x20,0x82,0x05,0x09,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02, 0x00,0x00,0x20,0x82,0x25,0x09,0x04,0x06,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x02, 0x31,0x68,0x06,0x09,0x01,0x00,0x61,0x02,0x31,0x68,0xce,0x09,0x01,0x00,0x40,0x00, 0x00,0x00,0x60,0x81,0xc5,0x32,0xe4,0x28,0x00,0x05,0xf8,0xff,0xf8,0xff,0x38,0xa2, 0x01,0x00,0xa0,0x0a,0x05,0x31,0x05,0x31,0x22,0x40,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0xa0,0x0a,0x25,0x6e,0x44,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0xc4,0x60,0x00,0x00,0x00,0x00,0xc0,0x2e,0x00,0x00,0x70,0x02, 0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x6e,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x00, 0x00,0x00,0x60,0x81,0xc5,0x32,0xf4,0x28,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00, 0x00,0x00,0xa0,0x0a,0x25,0x6e,0x64,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x03, 0x00,0x01,0x60,0x85,0xa5,0x26,0xe4,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0xc4,0x60,0x00,0x00,0x00,0x00,0x60,0x2e,0x00,0x00,0x40,0x02, 0x00,0x00,0x60,0x06,0xa5,0x26,0x04,0x26,0x00,0x06,0xa4,0x26,0x00,0x00,0x70,0x04, 0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x6e,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x90,0x49,0x05,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x00, 0x00,0x00,0x60,0x86,0xe5,0x01,0x24,0x26,0x00,0x05,0xff,0xff,0xff,0xff,0x69,0x04, 0x00,0x00,0x60,0x86,0xa5,0x26,0xa4,0x26,0x00,0x05,0x02,0x00,0x02,0x00,0x62,0x03, 0x00,0x01,0x60,0x85,0x25,0x02,0x04,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01, 0x00,0x02,0x00,0x00,0x19,0x02,0x40,0x04,0x03,0x68,0x72,0x26,0xc1,0xff,0x40,0x04, 0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06,0x24,0x02,0x00,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x68,0x00, 0x05,0x68,0x85,0x28,0x31,0x00,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03, 0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x10,0x81,0x15,0x05,0xf4,0x28, 0x00,0x01,0x03,0x00,0x03,0x00,0x40,0x02,0x00,0x00,0x50,0x85,0x05,0x05,0x04,0x05, 0x00,0x05,0xff,0xff,0xff,0xff,0x40,0x02,0x00,0x00,0x50,0x85,0x15,0x05,0x14,0x05, 0x00,0x05,0xff,0xff,0xff,0xff,0x70,0x02,0x80,0x00,0x20,0x02,0x01,0x00,0x04,0x26, 0x00,0x51,0x04,0x05,0x00,0x00,0x70,0x02,0x00,0x00,0x20,0x02,0x01,0x00,0x24,0x26, 0x00,0x51,0x14,0x05,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0xe5,0x01,0x04,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0x15,0x02,0x04,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x06,0xe2,0x06,0x31,0x01,0x00,0x65,0x02, 0x80,0x00,0x10,0x01,0x01,0x00,0xe4,0x01,0x00,0x21,0x14,0x02,0x00,0x00,0x62,0x33, 0x00,0x01,0x10,0x81,0x25,0x03,0x04,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00, 0x32,0xe2,0x8e,0x31,0x01,0x00,0x62,0x00,0x80,0x01,0x40,0x85,0xc6,0x26,0x04,0x02, 0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00,0x60,0x86,0x01,0x00,0x04,0x26, 0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x49,0x25,0x60,0x00,0x00, 0x00,0x00,0x04,0x00,0x04,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x03,0x04,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xe2,0x06,0x31,0x01,0x00,0x65,0x02, 0x00,0x00,0x10,0x01,0x01,0x00,0x14,0x03,0x00,0x21,0x24,0x03,0x00,0x00,0x61,0x07, 0x00,0x80,0x10,0x01,0x01,0x31,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x10,0x01,0x55,0x31,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00, 0x00,0x01,0x40,0x85,0xd6,0x26,0x04,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x86,0x01,0x00,0x24,0x26,0x00,0x25,0x00,0x00,0x00,0x00,0x62,0x00, 0x80,0x01,0x10,0x81,0xe5,0x01,0x04,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x00, 0x00,0x01,0x10,0x81,0x25,0x02,0x04,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x23, 0x03,0x80,0x90,0x09,0x05,0x32,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x62,0x00, 0x00,0x01,0x10,0x81,0x05,0x04,0x04,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x02, 0x03,0x00,0x90,0x09,0x05,0x69,0x05,0x32,0x46,0x00,0x00,0x00,0x00,0x00,0x65,0x02, 0x80,0x00,0x10,0x01,0x01,0x00,0x04,0x04,0x00,0x21,0xe4,0x01,0x00,0x00,0x61,0x00, 0x60,0xe2,0xae,0x31,0x01,0x00,0x62,0x00,0x80,0x01,0x40,0x85,0x46,0x31,0x04,0x02, 0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x04,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x02,0x04,0x02, 0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x10,0x01,0x01,0x00,0x14,0x02, 0x00,0x21,0x24,0x02,0x00,0x00,0x62,0x00,0x00,0x01,0x40,0x85,0xe6,0x26,0x04,0x02, 0x00,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0xc4,0x69,0x00,0x00, 0x00,0x00,0xd8,0x27,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xe4,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x6a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x34,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x36,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x38,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x03,0x00,0x60,0x05,0x05,0x33,0x05,0x69, 0x46,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x04, 0x02,0xa8,0x42,0x26,0x11,0x33,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x02,0x64,0x26, 0x00,0x06,0x24,0x33,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x24,0x04,0x00,0x60,0x00,0x05,0x6a,0x05,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x34,0x85,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x36,0x05,0x04, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x38,0x85,0x04, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x54,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x3a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x3c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x3e,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x40,0xa0,0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x26,0x00,0x06,0x44,0x33,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x02,0x64,0x26,0x00,0x06,0x64,0x33,0x00,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x95, 0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x25, 0x04,0x00,0x60,0x00,0x05,0x3a,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x3c,0x85,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x3e,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x40,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x10,0x01,0x01,0x31,0xa4,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x42,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x44,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x46,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x48,0xa0,0x00,0x00,0x01,0x00,0x20,0x00, 0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x61,0x00, 0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00,0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x26, 0x00,0x06,0x84,0x33,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x02,0x64,0x26, 0x00,0x06,0xa4,0x33,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x96,0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x26,0x04,0x00,0x60,0x00,0x05,0x42,0x05,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x44,0x85,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x46,0x05,0x04, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x48,0x85,0x04, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x4a,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x4c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x4e,0xa0,0x00,0x00,0x01,0x00,0x61,0x00, 0x50,0xa0,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x05,0x02,0x44,0x26,0x00,0x06,0xc4,0x33,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x02,0x64,0x26,0x00,0x06,0xe4,0x33,0x00,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x97, 0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x27, 0x04,0x00,0x60,0x00,0x05,0x4a,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x4c,0x85,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x4e,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x50,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x50,0x04,0xe5,0x01,0xe4,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0x50,0x04,0x05,0x02,0xd4,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02, 0x00,0x00,0x40,0x04,0x46,0x31,0x44,0x31,0x00,0x05,0xe4,0x01,0x00,0x00,0x61,0x00, 0x00,0x80,0x50,0x04,0x05,0x03,0xc4,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02, 0x00,0x00,0x40,0x04,0x46,0x31,0x44,0x31,0x00,0x05,0x04,0x02,0x00,0x00,0x40,0x01, 0x00,0x00,0x40,0x04,0x46,0x31,0x44,0x31,0x00,0x05,0x04,0x03,0x00,0x00,0x68,0x01, 0x00,0x00,0x00,0x80,0x06,0x04,0x44,0x31,0x00,0x01,0x01,0x00,0x01,0x00,0x61,0x00, 0x04,0x00,0x60,0x00,0x05,0x52,0x44,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02, 0x04,0x00,0x60,0x00,0x05,0x6a,0x04,0x04,0x00,0x06,0x05,0x6a,0x46,0x00,0x40,0x00, 0x04,0x00,0x60,0x00,0x05,0x34,0x04,0x04,0x00,0x06,0x05,0x34,0x46,0x00,0x40,0x00, 0x04,0x00,0x60,0x00,0x05,0x36,0x04,0x04,0x00,0x06,0x05,0x36,0x46,0x00,0x40,0x00, 0x04,0x00,0x60,0x00,0x05,0x38,0x04,0x04,0x00,0x06,0x05,0x38,0x46,0x00,0x40,0x04, 0x6a,0xa0,0x02,0x6a,0x00,0x3a,0x40,0x04,0x34,0xa0,0x02,0x34,0x00,0x3c,0x40,0x04, 0x36,0xa0,0x02,0x36,0x00,0x3e,0x40,0x04,0x38,0xa0,0x02,0x38,0x00,0x40,0x40,0x04, 0x6a,0xa0,0x02,0x6a,0x00,0x42,0x40,0x04,0x34,0xa0,0x02,0x34,0x00,0x44,0x40,0x04, 0x36,0xa0,0x02,0x36,0x00,0x46,0x40,0x04,0x38,0xa0,0x02,0x38,0x00,0x48,0x61,0x00, 0x6c,0x60,0x00,0x52,0x00,0x00,0x40,0x05,0x6a,0xa0,0x02,0x6a,0x00,0x4a,0x40,0x05, 0x34,0xa0,0x02,0x34,0x00,0x4c,0x40,0x05,0x36,0xa0,0x02,0x36,0x00,0x4e,0x40,0x05, 0x38,0xa0,0x02,0x38,0x00,0x50,0x2c,0x00,0x05,0x80,0x00,0x40,0x44,0x6e,0x00,0x00, 0x00,0x00,0xd0,0x25,0x00,0x00,0x61,0x05,0x5a,0x60,0x00,0x6a,0x00,0x00,0x61,0x00, 0x6c,0x60,0x00,0x52,0x00,0x00,0x61,0x06,0x6a,0x60,0x00,0x34,0x00,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0x44,0x6e,0x00,0x00,0x00,0x00,0xa8,0x25,0x00,0x00,0x61,0x02, 0x54,0x60,0x00,0x6a,0x00,0x00,0x61,0x00,0x6c,0x60,0x00,0x52,0x00,0x00,0x61,0x07, 0x6a,0x60,0x00,0x36,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x44,0x6e,0x00,0x00, 0x00,0x00,0x80,0x25,0x00,0x00,0x61,0x02,0x56,0x60,0x00,0x6a,0x00,0x00,0x61,0x00, 0x6c,0x60,0x00,0x52,0x00,0x00,0x61,0x00,0x6a,0x60,0x00,0x38,0x00,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0x44,0x6e,0x00,0x00,0x00,0x00,0x58,0x25,0x00,0x00,0x61,0x00, 0x00,0x80,0x50,0x00,0xe5,0x01,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x03,0x00,0x60,0x05,0x05,0x02,0x05,0x32,0x46,0x05,0x05,0x32,0x46,0x00,0x61,0x00, 0x00,0x80,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x70,0x03, 0x03,0x00,0x50,0x00,0x01,0x00,0xc4,0x01,0x00,0x15,0xe4,0x01,0x00,0x00,0x68,0x03, 0x03,0x00,0x20,0x82,0x05,0x02,0x05,0x02,0x46,0x01,0x04,0x00,0x04,0x00,0x62,0x03, 0x03,0x01,0x50,0x85,0x05,0x04,0x04,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x50,0x00,0x01,0x00,0xc4,0x01,0x00,0x15,0xe4,0x01,0x00,0x00,0x41,0x02, 0x03,0x00,0x50,0x05,0x05,0x04,0x05,0x04,0x46,0x05,0x04,0x02,0x20,0x00,0x61,0x07, 0x58,0x60,0x00,0x6a,0x00,0x00,0x40,0x02,0x02,0x00,0x60,0x05,0x05,0x05,0x45,0x04, 0x34,0x05,0x05,0x04,0x34,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0x05,0x06,0x45,0x05, 0x22,0x06,0x05,0x05,0x22,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0x65,0x31,0x04,0x06, 0x00,0x06,0x24,0x06,0x00,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0x06,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x02,0x47,0x55, 0x64,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x03,0x00,0x50,0x20,0x05,0x05,0x47,0x57, 0x64,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x60,0x00,0x05,0x03,0x47,0x54, 0x64,0x05,0x05,0x02,0x46,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x02,0x67,0x54, 0x64,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x03,0x00,0x60,0x00,0x05,0x04,0x47,0x56, 0x64,0x05,0x05,0x05,0x46,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x05,0x67,0x56, 0x64,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x20,0x24,0x06,0x03,0x60,0x03,0x40,0x04, 0x03,0x00,0x60,0x00,0x05,0x0a,0x47,0x54,0x64,0x05,0x05,0x02,0x46,0x00,0x49,0x00, 0x03,0xa1,0x02,0x03,0x00,0x03,0x40,0x04,0x03,0x00,0x60,0x00,0x05,0x0b,0x47,0x56, 0x64,0x05,0x05,0x05,0x46,0x00,0x41,0x06,0x20,0x24,0x06,0x04,0x60,0x04,0x49,0x00, 0x04,0xa1,0x02,0x04,0x00,0x04,0x41,0x05,0x20,0x24,0x06,0x0a,0x60,0x0a,0x49,0x00, 0x0a,0xa1,0x02,0x0a,0x00,0x0a,0x41,0x05,0x20,0x24,0x06,0x0b,0x60,0x0b,0x40,0x04, 0x06,0xa1,0x02,0x04,0x00,0x03,0x49,0x00,0x0b,0xa1,0x02,0x0b,0x00,0x0b,0x40,0x02, 0x02,0x00,0x60,0x06,0x05,0x07,0x85,0x06,0x34,0x06,0x05,0x06,0x34,0x00,0x40,0x02, 0x03,0xa1,0x02,0x0b,0x00,0x0a,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x08,0x45,0x07, 0x22,0x06,0x05,0x07,0x22,0x00,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x04,0x85,0x03, 0x34,0x06,0x05,0x03,0x34,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x08, 0x00,0x06,0x24,0x08,0x00,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x06,0x45,0x04, 0x22,0x06,0x05,0x04,0x22,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x05,0x09,0xe4,0x01, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xe5,0x01,0x04,0x06, 0x00,0x06,0x24,0x06,0x00,0x00,0x61,0x02,0x02,0x68,0x06,0x09,0x01,0x00,0x68,0x02, 0x00,0x00,0x20,0x82,0x25,0x09,0xe4,0x01,0x00,0x01,0x04,0x00,0x04,0x00,0x65,0x00, 0x04,0x00,0x50,0x85,0x05,0x5c,0x04,0x5a,0x20,0x05,0xff,0x00,0xff,0x00,0x61,0x02, 0x02,0x68,0xce,0x09,0x01,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x5d,0x04,0x54, 0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x5e,0x04,0x56, 0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x5f,0x04,0x58, 0x20,0x05,0xff,0x00,0xff,0x00,0x38,0xc8,0x01,0x00,0xa0,0x0a,0x05,0x02,0x05,0x02, 0x22,0x40,0x00,0x00,0x00,0x00,0x40,0x05,0x04,0x00,0x60,0x20,0x05,0x07,0x15,0x2c, 0x56,0x01,0x05,0x5c,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x03,0x15,0x2d, 0x56,0x01,0x05,0x5d,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x05,0x15,0x2e, 0x56,0x01,0x05,0x5e,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x0a,0x15,0x2f, 0x56,0x01,0x05,0x5f,0x58,0x00,0x01,0x28,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x22, 0x01,0x00,0xa0,0x0a,0x05,0x31,0x05,0x31,0x22,0x0a,0x05,0x02,0x22,0x02,0x61,0x05, 0x04,0x00,0x60,0x16,0x05,0x07,0x05,0x07,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x04,0x00,0x60,0x16,0x05,0x03,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x04,0x00,0x60,0x16,0x05,0x05,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x04,0x00,0x60,0x16,0x05,0x0a,0x05,0x0a,0x46,0x00,0x00,0x00,0x00,0x00,0x41,0x05, 0x00,0x00,0xa0,0x0a,0x45,0x12,0x24,0x31,0x00,0x0a,0x24,0x31,0x00,0x00,0x40,0x03, 0x04,0x00,0x60,0x05,0x05,0x0c,0x04,0x05,0x20,0x05,0x04,0x07,0x20,0x00,0x40,0x03, 0x04,0x00,0x60,0x05,0x05,0x0e,0x04,0x0a,0x20,0x05,0x04,0x03,0x20,0x00,0x61,0x00, 0x11,0xa8,0x7f,0x31,0x01,0x00,0x5b,0x04,0x00,0x00,0xa0,0x02,0x44,0x12,0x44,0x12, 0x02,0x02,0x04,0x31,0x04,0x31,0x40,0x03,0x0e,0xa0,0x02,0x0e,0x00,0x0c,0x40,0x02, 0x00,0x00,0xa0,0x0a,0x45,0x12,0x44,0x12,0x00,0x0a,0x04,0x11,0x00,0x00,0x40,0x02, 0x02,0xa1,0x02,0x0f,0x00,0x0e,0x38,0xa9,0x00,0x00,0xa0,0x0a,0x45,0x12,0x44,0x12, 0x00,0x40,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8,0x00,0x00,0x81,0x3d,0x40,0x02, 0x02,0x00,0x60,0x06,0x05,0x09,0x85,0x02,0x34,0x06,0x05,0x02,0x34,0x00,0x61,0x00, 0x02,0xa8,0x00,0x00,0x81,0x3f,0x41,0x00,0x00,0x00,0x60,0x05,0x25,0x11,0x04,0x29, 0x00,0x05,0x04,0x29,0x00,0x00,0x5b,0xa9,0x00,0x00,0xa0,0x02,0x04,0x03,0x04,0x02, 0x02,0x02,0x04,0x03,0x44,0x12,0x40,0x04,0x01,0x00,0x60,0x06,0x05,0x10,0x45,0x09, 0x22,0x06,0x05,0x09,0x22,0x00,0x38,0xaa,0x00,0x00,0xa0,0x0a,0x05,0x04,0x04,0x03, 0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x03,0x12,0xa8,0x27,0x11,0x01,0x00,0x40,0x02, 0x00,0x00,0x60,0x06,0x85,0x31,0x04,0x10,0x00,0x06,0x24,0x10,0x00,0x00,0x41,0xaa, 0x12,0x28,0x00,0x12,0x11,0x04,0x41,0x02,0x00,0x00,0x60,0x05,0xe5,0x01,0x84,0x31, 0x00,0x05,0x84,0x31,0x00,0x00,0x61,0x02,0x31,0xe8,0xa5,0x12,0x01,0x00,0x61,0x00, 0x69,0xa8,0xa8,0x00,0x01,0x00,0x70,0x02,0x00,0x00,0x60,0x06,0x01,0x00,0xe4,0x01, 0x00,0x46,0xc4,0x31,0x00,0x00,0x70,0x00,0x00,0x11,0x20,0x82,0x01,0x00,0xe4,0x01, 0x00,0x32,0x00,0x48,0x01,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0x84,0x32,0xc4,0x31, 0x85,0x05,0x84,0x31,0x84,0x31,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0xc4,0x31,0xc4,0x31, 0x05,0x05,0x84,0x31,0x84,0x31,0x70,0x03,0x00,0x00,0x60,0x86,0x01,0x00,0x84,0x32, 0x00,0x56,0x00,0x00,0x80,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x69,0x84,0x32, 0x00,0x05,0x08,0x00,0x08,0x00,0x61,0x03,0x00,0x00,0xa0,0x0a,0xa5,0x32,0xc4,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x01,0x60,0x85,0x05,0x60,0xe4,0x01, 0x00,0x05,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x11,0x60,0x85,0xa5,0x31,0xe4,0x01, 0x00,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x6e,0x00,0x00, 0x00,0x00,0x68,0x1e,0x00,0x00,0x41,0x03,0x20,0x22,0x76,0x69,0x11,0x60,0x6c,0x00, 0x00,0x00,0x60,0x86,0xa5,0x32,0xc4,0x31,0x00,0x05,0x08,0x00,0x08,0x00,0x49,0x00, 0x60,0xa8,0x72,0x69,0x11,0x60,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x69,0x84,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x6e,0x00,0x00, 0x00,0x00,0x28,0x1e,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0xa4,0x69, 0x00,0x01,0xa4,0x31,0x00,0x00,0x49,0x00,0x00,0x80,0x60,0x06,0x05,0x02,0xa4,0x69, 0x00,0x06,0xa4,0x31,0x00,0x00,0x61,0x01,0x69,0x68,0xa8,0x02,0x01,0x00,0x40,0x01, 0x00,0x00,0x60,0x06,0xa5,0x69,0xa4,0x69,0x00,0x06,0x04,0x60,0x00,0x00,0x40,0x01, 0x00,0x00,0x60,0x86,0xa5,0x32,0xa4,0x69,0x00,0x05,0x01,0x01,0x01,0x01,0x69,0x00, 0x00,0x00,0x60,0x86,0xa5,0x69,0xa4,0x69,0x00,0x05,0x08,0x00,0x08,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0x84,0x6e,0x00,0x00,0x00,0x00,0xc0,0x1d,0x00,0x00,0x41,0x02, 0x04,0x00,0x60,0x06,0x05,0x0e,0xa4,0x69,0x00,0x01,0x05,0x5c,0x58,0x00,0x41,0x00, 0x04,0x00,0x60,0x06,0x05,0x10,0xa4,0x69,0x00,0x01,0x05,0x5d,0x58,0x00,0x41,0x00, 0x04,0x00,0x60,0x06,0x05,0x12,0xa4,0x69,0x00,0x01,0x05,0x5e,0x58,0x00,0x41,0x00, 0x04,0x00,0x60,0x06,0x05,0x14,0xa4,0x69,0x00,0x01,0x05,0x5f,0x58,0x00,0x40,0x00, 0x00,0x00,0x60,0xa6,0xe5,0x01,0xa4,0x69,0x00,0x05,0x00,0x01,0x00,0x01,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x02,0x15,0x2c,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x05,0x15,0x2d,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x08,0x15,0x2e,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x0b,0x15,0x2f,0x56,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x0e,0x60,0x02,0x0e,0x00,0x08,0x40,0x07,0x10,0x60,0x02,0x10,0x00,0x08,0x40,0x07, 0x12,0x60,0x02,0x12,0x00,0x08,0x40,0x07,0x14,0x60,0x02,0x14,0x00,0x08,0x41,0x07, 0x04,0x00,0x60,0x06,0x05,0x03,0xe4,0x01,0x00,0x05,0x05,0x02,0x58,0x00,0x41,0x07, 0x04,0x00,0x60,0x06,0x05,0x06,0xe4,0x01,0x00,0x05,0x05,0x05,0x58,0x00,0x41,0x07, 0x04,0x00,0x60,0x06,0x05,0x09,0xe4,0x01,0x00,0x05,0x05,0x08,0x58,0x00,0x41,0x07, 0x04,0x00,0x60,0x06,0x05,0x0c,0xe4,0x01,0x00,0x05,0x05,0x0b,0x58,0x00,0x40,0x04, 0x0e,0xa0,0x02,0x0e,0x00,0x03,0x40,0x04,0x10,0xa0,0x02,0x10,0x00,0x06,0x40,0x04, 0x12,0xa0,0x02,0x12,0x00,0x09,0x40,0x04,0x14,0xa0,0x02,0x14,0x00,0x0c,0x68,0x04, 0x04,0x00,0x20,0x82,0x05,0x0e,0x05,0x0e,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04, 0x04,0x00,0x20,0x82,0x05,0x10,0x05,0x10,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04, 0x04,0x00,0x20,0x82,0x05,0x12,0x05,0x12,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04, 0x04,0x00,0x20,0x82,0x05,0x14,0x05,0x14,0x46,0x01,0x08,0x00,0x08,0x00,0x61,0x04, 0x03,0x00,0x40,0x04,0xd5,0x61,0x04,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x40,0x04,0x35,0x62,0x04,0x0f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x05, 0x03,0x00,0x40,0x04,0x95,0x62,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x40,0x04,0xf5,0x62,0x04,0x11,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06, 0x03,0x00,0x40,0x04,0x55,0x63,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x40,0x04,0xb5,0x63,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x03,0x00,0x40,0x04,0x15,0x64,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x40,0x04,0x75,0x64,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x50,0x85,0x01,0x00,0x34,0x29,0x00,0x35,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x05,0x66,0xd4,0x61,0x10,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x45,0x66,0x35,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x85,0x66,0x95,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0xc5,0x66,0xf4,0x62,0x10,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x05,0x67,0x55,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x45,0x67,0xb5,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0x85,0x67,0x15,0x64,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x02,0x00,0x90,0x09,0xc5,0x67,0x75,0x64,0x34,0x00,0x00,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x31,0x24,0x26,0x00,0x05,0x02,0x00,0x02,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x61,0x00, 0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01, 0x00,0x02,0x01,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x07,0x00,0x03,0x00,0x61,0x00,0x02,0x62,0x40,0x26,0x01,0x00,0x61,0x06, 0x00,0x80,0xa0,0x0a,0x25,0x02,0xe4,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x9b, 0x03,0x80,0x00,0x00,0x05,0x68,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x19,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x06,0xd5,0x61,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x85,0x07,0x35,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x0b,0xe5,0x61,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x85,0x0c,0x45,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x04, 0x02,0x00,0x50,0x00,0x05,0x07,0x95,0x62,0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x04, 0x02,0x00,0x50,0x00,0x45,0x07,0xf5,0x62,0x22,0x05,0x85,0x07,0x34,0x00,0x40,0x04, 0x02,0x00,0x50,0x00,0x05,0x0c,0xa5,0x62,0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x04, 0x02,0x00,0x50,0x00,0x45,0x0c,0x05,0x63,0x34,0x05,0x85,0x0c,0x34,0x00,0x61,0x00, 0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01, 0x00,0x02,0x01,0x00,0x39,0x02,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0xf5,0x61, 0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x07, 0x34,0x05,0x05,0x07,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0x05,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x25,0x02,0xe4,0x31, 0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x0f,0x00,0x05,0x00,0x61,0x00,0x02,0x62,0x58,0x26,0x01,0x00,0x40,0x07, 0x02,0x00,0x50,0x05,0x05,0x0d,0x45,0x0c,0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x07,0x55,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x0c,0x65,0x62,0x34,0x00,0x00,0x00,0x00,0x00,0x31,0xcc, 0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x85,0x07,0xf5,0x62,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x85,0x0c,0x05,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07, 0x02,0x00,0x50,0x00,0x05,0x0e,0xb5,0x62,0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x07, 0x02,0x00,0x50,0x00,0x05,0x0f,0xc5,0x62,0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x06, 0x02,0x00,0x50,0x00,0x45,0x0e,0x15,0x63,0x34,0x05,0x05,0x07,0x34,0x00,0x01,0x3c, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x07,0x01,0x00,0x50,0x05,0x05,0x02,0x25,0x0d, 0x22,0x05,0x05,0x0d,0x22,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x0f,0x25,0x63, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0x95,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0xa5,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x07,0xb5,0x63, 0x34,0x05,0x85,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x0c,0xc5,0x63, 0x34,0x05,0x85,0x0c,0x34,0x00,0x40,0x07,0x00,0x00,0x50,0x05,0x15,0x0a,0x04,0x02, 0x00,0x05,0x14,0x02,0x00,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x05,0x07,0x55,0x63, 0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x0e, 0x34,0x05,0x05,0x0e,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0c,0x65,0x63, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0f, 0x34,0x05,0x05,0x0f,0x34,0x00,0x40,0x07,0x00,0x00,0x50,0x05,0x05,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0xb5,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0xc5,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x05,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x07, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0c, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x07,0x15,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0c,0x25,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x07,0xb5,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x0c,0xc5,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0e,0x75,0x63, 0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0f,0x85,0x63, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x45,0x0e,0xd5,0x63, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x45,0x0f,0xe5,0x63, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0x55,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0x65,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x25,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x35,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x07,0x75,0x64, 0x34,0x05,0x85,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x0c,0x85,0x64, 0x34,0x05,0x85,0x0c,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x05,0x07,0x15,0x64, 0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0c,0x25,0x64, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x0e, 0x34,0x05,0x05,0x0e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0f, 0x34,0x05,0x05,0x0f,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0x75,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x50,0x05,0x45,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0x85,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x50,0x05,0x55,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x06,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x06,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x07, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0c, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x07,0xd5,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0c,0xe5,0x63, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x07,0x75,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x0c,0x85,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x50,0x00,0x05,0x0e,0x35,0x64, 0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0f,0x45,0x64, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x45,0x0e,0x95,0x64, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x45,0x0f,0xa5,0x64, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0x15,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0x25,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x65,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x75,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x07,0x35,0x65, 0x34,0x05,0x85,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x45,0x0c,0x45,0x65, 0x34,0x05,0x85,0x0c,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x00,0x05,0x07,0xd5,0x64, 0x34,0x05,0x05,0x06,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0c,0xe5,0x64, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x0e, 0x34,0x05,0x05,0x0e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0f, 0x34,0x05,0x05,0x0f,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x06,0x35,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x50,0x05,0x85,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0b,0x45,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x06,0x00,0x00,0x50,0x05,0x95,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x06,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x06,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x07, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0c, 0x34,0x05,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x07,0x95,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0c,0xa5,0x64, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0e,0xf5,0x64, 0x22,0x05,0x05,0x06,0x34,0x00,0x40,0x07,0x02,0x00,0x50,0x00,0x05,0x0f,0x05,0x65, 0x34,0x05,0x05,0x0b,0x34,0x00,0x40,0x04,0x02,0x00,0x50,0x00,0x45,0x0e,0x55,0x65, 0x34,0x05,0x05,0x07,0x34,0x00,0x40,0x04,0x02,0x00,0x50,0x00,0x45,0x0f,0x65,0x65, 0x34,0x05,0x05,0x0c,0x34,0x00,0x40,0x07,0x00,0x00,0x50,0x05,0xa5,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x40,0x07,0x00,0x00,0x50,0x05,0xb5,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x07,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x07,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x06,0x02,0x00,0x50,0x05,0x05,0x08,0x45,0x0e, 0x34,0x05,0x05,0x0e,0x34,0x00,0x40,0x06,0x02,0x00,0x50,0x05,0x05,0x02,0x45,0x0f, 0x34,0x05,0x05,0x0f,0x34,0x00,0x40,0x04,0x00,0x00,0x50,0x05,0xc5,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x40,0x04,0x00,0x00,0x50,0x05,0xd5,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x40,0x04,0x01,0x00,0x50,0x05,0x05,0x09,0x25,0x08, 0x22,0x05,0x05,0x08,0x22,0x00,0x40,0x04,0x01,0x00,0x50,0x05,0x05,0x0d,0x25,0x02, 0x22,0x05,0x05,0x02,0x22,0x00,0x40,0x02,0x00,0x00,0x50,0x05,0xe5,0x0a,0x04,0x09, 0x00,0x05,0x14,0x09,0x00,0x00,0x40,0x02,0x00,0x00,0x50,0x05,0xf5,0x0a,0x04,0x0d, 0x00,0x05,0x14,0x0d,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x05,0xe5,0x01,0x34,0x29, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x04,0x00,0x10,0x81,0x05,0x0a,0x05,0x0a, 0x58,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x04,0x00,0xa0,0x4a,0x01,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x3f,0x40,0x02,0x02,0x00,0x60,0x00,0x05,0x06,0x05,0x61, 0x34,0x01,0x04,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x06,0x65,0x61, 0x34,0x01,0x04,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x07,0xc5,0x61, 0x34,0x01,0x04,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x07,0x25,0x62, 0x34,0x01,0x04,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0b,0x15,0x61, 0x34,0x01,0x14,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0b,0x75,0x61, 0x34,0x01,0x14,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0c,0xd5,0x61, 0x34,0x01,0x14,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0c,0x35,0x62, 0x34,0x01,0x14,0x0a,0x00,0x02,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x06,0x05,0x06, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x04,0x00,0x60,0x16,0x05,0x0b,0x05,0x0b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x08,0x05,0x06, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0d,0x25,0x61, 0x34,0x01,0x24,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0d,0x85,0x61, 0x34,0x01,0x24,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0e,0xe5,0x61, 0x34,0x01,0x24,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0e,0x45,0x62, 0x34,0x01,0x24,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x08,0x04,0x06, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0x45,0x08,0x04,0x0b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x09,0x84,0x0b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x06,0x04,0x07, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x06,0x04,0x0c, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0b,0xc5,0x61, 0x34,0x01,0x44,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0b,0x25,0x62, 0x34,0x01,0x44,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x07,0x84,0x0c, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0c,0x85,0x62, 0x34,0x01,0x44,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0c,0xe5,0x62, 0x34,0x01,0x44,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0f,0x35,0x61, 0x34,0x01,0x34,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0f,0x95,0x61, 0x34,0x01,0x34,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x10,0xf5,0x61, 0x22,0x01,0x34,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x10,0x55,0x62, 0x34,0x01,0x34,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x11,0xd5,0x61, 0x34,0x01,0x54,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x11,0x35,0x62, 0x34,0x01,0x54,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x12,0x95,0x62, 0x34,0x01,0x54,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x12,0xf5,0x62, 0x22,0x01,0x54,0x0a,0x00,0x02,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x0d,0x05,0x0d, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x0b,0x05,0x0b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x0f,0x05,0x0f, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00,0x60,0x16,0x05,0x11,0x05,0x11, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x09,0x84,0x08, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x07,0x84,0x07, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x02,0x00,0x90,0x09,0x85,0x09,0x84,0x0d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x06,0x04,0x0e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x08,0x04,0x0d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x07,0x84,0x0e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x90,0x09,0x05,0x0d,0x05,0x0b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0xc5,0x09,0x84,0x0f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x06,0x04,0x10, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x08,0x04,0x0f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x07,0x84,0x10, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x0d,0x04,0x0b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x0d,0x04,0x11, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x0e,0x84,0x11, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0f,0x45,0x62, 0x34,0x01,0x64,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x10,0xa5,0x62, 0x34,0x01,0x64,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0f,0xe5,0x61, 0x34,0x01,0x64,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x10,0x05,0x63, 0x34,0x01,0x64,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x0b,0x04,0x0c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x0b,0x04,0x12, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x11,0x85,0x62, 0x34,0x01,0x84,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x11,0xe5,0x62, 0x34,0x01,0x84,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x0c,0x84,0x12, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x12,0x45,0x63, 0x34,0x01,0x84,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x12,0xa5,0x63, 0x34,0x01,0x84,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x13,0xf5,0x61, 0x22,0x01,0x74,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x13,0x55,0x62, 0x34,0x01,0x74,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x14,0xb5,0x62, 0x34,0x01,0x74,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x14,0x15,0x63, 0x34,0x01,0x74,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x15,0x95,0x62, 0x34,0x01,0x94,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x15,0xf5,0x62, 0x22,0x01,0x94,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x16,0x55,0x63, 0x34,0x01,0x94,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x16,0xb5,0x63, 0x34,0x01,0x94,0x0a,0x00,0x02,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x0f,0x05,0x0f, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x11,0x05,0x11, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x13,0x05,0x13, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00,0x60,0x16,0x05,0x15,0x05,0x15, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x0e,0x84,0x0d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x0c,0x84,0x0c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x02,0x00,0x90,0x09,0x85,0x0e,0x84,0x0f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x0b,0x04,0x10, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x0d,0x04,0x0f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x0c,0x84,0x10, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x90,0x09,0x05,0x0f,0x05,0x11, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0xc5,0x0e,0x84,0x13, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x0b,0x04,0x14, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x0d,0x04,0x13, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x0c,0x84,0x14, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x0f,0x04,0x11, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x0f,0x04,0x15, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x10,0x84,0x15, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x13,0x05,0x63, 0x34,0x01,0xa4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x14,0x65,0x63, 0x34,0x01,0xa4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x13,0xa5,0x62, 0x34,0x01,0xa4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x14,0xc5,0x63, 0x34,0x01,0xa4,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x11,0x04,0x12, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x11,0x04,0x16, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x15,0x45,0x63, 0x34,0x01,0xc4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x15,0xa5,0x63, 0x34,0x01,0xc4,0x0a,0x00,0x02,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x12,0x84,0x16, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x16,0x05,0x64, 0x34,0x01,0xc4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x16,0x65,0x64, 0x34,0x01,0xc4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x19,0x55,0x63, 0x34,0x01,0xd4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x19,0xb5,0x63, 0x34,0x01,0xd4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1a,0x15,0x64, 0x34,0x01,0xd4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x1a,0x75,0x64, 0x34,0x01,0xd4,0x0a,0x00,0x02,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x08,0x05,0x08, 0x46,0x05,0x05,0x08,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x06,0x05,0x06, 0x46,0x05,0x05,0x06,0x46,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x13,0x05,0x13, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x15,0x05,0x15, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x17,0xb5,0x62, 0x34,0x01,0xb4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x17,0x15,0x63, 0x34,0x01,0xb4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x18,0x75,0x63, 0x34,0x01,0xb4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x18,0xd5,0x63, 0x34,0x01,0xb4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1b,0x75,0x63, 0x34,0x01,0xf4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x1b,0xd5,0x63, 0x34,0x01,0xf4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1c,0x35,0x64, 0x34,0x01,0xf4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x1c,0x95,0x64, 0x34,0x01,0xf4,0x0a,0x00,0x02,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x19,0x05,0x19, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x10,0x84,0x0f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x12,0x84,0x12, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x10,0x84,0x13, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x11,0x04,0x14, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x0f,0x04,0x13, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x12,0x84,0x14, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x13,0x05,0x15, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x17,0x05,0x17, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04,0x00,0x60,0x16,0x05,0x1b,0x05,0x1b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x13,0x04,0x15, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x15,0x04,0x16, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x15,0x04,0x1a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x16,0x84,0x1a, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1a,0x45,0x06, 0x54,0x01,0x45,0x08,0x54,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x0d,0x05,0x0d, 0x46,0x05,0x05,0x0d,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x0b,0x05,0x0b, 0x46,0x05,0x05,0x0b,0x46,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0x05,0x14,0x84,0x13, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0xc5,0x0f,0x04,0x17, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x10,0x84,0x17, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x11,0x04,0x18, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x12,0x84,0x18, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x13,0x04,0x1b, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x17,0x65,0x63, 0x34,0x01,0xe4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x17,0xc5,0x63, 0x34,0x01,0xe4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x18,0x25,0x64, 0x34,0x01,0xe4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x18,0x85,0x64, 0x34,0x01,0xe4,0x0a,0x00,0x02,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1b,0x85,0x1a, 0x34,0x06,0x05,0x1a,0x34,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x02,0x05,0x06, 0x54,0x01,0x05,0x08,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x20,0xc5,0x06, 0x54,0x01,0xc5,0x08,0x54,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x15,0x04,0x1c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x17,0x05,0x17, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x01,0x00,0x60,0x06,0x05,0x1c,0x45,0x1b, 0x22,0x06,0x05,0x1b,0x22,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1d,0x85,0x06, 0x54,0x01,0x85,0x08,0x54,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x0f,0x05,0x0f, 0x46,0x05,0x05,0x0f,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x11,0x05,0x11, 0x46,0x05,0x05,0x11,0x46,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x0a,0x85,0x02, 0x34,0x06,0x05,0x02,0x34,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x06,0x85,0x0b, 0x54,0x01,0x85,0x0d,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x08,0xc5,0x0b, 0x54,0x01,0xc5,0x0d,0x54,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x02,0x85,0x20, 0x34,0x06,0x05,0x20,0x34,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x16,0x84,0x16, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0x90,0x09,0x85,0x15,0x04,0x18, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x16,0x84,0x1c, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x25,0x18,0x04,0x1c, 0x00,0x06,0x24,0x1c,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1c,0x45,0x0b, 0x54,0x01,0x45,0x0d,0x54,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x13,0x04,0x17, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x07,0x85,0x06, 0x34,0x06,0x05,0x06,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x09,0x85,0x08, 0x34,0x06,0x05,0x08,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x17,0x45,0x0a, 0x22,0x06,0x05,0x0a,0x22,0x00,0x40,0x07,0x01,0x00,0x60,0x06,0x05,0x0a,0x45,0x02, 0x22,0x06,0x05,0x02,0x22,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1e,0x85,0x1d, 0x34,0x06,0x05,0x1d,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x1d,0x85,0x1c, 0x34,0x06,0x05,0x1c,0x34,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1c,0x45,0x11, 0x54,0x01,0x45,0x0f,0x54,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x13,0x04,0x19, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x14,0x84,0x19, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x14,0x84,0x1b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x14,0x84,0x17, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x16,0x84,0x18, 0x20,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x02,0x45,0x07, 0x22,0x06,0x05,0x07,0x22,0x00,0x40,0x07,0x00,0x00,0x60,0x06,0x65,0x18,0x04,0x0a, 0x00,0x06,0x24,0x0a,0x00,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x0a,0x45,0x09, 0x22,0x06,0x05,0x09,0x22,0x00,0x40,0x07,0x02,0x00,0x60,0x06,0x05,0x06,0x85,0x1c, 0x34,0x06,0x05,0x1c,0x34,0x00,0x41,0x06,0x05,0x00,0x50,0x05,0x05,0x13,0x05,0x13, 0x46,0x05,0x05,0x13,0x46,0x00,0x41,0x06,0x05,0x00,0x50,0x05,0x05,0x15,0x05,0x15, 0x46,0x05,0x05,0x15,0x46,0x00,0x40,0x06,0x00,0x00,0x60,0x06,0xc5,0x18,0x04,0x02, 0x00,0x06,0x24,0x02,0x00,0x00,0x40,0x05,0x00,0x00,0x60,0x06,0xe5,0x18,0x04,0x0a, 0x00,0x06,0x24,0x0a,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x02,0x85,0x11, 0x54,0x01,0x85,0x0f,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x0a,0xc5,0x11, 0x54,0x01,0xc5,0x0f,0x54,0x00,0x40,0x07,0x01,0x00,0x60,0x06,0x05,0x07,0x45,0x06, 0x22,0x06,0x05,0x06,0x22,0x00,0x40,0x00,0x18,0xa8,0x12,0x17,0x11,0x17,0x40,0x04, 0x02,0x00,0x60,0x06,0x05,0x08,0x85,0x02,0x34,0x06,0x05,0x02,0x34,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x17,0x05,0x0b,0x54,0x01,0x05,0x0d,0x54,0x00,0x40,0x05, 0x02,0x00,0x60,0x06,0x05,0x0b,0x85,0x0a,0x34,0x06,0x05,0x0a,0x34,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0x25,0x19,0x04,0x07,0x00,0x06,0x24,0x07,0x00,0x00,0x40,0x07, 0x03,0x00,0x60,0x01,0x05,0x07,0x45,0x15,0x54,0x01,0x45,0x13,0x54,0x00,0x40,0x05, 0x01,0x00,0x60,0x06,0x05,0x09,0x45,0x08,0x22,0x06,0x05,0x08,0x22,0x00,0x40,0x04, 0x01,0x00,0x60,0x06,0x05,0x0c,0x45,0x0b,0x22,0x06,0x05,0x0b,0x22,0x00,0x40,0x03, 0x02,0x00,0x60,0x06,0x05,0x02,0x85,0x07,0x34,0x06,0x05,0x07,0x34,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x0d,0x05,0x15,0x54,0x01,0x05,0x13,0x54,0x00,0x40,0x07, 0x02,0x00,0x60,0x06,0x05,0x1a,0x85,0x17,0x34,0x06,0x05,0x17,0x34,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0x45,0x19,0x04,0x09,0x00,0x06,0x24,0x09,0x00,0x00,0x40,0x05, 0x00,0x00,0x60,0x06,0x65,0x19,0x04,0x0c,0x00,0x06,0x24,0x0c,0x00,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x17,0x05,0x11,0x54,0x01,0x05,0x0f,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x09,0x85,0x15,0x54,0x01,0x85,0x13,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x0c,0xc5,0x15,0x54,0x01,0xc5,0x13,0x54,0x00,0x40,0x07, 0x01,0x00,0x60,0x06,0x05,0x08,0x45,0x02,0x22,0x06,0x05,0x02,0x22,0x00,0x38,0x9d, 0x00,0x00,0xa0,0x4a,0x05,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x20,0x41,0x40,0x07, 0x02,0x00,0x60,0x06,0x05,0x0e,0x85,0x0d,0x34,0x06,0x05,0x0d,0x34,0x00,0x40,0x07, 0x01,0x00,0x60,0x06,0x05,0x1b,0x45,0x1a,0x22,0x06,0x05,0x1a,0x22,0x00,0x40,0x05, 0x02,0x00,0x60,0x06,0x05,0x0a,0x85,0x09,0x34,0x06,0x05,0x09,0x34,0x00,0x40,0x05, 0x02,0x00,0x60,0x06,0x05,0x0d,0x85,0x0c,0x34,0x06,0x05,0x0c,0x34,0x00,0x40,0x07, 0x02,0x00,0x60,0x06,0x05,0x1a,0x85,0x17,0x34,0x06,0x05,0x17,0x34,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x1f,0x45,0x1e,0x22,0x06,0x05,0x1e,0x22,0x00,0x40,0x06, 0x01,0x00,0x60,0x06,0x05,0x06,0x45,0x0e,0x22,0x06,0x05,0x0e,0x22,0x00,0x40,0x06, 0x00,0x00,0x60,0x06,0x85,0x18,0x04,0x1b,0x00,0x06,0x24,0x1b,0x00,0x00,0x40,0x06, 0x01,0x00,0x60,0x06,0x05,0x0b,0x45,0x0a,0x22,0x06,0x05,0x0a,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x1e,0x45,0x1d,0x22,0x06,0x05,0x1d,0x22,0x00,0x40,0x07, 0x01,0x00,0x60,0x06,0x05,0x0e,0x45,0x0d,0x22,0x06,0x05,0x0d,0x22,0x00,0x40,0x07, 0x01,0x00,0x60,0x06,0x05,0x1b,0x45,0x1a,0x22,0x06,0x05,0x1a,0x22,0x00,0x41,0x2d, 0x00,0x00,0xa0,0x0a,0xe5,0x01,0xe4,0x01,0x00,0x0a,0x04,0x02,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xa5,0x19,0x04,0x08,0x00,0x06,0x24,0x08,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0x45,0x18,0x04,0x1f,0x00,0x06,0x24,0x1f,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0x85,0x19,0x04,0x06,0x00,0x06,0x24,0x06,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0xc5,0x19,0x04,0x0b,0x00,0x06,0x24,0x0b,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0xa5,0x18,0x04,0x1e,0x00,0x06,0x24,0x1e,0x00,0x00,0x40,0x07, 0x00,0x00,0x60,0x06,0xe5,0x19,0x04,0x0e,0x00,0x06,0x24,0x0e,0x00,0x00,0x40,0x07, 0x19,0xa8,0x12,0x1b,0x11,0x1b,0x38,0xfe,0x04,0x00,0xa0,0x0a,0x05,0x0f,0xe4,0x01, 0x00,0x10,0x00,0x00,0x00,0x00,0x68,0x01,0x04,0x00,0x20,0x82,0x05,0x18,0x05,0x18, 0x46,0x01,0x04,0x00,0x04,0x00,0x38,0x4f,0x04,0x00,0xa0,0x0a,0x05,0x0a,0xe4,0x01, 0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x06,0x60,0x06,0x18,0x00,0x00,0x41,0x9e, 0x08,0x20,0x00,0x06,0x00,0x0f,0x41,0x00,0x06,0xe0,0x00,0x06,0x00,0x40,0x38,0xa0, 0x04,0x00,0xa0,0x2a,0x05,0x08,0x05,0x08,0x46,0x30,0x00,0x00,0x00,0x00,0x41,0x9f, 0x06,0x20,0x00,0x06,0x00,0x0a,0x61,0x00,0x0e,0xa8,0x00,0x00,0x81,0x40,0x38,0xa1, 0x04,0x00,0xa0,0x2a,0x05,0x06,0x05,0x06,0x46,0x30,0x00,0x00,0x00,0x00,0x01,0x21, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x20,0x0c,0x20,0x00,0x08,0x00,0x06,0x61,0x2c, 0x04,0x00,0xa0,0x00,0x05,0x20,0x95,0x04,0x56,0x00,0x00,0x00,0x00,0x00,0x48,0x02, 0x0c,0x20,0x00,0x0c,0x10,0x0e,0x61,0x00,0x04,0x00,0xa0,0x00,0x05,0x1e,0x95,0x03, 0x56,0x00,0x00,0x00,0x00,0x00,0x38,0xa3,0x03,0x00,0xa0,0x0a,0x05,0x02,0x05,0x0c, 0x46,0x10,0x00,0x00,0x00,0x00,0x38,0x44,0x03,0x00,0xa0,0x0a,0x05,0x0b,0x05,0x0c, 0x46,0x10,0x00,0x00,0x00,0x00,0x61,0x23,0x11,0x21,0x64,0x02,0x00,0x00,0x38,0x45, 0x03,0x00,0xa0,0x0a,0x05,0x17,0x05,0x0d,0x46,0x10,0x00,0x00,0x00,0x00,0x38,0x46, 0x03,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x0c,0x46,0x10,0x00,0x00,0x00,0x00,0x38,0x97, 0x03,0x00,0xa0,0x0a,0x05,0x02,0x05,0x0d,0x46,0x10,0x00,0x00,0x00,0x00,0x38,0x48, 0x03,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x0d,0x46,0x10,0x00,0x00,0x00,0x00,0x41,0x24, 0x03,0x00,0xa0,0x0a,0x26,0x15,0x05,0x08,0x46,0x0a,0x05,0x0b,0x46,0x00,0x38,0x49, 0x03,0x00,0xa0,0x0a,0x05,0x10,0x05,0x0c,0x46,0x10,0x00,0x00,0x00,0x00,0x41,0x25, 0x03,0x00,0xa0,0x0a,0x26,0x18,0x05,0x09,0x46,0x0a,0x05,0x17,0x46,0x00,0x38,0x4a, 0x03,0x00,0xa0,0x0a,0x05,0x0a,0x05,0x0d,0x46,0x10,0x00,0x00,0x00,0x00,0x41,0x26, 0x03,0x00,0xa0,0x0a,0x06,0x15,0x05,0x08,0x46,0x0a,0x05,0x0e,0x46,0x00,0x41,0x27, 0x03,0x00,0xa0,0x0a,0x06,0x18,0x05,0x09,0x46,0x0a,0x05,0x02,0x46,0x00,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x0e,0x85,0x03,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x04,0x00,0x50,0x00,0x05,0x02,0x85,0x04,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x28, 0x13,0x21,0x64,0x0f,0x00,0x00,0x38,0xfc,0x03,0x00,0xa0,0x0a,0x05,0x0b,0x05,0x0d, 0x46,0x10,0x00,0x00,0x00,0x00,0x61,0x29,0x11,0x21,0x04,0x10,0x00,0x00,0x61,0x2a, 0x13,0x21,0x04,0x0a,0x00,0x00,0x38,0xbd,0x03,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x0c, 0x46,0x10,0x00,0x00,0x00,0x00,0x40,0x05,0x04,0x00,0x60,0x00,0x05,0x08,0xa5,0x03, 0x56,0x05,0x05,0x0e,0x58,0x00,0x38,0xbe,0x03,0x00,0xa0,0x0a,0x05,0x10,0x05,0x0d, 0x46,0x10,0x00,0x00,0x00,0x00,0x40,0x05,0x04,0x00,0x60,0x00,0x05,0x22,0xa5,0x04, 0x56,0x05,0x05,0x02,0x58,0x00,0x38,0xbf,0x03,0x00,0xa0,0x0a,0x05,0x0a,0x05,0x0c, 0x46,0x10,0x00,0x00,0x00,0x00,0x41,0x2d,0x03,0x00,0xa0,0x0a,0x26,0x1a,0x05,0x06, 0x46,0x0a,0x05,0x0f,0x46,0x00,0x40,0x03,0x04,0x00,0x60,0x00,0x05,0x08,0x15,0x03, 0x56,0x06,0x05,0x08,0x46,0x00,0x41,0x2e,0x03,0x00,0xa0,0x0a,0x26,0x1c,0x05,0x07, 0x46,0x0a,0x05,0x10,0x46,0x00,0x40,0x04,0x04,0x00,0x60,0x00,0x05,0x22,0x15,0x04, 0x56,0x06,0x05,0x22,0x46,0x00,0x41,0x2f,0x03,0x00,0xa0,0x0a,0x06,0x1a,0x05,0x06, 0x46,0x0a,0x05,0x0a,0x46,0x00,0x41,0x2c,0x03,0x00,0xa0,0x0a,0x06,0x1c,0x05,0x07, 0x46,0x0a,0x05,0x0b,0x46,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x0a,0x05,0x03, 0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x0b,0x05,0x04, 0x56,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x0e,0x25,0x03, 0x56,0x05,0x05,0x0a,0x58,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x24,0x25,0x04, 0x56,0x05,0x05,0x0b,0x58,0x00,0x40,0x07,0x04,0x00,0x60,0x00,0x05,0x08,0x15,0x04, 0x56,0x06,0x05,0x08,0x46,0x00,0x40,0x07,0x04,0x00,0x60,0x00,0x05,0x22,0x15,0x05, 0x56,0x06,0x05,0x22,0x46,0x00,0x40,0x04,0x04,0x00,0x60,0x00,0x05,0x0e,0x05,0x04, 0x56,0x06,0x05,0x0e,0x46,0x00,0x40,0x04,0x04,0x00,0x60,0x00,0x05,0x24,0x05,0x05, 0x56,0x06,0x05,0x24,0x46,0x00,0x61,0x04,0x0c,0xa0,0x07,0x08,0x00,0x00,0x61,0x04, 0x06,0xa0,0x07,0x22,0x00,0x00,0x40,0x04,0x04,0x00,0x60,0x00,0x05,0x0e,0x25,0x04, 0x56,0x06,0x05,0x0e,0x46,0x00,0x40,0x04,0x04,0x00,0x60,0x00,0x05,0x24,0x25,0x05, 0x56,0x06,0x05,0x24,0x46,0x00,0x41,0x04,0x20,0x20,0x01,0x15,0x00,0x0c,0x41,0x04, 0x18,0x20,0x00,0x18,0x00,0x06,0x61,0x04,0x08,0xa0,0x07,0x0e,0x00,0x00,0x61,0x04, 0x22,0xa0,0x07,0x24,0x00,0x00,0x5b,0x00,0x04,0x00,0xa8,0x0a,0x00,0x20,0x01,0x20, 0x0a,0x0a,0x05,0x1e,0x05,0x11,0x5b,0x04,0x13,0xa0,0x00,0x18,0x13,0x20,0x5b,0x04, 0x04,0x00,0xa8,0x0a,0x00,0x20,0x01,0x20,0x0a,0x0a,0x05,0x08,0x05,0x1a,0x5b,0x02, 0x1c,0xa0,0x00,0x13,0x1c,0x22,0x40,0x00,0x1a,0xe0,0x02,0x20,0x00,0x3f,0x40,0x02, 0x1c,0xe0,0x00,0x1c,0x00,0x3f,0x61,0x02,0x06,0xe0,0x05,0x1a,0x00,0x00,0x61,0x02, 0x0a,0xe0,0x05,0x1c,0x00,0x00,0x61,0x02,0x04,0x00,0x40,0x04,0x05,0x68,0x04,0x06, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x04,0x00,0x40,0x04,0x85,0x68,0x04,0x0a, 0x30,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x61,0x00, 0x02,0x62,0x40,0x26,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0x64,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x90,0x03,0x80,0x00,0x00,0x05,0x66,0x04,0x02, 0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x30,0x02,0x68,0xca,0x26,0x21,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x31,0xa1, 0x03,0x80,0x00,0x00,0x05,0x68,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x31, 0x00,0xe8,0x01,0x00,0x11,0x00,0x61,0x3b,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x61,0x00, 0x02,0x62,0x40,0x26,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0x64,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x31,0xa0, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x14,0x66,0x00,0x00,0x69,0x30, 0x02,0x68,0xca,0x26,0x21,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00, 0x00,0x00,0x07,0x00,0x03,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01, 0x00,0x02,0x01,0x80,0x0a,0x02,0x01,0x2b,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xa1, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x0c,0x68,0x00,0x00,0x31,0x04, 0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x61,0x01, 0x03,0x00,0xa0,0x05,0x05,0x03,0x25,0x60,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0xa0,0x05,0x01,0x20,0x05,0x69,0x46,0x00,0x00,0x00,0x00,0x00,0x38,0xa3, 0x03,0x00,0xa0,0x0a,0x05,0x03,0x05,0x03,0x46,0x10,0x00,0x00,0x00,0x00,0x41,0x00, 0x03,0x00,0xa0,0x8a,0x01,0x20,0x01,0x20,0x46,0x0a,0x08,0x00,0x80,0x3f,0x41,0x23, 0x02,0x61,0x01,0x20,0x00,0x03,0x61,0x01,0x04,0xe1,0x05,0x02,0x00,0x00,0x61,0x01, 0x03,0x00,0x90,0x09,0x05,0x69,0x04,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x2d,0x00, 0x05,0x00,0x00,0x00,0x00,0x00,0xc4,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01, 0x02,0x68,0x72,0x32,0xf1,0x01,0x6c,0x00,0x00,0x00,0x60,0x86,0xe5,0x01,0xa4,0x69, 0x00,0x05,0x1f,0x00,0x1f,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x32,0x04,0x02, 0x00,0x06,0xa4,0x32,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x69,0xe4,0x01, 0x00,0x06,0xa4,0x69,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06,0xa5,0x32,0xa4,0x32, 0x00,0x06,0x04,0x02,0x00,0x00,0x61,0x00,0x03,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x02, 0x00,0x00,0xa0,0x02,0x45,0x02,0xa4,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04, 0x00,0x00,0x60,0x06,0xa5,0x69,0xa4,0x69,0x00,0x06,0xe4,0x01,0x00,0x00,0x61,0x02, 0x00,0x00,0x60,0x0a,0x85,0x69,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44, 0x00,0x00,0xa0,0x0a,0x45,0x03,0x44,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x60,0x06,0x85,0x69,0xa4,0x32,0x00,0x06,0x84,0x69,0x00,0x02,0x5b,0xd4, 0x00,0x00,0xa0,0x02,0x44,0x03,0x44,0x03,0x02,0x02,0x24,0x03,0x44,0x03,0x61,0x02, 0x01,0x00,0xa0,0x02,0x85,0x02,0x85,0x69,0x22,0x00,0x00,0x00,0x00,0x00,0x67,0x00, 0x02,0xa8,0x52,0x02,0x11,0x01,0x61,0x02,0x00,0x00,0x60,0x0a,0x25,0x02,0xa4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00,0xa0,0x0a,0x05,0x04,0x44,0x03, 0x00,0x0a,0xa4,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x02,0xa4,0x69, 0x00,0x06,0x24,0x02,0x00,0x02,0x61,0x02,0x05,0xe8,0x05,0x04,0x01,0x00,0x61,0x02, 0x03,0x68,0x26,0x02,0x01,0x00,0x61,0x02,0x05,0x68,0x66,0x05,0x01,0x00,0x61,0x00, 0x00,0x80,0x90,0x49,0x05,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02, 0x00,0x00,0xa0,0x02,0x44,0x02,0xa4,0x02,0x82,0x02,0x24,0x05,0x44,0x02,0x5b,0x04, 0x00,0x00,0xa0,0x02,0x84,0x02,0x04,0x03,0x82,0x02,0x24,0x05,0x84,0x02,0x40,0x01, 0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02,0x00,0x0a,0x84,0x02,0x00,0x00,0x41,0x01, 0x00,0x00,0xa0,0x0a,0x45,0x03,0x44,0x03,0x00,0x0a,0x44,0x02,0x00,0x00,0x61,0x01, 0x06,0xe8,0x45,0x03,0x01,0x00,0x40,0x01,0x06,0xa8,0x02,0x06,0x11,0x05,0x41,0x01, 0x20,0x22,0x36,0x06,0x11,0x32,0x49,0x00,0x07,0xa8,0x32,0x06,0x11,0x32,0x40,0x00, 0x06,0xa8,0x02,0x06,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x69,0xa4,0x69, 0x00,0x06,0x04,0x07,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0xa4,0x69, 0x00,0x42,0xa4,0x32,0x00,0x00,0x62,0x00,0x00,0x01,0x60,0x85,0x25,0x06,0x04,0x04, 0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x06,0xa8,0x12,0x06,0x11,0x06,0x67,0x01, 0x69,0xa8,0xaa,0x06,0x11,0x02,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80, 0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x84,0x6e, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80, 0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80, 0x00,0x01,0x30,0x00,0x30,0x00,0x61,0x01,0x02,0x60,0x06,0x6c,0x00,0x00,0x38,0x95, 0x04,0x00,0xa0,0x0a,0x05,0x0e,0x05,0x02,0x46,0x10,0x00,0x00,0x00,0x00,0x61,0x00, 0x01,0xa8,0x88,0x00,0xc1,0xb4,0x61,0x00,0x08,0x60,0x06,0x6a,0x00,0x00,0x5b,0xa5, 0x20,0x2a,0x89,0x0e,0x0e,0x01,0x61,0x00,0x04,0xe0,0x05,0x02,0x00,0x00,0x61,0x03, 0x0a,0xe0,0x05,0x08,0x00,0x00,0x41,0x00,0x10,0x60,0x01,0x20,0x00,0x08,0x40,0x03, 0x04,0xa0,0x02,0x6c,0x20,0x04,0x40,0x03,0x0a,0xa0,0x02,0x6a,0x20,0x0a,0x61,0x03, 0x12,0xe0,0x05,0x10,0x00,0x00,0x61,0x03,0x06,0x60,0x06,0x04,0x00,0x00,0x61,0x03, 0x0c,0x60,0x06,0x0a,0x00,0x00,0x61,0x03,0x14,0x60,0x06,0x12,0x00,0x00,0x5b,0x01, 0x02,0xa0,0x02,0x08,0x02,0x14,0x5b,0x03,0x06,0xa0,0x02,0x0c,0x06,0x14,0x40,0x01, 0x02,0x20,0x00,0x02,0x00,0x06,0x61,0x00,0x00,0x80,0x90,0x49,0xe5,0x01,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x41,0x02,0x0e,0x60,0x01,0x20,0x00,0x02,0x61,0x01, 0x04,0xe0,0x05,0x0e,0x00,0x00,0x40,0x01,0x04,0xa0,0x02,0x04,0x00,0x12,0x41,0x01, 0x20,0x24,0x06,0x04,0x60,0x6c,0x49,0x00,0x0a,0xa1,0x02,0x04,0x00,0x6c,0x41,0x00, 0x20,0x24,0x06,0x05,0x60,0x6d,0x49,0x00,0x0b,0xa1,0x02,0x05,0x00,0x6d,0x40,0x01, 0x6a,0xa0,0x02,0x6a,0x20,0x0a,0x70,0x01,0x04,0x00,0x60,0x02,0x01,0x00,0x05,0x6a, 0x46,0x42,0x05,0x6c,0x46,0x00,0x62,0x07,0x04,0x01,0x60,0x85,0x05,0x08,0xe4,0x01, 0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x6a,0xa0,0x02,0x04,0x00,0x08,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01, 0x05,0x00,0x00,0x00,0x00,0x00,0x44,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x61,0x01, 0x02,0x68,0x6e,0x32,0x01,0x00,0x61,0x00,0x02,0xa8,0x98,0x00,0xc1,0xb4,0x61,0x02, 0x6e,0xe8,0x05,0x02,0x01,0x00,0x38,0x46,0x00,0x00,0xa0,0x0a,0x45,0x02,0x04,0x02, 0x00,0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x6e,0xa8,0x6a,0x32,0x31,0x6e,0x5b,0xb6, 0x00,0x00,0xa0,0x02,0x44,0x02,0x44,0x02,0x02,0x02,0x64,0x02,0x44,0x02,0x61,0x02, 0x01,0x00,0xa0,0x02,0x85,0x02,0x05,0x6e,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x01, 0x00,0x00,0x60,0x0a,0xe5,0x01,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03, 0x00,0x00,0xa0,0x0a,0x05,0x03,0x44,0x02,0x00,0x0a,0xa4,0x02,0x00,0x00,0x40,0x02, 0x00,0x00,0x60,0x06,0xe5,0x01,0x24,0x6e,0x00,0x06,0xe4,0x01,0x00,0x02,0x61,0x02, 0x04,0xe8,0x05,0x03,0x01,0x00,0x61,0x02,0x00,0x00,0xa0,0x02,0x25,0x02,0xe4,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x04,0x68,0x66,0x04,0x01,0x00,0x5b,0x01, 0x00,0x00,0xa0,0x02,0x04,0x02,0xa4,0x02,0x82,0x02,0x24,0x04,0x04,0x02,0x5b,0x03, 0x00,0x00,0xa0,0x02,0x84,0x02,0x24,0x02,0x82,0x02,0x24,0x04,0x84,0x02,0x40,0x01, 0x02,0x28,0x08,0x02,0x11,0x02,0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02, 0x00,0x0a,0x04,0x02,0x00,0x00,0x61,0x01,0x05,0xe8,0x45,0x02,0x01,0x00,0x40,0x01, 0x05,0xa8,0x02,0x05,0x11,0x04,0x41,0x01,0x20,0x22,0x4e,0x05,0x11,0x32,0x49,0x00, 0x05,0xa8,0x4a,0x05,0x11,0x32,0x40,0x01,0x6e,0xa8,0xca,0x6e,0x31,0x05,0x70,0x01, 0x00,0x00,0x20,0x02,0x01,0x00,0x24,0x6e,0x00,0x52,0xc4,0x32,0x00,0x00,0x61,0x00, 0x00,0x01,0xa0,0x4a,0xc5,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x60,0x06,0x25,0x6e,0x24,0x6e,0x00,0x06,0xc4,0x32,0x00,0x02,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01, 0x05,0x00,0x00,0x00,0x00,0x00,0xc4,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x03, 0x00,0x00,0x4d,0x63,0x50,0x31,0x36,0x5f,0x34,0x4d,0x56,0x5f,0x32,0x53,0x55,0x52, 0x46,0x5f,0x57,0x49,0x54,0x48,0x5f,0x43,0x48,0x52,0x00,0x6e,0x75,0x6c,0x6c,0x00, 0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f, 0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64, 0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65, 0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64, 0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67, 0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32, 0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53, 0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56, 0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56, 0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56, 0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56, 0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56, 0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56, 0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56, 0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56, 0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56, 0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56, 0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56, 0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56, 0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56, 0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56, 0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56, 0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56, 0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56, 0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30, 0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35, 0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00, 0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56, 0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31, 0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31, 0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31, 0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00, 0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56, 0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56,0x31, 0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31,0x33, 0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33,0x37, 0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30,0x00, 0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00,0x56, 0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56,0x31, 0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31,0x35, 0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35,0x33, 0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36,0x00, 0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00,0x56, 0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56,0x31, 0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31,0x36, 0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36,0x39, 0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32,0x00, 0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00,0x56, 0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56,0x31, 0x37,0x39,0x00,0x56,0x31,0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31,0x38, 0x32,0x00,0x56,0x31,0x38,0x33,0x00,0x56,0x31,0x38,0x34,0x00,0x56,0x31,0x38,0x35, 0x00,0x56,0x31,0x38,0x36,0x00,0x56,0x31,0x38,0x37,0x00,0x56,0x31,0x38,0x38,0x00, 0x56,0x31,0x38,0x39,0x00,0x56,0x31,0x39,0x30,0x00,0x56,0x31,0x39,0x31,0x00,0x56, 0x31,0x39,0x32,0x00,0x56,0x31,0x39,0x33,0x00,0x56,0x31,0x39,0x34,0x00,0x56,0x31, 0x39,0x35,0x00,0x56,0x31,0x39,0x36,0x00,0x56,0x31,0x39,0x37,0x00,0x56,0x31,0x39, 0x38,0x00,0x56,0x31,0x39,0x39,0x00,0x56,0x32,0x30,0x30,0x00,0x56,0x32,0x30,0x31, 0x00,0x56,0x32,0x30,0x32,0x00,0x56,0x32,0x30,0x33,0x00,0x56,0x32,0x30,0x34,0x00, 0x56,0x32,0x30,0x35,0x00,0x56,0x32,0x30,0x36,0x00,0x56,0x32,0x30,0x37,0x00,0x56, 0x32,0x30,0x38,0x00,0x56,0x32,0x30,0x39,0x00,0x56,0x32,0x31,0x30,0x00,0x56,0x32, 0x31,0x31,0x00,0x56,0x32,0x31,0x32,0x00,0x56,0x32,0x31,0x33,0x00,0x56,0x32,0x31, 0x34,0x00,0x56,0x32,0x31,0x35,0x00,0x56,0x32,0x31,0x36,0x00,0x56,0x32,0x31,0x37, 0x00,0x56,0x32,0x31,0x38,0x00,0x56,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x30,0x00, 0x56,0x32,0x32,0x31,0x00,0x56,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x33,0x00,0x56, 0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x36,0x00,0x56,0x32, 0x32,0x37,0x00,0x56,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x39,0x00,0x56,0x32,0x33, 0x30,0x00,0x56,0x32,0x33,0x31,0x00,0x56,0x32,0x33,0x32,0x00,0x56,0x32,0x33,0x33, 0x00,0x56,0x32,0x33,0x34,0x00,0x56,0x32,0x33,0x35,0x00,0x56,0x32,0x33,0x36,0x00, 0x56,0x32,0x33,0x37,0x00,0x56,0x32,0x33,0x38,0x00,0x56,0x32,0x33,0x39,0x00,0x56, 0x32,0x34,0x30,0x00,0x56,0x32,0x34,0x31,0x00,0x56,0x32,0x34,0x32,0x00,0x56,0x32, 0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x00,0x56,0x32,0x34,0x35,0x00,0x56,0x32,0x34, 0x36,0x00,0x56,0x32,0x34,0x37,0x00,0x56,0x32,0x34,0x38,0x00,0x56,0x32,0x34,0x39, 0x00,0x56,0x32,0x35,0x30,0x00,0x56,0x32,0x35,0x31,0x00,0x56,0x32,0x35,0x32,0x00, 0x56,0x32,0x35,0x33,0x00,0x56,0x32,0x35,0x34,0x00,0x56,0x32,0x35,0x35,0x00,0x56, 0x32,0x35,0x36,0x00,0x56,0x32,0x35,0x37,0x00,0x56,0x32,0x35,0x38,0x00,0x56,0x32, 0x35,0x39,0x00,0x56,0x32,0x36,0x30,0x00,0x56,0x32,0x36,0x31,0x00,0x56,0x32,0x36, 0x32,0x00,0x56,0x32,0x36,0x33,0x00,0x56,0x32,0x36,0x34,0x00,0x56,0x32,0x36,0x35, 0x00,0x56,0x32,0x36,0x36,0x00,0x56,0x32,0x36,0x37,0x00,0x56,0x32,0x36,0x38,0x00, 0x56,0x32,0x36,0x39,0x00,0x56,0x32,0x37,0x30,0x00,0x56,0x32,0x37,0x31,0x00,0x56, 0x32,0x37,0x32,0x00,0x56,0x32,0x37,0x33,0x00,0x56,0x32,0x37,0x34,0x00,0x56,0x32, 0x37,0x35,0x00,0x56,0x32,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x00,0x56,0x32,0x37, 0x38,0x00,0x56,0x32,0x37,0x39,0x00,0x56,0x32,0x38,0x30,0x00,0x56,0x32,0x38,0x31, 0x00,0x56,0x32,0x38,0x32,0x00,0x56,0x32,0x38,0x33,0x00,0x56,0x32,0x38,0x34,0x00, 0x56,0x32,0x38,0x35,0x00,0x56,0x32,0x38,0x36,0x00,0x56,0x32,0x38,0x37,0x00,0x56, 0x32,0x38,0x38,0x00,0x56,0x32,0x38,0x39,0x00,0x56,0x32,0x39,0x30,0x00,0x56,0x32, 0x39,0x31,0x00,0x56,0x32,0x39,0x32,0x00,0x56,0x32,0x39,0x33,0x00,0x56,0x32,0x39, 0x34,0x00,0x56,0x32,0x39,0x35,0x00,0x56,0x32,0x39,0x36,0x00,0x56,0x32,0x39,0x37, 0x00,0x56,0x32,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x00,0x56,0x33,0x30,0x30,0x00, 0x56,0x33,0x30,0x31,0x00,0x56,0x33,0x30,0x32,0x00,0x56,0x33,0x30,0x33,0x00,0x56, 0x33,0x30,0x34,0x00,0x56,0x33,0x30,0x35,0x00,0x56,0x33,0x30,0x36,0x00,0x56,0x33, 0x30,0x37,0x00,0x56,0x33,0x30,0x38,0x00,0x56,0x33,0x30,0x39,0x00,0x56,0x33,0x31, 0x30,0x00,0x56,0x33,0x31,0x31,0x00,0x56,0x33,0x31,0x32,0x00,0x56,0x33,0x31,0x33, 0x00,0x56,0x33,0x31,0x34,0x00,0x56,0x33,0x31,0x35,0x00,0x56,0x33,0x31,0x36,0x00, 0x56,0x33,0x31,0x37,0x00,0x56,0x33,0x31,0x38,0x00,0x56,0x33,0x31,0x39,0x00,0x56, 0x33,0x32,0x30,0x00,0x56,0x33,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x00,0x56,0x33, 0x32,0x33,0x00,0x56,0x33,0x32,0x34,0x00,0x56,0x33,0x32,0x35,0x00,0x56,0x33,0x32, 0x36,0x00,0x56,0x33,0x32,0x37,0x00,0x56,0x33,0x32,0x38,0x00,0x56,0x33,0x32,0x39, 0x00,0x56,0x33,0x33,0x30,0x00,0x56,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x32,0x00, 0x56,0x33,0x33,0x33,0x00,0x56,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x35,0x00,0x56, 0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x38,0x00,0x56,0x33, 0x33,0x39,0x00,0x56,0x33,0x34,0x30,0x00,0x56,0x33,0x34,0x31,0x00,0x56,0x33,0x34, 0x32,0x00,0x56,0x33,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x00,0x56,0x33,0x34,0x35, 0x00,0x56,0x33,0x34,0x36,0x00,0x56,0x33,0x34,0x37,0x00,0x56,0x33,0x34,0x38,0x00, 0x56,0x33,0x34,0x39,0x00,0x56,0x33,0x35,0x30,0x00,0x56,0x33,0x35,0x31,0x00,0x56, 0x33,0x35,0x32,0x00,0x56,0x33,0x35,0x33,0x00,0x56,0x33,0x35,0x34,0x00,0x56,0x33, 0x35,0x35,0x00,0x56,0x33,0x35,0x36,0x00,0x56,0x33,0x35,0x37,0x00,0x56,0x33,0x35, 0x38,0x00,0x56,0x33,0x35,0x39,0x00,0x56,0x33,0x36,0x30,0x00,0x56,0x33,0x36,0x31, 0x00,0x56,0x33,0x36,0x32,0x00,0x56,0x33,0x36,0x33,0x00,0x56,0x33,0x36,0x34,0x00, 0x56,0x33,0x36,0x35,0x00,0x56,0x33,0x36,0x36,0x00,0x56,0x33,0x36,0x37,0x00,0x56, 0x33,0x36,0x38,0x00,0x56,0x33,0x36,0x39,0x00,0x56,0x33,0x37,0x30,0x00,0x56,0x33, 0x37,0x31,0x00,0x56,0x33,0x37,0x32,0x00,0x56,0x33,0x37,0x33,0x00,0x56,0x33,0x37, 0x34,0x00,0x56,0x33,0x37,0x35,0x00,0x56,0x33,0x37,0x36,0x00,0x56,0x33,0x37,0x37, 0x00,0x56,0x33,0x37,0x38,0x00,0x56,0x33,0x37,0x39,0x00,0x56,0x33,0x38,0x30,0x00, 0x56,0x33,0x38,0x31,0x00,0x56,0x33,0x38,0x32,0x00,0x56,0x33,0x38,0x33,0x00,0x56, 0x33,0x38,0x34,0x00,0x56,0x33,0x38,0x35,0x00,0x56,0x33,0x38,0x36,0x00,0x56,0x33, 0x38,0x37,0x00,0x56,0x33,0x38,0x38,0x00,0x56,0x33,0x38,0x39,0x00,0x56,0x33,0x39, 0x30,0x00,0x56,0x33,0x39,0x31,0x00,0x56,0x33,0x39,0x32,0x00,0x56,0x33,0x39,0x33, 0x00,0x56,0x33,0x39,0x34,0x00,0x56,0x33,0x39,0x35,0x00,0x56,0x33,0x39,0x36,0x00, 0x56,0x33,0x39,0x37,0x00,0x56,0x33,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x00,0x56, 0x34,0x30,0x30,0x00,0x56,0x34,0x30,0x31,0x00,0x56,0x34,0x30,0x32,0x00,0x56,0x34, 0x30,0x33,0x00,0x56,0x34,0x30,0x34,0x00,0x56,0x34,0x30,0x35,0x00,0x56,0x34,0x30, 0x36,0x00,0x56,0x34,0x30,0x37,0x00,0x56,0x34,0x30,0x38,0x00,0x56,0x34,0x30,0x39, 0x00,0x56,0x34,0x31,0x30,0x00,0x56,0x34,0x31,0x31,0x00,0x56,0x34,0x31,0x32,0x00, 0x56,0x34,0x31,0x33,0x00,0x56,0x34,0x31,0x34,0x00,0x56,0x34,0x31,0x35,0x00,0x56, 0x34,0x31,0x36,0x00,0x56,0x34,0x31,0x37,0x00,0x56,0x34,0x31,0x38,0x00,0x56,0x34, 0x31,0x39,0x00,0x56,0x34,0x32,0x30,0x00,0x56,0x34,0x32,0x31,0x00,0x56,0x34,0x32, 0x32,0x00,0x56,0x34,0x32,0x33,0x00,0x56,0x34,0x32,0x34,0x00,0x56,0x34,0x32,0x35, 0x00,0x56,0x34,0x32,0x36,0x00,0x56,0x34,0x32,0x37,0x00,0x56,0x34,0x32,0x38,0x00, 0x56,0x34,0x32,0x39,0x00,0x56,0x34,0x33,0x30,0x00,0x56,0x34,0x33,0x31,0x00,0x56, 0x34,0x33,0x32,0x00,0x56,0x34,0x33,0x33,0x00,0x56,0x34,0x33,0x34,0x00,0x56,0x34, 0x33,0x35,0x00,0x56,0x34,0x33,0x36,0x00,0x56,0x34,0x33,0x37,0x00,0x56,0x34,0x33, 0x38,0x00,0x56,0x34,0x33,0x39,0x00,0x56,0x34,0x34,0x30,0x00,0x56,0x34,0x34,0x31, 0x00,0x56,0x34,0x34,0x32,0x00,0x56,0x34,0x34,0x33,0x00,0x56,0x34,0x34,0x34,0x00, 0x56,0x34,0x34,0x35,0x00,0x56,0x34,0x34,0x36,0x00,0x56,0x34,0x34,0x37,0x00,0x56, 0x34,0x34,0x38,0x00,0x56,0x34,0x34,0x39,0x00,0x56,0x34,0x35,0x30,0x00,0x56,0x34, 0x35,0x31,0x00,0x56,0x34,0x35,0x32,0x00,0x56,0x34,0x35,0x33,0x00,0x56,0x34,0x35, 0x34,0x00,0x56,0x34,0x35,0x35,0x00,0x56,0x34,0x35,0x36,0x00,0x56,0x34,0x35,0x37, 0x00,0x56,0x34,0x35,0x38,0x00,0x56,0x34,0x35,0x39,0x00,0x56,0x34,0x36,0x30,0x00, 0x56,0x34,0x36,0x31,0x00,0x56,0x34,0x36,0x32,0x00,0x56,0x34,0x36,0x33,0x00,0x56, 0x34,0x36,0x34,0x00,0x56,0x34,0x36,0x35,0x00,0x56,0x34,0x36,0x36,0x00,0x56,0x34, 0x36,0x37,0x00,0x56,0x34,0x36,0x38,0x00,0x56,0x34,0x36,0x39,0x00,0x56,0x34,0x37, 0x30,0x00,0x56,0x34,0x37,0x31,0x00,0x56,0x34,0x37,0x32,0x00,0x56,0x34,0x37,0x33, 0x00,0x56,0x34,0x37,0x34,0x00,0x56,0x34,0x37,0x35,0x00,0x56,0x34,0x37,0x36,0x00, 0x56,0x34,0x37,0x37,0x00,0x56,0x34,0x37,0x38,0x00,0x56,0x34,0x37,0x39,0x00,0x56, 0x34,0x38,0x30,0x00,0x56,0x34,0x38,0x31,0x00,0x56,0x34,0x38,0x32,0x00,0x56,0x34, 0x38,0x33,0x00,0x56,0x34,0x38,0x34,0x00,0x56,0x34,0x38,0x35,0x00,0x56,0x34,0x38, 0x36,0x00,0x56,0x34,0x38,0x37,0x00,0x56,0x34,0x38,0x38,0x00,0x56,0x34,0x38,0x39, 0x00,0x56,0x34,0x39,0x30,0x00,0x56,0x34,0x39,0x31,0x00,0x56,0x34,0x39,0x32,0x00, 0x56,0x34,0x39,0x33,0x00,0x56,0x34,0x39,0x34,0x00,0x56,0x34,0x39,0x35,0x00,0x56, 0x34,0x39,0x36,0x00,0x56,0x34,0x39,0x37,0x00,0x56,0x34,0x39,0x38,0x00,0x56,0x34, 0x39,0x39,0x00,0x56,0x35,0x30,0x30,0x00,0x56,0x35,0x30,0x31,0x00,0x56,0x35,0x30, 0x32,0x00,0x56,0x35,0x30,0x33,0x00,0x56,0x35,0x30,0x34,0x00,0x56,0x35,0x30,0x35, 0x00,0x56,0x35,0x30,0x36,0x00,0x56,0x35,0x30,0x37,0x00,0x56,0x35,0x30,0x38,0x00, 0x56,0x35,0x30,0x39,0x00,0x56,0x35,0x31,0x30,0x00,0x56,0x35,0x31,0x31,0x00,0x56, 0x35,0x31,0x32,0x00,0x56,0x35,0x31,0x33,0x00,0x56,0x35,0x31,0x34,0x00,0x56,0x35, 0x31,0x35,0x00,0x56,0x35,0x31,0x36,0x00,0x56,0x35,0x31,0x37,0x00,0x56,0x35,0x31, 0x38,0x00,0x56,0x35,0x31,0x39,0x00,0x56,0x35,0x32,0x30,0x00,0x56,0x35,0x32,0x31, 0x00,0x56,0x35,0x32,0x32,0x00,0x56,0x35,0x32,0x33,0x00,0x56,0x35,0x32,0x34,0x00, 0x56,0x35,0x32,0x35,0x00,0x56,0x35,0x32,0x36,0x00,0x56,0x35,0x32,0x37,0x00,0x56, 0x35,0x32,0x38,0x00,0x56,0x35,0x32,0x39,0x00,0x56,0x35,0x33,0x30,0x00,0x56,0x35, 0x33,0x31,0x00,0x56,0x35,0x33,0x32,0x00,0x56,0x35,0x33,0x33,0x00,0x56,0x35,0x33, 0x34,0x00,0x56,0x35,0x33,0x35,0x00,0x56,0x35,0x33,0x36,0x00,0x56,0x35,0x33,0x37, 0x00,0x56,0x35,0x33,0x38,0x00,0x56,0x35,0x33,0x39,0x00,0x56,0x35,0x34,0x30,0x00, 0x56,0x35,0x34,0x31,0x00,0x56,0x35,0x34,0x32,0x00,0x56,0x35,0x34,0x33,0x00,0x56, 0x35,0x34,0x34,0x00,0x56,0x35,0x34,0x35,0x00,0x56,0x35,0x34,0x36,0x00,0x56,0x35, 0x34,0x37,0x00,0x56,0x35,0x34,0x38,0x00,0x56,0x35,0x34,0x39,0x00,0x56,0x35,0x35, 0x30,0x00,0x56,0x35,0x35,0x31,0x00,0x56,0x35,0x35,0x32,0x00,0x56,0x35,0x35,0x33, 0x00,0x56,0x35,0x35,0x34,0x00,0x56,0x35,0x35,0x35,0x00,0x56,0x35,0x35,0x36,0x00, 0x56,0x35,0x35,0x37,0x00,0x56,0x35,0x35,0x38,0x00,0x56,0x35,0x35,0x39,0x00,0x56, 0x35,0x36,0x30,0x00,0x56,0x35,0x36,0x31,0x00,0x56,0x35,0x36,0x32,0x00,0x56,0x35, 0x36,0x33,0x00,0x56,0x35,0x36,0x34,0x00,0x56,0x35,0x36,0x35,0x00,0x56,0x35,0x36, 0x36,0x00,0x56,0x35,0x36,0x37,0x00,0x56,0x35,0x36,0x38,0x00,0x56,0x35,0x36,0x39, 0x00,0x56,0x35,0x37,0x30,0x00,0x56,0x35,0x37,0x31,0x00,0x56,0x35,0x37,0x32,0x00, 0x56,0x35,0x37,0x33,0x00,0x56,0x35,0x37,0x34,0x00,0x56,0x35,0x37,0x35,0x00,0x56, 0x35,0x37,0x36,0x00,0x56,0x35,0x37,0x37,0x00,0x56,0x35,0x37,0x38,0x00,0x56,0x35, 0x37,0x39,0x00,0x56,0x35,0x38,0x30,0x00,0x56,0x35,0x38,0x31,0x00,0x56,0x35,0x38, 0x32,0x00,0x56,0x35,0x38,0x33,0x00,0x56,0x35,0x38,0x34,0x00,0x56,0x35,0x38,0x35, 0x00,0x56,0x35,0x38,0x36,0x00,0x56,0x35,0x38,0x37,0x00,0x56,0x35,0x38,0x38,0x00, 0x56,0x35,0x38,0x39,0x00,0x56,0x35,0x39,0x30,0x00,0x56,0x35,0x39,0x31,0x00,0x56, 0x35,0x39,0x32,0x00,0x56,0x35,0x39,0x33,0x00,0x56,0x35,0x39,0x34,0x00,0x56,0x35, 0x39,0x35,0x00,0x56,0x35,0x39,0x36,0x00,0x56,0x35,0x39,0x37,0x00,0x56,0x35,0x39, 0x38,0x00,0x56,0x35,0x39,0x39,0x00,0x56,0x36,0x30,0x30,0x00,0x56,0x36,0x30,0x31, 0x00,0x56,0x36,0x30,0x32,0x00,0x56,0x36,0x30,0x33,0x00,0x56,0x36,0x30,0x34,0x00, 0x56,0x36,0x30,0x35,0x00,0x56,0x36,0x30,0x36,0x00,0x56,0x36,0x30,0x37,0x00,0x56, 0x36,0x30,0x38,0x00,0x56,0x36,0x30,0x39,0x00,0x56,0x36,0x31,0x30,0x00,0x56,0x36, 0x31,0x31,0x00,0x56,0x36,0x31,0x32,0x00,0x56,0x36,0x31,0x33,0x00,0x56,0x36,0x31, 0x34,0x00,0x56,0x36,0x31,0x35,0x00,0x56,0x36,0x31,0x36,0x00,0x56,0x36,0x31,0x37, 0x00,0x56,0x36,0x31,0x38,0x00,0x56,0x36,0x31,0x39,0x00,0x56,0x36,0x32,0x30,0x00, 0x56,0x36,0x32,0x31,0x00,0x56,0x36,0x32,0x32,0x00,0x56,0x36,0x32,0x33,0x00,0x56, 0x36,0x32,0x34,0x00,0x56,0x36,0x32,0x35,0x00,0x56,0x36,0x32,0x36,0x00,0x56,0x36, 0x32,0x37,0x00,0x56,0x36,0x32,0x38,0x00,0x56,0x36,0x32,0x39,0x00,0x56,0x36,0x33, 0x30,0x00,0x56,0x36,0x33,0x31,0x00,0x56,0x36,0x33,0x32,0x00,0x56,0x36,0x33,0x33, 0x00,0x56,0x36,0x33,0x34,0x00,0x56,0x36,0x33,0x35,0x00,0x56,0x36,0x33,0x36,0x00, 0x56,0x36,0x33,0x37,0x00,0x56,0x36,0x33,0x38,0x00,0x56,0x36,0x33,0x39,0x00,0x56, 0x36,0x34,0x30,0x00,0x56,0x36,0x34,0x31,0x00,0x56,0x36,0x34,0x32,0x00,0x56,0x36, 0x34,0x33,0x00,0x56,0x36,0x34,0x34,0x00,0x56,0x36,0x34,0x35,0x00,0x56,0x36,0x34, 0x36,0x00,0x56,0x36,0x34,0x37,0x00,0x56,0x36,0x34,0x38,0x00,0x56,0x36,0x34,0x39, 0x00,0x56,0x36,0x35,0x30,0x00,0x56,0x36,0x35,0x31,0x00,0x56,0x36,0x35,0x32,0x00, 0x56,0x36,0x35,0x33,0x00,0x56,0x36,0x35,0x34,0x00,0x56,0x36,0x35,0x35,0x00,0x56, 0x36,0x35,0x36,0x00,0x56,0x36,0x35,0x37,0x00,0x56,0x36,0x35,0x38,0x00,0x56,0x36, 0x35,0x39,0x00,0x56,0x36,0x36,0x30,0x00,0x56,0x36,0x36,0x31,0x00,0x56,0x36,0x36, 0x32,0x00,0x56,0x36,0x36,0x33,0x00,0x56,0x36,0x36,0x34,0x00,0x56,0x36,0x36,0x35, 0x00,0x56,0x36,0x36,0x36,0x00,0x56,0x36,0x36,0x37,0x00,0x56,0x36,0x36,0x38,0x00, 0x56,0x36,0x36,0x39,0x00,0x56,0x36,0x37,0x30,0x00,0x56,0x36,0x37,0x31,0x00,0x56, 0x36,0x37,0x32,0x00,0x56,0x36,0x37,0x33,0x00,0x56,0x36,0x37,0x34,0x00,0x56,0x36, 0x37,0x35,0x00,0x56,0x36,0x37,0x36,0x00,0x56,0x36,0x37,0x37,0x00,0x56,0x36,0x37, 0x38,0x00,0x56,0x36,0x37,0x39,0x00,0x56,0x36,0x38,0x30,0x00,0x56,0x36,0x38,0x31, 0x00,0x56,0x36,0x38,0x32,0x00,0x56,0x36,0x38,0x33,0x00,0x56,0x36,0x38,0x34,0x00, 0x56,0x36,0x38,0x35,0x00,0x56,0x36,0x38,0x36,0x00,0x56,0x36,0x38,0x37,0x00,0x56, 0x36,0x38,0x38,0x00,0x56,0x36,0x38,0x39,0x00,0x56,0x36,0x39,0x30,0x00,0x56,0x36, 0x39,0x31,0x00,0x56,0x36,0x39,0x32,0x00,0x56,0x36,0x39,0x33,0x00,0x56,0x36,0x39, 0x34,0x00,0x56,0x36,0x39,0x35,0x00,0x56,0x36,0x39,0x36,0x00,0x56,0x36,0x39,0x37, 0x00,0x56,0x36,0x39,0x38,0x00,0x56,0x36,0x39,0x39,0x00,0x56,0x37,0x30,0x30,0x00, 0x56,0x37,0x30,0x31,0x00,0x56,0x37,0x30,0x32,0x00,0x56,0x37,0x30,0x33,0x00,0x56, 0x37,0x30,0x34,0x00,0x56,0x37,0x30,0x35,0x00,0x56,0x37,0x30,0x36,0x00,0x56,0x37, 0x30,0x37,0x00,0x56,0x37,0x30,0x38,0x00,0x56,0x37,0x30,0x39,0x00,0x56,0x37,0x31, 0x30,0x00,0x56,0x37,0x31,0x31,0x00,0x56,0x37,0x31,0x32,0x00,0x56,0x37,0x31,0x33, 0x00,0x56,0x37,0x31,0x34,0x00,0x56,0x37,0x31,0x35,0x00,0x56,0x37,0x31,0x36,0x00, 0x56,0x37,0x31,0x37,0x00,0x56,0x37,0x31,0x38,0x00,0x56,0x37,0x31,0x39,0x00,0x56, 0x37,0x32,0x30,0x00,0x56,0x37,0x32,0x31,0x00,0x56,0x37,0x32,0x32,0x00,0x56,0x37, 0x32,0x33,0x00,0x56,0x37,0x32,0x34,0x00,0x56,0x37,0x32,0x35,0x00,0x56,0x37,0x32, 0x36,0x00,0x56,0x37,0x32,0x37,0x00,0x56,0x37,0x32,0x38,0x00,0x56,0x37,0x32,0x39, 0x00,0x56,0x37,0x33,0x30,0x00,0x56,0x37,0x33,0x31,0x00,0x56,0x37,0x33,0x32,0x00, 0x56,0x37,0x33,0x33,0x00,0x56,0x37,0x33,0x34,0x00,0x56,0x37,0x33,0x35,0x00,0x56, 0x37,0x33,0x36,0x00,0x56,0x37,0x33,0x37,0x00,0x56,0x37,0x33,0x38,0x00,0x56,0x37, 0x33,0x39,0x00,0x56,0x37,0x34,0x30,0x00,0x56,0x37,0x34,0x31,0x00,0x56,0x37,0x34, 0x32,0x00,0x56,0x37,0x34,0x33,0x00,0x56,0x37,0x34,0x34,0x00,0x56,0x37,0x34,0x35, 0x00,0x56,0x37,0x34,0x36,0x00,0x56,0x37,0x34,0x37,0x00,0x56,0x37,0x34,0x38,0x00, 0x56,0x37,0x34,0x39,0x00,0x56,0x37,0x35,0x30,0x00,0x56,0x37,0x35,0x31,0x00,0x56, 0x37,0x35,0x32,0x00,0x56,0x37,0x35,0x33,0x00,0x56,0x37,0x35,0x34,0x00,0x56,0x37, 0x35,0x35,0x00,0x56,0x37,0x35,0x36,0x00,0x56,0x37,0x35,0x37,0x00,0x56,0x37,0x35, 0x38,0x00,0x56,0x37,0x35,0x39,0x00,0x56,0x37,0x36,0x30,0x00,0x56,0x37,0x36,0x31, 0x00,0x56,0x37,0x36,0x32,0x00,0x56,0x37,0x36,0x33,0x00,0x56,0x37,0x36,0x34,0x00, 0x56,0x37,0x36,0x35,0x00,0x56,0x37,0x36,0x36,0x00,0x56,0x37,0x36,0x37,0x00,0x56, 0x37,0x36,0x38,0x00,0x56,0x37,0x36,0x39,0x00,0x56,0x37,0x37,0x30,0x00,0x56,0x37, 0x37,0x31,0x00,0x56,0x37,0x37,0x32,0x00,0x56,0x37,0x37,0x33,0x00,0x56,0x37,0x37, 0x34,0x00,0x56,0x37,0x37,0x35,0x00,0x56,0x37,0x37,0x36,0x00,0x56,0x37,0x37,0x37, 0x00,0x56,0x37,0x37,0x38,0x00,0x56,0x37,0x37,0x39,0x00,0x56,0x37,0x38,0x30,0x00, 0x56,0x37,0x38,0x31,0x00,0x56,0x37,0x38,0x32,0x00,0x50,0x31,0x00,0x50,0x32,0x00, 0x50,0x33,0x00,0x50,0x34,0x00,0x50,0x35,0x00,0x50,0x36,0x00,0x50,0x37,0x00,0x50, 0x38,0x00,0x50,0x39,0x00,0x50,0x31,0x30,0x00,0x50,0x31,0x31,0x00,0x50,0x31,0x32, 0x00,0x50,0x31,0x33,0x00,0x50,0x31,0x34,0x00,0x50,0x31,0x35,0x00,0x50,0x31,0x36, 0x00,0x50,0x31,0x37,0x00,0x50,0x31,0x38,0x00,0x50,0x31,0x39,0x00,0x50,0x32,0x30, 0x00,0x50,0x32,0x31,0x00,0x50,0x32,0x32,0x00,0x50,0x32,0x33,0x00,0x50,0x32,0x34, 0x00,0x50,0x32,0x35,0x00,0x50,0x32,0x36,0x00,0x50,0x32,0x37,0x00,0x50,0x32,0x38, 0x00,0x50,0x32,0x39,0x00,0x50,0x33,0x30,0x00,0x50,0x33,0x31,0x00,0x50,0x33,0x32, 0x00,0x50,0x33,0x33,0x00,0x50,0x33,0x34,0x00,0x50,0x33,0x35,0x00,0x50,0x33,0x36, 0x00,0x4d,0x63,0x50,0x31,0x36,0x5f,0x34,0x4d,0x56,0x5f,0x32,0x53,0x55,0x52,0x46, 0x5f,0x57,0x49,0x54,0x48,0x5f,0x43,0x48,0x52,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x34, 0x31,0x37,0x00,0x42,0x42,0x5f,0x31,0x5f,0x34,0x33,0x30,0x00,0x5f,0x5a,0x32,0x34, 0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69, 0x6d,0x70,0x6c,0x5f,0x75,0x72,0x65,0x6d,0x6a,0x6a,0x2e,0x34,0x5f,0x42,0x42,0x5f, 0x32,0x5f,0x34,0x35,0x31,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69, 0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64, 0x69,0x76,0x75,0x32,0x43,0x4d,0x76,0x62,0x38,0x5f,0x73,0x53,0x5f,0x2e,0x31,0x5f, 0x42,0x42,0x5f,0x33,0x5f,0x34,0x36,0x35,0x00,0x42,0x42,0x5f,0x34,0x5f,0x34,0x36, 0x37,0x00,0x42,0x42,0x5f,0x35,0x5f,0x34,0x37,0x34,0x00,0x42,0x42,0x5f,0x36,0x5f, 0x34,0x38,0x30,0x00,0x42,0x42,0x5f,0x37,0x5f,0x34,0x38,0x36,0x00,0x5f,0x5a,0x32, 0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f, 0x69,0x6d,0x70,0x6c,0x5f,0x75,0x64,0x69,0x76,0x75,0x32,0x43,0x4d,0x76,0x62,0x31, 0x36,0x5f,0x6a,0x53,0x5f,0x2e,0x33,0x5f,0x42,0x42,0x5f,0x38,0x5f,0x35,0x31,0x34, 0x00,0x42,0x42,0x5f,0x39,0x5f,0x35,0x32,0x36,0x00,0x42,0x42,0x5f,0x31,0x30,0x5f, 0x35,0x33,0x33,0x00,0x42,0x42,0x5f,0x31,0x31,0x5f,0x35,0x33,0x39,0x00,0x42,0x42, 0x5f,0x31,0x32,0x5f,0x35,0x34,0x35,0x00,0x42,0x42,0x5f,0x31,0x33,0x5f,0x35,0x38, 0x30,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72,0x69, 0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x69,0x69, 0x2e,0x32,0x5f,0x42,0x42,0x5f,0x31,0x34,0x5f,0x35,0x38,0x31,0x00,0x42,0x42,0x5f, 0x31,0x35,0x5f,0x35,0x38,0x32,0x00,0x42,0x42,0x5f,0x31,0x36,0x5f,0x36,0x33,0x31, 0x00,0x42,0x42,0x5f,0x31,0x37,0x5f,0x36,0x34,0x38,0x00,0x42,0x42,0x5f,0x31,0x38, 0x5f,0x36,0x34,0x39,0x00,0x42,0x42,0x5f,0x31,0x39,0x5f,0x37,0x30,0x30,0x00,0x54, 0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x54,0x31,0x30,0x00,0x54, 0x31,0x31,0x00,0x54,0x31,0x32,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54, 0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x1a,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x55,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x27,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x55,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x77,0x00,0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x87,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x88,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x97,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x98,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x55,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x55,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x55,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x55,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb7,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x27,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc7,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc8,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9, 0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd6,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd7,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00, 0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00, 0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe6,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe8,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf6,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf7,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x01,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09, 0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x27,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x16,0x01,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x17,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19, 0x01,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00, 0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00, 0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x36,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x37,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39, 0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00, 0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x55,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x57,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x57,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x47,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49, 0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x56,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x57,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01, 0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00, 0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00, 0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x57,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x57,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x67,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x68,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69, 0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x01,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0x01,0x00,0x00,0x02,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x77,0x01,0x00,0x00,0x02,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x78,0x01,0x00,0x00,0x01,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79, 0x01,0x00,0x00,0x02,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01, 0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00, 0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00, 0x05,0x80,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x05, 0x04,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x01,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x01,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x01,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x01,0x00,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x01,0x10,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x86,0x01,0x00,0x00,0x04,0xc0,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x87,0x01,0x00,0x00,0x01,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x01,0x04,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89, 0x01,0x00,0x00,0x01,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01, 0x00,0x00,0x01,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00, 0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00, 0x00,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x01, 0x10,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x01,0x08, 0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x01,0x04,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x01,0x02,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x01,0x01,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x01,0x01,0x00,0x6d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x02,0x40,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x01,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x96,0x01,0x00,0x00,0x01,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x97,0x01,0x00,0x00,0x01,0x01,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x98,0x01,0x00,0x00,0x01,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 0x01,0x00,0x00,0x01,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01, 0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00, 0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00, 0x02,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x03, 0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x02,0x01, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x03,0x01,0x00, 0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x01,0x00,0x25, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x01,0x00,0x23,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x03,0x08,0x00,0x47,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x01,0x01,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x01,0x08,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x01,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa7,0x01,0x00,0x00,0x00,0x01,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0x01,0x00,0x00,0x04,0x40,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9, 0x01,0x00,0x00,0x01,0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01, 0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00, 0x00,0x00,0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00, 0x00,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x04, 0x40,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x01,0x01, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x01,0x01,0x00, 0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x01,0x00,0x61, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x01,0x00,0x62,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x04,0x40,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x01,0x01,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x01,0x01,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb7,0x01,0x00,0x00,0x04,0x40,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0x01,0x00,0x00,0x05,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9, 0x01,0x00,0x00,0x05,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x05,0x01,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00, 0x00,0x05,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00, 0x04,0x01,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x04, 0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x01,0x10, 0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x01,0x10,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x01,0x10,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x01,0x10,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x01,0x10,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x01,0x10,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x01,0x10,0x00,0x5b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x01,0x10,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x01,0x00,0x00,0x01,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc7,0x01,0x00,0x00,0x01,0x10,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc8,0x01,0x00,0x00,0x01,0x10,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9, 0x01,0x00,0x00,0x01,0x10,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01, 0x00,0x00,0x01,0x10,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00, 0x00,0x01,0x10,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x01,0x10,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x01, 0x10,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x01,0x10, 0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x01,0x30,0x00, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x01,0x08,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x03,0x08,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x04,0x04,0x00,0x21,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x03,0x08,0x00,0x79,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x03,0x10,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd6,0x01,0x00,0x00,0x01,0x04,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd7,0x01,0x00,0x00,0x01,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0x01,0x00,0x00,0x01,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9, 0x01,0x00,0x00,0x01,0x01,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01, 0x00,0x00,0x01,0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00, 0x00,0x01,0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00, 0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00, 0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x04,0x40, 0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x01,0x01,0x00, 0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x01,0x00,0x8f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x01,0x00,0x8e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x01,0x00,0x8f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x04,0x40,0x00,0x90,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x01,0x01,0x00,0x99,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x01,0x01,0x00,0x9a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe7,0x01,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe8,0x01,0x00,0x00,0x04,0x40,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9, 0x01,0x00,0x00,0x01,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01, 0x00,0x00,0x01,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00, 0x00,0x00,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00, 0x00,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x04, 0x40,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x01,0x10, 0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x01,0x10,0x00, 0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x01,0x10,0x00,0x89, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x01,0x10,0x00,0x91,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x01,0x10,0x00,0x92,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x01,0x10,0x00,0x93,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x01,0x10,0x00,0x94,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x01,0x10,0x00,0x9c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf6,0x01,0x00,0x00,0x01,0x10,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf7,0x01,0x00,0x00,0x01,0x10,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0x01,0x00,0x00,0x01,0x10,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9, 0x01,0x00,0x00,0x01,0x10,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01, 0x00,0x00,0x01,0x10,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00, 0x00,0x01,0x10,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00, 0x01,0x10,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x01, 0x10,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x01,0x30, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x01,0x08,0x00, 0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x08,0x00,0x7d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x08,0x00,0xae,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x03,0x08,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x03,0x10,0x00,0xae,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0x04,0x00,0xb0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x01,0x02,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x02,0x00,0x00,0x01,0x01,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0x02,0x00,0x00,0x01,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x02,0x00,0x00,0x01,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09, 0x02,0x00,0x00,0x01,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02, 0x00,0x00,0x01,0x01,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00, 0x00,0x04,0x20,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00, 0x04,0x40,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x04, 0x40,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x04,0xc0, 0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x04,0xc0,0x00, 0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x04,0x20,0x00,0xb6, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x04,0x20,0x00,0xb7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x04,0x20,0x00,0xb8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x04,0x40,0x00,0xb9,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x01,0x10,0x00,0xba,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x01,0x08,0x00,0xbb,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x16,0x02,0x00,0x00,0x01,0x04,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x17,0x02,0x00,0x00,0x01,0x02,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x02,0x00,0x00,0x01,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19, 0x02,0x00,0x00,0x00,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02, 0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00, 0x00,0x01,0x10,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00, 0x01,0x08,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x01, 0x04,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x01,0x02, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x01,0x01,0x00, 0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x01,0x00,0xc3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x07,0x02,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x07,0x02,0x00,0xc5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x01,0x10,0x00,0xc6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x01,0x10,0x00,0xc7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x01,0x10,0x00,0xc8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0x02,0x00,0x00,0x01,0x10,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x27,0x02,0x00,0x00,0x01,0x10,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0x02,0x00,0x00,0x03,0x20,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29, 0x02,0x00,0x00,0x03,0x20,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x02, 0x00,0x00,0x01,0x10,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00, 0x00,0x03,0x20,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x02,0x00,0x00, 0x03,0x20,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x01, 0x08,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x00,0x01,0x04, 0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x02,0x00,0x00,0x01,0x02,0x00, 0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x01,0x01,0x00,0xcf, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x01,0x01,0x00,0xd0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00,0x03,0x02,0x00,0xcf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x01,0x01,0x00,0xd2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x03,0x40,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x07,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x36,0x02,0x00,0x00,0x07,0x01,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x37,0x02,0x00,0x00,0x07,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x02,0x00,0x00,0x07,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39, 0x02,0x00,0x00,0x01,0x01,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02, 0x00,0x00,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x02,0x00, 0x00,0x01,0x01,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x00,0x00, 0x01,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x02,0x00,0x00,0x01, 0x01,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x02,0x00,0x00,0x01,0x01, 0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00,0x01,0x10,0x00, 0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x01,0x10,0x00,0xdd, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x01,0x10,0x00,0xde,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x01,0x10,0x00,0xdf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00,0x01,0x10,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x01,0x10,0x00,0xe1,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x01,0x10,0x00,0xe2,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x00,0x01,0x10,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x47,0x02,0x00,0x00,0x00,0x10,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x02,0x00,0x00,0x00,0x10,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49, 0x02,0x00,0x00,0x00,0x10,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x02, 0x00,0x00,0x00,0x10,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x02,0x00, 0x00,0x01,0x10,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x02,0x00,0x00, 0x01,0x08,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x01, 0x04,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x01,0x02, 0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x02,0x00,0x00,0x01,0x01,0x00, 0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x02,0x00,0x00,0x00,0x02,0x00,0xee, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x01,0x00,0xe8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x01,0x10,0x00,0xe9,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x01,0x08,0x00,0xea,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x01,0x04,0x00,0xeb,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x01,0x02,0x00,0xec,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x56,0x02,0x00,0x00,0x01,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x57,0x02,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0x02,0x00,0x00,0x07,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 0x02,0x00,0x00,0x03,0x10,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x02, 0x00,0x00,0x03,0x20,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x02,0x00, 0x00,0x03,0x10,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x02,0x00,0x00, 0x03,0x60,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x02,0x00,0x00,0x03, 0x10,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x02,0x00,0x00,0x03,0x10, 0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x02,0x00,0x00,0x01,0x10,0x00, 0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x02,0x10,0x00,0xf0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x01,0x10,0x00,0xf5,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x02,0x00,0x00,0x02,0x10,0x00,0xf1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x01,0x10,0x00,0xf6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x02,0x10,0x00,0xf2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x01,0x10,0x00,0xf7,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x02,0x00,0x00,0x02,0x10,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x67,0x02,0x00,0x00,0x01,0x10,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x68,0x02,0x00,0x00,0x03,0x20,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69, 0x02,0x00,0x00,0x03,0x20,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x02, 0x00,0x00,0x01,0x10,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x02,0x00, 0x00,0x03,0x20,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00, 0x03,0x20,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x01, 0x08,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x02,0x00,0x00,0x01,0x04, 0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x02,0x00,0x00,0x01,0x02,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x01,0x01,0x00,0xfd, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x02,0x00,0x00,0x01,0x01,0x00,0xfe,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x02,0x00,0x00,0x03,0x02,0x00,0xfd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0x07,0x01,0x00,0x01,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x75,0x02,0x00,0x00,0x07,0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0x02,0x00,0x00,0x07,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x77,0x02,0x00,0x00,0x07,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x78,0x02,0x00,0x00,0x01,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x79, 0x02,0x00,0x00,0x00,0x01,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x02, 0x00,0x00,0x01,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x02,0x00, 0x00,0x01,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x02,0x00,0x00, 0x01,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x02,0x00,0x00,0x01, 0x10,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x00,0x00,0x01,0x08, 0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x02,0x00,0x00,0x01,0x04,0x00, 0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x01,0x02,0x00,0x0c, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x01,0x01,0x00,0x0d,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x02,0x00,0x00,0x00,0x02,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x01,0x00,0x0d,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x01,0x10,0x00,0x0e,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x85,0x02,0x00,0x00,0x01,0x08,0x00,0x0f,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x86,0x02,0x00,0x00,0x01,0x04,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x87,0x02,0x00,0x00,0x01,0x02,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x88,0x02,0x00,0x00,0x01,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x89, 0x02,0x00,0x00,0x00,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x02, 0x00,0x00,0x07,0x02,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x02,0x00, 0x00,0x03,0x10,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x02,0x00,0x00, 0x03,0x20,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x03, 0x10,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x03,0x60, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x02,0x00,0x00,0x03,0x10,0x00, 0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x02,0x00,0x00,0x03,0x10,0x00,0x18, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x01,0x10,0x00,0x19,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x02,0x10,0x00,0x15,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x93,0x02,0x00,0x00,0x01,0x10,0x00,0x1a,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x02,0x00,0x00,0x02,0x10,0x00,0x16,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x01,0x10,0x00,0x1b,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x96,0x02,0x00,0x00,0x02,0x10,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x97,0x02,0x00,0x00,0x01,0x10,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x98,0x02,0x00,0x00,0x02,0x10,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 0x02,0x00,0x00,0x01,0x10,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x02, 0x00,0x00,0x03,0x20,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x02,0x00, 0x00,0x03,0x20,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x02,0x00,0x00, 0x01,0x10,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x02,0x00,0x00,0x03, 0x20,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x02,0x00,0x00,0x03,0x20, 0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x01,0x08,0x00, 0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x01,0x04,0x00,0x20, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x02,0x00,0x00,0x01,0x02,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x01,0x01,0x00,0x22,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x01,0x01,0x00,0x23,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xa4,0x02,0x00,0x00,0x03,0x02,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xa5,0x02,0x00,0x00,0x01,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xa6,0x02,0x00,0x00,0x07,0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xa7,0x02,0x00,0x00,0x07,0x01,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0x02,0x00,0x00,0x07,0x01,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa9, 0x02,0x00,0x00,0x07,0x01,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x02, 0x00,0x00,0x01,0x01,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x02,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00, 0x01,0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x02,0x00,0x00,0x01, 0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x02,0x00,0x00,0x01,0x01, 0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x02,0x00,0x00,0x01,0x01,0x00, 0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x01,0x01,0x00,0x2f, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x02,0x00,0x00,0x01,0x01,0x00,0x38,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x01,0x10,0x00,0x30,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x01,0x10,0x00,0x31,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0x02,0x00,0x00,0x01,0x10,0x00,0x32,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x01,0x10,0x00,0x33,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xb6,0x02,0x00,0x00,0x03,0x10,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xb7,0x02,0x00,0x00,0x03,0x10,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0x02,0x00,0x00,0x03,0x10,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9, 0x02,0x00,0x00,0x03,0x10,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x02, 0x00,0x00,0x01,0x10,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x02,0x00, 0x00,0x02,0x10,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x02,0x00,0x00, 0x01,0x10,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x02,0x00,0x00,0x02, 0x10,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x02,0x00,0x00,0x01,0x10, 0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x02,0x10,0x00, 0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x01,0x10,0x00,0x44, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x02,0x00,0x00,0x02,0x10,0x00,0x37,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x03,0x10,0x00,0x39,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0x02,0x00,0x00,0x03,0x10,0x00,0x3a,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x03,0x10,0x00,0x3b,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xc5,0x02,0x00,0x00,0x03,0x10,0x00,0x3c,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x02,0x00,0x00,0x01,0x10,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xc7,0x02,0x00,0x00,0x02,0x10,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xc8,0x02,0x00,0x00,0x01,0x10,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc9, 0x02,0x00,0x00,0x02,0x10,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x02, 0x00,0x00,0x01,0x10,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x02,0x00, 0x00,0x02,0x10,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x02,0x00,0x00, 0x01,0x10,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x02,0x00,0x00,0x02, 0x10,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x02,0x00,0x00,0x00,0x10, 0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x02,0x00,0x00,0x00,0x10,0x00, 0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0x00,0x10,0x00,0x43, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x02,0x00,0x00,0x00,0x10,0x00,0x44,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x02,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd3,0x02,0x00,0x00,0x03,0x08,0x00,0x46,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x07,0x08,0x00,0x48,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xd5,0x02,0x00,0x00,0x07,0x08,0x00,0x49,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xd6,0x02,0x00,0x00,0x01,0x08,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xd7,0x02,0x00,0x00,0x01,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0x02,0x00,0x00,0x01,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd9, 0x02,0x00,0x00,0x00,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x02, 0x00,0x00,0x01,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x02,0x00, 0x00,0x07,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x02,0x00,0x00, 0x00,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x02,0x00,0x00,0x00, 0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x01,0x01, 0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x02,0x00,0x00,0x07,0x01,0x00, 0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x01,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x02,0x00,0x00,0x07,0x01,0x00,0x58,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x02,0x00,0x00,0x07,0x01,0x00,0x53,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe3,0x02,0x00,0x00,0x01,0x01,0x00,0x54,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x01,0x00,0x54,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe5,0x02,0x00,0x00,0x07,0x01,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe6,0x02,0x00,0x00,0x01,0x01,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xe7,0x02,0x00,0x00,0x01,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe8,0x02,0x00,0x00,0x01,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe9, 0x02,0x00,0x00,0x00,0x10,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x02, 0x00,0x00,0x01,0x10,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x02,0x00, 0x00,0x07,0x10,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00, 0x01,0x10,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x02,0x00,0x00,0x00, 0x10,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x00,0x10, 0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x01,0x10,0x00, 0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x07,0x10,0x00,0x60, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x02,0x00,0x00,0x00,0x10,0x00,0x61,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02,0x00,0x00,0x07,0x10,0x00,0x69,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xf3,0x02,0x00,0x00,0x07,0x10,0x00,0x64,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xf4,0x02,0x00,0x00,0x01,0x10,0x00,0x65,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x10,0x00,0x65,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xf6,0x02,0x00,0x00,0x07,0x10,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xf7,0x02,0x00,0x00,0x01,0x10,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0x02,0x00,0x00,0x01,0x10,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf9, 0x02,0x00,0x00,0x01,0x10,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x02, 0x00,0x00,0x00,0x01,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x02,0x00, 0x00,0x01,0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x00,0x00, 0x07,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00, 0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x00,0x00,0x00,0x01, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x02,0x00,0x00,0x01,0x01,0x00, 0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x01,0x00,0x70, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0x01,0x00,0x6e,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x01,0x00,0x71,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x07,0x01,0x00,0x79,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x07,0x01,0x00,0x74,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x01,0x01,0x00,0x75,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x01,0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0x03,0x00,0x00,0x07,0x01,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x03,0x00,0x00,0x01,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x24,0x00,0x09,0x03,0x00,0x00,0x01,0x00,0x00,0x0a,0x03,0x00,0x00,0x01,0x00, 0x00,0x0b,0x03,0x00,0x00,0x01,0x00,0x00,0x0c,0x03,0x00,0x00,0x01,0x00,0x00,0x0d, 0x03,0x00,0x00,0x01,0x00,0x00,0x0e,0x03,0x00,0x00,0x01,0x00,0x00,0x0f,0x03,0x00, 0x00,0x01,0x00,0x00,0x10,0x03,0x00,0x00,0x01,0x00,0x00,0x11,0x03,0x00,0x00,0x01, 0x00,0x00,0x12,0x03,0x00,0x00,0x01,0x00,0x00,0x13,0x03,0x00,0x00,0x01,0x00,0x00, 0x14,0x03,0x00,0x00,0x01,0x00,0x00,0x15,0x03,0x00,0x00,0x08,0x00,0x00,0x16,0x03, 0x00,0x00,0x01,0x00,0x00,0x17,0x03,0x00,0x00,0x08,0x00,0x00,0x18,0x03,0x00,0x00, 0x01,0x00,0x00,0x19,0x03,0x00,0x00,0x01,0x00,0x00,0x1a,0x03,0x00,0x00,0x01,0x00, 0x00,0x1b,0x03,0x00,0x00,0x01,0x00,0x00,0x1c,0x03,0x00,0x00,0x01,0x00,0x00,0x1d, 0x03,0x00,0x00,0x01,0x00,0x00,0x1e,0x03,0x00,0x00,0x01,0x00,0x00,0x1f,0x03,0x00, 0x00,0x01,0x00,0x00,0x20,0x03,0x00,0x00,0x01,0x00,0x00,0x21,0x03,0x00,0x00,0x01, 0x00,0x00,0x22,0x03,0x00,0x00,0x01,0x00,0x00,0x23,0x03,0x00,0x00,0x01,0x00,0x00, 0x24,0x03,0x00,0x00,0x01,0x00,0x00,0x25,0x03,0x00,0x00,0x01,0x00,0x00,0x26,0x03, 0x00,0x00,0x01,0x00,0x00,0x27,0x03,0x00,0x00,0x01,0x00,0x00,0x28,0x03,0x00,0x00, 0x01,0x00,0x00,0x29,0x03,0x00,0x00,0x01,0x00,0x00,0x2a,0x03,0x00,0x00,0x01,0x00, 0x00,0x2b,0x03,0x00,0x00,0x10,0x00,0x00,0x2c,0x03,0x00,0x00,0x01,0x00,0x00,0x14, 0x00,0x2d,0x03,0x00,0x00,0x01,0x00,0x2e,0x03,0x00,0x00,0x00,0x00,0x2f,0x03,0x00, 0x00,0x01,0x00,0x30,0x03,0x00,0x00,0x01,0x00,0x31,0x03,0x00,0x00,0x00,0x00,0x32, 0x03,0x00,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x34,0x03,0x00,0x00,0x00, 0x00,0x35,0x03,0x00,0x00,0x01,0x00,0x36,0x03,0x00,0x00,0x00,0x00,0x37,0x03,0x00, 0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x00,0x00,0x39,0x03,0x00,0x00,0x00,0x00,0x3a, 0x03,0x00,0x00,0x00,0x00,0x3b,0x03,0x00,0x00,0x01,0x00,0x3c,0x03,0x00,0x00,0x00, 0x00,0x3d,0x03,0x00,0x00,0x00,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0x3f,0x03,0x00, 0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x07,0x41,0x03,0x00,0x00,0x01, 0x00,0x00,0x42,0x03,0x00,0x00,0x01,0x00,0x00,0x43,0x03,0x00,0x00,0x01,0x00,0x00, 0x44,0x03,0x00,0x00,0x01,0x00,0x00,0x45,0x03,0x00,0x00,0x01,0x00,0x00,0x46,0x03, 0x00,0x00,0x01,0x00,0x00,0x47,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24, 0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00, 0x00,0x2c,0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x02,0x0b, 0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x02,0x0c,0x00,0x00,0x00,0x38,0x00,0x04,0x00, 0x00,0x20,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x00,0x21,0x00,0x00,0x00,0x40,0x00, 0x04,0x00,0xa8,0x47,0x00,0x00,0x56,0x3f,0x00,0x00,0x02,0x00,0x48,0x03,0x00,0x00, 0x0d,0x67,0x65,0x6e,0x78,0x5f,0x6d,0x63,0x5f,0x31,0x2e,0x61,0x73,0x6d,0x49,0x03, 0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x05,0x00,0x00, 0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x01,0x00,0x00, 0x83,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x2a,0x00,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03, 0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x84, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x02,0x00,0x00,0x00,0x37,0x00,0x0b,0x01,0x08,0x04,0x00,0x85,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00,0x28,0x00,0x00,0x00,0x02, 0x00,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x01,0x00,0x01, 0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x37,0x00,0x0b,0x00,0x10,0x0c,0x00,0x89,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2e, 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x10,0x8c,0x01,0x00,0x00, 0x02,0x14,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x8c,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x10,0x8c,0x01,0x00,0x00,0x03, 0x14,0x46,0x02,0x10,0x04,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8b,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8f,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x93, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x02,0x04,0x46,0x02, 0x10,0x8c,0x01,0x00,0x00,0x02,0x05,0x46,0x02,0x10,0x04,0x00,0x00,0x00,0x93,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x93,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x94,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x93, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x95,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x94,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x95,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00, 0x01,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x19,0x01,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9a,0x01,0x00,0x00,0x01,0x0e,0x21,0x01,0x05,0x01,0xf8,0xff,0xff,0xff,0x29,0x00, 0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x02,0x00,0x2c,0x00,0x00,0x02,0x03,0x00, 0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a, 0x00,0x03,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x99,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x01,0x0f,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x02,0x00, 0x01,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff, 0xff,0xff,0xff,0x2c,0x00,0x00,0x02,0x04,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00,0x04,0x00,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x08,0x00,0x08,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00, 0x01,0x0e,0x21,0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x03,0xff,0xff,0xff,0xff,0x25,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x01,0x0f,0x21,0x01,0x05,0x02,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x03,0xff,0xff,0xff,0xff,0x2c,0x00, 0x04,0x02,0x05,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x06,0x00,0x00,0xa7,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00, 0x00,0x00,0x02,0x07,0x00,0x02,0x06,0x00,0x02,0x05,0x00,0x2a,0x00,0x07,0x00,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05, 0x00,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x08,0x00,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x09,0x00, 0x02,0x08,0x00,0x02,0x05,0x00,0x2a,0x00,0x09,0x00,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x2c, 0x00,0x01,0x02,0x0a,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x0b,0x00,0x02,0x0a,0x00,0x02,0x06, 0x00,0x2a,0x00,0x0b,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x05, 0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x0c, 0x00,0x02,0x08,0x00,0x02,0x0a,0x00,0x2a,0x00,0x0c,0x00,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x05,0x05,0x00,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x04, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33, 0x80,0x00,0x00,0x03,0x00,0x29,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32, 0x00,0x07,0x80,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xac,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x00,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x01, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xae,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x04,0x00,0x29,0x00,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x32,0x00,0x09,0x80,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01,0x00, 0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01,0x00,0x00, 0x00,0x03,0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xb1,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x58,0x00,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x05,0x00,0x29,0x00,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x32,0x00,0x0b,0x80,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01, 0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01,0x00, 0x00,0x00,0x05,0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xb6,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x63,0x00,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00, 0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x06,0x00,0x29,0x00, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x32,0x00,0x0c,0x80,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0xb9,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa, 0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa,0x01, 0x00,0x00,0x00,0x07,0x21,0x01,0x37,0x00,0x07,0x00,0x08,0x08,0x00,0xbb,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x6e,0x00, 0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x10,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x01,0x10,0x22,0x01,0x31,0x07,0x00,0x01, 0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x25,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x04,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xc4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xc5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc8,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc9,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00, 0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc7,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00, 0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xd5, 0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00, 0x08,0x00,0x29,0x04,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x03,0x00,0x00,0x00,0xd6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd7, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x25,0x03,0x00,0x00,0x00,0xd8,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x02, 0x0d,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd9,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x2a,0x03,0x0d,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x10,0x03,0x00, 0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x02,0x00,0x00, 0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xde, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xdd,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x37,0x00,0x0a,0x00,0x08,0x02,0x00, 0xa0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x7d,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x04,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x03,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x03,0x00,0x29,0x03,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04, 0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x88,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x07,0x80,0x09,0x00,0x01,0x00,0x00,0x00, 0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xe1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x37,0x00,0x09,0x00,0x08,0x08, 0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe3,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00, 0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe4,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x89, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x01,0x10,0x22,0x01, 0x31,0x09,0x00,0x29,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x09,0x80,0x0a,0x00,0x01,0x00,0x00, 0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x37,0x00,0x09,0x00,0x08, 0x08,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe8,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x90,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x01,0x00, 0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe9,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9,0x01,0x00,0x00,0x01,0x10,0x22, 0x01,0x31,0x0a,0x00,0x29,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x9e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x0b,0x80,0x0b,0x00,0x01,0x00, 0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x37,0x00,0x09,0x00, 0x08,0x08,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xed,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x9b,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x9c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01, 0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x01,0x10, 0x22,0x01,0x31,0x0b,0x00,0x29,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xa7,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xa9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x0c,0x80,0x0c,0x00,0x01, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x01,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xe0,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x37,0x00,0x09, 0x00,0x08,0x08,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf2,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0xa6,0x00,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3, 0x01,0x00,0x00,0x00,0x10,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf3,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf3,0x01,0x00,0x00,0x01, 0x10,0x22,0x01,0x31,0x0c,0x00,0x01,0x04,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc2,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x04,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00, 0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0xf6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x01, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf6,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00, 0x08,0x00,0x29,0x04,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00, 0x08,0x00,0x29,0x04,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x33,0x80,0x00,0x00,0x08,0x00,0x29,0x04,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x03,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x25, 0x03,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x0e, 0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x83,0x01,0x00,0x00,0x00, 0x02,0x21,0x01,0x2a,0x00,0x0e,0x00,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2c,0x03,0x00,0x02, 0x0f,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xd9,0x01,0x00,0x00, 0x00,0x02,0x21,0x01,0x2a,0x03,0x0f,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x03,0x01,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x10,0x03,0x00, 0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x02,0x00,0x00, 0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x0c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x0b,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x0d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x10,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x00,0x02,0x10,0x00,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x10,0x00,0x0d,0x00, 0x33,0x80,0x00,0x00,0x0e,0x00,0x31,0x0d,0x00,0x2a,0x00,0x0e,0x80,0x00,0xb4,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0xff,0xff,0xff,0xff,0x05,0x03,0x00,0x00, 0x00,0x00,0x2c,0x00,0x02,0x02,0x11,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x07,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x12,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x21, 0x00,0x00,0x00,0x02,0x13,0x00,0x02,0x12,0x00,0x02,0x11,0x00,0x2c,0x00,0x00,0x02, 0x14,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x83,0x01,0x00,0x00, 0x00,0x02,0x21,0x01,0x2c,0x00,0x00,0x02,0x15,0x00,0x00,0x83,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x32,0x00,0x13,0x00, 0x0f,0x00,0x45,0x04,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12, 0x02,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x24,0x01, 0x45,0x04,0x00,0x00,0x11,0x02,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x14,0x02,0x00, 0x00,0x00,0x00,0x24,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x24,0x01,0x45,0x04, 0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x02, 0x00,0x24,0x01,0x00,0x15,0x02,0x00,0x00,0x02,0x00,0x24,0x01,0x45,0x04,0x00,0x00, 0x16,0x02,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x04,0x00,0x24, 0x01,0x00,0x15,0x02,0x00,0x00,0x04,0x00,0x24,0x01,0x45,0x05,0x01,0x00,0x11,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x8c,0x01,0x00,0x00,0x01,0x02,0x56,0x02,0x45,0x05,0x01,0x00,0x16,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8c,0x01, 0x00,0x00,0x03,0x02,0x56,0x02,0x45,0x04,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x24,0x01,0x45,0x04,0x01,0x00,0x17,0x02,0x00,0x00,0x00,0x10,0x00,0x02, 0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x24,0x01,0x45,0x04,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14, 0x02,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x15,0x02,0x00,0x00,0x02,0x00,0x24,0x01, 0x45,0x04,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x14,0x02,0x00, 0x00,0x04,0x00,0x24,0x01,0x00,0x15,0x02,0x00,0x00,0x04,0x00,0x24,0x01,0x45,0x05, 0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x11,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x45,0x05,0x00,0x00, 0x19,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x1a, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x00,0x12,0x45,0x02, 0x10,0x19,0x02,0x00,0x00,0x00,0x1a,0x45,0x02,0x10,0x04,0x00,0x00,0x00,0x1a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x1a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x1b,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x1a, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x1c,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1b,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x1b,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x1c,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1e,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1d,0x02,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02, 0x00,0x00,0x00,0x12,0x45,0x02,0x10,0x19,0x02,0x00,0x00,0x00,0x13,0x45,0x02,0x10, 0x04,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03, 0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x02,0x00,0x00, 0x01,0x00,0x22,0x01,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x02,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x25,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x24,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x1f, 0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0xc5,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x19,0x01,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x27,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x28, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8c,0x01, 0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x00,0x10,0x22,0x01,0x10,0x8c,0x01,0x00, 0x00,0x02,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x19,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x10,0x8c,0x01,0x00,0x00, 0x03,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x19,0x02,0x00,0x00,0x01,0x10,0x22,0x01,0x10,0x8c,0x01,0x00,0x00,0x04, 0x02,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x29,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x2a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x2b,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x2c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x23, 0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x30, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x02,0x00,0x00,0x00,0x00,0x23,0x01, 0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x30,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x2d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x33,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x30, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x34,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x33,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x33,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x34,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x34,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x02,0x00,0x00, 0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x39,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x00, 0x3a,0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00, 0x00,0x01,0x21,0x01,0x00,0x27,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x0c,0x00,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd3,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x19,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xd5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3d,0x29,0x00,0x00, 0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3f, 0x0c,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd4,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x00,0x00,0x00,0x00,0x3d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x3f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x2c,0x00,0x03,0x02,0x16,0x00,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x17,0x00,0x00,0x40, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x48,0x01,0x00,0x21,0x00,0x00, 0x00,0x02,0x18,0x00,0x02,0x17,0x00,0x02,0x16,0x00,0x32,0x00,0x18,0x00,0x10,0x00, 0x0c,0x00,0x00,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x38,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x3f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x04,0x02,0x19,0x00,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0x00,0x80,0x00,0x2a,0x00,0x19,0x00,0x00,0xda,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00, 0x19,0x80,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x41,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0e,0x00,0x10, 0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x00, 0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x33,0x80,0x00,0x00,0x0e,0x00,0x10,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x43,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x31,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01, 0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x33, 0x80,0x00,0x00,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x00,0x01,0x00,0x00,0x10,0x0f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x04,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x01,0x02,0x56,0x02, 0x10,0x04,0x00,0x00,0x00,0x46,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x02,0x02,0x56,0x02,0x10, 0x04,0x00,0x00,0x00,0x47,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x03,0x02,0x56,0x02,0x10,0x04, 0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x04,0x02,0x56,0x02,0x10,0x04,0x00, 0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00, 0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x19,0x02,0x00,0x00,0x00,0x10,0x22,0x01,0x10,0x04,0x00,0x00,0x00, 0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x19,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x4c, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x19,0x02,0x00,0x00,0x01,0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x49,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x4a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4b, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x49,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x45,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x46, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x47,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4c,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x48,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x25,0x04,0x00,0x00,0x00,0x4d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00, 0x00,0x25,0x04,0x00,0x00,0x00,0x4e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00, 0x00,0x00,0x4f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x50,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x00,0x08,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x45,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe2, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00, 0x01,0x10,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x32,0x00,0x00, 0x00,0x11,0x00,0x31,0x0f,0x00,0x29,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x15,0x80,0x12,0x00,0x01, 0x03,0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x02,0x00, 0x00,0x00,0x08,0x47,0x04,0x10,0x14,0x02,0x00,0x00,0x01,0x08,0x47,0x04,0x01,0x03, 0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00, 0x02,0x08,0x47,0x04,0x10,0x14,0x02,0x00,0x00,0x03,0x08,0x47,0x04,0x10,0x04,0x00, 0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0x51,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x02,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0x52,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x02,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x55,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x54,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x56,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x14,0x02,0x00,0x00,0x00,0x08,0x47,0x04,0x10,0x14,0x02,0x00,0x00,0x00, 0x0c,0x47,0x04,0x01,0x03,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x14,0x02,0x00,0x00,0x02,0x08,0x47,0x04,0x10,0x14,0x02,0x00,0x00,0x02,0x0c, 0x47,0x04,0x10,0x04,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x03,0x00,0x00,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x58,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x02, 0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x59,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0x5b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x02,0x00, 0x00,0x00,0x02,0x22,0x01,0x00,0x5a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x5b,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00, 0x00,0x00,0x56,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x5d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xef,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x56,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x19,0x01,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x5e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x5e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x04,0x00,0x00,0x00,0x5f, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02,0x00,0x00,0x00,0x00,0x23,0x01, 0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x61,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0xff,0x00, 0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x63,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x62,0x02,0x00,0x00,0x02,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04, 0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00, 0x04,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x65, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x8c,0x01,0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x67,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x8c,0x01,0x00,0x00,0x02,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x69,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8c, 0x01,0x00,0x00,0x03,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x6b,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x6c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8c,0x01, 0x00,0x00,0x04,0x02,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x08,0x65,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x67,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x67,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x69,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08, 0x69,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6b,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x08,0x6b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x00,0x6f,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x02,0x00,0x00,0x00, 0x00,0x23,0x01,0x00,0x72,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x6d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00, 0x73,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x70,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x74, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x02,0x00,0x00,0x00,0x04,0x22,0x01, 0x00,0x73,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x75,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00, 0x74,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x76,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x77,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x02,0x00, 0x21,0x01,0x00,0x3a,0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x5e,0x02,0x00,0x00,0x00,0x01,0x21,0x01, 0x0c,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x7a,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7b, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x19,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3d, 0x29,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00, 0x00,0x80,0x3f,0x0c,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x03,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x00,0x00,0x00,0x00, 0x7c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x7e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x03,0x02,0x1a,0x00,0x00,0x77,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x7e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x1b,0x00,0x00,0x7f, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x48,0x01,0x00,0x21,0x00,0x00, 0x00,0x02,0x1c,0x00,0x02,0x1b,0x00,0x02,0x1a,0x00,0x32,0x00,0x1c,0x00,0x12,0x00, 0x0c,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x7e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x7e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x7e,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x2c,0x00,0x04,0x02,0x1d,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0x00,0x80,0x00,0x2a,0x00,0x1d,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2a,0x00, 0x1d,0x80,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0e,0x00,0x10, 0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26,0x00, 0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x33,0x80,0x00,0x00,0x0e,0x00,0x10,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x81,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x81,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x31,0x12,0x00,0x29,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x14,0x80,0x13,0x00, 0x01,0x03,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02, 0x00,0x00,0x00,0x08,0x47,0x04,0x10,0x15,0x02,0x00,0x00,0x01,0x08,0x47,0x04,0x01, 0x03,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x15,0x02,0x00, 0x00,0x02,0x08,0x47,0x04,0x10,0x15,0x02,0x00,0x00,0x03,0x08,0x47,0x04,0x10,0x04, 0x00,0x00,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00, 0x00,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x02,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x83,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x84,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x86,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x85,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x87, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x86,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x88,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x04,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x08,0x47,0x04,0x10,0x15,0x02,0x00,0x00, 0x00,0x0c,0x47,0x04,0x01,0x03,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x15,0x02,0x00,0x00,0x02,0x08,0x47,0x04,0x10,0x15,0x02,0x00,0x00,0x02, 0x0c,0x47,0x04,0x10,0x04,0x00,0x00,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8a,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x8a,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b, 0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x8b,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x8d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x02, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x8e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8d,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x00,0x88,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x8f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x14, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x88,0x02, 0x00,0x00,0x00,0x01,0x21,0x01,0x19,0x01,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x90,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x04,0x00,0x00,0x00, 0x91,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x02,0x00,0x00,0x00,0x00,0x23, 0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x93,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0xff, 0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x95,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x94,0x02,0x00,0x00,0x02,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20, 0x04,0x00,0x00,0x00,0x96,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x02,0x00, 0x00,0x04,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x97,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x8c,0x01,0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x99, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x8c,0x01,0x00,0x00,0x02,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x9b,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x8c,0x01,0x00,0x00,0x03,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x9d,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x8c, 0x01,0x00,0x00,0x04,0x02,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x97,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x97,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x99,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x99,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x9b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9d,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x9d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x02,0x00, 0x00,0x00,0x00,0x23,0x01,0x00,0xa1,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x02,0x00,0x00, 0x00,0x00,0x23,0x01,0x00,0xa4,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x9f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00, 0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x02,0x00,0x00,0x01,0x00, 0x22,0x01,0x00,0xa2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xa6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x02,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0xa5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa7, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x02,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0xa6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xa8,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa7,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xa9,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xaa, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0xab,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x02, 0x00,0x21,0x01,0x00,0x3a,0x02,0x00,0x00,0x02,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x27,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x27,0x02,0x00,0x00,0x00,0x01,0x21, 0x01,0x0c,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xac,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xad,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x19,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80, 0x3d,0x29,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07, 0x00,0x00,0x80,0x3f,0x0c,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x28,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x03,0x00,0x00,0x00, 0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xaf,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x03,0x02,0x1e,0x00,0x00,0xa9,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x02,0x02,0x1f,0x00,0x00, 0xb1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x00,0x48,0x01,0x00,0x21,0x00, 0x00,0x00,0x02,0x20,0x00,0x02,0x1f,0x00,0x02,0x1e,0x00,0x32,0x00,0x20,0x00,0x13, 0x00,0x0c,0x00,0x00,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0xb0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xaa,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb0,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x2c,0x00,0x04,0x02,0x21,0x00,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x00,0x00,0x80,0x00,0x2a,0x00,0x21,0x00,0x00,0x2d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x2a, 0x00,0x21,0x80,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00, 0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0e,0x00, 0x10,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x26, 0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x33,0x80,0x00,0x00,0x0e,0x00,0x10,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb3,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x31,0x13,0x00,0x01,0x00,0x00,0x00,0x00,0xb5,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb3,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0e,0x00,0x29,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x24,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x08,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0xb6,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x01,0x00,0x00,0x10,0xb7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xb6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0f,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x10,0x04,0x00,0x00,0x00,0xb8,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x01, 0x02,0x56,0x02,0x10,0x04,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x02,0x02, 0x56,0x02,0x10,0x04,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x03,0x02,0x56, 0x02,0x10,0x04,0x00,0x00,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8c,0x01,0x00,0x00,0x04,0x02,0x56,0x02, 0x20,0x04,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x02, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00, 0x00,0xbd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xbe,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x02,0x00,0x00,0x02,0x00,0x23,0x01,0x05,0x03, 0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x62,0x02,0x00,0x00,0x04,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00, 0x10,0x04,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x04,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04, 0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xc5,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00, 0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xc7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x04,0x00,0x00, 0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x02,0x00,0x00,0x00,0x00, 0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xc9,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x02,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03, 0xff,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0xca,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x94,0x02,0x00,0x00,0x02,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00, 0x20,0x04,0x00,0x00,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x02, 0x00,0x00,0x04,0x00,0x23,0x01,0x05,0x03,0xff,0x00,0x00,0x00,0x10,0x04,0x00,0x00, 0x00,0xcc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xcd,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00, 0xce,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xcf,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xd0, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xd2,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc0,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01, 0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00, 0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x80,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xc0,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc2,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xce,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd0,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd2,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc0,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb8,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb9,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0xc6,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbb,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x25,0x04,0x00,0x00,0x00,0xd4,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00, 0x00,0xd5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0xd6,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00, 0x08,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x08,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00, 0x10,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x01,0x10,0x00,0x02,0x00, 0x44,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x32,0x00,0x00,0x00,0x11,0x00,0x31,0x01, 0x00,0x37,0x00,0x0b,0x00,0x08,0x08,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x01,0x00,0x00,0x00,0x00,0x31, 0x11,0x00,0x38,0x00,0x0c,0x00,0x08,0x08,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x45,0x01,0x00,0x00,0x00,0x00, 0x38,0x00,0x0c,0x01,0x08,0x04,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x86,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x30,0x03,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff, 0xff,0x29,0x03,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x48,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd9,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x1b,0x03,0x00, 0x00,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x03,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x08,0x00,0x80,0x3f,0x10, 0x03,0x00,0x00,0x00,0xdb,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xda,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0xdc,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x34,0x00,0x00,0x00,0x30,0x0e, 0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0xdd,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x1f,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd, 0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x22,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00, 0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xe0,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0xe0,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe2,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xe4,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0xe4, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0xe4,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x51,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x1b, 0x00,0x00,0x00,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x00,0x00,0x00,0x00,0x58,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x52, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0xe8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe5,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xea,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00, 0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x55,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4f,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x55,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xe1,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xeb,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0xe7, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xe1,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xec,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xe9,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00, 0x00,0x00,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xdd,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0xed,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x10,0xed,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x2c,0x00,0x03,0x02,0x22, 0x00,0x00,0xe3,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x2a,0x00,0x22,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0xec,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xee,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x22,0x00,0x00,0x00,0x00,0xec, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xde,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x30, 0x08,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x68, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf0,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xf0,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf3,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf5,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xf5,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf7,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x1b,0x04,0x00,0x00, 0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05, 0x07,0x00,0x00,0xc0,0xb4,0x0c,0x04,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x63,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00, 0x00,0x00,0xf9,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf6,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfb,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x68,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x66, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x04,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x62,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xf1,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfc, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xf8,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf1,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xfd,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf8,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xfa,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00, 0xfe,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xf2,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0xfe,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x04,0x03,0x02,0x23,0x00,0x00, 0xf4,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xef,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x2a,0x04,0x23,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01, 0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfd,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xff,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x30,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x01, 0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x01,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x01,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x05,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c, 0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x79, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x0a,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x06,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0a,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x78,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x76,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x0c,0x00,0x00,0x00,0x00,0x77, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x76,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x72,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0d,0x03,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, 0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x03, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x03,0x00, 0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0e,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x0e,0x03,0x00,0x00,0x00, 0x00,0x21,0x01,0x2c,0x00,0x04,0x02,0x24,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x24,0x00,0x00, 0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x6d, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x07,0x03,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x07,0x03,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x99,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80, 0x10,0x82,0x46,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80, 0x10,0x82,0x26,0x02,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80, 0x10,0x81,0x45,0x02,0x44,0x02,0x00,0x01,0xff,0x0f,0xff,0x0f,0x40,0x02,0x00,0x00, 0x60,0x01,0xa5,0x35,0xe4,0x01,0x00,0x01,0x24,0x02,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x01,0xc5,0x35,0xe4,0x01,0x00,0x01,0x44,0x02,0x00,0x00,0x61,0x00,0x03,0xa2, 0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02, 0x00,0x04,0x48,0x02,0x69,0x04,0x3a,0x68,0x72,0x35,0x31,0x00,0x69,0x04,0x01,0x68, 0x6a,0x35,0x21,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x05,0x27,0x04,0x03,0x00,0xa0, 0x00,0x00,0x00,0x00,0x61,0x00,0x06,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0xa4,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x06,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x61,0x05,0x06,0x62, 0x00,0x3a,0x01,0x00,0x61,0x05,0x06,0x62,0x60,0x01,0x01,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x05,0x04,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa1,0x03,0x80, 0x00,0x00,0x05,0x39,0x04,0x06,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x70,0x02,0x00,0x00, 0x50,0x04,0x01,0x00,0x04,0x02,0x00,0x15,0x04,0x04,0x00,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0xe5,0x01,0xc4,0x35,0x00,0x05,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0xd5,0x3a,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x04,0x00,0x11, 0x50,0x85,0x25,0x3a,0x04,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x20,0x00,0x00, 0x50,0x85,0x01,0x00,0x04,0x29,0x00,0x15,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x25,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xa4,0x01,0x00,0x02, 0x00,0x00,0x69,0x02,0x40,0x00,0x03,0x68,0x02,0x3a,0xe1,0xff,0x40,0x07,0x00,0x00, 0x60,0x86,0x25,0x03,0xe4,0x01,0x00,0x05,0xfe,0xff,0xfe,0xff,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x0f,0x00,0x0b,0x00,0x40,0x00,0x00,0x00, 0x60,0x81,0x45,0x35,0xe4,0x28,0x00,0x05,0xf8,0xff,0xf8,0xff,0x31,0xa2,0x03,0x80, 0x00,0x00,0x05,0x1b,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x35,0x68, 0x60,0x3a,0x01,0x00,0x61,0x22,0x03,0x00,0x50,0x20,0x85,0x02,0xa5,0x1d,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x31,0x03,0x00,0x50,0x20,0x05,0x06,0xa5,0x1e,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x20,0x05,0x0b,0x2d,0x1d,0x54,0x00, 0x00,0x00,0x00,0x00,0x40,0x03,0x03,0x00,0x60,0x00,0x05,0x04,0x25,0x1d,0x54,0x05, 0x85,0x02,0x46,0x00,0x40,0x03,0x03,0x00,0x60,0x00,0x05,0x05,0x25,0x1e,0x54,0x05, 0x05,0x06,0x46,0x00,0x40,0x03,0x04,0x00,0x60,0x00,0x05,0x0c,0x25,0x1d,0x54,0x05, 0x05,0x0b,0x58,0x00,0x41,0x03,0x20,0x24,0x06,0x04,0x60,0x04,0x49,0x00,0x04,0xa1, 0x02,0x04,0x00,0x04,0x41,0x04,0x20,0x24,0x06,0x05,0x60,0x05,0x49,0x00,0x05,0xa1, 0x02,0x05,0x00,0x05,0x41,0x05,0x20,0x24,0x06,0x0c,0x60,0x0c,0x49,0x00,0x0c,0xa1, 0x02,0x0c,0x00,0x0c,0x41,0x00,0x20,0x24,0x06,0x0d,0x60,0x0d,0x49,0x00,0x0d,0xa1, 0x02,0x0d,0x00,0x0d,0x40,0x05,0x07,0xa1,0x02,0x05,0x00,0x04,0x40,0x02,0x06,0xa1, 0x02,0x0d,0x00,0x0c,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x08,0x85,0x07,0x34,0x06, 0x05,0x07,0x34,0x00,0x40,0x02,0x02,0x00,0x60,0x06,0x25,0x02,0x85,0x06,0x34,0x06, 0x05,0x06,0x34,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x09,0x45,0x08,0x22,0x06, 0x05,0x08,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x45,0x03,0x65,0x02,0x22,0x06, 0x25,0x02,0x22,0x00,0x40,0x02,0x0a,0xa8,0x12,0x09,0x11,0x09,0x40,0x02,0x00,0x00, 0x60,0x06,0x05,0x04,0x44,0x03,0x00,0x06,0x64,0x03,0x00,0x00,0x68,0x02,0x00,0x00, 0x20,0x82,0x05,0x03,0x04,0x0a,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00, 0x20,0x82,0x25,0x03,0x04,0x04,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x02,0x3b,0x68, 0x06,0x03,0x01,0x00,0x61,0x02,0x3b,0x68,0xce,0x03,0x01,0x00,0x38,0x93,0x01,0x00, 0xa0,0x0a,0x05,0x3b,0x05,0x3b,0x22,0x40,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x44,0x3a,0x00,0x00,0x00,0x00,0xe8,0x28,0x00,0x00,0x70,0x00,0x00,0x00, 0x60,0x86,0x01,0x00,0x24,0x35,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x00, 0x60,0x81,0x45,0x35,0xf4,0x28,0x00,0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x25,0x35,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x01, 0x60,0x85,0x65,0x35,0x24,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x44,0x3a,0x00,0x00,0x00,0x00,0x88,0x28,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x06,0x65,0x35,0xa4,0x35,0x00,0x06,0x64,0x35,0x00,0x00,0x70,0x04,0x00,0x00, 0x60,0x86,0x01,0x00,0x24,0x35,0x00,0x15,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x45,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x00,0x00,0x00, 0x60,0x86,0x25,0x02,0xc4,0x35,0x00,0x05,0xff,0xff,0xff,0xff,0x69,0x04,0x35,0x68, 0xe2,0x35,0x21,0x00,0x62,0x03,0x00,0x01,0x60,0x85,0x65,0x02,0x44,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x86,0x45,0x3b,0x64,0x35,0x00,0x05, 0xfc,0xff,0xfc,0xff,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x3b,0x24,0x02,0x00,0x06, 0x64,0x02,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x05,0x03,0x62, 0x40,0x3b,0x01,0x00,0x61,0x05,0x00,0x80,0xa0,0x0a,0x25,0x03,0x64,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x68,0x00,0x05,0x68,0x85,0x28,0x31,0x00,0x31,0xa4,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x10,0x81,0x15,0x05,0xf4,0x28,0x00,0x01,0x03,0x00,0x03,0x00,0x40,0x02,0x00,0x00, 0x50,0x85,0x05,0x05,0x04,0x05,0x00,0x05,0xff,0xff,0xff,0xff,0x40,0x02,0x00,0x00, 0x50,0x85,0x15,0x05,0x14,0x05,0x00,0x05,0xff,0xff,0xff,0xff,0x70,0x02,0x80,0x00, 0x20,0x02,0x01,0x00,0xa4,0x35,0x00,0x51,0x04,0x05,0x00,0x00,0x70,0x02,0x00,0x00, 0x20,0x02,0x01,0x00,0xc4,0x35,0x00,0x51,0x14,0x05,0x00,0x00,0x62,0x00,0x80,0x01, 0x10,0x81,0x35,0x02,0x44,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01, 0x10,0x81,0x55,0x02,0x44,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0xe2, 0x66,0x31,0x01,0x00,0x65,0x02,0x80,0x00,0x10,0x01,0x01,0x00,0x34,0x02,0x00,0x21, 0x54,0x02,0x00,0x00,0x62,0x34,0x00,0x01,0x10,0x81,0x25,0x03,0x44,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x00,0x3a,0xe2,0xa6,0x31,0x01,0x00,0x62,0x00,0x80,0x01, 0x40,0x85,0x86,0x35,0x44,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x00, 0x60,0x86,0x01,0x00,0xa4,0x35,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00, 0x90,0x49,0x85,0x02,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x62,0x00,0x80,0x01, 0x10,0x81,0x15,0x03,0x44,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xe2, 0x06,0x31,0x01,0x00,0x65,0x02,0x00,0x00,0x10,0x01,0x01,0x00,0x14,0x03,0x00,0x21, 0x24,0x03,0x00,0x00,0x61,0x07,0x00,0x80,0x10,0x01,0x01,0x31,0x24,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x55,0x3a,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x40,0x85,0xa6,0x35,0x44,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x35,0x00,0x25, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0x15,0x05,0x44,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x24,0x03,0x80,0x90,0x09,0x05,0x35,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x10,0x81,0x05,0x04,0x44,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01,0x10,0x81,0x15,0x04,0x44,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x61,0x03,0x03,0x00,0x90,0x09,0x85,0x3b,0x05,0x35,0x46,0x00, 0x00,0x00,0x00,0x00,0x65,0x02,0x80,0x00,0x10,0x01,0x01,0x00,0x04,0x04,0x00,0x21, 0x14,0x04,0x00,0x00,0x61,0x00,0x3a,0xe2,0x3e,0x31,0x01,0x00,0x62,0x00,0x80,0x01, 0x40,0x85,0x96,0x35,0x44,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x80,0x01, 0x10,0x81,0x05,0x05,0x44,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00, 0x10,0x01,0x01,0x00,0x04,0x05,0x00,0x21,0x14,0x05,0x00,0x00,0x62,0x00,0x00,0x01, 0x40,0x85,0xb6,0x35,0x44,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x44,0x02,0x00,0x00,0x00,0x00,0xc8,0x21,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0xc4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x17,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x21,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2d,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x2b,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x03,0x00, 0x60,0x05,0x05,0x16,0x85,0x3b,0x46,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x40,0x04,0x03,0xa8,0x02,0x3a,0x11,0x16,0x40,0x00,0x00,0x00, 0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06,0x24,0x16,0x00,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x95,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x25,0x04,0x00, 0x60,0x00,0x05,0x17,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x21,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x2d,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x2b,0x85,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0x54,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x25,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x23,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x19,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x14,0xa0,0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8,0x2a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00, 0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06,0x64,0x16,0x00,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x96,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x26,0x04,0x00, 0x60,0x00,0x05,0x25,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x23,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x19,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x14,0x85,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0x44,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x12,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x10,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0e,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x0c,0xa0,0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8,0x0a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00, 0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06,0xa4,0x16,0x00,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x97,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x27,0x04,0x00, 0x60,0x00,0x05,0x12,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x10,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x0e,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x0c,0x85,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0a,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x08,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x06,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x2f,0xa0,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8,0x4a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00, 0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06,0xe4,0x16,0x00,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x31,0x98,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x28,0x04,0x00, 0x60,0x00,0x05,0x0a,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x08,0x85,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x06,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x2f,0x85,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x25,0x02,0xb4,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x05,0x03,0xa4,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x40,0x04,0x96,0x35,0x94,0x35,0x00,0x05,0x24,0x02,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x05,0x04,0x84,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00, 0x40,0x04,0x96,0x35,0x94,0x35,0x00,0x05,0x04,0x03,0x00,0x00,0x40,0x01,0x00,0x00, 0x40,0x04,0x96,0x35,0x94,0x35,0x00,0x05,0x04,0x04,0x00,0x00,0x68,0x01,0x00,0x00, 0x00,0x80,0x36,0x3a,0x94,0x35,0x00,0x01,0x01,0x00,0x01,0x00,0x61,0x00,0x04,0x00, 0x60,0x00,0x05,0x33,0x94,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x04,0x00, 0x60,0x00,0x05,0x17,0x34,0x3a,0x00,0x06,0x05,0x17,0x46,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x21,0x34,0x3a,0x00,0x06,0x05,0x21,0x46,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x2d,0x34,0x3a,0x00,0x06,0x05,0x2d,0x46,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x2b,0x34,0x3a,0x00,0x06,0x05,0x2b,0x46,0x00,0x40,0x04,0x17,0xa0, 0x02,0x17,0x00,0x25,0x40,0x04,0x21,0xa0,0x02,0x21,0x00,0x23,0x40,0x04,0x2d,0xa0, 0x02,0x2d,0x00,0x19,0x40,0x04,0x2b,0xa0,0x02,0x2b,0x00,0x14,0x40,0x04,0x17,0xa0, 0x02,0x17,0x00,0x12,0x40,0x04,0x21,0xa0,0x02,0x21,0x00,0x10,0x40,0x04,0x2d,0xa0, 0x02,0x2d,0x00,0x0e,0x40,0x04,0x2b,0xa0,0x02,0x2b,0x00,0x0c,0x61,0x00,0x19,0x60, 0x00,0x33,0x00,0x00,0x40,0x05,0x17,0xa0,0x02,0x17,0x00,0x0a,0x40,0x05,0x21,0xa0, 0x02,0x21,0x00,0x08,0x40,0x05,0x2d,0xa0,0x02,0x2d,0x00,0x06,0x40,0x05,0x2b,0xa0, 0x02,0x2b,0x00,0x2f,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0xf8,0x1f,0x00,0x00,0x61,0x05,0x31,0x60,0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60, 0x00,0x33,0x00,0x00,0x61,0x06,0x17,0x60,0x00,0x21,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0xd0,0x1f,0x00,0x00,0x61,0x02,0x21,0x60, 0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60,0x00,0x33,0x00,0x00,0x61,0x07,0x17,0x60, 0x00,0x2d,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0xa8,0x1f,0x00,0x00,0x61,0x02,0x23,0x60,0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60, 0x00,0x33,0x00,0x00,0x61,0x00,0x17,0x60,0x00,0x2b,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0x80,0x1f,0x00,0x00,0x61,0x00,0x07,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02, 0x00,0x00,0x19,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x07,0x00,0x00,0x00,0x00, 0x07,0x00,0x01,0x00,0x61,0x00,0x07,0x62,0x40,0x3b,0x01,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x07,0x64,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x31,0xa9,0x03,0x80, 0x00,0x00,0x05,0x08,0x04,0x07,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x31,0xd4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x00,0x35,0x02,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x03,0x00, 0x60,0x05,0x05,0x03,0x05,0x35,0x46,0x05,0x05,0x35,0x46,0x00,0x62,0x04,0x80,0x01, 0x60,0x85,0x65,0x3a,0x24,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x03,0x83,0x00, 0x50,0x00,0x01,0x00,0x04,0x02,0x00,0x15,0x34,0x02,0x00,0x00,0x68,0x03,0x03,0x00, 0x20,0x82,0x05,0x03,0x05,0x03,0x46,0x01,0x04,0x00,0x04,0x00,0x62,0x00,0x83,0x01, 0x50,0x85,0x05,0x04,0x24,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x61,0x00,0x25,0x60, 0x00,0x17,0x00,0x00,0x41,0x02,0x03,0x00,0x50,0x05,0x05,0x04,0x05,0x04,0x46,0x05, 0x04,0x03,0x20,0x00,0x61,0x00,0x03,0x00,0x90,0x49,0x85,0x02,0x00,0x00,0x00,0x00, 0x04,0x00,0x04,0x00,0x40,0x02,0x02,0x00,0x60,0x05,0x05,0x05,0x45,0x04,0x34,0x05, 0x05,0x04,0x34,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0x05,0x06,0x45,0x05,0x22,0x06, 0x05,0x05,0x22,0x00,0x40,0x01,0x00,0x00,0x60,0x06,0xe5,0x3a,0x04,0x06,0x00,0x06, 0x24,0x06,0x00,0x00,0x61,0x29,0x03,0x80,0x90,0x09,0x05,0x3e,0x05,0x08,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x03,0x00,0x90,0x09,0x85,0x3b,0x05,0x3e,0x46,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x44,0x02,0x00,0x00,0x00,0x00, 0x80,0x1b,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0xc4,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x17,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2b,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x37,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x35,0xa0, 0x00,0x00,0x01,0x00,0x61,0x07,0x03,0x00,0x60,0x05,0x05,0x16,0x85,0x3b,0x46,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x04,0x03,0xa8, 0x02,0x3a,0x11,0x16,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06, 0x24,0x16,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x2a,0x04,0x00,0x60,0x00,0x05,0x17,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x2b,0x85,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x37,0x05,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x35,0x85,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x54,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x0c,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0a,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x08,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x06,0xa0, 0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8, 0x2a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06, 0x64,0x16,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x31,0x9b,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x2b,0x04,0x00,0x60,0x00,0x05,0x0c,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x0a,0x85,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x08,0x05,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x06,0x85,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x31,0x44,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x14,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x12,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x10,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x0e,0xa0, 0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8, 0x0a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06, 0xa4,0x16,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x31,0x9c,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x2c,0x04,0x00,0x60,0x00,0x05,0x14,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x12,0x85,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x10,0x05,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x0e,0x85,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x2f,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x2d,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x19,0xa0,0x00,0x00,0x01,0x00,0x61,0x00,0x03,0xa0, 0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x00,0x00,0x00,0x61,0x00,0x03,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x00,0x03,0xa8, 0x4a,0x3a,0x11,0x16,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x03,0xe4,0x01,0x00,0x06, 0xe4,0x16,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x31,0x9d,0x03,0x80,0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x2d,0x04,0x00,0x60,0x00,0x05,0x2f,0x05,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x2d,0x85,0x04,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x19,0x05,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x00,0x05,0x03,0x85,0x05,0x46,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x17,0x34,0x3a,0x00,0x06, 0x05,0x17,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x2b,0x34,0x3a,0x00,0x06, 0x05,0x2b,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x37,0x34,0x3a,0x00,0x06, 0x05,0x37,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x35,0x34,0x3a,0x00,0x06, 0x05,0x35,0x46,0x00,0x40,0x04,0x17,0xa0,0x02,0x17,0x00,0x0c,0x40,0x04,0x2b,0xa0, 0x02,0x2b,0x00,0x0a,0x40,0x04,0x37,0xa0,0x02,0x37,0x00,0x08,0x40,0x04,0x35,0xa0, 0x02,0x35,0x00,0x06,0x40,0x04,0x17,0xa0,0x02,0x17,0x00,0x14,0x40,0x04,0x2b,0xa0, 0x02,0x2b,0x00,0x12,0x40,0x04,0x37,0xa0,0x02,0x37,0x00,0x10,0x40,0x04,0x35,0xa0, 0x02,0x35,0x00,0x0e,0x40,0x04,0x17,0xa0,0x02,0x17,0x00,0x2f,0x40,0x04,0x2b,0xa0, 0x02,0x2b,0x00,0x2d,0x40,0x04,0x37,0xa0,0x02,0x37,0x00,0x19,0x40,0x04,0x35,0xa0, 0x02,0x35,0x00,0x03,0x61,0x00,0x19,0x60,0x00,0x33,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0x30,0x1a,0x00,0x00,0x61,0x06,0x3c,0x60, 0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60,0x00,0x33,0x00,0x00,0x61,0x07,0x17,0x60, 0x00,0x2b,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x08,0x1a,0x00,0x00,0x61,0x02,0x2b,0x60,0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60, 0x00,0x33,0x00,0x00,0x61,0x07,0x17,0x60,0x00,0x37,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0xe0,0x19,0x00,0x00,0x61,0x02,0x2d,0x60, 0x00,0x17,0x00,0x00,0x61,0x00,0x19,0x60,0x00,0x33,0x00,0x00,0x61,0x00,0x17,0x60, 0x00,0x35,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0xb8,0x19,0x00,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x25,0x02,0x14,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x05,0x04,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x61,0x00,0x00,0x80,0x50,0x00,0x15,0x04,0x14,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x50,0x04,0x01,0x00,0x0c,0x02,0x00,0x15, 0x24,0x02,0x00,0x00,0x41,0x00,0x03,0x00,0x60,0x05,0x05,0x03,0x05,0x3e,0x46,0x05, 0x05,0x3e,0x46,0x00,0x61,0x00,0x16,0xe2,0x06,0x30,0x01,0x00,0x62,0x05,0x00,0x01, 0x60,0x85,0x25,0x04,0x04,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x05,0x03,0x00, 0x50,0x00,0x01,0x00,0x0c,0x02,0x00,0x15,0x14,0x04,0x00,0x00,0x68,0x04,0x03,0x00, 0x20,0x82,0x05,0x03,0x05,0x03,0x46,0x01,0x04,0x00,0x04,0x00,0x62,0x00,0x03,0x01, 0x50,0x85,0x05,0x05,0x04,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x80, 0x60,0x06,0x01,0x20,0xe4,0x3a,0x00,0x01,0x64,0x3a,0x00,0x00,0x41,0x02,0x03,0x00, 0x50,0x05,0x05,0x05,0x05,0x05,0x46,0x05,0x04,0x03,0x20,0x00,0x49,0x00,0x00,0x00, 0x60,0x06,0x05,0x08,0xe4,0x3a,0x00,0x06,0x64,0x3a,0x00,0x00,0x40,0x02,0x02,0x00, 0x60,0x05,0x05,0x06,0x45,0x05,0x34,0x05,0x05,0x05,0x34,0x00,0x40,0x07,0x00,0x00, 0x60,0x06,0x65,0x3a,0x64,0x3a,0x00,0x16,0x24,0x04,0x00,0x00,0x40,0x02,0x01,0x00, 0x60,0x06,0x05,0x07,0x45,0x06,0x22,0x06,0x05,0x06,0x22,0x00,0x61,0x00,0x2f,0x60, 0x00,0x17,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x25,0x16,0x04,0x07,0x00,0x06, 0x24,0x07,0x00,0x00,0x41,0x01,0x00,0x80,0x60,0x06,0x01,0x20,0x24,0x16,0x00,0x01, 0x24,0x04,0x00,0x00,0x49,0x00,0x00,0x80,0x60,0x06,0x05,0x09,0x24,0x16,0x00,0x06, 0x24,0x04,0x00,0x00,0x61,0x01,0x3b,0x68,0xa8,0x09,0x01,0x00,0x40,0x01,0x00,0x00, 0x60,0x06,0xa5,0x3b,0xa4,0x3b,0x00,0x06,0x04,0x08,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0x28,0x16,0x00,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80, 0x10,0x01,0x01,0x30,0x04,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x05,0x04,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x03,0x00,0x11, 0x50,0x85,0x05,0x03,0x24,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x70,0x07,0x00,0x00, 0x60,0x86,0x01,0x00,0xa4,0x3b,0x00,0x35,0x07,0x00,0x07,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x05,0x05,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x04,0x80,0x00, 0x50,0x04,0x01,0x00,0x0c,0x02,0x00,0x15,0x04,0x04,0x00,0x00,0x70,0x04,0x00,0x11, 0x50,0x05,0x01,0x00,0x24,0x3a,0x00,0x25,0x04,0x03,0x00,0x00,0x61,0x00,0x16,0xe2, 0x3e,0x31,0x01,0x00,0x70,0x04,0x80,0x00,0x50,0x04,0x01,0x00,0x04,0x02,0x00,0x15, 0x04,0x05,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0x07,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x03,0x04,0x3c,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x06,0x04,0x2b,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x07,0x04,0x2d,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x0a,0x04,0x2f,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0b,0x15,0x1c,0x56,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x0d,0x15,0x1e,0x56,0x00, 0x00,0x00,0x00,0x00,0x62,0x06,0x04,0x00,0x00,0x00,0x06,0x04,0x04,0x31,0x30,0x55, 0x05,0x03,0x58,0x00,0x62,0x06,0x04,0x00,0x00,0x00,0x06,0x05,0x04,0x21,0x30,0x55, 0x05,0x06,0x58,0x00,0x62,0x06,0x04,0x00,0x00,0x00,0x06,0x08,0x04,0x23,0x30,0x55, 0x05,0x07,0x58,0x00,0x62,0x06,0x04,0x00,0x00,0x00,0x06,0x09,0x04,0x25,0x30,0x55, 0x05,0x0a,0x58,0x00,0x62,0x03,0x05,0x00,0x00,0x00,0x06,0x04,0x04,0x04,0x20,0x45, 0x05,0x0b,0x46,0x00,0x62,0x02,0x05,0x00,0x00,0x00,0x06,0x08,0x04,0x08,0x20,0x45, 0x05,0x0d,0x46,0x00,0x62,0x00,0x04,0x00,0x00,0x00,0x06,0x0f,0x04,0x31,0x30,0x45, 0x05,0x03,0x58,0x00,0x62,0x00,0x04,0x00,0x00,0x00,0x06,0x10,0x04,0x21,0x30,0x45, 0x05,0x06,0x58,0x00,0x62,0x00,0x04,0x00,0x00,0x00,0x06,0x11,0x04,0x23,0x30,0x45, 0x05,0x07,0x58,0x00,0x62,0x00,0x04,0x00,0x00,0x00,0x06,0x12,0x04,0x25,0x30,0x45, 0x05,0x0a,0x58,0x00,0x61,0x06,0x05,0x00,0x50,0x00,0x05,0x13,0x04,0x04,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x06,0x05,0x00,0x50,0x00,0x05,0x17,0x04,0x08,0x20,0x00, 0x00,0x00,0x00,0x00,0x62,0x02,0x05,0x00,0x00,0x00,0x06,0x15,0x04,0x0f,0x20,0x55, 0x05,0x13,0x46,0x00,0x62,0x02,0x05,0x00,0x00,0x00,0x06,0x19,0x04,0x11,0x20,0x55, 0x05,0x17,0x46,0x00,0x61,0x02,0x05,0x00,0x00,0x00,0x05,0x21,0x04,0x15,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x00,0x00,0x05,0x22,0x04,0x19,0x20,0x00, 0x00,0x00,0x00,0x00,0x61,0x01,0x04,0x00,0x50,0x20,0x05,0x0b,0xd5,0x21,0x44,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x20,0x05,0x07,0x9d,0x21,0x44,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x0c,0x95,0x21,0x44,0x05, 0x05,0x0b,0x58,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x08,0x95,0x21,0x44,0x05, 0x05,0x07,0x58,0x00,0x41,0x02,0x20,0x24,0x06,0x0c,0x60,0x0c,0x49,0x00,0x0c,0xa1, 0x02,0x0c,0x00,0x0c,0x41,0x00,0x20,0x24,0x06,0x0d,0x60,0x0d,0x49,0x00,0x0d,0xa1, 0x02,0x0d,0x00,0x0d,0x41,0x05,0x20,0x24,0x06,0x08,0x60,0x08,0x49,0x00,0x08,0xa1, 0x02,0x08,0x00,0x08,0x41,0x00,0x20,0x24,0x06,0x09,0x60,0x09,0x49,0x00,0x09,0xa1, 0x02,0x09,0x00,0x09,0x40,0x05,0x03,0xa1,0x02,0x0d,0x00,0x0c,0x40,0x02,0x0a,0xa1, 0x02,0x09,0x00,0x08,0x40,0x02,0x02,0x00,0x60,0x06,0x25,0x02,0x85,0x03,0x34,0x06, 0x05,0x03,0x34,0x00,0x40,0x02,0x02,0x00,0x60,0x06,0x45,0x06,0x85,0x0a,0x34,0x06, 0x05,0x0a,0x34,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x04,0x65,0x02,0x22,0x06, 0x25,0x02,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x03,0x85,0x06,0x22,0x06, 0x45,0x06,0x22,0x00,0x40,0x02,0x05,0xa8,0x12,0x04,0x11,0x04,0x40,0x02,0x00,0x00, 0x60,0x06,0x25,0x02,0x04,0x03,0x00,0x06,0x24,0x03,0x00,0x00,0x68,0x02,0x00,0x00, 0x20,0x82,0x05,0x06,0x04,0x05,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00, 0x20,0x82,0x25,0x06,0x24,0x02,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x02,0x04,0x68, 0x06,0x06,0x01,0x00,0x61,0x02,0x04,0x68,0xce,0x06,0x01,0x00,0x61,0x00,0x04,0x00, 0x50,0x20,0x05,0x07,0x15,0x1d,0x56,0x00,0x00,0x00,0x00,0x00,0x38,0xae,0x01,0x00, 0xa0,0x0a,0x05,0x04,0x05,0x04,0x22,0x40,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x20,0x05,0x0a,0x15,0x1e,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x20,0x05,0x03,0x15,0x1f,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x20,0x05,0x05,0x15,0x1c,0x56,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x04,0x00, 0x60,0x00,0x05,0x08,0x85,0x21,0x46,0x05,0x05,0x07,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x00,0x05,0x0d,0x05,0x22,0x46,0x05,0x05,0x0a,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x00,0x05,0x0f,0x85,0x22,0x46,0x05,0x05,0x03,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x00,0x05,0x0b,0x05,0x21,0x46,0x05,0x05,0x05,0x58,0x00,0x01,0x2e,0x00,0xe8, 0x01,0x00,0x11,0x00,0x40,0x23,0x01,0x00,0xa0,0x0a,0x05,0x3b,0x05,0x3b,0x22,0x0a, 0x05,0x04,0x22,0x02,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x08,0x05,0x08,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x0d,0x05,0x0d,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x0f,0x05,0x0f,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x0b,0x05,0x0b,0x46,0x00, 0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00,0xa0,0x0a,0x45,0x0a,0x24,0x3b,0x00,0x0a, 0x24,0x3b,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x06,0x25,0x03,0xa4,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x04,0x04,0x00,0x60,0x05,0x05,0x04,0x04,0x0f,0x20,0x05, 0x04,0x08,0x20,0x00,0x40,0x04,0x04,0x00,0x60,0x05,0x05,0x11,0x04,0x0d,0x20,0x05, 0x04,0x0b,0x20,0x00,0x5b,0x04,0x00,0x00,0xa0,0x02,0x44,0x0a,0x44,0x0a,0x02,0x02, 0x04,0x3b,0x04,0x3b,0x40,0x02,0x04,0xa0,0x02,0x04,0x00,0x11,0x40,0x02,0x00,0x00, 0xa0,0x0a,0x45,0x0a,0x44,0x0a,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x02,0x06,0xa1, 0x02,0x05,0x00,0x04,0x38,0xaf,0x00,0x00,0xa0,0x0a,0x45,0x0a,0x44,0x0a,0x00,0x40, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0xa8,0x00,0x00,0x81,0x3d,0x61,0x00,0x04,0xa8, 0x60,0x00,0x81,0x3f,0x40,0x03,0x02,0x00,0x60,0x06,0x25,0x02,0x85,0x06,0x34,0x06, 0x05,0x06,0x34,0x00,0x5b,0xaf,0x00,0x00,0xa0,0x02,0x04,0x04,0x24,0x04,0x02,0x02, 0x04,0x04,0x44,0x0a,0x41,0x00,0x00,0x00,0x60,0x05,0x45,0x03,0x04,0x29,0x00,0x05, 0x04,0x29,0x00,0x00,0x40,0x03,0x01,0x00,0x60,0x06,0x05,0x07,0x65,0x02,0x22,0x06, 0x25,0x02,0x22,0x00,0x38,0x90,0x00,0x00,0xa0,0x0a,0x25,0x02,0x04,0x04,0x00,0x10, 0x00,0x00,0x00,0x00,0x61,0x02,0x0a,0xa8,0x47,0x03,0x01,0x00,0x40,0x02,0x00,0x00, 0x60,0x06,0x25,0x3a,0x04,0x07,0x00,0x06,0x24,0x07,0x00,0x00,0x41,0xa0,0x0a,0x28, 0x10,0x0a,0x11,0x02,0x41,0x02,0x00,0x00,0x60,0x05,0x05,0x03,0x24,0x3a,0x00,0x05, 0x24,0x3a,0x00,0x00,0x61,0x02,0x3a,0xe8,0xa5,0x0a,0x01,0x00,0x61,0x00,0x3b,0xa8, 0xa8,0x00,0x01,0x00,0x70,0x02,0x00,0x00,0x60,0x06,0x01,0x00,0x04,0x03,0x00,0x46, 0xc4,0x3a,0x00,0x00,0x70,0x00,0x00,0x11,0x20,0x82,0x01,0x00,0x04,0x03,0x00,0x32, 0x00,0x48,0x01,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0x44,0x3a,0xc4,0x3a,0x85,0x05, 0x24,0x3a,0x24,0x3a,0x61,0x00,0x00,0x80,0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0xc4,0x3a,0xc4,0x3a,0x05,0x05, 0x24,0x3a,0x24,0x3a,0x70,0x03,0x00,0x00,0x60,0x86,0x01,0x00,0x44,0x3a,0x00,0x56, 0x00,0x00,0x80,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x3b,0x44,0x3a,0x00,0x05, 0x08,0x00,0x08,0x00,0x61,0x03,0x00,0x00,0xa0,0x0a,0x65,0x3a,0xc4,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x01,0x60,0x85,0x05,0x3b,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x11,0x60,0x85,0x25,0x3a,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x40,0x10,0x00,0x00,0x41,0xb3,0x20,0x22,0x76,0x3b,0x11,0x3b,0x6c,0x00,0x00,0x00, 0x60,0x86,0x65,0x3a,0xc4,0x3a,0x00,0x05,0x08,0x00,0x08,0x00,0x49,0x00,0x3b,0xa8, 0x72,0x3b,0x11,0x3b,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x3b,0x44,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0xa4,0x3b,0x00,0x01, 0x24,0x3a,0x00,0x00,0x49,0x00,0x00,0x80,0x60,0x06,0x05,0x03,0xa4,0x3b,0x00,0x06, 0x24,0x3a,0x00,0x00,0x61,0x01,0x3b,0x68,0xa8,0x03,0x01,0x00,0x40,0x93,0x00,0x00, 0x60,0x06,0xa5,0x3b,0xa4,0x3b,0x00,0x06,0x04,0x3b,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x86,0x65,0x3a,0xa4,0x3b,0x00,0x05,0x01,0x01,0x01,0x01,0x69,0x00,0x00,0x00, 0x60,0x86,0xa5,0x3b,0xa4,0x3b,0x00,0x05,0x08,0x00,0x08,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0x98,0x0f,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0xa6,0x25,0x02,0xa4,0x3b,0x00,0x05,0x00,0x01,0x00,0x01,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x03,0x15,0x1c,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x0f,0x05,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x12,0x85,0x21,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x15,0x05,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x04,0x00, 0x60,0x06,0x05,0x04,0x24,0x02,0x00,0x05,0x05,0x03,0x58,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x03,0x85,0x22,0x46,0x00,0x00,0x00,0x00,0x00,0x41,0x05,0x04,0x00, 0x60,0x06,0x05,0x10,0xa4,0x3b,0x00,0x05,0x05,0x0f,0x58,0x00,0x41,0x05,0x04,0x00, 0x60,0x06,0x05,0x13,0xa4,0x3b,0x00,0x05,0x05,0x12,0x58,0x00,0x41,0x05,0x04,0x00, 0x60,0x06,0x05,0x16,0xa4,0x3b,0x00,0x05,0x05,0x15,0x58,0x00,0x41,0x04,0x04,0x00, 0x60,0x06,0x05,0x18,0xa4,0x3b,0x00,0x05,0x05,0x03,0x58,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x06,0x15,0x1d,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x09,0x15,0x1e,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x0c,0x15,0x1f,0x56,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x10,0x60, 0x02,0x10,0x00,0x08,0x40,0x07,0x13,0x60,0x02,0x13,0x00,0x08,0x40,0x07,0x16,0x60, 0x02,0x16,0x00,0x08,0x40,0x07,0x18,0x60,0x02,0x18,0x00,0x08,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x07,0x24,0x02,0x00,0x05,0x05,0x06,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x0a,0x24,0x02,0x00,0x05,0x05,0x09,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x0d,0x24,0x02,0x00,0x05,0x05,0x0c,0x58,0x00,0x40,0x07,0x10,0xa0, 0x02,0x10,0x00,0x04,0x40,0x04,0x13,0xa0,0x02,0x13,0x00,0x07,0x40,0x04,0x16,0xa0, 0x02,0x16,0x00,0x0a,0x40,0x04,0x18,0xa0,0x02,0x18,0x00,0x0d,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x10,0x05,0x10,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x13,0x05,0x13,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x16,0x05,0x16,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x18,0x05,0x18,0x46,0x01,0x08,0x00,0x08,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x05,0x04,0x04,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x85,0x04,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x05,0x05,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x85,0x05,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x0c,0x00,0x00,0x61,0x00,0x16,0xa8, 0x00,0x00,0x01,0x00,0x20,0x00,0x80,0x91,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x04,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x85,0x02,0x47,0x22,0x64,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x05,0x47,0x24,0x64,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x60,0x00,0x05,0x03,0x47,0x21,0x64,0x05, 0x85,0x02,0x46,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x85,0x02,0x67,0x21,0x64,0x00, 0x00,0x00,0x00,0x00,0x40,0x03,0x03,0x00,0x60,0x00,0x05,0x04,0x47,0x23,0x64,0x05, 0x05,0x05,0x46,0x00,0x61,0x00,0x03,0x00,0x50,0x20,0x05,0x05,0x67,0x23,0x64,0x00, 0x00,0x00,0x00,0x00,0x41,0x04,0x20,0x24,0x06,0x03,0x60,0x03,0x40,0x04,0x03,0x00, 0x60,0x00,0x05,0x0b,0x47,0x21,0x64,0x05,0x85,0x02,0x46,0x00,0x49,0x00,0x03,0xa1, 0x02,0x03,0x00,0x03,0x40,0x04,0x03,0x00,0x60,0x00,0x05,0x0c,0x47,0x23,0x64,0x05, 0x05,0x05,0x46,0x00,0x41,0x06,0x20,0x24,0x06,0x04,0x60,0x04,0x49,0x00,0x04,0xa1, 0x02,0x04,0x00,0x04,0x41,0x05,0x20,0x24,0x06,0x0b,0x60,0x0b,0x49,0x00,0x0b,0xa1, 0x02,0x0b,0x00,0x0b,0x41,0x05,0x20,0x24,0x06,0x0c,0x60,0x0c,0x49,0x00,0x0c,0xa1, 0x02,0x0c,0x00,0x0c,0x40,0x05,0x06,0xa1,0x02,0x04,0x00,0x03,0x40,0x02,0x03,0xa1, 0x02,0x0c,0x00,0x0b,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x07,0x85,0x06,0x34,0x06, 0x05,0x06,0x34,0x00,0x40,0x02,0x02,0x00,0x60,0x06,0x05,0x04,0x85,0x03,0x34,0x06, 0x05,0x03,0x34,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x08,0x45,0x07,0x22,0x06, 0x05,0x07,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x05,0x06,0x45,0x04,0x22,0x06, 0x05,0x04,0x22,0x00,0x40,0x02,0x09,0xa8,0x12,0x08,0x11,0x08,0x40,0x02,0x07,0xa8, 0x12,0x06,0x11,0x06,0x68,0x02,0x00,0x00,0x20,0x82,0x05,0x0a,0x04,0x09,0x00,0x01, 0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00,0x20,0x82,0x25,0x0a,0x04,0x07,0x00,0x01, 0x04,0x00,0x04,0x00,0x61,0x02,0x08,0x68,0x06,0x0a,0x01,0x00,0x61,0x02,0x08,0x68, 0xce,0x0a,0x01,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x0d,0x04,0x23,0x20,0x05, 0xff,0x00,0xff,0x00,0x38,0xa2,0x01,0x00,0xa0,0x0a,0x05,0x08,0x05,0x08,0x22,0x40, 0x00,0x00,0x00,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x05,0x04,0x31,0x20,0x05, 0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x0b,0x04,0x25,0x20,0x05, 0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00,0x50,0x85,0x05,0x09,0x04,0x21,0x20,0x05, 0xff,0x00,0xff,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x10,0x15,0x1e,0x56,0x01, 0x05,0x0d,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x0e,0x15,0x1c,0x56,0x01, 0x05,0x05,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x06,0x15,0x1f,0x56,0x01, 0x05,0x0b,0x58,0x00,0x40,0x04,0x04,0x00,0x60,0x20,0x05,0x03,0x15,0x1d,0x56,0x01, 0x05,0x09,0x58,0x00,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x23,0x01,0x00, 0xa0,0x0a,0x05,0x08,0x05,0x3b,0x22,0x0a,0x05,0x08,0x22,0x02,0x61,0x05,0x04,0x00, 0x60,0x16,0x05,0x10,0x05,0x10,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00, 0x60,0x16,0x05,0x0e,0x05,0x0e,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00, 0x60,0x16,0x05,0x06,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00, 0x60,0x16,0x05,0x03,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00, 0xa0,0x0a,0x45,0x09,0x24,0x08,0x00,0x0a,0x24,0x08,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x06,0x65,0x08,0xe4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x04,0x00, 0x60,0x05,0x05,0x12,0x04,0x10,0x20,0x05,0x04,0x0e,0x20,0x00,0x40,0x04,0x04,0x00, 0x60,0x05,0x05,0x14,0x04,0x06,0x20,0x05,0x04,0x03,0x20,0x00,0x5b,0x04,0x00,0x00, 0xa0,0x02,0x44,0x09,0x44,0x09,0x02,0x02,0x04,0x08,0x04,0x08,0x40,0x02,0x14,0xa0, 0x02,0x14,0x00,0x12,0x40,0x02,0x00,0x00,0xa0,0x0a,0x45,0x09,0x44,0x09,0x00,0x0a, 0x64,0x08,0x00,0x00,0x61,0x00,0x03,0xa8,0x00,0x00,0x81,0x3d,0x38,0xa4,0x00,0x00, 0xa0,0x0a,0x45,0x09,0x44,0x09,0x00,0x40,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8, 0x60,0x00,0x81,0x3f,0x40,0x04,0x0a,0xa1,0x02,0x15,0x00,0x14,0x5b,0xa4,0x00,0x00, 0xa0,0x02,0x04,0x03,0x24,0x03,0x02,0x02,0x04,0x03,0x44,0x09,0x40,0x02,0x02,0x00, 0x60,0x06,0x25,0x02,0x85,0x0a,0x34,0x06,0x05,0x0a,0x34,0x00,0x41,0x00,0x00,0x00, 0x60,0x05,0x85,0x08,0x04,0x29,0x00,0x05,0x04,0x29,0x00,0x00,0x40,0x02,0x01,0x00, 0x60,0x06,0x05,0x05,0x65,0x02,0x22,0x06,0x25,0x02,0x22,0x00,0x38,0x95,0x00,0x00, 0xa0,0x0a,0x25,0x02,0x04,0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x02,0x09,0xa8, 0x5f,0x08,0x01,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x16,0x04,0x05,0x00,0x06, 0x24,0x05,0x00,0x00,0x41,0xa5,0x09,0x28,0x10,0x09,0x11,0x02,0x41,0x02,0x00,0x00, 0x60,0x05,0x45,0x08,0x64,0x16,0x00,0x05,0x64,0x16,0x00,0x00,0x61,0x02,0x16,0xe8, 0x95,0x09,0x01,0x00,0x70,0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x44,0x08,0x00,0x46, 0x84,0x16,0x00,0x00,0x70,0x00,0x00,0x11,0x20,0x82,0x01,0x00,0x44,0x08,0x00,0x32, 0x00,0x48,0x01,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0xc4,0x16,0x84,0x16,0x85,0x05, 0x64,0x16,0x64,0x16,0x61,0x00,0x00,0x80,0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0x84,0x16,0x84,0x16,0x05,0x05, 0x64,0x16,0x64,0x16,0x70,0x03,0x00,0x00,0x60,0x86,0x01,0x00,0xc4,0x16,0x00,0x56, 0x00,0x00,0x80,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x3b,0xc4,0x16,0x00,0x05, 0x08,0x00,0x08,0x00,0x61,0x03,0x00,0x00,0xa0,0x0a,0x65,0x3a,0x84,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x01,0x60,0x85,0x05,0x16,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x11,0x60,0x85,0x65,0x16,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x90,0x09,0x00,0x00,0x41,0x03,0x20,0x22,0x76,0x3b,0x11,0x16,0x6c,0x00,0x00,0x00, 0x60,0x86,0x65,0x3a,0x84,0x16,0x00,0x05,0x08,0x00,0x08,0x00,0x49,0x00,0x16,0xa8, 0x72,0x3b,0x11,0x16,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x3b,0xc4,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x50,0x09,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0xa4,0x3b,0x00,0x01, 0x64,0x16,0x00,0x00,0x49,0x00,0x00,0x80,0x60,0x06,0x05,0x03,0xa4,0x3b,0x00,0x06, 0x64,0x16,0x00,0x00,0x61,0x01,0x3b,0x68,0xa8,0x03,0x01,0x00,0x40,0x01,0x16,0xa8, 0x72,0x3b,0x11,0x16,0x61,0x00,0x00,0x80,0x10,0x01,0x01,0x30,0x44,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x17,0xa8,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x91, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x04,0x00,0x00,0x61,0x00,0x03,0x00, 0x50,0x20,0x85,0x02,0x47,0x2c,0x64,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00, 0x50,0x20,0x05,0x05,0x47,0x2e,0x64,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00, 0x60,0x00,0x05,0x03,0x47,0x2b,0x64,0x05,0x85,0x02,0x46,0x00,0x61,0x00,0x03,0x00, 0x50,0x20,0x85,0x02,0x67,0x2b,0x64,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x03,0x00, 0x60,0x00,0x05,0x04,0x47,0x2d,0x64,0x05,0x05,0x05,0x46,0x00,0x61,0x00,0x03,0x00, 0x50,0x20,0x05,0x05,0x67,0x2d,0x64,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x20,0x24, 0x06,0x03,0x60,0x03,0x40,0x04,0x03,0x00,0x60,0x00,0x05,0x0b,0x47,0x2b,0x64,0x05, 0x85,0x02,0x46,0x00,0x49,0x00,0x03,0xa1,0x02,0x03,0x00,0x03,0x40,0x04,0x03,0x00, 0x60,0x00,0x05,0x0c,0x47,0x2d,0x64,0x05,0x05,0x05,0x46,0x00,0x41,0x06,0x20,0x24, 0x06,0x04,0x60,0x04,0x49,0x00,0x04,0xa1,0x02,0x04,0x00,0x04,0x41,0x05,0x20,0x24, 0x06,0x0b,0x60,0x0b,0x49,0x00,0x0b,0xa1,0x02,0x0b,0x00,0x0b,0x41,0x05,0x20,0x24, 0x06,0x0c,0x60,0x0c,0x49,0x00,0x0c,0xa1,0x02,0x0c,0x00,0x0c,0x40,0x05,0x06,0xa1, 0x02,0x04,0x00,0x03,0x40,0x02,0x03,0xa1,0x02,0x0c,0x00,0x0b,0x40,0x02,0x02,0x00, 0x60,0x06,0x05,0x07,0x85,0x06,0x34,0x06,0x05,0x06,0x34,0x00,0x40,0x02,0x02,0x00, 0x60,0x06,0x05,0x04,0x85,0x03,0x34,0x06,0x05,0x03,0x34,0x00,0x40,0x02,0x01,0x00, 0x60,0x06,0x05,0x08,0x45,0x07,0x22,0x06,0x05,0x07,0x22,0x00,0x40,0x02,0x01,0x00, 0x60,0x06,0x05,0x06,0x45,0x04,0x22,0x06,0x05,0x04,0x22,0x00,0x40,0x02,0x09,0xa8, 0x12,0x08,0x11,0x08,0x40,0x02,0x07,0xa8,0x12,0x06,0x11,0x06,0x68,0x02,0x00,0x00, 0x20,0x82,0x05,0x0a,0x04,0x09,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x02,0x00,0x00, 0x20,0x82,0x25,0x0a,0x04,0x07,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x02,0x08,0x68, 0x06,0x0a,0x01,0x00,0x61,0x02,0x08,0x68,0xce,0x0a,0x01,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x0d,0x04,0x2d,0x20,0x05,0xff,0x00,0xff,0x00,0x38,0xa6,0x01,0x00, 0xa0,0x0a,0x05,0x08,0x05,0x08,0x22,0x40,0x00,0x00,0x00,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x05,0x04,0x3c,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x0b,0x04,0x2f,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x09,0x04,0x2b,0x20,0x05,0xff,0x00,0xff,0x00,0x40,0x04,0x04,0x00, 0x60,0x20,0x05,0x10,0x15,0x1e,0x56,0x01,0x05,0x0d,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x20,0x05,0x0e,0x15,0x1c,0x56,0x01,0x05,0x05,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x20,0x05,0x06,0x15,0x1f,0x56,0x01,0x05,0x0b,0x58,0x00,0x40,0x04,0x04,0x00, 0x60,0x20,0x05,0x03,0x15,0x1d,0x56,0x01,0x05,0x09,0x58,0x00,0x01,0x26,0x00,0xe8, 0x01,0x00,0x11,0x00,0x40,0x23,0x01,0x00,0xa0,0x0a,0x05,0x3b,0x05,0x3b,0x22,0x0a, 0x05,0x08,0x22,0x02,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x10,0x05,0x10,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x0e,0x05,0x0e,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x06,0x05,0x06,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x05,0x04,0x00,0x60,0x16,0x05,0x03,0x05,0x03,0x46,0x00, 0x00,0x00,0x00,0x00,0x41,0x05,0x00,0x00,0xa0,0x0a,0x45,0x0a,0x24,0x3b,0x00,0x0a, 0x24,0x3b,0x00,0x00,0x61,0x00,0x09,0xa8,0xcf,0x16,0x01,0x00,0x40,0x05,0x04,0x00, 0x60,0x05,0x05,0x12,0x04,0x10,0x20,0x05,0x04,0x0e,0x20,0x00,0x40,0x04,0x04,0x00, 0x60,0x05,0x05,0x14,0x04,0x06,0x20,0x05,0x04,0x03,0x20,0x00,0x5b,0x04,0x00,0x00, 0xa0,0x02,0x44,0x0a,0x44,0x0a,0x02,0x02,0x04,0x3b,0x04,0x3b,0x40,0x02,0x14,0xa0, 0x02,0x14,0x00,0x12,0x40,0x02,0x00,0x00,0xa0,0x0a,0x45,0x0a,0x44,0x0a,0x00,0x0a, 0x24,0x09,0x00,0x00,0x61,0x00,0x03,0xa8,0x00,0x00,0x81,0x3d,0x38,0xa7,0x00,0x00, 0xa0,0x0a,0x45,0x0a,0x44,0x0a,0x00,0x40,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8, 0x60,0x00,0x81,0x3f,0x40,0x04,0x08,0xa1,0x02,0x15,0x00,0x14,0x5b,0xa7,0x00,0x00, 0xa0,0x02,0x04,0x03,0x24,0x03,0x02,0x02,0x04,0x03,0x44,0x0a,0x40,0x02,0x02,0x00, 0x60,0x06,0x25,0x02,0x85,0x08,0x34,0x06,0x05,0x08,0x34,0x00,0x41,0x00,0x00,0x00, 0x60,0x05,0x45,0x09,0x04,0x29,0x00,0x05,0x04,0x29,0x00,0x00,0x40,0x02,0x01,0x00, 0x60,0x06,0x05,0x05,0x65,0x02,0x22,0x06,0x25,0x02,0x22,0x00,0x38,0x98,0x00,0x00, 0xa0,0x0a,0x25,0x02,0x04,0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x02,0x0a,0xa8, 0x47,0x09,0x01,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x16,0x04,0x05,0x00,0x06, 0x24,0x05,0x00,0x00,0x41,0xa8,0x0a,0x28,0x10,0x0a,0x11,0x02,0x41,0x02,0x00,0x00, 0x60,0x05,0x05,0x09,0x64,0x16,0x00,0x05,0x64,0x16,0x00,0x00,0x61,0x02,0x16,0xe8, 0x3d,0x0a,0x01,0x00,0x70,0x01,0x00,0x00,0x60,0x06,0x01,0x00,0x04,0x09,0x00,0x46, 0x44,0x16,0x00,0x00,0x70,0x00,0x00,0x11,0x20,0x82,0x01,0x00,0x04,0x09,0x00,0x32, 0x00,0x48,0x01,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x01,0x00,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0x84,0x16,0x44,0x16,0x85,0x05, 0x64,0x16,0x64,0x16,0x61,0x00,0x00,0x80,0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x5b,0x00,0x00,0x00,0x60,0x06,0x44,0x16,0x44,0x16,0x05,0x05, 0x64,0x16,0x64,0x16,0x70,0x03,0x00,0x00,0x60,0x86,0x01,0x00,0x84,0x16,0x00,0x56, 0x00,0x00,0x80,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xa5,0x3b,0x84,0x16,0x00,0x05, 0x08,0x00,0x08,0x00,0x61,0x03,0x00,0x00,0xa0,0x0a,0x65,0x3a,0x44,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x05,0x00,0x01,0x60,0x85,0x05,0x17,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x11,0x60,0x85,0x25,0x16,0x24,0x02,0x00,0x05, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0xf0,0x04,0x00,0x00,0x41,0x03,0x20,0x22,0x76,0x3b,0x11,0x17,0x6c,0x00,0x00,0x00, 0x60,0x86,0x65,0x3a,0x44,0x16,0x00,0x05,0x08,0x00,0x08,0x00,0x49,0x00,0x17,0xa8, 0x72,0x3b,0x11,0x17,0x61,0x00,0x00,0x00,0xa0,0x0a,0xa5,0x3b,0x84,0x16,0x00,0x00, 0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0xb0,0x04,0x00,0x00,0x41,0x02,0x00,0x80,0x60,0x06,0x01,0x20,0xa4,0x3b,0x00,0x01, 0x24,0x16,0x00,0x00,0x49,0x00,0x00,0x80,0x60,0x06,0x05,0x03,0xa4,0x3b,0x00,0x06, 0x24,0x16,0x00,0x00,0x61,0x01,0x3b,0x68,0xa8,0x03,0x01,0x00,0x40,0x01,0x17,0xa8, 0x72,0x3b,0x11,0x17,0x40,0x00,0x16,0x68,0x62,0x16,0x11,0x10,0x69,0x00,0x3b,0x68, 0xaa,0x16,0x81,0x00,0x40,0x02,0x16,0xa8,0xca,0x16,0x11,0x17,0x61,0x01,0x00,0x00, 0xa0,0x0a,0x65,0x3a,0x24,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x05,0x80, 0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00,0x48,0x04,0x00,0x00,0x61,0x04,0x00,0x00, 0xa0,0x0a,0x25,0x3a,0xa4,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x0a,0x65,0x3a,0x24,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x3b,0x68, 0xaa,0x17,0x81,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x84,0x3a,0x00,0x00,0x00,0x00, 0x10,0x04,0x00,0x00,0x40,0x04,0x02,0x68,0xca,0x3a,0x04,0x10,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x0f,0x04,0x31,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x10,0x04,0x21,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x11,0x04,0x23,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x12,0x04,0x25,0x20,0x05,0xff,0x00,0xff,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x03,0x15,0x1c,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x06,0x15,0x1d,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x09,0x15,0x1e,0x56,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x50,0x00,0x05,0x0c,0x15,0x1f,0x56,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x00,0x00, 0x60,0x06,0x25,0x02,0x24,0x02,0x00,0x06,0xa4,0x3b,0x00,0x02,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x13,0x24,0x3a,0x00,0x01,0x05,0x0f,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x15,0x24,0x3a,0x00,0x01,0x05,0x10,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x17,0x24,0x3a,0x00,0x01,0x05,0x11,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x19,0x24,0x3a,0x00,0x01,0x05,0x12,0x58,0x00,0x41,0x05,0x04,0x00, 0x60,0x06,0x05,0x04,0x24,0x02,0x00,0x05,0x05,0x03,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x07,0x24,0x02,0x00,0x05,0x05,0x06,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x0a,0x24,0x02,0x00,0x05,0x05,0x09,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x0d,0x24,0x02,0x00,0x05,0x05,0x0c,0x58,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x03,0x04,0x3c,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x06,0x04,0x2b,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x09,0x04,0x2d,0x20,0x05,0xff,0x00,0xff,0x00,0x65,0x00,0x04,0x00, 0x50,0x85,0x05,0x0c,0x04,0x2f,0x20,0x05,0xff,0x00,0xff,0x00,0x40,0x00,0x13,0x60, 0x02,0x13,0x00,0x08,0x40,0x00,0x15,0x60,0x02,0x15,0x00,0x08,0x40,0x00,0x17,0x60, 0x02,0x17,0x00,0x08,0x40,0x00,0x19,0x60,0x02,0x19,0x00,0x08,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x1b,0xa4,0x3b,0x00,0x01,0x05,0x03,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x1d,0xa4,0x3b,0x00,0x01,0x05,0x06,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x1f,0xa4,0x3b,0x00,0x01,0x05,0x09,0x58,0x00,0x41,0x07,0x04,0x00, 0x60,0x06,0x05,0x21,0xa4,0x3b,0x00,0x01,0x05,0x0c,0x58,0x00,0x40,0x04,0x13,0xa0, 0x02,0x13,0x00,0x1b,0x40,0x04,0x15,0xa0,0x02,0x15,0x00,0x1d,0x40,0x04,0x17,0xa0, 0x02,0x17,0x00,0x1f,0x40,0x04,0x19,0xa0,0x02,0x19,0x00,0x21,0x40,0x04,0x13,0xa0, 0x02,0x13,0x00,0x04,0x40,0x04,0x15,0xa0,0x02,0x15,0x00,0x07,0x40,0x04,0x17,0xa0, 0x02,0x17,0x00,0x0a,0x40,0x04,0x19,0xa0,0x02,0x19,0x00,0x0d,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x13,0x05,0x13,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x15,0x05,0x15,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x17,0x05,0x17,0x46,0x01,0x08,0x00,0x08,0x00,0x68,0x04,0x04,0x00, 0x20,0x82,0x05,0x19,0x05,0x19,0x46,0x01,0x08,0x00,0x08,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x05,0x04,0x04,0x13,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x85,0x04,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x05,0x05,0x04,0x17,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x04,0x00, 0x40,0x04,0x85,0x05,0x04,0x19,0x30,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x61,0x00,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xa4,0x01,0x00,0x02, 0x00,0x00,0x29,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x3a,0x01,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x03,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x99,0x03,0x80, 0x00,0x00,0x05,0x04,0x04,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x39,0x03,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x61,0x00,0x03,0x62,0x00,0x3a,0x01,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x03,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64, 0x00,0x00,0x00,0x00,0x31,0xa9,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xc0, 0x14,0x04,0x00,0x00,0x61,0x39,0x00,0x80,0xa0,0x4a,0x45,0x03,0x00,0x00,0x00,0x00, 0x07,0x00,0x03,0x00,0x61,0x00,0x03,0x62,0x60,0x01,0x01,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0xc4,0x01,0x00,0x02,0x01,0x80,0x0a,0x02,0x01,0x21,0x00,0xe8, 0x01,0x00,0x11,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x03,0x00,0xc0, 0x0c,0x39,0x00,0x00,0x31,0x04,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x61,0x01,0x03,0x00,0xa0,0x05,0x05,0x04,0x85,0x02,0x46,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0xa0,0x05,0x01,0x20,0x85,0x3b,0x46,0x00, 0x00,0x00,0x00,0x00,0x38,0xab,0x03,0x00,0xa0,0x0a,0x05,0x04,0x05,0x04,0x46,0x10, 0x00,0x00,0x00,0x00,0x41,0x00,0x03,0x00,0xa0,0x8a,0x01,0x20,0x01,0x20,0x46,0x0a, 0x08,0x00,0x80,0x3f,0x41,0x2b,0x03,0x61,0x01,0x20,0x00,0x04,0x61,0x01,0x05,0xe1, 0x05,0x03,0x00,0x00,0x61,0x01,0x03,0x00,0x90,0x09,0x85,0x3b,0x04,0x05,0x20,0x00, 0x00,0x00,0x00,0x00,0x2d,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x44,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01, 0x30,0x00,0x30,0x00,0x6c,0x01,0x00,0x00,0x60,0x86,0x45,0x02,0x64,0x3a,0x00,0x05, 0x1f,0x00,0x1f,0x00,0x6c,0x05,0x00,0x00,0x60,0x86,0x25,0x02,0xa4,0x3b,0x00,0x05, 0x1f,0x00,0x1f,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x65,0x3a,0x44,0x02,0x00,0x06, 0x64,0x3a,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x3b,0x24,0x02,0x00,0x06, 0xa4,0x3b,0x00,0x00,0x67,0x02,0x00,0x00,0x60,0x06,0x65,0x3a,0x64,0x3a,0x00,0x06, 0x44,0x02,0x00,0x00,0x61,0x00,0x03,0xa8,0x98,0x00,0xc1,0xb4,0x61,0x02,0x00,0x00, 0xa0,0x02,0x85,0x02,0x64,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x00,0x00, 0x60,0x06,0xa5,0x3b,0xa4,0x3b,0x00,0x06,0x24,0x02,0x00,0x00,0x61,0x02,0x00,0x00, 0x60,0x0a,0x85,0x3b,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x4c,0x00,0x00, 0xa0,0x0a,0x85,0x03,0x84,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x06,0x85,0x3b,0x64,0x3a,0x00,0x06,0x84,0x3b,0x00,0x02,0x5b,0xdc,0x00,0x00, 0xa0,0x02,0x84,0x03,0x84,0x03,0x02,0x02,0x64,0x03,0x84,0x03,0x61,0x02,0x01,0x00, 0xa0,0x02,0x05,0x03,0x85,0x3b,0x22,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x60,0x06,0x45,0x02,0x44,0x02,0x00,0x06,0x24,0x02,0x00,0x00,0x61,0x02,0x00,0x00, 0x60,0x0a,0x65,0x02,0x24,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x00,0x00, 0xa0,0x0a,0x05,0x04,0x84,0x03,0x00,0x0a,0x24,0x03,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x06,0x65,0x02,0xa4,0x3b,0x00,0x06,0x64,0x02,0x00,0x02,0x61,0x02,0x05,0xe8, 0x05,0x04,0x01,0x00,0x61,0x02,0x00,0x00,0xa0,0x02,0x45,0x03,0x64,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x68,0x66,0x05,0x01,0x00,0x61,0x00,0x00,0x80, 0x90,0x49,0x05,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02,0x00,0x00, 0xa0,0x02,0x84,0x02,0x24,0x03,0x82,0x02,0x24,0x05,0x84,0x02,0x5b,0x04,0x00,0x00, 0xa0,0x02,0x04,0x03,0x44,0x03,0x82,0x02,0x24,0x05,0x04,0x03,0x40,0x01,0x00,0x00, 0xa0,0x0a,0x85,0x02,0x84,0x02,0x00,0x0a,0x04,0x03,0x00,0x00,0x41,0x01,0x00,0x00, 0xa0,0x0a,0x85,0x03,0x84,0x03,0x00,0x0a,0x84,0x02,0x00,0x00,0x61,0x01,0x06,0xe8, 0x5d,0x03,0x01,0x00,0x40,0x01,0x06,0xa8,0x02,0x06,0x11,0x05,0x41,0x01,0x20,0x22, 0x1e,0x06,0x11,0x3a,0x49,0x00,0x07,0xa8,0x1a,0x06,0x11,0x3a,0x40,0x00,0x06,0xa8, 0x2a,0x06,0x11,0x02,0x40,0x02,0x00,0x00,0x60,0x06,0xa5,0x3b,0xa4,0x3b,0x00,0x06, 0x04,0x07,0x00,0x02,0x70,0x01,0x00,0x00,0x20,0x02,0x01,0x00,0xa4,0x3b,0x00,0x42, 0x64,0x3a,0x00,0x00,0x62,0x00,0x00,0x01,0x60,0x85,0x25,0x06,0x04,0x04,0x00,0x05, 0x00,0x00,0x00,0x00,0x40,0x01,0x06,0xa8,0x12,0x06,0x11,0x06,0x67,0x01,0x00,0x00, 0x60,0x06,0xa5,0x3b,0x04,0x06,0x00,0x06,0x44,0x02,0x00,0x00,0x65,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00, 0x00,0x00,0x00,0x00,0x84,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x61,0x01,0x03,0x60, 0x06,0x19,0x00,0x00,0x38,0x9d,0x04,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x03,0x46,0x10, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x00,0x09,0x60, 0x06,0x17,0x00,0x00,0x5b,0xad,0x20,0x2a,0x41,0x0f,0x0f,0x02,0x61,0x00,0x05,0xe0, 0x05,0x03,0x00,0x00,0x61,0x03,0x0b,0xe0,0x05,0x09,0x00,0x00,0x41,0x00,0x11,0x60, 0x01,0x20,0x00,0x09,0x40,0x03,0x05,0xa0,0x02,0x19,0x20,0x05,0x40,0x03,0x0b,0xa0, 0x02,0x17,0x20,0x0b,0x61,0x03,0x13,0xe0,0x05,0x11,0x00,0x00,0x61,0x03,0x07,0x60, 0x06,0x05,0x00,0x00,0x61,0x03,0x0d,0x60,0x06,0x0b,0x00,0x00,0x61,0x03,0x15,0x60, 0x06,0x13,0x00,0x00,0x5b,0x01,0x03,0xa0,0x02,0x09,0x03,0x15,0x5b,0x03,0x07,0xa0, 0x02,0x0d,0x07,0x15,0x40,0x01,0x03,0x20,0x00,0x03,0x00,0x07,0x61,0x00,0x00,0x80, 0x90,0x49,0x25,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x41,0x02,0x0f,0x60, 0x01,0x20,0x00,0x03,0x61,0x01,0x05,0xe0,0x05,0x0f,0x00,0x00,0x40,0x01,0x05,0xa0, 0x02,0x05,0x00,0x13,0x41,0x01,0x20,0x24,0x06,0x05,0x60,0x19,0x49,0x00,0x0b,0xa1, 0x02,0x05,0x00,0x19,0x41,0x00,0x20,0x24,0x06,0x06,0x60,0x1a,0x49,0x00,0x0c,0xa1, 0x02,0x06,0x00,0x1a,0x40,0x01,0x17,0xa0,0x02,0x17,0x20,0x0b,0x70,0x01,0x84,0x00, 0x60,0x02,0x01,0x00,0x05,0x17,0x46,0x42,0x05,0x19,0x46,0x00,0x62,0x07,0x84,0x01, 0x60,0x85,0x05,0x09,0x24,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x17,0xa0, 0x02,0x05,0x00,0x09,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x84,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02, 0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01, 0x30,0x00,0x30,0x00,0x61,0x01,0x00,0x00,0xa0,0x02,0x45,0x02,0x44,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8,0x60,0x00,0xc1,0xb4,0x61,0x02,0x35,0xe8, 0x45,0x02,0x01,0x00,0x38,0x4e,0x00,0x00,0xa0,0x0a,0x45,0x03,0x44,0x02,0x00,0x10, 0x00,0x00,0x00,0x00,0x40,0x01,0x35,0xa8,0x42,0x35,0x31,0x35,0x5b,0xbe,0x00,0x00, 0xa0,0x02,0x44,0x03,0x44,0x03,0x02,0x02,0x24,0x03,0x44,0x03,0x61,0x02,0x01,0x00, 0xa0,0x02,0x85,0x02,0x05,0x35,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00, 0x60,0x0a,0x25,0x02,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00, 0xa0,0x0a,0x05,0x04,0x44,0x03,0x00,0x0a,0xa4,0x02,0x00,0x00,0x40,0x02,0x00,0x00, 0x60,0x06,0x25,0x02,0x24,0x35,0x00,0x06,0x24,0x02,0x00,0x02,0x61,0x02,0x05,0xe8, 0x05,0x04,0x01,0x00,0x61,0x02,0x03,0x68,0x26,0x02,0x01,0x00,0x61,0x02,0x05,0x68, 0x66,0x05,0x01,0x00,0x5b,0x01,0x00,0x00,0xa0,0x02,0x44,0x02,0xa4,0x02,0x82,0x02, 0x24,0x05,0x44,0x02,0x5b,0x03,0x00,0x00,0xa0,0x02,0x84,0x02,0x04,0x03,0x82,0x02, 0x24,0x05,0x84,0x02,0x40,0x01,0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x02,0x00,0x0a, 0x84,0x02,0x00,0x00,0x41,0x01,0x00,0x00,0xa0,0x0a,0x45,0x03,0x44,0x03,0x00,0x0a, 0x44,0x02,0x00,0x00,0x61,0x01,0x06,0xe8,0x45,0x03,0x01,0x00,0x40,0x01,0x06,0xa8, 0x02,0x06,0x11,0x05,0x41,0x01,0x20,0x22,0x2e,0x06,0x11,0x35,0x49,0x00,0x06,0xa8, 0x2a,0x06,0x11,0x35,0x40,0x01,0x35,0xa8,0xca,0x35,0x31,0x06,0x70,0x01,0x00,0x00, 0x20,0x02,0x01,0x00,0x24,0x35,0x00,0x52,0x44,0x35,0x00,0x00,0x61,0x00,0x00,0x01, 0xa0,0x4a,0x45,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00, 0x60,0x06,0x25,0x35,0x24,0x35,0x00,0x06,0x44,0x35,0x00,0x02,0x65,0x01,0x00,0x00, 0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00, 0x00,0x00,0x00,0x00,0x44,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x4d,0x43,0x5f,0x4d,0x45,0x52,0x47,0x45,0x34,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74, 0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79, 0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00, 0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30, 0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00, 0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33, 0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33, 0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33, 0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34, 0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34, 0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35, 0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35, 0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35, 0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36, 0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36, 0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37, 0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37, 0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37, 0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38, 0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38, 0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39, 0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39, 0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39, 0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x4d,0x43,0x5f,0x4d,0x45,0x52,0x47,0x45,0x34, 0x5f,0x42,0x42,0x5f,0x30,0x5f,0x35,0x35,0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x41, 0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x4e,0x6f,0x42,0x61,0x72,0x72,0x69,0x65,0x72, 0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x55,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x55,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x55,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x01,0x01,0x00,0x22,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x02,0x00,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x02,0x01,0x00,0x21,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x01,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x01,0x10,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x04,0x00,0x01,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01, 0x10,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x10, 0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x01,0x10,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x01,0x10,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x01,0x10,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x10,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x01,0x10,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x01,0x10,0x00,0x31,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x01,0x10,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x10,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x01,0x10,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x01,0x10,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x01,0x10,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x01,0x10,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x01,0x10,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x04,0x00,0x01,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00, 0x10,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x10, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x10,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x10,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x10,0x00,0x2d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x10,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x10,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x10,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x10,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x10,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x00,0x10,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x00,0x10,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x00,0x10,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x00,0x10,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x00,0x10,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x00,0x10,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x5f,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x60,0x00,0x00,0x00,0x01,0x00,0x00, 0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x00,0x20, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0xd3,0x07,0x00,0x00,0x52,0x06,0x00,0x00,0x03, 0x00,0x62,0x00,0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x6d,0x63,0x5f,0x32,0x2e, 0x61,0x73,0x6d,0x63,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x30,0x00, 0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x04, 0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x10,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x27,0x00,0x00,0x00,0x00, 0x00,0x37,0x00,0x07,0x00,0x10,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x28,0x00,0x00,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x10,0x22, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x00,0x00,0x00,0x01,0x10,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x02,0x00,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x02,0x10,0x22, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x00,0x00,0x00,0x03,0x10,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x04,0x00,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x04,0x10,0x22, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x05,0x00,0x22,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x00,0x00,0x00,0x05,0x10,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00, 0x00,0x06,0x00,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x06,0x10,0x22, 0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x07,0x00,0x22,0x01,0x05,0x01,0x01, 0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x44,0x00,0x00,0x00,0x07,0x10,0x22,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x00,0x10,0x22,0x01,0x01,0x04,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x04,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x01,0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x54,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x54,0x00,0x00,0x00,0x02,0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x54,0x00,0x00,0x00,0x03,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54, 0x00,0x00,0x00,0x03,0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00, 0x00,0x00,0x04,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00, 0x00,0x04,0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00, 0x05,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x05, 0x10,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x06,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x51,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x06,0x10,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x07,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x54,0x00,0x00,0x00,0x07,0x10,0x22,0x01,0x25, 0x04,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01, 0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25, 0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01, 0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25, 0x04,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01, 0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25, 0x04,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00, 0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01, 0x00,0x00,0x00,0x25,0x04,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x01,0x10,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x02,0x10,0x00,0x02,0x00,0x2e,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x03,0x00,0x00,0x02, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x03,0x10,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x31,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x04,0x10, 0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x05,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x05,0x10,0x00,0x02,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x06,0x10,0x00,0x02,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x07,0x00,0x00,0x02, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x07,0x10,0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x38, 0x00,0x06,0x00,0x10,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c, 0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x66,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff, 0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0x85,0x01,0x84,0x01,0x00,0x01,0xff,0x0f,0xff, 0x0f,0x40,0x02,0x00,0x00,0x60,0x01,0xa5,0x01,0x44,0x01,0x00,0x01,0x64,0x01,0x00, 0x00,0x40,0x02,0x00,0x00,0x60,0x01,0xc5,0x01,0x44,0x01,0x00,0x01,0x84,0x01,0x00, 0x00,0x61,0x00,0x3a,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x69,0x04,0x3a,0x68,0x72,0x01,0x41, 0x00,0x69,0x04,0x00,0x00,0x60,0x86,0x25,0x3a,0xc4,0x01,0x00,0x05,0x04,0x00,0x04, 0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x3a,0x00,0x00,0x00,0x00,0x0f,0x00,0x0f, 0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x31,0xa0,0x03,0x80,0x00,0x00,0x05, 0x02,0x04,0x3a,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x89,0x02,0x31,0x41,0x03,0x80,0x00,0x00,0x05, 0x0a,0x04,0x3a,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01, 0x10,0x04,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x40,0x20,0x04,0x00,0x60,0x80,0x05, 0x12,0x05,0x02,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x14,0x85,0x02,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x16,0x05,0x03,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x18,0x85,0x03,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x1a,0x05,0x04,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x1c,0x85,0x04,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x1e,0x05,0x05,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x20,0x85,0x05,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x22,0x05,0x06,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x24,0x85,0x06,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x26,0x05,0x07,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x28,0x85,0x07,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x2a,0x05,0x08,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x2c,0x85,0x08,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x2e,0x05,0x09,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x00,0x04,0x00,0x60,0x80,0x05, 0x30,0x85,0x09,0x46,0x05,0x01,0x00,0x01,0x00,0x40,0x21,0x04,0x00,0x60,0x00,0x05, 0x12,0x05,0x0a,0x46,0x06,0x05,0x12,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x14,0x85,0x0a,0x46,0x06,0x05,0x14,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x16,0x05,0x0b,0x46,0x06,0x05,0x16,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x18,0x85,0x0b,0x46,0x06,0x05,0x18,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x1a,0x05,0x0c,0x46,0x06,0x05,0x1a,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x1c,0x85,0x0c,0x46,0x06,0x05,0x1c,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x1e,0x05,0x0d,0x46,0x06,0x05,0x1e,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x20,0x85,0x0d,0x46,0x06,0x05,0x20,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x22,0x05,0x0e,0x46,0x06,0x05,0x22,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x24,0x85,0x0e,0x46,0x06,0x05,0x24,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x26,0x05,0x0f,0x46,0x06,0x05,0x26,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x28,0x85,0x0f,0x46,0x06,0x05,0x28,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x2a,0x05,0x10,0x46,0x06,0x05,0x2a,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x2c,0x85,0x10,0x46,0x06,0x05,0x2c,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x2e,0x05,0x11,0x46,0x06,0x05,0x2e,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05, 0x30,0x85,0x11,0x46,0x06,0x05,0x30,0x46,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x12,0x05,0x12,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x14,0x05,0x14,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x16,0x05,0x16,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x18,0x05,0x18,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x1a,0x05,0x1a,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x1c,0x05,0x1c,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x1e,0x05,0x1e,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x20,0x05,0x20,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x22,0x05,0x22,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x24,0x05,0x24,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x26,0x05,0x26,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x28,0x05,0x28,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x2a,0x05,0x2a,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x2c,0x05,0x2c,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x2e,0x05,0x2e,0x46,0x01,0x01,0x00,0x01,0x00,0x68,0x00,0x04,0x00,0x20,0x82,0x05, 0x30,0x05,0x30,0x46,0x01,0x01,0x00,0x01,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x32,0x04,0x12,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x32,0x04,0x14,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x33,0x04,0x16,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x33,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x34,0x04,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x34,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x35,0x04,0x1e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x35,0x04,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x36,0x04,0x22,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x36,0x04,0x24,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x37,0x04,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x37,0x04,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x38,0x04,0x2a,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x38,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05, 0x39,0x04,0x2e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x85, 0x39,0x04,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x31,0x92,0x03,0x80,0x00,0x00,0x01, 0x00,0x04,0x3a,0x00,0xc0,0x44,0x32,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00, 0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,0x4d,0x43,0x5f, 0x56,0x41,0x52,0x5f,0x53,0x43,0x5f,0x43,0x41,0x4c,0x43,0x00,0x6e,0x75,0x6c,0x6c, 0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69, 0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62, 0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00, 0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00, 0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00, 0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00, 0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00, 0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00, 0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00, 0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00, 0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00, 0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00, 0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00, 0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00, 0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00, 0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00, 0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00, 0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00, 0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00, 0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31, 0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30, 0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38, 0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00, 0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56, 0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31, 0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32, 0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34, 0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00, 0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56, 0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31, 0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33, 0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30, 0x00,0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00, 0x56,0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56, 0x31,0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31, 0x35,0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35, 0x33,0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36, 0x00,0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00, 0x56,0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56, 0x31,0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31, 0x36,0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36, 0x39,0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32, 0x00,0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00, 0x56,0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56, 0x31,0x37,0x39,0x00,0x56,0x31,0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31, 0x38,0x32,0x00,0x56,0x31,0x38,0x33,0x00,0x56,0x31,0x38,0x34,0x00,0x56,0x31,0x38, 0x35,0x00,0x56,0x31,0x38,0x36,0x00,0x56,0x31,0x38,0x37,0x00,0x56,0x31,0x38,0x38, 0x00,0x56,0x31,0x38,0x39,0x00,0x56,0x31,0x39,0x30,0x00,0x56,0x31,0x39,0x31,0x00, 0x56,0x31,0x39,0x32,0x00,0x56,0x31,0x39,0x33,0x00,0x56,0x31,0x39,0x34,0x00,0x56, 0x31,0x39,0x35,0x00,0x56,0x31,0x39,0x36,0x00,0x56,0x31,0x39,0x37,0x00,0x56,0x31, 0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x00,0x56,0x32,0x30,0x30,0x00,0x56,0x32,0x30, 0x31,0x00,0x56,0x32,0x30,0x32,0x00,0x56,0x32,0x30,0x33,0x00,0x56,0x32,0x30,0x34, 0x00,0x56,0x32,0x30,0x35,0x00,0x56,0x32,0x30,0x36,0x00,0x56,0x32,0x30,0x37,0x00, 0x56,0x32,0x30,0x38,0x00,0x56,0x32,0x30,0x39,0x00,0x56,0x32,0x31,0x30,0x00,0x56, 0x32,0x31,0x31,0x00,0x56,0x32,0x31,0x32,0x00,0x56,0x32,0x31,0x33,0x00,0x56,0x32, 0x31,0x34,0x00,0x56,0x32,0x31,0x35,0x00,0x56,0x32,0x31,0x36,0x00,0x56,0x32,0x31, 0x37,0x00,0x56,0x32,0x31,0x38,0x00,0x56,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x30, 0x00,0x56,0x32,0x32,0x31,0x00,0x56,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x33,0x00, 0x56,0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x36,0x00,0x56, 0x32,0x32,0x37,0x00,0x56,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x39,0x00,0x56,0x32, 0x33,0x30,0x00,0x56,0x32,0x33,0x31,0x00,0x56,0x32,0x33,0x32,0x00,0x56,0x32,0x33, 0x33,0x00,0x56,0x32,0x33,0x34,0x00,0x56,0x32,0x33,0x35,0x00,0x56,0x32,0x33,0x36, 0x00,0x56,0x32,0x33,0x37,0x00,0x56,0x32,0x33,0x38,0x00,0x56,0x32,0x33,0x39,0x00, 0x56,0x32,0x34,0x30,0x00,0x56,0x32,0x34,0x31,0x00,0x56,0x32,0x34,0x32,0x00,0x56, 0x32,0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x00,0x56,0x32,0x34,0x35,0x00,0x56,0x32, 0x34,0x36,0x00,0x56,0x32,0x34,0x37,0x00,0x56,0x32,0x34,0x38,0x00,0x56,0x32,0x34, 0x39,0x00,0x56,0x32,0x35,0x30,0x00,0x56,0x32,0x35,0x31,0x00,0x56,0x32,0x35,0x32, 0x00,0x56,0x32,0x35,0x33,0x00,0x56,0x32,0x35,0x34,0x00,0x56,0x32,0x35,0x35,0x00, 0x56,0x32,0x35,0x36,0x00,0x56,0x32,0x35,0x37,0x00,0x56,0x32,0x35,0x38,0x00,0x56, 0x32,0x35,0x39,0x00,0x56,0x32,0x36,0x30,0x00,0x56,0x32,0x36,0x31,0x00,0x56,0x32, 0x36,0x32,0x00,0x56,0x32,0x36,0x33,0x00,0x56,0x32,0x36,0x34,0x00,0x56,0x32,0x36, 0x35,0x00,0x56,0x32,0x36,0x36,0x00,0x56,0x32,0x36,0x37,0x00,0x56,0x32,0x36,0x38, 0x00,0x56,0x32,0x36,0x39,0x00,0x56,0x32,0x37,0x30,0x00,0x56,0x32,0x37,0x31,0x00, 0x56,0x32,0x37,0x32,0x00,0x56,0x32,0x37,0x33,0x00,0x56,0x32,0x37,0x34,0x00,0x56, 0x32,0x37,0x35,0x00,0x56,0x32,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x00,0x56,0x32, 0x37,0x38,0x00,0x56,0x32,0x37,0x39,0x00,0x56,0x32,0x38,0x30,0x00,0x56,0x32,0x38, 0x31,0x00,0x56,0x32,0x38,0x32,0x00,0x56,0x32,0x38,0x33,0x00,0x56,0x32,0x38,0x34, 0x00,0x56,0x32,0x38,0x35,0x00,0x56,0x32,0x38,0x36,0x00,0x56,0x32,0x38,0x37,0x00, 0x56,0x32,0x38,0x38,0x00,0x56,0x32,0x38,0x39,0x00,0x56,0x32,0x39,0x30,0x00,0x56, 0x32,0x39,0x31,0x00,0x56,0x32,0x39,0x32,0x00,0x56,0x32,0x39,0x33,0x00,0x56,0x32, 0x39,0x34,0x00,0x56,0x32,0x39,0x35,0x00,0x56,0x32,0x39,0x36,0x00,0x56,0x32,0x39, 0x37,0x00,0x56,0x32,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x00,0x56,0x33,0x30,0x30, 0x00,0x56,0x33,0x30,0x31,0x00,0x56,0x33,0x30,0x32,0x00,0x56,0x33,0x30,0x33,0x00, 0x56,0x33,0x30,0x34,0x00,0x56,0x33,0x30,0x35,0x00,0x56,0x33,0x30,0x36,0x00,0x56, 0x33,0x30,0x37,0x00,0x56,0x33,0x30,0x38,0x00,0x56,0x33,0x30,0x39,0x00,0x56,0x33, 0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x00,0x56,0x33,0x31,0x32,0x00,0x56,0x33,0x31, 0x33,0x00,0x56,0x33,0x31,0x34,0x00,0x56,0x33,0x31,0x35,0x00,0x56,0x33,0x31,0x36, 0x00,0x56,0x33,0x31,0x37,0x00,0x56,0x33,0x31,0x38,0x00,0x56,0x33,0x31,0x39,0x00, 0x56,0x33,0x32,0x30,0x00,0x56,0x33,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x00,0x56, 0x33,0x32,0x33,0x00,0x56,0x33,0x32,0x34,0x00,0x56,0x33,0x32,0x35,0x00,0x56,0x33, 0x32,0x36,0x00,0x56,0x33,0x32,0x37,0x00,0x56,0x33,0x32,0x38,0x00,0x56,0x33,0x32, 0x39,0x00,0x56,0x33,0x33,0x30,0x00,0x56,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x32, 0x00,0x56,0x33,0x33,0x33,0x00,0x56,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x35,0x00, 0x56,0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x38,0x00,0x56, 0x33,0x33,0x39,0x00,0x56,0x33,0x34,0x30,0x00,0x56,0x33,0x34,0x31,0x00,0x56,0x33, 0x34,0x32,0x00,0x56,0x33,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x00,0x56,0x33,0x34, 0x35,0x00,0x56,0x33,0x34,0x36,0x00,0x56,0x33,0x34,0x37,0x00,0x56,0x33,0x34,0x38, 0x00,0x56,0x33,0x34,0x39,0x00,0x56,0x33,0x35,0x30,0x00,0x56,0x33,0x35,0x31,0x00, 0x56,0x33,0x35,0x32,0x00,0x56,0x33,0x35,0x33,0x00,0x56,0x33,0x35,0x34,0x00,0x56, 0x33,0x35,0x35,0x00,0x56,0x33,0x35,0x36,0x00,0x56,0x33,0x35,0x37,0x00,0x56,0x33, 0x35,0x38,0x00,0x56,0x33,0x35,0x39,0x00,0x56,0x33,0x36,0x30,0x00,0x56,0x33,0x36, 0x31,0x00,0x56,0x33,0x36,0x32,0x00,0x56,0x33,0x36,0x33,0x00,0x56,0x33,0x36,0x34, 0x00,0x56,0x33,0x36,0x35,0x00,0x56,0x33,0x36,0x36,0x00,0x56,0x33,0x36,0x37,0x00, 0x56,0x33,0x36,0x38,0x00,0x56,0x33,0x36,0x39,0x00,0x56,0x33,0x37,0x30,0x00,0x56, 0x33,0x37,0x31,0x00,0x56,0x33,0x37,0x32,0x00,0x56,0x33,0x37,0x33,0x00,0x56,0x33, 0x37,0x34,0x00,0x56,0x33,0x37,0x35,0x00,0x56,0x33,0x37,0x36,0x00,0x56,0x33,0x37, 0x37,0x00,0x56,0x33,0x37,0x38,0x00,0x56,0x33,0x37,0x39,0x00,0x56,0x33,0x38,0x30, 0x00,0x56,0x33,0x38,0x31,0x00,0x56,0x33,0x38,0x32,0x00,0x56,0x33,0x38,0x33,0x00, 0x56,0x33,0x38,0x34,0x00,0x56,0x33,0x38,0x35,0x00,0x56,0x33,0x38,0x36,0x00,0x56, 0x33,0x38,0x37,0x00,0x56,0x33,0x38,0x38,0x00,0x56,0x33,0x38,0x39,0x00,0x56,0x33, 0x39,0x30,0x00,0x56,0x33,0x39,0x31,0x00,0x56,0x33,0x39,0x32,0x00,0x56,0x33,0x39, 0x33,0x00,0x56,0x33,0x39,0x34,0x00,0x56,0x33,0x39,0x35,0x00,0x56,0x33,0x39,0x36, 0x00,0x56,0x33,0x39,0x37,0x00,0x56,0x33,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x00, 0x56,0x34,0x30,0x30,0x00,0x56,0x34,0x30,0x31,0x00,0x56,0x34,0x30,0x32,0x00,0x56, 0x34,0x30,0x33,0x00,0x56,0x34,0x30,0x34,0x00,0x56,0x34,0x30,0x35,0x00,0x56,0x34, 0x30,0x36,0x00,0x56,0x34,0x30,0x37,0x00,0x56,0x34,0x30,0x38,0x00,0x56,0x34,0x30, 0x39,0x00,0x56,0x34,0x31,0x30,0x00,0x56,0x34,0x31,0x31,0x00,0x56,0x34,0x31,0x32, 0x00,0x56,0x34,0x31,0x33,0x00,0x56,0x34,0x31,0x34,0x00,0x56,0x34,0x31,0x35,0x00, 0x56,0x34,0x31,0x36,0x00,0x56,0x34,0x31,0x37,0x00,0x56,0x34,0x31,0x38,0x00,0x56, 0x34,0x31,0x39,0x00,0x56,0x34,0x32,0x30,0x00,0x56,0x34,0x32,0x31,0x00,0x56,0x34, 0x32,0x32,0x00,0x56,0x34,0x32,0x33,0x00,0x56,0x34,0x32,0x34,0x00,0x56,0x34,0x32, 0x35,0x00,0x56,0x34,0x32,0x36,0x00,0x56,0x34,0x32,0x37,0x00,0x56,0x34,0x32,0x38, 0x00,0x56,0x34,0x32,0x39,0x00,0x56,0x34,0x33,0x30,0x00,0x56,0x34,0x33,0x31,0x00, 0x56,0x34,0x33,0x32,0x00,0x56,0x34,0x33,0x33,0x00,0x56,0x34,0x33,0x34,0x00,0x56, 0x34,0x33,0x35,0x00,0x56,0x34,0x33,0x36,0x00,0x56,0x34,0x33,0x37,0x00,0x56,0x34, 0x33,0x38,0x00,0x56,0x34,0x33,0x39,0x00,0x56,0x34,0x34,0x30,0x00,0x56,0x34,0x34, 0x31,0x00,0x56,0x34,0x34,0x32,0x00,0x56,0x34,0x34,0x33,0x00,0x56,0x34,0x34,0x34, 0x00,0x56,0x34,0x34,0x35,0x00,0x56,0x34,0x34,0x36,0x00,0x56,0x34,0x34,0x37,0x00, 0x56,0x34,0x34,0x38,0x00,0x56,0x34,0x34,0x39,0x00,0x56,0x34,0x35,0x30,0x00,0x56, 0x34,0x35,0x31,0x00,0x56,0x34,0x35,0x32,0x00,0x56,0x34,0x35,0x33,0x00,0x56,0x34, 0x35,0x34,0x00,0x56,0x34,0x35,0x35,0x00,0x56,0x34,0x35,0x36,0x00,0x56,0x34,0x35, 0x37,0x00,0x56,0x34,0x35,0x38,0x00,0x56,0x34,0x35,0x39,0x00,0x56,0x34,0x36,0x30, 0x00,0x56,0x34,0x36,0x31,0x00,0x56,0x34,0x36,0x32,0x00,0x56,0x34,0x36,0x33,0x00, 0x56,0x34,0x36,0x34,0x00,0x56,0x34,0x36,0x35,0x00,0x56,0x34,0x36,0x36,0x00,0x56, 0x34,0x36,0x37,0x00,0x56,0x34,0x36,0x38,0x00,0x56,0x34,0x36,0x39,0x00,0x56,0x34, 0x37,0x30,0x00,0x56,0x34,0x37,0x31,0x00,0x56,0x34,0x37,0x32,0x00,0x56,0x34,0x37, 0x33,0x00,0x56,0x34,0x37,0x34,0x00,0x56,0x34,0x37,0x35,0x00,0x56,0x34,0x37,0x36, 0x00,0x56,0x34,0x37,0x37,0x00,0x56,0x34,0x37,0x38,0x00,0x56,0x34,0x37,0x39,0x00, 0x56,0x34,0x38,0x30,0x00,0x56,0x34,0x38,0x31,0x00,0x56,0x34,0x38,0x32,0x00,0x56, 0x34,0x38,0x33,0x00,0x56,0x34,0x38,0x34,0x00,0x56,0x34,0x38,0x35,0x00,0x56,0x34, 0x38,0x36,0x00,0x56,0x34,0x38,0x37,0x00,0x56,0x34,0x38,0x38,0x00,0x56,0x34,0x38, 0x39,0x00,0x56,0x34,0x39,0x30,0x00,0x56,0x34,0x39,0x31,0x00,0x56,0x34,0x39,0x32, 0x00,0x56,0x34,0x39,0x33,0x00,0x56,0x34,0x39,0x34,0x00,0x56,0x34,0x39,0x35,0x00, 0x56,0x34,0x39,0x36,0x00,0x56,0x34,0x39,0x37,0x00,0x56,0x34,0x39,0x38,0x00,0x56, 0x34,0x39,0x39,0x00,0x56,0x35,0x30,0x30,0x00,0x56,0x35,0x30,0x31,0x00,0x56,0x35, 0x30,0x32,0x00,0x56,0x35,0x30,0x33,0x00,0x56,0x35,0x30,0x34,0x00,0x56,0x35,0x30, 0x35,0x00,0x56,0x35,0x30,0x36,0x00,0x56,0x35,0x30,0x37,0x00,0x56,0x35,0x30,0x38, 0x00,0x56,0x35,0x30,0x39,0x00,0x56,0x35,0x31,0x30,0x00,0x56,0x35,0x31,0x31,0x00, 0x56,0x35,0x31,0x32,0x00,0x56,0x35,0x31,0x33,0x00,0x56,0x35,0x31,0x34,0x00,0x56, 0x35,0x31,0x35,0x00,0x56,0x35,0x31,0x36,0x00,0x56,0x35,0x31,0x37,0x00,0x56,0x35, 0x31,0x38,0x00,0x56,0x35,0x31,0x39,0x00,0x56,0x35,0x32,0x30,0x00,0x56,0x35,0x32, 0x31,0x00,0x56,0x35,0x32,0x32,0x00,0x56,0x35,0x32,0x33,0x00,0x56,0x35,0x32,0x34, 0x00,0x56,0x35,0x32,0x35,0x00,0x56,0x35,0x32,0x36,0x00,0x56,0x35,0x32,0x37,0x00, 0x56,0x35,0x32,0x38,0x00,0x56,0x35,0x32,0x39,0x00,0x56,0x35,0x33,0x30,0x00,0x56, 0x35,0x33,0x31,0x00,0x56,0x35,0x33,0x32,0x00,0x56,0x35,0x33,0x33,0x00,0x56,0x35, 0x33,0x34,0x00,0x56,0x35,0x33,0x35,0x00,0x56,0x35,0x33,0x36,0x00,0x56,0x35,0x33, 0x37,0x00,0x56,0x35,0x33,0x38,0x00,0x56,0x35,0x33,0x39,0x00,0x56,0x35,0x34,0x30, 0x00,0x56,0x35,0x34,0x31,0x00,0x56,0x35,0x34,0x32,0x00,0x56,0x35,0x34,0x33,0x00, 0x56,0x35,0x34,0x34,0x00,0x56,0x35,0x34,0x35,0x00,0x56,0x35,0x34,0x36,0x00,0x56, 0x35,0x34,0x37,0x00,0x56,0x35,0x34,0x38,0x00,0x56,0x35,0x34,0x39,0x00,0x56,0x35, 0x35,0x30,0x00,0x56,0x35,0x35,0x31,0x00,0x56,0x35,0x35,0x32,0x00,0x56,0x35,0x35, 0x33,0x00,0x56,0x35,0x35,0x34,0x00,0x56,0x35,0x35,0x35,0x00,0x56,0x35,0x35,0x36, 0x00,0x56,0x35,0x35,0x37,0x00,0x56,0x35,0x35,0x38,0x00,0x56,0x35,0x35,0x39,0x00, 0x56,0x35,0x36,0x30,0x00,0x56,0x35,0x36,0x31,0x00,0x56,0x35,0x36,0x32,0x00,0x56, 0x35,0x36,0x33,0x00,0x56,0x35,0x36,0x34,0x00,0x56,0x35,0x36,0x35,0x00,0x56,0x35, 0x36,0x36,0x00,0x56,0x35,0x36,0x37,0x00,0x56,0x35,0x36,0x38,0x00,0x56,0x35,0x36, 0x39,0x00,0x56,0x35,0x37,0x30,0x00,0x56,0x35,0x37,0x31,0x00,0x56,0x35,0x37,0x32, 0x00,0x56,0x35,0x37,0x33,0x00,0x56,0x35,0x37,0x34,0x00,0x56,0x35,0x37,0x35,0x00, 0x56,0x35,0x37,0x36,0x00,0x56,0x35,0x37,0x37,0x00,0x56,0x35,0x37,0x38,0x00,0x4d, 0x43,0x5f,0x56,0x41,0x52,0x5f,0x53,0x43,0x5f,0x43,0x41,0x4c,0x43,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x32,0x36,0x33,0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x41,0x73,0x6d, 0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x55,0x20,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4d,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7d,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7e,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x53,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8d,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x53,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9d,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f, 0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x53,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xac,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xad,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xae,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbd,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbe,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xcc,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcd,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xce,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00, 0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00, 0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xdc,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdd,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xde,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xed,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xee,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef, 0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfd,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00, 0x57,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x01,0x01, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x02,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x02,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x01,0x01,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x01,0x01,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0c,0x01,0x00,0x00,0x01,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0d,0x01,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0x01,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f, 0x01,0x00,0x00,0x01,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01, 0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00, 0x00,0x01,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00, 0x00,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x03, 0x20,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x04,0x20, 0x02,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x03,0x20,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x03,0x20,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x03,0x20,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x03,0x20,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x03,0x20,0x00,0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x03,0x20,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x03,0x20,0x00,0x33,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x01,0x00,0x00,0x03,0x20,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1d,0x01,0x00,0x00,0x03,0x20,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1e,0x01,0x00,0x00,0x03,0x20,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f, 0x01,0x00,0x00,0x03,0x20,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01, 0x00,0x00,0x03,0x20,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x03,0x20,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00, 0x03,0x20,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x03, 0x20,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x03,0x10, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x01,0x08,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x02,0x10,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x01,0x04,0x00,0x3e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x01,0x02,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x01,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x02,0x10,0x00,0xd7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2c,0x01,0x00,0x00,0x03,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2d,0x01,0x00,0x00,0x01,0x08,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2e,0x01,0x00,0x00,0x02,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f, 0x01,0x00,0x00,0x01,0x04,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01, 0x00,0x00,0x01,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00, 0x00,0x01,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00, 0x02,0x10,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00, 0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x03,0x10, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x01,0x08,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x02,0x10,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x01,0x04,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x01,0x02,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x01,0x01,0x00,0x4a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x03,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x01,0x00,0x00,0x01,0x08,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3d,0x01,0x00,0x00,0x02,0x10,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3e,0x01,0x00,0x00,0x01,0x04,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, 0x01,0x00,0x00,0x01,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x01,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00, 0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00, 0x03,0x10,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x01, 0x08,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x02,0x10, 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x01,0x04,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x01,0x02,0x00,0x53, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x01,0x01,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x01,0x00,0x54,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x03,0x10,0x00,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x01,0x08,0x00,0x56,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x02,0x10,0x00,0x55,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4c,0x01,0x00,0x00,0x01,0x04,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4d,0x01,0x00,0x00,0x01,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4e,0x01,0x00,0x00,0x01,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f, 0x01,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01, 0x00,0x00,0x03,0x10,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00, 0x00,0x01,0x08,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00, 0x02,0x10,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x01, 0x04,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x01,0x02, 0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x01,0x01,0x00, 0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x01,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x03,0x10,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x01,0x08,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x02,0x10,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x01,0x04,0x00,0x61,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x01,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5c,0x01,0x00,0x00,0x01,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5d,0x01,0x00,0x00,0x00,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5e,0x01,0x00,0x00,0x03,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f, 0x01,0x00,0x00,0x01,0x08,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01, 0x00,0x00,0x02,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00, 0x00,0x01,0x04,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00, 0x01,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x01, 0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x01, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x03,0x10,0x00, 0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x08,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x02,0x10,0x00,0x69,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x01,0x04,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x01,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x01,0x01,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6c,0x01,0x00,0x00,0x03,0x10,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6d,0x01,0x00,0x00,0x01,0x08,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6e,0x01,0x00,0x00,0x02,0x10,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f, 0x01,0x00,0x00,0x01,0x04,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01, 0x00,0x00,0x01,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00, 0x00,0x01,0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00, 0x00,0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x03, 0x10,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x01,0x08, 0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x02,0x10,0x00, 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x01,0x04,0x00,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x01,0x02,0x00,0x76,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x01,0x01,0x00,0x77,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x01,0x00,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x03,0x10,0x00,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x01,0x08,0x00,0x79,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x02,0x10,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7d,0x01,0x00,0x00,0x01,0x04,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7e,0x01,0x00,0x00,0x01,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f, 0x01,0x00,0x00,0x01,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01, 0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00, 0x00,0x03,0x10,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00, 0x01,0x08,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x02, 0x10,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x04, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x01,0x02,0x00, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x01,0x01,0x00,0x81, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x01,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x03,0x10,0x00,0x82,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x01,0x08,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x02,0x10,0x00,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x01,0x04,0x00,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x8c,0x01,0x00,0x00,0x01,0x02,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8d,0x01,0x00,0x00,0x01,0x01,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8e,0x01,0x00,0x00,0x00,0x01,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f, 0x01,0x00,0x00,0x03,0x10,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01, 0x00,0x00,0x01,0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00, 0x00,0x02,0x10,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00, 0x01,0x04,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x01, 0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x01,0x01, 0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x01,0x00, 0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x03,0x10,0x00,0x8c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x01,0x08,0x00,0x8d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x02,0x10,0x00,0x8c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x01,0x04,0x00,0x8e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x01,0x02,0x00,0x8f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x01,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x01,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9d,0x01,0x00,0x00,0x03,0x10,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9e,0x01,0x00,0x00,0x01,0x08,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f, 0x01,0x00,0x00,0x02,0x10,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01, 0x00,0x00,0x01,0x04,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00, 0x00,0x01,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00, 0x01,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00, 0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x03,0x10, 0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x01,0x08,0x00, 0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x02,0x10,0x00,0x96, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x01,0x04,0x00,0x98,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x01,0x02,0x00,0x99,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x01,0x01,0x00,0x9a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x03,0x10,0x00,0x9b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xac,0x01,0x00,0x00,0x01,0x08,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xad,0x01,0x00,0x00,0x02,0x10,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xae,0x01,0x00,0x00,0x01,0x04,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf, 0x01,0x00,0x00,0x01,0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01, 0x00,0x00,0x01,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x00,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00, 0x03,0x10,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x01, 0x08,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x02,0x10, 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x01,0x04,0x00, 0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x01,0x02,0x00,0xa3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x01,0x01,0x00,0xa4,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x01,0x00,0xa4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x03,0x10,0x00,0xa5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x01,0x08,0x00,0xa6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x02,0x10,0x00,0xa5,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbc,0x01,0x00,0x00,0x01,0x04,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbd,0x01,0x00,0x00,0x01,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbe,0x01,0x00,0x00,0x01,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf, 0x01,0x00,0x00,0x00,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x03,0x10,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00, 0x00,0x01,0x08,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00, 0x02,0x10,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x01, 0x04,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x01,0x02, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x01,0x01,0x00, 0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x01,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x03,0x10,0x00,0xaf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x01,0x08,0x00,0xb0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x02,0x10,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x01,0x04,0x00,0xb1,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x01,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xcc,0x01,0x00,0x00,0x01,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xcd,0x01,0x00,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xce,0x01,0x00,0x00,0x03,0x10,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf, 0x01,0x00,0x00,0x01,0x08,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01, 0x00,0x00,0x02,0x10,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00, 0x00,0x01,0x04,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00, 0x01,0x02,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x01, 0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x01, 0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x03,0x10,0x00, 0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x01,0x08,0x00,0xba, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x02,0x10,0x00,0xb9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x01,0x04,0x00,0xbb,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x01,0x02,0x00,0xbc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x01,0x01,0x00,0xbd,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xdc,0x01,0x00,0x00,0x03,0x10,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdd,0x01,0x00,0x00,0x01,0x08,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xde,0x01,0x00,0x00,0x02,0x10,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf, 0x01,0x00,0x00,0x01,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01, 0x00,0x00,0x01,0x02,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00, 0x00,0x01,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00, 0x00,0x01,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x03, 0x10,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x01,0x08, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x02,0x10,0x00, 0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x01,0x04,0x00,0xc5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x01,0x02,0x00,0xc6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x01,0x01,0x00,0xc7,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x01,0x00,0xc7,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x03,0x10,0x00,0xc8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x01,0x08,0x00,0xc9,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xec,0x01,0x00,0x00,0x02,0x10,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xed,0x01,0x00,0x00,0x01,0x04,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xee,0x01,0x00,0x00,0x01,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef, 0x01,0x00,0x00,0x01,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0x00,0x01,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x01,0x00, 0x00,0x03,0x10,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01,0x00,0x00, 0x01,0x08,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x02, 0x10,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x01,0x04, 0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x01,0x02,0x00, 0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x01,0x01,0x00,0xd1, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x01,0x00,0xd1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x03,0x10,0x00,0xd2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x01,0x08,0x00,0xd3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x02,0x10,0x00,0xd2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x01,0x04,0x00,0xd4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x01,0x00,0x00,0x01,0x02,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfd,0x01,0x00,0x00,0x01,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0x01,0x00,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff, 0x01,0x00,0x00,0x03,0x10,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x00,0x01,0x08,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00, 0x00,0x02,0x10,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00, 0x01,0x04,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x01, 0x02,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0x01, 0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x01,0x00, 0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x03,0x20,0x00,0xde, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x03,0x20,0x00,0xdf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x03,0x20,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x03,0x20,0x00,0xe1,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x03,0x10,0x00,0xe2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x03,0x08,0x00,0xe3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0c,0x02,0x00,0x00,0x03,0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0d,0x02,0x00,0x00,0x03,0x02,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0x02,0x00,0x00,0x03,0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f, 0x02,0x00,0x00,0x07,0x01,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02, 0x00,0x00,0x03,0x20,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00, 0x00,0x03,0x20,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x00,0x00, 0x03,0x20,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x03, 0x20,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x03,0x20, 0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x03,0x20,0x00, 0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x03,0x20,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x03,0x20,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x01,0x10,0x00,0xef,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x02,0x20,0x00,0xeb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x02,0x20,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x01,0x10,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x02,0x00,0x00,0x01,0x10,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1d,0x02,0x00,0x00,0x02,0x20,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1e,0x02,0x00,0x00,0x02,0x20,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f, 0x02,0x00,0x00,0x01,0x10,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02, 0x00,0x00,0x01,0x10,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x02,0x20,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00, 0x02,0x20,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x01, 0x10,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x00,0x01,0x10, 0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x02,0x00,0x00,0x02,0x20,0x00, 0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x02,0x20,0x00,0xea, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x01,0x10,0x00,0xf6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x01,0x08,0x00,0xf7,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x01,0x04,0x00,0xf8,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x01,0x02,0x00,0xf9,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x01,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2c,0x02,0x00,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2d,0x02,0x00,0x00,0x01,0x08,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2e,0x02,0x00,0x00,0x01,0x04,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f, 0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02, 0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00, 0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x02,0x00,0x00, 0x01,0x08,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x01, 0x04,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x01,0x02, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x02,0x00,0x00,0x01,0x01,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00,0x01,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x07,0x01,0x00,0x07,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x02,0x00,0x00,0x07,0x01,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x07,0x02,0x00,0x08,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x01,0x01,0x00,0x09,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x3b,0x02,0x00,0x00,0x00,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x02,0x00,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3d,0x02,0x00,0x00,0x01,0x00,0x00,0x02,0x3e, 0x02,0x00,0x00,0x01,0x00,0x00,0x3f,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00, 0x24,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x17,0x25,0x00, 0x00,0xa6,0x2b,0x00,0x00,0x02,0x00,0x40,0x02,0x00,0x00,0x0d,0x67,0x65,0x6e,0x78, 0x5f,0x6d,0x63,0x5f,0x33,0x2e,0x61,0x73,0x6d,0x41,0x02,0x00,0x00,0x01,0x00,0x30, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0c, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00, 0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x10,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff, 0x01,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x06,0x00, 0x20,0x08,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x14,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x15, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x07,0x00,0x00,0x00,0x37,0x00,0x06,0x00,0x20,0x08,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x0f,0x00,0x00,0x00, 0x37,0x00,0x06,0x00,0x20,0x01,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x18,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x02,0x01,0x05, 0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00, 0x00,0x01,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x01,0x01,0x67,0x02,0x01,0x05,0x00, 0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x02, 0x01,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x03,0x01,0x67,0x02,0x01,0x05,0x00,0x00, 0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x04,0x01, 0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x05,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00, 0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x06,0x01,0x67, 0x02,0x10,0x1a,0x01,0x00,0x00,0x07,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x1e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x08,0x01,0x67,0x02, 0x10,0x1a,0x01,0x00,0x00,0x09,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x1f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0a,0x01,0x67,0x02,0x10, 0x1a,0x01,0x00,0x00,0x0b,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0c,0x01,0x67,0x02,0x10,0x1a, 0x01,0x00,0x00,0x0d,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0e,0x01,0x67,0x02,0x10,0x1a,0x01, 0x00,0x00,0x0f,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x01,0x00,0x67,0x02,0x10,0x1a,0x01,0x00, 0x00,0x01,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x03,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00, 0x03,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1a,0x01,0x00,0x00,0x05,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x05, 0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1a,0x01,0x00,0x00,0x07,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x07,0x01, 0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1a,0x01,0x00,0x00,0x09,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x09,0x01,0x67, 0x02,0x01,0x05,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a, 0x01,0x00,0x00,0x0b,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x0b,0x01,0x67,0x02, 0x01,0x05,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01, 0x00,0x00,0x0d,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x0d,0x01,0x67,0x02,0x01, 0x05,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00, 0x00,0x0f,0x00,0x67,0x02,0x10,0x1a,0x01,0x00,0x00,0x0f,0x01,0x67,0x02,0x10,0x03, 0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x03,0x00, 0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x03,0x00,0x00, 0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c,0x01,0x00,0x00,0x00,0x08, 0x22,0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x2e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x01,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x2f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x2e,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x22,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00, 0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x34,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x36,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x3a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x19,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x3a,0x01, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00, 0x1b,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x3c, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3b,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x3b,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x3d,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x01,0x00, 0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x10,0x03,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10, 0x03,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x23,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03, 0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00, 0x00,0x08,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38, 0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x19,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x1b,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x4a,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x49,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x49,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x4b,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x4e,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00, 0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x08, 0x46,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00, 0x4f,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x50, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00,0x08,0x22,0x01, 0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x52,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x50,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x53,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x52, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x53,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00, 0x02,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x19,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x10,0x03,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1b, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x01,0x03,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x01, 0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01,0x00,0x00, 0x00,0x02,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00, 0x20,0x30,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x5d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x22, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x5d,0x01,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x23,0x01, 0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x5f,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x5e,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x60,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x61,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x61,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00, 0x63,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03, 0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x03,0x00, 0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x03,0x00,0x00, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x01,0x00,0x00,0x00,0x08, 0x22,0x01,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x68, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x69,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x68,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x24,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x00, 0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6d,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x71,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x72, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x1c,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x72,0x01, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00, 0x1d,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x73,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x74, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x75,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x75,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x76,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x05,0x00, 0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x10,0x03,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01, 0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10, 0x03,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x25,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03, 0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x01,0x00,0x00, 0x00,0x08,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38, 0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x1c,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x1d,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x82,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x81,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x81,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x86,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x08, 0x46,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00, 0x87,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x88, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x08,0x22,0x01, 0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x8a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x88,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8a, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00, 0x06,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x10,0x03,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1d, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x01,0x03,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01, 0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0x8f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00, 0x00,0x02,0x22,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00, 0x20,0x30,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x95,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x24, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x95,0x01,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x25,0x01, 0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x97,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x96,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x98,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00, 0x9b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03, 0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x03,0x00, 0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x03,0x00,0x00, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x08, 0x22,0x01,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xa1,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xa0,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00, 0x00,0x00,0x08,0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x26,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x00, 0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa5,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xa9,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xaa, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x1e,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xaa,0x01, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00, 0x1f,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xab,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xac, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xad,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xab,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xad,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xae,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x09,0x00, 0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x10,0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01, 0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10, 0x03,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x27,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03, 0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x01,0x00,0x00, 0x00,0x08,0x22,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb5,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38, 0x01,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x1e,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x1f,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb9,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xb9,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbb,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0xbe,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00, 0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x08, 0x46,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00, 0xbf,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x08,0x22,0x01, 0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc2,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xc3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xc2, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00, 0x0a,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1e,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x10,0x03,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x1f, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x01,0x03,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x01, 0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc7,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc9,0x01,0x00,0x00, 0x00,0x02,0x22,0x01,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0xca,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00, 0x20,0x30,0x01,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0xcc,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xcd,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x26, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xcd,0x01,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x27,0x01, 0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xcf,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xce,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xce,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xd0,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xd1,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x0b,0x00,0x02,0x00, 0xd3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03, 0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x03,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x03,0x00,0x00, 0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd6,0x01,0x00,0x00,0x00,0x08, 0x22,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x04,0x22, 0x01,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xd8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00,0x00,0x02,0x22,0x01, 0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xd9,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0xd8,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00, 0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x28,0x01,0x00,0x00,0x00, 0x00,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x00, 0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xdd,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00, 0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xe1,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xe2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x20,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xe2,0x01, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00, 0x21,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xe3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xe4, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe5,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xe3,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xe5,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xe6,0x01,0x00,0x00, 0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x0d,0x00, 0x02,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00, 0x10,0x03,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01, 0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10, 0x03,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x29,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x03, 0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00, 0x00,0x08,0x22,0x01,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xed,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38, 0x01,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x20,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x21,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0xf2,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf1,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xf1,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf3,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x00,0x00,0x00,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf4, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf4,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x25,0x00,0x00,0x00,0x20,0x30,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0xf6,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x08, 0x46,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x10,0x03,0x00,0x00,0x00, 0xf7,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0xf8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00,0x08,0x22,0x01, 0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfa,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf8,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xf8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xfb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xfa, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfb,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00, 0x0e,0x00,0x02,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x10,0x03,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x20,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x10,0x03,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x21, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x01,0x03,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00, 0x00,0x02,0x22,0x01,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00, 0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x00,0x00,0x00, 0x20,0x30,0x01,0x00,0x00,0x00,0x0f,0x00,0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x00,0x05,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x28, 0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x10,0x03,0x00,0x00,0x00,0x05,0x02,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x29,0x01, 0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x03,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x07,0x02,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x07,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x06,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x08,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x09,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x25,0x00,0x00,0x00,0x20,0x38,0x01,0x00,0x00,0x00,0x0f,0x00,0x02,0x00, 0x0b,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x01,0x05, 0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00, 0x09,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x01,0x01,0x67,0x02,0x01,0x05,0x00, 0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0b, 0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x03,0x01,0x67,0x02,0x01,0x05,0x00,0x00, 0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0d,0x01, 0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x05,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00, 0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0f,0x01,0x67, 0x02,0x00,0x1a,0x01,0x00,0x00,0x07,0x01,0x67,0x02,0x01,0x05,0x00,0x00,0x00,0x0e, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x0d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x05,0x00,0x00,0x00,0x0f,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x0e, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x10,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x0f,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x08,0x22,0x01,0x00,0x10,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x11,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x11,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x12,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x13,0x02,0x00,0x00,0x00,0x01, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x14,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x15,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07, 0x00,0x00,0x80,0x3b,0x10,0x05,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1a,0x01,0x00,0x00,0x01,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x01, 0x01,0x67,0x02,0x10,0x05,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1a,0x01,0x00,0x00,0x03,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x03,0x01, 0x67,0x02,0x10,0x05,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1a,0x01,0x00,0x00,0x05,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x05,0x01,0x67, 0x02,0x10,0x05,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a, 0x01,0x00,0x00,0x07,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x07,0x01,0x67,0x02, 0x10,0x05,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01, 0x00,0x00,0x09,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x09,0x01,0x67,0x02,0x10, 0x05,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00, 0x00,0x0b,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x0b,0x01,0x67,0x02,0x10,0x05, 0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00, 0x0d,0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x0d,0x01,0x67,0x02,0x10,0x05,0x00, 0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x0f, 0x01,0x67,0x02,0x00,0x1a,0x01,0x00,0x00,0x0f,0x01,0x67,0x02,0x01,0x04,0x00,0x00, 0x00,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1f,0x02,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0x20,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x22, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x24,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x25,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0x24,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x26,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x28, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x27,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x28,0x02, 0x00,0x00,0x01,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x2c,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2b,0x02,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0x2c,0x02,0x00,0x00, 0x01,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x1e,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x2a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x04,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x25,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x26,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x04,0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x29,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04, 0x00,0x00,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x2a,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00, 0x00,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x02,0x00,0x00,0x01, 0x00,0x22,0x01,0x00,0x2d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x02,0x00,0x00,0x00,0x04, 0x22,0x01,0x00,0x2e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2f,0x02,0x00,0x00,0x00,0x02,0x22, 0x01,0x00,0x2f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x31, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x02,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x30,0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80, 0x3b,0x0c,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0xfc,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x33,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x01,0x00,0x00,0x00,0x08,0x22,0x01,0x00, 0x30,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x34,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x02,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x33, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x35,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x34,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x34,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x02,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x37,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x03,0x00,0x00,0x00, 0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x08,0x22, 0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x39, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x02,0x00,0x00,0x00,0x04,0x22,0x01, 0x00,0x38,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x3a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x02,0x00,0x00,0x00,0x02,0x22,0x01,0x00, 0x39,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3b,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3a, 0x02,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x3d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x3e,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00, 0x00,0x3f,0x02,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x3d,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x07,0x00,0x00,0x80,0x3d,0x24,0x00,0x00,0x00,0x00,0x40,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x38,0x00,0x07,0x00,0x08,0x01,0x00,0x41,0x02,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x42,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x08,0x01,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00, 0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x66,0x01,0x24,0x00, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x02,0x62,0x05,0x02,0xf1,0xff,0x40,0x02, 0x00,0x00,0x60,0x01,0x05,0x03,0x44,0x01,0x00,0x01,0x64,0x01,0x00,0x00,0x40,0x02, 0x00,0x00,0x60,0x01,0x05,0x04,0x44,0x01,0x00,0x01,0x04,0x02,0x00,0x00,0x69,0x02, 0x05,0x68,0x02,0x03,0x41,0x00,0x69,0x02,0x06,0x68,0x02,0x04,0x41,0x00,0x61,0x00, 0x07,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x00,0x89,0x02,0x40,0x04,0x07,0x68,0x02,0x05,0xf1,0xff,0x40,0x04, 0x07,0x68,0x62,0x06,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x07,0x00,0x00, 0x00,0x00,0x1f,0x00,0x07,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x31,0xa0, 0x03,0x80,0x00,0x00,0x05,0x08,0x04,0x07,0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x30, 0x07,0x68,0x62,0x06,0x71,0x00,0x31,0x91,0x03,0x80,0x00,0x00,0x05,0x10,0x04,0x07, 0x00,0xc0,0x00,0x00,0x00,0x00,0x40,0x31,0x07,0x68,0x62,0x06,0xf1,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x07,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x00,0x19,0x02,0x31,0xa2, 0x03,0x80,0x00,0x00,0x05,0x18,0x04,0x07,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x32, 0x07,0x68,0x02,0x03,0x31,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x07,0x00,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x61,0x00,0x07,0x62,0x60,0x04,0x01,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x20, 0x05,0x00,0x50,0x20,0x05,0x19,0x0d,0x09,0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x20,0x05,0x1d,0x0d,0x0b,0x68,0x00,0x00,0x00,0x00,0x00,0x40,0x02, 0x05,0x00,0x50,0x00,0x05,0x1b,0x0d,0x08,0x68,0x05,0x05,0x19,0x46,0x00,0x40,0x02, 0x05,0x00,0x50,0x00,0x05,0x1f,0x0d,0x0a,0x68,0x05,0x05,0x1d,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x39,0x05,0x09,0x68,0x05,0x05,0x19,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x3b,0x05,0x0b,0x68,0x05,0x05,0x1d,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x20,0x05,0x21,0x0d,0x0d,0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x21, 0x05,0x00,0x50,0x20,0x05,0x25,0x0d,0x0f,0x68,0x00,0x00,0x00,0x00,0x00,0x41,0x06, 0x03,0x00,0x50,0x05,0x05,0x61,0x85,0x1b,0x54,0x05,0x85,0x1b,0x54,0x00,0x41,0x06, 0x03,0x00,0x50,0x05,0x85,0x61,0x85,0x1f,0x54,0x05,0x85,0x1f,0x54,0x00,0x61,0x00, 0x05,0x00,0x50,0x20,0x05,0x29,0x0d,0x11,0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x05,0x00,0x50,0x20,0x05,0x2d,0x0d,0x13,0x68,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x49,0x05,0x1b,0x54,0x05,0x05,0x1b,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x49,0x05,0x1f,0x54,0x05,0x05,0x1f,0x54,0x00,0x41,0x07, 0x03,0x00,0x50,0x05,0x05,0x4f,0x05,0x39,0x54,0x05,0x05,0x39,0x54,0x00,0x41,0x07, 0x03,0x00,0x50,0x05,0x85,0x4f,0x05,0x3b,0x54,0x05,0x05,0x3b,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x6b,0xc5,0x1b,0x54,0x05,0xc5,0x1b,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x6b,0xc5,0x1f,0x54,0x05,0xc5,0x1f,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x5b,0x45,0x39,0x54,0x05,0x45,0x39,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x66,0x85,0x39,0x54,0x05,0x85,0x39,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x5b,0x45,0x3b,0x54,0x05,0x45,0x3b,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x66,0x85,0x3b,0x54,0x05,0x85,0x3b,0x54,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x23,0x0d,0x0c,0x68,0x05,0x05,0x21,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x27,0x0d,0x0e,0x68,0x05,0x05,0x25,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x62,0x85,0x61,0x46,0x01,0x05,0x61,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x41,0x05,0x11,0x68,0x05,0x05,0x29,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x43,0x05,0x13,0x68,0x05,0x05,0x2d,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x4a,0x85,0x49,0x46,0x01,0x05,0x49,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x50,0x85,0x4f,0x46,0x01,0x05,0x4f,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x3d,0x05,0x0d,0x68,0x05,0x05,0x21,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x3f,0x05,0x0f,0x68,0x05,0x05,0x25,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x6c,0x85,0x6b,0x46,0x01,0x05,0x6b,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x5c,0x85,0x5b,0x46,0x01,0x05,0x5b,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x67,0x85,0x66,0x46,0x01,0x05,0x66,0x46,0x00,0x40,0x07, 0x02,0x00,0x60,0x06,0x05,0x63,0x85,0x62,0x34,0x06,0x05,0x62,0x34,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x71,0xc5,0x39,0x54,0x05,0xc5,0x39,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x71,0xc5,0x3b,0x54,0x05,0xc5,0x3b,0x54,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x2b,0x0d,0x10,0x68,0x05,0x05,0x29,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x2f,0x0d,0x12,0x68,0x05,0x05,0x2d,0x46,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x39,0xc5,0x23,0x54,0x05,0xc5,0x23,0x54,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x4b,0x85,0x4a,0x34,0x06,0x05,0x4a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x51,0x85,0x50,0x34,0x06,0x05,0x50,0x34,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x39,0xc5,0x27,0x54,0x05,0xc5,0x27,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x63,0x45,0x43,0x54,0x05,0x45,0x43,0x54,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x6d,0x85,0x6c,0x34,0x06,0x05,0x6c,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x5d,0x85,0x5c,0x34,0x06,0x05,0x5c,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x68,0x85,0x67,0x34,0x06,0x05,0x67,0x34,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x64,0x45,0x63,0x22,0x06,0x05,0x63,0x22,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x63,0x45,0x41,0x54,0x05,0x45,0x41,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x77,0x05,0x23,0x54,0x05,0x05,0x23,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x05,0x45,0x23,0x54,0x05,0x45,0x23,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x77,0x05,0x27,0x54,0x05,0x05,0x27,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x05,0x45,0x27,0x54,0x05,0x45,0x27,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x4b,0xc5,0x3f,0x54,0x05,0xc5,0x3f,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x72,0x85,0x71,0x46,0x01,0x05,0x71,0x46,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x4c,0x45,0x4b,0x22,0x06,0x05,0x4b,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x52,0x45,0x51,0x22,0x06,0x05,0x51,0x22,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x3a,0x85,0x39,0x46,0x01,0x05,0x39,0x46,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x4b,0xc5,0x3d,0x54,0x05,0xc5,0x3d,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x5d,0x45,0x2f,0x54,0x05,0x45,0x2f,0x54,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x6e,0x45,0x6d,0x22,0x06,0x05,0x6d,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x5e,0x45,0x5d,0x22,0x06,0x05,0x5d,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x69,0x45,0x68,0x22,0x06,0x05,0x68,0x22,0x00,0x40,0x00, 0x65,0xa8,0x12,0x64,0x11,0x64,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x5d,0x45,0x2b, 0x54,0x05,0x45,0x2b,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x64,0x85,0x63, 0x46,0x01,0x05,0x63,0x46,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x55,0x45,0x1b, 0x54,0x05,0x45,0x1b,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x55,0x45,0x1f, 0x54,0x05,0x45,0x1f,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x7c,0x05,0x3d, 0x54,0x05,0x05,0x3d,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x7c,0x05,0x3f, 0x54,0x05,0x05,0x3f,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x52,0x05,0x2f, 0x54,0x05,0x05,0x2f,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x78,0x85,0x77, 0x46,0x01,0x05,0x77,0x46,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x06,0x85,0x05, 0x46,0x01,0x05,0x05,0x46,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x73,0x85,0x72, 0x34,0x06,0x05,0x72,0x34,0x00,0x40,0x00,0x4d,0xa8,0x12,0x4c,0x11,0x4c,0x40,0x00, 0x53,0xa8,0x12,0x52,0x11,0x52,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x3b,0x85,0x3a, 0x34,0x06,0x05,0x3a,0x34,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x4c,0x85,0x4b, 0x46,0x01,0x05,0x4b,0x46,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x52,0x05,0x2b, 0x54,0x05,0x05,0x2b,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x6e,0x85,0x43, 0x54,0x05,0x85,0x43,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x69,0x85,0x2f, 0x54,0x05,0x85,0x2f,0x54,0x00,0x40,0x00,0x6f,0xa8,0x12,0x6e,0x11,0x6e,0x40,0x00, 0x5f,0xa8,0x12,0x5e,0x11,0x5e,0x40,0x00,0x6a,0xa8,0x12,0x69,0x11,0x69,0x68,0x00, 0x00,0x00,0x14,0x82,0x26,0x4e,0x04,0x65,0x00,0x01,0x04,0x00,0x04,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x6e,0x85,0x41,0x54,0x05,0x85,0x41,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x5e,0x85,0x5d,0x46,0x01,0x05,0x5d,0x46,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x69,0x85,0x2b,0x54,0x05,0x85,0x2b,0x54,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x65,0x85,0x64,0x34,0x06,0x05,0x64,0x34,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x1d,0x45,0x3d,0x54,0x05,0x45,0x3d,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x1d,0x45,0x3f,0x54,0x05,0x45,0x3f,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x73,0xc5,0x2f,0x54,0x05,0xc5,0x2f,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x56,0x85,0x55,0x46,0x01,0x05,0x55,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x7d,0x85,0x7c,0x46,0x01,0x05,0x7c,0x46,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x79,0x85,0x78,0x34,0x06,0x05,0x78,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x19,0x85,0x06,0x34,0x06,0x05,0x06,0x34,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x74,0x45,0x73,0x22,0x06,0x05,0x73,0x22,0x00,0x68,0x00, 0x00,0x00,0x14,0x82,0x06,0x4e,0x04,0x4d,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00, 0x00,0x00,0x14,0x82,0x06,0x54,0x04,0x53,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x3c,0x45,0x3b,0x22,0x06,0x05,0x3b,0x22,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x73,0xc5,0x2b,0x54,0x05,0xc5,0x2b,0x54,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x4d,0x85,0x4c,0x34,0x06,0x05,0x4c,0x34,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x53,0x85,0x52,0x46,0x01,0x05,0x52,0x46,0x00,0x61,0x00, 0x05,0x00,0x50,0x20,0x05,0x31,0x0d,0x15,0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x22, 0x05,0x00,0x50,0x20,0x05,0x35,0x0d,0x17,0x68,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x70,0x04,0x6f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x60,0x04,0x5f,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00, 0x00,0x00,0x14,0x82,0x26,0x54,0x04,0x6a,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x66,0x45,0x65,0x22,0x06,0x05,0x65,0x22,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x6f,0x85,0x6e,0x46,0x01,0x05,0x6e,0x46,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x5f,0x85,0x5e,0x34,0x06,0x05,0x5e,0x34,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x6a,0x85,0x69,0x46,0x01,0x05,0x69,0x46,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x79,0xc5,0x43,0x54,0x05,0xc5,0x43,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x25,0x85,0x23,0x54,0x05,0x85,0x23,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x25,0x85,0x27,0x54,0x05,0x85,0x27,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x2e,0x85,0x3d,0x54,0x05,0x85,0x3d,0x54,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x85,0x2e,0x85,0x3f,0x54,0x05,0x85,0x3f,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x1e,0x85,0x1d,0x46,0x01,0x05,0x1d,0x46,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x57,0x85,0x56,0x34,0x06,0x05,0x56,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x45,0x01,0x85,0x7d,0x34,0x06,0x05,0x7d,0x34,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x7a,0x45,0x79,0x22,0x06,0x05,0x79,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x1a,0x45,0x19,0x22,0x06,0x05,0x19,0x22,0x00,0x40,0x00, 0x75,0xa8,0x12,0x74,0x11,0x74,0x40,0x00,0x49,0xa8,0x12,0x3c,0x11,0x3c,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x4f,0x45,0x4d,0x22,0x06,0x05,0x4d,0x22,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x55,0x85,0x53,0x34,0x06,0x05,0x53,0x34,0x00,0x41,0x00, 0x03,0x00,0x50,0x05,0x05,0x79,0xc5,0x41,0x54,0x05,0xc5,0x41,0x54,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x74,0x85,0x73,0x46,0x01,0x05,0x73,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x33,0x0d,0x14,0x68,0x05,0x05,0x31,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x45,0x05,0x15,0x68,0x05,0x05,0x31,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x37,0x0d,0x16,0x68,0x05,0x05,0x35,0x46,0x00,0x40,0x00, 0x05,0x00,0x50,0x00,0x05,0x47,0x05,0x17,0x68,0x05,0x05,0x35,0x46,0x00,0x61,0x00, 0x00,0x00,0x90,0x09,0x35,0x4e,0x04,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x90,0x09,0x15,0x54,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x67,0xa8,0x12,0x66,0x11,0x66,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x6b,0x85,0x6a, 0x34,0x06,0x05,0x6a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x70,0x85,0x6f, 0x34,0x06,0x05,0x6f,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x60,0x45,0x5f, 0x22,0x06,0x05,0x5f,0x22,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x26,0x85,0x25, 0x46,0x01,0x05,0x25,0x46,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1f,0x85,0x1e, 0x34,0x06,0x05,0x1e,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x58,0x45,0x57, 0x22,0x06,0x05,0x57,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x02,0x85,0x01, 0x22,0x06,0x45,0x01,0x22,0x00,0x40,0x00,0x7b,0xa8,0x12,0x7a,0x11,0x7a,0x40,0x00, 0x1b,0xa8,0x12,0x1a,0x11,0x1a,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x76,0x04,0x75, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x4a,0x04,0x49, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x50,0xa8,0x12,0x4f,0x11,0x4f,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x56,0x45,0x55,0x22,0x06,0x05,0x55,0x22,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x31,0x85,0x2e,0x46,0x01,0x05,0x2e,0x46,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x7a,0x85,0x79,0x46,0x01,0x05,0x79,0x46,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x75,0x85,0x74,0x34,0x06,0x05,0x74,0x34,0x00,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x68,0x04,0x67,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x6c,0x45,0x6b,0x22,0x06,0x05,0x6b,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x71,0x45,0x70,0x22,0x06,0x05,0x70,0x22,0x00,0x40,0x00, 0x61,0xa8,0x12,0x60,0x11,0x60,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x58,0x05,0x43, 0x54,0x05,0x05,0x43,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x40,0xc5,0x45, 0x54,0x05,0xc5,0x45,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x02,0x05,0x37, 0x54,0x05,0x05,0x37,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x1b,0x05,0x47, 0x54,0x05,0x05,0x47,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x40,0xc5,0x47, 0x54,0x05,0xc5,0x47,0x54,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x29,0x85,0x26, 0x34,0x06,0x05,0x26,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x20,0x45,0x1f, 0x22,0x06,0x05,0x1f,0x22,0x00,0x40,0x00,0x59,0xa8,0x12,0x58,0x11,0x58,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x03,0x04,0x02,0x00,0x06,0x24,0x02,0x00,0x00,0x68,0x00, 0x00,0x00,0x14,0x82,0x46,0x4e,0x04,0x7b,0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x1c,0x04,0x1b,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00, 0x00,0x00,0x90,0x09,0x35,0x54,0x04,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x90,0x09,0x75,0x4e,0x04,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x51,0x04,0x50,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x57,0xa8,0x12,0x56,0x11,0x56,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x32,0x85,0x31, 0x34,0x06,0x05,0x31,0x34,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x26,0x45,0x45, 0x54,0x05,0x45,0x45,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x26,0x45,0x47, 0x54,0x05,0x45,0x47,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x58,0x05,0x41, 0x54,0x05,0x05,0x41,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x02,0x05,0x33, 0x54,0x05,0x05,0x33,0x54,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x7b,0x85,0x7a, 0x34,0x06,0x05,0x7a,0x34,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x1b,0x05,0x45, 0x54,0x05,0x05,0x45,0x54,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x76,0x45,0x75, 0x22,0x06,0x05,0x75,0x22,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4a,0x0d,0x0b, 0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x4f,0x0d,0x0d, 0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x55,0x0d,0x0f, 0x68,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x31,0x85,0x45, 0x54,0x05,0x85,0x45,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x31,0x85,0x47, 0x54,0x05,0x85,0x47,0x54,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x46,0x0d,0x09, 0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x73,0x0d,0x17, 0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x95,0x54,0x04,0x68, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x6d,0xa8,0x12,0x6c,0x11,0x6c,0x61,0x00, 0x05,0x00,0x50,0x00,0x05,0x6f,0x0d,0x15,0x68,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x72,0xa8,0x12,0x71,0x11,0x71,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x62,0x04,0x61, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x67,0x0d,0x11, 0x68,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x50,0x00,0x05,0x6b,0x0d,0x13, 0x68,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x3a,0xc5,0x33, 0x54,0x05,0xc5,0x33,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x20,0x45,0x37, 0x54,0x05,0x45,0x37,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x3a,0xc5,0x37, 0x54,0x05,0xc5,0x37,0x54,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2a,0x45,0x29, 0x22,0x06,0x05,0x29,0x22,0x00,0x40,0x00,0x21,0xa8,0x12,0x20,0x11,0x20,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x5a,0x04,0x59,0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00, 0x00,0x00,0x90,0x09,0x75,0x54,0x04,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x14,0x82,0x86,0x4e,0x04,0x57,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x03,0x00,0x60,0x01,0x05,0x05,0x85,0x02,0x46,0x01,0x05,0x02,0x46,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x7c,0x45,0x7b,0x22,0x06,0x05,0x7b,0x22,0x00,0x40,0x00, 0x77,0xa8,0x12,0x76,0x11,0x76,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x4c,0x0d,0x13, 0x68,0x05,0x05,0x4a,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x48,0x0d,0x11, 0x68,0x05,0x05,0x46,0x46,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x20,0x45,0x33, 0x54,0x05,0x45,0x33,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x59,0x85,0x58, 0x46,0x01,0x05,0x58,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x51,0x0d,0x15, 0x68,0x05,0x05,0x4f,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x00,0x05,0x57,0x0d,0x17, 0x68,0x05,0x05,0x55,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x63,0x0d,0x0d, 0x68,0x05,0x05,0x4f,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x65,0x0d,0x0f, 0x68,0x05,0x05,0x55,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x5f,0x0d,0x09, 0x68,0x05,0x05,0x46,0x46,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xa6,0x4e,0x04,0x6d, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xa6,0x54,0x04,0x72, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x95,0x4e,0x04,0x62, 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x69,0x0d,0x11, 0x68,0x05,0x05,0x67,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x75,0x0d,0x17, 0x68,0x05,0x05,0x73,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x6d,0x0d,0x13, 0x68,0x05,0x05,0x6b,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x71,0x0d,0x15, 0x68,0x05,0x05,0x6f,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x00,0x05,0x61,0x0d,0x0b, 0x68,0x05,0x05,0x4a,0x46,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x05,0x2c,0x85,0x33, 0x54,0x05,0x85,0x33,0x54,0x00,0x41,0x00,0x03,0x00,0x50,0x05,0x85,0x2c,0x85,0x37, 0x54,0x05,0x85,0x37,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x27,0x85,0x26, 0x46,0x01,0x05,0x26,0x46,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x41,0x85,0x40, 0x46,0x01,0x05,0x40,0x46,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x3b,0x85,0x3a, 0x46,0x01,0x05,0x3a,0x46,0x00,0x40,0x00,0x2d,0xa8,0x12,0x2a,0x11,0x2a,0x68,0x00, 0x00,0x80,0x14,0x82,0x06,0x22,0x04,0x21,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x06,0x85,0x05,0x34,0x06,0x05,0x05,0x34,0x00,0x40,0x00, 0x7d,0xa8,0x12,0x7c,0x11,0x7c,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x78,0x04,0x77, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x21,0x85,0x20, 0x46,0x01,0x05,0x20,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x05,0x05,0x51,0x05,0x51, 0x46,0x05,0x05,0x48,0x46,0x00,0x40,0x00,0x05,0x00,0x50,0x05,0x05,0x57,0x05,0x57, 0x46,0x05,0x05,0x4c,0x46,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x4e,0x04,0x1c, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x35,0x45,0x32, 0x22,0x06,0x05,0x32,0x22,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x79,0x05,0x6a, 0x58,0x01,0x05,0x60,0x58,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x08,0x05,0x72, 0x58,0x01,0x05,0x64,0x58,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x0a,0x05,0x75, 0x58,0x01,0x05,0x65,0x58,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x0c,0x05,0x76, 0x58,0x01,0x05,0x66,0x58,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x28,0x85,0x27, 0x34,0x06,0x05,0x27,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x42,0x85,0x41, 0x34,0x06,0x05,0x41,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x3c,0x85,0x3b, 0x34,0x06,0x05,0x3b,0x34,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0x66,0x4e,0x04,0x2d, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x55,0x54,0x04,0x22, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x19,0x45,0x06, 0x22,0x06,0x05,0x06,0x22,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x7b,0x05,0x6d, 0x58,0x01,0x05,0x61,0x58,0x00,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x01,0x04,0x7d, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x4e,0x04,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1c,0x85,0x1b, 0x46,0x01,0x05,0x1b,0x46,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x32,0x85,0x31, 0x46,0x01,0x05,0x31,0x46,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x2d,0x85,0x2c, 0x46,0x01,0x05,0x2c,0x46,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x22,0x85,0x21, 0x34,0x06,0x05,0x21,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x05,0x05,0x71, 0x58,0x01,0x05,0x63,0x58,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x7d,0x05,0x6e, 0x58,0x01,0x05,0x62,0x58,0x00,0x40,0x00,0x04,0x00,0x60,0x01,0x05,0x77,0x05,0x69, 0x58,0x01,0x05,0x5f,0x58,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0x15,0x4e,0x04,0x5a, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x00,0x50,0x05,0x05,0x57,0x05,0x57, 0x46,0x05,0x05,0x51,0x46,0x00,0x40,0x00,0x36,0xa8,0x12,0x35,0x11,0x35,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x29,0x45,0x28,0x22,0x06,0x05,0x28,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x43,0x45,0x42,0x22,0x06,0x05,0x42,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x3d,0x45,0x3c,0x22,0x06,0x05,0x3c,0x22,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x1d,0x85,0x1c,0x34,0x06,0x05,0x1c,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x2e,0x85,0x2d,0x34,0x06,0x05,0x2d,0x34,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x23,0x45,0x22,0x22,0x06,0x05,0x22,0x22,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x5a,0x85,0x59,0x34,0x06,0x05,0x59,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x06,0x05,0x35,0x85,0x32,0x34,0x06,0x05,0x32,0x34,0x00,0x40,0x00, 0x08,0xa0,0x02,0x08,0x00,0x79,0x40,0x00,0x0a,0xa0,0x02,0x0a,0x00,0x7b,0x40,0x00, 0x0c,0xa0,0x02,0x0c,0x00,0x7d,0x40,0x00,0x05,0xa0,0x02,0x05,0x00,0x77,0x68,0x00, 0x00,0x00,0x14,0x82,0x66,0x54,0x04,0x36,0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00, 0x2a,0xa8,0x12,0x29,0x11,0x29,0x40,0x00,0x44,0xa8,0x12,0x43,0x11,0x43,0x40,0x00, 0x3e,0xa8,0x12,0x3d,0x11,0x3d,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x1e,0x45,0x1d, 0x22,0x06,0x05,0x1d,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2f,0x45,0x2e, 0x22,0x06,0x05,0x2e,0x22,0x00,0x40,0x00,0x24,0xa8,0x12,0x23,0x11,0x23,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x5b,0x45,0x5a,0x22,0x06,0x05,0x5a,0x22,0x00,0x40,0x00, 0x01,0x00,0x60,0x06,0x05,0x36,0x45,0x35,0x22,0x06,0x05,0x35,0x22,0x00,0x40,0x00, 0x04,0x00,0x50,0x05,0x05,0x59,0x05,0x58,0x58,0x05,0x05,0x57,0x58,0x00,0x40,0x00, 0x1a,0xa8,0x12,0x19,0x11,0x19,0x40,0x00,0x0c,0xa0,0x02,0x0c,0x00,0x08,0x40,0x00, 0x0a,0xa0,0x02,0x0a,0x00,0x05,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x2b,0x04,0x2a, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x45,0x04,0x44, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x3f,0x04,0x3e, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x1f,0xa8,0x12,0x1e,0x11,0x1e,0x40,0x00, 0x30,0xa8,0x12,0x2f,0x11,0x2f,0x68,0x00,0x00,0x80,0x14,0x82,0x06,0x25,0x04,0x24, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x5c,0xa8,0x12,0x5b,0x11,0x5b,0x40,0x00, 0x39,0xa8,0x12,0x36,0x11,0x36,0x68,0x00,0x00,0x00,0x14,0x82,0x46,0x54,0x24,0x03, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x54,0x04,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x50,0x05,0x05,0x5a,0x85,0x59, 0x46,0x05,0x05,0x59,0x46,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xc6,0x4e,0x04,0x1a, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xd5,0x54,0x04,0x2b, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xf5,0x54,0x04,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xf5,0x4e,0x04,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xc6,0x54,0x04,0x1f, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xe6,0x4e,0x04,0x30, 0x00,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xd5,0x4e,0x04,0x25, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0x86,0x54,0x04,0x5c, 0x00,0x01,0x04,0x00,0x04,0x00,0x68,0x00,0x00,0x00,0x14,0x82,0xe6,0x54,0x04,0x39, 0x00,0x01,0x04,0x00,0x04,0x00,0x40,0x00,0x0c,0xa0,0x02,0x0c,0x00,0x0a,0x40,0x07, 0x02,0x00,0x50,0x05,0x05,0x5b,0x45,0x5a,0x34,0x05,0x05,0x5a,0x34,0x00,0x40,0x05, 0x03,0x00,0x60,0x01,0x05,0x15,0x85,0x4e,0x46,0x01,0x05,0x4e,0x46,0x00,0x40,0x04, 0x03,0x00,0x60,0x01,0x05,0x1a,0x85,0x54,0x46,0x01,0x05,0x54,0x46,0x00,0x40,0x04, 0x0e,0xa1,0x02,0x0d,0x00,0x0c,0x40,0x04,0x01,0x00,0x50,0x05,0x05,0x5c,0x25,0x5b, 0x22,0x05,0x05,0x5b,0x22,0x00,0x40,0x04,0x02,0x00,0x60,0x06,0x05,0x16,0x85,0x15, 0x34,0x06,0x05,0x15,0x34,0x00,0x40,0x04,0x02,0x00,0x60,0x06,0x05,0x1b,0x85,0x1a, 0x34,0x06,0x05,0x1a,0x34,0x00,0x40,0x04,0x02,0x00,0x60,0x06,0x05,0x0f,0x85,0x0e, 0x34,0x06,0x05,0x0e,0x34,0x00,0x40,0x04,0x00,0x00,0x50,0x05,0x05,0x5d,0x04,0x5c, 0x00,0x05,0x14,0x5c,0x00,0x00,0x40,0x04,0x01,0x00,0x60,0x06,0x05,0x17,0x45,0x16, 0x22,0x06,0x05,0x16,0x22,0x00,0x40,0x04,0x01,0x00,0x60,0x06,0x05,0x1c,0x45,0x1b, 0x22,0x06,0x05,0x1b,0x22,0x00,0x40,0x04,0x01,0x00,0x60,0x06,0x05,0x10,0x45,0x0f, 0x22,0x06,0x05,0x0f,0x22,0x00,0x61,0x04,0x00,0x00,0xa0,0x05,0x05,0x5e,0x04,0x5d, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x18,0xa8,0x12,0x17,0x11,0x17,0x40,0x04, 0x1d,0xa8,0x12,0x1c,0x11,0x1c,0x40,0x04,0x11,0xa8,0x12,0x10,0x11,0x10,0x41,0x04, 0x5e,0xe8,0x00,0x5e,0x81,0x3b,0x61,0x04,0x19,0x68,0x06,0x18,0x01,0x00,0x61,0x04, 0x1e,0x68,0x06,0x1d,0x01,0x00,0x61,0x00,0x13,0xa8,0x00,0x00,0x81,0x3b,0x61,0x05, 0x12,0x68,0x06,0x11,0x01,0x00,0x41,0x05,0x5e,0x28,0x00,0x5e,0x11,0x5e,0x40,0x04, 0x19,0x28,0x00,0x19,0x11,0x1e,0x5b,0x02,0x00,0x00,0xa0,0x22,0x04,0x14,0x04,0x5e, 0x02,0x02,0x04,0x13,0x04,0x12,0x41,0x02,0x14,0xe8,0x60,0x19,0x81,0x3d,0x31,0x93, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x07,0x00,0xc0,0x0c,0x14,0x00,0x00,0x31,0x00, 0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00 }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_mc_gen12lp_isa.h000066400000000000000000000023321443134507600316000ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_MC_GEN12LP_ISA_H__ #define __GENX_MC_GEN12LP_ISA_H__ extern const unsigned char genx_mc_gen12lp[126750]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_me_gen12lp_isa.cpp000066400000000000000000005615771443134507600321620ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_me_gen12lp_isa.h" const unsigned char genx_me_gen12lp[37158] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x05,0x00,0x0d,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31, 0x4d,0x56,0x5f,0x4d,0x52,0x45,0xed,0x00,0x00,0x00,0xb7,0x0f,0x00,0x00,0x28,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xa4,0x10,0x00,0x00,0xe0,0x05,0x00,0x00, 0x11,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d,0x56,0x5f,0x4d,0x52,0x45,0x5f,0x38, 0x78,0x38,0x84,0x16,0x00,0x00,0x8f,0x0e,0x00,0x00,0x45,0x1d,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0x13,0x25,0x00,0x00,0x78,0x05,0x00,0x00,0x10,0x4d,0x65,0x50, 0x31,0x36,0x62,0x69,0x5f,0x31,0x4d,0x56,0x32,0x5f,0x4d,0x52,0x45,0x8b,0x2a,0x00, 0x00,0x80,0x1b,0x00,0x00,0x42,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x0b, 0x46,0x00,0x00,0xa8,0x09,0x00,0x00,0x14,0x4d,0x65,0x50,0x31,0x36,0x62,0x69,0x5f, 0x31,0x4d,0x56,0x32,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0xb3,0x4f,0x00,0x00, 0x1b,0x1d,0x00,0x00,0xe2,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0xce,0x6c, 0x00,0x00,0x88,0x0a,0x00,0x00,0x18,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d,0x45, 0x5f,0x32,0x42,0x69,0x52,0x65,0x66,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x56, 0x77,0x00,0x00,0xd0,0x12,0x00,0x00,0xfd,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x0c,0x26,0x8a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d,0x56,0x5f,0x4d,0x52,0x45,0x00,0x6e, 0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72, 0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78, 0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72, 0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68, 0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30, 0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54, 0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32, 0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56, 0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56, 0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56, 0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56, 0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56, 0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56, 0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56, 0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56, 0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56, 0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56, 0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56, 0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56, 0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56, 0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56, 0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56, 0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56, 0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56, 0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31, 0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00, 0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56, 0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31, 0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x50,0x31,0x00,0x50,0x32,0x00,0x50,0x33, 0x00,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d,0x56,0x5f,0x4d,0x52,0x45,0x5f,0x42, 0x42,0x5f,0x30,0x5f,0x36,0x38,0x00,0x42,0x42,0x5f,0x31,0x5f,0x31,0x31,0x30,0x00, 0x54,0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x41,0x73,0x6d,0x4e, 0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00, 0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x51, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x53,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3d,0x00,0x00,0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e, 0x00,0x00,0x00,0x02,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x02,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x02,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x01, 0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x04,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x05,0x80,0x00,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x01,0x10,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x05,0x40,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x05,0x40,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x03,0x02,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x03,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x03,0x20,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4c,0x00,0x00,0x00,0x03,0x20,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x03,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x05,0x40,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x03,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x03,0x20,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00, 0x03,0x20,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x05, 0x40,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x03,0x02, 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x04,0x40,0x00, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x02,0x02,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x05,0x02,0x00,0x31,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x05,0x04,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x05,0x01,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x10,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x01,0x30,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5b,0x00,0x00,0x00,0x05,0xc0,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5c,0x00,0x00,0x00,0x01,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5d,0x00,0x00,0x00,0x01,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e, 0x00,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00, 0x00,0x00,0x03,0x90,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x02,0x90,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x01,0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00, 0x01,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x01, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x03,0x40,0x00, 0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x01,0x40,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x01,0x10,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x01,0x08,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x05,0x00,0x01,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x01,0x00,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x6b,0x00,0x00,0x00,0x02,0x00,0x00,0x6c,0x00,0x00, 0x00,0x02,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00, 0x00,0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x70,0x00,0x00,0x00,0x01, 0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x00,0x00, 0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x06,0x00,0x00, 0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08, 0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00, 0x00,0x23,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x34,0x00, 0x01,0x00,0x20,0x08,0x00,0x00,0x97,0x07,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00, 0x0d,0x67,0x65,0x6e,0x78,0x5f,0x6d,0x65,0x5f,0x30,0x2e,0x61,0x73,0x6d,0x75,0x00, 0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x06,0x00,0x07,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x44,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x10,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x10,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35, 0x03,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00, 0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x03,0x00, 0x02,0x05,0x01,0x00,0x00,0xa4,0x76,0x29,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x01,0x04,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x00,0x16,0x00,0x02,0x05,0x05,0x40,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x17,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x4e,0x00, 0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x16, 0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03, 0x01,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00, 0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x01,0x00,0x00,0x4f, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01,0x01,0x01, 0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x0f,0x20,0x00,0x00, 0x10,0x4e,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x01,0x00,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00,0x00, 0x00,0x51,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x0b, 0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x2a,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03, 0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00, 0x29,0x05,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x05, 0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x10,0x55,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x02,0x00,0x00,0x53,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01,0x01,0x02,0x00,0x00,0x57,0x00, 0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x03,0x0f,0x20,0x00,0x00,0x10,0x54,0x00,0x00, 0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x02,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x02, 0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00, 0x00,0x00,0x0b,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x01, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x51,0x00,0x00,0x00, 0x00,0x04,0x22,0x01,0x21,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x00, 0x02,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x58,0x00, 0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff,0xff,0x29,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x05,0x05,0x3f,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x09,0x00,0x02,0x00,0x4b,0x00,0x00, 0x00,0x01,0x18,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x08, 0x00,0x02,0x00,0x4b,0x00,0x00,0x00,0x01,0x19,0x21,0x01,0x01,0x01,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x16,0x22, 0x01,0x05,0x03,0x70,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x5b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x03, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x05,0x0f,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00, 0x58,0x00,0x00,0x00,0x01,0x0a,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x1f,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00, 0x29,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x02, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x20, 0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x61,0x00,0x00, 0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00, 0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00, 0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09,0x00,0x64, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x36,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00, 0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x65,0x00,0x00,0x00,0x07,0x0a,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x07,0x08,0x21,0x01,0x24, 0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x38,0x00,0x08,0x00,0x04, 0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x38,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x03,0x00,0x00, 0x6a,0x00,0x00,0x00,0x02,0x04,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00, 0x03,0x00,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x0d,0x00, 0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x58,0x00, 0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05,0xfb,0xff,0xff,0xff,0x29,0x03,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x00,0x00,0x00,0x00,0x29, 0x03,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x08,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x37,0x00,0x00,0x00, 0x07,0x05,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x02,0x00,0x00, 0x03,0x00,0x37,0x00,0x00,0x00,0x07,0x05,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x03,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x00, 0x00,0x10,0x00,0x10,0x03,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x00,0x03,0x00,0x29, 0x03,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00, 0x3d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x04,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x02,0x14,0x00, 0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00, 0x02,0x15,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6e, 0x00,0x00,0x00,0x02,0x16,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x00,0x60,0x78,0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00, 0x00,0x00,0x08,0x07,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x31, 0x01,0x00,0x38,0x00,0x09,0x00,0x04,0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x41,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x61,0x01,0x30,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x00,0x00,0x80, 0x10,0x82,0xe6,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x31,0xb0,0x04,0x80, 0x00,0x00,0x05,0x0a,0x04,0x30,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80, 0x10,0x82,0xc6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80, 0x10,0x81,0xe5,0x01,0xe4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x80, 0x50,0x00,0xd5,0x01,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00, 0x60,0x01,0x25,0x02,0x84,0x01,0x00,0x01,0xc4,0x01,0x00,0x00,0x40,0x03,0x00,0x00, 0x60,0x01,0x45,0x02,0x94,0x01,0x00,0x01,0xe4,0x01,0x00,0x00,0x61,0x00,0x05,0x00, 0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x00,0x00, 0x60,0x06,0x65,0x02,0x24,0x02,0x00,0x05,0xd4,0x01,0x00,0x00,0x41,0x03,0x00,0x00, 0x60,0x06,0x85,0x02,0x44,0x02,0x00,0x05,0xd4,0x01,0x00,0x00,0x61,0x00,0x00,0x00, 0xa0,0x4a,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x76,0x61,0x00,0x00,0x00, 0x40,0x45,0x26,0x04,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xb6,0x03,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xbe,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x66,0x07,0x00,0x00, 0x40,0x84,0x06,0x04,0x04,0x04,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x07,0x00,0x00, 0x90,0x09,0x45,0x03,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x00,0x00, 0x90,0x09,0x55,0x03,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x01,0x00, 0x50,0x84,0xa5,0x02,0xb5,0x03,0x22,0x05,0xf0,0xff,0xf0,0xff,0x61,0x02,0x05,0x00, 0x90,0x09,0x05,0x05,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x03,0x01,0x00, 0x50,0x85,0xc5,0x02,0xa5,0x02,0x22,0x05,0x01,0x00,0x01,0x00,0x70,0x00,0x01,0x00, 0x50,0x85,0x01,0x00,0xa5,0x02,0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x03,0x00,0x00, 0x50,0x85,0x15,0x05,0x14,0x05,0x00,0x05,0xfe,0xff,0xfe,0xff,0x61,0x00,0x00,0x00, 0x90,0x09,0xb5,0x05,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x45,0x05,0x45,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x01,0x00, 0x50,0x05,0x05,0x05,0x05,0x05,0x22,0x05,0xc5,0x02,0x22,0x02,0x40,0x00,0x01,0x01, 0x50,0xa4,0x05,0x05,0xb5,0x03,0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01, 0x90,0x49,0x05,0x05,0x00,0x00,0x00,0x00,0x01,0xe0,0x01,0xe0,0x40,0x05,0x01,0x00, 0x50,0x84,0x05,0x07,0xb5,0x05,0x22,0x05,0xf0,0xff,0xf0,0xff,0x61,0x02,0x05,0x00, 0x90,0x09,0x05,0x08,0x05,0x05,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x90,0x09,0xb5,0x08,0xb4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x49,0x25,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00, 0x50,0x80,0x45,0x07,0xb5,0x08,0x22,0x05,0x70,0x00,0x70,0x00,0x6c,0x05,0x01,0x00, 0x50,0x85,0x25,0x07,0x05,0x07,0x22,0x05,0x01,0x00,0x01,0x00,0x68,0x02,0x01,0x00, 0x10,0x81,0x45,0x07,0x45,0x07,0x22,0x01,0x03,0x00,0x03,0x00,0x70,0x00,0x01,0x00, 0x50,0x85,0x01,0x00,0x05,0x07,0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x02,0x01,0x00, 0x40,0x84,0x66,0x07,0x44,0x07,0x20,0x05,0x0f,0x00,0x0f,0x00,0x66,0x00,0x00,0x00, 0x40,0x84,0x06,0x09,0x04,0x09,0x00,0x05,0x02,0x00,0x02,0x00,0x65,0x07,0x00,0x00, 0x50,0x85,0x35,0x08,0x34,0x08,0x00,0x05,0xfe,0xff,0xfe,0xff,0x69,0x03,0x00,0x00, 0x40,0x84,0xb6,0x01,0x74,0x07,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80, 0x50,0x04,0x85,0x07,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x45,0x08,0x45,0x05,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0x26,0x09,0x00,0x00,0x00,0x00,0x3f,0x00,0x3f,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0x36,0x09,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xfe,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x61,0x20,0x00,0x00, 0x40,0x04,0x4e,0x09,0xc4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x40,0x04,0x46,0x09,0xcc,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x07,0x00,0x00, 0x40,0x84,0x06,0x09,0x04,0x09,0x00,0x05,0x80,0xff,0x80,0xff,0x40,0x07,0x01,0x00, 0x50,0x05,0x25,0x08,0x25,0x08,0x22,0x05,0x25,0x07,0x22,0x02,0x66,0x07,0x00,0x00, 0x40,0x04,0x56,0x09,0xb4,0x01,0x00,0x05,0x84,0x07,0x00,0x00,0x40,0x00,0x01,0x01, 0x50,0xa4,0x25,0x08,0xb5,0x05,0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01, 0x90,0x49,0x25,0x08,0x00,0x00,0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00,0x02,0x68, 0x20,0x01,0x01,0x00,0x61,0x02,0x0e,0x60,0x00,0x08,0x00,0x00,0x61,0x00,0x10,0xa0, 0x00,0x00,0x01,0x00,0x61,0x00,0x12,0x60,0x00,0x0a,0x00,0x00,0x40,0x04,0x00,0x00, 0x60,0x86,0x01,0x10,0x04,0x02,0x00,0x06,0x00,0xc0,0x98,0x0c,0x65,0x04,0x00,0x00, 0x40,0x84,0x6e,0x0e,0x6c,0x0e,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00, 0x90,0x09,0x05,0x0e,0x05,0x08,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0e,0xa8, 0x60,0x00,0x01,0x00,0x61,0x00,0x11,0xa1,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00, 0x60,0x86,0xe5,0x02,0x24,0x02,0x00,0x05,0x02,0x00,0x02,0x00,0x31,0xa1,0x04,0x00, 0x00,0x00,0x05,0x14,0x04,0x0e,0x00,0x80,0x00,0x00,0x00,0x00,0x61,0x00,0x31,0x64, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x85,0x01,0x00,0x44,0x0c,0x00,0x15, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x31,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x61,0x05,0x31,0x62,0x80,0x02,0x01,0x00,0x61,0x00,0x00,0x80, 0xa0,0x0a,0x25,0x31,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x21,0x00,0x00, 0x60,0x01,0x05,0x1d,0x84,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x90,0x09,0x05,0x2f,0xa5,0x1b,0x22,0x00,0x00,0x00,0x00,0x00,0x31,0xa2,0x03,0x80, 0x00,0x00,0x01,0x00,0x04,0x31,0x00,0xc0,0x0c,0x1d,0x00,0x00,0x20,0x00,0x00,0x81, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x61,0x32,0x03,0x00, 0x50,0x44,0x85,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00, 0x40,0x84,0x6e,0x08,0x6c,0x08,0x00,0x05,0x30,0x00,0x30,0x00,0x65,0x00,0x00,0x00, 0x40,0x84,0x76,0x08,0x74,0x08,0x00,0x05,0xfb,0xff,0xfb,0xff,0x61,0x00,0x03,0x00, 0x50,0x44,0x85,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0xa5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x61,0x05,0x03,0x00, 0x60,0x05,0x05,0x1e,0x85,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00, 0x60,0x05,0x05,0x1f,0x85,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x23,0xa1, 0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x04,0x02,0x00,0x06, 0x00,0x60,0x78,0x10,0x61,0x07,0x20,0x60,0x00,0x08,0x00,0x00,0x41,0x06,0x03,0x00, 0x60,0x06,0x05,0x22,0xa4,0x07,0x00,0x05,0x85,0x2f,0x46,0x00,0x61,0x05,0x24,0x60, 0x00,0x1e,0x00,0x00,0x61,0x00,0x26,0x60,0x00,0x1e,0x00,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xa6,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xae,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x40,0x45,0xb6,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x24,0x21, 0x74,0x1b,0x01,0x00,0x61,0x00,0x26,0x21,0x74,0x1b,0x01,0x00,0x31,0x93,0x04,0x00, 0x00,0x00,0x05,0x28,0x04,0x20,0x00,0xd0,0x00,0x00,0x00,0x00,0x61,0x23,0x01,0x00, 0x90,0x09,0x05,0x2f,0x05,0x29,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x32,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80, 0xa0,0x4a,0x45,0x32,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x61,0x00,0x32,0x62, 0x80,0x02,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x32,0x44,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x32,0x00,0xc0, 0x0c,0x2f,0x00,0x00,0x31,0x04,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d, 0x56,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74, 0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79, 0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00, 0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30, 0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00, 0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33, 0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33, 0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33, 0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34, 0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34, 0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35, 0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35, 0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35, 0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36, 0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36, 0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37, 0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37, 0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37, 0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38, 0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38, 0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39, 0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39, 0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39, 0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32, 0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00, 0x56,0x31,0x30,0x36,0x00,0x50,0x31,0x00,0x50,0x32,0x00,0x4d,0x65,0x50,0x31,0x36, 0x5f,0x31,0x4d,0x56,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x5f,0x42,0x42,0x5f, 0x30,0x5f,0x36,0x35,0x00,0x42,0x42,0x5f,0x31,0x5f,0x31,0x30,0x33,0x00,0x54,0x36, 0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d, 0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x23,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x51,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x53,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x02,0x02,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x02,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00, 0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x02,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01, 0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x04,0x01, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x01,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x05,0x80,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x10,0x00,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x05,0x40,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x03,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x05,0x40,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x03,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x03,0x20,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x03,0x20,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x05,0x40,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x03,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x04,0x40,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x02,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x05,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x05, 0x04,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x05,0x01, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x01,0x10,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x01,0x30,0x00,0x33, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x05,0xc0,0x00,0x33,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x01,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x01,0x01,0x00,0x21,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x03,0x90,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x02,0x90,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x01,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x00,0x00,0x00,0x01,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x00,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x03,0x40,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x01,0x40,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01, 0x10,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x08, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x05,0x00,0x01, 0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x01,0x01,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x02,0x00, 0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x69,0x00,0x00,0x00,0x01,0x00,0x00,0x6a, 0x00,0x00,0x00,0x01,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x6c,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00, 0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00, 0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x00,0x23,0x00, 0x00,0x00,0x30,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x34,0x00,0x01,0x00,0x72, 0x07,0x00,0x00,0x1d,0x07,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x0d,0x67,0x65, 0x6e,0x78,0x5f,0x6d,0x65,0x5f,0x31,0x2e,0x61,0x73,0x6d,0x6e,0x00,0x00,0x00,0x01, 0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x06, 0x00,0x07,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x03,0x00,0x06, 0x05,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29, 0x05,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x04, 0x00,0x02,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01, 0x00,0x00,0xa0,0x77,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x04,0x00, 0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x00,0x16,0x00,0x02,0x05,0x05,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x17,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x01,0x01,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00, 0x16,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x03,0x01,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x50,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x4e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x01,0x00,0x00, 0x4c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01,0x01, 0x01,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x0f,0x20,0x00, 0x00,0x10,0x4d,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x01,0x00,0x00,0x4f, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00, 0x0b,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x2a,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x21,0x00,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05, 0x05,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff, 0xff,0x29,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x05,0x05, 0x3f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x09,0x00, 0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x18,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x19,0x21,0x01, 0x01,0x01,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x00, 0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03,0x70,0x00,0x00,0x00,0x25,0x01,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x05, 0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x01,0x0a,0x00,0x02,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x05,0x05,0x20,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x1f,0x00,0x02,0x05, 0x05,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x20,0x00,0x00, 0x00,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x59,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x20,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x5a,0x00, 0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x03,0x00, 0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x00,0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09,0x00, 0x5d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5e,0x00,0x00,0x00,0x08,0x08,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x07,0x04,0x22,0x01, 0x24,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x02,0x00,0x62, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x35,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x02,0x02,0x00,0x00,0x64,0x00,0x00, 0x00,0x02,0x04,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x01, 0x00,0x21,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x51, 0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0x30,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00, 0x0e,0x21,0x01,0x05,0x05,0xfb,0xff,0xff,0xff,0x29,0x03,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x08,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x02,0x00, 0x00,0x02,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x00,0x00,0x08,0x04,0x21, 0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x34, 0x00,0x00,0x00,0x08,0x05,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x02,0x00,0x00,0x03,0x00,0x34,0x00,0x00,0x00,0x08,0x06,0x21,0x01,0x29,0x02,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x34,0x00,0x00,0x00,0x08, 0x07,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x00,0x00,0x10,0x00,0x10,0x03,0x00,0x00, 0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x01,0x03,0x00,0x03,0x00,0x29,0x03,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x65,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x65,0x00,0x00,0x00, 0x06,0x00,0x00,0x02,0x00,0x39,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x29,0x00,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x02,0x14,0x00,0x02,0x05,0x05,0x03,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x02,0x15,0x00,0x02,0x05,0x05,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x02,0x16,0x00,0x02, 0x05,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x60, 0x78,0x10,0x5d,0x00,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3e,0x00,0x00,0x00,0x01,0x00,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x36,0x02,0x31,0x01, 0x00,0x38,0x00,0x09,0x00,0x08,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3f,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x61,0x01,0x2e,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x00,0x00,0x80,0x10, 0x82,0xe6,0x01,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x31,0xb0,0x04,0x80,0x00, 0x00,0x05,0x08,0x04,0x2e,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10, 0x82,0xc6,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10, 0x81,0xe5,0x01,0xe4,0x01,0x00,0x01,0xff,0x0f,0xff,0x0f,0x61,0x00,0x00,0x80,0x50, 0x00,0xd5,0x01,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x60, 0x01,0x25,0x02,0x84,0x01,0x00,0x01,0xc4,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x60, 0x01,0x45,0x02,0x94,0x01,0x00,0x01,0xe4,0x01,0x00,0x00,0x41,0x02,0x00,0x00,0x60, 0x06,0x65,0x02,0x24,0x02,0x00,0x05,0xd4,0x01,0x00,0x00,0x41,0x02,0x00,0x00,0x60, 0x06,0x85,0x02,0x44,0x02,0x00,0x05,0xd4,0x01,0x00,0x00,0x61,0x00,0x05,0x00,0x90, 0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90, 0x09,0x45,0x03,0x64,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90, 0x09,0x55,0x03,0x84,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8,0x98, 0x00,0xa1,0x77,0x61,0x00,0x00,0x00,0x40,0x45,0x26,0x04,0x00,0x00,0x00,0x00,0x20, 0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xb6,0x03,0x00,0x00,0x00,0x00,0x40, 0x00,0x40,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xbe,0x03,0x00,0x00,0x00,0x00,0x20, 0x00,0x20,0x00,0x61,0x00,0x02,0x68,0x20,0x01,0x01,0x00,0x61,0x02,0x05,0x00,0x90, 0x09,0x05,0x06,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90, 0x09,0xb5,0x06,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50, 0x84,0xa5,0x02,0xb5,0x03,0x22,0x05,0xf0,0xff,0xf0,0xff,0x40,0x02,0x01,0x00,0x50, 0x80,0x05,0x05,0xb5,0x06,0x22,0x05,0x70,0x00,0x70,0x00,0x61,0x00,0x01,0x00,0x90, 0x49,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x01,0x00,0x10, 0x81,0x05,0x05,0x05,0x05,0x22,0x01,0x03,0x00,0x03,0x00,0x66,0x00,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x02,0x00,0x02,0x00,0x65,0x02,0x01,0x00,0x40, 0x84,0x26,0x05,0x04,0x05,0x20,0x05,0x0f,0x00,0x0f,0x00,0x6c,0x06,0x01,0x00,0x50, 0x85,0xc5,0x02,0xa5,0x02,0x22,0x05,0x01,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x50, 0x85,0x01,0x00,0xa5,0x02,0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x06,0x00,0x00,0x50, 0x85,0x15,0x06,0x14,0x06,0x00,0x05,0xfe,0xff,0xfe,0xff,0x66,0x05,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x80,0xff,0x80,0xff,0x69,0x05,0x00,0x00,0x40, 0x84,0xb6,0x01,0x34,0x05,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50, 0x04,0x65,0x05,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90, 0x09,0x45,0x06,0x45,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0x26,0x07,0x00,0x00,0x00,0x00,0x3f,0x00,0x3f,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0x36,0x07,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0xfe,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x07,0x01,0x00,0x50, 0x05,0x05,0x06,0x05,0x06,0x22,0x05,0xc5,0x02,0x22,0x02,0x66,0x07,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x20,0x00,0x20,0x00,0x66,0x07,0x00,0x00,0x40, 0x04,0x56,0x07,0xb4,0x01,0x00,0x05,0x64,0x05,0x00,0x00,0x61,0x20,0x00,0x00,0x40, 0x04,0x4e,0x07,0xc4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40, 0x04,0x46,0x07,0xcc,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x01,0x50, 0xa4,0x05,0x06,0xb5,0x03,0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01,0x90, 0x49,0x05,0x06,0x00,0x00,0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00,0x0e,0xa0,0x00, 0x00,0x01,0x00,0x61,0x02,0x0c,0x60,0x00,0x06,0x00,0x00,0x40,0x00,0x00,0x00,0x60, 0x86,0x01,0x10,0x04,0x02,0x00,0x06,0x00,0xc0,0x98,0x0c,0x61,0x00,0x10,0x60,0x00, 0x08,0x00,0x00,0x61,0x00,0x0f,0xa1,0x00,0x00,0x01,0x00,0x65,0x04,0x00,0x00,0x40, 0x84,0x6e,0x0c,0x6c,0x0c,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90, 0x09,0x05,0x0c,0x05,0x06,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0c,0xa8,0x60, 0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x02,0x24,0x02,0x00,0x05,0x03, 0x00,0x03,0x00,0x31,0xa1,0x04,0x00,0x00,0x00,0x05,0x12,0x04,0x0c,0x00,0x80,0x00, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x45,0x05,0x44,0x02,0x00,0x05,0x01, 0x00,0x01,0x00,0x61,0x00,0x2f,0x64,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50, 0x85,0x01,0x00,0x44,0x0a,0x00,0x15,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x2f,0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x06,0x2f,0x62,0x80, 0x02,0x01,0x00,0x61,0x06,0x00,0x80,0xa0,0x0a,0x25,0x2f,0x44,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x21,0x02,0x00,0x60,0x01,0x05,0x1b,0x45,0x19,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x90,0x09,0x05,0x2d,0x85,0x1a,0x46,0x00,0x00, 0x00,0x00,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x2f,0x00,0xc0,0x0c, 0x1b,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x60, 0x01,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x84,0x6e,0x06,0x6c,0x06,0x00,0x05,0x30, 0x00,0x30,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x76,0x06,0x74,0x06,0x00,0x05,0xfb, 0xff,0xfb,0xff,0x61,0x32,0x03,0x00,0x50,0x44,0x85,0x1b,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x85,0x2d,0x00,0x00,0x00,0x00,0x03, 0x00,0x03,0x00,0x61,0x05,0x03,0x00,0x60,0x05,0x05,0x1c,0x85,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x60,0x05,0x05,0x1d,0x85,0x05,0x46,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x21,0xa1,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x60, 0x86,0x01,0x10,0x04,0x02,0x00,0x06,0x00,0x60,0x78,0x10,0x61,0x07,0x1e,0x60,0x00, 0x06,0x00,0x00,0x41,0x06,0x03,0x00,0x60,0x06,0x05,0x20,0x84,0x2d,0x00,0x05,0x85, 0x1b,0x46,0x00,0x61,0x05,0x22,0x60,0x00,0x1c,0x00,0x00,0x61,0x00,0x24,0x60,0x00, 0x1c,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xa6,0x20,0x00,0x00,0x00,0x00,0x03, 0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xae,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xb6,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x22,0x84,0x1a,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x23,0xa4,0x1a,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x24,0xc4,0x1a,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x25,0xe4,0x1a,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x93,0x04,0x00,0x00,0x00,0x05,0x26,0x04,0x1e,0x00,0xd0,0x00, 0x00,0x00,0x00,0x61,0x23,0x02,0x00,0x90,0x09,0x05,0x2d,0x05,0x27,0x52,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x2d,0x05,0x29,0x52,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x30,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x7f,0x64,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x30,0x00,0x00,0x00,0x00,0x07, 0x00,0x01,0x00,0x61,0x00,0x30,0x62,0x80,0x02,0x01,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x30,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x94,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x30,0x00,0xc0,0x0c,0x2d,0x00,0x00,0x31,0x04,0x03,0x80,0x04, 0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x4d, 0x65,0x50,0x31,0x36,0x62,0x69,0x5f,0x31,0x4d,0x56,0x32,0x5f,0x4d,0x52,0x45,0x00, 0x6e,0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68, 0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x78,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61, 0x72,0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00, 0x68,0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65, 0x30,0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00, 0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54, 0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00, 0x56,0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00, 0x56,0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00, 0x56,0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00, 0x56,0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00, 0x56,0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00, 0x56,0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00, 0x56,0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00, 0x56,0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00, 0x56,0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00, 0x56,0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00, 0x56,0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00, 0x56,0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00, 0x56,0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00, 0x56,0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00, 0x56,0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00, 0x56,0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00, 0x56,0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30, 0x31,0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34, 0x00,0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00, 0x56,0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56, 0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31, 0x31,0x34,0x00,0x56,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31, 0x37,0x00,0x56,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30, 0x00,0x56,0x31,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00, 0x56,0x31,0x32,0x34,0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56, 0x31,0x32,0x37,0x00,0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31, 0x33,0x30,0x00,0x56,0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33, 0x33,0x00,0x56,0x31,0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36, 0x00,0x56,0x31,0x33,0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00, 0x56,0x31,0x34,0x30,0x00,0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56, 0x31,0x34,0x33,0x00,0x56,0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31, 0x34,0x36,0x00,0x56,0x31,0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34, 0x39,0x00,0x56,0x31,0x35,0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32, 0x00,0x56,0x31,0x35,0x33,0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00, 0x56,0x31,0x35,0x36,0x00,0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56, 0x31,0x35,0x39,0x00,0x56,0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31, 0x36,0x32,0x00,0x56,0x31,0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36, 0x35,0x00,0x56,0x31,0x36,0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38, 0x00,0x56,0x31,0x36,0x39,0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00, 0x56,0x31,0x37,0x32,0x00,0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56, 0x31,0x37,0x35,0x00,0x56,0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x50,0x31, 0x00,0x50,0x32,0x00,0x50,0x33,0x00,0x50,0x34,0x00,0x50,0x35,0x00,0x4d,0x65,0x50, 0x31,0x36,0x62,0x69,0x5f,0x31,0x4d,0x56,0x32,0x5f,0x4d,0x52,0x45,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x31,0x30,0x30,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f, 0x69,0x6e,0x74,0x72,0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73, 0x64,0x69,0x76,0x75,0x32,0x43,0x4d,0x76,0x62,0x32,0x5f,0x69,0x53,0x5f,0x5f,0x42, 0x42,0x5f,0x31,0x5f,0x31,0x33,0x38,0x00,0x42,0x42,0x5f,0x32,0x5f,0x31,0x36,0x33, 0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x54,0x31,0x30, 0x00,0x54,0x31,0x31,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72, 0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x53,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x48,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x55,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x53,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x53,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x27,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x27,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00, 0x00,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x01,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x02, 0x02,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x02,0x01, 0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x01,0x01,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x02,0x01,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x01,0x01,0x00,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x04,0x01,0x00,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x01,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x05,0x80,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x01,0x10,0x00,0x2b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x05,0x40,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x65,0x00,0x00,0x00,0x03,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x00,0x00,0x00,0x05,0x40,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67, 0x00,0x00,0x00,0x03,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x03,0x20,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x03,0x20,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00, 0x05,0x40,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x05, 0x80,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x03,0x02, 0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x04,0x40,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x02,0x02,0x00,0x2e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x05,0x02,0x00,0x2f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x05,0x04,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x05,0x01,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x30,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x05,0xc0,0x00,0x34,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x01,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x00,0x01,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x00,0x00,0x00,0x03,0x90,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x02,0x90,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00, 0x00,0x01,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x03,0x90,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x05, 0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x05,0x01, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x03,0x02,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x03,0x04,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0x20,0x00,0x47,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x20,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x30,0x00,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x05,0xc0,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x01,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x85,0x00,0x00,0x00,0x01,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x86,0x00,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x00,0x00,0x00,0x03,0x90,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x01,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, 0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00, 0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x03, 0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x40, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x03,0x01,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x03,0x40,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x04,0x02,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x05,0x01,0x00,0x41,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x05,0x40,0x00,0x47,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x01,0x10,0x00,0x45,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x01,0x08,0x00,0x42,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x01,0x10,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x95,0x00,0x00,0x00,0x01,0x40,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x05,0x00,0x01,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, 0x00,0x00,0x00,0x01,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00, 0x00,0x01,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00, 0x01,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x01, 0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x02, 0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x01,0x02,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x07,0x02,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x01,0x02,0x00,0x51,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x07,0x02,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x07,0x02,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa5,0x00,0x00,0x00,0x07,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa6,0x00,0x00,0x00,0x01,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7, 0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x07,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00, 0x00,0x01,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0x01,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x01, 0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0xac,0x00, 0x00,0x00,0x02,0x00,0x00,0xad,0x00,0x00,0x00,0x02,0x00,0x00,0xae,0x00,0x00,0x00, 0x02,0x00,0x00,0xaf,0x00,0x00,0x00,0x01,0x00,0x00,0xb0,0x00,0x00,0x00,0x02,0x00, 0x00,0x03,0x00,0xb1,0x00,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0xb3, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xb4,0x00,0x00,0x00,0x01,0x00,0x00,0xb5,0x00, 0x00,0x00,0x01,0x00,0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x00,0xb7,0x00,0x00,0x00, 0x01,0x00,0x00,0xb8,0x00,0x00,0x00,0x01,0x00,0x00,0xb9,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02, 0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04, 0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30, 0x00,0x04,0x00,0x02,0x0b,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00,0x00, 0x00,0x38,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0x38, 0x00,0x00,0x00,0x3d,0x00,0x01,0x00,0x00,0x37,0x00,0x00,0x00,0x3e,0x00,0x01,0x00, 0x49,0x0e,0x00,0x00,0x37,0x0d,0x00,0x00,0x02,0x00,0xba,0x00,0x00,0x00,0x0d,0x67, 0x65,0x6e,0x78,0x5f,0x6d,0x65,0x5f,0x32,0x2e,0x61,0x73,0x6d,0xbb,0x00,0x00,0x00, 0x01,0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x08,0x00,0x00,0x2d,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x07,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x03,0x00, 0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00, 0x29,0x05,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x05, 0x01,0x00,0x00,0xa4,0x76,0x29,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x04, 0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x00,0x16,0x00,0x02,0x05,0x05,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x00,0x17,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x16,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x6f,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x6d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x01,0x00, 0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01, 0x01,0x01,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x0f,0x20, 0x00,0x00,0x10,0x6c,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x01,0x00,0x00, 0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00, 0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x0b,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x21,0x00,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x21,0x01, 0x05,0x05,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x80,0xff, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x05, 0x05,0x3f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x09, 0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x01,0x18,0x21,0x01,0x29,0x00,0x00,0x00,0x00, 0x70,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x01,0x19,0x21, 0x01,0x01,0x01,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03,0x70,0x00,0x00,0x00,0x25,0x01,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05, 0x05,0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05,0x05,0x04,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x0a,0x00,0x02,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x29,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x05,0x05,0x20, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x1f,0x00,0x02, 0x05,0x05,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x20,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x20,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x79, 0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x7a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09, 0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0x7d, 0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x07,0x08,0x21,0x01,0x10,0x01,0x00,0x00,0x00, 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x07,0x0a,0x22, 0x01,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x33,0x80,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03,0xf0,0xff, 0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x26,0x01, 0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x86, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x26,0x01,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x85,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x00,0x87,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x03, 0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x87,0x00,0x00, 0x00,0x00,0x02,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x10,0x83, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0xff,0x1f,0x00,0x00,0x10,0x83,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x02,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x02,0x00,0x00, 0x87,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x03,0x0f,0x20,0x00,0x00,0x10,0x70, 0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x2c,0x01,0x04,0x02,0x03,0x00,0x00,0x84,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x03,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x03,0x01,0xe0, 0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00, 0x6e,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x86,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x29,0x05, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x88,0x00,0x00,0x00, 0x04,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x89,0x00,0x00,0x00,0x00, 0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x29, 0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x05, 0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0xc0,0x98, 0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09,0x00,0x8c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x38,0x00,0x09, 0x00,0x04,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x36,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x92,0x00,0x00,0x00,0x00,0x0d,0x21, 0x01,0x05,0x03,0xcf,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x92,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x03,0x30, 0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x04,0x00,0x00,0x94,0x00,0x00,0x00,0x02,0x04, 0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x04,0x00,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00, 0x00,0x0d,0x00,0x02,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x01, 0x06,0x21,0x01,0x05,0x05,0xc0,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x97,0x00, 0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x05,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x0e, 0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05,0xfb,0xff,0xff, 0xff,0x29,0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08, 0x00,0x00,0x10,0x00,0x10,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x00,0x00,0x03,0x00, 0x29,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x32,0x00,0x04,0x00, 0x02,0x00,0x29,0x05,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x31,0x02, 0x00,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x35, 0x00,0x00,0x00,0x07,0x05,0x21,0x01,0x29,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0x3d,0x00,0x00,0x00,0x07,0x05,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x02,0x00,0x00,0x02, 0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x02,0x14, 0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x9c,0x00,0x00, 0x00,0x02,0x15,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x9c,0x00,0x00,0x00,0x02,0x16,0x00,0x02,0x05,0x05,0xaa,0xff,0xff,0xff,0x01,0x00, 0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x60,0x78,0x10,0x5d,0x00,0x04,0x00,0x00,0x0d, 0x00,0x00,0x00,0x08,0x07,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x49,0x00, 0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4a,0x00,0x00,0x00,0x01,0x02,0x22,0x01, 0x38,0x00,0x0a,0x00,0x04,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x00,0x00,0x00,0x20,0x00,0x38,0x00, 0x0b,0x00,0x04,0x01,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x4b,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x21, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00, 0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0xa0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x1f, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x01,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x22,0x01,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0xa3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x57, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x01,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x1b,0x01,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x01,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x01,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaa,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x01,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x56,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x50,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x01,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x56,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x01,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x01,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x22,0x01,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0xb0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x03, 0x02,0x05,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa2,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x05,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x22,0x01,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x61,0x01,0x48,0xa2,0x38, 0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00, 0x04,0x48,0x02,0x68,0x00,0x00,0x80,0x10,0x82,0x26,0x02,0x24,0x00,0x00,0x01,0x0c, 0x00,0x0c,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x05,0x08,0x04,0x48,0x00,0xa0,0x00, 0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0xff, 0x0f,0xff,0x0f,0x65,0x02,0x02,0x62,0xcd,0x02,0xf1,0xff,0x61,0x00,0x00,0x80,0x50, 0x00,0x35,0x1b,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x60, 0x01,0x85,0x02,0xc4,0x01,0x00,0x01,0x04,0x02,0x00,0x00,0x40,0x03,0x00,0x00,0x60, 0x01,0xa5,0x02,0xd4,0x01,0x00,0x01,0x24,0x02,0x00,0x00,0x41,0x02,0x00,0x00,0x60, 0x06,0xc5,0x02,0x84,0x02,0x00,0x05,0x34,0x1b,0x00,0x00,0x41,0x02,0x00,0x00,0x60, 0x06,0xe5,0x02,0xa4,0x02,0x00,0x05,0x34,0x1b,0x00,0x00,0x61,0x00,0x05,0x00,0x90, 0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90, 0x09,0x45,0x03,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90, 0x09,0x55,0x03,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0, 0x4a,0x65,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x76,0x61,0x00,0x00,0x00,0x40, 0x45,0x26,0x04,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0xb6,0x03,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0xbe,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0xa0, 0x0a,0x65,0x02,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90, 0x09,0x05,0x06,0x05,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90, 0x09,0xb5,0x06,0xb4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50, 0x84,0x05,0x05,0xb5,0x03,0x22,0x05,0xf0,0xff,0xf0,0xff,0x40,0x02,0x01,0x00,0x50, 0x80,0x45,0x05,0xb5,0x06,0x22,0x05,0x70,0x00,0x70,0x00,0x61,0x00,0x01,0x00,0x90, 0x49,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x01,0x00,0x10, 0x81,0x45,0x05,0x45,0x05,0x22,0x01,0x03,0x00,0x03,0x00,0x66,0x00,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x02,0x00,0x02,0x00,0x65,0x02,0x01,0x00,0x40, 0x84,0x66,0x05,0x44,0x05,0x20,0x05,0x0f,0x00,0x0f,0x00,0x6c,0x06,0x01,0x00,0x50, 0x85,0x25,0x05,0x05,0x05,0x22,0x05,0x01,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x50, 0x85,0x01,0x00,0x05,0x05,0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x06,0x00,0x00,0x50, 0x85,0x15,0x06,0x14,0x06,0x00,0x05,0xfe,0xff,0xfe,0xff,0x66,0x05,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x80,0xff,0x80,0xff,0x69,0x05,0x00,0x00,0x40, 0x84,0x16,0x02,0x74,0x05,0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50, 0x04,0x45,0x45,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90, 0x09,0x45,0x06,0x45,0x03,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0x26,0x07,0x00,0x00,0x00,0x00,0x3f,0x00,0x3f,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0x36,0x07,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40, 0x45,0xfe,0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x40,0x07,0x01,0x00,0x50, 0x05,0x05,0x06,0x05,0x06,0x22,0x05,0x25,0x05,0x22,0x02,0x66,0x07,0x00,0x00,0x40, 0x84,0x06,0x07,0x04,0x07,0x00,0x05,0x20,0x00,0x20,0x00,0x66,0x07,0x00,0x00,0x40, 0x04,0x56,0x07,0x14,0x02,0x00,0x05,0x44,0x45,0x00,0x00,0x61,0x20,0x00,0x00,0x40, 0x04,0x4e,0x07,0xc4,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40, 0x04,0x46,0x07,0xcc,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x01,0x50, 0xa4,0x05,0x06,0xb5,0x03,0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01,0x90, 0x49,0x05,0x06,0x00,0x00,0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00,0x0e,0xa0,0x00, 0x00,0x01,0x00,0x61,0x02,0x0c,0x60,0x00,0x06,0x00,0x00,0x40,0x00,0x00,0x00,0x60, 0x86,0x01,0x10,0x64,0x02,0x00,0x06,0x00,0xc0,0x98,0x0c,0x61,0x00,0x10,0x60,0x00, 0x08,0x00,0x00,0x61,0x00,0x0f,0xa1,0x00,0x00,0x01,0x00,0x65,0x04,0x00,0x00,0x40, 0x84,0x6e,0x0c,0x6c,0x0c,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90, 0x09,0x05,0x0c,0x05,0x06,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0c,0xa8,0x60, 0x00,0x01,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0xa1,0x04,0x00,0x00,0x00,0x05,0x12,0x04,0x0c,0x00,0x80,0x00, 0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x60,0x04,0x45,0x1b,0xec,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x21,0x00,0x00,0x60,0x01,0x05,0x1b,0x84,0x19,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x01,0x00,0x60,0x04,0x85,0x1b,0xf4,0x01,0x00,0x05,0xa5, 0x19,0x22,0x00,0x2c,0x00,0x05,0x80,0x00,0x40,0x44,0x46,0x00,0x00,0x00,0x00,0xd8, 0x03,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x31,0x05,0x06,0x46,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50,0x84,0xa5,0x05,0xb5,0x06,0x22,0x05,0xf0, 0xff,0xf0,0xff,0x6c,0x04,0x01,0x00,0x50,0x85,0x25,0x31,0x84,0x1b,0x20,0x05,0x02, 0x00,0x02,0x00,0x6c,0x02,0x01,0x00,0x50,0x85,0xa5,0x05,0xa5,0x05,0x22,0x05,0x01, 0x00,0x01,0x00,0x65,0x02,0x00,0x00,0x50,0x85,0x35,0x31,0x34,0x31,0x00,0x05,0xfe, 0xff,0xfe,0xff,0x6c,0x00,0x01,0x00,0x50,0x85,0x85,0x05,0x84,0x1b,0x20,0x05,0x02, 0x00,0x02,0x00,0x40,0x02,0x01,0x00,0x50,0x05,0x25,0x31,0x25,0x31,0x22,0x05,0xa5, 0x05,0x22,0x02,0x40,0x00,0x01,0x00,0x50,0xa5,0xa5,0x05,0xa5,0x05,0x22,0x05,0xff, 0x1f,0xff,0x1f,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x31,0xb4,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x02,0x01,0x00,0x50,0x05,0x01,0x00,0x85,0x05,0x22,0x35,0xa5, 0x05,0x22,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x45,0x31,0x45,0x06,0x22,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x01,0x01,0x50,0xa4,0x25,0x31,0xb5,0x06,0x22,0x05,0x0f, 0x20,0x0f,0x20,0x70,0x00,0x01,0x00,0x50,0x05,0x01,0x00,0x85,0x05,0x22,0x55,0xa5, 0x05,0x22,0x02,0x61,0x00,0x05,0x00,0x90,0x49,0x05,0x1e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x49,0x25,0x31,0x00,0x00,0x00,0x00,0x01, 0xe0,0x01,0xe0,0x61,0x00,0x20,0x60,0x00,0x08,0x00,0x00,0x61,0x02,0x05,0x00,0x90, 0x09,0x05,0x1c,0x05,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60, 0x86,0x01,0x10,0x44,0x02,0x00,0x06,0x00,0xc0,0x98,0x0c,0x69,0x00,0x00,0x00,0x60, 0x86,0xc5,0x05,0x84,0x02,0x00,0x05,0x02,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x50, 0x80,0x35,0x02,0x6c,0x31,0x00,0x05,0xcf,0x00,0xcf,0x00,0x61,0x00,0x1f,0xa1,0x00, 0x00,0x01,0x00,0x70,0x00,0x00,0x00,0x50,0x85,0x01,0x00,0x44,0x0a,0x00,0x25,0x00, 0x00,0x00,0x00,0x65,0x06,0x00,0x00,0x40,0x84,0x6e,0x1c,0x6c,0x1c,0x00,0x05,0xf8, 0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90,0x09,0x05,0x1c,0x25,0x31,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x1c,0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x49,0x64,0x00, 0x00,0x00,0x00,0x31,0xa2,0x04,0x00,0x00,0x00,0x05,0x22,0x04,0x1c,0x00,0x80,0x00, 0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x65,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x66,0x00,0x00,0x00,0x50,0x80,0xe5,0x05,0x6c,0x31,0x00,0x05,0x30, 0x00,0x30,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x26,0x1b,0x34,0x32,0x00,0x05,0xc0, 0xff,0xc0,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x49,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x61,0x00,0x49,0x62,0x68,0x05,0x01,0x00,0x61,0x00,0x00,0x80,0xa0, 0x0a,0x25,0x49,0xa4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x64,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x11,0x90, 0x09,0xe5,0x05,0x34,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x2b,0xa0,0x00, 0x00,0x01,0x00,0x31,0xc3,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x49,0x00,0xc0,0x0c, 0x1b,0x00,0x00,0x61,0x00,0x2e,0xa1,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x40, 0x84,0x76,0x31,0x74,0x31,0x00,0x05,0xfb,0xff,0xfb,0xff,0x41,0x07,0x03,0x00,0x60, 0x06,0x05,0x2d,0x64,0x45,0x00,0x05,0x85,0x45,0x46,0x00,0x66,0x00,0x00,0x00,0x40, 0x84,0x36,0x32,0x24,0x1b,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x06,0x00,0x00,0x00, 0x00,0x6e,0x31,0xe4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x40, 0x04,0x05,0x2d,0x05,0x2b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x40, 0x04,0x05,0x2e,0x05,0x2c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x2f,0x21,0x74, 0x19,0x01,0x00,0x61,0x22,0x03,0x00,0xa0,0x0a,0x26,0x2f,0xa4,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x06,0x33,0x60,0x00,0x31,0x00,0x00,0x61,0x04,0x35,0x60,0x00, 0x2d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x64,0x02,0x00,0x06,0x00, 0x60,0x78,0x10,0x61,0x04,0x37,0x60,0x00,0x2f,0x00,0x00,0x61,0x00,0x39,0x60,0x00, 0x2f,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xa6,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xae,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xb6,0x35,0x00,0x00,0x00,0x00,0xaa, 0xff,0xaa,0xff,0x61,0x00,0x4a,0x64,0x00,0x00,0x00,0x00,0x31,0xa4,0x04,0x00,0x00, 0x00,0x05,0x3b,0x04,0x33,0x00,0xd0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x4a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x61,0x00,0x4a,0x62,0x68, 0x05,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x4a,0xa4,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x31,0xb4,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x4a,0x00,0xc0,0x0c,0x3c,0x00,0x00,0x61,0x00,0x01,0x00,0x90, 0x09,0x05,0x42,0x25,0x3c,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0xa4,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa5,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x4a,0x00,0xc0,0x0c,0x42,0x00,0x00,0x31,0x03,0x03,0x80,0x04, 0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x20, 0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01,0x00,0x00,0x20, 0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01,0x01,0x00,0x60, 0x86,0x45,0x44,0x45,0x1b,0x22,0x05,0x1f,0x00,0x1f,0x00,0x6c,0x00,0x01,0x00,0x60, 0x86,0xc5,0x1b,0x85,0x1b,0x22,0x05,0x1f,0x00,0x1f,0x00,0x40,0x02,0x01,0x00,0x60, 0x06,0x45,0x1b,0x45,0x44,0x22,0x06,0x45,0x1b,0x22,0x00,0x40,0x02,0x01,0x00,0x60, 0x06,0x85,0x1b,0xc5,0x1b,0x22,0x06,0x85,0x1b,0x22,0x00,0x67,0x02,0x01,0x00,0x60, 0x06,0x45,0x1b,0x45,0x1b,0x22,0x06,0x45,0x44,0x22,0x00,0x61,0x00,0x42,0xa8,0x88, 0x00,0xc1,0xb4,0x61,0x02,0x01,0x00,0xa0,0x02,0x05,0x45,0x45,0x1b,0x22,0x00,0x00, 0x00,0x00,0x00,0x67,0x04,0x01,0x00,0x60,0x06,0x85,0x1b,0x85,0x1b,0x22,0x06,0xc5, 0x1b,0x22,0x00,0x38,0xa6,0x01,0x00,0xa0,0x0a,0x05,0x46,0x05,0x45,0x22,0x10,0x00, 0x00,0x00,0x00,0x61,0x01,0x01,0x00,0xa0,0x02,0x65,0x42,0x85,0x1b,0x22,0x00,0x00, 0x00,0x00,0x00,0x5b,0xc6,0x01,0x00,0xa8,0x02,0x04,0x46,0x04,0x46,0x02,0x02,0xe4, 0x42,0x05,0x46,0x61,0x00,0x01,0x00,0x60,0x0a,0x25,0x42,0x05,0x45,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x03,0x01,0x00,0x60,0x0a,0xa5,0x42,0x65,0x42,0x22,0x00,0x00, 0x00,0x00,0x00,0x41,0x03,0x01,0x00,0xa0,0x0a,0x45,0x43,0x05,0x46,0x22,0x0a,0x65, 0x42,0x22,0x00,0x40,0x03,0x01,0x00,0x60,0x06,0x25,0x42,0x45,0x1b,0x22,0x06,0x25, 0x42,0x22,0x02,0x40,0x03,0x01,0x00,0x60,0x06,0xa5,0x42,0x85,0x1b,0x22,0x06,0xa5, 0x42,0x22,0x02,0x61,0x03,0x01,0x00,0x60,0x0a,0x85,0x43,0x45,0x43,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0x05,0x44,0x25,0x42,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0x05,0x43,0xa5,0x42,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0xc5,0x43,0x85,0x43,0x22,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x55,0x45,0x00,0x00,0x00,0x00,0x01, 0x00,0x01,0x00,0x5b,0x02,0x01,0x00,0xa8,0x02,0x04,0x45,0x64,0x42,0x8a,0x02,0xc4, 0x43,0x05,0x45,0x5b,0x04,0x01,0x00,0xa8,0x02,0x04,0x44,0x04,0x43,0x8a,0x02,0xc4, 0x43,0x05,0x44,0x67,0x00,0x01,0x00,0x60,0x06,0x45,0x44,0x45,0x44,0x22,0x06,0xc5, 0x1b,0x22,0x00,0x40,0x02,0x01,0x00,0xa0,0x0a,0x05,0x45,0x05,0x45,0x22,0x0a,0x05, 0x44,0x22,0x00,0x41,0x01,0x01,0x00,0xa0,0x0a,0x05,0x46,0x05,0x46,0x22,0x0a,0x05, 0x45,0x22,0x00,0x61,0x01,0x01,0x00,0x60,0x0a,0xc5,0x44,0x05,0x46,0x22,0x00,0x00, 0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0xc5,0x44,0xc5,0x44,0x22,0x06,0x85, 0x43,0x22,0x00,0x41,0x01,0x01,0x80,0x60,0x06,0x01,0x20,0xc5,0x44,0x22,0x01,0x44, 0x1b,0x20,0x00,0x49,0x00,0x01,0x00,0x60,0x06,0x05,0x47,0xc5,0x44,0x22,0x06,0x45, 0x1b,0x22,0x00,0x40,0x07,0x01,0x00,0x60,0x06,0xc5,0x44,0xc5,0x44,0x22,0x06,0x45, 0x44,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x85,0x1b,0x85,0x1b,0x22,0x06,0x05, 0x47,0x22,0x02,0x70,0x01,0x01,0x00,0x20,0x02,0x01,0x00,0x85,0x1b,0x22,0x42,0x45, 0x1b,0x22,0x00,0x62,0x00,0x01,0x01,0x60,0x85,0x85,0x44,0x54,0x45,0x00,0x05,0x00, 0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0xc5,0x44,0xc5,0x44,0x22,0x06,0x85, 0x44,0x22,0x00,0x67,0x01,0x01,0x00,0x60,0x06,0x85,0x1b,0xc5,0x44,0x22,0x06,0x45, 0x44,0x22,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e, 0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x44,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x4d,0x65,0x50,0x31,0x36,0x62,0x69,0x5f,0x31, 0x4d,0x56,0x32,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x00,0x6e,0x75,0x6c,0x6c, 0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64, 0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72, 0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69, 0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72, 0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69, 0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62, 0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54, 0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00, 0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00, 0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00, 0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00, 0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00, 0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00, 0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00, 0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00, 0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00, 0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00, 0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00, 0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00, 0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00, 0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00, 0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00, 0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00, 0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00, 0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00, 0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31, 0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30, 0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38, 0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00, 0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56, 0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31, 0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32, 0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34, 0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00, 0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56, 0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31, 0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33, 0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30, 0x00,0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00, 0x56,0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56, 0x31,0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31, 0x35,0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35, 0x33,0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36, 0x00,0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00, 0x56,0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56, 0x31,0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31, 0x36,0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36, 0x39,0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32, 0x00,0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00, 0x56,0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56, 0x31,0x37,0x39,0x00,0x56,0x31,0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31, 0x38,0x32,0x00,0x50,0x31,0x00,0x50,0x32,0x00,0x50,0x33,0x00,0x50,0x34,0x00,0x50, 0x35,0x00,0x50,0x36,0x00,0x4d,0x65,0x50,0x31,0x36,0x62,0x69,0x5f,0x31,0x4d,0x56, 0x32,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x31, 0x30,0x34,0x00,0x5f,0x5a,0x32,0x34,0x5f,0x5f,0x63,0x6d,0x5f,0x69,0x6e,0x74,0x72, 0x69,0x6e,0x73,0x69,0x63,0x5f,0x69,0x6d,0x70,0x6c,0x5f,0x73,0x64,0x69,0x76,0x75, 0x32,0x43,0x4d,0x76,0x62,0x32,0x5f,0x69,0x53,0x5f,0x2e,0x31,0x5f,0x42,0x42,0x5f, 0x31,0x5f,0x31,0x34,0x33,0x00,0x42,0x42,0x5f,0x32,0x5f,0x31,0x36,0x39,0x00,0x54, 0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x54,0x31,0x30,0x00,0x54, 0x31,0x31,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65, 0x74,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x15, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x51,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x15,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x53,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x27,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x00, 0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x01,0x01,0x00,0x25,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x02,0x02,0x00,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x02,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x01,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x63,0x00,0x00,0x00,0x04,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x64,0x00,0x00,0x00,0x01,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x05,0x80,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00, 0x00,0x00,0x01,0x10,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x05,0x40,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x03,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x05, 0x40,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x03,0x02, 0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x03,0x20,0x00, 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x03,0x20,0x00,0x32, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x03,0x02,0x00,0x2e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x05,0x40,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x05,0x80,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x03,0x02,0x00,0x2f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x04,0x40,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x02,0x02,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x73,0x00,0x00,0x00,0x05,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x74,0x00,0x00,0x00,0x05,0x04,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75, 0x00,0x00,0x00,0x05,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x01,0x30,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00, 0x00,0x05,0xc0,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x01,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x01, 0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x01, 0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x03,0x90,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x02,0x90,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x01,0x02,0x00,0x50,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x03,0x90,0x00,0x36,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x05,0x01,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x05,0x01,0x00,0x39,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x02,0x00,0x3b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x03,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x83,0x00,0x00,0x00,0x03,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x84,0x00,0x00,0x00,0x03,0x20,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85, 0x00,0x00,0x00,0x03,0x20,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x01,0x30,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00, 0x00,0x05,0xc0,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, 0x01,0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x01, 0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x01, 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x03,0x90,0x00, 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x01,0x01,0x00,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x01,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x03,0x01,0x00,0x41,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x04,0x40,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x03,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x93,0x00,0x00,0x00,0x03,0x40,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x94,0x00,0x00,0x00,0x04,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95, 0x00,0x00,0x00,0x05,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0x05,0x40,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00, 0x00,0x01,0x10,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, 0x01,0x08,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x01, 0x10,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x01,0x40, 0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x05,0x00,0x01, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x01,0x01,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x01,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x01,0x02,0x00,0x51,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01,0x02,0x00,0x5d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x01,0x02,0x00,0x4f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0x01,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa3,0x00,0x00,0x00,0x07,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa4,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5, 0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0x01,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00, 0x00,0x07,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00, 0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x07, 0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x07,0x02, 0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x01,0x02,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x07,0x02,0x00,0x5a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x01,0x02,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x01,0x02,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x02,0x00,0x5f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0xb1,0x00,0x00,0x00,0x02,0x00,0x00,0xb2,0x00, 0x00,0x00,0x02,0x00,0x00,0xb3,0x00,0x00,0x00,0x02,0x00,0x00,0xb4,0x00,0x00,0x00, 0x02,0x00,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0x00,0xb6,0x00,0x00,0x00,0x02,0x00, 0x00,0x03,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0xb8,0x00,0x00,0x00,0x01,0x00,0xb9, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xba,0x00,0x00,0x00,0x01,0x00,0x00,0xbb,0x00, 0x00,0x00,0x01,0x00,0x00,0xbc,0x00,0x00,0x00,0x01,0x00,0x00,0xbd,0x00,0x00,0x00, 0x01,0x00,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x00,0xbf,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02, 0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04, 0x00,0x02,0x09,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30, 0x00,0x04,0x00,0x02,0x0b,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x24,0x00,0x00, 0x00,0x38,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0x39, 0x00,0x00,0x00,0x3d,0x00,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0x3e,0x00,0x01,0x00, 0x6c,0x0f,0x00,0x00,0xaf,0x0d,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x0d,0x67, 0x65,0x6e,0x78,0x5f,0x6d,0x65,0x5f,0x33,0x2e,0x61,0x73,0x6d,0xc1,0x00,0x00,0x00, 0x01,0x00,0x30,0x00,0x00,0x2d,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x08,0x00,0x00,0x2d,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x06,0x00,0x07,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x01,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00, 0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x03,0x00, 0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00, 0x29,0x05,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x05, 0x01,0x00,0x00,0xa0,0x76,0x29,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x04, 0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x00,0x16,0x00,0x02,0x05,0x05,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x6d,0x00,0x00,0x00,0x00,0x17,0x00,0x02,0x05,0x05,0x28,0x00,0x00,0x00,0x01,0x01, 0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00, 0x00,0x16,0x22,0x01,0x05,0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x72,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00, 0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x70,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x01,0x00, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01, 0x01,0x01,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x0f,0x20, 0x00,0x00,0x10,0x6f,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x01,0x00,0x00, 0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x2b,0x00,0x00,0x00, 0x00,0x0b,0x21,0x01,0x29,0x01,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x73, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x16,0x22,0x01, 0x05,0x03,0xf0,0xff,0xff,0xff,0x2c,0x01,0x02,0x02,0x02,0x00,0x00,0x73,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x29,0x01,0x02,0x00,0x00, 0x71,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x21,0x00, 0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00, 0x01,0x00,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x21,0x01, 0x05,0x05,0x80,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01, 0x04,0x00,0x02,0x05,0x05,0x3f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x01,0x09,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x01,0x18,0x21,0x01,0x29, 0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x75,0x00,0x00, 0x00,0x01,0x19,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03,0x70,0x00,0x00, 0x00,0x25,0x01,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x03,0x00,0x00,0x00,0x20,0x01,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x05,0x05,0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x05, 0x05,0x04,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x0a, 0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x79,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x06,0x00, 0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00, 0x01,0x1f,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x21,0x01, 0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00, 0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29, 0x04,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x33,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x0d, 0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff, 0xff,0x29,0x01,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x7c, 0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x00,0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00, 0x00,0x00,0x06,0x09,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x00,0x00, 0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x00,0x07,0x04,0x22,0x01,0x10, 0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x00,0x00, 0x00,0x07,0x0a,0x22,0x01,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x01, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x33,0x80,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x87, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x16,0x22,0x01, 0x05,0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00, 0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x89,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x29,0x05, 0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x26,0x01,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x03,0x02,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x8b,0x00, 0x00,0x00,0x00,0x03,0x21,0x01,0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00, 0x00,0x8b,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x8b,0x00,0x00,0x00,0x00,0x02, 0x22,0x01,0x10,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00, 0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0xff,0x1f,0x00,0x00,0x10,0x87, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x03,0x00,0x00,0x88,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x03,0x00,0x00,0x8b,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x05,0x03,0x0f,0x20, 0x00,0x00,0x10,0x74,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x2c,0x01,0x04,0x02,0x04, 0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x87,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x04,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00, 0x0b,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x01,0x00,0x00, 0x00,0x8a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x04, 0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x02,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00, 0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x20,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x8d, 0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05,0xf8,0xff,0xff,0xff,0x29,0x01,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x00,0x00,0x00,0x00, 0x02,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x03, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8e,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x00,0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x09, 0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x91, 0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00,0x38,0x00,0x09, 0x00,0x08,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x0d,0x21, 0x01,0x05,0x03,0xcf,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x97,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x03,0x30, 0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x05,0x00,0x00,0x99,0x00,0x00,0x00,0x02,0x04, 0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x05,0x00,0x00,0x98,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x00,0x0d,0x00,0x02,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x20,0x00,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x01, 0x06,0x21,0x01,0x05,0x05,0xc0,0xff,0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x05,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x0e, 0x00,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05,0xfb,0xff,0xff, 0xff,0x29,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x08, 0x00,0x00,0x10,0x00,0x10,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x03,0x00,0x03,0x00, 0x29,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x01,0x00, 0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x05,0x08,0x00,0x00,0x30,0x00,0x29,0x03,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x05,0x00,0x02,0x00,0x29, 0x05,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x31,0x02,0x00,0x29,0x02, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x36,0x00,0x00,0x00, 0x08,0x04,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x01,0x00,0x00, 0x03,0x00,0x36,0x00,0x00,0x00,0x08,0x05,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x48, 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x36,0x00,0x00,0x00,0x08,0x06,0x21,0x01, 0x29,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x36,0x00, 0x00,0x00,0x08,0x07,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00, 0x01,0x00,0x03,0x00,0x3e,0x00,0x00,0x00,0x08,0x04,0x21,0x01,0x29,0x02,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x01,0x01,0x00,0x03,0x00,0x3e,0x00,0x00,0x00,0x08,0x05, 0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00, 0x3e,0x00,0x00,0x00,0x08,0x06,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x01,0x01,0x00,0x03,0x00,0x3e,0x00,0x00,0x00,0x08,0x07,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x02,0x00,0x00, 0x02,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0xa0, 0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x00,0x48,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x02, 0x14,0x00,0x02,0x05,0x05,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0x02,0x15,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xa1,0x00,0x00,0x00,0x02,0x16,0x00,0x02,0x05,0x05,0xaa,0xff,0xff,0xff,0x01, 0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x60,0x78,0x10,0x5d,0x00,0x04,0x00,0x00, 0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4b, 0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x01,0x00,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x4c, 0x00,0x00,0x00,0x03,0x00,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x01,0x02,0x36,0x02,0x29,0x02,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x03, 0x02,0x36,0x02,0x38,0x00,0x0a,0x00,0x08,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4d,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x0b,0x00,0x08,0x02,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4e,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x30,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb, 0xff,0xff,0x21,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x00,0x30,0x00,0x00,0x00,0x26,0x01, 0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x01,0x1f,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0xa5, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x01,0x1f,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0xa8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x01,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0xac,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x1b,0x01,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x56, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0xc0,0xb4,0x0c,0x01,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xad,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x01,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x59,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x53,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x01,0x00,0x00,0x00,0x5a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x59, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x01,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb1,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x22,0x01,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x01,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x2c,0x01,0x03,0x02,0x06,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x2a,0x01,0x06,0x00,0x00,0x5f,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x01,0x01,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x22, 0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x00,0x0e,0xfb,0xff,0xff,0x34,0x00,0x00,0x00,0x61,0x01, 0x48,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01, 0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x00,0x00,0x80,0x10,0x82,0x26,0x02,0x24,0x00, 0x00,0x01,0x0c,0x00,0x0c,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x05,0x08,0x04,0x48, 0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00, 0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x02,0x62,0xcd,0x02,0xf1,0xff,0x61,0x00, 0x00,0x80,0x50,0x00,0xe5,0x42,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03, 0x00,0x00,0x60,0x01,0x85,0x02,0xc4,0x01,0x00,0x01,0x04,0x02,0x00,0x00,0x40,0x03, 0x00,0x00,0x60,0x01,0xa5,0x02,0xd4,0x01,0x00,0x01,0x24,0x02,0x00,0x00,0x41,0x02, 0x00,0x00,0x60,0x06,0xc5,0x02,0x84,0x02,0x00,0x05,0xe4,0x42,0x00,0x00,0x41,0x02, 0x00,0x00,0x60,0x06,0xe5,0x02,0xa4,0x02,0x00,0x05,0xe4,0x42,0x00,0x00,0x61,0x00, 0x05,0x00,0x90,0x49,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03, 0x00,0x00,0x90,0x09,0x45,0x03,0xc4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03, 0x00,0x00,0x90,0x09,0x55,0x03,0xe4,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0xa8,0x98,0x00,0xa1,0x76,0x61,0x00,0x00,0x00,0x40,0x45,0x26,0x04,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xb6,0x03,0x00,0x00, 0x00,0x00,0x30,0x00,0x30,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xbe,0x03,0x00,0x00, 0x00,0x00,0x28,0x00,0x28,0x00,0x61,0x00,0x00,0x00,0xa0,0x0a,0x65,0x02,0x24,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x06,0x05,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x06,0xb4,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50,0x84,0x05,0x05,0xb5,0x03, 0x22,0x05,0xf0,0xff,0xf0,0xff,0x40,0x02,0x01,0x00,0x50,0x80,0x65,0x05,0xb5,0x06, 0x22,0x05,0x70,0x00,0x70,0x00,0x61,0x00,0x01,0x00,0x90,0x49,0x05,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x01,0x00,0x10,0x81,0x65,0x05,0x65,0x05, 0x22,0x01,0x03,0x00,0x03,0x00,0x66,0x00,0x00,0x00,0x40,0x84,0x06,0x07,0x04,0x07, 0x00,0x05,0x02,0x00,0x02,0x00,0x40,0x00,0x01,0x00,0x50,0x84,0x45,0x05,0xb5,0x06, 0x22,0x05,0xf0,0xff,0xf0,0xff,0x6c,0x06,0x01,0x00,0x50,0x85,0x25,0x05,0x05,0x05, 0x22,0x05,0x01,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x50,0x85,0x01,0x00,0x05,0x05, 0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x06,0x00,0x00,0x50,0x85,0x15,0x06,0x14,0x06, 0x00,0x05,0xfe,0xff,0xfe,0xff,0x65,0x06,0x01,0x00,0x40,0x84,0x86,0x05,0x64,0x05, 0x20,0x05,0x0f,0x00,0x0f,0x00,0x66,0x06,0x00,0x00,0x40,0x84,0x06,0x07,0x04,0x07, 0x00,0x05,0x80,0xff,0x80,0xff,0x40,0x03,0x01,0x00,0x50,0x05,0x05,0x06,0x05,0x06, 0x22,0x05,0x25,0x05,0x22,0x02,0x69,0x03,0x00,0x00,0x40,0x84,0x16,0x02,0x94,0x05, 0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x85,0x44,0x84,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x01,0x50,0xa4,0x05,0x06,0xb5,0x03, 0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01,0x90,0x49,0x05,0x06,0x00,0x00, 0x00,0x00,0x01,0xe0,0x01,0xe0,0x70,0x07,0x01,0x00,0x50,0x85,0x01,0x00,0x45,0x05, 0x22,0x35,0xff,0x3f,0xff,0x3f,0x61,0x00,0x01,0x00,0x90,0x09,0x45,0x06,0x45,0x03, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0x26,0x07,0x00,0x00, 0x00,0x00,0x3f,0x00,0x3f,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0x36,0x07,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xfe,0x07,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x66,0x07,0x00,0x00,0x40,0x84,0x06,0x07,0x04,0x07, 0x00,0x05,0x20,0x00,0x20,0x00,0x66,0x07,0x00,0x00,0x40,0x04,0x56,0x07,0x14,0x02, 0x00,0x05,0x84,0x44,0x00,0x00,0x61,0x20,0x00,0x00,0x40,0x04,0x4e,0x07,0xc4,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0x46,0x07,0xcc,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x01,0x90,0x49,0x25,0x06,0x00,0x00, 0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00,0x0e,0xa0,0x00,0x00,0x01,0x00,0x61,0x02, 0x0c,0x60,0x00,0x06,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x64,0x02, 0x00,0x06,0x00,0xc0,0x98,0x0c,0x61,0x00,0x10,0x60,0x00,0x08,0x00,0x00,0x61,0x00, 0x0f,0xa1,0x00,0x00,0x01,0x00,0x65,0x04,0x00,0x00,0x40,0x84,0x6e,0x0c,0x6c,0x0c, 0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90,0x09,0x05,0x0c,0x05,0x06, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0c,0xa8,0x60,0x00,0x01,0x00,0x61,0x00, 0x00,0x00,0xa0,0x0a,0x45,0x02,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xa1, 0x04,0x00,0x00,0x00,0x05,0x12,0x04,0x0c,0x00,0x80,0x00,0x00,0x00,0x00,0x61,0x00, 0x01,0x00,0x60,0x04,0xc5,0x1b,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x21, 0x02,0x00,0x60,0x01,0x05,0x1b,0x45,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x01,0x00,0x60,0x04,0x85,0x40,0xf4,0x01,0x00,0x05,0xa5,0x19,0x22,0x00,0x2c,0x00, 0x05,0x80,0x00,0x40,0xc4,0x44,0x00,0x00,0x00,0x00,0x90,0x04,0x00,0x00,0x61,0x00, 0x05,0x00,0x90,0x09,0x05,0x2f,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x01,0x00,0x50,0x84,0xc5,0x05,0xb5,0x06,0x22,0x05,0xf0,0xff,0xf0,0xff,0x6c,0x04, 0x01,0x00,0x50,0x85,0x25,0x2f,0x84,0x40,0x20,0x05,0x02,0x00,0x02,0x00,0x6c,0x02, 0x01,0x00,0x50,0x85,0xc5,0x05,0xc5,0x05,0x22,0x05,0x01,0x00,0x01,0x00,0x65,0x02, 0x00,0x00,0x50,0x85,0x35,0x2f,0x34,0x2f,0x00,0x05,0xfe,0xff,0xfe,0xff,0x6c,0x00, 0x01,0x00,0x50,0x85,0xa5,0x05,0x84,0x40,0x20,0x05,0x02,0x00,0x02,0x00,0x40,0x02, 0x01,0x00,0x50,0x05,0x25,0x2f,0x25,0x2f,0x22,0x05,0xc5,0x05,0x22,0x02,0x40,0x00, 0x01,0x00,0x50,0xa5,0xc5,0x05,0xc5,0x05,0x22,0x05,0xff,0x1f,0xff,0x1f,0x61,0x00, 0x00,0x00,0x90,0x09,0xb5,0x2f,0xb4,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x02, 0x01,0x00,0x50,0x05,0x01,0x00,0xa5,0x05,0x22,0x35,0xc5,0x05,0x22,0x00,0x61,0x00, 0x01,0x00,0x90,0x09,0x45,0x2f,0x45,0x06,0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x01,0x01,0x50,0xa4,0x25,0x2f,0xb5,0x06,0x22,0x05,0x0f,0x20,0x0f,0x20,0x70,0x00, 0x01,0x00,0x50,0x05,0x01,0x00,0xa5,0x05,0x22,0x55,0xc5,0x05,0x22,0x02,0x61,0x00, 0x05,0x00,0x90,0x49,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x01,0x01,0x90,0x49,0x25,0x2f,0x00,0x00,0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00, 0x20,0x60,0x00,0x08,0x00,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x1c,0x05,0x2f, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x44,0x02, 0x00,0x06,0x00,0xc0,0x98,0x0c,0x69,0x00,0x00,0x00,0x60,0x86,0xe5,0x05,0x84,0x02, 0x00,0x05,0x03,0x00,0x03,0x00,0x69,0x00,0x00,0x00,0x60,0x86,0x85,0x1b,0xa4,0x02, 0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x50,0x80,0x35,0x02,0x6c,0x2f, 0x00,0x05,0xcf,0x00,0xcf,0x00,0x61,0x00,0x1f,0xa1,0x00,0x00,0x01,0x00,0x70,0x00, 0x00,0x00,0x50,0x85,0x01,0x00,0x44,0x0a,0x00,0x25,0x00,0x00,0x00,0x00,0x65,0x07, 0x00,0x00,0x40,0x84,0x6e,0x1c,0x6c,0x1c,0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00, 0x01,0x00,0x90,0x09,0x05,0x1c,0x25,0x2f,0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x1c,0xa8,0x60,0x00,0x01,0x00,0x61,0x00,0x49,0x64,0x00,0x00,0x00,0x00,0x31,0xa2, 0x04,0x00,0x00,0x00,0x05,0x22,0x04,0x1c,0x00,0x80,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x44,0x85,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0xa5,0x44,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x61,0x00, 0x03,0x00,0x50,0x44,0x85,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x66,0x00, 0x00,0x00,0x50,0x80,0xa5,0x1b,0x6c,0x2f,0x00,0x05,0x30,0x00,0x30,0x00,0x65,0x00, 0x00,0x00,0x40,0x84,0xb6,0x1b,0x34,0x30,0x00,0x05,0xc0,0xff,0xc0,0xff,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x49,0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x00, 0x49,0x62,0x80,0x05,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x49,0x84,0x1b, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01, 0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x11,0x90,0x09,0xa5,0x1b,0x34,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x93,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x49, 0x00,0xc0,0x0c,0x1b,0x00,0x00,0x61,0x00,0x2e,0xa1,0x00,0x00,0x01,0x00,0x61,0x00, 0x2c,0xa1,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0x76,0x2f,0x74,0x2f, 0x00,0x05,0xfb,0xff,0xfb,0xff,0x41,0x00,0x03,0x00,0x60,0x06,0x05,0x2d,0xa4,0x44, 0x00,0x05,0x85,0x45,0x46,0x00,0x61,0x00,0x03,0x00,0x60,0x05,0x05,0x2b,0x85,0x46, 0x46,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x40,0x84,0x36,0x30,0xb4,0x1b, 0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x6e,0x2f,0xa4,0x1b, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x04,0x05,0x00,0x40,0x04,0x05,0x2d,0x05,0x2b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x05,0x00,0x40,0x04,0x05,0x2e,0x05,0x2c, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x35,0x84,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x36,0xa4,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x37,0xc4,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x06,0x38,0xe4,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x31,0x60,0x00,0x2f,0x00,0x00,0x61,0x06, 0x33,0x60,0x00,0x2d,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x64,0x02, 0x00,0x06,0x00,0x60,0x78,0x10,0x61,0x22,0x02,0x00,0xa0,0x0a,0x26,0x35,0x84,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x26,0x36,0xa4,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x26,0x37,0xc4,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x0a,0x26,0x38,0xe4,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xa6,0x33,0x00,0x00, 0x00,0x00,0x03,0x00,0x03,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xae,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xb6,0x33,0x00,0x00, 0x00,0x00,0xaa,0xff,0xaa,0xff,0x61,0x00,0x4a,0x64,0x00,0x00,0x00,0x00,0x31,0xa4, 0x04,0x00,0x00,0x00,0x05,0x39,0x04,0x31,0x00,0xd0,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x80,0xa0,0x4a,0x45,0x4a,0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x00, 0x4a,0x62,0x80,0x05,0x01,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x4a,0x84,0x1b, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01, 0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x61,0x24, 0x02,0x00,0x90,0x09,0x05,0x40,0x05,0x3a,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x90,0x09,0x45,0x40,0x05,0x3c,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x90,0x09,0x05,0x41,0x25,0x3a,0x52,0x00,0x00,0x00,0x00,0x00,0x31,0xa5, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x4a,0x00,0xc0,0x0c,0x40,0x00,0x00,0x61,0x00, 0x02,0x00,0x90,0x09,0x45,0x41,0x25,0x3c,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0xa4,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa6, 0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x4a,0x00,0xc0,0x0c,0x41,0x00,0x00,0x31,0x06, 0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x02,0x0e,0xfb,0xff,0xff,0x66,0x01, 0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80,0x00,0x01,0x30,0x00,0x30,0x00,0x6c,0x01, 0x01,0x00,0x60,0x86,0x85,0x43,0xc5,0x1b,0x22,0x05,0x1f,0x00,0x1f,0x00,0x6c,0x00, 0x01,0x00,0x60,0x86,0xc5,0x40,0x85,0x40,0x22,0x05,0x1f,0x00,0x1f,0x00,0x40,0x02, 0x01,0x00,0x60,0x06,0xc5,0x1b,0x85,0x43,0x22,0x06,0xc5,0x1b,0x22,0x00,0x40,0x02, 0x01,0x00,0x60,0x06,0x85,0x40,0xc5,0x40,0x22,0x06,0x85,0x40,0x22,0x00,0x67,0x02, 0x01,0x00,0x60,0x06,0xc5,0x1b,0xc5,0x1b,0x22,0x06,0x85,0x43,0x22,0x00,0x61,0x00, 0x42,0xa8,0x90,0x00,0xc1,0xb4,0x61,0x02,0x01,0x00,0xa0,0x02,0x05,0x45,0xc5,0x1b, 0x22,0x00,0x00,0x00,0x00,0x00,0x67,0x04,0x01,0x00,0x60,0x06,0x85,0x40,0x85,0x40, 0x22,0x06,0xc5,0x40,0x22,0x00,0x38,0xa7,0x01,0x00,0xa0,0x0a,0x05,0x46,0x05,0x45, 0x22,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x01,0x00,0xa0,0x02,0xc5,0x41,0x85,0x40, 0x22,0x00,0x00,0x00,0x00,0x00,0x5b,0xc7,0x01,0x00,0xa8,0x02,0x04,0x46,0x04,0x46, 0x02,0x02,0x84,0x42,0x05,0x46,0x61,0x00,0x01,0x00,0x60,0x0a,0x85,0x41,0x05,0x45, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x01,0x00,0x60,0x0a,0x05,0x42,0xc5,0x41, 0x22,0x00,0x00,0x00,0x00,0x00,0x41,0x03,0x01,0x00,0xa0,0x0a,0xa5,0x42,0x05,0x46, 0x22,0x0a,0xc5,0x41,0x22,0x00,0x40,0x03,0x01,0x00,0x60,0x06,0x85,0x41,0xc5,0x1b, 0x22,0x06,0x85,0x41,0x22,0x02,0x40,0x03,0x01,0x00,0x60,0x06,0x05,0x42,0x85,0x40, 0x22,0x06,0x05,0x42,0x22,0x02,0x61,0x03,0x01,0x00,0x60,0x0a,0x05,0x43,0xa5,0x42, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0x05,0x44,0x85,0x41, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0x45,0x42,0x05,0x42, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x01,0x00,0xa0,0x02,0x45,0x43,0x05,0x43, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x90,0x49,0x95,0x44,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x5b,0x02,0x01,0x00,0xa8,0x02,0x04,0x45,0xc4,0x41, 0x8a,0x02,0x44,0x43,0x05,0x45,0x5b,0x04,0x01,0x00,0xa8,0x02,0x04,0x44,0x44,0x42, 0x8a,0x02,0x44,0x43,0x05,0x44,0x67,0x00,0x01,0x00,0x60,0x06,0x85,0x43,0x85,0x43, 0x22,0x06,0xc5,0x40,0x22,0x00,0x40,0x02,0x01,0x00,0xa0,0x0a,0x05,0x45,0x05,0x45, 0x22,0x0a,0x05,0x44,0x22,0x00,0x41,0x01,0x01,0x00,0xa0,0x0a,0x05,0x46,0x05,0x46, 0x22,0x0a,0x05,0x45,0x22,0x00,0x61,0x01,0x01,0x00,0x60,0x0a,0x45,0x44,0x05,0x46, 0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0x45,0x44,0x45,0x44, 0x22,0x06,0x05,0x43,0x22,0x00,0x41,0x01,0x01,0x80,0x60,0x06,0x01,0x20,0x45,0x44, 0x22,0x01,0xc4,0x1b,0x20,0x00,0x49,0x00,0x01,0x00,0x60,0x06,0x05,0x47,0x45,0x44, 0x22,0x06,0xc5,0x1b,0x22,0x00,0x40,0x07,0x01,0x00,0x60,0x06,0x45,0x44,0x45,0x44, 0x22,0x06,0x85,0x43,0x22,0x00,0x40,0x02,0x01,0x00,0x60,0x06,0x85,0x40,0x85,0x40, 0x22,0x06,0x05,0x47,0x22,0x02,0x70,0x01,0x01,0x00,0x20,0x02,0x01,0x00,0x85,0x40, 0x22,0x42,0xc5,0x1b,0x22,0x00,0x62,0x00,0x01,0x01,0x60,0x85,0xc5,0x43,0x94,0x44, 0x00,0x05,0x00,0x00,0x00,0x00,0x40,0x01,0x01,0x00,0x60,0x06,0x45,0x44,0x45,0x44, 0x22,0x06,0xc5,0x43,0x22,0x00,0x67,0x01,0x01,0x00,0x60,0x06,0x85,0x40,0x45,0x44, 0x22,0x06,0x85,0x43,0x22,0x00,0x65,0x01,0x00,0x00,0x20,0x82,0x01,0x80,0x00,0x80, 0x00,0x02,0x0e,0xfb,0xff,0xff,0x2d,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0xc4,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x4d,0x65,0x50,0x31,0x36,0x5f, 0x31,0x4d,0x45,0x5f,0x32,0x42,0x69,0x52,0x65,0x66,0x5f,0x4d,0x52,0x45,0x5f,0x38, 0x78,0x38,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78, 0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00, 0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72, 0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00, 0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30, 0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00, 0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35, 0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56, 0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56, 0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56, 0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56, 0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56, 0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56, 0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56, 0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56, 0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56, 0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56, 0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56, 0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56, 0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56, 0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56, 0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56, 0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56, 0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56, 0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00, 0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56, 0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31, 0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31, 0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33, 0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00, 0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56, 0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31, 0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32, 0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56,0x31,0x32,0x38,0x00,0x50,0x31,0x00,0x50, 0x32,0x00,0x50,0x33,0x00,0x4d,0x65,0x50,0x31,0x36,0x5f,0x31,0x4d,0x45,0x5f,0x32, 0x42,0x69,0x52,0x65,0x66,0x5f,0x4d,0x52,0x45,0x5f,0x38,0x78,0x38,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x37,0x39,0x00,0x42,0x42,0x5f,0x31,0x5f,0x31,0x33,0x30,0x00,0x54, 0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x54,0x39,0x00,0x54,0x31,0x30,0x00,0x54, 0x31,0x31,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65, 0x74,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x05,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x15,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x53,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x51,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x55,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x53,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x53,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x53,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x02,0x02,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x02,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x01, 0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x02,0x01, 0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x01,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x04,0x01,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x01,0x01,0x00,0x2b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x05,0x80,0x00,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x01,0x10,0x00,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x05,0x40,0x00,0x2c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x03,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x05,0x40,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x03,0x02,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x00,0x00,0x00,0x03,0x20,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x03,0x20,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x03,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00, 0x00,0x05,0x40,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00, 0x03,0x02,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x03, 0x20,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x03,0x20, 0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x05,0x40,0x00, 0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x05,0x80,0x00,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x03,0x02,0x00,0x32,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x04,0x40,0x00,0x45,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x02,0x02,0x00,0x32,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x05,0x02,0x00,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x05,0x04,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x05,0x01,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x63,0x00,0x00,0x00,0x01,0x30,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x64,0x00,0x00,0x00,0x05,0xc0,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x01,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00, 0x00,0x00,0x01,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x03,0x90,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x02, 0x90,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x03,0x08, 0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x01,0x00, 0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x01,0x00,0x3b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x01,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x03,0x01,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x03,0x01,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x03,0x40,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x05,0x02,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x73,0x00,0x00,0x00,0x05,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x74,0x00,0x00,0x00,0x01,0x10,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75, 0x00,0x00,0x00,0x01,0x08,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x01,0x10,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00, 0x00,0x01,0x40,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x05,0x00,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x01, 0x01,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x01, 0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x7b,0x00,0x00, 0x00,0x02,0x00,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x00,0x7d,0x00,0x00,0x00,0x01, 0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x00, 0x82,0x00,0x00,0x00,0x01,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0x00,0x00,0x84,0x00, 0x00,0x00,0x01,0x00,0x00,0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24, 0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x02,0x09,0x00,0x00, 0x00,0x2c,0x00,0x04,0x00,0x02,0x0a,0x00,0x00,0x00,0x30,0x00,0x04,0x00,0x02,0x0b, 0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x00,0x25,0x00,0x00,0x00,0x38,0x00,0x04,0x00, 0x00,0x20,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0x21,0x00,0x00,0x00,0x3d,0x00, 0x01,0x00,0x00,0x22,0x00,0x00,0x00,0x3e,0x00,0x01,0x00,0xa9,0x09,0x00,0x00,0x27, 0x09,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x6d, 0x65,0x5f,0x34,0x2e,0x61,0x73,0x6d,0x87,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00, 0x2d,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x00,0x07,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x01,0x21, 0x01,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x10,0x00,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x29,0x05,0x00,0x00,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x29,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x29, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x05,0x01,0x00,0x00,0xa0,0x76, 0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x05,0x05,0x20, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x16,0x00,0x02, 0x05,0x05,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00, 0x17,0x00,0x02,0x05,0x05,0x28,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05, 0x03,0xf0,0xff,0xff,0xff,0x26,0x01,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00, 0x00,0x29,0x05,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x5a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x21,0x01, 0x05,0x03,0xfe,0xff,0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x59,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x2c,0x01,0x02,0x02,0x01,0x00,0x00,0x57,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x03,0xff,0x3f,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x5b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x03,0x0f,0x20,0x00,0x00,0x10,0x58,0x00, 0x00,0x00,0x00,0x16,0x22,0x01,0x29,0x01,0x01,0x00,0x00,0x5a,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x2c,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x29, 0x01,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x2c,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03,0xf0,0xff,0xff, 0xff,0x26,0x01,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x03,0x01,0x00,0x00,0x00,0x29,0x05,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x02,0x00,0x02, 0x05,0x03,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00, 0x03,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x05,0x03,0xfe,0xff, 0xff,0xff,0x01,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x60,0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x10,0x5e,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x2c,0x01,0x02,0x02,0x02,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x03,0xff,0x3f,0x00,0x00,0x01,0x01,0x02,0x00,0x00,0x60,0x00,0x00,0x00,0x00, 0x02,0x00,0x02,0x05,0x03,0x0f,0x20,0x00,0x00,0x10,0x5d,0x00,0x00,0x00,0x00,0x16, 0x22,0x01,0x29,0x01,0x02,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x05, 0x03,0x01,0xe0,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x0b, 0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x01,0x00,0x00,0x00, 0x5f,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x04,0x22, 0x01,0x21,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61, 0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x05,0x05,0x02,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x01, 0x00,0x21,0x01,0x05,0x05,0x80,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x01,0x04,0x00,0x02,0x05,0x05,0x3f,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x01,0x09,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x01,0x18, 0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00, 0x62,0x00,0x00,0x00,0x01,0x19,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x16,0x22,0x01,0x05,0x03, 0x70,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x03,0x00,0x00,0x00, 0x20,0x01,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x05,0x05,0x0f,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x01, 0x21,0x01,0x05,0x05,0x04,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0x01,0x0a,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x66, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x01,0x06,0x00,0x02,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x61, 0x00,0x00,0x00,0x01,0x1f,0x00,0x02,0x05,0x05,0x01,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x01, 0x00,0x21,0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x05,0x01,0x00,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00, 0x35,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x20,0x00,0x00,0x00,0x00,0x6a,0x00,0x00, 0x00,0x00,0x0d,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x0d,0x21,0x01,0x05,0x05, 0xf8,0xff,0xff,0xff,0x29,0x01,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x69, 0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0xc0,0x98,0x0c,0x5d,0x00,0x04,0x00, 0x00,0x08,0x00,0x00,0x00,0x06,0x09,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x37,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x29,0x02,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x07,0x04, 0x22,0x01,0x29,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10, 0x6e,0x00,0x00,0x00,0x08,0x08,0x22,0x01,0x24,0x00,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x01,0x00,0x00,0x00, 0x38,0x00,0x09,0x00,0x08,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00, 0x00,0x0d,0x21,0x01,0x05,0x03,0xcf,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x76, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x0d,0x21,0x01, 0x05,0x03,0x30,0x00,0x00,0x00,0x2c,0x00,0x01,0x02,0x03,0x00,0x00,0x77,0x00,0x00, 0x00,0x02,0x04,0x21,0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x2a,0x00,0x03,0x00,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x61, 0x00,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x20,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x00, 0x00,0x00,0x01,0x06,0x21,0x01,0x05,0x05,0xc0,0xff,0xff,0xff,0x21,0x00,0x00,0x00, 0x00,0x61,0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x05,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x61,0x00,0x00, 0x00,0x00,0x0e,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x0e,0x21,0x01,0x05,0x05, 0xfb,0xff,0xff,0xff,0x29,0x03,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x08,0x00,0x00,0x10,0x00,0x10,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x01,0x03, 0x00,0x03,0x00,0x29,0x03,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x05,0x01,0x00,0x00,0x00,0x00,0x29,0x03,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x05,0x08,0x00,0x00,0x30,0x00,0x29,0x03,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x05,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x03,0x00, 0x01,0x00,0x29,0x05,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x40,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x41,0x00,0x00, 0x00,0x01,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x22,0x01,0x31,0x01, 0x00,0x29,0x02,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x38, 0x00,0x00,0x00,0x08,0x04,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x01,0x00,0x00,0x03,0x00,0x38,0x00,0x00,0x00,0x08,0x05,0x21,0x01,0x29,0x02,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x38,0x00,0x00,0x00,0x08, 0x06,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x03, 0x00,0x38,0x00,0x00,0x00,0x08,0x07,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x02,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x01,0x01,0x00,0x03,0x00,0x42,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x01, 0x00,0x03,0x00,0x42,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x02,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x01,0x01,0x00,0x03,0x00,0x42,0x00,0x00,0x00,0x00,0x03,0x21, 0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x00,0x00,0x00, 0x02,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x43,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x06,0x00,0x00,0x02, 0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x02,0x14,0x00,0x02,0x05,0x05,0x03,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x7e,0x00,0x00,0x00,0x02,0x15,0x00,0x02,0x05,0x05,0x00,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x02,0x16,0x00,0x02,0x05,0x05,0xaa,0xff, 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x6c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x00,0x60,0x78,0x10,0x5d,0x00, 0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x07,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x29,0x02, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00, 0x01,0x00,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x48,0x00,0x00,0x00,0x03,0x00,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x00,0x00,0x00,0x01,0x02,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x48,0x00, 0x00,0x00,0x03,0x02,0x36,0x02,0x38,0x00,0x0a,0x00,0x08,0x02,0x00,0x73,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x49,0x00, 0x00,0x00,0x00,0x00,0x38,0x00,0x0b,0x00,0x08,0x02,0x00,0x73,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x4a,0x00,0x00,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x61,0x01,0x33,0xa2,0x38,0x00,0x01,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x68,0x00, 0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x31,0xb0, 0x04,0x80,0x00,0x00,0x05,0x08,0x04,0x33,0x00,0xa0,0x00,0x00,0x00,0x00,0x65,0x00, 0x00,0x80,0x10,0x82,0x46,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02, 0x02,0x62,0x05,0x02,0xf1,0xff,0x61,0x00,0x00,0x80,0x50,0x00,0x05,0x36,0xe4,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x01,0x45,0x02,0xc4,0x01, 0x00,0x01,0x44,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x60,0x01,0x65,0x02,0xd4,0x01, 0x00,0x01,0x04,0x02,0x00,0x00,0x41,0x02,0x00,0x00,0x60,0x06,0x85,0x02,0x44,0x02, 0x00,0x05,0x04,0x36,0x00,0x00,0x41,0x02,0x00,0x00,0x60,0x06,0xa5,0x02,0x64,0x02, 0x00,0x05,0x04,0x36,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x49,0x05,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90,0x09,0x45,0x03,0x84,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0x00,0x00,0x90,0x09,0x55,0x03,0xa4,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0xa8,0x98,0x00,0xa1,0x76,0x61,0x00, 0x00,0x00,0x40,0x45,0x26,0x04,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00, 0x00,0x00,0x40,0x45,0xb6,0x03,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x61,0x00, 0x00,0x00,0x40,0x45,0xbe,0x03,0x00,0x00,0x00,0x00,0x28,0x00,0x28,0x00,0x61,0x00, 0x02,0x68,0xc8,0x01,0x01,0x00,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x06,0x05,0x03, 0x46,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x50,0x84,0xc5,0x02,0xb5,0x03, 0x22,0x05,0xf0,0xff,0xf0,0xff,0x61,0x00,0x01,0x00,0x90,0x49,0x05,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x02,0x01,0x00,0x50,0x85,0x05,0x05,0xc5,0x02, 0x22,0x05,0x01,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x50,0x85,0x01,0x00,0xc5,0x02, 0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x03,0x00,0x00,0x50,0x85,0x15,0x06,0x14,0x06, 0x00,0x05,0xfe,0xff,0xfe,0xff,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x06,0xb4,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x45,0x06,0x45,0x03, 0x22,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x01,0x00,0x50,0x05,0x05,0x06,0x05,0x06, 0x22,0x05,0x05,0x05,0x22,0x02,0x40,0x00,0x01,0x01,0x50,0xa4,0x05,0x06,0xb5,0x03, 0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01,0x90,0x49,0x05,0x06,0x00,0x00, 0x00,0x00,0x01,0xe0,0x01,0xe0,0x40,0x05,0x01,0x00,0x50,0x84,0x25,0x05,0xb5,0x06, 0x22,0x05,0xf0,0xff,0xf0,0xff,0x61,0x02,0x05,0x00,0x90,0x09,0x05,0x20,0x05,0x06, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x90,0x09,0xb5,0x20,0xb4,0x06, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x49,0x25,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x80,0x65,0x05,0xb5,0x20, 0x22,0x05,0x70,0x00,0x70,0x00,0x66,0x00,0x00,0x00,0x40,0x84,0x06,0x21,0x04,0x21, 0x00,0x05,0x02,0x00,0x02,0x00,0x68,0x02,0x01,0x00,0x10,0x81,0x65,0x05,0x65,0x05, 0x22,0x01,0x03,0x00,0x03,0x00,0x6c,0x07,0x01,0x00,0x50,0x85,0x45,0x05,0x25,0x05, 0x22,0x05,0x01,0x00,0x01,0x00,0x65,0x02,0x01,0x00,0x40,0x84,0x86,0x05,0x64,0x05, 0x20,0x05,0x0f,0x00,0x0f,0x00,0x70,0x00,0x01,0x00,0x50,0x85,0x01,0x00,0x25,0x05, 0x22,0x35,0xff,0x3f,0xff,0x3f,0x65,0x07,0x00,0x00,0x50,0x85,0x35,0x20,0x34,0x20, 0x00,0x05,0xfe,0xff,0xfe,0xff,0x66,0x06,0x00,0x00,0x40,0x84,0x06,0x21,0x04,0x21, 0x00,0x05,0x80,0xff,0x80,0xff,0x69,0x04,0x00,0x00,0x40,0x84,0x56,0x01,0x94,0x05, 0x00,0x05,0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x80,0x50,0x04,0x15,0x36,0x84,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x90,0x09,0x45,0x20,0x45,0x06, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0x26,0x21,0x00,0x00, 0x00,0x00,0x3f,0x00,0x3f,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0x36,0x21,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x61,0x00,0x00,0x00,0x40,0x45,0xfe,0x21,0x00,0x00, 0x00,0x00,0x01,0x00,0x01,0x00,0x61,0x20,0x00,0x00,0x40,0x04,0x4e,0x21,0xc4,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x40,0x04,0x46,0x21,0xcc,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x01,0x00,0x50,0x05,0x25,0x20,0x25,0x20, 0x22,0x05,0x45,0x05,0x22,0x02,0x66,0x07,0x00,0x00,0x40,0x84,0x06,0x21,0x04,0x21, 0x00,0x05,0x20,0x00,0x20,0x00,0x66,0x07,0x00,0x00,0x40,0x04,0x56,0x21,0x54,0x01, 0x00,0x05,0x14,0x36,0x00,0x00,0x40,0x00,0x01,0x01,0x50,0xa4,0x25,0x20,0xb5,0x06, 0x22,0x05,0x0f,0x20,0x0f,0x20,0x61,0x00,0x01,0x01,0x90,0x49,0x25,0x20,0x00,0x00, 0x00,0x00,0x01,0xe0,0x01,0xe0,0x61,0x00,0x0e,0xa0,0x00,0x00,0x01,0x00,0x61,0x02, 0x0c,0x60,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x86,0x01,0x10,0x24,0x02, 0x00,0x06,0x00,0xc0,0x98,0x0c,0x61,0x00,0x10,0x60,0x00,0x08,0x00,0x00,0x61,0x00, 0x0f,0xa1,0x00,0x00,0x01,0x00,0x65,0x04,0x00,0x00,0x40,0x84,0x6e,0x0c,0x6c,0x0c, 0x00,0x05,0xf8,0xff,0xf8,0xff,0x61,0x00,0x01,0x00,0x90,0x09,0x05,0x0c,0x05,0x20, 0x22,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x0c,0xa8,0x60,0x00,0x01,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0xe5,0x02,0x44,0x02,0x00,0x05,0x03,0x00,0x03,0x00,0x31,0xa1, 0x04,0x00,0x00,0x00,0x05,0x12,0x04,0x0c,0x00,0x80,0x00,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x60,0x86,0xa5,0x05,0x64,0x02,0x00,0x05,0x01,0x00,0x01,0x00,0x65,0x00, 0x00,0x00,0x50,0x80,0x15,0x02,0x6c,0x20,0x00,0x05,0xcf,0x00,0xcf,0x00,0x70,0x00, 0x00,0x00,0x50,0x85,0x01,0x00,0x44,0x0a,0x00,0x25,0x00,0x00,0x00,0x00,0x61,0x00, 0x34,0x64,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x31,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0xe5,0x05,0x00,0x00, 0x00,0x00,0x03,0x00,0x03,0x00,0x61,0x00,0x03,0x00,0x50,0x44,0x85,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x66,0x00,0x00,0x00,0x50,0x80,0xc5,0x05,0x6c,0x20, 0x00,0x05,0x30,0x00,0x30,0x00,0x65,0x00,0x00,0x00,0x40,0x84,0xd6,0x05,0x34,0x21, 0x00,0x05,0xc0,0xff,0xc0,0xff,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x64,0x01, 0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x34,0x00,0x00, 0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x00,0x34,0x62,0x80,0x02,0x01,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x34,0xa4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x11,0x90,0x09,0xc5,0x05,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x21, 0x02,0x00,0x60,0x01,0x05,0x1b,0x45,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x1f,0xa1,0x00,0x00,0x01,0x00,0x31,0xa2,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x34, 0x00,0xc0,0x0c,0x1b,0x00,0x00,0x61,0x00,0x1d,0xa1,0x00,0x00,0x01,0x00,0x65,0x00, 0x00,0x00,0x40,0x84,0x76,0x20,0x74,0x20,0x00,0x05,0xfb,0xff,0xfb,0xff,0x41,0x00, 0x03,0x00,0x60,0x06,0x05,0x1e,0xe4,0x05,0x00,0x05,0x85,0x31,0x46,0x00,0x61,0x00, 0x03,0x00,0x60,0x05,0x05,0x1c,0x85,0x32,0x46,0x00,0x00,0x00,0x00,0x00,0x66,0x00, 0x00,0x00,0x40,0x84,0x36,0x21,0xd4,0x05,0x00,0x05,0x20,0x00,0x20,0x00,0x61,0x32, 0x03,0x00,0x50,0x25,0x85,0x1b,0x85,0x1a,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x00,0x00,0x40,0x04,0x6e,0x20,0xc4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x61,0x05, 0x05,0x00,0x40,0x04,0x05,0x1e,0x05,0x1c,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x05,0x00,0x40,0x04,0x05,0x1f,0x05,0x1d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x06,0x26,0x84,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x06,0x27,0xa4,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x06,0x28,0xc4,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x06,0x29,0xe4,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07, 0x22,0x60,0x00,0x20,0x00,0x00,0x61,0x06,0x24,0x60,0x00,0x1e,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x86,0x01,0x10,0x24,0x02,0x00,0x06,0x00,0x60,0x78,0x10,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x26,0x26,0x84,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x26,0x27,0xa4,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x26,0x28,0xc4,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x0a,0x26,0x29,0xe4,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x40,0x45,0xa6,0x24,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x61,0x00, 0x00,0x00,0x40,0x45,0xae,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x40,0x45,0xb6,0x24,0x00,0x00,0x00,0x00,0xaa,0xff,0xaa,0xff,0x61,0x00, 0x35,0x64,0x00,0x00,0x00,0x00,0x31,0xa3,0x04,0x00,0x00,0x00,0x05,0x2a,0x04,0x22, 0x00,0xd0,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x35,0x00,0x00, 0x00,0x00,0x07,0x00,0x01,0x00,0x61,0x00,0x35,0x62,0x80,0x02,0x01,0x00,0x61,0x00, 0x00,0x80,0xa0,0x0a,0x25,0x35,0xa4,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x84,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x00, 0x7f,0x64,0x00,0x00,0x00,0x00,0x61,0x23,0x02,0x00,0x90,0x09,0x05,0x31,0x05,0x2b, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x31,0x05,0x2d, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x32,0x25,0x2b, 0x52,0x00,0x00,0x00,0x00,0x00,0x31,0xa4,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x35, 0x00,0xc0,0x0c,0x31,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x32,0x25,0x2d, 0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0xa4,0x01, 0x00,0x02,0x00,0x80,0x0a,0x02,0x31,0xa5,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x35, 0x00,0xc0,0x0c,0x32,0x00,0x00,0x31,0x06,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f, 0x20,0x70,0x00,0x00,0x00,0x00 }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_me_gen12lp_isa.h000066400000000000000000000023311443134507600316010ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_ME_GEN12LP_ISA_H__ #define __GENX_ME_GEN12LP_ISA_H__ extern const unsigned char genx_me_gen12lp[37158]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_sd_gen12lp_isa.cpp000066400000000000000000021531661443134507600321600ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "genx_sd_gen12lp_isa.h" const unsigned char genx_sd_gen12lp[114171] = { 0x43,0x49,0x53,0x41,0x03,0x06,0x04,0x00,0x13,0x53,0x70,0x61,0x74,0x69,0x61,0x6c, 0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0xce,0x00,0x00,0x00, 0xa0,0x5e,0x00,0x00,0xf3,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0c,0x6e,0x5f, 0x00,0x00,0xc8,0x23,0x00,0x00,0x18,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65, 0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x4e,0x56,0x31,0x32,0x36, 0x83,0x00,0x00,0xc7,0x67,0x00,0x00,0x11,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x0c,0xfd,0xea,0x00,0x00,0x20,0x28,0x00,0x00,0x18,0x53,0x70,0x61,0x74,0x69,0x61, 0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x59,0x56, 0x31,0x32,0x1d,0x13,0x01,0x00,0x0f,0x67,0x00,0x00,0x0c,0x3c,0x01,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0x2c,0x7a,0x01,0x00,0x70,0x26,0x00,0x00,0x13,0x53,0x70,0x61, 0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x34,0x78,0x34, 0x9c,0xa0,0x01,0x00,0x77,0x15,0x00,0x00,0xdc,0xa9,0x01,0x00,0x00,0x00,0x00,0x00, 0x01,0x0c,0x13,0xb6,0x01,0x00,0xe8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x01, 0x00,0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65, 0x72,0x5f,0x38,0x78,0x38,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61, 0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f, 0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64, 0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73, 0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00, 0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00, 0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c, 0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00, 0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33, 0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33, 0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34, 0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34, 0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34, 0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35, 0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35, 0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36, 0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36, 0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36, 0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37, 0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37, 0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38, 0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38, 0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38, 0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39, 0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39, 0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31, 0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30, 0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36, 0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00, 0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x56, 0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x35,0x00,0x56,0x31, 0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x38,0x00,0x56,0x31,0x31, 0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31,0x00,0x56,0x31,0x32,0x32, 0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00,0x56,0x31,0x32,0x35,0x00, 0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56,0x31,0x32,0x38,0x00,0x56, 0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56,0x31,0x33,0x31,0x00,0x56,0x31, 0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31,0x33,0x34,0x00,0x56,0x31,0x33, 0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33,0x37,0x00,0x56,0x31,0x33,0x38, 0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30,0x00,0x56,0x31,0x34,0x31,0x00, 0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00,0x56,0x31,0x34,0x34,0x00,0x56, 0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56,0x31,0x34,0x37,0x00,0x56,0x31, 0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31,0x35,0x30,0x00,0x56,0x31,0x35, 0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35,0x33,0x00,0x56,0x31,0x35,0x34, 0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36,0x00,0x56,0x31,0x35,0x37,0x00, 0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00,0x56,0x31,0x36,0x30,0x00,0x56, 0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56,0x31,0x36,0x33,0x00,0x56,0x31, 0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31,0x36,0x36,0x00,0x56,0x31,0x36, 0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36,0x39,0x00,0x56,0x31,0x37,0x30, 0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32,0x00,0x56,0x31,0x37,0x33,0x00, 0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00,0x56,0x31,0x37,0x36,0x00,0x56, 0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56,0x31,0x37,0x39,0x00,0x56,0x31, 0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31,0x38,0x32,0x00,0x56,0x31,0x38, 0x33,0x00,0x56,0x31,0x38,0x34,0x00,0x56,0x31,0x38,0x35,0x00,0x56,0x31,0x38,0x36, 0x00,0x56,0x31,0x38,0x37,0x00,0x56,0x31,0x38,0x38,0x00,0x56,0x31,0x38,0x39,0x00, 0x56,0x31,0x39,0x30,0x00,0x56,0x31,0x39,0x31,0x00,0x56,0x31,0x39,0x32,0x00,0x56, 0x31,0x39,0x33,0x00,0x56,0x31,0x39,0x34,0x00,0x56,0x31,0x39,0x35,0x00,0x56,0x31, 0x39,0x36,0x00,0x56,0x31,0x39,0x37,0x00,0x56,0x31,0x39,0x38,0x00,0x56,0x31,0x39, 0x39,0x00,0x56,0x32,0x30,0x30,0x00,0x56,0x32,0x30,0x31,0x00,0x56,0x32,0x30,0x32, 0x00,0x56,0x32,0x30,0x33,0x00,0x56,0x32,0x30,0x34,0x00,0x56,0x32,0x30,0x35,0x00, 0x56,0x32,0x30,0x36,0x00,0x56,0x32,0x30,0x37,0x00,0x56,0x32,0x30,0x38,0x00,0x56, 0x32,0x30,0x39,0x00,0x56,0x32,0x31,0x30,0x00,0x56,0x32,0x31,0x31,0x00,0x56,0x32, 0x31,0x32,0x00,0x56,0x32,0x31,0x33,0x00,0x56,0x32,0x31,0x34,0x00,0x56,0x32,0x31, 0x35,0x00,0x56,0x32,0x31,0x36,0x00,0x56,0x32,0x31,0x37,0x00,0x56,0x32,0x31,0x38, 0x00,0x56,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x30,0x00,0x56,0x32,0x32,0x31,0x00, 0x56,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x33,0x00,0x56,0x32,0x32,0x34,0x00,0x56, 0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x36,0x00,0x56,0x32,0x32,0x37,0x00,0x56,0x32, 0x32,0x38,0x00,0x56,0x32,0x32,0x39,0x00,0x56,0x32,0x33,0x30,0x00,0x56,0x32,0x33, 0x31,0x00,0x56,0x32,0x33,0x32,0x00,0x56,0x32,0x33,0x33,0x00,0x56,0x32,0x33,0x34, 0x00,0x56,0x32,0x33,0x35,0x00,0x56,0x32,0x33,0x36,0x00,0x56,0x32,0x33,0x37,0x00, 0x56,0x32,0x33,0x38,0x00,0x56,0x32,0x33,0x39,0x00,0x56,0x32,0x34,0x30,0x00,0x56, 0x32,0x34,0x31,0x00,0x56,0x32,0x34,0x32,0x00,0x56,0x32,0x34,0x33,0x00,0x56,0x32, 0x34,0x34,0x00,0x56,0x32,0x34,0x35,0x00,0x56,0x32,0x34,0x36,0x00,0x56,0x32,0x34, 0x37,0x00,0x56,0x32,0x34,0x38,0x00,0x56,0x32,0x34,0x39,0x00,0x56,0x32,0x35,0x30, 0x00,0x56,0x32,0x35,0x31,0x00,0x56,0x32,0x35,0x32,0x00,0x56,0x32,0x35,0x33,0x00, 0x56,0x32,0x35,0x34,0x00,0x56,0x32,0x35,0x35,0x00,0x56,0x32,0x35,0x36,0x00,0x56, 0x32,0x35,0x37,0x00,0x56,0x32,0x35,0x38,0x00,0x56,0x32,0x35,0x39,0x00,0x56,0x32, 0x36,0x30,0x00,0x56,0x32,0x36,0x31,0x00,0x56,0x32,0x36,0x32,0x00,0x56,0x32,0x36, 0x33,0x00,0x56,0x32,0x36,0x34,0x00,0x56,0x32,0x36,0x35,0x00,0x56,0x32,0x36,0x36, 0x00,0x56,0x32,0x36,0x37,0x00,0x56,0x32,0x36,0x38,0x00,0x56,0x32,0x36,0x39,0x00, 0x56,0x32,0x37,0x30,0x00,0x56,0x32,0x37,0x31,0x00,0x56,0x32,0x37,0x32,0x00,0x56, 0x32,0x37,0x33,0x00,0x56,0x32,0x37,0x34,0x00,0x56,0x32,0x37,0x35,0x00,0x56,0x32, 0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x00,0x56,0x32,0x37,0x38,0x00,0x56,0x32,0x37, 0x39,0x00,0x56,0x32,0x38,0x30,0x00,0x56,0x32,0x38,0x31,0x00,0x56,0x32,0x38,0x32, 0x00,0x56,0x32,0x38,0x33,0x00,0x56,0x32,0x38,0x34,0x00,0x56,0x32,0x38,0x35,0x00, 0x56,0x32,0x38,0x36,0x00,0x56,0x32,0x38,0x37,0x00,0x56,0x32,0x38,0x38,0x00,0x56, 0x32,0x38,0x39,0x00,0x56,0x32,0x39,0x30,0x00,0x56,0x32,0x39,0x31,0x00,0x56,0x32, 0x39,0x32,0x00,0x56,0x32,0x39,0x33,0x00,0x56,0x32,0x39,0x34,0x00,0x56,0x32,0x39, 0x35,0x00,0x56,0x32,0x39,0x36,0x00,0x56,0x32,0x39,0x37,0x00,0x56,0x32,0x39,0x38, 0x00,0x56,0x32,0x39,0x39,0x00,0x56,0x33,0x30,0x30,0x00,0x56,0x33,0x30,0x31,0x00, 0x56,0x33,0x30,0x32,0x00,0x56,0x33,0x30,0x33,0x00,0x56,0x33,0x30,0x34,0x00,0x56, 0x33,0x30,0x35,0x00,0x56,0x33,0x30,0x36,0x00,0x56,0x33,0x30,0x37,0x00,0x56,0x33, 0x30,0x38,0x00,0x56,0x33,0x30,0x39,0x00,0x56,0x33,0x31,0x30,0x00,0x56,0x33,0x31, 0x31,0x00,0x56,0x33,0x31,0x32,0x00,0x56,0x33,0x31,0x33,0x00,0x56,0x33,0x31,0x34, 0x00,0x56,0x33,0x31,0x35,0x00,0x56,0x33,0x31,0x36,0x00,0x56,0x33,0x31,0x37,0x00, 0x56,0x33,0x31,0x38,0x00,0x56,0x33,0x31,0x39,0x00,0x56,0x33,0x32,0x30,0x00,0x56, 0x33,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x00,0x56,0x33,0x32,0x33,0x00,0x56,0x33, 0x32,0x34,0x00,0x56,0x33,0x32,0x35,0x00,0x56,0x33,0x32,0x36,0x00,0x56,0x33,0x32, 0x37,0x00,0x56,0x33,0x32,0x38,0x00,0x56,0x33,0x32,0x39,0x00,0x56,0x33,0x33,0x30, 0x00,0x56,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x32,0x00,0x56,0x33,0x33,0x33,0x00, 0x56,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x35,0x00,0x56,0x33,0x33,0x36,0x00,0x56, 0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x38,0x00,0x56,0x33,0x33,0x39,0x00,0x56,0x33, 0x34,0x30,0x00,0x56,0x33,0x34,0x31,0x00,0x56,0x33,0x34,0x32,0x00,0x56,0x33,0x34, 0x33,0x00,0x56,0x33,0x34,0x34,0x00,0x56,0x33,0x34,0x35,0x00,0x56,0x33,0x34,0x36, 0x00,0x56,0x33,0x34,0x37,0x00,0x56,0x33,0x34,0x38,0x00,0x56,0x33,0x34,0x39,0x00, 0x56,0x33,0x35,0x30,0x00,0x56,0x33,0x35,0x31,0x00,0x56,0x33,0x35,0x32,0x00,0x56, 0x33,0x35,0x33,0x00,0x56,0x33,0x35,0x34,0x00,0x56,0x33,0x35,0x35,0x00,0x56,0x33, 0x35,0x36,0x00,0x56,0x33,0x35,0x37,0x00,0x56,0x33,0x35,0x38,0x00,0x56,0x33,0x35, 0x39,0x00,0x56,0x33,0x36,0x30,0x00,0x56,0x33,0x36,0x31,0x00,0x56,0x33,0x36,0x32, 0x00,0x56,0x33,0x36,0x33,0x00,0x56,0x33,0x36,0x34,0x00,0x56,0x33,0x36,0x35,0x00, 0x56,0x33,0x36,0x36,0x00,0x56,0x33,0x36,0x37,0x00,0x56,0x33,0x36,0x38,0x00,0x56, 0x33,0x36,0x39,0x00,0x56,0x33,0x37,0x30,0x00,0x56,0x33,0x37,0x31,0x00,0x56,0x33, 0x37,0x32,0x00,0x56,0x33,0x37,0x33,0x00,0x56,0x33,0x37,0x34,0x00,0x56,0x33,0x37, 0x35,0x00,0x56,0x33,0x37,0x36,0x00,0x56,0x33,0x37,0x37,0x00,0x56,0x33,0x37,0x38, 0x00,0x56,0x33,0x37,0x39,0x00,0x56,0x33,0x38,0x30,0x00,0x56,0x33,0x38,0x31,0x00, 0x56,0x33,0x38,0x32,0x00,0x56,0x33,0x38,0x33,0x00,0x56,0x33,0x38,0x34,0x00,0x56, 0x33,0x38,0x35,0x00,0x56,0x33,0x38,0x36,0x00,0x56,0x33,0x38,0x37,0x00,0x56,0x33, 0x38,0x38,0x00,0x56,0x33,0x38,0x39,0x00,0x56,0x33,0x39,0x30,0x00,0x56,0x33,0x39, 0x31,0x00,0x56,0x33,0x39,0x32,0x00,0x56,0x33,0x39,0x33,0x00,0x56,0x33,0x39,0x34, 0x00,0x56,0x33,0x39,0x35,0x00,0x56,0x33,0x39,0x36,0x00,0x56,0x33,0x39,0x37,0x00, 0x56,0x33,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x00,0x56,0x34,0x30,0x30,0x00,0x56, 0x34,0x30,0x31,0x00,0x56,0x34,0x30,0x32,0x00,0x56,0x34,0x30,0x33,0x00,0x56,0x34, 0x30,0x34,0x00,0x56,0x34,0x30,0x35,0x00,0x56,0x34,0x30,0x36,0x00,0x56,0x34,0x30, 0x37,0x00,0x56,0x34,0x30,0x38,0x00,0x56,0x34,0x30,0x39,0x00,0x56,0x34,0x31,0x30, 0x00,0x56,0x34,0x31,0x31,0x00,0x56,0x34,0x31,0x32,0x00,0x56,0x34,0x31,0x33,0x00, 0x56,0x34,0x31,0x34,0x00,0x56,0x34,0x31,0x35,0x00,0x56,0x34,0x31,0x36,0x00,0x56, 0x34,0x31,0x37,0x00,0x56,0x34,0x31,0x38,0x00,0x56,0x34,0x31,0x39,0x00,0x56,0x34, 0x32,0x30,0x00,0x56,0x34,0x32,0x31,0x00,0x56,0x34,0x32,0x32,0x00,0x56,0x34,0x32, 0x33,0x00,0x56,0x34,0x32,0x34,0x00,0x56,0x34,0x32,0x35,0x00,0x56,0x34,0x32,0x36, 0x00,0x56,0x34,0x32,0x37,0x00,0x56,0x34,0x32,0x38,0x00,0x56,0x34,0x32,0x39,0x00, 0x56,0x34,0x33,0x30,0x00,0x56,0x34,0x33,0x31,0x00,0x56,0x34,0x33,0x32,0x00,0x56, 0x34,0x33,0x33,0x00,0x56,0x34,0x33,0x34,0x00,0x56,0x34,0x33,0x35,0x00,0x56,0x34, 0x33,0x36,0x00,0x56,0x34,0x33,0x37,0x00,0x56,0x34,0x33,0x38,0x00,0x56,0x34,0x33, 0x39,0x00,0x56,0x34,0x34,0x30,0x00,0x56,0x34,0x34,0x31,0x00,0x56,0x34,0x34,0x32, 0x00,0x56,0x34,0x34,0x33,0x00,0x56,0x34,0x34,0x34,0x00,0x56,0x34,0x34,0x35,0x00, 0x56,0x34,0x34,0x36,0x00,0x56,0x34,0x34,0x37,0x00,0x56,0x34,0x34,0x38,0x00,0x56, 0x34,0x34,0x39,0x00,0x56,0x34,0x35,0x30,0x00,0x56,0x34,0x35,0x31,0x00,0x56,0x34, 0x35,0x32,0x00,0x56,0x34,0x35,0x33,0x00,0x56,0x34,0x35,0x34,0x00,0x56,0x34,0x35, 0x35,0x00,0x56,0x34,0x35,0x36,0x00,0x56,0x34,0x35,0x37,0x00,0x56,0x34,0x35,0x38, 0x00,0x56,0x34,0x35,0x39,0x00,0x56,0x34,0x36,0x30,0x00,0x56,0x34,0x36,0x31,0x00, 0x56,0x34,0x36,0x32,0x00,0x56,0x34,0x36,0x33,0x00,0x56,0x34,0x36,0x34,0x00,0x56, 0x34,0x36,0x35,0x00,0x56,0x34,0x36,0x36,0x00,0x56,0x34,0x36,0x37,0x00,0x56,0x34, 0x36,0x38,0x00,0x56,0x34,0x36,0x39,0x00,0x56,0x34,0x37,0x30,0x00,0x56,0x34,0x37, 0x31,0x00,0x56,0x34,0x37,0x32,0x00,0x56,0x34,0x37,0x33,0x00,0x56,0x34,0x37,0x34, 0x00,0x56,0x34,0x37,0x35,0x00,0x56,0x34,0x37,0x36,0x00,0x56,0x34,0x37,0x37,0x00, 0x56,0x34,0x37,0x38,0x00,0x56,0x34,0x37,0x39,0x00,0x56,0x34,0x38,0x30,0x00,0x56, 0x34,0x38,0x31,0x00,0x56,0x34,0x38,0x32,0x00,0x56,0x34,0x38,0x33,0x00,0x56,0x34, 0x38,0x34,0x00,0x56,0x34,0x38,0x35,0x00,0x56,0x34,0x38,0x36,0x00,0x56,0x34,0x38, 0x37,0x00,0x56,0x34,0x38,0x38,0x00,0x56,0x34,0x38,0x39,0x00,0x56,0x34,0x39,0x30, 0x00,0x56,0x34,0x39,0x31,0x00,0x56,0x34,0x39,0x32,0x00,0x56,0x34,0x39,0x33,0x00, 0x56,0x34,0x39,0x34,0x00,0x56,0x34,0x39,0x35,0x00,0x56,0x34,0x39,0x36,0x00,0x56, 0x34,0x39,0x37,0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f,0x69, 0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x42,0x42,0x5f,0x30,0x5f,0x32,0x36,0x33, 0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d, 0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00, 0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x53,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x55,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00, 0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x13, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x13,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00, 0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x57, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x57,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00, 0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x25,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00, 0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x25,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00, 0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0x25,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00, 0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf9,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfa,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfb,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x25,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x55,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x01,0x01,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x02,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x02,0x01,0x00,0x21,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0x01,0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0a,0x01,0x00,0x00,0x05,0x80,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x01,0x00,0x00,0x03,0x40,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x01,0x00,0x00,0x01,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01, 0x00,0x00,0x01,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00, 0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x03, 0x08,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x04,0xc0, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x03,0x04,0x00, 0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x03,0x02,0x00,0x2d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x03,0x10,0x00,0x5b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x03,0x08,0x00,0x2e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x03,0x04,0x00,0x2f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x03,0x02,0x00,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x03,0x08,0x00,0x31,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x01,0x00,0x00,0x03,0x04,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x01,0x00,0x00,0x03,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1b,0x01,0x00,0x00,0x03,0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x01,0x00,0x00,0x03,0x04,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01, 0x00,0x00,0x03,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00, 0x00,0x03,0x08,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00, 0x03,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x03, 0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x03,0x08, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x03,0x04,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x03,0x02,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x03,0x08,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00,0x00,0x03,0x04,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x03,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x03,0x08,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x03,0x04,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x01,0x00,0x00,0x03,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x01,0x00,0x00,0x03,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2b,0x01,0x00,0x00,0x03,0x04,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c, 0x01,0x00,0x00,0x03,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01, 0x00,0x00,0x03,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00, 0x00,0x03,0x04,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00, 0x03,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x03, 0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x03,0x04, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x03,0x02,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x03,0x08,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x03,0x04,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01,0x00,0x00,0x03,0x02,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x03,0x08,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x03,0x04,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x03,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x39,0x01,0x00,0x00,0x03,0x08,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3a,0x01,0x00,0x00,0x03,0x04,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x01,0x00,0x00,0x03,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c, 0x01,0x00,0x00,0x03,0x08,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01, 0x00,0x00,0x03,0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00, 0x00,0x03,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00, 0x03,0x08,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x03, 0x04,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x03,0x02, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x02,0x10,0x00, 0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x01,0x10,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x01,0x10,0x00,0x5c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x01,0x10,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x01,0x10,0x00,0x5e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x01,0x10,0x00,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x01,0x10,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x49,0x01,0x00,0x00,0x01,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4a,0x01,0x00,0x00,0x01,0x10,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4b,0x01,0x00,0x00,0x01,0x10,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c, 0x01,0x00,0x00,0x01,0x10,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01, 0x00,0x00,0x01,0x10,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00, 0x00,0x01,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00, 0x01,0x10,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x01, 0x10,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x01,0x10, 0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x01,0x10,0x00, 0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x03,0x20,0x00,0x68, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x03,0x20,0x00,0x69,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x03,0x20,0x00,0x6a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x03,0x20,0x00,0x6b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x03,0x20,0x00,0x6c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x03,0x20,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x59,0x01,0x00,0x00,0x03,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5a,0x01,0x00,0x00,0x03,0x20,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5b,0x01,0x00,0x00,0x01,0x08,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, 0x01,0x00,0x00,0x02,0x20,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01, 0x00,0x00,0x02,0x20,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00, 0x00,0x01,0x04,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00, 0x01,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x01, 0x10,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x01,0x08, 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x01,0x04,0x00, 0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x01,0x02,0x00,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x01,0x08,0x00,0x76,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x01,0x04,0x00,0x77,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x02,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x01,0x08,0x00,0x79,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x01,0x04,0x00,0x7a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x69,0x01,0x00,0x00,0x01,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0x01,0x00,0x00,0x01,0x08,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6b,0x01,0x00,0x00,0x02,0x20,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x01,0x00,0x00,0x02,0x20,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01, 0x00,0x00,0x01,0x04,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00, 0x00,0x01,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00, 0x01,0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x01, 0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x01,0x02, 0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x01,0x08,0x00, 0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x01,0x04,0x00,0x83, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x01,0x02,0x00,0x84,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x01,0x08,0x00,0x85,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x01,0x04,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x01,0x02,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x01,0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x79,0x01,0x00,0x00,0x02,0x20,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7a,0x01,0x00,0x00,0x02,0x20,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7b,0x01,0x00,0x00,0x01,0x04,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x01,0x00,0x00,0x01,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01, 0x00,0x00,0x01,0x08,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00, 0x00,0x01,0x04,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00, 0x01,0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01, 0x08,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x01,0x04, 0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x02,0x00, 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x01,0x08,0x00,0x91, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x04,0x00,0x92,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x01,0x02,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x01,0x08,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x02,0x20,0x00,0x6f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x02,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x89,0x01,0x00,0x00,0x01,0x04,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x8a,0x01,0x00,0x00,0x01,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8b,0x01,0x00,0x00,0x01,0x08,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c, 0x01,0x00,0x00,0x01,0x04,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01, 0x00,0x00,0x01,0x02,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00, 0x00,0x01,0x08,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00, 0x01,0x04,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x01, 0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x01,0x08, 0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x01,0x04,0x00, 0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x01,0x02,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x10,0x00,0xa0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x07,0x01,0x00,0xa1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x07,0x10,0x00,0xa6,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x07,0x10,0x00,0xa7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x07,0x10,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x01,0x00,0x00,0x07,0x10,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9a,0x01,0x00,0x00,0x01,0x04,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0x01,0x00,0x00,0x07,0x04,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c, 0x01,0x00,0x00,0x01,0x04,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01, 0x00,0x00,0x01,0x04,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00, 0x00,0x07,0x04,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00, 0x01,0x04,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x01, 0x04,0x00,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x07,0x04, 0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x01,0x04,0x00, 0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x07,0x04,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x01,0x04,0x00,0xb3,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x01,0x04,0x00,0xb4,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x07,0x04,0x00,0xb5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x01,0x04,0x00,0xb6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x07,0x04,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa9,0x01,0x00,0x00,0x01,0x04,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xaa,0x01,0x00,0x00,0x01,0x04,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x01,0x00,0x00,0x07,0x04,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac, 0x01,0x00,0x00,0x01,0x04,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01, 0x00,0x00,0x07,0x04,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00, 0x00,0x01,0x04,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00, 0x01,0x04,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x07, 0x04,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x07,0x04, 0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x01,0x04,0x00, 0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x01,0x04,0x00,0xc6, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x07,0x04,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x01,0x04,0x00,0xc8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x07,0x04,0x00,0xca,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x01,0x04,0x00,0xcb,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x01,0x04,0x00,0xcc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb9,0x01,0x00,0x00,0x07,0x04,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xba,0x01,0x00,0x00,0x01,0x04,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbb,0x01,0x00,0x00,0x07,0x04,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc, 0x01,0x00,0x00,0x01,0x04,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01, 0x00,0x00,0x01,0x04,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00, 0x00,0x07,0x04,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00, 0x01,0x04,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x07, 0x04,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x01,0x04, 0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x01,0x04,0x00, 0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x07,0x04,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x01,0x04,0x00,0xda,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x07,0x04,0x00,0xdc,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x01,0x04,0x00,0xdd,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x01,0x04,0x00,0xde,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x07,0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc9,0x01,0x00,0x00,0x01,0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xca,0x01,0x00,0x00,0x07,0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcb,0x01,0x00,0x00,0x01,0x04,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc, 0x01,0x00,0x00,0x01,0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01, 0x00,0x00,0x07,0x04,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00, 0x00,0x01,0x04,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00, 0x07,0x04,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x01, 0x04,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x01,0x04, 0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x07,0x04,0x00, 0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x01,0x04,0x00,0xec, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x07,0x04,0x00,0xee,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x01,0x04,0x00,0xef,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x01,0x04,0x00,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x07,0x04,0x00,0xf1,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x01,0x04,0x00,0xf2,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd9,0x01,0x00,0x00,0x07,0x04,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xda,0x01,0x00,0x00,0x01,0x04,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0x01,0x00,0x00,0x01,0x04,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc, 0x01,0x00,0x00,0x07,0x04,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01, 0x00,0x00,0x01,0x04,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00, 0x00,0x07,0x04,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00, 0x01,0x04,0x00,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x01, 0x04,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x07,0x04, 0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x01,0x04,0x00, 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x01,0x00,0x00,0x07,0x04,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x01,0x04,0x00,0x01,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01,0x00,0x00,0x01,0x04,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x07,0x04,0x00,0x03,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x01,0x04,0x00,0x04,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x07,0x04,0x00,0x06,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xe9,0x01,0x00,0x00,0x01,0x04,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0x01,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0x01,0x00,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0xec,0x01,0x00,0x00,0x01,0x00,0x00,0x03,0xed,0x01,0x00, 0x00,0x01,0x00,0x00,0xee,0x01,0x00,0x00,0x01,0x00,0x00,0xef,0x01,0x00,0x00,0x01, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00, 0x02,0x07,0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00, 0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0x31,0x39,0x00,0x00,0x6f, 0x25,0x00,0x00,0x02,0x00,0xf0,0x01,0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x73, 0x64,0x5f,0x30,0x2e,0x61,0x73,0x6d,0xf1,0x01,0x00,0x00,0x01,0x00,0x30,0x00,0x00, 0x29,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x0b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00, 0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00, 0x00,0x00,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x11,0x01,0x00,0x00,0x02,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x12,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff, 0x37,0x00,0x07,0x00,0x10,0x0c,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x15,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x02,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x02,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x1b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x04,0x46,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x1c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x1b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x1d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x1c, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1d,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x06,0x46,0x02,0x00,0x17,0x01,0x00, 0x00,0x01,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x1e,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1f,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x1f,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x02,0x08,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x23,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x03,0x02,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x02,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x25,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x26,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x26,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x27, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x04,0x46,0x02, 0x00,0x17,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x28,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x27,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x29,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x28, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x29,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x00,0x17,0x01,0x00, 0x00,0x02,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x2a,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x2b,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x2b,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x03,0x08,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x2d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2e,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x2f,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x2f,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x04,0x02,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x02,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x30,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x31,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x32,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x32,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x33, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x04,0x46,0x02, 0x00,0x17,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x34,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x33,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x33,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x35,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x34,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x34, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x00,0x09,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x35,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x06,0x46,0x02,0x00,0x17,0x01,0x00, 0x00,0x03,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x36,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x36,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x37,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x37,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x0a,0x00,0x02, 0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x38,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x04,0x08,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x05,0x02,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x02,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x1a,0x01,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3e,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x3f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x05,0x04,0x46,0x02, 0x00,0x17,0x01,0x00,0x00,0x04,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x40,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3f,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x3f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x41,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x40, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00, 0x00,0x0d,0x00,0x02,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x05,0x06,0x46,0x02,0x00,0x17,0x01,0x00, 0x00,0x04,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x42,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x42,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x43,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x0e,0x00,0x02, 0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x05,0x08,0x46,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x00,0x0f,0x00,0x02,0x00,0x47,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x02,0x04,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x49, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x46,0x02, 0x10,0x48,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x49,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x49,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x05,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x08,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x00, 0x02,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x04,0x00,0x00, 0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x4a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x5c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x5c,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x5c,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x04,0x00, 0x02,0x00,0x5c,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x4b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x10,0x48,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x4b,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x4b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x5d,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x01,0x08, 0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x01,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x5d, 0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x4c,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x00,0x06,0x46,0x02,0x10,0x48,0x01, 0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x08,0x4c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x68,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00, 0x5e,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x69,0x00,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x5e,0x00,0x00,0x00, 0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x00,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00, 0x04,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x4d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6b, 0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x4e,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x02,0x46,0x02,0x10,0x48,0x01, 0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x08,0x4e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x5f,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00, 0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x04,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00, 0x06,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x4f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x60,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x6b,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x01,0x06,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x07,0x21,0x01, 0x29,0x04,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x50,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00, 0x0c,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x08, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00, 0x61,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00, 0x00,0x01,0x0c,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x00,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x51,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6c,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x6d,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x02,0x02,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x09,0x21,0x01, 0x29,0x04,0x00,0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x52,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6c,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x08, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x62,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x04,0x46,0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x0a,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x53,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x63,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x08, 0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x06,0x46, 0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x54,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x64,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01, 0x0c,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00, 0x64,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x55,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x00,0x46,0x02,0x10,0x48, 0x01,0x00,0x00,0x00,0x0c,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x55,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x55,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6f,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x02,0x46, 0x02,0x10,0x48,0x01,0x00,0x00,0x00,0x0d,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x56, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x56,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01, 0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6f,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x65,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x57,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x10,0x48, 0x01,0x00,0x00,0x00,0x0e,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x57,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x00,0x66,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x66,0x00,0x00, 0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x10,0x48,0x01,0x00,0x00, 0x00,0x0f,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x08,0x58,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6e, 0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x67,0x00, 0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00, 0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6f,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x08, 0x23,0x01,0x10,0x05,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x59,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x05,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x05,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x05,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05, 0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00, 0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00, 0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x61, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x46,0x02, 0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x64,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x61,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x65,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x64, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x63,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x67,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x68,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x62,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x6b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x6c,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x6c,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x62,0x01,0x00,0x00, 0x00,0x0c,0x46,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x6d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x6f,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x70, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x46,0x02, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x70,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x74,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x74,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x75,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x72,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x75,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x75,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x76,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x76,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x77,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x71,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x72,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x79,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x7a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x71,0x01,0x00,0x00, 0x00,0x0c,0x46,0x02,0x00,0x72,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x7e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x46,0x02, 0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x81,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x82,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x81, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x82,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x80,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x83,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x84,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x01,0x00,0x02, 0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7f,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x88,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00, 0x00,0x0c,0x46,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x8c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x46,0x02, 0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x8f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x8c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x90,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8f, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00, 0x01,0x04,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x90,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x8e,0x01,0x00, 0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x91,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x92,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x05,0x00,0x02, 0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x93,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8d,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x08,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x94, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x95,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x96,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00, 0x00,0x0c,0x46,0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x66,0x01,0x00,0x00,0x01,0x07,0x00,0x02,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x9a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x00,0x00,0x00, 0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x05,0x07,0x00,0x00,0x20,0x41,0x03,0x04,0x00,0x00,0x00,0x9c,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x9b, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x10,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x08,0x04,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x40,0x03, 0x04,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0xa7,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x9e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x40,0x29,0x00,0x00,0x00, 0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3f,0x0c, 0x04,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa4,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x04,0x00,0x00,0x00,0x9f,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x04,0x00, 0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x04,0x00,0x00, 0x00,0x9d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x02,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x01,0x03,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x01,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x12,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x01,0x12,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa0,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa1,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x13,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x11, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x11,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x13,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa3,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xab,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xab,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xad,0x00,0x00,0x00, 0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x05,0x36,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x17,0x01,0x00,0x00,0x00,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17, 0x01,0x00,0x00,0x01,0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xaf,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00, 0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00, 0x01,0x21,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x13, 0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x00,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x17,0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xaf, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb2,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xb2,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00, 0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xb3, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00, 0x00,0x0a,0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01, 0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x07,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x05, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xab,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x16,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x01,0x16,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xac,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x00,0x17,0x01,0x00,0x00, 0x00,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00, 0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x01,0x17, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xad,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb7,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xb7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00, 0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xb7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xae,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07, 0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xb9,0x00, 0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x08,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x09, 0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xb0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x17,0x01,0x00,0x00,0x01,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x02,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00, 0x00,0x00,0x03,0x21,0x01,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x01,0x17,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x00,0x17,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x19,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x01,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00, 0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5, 0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00, 0xbe,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00, 0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29, 0x02,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x02,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x01,0x36,0x02,0x00,0x17,0x01,0x00,0x00, 0x01,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02, 0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x12, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xb6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xb6, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xa2,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01, 0x00,0x00,0x02,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00, 0x00,0x02,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x04,0x21, 0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc1,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa7,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xb8,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x18,0x00,0x02, 0x00,0xc5,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x04,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x02,0x03,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x14,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x05,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x14,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9c,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x13,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbb,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xc9,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x05, 0x21,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f, 0x29,0x02,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00, 0x12,0x00,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x00,0x1a,0x00,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x08, 0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x02,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xbe,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x05,0x36,0x02,0x00,0x17, 0x01,0x00,0x00,0x01,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xbe,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01, 0x00,0x00,0x02,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00, 0x00,0x02,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00, 0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x06,0x21, 0x01,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x17,0x36,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x17,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17, 0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00, 0x06,0x21,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcd,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xd0,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xc2,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0xd1,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x1c, 0x00,0x02,0x00,0xd1,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00, 0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x08,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x02,0x07,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x18,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x09,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x18,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xc4,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x17,0x01,0x00,0x00,0x01,0x19,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x01,0x17, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x17,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x02,0x19,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xd5,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00, 0x00,0x07,0x21,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd5,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00, 0x00,0x00,0x16,0x00,0x02,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x1e,0x00,0x02,0x00,0xd7,0x00,0x00,0x00, 0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x01,0x36,0x02, 0x00,0x17,0x01,0x00,0x00,0x02,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x17,0x01,0x00,0x00,0x03,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17, 0x01,0x00,0x00,0x03,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00, 0x00,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x01, 0x00,0x21,0x01,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x13, 0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xca, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x17,0x01,0x00,0x00,0x03,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xdc,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00, 0x00,0x01,0x00,0x21,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x00,0xdc,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00, 0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xdd, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00, 0x01,0x08,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03, 0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x17,0x01,0x00,0x00,0x03,0x03,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x14, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xcd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x05,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x14,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xce,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03, 0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x15, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xcf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xe1, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00, 0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07, 0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08, 0x01,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x0a,0x00,0x02,0x00,0xe3,0x00, 0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x06,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x05, 0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x17,0x01,0x00,0x00,0x03,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x02,0x00,0x00,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00, 0x00,0x01,0x02,0x21,0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x17,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00, 0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5, 0x00,0x00,0x00,0x01,0x02,0x21,0x01,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x01,0x02,0x21,0x01,0x00, 0xe8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00, 0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x04,0x00,0x02, 0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01, 0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29, 0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00, 0x00,0x03,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x07,0x36,0x02,0x00,0x17,0x01,0x00,0x00, 0x02,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03, 0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x03,0x18, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xd8,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xd8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x02,0x19,0x36,0x02,0x00,0x17,0x01, 0x00,0x00,0x02,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00, 0x00,0x03,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00, 0x03,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xed, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x03,0x21,0x01, 0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xeb,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa7,0x00,0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xda, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x08,0x01,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x0e,0x00,0x02,0x00, 0xef,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xf3,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x02,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00, 0x04,0x01,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x12,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x03,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00, 0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x02,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c, 0x01,0x00,0x00,0x01,0x04,0x21,0x01,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01, 0x00,0x00,0x03,0x13,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x11,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x11,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x13,0x36,0x02,0x29,0x02,0x00, 0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xa5,0x00,0x00,0x00,0x01,0x04,0x21,0x01,0x00,0xf3,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x01,0x04,0x21, 0x01,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf3,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29, 0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x10, 0x00,0x02,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00, 0x08,0x01,0x00,0x00,0x01,0x18,0x00,0x02,0x00,0xf5,0x00,0x00,0x00,0x00,0x08,0x24, 0x01,0x29,0x02,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17, 0x01,0x00,0x00,0x04,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x03,0x36,0x02,0x00,0x17,0x01, 0x00,0x00,0x03,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00, 0x00,0x04,0x05,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00, 0x04,0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xe2, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x01,0x05,0x21,0x01, 0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x00, 0x17,0x01,0x00,0x00,0x03,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17, 0x01,0x00,0x00,0x04,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe3,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01, 0x00,0x00,0x04,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x05, 0x21,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf7,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa7,0x00,0x00,0x00,0x01,0x05,0x21,0x01,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xe5,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x12,0x00,0x02,0x00,0xfb,0x00,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x1a,0x00, 0x02,0x00,0xfb,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x06,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01, 0x00,0x00,0x04,0x05,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x16,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x07,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x16,0x36,0x02,0x29,0x02,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x9c,0x01,0x00,0x00,0x01,0x06,0x21,0x01,0x00,0xe7,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x17,0x01,0x00,0x00,0x03,0x17,0x36,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x15,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x15,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x04,0x17,0x36,0x02,0x29, 0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x01,0x06,0x21,0x01,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x01, 0x06,0x21,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xff,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00, 0x3f,0x29,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe9, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00, 0x01,0x14,0x00,0x02,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00, 0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x1c,0x00,0x02,0x00,0x01,0x01,0x00,0x00,0x00, 0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x17,0x01,0x00,0x00,0x04,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xeb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x04,0x07,0x36,0x02,0x00, 0x17,0x01,0x00,0x00,0x03,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xeb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17, 0x01,0x00,0x00,0x04,0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xeb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01, 0x00,0x00,0x04,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00, 0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x01,0x07, 0x21,0x01,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x19,0x36, 0x02,0x00,0x17,0x01,0x00,0x00,0x03,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xed, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x17,0x01,0x00,0x00,0x04,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xed,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x17,0x01,0x00,0x00,0x04,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5,0x00,0x00,0x00, 0x01,0x07,0x21,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa7,0x00,0x00,0x00,0x01,0x07,0x21,0x01,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xef, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01,0x16,0x00,0x02,0x00,0x07,0x01, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x01, 0x1e,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x08,0x24,0x01,0x38,0x00,0x08,0x00, 0x08,0x08,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xf1,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x08,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01, 0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00, 0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02, 0x02,0x62,0x05,0x02,0xf1,0xff,0x40,0x02,0x00,0x00,0x60,0x01,0x05,0x03,0x64,0x01, 0x00,0x01,0x84,0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x01,0x05,0x04,0x64,0x01, 0x00,0x01,0x04,0x02,0x00,0x00,0x61,0x00,0x07,0xa2,0x38,0x00,0x01,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x69,0x04, 0x05,0x68,0x02,0x03,0x31,0x00,0x69,0x04,0x06,0x68,0x02,0x04,0x31,0x00,0x31,0xc0, 0x04,0x80,0x00,0x00,0x05,0x08,0x04,0x07,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00, 0x0d,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01, 0x00,0x02,0x00,0x00,0x69,0x02,0x40,0x04,0x0d,0x68,0x02,0x05,0xe1,0xff,0x40,0x04, 0x0d,0x68,0x62,0x06,0xe1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x0d,0x00,0x00, 0x00,0x00,0x0f,0x00,0x0b,0x00,0x61,0x00,0x04,0x00,0xa0,0x4a,0x01,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x3f,0x31,0xa1,0x03,0x80,0x00,0x00,0x05,0x0e,0x04,0x0d, 0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x61,0x31, 0x00,0x80,0xa0,0x4a,0x45,0x0d,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x61,0x00, 0x0d,0x62,0x00,0x05,0x01,0x00,0x61,0x00,0x0d,0x62,0x60,0x06,0x01,0x00,0x40,0x00, 0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00,0x80,0x0a,0x02,0x61,0x20, 0x00,0x00,0xa0,0x05,0x05,0x0c,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x21, 0x03,0x00,0x50,0x00,0x05,0x14,0x15,0x0f,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x19,0x25,0x0f,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x1d,0x35,0x0f,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x21,0x45,0x0f,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x25,0x15,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x29,0x25,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x2d,0x35,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x31,0x45,0x10,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x35,0x15,0x11,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x39,0x25,0x11,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x3d,0x35,0x11,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x41,0x45,0x11,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x45,0x15,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x49,0x25,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x4d,0x35,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x03,0x00,0x50,0x00,0x05,0x51,0x45,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x15,0x15,0x10,0x54,0x05,0x05,0x14,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x1a,0x25,0x10,0x54,0x05,0x05,0x19,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x1e,0x35,0x10,0x54,0x05,0x05,0x1d,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x22,0x45,0x10,0x54,0x05,0x05,0x21,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x26,0x15,0x11,0x54,0x05,0x05,0x25,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x2a,0x25,0x11,0x54,0x05,0x05,0x29,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x2e,0x35,0x11,0x54,0x05,0x05,0x2d,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x32,0x45,0x11,0x54,0x05,0x05,0x31,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x36,0x15,0x12,0x54,0x05,0x05,0x35,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x3a,0x25,0x12,0x54,0x05,0x05,0x39,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x3e,0x35,0x12,0x54,0x05,0x05,0x3d,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x42,0x45,0x12,0x54,0x05,0x05,0x41,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x46,0x15,0x13,0x54,0x05,0x05,0x45,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x4a,0x25,0x13,0x54,0x05,0x05,0x49,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x4e,0x35,0x13,0x54,0x05,0x05,0x4d,0x46,0x00,0x40,0x00, 0x03,0x00,0x50,0x00,0x05,0x52,0x45,0x13,0x54,0x05,0x05,0x51,0x46,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x16,0x45,0x15,0x34,0x05,0x05,0x15,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x1b,0x45,0x1a,0x34,0x05,0x05,0x1a,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x1f,0x45,0x1e,0x34,0x05,0x05,0x1e,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x23,0x45,0x22,0x34,0x05,0x05,0x22,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x27,0x45,0x26,0x34,0x05,0x05,0x26,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x2b,0x45,0x2a,0x34,0x05,0x05,0x2a,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x2f,0x45,0x2e,0x34,0x05,0x05,0x2e,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x33,0x45,0x32,0x34,0x05,0x05,0x32,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x37,0x45,0x36,0x34,0x05,0x05,0x36,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x3b,0x45,0x3a,0x34,0x05,0x05,0x3a,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x3f,0x45,0x3e,0x34,0x05,0x05,0x3e,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x43,0x45,0x42,0x34,0x05,0x05,0x42,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x47,0x45,0x46,0x34,0x05,0x05,0x46,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x4b,0x45,0x4a,0x34,0x05,0x05,0x4a,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x4f,0x45,0x4e,0x34,0x05,0x05,0x4e,0x34,0x00,0x40,0x00, 0x02,0x00,0x50,0x05,0x05,0x53,0x45,0x52,0x34,0x05,0x05,0x52,0x34,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x17,0x25,0x16,0x22,0x05,0x05,0x16,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x1c,0x25,0x1b,0x22,0x05,0x05,0x1b,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x20,0x25,0x1f,0x22,0x05,0x05,0x1f,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x24,0x25,0x23,0x22,0x05,0x05,0x23,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x28,0x25,0x27,0x22,0x05,0x05,0x27,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x2c,0x25,0x2b,0x22,0x05,0x05,0x2b,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x30,0x25,0x2f,0x22,0x05,0x05,0x2f,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x34,0x25,0x33,0x22,0x05,0x05,0x33,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x38,0x25,0x37,0x22,0x05,0x05,0x37,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x3c,0x25,0x3b,0x22,0x05,0x05,0x3b,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x40,0x25,0x3f,0x22,0x05,0x05,0x3f,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x44,0x25,0x43,0x22,0x05,0x05,0x43,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x48,0x25,0x47,0x22,0x05,0x05,0x47,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x4c,0x25,0x4b,0x22,0x05,0x05,0x4b,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x50,0x25,0x4f,0x22,0x05,0x05,0x4f,0x22,0x00,0x40,0x00, 0x01,0x00,0x50,0x05,0x05,0x54,0x25,0x53,0x22,0x05,0x05,0x53,0x22,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x05,0x18,0x04,0x17,0x00,0x05,0x14,0x17,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x15,0x18,0x04,0x1c,0x00,0x05,0x14,0x1c,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x25,0x18,0x04,0x20,0x00,0x05,0x14,0x20,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x35,0x18,0x04,0x24,0x00,0x05,0x14,0x24,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x45,0x18,0x04,0x28,0x00,0x05,0x14,0x28,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x55,0x18,0x04,0x2c,0x00,0x05,0x14,0x2c,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x65,0x18,0x04,0x30,0x00,0x05,0x14,0x30,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x75,0x18,0x04,0x34,0x00,0x05,0x14,0x34,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x85,0x18,0x04,0x38,0x00,0x05,0x14,0x38,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0x95,0x18,0x04,0x3c,0x00,0x05,0x14,0x3c,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xa5,0x18,0x04,0x40,0x00,0x05,0x14,0x40,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xb5,0x18,0x04,0x44,0x00,0x05,0x14,0x44,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xc5,0x18,0x04,0x48,0x00,0x05,0x14,0x48,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xd5,0x18,0x04,0x4c,0x00,0x05,0x14,0x4c,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xe5,0x18,0x04,0x50,0x00,0x05,0x14,0x50,0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x05,0xf5,0x18,0x04,0x54,0x00,0x05,0x14,0x54,0x00,0x00,0x38,0x42, 0x00,0x00,0xa0,0x4a,0x05,0x3d,0x00,0x00,0x00,0x10,0x00,0x00,0x20,0x41,0x68,0x01, 0x04,0x00,0x10,0x81,0x05,0x18,0x05,0x18,0x58,0x01,0x04,0x00,0x04,0x00,0x41,0x22, 0x0c,0x28,0x00,0x0c,0x11,0x3d,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x55,0x05,0x0e, 0x54,0x01,0x04,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5f,0x05,0x0f, 0x54,0x01,0x44,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x69,0x05,0x10, 0x54,0x01,0x84,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x73,0x05,0x11, 0x54,0x01,0xc4,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x59,0x15,0x0e, 0x54,0x01,0x14,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5b,0x25,0x0e, 0x54,0x01,0x24,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5d,0x35,0x0e, 0x54,0x01,0x34,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x63,0x15,0x0f, 0x54,0x01,0x54,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x65,0x25,0x0f, 0x54,0x01,0x64,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x67,0x35,0x0f, 0x54,0x01,0x74,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x6d,0x15,0x10, 0x54,0x01,0x94,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x6f,0x25,0x10, 0x54,0x01,0xa4,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x71,0x35,0x10, 0x54,0x01,0xb4,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x77,0x15,0x11, 0x54,0x01,0xd4,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x79,0x25,0x11, 0x54,0x01,0xe4,0x18,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x7b,0x35,0x11, 0x54,0x01,0xf4,0x18,0x00,0x02,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x55,0x05,0x55, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5f,0x05,0x5f, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x69,0x05,0x69, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x73,0x05,0x73, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x59,0x05,0x59, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5b,0x05,0x5b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5d,0x05,0x5d, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x63,0x05,0x63, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x65,0x05,0x65, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x67,0x05,0x67, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x6d,0x05,0x6d, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x6f,0x05,0x6f, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x71,0x05,0x71, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x77,0x05,0x77, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x79,0x05,0x79, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x7b,0x05,0x7b, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x57,0x05,0x55, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x61,0x05,0x5f, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x6b,0x05,0x69, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x75,0x05,0x73, 0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x57,0x04,0x55, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x02,0x00,0x90,0x09,0x05,0x58,0x84,0x57, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x57,0x04,0x59, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x58,0x84,0x59, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x58,0x84,0x5b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x55,0x04,0x5c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x58,0x84,0x5d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x55,0x04,0x5e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x61,0x04,0x5f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x62,0x84,0x61, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x61,0x04,0x63, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x62,0x84,0x63, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x62,0x84,0x65, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x5f,0x04,0x66, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x62,0x84,0x67, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x5f,0x04,0x68, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6b,0x04,0x69, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6c,0x84,0x6b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6b,0x04,0x6d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6c,0x84,0x6d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6c,0x84,0x6f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x69,0x04,0x70, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6c,0x84,0x71, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x69,0x04,0x72, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x75,0x04,0x73, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x76,0x84,0x75, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x75,0x04,0x77, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x76,0x84,0x77, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x76,0x84,0x79, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x73,0x04,0x7a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x76,0x84,0x7b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x73,0x04,0x7c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x55,0x04,0x56, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x55,0x04,0x5a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x57,0x04,0x5b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x57,0x04,0x5d, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x5f,0x04,0x60, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x5f,0x04,0x64, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x61,0x04,0x65, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x61,0x04,0x67, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x69,0x04,0x6a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x69,0x04,0x6e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6b,0x04,0x6f, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6b,0x04,0x71, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x73,0x04,0x74, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x73,0x04,0x78, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x75,0x04,0x79, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x75,0x04,0x7b, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x56,0x84,0x56, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x56,0x84,0x5a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x60,0x84,0x60, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x60,0x84,0x64, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6a,0x84,0x6a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6a,0x84,0x6e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x74,0x84,0x74, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x74,0x84,0x78, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x56,0x84,0x5c, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x56,0x84,0x5e, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x60,0x84,0x66, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x60,0x84,0x68, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6a,0x84,0x70, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6a,0x84,0x72, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x74,0x84,0x7a, 0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x74,0x84,0x7c, 0x20,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x57,0x05,0x57, 0x46,0x05,0x05,0x57,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x61,0x05,0x61, 0x46,0x05,0x05,0x61,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x6b,0x05,0x6b, 0x46,0x05,0x05,0x6b,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x75,0x05,0x75, 0x46,0x05,0x05,0x75,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x55,0x05,0x55, 0x46,0x05,0x05,0x55,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x5f,0x05,0x5f, 0x46,0x05,0x05,0x5f,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x69,0x05,0x69, 0x46,0x05,0x05,0x69,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x73,0x05,0x73, 0x46,0x05,0x05,0x73,0x46,0x00,0x40,0x04,0x03,0x00,0x60,0x01,0x05,0x7d,0x05,0x55, 0x54,0x01,0x05,0x57,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x07,0x45,0x55, 0x54,0x01,0x45,0x57,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x0a,0x85,0x55, 0x54,0x01,0x85,0x57,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x14,0xc5,0x55, 0x54,0x01,0xc5,0x57,0x54,0x00,0x40,0x07,0x03,0x00,0x60,0x01,0x05,0x17,0x05,0x5f, 0x54,0x01,0x05,0x61,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1a,0x45,0x5f, 0x54,0x01,0x45,0x61,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1d,0x85,0x5f, 0x54,0x01,0x85,0x61,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x20,0xc5,0x5f, 0x54,0x01,0xc5,0x61,0x54,0x00,0x40,0x07,0x03,0x00,0x60,0x01,0x05,0x23,0x05,0x69, 0x54,0x01,0x05,0x6b,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x26,0x45,0x69, 0x54,0x01,0x45,0x6b,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x29,0x85,0x69, 0x54,0x01,0x85,0x6b,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x2c,0xc5,0x69, 0x54,0x01,0xc5,0x6b,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x2f,0x05,0x73, 0x54,0x01,0x05,0x75,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x32,0x45,0x73, 0x54,0x01,0x45,0x75,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x35,0x85,0x73, 0x54,0x01,0x85,0x75,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x38,0xc5,0x73, 0x54,0x01,0xc5,0x75,0x54,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x65,0x01,0x85,0x7d, 0x34,0x06,0x05,0x7d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x08,0x85,0x07, 0x34,0x06,0x05,0x07,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x0b,0x85,0x0a, 0x34,0x06,0x05,0x0a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x15,0x85,0x14, 0x34,0x06,0x05,0x14,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x18,0x85,0x17, 0x34,0x06,0x05,0x17,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1b,0x85,0x1a, 0x34,0x06,0x05,0x1a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1e,0x85,0x1d, 0x34,0x06,0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x21,0x85,0x20, 0x34,0x06,0x05,0x20,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x24,0x85,0x23, 0x34,0x06,0x05,0x23,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x27,0x85,0x26, 0x34,0x06,0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x2a,0x85,0x29, 0x34,0x06,0x05,0x29,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x2d,0x85,0x2c, 0x34,0x06,0x05,0x2c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x30,0x85,0x2f, 0x34,0x06,0x05,0x2f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x33,0x85,0x32, 0x34,0x06,0x05,0x32,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x36,0x85,0x35, 0x34,0x06,0x05,0x35,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x39,0x85,0x38, 0x34,0x06,0x05,0x38,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x02,0xa5,0x01, 0x22,0x06,0x65,0x01,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x09,0x45,0x08, 0x22,0x06,0x05,0x08,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x25,0x0c,0x45,0x0b, 0x22,0x06,0x05,0x0b,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x16,0x45,0x15, 0x22,0x06,0x05,0x15,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x19,0x45,0x18, 0x22,0x06,0x05,0x18,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x1c,0x45,0x1b, 0x22,0x06,0x05,0x1b,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x1f,0x45,0x1e, 0x22,0x06,0x05,0x1e,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x22,0x45,0x21, 0x22,0x06,0x05,0x21,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x25,0x45,0x24, 0x22,0x06,0x05,0x24,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x28,0x45,0x27, 0x22,0x06,0x05,0x27,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2b,0x45,0x2a, 0x22,0x06,0x05,0x2a,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2e,0x45,0x2d, 0x22,0x06,0x05,0x2d,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x31,0x45,0x30, 0x22,0x06,0x05,0x30,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x34,0x45,0x33, 0x22,0x06,0x05,0x33,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x37,0x45,0x36, 0x22,0x06,0x05,0x36,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x3a,0x45,0x39, 0x22,0x06,0x05,0x39,0x22,0x00,0x40,0x00,0x03,0xa8,0x12,0x02,0x11,0x02,0x40,0x00, 0x00,0x00,0x60,0x06,0x25,0x03,0x04,0x09,0x00,0x06,0x24,0x09,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x45,0x03,0x24,0x0c,0x00,0x06,0x44,0x0c,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x65,0x03,0x04,0x16,0x00,0x06,0x24,0x16,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0x85,0x03,0x04,0x19,0x00,0x06,0x24,0x19,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xa5,0x03,0x04,0x1c,0x00,0x06,0x24,0x1c,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xc5,0x03,0x04,0x1f,0x00,0x06,0x24,0x1f,0x00,0x00,0x40,0x00, 0x00,0x00,0x60,0x06,0xe5,0x03,0x04,0x22,0x00,0x06,0x24,0x22,0x00,0x00,0x40,0x00, 0x04,0xa8,0x12,0x25,0x11,0x25,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x04,0x04,0x28, 0x00,0x06,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x04,0x04,0x2b, 0x00,0x06,0x24,0x2b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x04,0x04,0x2e, 0x00,0x06,0x24,0x2e,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x04,0x04,0x31, 0x00,0x06,0x24,0x31,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x04,0x04,0x34, 0x00,0x06,0x24,0x34,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x04,0x04,0x37, 0x00,0x06,0x24,0x37,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x04,0x04,0x3a, 0x00,0x06,0x24,0x3a,0x00,0x00,0x38,0x43,0x04,0x00,0xa0,0x0a,0x05,0x3e,0x04,0x0c, 0x00,0x10,0x00,0x00,0x00,0x00,0x68,0x01,0x04,0x00,0x20,0x82,0x05,0x03,0x05,0x03, 0x46,0x01,0x04,0x00,0x04,0x00,0x38,0x44,0x04,0x00,0xa0,0x0a,0x05,0x42,0x04,0x0c, 0x00,0x10,0x00,0x00,0x00,0x00,0x61,0x01,0x3b,0x60,0x06,0x03,0x00,0x00,0x41,0x93, 0x40,0x20,0x00,0x3b,0x00,0x3e,0x41,0x00,0x3b,0xe0,0x00,0x3b,0x00,0x40,0x38,0xa5, 0x04,0x00,0xa0,0x2a,0x05,0x40,0x05,0x40,0x46,0x30,0x00,0x00,0x00,0x00,0x41,0x94, 0x3b,0x20,0x00,0x3b,0x00,0x42,0x61,0x00,0x46,0xa8,0x00,0x00,0x81,0x40,0x38,0xa6, 0x04,0x00,0xa0,0x2a,0x05,0x3b,0x05,0x3b,0x46,0x30,0x00,0x00,0x00,0x00,0x01,0x26, 0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x25,0x44,0x20,0x00,0x40,0x00,0x3b,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x4e,0x0d,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x48,0x02, 0x44,0x20,0x00,0x44,0x10,0x46,0x40,0x02,0x02,0x00,0x60,0x00,0x05,0x4f,0x1d,0x0f, 0x52,0x05,0x05,0x4e,0x34,0x00,0x38,0xa7,0x04,0x00,0xa0,0x0a,0x05,0x49,0x05,0x44, 0x46,0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x59,0x1d,0x0f, 0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x02,0x00,0x60,0x00,0x05,0x4f,0x95,0x0e, 0x52,0x06,0x05,0x4f,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x51,0x8d,0x0f, 0x52,0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x04,0x00,0xa0,0x0a,0x05,0x47,0x05,0x44, 0x46,0x10,0x00,0x00,0x00,0x00,0x40,0x03,0x02,0x00,0x60,0x00,0x05,0x5a,0x2d,0x0f, 0x52,0x05,0x05,0x59,0x34,0x00,0x40,0x03,0x02,0x00,0x60,0x00,0x05,0x4f,0x95,0x0f, 0x52,0x06,0x05,0x4f,0x34,0x00,0x41,0x27,0x40,0x20,0x00,0x40,0x00,0x49,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x5c,0x9d,0x0e,0x52,0x00,0x00,0x00,0x00,0x00,0x38,0x49, 0x04,0x00,0xa0,0x0a,0x05,0x4b,0x05,0x44,0x46,0x10,0x00,0x00,0x00,0x00,0x40,0x05, 0x02,0x00,0x60,0x00,0x05,0x52,0x9d,0x0f,0x52,0x05,0x05,0x51,0x34,0x00,0x40,0x05, 0x02,0x00,0x60,0x00,0x05,0x5a,0xa5,0x0e,0x52,0x06,0x05,0x5a,0x34,0x00,0x61,0x05, 0x02,0x00,0xa0,0x06,0x05,0x50,0x05,0x4f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x00,0x05,0x4d,0x15,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x77,0xa5,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x71,0x95,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x61,0x2d,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x69,0x3d,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x0a,0xc5,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x29,0xb5,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x21,0xa5,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x39,0x95,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x02,0xb5,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x19,0x95,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x31,0xc5,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x59,0xc5,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5d,0x9d,0x0f,0x52,0x05,0x05,0x5c,0x34,0x00,0x61,0x39, 0x02,0x00,0x50,0x00,0x05,0x45,0xa5,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x53,0x8d,0x0e,0x52,0x06,0x05,0x52,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5a,0xa5,0x0f,0x52,0x06,0x05,0x5a,0x34,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x4f,0xb5,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x50,0x04,0x40,0x00,0x0a,0x05,0x50,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x52,0x8d,0x10,0x52,0x06,0x05,0x52,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x78,0x1d,0x10,0x52,0x05,0x05,0x77,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x72,0x0d,0x10,0x52,0x05,0x05,0x71,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x62,0x3d,0x0f,0x52,0x05,0x05,0x61,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x6a,0x4d,0x0f,0x52,0x05,0x05,0x69,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x0b,0x3d,0x10,0x52,0x05,0x05,0x0a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x2a,0x2d,0x11,0x52,0x05,0x05,0x29,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x22,0x1d,0x11,0x52,0x05,0x05,0x21,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x3a,0x0d,0x12,0x52,0x05,0x05,0x39,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x03,0x2d,0x10,0x52,0x05,0x05,0x02,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x1a,0x0d,0x11,0x52,0x05,0x05,0x19,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x32,0x3d,0x11,0x52,0x05,0x05,0x31,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5d,0xad,0x0e,0x52,0x06,0x05,0x5d,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x46,0x1d,0x12,0x52,0x05,0x05,0x45,0x34,0x00,0x61,0x00, 0x02,0x00,0xa0,0x06,0x05,0x5b,0x05,0x5a,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x28, 0x02,0x00,0xa0,0x0a,0x04,0x4d,0x05,0x50,0x02,0x0a,0x05,0x4d,0x04,0x47,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x52,0x9d,0x10,0x52,0x06,0x05,0x52,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5a,0x3d,0x12,0x52,0x05,0x05,0x59,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x50,0x2d,0x12,0x52,0x05,0x05,0x4f,0x34,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x45,0x05,0xad,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x7a,0x9d,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x64,0xad,0x0e,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0xa0,0x00,0x05,0x58,0x25,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x6c,0xbd,0x0e,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x14,0xbd,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x2c,0xad,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x24,0x9d,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x1c,0x8d,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x34,0xbd,0x10,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x3e,0x8d,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x4a,0x9d,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x5c,0xbd,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x53,0x9d,0x0e,0x52,0x06,0x05,0x53,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x78,0x2d,0x10,0x52,0x06,0x05,0x78,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x72,0x1d,0x10,0x52,0x06,0x05,0x72,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x62,0xb5,0x0e,0x52,0x06,0x05,0x62,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x6a,0xc5,0x0e,0x52,0x06,0x05,0x6a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x0b,0x4d,0x10,0x52,0x06,0x05,0x0b,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x2a,0x3d,0x11,0x52,0x06,0x05,0x2a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x22,0x2d,0x11,0x52,0x06,0x05,0x22,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x3a,0x1d,0x12,0x52,0x06,0x05,0x3a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x03,0x3d,0x10,0x52,0x06,0x05,0x03,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x1a,0x1d,0x11,0x52,0x06,0x05,0x1a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x32,0x4d,0x11,0x52,0x06,0x05,0x32,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5d,0xad,0x0f,0x52,0x06,0x05,0x5d,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x46,0x2d,0x12,0x52,0x06,0x05,0x46,0x34,0x00,0x41,0x00, 0x02,0x00,0xa0,0x0a,0x05,0x5b,0x24,0x40,0x00,0x0a,0x05,0x5b,0x34,0x00,0x61,0x00, 0x02,0x00,0xa0,0x06,0x05,0x74,0x05,0x52,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x5a,0x4d,0x12,0x52,0x06,0x05,0x5a,0x34,0x00,0x40,0x00, 0x02,0x00,0x60,0x00,0x05,0x50,0x3d,0x12,0x52,0x06,0x05,0x50,0x34,0x00,0x61,0x00, 0x02,0x00,0x50,0x00,0x05,0x52,0xad,0x11,0x52,0x00,0x00,0x00,0x00,0x00,0x41,0x29, 0x3b,0x20,0x00,0x3b,0x00,0x4b,0x40,0x00,0x02,0x00,0x60,0x00,0x25,0x06,0xbd,0x0f, 0x52,0x05,0x45,0x05,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x7b,0xad,0x0f, 0x52,0x05,0x05,0x7a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x65,0xad,0x0f, 0x52,0x05,0x05,0x64,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6d,0xbd,0x0f, 0x52,0x05,0x05,0x6c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x15,0xcd,0x0f, 0x52,0x05,0x05,0x14,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2d,0xbd,0x10, 0x52,0x05,0x05,0x2c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x25,0xad,0x10, 0x52,0x05,0x05,0x24,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1d,0x9d,0x10, 0x52,0x05,0x05,0x1c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x35,0xcd,0x10, 0x52,0x05,0x05,0x34,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3f,0x9d,0x11, 0x52,0x05,0x05,0x3e,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x54,0x05,0x53, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x78,0xa5,0x10, 0x52,0x06,0x05,0x78,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x72,0x95,0x10, 0x52,0x06,0x05,0x72,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x62,0xb5,0x0f, 0x52,0x06,0x05,0x62,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6a,0xc5,0x0f, 0x52,0x06,0x05,0x6a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0b,0xc5,0x10, 0x52,0x06,0x05,0x0b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2a,0xb5,0x11, 0x52,0x06,0x05,0x2a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x22,0xa5,0x11, 0x52,0x06,0x05,0x22,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3a,0x95,0x12, 0x52,0x06,0x05,0x3a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x03,0xb5,0x10, 0x52,0x06,0x05,0x03,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1a,0x95,0x11, 0x52,0x06,0x05,0x1a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x32,0xc5,0x11, 0x52,0x06,0x05,0x32,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x5e,0x05,0x5d, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x46,0xa5,0x12, 0x52,0x06,0x05,0x46,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x58,0x05,0x5b, 0x02,0x0a,0x05,0x58,0x24,0x47,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5a,0xc5,0x12, 0x52,0x06,0x05,0x5a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x50,0xb5,0x12, 0x52,0x06,0x05,0x50,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x4b,0xad,0x11, 0x52,0x05,0x05,0x4a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0xbd,0x11, 0x52,0x05,0x05,0x52,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5d,0xcd,0x11, 0x52,0x05,0x05,0x5c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x25,0x06,0xad,0x10, 0x52,0x06,0x25,0x06,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x7b,0x9d,0x10, 0x52,0x06,0x05,0x7b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x65,0xbd,0x0e, 0x52,0x06,0x05,0x65,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6d,0xcd,0x0e, 0x52,0x06,0x05,0x6d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x15,0xbd,0x10, 0x52,0x06,0x05,0x15,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2d,0xad,0x11, 0x52,0x06,0x05,0x2d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x25,0x9d,0x11, 0x52,0x06,0x05,0x25,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1d,0x8d,0x11, 0x52,0x06,0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x35,0xbd,0x11, 0x52,0x06,0x05,0x35,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3f,0x8d,0x12, 0x52,0x06,0x05,0x3f,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x54,0x05,0x4d, 0x02,0x0a,0x05,0x54,0x04,0x3b,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x79,0x05,0x78, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x73,0x05,0x72, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x63,0x05,0x62, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x6b,0x05,0x6a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x0c,0x05,0x0b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x2b,0x05,0x2a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x23,0x05,0x22, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x3d,0x05,0x3a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x04,0x05,0x03, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x1b,0x05,0x1a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x33,0x05,0x32, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x49,0x05,0x46, 0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x5e,0x05,0x58, 0x02,0x0a,0x05,0x5e,0x24,0x3b,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x5b,0x05,0x5a, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x51,0x05,0x50, 0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x4b,0x9d,0x12, 0x52,0x06,0x05,0x4b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0xad,0x12, 0x52,0x06,0x05,0x53,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5d,0xbd,0x12, 0x52,0x06,0x05,0x5d,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x68,0x45,0x0f, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x70,0x15,0x10, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x60,0x35,0x0f, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x76,0x25,0x10, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x20,0x25,0x11, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x38,0x15,0x12, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x85,0x01,0x35,0x10, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x18,0x15,0x11, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x30,0x45,0x11, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x09,0x45,0x10, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x28,0x35,0x11, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x4e,0x35,0x12, 0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x44,0x25,0x12, 0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x25,0x06,0xbd,0x10, 0x52,0x06,0x25,0x06,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x7b,0xad,0x10, 0x52,0x06,0x05,0x7b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x65,0xbd,0x0f, 0x52,0x06,0x05,0x65,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6d,0xcd,0x0f, 0x52,0x06,0x05,0x6d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x15,0xcd,0x10, 0x52,0x06,0x05,0x15,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2d,0xbd,0x11, 0x52,0x06,0x05,0x2d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x25,0xad,0x11, 0x52,0x06,0x05,0x25,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1d,0x9d,0x11, 0x52,0x06,0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x35,0xcd,0x11, 0x52,0x06,0x05,0x35,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3f,0x9d,0x12, 0x52,0x06,0x05,0x3f,0x34,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x54,0x05,0x54, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x79,0xa4,0x40, 0x00,0x0a,0x05,0x79,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x73,0x84,0x40, 0x00,0x0a,0x05,0x73,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x63,0x44,0x40, 0x00,0x0a,0x05,0x63,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x6b,0x64,0x40, 0x00,0x0a,0x05,0x6b,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0c,0xe4,0x40, 0x00,0x0a,0x05,0x0c,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2b,0x44,0x41, 0x00,0x0a,0x05,0x2b,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x23,0x24,0x41, 0x00,0x0a,0x05,0x23,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x3d,0x84,0x41, 0x00,0x0a,0x05,0x3d,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x04,0xc4,0x40, 0x00,0x0a,0x05,0x04,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1b,0x04,0x41, 0x00,0x0a,0x05,0x1b,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x33,0x64,0x41, 0x00,0x0a,0x05,0x33,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x49,0xa4,0x41, 0x00,0x0a,0x05,0x49,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x58,0x45,0x12, 0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x5e,0x05,0x5e, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x5b,0xe4,0x41, 0x00,0x0a,0x05,0x5b,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x51,0xc4,0x41, 0x00,0x0a,0x05,0x51,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x4b,0xad,0x12, 0x52,0x06,0x05,0x4b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0xbd,0x12, 0x52,0x06,0x05,0x53,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5d,0xcd,0x12, 0x52,0x06,0x05,0x5d,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x07,0x25,0x06, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x7c,0x05,0x7b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x66,0x05,0x65, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x6e,0x05,0x6d, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x16,0x05,0x15, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x2e,0x05,0x2d, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x26,0x05,0x25, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x1e,0x05,0x1d, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x36,0x05,0x35, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x42,0x05,0x3f, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x55,0x05,0x54, 0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x76,0x05,0x79, 0x02,0x0a,0x05,0x76,0xa4,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x70,0x05,0x73, 0x02,0x0a,0x05,0x70,0x84,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x60,0x05,0x63, 0x02,0x0a,0x05,0x60,0x44,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x68,0x05,0x6b, 0x02,0x0a,0x05,0x68,0x64,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x09,0x05,0x0c, 0x02,0x0a,0x05,0x09,0xe4,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x28,0x05,0x2b, 0x02,0x0a,0x05,0x28,0x44,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x20,0x05,0x23, 0x02,0x0a,0x05,0x20,0x24,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x38,0x05,0x3d, 0x02,0x0a,0x05,0x38,0x84,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x84,0x01,0x05,0x04, 0x02,0x0a,0x85,0x01,0xc4,0x47,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x18,0x05,0x1b, 0x02,0x0a,0x05,0x18,0x04,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x30,0x05,0x33, 0x02,0x0a,0x05,0x30,0x64,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x44,0x05,0x49, 0x02,0x0a,0x05,0x44,0xa4,0x48,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x5f,0x05,0x5e, 0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x58,0x05,0x5b, 0x02,0x0a,0x05,0x58,0xe4,0x48,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x4e,0x05,0x51, 0x02,0x0a,0x05,0x4e,0xc4,0x48,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x4c,0x05,0x4b, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x54,0x05,0x53, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x5e,0x05,0x5d, 0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x7c,0x05,0x76, 0x02,0x0a,0x05,0x7c,0xa4,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x74,0x05,0x70, 0x02,0x0a,0x05,0x74,0x84,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x66,0x05,0x60, 0x02,0x0a,0x05,0x66,0x44,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x6e,0x05,0x68, 0x02,0x0a,0x05,0x6e,0x64,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x16,0x05,0x09, 0x02,0x0a,0x05,0x16,0xe4,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x2e,0x05,0x28, 0x02,0x0a,0x05,0x2e,0x44,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x26,0x05,0x20, 0x02,0x0a,0x05,0x26,0x24,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x42,0x05,0x38, 0x02,0x0a,0x05,0x42,0x84,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x07,0x85,0x01, 0x02,0x0a,0x05,0x07,0xc4,0x3b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x1e,0x05,0x18, 0x02,0x0a,0x05,0x1e,0x04,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x36,0x05,0x30, 0x02,0x0a,0x05,0x36,0x64,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x4c,0x05,0x44, 0x02,0x0a,0x05,0x4c,0xa4,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x54,0x05,0x4e, 0x02,0x0a,0x05,0x54,0xc4,0x3c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x5e,0x05,0x58, 0x02,0x0a,0x05,0x5e,0xe4,0x3c,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x7c,0x05,0x7c, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x74,0x05,0x74, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x66,0x05,0x66, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x6e,0x05,0x6e, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x16,0x05,0x16, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x2e,0x05,0x2e, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x26,0x05,0x26, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x42,0x05,0x42, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x07,0x05,0x07, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x1e,0x05,0x1e, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x36,0x05,0x36, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x4c,0x05,0x4c, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x54,0x05,0x54, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x5e,0x05,0x5e, 0x34,0x0a,0x00,0x00,0x00,0x3f,0x61,0x00,0x01,0x00,0x40,0x04,0x05,0x56,0x04,0x55, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x45,0x56,0x44,0x55, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x15,0x56,0x04,0x5f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x55,0x56,0x44,0x5f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x7d,0x05,0x7c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x75,0x05,0x74, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x67,0x05,0x66, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x6f,0x05,0x6e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x17,0x05,0x16, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x2f,0x05,0x2e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x27,0x05,0x26, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x43,0x05,0x42, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x08,0x05,0x07, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x1f,0x05,0x1e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x37,0x05,0x36, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x4d,0x05,0x4c, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x55,0x05,0x54, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x5f,0x05,0x5e, 0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x95,0x56,0x04,0x7d, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xd5,0x56,0x44,0x7d, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x85,0x56,0x04,0x75, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xc5,0x56,0x44,0x75, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x25,0x56,0x04,0x67, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x65,0x56,0x44,0x67, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x35,0x56,0x04,0x6f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x75,0x56,0x44,0x6f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xb5,0x56,0x04,0x17, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xf5,0x56,0x44,0x17, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x25,0x57,0x04,0x2f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x65,0x57,0x44,0x2f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x15,0x57,0x04,0x27, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x55,0x57,0x44,0x27, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x85,0x57,0x04,0x43, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xc5,0x57,0x44,0x43, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xa5,0x56,0x04,0x08, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xe5,0x56,0x44,0x08, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x05,0x57,0x04,0x1f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x45,0x57,0x44,0x1f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x35,0x57,0x04,0x37, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x75,0x57,0x44,0x37, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x95,0x57,0x04,0x4d, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xd5,0x57,0x44,0x4d, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xa5,0x57,0x04,0x55, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xe5,0x57,0x44,0x55, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xb5,0x57,0x04,0x5f, 0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xf5,0x57,0x44,0x5f, 0x30,0x00,0x00,0x00,0x00,0x00,0x31,0x9a,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x0d, 0x00,0xc0,0x14,0x56,0x00,0x00,0x31,0x00,0x03,0x80,0x04,0x00,0x00,0x00,0x0c,0x7f, 0x20,0x70,0x00,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x53,0x70,0x61,0x74,0x69,0x61, 0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x4e,0x56, 0x31,0x32,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x78, 0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f, 0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79,0x00, 0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00,0x72, 0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70,0x00, 0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72,0x30, 0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00, 0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32,0x35, 0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00,0x56, 0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00,0x56, 0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00,0x56, 0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00,0x56, 0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00,0x56, 0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00,0x56, 0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00,0x56, 0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00,0x56, 0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00,0x56, 0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00,0x56, 0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00,0x56, 0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00,0x56, 0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00,0x56, 0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00,0x56, 0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00,0x56, 0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00,0x56, 0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00,0x56, 0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30,0x00, 0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00,0x56, 0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56,0x31, 0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31,0x31, 0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31,0x33, 0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36,0x00, 0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00,0x56, 0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56,0x31, 0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31,0x32, 0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32,0x39, 0x00,0x56,0x31,0x33,0x30,0x00,0x56,0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32,0x00, 0x56,0x31,0x33,0x33,0x00,0x56,0x31,0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00,0x56, 0x31,0x33,0x36,0x00,0x56,0x31,0x33,0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56,0x31, 0x33,0x39,0x00,0x56,0x31,0x34,0x30,0x00,0x56,0x31,0x34,0x31,0x00,0x56,0x31,0x34, 0x32,0x00,0x56,0x31,0x34,0x33,0x00,0x56,0x31,0x34,0x34,0x00,0x56,0x31,0x34,0x35, 0x00,0x56,0x31,0x34,0x36,0x00,0x56,0x31,0x34,0x37,0x00,0x56,0x31,0x34,0x38,0x00, 0x56,0x31,0x34,0x39,0x00,0x56,0x31,0x35,0x30,0x00,0x56,0x31,0x35,0x31,0x00,0x56, 0x31,0x35,0x32,0x00,0x56,0x31,0x35,0x33,0x00,0x56,0x31,0x35,0x34,0x00,0x56,0x31, 0x35,0x35,0x00,0x56,0x31,0x35,0x36,0x00,0x56,0x31,0x35,0x37,0x00,0x56,0x31,0x35, 0x38,0x00,0x56,0x31,0x35,0x39,0x00,0x56,0x31,0x36,0x30,0x00,0x56,0x31,0x36,0x31, 0x00,0x56,0x31,0x36,0x32,0x00,0x56,0x31,0x36,0x33,0x00,0x56,0x31,0x36,0x34,0x00, 0x56,0x31,0x36,0x35,0x00,0x56,0x31,0x36,0x36,0x00,0x56,0x31,0x36,0x37,0x00,0x56, 0x31,0x36,0x38,0x00,0x56,0x31,0x36,0x39,0x00,0x56,0x31,0x37,0x30,0x00,0x56,0x31, 0x37,0x31,0x00,0x56,0x31,0x37,0x32,0x00,0x56,0x31,0x37,0x33,0x00,0x56,0x31,0x37, 0x34,0x00,0x56,0x31,0x37,0x35,0x00,0x56,0x31,0x37,0x36,0x00,0x56,0x31,0x37,0x37, 0x00,0x56,0x31,0x37,0x38,0x00,0x56,0x31,0x37,0x39,0x00,0x56,0x31,0x38,0x30,0x00, 0x56,0x31,0x38,0x31,0x00,0x56,0x31,0x38,0x32,0x00,0x56,0x31,0x38,0x33,0x00,0x56, 0x31,0x38,0x34,0x00,0x56,0x31,0x38,0x35,0x00,0x56,0x31,0x38,0x36,0x00,0x56,0x31, 0x38,0x37,0x00,0x56,0x31,0x38,0x38,0x00,0x56,0x31,0x38,0x39,0x00,0x56,0x31,0x39, 0x30,0x00,0x56,0x31,0x39,0x31,0x00,0x56,0x31,0x39,0x32,0x00,0x56,0x31,0x39,0x33, 0x00,0x56,0x31,0x39,0x34,0x00,0x56,0x31,0x39,0x35,0x00,0x56,0x31,0x39,0x36,0x00, 0x56,0x31,0x39,0x37,0x00,0x56,0x31,0x39,0x38,0x00,0x56,0x31,0x39,0x39,0x00,0x56, 0x32,0x30,0x30,0x00,0x56,0x32,0x30,0x31,0x00,0x56,0x32,0x30,0x32,0x00,0x56,0x32, 0x30,0x33,0x00,0x56,0x32,0x30,0x34,0x00,0x56,0x32,0x30,0x35,0x00,0x56,0x32,0x30, 0x36,0x00,0x56,0x32,0x30,0x37,0x00,0x56,0x32,0x30,0x38,0x00,0x56,0x32,0x30,0x39, 0x00,0x56,0x32,0x31,0x30,0x00,0x56,0x32,0x31,0x31,0x00,0x56,0x32,0x31,0x32,0x00, 0x56,0x32,0x31,0x33,0x00,0x56,0x32,0x31,0x34,0x00,0x56,0x32,0x31,0x35,0x00,0x56, 0x32,0x31,0x36,0x00,0x56,0x32,0x31,0x37,0x00,0x56,0x32,0x31,0x38,0x00,0x56,0x32, 0x31,0x39,0x00,0x56,0x32,0x32,0x30,0x00,0x56,0x32,0x32,0x31,0x00,0x56,0x32,0x32, 0x32,0x00,0x56,0x32,0x32,0x33,0x00,0x56,0x32,0x32,0x34,0x00,0x56,0x32,0x32,0x35, 0x00,0x56,0x32,0x32,0x36,0x00,0x56,0x32,0x32,0x37,0x00,0x56,0x32,0x32,0x38,0x00, 0x56,0x32,0x32,0x39,0x00,0x56,0x32,0x33,0x30,0x00,0x56,0x32,0x33,0x31,0x00,0x56, 0x32,0x33,0x32,0x00,0x56,0x32,0x33,0x33,0x00,0x56,0x32,0x33,0x34,0x00,0x56,0x32, 0x33,0x35,0x00,0x56,0x32,0x33,0x36,0x00,0x56,0x32,0x33,0x37,0x00,0x56,0x32,0x33, 0x38,0x00,0x56,0x32,0x33,0x39,0x00,0x56,0x32,0x34,0x30,0x00,0x56,0x32,0x34,0x31, 0x00,0x56,0x32,0x34,0x32,0x00,0x56,0x32,0x34,0x33,0x00,0x56,0x32,0x34,0x34,0x00, 0x56,0x32,0x34,0x35,0x00,0x56,0x32,0x34,0x36,0x00,0x56,0x32,0x34,0x37,0x00,0x56, 0x32,0x34,0x38,0x00,0x56,0x32,0x34,0x39,0x00,0x56,0x32,0x35,0x30,0x00,0x56,0x32, 0x35,0x31,0x00,0x56,0x32,0x35,0x32,0x00,0x56,0x32,0x35,0x33,0x00,0x56,0x32,0x35, 0x34,0x00,0x56,0x32,0x35,0x35,0x00,0x56,0x32,0x35,0x36,0x00,0x56,0x32,0x35,0x37, 0x00,0x56,0x32,0x35,0x38,0x00,0x56,0x32,0x35,0x39,0x00,0x56,0x32,0x36,0x30,0x00, 0x56,0x32,0x36,0x31,0x00,0x56,0x32,0x36,0x32,0x00,0x56,0x32,0x36,0x33,0x00,0x56, 0x32,0x36,0x34,0x00,0x56,0x32,0x36,0x35,0x00,0x56,0x32,0x36,0x36,0x00,0x56,0x32, 0x36,0x37,0x00,0x56,0x32,0x36,0x38,0x00,0x56,0x32,0x36,0x39,0x00,0x56,0x32,0x37, 0x30,0x00,0x56,0x32,0x37,0x31,0x00,0x56,0x32,0x37,0x32,0x00,0x56,0x32,0x37,0x33, 0x00,0x56,0x32,0x37,0x34,0x00,0x56,0x32,0x37,0x35,0x00,0x56,0x32,0x37,0x36,0x00, 0x56,0x32,0x37,0x37,0x00,0x56,0x32,0x37,0x38,0x00,0x56,0x32,0x37,0x39,0x00,0x56, 0x32,0x38,0x30,0x00,0x56,0x32,0x38,0x31,0x00,0x56,0x32,0x38,0x32,0x00,0x56,0x32, 0x38,0x33,0x00,0x56,0x32,0x38,0x34,0x00,0x56,0x32,0x38,0x35,0x00,0x56,0x32,0x38, 0x36,0x00,0x56,0x32,0x38,0x37,0x00,0x56,0x32,0x38,0x38,0x00,0x56,0x32,0x38,0x39, 0x00,0x56,0x32,0x39,0x30,0x00,0x56,0x32,0x39,0x31,0x00,0x56,0x32,0x39,0x32,0x00, 0x56,0x32,0x39,0x33,0x00,0x56,0x32,0x39,0x34,0x00,0x56,0x32,0x39,0x35,0x00,0x56, 0x32,0x39,0x36,0x00,0x56,0x32,0x39,0x37,0x00,0x56,0x32,0x39,0x38,0x00,0x56,0x32, 0x39,0x39,0x00,0x56,0x33,0x30,0x30,0x00,0x56,0x33,0x30,0x31,0x00,0x56,0x33,0x30, 0x32,0x00,0x56,0x33,0x30,0x33,0x00,0x56,0x33,0x30,0x34,0x00,0x56,0x33,0x30,0x35, 0x00,0x56,0x33,0x30,0x36,0x00,0x56,0x33,0x30,0x37,0x00,0x56,0x33,0x30,0x38,0x00, 0x56,0x33,0x30,0x39,0x00,0x56,0x33,0x31,0x30,0x00,0x56,0x33,0x31,0x31,0x00,0x56, 0x33,0x31,0x32,0x00,0x56,0x33,0x31,0x33,0x00,0x56,0x33,0x31,0x34,0x00,0x56,0x33, 0x31,0x35,0x00,0x56,0x33,0x31,0x36,0x00,0x56,0x33,0x31,0x37,0x00,0x56,0x33,0x31, 0x38,0x00,0x56,0x33,0x31,0x39,0x00,0x56,0x33,0x32,0x30,0x00,0x56,0x33,0x32,0x31, 0x00,0x56,0x33,0x32,0x32,0x00,0x56,0x33,0x32,0x33,0x00,0x56,0x33,0x32,0x34,0x00, 0x56,0x33,0x32,0x35,0x00,0x56,0x33,0x32,0x36,0x00,0x56,0x33,0x32,0x37,0x00,0x56, 0x33,0x32,0x38,0x00,0x56,0x33,0x32,0x39,0x00,0x56,0x33,0x33,0x30,0x00,0x56,0x33, 0x33,0x31,0x00,0x56,0x33,0x33,0x32,0x00,0x56,0x33,0x33,0x33,0x00,0x56,0x33,0x33, 0x34,0x00,0x56,0x33,0x33,0x35,0x00,0x56,0x33,0x33,0x36,0x00,0x56,0x33,0x33,0x37, 0x00,0x56,0x33,0x33,0x38,0x00,0x56,0x33,0x33,0x39,0x00,0x56,0x33,0x34,0x30,0x00, 0x56,0x33,0x34,0x31,0x00,0x56,0x33,0x34,0x32,0x00,0x56,0x33,0x34,0x33,0x00,0x56, 0x33,0x34,0x34,0x00,0x56,0x33,0x34,0x35,0x00,0x56,0x33,0x34,0x36,0x00,0x56,0x33, 0x34,0x37,0x00,0x56,0x33,0x34,0x38,0x00,0x56,0x33,0x34,0x39,0x00,0x56,0x33,0x35, 0x30,0x00,0x56,0x33,0x35,0x31,0x00,0x56,0x33,0x35,0x32,0x00,0x56,0x33,0x35,0x33, 0x00,0x56,0x33,0x35,0x34,0x00,0x56,0x33,0x35,0x35,0x00,0x56,0x33,0x35,0x36,0x00, 0x56,0x33,0x35,0x37,0x00,0x56,0x33,0x35,0x38,0x00,0x56,0x33,0x35,0x39,0x00,0x56, 0x33,0x36,0x30,0x00,0x56,0x33,0x36,0x31,0x00,0x56,0x33,0x36,0x32,0x00,0x56,0x33, 0x36,0x33,0x00,0x56,0x33,0x36,0x34,0x00,0x56,0x33,0x36,0x35,0x00,0x56,0x33,0x36, 0x36,0x00,0x56,0x33,0x36,0x37,0x00,0x56,0x33,0x36,0x38,0x00,0x56,0x33,0x36,0x39, 0x00,0x56,0x33,0x37,0x30,0x00,0x56,0x33,0x37,0x31,0x00,0x56,0x33,0x37,0x32,0x00, 0x56,0x33,0x37,0x33,0x00,0x56,0x33,0x37,0x34,0x00,0x56,0x33,0x37,0x35,0x00,0x56, 0x33,0x37,0x36,0x00,0x56,0x33,0x37,0x37,0x00,0x56,0x33,0x37,0x38,0x00,0x56,0x33, 0x37,0x39,0x00,0x56,0x33,0x38,0x30,0x00,0x56,0x33,0x38,0x31,0x00,0x56,0x33,0x38, 0x32,0x00,0x56,0x33,0x38,0x33,0x00,0x56,0x33,0x38,0x34,0x00,0x56,0x33,0x38,0x35, 0x00,0x56,0x33,0x38,0x36,0x00,0x56,0x33,0x38,0x37,0x00,0x56,0x33,0x38,0x38,0x00, 0x56,0x33,0x38,0x39,0x00,0x56,0x33,0x39,0x30,0x00,0x56,0x33,0x39,0x31,0x00,0x56, 0x33,0x39,0x32,0x00,0x56,0x33,0x39,0x33,0x00,0x56,0x33,0x39,0x34,0x00,0x56,0x33, 0x39,0x35,0x00,0x56,0x33,0x39,0x36,0x00,0x56,0x33,0x39,0x37,0x00,0x56,0x33,0x39, 0x38,0x00,0x56,0x33,0x39,0x39,0x00,0x56,0x34,0x30,0x30,0x00,0x56,0x34,0x30,0x31, 0x00,0x56,0x34,0x30,0x32,0x00,0x56,0x34,0x30,0x33,0x00,0x56,0x34,0x30,0x34,0x00, 0x56,0x34,0x30,0x35,0x00,0x56,0x34,0x30,0x36,0x00,0x56,0x34,0x30,0x37,0x00,0x56, 0x34,0x30,0x38,0x00,0x56,0x34,0x30,0x39,0x00,0x56,0x34,0x31,0x30,0x00,0x56,0x34, 0x31,0x31,0x00,0x56,0x34,0x31,0x32,0x00,0x56,0x34,0x31,0x33,0x00,0x56,0x34,0x31, 0x34,0x00,0x56,0x34,0x31,0x35,0x00,0x56,0x34,0x31,0x36,0x00,0x56,0x34,0x31,0x37, 0x00,0x56,0x34,0x31,0x38,0x00,0x56,0x34,0x31,0x39,0x00,0x56,0x34,0x32,0x30,0x00, 0x56,0x34,0x32,0x31,0x00,0x56,0x34,0x32,0x32,0x00,0x56,0x34,0x32,0x33,0x00,0x56, 0x34,0x32,0x34,0x00,0x56,0x34,0x32,0x35,0x00,0x56,0x34,0x32,0x36,0x00,0x56,0x34, 0x32,0x37,0x00,0x56,0x34,0x32,0x38,0x00,0x56,0x34,0x32,0x39,0x00,0x56,0x34,0x33, 0x30,0x00,0x56,0x34,0x33,0x31,0x00,0x56,0x34,0x33,0x32,0x00,0x56,0x34,0x33,0x33, 0x00,0x56,0x34,0x33,0x34,0x00,0x56,0x34,0x33,0x35,0x00,0x56,0x34,0x33,0x36,0x00, 0x56,0x34,0x33,0x37,0x00,0x56,0x34,0x33,0x38,0x00,0x56,0x34,0x33,0x39,0x00,0x56, 0x34,0x34,0x30,0x00,0x56,0x34,0x34,0x31,0x00,0x56,0x34,0x34,0x32,0x00,0x56,0x34, 0x34,0x33,0x00,0x56,0x34,0x34,0x34,0x00,0x56,0x34,0x34,0x35,0x00,0x56,0x34,0x34, 0x36,0x00,0x56,0x34,0x34,0x37,0x00,0x56,0x34,0x34,0x38,0x00,0x56,0x34,0x34,0x39, 0x00,0x56,0x34,0x35,0x30,0x00,0x56,0x34,0x35,0x31,0x00,0x56,0x34,0x35,0x32,0x00, 0x56,0x34,0x35,0x33,0x00,0x56,0x34,0x35,0x34,0x00,0x56,0x34,0x35,0x35,0x00,0x56, 0x34,0x35,0x36,0x00,0x56,0x34,0x35,0x37,0x00,0x56,0x34,0x35,0x38,0x00,0x56,0x34, 0x35,0x39,0x00,0x56,0x34,0x36,0x30,0x00,0x56,0x34,0x36,0x31,0x00,0x56,0x34,0x36, 0x32,0x00,0x56,0x34,0x36,0x33,0x00,0x56,0x34,0x36,0x34,0x00,0x56,0x34,0x36,0x35, 0x00,0x56,0x34,0x36,0x36,0x00,0x56,0x34,0x36,0x37,0x00,0x56,0x34,0x36,0x38,0x00, 0x56,0x34,0x36,0x39,0x00,0x56,0x34,0x37,0x30,0x00,0x56,0x34,0x37,0x31,0x00,0x56, 0x34,0x37,0x32,0x00,0x56,0x34,0x37,0x33,0x00,0x56,0x34,0x37,0x34,0x00,0x56,0x34, 0x37,0x35,0x00,0x56,0x34,0x37,0x36,0x00,0x56,0x34,0x37,0x37,0x00,0x56,0x34,0x37, 0x38,0x00,0x56,0x34,0x37,0x39,0x00,0x56,0x34,0x38,0x30,0x00,0x56,0x34,0x38,0x31, 0x00,0x56,0x34,0x38,0x32,0x00,0x56,0x34,0x38,0x33,0x00,0x56,0x34,0x38,0x34,0x00, 0x56,0x34,0x38,0x35,0x00,0x56,0x34,0x38,0x36,0x00,0x56,0x34,0x38,0x37,0x00,0x56, 0x34,0x38,0x38,0x00,0x56,0x34,0x38,0x39,0x00,0x56,0x34,0x39,0x30,0x00,0x56,0x34, 0x39,0x31,0x00,0x56,0x34,0x39,0x32,0x00,0x56,0x34,0x39,0x33,0x00,0x56,0x34,0x39, 0x34,0x00,0x56,0x34,0x39,0x35,0x00,0x56,0x34,0x39,0x36,0x00,0x56,0x34,0x39,0x37, 0x00,0x56,0x34,0x39,0x38,0x00,0x56,0x34,0x39,0x39,0x00,0x56,0x35,0x30,0x30,0x00, 0x56,0x35,0x30,0x31,0x00,0x56,0x35,0x30,0x32,0x00,0x56,0x35,0x30,0x33,0x00,0x56, 0x35,0x30,0x34,0x00,0x56,0x35,0x30,0x35,0x00,0x56,0x35,0x30,0x36,0x00,0x56,0x35, 0x30,0x37,0x00,0x56,0x35,0x30,0x38,0x00,0x56,0x35,0x30,0x39,0x00,0x56,0x35,0x31, 0x30,0x00,0x56,0x35,0x31,0x31,0x00,0x56,0x35,0x31,0x32,0x00,0x56,0x35,0x31,0x33, 0x00,0x56,0x35,0x31,0x34,0x00,0x56,0x35,0x31,0x35,0x00,0x56,0x35,0x31,0x36,0x00, 0x56,0x35,0x31,0x37,0x00,0x56,0x35,0x31,0x38,0x00,0x56,0x35,0x31,0x39,0x00,0x56, 0x35,0x32,0x30,0x00,0x56,0x35,0x32,0x31,0x00,0x56,0x35,0x32,0x32,0x00,0x56,0x35, 0x32,0x33,0x00,0x56,0x35,0x32,0x34,0x00,0x56,0x35,0x32,0x35,0x00,0x56,0x35,0x32, 0x36,0x00,0x56,0x35,0x32,0x37,0x00,0x56,0x35,0x32,0x38,0x00,0x56,0x35,0x32,0x39, 0x00,0x56,0x35,0x33,0x30,0x00,0x56,0x35,0x33,0x31,0x00,0x56,0x35,0x33,0x32,0x00, 0x56,0x35,0x33,0x33,0x00,0x56,0x35,0x33,0x34,0x00,0x56,0x35,0x33,0x35,0x00,0x56, 0x35,0x33,0x36,0x00,0x56,0x35,0x33,0x37,0x00,0x56,0x35,0x33,0x38,0x00,0x56,0x35, 0x33,0x39,0x00,0x56,0x35,0x34,0x30,0x00,0x56,0x35,0x34,0x31,0x00,0x56,0x35,0x34, 0x32,0x00,0x50,0x31,0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f, 0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x4e,0x56,0x31,0x32,0x5f,0x42,0x42, 0x5f,0x30,0x5f,0x32,0x38,0x38,0x00,0x42,0x42,0x5f,0x31,0x5f,0x32,0x39,0x39,0x00, 0x42,0x42,0x5f,0x32,0x5f,0x33,0x30,0x33,0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x54, 0x38,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74, 0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x55,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x13,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00, 0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x53, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x00,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x00,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x25, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x25,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00, 0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x25, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x25,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x01,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x01,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00, 0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00, 0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x57, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x51,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x57,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x01, 0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x55, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x55,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x55,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x01,0x01,0x00,0x22, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x02,0x02,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x02,0x01,0x00,0x21,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x01,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x01,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x00,0x00,0x05,0x80,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x00,0x00,0x03,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x01, 0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00, 0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x01, 0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x01,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x01,0x00, 0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x01,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x01,0x01,0x00,0x2c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x01,0x00,0x2c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x03,0x08,0x00,0x2e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x04,0xc0,0x00,0x2b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x03,0x04,0x00,0x2f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0x01,0x00,0x00,0x03,0x02,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x32,0x01,0x00,0x00,0x03,0x10,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x01,0x00,0x00,0x03,0x08,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34, 0x01,0x00,0x00,0x03,0x04,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x01, 0x00,0x00,0x03,0x02,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01,0x00, 0x00,0x03,0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00,0x00, 0x03,0x04,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x03, 0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x03,0x08, 0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x03,0x04,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x03,0x02,0x00,0x39, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x03,0x08,0x00,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x03,0x04,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x03,0x02,0x00,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x03,0x08,0x00,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x03,0x04,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x41,0x01,0x00,0x00,0x03,0x02,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x42,0x01,0x00,0x00,0x03,0x08,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x43,0x01,0x00,0x00,0x03,0x04,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x01,0x00,0x00,0x03,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x01, 0x00,0x00,0x03,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01,0x00, 0x00,0x03,0x04,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00,0x00, 0x03,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x03, 0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x03,0x04, 0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x03,0x02,0x00, 0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x03,0x08,0x00,0x49, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x03,0x04,0x00,0x4a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x03,0x02,0x00,0x4b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x03,0x08,0x00,0x4c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x03,0x04,0x00,0x4d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x03,0x02,0x00,0x4e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x01,0x00,0x00,0x03,0x08,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x01,0x00,0x00,0x03,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x01,0x00,0x00,0x03,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x03,0x08,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x01, 0x00,0x00,0x03,0x04,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x03,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00,0x00, 0x03,0x08,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x03, 0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x03,0x02, 0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x03,0x08,0x00, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x03,0x04,0x00,0x59, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x03,0x02,0x00,0x5a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x03,0x08,0x00,0x5b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x03,0x04,0x00,0x5c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x03,0x02,0x00,0x5d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x02,0x10,0x00,0x5e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x61,0x01,0x00,0x00,0x01,0x10,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x62,0x01,0x00,0x00,0x01,0x10,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x63,0x01,0x00,0x00,0x01,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64, 0x01,0x00,0x00,0x01,0x10,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x01, 0x00,0x00,0x01,0x10,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01,0x00, 0x00,0x01,0x10,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00,0x00, 0x01,0x10,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x01, 0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x01,0x10, 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x01,0x10,0x00, 0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x01,0x10,0x00,0x66, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x01,0x10,0x00,0x67,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x01,0x10,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x01,0x10,0x00,0x68,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x01,0x10,0x00,0x69,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x01,0x10,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x71,0x01,0x00,0x00,0x03,0x20,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x03,0x20,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x03,0x20,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74, 0x01,0x00,0x00,0x03,0x20,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x03,0x20,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00, 0x00,0x03,0x20,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00,0x00, 0x03,0x20,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x03, 0x20,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x01,0x08, 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x02,0x20,0x00, 0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x02,0x20,0x00,0x6b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x01,0x04,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x01,0x02,0x00,0x75,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x01,0x10,0x00,0xa3,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x01,0x08,0x00,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x04,0x00,0x77,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x81,0x01,0x00,0x00,0x01,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x82,0x01,0x00,0x00,0x01,0x08,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x83,0x01,0x00,0x00,0x01,0x04,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84, 0x01,0x00,0x00,0x01,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x01, 0x00,0x00,0x01,0x08,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00, 0x00,0x01,0x04,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00,0x00, 0x01,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x01, 0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x02,0x20, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x02,0x20,0x00, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x01,0x04,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x01,0x02,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x01,0x08,0x00,0x82,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x01,0x04,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x01,0x02,0x00,0x84,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x01,0x08,0x00,0x85,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x01,0x04,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x01,0x00,0x00,0x01,0x02,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x93,0x01,0x00,0x00,0x01,0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94, 0x01,0x00,0x00,0x01,0x04,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x01, 0x00,0x00,0x01,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01,0x00, 0x00,0x01,0x08,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00,0x00, 0x02,0x20,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x02, 0x20,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x01,0x04, 0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x01,0x02,0x00, 0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x01,0x08,0x00,0x8e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x01,0x04,0x00,0x8f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x01,0x02,0x00,0x90,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x01,0x08,0x00,0x91,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x01,0x04,0x00,0x92,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x01,0x02,0x00,0x93,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa1,0x01,0x00,0x00,0x01,0x08,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0x01,0x00,0x00,0x01,0x04,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0x01,0x00,0x00,0x01,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4, 0x01,0x00,0x00,0x01,0x08,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x01, 0x00,0x00,0x02,0x20,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01,0x00, 0x00,0x02,0x20,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00,0x00, 0x01,0x04,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x01, 0x02,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x01,0x08, 0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x01,0x04,0x00, 0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x01,0x02,0x00,0x9c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x01,0x08,0x00,0x9d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x01,0x04,0x00,0x9e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x01,0x02,0x00,0x9f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x01,0x08,0x00,0xa0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x01,0x04,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb1,0x01,0x00,0x00,0x01,0x02,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb2,0x01,0x00,0x00,0x00,0x10,0x00,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb3,0x01,0x00,0x00,0x07,0x10,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0x01,0x00,0x00,0x07,0x10,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0x01, 0x00,0x00,0x07,0x01,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01,0x00, 0x00,0x07,0x10,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00,0x00, 0x07,0x10,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x07, 0x10,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x07,0x10, 0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x01,0x04,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x07,0x04,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x01,0x04,0x00,0xc7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x01,0x04,0x00,0xaf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x07,0x04,0x00,0xb1,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x01,0x04,0x00,0xb2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x01,0x04,0x00,0xb3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc1,0x01,0x00,0x00,0x07,0x04,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x01,0x04,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc3,0x01,0x00,0x00,0x07,0x04,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x01,0x04,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x01, 0x00,0x00,0x01,0x04,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01,0x00, 0x00,0x07,0x04,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00,0x00, 0x01,0x04,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x07, 0x04,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x01,0x04, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x01,0x04,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x07,0x04,0x00,0xc0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x01,0x04,0x00,0xc1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x07,0x04,0x00,0xc3,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x01,0x04,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x01,0x04,0x00,0xc5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x07,0x04,0x00,0xc6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd1,0x01,0x00,0x00,0x07,0x04,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd2,0x01,0x00,0x00,0x01,0x04,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x01,0x04,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x07,0x04,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x01, 0x00,0x00,0x01,0x04,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01,0x00, 0x00,0x07,0x04,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00,0x00, 0x01,0x04,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x01, 0x04,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x07,0x04, 0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x01,0x04,0x00, 0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x07,0x04,0x00,0xd5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x01,0x04,0x00,0xd6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x01,0x04,0x00,0xd7,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x07,0x04,0x00,0xd8,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x01,0x04,0x00,0xd9,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x07,0x04,0x00,0xdb,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe1,0x01,0x00,0x00,0x01,0x04,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe2,0x01,0x00,0x00,0x01,0x04,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0x01,0x00,0x00,0x07,0x04,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4, 0x01,0x00,0x00,0x01,0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0x01, 0x00,0x00,0x07,0x04,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01,0x00, 0x00,0x01,0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00,0x00, 0x01,0x04,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x07, 0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x01,0x04, 0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x07,0x04,0x00, 0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x01,0x04,0x00,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x01,0x04,0x00,0xe9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x07,0x04,0x00,0xea,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x01,0x04,0x00,0xeb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x07,0x04,0x00,0xed,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x01,0x04,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf1,0x01,0x00,0x00,0x01,0x04,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf2,0x01,0x00,0x00,0x07,0x04,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0x01,0x00,0x00,0x01,0x04,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4, 0x01,0x00,0x00,0x07,0x04,0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x01, 0x00,0x00,0x01,0x04,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x01,0x04,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00,0x00, 0x07,0x04,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x01, 0x04,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x07,0x04, 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x01,0x04,0x00, 0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x01,0x04,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x07,0x04,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x01,0x04,0x00,0xfd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x07,0x04,0x00,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x01,0x04,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0x04,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x07,0x04,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x00,0x00,0x01,0x04,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x02,0x00,0x00,0x07,0x04,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x01,0x04,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02, 0x00,0x00,0x01,0x04,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x07,0x04,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00,0x00, 0x01,0x04,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x07, 0x04,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x01,0x04, 0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x07,0x10,0x00, 0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x07,0x10,0x00,0x1a, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x07,0x10,0x00,0x13,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x07,0x10,0x00,0x14,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x07,0x10,0x00,0x1b,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x07,0x10,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x04,0x60,0x00,0x2d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x02,0x00,0x00,0x01,0x10,0x00,0x0f,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x12,0x02,0x00,0x00,0x01,0x10,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x07,0x10,0x00,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x07,0x10,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x02, 0x00,0x00,0x01,0x10,0x00,0x15,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02,0x00, 0x00,0x01,0x10,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00,0x00, 0x01,0x10,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x01, 0x10,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x19,0x02, 0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x1a,0x02,0x00,0x00,0x01,0x00,0x1b,0x02,0x00, 0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x1d,0x02,0x00,0x00,0x01, 0x00,0x00,0x1e,0x02,0x00,0x00,0x01,0x00,0x00,0x1f,0x02,0x00,0x00,0x01,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07, 0x00,0x00,0x00,0x24,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00, 0x00,0x20,0x00,0x00,0x00,0x2c,0x00,0x04,0x00,0xa2,0x3e,0x00,0x00,0x25,0x29,0x00, 0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x73,0x64,0x5f, 0x31,0x2e,0x61,0x73,0x6d,0x21,0x02,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x23,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x25,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x26,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x24,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x35,0x03,0x00,0x06, 0x05,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x01,0x00,0x00,0x02,0x03, 0x21,0x01,0x2c,0x00,0x02,0x02,0x01,0x00,0x00,0x2a,0x01,0x00,0x00,0x02,0x03,0x21, 0x01,0x05,0x03,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x01,0x00,0x37,0x00,0x07, 0x00,0x08,0x08,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x01,0x00,0x00,0x00,0x00,0x37,0x00,0x07,0x01,0x08, 0x04,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x01,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x02,0x00,0x31, 0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x26,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x01,0x00, 0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x37,0x00,0x07,0x00,0x10,0x0c, 0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01, 0xff,0xff,0xff,0xff,0x37,0x00,0x07,0x01,0x10,0x06,0x00,0x30,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x00,0x33,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x2d,0x00,0x00,0x00, 0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x02,0x02,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x02,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x34, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x37,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x36,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x37,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x02,0x04,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x04,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x3a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x3b,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x3c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x06,0x46,0x02, 0x00,0x35,0x01,0x00,0x00,0x01,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x3d,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x3c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x3e,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x3d, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00, 0x00,0x02,0x00,0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3e,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x08,0x46,0x02,0x00,0x35,0x01,0x00, 0x00,0x01,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3f,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x3f,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x40,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x40,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x03,0x00,0x02, 0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x03,0x02,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x02,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x44,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x03,0x04,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x45,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x47,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x47,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x48, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x06,0x46,0x02, 0x00,0x35,0x01,0x00,0x00,0x02,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x49,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x48,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x48,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x4a,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x49,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x49, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00, 0x00,0x06,0x00,0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4a,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x08,0x46,0x02,0x00,0x35,0x01,0x00, 0x00,0x02,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x4b,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x4b,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4c,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4c,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x07,0x00,0x02, 0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x04,0x02,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x02,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4e, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x50,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x50,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x04,0x04,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x52,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x53,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x53,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x54, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x06,0x46,0x02, 0x00,0x35,0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x55,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x54,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x56,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x55, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00, 0x00,0x0a,0x00,0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x56,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x08,0x46,0x02,0x00,0x35,0x01,0x00, 0x00,0x03,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x57,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x57,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x58,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x58,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x0b,0x00,0x02, 0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x05,0x02,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x02,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x5c,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5c,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x05,0x04,0x46,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x04,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x5e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x38,0x01,0x00,0x00,0x00,0x0d,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5f,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x60, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x05,0x06,0x46,0x02, 0x00,0x35,0x01,0x00,0x00,0x04,0x06,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x61,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x60,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x62,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x61, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00, 0x00,0x0e,0x00,0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x62,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x05,0x08,0x46,0x02,0x00,0x35,0x01,0x00, 0x00,0x04,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x63,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x63,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x64,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00,0x00,0x0f,0x00,0x02, 0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x66,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x02,0x04,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x67,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6b,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x01,0x00,0x00,0x00,0x02,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x01,0x21,0x01, 0x29,0x04,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x68,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6b,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x00,0x08, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x5f,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x5f,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04, 0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x00,0x04,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x29,0x04,0x00, 0x00,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x69,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x60,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x08, 0x00,0x02,0x00,0x60,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x00,0x06,0x46, 0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x6a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x61,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01, 0x0c,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6c,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x61,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00, 0x61,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x00,0x46,0x02,0x10,0x66, 0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6b,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x6b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6e,0x00,0x00, 0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00, 0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x02,0x46, 0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6c, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x6c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x62,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01, 0x04,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x62,0x00,0x00,0x00,0x01,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x62,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6d,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x04,0x46,0x02,0x10,0x66, 0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x6d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x00,0x63,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x63,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x63,0x00,0x00, 0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x06,0x46,0x02,0x10,0x66,0x01,0x00,0x00, 0x00,0x07,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x08,0x6e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6d, 0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x64,0x00, 0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00, 0x0c,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x01,0x08, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x02,0x00,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x08,0x21, 0x01,0x29,0x04,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x6f, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x6f,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x70,0x00,0x00, 0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x02,0x46,0x02,0x10,0x66,0x01,0x00,0x00, 0x00,0x09,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x08,0x70,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x65,0x00, 0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x01,0x08, 0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x0a,0x21, 0x01,0x29,0x04,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x71, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00, 0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x08,0x00,0x02, 0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00, 0x00,0x02,0x06,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x72,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x0c,0x00, 0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x6f, 0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x08,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x67,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01, 0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x00, 0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x0c,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x73,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x05,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00, 0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01, 0x04,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00, 0x00,0x03,0x02,0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x0d,0x21,0x01,0x29,0x04, 0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x74,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x71, 0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x08,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x68,0x00, 0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01, 0x04,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00, 0x00,0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x04, 0x46,0x02,0x10,0x66,0x01,0x00,0x00,0x00,0x0e,0x21,0x01,0x29,0x04,0x00,0x00,0x00, 0x75,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x75,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00, 0x01,0x08,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x08,0x00,0x02, 0x00,0x69,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x76,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x10, 0x66,0x01,0x00,0x00,0x00,0x0f,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x08,0x76,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x6a,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x0c,0x00, 0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x6a,0x00, 0x00,0x00,0x01,0x08,0x23,0x01,0x10,0x05,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x77,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x78,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x79,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7a,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x05,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x05,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x05,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03, 0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x83,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x85, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x81,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x86,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x85,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x87,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x86, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x81,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x88,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x89,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x89,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x02,0x00,0x02, 0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x80,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8b, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x8d,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8d,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8e,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x92,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x93, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x90,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x94,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x93,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x95,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x94, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, 0x00,0x05,0x00,0x02,0x00,0x95,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x95,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x90,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x96,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x96,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x97,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x97,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x06,0x00,0x02, 0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x8f,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x99, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x9b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x9b,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xa0,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa1, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0x9e,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xa2,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xa1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa2, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, 0x01,0x01,0x00,0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa3,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0x9e,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa4,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa4,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa5,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa5,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x02,0x00,0x02, 0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa6,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x9d,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa7, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0xa9,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa9,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00, 0x00,0x00,0x46,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xae,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xaf, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x00,0x04,0x46,0x02, 0x00,0xac,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xb0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xaf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xb1,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xb0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, 0x01,0x05,0x00,0x02,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb1,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x00,0xac,0x01,0x00, 0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb2,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xb2,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xb3,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x06,0x00,0x02, 0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xab,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x0c,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb5, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x01,0x07,0x00,0x02,0x00,0xb7,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb7,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x04, 0x00,0x00,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x00,0x04,0x00,0x00,0x00,0x29,0x04,0x00,0x00,0x00,0xa6, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x03,0x04,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0xa5,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00, 0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x07,0x00,0x00,0x00,0x40,0x03,0x04,0x00,0x00,0x00,0xba,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbb,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x10,0xa6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00, 0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x00,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07, 0x00,0x00,0x80,0x40,0x29,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x05,0x07,0x00,0x00,0x80,0x3f,0x0c,0x04,0x00,0x00,0x00,0xa9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xa7,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x1b, 0x04,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbc,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x03,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x03,0x04,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x01,0x00,0x00,0x01,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc0,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x03,0x36,0x02,0x00, 0x35,0x01,0x00,0x00,0x01,0x01,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc0,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35, 0x01,0x00,0x00,0x00,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc0,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01, 0x00,0x00,0x01,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00, 0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x13,0x36, 0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc3, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x00,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x01,0x00,0x00,0x00,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xae,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb1,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xc5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb2,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00, 0x08,0x00,0x02,0x00,0xb2,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00, 0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x04, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x01,0x05,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x03,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x14,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x01,0x14,0x36,0x02,0x29, 0x02,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xc7,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x13,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x00, 0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x15, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x01,0x15,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb6,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xb6,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00, 0x00,0x00,0x01,0x21,0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb6, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00, 0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01, 0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0xb8,0x00,0x00, 0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x07,0x36, 0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x05,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x00,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xcb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x01,0x00,0x00,0x01,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xba,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02, 0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00, 0x00,0x02,0x21,0x01,0x00,0xcc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01, 0x15,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x00,0x15,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x35,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xbd, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00, 0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xba,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xbd,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xbd, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00, 0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xce,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0xbe,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0xbe,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02, 0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x01,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x09,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x01, 0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x18, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x01,0x18,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xd1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0xd1,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x00,0x35,0x01,0x00, 0x00,0x00,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00, 0x00,0x19,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x01, 0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc2,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00, 0xc2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac, 0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0xc4, 0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x02,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02, 0x01,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x12,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc6, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x02,0x00,0x00,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01, 0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xd6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x11,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x29,0x02,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xaa,0x00,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xc8,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x04,0x21, 0x01,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc8,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29, 0x02,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x10, 0x00,0x02,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x00,0x18,0x00,0x02,0x00,0xca,0x00,0x00,0x00,0x00,0x08,0x24, 0x01,0x29,0x02,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x01,0x00,0x00,0x02,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x03,0x36,0x02,0x00,0x35,0x01, 0x00,0x00,0x01,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00, 0x00,0x02,0x05,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00, 0x02,0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xda, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x05,0x21,0x01, 0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xdb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x00, 0x35,0x01,0x00,0x00,0x01,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xdb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35, 0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xdb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01, 0x00,0x00,0x02,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x05, 0x21,0x01,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcc,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xcf,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xdd,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01, 0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x12,0x00,0x02,0x00,0xd0,0x00,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x1a,0x00, 0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xd4, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x06,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01, 0x00,0x00,0x02,0x05,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x16,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x07,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x16,0x36,0x02,0x29,0x02,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xbe,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xdf,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x15,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x15,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x29, 0x02,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00, 0x06,0x21,0x01,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd4,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe1,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00, 0x3f,0x29,0x02,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe1, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00, 0x00,0x14,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00, 0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x1c,0x00,0x02,0x00,0xd6,0x00,0x00,0x00,0x00, 0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x01,0x00,0x00,0x02,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x07,0x36,0x02,0x00, 0x35,0x01,0x00,0x00,0x01,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe3,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35, 0x01,0x00,0x00,0x02,0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe3,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01, 0x00,0x00,0x02,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00, 0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x07, 0x21,0x01,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x19,0x36, 0x02,0x00,0x35,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe5, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe5,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x01,0x00,0x00,0x02,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00, 0x00,0x07,0x21,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd8,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xdb,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xda,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xe7, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00,0x16,0x00,0x02,0x00,0xdc,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x00, 0x1e,0x00,0x02,0x00,0xdc,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x02, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x03,0x01,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x12,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x03,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x12,0x36,0x02,0x29, 0x02,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x00,0xe9,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02, 0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x11, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x13,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xea, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x21,0x01,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00, 0x00,0x01,0x00,0x21,0x01,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xeb,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00, 0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01, 0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0xe2,0x00,0x00, 0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x03,0x36, 0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xed, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x35,0x01,0x00,0x00,0x03,0x05,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xed,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x01,0x00,0x00,0x03,0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xe4,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00, 0x01,0x01,0x21,0x01,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02, 0x15,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xe7, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00, 0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xe4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe7,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xe7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00, 0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x02,0x00,0x02,0x00, 0xe8,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00, 0x00,0x01,0x0a,0x00,0x02,0x00,0xe8,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02, 0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00, 0x03,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x05,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02, 0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x07, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x16,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xf3,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x02,0x21,0x01,0x00,0xf3,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x00,0x35,0x01,0x00, 0x00,0x02,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00, 0x03,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03, 0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x01,0x02,0x21,0x01,0x00, 0xec,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac, 0x00,0x00,0x00,0x01,0x02,0x21,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xf5,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xf6,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x1f,0x01,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xee,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0xee, 0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xf2,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x08,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03, 0x07,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x18,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xf0, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x02,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01, 0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00, 0x00,0x02,0x19,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x17,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x03,0x19,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaa,0x00,0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xf3, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x01,0x03,0x21,0x01, 0x00,0xf3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf2,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfa,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02, 0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfa,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x06,0x00, 0x02,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f, 0x01,0x00,0x00,0x01,0x0e,0x00,0x02,0x00,0xf4,0x00,0x00,0x00,0x00,0x08,0x24,0x01, 0x29,0x02,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01, 0x00,0x00,0x04,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x01,0x36,0x02,0x00,0x35,0x01,0x00, 0x00,0x03,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00, 0x04,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04, 0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xfd,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x04,0x21,0x01,0x00, 0xfd,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x13,0x36,0x02,0x00,0x35, 0x01,0x00,0x00,0x03,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfe,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01, 0x00,0x00,0x04,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00, 0x00,0x04,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x01,0x04,0x21, 0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf6,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xac,0x00,0x00,0x00,0x01,0x04,0x21,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x10,0x00,0x02,0x00,0xfa,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x18,0x00,0x02, 0x00,0xfa,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x04,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00, 0x00,0x04,0x03,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x14,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x05,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x14,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbe,0x01,0x00,0x00,0x01,0x05,0x21,0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x13,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x13,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x15,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xaa,0x00,0x00,0x00,0x01,0x05,0x21,0x01,0x00,0xfe,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x01,0x05, 0x21,0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x04,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f, 0x29,0x02,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01, 0x12,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00, 0x00,0x1f,0x01,0x00,0x00,0x01,0x1a,0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x08, 0x24,0x01,0x29,0x02,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x35,0x01,0x00,0x00,0x04,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x05,0x36,0x02,0x00,0x35, 0x01,0x00,0x00,0x03,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x06,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01, 0x00,0x00,0x04,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00, 0x00,0x04,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00, 0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x06,0x21, 0x01,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x08, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x17,0x36,0x02, 0x00,0x35,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x08,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x35,0x01,0x00,0x00,0x04,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x08,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35, 0x01,0x00,0x00,0x04,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x01, 0x06,0x21,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x02,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xac,0x00,0x00,0x00,0x01,0x06,0x21,0x01,0x00,0x05,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x0a,0x02, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x14,0x00,0x02,0x00,0x06,0x01,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x1c, 0x00,0x02,0x00,0x06,0x01,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00, 0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35,0x01,0x00,0x00,0x04,0x08,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x35, 0x01,0x00,0x00,0x04,0x07,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x18,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x09,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x18,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x07,0x21,0x01,0x00,0x0c,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x35,0x01,0x00,0x00,0x03,0x19,0x36,0x02,0x00,0x35,0x01,0x00,0x00,0x03,0x17, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x17,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x35,0x01,0x00,0x00,0x04,0x19,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x00,0x01,0x07,0x21,0x01,0x00,0x0a,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x00, 0x01,0x07,0x21,0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x0a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0e,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x1f,0x01,0x00, 0x00,0x01,0x16,0x00,0x02,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01, 0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x01,0x1e,0x00,0x02,0x00,0x0c,0x01,0x00,0x00, 0x00,0x08,0x24,0x01,0x1b,0x03,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x01,0x00, 0x03,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x1b,0x03,0x00,0x00,0x00,0x11, 0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xbc,0x01,0x00,0x00,0x01,0x00,0x22,0x01, 0x1b,0x03,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xbc,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x1b,0x03,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0xbc,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00, 0x00,0x12,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb9,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0xb9,0x01,0x00,0x00,0x01,0x00,0x22, 0x01,0x00,0xbc,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x12, 0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xb9,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00, 0xbc,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x14,0x02,0x00, 0x00,0x00,0x01,0x00,0x03,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x15,0x02,0x00,0x00, 0x00,0x01,0x00,0x03,0x00,0xba,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xbc,0x01, 0x00,0x00,0x01,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbc,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x03,0x03,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0xba,0x01,0x00,0x00,0x01,0x00,0x22,0x01,0x00,0xbc,0x01,0x00,0x00, 0x01,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x12,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00,0x00,0x01,0x12,0x56,0x02, 0x01,0x04,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02, 0x00,0x00,0x00,0x14,0x56,0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x10,0x56,0x02,0x01, 0x04,0x00,0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00, 0x00,0x01,0x14,0x56,0x02,0x00,0x16,0x02,0x00,0x00,0x01,0x10,0x56,0x02,0x01,0x04, 0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x00,0x02,0x56,0x02,0x01,0x04,0x00, 0x00,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00, 0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x01,0x02,0x56,0x02,0x01,0x04,0x00,0x00,0x00, 0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x16,0x02,0x00,0x00,0x02,0x02,0x56,0x02,0x29,0x04,0x00,0x00,0x00,0x11, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x29,0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x19,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x1a,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x16,0x02,0x00,0x00,0x00,0x04,0x56,0x02,0x00,0x16,0x02,0x00,0x00,0x00, 0x00,0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x16,0x02,0x00,0x00,0x01,0x04,0x56,0x02,0x00,0x16,0x02,0x00,0x00,0x01,0x00, 0x56,0x02,0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x01,0x00,0x56, 0x02,0x01,0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x02,0x00,0x56,0x02, 0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x01,0x04,0x56,0x02,0x01, 0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x16,0x02,0x00,0x00,0x02,0x04,0x56,0x02,0x29,0x04, 0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x19, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x0d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x13,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x1a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x14,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x07,0x00,0x00,0x00,0x3f,0x01,0x04,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x04,0x00,0x00,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x1e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04, 0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00, 0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x10,0x00, 0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x31,0x02,0x00,0x38,0x00,0x08, 0x00,0x08,0x08,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2c,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x1f,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x08,0x01,0x08, 0x04,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x2d,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x20,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x61,0x01,0x05, 0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x04,0x01,0x00, 0x02,0x00,0x04,0x48,0x02,0x68,0x00,0x00,0x80,0x10,0x82,0x06,0x02,0x24,0x00,0x00, 0x01,0x0c,0x00,0x0c,0x00,0x31,0xb0,0x04,0x80,0x00,0x00,0x05,0x06,0x04,0x05,0x00, 0xa0,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00,0x00, 0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x02,0x62,0x05,0x02,0xf1,0xff,0x40,0x02,0x00, 0x00,0x60,0x01,0x05,0x03,0x64,0x01,0x00,0x01,0x84,0x01,0x00,0x00,0x40,0x02,0x00, 0x00,0x60,0x01,0x05,0x04,0x64,0x01,0x00,0x01,0x04,0x02,0x00,0x00,0x69,0x02,0x77, 0x68,0x02,0x03,0x31,0x00,0x69,0x02,0x77,0x68,0x62,0x04,0x31,0x00,0x69,0x00,0x77, 0x68,0x3a,0x04,0x21,0x00,0x70,0x20,0x00,0x00,0x50,0x85,0x01,0x00,0x34,0x08,0x00, 0x35,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x05,0x65,0x77,0x34,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x81,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x00,0x00,0x00,0x61,0x00,0x02,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x61,0x00,0x00, 0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x61,0x07,0x02, 0x62,0x00,0x77,0x01,0x00,0x61,0x07,0x02,0x62,0xc8,0x77,0x01,0x00,0x31,0x91,0x03, 0x80,0x00,0x00,0x05,0x78,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x31,0x00, 0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x61,0x07,0x00, 0x80,0xa0,0x0a,0x25,0x02,0x44,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x01,0x00,0x19,0x02,0x31,0xa2,0x03, 0x80,0x00,0x00,0x05,0x7a,0x04,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x26,0x00,0x00,0x61,0x00,0x02, 0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x00,0x00,0x69,0x02,0x40,0x00,0x02,0x68,0x02,0x77,0xe1,0xff,0x40,0x00,0x02, 0x68,0xca,0x77,0xe1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00, 0x00,0x0f,0x00,0x0b,0x00,0x61,0x00,0x04,0x00,0xa0,0x4a,0x01,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x3f,0x31,0xa3,0x03,0x80,0x00,0x00,0x05,0x03,0x04,0x02,0x00, 0xc0,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00, 0x02,0x01,0x00,0x39,0x02,0x40,0x33,0x00,0x00,0x60,0x86,0x25,0x02,0x44,0x77,0x00, 0x05,0xff,0xff,0xff,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00, 0x00,0x0f,0x00,0x05,0x00,0x31,0x94,0x03,0x80,0x00,0x00,0x05,0x09,0x04,0x02,0x00, 0xc0,0x00,0x00,0x00,0x00,0x61,0x23,0x03,0x00,0x50,0x00,0x05,0x0c,0x15,0x04,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x11,0x25,0x04,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x15,0x35,0x04,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x19,0x45,0x04,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x1d,0x15,0x05,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x21,0x25,0x05,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x25,0x35,0x05,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x29,0x45,0x05,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x2d,0x15,0x06,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x31,0x25,0x06,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x35,0x35,0x06,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x39,0x45,0x06,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x3d,0x15,0x07,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x41,0x25,0x07,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x45,0x35,0x07,0x54, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x49,0x45,0x07,0x54, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x0d,0x15,0x05,0x54, 0x05,0x05,0x0c,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x12,0x25,0x05,0x54, 0x05,0x05,0x11,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x16,0x35,0x05,0x54, 0x05,0x05,0x15,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x1a,0x45,0x05,0x54, 0x05,0x05,0x19,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x1e,0x15,0x06,0x54, 0x05,0x05,0x1d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x22,0x25,0x06,0x54, 0x05,0x05,0x21,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x26,0x35,0x06,0x54, 0x05,0x05,0x25,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x2a,0x45,0x06,0x54, 0x05,0x05,0x29,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x2e,0x15,0x07,0x54, 0x05,0x05,0x2d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x32,0x25,0x07,0x54, 0x05,0x05,0x31,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x36,0x35,0x07,0x54, 0x05,0x05,0x35,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x3a,0x45,0x07,0x54, 0x05,0x05,0x39,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x3e,0x15,0x08,0x54, 0x05,0x05,0x3d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x42,0x25,0x08,0x54, 0x05,0x05,0x41,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x46,0x35,0x08,0x54, 0x05,0x05,0x45,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x4a,0x45,0x08,0x54, 0x05,0x05,0x49,0x46,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x0e,0x45,0x0d,0x34, 0x05,0x05,0x0d,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x13,0x45,0x12,0x34, 0x05,0x05,0x12,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x17,0x45,0x16,0x34, 0x05,0x05,0x16,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x1b,0x45,0x1a,0x34, 0x05,0x05,0x1a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x1f,0x45,0x1e,0x34, 0x05,0x05,0x1e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x23,0x45,0x22,0x34, 0x05,0x05,0x22,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x27,0x45,0x26,0x34, 0x05,0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x2b,0x45,0x2a,0x34, 0x05,0x05,0x2a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x2f,0x45,0x2e,0x34, 0x05,0x05,0x2e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x33,0x45,0x32,0x34, 0x05,0x05,0x32,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x37,0x45,0x36,0x34, 0x05,0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x3b,0x45,0x3a,0x34, 0x05,0x05,0x3a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x3f,0x45,0x3e,0x34, 0x05,0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x43,0x45,0x42,0x34, 0x05,0x05,0x42,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x47,0x45,0x46,0x34, 0x05,0x05,0x46,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x4b,0x45,0x4a,0x34, 0x05,0x05,0x4a,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x0f,0x25,0x0e,0x22, 0x05,0x05,0x0e,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x14,0x25,0x13,0x22, 0x05,0x05,0x13,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x18,0x25,0x17,0x22, 0x05,0x05,0x17,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x1c,0x25,0x1b,0x22, 0x05,0x05,0x1b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x20,0x25,0x1f,0x22, 0x05,0x05,0x1f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x24,0x25,0x23,0x22, 0x05,0x05,0x23,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x28,0x25,0x27,0x22, 0x05,0x05,0x27,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x2c,0x25,0x2b,0x22, 0x05,0x05,0x2b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x30,0x25,0x2f,0x22, 0x05,0x05,0x2f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x34,0x25,0x33,0x22, 0x05,0x05,0x33,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x38,0x25,0x37,0x22, 0x05,0x05,0x37,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x3c,0x25,0x3b,0x22, 0x05,0x05,0x3b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x40,0x25,0x3f,0x22, 0x05,0x05,0x3f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x44,0x25,0x43,0x22, 0x05,0x05,0x43,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x48,0x25,0x47,0x22, 0x05,0x05,0x47,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x4c,0x25,0x4b,0x22, 0x05,0x05,0x4b,0x22,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x05,0x10,0x04,0x0f,0x00, 0x05,0x14,0x0f,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x15,0x10,0x04,0x14,0x00, 0x05,0x14,0x14,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x25,0x10,0x04,0x18,0x00, 0x05,0x14,0x18,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x35,0x10,0x04,0x1c,0x00, 0x05,0x14,0x1c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x45,0x10,0x04,0x20,0x00, 0x05,0x14,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x55,0x10,0x04,0x24,0x00, 0x05,0x14,0x24,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x65,0x10,0x04,0x28,0x00, 0x05,0x14,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x75,0x10,0x04,0x2c,0x00, 0x05,0x14,0x2c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x85,0x10,0x04,0x30,0x00, 0x05,0x14,0x30,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x95,0x10,0x04,0x34,0x00, 0x05,0x14,0x34,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xa5,0x10,0x04,0x38,0x00, 0x05,0x14,0x38,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xb5,0x10,0x04,0x3c,0x00, 0x05,0x14,0x3c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xc5,0x10,0x04,0x40,0x00, 0x05,0x14,0x40,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xd5,0x10,0x04,0x44,0x00, 0x05,0x14,0x44,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xe5,0x10,0x04,0x48,0x00, 0x05,0x14,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xf5,0x10,0x04,0x4c,0x00, 0x05,0x14,0x4c,0x00,0x00,0x38,0x45,0x04,0x00,0xa0,0x0a,0x05,0x3d,0x64,0x77,0x00, 0x10,0x00,0x00,0x00,0x00,0x68,0x01,0x04,0x00,0x10,0x81,0x05,0x10,0x05,0x10,0x58, 0x01,0x04,0x00,0x04,0x00,0x38,0x46,0x04,0x00,0xa0,0x0a,0x05,0x41,0x64,0x77,0x00, 0x10,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0x00,0x60,0x00,0x05,0x4d,0x05,0x03,0x54, 0x01,0x04,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x57,0x05,0x04,0x54, 0x01,0x44,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x61,0x05,0x05,0x54, 0x01,0x84,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x6b,0x05,0x06,0x54, 0x01,0xc4,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x51,0x15,0x03,0x54, 0x01,0x14,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x53,0x25,0x03,0x54, 0x01,0x24,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x55,0x35,0x03,0x54, 0x01,0x34,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5b,0x15,0x04,0x54, 0x01,0x54,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5d,0x25,0x04,0x54, 0x01,0x64,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x5f,0x35,0x04,0x54, 0x01,0x74,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x65,0x15,0x05,0x54, 0x01,0x94,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x67,0x25,0x05,0x54, 0x01,0xa4,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x69,0x35,0x05,0x54, 0x01,0xb4,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x6f,0x15,0x06,0x54, 0x01,0xd4,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x71,0x25,0x06,0x54, 0x01,0xe4,0x10,0x00,0x02,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x73,0x35,0x06,0x54, 0x01,0xf4,0x10,0x00,0x02,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x4d,0x05,0x4d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x57,0x05,0x57,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x61,0x05,0x61,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x6b,0x05,0x6b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x51,0x05,0x51,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x53,0x05,0x53,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x55,0x05,0x55,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5b,0x05,0x5b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5d,0x05,0x5d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x5f,0x05,0x5f,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x65,0x05,0x65,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x67,0x05,0x67,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x69,0x05,0x69,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x6f,0x05,0x6f,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x71,0x05,0x71,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x60,0x16,0x05,0x73,0x05,0x73,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x4f,0x05,0x4d,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x59,0x05,0x57,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x63,0x05,0x61,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00,0x90,0x09,0x05,0x6d,0x05,0x6b,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x4f,0x04,0x4d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x02,0x00,0x90,0x09,0x05,0x50,0x84,0x4f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x4f,0x04,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x50,0x84,0x51,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x50,0x84,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x4d,0x04,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x50,0x84,0x55,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x4d,0x04,0x56,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x59,0x04,0x57,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x5a,0x84,0x59,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x59,0x04,0x5b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x5a,0x84,0x5b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x5a,0x84,0x5d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x57,0x04,0x5e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x5a,0x84,0x5f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x57,0x04,0x60,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x63,0x04,0x61,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x64,0x84,0x63,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x63,0x04,0x65,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x64,0x84,0x65,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x64,0x84,0x67,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x61,0x04,0x68,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x64,0x84,0x69,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x61,0x04,0x6a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6d,0x04,0x6b,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6e,0x84,0x6d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6d,0x04,0x6f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6e,0x84,0x6f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6e,0x84,0x71,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6b,0x04,0x72,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6e,0x84,0x73,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6b,0x04,0x74,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x4d,0x04,0x4e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x4d,0x04,0x52,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x4f,0x04,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x4f,0x04,0x55,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x57,0x04,0x58,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x57,0x04,0x5c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x59,0x04,0x5d,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x59,0x04,0x5f,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x61,0x04,0x62,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x61,0x04,0x66,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x63,0x04,0x67,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x63,0x04,0x69,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6b,0x04,0x6c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6b,0x04,0x70,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6d,0x04,0x71,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6d,0x04,0x73,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x4e,0x84,0x4e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x4e,0x84,0x52,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x58,0x84,0x58,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x58,0x84,0x5c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x62,0x84,0x62,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x62,0x84,0x66,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x05,0x6c,0x84,0x6c,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x45,0x6c,0x84,0x70,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x4e,0x84,0x54,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x4e,0x84,0x56,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x58,0x84,0x5e,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x58,0x84,0x60,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x62,0x84,0x68,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x62,0x84,0x6a,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0x85,0x6c,0x84,0x72,0x20, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x90,0x09,0xc5,0x6c,0x84,0x74,0x20, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x4f,0x05,0x4f,0x46, 0x05,0x05,0x4f,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x59,0x05,0x59,0x46, 0x05,0x05,0x59,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x63,0x05,0x63,0x46, 0x05,0x05,0x63,0x46,0x00,0x41,0x00,0x05,0x00,0x50,0x05,0x05,0x6d,0x05,0x6d,0x46, 0x05,0x05,0x6d,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x4d,0x05,0x4d,0x46, 0x05,0x05,0x4d,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x57,0x05,0x57,0x46, 0x05,0x05,0x57,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x61,0x05,0x61,0x46, 0x05,0x05,0x61,0x46,0x00,0x41,0x07,0x05,0x00,0x50,0x05,0x05,0x6b,0x05,0x6b,0x46, 0x05,0x05,0x6b,0x46,0x00,0x40,0x04,0x03,0x00,0x60,0x01,0x05,0x75,0x05,0x4d,0x54, 0x01,0x05,0x4f,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x0e,0x45,0x4d,0x54, 0x01,0x45,0x4f,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x11,0x85,0x4d,0x54, 0x01,0x85,0x4f,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x14,0xc5,0x4d,0x54, 0x01,0xc5,0x4f,0x54,0x00,0x40,0x07,0x03,0x00,0x60,0x01,0x05,0x17,0x05,0x57,0x54, 0x01,0x05,0x59,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1a,0x45,0x57,0x54, 0x01,0x45,0x59,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x1d,0x85,0x57,0x54, 0x01,0x85,0x59,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x20,0xc5,0x57,0x54, 0x01,0xc5,0x59,0x54,0x00,0x40,0x07,0x03,0x00,0x60,0x01,0x05,0x23,0x05,0x61,0x54, 0x01,0x05,0x63,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x26,0x45,0x61,0x54, 0x01,0x45,0x63,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x29,0x85,0x61,0x54, 0x01,0x85,0x63,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x2c,0xc5,0x61,0x54, 0x01,0xc5,0x63,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x2f,0x05,0x6b,0x54, 0x01,0x05,0x6d,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x32,0x45,0x6b,0x54, 0x01,0x45,0x6d,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x35,0x85,0x6b,0x54, 0x01,0x85,0x6d,0x54,0x00,0x40,0x00,0x03,0x00,0x60,0x01,0x05,0x38,0xc5,0x6b,0x54, 0x01,0xc5,0x6d,0x54,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x76,0x85,0x75,0x34, 0x06,0x05,0x75,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x0f,0x85,0x0e,0x34, 0x06,0x05,0x0e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x12,0x85,0x11,0x34, 0x06,0x05,0x11,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x15,0x85,0x14,0x34, 0x06,0x05,0x14,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x18,0x85,0x17,0x34, 0x06,0x05,0x17,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1b,0x85,0x1a,0x34, 0x06,0x05,0x1a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x1e,0x85,0x1d,0x34, 0x06,0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x21,0x85,0x20,0x34, 0x06,0x05,0x20,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x24,0x85,0x23,0x34, 0x06,0x05,0x23,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x27,0x85,0x26,0x34, 0x06,0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x2a,0x85,0x29,0x34, 0x06,0x05,0x29,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x2d,0x85,0x2c,0x34, 0x06,0x05,0x2c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x30,0x85,0x2f,0x34, 0x06,0x05,0x2f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x33,0x85,0x32,0x34, 0x06,0x05,0x32,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x36,0x85,0x35,0x34, 0x06,0x05,0x35,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x06,0x05,0x39,0x85,0x38,0x34, 0x06,0x05,0x38,0x34,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x01,0x45,0x76,0x22, 0x06,0x05,0x76,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x10,0x45,0x0f,0x22, 0x06,0x05,0x0f,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x13,0x45,0x12,0x22, 0x06,0x05,0x12,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x16,0x45,0x15,0x22, 0x06,0x05,0x15,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x19,0x45,0x18,0x22, 0x06,0x05,0x18,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x1c,0x45,0x1b,0x22, 0x06,0x05,0x1b,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x1f,0x45,0x1e,0x22, 0x06,0x05,0x1e,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x22,0x45,0x21,0x22, 0x06,0x05,0x21,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x25,0x45,0x24,0x22, 0x06,0x05,0x24,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x28,0x45,0x27,0x22, 0x06,0x05,0x27,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2b,0x45,0x2a,0x22, 0x06,0x05,0x2a,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x2e,0x45,0x2d,0x22, 0x06,0x05,0x2d,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x31,0x45,0x30,0x22, 0x06,0x05,0x30,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x34,0x45,0x33,0x22, 0x06,0x05,0x33,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x37,0x45,0x36,0x22, 0x06,0x05,0x36,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x06,0x05,0x3a,0x45,0x39,0x22, 0x06,0x05,0x39,0x22,0x00,0x40,0x00,0x0c,0xa8,0x12,0x01,0x11,0x01,0x40,0x00,0x00, 0x00,0x60,0x06,0x25,0x0c,0x04,0x10,0x00,0x06,0x24,0x10,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x45,0x0c,0x04,0x13,0x00,0x06,0x24,0x13,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x65,0x0c,0x04,0x16,0x00,0x06,0x24,0x16,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0x85,0x0c,0x04,0x19,0x00,0x06,0x24,0x19,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xa5,0x0c,0x04,0x1c,0x00,0x06,0x24,0x1c,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xc5,0x0c,0x04,0x1f,0x00,0x06,0x24,0x1f,0x00,0x00,0x40,0x00,0x00, 0x00,0x60,0x06,0xe5,0x0c,0x04,0x22,0x00,0x06,0x24,0x22,0x00,0x00,0x40,0x00,0x0d, 0xa8,0x12,0x25,0x11,0x25,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x0d,0x04,0x28,0x00, 0x06,0x24,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x0d,0x04,0x2b,0x00, 0x06,0x24,0x2b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x0d,0x04,0x2e,0x00, 0x06,0x24,0x2e,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x0d,0x04,0x31,0x00, 0x06,0x24,0x31,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x0d,0x04,0x34,0x00, 0x06,0x24,0x34,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x0d,0x04,0x37,0x00, 0x06,0x24,0x37,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x0d,0x04,0x3a,0x00, 0x06,0x24,0x3a,0x00,0x00,0x61,0x00,0x45,0xa8,0x00,0x00,0x81,0x40,0x68,0x02,0x04, 0x00,0x20,0x82,0x05,0x0c,0x05,0x0c,0x46,0x01,0x04,0x00,0x04,0x00,0x61,0x00,0x02, 0x00,0x50,0x00,0x05,0x13,0xb5,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x02,0x3b, 0x60,0x06,0x0c,0x00,0x00,0x41,0x95,0x3f,0x20,0x00,0x3b,0x00,0x3d,0x41,0x00,0x3b, 0xe0,0x00,0x3b,0x00,0x40,0x38,0xa7,0x04,0x00,0xa0,0x2a,0x05,0x3f,0x05,0x3f,0x46, 0x30,0x00,0x00,0x00,0x00,0x41,0x96,0x3b,0x20,0x00,0x3b,0x00,0x41,0x61,0x00,0x02, 0x00,0x50,0x00,0x05,0x51,0x0d,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x38,0xa8,0x04, 0x00,0xa0,0x2a,0x05,0x3b,0x05,0x3b,0x46,0x30,0x00,0x00,0x00,0x00,0x01,0x28,0x00, 0xe8,0x01,0x00,0x11,0x00,0x40,0x27,0x43,0x20,0x00,0x3f,0x00,0x3b,0x61,0x00,0x02, 0x00,0x50,0x00,0x05,0x5a,0x1d,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x43, 0x20,0x00,0x43,0x10,0x45,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x62,0x2d,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x38,0xa9,0x04,0x00,0xa0,0x0a,0x05,0x48,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x14,0x2d,0x05,0x52, 0x05,0x05,0x13,0x34,0x00,0x40,0x06,0x02,0x00,0x60,0x00,0x05,0x52,0x1d,0x04,0x52, 0x05,0x05,0x51,0x34,0x00,0x40,0x05,0x02,0x00,0x60,0x00,0x05,0x5b,0x2d,0x04,0x52, 0x05,0x05,0x5a,0x34,0x00,0x40,0x04,0x02,0x00,0x60,0x00,0x05,0x63,0x3d,0x04,0x52, 0x05,0x05,0x62,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x16,0xad,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x02,0x00,0x60,0x00,0x05,0x14,0x3d,0x05,0x52, 0x06,0x05,0x14,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x54,0x8d,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x65,0xad,0x03,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x72,0x95,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5d,0x9d,0x03,0x52, 0x00,0x00,0x00,0x00,0x00,0x38,0x4a,0x04,0x00,0xa0,0x0a,0x05,0x4c,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x52,0x95,0x03,0x52, 0x06,0x05,0x52,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x5b,0xa5,0x03,0x52, 0x06,0x05,0x5b,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x63,0xb5,0x03,0x52, 0x06,0x05,0x63,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x1b,0xc5,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x38,0x4b,0x04,0x00,0xa0,0x0a,0x05,0x46,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x17,0xbd,0x04,0x52, 0x05,0x05,0x16,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x14,0xb5,0x05,0x52, 0x06,0x05,0x14,0x34,0x00,0x41,0x29,0x4a,0x20,0x00,0x3f,0x00,0x48,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x55,0x9d,0x04,0x52,0x05,0x05,0x54,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x66,0xad,0x04,0x52,0x05,0x05,0x65,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x73,0x0d,0x05,0x52,0x05,0x05,0x72,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x5e,0x9d,0x04,0x52,0x05,0x05,0x5d,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x52,0x95,0x04,0x52,0x06,0x05,0x52,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x5b,0xa5,0x04,0x52,0x06,0x05,0x5b,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x63,0xb5,0x04,0x52,0x06,0x05,0x63,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x1c,0x3d,0x05,0x52,0x05,0x05,0x1b,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x17,0xad,0x05,0x52,0x06,0x05,0x17,0x34,0x00,0x61,0x07,0x02, 0x00,0xa0,0x06,0x05,0x15,0x05,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0x50,0x00,0x05,0x23,0x95,0x05,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x56,0x8d,0x03,0x52,0x06,0x05,0x55,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x66,0xbd,0x03,0x52,0x06,0x05,0x66,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x73,0x1d,0x05,0x52,0x06,0x05,0x73,0x34,0x00,0x40,0x07,0x02, 0x00,0x60,0x00,0x05,0x5e,0xad,0x03,0x52,0x06,0x05,0x5e,0x34,0x00,0x61,0x07,0x02, 0x00,0xa0,0x06,0x05,0x53,0x05,0x52,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0xa0,0x06,0x05,0x5c,0x05,0x5b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0xa0,0x06,0x05,0x64,0x05,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x00,0x05,0x12,0x35,0x05,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0x50,0x00,0x05,0x1e,0xbd,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02, 0x00,0x60,0x00,0x05,0x1c,0x4d,0x05,0x52,0x06,0x05,0x1c,0x34,0x00,0x40,0x00,0x02, 0x00,0x60,0x00,0x05,0x17,0xbd,0x05,0x52,0x06,0x05,0x17,0x34,0x00,0x41,0x00,0x02, 0x00,0xa0,0x0a,0x05,0x15,0xc4,0x4a,0x00,0x0a,0x05,0x15,0x34,0x00,0x61,0x00,0x02, 0x00,0xa0,0x00,0x05,0x50,0x15,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x00,0x05,0x59,0x25,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x00,0x05,0x61,0x35,0x04,0x52,0x00,0x00,0x00,0x00,0x00,0x41,0x2a,0x4e, 0x20,0x00,0x3b,0x00,0x4c,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x24,0x0d,0x06,0x52, 0x05,0x05,0x23,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x56,0x9d,0x03,0x52, 0x06,0x05,0x56,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x66,0xbd,0x04,0x52, 0x06,0x05,0x66,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x73,0x95,0x05,0x52, 0x06,0x05,0x73,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5e,0xad,0x04,0x52, 0x06,0x05,0x5e,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x53,0x04,0x4a,0x00, 0x0a,0x05,0x53,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x5c,0x24,0x4a,0x00, 0x0a,0x05,0x5c,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x64,0x44,0x4a,0x00, 0x0a,0x05,0x64,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x6a,0x3d,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1f,0xcd,0x04,0x52, 0x05,0x05,0x1e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1c,0xc5,0x05,0x52, 0x06,0x05,0x1c,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x18,0x05,0x17,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x2b,0x02,0x00,0xa0,0x0a,0x04,0x12,0x05,0x15,0x02, 0x0a,0x05,0x12,0xc4,0x46,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x26,0x8d,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x55,0x8d,0x05,0x52, 0x06,0x05,0x55,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x24,0x1d,0x06,0x52, 0x06,0x05,0x24,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x57,0x05,0x56,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x67,0x05,0x66,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x74,0x05,0x73,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x5f,0x05,0x5e,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x50,0x05,0x53,0x02, 0x0a,0x05,0x50,0x04,0x46,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x59,0x05,0x5c,0x02, 0x0a,0x05,0x59,0x24,0x46,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x61,0x05,0x64,0x02, 0x0a,0x05,0x61,0x44,0x46,0x61,0x34,0x02,0x00,0x50,0x00,0x05,0x02,0xa5,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0x4d,0x04,0x52, 0x05,0x05,0x6a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1f,0xbd,0x05,0x52, 0x06,0x05,0x1f,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x1d,0x05,0x1c,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x18,0x05,0x12,0x02, 0x0a,0x05,0x18,0xc4,0x4e,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x71,0x15,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x27,0x9d,0x05,0x52, 0x05,0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x55,0x9d,0x05,0x52, 0x06,0x05,0x55,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x24,0x95,0x06,0x52, 0x06,0x05,0x24,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x74,0x84,0x4a,0x00, 0x0a,0x05,0x74,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x57,0x05,0x50,0x02, 0x0a,0x05,0x57,0x04,0x4e,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x5f,0x05,0x59,0x02, 0x0a,0x05,0x5f,0x24,0x4e,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x67,0x05,0x61,0x02, 0x0a,0x05,0x67,0x44,0x4e,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x6d,0xbd,0x03,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x1a,0x45,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0c,0x1d,0x05,0x52, 0x05,0x05,0x02,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0xc5,0x03,0x52, 0x06,0x05,0x6b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1f,0xcd,0x05,0x52, 0x06,0x05,0x1f,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x1d,0xe4,0x4a,0x00, 0x0a,0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x18,0x05,0x18,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x27,0x8d,0x06,0x52, 0x06,0x05,0x27,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x75,0x05,0x55,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x25,0x05,0x24,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x71,0x05,0x74,0x02, 0x0a,0x05,0x71,0x84,0x46,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x57,0x05,0x57,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x5f,0x05,0x5f,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x67,0x05,0x67,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x0e,0x9d,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x24,0x04,0x00,0x50,0x00,0x05,0x1b,0x85,0x0a,0x56, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0xbd,0x04,0x52, 0x05,0x05,0x6d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0c,0x2d,0x05,0x52, 0x06,0x05,0x0c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0xc5,0x04,0x52, 0x06,0x05,0x6b,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x20,0x05,0x1f,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x1a,0x05,0x1d,0x02, 0x0a,0x05,0x1a,0xe4,0x46,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x19,0x05,0x18,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x18,0x85,0x09,0x56, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x33,0xb5,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x36,0xad,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x22,0x15,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x2b,0xa5,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x2e,0x9d,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x3d,0xc5,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x42,0xbd,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5a,0x9d,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x62,0xad,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x52,0x8d,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x4d,0x95,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x6a,0xbd,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x27,0x9d,0x06,0x52, 0x06,0x05,0x27,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x25,0x04,0x4b,0x00, 0x0a,0x05,0x25,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x75,0x05,0x71,0x02, 0x0a,0x05,0x75,0x84,0x4e,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x58,0x05,0x57,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x60,0x05,0x5f,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x68,0x05,0x67,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x57,0xa5,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5f,0xb5,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x67,0xc5,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0f,0xad,0x04,0x52, 0x05,0x05,0x0e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0xcd,0x03,0x52, 0x06,0x05,0x6e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0c,0xa5,0x05,0x52, 0x06,0x05,0x0c,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x6c,0x05,0x6b,0x34, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x1c,0xa5,0x0a,0x56, 0x05,0x05,0x1b,0x58,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x20,0x05,0x1a,0x02, 0x0a,0x05,0x20,0xe4,0x4e,0x61,0x00,0x01,0x00,0x40,0x04,0xa5,0x78,0x04,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xe5,0x78,0x44,0x19,0x30, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x19,0xa5,0x09,0x56, 0x05,0x05,0x18,0x58,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x34,0x2d,0x06,0x52, 0x05,0x05,0x33,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x37,0xbd,0x05,0x52, 0x05,0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2c,0x1d,0x06,0x52, 0x05,0x05,0x2b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2f,0xad,0x05,0x52, 0x05,0x05,0x2e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0x3d,0x06,0x52, 0x05,0x05,0x3d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x45,0xcd,0x05,0x52, 0x05,0x05,0x42,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5b,0xad,0x06,0x52, 0x05,0x05,0x5a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x63,0xbd,0x06,0x52, 0x05,0x05,0x62,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0x9d,0x06,0x52, 0x05,0x05,0x52,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x50,0x0d,0x07,0x52, 0x05,0x05,0x4d,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x28,0x05,0x27,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x22,0x05,0x25,0x02, 0x0a,0x05,0x22,0x04,0x47,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x75,0x05,0x75,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x61,0x00,0x01,0x00,0x40,0x04,0x05,0x78,0x04,0x58,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x45,0x78,0x44,0x58,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x15,0x78,0x04,0x60,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x55,0x78,0x44,0x60,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x25,0x78,0x04,0x68,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x65,0x78,0x44,0x68,0x30, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0xcd,0x06,0x52, 0x05,0x05,0x6a,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x58,0x1d,0x07,0x52, 0x05,0x05,0x57,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x60,0x2d,0x07,0x52, 0x05,0x05,0x5f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x68,0x3d,0x07,0x52, 0x05,0x05,0x67,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x69,0x45,0x04,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0f,0x9d,0x05,0x52, 0x06,0x05,0x0f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0xcd,0x04,0x52, 0x06,0x05,0x6e,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x0d,0x05,0x0c,0x34, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x6c,0x64,0x4a,0x00, 0x0a,0x05,0x6c,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x1c,0x15,0x0a,0x56, 0x06,0x05,0x1c,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x19,0x15,0x09,0x56, 0x06,0x05,0x19,0x46,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x34,0x3d,0x06,0x52, 0x06,0x05,0x34,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x37,0xad,0x06,0x52, 0x06,0x05,0x37,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2c,0x2d,0x06,0x52, 0x06,0x05,0x2c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2f,0x9d,0x06,0x52, 0x06,0x05,0x2f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0x4d,0x06,0x52, 0x06,0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x45,0xbd,0x06,0x52, 0x06,0x05,0x45,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5b,0x9d,0x07,0x52, 0x06,0x05,0x5b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x63,0xad,0x07,0x52, 0x06,0x05,0x63,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0x8d,0x07,0x52, 0x06,0x05,0x53,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x50,0x1d,0x07,0x52, 0x06,0x05,0x50,0x34,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x25,0x05,0x0a,0x56, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x28,0x05,0x22,0x02, 0x0a,0x05,0x28,0x04,0x4f,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x76,0x05,0x75,0x34, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0xbd,0x07,0x52, 0x06,0x05,0x6b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x58,0x2d,0x07,0x52, 0x06,0x05,0x58,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x60,0x3d,0x07,0x52, 0x06,0x05,0x60,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x68,0x4d,0x07,0x52, 0x06,0x05,0x68,0x34,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x22,0x05,0x09,0x56, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x85,0x01,0x25,0x05,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x0f,0xad,0x05,0x52, 0x06,0x05,0x0f,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x6f,0x05,0x6e,0x34, 0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x0d,0xa4,0x4a,0x00, 0x0a,0x05,0x0d,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x69,0x05,0x6c,0x02, 0x0a,0x05,0x69,0x64,0x46,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x4c,0x15,0x07,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x56,0x25,0x07,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x66,0x45,0x07,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x5e,0x35,0x07,0x52, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x20,0x05,0x20,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x38,0x4c,0x03,0x00,0xa0,0x0a,0x05,0x04,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x34,0xb5,0x06,0x52, 0x06,0x05,0x34,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x37,0xbd,0x06,0x52, 0x06,0x05,0x37,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2c,0xa5,0x06,0x52, 0x06,0x05,0x2c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2f,0xad,0x06,0x52, 0x06,0x05,0x2f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0xc5,0x06,0x52, 0x06,0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x45,0xcd,0x06,0x52, 0x06,0x05,0x45,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5b,0xad,0x07,0x52, 0x06,0x05,0x5b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x63,0xbd,0x07,0x52, 0x06,0x05,0x63,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x53,0x9d,0x07,0x52, 0x06,0x05,0x53,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x50,0x95,0x07,0x52, 0x06,0x05,0x50,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x26,0x25,0x0a,0x56, 0x05,0x05,0x25,0x58,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x85,0x78,0x04,0x76,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xc5,0x78,0x44,0x76,0x30, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6b,0xcd,0x07,0x52, 0x06,0x05,0x6b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x58,0xa5,0x07,0x52, 0x06,0x05,0x58,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x60,0xb5,0x07,0x52, 0x06,0x05,0x60,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x68,0xc5,0x07,0x52, 0x06,0x05,0x68,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x23,0x25,0x09,0x56, 0x05,0x05,0x22,0x58,0x00,0x38,0xed,0x03,0x00,0xa0,0x0a,0x05,0x76,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x1c,0x15,0x0b,0x56, 0x06,0x05,0x1c,0x46,0x00,0x38,0xbe,0x03,0x00,0xa0,0x0a,0x05,0x07,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x19,0x15,0x0a,0x56, 0x06,0x05,0x19,0x46,0x00,0x38,0x4f,0x03,0x00,0xa0,0x0a,0x05,0x08,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x10,0x05,0x0f,0x34, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x84,0x01,0x05,0x0d,0x02, 0x0a,0x85,0x01,0xa4,0x46,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x6f,0x05,0x69,0x02, 0x0a,0x05,0x6f,0x64,0x4e,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x21,0x05,0x20,0x34, 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x03,0x00,0xa0,0x0a,0x05,0x74,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x38,0x43,0x03,0x00,0xa0,0x0a,0x05,0x71,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x2d,0x05,0x2c,0x34, 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x03,0x00,0xa0,0x0a,0x05,0x75,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x26,0x05,0x0b,0x56, 0x06,0x05,0x26,0x46,0x00,0x38,0x45,0x03,0x00,0xa0,0x0a,0x05,0x6e,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x07,0x04,0x00,0x60,0x00,0x05,0x23,0x05,0x0a,0x56, 0x06,0x05,0x23,0x46,0x00,0x5b,0x06,0x02,0x00,0xa0,0x0a,0x04,0x10,0x85,0x01,0x02, 0x0a,0x05,0x10,0xa4,0x4e,0x40,0x06,0x02,0x00,0xa0,0x8a,0x05,0x6f,0x05,0x6f,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x32,0x35,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x2a,0x25,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x3a,0x45,0x06,0x52, 0x00,0x00,0x00,0x00,0x00,0x41,0x2d,0x03,0x00,0xa0,0x0a,0x26,0x02,0x05,0x3f,0x46, 0x0a,0x05,0x76,0x46,0x00,0x61,0x00,0x1e,0xa0,0x07,0x19,0x00,0x00,0x61,0x07,0x01, 0x00,0x40,0x04,0xb5,0x78,0x04,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xf5,0x78,0x44,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x41,0x2c,0x03, 0x00,0xa0,0x0a,0x26,0x05,0x05,0x40,0x46,0x0a,0x05,0x04,0x46,0x00,0x41,0x2e,0x03, 0x00,0xa0,0x0a,0x06,0x02,0x05,0x3f,0x46,0x0a,0x05,0x07,0x46,0x00,0x61,0x00,0x20, 0xa0,0x07,0x1c,0x00,0x00,0x41,0x2f,0x03,0x00,0xa0,0x0a,0x06,0x05,0x05,0x40,0x46, 0x0a,0x05,0x08,0x46,0x00,0x38,0x46,0x03,0x00,0xa0,0x0a,0x05,0x13,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x28,0x05,0x28,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x38,0x47,0x03,0x00,0xa0,0x0a,0x05,0x12,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x2d,0x24,0x4b,0x00, 0x0a,0x05,0x2d,0x34,0x00,0x38,0x48,0x03,0x00,0xa0,0x0a,0x05,0x0c,0x05,0x43,0x46, 0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x10,0x05,0x10,0x34, 0x0a,0x00,0x00,0x00,0x3f,0x38,0x49,0x03,0x00,0xa0,0x0a,0x05,0x0f,0x05,0x44,0x46, 0x10,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x70,0x05,0x6f,0x34, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x26,0x25,0x0b,0x56, 0x06,0x05,0x26,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x23,0x25,0x0a,0x56, 0x06,0x05,0x23,0x46,0x00,0x41,0x07,0x02,0x20,0x00,0x02,0x00,0x1e,0x41,0x07,0x05, 0x20,0x00,0x05,0x00,0x20,0x61,0x00,0x04,0x00,0xa0,0x00,0x01,0x20,0x95,0x0a,0x56, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0xa0,0x00,0x05,0x14,0x95,0x09,0x56, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x35,0x05,0x34,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x30,0x05,0x2f,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x41,0x05,0x3e,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x51,0x05,0x50,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x59,0x05,0x58,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x61,0x05,0x60,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x69,0x05,0x68,0x34, 0x00,0x00,0x00,0x00,0x00,0x61,0x23,0x72,0x21,0x64,0x71,0x00,0x00,0x61,0x00,0x02, 0x00,0x60,0x0a,0x05,0x29,0x05,0x28,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x2a,0x05,0x2d,0x02,0x0a,0x05,0x2a,0x24,0x47,0x61,0x00,0x02, 0x00,0x60,0x0a,0x05,0x11,0x05,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x35,0x78,0x04,0x70,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x75,0x78,0x44,0x70,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x24,0x72, 0x21,0x04,0x75,0x00,0x00,0x61,0x25,0x6f,0x21,0x64,0x6e,0x00,0x00,0x61,0x20,0x6f, 0x21,0x04,0x74,0x00,0x00,0x41,0x28,0x03,0x00,0xa0,0x0a,0x26,0x0d,0x05,0x3b,0x46, 0x0a,0x05,0x0c,0x46,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x35,0x44,0x4b,0x00, 0x0a,0x05,0x35,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x41,0x64,0x4b,0x00, 0x0a,0x05,0x41,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x51,0x84,0x4b,0x00, 0x0a,0x05,0x51,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x59,0xa4,0x4b,0x00, 0x0a,0x05,0x59,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x61,0xc4,0x4b,0x00, 0x0a,0x05,0x61,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x69,0xe4,0x4b,0x00, 0x0a,0x05,0x69,0x34,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x05,0x79,0x04,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x45,0x79,0x44,0x29,0x30, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x30,0x05,0x2a,0x02, 0x0a,0x05,0x30,0x24,0x4f,0x61,0x00,0x01,0x00,0x40,0x04,0x95,0x78,0x04,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0xd5,0x78,0x44,0x11,0x30, 0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x72,0xa0,0x01,0x05,0x72,0x20,0x41,0x27,0x03, 0x00,0xa0,0x0a,0x06,0x0d,0x05,0x3b,0x46,0x0a,0x05,0x12,0x46,0x00,0x5b,0x00,0x6f, 0xa0,0x00,0x02,0x6f,0x14,0x61,0x00,0x04,0x00,0xa0,0x06,0x01,0x20,0x05,0x23,0x46, 0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x2a,0xa0,0x07,0x26,0x00,0x00,0x41,0x29,0x03, 0x00,0xa0,0x0a,0x26,0x10,0x05,0x3c,0x46,0x0a,0x05,0x0f,0x46,0x00,0x41,0x26,0x03, 0x00,0xa0,0x0a,0x06,0x10,0x05,0x3c,0x46,0x0a,0x05,0x13,0x46,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x38,0x05,0x37,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x48,0x05,0x45,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x5c,0x05,0x5b,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x64,0x05,0x63,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x54,0x05,0x53,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02, 0x00,0xa0,0x06,0x05,0x6c,0x05,0x6b,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x32,0x05,0x35,0x02,0x0a,0x05,0x32,0x44,0x47,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x3a,0x05,0x41,0x02,0x0a,0x05,0x3a,0x64,0x47,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x4c,0x05,0x51,0x02,0x0a,0x05,0x4c,0x84,0x47,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x56,0x05,0x59,0x02,0x0a,0x05,0x56,0xa4,0x47,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x5e,0x05,0x61,0x02,0x0a,0x05,0x5e,0xc4,0x47,0x5b,0x00,0x02, 0x00,0xa0,0x0a,0x04,0x66,0x05,0x69,0x02,0x0a,0x05,0x66,0xe4,0x47,0x5b,0x00,0x20, 0xaa,0x01,0x6f,0x0d,0x20,0x5b,0x00,0x10,0xa0,0x00,0x72,0x10,0x2a,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x38,0x05,0x32,0x02,0x0a,0x05,0x38,0x44,0x4f,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x48,0x05,0x3a,0x02,0x0a,0x05,0x48,0x64,0x4f,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x54,0x05,0x4c,0x02,0x0a,0x05,0x54,0x84,0x4f,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x5c,0x05,0x56,0x02,0x0a,0x05,0x5c,0xa4,0x4f,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x64,0x05,0x5e,0x02,0x0a,0x05,0x64,0xc4,0x4f,0x5b,0x07,0x02, 0x00,0xa0,0x0a,0x04,0x6c,0x05,0x66,0x02,0x0a,0x05,0x6c,0xe4,0x4f,0x40,0x00,0x0d, 0xe0,0x02,0x20,0x00,0x3f,0x40,0x07,0x10,0xe0,0x00,0x10,0x00,0x3f,0x40,0x00,0x02, 0x00,0xa0,0x8a,0x05,0x30,0x05,0x30,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x38,0x05,0x38,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x48,0x05,0x48,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x54,0x05,0x54,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x5c,0x05,0x5c,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x64,0x05,0x64,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x07,0x02, 0x00,0xa0,0x8a,0x05,0x6c,0x05,0x6c,0x34,0x0a,0x00,0x00,0x00,0x3f,0x61,0x07,0x2c, 0xe0,0x05,0x0d,0x00,0x00,0x61,0x07,0x2e,0xe0,0x05,0x10,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x31,0x05,0x30,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x39,0x05,0x38,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x49,0x05,0x48,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x55,0x05,0x54,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x5d,0x05,0x5c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x65,0x05,0x64,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02, 0x00,0x60,0x0a,0x05,0x6d,0x05,0x6c,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04, 0x00,0x40,0x04,0x05,0x7a,0x04,0x2c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x04, 0x00,0x40,0x04,0x85,0x7a,0x04,0x2e,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x01, 0x00,0x40,0x04,0x15,0x79,0x04,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x55,0x79,0x44,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x01, 0x00,0x40,0x04,0x25,0x79,0x04,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x65,0x79,0x44,0x39,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x01, 0x00,0x40,0x04,0x35,0x79,0x04,0x49,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x75,0x79,0x44,0x49,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x85,0x79,0x04,0x55,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xc5,0x79,0x44,0x55,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0x95,0x79,0x04,0x5d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xd5,0x79,0x44,0x5d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xa5,0x79,0x04,0x65,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xe5,0x79,0x44,0x65,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xb5,0x79,0x04,0x6d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01, 0x00,0x40,0x04,0xf5,0x79,0x44,0x6d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x32,0x02, 0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00, 0x02,0x00,0x80,0x0a,0x02,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00, 0x00,0x07,0x00,0x07,0x00,0x61,0x00,0x02,0x62,0x00,0x77,0x01,0x00,0x61,0x00,0x02, 0x62,0xc8,0x77,0x01,0x00,0x61,0x00,0x7f,0x64,0x00,0x00,0x00,0x00,0x01,0x21,0x00, 0xe8,0x01,0x00,0x11,0x00,0x31,0xaa,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00, 0xc0,0x14,0x78,0x00,0x00,0x61,0x3a,0x00,0x80,0xa0,0x4a,0x45,0x02,0x00,0x00,0x00, 0x00,0x07,0x00,0x03,0x00,0x61,0x00,0x00,0x80,0xa0,0x0a,0x25,0x02,0x44,0x77,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00, 0x02,0x01,0x80,0x0a,0x02,0x01,0x22,0x00,0xe8,0x01,0x00,0x11,0x00,0x31,0xab,0x03, 0x80,0x00,0x00,0x01,0x00,0x04,0x02,0x00,0xc0,0x0c,0x7a,0x00,0x00,0x31,0x04,0x03, 0x80,0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x22,0x02,0x00, 0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72, 0x5f,0x38,0x78,0x38,0x5f,0x59,0x56,0x31,0x32,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74, 0x68,0x72,0x65,0x61,0x64,0x5f,0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79, 0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75, 0x70,0x5f,0x69,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f, 0x7a,0x00,0x74,0x73,0x63,0x00,0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74, 0x76,0x61,0x6c,0x00,0x73,0x70,0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00, 0x73,0x72,0x30,0x00,0x63,0x72,0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30, 0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00, 0x54,0x53,0x53,0x00,0x54,0x32,0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33, 0x31,0x00,0x56,0x33,0x32,0x00,0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33, 0x35,0x00,0x56,0x33,0x36,0x00,0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33, 0x39,0x00,0x56,0x34,0x30,0x00,0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34, 0x33,0x00,0x56,0x34,0x34,0x00,0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34, 0x37,0x00,0x56,0x34,0x38,0x00,0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35, 0x31,0x00,0x56,0x35,0x32,0x00,0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35, 0x35,0x00,0x56,0x35,0x36,0x00,0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35, 0x39,0x00,0x56,0x36,0x30,0x00,0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36, 0x33,0x00,0x56,0x36,0x34,0x00,0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36, 0x37,0x00,0x56,0x36,0x38,0x00,0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37, 0x31,0x00,0x56,0x37,0x32,0x00,0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37, 0x35,0x00,0x56,0x37,0x36,0x00,0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37, 0x39,0x00,0x56,0x38,0x30,0x00,0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38, 0x33,0x00,0x56,0x38,0x34,0x00,0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38, 0x37,0x00,0x56,0x38,0x38,0x00,0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39, 0x31,0x00,0x56,0x39,0x32,0x00,0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39, 0x35,0x00,0x56,0x39,0x36,0x00,0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39, 0x39,0x00,0x56,0x31,0x30,0x30,0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32, 0x00,0x56,0x31,0x30,0x33,0x00,0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00, 0x56,0x31,0x30,0x36,0x00,0x56,0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00,0x56, 0x31,0x30,0x39,0x00,0x56,0x31,0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56,0x31, 0x31,0x32,0x00,0x56,0x31,0x31,0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31,0x31, 0x35,0x00,0x56,0x31,0x31,0x36,0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x38, 0x00,0x56,0x31,0x31,0x39,0x00,0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31,0x00, 0x56,0x31,0x32,0x32,0x00,0x56,0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00,0x56, 0x31,0x32,0x35,0x00,0x56,0x31,0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56,0x31, 0x32,0x38,0x00,0x56,0x31,0x32,0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56,0x31,0x33, 0x31,0x00,0x56,0x31,0x33,0x32,0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31,0x33,0x34, 0x00,0x56,0x31,0x33,0x35,0x00,0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33,0x37,0x00, 0x56,0x31,0x33,0x38,0x00,0x56,0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30,0x00,0x56, 0x31,0x34,0x31,0x00,0x56,0x31,0x34,0x32,0x00,0x56,0x31,0x34,0x33,0x00,0x56,0x31, 0x34,0x34,0x00,0x56,0x31,0x34,0x35,0x00,0x56,0x31,0x34,0x36,0x00,0x56,0x31,0x34, 0x37,0x00,0x56,0x31,0x34,0x38,0x00,0x56,0x31,0x34,0x39,0x00,0x56,0x31,0x35,0x30, 0x00,0x56,0x31,0x35,0x31,0x00,0x56,0x31,0x35,0x32,0x00,0x56,0x31,0x35,0x33,0x00, 0x56,0x31,0x35,0x34,0x00,0x56,0x31,0x35,0x35,0x00,0x56,0x31,0x35,0x36,0x00,0x56, 0x31,0x35,0x37,0x00,0x56,0x31,0x35,0x38,0x00,0x56,0x31,0x35,0x39,0x00,0x56,0x31, 0x36,0x30,0x00,0x56,0x31,0x36,0x31,0x00,0x56,0x31,0x36,0x32,0x00,0x56,0x31,0x36, 0x33,0x00,0x56,0x31,0x36,0x34,0x00,0x56,0x31,0x36,0x35,0x00,0x56,0x31,0x36,0x36, 0x00,0x56,0x31,0x36,0x37,0x00,0x56,0x31,0x36,0x38,0x00,0x56,0x31,0x36,0x39,0x00, 0x56,0x31,0x37,0x30,0x00,0x56,0x31,0x37,0x31,0x00,0x56,0x31,0x37,0x32,0x00,0x56, 0x31,0x37,0x33,0x00,0x56,0x31,0x37,0x34,0x00,0x56,0x31,0x37,0x35,0x00,0x56,0x31, 0x37,0x36,0x00,0x56,0x31,0x37,0x37,0x00,0x56,0x31,0x37,0x38,0x00,0x56,0x31,0x37, 0x39,0x00,0x56,0x31,0x38,0x30,0x00,0x56,0x31,0x38,0x31,0x00,0x56,0x31,0x38,0x32, 0x00,0x56,0x31,0x38,0x33,0x00,0x56,0x31,0x38,0x34,0x00,0x56,0x31,0x38,0x35,0x00, 0x56,0x31,0x38,0x36,0x00,0x56,0x31,0x38,0x37,0x00,0x56,0x31,0x38,0x38,0x00,0x56, 0x31,0x38,0x39,0x00,0x56,0x31,0x39,0x30,0x00,0x56,0x31,0x39,0x31,0x00,0x56,0x31, 0x39,0x32,0x00,0x56,0x31,0x39,0x33,0x00,0x56,0x31,0x39,0x34,0x00,0x56,0x31,0x39, 0x35,0x00,0x56,0x31,0x39,0x36,0x00,0x56,0x31,0x39,0x37,0x00,0x56,0x31,0x39,0x38, 0x00,0x56,0x31,0x39,0x39,0x00,0x56,0x32,0x30,0x30,0x00,0x56,0x32,0x30,0x31,0x00, 0x56,0x32,0x30,0x32,0x00,0x56,0x32,0x30,0x33,0x00,0x56,0x32,0x30,0x34,0x00,0x56, 0x32,0x30,0x35,0x00,0x56,0x32,0x30,0x36,0x00,0x56,0x32,0x30,0x37,0x00,0x56,0x32, 0x30,0x38,0x00,0x56,0x32,0x30,0x39,0x00,0x56,0x32,0x31,0x30,0x00,0x56,0x32,0x31, 0x31,0x00,0x56,0x32,0x31,0x32,0x00,0x56,0x32,0x31,0x33,0x00,0x56,0x32,0x31,0x34, 0x00,0x56,0x32,0x31,0x35,0x00,0x56,0x32,0x31,0x36,0x00,0x56,0x32,0x31,0x37,0x00, 0x56,0x32,0x31,0x38,0x00,0x56,0x32,0x31,0x39,0x00,0x56,0x32,0x32,0x30,0x00,0x56, 0x32,0x32,0x31,0x00,0x56,0x32,0x32,0x32,0x00,0x56,0x32,0x32,0x33,0x00,0x56,0x32, 0x32,0x34,0x00,0x56,0x32,0x32,0x35,0x00,0x56,0x32,0x32,0x36,0x00,0x56,0x32,0x32, 0x37,0x00,0x56,0x32,0x32,0x38,0x00,0x56,0x32,0x32,0x39,0x00,0x56,0x32,0x33,0x30, 0x00,0x56,0x32,0x33,0x31,0x00,0x56,0x32,0x33,0x32,0x00,0x56,0x32,0x33,0x33,0x00, 0x56,0x32,0x33,0x34,0x00,0x56,0x32,0x33,0x35,0x00,0x56,0x32,0x33,0x36,0x00,0x56, 0x32,0x33,0x37,0x00,0x56,0x32,0x33,0x38,0x00,0x56,0x32,0x33,0x39,0x00,0x56,0x32, 0x34,0x30,0x00,0x56,0x32,0x34,0x31,0x00,0x56,0x32,0x34,0x32,0x00,0x56,0x32,0x34, 0x33,0x00,0x56,0x32,0x34,0x34,0x00,0x56,0x32,0x34,0x35,0x00,0x56,0x32,0x34,0x36, 0x00,0x56,0x32,0x34,0x37,0x00,0x56,0x32,0x34,0x38,0x00,0x56,0x32,0x34,0x39,0x00, 0x56,0x32,0x35,0x30,0x00,0x56,0x32,0x35,0x31,0x00,0x56,0x32,0x35,0x32,0x00,0x56, 0x32,0x35,0x33,0x00,0x56,0x32,0x35,0x34,0x00,0x56,0x32,0x35,0x35,0x00,0x56,0x32, 0x35,0x36,0x00,0x56,0x32,0x35,0x37,0x00,0x56,0x32,0x35,0x38,0x00,0x56,0x32,0x35, 0x39,0x00,0x56,0x32,0x36,0x30,0x00,0x56,0x32,0x36,0x31,0x00,0x56,0x32,0x36,0x32, 0x00,0x56,0x32,0x36,0x33,0x00,0x56,0x32,0x36,0x34,0x00,0x56,0x32,0x36,0x35,0x00, 0x56,0x32,0x36,0x36,0x00,0x56,0x32,0x36,0x37,0x00,0x56,0x32,0x36,0x38,0x00,0x56, 0x32,0x36,0x39,0x00,0x56,0x32,0x37,0x30,0x00,0x56,0x32,0x37,0x31,0x00,0x56,0x32, 0x37,0x32,0x00,0x56,0x32,0x37,0x33,0x00,0x56,0x32,0x37,0x34,0x00,0x56,0x32,0x37, 0x35,0x00,0x56,0x32,0x37,0x36,0x00,0x56,0x32,0x37,0x37,0x00,0x56,0x32,0x37,0x38, 0x00,0x56,0x32,0x37,0x39,0x00,0x56,0x32,0x38,0x30,0x00,0x56,0x32,0x38,0x31,0x00, 0x56,0x32,0x38,0x32,0x00,0x56,0x32,0x38,0x33,0x00,0x56,0x32,0x38,0x34,0x00,0x56, 0x32,0x38,0x35,0x00,0x56,0x32,0x38,0x36,0x00,0x56,0x32,0x38,0x37,0x00,0x56,0x32, 0x38,0x38,0x00,0x56,0x32,0x38,0x39,0x00,0x56,0x32,0x39,0x30,0x00,0x56,0x32,0x39, 0x31,0x00,0x56,0x32,0x39,0x32,0x00,0x56,0x32,0x39,0x33,0x00,0x56,0x32,0x39,0x34, 0x00,0x56,0x32,0x39,0x35,0x00,0x56,0x32,0x39,0x36,0x00,0x56,0x32,0x39,0x37,0x00, 0x56,0x32,0x39,0x38,0x00,0x56,0x32,0x39,0x39,0x00,0x56,0x33,0x30,0x30,0x00,0x56, 0x33,0x30,0x31,0x00,0x56,0x33,0x30,0x32,0x00,0x56,0x33,0x30,0x33,0x00,0x56,0x33, 0x30,0x34,0x00,0x56,0x33,0x30,0x35,0x00,0x56,0x33,0x30,0x36,0x00,0x56,0x33,0x30, 0x37,0x00,0x56,0x33,0x30,0x38,0x00,0x56,0x33,0x30,0x39,0x00,0x56,0x33,0x31,0x30, 0x00,0x56,0x33,0x31,0x31,0x00,0x56,0x33,0x31,0x32,0x00,0x56,0x33,0x31,0x33,0x00, 0x56,0x33,0x31,0x34,0x00,0x56,0x33,0x31,0x35,0x00,0x56,0x33,0x31,0x36,0x00,0x56, 0x33,0x31,0x37,0x00,0x56,0x33,0x31,0x38,0x00,0x56,0x33,0x31,0x39,0x00,0x56,0x33, 0x32,0x30,0x00,0x56,0x33,0x32,0x31,0x00,0x56,0x33,0x32,0x32,0x00,0x56,0x33,0x32, 0x33,0x00,0x56,0x33,0x32,0x34,0x00,0x56,0x33,0x32,0x35,0x00,0x56,0x33,0x32,0x36, 0x00,0x56,0x33,0x32,0x37,0x00,0x56,0x33,0x32,0x38,0x00,0x56,0x33,0x32,0x39,0x00, 0x56,0x33,0x33,0x30,0x00,0x56,0x33,0x33,0x31,0x00,0x56,0x33,0x33,0x32,0x00,0x56, 0x33,0x33,0x33,0x00,0x56,0x33,0x33,0x34,0x00,0x56,0x33,0x33,0x35,0x00,0x56,0x33, 0x33,0x36,0x00,0x56,0x33,0x33,0x37,0x00,0x56,0x33,0x33,0x38,0x00,0x56,0x33,0x33, 0x39,0x00,0x56,0x33,0x34,0x30,0x00,0x56,0x33,0x34,0x31,0x00,0x56,0x33,0x34,0x32, 0x00,0x56,0x33,0x34,0x33,0x00,0x56,0x33,0x34,0x34,0x00,0x56,0x33,0x34,0x35,0x00, 0x56,0x33,0x34,0x36,0x00,0x56,0x33,0x34,0x37,0x00,0x56,0x33,0x34,0x38,0x00,0x56, 0x33,0x34,0x39,0x00,0x56,0x33,0x35,0x30,0x00,0x56,0x33,0x35,0x31,0x00,0x56,0x33, 0x35,0x32,0x00,0x56,0x33,0x35,0x33,0x00,0x56,0x33,0x35,0x34,0x00,0x56,0x33,0x35, 0x35,0x00,0x56,0x33,0x35,0x36,0x00,0x56,0x33,0x35,0x37,0x00,0x56,0x33,0x35,0x38, 0x00,0x56,0x33,0x35,0x39,0x00,0x56,0x33,0x36,0x30,0x00,0x56,0x33,0x36,0x31,0x00, 0x56,0x33,0x36,0x32,0x00,0x56,0x33,0x36,0x33,0x00,0x56,0x33,0x36,0x34,0x00,0x56, 0x33,0x36,0x35,0x00,0x56,0x33,0x36,0x36,0x00,0x56,0x33,0x36,0x37,0x00,0x56,0x33, 0x36,0x38,0x00,0x56,0x33,0x36,0x39,0x00,0x56,0x33,0x37,0x30,0x00,0x56,0x33,0x37, 0x31,0x00,0x56,0x33,0x37,0x32,0x00,0x56,0x33,0x37,0x33,0x00,0x56,0x33,0x37,0x34, 0x00,0x56,0x33,0x37,0x35,0x00,0x56,0x33,0x37,0x36,0x00,0x56,0x33,0x37,0x37,0x00, 0x56,0x33,0x37,0x38,0x00,0x56,0x33,0x37,0x39,0x00,0x56,0x33,0x38,0x30,0x00,0x56, 0x33,0x38,0x31,0x00,0x56,0x33,0x38,0x32,0x00,0x56,0x33,0x38,0x33,0x00,0x56,0x33, 0x38,0x34,0x00,0x56,0x33,0x38,0x35,0x00,0x56,0x33,0x38,0x36,0x00,0x56,0x33,0x38, 0x37,0x00,0x56,0x33,0x38,0x38,0x00,0x56,0x33,0x38,0x39,0x00,0x56,0x33,0x39,0x30, 0x00,0x56,0x33,0x39,0x31,0x00,0x56,0x33,0x39,0x32,0x00,0x56,0x33,0x39,0x33,0x00, 0x56,0x33,0x39,0x34,0x00,0x56,0x33,0x39,0x35,0x00,0x56,0x33,0x39,0x36,0x00,0x56, 0x33,0x39,0x37,0x00,0x56,0x33,0x39,0x38,0x00,0x56,0x33,0x39,0x39,0x00,0x56,0x34, 0x30,0x30,0x00,0x56,0x34,0x30,0x31,0x00,0x56,0x34,0x30,0x32,0x00,0x56,0x34,0x30, 0x33,0x00,0x56,0x34,0x30,0x34,0x00,0x56,0x34,0x30,0x35,0x00,0x56,0x34,0x30,0x36, 0x00,0x56,0x34,0x30,0x37,0x00,0x56,0x34,0x30,0x38,0x00,0x56,0x34,0x30,0x39,0x00, 0x56,0x34,0x31,0x30,0x00,0x56,0x34,0x31,0x31,0x00,0x56,0x34,0x31,0x32,0x00,0x56, 0x34,0x31,0x33,0x00,0x56,0x34,0x31,0x34,0x00,0x56,0x34,0x31,0x35,0x00,0x56,0x34, 0x31,0x36,0x00,0x56,0x34,0x31,0x37,0x00,0x56,0x34,0x31,0x38,0x00,0x56,0x34,0x31, 0x39,0x00,0x56,0x34,0x32,0x30,0x00,0x56,0x34,0x32,0x31,0x00,0x56,0x34,0x32,0x32, 0x00,0x56,0x34,0x32,0x33,0x00,0x56,0x34,0x32,0x34,0x00,0x56,0x34,0x32,0x35,0x00, 0x56,0x34,0x32,0x36,0x00,0x56,0x34,0x32,0x37,0x00,0x56,0x34,0x32,0x38,0x00,0x56, 0x34,0x32,0x39,0x00,0x56,0x34,0x33,0x30,0x00,0x56,0x34,0x33,0x31,0x00,0x56,0x34, 0x33,0x32,0x00,0x56,0x34,0x33,0x33,0x00,0x56,0x34,0x33,0x34,0x00,0x56,0x34,0x33, 0x35,0x00,0x56,0x34,0x33,0x36,0x00,0x56,0x34,0x33,0x37,0x00,0x56,0x34,0x33,0x38, 0x00,0x56,0x34,0x33,0x39,0x00,0x56,0x34,0x34,0x30,0x00,0x56,0x34,0x34,0x31,0x00, 0x56,0x34,0x34,0x32,0x00,0x56,0x34,0x34,0x33,0x00,0x56,0x34,0x34,0x34,0x00,0x56, 0x34,0x34,0x35,0x00,0x56,0x34,0x34,0x36,0x00,0x56,0x34,0x34,0x37,0x00,0x56,0x34, 0x34,0x38,0x00,0x56,0x34,0x34,0x39,0x00,0x56,0x34,0x35,0x30,0x00,0x56,0x34,0x35, 0x31,0x00,0x56,0x34,0x35,0x32,0x00,0x56,0x34,0x35,0x33,0x00,0x56,0x34,0x35,0x34, 0x00,0x56,0x34,0x35,0x35,0x00,0x56,0x34,0x35,0x36,0x00,0x56,0x34,0x35,0x37,0x00, 0x56,0x34,0x35,0x38,0x00,0x56,0x34,0x35,0x39,0x00,0x56,0x34,0x36,0x30,0x00,0x56, 0x34,0x36,0x31,0x00,0x56,0x34,0x36,0x32,0x00,0x56,0x34,0x36,0x33,0x00,0x56,0x34, 0x36,0x34,0x00,0x56,0x34,0x36,0x35,0x00,0x56,0x34,0x36,0x36,0x00,0x56,0x34,0x36, 0x37,0x00,0x56,0x34,0x36,0x38,0x00,0x56,0x34,0x36,0x39,0x00,0x56,0x34,0x37,0x30, 0x00,0x56,0x34,0x37,0x31,0x00,0x56,0x34,0x37,0x32,0x00,0x56,0x34,0x37,0x33,0x00, 0x56,0x34,0x37,0x34,0x00,0x56,0x34,0x37,0x35,0x00,0x56,0x34,0x37,0x36,0x00,0x56, 0x34,0x37,0x37,0x00,0x56,0x34,0x37,0x38,0x00,0x56,0x34,0x37,0x39,0x00,0x56,0x34, 0x38,0x30,0x00,0x56,0x34,0x38,0x31,0x00,0x56,0x34,0x38,0x32,0x00,0x56,0x34,0x38, 0x33,0x00,0x56,0x34,0x38,0x34,0x00,0x56,0x34,0x38,0x35,0x00,0x56,0x34,0x38,0x36, 0x00,0x56,0x34,0x38,0x37,0x00,0x56,0x34,0x38,0x38,0x00,0x56,0x34,0x38,0x39,0x00, 0x56,0x34,0x39,0x30,0x00,0x56,0x34,0x39,0x31,0x00,0x56,0x34,0x39,0x32,0x00,0x56, 0x34,0x39,0x33,0x00,0x56,0x34,0x39,0x34,0x00,0x56,0x34,0x39,0x35,0x00,0x56,0x34, 0x39,0x36,0x00,0x56,0x34,0x39,0x37,0x00,0x56,0x34,0x39,0x38,0x00,0x56,0x34,0x39, 0x39,0x00,0x56,0x35,0x30,0x30,0x00,0x56,0x35,0x30,0x31,0x00,0x56,0x35,0x30,0x32, 0x00,0x56,0x35,0x30,0x33,0x00,0x56,0x35,0x30,0x34,0x00,0x56,0x35,0x30,0x35,0x00, 0x56,0x35,0x30,0x36,0x00,0x56,0x35,0x30,0x37,0x00,0x56,0x35,0x30,0x38,0x00,0x56, 0x35,0x30,0x39,0x00,0x56,0x35,0x31,0x30,0x00,0x56,0x35,0x31,0x31,0x00,0x56,0x35, 0x31,0x32,0x00,0x56,0x35,0x31,0x33,0x00,0x56,0x35,0x31,0x34,0x00,0x56,0x35,0x31, 0x35,0x00,0x56,0x35,0x31,0x36,0x00,0x56,0x35,0x31,0x37,0x00,0x56,0x35,0x31,0x38, 0x00,0x56,0x35,0x31,0x39,0x00,0x56,0x35,0x32,0x30,0x00,0x56,0x35,0x32,0x31,0x00, 0x56,0x35,0x32,0x32,0x00,0x56,0x35,0x32,0x33,0x00,0x56,0x35,0x32,0x34,0x00,0x56, 0x35,0x32,0x35,0x00,0x56,0x35,0x32,0x36,0x00,0x56,0x35,0x32,0x37,0x00,0x56,0x35, 0x32,0x38,0x00,0x56,0x35,0x32,0x39,0x00,0x56,0x35,0x33,0x30,0x00,0x56,0x35,0x33, 0x31,0x00,0x56,0x35,0x33,0x32,0x00,0x56,0x35,0x33,0x33,0x00,0x56,0x35,0x33,0x34, 0x00,0x56,0x35,0x33,0x35,0x00,0x56,0x35,0x33,0x36,0x00,0x56,0x35,0x33,0x37,0x00, 0x56,0x35,0x33,0x38,0x00,0x56,0x35,0x33,0x39,0x00,0x56,0x35,0x34,0x30,0x00,0x56, 0x35,0x34,0x31,0x00,0x56,0x35,0x34,0x32,0x00,0x56,0x35,0x34,0x33,0x00,0x56,0x35, 0x34,0x34,0x00,0x56,0x35,0x34,0x35,0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44, 0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x38,0x78,0x38,0x5f,0x59,0x56,0x31,0x32, 0x5f,0x42,0x42,0x5f,0x30,0x5f,0x32,0x38,0x36,0x00,0x54,0x36,0x00,0x54,0x37,0x00, 0x54,0x38,0x00,0x41,0x73,0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65, 0x74,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x55,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x55,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x55,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x13, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x13, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x13,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x13,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x13,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00, 0x13,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x13, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x13,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x13,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x13,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x63,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x64,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65, 0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00, 0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x53, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x53,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x53,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x53,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x73,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x74,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75, 0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x51, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x21,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x51,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x83,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x84,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85, 0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x00,0x00, 0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, 0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x21,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x51,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x93,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x94,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95, 0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x00, 0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x21, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x51,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x21,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x21,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x51,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa3,0x00,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa4,0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x00,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb3,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x25, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc2,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc3,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc4,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5, 0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0x25,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd3,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x00,0x00, 0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x27,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe3,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe4,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0x25, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x21,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf2,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf3,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf4,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5, 0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x00, 0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x00,0x00, 0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, 0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0x25,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x01,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x01,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x01,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01, 0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00, 0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x51, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x57,0x10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x51,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x57,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0f,0x01,0x00,0x00,0x55,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x12,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x13,0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x14,0x01,0x00,0x00,0x51,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15, 0x01,0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x01, 0x00,0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x01,0x00, 0x00,0x57,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x00,0x00, 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x55, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x01,0x00,0x00,0x01,0x01, 0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x02,0x02,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x02,0x01,0x00,0x21, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x01,0x01,0x00,0x24,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x01,0x00,0x00,0x02,0x01,0x00,0x23,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x05,0x80,0x00,0x25,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x03,0x40,0x00,0x25,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x02,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x00,0x02,0x40,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x23,0x01,0x00,0x00,0x01,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x24,0x01,0x00,0x00,0x01,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25, 0x01,0x00,0x00,0x01,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x01, 0x00,0x00,0x01,0x01,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x01,0x00, 0x00,0x01,0x01,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00, 0x01,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x01, 0x01,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x01, 0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x01,0x00, 0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x00,0x00,0x01,0x01,0x00,0x2f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x01,0x01,0x00,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x01,0x01,0x00,0x32,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0x01,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x01,0x00,0x00,0x03,0x08,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x01,0x00,0x00,0x04,0xc0,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x34,0x01,0x00,0x00,0x03,0x04,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35, 0x01,0x00,0x00,0x03,0x02,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x01, 0x00,0x00,0x03,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x01,0x00, 0x00,0x03,0x08,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0x00, 0x03,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0x00,0x00,0x03, 0x02,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x01,0x00,0x00,0x03,0x08, 0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x01,0x00,0x00,0x03,0x04,0x00, 0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x03,0x02,0x00,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x03,0x08,0x00,0x3d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x03,0x04,0x00,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x03,0x02,0x00,0x3f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x03,0x08,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x03,0x04,0x00,0x41,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x01,0x00,0x00,0x03,0x02,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x43,0x01,0x00,0x00,0x03,0x08,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x44,0x01,0x00,0x00,0x03,0x04,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45, 0x01,0x00,0x00,0x03,0x02,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x01, 0x00,0x00,0x03,0x08,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x01,0x00, 0x00,0x03,0x04,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00, 0x03,0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x03, 0x08,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x03,0x04, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x03,0x02,0x00, 0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x03,0x08,0x00,0x4c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x03,0x04,0x00,0x4d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x03,0x02,0x00,0x4e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x03,0x08,0x00,0x4f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x03,0x04,0x00,0x50,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x51,0x01,0x00,0x00,0x03,0x02,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x01,0x00,0x00,0x03,0x08,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x53,0x01,0x00,0x00,0x03,0x04,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x01,0x00,0x00,0x03,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x01,0x00,0x00,0x03,0x08,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01, 0x00,0x00,0x03,0x04,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x01,0x00, 0x00,0x03,0x02,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x01,0x00,0x00, 0x03,0x08,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x03, 0x04,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x03,0x02, 0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x03,0x08,0x00, 0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x03,0x04,0x00,0x5c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0x01,0x00,0x00,0x03,0x02,0x00,0x5d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x03,0x08,0x00,0x5e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5f,0x01,0x00,0x00,0x03,0x04,0x00,0x5f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x03,0x02,0x00,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x03,0x08,0x00,0x61,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x62,0x01,0x00,0x00,0x03,0x04,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x63,0x01,0x00,0x00,0x03,0x02,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x64,0x01,0x00,0x00,0x02,0x10,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65, 0x01,0x00,0x00,0x01,0x10,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x01, 0x00,0x00,0x01,0x10,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x01,0x00, 0x00,0x01,0x10,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x00,0x00, 0x01,0x10,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x01,0x00,0x00,0x01, 0x10,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x01,0x00,0x00,0x01,0x10, 0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x01,0x10,0x00, 0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x01,0x10,0x00,0x6a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x01,0x10,0x00,0x76,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x01,0x10,0x00,0x6b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x01,0x10,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x01,0x10,0x00,0x6d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x01,0x10,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x72,0x01,0x00,0x00,0x01,0x10,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x73,0x01,0x00,0x00,0x01,0x10,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x74,0x01,0x00,0x00,0x01,0x10,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75, 0x01,0x00,0x00,0x03,0x20,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01, 0x00,0x00,0x03,0x20,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x01,0x00, 0x00,0x03,0x20,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0x00,0x00, 0x03,0x20,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x03, 0x20,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x03,0x20, 0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x03,0x20,0x00, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x03,0x20,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0x01,0x00,0x00,0x01,0x08,0x00,0x79,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x00,0x00,0x02,0x20,0x00,0x72,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7f,0x01,0x00,0x00,0x02,0x20,0x00,0x71,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x01,0x04,0x00,0x7a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x01,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x82,0x01,0x00,0x00,0x01,0x10,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x83,0x01,0x00,0x00,0x01,0x08,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x84,0x01,0x00,0x00,0x01,0x04,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85, 0x01,0x00,0x00,0x01,0x02,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01, 0x00,0x00,0x01,0x08,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x01,0x00, 0x00,0x01,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x01,0x02,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x01, 0x08,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x01,0x04, 0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x01,0x02,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x01,0x08,0x00,0x85, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x02,0x20,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x01,0x00,0x00,0x02,0x20,0x00,0x73,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x8f,0x01,0x00,0x00,0x01,0x04,0x00,0x86,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x01,0x02,0x00,0x87,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x91,0x01,0x00,0x00,0x01,0x08,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x01,0x00,0x00,0x01,0x04,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x93,0x01,0x00,0x00,0x01,0x02,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x94,0x01,0x00,0x00,0x01,0x08,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95, 0x01,0x00,0x00,0x01,0x04,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x01, 0x00,0x00,0x01,0x02,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x01,0x00, 0x00,0x01,0x08,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x01,0x00,0x00, 0x01,0x04,0x00,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x01, 0x02,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x01,0x08, 0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x01,0x00,0x00,0x02,0x20,0x00, 0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x02,0x20,0x00,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0x01,0x00,0x00,0x01,0x04,0x00,0x92,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x01,0x00,0x00,0x01,0x02,0x00,0x93,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x9f,0x01,0x00,0x00,0x01,0x08,0x00,0x94,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x01,0x04,0x00,0x95,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa1,0x01,0x00,0x00,0x01,0x02,0x00,0x96,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa2,0x01,0x00,0x00,0x01,0x08,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa3,0x01,0x00,0x00,0x01,0x04,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa4,0x01,0x00,0x00,0x01,0x02,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5, 0x01,0x00,0x00,0x01,0x08,0x00,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x01,0x04,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x01,0x00, 0x00,0x01,0x02,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00, 0x01,0x08,0x00,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x01,0x00,0x00,0x02, 0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x01,0x00,0x00,0x02,0x20, 0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x01,0x00,0x00,0x01,0x04,0x00, 0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x01,0x02,0x00,0x9f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x01,0x00,0x00,0x01,0x08,0x00,0xa0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x01,0x04,0x00,0xa1,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaf,0x01,0x00,0x00,0x01,0x02,0x00,0xa2,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x00,0x01,0x08,0x00,0xa3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x01,0x04,0x00,0xa4,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb2,0x01,0x00,0x00,0x01,0x02,0x00,0xa5,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb3,0x01,0x00,0x00,0x01,0x08,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x01,0x00,0x00,0x01,0x04,0x00,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5, 0x01,0x00,0x00,0x01,0x02,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x01, 0x00,0x00,0x00,0x10,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x01,0x00, 0x00,0x07,0x01,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x01,0x00,0x00, 0x07,0x10,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x01,0x00,0x00,0x07, 0x10,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x07,0x10, 0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x07,0x10,0x00, 0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x01,0x04,0x00,0xae, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x01,0x00,0x00,0x07,0x04,0x00,0xaf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x01,0x04,0x00,0xc8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x01,0x04,0x00,0xb0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x07,0x04,0x00,0xb2,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x01,0x04,0x00,0xb3,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc2,0x01,0x00,0x00,0x01,0x04,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc3,0x01,0x00,0x00,0x07,0x04,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc4,0x01,0x00,0x00,0x01,0x04,0x00,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5, 0x01,0x00,0x00,0x07,0x04,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x01, 0x00,0x00,0x01,0x04,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x01,0x00, 0x00,0x01,0x04,0x00,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00, 0x07,0x04,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x01,0x00,0x00,0x01, 0x04,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x07,0x04, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcb,0x01,0x00,0x00,0x01,0x04,0x00, 0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0x01,0x00,0x00,0x01,0x04,0x00,0xc0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x07,0x04,0x00,0xc1,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x01,0x04,0x00,0xc2,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x07,0x04,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x01,0x04,0x00,0xc5,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x01,0x04,0x00,0xc6,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd2,0x01,0x00,0x00,0x07,0x04,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd3,0x01,0x00,0x00,0x07,0x04,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd4,0x01,0x00,0x00,0x01,0x04,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5, 0x01,0x00,0x00,0x01,0x04,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x01, 0x00,0x00,0x07,0x04,0x00,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0x01,0x00, 0x00,0x01,0x04,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x01,0x00,0x00, 0x07,0x04,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x01,0x00,0x00,0x01, 0x04,0x00,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x01,0x04, 0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x01,0x00,0x00,0x07,0x04,0x00, 0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x01,0x04,0x00,0xd4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x01,0x00,0x00,0x07,0x04,0x00,0xd6,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x01,0x04,0x00,0xd7,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdf,0x01,0x00,0x00,0x01,0x04,0x00,0xd8,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x07,0x04,0x00,0xd9,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x01,0x04,0x00,0xda,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe2,0x01,0x00,0x00,0x07,0x04,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe3,0x01,0x00,0x00,0x01,0x04,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe4,0x01,0x00,0x00,0x01,0x04,0x00,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5, 0x01,0x00,0x00,0x07,0x04,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x01, 0x00,0x00,0x01,0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x01,0x00, 0x00,0x07,0x04,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x01,0x00,0x00, 0x01,0x04,0x00,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x01, 0x04,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x07,0x04, 0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x01,0x00,0x00,0x01,0x04,0x00, 0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x07,0x04,0x00,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x01,0x00,0x00,0x01,0x04,0x00,0xe9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x01,0x04,0x00,0xea,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x07,0x04,0x00,0xeb,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x01,0x04,0x00,0xec,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x07,0x04,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf2,0x01,0x00,0x00,0x01,0x04,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf3,0x01,0x00,0x00,0x01,0x04,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf4,0x01,0x00,0x00,0x07,0x04,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5, 0x01,0x00,0x00,0x01,0x04,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01, 0x00,0x00,0x07,0x04,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x01,0x00, 0x00,0x01,0x04,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00, 0x01,0x04,0x00,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x07, 0x04,0x00,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x01,0x04, 0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x07,0x04,0x00, 0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x01,0x04,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x01,0x04,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x07,0x04,0x00,0xfd,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,0x01,0x04,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x04,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x04,0x00,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x00,0x00,0x01,0x04,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x02,0x00,0x00,0x07,0x04,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x02,0x00,0x00,0x01,0x04,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x02,0x00,0x00,0x07,0x04,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02, 0x00,0x00,0x01,0x04,0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x00, 0x00,0x01,0x04,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00, 0x07,0x04,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x01, 0x04,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x07,0x04, 0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x01,0x04,0x00, 0x0d,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x04,0x30,0x00,0x31, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x01,0x10,0x00,0x0f,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x07,0x10,0x00,0x10,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x01,0x10,0x00,0x11,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x07,0x10,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x01,0x10,0x00,0x14,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x12,0x02,0x00,0x00,0x04,0x30,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x01,0x10,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x14,0x02,0x00,0x00,0x07,0x10,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x15, 0x02,0x00,0x00,0x01,0x10,0x00,0x1a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x02, 0x00,0x00,0x01,0x10,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x02,0x00, 0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0x00,0x00, 0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00, 0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x02,0x00,0x00,0x00,0x01, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x01,0x00, 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1c,0x02, 0x00,0x00,0x01,0x00,0x00,0x03,0x1d,0x02,0x00,0x00,0x01,0x00,0x00,0x1e,0x02,0x00, 0x00,0x01,0x00,0x00,0x1f,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00, 0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00, 0x2c,0x00,0x04,0x00,0xd6,0x3d,0x00,0x00,0x39,0x29,0x00,0x00,0x02,0x00,0x20,0x02, 0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x73,0x64,0x5f,0x32,0x2e,0x61,0x73,0x6d, 0x21,0x02,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x21,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x24,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x35,0x03,0x00,0x06,0x05,0x00,0x00,0x00,0x00,0x00,0x25,0x01,0x00, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x26,0x01,0x00,0x00,0x02,0x00,0x21,0x01,0x25,0x00,0x00,0x00,0x00,0x27,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x28,0x01,0x00,0x00,0x01,0x0f,0x21,0x01,0x05, 0x02,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x00,0x2a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23, 0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x03,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x2c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x2d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x27,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x2e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x29,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff, 0x01,0x00,0x00,0x00,0x00,0x2f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2a,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xfe,0xff,0xff,0xff,0x37,0x00,0x07,0x00, 0x10,0x0c,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x31,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x32, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x05,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x33,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x2c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff, 0xff,0xff,0x37,0x00,0x07,0x01,0x08,0x06,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x35,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x31,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x36,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x07,0x01, 0x08,0x06,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x37,0x01,0x00,0x00, 0x00,0x00,0x21,0x01,0x33,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x38, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x02,0x46,0x02, 0x00,0x39,0x01,0x00,0x00,0x01,0x02,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x3a,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x38,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x38,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x3b,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x3a, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3b,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x04,0x46,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3d,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x3d,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x3e,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x3e,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x01,0x00,0x02, 0x00,0x3f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x3f,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x02,0x06,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x06,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x41,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x41,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x42,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x42,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x02,0x08,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x43,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x43,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x44,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x3c,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x45,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x45,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x46, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x02,0x46,0x02, 0x00,0x39,0x01,0x00,0x00,0x02,0x02,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x47,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x46,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x48,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x47, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00, 0x00,0x04,0x00,0x02,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x48,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x49,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x00,0x39,0x01,0x00, 0x00,0x02,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x49,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x49,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x4a,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4a,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x05,0x00,0x02, 0x00,0x4b,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x4b,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x06,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4c, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x4c,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x4e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4d,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x4d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x4e,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x4e,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x03,0x08,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x4f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x3c,0x01,0x00,0x00,0x00,0x07,0x00,0x02,0x00,0x51,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x51,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x52, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x02,0x46,0x02, 0x00,0x39,0x01,0x00,0x00,0x03,0x02,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x53,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x52,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x54,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x53,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x53, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x54,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x54,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x55,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x04,0x46,0x02,0x00,0x39,0x01,0x00, 0x00,0x03,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x56,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x55,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x55,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x56,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x56,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x09,0x00,0x02, 0x00,0x57,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x04,0x06,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x06,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x58,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x59,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x59,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x0a,0x00,0x02,0x00,0x5a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x5a,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x04,0x08,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x5b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x5c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x3c,0x01,0x00,0x00,0x00,0x0b,0x00,0x02,0x00,0x5d,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x5d,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x5e, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x05,0x02,0x46,0x02, 0x00,0x39,0x01,0x00,0x00,0x04,0x02,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x5f,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x5e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x60,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x5f,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x5f, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00, 0x00,0x0c,0x00,0x02,0x00,0x60,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x60,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x61,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x05,0x04,0x46,0x02,0x00,0x39,0x01,0x00, 0x00,0x04,0x04,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x62,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x61,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x61,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x62,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x62,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x0d,0x00,0x02, 0x00,0x63,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x63,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x05,0x06,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x06,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x64,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x65,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x3c,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x66,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x66,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x05,0x08,0x46,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x67,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x67,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x3c,0x01,0x00,0x00,0x00,0x0f,0x00,0x02,0x00,0x69,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x69,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0x6a, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6a,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x02,0x04,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x6a,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6b,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x6b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00, 0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72, 0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x01, 0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6c,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x02,0x46,0x02,0x10, 0x6a,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6c,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x08,0x6c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00, 0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x04,0x00, 0x02,0x00,0x65,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x23,0x01, 0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x65,0x00, 0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x10,0x6a,0x01,0x00, 0x00,0x00,0x02,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6d,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x08,0x6d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x71,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x66, 0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x66,0x00,0x00,0x00,0x01, 0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x39,0x01,0x00,0x00,0x00,0x06,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x03, 0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x6e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08, 0x6e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x71,0x00,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00, 0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x0c,0x00, 0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x72, 0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x67,0x00,0x00,0x00,0x01,0x08,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01, 0x00,0x00,0x01,0x00,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x29, 0x04,0x00,0x00,0x00,0x6f,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x6f,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x73, 0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x01, 0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x39,0x01,0x00,0x00,0x01,0x02,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x05, 0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08, 0x70,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x68,0x00,0x00,0x00, 0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x04,0x00, 0x02,0x00,0x68,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x74, 0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x68,0x00,0x00,0x00,0x01,0x08,0x23,0x01, 0x01,0x04,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01, 0x00,0x00,0x01,0x04,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x29, 0x04,0x00,0x00,0x00,0x71,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x71,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x73,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x00,0x08,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x69, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00, 0x01,0x08,0x00,0x02,0x00,0x69,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01, 0x06,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x29,0x04,0x00,0x00, 0x00,0x72,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x72,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00, 0x6a,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x73,0x00,0x00, 0x00,0x01,0x0c,0x00,0x02,0x00,0x6a,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x6a,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01,0x0c,0x00, 0x02,0x00,0x6a,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x73, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x00,0x46,0x02, 0x10,0x6a,0x01,0x00,0x00,0x00,0x08,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x73,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x73,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x05,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x08,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x76, 0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00, 0x01,0x00,0x00,0x02,0x00,0x76,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00, 0x00,0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02, 0x02,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x09,0x21,0x01,0x29,0x04,0x00,0x00, 0x00,0x74,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x74,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00, 0x6b,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x00,0x00, 0x00,0x01,0x04,0x00,0x02,0x00,0x6b,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x6b,0x00,0x00,0x00, 0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x01,0x04,0x00, 0x02,0x00,0x6b,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x75, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x04,0x46,0x02, 0x10,0x6a,0x01,0x00,0x00,0x00,0x0a,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x75,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x75,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x6c,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x01,0x08, 0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x76,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x6c,0x00,0x00,0x00,0x01,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x6c, 0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x06,0x46,0x02,0x10,0x6a,0x01, 0x00,0x00,0x00,0x0b,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x08,0x76,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x75,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00, 0x6d,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x00,0x0c,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x6d,0x00,0x00,0x00, 0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x00,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00, 0x0c,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x77,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x77,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x05,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00, 0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x00, 0x00,0x02,0x00,0x77,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0x23, 0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x78, 0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x02,0x46,0x02,0x10,0x6a,0x01, 0x00,0x00,0x00,0x0d,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x08,0x78,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x77,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00, 0x6e,0x00,0x00,0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x00,0x04,0x00,0x02,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02, 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0x6e,0x00,0x00,0x00, 0x01,0x08,0x23,0x01,0x01,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x04,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00, 0x0e,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x08,0x79,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29, 0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x6f,0x00,0x00, 0x00,0x00,0x08,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x08, 0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x01,0x08,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x01,0x08,0x23, 0x01,0x01,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x03,0x06,0x46,0x02,0x10,0x6a,0x01,0x00,0x00,0x00,0x0f,0x21,0x01, 0x29,0x04,0x00,0x00,0x00,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x7a,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00, 0x0c,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x29,0x02,0x00,0x00, 0x00,0x77,0x00,0x00,0x00,0x01,0x0c,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x08, 0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00, 0x70,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0x29,0x02,0x00,0x00,0x00,0x78,0x00,0x00, 0x00,0x01,0x0c,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x01,0x08,0x23,0x01,0x10,0x05, 0x00,0x00,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7b,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x7b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00, 0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7c,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00, 0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x7d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00, 0x7e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x7e,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x7f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x7f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x80,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x80,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x81,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x81, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x05,0x00,0x00,0x00,0x82,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x82,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x82,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x03,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x85,0x01,0x00, 0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x86,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x83,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x83,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x86,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x86,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x87,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x87,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x84,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x04,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x8b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8a,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x8a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x8b,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x8b,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x00,0x85,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8d,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x8e,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x8e,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x8f, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x00,0x85,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x90,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x8f,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x8f,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x91,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x90,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x90, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x00,0x03,0x00,0x02,0x00,0x91,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x91,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0x94,0x01,0x00, 0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x95,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x92,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x92,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x95,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x95,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x04,0x00,0x02, 0x00,0x96,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x96,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x93,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x04,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x97, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x97,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0x99,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x98,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x98,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x99,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x99,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x00,0x94,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9a,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0x9a,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9b,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0x9b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0x9c,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0x9d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x93,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x00,0x94,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0x9e,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x9d,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0x9d,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0x9f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x9e,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x9e, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x00,0x07,0x00,0x02,0x00,0x9f,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x9f,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0xa2,0x01,0x00, 0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xa3,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xa0,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa0,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xa3,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa3,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x01,0x00,0x00,0x02, 0x00,0xa4,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xa4,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xa1,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x04,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa5, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xa5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xa7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa6,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xa6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0xa7,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xa7,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x00,0xa2,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa8,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0xa8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0xa9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0xaa,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xaa,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xab, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xa1,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x00,0xa2,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xac,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xab,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xab,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xad,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xac,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xac, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x01,0x03,0x00,0x02,0x00,0xad,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xad,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xae,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xaf,0x01,0x00,0x00,0x00,0x00,0x46,0x02,0x00,0xb0,0x01,0x00, 0x00,0x00,0x00,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xb1,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xae,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xae,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb1,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xb1,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x01,0x04,0x00,0x02, 0x00,0xb2,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb2,0x01,0x00,0x00,0x00,0x01, 0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xaf,0x01,0x00,0x00,0x00,0x04,0x46,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x04,0x46, 0x02,0x01,0x02,0x00,0x00,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb3, 0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0xb3,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x01,0x00,0x00,0x00,0xb5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb4,0x01, 0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xb4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0x01,0x05,0x00,0x02,0x00,0xb5,0x01,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0xb5,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03, 0x00,0x00,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0x00,0x00, 0x00,0x08,0x46,0x02,0x00,0xb0,0x01,0x00,0x00,0x00,0x08,0x46,0x02,0x01,0x02,0x00, 0x00,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb6,0x01,0x00,0x00,0x00, 0x04,0x22,0x01,0x00,0xb6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00, 0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb7,0x01,0x00,0x00,0x00,0x02, 0x22,0x01,0x00,0xb7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00, 0x88,0x01,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0xb8,0x01,0x00,0x00,0x00,0x00,0x21, 0x01,0x00,0xb8,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x03,0x00,0x00,0x00,0xb9, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0x00,0x00,0x00,0x0c,0x46,0x02, 0x00,0xb0,0x01,0x00,0x00,0x00,0x0c,0x46,0x02,0x01,0x02,0x00,0x00,0x00,0xba,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xb9,0x01,0x00,0x00,0x00,0x04,0x22,0x01,0x00, 0xb9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x01,0x00,0x00,0x00,0xbb,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xba,0x01,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0xba, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x88,0x01,0x00,0x00, 0x01,0x07,0x00,0x02,0x00,0xbb,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xbb,0x01, 0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x04,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04,0x00, 0x00,0x00,0x29,0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x00,0x00,0x00,0x00,0xbd,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07, 0x00,0x00,0x20,0x41,0x03,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbd,0x01,0x00,0x00,0x00, 0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x10,0x19,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x08,0x04,0x00,0x00,0x00,0x19,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x04,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x40,0x03,0x04,0x00,0x00,0x00, 0xbf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xbd,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x1d, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x1d,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x08,0x04,0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x40,0x29,0x00,0x00,0x00,0x00,0xac,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3f,0x0c,0x04,0x00,0x00,0x00, 0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xac,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x1b,0x04,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x04,0x00,0x00,0x00,0xbe,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xc0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x04,0x00,0x00,0x00,0xbf,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00,0x00,0xb1,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x02,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01, 0x03,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x01,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xc2,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x01,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xaf, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc2,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x02,0x00,0x00,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xc3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x13,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x11,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x11,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xc5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x13,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc5,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x01,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xaf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb2, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb1,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02, 0x00,0x00,0x00,0xc7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc6,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0xb3,0x00,0x00,0x00,0x00,0x08,0x24,0x01, 0x29,0x02,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01, 0x00,0x00,0x01,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x05,0x36,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00, 0x00,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x01, 0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xc9,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00, 0xc9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xca,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x13,0x36,0x02,0x00,0x39, 0x01,0x00,0x00,0x00,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xca,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01, 0x00,0x00,0x00,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xca,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00, 0x00,0x01,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xca,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x01,0x21, 0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xb5,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1d,0x01,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xb7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xcb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xcc,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xcb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0xb9,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x0a,0x00,0x02, 0x00,0xb9,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x06,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x07,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x05,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x16,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xcd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x01,0x16,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcd,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbe,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xce,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x01,0x15,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x00,0x15,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x00,0x17,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xcf,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0xbd,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x02, 0x21,0x01,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xbd,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f, 0x29,0x02,0x00,0x00,0x00,0xd1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd0,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00, 0x04,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x00,0x0c,0x00,0x02,0x00,0xbf,0x00,0x00,0x00,0x00,0x08, 0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x01,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x09,0x36,0x02,0x00,0x39, 0x01,0x00,0x00,0x01,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01, 0x00,0x00,0x00,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00, 0x00,0x01,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00, 0xd3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x03,0x21, 0x01,0x00,0xd3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd4, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x17,0x36,0x02, 0x00,0x39,0x01,0x00,0x00,0x00,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd4,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x39,0x01,0x00,0x00,0x00,0x19,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xd4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39, 0x01,0x00,0x00,0x01,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00, 0x03,0x21,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc1,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0xc4,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xc3,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xd6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0xc5,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x0e, 0x00,0x02,0x00,0xc5,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00, 0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x02,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x02,0x01,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x12,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x03,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x12,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xd7,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xd8,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x11, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xc4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x13,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xc4, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xc9,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x04,0x21,0x01,0x00,0xc9,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc7,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00, 0x00,0x00,0x04,0x21,0x01,0x00,0xca,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xc9, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xd9,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00, 0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xd9,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01, 0x00,0x00,0x00,0x10,0x00,0x02,0x00,0xcb,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x18,0x00,0x02,0x00,0xcb,0x00,0x00, 0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xdb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x03,0x36, 0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x14,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xdb, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x39,0x01,0x00,0x00,0x02,0x05,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xdb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x39,0x01,0x00,0x00,0x02,0x14,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xcd,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xdb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02, 0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00, 0x00,0x05,0x21,0x01,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01, 0x15,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x13,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd0, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xdd,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01, 0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xcd,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xd0,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x05,0x21,0x01,0x00,0xd0, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00, 0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xde,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x12,0x00,0x02,0x00, 0xd1,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x00,0x1a,0x00,0x02,0x00,0xd1,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02, 0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x02,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x05,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01, 0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x07, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe0,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x16,0x36, 0x02,0x29,0x02,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe0, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xe1,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xe1,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00, 0x02,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02, 0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xe2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x00, 0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xd3,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d, 0x01,0x00,0x00,0x00,0x06,0x21,0x01,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0xd5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe3,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05, 0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xe3,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00, 0x0e,0x01,0x00,0x00,0x00,0x14,0x00,0x02,0x00,0xd7,0x00,0x00,0x00,0x00,0x00,0x24, 0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x1c,0x00,0x02,0x00,0xd7, 0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xdb,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x08,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02, 0x07,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x18,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0xe5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x18,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xd9, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe5,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x02,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01, 0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xe6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00, 0x00,0x01,0x19,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x01,0x17,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x17,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x02,0x19,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe7,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1c,0x01,0x00,0x00,0x00,0x07,0x21,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0xd9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xdc, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x07,0x21,0x01, 0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdb,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xe8,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe8,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02, 0x00,0x00,0x00,0xe9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x00,0x16,0x00, 0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x00,0x1e,0x00,0x02,0x00,0xdd,0x00,0x00,0x00,0x00,0x08,0x24,0x01, 0x29,0x02,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01, 0x00,0x00,0x03,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x01,0x36,0x02,0x00,0x39,0x01,0x00, 0x00,0x02,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00, 0x03,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03, 0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0xea,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xeb,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x00, 0xeb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xec,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x13,0x36,0x02,0x00,0x39, 0x01,0x00,0x00,0x02,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xec,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01, 0x00,0x00,0x03,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00, 0x00,0x03,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xec,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x00,0x21, 0x01,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xdf,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1d,0x01,0x00,0x00,0x01,0x00,0x21,0x01,0x00,0xe2,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0xed,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xee,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xed,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00, 0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0xe3,0x00,0x00,0x00,0x00, 0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x08,0x00,0x02, 0x00,0xe3,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x04,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00, 0x00,0x03,0x03,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x14,0x36,0x02,0x01,0x02, 0x00,0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x05,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x14,0x36,0x02,0x29,0x02,0x00,0x00, 0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xef,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbe,0x01,0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x13,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x13,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf1,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x01,0x21,0x01,0x00,0xe7,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0xe5,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00, 0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x01,0x01, 0x21,0x01,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xe7,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xf2,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f, 0x29,0x02,0x00,0x00,0x00,0xf3,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf2,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01, 0x02,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x01,0x0a,0x00,0x02,0x00,0xe9,0x00,0x00,0x00,0x00,0x08, 0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x39,0x01,0x00,0x00,0x03,0x06,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x05,0x36,0x02,0x00,0x39, 0x01,0x00,0x00,0x02,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01, 0x00,0x00,0x03,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00, 0x00,0x03,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00, 0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x02,0x21, 0x01,0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xf6, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x17,0x36,0x02, 0x00,0x39,0x01,0x00,0x00,0x02,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf6,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x39,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xf6,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39, 0x01,0x00,0x00,0x03,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xf6,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00, 0x00,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01, 0x02,0x21,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xeb,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x01,0x02,0x21,0x01,0x00,0xee,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0xed,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xf8,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf7,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29, 0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x04,0x00,0x02,0x00,0xef,0x00,0x00, 0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x0c, 0x00,0x02,0x00,0xef,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00, 0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x08,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39, 0x01,0x00,0x00,0x03,0x07,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x18,0x36,0x02, 0x01,0x02,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x09,0x36,0x02,0x01, 0x02,0x00,0x00,0x00,0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x18,0x36,0x02,0x29,0x02, 0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf9,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xfa,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x39,0x01,0x00,0x00,0x02,0x19,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x02,0x17, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfb,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x17,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0xfb,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x03,0x19,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfb,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x03,0x21,0x01,0x00,0xf3,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02, 0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00, 0x01,0x03,0x21,0x01,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf3,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xfc,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00, 0x00,0x01,0x06,0x00,0x02,0x00,0xf5,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01, 0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x0e,0x00,0x02,0x00,0xf5,0x00,0x00,0x00, 0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x02,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfe, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x01,0x36,0x02, 0x00,0x39,0x01,0x00,0x00,0x03,0x12,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfe,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x39,0x01,0x00,0x00,0x04,0x03,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39, 0x01,0x00,0x00,0x04,0x12,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xf7,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00, 0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01, 0x04,0x21,0x01,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x13, 0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x11,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x39,0x01,0x00,0x00,0x04,0x13,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0xfa,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00, 0x00,0x01,0x04,0x21,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf7, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xfa,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x01,0x04,0x21,0x01,0x00,0xfa,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01, 0x02,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x10,0x00,0x02,0x00,0xfb, 0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00, 0x01,0x18,0x00,0x02,0x00,0xfb,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04, 0x04,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x39,0x01,0x00,0x00,0x04,0x03,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x14, 0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x03,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x05,0x36, 0x02,0x01,0x02,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x14,0x36,0x02, 0x29,0x02,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x05,0x21,0x01,0x00,0x04,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x00,0x39,0x01,0x00,0x00, 0x03,0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04, 0x13,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x05,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x15, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x05,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0xff,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x05,0x21,0x01,0x00,0xff, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01, 0x00,0x00,0x01,0x05,0x21,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0xff,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07, 0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e, 0x01,0x00,0x00,0x01,0x12,0x00,0x02,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x24,0x01, 0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x1a,0x00,0x02,0x00,0x01,0x01, 0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x06,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x05, 0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x16,0x36,0x02,0x01,0x02,0x00,0x00,0x00, 0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x07,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x08, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x39,0x01,0x00,0x00,0x04,0x16,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10, 0x02,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00, 0x00,0x01,0x06,0x21,0x01,0x00,0x09,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02, 0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00, 0x03,0x17,0x36,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x15,0x36,0x02,0x01,0x02,0x00, 0x00,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x15,0x36,0x02,0x01,0x02,0x00,0x00, 0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x17,0x36,0x02,0x29,0x02,0x00,0x00,0x00, 0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x0c,0x02,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c, 0x01,0x00,0x00,0x01,0x06,0x21,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x06,0x01, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x01,0x06,0x21,0x01,0x00, 0x06,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x02,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00, 0x00,0x00,0x0c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0b,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x14,0x00,0x02, 0x00,0x07,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01, 0x00,0x00,0x01,0x1c,0x00,0x02,0x00,0x07,0x01,0x00,0x00,0x00,0x08,0x24,0x01,0x29, 0x02,0x00,0x00,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00, 0x00,0x04,0x08,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x04,0x07,0x36,0x02,0x00,0x39,0x01,0x00,0x00, 0x03,0x18,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04, 0x09,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00,0x04,0x18, 0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0d,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x0e,0x02,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0xbe,0x01,0x00,0x00,0x01,0x07,0x21,0x01,0x00,0x0e, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x0f,0x02,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x39,0x01,0x00,0x00,0x03,0x19,0x36,0x02,0x00,0x39,0x01, 0x00,0x00,0x03,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00, 0x00,0x04,0x17,0x36,0x02,0x01,0x02,0x00,0x00,0x00,0x0f,0x02,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x39,0x01,0x00,0x00, 0x04,0x19,0x36,0x02,0x29,0x02,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x0f,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x0b, 0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x01,0x07,0x21,0x01, 0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x09,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1d,0x01,0x00,0x00,0x01,0x07,0x21,0x01,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x0b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x10, 0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x0e,0x01,0x00,0x00,0x01,0x16,0x00,0x02,0x00,0x0d,0x01,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x01,0x1e,0x00,0x02,0x00, 0x0d,0x01,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x04,0x00,0x00,0x00,0x12,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x09,0x45,0x02,0x01,0x04, 0x00,0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02,0x00,0x00, 0x00,0x0a,0x45,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x08,0x45,0x02,0x01,0x04,0x00, 0x00,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x12,0x02,0x00,0x00,0x00,0x01,0x45,0x02,0x01,0x04,0x00,0x00, 0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x12,0x02,0x00,0x00,0x00,0x11,0x45,0x02,0x29,0x04,0x00,0x00,0x00, 0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x13,0x02,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x04,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xbe, 0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x14,0x02,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x04,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x12,0x02, 0x00,0x00,0x00,0x02,0x45,0x02,0x00,0x12,0x02,0x00,0x00,0x00,0x00,0x45,0x02,0x01, 0x04,0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x12,0x02,0x00,0x00,0x00,0x10,0x45,0x02,0x01,0x04, 0x00,0x00,0x00,0x15,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x12,0x02,0x00,0x00,0x00,0x12,0x45,0x02,0x29,0x04,0x00, 0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x15,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x12,0x01,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00, 0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x12,0x01,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x16,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29, 0x04,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x16,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x14,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x04,0x00,0x00,0x00, 0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x09,0x45, 0x02,0x01,0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x18, 0x02,0x00,0x00,0x00,0x0a,0x45,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x08,0x45,0x02, 0x01,0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x01,0x45,0x02,0x01, 0x04,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x11,0x45,0x02,0x29,0x04, 0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0x02,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x04,0x00,0x00,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xbe,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x1a,0x02,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x18,0x02,0x00,0x00,0x00,0x02,0x45,0x02,0x00,0x18,0x02,0x00,0x00,0x00,0x00, 0x45,0x02,0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x1b,0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x10,0x45, 0x02,0x01,0x04,0x00,0x00,0x00,0x1b,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b, 0x02,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x18,0x02,0x00,0x00,0x00,0x12,0x45,0x02, 0x29,0x04,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0x02, 0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x16,0x01,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x19,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x04, 0x00,0x00,0x00,0x1d,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x1d,0x01,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x1b,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x1c,0x01, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x04,0x00,0x00,0x00,0xbf,0x01,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00, 0x00,0x3f,0x29,0x04,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xbf,0x01,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x04,0x00,0x00,0x00,0x1f,0x01,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x38,0x00, 0x08,0x00,0x08,0x08,0x00,0x1d,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x1e,0x02, 0x00,0x00,0x00,0x00,0x21,0x01,0x0e,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x08,0x01, 0x04,0x04,0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x20,0x02,0x00,0x00, 0x00,0x00,0x21,0x01,0x15,0x01,0x00,0x00,0x00,0x00,0x38,0x00,0x08,0x01,0x04,0x04, 0x00,0x1f,0x02,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x21,0x02,0x00,0x00,0x00,0x00, 0x21,0x01,0x1f,0x01,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x01,0x00,0x80, 0x10,0x82,0x06,0x02,0x24,0x00,0x00,0x01,0x0c,0x00,0x0c,0x00,0x65,0x00,0x00,0x80, 0x10,0x82,0x86,0x01,0x24,0x00,0x00,0x01,0xff,0x0f,0xff,0x0f,0x65,0x02,0x02,0x62, 0x05,0x02,0xf1,0xff,0x40,0x02,0x00,0x00,0x60,0x01,0x05,0x03,0x64,0x01,0x00,0x01, 0x84,0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x01,0x05,0x04,0x64,0x01,0x00,0x01, 0x04,0x02,0x00,0x00,0x61,0x00,0x05,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80, 0x20,0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x69,0x04,0x0c,0x68, 0x02,0x03,0x31,0x00,0x69,0x04,0x0d,0x68,0x02,0x04,0x31,0x00,0x31,0xc0,0x04,0x80, 0x00,0x00,0x05,0x06,0x04,0x05,0x00,0xa0,0x00,0x00,0x00,0x00,0x61,0x00,0x11,0x64, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x00,0x00,0x69,0x02,0x40,0x04,0x11,0x68,0x02,0x0c,0xe1,0xff,0x40,0x04,0x11,0x68, 0x62,0x0d,0xe1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x11,0x00,0x00,0x00,0x00, 0x0f,0x00,0x0b,0x00,0x69,0x00,0x0e,0x68,0x02,0x03,0x21,0x00,0x31,0xa1,0x03,0x80, 0x00,0x00,0x05,0x12,0x04,0x11,0x00,0xc0,0x00,0x00,0x00,0x00,0x69,0x00,0x0f,0x68, 0x02,0x04,0x21,0x00,0x01,0x31,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x02,0x11,0x68, 0x02,0x0e,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0,0x4a,0x45,0x11,0x00,0x00,0x00,0x00, 0x07,0x00,0x05,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x24,0x01,0x00,0x02, 0x01,0x00,0x29,0x02,0x40,0x04,0x11,0x68,0x62,0x0f,0xf1,0xff,0x61,0x00,0x04,0x00, 0xa0,0x4a,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x31,0xa2,0x03,0x80, 0x00,0x00,0x05,0x18,0x04,0x11,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x7f,0x64, 0x00,0x00,0x00,0x00,0x68,0x20,0x00,0x00,0x10,0x81,0x05,0x0b,0xf4,0x07,0x00,0x01, 0x04,0x00,0x04,0x00,0x61,0x00,0x00,0x00,0xa0,0x05,0x05,0x0a,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x06,0x05,0x10,0x04,0x0f,0x00,0x01, 0x04,0x0b,0x00,0x00,0x01,0x32,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x01,0x11,0x68, 0x62,0x10,0xf1,0xff,0x31,0x93,0x03,0x80,0x00,0x00,0x05,0x1a,0x04,0x11,0x00,0xc0, 0x00,0x00,0x00,0x00,0x61,0x33,0x00,0x80,0xa0,0x4a,0x45,0x11,0x00,0x00,0x00,0x00, 0x07,0x00,0x07,0x00,0x61,0x21,0x03,0x00,0x50,0x00,0x05,0x1c,0x15,0x13,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x21,0x25,0x13,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x25,0x35,0x13,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x29,0x45,0x13,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x2d,0x15,0x14,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x31,0x25,0x14,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x35,0x35,0x14,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x39,0x45,0x14,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x3d,0x15,0x15,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x41,0x25,0x15,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x45,0x35,0x15,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x49,0x45,0x15,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x4d,0x15,0x16,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x51,0x25,0x16,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x55,0x35,0x16,0x54,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x03,0x00,0x50,0x00,0x05,0x59,0x45,0x16,0x54,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x1d,0x15,0x14,0x54,0x05, 0x05,0x1c,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x22,0x25,0x14,0x54,0x05, 0x05,0x21,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x26,0x35,0x14,0x54,0x05, 0x05,0x25,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x2a,0x45,0x14,0x54,0x05, 0x05,0x29,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x2e,0x15,0x15,0x54,0x05, 0x05,0x2d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x32,0x25,0x15,0x54,0x05, 0x05,0x31,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x36,0x35,0x15,0x54,0x05, 0x05,0x35,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x3a,0x45,0x15,0x54,0x05, 0x05,0x39,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x3e,0x15,0x16,0x54,0x05, 0x05,0x3d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x42,0x25,0x16,0x54,0x05, 0x05,0x41,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x46,0x35,0x16,0x54,0x05, 0x05,0x45,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x4a,0x45,0x16,0x54,0x05, 0x05,0x49,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x4e,0x15,0x17,0x54,0x05, 0x05,0x4d,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x52,0x25,0x17,0x54,0x05, 0x05,0x51,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x56,0x35,0x17,0x54,0x05, 0x05,0x55,0x46,0x00,0x40,0x00,0x03,0x00,0x50,0x00,0x05,0x5a,0x45,0x17,0x54,0x05, 0x05,0x59,0x46,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x1e,0x45,0x1d,0x34,0x05, 0x05,0x1d,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x23,0x45,0x22,0x34,0x05, 0x05,0x22,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x27,0x45,0x26,0x34,0x05, 0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x2b,0x45,0x2a,0x34,0x05, 0x05,0x2a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x2f,0x45,0x2e,0x34,0x05, 0x05,0x2e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x33,0x45,0x32,0x34,0x05, 0x05,0x32,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x37,0x45,0x36,0x34,0x05, 0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x3b,0x45,0x3a,0x34,0x05, 0x05,0x3a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x3f,0x45,0x3e,0x34,0x05, 0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x43,0x45,0x42,0x34,0x05, 0x05,0x42,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x47,0x45,0x46,0x34,0x05, 0x05,0x46,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x4b,0x45,0x4a,0x34,0x05, 0x05,0x4a,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x4f,0x45,0x4e,0x34,0x05, 0x05,0x4e,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x53,0x45,0x52,0x34,0x05, 0x05,0x52,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x57,0x45,0x56,0x34,0x05, 0x05,0x56,0x34,0x00,0x40,0x00,0x02,0x00,0x50,0x05,0x05,0x5b,0x45,0x5a,0x34,0x05, 0x05,0x5a,0x34,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x1f,0x25,0x1e,0x22,0x05, 0x05,0x1e,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x24,0x25,0x23,0x22,0x05, 0x05,0x23,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x28,0x25,0x27,0x22,0x05, 0x05,0x27,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x2c,0x25,0x2b,0x22,0x05, 0x05,0x2b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x30,0x25,0x2f,0x22,0x05, 0x05,0x2f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x34,0x25,0x33,0x22,0x05, 0x05,0x33,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x38,0x25,0x37,0x22,0x05, 0x05,0x37,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x3c,0x25,0x3b,0x22,0x05, 0x05,0x3b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x40,0x25,0x3f,0x22,0x05, 0x05,0x3f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x44,0x25,0x43,0x22,0x05, 0x05,0x43,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x48,0x25,0x47,0x22,0x05, 0x05,0x47,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x4c,0x25,0x4b,0x22,0x05, 0x05,0x4b,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x50,0x25,0x4f,0x22,0x05, 0x05,0x4f,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x54,0x25,0x53,0x22,0x05, 0x05,0x53,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x58,0x25,0x57,0x22,0x05, 0x05,0x57,0x22,0x00,0x40,0x00,0x01,0x00,0x50,0x05,0x05,0x5c,0x25,0x5b,0x22,0x05, 0x05,0x5b,0x22,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x05,0x20,0x04,0x1f,0x00,0x05, 0x14,0x1f,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x15,0x20,0x04,0x24,0x00,0x05, 0x14,0x24,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x25,0x20,0x04,0x28,0x00,0x05, 0x14,0x28,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x35,0x20,0x04,0x2c,0x00,0x05, 0x14,0x2c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x45,0x20,0x04,0x30,0x00,0x05, 0x14,0x30,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x55,0x20,0x04,0x34,0x00,0x05, 0x14,0x34,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x65,0x20,0x04,0x38,0x00,0x05, 0x14,0x38,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x75,0x20,0x04,0x3c,0x00,0x05, 0x14,0x3c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x85,0x20,0x04,0x40,0x00,0x05, 0x14,0x40,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0x95,0x20,0x04,0x44,0x00,0x05, 0x14,0x44,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xa5,0x20,0x04,0x48,0x00,0x05, 0x14,0x48,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xb5,0x20,0x04,0x4c,0x00,0x05, 0x14,0x4c,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xc5,0x20,0x04,0x50,0x00,0x05, 0x14,0x50,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xd5,0x20,0x04,0x54,0x00,0x05, 0x14,0x54,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xe5,0x20,0x04,0x58,0x00,0x05, 0x14,0x58,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x05,0xf5,0x20,0x04,0x5c,0x00,0x05, 0x14,0x5c,0x00,0x00,0x38,0x44,0x00,0x00,0xa0,0x4a,0x05,0x4d,0x00,0x00,0x00,0x10, 0x00,0x00,0x20,0x41,0x68,0x01,0x04,0x00,0x10,0x81,0x05,0x20,0x05,0x20,0x58,0x01, 0x04,0x00,0x04,0x00,0x41,0x24,0x0a,0x28,0x00,0x0a,0x11,0x4d,0x40,0x02,0x04,0x00, 0x60,0x00,0x05,0x5d,0x05,0x12,0x54,0x01,0x04,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x67,0x05,0x13,0x54,0x01,0x44,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x71,0x05,0x14,0x54,0x01,0x84,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x7b,0x05,0x15,0x54,0x01,0xc4,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x61,0x15,0x12,0x54,0x01,0x14,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x63,0x25,0x12,0x54,0x01,0x24,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x65,0x35,0x12,0x54,0x01,0x34,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x6b,0x15,0x13,0x54,0x01,0x54,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x6d,0x25,0x13,0x54,0x01,0x64,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x6f,0x35,0x13,0x54,0x01,0x74,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x75,0x15,0x14,0x54,0x01,0x94,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x77,0x25,0x14,0x54,0x01,0xa4,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x79,0x35,0x14,0x54,0x01,0xb4,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x02,0x15,0x15,0x54,0x01,0xd4,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x04,0x25,0x15,0x54,0x01,0xe4,0x20,0x00,0x02,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x06,0x35,0x15,0x54,0x01,0xf4,0x20,0x00,0x02,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x5d,0x05,0x5d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x67,0x05,0x67,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x71,0x05,0x71,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x7b,0x05,0x7b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x61,0x05,0x61,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x63,0x05,0x63,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x65,0x05,0x65,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x6b,0x05,0x6b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x6d,0x05,0x6d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x6f,0x05,0x6f,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x75,0x05,0x75,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x77,0x05,0x77,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x79,0x05,0x79,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x02,0x05,0x02,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x04,0x05,0x04,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00, 0x60,0x16,0x05,0x06,0x05,0x06,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x90,0x09,0x05,0x5f,0x05,0x5d,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x90,0x09,0x05,0x69,0x05,0x67,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x90,0x09,0x05,0x73,0x05,0x71,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x05,0x00, 0x90,0x09,0x05,0x7d,0x05,0x7b,0x46,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x5f,0x04,0x5d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x05,0x02,0x00, 0x90,0x09,0x05,0x60,0x84,0x5f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x5f,0x04,0x61,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x60,0x84,0x61,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x60,0x84,0x63,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x5d,0x04,0x64,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x60,0x84,0x65,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x5d,0x04,0x66,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x69,0x04,0x67,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x6a,0x84,0x69,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x69,0x04,0x6b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x6a,0x84,0x6b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x6a,0x84,0x6d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x67,0x04,0x6e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x6a,0x84,0x6f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x67,0x04,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x73,0x04,0x71,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x74,0x84,0x73,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x73,0x04,0x75,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x74,0x84,0x75,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x74,0x84,0x77,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x71,0x04,0x78,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x74,0x84,0x79,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x71,0x04,0x7a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x7d,0x04,0x7b,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x7e,0x84,0x7d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x7d,0x04,0x02,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x7e,0x84,0x02,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x7e,0x84,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x7b,0x04,0x05,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x7e,0x84,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x7b,0x04,0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x5d,0x04,0x5e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x5d,0x04,0x62,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x5f,0x04,0x63,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x5f,0x04,0x65,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x67,0x04,0x68,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x67,0x04,0x6c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x69,0x04,0x6d,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x69,0x04,0x6f,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x71,0x04,0x72,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x71,0x04,0x76,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x73,0x04,0x77,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x73,0x04,0x79,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x7b,0x04,0x7c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x7b,0x04,0x03,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x7d,0x04,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x7d,0x04,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x5e,0x84,0x5e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x5e,0x84,0x62,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x68,0x84,0x68,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x68,0x84,0x6c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x72,0x84,0x72,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x72,0x84,0x76,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x05,0x7c,0x84,0x7c,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x45,0x7c,0x84,0x03,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x5e,0x84,0x64,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x5e,0x84,0x66,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x68,0x84,0x6e,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x68,0x84,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x72,0x84,0x78,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x72,0x84,0x7a,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0x85,0x7c,0x84,0x05,0x20,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x90,0x09,0xc5,0x7c,0x84,0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x05,0x00, 0x50,0x05,0x05,0x5f,0x05,0x5f,0x46,0x05,0x05,0x5f,0x46,0x00,0x41,0x00,0x05,0x00, 0x50,0x05,0x05,0x69,0x05,0x69,0x46,0x05,0x05,0x69,0x46,0x00,0x41,0x00,0x05,0x00, 0x50,0x05,0x05,0x73,0x05,0x73,0x46,0x05,0x05,0x73,0x46,0x00,0x41,0x00,0x05,0x00, 0x50,0x05,0x05,0x7d,0x05,0x7d,0x46,0x05,0x05,0x7d,0x46,0x00,0x41,0x07,0x05,0x00, 0x50,0x05,0x05,0x5d,0x05,0x5d,0x46,0x05,0x05,0x5d,0x46,0x00,0x41,0x07,0x05,0x00, 0x50,0x05,0x05,0x67,0x05,0x67,0x46,0x05,0x05,0x67,0x46,0x00,0x41,0x07,0x05,0x00, 0x50,0x05,0x05,0x71,0x05,0x71,0x46,0x05,0x05,0x71,0x46,0x00,0x41,0x07,0x05,0x00, 0x50,0x05,0x05,0x7b,0x05,0x7b,0x46,0x05,0x05,0x7b,0x46,0x00,0x40,0x04,0x03,0x00, 0x60,0x01,0x05,0x08,0x05,0x5d,0x54,0x01,0x05,0x5f,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x1e,0x45,0x5d,0x54,0x01,0x45,0x5f,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x21,0x85,0x5d,0x54,0x01,0x85,0x5f,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x24,0xc5,0x5d,0x54,0x01,0xc5,0x5f,0x54,0x00,0x40,0x07,0x03,0x00, 0x60,0x01,0x05,0x27,0x05,0x67,0x54,0x01,0x05,0x69,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x2a,0x45,0x67,0x54,0x01,0x45,0x69,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x2d,0x85,0x67,0x54,0x01,0x85,0x69,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x30,0xc5,0x67,0x54,0x01,0xc5,0x69,0x54,0x00,0x40,0x07,0x03,0x00, 0x60,0x01,0x05,0x33,0x05,0x71,0x54,0x01,0x05,0x73,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x36,0x45,0x71,0x54,0x01,0x45,0x73,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x39,0x85,0x71,0x54,0x01,0x85,0x73,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x3c,0xc5,0x71,0x54,0x01,0xc5,0x73,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x3f,0x05,0x7b,0x54,0x01,0x05,0x7d,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x42,0x45,0x7b,0x54,0x01,0x45,0x7d,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x45,0x85,0x7b,0x54,0x01,0x85,0x7d,0x54,0x00,0x40,0x00,0x03,0x00, 0x60,0x01,0x05,0x48,0xc5,0x7b,0x54,0x01,0xc5,0x7d,0x54,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x09,0x85,0x08,0x34,0x06,0x05,0x08,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x1f,0x85,0x1e,0x34,0x06,0x05,0x1e,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x22,0x85,0x21,0x34,0x06,0x05,0x21,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x25,0x85,0x24,0x34,0x06,0x05,0x24,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x28,0x85,0x27,0x34,0x06,0x05,0x27,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x2b,0x85,0x2a,0x34,0x06,0x05,0x2a,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x2e,0x85,0x2d,0x34,0x06,0x05,0x2d,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x31,0x85,0x30,0x34,0x06,0x05,0x30,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x34,0x85,0x33,0x34,0x06,0x05,0x33,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x37,0x85,0x36,0x34,0x06,0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x3a,0x85,0x39,0x34,0x06,0x05,0x39,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x3d,0x85,0x3c,0x34,0x06,0x05,0x3c,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x40,0x85,0x3f,0x34,0x06,0x05,0x3f,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x43,0x85,0x42,0x34,0x06,0x05,0x42,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x46,0x85,0x45,0x34,0x06,0x05,0x45,0x34,0x00,0x40,0x00,0x02,0x00, 0x60,0x06,0x05,0x49,0x85,0x48,0x34,0x06,0x05,0x48,0x34,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x25,0x0a,0x45,0x09,0x22,0x06,0x05,0x09,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x20,0x45,0x1f,0x22,0x06,0x05,0x1f,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x23,0x45,0x22,0x22,0x06,0x05,0x22,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x26,0x45,0x25,0x22,0x06,0x05,0x25,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x29,0x45,0x28,0x22,0x06,0x05,0x28,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x2c,0x45,0x2b,0x22,0x06,0x05,0x2b,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x2f,0x45,0x2e,0x22,0x06,0x05,0x2e,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x32,0x45,0x31,0x22,0x06,0x05,0x31,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x35,0x45,0x34,0x22,0x06,0x05,0x34,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x38,0x45,0x37,0x22,0x06,0x05,0x37,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x3b,0x45,0x3a,0x22,0x06,0x05,0x3a,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x3e,0x45,0x3d,0x22,0x06,0x05,0x3d,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x41,0x45,0x40,0x22,0x06,0x05,0x40,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x44,0x45,0x43,0x22,0x06,0x05,0x43,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x47,0x45,0x46,0x22,0x06,0x05,0x46,0x22,0x00,0x40,0x00,0x01,0x00, 0x60,0x06,0x05,0x4a,0x45,0x49,0x22,0x06,0x05,0x49,0x22,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x05,0x1c,0x24,0x0a,0x00,0x06,0x44,0x0a,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x25,0x1c,0x04,0x20,0x00,0x06,0x24,0x20,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x45,0x1c,0x04,0x23,0x00,0x06,0x24,0x23,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x65,0x1c,0x04,0x26,0x00,0x06,0x24,0x26,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0x85,0x1c,0x04,0x29,0x00,0x06,0x24,0x29,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0xa5,0x1c,0x04,0x2c,0x00,0x06,0x24,0x2c,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0xc5,0x1c,0x04,0x2f,0x00,0x06,0x24,0x2f,0x00,0x00,0x40,0x00,0x00,0x00, 0x60,0x06,0xe5,0x1c,0x04,0x32,0x00,0x06,0x24,0x32,0x00,0x00,0x40,0x00,0x1d,0xa8, 0x12,0x35,0x11,0x35,0x40,0x00,0x00,0x00,0x60,0x06,0x25,0x1d,0x04,0x38,0x00,0x06, 0x24,0x38,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x45,0x1d,0x04,0x3b,0x00,0x06, 0x24,0x3b,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x65,0x1d,0x04,0x3e,0x00,0x06, 0x24,0x3e,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0x85,0x1d,0x04,0x41,0x00,0x06, 0x24,0x41,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xa5,0x1d,0x04,0x44,0x00,0x06, 0x24,0x44,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xc5,0x1d,0x04,0x47,0x00,0x06, 0x24,0x47,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x06,0xe5,0x1d,0x04,0x4a,0x00,0x06, 0x24,0x4a,0x00,0x00,0x38,0x45,0x04,0x00,0xa0,0x0a,0x05,0x4e,0x04,0x0a,0x00,0x10, 0x00,0x00,0x00,0x00,0x68,0x01,0x04,0x00,0x20,0x82,0x05,0x1c,0x05,0x1c,0x46,0x01, 0x04,0x00,0x04,0x00,0x38,0x46,0x04,0x00,0xa0,0x0a,0x05,0x52,0x04,0x0a,0x00,0x10, 0x00,0x00,0x00,0x00,0x61,0x01,0x4b,0x60,0x06,0x1c,0x00,0x00,0x41,0x95,0x50,0x20, 0x00,0x4b,0x00,0x4e,0x41,0x00,0x4b,0xe0,0x00,0x4b,0x00,0x40,0x38,0xa7,0x04,0x00, 0xa0,0x2a,0x05,0x50,0x05,0x50,0x46,0x30,0x00,0x00,0x00,0x00,0x41,0x96,0x4b,0x20, 0x00,0x4b,0x00,0x52,0x61,0x00,0x56,0xa8,0x00,0x00,0x81,0x40,0x38,0xa8,0x04,0x00, 0xa0,0x2a,0x05,0x4b,0x05,0x4b,0x46,0x30,0x00,0x00,0x00,0x00,0x01,0x28,0x00,0xe8, 0x01,0x00,0x11,0x00,0x40,0x27,0x54,0x20,0x00,0x50,0x00,0x4b,0x61,0x00,0x02,0x00, 0x50,0x00,0x05,0x71,0x2d,0x13,0x52,0x00,0x00,0x00,0x00,0x00,0x48,0x02,0x54,0x20, 0x00,0x54,0x10,0x56,0x40,0x02,0x02,0x00,0x60,0x00,0x05,0x72,0x3d,0x13,0x52,0x05, 0x05,0x71,0x34,0x00,0x38,0xa9,0x04,0x00,0xa0,0x0a,0x05,0x59,0x05,0x54,0x46,0x10, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x74,0xad,0x12,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x02,0x02,0x00,0x60,0x00,0x05,0x72,0xb5,0x12,0x52,0x06, 0x05,0x72,0x34,0x00,0x38,0x4a,0x04,0x00,0xa0,0x0a,0x05,0x5b,0x05,0x54,0x46,0x10, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x79,0x3d,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5e,0x0d,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x69,0x1d,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x38,0x4b,0x04,0x00,0xa0,0x0a,0x05,0x57,0x05,0x54,0x46,0x10, 0x00,0x00,0x00,0x00,0x40,0x05,0x02,0x00,0x60,0x00,0x05,0x75,0xad,0x13,0x52,0x05, 0x05,0x74,0x34,0x00,0x40,0x05,0x02,0x00,0x60,0x00,0x05,0x72,0xb5,0x13,0x52,0x06, 0x05,0x72,0x34,0x00,0x41,0x29,0x50,0x20,0x00,0x50,0x00,0x59,0x61,0x00,0x02,0x00, 0x50,0x00,0x05,0x0a,0xa5,0x13,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x7a,0x4d,0x13,0x52,0x05,0x05,0x79,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x5f,0x1d,0x13,0x52,0x05,0x05,0x5e,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x6a,0x2d,0x13,0x52,0x05,0x05,0x69,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x75,0xbd,0x12,0x52,0x06,0x05,0x75,0x34,0x00,0x61,0x07,0x02,0x00, 0xa0,0x06,0x05,0x73,0x05,0x72,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x50,0x00,0x05,0x61,0x8d,0x13,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x00,0x05,0x70,0x35,0x13,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x50,0x00,0x05,0x6c,0x9d,0x12,0x52,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x50,0x00,0x05,0x7c,0xbd,0x12,0x52,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x0b,0x1d,0x14,0x52,0x05,0x05,0x0a,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x7a,0xc5,0x12,0x52,0x06,0x05,0x7a,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x5f,0x95,0x12,0x52,0x06,0x05,0x5f,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x6a,0xa5,0x12,0x52,0x06,0x05,0x6a,0x34,0x00,0x40,0x07,0x02,0x00, 0x60,0x00,0x05,0x75,0xbd,0x13,0x52,0x06,0x05,0x75,0x34,0x00,0x41,0x07,0x02,0x00, 0xa0,0x0a,0x05,0x73,0x44,0x50,0x00,0x0a,0x05,0x73,0x34,0x00,0x41,0x2a,0x4b,0x20, 0x00,0x4b,0x00,0x5b,0x61,0x00,0x02,0x00,0x50,0x00,0x45,0x0d,0x9d,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x62,0x9d,0x13,0x52,0x05, 0x05,0x61,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x6d,0x9d,0x13,0x52,0x05, 0x05,0x6c,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x7d,0xbd,0x13,0x52,0x05, 0x05,0x7c,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x0b,0x2d,0x14,0x52,0x06, 0x05,0x0b,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x7a,0xc5,0x13,0x52,0x06, 0x05,0x7a,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x5f,0x95,0x13,0x52,0x06, 0x05,0x5f,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x6a,0xa5,0x13,0x52,0x06, 0x05,0x6a,0x34,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x76,0x05,0x75,0x34,0x00, 0x00,0x00,0x00,0x00,0x5b,0xfb,0x02,0x00,0xa0,0x0a,0x04,0x70,0x05,0x73,0x02,0x0a, 0x05,0x70,0x44,0x57,0x40,0x07,0x02,0x00,0x60,0x00,0x25,0x0e,0xad,0x13,0x52,0x05, 0x45,0x0d,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x63,0x8d,0x12,0x52,0x06, 0x05,0x62,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x6d,0xad,0x12,0x52,0x06, 0x05,0x6d,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x7d,0xcd,0x12,0x52,0x06, 0x05,0x7d,0x34,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x05,0x0b,0xa5,0x14,0x52,0x06, 0x05,0x0b,0x34,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x7b,0x05,0x7a,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x60,0x05,0x5f,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x6b,0x05,0x6a,0x34,0x00, 0x00,0x00,0x00,0x00,0x5b,0x07,0x02,0x00,0xa0,0x0a,0x04,0x76,0x05,0x70,0x02,0x0a, 0x05,0x76,0x44,0x4b,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x04,0x95,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x78,0x45,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x5d,0x15,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x68,0x25,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x25,0x0e,0x9d,0x14,0x52,0x06, 0x25,0x0e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x63,0x9d,0x12,0x52,0x06, 0x05,0x63,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6d,0xad,0x13,0x52,0x06, 0x05,0x6d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x7d,0xcd,0x13,0x52,0x06, 0x05,0x7d,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x25,0x0c,0x05,0x0b,0x34,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x7b,0x64,0x50,0x00,0x0a, 0x05,0x7b,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x60,0x04,0x50,0x00,0x0a, 0x05,0x60,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x6b,0x24,0x50,0x00,0x0a, 0x05,0x6b,0x34,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x76,0x05,0x76,0x34,0x0a, 0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x05,0x0d,0x14,0x52,0x05, 0x05,0x04,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x09,0x25,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x25,0x0e,0xad,0x14,0x52,0x06, 0x25,0x0e,0x34,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x64,0x05,0x63,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x05,0x6e,0x05,0x6d,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0,0x06,0x85,0x01,0x05,0x7d,0x34,0x00, 0x00,0x00,0x00,0x00,0x41,0x07,0x02,0x00,0xa0,0x0a,0x25,0x0c,0xa4,0x50,0x00,0x0a, 0x25,0x0c,0x34,0x00,0x5b,0x07,0x02,0x00,0xa0,0x0a,0x04,0x78,0x05,0x7b,0x02,0x0a, 0x05,0x78,0x64,0x57,0x5b,0x07,0x02,0x00,0xa0,0x0a,0x04,0x5d,0x05,0x60,0x02,0x0a, 0x05,0x5d,0x04,0x57,0x5b,0x07,0x02,0x00,0xa0,0x0a,0x04,0x68,0x05,0x6b,0x02,0x0a, 0x05,0x68,0x24,0x57,0x61,0x07,0x02,0x00,0x60,0x0a,0x05,0x77,0x05,0x76,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x22,0x04,0x00,0x50,0x00,0x05,0x76,0x45,0x18,0x44,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x05,0x1d,0x14,0x52,0x06, 0x05,0x05,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x25,0xc5,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x28,0xbd,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x20,0xad,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x1d,0xb5,0x13,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x45,0x0f,0x25,0x0e,0x34,0x00, 0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x09,0x25,0x0c,0x02,0x0a, 0x05,0x09,0xa4,0x57,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x84,0x01,0x05,0x78,0x02,0x0a, 0x85,0x01,0x64,0x4b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x64,0x05,0x5d,0x02,0x0a, 0x05,0x64,0x04,0x4b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x6e,0x05,0x68,0x02,0x0a, 0x05,0x6e,0x24,0x4b,0x61,0x00,0x01,0x00,0x40,0x04,0x25,0x66,0x04,0x77,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40,0x04,0x65,0x66,0x44,0x77,0x30,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x77,0x55,0x18,0x44,0x05, 0x05,0x76,0x58,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x05,0x95,0x14,0x52,0x06, 0x05,0x05,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x2d,0x95,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x30,0x8d,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x45,0xc5,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x48,0xbd,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x3d,0xb5,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x40,0xad,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x35,0xa5,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x38,0x9d,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x4f,0x95,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x54,0x8d,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5e,0x9d,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x5b,0xa5,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x70,0xbd,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x63,0xb5,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x6d,0xc5,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x7b,0x05,0x18,0x44,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x26,0x3d,0x14,0x52,0x05, 0x05,0x25,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x29,0xcd,0x13,0x52,0x05, 0x05,0x28,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x21,0xbd,0x13,0x52,0x05, 0x05,0x20,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1e,0x2d,0x14,0x52,0x05, 0x05,0x1d,0x34,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x44,0x0f,0x05,0x09,0x02,0x0a, 0x45,0x0f,0xa4,0x4b,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x64,0x05,0x64,0x34,0x0a, 0x00,0x00,0x00,0x3f,0x61,0x00,0x02,0x00,0x50,0x00,0x05,0x68,0xad,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x6e,0x05,0x6e,0x34,0x0a, 0x00,0x00,0x00,0x3f,0x61,0x23,0x04,0x00,0x50,0x00,0x05,0x09,0x45,0x1a,0x44,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x62,0x8d,0x14,0x52,0x06, 0x05,0x62,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x77,0x0d,0x18,0x44,0x06, 0x05,0x77,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x06,0x05,0x05,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2e,0x0d,0x15,0x52,0x05, 0x05,0x2d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x31,0x9d,0x14,0x52,0x05, 0x05,0x30,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x46,0x3d,0x15,0x52,0x05, 0x05,0x45,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x49,0xcd,0x14,0x52,0x05, 0x05,0x48,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0x2d,0x15,0x52,0x05, 0x05,0x3d,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x41,0xbd,0x14,0x52,0x05, 0x05,0x40,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x36,0x1d,0x15,0x52,0x05, 0x05,0x35,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x39,0xad,0x14,0x52,0x05, 0x05,0x38,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x52,0x0d,0x16,0x52,0x05, 0x05,0x4f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x55,0x9d,0x15,0x52,0x05, 0x05,0x54,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5f,0xad,0x15,0x52,0x05, 0x05,0x5e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5c,0x1d,0x16,0x52,0x05, 0x05,0x5b,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x71,0xcd,0x15,0x52,0x05, 0x05,0x70,0x34,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x7c,0x15,0x18,0x44,0x05, 0x05,0x7b,0x58,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x26,0x4d,0x14,0x52,0x06, 0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x29,0xbd,0x14,0x52,0x06, 0x05,0x29,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x21,0xad,0x14,0x52,0x06, 0x05,0x21,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1e,0x3d,0x14,0x52,0x06, 0x05,0x1e,0x34,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x65,0x05,0x64,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x69,0xbd,0x15,0x52,0x05, 0x05,0x68,0x34,0x00,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x6f,0x05,0x6e,0x34,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x0a,0x55,0x1a,0x44,0x05, 0x05,0x09,0x58,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x64,0x2d,0x16,0x52,0x05, 0x05,0x63,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0x3d,0x16,0x52,0x05, 0x05,0x6d,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x03,0x15,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x62,0x9d,0x14,0x52,0x06, 0x05,0x62,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x06,0x84,0x50,0x00,0x0a, 0x05,0x06,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x24,0x45,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x1c,0x35,0x14,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x77,0x8d,0x18,0x44,0x06, 0x05,0x77,0x46,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2e,0x1d,0x15,0x52,0x06, 0x05,0x2e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x31,0x8d,0x15,0x52,0x06, 0x05,0x31,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x46,0x4d,0x15,0x52,0x06, 0x05,0x46,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x49,0xbd,0x15,0x52,0x06, 0x05,0x49,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0x3d,0x15,0x52,0x06, 0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x41,0xad,0x15,0x52,0x06, 0x05,0x41,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x36,0x2d,0x15,0x52,0x06, 0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x39,0x9d,0x15,0x52,0x06, 0x05,0x39,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x52,0x1d,0x16,0x52,0x06, 0x05,0x52,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x55,0x8d,0x16,0x52,0x06, 0x05,0x55,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5f,0x9d,0x16,0x52,0x06, 0x05,0x5f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5c,0x2d,0x16,0x52,0x06, 0x05,0x5c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x71,0xbd,0x16,0x52,0x06, 0x05,0x71,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x26,0xc5,0x14,0x52,0x06, 0x05,0x26,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x29,0xcd,0x14,0x52,0x06, 0x05,0x29,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x21,0xbd,0x14,0x52,0x06, 0x05,0x21,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x1e,0xb5,0x14,0x52,0x06, 0x05,0x1e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x69,0xad,0x16,0x52,0x06, 0x05,0x69,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x64,0x3d,0x16,0x52,0x06, 0x05,0x64,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0x4d,0x16,0x52,0x06, 0x05,0x6e,0x34,0x00,0x61,0x00,0x04,0x00,0x50,0x00,0x05,0x14,0x05,0x1a,0x44,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x7c,0x85,0x18,0x44,0x06, 0x05,0x7c,0x46,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x0a,0x0d,0x1a,0x44,0x06, 0x05,0x0a,0x46,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x07,0x05,0x62,0x34,0x00, 0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x03,0x05,0x06,0x02,0x0a, 0x05,0x03,0x84,0x57,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x3c,0x35,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x34,0x25,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x2c,0x15,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x44,0x45,0x15,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x4e,0x15,0x16,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x5a,0x25,0x16,0x52,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x6c,0x45,0x16,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x2e,0x95,0x15,0x52,0x06, 0x05,0x2e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x31,0x9d,0x15,0x52,0x06, 0x05,0x31,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x46,0xc5,0x15,0x52,0x06, 0x05,0x46,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x49,0xcd,0x15,0x52,0x06, 0x05,0x49,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x3e,0xb5,0x15,0x52,0x06, 0x05,0x3e,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x41,0xbd,0x15,0x52,0x06, 0x05,0x41,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x36,0xa5,0x15,0x52,0x06, 0x05,0x36,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x39,0xad,0x15,0x52,0x06, 0x05,0x39,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x52,0x95,0x16,0x52,0x06, 0x05,0x52,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x55,0x9d,0x16,0x52,0x06, 0x05,0x55,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5f,0xad,0x16,0x52,0x06, 0x05,0x5f,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x5c,0xa5,0x16,0x52,0x06, 0x05,0x5c,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x71,0xcd,0x16,0x52,0x06, 0x05,0x71,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x69,0xbd,0x16,0x52,0x06, 0x05,0x69,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x64,0xb5,0x16,0x52,0x06, 0x05,0x64,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x05,0x6e,0xc5,0x16,0x52,0x06, 0x05,0x6e,0x34,0x00,0x61,0x00,0x02,0x00,0xa0,0x00,0x05,0x62,0x35,0x16,0x52,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x60,0x00,0x05,0x15,0x15,0x1a,0x44,0x05, 0x05,0x14,0x58,0x00,0x40,0x00,0x02,0x00,0xa0,0x8a,0x85,0x01,0x85,0x01,0x34,0x0a, 0x00,0x00,0x00,0x3f,0x61,0x00,0x79,0xa0,0x07,0x77,0x00,0x00,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x07,0x05,0x03,0x02,0x0a,0x05,0x07,0x84,0x4b,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x7c,0x95,0x18,0x44,0x06,0x05,0x7c,0x46,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x0a,0x8d,0x1a,0x44,0x06,0x05,0x0a,0x46,0x00,0x61,0x00,0x04,0x00, 0xa0,0x00,0x05,0x74,0x4d,0x18,0x44,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x05,0x66,0x04,0x65,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x45,0x66,0x44,0x65,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x15,0x66,0x04,0x6f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x55,0x66,0x44,0x6f,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x27,0x05,0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x1f,0x05,0x1e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x2f,0x05,0x2e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x47,0x05,0x46,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x3f,0x05,0x3e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x37,0x05,0x36,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x53,0x05,0x52,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x5d,0x05,0x5c,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x15,0x85,0x1a,0x44,0x06,0x05,0x15,0x46,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x02,0x85,0x01,0x34,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x20,0x20, 0x01,0x50,0x00,0x79,0x40,0x00,0x02,0x00,0xa0,0x8a,0x05,0x07,0x05,0x07,0x34,0x0a, 0x00,0x00,0x00,0x3f,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x65,0x05,0x64,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0,0x06,0x05,0x6f,0x05,0x6e,0x34,0x00, 0x00,0x00,0x00,0x00,0x61,0x00,0x12,0xa0,0x07,0x0a,0x00,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x27,0xe4,0x50,0x00,0x0a,0x05,0x27,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x1f,0xc4,0x50,0x00,0x0a,0x05,0x1f,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x2f,0x04,0x51,0x00,0x0a,0x05,0x2f,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x47,0x64,0x51,0x00,0x0a,0x05,0x47,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x3f,0x44,0x51,0x00,0x0a,0x05,0x3f,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x37,0x24,0x51,0x00,0x0a,0x05,0x37,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x53,0x84,0x51,0x00,0x0a,0x05,0x53,0x34,0x00,0x41,0x00,0x02,0x00, 0xa0,0x0a,0x05,0x5d,0xa4,0x51,0x00,0x0a,0x05,0x5d,0x34,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x35,0x66,0x04,0x02,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x75,0x66,0x44,0x02,0x30,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x20,0x20, 0x01,0x57,0x00,0x74,0x61,0x00,0x02,0x00,0x60,0x0a,0x05,0x08,0x05,0x07,0x34,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x65,0xc4,0x51,0x00,0x0a, 0x05,0x65,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x0a,0x05,0x6f,0xe4,0x51,0x00,0x0a, 0x05,0x6f,0x34,0x00,0x61,0x00,0x02,0xa0,0x07,0x7c,0x00,0x00,0x40,0x00,0x04,0x00, 0x60,0x00,0x05,0x15,0x95,0x1a,0x44,0x06,0x05,0x15,0x46,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x2a,0x05,0x29,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x22,0x05,0x21,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x32,0x05,0x31,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x4a,0x05,0x49,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x42,0x05,0x41,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x3a,0x05,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x56,0x05,0x55,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x60,0x05,0x5f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x72,0x05,0x71,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0xa0,0x06,0x05,0x6a,0x05,0x69,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x24,0x05,0x27,0x02,0x0a,0x05,0x24,0xe4,0x57,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x1c,0x05,0x1f,0x02,0x0a,0x05,0x1c,0xc4,0x57,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x2c,0x05,0x2f,0x02,0x0a,0x05,0x2c,0x04,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x44,0x05,0x47,0x02,0x0a,0x05,0x44,0x64,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x3c,0x05,0x3f,0x02,0x0a,0x05,0x3c,0x44,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x34,0x05,0x37,0x02,0x0a,0x05,0x34,0x24,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x4e,0x05,0x53,0x02,0x0a,0x05,0x4e,0x84,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x5a,0x05,0x5d,0x02,0x0a,0x05,0x5a,0xa4,0x58,0x61,0x00,0x01,0x00, 0x40,0x04,0x85,0x66,0x04,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xc5,0x66,0x44,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x62,0x05,0x65,0x02,0x0a,0x05,0x62,0xc4,0x58,0x5b,0x00,0x02,0x00, 0xa0,0x0a,0x04,0x6c,0x05,0x6f,0x02,0x0a,0x05,0x6c,0xe4,0x58,0x48,0x00,0x02,0x20, 0x00,0x4b,0x00,0x02,0x61,0x00,0x04,0x00,0xa0,0x00,0x05,0x07,0x4d,0x1a,0x44,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x20,0x20,0x01,0x50,0x00,0x12,0x61,0x00,0x17,0xa0, 0x07,0x15,0x00,0x00,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x2a,0x05,0x24,0x02,0x0a, 0x05,0x2a,0xe4,0x4b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x22,0x05,0x1c,0x02,0x0a, 0x05,0x22,0xc4,0x4b,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x32,0x05,0x2c,0x02,0x0a, 0x05,0x32,0x04,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x4a,0x05,0x44,0x02,0x0a, 0x05,0x4a,0x64,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x42,0x05,0x3c,0x02,0x0a, 0x05,0x42,0x44,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x3a,0x05,0x34,0x02,0x0a, 0x05,0x3a,0x24,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x56,0x05,0x4e,0x02,0x0a, 0x05,0x56,0x84,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x60,0x05,0x5a,0x02,0x0a, 0x05,0x60,0xa4,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x6a,0x05,0x62,0x02,0x0a, 0x05,0x6a,0xc4,0x4c,0x5b,0x00,0x02,0x00,0xa0,0x0a,0x04,0x72,0x05,0x6c,0x02,0x0a, 0x05,0x72,0xe4,0x4c,0x48,0x00,0x20,0x20,0x01,0x57,0x00,0x07,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x45,0x0f,0x45,0x0f,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x2a,0x05,0x2a,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x22,0x05,0x22,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x32,0x05,0x32,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x4a,0x05,0x4a,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x42,0x05,0x42,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x3a,0x05,0x3a,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x56,0x05,0x56,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x60,0x05,0x60,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x6a,0x05,0x6a,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x00,0x02,0x00, 0xa0,0x8a,0x05,0x72,0x05,0x72,0x34,0x0a,0x00,0x00,0x00,0x3f,0x48,0x00,0x4b,0x20, 0x00,0x4b,0x00,0x17,0x40,0x00,0x02,0xe0,0x00,0x02,0x00,0x3f,0x61,0x00,0x02,0x00, 0x60,0x0a,0x25,0x10,0x45,0x0f,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x2b,0x05,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x23,0x05,0x22,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x33,0x05,0x32,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x4d,0x05,0x4a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x43,0x05,0x42,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x3b,0x05,0x3a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x59,0x05,0x56,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x61,0x05,0x60,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x6b,0x05,0x6a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00, 0x60,0x0a,0x05,0x73,0x05,0x72,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x4b,0xe0, 0x00,0x4b,0x00,0x3f,0x61,0x00,0x11,0x62,0x00,0x0c,0x01,0x00,0x61,0x00,0x11,0x62, 0x60,0x0d,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x00,0x80,0x0a,0x02,0x61,0x00,0x04,0xe0,0x05,0x02,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x95,0x66,0x24,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xd5,0x66,0x64,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xb5,0x66,0x04,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xf5,0x66,0x44,0x2b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xa5,0x66,0x04,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xe5,0x66,0x44,0x23,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x05,0x67,0x04,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x45,0x67,0x44,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x35,0x67,0x04,0x4d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x75,0x67,0x44,0x4d,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x25,0x67,0x04,0x43,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x65,0x67,0x44,0x43,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x15,0x67,0x04,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x55,0x67,0x44,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x85,0x67,0x04,0x59,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xc5,0x67,0x44,0x59,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0x95,0x67,0x04,0x61,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xd5,0x67,0x44,0x61,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xa5,0x67,0x04,0x6b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xe5,0x67,0x44,0x6b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xb5,0x67,0x04,0x73,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00, 0x40,0x04,0xf5,0x67,0x44,0x73,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x19,0xe0, 0x05,0x4b,0x00,0x00,0x31,0xac,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x11,0x00,0xc0, 0x14,0x66,0x00,0x00,0x61,0x00,0x04,0x00,0x40,0x04,0x05,0x06,0x04,0x04,0x30,0x00, 0x00,0x00,0x00,0x00,0x61,0x3c,0x00,0x80,0xa0,0x4a,0x45,0x11,0x00,0x00,0x00,0x00, 0x03,0x00,0x03,0x00,0x61,0x00,0x11,0x62,0x00,0x0e,0x01,0x00,0x61,0x00,0x11,0x62, 0x60,0x0f,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02, 0x01,0x80,0x0a,0x02,0x61,0x06,0x04,0x00,0x40,0x04,0x05,0x1b,0x04,0x19,0x30,0x00, 0x00,0x00,0x00,0x00,0x31,0xbd,0x03,0x80,0x00,0x00,0x01,0x00,0x04,0x11,0x00,0xc0, 0x0c,0x06,0x00,0x00,0x61,0x3d,0x11,0x62,0x60,0x10,0x01,0x00,0x31,0x9e,0x03,0x80, 0x00,0x00,0x01,0x00,0x04,0x11,0x00,0xc0,0x0c,0x1b,0x00,0x00,0x31,0x00,0x03,0x80, 0x04,0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00,0x8d,0x00,0x00,0x00, 0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f, 0x34,0x78,0x34,0x00,0x6e,0x75,0x6c,0x6c,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f, 0x78,0x00,0x74,0x68,0x72,0x65,0x61,0x64,0x5f,0x79,0x00,0x67,0x72,0x6f,0x75,0x70, 0x5f,0x69,0x64,0x5f,0x78,0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x79, 0x00,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5f,0x7a,0x00,0x74,0x73,0x63,0x00, 0x72,0x30,0x00,0x61,0x72,0x67,0x00,0x72,0x65,0x74,0x76,0x61,0x6c,0x00,0x73,0x70, 0x00,0x66,0x70,0x00,0x68,0x77,0x5f,0x69,0x64,0x00,0x73,0x72,0x30,0x00,0x63,0x72, 0x30,0x00,0x63,0x65,0x30,0x00,0x64,0x62,0x67,0x30,0x00,0x63,0x6f,0x6c,0x6f,0x72, 0x00,0x54,0x30,0x00,0x54,0x31,0x00,0x54,0x32,0x00,0x54,0x53,0x53,0x00,0x54,0x32, 0x35,0x32,0x00,0x54,0x32,0x35,0x35,0x00,0x53,0x33,0x31,0x00,0x56,0x33,0x32,0x00, 0x56,0x33,0x33,0x00,0x56,0x33,0x34,0x00,0x56,0x33,0x35,0x00,0x56,0x33,0x36,0x00, 0x56,0x33,0x37,0x00,0x56,0x33,0x38,0x00,0x56,0x33,0x39,0x00,0x56,0x34,0x30,0x00, 0x56,0x34,0x31,0x00,0x56,0x34,0x32,0x00,0x56,0x34,0x33,0x00,0x56,0x34,0x34,0x00, 0x56,0x34,0x35,0x00,0x56,0x34,0x36,0x00,0x56,0x34,0x37,0x00,0x56,0x34,0x38,0x00, 0x56,0x34,0x39,0x00,0x56,0x35,0x30,0x00,0x56,0x35,0x31,0x00,0x56,0x35,0x32,0x00, 0x56,0x35,0x33,0x00,0x56,0x35,0x34,0x00,0x56,0x35,0x35,0x00,0x56,0x35,0x36,0x00, 0x56,0x35,0x37,0x00,0x56,0x35,0x38,0x00,0x56,0x35,0x39,0x00,0x56,0x36,0x30,0x00, 0x56,0x36,0x31,0x00,0x56,0x36,0x32,0x00,0x56,0x36,0x33,0x00,0x56,0x36,0x34,0x00, 0x56,0x36,0x35,0x00,0x56,0x36,0x36,0x00,0x56,0x36,0x37,0x00,0x56,0x36,0x38,0x00, 0x56,0x36,0x39,0x00,0x56,0x37,0x30,0x00,0x56,0x37,0x31,0x00,0x56,0x37,0x32,0x00, 0x56,0x37,0x33,0x00,0x56,0x37,0x34,0x00,0x56,0x37,0x35,0x00,0x56,0x37,0x36,0x00, 0x56,0x37,0x37,0x00,0x56,0x37,0x38,0x00,0x56,0x37,0x39,0x00,0x56,0x38,0x30,0x00, 0x56,0x38,0x31,0x00,0x56,0x38,0x32,0x00,0x56,0x38,0x33,0x00,0x56,0x38,0x34,0x00, 0x56,0x38,0x35,0x00,0x56,0x38,0x36,0x00,0x56,0x38,0x37,0x00,0x56,0x38,0x38,0x00, 0x56,0x38,0x39,0x00,0x56,0x39,0x30,0x00,0x56,0x39,0x31,0x00,0x56,0x39,0x32,0x00, 0x56,0x39,0x33,0x00,0x56,0x39,0x34,0x00,0x56,0x39,0x35,0x00,0x56,0x39,0x36,0x00, 0x56,0x39,0x37,0x00,0x56,0x39,0x38,0x00,0x56,0x39,0x39,0x00,0x56,0x31,0x30,0x30, 0x00,0x56,0x31,0x30,0x31,0x00,0x56,0x31,0x30,0x32,0x00,0x56,0x31,0x30,0x33,0x00, 0x56,0x31,0x30,0x34,0x00,0x56,0x31,0x30,0x35,0x00,0x56,0x31,0x30,0x36,0x00,0x56, 0x31,0x30,0x37,0x00,0x56,0x31,0x30,0x38,0x00,0x56,0x31,0x30,0x39,0x00,0x56,0x31, 0x31,0x30,0x00,0x56,0x31,0x31,0x31,0x00,0x56,0x31,0x31,0x32,0x00,0x56,0x31,0x31, 0x33,0x00,0x56,0x31,0x31,0x34,0x00,0x56,0x31,0x31,0x35,0x00,0x56,0x31,0x31,0x36, 0x00,0x56,0x31,0x31,0x37,0x00,0x56,0x31,0x31,0x38,0x00,0x56,0x31,0x31,0x39,0x00, 0x56,0x31,0x32,0x30,0x00,0x56,0x31,0x32,0x31,0x00,0x56,0x31,0x32,0x32,0x00,0x56, 0x31,0x32,0x33,0x00,0x56,0x31,0x32,0x34,0x00,0x56,0x31,0x32,0x35,0x00,0x56,0x31, 0x32,0x36,0x00,0x56,0x31,0x32,0x37,0x00,0x56,0x31,0x32,0x38,0x00,0x56,0x31,0x32, 0x39,0x00,0x56,0x31,0x33,0x30,0x00,0x56,0x31,0x33,0x31,0x00,0x56,0x31,0x33,0x32, 0x00,0x56,0x31,0x33,0x33,0x00,0x56,0x31,0x33,0x34,0x00,0x56,0x31,0x33,0x35,0x00, 0x56,0x31,0x33,0x36,0x00,0x56,0x31,0x33,0x37,0x00,0x56,0x31,0x33,0x38,0x00,0x56, 0x31,0x33,0x39,0x00,0x56,0x31,0x34,0x30,0x00,0x53,0x70,0x61,0x74,0x69,0x61,0x6c, 0x44,0x65,0x6e,0x6f,0x69,0x73,0x65,0x72,0x5f,0x34,0x78,0x34,0x5f,0x42,0x42,0x5f, 0x30,0x5f,0x38,0x33,0x00,0x54,0x36,0x00,0x54,0x37,0x00,0x54,0x38,0x00,0x41,0x73, 0x6d,0x4e,0x61,0x6d,0x65,0x00,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0x00,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x53,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x55, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x13,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x13,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x53,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x53,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00, 0x00,0x27,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x27, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x21,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3e,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00, 0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x27,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x27,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x25,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x21,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x27,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4e,0x00,0x00,0x00,0x55,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x01,0x01,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x02,0x02,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x02,0x01,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00, 0x00,0x01,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00, 0x02,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x01, 0x01,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x01, 0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x05,0x80,0x00, 0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x03,0x40,0x00,0x27, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x07,0x01,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x01,0x00,0x28,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x01,0x01,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x03,0x08,0x00,0x2b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5e,0x00,0x00,0x00,0x04,0x30,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5f,0x00,0x00,0x00,0x03,0x04,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x03,0x02,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x03,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00, 0x00,0x02,0x01,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00, 0x01,0x10,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x03, 0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x03,0x20, 0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x01,0x02,0x00, 0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x02,0x10,0x00,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x01,0x04,0x00,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x01,0x02,0x00,0x32,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x01,0x02,0x00,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x02,0x00,0x34,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x04,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x07,0x04,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x07,0x04,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6f,0x00,0x00,0x00,0x07,0x04,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70, 0x00,0x00,0x00,0x07,0x04,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x01,0x04,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x00,0x00, 0x00,0x07,0x04,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00, 0x01,0x04,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x01, 0x04,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x07,0x04, 0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x01,0x04,0x00, 0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x04,0x00,0x42, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x07,0x04,0x00,0x43,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x01,0x04,0x00,0x44,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x07,0x04,0x00,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x01,0x04,0x00,0x47,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x01,0x04,0x00,0x48,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x07,0x04,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7e,0x00,0x00,0x00,0x07,0x04,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7f,0x00,0x00,0x00,0x01,0x04,0x00,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x01,0x04,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x07,0x04,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00, 0x00,0x01,0x04,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00, 0x07,0x04,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x01, 0x04,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x01, 0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x01,0x00, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0x00, 0x00,0x00,0x01,0x00,0x00,0x03,0x88,0x00,0x00,0x00,0x01,0x00,0x00,0x89,0x00,0x00, 0x00,0x01,0x00,0x00,0x8a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x06,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x02,0x07,0x00,0x00,0x00,0x24,0x00, 0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x28,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00, 0x2c,0x00,0x04,0x00,0xed,0x0b,0x00,0x00,0x8a,0x09,0x00,0x00,0x02,0x00,0x8b,0x00, 0x00,0x00,0x0d,0x67,0x65,0x6e,0x78,0x5f,0x73,0x64,0x5f,0x33,0x2e,0x61,0x73,0x6d, 0x8c,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x01, 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x56,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x01,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x59,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x24,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x58,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x01,0x02,0x00,0x00,0x00,0x35,0x03,0x00,0x06,0x05, 0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x00,0x02,0x00,0x21, 0x01,0x03,0x00,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5e, 0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05,0x07,0x00,0x00,0x20,0x41,0x01,0x00,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x00,0x00, 0x00,0x21,0x01,0x05,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x05, 0x01,0xff,0xff,0xff,0xff,0x37,0x00,0x07,0x00,0x08,0x06,0x00,0x61,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x2a,0x00,0x00, 0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x64,0x00,0x00,0x00,0x00,0x19,0x45,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x09, 0x45,0x02,0x01,0x02,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x63,0x00,0x00,0x00,0x00,0x04,0x22,0x01,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x01,0x01,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x65, 0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x00,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x66,0x00, 0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x66,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x25, 0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x68,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x05,0x02,0x04,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00, 0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x45, 0x02,0x10,0x68,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x04,0x00,0x00,0x00,0x69, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x69,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x10,0x04,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6b,0x00, 0x00,0x00,0x00,0x00,0x23,0x01,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x23,0x01,0x01, 0x01,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00, 0x00,0x00,0x04,0x22,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x00, 0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6c,0x00,0x00,0x00, 0x00,0x00,0x21,0x01,0x00,0x6c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x01,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00, 0x06,0x22,0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x02,0x22,0x01,0x01,0x00,0x00,0x00, 0x00,0x6e,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x6f,0x00,0x00,0x00,0x00,0x00, 0x21,0x01,0x00,0x6f,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x01,0x00,0x00,0x00, 0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x0c,0x22, 0x01,0x00,0x6d,0x00,0x00,0x00,0x00,0x08,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x6e, 0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x70,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x6d,0x00,0x00,0x00,0x00,0x0e,0x22,0x01,0x00, 0x6d,0x00,0x00,0x00,0x00,0x0a,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x6e,0x00,0x00, 0x00,0x00,0x03,0x00,0x02,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x71, 0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x25,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x00,0x04, 0x00,0x00,0x00,0x29,0x02,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x02,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29,0x02,0x00,0x00,0x00,0x3b,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x10,0x3b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x08,0x02, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3b,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x40, 0x03,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x5e,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x29, 0x02,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x3c,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x08,0x02,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00, 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x00,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x40,0x29,0x00,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07,0x00,0x00,0x80,0x3f, 0x0c,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x39,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00, 0x38,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x1b,0x02,0x00,0x00,0x00,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x02, 0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x03,0x02,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x02,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x09, 0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x64,0x00,0x00,0x00,0x00,0x0a,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x08,0x35, 0x02,0x01,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x01,0x35,0x02, 0x01,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x11,0x35,0x02,0x29, 0x02,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x12,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00, 0x10,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00, 0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x7a,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x02,0x35, 0x02,0x29,0x02,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7a, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c, 0x02,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00, 0x00,0x00,0x00,0x21,0x01,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x7b,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00, 0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29, 0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x54,0x00,0x00, 0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x0b,0x35,0x02,0x01,0x02,0x00,0x00,0x00, 0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x0c,0x35, 0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x0a,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x7d, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x00,0x64,0x00,0x00,0x00,0x00,0x03,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x64,0x00,0x00,0x00,0x00,0x13,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02, 0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00, 0x00,0x01,0x21,0x01,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00, 0x12,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x02,0x35,0x02,0x01,0x02,0x00,0x00, 0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x04,0x35,0x02,0x01,0x02,0x00,0x00,0x00, 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x14,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x0c,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00, 0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00, 0x43,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x01,0x21,0x01,0x00,0x46, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00, 0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00, 0x47,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x54,0x00,0x00, 0x00,0x00,0x06,0x00,0x02,0x00,0x47,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00, 0x00,0x19,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x18,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00, 0x11,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x1a, 0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x82,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x01,0x35, 0x02,0x29,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x82, 0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x10,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0x83,0x00, 0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00, 0x00,0x01,0x00,0x35,0x02,0x01,0x02,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00, 0x01,0x02,0x35,0x02,0x29,0x02,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3a,0x00,0x00,0x00,0x00,0x02,0x21,0x01, 0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x3c,0x00,0x00,0x00,0x00,0x02,0x21,0x01,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x84, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x05,0x07,0x00,0x00,0x00,0x3f,0x29,0x02,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00, 0x00,0x54,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x4d,0x00,0x00,0x00,0x00,0x00, 0x24,0x01,0x29,0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x0c,0x00,0x02,0x00, 0x4d,0x00,0x00,0x00,0x00,0x08,0x24,0x01,0x29,0x02,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x1b,0x35,0x02,0x01,0x02, 0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x00, 0x00,0x1a,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x13,0x35,0x02,0x01,0x02,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x1c,0x35,0x02,0x01,0x02,0x00,0x00, 0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x03,0x35,0x02,0x29,0x02,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x22, 0x01,0x10,0x02,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x73, 0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x22,0x01, 0x01,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00, 0x00,0x00,0x00,0x14,0x35,0x02,0x00,0x64,0x00,0x00,0x00,0x00,0x12,0x35,0x02,0x01, 0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x02,0x35,0x02,0x01,0x02, 0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00, 0x00,0x00,0x22,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x04,0x35,0x02,0x29,0x02,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x88,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x3a,0x00,0x00,0x00,0x00,0x03,0x21,0x01,0x00,0x51,0x00,0x00,0x00,0x00,0x00, 0x22,0x01,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x0c,0x02,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x00,0x00,0x03,0x21, 0x01,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x00,0x51,0x00,0x00,0x00,0x00, 0x00,0x22,0x01,0x01,0x02,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x22,0x01,0x05,0x07,0x00,0x00,0x00,0x3f,0x29, 0x02,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x89,0x00,0x00, 0x00,0x00,0x00,0x22,0x01,0x29,0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x0a, 0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x24,0x01,0x29,0x01,0x00,0x00,0x00, 0x54,0x00,0x00,0x00,0x00,0x0e,0x00,0x02,0x00,0x53,0x00,0x00,0x00,0x00,0x08,0x24, 0x01,0x38,0x00,0x08,0x00,0x04,0x04,0x00,0x8b,0x00,0x00,0x00,0x00,0x00,0x21,0x01, 0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x21,0x01,0x54,0x00,0x00,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x68,0x01,0x00,0x80,0x10,0x82,0xa6,0x01,0x24,0x00,0x00,0x01,0x0c, 0x00,0x0c,0x00,0x65,0x00,0x00,0x80,0x10,0x82,0x86,0x01,0x24,0x00,0x00,0x01,0xff, 0x0f,0xff,0x0f,0x65,0x02,0x00,0x80,0x10,0x81,0xa5,0x01,0xa4,0x01,0x00,0x01,0xff, 0x0f,0xff,0x0f,0x40,0x02,0x00,0x00,0x60,0x01,0xc5,0x01,0x64,0x01,0x00,0x01,0x84, 0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x01,0xe5,0x01,0x64,0x01,0x00,0x01,0xa4, 0x01,0x00,0x00,0x61,0x00,0x1d,0xa2,0x38,0x00,0x01,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x04,0x01,0x00,0x02,0x00,0x04,0x48,0x02,0x69,0x04,0x02,0x68,0x6a, 0x01,0x21,0x00,0x69,0x04,0x00,0x00,0x60,0x86,0x25,0x02,0xe4,0x01,0x00,0x05,0x02, 0x00,0x02,0x00,0x31,0xc0,0x04,0x80,0x00,0x00,0x05,0x03,0x04,0x1d,0x00,0xa0,0x00, 0x00,0x00,0x00,0x61,0x00,0x1e,0x64,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x20, 0x82,0x01,0x10,0x24,0x01,0x00,0x02,0x00,0x00,0x29,0x02,0x40,0x04,0x1e,0x68,0x02, 0x02,0xf1,0xff,0x40,0x04,0x1e,0x68,0xca,0x02,0xf1,0xff,0x61,0x00,0x00,0x80,0xa0, 0x4a,0x45,0x1e,0x00,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x38,0x41,0x00,0x00,0xa0, 0x4a,0x85,0x1b,0x00,0x00,0x00,0x10,0x00,0x00,0x20,0x41,0x31,0x92,0x03,0x80,0x00, 0x00,0x05,0x07,0x04,0x1e,0x00,0xc0,0x00,0x00,0x00,0x00,0x61,0x00,0x0d,0xa8,0xa0, 0x00,0x81,0x40,0x61,0x00,0x0d,0xa8,0x88,0x00,0x81,0x3f,0x61,0x00,0x7f,0x64,0x00, 0x00,0x00,0x00,0x61,0x32,0x00,0x80,0xa0,0x4a,0x45,0x1e,0x00,0x00,0x00,0x00,0x03, 0x00,0x03,0x00,0x61,0x00,0x1e,0x62,0x00,0x02,0x01,0x00,0x61,0x00,0x1e,0x62,0xc8, 0x02,0x01,0x00,0x40,0x00,0x00,0x80,0x20,0x82,0x01,0x10,0x44,0x01,0x00,0x02,0x00, 0x80,0x0a,0x02,0x61,0x20,0x00,0x00,0xa0,0x05,0xe5,0x02,0x04,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x41,0x91,0x00,0x00,0xa0,0x0a,0xe5,0x02,0xe4,0x02,0x00,0x0a,0x84, 0x1b,0x00,0x00,0x38,0x93,0x02,0x00,0xa0,0x0a,0x05,0x1f,0xe4,0x02,0x00,0x10,0x00, 0x00,0x00,0x00,0x38,0x44,0x02,0x00,0xa0,0x0a,0x05,0x20,0xe4,0x02,0x00,0x10,0x00, 0x00,0x00,0x00,0x61,0x22,0x03,0x00,0x50,0x00,0x85,0x1c,0x4d,0x07,0x44,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0xc5,0x1b,0x45,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x50,0x00,0x45,0x02,0xcd,0x07,0x44,0x05,0x85, 0x1c,0x46,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0xc5,0x1f,0x55,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x02,0x00,0x50,0x05,0x05,0x09,0x85,0x02,0x34,0x05,0x45, 0x02,0x34,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0xc5,0x20,0x8d,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x01,0x00,0x50,0x05,0xc5,0x02,0x25,0x09,0x22,0x05,0x05, 0x09,0x22,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x21,0x9d,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x50,0x05,0x95,0x01,0xc4,0x02,0x00,0x05,0xd4, 0x02,0x00,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x85,0x0e,0x55,0x07,0x42,0x05,0xc5, 0x1b,0x34,0x00,0x68,0x02,0x00,0x00,0x10,0x81,0x95,0x01,0x94,0x01,0x00,0x01,0x04, 0x00,0x04,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x85,0x12,0x65,0x07,0x42,0x05,0xc5, 0x1f,0x34,0x00,0x40,0x02,0x04,0x00,0x60,0x00,0x05,0x0a,0x05,0x07,0x44,0x01,0x94, 0x01,0x00,0x02,0x40,0x07,0x02,0x00,0x60,0x00,0x85,0x15,0xc5,0x07,0x42,0x05,0xc5, 0x20,0x34,0x00,0x61,0x02,0x04,0x00,0x60,0x16,0x05,0x0a,0x05,0x0a,0x46,0x00,0x00, 0x00,0x00,0x00,0x41,0x01,0x04,0x00,0x50,0x05,0x05,0x0c,0x04,0x0a,0x20,0x05,0x04, 0x0a,0x20,0x00,0x40,0x07,0x02,0x00,0x60,0x00,0x85,0x18,0xd5,0x07,0x42,0x05,0x85, 0x21,0x34,0x00,0x40,0x02,0x01,0x00,0x60,0x01,0x45,0x09,0x45,0x0c,0x22,0x01,0x05, 0x0c,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x01,0x85,0x09,0x65,0x0c,0x22,0x01,0x25, 0x0c,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x01,0xc5,0x09,0xc5,0x0c,0x22,0x01,0x85, 0x0c,0x22,0x00,0x40,0x00,0x01,0x00,0x60,0x01,0x05,0x0d,0xe5,0x0c,0x22,0x01,0xa5, 0x0c,0x22,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x45,0x0d,0x44,0x09,0x00,0x06,0x64, 0x09,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x65,0x0d,0x84,0x09,0x00,0x06,0xa4, 0x09,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0x85,0x0d,0xc4,0x09,0x00,0x06,0xe4, 0x09,0x00,0x00,0x40,0x04,0x00,0x00,0x60,0x06,0xa5,0x0d,0x04,0x0d,0x00,0x06,0x24, 0x0d,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x1f,0x85,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x68,0x02,0x02,0x00,0x20,0x82,0x45,0x0d,0x45,0x0d,0x34,0x01,0x04, 0x00,0x04,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0x85,0x20,0x15,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x61,0x02,0x02,0x00,0xa0,0x02,0x05,0x11,0x45,0x0d,0x34,0x00,0x00, 0x00,0x00,0x00,0x61,0x00,0x02,0x00,0x50,0x00,0xc5,0x21,0x95,0x07,0x42,0x00,0x00, 0x00,0x00,0x00,0x41,0xa3,0x02,0x00,0xa0,0x0a,0x05,0x10,0x05,0x11,0x34,0x0a,0x05, 0x1f,0x34,0x00,0x41,0x00,0x02,0x00,0xa0,0x8a,0x05,0x11,0x05,0x11,0x34,0x0a,0x00, 0x00,0x00,0x40,0x38,0xa5,0x02,0x00,0xa0,0x2a,0x05,0x10,0x05,0x10,0x34,0x30,0x00, 0x00,0x00,0x00,0x41,0x94,0x02,0x00,0xa0,0x0a,0x05,0x11,0x05,0x11,0x34,0x0a,0x05, 0x20,0x34,0x00,0x40,0x00,0x02,0x00,0x60,0x00,0x85,0x0e,0x0d,0x07,0x42,0x06,0x85, 0x0e,0x34,0x00,0x38,0xa6,0x02,0x00,0xa0,0x2a,0x05,0x11,0x05,0x11,0x34,0x30,0x00, 0x00,0x00,0x00,0x01,0x26,0x00,0xe8,0x01,0x00,0x11,0x00,0x40,0x25,0x02,0x00,0xa0, 0x0a,0x05,0x0e,0x05,0x10,0x34,0x0a,0x05,0x11,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x12,0x1d,0x07,0x42,0x06,0x85,0x12,0x34,0x00,0x5b,0x02,0x02,0x00,0xa0, 0x02,0x04,0x0e,0xe4,0x0d,0x02,0x02,0xc4,0x0d,0x05,0x0e,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x15,0xd5,0x07,0x42,0x06,0x85,0x15,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x18,0xe5,0x07,0x42,0x06,0x85,0x18,0x34,0x00,0x38,0xb7,0x02,0x00,0xa0, 0x0a,0x05,0x21,0x05,0x0e,0x34,0x10,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x16,0x95,0x07,0x42,0x05,0x85,0x1f,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x13,0x95,0x07,0x42,0x05,0x85,0x20,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x19,0xa5,0x07,0x42,0x05,0xc5,0x21,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x0e,0x8d,0x07,0x42,0x06,0x85,0x0e,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x12,0x9d,0x07,0x42,0x06,0x85,0x12,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x15,0x0d,0x08,0x42,0x06,0x85,0x15,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x18,0x1d,0x08,0x42,0x06,0x85,0x18,0x34,0x00,0x38,0x48,0x02,0x00,0xa0, 0x0a,0x05,0x0f,0x05,0x0e,0x34,0x10,0x00,0x00,0x00,0x00,0x41,0x27,0x02,0x00,0xa0, 0x0a,0x05,0x10,0x05,0x10,0x34,0x0a,0x05,0x21,0x34,0x00,0x38,0x49,0x02,0x00,0xa0, 0x0a,0x05,0x22,0x05,0x0e,0x34,0x10,0x00,0x00,0x00,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x10,0x05,0x07,0x42,0x06,0x85,0x16,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x13,0x25,0x07,0x42,0x06,0x85,0x13,0x34,0x00,0x40,0x07,0x02,0x00,0x60, 0x00,0x85,0x19,0x15,0x08,0x42,0x06,0x85,0x19,0x34,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x85,0x0f,0x85,0x0e,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x05,0x13,0x85,0x12,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x05,0x16,0x85,0x15,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x05,0x19,0x85,0x18,0x34,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x16,0x05,0x08,0x42,0x06,0x85,0x16,0x34,0x00,0x61,0x00,0x02,0x00,0xa0, 0x00,0x85,0x11,0x4d,0x07,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x00,0x05,0x14,0x5d,0x07,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x00,0x05,0x17,0xcd,0x07,0x42,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x02,0x00,0xa0, 0x00,0x05,0x1a,0xdd,0x07,0x42,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x10,0x15,0x07,0x42,0x06,0x85,0x10,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x13,0xa5,0x07,0x42,0x06,0x85,0x13,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x19,0x25,0x08,0x42,0x06,0x85,0x19,0x34,0x00,0x41,0x00,0x02,0x00,0xa0, 0x0a,0x85,0x0f,0x04,0x10,0x00,0x0a,0x85,0x0f,0x34,0x00,0x41,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x13,0x24,0x10,0x00,0x0a,0x05,0x13,0x34,0x00,0x41,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x16,0x44,0x10,0x00,0x0a,0x05,0x16,0x34,0x00,0x41,0x00,0x02,0x00,0xa0, 0x0a,0x05,0x19,0x64,0x10,0x00,0x0a,0x05,0x19,0x34,0x00,0x40,0x00,0x02,0x00,0x60, 0x00,0x85,0x16,0x15,0x08,0x42,0x06,0x85,0x16,0x34,0x00,0x41,0x29,0x02,0x00,0xa0, 0x0a,0x05,0x11,0x05,0x11,0x34,0x0a,0x05,0x22,0x34,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x05,0x12,0x85,0x10,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x85,0x14,0x85,0x13,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0x02,0x00,0xa0, 0x06,0x85,0x1a,0x85,0x19,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0xf8,0x02,0x00,0xa0, 0x0a,0x84,0x11,0x85,0x0f,0x02,0x0a,0x85,0x11,0x04,0x0f,0x5b,0x07,0x02,0x00,0xa0, 0x0a,0x04,0x14,0x05,0x13,0x02,0x0a,0x05,0x14,0x24,0x0f,0x5b,0x07,0x02,0x00,0xa0, 0x0a,0x04,0x17,0x05,0x16,0x02,0x0a,0x05,0x17,0x44,0x0f,0x5b,0x07,0x02,0x00,0xa0, 0x0a,0x04,0x1a,0x05,0x19,0x02,0x0a,0x05,0x1a,0x64,0x0f,0x61,0x07,0x02,0x00,0xa0, 0x06,0x85,0x17,0x85,0x16,0x34,0x00,0x00,0x00,0x00,0x00,0x5b,0x05,0x02,0x00,0xa0, 0x0a,0x04,0x12,0x85,0x11,0x02,0x0a,0x05,0x12,0x04,0x11,0x5b,0x05,0x02,0x00,0xa0, 0x0a,0x84,0x14,0x05,0x14,0x02,0x0a,0x85,0x14,0x24,0x11,0x5b,0x04,0x02,0x00,0xa0, 0x0a,0x84,0x1a,0x05,0x1a,0x02,0x0a,0x85,0x1a,0x64,0x11,0x5b,0x04,0x02,0x00,0xa0, 0x0a,0x84,0x17,0x05,0x17,0x02,0x0a,0x85,0x17,0x44,0x11,0x40,0x04,0x02,0x00,0xa0, 0x8a,0x05,0x12,0x05,0x12,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x04,0x02,0x00,0xa0, 0x8a,0x85,0x14,0x85,0x14,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x04,0x02,0x00,0xa0, 0x8a,0x85,0x1a,0x85,0x1a,0x34,0x0a,0x00,0x00,0x00,0x3f,0x40,0x04,0x02,0x00,0xa0, 0x8a,0x85,0x17,0x85,0x17,0x34,0x0a,0x00,0x00,0x00,0x3f,0x61,0x04,0x02,0x00,0x60, 0x0a,0x05,0x1c,0x05,0x12,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x02,0x00,0x60, 0x0a,0x05,0x15,0x85,0x14,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x02,0x00,0x60, 0x0a,0x05,0x1b,0x85,0x1a,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x02,0x00,0x60, 0x0a,0x05,0x18,0x85,0x17,0x34,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x01,0x00,0x40, 0x04,0x05,0x1c,0x04,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x01,0x00,0x40, 0x04,0x35,0x1c,0x44,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x04,0x01,0x00,0x40, 0x04,0x75,0x1c,0x44,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40, 0x04,0x25,0x1c,0x44,0x1c,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40, 0x04,0x15,0x1c,0x04,0x15,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x06,0x01,0x00,0x40, 0x04,0x45,0x1c,0x04,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40, 0x04,0x65,0x1c,0x44,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x40, 0x04,0x55,0x1c,0x04,0x1b,0x30,0x00,0x00,0x00,0x00,0x00,0x31,0x9a,0x03,0x80,0x00, 0x00,0x01,0x00,0x04,0x1e,0x00,0xc0,0x0c,0x1c,0x00,0x00,0x31,0x00,0x03,0x80,0x04, 0x00,0x00,0x00,0x0c,0x7f,0x20,0x70,0x00,0x00,0x00,0x00 }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/isa/genx_sd_gen12lp_isa.h000066400000000000000000000023321443134507600316070ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __GENX_SD_GEN12LP_ISA_H__ #define __GENX_SD_GEN12LP_ISA_H__ extern const unsigned char genx_sd_gen12lp[114171]; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/src/000077500000000000000000000000001443134507600256365ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/src/genx_mc.cpp000066400000000000000000000232221443134507600277630ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include "../include/genx_me_common.h" #include "../include/genx_blend_mc.h" #include "../include/genx_sd_common.h" extern "C" _GENX_MAIN_ void McP16_4MV_1SURF_WITH_CHR( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_REF1, SurfaceIndex SURF_MV16x16_1, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy, uint scene_nums ) { vector start_mbXY = start_xy; vector scene_numbers = scene_nums; uchar scnFref = scene_numbers.format()[0], scnSrc = scene_numbers.format()[1]; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX << 3, y = mbY << 3; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31], th = control.format()[32], sTh = control.format()[35]; matrix mv8_g4 = 0, mv = 0; matrix srcCh = 0, preFil = 0; matrix src = 0, out = 0, out2 = 0, fil = 0; matrix och = 0, scm = 0; vector RsCsT = 0.0f; short nsc = scnFref == scnSrc; read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 2, y - 2, srcCh); if (th > 0) { RsCsT = Genx_RsCs_aprox_8x8Block(srcCh.select<8, 1, 8, 1>(2, 2)); //Reference generation mv8_g4 = MV_Neighborhood_read(SURF_MV16x16_1, width, height, mbX, mbY); out = OMC_Ref_Generation(SURF_REF1, width, height, mbX, mbY, mv8_g4); mv = (mv8_g4 * mv8_g4) / 16 * nsc; int size = cm_sum(mv); int simFactor1 = 0; if (nsc) { simFactor1 = mergeStrengthCalculator(out, srcCh, RsCsT, nsc, th, size); srcCh.select<8, 1, 8, 1>(2, 2) = mergeBlocksRef(srcCh, out, simFactor1); } fil = srcCh.select<8, 1, 8, 1>(2, 2); och = SpatialDenoiser_8x8_NV12_Chroma(SURF_SRC, srcCh, mbX, mbY, sTh); } else { read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x, y, fil); read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, x, y >> 1, och); } write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, fil); write_plane(SURF_OUT, GENX_SURFACE_UV_PLANE, x, y >> 1, och); } #define TEST 1 extern "C" _GENX_MAIN_ void McP16_4MV_2SURF_WITH_CHR( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_REF1, SurfaceIndex SURF_MV16x16_1, SurfaceIndex SURF_REF2, SurfaceIndex SURF_MV16x16_2, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy, uint scene_nums ) { vector start_mbXY = start_xy; vector scene_numbers = scene_nums; uchar scnFref = scene_numbers.format()[0], scnBref = scene_numbers.format()[2], scnSrc = scene_numbers.format()[1], run = 0; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX << 3, y = mbY << 3; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31], th = control.format()[32], sTh = control.format()[35]; matrix mv8_g4 = 0, mv = 0; #if TEST matrix srcCh = 0, preFil = 0; #else matrix srcCh = 0, preFil = 0; #endif matrix src = 0, out = 0, out2 = 0, out3 = 0, out4 = 0, fil = 0; matrix och = 0; matrix scm = 0; vector RsCsT = 0.0f, RsCsT1 = 0.0f, RsCsT2 = 0.0f; short dif1 = scnFref == scnSrc, dif2 = scnSrc == scnBref, dift = !dif1 + !dif2; read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, x, y >> 1, och); if (th > 0) { read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 2, y - 2, srcCh); RsCsT = Genx_RsCs_aprox_8x8Block(srcCh.select<8, 1, 8, 1>(2, 2)); //First reference mv8_g4 = MV_Neighborhood_read(SURF_MV16x16_1, width, height, mbX, mbY); out = OMC_Ref_Generation(SURF_REF1, width, height, mbX, mbY, mv8_g4); mv = (mv8_g4 * mv8_g4) / 16 * dif1; int size1 = cm_sum(mv); //Second reference mv8_g4 = MV_Neighborhood_read(SURF_MV16x16_2, width, height, mbX, mbY); out2 = OMC_Ref_Generation(SURF_REF2, width, height, mbX, mbY, mv8_g4); mv = (mv8_g4 * mv8_g4) / 16 * dif2; int size2 = cm_sum(mv); int size = ((size1 * dif1) + (size2 * dif2)); if (dif1 + dif2) size /= (dif1 + dif2); if (size >= DISTANCETH || dift) { int simFactor1 = mergeStrengthCalculator(out, srcCh, RsCsT, dif1, th, size1); int simFactor2 = mergeStrengthCalculator(out2, srcCh, RsCsT, dif2, th, size2); fil = mergeBlocks2Ref(srcCh, out, simFactor1, out2, simFactor2); } else { out = MedianIdx_8x8_3ref(out, srcCh.select<8, 1, 8, 1>(2, 2), out2); int simFactor1 = mergeStrengthCalculator(out, srcCh, RsCsT, true, th, size); fil = mergeBlocksRef(srcCh, out, simFactor1); } } else { read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x, y, fil); } write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, fil); write_plane(SURF_OUT, GENX_SURFACE_UV_PLANE, x, y >> 1, och); } extern "C" _GENX_MAIN_ void MC_MERGE4( SurfaceIndex SURF_REF1, SurfaceIndex SURF_REF2, uint start_xy ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX << 4, y = mbY << 4; matrix ref1 = 0, ref2 = 0; read_plane(SURF_REF1, GENX_SURFACE_Y_PLANE, x, y, ref1); read_plane(SURF_REF2, GENX_SURFACE_Y_PLANE, x, y, ref2); ref1 = (ref1 + ref2 + 1) >> 1; write_plane(SURF_REF1, GENX_SURFACE_Y_PLANE, x, y, ref1); } #define VAR_SC_DATA_SIZE 8 //2 * size of float in bytes extern "C" _GENX_MAIN_ void MC_VAR_SC_CALC( SurfaceIndex SURF_SRC, SurfaceIndex SURF_NOISE, uint start_xy ) { vector start_mbXY = start_xy; int mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * 16, y = mbY * 16; matrix src = 0; matrix tmp = 0; matrix var_sc = 0.0f; read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 1, y - 1, src.select<8, 1, 32, 1>(0, 0)); read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 1, y + 7, src.select<8, 1, 32, 1>(8, 0)); read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 1, y + 15, src.select<1, 1, 32, 1>(16, 0)); matrix rs4x4, cs4x4; matrix tmpRs = src.select<16, 1, 16, 1>(0, 1) - src.select<16, 1, 16, 1>(1, 1), tmpCs = src.select<16, 1, 16, 1>(1, 0) - src.select<16, 1, 16, 1>(1, 1); #pragma unroll for (uchar i = 0; i < 4; i++) { #pragma unroll for (uchar j = 0; j < 4; j++) { rs4x4[i][j] = cm_shr(cm_sum(cm_mul(tmpRs.select<4, 1, 4, 1>(i << 2, j << 2), tmpRs.select<4, 1, 4, 1>(i << 2, j << 2))), 4, SAT); cs4x4[i][j] = cm_shr(cm_sum(cm_mul(tmpCs.select<4, 1, 4, 1>(i << 2, j << 2), tmpCs.select<4, 1, 4, 1>(i << 2, j << 2))), 4, SAT); } } float average = cm_sum(src.select<16, 1, 16, 1>(1, 1)) / 256.0f, square = cm_sum(cm_mul(src.select<16, 1, 16, 1>(1, 1), src.select<16, 1, 16, 1>(1, 1))) / 256.0f; var_sc(0, 0) = (square - average * average);//Variance value float RsFull = cm_sum(rs4x4), CsFull = cm_sum(cs4x4); var_sc(0, 1) = (RsFull + CsFull) / 16.0f; //RsCs value write(SURF_NOISE, mbX * VAR_SC_DATA_SIZE, mbY, var_sc); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/src/genx_me.cpp000066400000000000000000001024511443134507600277670ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include "../include/genx_me_common.h" #define COMPLEX_BIDIR 1 #define INVERTMOTION 1 typedef matrix UniIn; _GENX_ inline void SetRef( vector_ref /*source*/, // IN: SourceX, SourceY vector mv_predictor, // IN: mv predictor vector_ref searchWindow, // IN: reference window w/h vector /*picSize*/, // IN: pic size w/h vector_ref reference ) // OUT: Ref0X, Ref0Y { vector Width = (searchWindow - 16) >> 1, MaxMvLen, mask, res, otherRes; // set up parameters MaxMvLen[0] = 0x7fff / 4; MaxMvLen[1] = 0x7fff / 4; // fields and MBAFF are not supported // remove quater pixel fraction mv_predictor = mv_predictor >> 2; // // set the reference position // reference = mv_predictor; reference[1] &= -2; reference -= Width; res = MaxMvLen - Width; mask = (mv_predictor > res); otherRes = MaxMvLen - (searchWindow - 16); reference.merge(otherRes, mask); res = -res; mask = (mv_predictor < res); otherRes = -MaxMvLen; reference.merge(otherRes, mask); } extern "C" _GENX_MAIN_ void MeP16_1MV_MRE( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC_AND_REF, SurfaceIndex SURF_DIST16x16, SurfaceIndex SURF_MV16x16, uint start_xy, uchar blSize ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * blSize, y = mbY * blSize; vector control; read(SURF_CONTROL, 0, control); uchar maxNumSu = control.format()[56], lenSp = control.format()[57]; ushort width = control.format()[30], height = control.format()[31], mre_width = control.format()[33], mre_height = control.format()[34], precision = control.format()[36]; cm_assert(x > width); // read MB record data UniIn uniIn = 0; matrix imeOut; matrix imeIn = 0; matrix fbrIn; // declare parameters for VME matrix costs = 0; vector mvPred = 0, mvPred2 = 0; uchar x_r = 64, y_r = 32; // load search path imeIn.select<2, 1, 32, 1>(0) = control.select<64, 1>(0); // M0.2 VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 various prediction parameters VME_SET_DWORD(uniIn, 0, 3, 0x76a40000); // BMEDisableFBR=1 InterSAD=2 8x8 16x16 //VME_SET_DWORD(uniIn, 0, 3, 0x76a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x76: 8x8 16x16 //VME_SET_UNIInput_BMEDisableFBR(uniIn); // M1.1 MaxNumMVs VME_SET_UNIInput_MaxNumMVs(uniIn, 32); // M0.5 Reference Window Width & Height VME_SET_UNIInput_RefW(uniIn, x_r);//48); VME_SET_UNIInput_RefH(uniIn, y_r);//40); VME_SET_UNIInput_EarlyImeSuccessEn(uniIn); // M0.0 Ref0X, Ref0Y vector_ref sourceXY = uniIn.row(0).format().select<2, 1>(4); vector widthHeight; widthHeight[0] = (height >> 4) - 1; widthHeight[1] = (width >> 4); vector_ref searchWindow = uniIn.row(0).format().select<2, 1>(22); vector_ref ref0XY = uniIn.row(0).format().select<2, 1>(0); SetRef(sourceXY, mvPred, searchWindow, widthHeight, ref0XY); vector_ref ref1XY = uniIn.row(0).format().select<2, 1>(2); SetRef(sourceXY, mvPred2, searchWindow, widthHeight, ref1XY); // M1.0-3 Search path parameters & start centers & MaxNumMVs again!!! VME_SET_UNIInput_AdaptiveEn(uniIn); VME_SET_UNIInput_T8x8FlagForInterEn(uniIn); VME_SET_UNIInput_MaxNumMVs(uniIn, 0x3f); VME_SET_UNIInput_MaxNumSU(uniIn, maxNumSu); VME_SET_UNIInput_LenSP(uniIn, lenSp); //VME_SET_UNIInput_BiWeight(uniIn, 32); // M1.2 Start0X, Start0Y vector start0 = searchWindow; start0 = ((start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = start0[0] | (start0[1] << 4); uniIn.row(1)[6] = 0x20; uniIn.row(1)[31] = 0x1; vector ref0 = uniIn.row(0).format().select<2, 1>(0); vector costCenter = uniIn.row(3).format().select<16, 1>(0); vector mv16; matrix dist16x16; run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF, ref0XY, NULL, costCenter, imeOut); VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); VME_GET_IMEOutput_Rec0_16x16_Distortion(imeOut, dist16x16); // distortions calculated before updates (subpel, bidir search) write(SURF_DIST16x16, mbX * DIST_SIZE, mbY, dist16x16); //16x16 Forward SAD if (precision) {//QPEL VME_SET_UNIInput_SubPelMode(uniIn, 3); VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); SLICE(fbrIn.format(), 1, 16, 2) = 0; // zero L1 motion vectors VME_SET_UNIInput_FBRMbModeInput(uniIn, 0); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, 0); VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 3); matrix fbrOut16x16; fbrIn.format().select<4, 1, 4, 2>(0, 0) = mv16.format()[0]; // motion vectors 16x16 run_vme_fbr(uniIn, fbrIn, SURF_SRC_AND_REF, 0, 0, 0, fbrOut16x16); VME_GET_FBROutput_Rec0_16x16_Mv(fbrOut16x16, mv16); VME_GET_FBROutput_Dist_16x16_Bi(fbrOut16x16, dist16x16); } // distortions Actual complete distortion //write(SURF_DIST16x16, mbX * DIST_SIZE, mbY, dist16x16); // motion vectors write(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mv16); //16x16mv Ref0 } extern "C" _GENX_MAIN_ void MeP16_1MV_MRE_8x8( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC_AND_REF, SurfaceIndex SURF_DIST8x8, SurfaceIndex SURF_MV8x8, uint start_xy, uchar blSize ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * blSize, y = mbY * blSize; vector control; read(SURF_CONTROL, 0, control); uchar maxNumSu = control.format()[56], lenSp = control.format()[57]; ushort width = control.format()[30], height = control.format()[31], mre_width = control.format()[33], mre_height = control.format()[34], precision = control.format()[36]; // read MB record data UniIn uniIn = 0; matrix imeOut; matrix imeIn = 0; matrix fbrIn; // declare parameters for VME matrix costs = 0; vector mvPred = 0, mvPred2 = 0; //read(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mvPred); // these pred MVs will be updated later here uchar x_r = 64, y_r = 32; // load search path imeIn.select<2, 1, 32, 1>(0) = control.select<64, 1>(0); // M0.2 VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 various prediction parameters //VME_SET_DWORD(uniIn, 0, 3, 0x76a40000); // BMEDisableFBR=1 InterSAD=2 8x8 16x16 //VME_SET_DWORD(uniIn, 0, 3, 0x76a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x76: 8x8 16x16 VME_SET_DWORD(uniIn, 0, 3, 0x77a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x77: 8x8 //VME_SET_UNIInput_BMEDisableFBR(uniIn); // M1.1 MaxNumMVs VME_SET_UNIInput_MaxNumMVs(uniIn, 32); // M0.5 Reference Window Width & Height VME_SET_UNIInput_RefW(uniIn, x_r);//48); VME_SET_UNIInput_RefH(uniIn, y_r);//40); // M0.0 Ref0X, Ref0Y vector_ref sourceXY = uniIn.row(0).format().select<2, 1>(4); vector widthHeight; widthHeight[0] = (height >> 4) - 1; widthHeight[1] = (width >> 4); vector_ref searchWindow = uniIn.row(0).format().select<2, 1>(22); vector_ref ref0XY = uniIn.row(0).format().select<2, 1>(0); SetRef(sourceXY, mvPred, searchWindow, widthHeight, ref0XY); // M1.0-3 Search path parameters & start centers & MaxNumMVs again!!! VME_SET_UNIInput_AdaptiveEn(uniIn); VME_SET_UNIInput_T8x8FlagForInterEn(uniIn); VME_SET_UNIInput_MaxNumMVs(uniIn, 0x3f); VME_SET_UNIInput_MaxNumSU(uniIn, maxNumSu); VME_SET_UNIInput_LenSP(uniIn, lenSp); //VME_SET_UNIInput_BiWeight(uniIn, 32); // M1.2 Start0X, Start0Y vector start0 = searchWindow; start0 = ((start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = start0[0] | (start0[1] << 4); uniIn.row(1)[6] = 0x20; uniIn.row(1)[31] = 0x1; vector ref0 = uniIn.row(0).format().select<2, 1>(0); vector costCenter = uniIn.row(3).format().select<16, 1>(0); VME_SET_UNIInput_EarlyImeSuccessEn(uniIn); matrix mv8; vector dist8; run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF, ref0XY, NULL, costCenter, imeOut); mv8 = imeOut.row(8).format().select<8, 1>(8); // 4 MVs dist8 = imeOut.row(7).format().select<4, 1>(4); // distortions Integer search results // 8x8 write(SURF_DIST8x8, mbX * DIST_SIZE * 2, mbY * 2, dist8.format()); //8x8 Forward SAD if (precision) {//QPEL VME_SET_UNIInput_SubPelMode(uniIn, 3); VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); SLICE(fbrIn.format(), 1, 16, 2) = 0; // zero L1 motion vectors matrix fbrOut8x8; VME_SET_UNIInput_FBRMbModeInput(uniIn, 3); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, 0); VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 3); fbrIn.format().select<1, 1, 4, 2>(0, 0) = mv8.format()[0]; // motion vectors 8x8_0 fbrIn.format().select<1, 1, 4, 2>(1, 0) = mv8.format()[1]; // motion vectors 8x8_1 fbrIn.format().select<1, 1, 4, 2>(2, 0) = mv8.format()[2]; // motion vectors 8x8_2 fbrIn.format().select<1, 1, 4, 2>(3, 0) = mv8.format()[3]; // motion vectors 8x8_3 run_vme_fbr(uniIn, fbrIn, SURF_SRC_AND_REF, 3, 0, 0, fbrOut8x8); VME_GET_FBROutput_Rec0_8x8_4Mv(fbrOut8x8, mv8.format()); VME_GET_FBROutput_Dist_8x8_Bi(fbrOut8x8, dist8); } // distortions actual complete distortion calculation // 8x8 //write(SURF_DIST8x8 , mbX * DIST_SIZE * 2 , mbY * 2, dist8.format()); //8x8 Bidir distortions // motion vectors // 8x8 write(SURF_MV8x8, mbX * MVDATA_SIZE * 2, mbY * 2, mv8); //8x8mvs Ref0 } extern "C" _GENX_MAIN_ void MeP16bi_1MV2_MRE( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC_AND_REF, SurfaceIndex SURF_SRC_AND_REF2, SurfaceIndex SURF_DIST16x16, SurfaceIndex SURF_MV16x16, SurfaceIndex SURF_MV16x16_2, uint start_xy, uchar blSize, char forwardRefDist, char backwardRefDist ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * blSize, y = mbY * blSize; vector control; read(SURF_CONTROL, 0, control); uchar maxNumSu = control.format()[56], lenSp = control.format()[57]; ushort width = control.format()[30], height = control.format()[31], mre_width = control.format()[33], mre_height = control.format()[34], precision = control.format()[36]; // read MB record data UniIn uniIn = 0; #if COMPLEX_BIDIR matrix imeOut; #else matrix imeOut; #endif matrix imeIn = 0; matrix fbrIn; // declare parameters for VME matrix costs = 0; vector mvPred = 0, mvPred2 = 0; //read(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mvPred); // these pred MVs will be updated later here #if COMPLEX_BIDIR uchar x_r = 64, y_r = 32; #else uchar x_r = 32, y_r = 32; #endif // load search path imeIn.select<2, 1, 32, 1>(0) = control.select<64, 1>(0); // M0.2 VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 various prediction parameters #if COMPLEX_BIDIR VME_SET_DWORD(uniIn, 0, 3, 0x76a40000); // BMEDisableFBR=1 InterSAD=2 8x8 16x16 #else VME_SET_DWORD(uniIn, 0, 3, 0x76a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x76: 8x8 16x16 #endif //VME_SET_UNIInput_BMEDisableFBR(uniIn); // M1.1 MaxNumMVs VME_SET_UNIInput_MaxNumMVs(uniIn, 32); // M0.5 Reference Window Width & Height VME_SET_UNIInput_RefW(uniIn, x_r);//48); VME_SET_UNIInput_RefH(uniIn, y_r);//40); // M0.0 Ref0X, Ref0Y vector_ref sourceXY = uniIn.row(0).format().select<2, 1>(4); vector widthHeight; widthHeight[0] = (height >> 4) - 1; widthHeight[1] = (width >> 4); vector_ref searchWindow = uniIn.row(0).format().select<2, 1>(22); vector_ref ref0XY = uniIn.row(0).format().select<2, 1>(0); SetRef(sourceXY, mvPred, searchWindow, widthHeight, ref0XY); vector_ref ref1XY = uniIn.row(0).format().select<2, 1>(2); // M1.0-3 Search path parameters & start centers & MaxNumMVs again!!! VME_SET_UNIInput_AdaptiveEn(uniIn); VME_SET_UNIInput_T8x8FlagForInterEn(uniIn); VME_SET_UNIInput_MaxNumMVs(uniIn, 0x3f); VME_SET_UNIInput_MaxNumSU(uniIn, maxNumSu); VME_SET_UNIInput_LenSP(uniIn, lenSp); //VME_SET_UNIInput_BiWeight(uniIn, 32); // M1.2 Start0X, Start0Y vector start0 = searchWindow; start0 = ((start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = start0[0] | (start0[1] << 4); uniIn.row(1)[6] = 0x20; uniIn.row(1)[31] = 0x1; vector ref0 = uniIn.row(0).format().select<2, 1>(0); vector costCenter = uniIn.row(3).format().select<16, 1>(0); VME_SET_UNIInput_EarlyImeSuccessEn(uniIn); vector mv16, mv16_2; matrix dist16x16, dist16x16_2; #if COMPLEX_BIDIR run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF, ref0XY, NULL, costCenter, imeOut); VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); VME_GET_IMEOutput_Rec0_16x16_Distortion(imeOut, dist16x16); mvPred2 = mv16 * backwardRefDist / forwardRefDist; SetRef(sourceXY, mvPred2, searchWindow, widthHeight, ref1XY); run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF2, ref1XY, NULL, costCenter, imeOut); VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16_2); VME_GET_IMEOutput_Rec0_16x16_Distortion(imeOut, dist16x16_2); #else run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_DUAL_REF_DUAL_REC, SURF_SRC_AND_REF, ref0XY, ref1XY, costCenter, imeOut); VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); VME_GET_IMEOutput_Rec0_16x16_Distortion(imeOut, dist16x16); VME_GET_IMEOutput_Rec1_16x16_Mv(imeOut, mv16_2); VME_GET_IMEOutput_Rec1_16x16_Distortion(imeOut, dist16x16_2); #endif // distortions calculated before updates (subpel, bidir search) write(SURF_DIST16x16, mbX * DIST_SIZE, mbY, dist16x16); //16x16 Forward SAD if (precision)//QPEL VME_SET_UNIInput_SubPelMode(uniIn, 3); else VME_SET_UNIInput_SubPelMode(uniIn, 0); VME_SET_UNIInput_BiWeight(uniIn, 32); VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); SLICE(fbrIn.format(), 1, 16, 2) = 0; // zero L1 motion vectors VME_SET_UNIInput_FBRMbModeInput(uniIn, 0); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, 0); if (precision)//QPEL VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 3); else VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 0); matrix fbrOut16x16; fbrIn.format().select<4, 1, 4, 2>(0, 0) = mv16.format()[0]; // motion vectors 16x16 fbrIn.format().select<4, 1, 4, 2>(0, 1) = mv16_2.format()[0]; run_vme_fbr(uniIn, fbrIn, SURF_SRC_AND_REF, 0, 0, 170, fbrOut16x16); VME_GET_FBROutput_Rec0_16x16_Mv(fbrOut16x16, mv16); VME_GET_FBROutput_Rec1_16x16_Mv(fbrOut16x16, mv16_2); VME_GET_FBROutput_Dist_16x16_Bi(fbrOut16x16, dist16x16); // distortions Actual complete distortion //write(SURF_DIST16x16, mbX * DIST_SIZE, mbY, dist16x16); // motion vectors write(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mv16); //16x16mv Ref0 write(SURF_MV16x16_2, mbX * MVDATA_SIZE, mbY, mv16_2); //16x16mv Ref1 } extern "C" _GENX_MAIN_ void MeP16bi_1MV2_MRE_8x8( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC_AND_REF, SurfaceIndex SURF_SRC_AND_REF2, SurfaceIndex SURF_DIST8x8, SurfaceIndex SURF_MV8x8, SurfaceIndex SURF_MV8x8_2, uint start_xy, uchar blSize, char forwardRefDist, char backwardRefDist ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * blSize, y = mbY * blSize; vector control; read(SURF_CONTROL, 0, control); uchar maxNumSu = control.format()[56], lenSp = control.format()[57]; ushort width = control.format()[30], height = control.format()[31], mre_width = control.format()[33], mre_height = control.format()[34], precision = control.format()[36]; // read MB record data #if CMRT_EMU if (x >= width) return; cm_assert(x < width); #endif UniIn uniIn = 0; #if COMPLEX_BIDIR matrix imeOut; #else matrix imeOut; #endif matrix imeIn = 0; matrix fbrIn; // declare parameters for VME matrix costs = 0; vector mvPred = 0, mvPred2 = 0; //read(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mvPred); // these pred MVs will be updated later here #if COMPLEX_BIDIR uchar x_r = 48; uchar y_r = 40; #else uchar x_r = 32, y_r = 32; #endif // load search path imeIn.select<2, 1, 32, 1>(0) = control.select<64, 1>(0); // M0.2 VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 various prediction parameters //VME_SET_DWORD(uniIn, 0, 3, 0x76a40000); // BMEDisableFBR=1 InterSAD=2 8x8 16x16 VME_SET_DWORD(uniIn, 0, 3, 0x76a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x76: 8x8 16x16 //VME_SET_DWORD(uniIn, 0, 3, 0x77a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x77: 8x8 //VME_SET_UNIInput_BMEDisableFBR(uniIn); // M1.1 MaxNumMVs VME_SET_UNIInput_MaxNumMVs(uniIn, 32); // M0.5 Reference Window Width & Height VME_SET_UNIInput_RefW(uniIn, x_r);//48); VME_SET_UNIInput_RefH(uniIn, y_r);//40); // M0.0 Ref0X, Ref0Y vector_ref sourceXY = uniIn.row(0).format().select<2, 1>(4); vector widthHeight; widthHeight[0] = (height >> 4) - 1; widthHeight[1] = (width >> 4); vector_ref searchWindow = uniIn.row(0).format().select<2, 1>(22); vector_ref ref0XY = uniIn.row(0).format().select<2, 1>(0); SetRef(sourceXY, mvPred, searchWindow, widthHeight, ref0XY); vector_ref ref1XY = uniIn.row(0).format().select<2, 1>(2); SetRef(sourceXY, mvPred2, searchWindow, widthHeight, ref1XY); // M1.0-3 Search path parameters & start centers & MaxNumMVs again!!! VME_SET_UNIInput_AdaptiveEn(uniIn); VME_SET_UNIInput_T8x8FlagForInterEn(uniIn); VME_SET_UNIInput_MaxNumMVs(uniIn, 0x3f); VME_SET_UNIInput_MaxNumSU(uniIn, maxNumSu); VME_SET_UNIInput_LenSP(uniIn, lenSp); //VME_SET_UNIInput_BiWeight(uniIn, 32); // M1.2 Start0X, Start0Y vector start0 = searchWindow; start0 = ((start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = start0[0] | (start0[1] << 4); uniIn.row(1)[6] = 0x20; uniIn.row(1)[31] = 0x1; vector ref0 = uniIn.row(0).format().select<2, 1>(0); vector costCenter = uniIn.row(3).format().select<16, 1>(0); VME_SET_UNIInput_EarlyImeSuccessEn(uniIn); #if COMPLEX_BIDIR matrix mv8, mv8_2; #else matrix mv8, mv8_2; #endif vector dist8, dist8_2; #if COMPLEX_BIDIR run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF, ref0XY, NULL, costCenter, imeOut); mv8 = imeOut.row(8).format().select<8, 1>(8); // 4 MVs dist8 = imeOut.row(7).format().select<4, 1>(4); vector mv16; VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); #if !INVERTMOTION run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF2, ref1XY, NULL, costCenter, imeOut); mv8_2 = imeOut.row(8).format().select<8, 1>(8); // 4 MVs dist8_2 = imeOut.row(7).format().select<4, 1>(4); #else mvPred2 = mv16 * backwardRefDist / forwardRefDist; SetRef(sourceXY, mvPred2, searchWindow, widthHeight, ref1XY); run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF2, ref1XY, NULL, costCenter, imeOut); mv8_2 = imeOut.row(8).format().select<8, 1>(8); // 4 MVs dist8_2 = imeOut.row(7).format().select<4, 1>(4); //mv8_2 = mv8 * -1; #endif #else run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_DUAL_REF_DUAL_REC, SURF_SRC_AND_REF, ref0XY, ref1XY, costCenter, imeOut); //VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); VME_GET_IMEOutput_Rec0_8x8_4Mv(imeOut, mv8); //VME_GET_IMEOutput_Rec0_16x16_Distortion(imeOut, dist16x16); VME_GET_IMEOutput_Rec0_8x8_4Distortion(imeOut, dist8); //VME_GET_IMEOutput_Rec1_16x16_Mv(imeOut, mv16_2); VME_GET_IMEOutput_Rec1_8x8_4Mv(imeOut, mv8_2); //VME_GET_IMEOutput_Rec1_16x16_Distortion(imeOut, dist16x16_2); VME_GET_IMEOutput_Rec1_8x8_4Distortion(imeOut, dist8_2); #endif // distortions Integer search results // 8x8 write(SURF_DIST8x8, mbX * DIST_SIZE * 2, mbY * 2, dist8.format()); //8x8 Forward SAD if (precision)//QPEL VME_SET_UNIInput_SubPelMode(uniIn, 3); else VME_SET_UNIInput_SubPelMode(uniIn, 0); VME_SET_UNIInput_BiWeight(uniIn, 32); VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); SLICE(fbrIn.format(), 1, 16, 2) = 0; // zero L1 motion vectors matrix fbrOut8x8; VME_SET_UNIInput_FBRMbModeInput(uniIn, 3); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, 0); if (precision)//QPEL VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 3); else VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 0); fbrIn.format().select<1, 1, 4, 2>(0, 0) = mv8.format()[0]; // motion vectors 8x8_0 fbrIn.format().select<1, 1, 4, 2>(1, 0) = mv8.format()[1]; // motion vectors 8x8_1 fbrIn.format().select<1, 1, 4, 2>(2, 0) = mv8.format()[2]; // motion vectors 8x8_2 fbrIn.format().select<1, 1, 4, 2>(3, 0) = mv8.format()[3]; // motion vectors 8x8_3 fbrIn.format().select<1, 1, 4, 2>(0, 1) = mv8_2.format()[0]; // motion vectors 8x8_2_0 fbrIn.format().select<1, 1, 4, 2>(1, 1) = mv8_2.format()[1]; // motion vectors 8x8_2_1 fbrIn.format().select<1, 1, 4, 2>(2, 1) = mv8_2.format()[2]; // motion vectors 8x8_2_2 fbrIn.format().select<1, 1, 4, 2>(3, 1) = mv8_2.format()[3]; // motion vectors 8x8_2_3 run_vme_fbr(uniIn, fbrIn, SURF_SRC_AND_REF, 3, 0, 170, fbrOut8x8); VME_GET_FBROutput_Rec0_8x8_4Mv(fbrOut8x8, mv8.format()); VME_GET_FBROutput_Rec1_8x8_4Mv(fbrOut8x8, mv8_2.format()); VME_GET_FBROutput_Dist_8x8_Bi(fbrOut8x8, dist8); // distortions actual complete distortion calculation // 8x8 //write(SURF_DIST8x8 , mbX * DIST_SIZE * 2 , mbY * 2, dist8.format()); //8x8 Bidir distortions // motion vectors // 8x8 write(SURF_MV8x8, mbX * MVDATA_SIZE * 2, mbY * 2, mv8); //8x8mvs Ref0 write(SURF_MV8x8_2, mbX * MVDATA_SIZE * 2, mbY * 2, mv8_2); //8x8mvs Ref1 } extern "C" _GENX_MAIN_ void MeP16_1ME_2BiRef_MRE_8x8( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC_AND_REF, SurfaceIndex SURF_SRC_AND_REF2, SurfaceIndex SURF_DIST8x8, SurfaceIndex SURF_MV8x8, SurfaceIndex SURF_MV8x8_2, uint start_xy, uchar blSize, char forwardRefDist, char backwardRefDist ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * blSize, y = mbY * blSize; vector control; read(SURF_CONTROL, 0, control); uchar maxNumSu = control.format()[56], lenSp = control.format()[57]; ushort width = control.format()[30], height = control.format()[31], mre_width = control.format()[33], mre_height = control.format()[34], precision = control.format()[36]; // read MB record data #if CMRT_EMU if (x >= width) return; cm_assert(x < width); #endif UniIn uniIn = 0; #if COMPLEX_BIDIR matrix imeOut; #else matrix imeOut; #endif matrix imeIn = 0; matrix fbrIn; // declare parameters for VME matrix costs = 0; vector mvPred = 0, mvPred2 = 0; //read(SURF_MV16x16, mbX * MVDATA_SIZE, mbY, mvPred); // these pred MVs will be updated later here #if COMPLEX_BIDIR uchar x_r = 48; uchar y_r = 40; #else uchar x_r = 32, y_r = 32; #endif // load search path imeIn.select<2, 1, 32, 1>(0) = control.select<64, 1>(0); // M0.2 VME_SET_UNIInput_SrcX(uniIn, x); VME_SET_UNIInput_SrcY(uniIn, y); // M0.3 various prediction parameters //VME_SET_DWORD(uniIn, 0, 3, 0x76a40000); // BMEDisableFBR=1 InterSAD=2 8x8 16x16 VME_SET_DWORD(uniIn, 0, 3, 0x76a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x76: 8x8 16x16 //VME_SET_DWORD(uniIn, 0, 3, 0x77a00000); // BMEDisableFBR=0 InterSAD=2 SubMbPartMask=0x77: 8x8 //VME_SET_UNIInput_BMEDisableFBR(uniIn); // M1.1 MaxNumMVs VME_SET_UNIInput_MaxNumMVs(uniIn, 32); // M0.5 Reference Window Width & Height VME_SET_UNIInput_RefW(uniIn, x_r);//48); VME_SET_UNIInput_RefH(uniIn, y_r);//40); // M0.0 Ref0X, Ref0Y vector_ref sourceXY = uniIn.row(0).format().select<2, 1>(4); vector widthHeight; widthHeight[0] = (height >> 4) - 1; widthHeight[1] = (width >> 4); vector_ref searchWindow = uniIn.row(0).format().select<2, 1>(22); vector_ref ref0XY = uniIn.row(0).format().select<2, 1>(0); SetRef(sourceXY, mvPred, searchWindow, widthHeight, ref0XY); vector_ref ref1XY = uniIn.row(0).format().select<2, 1>(2); SetRef(sourceXY, mvPred2, searchWindow, widthHeight, ref1XY); // M1.0-3 Search path parameters & start centers & MaxNumMVs again!!! VME_SET_UNIInput_AdaptiveEn(uniIn); VME_SET_UNIInput_T8x8FlagForInterEn(uniIn); VME_SET_UNIInput_MaxNumMVs(uniIn, 0x3f); VME_SET_UNIInput_MaxNumSU(uniIn, maxNumSu); VME_SET_UNIInput_LenSP(uniIn, lenSp); //VME_SET_UNIInput_BiWeight(uniIn, 32); // M1.2 Start0X, Start0Y vector start0 = searchWindow; start0 = ((start0 - 16) >> 3) & 0x0f; uniIn.row(1)[10] = start0[0] | (start0[1] << 4); uniIn.row(1)[6] = 0x20; uniIn.row(1)[31] = 0x1; vector ref0 = uniIn.row(0).format().select<2, 1>(0); vector costCenter = uniIn.row(3).format().select<16, 1>(0); VME_SET_UNIInput_EarlyImeSuccessEn(uniIn); matrix mv8, mv8_2; vector dist8, dist8_2; run_vme_ime(uniIn, imeIn, VME_STREAM_OUT, VME_SEARCH_SINGLE_REF_SINGLE_REC_SINGLE_START, SURF_SRC_AND_REF, ref0XY, NULL, costCenter, imeOut); mv8 = imeOut.row(8).format().select<8, 1>(8); // 4 MVs dist8 = imeOut.row(7).format().select<4, 1>(4); vector mv16; VME_GET_IMEOutput_Rec0_16x16_Mv(imeOut, mv16); mv8_2 = -mv8; // 4 MVs // distortions Integer search results // 8x8 write(SURF_DIST8x8, mbX * DIST_SIZE * 2, mbY * 2, dist8.format()); //8x8 Forward SAD if (precision)//QPEL VME_SET_UNIInput_SubPelMode(uniIn, 3); else VME_SET_UNIInput_SubPelMode(uniIn, 0); VME_SET_UNIInput_BiWeight(uniIn, 32); VME_CLEAR_UNIInput_BMEDisableFBR(uniIn); SLICE(fbrIn.format(), 1, 16, 2) = 0; // zero L1 motion vectors matrix fbrOut8x8; VME_SET_UNIInput_FBRMbModeInput(uniIn, 3); VME_SET_UNIInput_FBRSubMBShapeInput(uniIn, 0); if (precision)//QPEL VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 3); else VME_SET_UNIInput_FBRSubPredModeInput(uniIn, 0); fbrIn.format().select<1, 1, 4, 2>(0, 0) = mv8.format()[0]; // motion vectors 8x8_0 fbrIn.format().select<1, 1, 4, 2>(1, 0) = mv8.format()[1]; // motion vectors 8x8_1 fbrIn.format().select<1, 1, 4, 2>(2, 0) = mv8.format()[2]; // motion vectors 8x8_2 fbrIn.format().select<1, 1, 4, 2>(3, 0) = mv8.format()[3]; // motion vectors 8x8_3 fbrIn.format().select<1, 1, 4, 2>(0, 1) = mv8_2.format()[0]; // motion vectors 8x8_2_0 fbrIn.format().select<1, 1, 4, 2>(1, 1) = mv8_2.format()[1]; // motion vectors 8x8_2_1 fbrIn.format().select<1, 1, 4, 2>(2, 1) = mv8_2.format()[2]; // motion vectors 8x8_2_2 fbrIn.format().select<1, 1, 4, 2>(3, 1) = mv8_2.format()[3]; // motion vectors 8x8_2_3 run_vme_fbr(uniIn, fbrIn, SURF_SRC_AND_REF, 3, 0, 170, fbrOut8x8); VME_GET_FBROutput_Rec0_8x8_4Mv(fbrOut8x8, mv8.format()); VME_GET_FBROutput_Rec1_8x8_4Mv(fbrOut8x8, mv8_2.format()); VME_GET_FBROutput_Dist_8x8_Bi(fbrOut8x8, dist8); // distortions actual complete distortion calculation // 8x8 //write(SURF_DIST8x8 , mbX * DIST_SIZE * 2 , mbY * 2, dist8.format()); //8x8 Bidir distortions // motion vectors // 8x8 write(SURF_MV8x8, mbX * MVDATA_SIZE * 2, mbY * 2, mv8); //8x8mvs Ref0 write(SURF_MV8x8_2, mbX * MVDATA_SIZE * 2, mbY * 2, mv8_2); //8x8mvs Ref1 }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/mctf/src/genx_sd.cpp000066400000000000000000000303361443134507600277760ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma warning(disable: 4127) #pragma warning(disable: 4244) #pragma warning(disable: 4018) #pragma warning(disable: 4189) #pragma warning(disable: 4505) #include "../include/genx_blend_mc.h" #include "../include/genx_sd_common.h" typedef matrix UniIn; extern "C" _GENX_MAIN_ void SpatialDenoiser_8x8( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX * 8, y = mbY * 8; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31]; float th = control.format()[32]; ushort picWidthInMB = width >> 4, picHeightInMB = height >> 4; uint mbIndex = picWidthInMB * mbY + mbX; matrix src = 0; matrix out = 0; read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 2, y - 2, src); matrix Disp = DispersionCalculator(src); matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / (th / 10.0f))); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / (th / 10.0f))); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; #pragma unroll for (uint i = 0; i < 4; i++) #pragma unroll for (uint j = 0; j < 4; j++) out.select<2, 1, 2, 1>(i * 2, j * 2) = (src.select<2, 1, 2, 1>(2 + 2 * i, 2 + 2 * j) * k0(i, j)) + ( (src.select<2, 1, 2, 1>(2 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 2 + 2 * j))*k1(i, j)) + ( (src.select<2, 1, 2, 1>(1 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 3 + 2 * j))*k2(i, j)) + 0.5f; write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, out); } extern "C" _GENX_MAIN_ void SpatialDenoiser_8x8_NV12( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX << 3, y = mbY << 3, xch = mbX << 3, ych = mbY << 2; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31]; float sTh = control.format()[35]; ushort picWidthInMB = width >> 4, picHeightInMB = height >> 4; uint mbIndex = picWidthInMB * mbY + mbX; matrix src = 0; matrix scm = 0; matrix out = 0; matrix och = 0; if (sTh > 0) { read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 2, y - 2, src); read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xch - 2, ych - 1, scm); matrix Disp = DispersionCalculator(src); matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / sTh)); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / sTh)); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; #pragma unroll for (uint i = 0; i < 4; i++) #pragma unroll for (uint j = 0; j < 4; j++) out.select<2, 1, 2, 1>(i * 2, j * 2) = (src.select<2, 1, 2, 1>(2 + 2 * i, 2 + 2 * j) * k0(i, j)) + ( (src.select<2, 1, 2, 1>(2 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 2 + 2 * j))*k1(i, j)) + ( (src.select<2, 1, 2, 1>(1 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 3 + 2 * j))*k2(i, j)) + 0.5f; matrix k0c = 0.0f, k1c = 0.0f, k2c = 0.0f; k0c.select<4, 1, 4, 2>(0, 0) = k0c.select<4, 1, 4, 2>(0, 1) = k0; k1c.select<4, 1, 4, 2>(0, 0) = k1c.select<4, 1, 4, 2>(0, 1) = k1; k2c.select<4, 1, 4, 2>(0, 0) = k2c.select<4, 1, 4, 2>(0, 1) = k2; och = (scm.select<4, 1, 8, 1>(1, 2) * k0c) + ( (scm.select<4, 1, 8, 1>(1, 0) + scm.select<4, 1, 8, 1>(1, 4) + scm.select<4, 1, 8, 1>(0, 2) + scm.select<4, 1, 8, 1>(2, 2)) * k1c) + ( (scm.select<4, 1, 8, 1>(0, 0) + scm.select<4, 1, 8, 1>(0, 4) + scm.select<4, 1, 8, 1>(2, 0) + scm.select<4, 1, 8, 1>(2, 4)) * k2c) + 0.5f; } else { read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x, y, out); read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xch, ych, och); } write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, out); write_plane(SURF_OUT, GENX_SURFACE_UV_PLANE, xch, ych, och); } extern "C" _GENX_MAIN_ void SpatialDenoiser_8x8_YV12( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1]; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31]; float th = control.format()[32]; ushort picWidthInMB = width >> 4, picHeightInMB = height >> 4; uint mbIndex = picWidthInMB * mbY + mbX; uint offsetY = height >> 4; uint x = mbX << 3, y = mbY << 3, xcu = mbX << 2, ycu = mbY << 2, xcv = mbX << 2, ycv = offsetY + (mbY << 2); matrix src = 0; matrix scu = 0, scv = 0; matrix out = 0; matrix ocu = 0, ocv = 0; read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 2, y - 2, src); read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xcu - 1, ycu - 1, scu); read_plane(SURF_SRC, GENX_SURFACE_UV_PLANE, xcv - 1, ycv - 1, scv); matrix Disp = DispersionCalculator(src); matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / (th / 10.0f))); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / (th / 10.0f))); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; #pragma unroll for (uint i = 0; i < 4; i++) #pragma unroll for (uint j = 0; j < 4; j++) out.select<2, 1, 2, 1>(i * 2, j * 2) = (src.select<2, 1, 2, 1>(2 + 2 * i, 2 + 2 * j) * k0(i, j)) + ( (src.select<2, 1, 2, 1>(2 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 2 + 2 * j))*k1(i, j)) + ( (src.select<2, 1, 2, 1>(1 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 3 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(3 + 2 * i, 3 + 2 * j))*k2(i, j)) + 0.5f; ocu = (scu.select<4, 1, 4, 1>(1, 1) * k0) + ( (scu.select<4, 1, 4, 1>(1, 0) + scu.select<4, 1, 4, 1>(1, 2) + scu.select<4, 1, 4, 1>(0, 1) + scu.select<4, 1, 4, 1>(2, 1)) * k1) + ( (scu.select<4, 1, 4, 1>(0, 0) + scu.select<4, 1, 4, 1>(0, 2) + scu.select<4, 1, 4, 1>(2, 0) + scu.select<4, 1, 4, 1>(2, 2)) * k2) + 0.5f; ocv = (scv.select<4, 1, 4, 1>(1, 1) * k0) + ( (scv.select<4, 1, 4, 1>(1, 0) + scv.select<4, 1, 4, 1>(1, 2) + scv.select<4, 1, 4, 1>(0, 1) + scv.select<4, 1, 4, 1>(2, 1)) * k1) + ( (scv.select<4, 1, 4, 1>(0, 0) + scv.select<4, 1, 4, 1>(0, 2) + scv.select<4, 1, 4, 1>(2, 0) + scv.select<4, 1, 4, 1>(2, 2)) * k2) + 0.5f; write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, out); write_plane(SURF_OUT, GENX_SURFACE_UV_PLANE, xcu, ycu, ocu); write_plane(SURF_OUT, GENX_SURFACE_UV_PLANE, xcv, ycv, ocv); } extern "C" _GENX_MAIN_ void SpatialDenoiser_4x4( SurfaceIndex SURF_CONTROL, SurfaceIndex SURF_SRC, SurfaceIndex SURF_OUT, uint start_xy ) { vector start_mbXY = start_xy; uint mbX = get_thread_origin_x() + start_mbXY.format()[0], mbY = get_thread_origin_y() + start_mbXY.format()[1], x = mbX << 2, y = mbY << 2; vector control; read(SURF_CONTROL, 0, control); ushort width = control.format()[30], height = control.format()[31]; float th = control.format()[32] / 10.0f; ushort picWidthInMB = width >> 4, picHeightInMB = height >> 4; uint mbIndex = picWidthInMB * mbY + mbX; matrix src = 0; matrix out = 0; read_plane(SURF_SRC, GENX_SURFACE_Y_PLANE, x - 1, y - 1, src); ushort mean4x4 = cm_sum(src.select<4, 1, 4, 1>(1, 1)); mean4x4 >>= 4; matrix Disp = 0; matrix test2 = 0; int data = 0; test2 = cm_abs(src.select<4, 1, 4, 1>(0, 0) - mean4x4); test2 *= test2; #pragma unroll for (int i = 0; i < 2; i++) #pragma unroll for (int j = 0; j < 2; j++) Disp(i, j) = cm_sum(test2.select<2, 1, 2, 1>(i * 2, j * 2)); Disp = Disp >> 4; matrix f_disp = Disp, h1 = 0.0f, h2 = 0.0f, hh = 0.0f, k0 = 0.0f, k1 = 0.0f, k2 = 0.0f; h1 = cm_exp(-(f_disp / th)); f_disp = Disp * 2.0f; h2 = cm_exp(-(f_disp / th)); hh = 1.0f + 4.0f * (h1 + h2); k0 = 1.0f / hh; k1 = h1 / hh; k2 = h2 / hh; #pragma unroll for (uint i = 0; i < 2; i++) #pragma unroll for (uint j = 0; j < 2; j++) out.select<2, 1, 2, 1>(i * 2, j * 2) = (src.select<2, 1, 2, 1>(1 + 2 * i, 1 + 2 * j) * k0(i, j)) + ( (src.select<2, 1, 2, 1>(1 + 2 * i, 2 * j) + src.select<2, 1, 2, 1>(1 + 2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(2 * i, 1 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 1 + 2 * j))*k1(i, j)) + ( (src.select<2, 1, 2, 1>(2 * i, 2 * j) + src.select<2, 1, 2, 1>(2 * i, 2 + 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 2 * j) + src.select<2, 1, 2, 1>(2 + 2 * i, 2 + 2 * j))*k2(i, j)) + 0.5f; write_plane(SURF_OUT, GENX_SURFACE_Y_PLANE, x, y, out); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/tools/000077500000000000000000000000001443134507600252565ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/tools/README.md000066400000000000000000000011131443134507600265310ustar00rootroot00000000000000# embed_isa helper tool embed_isa is a simple application which generates c-array from the binary kernel ISA file. Usage: ```sh embed_isa .isa ``` On the output you will get 2 files: 1. _isa.h header file of the format similar to: ```sh #ifndef ____ #define ____ extern const unsigned char []; #endif ``` 2. _isa.cpp source file with the kernel c-style array in the format similar to: ```sh #include "_isa.h" const unsigned char [] = { ... // c-style array data }; ``` oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/genx/tools/embed_isa.c000066400000000000000000000117561443134507600273440ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #define WIDTH 16 void make_copyright(FILE* f) { fprintf(f, "// Copyright (c) 2020 Intel Corporation\n" "//\n" "// Permission is hereby granted, free of charge, to any person obtaining a copy\n" "// of this software and associated documentation files (the \"Software\"), to deal\n" "// in the Software without restriction, including without limitation the rights\n" "// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n" "// copies of the Software, and to permit persons to whom the Software is\n" "// furnished to do so, subject to the following conditions:\n" "//\n" "// The above copyright notice and this permission notice shall be included in all\n" "// copies or substantial portions of the Software.\n" "//\n" "// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" "// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" "// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n" "// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" "// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" "// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" "// SOFTWARE.\n" ); } /* first argument is file.isa to incorporate in C code */ int main(int argc, char** argv) { FILE* f; long int size; long int size_width; int width = WIDTH; unsigned char* buf = NULL; char* basename; char* fname, *sbase, *ebase, *bufname; int len,i; size_t result; if(argc != 2) { printf("Usage: %s somefile.isa", argv[0]); exit(-1); } if((f=fopen(argv[1],"rb")) != NULL) { fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); buf = (unsigned char*)malloc(size); result = fread(buf,1,size,f); fclose(f); } if( buf ) { //find basename fname = argv[1]; len = strlen(fname); ebase = fname+len-1; while(ebase >= fname && *ebase != '.') ebase--; sbase = ebase; while(sbase >= fname && *sbase != '/' && *sbase != '\\') sbase--; sbase++; len = (int)(ebase-sbase); if(len <= 0) { free(buf); exit(-1); } basename = (char*)malloc(len+9); bufname = (char*)malloc(len+1); strncpy(bufname, sbase, len); bufname[len] = 0; strncpy(basename, sbase, len); strncpy(basename+len, "_isa.cpp", 8); basename[len+8] = 0; //cpp file if((f=fopen(basename,"wt")) != NULL) { make_copyright(f); //fprintf(f,"#ifndef __%s__\n#define __%s__\n",bufname,bufname); fprintf(f,"#include \"%s_isa.h\"\n\n", bufname); fprintf(f,"const unsigned char %s[%lu] = {\n",bufname, size); for(i=0; i #include #include "cmrt_cross_platform.h" class CmDevice; class CmBuffer; class CmBufferUP; class CmSurface2D; class CmEvent; class CmQueue; class CmProgram; class CmKernel; class SurfaceIndex; class CmThreadSpace; class CmTask; namespace MfxHwH264Encode { class DdiTask; class MfxVideoParam; struct CURBEData; struct LAOutObject; struct mfxVMEUNIIn { mfxU16 FTXCoeffThresh_DC; mfxU8 FTXCoeffThresh[6]; mfxU8 MvCost[8]; mfxU8 ModeCost[12]; }; class CmRuntimeError : public std::exception { public: CmRuntimeError() : std::exception() { assert(!"CmRuntimeError"); } }; class CmDevicePtr { public: explicit CmDevicePtr(CmDevice * device = 0); ~CmDevicePtr(); void Reset(CmDevice * device); CmDevice * operator -> (); CmDevicePtr & operator = (CmDevice * device); operator CmDevice * (); private: CmDevicePtr(CmDevicePtr const &); void operator = (CmDevicePtr const &); CmDevice * m_device; }; class CmSurface { public: CmSurface(); CmSurface(CmDevice * device, IDirect3DSurface9 * d3dSurface); CmSurface(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc); ~CmSurface(); CmSurface2D * operator -> (); operator CmSurface2D * (); void Reset(CmDevice * device, IDirect3DSurface9 * d3dSurface); void Reset(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc); SurfaceIndex const & GetIndex(); void Read(void * buf, CmEvent * e = 0); void Write(void * buf, CmEvent * e = 0); private: CmDevice * m_device; CmSurface2D * m_surface; }; class CmSurfaceVme75 { public: CmSurfaceVme75(); CmSurfaceVme75(CmDevice * device, SurfaceIndex * index); ~CmSurfaceVme75(); void Reset(CmDevice * device, SurfaceIndex * index); SurfaceIndex const * operator & () const; operator SurfaceIndex (); private: CmDevice * m_device; SurfaceIndex * m_index; }; class CmBuf { public: CmBuf(); CmBuf(CmDevice * device, mfxU32 size); ~CmBuf(); CmBuffer * operator -> (); operator CmBuffer * (); void Reset(CmDevice * device, mfxU32 size); SurfaceIndex const & GetIndex() const; void Read(void * buf, CmEvent * e = 0) const; void Write(void * buf, CmEvent * e = 0) const; private: CmDevice * m_device; CmBuffer * m_buffer; }; CmDevice * TryCreateCmDevicePtr(VideoCORE * core, mfxU32 * version = 0); CmDevice * CreateCmDevicePtr(VideoCORE * core, mfxU32 * version = 0); void DestroyGlobalCmDevice(CmDevice * device); CmBuffer * CreateBuffer(CmDevice * device, mfxU32 size); CmBufferUP * CreateBuffer(CmDevice * device, mfxU32 size, void * mem); CmSurface2D * CreateSurface(CmDevice * device, IDirect3DSurface9 * d3dSurface); CmSurface2D * CreateSurface(CmDevice * device, ID3D11Texture2D * d3dSurface); CmSurface2D * CreateSurface2DSubresource(CmDevice * device, ID3D11Texture2D * d3dSurface); CmSurface2D * CreateSurface(CmDevice * device, mfxHDL nativeSurface, eMFXVAType vatype); CmSurface2D * CreateSurface(CmDevice * device, mfxHDLPair nativeSurfaceIndexPair, eMFXVAType vatype); CmSurface2D * CreateSurface(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc); CmSurface2DUP * CreateSurface(CmDevice * device, void *mem, mfxU32 width, mfxU32 height, mfxU32 fourcc); SurfaceIndex * CreateVmeSurfaceG75( CmDevice * device, CmSurface2D * source, CmSurface2D ** fwdRefs, CmSurface2D ** bwdRefs, mfxU32 numFwdRefs, mfxU32 numBwdRefs); template void SetKernelArg(CmKernel * kernel, T0 const & arg) { kernel->SetKernelArg(0, sizeof(T0), &arg); } template void SetKernelArgLast(CmKernel * kernel, T0 const & arg, unsigned int index) { kernel->SetKernelArg(index, sizeof(T0), &arg); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1) { SetKernelArg(kernel, arg0); SetKernelArgLast(kernel, arg1, 1); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2) { SetKernelArg(kernel, arg0, arg1); SetKernelArgLast(kernel, arg2, 2); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3) { SetKernelArg(kernel, arg0, arg1, arg2); SetKernelArgLast(kernel, arg3, 3); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4) { SetKernelArg(kernel, arg0, arg1, arg2, arg3); SetKernelArgLast(kernel, arg4, 4); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4, T5 const & arg5) { SetKernelArg(kernel, arg0, arg1, arg2, arg3, arg4); SetKernelArgLast(kernel, arg5, 5); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4, T5 const & arg5, T6 const & arg6) { SetKernelArg(kernel, arg0, arg1, arg2, arg3, arg4, arg5); SetKernelArgLast(kernel, arg6, 6); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4, T5 const & arg5, T6 const & arg6, T7 const & arg7) { SetKernelArg(kernel, arg0, arg1, arg2, arg3, arg4, arg5, arg6); SetKernelArgLast(kernel, arg7, 7); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4, T5 const & arg5, T6 const & arg6, T7 const & arg7, T8 const & arg8) { SetKernelArg(kernel, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); SetKernelArgLast(kernel, arg8, 8); } template void SetKernelArg(CmKernel * kernel, T0 const & arg0, T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4, T5 const & arg5, T6 const & arg6, T7 const & arg7, T8 const & arg8, T9 const & arg9) { SetKernelArg(kernel, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); SetKernelArgLast(kernel, arg9, 9); } struct RefMbData { RefMbData() : used(false), poc(0), mb(), mv(), mv4X() {} bool used; mfxU32 poc; CmBuf mb; CmBuf mv; CmBuf mv4X; }; class CmContext { public: CmContext(); CmContext( MfxVideoParam const & video, CmDevice * cmDevice, VideoCORE* core); void Setup( MfxVideoParam const & video, CmDevice * cmDevice, VideoCORE* core); CmEvent* EnqueueKernel( CmKernel * kernel, unsigned int tsWidth, unsigned int tsHeight, CM_DEPENDENCY_PATTERN tsPattern); CmEvent * RunVme( DdiTask const & task, mfxU32 qp); mfxStatus QueryVme( DdiTask const & task, CmEvent * e); CmEvent * RunHistogram( DdiTask const & task, mfxU16 Width, mfxU16 Height, mfxU16 OffsetX, mfxU16 OffsetY); mfxStatus QueryHistogram( CmEvent * e); bool isHistogramSupported() { return m_programHist != 0; } mfxStatus DestroyEvent( CmEvent*& e ){ mfxStatus status = MFX_ERR_NONE; if(m_queue) { if (e) { INT sts = e->WaitForTaskFinished(); if (sts == CM_EXCEED_MAX_TIMEOUT) status = MFX_ERR_GPU_HANG; else if(sts != CM_SUCCESS) throw CmRuntimeError(); } m_queue->DestroyEvent(e); } return status; } protected: CmKernel * SelectKernelPreMe(mfxU32 frameType); CmKernel * SelectKernelDownSample(mfxU16 LaScaleFactor); mfxVMEUNIIn & SelectCosts(mfxU32 frameType); void SetCurbeData( CURBEData & curbeData, DdiTask const & task, mfxU32 qp); void SetCurbeData( CURBEData & curbeData, mfxU16 frameType, mfxU32 qp, mfxI32 width, mfxI32 height, mfxU32 biWeight); protected: mfxVideoParam m_video; CmDevice * m_device; CmQueue * m_queue; CmProgram * m_program; CmKernel * m_kernelI; CmKernel * m_kernelP; CmKernel * m_kernelB; CmProgram * m_programHist; CmKernel * m_kernelHistFrame; CmKernel * m_kernelHistFields; CmBuf m_nullBuf; mfxU32 m_lutMvP[65]; mfxU32 m_lutMvB[65]; mfxVMEUNIIn m_costsI; mfxVMEUNIIn m_costsP; mfxVMEUNIIn m_costsB; mfxU16 widthLa; mfxU16 heightLa; mfxU16 LaScaleFactor; }; } #endif // MFX_ENABLE_H264_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/h264/include/mfx_h264_encode_cm_defs.h000066400000000000000000000436231443134507600317760ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #ifdef _MSVC_LANG #pragma warning(disable: 4505) #pragma warning(push) #pragma warning(disable: 4100) #pragma warning(disable: 4201) #endif #include "cmvm.h" namespace MfxHwH264Encode { struct CURBEData { //DW0 union { mfxU32 DW0; struct { mfxU32 SkipModeEn:1; mfxU32 AdaptiveEn:1; mfxU32 BiMixDis:1; mfxU32 MBZ1:2; mfxU32 EarlyImeSuccessEn:1; mfxU32 MBZ2:1; mfxU32 T8x8FlagForInterEn:1; mfxU32 MBZ3:16; mfxU32 EarlyImeStop:8; }; }; //DW1 union { mfxU32 DW1; struct { mfxU32 MaxNumMVs:6; mfxU32 MBZ4:10; mfxU32 BiWeight:6; mfxU32 MBZ5:6; mfxU32 UniMixDisable:1; mfxU32 MBZ6:3; }; }; //DW2 union { mfxU32 DW2; struct { mfxU32 LenSP:8; mfxU32 MaxNumSU:8; mfxU32 MBZ7:16; }; }; //DW3 union { mfxU32 DW3; struct { mfxU32 SrcSize:2; mfxU32 MBZ8:1; mfxU32 MBZ9:1; mfxU32 MbTypeRemap:2; mfxU32 SrcAccess:1; mfxU32 RefAccess:1; mfxU32 SearchCtrl:3; mfxU32 DualSearchPathOption:1; mfxU32 SubPelMode:2; mfxU32 SkipType:1; mfxU32 DisableFieldCacheAllocation:1; mfxU32 InterChromaMode:1; mfxU32 FTQSkipEnable:1; mfxU32 BMEDisableFBR:1; mfxU32 BlockBasedSkipEnabled:1; mfxU32 InterSAD:2; mfxU32 IntraSAD:2; mfxU32 SubMbPartMask:7; mfxU32 MBZ10:1; }; }; //DW4 union { mfxU32 DW4; struct { mfxU32 SliceMacroblockHeightMinusOne:8; mfxU32 PictureHeightMinusOne:8; mfxU32 PictureWidthMinusOne:8; mfxU32 MBZ11:8; }; }; //DW5 union { mfxU32 DW5; struct { mfxU32 MBZ12:16; mfxU32 RefWidth:8; mfxU32 RefHeight:8; }; }; //DW6 union { mfxU32 DW6; struct { mfxU32 BatchBufferEndCommand:32; }; }; //DW7 union { mfxU32 DW7; struct { mfxU32 IntraPartMask:5; mfxU32 NonSkipZMvAdded:1; mfxU32 NonSkipModeAdded:1; mfxU32 IntraCornerSwap:1; mfxU32 MBZ13:8; mfxU32 MVCostScaleFactor:2; mfxU32 BilinearEnable:1; mfxU32 SrcFieldPolarity:1; mfxU32 WeightedSADHAAR:1; mfxU32 AConlyHAAR:1; mfxU32 RefIDCostMode:1; mfxU32 MBZ00:1; mfxU32 SkipCenterMask:8; }; }; //DW8 union { mfxU32 DW8; struct { mfxU32 ModeCost_0:8; mfxU32 ModeCost_1:8; mfxU32 ModeCost_2:8; mfxU32 ModeCost_3:8; }; }; //DW9 union { mfxU32 DW9; struct { mfxU32 ModeCost_4:8; mfxU32 ModeCost_5:8; mfxU32 ModeCost_6:8; mfxU32 ModeCost_7:8; }; }; //DW10 union { mfxU32 DW10; struct { mfxU32 ModeCost_8:8; mfxU32 ModeCost_9:8; mfxU32 RefIDCost:8; mfxU32 ChromaIntraModeCost:8; }; }; //DW11 union { mfxU32 DW11; struct { mfxU32 MvCost_0:8; mfxU32 MvCost_1:8; mfxU32 MvCost_2:8; mfxU32 MvCost_3:8; }; }; //DW12 union { mfxU32 DW12; struct { mfxU32 MvCost_4:8; mfxU32 MvCost_5:8; mfxU32 MvCost_6:8; mfxU32 MvCost_7:8; }; }; //DW13 union { mfxU32 DW13; struct { mfxU32 QpPrimeY:8; mfxU32 QpPrimeCb:8; mfxU32 QpPrimeCr:8; mfxU32 TargetSizeInWord:8; }; }; //DW14 union { mfxU32 DW14; struct { mfxU32 FTXCoeffThresh_DC:16; mfxU32 FTXCoeffThresh_1:8; mfxU32 FTXCoeffThresh_2:8; }; }; //DW15 union { mfxU32 DW15; struct { mfxU32 FTXCoeffThresh_3:8; mfxU32 FTXCoeffThresh_4:8; mfxU32 FTXCoeffThresh_5:8; mfxU32 FTXCoeffThresh_6:8; }; }; //DW16 union { mfxU32 DW16; struct { mfxU32 IMESearchPath0:8; mfxU32 IMESearchPath1:8; mfxU32 IMESearchPath2:8; mfxU32 IMESearchPath3:8; }; }; //DW17 union { mfxU32 DW17; struct { mfxU32 IMESearchPath4:8; mfxU32 IMESearchPath5:8; mfxU32 IMESearchPath6:8; mfxU32 IMESearchPath7:8; }; }; //DW18 union { mfxU32 DW18; struct { mfxU32 IMESearchPath8:8; mfxU32 IMESearchPath9:8; mfxU32 IMESearchPath10:8; mfxU32 IMESearchPath11:8; }; }; //DW19 union { mfxU32 DW19; struct { mfxU32 IMESearchPath12:8; mfxU32 IMESearchPath13:8; mfxU32 IMESearchPath14:8; mfxU32 IMESearchPath15:8; }; }; //DW20 union { mfxU32 DW20; struct { mfxU32 IMESearchPath16:8; mfxU32 IMESearchPath17:8; mfxU32 IMESearchPath18:8; mfxU32 IMESearchPath19:8; }; }; //DW21 union { mfxU32 DW21; struct { mfxU32 IMESearchPath20:8; mfxU32 IMESearchPath21:8; mfxU32 IMESearchPath22:8; mfxU32 IMESearchPath23:8; }; }; //DW22 union { mfxU32 DW22; struct { mfxU32 IMESearchPath24:8; mfxU32 IMESearchPath25:8; mfxU32 IMESearchPath26:8; mfxU32 IMESearchPath27:8; }; }; //DW23 union { mfxU32 DW23; struct { mfxU32 IMESearchPath28:8; mfxU32 IMESearchPath29:8; mfxU32 IMESearchPath30:8; mfxU32 IMESearchPath31:8; }; }; //DW24 union { mfxU32 DW24; struct { mfxU32 IMESearchPath32:8; mfxU32 IMESearchPath33:8; mfxU32 IMESearchPath34:8; mfxU32 IMESearchPath35:8; }; }; //DW25 union { mfxU32 DW25; struct { mfxU32 IMESearchPath36:8; mfxU32 IMESearchPath37:8; mfxU32 IMESearchPath38:8; mfxU32 IMESearchPath39:8; }; }; //DW26 union { mfxU32 DW26; struct { mfxU32 IMESearchPath40:8; mfxU32 IMESearchPath41:8; mfxU32 IMESearchPath42:8; mfxU32 IMESearchPath43:8; }; }; //DW27 union { mfxU32 DW27; struct { mfxU32 IMESearchPath44:8; mfxU32 IMESearchPath45:8; mfxU32 IMESearchPath46:8; mfxU32 IMESearchPath47:8; }; }; //DW28 union { mfxU32 DW28; struct { mfxU32 IMESearchPath48:8; mfxU32 IMESearchPath49:8; mfxU32 IMESearchPath50:8; mfxU32 IMESearchPath51:8; }; }; //DW29 union { mfxU32 DW29; struct { mfxU32 IMESearchPath52:8; mfxU32 IMESearchPath53:8; mfxU32 IMESearchPath54:8; mfxU32 IMESearchPath55:8; }; }; //DW30 union { mfxU32 DW30; struct { mfxU32 Intra4x4ModeMask:9; mfxU32 MBZ14:7; mfxU32 Intra8x8ModeMask:9; mfxU32 MBZ15:7; }; }; //DW31 union { mfxU32 DW31; struct { mfxU32 Intra16x16ModeMask:4; mfxU32 IntraChromaModeMask:4; mfxU32 IntraComputeType:2; mfxU32 MBZ16:22; }; }; //DW32 union { mfxU32 DW32; struct { mfxU32 SkipVal:16; mfxU32 MultipredictorL0EnableBit:8; mfxU32 MultipredictorL1EnableBit:8; }; }; //DW33 union { mfxU32 DW33; struct { mfxU32 IntraNonDCPenalty16x16:8; mfxU32 IntraNonDCPenalty8x8:8; mfxU32 IntraNonDCPenalty4x4:8; mfxU32 MBZ18:8; }; }; //DW34 union { mfxU32 DW34; struct { mfxU32 MaxVmvR:16; mfxU32 MBZ19:16; }; }; //DW35 union { mfxU32 DW35; struct { mfxU32 PanicModeMBThreshold:16; mfxU32 SmallMbSizeInWord:8; mfxU32 LargeMbSizeInWord:8; }; }; //DW36 union { mfxU32 DW36; struct { mfxU32 HMERefWindowsCombiningThreshold:8; mfxU32 HMECombineOverlap:2; mfxU32 CheckAllFractionalEnable:1; mfxU32 MBZ20:21; }; }; //DW37 union { mfxU32 DW37; struct { mfxU32 CurLayerDQId:8; mfxU32 TemporalId:4; mfxU32 NoInterLayerPredictionFlag:1; mfxU32 AdaptivePredictionFlag:1; mfxU32 DefaultBaseModeFlag:1; mfxU32 AdaptiveResidualPredictionFlag:1; mfxU32 DefaultResidualPredictionFlag:1; mfxU32 AdaptiveMotionPredictionFlag:1; mfxU32 DefaultMotionPredictionFlag:1; mfxU32 TcoeffLevelPredictionFlag:1; mfxU32 UseHMEPredictor:1; mfxU32 SpatialResChangeFlag:1; mfxU32 isFwdFrameShortTermRef:1; mfxU32 MBZ21:9; }; }; //the following offsets are in the unit of 2 pixels. //DW38 union { mfxU32 DW38; struct { mfxU32 ScaledRefLayerLeftOffset:16; mfxU32 ScaledRefLayerRightOffset:16; }; }; //DW39 union { mfxU32 DW39; struct { mfxU32 ScaledRefLayerTopOffset:16; mfxU32 ScaledRefLayerBottomOffset:16; }; }; }; struct LAOutObject { /* PAK Object Macroblock Codes for AVC */ //DW0 union { mfxU8 MbMode; struct { mfxU8 InterMbMode :2; mfxU8 SkipMbFlag :1; mfxU8 MBZ1 :1; mfxU8 IntraMbMode :2; mfxU8 MBZ2 :1; mfxU8 FieldPolarity :1; }; }; union { mfxU8 MbType; struct { mfxU8 MbType5Bits :5; mfxU8 IntraMbFlag :1; mfxU8 FieldMbFlag :1; mfxU8 TransformFlag :1; }; }; union { mfxU8 MbFlag; struct { mfxU8 ResidDiffFlag :1; mfxU8 DcBlockCodedVFlag :1; mfxU8 DcBlockCodedUFlag :1; mfxU8 DcBlockCodedYFlag :1; mfxU8 MvFormat :3; mfxU8 MBZ3 :1; }; }; union { mfxU8 MvNum; struct { mfxU8 NumPackedMv:6; mfxU8 MBZ4:1; mfxU8 ExtendedForm:1; }; }; //DW1 - DW3 union { struct { /* Intra */ mfxU16 LumaIntraModes[4];; union { mfxU8 IntraStruct; struct { mfxU8 ChromaIntraPredMode :2; mfxU8 IntraPredAvailFlags :6; }; }; mfxU8 MBZ6; mfxU16 MBZ7; }; struct { /* Inter */ mfxU8 SubMbShape; mfxU8 SubMbPredMode; mfxU16 MBZ8; mfxU8 RefPicSelect[2][4]; }; }; //DW4. used for padding mfxU16 intraCost; mfxU16 interCost; //DW5 mfxU16 dist; mfxU16 rate; //DW6-7 mfxU16 lumaCoeffSum[4]; //DW8 mfxU8 lumaCoeffCnt[4]; //DW9 mfxI16 costCenter0X; mfxI16 costCenter0Y; //DW10 mfxI16 costCenter1X; mfxI16 costCenter1Y; //DW11-12 mfxI16Pair mv[2]; //13 mfxU32 MBZ13; //14 mfxU32 MBZ14; //15 mfxU32 MBZ15; }; struct mfxAvcMbMVs { mfxI16Pair MotionVectors[2][16]; }; struct mfxVMEIMEIn { union{ mfxU8 Multicall; struct{ mfxU8 StreamOut :1; mfxU8 StreamIn :1; }; }; mfxU8 IMESearchPath0to31[32]; mfxU32 mbz0[2]; mfxU8 IMESearchPath32to55[24]; mfxU32 mbz1; mfxU8 RecRefID[2][4]; mfxI16Pair RecordMvs16[2]; mfxU16 RecordDst16[2]; mfxU16 RecRefID16[2]; mfxU16 RecordDst[2][8]; mfxI16Pair RecordMvs[2][8]; }; const mfxU8 SingleSU[56] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; #define L1 0x0F #define R1 0x01 #define U1 0xF0 #define D1 0x10 const mfxU8 RasterScan_48x40[56] = {// Starting location does not matter so long as wrapping enabled. R1,R1,R1,R1,R1,R1,R1,R1|D1, R1,R1,R1,R1,R1,R1,R1,R1|D1, R1,R1,R1,R1,R1,R1,R1,R1|D1, R1,R1,R1,R1,R1,R1,R1,R1|D1, R1,R1,R1,R1,R1,R1,R1,R1|D1, R1,R1,R1,R1,R1,R1,R1 }; // 37 1E 1F 20 21 22 23 24 // 36 1D 0C 0D 0E 0F 10 25 // 35 1C 0B 02 03 04 11 26 // 34 1B 0A 01>00<05 12 27 // 33 1A 09 08 07 06 13 28 // 32 19 18 17 16 15 14 29 // 31 30 2F 2E 2D 2C 2B 2A const mfxU8 FullSpiral_48x40[56] = { // L -> U -> R -> D L1, U1, R1,R1, D1,D1, L1,L1,L1, U1,U1,U1, R1,R1,R1,R1, D1,D1,D1,D1, L1,L1,L1,L1,L1, U1,U1,U1,U1,U1, R1,R1,R1,R1,R1,R1, D1,D1,D1,D1,D1,D1, // The last D1 steps outside the search window. L1,L1,L1,L1,L1,L1,L1, // These are outside the search window. U1,U1,U1,U1,U1,U1,U1 }; const mfxU8 Diamond[56] = { 0x0F,0xF1,0x0F,0x12,//5 0x0D,0xE2,0x22,0x1E,//9 0x10,0xFF,0xE2,0x20,//13 0xFC,0x06,0xDD,//16 0x2E,0xF1,0x3F,0xD3,0x11,0x3D,0xF3,0x1F,//24 0xEB,0xF1,0xF1,0xF1,//28 0x4E,0x11,0x12,0xF2,0xF1,//33 0xE0,0xFF,0xFF,0x0D,0x1F,0x1F,//39 0x20,0x11,0xCF,0xF1,0x05,0x11,//45 0x00,0x00,0x00,0x00,0x00,0x00,//51 }; #define LUTMODE_INTRA_NONPRED 0x00 // extra penalty for non-predicted modes #define LUTMODE_INTRA 0x01 #define LUTMODE_INTRA_16x16 0x01 #define LUTMODE_INTRA_8x8 0x02 #define LUTMODE_INTRA_4x4 0x03 #define LUTMODE_INTER_BWD 0x09 #define LUTMODE_REF_ID 0x0A #define LUTMODE_INTRA_CHROMA 0x0B #define LUTMODE_INTER 0x08 #define LUTMODE_INTER_16x16 0x08 #define LUTMODE_INTER_16x8 0x04 #define LUTMODE_INTER_8x16 0x04 #define LUTMODE_INTER_8x8q 0x05 #define LUTMODE_INTER_8x4q 0x06 #define LUTMODE_INTER_4x8q 0x06 #define LUTMODE_INTER_4x4q 0x07 #define LUTMODE_INTER_16x8_FIELD 0x06 #define LUTMODE_INTER_8x8_FIELD 0x07 extern "C" void EncMB_I( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex); extern "C" void EncMB_P( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex); extern "C" void EncMB_B( vector laCURBEData, SurfaceIndex SrcSurfIndexRaw, SurfaceIndex SrcSurfIndex, SurfaceIndex VMEInterPredictionSurfIndex, SurfaceIndex MBDataSurfIndex, SurfaceIndex FwdFrmMBDataSurfIndex); extern "C" void DownSampleMB2X( SurfaceIndex SrcSurfIndex, SurfaceIndex SrcSurf2XIndex); extern "C" void DownSampleMB4X( SurfaceIndex SrcSurfIndex, SurfaceIndex SrcSurf4XIndex); extern "C" void HistogramFrame( SurfaceIndex INBUF, SurfaceIndex OUTBUF, uint max_h_pos, uint max_v_pos, uint off_h, uint off_v); extern "C" void HistogramFields( SurfaceIndex INBUF, SurfaceIndex OUTBUF, uint max_h_pos, uint max_v_pos, uint off_h, uint off_v); }; #ifdef _MSVC_LANG #pragma warning(pop) #endif #endif // MFX_ENABLE_H264_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/h264/src/000077500000000000000000000000001443134507600244275ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/h264/src/mfx_h264_encode_cm.cpp000077500000000000000000001701511443134507600304740ustar00rootroot00000000000000// Copyright (c) 2009-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "ipps.h" #include "mfx_common.h" #ifdef MFX_ENABLE_H264_VIDEO_ENCODE #include #include #include #include /* for std exceptions on Linux/Android */ #include "libmfx_core_interface.h" #include "cmrt_cross_platform.h" #include "mfx_h264_encode_cm_defs.h" #include "mfx_h264_encode_cm.h" #include "mfx_h264_encode_hw_utils.h" #ifdef MFX_ENABLE_KERNELS #include "genx_simple_me_gen12lp_isa.h" #include "genx_histogram_gen12lp_isa.h" #endif namespace MfxHwH264EncodeHW { using MfxHwH264Encode::CmRuntimeError; ///const char ME_PROGRAM_NAME[] = "genx_hsw_simple_me.isa"; const mfxU32 SEARCHPATHSIZE = 56; const mfxU32 BATCHBUFFER_END = 0x5000000; CmProgram * ReadProgram(CmDevice * device, const mfxU8 * buffer, size_t len) { int result = CM_SUCCESS; CmProgram * program = 0; if ((result = ::ReadProgram(device, program, buffer, (mfxU32)len)) != CM_SUCCESS) throw CmRuntimeError(); return program; } CmKernel * CreateKernel(CmDevice * device, CmProgram * program, char const * name, void * funcptr) { int result = CM_SUCCESS; CmKernel * kernel = 0; if ((result = ::CreateKernel(device, program, name, funcptr, kernel)) != CM_SUCCESS) throw CmRuntimeError(); return kernel; } SurfaceIndex & GetIndex(CmSurface2D * surface) { SurfaceIndex * index = 0; int result = surface->GetIndex(index); if (result != CM_SUCCESS) throw CmRuntimeError(); return *index; } SurfaceIndex & GetIndex(CmBuffer * buffer) { SurfaceIndex * index = 0; int result = buffer->GetIndex(index); if (result != CM_SUCCESS) throw CmRuntimeError(); return *index; } SurfaceIndex & GetIndex(CmBufferUP * buffer) { SurfaceIndex * index = 0; int result = buffer->GetIndex(index); if (result != CM_SUCCESS) throw CmRuntimeError(); return *index; } void Read(CmBuffer * buffer, void * buf, CmEvent * e = 0) { int result = CM_SUCCESS; if ((result = buffer->ReadSurface(reinterpret_cast(buf), e)) != CM_SUCCESS) throw CmRuntimeError(); } void Write(CmBuffer * buffer, void * buf, CmEvent * e = 0) { int result = CM_SUCCESS; if ((result = buffer->WriteSurface(reinterpret_cast(buf), e)) != CM_SUCCESS) throw CmRuntimeError(); } }; namespace MfxHwH264Encode { using namespace MfxHwH264EncodeHW; CmDevice * TryCreateCmDevicePtr(VideoCORE * core, mfxU32 * version) { mfxU32 versionPlaceholder = 0; if (version == 0) version = &versionPlaceholder; CmDevice * device = 0; int result = CM_SUCCESS; if (core->GetVAType() == MFX_HW_D3D9) { } else if (core->GetVAType() == MFX_HW_D3D11) { } else if (core->GetVAType() == MFX_HW_VAAPI) { //throw std::logic_error("GetDeviceManager not implemented on Linux for Look Ahead"); VADisplay display; mfxStatus res = core->GetHandle(MFX_HANDLE_VA_DISPLAY, &display); // == MFX_HANDLE_RESERVED2 if (res != MFX_ERR_NONE || !display) return 0; if ((result = ::CreateCmDevice(device, *version, display, CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE)) != CM_SUCCESS) return 0; } return device; } CmDevice * CreateCmDevicePtr(VideoCORE * core, mfxU32 * version) { CmDevice * device = TryCreateCmDevicePtr(core, version); if (device == 0) throw CmRuntimeError(); return device; } CmDevicePtr::CmDevicePtr(CmDevice * device) : m_device(device) { } CmDevicePtr::~CmDevicePtr() { Reset(0); } void CmDevicePtr::Reset(CmDevice * device) { if (m_device) { int result = ::DestroyCmDevice(m_device); assert(result == CM_SUCCESS); (void)result; } m_device = device; } CmDevice * CmDevicePtr::operator -> () { return m_device; } CmDevicePtr & CmDevicePtr::operator = (CmDevice * device) { Reset(device); return *this; } CmDevicePtr::operator CmDevice * () { return m_device; } CmSurface::CmSurface() : m_device(0) , m_surface(0) { } CmSurface::CmSurface(CmDevice * device, IDirect3DSurface9 * d3dSurface) : m_device(0) , m_surface(0) { Reset(device, d3dSurface); } CmSurface::CmSurface(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc) : m_device(0) , m_surface(0) { Reset(device, width, height, fourcc); } CmSurface::~CmSurface() { Reset(0, 0); } CmSurface2D * CmSurface::operator -> () { return m_surface; } CmSurface::operator CmSurface2D * () { return m_surface; } void CmSurface::Reset(CmDevice * device, IDirect3DSurface9 * d3dSurface) { CmSurface2D * newSurface = CreateSurface(device, d3dSurface); if (m_device && m_surface) { int result = m_device->DestroySurface(m_surface); assert(result == CM_SUCCESS); (void)result; } m_device = device; m_surface = newSurface; } void CmSurface::Reset(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc) { CmSurface2D * newSurface = CreateSurface(device, width, height, D3DFORMAT(fourcc)); if (m_device && m_surface) { int result = m_device->DestroySurface(m_surface); assert(result == CM_SUCCESS); (void)result; } m_device = device; m_surface = newSurface; } SurfaceIndex const & CmSurface::GetIndex() { return MfxHwH264EncodeHW::GetIndex(m_surface); } void CmSurface::Read(void * buf, CmEvent * e) { int result = m_surface->ReadSurface(reinterpret_cast(buf), e); if (result != CM_SUCCESS) throw CmRuntimeError(); } void CmSurface::Write(void * buf, CmEvent * e) { int result = m_surface->WriteSurface(reinterpret_cast(buf), e); if (result != CM_SUCCESS) throw CmRuntimeError(); } CmSurfaceVme75::CmSurfaceVme75() : m_device(0) , m_index(0) { } CmSurfaceVme75::CmSurfaceVme75(CmDevice * device, SurfaceIndex * index) : m_device(0) , m_index(0) { Reset(device, index); } CmSurfaceVme75::~CmSurfaceVme75() { Reset(0, 0); } void CmSurfaceVme75::Reset(CmDevice * device, SurfaceIndex * index) { if (m_device && m_index) { int result = m_device->DestroyVmeSurfaceG7_5(m_index); assert(result == CM_SUCCESS); (void)result; } m_device = device; m_index = index; } SurfaceIndex const * CmSurfaceVme75::operator & () const { return m_index; } CmSurfaceVme75::operator SurfaceIndex () { return *m_index; } CmBuf::CmBuf() : m_device(0) , m_buffer(0) { } CmBuf::CmBuf(CmDevice * device, mfxU32 size) : m_device(0) , m_buffer(0) { Reset(device, size); } CmBuf::~CmBuf() { Reset(0, 0); } CmBuffer * CmBuf::operator -> () { return m_buffer; } CmBuf::operator CmBuffer * () { return m_buffer; } void CmBuf::Reset(CmDevice * device, mfxU32 size) { CmBuffer * buffer = (device && size) ? CreateBuffer(device, size) : 0; if (m_device && m_buffer) { int result = m_device->DestroySurface(m_buffer); assert(result == CM_SUCCESS); (void)result; } m_device = device; m_buffer = buffer; } SurfaceIndex const & CmBuf::GetIndex() const { return MfxHwH264EncodeHW::GetIndex(m_buffer); } void CmBuf::Read(void * buf, CmEvent * e) const { MfxHwH264EncodeHW::Read(m_buffer, buf, e); } void CmBuf::Write(void * buf, CmEvent * e) const { MfxHwH264EncodeHW::Write(m_buffer, buf, e); } CmBuffer * CreateBuffer(CmDevice * device, mfxU32 size) { CmBuffer * buffer; int result = device->CreateBuffer(size, buffer); if (result != CM_SUCCESS) throw CmRuntimeError(); return buffer; } CmBufferUP * CreateBuffer(CmDevice * device, mfxU32 size, void * mem) { CmBufferUP * buffer; int result = device->CreateBufferUP(size, mem, buffer); if (result != CM_SUCCESS) throw CmRuntimeError(); return buffer; } CmSurface2D * CreateSurface(CmDevice * device, IDirect3DSurface9 * d3dSurface) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; if (device && d3dSurface && (result = device->CreateSurface2D(d3dSurface, cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2D * CreateSurface(CmDevice * device, ID3D11Texture2D * d3dSurface) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; if (device && d3dSurface && (result = device->CreateSurface2D(d3dSurface, cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2D * CreateSurface2DSubresource(CmDevice * device, ID3D11Texture2D * d3dSurface) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; mfxU32 cmSurfaceCount = 1; if (device && d3dSurface && (result = device->CreateSurface2DSubresource(d3dSurface, 1, &cmSurface, cmSurfaceCount)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2D * CreateSurface2DbySubresourceIndex(CmDevice * device, ID3D11Texture2D * d3dSurface, UINT subResourceIndex) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; if (device && d3dSurface && (result = device->CreateSurface2DbySubresourceIndex(d3dSurface, subResourceIndex, 0 , cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2D * CreateSurface(CmDevice * device, AbstractSurfaceHandle vaSurface) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; if (device && (vaSurface) && (result = device->CreateSurface2D(vaSurface, cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2D * CreateSurface(CmDevice * device, mfxHDL nativeSurface, eMFXVAType vatype) { switch (vatype) { case MFX_HW_D3D9: return CreateSurface(device, (IDirect3DSurface9 *)nativeSurface); case MFX_HW_D3D11: return CreateSurface2DSubresource(device, (ID3D11Texture2D *)nativeSurface); case MFX_HW_VAAPI: return CreateSurface(device, nativeSurface); default: throw CmRuntimeError(); } } CmSurface2D * CreateSurface(CmDevice * device, mfxHDLPair nativeSurfaceIndexPair, eMFXVAType vatype) { switch (vatype) { case MFX_HW_D3D9: return CreateSurface(device, (IDirect3DSurface9 *)nativeSurfaceIndexPair.first); case MFX_HW_D3D11: return CreateSurface2DbySubresourceIndex(device, (ID3D11Texture2D *)nativeSurfaceIndexPair.first, static_cast((size_t)nativeSurfaceIndexPair.second)); case MFX_HW_VAAPI: return CreateSurface(device, nativeSurfaceIndexPair.first); default: throw CmRuntimeError(); } } CmSurface2D * CreateSurface(CmDevice * device, mfxU32 width, mfxU32 height, mfxU32 fourcc) { int result = CM_SUCCESS; CmSurface2D * cmSurface = 0; if (device && (result = device->CreateSurface2D(width, height, CM_SURFACE_FORMAT(fourcc), cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } CmSurface2DUP * CreateSurface(CmDevice * device, void *mem, mfxU32 width, mfxU32 height, mfxU32 fourcc) { int result = CM_SUCCESS; CmSurface2DUP * cmSurface = 0; if (device && (result = device->CreateSurface2DUP(width, height, CM_SURFACE_FORMAT(fourcc), mem, cmSurface)) != CM_SUCCESS) throw CmRuntimeError(); return cmSurface; } SurfaceIndex * CreateVmeSurfaceG75( CmDevice * device, CmSurface2D * source, CmSurface2D ** fwdRefs, CmSurface2D ** bwdRefs, mfxU32 numFwdRefs, mfxU32 numBwdRefs) { if (numFwdRefs == 0) fwdRefs = 0; if (numBwdRefs == 0) bwdRefs = 0; int result = CM_SUCCESS; SurfaceIndex * index; if ((result = device->CreateVmeSurfaceG7_5(source, fwdRefs, bwdRefs, numFwdRefs, numBwdRefs, index)) != CM_SUCCESS) throw CmRuntimeError(); return index; } CmContext::CmContext() : m_video() , m_device(0) , m_queue(0) , m_program(0) , m_programHist(0) { /* Flog = fopen("HmeLog.txt", "wb"); FdsSurf = fopen("dsSurf.yuv", "wb"); */ LaScaleFactor = 0; m_kernelI = NULL; heightLa = 0; m_kernelP = NULL; m_kernelHistFields = NULL; m_kernelHistFrame = NULL; m_kernelB = NULL; widthLa = 0; } }; namespace MfxHwH264EncodeHW { using namespace MfxHwH264Encode; mfxU32 Map44LutValueBack(mfxU32 val) { mfxU32 base = val & 0xf; mfxU32 shift = (val >> 4) & 0xf; assert((base << shift) < (1 << 12)); // encoded value must fit in 12-bits return base << shift; } const mfxU8 QP_LAMBDA[40] = // pow(2, qp/6) { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 8, 9,10,11,13,14, 16,18,20,23,25,29,32,36, 40,45,51,57,64,72,81,91 }; void SetLutMv(mfxVMEUNIIn const & costs, mfxU32 lutMv[65]) { lutMv[0] = Map44LutValueBack(costs.MvCost[0]); lutMv[1] = Map44LutValueBack(costs.MvCost[1]); lutMv[2] = Map44LutValueBack(costs.MvCost[2]); lutMv[4] = Map44LutValueBack(costs.MvCost[3]); lutMv[8] = Map44LutValueBack(costs.MvCost[4]); lutMv[16] = Map44LutValueBack(costs.MvCost[5]); lutMv[32] = Map44LutValueBack(costs.MvCost[6]); lutMv[64] = Map44LutValueBack(costs.MvCost[7]); lutMv[3] = (lutMv[4] + lutMv[2]) >> 1; for (mfxU32 i = 5; i < 8; i++) lutMv[i] = lutMv[ 4] + ((lutMv[ 8] - lutMv[ 4]) * (i - 4) >> 2); for (mfxU32 i = 9; i < 16; i++) lutMv[i] = lutMv[ 8] + ((lutMv[16] - lutMv[ 8]) * (i - 8) >> 3); for (mfxU32 i = 17; i < 32; i++) lutMv[i] = lutMv[16] + ((lutMv[32] - lutMv[16]) * (i - 16) >> 4); for (mfxU32 i = 33; i < 64; i++) lutMv[i] = lutMv[32] + ((lutMv[64] - lutMv[32]) * (i - 32) >> 5); } mfxU16 GetVmeMvCostP( mfxU32 const lutMv[65], LAOutObject const & mb) { mfxU32 diffx = abs(mb.costCenter0X - mb.mv[0].x) >> 2; mfxU32 diffy = abs(mb.costCenter0Y - mb.mv[0].y) >> 2; mfxU32 costx = diffx > 64 ? lutMv[64] + ((diffx - 64) >> 2) : lutMv[diffx]; mfxU32 costy = diffy > 64 ? lutMv[64] + ((diffy - 64) >> 2) : lutMv[diffy]; return mfxU16(std::min(0x3ffu, costx + costy)); } mfxU16 GetVmeMvCostB( mfxU32 const lutMv[65], LAOutObject const & mb) { mfxU32 diffx0 = abs(mb.costCenter0X - mb.mv[0].x) >> 2; mfxU32 diffy0 = abs(mb.costCenter0Y - mb.mv[0].y) >> 2; mfxU32 diffx1 = abs(mb.costCenter1X - mb.mv[1].x) >> 2; mfxU32 diffy1 = abs(mb.costCenter1Y - mb.mv[1].y) >> 2; mfxU32 costx0 = diffx0 > 64 ? lutMv[64] + ((diffx0 - 64) >> 2) : lutMv[diffx0]; mfxU32 costy0 = diffy0 > 64 ? lutMv[64] + ((diffy0 - 64) >> 2) : lutMv[diffy0]; mfxU32 costx1 = diffx1 > 64 ? lutMv[64] + ((diffx1 - 64) >> 2) : lutMv[diffx1]; mfxU32 costy1 = diffy1 > 64 ? lutMv[64] + ((diffy1 - 64) >> 2) : lutMv[diffy1]; mfxU32 mvCost0 = std::min(0x3ffu, costx0 + costy0); mfxU32 mvCost1 = std::min(0x3ffu, costx1 + costy1); return mfxU16(mvCost0 + mvCost1); } mfxU8 GetMaxMvsPer2Mb(mfxU32 level) { return level < 30 ? 126 : (level == 30 ? 32 : 16); } mfxU32 GetMaxMvLenY(mfxU32 level) { return level < 11 ? 63 : level < 21 ? 127 : level < 31 ? 255 : 511; } using std::min; using std::max; mfxU8 Map44LutValue(mfxU32 v, mfxU8 max) { if(v == 0) return 0; mfxI16 D = (mfxI16)(log((double)v)/log(2.)) - 3; if(D < 0) D = 0; mfxI8 ret = (mfxU8)((D << 4) + (int)((v + (D == 0 ? 0 : (1<<(D-1)))) >> D)); ret = (ret & 0xf) == 0 ? (ret | 8) : ret; if(((ret&15)<<(ret>>4)) > ((max&15)<<(max>>4))) ret = max; return ret; } void SetCosts( mfxVMEUNIIn & costs, mfxU32 frameType, mfxU32 qp, mfxU32 intraSad, mfxU32 ftqBasedSkip) { mfxU16 lambda = QP_LAMBDA[max(0, mfxI32(qp - 12))]; float had_bias = (intraSad == 3) ? 1.67f : 2.0f; Zero(costs); //costs.ModeCost[LUTMODE_INTRA_NONPRED] = Map44LutValue((mfxU16)(lambda * 5 * had_bias), 0x6f); //costs.ModeCost[LUTMODE_INTRA_16x16] = 0; //costs.ModeCost[LUTMODE_INTRA_8x8] = Map44LutValue((mfxU16)(lambda * 1.5 * had_bias), 0x8f); //costs.ModeCost[LUTMODE_INTRA_4x4] = Map44LutValue((mfxU16)(lambda * 14 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_NONPRED] = 0;//Map44LutValue((mfxU16)(lambda * 3.5 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTRA_16x16] = Map44LutValue((mfxU16)(lambda * 10 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_8x8] = Map44LutValue((mfxU16)(lambda * 14 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_4x4] = Map44LutValue((mfxU16)(lambda * 35 * had_bias), 0x8f); if (frameType & MFX_FRAMETYPE_P) { costs.ModeCost[LUTMODE_INTRA_NONPRED] = 0;//Map44LutValue((mfxU16)(lambda * 3.5 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTRA_16x16] = Map44LutValue((mfxU16)(lambda * 10 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_8x8] = Map44LutValue((mfxU16)(lambda * 14 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_4x4] = Map44LutValue((mfxU16)(lambda * 35 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_16x16] = Map44LutValue((mfxU16)(lambda * 2.75 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_16x8] = Map44LutValue((mfxU16)(lambda * 4.25 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_8x8q] = Map44LutValue((mfxU16)(lambda * 1.32 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTER_8x4q] = Map44LutValue((mfxU16)(lambda * 2.32 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTER_4x4q] = Map44LutValue((mfxU16)(lambda * 3.32 * had_bias), 0x6f); costs.ModeCost[LUTMODE_REF_ID] = Map44LutValue((mfxU16)(lambda * 2 * had_bias), 0x6f); costs.MvCost[0] = Map44LutValue((mfxU16)(lambda * 0.5 * had_bias), 0x6f); costs.MvCost[1] = Map44LutValue((mfxU16)(lambda * 2 * had_bias), 0x6f); costs.MvCost[2] = Map44LutValue((mfxU16)(lambda * 2.5 * had_bias), 0x6f); costs.MvCost[3] = Map44LutValue((mfxU16)(lambda * 4.5 * had_bias), 0x6f); costs.MvCost[4] = Map44LutValue((mfxU16)(lambda * 5 * had_bias), 0x6f); costs.MvCost[5] = Map44LutValue((mfxU16)(lambda * 6 * had_bias), 0x6f); costs.MvCost[6] = Map44LutValue((mfxU16)(lambda * 7 * had_bias), 0x6f); costs.MvCost[7] = Map44LutValue((mfxU16)(lambda * 7.5 * had_bias), 0x6f); } else if (frameType & MFX_FRAMETYPE_B) { costs.ModeCost[LUTMODE_INTRA_NONPRED] = 0;//Map44LutValue((mfxU16)(lambda * 3.5 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTRA_16x16] = Map44LutValue((mfxU16)(lambda * 17 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_8x8] = Map44LutValue((mfxU16)(lambda * 20 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTRA_4x4] = Map44LutValue((mfxU16)(lambda * 40 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_16x16] = Map44LutValue((mfxU16)(lambda * 3 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_16x8] = Map44LutValue((mfxU16)(lambda * 6 * had_bias), 0x8f); costs.ModeCost[LUTMODE_INTER_8x8q] = Map44LutValue((mfxU16)(lambda * 3.25 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTER_8x4q] = Map44LutValue((mfxU16)(lambda * 4.25 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTER_4x4q] = Map44LutValue((mfxU16)(lambda * 5.25 * had_bias), 0x6f); costs.ModeCost[LUTMODE_INTER_BWD] = Map44LutValue((mfxU16)(lambda * 1 * had_bias), 0x6f); costs.ModeCost[LUTMODE_REF_ID] = Map44LutValue((mfxU16)(lambda * 2 * had_bias), 0x6f); costs.MvCost[0] = Map44LutValue((mfxU16)(lambda * 0 * had_bias), 0x6f); costs.MvCost[1] = Map44LutValue((mfxU16)(lambda * 1 * had_bias), 0x6f); costs.MvCost[2] = Map44LutValue((mfxU16)(lambda * 1 * had_bias), 0x6f); costs.MvCost[3] = Map44LutValue((mfxU16)(lambda * 3 * had_bias), 0x6f); costs.MvCost[4] = Map44LutValue((mfxU16)(lambda * 5 * had_bias), 0x6f); costs.MvCost[5] = Map44LutValue((mfxU16)(lambda * 6 * had_bias), 0x6f); costs.MvCost[6] = Map44LutValue((mfxU16)(lambda * 7 * had_bias), 0x6f); costs.MvCost[7] = Map44LutValue((mfxU16)(lambda * 8 * had_bias), 0x6f); } if (ftqBasedSkip & 1) { //mfxU32 idx = (qp + 1) >> 1; //const mfxU8 FTQ25[26] = //{ // 0,0,0,0, // 1,3,6,8,11, // 13,16,19,22,26, // 30,34,39,44,50, // 56,62,69,77,85, // 94,104 //}; costs.FTXCoeffThresh[0] = costs.FTXCoeffThresh[1] = costs.FTXCoeffThresh[2] = costs.FTXCoeffThresh[3] = costs.FTXCoeffThresh[4] = costs.FTXCoeffThresh[5] = 0;//FTQ25[idx]; costs.FTXCoeffThresh_DC = 0;//FTQ25[idx]; } } const mfxU16 Dist10[26] = { 0,0,0,0,2, 4,7,11,17,25, 35,50,68,91,119, 153,194,241,296,360, 432,513,604,706,819, 944 }; const mfxU16 Dist25[26] = { 0,0,0,0, 12,32,51,69,87, 107,129,154,184,219, 260,309,365,431,507, 594,694,806,933,1074, 1232,1406 }; mfxU32 SetSearchPath( mfxVMEIMEIn & spath, mfxU32 frameType, mfxU32 meMethod) { mfxU32 maxNumSU = SEARCHPATHSIZE + 1; if (frameType & MFX_FRAMETYPE_P) { switch (meMethod) { case 2: MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &SingleSU[0], 32*sizeof(mfxU8)); maxNumSU = 1; break; case 3: MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &RasterScan_48x40[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &RasterScan_48x40[32], 24*sizeof(mfxU8)); break; case 4: MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &FullSpiral_48x40[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &FullSpiral_48x40[32], 24*sizeof(mfxU8)); break; case 5: MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &FullSpiral_48x40[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &FullSpiral_48x40[32], 24*sizeof(mfxU8)); maxNumSU = 16; break; case 6: default: MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &Diamond[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &Diamond[32], 24*sizeof(mfxU8)); break; } } else { if (meMethod == 6) { MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &Diamond[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &Diamond[32], 24*sizeof(mfxU8)); } else { MFX_INTERNAL_CPY(&spath.IMESearchPath0to31[0], &FullSpiral_48x40[0], 32*sizeof(mfxU8)); MFX_INTERNAL_CPY(&spath.IMESearchPath32to55[0], &FullSpiral_48x40[32], 24*sizeof(mfxU8)); } } return maxNumSU; } }; using namespace MfxHwH264EncodeHW; namespace MfxHwH264Encode { CmContext::CmContext( MfxVideoParam const & video, CmDevice * cmDevice, VideoCORE * core) : m_kernelHistFrame(nullptr) , m_kernelHistFields(nullptr) { Setup(video, cmDevice, core); } void CmContext::Setup( MfxVideoParam const & video, CmDevice * cmDevice, VideoCORE * core) { assert(cmDevice); assert(core); m_video = video; m_device = cmDevice; #ifdef MFX_ENABLE_KERNELS if (m_device->CreateQueueEx(m_queue, CM_VME_QUEUE_CREATE_OPTION) != CM_SUCCESS) throw CmRuntimeError(); mfxExtCodingOption2 const * extOpt2 = GetExtBuffer(m_video); if (!extOpt2) throw CmRuntimeError(); widthLa = video.calcParam.widthLa; heightLa = video.calcParam.heightLa; LaScaleFactor = LaDSenumToFactor(extOpt2->LookAheadDS); m_programHist = 0; switch (core->GetHWType()) { case MFX_HW_TGL_LP: case MFX_HW_DG1: case MFX_HW_RKL: case MFX_HW_ADL_S: case MFX_HW_ADL_P: case MFX_HW_ADL_N: m_program = ReadProgram(m_device, genx_simple_me_gen12lp, SizeOf(genx_simple_me_gen12lp)); m_programHist = ReadProgram(m_device, genx_histogram_gen12lp, SizeOf(genx_histogram_gen12lp)); break; default: throw CmRuntimeError(); } if (m_program) { m_kernelI = CreateKernel(m_device, m_program, "EncMB_I", (void *)EncMB_I); m_kernelP = CreateKernel(m_device, m_program, "EncMB_P", (void *)EncMB_P); m_kernelB = CreateKernel(m_device, m_program, "EncMB_B", (void *)EncMB_B); } if (m_programHist) { m_kernelHistFrame = CreateKernel(m_device, m_programHist, "HistogramSLMFrame", (void *)HistogramFrame); m_kernelHistFields = CreateKernel(m_device, m_programHist, "HistogramSLMFields", (void *)HistogramFields); } m_nullBuf.Reset(m_device, 4); SetCosts(m_costsI, MFX_FRAMETYPE_I, 26, 2, 3); SetCosts(m_costsP, MFX_FRAMETYPE_P, 26, 2, 3); SetCosts(m_costsB, MFX_FRAMETYPE_B, 26, 2, 3); SetLutMv(m_costsP, m_lutMvP); SetLutMv(m_costsB, m_lutMvB); #endif // #ifdef MFX_ENABLE_KERNELS } CmEvent * CmContext::RunHistogram( DdiTask const & task, mfxU16 Width, mfxU16 Height, mfxU16 OffsetX, mfxU16 OffsetY) { uint maxThreads = 0; const uint minBlocksPerThread = 1; uint maxH = (Width + OffsetX) / 32; uint maxV = (Height + OffsetY) / 8; uint offX = (OffsetX + 31) / 32; uint offY = (OffsetY + 7) / 8; uint numThreads = (maxH - offX) * (maxV - offY) / minBlocksPerThread; uint numGroups = 1; int result = CM_SUCCESS; CmKernel* kernel = task.m_fieldPicFlag ? m_kernelHistFields : m_kernelHistFrame; uint numThreadsPerGroup = 0; size_t CapSize = 4; uint tsW, tsH, gsW, gsH; m_device->GetCaps(CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP, CapSize, &numThreadsPerGroup); m_device->GetCaps(CAP_HW_THREAD_COUNT, CapSize, &maxThreads); numThreads = mfx::clamp(numThreads, 1u, maxThreads); numThreadsPerGroup = std::min(numThreads, numThreadsPerGroup); numGroups = (numThreads + numThreadsPerGroup - 1) / numThreadsPerGroup; numThreadsPerGroup = std::min(numThreads / numGroups, numThreadsPerGroup); for (tsH = numThreadsPerGroup, tsW = 1; tsH > tsW || tsW * tsH != numThreadsPerGroup; tsH = numThreadsPerGroup / ++tsW); for (gsH = numGroups, gsW = 1; gsH > gsW || gsW * gsH != numGroups; gsH = numGroups / ++gsW); if ((result = kernel->SetThreadCount(tsW * tsH * gsW * gsH)) != CM_SUCCESS) throw CmRuntimeError(); SetKernelArg(kernel, GetIndex(task.m_cmRawForHist), GetIndex(task.m_cmHist), maxH, maxV, offX, offY); CmTask * cmTask = 0; if ((result = m_device->CreateTask(cmTask)) != CM_SUCCESS) throw CmRuntimeError(); if ((result = cmTask->AddKernel(kernel)) != CM_SUCCESS) throw CmRuntimeError(); CmThreadGroupSpace * cmThreadSpace = 0; if ((result = m_device->CreateThreadGroupSpace(tsW, tsH, gsW, gsH, cmThreadSpace)) != CM_SUCCESS) throw CmRuntimeError(); CmEvent * e = 0; if ((result = m_queue->EnqueueWithGroup(cmTask, e, cmThreadSpace)) != CM_SUCCESS) throw CmRuntimeError(); m_device->DestroyThreadGroupSpace(cmThreadSpace); m_device->DestroyTask(cmTask); return e; } mfxStatus CmContext::QueryHistogram(CmEvent * e) { INT status = e->WaitForTaskFinished(); if (status == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else if(status != CM_SUCCESS) throw CmRuntimeError(); return MFX_ERR_NONE; } CmEvent * CmContext::EnqueueKernel( CmKernel * kernel, unsigned int tsWidth, unsigned int tsHeight, CM_DEPENDENCY_PATTERN tsPattern) { int result = CM_SUCCESS; if ((result = kernel->SetThreadCount(tsWidth * tsHeight)) != CM_SUCCESS) throw CmRuntimeError(); CmThreadSpace * cmThreadSpace = 0; if ((result = m_device->CreateThreadSpace(tsWidth, tsHeight, cmThreadSpace)) != CM_SUCCESS) throw CmRuntimeError(); cmThreadSpace->SelectThreadDependencyPattern(tsPattern); CmTask * cmTask = 0; if ((result = m_device->CreateTask(cmTask)) != CM_SUCCESS) throw CmRuntimeError(); if ((result = cmTask->AddKernel(kernel)) != CM_SUCCESS) throw CmRuntimeError(); CmEvent * e = 0; if ((result = m_queue->Enqueue(cmTask, e, cmThreadSpace)) != CM_SUCCESS) throw CmRuntimeError(); m_device->DestroyThreadSpace(cmThreadSpace); m_device->DestroyTask(cmTask); return e; } CmEvent * CmContext::RunVme( DdiTask const & task, mfxU32 qp) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "RunVme"); qp = 26; CmKernel * kernelPreMe = SelectKernelPreMe(task.m_type[task.m_fid[0]]); CURBEData curbeData; SetCurbeData(curbeData, task, qp); Write(task.m_cmCurbe, &curbeData); mfxU32 numMbColsLa = widthLa / 16; mfxU32 numMbRowsLa = heightLa / 16; if (LaScaleFactor > 1) { SetKernelArg(kernelPreMe, GetIndex(task.m_cmCurbe), GetIndex(task.m_cmRaw), GetIndex(task.m_cmRawLa), *task.m_cmRefsLa, GetIndex(task.m_cmMb), task.m_cmRefMb ? GetIndex(task.m_cmRefMb) : GetIndex(m_nullBuf)); } else { SetKernelArg(kernelPreMe, GetIndex(task.m_cmCurbe), GetIndex(m_nullBuf), GetIndex(task.m_cmRaw), *task.m_cmRefs, GetIndex(task.m_cmMb), task.m_cmRefMb ? GetIndex(task.m_cmRefMb) : GetIndex(m_nullBuf)); } CmEvent * e = 0; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Enqueue ME kernel"); e = EnqueueKernel(kernelPreMe, numMbColsLa, numMbRowsLa, CM_WAVEFRONT26); } return e; } mfxStatus CmContext::QueryVme( DdiTask const & task, CmEvent * e) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "QueryVme"); INT status = e->WaitForTaskFinished(); if (status == CM_EXCEED_MAX_TIMEOUT) return MFX_ERR_GPU_HANG; else if(status != CM_SUCCESS) throw CmRuntimeError(); LAOutObject * cmMb = (LAOutObject *)task.m_cmMbSys; VmeData * cur = task.m_vmeData; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Compensate costs"); mfxVMEUNIIn const & costs = SelectCosts(task.m_type[0]); for (size_t i = 0; i < cur->mb.size(); i++) { LAOutObject & mb = cmMb[i]; if (mb.IntraMbFlag) { mfxU16 bitCostLambda = mfxU16(Map44LutValueBack(costs.ModeCost[LUTMODE_INTRA_16x16])); assert(mb.intraCost >= bitCostLambda); mb.dist = mb.intraCost - bitCostLambda; } else { if (mb.MbType5Bits != MBTYPE_BP_L0_16x16 && mb.MbType5Bits != MBTYPE_B_L1_16x16 && mb.MbType5Bits != MBTYPE_B_Bi_16x16) { // fprintf(stdout,"MbType5Bits: %x\n", mb.MbType5Bits );fflush(stdout); assert(0); } mfxU32 modeCostLambda = Map44LutValueBack(costs.ModeCost[LUTMODE_INTER_16x16]); mfxU32 mvCostLambda = (task.m_type[0] & MFX_FRAMETYPE_P) ? GetVmeMvCostP(m_lutMvP, mb) : GetVmeMvCostB(m_lutMvB, mb); mfxU16 bitCostLambda = mfxU16(std::min(mb.interCost, modeCostLambda + mvCostLambda)); mb.dist = mb.interCost - bitCostLambda; } } } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Convert mb data"); mfxExtPpsHeader const & extPps = GetExtBufferRef(m_video); cur->intraCost = 0; cur->interCost = 0; for (size_t i = 0; i < cur->mb.size(); i++) { cur->mb[i].intraCost = cmMb[i].intraCost; cur->mb[i].interCost = std::min(cmMb[i].intraCost, cmMb[i].interCost); cur->mb[i].intraMbFlag = cmMb[i].IntraMbFlag; cur->mb[i].skipMbFlag = cmMb[i].SkipMbFlag; cur->mb[i].mbType = cmMb[i].MbType5Bits; cur->mb[i].subMbShape = cmMb[i].SubMbShape; cur->mb[i].subMbPredMode = cmMb[i].SubMbPredMode; cur->mb[i].w1 = mfxU8(extPps.weightedBipredIdc == 2 ? CalcBiWeight(task, 0, 0) : 32); cur->mb[i].w0 = mfxU8(64 - cur->mb[i].w1); cur->mb[i].costCenter0.x = cmMb[i].costCenter0X; cur->mb[i].costCenter0.y = cmMb[i].costCenter0Y; cur->mb[i].costCenter1.x = cmMb[i].costCenter1X; cur->mb[i].costCenter1.y = cmMb[i].costCenter1Y; cur->mb[i].dist = cmMb[i].dist; cur->mb[i].propCost = 0; Copy(cur->mb[i].lumaCoeffSum, cmMb[i].lumaCoeffSum); Copy(cur->mb[i].lumaCoeffCnt, cmMb[i].lumaCoeffCnt); Copy(cur->mb[i].mv, cmMb[i].mv); cur->intraCost += cur->mb[i].intraCost; cur->interCost += cur->mb[i].interCost; } } return MFX_ERR_NONE; } CmKernel * CmContext::SelectKernelPreMe(mfxU32 frameType) { switch (frameType & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: return m_kernelI; case MFX_FRAMETYPE_P: return m_kernelP; case MFX_FRAMETYPE_B: return m_kernelB; default: throw CmRuntimeError(); } } mfxVMEUNIIn & CmContext::SelectCosts(mfxU32 frameType) { switch (frameType & MFX_FRAMETYPE_IPB) { case MFX_FRAMETYPE_I: return m_costsI; case MFX_FRAMETYPE_P: return m_costsP; case MFX_FRAMETYPE_B: return m_costsB; default: throw CmRuntimeError(); } } void CmContext::SetCurbeData( CURBEData & curbeData, DdiTask const & task, mfxU32 qp) { mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(m_video); mfxExtCodingOption2 const & extOpt2 = GetExtBufferRef(m_video); //mfxExtCodingOption const * extOpt = GetExtBuffer(m_video); mfxU32 interSad = 2; // 0-sad,2-haar mfxU32 intraSad = 2; // 0-sad,2-haar mfxU32 ftqBasedSkip = 3; //3; mfxU32 blockBasedSkip = 1; mfxU32 qpIdx = (qp + 1) >> 1; mfxU32 transformFlag = 0;//(extOpt->IntraPredBlockSize > 1); mfxU32 meMethod = 6; int ffid = task.m_fid[0]; mfxU32 skipVal = (task.m_type[ffid] & MFX_FRAMETYPE_P) ? (Dist10[qpIdx]) : (Dist25[qpIdx]); /* Unreachable code is commented out if (!blockBasedSkip) skipVal *= 3; else*/ if (!transformFlag) skipVal /= 2; mfxVMEUNIIn costs = {}; SetCosts(costs, task.m_type[0], qp, intraSad, ftqBasedSkip); mfxVMEIMEIn spath; SetSearchPath(spath, task.m_type[0], meMethod); //init CURBE data based on Image State and Slice State. this CURBE data will be //written to the surface and sent to all kernels. Zero(curbeData); //DW0 //curbeData.SkipModeEn = !(task.m_type[0] & MFX_FRAMETYPE_I); curbeData.SkipModeEn = !(task.m_type[1] & MFX_FRAMETYPE_I); curbeData.AdaptiveEn = 1; curbeData.BiMixDis = 0; curbeData.EarlyImeSuccessEn = 0; curbeData.T8x8FlagForInterEn = 1; curbeData.EarlyImeStop = 0; //DW1 curbeData.MaxNumMVs = (GetMaxMvsPer2Mb(m_video.mfx.CodecLevel) >> 1) & 0x3F; curbeData.BiWeight = ((task.m_type[ffid] & MFX_FRAMETYPE_B) && extDdi.WeightedBiPredIdc == 2) ? CalcBiWeight(task, 0, 0) : 32; curbeData.UniMixDisable = 0; //DW2 curbeData.MaxNumSU = 57; curbeData.LenSP = 16; //DW3 curbeData.SrcSize = 0; curbeData.MbTypeRemap = 0; curbeData.SrcAccess = 0; curbeData.RefAccess = 0; curbeData.SearchCtrl = (task.m_type[ffid] & MFX_FRAMETYPE_B) ? 7 : 0; curbeData.DualSearchPathOption = 0; curbeData.SubPelMode = 3; // all modes curbeData.SkipType = 0;//!!(task.m_type[0] & MFX_FRAMETYPE_B); //for B 0-16x16, 1-8x8 curbeData.DisableFieldCacheAllocation = 0; curbeData.InterChromaMode = 0; //curbeData.FTQSkipEnable = !(task.m_type[0] & MFX_FRAMETYPE_I); curbeData.FTQSkipEnable = !(task.m_type[1] & MFX_FRAMETYPE_I); //curbeData.BMEDisableFBR = !!(task.m_type[0] & MFX_FRAMETYPE_P); curbeData.BMEDisableFBR = !!(task.m_type[1] & MFX_FRAMETYPE_P); curbeData.BlockBasedSkipEnabled = blockBasedSkip; curbeData.InterSAD = interSad; curbeData.IntraSAD = intraSad; curbeData.SubMbPartMask = (task.m_type[ffid] & MFX_FRAMETYPE_I) ? 0 : 0x7e; // only 16x16 for Inter //DW4 /* curbeData.SliceMacroblockHeightMinusOne = m_video.mfx.FrameInfo.Height / 16 - 1; curbeData.PictureHeightMinusOne = m_video.mfx.FrameInfo.Height / 16 - 1; curbeData.PictureWidthMinusOne = m_video.mfx.FrameInfo.Width / 16 - 1; */ curbeData.SliceMacroblockHeightMinusOne = widthLa / 16 - 1; curbeData.PictureHeightMinusOne = heightLa / 16 - 1; curbeData.PictureWidthMinusOne = widthLa / 16 - 1; //DW5 curbeData.RefWidth = (task.m_type[ffid] & MFX_FRAMETYPE_B) ? 32 : 48; curbeData.RefHeight = (task.m_type[ffid] & MFX_FRAMETYPE_B) ? 32 : 40; //DW6 curbeData.BatchBufferEndCommand = BATCHBUFFER_END; //DW7 curbeData.IntraPartMask = 2|4; //no4x4 and no8x8 //transformFlag ? 0 : 2/*no8x8*/; curbeData.NonSkipZMvAdded = !!(task.m_type[ffid] & MFX_FRAMETYPE_P); curbeData.NonSkipModeAdded = !!(task.m_type[ffid] & MFX_FRAMETYPE_P); curbeData.IntraCornerSwap = 0; curbeData.MVCostScaleFactor = 0; curbeData.BilinearEnable = 0; curbeData.SrcFieldPolarity = 0; curbeData.WeightedSADHAAR = 0; curbeData.AConlyHAAR = 0; curbeData.RefIDCostMode = !(task.m_type[ffid] & MFX_FRAMETYPE_I); curbeData.SkipCenterMask = !!(task.m_type[ffid] & MFX_FRAMETYPE_P); //DW8 curbeData.ModeCost_0 = costs.ModeCost[LUTMODE_INTRA_NONPRED]; curbeData.ModeCost_1 = costs.ModeCost[LUTMODE_INTRA_16x16]; curbeData.ModeCost_2 = costs.ModeCost[LUTMODE_INTRA_8x8]; curbeData.ModeCost_3 = costs.ModeCost[LUTMODE_INTRA_4x4]; //DW9 curbeData.ModeCost_4 = costs.ModeCost[LUTMODE_INTER_16x8]; curbeData.ModeCost_5 = costs.ModeCost[LUTMODE_INTER_8x8q]; curbeData.ModeCost_6 = costs.ModeCost[LUTMODE_INTER_8x4q]; curbeData.ModeCost_7 = costs.ModeCost[LUTMODE_INTER_4x4q]; //DW10 curbeData.ModeCost_8 = costs.ModeCost[LUTMODE_INTER_16x16]; curbeData.ModeCost_9 = costs.ModeCost[LUTMODE_INTER_BWD]; curbeData.RefIDCost = costs.ModeCost[LUTMODE_REF_ID]; curbeData.ChromaIntraModeCost = costs.ModeCost[LUTMODE_INTRA_CHROMA]; //DW11 curbeData.MvCost_0 = costs.MvCost[0]; curbeData.MvCost_1 = costs.MvCost[1]; curbeData.MvCost_2 = costs.MvCost[2]; curbeData.MvCost_3 = costs.MvCost[3]; //DW12 curbeData.MvCost_4 = costs.MvCost[4]; curbeData.MvCost_5 = costs.MvCost[5]; curbeData.MvCost_6 = costs.MvCost[6]; curbeData.MvCost_7 = costs.MvCost[7]; //DW13 curbeData.QpPrimeY = qp; curbeData.QpPrimeCb = qp; curbeData.QpPrimeCr = qp; curbeData.TargetSizeInWord = 0xff; //DW14 curbeData.FTXCoeffThresh_DC = costs.FTXCoeffThresh_DC; curbeData.FTXCoeffThresh_1 = costs.FTXCoeffThresh[0]; curbeData.FTXCoeffThresh_2 = costs.FTXCoeffThresh[1]; //DW15 curbeData.FTXCoeffThresh_3 = costs.FTXCoeffThresh[2]; curbeData.FTXCoeffThresh_4 = costs.FTXCoeffThresh[3]; curbeData.FTXCoeffThresh_5 = costs.FTXCoeffThresh[4]; curbeData.FTXCoeffThresh_6 = costs.FTXCoeffThresh[5]; //DW16 curbeData.IMESearchPath0 = spath.IMESearchPath0to31[0]; curbeData.IMESearchPath1 = spath.IMESearchPath0to31[1]; curbeData.IMESearchPath2 = spath.IMESearchPath0to31[2]; curbeData.IMESearchPath3 = spath.IMESearchPath0to31[3]; //DW17 curbeData.IMESearchPath4 = spath.IMESearchPath0to31[4]; curbeData.IMESearchPath5 = spath.IMESearchPath0to31[5]; curbeData.IMESearchPath6 = spath.IMESearchPath0to31[6]; curbeData.IMESearchPath7 = spath.IMESearchPath0to31[7]; //DW18 curbeData.IMESearchPath8 = spath.IMESearchPath0to31[8]; curbeData.IMESearchPath9 = spath.IMESearchPath0to31[9]; curbeData.IMESearchPath10 = spath.IMESearchPath0to31[10]; curbeData.IMESearchPath11 = spath.IMESearchPath0to31[11]; //DW19 curbeData.IMESearchPath12 = spath.IMESearchPath0to31[12]; curbeData.IMESearchPath13 = spath.IMESearchPath0to31[13]; curbeData.IMESearchPath14 = spath.IMESearchPath0to31[14]; curbeData.IMESearchPath15 = spath.IMESearchPath0to31[15]; //DW20 curbeData.IMESearchPath16 = spath.IMESearchPath0to31[16]; curbeData.IMESearchPath17 = spath.IMESearchPath0to31[17]; curbeData.IMESearchPath18 = spath.IMESearchPath0to31[18]; curbeData.IMESearchPath19 = spath.IMESearchPath0to31[19]; //DW21 curbeData.IMESearchPath20 = spath.IMESearchPath0to31[20]; curbeData.IMESearchPath21 = spath.IMESearchPath0to31[21]; curbeData.IMESearchPath22 = spath.IMESearchPath0to31[22]; curbeData.IMESearchPath23 = spath.IMESearchPath0to31[23]; //DW22 curbeData.IMESearchPath24 = spath.IMESearchPath0to31[24]; curbeData.IMESearchPath25 = spath.IMESearchPath0to31[25]; curbeData.IMESearchPath26 = spath.IMESearchPath0to31[26]; curbeData.IMESearchPath27 = spath.IMESearchPath0to31[27]; //DW23 curbeData.IMESearchPath28 = spath.IMESearchPath0to31[28]; curbeData.IMESearchPath29 = spath.IMESearchPath0to31[29]; curbeData.IMESearchPath30 = spath.IMESearchPath0to31[30]; curbeData.IMESearchPath31 = spath.IMESearchPath0to31[31]; //DW24 curbeData.IMESearchPath32 = spath.IMESearchPath32to55[0]; curbeData.IMESearchPath33 = spath.IMESearchPath32to55[1]; curbeData.IMESearchPath34 = spath.IMESearchPath32to55[2]; curbeData.IMESearchPath35 = spath.IMESearchPath32to55[3]; //DW25 curbeData.IMESearchPath36 = spath.IMESearchPath32to55[4]; curbeData.IMESearchPath37 = spath.IMESearchPath32to55[5]; curbeData.IMESearchPath38 = spath.IMESearchPath32to55[6]; curbeData.IMESearchPath39 = spath.IMESearchPath32to55[7]; //DW26 curbeData.IMESearchPath40 = spath.IMESearchPath32to55[8]; curbeData.IMESearchPath41 = spath.IMESearchPath32to55[9]; curbeData.IMESearchPath42 = spath.IMESearchPath32to55[10]; curbeData.IMESearchPath43 = spath.IMESearchPath32to55[11]; //DW27 curbeData.IMESearchPath44 = spath.IMESearchPath32to55[12]; curbeData.IMESearchPath45 = spath.IMESearchPath32to55[13]; curbeData.IMESearchPath46 = spath.IMESearchPath32to55[14]; curbeData.IMESearchPath47 = spath.IMESearchPath32to55[15]; //DW28 curbeData.IMESearchPath48 = spath.IMESearchPath32to55[16]; curbeData.IMESearchPath49 = spath.IMESearchPath32to55[17]; curbeData.IMESearchPath50 = spath.IMESearchPath32to55[18]; curbeData.IMESearchPath51 = spath.IMESearchPath32to55[19]; //DW29 curbeData.IMESearchPath52 = spath.IMESearchPath32to55[20]; curbeData.IMESearchPath53 = spath.IMESearchPath32to55[21]; curbeData.IMESearchPath54 = spath.IMESearchPath32to55[22]; curbeData.IMESearchPath55 = spath.IMESearchPath32to55[23]; //DW30 curbeData.Intra4x4ModeMask = 0; curbeData.Intra8x8ModeMask = 0; //DW31 curbeData.Intra16x16ModeMask = 0; curbeData.IntraChromaModeMask = 1; // 0; 1 means Luma only curbeData.IntraComputeType = 0; //DW32 curbeData.SkipVal = skipVal; curbeData.MultipredictorL0EnableBit = 0xEF; curbeData.MultipredictorL1EnableBit = 0xEF; //DW33 curbeData.IntraNonDCPenalty16x16 = 36; curbeData.IntraNonDCPenalty8x8 = 12; curbeData.IntraNonDCPenalty4x4 = 4; //DW34 curbeData.MaxVmvR = GetMaxMvLenY(m_video.mfx.CodecLevel) * 4; //DW35 curbeData.PanicModeMBThreshold = 0xFF; curbeData.SmallMbSizeInWord = 0xFF; curbeData.LargeMbSizeInWord = 0xFF; //DW36 curbeData.HMECombineOverlap = 1; // 0; curbeData.HMERefWindowsCombiningThreshold = (task.m_type[ffid] & MFX_FRAMETYPE_B) ? 8 : 16; // 0; (should be =8 for B frames) curbeData.CheckAllFractionalEnable = 0; //DW37 curbeData.CurLayerDQId = LaDSenumToFactor(extOpt2.LookAheadDS); // 0; use 8 bit as LaScaleFactor curbeData.TemporalId = 0; curbeData.NoInterLayerPredictionFlag = 1; curbeData.AdaptivePredictionFlag = 0; curbeData.DefaultBaseModeFlag = 0; curbeData.AdaptiveResidualPredictionFlag = 0; curbeData.DefaultResidualPredictionFlag = 0; curbeData.AdaptiveMotionPredictionFlag = 0; curbeData.DefaultMotionPredictionFlag = 0; curbeData.TcoeffLevelPredictionFlag = 0; curbeData.UseHMEPredictor = 0; //!!IsOn(extDdi.Hme); curbeData.SpatialResChangeFlag = 0; curbeData.isFwdFrameShortTermRef = task.m_list0[ffid].Size() > 0 && !task.m_dpb[ffid][task.m_list0[ffid][0] & 127].m_longterm; //DW38 curbeData.ScaledRefLayerLeftOffset = 0; curbeData.ScaledRefLayerRightOffset = 0; //DW39 curbeData.ScaledRefLayerTopOffset = 0; curbeData.ScaledRefLayerBottomOffset = 0; } void CmContext::SetCurbeData( CURBEData & curbeData, mfxU16 frameType, mfxU32 qp, mfxI32 width, mfxI32 height, mfxU32 biWeight) { mfxExtCodingOptionDDI const & extDdi = GetExtBufferRef(m_video); //mfxExtCodingOption const * extOpt = GetExtBuffer(m_video); mfxU32 interSad = 2; // 0-sad,2-haar mfxU32 intraSad = 2; // 0-sad,2-haar mfxU32 ftqBasedSkip = 3; //3; mfxU32 blockBasedSkip = 1; mfxU32 qpIdx = (qp + 1) >> 1; mfxU32 transformFlag = 0;//(extOpt->IntraPredBlockSize > 1); mfxU32 meMethod = 6; mfxU32 skipVal = (frameType & MFX_FRAMETYPE_P) ? (Dist10[qpIdx]) : (Dist25[qpIdx]); /* Unreachable code is commented out if (!blockBasedSkip) skipVal *= 3; else*/ if (!transformFlag) skipVal /= 2; mfxVMEUNIIn costs = {}; SetCosts(costs, frameType, qp, intraSad, ftqBasedSkip); mfxVMEIMEIn spath; SetSearchPath(spath, frameType, meMethod); //init CURBE data based on Image State and Slice State. this CURBE data will be //written to the surface and sent to all kernels. Zero(curbeData); //DW0 curbeData.SkipModeEn = !(frameType & MFX_FRAMETYPE_I); curbeData.AdaptiveEn = 1; curbeData.BiMixDis = 0; curbeData.EarlyImeSuccessEn = 0; curbeData.T8x8FlagForInterEn = 1; curbeData.EarlyImeStop = 0; //DW1 curbeData.MaxNumMVs = (GetMaxMvsPer2Mb(m_video.mfx.CodecLevel) >> 1) & 0x3F; curbeData.BiWeight = ((frameType & MFX_FRAMETYPE_B) && extDdi.WeightedBiPredIdc == 2) ? biWeight : 32; curbeData.UniMixDisable = 0; //DW2 curbeData.MaxNumSU = 57; curbeData.LenSP = 16; //DW3 curbeData.SrcSize = 0; curbeData.MbTypeRemap = 0; curbeData.SrcAccess = 0; curbeData.RefAccess = 0; curbeData.SearchCtrl = (frameType & MFX_FRAMETYPE_B) ? 7 : 0; curbeData.DualSearchPathOption = 0; curbeData.SubPelMode = 3; // all modes curbeData.SkipType = !!(frameType & MFX_FRAMETYPE_B); //for B 0-16x16, 1-8x8 curbeData.DisableFieldCacheAllocation = 0; curbeData.InterChromaMode = 0; curbeData.FTQSkipEnable = !(frameType & MFX_FRAMETYPE_I); curbeData.BMEDisableFBR = !!(frameType & MFX_FRAMETYPE_P); curbeData.BlockBasedSkipEnabled = blockBasedSkip; curbeData.InterSAD = interSad; curbeData.IntraSAD = intraSad; curbeData.SubMbPartMask = (frameType & MFX_FRAMETYPE_I) ? 0 : 0x7e; // only 16x16 for Inter //DW4 curbeData.SliceMacroblockHeightMinusOne = height / 16 - 1; curbeData.PictureHeightMinusOne = height / 16 - 1; curbeData.PictureWidthMinusOne = width / 16 - 1; //DW5 curbeData.RefWidth = (frameType & MFX_FRAMETYPE_B) ? 32 : 48; curbeData.RefHeight = (frameType & MFX_FRAMETYPE_B) ? 32 : 40; //DW6 curbeData.BatchBufferEndCommand = BATCHBUFFER_END; //DW7 curbeData.IntraPartMask = 2|4; //no4x4 and no8x8 //transformFlag ? 0 : 2/*no8x8*/; curbeData.NonSkipZMvAdded = !!(frameType & MFX_FRAMETYPE_P); curbeData.NonSkipModeAdded = !!(frameType & MFX_FRAMETYPE_P); curbeData.IntraCornerSwap = 0; curbeData.MVCostScaleFactor = 0; curbeData.BilinearEnable = 0; curbeData.SrcFieldPolarity = 0; curbeData.WeightedSADHAAR = 0; curbeData.AConlyHAAR = 0; curbeData.RefIDCostMode = !(frameType & MFX_FRAMETYPE_I); curbeData.SkipCenterMask = !!(frameType & MFX_FRAMETYPE_P); //DW8 curbeData.ModeCost_0 = costs.ModeCost[LUTMODE_INTRA_NONPRED]; curbeData.ModeCost_1 = costs.ModeCost[LUTMODE_INTRA_16x16]; curbeData.ModeCost_2 = costs.ModeCost[LUTMODE_INTRA_8x8]; curbeData.ModeCost_3 = costs.ModeCost[LUTMODE_INTRA_4x4]; //DW9 curbeData.ModeCost_4 = costs.ModeCost[LUTMODE_INTER_16x8]; curbeData.ModeCost_5 = costs.ModeCost[LUTMODE_INTER_8x8q]; curbeData.ModeCost_6 = costs.ModeCost[LUTMODE_INTER_8x4q]; curbeData.ModeCost_7 = costs.ModeCost[LUTMODE_INTER_4x4q]; //DW10 curbeData.ModeCost_8 = costs.ModeCost[LUTMODE_INTER_16x16]; curbeData.ModeCost_9 = costs.ModeCost[LUTMODE_INTER_BWD]; curbeData.RefIDCost = costs.ModeCost[LUTMODE_REF_ID]; curbeData.ChromaIntraModeCost = costs.ModeCost[LUTMODE_INTRA_CHROMA]; //DW11 curbeData.MvCost_0 = costs.MvCost[0]; curbeData.MvCost_1 = costs.MvCost[1]; curbeData.MvCost_2 = costs.MvCost[2]; curbeData.MvCost_3 = costs.MvCost[3]; //DW12 curbeData.MvCost_4 = costs.MvCost[4]; curbeData.MvCost_5 = costs.MvCost[5]; curbeData.MvCost_6 = costs.MvCost[6]; curbeData.MvCost_7 = costs.MvCost[7]; //DW13 curbeData.QpPrimeY = qp; curbeData.QpPrimeCb = qp; curbeData.QpPrimeCr = qp; curbeData.TargetSizeInWord = 0xff; //DW14 curbeData.FTXCoeffThresh_DC = costs.FTXCoeffThresh_DC; curbeData.FTXCoeffThresh_1 = costs.FTXCoeffThresh[0]; curbeData.FTXCoeffThresh_2 = costs.FTXCoeffThresh[1]; //DW15 curbeData.FTXCoeffThresh_3 = costs.FTXCoeffThresh[2]; curbeData.FTXCoeffThresh_4 = costs.FTXCoeffThresh[3]; curbeData.FTXCoeffThresh_5 = costs.FTXCoeffThresh[4]; curbeData.FTXCoeffThresh_6 = costs.FTXCoeffThresh[5]; //DW16 curbeData.IMESearchPath0 = spath.IMESearchPath0to31[0]; curbeData.IMESearchPath1 = spath.IMESearchPath0to31[1]; curbeData.IMESearchPath2 = spath.IMESearchPath0to31[2]; curbeData.IMESearchPath3 = spath.IMESearchPath0to31[3]; //DW17 curbeData.IMESearchPath4 = spath.IMESearchPath0to31[4]; curbeData.IMESearchPath5 = spath.IMESearchPath0to31[5]; curbeData.IMESearchPath6 = spath.IMESearchPath0to31[6]; curbeData.IMESearchPath7 = spath.IMESearchPath0to31[7]; //DW18 curbeData.IMESearchPath8 = spath.IMESearchPath0to31[8]; curbeData.IMESearchPath9 = spath.IMESearchPath0to31[9]; curbeData.IMESearchPath10 = spath.IMESearchPath0to31[10]; curbeData.IMESearchPath11 = spath.IMESearchPath0to31[11]; //DW19 curbeData.IMESearchPath12 = spath.IMESearchPath0to31[12]; curbeData.IMESearchPath13 = spath.IMESearchPath0to31[13]; curbeData.IMESearchPath14 = spath.IMESearchPath0to31[14]; curbeData.IMESearchPath15 = spath.IMESearchPath0to31[15]; //DW20 curbeData.IMESearchPath16 = spath.IMESearchPath0to31[16]; curbeData.IMESearchPath17 = spath.IMESearchPath0to31[17]; curbeData.IMESearchPath18 = spath.IMESearchPath0to31[18]; curbeData.IMESearchPath19 = spath.IMESearchPath0to31[19]; //DW21 curbeData.IMESearchPath20 = spath.IMESearchPath0to31[20]; curbeData.IMESearchPath21 = spath.IMESearchPath0to31[21]; curbeData.IMESearchPath22 = spath.IMESearchPath0to31[22]; curbeData.IMESearchPath23 = spath.IMESearchPath0to31[23]; //DW22 curbeData.IMESearchPath24 = spath.IMESearchPath0to31[24]; curbeData.IMESearchPath25 = spath.IMESearchPath0to31[25]; curbeData.IMESearchPath26 = spath.IMESearchPath0to31[26]; curbeData.IMESearchPath27 = spath.IMESearchPath0to31[27]; //DW23 curbeData.IMESearchPath28 = spath.IMESearchPath0to31[28]; curbeData.IMESearchPath29 = spath.IMESearchPath0to31[29]; curbeData.IMESearchPath30 = spath.IMESearchPath0to31[30]; curbeData.IMESearchPath31 = spath.IMESearchPath0to31[31]; //DW24 curbeData.IMESearchPath32 = spath.IMESearchPath32to55[0]; curbeData.IMESearchPath33 = spath.IMESearchPath32to55[1]; curbeData.IMESearchPath34 = spath.IMESearchPath32to55[2]; curbeData.IMESearchPath35 = spath.IMESearchPath32to55[3]; //DW25 curbeData.IMESearchPath36 = spath.IMESearchPath32to55[4]; curbeData.IMESearchPath37 = spath.IMESearchPath32to55[5]; curbeData.IMESearchPath38 = spath.IMESearchPath32to55[6]; curbeData.IMESearchPath39 = spath.IMESearchPath32to55[7]; //DW26 curbeData.IMESearchPath40 = spath.IMESearchPath32to55[8]; curbeData.IMESearchPath41 = spath.IMESearchPath32to55[9]; curbeData.IMESearchPath42 = spath.IMESearchPath32to55[10]; curbeData.IMESearchPath43 = spath.IMESearchPath32to55[11]; //DW27 curbeData.IMESearchPath44 = spath.IMESearchPath32to55[12]; curbeData.IMESearchPath45 = spath.IMESearchPath32to55[13]; curbeData.IMESearchPath46 = spath.IMESearchPath32to55[14]; curbeData.IMESearchPath47 = spath.IMESearchPath32to55[15]; //DW28 curbeData.IMESearchPath48 = spath.IMESearchPath32to55[16]; curbeData.IMESearchPath49 = spath.IMESearchPath32to55[17]; curbeData.IMESearchPath50 = spath.IMESearchPath32to55[18]; curbeData.IMESearchPath51 = spath.IMESearchPath32to55[19]; //DW29 curbeData.IMESearchPath52 = spath.IMESearchPath32to55[20]; curbeData.IMESearchPath53 = spath.IMESearchPath32to55[21]; curbeData.IMESearchPath54 = spath.IMESearchPath32to55[22]; curbeData.IMESearchPath55 = spath.IMESearchPath32to55[23]; //DW30 curbeData.Intra4x4ModeMask = 0; curbeData.Intra8x8ModeMask = 0; //DW31 curbeData.Intra16x16ModeMask = 0; curbeData.IntraChromaModeMask = 0; curbeData.IntraComputeType = 0; //DW32 curbeData.SkipVal = skipVal; curbeData.MultipredictorL0EnableBit = 0xEF; curbeData.MultipredictorL1EnableBit = 0xEF; //DW33 curbeData.IntraNonDCPenalty16x16 = 36; curbeData.IntraNonDCPenalty8x8 = 12; curbeData.IntraNonDCPenalty4x4 = 4; //DW34 curbeData.MaxVmvR = GetMaxMvLenY(m_video.mfx.CodecLevel) * 4; //DW35 curbeData.PanicModeMBThreshold = 0xFF; curbeData.SmallMbSizeInWord = 0xFF; curbeData.LargeMbSizeInWord = 0xFF; //DW36 curbeData.HMECombineOverlap = 1; curbeData.HMERefWindowsCombiningThreshold = (frameType & MFX_FRAMETYPE_B) ? 8 : 16;; curbeData.CheckAllFractionalEnable = 0; //DW37 curbeData.CurLayerDQId = 1; curbeData.TemporalId = 0; curbeData.NoInterLayerPredictionFlag = 1; curbeData.AdaptivePredictionFlag = 0; curbeData.DefaultBaseModeFlag = 0; curbeData.AdaptiveResidualPredictionFlag = 0; curbeData.DefaultResidualPredictionFlag = 0; curbeData.AdaptiveMotionPredictionFlag = 0; curbeData.DefaultMotionPredictionFlag = 0; curbeData.TcoeffLevelPredictionFlag = 0; curbeData.UseHMEPredictor = 1; curbeData.SpatialResChangeFlag = 0; curbeData.isFwdFrameShortTermRef = 1;//task.m_list0[0].Size() > 0 && !task.m_dpb[0][task.m_list0[0][0] & 127].m_longterm; //DW38 curbeData.ScaledRefLayerLeftOffset = 0; curbeData.ScaledRefLayerRightOffset = 0; //DW39 curbeData.ScaledRefLayerTopOffset = 0; curbeData.ScaledRefLayerBottomOffset = 0; } } #endif // MFX_ENABLE_H264_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/000077500000000000000000000000001443134507600255615ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/mctf/000077500000000000000000000000001443134507600265125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/mctf/include/000077500000000000000000000000001443134507600301355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/mctf/include/mctf_common.h000066400000000000000000000550221443134507600326130ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include "mfx_common.h" #include "asc_cm.h" // all internal logic is based on these constants // if they are not defined, the logic of all checks, // switches & branches gets too complicated (as modes are // exist in MCTF and it is needed to somehow introduce them. enum { MCTF_TEMPORAL_MODE_UNKNOWN = 0, MCTF_TEMPORAL_MODE_SPATIAL = 1, MCTF_TEMPORAL_MODE_1REF = 2, MCTF_TEMPORAL_MODE_2REF = 3, MCTF_TEMPORAL_MODE_4REF = 4 }; // this is an internal structure to represent MCTF controls; // is not exposed outside; typedef struct { mfxU16 Overlap; mfxU16 Deblocking; mfxU16 TemporalMode; mfxU16 subPelPrecision; mfxU16 FilterStrength; // [0...20] mfxU32 BitsPerPixelx100k; mfxU16 reserved[6]; } IntMctfParams; // multiplier to translate float bpp -->fixed-integer enum { MCTF_BITRATE_MULTIPLIER = 100000 }; // this macro enables updates of runtime params at each frame #undef MCTF_UPDATE_RTPARAMS_ON_EACH_FRAME // MCTF models adopts for x264 or h265 following by MCTF //#define MCTF_MODEL_FOR_x264_OR_x265 // MCTF models adopts for MSDK following by MCTF //#define MCTF_MODEL_FOR_MSDK //#define MFX_MCTF_DEBUG_PRINT #include #include "cmrt_cross_platform.h" #include "libmfx_core_interface.h" #include "asc.h" #include #define CHROMABASE 80 #define MAXCHROMA 100 #define MCTFSTRENGTH 3 #define MCTFNOFILTER 0 #define MCTFADAPTIVE 21 #define MCTFADAPTIVEVAL 1050 #define MCTF_CHROMAOFF 0 typedef struct { mfxU16 x, y; } mfxU16Pair; typedef struct { mfxU8 scn1, scn2, scn3, scn4; } mfxU8quad; #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define ABS(a) (((a) < 0) ? (-(a)) : (a)) #define MCTF_CHECK_CM_ERR(STS, ERR) if ((STS) != CM_SUCCESS) { ASC_PRINTF("FAILED at file: %s, line: %d, cmerr: %d\n", __FILE__, __LINE__, STS); return ERR; } #define CHECK_ERR(ERR) if ((ERR) != PASSED) { ASC_PRINTF("FAILED at file: %s, line: %d\n", __FILE__, __LINE__); return (ERR); } #define DIVUP(a, b) ((a+b-1)/b) #define ROUNDUP(a, b) DIVUP(a,b)*b #define BORDER 4 #define SUBMREDIM 4 #define WIDTHB (WIDTH + BORDER*2) #define HEIGHTB (HEIGHT + BORDER*2) #define CROP_BLOCK_ALIGNMENT 16 #define VMEBLSIZE 16 #define TEST_MAIN 1 #define MINHEIGHT 120 //it determines which picture size will use 8x8 or 16x16 blocks, smaller than this 8x8, bigger 16x16. enum { PASSED, FAILED }; enum { AMCTF_NOT_READY, AMCTF_READY }; typedef enum AMCTF_OP_MODE { SEPARATE_REG_OP, OVERLAP_REG_OP, SEPARATE_ADA_OP, OVERLAP_ADA_OP }AMCTF_OMODE; typedef enum _OFFSET_OV_MODE { NO_OVERLAP_OFFSET = 0, OVERLAP_OFFSET = 2 }OFFSET_OV_MODE; typedef enum _DENOISER_RUN_TYPE { DEN_CLOSE_RUN, DEN_FAR_RUN }DRT; typedef enum _NUMBER_OF_REFERENCES { NO_REFERENCES, ONE_REFERENCE, TWO_REFERENCES, THREE_REFERENCES, FOUR_REFERENCES }NUOR; enum class MCTF_MODE { MCTF_MANUAL_MODE, // MCTF operates based on filter-strength passed by application MCTF_AUTO_MODE, // MCTF automatically ajusts filter-strength and uses noise-estimations MCTF_NOT_INITIALIZED_MODE }; enum class MCTF_CONFIGURATION { MCTF_MAN_NCA_NBA, // Manual, not Content-adaptive, not bitrate-adaptive MCTF_AUT_CA_NBA, // Auto (noise-estimator is used), content-adaptive, not bitrate-adaptive MCTF_AUT_NCA_NBA, // Auto (noise-estimator is used), not Content - adaptive, not bitrate - adaptive MCTF_AUT_CA_BA, // Auto (noise-estimator is used), Content - adaptive, bitrate - adaptive MCTF_NOT_CONFIGURED // not configured yet }; typedef enum _SUBPELPRECISION { INTEGER_PEL, QUARTER_PEL }SPP; struct VmeSearchPath // sizeof=58 { mfxU8 sp[56]; mfxU8 maxNumSu; mfxU8 lenSp; }; struct spatialNoiseAnalysis { mfxF32 var; mfxF32 SCpp; }; struct MeControlSmall // sizeof=96 { VmeSearchPath searchPath; mfxU8 reserved[2]; mfxU16 width; mfxU16 height; mfxU16 th; mfxU16 mre_width; mfxU16 mre_height; mfxU16 sTh; mfxU16 subPrecision; mfxU16 CropX; mfxU16 CropY; mfxU16 CropW; mfxU16 CropH; mfxU8 reserved2[14]; }; static_assert(sizeof(MeControlSmall) == 96,"size of MeControlSmall != 96"); struct frameData { std::vector *frame; mfxU8 scene_number; }; struct gpuFrameData { CmSurface2D * frameData, * fOut; SurfaceIndex * fIdx, * fIdxOut; mfxFrameSurface1 * mfxFrame; CmSurface2D * magData; SurfaceIndex * idxMag; mfxU8 sc, tc, stc; mfxU32 scene_idx, frame_number, frame_relative_position, noise_count; mfxU16 filterStrength; mfxF64 noise_var, noise_sad, noise_sc, frame_sad, frame_sc, frame_Rs, frame_Cs; bool frame_added, isSceneChange, isIntra; IntMctfParams mfxMctfControl; gpuFrameData() : frameData(0) , fOut(0) , fIdx(0) , fIdxOut(0) , mfxFrame(0) , magData(0) , idxMag(0) , sc(0) , tc(0) , stc(0) , scene_idx(0xffffffff) , frame_number(0) , frame_relative_position(0) , noise_count(0) , filterStrength(MCTFNOFILTER) , noise_var(0.0) , noise_sad(0.0) , noise_sc(0.0) , frame_sad(0.0) , frame_sc(0.0) , frame_Rs(0.0) , frame_Cs(0.0) , frame_added(false) , isSceneChange(false) , isIntra(false) , mfxMctfControl(IntMctfParams{}) { } }; ////////////////////////////////////////////////////////// // Defines and Constants ////////////////////////////////////////////////////////// #define MCTFSEARCHPATHSIZE 56 typedef struct _MulSurfIdx { SurfaceIndex *p_ppIndex, *p_pIndex, *p_curIndex, *p_fIndex, *p_ffIndex; } MulSurfIdx; class CMCRuntimeError : public std::exception { public: CMCRuntimeError() : std::exception() { assert(!"CmRuntimeError"); } }; //Cm based Motion estimation and compensation class CMC { public: static const mfxU16 AUTO_FILTER_STRENGTH; static const mfxU16 DEFAULT_FILTER_STRENGTH; static const mfxU16 INPIPE_FILTER_STRENGTH; static const mfxU32 DEFAULT_BPP; static const mfxU16 DEFAULT_DEBLOCKING; static const mfxU16 DEFAULT_OVERLAP; static const mfxU16 DEFAULT_ME; static const mfxU16 DEFAULT_REFS; // this function fills IntMctfParams structure which is used // to store MCTF params; internal structure. static void QueryDefaultParams(IntMctfParams*); //this is for API static void QueryDefaultParams(mfxExtVppMctf*); static mfxStatus CheckAndFixParams(mfxExtVppMctf*); // this function fills MCTF params based on extended buffer static void FillParamControl(IntMctfParams*, const mfxExtVppMctf*); private: typedef mfxI32(CMC::*t_MCTF_ME)(); typedef mfxI32(CMC::*t_MCTF_NOA)(bool adaptControl); typedef mfxI32(CMC::*t_MCTF_MERGE)(); typedef mfxI32(CMC::*t_RUN_MCTF)(bool notInPipeline); typedef mfxI32(CMC::*t_MCTF_LOAD)(); typedef mfxI32(CMC::*t_MCTF_SPDEN)(); t_MCTF_ME pMCTF_ME_func; t_MCTF_MERGE pMCTF_MERGE_func; t_MCTF_NOA pMCTF_NOA_func; t_RUN_MCTF pMCTF_func; t_MCTF_LOAD pMCTF_LOAD_func; t_MCTF_SPDEN pMCTF_SpDen_func; CmDevice * device; CmQueue * queue; CmTask * task; CmEvent *e, *copyEv; CmThreadSpace *threadSpace, *threadSpace2, *threadSpaceMC, *threadSpaceMC2; size_t hwSize; mfxU32 hwType; mfxU64 exeTime, exeTimeT; //Common elements mfxU32 version, surfPitch, surfSize, surfNoisePitch, surfNoiseSize, sceneNum, countFrames; size_t bufferCount; mfxU16 firstFrame, lastFrame, number_of_References, // an index to a "slot" within QfIn which corresponds // to a frame being an output at this moment; this is // for the normal MCTF operation (not at the begining) DefaultIdx2Out, // current index in QfIn to out; it might differ // from DefaultIdx2Out in the beginning and end; CurrentIdx2Out, deblocking_Control, gopBasedFilterStrength, overlap_Motion; bool bitrate_Adaptation; MCTF_MODE m_AutoMode; MCTF_CONFIGURATION ConfigMode; // current state of MCTF: is it ready to output data or not mfxU16 MctfState; IntMctfParams m_RTParams, m_InitRTParams; mfxI8 backward_distance, forward_distance; mfxU16 bth; std::unique_ptr p_ctrl; CmBuffer * ctrlBuf; CmSurface2D * qpel1, * qpel2; CmSurface2DUP *mv_1, *mv_2, *mv_3, *mv_4, *noiseAnalysisSurf, *distSurf; SurfaceIndex *idxCtrl, *idxSrc, *idxRef1, *idxRef2, *idxRef3, *idxRef4, *idxMv_1, *idxMv_2, *idxMv_3, *idxMv_4, *idxNoiseAnalysis, *idxDist; mfxI32 argIdx, ov_width_bl, ov_height_bl; mfxU16 blsize, tsWidthFull, tsWidth, tsHeight, tsWidthFullMC, tsWidthMC, tsHeightMC; void *mvSys1, *mvSys2, *mvSys3, *mvSys4, *noiseAnalysisSys, *distSys; mfxF64 bpp; mfxU32 m_FrameRateExtN, m_FrameRateExtD; mfxU32 scene_numbers[5]; mfxU64 time; mfxI32 res; std::vector distRef; std::vector var_sc; SurfaceIndex *genxRefs1, *genxRefs2, *genxRefs3, *genxRefs4; //MC elements CmProgram *programMc, *programDe; CmKernel *kernelNoise, *kernelMcDen, *kernelMc1r, *kernelMc2r, *kernelMc4r; CmSurface2D * mco, * mco2; SurfaceIndex * idxMco, * idxMco2; bool m_externalSCD, m_adaptControl, //Based on sequence stats indicates if denoising should be performed or not m_doFilterFrame; std::unique_ptr pSCD; // a queue MCTF of frames MCTF operates on std::vector QfIn; // ----------- MSDK binds------------------ VideoCORE * m_pCore; protected: //ME elements CmProgram * programMe; CmKernel * kernelMe, * kernelMeB2, * kernelMeB; private: inline mfxStatus SetupMeControl( const mfxFrameInfo & FrameInfo, mfxU16 th, mfxU16 subPelPre ); mfxStatus DIM_SET( mfxU16 overlap ); mfxStatus MCTF_InitQueue( mfxU16 refNum ); void RotateBuffer(); void RotateBufferA(); void RotateBufferB(); mfxStatus IM_SURF_SET_Int(); mfxStatus IM_SURF_SET(); mfxStatus IM_SURF_SET( CmSurface2D ** p_surface, SurfaceIndex ** p_idxSurf ); mfxStatus IM_SURF_SET( AbstractSurfaceHandle pD3DSurf, CmSurface2D ** p_surface, SurfaceIndex ** p_idxSurf ); mfxStatus IM_MRE_SURF_SET( CmSurface2D ** p_Surface, SurfaceIndex ** p_idxSurf ); mfxStatus GEN_NoiseSURF_SET( CmSurface2DUP ** p_Surface, void ** p_Sys, SurfaceIndex ** p_idxSurf ); mfxStatus GEN_SURF_SET( CmSurface2DUP ** p_Surface, void ** p_Sys, SurfaceIndex ** p_idxSurf ); mfxI32 MCTF_SET_KERNELMe( SurfaceIndex * GenxRefs, SurfaceIndex * idxMV, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize ); mfxI32 MCTF_SET_KERNELMeBi( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist ); mfxU32 MCTF_SET_KERNELMeBiMRE( SurfaceIndex* GenxRefs, SurfaceIndex* GenxRefs2, SurfaceIndex* idxMV, SurfaceIndex* idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist ); mfxU32 MCTF_SET_KERNELMeBiMRE2( SurfaceIndex* GenxRefs, SurfaceIndex* GenxRefs2, SurfaceIndex* idxMV, SurfaceIndex* idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist ); mfxI32 MCTF_SET_KERNELMc( mfxU16 start_x, mfxU16 start_y, mfxU8 srcNum, mfxU8 refNum ); mfxI32 MCTF_SET_KERNELMc2r( mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_SET_KERNELMc2rDen( mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y, SurfaceIndex * multiIndex ); mfxI32 MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y, mfxU8 runType ); mfxI32 MCTF_SET_KERNELMcMerge( mfxU16 start_x, mfxU16 start_y ); mfxU8 SetOverlapOp(); mfxU8 SetOverlapOp_half(); mfxI32 MCTF_RUN_TASK_NA( CmKernel * kernel, bool reset, mfxU16 widthTs, mfxU16 heightTs ); mfxI32 MCTF_RUN_TASK( CmKernel * kernel, bool reset ); mfxI32 MCTF_RUN_DOUBLE_TASK( CmKernel * meKernel, CmKernel * mcKernel, bool reset ); mfxI32 MCTF_RUN_MCTASK( CmKernel * kernel, bool reset ); mfxI32 MCTF_RUN_TASK( CmKernel * kernel, bool reset, CmThreadSpace * tS ); mfxI32 MCTF_RUN_ME( SurfaceIndex * GenxRefs, SurfaceIndex * idxMV ); mfxI32 MCTF_RUN_ME( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, char forwardRefDist, char backwardRefDist ); mfxI32 MCTF_RUN_ME_MC_HE( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, mfxI8 forwardRefDist, mfxI8 backwardRefDist, mfxU8 mcSufIndex ); mfxI32 MCTF_RUN_ME_MC_H( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, mfxI8 forwardRefDist, mfxI8 backwardRefDist, mfxU8 mcSufIndex ); mfxI32 MCTF_RUN_ME_1REF(); mfxI32 MCTF_RUN_ME_2REF(); mfxI32 MCTF_RUN_ME_4REF(); mfxI32 MCTF_RUN_ME_2REF_HE(); void GET_DISTDATA(); void GET_DISTDATA_H(); void GET_NOISEDATA(); mfxF64 GET_TOTAL_SAD(); mfxI32 MCTF_RUN_Noise_Analysis( mfxU8 srcNum ); void GetSpatioTemporalComplexityFrame( mfxU8 currentFrame ); mfxU32 computeQpClassFromBitRate( mfxU8 currentFrame ); bool FilterEnable( gpuFrameData frame ); mfxI32 noise_estimator( bool adaptControl ); mfxI32 MCTF_RUN_BLEND(); mfxI32 MCTF_RUN_BLEND( mfxU8 srcNum, mfxU8 refNum ); mfxI32 MCTF_RUN_BLEND2R(); mfxI32 MCTF_RUN_BLEND2R_DEN(); mfxI32 MCTF_RUN_BLEND4R( DRT typeRun ); mfxI32 MCTF_RUN_BLEND4R( SurfaceIndex * multiIndex ); mfxI32 MCTF_BLEND4R(); mfxI32 MCTF_RUN_MERGE(); mfxI32 MCTF_LOAD_1REF(); mfxI32 MCTF_LOAD_2REF(); mfxI32 MCTF_LOAD_4REF(); void AssignSceneNumber(); mfxI32 MCTF_RUN_MCTF_DEN_1REF( bool ); mfxI32 MCTF_RUN_MCTF_DEN( bool notInPipeline ); mfxI32 MCTF_RUN_MCTF_DEN_4REF( bool ); mfxI32 MCTF_RUN_AMCTF_DEN(); mfxStatus MCTF_SET_ENV( VideoCORE * core, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, bool isCmUsed, bool isNCActive ); mfxI32 MCTF_SET_KERNEL_Noise( mfxU16 srcNum, mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_SET_KERNELDe( mfxU16 srcNum, mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_SET_KERNELDe( mfxU16 start_x, mfxU16 start_y ); mfxI32 MCTF_RUN_AMCTF(); mfxI32 MCTF_RUN_AMCTF( mfxU16 srcNum ); mfxI32 MCTF_RUN_Denoise( mfxU16 srcNum ); mfxI32 MCTF_RUN_Denoise(); // it will update strength/deblock/bitrate depending on the current mode MCTF operates & parameters // stored in QfIn, in a position srcNum; it will also update the current parameters (if for next frame // no information was passed) mfxStatus MCTF_UpdateRTParams( IntMctfParams * pMctfParam ); mfxStatus MCTF_CheckRTParams( const IntMctfParams * pMctfParam ); mfxStatus MCTF_UpdateANDApplyRTParams( mfxU8 srcNum ); public: mfxU16 MCTF_QUERY_NUMBER_OF_REFERENCES(); // sets filter-strength mfxStatus SetFilterStrenght( unsigned short tFs,//Temporal filter strength unsigned short sFs //Spatial filter strength ); inline mfxStatus SetFilterStrenght( unsigned short fs ); // returns number of referencies MCTF operates on mfxU16 MCTF_GetReferenceNumber() { return MCTF_QUERY_NUMBER_OF_REFERENCES(); }; // Initialize MCTF mfxStatus MCTF_INIT( VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam ); mfxStatus MCTF_INIT(//When external App is using SCD, no need to initilize internal scd. VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, const bool externalSCD, const bool isNCActive ); mfxStatus MCTF_INIT( VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, bool isCmUsed, const bool externalSCD, const bool useFilterAdaptControl, const bool isNCActive ); // returns how many frames are needed to work; mfxU32 MCTF_GetQueueDepth(); mfxStatus MCTF_SetMemory( const std::vector &); mfxStatus MCTF_SetMemory( bool isCmUsed ); void MCTF_CLOSE(); MCTF_CONFIGURATION MCTF_QueryMode() { return ConfigMode; }; mfxStatus MCTF_UpdateBitrateInfo( mfxU32 ); //returns a pointer to internally allocated surface, and locks it using core method mfxStatus MCTF_GetEmptySurface( mfxFrameSurface1 ** ppSurface ); // submits a surface to MCTF & set appropriate filter-strength; mfxU32 IM_SURF_PUT( CmSurface2D *p_surface, mfxU8 *p_data ); void IntBufferUpdate( bool isSceneChange, bool isIntraFrame, bool doIntraFiltering ); void BufferFilterAssignment( mfxU16 * filterStrength, bool doIntraFiltering, bool isAnchorFrame, bool isSceneChange ); bool MCTF_Check_Use(); mfxStatus MCTF_PUT_FRAME( void * frameInData, mfxHDLPair frameOutHandle, CmSurface2D ** frameOutData, bool isCmSurface, mfxU16 * filterStrength, bool needsOutput, bool doIntraFiltering ); mfxStatus MCTF_PUT_FRAME( IntMctfParams * pMctfControl, CmSurface2D * InSurf, CmSurface2D * OutSurf ); mfxStatus MCTF_PUT_FRAME( IntMctfParams * pMctfControl, CmSurface2D * OutSurf, mfxU32 schgDesicion ); mfxStatus MCTF_PUT_FRAME( mfxU32 sceneNumber, CmSurface2D * OutSurf ); mfxStatus MCTF_UpdateBufferCount(); mfxStatus MCTF_DO_FILTERING_IN_AVC(); mfxU16 MCTF_QUERY_FILTER_STRENGTH(); mfxStatus MCTF_DO_FILTERING(); // returns (query) result of filtering to outFrame mfxStatus MCTF_GET_FRAME( CmSurface2D* outFrame ); mfxStatus MCTF_GET_FRAME( mfxU8 * outFrame ); bool MCTF_CHECK_FILTER_USE(); mfxStatus MCTF_RELEASE_FRAME( bool isCmUsed ); // after MCTF_GET_FRAME is invoked, we need to update TimeStamp & FrameOrder // To cal this function with a surface that needs to be updated mfxStatus MCTF_TrackTimeStamp( mfxFrameSurface1 * outFrame ); bool MCTF_ReadyToOutput() { return (AMCTF_READY == MctfState); }; }; oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/mctf/src/000077500000000000000000000000001443134507600273015ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mctf_package/mctf/src/mctf_common.cpp000066400000000000000000003135431443134507600323170ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mctf_common.h" #include "asc.h" #include "asc_cm.h" #include "asc_defs.h" #include "genx_me_gen12lp_isa.h" #include "genx_mc_gen12lp_isa.h" #include "genx_sd_gen12lp_isa.h" #include #include #include #include #include "cmrt_cross_platform.h" using std::min; using std::max; using namespace ns_asc; const mfxU16 CMC::AUTO_FILTER_STRENGTH = 0; const mfxU16 CMC::DEFAULT_FILTER_STRENGTH = 8; const mfxU16 CMC::INPIPE_FILTER_STRENGTH = 5; const mfxU32 CMC::DEFAULT_BPP = 0; //Automode const mfxU16 CMC::DEFAULT_DEBLOCKING = MFX_CODINGOPTION_OFF; const mfxU16 CMC::DEFAULT_OVERLAP = MFX_CODINGOPTION_OFF; const mfxU16 CMC::DEFAULT_ME = MFX_MVPRECISION_INTEGER >> 1; const mfxU16 CMC::DEFAULT_REFS = MCTF_TEMPORAL_MODE_2REF; void CMC::QueryDefaultParams( IntMctfParams * pBuffer ) { if (!pBuffer) return; pBuffer->Deblocking = DEFAULT_DEBLOCKING; pBuffer->Overlap = DEFAULT_OVERLAP; pBuffer->subPelPrecision = DEFAULT_ME; pBuffer->TemporalMode = DEFAULT_REFS; pBuffer->FilterStrength = DEFAULT_FILTER_STRENGTH; // [0...20] pBuffer->BitsPerPixelx100k = DEFAULT_BPP; }; void CMC::QueryDefaultParams( mfxExtVppMctf * pBuffer ) { if (!pBuffer) return; IntMctfParams Mctfparam; QueryDefaultParams(&Mctfparam); pBuffer->FilterStrength = Mctfparam.FilterStrength; }; mfxStatus CMC::CheckAndFixParams( mfxExtVppMctf * pBuffer ) { mfxStatus sts = MFX_ERR_NONE; if (!pBuffer) return MFX_ERR_NULL_PTR; if (pBuffer->FilterStrength > 20) { pBuffer->FilterStrength = AUTO_FILTER_STRENGTH; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return sts; } // this function fills MCTF params based on extended buffer void CMC::FillParamControl( IntMctfParams * pBuffer, const mfxExtVppMctf * pSrc ) { pBuffer->FilterStrength = pSrc->FilterStrength; } mfxStatus CMC::SetFilterStrenght( unsigned short tFs,//Temporal filter strength unsigned short sFs //Spatial filter strength ) { if (tFs > 21 || sFs > 21) return MFX_ERR_INVALID_VIDEO_PARAM; p_ctrl->th = tFs * 50; if (sFs) p_ctrl->sTh = (mfxU16)min(sFs + CHROMABASE, MAXCHROMA); else p_ctrl->sTh = MCTFNOFILTER; res = ctrlBuf->WriteSurface((const uint8_t *)p_ctrl.get(), NULL, sizeof(MeControlSmall)); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } inline mfxStatus CMC::SetFilterStrenght( unsigned short fs ) { MCTF_CHECK_CM_ERR(SetFilterStrenght(fs, fs), MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } inline mfxStatus CMC::SetupMeControl( const mfxFrameInfo & FrameInfo, mfxU16 th, mfxU16 subPelPre ) { p_ctrl.reset(new MeControlSmall); const mfxU8 Diamond[MCTFSEARCHPATHSIZE] = { 0x0F,0xF1,0x0F,0x12,//5 0x0D,0xE2,0x22,0x1E,//9 0x10,0xFF,0xE2,0x20,//13 0xFC,0x06,0xDD,//16 0x2E,0xF1,0x3F,0xD3,0x11,0x3D,0xF3,0x1F,//24 0xEB,0xF1,0xF1,0xF1,//28 0x4E,0x11,0x12,0xF2,0xF1,//33 0xE0,0xFF,0xFF,0x0D,0x1F,0x1F,//39 0x20,0x11,0xCF,0xF1,0x05,0x11,//45 0x00,0x00,0x00,0x00,0x00,0x00,//51 }; std::copy(std::begin(Diamond), std::end(Diamond), std::begin(p_ctrl->searchPath.sp)); p_ctrl->searchPath.lenSp = 16; p_ctrl->searchPath.maxNumSu = 57; p_ctrl->width = FrameInfo.Width; p_ctrl->height = FrameInfo.Height; mfxU16 CropX(FrameInfo.CropX), CropY(FrameInfo.CropY), CropW(FrameInfo.CropW), CropH(FrameInfo.CropH); // this code align crop regin to CROP_BLOCK_ALIGNMENT boundary; // doing this, it follows the principle that initial crop-region // to be included in the crop-region after alignment; mfxU16 CropRBX = CropX + CropW - 1; mfxU16 CropRBY = CropY + CropH - 1; CropX = (CropX / CROP_BLOCK_ALIGNMENT) * CROP_BLOCK_ALIGNMENT; CropY = (CropY / CROP_BLOCK_ALIGNMENT) * CROP_BLOCK_ALIGNMENT; CropW = CropRBX - CropX + 1; CropH = CropRBY - CropY + 1; CropW = (DIVUP(CropW, CROP_BLOCK_ALIGNMENT)) * CROP_BLOCK_ALIGNMENT; CropH = (DIVUP(CropH, CROP_BLOCK_ALIGNMENT)) * CROP_BLOCK_ALIGNMENT; if ((CropX + CropW > FrameInfo.Width) || (CropY + CropH > FrameInfo.Height)) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; p_ctrl->CropX = CropX; p_ctrl->CropY = CropY; p_ctrl->CropW = CropW; p_ctrl->CropH = CropH; if (th > 20) return MFX_ERR_INVALID_VIDEO_PARAM; p_ctrl->th = th * 50; p_ctrl->sTh = (mfxU16)min(th + CHROMABASE, MAXCHROMA); p_ctrl->mre_width = 0; p_ctrl->mre_height = 0; if (MFX_MVPRECISION_INTEGER >> 1 == subPelPre) p_ctrl->subPrecision = 0; else if (MFX_MVPRECISION_QUARTERPEL >> 1 == subPelPre) p_ctrl->subPrecision = 1; else return MFX_ERR_INVALID_VIDEO_PARAM; return MFX_ERR_NONE; } mfxStatus CMC::MCTF_GET_FRAME( CmSurface2D * outFrame ) { mfxStatus sts = MFX_ERR_NONE; if (!outFrame) return MFX_ERR_UNDEFINED_BEHAVIOR; if (!mco) { // we are in the end of a stream, and it must be the configuration with // > 1 reference as there is no reason to get another surface out of MCTF // if no delay was assumed. if (NO_REFERENCES == number_of_References || ONE_REFERENCE == number_of_References) { //this is undefined behavior return MFX_ERR_UNDEFINED_BEHAVIOR; } else { // let map outframe to mco mco = outFrame; INT cmSts = mco->GetIndex(idxMco); MFX_CHECK((CM_SUCCESS == cmSts), MFX_ERR_DEVICE_FAILED); } } if (QfIn.size() == 5) { if (lastFrame == 1) { res = MCTF_RUN_MCTF_DEN(true); lastFrame++; } else if (lastFrame == 2) MCTF_RUN_AMCTF(lastFrame); } else if (QfIn.size() == 3) { if (lastFrame == 1) //res = MCTF_RUN_AMCTF(lastFrame); res = MCTF_RUN_MCTF_DEN(true); } MFX_CHECK(mco, MFX_ERR_UNDEFINED_BEHAVIOR); mco = nullptr; if (!lastFrame) lastFrame = 1; return sts; } mfxStatus CMC::MCTF_GET_FRAME( mfxU8 * outFrame ) { mfxStatus sts = MFX_ERR_NONE; if (!outFrame) return MFX_ERR_UNDEFINED_BEHAVIOR; if (!mco) { if (NO_REFERENCES == number_of_References || ONE_REFERENCE == number_of_References) { //this is undefined behavior return MFX_ERR_UNDEFINED_BEHAVIOR; } else return MFX_ERR_DEVICE_FAILED; } if (lastFrame == 1) res = MCTF_RUN_MCTF_DEN(true); MFX_CHECK(mco, MFX_ERR_UNDEFINED_BEHAVIOR); if (QfIn[0].filterStrength > 0) { res = queue->EnqueueCopyGPUToCPU(mco, outFrame, copyEv); MFX_CHECK((CM_SUCCESS == res), MFX_ERR_DEVICE_FAILED); CM_STATUS status = CM_STATUS_FLUSHED; copyEv->GetStatus(status); while (status != CM_STATUS_FINISHED) copyEv->GetStatus(status); MctfState = AMCTF_NOT_READY; } return sts; } bool CMC::MCTF_CHECK_FILTER_USE() { if (QfIn.front().filterStrength == 0) return false; return true; } mfxStatus CMC::MCTF_RELEASE_FRAME( bool isCmUsed ) { if (MCTF_ReadyToOutput()) { MctfState = AMCTF_NOT_READY; if (mco2) { mco = mco2; idxMco = idxMco2; mco2 = nullptr; idxMco2 = nullptr; } } //Buffer has rotated enough at this point that last position is old and needs to eb recycled. if (isCmUsed) { if (QfIn.back().frameData) { device->DestroySurface(QfIn.back().frameData);//This Surface is created by MCTF and needs to be destroyed after denoised frame has been used. QfIn.back().frameData = nullptr; QfIn.back().fIdx = nullptr; QfIn.back().mfxFrame = nullptr; } } return MFX_ERR_NONE; } mfxStatus CMC::MCTF_TrackTimeStamp( mfxFrameSurface1 * outFrame ) { outFrame->Data.FrameOrder = QfIn[CurrentIdx2Out].mfxFrame->Data.FrameOrder; outFrame->Data.TimeStamp = QfIn[CurrentIdx2Out].mfxFrame->Data.TimeStamp; return MFX_ERR_NONE; } mfxStatus CMC::MCTF_InitQueue( mfxU16 refNum ) { mfxU32 buffer_size(0); switch (refNum) { case MCTF_TEMPORAL_MODE_4REF: { number_of_References = FOUR_REFERENCES; DefaultIdx2Out = 1; CurrentIdx2Out = 0; MctfState = AMCTF_NOT_READY; buffer_size = FOUR_REFERENCES + 1; }; break; case MCTF_TEMPORAL_MODE_2REF: { number_of_References = TWO_REFERENCES; DefaultIdx2Out = 0; CurrentIdx2Out = 0; MctfState = AMCTF_NOT_READY; buffer_size = TWO_REFERENCES + 1; }; break; case MCTF_TEMPORAL_MODE_1REF: { number_of_References = ONE_REFERENCE; DefaultIdx2Out = 0; CurrentIdx2Out = 0; MctfState = AMCTF_READY; buffer_size = ONE_REFERENCE + 1; }; break; case MCTF_TEMPORAL_MODE_SPATIAL: { //refNum == 0 number_of_References = NO_REFERENCES; DefaultIdx2Out = 0; CurrentIdx2Out = 0; MctfState = AMCTF_READY; buffer_size = ONE_REFERENCE ; }; break; default: return MFX_ERR_INVALID_VIDEO_PARAM; }; for (mfxU8 i = 0; i < buffer_size; i++) { scene_numbers[i] = 0; QfIn.push_back(gpuFrameData()); } return MFX_ERR_NONE; } mfxStatus CMC::DIM_SET( mfxU16 overlap ) { // if (p_ctrl->height <= MINHEIGHT) if (p_ctrl->CropH <= MINHEIGHT) blsize = 8; if (MFX_CODINGOPTION_OFF != overlap && MFX_CODINGOPTION_ON != overlap && MFX_CODINGOPTION_UNKNOWN != overlap) return MFX_ERR_INVALID_VIDEO_PARAM; overlap_Motion = overlap; switch (overlap_Motion) { case MFX_CODINGOPTION_ON: { ov_width_bl = (DIVUP(p_ctrl->CropW, blsize) * 2) - 1; ov_height_bl = (DIVUP(p_ctrl->CropH, blsize) * 2) - 1; } break; case MFX_CODINGOPTION_UNKNOWN: case MFX_CODINGOPTION_OFF: { ov_width_bl = DIVUP(p_ctrl->CropW, blsize) * 2; ov_height_bl = DIVUP(p_ctrl->CropH, blsize) * 2; } break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } int var_sc_area = DIVUP(p_ctrl->CropW, 16) * DIVUP(p_ctrl->CropH, 16); distRef.resize(ov_width_bl * ov_height_bl, 0); var_sc.resize(var_sc_area); return MFX_ERR_NONE; } mfxStatus CMC::IM_SURF_SET( CmSurface2D ** p_surface, SurfaceIndex ** p_idxSurf ) { res = device->CreateSurface2D(p_ctrl->width, p_ctrl->height, CM_SURFACE_FORMAT_NV12, *p_surface); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*p_surface)->GetIndex(*p_idxSurf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::IM_SURF_SET( AbstractSurfaceHandle pD3DSurf, CmSurface2D ** p_surface, SurfaceIndex ** p_idxSurf ) { res = device->CreateSurface2D(pD3DSurf, *p_surface); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*p_surface)->GetIndex(*p_idxSurf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::IM_MRE_SURF_SET( CmSurface2D ** p_Surface, SurfaceIndex ** p_idxSurf ) { mfxU32 width = SUBMREDIM, height = SUBMREDIM; res = device->CreateSurface2D(width * sizeof(mfxI16Pair), height, CM_SURFACE_FORMAT_A8, *p_Surface); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*p_Surface)->GetIndex(*p_idxSurf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::IM_SURF_SET_Int() { for (mfxU32 i = 0; i < QfIn.size(); i++) { res += IM_SURF_SET(&QfIn[i].frameData, &QfIn[i].fIdx); QfIn[i].scene_idx = 0; } return MFX_ERR_NONE; } mfxStatus CMC::IM_SURF_SET() { for (mfxU32 i = 0; i < QfIn.size(); i++) { MFX_SAFE_CALL(IM_MRE_SURF_SET(&QfIn[i].magData, &QfIn[i].idxMag)); mfxHDLPair handle; // GetFrameHDL is used as QfIn[].mfxFrme is allocated via call to Core Alloc function MFX_SAFE_CALL(m_pCore->GetFrameHDL(QfIn[i].mfxFrame->Data.MemId, reinterpret_cast(&handle))); MFX_SAFE_CALL(IM_SURF_SET(reinterpret_cast(handle.first), &QfIn[i].frameData, &QfIn[i].fIdx)); QfIn[i].scene_idx = 0; } return MFX_ERR_NONE; } mfxU16 CMC::MCTF_QUERY_NUMBER_OF_REFERENCES() { return number_of_References; } mfxU32 CMC::MCTF_GetQueueDepth() { return (mfxU32)QfIn.size(); } mfxStatus CMC::MCTF_SetMemory( const std::vector & mfxSurfPool ) { if (mfxSurfPool.size() != QfIn.size()) return MFX_ERR_UNDEFINED_BEHAVIOR; else { auto inp_iter = mfxSurfPool.begin(); for (auto it = QfIn.begin(); it != QfIn.end() && inp_iter != mfxSurfPool.end(); ++it, ++inp_iter) it->mfxFrame = *inp_iter; res = IM_SURF_SET(); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); // mco & idxmco will be extracted from an output surface mco = nullptr; res = IM_SURF_SET(&mco2, &idxMco2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Setup for 2 references res = GEN_SURF_SET(&mv_1, &mvSys1, &idxMv_1); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_SURF_SET(&mv_2, &mvSys2, &idxMv_2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); if (number_of_References > 2) { //Setup for 4 references res = GEN_SURF_SET(&mv_3, &mvSys3, &idxMv_3); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_SURF_SET(&mv_4, &mvSys4, &idxMv_4); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } res = GEN_SURF_SET(&distSurf, &distSys, &idxDist); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_NoiseSURF_SET(&noiseAnalysisSurf, &noiseAnalysisSys, &idxNoiseAnalysis); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } } mfxStatus CMC::MCTF_SetMemory( bool isCmUsed ) { // mco & idxmco will be extracted from input/output surface if (!isCmUsed) { res = IM_SURF_SET_Int(); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } mco = nullptr; idxMco = nullptr; mco2 = nullptr; idxMco2 = nullptr; //Setup for 2 references res = GEN_SURF_SET(&mv_1, &mvSys1, &idxMv_1); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_SURF_SET(&mv_2, &mvSys2, &idxMv_2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); if (number_of_References > 2) { //Setup for 4 references res = GEN_SURF_SET(&mv_3, &mvSys3, &idxMv_3); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_SURF_SET(&mv_4, &mvSys4, &idxMv_4); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } res = GEN_SURF_SET(&distSurf, &distSys, &idxDist); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = GEN_NoiseSURF_SET(&noiseAnalysisSurf, &noiseAnalysisSys, &idxNoiseAnalysis); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::MCTF_INIT( VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, bool isCmUsed, const bool externalSCD, const bool useFilterAdaptControl, const bool isNCActive ) { version = 400; argIdx = 0; tsWidthFull = 0; tsWidth = 0; tsHeight = 0; bth = 500; blsize = 16; device = NULL; sceneNum = 0; countFrames = 0; firstFrame = 1; lastFrame = 0; exeTime = 0; exeTimeT = 0; m_externalSCD = externalSCD; m_adaptControl = useFilterAdaptControl; m_doFilterFrame = false; //--filter configuration parameters m_AutoMode = MCTF_MODE::MCTF_NOT_INITIALIZED_MODE; ConfigMode = MCTF_CONFIGURATION::MCTF_NOT_CONFIGURED; number_of_References = MCTF_TEMPORAL_MODE_2REF; bitrate_Adaptation = false; deblocking_Control = MFX_CODINGOPTION_OFF; bpp = 0.0; m_FrameRateExtD = 1; m_FrameRateExtN = 0; ctrlBuf = 0; idxCtrl = 0; distSys = 0; time = 0; qpel1 = 0; qpel2 = 0; idxMv_1 = 0; bufferCount = 0; //ME elements genxRefs1 = 0; genxRefs2 = 0; genxRefs3 = 0; genxRefs4 = 0; idxMv_1 = NULL; idxMv_2 = NULL; idxMv_3 = NULL; idxMv_4 = NULL; //Motion Estimation programMe = 0; kernelMe = 0; //MC elements mco = 0; idxMco = 0; mco2 = 0; idxMco2 = 0; //Motion Compensation programMc = 0; kernelMcDen = 0; kernelMc1r = 0; kernelMc2r = 0; kernelMc4r = 0; //Common elements queue = NULL; //copyQ = NULL; copyEv = NULL; // m_IOPattern = io_pattern; // m_ioMode = io_mode; if (core) m_pCore = core; else return MFX_ERR_NOT_INITIALIZED; if (pCmDevice) device = pCmDevice; else return MFX_ERR_NOT_INITIALIZED; mfxStatus sts = MFX_ERR_NONE; if(!m_externalSCD) pSCD.reset(new(ASC_Cm)); IntMctfParams MctfParam{}; QueryDefaultParams(&MctfParam); // if no MctfParams are passed, to use default if (!pMctfParam) pMctfParam = &MctfParam; sts = MCTF_SET_ENV(core, FrameInfo, pMctfParam, isCmUsed, isNCActive); MFX_CHECK_STS(sts); return sts; } mfxStatus CMC::MCTF_INIT( VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam ) { return (MCTF_INIT(core, pCmDevice, FrameInfo, pMctfParam, false, false)); } mfxStatus CMC::MCTF_INIT( VideoCORE * core, CmDevice * pCmDevice, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, const bool externalSCD, const bool isNCActive ) { return (MCTF_INIT(core, pCmDevice, FrameInfo, pMctfParam, false, externalSCD, false, isNCActive)); } mfxStatus CMC::MCTF_SET_ENV( VideoCORE * core, const mfxFrameInfo & FrameInfo, const IntMctfParams * pMctfParam, bool isCmUsed, bool isNCActive ) { IntMctfParams localMctfParam = *pMctfParam; mfxStatus sts = MFX_ERR_NONE; if (!device) return MFX_ERR_NOT_INITIALIZED; hwSize = 4; res = device->GetCaps(CAP_GPU_PLATFORM, hwSize, &hwType); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = device->CreateQueueEx(queue, CM_VME_QUEUE_CREATE_OPTION); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); task = 0; // --- bitrate if (localMctfParam.BitsPerPixelx100k) // to do correctcompare with 0.0 bitrate_Adaptation = true; else bitrate_Adaptation = false; // ---- BitsPerPixel MCTF_UpdateBitrateInfo(localMctfParam.BitsPerPixelx100k); // --- deblock if (MFX_CODINGOPTION_ON != localMctfParam.Deblocking && MFX_CODINGOPTION_OFF != localMctfParam.Deblocking && MFX_CODINGOPTION_UNKNOWN != localMctfParam.Deblocking) return MFX_ERR_INVALID_VIDEO_PARAM; //Dimensions, control and io if (MCTF_TEMPORAL_MODE_SPATIAL == localMctfParam.TemporalMode) { localMctfParam.Overlap = MFX_CODINGOPTION_OFF; localMctfParam.Deblocking = MFX_CODINGOPTION_OFF; localMctfParam.subPelPrecision = MFX_MVPRECISION_INTEGER; } deblocking_Control = localMctfParam.Deblocking; // MRE is initialized inside sts = SetupMeControl(FrameInfo, localMctfParam.FilterStrength, localMctfParam.subPelPrecision); MFX_CHECK_STS(sts); sts = MCTF_InitQueue(localMctfParam.TemporalMode); MFX_CHECK_STS(sts); sts = DIM_SET(localMctfParam.Overlap); MFX_CHECK_STS(sts); if (bitrate_Adaptation || !localMctfParam.FilterStrength) m_AutoMode = MCTF_MODE::MCTF_AUTO_MODE; else m_AutoMode = MCTF_MODE::MCTF_MANUAL_MODE; if (bitrate_Adaptation) ConfigMode = MCTF_CONFIGURATION::MCTF_AUT_CA_BA; else { ConfigMode = MCTF_MODE::MCTF_AUTO_MODE == m_AutoMode ? MCTF_CONFIGURATION::MCTF_AUT_CA_NBA : MCTF_CONFIGURATION::MCTF_MAN_NCA_NBA; } pMCTF_SpDen_func = nullptr; pMCTF_NOA_func = nullptr; pMCTF_LOAD_func = nullptr; pMCTF_ME_func = nullptr; pMCTF_MERGE_func = nullptr; pMCTF_func = nullptr; pMCTF_func = &CMC::MCTF_RUN_MCTF_DEN; if (m_AutoMode == MCTF_MODE::MCTF_AUTO_MODE || isNCActive) pMCTF_NOA_func = &CMC::noise_estimator; if (number_of_References == FOUR_REFERENCES) { pMCTF_LOAD_func = &CMC::MCTF_LOAD_4REF; pMCTF_ME_func = &CMC::MCTF_RUN_ME_4REF; pMCTF_MERGE_func = &CMC::MCTF_RUN_MERGE; } else if (number_of_References == TWO_REFERENCES) { pMCTF_LOAD_func = &CMC::MCTF_LOAD_2REF; if (isNCActive) pMCTF_ME_func = &CMC::MCTF_RUN_ME_2REF_HE; else pMCTF_ME_func = &CMC::MCTF_RUN_ME_2REF; pMCTF_MERGE_func = NULL; } else if (number_of_References == ONE_REFERENCE) { pMCTF_func = &CMC::MCTF_RUN_MCTF_DEN_1REF; pMCTF_LOAD_func = &CMC::MCTF_LOAD_1REF; pMCTF_ME_func = &CMC::MCTF_RUN_ME_1REF; pMCTF_MERGE_func = &CMC::MCTF_RUN_BLEND; } else if (number_of_References == NO_REFERENCES) { pMCTF_func = &CMC::MCTF_RUN_MCTF_DEN_1REF; pMCTF_LOAD_func = &CMC::MCTF_LOAD_1REF; pMCTF_ME_func = NULL; pMCTF_MERGE_func = &CMC::MCTF_RUN_AMCTF; } else return MFX_ERR_UNDEFINED_BEHAVIOR; //deblocking only if ME is used if (MFX_CODINGOPTION_ON == deblocking_Control && (ONE_REFERENCE == number_of_References || TWO_REFERENCES == number_of_References || FOUR_REFERENCES == number_of_References) ) pMCTF_SpDen_func = &CMC::MCTF_RUN_Denoise; if (blsize < VMEBLSIZE) p_ctrl->th = p_ctrl->th / 4; res = device->CreateBuffer(sizeof(MeControlSmall), ctrlBuf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = ctrlBuf->WriteSurface((const Ipp8u *)p_ctrl.get(), NULL, sizeof(MeControlSmall)); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = ctrlBuf->GetIndex(idxCtrl); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Init internal buffer which is not shared if (isNCActive) { res = MCTF_SetMemory(isCmUsed); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } //Motion Estimation switch (hwType) { #ifdef MFX_ENABLE_KERNELS case PLATFORM_INTEL_TGLLP: case PLATFORM_INTEL_RKL: case PLATFORM_INTEL_DG1: case PLATFORM_INTEL_ADL_S: case PLATFORM_INTEL_ADL_P: case PLATFORM_INTEL_ADL_N: res = device->LoadProgram((void *)genx_me_gen12lp, sizeof(genx_me_gen12lp), programMe, "nojitter"); break; #endif default: return MFX_ERR_UNSUPPORTED; } MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //ME Kernel if (MFX_CODINGOPTION_ON == overlap_Motion) { res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16_1MV_MRE), kernelMe); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16bi_1MV2_MRE), kernelMeB); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16bi_1MV2_MRE), kernelMeB2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } else if (MFX_CODINGOPTION_OFF == overlap_Motion || MFX_CODINGOPTION_UNKNOWN == overlap_Motion) { res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16_1MV_MRE_8x8), kernelMe); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); if (isNCActive) { res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16_1ME_2BiRef_MRE_8x8), kernelMeB); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16_1ME_2BiRef_MRE_8x8), kernelMeB2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } else { res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16bi_1MV2_MRE_8x8), kernelMeB); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = device->CreateKernel(programMe, CM_KERNEL_FUNCTION(MeP16bi_1MV2_MRE_8x8), kernelMeB2); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } } else return MFX_ERR_INVALID_VIDEO_PARAM; //Motion Compensation switch (hwType) { #ifdef MFX_ENABLE_KERNELS case PLATFORM_INTEL_TGLLP: case PLATFORM_INTEL_RKL: case PLATFORM_INTEL_DG1: case PLATFORM_INTEL_ADL_S: case PLATFORM_INTEL_ADL_P: case PLATFORM_INTEL_ADL_N: res = device->LoadProgram((void *)genx_mc_gen12lp, sizeof(genx_mc_gen12lp), programMc, "nojitter"); break; #endif default: return MFX_ERR_UNSUPPORTED; } MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); switch (hwType) { #ifdef MFX_ENABLE_KERNELS case PLATFORM_INTEL_TGLLP: case PLATFORM_INTEL_RKL: case PLATFORM_INTEL_DG1: case PLATFORM_INTEL_ADL_S: case PLATFORM_INTEL_ADL_P: case PLATFORM_INTEL_ADL_N: res = device->LoadProgram((void *)genx_sd_gen12lp, sizeof(genx_sd_gen12lp), programDe, "nojitter"); break; #endif default: return MFX_ERR_UNSUPPORTED; } MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Denoising No reference Kernel res = device->CreateKernel(programDe, CM_KERNEL_FUNCTION(SpatialDenoiser_8x8_NV12), kernelMcDen); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Motion Compensation 1 Ref Kernel res = device->CreateKernel(programMc, CM_KERNEL_FUNCTION(McP16_4MV_1SURF_WITH_CHR), kernelMc1r); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Motion Compensation 2 Ref Kernel res = device->CreateKernel(programMc, CM_KERNEL_FUNCTION(McP16_4MV_2SURF_WITH_CHR), kernelMc2r); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); //Motion Compensation 4 Ref Kernel if (number_of_References == FOUR_REFERENCES) { res = device->CreateKernel(programMc, CM_KERNEL_FUNCTION(MC_MERGE4), kernelMc4r); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } res = device->CreateKernel(programMc, CM_KERNEL_FUNCTION(MC_VAR_SC_CALC), kernelNoise); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); if (!m_externalSCD) { sts = pSCD->Init(p_ctrl->CropW, p_ctrl->CropH, p_ctrl->width, MFX_PICSTRUCT_PROGRESSIVE, device, true); MFX_CHECK_STS(sts); sts = pSCD->SetGoPSize(Immediate_GoP); MFX_CHECK_STS(sts); pSCD->SetControlLevel(0); } if (m_AutoMode == MCTF_MODE::MCTF_AUTO_MODE) { sts = SetFilterStrenght(DEFAULT_FILTER_STRENGTH); m_RTParams.FilterStrength = DEFAULT_FILTER_STRENGTH; } else { if (isNCActive) { sts = SetFilterStrenght(INPIPE_FILTER_STRENGTH); m_RTParams.FilterStrength = INPIPE_FILTER_STRENGTH; } else { sts = SetFilterStrenght(localMctfParam.FilterStrength); m_RTParams.FilterStrength = localMctfParam.FilterStrength; } } // now initialize run-time parameters m_RTParams = localMctfParam; m_InitRTParams = m_RTParams; return sts; } mfxStatus CMC::MCTF_CheckRTParams( const IntMctfParams * pMctfControl ) { mfxStatus sts = MFX_ERR_NONE; if (pMctfControl) { if (pMctfControl->FilterStrength > 21) sts = MFX_ERR_INVALID_VIDEO_PARAM; } return sts; } mfxStatus CMC::MCTF_UpdateRTParams( IntMctfParams * pMctfControl ) { mfxStatus sts = MCTF_CheckRTParams(pMctfControl); if (pMctfControl && MFX_ERR_NONE == sts) m_RTParams = *pMctfControl; else m_RTParams = m_InitRTParams; return MFX_ERR_NONE; } mfxStatus CMC::MCTF_UpdateANDApplyRTParams( mfxU8 srcNum ) { // deblock can be controled for every mode if (MCTF_CONFIGURATION::MCTF_MAN_NCA_NBA == ConfigMode || MCTF_CONFIGURATION::MCTF_AUT_CA_BA == ConfigMode || MCTF_CONFIGURATION::MCTF_AUT_CA_NBA == ConfigMode) { #ifdef MCTF_UPDATE_RT_FRAME_ORDER_BASED m_RTParams = QfIn[srcNum].mfxMctfControl; #else (void)srcNum; #endif if (MCTF_CONFIGURATION::MCTF_MAN_NCA_NBA == ConfigMode) { SetFilterStrenght(m_RTParams.FilterStrength); } } return MFX_ERR_NONE; } // what if bitrate is close to 0? mfxStatus CMC::MCTF_UpdateBitrateInfo( mfxU32 BitsPerPexelx100k ) { if (MCTF_CONFIGURATION::MCTF_NOT_CONFIGURED == ConfigMode || MCTF_CONFIGURATION::MCTF_AUT_CA_BA == ConfigMode ) { // intially here was a code that uses 12bpp in case // of no bitrate or FPS numerator are passed; // what should be now? bpp = BitsPerPexelx100k * 1.0 / MCTF_BITRATE_MULTIPLIER; return MFX_ERR_NONE; } else { // if any other mode, update the bitrate does not have any effect; // let notify a caller about this; // however, its not critical as MCTF can operate further return MFX_WRN_VALUE_NOT_CHANGED; } } mfxStatus CMC::GEN_NoiseSURF_SET( CmSurface2DUP ** p_Surface, void ** p_Sys, SurfaceIndex ** p_idxSurf ) { surfNoisePitch = 0; surfNoiseSize = 0; res = device->GetSurface2DInfo(DIVUP(p_ctrl->CropW, 16) * sizeof(spatialNoiseAnalysis), DIVUP(p_ctrl->CropH, 16), CM_SURFACE_FORMAT_A8, surfNoisePitch, surfNoiseSize); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); *p_Sys = CM_ALIGNED_MALLOC(surfNoiseSize, 0x1000); MFX_CHECK(*p_Sys, MFX_ERR_NULL_PTR); memset(*p_Sys, 0, surfNoiseSize); res = device->CreateSurface2DUP(DIVUP(p_ctrl->CropW, 16) * sizeof(spatialNoiseAnalysis), DIVUP(p_ctrl->CropH, 16), CM_SURFACE_FORMAT_A8, *p_Sys, *p_Surface); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*p_Surface)->GetIndex(*p_idxSurf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::GEN_SURF_SET( CmSurface2DUP ** p_Surface, void ** p_Sys, SurfaceIndex **p_idxSurf ) { surfPitch = 0; surfSize = 0; res = device->GetSurface2DInfo(ov_width_bl * sizeof(mfxI16Pair), ov_height_bl, CM_SURFACE_FORMAT_A8, surfPitch, surfSize); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); *p_Sys = CM_ALIGNED_MALLOC(surfSize, 0x1000); MFX_CHECK(*p_Sys, MFX_ERR_NULL_PTR); memset(*p_Sys, 0, surfSize); res = device->CreateSurface2DUP(ov_width_bl * sizeof(mfxI16Pair), ov_height_bl, CM_SURFACE_FORMAT_A8, *p_Sys, *p_Surface); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); res = (*p_Surface)->GetIndex(*p_idxSurf); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } mfxStatus CMC::MCTF_GetEmptySurface( mfxFrameSurface1 ** ppSurface ) { size_t buffer_size = QfIn.size() - 1; if (bufferCount > buffer_size) return MFX_ERR_UNDEFINED_BEHAVIOR; if (QfIn[bufferCount].mfxFrame->Data.Locked) { *ppSurface = nullptr; return MFX_ERR_NONE; } else { m_pCore->IncreaseReference(&(QfIn[bufferCount].mfxFrame->Data)); *ppSurface = QfIn[bufferCount].mfxFrame; return MFX_ERR_NONE; } } mfxStatus CMC::MCTF_PUT_FRAME( mfxU32 sceneNumber, CmSurface2D* OutSurf ) { size_t buffer_size = QfIn.size() - 1; if (bufferCount > buffer_size) { #ifdef MFX_MCTF_DEBUG_PRINT ASC_PRINTF("Error: Invalid frame buffer position\n"); #endif return MFX_ERR_UNDEFINED_BEHAVIOR; } #ifdef MCTF_UPDATE_RT_FRAME_ORDER_BASED QfIn[bufferCount].mfxMctfControl = m_RTParams; #endif QfIn[bufferCount].scene_idx = sceneNumber; QfIn[bufferCount].frame_number = countFrames; // if outFrame is nullptr, it means we cannot output result; if (OutSurf) { mco = OutSurf; INT cmSts = OutSurf->GetIndex(idxMco); MFX_CHECK((CM_SUCCESS == cmSts), MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; } mfxStatus CMC::MCTF_UpdateBufferCount() { size_t buffer_size = QfIn.size() - 1; if (bufferCount > buffer_size) return MFX_ERR_UNDEFINED_BEHAVIOR; bufferCount = (bufferCount < buffer_size) ? bufferCount + 1 : buffer_size; return MFX_ERR_NONE; } mfxI32 CMC::MCTF_LOAD_1REF() { res = device->CreateVmeSurfaceG7_5(QfIn[1].frameData, &QfIn[0].frameData, NULL, 1, 0, genxRefs1); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_LOAD_2REF() { res = device->CreateVmeSurfaceG7_5(QfIn[1].frameData, &QfIn[0].frameData, &QfIn[2].frameData, 1, 1, genxRefs1); MCTF_CHECK_CM_ERR(res, res); res = device->CreateVmeSurfaceG7_5(QfIn[1].frameData, &QfIn[2].frameData, NULL, 1, 0, genxRefs2); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_LOAD_4REF() { res = device->CreateVmeSurfaceG7_5(QfIn[2].frameData, &QfIn[1].frameData, &QfIn[3].frameData, 1, 1, genxRefs1); MCTF_CHECK_CM_ERR(res, res); res = device->CreateVmeSurfaceG7_5(QfIn[2].frameData, &QfIn[3].frameData, NULL, 1, 0, genxRefs2); MCTF_CHECK_CM_ERR(res, res); res = device->CreateVmeSurfaceG7_5(QfIn[2].frameData, &QfIn[0].frameData, &QfIn[4].frameData, 1, 1, genxRefs3); MCTF_CHECK_CM_ERR(res, res); res = device->CreateVmeSurfaceG7_5(QfIn[2].frameData, &QfIn[4].frameData, NULL, 1, 0, genxRefs4); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMe( SurfaceIndex * GenxRefs, SurfaceIndex * idxMV, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize) { argIdx = 0; res = kernelMe->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMe->SetKernelArg(argIdx++, sizeof(*GenxRefs), GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = kernelMe->SetKernelArg(argIdx++, sizeof(*idxDist), idxDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMe->SetKernelArg(argIdx++, sizeof(*idxMV), idxMV); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMe->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); res = kernelMe->SetKernelArg(argIdx++, sizeof(blSize), &blSize); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMeBi( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist ) { argIdx = 0; res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*GenxRefs), GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*GenxRefs2), GenxRefs2); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxDist), idxDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxMV), idxMV); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxMV2), idxMV2); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMeB->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(blSize), &blSize); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(forwardRefDist), &forwardRefDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(backwardRefDist), &backwardRefDist); MCTF_CHECK_CM_ERR(res, res); return res; } mfxU32 CMC::MCTF_SET_KERNELMeBiMRE( SurfaceIndex* GenxRefs, SurfaceIndex* GenxRefs2, SurfaceIndex* idxMV, SurfaceIndex* idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist) { argIdx = 0; res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*GenxRefs), GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*GenxRefs2), GenxRefs2); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxDist), idxDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxMV), idxMV); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(*idxMV2), idxMV2); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMeB->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(blSize), &blSize); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(forwardRefDist), &forwardRefDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->SetKernelArg(argIdx++, sizeof(backwardRefDist), &backwardRefDist); MCTF_CHECK_CM_ERR(res, res); return res; } mfxU32 CMC::MCTF_SET_KERNELMeBiMRE2( SurfaceIndex* GenxRefs, SurfaceIndex* GenxRefs2, SurfaceIndex* idxMV, SurfaceIndex* idxMV2, mfxU16 start_x, mfxU16 start_y, mfxU8 blSize, mfxI8 forwardRefDist, mfxI8 backwardRefDist) { argIdx = 0; res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*GenxRefs), GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*GenxRefs2), GenxRefs2); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*idxDist), idxDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*idxMV), idxMV); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(*idxMV2), idxMV2); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMeB2->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(blSize), &blSize); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(forwardRefDist), &forwardRefDist); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetKernelArg(argIdx++, sizeof(backwardRefDist), &backwardRefDist); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc( mfxU16 start_x, mfxU16 start_y, mfxU8 srcNum, mfxU8 refNum ) { argIdx = 0; res = kernelMc1r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc1r->SetKernelArg(argIdx++, sizeof(*QfIn[refNum].fIdx), QfIn[refNum].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc1r->SetKernelArg(argIdx++, sizeof(*idxMv_1), idxMv_1); MCTF_CHECK_CM_ERR(res, res); res = kernelMc1r->SetKernelArg(argIdx++, sizeof(*QfIn[srcNum].fIdx), QfIn[srcNum].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc1r->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc1r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); //scene numbers mfxU8quad scene_num_gpu = { (mfxU8)scene_numbers[0], (mfxU8)scene_numbers[1], (mfxU8)scene_numbers[2], 2 }; res = kernelMc1r->SetKernelArg(argIdx++, sizeof(scene_num_gpu), &scene_num_gpu); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc2r( mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[0].fIdx), QfIn[0].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMv_1), idxMv_1); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[2].fIdx), QfIn[2].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMv_2), idxMv_2); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[1].fIdx), QfIn[1].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); //scene numbers mfxU8quad scene_num_gpu = { (mfxU8)scene_numbers[0], (mfxU8)scene_numbers[1], (mfxU8)scene_numbers[2], 2 }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(scene_num_gpu), &scene_num_gpu); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc2rDen( mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[0].fIdx), QfIn[0].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMv_1), idxMv_1); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[2].fIdx), QfIn[2].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMv_2), idxMv_2); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[1].fIdx), QfIn[1].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxMco2), idxMco2); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); //scene numbers mfxU8quad scene_num_gpu = { (mfxU8)scene_numbers[0], (mfxU8)scene_numbers[1], (mfxU8)scene_numbers[2], 2 }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(scene_num_gpu), &scene_num_gpu); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxRef1), idxRef1); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMv_1), idxMv_1); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxRef2), idxRef2); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMv_2), idxMv_2); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxRef3), idxRef3); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMv_3), idxMv_3); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxRef4), idxRef4); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMv_4), idxMv_4); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxSrc), idxSrc); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y, SurfaceIndex * multiIndex ) { argIdx = 0; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*multiIndex), multiIndex); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxSrc), idxSrc); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMcMerge( mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); res = kernelMc4r->SetKernelArg(argIdx++, sizeof(*idxMco2), idxMco2); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc4r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELMc4r( mfxU16 start_x, mfxU16 start_y, mfxU8 runType ) { argIdx = 0; mfxU8 currentFrame = 2, pastRef = 1, futureRef = 3; SurfaceIndex **mcOut = &idxMco, **pastMv = &idxMv_1, **futureMv = &idxMv_2; if (runType == DEN_FAR_RUN) { pastRef = 0; futureRef = 4; mcOut = &idxMco2; pastMv = &idxMv_3; futureMv = &idxMv_4; } res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[pastRef].fIdx), QfIn[pastRef].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(**pastMv), *pastMv); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[futureRef].fIdx), QfIn[futureRef].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(**futureMv), *futureMv); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(*QfIn[currentFrame].fIdx), QfIn[currentFrame].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetKernelArg(argIdx++, sizeof(**mcOut), *mcOut); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); //scene numbers mfxU8quad scene_num_gpu = { (mfxU8)scene_numbers[pastRef], (mfxU8)scene_numbers[currentFrame], (mfxU8)scene_numbers[futureRef], 2 }; res = kernelMc2r->SetKernelArg(argIdx++, sizeof(scene_num_gpu), &scene_num_gpu); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNEL_Noise( mfxU16 srcNum, mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelNoise->SetKernelArg(argIdx++, sizeof(*QfIn[srcNum].fIdx), QfIn[srcNum].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelNoise->SetKernelArg(argIdx++, sizeof(*idxNoiseAnalysis), idxNoiseAnalysis); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelNoise->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELDe( mfxU16 srcNum, mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*QfIn[srcNum].fIdx), QfIn[srcNum].fIdx); MCTF_CHECK_CM_ERR(res, res); res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMcDen->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_SET_KERNELDe( mfxU16 start_x, mfxU16 start_y ) { argIdx = 0; res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*idxCtrl), idxCtrl); MCTF_CHECK_CM_ERR(res, res); res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); res = kernelMcDen->SetKernelArg(argIdx++, sizeof(*idxMco), idxMco); MCTF_CHECK_CM_ERR(res, res); // set start mb mfxU16Pair start_xy = { start_x, start_y }; res = kernelMcDen->SetKernelArg(argIdx++, sizeof(start_xy), &start_xy); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_TASK_NA( CmKernel * kernel, bool reset, mfxU16 widthTs, mfxU16 heightTs ) { res = kernel->SetThreadCount(widthTs * heightTs); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(widthTs, heightTs, threadSpace); MCTF_CHECK_CM_ERR(res, res); res = kernel->AssociateThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); if (reset) { res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(kernel); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_TASK( CmKernel * kernel, bool reset ) { res = kernel->SetThreadCount(tsWidth * tsHeight); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidth, tsHeight, threadSpace); MCTF_CHECK_CM_ERR(res, res); res = kernel->AssociateThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); if (reset) { res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(kernel); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_DOUBLE_TASK( CmKernel * meKernel, CmKernel * mcKernel, bool reset ) { res = meKernel->SetThreadCount(tsWidth * tsHeight); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidth, tsHeight, threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = meKernel->AssociateThreadSpace(threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = mcKernel->SetThreadCount(tsWidthMC * tsHeightMC); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidthMC, tsHeightMC, threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); res = mcKernel->AssociateThreadSpace(threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); if (reset) { res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(meKernel); MCTF_CHECK_CM_ERR(res, res); res = task->AddSync(); MCTF_CHECK_CM_ERR(res, res); res = task->AddKernel(mcKernel); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_MCTASK( CmKernel * kernel, bool reset ) { res = kernel->SetThreadCount(tsWidthMC * tsHeightMC); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidthMC, tsHeightMC, threadSpaceMC2); MCTF_CHECK_CM_ERR(res, res); if (reset) { res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(kernel); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e, threadSpaceMC2); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_TASK( CmKernel * kernel, bool reset, CmThreadSpace * tS ) { res = kernel->SetThreadCount(tsWidth * tsHeight); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidth, tsHeight, tS); MCTF_CHECK_CM_ERR(res, res); if (reset) { res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(kernel); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e, tS); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyThreadSpace(tS); return res; } mfxU8 CMC::SetOverlapOp() { mfxU8 blSize = 0; switch (overlap_Motion) { case MFX_CODINGOPTION_ON: { blSize = VMEBLSIZE / 2; tsHeight = (DIVUP(p_ctrl->CropH, VMEBLSIZE) * 2) - 1;//Motion Estimation of any block size is performed in 16x16 units tsWidthFull = (DIVUP(p_ctrl->CropW, VMEBLSIZE) * 2) - 1; } break; case MFX_CODINGOPTION_UNKNOWN: case MFX_CODINGOPTION_OFF: { blSize = VMEBLSIZE; tsHeight = DIVUP(p_ctrl->CropH, VMEBLSIZE);//Motion Estimation of any block size is performed in 16x16 units tsWidthFull = DIVUP(p_ctrl->CropW, VMEBLSIZE); } break; default: throw CMCRuntimeError(); } tsWidth = tsWidthFull; return blSize; } mfxU8 CMC::SetOverlapOp_half() { mfxU8 blSize = 0; switch (overlap_Motion) { case MFX_CODINGOPTION_ON: { blSize = VMEBLSIZE / 2; tsHeight = DIVUP(p_ctrl->CropH, VMEBLSIZE) - 1;//Motion Estimation of any block size is performed in 16x16 units tsWidthFull = (DIVUP(p_ctrl->CropW, VMEBLSIZE) * 2) - 1; } break; case MFX_CODINGOPTION_OFF: case MFX_CODINGOPTION_UNKNOWN: { blSize = VMEBLSIZE; tsHeight = DIVUP(p_ctrl->CropH, VMEBLSIZE) / 2;//Motion Estimation of any block size is performed in 16x16 units tsWidthFull = DIVUP(p_ctrl->CropW, VMEBLSIZE); } break; default: throw CMCRuntimeError(); } tsWidth = tsWidthFull; return blSize; } mfxI32 CMC::MCTF_RUN_ME( SurfaceIndex * GenxRefs, SurfaceIndex * idxMV ) { time = 0; mfxU8 blSize = SetOverlapOp(); res = MCTF_SET_KERNELMe(GenxRefs, idxMV, DIVUP(p_ctrl->CropX, blSize) , DIVUP(p_ctrl->CropY, blSize), blSize); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMe, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMe(GenxRefs, idxMV, start_mbX, DIVUP(p_ctrl->CropY, blSize), blSize); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMe, task != 0); MCTF_CHECK_CM_ERR(res, res); } return res; } mfxI32 CMC::MCTF_RUN_ME( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, char forwardRefDist, char backwardRefDist ) { mfxU8 blSize = SetOverlapOp(); res = MCTF_SET_KERNELMeBi(GenxRefs, GenxRefs2, idxMV, idxMV2, 0, 0, blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMeB, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMeBi(GenxRefs, GenxRefs2, idxMV, idxMV2, start_mbX, 0, blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMeB, task != 0); MCTF_CHECK_CM_ERR(res, res); } return res; } mfxI32 CMC::MCTF_RUN_ME_MC_HE( SurfaceIndex* GenxRefs, SurfaceIndex* GenxRefs2, SurfaceIndex* idxMV, SurfaceIndex* idxMV2, mfxI8 forwardRefDist, mfxI8 backwardRefDist, mfxU8 mcSufIndex ) { p_ctrl->sTh = MCTF_CHROMAOFF; p_ctrl->th = QfIn[1].filterStrength * 50; res = ctrlBuf->WriteSurface((const mfxU8 *)p_ctrl.get(), NULL, sizeof(MeControlSmall)); MCTF_CHECK_CM_ERR(res, res); time = 0; mfxU8 blSize = SetOverlapOp_half(); mfxU16 multiplier = 2; UINT64 executionTime = 0; tsHeightMC = (DIVUP(p_ctrl->height, blsize) * multiplier); tsWidthFullMC = (DIVUP(p_ctrl->width, blsize) * multiplier); tsWidthMC = tsWidthFullMC; res = MCTF_SET_KERNELMeBiMRE(GenxRefs, GenxRefs2, idxMV, idxMV2, 0, 0, blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); res = MCTF_SET_KERNELMeBiMRE2(GenxRefs, GenxRefs2, idxMV, idxMV2, 0, tsHeight, blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MO) { tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks } if (tsWidthFullMC > CM_MAX_THREADSPACE_WIDTH_FOR_MO) { tsWidthMC = (tsWidthFullMC >> 1) & ~1; // must be even for 32x32 blocks } threadSpace = 0; threadSpace2 = 0; threadSpaceMC = 0; res = kernelMeB->SetThreadCount(tsWidth * tsHeight); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidth, tsHeight, threadSpace); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB->AssociateThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->SetThreadCount(tsWidth * tsHeight); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidth, tsHeight, threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = kernelMeB2->AssociateThreadSpace(threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->SetThreadCount(tsWidthMC * tsHeightMC); MCTF_CHECK_CM_ERR(res, res); res = device->CreateThreadSpace(tsWidthMC, tsHeightMC, threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); res = kernelMc2r->AssociateThreadSpace(threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); if (task) res = task->Reset(); else res = device->CreateTask(task); MCTF_CHECK_CM_ERR(res, res); res = task->AddKernel(kernelMeB); MCTF_CHECK_CM_ERR(res, res); if (pMCTF_NOA_func && p_ctrl->th == MCTFADAPTIVEVAL) { res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; exeTimeT += executionTime / 1000; (this->*(pMCTF_NOA_func))(m_adaptControl); if (QfIn[1].filterStrength == 0) { MctfState = AMCTF_READY; return CM_SUCCESS; } if (mcSufIndex == 0) res = MCTF_SET_KERNELMc2r(0, 0); else if (mcSufIndex == 1) res = MCTF_SET_KERNELMc4r(0, 0, DEN_CLOSE_RUN); else res = MCTF_SET_KERNELMc4r(0, 0, DEN_FAR_RUN); MCTF_CHECK_CM_ERR(res, res); res = task->Reset(); MCTF_CHECK_CM_ERR(res, res); } else { res = task->AddSync(); if (mcSufIndex == 0) res = MCTF_SET_KERNELMc2r(0, 0); else if (mcSufIndex == 1) res = MCTF_SET_KERNELMc4r(0, 0, DEN_CLOSE_RUN); else res = MCTF_SET_KERNELMc4r(0, 0, DEN_FAR_RUN); MCTF_CHECK_CM_ERR(res, res); } res = task->AddKernel(kernelMeB2); MCTF_CHECK_CM_ERR(res, res); res = task->AddSync(); MCTF_CHECK_CM_ERR(res, res); res = task->AddKernel(kernelMc2r); MCTF_CHECK_CM_ERR(res, res); res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); MctfState = AMCTF_READY; res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; if (!pMCTF_NOA_func) { res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); } res = device->DestroyThreadSpace(threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyThreadSpace(threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyVmeSurfaceG7_5(GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyVmeSurfaceG7_5(GenxRefs2); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyTask(task); MCTF_CHECK_CM_ERR(res, res); MctfState = AMCTF_READY; task = 0; return res; } mfxI32 CMC::MCTF_RUN_ME_MC_H( SurfaceIndex * GenxRefs, SurfaceIndex * GenxRefs2, SurfaceIndex * idxMV, SurfaceIndex * idxMV2, mfxI8 forwardRefDist, mfxI8 backwardRefDist, mfxU8 mcSufIndex ) { UINT64 executionTime; mfxU8 blSize = SetOverlapOp_half(); res = MCTF_SET_KERNELMeBi(GenxRefs, GenxRefs2, idxMV, idxMV2, DIVUP(p_ctrl->CropX, blSize), DIVUP(p_ctrl->CropY, blSize), blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); threadSpace = 0; res = MCTF_RUN_TASK(kernelMeB, task != 0); res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; mfxU16 multiplier = 2; tsHeightMC = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFullMC = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidthMC = tsWidthFullMC; if (pMCTF_NOA_func) { res = queue->Enqueue(task, e); MCTF_CHECK_CM_ERR(res, res); res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyTask(task); MCTF_CHECK_CM_ERR(res, res); e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; res = queue->DestroyEvent(e); MCTF_CHECK_CM_ERR(res, res); task = 0; e = 0; (this->*(pMCTF_NOA_func))(m_adaptControl); } else res = task->AddSync(); res = MCTF_SET_KERNELMeBi(GenxRefs, GenxRefs2, idxMV, idxMV2, DIVUP(p_ctrl->CropX, blsize), tsHeight, blSize, forwardRefDist, backwardRefDist); MCTF_CHECK_CM_ERR(res, res); if (mcSufIndex == 0) res = MCTF_SET_KERNELMc2r(DIVUP(p_ctrl->CropX, blSize) * 2, DIVUP(p_ctrl->CropY, blSize) * 2); else if (mcSufIndex == 1) res = MCTF_SET_KERNELMc4r(DIVUP(p_ctrl->CropX, blSize) * 2, DIVUP(p_ctrl->CropY, blSize) * 2, DEN_CLOSE_RUN); else res = MCTF_SET_KERNELMc4r(DIVUP(p_ctrl->CropX, blSize) * 2, DIVUP(p_ctrl->CropY, blSize) * 2, DEN_FAR_RUN); MCTF_CHECK_CM_ERR(res, res); threadSpace2 = 0; threadSpaceMC = 0; MCTF_RUN_DOUBLE_TASK(kernelMeB, kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; res = device->DestroyThreadSpace(threadSpace2); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyThreadSpace(threadSpaceMC); MCTF_CHECK_CM_ERR(res, res); if (threadSpace) { res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); } res = device->DestroyVmeSurfaceG7_5(GenxRefs); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyVmeSurfaceG7_5(GenxRefs2); MCTF_CHECK_CM_ERR(res, res); res = device->DestroyTask(task); MCTF_CHECK_CM_ERR(res, res); res = queue->DestroyEvent(e); task = 0; e = 0; return res; } void CMC::GET_DISTDATA() { for (int y = 0; y < ov_height_bl; y++) { mfxU32 * src = reinterpret_cast(reinterpret_cast(distSys) + y * surfPitch); std::copy(src, src + ov_width_bl, &distRef[y * ov_width_bl]); } } void CMC::GET_DISTDATA_H() { for (int y = 0; y < ov_height_bl / 2; y++) { mfxU32 * src = reinterpret_cast(reinterpret_cast(distSys) + y * surfPitch); std::copy(src, src + ov_width_bl, &distRef[y * ov_width_bl]); } } void CMC::GET_NOISEDATA() { for (int y = 0; y < DIVUP(p_ctrl->CropH, 16); y++) { spatialNoiseAnalysis * src = reinterpret_cast(reinterpret_cast(noiseAnalysisSys) + y * surfNoisePitch); std::copy(src, src + DIVUP(p_ctrl->CropW, 16), &var_sc[y * DIVUP(p_ctrl->CropW, 16)]); } } mfxF64 CMC::GET_TOTAL_SAD() { mfxF64 total_sad = 0.0; // to not lose due-to normalization of floats mfxU64 uTotalSad = 0; switch (overlap_Motion) { case MFX_CODINGOPTION_ON: {//overlapped modes, need to remove extra SAD blocks and lines mfxI32 pos_offset = 0; for (mfxI32 i = 0; i < ov_height_bl; i += OVERLAP_OFFSET) { pos_offset = i * ov_width_bl; for (mfxI32 j = 0; j < ov_width_bl; j += OVERLAP_OFFSET) uTotalSad += distRef[pos_offset + j]; } } break; case MFX_CODINGOPTION_UNKNOWN: case MFX_CODINGOPTION_OFF: {// Non overlapped, all blocks are needed for frame SAD calculation for (mfxU32 i = 0; i < distRef.size(); i++) uTotalSad += distRef[i]; } break; default: throw CMCRuntimeError(); } total_sad = mfxF64(uTotalSad); return total_sad / (p_ctrl->CropW * p_ctrl->CropH); } mfxU16 CalcNoiseStrength( double NSC, double NSAD ) { // 10 epsilons if (std::fabs(NSC) <= 10 * std::numeric_limits::epsilon()) return 0; mfxF64 s, s2, c3 = -907.05, c2 = 752.69, c1 = -175.7, c0 = 14.6, d3 = -0.0000004, d2 = 0.0002, d1 = -0.0245, d0 = 4.1647, ISTC = NSAD * NSC, STC = NSAD / sqrt(NSC); s = c3 * pow(STC, 3.0) + c2 * pow(STC, 2.0) + c1 * STC + c0; s2 = d3 * pow(ISTC, 3.0) + d2 * pow(ISTC, 2.0) + d1 * ISTC + d0; s = NMIN(s, s2) + 5; s = NMAX(0.0, NMIN(20.0, s)); return (mfxU16)(s + 0.5); } mfxU8 CalcSTC(mfxF64 SCpp2, mfxF64 sadpp) { mfxU8 stcVal = 0; sadpp *= sadpp; // Ref was Recon (quantization err in ref biases sad) if (sadpp < 0.03*SCpp2) stcVal = 0; // Very-Low else if (sadpp < 0.09*SCpp2) stcVal = 1; // Low else if (sadpp < 0.20*SCpp2) stcVal = 2; // Low-Medium else if (sadpp < 0.36*SCpp2) stcVal = 3; // Medium else if (sadpp < 1.44*SCpp2) stcVal = 4; // Medium-High else if (sadpp < 3.24*SCpp2) stcVal = 5; // High else stcVal = 6; // VeryHigh return stcVal; } void CMC::GetSpatioTemporalComplexityFrame(mfxU8 currentFrame) { mfxU8 i; mfxF64 SCpp2 = QfIn[currentFrame].frame_sc; static mfxF32 lmt_sc2[10] = { 16.0, 81.0, 225.0, 529.0, 1024.0, 1764.0, 2809.0, 4225.0, 6084.0, (mfxF32)INT_MAX }; // lower limit of SFM(Rs,Cs) range for spatial classification for (i = 0; i < 10; i++) { if (SCpp2 < lmt_sc2[i]) { QfIn[currentFrame].sc = i; break; } } QfIn[currentFrame].tc = 0; QfIn[currentFrame].stc = 0; mfxF64 sadpp = QfIn[currentFrame].frame_sad; static mfxF64 lmt_tc[10] = { 0.75, 1.5, 2.25, 3.00, 4.00, 5.00, 6.00, 7.50, 9.25, mfxF64(INT_MAX) }; // lower limit of AFD for (i = 0; i < 10; i++) { if (sadpp < lmt_tc[i]) { QfIn[currentFrame].tc = i; break; } } QfIn[currentFrame].stc = CalcSTC(SCpp2, sadpp); } mfxU32 CMC::computeQpClassFromBitRate( mfxU8 currentFrame ) { mfxF64 scL = log10(QfIn[currentFrame].sc), sadL = log10(QfIn[currentFrame].frame_sad); mfxF64 d0 = sadL * scL, A, B = -0.75; d0 = pow(d0, 2.03); // 0.567701x + 1.092071 A = 0.567701 * d0 + 1.092071; mfxU32 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 QP_CLASS[54] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; mfxF64 y, qs; y = A * pow(bpp, B); qs = 1.0 + log(y) / log(2.0); mfxU32 QP = (mfxU32)(6.0 * qs) + 4; mfxU32 QCL = (QP > 53) ? 3 : QP_CLASS[QP]; return QCL; } bool CMC::FilterEnable( gpuFrameData frame) { mfxF64 noise_sad = frame.noise_sad; mfxU32 noise_count = frame.noise_count; bool enableFilter = false; //Enabling/Disabling filter model coeficcients mfxF64 s, #if defined(MFX_ENABLE_SOFT_CURVE) c2 = 165.51, c1 = -1614.4, c0 = 4085.7; s = c2 * pow(noise_sad, 2) + c1 * noise_sad + c0; #else c1 = 574.5, c0 = 2409.925; s = c1 * noise_sad + c0; #endif enableFilter = (mfxF64)noise_count > s; return enableFilter; } mfxI32 CMC::noise_estimator( bool adaptControl ) { mfxU8 currentFrame = (number_of_References <= 2) ? 1 : 2, previousFrame = currentFrame - 1; mfxU32 width = DIVUP(p_ctrl->CropW, 16), height = DIVUP(p_ctrl->CropH, 16), count = 0, row, col; mfxI16 fsModVal = 0; mfxF32 tvar = 281, var, SCpp, SADpp; QfIn[currentFrame].noise_var = 0.0, QfIn[currentFrame].noise_sad = 0.0, QfIn[currentFrame].noise_sc = 0.0; QfIn[currentFrame].noise_count = 1; QfIn[currentFrame].frame_sc = 0.0; QfIn[currentFrame].frame_sad = 0.0; QfIn[currentFrame].frame_Cs = 0.0; QfIn[currentFrame].frame_Rs = 0.0; GET_DISTDATA_H(); res = MCTF_RUN_Noise_Analysis(currentFrame); MCTF_CHECK_CM_ERR(res, res); GET_NOISEDATA(); mfxU32 distRefStride = 2 * width; switch (overlap_Motion) { case MFX_CODINGOPTION_ON: { for (row = 1; row < height / 2 - 1; row++) { for (col = 1; col < width - 1; col++) { var = var_sc[row * width + col].var; SCpp = var_sc[row * width + col].SCpp; QfIn[currentFrame].frame_sc += SCpp; SADpp = (mfxF32)(distRef[row * 2 * width * 2 + col * 2] / 256); QfIn[currentFrame].frame_sad += SADpp; if (var < tvar && SCpp 1.0 && (SADpp*SADpp) <= SCpp) { count++; QfIn[currentFrame].noise_var += var; QfIn[currentFrame].noise_sc += SCpp; QfIn[currentFrame].noise_sad += SADpp; } } } } break; case MFX_CODINGOPTION_UNKNOWN: case MFX_CODINGOPTION_OFF: { for (row = 1; row < height / 2 - 1; row++) { for (col = 1; col < width - 1; col++) { var = var_sc[row * width + col].var; SCpp = var_sc[row * width + col].SCpp; QfIn[currentFrame].frame_sc += SCpp; // NB: division by 256 is done in integers; // thus, for each calculation, 8 LSB are truncated // works good; but additional efforts can be taken, // to consider higher precision (thru calculations in integers) // followed by wise truncating. SADpp = (mfxF32)((distRef[row * 2 * distRefStride + col * 2] + distRef[row * 2 * distRefStride + col * 2 + 1] + distRef[(row * 2 + 1) * distRefStride + col * 2] + distRef[(row * 2 + 1) * distRefStride + col * 2 + 1]) / 256); QfIn[currentFrame].frame_sad += SADpp; if (var < tvar && SCpp 1.0 && (SADpp*SADpp) <= SCpp) { ++count; QfIn[currentFrame].noise_var += var; QfIn[currentFrame].noise_sc += SCpp; QfIn[currentFrame].noise_sad += SADpp; } } } } break; default: throw CMCRuntimeError(); } QfIn[currentFrame].frame_sc /= ((height / 2 - 2) * (width - 2)); QfIn[currentFrame].frame_sad /= ((height / 2 - 2) * (width - 2)); if (count) { // noise_count is reserved for future use. QfIn[currentFrame].noise_count = count; QfIn[currentFrame].noise_var /= count; QfIn[currentFrame].noise_sc /= count; QfIn[currentFrame].noise_sad /= count; } mfxU16 filterstrength = MCTFSTRENGTH; if (QfIn[currentFrame].scene_idx != QfIn[previousFrame].scene_idx) { filterstrength = QfIn[previousFrame].filterStrength; } else { filterstrength = CalcNoiseStrength(QfIn[currentFrame].noise_sc, QfIn[currentFrame].noise_sad); if (bitrate_Adaptation) { GetSpatioTemporalComplexityFrame(currentFrame); mfxU32 QLC = computeQpClassFromBitRate(currentFrame); if (QLC == 0) fsModVal = QfIn[currentFrame].stc > 0.35 ? -2 : -1; else if (QLC == 1) fsModVal = 0; else if (QLC == 2) fsModVal = 1; else fsModVal = 2; mfxI32 limit = filterstrength > 14 ? 13 : 20; filterstrength = mfxU16(max(0, min(limit, (mfxI16)filterstrength + fsModVal))); } } if (adaptControl) { filterstrength = FilterEnable(QfIn[currentFrame]) ? filterstrength : MCTFNOFILTER; m_doFilterFrame = !!filterstrength; } QfIn[currentFrame].filterStrength = filterstrength; gopBasedFilterStrength = filterstrength; if (adaptControl) res = SetFilterStrenght(filterstrength, MCTFNOFILTER); else res = SetFilterStrenght(filterstrength); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_Noise_Analysis(mfxU8 srcNum) { res = MCTF_SET_KERNEL_Noise(srcNum, DIVUP(p_ctrl->CropX, 16), DIVUP(p_ctrl->CropY, 16)); MCTF_CHECK_CM_ERR(res, res); mfxU16 tsHeightNA = DIVUP(p_ctrl->CropH, 16), tsWidthFullNA = DIVUP(p_ctrl->CropW, 16), tsWidthNA = tsWidthFullNA; if (tsWidthFullNA > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidthNA = (tsWidthFullNA >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK_NA(kernelNoise, task != 0, tsWidthNA, tsHeightNA); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNEL_Noise(srcNum, start_mbX, DIVUP(p_ctrl->CropY, 16)); MCTF_CHECK_CM_ERR(res, res); if (threadSpace != NULL) { res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); } // the rest of frame TS res = MCTF_RUN_TASK_NA(kernelNoise, task != 0, tsWidthNA, tsHeightNA); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND() { mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc(DIVUP(p_ctrl->CropX, blsize) * multiplier, DIVUP(p_ctrl->CropY, blsize) * multiplier, 1, 0); MCTF_CHECK_CM_ERR(res, res); tsHeight = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFull = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc1r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier, 1, 0); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMc1r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); UINT64 executionTime; e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND( mfxU8 srcNum, mfxU8 refNum ) { mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc(DIVUP(p_ctrl->CropX, blsize) * multiplier , DIVUP(p_ctrl->CropY, blsize) * multiplier, srcNum, refNum); MCTF_CHECK_CM_ERR(res, res); tsHeight = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFull = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc1r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier, srcNum, refNum); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMc1r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND2R() { mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc2r(DIVUP(p_ctrl->CropX, blsize) * multiplier, DIVUP(p_ctrl->CropY, blsize) * multiplier); MCTF_CHECK_CM_ERR(res, res); tsHeightMC = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFullMC = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidthMC = tsWidthFullMC; if (tsWidthFullMC > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidthMC = (tsWidthFullMC >> 1) & ~1; // must be even for 32x32 blocks threadSpaceMC = 0; res = MCTF_RUN_MCTASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidthMC; tsWidthMC = tsWidthFullMC - tsWidthMC; res = MCTF_SET_KERNELMc2r(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_MCTASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); UINT64 executionTime; e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; device->DestroyThreadSpace(threadSpaceMC); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND2R_DEN() { mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc2rDen(DIVUP(p_ctrl->CropX, blsize) * multiplier, DIVUP(p_ctrl->CropY, blsize) * multiplier); MCTF_CHECK_CM_ERR(res, res); tsHeight = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFull = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc2rDen(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND4R( DRT typeRun ) { if (typeRun > 1) return MFX_ERR_INVALID_VIDEO_PARAM; mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc4r(DIVUP(p_ctrl->CropX, blsize) * multiplier, DIVUP(p_ctrl->CropY, blsize) * multiplier, (mfxU8)typeRun); MCTF_CHECK_CM_ERR(res, res); tsHeight = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFull = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc4r(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier, (mfxU8)typeRun); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_MERGE() { res = MCTF_SET_KERNELMcMerge(DIVUP(p_ctrl->CropX, 16), DIVUP(p_ctrl->CropY, 16)); MCTF_CHECK_CM_ERR(res, res); tsHeight = DIVUP(p_ctrl->CropH, 16); tsWidthFull = DIVUP(p_ctrl->CropW, 16); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc4r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc4r(start_mbX, DIVUP(p_ctrl->CropY, 16)); MCTF_CHECK_CM_ERR(res, res); // the rest of frame TS res = MCTF_RUN_TASK(kernelMc4r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } mfxI32 CMC::MCTF_RUN_BLEND4R( SurfaceIndex * multiIndex ) { mfxU16 multiplier = 2; res = MCTF_SET_KERNELMc4r(DIVUP(p_ctrl->CropX, blsize) * multiplier, DIVUP(p_ctrl->CropY, blsize) * multiplier, multiIndex); MCTF_CHECK_CM_ERR(res, res); tsHeight = (DIVUP(p_ctrl->CropH, blsize) * multiplier); tsWidthFull = (DIVUP(p_ctrl->CropW, blsize) * multiplier); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELMc4r(start_mbX, DIVUP(p_ctrl->CropY, blsize) * multiplier, multiIndex); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_TASK(kernelMc2r, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); e = 0; return res; } void CMC::RotateBufferA() { std::swap(QfIn[0], QfIn[1]); std::swap(QfIn[0], QfIn[2]); } void CMC::RotateBufferB() { std::swap(QfIn[0], QfIn[1]); std::swap(QfIn[1], QfIn[2]); std::swap(QfIn[2], QfIn[3]); } void CMC::RotateBuffer() { mfxU8 correction = ((QfIn.size() > 3) && (firstFrame < 3)) << 1; for (mfxU8 i = 0; i < QfIn.size() - 1 - correction; i++) std::swap(QfIn[i], QfIn[i + 1]); } void CMC::AssignSceneNumber() { for (mfxU8 i = 0; i < QfIn.size(); i++) scene_numbers[i] = QfIn[i].scene_idx; } mfxI32 CMC::MCTF_RUN_ME_1REF() { res = MCTF_RUN_ME(genxRefs1, idxMv_1); MCTF_CHECK_CM_ERR(res, res); res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); UINT64 executionTime; e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; device->DestroyThreadSpace(threadSpace); queue->DestroyEvent(e); device->DestroyVmeSurfaceG7_5(genxRefs1); e = 0; if (pMCTF_NOA_func) (this->*(pMCTF_NOA_func))(m_adaptControl); return res; } mfxI32 CMC::MCTF_RUN_ME_2REF_HE() { res = MCTF_RUN_ME_MC_HE(genxRefs1, genxRefs2, idxMv_1, idxMv_2, forward_distance, backward_distance, 0); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_ME_2REF() { res = MCTF_RUN_ME_MC_H(genxRefs1, genxRefs2, idxMv_1, idxMv_2, forward_distance, backward_distance, 0); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_ME_4REF() { res = MCTF_RUN_ME_MC_H(genxRefs1, genxRefs2, idxMv_1, idxMv_2, forward_distance, backward_distance, 1); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_ME_MC_H(genxRefs3, genxRefs4, idxMv_3, idxMv_4, forward_distance, backward_distance, 2); return res; } mfxI32 CMC::MCTF_BLEND4R() { res = MCTF_RUN_BLEND4R(DEN_CLOSE_RUN); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_BLEND4R(DEN_FAR_RUN); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_MERGE(); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_MCTF_DEN_1REF( bool ) { if (pMCTF_LOAD_func) { res = (this->*(pMCTF_LOAD_func))(); MCTF_CHECK_CM_ERR(res, res); } AssignSceneNumber(); if (pMCTF_ME_func) { res = (this->*(pMCTF_ME_func))(); MCTF_CHECK_CM_ERR(res, res); } if (pMCTF_MERGE_func) { res = (this->*(pMCTF_MERGE_func))(); MCTF_CHECK_CM_ERR(res, res); } if (pMCTF_SpDen_func) res = (this->*(pMCTF_SpDen_func))(); RotateBuffer(); return res; } mfxI32 CMC::MCTF_RUN_MCTF_DEN( bool notInPipeline ) { if ((QfIn[1].filterStrength > 0) || notInPipeline) { if (pMCTF_LOAD_func) { res = (this->*(pMCTF_LOAD_func))(); MCTF_CHECK_CM_ERR(res, res); } AssignSceneNumber(); if (pMCTF_ME_func) { res = (this->*(pMCTF_ME_func))(); MCTF_CHECK_CM_ERR(res, res); } if (pMCTF_MERGE_func) { res = (this->*(pMCTF_MERGE_func))(); MCTF_CHECK_CM_ERR(res, res); } if (pMCTF_SpDen_func) res = (this->*(pMCTF_SpDen_func))(); } RotateBuffer(); return res; } mfxI32 CMC::MCTF_RUN_MCTF_DEN_4REF( bool ) { res = (this->*(pMCTF_LOAD_func))(); MCTF_CHECK_CM_ERR(res, res); AssignSceneNumber(); res = (this->*(pMCTF_ME_func))(); MCTF_CHECK_CM_ERR(res, res); res = (this->*(pMCTF_MERGE_func))(); MCTF_CHECK_CM_ERR(res, res); if (pMCTF_SpDen_func) res = (this->*(pMCTF_SpDen_func))(); RotateBuffer(); return res; } mfxI32 CMC::MCTF_RUN_AMCTF_DEN() { res = (this->*(pMCTF_LOAD_func))(); MCTF_CHECK_CM_ERR(res, res); AssignSceneNumber(); res = MCTF_RUN_ME(genxRefs1, genxRefs2, idxMv_1, idxMv_2, forward_distance, backward_distance); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_BLEND2R(); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_Denoise(); MCTF_CHECK_CM_ERR(res, res); RotateBuffer(); return res; } mfxI32 CMC::MCTF_RUN_AMCTF() { res = MCTF_RUN_Denoise(1); MCTF_CHECK_CM_ERR(res, res); return res; } mfxI32 CMC::MCTF_RUN_AMCTF(mfxU16 srcNum) { res = MCTF_RUN_Denoise(srcNum); MCTF_CHECK_CM_ERR(res, res); MctfState = AMCTF_READY; return res; } mfxI32 CMC::MCTF_RUN_Denoise(mfxU16 srcNum) { if (QfIn[srcNum].filterStrength == 21) p_ctrl->sTh = MCTFSTRENGTH * 50 / 25; else p_ctrl->sTh = QfIn[srcNum].filterStrength * 50 / 25; res = ctrlBuf->WriteSurface((const mfxU8 *)p_ctrl.get(), NULL, sizeof(MeControlSmall)); MCTF_CHECK_CM_ERR(res, res); res = MCTF_SET_KERNELDe(srcNum, 0, 0); MCTF_CHECK_CM_ERR(res, res); p_ctrl->sTh = 0; tsHeight = DIVUP(p_ctrl->height, 8); tsWidthFull = DIVUP(p_ctrl->width, 8); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks } threadSpace = 0; res = MCTF_RUN_TASK(kernelMcDen, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELDe(srcNum, start_mbX, 0); MCTF_CHECK_CM_ERR(res, res); if (threadSpace != NULL) { res = device->DestroyThreadSpace(threadSpace); MCTF_CHECK_CM_ERR(res, res); } // the rest of frame TS res = MCTF_RUN_TASK(kernelMcDen, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); UINT64 executionTime; e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; return res; } mfxI32 CMC::MCTF_RUN_Denoise() { res = MCTF_SET_KERNELDe(DIVUP(p_ctrl->CropX, 8), DIVUP(p_ctrl->CropY, 8)); MCTF_CHECK_CM_ERR(res, res); tsHeight = DIVUP(p_ctrl->CropH, 8); tsWidthFull = DIVUP(p_ctrl->CropW, 8); tsWidth = tsWidthFull; if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) tsWidth = (tsWidthFull >> 1) & ~1; // must be even for 32x32 blocks threadSpace = 0; res = MCTF_RUN_TASK(kernelMcDen, task != 0); MCTF_CHECK_CM_ERR(res, res); if (tsWidthFull > CM_MAX_THREADSPACE_WIDTH_FOR_MW) { mfxU16 start_mbX = tsWidth; tsWidth = tsWidthFull - tsWidth; res = MCTF_SET_KERNELDe(start_mbX, DIVUP(p_ctrl->CropY, 8)); MCTF_CHECK_CM_ERR(res, res); res = MCTF_RUN_TASK(kernelMcDen, task != 0); MCTF_CHECK_CM_ERR(res, res); } res = e->WaitForTaskFinished(); MCTF_CHECK_CM_ERR(res, res); UINT64 executionTime; e->GetExecutionTime(executionTime); exeTime += executionTime / 1000; return res; } mfxU32 CMC::IM_SURF_PUT( CmSurface2D *p_surface, mfxU8 *p_data) { CM_STATUS status = CM_STATUS_FLUSHED; res = queue->EnqueueCopyCPUToGPU(p_surface, p_data, copyEv); MCTF_CHECK_CM_ERR(res, res); copyEv->GetStatus(status); while (status != CM_STATUS_FINISHED) copyEv->GetStatus(status); return res; } void CMC::IntBufferUpdate( bool isSceneChange, bool isIntraFrame, bool doIntraFiltering) { size_t buffer_size = QfIn.size() - 1; if (bufferCount > buffer_size) { printf("Error: Invalid frame buffer position\n"); exit(-1); } if (bufferCount == 0) QfIn.back().frame_number = 0; else QfIn.back().frame_number = (QfIn.end() - 2)->frame_number + 1; if (!firstFrame) sceneNum += isSceneChange; QfIn.back().isSceneChange = (firstFrame || isSceneChange); QfIn.back().isIntra = isIntraFrame; if (isSceneChange || isIntraFrame || bufferCount == 0) countFrames = 0; else countFrames++; QfIn.back().frame_relative_position = countFrames; QfIn.back().frame_added = false; QfIn.back().scene_idx = sceneNum; if((QfIn.back().isSceneChange || QfIn.back().isIntra) && doIntraFiltering) m_doFilterFrame = true; } void CMC::BufferFilterAssignment( mfxU16 * filterStrength, bool doIntraFiltering, bool isAnchorFrame, bool isSceneChange) { if (!filterStrength) { if (isAnchorFrame && isSceneChange) { QfIn.back().filterStrength = doIntraFiltering ? MCTFSTRENGTH : MCTFNOFILTER; #ifdef MFX_MCTF_DEBUG_PRINT ASC_PRINTF("\nI frame denoising is: %i, strength set at: %i\n", doIntraFiltering, QfIn[bufferCount].filterStrength)); #endif gopBasedFilterStrength = MCTFADAPTIVE; } else if (isAnchorFrame) QfIn.back().filterStrength = gopBasedFilterStrength; else QfIn.back().filterStrength = MCTFNOFILTER; } else QfIn.back().filterStrength = *filterStrength; } mfxStatus CMC::MCTF_PUT_FRAME( void * frameInData, mfxHDLPair frameOutHandle, CmSurface2D ** frameOutData, bool isCmSurface, mfxU16 * filterStrength, bool needsOutput, bool doIntraFiltering ) { if (!frameInData) return MFX_ERR_UNDEFINED_BEHAVIOR; if (isCmSurface) { mfxFrameSurface1 * mfxFrame = (mfxFrameSurface1 *)frameInData; mfxHDLPair handle; QfIn.back().mfxFrame = mfxFrame; MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*QfIn.back().mfxFrame, handle)); MFX_SAFE_CALL(IM_SURF_SET(reinterpret_cast(handle.first), &QfIn.back().frameData, &QfIn.back().fIdx)); } else { res = IM_SURF_PUT(QfIn.back().frameData, (mfxU8*)frameInData); MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); } QfIn.back().frame_added = true; if (needsOutput) { SurfaceIndex *fIdx = nullptr; MFX_SAFE_CALL(IM_SURF_SET(reinterpret_cast(frameOutHandle.first), frameOutData, &fIdx)); QfIn.back().fOut = *frameOutData; QfIn.back().fIdxOut = fIdx; } if (m_doFilterFrame) BufferFilterAssignment(filterStrength, doIntraFiltering, needsOutput, QfIn.back().isSceneChange); else QfIn.back().filterStrength = MCTFNOFILTER; return MFX_ERR_NONE; } mfxStatus CMC::MCTF_PUT_FRAME( IntMctfParams * pMctfControl, CmSurface2D * InSurf, CmSurface2D * OutSurf ) { lastFrame = 0; if (!InSurf) return MFX_ERR_UNDEFINED_BEHAVIOR; INT cmSts = 0; SurfaceIndex* idxFrom; cmSts = InSurf->GetIndex(idxFrom); MFX_CHECK((CM_SUCCESS == cmSts), MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(pSCD->PutFrameProgressive(idxFrom)); MCTF_PUT_FRAME( pMctfControl, OutSurf, pSCD->Get_frame_shot_Decision() ); return MFX_ERR_NONE; } mfxStatus CMC::MCTF_PUT_FRAME( IntMctfParams * pMctfControl, CmSurface2D * OutSurf, mfxU32 schgDesicion ) { lastFrame = 0; sceneNum += schgDesicion; MFX_SAFE_CALL(MCTF_UpdateRTParams(pMctfControl)); MFX_SAFE_CALL(MCTF_PUT_FRAME(sceneNum, OutSurf)); forward_distance = -1; backward_distance = 1; countFrames++; return MFX_ERR_NONE; } mfxStatus CMC::MCTF_DO_FILTERING_IN_AVC() { // do filtering based on temporal mode & how many frames are // already in the queue: res = MFX_ERR_NONE; switch (number_of_References) { case 2://else if (number_of_References == 2) { if (bufferCount < 2) /*One frame delay*/ { firstFrame = 0; RotateBuffer(); MctfState = AMCTF_NOT_READY; return MFX_ERR_NONE; } MCTF_UpdateANDApplyRTParams(1); if (QfIn[1].fOut) { mco = QfIn[1].fOut; idxMco = QfIn[1].fIdxOut; if (QfIn[1].isSceneChange) { if(QfIn[1].filterStrength) res = MCTF_RUN_AMCTF(1); RotateBuffer(); } else res = (this->*(pMCTF_func))(false); CurrentIdx2Out = DefaultIdx2Out; MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); QfIn.front().fOut = mco = nullptr; QfIn.front().fIdxOut = idxMco = nullptr; } else RotateBuffer(); break; }; break; default:// else return MFX_ERR_UNDEFINED_BEHAVIOR; } return MFX_ERR_NONE; } mfxU16 CMC::MCTF_QUERY_FILTER_STRENGTH() { return QfIn[1].filterStrength; } mfxStatus CMC::MCTF_DO_FILTERING() { // do filtering based on temporal mode & how many frames are // already in the queue: switch (number_of_References) { case 4://if (number_of_References == 4) { if (bufferCount < 3) { MctfState = AMCTF_NOT_READY; mco = nullptr; return MFX_ERR_NONE; } switch (firstFrame) { case 1: { pMCTF_MERGE_func = NULL; // check is it correct that the current frame is 0? MCTF_UpdateANDApplyRTParams(0); pMCTF_ME_func = &CMC::MCTF_RUN_ME_2REF; pMCTF_LOAD_func = &CMC::MCTF_LOAD_2REF; RotateBufferA(); res = MCTF_RUN_MCTF_DEN(true); CurrentIdx2Out = 0; MctfState = AMCTF_READY; firstFrame = 2; break; } case 2: { // check is it correct that the current frame is 1? MCTF_UpdateANDApplyRTParams(1); res = MCTF_RUN_MCTF_DEN(true); RotateBufferA(); CurrentIdx2Out = 1; MctfState = AMCTF_READY; firstFrame = 3; pMCTF_MERGE_func = &CMC::MCTF_RUN_MERGE; pMCTF_ME_func = &CMC::MCTF_RUN_ME_4REF; pMCTF_LOAD_func = &CMC::MCTF_LOAD_4REF; break; } default: { MCTF_UpdateANDApplyRTParams(2); res = (this->*(pMCTF_func))(true); CurrentIdx2Out = DefaultIdx2Out; MctfState = AMCTF_READY; break; } } }; break; case 2://else if (number_of_References == 2) { if (bufferCount < 2) /*One frame delay*/ { MctfState = AMCTF_NOT_READY; mco = nullptr; return MFX_ERR_NONE; } switch (firstFrame) { case 0: { MCTF_UpdateANDApplyRTParams(1); res = (this->*(pMCTF_func))(true); CurrentIdx2Out = DefaultIdx2Out; MctfState = AMCTF_READY; break; } default: { MCTF_UpdateANDApplyRTParams(0); res = MCTF_RUN_AMCTF(0); firstFrame = 0; CurrentIdx2Out = 0; MctfState = AMCTF_READY; break; } } }; break; case 1: //else if (number_of_References == 1) { if (firstFrame) { MCTF_UpdateANDApplyRTParams(0); res = MCTF_RUN_AMCTF(0); firstFrame = 0; MctfState = AMCTF_READY; } else { MCTF_UpdateANDApplyRTParams(1); if (QfIn[0].scene_idx != QfIn[1].scene_idx) { res = MCTF_RUN_AMCTF(); RotateBuffer(); } else res = (this->*(pMCTF_func))(true); MctfState = AMCTF_READY; } CurrentIdx2Out = DefaultIdx2Out; }; break; case 0://else if (number_of_References == 0) { MCTF_UpdateANDApplyRTParams(0); res = MCTF_RUN_AMCTF(0); firstFrame = 0; MctfState = AMCTF_READY; CurrentIdx2Out = DefaultIdx2Out; }; break; default:// else return MFX_ERR_UNDEFINED_BEHAVIOR; } MCTF_CHECK_CM_ERR(res, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } void CMC::MCTF_CLOSE() { if (kernelMe) device->DestroyKernel(kernelMe); if (kernelMeB) device->DestroyKernel(kernelMeB); if (kernelMeB2) device->DestroyKernel(kernelMeB2); if (kernelMcDen) device->DestroyKernel(kernelMcDen); if (kernelMc1r) device->DestroyKernel(kernelMc1r); if (kernelMc2r) device->DestroyKernel(kernelMc2r); if (kernelMc4r) device->DestroyKernel(kernelMc4r); if (programMe) device->DestroyProgram(programMe); if (programMc) device->DestroyProgram(programMc); if (programDe) device->DestroyProgram(programDe); if (ctrlBuf) device->DestroySurface(ctrlBuf); if (task) device->DestroyTask(task); if (e) queue->DestroyEvent(e); if (copyEv) queue->DestroyEvent(copyEv); if (mco2) device->DestroySurface(mco2); if (idxMv_1) { device->DestroySurface2DUP(mv_1); CM_ALIGNED_FREE(mvSys1); } if (idxMv_2) { device->DestroySurface2DUP(mv_2); CM_ALIGNED_FREE(mvSys2); } if (idxMv_3) { device->DestroySurface2DUP(mv_3); CM_ALIGNED_FREE(mvSys3); } if (idxMv_4) { device->DestroySurface2DUP(mv_4); CM_ALIGNED_FREE(mvSys4); } if (distSurf) { device->DestroySurface2DUP(distSurf); CM_ALIGNED_FREE(distSys); } if (noiseAnalysisSurf) { device->DestroySurface2DUP(noiseAnalysisSurf); CM_ALIGNED_FREE(noiseAnalysisSys); } if (pSCD) { pSCD->Close(); pSCD = nullptr; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/000077500000000000000000000000001443134507600241675ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/000077500000000000000000000000001443134507600256125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_enc_common.h000066400000000000000000000312341443134507600320470ustar00rootroot00000000000000// Copyright (c) 2010-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENC_COMMON_H__ #define __MFX_MPEG2_ENC_COMMON_H__ // functions for VideoEditing #include "mfx_common.h" #include "mfxvideo.h" class SHParametersEx { public: SHParametersEx() { m_pBuffer = 0; m_bufLen = 0; } ~SHParametersEx() { if (m_pBuffer) { delete [] m_pBuffer; } } void GetSH (mfxU8 **pSH, mfxU32 *len) { *pSH = m_pBuffer; *len = m_bufLen; } static bool CheckSHParameters (mfxU8 *pSH, mfxU32 len, mfxU32 &real_len, mfxVideoParam *par, mfxExtCodingOption * extOpt) { real_len = 0; return DecodeSequenceHeader (pSH,len, par, extOpt, real_len); } mfxStatus FillSHParameters (mfxVideoParam* par, mfxExtCodingOption * extOpt) { mfxU8 *pSH = nullptr; mfxU32 len = 0; mfxU32 real_len = 0; if (GetSPSBuffer(par, &pSH, &len)) { if (!DecodeSequenceHeader (pSH,len, par, extOpt, real_len)) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; delete [] m_pBuffer; m_pBuffer = new mfxU8 [real_len]; std::copy(pSH, pSH + real_len, m_pBuffer); m_bufLen = real_len; } return MFX_ERR_NONE; } static bool GetSPSBuffer(mfxVideoParam* par, mfxU8 **ppSH, mfxU32 *pLen) { mfxExtCodingOptionSPSPPS* pCO = GetExtCodingOptionsSPSPPS(par->ExtParam, par->NumExtParam); if (pCO) { if (pCO->SPSBuffer && pCO->SPSBufSize!=0) { *ppSH = pCO->SPSBuffer; *pLen = pCO->SPSBufSize; return true; } } *ppSH = 0; *pLen = 0; return false; } static mfxExtCodingOptionSPSPPS* GetExtCodingOptionsSPSPPS(mfxExtBuffer** ebuffers, mfxU32 nbuffers) { if (ebuffers) { for(mfxU32 i=0; iBufferId == MFX_EXTBUFF_CODING_OPTION_SPSPPS) { return (mfxExtCodingOptionSPSPPS*)(*(ebuffers+i)); } } } return 0; } protected: // VideoEncode methods #define _GetBits(n,out) \ {\ mfxU32 bitreaded = 0;\ \ out = 0;\ if (ptr - pSH > (mfxI32)len - ((n+7)>>3))\ return false;\ \ while (n > bitreaded)\ {\ mfxU32 t = ((*ptr) << bitpos) &0xff;\ if (n - bitreaded >= 8 - bitpos)\ {\ Ipp32u num_bits = 8 - bitpos;\ t = t >> (8-num_bits);\ out = (out <> (8-num_bits);\ out = (out < // par_h / par_v == dar_h * height / (dar_v * width) mfxU32 simple_tab[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; mfxU32 i, denom; // suppose no overflow of 32s mfxU32 h = dar_h * height; mfxU32 v = dar_v * width; // remove common multipliers while( ((h|v)&1) == 0 ) { h>>=1; v>>=1; } for(i=0;i 4 || !aspect_ratio) return false; switch(aspect_ratio) { case 1: par->mfx.FrameInfo.AspectRatioH = 1; par->mfx.FrameInfo.AspectRatioW = 1; break; case 2: DARtoPAR(w, h, 4, 3, &par->mfx.FrameInfo.AspectRatioW , &par->mfx.FrameInfo.AspectRatioH); break; case 3: DARtoPAR(w, h, 16, 9, &par->mfx.FrameInfo.AspectRatioW , &par->mfx.FrameInfo.AspectRatioH); break; case 4: DARtoPAR(w, h, 221, 100, &par->mfx.FrameInfo.AspectRatioW , &par->mfx.FrameInfo.AspectRatioH); break; default: return false; } _GetBits (4,frame_rate_code); if (frame_rate_code > 8 || !frame_rate_code) return false; _GetBits (18,temp); //bitrate temp = ((temp)*400)/1000; if (temp > 0x0000FFFF) return false; if (temp != 0) { par->mfx.TargetKbps = (mfxU16)temp; par->mfx.RateControlMethod = MFX_RATECONTROL_CBR; } _GetBits (1,temp); if (!temp) return false; _GetBits (10, vbv_buffer_size); _GetBits (1,temp); if (temp) return false; _GetBits (1,temp); // intra quant matrix if (temp) return false; _GetBits (1,temp); // inter quant matrix if (temp) return false; if (bitpos!=0) { ptr ++; bitpos = 0; } while ( *ptr == 0 && ptr - pSH < (mfxI32)len) { ptr ++; } temp = 0; if (ptr - pSH >= (mfxI32)len - 3) return false; _GetBits (8,temp); if (temp != 0x01) return false; _GetBits (12,temp); // start code if (temp != 0x0B51) return false; _GetBits (1,temp); // escape bit _GetBits (3,temp); // profile switch(temp) { case 5: par->mfx.CodecProfile = MFX_PROFILE_MPEG2_SIMPLE; break; case 4: par->mfx.CodecProfile = MFX_PROFILE_MPEG2_MAIN; break; case 6: par->mfx.CodecProfile = MFX_PROFILE_MPEG2_HIGH; break; default: return false; } _GetBits (4,temp); // level switch(temp) { case 10: par->mfx.CodecLevel = MFX_LEVEL_MPEG2_LOW; break; case 8: par->mfx.CodecLevel = MFX_LEVEL_MPEG2_MAIN; break; case 6: par->mfx.CodecLevel = MFX_LEVEL_MPEG2_HIGH1440; break; case 4: par->mfx.CodecLevel = MFX_LEVEL_MPEG2_HIGH; break; default: return false; } _GetBits (1,temp); // progressive if (temp == 1) { par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } else { par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; if (extOpt) extOpt->FramePicture = MFX_CODINGOPTION_ON; } _GetBits (2,temp); //chroma format if (temp != 1) return false; par->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; _GetBits (2,temp); // ext h if (temp != 0) return false; _GetBits (2,temp); // ext w if (temp != 0) return false; _GetBits (12,temp); //bitrate ex if (temp != 0) return false; _GetBits (1,temp); if (temp != 1) return false; _GetBits (8,temp); // vbv_buffer_size_ext vbv_buffer_size |= (temp << 10); par->mfx.BufferSizeInKB = mfxU16(std::min(0xffff, 2 * vbv_buffer_size)); _GetBits (1,temp); //low delay if (temp == 1) return false; _GetBits (2,frame_rate_code_n); _GetBits (5,frame_rate_code_d); if (bitpos!=0) { ptr ++; bitpos = 0; } while ( *ptr == 0 && ptr - pSH < (mfxI32)len) { ptr ++; } temp = 0; if (ptr - pSH < (mfxI32)len - 3) { _GetBits (8,temp); if (temp != 0x01) return false; _GetBits (12,temp); // start code } par->mfx.FrameInfo.CropX = 0; par->mfx.FrameInfo.CropY = 0; par->mfx.FrameInfo.CropW = (mfxU16) w; par->mfx.FrameInfo.CropH = (mfxU16) h; par->mfx.FrameInfo.Width = par->mfx.FrameInfo.Width > (mfxU16)(((w+15)/16)*16)? par->mfx.FrameInfo.Width : (mfxU16)(((w+15)/16)*16); if (par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) { par->mfx.FrameInfo.Height = par->mfx.FrameInfo.Height> (mfxU16)(((h+15)/16)*16)? par->mfx.FrameInfo.Height: (mfxU16)(((h+15)/16)*16); } else { par->mfx.FrameInfo.Height = par->mfx.FrameInfo.Height> (mfxU16)(((h+31)/32)*32)? par->mfx.FrameInfo.Height: (mfxU16)(((h+31)/32)*32); } par->mfx.FrameInfo.FrameRateExtD = (frame_rate_code_d + 1)*frame_rate_value_d[frame_rate_code]; par->mfx.FrameInfo.FrameRateExtN = (frame_rate_code_n + 1)*frame_rate_value_n[frame_rate_code]; if (temp == 0x0B52) { _GetBits (3,temp); //video format if (temp > 5) return false; _GetBits (1,temp); //colour_description if (temp) { _GetBits (24,temp); } _GetBits (14,temp); if (temp != w) return false; _GetBits (1,temp); if (temp != 1) return false; _GetBits (14,temp); if (temp != h) return false; if (bitpos!=0) { ptr ++; bitpos = 0; } } real_len = (mfxU32)(ptr - pSH); return true; } #undef _GetBits private: mfxU8* m_pBuffer; mfxU32 m_bufLen; // Declare private copy constructor to avoid accidental assignment SHParametersEx (const SHParametersEx &); SHParametersEx & operator = (const SHParametersEx &); }; #endifoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_enc_common_hw.h000066400000000000000000000070121443134507600325420ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENC_COMMON_HW_H__ #define __MFX_MPEG2_ENC_COMMON_HW_H__ #include "mfx_common.h" #include "mfx_ext_buffers.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #define D3DDDIFORMAT D3DFORMAT #define DXVADDI_VIDEODESC DXVA2_VideoDesc #include "mfx_h264_encode_struct_vaapi.h" #include "mfxstructures.h" #include #include #ifdef MPEG2_ENC_HW_PERF struct Time { std::chrono::steady_clock::time_point start; std::chrono::steady_clock::duration timeSpan; }; #endif #define ENCODE_ENC_CTRL_CAPS ENCODE_ENC_CTRL_CAPS //#define __SW_ENC //#define MPEG2_ENCODE_HW_PERF //#define MPEG2_ENC_HW_PERF //#define MPEG2_ENCODE_DEBUG_HW enum { MFX_MPEG2_TOP_FIELD = 1, MFX_MPEG2_BOTTOM_FIELD = 2, MFX_MPEG2_FRAME_PICTURE = 3 }; struct mfxVideoParamEx_MPEG2 { mfxVideoParam mfxVideoParams; bool bFieldCoding; mfxU32 MVRangeP[2]; mfxU32 MVRangeB[2][2]; bool bAllowFieldPrediction; bool bAllowFieldDCT; bool bAddEOS; bool bRawFrames; mfxFrameAllocResponse* pRecFramesResponse_hw; mfxFrameAllocResponse* pRecFramesResponse_sw; mfxExtVideoSignalInfo videoSignalInfo; bool bAddDisplayExt; bool bMbqpMode; bool bDisablePanicMode; }; namespace MfxHwMpeg2Encode { #define NUM_FRAMES 800 struct ExtVASurface { VASurfaceID surface; mfxU32 number; mfxU32 idxBs; }; typedef std::vector mfxRecFrames; typedef std::vector mfxRawFrames; typedef struct tagENCODE_SET_VUI_PARAMETER_MPEG2 { UINT video_format : 3; UINT : 4; UINT colour_description : 1; UINT colour_primaries : 8; UINT transfer_characteristics : 8; UINT matrix_coefficients : 8; UINT display_horizontal_size : 14; UINT : 2; UINT display_vertical_size : 14; UINT : 2; } ENCODE_SET_VUI_PARAMETER_MPEG2; typedef std::vector mfxFeedback; mfxStatus QueryHwCaps(VideoCORE* core, ENCODE_CAPS & hwCaps, mfxU16 codecProfile); }; // namespace MfxHwMpeg2Encode #endif #endif /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_debug_hw.h000066400000000000000000000104451443134507600330340ustar00rootroot00000000000000// Copyright (c) 2002-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #ifndef __MFX_MPEG2_ENCODE_DEBUG_HW_H #define __MFX_MPEG2_ENCODE_DEBUG_HW_H //modify here #define MP2_DBG_MANUAL_SETUP 0 #define MP2_DBG_DEBUG_LOG_FOLDER "C:\\tv\\enc_data1\\tmp\\enc_hw_log" #define MP2_DBG_EXTENDED_MODE 1//add encoded DCT values #define MP2_DBG_ADD_REF_DATA 1//add referece data for Inter MBs #define MP2_DBG_ADD_QUANT 1 #define MP2_DBG_ADD_MB_TYPE 1 #define MP2_DBG_ADD_MB_MVINFO 1 #define MP2_DBG_FRAME_MIN 0 //frame position in stream (not display order) #define MP2_DBG_FRAME_MAX 1000 class MFXVideoENCODEMPEG2_HW; typedef struct { int ref_vfield_select[3][2];//fld1|fld2|frame, fwd|bwd uint8_t YBlockRec[2][2][128];//fwd|bwd, fld1|fld2, fld data uint8_t UBlockRec[2][2][128]; uint8_t VBlockRec[2][2][128]; int16_t encMbData[12][64];//reconstructed blocks int32_t Count[12];//coded_block_pattern int32_t no_motion_flag; int32_t quant_skip_flag; int32_t quantizer; int32_t skipped; } MbDebugInfo; class MPEG2EncodeDebug_HW { typedef struct _MBInfo // macroblock information { mfxI32 mb_type; // intra/forward/backward/interpolated mfxI32 dct_type; // field/frame DCT mfxI32 prediction_type; // MC_FRAME/MC_FIELD IppiPoint MV[2][2]; // motion vectors [vecnum][F/B] IppiPoint MV_P[2]; // motion vectors from P frame [vecnum] mfxI32 mv_field_sel[3][2]; // motion vertical field select: // the first index: 0-top field, 1-bottom field, 2-frame; // the second index:0-forward, 1-backward mfxI32 skipped; } MBInfo; typedef struct _MPEG2FrameState { // Input frame mfxU8 *Y_src; mfxU8 *U_src; mfxU8 *V_src; // Input reference reconstructed frames uint8_t *YRecFrame[2][2]; // [top/bottom][fwd/bwd] uint8_t *URecFrame[2][2]; uint8_t *VRecFrame[2][2]; // Output reconstructed frame mfxU8 *Y_out; mfxU8 *U_out; mfxU8 *V_out; mfxI32 YFrameHSize; mfxI32 UVFrameHSize; mfxU32 needFrameUnlock[4]; // 0-src, 1,2-Rec, 3-out } MPEG2FrameState; private: //additional MBinfo (debug data for each macroblock) MFXVideoENCODEMPEG2_HW *encode_hw; MbDebugInfo *mb_debug_info; //debug parameters char *debug_logs_folder; int use_extended_log; int use_reference_log; int use_manual_setup; int use_mb_type; int use_mb_MVinfo; int use_quantizer_info; int minFrameIndex; int maxFrameIndex; int mb_num; public: MPEG2EncodeDebug_HW() { debug_logs_folder = NULL; mb_debug_info = NULL; } ~MPEG2EncodeDebug_HW() { Free(); } void CreateDEBUGframeLog(); void Init(MFXVideoENCODEMPEG2_HW *pEncode_hw); void Free(); void GatherInterRefMBlocksData(int k,void *vector_in,void* state,void *mbinfo); void GatherBlockData(int k,int blk,int picture_coding_type,int quantiser_scale_value,int16_t *quantMatrix,int16_t *pMBlock,int Count,int intra_flag,int intra_dc_shift); void SetSkippedMb(int k); void SetNoMVMb(int k); void SetMotionFlag(int k,int value); }; #endif //__MFX_MPEG2_ENCODE_DEBUG_HW_H #endif //MFX_ENABLE_MPEG2_VIDEO_ENCODE /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_full_hw.h000066400000000000000000000357011443134507600327120ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENCODE_HW_FULL_H__ #define __MFX_MPEG2_ENCODE_HW_FULL_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include #include "mfxvideo++int.h" #include "mfx_mpeg2_encode_utils_hw.h" #include "mfx_mpeg2_encode_interface.h" //#define BRC_WA #include "libmfx_core.h" namespace MPEG2EncoderHW { class MFXVideoENCODEMPEG2_HW_DDI { private: VideoCORE* m_core; MfxHwMpeg2Encode::ExecuteBuffers* m_pExecuteBuffers; MfxHwMpeg2Encode::DriverEncoder* m_pDdiEncoder; bool m_bStage2Ready; bool m_bUseInternalMem; public: MFXVideoENCODEMPEG2_HW_DDI(VideoCORE *core, mfxStatus *sts) : m_core(core) , m_pExecuteBuffers() , m_pDdiEncoder() , m_bStage2Ready() , m_bUseInternalMem() { *sts = MFX_ERR_NONE; } virtual ~MFXVideoENCODEMPEG2_HW_DDI () { Close(); } mfxStatus Close() { if (m_pExecuteBuffers) { m_pExecuteBuffers->Close(); delete m_pExecuteBuffers; m_pExecuteBuffers = 0; } if (m_pDdiEncoder) { m_pDdiEncoder->Close(); delete m_pDdiEncoder; m_pDdiEncoder = 0; } return MFX_ERR_NONE; } mfxStatus Reset(mfxVideoParamEx_MPEG2 *par) { mfxStatus sts = MFX_ERR_NONE; if (!m_pExecuteBuffers) { m_pExecuteBuffers = new MfxHwMpeg2Encode::ExecuteBuffers; } else { m_pExecuteBuffers->Close(); } #ifdef BRC_WA sts = m_pExecuteBuffers->Init(par,ENCODE_ENC_PAK_ID,false); #else sts = m_pExecuteBuffers->Init(par,ENCODE_ENC_PAK_ID,true); #endif MFX_CHECK_STS(sts); if (!m_pDdiEncoder) { m_pDdiEncoder = MfxHwMpeg2Encode::CreatePlatformMpeg2Encoder(m_core); MFX_CHECK_NULL_PTR1(m_pDdiEncoder); } else { m_pDdiEncoder->Close(); } sts = m_pDdiEncoder->Init(m_pExecuteBuffers, par->pRecFramesResponse_hw->NumFrameActual, ENCODE_ENC_PAK_ID); MFX_CHECK_STS(sts); sts = m_pDdiEncoder->RegisterRefFrames(par->pRecFramesResponse_hw); MFX_CHECK_STS(sts); // in VAAPI encoder context have to be created after reference frames sts = m_pDdiEncoder->CreateContext(m_pExecuteBuffers, par->pRecFramesResponse_hw->NumFrameActual, ENCODE_ENC_PAK_ID); MFX_CHECK_STS(sts); m_bStage2Ready = false; m_bUseInternalMem = (par->mfxVideoParams.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY) || (IsD3D9Simulation(*m_core) && (par->mfxVideoParams.IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY)); return sts; } mfxStatus Init(mfxVideoParamEx_MPEG2 *par) { return Reset(par); } mfxStatus SubmitFrame (EncodeFrameTask* pIntTask, mfxU8 *pUserData, mfxU32 userDataLen, mfxU8 qp = 0) { if (m_pExecuteBuffers->m_mbqp_data) { m_pExecuteBuffers->m_mbqp_data[0] = 0; } m_pExecuteBuffers->m_SkipFrame = (mfxU8)pIntTask->m_sEncodeInternalParams.SkipFrame; #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) m_pExecuteBuffers->m_bTriggerGpuHang = !!mfx::GetExtBuffer(pIntTask->m_sEncodeInternalParams.ExtParam, pIntTask->m_sEncodeInternalParams.NumExtParam, MFX_EXTBUFF_GPU_HANG); #endif mfxStatus sts = MFX_ERR_NONE; sts = SubmitFrame(&pIntTask->m_FrameParams, &pIntTask->m_Frames, pUserData, userDataLen, qp); MFX_CHECK_STS (sts); pIntTask->m_FeedbackNumber = m_pExecuteBuffers->m_pps.StatusReportFeedbackNumber; pIntTask->m_BitstreamFrameNumber = (mfxU32)m_pExecuteBuffers->m_idxBs; return sts; } static void QuantIntoScaleTypeAndCode (int32_t quant_value, int32_t &q_scale_type, int32_t &quantiser_scale_code) { if(quant_value > 7 && quant_value <= 62) { q_scale_type = 0; quantiser_scale_code = (quant_value + 1) >> 1; } else { // non-linear quantizer q_scale_type = 1; if(quant_value <= 8) { quantiser_scale_code = quant_value; } else if (quant_value > 62) { quantiser_scale_code = 25+((quant_value-64+4)>>3); } } if(quantiser_scale_code < 1) { quantiser_scale_code = 1; } if(quantiser_scale_code > 31) { quantiser_scale_code = 31; } } mfxStatus SubmitFrameMBQP (EncodeFrameTask* pIntTask, mfxU8 *pUserData, mfxU32 userDataLen, mfxU8* mbqp, mfxU32 numMB, mfxU8 qp) { mfxStatus sts = MFX_ERR_NONE; // int32_t scale_type = 0; // int32_t scale_code = 0; // QuantIntoScaleTypeAndCode(qp, scale_type, scale_code); // pIntTask->m_FrameParams.QuantScaleType = (uint8_t)scale_type; m_pExecuteBuffers->m_SkipFrame = (mfxU8)pIntTask->m_sEncodeInternalParams.SkipFrame; sts = SubmitFrame(&pIntTask->m_FrameParams, &pIntTask->m_Frames, pUserData, userDataLen, qp, mbqp, numMB); MFX_CHECK_STS (sts); pIntTask->m_FeedbackNumber = m_pExecuteBuffers->m_pps.StatusReportFeedbackNumber; pIntTask->m_BitstreamFrameNumber = (mfxU32)m_pExecuteBuffers->m_idxBs; return sts; } protected: mfxStatus SubmitFrame(mfxFrameParamMPEG2* pParams, FramesSet* pFrames, mfxU8 *pUserData, mfxU32 userDataLen, mfxU8 qp = 0, mfxU8* mbqp = 0, mfxU32 numMB = 0) { mfxStatus sts = MFX_ERR_NONE; if (!m_pExecuteBuffers || !m_pDdiEncoder) { return MFX_ERR_NOT_INITIALIZED; } sts = m_pExecuteBuffers->InitPictureParameters(pParams,pFrames->m_nFrame); MFX_CHECK_STS(sts); sts = m_pExecuteBuffers->InitSliceParameters(qp, pParams->QuantScaleType, mbqp, numMB); MFX_CHECK_STS(sts); m_pExecuteBuffers->InitFramesSet (pFrames->m_pInputFrame->Data.MemId, !m_bUseInternalMem, (pFrames->m_pRecFrame)? pFrames->m_pRecFrame->Data.MemId:0, (pFrames->m_pRefFrame[0])? pFrames->m_pRefFrame[0]->Data.MemId:0, (pFrames->m_pRefFrame[1])? pFrames->m_pRefFrame[1]->Data.MemId:0); MFX_CHECK_STS(sts); m_pExecuteBuffers->m_pSurface = pFrames->m_pInputFrame; sts = m_pDdiEncoder->SetFrames(m_pExecuteBuffers); MFX_CHECK_STS(sts); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MPEG2 encode DDISubmitTask"); sts = m_pDdiEncoder->Execute(m_pExecuteBuffers, pUserData,userDataLen); MFX_CHECK_STS(sts); m_bStage2Ready = true; return sts; } public: mfxStatus QueryFrame(EncodeFrameTask* pIntTask) { mfxStatus sts = MFX_ERR_NONE; if (!m_pExecuteBuffers || !m_pDdiEncoder) { return MFX_ERR_NOT_INITIALIZED; } sts = m_pDdiEncoder->FillBSBuffer(pIntTask->m_FeedbackNumber, pIntTask->m_BitstreamFrameNumber, pIntTask->m_pBitstream ); MFX_CHECK_STS(sts); return sts; } static inline mfxU16 GetIOPattern () { return MFX_IOPATTERN_IN_VIDEO_MEMORY; } private: // Declare private copy constructor to avoid accidental assignment MFXVideoENCODEMPEG2_HW_DDI(const MFXVideoENCODEMPEG2_HW_DDI &); MFXVideoENCODEMPEG2_HW_DDI & operator = (const MFXVideoENCODEMPEG2_HW_DDI &); }; class UserDataBuffer { private: mfxU8* m_pBuffer; mfxU32 m_bufSize; mfxU32 m_dataSize; protected: mfxStatus AddUserData(mfxU8* pUserData, mfxU32 len); UserDataBuffer(const UserDataBuffer &); void operator=(const UserDataBuffer &); public: UserDataBuffer(): m_pBuffer(0), m_bufSize (0), m_dataSize (0) {} virtual ~UserDataBuffer() { Close();} inline void Reset(mfxVideoParam *par) { if (!m_pBuffer) { m_bufSize = par->mfx.FrameInfo.Width*par->mfx.FrameInfo.Height * 3; m_pBuffer = new mfxU8 [m_bufSize]; } m_dataSize = 0; } inline void Close() { if (m_pBuffer) { delete [] m_pBuffer; m_pBuffer = 0; } m_dataSize = m_bufSize = 0; } inline mfxStatus AddUserData(mfxEncodeInternalParams* pIntParams) { m_dataSize = 0; MFX_CHECK(pIntParams != 0 && pIntParams->NumPayload != 0 && pIntParams->Payload != 0, MFX_ERR_NONE); for (mfxI32 i = 0; i < pIntParams->NumPayload; i++) { if (pIntParams->Payload[i] && pIntParams->Payload[i]->Type == 0x1B2L && pIntParams->Payload[i]->NumBit && pIntParams->Payload[i]->Data) { MFX_CHECK_STS (AddUserData(pIntParams->Payload[i]->Data, (pIntParams->Payload[i]->NumBit+7)>>3)); } } return MFX_ERR_NONE; } inline mfxU8* GetUserDataBuffer() {return m_dataSize ? m_pBuffer : 0;} inline mfxI32 GetUserDataSize() {return m_dataSize;} }; class FullEncode: public EncoderBase { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); FullEncode(VideoCORE *core, mfxStatus *sts); virtual ~FullEncode(); virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(void); virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus GetFrameParam(mfxFrameParam *par); virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat); virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams); virtual mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs); virtual mfxStatus EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT entryPoints[], mfxU32 & numEntryPoints); virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *, mfxFrameSurface1 *, mfxBitstream *, mfxFrameSurface1 **, mfxEncodeInternalParams *, MFX_ENTRY_POINT *) {return MFX_ERR_UNSUPPORTED;} virtual mfxStatus EncodeFrame(mfxEncodeCtrl *, mfxEncodeInternalParams *, mfxFrameSurface1 *, mfxBitstream *) {return MFX_ERR_UNSUPPORTED;} virtual mfxStatus SubmitFrame(sExtTask2 *pTask); virtual mfxStatus QueryFrame (sExtTask2 *pTask); clExtTasks2* m_pExtTasks; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_INTRA;} protected: inline bool is_initialized() {return m_pController!=0;} mfxStatus ResetImpl(); mfxU32 GetFreeIntTask() { UMC::AutomaticUMCMutex lock(m_guard); for (mfxU32 i = 0; i< m_nFrameTasks; i++) { if (m_pFrameTasks[i].m_taskStatus == NOT_STARTED) { return i+1; } } return 0; } EncodeFrameTask* GetIntTask(mfxU32 num) { if (num <= m_nFrameTasks && num > 0) { return &(m_pFrameTasks[num - 1]); } return 0; } private: UMC::Mutex m_guard; VideoCORE * m_pCore; ControllerBase* m_pController; MFXVideoENCODEMPEG2_HW_DDI* m_pENCODE; MPEG2BRC_HW* m_pBRC; FrameStore* m_pFrameStore; EncodeFrameTask* m_pFrameTasks; mfxU32 m_nFrameTasks; mfxU32 m_nCurrTask; UserDataBuffer m_UDBuff; mfxStatus m_runtimeErr; }; } #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_hw.h000066400000000000000000000136111443134507600316640ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENCODE_HW_H__ #define __MFX_MPEG2_ENCODE_HW_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfxvideo++int.h" #include "mfx_mpeg2_encode_full_hw.h" #include "mfx_mpeg2_encode_utils_hw.h" class MFXVideoENCODEMPEG2_HW : public VideoENCODE { public: static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { return MPEG2EncoderHW::ControllerBase::Query(core,in,out); } static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request) { return MPEG2EncoderHW::ControllerBase::QueryIOSurf(core,par,request); } static mfxStatus QueryImplsDescription(VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return MPEG2EncoderHW::ControllerBase::QueryImplsDescription(core, caps, ah); } MFXVideoENCODEMPEG2_HW(VideoCORE *core, mfxStatus *sts) { m_pCore = core; pEncoder = 0; *sts = MFX_ERR_NONE; } virtual ~MFXVideoENCODEMPEG2_HW() {Close();} virtual mfxStatus Init(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; ENCODE_CAPS Caps = {}; MPEG2EncoderHW::HW_MODE mode = MPEG2EncoderHW::UNSUPPORTED; if (pEncoder) { return MFX_ERR_UNDEFINED_BEHAVIOR; } sts = MPEG2EncoderHW::CheckHwCaps(m_pCore, par, 0, &Caps); MFX_CHECK_STS(sts); mode = MPEG2EncoderHW::GetHwEncodeMode(Caps); if (mode == MPEG2EncoderHW::FULL_ENCODE) { pEncoder = new MPEG2EncoderHW::FullEncode(m_pCore,&sts); } else { return MFX_ERR_UNSUPPORTED; } sts = pEncoder->Init(par); if (sts < MFX_ERR_NONE) { Close(); return sts; } return sts; } virtual mfxStatus Reset(mfxVideoParam *par) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->Reset(par); } virtual mfxStatus Close(void) { mfxStatus sts = MFX_ERR_NONE; if (pEncoder) { sts = pEncoder->Close(); delete pEncoder; pEncoder = 0; } return sts; } virtual mfxStatus GetVideoParam(mfxVideoParam *par) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->GetVideoParam(par); } virtual mfxStatus GetFrameParam(mfxFrameParam *) { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->GetEncodeStat(stat); } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->EncodeFrameCheck(ctrl,surface,bs,reordered_surface,pInternalParams); } virtual mfxStatus EncodeFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->EncodeFrame(ctrl,pInternalParams,surface,bs); } virtual mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->CancelFrame(ctrl,pInternalParams,surface,bs); } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { if (!pEncoder) { return MFX_ERR_NOT_INITIALIZED; } return pEncoder->EncodeFrameCheck(ctrl,surface,bs,reordered_surface,pInternalParams,pEntryPoints,numEntryPoints); } virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) { if (!pEncoder) { return MFX_TASK_THREADING_DEFAULT; } return pEncoder->GetThreadingPolicy(); } private: VideoCORE* m_pCore; MPEG2EncoderHW::EncoderBase* pEncoder; }; #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_interface.h000066400000000000000000000143311443134507600332060ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #ifndef __MFX_MPEG2_ENCODE_INTERFACE__H #define __MFX_MPEG2_ENCODE_INTERFACE__H #include #include #include "mfxdefs.h" #include "mfxvideo++int.h" #include "mfx_mpeg2_enc_common_hw.h" #include "mfx_h264_encode_struct_vaapi.h" #include namespace MfxHwMpeg2Encode { struct ExecuteBuffers { ExecuteBuffers() : m_caps() , m_sps() , m_vui() , m_pps() , m_pSlice() , m_pMBs() , m_mbqp_data() , m_SkipFrame() , m_quantMatrix() , m_pSurface() , m_pSurfacePair() , m_idxMb(DWORD(-1)) , m_idxBs() , m_nSlices() , m_nMBs() , m_bAddSPS() , m_bAddDisplayExt() , m_RecFrameMemID() , m_RefFrameMemID() , m_CurrFrameMemID() , m_bExternalCurrFrame() , m_bExternalCurrFrameHDL() , m_bOutOfRangeMV() , m_bErrMBType() , m_bUseRawFrames() #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) , m_bTriggerGpuHang() #endif , m_bDisablePanicMode() , m_GOPPictureSize() , m_GOPRefDist() , m_GOPOptFlag() , m_fFrameRate() , m_FrameRateExtN() , m_FrameRateExtD() {} mfxStatus Init (const mfxVideoParamEx_MPEG2* par, mfxU32 funcId, bool bAllowBRC = false); mfxStatus Close(); mfxStatus InitPictureParameters(mfxFrameParamMPEG2* pParams, mfxU32 frameNum); void InitFramesSet(mfxMemId curr, bool bExternal, mfxMemId rec, mfxMemId ref_0,mfxMemId ref_1); mfxStatus InitSliceParameters(mfxU8 qp, mfxU16 scale_type, mfxU8 * mbqp, mfxU32 numMB); ENCODE_ENC_CTRL_CAPS m_caps; ENCODE_SET_SEQUENCE_PARAMETERS_MPEG2 m_sps; ENCODE_SET_VUI_PARAMETER_MPEG2 m_vui; ENCODE_SET_PICTURE_PARAMETERS_MPEG2 m_pps; ENCODE_SET_SLICE_HEADER_MPEG2* m_pSlice; ENCODE_ENC_MB_DATA_MPEG2* m_pMBs; mfxU8* m_mbqp_data; mfxU8 m_SkipFrame; VAIQMatrixBufferMPEG2 m_quantMatrix; mfxFrameSurface1* m_pSurface; mfxHDLPair m_pSurfacePair; DWORD m_idxMb; DWORD m_idxBs; DWORD m_nSlices; DWORD m_nMBs; DWORD m_bAddSPS; bool m_bAddDisplayExt; mfxMemId m_RecFrameMemID; mfxMemId m_RefFrameMemID[2]; mfxMemId m_CurrFrameMemID; bool m_bExternalCurrFrame; bool m_bExternalCurrFrameHDL; bool m_bOutOfRangeMV; bool m_bErrMBType; bool m_bUseRawFrames; #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) bool m_bTriggerGpuHang; #endif bool m_bDisablePanicMode; USHORT m_GOPPictureSize; UCHAR m_GOPRefDist; UCHAR m_GOPOptFlag; Ipp64f m_fFrameRate; mfxU32 m_FrameRateExtN; mfxU32 m_FrameRateExtD; }; class DriverEncoder { public: virtual ~DriverEncoder(){} virtual void QueryEncodeCaps(ENCODE_CAPS & caps) = 0; virtual mfxStatus Init(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) = 0; virtual mfxStatus CreateContext(ExecuteBuffers* /*pExecuteBuffers*/, mfxU32 /*numRefFrames*/, mfxU32 /*funcId*/) { return MFX_ERR_NONE; } virtual mfxStatus Execute(ExecuteBuffers* pExecuteBuffers, mfxU8* pUserData = 0, mfxU32 userDataLen = 0) = 0; virtual bool IsFullEncode() const = 0; virtual mfxStatus Close() = 0; virtual mfxStatus RegisterRefFrames(const mfxFrameAllocResponse* pResponse) = 0; virtual mfxStatus FillMBBufferPointer(ExecuteBuffers* pExecuteBuffers) = 0; virtual mfxStatus FillBSBuffer(mfxU32 nFeedback, mfxU32 nBitstream, mfxBitstream* pBitstream ) = 0; virtual mfxStatus SetFrames (ExecuteBuffers* pExecuteBuffers) = 0; virtual mfxStatus CreateAuxilliaryDevice(mfxU16 codecProfile) = 0; }; DriverEncoder* CreatePlatformMpeg2Encoder( VideoCORE* core ); }; // namespace #endif //#ifndef __MFX_MPEG2_ENCODE_INTERFACE__H #endif //(MFX_ENABLE_MPEG2_VIDEO_ENCODE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_utils_hw.h000066400000000000000000000437231443134507600331130ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENCODE_HW_UTILS_H__ #define __MFX_MPEG2_ENCODE_HW_UTILS_H__ #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfxvideo++int.h" #include "mfx_frames.h" #include "mfx_mpeg2_enc_common_hw.h" #include "umc_mpeg2_brc.h" #include "mfx_brc_common.h" #include "umc_video_brc.h" #include "mfx_enc_common.h" namespace MPEG2EncoderHW { enum HW_MODE { FULL_ENCODE, HYBRID_ENCODE, UNSUPPORTED }; class EncoderBase { public: // Destructor virtual ~EncoderBase(void) {} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) = 0; virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT *pEntryPoint) = 0; virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { mfxStatus mfxRes; // call the overweighted version mfxRes = EncodeFrameCheck(ctrl, surface, bs, reordered_surface, pInternalParams, pEntryPoints); numEntryPoints = 1; return mfxRes; } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams) = 0; virtual mfxStatus EncodeFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) = 0; virtual mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) = 0; }; class FramesSet { public: mfxFrameSurface1 *m_pInputFrame; mfxFrameSurface1 *m_pRefFrame[2]; mfxFrameSurface1 *m_pRawFrame[2]; mfxFrameSurface1 *m_pRecFrame; mfxU32 m_nFrame; mfxU32 m_nRefFrame[2]; mfxI32 m_nLastRefBeforeIntra; mfxI32 m_nLastRef; public: FramesSet(); void Reset(); mfxStatus ReleaseFrames(VideoCORE* pCore); mfxStatus LockRefFrames(VideoCORE* pCore); inline mfxStatus LockFrames(VideoCORE* pCore) { if (m_pInputFrame) { MFX_CHECK_STS (pCore->IncreaseReference(&m_pInputFrame->Data)); } if (m_pRecFrame) { MFX_CHECK_STS (pCore->IncreaseReference(&m_pRecFrame->Data)); } return LockRefFrames(pCore); } }; mfxStatus CheckHwCaps( VideoCORE* core, mfxVideoParam const * par, mfxExtCodingOption const * ext = 0, ENCODE_CAPS* pCaps = 0); HW_MODE GetHwEncodeMode(ENCODE_CAPS &caps); mfxStatus ApplyTargetUsage(mfxVideoParamEx_MPEG2* par); mfxExtCodingOptionSPSPPS* GetExtCodingOptionsSPSPPS(mfxExtBuffer** ebuffers, mfxU32 nbuffers); mfxStatus CheckExtendedBuffers (mfxVideoParam* par); mfxStatus UnlockFrames (MFXGOP* pGOP, MFXWaitingList* pWaitingList, VideoCORE* pcore); mfxStatus FillMFXFrameParams(mfxFrameParamMPEG2* pFrameParams, mfxU8 frameType, mfxVideoParamEx_MPEG2 *pExParams, mfxU16 surface_pict_struct, bool bBackwOnly, bool bFwdOnly); class ControllerBase { private: VideoCORE* m_pCore; mfxU32 m_nEncodeCalls; mfxU32 m_nFrameInGOP; MFXGOP* m_pGOP; MFXWaitingList* m_pWaitingList; mfxI32 m_InputFrameOrder; mfxI32 m_OutputFrameOrder; mfxU64 m_BitstreamLen; mfxVideoParamEx_MPEG2 m_VideoParamsEx; InputSurfaces m_InputSurfaces; mfxU16 m_InitWidth; mfxU16 m_InitHeight; bool m_bInitialized; bool m_bAVBR_WA; protected: inline bool is_initialized () {return m_bInitialized;} public: ControllerBase(VideoCORE *core, bool bAVBR_WA = false); ~ControllerBase() { Close(); } mfxStatus Close(void); mfxStatus Reset(mfxVideoParam *par); mfxStatus GetVideoParam(mfxVideoParam *par); mfxStatus GetFrameParam(mfxFrameParam *par); mfxStatus GetEncodeStat(mfxEncodeStat *stat); mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams); static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, bool bAVBR_WA = false); static mfxStatus QueryIOSurf (VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); static mfxStatus QueryImplsDescription(VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah); mfxStatus ReorderFrame(mfxEncodeInternalParams *pInInternalParams, mfxFrameSurface1 *in, mfxEncodeInternalParams *pOutInternalParams, mfxFrameSurface1 **out); mfxStatus CheckNextFrame(mfxEncodeInternalParams *pOutInternalParams, mfxFrameSurface1 **out); mfxStatus CheckFrameType (mfxEncodeInternalParams *pInternalParams); inline bool isHWInput () {return !m_InputSurfaces.isSysMemFrames();} inline mfxU16 GetInputFrameType() { return (mfxU16)( MFX_MEMTYPE_EXTERNAL_FRAME | (m_InputSurfaces.isSysMemFrames() ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET)| MFX_MEMTYPE_FROM_ENCODE); } inline bool isRawFrames() {return m_VideoParamsEx.bRawFrames;} inline mfxVideoParamEx_MPEG2* getVideoParamsEx() {return &m_VideoParamsEx;} inline mfxI32 GetFrameNumber() { return m_OutputFrameOrder; } inline void FinishFrame(mfxU32 frameSize) { m_OutputFrameOrder ++; m_BitstreamLen = m_BitstreamLen + frameSize; } mfxI32 GetOutputFrameOrder () { return m_OutputFrameOrder; } inline void SetAllocResponse(mfxFrameAllocResponse* pAR, bool bHW) { if (bHW) m_VideoParamsEx.pRecFramesResponse_hw = pAR; else m_VideoParamsEx.pRecFramesResponse_sw = pAR; } mfxFrameSurface1 *GetOriginalSurface(mfxFrameSurface1 *surface) { return m_InputSurfaces.GetOriginalSurface(surface); } }; // class ControllerBase class MPEG2BRC_HW { private: UMC::VideoBrc* m_pBRC; mfxU32 m_bConstantQuant; mfxU32 m_MinFrameSizeBits[3]; mfxU32 m_MinFieldSizeBits[3]; VideoCORE* m_pCore; mfxU32 m_FirstGopSize; mfxU32 m_GopSize; mfxU32 m_bufferSizeInKB; mfxI32 m_InputBitsPerFrame; bool m_bLimitedMode; protected: void QuantIntoScaleTypeAndCode (int32_t quant_value, int32_t &q_scale_type, int32_t &quantiser_scale_code); inline int32_t ScaleTypeAndCodeIntoQuant (int32_t q_scale_type, int32_t quantiser_scale_code) { static int32_t Val_QScale[2][32] = { /* linear q_scale */ {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62}, /* non-linear q_scale */ {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96,104,112}}; return Val_QScale[q_scale_type][quantiser_scale_code]; } int32_t ChangeQuant(int32_t quant_value_old, int32_t quant_value_new); public: MPEG2BRC_HW(VideoCORE* pCore) { m_pCore = pCore; m_pBRC = 0; m_bConstantQuant = 0; m_MinFrameSizeBits [0] = 0; m_MinFrameSizeBits [1] = 0; m_MinFrameSizeBits [2] = 0; m_MinFieldSizeBits [0] = 0; m_MinFieldSizeBits [1] = 0; m_MinFieldSizeBits [2] = 0; m_FirstGopSize = 0; m_GopSize = 0; m_bufferSizeInKB = 0; m_InputBitsPerFrame = 0; m_bLimitedMode = 0; } ~MPEG2BRC_HW () { Close(); } mfxStatus Init(mfxVideoParam* par); inline mfxStatus Reset(mfxVideoParam* par) { return Init(par); } void Close (); mfxStatus StartNewFrame(const mfxFrameParamMPEG2 *pFrameParams, mfxI32 recode); mfxStatus SetQuantDCPredAndDelay(mfxFrameParamMPEG2 *pFrameParams, mfxU8 *pQuant); mfxStatus UpdateBRC(const mfxFrameParamMPEG2 *pParams, mfxBitstream* pBitsream, mfxU32 bitsize, mfxU32 numEncodedFrame, bool bNotEnoughBuffer ,mfxI32 &recode); inline void SetQuant(mfxU32 Quant, mfxU32 FrameType) { if (m_pBRC && m_bConstantQuant) { if (Quant > 0) { if (FrameType & MFX_FRAMETYPE_I) m_pBRC->SetQP(Quant, UMC::I_PICTURE); else if (FrameType & MFX_FRAMETYPE_P) m_pBRC->SetQP(Quant, UMC::P_PICTURE); else if (FrameType & MFX_FRAMETYPE_B) m_pBRC->SetQP(Quant, UMC::B_PICTURE); } } } inline bool IsSkipped (mfxI32 &recode) { if (m_bLimitedMode && recode == 0) { recode = UMC::BRC_EXT_FRAMESKIP; return true; } else if (m_bLimitedMode) { return true; } return false; } private: // Declare private copy constructor to avoid accidental assignment MPEG2BRC_HW(const MPEG2BRC_HW &); MPEG2BRC_HW & operator = (const MPEG2BRC_HW &); }; enum TaskStatus { NOT_STARTED = 0, INPUT_READY = 1, ENC_STARTED = 2, ENC_READY = 3, }; class FrameStore { private: FrameStore(const FrameStore&); // non-copyable void operator=(const FrameStore&); // non-copyable mfxU16 m_InputType; bool m_bHWFrames; bool m_bUseInternalMem; mfxFrameSurface1 *m_pRefFrame[2]; mfxFrameSurface1 *m_pRawFrame[2]; mfxU32 m_nRefFrame[2]; mfxFrameSurface1 *m_pRefFramesStore; // reference frames mfxFrameSurface1 *m_pInputFramesStore; // input frames in case of system memory mfxU32 m_nRefFrames; mfxU32 m_nInputFrames; VideoCORE* m_pCore; mfxFrameAllocRequest m_RefRequest; mfxFrameAllocResponse m_RefResponse; mfxFrameAllocRequest m_InputRequest; mfxFrameAllocResponse m_InputResponse; mfxU32 m_nFrame; mfxI32 m_nLastRefBeforeIntra; mfxI32 m_nLastRef; bool m_bRawFrame; protected: mfxStatus ReleaseFrames(); mfxStatus GetInternalRefFrame(mfxFrameSurface1** ppFrame); mfxStatus GetInternalInputFrame(mfxFrameSurface1** ppFrame); public: FrameStore(VideoCORE* pCore) { m_InputType = 0; m_bHWFrames = false; m_bUseInternalMem = false; memset (m_pRefFrame,0,sizeof(mfxFrameSurface1*)*2); memset (m_pRawFrame,0,sizeof(mfxFrameSurface1*)*2); memset (m_nRefFrame,0,sizeof(mfxU32)*2); m_pRefFramesStore = 0; m_pInputFramesStore = 0; m_nRefFrames = 0; m_nInputFrames = 0; m_nFrame = 0; m_nRefFrame[0] = 0; m_nRefFrame[1] = 0; m_nLastRefBeforeIntra = -1; m_nLastRef = -1; memset(&m_RefRequest, 0, sizeof(mfxFrameAllocRequest)); memset(&m_RefResponse, 0, sizeof(mfxFrameAllocResponse)); memset(&m_InputRequest, 0, sizeof(mfxFrameAllocRequest)); memset(&m_InputResponse, 0, sizeof(mfxFrameAllocResponse)); m_bRawFrame = 0; m_pCore = pCore; } ~FrameStore() { Close(); } inline mfxStatus Reset(bool bRawFrame, mfxU16 InputFrameType, bool bHWFrames, mfxU32 nTasks, mfxFrameInfo* pFrameInfo, bool bProtected = false) { return Init(bRawFrame, InputFrameType, bHWFrames, nTasks, pFrameInfo, bProtected); } mfxStatus Init(bool bRawFrame, mfxU16 InputFrameType, bool bHWFrames, mfxU32 mTasks, mfxFrameInfo* pFrameInfo, bool bProtected = false); mfxStatus NextFrame(mfxFrameSurface1 *pInputFrame, mfxU32 nFrame, mfxU16 frameType, mfxU32 intFlags, FramesSet *pFrames); mfxStatus Close(); inline mfxFrameAllocResponse* GetFrameAllocResponse() { return &m_RefResponse; } }; class EncodeFrameTask { public: TaskStatus m_taskStatus; mfxFrameParamMPEG2 m_FrameParams; mfxBitstream* m_pBitstream; FramesSet m_Frames; VideoCORE* m_pCore; mfxU32 m_nFrameOrder; mfxEncodeInternalParams m_sEncodeInternalParams; mfxU32 m_FeedbackNumber; mfxU32 m_BitstreamFrameNumber; protected: inline void Reset() { memset(&m_FrameParams,0,sizeof(mfxFrameParamMPEG2)); memset(&m_sEncodeInternalParams, 0, sizeof(mfxEncodeInternalParams)); m_pBitstream = 0; m_pCore = 0; m_nFrameOrder = 0; m_taskStatus = NOT_STARTED; m_Frames.Reset(); m_FeedbackNumber = 0; m_BitstreamFrameNumber = 0; } public: EncodeFrameTask() { Reset(); } inline mfxStatus Reset(VideoCORE* pCore) { mfxStatus sts = MFX_ERR_NONE; sts = m_Frames.ReleaseFrames(m_pCore); Reset(); m_pCore = pCore; return sts; } inline mfxStatus Close() { mfxStatus sts = MFX_ERR_NONE; sts = m_Frames.ReleaseFrames(m_pCore); Reset(); return sts; } inline void SetFrames(FramesSet *pFrames, mfxEncodeInternalParams* pEncodeInternalParams) { m_Frames = *pFrames; m_sEncodeInternalParams = *pEncodeInternalParams; } inline mfxStatus FillFrameParams (mfxU8 frameType, mfxVideoParamEx_MPEG2 *pExParams, mfxU16 surface_pict_struct, bool bBackwOnly, bool bFwdOnly, bool bAddSH, bool bAddEOS) { mfxStatus sts = MFX_ERR_NONE; sts = FillMFXFrameParams(&m_FrameParams, frameType, pExParams, surface_pict_struct, bBackwOnly, bFwdOnly); MFX_CHECK_STS(sts); m_FrameParams.TemporalReference = (mfxU16)(m_Frames.m_nFrame - m_Frames.m_nLastRefBeforeIntra - 1); m_FrameParams.ExtraFlags = (mfxU16)(( bAddSH ? MFX_IFLAG_ADD_HEADER:0)| (bAddEOS ? MFX_IFLAG_ADD_EOS:0)); // those values are not declared return sts; } }; } #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/include/mfx_mpeg2_encode_vaapi.h000066400000000000000000000163351443134507600323540ustar00rootroot00000000000000// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_ENCODE_VAAPI__H #define __MFX_MPEG2_ENCODE_VAAPI__H #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include #include #include "mfx_h264_encode_struct_vaapi.h" #include #include #include "vaapi_ext_interface.h" #include "mfx_ext_buffers.h" #include "mfxpcp.h" #include "mfx_mpeg2_enc_common_hw.h" #include "mfx_mpeg2_encode_interface.h" #include "umc_mutex.h" namespace MfxHwMpeg2Encode { class VAAPIEncoder : public DriverEncoder { public: enum { MAX_SLICES = 128 }; explicit VAAPIEncoder(VideoCORE* core); virtual ~VAAPIEncoder(); virtual void QueryEncodeCaps(ENCODE_CAPS & caps) override; virtual mfxStatus Init(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) override; virtual mfxStatus CreateContext(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) override; virtual mfxStatus Execute(ExecuteBuffers* pExecuteBuffers, mfxU8* pUserData = 0, mfxU32 userDataLen = 0) override; virtual mfxStatus Close() override; virtual bool IsFullEncode() const override { return true; } virtual mfxStatus RegisterRefFrames(const mfxFrameAllocResponse* pResponse) override; virtual mfxStatus FillMBBufferPointer(ExecuteBuffers* pExecuteBuffers) override; virtual mfxStatus FillBSBuffer(mfxU32 nFeedback,mfxU32 nBitstream, mfxBitstream* pBitstream ) override; virtual mfxStatus SetFrames (ExecuteBuffers* pExecuteBuffers) override; virtual mfxStatus CreateAuxilliaryDevice(mfxU16 codecProfile) override; VAAPIEncoder(const VAAPIEncoder&) = delete; VAAPIEncoder& operator=(const VAAPIEncoder&) = delete; private: struct VAEncQpBufferMPEG2 { mfxU32 qp_y; }; mfxStatus QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest* pRequest, ExecuteBuffers* pExecuteBuffers); mfxStatus CreateCompBuffers (ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames); mfxStatus CreateBSBuffer (mfxU32 numRefFrames, ExecuteBuffers* pExecuteBuffers); mfxStatus GetBuffersInfo(); mfxStatus QueryMbDataLayout(); mfxStatus Init(ENCODE_FUNC func, ExecuteBuffers* pExecuteBuffers); mfxStatus FillSlices(ExecuteBuffers* pExecuteBuffers); mfxStatus FillMiscParameterBuffer(ExecuteBuffers* pExecuteBuffers); mfxStatus FillQualityLevelBuffer(ExecuteBuffers* pExecuteBuffers); mfxStatus FillUserDataBuffer(mfxU8 *pUserData, mfxU32 userDataLen); mfxStatus FillVideoSignalInfoBuffer(ExecuteBuffers* pExecuteBuffers); mfxStatus FillMBQPBuffer(ExecuteBuffers* pExecuteBuffers, mfxU8* mbqp, mfxU32 numMB); mfxStatus FillSkipFrameBuffer(mfxU8 skipFlag); mfxStatus Execute(ExecuteBuffers* pExecuteBuffers, mfxU32 func, mfxU8* pUserData, mfxU32 userDataLen); mfxStatus Register (const mfxFrameAllocResponse* pResponse, D3DDDIFORMAT type); mfxI32 GetRecFrameIndex (mfxMemId memID); mfxI32 GetRawFrameIndex (mfxMemId memIDe, bool bAddFrames); VideoCORE* m_core; // encoder specific. can be encapsulated by auxDevice class VADisplay m_vaDisplay; VAContextID m_vaContextEncode; VAConfigID m_vaConfig; VAEncSequenceParameterBufferMPEG2 m_vaSpsBuf; VABufferID m_spsBufferId; VAEncPictureParameterBufferMPEG2 m_vaPpsBuf; VABufferID m_ppsBufferId; VABufferID m_qmBufferId; VAEncSliceParameterBufferMPEG2 m_sliceParam[MAX_SLICES]; VABufferID m_sliceParamBufferId[MAX_SLICES]; /* Slice level parameter, multi slices */ int m_numSliceGroups; mfxU32 m_codedbufISize; mfxU32 m_codedbufPBSize; VAEncMiscParameterBuffer *m_pMiscParamsFps; VAEncMiscParameterBuffer *m_pMiscParamsBrc; VAEncMiscParameterBuffer *m_pMiscParamsQuality; VAEncMiscParameterBuffer *m_pMiscParamsSeqInfo; VAEncMiscParameterBuffer *m_pMiscParamsSkipFrame; VABufferID m_miscParamFpsId; VABufferID m_miscParamBrcId; VABufferID m_miscParamQualityId; VABufferID m_miscParamSeqInfoId; VABufferID m_miscParamSkipFrameId; VABufferID m_packedUserDataParamsId; VABufferID m_packedUserDataId; VABufferID m_mbqpBufferId; VABufferID m_miscQualityParamId; #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) VABufferID m_triggerGpuHangBufferId; #endif std::vector m_mbqpDataBuffer; mfxU16 m_initFrameWidth; mfxU16 m_initFrameHeight; ENCODE_MBDATA_LAYOUT m_layout; mfxFeedback m_feedback; std::vector m_bsQueue; std::vector m_reconQueue; mfxFrameAllocResponse m_allocResponseMB; mfxFrameAllocResponse m_allocResponseBS; mfxRecFrames m_recFrames; mfxRawFrames m_rawFrames; UMC::Mutex m_guard; #ifdef MPEG2_ENC_HW_PERF Time lock_MB_data_time[3]; Time copy_MB_data_time[3]; #endif ENCODE_CAPS m_caps; }; // class VAAPIEncoder }; // namespace #endif // defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #endif // __MFX_MPEG2_ENCODE_VAAPI__H /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/000077500000000000000000000000001443134507600247565ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_enc_common_hw.cpp000066400000000000000000000512511443134507600322450ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "assert.h" #include "mfx_enc_common.h" #include "mfx_mpeg2_encode_interface.h" #include "mfx_mpeg2_enc_common_hw.h" #include #include #include "libmfx_core_interface.h" #include "libmfx_core_factory.h" using namespace MfxHwMpeg2Encode; namespace MfxHwMpeg2Encode { bool ConvertFrameRateMPEG2(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxI32 &frame_rate_code, mfxI32 &frame_rate_extension_n, mfxI32 &frame_rate_extension_d); } typedef struct tagENCODE_QUERY_STATUS_DATA_tmp { UINT uBytesWritten; } ENCODE_QUERY_STATUS_DATA_tmp; using namespace MfxHwMpeg2Encode; mfxStatus MfxHwMpeg2Encode::QueryHwCaps(VideoCORE* pCore, ENCODE_CAPS & hwCaps, mfxU16 codecProfile) { EncodeHWCaps* pEncodeCaps = QueryCoreInterface(pCore); if (!pEncodeCaps) return MFX_ERR_UNDEFINED_BEHAVIOR; else { if (pEncodeCaps->GetHWCaps(DXVA2_Intel_Encode_MPEG2, &hwCaps) == MFX_ERR_NONE) return MFX_ERR_NONE; } std::unique_ptr ddi; ddi.reset( CreatePlatformMpeg2Encoder(pCore) ); if(ddi.get() == NULL) return MFX_ERR_NULL_PTR; mfxStatus sts = ddi->CreateAuxilliaryDevice(codecProfile); MFX_CHECK_STS(sts); ddi->QueryEncodeCaps(hwCaps); return pEncodeCaps->SetHWCaps(DXVA2_Intel_Encode_MPEG2, &hwCaps); } //------------------------------------------------------------- // Execute Buffers //------------------------------------------------------------- mfxStatus ExecuteBuffers::Init(const mfxVideoParamEx_MPEG2* par, mfxU32 funcId, bool bAllowBRC) { DWORD nSlices = par->mfxVideoParams.mfx.NumSlice; DWORD nMBs = (par->mfxVideoParams.mfx.FrameInfo.Width>>4)*(par->mfxVideoParams.mfx.FrameInfo.Height>>4); memset(&m_caps, 0, sizeof(m_caps)); memset(&m_sps, 0, sizeof(m_sps)); memset(&m_pps, 0, sizeof(m_pps)); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) m_bTriggerGpuHang = false; #endif m_bOutOfRangeMV = false; m_bErrMBType = false; m_bUseRawFrames = par->bRawFrames; m_fFrameRate = (Ipp64f) par->mfxVideoParams.mfx.FrameInfo.FrameRateExtN/(Ipp64f)par->mfxVideoParams.mfx.FrameInfo.FrameRateExtD; m_FrameRateExtN = par->mfxVideoParams.mfx.FrameInfo.FrameRateExtN; m_FrameRateExtD = par->mfxVideoParams.mfx.FrameInfo.FrameRateExtD; m_idxMb = (DWORD(-1)); m_idxBs = (DWORD(-1)); if (m_pSlice == 0) { m_nSlices = nSlices; m_pSlice = new ENCODE_SET_SLICE_HEADER_MPEG2 [m_nSlices]; memset (m_pSlice,0,sizeof(ENCODE_SET_SLICE_HEADER_MPEG2)*m_nSlices); } else { if (m_nSlices < nSlices) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } if (m_nMBs == 0) { m_nMBs = nMBs; m_pMBs = new ENCODE_ENC_MB_DATA_MPEG2 [m_nMBs]; memset (m_pMBs,0,sizeof(ENCODE_ENC_MB_DATA_MPEG2)*m_nMBs); } else { if (m_nMBs < nMBs) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } // m_sps parameters m_bAddSPS = 1; m_bAddDisplayExt = par->bAddDisplayExt; if (funcId == ENCODE_ENC_ID) { m_sps.FrameWidth = par->mfxVideoParams.mfx.FrameInfo.Width; m_sps.FrameHeight = par->mfxVideoParams.mfx.FrameInfo.Height; } else if (funcId == ENCODE_ENC_PAK_ID) { m_sps.FrameWidth = (par->mfxVideoParams.mfx.FrameInfo.CropW!=0) ? par->mfxVideoParams.mfx.FrameInfo.CropW: par->mfxVideoParams.mfx.FrameInfo.Width; m_sps.FrameHeight = (par->mfxVideoParams.mfx.FrameInfo.CropH!=0) ? par->mfxVideoParams.mfx.FrameInfo.CropH: par->mfxVideoParams.mfx.FrameInfo.Height; } else return MFX_ERR_UNSUPPORTED; m_sps.Profile = (UCHAR)par->mfxVideoParams.mfx.CodecProfile; m_sps.Level = (UCHAR)par->mfxVideoParams.mfx.CodecLevel; m_sps.ChromaFormat = (UCHAR)par->mfxVideoParams.mfx.FrameInfo.ChromaFormat; m_sps.TargetUsage = (UCHAR)par->mfxVideoParams.mfx.TargetUsage; m_sps.progressive_sequence = par->mfxVideoParams.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE? 1:0; m_GOPPictureSize = par->mfxVideoParams.mfx.GopPicSize; m_GOPRefDist = (UCHAR)par->mfxVideoParams.mfx.GopRefDist; m_GOPOptFlag = (UCHAR)par->mfxVideoParams.mfx.GopOptFlag; { mfxU32 aw = (par->mfxVideoParams.mfx.FrameInfo.AspectRatioW != 0) ? par->mfxVideoParams.mfx.FrameInfo.AspectRatioW * m_sps.FrameWidth :m_sps.FrameWidth; mfxU32 ah = (par->mfxVideoParams.mfx.FrameInfo.AspectRatioH != 0) ? par->mfxVideoParams.mfx.FrameInfo.AspectRatioH * m_sps.FrameHeight:m_sps.FrameHeight; mfxU16 ar_code = 1; mfxI32 fr_code = 0, fr_codeN = 0, fr_codeD = 0; if(aw*3 == ah*4) ar_code = 2; else if(aw*9 == ah*16) ar_code = 3; else if(aw*100 == ah*221) ar_code = 4; else ar_code = 1; m_sps.AspectRatio = ar_code; if (!ConvertFrameRateMPEG2( par->mfxVideoParams.mfx.FrameInfo.FrameRateExtD, par->mfxVideoParams.mfx.FrameInfo.FrameRateExtN, fr_code, fr_codeN, fr_codeD)) { return MFX_ERR_UNSUPPORTED; } m_sps.FrameRateCode = (USHORT) fr_code; m_sps.FrameRateExtD = (USHORT) fr_codeD; m_sps.FrameRateExtN = (USHORT) fr_codeN; mfxU32 multiplier = std::max(par->mfxVideoParams.mfx.BRCParamMultiplier, 1); m_sps.bit_rate = (par->mfxVideoParams.mfx.RateControlMethod != MFX_RATECONTROL_CQP) ? par->mfxVideoParams.mfx.TargetKbps * multiplier : 0; m_sps.vbv_buffer_size =((par->mfxVideoParams.mfx.BufferSizeInKB * multiplier) >> 1); m_sps.low_delay = 0; m_sps.ChromaFormat = (UCHAR)par->mfxVideoParams.mfx.FrameInfo.ChromaFormat; m_sps.progressive_sequence = par->mfxVideoParams.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE? 1:0; m_sps.Profile = (UCHAR)par->mfxVideoParams.mfx.CodecProfile; m_sps.Level = (UCHAR)par->mfxVideoParams.mfx.CodecLevel; m_sps.TargetUsage = (UCHAR)par->mfxVideoParams.mfx.TargetUsage; m_sps.RateControlMethod = bAllowBRC ? (UCHAR)par->mfxVideoParams.mfx.RateControlMethod: 0; m_sps.MaxBitRate = (UINT)par->mfxVideoParams.mfx.MaxKbps * multiplier; m_sps.MinBitRate = m_sps.bit_rate; m_sps.UserMaxFrameSize = par->mfxVideoParams.mfx.BufferSizeInKB * 1000 * multiplier; m_sps.InitVBVBufferFullnessInBit = par->mfxVideoParams.mfx.InitialDelayInKB * 8000 * multiplier; m_sps.AVBRAccuracy = par->mfxVideoParams.mfx.Accuracy; m_sps.AVBRConvergence = par->mfxVideoParams.mfx.Convergence; } if (m_bAddDisplayExt) { m_vui.video_format = par->videoSignalInfo.VideoFormat; m_vui.colour_description = par->videoSignalInfo.ColourDescriptionPresent; if (par->videoSignalInfo.ColourDescriptionPresent) { m_vui.colour_primaries = par->videoSignalInfo.ColourPrimaries; m_vui.transfer_characteristics = par->videoSignalInfo.TransferCharacteristics; m_vui.matrix_coefficients = par->videoSignalInfo.MatrixCoefficients; } else { m_vui.colour_primaries = 0; m_vui.transfer_characteristics = 0; m_vui.matrix_coefficients = 0; } m_vui.display_horizontal_size = m_sps.FrameWidth; m_vui.display_vertical_size = m_sps.FrameHeight; } if (par->bMbqpMode) { mfxU32 wMB = (par->mfxVideoParams.mfx.FrameInfo.CropW + 15) / 16; mfxU32 hMB = (par->mfxVideoParams.mfx.FrameInfo.CropH + 15) / 16; m_mbqp_data = new mfxU8[wMB*hMB]; } m_bDisablePanicMode = par->bDisablePanicMode; // m_caps parameters m_caps.IntraPredBlockSize = (par->bAllowFieldDCT) ? ENC_INTER_BLOCK_SIZE_16x16|ENC_INTER_BLOCK_SIZE_16x8:ENC_INTRA_BLOCK_16x16; m_caps.IntraPredCostType = ENC_COST_TYPE_SAD; m_caps.InterPredBlockSize = (par->bAllowFieldDCT) ? ENC_INTER_BLOCK_SIZE_16x16|ENC_INTER_BLOCK_SIZE_16x8: ENC_INTER_BLOCK_SIZE_16x16; m_caps.MVPrecision = ENC_MV_PRECISION_INTEGER|ENC_MV_PRECISION_HALFPEL; m_caps.MECostType = ENC_COST_TYPE_PROPRIETARY; m_caps.MESearchType = ENC_INTER_SEARCH_TYPE_PROPRIETARY; m_caps.MVSearchWindowX = par->MVRangeP[0]; m_caps.MVSearchWindowY = par->MVRangeP[1]; m_caps.MEInterpolationMethod = ENC_INTERPOLATION_TYPE_BILINEAR; //m_caps.MEFractionalSearchType= ENC_COST_TYPE_SAD; m_caps.MaxMVs = 4; m_caps.SkipCheck = 1; m_caps.DirectCheck = 1; m_caps.BiDirSearch = (par->mfxVideoParams.mfx.GopRefDist > 1)? 1:0; m_caps.MBAFF = 0; m_caps.FieldPrediction = (par->bFieldCoding && par->mfxVideoParams.mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) ? 1:0; m_caps.RefOppositeField = 0; m_caps.ChromaInME = 0; m_caps.WeightedPrediction = 0; m_caps.RateDistortionOpt = 0; m_caps.MVPrediction = 1; m_caps.DirectVME = 0; InitFramesSet(0, 0, 0, 0, 0); return MFX_ERR_NONE; } // mfxStatus ExecuteBuffers::Init(const mfxVideoParamEx_MPEG2* par) mfxStatus ExecuteBuffers::Close() { delete [] m_pSlice; m_pSlice = 0; m_nSlices = 0; memset(&m_caps, 0, sizeof(m_caps)); memset(&m_sps, 0, sizeof(m_sps)); memset(&m_pps, 0, sizeof(m_pps)); m_idxMb = (DWORD(-1)); delete [] m_pMBs; delete [] m_mbqp_data; m_mbqp_data = 0; m_nMBs = 0; m_pMBs = 0; if (m_bOutOfRangeMV) { //printf ("\n\n --------- ERROR: Out of range MVs are found out. ---------\n\n"); m_bOutOfRangeMV = false; } if (m_bErrMBType) { //printf ("\n\n --------- ERROR: incorrect MB type ---------\n\n"); m_bOutOfRangeMV = false; } return MFX_ERR_NONE; } // mfxStatus ExecuteBuffers::Close() mfxStatus ExecuteBuffers::InitPictureParameters(mfxFrameParamMPEG2* pParams, mfxU32 frameNum) { m_pps.CurrReconstructedPic.bPicEntry = 0; m_pps.RefFrameList[0].bPicEntry = 0; m_pps.RefFrameList[1].bPicEntry = 0; m_pps.temporal_reference = pParams->TemporalReference; if (pParams->FrameType & MFX_FRAMETYPE_I) { m_pps.picture_coding_type = CODING_TYPE_I; } else if (pParams->FrameType & MFX_FRAMETYPE_P) { m_pps.picture_coding_type = CODING_TYPE_P; } else if (pParams->FrameType & MFX_FRAMETYPE_B) { m_pps.picture_coding_type = CODING_TYPE_B; } else { return MFX_ERR_UNSUPPORTED; } m_pps.FieldCodingFlag = 0; m_pps.FieldFrameCodingFlag = 0; m_pps.InterleavedFieldBFF = 0; m_pps.ProgressiveField = 0; m_pps.CurrReconstructedPic.AssociatedFlag = 0; if (pParams->ProgressiveFrame) { m_pps.FieldCodingFlag = 0; m_pps.FieldFrameCodingFlag = 0; m_pps.InterleavedFieldBFF = (pParams->TopFieldFirst)? 0:1; } else if (pParams->FieldPicFlag) { m_pps.FieldCodingFlag = 1; m_pps.FieldFrameCodingFlag = 0; m_pps.InterleavedFieldBFF = 0; m_pps.CurrReconstructedPic.AssociatedFlag = (pParams->BottomFieldFlag)? 1:0; } else { m_pps.FieldCodingFlag = 0; m_pps.FieldFrameCodingFlag = 1; m_pps.InterleavedFieldBFF = (pParams->TopFieldFirst)? 0:1; } m_pps.NumSlice = UCHAR(pParams->FrameHinMbMinus1 + 1); m_pps.bPicBackwardPrediction = pParams->BackwardPredFlag; m_pps.bBidirectionalAveragingMode= (pParams->BackwardPredFlag && pParams->ForwardPredFlag); m_pps.bUseRawPicForRef = m_bUseRawFrames; m_pps.StatusReportFeedbackNumber = frameNum + 1; m_pps.alternate_scan = pParams->AlternateScan; m_pps.intra_vlc_format = pParams->IntraVLCformat; m_pps.q_scale_type = pParams->QuantScaleType; m_pps.concealment_motion_vectors = pParams->ConcealmentMVs; m_pps.frame_pred_frame_dct = (pParams->FrameDCTprediction )?1:0; m_pps.DisableMismatchControl = 0; m_pps.intra_dc_precision = pParams->IntraDCprecision; m_pps.f_code00 = (pParams->BitStreamFcodes >> 12) & 0x0f; m_pps.f_code01 = (pParams->BitStreamFcodes >> 8 ) & 0x0f; m_pps.f_code10 = (pParams->BitStreamFcodes >> 4 ) & 0x0f; m_pps.f_code11 = (pParams->BitStreamFcodes >> 0 ) & 0x0f; m_pps.bLastPicInStream = (pParams->ExtraFlags & MFX_IFLAG_ADD_EOS)!=0 ? 1:0; m_pps.bNewGop = m_pps.picture_coding_type == CODING_TYPE_I && (!pParams->FieldPicFlag || pParams->SecondFieldFlag)? 1:0; m_pps.GopPicSize = m_GOPPictureSize; m_pps.GopRefDist = m_GOPRefDist; m_pps.GopOptFlag = m_GOPOptFlag; { mfxI32 num = 0; mfxI32 fps = 0, pict = 0, sec = 0, minute = 0, hour = 0; num = frameNum; fps = (Ipp32s)(m_fFrameRate + 0.5); pict = num % fps; num = (num - pict) / fps; sec = num % 60; num = (num - sec) / 60; minute = num % 60; num = (num - minute) / 60; hour = num % 24; m_pps.time_code =(hour<<19) | (minute<<13) | (1<<12) | (sec<<6) | pict; } m_pps.temporal_reference = pParams->TemporalReference; m_pps.vbv_delay = (USHORT)pParams->VBVDelay; m_pps.repeat_first_field = pParams->RepeatFirstField; m_pps.composite_display_flag = 0; m_pps.v_axis = 0; m_pps.field_sequence = 0; m_pps.sub_carrier = 0; m_pps.burst_amplitude = 0; m_pps.sub_carrier_phase = 0; if ((pParams->ExtraFlags & MFX_IFLAG_ADD_HEADER)!=0 && !pParams->SecondFieldFlag) { m_bAddSPS = 1; } m_pps.bPic4MVallowed = 1; return MFX_ERR_NONE; } void ExecuteBuffers::InitFramesSet(mfxMemId curr, bool bExternal, mfxMemId rec, mfxMemId ref_0,mfxMemId ref_1) { m_CurrFrameMemID = curr; m_bExternalCurrFrame = bExternal; m_bExternalCurrFrameHDL = false; m_RecFrameMemID = rec; m_RefFrameMemID[0] = ref_0; m_RefFrameMemID[1] = ref_1; } static Ipp32s QuantToScaleCode(Ipp32s quant_value, Ipp32s q_scale_type) { if (q_scale_type == 0) { return (quant_value + 1)/2; } else { if (quant_value <= 8) return quant_value; else if (quant_value <= 24) return 8 + (quant_value - 8)/2; else if (quant_value <= 56) return 16 + (quant_value - 24)/4; else return 24 + (quant_value - 56)/8; } } mfxStatus ExecuteBuffers::InitSliceParameters(mfxU8 qp, mfxU16 scale_type, mfxU8 * mbqp, mfxU32 numMB) { if (m_pps.NumSlice > m_nSlices) return MFX_ERR_UNSUPPORTED; mfxU8 intra = (m_pps.picture_coding_type == CODING_TYPE_I)? 1:0; mfxU16 numMBSlice = (mfxU16)((m_sps.FrameWidth +15)>>4); bool isMBQP = (m_mbqp_data != 0) && (mbqp != 0) && (mbqp[0] != 0); if (isMBQP) { for (mfxU32 i = 0; i < numMB; i++) { m_mbqp_data[i] = (Ipp8u)QuantToScaleCode(mbqp[i], scale_type); } } for (int i=0; i<(int)m_pps.NumSlice; i++) { ENCODE_SET_SLICE_HEADER_MPEG2* pDDISlice = &m_pSlice[i]; pDDISlice->FirstMbX = 0; pDDISlice->FirstMbY = (mfxU16)i; pDDISlice->NumMbsForSlice = numMBSlice; pDDISlice->IntraSlice = intra; pDDISlice->quantiser_scale_code = isMBQP ? mbqp[i*numMBSlice] : qp; //pDDISlice->quantiser_scale_code = qp; } return MFX_ERR_NONE; } // mfxStatus ExecuteBuffers::InitSliceParameters //depreciated functions namespace MfxHwMpeg2Encode { bool ConvertFrameRateMPEG2(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxI32 &frame_rate_code, mfxI32 &frame_rate_extension_n, mfxI32 &frame_rate_extension_d) { static const mfxF64 ratetab[8]= {24000.0/1001.0,24.0,25.0,30000.0/1001.0,30.0,50.0,60000.0/1001.0,60.0}; const mfxI32 sorted_ratio[][2] = { {1,32},{1,31},{1,30},{1,29},{1,28},{1,27},{1,26},{1,25},{1,24},{1,23},{1,22},{1,21},{1,20},{1,19},{1,18},{1,17}, {1,16},{2,31},{1,15},{2,29},{1,14},{2,27},{1,13},{2,25},{1,12},{2,23},{1,11},{3,32},{2,21},{3,31},{1,10},{3,29}, {2,19},{3,28},{1, 9},{3,26},{2,17},{3,25},{1, 8},{4,31},{3,23},{2,15},{3,22},{4,29},{1, 7},{4,27},{3,20},{2,13}, {3,19},{4,25},{1, 6},{4,23},{3,17},{2,11},{3,16},{4,21},{1, 5},{4,19},{3,14},{2, 9},{3,13},{4,17},{1, 4},{4,15}, {3,11},{2, 7},{3,10},{4,13},{1, 3},{4,11},{3, 8},{2, 5},{3, 7},{4, 9},{1, 2},{4, 7},{3, 5},{2, 3},{3, 4},{4, 5}, {1,1},{4,3},{3,2},{2,1},{3,1},{4,1} }; const mfxI32 srsize = sizeof(sorted_ratio)/sizeof(sorted_ratio[0]); const mfxI32 rtsize = sizeof(ratetab)/sizeof(ratetab[0]); if (!FrameRateExtD || !FrameRateExtN) { return false; } mfxF64 new_fr = (mfxF64)FrameRateExtN/(mfxF64)FrameRateExtD; mfxI32 i=0, j=0, besti=0, bestj=0; mfxF64 ratio=0.0, bestratio = 1.5; mfxI32 fr1001 = (Ipp32s)(new_fr*1001+.5); frame_rate_code = 5; frame_rate_extension_n = 0; frame_rate_extension_d = 0; for(j=0;j -0.0001) { // was checked above with bigger range frame_rate_code = j+1; frame_rate_extension_n = frame_rate_extension_d = 0; return true; } for(i=0;i new_fr*sorted_ratio[i][1]) : true) { if(i>0) { ratio = ratetab[j]*sorted_ratio[i-1][0] / (new_fr*sorted_ratio[i-1][1]); // up to 1 if(1/ratio < bestratio) { besti = i-1; bestj = j; bestratio = 1/ratio; } } if(i 1.005) return false; frame_rate_code = bestj+1; frame_rate_extension_n = sorted_ratio[besti][0]-1; frame_rate_extension_d = sorted_ratio[besti][1]-1; return true; } } #endif /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_debug_hw.cpp000066400000000000000000000517411443134507600325370ustar00rootroot00000000000000// Copyright (c) 2002-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_mpeg2_encode_hw.h" #if defined (MPEG2_ENCODE_DEBUG_HW) #include "mfx_mpeg2_enc_defs_hw.h" #include "ippi.h" #include enum MPEG2FrameType { MPEG2_I_PICTURE = 1, MPEG2_P_PICTURE = 2, MPEG2_B_PICTURE = 3 }; typedef struct _IppMotionVector2 { int32_t x; int32_t y; int32_t mctype_l; int32_t offset_l; int32_t mctype_c; int32_t offset_c; } IppMotionVector2; int ImgCopy(uint8_t* pSrc, int srcStep, uint8_t* pDst, int dstStep,mfxSize roiSize, int cc_flag) { int x,y; for(y = 0; y < roiSize.height; y++) { for(x = 0; x < roiSize.width; x++) { pDst[x] = pSrc[cc_flag*x];//cc_flag is used for conversion from NV12 to U&V planes } pSrc+=srcStep; pDst+=dstStep; } return 0; } #define COL_Y_STEP_Y 1 #define COL_U_STEP_UV 1 #define COL_V_STEP_UV 1 #define COL_U_STEP_Y 2 #define COL_V_STEP_Y 2 #define COPY_FRAME_BLOCK(X, CC, C, DIR) \ ImgCopy( \ state->X##RecFrame[mbinfo->mv_field_sel[2][DIR]][DIR] + vector[2][DIR].offset_##C, \ state->CC##FrameHSize, \ mb_debug_info[k].X##BlockRec[DIR][0], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC) #define COPY_FIELD_BLOCKS(X, CC, C, DIR) \ if(!pPAK->m_cuc->FrameParam->MPEG2.FieldPicFlag) \ { \ ImgCopy( \ state->X##RecFrame[mbinfo->mv_field_sel[0][DIR]][DIR] + vector[0][DIR].offset_##C, \ 2*(state->CC##FrameHSize), \ mb_debug_info[k].X##BlockRec[DIR][0], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ ImgCopy( \ state->X##RecFrame[mbinfo->mv_field_sel[1][DIR]][DIR] + vector[1][DIR].offset_##C, \ 2*(state->CC##FrameHSize), \ mb_debug_info[k].X##BlockRec[DIR][1], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ }else{ \ ImgCopy( \ state->X##RecFrame[mbinfo->mv_field_sel[0][DIR]][DIR] + vector[0][DIR].offset_##C, \ state->CC##FrameHSize, \ mb_debug_info[k].X##BlockRec[DIR][0], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ ImgCopy( \ state->X##RecFrame[mbinfo->mv_field_sel[1][DIR]][DIR] + vector[1][DIR].offset_##C + roi_##C.height*(state->CC##FrameHSize), \ state->CC##FrameHSize, \ mb_debug_info[k].X##BlockRec[DIR][1], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ } #define COPY_FIELD_BLOCKS_DP(X, CC, C) \ if(!pPAK->m_cuc->FrameParam->MPEG2.FieldPicFlag) \ { \ ImgCopy( \ state->X##RecFrame[0][0] + vector[0][0].offset_##C, \ 2*(state->CC##FrameHSize), \ mb_debug_info[k].X##BlockRec[0][0], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ ImgCopy( \ state->X##RecFrame[1][0] + vector[0][0].offset_##C, \ 2*(state->CC##FrameHSize), \ mb_debug_info[k].X##BlockRec[0][1], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ }else{ \ ImgCopy( \ state->X##RecFrame[pPAK->m_cuc->FrameParam->MPEG2.BottomFieldFlag][0] + vector[0][0].offset_##C, \ state->CC##FrameHSize, \ mb_debug_info[k].X##BlockRec[0][0], \ roi_##C.width, \ roi_##C, \ COL_##X##_STEP_##CC); \ } void MPEG2EncodeDebug_HW::GatherInterRefMBlocksData(int k,void *vector_in,void *pState,void *pMbinfo) { int numEncodedFrames = encode_hw->m_OutputFrameOrder + 1; if(use_reference_log != 1 || numEncodedFrames < minFrameIndex || numEncodedFrames > maxFrameIndex) return; int32_t curr_field = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.SecondFieldFlag; mfxI32 MBcountV = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameHinMbMinus1+1; mfxI32 MBcountH = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameWinMbMinus1+1; mfxI32 mbstart = (curr_field == 0)?0:(MBcountV*MBcountH / 2);// offset to switch between top and bottom k += mbstart; MPEG2FrameState *state = (MPEG2FrameState *)pState; MBInfo *mbinfo =(MBInfo *) pMbinfo; MFXVideoPAKMPEG2 *pPAK = encode_hw->m_pPAK; IppMotionVector2 vector[3][2]; MFX_INTERNAL_CPY(mb_debug_info[k].ref_vfield_select,mbinfo->mv_field_sel,sizeof(int[3][2])); MFX_INTERNAL_CPY(vector,vector_in,sizeof(IppMotionVector2[3][2])); mfxSize roi_l = {16,16}, roi_c = {pPAK->BlkWidth_c,pPAK->BlkHeight_c}; if(mbinfo->prediction_type == MC_FRAME) { if(mbinfo->mb_type & MB_FORWARD) { COPY_FRAME_BLOCK(Y,Y,l,0); if(pPAK->m_info.FrameInfo.FourCC == MFX_FOURCC_NV12) { COPY_FRAME_BLOCK(U,Y,c,0); COPY_FRAME_BLOCK(V,Y,c,0); } else { COPY_FRAME_BLOCK(U,UV,c,0); COPY_FRAME_BLOCK(V,UV,c,0); } } if(mbinfo->mb_type & MB_BACKWARD) { COPY_FRAME_BLOCK(Y,Y,l,1); if(pPAK->m_info.FrameInfo.FourCC == MFX_FOURCC_NV12) { COPY_FRAME_BLOCK(U,Y,c,1); COPY_FRAME_BLOCK(V,Y,c,1); } else { COPY_FRAME_BLOCK(U,UV,c,1); COPY_FRAME_BLOCK(V,UV,c,1); } } }else if(mbinfo->prediction_type == MC_FIELD) { roi_l.height /= 2; roi_c.height /= 2; if(mbinfo->mb_type & MB_FORWARD) { COPY_FIELD_BLOCKS(Y,Y,l,0); if(pPAK->m_info.FrameInfo.FourCC == MFX_FOURCC_NV12) { COPY_FIELD_BLOCKS(U,Y,c,0); COPY_FIELD_BLOCKS(V,Y,c,0); } else { COPY_FIELD_BLOCKS(U,UV,c,0); COPY_FIELD_BLOCKS(V,UV,c,0); } } if(mbinfo->mb_type & MB_BACKWARD) { COPY_FIELD_BLOCKS(Y,Y,l,1); if(pPAK->m_info.FrameInfo.FourCC == MFX_FOURCC_NV12) { COPY_FIELD_BLOCKS(U,Y,c,1); COPY_FIELD_BLOCKS(V,Y,c,1); } else { COPY_FIELD_BLOCKS(U,UV,c,1); COPY_FIELD_BLOCKS(V,UV,c,1); } } }else if(mbinfo->prediction_type == MC_DMV) { if(!pPAK->m_cuc->FrameParam->MPEG2.FieldPicFlag) { roi_l.height /= 2; roi_c.height /= 2; } COPY_FIELD_BLOCKS_DP(Y,Y,l); if(pPAK->m_info.FrameInfo.FourCC == MFX_FOURCC_NV12) { COPY_FIELD_BLOCKS_DP(U,Y,c); COPY_FIELD_BLOCKS_DP(V,Y,c); } else { COPY_FIELD_BLOCKS_DP(U,UV,c); COPY_FIELD_BLOCKS_DP(V,UV,c); } } } void MPEG2EncodeDebug_HW::SetNoMVMb(int k) { int numEncodedFrames = encode_hw->m_OutputFrameOrder + 1; if(numEncodedFrames < minFrameIndex || numEncodedFrames > maxFrameIndex) return; int32_t curr_field = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.SecondFieldFlag; mfxI32 MBcountV = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameHinMbMinus1+1; mfxI32 MBcountH = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameWinMbMinus1+1; mfxI32 mbstart = (curr_field == 0)?0:(MBcountV*MBcountH / 2);// offset to switch between top and bottom mb_debug_info[k + mbstart].no_motion_flag = 1; } void MPEG2EncodeDebug_HW::SetSkippedMb(int k) { int numEncodedFrames = encode_hw->m_OutputFrameOrder + 1; if(numEncodedFrames < minFrameIndex || numEncodedFrames > maxFrameIndex) return; int32_t curr_field = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.SecondFieldFlag; mfxI32 MBcountV = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameHinMbMinus1+1; mfxI32 MBcountH = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameWinMbMinus1+1; mfxI32 mbstart = (curr_field == 0)?0:(MBcountV*MBcountH / 2);// offset to switch between top and bottom mb_debug_info[k + mbstart].skipped = 1; } void MPEG2EncodeDebug_HW::CreateDEBUGframeLog() { int numEncodedFrames = encode_hw->m_OutputFrameOrder + 1; if(numEncodedFrames < minFrameIndex || numEncodedFrames > maxFrameIndex) return; MFXVideoENCMPEG2_HW *enc_hw = encode_hw->m_pENC; mfxU8 mFrameType = enc_hw->m_cuc->FrameParam->MPEG2.FrameType; int32_t curr_field = enc_hw->m_cuc->FrameParam->MPEG2.SecondFieldFlag; mfxI32 MBcountV = enc_hw->m_cuc->FrameParam->MPEG2.FrameHinMbMinus1+1; mfxI32 MBcountH = enc_hw->m_cuc->FrameParam->MPEG2.FrameWinMbMinus1+1; mfxI32 mbstart = (curr_field == 0)?0:(MBcountV*MBcountH / 2); int i,j,k,is_skipped; char frameLogName[2048],mb_type_log[128],mv_log[128],quantizer_log[128],*fieldName; char frame_type = (mFrameType & MFX_FRAMETYPE_I)? 'I' : ((mFrameType & MFX_FRAMETYPE_P)? 'P':'B'); fieldName = (!enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag)? "" :((enc_hw->m_cuc->FrameParam->MPEG2.BottomFieldFlag)? "(bottom)":"(top)"); sprintf(frameLogName,"%s\\%d_%c%s.log",debug_logs_folder,numEncodedFrames,frame_type,fieldName); FILE *frameLogFile = fopen(frameLogName,"w"); if(frameLogFile == NULL) { printf("Couldn't write to %s file\n",frameLogName); return ; } for(k = mbstart, j=0; j < MBcountV*BlkWidth_l; j += 16) { for(i=0; i < MBcountH*BlkWidth_l; i += 16, k++) { is_skipped = 0; mv_log[0] = 0; quantizer_log[0] = 0; if(enc_hw->pMBInfo0[k].mb_type & MB_INTRA){ strcpy(mb_type_log,"mb_type Intra;"); sprintf(quantizer_log,"quant: %d;",mb_debug_info[k].quantizer); } else if(enc_hw->pMBInfo0[k].skipped == 1 || enc_hw->pMBInfo0[k].mb_type == 0 || mb_debug_info[k].skipped == 1){ strcpy(mb_type_log,"mb_type Inter skip;"); is_skipped = 1; } else if(mb_debug_info[k].no_motion_flag == 1 && enc_hw->pMBInfo0[k].prediction_type == MC_FRAME && (mFrameType & MFX_FRAMETYPE_P)){ strcpy(mb_type_log,"mb_type Inter (MC_ZERO);"); sprintf(quantizer_log,"quant: %d;",mb_debug_info[k].quantizer); } else if((enc_hw->pMBInfo0[k].mb_type & (MB_FORWARD | MB_BACKWARD)) == (MB_FORWARD | MB_BACKWARD)){ strcpy(mb_type_log,"mb_type Inter F/B"); sprintf(quantizer_log,"quant: %d;",mb_debug_info[k].quantizer); sprintf(mv_log,"MV_F x:%+2d y:%+2d; MV_B x:%+2d y:%+2d",enc_hw->pMBInfo0[k].MV[0][0].x, enc_hw->pMBInfo0[k].MV[0][0].y, enc_hw->pMBInfo0[k].MV[0][1].x, enc_hw->pMBInfo0[k].MV[0][1].y); } else if(enc_hw->pMBInfo0[k].mb_type & MB_FORWARD){ strcpy(mb_type_log,"mb_type Inter F"); sprintf(quantizer_log,"quant: %d;",mb_debug_info[k].quantizer); if(enc_hw->pMBInfo0[k].prediction_type == MC_DMV) { //sprintf(mv_log,"MV_F x:%+2d y:%+2d, DMV x:%+2d y:%+2d",enc_hw->pMBInfo0[k].dpMV[curr_field][0].x, // enc_hw->pMBInfo0[k].dpMV[curr_field][0].y << (enc_hw->picture_structure == FRAME_PICTURE), // enc_hw->pMBInfo0[k].dpDMV[curr_field].x, // enc_hw->pMBInfo0[k].dpDMV[curr_field].y); sprintf(mv_log,"Dual prime not supported\n"); } else sprintf(mv_log,"MV_F x:%+2d y:%+2d",enc_hw->pMBInfo0[k].MV[0][0].x, enc_hw->pMBInfo0[k].MV[0][0].y); } else //if(enc_hw->pMBInfo0[k].mb_type & MB_BACKWARD) { strcpy(mb_type_log,"mb_type Inter B"); sprintf(quantizer_log,"quant: %d;",mb_debug_info[k].quantizer); sprintf(mv_log,"MV_B x:%+2d y:%+2d",enc_hw->pMBInfo0[k].MV[0][1].x, enc_hw->pMBInfo0[k].MV[0][1].y); } if(mv_log[0] != 0) { if(enc_hw->pMBInfo0[k].prediction_type == MC_FIELD) { char tmp_buf[128]; if((enc_hw->pMBInfo0[k].mb_type & (MB_FORWARD | MB_BACKWARD)) == (MB_FORWARD | MB_BACKWARD)) sprintf(tmp_buf," (field1); MV_F x:%+2d y:%+2d; MV_B x:%+2d y:%+2d (field2)",enc_hw->pMBInfo0[k].MV[1][0].x,enc_hw->pMBInfo0[k].MV[1][0].y,enc_hw->pMBInfo0[k].MV[1][1].x,enc_hw->pMBInfo0[k].MV[1][1].y); else if(enc_hw->pMBInfo0[k].mb_type & MB_FORWARD) sprintf(tmp_buf," (field1); MV_F x:%+2d y:%+2d (field2)",enc_hw->pMBInfo0[k].MV[1][0].x,enc_hw->pMBInfo0[k].MV[1][0].y); else //if(enc_hw->pMBInfo0[k].mb_type & MB_BACKWARD) sprintf(tmp_buf," (field1); MV_B x:%+2d y:%+2d (field2)",enc_hw->pMBInfo0[k].MV[1][1].x,enc_hw->pMBInfo0[k].MV[1][1].y); strcat(mb_type_log," (MC_FIELD);"); strcat(mv_log,tmp_buf); }else if(enc_hw->pMBInfo0[k].prediction_type == MC_FRAME) { strcat(mb_type_log," (MC_FRAME);"); } else { strcat(mb_type_log," (MC_DMV);"); } } if(!use_mb_type) mb_type_log[0] = 0; if(!use_mb_MVinfo) mv_log[0] = 0; if(!use_quantizer_info) quantizer_log[0] = 0; int mb_y = (!enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag)? j/16 :((enc_hw->m_cuc->FrameParam->MPEG2.BottomFieldFlag)? j/16 + MBcountV : j/16); fprintf(frameLogFile,"MB(%dx%d) %s %s %s\n",i/16,mb_y,mb_type_log,quantizer_log,mv_log); if(use_extended_log == 1 && !is_skipped) { fprintf(frameLogFile,"MB data:"); for (int blk = 0; blk < enc_hw->m_block_count; blk++) { if(mb_debug_info[k].Count[blk]) { fprintf(frameLogFile,"\n blk %d:",blk); for(int i = 0; i < 64; i++) fprintf(frameLogFile," %d",mb_debug_info[k].encMbData[blk][i]); }else if(enc_hw->pMBInfo0[k].mb_type & MB_INTRA) { fprintf(frameLogFile,"\n blk %d: %d",blk,mb_debug_info[k].encMbData[blk][0]); }else { fprintf(frameLogFile,"\n blk %d: ---",blk); } } fprintf(frameLogFile,"\n"); } if(use_reference_log == 1 && !(mFrameType & MFX_FRAMETYPE_I) && !is_skipped) { int ref_pos[2][2][2];//fld1|fld2, fwd|bwd, x|y int print_size[2][2][2],size_l,size_c;//l|c,fwd|bwd,fld1|fld2 int fld_offset; for(int dir_i = 0; dir_i < 2; dir_i++) { for(int fld_i = 0; fld_i < 2; fld_i++) { if(enc_hw->pMBInfo0[k].prediction_type == MC_FRAME) mb_debug_info[k].ref_vfield_select[fld_i][dir_i] = mb_debug_info[k].ref_vfield_select[2][dir_i]; fld_offset = (enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag && mb_debug_info[k].ref_vfield_select[fld_i][dir_i] != 0)? MBcountV*BlkWidth_l : 0; ref_pos[fld_i][dir_i][0] = ((enc_hw->pMBInfo0[k].MV[fld_i][dir_i].x>>1) + i); ref_pos[fld_i][dir_i][1] = ((enc_hw->pMBInfo0[k].MV[fld_i][dir_i].y>>1) + j + fld_offset); } } size_l = BlkHeight_l * BlkWidth_l; size_c = enc_hw->BlkHeight_c * enc_hw->BlkWidth_c; if(enc_hw->pMBInfo0[k].prediction_type == MC_FIELD || (enc_hw->pMBInfo0[k].prediction_type == MC_DMV && (!enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag))) { size_l /= 2; size_c /= 2; } memset(print_size,0,sizeof(print_size)); if(enc_hw->pMBInfo0[k].mb_type & MB_FORWARD) { print_size[0][0][0] = size_l; print_size[1][0][0] = size_c; if(enc_hw->pMBInfo0[k].prediction_type == MC_FIELD || (enc_hw->pMBInfo0[k].prediction_type == MC_DMV && (!enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag))) { print_size[0][0][1] = size_l; print_size[1][0][1] = size_c; } } if(enc_hw->pMBInfo0[k].mb_type & MB_BACKWARD) { print_size[0][1][0] = size_l; print_size[1][1][0] = size_c; if(enc_hw->pMBInfo0[k].prediction_type == MC_FIELD || (enc_hw->pMBInfo0[k].prediction_type == MC_DMV && (!enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag))) { print_size[0][1][1] = size_l; print_size[1][1][1] = size_c; } } for(int dir_i = 0; dir_i < 2; dir_i++) { for(int fld_i = 0; fld_i < 2 && print_size[0][dir_i][fld_i] > 0; fld_i++) { fprintf(frameLogFile,"\n reference MB(%dx%d)",ref_pos[fld_i][dir_i][0],ref_pos[fld_i][dir_i][1]); if(dir_i == 0) fprintf(frameLogFile," FWD"); else fprintf(frameLogFile," BWD"); if(enc_hw->pMBInfo0[k].prediction_type == MC_FIELD || enc_hw->m_cuc->FrameParam->MPEG2.FieldPicFlag) fprintf(frameLogFile," %s (field %d)",mb_debug_info[k].ref_vfield_select[fld_i][dir_i]?"BOTTOM":"TOP",fld_i+1); fprintf(frameLogFile,"\n"); if(1) { fprintf(frameLogFile,"\n Y:"); for(int i = 0; i < print_size[0][dir_i][fld_i]; i++)fprintf(frameLogFile," %d",mb_debug_info[k].YBlockRec[dir_i][fld_i][i]); fprintf(frameLogFile,"\n U:"); for(int i = 0; i < print_size[1][dir_i][fld_i]; i++)fprintf(frameLogFile," %d",mb_debug_info[k].UBlockRec[dir_i][fld_i][i]); fprintf(frameLogFile,"\n V:"); for(int i = 0; i < print_size[1][dir_i][fld_i]; i++)fprintf(frameLogFile," %d",mb_debug_info[k].VBlockRec[dir_i][fld_i][i]); } } } fprintf(frameLogFile,"\n"); } fprintf(frameLogFile,"\n"); memset(&mb_debug_info[k],0,sizeof(MbDebugInfo)); } } if(frameLogFile)fclose(frameLogFile); } void MPEG2EncodeDebug_HW::GatherBlockData(int k,int blk,int picture_coding_type,int quantiser_scale_value,int16_t *quantMatrix,int16_t *pBlock,int Count,int intra_flag,int intra_dc_shift) { int numEncodedFrames = encode_hw->m_OutputFrameOrder + 1; if(use_extended_log == 0 || numEncodedFrames < minFrameIndex || numEncodedFrames > maxFrameIndex) return; int32_t curr_field = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.SecondFieldFlag; mfxI32 MBcountV = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameHinMbMinus1+1; mfxI32 MBcountH = encode_hw->m_pPAK->m_cuc->FrameParam->MPEG2.FrameWinMbMinus1+1; mfxI32 mbstart = (curr_field == 0)?0:(MBcountV*MBcountH / 2);// offset to switch between top and bottom k += mbstart; mb_debug_info[k].quantizer = quantiser_scale_value; if(use_extended_log == 1) { mb_debug_info[k].Count[blk] = Count; if(Count) { //debug for non reference frames should prepare data by itself if(picture_coding_type == MPEG2_B_PICTURE) { if(intra_flag) { pBlock[0] <<= intra_dc_shift; ippiQuantInvIntra_MPEG2_16s_C1I(pBlock, quantiser_scale_value,quantMatrix); } else { ippiQuantInv_MPEG2_16s_C1I(pBlock, quantiser_scale_value, quantMatrix); } } MFX_INTERNAL_CPY(mb_debug_info[k].encMbData[blk],pBlock,8*8*sizeof(int16_t)); } else if(intra_flag) { mb_debug_info[k].encMbData[blk][0] = pBlock[0]; if(picture_coding_type == MPEG2_B_PICTURE) mb_debug_info[k].encMbData[blk][0] <<= intra_dc_shift; } } } void MPEG2EncodeDebug_HW::Init(MFXVideoENCODEMPEG2_HW *pEncode_hw) { encode_hw = pEncode_hw; use_manual_setup = MP2_DBG_MANUAL_SETUP; use_reference_log = MP2_DBG_ADD_REF_DATA; use_mb_type = MP2_DBG_ADD_MB_TYPE; use_mb_MVinfo = MP2_DBG_ADD_MB_MVINFO; use_quantizer_info = MP2_DBG_ADD_QUANT; minFrameIndex = MP2_DBG_FRAME_MIN; maxFrameIndex = MP2_DBG_FRAME_MAX; debug_logs_folder = (char*)malloc(1024); if(use_manual_setup) { printf("Debug mode.\nEnter folder to put logs in it:"); scanf("%s",debug_logs_folder); printf("\nEnter mode (1 - with MB data, 0 - without):"); scanf("%d",&use_extended_log); } else { use_extended_log = MP2_DBG_EXTENDED_MODE; strcpy(debug_logs_folder,MP2_DBG_DEBUG_LOG_FOLDER); } system("rd /S /Q " MP2_DBG_DEBUG_LOG_FOLDER ""); _mkdir(debug_logs_folder); //allocating memory mb_num = (encode_hw->m_pENC->m_info.FrameInfo.Height * encode_hw->m_pENC->m_info.FrameInfo.Width/256); //if(encode_hw->m_pFrameCUC->FrameParam->MPEG2.FieldPicFlag) mb_num /=2; mb_debug_info = (MbDebugInfo*)malloc(mb_num*sizeof(MbDebugInfo)); memset(mb_debug_info,0,mb_num*sizeof(MbDebugInfo)); } void MPEG2EncodeDebug_HW::Free() { if(debug_logs_folder != NULL) { free(debug_logs_folder); } if(mb_debug_info != NULL) { free(mb_debug_info); } } #endif // MPEG2_ENCODE_DEBUG_HW && __SW_ENC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_factory.cpp000066400000000000000000000032261443134507600324150ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfx_mpeg2_encode_interface.h" #include "mfx_mpeg2_encode_vaapi.h" using namespace MfxHwMpeg2Encode; DriverEncoder* MfxHwMpeg2Encode::CreatePlatformMpeg2Encoder( VideoCORE* core ) { assert( core ); return new VAAPIEncoder(core); } // DriverEncoder* MfxHwMpeg2Encode::CreatePlatformMpeg2Encoder( VideoCORE* core ) #endif // #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_full_hw.cpp000066400000000000000000000501431443134507600324060ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfx_mpeg2_encode_full_hw.h" #include "mfx_task.h" #include "mfx_enc_common.h" using namespace MPEG2EncoderHW; #define HLEN 22 #define AVBR_WA true static mfxStatus RunSeqHeader(mfxVideoParam *par, mfxU8* pBuffer, mfxU16 maxLen, mfxU16 &len) { MFX_CHECK_NULL_PTR2(par, pBuffer); MFX_CHECK(maxLen - len >= HLEN,MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK(par->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV420,MFX_ERR_UNSUPPORTED); mfxU8 *pHeader = pBuffer + len; mfxU32 h = (par->mfx.FrameInfo.CropH!=0)? par->mfx.FrameInfo.CropH:par->mfx.FrameInfo.Height; mfxU32 w = (par->mfx.FrameInfo.CropW!=0)? par->mfx.FrameInfo.CropW:par->mfx.FrameInfo.Width; mfxI32 fr_code = 0, fr_codeN = 0, fr_codeD = 0; mfxU32 aw = (par->mfx.FrameInfo.AspectRatioW != 0) ? par->mfx.FrameInfo.AspectRatioW * w :w; mfxU32 ah = (par->mfx.FrameInfo.AspectRatioH != 0) ? par->mfx.FrameInfo.AspectRatioH * h :h; mfxU16 ar_code = GetAspectRatioCode (aw, ah); ConvertFrameRateMPEG2(par->mfx.FrameInfo.FrameRateExtD, par->mfx.FrameInfo.FrameRateExtN, fr_code, fr_codeN, fr_codeD); mfxU32 bitrate = 0; mfxU32 buffer_size = 0; if (par->mfx.RateControlMethod != MFX_RATECONTROL_CQP) { bitrate = (par->mfx.TargetKbps * 5 + 1)>>1; buffer_size = par->mfx.BufferSizeInKB>>1; } int32_t prog_seq = (par->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) ? 1 : 0; int32_t chroma_format_code = 1; uint32_t profile = 4; uint32_t level = 8; switch (par->mfx.CodecProfile) { case MFX_PROFILE_MPEG2_SIMPLE: profile = 5; break; case MFX_PROFILE_MPEG2_MAIN: profile = 4; break; case MFX_PROFILE_MPEG2_HIGH: profile = 1; break; } switch (par->mfx.CodecLevel) { case MFX_LEVEL_MPEG2_LOW: level = 10; break; case MFX_LEVEL_MPEG2_MAIN: level = 8; break; case MFX_LEVEL_MPEG2_HIGH: level = 4; break; case MFX_LEVEL_MPEG2_HIGH1440: level = 6; break; } memset (pHeader, 0, HLEN*sizeof(mfxU8)); pHeader[2] = 0x01; pHeader[3] = 0xB3; pHeader[4] = mfxU8 ((w >> 4) & 0xFF); pHeader[5] = mfxU8 (((w & 0x0F) << 4)|((h >> 8)&0x0F)); pHeader[6] = mfxU8 (h & 0xFF); pHeader[7] = mfxU8 (((ar_code << 4) & 0xF0)|(fr_code&0x0F)); pHeader[8] = mfxU8 ((bitrate >> 10) & 0xFF); pHeader[9] = mfxU8 ((bitrate >> 2) & 0xFF); pHeader[10] = mfxU8 (((bitrate & 0x03) <<6)|(1<<5)| ((buffer_size >> 5) & 0x1F)); pHeader[11] = mfxU8 ((buffer_size & 0x1F)<<3); //SequenceExtension pHeader[14] = 0x01; pHeader[15] = 0xB5; pHeader[16] = mfxU8 ((1<<4)| (profile & 0x0F)); pHeader[17] = mfxU8 ((level << 4)| (prog_seq <<3) | (chroma_format_code << 1) | ((w >>13) & 0x01)); pHeader[18] = mfxU8 (((w >>(12 - 7)) & 0x80) | ((h>>(12 - 5)) & 0x60 )| ((bitrate >> 18)& 0x1F)); pHeader[19] = mfxU8 (((bitrate >>(18 + 5 - 1))&0xFE)|0x01); pHeader[20] = mfxU8 ((buffer_size >> 11) &0xFF); pHeader[21] = mfxU8 (((fr_codeN & 0x03) << 5) | (fr_codeD & 0x1F)); len = len + HLEN; return MFX_ERR_NONE; } #undef HLEN FullEncode::FullEncode(VideoCORE *core, mfxStatus *sts) { m_pCore = core; m_pController = 0; m_pENCODE = 0; m_pFrameStore = 0; m_pFrameTasks = 0; m_nFrameTasks = 0; m_pBRC = 0; m_nCurrTask = 0; m_pExtTasks = 0; m_runtimeErr = MFX_ERR_NONE; *sts = (core ? MFX_ERR_NONE : MFX_ERR_NULL_PTR); } FullEncode::~FullEncode() { Close(); } mfxStatus FullEncode::Query(VideoCORE * core, mfxVideoParam *in, mfxVideoParam *out) { return ControllerBase::Query(core,in, out, AVBR_WA); } mfxStatus FullEncode::QueryIOSurf(VideoCORE * core, mfxVideoParam *par, mfxFrameAllocRequest *request) { return ControllerBase::QueryIOSurf(core,par,request); } mfxStatus FullEncode::Init(mfxVideoParam *par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "FullEncode::Init"); mfxStatus sts = MFX_ERR_NONE; mfxStatus sts1 = MFX_ERR_NONE; m_runtimeErr = MFX_ERR_NONE; if (is_initialized()) return MFX_ERR_UNDEFINED_BEHAVIOR; m_pController = new ControllerBase(m_pCore, AVBR_WA); sts = m_pController->Reset(par); if (sts < MFX_ERR_NONE) { Close(); return sts; } sts1 = ResetImpl(); if (MFX_ERR_NONE != sts1) { Close(); return sts1; } return sts; } mfxStatus FullEncode::Reset(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; mfxStatus sts1 = MFX_ERR_NONE; MFX_CHECK(is_initialized(), MFX_ERR_NOT_INITIALIZED); sts = m_pController->Reset(par); if (sts < MFX_ERR_NONE) { return sts; } sts1 = ResetImpl(); MFX_CHECK_STS(sts1); return sts; } mfxStatus FullEncode::ResetImpl() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FullEncode::ResetImpl"); mfxStatus sts = MFX_ERR_NONE; mfxVideoParamEx_MPEG2* paramsEx = m_pController->getVideoParamsEx(); m_nCurrTask = 0; if (!m_pFrameTasks) { m_nFrameTasks = paramsEx->mfxVideoParams.AsyncDepth > 0 ? paramsEx->mfxVideoParams.AsyncDepth : 2; m_pFrameTasks = new EncodeFrameTask[m_nFrameTasks]; } for (mfxU32 i=0; iReset(m_pController->isRawFrames(), m_pController->GetInputFrameType(),true, m_nFrameTasks,¶msEx->mfxVideoParams.mfx.FrameInfo,paramsEx->mfxVideoParams.Protected!=0); MFX_CHECK_STS(sts); paramsEx->pRecFramesResponse_hw = m_pFrameStore->GetFrameAllocResponse(); if (!m_pBRC) { m_pBRC = new MPEG2BRC_HW (m_pCore); sts = m_pBRC->Init(¶msEx->mfxVideoParams); MFX_CHECK_STS(sts); } else { sts = m_pBRC->Reset(¶msEx->mfxVideoParams); MFX_CHECK_STS(sts); } if (!m_pENCODE) { m_pENCODE = new MFXVideoENCODEMPEG2_HW_DDI(m_pCore,&sts); sts = m_pENCODE->Init(paramsEx); MFX_CHECK_STS(sts); } else { sts = m_pENCODE->Reset(paramsEx); MFX_CHECK_STS(sts); } if (!m_pExtTasks) { m_pExtTasks = new clExtTasks2; } m_UDBuff.Reset(¶msEx->mfxVideoParams); return sts; } //virtual mfxStatus Close(void); // same name mfxStatus FullEncode::Close(void) { if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; if (m_pController) { m_pController->Close(); delete m_pController; m_pController = 0; } if (m_pENCODE) { m_pENCODE->Close(); delete m_pENCODE; m_pENCODE = 0; } if (m_pFrameTasks) { delete [] m_pFrameTasks; m_nFrameTasks = 0; } if (m_pFrameStore) { delete m_pFrameStore; m_pFrameStore = 0; } if (m_pExtTasks) { delete m_pExtTasks; m_pExtTasks = 0; } if(m_pBRC) { m_pBRC->Close(); delete m_pBRC; } m_UDBuff.Close(); return MFX_ERR_NONE; } mfxStatus FullEncode::GetVideoParam(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; sts = m_pController->GetVideoParam(par); MFX_CHECK_STS(sts); if (mfxExtCodingOptionSPSPPS* ext = MPEG2EncoderHW::GetExtCodingOptionsSPSPPS(par->ExtParam, par->NumExtParam)) { mfxU16 len = 0; sts = RunSeqHeader(par, ext->SPSBuffer, ext->SPSBufSize,len); MFX_CHECK_STS(sts); ext->SPSBufSize = len; ext->PPSBufSize = 0; // pps is n/a for mpeg2 ext->SPSId = 0; ext->PPSId = 0; } return MFX_ERR_NONE; } mfxStatus FullEncode::GetFrameParam(mfxFrameParam *par) { MFX_CHECK_NULL_PTR1(par) return MFX_ERR_UNSUPPORTED ; } mfxStatus FullEncode::GetEncodeStat(mfxEncodeStat *stat) { if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; return m_pController->GetEncodeStat(stat); } mfxStatus FullEncode::EncodeFrameCheck( mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams) { if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; if (m_runtimeErr) return m_runtimeErr; return m_pController->EncodeFrameCheck(ctrl,surface,bs,reordered_surface,pInternalParams); } mfxStatus FullEncode::CancelFrame(mfxEncodeCtrl * /*ctrl*/, mfxEncodeInternalParams * /*pInternalParams*/, mfxFrameSurface1 *surface, mfxBitstream * /*bs*/) { MFX_CHECK_NULL_PTR1(surface) m_pController->FinishFrame(0); return m_pCore->DecreaseReference(*surface); } // Async algorithm mfxStatus FullEncode::SubmitFrame(sExtTask2 *pExtTask) { mfxStatus sts = MFX_ERR_NONE; EncodeFrameTask* pIntTask = 0; mfxU32 nIntTask = 0; //bool bInputFrame = true; if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; mfxEncodeInternalParams * pInputInternalParams = &pExtTask->m_inputInternalParams; mfxFrameSurface1 * input_surface = pExtTask->m_pInput_surface; mfxBitstream * bs = pExtTask->m_pBs; mfxFrameSurface1 * surface = 0; FramesSet Frames; mfxVideoParamEx_MPEG2* pParams = m_pController->getVideoParamsEx(); bool bConstQuant = (pParams->mfxVideoParams.mfx.RateControlMethod == MFX_RATECONTROL_CQP); MFX_CHECK_NULL_PTR1(bs); nIntTask = GetFreeIntTask(); MFX_CHECK(nIntTask!=0,MFX_TASK_BUSY); pIntTask = GetIntTask(nIntTask); MFX_CHECK(pIntTask!=0,MFX_TASK_BUSY); mfxEncodeInternalParams* pInternalParams = &pIntTask->m_sEncodeInternalParams; if (input_surface) { sts = m_pController->CheckFrameType(pInputInternalParams); MFX_CHECK_STS(sts); } if ((sts = m_pController->ReorderFrame(pInputInternalParams,m_pController->GetOriginalSurface(input_surface),pInternalParams,&surface)) == MFX_ERR_MORE_DATA) { return MFX_ERR_NONE; } MFX_CHECK_STS(sts); // bInputFrame = false; sts = m_pFrameStore->NextFrame( surface, pInternalParams->FrameOrder, pInternalParams->FrameType, pInternalParams->InternalFlags, &Frames); MFX_CHECK_STS(sts); pIntTask->SetFrames(&Frames, pInternalParams); pIntTask->m_pBitstream = bs; bs->FrameType = pInternalParams->FrameType; bs->TimeStamp = pIntTask->m_Frames.m_pInputFrame->Data.TimeStamp; double fr = CalculateUMCFramerate(pParams->mfxVideoParams.mfx.FrameInfo.FrameRateExtN, pParams->mfxVideoParams.mfx.FrameInfo.FrameRateExtD); MFX_CHECK(fr != 0, MFX_ERR_UNDEFINED_BEHAVIOR); bs->DecodeTimeStamp = (pInternalParams->FrameType & MFX_FRAMETYPE_B) ? CalcDTSForNonRefFrameMpeg2(bs->TimeStamp) : CalcDTSForRefFrameMpeg2(bs->TimeStamp, Frames.m_nFrame - Frames.m_nRefFrame[0], pParams->mfxVideoParams.mfx.GopRefDist, fr); sts = pIntTask->FillFrameParams((mfxU8)pInternalParams->FrameType, m_pController->getVideoParamsEx(), surface->Info.PicStruct, (pInternalParams->InternalFlags & MFX_IFLAG_BWD_ONLY) ? 1:0, (pInternalParams->InternalFlags & MFX_IFLAG_FWD_ONLY) ? 1:0, (pInternalParams->InternalFlags & MFX_IFLAG_ADD_HEADER) ? 1:0, (pInternalParams->InternalFlags & MFX_IFLAG_ADD_EOS) ? 1:0); MFX_CHECK_STS(sts); sts = m_pCore->DecreaseReference(*surface); MFX_CHECK_STS(sts); // coding { mfxU8 qp = 0; mfxU8 * mbqpdata = 0; mfxU32 mbqpNumMB = 0; if (bConstQuant) { m_pBRC->SetQuant(pInternalParams->QP, pInternalParams->FrameType); m_pBRC->SetQuantDCPredAndDelay(&pIntTask->m_FrameParams,&qp); if (pParams->bMbqpMode) { const mfxExtMBQP *mbqp = (mfxExtMBQP *)mfx::GetExtBuffer(pInternalParams->ExtParam, pInternalParams->NumExtParam, MFX_EXTBUFF_MBQP); mfxU32 wMB = (pParams->mfxVideoParams.mfx.FrameInfo.CropW + 15) / 16; mfxU32 hMB = (pParams->mfxVideoParams.mfx.FrameInfo.CropH + 15) / 16; bool isMBQP = mbqp && mbqp->QP && mbqp->NumQPAlloc >= wMB * hMB; if (isMBQP) { mbqpdata = mbqp->QP; mbqpNumMB = wMB * hMB; } } } MFX_CHECK_STS (m_UDBuff.AddUserData(pInternalParams)); if (mbqpdata) { sts = m_pENCODE->SubmitFrameMBQP(pIntTask, m_UDBuff.GetUserDataBuffer(), m_UDBuff.GetUserDataSize(), mbqpdata, mbqpNumMB, qp); } else { sts = m_pENCODE->SubmitFrame(pIntTask, m_UDBuff.GetUserDataBuffer(), m_UDBuff.GetUserDataSize(), qp); } MFX_CHECK_STS(sts); pExtTask->m_nInternalTask = nIntTask; { UMC::AutomaticUMCMutex lock(m_guard); pIntTask->m_taskStatus = ENC_STARTED; } } return MFX_ERR_NONE; } mfxStatus FullEncode::QueryFrame(sExtTask2 *pExtTask) { mfxStatus sts = MFX_ERR_NONE; mfxU32 dataLen = 0; EncodeFrameTask* pIntTask = 0; mfxBitstream * bs = 0; if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; if (pExtTask->m_nInternalTask == 0) { return MFX_ERR_NONE; } pIntTask = GetIntTask(pExtTask->m_nInternalTask); MFX_CHECK_NULL_PTR1(pIntTask); bs = pIntTask->m_pBitstream; dataLen = bs->DataLength; sts = m_pENCODE->QueryFrame(pIntTask); if (sts != MFX_WRN_DEVICE_BUSY) { UMC::AutomaticUMCMutex lock(m_guard); pIntTask->m_taskStatus = NOT_STARTED; pIntTask->m_Frames.ReleaseFrames(m_pCore); m_pController->FinishFrame(bs->DataLength - dataLen); } if (sts < 0) m_runtimeErr = sts; return sts; } static mfxStatus TaskRoutineSubmit(void *pState, void *param, mfxU32 /*n*/, mfxU32 /*callNumber*/) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "TaskRoutineSubmit"); mfxStatus sts = MFX_ERR_NONE; FullEncode* th = (FullEncode*)pState; sExtTask2 *pExtTask = (sExtTask2 *)param; sts = th->m_pExtTasks->CheckTaskForSubmit(pExtTask); MFX_CHECK_STS(sts); sts = th->SubmitFrame(pExtTask); MFX_CHECK_STS(sts); return MFX_TASK_DONE; } static mfxStatus TaskRoutineQuery(void *pState, void *param, mfxU32 /*n*/, mfxU32 /*callNumber*/) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "TaskRoutineQuery"); mfxStatus sts = MFX_ERR_NONE; FullEncode* th = (FullEncode*)pState; sExtTask2 *pExtTask = (sExtTask2 *)param; sExtTask2 *pCurrTask = th->m_pExtTasks->GetTaskForQuery(); MFX_CHECK(pExtTask == pCurrTask, MFX_ERR_UNDEFINED_BEHAVIOR); sts = th->QueryFrame(pExtTask); MFX_CHECK (sts != MFX_WRN_DEVICE_BUSY, MFX_TASK_BUSY); MFX_CHECK_STS (th->m_pExtTasks->NextFrame()); MFX_CHECK_STS(sts); return MFX_TASK_DONE; } mfxStatus FullEncode::EncodeFrameCheck( mfxEncodeCtrl * ctrl, mfxFrameSurface1 * surface, mfxBitstream * bs, mfxFrameSurface1 ** reordered_surface, mfxEncodeInternalParams * internalParams, MFX_ENTRY_POINT entryPoints[], mfxU32 & numEntryPoints) { mfxStatus sts_ret = MFX_ERR_NONE; mfxStatus sts = MFX_ERR_NONE; sExtTask2 *pExtTask = 0; mfxFrameSurface1 *pOriginalSurface = m_pController->GetOriginalSurface(surface); if (pOriginalSurface != surface) { if (pOriginalSurface == 0 || surface == 0) return MFX_ERR_UNDEFINED_BEHAVIOR; pOriginalSurface->Info = surface->Info; pOriginalSurface->Data.Corrupted = surface->Data.Corrupted; pOriginalSurface->Data.DataFlag = surface->Data.DataFlag; pOriginalSurface->Data.TimeStamp = surface->Data.TimeStamp; pOriginalSurface->Data.FrameOrder = surface->Data.FrameOrder; } sts_ret = EncodeFrameCheck(ctrl, pOriginalSurface, bs, reordered_surface, internalParams); if (sts_ret != MFX_ERR_NONE && sts_ret !=(mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK && sts_ret<0) return sts_ret; sts = m_pExtTasks->AddTask( internalParams,*reordered_surface, bs, &pExtTask); MFX_CHECK_STS(sts); entryPoints[0].pState = this; entryPoints[0].pParam = pExtTask; entryPoints[0].pRoutine = TaskRoutineSubmit; entryPoints[0].pCompleteProc = 0; entryPoints[0].pOutputPostProc = 0; entryPoints[0].requiredNumThreads = 1; entryPoints[1].pState = this; entryPoints[1].pParam = pExtTask; entryPoints[1].pRoutine = TaskRoutineQuery; entryPoints[1].pCompleteProc = 0; entryPoints[1].pOutputPostProc = 0; entryPoints[1].requiredNumThreads = 1; numEntryPoints = 2; return sts_ret; } mfxStatus UserDataBuffer::AddUserData(mfxU8* pUserData, mfxU32 len) { mfxU8* pCurr = pUserData; bool bFirstUDSCode = false; bool bProhibitedSymbols = false; mfxU32 size = 0; // analyze user data while (pCurr < pUserData + len - 2) { if (pCurr[0] == 0 && pCurr[1] == 0 && (pCurr[2] & 0xFE) == 0) { if (pCurr < (pUserData + len - 4) && pCurr[2]== 1 && pCurr[3] == 0xB2) { //user data start code if (pCurr == pUserData) bFirstUDSCode = true; pCurr += 3; } else { bProhibitedSymbols = true; break; } } pCurr ++; } size = bProhibitedSymbols ? static_cast(pCurr - pUserData) : len ; // copy into buffer if (size > 0) { pCurr = m_pBuffer + m_dataSize; m_dataSize += size + (bFirstUDSCode ? 0 : 4) ; MFX_CHECK( m_dataSize < m_bufSize, MFX_ERR_UNDEFINED_BEHAVIOR); if (!bFirstUDSCode) { *(pCurr++) = 0; *(pCurr++) = 0; *(pCurr++) = 1; *(pCurr++) = 0xB2; } std::copy(pUserData, pUserData + std::min(m_bufSize - m_dataSize, size), pCurr); } return MFX_ERR_NONE; } #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_hw.cpp000066400000000000000000000024241443134507600313630ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfx_mpeg2_encode_utils_hw.h" #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_utils_hw.cpp000066400000000000000000002740461443134507600326160ustar00rootroot00000000000000// Copyright (c) 2008-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfx_enc_common.h" #include "mfx_mpeg2_encode_utils_hw.h" #include "mfx_brc_common.h" #include "mfx_mpeg2_enc_common.h" #include "umc_mpeg2_brc.h" #include "mfx_task.h" #include "libmfx_core.h" // temporary defines #define CHECK_VERSION(ver) /*ver.Major==0;*/ #define CHECK_CODEC_ID(id, myid) /*id==myid;*/ #define RANGE_TO_F_CODE(range, fcode) { \ int32_t fc = 1; \ while((4<mfx.CodecProfile != MFX_PROFILE_UNKNOWN) codecProfile = par->mfx.CodecProfile; mfxStatus sts = MfxHwMpeg2Encode::QueryHwCaps(core, hwCaps, codecProfile); MFX_CHECK_STS(sts); if (par->mfx.FrameInfo.Width > hwCaps.MaxPicWidth || par->mfx.FrameInfo.Height > hwCaps.MaxPicHeight) return MFX_ERR_UNSUPPORTED; if (par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { if (ext == 0) ext = GetExtCodingOptions(par->ExtParam, par->NumExtParam); if (ext != 0 && ext->FramePicture == MFX_CODINGOPTION_OFF) return MFX_ERR_UNSUPPORTED; } if (!hwCaps.EncodeFunc && !hwCaps.EncFunc) { return MFX_ERR_UNSUPPORTED; } if( pCaps ) { *pCaps = hwCaps; } return MFX_ERR_NONE; } HW_MODE GetHwEncodeMode(ENCODE_CAPS &caps) { if( caps.EncodeFunc ) { return FULL_ENCODE; } else if(caps.EncFunc) { return HYBRID_ENCODE; } else { return UNSUPPORTED; } } mfxStatus ApplyTargetUsage (mfxVideoParamEx_MPEG2* par) { if (par->mfxVideoParams.mfx.CodecProfile == MFX_PROFILE_MPEG2_SIMPLE) { par->mfxVideoParams.mfx.GopRefDist = 1; } if (par->mfxVideoParams.mfx.GopRefDist == 0) { par->mfxVideoParams.mfx.GopRefDist = 3; } if (par->mfxVideoParams.mfx.GopPicSize == 0) { par->mfxVideoParams.mfx.GopPicSize = 24; } if (par->mfxVideoParams.mfx.GopRefDist > par->mfxVideoParams.mfx.GopPicSize) { par->mfxVideoParams.mfx.GopRefDist = par->mfxVideoParams.mfx.GopPicSize; } if (par->MVRangeP[0] == 0 || par->MVRangeP[1] == 0 ) { mfxU32 FrameW = par->mfxVideoParams.mfx.FrameInfo.Width; par->MVRangeP[0] = FrameW < 200 ? 32 /*3*/ : FrameW < 500 ? 64 /*4*/ : FrameW < 1400 ? 128 /*5*/ : 256/*6*/; // 200, 500, 1400 are horizontal resolution par->MVRangeP[1] = par->MVRangeP[0] > 128 /*5*/ ? 128 /*5*/ : par->MVRangeP[0]; } par->MVRangeB[0][0] = par->MVRangeP[0]; par->MVRangeB[0][1] = par->MVRangeP[1]; par->MVRangeB[1][0] = par->MVRangeP[0]; par->MVRangeB[1][1] = par->MVRangeP[1]; par->bAllowFieldPrediction = 1; par->bAllowFieldDCT = 1; return MFX_ERR_NONE; } mfxExtCodingOptionSPSPPS* GetExtCodingOptionsSPSPPS(mfxExtBuffer** ebuffers, mfxU32 nbuffers) { for(mfxU32 i=0; iBufferId == MFX_EXTBUFF_CODING_OPTION_SPSPPS)) { return (mfxExtCodingOptionSPSPPS*)(*ebuffers+i); } } return 0; } mfxStatus CheckExtendedBuffers (mfxVideoParam* par) { mfxU32 supported_buffers[] = { MFX_EXTBUFF_CODING_OPTION ,MFX_EXTBUFF_CODING_OPTION_SPSPPS ,MFX_EXTBUFF_VIDEO_SIGNAL_INFO ,MFX_EXTBUFF_CODING_OPTION2 ,MFX_EXTBUFF_CODING_OPTION3 ,MFX_EXTBUFF_ALLOCATION_HINTS }; mfxU32 num_supported = 0; if (par->NumExtParam == 0 || par->ExtParam == 0) { return MFX_ERR_NONE; } for (mfxU32 n_buf=0; n_buf < sizeof(supported_buffers)/sizeof(mfxU32); n_buf++) { mfxU32 num = 0; for (mfxU32 i=0; i < par->NumExtParam; i++) { if (par->ExtParam[i] == NULL) { return MFX_ERR_NULL_PTR; } if (par->ExtParam[i]->BufferId == supported_buffers[n_buf]) { num ++; } } if (num > 1) { return MFX_ERR_UNDEFINED_BEHAVIOR; } num_supported += num; } return (num_supported == par->NumExtParam) ? MFX_ERR_NONE : MFX_ERR_UNSUPPORTED; } /*static mfxU16 GetBufferSizeInKB (mfxU16 TargetKbps, double frame_rate, bool bMin = false) { mfxU32 numFrames = (bMin)? 2:10; if (TargetKbps==0 || frame_rate == 0.0) { return 0; } return (mfxU16)((numFrames*TargetKbps)/(frame_rate*8)); } static mfxU16 GetBitRate(mfxU16 w, mfxU16 h, double frame_rate, bool bIntraFrames ,bool bMin = false) { double coeff = 0; if (bIntraFrames) { coeff = (bMin)? 30.0:15.0; } else { coeff = (bMin)? 250.0:25.0; } return (mfxU16)(frame_rate*(double)(w*h*3/2)*8.0/1000.0/coeff); }*/ mfxStatus FillMFXFrameParams(mfxFrameParamMPEG2* pFrameParams, mfxU8 frameType, mfxVideoParamEx_MPEG2 *pExParams, mfxU16 inputPictStruct, bool bBackwOnly, bool bFwdOnly) { mfxU16 seqPicStruct = pExParams->mfxVideoParams.mfx.FrameInfo.PicStruct & 0x0F; bool bField = false; pFrameParams->FrameType = frameType; mfxU16 curPicStruct = 0; switch (seqPicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: curPicStruct = mfxU16(MFX_PICSTRUCT_PROGRESSIVE | (inputPictStruct &0xF0)); break; case MFX_PICSTRUCT_FIELD_TFF: curPicStruct = mfxU16(MFX_PICSTRUCT_FIELD_TFF | (inputPictStruct & (~MFX_PICSTRUCT_FIELD_BFF) & 0x0F)); break; case MFX_PICSTRUCT_FIELD_BFF: curPicStruct = mfxU16(MFX_PICSTRUCT_FIELD_BFF | (inputPictStruct & (~MFX_PICSTRUCT_FIELD_TFF) & 0x0F)); break; case MFX_PICSTRUCT_UNKNOWN: default: curPicStruct = mfxU16((inputPictStruct == MFX_PICSTRUCT_UNKNOWN) ? MFX_PICSTRUCT_PROGRESSIVE : inputPictStruct); break; } pFrameParams->CodecFlags = 0; pFrameParams->BitStreamPCEelement = 0; if(curPicStruct & MFX_PICSTRUCT_PROGRESSIVE) { if (!(seqPicStruct & MFX_PICSTRUCT_PROGRESSIVE)) /*progressive frame in not progressive sequence*/ { pFrameParams->TopFieldFirst = (curPicStruct & MFX_PICSTRUCT_FIELD_BFF)? 0:1; pFrameParams->RepeatFirstField = (curPicStruct & MFX_PICSTRUCT_FIELD_REPEATED)? 1:0; } else /*progressive frame in progressive sequence*/ { if (curPicStruct & MFX_PICSTRUCT_FRAME_DOUBLING) { pFrameParams->RepeatFirstField = 1; } else if (curPicStruct & MFX_PICSTRUCT_FRAME_TRIPLING) { pFrameParams->RepeatFirstField = 1; pFrameParams->TopFieldFirst = 1; } } pFrameParams->PicStructure = MFX_MPEG2_FRAME_PICTURE; pFrameParams->ProgressiveFrame = 1; pFrameParams->FrameMbsOnlyFlag = 1; pFrameParams->FrameDCTprediction = 1; } else if(curPicStruct & MFX_PICSTRUCT_FIELD_TFF) { pFrameParams->TopFieldFirst = 1; if (pExParams->bFieldCoding) { pFrameParams->PicStructure = MFX_MPEG2_TOP_FIELD; pFrameParams->FieldPicFlag = 1; bField = true; } else { pFrameParams->PicStructure = MFX_MPEG2_FRAME_PICTURE; pFrameParams->InterlacedFrameFlag = 1; pFrameParams->FrameDCTprediction = 0; pFrameParams->FrameMbsOnlyFlag = 0; } } else if(curPicStruct & MFX_PICSTRUCT_FIELD_BFF) { if (pExParams->bFieldCoding) { pFrameParams->PicStructure = MFX_MPEG2_BOTTOM_FIELD; pFrameParams->BottomFieldFlag = 1; pFrameParams->FieldPicFlag = 1; bField = true; } else { pFrameParams->PicStructure = MFX_MPEG2_FRAME_PICTURE; pFrameParams->InterlacedFrameFlag = 1; pFrameParams->FrameDCTprediction = 0; pFrameParams->FrameMbsOnlyFlag = 0; } } else { pFrameParams->PicStructure = MFX_MPEG2_FRAME_PICTURE; pFrameParams->TopFieldFirst = 1; pFrameParams->ProgressiveFrame = 1; pFrameParams->FrameMbsOnlyFlag = 1; pFrameParams->FrameDCTprediction= 1; } pFrameParams->Chroma420type = 1; pFrameParams->ChromaFormatIdc = MFX_CHROMAFORMAT_YUV420; pFrameParams->FrameHinMbMinus1 = (pExParams->mfxVideoParams.mfx.FrameInfo.Height)>>4; pFrameParams->FrameWinMbMinus1 = (pExParams->mfxVideoParams.mfx.FrameInfo.Width )>>4; if (bField) { pFrameParams->FrameHinMbMinus1 = (pFrameParams->FrameHinMbMinus1>>1); } MFX_CHECK(pFrameParams->FrameHinMbMinus1>=1 &&pFrameParams->FrameWinMbMinus1>=1, MFX_ERR_UNSUPPORTED); pFrameParams->NumMb = pFrameParams->FrameHinMbMinus1*pFrameParams->FrameWinMbMinus1; pFrameParams->FrameHinMbMinus1 = pFrameParams->FrameHinMbMinus1 - 1; pFrameParams->FrameWinMbMinus1 = pFrameParams->FrameWinMbMinus1 - 1; pFrameParams->CloseEntryFlag = !!(pExParams->mfxVideoParams.mfx.GopOptFlag & MFX_GOP_CLOSED); if (pFrameParams->FrameType & MFX_FRAMETYPE_I) { pFrameParams->RefPicFlag = 1; pFrameParams->BackwardPredFlag = 0; pFrameParams->IntraPicFlag = 1; pFrameParams->ForwardPredFlag = 0; pFrameParams->NumRefFrame = 0; } else if (pFrameParams->FrameType & MFX_FRAMETYPE_P) { pFrameParams->RefPicFlag = 1; pFrameParams->BackwardPredFlag = 0; pFrameParams->IntraPicFlag = 0; pFrameParams->ForwardPredFlag = 1; pFrameParams->NumRefFrame = 1; } else if (pFrameParams->FrameType & MFX_FRAMETYPE_B) { pFrameParams->RefPicFlag = 0; pFrameParams->BackwardPredFlag = (bFwdOnly) ? 0 : 1; pFrameParams->ForwardPredFlag = (bBackwOnly) ? 0 : 1; pFrameParams->IntraPicFlag = 0; pFrameParams->NumRefFrame = (bBackwOnly || bFwdOnly) ? 1 : 2; } else { return MFX_ERR_UNSUPPORTED; } pFrameParams->BSConcealmentNeed = 0; pFrameParams->BSConcealmentMethod = 0; pFrameParams->MvGridAndChroma = 0; pFrameParams->BitStreamFcodes = 0; pFrameParams->IntraDCprecision = 1; if (pFrameParams->IntraPicFlag) { pFrameParams->BitStreamFcodes = 0xffff; } else if (pFrameParams->RefPicFlag) { pFrameParams->BitStreamFcodes = 0xff; mfxU32 fcode=0; RANGE_TO_F_CODE (((mfxI32)pExParams->MVRangeP[0]),fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<12; fcode=0; RANGE_TO_F_CODE (((mfxI32)pExParams->MVRangeP[1]), fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<8; } else { mfxU32 fcode=0; RANGE_TO_F_CODE ((mfxI32)pExParams->MVRangeB[0][0],fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<12; fcode=0; RANGE_TO_F_CODE ((mfxI32)pExParams->MVRangeB[0][1], fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<8; fcode=0; RANGE_TO_F_CODE ((mfxI32)pExParams->MVRangeB[1][0],fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<4; fcode=0; RANGE_TO_F_CODE ((mfxI32)pExParams->MVRangeB[1][1], fcode); pFrameParams->BitStreamFcodes |= (fcode & 0x0f)<<0; } return MFX_ERR_NONE; } bool AVBR_via_CBR (mfxVideoParam *par) { if (par->mfx.RateControlMethod != MFX_RATECONTROL_AVBR) return false; par->mfx.RateControlMethod = MFX_RATECONTROL_CBR; par->mfx.MaxKbps = par->mfx.TargetKbps; par->mfx.InitialDelayInKB = par->mfx.BufferSizeInKB = 0; return true; } FramesSet::FramesSet() { Reset(); } void FramesSet::Reset() { m_pInputFrame = 0; m_pRefFrame[0] = m_pRefFrame[1] = 0; m_pRawFrame[0] = m_pRawFrame[1] = 0; m_pRecFrame = 0; m_nFrame = 0; m_nRefFrame[0] = m_nRefFrame[1] = 0; m_nLastRefBeforeIntra = -1; m_nLastRef = -1; } mfxStatus FramesSet::ReleaseFrames(VideoCORE* pCore) { mfxStatus sts = MFX_ERR_NONE; if (m_pInputFrame) { sts = pCore->DecreaseReference(*m_pInputFrame); MFX_CHECK_STS(sts); m_pInputFrame = 0; } if (m_pRecFrame) { sts = pCore->DecreaseReference(*m_pRecFrame); MFX_CHECK_STS(sts); m_pRecFrame = 0; } if (m_pRefFrame[0]) { sts = pCore->DecreaseReference(*m_pRefFrame[0]); MFX_CHECK_STS(sts); m_pRefFrame[0] = 0; } if (m_pRefFrame[1]) { sts = pCore->DecreaseReference(*m_pRefFrame[1]); MFX_CHECK_STS(sts); m_pRefFrame[1] = 0; } if (m_pRawFrame[0]) { sts = pCore->DecreaseReference(*m_pRawFrame[0]); MFX_CHECK_STS(sts); m_pRawFrame[0] = 0; } if (m_pRawFrame[1]) { sts = pCore->DecreaseReference(*m_pRawFrame[1]); MFX_CHECK_STS(sts); m_pRawFrame[1] = 0; } return sts; } mfxStatus FramesSet::LockRefFrames(VideoCORE* pCore) { mfxStatus sts = MFX_ERR_NONE; if (m_pRefFrame[0]) { sts = pCore->IncreaseReference(*m_pRefFrame[0]); MFX_CHECK_STS(sts); } if (m_pRefFrame[1]) { sts = pCore->IncreaseReference(*m_pRefFrame[1]); MFX_CHECK_STS(sts); } if (m_pRawFrame[0]) { sts = pCore->IncreaseReference(*m_pRawFrame[0]); MFX_CHECK_STS(sts); } if (m_pRawFrame[1]) { sts = pCore->IncreaseReference(*m_pRawFrame[1]); MFX_CHECK_STS(sts); } return sts; } mfxStatus ControllerBase::QueryImplsDescription( VideoCORE& core , mfxEncoderDescription::encoder& caps , mfx::PODArraysHolder& ah) { const mfxU32 SupportedProfiles[] = { MFX_PROFILE_MPEG2_SIMPLE , MFX_PROFILE_MPEG2_MAIN , MFX_PROFILE_MPEG2_HIGH }; const mfxResourceType SupportedMemTypes[] = { MFX_RESOURCE_SYSTEM_SURFACE , MFX_RESOURCE_VA_SURFACE }; caps.CodecID = MFX_CODEC_MPEG2; caps.MaxcodecLevel = MFX_LEVEL_MPEG2_HIGH; caps.BiDirectionalPrediction = 1; ENCODE_CAPS hwCaps = {}; MFX_SAFE_CALL(MfxHwMpeg2Encode::QueryHwCaps(&core, hwCaps, MFX_PROFILE_MPEG2_HIGH)); for (auto profile : SupportedProfiles) { auto& pfCaps = ah.PushBack(caps.Profiles); pfCaps.Profile = profile; for (auto memType : SupportedMemTypes) { auto& memCaps = ah.PushBack(pfCaps.MemDesc); memCaps.MemHandleType = memType; memCaps.Width = { 16, hwCaps.MaxPicWidth, 16 }; memCaps.Height = { 16, hwCaps.MaxPicHeight, 16 }; ah.PushBack(memCaps.ColorFormats) = MFX_FOURCC_NV12; ++memCaps.NumColorFormats; ++pfCaps.NumMemTypes; } ++caps.NumProfiles; } return MFX_ERR_NONE; } mfxStatus ControllerBase::Query(VideoCORE * core, mfxVideoParam *in, mfxVideoParam *out, bool bAVBR_WA) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ControllerBase::Query"); MFX_CHECK_NULL_PTR1(out); if(in==0) { memset(&out->mfx, 0, sizeof(mfxInfoMFX)); out->mfx.FrameInfo.FourCC = 1; out->mfx.FrameInfo.Width = 1; out->mfx.FrameInfo.Height = 1; out->mfx.FrameInfo.CropX = 0; out->mfx.FrameInfo.CropY = 0; out->mfx.FrameInfo.CropW = 1; out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.ChromaFormat = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.PicStruct = 1; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.GopPicSize = 1; out->mfx.GopRefDist = 1; out->mfx.GopOptFlag = 1; out->mfx.RateControlMethod = 1; // not sure, it is BRC out->mfx.InitialDelayInKB = 1; // not sure, it is BRC out->mfx.BufferSizeInKB = 1; // not sure, it is BRC out->mfx.TargetKbps = 1; out->mfx.MaxKbps = 1; // not sure, it is BRC out->mfx.NumSlice = 1; out->mfx.NumThread = 1; out->mfx.TargetUsage = 1; out->IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY; out->AsyncDepth = 0; out->Protected = 0; MFX_CHECK_STS (CheckExtendedBuffers(out)); mfxExtCodingOption* ext_out = GetExtCodingOptions(out->ExtParam,out->NumExtParam); if (ext_out) { mfxU32 bufOffset = sizeof(mfxExtBuffer); mfxU32 bufSize = sizeof(mfxExtCodingOption) - bufOffset; memset ((mfxU8*)(ext_out) + bufOffset,0, bufSize); ext_out->EndOfSequence = 1; ext_out->FramePicture = 1; } mfxExtCodingOptionSPSPPS* pSPSPPS_out = GetExtCodingOptionsSPSPPS (out->ExtParam, out->NumExtParam); if (pSPSPPS_out) { pSPSPPS_out->PPSBuffer = NULL; pSPSPPS_out->PPSBufSize = 0; pSPSPPS_out->SPSBuffer = NULL; pSPSPPS_out->SPSBufSize = 0; } mfxExtVideoSignalInfo* pVideoSignal_out = GetExtVideoSignalInfo(out->ExtParam, out->NumExtParam); if (pVideoSignal_out) { pVideoSignal_out->VideoFormat = 1; pVideoSignal_out->ColourDescriptionPresent = 1; pVideoSignal_out->ColourPrimaries = 1; pVideoSignal_out->TransferCharacteristics = 1; pVideoSignal_out->MatrixCoefficients = 1; pVideoSignal_out->VideoFullRange = 0; } } else { bool bUnsupported = false; bool bWarning = false; //bool bInvalid = false; mfxExtCodingOptionSPSPPS* pSPSPPS_out = GetExtCodingOptionsSPSPPS (out->ExtParam, out->NumExtParam); mfxExtCodingOptionSPSPPS* pSPSPPS_in = GetExtCodingOptionsSPSPPS (in->ExtParam, in->NumExtParam); if (pSPSPPS_out && pSPSPPS_in) { if (pSPSPPS_in->SPSBuffer && pSPSPPS_out->SPSBuffer && pSPSPPS_out->SPSBufSize && pSPSPPS_in->SPSBufSize) { mfxU32 real_size = 0; if (SHParametersEx::CheckSHParameters (pSPSPPS_in->SPSBuffer, pSPSPPS_in->SPSBufSize, real_size, out, 0)) { if (real_size <= pSPSPPS_out->SPSBufSize) { std::copy(pSPSPPS_in->SPSBuffer, pSPSPPS_in->SPSBuffer + real_size, pSPSPPS_out->SPSBuffer); memset(pSPSPPS_out->SPSBuffer + real_size, 0, pSPSPPS_out->SPSBufSize - real_size); } else { memset(pSPSPPS_out->SPSBuffer, 0, pSPSPPS_out->SPSBufSize); bUnsupported = true; } } else { memset(pSPSPPS_out->SPSBuffer, 0, pSPSPPS_out->SPSBufSize); bUnsupported = true; } } else if (pSPSPPS_in->SPSBuffer || pSPSPPS_out->SPSBuffer || pSPSPPS_out->SPSBufSize || pSPSPPS_in->SPSBufSize) { bUnsupported = true; } } else if (!(pSPSPPS_in == 0 && pSPSPPS_out ==0)) { bUnsupported = true; } out->mfx = in->mfx; out->IOPattern = in->IOPattern; out->Protected = in->Protected; out->AsyncDepth = in->AsyncDepth; mfxStatus stsCaps = CheckHwCaps(core, out); MFX_CHECK_STS (CheckExtendedBuffers(in)); MFX_CHECK_STS (CheckExtendedBuffers(out)); if (out->Protected) { out->Protected = 0; bUnsupported = true; } if (out->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && out->mfx.FrameInfo.FourCC !=0) { out->mfx.FrameInfo.FourCC = 0; bUnsupported = true; } mfxU16 ps = out->mfx.FrameInfo.PicStruct & (MFX_PICSTRUCT_PROGRESSIVE|MFX_PICSTRUCT_FIELD_TFF|MFX_PICSTRUCT_FIELD_BFF); if (ps != MFX_PICSTRUCT_PROGRESSIVE && ps != MFX_PICSTRUCT_FIELD_TFF && ps != MFX_PICSTRUCT_FIELD_BFF && ps != MFX_PICSTRUCT_UNKNOWN) { ps = MFX_PICSTRUCT_UNKNOWN; bWarning = true; } if (out->mfx.FrameInfo.PicStruct != ps) { out->mfx.FrameInfo.PicStruct = ps; bWarning = true; } mfxU16 t = (out->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) ? 0x0f:0x1f; if ((out->mfx.FrameInfo.Width !=0 && out->mfx.FrameInfo.Height==0) || (out->mfx.FrameInfo.Width ==0 && out->mfx.FrameInfo.Height!=0)) { out->mfx.FrameInfo.Width = 0; out->mfx.FrameInfo.Height= 0; bUnsupported = true; } if (out->mfx.FrameInfo.Width > 0x1fff ||(out->mfx.FrameInfo.Width & 0x0f)) { out->mfx.FrameInfo.Width = 0; bUnsupported = true; } if (out->mfx.FrameInfo.Height > 0x1fff ||(out->mfx.FrameInfo.Height & t)) { out->mfx.FrameInfo.Height = 0; bUnsupported = true; } if (out->mfx.FrameInfo.CropX != 0) { out->mfx.FrameInfo.CropX = 0; bUnsupported = true; } if (out->mfx.FrameInfo.CropY != 0) { out->mfx.FrameInfo.CropY = 0; bUnsupported = true; } /* if (out->mfx.FrameInfo.CropW > out->mfx.FrameInfo.Width) { out->mfx.FrameInfo.CropW = 0; bUnsupported = true; } if (out->mfx.FrameInfo.CropH > out->mfx.FrameInfo.Height) { out->mfx.FrameInfo.CropH = 0; bUnsupported = true; }*/ switch(out->IOPattern) { case 0: case MFX_IOPATTERN_IN_VIDEO_MEMORY: case MFX_IOPATTERN_IN_SYSTEM_MEMORY: break; default: bWarning = true; if (out->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) out->IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; else if (out->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY) out->IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY; else out->IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; } mfxExtCodingOption* ext_in = GetExtCodingOptions(in->ExtParam, in->NumExtParam); mfxExtCodingOption* ext_out = GetExtCodingOptions(out->ExtParam,out->NumExtParam); MFX_CHECK ((ext_in !=0 && ext_out != 0) || (ext_in == 0 && ext_out == 0), MFX_ERR_UNDEFINED_BEHAVIOR ); if (ext_in && ext_out) { mfxExtCodingOption temp = {}; mfxU32 bufOffset = sizeof(mfxExtBuffer); mfxU32 bufSize = sizeof(mfxExtCodingOption) - bufOffset; temp = *ext_in; memset ((mfxU8*)(ext_out) + bufOffset,0, bufSize); ext_out->EndOfSequence = temp.EndOfSequence; ext_out->FramePicture = temp.FramePicture; bWarning = bWarning || (memcmp((mfxU8*)(ext_out) + bufOffset,(mfxU8*)(&temp) + bufOffset, bufSize)!= 0); bUnsupported = bUnsupported || (temp.FieldOutput == MFX_CODINGOPTION_ON); } mfxExtVideoSignalInfo* pVideoSignal_out = GetExtVideoSignalInfo(out->ExtParam, out->NumExtParam); mfxExtVideoSignalInfo* pVideoSignal_in = GetExtVideoSignalInfo(in->ExtParam, in->NumExtParam); MFX_CHECK ((pVideoSignal_in == 0) == (pVideoSignal_out == 0), MFX_ERR_UNDEFINED_BEHAVIOR ); if (pVideoSignal_in && pVideoSignal_out) { *pVideoSignal_out = *pVideoSignal_in; if (CheckExtVideoSignalInfo(pVideoSignal_out) == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { bWarning = true; } } if ((out->mfx.FrameInfo.Width!= 0 && out->mfx.FrameInfo.CropW > out->mfx.FrameInfo.Width) || (out->mfx.FrameInfo.CropW == 0 && out->mfx.FrameInfo.CropH != 0)) { bWarning = true; out->mfx.FrameInfo.CropW = out->mfx.FrameInfo.Width; } if ((out->mfx.FrameInfo.Height != 0 && out->mfx.FrameInfo.CropH > out->mfx.FrameInfo.Height)|| (out->mfx.FrameInfo.CropW != 0 && out->mfx.FrameInfo.CropH == 0)) { bWarning = true; out->mfx.FrameInfo.CropH = out->mfx.FrameInfo.Height; } if (out->mfx.FrameInfo.CropX || out->mfx.FrameInfo.CropY) { out->mfx.FrameInfo.CropX = 0; out->mfx.FrameInfo.CropY = 0; bWarning = true; } if (out->mfx.FrameInfo.FrameRateExtN !=0 && out->mfx.FrameInfo.FrameRateExtD != 0) { mfxStatus sts = CheckFrameRateMPEG2(out->mfx.FrameInfo.FrameRateExtD, out->mfx.FrameInfo.FrameRateExtN); if (sts != MFX_ERR_NONE) { bWarning = true; } } else { if (out->mfx.FrameInfo.FrameRateExtN !=0 || out->mfx.FrameInfo.FrameRateExtD != 0) { out->mfx.FrameInfo.FrameRateExtN = 0; out->mfx.FrameInfo.FrameRateExtD = 0; bUnsupported = true; } } if ((out->mfx.TargetUsage < MFX_TARGETUSAGE_BEST_QUALITY || out->mfx.TargetUsage > MFX_TARGETUSAGE_BEST_SPEED)&& out->mfx.TargetUsage !=0) { out->mfx.TargetUsage = MFX_TARGETUSAGE_UNKNOWN; bWarning = true; } if (out->mfx.FrameInfo.ChromaFormat != 0 && out->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) { out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; bWarning = true; } mfxStatus sts = CheckAspectRatioMPEG2( out->mfx.FrameInfo.AspectRatioW, out->mfx.FrameInfo.AspectRatioH, out->mfx.FrameInfo.Width, out->mfx.FrameInfo.Height, out->mfx.FrameInfo.CropW, out->mfx.FrameInfo.CropH); if (sts != MFX_ERR_NONE) { bWarning = true; if (sts < MFX_ERR_NONE) { out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; } } if (out->mfx.CodecProfile != MFX_PROFILE_MPEG2_SIMPLE && out->mfx.CodecProfile != MFX_PROFILE_MPEG2_MAIN && out->mfx.CodecProfile != MFX_PROFILE_MPEG2_HIGH && out->mfx.CodecProfile != MFX_PROFILE_UNKNOWN) { out->mfx.CodecProfile = MFX_PROFILE_UNKNOWN; bWarning = true; } if (out->mfx.CodecLevel != MFX_LEVEL_MPEG2_LOW && out->mfx.CodecLevel != MFX_LEVEL_MPEG2_MAIN && out->mfx.CodecLevel != MFX_LEVEL_MPEG2_HIGH1440 && out->mfx.CodecLevel != MFX_LEVEL_MPEG2_HIGH && out->mfx.CodecLevel != MFX_LEVEL_UNKNOWN) { out->mfx.CodecLevel = MFX_LEVEL_UNKNOWN; bWarning = true; } if (out->mfx.FrameInfo.FrameRateExtD != 0 && CorrectProfileLevelMpeg2(out->mfx.CodecProfile, out->mfx.CodecLevel, out->mfx.FrameInfo.Width, out->mfx.FrameInfo.Height, CalculateUMCFramerate(out->mfx.FrameInfo.FrameRateExtN, out->mfx.FrameInfo.FrameRateExtD), out->mfx.RateControlMethod == MFX_RATECONTROL_CQP ? 0 : (mfxU32)(out->mfx.TargetKbps * out->mfx.BRCParamMultiplier * BRC_BITS_IN_KBIT), out->mfx.GopRefDist)) { bWarning = true; } if (bAVBR_WA) { bWarning = AVBR_via_CBR(out) ? true : bWarning; } // invalid modes if ( out->mfx.RateControlMethod == MFX_RATECONTROL_VCM || out->mfx.RateControlMethod == MFX_RATECONTROL_ICQ || out->mfx.RateControlMethod == MFX_RATECONTROL_QVBR || out->mfx.RateControlMethod == MFX_RATECONTROL_LA || out->mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ || out->mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD || out->mfx.RateControlMethod == MFX_RATECONTROL_RESERVED1 || out->mfx.RateControlMethod == MFX_RATECONTROL_RESERVED2 || out->mfx.RateControlMethod == MFX_RATECONTROL_RESERVED3 || out->mfx.RateControlMethod == MFX_RATECONTROL_RESERVED4) { out->mfx.RateControlMethod = 0; bUnsupported = true; } // unknown mode - set to VBR with warning if (out->mfx.RateControlMethod != MFX_RATECONTROL_CBR && out->mfx.RateControlMethod != MFX_RATECONTROL_VBR && out->mfx.RateControlMethod != MFX_RATECONTROL_AVBR && out->mfx.RateControlMethod != MFX_RATECONTROL_CQP && out->mfx.RateControlMethod != 0) { out->mfx.RateControlMethod = MFX_RATECONTROL_VBR; bWarning = true; } mfxExtCodingOption2 * extOpt2 = (mfxExtCodingOption2 *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_CODING_OPTION2); if (extOpt2 && extOpt2->SkipFrame) { if (extOpt2->SkipFrame != MFX_SKIPFRAME_INSERT_DUMMY || out->mfx.RateControlMethod != MFX_RATECONTROL_CQP) { extOpt2->SkipFrame = 0; bWarning = true; } } mfxExtCodingOption3 * extOpt3 = (mfxExtCodingOption3 *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_CODING_OPTION3); if (extOpt3 && extOpt3->EnableMBQP == MFX_CODINGOPTION_ON) { if (out->mfx.RateControlMethod != MFX_RATECONTROL_CQP) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; bWarning = true; } // MPEG2 MBQP currently only supported on Linux if (core->GetVAType() != MFX_HW_VAAPI) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; bUnsupported = true; } } if (extOpt3 && extOpt3->EnableMBQP == MFX_CODINGOPTION_UNKNOWN) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; } if (extOpt3 && (extOpt3->WeightedPred != MFX_WEIGHTED_PRED_UNKNOWN || extOpt3->WeightedBiPred != MFX_WEIGHTED_PRED_UNKNOWN)) { extOpt3->WeightedPred = 0; bUnsupported = true; } if (extOpt3 && (extOpt3->FadeDetection == MFX_CODINGOPTION_ON)) { extOpt3->FadeDetection = 0; bUnsupported = true; } mfxU16 gof = out->mfx.GopOptFlag & (MFX_GOP_CLOSED | MFX_GOP_STRICT); if (out->mfx.GopOptFlag != gof) { out->mfx.GopOptFlag = gof; bWarning = true; } if (extOpt3 && extOpt3->BRCPanicMode == MFX_CODINGOPTION_OFF) { // MPEG2 BRC panic mode disabling currently only supported on Linux if ((core->GetVAType() != MFX_HW_VAAPI) || (out->mfx.RateControlMethod != MFX_RATECONTROL_CBR && out->mfx.RateControlMethod != MFX_RATECONTROL_VBR && out->mfx.RateControlMethod != MFX_RATECONTROL_AVBR)) { extOpt3->BRCPanicMode = MFX_CODINGOPTION_UNKNOWN; bUnsupported = true; } } MFX_CHECK_STS(stsCaps); if (bUnsupported) { return MFX_ERR_UNSUPPORTED; } /* Unreachable code is commented out if(bInvalid) return MFX_ERR_INVALID_VIDEO_PARAM;*/ if (bWarning) { return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return MFX_ERR_NONE; } mfxStatus ControllerBase::QueryIOSurf(VideoCORE * core, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "ControllerBase::QueryIOSurf"); mfxVideoParamEx_MPEG2 videoParamEx = {}; MFX_CHECK_NULL_PTR1(par); MFX_CHECK_NULL_PTR1(request); CHECK_VERSION(par->Version); CHECK_CODEC_ID(par->mfx.CodecId, MFX_CODEC_MPEG2); MFX_CHECK (CheckExtendedBuffers(par) == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); mfxStatus sts = MFX_ERR_NONE; sts = core->IsGuidSupported(DXVA2_Intel_Encode_MPEG2, par, true); MFX_CHECK_STS(sts); mfxExtCodingOption* ext = GetExtCodingOptions(par->ExtParam, par->NumExtParam); mfxExtCodingOptionSPSPPS* pSPSPPS = GetExtCodingOptionsSPSPPS (par->ExtParam, par->NumExtParam); mfxVideoParam parFromSpsPps = {}; mfxExtCodingOption extFromSpsPps = {}; if (pSPSPPS) { parFromSpsPps = *par; if (ext) extFromSpsPps = *ext; //mfxStatus sts = MFX_ERR_NONE; mfxU32 real_len = 0; MFX_CHECK(pSPSPPS->PPSBufSize == 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!pSPSPPS->PPSBuffer, MFX_ERR_INVALID_VIDEO_PARAM); if (!SHParametersEx::CheckSHParameters(pSPSPPS->SPSBuffer, pSPSPPS->SPSBufSize, real_len, &parFromSpsPps, &extFromSpsPps)) return MFX_ERR_INVALID_VIDEO_PARAM; par = &parFromSpsPps; ext = &extFromSpsPps; } ENCODE_CAPS EncCaps = {}; sts = CheckHwCaps(core, par, ext, &EncCaps); MFX_CHECK_STS(sts); mfxU32 mask = (par->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE)? 0x0f:0x1f; if ((par->mfx.FrameInfo.Width & 0x0f) != 0 || (par->mfx.FrameInfo.Height & mask) != 0 ) { return MFX_ERR_INVALID_VIDEO_PARAM; } videoParamEx.mfxVideoParams = *par; ApplyTargetUsage (&videoParamEx); if ( (par->IOPattern & (MFX_IOPATTERN_IN_VIDEO_MEMORY|MFX_IOPATTERN_IN_SYSTEM_MEMORY)) == MFX_IOPATTERN_IN_VIDEO_MEMORY ) { request->Info = videoParamEx.mfxVideoParams.mfx.FrameInfo ; request->NumFrameMin = videoParamEx.mfxVideoParams.mfx.GopRefDist + 3; request->NumFrameSuggested = request->NumFrameMin; request->Type = MFX_MEMTYPE_FROM_ENCODE|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_DXVA2_DECODER_TARGET; } else if ((par->IOPattern & (MFX_IOPATTERN_IN_VIDEO_MEMORY|MFX_IOPATTERN_IN_SYSTEM_MEMORY))==MFX_IOPATTERN_IN_SYSTEM_MEMORY) { request->Info = videoParamEx.mfxVideoParams.mfx.FrameInfo; request->NumFrameMin = videoParamEx.mfxVideoParams.mfx.GopRefDist + 3; request->NumFrameSuggested = request->NumFrameMin; request->Type = MFX_MEMTYPE_FROM_ENCODE|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_SYSTEM_MEMORY; } else { return MFX_ERR_INVALID_VIDEO_PARAM; } if (ext && (ext->EndOfSequence==MFX_CODINGOPTION_ON)) { request->NumFrameMin = request->NumFrameMin*2+1; request->NumFrameSuggested = request->NumFrameSuggested*2+1; } if (EncCaps.EncodeFunc) { request->NumFrameMin = request->NumFrameMin + videoParamEx.mfxVideoParams.AsyncDepth; request->NumFrameSuggested = request->NumFrameSuggested + videoParamEx.mfxVideoParams.AsyncDepth; } return MFX_ERR_NONE; } mfxStatus UnlockFrames (MFXGOP* pGOP, MFXWaitingList* pWaitingList, VideoCORE* pcore) { mfxStatus sts = MFX_ERR_NONE; if (pGOP !=0) { pGOP->CloseGop(false); for (;;) { sFrameEx fr = {}; if (!pGOP->GetFrameExForDecoding(&fr,0,0,0)) { break; } sts = pcore->DecreaseReference(*fr.m_pFrame); MFX_CHECK_STS(sts); pGOP->ReleaseCurrentFrame(); } } if (pWaitingList) { for (;;) { sFrameEx fr = {}; if (!pWaitingList->GetFrameEx(&fr)) { break; } sts = pcore->DecreaseReference(*fr.m_pFrame); MFX_CHECK_STS(sts); pWaitingList->MoveOnNextFrame(); } } return sts; } ControllerBase::ControllerBase(VideoCORE *core, bool bAVBR_WA ) : m_pCore (core) , m_nEncodeCalls(0) , m_nFrameInGOP(0) , m_pGOP(0) , m_pWaitingList(0) , m_InputFrameOrder(-1) , m_OutputFrameOrder(-1) , m_BitstreamLen (0) , m_InputSurfaces(core) , m_InitWidth(0) , m_InitHeight(0) , m_bInitialized (false) , m_bAVBR_WA (bAVBR_WA) { memset (&m_VideoParamsEx, 0, sizeof(m_VideoParamsEx)); } mfxStatus ControllerBase::Reset(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; bool bProgressiveSequence = false; mfxFrameInfo *pFrameInfo = 0; bool bCorrected = false; bool bUnsupported = false; bool bInvalid = false; eMFXHWType type = m_pCore->GetHWType(); MFX_CHECK_NULL_PTR1(par); CHECK_VERSION(par->Version); CHECK_CODEC_ID(par->mfx.CodecId, MFX_CODEC_MPEG2); MFX_CHECK(CheckExtendedBuffers(par) == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); memset(&m_VideoParamsEx,0,sizeof(mfxVideoParamEx_MPEG2)); m_VideoParamsEx.mfxVideoParams.mfx = par->mfx; m_VideoParamsEx.mfxVideoParams.IOPattern = par->IOPattern; m_VideoParamsEx.mfxVideoParams.Protected = par->Protected; m_VideoParamsEx.mfxVideoParams.AsyncDepth = par->AsyncDepth == 0 ? 2: par->AsyncDepth; if (m_VideoParamsEx.mfxVideoParams.mfx.BRCParamMultiplier == 0) m_VideoParamsEx.mfxVideoParams.mfx.BRCParamMultiplier = 1; /*-------------------Check and correct parameters:---------------------*/ sts = CheckVideoParamEncoders(par, type); MFX_CHECK_STS(sts); MFX_CHECK(par->Protected == 0,MFX_ERR_INVALID_VIDEO_PARAM); mfxExtCodingOption extFromSpsPps = {}; mfxExtCodingOption* ext = GetExtCodingOptions(par->ExtParam, par->NumExtParam); if (mfxExtCodingOptionSPSPPS* pSPSPPS = GetExtCodingOptionsSPSPPS (par->ExtParam, par->NumExtParam)) { MFX_CHECK(pSPSPPS->PPSBufSize == 0, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!pSPSPPS->PPSBuffer, MFX_ERR_INVALID_VIDEO_PARAM); mfxU32 real_len = 0; if (ext != 0) { extFromSpsPps = *ext; } if (!SHParametersEx::CheckSHParameters(pSPSPPS->SPSBuffer, pSPSPPS->SPSBufSize, real_len, &m_VideoParamsEx.mfxVideoParams, &extFromSpsPps)) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; ext = &extFromSpsPps; } if (mfxExtVideoSignalInfo* pVideoSignalInfo = GetExtVideoSignalInfo(par->ExtParam, par->NumExtParam)) { m_VideoParamsEx.videoSignalInfo = *pVideoSignalInfo; m_VideoParamsEx.bAddDisplayExt = true; } else { m_VideoParamsEx.bAddDisplayExt = false; } sts = CheckHwCaps(m_pCore, &m_VideoParamsEx.mfxVideoParams, ext); if (sts != MFX_ERR_NONE) { return is_initialized() ? MFX_ERR_INVALID_VIDEO_PARAM // reset can't return partial acceleration : MFX_ERR_UNSUPPORTED; } m_nEncodeCalls = 0; m_nFrameInGOP = 0; pFrameInfo = &m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo; switch (pFrameInfo->PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: bProgressiveSequence = true; break; case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_FIELD_BFF: break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } if (pFrameInfo->CropX!=0 || pFrameInfo->CropY!=0 || pFrameInfo->Width > 0x1fff || pFrameInfo->Height > 0x1fff || pFrameInfo->CropW > pFrameInfo->Width || pFrameInfo->CropH > pFrameInfo->Height) return MFX_ERR_INVALID_VIDEO_PARAM; sts = CheckFrameRateMPEG2(pFrameInfo->FrameRateExtD,pFrameInfo->FrameRateExtN); if (sts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) { bCorrected = true; } else if (sts == MFX_ERR_INVALID_VIDEO_PARAM) { bInvalid = true; } if ((pFrameInfo->Width & 15) != 0) return MFX_ERR_INVALID_VIDEO_PARAM; if (pFrameInfo->CropW) pFrameInfo->Width = mfx::align2_value(pFrameInfo->CropW, 16); mfxU32 heightAlignment = bProgressiveSequence ? 16 : 32; if ((pFrameInfo->Height & (heightAlignment - 1)) != 0) return MFX_ERR_INVALID_VIDEO_PARAM; if (pFrameInfo->CropH) pFrameInfo->Height = mfx::align2_value(pFrameInfo->CropH, heightAlignment); if (m_bInitialized == false) { m_InitWidth = pFrameInfo->Width; m_InitHeight = pFrameInfo->Height; } else if (m_InitWidth < pFrameInfo->Width || m_InitHeight < pFrameInfo->Height) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } if (ext) { mfxExtCodingOption temp = {}; mfxU32 bufOffset = sizeof(mfxExtBuffer); mfxU32 bufSize = sizeof(mfxExtCodingOption) - bufOffset; temp.EndOfSequence = ext->EndOfSequence; temp.FramePicture = ext->FramePicture; bCorrected = bCorrected || (memcmp((mfxU8*)(ext) + bufOffset,(mfxU8*)(&temp) + bufOffset, bufSize)!= 0); bUnsupported = bUnsupported || (ext->FieldOutput == MFX_CODINGOPTION_ON); } m_VideoParamsEx.bFieldCoding = false; if (!bProgressiveSequence) { m_VideoParamsEx.bFieldCoding = (ext && ext->FramePicture == MFX_CODINGOPTION_OFF)? true:false; } sts = CheckAspectRatioMPEG2( pFrameInfo->AspectRatioW, pFrameInfo->AspectRatioH, pFrameInfo->Width, pFrameInfo->Height, pFrameInfo->CropW, pFrameInfo->CropH); if (sts < 0) { if (!m_bInitialized) { pFrameInfo->AspectRatioW = 0; pFrameInfo->AspectRatioH = 0; bInvalid = true; } else { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } if (m_bAVBR_WA) { bCorrected = AVBR_via_CBR(&m_VideoParamsEx.mfxVideoParams) ? true : bCorrected; } mfxU16& RateControl = m_VideoParamsEx.mfxVideoParams.mfx.RateControlMethod; // invalid modes if ( RateControl == MFX_RATECONTROL_VCM || RateControl == MFX_RATECONTROL_ICQ || RateControl == MFX_RATECONTROL_QVBR || RateControl == MFX_RATECONTROL_LA || RateControl == MFX_RATECONTROL_LA_ICQ || RateControl == MFX_RATECONTROL_LA_HRD || RateControl == MFX_RATECONTROL_RESERVED1 || RateControl == MFX_RATECONTROL_RESERVED2 || RateControl == MFX_RATECONTROL_RESERVED3 || RateControl == MFX_RATECONTROL_RESERVED4) { return MFX_ERR_INVALID_VIDEO_PARAM; } // unknown mode - set to VBR with warning if (RateControl != MFX_RATECONTROL_CBR && RateControl != MFX_RATECONTROL_VBR && RateControl != MFX_RATECONTROL_AVBR && RateControl != MFX_RATECONTROL_CQP) { /*if RateControlMethod was undefined MSDK have to use default one */ RateControl = MFX_RATECONTROL_VBR; bCorrected = true; } mfxExtCodingOption2 * extOpt2 = (mfxExtCodingOption2 *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION2); if (extOpt2 && extOpt2->SkipFrame) { } mfxExtCodingOption3 * extOpt3 = (mfxExtCodingOption3 *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION3); if (extOpt3 && extOpt3->EnableMBQP == MFX_CODINGOPTION_ON) { // MPEG2 MBQP currently only supported on Linux and only valid for CQP mode if (m_pCore->GetVAType() != MFX_HW_VAAPI) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; return MFX_ERR_UNSUPPORTED; } if (m_VideoParamsEx.mfxVideoParams.mfx.RateControlMethod != MFX_RATECONTROL_CQP) { extOpt3->EnableMBQP = MFX_CODINGOPTION_OFF; bCorrected = true; // return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } else { m_VideoParamsEx.bMbqpMode = true; } } if (extOpt3 && extOpt3->BRCPanicMode == MFX_CODINGOPTION_OFF) { // MPEG2 BRC panic mode disabling currently only supported on Linux and only valid for non-CQP modes const mfxU16 selectedRateControl = m_VideoParamsEx.mfxVideoParams.mfx.RateControlMethod; if (selectedRateControl != MFX_RATECONTROL_CBR && selectedRateControl != MFX_RATECONTROL_VBR && selectedRateControl != MFX_RATECONTROL_AVBR) { extOpt3->BRCPanicMode = MFX_CODINGOPTION_UNKNOWN; bCorrected = true; } if (m_pCore->GetVAType() != MFX_HW_VAAPI) { extOpt3->BRCPanicMode = MFX_CODINGOPTION_UNKNOWN; return MFX_ERR_UNSUPPORTED; } m_VideoParamsEx.bDisablePanicMode = true; } if (extOpt3 && (extOpt3->WeightedPred != MFX_WEIGHTED_PRED_UNKNOWN || extOpt3->WeightedBiPred != MFX_WEIGHTED_PRED_UNKNOWN || extOpt3->FadeDetection == MFX_CODINGOPTION_ON)) { return MFX_ERR_INVALID_VIDEO_PARAM; } double fr = CalculateUMCFramerate(m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.FrameRateExtN, m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.FrameRateExtD); if (CorrectProfileLevelMpeg2(m_VideoParamsEx.mfxVideoParams.mfx.CodecProfile, m_VideoParamsEx.mfxVideoParams.mfx.CodecLevel, m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.Width, m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.Height, fr, m_VideoParamsEx.mfxVideoParams.mfx.RateControlMethod == MFX_RATECONTROL_CQP ? 0 : (mfxU32)(m_VideoParamsEx.mfxVideoParams.mfx.TargetKbps * m_VideoParamsEx.mfxVideoParams.mfx.BRCParamMultiplier * BRC_BITS_IN_KBIT), m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist)) bCorrected = true;; ApplyTargetUsage(&m_VideoParamsEx); m_InputFrameOrder = -1; m_OutputFrameOrder= -1; m_BitstreamLen = 0; m_VideoParamsEx.bAddEOS = (ext && (ext->EndOfSequence == MFX_CODINGOPTION_ON)); sts = UnlockFrames (m_pGOP, m_pWaitingList,m_pCore); MFX_CHECK_STS(sts); mfxU16 GopRefDist = m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist; mfxI32 maxFramesInWaitingList = 0; mfxI32 minFramesInWaitingList = 0; mfxI32 delayInWaitingList = 0; if (par->mfx.EncodedOrder) { maxFramesInWaitingList = m_VideoParamsEx.mfxVideoParams.AsyncDepth + ((m_VideoParamsEx.bAddEOS)? 1 : 0); minFramesInWaitingList = (m_VideoParamsEx.bAddEOS)? 1 : 0; delayInWaitingList = minFramesInWaitingList + m_VideoParamsEx.mfxVideoParams.AsyncDepth - 1; } else { maxFramesInWaitingList = (GopRefDist + 1)*3; minFramesInWaitingList = ((m_VideoParamsEx.bAddEOS)? 1 : 0); delayInWaitingList = GopRefDist + minFramesInWaitingList; } if (m_pGOP) { if (m_pGOP->GetMaxBFrames() < GopRefDist - 1) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } m_pGOP->Reset(m_VideoParamsEx.mfxVideoParams.mfx.GopOptFlag&MFX_GOP_CLOSED, m_VideoParamsEx.mfxVideoParams.mfx.IdrInterval,ext && ext->EndOfSequence !=0,m_VideoParamsEx.mfxVideoParams.mfx.EncodedOrder!=0); } else { m_pGOP = new MFXGOP; if (!m_pGOP) { return MFX_ERR_NULL_PTR; } sts = m_pGOP->Init(GopRefDist - 1, m_VideoParamsEx.mfxVideoParams.mfx.GopOptFlag&MFX_GOP_CLOSED, m_VideoParamsEx.mfxVideoParams.mfx.IdrInterval,ext && ext->EndOfSequence==MFX_CODINGOPTION_ON,m_VideoParamsEx.mfxVideoParams.mfx.EncodedOrder!=0); MFX_CHECK_STS(sts); } if (m_pWaitingList) { if (m_pWaitingList->GetMaxFrames() < maxFramesInWaitingList) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } m_pWaitingList->Reset(minFramesInWaitingList, delayInWaitingList); } else { m_pWaitingList = new MFXWaitingList; if (!m_pWaitingList) { return MFX_ERR_NULL_PTR; } sts = m_pWaitingList->Init(maxFramesInWaitingList, minFramesInWaitingList,delayInWaitingList); MFX_CHECK_STS(sts); } m_VideoParamsEx.bRawFrames = false; m_VideoParamsEx.mfxVideoParams.mfx.NumSlice = (mfxU16)((m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.Height)>>4); { mfxFrameAllocRequest request = {}; sts = QueryIOSurf(m_pCore, par, &request); MFX_CHECK(sts>=0,sts); sts = m_InputSurfaces.Reset(par); MFX_CHECK(sts != MFX_ERR_INVALID_VIDEO_PARAM, m_bInitialized ? MFX_ERR_INCOMPATIBLE_VIDEO_PARAM: sts); MFX_CHECK_STS(sts); } if (bUnsupported) return MFX_ERR_UNSUPPORTED; if(bInvalid) return MFX_ERR_INVALID_VIDEO_PARAM; m_bInitialized = true; return bCorrected ? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM : MFX_ERR_NONE; } //virtual mfxStatus Close(void); // same name mfxStatus ControllerBase::Close(void) { mfxStatus sts = MFX_ERR_NONE; sts = UnlockFrames (m_pGOP, m_pWaitingList,m_pCore); MFX_CHECK_STS(sts); if (m_pGOP) { m_pGOP->Close(); delete m_pGOP; m_pGOP = 0; } if (m_pWaitingList) { m_pWaitingList->Close(); delete m_pWaitingList; m_pWaitingList = 0; } m_InputSurfaces.Close(); m_bInitialized = false; return MFX_ERR_NONE; } mfxStatus ControllerBase::GetVideoParam(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); CHECK_VERSION(par->Version); par->mfx = m_VideoParamsEx.mfxVideoParams.mfx; par->IOPattern = m_VideoParamsEx.mfxVideoParams.IOPattern; par->mfx.CodecId = MFX_CODEC_MPEG2; mfxExtCodingOption* ext = GetExtCodingOptions(par->ExtParam, par->NumExtParam); if (ext) ext->FramePicture= (mfxU16)((m_VideoParamsEx.bFieldCoding) ? MFX_CODINGOPTION_OFF : MFX_CODINGOPTION_ON); return MFX_ERR_NONE; } mfxStatus ControllerBase::GetEncodeStat(mfxEncodeStat *stat) { MFX_CHECK_NULL_PTR1(stat) if(!is_initialized()) return MFX_ERR_NOT_INITIALIZED; stat->NumBit = (mfxU64)(m_BitstreamLen*8); stat->NumFrame = m_OutputFrameOrder + 1; stat->NumCachedFrame = m_InputFrameOrder - m_OutputFrameOrder; return MFX_ERR_NONE; } mfxStatus ControllerBase::ReorderFrame(mfxEncodeInternalParams *pInInternalParams, mfxFrameSurface1 *in, mfxEncodeInternalParams *pOutInternalParams, mfxFrameSurface1 **out) { if (in) { if (!m_pWaitingList->AddFrame( in, pInInternalParams)) { return MFX_ERR_NOT_ENOUGH_BUFFER; } } // Fill GOP structure using waiting list for(;;) { sFrameEx CurFrame = {}; if (!m_pWaitingList->GetFrameEx(&CurFrame, in == NULL)) { break; } if (!m_pGOP->AddFrame(&CurFrame)) { break; } m_pWaitingList->MoveOnNextFrame(); } if (!in) { bool strictGop = 0 != (m_VideoParamsEx.mfxVideoParams.mfx.GopOptFlag & MFX_GOP_STRICT); m_pGOP->CloseGop(strictGop); } sFrameEx CurFrame = {}; // Extract next frame from GOP structure if (!m_pGOP->GetFrameExForDecoding(&CurFrame,m_pWaitingList->isNextReferenceIntra(), m_pWaitingList->isNextBFrame(),m_pWaitingList->isLastFrame())) { return MFX_ERR_MORE_DATA; } mfxU16 frameType = CurFrame.m_sEncodeInternalParams.FrameType; //Correct InternalFlags CurFrame.m_sEncodeInternalParams.InternalFlags = (CurFrame.m_bAddHeader)? MFX_IFLAG_ADD_HEADER:0; if (CurFrame.m_bAddEOS) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_ADD_EOS; } if (CurFrame.m_bOnlyBwdPrediction && isBPredictedFrame(frameType)) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_BWD_ONLY; } if (CurFrame.m_bOnlyFwdPrediction && isBPredictedFrame(frameType)) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_FWD_ONLY; } // Check frame order parameters if (isPredictedFrame(frameType)) { sFrameEx refFrame = {}; if (m_pGOP->GetFrameExReference(&refFrame)) { MFX_CHECK((CurFrame.m_FrameOrder > refFrame.m_FrameOrder) && ((int32_t)CurFrame.m_FrameOrder - (int32_t)refFrame.m_FrameOrder <= m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist) ,MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } else if (isBPredictedFrame(frameType)) { if (CurFrame.m_bOnlyBwdPrediction) { sFrameEx refFrame = {}; if (m_pGOP->GetFrameExReference(&refFrame,true)) { MFX_CHECK((CurFrame.m_FrameOrder < refFrame.m_FrameOrder) && ((int32_t)refFrame.m_FrameOrder - (int32_t)CurFrame.m_FrameOrder < m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist) ,MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } else if (CurFrame.m_bOnlyFwdPrediction) { sFrameEx refFrame = {}; if (m_pGOP->GetFrameExReference(&refFrame,false)) { MFX_CHECK((CurFrame.m_FrameOrder > refFrame.m_FrameOrder) && ((int32_t)CurFrame.m_FrameOrder - (int32_t)refFrame.m_FrameOrder < m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist) ,MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } else { sFrameEx refFrameF = {}; sFrameEx refFrameB = {}; if (m_pGOP->GetFrameExReference(&refFrameF,false) && m_pGOP->GetFrameExReference(&refFrameB,true)) { MFX_CHECK((CurFrame.m_FrameOrder < refFrameB.m_FrameOrder) && (CurFrame.m_FrameOrder > refFrameF.m_FrameOrder) ,MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } } } *out = CurFrame.m_pFrame; *pOutInternalParams = CurFrame.m_sEncodeInternalParams; m_pGOP->ReleaseCurrentFrame(); return MFX_ERR_NONE; } mfxStatus ControllerBase::CheckNextFrame(mfxEncodeInternalParams *pOutInternalParams, mfxFrameSurface1 **out) { // Fill GOP structure using waiting list for(;;) { sFrameEx CurFrame = {}; if (!m_pWaitingList->GetFrameEx(&CurFrame, false)) { break; } if (!m_pGOP->AddFrame(&CurFrame)) { break; } m_pWaitingList->MoveOnNextFrame(); } sFrameEx CurFrame = {}; // Extract next frame from GOP structure if (!m_pGOP->GetFrameExForDecoding(&CurFrame,m_pWaitingList->isNextReferenceIntra(), m_pWaitingList->isNextBFrame(),m_pWaitingList->isLastFrame())) { return MFX_ERR_MORE_DATA; } mfxU16 frameType = CurFrame.m_sEncodeInternalParams.FrameType; //Correct InternalFlags CurFrame.m_sEncodeInternalParams.InternalFlags = (CurFrame.m_bAddHeader)? MFX_IFLAG_ADD_HEADER:0; if (CurFrame.m_bAddEOS) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_ADD_EOS; } if (CurFrame.m_bOnlyBwdPrediction && isBPredictedFrame(frameType)) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_BWD_ONLY; } if (CurFrame.m_bOnlyFwdPrediction && isBPredictedFrame(frameType)) { CurFrame.m_sEncodeInternalParams.InternalFlags |= MFX_IFLAG_FWD_ONLY; } *out = CurFrame.m_pFrame; *pOutInternalParams = CurFrame.m_sEncodeInternalParams; m_pGOP->ReleaseCurrentFrame(); return MFX_ERR_NONE; } mfxStatus ControllerBase::EncodeFrameCheck( mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams) { mfxStatus sts = MFX_ERR_NONE; bool bWarning = false; MFX_CHECK(is_initialized(),MFX_ERR_NOT_INITIALIZED); CHECK_VERSION(bs->Version); MFX_CHECK_NULL_PTR2(bs, pInternalParams); MFX_CHECK(bs->DataOffset <= 32 , MFX_ERR_UNDEFINED_BEHAVIOR); mfxU32 startbspos = bs->DataOffset + bs->DataLength; mfxU32 output_buffer_size = bs->MaxLength > startbspos ? (bs->MaxLength - startbspos) : 0; MFX_CHECK(output_buffer_size >= mfxU32(m_VideoParamsEx.mfxVideoParams.mfx.BufferSizeInKB * m_VideoParamsEx.mfxVideoParams.mfx.BRCParamMultiplier * 1000), MFX_ERR_NOT_ENOUGH_BUFFER); MFX_CHECK_NULL_PTR1(bs->Data); if (surface) { if ((m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.PicStruct&0x0f) != MFX_PICSTRUCT_UNKNOWN) { if ((surface->Info.PicStruct&0x0f) != (m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.PicStruct&0x0f) && (surface->Info.PicStruct&0x0f) != MFX_PICSTRUCT_UNKNOWN && (surface->Info.PicStruct&0x0f) != MFX_PICSTRUCT_PROGRESSIVE) { bWarning=true; } } else if ((surface->Info.PicStruct&0x0f) == MFX_PICSTRUCT_UNKNOWN) { return MFX_ERR_UNDEFINED_BEHAVIOR; } MFX_CHECK(surface->Info.Width >= m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.Width, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface->Info.Height >= m_VideoParamsEx.mfxVideoParams.mfx.FrameInfo.Height, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(surface->Info.FourCC == MFX_FOURCC_NV12, MFX_ERR_UNDEFINED_BEHAVIOR); if (surface->Data.Y) { MFX_CHECK(surface->Data.Pitch < 0x8000, MFX_ERR_UNDEFINED_BEHAVIOR); CHECK_VERSION(surface->Version); } sts = m_pCore->IncreaseReference(*surface); MFX_CHECK_STS(sts); m_InputFrameOrder++; mfxU16 frameType = (ctrl)? ctrl->FrameType : 0; if (m_VideoParamsEx.mfxVideoParams.mfx.EncodedOrder) { mfxU16 type = frameType & (MFX_FRAMETYPE_I|MFX_FRAMETYPE_P|MFX_FRAMETYPE_B); MFX_CHECK ((type == MFX_FRAMETYPE_I || type == MFX_FRAMETYPE_P || type == MFX_FRAMETYPE_B), MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } pInternalParams->FrameType = frameType; pInternalParams->FrameOrder = (!m_VideoParamsEx.mfxVideoParams.mfx.EncodedOrder)? m_InputFrameOrder:surface->Data.FrameOrder; if (ctrl) { pInternalParams->ExtParam = ctrl->ExtParam; pInternalParams->NumExtParam = ctrl->NumExtParam; pInternalParams->NumPayload = ctrl->NumPayload; pInternalParams->Payload = ctrl->Payload; pInternalParams->QP = ctrl->QP; pInternalParams->SkipFrame = ctrl->SkipFrame; } else { pInternalParams->ExtParam = 0; pInternalParams->NumExtParam = 0; pInternalParams->NumPayload = 0; pInternalParams->Payload = 0; pInternalParams->QP = 0; pInternalParams->SkipFrame = 0; } *reordered_surface = surface; if (m_InputFrameOrder < m_pWaitingList->GetDelay()) { return (mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK; } else { m_nEncodeCalls ++; return bWarning? MFX_WRN_INCOMPATIBLE_VIDEO_PARAM: MFX_ERR_NONE; } } else { m_nEncodeCalls ++; *reordered_surface = 0; return (m_nEncodeCalls <= (mfxU32)m_InputFrameOrder+1)? MFX_ERR_NONE : MFX_ERR_MORE_DATA; } } mfxStatus ControllerBase::CheckFrameType(mfxEncodeInternalParams *pInternalParams) { mfxU16 type = pInternalParams->FrameType & (MFX_FRAMETYPE_I|MFX_FRAMETYPE_P|MFX_FRAMETYPE_B); if (!m_VideoParamsEx.mfxVideoParams.mfx.EncodedOrder) { if (type != MFX_FRAMETYPE_I) { GetFrameTypeMpeg2 (m_nFrameInGOP, m_VideoParamsEx.mfxVideoParams.mfx.GopPicSize, m_VideoParamsEx.mfxVideoParams.mfx.GopRefDist, m_VideoParamsEx.mfxVideoParams.mfx.GopOptFlag&MFX_GOP_CLOSED, &pInternalParams->FrameType); } m_nFrameInGOP = (pInternalParams->FrameType & MFX_FRAMETYPE_I) ? 1 : m_nFrameInGOP + 1; } else { MFX_CHECK((type == MFX_FRAMETYPE_I || type == MFX_FRAMETYPE_P || type == MFX_FRAMETYPE_B), MFX_ERR_UNDEFINED_BEHAVIOR); } return MFX_ERR_NONE; } #define RET_UMC_TO_MFX(umc_ret) ConvertStatusUmc2Mfx(umc_ret) static void ConvertFrameParamsToUMC(const mfxFrameParamMPEG2* pFrameParams, UMC::FrameType &frType, uint32_t &picture_structure, uint32_t &repeat_first_field, uint32_t &top_field_first, uint32_t &second_field) { frType = ((pFrameParams->FrameType & MFX_FRAMETYPE_I) ? UMC::I_PICTURE : (pFrameParams->FrameType & MFX_FRAMETYPE_P ? UMC::P_PICTURE : UMC::B_PICTURE)); picture_structure = pFrameParams->PicStructure; repeat_first_field = (pFrameParams->RepeatFirstField) ? 1:0; top_field_first = (pFrameParams->TopFieldFirst) ? 1:0; second_field = (pFrameParams->SecondFieldFlag) ? 1:0; } void MPEG2BRC_HW::QuantIntoScaleTypeAndCode (int32_t quant_value, int32_t &q_scale_type, int32_t &quantiser_scale_code) { if(quant_value > 7 && quant_value <= 62) { q_scale_type = 0; quantiser_scale_code = (quant_value + 1) >> 1; } else { // non-linear quantizer q_scale_type = 1; if(quant_value <= 8) { quantiser_scale_code = quant_value; } else if (quant_value > 62) { quantiser_scale_code = 25+((quant_value-64+4)>>3); } } if(quantiser_scale_code < 1) { quantiser_scale_code = 1; } if(quantiser_scale_code > 31) { quantiser_scale_code = 31; } } int32_t MPEG2BRC_HW::ChangeQuant(int32_t quant_value_old, int32_t quant_value_new) { int32_t q_scale_type = 0; int32_t quantiser_scale_code = 0; int32_t quant_value = quant_value_new; if(quant_value_old == quant_value) { return quant_value; } QuantIntoScaleTypeAndCode (quant_value_new, q_scale_type, quantiser_scale_code); quant_value = ScaleTypeAndCodeIntoQuant (q_scale_type, quantiser_scale_code); if (quant_value == quant_value_old) { if (quant_value_new > quant_value_old) { if (quantiser_scale_code == 31) { return quant_value; } else { quantiser_scale_code ++; } } else { if (quantiser_scale_code == 1) { return quant_value; } else { quantiser_scale_code --; } } quant_value = ScaleTypeAndCodeIntoQuant (q_scale_type, quantiser_scale_code); } return quant_value; } mfxStatus MPEG2BRC_HW::Init(mfxVideoParam* par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MPEG2BRC_HW::Init"); mfxStatus sts = MFX_ERR_NONE; m_bConstantQuant = (par->mfx.RateControlMethod == MFX_RATECONTROL_CQP)? 1:0; m_bLimitedMode = 0; if (m_bConstantQuant) { UMC::Mpeg2_BrcParams brcParams; UMC::Status ret = UMC::UMC_OK; brcParams.frameWidth = par->mfx.FrameInfo.Width; brcParams.frameHeight = par->mfx.FrameInfo.Height; brcParams.quant[0] = par->mfx.QPI; brcParams.quant[1] = par->mfx.QPP; brcParams.quant[2] = par->mfx.QPB; if (m_pBRC == NULL) { m_pBRC = new UMC::MPEG2BRC_CONST_QUNT; } ret = m_pBRC->Init(&brcParams); MFX_CHECK_UMC_STS (ret); ret = m_pBRC->GetParams(&brcParams); MFX_CHECK_UMC_STS (ret); mfxU32 bufferSizeInKB = ((brcParams.maxFrameSize + 999)/1000); par->mfx.BRCParamMultiplier = (mfxU16)((bufferSizeInKB + 0x10000) / 0x10000); par->mfx.BufferSizeInKB = (mfxU16)(bufferSizeInKB / par->mfx.BRCParamMultiplier); } else { UMC::VideoBrcParams brcParams; UMC::Status ret = UMC::UMC_OK; sts = ConvertVideoParam_Brc(par, &brcParams); MFX_CHECK_STS(sts); if (brcParams.HRDBufferSizeBytes == 0) brcParams.HRDBufferSizeBytes = std::min(65535000, brcParams.targetBitrate / 4); // limit buffer size with 2 seconds if (brcParams.maxBitrate == 0) brcParams.maxBitrate = brcParams.targetBitrate; switch (par->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: brcParams.info.interlace_type = UMC::PROGRESSIVE; break; case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_UNKNOWN: brcParams.info.interlace_type = UMC::INTERLEAVED_TOP_FIELD_FIRST; break; case MFX_PICSTRUCT_FIELD_BFF: brcParams.info.interlace_type = UMC::INTERLEAVED_BOTTOM_FIELD_FIRST; break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } if (m_pBRC == NULL) { m_pBRC = new UMC::MPEG2BRC; ret = m_pBRC->Init(&brcParams, 0); MFX_CHECK_UMC_STS (ret); } else { m_pBRC->Close(); ret = m_pBRC->Init(&brcParams, 0); MFX_CHECK_UMC_STS (ret); } ret = m_pBRC->GetParams(&brcParams); MFX_CHECK_UMC_STS (ret); m_bufferSizeInKB = (mfxU32)(brcParams.HRDBufferSizeBytes / 1000); m_InputBitsPerFrame = (mfxI32)(brcParams.targetBitrate / brcParams.info.framerate); mfxU32 maxVal32 = std::max({ mfxU32(brcParams.HRDInitialDelayBytes / 1000), mfxU32(brcParams.HRDBufferSizeBytes / 1000), mfxU32(brcParams.targetBitrate / 1000), mfxU32(brcParams.maxBitrate / 1000)}); par->mfx.BRCParamMultiplier = (mfxU16)((maxVal32 + 0x10000) / 0x10000); par->mfx.BufferSizeInKB = (mfxU16)(m_bufferSizeInKB / par->mfx.BRCParamMultiplier); par->mfx.InitialDelayInKB = (mfxU16)(brcParams.HRDInitialDelayBytes / 1000 / par->mfx.BRCParamMultiplier); par->mfx.TargetKbps = (mfxU16)(brcParams.targetBitrate / 1000 / par->mfx.BRCParamMultiplier); par->mfx.MaxKbps = (mfxU16)(brcParams.maxBitrate / 1000 / par->mfx.BRCParamMultiplier); mfxU32 MBcount = (par->mfx.FrameInfo.Width/16)*(par->mfx.FrameInfo.Height/16); m_MinFrameSizeBits[0] = 16 * 6 * MBcount + 140 + (par->mfx.FrameInfo.Width/16)*32; m_MinFrameSizeBits[1] = 1*MBcount + 140 + (par->mfx.FrameInfo.Width/16)*32; m_MinFrameSizeBits[2] = 1*MBcount + 140 + (par->mfx.FrameInfo.Width/16)*32; m_MinFieldSizeBits[0] = 12 * 6 * (MBcount/2) + 140 + (par->mfx.FrameInfo.Width/16)*32; m_MinFieldSizeBits[1] = 1*MBcount/2 + 140 + (par->mfx.FrameInfo.Width/16)*32; m_MinFieldSizeBits[2] = 1*MBcount/2 + 140 + (par->mfx.FrameInfo.Width/16)*32; mfxU32 GOPLengthBits = ((mfxU32)(brcParams.maxBitrate/brcParams.info.framerate))*brcParams.GOPPicSize; mfxI32 numPFrames = (brcParams.GOPPicSize/brcParams.GOPRefDist > 1) ? brcParams.GOPPicSize/brcParams.GOPRefDist - 1:0; mfxI32 numBFrames = (brcParams.GOPPicSize > numPFrames + 1) ? brcParams.GOPPicSize - numPFrames - 1:0; mfxU32 minGOPLengthBits = m_MinFrameSizeBits[0] + numPFrames * m_MinFrameSizeBits[1] + numBFrames *m_MinFrameSizeBits[2]; m_GopSize = par->mfx.GopPicSize; m_FirstGopSize = (m_GopSize - 1)/par->mfx.GopRefDist * par->mfx.GopRefDist + 1; if (GOPLengthBits < minGOPLengthBits) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } return sts; } void MPEG2BRC_HW::Close () { delete m_pBRC; m_pBRC = 0; m_bConstantQuant = 0; m_MinFrameSizeBits [0] = 0; m_MinFrameSizeBits [1] = 0; m_MinFrameSizeBits [2] = 0; m_MinFieldSizeBits [0] = 0; m_MinFieldSizeBits [1] = 0; m_MinFieldSizeBits [2] = 0; m_FirstGopSize = 0; m_GopSize = 0; m_bufferSizeInKB = 0; m_InputBitsPerFrame = 0; m_bLimitedMode = 0; } mfxStatus MPEG2BRC_HW::StartNewFrame(const mfxFrameParamMPEG2 *pFrameParams, mfxI32 recode) { UMC::Status ret = UMC::UMC_OK; uint32_t picture_structure = 0; uint32_t repeat_first_field = 0; uint32_t top_field_first = 0; uint32_t second_field = 0; UMC::FrameType frType = ((pFrameParams->FrameType & MFX_FRAMETYPE_I) ? UMC::I_PICTURE : (pFrameParams->FrameType & MFX_FRAMETYPE_P ? UMC::P_PICTURE : UMC::B_PICTURE)); if (UMC::BRC_RECODE_NONE == recode ) { if (pFrameParams->FrameType & (MFX_FRAMETYPE_P|MFX_FRAMETYPE_I)) { m_bLimitedMode = 0; } } if (UMC::BRC_RECODE_NONE == recode && m_bLimitedMode) { recode = UMC::BRC_EXT_FRAMESKIP; } ConvertFrameParamsToUMC(pFrameParams, frType,picture_structure,repeat_first_field, top_field_first,second_field); ret = m_pBRC->SetPictureFlags(frType, picture_structure, repeat_first_field, top_field_first, second_field); MFX_CHECK_UMC_STS (ret); ret = m_pBRC->PreEncFrame(frType,recode); MFX_CHECK_UMC_STS (ret); return MFX_ERR_NONE; } mfxStatus MPEG2BRC_HW::SetQuantDCPredAndDelay(mfxFrameParamMPEG2 *pFrameParams, mfxU8 *pQuant) { UMC::FrameType frType = ((pFrameParams->FrameType & MFX_FRAMETYPE_I) ? UMC::I_PICTURE : (pFrameParams->FrameType & MFX_FRAMETYPE_P ? UMC::P_PICTURE : UMC::B_PICTURE)); int32_t quant_value = m_pBRC->GetQP(frType); int32_t q_scale_type = 0; int32_t quantiser_scale_code = 0; UMC::Status ret = UMC::UMC_OK; double hrdBufFullness = 0; UMC::VideoBrcParams brcParams; QuantIntoScaleTypeAndCode (quant_value, q_scale_type, quantiser_scale_code); if (pFrameParams->FrameType & MFX_FRAMETYPE_I) { if(quant_value < 15) pFrameParams->IntraVLCformat = 1; else pFrameParams->IntraVLCformat = 0; } pFrameParams->QuantScaleType = q_scale_type; ret = m_pBRC->GetHRDBufferFullness(&hrdBufFullness, 0); MFX_CHECK_UMC_STS (ret); ret = m_pBRC->GetParams(&brcParams); MFX_CHECK_UMC_STS (ret); pFrameParams->VBVDelay = 0xffff; if(quant_value >= 8) { pFrameParams->IntraDCprecision = 0; } else if(quant_value >= 4) { pFrameParams->IntraDCprecision = 1; } else { pFrameParams->IntraDCprecision = 2; } *pQuant = (mfxU8)quantiser_scale_code; return MFX_ERR_NONE; } mfxStatus MPEG2BRC_HW::UpdateBRC(const mfxFrameParamMPEG2 *pParams, mfxBitstream* pBitsream, mfxU32 bitsize, mfxU32 numEncodedFrame, bool bNotEnoughBuffer ,mfxI32 &recode) { if (m_bConstantQuant) { return bNotEnoughBuffer ? MFX_ERR_NOT_ENOUGH_BUFFER: MFX_ERR_NONE; } UMC::BRCStatus hrdSts = UMC::BRC_OK; mfxStatus sts = MFX_ERR_NONE; int32_t framestoI = 0; int32_t gopSize = 0; int32_t maxSize = 0, minSize = 0; double buffullness = 0; int32_t buffullnessbyI = 0; UMC::VideoBrcParams brcParams; UMC::FrameType frType = ((pParams->FrameType & MFX_FRAMETYPE_I) ? UMC::I_PICTURE : (pParams->FrameType & MFX_FRAMETYPE_P ? UMC::P_PICTURE : UMC::B_PICTURE)); if (numEncodedFrame >= m_FirstGopSize) { gopSize = m_GopSize; framestoI = gopSize - ((numEncodedFrame - m_FirstGopSize) % gopSize) - 1; } else { gopSize = m_FirstGopSize; framestoI = gopSize - numEncodedFrame - 1; } if (bNotEnoughBuffer) { bitsize = (m_bufferSizeInKB+1)*1000*8; } hrdSts = m_pBRC->PostPackFrame(frType, bitsize, 0, recode); m_pBRC->GetHRDBufferFullness(&buffullness, 0); m_pBRC->GetMinMaxFrameSize(&minSize, &maxSize); m_pBRC->GetParams(&brcParams); if (hrdSts == UMC::BRC_OK) { int32_t inputbitsPerPic = m_InputBitsPerFrame; int32_t minbitsPerPredPic = 0, minbitsPerIPic = 0; recode = 0; if (pParams->FieldPicFlag) { minbitsPerPredPic = m_MinFieldSizeBits[1]; minbitsPerIPic = m_MinFieldSizeBits[0]; inputbitsPerPic >>= 1; framestoI *= 2; if (!pParams->SecondFieldFlag) { framestoI--; } } else { minbitsPerPredPic = m_MinFrameSizeBits[1]; minbitsPerIPic = m_MinFrameSizeBits[0]; } buffullnessbyI = (int32_t)buffullness + framestoI * (inputbitsPerPic - minbitsPerPredPic); if (buffullnessbyI < minbitsPerIPic || (pParams->FieldPicFlag && !pParams->SecondFieldFlag && bitsize*2 > (mfxU32)(inputbitsPerPic + maxSize) )) { if (!m_bLimitedMode) { int32_t quant = m_pBRC->GetQP(frType); int32_t new_quant = ChangeQuant(quant, quant+2); recode = UMC::BRC_RECODE_EXT_QP; if (new_quant == quant ) { m_bLimitedMode = true; recode = UMC::BRC_RECODE_EXT_PANIC; } m_pBRC->SetQP(new_quant, frType); } else { if (!bNotEnoughBuffer) { sts = MFX_ERR_NONE; } else { sts = MFX_ERR_NOT_ENOUGH_BUFFER; } } } } else { if (!(hrdSts & UMC::BRC_NOT_ENOUGH_BUFFER)) { recode = UMC::BRC_RECODE_QP; } else { if (hrdSts & UMC::BRC_ERR_SMALL_FRAME) { maxSize = 0, minSize = 0; uint8_t *p = pBitsream->Data + pBitsream->DataOffset + pBitsream->DataLength; m_pBRC->GetMinMaxFrameSize(&minSize, &maxSize); if (bitsize < (mfxU32)minSize && pBitsream->DataOffset + 1 + pBitsream->DataLength < pBitsream->MaxLength) { mfxU32 nBytes = ((mfxU32)minSize - bitsize + 7)/8; nBytes = (pBitsream->DataOffset + pBitsream->DataLength + nBytes < pBitsream->MaxLength) ? nBytes : pBitsream->MaxLength - (pBitsream->DataOffset + pBitsream->DataLength); memset (p,0,nBytes); pBitsream->DataLength += nBytes; bitsize += (nBytes*8); // p += nBytes; } m_pBRC->PostPackFrame(frType, bitsize, 0, recode); recode = UMC::BRC_RECODE_NONE; } else { if (!m_bLimitedMode) { m_bLimitedMode = true; recode = UMC::BRC_RECODE_EXT_PANIC; } else { sts = MFX_ERR_NOT_ENOUGH_BUFFER; } } } } return sts; } #define isNONLocked(pSurface) (pSurface->Data.Y == 0) mfxStatus FrameStore::GetInternalRefFrame(mfxFrameSurface1** ppFrame) { mfxFrameSurface1* pFrames = m_pRefFramesStore; mfxU32 numFrames = m_nRefFrames; for (mfxU32 i = 0; i < numFrames; i++) { if (!pFrames[i].Data.Locked) { *ppFrame = &pFrames[i]; return MFX_ERR_NONE; } } return MFX_ERR_NOT_FOUND; } mfxStatus FrameStore::GetInternalInputFrame(mfxFrameSurface1** ppFrame) { mfxFrameSurface1* pFrames = m_pInputFramesStore; mfxU32 numFrames = m_nInputFrames; for (mfxU32 i = 0; i < numFrames; i++) { if (!pFrames[i].Data.Locked) { *ppFrame = &pFrames[i]; return MFX_ERR_NONE; } } return MFX_ERR_NOT_FOUND; } mfxStatus FrameStore::ReleaseFrames () { mfxStatus sts = MFX_ERR_NONE; if (m_pRefFrame[0]) { sts = m_pCore->DecreaseReference(*m_pRefFrame[0]); MFX_CHECK_STS (sts); } if (m_pRefFrame[1]) { sts = m_pCore->DecreaseReference(*m_pRefFrame[1]); MFX_CHECK_STS (sts); } if (m_pRawFrame[0]) { sts = m_pCore->DecreaseReference(*m_pRawFrame[0]); MFX_CHECK_STS (sts); } if (m_pRawFrame[1]) { sts = m_pCore->DecreaseReference(*m_pRawFrame[1]); MFX_CHECK_STS (sts); } m_pRefFrame[0] = 0; m_pRefFrame[1] = 0; m_pRawFrame[0] = 0; m_pRawFrame[1] = 0; m_nFrame = 0; m_nRefFrame[0] = 0; m_nRefFrame[1] = 0; m_nLastRefBeforeIntra = -1; m_nLastRef = -1; return sts; } mfxStatus FrameStore::Init(bool bRawFrame, mfxU16 InputFrameType, bool bHW, mfxU32 mTasks, mfxFrameInfo* pFrameInfo, bool bProtected) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FrameStore::Init"); mfxStatus sts = MFX_ERR_NONE; mfxU32 numref = 0; mfxU32 numinput = 0; mfxU16 type=0; m_bUseInternalMem = (InputFrameType & MFX_MEMTYPE_SYSTEM_MEMORY) || (IsD3D9Simulation(*m_pCore) && (InputFrameType & MFX_MEMTYPE_DXVA2_DECODER_TARGET)); m_InputType = InputFrameType; m_bHWFrames = bHW; m_bRawFrame = bRawFrame; ReleaseFrames(); if (m_bUseInternalMem) { numinput += mTasks; if (m_bRawFrame) { numinput += mTasks*2; } } numref += mTasks*3; // reconstructed frames m_RefRequest.NumFrameSuggested = m_RefRequest.NumFrameMin = (mfxU16)numref; m_InputRequest.NumFrameSuggested = m_InputRequest.NumFrameMin = (mfxU16)numinput; type = bHW ? (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME |MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET): (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME |MFX_MEMTYPE_SYSTEM_MEMORY|MFX_MEMTYPE_FROM_ENCODE); MFX_CHECK(!bProtected,MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (m_RefResponse.NumFrameActual>0) { MFX_CHECK(m_RefRequest.Type == type, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_RefRequest.Info.Width >= pFrameInfo->Width && m_RefRequest.Info.Height >= pFrameInfo->Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_RefResponse.NumFrameActual >= m_RefRequest.NumFrameMin, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_nRefFrames = m_RefResponse.NumFrameActual; for (mfxU32 i = 0; i < m_nRefFrames; i++) { m_pRefFramesStore[i].Data.Locked = 0; } } else if (m_RefRequest.NumFrameSuggested) { m_RefRequest.Type = type; m_RefRequest.Info = *pFrameInfo; sts = m_pCore->AllocFrames(&m_RefRequest, &m_RefResponse); MFX_CHECK_STS(sts); if (m_RefResponse.NumFrameActual < m_RefRequest.NumFrameMin) return MFX_ERR_MEMORY_ALLOC; m_nRefFrames = m_RefResponse.NumFrameActual; if (m_pRefFramesStore) return MFX_ERR_MEMORY_ALLOC; m_pRefFramesStore = new mfxFrameSurface1 [m_nRefFrames]; MFX_CHECK_NULL_PTR1(m_pRefFramesStore); memset (m_pRefFramesStore, 0, sizeof(mfxFrameSurface1)*m_nRefFrames); for (mfxU32 i=0; i < m_nRefFrames; i++) { m_pRefFramesStore[i].Data.MemId = m_RefResponse.mids[i]; m_pRefFramesStore[i].Info = m_RefRequest.Info; m_pRefFramesStore[i].Data.reserved[0] = 0x01; } } type = bHW ? (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME |MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_FROM_ENCODE): (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME |MFX_MEMTYPE_SYSTEM_MEMORY|MFX_MEMTYPE_FROM_ENCODE); if (m_InputResponse.NumFrameActual>0) { MFX_CHECK(m_InputRequest.Type == type, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_InputRequest.Info.Width >= pFrameInfo->Width && m_InputRequest.Info.Height >= pFrameInfo->Height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(m_InputResponse.NumFrameActual >= m_InputRequest.NumFrameMin, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_nInputFrames = m_InputResponse.NumFrameActual; for (mfxU32 i = 0; i < m_nInputFrames; i++) { m_pInputFramesStore[i].Data.Locked = 0; } } else if (m_InputRequest.NumFrameSuggested) { m_InputRequest.Type = type; m_InputRequest.Info = *pFrameInfo; sts = m_pCore->AllocFrames(&m_InputRequest, &m_InputResponse); MFX_CHECK_STS(sts); if (m_InputResponse.NumFrameActual < m_InputRequest.NumFrameMin) return MFX_ERR_MEMORY_ALLOC; m_nInputFrames = m_InputResponse.NumFrameActual; if (m_pInputFramesStore) return MFX_ERR_MEMORY_ALLOC; m_pInputFramesStore = new mfxFrameSurface1 [m_nInputFrames]; MFX_CHECK_NULL_PTR1(m_pInputFramesStore); memset (m_pInputFramesStore, 0, sizeof(mfxFrameSurface1)*m_nInputFrames); for (mfxU32 i=0; i < m_nInputFrames; i++) { m_pInputFramesStore[i].Data.MemId = m_InputResponse.mids[i]; m_pInputFramesStore[i].Info = m_InputRequest.Info; m_pInputFramesStore[i].Data.reserved[0] = 0x01; } } return MFX_ERR_NONE; } mfxStatus FrameStore::NextFrame(mfxFrameSurface1 *pInputFrame, mfxU32 nFrame, mfxU16 frameType, mfxU32 intFlags, FramesSet *pFrames) { mfxStatus sts = MFX_ERR_NONE; mfxU16 localFrameType = m_bHWFrames ? (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME|MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_FROM_ENCODE) : (mfxU16)(MFX_MEMTYPE_INTERNAL_FRAME|MFX_MEMTYPE_SYSTEM_MEMORY|MFX_MEMTYPE_FROM_ENCODE); bool bReference = !!(frameType & (MFX_FRAMETYPE_I|MFX_FRAMETYPE_P)); bool bIntra = !!(frameType & MFX_FRAMETYPE_I); m_nFrame = nFrame; if (bIntra) { m_nLastRefBeforeIntra = m_nLastRef; } if (bReference) { m_nLastRef = nFrame; } if (!m_bUseInternalMem) { pFrames->m_pInputFrame = pInputFrame; } else { mfxFrameSurface1* pTmpFrame = 0; sts = GetInternalInputFrame(&pTmpFrame); MFX_CHECK_STS(sts); sts = m_pCore->DoFastCopyWrapper(pTmpFrame, localFrameType, pInputFrame, m_InputType); MFX_CHECK_STS(sts); pTmpFrame->Data.TimeStamp = pInputFrame->Data.TimeStamp; pFrames->m_pInputFrame = pTmpFrame; } sts = m_pCore->IncreaseReference(*pFrames->m_pInputFrame); MFX_CHECK_STS(sts); // prepare reconstructed { mfxFrameSurface1* pTmpFrame = 0; sts = GetInternalRefFrame(&pTmpFrame); MFX_CHECK_STS(sts); pFrames->m_pRecFrame = pTmpFrame; sts = m_pCore->IncreaseReference(*pFrames->m_pRecFrame); MFX_CHECK_STS(sts); } if (bReference) { m_nRefFrame[0] = m_nRefFrame[1]; m_nRefFrame[1] = nFrame; // prepare reference if (m_pRefFrame[0]) { sts = m_pCore->DecreaseReference(*m_pRefFrame[0]); MFX_CHECK_STS(sts); } m_pRefFrame[0] = m_pRefFrame[1]; m_pRefFrame[1] = pFrames->m_pRecFrame; sts = m_pCore->IncreaseReference(*m_pRefFrame[1]); MFX_CHECK_STS(sts); if (m_bRawFrame) { if (m_pRawFrame[0]) { sts = m_pCore->DecreaseReference(*m_pRawFrame[0]); MFX_CHECK_STS(sts); } m_pRawFrame[0] = m_pRawFrame[1]; m_pRawFrame[1] = pFrames->m_pInputFrame; sts = m_pCore->IncreaseReference(*m_pRawFrame[1]); MFX_CHECK_STS(sts); } } // Set Reference frames pFrames->m_pRefFrame[0] = m_pRefFrame[0]; pFrames->m_pRefFrame[1] = m_pRefFrame[1]; pFrames->m_pRawFrame[0] = m_pRawFrame[0]; pFrames->m_pRawFrame[1] = m_pRawFrame[1]; pFrames->m_nFrame = m_nFrame; pFrames->m_nLastRefBeforeIntra = m_nLastRefBeforeIntra; pFrames->m_nLastRef = m_nLastRef; pFrames->m_nRefFrame[0] = m_nRefFrame [0]; pFrames->m_nRefFrame[1] = m_nRefFrame [1]; if ((0 != (frameType & MFX_FRAMETYPE_B)) && (0 != (intFlags & MFX_IFLAG_BWD_ONLY))) { pFrames->m_pRefFrame[0] = 0; pFrames->m_nRefFrame[0] = 0; } if ((0 != (frameType & MFX_FRAMETYPE_B)) && (0 != (intFlags & MFX_IFLAG_FWD_ONLY))) { pFrames->m_pRefFrame[1] = 0; pFrames->m_nRefFrame[1] = 0; } sts = pFrames->LockRefFrames(m_pCore); MFX_CHECK_STS(sts); return sts; } mfxStatus FrameStore::Close() { mfxStatus sts = MFX_ERR_NONE; sts = ReleaseFrames(); MFX_CHECK_STS(sts); if (m_RefResponse.NumFrameActual) { sts = m_pCore->FreeFrames(&m_RefResponse); m_RefResponse.NumFrameActual = 0; } if (m_nRefFrames) { delete [] m_pRefFramesStore; m_nRefFrames = 0; m_pRefFramesStore = 0; } if (m_InputResponse.NumFrameActual) { sts = m_pCore->FreeFrames(&m_InputResponse); m_InputResponse.NumFrameActual = 0; } if (m_nInputFrames) { delete [] m_pInputFramesStore; m_nInputFrames = 0; m_pInputFramesStore = 0; } m_InputType = 0; memset(&m_RefRequest, 0, sizeof(mfxFrameAllocRequest)); memset(&m_RefResponse, 0, sizeof(mfxFrameAllocResponse)); memset(&m_InputRequest, 0, sizeof(mfxFrameAllocRequest)); memset(&m_InputResponse, 0, sizeof(mfxFrameAllocResponse)); return sts; } } #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/ext/mpeg2/src/mfx_mpeg2_encode_vaapi.cpp000066400000000000000000002052641443134507600320540ustar00rootroot00000000000000// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include #include #include "libmfx_core_vaapi.h" #include "mfx_common_int.h" #include "mfx_mpeg2_encode_vaapi.h" #include "vaapi_ext_interface.h" #include #include "fast_copy.h" #ifndef D3DDDIFMT_NV12 #define D3DDDIFMT_NV12 (D3DDDIFORMAT)(MFX_MAKEFOURCC('N', 'V', '1', '2')) #endif #define CODEC_MPEG2_ENC_FCODE_X(width) ((width < 200) ? 3 : (width < 500) ? 4 : (width < 1400) ? 5 : 6) #define CODEC_MPEG2_ENC_FCODE_Y(fcodeX) ((fcodeX > 5) ? 5 : fcodeX) namespace { uint32_t ConvertRateControlMFX2VAAPI(mfxU8 rateControl) { switch (rateControl) { case MFX_RATECONTROL_CBR: return VA_RC_CBR; case MFX_RATECONTROL_VBR: return VA_RC_VBR; case MFX_RATECONTROL_AVBR: return VA_RC_VBR; case MFX_RATECONTROL_CQP: return VA_RC_CQP; default: assert(!"Unsupported RateControl"); return 0; } } VAProfile ConvertProfileTypeMFX2VAAPI(mfxU8 type) { switch (type) { case MFX_PROFILE_MPEG2_SIMPLE: return VAProfileMPEG2Simple; case MFX_PROFILE_MPEG2_MAIN: return VAProfileMPEG2Main; case MFX_PROFILE_MPEG2_HIGH: /*assert(!"Unsupported profile type"); */ return VAProfileMPEG2Main; default: assert(!"Unsupported profile type"); return VAProfileNone; } } // VAProfile ConvertProfileTypeMFX2VAAPI(mfxU8 type) VAEncPictureType ConvertCodingTypeMFX2VAAPI(UCHAR codingType) { switch (codingType) { case CODING_TYPE_I: return VAEncPictureTypeIntra; case CODING_TYPE_P: return VAEncPictureTypePredictive; case CODING_TYPE_B: return VAEncPictureTypeBidirectional; default: assert(!"Unsupported picture coding type"); return (VAEncPictureType)-1; } } // VAEncPictureType ConvertCodingTypeMFX2VAAPI(UCHAR codingType) VASurfaceID ConvertSurfaceIdMFX2VAAPI(VideoCORE* core, mfxMemId id) { mfxStatus sts; VASurfaceID *pSurface = NULL; MFX_CHECK_WITH_ASSERT(core, VA_INVALID_SURFACE); sts = core->GetFrameHDL(id, (mfxHDL *)&pSurface); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == sts, VA_INVALID_SURFACE); return *pSurface; } VASurfaceID ConvertSurfaceIdMFX2VAAPIwNULL(VideoCORE* core, mfxMemId id) { mfxStatus sts; VASurfaceID *pSurface = NULL; MFX_CHECK_WITH_ASSERT(core, VA_INVALID_SURFACE); if (id != 0) { sts = core->GetFrameHDL(id, (mfxHDL *)&pSurface); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == sts, VA_INVALID_SURFACE); } else { return VA_INVALID_SURFACE; } return *pSurface; } /*int mpeg2enc_time_code(VAEncSequenceParameterBufferMPEG2 *seq_param, int num_frames) { int fps = (int)(seq_param->frame_rate + 0.5); int time_code = 0; int time_code_pictures, time_code_seconds, time_code_minutes, time_code_hours; int drop_frame_flag = 0; assert(fps <= 60); time_code_seconds = num_frames / fps; time_code_pictures = num_frames % fps; time_code |= time_code_pictures; time_code_minutes = time_code_seconds / 60; time_code_seconds = time_code_seconds % 60; time_code |= (time_code_seconds << 6); time_code_hours = time_code_minutes / 60; time_code_minutes = time_code_minutes % 60; time_code |= (1 << 12); // marker_bit time_code |= (time_code_minutes << 13); time_code_hours = time_code_hours % 24; time_code |= (time_code_hours << 19); time_code |= (drop_frame_flag << 24); return time_code; }*/ void FillSps( MfxHwMpeg2Encode::ExecuteBuffers* pExecuteBuffers, VAEncSequenceParameterBufferMPEG2 & sps) { assert(pExecuteBuffers); const ENCODE_SET_SEQUENCE_PARAMETERS_MPEG2 & winSps = pExecuteBuffers->m_sps; const ENCODE_SET_PICTURE_PARAMETERS_MPEG2 & winPps = pExecuteBuffers->m_pps; sps.picture_width = winSps.FrameWidth; sps.picture_height = winSps.FrameHeight; if (winSps.FrameRateCode > 0 && winSps.FrameRateCode <= 8) { const Ipp64f ratetab[8]= {24000.0/1001.0, 24.0, 25.0, 30000.0/1001.0, 30.0, 50.0, 60000.0/1001.0, 60.0}; sps.frame_rate = ratetab[winSps.FrameRateCode - 1] * (winSps.FrameRateExtN + 1) / (winSps.FrameRateExtD + 1); } else assert(!"Unknown FrameRateCode appeared."); sps.aspect_ratio_information = winSps.AspectRatio; // sps.vbv_buffer_size = winSps.vbv_buffer_size; // B = 16 * 1024 * vbv_buffer_size sps.intra_period = pExecuteBuffers->m_GOPPictureSize; sps.ip_period = pExecuteBuffers->m_GOPRefDist; // For VBR maxBitrate should be used as sps parameter, target bitrate has no place in sps, only in BRC sps.bits_per_second = (winSps.RateControlMethod == MFX_RATECONTROL_VBR && winSps.MaxBitRate > winSps.bit_rate) ? winSps.MaxBitRate : winSps.bit_rate; if (winSps.vbv_buffer_size) { sps.vbv_buffer_size = winSps.vbv_buffer_size; } else { sps.vbv_buffer_size = winSps.bit_rate * 45 / 1000; } //sps.vbv_buffer_size = 3; // B = 16 * 1024 * vbv_buffer_size int profile = 4, level = 8; switch (ConvertProfileTypeMFX2VAAPI(winSps.Profile)) { case VAProfileMPEG2Simple: profile = 5; break; case VAProfileMPEG2Main: profile = 4; break; default: assert(0); break; } switch (winSps.Level) { case MFX_LEVEL_MPEG2_LOW: level = 10; break; case MFX_LEVEL_MPEG2_MAIN: level = 8; break; case MFX_LEVEL_MPEG2_HIGH1440: level = 6; break; case MFX_LEVEL_MPEG2_HIGH: level = 4; break; default: assert(0); break; } sps.sequence_extension.bits.profile_and_level_indication = profile << 4 | level; sps.sequence_extension.bits.chroma_format = 1; // CHROMA_FORMAT_420; // 4:2:0 sps.sequence_extension.bits.frame_rate_extension_n = winSps.FrameRateExtN; sps.sequence_extension.bits.frame_rate_extension_d = winSps.FrameRateExtD; sps.sequence_extension.bits.progressive_sequence = winSps.progressive_sequence; sps.sequence_extension.bits.low_delay = winSps.low_delay; sps.new_gop_header = winPps.bNewGop; sps.gop_header.bits.time_code = (1 << 12); // bit12: marker_bit if (sps.new_gop_header) { sps.gop_header.bits.time_code = winPps.time_code; } sps.gop_header.bits.closed_gop = (winPps.GopOptFlag & MFX_GOP_CLOSED) ? 1 : 0; if (winPps.picture_coding_type == CODING_TYPE_I) { sps.gop_header.bits.broken_link = (winPps.GopOptFlag & MFX_GOP_CLOSED) || (winPps.GopRefDist == 1); } } // void FillSps(...) void FillPps( VideoCORE * core, MfxHwMpeg2Encode::ExecuteBuffers* pExecuteBuffers, VAEncPictureParameterBufferMPEG2 & pps, mfxU8 *pUserData, mfxU32 userDataLen) { assert(pExecuteBuffers); const ENCODE_SET_PICTURE_PARAMETERS_MPEG2 & winPps = pExecuteBuffers->m_pps; pps.picture_type = ConvertCodingTypeMFX2VAAPI(winPps.picture_coding_type); pps.temporal_reference = winPps.temporal_reference; pps.vbv_delay = winPps.vbv_delay; pps.reconstructed_picture = ConvertSurfaceIdMFX2VAAPI(core, pExecuteBuffers->m_RecFrameMemID); pps.coded_buf = VA_INVALID_ID; pps.f_code[0][0] = winPps.f_code00; pps.f_code[0][1] = winPps.f_code01; pps.f_code[1][0] = winPps.f_code10; pps.f_code[1][1] = winPps.f_code11; // pps.user_data_length = 0; pps.picture_coding_extension.bits.intra_dc_precision = winPps.intra_dc_precision; /* 8bits */ pps.picture_coding_extension.bits.picture_structure = 3; /* frame picture */ pps.picture_coding_extension.bits.top_field_first = winPps.InterleavedFieldBFF == 0 ? 1 : 0; pps.picture_coding_extension.bits.frame_pred_frame_dct = winPps.frame_pred_frame_dct; pps.picture_coding_extension.bits.concealment_motion_vectors = winPps.concealment_motion_vectors; pps.picture_coding_extension.bits.q_scale_type = winPps.q_scale_type; pps.picture_coding_extension.bits.intra_vlc_format = winPps.intra_vlc_format; pps.picture_coding_extension.bits.alternate_scan = winPps.alternate_scan; pps.picture_coding_extension.bits.repeat_first_field = winPps.repeat_first_field; pps.picture_coding_extension.bits.progressive_frame = (winPps.FieldCodingFlag == 0) && (winPps.FieldFrameCodingFlag == 0) ? 1 : 0; pps.picture_coding_extension.bits.composite_display_flag = winPps.composite_display_flag; pps.composite_display.bits.v_axis = winPps.v_axis; pps.composite_display.bits.field_sequence = winPps.field_sequence; pps.composite_display.bits.sub_carrier = winPps.sub_carrier; pps.composite_display.bits.burst_amplitude = winPps.burst_amplitude; pps.composite_display.bits.sub_carrier_phase = winPps.sub_carrier_phase; pps.last_picture = winPps.bLastPicInStream; if (pps.picture_type == VAEncPictureTypeIntra) { pps.forward_reference_picture = VA_INVALID_SURFACE; pps.backward_reference_picture = VA_INVALID_SURFACE; } else if (pps.picture_type == VAEncPictureTypePredictive) { pps.forward_reference_picture = ConvertSurfaceIdMFX2VAAPI(core, pExecuteBuffers->m_RefFrameMemID[0]); pps.backward_reference_picture = VA_INVALID_SURFACE; } else if (pps.picture_type == VAEncPictureTypeBidirectional) { pps.forward_reference_picture = ConvertSurfaceIdMFX2VAAPIwNULL(core, pExecuteBuffers->m_RefFrameMemID[0]); pps.backward_reference_picture = ConvertSurfaceIdMFX2VAAPIwNULL(core, pExecuteBuffers->m_RefFrameMemID[1]); } else { assert(0); } // if (pUserData && userDataLen > 4) // { // mfxU32 len = std:min(userDataLen - 4, sizeof(pps.user_data)/sizeof(pps.user_data[0])); // std::copy(pUserData + 4, pUserData + 4 + len, pps.user_data); // pps.user_data_length = len; // } } // void FillPps(...) template inline void Zero(T & obj) { memset(&obj, 0, sizeof(obj)); } template inline void Zero(std::vector & vec) { memset(&vec[0], 0, sizeof(T) * vec.size()); } template inline void Zero(T * first, size_t cnt) { memset(first, 0, sizeof(T) * cnt); } } // anonymous namespace using namespace MfxHwMpeg2Encode; VAAPIEncoder::VAAPIEncoder(VideoCORE* core) : m_core(core) , m_vaDisplay(0) , m_vaContextEncode(VA_INVALID_ID) , m_vaConfig(VA_INVALID_ID) , m_vaSpsBuf() , m_spsBufferId(VA_INVALID_ID) , m_vaPpsBuf() , m_ppsBufferId(VA_INVALID_ID) , m_qmBufferId(VA_INVALID_ID) , m_numSliceGroups(0) , m_codedbufISize(0) , m_codedbufPBSize(0) , m_pMiscParamsFps(0) , m_pMiscParamsBrc(0) , m_pMiscParamsQuality(0) , m_pMiscParamsSeqInfo(0) , m_pMiscParamsSkipFrame(0) , m_miscParamFpsId(VA_INVALID_ID) , m_miscParamBrcId(VA_INVALID_ID) , m_miscParamQualityId(VA_INVALID_ID) , m_miscParamSeqInfoId(VA_INVALID_ID) , m_miscParamSkipFrameId(VA_INVALID_ID) , m_packedUserDataParamsId(VA_INVALID_ID) , m_packedUserDataId(VA_INVALID_ID) , m_mbqpBufferId(VA_INVALID_ID) , m_miscQualityParamId(VA_INVALID_ID) #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) , m_triggerGpuHangBufferId(VA_INVALID_ID) #endif , m_initFrameWidth(0) , m_initFrameHeight(0) , m_layout() , m_caps() { std::fill_n(m_sliceParamBufferId, sizeof(m_sliceParamBufferId)/sizeof(m_sliceParamBufferId[0]), VA_INVALID_ID); Zero(m_allocResponseMB); Zero(m_allocResponseBS); } VAAPIEncoder::~VAAPIEncoder() { Close(); } inline bool CheckAttribValue(mfxU32 value) { return (value != VA_ATTRIB_NOT_SUPPORTED) && (value != 0); } mfxStatus VAAPIEncoder::CreateAuxilliaryDevice(mfxU16 codecProfile) { MFX_CHECK_NULL_PTR1(m_core); VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(m_core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_WITH_ASSERT(vaapi_core_vpl, MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(vaapi_core_vpl->GetVAService(&m_vaDisplay)); m_caps = {}; m_caps.EncodeFunc = 1; m_caps.BRCReset = 1; // No bitrate resolution control m_caps.VCMBitrateControl = 0; // Video conference mode m_caps.HeaderInsertion = 0; // We will provide headers (SPS, PPS) in binary format to the driver m_caps.MbQpDataSupport = 1; m_caps.SkipFrame = 1; m_caps.SliceIPBOnly = 1; m_caps.MaxNum_Reference = 1; m_caps.MaxPicWidth = 1920; m_caps.MaxPicHeight = 1088; m_caps.NoInterlacedField = 0; // Enable interlaced encoding m_caps.SliceStructure = 1; // 1 - SliceDividerSnb; 2 - SliceDividerHsw; 3 - SliceDividerBluRay; the other - SliceDividerOneSlice std::map idx_map; VAConfigAttribType attr_types[] = { VAConfigAttribMaxPictureHeight, VAConfigAttribMaxPictureWidth, VAConfigAttribEncSkipFrame, VAConfigAttribEncMaxRefFrames, VAConfigAttribEncSliceStructure }; std::vector attrs; attrs.reserve(sizeof(attr_types) / sizeof(attr_types[0])); for (size_t i=0; i < sizeof(attr_types)/sizeof(attr_types[0]); ++i) { attrs.emplace_back(VAConfigAttrib{attr_types[i], 0}); idx_map[ attr_types[i] ] = i; } VAEntrypoint entrypoint = VAEntrypointEncSlice; VAStatus vaSts = vaGetConfigAttributes(m_vaDisplay, ConvertProfileTypeMFX2VAAPI(codecProfile), entrypoint, attrs.data(), attrs.size()); MFX_CHECK(!(VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT == vaSts || VA_STATUS_ERROR_UNSUPPORTED_PROFILE == vaSts), MFX_ERR_UNSUPPORTED); if (CheckAttribValue(attrs[idx_map[VAConfigAttribMaxPictureWidth]].value)) m_caps.MaxPicWidth = attrs[idx_map[VAConfigAttribMaxPictureWidth]].value; if (CheckAttribValue(attrs[idx_map[VAConfigAttribMaxPictureHeight]].value)) m_caps.MaxPicHeight = attrs[idx_map[VAConfigAttribMaxPictureHeight]].value; if (CheckAttribValue(attrs[idx_map[VAConfigAttribEncSkipFrame]].value)) m_caps.SkipFrame = attrs[idx_map[VAConfigAttribEncSkipFrame]].value; if (CheckAttribValue(attrs[idx_map[VAConfigAttribEncMaxRefFrames]].value)) m_caps.MaxNum_Reference = attrs[idx_map[VAConfigAttribEncMaxRefFrames]].value; if (CheckAttribValue(attrs[idx_map[VAConfigAttribEncSliceStructure]].value)) m_caps.SliceStructure = attrs[idx_map[VAConfigAttribEncSliceStructure]].value; return MFX_ERR_NONE; } void VAAPIEncoder::QueryEncodeCaps(ENCODE_CAPS & caps) { caps = m_caps; } mfxStatus VAAPIEncoder::Init(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Init"); mfxStatus sts = MFX_ERR_UNSUPPORTED; assert(ENCODE_ENC_PAK_ID == funcId); Zero(m_vaSpsBuf); Zero(m_vaPpsBuf); Zero(m_sliceParam, MAX_SLICES); std::fill(m_sliceParamBufferId, m_sliceParamBufferId + MAX_SLICES, VA_INVALID_ID); Zero(m_allocResponseMB); Zero(m_allocResponseBS); m_pMiscParamsFps = (VAEncMiscParameterBuffer*)new mfxU8[sizeof(VAEncMiscParameterFrameRate) + sizeof(VAEncMiscParameterBuffer)]; Zero((VAEncMiscParameterFrameRate &)m_pMiscParamsFps->data); m_pMiscParamsFps->type = VAEncMiscParameterTypeFrameRate; m_pMiscParamsBrc = (VAEncMiscParameterBuffer*)new mfxU8[sizeof(VAEncMiscParameterRateControl) + sizeof(VAEncMiscParameterBuffer)]; Zero((VAEncMiscParameterRateControl &)m_pMiscParamsBrc->data); m_pMiscParamsBrc->type = VAEncMiscParameterTypeRateControl; m_pMiscParamsQuality = (VAEncMiscParameterBuffer*)new mfxU8[sizeof(VAEncMiscParameterEncQuality) + sizeof(VAEncMiscParameterBuffer)]; Zero((VAEncMiscParameterEncQuality &)m_pMiscParamsQuality->data); m_pMiscParamsQuality->type = (VAEncMiscParameterType)VAEncMiscParameterTypeEncQuality; m_pMiscParamsSeqInfo = (VAEncMiscParameterBuffer*)new mfxU8[sizeof(VAEncMiscParameterExtensionDataSeqDisplayMPEG2) + sizeof(VAEncMiscParameterBuffer)]; Zero((mfxI8*)&m_pMiscParamsSeqInfo->data, sizeof(VAEncMiscParameterExtensionDataSeqDisplayMPEG2)); m_pMiscParamsSeqInfo->type = (VAEncMiscParameterType)VAEncMiscParameterTypeExtensionData; m_pMiscParamsSkipFrame = (VAEncMiscParameterBuffer*)new mfxU8[sizeof(VAEncMiscParameterSkipFrame) + sizeof(VAEncMiscParameterBuffer)]; Zero((VAEncMiscParameterSkipFrame &)m_pMiscParamsSkipFrame->data); m_pMiscParamsSkipFrame->type = (VAEncMiscParameterType)VAEncMiscParameterTypeSkipFrame; sts = Init(ENCODE_ENC_PAK, pExecuteBuffers); MFX_CHECK_STS(sts); sts = GetBuffersInfo(); MFX_CHECK_STS(sts); return sts; } // mfxStatus VAAPIEncoder::Init(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) mfxStatus VAAPIEncoder::Init(ENCODE_FUNC func, ExecuteBuffers* pExecuteBuffers) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Init"); MFX_CHECK_NULL_PTR1(pExecuteBuffers); m_initFrameWidth = mfx::align2_value(pExecuteBuffers->m_sps.FrameWidth, 16); m_initFrameHeight = mfx::align2_value(pExecuteBuffers->m_sps.FrameHeight, pExecuteBuffers->m_sps.progressive_sequence ? 16 : 32); //memset (&m_rawFrames, 0, sizeof(mfxRawFrames)); ExtVASurface cleanSurf = {VA_INVALID_ID, 0, 0}; std::fill(m_feedback.begin(), m_feedback.end(), cleanSurf); VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(m_core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_WITH_ASSERT(vaapi_core_vpl, MFX_ERR_DEVICE_FAILED); MFX_SAFE_CALL(vaapi_core_vpl->GetVAService(&m_vaDisplay)); VAStatus vaSts; VAProfile mpegProfile = ConvertProfileTypeMFX2VAAPI(pExecuteBuffers->m_sps.Profile); // should be moved to core->IsGuidSupported() { mfxI32 entrypointsCount = 0, entrypointsIndx = 0; mfxI32 maxNumEntrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(maxNumEntrypoints, MFX_ERR_DEVICE_FAILED); std::unique_ptr pEntrypoints(new VAEntrypoint[maxNumEntrypoints]); vaSts = vaQueryConfigEntrypoints( m_vaDisplay, mpegProfile, pEntrypoints.get(), &entrypointsCount); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); bool bEncodeEnable = false; for( entrypointsIndx = 0; entrypointsIndx < entrypointsCount; entrypointsIndx++ ) { if( VAEntrypointEncSlice == pEntrypoints[entrypointsIndx] ) { bEncodeEnable = true; break; } } if( !bEncodeEnable ) { return MFX_ERR_DEVICE_FAILED;// unsupport? } } // IsGuidSupported() // Configuration VAConfigAttrib attrib[3]; attrib[0].type = VAConfigAttribRTFormat; attrib[1].type = VAConfigAttribRateControl; //attrib[2].type = VAConfigAttribEncSkipFrame; vaGetConfigAttributes(m_vaDisplay, ConvertProfileTypeMFX2VAAPI(pExecuteBuffers->m_sps.Profile), VAEntrypointEncSlice, &attrib[0], 2); if ((attrib[0].value & VA_RT_FORMAT_YUV420) == 0) return MFX_ERR_DEVICE_FAILED; //m_caps.SkipFrame = (attrib[2].value & (~VA_ATTRIB_NOT_SUPPORTED)) ? 1 : 0 ; uint32_t vaRCType = ConvertRateControlMFX2VAAPI(pExecuteBuffers->m_sps.RateControlMethod); if ((attrib[1].value & vaRCType) == 0) return MFX_ERR_DEVICE_FAILED; attrib[0].value = VA_RT_FORMAT_YUV420; attrib[1].value = vaRCType; vaSts = vaCreateConfig( m_vaDisplay, mpegProfile, VAEntrypointEncSlice, attrib, 2, &m_vaConfig); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; #ifdef MPEG2_ENC_HW_PERF #endif } // mfxStatus VAAPIEncoder::Init(ENCODE_FUNC func,ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::CreateContext(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::CreateContex"); assert (m_vaContextEncode == VA_INVALID_ID); mfxStatus sts; VAStatus vaSts; std::vector reconSurf; //for(size_t i = 0; i < 4; i++) // reconSurf.push_back((VASurfaceID)i); for(size_t i = 0; i < m_recFrames.size(); i++) reconSurf.push_back(m_recFrames[i].surface); // Encoder create { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateContext"); vaSts = vaCreateContext( m_vaDisplay, m_vaConfig, m_initFrameWidth, m_initFrameHeight, VA_PROGRESSIVE, &*reconSurf.begin(), reconSurf.size(), &m_vaContextEncode); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); sts = CreateBSBuffer(numRefFrames, pExecuteBuffers); MFX_CHECK_STS(sts); if (pExecuteBuffers->m_mbqp_data) { m_mbqpDataBuffer.resize(mfx::align2_value(m_initFrameWidth / 16, 64) * mfx::align2_value(m_initFrameHeight / 16, 8)); // if (IsOn(extOpt3->MBDisableSkipMap)) // m_mb_noskip_buffer.resize(mfx::align2_value(m_width / 16, 64) * mfx::align2_value(m_height / 16, 8) } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateContext(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames, mfxU32 funcId) mfxStatus VAAPIEncoder::GetBuffersInfo() { return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::GetBuffersInfo() mfxStatus VAAPIEncoder::QueryMbDataLayout() { // HRESULT hr = 0; memset(&m_layout, 0, sizeof(m_layout)); /* hr = m_pDevice->Execute(MBDATA_LAYOUT_ID, 0, 0,&m_layout,sizeof(m_layout)); MFX_CHECK(SUCCEEDED(hr), MFX_ERR_DEVICE_FAILED); */ return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryMbDataLayout() mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest* pRequest, ExecuteBuffers* pExecuteBuffers) { if (type == D3DDDIFMT_INTELENCODE_MBDATA) { pRequest->Info.Width = std::max(pRequest->Info.Width, pExecuteBuffers->m_sps.FrameWidth); pRequest->Info.Height = std::max(pRequest->Info.Height, pExecuteBuffers->m_sps.FrameHeight); } else if (type == D3DDDIFMT_INTELENCODE_BITSTREAMDATA) { pRequest->Info.Width = std::max(pRequest->Info.Width, pExecuteBuffers->m_sps.FrameWidth); pRequest->Info.Height = std::max(pRequest->Info.Height, pExecuteBuffers->m_sps.FrameHeight); } else { assert(!"unknown buffer type"); } if(MFX_RATECONTROL_CQP == pExecuteBuffers->m_sps.RateControlMethod) { m_codedbufISize = pExecuteBuffers->m_sps.FrameWidth*pExecuteBuffers->m_sps.FrameHeight*4; m_codedbufPBSize = pExecuteBuffers->m_sps.FrameWidth*pExecuteBuffers->m_sps.FrameHeight*4; } else { const mfxU32 rawFrameSize = pExecuteBuffers->m_sps.FrameWidth*pExecuteBuffers->m_sps.FrameHeight*3/2; const mfxU32 vbvSize = pExecuteBuffers->m_sps.vbv_buffer_size * 1000; if(vbvSize > rawFrameSize) m_codedbufISize = m_codedbufPBSize = vbvSize; else m_codedbufISize = m_codedbufPBSize = rawFrameSize; } pRequest->Info.Width = m_codedbufISize / pRequest->Info.Height / 3 * 2; // request linear buffer pRequest->Info.FourCC = MFX_FOURCC_P8; // context_id required for allocation video memory (tmp solution) pRequest->AllocId = m_vaContextEncode; return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::QueryCompBufferInfo(D3DDDIFORMAT type, mfxFrameAllocRequest* pRequest, ExecuteBuffers * pExecuteBuffers) mfxStatus VAAPIEncoder::Register( const mfxFrameAllocResponse* pResponse, D3DDDIFORMAT type) { std::vector * pQueue = (D3DDDIFMT_INTELENCODE_BITSTREAMDATA == type) ? &m_bsQueue : &m_reconQueue; mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(pResponse->mids, MFX_ERR_NULL_PTR); for (int i = 0; i < pResponse->NumFrameActual; i++) { ExtVASurface extSurf = {}; VASurfaceID *pSurface = 0; sts = m_core->GetFrameHDL(pResponse->mids[i], (mfxHDL *)&pSurface); MFX_CHECK_STS(sts); extSurf.number = i; extSurf.surface = *pSurface; pQueue->push_back( extSurf ); } //hr = m_pDevice->BeginFrame(SurfaceReg.surface[0], &SurfaceReg); //MFX_CHECK(SUCCEEDED(hr), MFX_ERR_DEVICE_FAILED); //hr = m_pDevice->EndFrame(0); //MFX_CHECK(SUCCEEDED(hr), MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Register(const mfxFrameAllocResponse* pResponse, D3DDDIFORMAT type) mfxStatus VAAPIEncoder::RegisterRefFrames (const mfxFrameAllocResponse* pResponse) { MFX_CHECK(pResponse->mids, MFX_ERR_NULL_PTR); MFX_CHECK(pResponse->NumFrameActual < NUM_FRAMES, MFX_ERR_UNSUPPORTED); m_recFrames.resize(pResponse->NumFrameActual); mfxStatus sts; VASurfaceID *pSurface = NULL; // we should register allocated HW bitstreams and recon surfaces for (int i = 0; i < pResponse->NumFrameActual; i++) { sts = m_core->GetFrameHDL(pResponse->mids[i], (mfxHDL *)&pSurface); MFX_CHECK_STS(sts); m_recFrames[i].surface = *pSurface; m_recFrames[i].number = i; } //return MFX_ERR_NONE; sts = Register(pResponse, D3DDDIFMT_NV12); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::RegisterRefFrames (const mfxFrameAllocResponse* pResponse) mfxI32 VAAPIEncoder::GetRecFrameIndex (mfxMemId memID) { mfxStatus sts; VASurfaceID *pSurface = NULL; sts = m_core->GetFrameHDL(memID, (mfxHDL *)&pSurface); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == sts, -1); for (size_t i = 0; i < m_recFrames.size(); i++) { if (m_recFrames[i].surface == *pSurface) return static_cast(i); } return -1; } // mfxI32 VAAPIEncoder::GetRecFrameIndex (mfxMemId memID) mfxI32 VAAPIEncoder::GetRawFrameIndex (mfxMemId memID, bool bAddFrames) { assert(0); mfxStatus sts; VASurfaceID *pSurface = NULL; sts = m_core->GetFrameHDL(memID, (mfxHDL *)&pSurface); MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == sts, -1); for (size_t i = 0; i < m_recFrames.size(); i++) { if (m_rawFrames[i].surface == *pSurface) return static_cast(i); } if (bAddFrames && m_rawFrames.size() < NUM_FRAMES) { ExtVASurface surf = {*pSurface, 0, 0}; m_rawFrames.push_back(surf); return m_rawFrames.size() - 1; } return -1; } // mfxI32 VAAPIEncoder::GetRawFrameIndex (mfxMemId memID, bool bAddFrames) mfxStatus VAAPIEncoder::CreateCompBuffers(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames) { mfxStatus sts = MFX_ERR_NONE; mfxFrameAllocRequest request = {}; // Buffer for MB INFO sts = QueryCompBufferInfo(D3DDDIFMT_INTELENCODE_MBDATA, &request, pExecuteBuffers); MFX_CHECK_STS(sts); request.NumFrameMin = (request.NumFrameMin < numRefFrames) ? (mfxU16)numRefFrames : request.NumFrameMin; request.NumFrameSuggested = (request.NumFrameSuggested < request.NumFrameMin) ? request.NumFrameMin : request.NumFrameSuggested; if (m_allocResponseMB.NumFrameActual == 0) { request.Info.FourCC = MFX_FOURCC_P8;//D3DFMT_P8; request.Type = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_INTERNAL_FRAME; sts = m_core->AllocFrames(&request, &m_allocResponseMB); MFX_CHECK_STS(sts); } else { if (m_allocResponseMB.NumFrameActual < request.NumFrameMin) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } sts = Register(&m_allocResponseMB, D3DDDIFMT_INTELENCODE_MBDATA); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateCompBuffers(ExecuteBuffers* pExecuteBuffers, mfxU32 numRefFrames) mfxStatus VAAPIEncoder::CreateBSBuffer(mfxU32 numRefFrames, ExecuteBuffers* pExecuteBuffers) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::CreateBSBuffer"); mfxStatus sts = MFX_ERR_NONE; mfxFrameAllocRequest request = {}; // Buffer for MB INFO sts = QueryCompBufferInfo(D3DDDIFMT_INTELENCODE_BITSTREAMDATA, &request, pExecuteBuffers); MFX_CHECK_STS(sts); request.NumFrameMin = (request.NumFrameMin < numRefFrames) ? (mfxU16)numRefFrames : request.NumFrameMin; request.NumFrameSuggested = (request.NumFrameSuggested < request.NumFrameMin) ? request.NumFrameMin : request.NumFrameSuggested; if (m_allocResponseMB.NumFrameActual == 0) { request.Info.FourCC = MFX_FOURCC_P8;//D3DFMT_P8; request.Type = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET|MFX_MEMTYPE_INTERNAL_FRAME; sts = m_core->AllocFrames(&request, &m_allocResponseBS); MFX_CHECK_STS(sts); } else { if (m_allocResponseBS.NumFrameActual < request.NumFrameMin) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } sts = Register(&m_allocResponseBS, D3DDDIFMT_INTELENCODE_BITSTREAMDATA); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::CreateBSBuffer(mfxU32 numRefFrames) mfxStatus VAAPIEncoder::FillSlices(ExecuteBuffers* pExecuteBuffers) { VAEncSliceParameterBufferMPEG2 *sliceParam; VAStatus vaSts; int width_in_mbs, height_in_mbs; // assert(m_vaPpsBuf.picture_coding_extension.bits.q_scale_type == 0); width_in_mbs = (m_vaSpsBuf.picture_width + 15) >> 4; if (m_vaSpsBuf.sequence_extension.bits.progressive_sequence) { height_in_mbs = (m_vaSpsBuf.picture_height + 15) >> 4; } else { height_in_mbs = ((m_vaSpsBuf.picture_height + 31) >> 5) * 2; } m_numSliceGroups = 1; MFX_CHECK_WITH_ASSERT(height_in_mbs == pExecuteBuffers->m_pps.NumSlice, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); mfxStatus sts; for (int i = 0; i < height_in_mbs; i++) { ENCODE_SET_SLICE_HEADER_MPEG2& ddiSlice = pExecuteBuffers->m_pSlice[i]; assert(ddiSlice.NumMbsForSlice == width_in_mbs); sliceParam = &m_sliceParam[i]; sliceParam->macroblock_address = i * width_in_mbs; sliceParam->num_macroblocks = ddiSlice.NumMbsForSlice; sliceParam->is_intra_slice = ddiSlice.IntraSlice; // prevent GPU hang due to different scale_code in different slices sliceParam->quantiser_scale_code = pExecuteBuffers->m_pSlice[0].quantiser_scale_code; sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_sliceParamBufferId[i]); MFX_CHECK_STS(sts); } vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSliceParameterBufferType, sizeof(*sliceParam), height_in_mbs, m_sliceParam, m_sliceParamBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillSlices(ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::FillMiscParameterBuffer(ExecuteBuffers* pExecuteBuffers) { VAEncMiscParameterFrameRate & miscFps = (VAEncMiscParameterFrameRate &)m_pMiscParamsFps->data; VAEncMiscParameterRateControl & miscBrc = (VAEncMiscParameterRateControl &)m_pMiscParamsBrc->data; VAEncMiscParameterEncQuality & miscQuality = (VAEncMiscParameterEncQuality &)m_pMiscParamsQuality->data; VAStatus vaSts; PackMfxFrameRate(pExecuteBuffers->m_FrameRateExtN, pExecuteBuffers->m_FrameRateExtD, miscFps.framerate); miscBrc.bits_per_second = pExecuteBuffers->m_sps.MaxBitRate * 1000; miscBrc.target_percentage = pExecuteBuffers->m_sps.MaxBitRate ? uint32_t(pExecuteBuffers->m_sps.bit_rate * 100. / pExecuteBuffers->m_sps.MaxBitRate) : 0; miscQuality.PanicModeDisable = pExecuteBuffers->m_bDisablePanicMode ? 1 : 0; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamFpsId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterFrameRate) + sizeof(VAEncMiscParameterBuffer), 1, m_pMiscParamsFps, &m_miscParamFpsId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamBrcId); MFX_CHECK_STS(sts); if (pExecuteBuffers->m_sps.RateControlMethod == MFX_RATECONTROL_VBR) { vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterRateControl) + sizeof(VAEncMiscParameterBuffer), 1, m_pMiscParamsBrc, &m_miscParamBrcId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamQualityId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterEncQuality) + sizeof(VAEncMiscParameterBuffer), 1, m_pMiscParamsQuality, &m_miscParamQualityId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillMiscParameterBuffer(ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::FillQualityLevelBuffer(ExecuteBuffers* pExecuteBuffers) { VAStatus vaSts; VAEncMiscParameterBuffer *misc_param; VAEncMiscParameterBufferQualityLevel *quality_param; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscQualityParamId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterBufferQualityLevel), 1, NULL, &m_miscQualityParamId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, m_miscQualityParamId, (void **)&misc_param); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); misc_param->type = (VAEncMiscParameterType)VAEncMiscParameterTypeQualityLevel; quality_param = (VAEncMiscParameterBufferQualityLevel *)misc_param->data; unsigned int tu = pExecuteBuffers->m_sps.TargetUsage; if (tu == 0) tu = 3; quality_param->quality_level = tu; vaSts = vaUnmapBuffer(m_vaDisplay, m_miscQualityParamId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillQualityLevelBuffer(ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::FillUserDataBuffer(mfxU8 *pUserData, mfxU32 userDataLen) { VAStatus vaSts; VAEncPackedHeaderParameterBuffer packedParamsBuffer = {}; packedParamsBuffer.type = VAEncPackedHeaderRawData; packedParamsBuffer.has_emulation_bytes = false; mfxU32 correctedLength = std::min(userDataLen, UINT_MAX/8); // keep start code packedParamsBuffer.bit_length = correctedLength * 8; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedUserDataParamsId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderParameterBufferType, sizeof(packedParamsBuffer), 1, &packedParamsBuffer, &m_packedUserDataParamsId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedUserDataId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPackedHeaderDataBufferType, correctedLength, 1, pUserData, &m_packedUserDataId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillUserDataBuffer(mfxU8 *pUserData, mfxU32 userDataLen) mfxStatus VAAPIEncoder::FillVideoSignalInfoBuffer(ExecuteBuffers* pExecuteBuffers) { // two steps cast is to work around "strict aliasing" rule warrning void * data = m_pMiscParamsSeqInfo->data; VAEncMiscParameterExtensionDataSeqDisplayMPEG2& miscSeqInfo = *((VAEncMiscParameterExtensionDataSeqDisplayMPEG2*)data); const ENCODE_SET_VUI_PARAMETER_MPEG2 & seqDisplayExt = pExecuteBuffers->m_vui; // VideoFullRange; - unused miscSeqInfo.extension_start_code_identifier = 0x02; // from spec miscSeqInfo.video_format = seqDisplayExt.video_format; miscSeqInfo.colour_description = seqDisplayExt.colour_description; miscSeqInfo.colour_primaries = seqDisplayExt.colour_primaries; miscSeqInfo.transfer_characteristics = seqDisplayExt.transfer_characteristics; miscSeqInfo.matrix_coefficients = seqDisplayExt.matrix_coefficients; miscSeqInfo.display_horizontal_size = seqDisplayExt.display_horizontal_size; miscSeqInfo.display_vertical_size = seqDisplayExt.display_vertical_size; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamSeqInfoId); MFX_CHECK_STS(sts); VAStatus vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterExtensionDataSeqDisplayMPEG2) + sizeof(VAEncMiscParameterBuffer), 1, m_pMiscParamsSeqInfo, &m_miscParamSeqInfoId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillVideoSignalInfoBuffer(ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::FillMBQPBuffer( ExecuteBuffers* pExecuteBuffers, mfxU8* mbqp, mfxU32 numMB) { VAStatus vaSts; int width_in_mbs, height_in_mbs; // assert(m_vaPpsBuf.picture_coding_extension.bits.q_scale_type == 0); width_in_mbs = (m_vaSpsBuf.picture_width + 15) >> 4; if (m_vaSpsBuf.sequence_extension.bits.progressive_sequence) { height_in_mbs = (m_vaSpsBuf.picture_height + 15) >> 4; } else { height_in_mbs = ((m_vaSpsBuf.picture_height + 31) >> 5) * 2; } //width(64byte alignment) height(8byte alignment) mfxU32 bufW = mfx::align2_value(width_in_mbs * 4, 64); mfxU32 bufH = mfx::align2_value(height_in_mbs, 8); if ( mbqp && numMB >= static_cast(width_in_mbs * height_in_mbs) && m_mbqpDataBuffer.size()*4 >= (bufW* bufH)) { Zero(m_mbqpDataBuffer); for (mfxU32 mbRow = 0; mbRow < static_cast(height_in_mbs); mbRow ++) for (mfxU32 mbCol = 0; mbCol < static_cast(width_in_mbs); mbCol ++) m_mbqpDataBuffer[mbRow * (bufW/4) + mbCol].qp_y = mbqp[mbRow * width_in_mbs + mbCol]; } mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbqpBufferId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncQPBufferType, bufW, bufH,//m_mbqpDataBuffer.size(), &m_mbqpDataBuffer[0], &m_mbqpBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); /* static int counter = 0; printf("Frame: %d %d macroblocks\nQP:", counter++, numMB); for (int i=0; i < numMB; i++){ if ((i % 22) == 0) printf("\n"); printf("%d ", mbqp[i]); } printf("\n");*/ return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillMBQPBuffer(ExecuteBuffers* pExecuteBuffers ,mfxU8* mbqp, mfxU32 numMB) mfxStatus VAAPIEncoder::FillSkipFrameBuffer(mfxU8 skipFlag) { //printf("******* Sending SkipFrame buffer\n"); VAStatus vaSts; VAEncMiscParameterSkipFrame & skipParam = (VAEncMiscParameterSkipFrame &)m_pMiscParamsSkipFrame->data; skipParam.skip_frame_flag = skipFlag ? 1 : 0; skipParam.num_skip_frames = 0; // unused in MPEG2 skipParam.size_skip_frames = 0; // unused in MPEG2 mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamSkipFrameId); MFX_CHECK_STS(sts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncMiscParameterBufferType, sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterSkipFrame), 1, m_pMiscParamsSkipFrame, &m_miscParamSkipFrameId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::FillSkipFrameBuffer(mfxU8 skipFlag) mfxStatus VAAPIEncoder::Execute(ExecuteBuffers* pExecuteBuffers, mfxU32 funcId, mfxU8 *pUserData, mfxU32 userDataLen) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Execute"); mfxStatus mfxSts; VAStatus vaSts; std::vector configBuffers; configBuffers.reserve(15); if (pExecuteBuffers->m_bAddSPS) { Zero(m_vaSpsBuf); FillSps(pExecuteBuffers, m_vaSpsBuf); mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncSequenceParameterBufferType, sizeof(m_vaSpsBuf), 1, &m_vaSpsBuf, &m_spsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (m_spsBufferId != VA_INVALID_ID) configBuffers.push_back(m_spsBufferId); // mfxExtVideoSignalInfo present - insert only with SPS if (pExecuteBuffers->m_bAddDisplayExt) { mfxSts = FillVideoSignalInfoBuffer(pExecuteBuffers); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); if (m_miscParamSeqInfoId != VA_INVALID_ID) configBuffers.push_back(m_miscParamSeqInfoId); } pExecuteBuffers->m_bAddSPS = 0; if (funcId == ENCODE_ENC_PAK_ID && (pExecuteBuffers->m_quantMatrix.load_intra_quantiser_matrix || pExecuteBuffers->m_quantMatrix.load_non_intra_quantiser_matrix || pExecuteBuffers->m_quantMatrix.load_chroma_intra_quantiser_matrix || pExecuteBuffers->m_quantMatrix.load_chroma_non_intra_quantiser_matrix)) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qmBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAQMatrixBufferType, sizeof(pExecuteBuffers->m_quantMatrix), 1, &pExecuteBuffers->m_quantMatrix, &m_qmBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (m_qmBufferId != VA_INVALID_ID) configBuffers.push_back(m_qmBufferId); } } Zero(m_vaPpsBuf); FillPps(m_core, pExecuteBuffers, m_vaPpsBuf, pUserData, userDataLen); mfxSts = FillMiscParameterBuffer(pExecuteBuffers); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); mfxSts = FillQualityLevelBuffer(pExecuteBuffers); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); if (pExecuteBuffers->m_SkipFrame && (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_B)) { mfxSts = FillSkipFrameBuffer(pExecuteBuffers->m_SkipFrame); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); } else { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamSkipFrameId); MFX_CHECK_STS(mfxSts); } mfxSts = FillSlices(pExecuteBuffers); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); MFX_CHECK_WITH_ASSERT(pExecuteBuffers->m_idxBs >= 0 && pExecuteBuffers->m_idxBs < m_bsQueue.size(), MFX_ERR_DEVICE_FAILED); m_vaPpsBuf.coded_buf = m_bsQueue[pExecuteBuffers->m_idxBs].surface; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VAEncPictureParameterBufferType, sizeof(m_vaPpsBuf), 1, &m_vaPpsBuf, &m_ppsBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (m_ppsBufferId != VA_INVALID_ID) configBuffers.push_back(m_ppsBufferId); if (m_miscParamFpsId != VA_INVALID_ID) configBuffers.push_back(m_miscParamFpsId); if (m_miscParamBrcId != VA_INVALID_ID) configBuffers.push_back(m_miscParamBrcId); if (m_miscParamQualityId != VA_INVALID_ID) configBuffers.push_back(m_miscParamQualityId); if (m_miscQualityParamId != VA_INVALID_ID) configBuffers.push_back(m_miscQualityParamId); if (m_miscParamSkipFrameId != VA_INVALID_ID) configBuffers.push_back(m_miscParamSkipFrameId); if (pUserData && userDataLen > 0) { mfxSts = FillUserDataBuffer(pUserData, userDataLen); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); if (m_packedUserDataParamsId != VA_INVALID_ID) configBuffers.push_back(m_packedUserDataParamsId); if (m_packedUserDataId != VA_INVALID_ID) configBuffers.push_back(m_packedUserDataId); } bool isMBQP = pExecuteBuffers->m_mbqp_data && (pExecuteBuffers->m_mbqp_data[0] != 0); if (isMBQP) { mfxSts = FillMBQPBuffer(pExecuteBuffers, (mfxU8 *)pExecuteBuffers->m_mbqp_data, pExecuteBuffers->m_nMBs); MFX_CHECK(mfxSts == MFX_ERR_NONE, MFX_ERR_DEVICE_FAILED); if (m_mbqpBufferId != VA_INVALID_ID) configBuffers.push_back(m_mbqpBufferId); pExecuteBuffers->m_mbqp_data[0] = 0; } #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) if (pExecuteBuffers->m_bTriggerGpuHang) { unsigned int trigger_hang = 1; mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, m_triggerGpuHangBufferId); MFX_CHECK_STS(mfxSts); vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextEncode, VATriggerCodecHangBufferType, sizeof(trigger_hang), 1, &trigger_hang, &m_triggerGpuHangBufferId); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); configBuffers.push_back(m_triggerGpuHangBufferId); } #endif //------------------------------------------------------------------ // Rendering //------------------------------------------------------------------ { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Rendering"); MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, pExecuteBuffers->m_idxMb); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|MPEG2|PACKET_START|", "%d|%d", m_vaContextEncode, 0); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); vaSts = vaBeginPicture(m_vaDisplay, m_vaContextEncode, *(VASurfaceID*)pExecuteBuffers->m_pSurfacePair.first); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture(buf)"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, configBuffers.data(), configBuffers.size()); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture(slice)"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextEncode, &m_sliceParamBufferId[0], m_numSliceGroups); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); vaSts = vaEndPicture(m_vaDisplay, m_vaContextEncode); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|ENCODE|MPEG2|PACKET_END|", "%d|%d", m_vaContextEncode, 0); //vaSts = vaSyncSurface(m_vaDisplay, *(VASurfaceID*)pExecuteBuffers->m_pSurface); //MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } //------------------------------------------------------------------ // PostStage //------------------------------------------------------------------ // put to cache { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback = { *(VASurfaceID*)pExecuteBuffers->m_pSurfacePair.first, pExecuteBuffers->m_pps.StatusReportFeedbackNumber, pExecuteBuffers->m_idxBs }; //currentFeedback.number = pExecuteBuffers->m_pps.StatusReportFeedbackNumber;// task.m_statusReportNumber[fieldId]; //currentFeedback.surface = *(VASurfaceID*)pExecuteBuffers->m_pSurface; //ConvertSurfaceIdMFX2VAAPI(m_core, pExecuteBuffers->m_pSurface); //currentFeedback.idxBs = pExecuteBuffers->m_idxBs; // task.m_idxBs[fieldId]; m_feedback.push_back( currentFeedback ); } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Execute(ExecuteBuffers* pExecuteBuffers, mfxU32 funcId) mfxStatus VAAPIEncoder::SetFrames (ExecuteBuffers* pExecuteBuffers) { mfxStatus sts = MFX_ERR_NONE; mfxI32 ind = 0; if (pExecuteBuffers->m_RecFrameMemID) { ind = GetRecFrameIndex(pExecuteBuffers->m_RecFrameMemID); } else { ind = 0xff; } pExecuteBuffers->m_pps.CurrReconstructedPic.Index7Bits = mfxU8(ind < 0 ? 0 : ind); pExecuteBuffers->m_pps.CurrReconstructedPic.AssociatedFlag = 0; pExecuteBuffers->m_idxMb = (DWORD)ind; pExecuteBuffers->m_idxBs = (DWORD)ind; if (pExecuteBuffers->m_bUseRawFrames) { ind = GetRawFrameIndex(pExecuteBuffers->m_CurrFrameMemID,true); MFX_CHECK(ind>=0,MFX_ERR_NOT_FOUND); } //else CurrOriginalPic == CurrReconstructedPic pExecuteBuffers->m_pps.CurrOriginalPic.Index7Bits = mfxU8(ind); pExecuteBuffers->m_pps.CurrOriginalPic.AssociatedFlag = 0; if (pExecuteBuffers->m_RefFrameMemID[0]) { ind = GetRecFrameIndex(pExecuteBuffers->m_RefFrameMemID[0]); MFX_CHECK(ind>=0,MFX_ERR_NOT_FOUND); pExecuteBuffers->m_pps.RefFrameList[0].Index7Bits = mfxU8(ind); pExecuteBuffers->m_pps.RefFrameList[0].AssociatedFlag = 0; } else { pExecuteBuffers->m_pps.RefFrameList[0].bPicEntry = 0xff; } if (pExecuteBuffers->m_RefFrameMemID[1]) { ind = GetRecFrameIndex(pExecuteBuffers->m_RefFrameMemID[1]); MFX_CHECK(ind>=0,MFX_ERR_NOT_FOUND); pExecuteBuffers->m_pps.RefFrameList[1].Index7Bits = mfxU8(ind); pExecuteBuffers->m_pps.RefFrameList[1].AssociatedFlag = 0; } else { pExecuteBuffers->m_pps.RefFrameList[1].bPicEntry = 0xff; } if (pExecuteBuffers->m_bExternalCurrFrameHDL) { //pExecuteBuffers->m_pSurface is already set, do nothing } else if (pExecuteBuffers->m_bExternalCurrFrame) { sts = m_core->GetExternalFrameHDL(*pExecuteBuffers->m_pSurface, pExecuteBuffers->m_pSurfacePair); } else { sts = m_core->GetFrameHDL(*pExecuteBuffers->m_pSurface, pExecuteBuffers->m_pSurfacePair); } MFX_CHECK_STS(sts); /*printf("CurrOriginalPic %d, CurrReconstructedPic %d, RefFrameList[0] %d, RefFrameList[1] %d\n", pExecuteBuffers->m_pps.CurrOriginalPic.Index7Bits, pExecuteBuffers->m_pps.CurrReconstructedPic.Index7Bits, pExecuteBuffers->m_pps.RefFrameList[0].Index7Bits, pExecuteBuffers->m_pps.RefFrameList[1].Index7Bits);*/ return sts; } // mfxStatus VAAPIEncoder::SetFrames (ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::Execute(ExecuteBuffers* pExecuteBuffers, mfxU8 *pUserData, mfxU32 userDataLen) { MFX::AutoTimer timer(__FUNCTION__); mfxStatus sts = MFX_ERR_NONE; sts = Execute(pExecuteBuffers, ENCODE_ENC_PAK_ID, pUserData, userDataLen); MFX_CHECK_STS(sts); return sts; } // mfxStatus VAAPIEncoder::Execute(ExecuteBuffers* pExecuteBuffers, mfxU8 *pUserData, mfxU32 userDataLen) mfxStatus VAAPIEncoder::Close() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIEncoder::Close"); delete [] (mfxU8 *)m_pMiscParamsFps; m_pMiscParamsFps = 0; delete [] (mfxU8 *)m_pMiscParamsBrc; m_pMiscParamsBrc = 0; delete [] (mfxU8 *)m_pMiscParamsQuality; m_pMiscParamsQuality = 0; delete [] m_pMiscParamsSeqInfo; m_pMiscParamsSeqInfo = 0; delete [] m_pMiscParamsSkipFrame; m_pMiscParamsSkipFrame = 0; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_spsBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_qmBufferId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_ppsBufferId); std::ignore = MFX_STS_TRACE(sts); for (mfxU32 i = 0; i < MAX_SLICES; i++) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_sliceParamBufferId[i]); std::ignore = MFX_STS_TRACE(sts); } sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamFpsId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamBrcId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamQualityId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscQualityParamId); std::ignore = MFX_STS_TRACE(sts); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_triggerGpuHangBufferId); std::ignore = MFX_STS_TRACE(sts); #endif sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamSeqInfoId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_miscParamSkipFrameId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedUserDataParamsId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_packedUserDataId); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_mbqpBufferId); std::ignore = MFX_STS_TRACE(sts); if (m_allocResponseMB.NumFrameActual != 0) { m_core->FreeFrames(&m_allocResponseMB); Zero(m_allocResponseMB); } if (m_allocResponseBS.NumFrameActual != 0) { m_core->FreeFrames(&m_allocResponseBS); Zero(m_allocResponseBS); } m_bsQueue.clear(); m_reconQueue.clear(); if (m_vaContextEncode != VA_INVALID_ID) { #ifdef MPEG2_ENC_HW_PERF FILE* f = fopen ("mpeg2_ENK_hw_perf_ex.txt","a+"); fprintf(f,"%lld\t%lld\t%lld\t%lld\t%lld\t%lld\n", (mfxU64)std::chrono::duration_cast(lock_MB_data_time[0].timeSpan).count(), (mfxU64)std::chrono::duration_cast(lock_MB_data_time[1].timeSpan).count(), (mfxU64)std::chrono::duration_cast(lock_MB_data_time[2].timeSpan).count(), (mfxU64)std::chrono::duration_cast(copy_MB_data_time[0].timeSpan).count(), (mfxU64)std::chrono::duration_cast(copy_MB_data_time[1].timeSpan).count(), (mfxU64)std::chrono::duration_cast(copy_MB_data_time[2].timeSpan).count()); fclose(f); #endif MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaDestroyContext"); VAStatus vaSts = vaDestroyContext(m_vaDisplay, m_vaContextEncode); std::ignore = MFX_STS_TRACE(vaSts); m_vaContextEncode = VA_INVALID_ID; } if (m_vaConfig != VA_INVALID_ID) { VAStatus vaSts = vaDestroyConfig(m_vaDisplay, m_vaConfig); std::ignore = MFX_STS_TRACE(vaSts); m_vaConfig = VA_INVALID_ID; } return MFX_ERR_NONE; } // mfxStatus VAAPIEncoder::Close() mfxStatus VAAPIEncoder::FillMBBufferPointer(ExecuteBuffers* pExecuteBuffers) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "CopyMB"); mfxStatus sts = MFX_ERR_NONE; mfxFrameData Frame = {}; //pExecuteBuffers->m_idxMb = 0; if (pExecuteBuffers->m_idxMb >= DWORD(m_allocResponseMB.NumFrameActual)) { return MFX_ERR_UNSUPPORTED; } Frame.MemId = m_allocResponseMB.mids[pExecuteBuffers->m_idxMb]; #ifdef MPEG2_ENC_HW_PERF if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_I) { lock_MB_data_time[0].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_P) { lock_MB_data_time[1].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_B) { lock_MB_data_time[2].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } #endif sts = m_core->LockFrame(Frame.MemId,&Frame); MFX_CHECK_STS(sts); #ifdef MPEG2_ENC_HW_PERF if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_I) { lock_MB_data_time[0].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - lock_MB_data_time[0].start; } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_P) { lock_MB_data_time[1].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - lock_MB_data_time[1].start; } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_B) { lock_MB_data_time[2].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - lock_MB_data_time[2].start; } #endif int numMB = 0; for (int i = 0; i<(int)pExecuteBuffers->m_pps.NumSlice;i++) { numMB = numMB + (int)pExecuteBuffers->m_pSlice[i].NumMbsForSlice; } //{ // FILE* f = fopen("MB data.txt","ab+"); // fwrite(Frame.Y,1,Frame.Pitch*numMB,f); // fclose(f); //} { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "CopyMBData"); #ifdef MPEG2_ENC_HW_PERF if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_I) { copy_MB_data_time[0].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_P) { copy_MB_data_time[1].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_B) { copy_MB_data_time[1].start = std::chrono::time_point_cast(std::chrono::steady_clock::now()); } #endif mfxFrameSurface1 src = {}; mfxFrameSurface1 dst = {}; src.Data = Frame; src.Data.Y += m_layout.MB_CODE_offset; src.Data.Pitch = mfxU16(m_layout.MB_CODE_stride); src.Info.Width = mfxU16(sizeof(ENCODE_ENC_MB_DATA_MPEG2)); src.Info.Height = mfxU16(numMB); src.Info.FourCC = MFX_FOURCC_P8; dst.Data.Y = (mfxU8 *)pExecuteBuffers->m_pMBs; dst.Data.Pitch = mfxU16(sizeof(ENCODE_ENC_MB_DATA_MPEG2)); dst.Info.Width = mfxU16(sizeof(ENCODE_ENC_MB_DATA_MPEG2)); dst.Info.Height = mfxU16(numMB); dst.Info.FourCC = MFX_FOURCC_P8; sts = m_core->DoFastCopyExtended(&dst, &src); MFX_CHECK_STS(sts); #ifdef MPEG2_ENC_HW_PERF if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_I) { copy_MB_data_time[0].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - copy_MB_data_time[0].start; } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_P) { copy_MB_data_time[1].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - copy_MB_data_time[1].start; } else if (pExecuteBuffers->m_pps.picture_coding_type == CODING_TYPE_B) { copy_MB_data_time[2].time_span = std::chrono::time_point_cast(std::chrono::steady_clock::now()) - copy_MB_data_time[2].start; } #endif } sts = m_core->UnlockFrame(Frame.MemId); MFX_CHECK_STS(sts); return sts; } // mfxStatus VAAPIEncoder::FillMBBufferPointer(ExecuteBuffers* pExecuteBuffers) mfxStatus VAAPIEncoder::FillBSBuffer(mfxU32 nFeedback,mfxU32 nBitstream, mfxBitstream* pBitstream ) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MPEG2 encode DDIWaitTaskSync"); mfxStatus sts = MFX_ERR_NONE; VAStatus vaSts; //------------------------------------------ // (1) mapping feedbackNumber -> surface & bs bool isFound = false; #if !VA_CHECK_VERSION(1,9,0) VASurfaceID waitSurface; #endif mfxU32 waitIdxBs; mfxU32 indxSurf; mfxU32 bitstreamSize = 0; UMC::AutomaticUMCMutex guard(m_guard); for (indxSurf = 0; indxSurf < m_feedback.size(); indxSurf++) { ExtVASurface currentFeedback = m_feedback[ indxSurf ]; if (currentFeedback.number == nFeedback) { #if !VA_CHECK_VERSION(1,9,0) waitSurface = currentFeedback.surface; #endif waitIdxBs = currentFeedback.idxBs; isFound = true; break; } } if( !isFound ) { return MFX_ERR_UNKNOWN; } // find used bitstream VABufferID codedBuffer; if( waitIdxBs < m_bsQueue.size()) { codedBuffer = m_bsQueue[waitIdxBs].surface; } else { return MFX_ERR_UNKNOWN; } { VASurfaceStatus surfSts = VASurfaceSkipped; #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) #if VA_CHECK_VERSION(1,9,0) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncBuffer"); vaSts = vaSyncBuffer(m_vaDisplay, codedBuffer, VA_TIMEOUT_INFINITE); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #else { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncSurface"); vaSts = vaSyncSurface(m_vaDisplay, waitSurface); // following code is workaround: // because of driver bug it could happen that decoding error will not be returned after decoder sync // and will be returned at subsequent encoder sync instead // just ignore VA_STATUS_ERROR_DECODING_ERROR in encoder if (vaSts == VA_STATUS_ERROR_DECODING_ERROR) vaSts = VA_STATUS_SUCCESS; MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #endif surfSts = VASurfaceReady; #else vaSts = vaQuerySurfaceStatus(m_vaDisplay, waitSurface, &surfSts); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); #endif switch (surfSts) { case VASurfaceReady: break; // return MFX_ERR_NONE; case VASurfaceRendering: case VASurfaceDisplaying: return MFX_WRN_DEVICE_BUSY; case VASurfaceSkipped: default: assert(!"bad feedback status"); return MFX_ERR_DEVICE_FAILED; } } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "CopyBitsream"); VACodedBufferSegment *codedBufferSegment; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); vaSts = vaMapBuffer( m_vaDisplay, codedBuffer, (void **)(&codedBufferSegment)); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } // m_codedbufISize same as m_codedbufPBSize, we should not read more than allocated if (codedBufferSegment->size > m_codedbufISize) sts = MFX_ERR_DEVICE_FAILED; else bitstreamSize = codedBufferSegment->size; if (codedBufferSegment->status & VA_CODED_BUF_STATUS_BAD_BITSTREAM) sts = MFX_ERR_GPU_HANG; else if (!codedBufferSegment->size || !codedBufferSegment->buf) sts = MFX_ERR_DEVICE_FAILED; MFX_CHECK_STS(sts); // remove task m_feedback.erase( m_feedback.begin() + indxSurf ); MFX_CHECK(pBitstream->DataLength + pBitstream->DataOffset + bitstreamSize < pBitstream->MaxLength, MFX_ERR_NOT_ENOUGH_BUFFER); IppiSize roi = {(mfxI32)bitstreamSize, 1}; mfxU8 *pData = (mfxU8*)codedBufferSegment->buf; mfxStatus ret = FastCopy::Copy(pBitstream->Data + pBitstream->DataLength + pBitstream->DataOffset, bitstreamSize, pData, bitstreamSize, roi, COPY_VIDEO_TO_SYS); MFX_CHECK(ret == MFX_ERR_NONE, MFX_ERR_UNDEFINED_BEHAVIOR); pBitstream->DataLength += bitstreamSize; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); vaSts = vaUnmapBuffer( m_vaDisplay, codedBuffer ); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } return sts; } // mfxStatus VAAPIEncoder::FillBSBuffer(mfxU32 nFeedback,mfxU32 nBitstream, mfxBitstream* pBitstream, Encryption *pEncrypt) #endif // (MFX_ENABLE_MPEG2_VIDEO_ENCODE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/libmfx-gen.map000066400000000000000000000046161443134507600251130ustar00rootroot00000000000000LIBMFXHW_1.0 { global: MFXInit; MFXClose; MFXQueryIMPL; MFXQueryVersion; MFXJoinSession; MFXDisjoinSession; MFXCloneSession; MFXSetPriority; MFXGetPriority; MFXVideoCORE_SetBufferAllocator; MFXVideoCORE_SetFrameAllocator; MFXVideoCORE_SetHandle; MFXVideoCORE_GetHandle; MFXVideoCORE_SyncOperation; MFXVideoENCODE_Query; MFXVideoENCODE_QueryIOSurf; MFXVideoENCODE_Init; MFXVideoENCODE_Reset; MFXVideoENCODE_Close; MFXVideoENCODE_GetVideoParam; MFXVideoENCODE_GetEncodeStat; MFXVideoENCODE_EncodeFrameAsync; MFXVideoDECODE_Query; MFXVideoDECODE_DecodeHeader; MFXVideoDECODE_QueryIOSurf; MFXVideoDECODE_Init; MFXVideoDECODE_Reset; MFXVideoDECODE_Close; MFXVideoDECODE_GetVideoParam; MFXVideoDECODE_GetDecodeStat; MFXVideoDECODE_SetSkipMode; MFXVideoDECODE_GetPayload; MFXVideoDECODE_DecodeFrameAsync; MFXVideoVPP_Query; MFXVideoVPP_QueryIOSurf; MFXVideoVPP_Init; MFXVideoVPP_Reset; MFXVideoVPP_Close; MFXVideoVPP_GetVideoParam; MFXVideoVPP_GetVPPStat; MFXVideoVPP_RunFrameVPPAsync; local: *; }; LIBMFXHW_1.1 { global: MFXVideoUSER_Register; MFXVideoUSER_Unregister; MFXVideoUSER_ProcessFrameAsync; } LIBMFXHW_1.0; LIBMFXHW_1.10 { global: MFXVideoENC_Query; MFXVideoENC_QueryIOSurf; MFXVideoENC_Init; MFXVideoENC_Reset; MFXVideoENC_Close; MFXVideoENC_ProcessFrameAsync; MFXVideoVPP_RunFrameVPPAsyncEx; } LIBMFXHW_1.1; LIBMFXHW_1.13 { global: MFXVideoPAK_Query; MFXVideoPAK_QueryIOSurf; MFXVideoPAK_Init; MFXVideoPAK_Reset; MFXVideoPAK_Close; MFXVideoPAK_ProcessFrameAsync; } LIBMFXHW_1.10; LIBMFXHW_1.14 { global: MFXInitEx; MFXDoWork; } LIBMFXHW_1.13; LIBMFXHW_1.19 { global: MFXVideoENC_GetVideoParam; MFXVideoPAK_GetVideoParam; MFXVideoCORE_QueryPlatform; MFXVideoUSER_GetPlugin; } LIBMFXHW_1.14; LIBMFXGEN_1.2.1 { global: MFXInitialize; MFXQueryImplsDescription; MFXReleaseImplDescription; MFXMemory_GetSurfaceForDecode; MFXMemory_GetSurfaceForEncode; MFXMemory_GetSurfaceForVPP; MFXMemory_GetSurfaceForVPPOut; MFXVideoVPP_ProcessFrameAsync; MFXVideoDECODE_VPP_Init; MFXVideoDECODE_VPP_DecodeFrameAsync; MFXVideoDECODE_VPP_Reset; MFXVideoDECODE_VPP_Close; MFXVideoDECODE_VPP_GetChannelParam; } LIBMFXHW_1.19;oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pkg-config.pc.cmake000066400000000000000000000004401443134507600260020ustar00rootroot00000000000000Name: @PROJECT_NAME@ Description: Intel(R) Media SDK Version: @mfx_version_major@.@mfx_version_minor@ prefix=@CMAKE_INSTALL_PREFIX@ libdir=@CMAKE_INSTALL_FULL_LIBDIR@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Libs: -L${libdir} -l@mfxlibname@ Cflags: -I${includedir} -I${includedir}/mfx oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/000077500000000000000000000000001443134507600231645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/CMakeLists.txt000066400000000000000000000012231443134507600257220ustar00rootroot00000000000000 set(sources src/mfx_pxp_video_accelerator_vaapi.cpp src/mfx_pxp_video_accelerator.cpp src/mfx_pxp_vpp_vaapi.cpp src/mfx_pxp_h264_supplier.cpp src/mfx_pxp_h264_nal_spl.cpp src/mfx_pxp_h265_supplier.cpp src/mfx_pxp_h265_nal_spl.cpp ) add_library(pxp_hw STATIC ${sources}) target_include_directories(pxp_hw PUBLIC ${MSDK_STUDIO_ROOT}/shared/include ${MSDK_LIB_ROOT}/pxp/include ${MSDK_UMC_ROOT}/io/umc_va/include ${MSDK_UMC_ROOT}/codec/h264_dec/include ${MSDK_UMC_ROOT}/codec/h265_dec/include ) target_link_libraries(pxp_hw PUBLIC mfx_static_lib umc_va_hw ) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/000077500000000000000000000000001443134507600246075ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_h264_nal_spl.h000066400000000000000000000033371443134507600307220ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_H264_NAL_SPL_H #define __MFX_PXP_H264_NAL_SPL_H #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "umc_h264_nal_spl.h" #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_video_accelerator_vaapi.h" namespace UMC { class PXPNALUnitSplitter : public NALUnitSplitter { public: virtual NalUnit* GetNalUnits(MediaData* pSource) override; Status MergeEncryptedNalUnit(NalUnit* nalUnit, MediaData* pSource); void SetVA(VideoAccelerator* va) { m_va = va; } private: VideoAccelerator* m_va; }; } #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_H264_NAL_SPL_HoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_h264_supplier.h000066400000000000000000000035261443134507600311350ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_H264_SUPPLIER_H #define __MFX_PXP_H264_SUPPLIER_H #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "umc_h264_va_supplier.h" #include "umc_h264_nal_spl.h" #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_h264_nal_spl.h" #include "mfx_pxp_video_accelerator_vaapi.h" namespace UMC { class PXPH264Supplier : public VATaskSupplier { public: PXPH264Supplier(); virtual ~PXPH264Supplier() {}; virtual Status Init(VideoDecoderParams* pInit) override; virtual Status AddOneFrame(MediaData* pSource) override; virtual bool ProcessNonPairedField(H264DecoderFrame * pFrame) override; Status UpdatePXPParams(MediaData const* pSource); }; } #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_H264_SUPPLIER_HoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_h265_nal_spl.h000066400000000000000000000034341443134507600307210ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_H265_NAL_SPL_H #define __MFX_PXP_H265_NAL_SPL_H #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "umc_h265_nal_spl.h" #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_video_accelerator_vaapi.h" namespace UMC_HEVC_DECODER { class PXPNALUnitSplitter_H265 : public NALUnitSplitter_H265 { public: virtual UMC::MediaDataEx* GetNalUnits(UMC::MediaData* pSource) override; UMC::Status MergeEncryptedNalUnit(UMC::MediaDataEx* nalUnit, UMC::MediaData* pSource); void SetVA(UMC::VideoAccelerator* va) { m_va = va; } private: UMC::VideoAccelerator* m_va; }; } #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_H265_NAL_SPL_HoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_h265_supplier.h000066400000000000000000000034601443134507600311330ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_H265_SUPPLIER_H #define __MFX_PXP_H265_SUPPLIER_H #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "umc_h265_va_supplier.h" #include "umc_h265_nal_spl.h" #include "mfx_pxp_video_accelerator.h" #include "mfx_pxp_h265_nal_spl.h" #include "mfx_pxp_video_accelerator_vaapi.h" namespace UMC_HEVC_DECODER { class PXPH265Supplier : public VATaskSupplier { public: PXPH265Supplier(); virtual ~PXPH265Supplier() {}; virtual UMC::Status Init(UMC::VideoDecoderParams* pInit) override; virtual UMC::Status AddOneFrame(UMC::MediaData* pSource) override; UMC::Status UpdatePXPParams(UMC::MediaData const* pSource); }; } #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_H265_SUPPLIER_HoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_video_accelerator.h000066400000000000000000000034631443134507600322010ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_VIDEO_ACCELERATOR_H #define __MFX_PXP_VIDEO_ACCELERATOR_H #include "mfx_config.h" #if defined(MFX_ENABLE_PXP) #include "umc_va_protected.h" namespace UMC { class PXPVA : public ProtectedVA { public: PXPVA(mfxHDL pxpCtxHdl); virtual ~PXPVA(); void SetPXPCtxHdl(mfxHDL pxpCtxHdl) { m_PXPCtxHdl = pxpCtxHdl; } mfxHDL GetPXPCtxHdl() { return m_PXPCtxHdl; } void SetPXPParams(mfxHDL pxpParams) { m_PXPParams = pxpParams; } mfxHDL GetPXPParams() { return m_PXPParams; } uint32_t m_curSegment; private: mfxHDL m_PXPCtxHdl; mfxHDL m_PXPParams; }; } #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_VIDEO_ACCELERATOR_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_video_accelerator_vaapi.h000066400000000000000000000036331443134507600333600ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PXP_VIDEO_ACCELERATOR_VAAPI_H #define __MFX_PXP_VIDEO_ACCELERATOR_VAAPI_H #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "mfxpxp.h" #include "umc_va_linux.h" class PXPLinuxVideoAccelerator : public UMC::LinuxVideoAccelerator { public: // constructor PXPLinuxVideoAccelerator(); // destructor virtual ~PXPLinuxVideoAccelerator(); // VideoAccelerator methods virtual UMC::Status Init (UMC::VideoAcceleratorParams* pInfo) override; virtual UMC::Status Execute () override; virtual UMC::Status SetAttributes(VAProfile va_profile, UMC::LinuxVideoAcceleratorParams* pParams, VAConfigAttrib *attribute, int32_t *attribsNumber) override; protected: mfxPXPCtxHDL m_PXPCtxHdl; }; #endif // MFX_ENABLE_PXP #endif // __MFX_PXP_VIDEO_ACCELERATOR_VAAPI_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/include/mfx_pxp_vpp_vaapi.h000066400000000000000000000027601443134507600305130ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined(MFX_ENABLE_PXP) #include "mfx_vpp_interface.h" #include "mfx_vpp_vaapi.h" #include "mfxpxp.h" class PXPVAAPIVPP : public MfxHwVideoProcessing::VAAPIVideoProcessing { public: mfxStatus CreateDevice(VideoCORE * core, mfxVideoParam* pParams, bool isTemporal = false) override; protected: mfxPXPCtxHDL m_PXPCtxHdl = nullptr; }; #endif // (MFX_ENABLE_PXP)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/000077500000000000000000000000001443134507600237535ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_h264_nal_spl.cpp000066400000000000000000000110511443134507600304110ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_h264_nal_spl.h" #if defined(MFX_ENABLE_PXP) namespace UMC { NalUnit* PXPNALUnitSplitter::GetNalUnits(MediaData* pSource) { NalUnit* nalUnit = NALUnitSplitter::GetNalUnits(pSource); if (nalUnit && m_va && m_va->GetProtectedVA() && static_cast(m_va->GetProtectedVA())->GetPXPParams()) { NAL_Unit_Type nalUnitType = (NAL_Unit_Type)nalUnit->GetNalUnitType(); if (NAL_UT_IDR_SLICE == nalUnitType || NAL_UT_SLICE == nalUnitType || NAL_UT_AUXILIARY == nalUnitType || NAL_UT_CODED_SLICE_EXTENSION == nalUnitType) { UMC_CHECK(UMC_ERR_INVALID_PARAMS != MergeEncryptedNalUnit(nalUnit, pSource), nullptr); } } return nalUnit; } Status PXPNALUnitSplitter::MergeEncryptedNalUnit(NalUnit* nalUnit, MediaData* pSource) { UMC_CHECK(nalUnit != nullptr, UMC_ERR_INVALID_PARAMS); UMC_CHECK(pSource != nullptr, UMC_ERR_INVALID_PARAMS); uint32_t cur_segment_length = 0; uint32_t start_code_length = 3; PXPVA* pxpva = static_cast(m_va->GetProtectedVA()); cur_segment_length = (static_cast(pxpva->GetPXPParams())->segment_info + pxpva->m_curSegment)->segment_length; while (cur_segment_length != nalUnit->GetBufferSize()) { // middleclr mode has multi segments in one slice if (cur_segment_length < nalUnit->GetBufferSize()) { pxpva->m_curSegment++; cur_segment_length += (static_cast(pxpva->GetPXPParams())->segment_info + pxpva->m_curSegment)->segment_length; } // additional NAL after encryption else if (cur_segment_length > nalUnit->GetBufferSize()) { // additional 00 at the end of NAL uint8_t* end_nal_ptr = (uint8_t*)nalUnit->GetBufferPointer() + nalUnit->GetBufferSize(); uint32_t end_nal_index = 0; uint32_t ext_buf_size = cur_segment_length - nalUnit->GetBufferSize(); while (end_nal_index < ext_buf_size && *end_nal_ptr == 0) { end_nal_ptr++; end_nal_index++; } if (end_nal_index >= ext_buf_size) { nalUnit->SetBufferPointer((uint8_t*)nalUnit->GetBufferPointer(), cur_segment_length); nalUnit->SetDataSize(cur_segment_length); pxpva->m_curSegment++; return UMC_OK; } // additional start code, read next NAL uint8_t* prev_buffer_ptr = (uint8_t*)nalUnit->GetBufferPointer(); uint32_t prev_buffer_size = nalUnit->GetBufferSize(); int prev_nal_unit_type = nalUnit->m_nal_unit_type; nalUnit = NALUnitSplitter::GetNalUnits(pSource); if (!nalUnit) { return UMC_ERR_NULL_PTR; } uint32_t newBufferSize = prev_buffer_size + 3 + nalUnit->GetBufferSize(); nalUnit->SetBufferPointer(prev_buffer_ptr, newBufferSize); nalUnit->SetDataSize(newBufferSize); nalUnit->m_nal_unit_type = prev_nal_unit_type; } } pxpva->m_curSegment++; return UMC_OK; } } #endif // MFX_ENABLE_PXPoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_h264_supplier.cpp000066400000000000000000000063611443134507600306340ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_h264_supplier.h" #if defined(MFX_ENABLE_PXP) namespace UMC { PXPH264Supplier::PXPH264Supplier() { } Status PXPH264Supplier::Init(VideoDecoderParams* pInit) { Status umcRes = VATaskSupplier::Init(pInit); if (m_va->GetProtectedVA()) { static_cast(m_pNALSplitter.get())->SetVA(m_va); } return umcRes; } Status PXPH264Supplier::AddOneFrame(MediaData * pSource) { if (m_va->GetProtectedVA()) { if (!m_pLastSlice && pSource) UMC_CHECK_STATUS(UpdatePXPParams(pSource)); } return TaskSupplier::AddOneFrame(pSource); } Status PXPH264Supplier::UpdatePXPParams(MediaData const* pSource) { UMC_CHECK(pSource != nullptr, UMC_ERR_INVALID_PARAMS); static_cast(m_va->GetProtectedVA())->SetPXPParams(nullptr); static_cast(m_va->GetProtectedVA())->m_curSegment = 0; mfxPXPCtxHDL curPXPCtxHdl = static_cast(static_cast(m_va->GetProtectedVA())->GetPXPCtxHdl()); auto mapptr = std::find_if(curPXPCtxHdl->decodeParamMapHdl, curPXPCtxHdl->decodeParamMapHdl + curPXPCtxHdl->decodeParamMapCnt, [key = (uint8_t*)pSource->GetBufferPointer()](const mfxDecodeParamMap & data) { return data.pMfxBitstream->Data == key; } ); UMC_CHECK(mapptr != curPXPCtxHdl->decodeParamMapHdl + curPXPCtxHdl->decodeParamMapCnt, UMC_ERR_FAILED); static_cast(m_va->GetProtectedVA())->SetPXPParams(mapptr->pPXPParams); UMC_CHECK(static_cast(m_va->GetProtectedVA())->GetPXPParams() != nullptr, UMC_ERR_INVALID_PARAMS); return UMC_OK; } bool PXPH264Supplier::ProcessNonPairedField(H264DecoderFrame * pFrame) { if (pFrame) { H264Slice * pSlice = pFrame->GetAU(0)->GetSlice(0); if (pSlice && pSlice->GetSliceHeader()->field_pic_flag) { // accelerator will submit decode parameter twice to decode top and bottom field data // return false to re-use output surface // it will allocate new surface when decoded bottom field data return false; } } return VATaskSupplier::ProcessNonPairedField(pFrame); } } #endif // MFX_ENABLE_PXPoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_h265_nal_spl.cpp000066400000000000000000000131021443134507600304110ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_h265_nal_spl.h" #if defined(MFX_ENABLE_PXP) namespace UMC_HEVC_DECODER { UMC::MediaDataEx* PXPNALUnitSplitter_H265::GetNalUnits(UMC::MediaData* pSource) { UMC::MediaDataEx* nalUnit = NALUnitSplitter_H265::GetNalUnits(pSource); if (nalUnit && m_va && m_va->GetProtectedVA() && static_cast(m_va->GetProtectedVA())->GetPXPParams()) { UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = nalUnit->GetExData(); NalUnitType unitType = (NalUnitType)pMediaDataEx->values[pMediaDataEx->index]; if ( NAL_UT_CODED_SLICE_TRAIL_R == unitType || NAL_UT_CODED_SLICE_TRAIL_N == unitType || NAL_UT_CODED_SLICE_TLA_R == unitType || NAL_UT_CODED_SLICE_TSA_N == unitType || NAL_UT_CODED_SLICE_STSA_R == unitType || NAL_UT_CODED_SLICE_STSA_N == unitType || NAL_UT_CODED_SLICE_BLA_W_LP == unitType || NAL_UT_CODED_SLICE_BLA_W_RADL == unitType || NAL_UT_CODED_SLICE_BLA_N_LP == unitType || NAL_UT_CODED_SLICE_IDR_W_RADL == unitType || NAL_UT_CODED_SLICE_IDR_N_LP == unitType || NAL_UT_CODED_SLICE_CRA == unitType || NAL_UT_CODED_SLICE_RADL_R == unitType || NAL_UT_CODED_SLICE_RADL_N == unitType || NAL_UT_CODED_SLICE_RASL_R == unitType || NAL_UT_CODED_SLICE_RASL_N == unitType ) { UMC_CHECK(UMC::UMC_ERR_INVALID_PARAMS != MergeEncryptedNalUnit(nalUnit, pSource), nullptr); } } return nalUnit; } UMC::Status PXPNALUnitSplitter_H265::MergeEncryptedNalUnit(UMC::MediaDataEx* nalUnit, UMC::MediaData* pSource) { UMC_CHECK(nalUnit != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC_CHECK(pSource != nullptr, UMC::UMC_ERR_INVALID_PARAMS); uint32_t cur_segment_length = 0; uint32_t start_code_length = 3; UMC::PXPVA* pxpva = static_cast(m_va->GetProtectedVA()); cur_segment_length = (static_cast(pxpva->GetPXPParams())->segment_info + pxpva->m_curSegment)->segment_length - start_code_length; while (cur_segment_length != nalUnit->GetBufferSize()) { // middleclr mode has multi segments in one slice if (cur_segment_length < nalUnit->GetBufferSize()) { pxpva->m_curSegment++; cur_segment_length += (static_cast(pxpva->GetPXPParams())->segment_info + pxpva->m_curSegment)->segment_length; } // additional NAL after encryption else if (cur_segment_length > nalUnit->GetBufferSize()) { // additional 00 at the end of NAL uint8_t* end_nal_ptr = (uint8_t*)nalUnit->GetBufferPointer() + nalUnit->GetBufferSize(); uint32_t end_nal_index = 0; uint32_t ext_buf_size = cur_segment_length - nalUnit->GetBufferSize(); while (end_nal_index < ext_buf_size && *end_nal_ptr == 0) { end_nal_ptr++; end_nal_index++; } if (end_nal_index >= ext_buf_size) { nalUnit->SetBufferPointer((uint8_t*)nalUnit->GetBufferPointer(), cur_segment_length); nalUnit->SetDataSize(cur_segment_length); pxpva->m_curSegment++; return UMC::UMC_OK; } // additional start code, read next NAL uint8_t* prev_buffer_ptr = (uint8_t*)nalUnit->GetBufferPointer(); uint32_t prev_buffer_size = nalUnit->GetBufferSize(); UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = nalUnit->GetExData(); int32_t prev_iCode = pMediaDataEx->values[0]; nalUnit = NALUnitSplitter_H265::GetNalUnits(pSource); if (!nalUnit) { return UMC::UMC_ERR_NULL_PTR; } uint32_t newBufferSize = prev_buffer_size + 3 + nalUnit->GetBufferSize(); nalUnit->SetBufferPointer(prev_buffer_ptr, newBufferSize); nalUnit->SetDataSize(newBufferSize); pMediaDataEx->values[0] = prev_iCode; pMediaDataEx->offsets[1] = newBufferSize; } } pxpva->m_curSegment++; return UMC::UMC_OK; } } #endif // MFX_ENABLE_PXPoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_h265_supplier.cpp000066400000000000000000000055751443134507600306430ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_h265_supplier.h" #if defined(MFX_ENABLE_PXP) namespace UMC_HEVC_DECODER { PXPH265Supplier::PXPH265Supplier() { } UMC::Status PXPH265Supplier::Init(UMC::VideoDecoderParams* pInit) { UMC::Status umcRes = VATaskSupplier::Init(pInit); if (m_va->GetProtectedVA()) { static_cast(m_pNALSplitter.get())->SetVA(m_va); } return umcRes; } UMC::Status PXPH265Supplier::AddOneFrame(UMC::MediaData * pSource) { if (m_va->GetProtectedVA()) { if (!m_pLastSlice && pSource) { UMC::Status umcRes = UpdatePXPParams(pSource); if(umcRes != UMC::UMC_OK) return umcRes; } } return VATaskSupplier::AddOneFrame(pSource); } UMC::Status PXPH265Supplier::UpdatePXPParams(UMC::MediaData const* pSource) { UMC_CHECK(pSource != nullptr, UMC::UMC_ERR_INVALID_PARAMS); static_cast(m_va->GetProtectedVA())->SetPXPParams(nullptr); static_cast(m_va->GetProtectedVA())->m_curSegment = 0; mfxPXPCtxHDL curPXPCtxHdl = static_cast(static_cast(m_va->GetProtectedVA())->GetPXPCtxHdl()); auto mapptr = std::find_if(curPXPCtxHdl->decodeParamMapHdl, curPXPCtxHdl->decodeParamMapHdl + curPXPCtxHdl->decodeParamMapCnt, [key = (uint8_t*)pSource->GetBufferPointer()](const mfxDecodeParamMap & data) { return data.pMfxBitstream->Data == key; } ); UMC_CHECK(mapptr != curPXPCtxHdl->decodeParamMapHdl + curPXPCtxHdl->decodeParamMapCnt, UMC::UMC_ERR_FAILED); static_cast(m_va->GetProtectedVA())->SetPXPParams(mapptr->pPXPParams); UMC_CHECK(static_cast(m_va->GetProtectedVA())->GetPXPParams() != nullptr, UMC::UMC_ERR_INVALID_PARAMS); return UMC::UMC_OK; } } #endif // MFX_ENABLE_PXPoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_video_accelerator.cpp000066400000000000000000000025411443134507600316740ustar00rootroot00000000000000// Copyright (c) 2006-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_video_accelerator.h" #if defined(MFX_ENABLE_PXP) #include "mfxpxp.h" using namespace UMC; PXPVA::PXPVA(mfxHDL pxpCtxHdl) : m_curSegment(0), m_PXPCtxHdl(pxpCtxHdl), m_PXPParams(nullptr) {} PXPVA::~PXPVA() {} #endif // MFX_ENABLE_PXP oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_video_accelerator_vaapi.cpp000066400000000000000000000115571443134507600330630ustar00rootroot00000000000000// Copyright (c) 2006-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_video_accelerator_vaapi.h" #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_video_accelerator.h" PXPLinuxVideoAccelerator::PXPLinuxVideoAccelerator() : m_PXPCtxHdl(nullptr) { } PXPLinuxVideoAccelerator::~PXPLinuxVideoAccelerator() { m_PXPCtxHdl = nullptr; Close(); } UMC::Status PXPLinuxVideoAccelerator::Init(UMC::VideoAcceleratorParams* pInfo) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "PXPLinuxVideoAccelerator::Init"); UMC::Status umcRes = UMC::UMC_OK; if(pInfo->m_pPXPCtxHdl) { m_PXPCtxHdl = reinterpret_cast(pInfo->m_pPXPCtxHdl); } umcRes = LinuxVideoAccelerator::Init(pInfo); UMC::LinuxVideoAcceleratorParams* pParams = DynamicCast(pInfo); UMC_CHECK(pParams != nullptr, UMC::UMC_ERR_NULL_PTR); if(pParams->m_pContext) { m_PXPCtxHdl->secureDecodeCfg.ContextId = *(pParams->m_pContext); m_protectedVA = std::make_shared(pInfo->m_pPXPCtxHdl); } return umcRes; } UMC::Status PXPLinuxVideoAccelerator::SetAttributes(VAProfile va_profile, UMC::LinuxVideoAcceleratorParams* pParams, VAConfigAttrib *attribute, int32_t *attribsNumber) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "PXPLinuxVideoAccelerator::SetAttributes"); UMC_CHECK(pParams != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC_CHECK(attribute != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC_CHECK(attribsNumber != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC_CHECK((*attribsNumber >= 0 && *attribsNumber < UMC_VA_LINUX_ATTRIB_SIZE), UMC::UMC_ERR_INVALID_PARAMS); // Check PXP handle and secure decode context handle UMC_CHECK(m_PXPCtxHdl != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC::Status umcRes = LinuxVideoAccelerator::SetAttributes(va_profile, pParams, attribute, attribsNumber); if (UMC::UMC_OK == umcRes) { //check pxp capablity by attribute[3], and set pxp attribute to attribute[*attribsNumber] VAConfigAttrib *pxpAttrib = reinterpret_cast(m_PXPCtxHdl->secureDecodeCfg.pxpAttributesHdl); if (pxpAttrib && (attribute[3].value & (VA_ENCRYPTION_TYPE_SUBSAMPLE_CTR | VA_ENCRYPTION_TYPE_SUBSAMPLE_CBC | VA_ENCRYPTION_TYPE_FULLSAMPLE_CTR | VA_ENCRYPTION_TYPE_FULLSAMPLE_CBC)) ) { attribute[*attribsNumber].type = pxpAttrib->type; attribute[*attribsNumber].value = pxpAttrib->value; (*attribsNumber)++; } } return umcRes; } UMC::Status PXPLinuxVideoAccelerator::Execute() { UMC_CHECK(m_PXPCtxHdl != nullptr, UMC::UMC_ERR_INVALID_PARAMS); UMC_CHECK(m_PXPCtxHdl->decodeParamMapHdl != nullptr, UMC::UMC_ERR_INVALID_PARAMS); mfxBitstream *curBS = GetProtectedVA()->GetBitstream(); UMC_CHECK(curBS != nullptr, UMC::UMC_ERR_NOT_INITIALIZED); auto mapptr = std::find_if(m_PXPCtxHdl->decodeParamMapHdl, m_PXPCtxHdl->decodeParamMapHdl + m_PXPCtxHdl->decodeParamMapCnt, [key = curBS->Data](const mfxDecodeParamMap & data) { return data.pMfxBitstream->Data == key; } ); UMC_CHECK(mapptr != m_PXPCtxHdl->decodeParamMapHdl + m_PXPCtxHdl->decodeParamMapCnt, UMC::UMC_ERR_FAILED); if(mapptr->pPXPParams) { UMC::UMCVACompBuffer *encParamBuf; VAEncryptionParameters* pEncParams = (VAEncryptionParameters*)UMC::LinuxVideoAccelerator::GetCompBuffer(VAEncryptionParameterBufferType, &encParamBuf, sizeof(VAEncryptionParameters), 0); UMC_CHECK(pEncParams != nullptr, UMC::UMC_ERR_ALLOC); VAEncryptionParameters *encParams = reinterpret_cast(mapptr->pPXPParams); *pEncParams = *encParams; encParamBuf->SetDataSize(sizeof(VAEncryptionParameters)); } return UMC::LinuxVideoAccelerator::Execute(); } #endif // MFX_ENABLE_PXP oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/pxp/src/mfx_pxp_vpp_vaapi.cpp000066400000000000000000000036011443134507600302050ustar00rootroot00000000000000// Copyright (c) 2006-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_pxp_vpp_vaapi.h" #if defined(MFX_ENABLE_PXP) #include "mfx_trace.h" #include "mfxstructures.h" using namespace MfxHwVideoProcessing; mfxStatus PXPVAAPIVPP::CreateDevice(VideoCORE * core, mfxVideoParam* pParams, bool /*isTemporal*/) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "PXPVAAPIVPP::CreateDevice"); MFX_CHECK_NULL_PTR1(core); mfxStatus sts = core->GetHandle(MFX_HANDLE_PXP_CONTEXT, (mfxHDL*)&m_PXPCtxHdl); MFX_CHECK(MFX_ERR_NONE == sts, MFX_ERR_DEVICE_FAILED); MFX_CHECK(m_PXPCtxHdl != nullptr, MFX_ERR_INVALID_HANDLE); sts = VAAPIVideoProcessing::CreateDevice(core, pParams); MFX_CHECK(MFX_ERR_NONE == sts, MFX_ERR_DEVICE_FAILED); m_PXPCtxHdl->secureVPPCfg.ContextId = m_vaContextVPP; return MFX_ERR_NONE; } #endif // (MFX_ENABLE_PXP)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/000077500000000000000000000000001443134507600243335ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/000077500000000000000000000000001443134507600254725ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include/000077500000000000000000000000001443134507600271155ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include/mfx_dependency_item.h000066400000000000000000000176741443134507600333130ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_DEPENDENCY_ITEM_H) #define __MFX_DEPENDENCY_ITEM_H #include // Forward declaration of used classes. class mfxDependencyItemInterface; // Declare base type to bind dependent items into lists. struct MFX_DEPENDENCY_LIST_ITEM { // Pointer to the dependent object mfxDependencyItemInterface *pObj; // Pointer to the next dependent item in the list MFX_DEPENDENCY_LIST_ITEM *pNext; // Pointer to the previous dependent item in the list MFX_DEPENDENCY_LIST_ITEM *pPrev; }; class mfxDependencyItemInterface { public: virtual ~mfxDependencyItemInterface() {}; // // Methods for the base object. Some others objects may be dependent on it. // // Add new item to the list of items // which are dependent on the current object. virtual void SetDependentItem(mfxDependencyItemInterface *pDependentObject, int levelDependency) = 0; // The object is ready, and there is no more dependency for waiting items. // Unlink them from the dependency list, update status if any. virtual void ResolveDependencies(mfxStatus result) = 0; // // Methods for the dependent object. Such an object is need to wait until // some base objects become available or ready. // // Link the current object into the dependency list. virtual MFX_DEPENDENCY_LIST_ITEM *SetNextDependentItem(MFX_DEPENDENCY_LIST_ITEM *pNext, int levelDependency) = 0; // Update the dependent object with the status of parent object virtual void OnDependencyResolved(mfxStatus result) = 0; // Check that all dependencies are resolved and // the current object can be processed. virtual bool IsDependenciesResolved(void) const = 0; // Get the status of dependencies resolved. virtual bool GetDependencyStatus(void) const = 0; // Reset the object into the initial state. virtual void ResetDependency(void) = 0; }; template class mfxDependencyItem : public mfxDependencyItemInterface { public: mfxDependencyItem(void) { ResetDependency(); } virtual ~mfxDependencyItem(void) { } // Add new item to the list of items // which are dependent on the current object. virtual void SetDependentItem(mfxDependencyItemInterface *pDependentObject, int levelDependency) { MFX_DEPENDENCY_LIST_ITEM *pNewList; pNewList = pDependentObject->SetNextDependentItem(m_beginListObjects.pNext, levelDependency); if (pNewList) { m_beginListObjects.pNext = pNewList; pNewList->pPrev = &m_beginListObjects; } } // The item is ready, and there is no more dependency for waiting items. // Unlink them from the dependency list, update status if any. virtual void ResolveDependencies(mfxStatus result) { MFX_DEPENDENCY_LIST_ITEM *pObjects = m_beginListObjects.pNext; // run over the dependent object and let them know, // that one of dependency is ready while (&m_endListObjects != pObjects && pObjects) { MFX_DEPENDENCY_LIST_ITEM *pTemp = pObjects->pNext; pObjects->pNext = 0; pObjects->pPrev = 0; pObjects->pObj->OnDependencyResolved(result); pObjects = pTemp; } // terminate the list of the dependent objects m_beginListObjects.pNext = &m_endListObjects; m_endListObjects.pPrev = &m_beginListObjects; } // Link the current item into the dependency list. virtual MFX_DEPENDENCY_LIST_ITEM *SetNextDependentItem(MFX_DEPENDENCY_LIST_ITEM *pNext, int levelDependency) { // check error(s) if (levelDependency >= dependency_level) { return (MFX_DEPENDENCY_LIST_ITEM *) 0; } // link the given list to the object m_dependency[levelDependency].pNext = pNext; pNext->pPrev = m_dependency + levelDependency; // return the new beginning of the list return m_dependency + levelDependency; } // Update the dependent object with the status of the parent object virtual void OnDependencyResolved(mfxStatus result) { if (MFX_ERR_NONE != result) { int i; // unlink item from all dependency lists for (i = 0; i < dependency_level; i += 1) { if (m_dependency[i].pNext) { m_dependency[i].pNext->pPrev = m_dependency[i].pPrev; } if (m_dependency[i].pPrev) { m_dependency[i].pPrev->pNext = m_dependency[i].pNext; } m_dependency[i].pNext = 0; m_dependency[i].pPrev = 0; } // make all subsequent objects know about the error ResolveDependencies(MFX_ERR_ABORTED); } // Actually, there is may be additional activity in inherited classes. } // Check that all dependencies are resoulved and // the current item can be processed. virtual bool IsDependenciesResolved(void) const { bool bDependenciesResolved = true; int i; for (i = 0; i < dependency_level; i += 1) { if (m_dependency[i].pNext) { bDependenciesResolved = false; break; } } return bDependenciesResolved; } // Get the status of dependencies resolved. virtual bool GetDependencyStatus(void) const { return m_bStatusOk; } // Reset the object into the initial state. virtual void ResetDependency(void) { int i; m_bStatusOk = true; // terminate the dependent object list m_beginListObjects.pObj = 0; m_beginListObjects.pNext = &m_endListObjects; m_beginListObjects.pPrev = 0; m_endListObjects.pObj = 0; m_endListObjects.pNext = &m_beginListObjects; m_endListObjects.pPrev = 0; // reset all list entries for (i = 0; i < dependency_level; i += 1) { m_dependency[i].pObj = this; m_dependency[i].pNext = 0; m_dependency[i].pPrev = 0; } } protected: // Status of the preceding items the current object dependent on bool m_bStatusOk; // Pointer to a list of objects, which are dependent on the current object. MFX_DEPENDENCY_LIST_ITEM m_beginListObjects; MFX_DEPENDENCY_LIST_ITEM m_endListObjects; // Pointer to the next item in the corresponding dependency list MFX_DEPENDENCY_LIST_ITEM m_dependency[dependency_level]; }; #endif // __MFX_DEPENDENCY_ITEM_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include/mfx_scheduler_core.h000066400000000000000000000356331443134507600331400ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_SCHEDULER_CORE_H) #define __MFX_SCHEDULER_CORE_H #include #include #include #include #include #include #include "mfx_common.h" // set the following define to let the scheduler write log file // with all its activities. //#define MFX_SCHEDULER_LOG enum { // thread statistic is gathered within the following period of time (in msec). MFX_TIME_STAT_PERIOD = 2000, // the following const specifies how many parts periods time devided to MFX_TIME_STAT_PARTS = 4 }; enum { MFX_INVALID_THREAD_ID = -1 }; enum { MFX_THREAD_TIME_TO_WAIT = 1000 }; // forward declaration of the used classes struct MFX_SCHEDULER_TASK; struct MFX_THREAD_ASSIGNMENT; typedef struct MFX_DEPENDENCY_ITEM { // Pointer to an item to sync void *p; // Result of the sync operation mfxStatus mfxRes; // Pointer to the task producing the output MFX_SCHEDULER_TASK *pTask; } MFX_DEPENDENCY_ITEM; typedef struct MFX_THREADS_TIME { // Starting time stamp of the item mfxU64 startTime; // Overall working time for every priority mfxU64 time[MFX_PRIORITY_NUMBER]; } MFX_THREAD_TIME; typedef struct MFX_CALL_INFO { // Handle of the task mfxTaskHandle taskHandle; // Pointer to the entry point object const MFX_TASK *pTask; // Thread ordinal number for the current call mfxU32 threadNum; // Current call ordinal number mfxU32 callNum; // Status code of the task completion mfxStatus res; // Time stamp of task assignment mfxU64 timeStamp; // The time spent by the call mfxU64 timeSpend; } MFX_CALL_INFO; enum eWakeUpReason { // wake up threads without a visible reason MFX_SCHEDULER_NO_WAKEUP_REASON = 0, // new task came MFX_SCHEDULER_NEW_TASK = 1, // hardware buffer is completed MFX_SCHEDULER_HW_BUFFER_COMPLETED = 2 }; class mfxSchedulerCore : public MFXIScheduler2 { public: // Default constructor mfxSchedulerCore(void); // // MFXIScheduler interface // // Initialize the scheduler. Initialize the dependency tables and run threads. virtual mfxStatus Initialize(const MFX_SCHEDULER_PARAM *pParam = 0); virtual mfxStatus Initialize2(const MFX_SCHEDULER_PARAM2 *pParam = 0); // Add a new task to the scheduler. Threads start processing task immediately. virtual mfxStatus AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint); // Make synchronization, wait until task is done. virtual mfxStatus Synchronize(mfxSyncPoint syncPoint, mfxU32 timeToWait); // Wait until specified dependency become resolved virtual mfxStatus WaitForDependencyResolved(const void *pDependency); // Wait until all tasks of specified owner become complete or unattended virtual mfxStatus WaitForAllTasksCompletion(const void *pOwner); // Reset 'waiting' status for tasks of specified owner virtual mfxStatus ResetWaitingStatus(const void *pOwner); // Check the current status of the scheduler. virtual mfxStatus GetState(void); // Get the initialization parameters of the scheduler virtual mfxStatus GetParam(MFX_SCHEDULER_PARAM *pParam); // Recover from the failure. virtual mfxStatus Reset(void); // Send a performance message to the scheduler virtual mfxStatus AdjustPerformance(const mfxSchedulerMessage message); // Add a new task to the scheduler with extended source info. virtual mfxStatus AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint, const char *pFileName, int lineNumber); // // MFXIUnknown interface // // Query another interface from the object. If the pointer returned is not NULL, // the reference counter is incremented automatically. virtual void *QueryInterface(const MFX_GUID &guid); // Increment reference counter of the object. virtual void AddRef(void); // Decrement reference counter of the object. // If the counter is equal to zero, destructor is called and // object is removed from the memory. virtual void Release(void); // Get the current reference counter value virtual mfxU32 GetNumRef(void) const; // Entry point for external threads virtual mfxStatus DoWork(); //MFX_SCHEDULER_TASK is only one consumer void ResolveDependencyTable(MFX_SCHEDULER_TASK *pTask); // Notification to the scheduler that task got resolved dependencies void OnDependencyResolved(MFX_SCHEDULER_TASK *pTask); // WA for SINGLE THREAD MODE virtual mfxStatus GetTimeout(mfxU32 & maxTimeToRun); protected: // Destructor is protected to avoid deletion the object by occasion. virtual ~mfxSchedulerCore(void); // Release the object void Close(void); // Wait until the scheduler got more work void Wait(const mfxU32 curThreadNum, std::unique_lock& mutex); // Get high performance counter value. This counter is used to calculate // tasks duration and priority management. mfxU64 GetHighPerformanceCounter(void); // Get low-resolution counter. The timer is used for priority management // only. mfxU32 GetLowResCurrentTime(void); // Version of synchronize function, which uses handle mfxStatus Synchronize(mfxTaskHandle handle, mfxU32 timeToWait); // // WARNING: The functions below are not a thread-safe function, // external synchronization is required. // // Wake up requested number of dedicated and regular threads void WakeUpThreads( mfxU32 num_dedicated_threads = (mfxU32)-1, mfxU32 num_regular_threads = (mfxU32)-1); // Allocate the empty task mfxStatus AllocateEmptyTask(void); // Get the index in the occupancy table. The functions searches through // the table and return the index of the element tracking the same pState // as the task have. mfxStatus GetOccupancyTableIndex(mfxU32 &idx, const MFX_TASK *pTask); // Remove completed tasks to the 'free' queue void ScrubCompletedTasks(bool bComprehensive = false); // Register task outputs as dependencies. void RegisterTaskDependencies(MFX_SCHEDULER_TASK *pTask); // Recover the dependency table after failure void RecoverDependencyTable(const void *pDependency); // Get the priority of the task int GetTaskPriority(mfxTaskHandle task); // Get time statistic for the moment void GetTimeStat(mfxU64 timeSpent[MFX_PRIORITY_NUMBER], mfxU64 totalTimeSpent[MFX_PRIORITY_NUMBER]); // Check if the thread can continue the previous task. mfxStatus CanContinuePreviousTask(MFX_CALL_INFO &callInfo, mfxTaskHandle previousTask, const mfxU32 threadNum); // Check whether task is ready to run bool IsReadyToRun(MFX_SCHEDULER_TASK *pTask); // Wrap up the task into thread-friendly object, // check all dependencies and conditions. mfxStatus WrapUpTask(MFX_CALL_INFO &callInfo, MFX_SCHEDULER_TASK *pTask, const mfxU32 threadNum); inline void call_pRoutine(MFX_CALL_INFO& call); // // End of thread-unsafe functions declarations. // // Provide a task for an internal thread mfxStatus GetTask(MFX_CALL_INFO &callInfo, mfxTaskHandle previousTask, const mfxU32 threadNum); // Mark a piece of job completed by the thread void MarkTaskCompleted(const MFX_CALL_INFO *pCallInfo, const mfxU32 threadNum); // Reset 'waiting' state for tasks with given owner void ResetWaitingTasks(const void *pOwner); // Managing HW event counter functions inline void IncrementHWEventCounter(void); inline mfxU64 GetHWEventCounter(void) const; void PrintTaskInfo(void); void PrintTaskInfoUnsafe(void); // Sets scheduling for the specified thread bool SetScheduling(std::thread& handle); // Assign socket affinity for every thread void SetThreadsAffinityToSockets(void); inline MFX_SCHEDULER_THREAD_CONTEXT* GetThreadCtx(mfxU32 thread_id) { return &m_pThreadCtx[thread_id]; } // Invokes functor 'bool F(MFX_SCHEDULER_TASK*)' for every valid task that returns 'true' to continue iteration or 'false' to stop it. template void ForEachTaskWhile(F&& f) { MFX_SCHEDULER_TASK *task; for (int priority = MFX_PRIORITY_HIGH; priority >= MFX_PRIORITY_LOW; priority -= 1) { for (int type = MFX_TYPE_HARDWARE; type <= MFX_TYPE_SOFTWARE; type += 1) { task = m_pTasks[priority][type]; // run over the tasks with particular priority while (task) { if (false == std::forward(f)(task)) return; // advance the task pointer task = task->pNext; } } } } // Invokes functor 'void F(MFX_SCHEDULER_TASK*)' for every valid task template void ForEachTask(F&& f) { ForEachTaskWhile( [&f] (MFX_SCHEDULER_TASK *task) { std::forward(f)(task); return true; } ); } // Scheduler's initialization parameters MFX_SCHEDULER_PARAM2 m_param; // Reference counters mfxU32 m_refCounter; // Current time stamp mfxU64 m_currentTimeStamp; // Time wait period for 'waiting' tasks const mfxU64 m_timeWaitPeriod; // HW 'buffer done' event counter volatile mfxU64 m_hwEventCounter; // Working time statistic array MFX_THREADS_TIME m_workingTime[MFX_TIME_STAT_PARTS]; // Current time statistic index mfxU32 m_timeIdx; // // THREADING STUFF // // Initialize and start a wake up thread mfxStatus StartWakeUpThread(void); // Stop and terminate the wake up thread mfxStatus StopWakeUpThread(void); // 'quit' flag for threads volatile bool m_bQuit; volatile bool m_bQuitWakeUpThread; // Threads contexts MFX_SCHEDULER_THREAD_CONTEXT *m_pThreadCtx; // Condition variable to wait free task objects mfxU16 m_freeTasksCount; std::condition_variable m_freeTasks; // Handle to the wakeup thread std::thread m_hwWakeUpThread; // declare thread working routine void ThreadProc(MFX_SCHEDULER_THREAD_CONTEXT *pContext); void WakeupThreadProc(); // // TASKING STUFF // // Guard for task queues std::mutex m_guard; // array of task queues MFX_SCHEDULER_TASK *m_pTasks[MFX_PRIORITY_NUMBER][MFX_TYPE_NUMBER]; // Number of assigned tasks for each kind of tasks mfxU32 m_numAssignedTasks[MFX_PRIORITY_NUMBER]; // Queue of failed tasks MFX_SCHEDULER_TASK *m_pFailedTasks; // Number of tasks for the dedicated thread mfxU32 m_DedicatedThreadsToWakeUp; // Number of tasks for non-dedicated threads mfxU32 m_RegularThreadsToWakeUp; // these members are used only from the main thread, // so synchronization is not necessary to access them. // Table to get a task by handle value std::vector m_ppTaskLookUpTable; // Queue of available tasks MFX_SCHEDULER_TASK *m_pFreeTasks; // // DEPENDENCY STUFF // // Dependency table. // There are an index: it holds the number of values valid in the array. // The array may have larger size. std::vector m_pDependencyTable; volatile mfxU32 m_numDependencies; // Threads assignment table. std::vector m_occupancyTable; // Number of valid entries in the table. volatile mfxU32 m_numOccupancies; // Number of allocated task objects mfxU32 m_taskCounter; // Number of job submitted mfxU32 m_jobCounter; mfxU32 m_timer_hw_event; private: // declare a assignment operator to avoid warnings mfxSchedulerCore & operator = (mfxSchedulerCore &) { return *this; } mfxSchedulerCore(const mfxSchedulerCore &s); // No copy CTR }; inline void mfxSchedulerCore::IncrementHWEventCounter(void) { m_hwEventCounter += 1; } // void mfxSchedulerCore::IncrementHWEventCounter(void) inline mfxU64 mfxSchedulerCore::GetHWEventCounter(void) const { return m_hwEventCounter; } // mfxU64 mfxSchedulerCore::GetHWEventCounter(void) const inline void mfxSchedulerCore::call_pRoutine(MFX_CALL_INFO& call) { const char *pRoutineName = (call.pTask->entryPoint.pRoutineName)? call.pTask->entryPoint.pRoutineName: "MFX Async Task"; mfxU64 start; (void)pRoutineName; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, pRoutineName); MFX_LTRACE_1(MFX_TRACE_LEVEL_SCHED, "^Child^of", "%d", call.pTask->nParentId); // mark beginning of working period start = GetHighPerformanceCounter(); try { if (call.pTask->bObsoleteTask) { // NOTE: it is legacy task call, it should be eliminated soon call.res = call.pTask->entryPoint.pRoutine( call.pTask->entryPoint.pState, (void *) &call.pTask->obsolete_params, call.threadNum, call.callNum); } else { // NOTE: this is the only legal task calling process. // Should survive only this one. call.res = call.pTask->entryPoint.pRoutine( call.pTask->entryPoint.pState, call.pTask->entryPoint.pParam, call.threadNum, call.callNum); } } catch(...) { call.res = MFX_ERR_UNKNOWN; } call.timeSpend = (GetHighPerformanceCounter() - start); MFX_LTRACE_1(MFX_TRACE_LEVEL_SCHED, "mfxRes = ", "%d", call.res); } #endif // !defined(__MFX_SCHEDULER_CORE_H) mfx_scheduler_core_handle.h000066400000000000000000000037161443134507600343710ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_SCHEDULER_CORE_HANDLE_H) #define __MFX_SCHEDULER_CORE_HANDLE_H #include "vm_types.h" enum { MFX_BITS_FOR_HANDLE = 32, // declare constans for task objects MFX_BITS_FOR_TASK_NUM = 10, MFX_MAX_NUMBER_TASK = 1 << MFX_BITS_FOR_TASK_NUM, // declare constans for job objects MFX_BITS_FOR_JOB_NUM = MFX_BITS_FOR_HANDLE - MFX_BITS_FOR_TASK_NUM, MFX_MAX_NUMBER_JOB = 1 << MFX_BITS_FOR_JOB_NUM }; // Type mfxTaskHandle is a composite type, // which structure is close to a handle structure. // Few LSBs are used for internal task object indentification. // Rest bits are used to identify job. typedef union mfxTaskHandle { struct { unsigned int taskID : MFX_BITS_FOR_TASK_NUM; unsigned int jobID : MFX_BITS_FOR_JOB_NUM; }; size_t handle; } mfxTaskHandle; #endif // !defined(__MFX_SCHEDULER_CORE_HANDLE_H) mfx_scheduler_core_task.h000066400000000000000000000140761443134507600341010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined (__MFX_SCHEDULER_CORE_TASK_H) #define __MFX_SCHEDULER_CORE_TASK_H #include #include #include #include #include // forward declaration of used types struct MFX_SCHEDULER_TASK; class mfxSchedulerCore; struct MFX_THREAD_ASSIGNMENT { // Pointer to the object being shared among the threads/tasks void *pState; // Pointer to the routine being shared among the threads/tasks mfxTaskRoutine pRoutine; // Current thread assignment type mfxTaskThreadingPolicy threadingPolicy; // Number of tasks using this element of table mfxU32 m_numRefs; // Number of task being processed semultaneously mfxU32 taskOccupancy; // Current occupancy of the task(s) (number of threads entered inside) mfxU32 occupancy; // Occupied thread numbers mask mfxU64 threadMask; // Pointer to the last task using this pState. MFX_SCHEDULER_TASK *pLastTask; }; struct MFX_SCHEDULER_TASK : public mfxDependencyItem { // The constructor is disabled for precise resource control. // Declare a class what can create instances of tasks. friend class mfxSchedulerCore; // Reset the task into the initial state mfxStatus Reset(void); // Update the dependent object with the status of the parent object virtual void OnDependencyResolved(mfxStatus result); // wraps an optional call to pCompleteProc mfxStatus CompleteTask(mfxStatus res); // Release all allocated resources and decrement reference counters void ReleaseResources(void); // Ordinal task number. It doesn't grow during task lifetime. // This ID is used to access task tracking tables and lists. const mfxU32 taskID; // Job number. It is set to a new value, which is steadly growing, everytime // when task is assigned for a new piece of job. Sometimes jobID is accessed // without synchronization, so it is required not to cache it. volatile mfxU32 jobID; // task state variables // Waiting 'until task is done' object std::condition_variable done; // Final status of the current job volatile mfxStatus opRes; // Status of the last error/success processing. This status is copyied into // opRes variable, when the task is done and the last thread leaves the task. volatile mfxStatus curStatus; // make all task's parameters as a separate object // to make initialization easier. struct { // task describing parameters // Task's parameters MFX_TASK task; // Pointer to the thread occupancy table's entity MFX_THREAD_ASSIGNMENT *pThreadAssignment; // Current occupancy of the task (number of threads entered inside) mfxU32 occupancy; // Occupied threads bit mask mfxU64 threadMask; // Number of call of the task mfxU32 numberOfCalls; // task timing parameters bool bWaiting; // (bool) task needs some waiting struct { // Time in msec of the last 'entering' to the task mfxU64 timeLastEnter; // Time stamp of the last call issued mfxU64 timeLastCallIssued; // Time stamp of the last processed call result mfxU64 timeLastCallProcessed; // Integral time spend for the task mfxU64 timeSpent; // Time spend for false thread entering mfxU64 timeOverhead; // HW counter value of the last 'entering' to the task mfxU64 hwCounterLastEnter; } timing; // source file info struct { const char *pFileName; // (const char *) source file name, where task was spawn int lineNumber; // (int) source source file line number, where task was spawn } sourceInfo; // dependencies members struct { // Indicies in the dependency table of the generated outputs mfxU32 dstIdx[MFX_TASK_NUM_DEPENDENCIES]; } dependencies; } param; // Pointer to the next task MFX_SCHEDULER_TASK *pNext; // bad practice to get cross links, but this is how our scheduler designed mfxSchedulerCore *m_pSchedulerCore; protected: // Destructor is protected to avoid deletion the object by occasion. virtual ~MFX_SCHEDULER_TASK(void); private: // Constructor. Because scheduler's tasks is a limited resource, // prevent task creation on the stack. MFX_SCHEDULER_TASK(mfxU32 taskID, mfxSchedulerCore *m_pSchedulerCore); // Declare assignment operator to avoid // assignment of object by accident. MFX_SCHEDULER_TASK & operator = (MFX_SCHEDULER_TASK &); }; // Get the number of task allocated mfxU32 GetNumTaskAllocated(void); #endif // !defined (__MFX_SCHEDULER_CORE_TASK_H) mfx_scheduler_core_thread.h000066400000000000000000000042661443134507600344060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/include// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_SCHEDULER_CORE_THREAD_H #define __MFX_SCHEDULER_CORE_THREAD_H #include #include #include // forward declaration of the owning class class mfxSchedulerCore; struct MFX_SCHEDULER_THREAD_CONTEXT { MFX_SCHEDULER_THREAD_CONTEXT() : state(State::Waiting) , pSchedulerCore(NULL) , threadNum(0) , threadHandle() , workTime(0) , sleepTime(0) {} enum State { Waiting, // thread is waiting for incoming tasks Running // thread is executing a task }; State state; // thread state, waiting or running mfxSchedulerCore *pSchedulerCore; // pointer to the owning core mfxU32 threadNum; // thread number assigned by the core std::thread threadHandle; // thread handle std::condition_variable taskAdded; // cond. variable to signal new tasks mfxU64 workTime; // integral working time mfxU64 sleepTime; // integral sleeping time }; #endif // #ifndef __MFX_SCHEDULER_CORE_THREAD_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src/000077500000000000000000000000001443134507600262615ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src/mfx_scheduler_core.cpp000066400000000000000000000373541443134507600326410ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include mfxSchedulerCore::mfxSchedulerCore(void) : m_currentTimeStamp(0) // since on Linux we have blocking synchronization which means an absence of polling, // there is no need to use 'waiting' time period. , m_timeWaitPeriod(0) , m_hwWakeUpThread() , m_DedicatedThreadsToWakeUp(0) , m_RegularThreadsToWakeUp(0) { memset(&m_param, 0, sizeof(m_param)); m_refCounter = 1; memset(m_workingTime, 0, sizeof(m_workingTime)); m_timeIdx = 0; m_bQuit = false; m_pThreadCtx = NULL; // reset task variables memset(m_pTasks, 0, sizeof(m_pTasks)); memset(m_numAssignedTasks, 0, sizeof(m_numAssignedTasks)); m_pFailedTasks = NULL; m_pFreeTasks = NULL; // reset dependency table variables m_numDependencies = 0; // reset busy objects table m_numOccupancies = 0; // reset task counters m_taskCounter = 0; m_freeTasksCount = 0; m_jobCounter = 0; m_hwEventCounter = 0; m_timer_hw_event = MFX_THREAD_TIME_TO_WAIT; // set number of free tasks m_freeTasksCount = MFX_MAX_NUMBER_TASK; } // mfxSchedulerCore::mfxSchedulerCore(void) mfxSchedulerCore::~mfxSchedulerCore(void) { Close(); } // mfxSchedulerCore::~mfxSchedulerCore(void) bool mfxSchedulerCore::SetScheduling(std::thread& handle) { (void)handle; if (m_param.params.SchedulingType || m_param.params.Priority) { if (handle.joinable()) { struct sched_param param{}; param.sched_priority = m_param.params.Priority; return !pthread_setschedparam(handle.native_handle(), m_param.params.SchedulingType, ¶m); } } return true; } void mfxSchedulerCore::SetThreadsAffinityToSockets(void) { } void mfxSchedulerCore::Close(void) { StopWakeUpThread(); // stop threads if (m_pThreadCtx) { mfxU32 i; // set the 'quit' flag for threads m_bQuit = true; { // set the events to wake up sleeping threads std::lock_guard guard(m_guard); WakeUpThreads(); } for (i = 0; i < m_param.numberOfThreads; i += 1) { // wait for particular thread if (m_pThreadCtx[i].threadHandle.joinable()) m_pThreadCtx[i].threadHandle.join(); } delete[] m_pThreadCtx; } // run over the task lists and abort the existing tasks ForEachTask( [](MFX_SCHEDULER_TASK* task) { if (MFX_TASK_WORKING == task->curStatus) { task->CompleteTask(MFX_ERR_ABORTED); } } ); // delete task objects for (auto & it : m_ppTaskLookUpTable) { delete it; it = nullptr; } memset(&m_param, 0, sizeof(m_param)); memset(m_workingTime, 0, sizeof(m_workingTime)); m_timeIdx = 0; // reset variables m_bQuit = false; m_pThreadCtx = NULL; // reset task variables memset(m_pTasks, 0, sizeof(m_pTasks)); memset(m_numAssignedTasks, 0, sizeof(m_numAssignedTasks)); m_pFailedTasks = NULL; m_pFreeTasks = NULL; // reset dependency table variables m_numDependencies = 0; // reset busy objects table m_numOccupancies = 0; // reset task counters m_taskCounter = 0; m_jobCounter = 0; } void mfxSchedulerCore::WakeUpThreads(mfxU32 num_dedicated_threads, mfxU32 num_regular_threads) { if (m_param.flags == MFX_SINGLE_THREAD) return; MFX_SCHEDULER_THREAD_CONTEXT* thctx; if (num_dedicated_threads) { // we have single dedicated thread, thus no loop here thctx = GetThreadCtx(0); if (thctx->state == MFX_SCHEDULER_THREAD_CONTEXT::Waiting) { thctx->taskAdded.notify_one(); } } // if we have woken up dedicated thread, we exclude it from the loop below for (mfxU32 i = (num_dedicated_threads)? 1: 0; (i < m_param.numberOfThreads) && num_regular_threads; ++i) { thctx = GetThreadCtx(i); if (thctx->state == MFX_SCHEDULER_THREAD_CONTEXT::Waiting) { thctx->taskAdded.notify_one(); --num_regular_threads; } } } void mfxSchedulerCore::Wait(const mfxU32 curThreadNum, std::unique_lock& mutex) { MFX_SCHEDULER_THREAD_CONTEXT* thctx = GetThreadCtx(curThreadNum); if (thctx) { thctx->taskAdded.wait(mutex); } } mfxU64 mfxSchedulerCore::GetHighPerformanceCounter(void) { return (mfxU64) std::chrono::time_point_cast(std::chrono::steady_clock::now()).time_since_epoch().count(); } // mfxU64 mfxSchedulerCore::GetHighPerformanceCounter(void) mfxU32 mfxSchedulerCore::GetLowResCurrentTime(void) { return (mfxU32)std::chrono::time_point_cast(std::chrono::steady_clock::now()).time_since_epoch().count(); } // mfxU32 mfxSchedulerCore::GetCurrentTime(void) mfxStatus mfxSchedulerCore::AllocateEmptyTask(void) { // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // // Clean up task queues ScrubCompletedTasks(); // allocate one new task if (nullptr == m_pFreeTasks) { // the maximum allowed number of tasks is reached if (MFX_MAX_NUMBER_TASK <= m_taskCounter) { return MFX_WRN_DEVICE_BUSY; } // allocate one more task try { m_pFreeTasks = new MFX_SCHEDULER_TASK(m_taskCounter++, this); } catch(...) { return MFX_WRN_DEVICE_BUSY; } // register the task in the look up table m_ppTaskLookUpTable[m_pFreeTasks->taskID] = m_pFreeTasks; } memset(&(m_pFreeTasks->param), 0, sizeof(m_pFreeTasks->param)); // increment job number. This number must grow evenly. // make job number 0 an invalid value to avoid problem with // task number 0 with job number 0, which are NULL when being combined. m_jobCounter += 1; if (MFX_MAX_NUMBER_JOB <= m_jobCounter) { m_jobCounter = 1; } m_pFreeTasks->jobID = m_jobCounter; return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::AllocateEmptyTask(void) mfxStatus mfxSchedulerCore::GetOccupancyTableIndex(mfxU32 &idx, const MFX_TASK *pTask) { mfxU32 i = 0; MFX_THREAD_ASSIGNMENT *pAssignment = NULL; // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // // check the table, decrement the number of used entries while ((m_numOccupancies) && (0 == m_occupancyTable[m_numOccupancies - 1].m_numRefs)) { m_numOccupancies -= 1; } // find the existing element with the given pState and pRoutine for (i = 0; i < m_numOccupancies; i += 1) { if ((m_occupancyTable[i].pState == pTask->entryPoint.pState) && (m_occupancyTable[i].pRoutine == pTask->entryPoint.pRoutine)) { // check the type of other tasks using this table entry if (m_occupancyTable[i].threadingPolicy != pTask->threadingPolicy) { return MFX_ERR_INVALID_VIDEO_PARAM; } pAssignment = &(m_occupancyTable[i]); break; } } // if the element exist, check the parameters for compatibility if (pAssignment) { // actually, there is nothing to do } // allocate one more element in the array else { for (i = 0; i < m_numOccupancies; i += 1) { if (0 == m_occupancyTable[i].m_numRefs) { break; } } // we can't reallocate the table if (m_occupancyTable.size() == i) { return MFX_WRN_DEVICE_BUSY; } pAssignment = &(m_occupancyTable[i]); // fill the parameters memset(pAssignment, 0, sizeof(MFX_THREAD_ASSIGNMENT)); pAssignment->pState = pTask->entryPoint.pState; pAssignment->pRoutine = pTask->entryPoint.pRoutine; pAssignment->threadingPolicy = pTask->threadingPolicy; } // update the number of allocated objects m_numOccupancies = std::max(mfxU32(m_numOccupancies), i + 1); // save the index to return idx = i; return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::GetOccupancyTableIndex(mfxU32 &idx, void mfxSchedulerCore::ScrubCompletedTasks(bool bComprehensive) { int priority; // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // for (priority = MFX_PRIORITY_HIGH; priority >= MFX_PRIORITY_LOW; priority -= 1) { int type; for (type = MFX_TYPE_HARDWARE; type <= MFX_TYPE_SOFTWARE; type += 1) { MFX_SCHEDULER_TASK **ppCur; // if there is an empty task, immediately return if ((false == bComprehensive) && (m_pFreeTasks)) { return; } ppCur = m_pTasks[priority] + type; while (*ppCur) { // move task completed to the 'free' queue. if (MFX_ERR_NONE == (*ppCur)->opRes) { MFX_SCHEDULER_TASK *pTemp; // cut the task from the queue pTemp = *ppCur; *ppCur = pTemp->pNext; // add it to the 'free' queue pTemp->pNext = m_pFreeTasks; m_pFreeTasks = pTemp; } // move task failed to the 'failed' queue. else if ((MFX_ERR_NONE != (*ppCur)->opRes) && (MFX_WRN_IN_EXECUTION != (*ppCur)->opRes)) { MFX_SCHEDULER_TASK *pTemp; // cut the task from the queue pTemp = *ppCur; *ppCur = pTemp->pNext; // add it to the 'failed' queue pTemp->pNext = m_pFailedTasks; m_pFailedTasks = pTemp; } else { // set the next task ppCur = &((*ppCur)->pNext); } } } } } // void mfxSchedulerCore::ScrubCompletedTasks(bool bComprehensive) void mfxSchedulerCore::RegisterTaskDependencies(MFX_SCHEDULER_TASK *pTask) { mfxU32 i, tableIdx, remainInputs; const void *pSrcCopy[MFX_TASK_NUM_DEPENDENCIES]; mfxStatus taskRes = MFX_WRN_IN_EXECUTION; // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // // check if the table have empty position(s), // If so decrement the index of the last table entry. if (m_pDependencyTable.size() > m_numDependencies) { auto it = std::find_if(m_pDependencyTable.rend() - m_numDependencies, m_pDependencyTable.rend(), [](const MFX_DEPENDENCY_ITEM & item){ return item.p != nullptr; }); m_numDependencies = m_pDependencyTable.rend() - it; } // get the number of source dependencies remainInputs = 0; for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) { // make a copy of source dependencies. // source dependencies have to be swept, because of duplication in // the dependency table. task will sync on the first matching entry. pSrcCopy[i] = pTask->param.task.pSrc[i]; if (pSrcCopy[i]) { remainInputs += 1; } } // run over the table and save the handles of incomplete inputs for (tableIdx = 0; tableIdx < m_numDependencies; tableIdx += 1) { // compare only filled table entries if (m_pDependencyTable[tableIdx].p) { for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) { // we found the source dependency, // save the handle if (m_pDependencyTable[tableIdx].p == pSrcCopy[i]) { // dependency is fail. The dependency resolved, but failed. if (MFX_WRN_IN_EXECUTION != m_pDependencyTable[tableIdx].mfxRes) { // waiting task inherits status from the parent task // need to propogate error status to all dependent tasks. //if (MFX_TASK_WAIT & pTask->param.task.threadingPolicy) { taskRes = m_pDependencyTable[tableIdx].mfxRes; } //// all other tasks are aborted //else //{ // taskRes = MFX_ERR_ABORTED; //} } // link dependency else { m_pDependencyTable[tableIdx].pTask->SetDependentItem(pTask, i); } // sweep already used dependency pSrcCopy[i] = NULL; remainInputs -= 1; break; } } // is there more source dependencies? if (0 == remainInputs) { break; } } } // run over the table and register generated outputs tableIdx = 0; for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) { if (pTask->param.task.pDst[i]) { // find empty table entry while (m_pDependencyTable.at(tableIdx).p) { tableIdx += 1; } // save the generated dependency m_pDependencyTable[tableIdx].p = pTask->param.task.pDst[i]; m_pDependencyTable[tableIdx].mfxRes = taskRes; m_pDependencyTable[tableIdx].pTask = pTask; // save the index of the output pTask->param.dependencies.dstIdx[i] = tableIdx; tableIdx += 1; } } // update the dependency table max index if (tableIdx >= m_numDependencies) { m_numDependencies = tableIdx; } // if dependency were failed, // set the task into the 'aborted' state if (MFX_WRN_IN_EXECUTION != taskRes) { // save the status m_pFreeTasks->curStatus = taskRes; m_pFreeTasks->opRes = taskRes; m_pFreeTasks->done.notify_all(); } } // void mfxSchedulerCore::RegisterTaskDependencies(MFX_SCHEDULER_TASK *pTask) //#define ENABLE_TASK_DEBUG void mfxSchedulerCore::PrintTaskInfo(void) { } // void mfxSchedulerCore::PrintTaskInfo(void) void mfxSchedulerCore::PrintTaskInfoUnsafe(void) { } // void mfxSchedulerCore::PrintTaskInfoUnsafe(void) mfx_scheduler_core_ischeduler.cpp000066400000000000000000000443161443134507600347650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include #include enum { MFX_TIME_INFINITE = 0x7fffffff, MFX_TIME_TO_WAIT = 5 }; mfxStatus mfxSchedulerCore::Initialize(const MFX_SCHEDULER_PARAM *pParam) { MFX_SCHEDULER_PARAM2 param2; memset(¶m2, 0, sizeof(param2)); if (pParam) { MFX_SCHEDULER_PARAM* casted_param2 = ¶m2; *casted_param2 = *pParam; } if (!param2.numberOfThreads) { // that's just in case: core, which calls scheduler, is doing // exactly the same what we are doing below param2.numberOfThreads = std::thread::hardware_concurrency(); } return Initialize2(¶m2); } mfxStatus mfxSchedulerCore::Initialize2(const MFX_SCHEDULER_PARAM2 *pParam) { mfxU32 i; // release the object before initialization Close(); // save the parameters if (pParam) { m_param = *pParam; } // clean up the task look up table m_ppTaskLookUpTable.resize(MFX_MAX_NUMBER_TASK, nullptr); // allocate the dependency table m_pDependencyTable.resize(MFX_MAX_NUMBER_TASK * 2, MFX_DEPENDENCY_ITEM()); // allocate the thread assignment object table. // its size should be equal to the number of task, // larger table is not required. m_occupancyTable.resize(MFX_MAX_NUMBER_TASK, MFX_THREAD_ASSIGNMENT()); if (MFX_SINGLE_THREAD != m_param.flags) { if (m_param.numberOfThreads && m_param.params.NumThread) { // use user-overwritten number of threads m_param.numberOfThreads = m_param.params.NumThread; } if (!m_param.numberOfThreads) { return MFX_ERR_UNSUPPORTED; } if (m_param.numberOfThreads == 1) { // we need at least 2 threads to avoid dead locks return MFX_ERR_UNSUPPORTED; } try { // allocate thread contexts m_pThreadCtx = new MFX_SCHEDULER_THREAD_CONTEXT[m_param.numberOfThreads]; // start threads for (i = 0; i < m_param.numberOfThreads; i += 1) { // prepare context m_pThreadCtx[i].threadNum = i; m_pThreadCtx[i].pSchedulerCore = this; // spawn a thread m_pThreadCtx[i].threadHandle = std::thread( std::bind(&mfxSchedulerCore::ThreadProc, this, &m_pThreadCtx[i])); if (!SetScheduling(m_pThreadCtx[i].threadHandle)) { return MFX_ERR_UNSUPPORTED; } } } catch (...) { return MFX_ERR_MEMORY_ALLOC; } SetThreadsAffinityToSockets(); } else { // to run HW listen thread. Will be enabled if tests are OK } return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::Initialize(mfxSchedulerFlags flags, mfxU32 numberOfThreads) mfxStatus mfxSchedulerCore::AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint) { return AddTask(task, pSyncPoint, NULL, 0); } // mfxStatus mfxSchedulerCore::AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint) mfxStatus mfxSchedulerCore::Synchronize(mfxSyncPoint syncPoint, mfxU32 timeToWait) { mfxTaskHandle handle; mfxStatus mfxRes; // check error(s) if (NULL == syncPoint) { return MFX_ERR_NULL_PTR; } // cast the pointer to handle and make syncing handle.handle = (size_t) syncPoint; // waiting on task's handle mfxRes = Synchronize(handle, timeToWait); return mfxRes; } // mfxStatus mfxSchedulerCore::Synchronize(mfxSyncPoint syncPoint, mfxU32 timeToWait) mfxStatus mfxSchedulerCore::Synchronize(mfxTaskHandle handle, mfxU32 timeToWait) { // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } // look up the task MFX_SCHEDULER_TASK *pTask = m_ppTaskLookUpTable.at(handle.taskID); if (nullptr == pTask) { return MFX_ERR_NULL_PTR; } PERF_UTILITY_SET_ASYNC_TASK_ID(pTask->param.task.nTaskId); if (MFX_SINGLE_THREAD == m_param.flags) { //let really run task to MFX_CALL_INFO call = {}; mfxTaskHandle previousTaskHandle = {}; mfxStatus task_sts = MFX_ERR_NONE; mfx::TimerMs timer((mfxU64)timeToWait * 1000); while (MFX_WRN_IN_EXECUTION == pTask->opRes) { std::unique_lock guard(m_guard); task_sts = GetTask(call, previousTaskHandle, 0); if (task_sts != MFX_ERR_NONE) continue; guard.unlock(); call.res = call.pTask->entryPoint.pRoutine(call.pTask->entryPoint.pState, call.pTask->entryPoint.pParam, call.threadNum, call.callNum); guard.lock(); // save the previous task's handle previousTaskHandle = call.taskHandle; MarkTaskCompleted(&call, 0); if (timer.Expired()) break; if (MFX_TASK_DONE!= call.res) { IncrementHWEventCounter(); } } // // inspect the task // // the handle is outdated, // the previous task job is over and completed with successful status // NOTE: it make sense to read task result and job ID the following order. if ((MFX_ERR_NONE == pTask->opRes) || (pTask->jobID != handle.jobID)) { return MFX_ERR_NONE; } // wait the result on the event if (MFX_WRN_IN_EXECUTION == pTask->opRes) { return MFX_WRN_IN_EXECUTION; } // check error status if ((MFX_ERR_NONE != pTask->opRes) && (pTask->jobID == handle.jobID)) { return pTask->opRes; } // in all other cases task is complete return MFX_ERR_NONE; } else { std::unique_lock guard(m_guard); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_PRIVATE, "Scheduler::Wait"); MFX_LTRACE_1(MFX_TRACE_LEVEL_SCHED, "^Depends^on", "%d", pTask->param.task.nParentId); MFX_LTRACE_I(MFX_TRACE_LEVEL_SCHED, timeToWait); pTask->done.wait_for(guard, std::chrono::milliseconds(timeToWait), [pTask, handle] { return (pTask->jobID != handle.jobID) || (MFX_WRN_IN_EXECUTION != pTask->opRes); }); if (pTask->jobID == handle.jobID) { return pTask->opRes; } else { /* Notes: * - task executes next job already, we _lost_ task status and can only assume that * everything was OK or FAILED, we will assume that task succeeded */ return MFX_ERR_NONE; } } } mfxStatus mfxSchedulerCore::GetTimeout(mfxU32& maxTimeToRun) { (void)maxTimeToRun; return MFX_ERR_UNSUPPORTED; } mfxStatus mfxSchedulerCore::WaitForDependencyResolved(const void *pDependency) { mfxTaskHandle waitHandle = {}; bool bFind = false; // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } if (NULL == pDependency) { return MFX_ERR_NONE; } // find a handle to wait { std::lock_guard guard(m_guard); mfxU32 curIdx; for (curIdx = 0; curIdx < m_numDependencies; curIdx += 1) { if (m_pDependencyTable.at(curIdx).p == pDependency) { // get the handle before leaving protected section waitHandle.taskID = m_pDependencyTable[curIdx].pTask->taskID; waitHandle.jobID = m_pDependencyTable[curIdx].pTask->jobID; // handle is found, go to wait bFind = true; break; } } // leave the protected section } // the dependency is still in the table, // wait until it leaves the table. if (bFind) { return Synchronize(waitHandle, MFX_TIME_INFINITE); } return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::WaitForDependencyResolved(const void *pDependency) mfxStatus mfxSchedulerCore::WaitForAllTasksCompletion(const void *pOwner) { // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } if (NULL == pOwner) { return MFX_ERR_NULL_PTR; } // make sure that threads are running { std::lock_guard guard(m_guard); ResetWaitingTasks(pOwner); WakeUpThreads(); } std::list tasks; { std::lock_guard guard(m_guard); ForEachTask( [&pOwner, &tasks](MFX_SCHEDULER_TASK* task) { //make a list of all 'active' tasks of given owner if ((task->param.task.pOwner == pOwner) && (MFX_WRN_IN_EXECUTION == task->opRes)) { mfxTaskHandle waitHandle; waitHandle.taskID = task->taskID; waitHandle.jobID = task->jobID; tasks.emplace_back(waitHandle); } } ); } auto handle = tasks.begin(); while (!tasks.empty()) { if (tasks.end() == handle) handle = tasks.begin(); // wait for a while // for a while and infinite are different things if (MFX_WRN_IN_EXECUTION == Synchronize(*handle, MFX_TIME_TO_WAIT)) // Still working { handle++; } else // Done or failed { handle = tasks.erase(handle); } } return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::WaitForAllTasksCompletion(const void *pOwner) mfxStatus mfxSchedulerCore::ResetWaitingStatus(const void *pOwner) { // reset 'waiting' tasks belong to the given state ResetWaitingTasks(pOwner); std::lock_guard guard(m_guard); // wake up sleeping threads WakeUpThreads(); return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::ResetWaitingStatus(const void *pOwner) mfxStatus mfxSchedulerCore::GetState(void) { // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::GetState(void) mfxStatus mfxSchedulerCore::GetParam(MFX_SCHEDULER_PARAM *pParam) { // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } if (NULL == pParam) { return MFX_ERR_NULL_PTR; } // copy the parameters *pParam = m_param; return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::GetParam(MFX_SCHEDULER_PARAM *pParam) mfxStatus mfxSchedulerCore::Reset(void) { // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } if (NULL == m_pFailedTasks) { return MFX_ERR_NONE; } // enter guarded section { std::lock_guard guard(m_guard); // clean up the working queue ScrubCompletedTasks(true); } return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::Reset(void) mfxStatus mfxSchedulerCore::AdjustPerformance(const mfxSchedulerMessage message) { mfxStatus mfxRes = MFX_ERR_NONE; // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } switch(message) { // reset the scheduler to the performance default state case MFX_SCHEDULER_RESET_TO_DEFAULTS: break; case MFX_SCHEDULER_START_HW_LISTENING: if (m_param.flags != MFX_SINGLE_THREAD) { mfxRes = StartWakeUpThread(); } break; case MFX_SCHEDULER_STOP_HW_LISTENING: if (m_param.flags != MFX_SINGLE_THREAD) { mfxRes = StopWakeUpThread(); } break; // unknown message default: mfxRes = MFX_ERR_UNKNOWN; break; } return mfxRes; } // mfxStatus mfxSchedulerCore::AdjustPerformance(const mfxSchedulerMessage message) mfxStatus mfxSchedulerCore::AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint, const char *pFileName, int lineNumber) { #ifdef MFX_TRACE_ENABLE MFX_LTRACE_1(MFX_TRACE_LEVEL_SCHED, "^Enqueue^", "%d", task.nTaskId); #endif // check error(s) if (0 == m_param.numberOfThreads) { return MFX_ERR_NOT_INITIALIZED; } if ((NULL == task.entryPoint.pRoutine) || (NULL == pSyncPoint)) { return MFX_ERR_NULL_PTR; } // enter protected section { std::unique_lock guard(m_guard); // make sure that there is enough free task objects m_freeTasks.wait(guard, [this](){return m_freeTasksCount > 0;}); --m_freeTasksCount; mfxStatus mfxRes; MFX_SCHEDULER_TASK *pTask, **ppTemp; mfxTaskHandle handle = {}; MFX_THREAD_ASSIGNMENT *pAssignment = nullptr; mfxU32 occupancyIdx; int type; // Make sure that there is an empty task object mfxRes = AllocateEmptyTask(); if (MFX_ERR_NONE != mfxRes) { // better to return error instead of WRN (two-tasks per component scheme) return MFX_ERR_MEMORY_ALLOC; } // initialize the task m_pFreeTasks->ResetDependency(); mfxRes = m_pFreeTasks->Reset(); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } m_pFreeTasks->param.task = task; mfxRes = GetOccupancyTableIndex(occupancyIdx, &task); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } if (m_occupancyTable.size() <= occupancyIdx) { return MFX_ERR_UNDEFINED_BEHAVIOR; } pAssignment = &(m_occupancyTable[occupancyIdx]); // update the thread assignment parameters if (MFX_TASK_INTRA & task.threadingPolicy) { // last entries in the dependency arrays must be empty if ((m_pFreeTasks->param.task.pSrc[MFX_TASK_NUM_DEPENDENCIES - 1]) || (m_pFreeTasks->param.task.pDst[MFX_TASK_NUM_DEPENDENCIES - 1])) { return MFX_ERR_INVALID_VIDEO_PARAM; } // fill INTRA task dependencies m_pFreeTasks->param.task.pSrc[MFX_TASK_NUM_DEPENDENCIES - 1] = pAssignment->pLastTask; m_pFreeTasks->param.task.pDst[MFX_TASK_NUM_DEPENDENCIES - 1] = m_pFreeTasks; // update the last intra task pointer pAssignment->pLastTask = m_pFreeTasks; } // do not save the pointer to thread assigment instance // until all checking have been done m_pFreeTasks->param.pThreadAssignment = pAssignment; pAssignment->m_numRefs += 1; // saturate the number of available threads uint32_t numThreads = m_pFreeTasks->param.task.entryPoint.requiredNumThreads; numThreads = (0 == numThreads) ? m_param.numberOfThreads : numThreads; numThreads = std::min({m_param.numberOfThreads, numThreads, sizeof(pAssignment->threadMask) * 8}); m_pFreeTasks->param.task.entryPoint.requiredNumThreads = numThreads; // set the advanced task's info m_pFreeTasks->param.sourceInfo.pFileName = pFileName; m_pFreeTasks->param.sourceInfo.lineNumber = lineNumber; // set the sync point for the task handle.handle = 0; handle.taskID = m_pFreeTasks->taskID; handle.jobID = m_pFreeTasks->jobID; *pSyncPoint = (mfxSyncPoint) handle.handle; // Register task dependencies RegisterTaskDependencies(m_pFreeTasks); // // move task to the corresponding task // // remove the task from the 'free' queue pTask = m_pFreeTasks; m_pFreeTasks = m_pFreeTasks->pNext; pTask->pNext = NULL; // find the end of the corresponding queue type = (task.threadingPolicy & MFX_TASK_DEDICATED) ? (MFX_TYPE_HARDWARE) : (MFX_TYPE_SOFTWARE); ppTemp = m_pTasks[task.priority] + type; while (*ppTemp) { ppTemp = &((*ppTemp)->pNext); } // add the task to the end of the corresponding queue *ppTemp = pTask; // reset all 'waiting' tasks to prevent freezing // so called 'permanent' tasks. ResetWaitingTasks(pTask->param.task.pOwner); mfxU32 num_hw_threads = 0, num_sw_threads = 0; // increment the number of available tasks if (MFX_TASK_DEDICATED & task.threadingPolicy) { num_hw_threads = numThreads; } else { num_sw_threads = numThreads; } // wake up working threads if task has resolved dependencies if (IsReadyToRun(pTask)) { WakeUpThreads(num_hw_threads, num_sw_threads); } // leave the protected section } return MFX_ERR_NONE; } mfxStatus mfxSchedulerCore::DoWork() { return MFX_ERR_UNSUPPORTED; } // mfxStatus mfxSchedulerCore::DoWork() mfx_scheduler_core_iunknown.cpp000066400000000000000000000054511443134507600345030ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include void *mfxSchedulerCore::QueryInterface(const MFX_GUID &guid) { // Specific interface is required if (MFXIScheduler_GUID == guid) { // increment reference counter vm_interlocked_inc32(&m_refCounter); return (MFXIScheduler *) this; } if (MFXIScheduler2_GUID == guid) { // increment reference counter vm_interlocked_inc32(&m_refCounter); return (MFXIScheduler2 *) this; } // it is unsupported interface return NULL; } // void *mfxSchedulerCore::QueryInterface(const MFX_GUID &guid) void mfxSchedulerCore::AddRef(void) { // increment reference counter vm_interlocked_inc32(&m_refCounter); } // void mfxSchedulerCore::AddRef(void) void mfxSchedulerCore::Release(void) { // decrement reference counter vm_interlocked_dec32(&m_refCounter); if (0 == m_refCounter) { delete this; } } // void mfxSchedulerCore::Release(void) mfxU32 mfxSchedulerCore::GetNumRef(void) const { return m_refCounter; } // mfxU32 mfxSchedulerCore::GetNumRef(void) const //explicit specification of interface creation template<> MFXIScheduler* CreateInterfaceInstance(const MFX_GUID &guid) { if (MFXIScheduler_GUID == guid) return (MFXIScheduler*) (new mfxSchedulerCore); return NULL; } //template<> MFXIScheduler* CreateInterfaceInstance() template<> MFXIScheduler2* CreateInterfaceInstance(const MFX_GUID &guid) { if (MFXIScheduler2_GUID == guid) return (MFXIScheduler2*)(new mfxSchedulerCore); return NULL; } //template<> MFXIScheduler* CreateInterfaceInstance()oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src/mfx_scheduler_core_task.cpp000066400000000000000000000073501443134507600336540ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include MFX_SCHEDULER_TASK::MFX_SCHEDULER_TASK(mfxU32 taskID, mfxSchedulerCore *pSchedulerCore) : taskID(taskID), jobID(0), pNext(NULL), m_pSchedulerCore(pSchedulerCore) { // reset task parameters memset(¶m, 0, sizeof(param)); } MFX_SCHEDULER_TASK::~MFX_SCHEDULER_TASK(void) {} mfxStatus MFX_SCHEDULER_TASK::Reset(void) { // reset task parameters memset(¶m, 0, sizeof(param)); opRes = MFX_WRN_IN_EXECUTION; curStatus = MFX_TASK_WORKING; return MFX_ERR_NONE; } // mfxStatus MFX_SCHEDULER_TASK::Reset(void) void MFX_SCHEDULER_TASK::OnDependencyResolved(mfxStatus result) { if (isFailed(result)) { // waiting task inherits status from the parent task // need to propogate error status to all dependent tasks. //if (MFX_TASK_WAIT & param.task.threadingPolicy) { opRes = result; curStatus = result; } // all other tasks are aborted //else //{ // opRes = MFX_ERR_ABORTED; // curStatus = MFX_ERR_ABORTED; //} // need to update dependency table for all tasks dependent from failed m_pSchedulerCore->ResolveDependencyTable(this); done.notify_all(); // release the current task resources ReleaseResources(); CompleteTask(MFX_ERR_ABORTED); } else { // Notify the scheduler that task got resolved dependencies. // Scheduler will reevaluate whether it needs to wake up threads to // handle this task. m_pSchedulerCore->OnDependencyResolved(this); } // call the parent's method mfxDependencyItem::OnDependencyResolved(result); } mfxStatus MFX_SCHEDULER_TASK::CompleteTask(mfxStatus res) { mfxStatus sts; MFX_ENTRY_POINT &entryPoint = param.task.entryPoint; if (!entryPoint.pCompleteProc) return MFX_ERR_NONE; try { // release the component's resources sts = entryPoint.pCompleteProc( entryPoint.pState, entryPoint.pParam, res); } catch(...) { sts = MFX_ERR_UNKNOWN; } return sts; } void MFX_SCHEDULER_TASK::ReleaseResources(void) { if (param.pThreadAssignment) { param.pThreadAssignment->m_numRefs -= 1; if (param.pThreadAssignment->pLastTask == this) { param.pThreadAssignment->pLastTask = NULL; } } // thread assignment info is not required for the task any more param.pThreadAssignment = NULL; } // void MFX_SCHEDULER_TASK::ReleaseResources(void) mfx_scheduler_core_task_management.cpp000066400000000000000000000464571443134507600360040ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include // declare the static section of the file namespace { const int TaskPriorityRatio[MFX_PRIORITY_NUMBER] = { // MFX_PRIORITY_LOW tasks utilize 100% of CPU power, which is left // unitilized by higher priority tasks. 100, // MFX_PRIORITY_NORMAL tasks utilize 75% of CPU power, which is left // unitilized by MFX_PRIORITY_REALTIME priority tasks. 75, // MFX_PRIORITY_HIGH tasks try to utilize 100% of CPU power, // if it has enough to do. 100 }; enum { // waiting tasks are examined every 1 msec MFX_WAIT_TIME_MS = 1 }; } // namespace int mfxSchedulerCore::GetTaskPriority(mfxTaskHandle task) { int taskPriority = -1; // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // const MFX_SCHEDULER_TASK *pTask = m_ppTaskLookUpTable.at(task.taskID); if ((pTask) && (pTask->jobID == task.jobID) && (MFX_TASK_WORKING == pTask->curStatus)) { taskPriority = pTask->param.task.priority; } return taskPriority; } // int mfxSchedulerCore::GetTaskPriority(mfxTaskHandle task) void mfxSchedulerCore::GetTimeStat(mfxU64 timeSpent[MFX_PRIORITY_NUMBER], mfxU64 totalTimeSpent[MFX_PRIORITY_NUMBER]) { int priority; // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // for (priority = MFX_PRIORITY_LOW; priority < MFX_PRIORITY_NUMBER; priority += 1) { mfxU32 i; totalTimeSpent[priority] = 0; timeSpent[priority] = 0; for (i = 0; i < MFX_TIME_STAT_PARTS; i += 1) { int other; // fill the time spent by threads with given priority timeSpent[priority] += m_workingTime[i].time[priority]; // fill the time spend by threads with given or lowere priority for (other = MFX_PRIORITY_LOW; other <= priority; other += 1) { totalTimeSpent[priority] += m_workingTime[i].time[other]; } } } } // void mfxSchedulerCore::GetTimeStat(mfxU64 totalTimeSpent[MFX_PRIORITY_NUMBER], enum { // on the first run when the scheduler tries to get a task, // it tries to keep tasks prioirties. PRIORITY_RUN = 0, // on the second run the scheduler tries to get any 'ready' task, // ignoring priority. REGULAR_RUN = 1, NUMBER_OF_RUNS }; mfxStatus mfxSchedulerCore::GetTask(MFX_CALL_INFO &callInfo, mfxTaskHandle previousTask, const mfxU32 threadNum) { int prevTaskPriority = -1; mfxU32 run; mfxU64 totalTimeSpent[MFX_PRIORITY_NUMBER], timeSpent[MFX_PRIORITY_NUMBER]; // get the current time stamp m_currentTimeStamp = GetHighPerformanceCounter(); // get time spent statistic GetTimeStat(timeSpent, totalTimeSpent); // get the priority of the previous task prevTaskPriority = GetTaskPriority(previousTask); // there are three runs over the tasks lists. On the 1st run, // the scheduler keeping workload balance, which is described by // the TaskPriorityRatio table. On the 2nd run, the scheduler chooses // any ready task. for (run = 0; run < NUMBER_OF_RUNS; run += 1) { int priority; for (priority = MFX_PRIORITY_HIGH; priority >= MFX_PRIORITY_LOW; priority -= 1) { // // check the number of assigned task by the particular priority // // the second run always examines tasks if ((PRIORITY_RUN != run) || // during the first run we subscribe tasks only, // if the kind of tasks does not utilize its share // of CPU performance. (TaskPriorityRatio[priority] * totalTimeSpent[priority] >= 100 * timeSpent[priority])) { int type; for (type = (threadNum) ? (MFX_TYPE_SOFTWARE) : (MFX_TYPE_HARDWARE); type <= MFX_TYPE_SOFTWARE; type += 1) { MFX_SCHEDULER_TASK *pTask = m_pTasks[priority][type]; // try to continue the previous task if (prevTaskPriority == priority) { mfxStatus mfxRes; // try get the same task again mfxRes = CanContinuePreviousTask(callInfo, previousTask, threadNum); if (MFX_ERR_NONE == mfxRes) { return mfxRes; } } // run over the tasks list while (pTask) { mfxStatus mfxRes; // is this task ready? mfxRes = WrapUpTask(callInfo, pTask, threadNum); if (MFX_ERR_NONE == mfxRes) { return mfxRes; } // get the next task pTask = pTask->pNext; } } } } } // print task parameters for DEBUG purposes PrintTaskInfoUnsafe(); return MFX_ERR_NOT_FOUND; } // mfxStatus mfxSchedulerCore::GetTask(MFX_CALL_INFO &callInfo, mfxStatus mfxSchedulerCore::CanContinuePreviousTask(MFX_CALL_INFO &callInfo, mfxTaskHandle previousTask, const mfxU32 threadNum) { // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // // get the task object MFX_SCHEDULER_TASK *pTask = m_ppTaskLookUpTable.at(previousTask.taskID); if ((nullptr == pTask) || (pTask->jobID != previousTask.jobID)) { return MFX_ERR_NOT_FOUND; } return WrapUpTask(callInfo, pTask, threadNum); } // mfxStatus mfxSchedulerCore::CanContinuePreviousTask(MFX_CALL_INFO &callInfo, // static section of the file namespace { enum { MFX_INVALID_THREAD_NUMBER = 0x7fffffff }; inline mfxU32 GetFreeThreadNumber(MFX_THREAD_ASSIGNMENT &occupancyInfo, MFX_SCHEDULER_TASK *pTask) { mfxU64 mask; mfxU32 numThreads; mfxU32 i; // get available thread mask and maximum allowed threads number if (MFX_TASK_INTER & occupancyInfo.threadingPolicy) { mask = pTask->param.threadMask; } else { mask = occupancyInfo.threadMask; } numThreads = pTask->param.task.entryPoint.requiredNumThreads; for (i = 0; i < numThreads; i += 1) { if (0 == (mask & (1LL << i))) { return i; } } return MFX_INVALID_THREAD_NUMBER; } // mfxU32 GetFreeThreadNumber(MFX_THREAD_ASSIGNMENT &occupancyInfo, } // namespace bool mfxSchedulerCore::IsReadyToRun(MFX_SCHEDULER_TASK *pTask) { // task is not ready to run (ro should not be run) // if task is already done if (MFX_TASK_NEED_CONTINUE != pTask->curStatus) { return false; } // or dependencies are not resolved if (false == pTask->IsDependenciesResolved()) { return false; } // or there is no proper thread number if (MFX_INVALID_THREAD_NUMBER == GetFreeThreadNumber(*(pTask->param.pThreadAssignment), pTask)) { return false; } // or task is still waiting if (pTask->param.bWaiting) { // prevent entering more than 1 thread in 'waiting' task, // let the thread inspect other tasks. if (pTask->param.occupancy) { return false; } else if (m_timeWaitPeriod) { // check the 'waiting' time period // calculate the period elapsed since the last 'need-waiting' call mfxU64 time = GetHighPerformanceCounter() - pTask->param.timing.timeLastEnter; if (m_timeWaitPeriod > time) { const mfxU64 hwCounter = GetHWEventCounter(); if (hwCounter == pTask->param.timing.hwCounterLastEnter) { return false; } } } } return true; } mfxStatus mfxSchedulerCore::WrapUpTask(MFX_CALL_INFO &callInfo, MFX_SCHEDULER_TASK *pTask, const mfxU32 threadNum) { MFX_THREAD_ASSIGNMENT &occupancyInfo = *(pTask->param.pThreadAssignment); // // THE EXECUTION IS ALREADY IN SECURE SECTION. // Just do what need to do. // if (!IsReadyToRun(pTask)) { return MFX_ERR_NOT_FOUND; } // non-zero thread tries to get a dedicated (hardware) task... if (threadNum && (MFX_TASK_DEDICATED & occupancyInfo.threadingPolicy)) { return MFX_ERR_NOT_FOUND; } // // everything is OK. // Update the task and return the parameters // callInfo.threadNum = GetFreeThreadNumber(occupancyInfo, pTask); callInfo.callNum = pTask->param.numberOfCalls; // update the scheduler m_numAssignedTasks[pTask->param.task.priority] += 1; // update the number of assigned threads occupancyInfo.taskOccupancy += (0 == pTask->param.occupancy) ? (1) : (0); if (0 == (MFX_TASK_INTER & occupancyInfo.threadingPolicy)) { occupancyInfo.occupancy += 1; occupancyInfo.threadMask |= (1LL << callInfo.threadNum); } pTask->param.occupancy += 1; pTask->param.threadMask |= (1LL << callInfo.threadNum); pTask->param.numberOfCalls += 1; // update the task's timing pTask->param.timing.timeLastEnter = m_currentTimeStamp; pTask->param.timing.timeLastCallIssued = m_currentTimeStamp; pTask->param.timing.hwCounterLastEnter = GetHWEventCounter(); // create handle callInfo.taskHandle.taskID = pTask->taskID; callInfo.taskHandle.jobID = pTask->jobID; // set the task pointer callInfo.pTask = &pTask->param.task; // set the time stamp of task release callInfo.timeStamp = m_currentTimeStamp; return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::WrapUpTask(MFX_CALL_INFO &callInfo, void mfxSchedulerCore::ResetWaitingTasks(const void *pOwner) { ForEachTask( [pOwner](MFX_SCHEDULER_TASK* task) { // reset the 'waiting' flag if ((task->param.task.pOwner == pOwner) && (MFX_TASK_NEED_CONTINUE == task->curStatus)) { // resetting 'waiting' flag should help waking up permanent tasks task->param.bWaiting = false; // set new time of the last call processed to avoid overwriting // 'waiting' status flag. task->param.timing.timeLastCallProcessed = task->param.timing.timeLastCallIssued + 1; } } ); } // void mfxSchedulerCore::ResetWaitingTasks(const void *pOwner) void mfxSchedulerCore::OnDependencyResolved(MFX_SCHEDULER_TASK *pTask) { if (IsReadyToRun(pTask)) { if (MFX_TASK_DEDICATED & pTask->param.task.threadingPolicy) { m_DedicatedThreadsToWakeUp += pTask->param.task.entryPoint.requiredNumThreads; } else { m_RegularThreadsToWakeUp += pTask->param.task.entryPoint.requiredNumThreads; } } } void mfxSchedulerCore::MarkTaskCompleted(const MFX_CALL_INFO *pCallInfo, const mfxU32 threadNum) { (void)pCallInfo; (void)threadNum; MFX_SCHEDULER_TASK *pTask = nullptr; pTask = m_ppTaskLookUpTable.at(pCallInfo->taskHandle.taskID); // check error(s) if (nullptr == pTask) { return; } bool taskReleased = false; mfxU32 nTraceTaskId = 0; mfxU32 curTime; MFX_THREAD_ASSIGNMENT &occupancyInfo = *(pTask->param.pThreadAssignment); // update working time curTime = GetLowResCurrentTime(); if (m_workingTime[m_timeIdx].startTime + MFX_TIME_STAT_PERIOD / MFX_TIME_STAT_PARTS < curTime) { // advance the working time index. The current entry is out of time. m_timeIdx = (m_timeIdx + 1) % MFX_TIME_STAT_PARTS; memset(m_workingTime + m_timeIdx, 0, sizeof(m_workingTime[m_timeIdx])); m_workingTime[m_timeIdx].startTime = curTime; } m_workingTime[m_timeIdx].time[pTask->param.task.priority] += pCallInfo->timeSpend; // update the scheduler m_numAssignedTasks[pTask->param.task.priority] -= 1; // clean up the task object pTask->param.occupancy -= 1; pTask->param.threadMask &= ~(1LL << pCallInfo->threadNum); if (0 == (MFX_TASK_INTER & occupancyInfo.threadingPolicy)) { occupancyInfo.occupancy -= 1; occupancyInfo.threadMask &= ~(1LL << pCallInfo->threadNum); } occupancyInfo.taskOccupancy -= (0 == pTask->param.occupancy) ? (1) : (0); // Below we will notify dependent tasks that this task is done and // scheduler will get notifications from dependent tasks that their // dependencies are resolved. Upon these notifications scheduler will // calculate how many threads we need to wakeup to handle dependent // tasks. m_DedicatedThreadsToWakeUp = 0; m_RegularThreadsToWakeUp = 0; // try to not overwrite the newest status from other thread if (pTask->param.timing.timeLastCallProcessed < pCallInfo->timeStamp) { pTask->param.timing.timeLastCallProcessed = pCallInfo->timeStamp; } // update the status of the current job if (isFailed(pCallInfo->res)) { pTask->curStatus = pCallInfo->res; } // do not overwrite the failed status with successful one else if ((MFX_TASK_DONE == pCallInfo->res) && (MFX_TASK_NEED_CONTINUE == pTask->curStatus)) { pTask->curStatus = pCallInfo->res; // reset all waiting tasks with the given working object ResetWaitingTasks(pCallInfo->pTask->pOwner); } // update the task timing else if (MFX_TASK_BUSY == pCallInfo->res) { // try to not overwrite the newest status from other thread if (pTask->param.timing.timeLastCallProcessed <= pCallInfo->timeStamp) { pTask->param.bWaiting = true; } pTask->param.timing.timeOverhead += pCallInfo->timeSpend; } else { // reset all waiting tasks with the given working object ResetWaitingTasks(pCallInfo->pTask->pOwner); } pTask->param.timing.timeSpent += pCallInfo->timeSpend; // // update task status and tasks dependencies // if (0 == pTask->param.occupancy) { // complete the task if it is done if ((isFailed(pTask->curStatus)) || (MFX_TASK_DONE == pTask->curStatus)) { // store TaskId for tracing event nTraceTaskId = pCallInfo->pTask->nTaskId; // get entry point parameters to call FreeResources MFX_ENTRY_POINT &entryPoint = pTask->param.task.entryPoint; if (entryPoint.pCompleteProc) { mfxStatus mfxRes; // temporarily leave the protected code section m_guard.unlock(); mfxRes = pTask->CompleteTask(pTask->curStatus); if ((isFailed(mfxRes)) && (MFX_ERR_NONE == pTask->curStatus)) { pTask->curStatus = mfxRes; } // enter the protected code section m_guard.lock(); } } // update the failed task status if (isFailed(pTask->curStatus)) { //mfxU32 i; // save the status pTask->opRes = pTask->curStatus; pTask->done.notify_all(); // update dependencies produced from the dependency table //for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) //{ // if (pTask->param.task.pDst[i]) // { // mfxU32 idx = pTask->param.dependencies.dstIdx[i]; // m_pDependencyTable[idx].mfxRes = pTask->curStatus; // } //} ResolveDependencyTable(pTask); // mark all dependent task as 'failed' pTask->ResolveDependencies(pTask->curStatus); // release all allocated resources pTask->ReleaseResources(); } // process task completed else if (MFX_TASK_DONE == pTask->curStatus) { mfxU32 i; // reset jobID to avoid false waiting on complete tasks, which were reused pTask->jobID = 0; // save the status pTask->opRes = MFX_ERR_NONE; pTask->done.notify_all(); // remove dependencies produced from the dependency table for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) { if (pTask->param.task.pDst[i]) { mfxU32 idx = pTask->param.dependencies.dstIdx[i]; m_pDependencyTable.at(idx).p = nullptr; } } // mark all dependent task as 'ready' pTask->ResolveDependencies(MFX_ERR_NONE); // release all allocated resources pTask->ReleaseResources(); // task object becomes free taskReleased = true; } } // wake up additional threads for this task and tasks dependent if (m_DedicatedThreadsToWakeUp || m_RegularThreadsToWakeUp) { WakeUpThreads(m_DedicatedThreadsToWakeUp, m_RegularThreadsToWakeUp); } // wake up external threads waiting for a free task object if (taskReleased) { ++m_freeTasksCount; m_freeTasks.notify_one(); } // send tracing event if (nTraceTaskId) { MFX_LTRACE_1(MFX_TRACE_LEVEL_SCHED, "^Completed^", "%d", nTraceTaskId); } } // update dependencies produced from the dependency table void mfxSchedulerCore::ResolveDependencyTable(MFX_SCHEDULER_TASK *pTask) { mfxU32 i; for (i = 0; i < MFX_TASK_NUM_DEPENDENCIES; i += 1) { if (pTask->param.task.pDst[i]) { mfxU32 idx = pTask->param.dependencies.dstIdx[i]; m_pDependencyTable.at(idx).mfxRes = pTask->curStatus; } } } mfx_scheduler_core_thread.cpp000066400000000000000000000101251443134507600340740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/scheduler/linux/src// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include mfxStatus mfxSchedulerCore::StartWakeUpThread(void) { // stop the thread before creating it again // don't try to check thread status, it might lead to interesting effects. if (m_hwWakeUpThread.joinable()) StopWakeUpThread(); m_timer_hw_event = MFX_THREAD_TIME_TO_WAIT; return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::StartWakeUpThread(void) mfxStatus mfxSchedulerCore::StopWakeUpThread(void) { return MFX_ERR_NONE; } // mfxStatus mfxSchedulerCore::StopWakeUpThread(void) void mfxSchedulerCore::ThreadProc(MFX_SCHEDULER_THREAD_CONTEXT *pContext) { std::unique_lock guard(m_guard); mfxTaskHandle previousTaskHandle = {}; mfxU64 start, stop; const uint32_t threadNum = pContext->threadNum; { char thread_name[30] = {}; snprintf(thread_name, sizeof(thread_name)-1, "ThreadName=MSDK#%d", threadNum); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, thread_name); } // main working cycle for threads while (false == m_bQuit) { { MFX_CALL_INFO call = {}; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "SchedulerRoutine"); pContext->state = MFX_SCHEDULER_THREAD_CONTEXT::Waiting; if (MFX_ERR_NONE == GetTask(call, previousTaskHandle, threadNum)) { pContext->state = MFX_SCHEDULER_THREAD_CONTEXT::Running; guard.unlock(); { PERF_UTILITY_SET_ASYNC_TASK_ID(call.pTask->nTaskId); PERF_UTILITY_AUTO("SchedulerRoutine", PERF_LEVEL_ROUTINE); // perform asynchronous operation call_pRoutine(call); } guard.lock(); pContext->workTime += call.timeSpend; // save the previous task's handle previousTaskHandle = call.taskHandle; // mark the task completed, // set the sync point into the high state if any. MarkTaskCompleted(&call, threadNum); continue; } } // mark beginning of sleep period start = GetHighPerformanceCounter(); // there is no any task. // sleep for a while until the event is signaled. Wait(threadNum, guard); // mark end of sleep period stop = GetHighPerformanceCounter(); // update thread statistic pContext->sleepTime += (stop - start); } } void mfxSchedulerCore::WakeupThreadProc() { { const char thread_name[30] = "ThreadName=MSDKHWL#0"; (void)thread_name; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, thread_name); } // main working cycle for threads while (false == m_bQuitWakeUpThread) { IncrementHWEventCounter(); { std::lock_guard guard(m_guard); WakeUpThreads(1,1); } } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/000077500000000000000000000000001443134507600236235ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/CMakeLists.txt000066400000000000000000000037661443134507600263770ustar00rootroot00000000000000add_library(mfx_common_hw STATIC) target_sources(mfx_common_hw PRIVATE include/libmfxsw.h include/mediasdk_version.h include/mfx_brc_common.h include/mfx_common_decode_int.h include/mfx_common_int.h include/mfx_critical_error_handler.h include/mfx_ddi_enc_dump.h include/mfx_enc_common.h include/mfx_enc_enctools_common.h include/mfx_frames.h include/mfx_interface.h include/mfx_interface_scheduler.h include/mfx_log.h include/mfx_mpeg2_dec_common.h include/mfx_msg.h include/mfx_platform_headers.h include/mfx_platform_caps.h include/mfx_session.h include/mfx_task.h include/mfx_task_threading_policy.h include/mfx_thread_task.h include/mfx_tools.h include/mfx_vc1_dec_common.h include/mfx_vpx_dec_common.h include/feature_blocks/mfx_feature_blocks_base.h src/mfx_feature_blocks_base.cpp src/mfx_brc_common.cpp src/mfx_common_decode_int.cpp src/mfx_common_int.cpp src/mfx_enc_common.cpp src/mfx_log.cpp src/mfx_enc_enctools_common.cpp src/mfx_mpeg2_dec_common.cpp src/mfx_vc1_dec_common.cpp src/mfx_critical_error_handler.cpp src/mfx_ddi_enc_dump.cpp src/mfx_vpx_dec_common.cpp $<$: ${MSDK_STUDIO_ROOT}/shared/src/mfx_dxva2_device.cpp > ) target_include_directories(mfx_common_hw PUBLIC include include/feature_blocks ${MSDK_LIB_ROOT}/cmrt_cross_platform/include ${MSDK_UMC_ROOT}/codec/brc/include ${MSDK_UMC_ROOT}/codec/vc1_common/include ${MSDK_UMC_ROOT}/codec/vc1_dec/include ${MSDK_STUDIO_ROOT}/shared/asc/include ${MSDK_STUDIO_ROOT}/shared/include ${MSDK_STUDIO_ROOT}/shared/mfx_logging/include $<$: ${MSDK_STUDIO_ROOT}/shared/enctools/include > ) target_link_libraries(mfx_common_hw PUBLIC mfx_static_lib umc_va_hw mfx_logging $<$:mfx_ext> PRIVATE mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/000077500000000000000000000000001443134507600252465ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/feature_blocks/000077500000000000000000000000001443134507600302365ustar00rootroot00000000000000mfx_feature_blocks_base.h000066400000000000000000000143341443134507600351710ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/feature_blocks// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "mfx_feature_blocks_utils.h" #include #include #include #include namespace MfxFeatureBlocks { enum eFeatureMode { QUERY0 = (1 << 0) , QUERY1 = (1 << 1) , QUERY_IO_SURF = (1 << 2) , INIT = (1 << 3) , RUNTIME = (1 << 4) , QUERY_IMPLS_DESCRIPTION = (1 << 5) }; enum eReorderLoc { PLACE_BEFORE , PLACE_AFTER }; struct ParamSupport { std::list> m_mvpCopySupported; std::map>> m_ebCopySupported , m_ebCopyPtrs; }; struct ParamInheritance //for Reset { std::list> m_mvpInheritDefault; std::map>> m_ebInheritDefault; }; struct ID { mfxU32 FeatureID; mfxU32 BlockID; bool operator==(const ID other) const { return FeatureID == other.FeatureID && BlockID == other.BlockID; } bool operator<(const ID other) const { if (FeatureID < other.FeatureID) return true; return BlockID < other.BlockID; } }; class BlockTracer : public ID { public: using TFeatureTrace = std::pair>; BlockTracer( ID id , const char* fName = nullptr , const char* bName = nullptr); ~BlockTracer(); const char* m_featureName; const char* m_blockName; }; template class FeatureBlocksCommon : public ParamSupport , public ParamInheritance { public: using ID = MfxFeatureBlocks::ID; virtual ~FeatureBlocksCommon() {} template struct Block : ID { typedef TBlockTracer TTracer; typedef T TCall; Block( const ID id , TCall&& call , const char* fName = nullptr , const char* bName = nullptr) : ID(id) , m_featureName(fName) , m_blockName(bName) , m_call(std::move(call)) {} template typename TCall::result_type Call(TArg&& ...arg) const { return m_call(std::forward(arg)...); } const char* m_featureName; const char* m_blockName; TCall m_call; }; template static typename std::conditional::value , typename T::const_iterator, typename T::iterator>::type Find(T& queue, const ID id) { return std::find_if( queue.begin() , queue.end() , [id](const ID x) { return (x == id); }); } template static typename std::conditional::value , typename T::const_iterator, typename T::iterator>::type Get(T& queue, const ID id) { auto it = Find(queue, id); if (it == queue.end()) throw std::logic_error("Block not found"); return it; } template void Reorder(T& queue, const ID _where, const ID _first, eReorderLoc loc = PLACE_BEFORE) { auto itWhere = Get(queue, _where); if (loc == PLACE_AFTER) itWhere++; queue.splice(itWhere, queue, Get(queue, _first)); } mfxU32 Init(mfxU32 FeatureID, mfxU32 mode) { mfxU32 prevMode = m_initialized[FeatureID]; m_initialized[FeatureID] |= mode; return prevMode; } virtual const char* GetFeatureName(mfxU32 /*featureID*/) { return nullptr; } virtual const char* GetBlockName(ID /*id*/) { return nullptr; } std::map m_initialized; //FeatureID -> FeatureMode }; class IBlockTracer { public: IBlockTracer( ID /*id*/ , const char* /*fName = nullptr*/ , const char* /*bName = nullptr*/) {} virtual ~IBlockTracer() {} }; template class FeatureBaseCommon { public: FeatureBaseCommon() = delete; virtual ~FeatureBaseCommon() {} virtual void Init( mfxU32 mode/*eFeatureMode*/ , TFeatureBlocks& blocks) = 0; mfxU32 GetID() const { return m_id; } protected: virtual void SetSupported(ParamSupport& /*par*/) {} virtual void SetInherited(ParamInheritance& /*par*/) {} FeatureBaseCommon(mfxU32 id) : m_id(id) {} template using TPfnInitQueue = void (TFeatureBase::*)(const TFeatureBlocks&, T); template bool InitQueue( TPfnInitQueue pfnFunc , TFeatureBlocks& blocks) { (dynamic_cast(*this).*pfnFunc)(blocks , [&](mfxU32 blkId, typename TFeatureBlocks::template BQ::TCall&& call) { blocks.template Push(ID{ m_id, blkId }, std::move(call)); }); return true; } mfxU32 m_id; }; }; //namespace MfxFeatureBlocks mfx_feature_blocks_decl_blocks.h000066400000000000000000000052131443134507600365170ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/feature_blocks// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(DECL_BLOCK_LIST) #error "Invalid usage of " __FILE__ ": DECL_BLOCK_LIST must be defined" #endif #if !defined(DECL_FEATURE_NAME) #error "Invalid usage of " __FILE__ ": DECL_FEATURE_NAME must be defined" #endif enum eBlockId { /* * BLOCK_ID_OFFSET is used when there are feature classes inheritance and feature blocks are defined in both derived class and base class. * BLOCK_ID_OFFSET should be defind in derived class as Base::eBlockId::NUM_BLOCKS before "#define DECL_BLOCK_LIST". */ #if defined(BLOCK_ID_OFFSET) __FIRST_MINUS1 = BLOCK_ID_OFFSET - 1 #else __FIRST_MINUS1 = -1 #endif #define DECL_BLOCK(NAME) , BLK_##NAME DECL_BLOCK_LIST #undef DECL_BLOCK , NUM_BLOCKS }; #if defined(BLOCK_ID_OFFSET) #undef BLOCK_ID_OFFSET #endif #if defined(MFX_ENABLE_LOG_UTILITY) #if !defined(CODEC_NAME_PREFIX) #error "Invalid usage of " __FILE__ ": CODEC_NAME_PREFIX must be defined" #endif BlockTracer::TFeatureTrace m_trace = { CODEC_NAME_PREFIX + std::string(DECL_FEATURE_NAME), { #define DECL_BLOCK(NAME) {BLK_##NAME, #NAME}, DECL_BLOCK_LIST #undef DECL_BLOCK } }; virtual const BlockTracer::TFeatureTrace* GetTrace() override { return &m_trace; } virtual void SetTraceName(std::string&& name) override { m_trace.first = CODEC_NAME_PREFIX + std::move(name); } #endif // defined(MFX_ENABLE_LOG_UTILITY) #if !defined DECL_BLOCK_CLEANUP_DISABLE #undef DECL_BLOCK_LIST #undef DECL_FEATURE_NAME #endif mfx_feature_blocks_init_macros.h000066400000000000000000000056161443134507600365710ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/feature_blocks// Copyright (c) 2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #define MFX_FEATURE_BLOCKS_DECLARE_BQ_UTILS_IN_FEATURE_BLOCK \ template void Push(T& queue, const ID id, typename T::value_type::TCall&& call) \ { \ queue.emplace_back(typename T::value_type(id, std::move(call) \ , GetFeatureName(id.FeatureID), GetBlockName(id))); \ } \ template struct BQ {}; \ template void Push(const ID id, typename BQ::TCall&& call) \ { \ BQ::Push(*this, id, std::move(call)); \ } #define MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BLOCK(NAME, ABR, RTYPE, ...)\ static const mfxU32 BQ_##NAME = __LINE__;\ std::list>> m_q##NAME; #define MFX_FEATURE_BLOCKS_DECLARE_QUEUES_EXTERNAL(NAME, ABR, RTYPE, ...)\ template<> struct FeatureBlocks::BQ \ {\ typedef std::function TCall;\ typedef std::list> TQueue;\ static TQueue& Get(FeatureBlocks& blk) { return blk.m_q##NAME;}\ static const TQueue& Get(const FeatureBlocks& blk) { return blk.m_q##NAME;}\ static void Push(FeatureBlocks& blks, const ID id, TCall&& call)\ { blks.Push(blks.m_q##NAME, id, std::move(call)); }\ }; #define MFX_FEATURE_BLOCKS_DECLARE_QUEUES_IN_FEATURE_BASE(NAME, ABR, RTYPE, ...)\ static const mfxU32 ABR = FeatureBlocks::BQ_##NAME;\ typedef FeatureBlocks::BQ::TCall TCall##ABR;\ typedef std::function TPush##ABR;\ virtual void NAME(const FeatureBlocks&, TPush##ABR) {} mfx_feature_blocks_utils.h000066400000000000000000000222751443134507600354220ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/feature_blocks// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include "mfxvideo.h" #include "mfx_utils_logging.h" #include #include #include #include #include #include #if defined(MFX_ENABLE_LOG_UTILITY) #include #endif namespace MfxFeatureBlocks { struct Storable { virtual ~Storable() {} }; template class StorableRef : public Storable , public std::reference_wrapper { public: StorableRef(T& ref) : std::reference_wrapper(ref) {} }; template class MakeStorable : public T , public StorableRef { public: template MakeStorable(TArg&& ...arg) : T(std::forward(arg)...) , StorableRef((T&)*this) {} }; template class MakeStorablePtr : public std::unique_ptr , public StorableRef { public: using std::unique_ptr::get; MakeStorablePtr(T* p) : std::unique_ptr(p) , StorableRef((T&)*get()) {} }; template std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } template std::unique_ptr::value, T, MakeStorable>::type> make_storable(Args&&... args) { return make_unique::value, T, MakeStorable>::type> (std::forward(args)...); } class StorageR { public: typedef mfxU32 TKey; static const TKey KEY_INVALID = TKey(-1); template const T& Read(TKey key) const { auto it = m_map.find(key); if (it == m_map.end()) { std::stringstream ss; ss << "Requested object with Key " << key << " was not found in storage"; throw std::logic_error(ss.str()); } return dynamic_cast(*it->second); } bool Contains(TKey key) const { return (m_map.find(key) != m_map.end()); } bool Empty() const { return m_map.empty(); } protected: std::map> m_map; }; class StorageW : public StorageR { public: template T& Write(TKey key) const { auto it = m_map.find(key); if (it == m_map.end()) { std::stringstream ss; ss << "Requested object with Key " << key << " was not found in storage"; throw std::logic_error(ss.str()); } return dynamic_cast(*it->second); } }; class StorageRW : public StorageW { public: bool TryInsert(TKey key, std::unique_ptr&& pObj) { return m_map.emplace(key, std::move(pObj)).second; } void Insert(TKey key, std::unique_ptr&& pObj) { if (!TryInsert(key, std::move(pObj))) throw std::logic_error("Keys must be unique"); } template::value, int>::type = 0> void Insert(TKey key, T* pObj) { Insert(key, new MakeStorablePtr(pObj)); } template::value>::type> void Insert(TKey key, T* pObj) { Insert(key, std::unique_ptr(pObj)); } void Erase(TKey key) { m_map.erase(key); } void Clear() { m_map.clear(); } }; template struct StorageVar { static const StorageR::TKey Key = K; typedef typename std::conditional::value, T, StorableRef>::type TStore; typedef T TRef; static const TRef& Get(const StorageR& s) { return s.Read(Key); } static TRef& Get(StorageW& s) { return s.Write(Key); } template static TRef& GetOrConstruct(StorageRW& s, Args&&... args) { if (!s.Contains(Key)) s.Insert(Key, make_storable(std::forward(args)...)); return s.Write(Key); } }; inline bool IsErrorSts(mfxStatus sts) { return sts < MFX_ERR_NONE; } inline bool IsWarnSts(mfxStatus sts) { return sts > MFX_ERR_NONE; } inline mfxStatus GetWorstSts(mfxStatus sts1, mfxStatus sts2) { mfxStatus sts_min = std::min(sts1, sts2); return sts_min == MFX_ERR_NONE ? std::max(sts1, sts2) : sts_min; } template inline void ThrowIf(bool bThrow, T sts) { if (bThrow) throw sts; } template inline STS Catch(STS dflt, T func, Args&&... args) { try { func(std::forward(args)...); } catch (STS sts) { return sts; } return dflt; } inline bool IgnoreSts(mfxStatus) { return false; } template< class TBlock , typename std::enable_if::type::TCall::result_type, mfxStatus>::value, int>::type = 0 , class... TArgs> inline mfxStatus CallAndGetMfxSts(TBlock&& blk, TArgs&&... args) { #if defined(MFX_ENABLE_LOG_UTILITY) typename std::remove_reference::type::TTracer tr(blk, blk.m_featureName, blk.m_blockName); #endif // MFX_ENABLE_LOG_UTILITY blk.Call(std::forward(args)...); return MFX_ERR_NONE; } template< class TBlock , typename = typename std::enable_if::type::TCall::result_type, mfxStatus>::value>::type , class... TArgs> inline mfxStatus CallAndGetMfxSts(TBlock&& blk, TArgs&&... args) { #if defined(MFX_ENABLE_LOG_UTILITY) typename std::remove_reference::type::TTracer tr(blk, blk.m_featureName, blk.m_blockName); std::string str = blk.m_featureName + std::string("__") + blk.m_blockName; if (TRACE_CHECK(TR_KEY_PIPELINE_STICKER)) { MFXTraceEvent(MFX_TRACE_PIPELINE_STICKER_TASK, EVENT_TYPE_START, 0, str.size() + 1, str.c_str()); } #endif // MFX_ENABLE_LOG_UTILITY mfxStatus sts = MFX_ERR_NONE; { #if defined(MFX_ENABLE_LOG_UTILITY) PERF_UTILITY_AUTO(str, PERF_LEVEL_INTERNAL); #endif // MFX_ENABLE_LOG_UTILITY sts = blk.Call(std::forward(args)...); } #if defined(MFX_ENABLE_LOG_UTILITY) if (TRACE_CHECK(TR_KEY_PIPELINE_STICKER)) { std::unique_ptr pEventData(new char[str.size() + 1 + sizeof(sts)]); std::strcpy(pEventData.get(), str.c_str()); std::memcpy(pEventData.get() + str.size() + 1, &sts, sizeof(sts)); MFXTraceEvent(MFX_TRACE_PIPELINE_STICKER_TASK, EVENT_TYPE_END, 0, str.size() + 1 + sizeof(sts), pEventData.get()); } if (sts != MFX_ERR_NONE) { std::string stsString = GetMFXStatusInString(sts); MFX_LOG_TRACE("%s(%d)::%s(%d): Return %s\n" , blk.m_featureName, blk.FeatureID, blk.m_blockName, blk.BlockID, stsString.c_str()); } #endif // MFX_ENABLE_LOG_UTILITY return sts; } template mfxStatus RunBlocks(TPred stopAtSts, TQ& queue, TArgs&&... args) { mfxStatus wrn = MFX_ERR_NONE, sts; using TBlock = typename TQ::value_type; auto RunBlock = [&](const TBlock& blk) { auto sts = CallAndGetMfxSts(blk, std::forward(args)...); ThrowIf(stopAtSts(sts), sts); wrn = GetWorstSts(sts, wrn); }; try { sts = Catch( MFX_ERR_NONE , std::for_each , queue.begin(), queue.end(), RunBlock ); } catch (const std::exception & ex) { sts = MFX_ERR_UNKNOWN; MFX_LOG_FATAL("EHW Exception: %s\n", ex.what()); } return GetWorstSts(sts, wrn); } template struct CallChain : public std::function { typedef std::function TExt; typedef std::function TInt; void Push(TInt newCall) { m_prev.push_front(*this); auto pPrev = &m_prev.front(); (TExt&)*this = TExt([=](TArg... args) { return newCall(*pPrev, args...); }); } std::list m_prev; }; } //namespace MfxFeatureBlocks oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/libmfxsw.h000066400000000000000000000024011443134507600272470ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __LIBMFXSW_H__ #define __LIBMFXSW_H__ #include "dispatch_session.h" struct SWSession: private DispatchSession { /* Currently nothing */ }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mediasdk_version.h000066400000000000000000000046251443134507600307540ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // This file have specific information for Linux, Android. #pragma once #ifdef __linux__ #include "va/va.h" #ifndef MFX_API_VERSION #define STRINGIZE(s) #s #define CONVERT_TO_STRING(s) STRINGIZE(s) #if MFX_VERSION >= MFX_VERSION_NEXT #define MFX_API_VERSION CONVERT_TO_STRING(MFX_VERSION_MAJOR) "." CONVERT_TO_STRING(MFX_VERSION_MINOR) "+" #else #define MFX_API_VERSION CONVERT_TO_STRING(MFX_VERSION_MAJOR) "." CONVERT_TO_STRING(MFX_VERSION_MINOR) #endif //MFX_VERSION >= MFX_VERSION_NEXT #endif //MFX_API_VERSION #ifndef MFX_GIT_COMMIT #define MFX_GIT_COMMIT "no git commit info" #endif #ifndef MFX_BUILD_INFO #define MFX_BUILD_INFO "no build info" #endif #if !defined(MEDIA_VERSION_STR) #error Build system should define MEDIA_VERSION_STR. #endif const char* g_MfxProductName = "mediasdk_product_name: Intel(R) Media SDK"; const char* g_MfxCopyright = "mediasdk_copyright: Copyright(c) 2007-2020 Intel Corporation"; const char* g_MfxApiVersion = "mediasdk_api_version: " MFX_API_VERSION; const char* g_MfxVersion = "mediasdk_version: " MEDIA_VERSION_STR; const char* g_MfxGitCommit = "mediasdk_git_commit: " MFX_GIT_COMMIT; const char* g_MfxBuildInfo = "mediasdk_build_info: " MFX_BUILD_INFO; const char* g_MfxLibvaVersion = "mediasdk_libva_version: " VA_VERSION_S; #endif // __linux__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_brc_common.h000066400000000000000000000434521443134507600304170ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_BRC_COMMON_H__ #define __MFX_BRC_COMMON_H__ #include "mfx_common.h" #ifdef MFX_ENABLE_ENCTOOLS #include "mfxenctools-int.h" #else #include "mfxbrc.h" #endif #include #include #include #if defined (MFX_ENABLE_VIDEO_BRC_COMMON) #include "umc_video_brc.h" mfxStatus ConvertVideoParam_Brc(const mfxVideoParam *parMFX, UMC::VideoBrcParams *parUMC); #endif class AVGBitrate { public: AVGBitrate(mfxU32 windowSize, mfxU32 maxBitPerFrame, mfxU32 avgBitPerFrame, bool bLA = false): m_maxWinBits(maxBitPerFrame*windowSize), m_maxWinBitsLim(0), m_avgBitPerFrame(std::min(avgBitPerFrame, maxBitPerFrame)), m_currPosInWindow(windowSize-1), m_lastFrameOrder(mfxU32(-1)), m_bLA(bLA) { windowSize = windowSize > 0 ? windowSize : 1; // kw m_slidingWindow.resize(windowSize); for (mfxU32 i = 0; i < windowSize; i++) { m_slidingWindow[i] = maxBitPerFrame / 3; //initial value to prevent big first frames } m_maxWinBitsLim = GetMaxWinBitsLim(); } virtual ~AVGBitrate() { //printf("------------ AVG Bitrate: %d ( %d), NumberOfErrors %d\n", m_MaxBitReal, m_MaxBitReal_temp, m_NumberOfErrors); } void UpdateSlidingWindow(mfxU32 sizeInBits, mfxU32 FrameOrder, bool bPanic, bool bSH, mfxU32 recode, mfxU32 /* qp */) { mfxU32 windowSize = (mfxU32)m_slidingWindow.size(); bool bNextFrame = FrameOrder != m_lastFrameOrder; if (bNextFrame) { m_lastFrameOrder = FrameOrder; m_currPosInWindow = (m_currPosInWindow + 1) % windowSize; } m_slidingWindow[m_currPosInWindow] = sizeInBits; if (bNextFrame) { if (bPanic || bSH) { m_maxWinBitsLim = mfx::clamp((GetLastFrameBits(windowSize,false) + m_maxWinBits) / 2, GetMaxWinBitsLim(), m_maxWinBits); } else { if (recode) m_maxWinBitsLim = mfx::clamp(GetLastFrameBits(windowSize,false) + GetStep() / 2, m_maxWinBitsLim, m_maxWinBits); else if ((m_maxWinBitsLim > GetMaxWinBitsLim() + GetStep()) && (m_maxWinBitsLim - GetStep() > (GetLastFrameBits(windowSize - 1,false) + sizeInBits))) m_maxWinBitsLim -= GetStep(); } } } mfxU32 GetMaxFrameSize(bool bPanic, bool bSH, mfxU32 recode) { mfxU32 winBits = GetLastFrameBits(GetWindowSize() - 1, !bPanic); mfxU32 maxWinBitsLim = m_maxWinBitsLim; if (bSH) maxWinBitsLim = (m_maxWinBits + m_maxWinBitsLim) / 2; if (bPanic) maxWinBitsLim = m_maxWinBits; maxWinBitsLim = std::min(maxWinBitsLim + recode*GetStep() / 2, m_maxWinBits); mfxU32 maxFrameSize = winBits >= m_maxWinBitsLim ? mfxU32(std::max((mfxI32)m_maxWinBits - (mfxI32)winBits, 1)) : maxWinBitsLim - winBits; return maxFrameSize; } mfxU32 GetWindowSize() { return (mfxU32)m_slidingWindow.size(); } mfxI32 GetBudget(mfxU32 numFrames) { numFrames = std::min(mfxU32(m_slidingWindow.size()), numFrames); return ((mfxI32)m_maxWinBitsLim - (mfxI32)GetLastFrameBits((mfxU32)m_slidingWindow.size() - numFrames, true)); } protected: mfxU32 m_maxWinBits; mfxU32 m_maxWinBitsLim; mfxU32 m_avgBitPerFrame; mfxU32 m_currPosInWindow; mfxU32 m_lastFrameOrder; bool m_bLA; std::vector m_slidingWindow; mfxU32 GetLastFrameBits(mfxU32 numFrames, bool bCheckSkip) { mfxU32 size = 0; numFrames = numFrames < m_slidingWindow.size() ? numFrames : (mfxU32)m_slidingWindow.size(); for (mfxU32 i = 0; i < numFrames; i++) { mfxU32 frame_size = m_slidingWindow[(m_currPosInWindow + m_slidingWindow.size() - i) % m_slidingWindow.size()]; if (bCheckSkip && (frame_size < m_avgBitPerFrame / 3)) frame_size = m_avgBitPerFrame / 3; size += frame_size; //printf("GetLastFrames: %d) %d sum %d\n",i,m_slidingWindow[(m_currPosInWindow + m_slidingWindow.size() - i) % m_slidingWindow.size() ], size); } return size; } mfxU32 GetStep() { return (m_maxWinBits / GetWindowSize() - m_avgBitPerFrame) / (m_bLA ? 4 : 2); } mfxU32 GetMaxWinBitsLim() { return m_maxWinBits - GetStep() * GetWindowSize(); } }; #if defined(MFX_ENABLE_EXT_BRC) #define MIN_RACA 0.25 #define MAX_RACA 361.0 #define RACA_SCALE 128.0 /* NalHrdConformance | VuiNalHrdParameters | Result -------------------------------------------------------------- off any => MFX_BRC_NO_HRD default off => MFX_BRC_NO_HRD on off => MFX_BRC_HRD_WEAK on (or default) on (or default) => MFX_BRC_HRD_STRONG -------------------------------------------------------------- */ #if !defined(MFX_ENABLE_ENCTOOLS) enum : mfxU16 { MFX_BRC_NO_HRD = 0, MFX_BRC_HRD_WEAK, // IF HRD CALCULATION IS REQUIRED, BUT NOT WRITTEN TO THE STREAM MFX_BRC_HRD_STRONG }; #endif namespace MfxHwH265EncodeBRC { class cBRCParams { public: mfxU16 rateControlMethod; // CBR or VBR mfxU16 HRDConformance; // is HRD compliance needed mfxU16 bRec; // is Recoding possible mfxU16 bPanic; // is Panic mode possible // HRD params mfxU32 bufferSizeInBytes; mfxU32 initialDelayInBytes; // Sliding window parameters mfxU16 WinBRCMaxAvgKbps; mfxU16 WinBRCSize; // RC params mfxU32 targetbps; mfxU32 maxbps; mfxF64 frameRate; mfxF64 inputBitsPerFrame; mfxF64 maxInputBitsPerFrame; mfxU32 maxFrameSizeInBits; // Frame size params mfxU16 width; mfxU16 height; mfxU16 chromaFormat; mfxU16 bitDepthLuma; mfxU32 mRawFrameSizeInBits; mfxU32 mRawFrameSizeInPixs; // GOP params mfxU16 gopPicSize; mfxU16 gopRefDist; bool bPyr; bool bFieldMode; //BRC accurancy params mfxF64 fAbPeriodLong; // number on frames to calculate abberation from target frame mfxF64 fAbPeriodShort; // number on frames to calculate abberation from target frame mfxF64 dqAbPeriod; // number on frames to calculate abberation from dequant mfxF64 bAbPeriod; // number of frames to calculate abberation from target bitrate //QP parameters mfxI32 quantOffset; mfxI32 quantMaxI; mfxI32 quantMinI; mfxI32 quantMaxP; mfxI32 quantMinP; mfxI32 quantMaxB; mfxI32 quantMinB; mfxU32 iDQp0; mfxU32 iDQp; mfxU32 mNumRefsInGop; bool mIntraBoost; bool mVeryLowDelay; mfxF64 mMinQstepCmplxKP; mfxF64 mMinQstepRateEP; mfxI32 mMinQstepCmplxKPUpdt; mfxF64 mMinQstepCmplxKPUpdtErr; bool mMBBRC; mfxU32 codecId; public: cBRCParams() : rateControlMethod(0), HRDConformance(MFX_BRC_NO_HRD), bRec(0), bPanic(0), bufferSizeInBytes(0), initialDelayInBytes(0), WinBRCMaxAvgKbps(0), WinBRCSize(0), targetbps(0), maxbps(0), frameRate(0), inputBitsPerFrame(0), maxInputBitsPerFrame(0), maxFrameSizeInBits(0), width(0), height(0), chromaFormat(0), bitDepthLuma(0), mRawFrameSizeInBits(0), mRawFrameSizeInPixs(0), gopPicSize(0), gopRefDist(0), bPyr(0), bFieldMode(0), fAbPeriodLong(0), fAbPeriodShort(0), dqAbPeriod(0), bAbPeriod(0), quantOffset(0), quantMaxI(0), quantMinI(0), quantMaxP(0), quantMinP(0), quantMaxB(0), quantMinB(0), iDQp0(0), iDQp(0), mNumRefsInGop(0), mIntraBoost(0), mVeryLowDelay(0), mMinQstepCmplxKP(0), mMinQstepRateEP(0), mMinQstepCmplxKPUpdt(0), mMinQstepCmplxKPUpdtErr(0), mMBBRC(false), codecId(0) {} mfxStatus Init(mfxVideoParam* par, bool bFieldMode = false); mfxStatus GetBRCResetType(mfxVideoParam* par, bool bNewSequence, bool &bReset, bool &bSlidingWindowReset ); }; struct sHrdInput { bool m_cbrFlag = false; mfxU32 m_bitrate = 0; mfxU32 m_maxCpbRemovalDelay = 0; mfxF64 m_clockTick = 0.0; mfxF64 m_cpbSize90k = 0.0; mfxF64 m_initCpbRemovalDelay = 0; void Init(cBRCParams par); }; class HRDCodecSpec { private: mfxI32 m_overflowQuant = 999; mfxI32 m_underflowQuant = 0; public: mfxI32 GetMaxQuant() const { return m_overflowQuant - 1; } mfxI32 GetMinQuant() const { return m_underflowQuant + 1; } void SetOverflowQuant(mfxI32 qp) { m_overflowQuant = qp; } void SetUnderflowQuant(mfxI32 qp) { m_underflowQuant = qp; } void ResetQuant() { m_overflowQuant = 999; m_underflowQuant = 0;} public: virtual ~HRDCodecSpec() {} virtual void Init(cBRCParams &par)=0; virtual void Reset(cBRCParams &par) = 0; virtual void Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) = 0; virtual mfxU32 GetInitCpbRemovalDelay(mfxU32 eo) const = 0; virtual mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 eo) const = 0; virtual mfxU32 GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const = 0; virtual mfxU32 GetMinFrameSizeInBits(mfxU32 eo, bool bSEI) const = 0; virtual mfxF64 GetBufferDeviation(mfxU32 eo) const = 0; virtual mfxF64 GetBufferDeviationFactor(mfxU32 eo) const = 0; }; class HEVC_HRD: public HRDCodecSpec { public: HEVC_HRD() : m_prevAuCpbRemovalDelayMinus1(0) , m_prevAuCpbRemovalDelayMsb(0) , m_prevAuFinalArrivalTime(0) , m_prevBpAuNominalRemovalTime(0) , m_prevBpEncOrder(0) {} virtual ~HEVC_HRD() {} void Init(cBRCParams &par) override; void Reset(cBRCParams &par) override; void Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) override; mfxU32 GetInitCpbRemovalDelay(mfxU32 eo) const override; mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 eo) const override { return mfxU32(m_hrdInput.m_cpbSize90k - GetInitCpbRemovalDelay(eo)); } mfxU32 GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxU32 GetMinFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxF64 GetBufferDeviation(mfxU32 eo) const override; mfxF64 GetBufferDeviationFactor(mfxU32 eo) const override; protected: sHrdInput m_hrdInput; mfxI32 m_prevAuCpbRemovalDelayMinus1; mfxU32 m_prevAuCpbRemovalDelayMsb; mfxF64 m_prevAuFinalArrivalTime; mfxF64 m_prevBpAuNominalRemovalTime; mfxU32 m_prevBpEncOrder; }; class H264_HRD: public HRDCodecSpec { public: H264_HRD(); virtual ~H264_HRD() {} void Init(cBRCParams &par) override; void Reset(cBRCParams &par) override; void Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) override; mfxU32 GetInitCpbRemovalDelay(mfxU32 eo) const override; mfxU32 GetInitCpbRemovalDelayOffset(mfxU32 eo) const override; mfxU32 GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxU32 GetMinFrameSizeInBits(mfxU32 eo, bool bSEI) const override; mfxF64 GetBufferDeviation(mfxU32 eo) const override; mfxF64 GetBufferDeviationFactor(mfxU32 eo) const override; private: sHrdInput m_hrdInput; double m_trn_cur; // nominal removal time double m_taf_prv; // final arrival time of prev unit }; struct BRC_Ctx { mfxI32 QuantIDR; //currect qp for intra frames mfxI32 QuantI; //currect qp for intra frames mfxI32 QuantP; //currect qp for P frames mfxI32 QuantB; //currect qp for B frames mfxI32 Quant; // qp for last encoded frame mfxI32 QuantMin; // qp Min for last encoded frame (is used for recoding) mfxI32 QuantMax; // qp Max for last encoded frame (is used for recoding) bool bToRecode; // last frame is needed in recoding bool bPanic; // last frame is needed in panic mfxU32 encOrder; // encoding order of last encoded frame mfxU32 poc; // poc of last encoded frame mfxI32 SceneChange; // scene change parameter of last encoded frame mfxU32 SChPoc; // poc of frame with scene change mfxU32 LastIEncOrder; // encoded order of last intra frame mfxU32 LastIDREncOrder; // encoded order of last idr frame mfxU32 LastIDRSceneChange; // last idr was scene change mfxU32 LastIQpAct; // Qp of last intra frame mfxU32 LastIFrameSize; // encoded frame size of last non B frame (is used for sceneChange) mfxF64 LastICmplx; // Qp of last intra frame mfxU32 LastIQpSetOrder; // Qp of last intra frame mfxU32 LastIQpMin; // Qp of last intra frame mfxU32 LastIQpSet; // Qp of last intra frame mfxU32 LastNonBFrameSize; // encoded frame size of last non B frame (is used for sceneChange) mfxF64 fAbLong; // frame abberation (long period) mfxF64 fAbShort; // frame abberation (short period) mfxF64 dQuantAb; // dequant abberation mfxF64 totalDeviation; // deviation from target bitrate (total) mfxF64 eRate; // eRate of last encoded frame, this parameter is used for scene change calculation mfxF64 eRateSH; // eRate of last encoded scene change frame, this parameter is used for scene change calculation }; class ExtBRC { private: cBRCParams m_par; std::unique_ptr < HRDCodecSpec> m_hrdSpec; bool m_bInit; bool m_bDynamicInit; BRC_Ctx m_ctx; std::unique_ptr m_avg; mfxU32 m_SkipCount; mfxU32 m_ReEncodeCount; std::vector m_MBQP; std::vector m_MBQPBuff; std::vector m_ExtBuff; public: ExtBRC(): m_par(), m_hrdSpec(), m_bInit(false), m_bDynamicInit(false), m_SkipCount(0), m_ReEncodeCount(0) { memset(&m_ctx, 0, sizeof(m_ctx)); } mfxStatus Init (mfxVideoParam* par); mfxStatus Reset(mfxVideoParam* par); mfxStatus Close () { //printf("\nFrames skipped: %i \n", m_SkipCount); //printf("\nNumber of re-encodes: %i \n", m_ReEncodeCount); m_bInit = false; return MFX_ERR_NONE; } mfxStatus GetFrameCtrl (mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl); mfxStatus Update (mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status); protected: mfxI32 GetCurQP(mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ); // Get QP for current frame mfxI32 GetSeqQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ); // Get P-QP from QP of given frame mfxI32 GetPicQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ); // Get QP for given frame from P-QP mfxF64 ResetQuantAb(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxF64 fAbLong, mfxU32 eo, bool bIdr, mfxU16 clsAPQ); }; } namespace HEVCExtBRC { inline mfxStatus Init (mfxHDL pthis, mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(pthis); return ((MfxHwH265EncodeBRC::ExtBRC*)pthis)->Init(par) ; } inline mfxStatus Reset (mfxHDL pthis, mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(pthis); return ((MfxHwH265EncodeBRC::ExtBRC*)pthis)->Reset(par) ; } inline mfxStatus Close (mfxHDL pthis) { MFX_CHECK_NULL_PTR1(pthis); return ((MfxHwH265EncodeBRC::ExtBRC*)pthis)->Close() ; } inline mfxStatus GetFrameCtrl (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl) { MFX_CHECK_NULL_PTR1(pthis); return ((MfxHwH265EncodeBRC::ExtBRC*)pthis)->GetFrameCtrl(par,ctrl) ; } inline mfxStatus Update (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status) { MFX_CHECK_NULL_PTR1(pthis); return ((MfxHwH265EncodeBRC::ExtBRC*)pthis)->Update(par,ctrl, status) ; } inline mfxStatus Create(mfxExtBRC & m_BRC) { MFX_CHECK(m_BRC.pthis == NULL, MFX_ERR_UNDEFINED_BEHAVIOR); m_BRC.pthis = new MfxHwH265EncodeBRC::ExtBRC; m_BRC.Init = Init; m_BRC.Reset = Reset; m_BRC.Close = Close; m_BRC.GetFrameCtrl = GetFrameCtrl; m_BRC.Update = Update; return MFX_ERR_NONE; } inline mfxStatus Destroy(mfxExtBRC & m_BRC) { MFX_CHECK(m_BRC.pthis != NULL, MFX_ERR_NONE); delete (MfxHwH265EncodeBRC::ExtBRC*)m_BRC.pthis; m_BRC.pthis = 0; m_BRC.Init = 0; m_BRC.Reset = 0; m_BRC.Close = 0; m_BRC.GetFrameCtrl = 0; m_BRC.Update = 0; return MFX_ERR_NONE; } } #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_common_decode_int.h000066400000000000000000000067521443134507600317500ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_COMMON_DECODE_INT_H__ #define __MFX_COMMON_DECODE_INT_H__ #include #include "mfx_common.h" #include "mfx_common_int.h" #include "umc_video_decoder.h" #include "mfx_platform_caps.h" class MFXMediaDataAdapter : public UMC::MediaData { public: MFXMediaDataAdapter(mfxBitstream *pBitstream = 0); void Load(mfxBitstream *pBitstream); void Save(mfxBitstream *pBitstream); void SetExtBuffer(mfxExtBuffer*); }; mfxStatus ConvertUMCStatusToMfx(UMC::Status status); void ConvertMFXParamsToUMC(mfxVideoParam const*, UMC::VideoStreamInfo*); void ConvertMFXParamsToUMC(mfxVideoParam const*, UMC::VideoDecoderParams*); UMC::ColorFormat ConvertFOURCCToUMCColorFormat(mfxU32); mfxU32 ConvertUMCColorFormatToFOURCC(UMC::ColorFormat); void ConvertUMCParamsToMFX(UMC::VideoStreamInfo const*, mfxVideoParam*); void ConvertUMCParamsToMFX(UMC::VideoDecoderParams const*, mfxVideoParam*); bool IsNeedChangeVideoParam(mfxVideoParam *par); mfxU16 FourCcBitDepth(mfxU32 fourCC); bool InitBitDepthFields(mfxFrameInfo *info); inline mfxU32 ExtractProfile(mfxU32 profile) { return profile & 0xFF; } inline bool IsMVCProfile(mfxU32 profile) { profile = ExtractProfile(profile); return (profile == MFX_PROFILE_AVC_MULTIVIEW_HIGH || profile == MFX_PROFILE_AVC_STEREO_HIGH); } #if defined(MFX_ENABLE_SVC_VIDEO_DECODE) inline bool IsSVCProfile(mfxU32 profile) { profile = ExtractProfile(profile); return (profile == MFX_PROFILE_AVC_SCALABLE_BASELINE || profile == MFX_PROFILE_AVC_SCALABLE_HIGH); } #endif inline void MoveBitstreamData(mfxBitstream& bs, mfxU32 offset) { assert(offset <= bs.DataLength); bs.DataOffset += offset; bs.DataLength -= offset; } // Memory reference counting base class class RefCounter { public: RefCounter() : m_refCounter(0) { } void IncrementReference() const; void DecrementReference(); void ResetRefCounter() { m_refCounter = 0; } uint32_t GetRefCounter() const { return m_refCounter; } protected: mutable int32_t m_refCounter; virtual ~RefCounter() { } virtual void Free() { } }; inline mfxU16 CalculateNumThread(mfxVideoParam *par) { (void)par; return 1; } inline mfxU32 CalculateAsyncDepth(mfxVideoParam *par) { mfxU32 asyncDepth = par ? par->AsyncDepth : 0; if (!asyncDepth) { asyncDepth = MFX_AUTO_ASYNC_DEPTH_VALUE; } return asyncDepth; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_common_int.h000066400000000000000000000117351443134507600304420ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_COMMON_INT_H__ #define __MFX_COMMON_INT_H__ #include #include #include #include "mfx_common.h" #include "mfxsurfacepool.h" mfxStatus CheckFrameInfoCommon(mfxFrameInfo *info, mfxU32 codecId); mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info); mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId); mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId = MFX_CODEC_AVC); mfxStatus CheckVideoParamEncoders(mfxVideoParam *in, eMFXHWType type); mfxStatus CheckVideoParamDecoders(mfxVideoParam *in, eMFXHWType type); mfxStatus UpdateCscOutputFormat(mfxVideoParam *par, mfxFrameAllocRequest *request); mfxStatus CheckBitstream(const mfxBitstream *bs); mfxStatus CheckFramePointers(mfxFrameInfo const& info, mfxFrameData const& data); mfxStatus CheckFrameData(const mfxFrameSurface1 *surface); mfxStatus CheckDecodersExtendedBuffers(mfxVideoParam const* par); mfxStatus PackMfxFrameRate(mfxU32 nom, mfxU32 denom, mfxU32& packed); // fit u32 args to u16 and pack: (den << 16) | nom, returns MFX_WRN_VIDEO_PARAM_CHANGED if result differs mfxExtBuffer* GetExtendedBuffer(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id); mfxExtBuffer* GetExtendedBufferInternal(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id); class ExtendedBuffer { public: ExtendedBuffer(); virtual ~ExtendedBuffer(); template void AddTypedBuffer(mfxU32 id) { if (GetBufferByIdInternal(id)) return; mfxExtBuffer * buffer = (mfxExtBuffer *)(new mfxU8[sizeof(T)]); memset(buffer, 0, sizeof(T)); buffer->BufferSz = sizeof(T); buffer->BufferId = id; AddBufferInternal(buffer); } void AddBuffer(mfxExtBuffer * buffer); size_t GetCount() const; template T * GetBufferById(mfxU32 id) { return (T*)GetBufferByIdInternal(id); } template T * GetBufferByPosition(mfxU32 pos) { return (T*)GetBufferByPositionInternal(pos); } mfxExtBuffer ** GetBuffers(); private: void AddBufferInternal(mfxExtBuffer * buffer); mfxExtBuffer * GetBufferByIdInternal(mfxU32 id); mfxExtBuffer * GetBufferByPositionInternal(mfxU32 pos); void Release(); typedef std::vector BuffersList; BuffersList m_buffers; }; class mfxVideoParamWrapper : public mfxVideoParam { public: mfxVideoParamWrapper(); mfxVideoParamWrapper(const mfxVideoParam & par); virtual ~mfxVideoParamWrapper(); mfxVideoParamWrapper & operator = (const mfxVideoParam & par); mfxVideoParamWrapper & operator = (const mfxVideoParamWrapper & par); bool CreateExtendedBuffer(mfxU32 bufferId); template T * GetExtendedBuffer(mfxU32 id) { T * extBuf = m_buffers.GetBufferById(id); if (!extBuf) { m_buffers.AddTypedBuffer(id); extBuf = m_buffers.GetBufferById(id); if (!extBuf) throw 1; NumExtParam = mfxU16(m_buffers.GetCount()); ExtParam = m_buffers.GetBuffers(); } return extBuf; } private: ExtendedBuffer m_buffers; mfxU8* m_mvcSequenceBuffer; void CopyVideoParam(const mfxVideoParam & par); // Deny copy constructor mfxVideoParamWrapper(const mfxVideoParamWrapper &); }; mfxU8* GetFramePointer(mfxU32 fourcc, mfxFrameData const&); mfxU8* GetFramePointer(const mfxFrameSurface1& surf); mfxStatus GetFramePointerChecked(mfxFrameInfo const& info, mfxFrameData const&, mfxU8**); bool IsSurfaceEmpty(const mfxFrameSurface1 & surface); mfxFrameSurface1 MakeSurface(mfxFrameInfo const& fi, const mfxFrameSurface1& surface); mfxFrameSurface1 MakeSurface(mfxFrameInfo const& fi, mfxMemId mid); mfxU16 BitDepthFromFourcc(mfxU32 fourcc); mfxU16 ChromaFormatFromFourcc(mfxU32 fourcc); mfxPlatform MakePlatform(eMFXHWType type, mfxU16 device_id); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_critical_error_handler.h000066400000000000000000000030141443134507600327670ustar00rootroot00000000000000// Copyright (c) 2016-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" class MfxCriticalErrorHandler { public: MfxCriticalErrorHandler(void); protected: mfxStatus ReturningCriticalStatus(); bool NeedToReturnCriticalStatus(mfxBitstream *bs); void SetCriticalErrorOccured(mfxStatus errorStatus); bool CriticalErrorOccured(); private: bool m_CriticalErrorReportedAtLeastOnce; mfxStatus m_CriticalErrorStatus; };oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_ddi_enc_dump.h000066400000000000000000000040601443134507600307030ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. typedef struct tagENCODE_SET_SEQUENCE_PARAMETERS_H264 ENCODE_SET_SEQUENCE_PARAMETERS_H264; typedef struct tagENCODE_SET_PICTURE_PARAMETERS_H264 ENCODE_SET_PICTURE_PARAMETERS_H264; typedef struct tagENCODE_SET_SLICE_HEADER_H264 ENCODE_SET_SLICE_HEADER_H264; void ddiDumpH264SPS(FILE *f, ENCODE_SET_SEQUENCE_PARAMETERS_H264* sps); void ddiDumpH264PPS(FILE *f, ENCODE_SET_PICTURE_PARAMETERS_H264* pps); void ddiDumpH264SliceHeader(FILE *f, ENCODE_SET_SLICE_HEADER_H264* sh, int NumSlice); void ddiDumpH264MBData(FILE *fText, mfxI32 _PicNum, mfxI32 PicType, mfxI32 PicWidth, mfxI32 PicHeight, mfxI32 NumSlicesPerPic, mfxI32 NumMBs, void *pMBData, void *pMVData); oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_enc_common.h000066400000000000000000000164001443134507600304070ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_ENC_COMMON_H_ #define _MFX_ENC_COMMON_H_ #include "mfxdefs.h" #include "mfxstructures.h" #include "umc_structures.h" #include "mfx_common.h" #include "mfx_common_int.h" class InputSurfaces { private: bool m_bSysMemFrames; VideoCORE* m_pCore; mfxFrameAllocRequest m_request; mfxFrameAllocResponse m_response; bool m_bInitialized; mfxFrameInfo m_Info; public: InputSurfaces(VideoCORE* pCore): m_bSysMemFrames(false), m_pCore(pCore), m_bInitialized (false) { memset(&m_request, 0, sizeof(mfxFrameAllocRequest)); memset(&m_response, 0, sizeof (mfxFrameAllocResponse)); memset(&m_Info,0,sizeof(mfxFrameInfo)); } virtual ~InputSurfaces() { Close(); } mfxStatus Reset(mfxVideoParam *par); mfxStatus Close(); inline bool isSysMemFrames () {return m_bSysMemFrames;} inline mfxFrameSurface1 *GetOriginalSurface(mfxFrameSurface1 *surface) { return surface; } }; //----MFX data -> UMC data-------------------------------------------- mfxU8 CalculateMAXBFrames (mfxU8 GopRefDist); mfxU16 CalculateUMCGOPLength (mfxU16 GOPSize, mfxU8 targetUsage); bool SetPROParameters (mfxU8 TargetUsages,mfxU8 &MESpeed, bool &UseFB, bool &FastFB, bool &bIntensityCompensation, bool &bChangeInterpolationType, bool &bChangeVLCTables, bool &bTrellisQuantization, bool &bUsePadding, bool &bVSTransform, bool &deblocking, mfxU8 &smoothing, bool &fastUVMC); bool SetUFParameters(mfxU8 TargetUsages, bool& mixed,mfxU32& twoRef ); mfxU32 CalculateUMCBitrate(mfxU16 TargetKbps); double CalculateUMCFramerate(mfxU32 FrameRateExtN, mfxU32 FrameRateExtD); void CalculateMFXFramerate(double framerate, mfxU32* FrameRateExtN, mfxU32* FrameRateExtD); void ConvertFrameRateMPEG2(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxI32 &frame_rate_code, mfxI32 &frame_rate_extension_n, mfxI32 &frame_rate_extension_d); //void ConvertFrameRateMPEG2(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxI32 &frame_rate_code, mfxI32 &frame_rate_extension_n, mfxI32 &frame_rate_extension_d); mfxStatus CheckFrameRateMPEG2(mfxU32 &FrameRateExtD, mfxU32 &FrameRateExtN); mfxStatus CheckAspectRatioMPEG2 (mfxU16 &aspectRatioW, mfxU16 &aspectRatioH, mfxU32 frame_width, mfxU32 frame_heigth, mfxU16 cropW, mfxU16 cropH); mfxStatus AllocInternalEncBuffer(VideoCORE* pCore, const mfxU16& numFrameMin, const mfxVideoParam& par, mfxFrameAllocResponse& response); bool IsFrameRateMPEG2Supported(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN); bool IsAspectRatioMPEG2Supported (mfxU32 aspectRatioW, mfxU32 aspectRatioH, mfxU32 frame_width, mfxU32 frame_heigth, mfxU32 cropW, mfxU32 cropH); mfxU8 GetAspectRatioCode (mfxU32 dispAspectRatioW, mfxU32 dispAspectRatioH); bool RecalcFrameMPEG2Rate (mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxU32 &OutFrameRateExtD, mfxU32 &OutFrameRateExtN); mfxU32 TranslateMfxFRCodeMPEG2(mfxFrameInfo *info, mfxU32 *codeN, mfxU32* codeD); // returns mpeg2 fr code mfxExtBuffer* GetExtBuffer (mfxExtBuffer** ebuffers, mfxU32 nbuffers, mfxU32 BufferId); mfxExtCodingOption* GetExtCodingOptions(mfxExtBuffer** ebuffers, mfxU32 nbuffers); mfxExtVideoSignalInfo* GetExtVideoSignalInfo(mfxExtBuffer** ebuffers, mfxU32 nbuffers); mfxExtChromaLocInfo* GetExtChromaLocInfo(mfxExtBuffer** ebuffers, mfxU32 nbuffers); mfxStatus CheckExtVideoSignalInfo(mfxExtVideoSignalInfo * videoSignalInfo); mfxStatus CheckExtChromaLocInfo(mfxExtChromaLocInfo* chromaLocInfo); inline mfxI32 min4(mfxI32 a, mfxI32 b,mfxI32 c,mfxI32 d) { if (a>b) { if (c MFX data-------------------------------------------- mfxU16 CalculateMFXGOPLength (mfxU16 GOPSize); mfxU8 CalculateGopRefDist(mfxU8 BNum); inline bool isIntra(mfxU8 FrameType) { return (FrameType & MFX_FRAMETYPE_I); } bool CorrectProfileLevelMpeg2(mfxU16 &profile, mfxU16 & level, mfxU32 w, mfxU32 h, mfxF64 frame_rate, mfxU32 bitrate, mfxU32 GopRefDist); inline mfxI64 CalcDTSForRefFrameMpeg2(mfxI64 PTS, mfxI32 lastRefDist, mfxU32 maxRefDist, mfxF64 frameRate) { return (maxRefDist == 1 || PTS == -1) ? PTS : PTS - (mfxI64)((1.0/frameRate)*(lastRefDist > 0 ? lastRefDist : 1)*90000); } inline mfxI64 CalcDTSForNonRefFrameMpeg2(mfxI64 PTS) { return PTS; } enum MBQPMode { MBQPMode_None = 0, MBQPMode_ExternalMap = 1, MBQPMode_ForROI = 2, MBQPMode_FromEncToolsLA = 3, MBQPMode_FromEncToolsBRC = 4, MBQPMode_ForALQOffset = 5, }; MBQPMode GetMBQPMode(const mfxVideoParam& par, mfxU32 maxNumOfROI, mfxU32 ROIDeltaQPSupport, bool MbQpDataSupport, bool bFieldMode); bool IsSWBRCMode(const mfxVideoParam& par); bool IsEnctoolsLAGS(const mfxVideoParam& par); bool IsEnctoolsLABRC(const mfxVideoParam& par); mfxStatus FillMBQPBuffer( const mfxU8* mbqpInputBuffer, mfxU32 mbqpInputBufferSize, mfxU32 picWidth, mfxU32 picHeight, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned, mfxU32 block_width, mfxU32 block_height); mfxStatus FillMBMapViaROI(const mfxExtEncoderROI& roi, mfxI8* pMbMap, mfxU32 width, mfxU32 height, mfxU32 pitch, mfxU32 block_width, mfxU32 block_height, mfxI8 QpY); mfxStatus FillCUQPData(const mfxExtMBQP* mbqpInput, mfxU32 picWidth, mfxU32 picHeight, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned, mfxU32 block_width, mfxU32 block_height); mfxStatus FillCUQPData(mfxI8 QpY, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned); struct Rational {mfxU64 n, d;}; #define D3DFMT_NV12 (D3DFORMAT)(MFX_MAKEFOURCC('N', 'V', '1', '2')) #define D3DDDIFMT_NV12 (D3DDDIFORMAT)(MFX_MAKEFOURCC('N', 'V', '1', '2')) #define D3DDDIFMT_YU12 (D3DDDIFORMAT)(MFX_MAKEFOURCC('Y', 'U', '1', '2')) #endif //_MFX_ENC_COMMON_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_enc_enctools_common.h000066400000000000000000000022641443134507600323200ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENC_ENCTOOLS_COMMON_H__ #define __MFX_ENC_ENCTOOLS_COMMON_H__ #endifoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_frames.h000066400000000000000000000562151443134507600275570ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_FRAMES_H_ #define _MFX_FRAMES_H_ #include #include #include "mfxdefs.h" #include "mfx_common_int.h" #include "vm_event.h" #define NUM_TASKS 256 /*------- Task between sync/async encoder parts (1 entry point in async part)-------------------------*/ struct sExtTask1 { mfxEncodeInternalParams m_inputInternalParams; mfxFrameSurface1 *m_pInput_surface; mfxBitstream *m_pBs; vm_event m_new_frame_event; sExtTask1() : m_inputInternalParams() { m_pInput_surface = 0; m_pBs = 0; vm_event_set_invalid(&m_new_frame_event); vm_event_init(&m_new_frame_event,0,0); } virtual ~sExtTask1() { vm_event_destroy(&m_new_frame_event); } }; /*------- Task between sync/async encoder parts (2 entry points in async part: submit and query)------------*/ struct sExtTask2 : public sExtTask1 { mfxU32 m_nInternalTask; sExtTask2(): sExtTask1(), m_nInternalTask(0) { } virtual ~sExtTask2() { } }; /*------- Tasks between sync/async encoder parts (1 entry point in async part)-------------------------*/ class clExtTasks1 { public: clExtTasks1() { m_numTasks = 0; m_currTask = 0; m_maxTasks = NUM_TASKS; m_pTasks = new sExtTask1[m_maxTasks]; } virtual ~clExtTasks1() { if (m_pTasks) { delete [] m_pTasks; } } mfxStatus AddTask ( mfxEncodeInternalParams *pParams, mfxFrameSurface1 *input_surface, mfxBitstream *bs, sExtTask1 **pOutTask) { std::lock_guard guard(m_mGuard); if (m_numTasks < m_maxTasks) { sExtTask1 *pTask = &m_pTasks[(m_currTask + m_numTasks)% m_maxTasks]; if (pParams) { pTask->m_inputInternalParams = *pParams; } pTask->m_pInput_surface = input_surface; pTask->m_pBs = bs; #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) vm_event_signal (&pTask->m_new_frame_event); #endif *pOutTask = pTask; m_numTasks ++; return MFX_ERR_NONE; } return MFX_WRN_IN_EXECUTION; } mfxStatus CheckTask (sExtTask1 *pInputTask) { std::lock_guard guard(m_mGuard); mfxStatus sts = MFX_ERR_MORE_DATA; if (m_numTasks > 0) { /* task for current frame or task for the same frame */ if (pInputTask == &m_pTasks[m_currTask]) { sts = MFX_ERR_NONE; } else { m_currTask = (m_currTask + 1)% m_maxTasks; m_numTasks = m_numTasks - 1; if (m_numTasks > 0 && pInputTask == &m_pTasks[m_currTask]) { sts = MFX_ERR_NONE; } } } return sts; } private: sExtTask1* m_pTasks; std::mutex m_mGuard; mfxU32 m_maxTasks; mfxU32 m_numTasks; mfxU32 m_currTask; // Declare private copy constructor to avoid accidental assignment clExtTasks1(const clExtTasks1 &); clExtTasks1 & operator = (const clExtTasks1 &); }; /*------- Tasks between sync/async encoder parts (2 entry points in async part: submit and query)------------*/ class clExtTasks2 { public: clExtTasks2() { m_numTasks = 0; m_currTask = 0; m_maxTasks = NUM_TASKS; m_pTasks = new sExtTask2[m_maxTasks]; m_numSubmittedTasks = 0; } virtual ~clExtTasks2() { if (m_pTasks) { delete [] m_pTasks; } } mfxStatus AddTask ( mfxEncodeInternalParams *pParams, mfxFrameSurface1 *input_surface, mfxBitstream *bs, sExtTask2 **pOutTask) { std::lock_guard guard(m_mGuard); if (m_numTasks < m_maxTasks) { sExtTask2 *pTask = &m_pTasks[(m_currTask + m_numTasks)% m_maxTasks]; if (pParams) { pTask->m_inputInternalParams = *pParams; } pTask->m_pInput_surface = input_surface; pTask->m_pBs = bs; pTask->m_nInternalTask = 0; #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) vm_event_signal (&pTask->m_new_frame_event); #endif *pOutTask = pTask; m_numTasks ++; return MFX_ERR_NONE; } return MFX_WRN_IN_EXECUTION; } mfxStatus CheckTaskForSubmit(sExtTask2 *pInputTask) { std::lock_guard guard(m_mGuard); mfxStatus sts = MFX_ERR_MORE_DATA; if (m_numTasks >= m_numSubmittedTasks) { if (pInputTask == m_pTasks + ((m_currTask + m_numSubmittedTasks - 1)% m_maxTasks)) { sts = MFX_ERR_NONE; } else if (m_numTasks > m_numSubmittedTasks) { m_numSubmittedTasks ++; mfxU32 nTask = (m_currTask + m_numSubmittedTasks - 1)% m_maxTasks; sts = ( pInputTask == &m_pTasks[nTask]) ? MFX_ERR_NONE : MFX_ERR_UNDEFINED_BEHAVIOR; } } return sts; } sExtTask2* GetTaskForQuery () { std::lock_guard guard(m_mGuard); sExtTask2* task = (m_numTasks > 0 && m_numSubmittedTasks > 0) ? &m_pTasks[m_currTask] : 0; return task; } mfxStatus NextFrame () { mfxStatus sts = MFX_ERR_UNDEFINED_BEHAVIOR; std::lock_guard guard(m_mGuard); if (m_numTasks > 0 && m_numSubmittedTasks > 0) { m_currTask = (m_currTask + 1)% m_maxTasks; m_numTasks = m_numTasks - 1; m_numSubmittedTasks = m_numSubmittedTasks - 1; sts = MFX_ERR_NONE; } return sts; } private: sExtTask2* m_pTasks; std::mutex m_mGuard; mfxU32 m_maxTasks; mfxU32 m_numTasks; mfxU32 m_currTask; mfxU32 m_numSubmittedTasks; // Declare private copy constructor to avoid accidental assignment clExtTasks2(const clExtTasks2 &); clExtTasks2 & operator = (const clExtTasks2 &); }; struct sFrameEx { mfxFrameSurface1* m_pFrame; mfxU16 m_FrameType; mfxU32 m_FrameOrder; mfxEncodeInternalParams m_sEncodeInternalParams; bool m_bAddHeader; bool m_bAddEOS; bool m_bOnlyBwdPrediction; bool m_bOnlyFwdPrediction; }; inline void GetFrameTypeMpeg2 (mfxI32 FrameOrder, mfxI32 GOPSize, mfxI32 IPDist, bool bClosedGOP, mfxU16* FrameType) { mfxI32 pos = (GOPSize)? (FrameOrder %(GOPSize)):FrameOrder; if (pos == 0 || IPDist == 0 || (*FrameType & MFX_FRAMETYPE_IDR) != 0) { *FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF | MFX_FRAMETYPE_IDR; } else { pos = (bClosedGOP && pos == GOPSize-1)? 0 : pos % (IPDist); *FrameType = ((pos != 0) && ((*FrameType & MFX_FRAMETYPE_REF) == 0)) ? (mfxU16)MFX_FRAMETYPE_B : (mfxU16)(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); } } inline mfxStatus ReleasePlane(mfxFrameSurface1* pFrame) { if (pFrame) { //pFrame->Data.Locked= 0; } return MFX_ERR_NONE; } inline bool isReferenceFrame(mfxU16 FrameType) { return ((FrameType & MFX_FRAMETYPE_I) || (FrameType & MFX_FRAMETYPE_P) || (FrameType & MFX_FRAMETYPE_REF)); } inline bool isIntraFrame(mfxU16 FrameType) { return (FrameType & MFX_FRAMETYPE_I); } inline bool isReferenceFrame(mfxU16 FrameType, mfxU16 FrameType2) { if(!FrameType2) { return ((FrameType & MFX_FRAMETYPE_I) || (FrameType & MFX_FRAMETYPE_P) || (FrameType & MFX_FRAMETYPE_REF)); } else { return (((FrameType & MFX_FRAMETYPE_I) || (FrameType & MFX_FRAMETYPE_P) || (FrameType & MFX_FRAMETYPE_REF)) && ((FrameType2 & MFX_FRAMETYPE_I) || (FrameType2 & MFX_FRAMETYPE_P) || (FrameType2 & MFX_FRAMETYPE_REF)) ); } } inline bool isPredictedFrame(mfxU16 FrameType) { return (FrameType & MFX_FRAMETYPE_P) != 0; } inline bool isPredictedFrame(mfxU16 FrameType, mfxU16 FrameType2) { return ((FrameType & MFX_FRAMETYPE_P) || (FrameType2 & MFX_FRAMETYPE_P)) != 0; } inline bool isBPredictedFrame(mfxU16 FrameType) { return (FrameType & MFX_FRAMETYPE_B) != 0; } inline bool isBPredictedFrame(mfxU16 FrameType, mfxU16 FrameType2) { return ((FrameType & MFX_FRAMETYPE_B) || (FrameType2 & MFX_FRAMETYPE_B)) != 0; } class MFXGOP { public: MFXGOP(): m_maxB(0), m_pFrames(0), m_numBuffB(0), m_iCurr(0), m_bClosedGOP(0), m_nGOPsInSeq(0), m_bAddEOS(0), m_bEncodedOrder(0), m_nGOPs (0) {}; virtual ~MFXGOP() { Close(); } inline mfxU32 GetNumberOfB() { return m_numBuffB; } protected: mfxI32 m_maxB; sFrameEx * m_pFrames; /* 0 - forward reference frame, 1 - backward reference frame other - B frames*/ mfxI32 m_numBuffB; mfxI32 m_iCurr; bool m_bClosedGOP; mfxI32 m_nGOPsInSeq; bool m_bAddEOS; bool m_bEncodedOrder; mfxI32 m_nGOPs; protected: inline bool NewGOP () { mfxStatus MFXSts = MFX_ERR_NONE; MFXSts = ReleasePlane(m_pFrames[0].m_pFrame); if(MFXSts != MFX_ERR_NONE) return false; m_pFrames[0] = m_pFrames[1]; memset (&m_pFrames[1], 0, sizeof(sFrameEx)); m_iCurr = 1; m_numBuffB = 0; return true; } inline virtual bool AddBFrame(sFrameEx* pFrameEx) { if (m_numBuffB < m_maxB && m_pFrames[0].m_pFrame != 0 && ((m_bEncodedOrder && m_pFrames[1].m_pFrame != 0)|| (!m_bEncodedOrder && m_pFrames[1].m_pFrame == 0))) { m_pFrames[m_numBuffB+2] = *pFrameEx; m_numBuffB ++; return true; } return false; } inline virtual bool AddReferenceFrame(sFrameEx* pFrameEx) { if (m_pFrames[0].m_pFrame && m_pFrames[1].m_pFrame ) return false; if (isIntraFrame(pFrameEx->m_FrameType)) { if (!m_nGOPs) { pFrameEx->m_bAddHeader = true; } m_nGOPs ++; if (m_nGOPsInSeq!=0 && m_nGOPs >= m_nGOPsInSeq) { m_nGOPs = 0; } } if (m_pFrames[0].m_pFrame == 0) { m_pFrames[0]= *pFrameEx; return true; } else if (m_pFrames[1].m_pFrame == 0) { m_pFrames[1]= *pFrameEx; return true; } return false; } public: inline bool AddFrame(sFrameEx* pFrameEx) { if (isReferenceFrame(pFrameEx->m_FrameType)) { if (m_iCurr>= m_numBuffB+2 && m_bEncodedOrder) { NewGOP(); } return AddReferenceFrame(pFrameEx); } else { return AddBFrame(pFrameEx); } } inline virtual mfxStatus Init(mfxU32 maxB, bool bClosedGOP, mfxI32 nGOPsInSeq, bool bAddEOS, bool bEncodedOrder) { Close(); m_maxB = maxB; m_pFrames = new sFrameEx [m_maxB+2]; Reset(bClosedGOP,nGOPsInSeq,bAddEOS, bEncodedOrder); return MFX_ERR_NONE; } inline mfxI32 GetMaxBFrames () { return m_maxB; } inline virtual void Reset(bool bClosedGOP,mfxI32 nGOPsInSeq, bool bAddEOS, bool bEncodedOrder) { if (m_pFrames) { memset(m_pFrames,0,sizeof(sFrameEx)*(m_maxB+2)); } m_iCurr = 0; m_numBuffB = 0; m_nGOPs = 0; m_bClosedGOP = bClosedGOP; m_nGOPsInSeq = nGOPsInSeq; m_bAddEOS = bAddEOS; m_bEncodedOrder = bEncodedOrder; }; inline bool GetFrameExForDecoding(sFrameEx* pFrame, bool bNextRefIntra, bool bNextB, bool bLast) { if (m_iCurr < m_numBuffB + 2 && m_pFrames[m_iCurr].m_pFrame) { *pFrame = m_pFrames[m_iCurr]; if ((m_iCurr > 1) && isIntraFrame(m_pFrames[1].m_FrameType) && (m_bClosedGOP)) { pFrame->m_bOnlyBwdPrediction = true; } if (m_bAddEOS && ((bNextRefIntra && m_nGOPs == 0) || bLast) && ((m_bEncodedOrder && !bNextB ) || (!m_bEncodedOrder && m_iCurr == 2 + m_numBuffB - 1))) { pFrame->m_bAddEOS = true; } return true; } if (m_iCurr < m_numBuffB + 2 && !m_pFrames[m_iCurr].m_pFrame && bLast) // check if all next fwd_only && no refs for this one { m_iCurr++; *pFrame = m_pFrames[m_iCurr]; if (m_bAddEOS && ((m_bEncodedOrder && !bNextB) || (!m_bEncodedOrder && m_iCurr == 2 + m_numBuffB - 1))) { pFrame->m_bAddEOS = true; } return true; } return false; } inline virtual void ReleaseCurrentFrame() { if (!m_pFrames[m_iCurr].m_pFrame) return; if (m_iCurr>1) { ReleasePlane(m_pFrames[m_iCurr].m_pFrame); memset (&m_pFrames[m_iCurr], 0, sizeof(sFrameEx)); } m_iCurr++; if (m_iCurr>= m_numBuffB+2 && (!m_bEncodedOrder)) { NewGOP(); } } // with strictGop make B w/only forward reference. without - change type to P inline virtual void CloseGop(bool strictGop) { if (m_pFrames[1].m_pFrame == 0 && m_numBuffB>0) { mfxU16 pictureType = 0; if (!strictGop) { sFrameEx * pFrame = &m_pFrames[2 + m_numBuffB-1]; m_pFrames[1]= *pFrame; pictureType = (mfxU16)(MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF); memset (pFrame, 0, sizeof (sFrameEx)); m_numBuffB --; m_pFrames[1].m_FrameType = pictureType; m_pFrames[1].m_sEncodeInternalParams.FrameType = pictureType; m_pFrames[1].m_bOnlyFwdPrediction = true; if (m_bAddEOS && (m_numBuffB == 0)) { m_pFrames[1].m_bAddEOS = true; } } else { for (int i = 0; i < m_numBuffB; i++) { m_pFrames[2 + i].m_bOnlyFwdPrediction = true; } } } if (m_bAddEOS && (!strictGop || (m_numBuffB != 0))) { m_pFrames[2 + m_numBuffB - 1].m_bAddEOS = true; } } inline bool GetFrameExReference(sFrameEx* pFrame, bool bBackward = false) { mfxU32 n = (bBackward)? 1:0; if (m_pFrames[n].m_pFrame) { *pFrame = m_pFrames[n]; return true; } return false; } void Close() { if (m_pFrames) { delete [] m_pFrames; m_pFrames = 0; } m_iCurr = 0; m_numBuffB = 0; m_maxB = 0; m_nGOPs = 0; } private: // Declare private copy constructor to avoid accidental assignment MFXGOP(const MFXGOP &); MFXGOP & operator = (const MFXGOP &); }; class MFXWaitingList { public: MFXWaitingList(): m_maxN(0), m_curIndex(0), m_nFrames(0), m_pFrames(0), m_minN(0), m_delay(0) {}; ~MFXWaitingList() { Close(); } void Close() { if (m_pFrames) { delete [] m_pFrames; m_pFrames = 0; } m_maxN = 0; m_curIndex = 0; m_nFrames = 0; m_minN=0; m_delay = 0; } mfxStatus Init(mfxU32 maxN, mfxU32 minN, mfxU32 delay) { Close(); m_maxN = maxN; m_minN = minN; m_delay = delay; if (m_minN > m_maxN) return MFX_ERR_UNSUPPORTED; m_pFrames = new sFrameEx [ m_maxN]; if (!m_pFrames) return MFX_ERR_MEMORY_ALLOC; memset (m_pFrames,0, sizeof(sFrameEx)*m_maxN); return MFX_ERR_NONE; } mfxI32 GetMaxFrames () { return m_maxN; } mfxI32 GetDelay() { return m_delay; } void Reset(mfxI32 minN, mfxU32 delay) { mfxU32 i = 0; if(m_pFrames) { for(i = 0; i < m_maxN; i++) { ReleasePlane(m_pFrames[i].m_pFrame); } memset (m_pFrames,0, sizeof(sFrameEx)* m_maxN); } m_curIndex = 0; m_nFrames = 0; m_minN = minN; m_delay = delay; } bool AddFrame(mfxFrameSurface1* frame, mfxEncodeInternalParams *pInInternalParams) { if (m_nFrames < m_maxN) { mfxU32 ind = (m_curIndex + m_nFrames)%m_maxN; m_pFrames[ind].m_pFrame = frame; m_pFrames[ind].m_FrameOrder = pInInternalParams->FrameOrder; m_pFrames[ind].m_FrameType = pInInternalParams->FrameType; m_pFrames[ind].m_bAddEOS = false; m_pFrames[ind].m_bAddHeader = false; m_pFrames[ind].m_bOnlyBwdPrediction = false; m_pFrames[ind].m_sEncodeInternalParams = *pInInternalParams; m_nFrames ++; return true; } return false; } bool GetFrameEx(sFrameEx* pFrameEx, bool bEOF = false) { if (m_nFrames>0 && (bEOF || (m_nFrames > m_minN && m_nFrames > m_delay))) { *pFrameEx = m_pFrames[m_curIndex]; m_delay = 0; return true; } return false; } bool MoveOnNextFrame() { if (m_nFrames>0) { m_curIndex = (1+m_curIndex)%m_maxN; m_nFrames--; return true; } return false; } bool isNextReferenceIntra() { for (mfxU32 i=0; i < m_nFrames; i++) { mfxU32 ind = (m_curIndex+i)%m_maxN; mfxU16 type = m_pFrames[ind].m_FrameType; if (isReferenceFrame(type)) { return isIntraFrame(type)? true:false; } } return false; } bool isLastFrame() { return (m_nFrames < 1); } bool isNextBFrame() { if (m_nFrames != 0) { mfxU32 ind = (m_curIndex)%m_maxN; mfxU16 type = m_pFrames[ind].m_FrameType; return (isReferenceFrame (type))? false:true; } return false; } private: mfxU32 m_maxN; mfxU32 m_curIndex; mfxU32 m_nFrames; sFrameEx* m_pFrames; mfxU32 m_minN; mfxU32 m_delay; // Declare private copy constructor to avoid accidental assignment MFXWaitingList(const MFXWaitingList &); MFXWaitingList & operator = (const MFXWaitingList &); }; #endif //_MFX_FRAMES_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_interface.h000066400000000000000000000126441443134507600302400ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_INTERFACE_H #define __MFX_INTERFACE_H #include #include #if defined(_MSC_VER) // disable warning C4584 // << 'class1' : base-class 'class2' is already a base-class of 'class3' >>. // we use multiple inheritance for interfaces only, // so there is no interference on data members. #pragma warning(disable : 4584) #endif // defined(_MSC_VER) #pragma pack(1) // Declare the internal GUID type typedef struct MFX_GUID { mfxU32 Data1; mfxU16 Data2; mfxU16 Data3; mfxU8 Data4[8]; } MFX_GUID; #pragma pack() // Declare the function to compare GUIDs inline bool operator == (const MFX_GUID &guid0, const MFX_GUID &guid1) { const mfxU32 *pGUID0 = (const mfxU32 *) &guid0; const mfxU32 *pGUID1 = (const mfxU32 *) &guid1; if ((pGUID0[0] != pGUID1[0]) || (pGUID0[1] != pGUID1[1]) || (pGUID0[2] != pGUID1[2]) || (pGUID0[3] != pGUID1[3])) { return false; } return true; } // bool operator == (const MFX_GUID &guid0, const MFX_GUID &guid1) // Declare base interface class class MFXIUnknown { public: virtual ~MFXIUnknown(void){} // Query another interface from the object. If the pointer returned is not NULL, // the reference counter is incremented automatically. virtual void *QueryInterface(const MFX_GUID &guid) = 0; // Increment reference counter of the object. virtual void AddRef(void) = 0; // Decrement reference counter of the object. // If the counter is equal to zero, destructor is called and // object is removed from the memory. virtual void Release(void) = 0; // Get the current reference counter value virtual mfxU32 GetNumRef(void) const = 0; }; // Declaration of function to create object to support required interface template T* CreateInterfaceInstance(const MFX_GUID &guid); // Declare a template to query an interface template inline T *QueryInterface(MFXIUnknown* &pUnk, const MFX_GUID &guid) { void *pInterface = NULL; // have to create instance of required interface corresponding to GUID if (!pUnk) { pUnk = CreateInterfaceInstance(guid); } // query the interface if (pUnk) { pInterface = pUnk->QueryInterface(guid); } // cast pointer returned to the required interface return (T *) pInterface; } // T *QueryInterface(MFXIUnknown *pUnk, const MFX_GUID &guid) template class MFXIPtr { public: // Default constructor MFXIPtr(void) : m_pInterface(0) { } // Constructors MFXIPtr(const MFXIPtr &iPtr) : m_pInterface(0) { operator = (iPtr); } explicit MFXIPtr(void *pInterface) : m_pInterface(0) { operator = (pInterface); } // Destructor ~MFXIPtr(void) { Release(); } // Cast operator T * operator -> (void) const { return m_pInterface; } MFXIPtr & operator = (const MFXIPtr &iPtr) { // release the interface before setting new one Release(); // save the pointer to interface m_pInterface = iPtr.m_pInterface; if (m_pInterface) { // increment the reference counter m_pInterface->AddRef(); } return *this; } MFXIPtr & operator = (void *pInterface) { // release the interface before setting new one Release(); // save the pointer to interface m_pInterface = (T *) pInterface; // There is no need to increment the reference counter, // because it is supposed that the pointer is returned from // QueryInterface function. return *this; } inline bool operator == (const void *p) const { return (p == m_pInterface); } inline operator bool() const { return m_pInterface != 0; } protected: void Release(void) { if (m_pInterface) { // decrement the reference counter of the interface m_pInterface->Release(); m_pInterface = NULL; } } T *m_pInterface; // (T *) pointer to the interface }; template inline bool operator == (void *p, const MFXIPtr &ptr) { return (ptr == p); } // bool operator == (void *p, const MFXIPtr &ptr) #endif // __MFX_INTERFACE_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_interface_scheduler.h000066400000000000000000000110721443134507600322700ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_INTERFACE_SCHEDULER_H #define __MFX_INTERFACE_SCHEDULER_H #include #include #include #include // {BE080281-4C93-4D26-B763-ED2AAB5D4BA1} static const MFX_GUID MFXIScheduler_GUID = { 0xbe080281, 0x4c93, 0x4d26, { 0xb7, 0x63, 0xed, 0x2a, 0xab, 0x5d, 0x4b, 0xa1 } }; // {DC775B1C-951D-421F-BFD8-CA562D95A418} static const MFX_GUID MFXIScheduler2_GUID = { 0xdc775b1c, 0x951d, 0x421f, { 0xbf, 0xd8, 0xca, 0x56, 0x2d, 0x95, 0xa4, 0x18 } }; enum mfxSchedulerFlags { // default behaviour policy MFX_SCHEDULER_DEFAULT = 0, MFX_SINGLE_THREAD = 1 }; enum mfxSchedulerMessage { // Drop any performance adjustments MFX_SCHEDULER_RESET_TO_DEFAULTS = 0, // Start listening to the HW event from the driver MFX_SCHEDULER_START_HW_LISTENING = 1, // Stop listening to the HW event from the driver MFX_SCHEDULER_STOP_HW_LISTENING = 2 }; #pragma pack(1) struct MFX_SCHEDULER_PARAM { // Working flags for the scheduler being initialized mfxSchedulerFlags flags; // Number of working threads mfxU32 numberOfThreads; // core interface to get access to event handle in case of Metro mode VideoCORE *pCore; }; #pragma pack() // Forward declaration of used classes struct MFX_TASK; //class VideoCORE; // MFXIScheduler interface. // The interface provides task management and execution functionality. class MFXIScheduler : public MFXIUnknown { public: virtual ~MFXIScheduler(void){} // Initialize the scheduler. Initialize the dependency tables and run threads. virtual mfxStatus Initialize(const MFX_SCHEDULER_PARAM *pParam = 0) = 0; // Add a new task to the scheduler. Threads start processing task immediately. virtual mfxStatus AddTask(const MFX_TASK &task, mfxSyncPoint *pSyncPoint) = 0; // Make synchronization, wait until task is done. virtual mfxStatus Synchronize(mfxSyncPoint syncPoint, mfxU32 timeToWait) = 0; // Wait until specified dependency become resolved virtual mfxStatus WaitForDependencyResolved(const void *pDependency) = 0; // Wait until task(s) of specified owner become complete or unattended virtual mfxStatus WaitForAllTasksCompletion(const void *pOwner) = 0; // Reset 'waiting' status for tasks of specified owner virtual mfxStatus ResetWaitingStatus(const void *pOwner) = 0; // Check the current status of the scheduler. virtual mfxStatus GetState(void) = 0; // Get the initialization parameters of the scheduler virtual mfxStatus GetParam(MFX_SCHEDULER_PARAM *pParam) = 0; // Recover from the failure. virtual mfxStatus Reset(void) = 0; // Send a performance message to the scheduler virtual mfxStatus AdjustPerformance(const mfxSchedulerMessage message) = 0; #if defined(SCHEDULER_DEBUG) virtual mfxStatus AddTask(const MFX_TASK &task, void **ppSyncPoint, const char *pFileName, int lineNumber) = 0; #define AddTask(task, ppSyncPoint) \ AddTask(task, ppSyncPoint, __FILE__, __LINE__) #endif // defined(SCHEDULER_DEBUG) }; struct MFX_SCHEDULER_PARAM2: public MFX_SCHEDULER_PARAM { // user-adjustable extended parameters mfxExtThreadsParam params; }; class MFXIScheduler2 : public MFXIScheduler { public: virtual mfxStatus Initialize2(const MFX_SCHEDULER_PARAM2 *pParam = 0) = 0; virtual mfxStatus DoWork() = 0; virtual mfxStatus GetTimeout(mfxU32 & maxTimeToRun) = 0; }; #endif // __MFX_INTERFACE_SCHEDULER_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_log.h000066400000000000000000000046021443134507600270540ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_LOG_H) #define __MFX_LOG_H // set the following define to let the scheduler write log file // with all its activities. //#define MFX_SCHEDULER_LOG #if defined(MFX_SCHEDULER_LOG) #include "mfx_common.h" #include // Declare the type of handle to logging object typedef void * log_t; // Initialize the logging stuff. If log path is not set, // the default log path and object is used. extern "C" log_t mfxLogInit(const char *pLogPath = 0); // Write something to the log. If the log handle is zero, // the default log file is used. extern "C" void mfxLogWriteA(const log_t log, const char *pString, ...); // Close the specific log. Default log can't be closed. extern "C" void mfxLogClose(log_t log); class mfxLog { public: // Default constructor mfxLog(void) { log = 0; } // Destructor ~mfxLog(void) { Close(); } // Initialize the log log_t Init(const char *pLogPath) { // Close the object before initialization Close(); log = mfxLogInit(pLogPath); return log; } // Initialize the log void Close() { mfxLogClose(log); log = 0; } // Handle to the protected log log_t log; }; #endif // defined(MFX_SCHEDULER_LOG) #endif // __MFX_LOG_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_mpeg2_dec_common.h000066400000000000000000000027641443134507600314770ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MPEG2_DEC_COMMON_H__ #define __MFX_MPEG2_DEC_COMMON_H__ #include "mfx_common.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "mfx_common_int.h" #include "mfxvideo.h" #define MFX_PROFILE_MPEG1 8 void GetMfxFrameRate(mfxU8 umcFrameRateCode, mfxU32 *frameRateNom, mfxU32 *frameRateDenom); inline bool IsMpeg2StartCodeEx(const mfxU8* p); #endif #endif //__MFX_MPEG2_DEC_COMMON_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_msg.h000066400000000000000000000034011443134507600270550ustar00rootroot00000000000000// Copyright (c) 2016-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_MSG_H #define __MFX_MSG_H #include #include #include extern "C" Ipp64u freq; inline void Msg(Ipp32u threadNum, const char *pMsg, Ipp64u time, Ipp64u lasting) { char cStr[256]; Ipp32s timeSec, timeMSec, us; timeSec = (Ipp32u) ((time / freq) % 60); timeMSec = (Ipp32u) (((time * 1000) / freq) % 1000); us = (Ipp32u) ((lasting * 1000000) / freq); sprintf_s(cStr, sizeof(cStr), "[% 4u] %3u.%03u % 30s % 6u us\n", threadNum, timeSec, timeMSec, pMsg, us); OutputDebugStringA(cStr); } // void Msg(Ipp32u threadNum, const char *pMsg, Ipp64u time) #endif // __MFX_MSG_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_platform_caps.h000066400000000000000000000123171443134507600311270ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifndef __MFX_PLATFORM_CAPS_H__ #define __MFX_PLATFORM_CAPS_H__ namespace CommonCaps { inline bool IsPreSiPlatform(eMFXHWType platform, mfxU16 deviceId) { //Add the additional device id judgement codes for derivative platforms which reuse the same //platform name with leading platform. Need to delete it when changed to be post-si platform. if(deviceId == 0x4F89 || deviceId == 0x4F8C) { return true; } return platform >= MFX_HW_MTL; } inline bool IsVppSkipQuerySupported(eMFXHWType platform, mfxU16 deviceId) { return (!CommonCaps::IsPreSiPlatform(platform, deviceId) || MFX_HW_MTL == platform) && MFX_HW_MTL >= platform && MFX_HW_DG2 <= platform; } inline bool HasNativeDX9Support(eMFXHWType platform, int deviceId) { // Enable native DX9 for ATSM return platform < MFX_HW_ADL_S || deviceId == 0x56C0 || deviceId == 0x56C1; } inline bool IsVplHW(eMFXHWType hw, mfxU32 deviceId) { return hw >= MFX_HW_TGL_LP && deviceId != 0x4907; } inline bool CapsQueryOptimizationSupport(eMFXHWType platform) { return platform < MFX_HW_MTL; } inline bool IsCmSupported(eMFXHWType platform) { return platform <= MFX_HW_XE_HP_SDV; } } #ifdef MFX_ENABLE_H264_VIDEO_ENCODE namespace H264ECaps { inline bool IsVmeSupported(eMFXHWType platform) { return (platform <= MFX_HW_ADL_N); } inline bool IsHvsSupported(eMFXHWType platform) { return (platform >= MFX_HW_DG2); } inline bool IsFrameSizeTolerenceSupported(eMFXHWType platform) { return false; } inline bool IsAcqmSupported(eMFXHWType platform) { return (platform >= MFX_HW_DG2); } inline bool IsAltRefSupported(eMFXHWType platform) { return (platform >= MFX_HW_DG2); } inline bool IsRateControlLASupported(eMFXHWType platform) { return (platform >= MFX_HW_DG2); } inline bool IsVDEncBFrameSupported(eMFXHWType platform) { // VDEnc B frame supported from DG2 return (platform >= MFX_HW_DG2); } } #endif //MFX_ENABLE_H264_VIDEO_ENCODE #ifdef MFX_ENABLE_VP9_VIDEO_ENCODE namespace VP9ECaps { inline bool Is32x32BlockSupported(eMFXHWType platform) { return (platform >= MFX_HW_DG2); } inline bool IsTableBasedLfLevelUsed(eMFXHWType platform) { return (platform >= MFX_HW_MTL); } inline bool IsDefaultMultiRefUsed(eMFXHWType platform) { return (platform >= MFX_HW_MTL); } } #endif namespace AV1ECaps { inline bool IsSegmentationHWLimitationNeeded(eMFXHWType platform) { return (platform == MFX_HW_DG2); } } namespace VppCaps { inline bool IsMctfSupported(eMFXHWType platform) { return (platform >= MFX_HW_TGL_LP && platform < MFX_HW_DG2); } inline bool IsVideoSignalSupported(eMFXHWType platform) { return platform >= MFX_HW_ADL_S; } inline bool IsSwFieldProcessingSupported(eMFXHWType platform) { return platform < MFX_HW_DG2; } inline bool IsFieldProcessingSupported(eMFXHWType platform) { return platform < MFX_HW_MTL && platform != MFX_HW_DG2; } inline bool IsScalingModeSupportEU(eMFXHWType platform) { return platform >= MFX_HW_DG2; } } #ifdef MFX_ENABLE_VP8_VIDEO_DECODE namespace VP8DCaps { inline bool IsSupported(eMFXHWType platform) { return platform >= MFX_HW_ADL_S; } } #endif // MFX_ENABLE_VP8_VIDEO_DECODE #ifdef MFX_ENABLE_AV1_VIDEO_DECODE namespace AV1DCaps { inline bool IsPostProcessSupported(eMFXHWType platform) { return platform >= MFX_HW_MTL; } } #endif // MFX_ENABLE_AV1_VIDEO_DECODE #ifdef MFX_ENABLE_H264_VIDEO_DECODE namespace H264DCaps { // Progressive only for Platforms Before Tgllp. inline bool IsOnlyProgressivePicStructSupported(eMFXHWType platform) { return platform < MFX_HW_XE_HP_SDV; } } #endif // MFX_ENABLE_H264_VIDEO_DECODE #endif // __MFX_PLATFORM_CAPS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_platform_headers.h000066400000000000000000000044221443134507600316120ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_PLATFORM_HEADERS_H__ #define __MFX_PLATFORM_HEADERS_H__ #include /* That's tricky: if LibVA will not be installed on the machine, you should be able * to build SW Media SDK and some apps in SW mode. Thus, va.h should not be visible. * Since we develop on machines where LibVA is installed, we forget about LibVA-free * build sometimes. So, that's the reminder why MFX_VA protection was added here. */ #include typedef VADisplay _mfxPlatformAccelerationService; typedef VASurfaceID _mfxPlatformVideoSurface; #ifndef D3DDDIFORMAT #define D3DDDIFORMAT D3DFORMAT #endif typedef int BOOL; typedef char CHAR; typedef unsigned char BYTE; typedef short SHORT; typedef int INT; typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned int UINT; typedef int LONG; // should be 32 bit to align with Windows typedef unsigned int ULONG; typedef unsigned int DWORD; typedef unsigned long long UINT64; #define FALSE 0 #define TRUE 1 typedef int D3DFORMAT; #endif // __MFX_PLATFORM_HEADERS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_session.h000066400000000000000000000237601443134507600277640ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(_MFX_SESSION_H) #define _MFX_SESSION_H #include // base mfx headers #include #include #include #include "mfx_common.h" #include "mfx_utils_logging.h" // private headers #include #include class SurfaceCache; template struct surface_cache_controller; struct _mfxSession { // Constructor _mfxSession(const mfxU32 adapterNum); // Destructor ~_mfxSession(void); // Clear state void Clear(void); // Initialize the session mfxStatus Init(mfxIMPL implInterface, mfxVersion *ver); // Attach to the original scheduler mfxStatus RestoreScheduler(void); // Release current scheduler mfxStatus ReleaseScheduler(void); // Declare session's components std::shared_ptr m_pCORE; std::unique_ptr m_pENCODE; std::unique_ptr m_pDECODE; std::unique_ptr m_pVPP; class DVP_base { public: virtual ~DVP_base() {} virtual surface_cache_controller* GetSurfacePool(mfxU16 /*channel_id*/) { return nullptr; } virtual void AssignPool(mfxU16 /*channel_id*/, SurfaceCache* /*cache*/) {} //channel ID / VPP config std::map VppParams; //channel ID / VPP component std::map> VPPs; //channel ID for VDBOX + SFC channel, 0 means VDBOX + SFC is not used mfxU16 sfcChannelID = 0; //true means keep only processed outputs bool skipOriginalOutput; }; std::unique_ptr m_pDVP; // Current implementation platform ID eMFXPlatform m_currentPlatform; // Current working HW adapter mfxU32 m_adapterNum; // Current working interface (D3D9 or so) mfxIMPL m_implInterface; // Pointer to the scheduler interface being used MFXIScheduler *m_pScheduler; // Priority of the given session instance mfxPriority m_priority; // API version requested by application mfxVersion m_version; // API version to report from MFXQueryVersion mfxVersion m_versionToReport; MFXIPtr m_pOperatorCore; // if there are no Enc HW capabilities but HW library is used bool m_bIsHWENCSupport; // if there are no Dec HW capabilities but HW library is used bool m_bIsHWDECSupport; inline bool IsParentSession(void) { // if a session has m_pSchedulerAllocated != NULL // and the number of "Cores" > 1, then it's a parrent session. // and the number of "Cores" == 1, then it's a regular session. if (m_pSchedulerAllocated) return m_pOperatorCore->HaveJoinedSessions(); else return false; } inline bool IsChildSession(void) { // child session has different references to active and allocated // scheduler. regular session has 2 references to the scheduler. // child session has only 1 reference to it. return (NULL == m_pSchedulerAllocated); } template T* Create(mfxVideoParam& par); protected: // Release the object void Cleanup(void); // this variable is used to deteremine // if the object really owns the scheduler. MFXIUnknown *m_pSchedulerAllocated; // (MFXIUnknown *) pointer to the scheduler allocated private: // Assignment operator is forbidden _mfxSession & operator = (const _mfxSession &); }; // {90567606-C57A-447F-8941-1F14597DA475} static const MFX_GUID MFXISession_1_10_GUID = {0x90567606, 0xc57a, 0x447f, {0x89, 0x41, 0x1f, 0x14, 0x59, 0x7d, 0xa4, 0x75}}; // {701A88BB-E482-4374-A08D-621641EC98B2} //DEFINE_GUID(<>, // {0x701a88bb, 0xe482, 0x4374, {0xa0, 0x8d, 0x62, 0x16, 0x41, 0xec, 0x98, 0xb2}}; class MFXISession_1_10: public MFXIUnknown { public: virtual ~MFXISession_1_10() {} // Finish initialization. Should be called before Init(). virtual void SetAdapterNum(const mfxU32 adapterNum) = 0; }; MFXIPtr TryGetSession_1_10(mfxSession session); //--- MFX SESIION 1.33 --------------------------------------------------------------------------- // {A42A8B5B-162F-4ACC-B51D-F7B24352BDCD} static const MFX_GUID MFXISession_2_1_GUID = { 0xa42a8b5b, 0x162f, 0x4acc, { 0xb5, 0x1d, 0xf7, 0xb2, 0x43, 0x52, 0xbd, 0xcd } }; class MFXISession_2_1 : public MFXISession_1_10 { public: virtual ~MFXISession_2_1() {} }; MFXIPtr TryGetSession_2_1(mfxSession session); class _mfxVersionedSessionImpl: public _mfxSession, public MFXISession_2_1 { public: _mfxVersionedSessionImpl(mfxU32 adapterNum); // Destructor virtual ~_mfxVersionedSessionImpl(void); //--- MFXIUnknown interface ----------------------------------------------------------------------- // Query another interface from the object. If the pointer returned is not NULL, // the reference counter is incremented automatically. virtual void *QueryInterface(const MFX_GUID &guid) override; // Increment reference counter of the object. virtual void AddRef(void) override; // Decrement reference counter of the object. // If the counter is equal to zero, destructor is called and // object is removed from the memory. virtual void Release(void) override; // Get the current reference counter value virtual mfxU32 GetNumRef(void) const override; /// Initialize session /// @param par - initialization parameters /// @return MFX_ERROR_NONE if completed successfully, error code otherwise. virtual mfxStatus InitEx(mfxInitParam& par, bool isSingleThreadMode); //--- MFXISession_1_9 interface ------------------------------------------------------------------- void SetAdapterNum(const mfxU32 adapterNum) override; protected: // Reference counters mfxU32 m_refCounter; mfxU16 m_externalThreads; }; // // DEFINES FOR IMPLICIT FUNCTIONS IMPLEMENTATION // #undef FUNCTION_IMPL #define FUNCTION_IMPL(component, func_name, formal_param_list, actual_param_list) \ mfxStatus APIImpl_MFXVideo##component##_##func_name formal_param_list \ { \ PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); \ MFX_LOG_API_TRACE("----------------MFXVideo" #component "_" #func_name "----------------\n"); \ MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); \ MFX_CHECK(session->m_p##component.get(), MFX_ERR_NOT_INITIALIZED); \ try { \ /* call the codec's method */ \ return session->m_p##component->func_name actual_param_list; \ } catch(...) { \ return MFX_ERR_NULL_PTR; \ } \ } #undef FUNCTION_AUDIO_IMPL #define FUNCTION_AUDIO_IMPL(component, func_name, formal_param_list, actual_param_list) \ mfxStatus MFXAudio##component##_##func_name formal_param_list \ { \ MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); \ MFX_CHECK(session->m_pAudio##component.get(), MFX_ERR_NOT_INITIALIZED); \ try { \ /* call the codec's method */ \ return session->m_pAudio##component->func_name actual_param_list; \ } catch(...) { \ return MFX_ERR_NULL_PTR; \ } \ } #undef FUNCTION_RESET_IMPL #define FUNCTION_RESET_IMPL(component, func_name, formal_param_list, actual_param_list) \ mfxStatus APIImpl_MFXVideo##component##_##func_name formal_param_list \ { \ PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); \ MFX_LOG_API_TRACE("----------------MFXVideo" #component "_" #func_name "----------------\n"); \ MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); \ MFX_CHECK(session->m_p##component.get(), MFX_ERR_NOT_INITIALIZED); \ \ try { \ /* wait until all tasks are processed */ \ MFX_SAFE_CALL(session->m_p##component ->ResetCache actual_param_list ); \ session->m_pScheduler->WaitForAllTasksCompletion(session->m_p##component.get()); \ /* call the codec's method */ \ return session->m_p##component->func_name actual_param_list; \ } catch(...) { \ return MFX_ERR_NULL_PTR; \ } \ } #undef FUNCTION_AUDIO_RESET_IMPL #define FUNCTION_AUDIO_RESET_IMPL(component, func_name, formal_param_list, actual_param_list) \ mfxStatus MFXAudio##component##_##func_name formal_param_list \ { \ MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); \ MFX_CHECK(session->m_pAudio##component.get(), MFX_ERR_NOT_INITIALIZED); \ try { \ /* wait until all tasks are processed */ \ session->m_pScheduler->WaitForAllTasksCompletion(session->m_pAudio##component.get()); \ /* call the codec's method */ \ return session->m_pAudio##component->func_name actual_param_list; \ } catch(...) { \ return MFX_ERR_NULL_PTR; \ } \ } mfxStatus MFXInternalPseudoJoinSession(mfxSession session, mfxSession child_session); mfxStatus MFXInternalPseudoDisjoinSession(mfxSession session); #endif // _MFX_SESSION_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_task.h000066400000000000000000000104451443134507600272370ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TASK_H #define __MFX_TASK_H #include #include enum { // Declare the maximum number of source or destination dependencies MFX_TASK_NUM_DEPENDENCIES = 4 }; enum { // Declare overall number of priorities MFX_PRIORITY_NUMBER = MFX_PRIORITY_HIGH + 1 }; // Declare implementation types enum { MFX_TYPE_HARDWARE = 0, MFX_TYPE_SOFTWARE = 1, MFX_TYPE_NUMBER }; #define MFX_TASK_NEED_CONTINUE MFX_TASK_WORKING #define MFX_TASK_PAUSE (mfxStatus)100000 enum { MFX_TRACE_ID_DECODE = 0x10000000, MFX_TRACE_ID_VPP = 0x20000000, MFX_TRACE_ID_VPP2 = 0x30000000, MFX_TRACE_ID_ENCODE = 0x40000000, MFX_TRACE_ID_ENCODE2 = 0x50000000, MFX_TRACE_ID_USER = 0x60000000, }; inline bool isFailed(mfxStatus mfxRes) { return (MFX_ERR_NONE > mfxRes); } // bool isFailed(mfxStatus mfxRes) /* declare type for MFX task callbacks. Usually, most thread API involve a single parameter. MFX callback function require 3 parameters to make developers' life. pState - is a pointer to the performing object or something like this. pParam - is an addition parameter to destingush one task from the another inside the entry point. It is possible to start different threads with the same object (pState), but different task (pParam). Usually, it is a handle or some internal pointer. threadNumber - number of the current additional thread. It can be any number not exceeding the maximum required threads for given task. */ typedef mfxStatus (*mfxTaskRoutine) (void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); typedef mfxStatus (*mfxTaskCompleteProc) (void *pState, void *pParam, mfxStatus taskRes); typedef mfxStatus (*mfxOutputPostProc) (void *pState, void *pParam); typedef struct MFX_ENTRY_POINT { // pointer to the task processing object void *pState; // pointer to the task's parameter void *pParam; // pointer to the task processing routine mfxTaskRoutine pRoutine; // pointer to the task completing procedure mfxTaskCompleteProc pCompleteProc; // pointer to function that makes required bitstream modifications if any in SyncOperation mfxOutputPostProc pOutputPostProc; // reserved for future use void* reserved; // number of simultaneously allowed threads for the task mfxU32 requiredNumThreads; // name of routine - for debug and tracing purpose const char *pRoutineName; } MFX_ENTRY_POINT; struct MFX_TASK { // Pointer to task owning object void *pOwner; // Task parameters provided by the component MFX_ENTRY_POINT entryPoint; // legacy parameters should be eliminated bool bObsoleteTask; MFX_THREAD_TASK_PARAMETERS obsolete_params; // these are not a source/destination parameters, // these are only in/out dependencies. // Array of source dependencies const void *pSrc[MFX_TASK_NUM_DEPENDENCIES]; // Array of destination dependencies void *pDst[MFX_TASK_NUM_DEPENDENCIES]; // Task's priority mfxPriority priority; // how the object processes the tasks mfxTaskThreadingPolicy threadingPolicy; unsigned int nTaskId; unsigned int nParentId; }; #endif // __MFX_TASK_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_task_threading_policy.h000066400000000000000000000046271443134507600326500ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TASK_THREADING_POLICY_H #define __MFX_TASK_THREADING_POLICY_H // Declare task execution flag's enum { // Task can't share processing unit with other tasks MFX_TASK_INTRA = 1, // Task can share processing unit with other tasks MFX_TASK_INTER = 2, // Task can be managed by thread 0 only MFX_TASK_DEDICATED = 4, // Task share executing threads with other tasks MFX_TASK_SHARED = 8, #if defined(MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT) // Task share executing threads with other tasks MFX_TASK_POLLING = 16 #endif }; typedef enum mfxTaskThreadingPolicy { // The plugin doesn't support parallel task execution. // Tasks need to be processed one by one. MFX_TASK_THREADING_INTRA = MFX_TASK_INTRA, // The plugin supports parallel task execution. // Tasks can be processed independently. MFX_TASK_THREADING_INTER = MFX_TASK_INTER, // All task marked 'dedicated' is executed by thread #0 only. MFX_TASK_THREADING_DEDICATED = MFX_TASK_DEDICATED | MFX_TASK_INTRA, // As inter, but the plugin has limited processing resources. // The total number of threads is limited. MFX_TASK_THREADING_SHARED = MFX_TASK_SHARED, MFX_TASK_THREADING_DEFAULT = MFX_TASK_THREADING_DEDICATED } mfxTaskThreadingPolicy; #endif // __MFX_TASK_THREADING_POLICY_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_thread_task.h000066400000000000000000000051731443134507600305700ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_THREAD_TASK_H) #define __MFX_THREAD_TASK_H #include #include // Declare task's parameters structure typedef struct MFX_THREAD_TASK_PARAMETERS { union { // ENCODE parameters struct { mfxEncodeCtrl *ctrl; // [IN] pointer to encode control mfxFrameSurface1 *surface; // [IN] pointer to the source surface mfxBitstream *bs; // [OUT] pointer to the destination bitstream mfxEncodeInternalParams internal_params; // output of EncodeFrameCheck(), input of EncodeFrame() } encode; // DECODE parameters struct { mfxBitstream *bs; // [IN] pointer to the source bitstream mfxFrameSurface1 *surface_work; // [IN] pointer to the surface for decoding mfxFrameSurface1 *surface_out; // [OUT] pointer to the current being decoded surface } decode; // VPP parameters struct { mfxFrameSurface1 *in; // [IN] pointer to the source surface mfxFrameSurface1 *out; // [OUT] pointer to the destination surface mfxExtVppAuxData *aux; // [IN] auxilary encoding data } vpp; }; } MFX_THREAD_TASK_PARAMETERS; #endif // __MFX_THREAD_TASK_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_tools.h000066400000000000000000000024741443134507600274400ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TOOLS_H #define __MFX_TOOLS_H #include namespace MFX { unsigned int CreateUniqId(); } inline bool IsHWLib(void) { return true; } // bool IsHWLib(void) #endif // __MFX_TOOLS_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_utils_extbuf.h000066400000000000000000000173621443134507600310170ustar00rootroot00000000000000// Copyright (c) 2019-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #include #include #include #include #include #ifdef MFX_ENABLE_ENCTOOLS #include "mfxenctools-int.h" #endif #ifdef MFX_ENABLE_ENCODE_STATS #include "mfxencodestats.h" #endif namespace MfxExtBuffer { template struct IdMap {}; template struct TypeMap {}; #define EXTBUF(TYPE, ID)\ template<> struct IdMap : std::integral_constant {};\ template<> struct TypeMap { using Type = TYPE; }; #include "../mediasdk_structures/ts_ext_buffers_decl.h" #undef EXTBUF const mfxU32 IdSizePairs[][2] = { #define EXTBUF(TYPE, ID) {mfxU32(ID), mfxU32(sizeof(TYPE))}, #include "../mediasdk_structures/ts_ext_buffers_decl.h" #undef EXTBUF }; inline mfxU32 IdToSize(mfxU32 Id) { auto IsIdEq = [Id](const mfxU32 (&p)[2]) { return p[0] == Id; }; auto pIt = std::find_if(std::begin(IdSizePairs), std::end(IdSizePairs), IsIdEq); if (pIt == std::end(IdSizePairs)) throw std::logic_error("unknown ext. buffer Id"); return pIt[0][1]; } template void Init(T& buf) { buf = T{}; mfxExtBuffer& header = *((mfxExtBuffer*)&buf); header.BufferId = IdMap::value; header.BufferSz = sizeof(T); } class ParamBase { public: ParamBase() = default; ParamBase(mfxExtBuffer** ExtParam, mfxU32 NumExtParam) { if (ExtParam) { std::for_each(ExtParam, ExtParam + NumExtParam , [&](mfxExtBuffer* p) { _ConstructEB(p); }); } } mfxExtBuffer* Get(mfxU32 id) const { auto it = m_eb.find(id); return (it == m_eb.end()) ? nullptr : (mfxExtBuffer*)m_eb.at(id).get(); } protected: using TEBMap = std::map>; using TEBIt = TEBMap::iterator; TEBMap m_eb; std::pair _AllocEB(mfxU32 id, mfxU32 sz = 0, bool bReset = true) { auto it = m_eb.find(id); mfxU8* p; if (m_eb.end() == it) { if (!sz) sz = IdToSize(id); p = new mfxU8[sz]; memset(p, 0, sz); *(mfxExtBuffer*)p = { id, sz }; return m_eb.emplace(id, std::unique_ptr(p)); } else if (bReset) { p = it->second.get(); sz = ((mfxExtBuffer*)p)->BufferSz; memset(p, 0, sz); *(mfxExtBuffer*)p = { id, sz }; } return std::make_pair(it, false); } std::pair _ConstructEB(const mfxExtBuffer* src) { if (src) { auto pair = _AllocEB(src->BufferId, src->BufferSz, false); auto dst = pair.first->second.get(); if ((mfxU8*)src != dst) std::copy_n((mfxU8*)src, src->BufferSz, dst); return pair; } return std::make_pair(m_eb.end(), false); } }; template class Param : public ParamBase , public T { public: Param() : T({}) { T::ExtParam = m_ExtParam.data(); } Param(const T& par) : ParamBase(par.ExtParam, par.NumExtParam) , T(par) { T::NumExtParam = mfxU16(m_eb.size()); T::ExtParam = m_ExtParam.data(); auto GetEBPtr = [](TEBMap::reference ref) { return (mfxExtBuffer*)ref.second.get(); }; std::transform(m_eb.begin(), m_eb.end(), m_ExtParam.begin(), GetEBPtr); } mfxExtBuffer* NewEB(mfxU32 id, bool bReset = true) { auto res = _AllocEB(id, 0, bReset); auto pEB = (mfxExtBuffer*)res.first->second.get(); if (res.second) m_ExtParam.at(T::NumExtParam++) = pEB; return pEB; } protected: std::array m_ExtParam; }; class CastExtractor { private: mfxExtBuffer** m_b; mfxU16 m_n; const ParamBase* m_p; mfxExtBuffer* _Get(mfxU32 id) const { if (m_p) return m_p->Get(id); if (m_b) { auto pIt = std::find_if(m_b, m_b + m_n , [id](mfxExtBuffer* p) { return p && p->BufferId == id; }); if (pIt != (m_b + m_n)) return *pIt; } return nullptr; } public: CastExtractor(const ParamBase& par) : m_b(nullptr) , m_n(0) , m_p(&par) {} CastExtractor(mfxExtBuffer ** b, mfxU16 n) : m_b(b) , m_n(n) , m_p(nullptr) {} template operator T*() { return (T*)_Get(IdMap::type>::value); } template operator const T*() const { return (const T*)_Get(IdMap::type>::value); } template operator T&() { T* p = (T*)_Get(IdMap::type>::value); if (!p) throw std::logic_error("ext. buffer expected to be always attached"); return *p; } template operator const T&() const { const T* p = (const T*)_Get(IdMap::type>::value); if (!p) throw std::logic_error("ext. buffer expected to be always attached"); return *p; } }; template CastExtractor Get(P & par) { return CastExtractor(par.ExtParam, par.NumExtParam); } template const CastExtractor Get(const P & par) { return CastExtractor(par.ExtParam, par.NumExtParam); } template CastExtractor Get(Param

& par) { return CastExtractor(par); } template const CastExtractor Get(const Param

& par) { return CastExtractor(par); } template mfxExtBuffer* Get(P& par, mfxU32 BufferId) { if (par.ExtParam) { auto pIt = std::find_if(par.ExtParam, par.ExtParam + par.NumExtParam , [BufferId](mfxExtBuffer* p) { return p && p->BufferId == BufferId; }); if (pIt != (par.ExtParam + par.NumExtParam)) return *pIt; } return nullptr; } }; //namespace MfxExtBuffer oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/include/mfx_vc1_dec_common.h000066400000000000000000000041431443134507600311470ustar00rootroot00000000000000// Copyright (c) 2004-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef _MFX_VC1_DEC_COMMON_H_ #define _MFX_VC1_DEC_COMMON_H_ #include "mfxvideo.h" #include "umc_video_decoder.h" #include "umc_vc1_common_defs.h" namespace MFXVC1DecCommon { // need for dword alignment memory inline mfxU32 GetDWord_s(mfxU8* pData) { return ((*(pData+3))<<24) + ((*(pData+2))<<16) + ((*(pData+1))<<8) + *(pData);} // we sure about our types template static T bit_set(T value, Ipp32u offset, Ipp32u count, T1 in) { return (T)(value | (((1< #include #include #include #include #include #include #include #include #include "va/va_drm.h" #include "mediasdk_version.h" #include "libmfx_core_factory.h" #include "mfx_interface_scheduler.h" #include "libmfx_core_interface.h" #include "mfx_platform_caps.h" #include "mfx_unified_decode_logging.h" mfxStatus MFXInit(mfxIMPL implParam, mfxVersion *ver, mfxSession *session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: implParam = ", MFX_TRACE_FORMAT_D, implParam); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); mfxInitParam par = {}; par.Implementation = implParam; if (ver) { par.Version = *ver; } else { par.Version.Major = 1; par.Version.Minor = 255; } par.ExternalThreads = 0; MFX_TRACE_2("Out: MFX_API version = ", "%d.%d", par.Version.Major, par.Version.Minor); return MFXInitEx(par, session); } // mfxStatus MFXInit(mfxIMPL impl, mfxVersion *ver, mfxHDL *session) static inline mfxU32 MakeVersion(mfxU16 major, mfxU16 minor) { return major * 1000 + minor; } static mfxStatus MFXInit_Internal(mfxInitParam par, mfxSession* session, mfxIMPL implInterface, mfxU32 adapterNum, bool isSingleThreadMode = false); mfxStatus MFXInitEx(mfxInitParam par, mfxSession *session) { MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: Implementation = ", MFX_TRACE_FORMAT_D, par.Implementation); MFX_TRACE_2("In: MFX_API version = ", "%d.%d", par.Version.Major, par.Version.Minor); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); mfxStatus mfxRes = MFX_ERR_NONE; int adapterNum = 0; mfxIMPL impl = par.Implementation & (MFX_IMPL_VIA_ANY - 1); mfxIMPL implInterface = par.Implementation & -MFX_IMPL_VIA_ANY; MFX_TRACE_INIT(); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "ThreadName=MSDK app"); } MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_MFX_INIT_EX_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data((mfxU32)par.Implementation, par.GPUCopy)); // check the library version if (MakeVersion(par.Version.Major, par.Version.Minor) > MFX_VERSION) { mfxRes = MFX_ERR_UNSUPPORTED; MFX_RETURN(mfxRes); } // check error(s) if ((MFX_IMPL_AUTO != impl) && (MFX_IMPL_AUTO_ANY != impl) && (MFX_IMPL_HARDWARE_ANY != impl) && (MFX_IMPL_HARDWARE != impl) && (MFX_IMPL_HARDWARE2 != impl) && (MFX_IMPL_HARDWARE3 != impl) && (MFX_IMPL_HARDWARE4 != impl)) { mfxRes = MFX_ERR_UNSUPPORTED; MFX_RETURN(mfxRes); } // if user did not specify MFX_IMPL_VIA_* treat it as MFX_IMPL_VIA_ANY if (!implInterface) implInterface = MFX_IMPL_VIA_ANY; if ( (MFX_IMPL_VIA_VAAPI != implInterface) && (MFX_IMPL_VIA_ANY != implInterface)) { mfxRes = MFX_ERR_UNSUPPORTED; MFX_RETURN(mfxRes); } // set the adapter number switch (impl) { case MFX_IMPL_HARDWARE2: adapterNum = 1; break; case MFX_IMPL_HARDWARE3: adapterNum = 2; break; case MFX_IMPL_HARDWARE4: adapterNum = 3; break; default: adapterNum = 0; break; } // MFXInit / MFXInitEx in oneVPL is for work in legacy (1.x) mode only // app. must use MFXInitialize for 2.x features if (par.Version.Major > 1) { mfxRes = MFX_ERR_UNSUPPORTED; MFX_RETURN(mfxRes); } mfxRes = MFXInit_Internal(par, session, implInterface, adapterNum); // oneVPL should report 1.255 API version when it was initialized through MFXInit / MFXInitEx if (session && *session && mfxRes >= MFX_ERR_NONE) { (*session)->m_versionToReport.Major = 1; (*session)->m_versionToReport.Minor = 255; } TRACE_EVENT(MFX_TRACE_API_MFX_INIT_EX_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes, session)); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } // mfxStatus MFXInitEx(mfxInitParam par, mfxSession *session) static mfxStatus MFXInit_Internal(mfxInitParam par, mfxSession *session, mfxIMPL implInterface, mfxU32 adapterNum, bool isSingleThreadMode) { _mfxVersionedSessionImpl* pSession = nullptr; mfxStatus mfxRes = MFX_ERR_NONE; try { // reset output variable *session = 0; // prepare initialization parameters // create new session instance pSession = new _mfxVersionedSessionImpl(adapterNum); mfxInitParam init_param = par; init_param.Implementation = implInterface; mfxRes = pSession->InitEx(init_param, isSingleThreadMode); } catch(...) { mfxRes = MFX_ERR_MEMORY_ALLOC; } if (MFX_ERR_NONE != mfxRes && MFX_WRN_PARTIAL_ACCELERATION != mfxRes) { if (pSession) { delete pSession; } return mfxRes; } // save the handle *session = dynamic_cast<_mfxSession *>(pSession); return mfxRes; } // mfxStatus MFXInit_Internal(mfxInitParam par, mfxSession *session, mfxIMPL implInterface, mfxU32 adapterNum) mfxStatus MFXDoWork(mfxSession session) { mfxStatus res; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_DO_WORK_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session)); // check error(s) if (0 == session) { MFX_RETURN(MFX_ERR_INVALID_HANDLE); } MFXIUnknown * pInt = session->m_pScheduler; MFXIScheduler2 *newScheduler = ::QueryInterface(pInt, MFXIScheduler2_GUID); if (!newScheduler) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } newScheduler->Release(); res = newScheduler->DoWork(); TRACE_EVENT(MFX_TRACE_API_DO_WORK_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(res)); return res; } // mfxStatus MFXDoWork(mfxSession *session) struct MFXTrace_EventCloseOnExit { ~MFXTrace_EventCloseOnExit() { MFXTrace_EventClose(); } }; mfxStatus MFXClose(mfxSession session) { PERF_UTILITY_AUTO("MFXClose", PERF_LEVEL_API); mfxStatus mfxRes = MFX_ERR_NONE; MFXTrace_EventCloseOnExit MFXTrace_EventClose; TRACE_EVENT(MFX_TRACE_API_MFX_CLOSE_TASK, EVENT_TYPE_START, 0, make_event_data(session)); // check error(s) if (0 == session) { MFX_RETURN(MFX_ERR_INVALID_HANDLE); } try { // NOTE MFXClose function calls MFX_TRACE_CLOSE, so no tracing points should be // used after it. special care should be taken with MFX_AUTO_TRACE macro // since it inserts class variable on stack which calls to trace library in the // destructor. MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); // parent session can't be closed, // because there is no way to let children know about parent's death. // child session should be uncoupled from the parent before closing. if (session->IsChildSession()) { mfxRes = MFXDisjoinSession(session); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } } if (session->IsParentSession()) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } // deallocate the object _mfxVersionedSessionImpl *newSession = (_mfxVersionedSessionImpl *)session; delete newSession; } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } #if defined(MFX_TRACE_ENABLE) MFX_TRACE_CLOSE(); #endif TRACE_EVENT(MFX_TRACE_API_MFX_CLOSE_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } // mfxStatus MFXClose(mfxHDL session) mfxStatus MFX_CDECL MFXInitialize(mfxInitializationParam param, mfxSession* session) { MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); mfxStatus mfxRes = MFX_ERR_NONE; MFX_TRACE_INIT(); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_MFXINITIALIZE_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data((mfxU32)param.AccelerationMode, param.VendorImplID)); mfxInitParam par = {}; par.Implementation = MFX_IMPL_HARDWARE; switch (param.AccelerationMode) { case MFX_ACCEL_MODE_VIA_D3D9: par.Implementation |= MFX_IMPL_VIA_D3D9; break; case MFX_ACCEL_MODE_VIA_D3D11: par.Implementation |= MFX_IMPL_VIA_D3D11; break; case MFX_ACCEL_MODE_VIA_VAAPI: par.Implementation |= MFX_IMPL_VIA_VAAPI; break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } par.Version.Major = MFX_VERSION_MAJOR; par.Version.Minor = MFX_VERSION_MINOR; par.ExternalThreads = 0; par.NumExtParam = param.NumExtParam; par.ExtParam = param.ExtParam; bool isSingleThreadMode = false; #if defined(MFX_ENABLE_SINGLE_THREAD) std::vector buffers; if (par.NumExtParam > 0) { MFX_CHECK_NULL_PTR1(par.ExtParam); buffers.reserve(par.NumExtParam); std::remove_copy_if(par.ExtParam, par.ExtParam + par.NumExtParam, std::back_inserter(buffers), [](const mfxExtBuffer* buf) { return buf && buf->BufferId == MFX_EXTBUFF_THREADS_PARAM && (reinterpret_cast(buf))->NumThread == 0; } ); //here in 'buffers' we have all ext. buffers excepting MFX_EXTBUFF_THREADS_PARAM isSingleThreadMode = buffers.size() != par.NumExtParam; if (isSingleThreadMode) { par.NumExtParam = static_cast(buffers.size()); par.ExtParam = par.NumExtParam > 0 ? buffers.data() : nullptr; } } #endif // VendorImplID is used as adapterNum in current implementation - see MFXQueryImplsDescription // app. supposed just to copy VendorImplID from mfxImplDescription (returned by MFXQueryImplsDescription) to mfxInitializationParam mfxRes = MFXInit_Internal(par, session, par.Implementation, param.VendorImplID, isSingleThreadMode); TRACE_EVENT(MFX_TRACE_API_MFXINITIALIZE_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(par.Implementation, isSingleThreadMode)); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } namespace mfx { struct ImplCapsCommon { virtual ~ImplCapsCommon() {}; static void Release(mfxHDL hdl) { auto p = (ImplCapsCommon*)((mfxU8*)hdl - sizeof(ImplCapsCommon)); delete p; } template static mfxHDL GetHDL(T& caps) { return mfxHDL((mfxU8*)&caps + sizeof(ImplCapsCommon)); } }; template class DescriptionHolder { public: friend T; T& PushBack() { m_impls.emplace_back(new T(this)); m_implsArray.push_back(ImplCapsCommon::GetHDL(*m_impls.back())); return *m_impls.back(); } mfxHDL* GetArray() { return m_implsArray.data(); } size_t GetSize() { return m_implsArray.size(); } void Detach() { m_ref = m_impls.size(); for (auto& up : m_impls) up.release(); m_impls.clear(); } protected: std::vector m_implsArray; std::list> m_impls; size_t m_ref = 0; void Release() { if (m_impls.empty() && m_ref-- <= 1) delete this; } }; class ImplDescription; class ExtendedDeviceID; using ImplDescriptionHolder = DescriptionHolder; using ExtendedDeviceIDHolder = DescriptionHolder; class ImplDescription : public ImplCapsCommon , public mfxImplDescription , public PODArraysHolder { public: ImplDescription(ImplDescriptionHolder* h) : mfxImplDescription() , m_pHolder(h) { } ~ImplDescription(); protected: ImplDescriptionHolder* m_pHolder; }; ImplDescription::~ImplDescription() { if (m_pHolder) m_pHolder->Release(); } #ifdef ONEVPL_EXPERIMENTAL class ExtendedDeviceID : public ImplCapsCommon , public mfxExtendedDeviceId , public PODArraysHolder { public: ExtendedDeviceID(ExtendedDeviceIDHolder* h) : mfxExtendedDeviceId() , m_pHolder(h) { } ~ExtendedDeviceID(); protected: ExtendedDeviceIDHolder* m_pHolder; }; ExtendedDeviceID::~ExtendedDeviceID() { if (m_pHolder) m_pHolder->Release(); } #endif // ONEVPL_EXPERIMENTAL class ImplFunctions : public ImplCapsCommon , public mfxImplementedFunctions { public: template void PushFuncName(T&& name) { m_funcNames.emplace_back(std::vector(std::begin(name), std::end(name))); } ImplFunctions() { #define MFX_API_FUNCTION_IMPL(NAME, RTYPE, ARGS_DECL, ARGS) PushFuncName(#NAME); #undef _MFX_FUNCTIONS_H_ #include "mfx_functions.h" m_funcArray.resize(m_funcNames.size(), nullptr); std::transform(m_funcNames.begin(), m_funcNames.end(), m_funcArray.begin() , [](std::vector& name) {return name.data(); }); NumFunctions = mfxU16(m_funcArray.size()); FunctionsName = m_funcArray.data(); m_implArray[0] = ImplCapsCommon::GetHDL(*this); } mfxHDL* GetArray() { return m_implArray; } size_t GetSize() { return 1; } void Remove(const mfxChar* substr, bool bExact = false) { auto it = std::remove_if(m_funcArray.begin(), m_funcArray.end() , [=](mfxChar* str) { return !str || (substr && (str == strstr(str, substr)) && (!bExact || strlen(str) == strlen(substr))); }); if (it != m_funcArray.end()) { m_funcArray.erase(it, m_funcArray.end()); NumFunctions = mfxU16(m_funcArray.size()); FunctionsName = m_funcArray.data(); } } protected: std::list> m_funcNames; std::vector m_funcArray; mfxHDL m_implArray[1] = {}; }; }; mfxStatus QueryImplsDescription(VideoCORE&, mfxEncoderDescription&, mfx::PODArraysHolder&); mfxStatus QueryImplsDescription(VideoCORE&, mfxDecoderDescription&, mfx::PODArraysHolder&); mfxStatus QueryImplsDescription(VideoCORE&, mfxVPPDescription&, mfx::PODArraysHolder&); inline std::tuple GetAdapterInfo(mfxU64 adapterId) { auto result = std::make_tuple(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, mfxU16(0xffff)); auto fd = static_cast(adapterId); drmDevicePtr pd; int sts = drmGetDevice(fd, &pd); if (!(!sts && pd)) return result; std::unique_ptr< drmDevicePtr, void(*)(drmDevicePtr*) > dev(&pd, drmFreeDevice); if ((*dev)->bustype != DRM_BUS_PCI) return result; result = std::make_tuple( (*dev)->businfo.pci->domain, (*dev)->businfo.pci->bus, (*dev)->businfo.pci->dev, (*dev)->businfo.pci->func, (*dev)->deviceinfo.pci->revision_id ); return result; } static bool QueryImplCaps(std::function < bool (VideoCORE&, mfxU32, mfxU32 , mfxU64, const std::vector& ) > QueryImpls) { for (int i = 0; i < 64; ++i) { std::string path; { mfxU32 vendorId = 0; path = std::string("/sys/class/drm/renderD") + std::to_string(128 + i) + "/device/vendor"; FILE* file = fopen(path.c_str(), "r"); if (!file) break; int nread = fscanf(file, "%x", &vendorId); fclose(file); if (nread != 1 || vendorId != 0x8086) continue; } mfxU32 deviceId = 0; { path = std::string("/sys/class/drm/renderD") + std::to_string(128 + i) + "/device/device"; FILE* file = fopen(path.c_str(), "r"); if (!file) break; int nread = fscanf(file, "%x", &deviceId); fclose(file); if (nread != 1) break; } path = std::string("/dev/dri/renderD") + std::to_string(128 + i); int fd = open(path.c_str(), O_RDWR); if (fd < 0) continue; std::shared_ptr closeFile(&fd, [fd](int*) { close(fd); }); { auto displ = vaGetDisplayDRM(fd); int vamajor = 0, vaminor = 0; if (VA_STATUS_SUCCESS != vaInitialize(displ, &vamajor, &vaminor)) continue; std::shared_ptr closeVA(&displ, [displ](VADisplay*) { vaTerminate(displ); }); VADisplayAttribute attr = {}; attr.type = VADisplayAttribSubDevice; auto sts = vaGetDisplayAttributes(displ, &attr, 1); std::ignore = MFX_STS_TRACE(sts); VADisplayAttribValSubDevice out = {}; out.value = attr.value; std::vector subDevMask(VA_STATUS_SUCCESS == sts ? out.bits.sub_device_count : 0); for (std::size_t id = 0; id < subDevMask.size(); ++id) { subDevMask[id] = !!((1 << id) & out.bits.sub_device_mask); } { std::unique_ptr pCore(FactoryCORE::CreateCORE(MFX_HW_VAAPI, 0, {}, 0)); if (pCore->SetHandle(MFX_HANDLE_VA_DISPLAY, (mfxHDL)displ)) continue; if (!QueryImpls(*pCore, deviceId, i, fd, subDevMask)) return false; } } } return true; }; mfxHDL* MFX_CDECL MFXQueryImplsDescription(mfxImplCapsDeliveryFormat format, mfxU32* num_impls) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); mfxHDL* impl = nullptr; if (!num_impls) return impl; MFX_TRACE_INIT(); MFXTrace_EventInit(); TRACE_EVENT(MFX_TRACE_API_MFXQUERYIMPLSDESCRIPTION_TASK, EVENT_TYPE_START, 0, make_event_data((mfxU32)format)); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: format = ", MFX_TRACE_FORMAT_D, format); try { switch (format) { case MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS: { std::unique_ptr holder(new mfx::ImplFunctions); //remove non-VPL functions holder->Remove("MFXInit", true); holder->Remove("MFXInitEx", true); holder->Remove("MFXDoWork", true); holder->Remove("MFXVideoCORE_SetBufferAllocator", true); holder->Remove("MFXVideoVPP_RunFrameVPPAsyncEx", true); holder->Remove("MFXVideoUSER_"); holder->Remove("MFXVideoENC_"); holder->Remove("MFXVideoPAK_"); *num_impls = mfxU32(holder->GetSize()); TRACE_EVENT(MFX_TRACE_API_MFXQUERYIMPLSDESCRIPTION_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(*num_impls)); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "Out: num_impls = ", MFX_TRACE_FORMAT_D, *num_impls); return holder.release()->GetArray(); } #if defined(ONEVPL_EXPERIMENTAL) case MFX_IMPLCAPS_DEVICE_ID_EXTENDED: { std::unique_ptr holder(new mfx::ExtendedDeviceIDHolder); auto QueryDevExtended = [&](VideoCORE& core, mfxU32 deviceId, mfxU32 adapterNum, mfxU64 adapterId, const std::vector&)-> bool { if (!CommonCaps::IsVplHW(core.GetHWType(), deviceId)) return true; auto& device = holder->PushBack(); device.Version.Version = MFX_STRUCT_VERSION(1, 0); device.VendorID = 0x8086; device.DeviceID = mfxU16(deviceId); device.LUIDValid = 0; device.LUIDDeviceNodeMask = 0; for (int i = 0; i < 8; i++) device.DeviceLUID[i] = 0; device.DRMPrimaryNodeNum = adapterNum; device.DRMRenderNodeNum = 128 + adapterNum; std::tie(device.PCIDomain, device.PCIBus, device.PCIDevice, device.PCIFunction, device.RevisionID) = GetAdapterInfo(adapterId); snprintf(device.DeviceName, sizeof(device.DeviceName), "mfx-gen"); return true; }; if (!QueryImplCaps(QueryDevExtended)) return impl; if (!holder->GetSize()) return impl; *num_impls = mfxU32(holder->GetSize()); TRACE_EVENT(MFX_TRACE_API_MFXQUERYIMPLSDESCRIPTION_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(*num_impls)); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "Out: num_impls = ", MFX_TRACE_FORMAT_D, *num_impls); holder->Detach(); impl = holder.release()->GetArray(); return impl; } #endif // defined(ONEVPL_EXPERIMENTAL) case MFX_IMPLCAPS_IMPLDESCSTRUCTURE: { std::unique_ptr holder(new mfx::ImplDescriptionHolder); auto QueryImplDesc = [&](VideoCORE& core, mfxU32 deviceId, mfxU32 adapterNum, mfxU64, const std::vector& subDevMask) -> bool { if (!CommonCaps::IsVplHW(core.GetHWType(), deviceId)) return true; auto& impl = holder->PushBack(); impl.Version.Version = MFX_STRUCT_VERSION(1, 2); impl.Impl = MFX_IMPL_TYPE_HARDWARE; impl.ApiVersion = { { MFX_VERSION_MINOR, MFX_VERSION_MAJOR } }; impl.VendorID = 0x8086; // use adapterNum as VendorImplID, app. supposed just to copy it from mfxImplDescription to mfxInitializationParam impl.VendorImplID = adapterNum; impl.AccelerationMode = core.GetVAType() == MFX_HW_VAAPI ? MFX_ACCEL_MODE_VIA_VAAPI : MFX_ACCEL_MODE_VIA_D3D11; impl.AccelerationModeDescription.Version.Version = MFX_STRUCT_VERSION(1, 0); mfx::PODArraysHolder& ah = impl; ah.PushBack(impl.AccelerationModeDescription.Mode) = impl.AccelerationMode; impl.AccelerationModeDescription.NumAccelerationModes++; impl.PoolPolicies.Version.Version = MFX_STRUCT_VERSION(1, 0); impl.PoolPolicies.NumPoolPolicies = 3; ah.PushBack(impl.PoolPolicies.Policy) = MFX_ALLOCATION_OPTIMAL; ah.PushBack(impl.PoolPolicies.Policy) = MFX_ALLOCATION_UNLIMITED; ah.PushBack(impl.PoolPolicies.Policy) = MFX_ALLOCATION_LIMITED; snprintf(impl.Dev.DeviceID, sizeof(impl.Dev.DeviceID), "%x/%d", deviceId, adapterNum); snprintf(impl.ImplName, sizeof(impl.ImplName), "mfx-gen"); snprintf(impl.License, sizeof(impl.License), "MIT License" ); for (std::size_t i = 0, e = subDevMask.size(); i != e; ++i) { if (subDevMask[i]) { auto & subDevices = ah.PushBack(impl.Dev.SubDevices); subDevices.Index = impl.Dev.NumSubDevices; snprintf(subDevices.SubDeviceID, sizeof(subDevices.SubDeviceID), "%d", static_cast(i)); impl.Dev.NumSubDevices++; } } impl.AccelerationModeDescription.Version.Version = MFX_STRUCT_VERSION(1, 0); impl.PoolPolicies.Version.Version = MFX_STRUCT_VERSION(1, 0); impl.Dec.Version.Version = MFX_STRUCT_VERSION(1, 0); impl.Enc.Version.Version = MFX_STRUCT_VERSION(1, 0); impl.VPP.Version.Version = MFX_STRUCT_VERSION(1, 0); return (MFX_ERR_NONE == QueryImplsDescription(core, impl.Enc, impl) && MFX_ERR_NONE == QueryImplsDescription(core, impl.Dec, impl) && MFX_ERR_NONE == QueryImplsDescription(core, impl.VPP, impl)); }; { auto logSkip = GetMfxLogSkip(); std::ignore = logSkip; InitMfxLogging(); MFX_LOG_API_TRACE("----------------MFXQueryImplsDescription----------------\n"); if (!QueryImplCaps(QueryImplDesc)) return impl; } if (!holder->GetSize()) return impl; *num_impls = mfxU32(holder->GetSize()); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "Out: num_impls = ", MFX_TRACE_FORMAT_D, *num_impls); holder->Detach(); impl = holder.release()->GetArray(); return impl; } default: assert(!"Unknown format"); return impl; } } catch (...) { return impl; } } mfxStatus MFX_CDECL MFXReleaseImplDescription(mfxHDL hdl) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_CHECK_HDL(hdl); try { mfx::ImplCapsCommon::Release(hdl); } catch (...) { MFX_RETURN(MFX_ERR_UNKNOWN); } return MFX_ERR_NONE; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_async.cpp000066400000000000000000000046401443134507600301520ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include "libmfx_core_interface.h" #include "mfx_unified_decode_logging.h" mfxStatus MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); mfxStatus mfxRes = MFX_ERR_NONE; TRACE_EVENT(MFX_TRACE_API_SYNC_OPERATION_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(FrameIndex, session, syncp, wait)); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: syncp = ", MFX_TRACE_FORMAT_P, syncp); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(syncp, MFX_ERR_NULL_PTR); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: wait = ", MFX_TRACE_FORMAT_D, wait); try { { // call the function mfxRes = session->m_pScheduler->Synchronize(syncp, wait); } TRACE_EVENT(MFX_TRACE_API_SYNC_OPERATION_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(FrameIndex, mfxRes, syncp)); } catch(...) { // set the default error value mfxRes = MFX_ERR_ABORTED; } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_decode.cpp000066400000000000000000000550611443134507600302630ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include // sheduling and threading stuff #include #include #include #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "mfx_vc1_decode.h" #endif #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "mfx_h264_dec_decode.h" #endif #if defined (MFX_ENABLE_H265_VIDEO_DECODE) #include "mfx_h265_dec_decode.h" #endif #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) #include "mfx_mpeg2_decode.h" #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "mfx_mjpeg_dec_decode.h" #endif #if defined (MFX_ENABLE_VP8_VIDEO_DECODE) #include "mfx_vp8_dec_decode_hw.h" #endif #if defined (MFX_ENABLE_VP9_VIDEO_DECODE) #include "mfx_vp9_dec_decode_hw.h" #endif #if defined (MFX_ENABLE_AV1_VIDEO_DECODE) #include "mfx_av1_dec_decode.h" #endif #include "mfx_unified_decode_logging.h" template<> VideoDECODE* _mfxSession::Create(mfxVideoParam& par) { VideoDECODE* pDECODE = nullptr; VideoCORE* core = m_pCORE.get(); mfxStatus mfxRes = MFX_ERR_MEMORY_ALLOC; mfxU32 CodecId = par.mfx.CodecId; // create a codec instance switch (CodecId) { #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) case MFX_CODEC_MPEG2: pDECODE = new VideoDECODEMPEG2(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) case MFX_CODEC_VC1: pDECODE = new MFXVideoDECODEVC1(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_H264_VIDEO_DECODE) case MFX_CODEC_AVC: pDECODE = new VideoDECODEH264(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_H265_VIDEO_DECODE) case MFX_CODEC_HEVC: pDECODE = new VideoDECODEH265(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) case MFX_CODEC_JPEG: pDECODE = new VideoDECODEMJPEG(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_VP8_VIDEO_DECODE) case MFX_CODEC_VP8: pDECODE = new VideoDECODEVP8_HW(core, &mfxRes); break; #endif // MFX_ENABLE_VP8_VIDEO_DECODE #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) case MFX_CODEC_VP9: pDECODE = new VideoDECODEVP9_HW(core, &mfxRes); break; #endif #if defined (MFX_ENABLE_AV1_VIDEO_DECODE) case MFX_CODEC_AV1: pDECODE = new VideoDECODEAV1(core, &mfxRes); break; #endif default: break; } // check error(s) if (MFX_ERR_NONE != mfxRes) { delete pDECODE; pDECODE = nullptr; } return pDECODE; } mfxStatus MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(out, MFX_ERR_NULL_PTR); TRACE_EVENT(MFX_TRACE_API_DECODE_QUERY_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session, in ? in->mfx.FrameInfo.Width : 0, in ? in->mfx.FrameInfo.Height : 0, in ? in->mfx.CodecId : 0)); #ifndef ANDROID if ((0 != in) && (MFX_HW_VAAPI == session->m_pCORE->GetVAType())) { // protected content not supported on Linux if(0 != in->Protected) { out->Protected = 0; return MFX_ERR_UNSUPPORTED; } } #endif mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", in); try { switch (out->mfx.CodecId) { #ifdef MFX_ENABLE_VC1_VIDEO_DECODE case MFX_CODEC_VC1: mfxRes = MFXVideoDECODEVC1::Query(session->m_pCORE.get(), in, out); break; #endif #ifdef MFX_ENABLE_H264_VIDEO_DECODE case MFX_CODEC_AVC: mfxRes = VideoDECODEH264::Query(session->m_pCORE.get(), in, out); break; #endif #ifdef MFX_ENABLE_H265_VIDEO_DECODE case MFX_CODEC_HEVC: mfxRes = VideoDECODEH265::Query(session->m_pCORE.get(), in, out); break; #endif #ifdef MFX_ENABLE_MPEG2_VIDEO_DECODE case MFX_CODEC_MPEG2: mfxRes = VideoDECODEMPEG2::Query(session->m_pCORE.get(), in, out); break; #endif #ifdef MFX_ENABLE_MJPEG_VIDEO_DECODE case MFX_CODEC_JPEG: mfxRes = VideoDECODEMJPEG::Query(session->m_pCORE.get(), in, out); break; #endif #if defined (MFX_ENABLE_VP8_VIDEO_DECODE) case MFX_CODEC_VP8: mfxRes = VideoDECODEVP8_HW::Query(session->m_pCORE.get(), in, out); break; #endif // MFX_ENABLE_VP8_VIDEO_DECODE #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) case MFX_CODEC_VP9: mfxRes = VideoDECODEVP9_HW::Query(session->m_pCORE.get(), in, out); break; #endif #ifdef MFX_ENABLE_AV1_VIDEO_DECODE case MFX_CODEC_AV1: mfxRes = VideoDECODEAV1::Query(session->m_pCORE.get(), in, out); break; #endif default: mfxRes = MFX_ERR_UNSUPPORTED; } TRACE_EVENT(MFX_TRACE_API_DECODE_QUERY_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); } // handle error(s) catch(...) { mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", out); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_CHECK(request, MFX_ERR_NULL_PTR); TRACE_EVENT(MFX_TRACE_API_DECODE_QUERY_IOSURF_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session, par ? (uint32_t)par->mfx.FrameInfo.Width : 0, par ? (uint32_t)par->mfx.FrameInfo.Height : 0, par ? par->mfx.CodecId : 0)); mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", par); try { switch (par->mfx.CodecId) { #ifdef MFX_ENABLE_VC1_VIDEO_DECODE case MFX_CODEC_VC1: mfxRes = MFXVideoDECODEVC1::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif #ifdef MFX_ENABLE_H264_VIDEO_DECODE case MFX_CODEC_AVC: mfxRes = VideoDECODEH264::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif #ifdef MFX_ENABLE_H265_VIDEO_DECODE case MFX_CODEC_HEVC: mfxRes = VideoDECODEH265::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif #ifdef MFX_ENABLE_MPEG2_VIDEO_DECODE case MFX_CODEC_MPEG2: mfxRes = VideoDECODEMPEG2::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif #ifdef MFX_ENABLE_MJPEG_VIDEO_DECODE case MFX_CODEC_JPEG: mfxRes = VideoDECODEMJPEG::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif #if defined (MFX_ENABLE_VP8_VIDEO_DECODE) case MFX_CODEC_VP8: mfxRes = VideoDECODEVP8_HW::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif // MFX_ENABLE_VP8_VIDEO_DECODE #if defined (MFX_ENABLE_VP9_VIDEO_DECODE) case MFX_CODEC_VP9: mfxRes = VideoDECODEVP9_HW::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif // MFX_ENABLE_VP9_VIDEO_DECODE #ifdef MFX_ENABLE_AV1_VIDEO_DECODE case MFX_CODEC_AV1: mfxRes = VideoDECODEAV1::QueryIOSurf(session->m_pCORE.get(), par, request); break; #endif default: mfxRes = MFX_ERR_UNSUPPORTED; } TRACE_EVENT(MFX_TRACE_API_DECODE_QUERY_IOSURF_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); } // handle error(s) catch(...) { mfxRes = MFX_ERR_UNKNOWN; } TRACE_BUFFER_EVENT(MFX_TRACE_API_DECODE_QUERY_IOSURF_TASK, EVENT_TYPE_INFO, TR_KEY_MFX_API, request, DecodeQueryParam, DECODE_QUERY); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", request); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(bs, MFX_ERR_NULL_PTR); MFX_CHECK(par, MFX_ERR_NULL_PTR); TRACE_EVENT(MFX_TRACE_API_DECODE_HEADER_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session, bs, bs ? bs->DataLength : 0)); mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", bs); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", par); try { switch (par->mfx.CodecId) { #ifdef MFX_ENABLE_VC1_VIDEO_DECODE case MFX_CODEC_VC1: mfxRes = MFXVideoDECODEVC1::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #ifdef MFX_ENABLE_H264_VIDEO_DECODE case MFX_CODEC_AVC: mfxRes = VideoDECODEH264::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #ifdef MFX_ENABLE_H265_VIDEO_DECODE case MFX_CODEC_HEVC: mfxRes = VideoDECODEH265::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #ifdef MFX_ENABLE_MPEG2_VIDEO_DECODE case MFX_CODEC_MPEG2: mfxRes = VideoDECODEMPEG2::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #ifdef MFX_ENABLE_MJPEG_VIDEO_DECODE case MFX_CODEC_JPEG: mfxRes = VideoDECODEMJPEG::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #if defined(MFX_ENABLE_VP8_VIDEO_DECODE) case MFX_CODEC_VP8: mfxRes = VP8DecodeCommon::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif #if defined (MFX_ENABLE_VP9_VIDEO_DECODE) case MFX_CODEC_VP9: mfxRes = VideoDECODEVP9_HW::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif // MFX_ENABLE_VP9_VIDEO_DECODE #ifdef MFX_ENABLE_AV1_VIDEO_DECODE case MFX_CODEC_AV1: mfxRes = VideoDECODEAV1::DecodeHeader(session->m_pCORE.get(), bs, par); break; #endif default: mfxRes = MFX_ERR_UNSUPPORTED; } TRACE_EVENT(MFX_TRACE_API_DECODE_HEADER_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); } // handle error(s) catch(...) { mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); TRACE_EVENT(MFX_TRACE_API_DECODE_INIT_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session, par ? par->mfx.FrameInfo.Width : 0, par ? par->mfx.FrameInfo.Height : 0, par ? par->mfx.CodecId : 0)); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", par); try { // check existence of component if (!session->m_pDECODE) { // create a new instance session->m_pDECODE.reset(session->Create(*par)); MFX_CHECK(session->m_pDECODE.get(), MFX_ERR_INVALID_VIDEO_PARAM); } mfxRes = session->m_pDECODE->Init(par); TRACE_EVENT(MFX_TRACE_API_DECODE_INIT_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); } catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } TRACE_BUFFER_EVENT(MFX_TRACE_API_DECODE_INIT_TASK, EVENT_TYPE_INFO, TR_KEY_MFX_API, par, DecodeInitParam, DECODE_INIT); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoDECODE_Close(mfxSession session) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); mfxStatus mfxRes = MFX_ERR_NONE; TRACE_EVENT(MFX_TRACE_API_DECODE_CLOSE_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session)); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); try { if (!session->m_pDECODE) { return MFX_ERR_NOT_INITIALIZED; } // wait until all tasks are processed session->m_pScheduler->WaitForAllTasksCompletion(session->m_pDECODE.get()); mfxRes = session->m_pDECODE->Close(); session->m_pDECODE.reset(nullptr); TRACE_EVENT(MFX_TRACE_API_DECODE_CLOSE_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes)); } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { mfxStatus mfxRes; PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); TRACE_EVENT(MFX_TRACE_API_DECODE_FRAME_ASYNC_TASK, EVENT_TYPE_START, TR_KEY_MFX_API, make_event_data(session, surface_work, bs ? bs->DataLength : 0)); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", bs); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", surface_work); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(session->m_pDECODE.get(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(syncp); MFX_CHECK_NULL_PTR1(surface_out); try { mfxSyncPoint syncPoint = NULL; MFX_TASK task; // Wait for the bit stream mfxRes = session->m_pScheduler->WaitForDependencyResolved(bs); MFX_CHECK_STS(mfxRes); // reset the sync point *syncp = NULL; *surface_out = NULL; memset(&task, 0, sizeof(MFX_TASK)); mfxRes = session->m_pDECODE->DecodeFrameCheck(bs, surface_work, surface_out, &task.entryPoint); MFX_CHECK(mfxRes >= 0 || MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes || MFX_ERR_MORE_DATA == mfxRes || MFX_ERR_MORE_SURFACE == mfxRes, mfxRes); // source data is OK, go forward if (task.entryPoint.pRoutine) { mfxStatus mfxAddRes; task.pOwner = session->m_pDECODE.get(); task.priority = session->m_priority; task.threadingPolicy = session->m_pDECODE->GetThreadingPolicy(); // fill dependencies task.pDst[0] = *surface_out; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_DECODE; #endif // register input and call the task PERF_UTILITY_SET_ASYNC_TASK_ID(task.nTaskId); mfxAddRes = session->m_pScheduler->AddTask(task, &syncPoint); MFX_CHECK_STS(mfxAddRes); if (syncPoint && *surface_out && (*surface_out)->FrameInterface && !session->m_pCORE->IsExternalFrameAllocator()) { MFX_CHECK_HDL((*surface_out)->FrameInterface->Context); static_cast((*surface_out)->FrameInterface->Context)->SetSyncPoint(syncPoint); } } if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) { mfxRes = MFX_WRN_DEVICE_BUSY; } // Self allocation (i.e. memory model 3), GetSurface timeout expired else if (!surface_work && mfxRes == MFX_ERR_MORE_SURFACE) { mfxRes = MFX_WRN_ALLOC_TIMEOUT_EXPIRED; } // return pointer to synchronization point if (MFX_ERR_NONE == mfxRes || (mfxRes == MFX_WRN_VIDEO_PARAM_CHANGED && *surface_out != NULL)) { *syncp = syncPoint; } TRACE_EVENT(MFX_TRACE_API_DECODE_FRAME_ASYNC_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(mfxRes, *syncp)); } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } if (mfxRes == MFX_ERR_NONE) { if (surface_out && *surface_out) { MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: " , *surface_out); } if (syncp) { MFX_LTRACE_P(MFX_TRACE_LEVEL_API, *syncp); } } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } // mfxStatus MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_dec, mfxFrameSurface1 **surface_disp, mfxSyncPoint *syncp) struct DHandlers { std::function QueryImplsDescription; }; typedef std::map CodecId2Handlers; mfxStatus QueryImplsDescription(VideoCORE& core, mfxDecoderDescription& caps, mfx::PODArraysHolder& ah) { static const CodecId2Handlers codecId2Handlers = { #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) { MFX_CODEC_MPEG2, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEMPEG2::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) { MFX_CODEC_VC1, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return MFXVideoDECODEVC1::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_H264_VIDEO_DECODE) { MFX_CODEC_AVC, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEH264::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_H265_VIDEO_DECODE) { MFX_CODEC_HEVC, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEH265::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) { MFX_CODEC_JPEG, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEMJPEG::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_VP8_VIDEO_DECODE) { MFX_CODEC_VP8, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEVP8_HW::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_VP9_VIDEO_DECODE) { MFX_CODEC_VP9, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEVP9_HW::QueryImplsDescription(core, caps, ah); } } }, #endif #if defined (MFX_ENABLE_AV1_VIDEO_DECODE) { MFX_CODEC_AV1, { // .QueryImplsDescription = [](VideoCORE& core, mfxDecoderDescription::decoder& caps, mfx::PODArraysHolder& ah) { return VideoDECODEAV1::QueryImplsDescription(core, caps, ah); } } }, #endif }; for (auto& c : codecId2Handlers) { if (!c.second.QueryImplsDescription) continue; auto& dec = ah.PushBack(caps.Codecs); dec.CodecID = c.first; MFX_SAFE_CALL(c.second.QueryImplsDescription(core, dec, ah)); ++caps.NumCodecs; } return MFX_ERR_NONE; } // // THE OTHER DECODE FUNCTIONS HAVE IMPLICIT IMPLEMENTATION // FUNCTION_RESET_IMPL(DECODE, Reset, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(DECODE, GetVideoParam, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(DECODE, GetDecodeStat, (mfxSession session, mfxDecodeStat *stat), (stat)) FUNCTION_IMPL(DECODE, SetSkipMode, (mfxSession session, mfxSkipMode mode), (mode)) FUNCTION_IMPL(DECODE, GetPayload, (mfxSession session, mfxU64 *ts, mfxPayload *payload), (ts, payload)) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_decode_vp.cpp000066400000000000000000000706471443134507600307770ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include #include constexpr mfxU16 decoderChannelID = 0; class DVP_impl : public _mfxSession::DVP_base { virtual surface_cache_controller* GetSurfacePool(mfxU16 channel_id) override { if (VppPools.find(channel_id) == VppPools.end()) return nullptr; return VppPools[channel_id].get(); } virtual void AssignPool(mfxU16 channel_id, SurfaceCache* cache) override { VppPools[channel_id].reset(new surface_cache_controller(cache, ComponentType::VPP, MFX_VPP_POOL_OUT)); } private: std::map>> VppPools; }; mfxStatus MFXVideoDECODE_VPP_Init(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK_NULL_PTR2(decode_par, vpp_par_array); mfxStatus mfxRes = MFX_ERR_NONE; try { //check VPP config std::set ids; for (mfxU32 channelIdx = 0; channelIdx < num_channel_par; channelIdx++) { mfxVideoChannelParam* channelPar = vpp_par_array[channelIdx]; MFX_CHECK(channelPar, MFX_ERR_NULL_PTR); if (channelPar->Protected != 0) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } mfxU16 id = channelPar->VPP.ChannelId; if (id == decoderChannelID || ids.find(id) != ids.end()) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } ids.insert(id); if (channelPar->NumExtParam) { MFX_CHECK_NULL_PTR1(channelPar->ExtParam); // Check that all ext buffer pointers are valid MFX_CHECK(std::all_of(channelPar->ExtParam, channelPar->ExtParam + channelPar->NumExtParam, [](mfxExtBuffer* buffer) { return !!buffer; }), MFX_ERR_NULL_PTR); // Check that all buffer ids are unique std::vector ext_buf(channelPar->ExtParam, channelPar->ExtParam + channelPar->NumExtParam); MFX_CHECK(std::unique(std::begin(ext_buf), std::end(ext_buf), [](mfxExtBuffer* buffer, mfxExtBuffer* other_buffer) { return buffer->BufferId == other_buffer->BufferId; }) == std::end(ext_buf), MFX_ERR_INVALID_VIDEO_PARAM); // Check that only allowed buffers passed bool valid = std::all_of(channelPar->ExtParam, channelPar->ExtParam + channelPar->NumExtParam, [](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_VPP_SCALING || buffer->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS ; }); MFX_CHECK(valid, MFX_ERR_INVALID_VIDEO_PARAM); // Check mfxExtVPPScaling buffer validity auto it = std::find_if(std::begin(ext_buf), std::end(ext_buf), [](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_VPP_SCALING; }); if (it != std::end(ext_buf)) { switch (reinterpret_cast(*it)->ScalingMode) { case MFX_SCALING_MODE_DEFAULT: case MFX_SCALING_MODE_LOWPOWER: case MFX_SCALING_MODE_QUALITY: case MFX_SCALING_MODE_INTEL_GEN_VDBOX: case MFX_SCALING_MODE_INTEL_GEN_VEBOX: case MFX_SCALING_MODE_INTEL_GEN_COMPUTE: break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } // Check mfxExtAllocationHints buffer validity it = std::find_if(std::begin(ext_buf), std::end(ext_buf), [](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS; }); if (it != std::end(ext_buf)) { mfxExtAllocationHints& hints_buffer = *reinterpret_cast(*it); MFX_SAFE_CALL(CheckAllocationHintsBuffer(hints_buffer)); MFX_CHECK(hints_buffer.VPPPoolType == MFX_VPP_POOL_OUT, MFX_ERR_INVALID_VIDEO_PARAM); } } if (decode_par->mfx.FrameInfo.FrameRateExtN != channelPar->VPP.FrameRateExtN || decode_par->mfx.FrameInfo.FrameRateExtD != channelPar->VPP.FrameRateExtD || decode_par->mfx.FrameInfo.PicStruct != channelPar->VPP.PicStruct) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } //create DVP if (!session->m_pDVP) { session->m_pDVP.reset(new DVP_impl()); session->m_pDVP->skipOriginalOutput = IsOn(decode_par->mfx.SkipOutput); } //parse VPP params mfxU16 sfcChannelID = 0; //zero ID is reserved for DEC channel, it is invalid value for SFC // Need to adjust scaling methods to Intel specific, so need tmp storage to not touch user's buffers std::list> ext_buffers; std::list scaling_buffers; for (mfxU32 channelIdx = 0; channelIdx < num_channel_par; channelIdx++) { mfxVideoChannelParam* channelPar = vpp_par_array[channelIdx]; MFX_CHECK(channelPar, MFX_ERR_NULL_PTR); mfxU16 id = channelPar->VPP.ChannelId; mfxVideoParam& VppParams = session->m_pDVP->VppParams[id]; //extract and convert scaling modes mfxU16 vppScalingMode = MFX_SCALING_MODE_DEFAULT; bool remap_buffer = false; auto scaling_buffer = reinterpret_cast(mfx::GetExtBuffer(channelPar->ExtParam, channelPar->NumExtParam, MFX_EXTBUFF_VPP_SCALING)); if (scaling_buffer) { switch (scaling_buffer->ScalingMode) { case MFX_SCALING_MODE_INTEL_GEN_VDBOX: { session->m_pDVP->sfcChannelID = sfcChannelID = id; } remap_buffer = true; break; case MFX_SCALING_MODE_INTEL_GEN_VEBOX: remap_buffer = true; case MFX_SCALING_MODE_LOWPOWER: vppScalingMode = MFX_SCALING_MODE_LOWPOWER; break; case MFX_SCALING_MODE_INTEL_GEN_COMPUTE: remap_buffer = true; case MFX_SCALING_MODE_QUALITY: vppScalingMode = MFX_SCALING_MODE_QUALITY; break; case MFX_SCALING_MODE_DEFAULT: break; default: assert(0); //MFX_SCALING_MODE_DEFAULT in release } } //set i/o pattern, limit to homogeneous cases, we can relax it later VppParams.IOPattern = static_cast( channelPar->IOPattern | (decode_par->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_IOPATTERN_IN_SYSTEM_MEMORY : MFX_IOPATTERN_IN_VIDEO_MEMORY)); MFX_CHECK(VppParams.IOPattern == (MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || VppParams.IOPattern == (MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY), MFX_ERR_UNSUPPORTED); VppParams.AsyncDepth = decode_par->AsyncDepth; VppParams.vpp.In = decode_par->mfx.FrameInfo; VppParams.vpp.Out = channelPar->VPP; VppParams.ExtParam = channelPar->ExtParam; VppParams.NumExtParam = channelPar->NumExtParam; if (remap_buffer) { ext_buffers.emplace_back(VppParams.ExtParam, VppParams.ExtParam + VppParams.NumExtParam); auto it_erase = std::remove_if(std::begin(ext_buffers.back()), std::end(ext_buffers.back()), [](mfxExtBuffer* buf) { return buf->BufferId == MFX_EXTBUFF_VPP_SCALING; }); ext_buffers.back().erase(it_erase, std::end(ext_buffers.back())); //add scaling mode buffer if (vppScalingMode != MFX_SCALING_MODE_DEFAULT) { scaling_buffers.emplace_back(); mfxExtVPPScaling& vppScalingExtBuf = scaling_buffers.back(); vppScalingExtBuf = {}; vppScalingExtBuf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; vppScalingExtBuf.Header.BufferSz = sizeof(mfxExtVPPScaling); vppScalingExtBuf.ScalingMode = vppScalingMode; ext_buffers.back().push_back(&vppScalingExtBuf.Header); } VppParams.ExtParam = ext_buffers.back().data(); VppParams.NumExtParam = mfxU16(ext_buffers.back().size()); } } //create and init decoder MFX_CHECK(decode_par->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY || decode_par->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY, MFX_ERR_UNSUPPORTED); if (!session->m_pDECODE) { session->m_pDECODE.reset(session->Create(*decode_par)); } if (sfcChannelID != 0) { //create "SFC" ext buffer mfxVideoParam& VppParams = session->m_pDVP->VppParams[sfcChannelID]; mfxExtDecVideoProcessing decVppParams{}; decVppParams.Header.BufferId = MFX_EXTBUFF_DEC_VIDEO_PROCESSING; decVppParams.Header.BufferSz = sizeof(mfxExtDecVideoProcessing); decVppParams.In.CropX = decode_par->mfx.FrameInfo.CropX; decVppParams.In.CropY = decode_par->mfx.FrameInfo.CropY; decVppParams.In.CropW = decode_par->mfx.FrameInfo.CropW; decVppParams.In.CropH = decode_par->mfx.FrameInfo.CropH; decVppParams.Out.FourCC = VppParams.vpp.Out.FourCC; decVppParams.Out.ChromaFormat = VppParams.vpp.Out.ChromaFormat; decVppParams.Out.Width = VppParams.vpp.Out.Width; decVppParams.Out.Height = VppParams.vpp.Out.Height; decVppParams.Out.CropX = VppParams.vpp.Out.CropX; decVppParams.Out.CropY = VppParams.vpp.Out.CropY; decVppParams.Out.CropW = VppParams.vpp.Out.CropW; decVppParams.Out.CropH = VppParams.vpp.Out.CropH; //create local copy of decoder params, to preserve input params in case of exception or early exit mfxVideoParam decParams = *decode_par; std::vector decExtBuffers(decParams.ExtParam, decParams.ExtParam + decParams.NumExtParam); decExtBuffers.push_back(&decVppParams.Header); decParams.ExtParam = decExtBuffers.data(); decParams.NumExtParam = static_cast(decExtBuffers.size()); //init mfxRes = session->m_pDECODE->Init(&decParams); MFX_CHECK_STS(mfxRes); } else { mfxRes = session->m_pDECODE->Init(decode_par); MFX_CHECK_STS(mfxRes); } //create and init VPPs for (auto& p : session->m_pDVP->VppParams) { mfxU16 id = p.first; if (id == sfcChannelID) { continue; } mfxVideoParam& VppParams = p.second; if (!session->m_pDVP->VPPs[id]) { session->m_pDVP->VPPs[id].reset(session->Create(VppParams)); } // Process cache hints buffer if (VppParams.NumExtParam) { // Remove cache control buffers (they are actually shifted to the end) auto p_new_end = std::remove_if(VppParams.ExtParam, VppParams.ExtParam + VppParams.NumExtParam, [](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS; }); if (p_new_end != VppParams.ExtParam + VppParams.NumExtParam) { mfxU16 n_original = VppParams.NumExtParam; VppParams.NumExtParam = mfxU16(p_new_end - VppParams.ExtParam); // Only one allocation hint buffer is allowed for any of VPPs inside DVP MFX_CHECK(n_original - VppParams.NumExtParam <= 1, MFX_ERR_INVALID_VIDEO_PARAM); } } mfxRes = session->m_pDVP->VPPs[id]->Init(&VppParams); MFX_CHECK_STS(mfxRes); // Will not keep (deep copy) Ext Buffers, so clean up here VppParams.NumExtParam = 0; VppParams.ExtParam = nullptr; CommonCORE_VPL* base_core_vpl = dynamic_cast(session->m_pCORE.get()); MFX_CHECK_HDL(base_core_vpl); mfxU16 vpp_memtype = mfxU16(MFX_MEMTYPE_FROM_VPPOUT | ((VppParams.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) ? MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET : MFX_MEMTYPE_SYSTEM_MEMORY)); std::unique_ptr scoped_cache_ptr(SurfaceCache::Create(*base_core_vpl, vpp_memtype, session->m_pDVP->VppParams[id].vpp.Out)); session->m_pDVP->AssignPool(id, scoped_cache_ptr.get()); scoped_cache_ptr.release(); MFX_SAFE_CALL(session->m_pDVP->GetSurfacePool(id)->SetupCache(session, VppParams)); } } catch (...) { MFX_RETURN(MFX_ERR_UNKNOWN); } return MFX_ERR_NONE; } class RAIISurfaceArray { public: RAIISurfaceArray() { SurfArray = mfxSurfaceArrayImpl::Create(); }; RAIISurfaceArray(const RAIISurfaceArray&) = delete; RAIISurfaceArray& operator =(const RAIISurfaceArray&) = delete; RAIISurfaceArray(RAIISurfaceArray&&) = default; RAIISurfaceArray& operator=(RAIISurfaceArray&&) = default; ~RAIISurfaceArray() { if (SurfArray) { for (mfxU32 i = 0; i < SurfArray->NumSurfaces; i++) { mfxFrameSurface1* s = SurfArray->Surfaces[i]; std::ignore = MFX_STS_TRACE(s->FrameInterface->Release(s)); } std::ignore = MFX_STS_TRACE(SurfArray->Release()); } }; mfxSurfaceArray* ReleaseContent() { mfxSurfaceArray* ret = SurfArray; SurfArray = nullptr; return ret; }; mfxSurfaceArrayImpl* operator->() { return SurfArray; }; protected: mfxSurfaceArrayImpl* SurfArray; }; mfxStatus MFXVideoDECODE_VPP_DecodeFrameAsync(mfxSession session, mfxBitstream* bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray** surf_array_out) { MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(surf_array_out, MFX_ERR_NULL_PTR); if (num_skip_channels != 0) { MFX_CHECK(skip_channels, MFX_ERR_NULL_PTR); } mfxStatus mfxRes = MFX_ERR_NONE; try { //skip channels std::vector skipChannels; if (num_skip_channels != 0) { skipChannels.assign(skip_channels, skip_channels + num_skip_channels); } //DEC mfxFrameSurface1* decWork{}, * decOut{}, * decChannelSurf{}, * sfcChannelSurf{}; mfxSyncPoint decSyncp{}; do { mfxRes = MFXMemory_GetSurfaceForDecode(session, &decWork); MFX_CHECK_STS(mfxRes); mfxRes = MFXVideoDECODE_DecodeFrameAsync(session, bs, decWork, &decOut, &decSyncp); MFX_SAFE_CALL(decWork->FrameInterface->Release(decWork)); if (mfxRes == MFX_WRN_VIDEO_PARAM_CHANGED && (decOut != nullptr || decSyncp != nullptr)) { throw std::exception(); } // Ignore new SPS warning, repeat DEC call with new surface is necessary } while (mfxRes == MFX_ERR_MORE_SURFACE || mfxRes == MFX_WRN_VIDEO_PARAM_CHANGED); MFX_CHECK_STS(mfxRes); if (!decOut || !decSyncp) { throw std::exception(); } //output DEC and SFC surfaces RAIISurfaceArray surfArray; mfxU16 sfcChannelID = session->m_pDVP->sfcChannelID; if (sfcChannelID != 0) { decChannelSurf = session->m_pDECODE->GetInternalSurface(decOut); MFX_CHECK(decChannelSurf, MFX_ERR_NULL_PTR); mfxRes = decChannelSurf->FrameInterface->AddRef(decChannelSurf); MFX_CHECK_STS(mfxRes); decChannelSurf->Info.ChannelId = decoderChannelID; sfcChannelSurf = decOut; sfcChannelSurf->Info.ChannelId = sfcChannelID; } else { decChannelSurf = decOut; decChannelSurf->Info.ChannelId = decoderChannelID; } //output DEC channel if (skipChannels.end() == std::find(skipChannels.begin(), skipChannels.end(), decoderChannelID) && !session->m_pDVP->skipOriginalOutput) { surfArray->AddSurface(decChannelSurf); } else { MFX_SAFE_CALL(ReleaseSurface(*decChannelSurf)); } //output SFC channel if (sfcChannelID != 0) { if (skipChannels.end() == std::find(skipChannels.begin(), skipChannels.end(), sfcChannelID)) { surfArray->AddSurface(sfcChannelSurf); } else { MFX_SAFE_CALL(sfcChannelSurf->FrameInterface->Release(sfcChannelSurf)); } } //VPP for (const auto& p : session->m_pDVP->VPPs) { const mfxU16 id = p.first; if (skipChannels.end() != std::find(skipChannels.begin(), skipChannels.end(), id)) { //skip this channel continue; } mfxFrameSurface1* vppOut = nullptr; MFX_SAFE_CALL((*session->m_pDVP->GetSurfacePool(id))->GetSurface(vppOut)); MFX_CHECK(vppOut, MFX_ERR_NULL_PTR); const auto& vpp = p.second; //update output crops, they may change only after reset mfxVideoParam& VppParams = session->m_pDVP->VppParams[id]; vppOut->Info.CropX = VppParams.vpp.Out.CropX; vppOut->Info.CropY = VppParams.vpp.Out.CropY; vppOut->Info.CropW = VppParams.vpp.Out.CropW; vppOut->Info.CropH = VppParams.vpp.Out.CropH; mfxSyncPoint vppSyncp{}; static const mfxU32 MFX_NUM_ENTRY_POINTS = 2; MFX_ENTRY_POINT entryPoints[MFX_NUM_ENTRY_POINTS]{}; mfxU32 numEntryPoints = MFX_NUM_ENTRY_POINTS; mfxRes = vpp->VppFrameCheck(decChannelSurf, vppOut, nullptr, entryPoints, numEntryPoints); if ((MFX_ERR_NONE == mfxRes) || (MFX_ERR_MORE_DATA_SUBMIT_TASK == static_cast(mfxRes)) || (MFX_ERR_MORE_SURFACE == mfxRes) || (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxRes)) { if (numEntryPoints == 1) { if (mfxRes != MFX_ERR_NONE || !entryPoints[0].pRoutine) { throw std::exception(); } MFX_TASK task{}; task.pOwner = vpp.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = MFX_TASK_THREADING_DEDICATED; task.pSrc[0] = decChannelSurf; task.pDst[0] = vppOut; if (MFX_ERR_MORE_DATA_SUBMIT_TASK == static_cast(mfxRes)) { task.pDst[0] = nullptr; } //task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; MFX_SAFE_CALL(session->m_pScheduler->AddTask(task, &vppSyncp)); if (vppSyncp == nullptr) { throw std::exception(); } } else { if (mfxRes != MFX_ERR_NONE || !entryPoints[0].pRoutine || !entryPoints[1].pRoutine || numEntryPoints != 2) { throw std::exception(); } MFX_TASK task{}; task.pOwner = vpp.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = MFX_TASK_THREADING_DEDICATED; task.pSrc[0] = decChannelSurf; task.pDst[0] = entryPoints[0].pParam; //task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; MFX_SAFE_CALL(session->m_pScheduler->AddTask(task, &vppSyncp)); if (vppSyncp == nullptr) { throw std::exception(); } task = {}; task.pOwner = vpp.get(); task.entryPoint = entryPoints[1]; task.priority = session->m_priority; task.threadingPolicy = MFX_TASK_THREADING_DEDICATED; task.pSrc[0] = entryPoints[0].pParam;; task.pDst[0] = vppOut; if (MFX_ERR_MORE_DATA_SUBMIT_TASK == static_cast(mfxRes)) { task.pDst[0] = nullptr; } //task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; MFX_SAFE_CALL(session->m_pScheduler->AddTask(task, &vppSyncp)); if (vppSyncp == nullptr) { throw std::exception(); } } if (vppSyncp && vppOut->FrameInterface && !session->m_pCORE->IsExternalFrameAllocator()) { MFX_CHECK_HDL(vppOut->FrameInterface->Context); static_cast(vppOut->FrameInterface->Context)->SetSyncPoint(vppSyncp); } } if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) { mfxRes = MFX_ERR_MORE_DATA; vppSyncp = nullptr; } vppOut->Info.ChannelId = id; surfArray->AddSurface(vppOut); } //check for skipChannels if (surfArray->NumSurfaces == 0) { *surf_array_out = nullptr; } else { *surf_array_out = surfArray.ReleaseContent(); } } catch (...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } return mfxRes; } static inline bool CmpFrameInfoIgnoreCrops(const mfxFrameInfo& l, const mfxFrameInfo& r) { return MFX_EQ_FIELD(BitDepthLuma) && MFX_EQ_FIELD(BitDepthChroma) && MFX_EQ_FIELD(Shift) && MFX_EQ_FIELD(FourCC) && MFX_EQ_FIELD(Width) && MFX_EQ_FIELD(Height) && MFX_EQ_FIELD(FrameRateExtN) && MFX_EQ_FIELD(FrameRateExtD) && MFX_EQ_FIELD(AspectRatioW) && MFX_EQ_FIELD(AspectRatioH) && MFX_EQ_FIELD(PicStruct) && MFX_EQ_FIELD(ChromaFormat); } mfxStatus MFXVideoDECODE_VPP_Reset(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); //check if we need full reset if (decode_par != nullptr) { MFX_SAFE_CALL(MFXVideoDECODE_VPP_Close(session)); MFX_RETURN(MFXVideoDECODE_VPP_Init(session, decode_par, vpp_par_array, num_channel_par)); } //only VPP reset is requested MFX_CHECK(vpp_par_array, MFX_ERR_NULL_PTR); //reset VPPs one by one for (mfxU32 channelIdx = 0; channelIdx < num_channel_par; channelIdx++) { mfxVideoChannelParam* channelPar = vpp_par_array[channelIdx]; MFX_CHECK(channelPar, MFX_ERR_NULL_PTR); //check that channel ID is valid mfxU16 id = channelPar->VPP.ChannelId; auto& p = session->m_pDVP->VppParams; if (p.find(id) == p.end()) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } mfxVideoParam& VppParams = p[id]; //check that only crops were changed mfxFrameInfo& frameInfoCur = VppParams.vpp.Out; mfxFrameInfo& frameInfoNew = channelPar->VPP; if (channelPar->Protected != VppParams.Protected || channelPar->IOPattern != (0xf0 & VppParams.IOPattern) || //0xf0 selects MFX_IOPATTERN_OUT_xxx !CmpFrameInfoIgnoreCrops(frameInfoCur, frameInfoNew) ) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } //check crops if (frameInfoNew.CropX >= frameInfoNew.Width || frameInfoNew.CropY >= frameInfoNew.Height || frameInfoNew.CropW == 0 || frameInfoNew.CropH == 0 || frameInfoNew.CropX + frameInfoNew.CropW > frameInfoNew.Width || frameInfoNew.CropY + frameInfoNew.CropH > frameInfoNew.Height ) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } //update crops VppParams.vpp.Out = channelPar->VPP; MFX_SAFE_CALL(session->m_pDVP->GetSurfacePool(id)->ResetCache(channelPar->ExtParam, channelPar->NumExtParam)); //MFX_SAFE_CALL(session->m_pDVP->VPPs[id]->Reset(&VppParams)); } return MFX_ERR_NONE; } //preserve first error, return first warning if there is no errors static void UpdateStatus(mfxStatus& res, const mfxStatus cur) { res = res < 0 ? res : cur < 0 ? cur : res > 0 ? res : cur; } mfxStatus MFXVideoDECODE_VPP_Close(mfxSession session) { MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); //close decoder, don't exit in case of error, close VPPs also mfxStatus res = MFXVideoDECODE_Close(session); try { if (session->m_pDVP) { //close VPPs for (const auto& p : session->m_pDVP->VPPs) { const auto& vpp = p.second; mfxStatus cur = session->m_pScheduler->WaitForAllTasksCompletion(vpp.get()); UpdateStatus(res, cur); cur = vpp->Close(); UpdateStatus(res, cur); } //delete VPP params, surface pools and ext buffers session->m_pDVP.reset(); } } catch (...) { UpdateStatus(res, MFX_ERR_UNKNOWN); } return res; } mfxStatus MFXVideoDECODE_VPP_GetChannelParam(mfxSession session, mfxVideoChannelParam* par, mfxU32 channel_id) { MFX_CHECK_HDL(session); MFX_CHECK_NULL_PTR1(par); MFX_CHECK(session->m_pDVP, MFX_ERR_NOT_INITIALIZED); mfxU16 ChannelId = static_cast(channel_id); auto& vpp_params = session->m_pDVP->VppParams; MFX_CHECK(vpp_params.find(ChannelId) != vpp_params.end(), MFX_ERR_NOT_FOUND); par->VPP = vpp_params[ChannelId].vpp.Out; par->Protected = vpp_params[ChannelId].Protected; par->IOPattern = vpp_params[ChannelId].IOPattern; par->NumExtParam = 0; return MFX_ERR_NONE; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_enc.cpp000066400000000000000000000041541443134507600276020ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfxstructures-int.h" #define FUNCTION_DEPRECATED_IMPL(component, func_name, formal_param_list) \ mfxStatus APIImpl_MFXVideo##component##_##func_name formal_param_list \ { \ return MFX_ERR_UNSUPPORTED; \ } FUNCTION_DEPRECATED_IMPL(ENC, QueryIOSurf, (mfxSession /*session*/, mfxVideoParam * /*par*/, mfxFrameAllocRequest * /*request*/)) FUNCTION_DEPRECATED_IMPL(ENC, Init, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(ENC, Close, (mfxSession /*session*/)) FUNCTION_DEPRECATED_IMPL(ENC, Reset, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(ENC, Query, (mfxSession /*session*/, mfxVideoParam * /*in*/, mfxVideoParam * /*out*/)) FUNCTION_DEPRECATED_IMPL(ENC, GetVideoParam, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(ENC, ProcessFrameAsync, (mfxSession /*session*/, mfxENCInput * /*in*/, mfxENCOutput * /*out*/, mfxSyncPoint * /*syncp*/)) #undef FUNCTION_DEPRECATED_IMPL oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_encode.cpp000066400000000000000000000745041443134507600303000ustar00rootroot00000000000000// Copyright (c) 2008-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include #include "mfx_reflect.h" // sheduling and threading stuff #include #include "mfxvideo++int.h" #if defined (MFX_ENABLE_H264_VIDEO_ENCODE) #include "mfx_h264_encode_hw.h" #endif //MFX_ENABLE_H264_VIDEO_ENCODE #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #include "mfx_mpeg2_encode_hw.h" #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #include "mfx_mjpeg_encode_hw.h" #endif #if defined (MFX_ENABLE_H265_VIDEO_ENCODE) #include "../../encode_hw/hevc/hevcehw_disp.h" #endif #if defined (MFX_ENABLE_VP9_VIDEO_ENCODE) #include "mfx_vp9_encode_hw.h" #endif #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) #include "../../encode_hw/av1/av1ehw_disp.h" #endif #include "libmfx_core.h" struct CodecKey { const mfxU32 codecId; CodecKey(mfxU32 codecId) : codecId(codecId) {} enum { // special value for codecId to denote plugin, it must be // different from other MFX_CODEC_* used in codecId2Handlers MFX_CODEC_DUMMY_FOR_PLUGIN = 0 }; // Exact ordering rule is unsignificant as far as it provides strict weak ordering. friend bool operator<(CodecKey l, CodecKey r) { return l.codecId < r.codecId; } }; struct EHandlers { typedef std::function CtorType; struct Funcs { CtorType ctor; std::function query; std::function queryIOSurf; std::function QueryImplsDescription; }; Funcs primary; Funcs fallback; }; typedef std::map CodecId2Handlers; static const CodecId2Handlers codecId2Handlers = { #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) { { MFX_CODEC_AVC, }, { // .primary = { // .ctor = [](VideoCORE* core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { return new MFXHWVideoENCODEH264(core, mfxRes); }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { if (!session->m_pENCODE.get()) return MFXHWVideoENCODEH264::Query(session->m_pCORE.get(), in, out); else return MFXHWVideoENCODEH264::Query(session->m_pCORE.get(), in, out, session->m_pENCODE.get()); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXHWVideoENCODEH264::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return MFXHWVideoENCODEH264::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_H264_VIDEO_ENCODE #ifdef MFX_ENABLE_MPEG2_VIDEO_ENCODE { { MFX_CODEC_MPEG2 }, { // .primary = { // .ctor = [](VideoCORE* core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { return new MFXVideoENCODEMPEG2_HW(core, mfxRes); }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODEMPEG2_HW::Query(session->m_pCORE.get(), in, out); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODEMPEG2_HW::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return MFXVideoENCODEMPEG2_HW::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_MPEG2_VIDEO_ENCODE #if defined(MFX_ENABLE_MJPEG_VIDEO_ENCODE) { { MFX_CODEC_JPEG }, { // .primary = { // .ctor = [](VideoCORE* core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { return new MFXVideoENCODEMJPEG_HW(core, mfxRes); }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODEMJPEG_HW::Query(session->m_pCORE.get(), in, out); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODEMJPEG_HW::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return MFXVideoENCODEMJPEG_HW::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_MJPEG_VIDEO_ENCODE #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) { { MFX_CODEC_HEVC }, { // .primary = { // .ctor = [](VideoCORE* core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { if (core && mfxRes) return HEVCEHW::Create(*core, *mfxRes); return nullptr; }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { return HEVCEHW::Query(session->m_pCORE.get(), in, out); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return HEVCEHW::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return HEVCEHW::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_H265_VIDEO_ENCODE #if defined(MFX_ENABLE_VP9_VIDEO_ENCODE) { { MFX_CODEC_VP9 }, { // .primary = { // .ctor = [](VideoCORE *core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { return new MfxHwVP9Encode::MFXVideoENCODEVP9_HW(core, mfxRes); }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { return MfxHwVP9Encode::MFXVideoENCODEVP9_HW::Query(session->m_pCORE.get(), in, out); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return MfxHwVP9Encode::MFXVideoENCODEVP9_HW::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return MfxHwVP9Encode::MFXVideoENCODEVP9_HW::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_VP9_VIDEO_ENCODE #if defined(MFX_ENABLE_AV1_VIDEO_ENCODE) { { MFX_CODEC_AV1 }, { // .primary = { // .ctor = [](VideoCORE* core, mfxU16 /*codecProfile*/, mfxStatus *mfxRes) -> VideoENCODE* { if (core && mfxRes) return AV1EHW::Create(*core, *mfxRes); return nullptr; }, // .query = [](mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { return AV1EHW::Query(session->m_pCORE.get(), in, out); }, // .queryIOSurf = [](mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { return AV1EHW::QueryIOSurf(session->m_pCORE.get(), par, request); } // .QueryImplsDescription = , [](VideoCORE& core, mfxEncoderDescription::encoder& caps, mfx::PODArraysHolder& ah) { return AV1EHW::QueryImplsDescription(core, caps, ah); } }, // .fallback = { } } }, #endif // MFX_ENABLE_AV1_VIDEO_ENCODE }; // codecId2Handlers template<> VideoENCODE* _mfxSession::Create(mfxVideoParam& par) { VideoCORE* core = m_pCORE.get(); mfxU32 CodecId = par.mfx.CodecId; mfxStatus mfxRes = MFX_ERR_MEMORY_ALLOC; std::unique_ptr pENCODE; { // create a codec instance auto handler = codecId2Handlers.find(CodecKey(CodecId)); if (handler == codecId2Handlers.end()) { return nullptr; } const EHandlers::CtorType& ctor = m_bIsHWENCSupport ? handler->second.primary.ctor : handler->second.fallback.ctor; if (!ctor) { return nullptr; } pENCODE.reset(ctor(core, par.mfx.CodecProfile, &mfxRes)); // check error(s) if (MFX_ERR_NONE != MFX_STS_TRACE(mfxRes)) { return nullptr; } } return pENCODE.release(); } // VideoENCODE *CreateENCODESpecificClass(mfxU32 CodecId, VideoCORE *core) mfxStatus MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); MFX_LOG_API_TRACE("----------------MFXVideoENCODE_Query----------------\n"); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(out, MFX_ERR_NULL_PTR); #if !defined(ANDROID) if ((0 != in) && (MFX_HW_VAAPI == session->m_pCORE->GetVAType())) { // protected content not supported on Linux if(0 != in->Protected) { out->Protected = 0; return MFX_ERR_UNSUPPORTED; } } #endif mfxStatus mfxRes = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_ENCODE_QUERY_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, in ? in->mfx.FrameInfo.Width : 0, in ? in->mfx.FrameInfo.Height : 0, in ? in->mfx.CodecId : 0, in ? in->mfx.TargetUsage : 0, in ? in->mfx.LowPower : 0)); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", in); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", out); bool bIsHWENCSupport = false; try { { CodecId2Handlers::const_iterator handler; handler = codecId2Handlers.find(CodecKey(out->mfx.CodecId)); mfxRes = handler == codecId2Handlers.end() ? MFX_ERR_UNSUPPORTED : (handler->second.primary.query)(session, in, out); if (MFX_ERR_UNSUPPORTED != mfxRes) { bIsHWENCSupport = true; } } } // handle error(s) catch(...) { mfxRes = MFX_ERR_NULL_PTR; } if (MFX_PLATFORM_HARDWARE == session->m_currentPlatform && !bIsHWENCSupport && MFX_ERR_NONE <= mfxRes) { mfxRes = MFX_ERR_UNSUPPORTED; } if (mfxRes == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM || mfxRes == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) { try { mfx_reflect::AccessibleTypesCollection g_Reflection = GetReflection(); if (g_Reflection.m_bIsInitialized) { std::string result = mfx_reflect::CompareStructsToString(g_Reflection.Access(in), g_Reflection.Access(out)); MFX_LTRACE_MSG(MFX_TRACE_LEVEL_INTERNAL, result.c_str()) } } catch (const std::exception& e) { MFX_LTRACE_MSG(MFX_TRACE_LEVEL_INTERNAL, e.what()); } catch (...) { MFX_LTRACE_MSG(MFX_TRACE_LEVEL_INTERNAL, "Unknown exception was caught while comparing In and Out VideoParams."); } } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", in); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", out); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); MFX_LOG_API_TRACE("----------------MFXVideoENCODE_QueryIOSurf----------------\n"); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_CHECK(request, MFX_ERR_NULL_PTR); mfxStatus mfxRes = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_ENCODE_QUERY_IOSURF_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, par->mfx.CodecId, par->mfx.TargetUsage, par->mfx.LowPower)); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", par); bool bIsHWENCSupport = false; try { { CodecId2Handlers::const_iterator handler; handler = codecId2Handlers.find(CodecKey(par->mfx.CodecId)); mfxRes = handler == codecId2Handlers.end() ? MFX_ERR_INVALID_VIDEO_PARAM : (handler->second.primary.queryIOSurf)(session, par, request); if (MFX_ERR_UNSUPPORTED != mfxRes) { bIsHWENCSupport = true; } } } // handle error(s) catch(...) { mfxRes = MFX_ERR_UNKNOWN; } if (MFX_PLATFORM_HARDWARE == session->m_currentPlatform && !bIsHWENCSupport && MFX_ERR_NONE <= mfxRes) { mfxRes = MFX_ERR_INVALID_VIDEO_PARAM; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", request); MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } static mfxStatus SetupCache(mfxSession session, const mfxVideoParam& par) { // No internal alloc if Ext Allocator set if (session->m_pCORE->IsExternalFrameAllocator()) return MFX_ERR_NONE; mfxU16 memory_type = mfxU16(par.IOPattern == MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET); auto& pCache = session->m_pENCODE->m_pSurfaceCache; if (!pCache) { auto base_core_vpl = dynamic_cast(session->m_pCORE.get()); MFX_CHECK_HDL(base_core_vpl); std::unique_ptr scoped_cache_ptr(SurfaceCache::Create(*base_core_vpl, memory_type, par.mfx.FrameInfo)); using cache_controller = surface_cache_controller; using TCachePtr = std::remove_reference::type; pCache = TCachePtr(new cache_controller(scoped_cache_ptr.get(), ComponentType::ENCODE), std::default_delete()); scoped_cache_ptr.release(); } // Setup cache limits MFX_SAFE_CALL(pCache->SetupCache(session, par)); return MFX_ERR_NONE; } mfxStatus MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); InitMfxLogging(); MFX_LOG_API_TRACE("----------------MFXVideoENCODE_Init----------------\n"); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", par); TRACE_EVENT(MFX_TRACE_API_ENCODE_INIT_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, par->mfx.CodecId, par->mfx.TargetUsage, par->mfx.LowPower)); try { // check existence of component if (!session->m_pENCODE) { // create a new instance session->m_bIsHWENCSupport = true; session->m_pENCODE.reset(session->Create(*par)); MFX_CHECK(session->m_pENCODE.get(), MFX_ERR_INVALID_VIDEO_PARAM); } mfxRes = session->m_pENCODE->Init(par); if (MFX_ERR_UNSUPPORTED == mfxRes) { session->m_bIsHWENCSupport = false; mfxRes = MFX_ERR_INVALID_VIDEO_PARAM; } else if (mfxRes >= MFX_ERR_NONE) session->m_bIsHWENCSupport = true; if (MFX_PLATFORM_HARDWARE == session->m_currentPlatform && !session->m_bIsHWENCSupport && MFX_ERR_NONE <= mfxRes) { mfxRes = MFX_ERR_INVALID_VIDEO_PARAM; } if (mfxRes >= MFX_ERR_NONE && SupportsVPLFeatureSet(*session->m_pCORE.get())) { MFX_SAFE_CALL(SetupCache(session, *par)); } } // handle std::exception(s) catch (const std::exception & ex) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; #if defined(_DEBUG) printf("EHW Exception: %s\n", ex.what()); fflush(stdout); #else std::ignore = ex; #endif } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } mfxStatus MFXVideoENCODE_Close(mfxSession session) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); mfxStatus mfxRes = MFX_ERR_NONE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); TRACE_EVENT(MFX_TRACE_API_ENCODE_CLOSE_TASK, EVENT_TYPE_INFO, 0, make_event_data(session)); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(session->m_pENCODE, MFX_ERR_NOT_INITIALIZED); try { // wait until all tasks are processed std::ignore = MFX_STS_TRACE(session->m_pScheduler->WaitForAllTasksCompletion(session->m_pENCODE.get())); mfxRes = session->m_pENCODE->Close(); session->m_pENCODE.reset(nullptr); } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } static mfxStatus MFXVideoENCODELegacyRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { (void)callNumber; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "EncodeFrame"); VideoENCODE *pENCODE = (VideoENCODE *) pState; MFX_THREAD_TASK_PARAMETERS *pTaskParam = (MFX_THREAD_TASK_PARAMETERS *) pParam; mfxStatus mfxRes; // check error(s) if ((NULL == pState) || (NULL == pParam) || (0 != threadNumber)) { return MFX_ERR_NULL_PTR; } // call the obsolete method mfxRes = pENCODE->EncodeFrame(pTaskParam->encode.ctrl, &pTaskParam->encode.internal_params, pTaskParam->encode.surface, pTaskParam->encode.bs); return mfxRes; } // mfxStatus MFXVideoENCODELegacyRoutine(void *pState, void *pParam, enum { MFX_NUM_ENTRY_POINTS = 2 }; mfxStatus MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); TRACE_EVENT(MFX_TRACE_API_ENCODE_FRAME_ASYNC_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, surface)); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", ctrl); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "In: ", surface); MFX_CHECK_HDL(session); MFX_CHECK(session->m_pENCODE.get(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK(syncp, MFX_ERR_NULL_PTR); try { if (surface && session->m_pENCODE->m_pSurfaceCache) { MFX_SAFE_CALL(session->m_pENCODE->m_pSurfaceCache->Update(*surface)); } { mfxSyncPoint syncPoint = NULL; mfxFrameSurface1* reordered_surface = NULL; mfxEncodeInternalParams internal_params; MFX_ENTRY_POINT entryPoints[MFX_NUM_ENTRY_POINTS]; mfxU32 numEntryPoints = MFX_NUM_ENTRY_POINTS; memset(&entryPoints, 0, sizeof(entryPoints)); mfxRes = session->m_pENCODE->EncodeFrameCheck(ctrl, surface, bs, &reordered_surface, &internal_params, entryPoints, numEntryPoints); // source data is OK, go forward if ((MFX_ERR_NONE == mfxRes) || (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxRes) || (MFX_WRN_OUT_OF_RANGE == mfxRes) || // WHAT IS IT??? IT SHOULD BE REMOVED ((mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) || (MFX_ERR_MORE_BITSTREAM == mfxRes)) { // prepare the obsolete kind of task. // it is obsolete and must be removed. if (NULL == entryPoints[0].pRoutine) { MFX_TASK task; memset(&task, 0, sizeof(task)); // BEGIN OF OBSOLETE PART task.bObsoleteTask = true; task.obsolete_params.encode.internal_params = internal_params; // fill task info task.pOwner = session->m_pENCODE.get(); task.entryPoint.pRoutine = &MFXVideoENCODELegacyRoutine; task.entryPoint.pState = session->m_pENCODE.get(); task.entryPoint.requiredNumThreads = 1; // fill legacy parameters task.obsolete_params.encode.ctrl = ctrl; task.obsolete_params.encode.surface = reordered_surface; task.obsolete_params.encode.bs = bs; // END OF OBSOLETE PART task.priority = session->m_priority; task.threadingPolicy = session->m_pENCODE->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = surface; task.pDst[0] = ((mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) ? 0 : bs; task.pSrc[1] = bs; task.pSrc[2] = ctrl ? ctrl->ExtParam : 0; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_ENCODE; #endif // MFX_TRACE_ENABLE // register input and call the task PERF_UTILITY_SET_ASYNC_TASK_ID(task.nTaskId); MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } else if (1 == numEntryPoints) { MFX_TASK task; memset(&task, 0, sizeof(task)); task.pOwner = session->m_pENCODE.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = session->m_pENCODE->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = surface; task.pSrc[1] = bs; task.pSrc[2] = ctrl ? ctrl->ExtParam : 0; task.pDst[0] = ((mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) ? 0 : bs; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_ENCODE; #endif // register input and call the task PERF_UTILITY_SET_ASYNC_TASK_ID(task.nTaskId); MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } else { MFX_TASK task; memset(&task, 0, sizeof(task)); task.pOwner = session->m_pENCODE.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = session->m_pENCODE->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = surface; task.pSrc[1] = ctrl ? ctrl->ExtParam : 0; task.pDst[0] = entryPoints[0].pParam; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_ENCODE; #endif // register input and call the task PERF_UTILITY_SET_ASYNC_TASK_ID(task.nTaskId); MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); memset(&task, 0, sizeof(task)); task.pOwner = session->m_pENCODE.get(); task.entryPoint = entryPoints[1]; task.priority = session->m_priority; task.threadingPolicy = session->m_pENCODE->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = entryPoints[0].pParam; task.pDst[0] = ((mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) ? 0 : bs; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_ENCODE2; #endif // register input and call the task PERF_UTILITY_SET_ASYNC_TASK_ID(task.nTaskId); MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } // IT SHOULD BE REMOVED if ((mfxStatus)MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) { mfxRes = MFX_ERR_MORE_DATA; syncPoint = NULL; } } // return pointer to synchronization point *syncp = syncPoint; } } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_API_PARAMS, "Out: ", bs); if (mfxRes == MFX_ERR_NONE && syncp) { MFX_LTRACE_P(MFX_TRACE_LEVEL_API, *syncp); } MFX_LTRACE_I(MFX_TRACE_LEVEL_API, mfxRes); return mfxRes; } // mfxStatus MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) mfxStatus MFXMemory_GetSurfaceForEncode(mfxSession session, mfxFrameSurface1** output_surf) { PERF_UTILITY_AUTO(__FUNCTION__, PERF_LEVEL_API); MFX_CHECK_NULL_PTR1(output_surf); MFX_CHECK_HDL(session); MFX_CHECK(session->m_pENCODE, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(session->m_pENCODE->m_pSurfaceCache, MFX_ERR_NOT_INITIALIZED); try { MFX_RETURN((*session->m_pENCODE->m_pSurfaceCache)->GetSurface(*output_surf)); } catch (...) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } } mfxStatus QueryImplsDescription(VideoCORE& core, mfxEncoderDescription& caps, mfx::PODArraysHolder& ah) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); for (auto& c : codecId2Handlers) { if (!c.second.primary.QueryImplsDescription) continue; mfxEncoderDescription::encoder enc = {}; enc.CodecID = c.first.codecId; if (MFX_ERR_NONE != c.second.primary.QueryImplsDescription(core, enc, ah)) continue; ah.PushBack(caps.Codecs) = enc; ++caps.NumCodecs; } return MFX_ERR_NONE; } // // THE OTHER ENCODE FUNCTIONS HAVE IMPLICIT IMPLEMENTATION // FUNCTION_RESET_IMPL(ENCODE, Reset, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(ENCODE, GetVideoParam, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(ENCODE, GetEncodeStat, (mfxSession session, mfxEncodeStat *stat), (stat)) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_functions.cpp000066400000000000000000000024221443134507600310410ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #define MFX_API_FUNCTION_IMPL(NAME, RTYPE, ARGS_DECL, ARGS)\ RTYPE APIImpl_##NAME ARGS_DECL;\ RTYPE NAME ARGS_DECL { return APIImpl_##NAME ARGS; } #include "mfx_functions.h"oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_pak.cpp000066400000000000000000000042041443134507600276040ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfxstructures-int.h" #define FUNCTION_DEPRECATED_IMPL(component, func_name, formal_param_list) \ mfxStatus APIImpl_MFXVideo##component##_##func_name formal_param_list \ { \ return MFX_ERR_UNSUPPORTED; \ } FUNCTION_DEPRECATED_IMPL(PAK, QueryIOSurf, (mfxSession /*session*/, mfxVideoParam * /*par*/, mfxFrameAllocRequest * /*request*/)) FUNCTION_DEPRECATED_IMPL(PAK, Init, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(PAK, Close, (mfxSession /*session*/)) FUNCTION_DEPRECATED_IMPL(PAK, Reset, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(PAK, Query, (mfxSession /*session*/, mfxVideoParam * /*in*/, mfxVideoParam * /*out*/)) FUNCTION_DEPRECATED_IMPL(PAK, GetVideoParam, (mfxSession /*session*/, mfxVideoParam * /*par*/)) FUNCTION_DEPRECATED_IMPL(PAK, ProcessFrameAsync, (mfxSession /*session*/, mfxPAKInput * /*in*/, mfxPAKOutput * /*out*/, mfxSyncPoint * /*syncp*/)) #undef FUNCTION_DEPRECATED_IMPL oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_plugin.cpp000066400000000000000000000052341443134507600303330ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include #include const mfxPluginUID NativePlugins[] = { MFX_PLUGINID_HEVCD_HW, MFX_PLUGINID_VP8D_HW, MFX_PLUGINID_VP9D_HW, MFX_PLUGINID_HEVCE_HW, MFX_PLUGINID_VP9E_HW, MFX_PLUGINID_HEVC_FEI_ENCODE }; #include "mfxstructures-int.h" #define FUNCTION_DEPRECATED_IMPL(component, func_name, formal_param_list) \ mfxStatus APIImpl_MFXVideo##component##_##func_name formal_param_list \ { \ return MFX_ERR_UNSUPPORTED; \ } FUNCTION_DEPRECATED_IMPL(USER, Unregister, (mfxSession /*session*/, mfxU32 /*type*/)) FUNCTION_DEPRECATED_IMPL(USER, ProcessFrameAsync, (mfxSession /*session*/, const mfxHDL * /*in*/, mfxU32 /*in_num*/, const mfxHDL * /*out*/, mfxU32 /*out_num*/, mfxSyncPoint * /*syncp*/)) FUNCTION_DEPRECATED_IMPL(USER, GetPlugin, (mfxSession /*session*/, mfxU32 /*type*/, mfxPlugin * /*par*/)) #undef FUNCTION_DEPRECATED_IMPL mfxStatus MFXVideoUSER_Register(mfxSession session, mfxU32 /*type*/, const mfxPlugin *par) { mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK_NULL_PTR1(par); MFX_CHECK_NULL_PTR1(par->GetPluginParam); //check is this plugin was included into MSDK lib as a native component mfxPluginParam pluginParam = {}; mfxRes = par->GetPluginParam(par->pthis, &pluginParam); MFX_CHECK_STS(mfxRes); if (std::find(std::begin(NativePlugins), std::end(NativePlugins), pluginParam.PluginUID) != std::end(NativePlugins)) { return MFX_ERR_NONE; } return MFX_ERR_UNSUPPORTED; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_query.cpp000066400000000000000000000052651443134507600302060ustar00rootroot00000000000000// Copyright (c) 2007-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); mfxIMPL currentImpl; // check error(s) if (0 == session) { return MFX_ERR_INVALID_HANDLE; } if (0 == impl) { return MFX_ERR_NULL_PTR; } // set the library's type if (0 == session->m_adapterNum || session->m_adapterNum >= 4) { currentImpl = MFX_IMPL_HARDWARE; } else { currentImpl = (mfxIMPL) (MFX_IMPL_HARDWARE2 + (session->m_adapterNum - 1)); } currentImpl |= session->m_implInterface; // save the current implementation type *impl = currentImpl; MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "Out: impl = ", MFX_TRACE_FORMAT_D, *impl); return MFX_ERR_NONE; } // mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl) mfxStatus MFXQueryVersion(mfxSession session, mfxVersion *pVersion) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); if (0 == session) { return MFX_ERR_INVALID_HANDLE; } if (0 == pVersion) { return MFX_ERR_NULL_PTR; } // set the library's version *pVersion = session->m_versionToReport; MFX_TRACE_2("Out: MFX_API version = ", "%d.%d", pVersion->Major, pVersion->Minor); return MFX_ERR_NONE; } // mfxStatus MFXQueryVersion(mfxSession session, mfxVersion *pVersion) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_session.cpp000066400000000000000000000210311443134507600305110ustar00rootroot00000000000000// Copyright (c) 2007-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include mfxStatus MFXJoinSession(mfxSession session, mfxSession child_session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(child_session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(child_session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); try { MFXIUnknown* pInt = session->m_pScheduler; // check if the child session has its own children if (child_session->IsParentSession()) { return MFX_ERR_UNSUPPORTED; } // release the child scheduler mfxRes = child_session->ReleaseScheduler(); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } // join the parent scheduler child_session->m_pScheduler = QueryInterface (pInt, MFXIScheduler_GUID); if (NULL == child_session->m_pScheduler) { session->RestoreScheduler(); return MFX_ERR_INVALID_HANDLE; } mfxRes = session->m_pOperatorCore->AddCore(child_session->m_pCORE.get()); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } child_session->m_pOperatorCore = session->m_pOperatorCore; return MFX_ERR_NONE; } catch(...) { return MFX_ERR_UNKNOWN; } } mfxStatus MFXDisjoinSession(mfxSession session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); try { // check if the session has its own children. // only true child session can be disjoined. if (session->IsParentSession()) { return MFX_ERR_UNDEFINED_BEHAVIOR; } // detach all tasks from the scheduler session->m_pScheduler->WaitForAllTasksCompletion(session->m_pENCODE.get()); session->m_pScheduler->WaitForAllTasksCompletion(session->m_pDECODE.get()); session->m_pScheduler->WaitForAllTasksCompletion(session->m_pVPP.get()); // remove child core from parent core operator session->m_pOperatorCore->RemoveCore(session->m_pCORE.get()); // create new self core operator session->m_pOperatorCore = new OperatorCORE(session->m_pCORE.get()); // leave the scheduler session->m_pScheduler->Release(); session->m_pScheduler = NULL; // join the original scheduler mfxRes = session->RestoreScheduler(); return mfxRes; } catch(...) { return MFX_ERR_UNKNOWN; } } mfxStatus MFXCloneSession(mfxSession session, mfxSession *clone) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_CHECK_HDL(session); MFX_CHECK_NULL_PTR1(clone); auto pSessionInt = (_mfxSession*)session; if (pSessionInt->m_versionToReport.Major > 1) { mfxInitializationParam par = {}; par.AccelerationMode = MFX_ACCEL_MODE_VIA_VAAPI ; par.VendorImplID = pSessionInt->m_adapterNum; MFX_SAFE_CALL(MFXInitialize(par, clone)); } else { mfxInitParam par = {}; par.Implementation = MFX_IMPL_HARDWARE + pSessionInt->m_implInterface + (MFX_IMPL_HARDWARE_ANY + pSessionInt->m_adapterNum); MFX_SAFE_CALL(MFXInitEx(par, clone)); } mfx::OnExit closeOnExit([clone] { std::ignore = MFXClose(*clone); *clone = nullptr; }); MFX_SAFE_CALL(MFXJoinSession(session, *clone)); closeOnExit = []{}; return MFX_ERR_NONE; } // mfxStatus MFXCloneSession(mfxSession session, mfxSession *clone) enum { MFX_PRIORITY_STOP_HW_LISTENING = 0x100, MFX_PRIORITY_START_HW_LISTENING = 0x101 }; mfxStatus MFXSetPriority(mfxSession session, mfxPriority priority) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); // check error(s) if (((MFX_PRIORITY_LOW > priority) || (MFX_PRIORITY_HIGH < priority)) && (MFX_PRIORITY_STOP_HW_LISTENING != static_cast(priority)) && (MFX_PRIORITY_START_HW_LISTENING != static_cast(priority))) { return MFX_ERR_UNSUPPORTED; } MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); try { // set the new priority value if ((MFX_PRIORITY_LOW <= priority) && (MFX_PRIORITY_HIGH >= priority)) { session->m_priority = priority; } // adjust scheduler performance else { switch ((int) priority) { case MFX_PRIORITY_STOP_HW_LISTENING: session->m_pScheduler->AdjustPerformance(MFX_SCHEDULER_STOP_HW_LISTENING); break; case MFX_PRIORITY_START_HW_LISTENING: session->m_pScheduler->AdjustPerformance(MFX_SCHEDULER_START_HW_LISTENING); break; default: break; } } return MFX_ERR_NONE; } catch(...) { return MFX_ERR_UNKNOWN; } } mfxStatus MFXGetPriority(mfxSession session, mfxPriority *priority) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(priority, MFX_ERR_NULL_PTR); // set the new priority value *priority = session->m_priority; return MFX_ERR_NONE; } mfxStatus MFXInternalPseudoJoinSession(mfxSession session, mfxSession child_session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(child_session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(child_session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); try { // release the child scheduler mfxRes = child_session->ReleaseScheduler(); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } child_session->m_pScheduler = session->m_pScheduler; child_session->m_pCORE = session->m_pCORE; child_session->m_pOperatorCore = session->m_pOperatorCore; return MFX_ERR_NONE; } catch(...) { return MFX_ERR_UNKNOWN; } } mfxStatus MFXInternalPseudoDisjoinSession(mfxSession session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); mfxStatus mfxRes; MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); try { // detach all tasks from the scheduler session->m_pScheduler->WaitForAllTasksCompletion(session->m_pENCODE.get()); session->m_pScheduler->WaitForAllTasksCompletion(session->m_pDECODE.get()); session->m_pScheduler->WaitForAllTasksCompletion(session->m_pVPP.get()); // create new self core operator // restore original operator core. session->m_pOperatorCore = new OperatorCORE(session->m_pCORE.get()); // just zeroing pointer to external scheduler (it will be released in external session close) session->m_pScheduler = NULL; mfxRes = session->RestoreScheduler(); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } // core will released automatically return MFX_ERR_NONE; } catch(...) { return MFX_ERR_UNKNOWN; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/libmfxsw_vpp.cpp000066400000000000000000000461741443134507600276520ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include // sheduling and threading stuff #include #include #ifdef MFX_ENABLE_VPP // VPP include files here #include "mfx_vpp_main.h" // this VideoVPP class builds VPP pipeline and run the VPP pipeline #include "mfx_vpp_hw.h" #endif template<> VideoVPP* _mfxSession::Create(mfxVideoParam& /*par*/) { VideoVPP *pVPP = nullptr; #ifdef MFX_ENABLE_VPP VideoCORE* core = m_pCORE.get(); mfxStatus mfxRes = MFX_ERR_MEMORY_ALLOC; pVPP = new VideoVPPMain(core, &mfxRes); if (MFX_ERR_NONE != mfxRes) { delete pVPP; pVPP = nullptr; } #endif // MFX_ENABLE_VPP return pVPP; } mfxStatus MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out) { MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", in); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(out, MFX_ERR_NULL_PTR); mfxStatus mfxRes = MFX_ERR_UNSUPPORTED; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_Query"); TRACE_EVENT(MFX_TRACE_API_VPP_QUERY_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, in ? in->mfx.FrameInfo.Width : 0, in ? in->mfx.FrameInfo.Height : 0, in ? in->mfx.CodecId : 0, out->mfx.FrameInfo.Width, out->mfx.FrameInfo.Height, out->mfx.CodecId)); if ((0 != in) && (MFX_HW_VAAPI == session->m_pCORE->GetVAType())) { // protected content not supported on Linux if(0 != in->Protected) { out->Protected = 0; return MFX_ERR_UNSUPPORTED; } } try { #ifdef MFX_ENABLE_VPP mfxRes = VideoVPPMain::Query(session->m_pCORE.get(), in, out); #endif // MFX_ENABLE_VPP } // handle error(s) catch(...) { mfxRes = MFX_ERR_NULL_PTR; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "Out: ", out); MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } mfxStatus MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request) { MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", par); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_CHECK(request, MFX_ERR_NULL_PTR); mfxStatus mfxRes = MFX_ERR_UNSUPPORTED; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_QueryIOSurf"); TRACE_EVENT(MFX_TRACE_API_VPP_QUERY_IOSURF_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, par->mfx.CodecId)); try { #ifdef MFX_ENABLE_VPP mfxRes = VideoVPPMain::QueryIOSurf(session->m_pCORE.get(), par, request/*, session->m_adapterNum*/); #endif // MFX_ENABLE_VPP } // handle error(s) catch(...) { mfxRes = MFX_ERR_NULL_PTR; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "Out: ", request); MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } static mfxStatus SetupCache(mfxSession session, const mfxVideoParam& par) { // No internal alloc if Ext Allocator set if (session->m_pCORE->IsExternalFrameAllocator()) return MFX_ERR_NONE; auto CacheInitRoutine = [session, &par](mfxVPPPoolType pool_type) { bool input_pool = pool_type == MFX_VPP_POOL_IN; auto& pCache = input_pool ? session->m_pVPP->m_pSurfaceCacheIn : session->m_pVPP->m_pSurfaceCacheOut; if (!pCache) { auto base_core_vpl = dynamic_cast(session->m_pCORE.get()); MFX_CHECK_HDL(base_core_vpl); mfxU16 memory_type = input_pool ? mfxU16(par.IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET) : mfxU16(par.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET); const mfxFrameInfo& frame_info = input_pool ? par.vpp.In : par.vpp.Out; std::unique_ptr scoped_cache_ptr(SurfaceCache::Create(*base_core_vpl, memory_type, frame_info)); using cache_controller = surface_cache_controller; using TCachePtr = std::remove_reference::type; pCache = TCachePtr(new cache_controller(scoped_cache_ptr.get(), ComponentType::VPP, pool_type), std::default_delete()); scoped_cache_ptr.release(); } // Setup cache limits MFX_SAFE_CALL(pCache->SetupCache(session, par)); return MFX_ERR_NONE; }; MFX_SAFE_CALL(CacheInitRoutine(MFX_VPP_POOL_IN)); MFX_SAFE_CALL(CacheInitRoutine(MFX_VPP_POOL_OUT)); return MFX_ERR_NONE; } mfxStatus MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par) { mfxStatus mfxRes = MFX_ERR_UNSUPPORTED; MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", par); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(par, MFX_ERR_NULL_PTR); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_Init"); TRACE_EVENT(MFX_TRACE_API_VPP_INIT_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, par->mfx.FrameInfo.Width, par->mfx.FrameInfo.Height, par->mfx.CodecId)); try { #ifdef MFX_ENABLE_VPP // close the existing video processor, // if it is initialized. if (session->m_pVPP.get()) { MFXVideoVPP_Close(session); } // create a new instance session->m_pVPP.reset(session->Create(*par)); MFX_CHECK(session->m_pVPP.get(), MFX_ERR_INVALID_VIDEO_PARAM); mfxRes = session->m_pVPP->Init(par); if (mfxRes >= MFX_ERR_NONE && SupportsVPLFeatureSet(*session->m_pCORE.get())) { MFX_SAFE_CALL(SetupCache(session, *par)); } #endif // MFX_ENABLE_VPP } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } mfxStatus MFXVideoVPP_Close(mfxSession session) { mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_Close"); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pScheduler, MFX_ERR_NOT_INITIALIZED); TRACE_EVENT(MFX_TRACE_API_VPP_CLOSE_TASK, EVENT_TYPE_INFO, 0, make_event_data(session)); try { MFX_CHECK(session->m_pVPP, MFX_ERR_NOT_INITIALIZED); // wait until all tasks are processed session->m_pScheduler->WaitForAllTasksCompletion(session->m_pVPP.get()); mfxRes = session->m_pVPP->Close(); session->m_pVPP.reset(nullptr); } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } static mfxStatus MFXVideoVPPLegacyRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { (void)callNumber; mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPPLegacyRoutine"); TRACE_EVENT(MFX_TRACE_API_VPP_LEGACY_ROUTINE_TASK, EVENT_TYPE_INFO, 0, make_event_data(threadNumber, callNumber)); VideoVPP *pVPP = (VideoVPP *) pState; MFX_THREAD_TASK_PARAMETERS *pTaskParam = (MFX_THREAD_TASK_PARAMETERS *) pParam; // check error(s) if ((NULL == pState) || (NULL == pParam) || (0 != threadNumber)) { return MFX_ERR_NULL_PTR; } // call the obsolete method mfxRes = pVPP->RunFrameVPP(pTaskParam->vpp.in, pTaskParam->vpp.out, pTaskParam->vpp.aux); return mfxRes; } // mfxStatus MFXVideoVPPLegacyRoutine(void *pState, void *pParam, enum { MFX_NUM_ENTRY_POINTS = 2 }; mfxStatus MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_RunFrameVPPAsync"); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", aux); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", in); TRACE_EVENT(MFX_TRACE_API_VPP_RUN_FRAME_VPP_ASYNC_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, in, out)); MFX_CHECK_HDL(session); MFX_CHECK(session->m_pVPP, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(syncp, MFX_ERR_NULL_PTR); try { if (in && session->m_pVPP->m_pSurfaceCacheIn) { MFX_SAFE_CALL(session->m_pVPP->m_pSurfaceCacheIn->Update(*in)); } if (out && session->m_pVPP->m_pSurfaceCacheOut) { MFX_SAFE_CALL(session->m_pVPP->m_pSurfaceCacheOut->Update(*out)); } mfxSyncPoint syncPoint = NULL; MFX_ENTRY_POINT entryPoints[MFX_NUM_ENTRY_POINTS]; mfxU32 numEntryPoints = MFX_NUM_ENTRY_POINTS; memset(&entryPoints, 0, sizeof(entryPoints)); mfxRes = session->m_pVPP->VppFrameCheck(in, out, aux, entryPoints, numEntryPoints); // source data is OK, go forward if ((MFX_ERR_NONE == mfxRes) || (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) || (MFX_ERR_MORE_SURFACE == mfxRes) || (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxRes)) { // prepare the obsolete kind of task. // it is obsolete and must be removed. if (NULL == entryPoints[0].pRoutine) { MFX_TASK task; memset(&task, 0, sizeof(task)); // BEGIN OF OBSOLETE PART task.bObsoleteTask = true; // fill task info task.pOwner = session->m_pVPP.get(); task.entryPoint.pRoutine = &MFXVideoVPPLegacyRoutine; task.entryPoint.pState = session->m_pVPP.get(); task.entryPoint.requiredNumThreads = 1; // fill legacy parameters task.obsolete_params.vpp.in = in; task.obsolete_params.vpp.out = out; task.obsolete_params.vpp.aux = aux; // END OF OBSOLETE PART task.priority = session->m_priority; task.threadingPolicy = session->m_pVPP->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = in; task.pDst[0] = out; if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) task.pDst[0] = NULL; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; #endif // MFX_TRACE_ENABLE // register input and call the task MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } else if (1 == numEntryPoints) { MFX_TASK task; memset(&task, 0, sizeof(task)); task.pOwner = session->m_pVPP.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = session->m_pVPP->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = in; task.pDst[0] = out; if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) task.pDst[0] = NULL; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; #endif // register input and call the task MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } else { MFX_TASK task; memset(&task, 0, sizeof(task)); task.pOwner = session->m_pVPP.get(); task.entryPoint = entryPoints[0]; task.priority = session->m_priority; task.threadingPolicy = session->m_pVPP->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = in; task.pDst[0] = entryPoints[0].pParam; #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP; #endif // register input and call the task MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); memset(&task, 0, sizeof(task)); task.pOwner = session->m_pVPP.get(); task.entryPoint = entryPoints[1]; task.priority = session->m_priority; task.threadingPolicy = session->m_pVPP->GetThreadingPolicy(); // fill dependencies task.pSrc[0] = entryPoints[0].pParam; task.pDst[0] = out; task.pDst[1] = aux; if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) { task.pDst[0] = NULL; task.pDst[1] = NULL; } #ifdef MFX_TRACE_ENABLE task.nParentId = MFX_AUTO_TRACE_GETID(); task.nTaskId = MFX::CreateUniqId() + MFX_TRACE_ID_VPP2; #endif // register input and call the task MFX_CHECK_STS(session->m_pScheduler->AddTask(task, &syncPoint)); } if (MFX_ERR_MORE_DATA_SUBMIT_TASK == mfxRes) { mfxRes = MFX_ERR_MORE_DATA; syncPoint = NULL; } if (syncPoint && out && out->FrameInterface && !session->m_pCORE->IsExternalFrameAllocator()) { MFX_CHECK_HDL(out->FrameInterface->Context); static_cast(out->FrameInterface->Context)->SetSyncPoint(syncPoint); } } // return pointer to synchronization point *syncp = syncPoint; } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "Out: ", out); if (mfxRes == MFX_ERR_NONE && syncp) { MFX_LTRACE_P(MFX_TRACE_LEVEL_PARAMS, *syncp); } MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } // mfxStatus MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) mfxStatus MFXVideoVPP_RunFrameVPPAsyncEx(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { (void)in; (void)surface_work; (void)surface_out; mfxStatus mfxRes; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "MFXVideoVPP_RunFrameVPPAsyncEx") TRACE_EVENT(MFX_TRACE_API_VPP_RUN_FRAME_VPP_ASYNC_EX_TASK, EVENT_TYPE_INFO, 0, make_event_data(session, in, surface_work)); MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "In: ", in) MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pVPP.get(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK(syncp, MFX_ERR_NULL_PTR); try { //MediaSDK's VPP should not work through Ex function return MFX_ERR_UNDEFINED_BEHAVIOR; } // handle error(s) catch(...) { // set the default error value mfxRes = MFX_ERR_UNKNOWN; } MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL_PARAMS, "Out: ", surface_work); if (mfxRes == MFX_ERR_NONE && syncp) { MFX_LTRACE_P(MFX_TRACE_LEVEL_PARAMS, *syncp); } MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, mfxRes); return mfxRes; } // mfxStatus MFXVideoVPP_RunFrameVPPAsyncEx(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task); #define FUNCTION_GET_SURFACE_IMPL_VPP(FUNCTION_NAME, TYPE) \ mfxStatus FUNCTION_NAME##TYPE (mfxSession session, mfxFrameSurface1** output_surf) \ { \ MFX_CHECK_NULL_PTR1(output_surf); \ MFX_CHECK_HDL(session); \ MFX_CHECK(session->m_pCORE.get(), MFX_ERR_NOT_INITIALIZED); \ MFX_CHECK(session->m_pVPP, MFX_ERR_NOT_INITIALIZED); \ MFX_CHECK(session->m_pVPP->m_pSurfaceCache##TYPE, MFX_ERR_NOT_INITIALIZED); \ \ return (*session->m_pVPP->m_pSurfaceCache##TYPE )->GetSurface(*output_surf); \ } FUNCTION_GET_SURFACE_IMPL_VPP(MFXMemory_GetSurfaceForVPP, In) FUNCTION_GET_SURFACE_IMPL_VPP(MFXMemory_GetSurfaceForVPP, Out) #undef FUNCTION_GET_SURFACE_IMPL_VPP mfxStatus MFXVideoVPP_ProcessFrameAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 **out) { MFX_CHECK_NULL_PTR1(out); MFX_CHECK_HDL(session); MFX_CHECK(session->m_pVPP, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(session->m_pVPP->m_pSurfaceCacheOut, MFX_ERR_NOT_INITIALIZED); mfxFrameSurface1* surf; MFX_SAFE_CALL((*session->m_pVPP->m_pSurfaceCacheOut)->GetSurface(surf)); surface_refcount_scoped_lock surf_out(surf); MFX_CHECK(surf_out, MFX_ERR_MEMORY_ALLOC); mfxSyncPoint syncPoint; mfxStatus mfxRes = MFXVideoVPP_RunFrameVPPAsync(session, in, surf_out.get(), nullptr, &syncPoint); // If output is not available then release out_surf (which should mark it as free) and return status MFX_CHECK(syncPoint, mfxRes); *out = surf_out.release(); return mfxRes; } // // THE OTHER VPP FUNCTIONS HAVE IMPLICIT IMPLEMENTATION // FUNCTION_RESET_IMPL(VPP, Reset, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(VPP, GetVideoParam, (mfxSession session, mfxVideoParam *par), (par)) FUNCTION_IMPL(VPP, GetVPPStat, (mfxSession session, mfxVPPStat *stat), (stat)) mfxStatus QueryImplsDescription(VideoCORE& core, mfxVPPDescription& caps, mfx::PODArraysHolder& arrayHolder) { return MfxHwVideoProcessing::VideoVPPHW::QueryImplsDescription(&core, caps, arrayHolder); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_brc_common.cpp000066400000000000000000002417771443134507600301300ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_brc_common.h" #include "mfx_enc_common.h" #include #include #if defined(MFX_ENABLE_VIDEO_BRC_COMMON) mfxStatus ConvertVideoParam_Brc(const mfxVideoParam *parMFX, UMC::VideoBrcParams *parUMC) { MFX_CHECK_COND(parMFX != NULL); MFX_CHECK_COND((parMFX->mfx.FrameInfo.CropX + parMFX->mfx.FrameInfo.CropW) <= parMFX->mfx.FrameInfo.Width); MFX_CHECK_COND((parMFX->mfx.FrameInfo.CropY + parMFX->mfx.FrameInfo.CropH) <= parMFX->mfx.FrameInfo.Height); switch (parMFX->mfx.RateControlMethod) { case MFX_RATECONTROL_CBR: parUMC->BRCMode = UMC::BRC_CBR; break; case MFX_RATECONTROL_AVBR: parUMC->BRCMode = UMC::BRC_AVBR; break; default: case MFX_RATECONTROL_VBR: parUMC->BRCMode = UMC::BRC_VBR; break; } mfxU16 brcParamMultiplier = parMFX->mfx.BRCParamMultiplier ? parMFX->mfx.BRCParamMultiplier : 1; parUMC->targetBitrate = parMFX->mfx.TargetKbps * brcParamMultiplier * BRC_BITS_IN_KBIT; if (parUMC->BRCMode == UMC::BRC_AVBR) { parUMC->accuracy = parMFX->mfx.Accuracy; parUMC->convergence = parMFX->mfx.Convergence; parUMC->HRDBufferSizeBytes = 0; parUMC->HRDInitialDelayBytes = 0; parUMC->maxBitrate = parMFX->mfx.TargetKbps * brcParamMultiplier * BRC_BITS_IN_KBIT; } else { parUMC->maxBitrate = parMFX->mfx.MaxKbps * brcParamMultiplier * BRC_BITS_IN_KBIT; parUMC->HRDBufferSizeBytes = parMFX->mfx.BufferSizeInKB * brcParamMultiplier * BRC_BYTES_IN_KBYTE; parUMC->HRDInitialDelayBytes = parMFX->mfx.InitialDelayInKB * brcParamMultiplier * BRC_BYTES_IN_KBYTE; } parUMC->info.clip_info.width = parMFX->mfx.FrameInfo.Width; parUMC->info.clip_info.height = parMFX->mfx.FrameInfo.Height; parUMC->GOPPicSize = parMFX->mfx.GopPicSize; parUMC->GOPRefDist = parMFX->mfx.GopRefDist; parUMC->info.framerate = CalculateUMCFramerate(parMFX->mfx.FrameInfo.FrameRateExtN, parMFX->mfx.FrameInfo.FrameRateExtD); parUMC->frameRateExtD = parMFX->mfx.FrameInfo.FrameRateExtD; parUMC->frameRateExtN = parMFX->mfx.FrameInfo.FrameRateExtN; if (parUMC->info.framerate <= 0) { parUMC->info.framerate = 30; parUMC->frameRateExtD = 1; parUMC->frameRateExtN = 30; } return MFX_ERR_NONE; } #endif #if defined(MFX_ENABLE_EXT_BRC) namespace MfxHwH265EncodeBRC { #define IS_IFRAME(pictype) ((pictype == MFX_FRAMETYPE_I || pictype == MFX_FRAMETYPE_IDR) ? MFX_FRAMETYPE_I: 0) #define MAX_DQP_LTR 4 #define MAX_MODEL_ERR 6 #define BRC_BUFK(verylowdelay) (verylowdelay? 4.0 : 2.5) #define SCH_BUFK(verylowdelay) (verylowdelay? 6.0 : 3.5) #define LTR_BUFK(verylowdelay) (verylowdelay? 8.0: 4.5) #define LTR_BUF(type, dqp, boost, schg, shstrt, verylowdelay) \ ((type == MFX_FRAMETYPE_IDR) ? (((schg && !boost) || !dqp) ? BRC_BUFK(verylowdelay) : LTR_BUFK(verylowdelay)) : (shstrt ? SCH_BUFK(verylowdelay) : BRC_BUFK(verylowdelay))) #define DQFF0 1.0 #define DQFF1 1.66 #define DQF(type, dqp, boost, schg) \ ((type == MFX_FRAMETYPE_IDR) ? ((dqp?pow(2, ((mfxF64)dqp / 6.0)) : 1.0) * ((schg && !boost) ? DQFF0 : DQFF1)) : 1.0) #define FRM_RATIO(type, encorder, shstrt, pyr) \ ((((encorder == 0 && !pyr) || type == MFX_FRAMETYPE_I) ? 6.0 : (shstrt || type == MFX_FRAMETYPE_IDR) ? 8.0 : 4.0) * ((pyr) ? 1.5 : 1.0)) #define BRC_CONST_MUL_P1 2.253264596 #define BRC_CONST_EXP_R_P1 0.42406423 #define ltrprintf(...) //#define ltrprintf printf #define BRC_SCENE_CHANGE_RATIO1 20.0 #define BRC_SCENE_CHANGE_RATIO2 5.0 static mfxU32 hevcBitRateScale(mfxU32 bitrate) { mfxU32 bit_rate_scale = 0; while (bit_rate_scale < 16 && (bitrate & ((1 << (6 + bit_rate_scale + 1)) - 1)) == 0) bit_rate_scale++; return bit_rate_scale; } static mfxU32 hevcCbpSizeScale(mfxU32 cpbSize) { mfxU32 cpb_size_scale = 2; while (cpb_size_scale < 16 && (cpbSize & ((1 << (4 + cpb_size_scale + 1)) - 1)) == 0) cpb_size_scale++; return cpb_size_scale; } const mfxU32 h264_h265_au_cpb_removal_delay_length_minus1 = 23; const mfxU32 h264_bit_rate_scale = 4; const mfxU32 h264_cpb_size_scale = 2; mfxExtBuffer* Hevc_GetExtBuffer(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id) { if (extBuf != 0) { for (mfxU16 i = 0; i < numExtBuf; i++) { if (extBuf[i] != 0 && extBuf[i]->BufferId == id) // assuming aligned buffers return (extBuf[i]); } } return 0; } mfxI32 GetRawFrameSize(mfxU32 lumaSize, mfxU16 chromaFormat, mfxU16 bitDepthLuma) { mfxI32 frameSize = lumaSize; if (chromaFormat == MFX_CHROMAFORMAT_YUV420) frameSize += lumaSize / 2; else if (chromaFormat == MFX_CHROMAFORMAT_YUV422) frameSize += lumaSize; else if (chromaFormat == MFX_CHROMAFORMAT_YUV444) frameSize += lumaSize * 2; frameSize = frameSize * bitDepthLuma / 8; return frameSize * 8; //frame size in bits } mfxStatus cBRCParams::Init(mfxVideoParam* par, bool bField) { MFX_CHECK_NULL_PTR1(par); MFX_CHECK(par->mfx.RateControlMethod == MFX_RATECONTROL_CBR || par->mfx.RateControlMethod == MFX_RATECONTROL_VBR, MFX_ERR_UNDEFINED_BEHAVIOR); bFieldMode = bField; codecId = par->mfx.CodecId; mfxU32 k = par->mfx.BRCParamMultiplier == 0 ? 1: par->mfx.BRCParamMultiplier; targetbps = k*par->mfx.TargetKbps * 1000; maxbps = k*par->mfx.MaxKbps * 1000; maxbps = (par->mfx.RateControlMethod == MFX_RATECONTROL_CBR) ? targetbps : ((maxbps >= targetbps) ? maxbps : targetbps); mfxU32 bit_rate_scale = (par->mfx.CodecId == MFX_CODEC_AVC) ? h264_bit_rate_scale : hevcBitRateScale(maxbps); mfxU32 cpb_size_scale = (par->mfx.CodecId == MFX_CODEC_AVC) ? h264_cpb_size_scale : hevcCbpSizeScale(maxbps); rateControlMethod = par->mfx.RateControlMethod; maxbps = ((maxbps >> (6 + bit_rate_scale)) << (6 + bit_rate_scale)); mfxExtCodingOption * pExtCO = (mfxExtCodingOption*)Hevc_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION); HRDConformance = MFX_BRC_NO_HRD; if (pExtCO) { if (!IsOff(pExtCO->NalHrdConformance) && !IsOff(pExtCO->VuiNalHrdParameters)) HRDConformance = MFX_BRC_HRD_STRONG; else if (IsOn(pExtCO->NalHrdConformance) && IsOff(pExtCO->VuiNalHrdParameters)) HRDConformance = MFX_BRC_HRD_WEAK; } bufferSizeInBytes = (k*par->mfx.BufferSizeInKB*1000); // Bitstream size is Buffer size if specified if (HRDConformance != MFX_BRC_NO_HRD) { bufferSizeInBytes = ((k*par->mfx.BufferSizeInKB*1000) >> (cpb_size_scale + 1)) << (cpb_size_scale + 1); initialDelayInBytes =((k*par->mfx.InitialDelayInKB*1000) >> (cpb_size_scale + 1)) << (cpb_size_scale + 1); bRec = 1; bPanic = (HRDConformance == MFX_BRC_HRD_STRONG) ? 1 : 0; } MFX_CHECK (par->mfx.FrameInfo.FrameRateExtD != 0 && par->mfx.FrameInfo.FrameRateExtN != 0, MFX_ERR_UNDEFINED_BEHAVIOR); frameRate = (mfxF64)par->mfx.FrameInfo.FrameRateExtN / (mfxF64)par->mfx.FrameInfo.FrameRateExtD; width = par->mfx.FrameInfo.Width; height =par->mfx.FrameInfo.Height; chromaFormat = par->mfx.FrameInfo.ChromaFormat == 0 ? MFX_CHROMAFORMAT_YUV420 : par->mfx.FrameInfo.ChromaFormat ; bitDepthLuma = par->mfx.FrameInfo.BitDepthLuma == 0 ? 8 : par->mfx.FrameInfo.BitDepthLuma; mfxI32 bitdepthOffset = (6 * (bitDepthLuma - 8)); quantOffset = IsOn(par->mfx.LowPower) ? 0 : bitdepthOffset; inputBitsPerFrame = targetbps / frameRate; maxInputBitsPerFrame = maxbps / frameRate; gopPicSize = par->mfx.GopPicSize*(bFieldMode ? 2 : 1); gopRefDist = par->mfx.GopRefDist*(bFieldMode ? 2 : 1); mfxExtCodingOption2 * pExtCO2 = (mfxExtCodingOption2*)Hevc_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION2); bPyr = (pExtCO2 && pExtCO2->BRefType == MFX_B_REF_PYRAMID); maxFrameSizeInBits = pExtCO2 ? pExtCO2->MaxFrameSize*8 : 0; fAbPeriodLong = 120; if (gopRefDist <= 3) { fAbPeriodShort = 6; } else { fAbPeriodShort = 16; } dqAbPeriod = 120; bAbPeriod = 120; if (maxFrameSizeInBits) { bRec = 1; bPanic = 1; } mfxI32 minQPI = 1; mfxI32 maxQPI = IsOn(par->mfx.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minQPP = 1; mfxI32 maxQPP = IsOn(par->mfx.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minQPB = 1; mfxI32 maxQPB = IsOn(par->mfx.LowPower) ? 51 : (51 + bitdepthOffset); mfxI32 minmaxOffset = IsOn(par->mfx.LowPower) ? bitdepthOffset : 0; if (pExtCO2 && pExtCO2->MaxQPI <= maxQPI && pExtCO2->MaxQPI > pExtCO2->MinQPI && pExtCO2->MinQPI >= minQPI && pExtCO2->MaxQPP <= maxQPP && pExtCO2->MaxQPP > pExtCO2->MinQPP && pExtCO2->MinQPP >= minQPP && pExtCO2->MaxQPB <= maxQPB && pExtCO2->MaxQPB > pExtCO2->MinQPB && pExtCO2->MinQPB >= minQPB) { quantMaxI = pExtCO2->MaxQPI - minmaxOffset; quantMinI = pExtCO2->MinQPI - minmaxOffset; quantMaxP = pExtCO2->MaxQPP - minmaxOffset; quantMinP = pExtCO2->MinQPP - minmaxOffset; quantMaxB = pExtCO2->MaxQPB - minmaxOffset; quantMinB = pExtCO2->MinQPB - minmaxOffset; } else { quantMaxI = quantMaxP = quantMaxB = maxQPB; quantMinI = quantMinP = quantMinB = 1; } mfxExtCodingOption3 * pExtCO3 = (mfxExtCodingOption3*)Hevc_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_CODING_OPTION3); if (pExtCO3) { WinBRCMaxAvgKbps = static_cast(pExtCO3->WinBRCMaxAvgKbps * k); WinBRCSize = pExtCO3->WinBRCSize; } mRawFrameSizeInBits = GetRawFrameSize(width * height, chromaFormat, IsOn(par->mfx.LowPower) ? 8 : bitDepthLuma); mRawFrameSizeInPixs = mRawFrameSizeInBits / (IsOn(par->mfx.LowPower) ? 8 : bitDepthLuma); iDQp0 = 0; mNumRefsInGop = (mfxU32)(std::max(1.0, (!bPyr ? (mfxF64)gopPicSize / (mfxF64)gopRefDist : (mfxF64)gopPicSize / 2.0))); mfxF64 maxFrameRatio = 1.5874 * FRM_RATIO(MFX_FRAMETYPE_IDR, 0, 0, bPyr); mIntraBoost = (mNumRefsInGop > maxFrameRatio * 8.0) ? 1 : 0; mVeryLowDelay = (HRDConformance != MFX_BRC_NO_HRD && (bufferSizeInBytes * 8.0) / targetbps < 0.12) ? 1 : 0; mfxF64 maxFrameSize = mRawFrameSizeInBits; if (maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, maxFrameSizeInBits); } if (HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufOccupy = LTR_BUF(MFX_FRAMETYPE_IDR, 1, mIntraBoost, 1, 0, mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, bufOccupy / 9.* (initialDelayInBytes * 8.0) + (9.0 - bufOccupy) / 9.*inputBitsPerFrame); } mfxF64 minFrameRatio = FRM_RATIO(MFX_FRAMETYPE_IDR, 0, 0, bPyr); maxFrameRatio = std::min({maxFrameRatio, maxFrameSize / inputBitsPerFrame, mfxF64(mNumRefsInGop)}); mfxF64 dqp = std::max(0.0, 6.0 * (log(maxFrameRatio / minFrameRatio) / log(2.0))); iDQp0 = (mfxU32)(dqp + 0.5); if (iDQp0 < 1) iDQp0 = 1; if (iDQp0 > MAX_DQP_LTR) iDQp0 = MAX_DQP_LTR; // MaxFrameSize violation prevention mMinQstepCmplxKP = BRC_CONST_MUL_P1; mMinQstepRateEP = BRC_CONST_EXP_R_P1; mMinQstepCmplxKPUpdt = 0; mMinQstepCmplxKPUpdtErr = 0.16; mMBBRC = pExtCO3 && IsOn(pExtCO3->EnableMBQP); return MFX_ERR_NONE; } mfxStatus cBRCParams::GetBRCResetType(mfxVideoParam* par, bool bNewSequence, bool &bBRCReset, bool &bSlidingWindowReset) { bBRCReset = false; bSlidingWindowReset = false; if (bNewSequence) return MFX_ERR_NONE; cBRCParams new_par; mfxStatus sts = new_par.Init(par); MFX_CHECK_STS(sts); MFX_CHECK(new_par.rateControlMethod == rateControlMethod, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) ; MFX_CHECK(new_par.HRDConformance == HRDConformance, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) ; MFX_CHECK(new_par.frameRate == frameRate, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.width == width, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.height == height, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.chromaFormat == chromaFormat, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.bitDepthLuma == bitDepthLuma, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); if (HRDConformance == MFX_BRC_HRD_STRONG) { MFX_CHECK(new_par.bufferSizeInBytes == bufferSizeInBytes, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.initialDelayInBytes == initialDelayInBytes, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.targetbps == targetbps, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(new_par.maxbps == maxbps, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } else if (new_par.targetbps != targetbps || new_par.maxbps != maxbps) { bBRCReset = true; } if (new_par.WinBRCMaxAvgKbps != WinBRCMaxAvgKbps) { bBRCReset = true; bSlidingWindowReset = true; } if (new_par.maxFrameSizeInBits != maxFrameSizeInBits) bBRCReset = true; if (new_par.gopPicSize != gopPicSize) bBRCReset = true; if (new_par.gopRefDist != gopRefDist) bBRCReset = true; if (new_par.bPyr != bPyr) bBRCReset = true; if (new_par.quantMaxI != quantMaxI) bBRCReset = true; if (new_par.quantMinI != quantMinI) bBRCReset = true; if (new_par.quantMaxP != quantMaxP) bBRCReset = true; if (new_par.quantMinP != quantMinP) bBRCReset = true; if (new_par.quantMaxB != quantMaxB) bBRCReset = true; if (new_par.quantMinB != quantMinB) bBRCReset = true; return MFX_ERR_NONE; } enum { MFX_BRC_RECODE_NONE = 0, MFX_BRC_RECODE_QP = 1, MFX_BRC_RECODE_PANIC = 2, }; mfxF64 const QSTEP[88] = { 0.630, 0.707, 0.794, 0.891, 1.000, 1.122, 1.260, 1.414, 1.587, 1.782, 2.000, 2.245, 2.520, 2.828, 3.175, 3.564, 4.000, 4.490, 5.040, 5.657, 6.350, 7.127, 8.000, 8.980, 10.079, 11.314, 12.699, 14.254, 16.000, 17.959, 20.159, 22.627, 25.398, 28.509, 32.000, 35.919, 40.317, 45.255, 50.797, 57.018, 64.000, 71.838, 80.635, 90.510, 101.594, 114.035, 128.000, 143.675, 161.270, 181.019, 203.187, 228.070, 256.000, 287.350, 322.540, 362.039, 406.375, 456.140, 512.000, 574.701, 645.080, 724.077, 812.749, 912.280, 1024.000, 1149.401, 1290.159, 1448.155, 1625.499, 1824.561, 2048.000, 2298.802, 2580.318, 2896.309, 3250.997, 3649.121, 4096.000, 4597.605, 5160.637, 5792.619, 6501.995, 7298.242, 8192.000, 9195.209, 10321.273, 11585.238, 13003.989, 14596.485 }; mfxI32 QStep2QpFloor(mfxF64 qstep, mfxI32 qpoffset = 0) // QSTEP[qp] <= qstep, return 0<=qp<=51+mQuantOffset { Ipp8u qp = Ipp8u(std::upper_bound(QSTEP, QSTEP + 51 + qpoffset, qstep) - QSTEP); return qp > 0 ? qp - 1 : 0; } mfxI32 Qstep2QP(mfxF64 qstep, mfxI32 qpoffset = 0) // return 0<=qp<=51+mQuantOffset { mfxI32 qp = QStep2QpFloor(qstep, qpoffset); // prevent going QSTEP index out of bounds if (qp >= (mfxI32)(sizeof(QSTEP)/sizeof(QSTEP[0])) - 1) return 0; return (qp == 51 + qpoffset || qstep < (QSTEP[qp] + QSTEP[qp + 1]) / 2) ? qp : qp + 1; } mfxF64 QP2Qstep(mfxI32 qp, mfxI32 qpoffset = 0) { return QSTEP[std::min(51 + qpoffset, qp)]; } mfxI32 GetNewQP(mfxF64 totalFrameBits, mfxF64 targetFrameSizeInBits, mfxI32 minQP , mfxI32 maxQP, mfxI32 qp , mfxI32 qp_offset, mfxF64 f_pow, bool bStrict = false, bool bLim = true) { mfxF64 qstep = 0, qstep_new = 0; mfxI32 qp_new = qp; qstep = QP2Qstep(qp, qp_offset); qstep_new = qstep * pow(totalFrameBits / targetFrameSizeInBits, f_pow); qp_new = Qstep2QP(qstep_new, qp_offset); if (totalFrameBits < targetFrameSizeInBits) // overflow { if (qp <= minQP) { return qp; // QP change is impossible } if (bLim) qp_new = std::max(qp_new, (minQP + qp + 1) >> 1); if (bStrict) qp_new = std::min(qp_new, qp - 1); } else // underflow { if (qp >= maxQP) { return qp; // QP change is impossible } if (bLim) qp_new = std::min(qp_new, (maxQP + qp + 1) >> 1); if (bStrict) qp_new = std::max(qp_new, qp + 1); } return mfx::clamp(qp_new, minQP, maxQP); } // Get QP Offset for given frame and Adaptive Pyramid QP class // level = Pyramid level or Layer for 8GOP Pyramid, value [1-3] // isRef = zero for non-reference frame // clsAPQ = Adaptive Pyramid QP class, value [0-1] // ----------------------------------- // Offset Table // clsAPQ | level1 level2 level3 // ----------------------------------- // | ref nref ref nref ref nref // 0 | 0 1 1 2 2 3 // 1 | 2 2 3 3 5 5 // ----------------------------------- // QP Offset is realtive QuantB. // QuantB = QuantP+1 // clsAPQ=0, can be for used non 8GOP and/or non Pyramid cases. mfxI32 GetOffsetAPQ(mfxI32 level, mfxU16 isRef, mfxU16 clsAPQ) { mfxI32 qp = 0; level = std::max(mfxI32(1), std::min(mfxI32(3), level)); if (clsAPQ == 1) { switch (level) { case 3: qp += 2; case 2: qp += 0; case 1: default: qp += 3; break; } } else { qp += (level > 0 ? level - 1 : 0); if (level && !isRef) qp += 1; } return qp; } // Set all Base QPs (IDR/I/P/B) from given QP for frame of type, level, iRef, and Adaptive Pyramid QP class (clsAPQ). void SetQPParams(mfxI32 qp, mfxU32 type, BRC_Ctx &ctx, mfxU32 /* rec_num */, mfxI32 minQuant, mfxI32 maxQuant, mfxU32 level, mfxU32 iDQp, mfxU16 isRef, mfxU16 clsAPQ) { if (type == MFX_FRAMETYPE_IDR) { ctx.QuantIDR = qp; ctx.QuantI = qp + iDQp; ctx.QuantP = qp + 1 + iDQp; ctx.QuantB = qp + 2 + iDQp; } else if (type == MFX_FRAMETYPE_I) { ctx.QuantIDR = qp - iDQp; ctx.QuantI = qp; ctx.QuantP = qp + 1; ctx.QuantB = qp + 2; } else if (type == MFX_FRAMETYPE_P) { qp -= level; ctx.QuantIDR = qp - 1 - iDQp; ctx.QuantI = qp - 1; ctx.QuantP = qp; ctx.QuantB = qp + 1; } else if (type == MFX_FRAMETYPE_B) { qp -= GetOffsetAPQ(level, isRef, clsAPQ); ctx.QuantIDR = qp - 2 - iDQp; ctx.QuantI = qp - 2; ctx.QuantP = qp - 1; ctx.QuantB = qp; } ctx.QuantIDR = mfx::clamp(ctx.QuantIDR, minQuant, maxQuant); ctx.QuantI = mfx::clamp(ctx.QuantI, minQuant, maxQuant); ctx.QuantP = mfx::clamp(ctx.QuantP, minQuant, maxQuant); ctx.QuantB = mfx::clamp(ctx.QuantB, minQuant, maxQuant); //printf("ctx.QuantIDR %d, QuantI %d, ctx.QuantP %d, ctx.QuantB %d, level %d\n", ctx.QuantIDR, ctx.QuantI, ctx.QuantP, ctx.QuantB, level); } void UpdateQPParams(mfxI32 qp, mfxU32 type , BRC_Ctx &ctx, mfxU32 rec_num, mfxI32 minQuant, mfxI32 maxQuant, mfxU32 level, mfxU32 iDQp, mfxU16 isRef, mfxU16 clsAPQ) { ctx.Quant = qp; if (ctx.LastIQpSetOrder > ctx.encOrder) return; SetQPParams(qp, type, ctx, rec_num, minQuant, maxQuant, level, iDQp, isRef, clsAPQ); } bool isFieldMode(mfxVideoParam *par) { return ((par->mfx.CodecId == MFX_CODEC_HEVC) && !(par->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE)); } mfxStatus ExtBRC::Init (mfxVideoParam* par) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(!m_bInit, MFX_ERR_UNDEFINED_BEHAVIOR); sts = m_par.Init(par, isFieldMode(par)); MFX_CHECK_STS(sts); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { if (m_par.codecId == MFX_CODEC_AVC) m_hrdSpec.reset(new H264_HRD()); else m_hrdSpec.reset(new HEVC_HRD()); m_hrdSpec->Init(m_par); } memset(&m_ctx, 0, sizeof(m_ctx)); m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; mfxI32 rawSize = GetRawFrameSize(m_par.width * m_par.height ,m_par.chromaFormat, m_par.quantOffset ? m_par.bitDepthLuma : 8); mfxI32 qp = GetNewQP(rawSize, m_par.inputBitsPerFrame, m_par.quantMinI, m_par.quantMaxI, 1 , m_par.quantOffset, 0.5, false, false); UpdateQPParams(qp,MFX_FRAMETYPE_IDR , m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, MFX_FRAMETYPE_REF, 0); m_ctx.dQuantAb = qp > 0 ? 1./qp : 1.0; //kw if (m_par.WinBRCSize) { m_avg.reset(new AVGBitrate(m_par.WinBRCSize, (mfxU32)(m_par.WinBRCMaxAvgKbps*1000.0/m_par.frameRate), (mfxU32)m_par.inputBitsPerFrame) ); MFX_CHECK_NULL_PTR1(m_avg.get()); } if (m_par.mMBBRC) { mfxU32 size = par->AsyncDepth > 1 ? 2 : 1; mfxU16 blSize = 16; mfxU32 wInBlk = (par->mfx.FrameInfo.Width + blSize - 1) / blSize; mfxU32 hInBlk = (par->mfx.FrameInfo.Height + blSize - 1) / blSize; m_MBQPBuff.resize(size*wInBlk*hInBlk); m_MBQP.resize(size); m_ExtBuff.resize(size); for (mfxU32 i = 0; i < size; i++) { m_MBQP[i].Header.BufferId = MFX_EXTBUFF_MBQP; m_MBQP[i].Header.BufferSz = sizeof(mfxExtMBQP); m_MBQP[i].BlockSize = blSize; m_MBQP[i].NumQPAlloc = wInBlk * hInBlk; m_MBQP[i].Mode = MFX_MBQP_MODE_QP_VALUE; m_MBQP[i].QP = &(m_MBQPBuff[i*wInBlk * hInBlk]); m_ExtBuff[i] = (mfxExtBuffer*)&(m_MBQP[i]); } } m_bInit = true; return sts; } mfxU16 GetFrameType(mfxU16 m_frameType, mfxU16 level, mfxU16 gopRegDist) { if (m_frameType & MFX_FRAMETYPE_IDR) return MFX_FRAMETYPE_IDR; else if (m_frameType & MFX_FRAMETYPE_I) return MFX_FRAMETYPE_I; else if (m_frameType & MFX_FRAMETYPE_P) return MFX_FRAMETYPE_P; else if ((m_frameType & MFX_FRAMETYPE_REF) && (level == 0 || gopRegDist == 1)) return MFX_FRAMETYPE_P; //low delay B else return MFX_FRAMETYPE_B; } bool isFrameBeforeIntra (mfxU32 order, mfxU32 intraOrder, mfxU32 gopPicSize, mfxU32 gopRefDist) { mfxI32 distance0 = gopPicSize*3/4; mfxI32 distance1 = gopPicSize - gopRefDist*3; return (order - intraOrder) > (mfxU32)(std::max(distance0, distance1)); } mfxStatus SetRecodeParams(mfxU16 brcStatus, mfxI32 qp, mfxI32 qp_new, mfxI32 minQP, mfxI32 maxQP, BRC_Ctx &ctx, mfxBRCFrameStatus* status) { ctx.bToRecode = 1; if (brcStatus == MFX_BRC_BIG_FRAME || brcStatus == MFX_BRC_PANIC_BIG_FRAME ) { MFX_CHECK(qp_new >= qp, MFX_ERR_UNDEFINED_BEHAVIOR); ctx.Quant = qp_new; ctx.QuantMax = maxQP; if (brcStatus == MFX_BRC_BIG_FRAME && qp_new > qp) { ctx.QuantMin = std::max(qp + 1, minQP); //limit QP range for recoding status->BRCStatus = MFX_BRC_BIG_FRAME; } else { ctx.QuantMin = minQP; ctx.bPanic = 1; status->BRCStatus = MFX_BRC_PANIC_BIG_FRAME; } } else if (brcStatus == MFX_BRC_SMALL_FRAME || brcStatus == MFX_BRC_PANIC_SMALL_FRAME) { MFX_CHECK(qp_new <= qp, MFX_ERR_UNDEFINED_BEHAVIOR); ctx.Quant = qp_new; ctx.QuantMin = minQP; //limit QP range for recoding if (brcStatus == MFX_BRC_SMALL_FRAME && qp_new < qp) { ctx.QuantMax = std::min(qp - 1, maxQP); status->BRCStatus = MFX_BRC_SMALL_FRAME; } else { ctx.QuantMax = maxQP; status->BRCStatus = MFX_BRC_PANIC_SMALL_FRAME; ctx.bPanic = 1; } } //printf("recode %d, qp %d new %d, status %d\n", ctx.encOrder, qp, qp_new, status->BRCStatus); return MFX_ERR_NONE; } mfxI32 GetNewQPTotal(mfxF64 bo, mfxF64 dQP, mfxI32 minQP , mfxI32 maxQP, mfxI32 qp, bool bPyr, bool bSC) { mfxU8 mode = (!bPyr) ; bo = mfx::clamp(bo, -1.0, 1.0); dQP = mfx::clamp(dQP, 1./maxQP, 1./minQP); mfxF64 ndQP = dQP + (1. / maxQP - dQP) * bo; ndQP = mfx::clamp(ndQP, 1. / maxQP, 1. / minQP); mfxI32 quant_new = (mfxI32) (1. / ndQP + 0.5); //printf(" GetNewQPTotal: bo %f, quant %d, quant_new %d, mode %d\n", bo, qp, quant_new, mode); if (!bSC) { if (mode == 0) // low: qp_diff [-2; 2] { if (quant_new >= qp + 5) quant_new = qp + 2; else if (quant_new > qp + 1) quant_new = qp + 1; else if (quant_new <= qp - 5) quant_new = qp - 2; else if (quant_new < qp - 1) quant_new = qp - 1; } else // (mode == 1) midle: qp_diff [-3; 3] { if (quant_new >= qp + 5) quant_new = qp + 3; else if (quant_new > qp + 2) quant_new = qp + 2; else if (quant_new <= qp - 5) quant_new = qp - 3; else if (quant_new < qp - 2) quant_new = qp - 2; } } else { quant_new = mfx::clamp(quant_new, qp - 5, qp + 5); } return mfx::clamp(quant_new, minQP, maxQP); } // Reduce AB period before intra and increase it after intra (to avoid intra frame affect on the bottom of hrd) mfxF64 GetAbPeriodCoeff (mfxU32 numInGop, mfxU32 gopPicSize, mfxU32 SC) { const mfxU32 maxForCorrection = 30; mfxF64 maxValue = (SC) ? 1.3 : 1.5; const mfxF64 minValue = 1.0; mfxU32 numForCorrection = std::min (gopPicSize /2, maxForCorrection); mfxF64 k[maxForCorrection] = {0}; if (numInGop >= gopPicSize || gopPicSize < 2) return 1.0; for (mfxU32 i = 0; i < numForCorrection; i ++) { k[i] = maxValue - (maxValue - minValue)*i/numForCorrection; } if (numInGop < gopPicSize/2) { return k [numInGop < numForCorrection ? numInGop : numForCorrection - 1]; } else { mfxU32 n = gopPicSize - 1 - numInGop; return 1.0/ k[n < numForCorrection ? n : numForCorrection - 1]; } } void ResetMinQForMaxFrameSize(cBRCParams* par, mfxU32 type) { if (type == MFX_FRAMETYPE_IDR || type == MFX_FRAMETYPE_I || type == MFX_FRAMETYPE_P) { par->mMinQstepCmplxKPUpdt = 0; par->mMinQstepCmplxKPUpdtErr = 0.16; par->mMinQstepCmplxKP = BRC_CONST_MUL_P1; par->mMinQstepRateEP = BRC_CONST_EXP_R_P1; } } mfxI32 GetMinQForMaxFrameSize(cBRCParams* par, mfxF64 targetBits, mfxU32 type) { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_P) { if (par->mMinQstepCmplxKPUpdt > 2 && par->mMinQstepCmplxKPUpdtErr < 0.69) { mfxI32 rawSize = par->mRawFrameSizeInPixs; mfxF64 BitsDesiredFrame = targetBits * (1.0 - 0.165 - std::min(0.115, par->mMinQstepCmplxKPUpdtErr/3.0)); mfxF64 R = (mfxF64)rawSize / BitsDesiredFrame; mfxF64 QstepScale = pow(R, par->mMinQstepRateEP) * par->mMinQstepCmplxKP; QstepScale = std::min(128.0, QstepScale); mfxF64 minqp = 6.0*log(QstepScale) / log(2.0) + 12.0; minqp = std::max(0.0, minqp); qp = (mfxU32)(minqp + 0.5); qp = mfx::clamp(qp, 1, 51); } } return qp; } void UpdateMinQForMaxFrameSize(cBRCParams* par, mfxI32 bits, mfxI32 qp, BRC_Ctx *ctx, mfxU32 type, bool shstrt, mfxU16 brcSts) { if (IS_IFRAME(type)) { mfxI32 rawSize = par->mRawFrameSizeInPixs; mfxF64 R = (mfxF64)rawSize / (mfxF64)bits; mfxF64 QstepScaleComputed = pow(R, par->mMinQstepRateEP) * par->mMinQstepCmplxKP; mfxF64 QstepScaleReal = pow(2.0, ((mfxF64)qp - 12.0) / 6.0); if (QstepScaleComputed > QstepScaleReal) { // Next P Frame atleast as complex as I Frame mfxF64 dS = log(QstepScaleReal) - log(QstepScaleComputed); par->mMinQstepCmplxKPUpdtErr = std::max((par->mMinQstepCmplxKPUpdtErr + abs(dS)) / 2, abs(dS)); mfxF64 upDlt = 0.5; dS = mfx::clamp(dS, -0.5, 1.0); par->mMinQstepCmplxKP = par->mMinQstepCmplxKP*(1.0 + upDlt*dS); //par->mMinQstepCmplxKPUpdt++; par->mMinQstepRateEP = mfx::clamp(par->mMinQstepRateEP + mfx::clamp(0.01 * (log(QstepScaleReal) - log(QstepScaleComputed))*log(R), -0.1, 0.2), 0.125, 1.0); // Sanity Check / Force if (qp < 50) { mfxF64 rateQstepNew = pow(R, par->mMinQstepRateEP); mfxF64 QstepScaleUpdtComputed = rateQstepNew * par->mMinQstepCmplxKP; mfxI32 qp_now = (mfxI32)(6.0*log(QstepScaleUpdtComputed) / log(2.0) + 12.0); if (qp < qp_now -1) { qp_now = qp + 2; QstepScaleUpdtComputed = pow(2.0, ((mfxF64)qp_now - 12.0) / 6.0); par->mMinQstepCmplxKP = QstepScaleUpdtComputed / rateQstepNew; par->mMinQstepCmplxKPUpdtErr = 0.16; } } } } else if (type == MFX_FRAMETYPE_P) { if (ctx->LastIQpSetOrder < ctx->encOrder) { mfxI32 rawSize = par->mRawFrameSizeInPixs; mfxF64 R = (mfxF64)rawSize / (mfxF64)bits; mfxF64 QstepScaleComputed = pow(R, par->mMinQstepRateEP) * par->mMinQstepCmplxKP; mfxF64 QstepScaleReal = pow(2.0, ((mfxF64)qp - 12.0) / 6.0); mfxF64 dS = log(QstepScaleReal) - log(QstepScaleComputed); par->mMinQstepCmplxKPUpdtErr = std::max((par->mMinQstepCmplxKPUpdtErr + abs(dS)) / 2, abs(dS)); mfxF64 upDlt = mfx::clamp(1.3042 * pow(R, -0.922), 0.025, 0.5); if (shstrt || par->mMinQstepCmplxKPUpdt <= 2 || par->mMinQstepCmplxKPUpdtErr > 0.69) upDlt = 0.5; else if (brcSts != MFX_BRC_OK || par->mMinQstepCmplxKPUpdtErr > 0.41) upDlt = std::max(0.125, upDlt); dS = mfx::clamp(dS, -0.5, 1.0); par->mMinQstepCmplxKP = par->mMinQstepCmplxKP*(1.0 + upDlt*dS); par->mMinQstepCmplxKPUpdt++; par->mMinQstepRateEP = mfx::clamp(par->mMinQstepRateEP + mfx::clamp(0.01 * (log(QstepScaleReal) - log(QstepScaleComputed))*log(R), -0.1, 0.2), 0.125, 1.0); } } } // Get QP for current frame mfxI32 ExtBRC::GetCurQP (mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ) { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_IDR) { qp = m_ctx.QuantIDR; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_I) { qp = m_ctx.QuantI; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_P) { qp = m_ctx.QuantP + layer; qp = mfx::clamp(qp, m_par.quantMinP, m_par.quantMaxP); } else { qp = m_ctx.QuantB; qp += GetOffsetAPQ(layer, isRef, clsAPQ); qp = mfx::clamp(qp, m_par.quantMinB, m_par.quantMaxB); } //printf("GetCurQP IDR %d I %d P %d B %d, min %d max %d type %d \n", m_ctx.QuantIDR, m_ctx.QuantI, m_ctx.QuantP, m_ctx.QuantB, m_par.quantMinI, m_par.quantMaxI, type); return qp; } mfxF64 ExtBRC::ResetQuantAb(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxF64 fAbLong, mfxU32 eo, bool bIdr, mfxU16 clsAPQ) { mfxI32 seqQP_new = GetSeqQP(qp, type, layer, isRef, clsAPQ); mfxF64 dQuantAb_new = 1.0 / seqQP_new; mfxF64 bAbPreriod = m_par.bAbPeriod; mfxF64 totDev = m_ctx.totalDeviation; mfxF64 HRDDevFactor = 0.0; mfxF64 maxFrameSizeHrd = 0.0; mfxF64 HRDDev = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { HRDDevFactor = m_hrdSpec->GetBufferDeviationFactor(eo); HRDDev = m_hrdSpec->GetBufferDeviation(eo); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(eo, bIdr); } mfxF64 lf = 1.0 / pow(m_par.inputBitsPerFrame / fAbLong, 1.0 + HRDDevFactor); if (m_par.HRDConformance != MFX_BRC_NO_HRD && totDev > 0) { if (m_par.rateControlMethod == MFX_RATECONTROL_VBR) { totDev = std::max(totDev, HRDDev); } bAbPreriod = (mfxF64)(m_par.bPyr ? 4 : 3)*(mfxF64)maxFrameSizeHrd / m_par.inputBitsPerFrame*GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIDREncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange); bAbPreriod = mfx::clamp(bAbPreriod, m_par.bAbPeriod / 10, m_par.bAbPeriod); } mfxI32 quant_new = GetNewQPTotal(totDev / bAbPreriod / (mfxF64)m_par.inputBitsPerFrame, dQuantAb_new, m_ctx.QuantMin, m_ctx.QuantMax, seqQP_new, m_par.bPyr && m_par.bRec, false); seqQP_new += (seqQP_new - quant_new); mfxF64 dQuantAb = lf * (1.0 / seqQP_new); return dQuantAb; } // Get P-QP from QP of given frame mfxI32 ExtBRC::GetSeqQP(mfxI32 qp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ) { mfxI32 pqp = 0; if (type == MFX_FRAMETYPE_IDR) { pqp = qp + m_par.iDQp + 1; } else if (type == MFX_FRAMETYPE_I) { pqp = qp + 1; } else if (type == MFX_FRAMETYPE_P) { pqp = qp - layer; } else { qp -= GetOffsetAPQ(layer, isRef, clsAPQ); pqp = qp - 1; } pqp = mfx::clamp(pqp, m_par.quantMinP, m_par.quantMaxP); return pqp; } // Get QP from P-QP and given frametype, layer, ref and Adaptive Pyramid QP class. mfxI32 ExtBRC::GetPicQP(mfxI32 pqp, mfxU32 type, mfxI32 layer, mfxU16 isRef, mfxU16 clsAPQ) { mfxI32 qp = 0; if (type == MFX_FRAMETYPE_IDR) { qp = pqp - 1 - m_par.iDQp; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_I) { qp = pqp - 1; qp = mfx::clamp(qp, m_par.quantMinI, m_par.quantMaxI); } else if (type == MFX_FRAMETYPE_P) { qp =pqp + layer; qp = mfx::clamp(qp, m_par.quantMinP, m_par.quantMaxP); } else { qp = pqp + 1; qp += GetOffsetAPQ(layer, isRef, clsAPQ); qp = mfx::clamp(qp, m_par.quantMinB, m_par.quantMaxB); } return qp; } inline mfxU16 CheckHrdAndUpdateQP(HRDCodecSpec &hrd, mfxU32 frameSizeInBits, mfxU32 eo, bool bIdr, mfxI32 currQP) { if (frameSizeInBits > hrd.GetMaxFrameSizeInBits(eo, bIdr)) { hrd.SetUnderflowQuant(currQP); return MFX_BRC_BIG_FRAME; } else if (frameSizeInBits < hrd.GetMinFrameSizeInBits(eo, bIdr)) { hrd.SetOverflowQuant(currQP); return MFX_BRC_SMALL_FRAME; } return MFX_BRC_OK; } inline mfxI32 GetFrameTargetSize(mfxU32 brcSts, mfxI32 minFrameSize, mfxI32 maxFrameSize) { if (brcSts != MFX_BRC_BIG_FRAME && brcSts != MFX_BRC_SMALL_FRAME) return 0; return (brcSts == MFX_BRC_BIG_FRAME) ? maxFrameSize * 3 / 4 : minFrameSize * 5 / 4; } mfxStatus ExtBRC::Update(mfxBRCFrameParam* frame_par, mfxBRCFrameCtrl* frame_ctrl, mfxBRCFrameStatus* status) { mfxU16 ParClassAPQ = 0; // default // Use optimal Pyramid QPs for HEVC 8 GOP Pyramid coding if (m_par.gopRefDist == 8 && m_par.bPyr && m_par.codecId == MFX_CODEC_HEVC) ParClassAPQ = 1; mfxU16 ParSceneChange = frame_par->SceneChange; mfxU32 ParFrameCmplx = frame_par->FrameCmplx; mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR3(frame_par, frame_ctrl, status); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxU16 &brcSts = status->BRCStatus; status->MinFrameSize = 0; if (frame_par->NumRecode) m_ReEncodeCount++; if (frame_par->NumRecode > 100) m_SkipCount++; //printf("ExtBRC::Update: m_ctx.encOrder %d , frame_par->EncodedOrder %d, frame_par->NumRecode %d, frame_par->CodedFrameSize %d, qp %d ClassAPQ %d\n", m_ctx.encOrder , frame_par->EncodedOrder, frame_par->NumRecode, frame_par->CodedFrameSize, frame_ctrl->QpY, ParClassAPQ); mfxI32 bitsEncoded = frame_par->CodedFrameSize*8; mfxU32 picType = GetFrameType(frame_par->FrameType, frame_par->PyramidLayer, m_par.gopRefDist); bool bIdr = (picType == MFX_FRAMETYPE_IDR); mfxI32 qpY = frame_ctrl->QpY + m_par.quantOffset; mfxI32 layer = frame_par->PyramidLayer; mfxF64 qstep = QP2Qstep(qpY, m_par.quantOffset); mfxF64 fAbLong = m_ctx.fAbLong + (bitsEncoded - m_ctx.fAbLong) / m_par.fAbPeriodLong; mfxF64 fAbShort = m_ctx.fAbShort + (bitsEncoded - m_ctx.fAbShort) / m_par.fAbPeriodShort; mfxF64 eRate = bitsEncoded * sqrt(qstep); mfxF64 e2pe = 0; bool bMaxFrameSizeMode = m_par.maxFrameSizeInBits != 0 && m_par.maxFrameSizeInBits < m_par.inputBitsPerFrame * 2 && m_ctx.totalDeviation < (-1)*m_par.inputBitsPerFrame*m_par.frameRate; if (IS_IFRAME(picType)) { e2pe = (m_ctx.eRateSH == 0) ? (BRC_SCENE_CHANGE_RATIO2 + 1) : eRate / m_ctx.eRateSH; if(ParSceneChange && e2pe <= BRC_SCENE_CHANGE_RATIO2 && m_ctx.eRate) e2pe = eRate / m_ctx.eRate; } else { e2pe = (m_ctx.eRate == 0) ? (BRC_SCENE_CHANGE_RATIO2 + 1) : eRate / m_ctx.eRate; } mfxU32 frameSizeLim = 0xfffffff ; // sliding window limitation or external frame size limitation // HEVC / AV1 do not have external re-encode loop to prevent bitstream copy size violation. // For NO_HRD this will ensure encoded picture fits in bitstream memory. // Bitstsream size is bufferSize if specified. mfxU32 bitstreamSizeLim = frameSizeLim; if(m_par.codecId != MFX_CODEC_AVC && m_par.HRDConformance == MFX_BRC_NO_HRD && m_par.bufferSizeInBytes) bitstreamSizeLim = m_par.bufferSizeInBytes * 8; bool bSHStart = false; bool bNeedUpdateQP = false; brcSts = MFX_BRC_OK; if (m_par.bRec && m_ctx.bToRecode && (m_ctx.encOrder != frame_par->EncodedOrder || frame_par->NumRecode == 0)) { //printf("++++++++++++++++++++++++++++++++++\n"); // Frame must be recoded, but encoder calls BR for another frame return MFX_ERR_UNDEFINED_BEHAVIOR; } if (frame_par->NumRecode == 0) { // Set context for new frame if (IS_IFRAME(picType)) { m_ctx.LastIEncOrder = frame_par->EncodedOrder; if (bIdr) { m_ctx.LastIDREncOrder = frame_par->EncodedOrder; m_ctx.LastIDRSceneChange = ParSceneChange; } } m_ctx.encOrder = frame_par->EncodedOrder; m_ctx.poc = frame_par->DisplayOrder; m_ctx.bToRecode = 0; m_ctx.bPanic = 0; if (IS_IFRAME(picType)) { m_ctx.QuantMin = m_par.quantMinI; m_ctx.QuantMax = m_par.quantMaxI; } else if (picType == MFX_FRAMETYPE_P) { m_ctx.QuantMin = m_par.quantMinP; m_ctx.QuantMax = m_par.quantMaxP; } else { m_ctx.QuantMin = m_par.quantMinB; m_ctx.QuantMax = m_par.quantMaxB; } m_ctx.Quant = qpY; if (m_ctx.SceneChange && ( m_ctx.poc > m_ctx.SChPoc + 1 || m_ctx.poc == 0)) m_ctx.SceneChange &= ~16; bNeedUpdateQP = true; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { m_hrdSpec->ResetQuant(); } //printf("m_ctx.SceneChange %d, m_ctx.poc %d, m_ctx.SChPoc, m_ctx.poc %d \n", m_ctx.SceneChange, m_ctx.poc, m_ctx.SChPoc, m_ctx.poc); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { brcSts = CheckHrdAndUpdateQP(*m_hrdSpec.get(), bitsEncoded, frame_par->EncodedOrder, bIdr, qpY); MFX_CHECK(brcSts == MFX_BRC_OK || (!m_ctx.bPanic), MFX_ERR_NOT_ENOUGH_BUFFER); if (brcSts == MFX_BRC_OK && !m_ctx.bPanic) bNeedUpdateQP = true; status->MinFrameSize = m_hrdSpec->GetMinFrameSizeInBits(frame_par->EncodedOrder,bIdr); //printf("%d: poc %d, size %d QP %d (%d %d), HRD sts %d, maxFrameSize %d, type %d \n",frame_par->EncodedOrder, frame_par->DisplayOrder, bitsEncoded, m_ctx.Quant, m_ctx.QuantMin, m_ctx.QuantMax, brcSts, m_hrd.GetMaxFrameSize(), frame_par->FrameType); } if ((e2pe > BRC_SCENE_CHANGE_RATIO2 && bitsEncoded > 4 * m_par.inputBitsPerFrame) || (IS_IFRAME(picType) && ParFrameCmplx > 0 && frame_par->EncodedOrder == m_ctx.LastIEncOrder // We could set Qp && (ParSceneChange > 0 && m_ctx.LastIQpSet == m_ctx.LastIQpMin)) // We did set Qp and/or was SceneChange ) { // scene change, resetting BRC statistics m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; fAbLong = m_ctx.fAbLong + (bitsEncoded - m_ctx.fAbLong) / m_par.fAbPeriodLong; fAbShort = m_ctx.fAbShort + (bitsEncoded - m_ctx.fAbShort) / m_par.fAbPeriodShort; m_ctx.SceneChange |= 1; if (picType != MFX_FRAMETYPE_B) { bSHStart = true; m_ctx.dQuantAb = ResetQuantAb(qpY, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, fAbLong, frame_par->EncodedOrder, bIdr, ParClassAPQ); m_ctx.SceneChange |= 16; m_ctx.eRateSH = eRate; m_ctx.SChPoc = frame_par->DisplayOrder; //printf("!!!!!!!!!!!!!!!!!!!!! %d m_ctx.SceneChange %d, order %d\n", frame_par->EncodedOrder, m_ctx.SceneChange, frame_par->DisplayOrder); if (picType == MFX_FRAMETYPE_P && bitsEncoded > 4 * m_par.inputBitsPerFrame) ResetMinQForMaxFrameSize(&m_par, picType); } } if (m_avg.get()) { frameSizeLim = std::min (frameSizeLim, m_avg->GetMaxFrameSize(m_ctx.bPanic, bSHStart || IS_IFRAME(picType), frame_par->NumRecode)); } if (m_par.maxFrameSizeInBits) { frameSizeLim = std::min (frameSizeLim, m_par.maxFrameSizeInBits); } //printf("frameSizeLim %d (%d)\n", frameSizeLim, bitsEncoded); if (!m_ctx.bPanic) UpdateMinQForMaxFrameSize(&m_par, bitsEncoded, qpY, &m_ctx, picType, bSHStart, brcSts); if (frame_par->NumRecode < 2) // Check other condions for recoding (update qp if it is needed) { mfxF64 targetFrameSize = std::max(m_par.inputBitsPerFrame, fAbLong); mfxF64 dqf = (m_par.bFieldMode) ? 1.0 : DQF(picType, m_par.iDQp, ((picType == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), (ParSceneChange || m_ctx.encOrder == 0)); mfxF64 maxFrameSizeByRatio = dqf * FRM_RATIO(picType, m_ctx.encOrder, bSHStart, m_par.bPyr) * targetFrameSize; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufferDeviation = m_hrdSpec->GetBufferDeviation(frame_par->EncodedOrder); //printf("bufferDeviation %f\n", bufferDeviation); mfxF64 dev = -1.0*maxFrameSizeByRatio - bufferDeviation; if (dev > 0) maxFrameSizeByRatio += (std::min)(maxFrameSizeByRatio, (dev / (IS_IFRAME(picType) ? 2.0 : 4.0))); } mfxI32 quantMax = m_ctx.QuantMax; mfxI32 quantMin = m_ctx.QuantMin; mfxI32 quant = qpY; mfxF64 maxFrameSize = std::min(maxFrameSizeByRatio, frameSizeLim); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frame_par->EncodedOrder,bIdr); mfxF64 bufOccupy = LTR_BUF(picType, m_par.iDQp, ((picType == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), ParSceneChange, bSHStart, m_par.mVeryLowDelay); mfxF64 maxFrameSizeHRDBalanced = bufOccupy / 9.* maxFrameSizeHrd + (9.0 - bufOccupy) / 9.*targetFrameSize; if (m_par.mVeryLowDelay && frame_par->NumRecode) { maxFrameSize = std::min(maxFrameSize, maxFrameSizeHrd); // very low delay also in low latency, avoid 2nd recode if possible } else if (m_ctx.encOrder == 0) { // modify buf limits for VCM like encode for init only mfxF64 maxFrameSizeGood = 6.5 * m_par.inputBitsPerFrame; mfxF64 maxFrameSizeHighMark = 8.0 / 9.* maxFrameSizeHrd + 1.0 / 9.*m_par.inputBitsPerFrame; mfxF64 maxFrameSizeInit = mfx::clamp(maxFrameSizeGood, maxFrameSizeHRDBalanced, maxFrameSizeHighMark); maxFrameSize = std::min(maxFrameSize, maxFrameSizeInit); } else { maxFrameSize = std::min(maxFrameSize, maxFrameSizeHRDBalanced); } quantMax = std::min(m_hrdSpec->GetMaxQuant(), quantMax); quantMin = std::max(m_hrdSpec->GetMinQuant(), quantMin); } maxFrameSize = std::max(maxFrameSize, targetFrameSize); if (bitsEncoded > maxFrameSize && quant < quantMax) { mfxI32 quant_new = GetNewQP(bitsEncoded, (mfxU32)maxFrameSize, quantMin , quantMax, quant ,m_par.quantOffset, m_par.mVeryLowDelay ? 1.24 : 1.0, false, m_par.mVeryLowDelay ? false : true); if (quant_new > quant) { bNeedUpdateQP = false; //printf(" recode 1-0: %d: k %5f bitsEncoded %d maxFrameSize %d, targetSize %d, fAbLong %f, inputBitsPerFrame %f, qp %d new %d, layer %d\n",frame_par->EncodedOrder, bitsEncoded/maxFrameSize, (int)bitsEncoded, (int)maxFrameSize,(int)targetFrameSize, fAbLong, m_par.inputBitsPerFrame, quant, quant_new, layer); if (quant_new > GetCurQP(picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ)) { UpdateQPParams(bMaxFrameSizeMode ? quant_new - 1 : quant_new, picType, m_ctx, 0, quantMin, quantMax, layer, m_par.iDQp, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, fAbLong, frame_par->EncodedOrder, bIdr, ParClassAPQ); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_BIG_FRAME, quant, quant_new, quantMin, quantMax, m_ctx, status); return sts; } } //(quant_new > quant) } //bitsEncoded > maxFrameSize mfxF64 lFR = std::min(m_par.gopPicSize - 1, 4); mfxF64 lowFrameSizeI = std::min(maxFrameSize, lFR *(mfxF64)m_par.inputBitsPerFrame); // Did we set the qp? if (IS_IFRAME(picType) && ParFrameCmplx > 0 // We could set Qp && frame_par->EncodedOrder == m_ctx.LastIEncOrder && m_ctx.LastIQpSet == m_ctx.LastIQpMin // We did set Qp && frame_par->NumRecode == 0 && bitsEncoded < (lowFrameSizeI/2.0) && quant > quantMin) // We can & should recode { // too small; do something mfxI32 quant_new = GetNewQP(bitsEncoded, (mfxU32)lowFrameSizeI, quantMin, quantMax, quant, m_par.quantOffset, 0.78, false, true); if (quant_new < quant) { //printf(" recode LFR: %d:", frame_par->EncodedOrder); bNeedUpdateQP = false; if (quant_new < GetCurQP(picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ)) { UpdateQPParams(bMaxFrameSizeMode ? quant_new - 1 : quant_new, picType, m_ctx, 0, quantMin, quantMax, layer, m_par.iDQp, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, fAbLong,frame_par->EncodedOrder, bIdr, ParClassAPQ); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_SMALL_FRAME, quant, quant_new, quantMin, quantMax, m_ctx, status); return sts; } } //(quant_new < quant) } if (bitsEncoded > maxFrameSize && quant == quantMax && !IS_IFRAME(picType) && m_par.bPanic && (!m_ctx.bPanic) && isFrameBeforeIntra(m_ctx.encOrder, m_ctx.LastIEncOrder, m_par.gopPicSize, m_par.gopRefDist)) { //skip frames before intra SetRecodeParams(MFX_BRC_PANIC_BIG_FRAME,quant,quant, quantMin ,quantMax, m_ctx, status); return sts; } if (m_par.HRDConformance != MFX_BRC_NO_HRD && frame_par->NumRecode == 0 && (quant < quantMax)) { mfxF64 maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frame_par->EncodedOrder, bIdr); mfxF64 FAMax = 1./9. * maxFrameSizeHrd + 8./9. * fAbLong; if (fAbShort > FAMax) { mfxI32 quant_new = GetNewQP(fAbShort, FAMax, quantMin , quantMax, quant ,m_par.quantOffset, 0.5); //printf("============== recode 2-0: %d: FAMax %f, fAbShort %f, quant_new %d\n",frame_par->EncodedOrder, FAMax, fAbShort, quant_new); if (quant_new > quant) { bNeedUpdateQP = false; if (quant_new > GetCurQP (picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ)) { UpdateQPParams(quant_new ,picType, m_ctx, 0, quantMin , quantMax, layer, m_par.iDQp, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); fAbLong = m_ctx.fAbLong = m_par.inputBitsPerFrame; fAbShort = m_ctx.fAbShort = m_par.inputBitsPerFrame; m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, fAbLong, frame_par->EncodedOrder, bIdr, ParClassAPQ); } if (m_par.bRec) { SetRecodeParams(MFX_BRC_BIG_FRAME,quant,quant_new, quantMin, quantMax, m_ctx, status); return sts; } } //quant_new > quant } }//m_par.HRDConformance } if ((((m_par.HRDConformance != MFX_BRC_NO_HRD && brcSts != MFX_BRC_OK) || (bitsEncoded > (mfxI32)frameSizeLim)) && m_par.bRec) || (bitsEncoded > (mfxI32)bitstreamSizeLim)) { mfxI32 quant = qpY; mfxI32 quant_new = quant; if (bitsEncoded > (mfxI32)frameSizeLim) { brcSts = MFX_BRC_BIG_FRAME; quant_new = GetNewQP(bitsEncoded, frameSizeLim, m_ctx.QuantMin , m_ctx.QuantMax,quant,m_par.quantOffset, 1, true); } else if (bitsEncoded > (mfxI32)bitstreamSizeLim) { brcSts = MFX_BRC_BIG_FRAME; quant_new = GetNewQP(bitsEncoded, bitstreamSizeLim, m_ctx.QuantMin , m_ctx.QuantMax,quant,m_par.quantOffset, 1, true); } else if (brcSts == MFX_BRC_BIG_FRAME || brcSts == MFX_BRC_SMALL_FRAME) { mfxF64 targetSize = GetFrameTargetSize(brcSts, m_hrdSpec->GetMinFrameSizeInBits(frame_par->EncodedOrder, bIdr), m_hrdSpec->GetMaxFrameSizeInBits(frame_par->EncodedOrder, bIdr)); quant_new = GetNewQP(bitsEncoded, targetSize, m_ctx.QuantMin , m_ctx.QuantMax,quant,m_par.quantOffset, 1, true); } if (quant_new != quant) { if (brcSts == MFX_BRC_SMALL_FRAME) { quant_new = std::max(quant_new, quant-2); brcSts = MFX_BRC_PANIC_SMALL_FRAME; } // Idea is to check a sign mismatch, 'true' if both are negative or positive if ((quant_new - qpY) * (quant_new - GetCurQP (picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ)) > 0) { UpdateQPParams(quant_new ,picType, m_ctx, 0, m_ctx.QuantMin , m_ctx.QuantMax, layer, m_par.iDQp, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); m_ctx.dQuantAb = ResetQuantAb(quant_new, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, fAbLong, frame_par->EncodedOrder, bIdr, ParClassAPQ); } bNeedUpdateQP = false; } SetRecodeParams(brcSts,quant,quant_new, m_ctx.QuantMin , m_ctx.QuantMax, m_ctx, status); //printf("===================== recode 1-0 %d: %d: HRD recode: quant %d quant_new %d bitsEncoded %d\n", brcSts, frame_par->EncodedOrder, quant, quant_new, bitsEncoded); } else { // no recoding are needed. Save context params mfxF64 k = 1./ GetSeqQP(qpY, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); mfxF64 dqAbPeriod = m_par.dqAbPeriod; if (m_ctx.bToRecode) dqAbPeriod = (k < m_ctx.dQuantAb)? 16:25; if (bNeedUpdateQP) { m_ctx.dQuantAb += (k - m_ctx.dQuantAb)/dqAbPeriod; m_ctx.dQuantAb = mfx::clamp(m_ctx.dQuantAb, 1. / m_ctx.QuantMax, 1.); m_ctx.fAbLong = fAbLong; m_ctx.fAbShort = fAbShort; } bool oldScene = false; if ((m_ctx.SceneChange & 16) && (m_ctx.poc < m_ctx.SChPoc) && (e2pe < .01) && (mfxF64)bitsEncoded < 1.5*fAbLong) oldScene = true; //printf("-- m_ctx.eRate %f, eRate %f, e2pe %f\n", m_ctx.eRate, eRate, e2pe ); if (!m_ctx.bPanic && frame_par->NumRecode < 100) { if (picType != MFX_FRAMETYPE_B) { m_ctx.LastNonBFrameSize = bitsEncoded; if (IS_IFRAME(picType)) { m_ctx.eRateSH = eRate; if (ParSceneChange) m_ctx.eRate = m_par.inputBitsPerFrame * sqrt(QP2Qstep(GetCurQP(MFX_FRAMETYPE_P, 0, MFX_FRAMETYPE_REF, 0), m_par.quantOffset)); } else { m_ctx.eRate = eRate; if (m_ctx.eRate > m_ctx.eRateSH) m_ctx.eRateSH = m_ctx.eRate; } } if (IS_IFRAME(picType)) { m_ctx.LastIFrameSize = bitsEncoded; m_ctx.LastIQpAct = qpY; } } if (m_avg.get()) { m_avg->UpdateSlidingWindow(bitsEncoded, m_ctx.encOrder, m_ctx.bPanic, bSHStart || IS_IFRAME(picType),frame_par->NumRecode, qpY); } m_ctx.totalDeviation += ((mfxF64)bitsEncoded -m_par.inputBitsPerFrame); //printf("------------------ %d (%d)) Total deviation %f, old scene %d, bNeedUpdateQP %d, m_ctx.Quant %d, type %d, m_ctx.fAbLong %f m_par.inputBitsPerFrame %f\n", frame_par->EncodedOrder, frame_par->DisplayOrder,m_ctx.totalDeviation, oldScene , bNeedUpdateQP, m_ctx.Quant,picType, m_ctx.fAbLong, m_par.inputBitsPerFrame); if (m_par.HRDConformance != MFX_BRC_NO_HRD) { m_hrdSpec->Update(bitsEncoded, frame_par->EncodedOrder, bIdr); } if (!m_ctx.bPanic&& (!oldScene) && bNeedUpdateQP) { mfxI32 quant_new = qpY; //Update QP mfxF64 totDev = m_ctx.totalDeviation; mfxF64 HRDDevFactor = 0.0; mfxF64 HRDDev = 0.0; mfxF64 maxFrameSizeHrd = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { HRDDevFactor = m_hrdSpec->GetBufferDeviationFactor(frame_par->EncodedOrder); HRDDev = m_hrdSpec->GetBufferDeviation(frame_par->EncodedOrder); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(frame_par->EncodedOrder, bIdr); } mfxF64 dequant_new = m_ctx.dQuantAb*pow(m_par.inputBitsPerFrame / m_ctx.fAbLong, 1.0 + HRDDevFactor); mfxF64 bAbPreriod = m_par.bAbPeriod; if (m_par.HRDConformance != MFX_BRC_NO_HRD && totDev > 0) { if (m_par.rateControlMethod == MFX_RATECONTROL_VBR && m_par.maxbps > m_par.targetbps ) { totDev = std::max(totDev, HRDDev); } else { totDev = HRDDev; } if (totDev > 0) { bAbPreriod = (mfxF64)(m_par.bPyr ? 4 : 3)*(mfxF64)maxFrameSizeHrd / fAbShort * GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIDREncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange); bAbPreriod = mfx::clamp(bAbPreriod, m_par.bAbPeriod / 10, m_par.bAbPeriod); } } quant_new = GetNewQPTotal(totDev / bAbPreriod / (mfxF64)m_par.inputBitsPerFrame, dequant_new, m_ctx.QuantMin, m_ctx.QuantMax, GetSeqQP(qpY, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ), m_par.bPyr && m_par.bRec, bSHStart && m_ctx.bToRecode == 0); quant_new = GetPicQP(quant_new, picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); //printf(" ===%d quant old %d quant_new %d, bitsEncoded %d m_ctx.QuantMin %d m_ctx.QuantMax %d\n", frame_par->EncodedOrder, m_ctx.Quant, quant_new, bitsEncoded, m_ctx.QuantMin, m_ctx.QuantMax); if (bMaxFrameSizeMode) { mfxF64 targetMax = ((mfxF64)m_par.maxFrameSizeInBits*((bSHStart || IS_IFRAME(picType)) ? 0.95 : 0.9)); mfxF64 targetMin = ((mfxF64)m_par.maxFrameSizeInBits*((bSHStart || IS_IFRAME(picType)) ? 0.9 : 0.8 /*0.75 : 0.5*/)); mfxI32 QuantNewMin = GetNewQP(bitsEncoded, targetMax, m_ctx.QuantMin, m_ctx.QuantMax, qpY, m_par.quantOffset, 1,false, false); mfxI32 QuantNewMax = GetNewQP(bitsEncoded, targetMin, m_ctx.QuantMin, m_ctx.QuantMax, qpY, m_par.quantOffset, 1,false, false); mfxI32 quant_corrected = qpY; if (quant_corrected < QuantNewMin - 3) quant_corrected += 2; if (quant_corrected < QuantNewMin) quant_corrected ++; else if (quant_corrected > QuantNewMax + 3) quant_corrected -= 2; else if (quant_corrected > QuantNewMax) quant_corrected--; //printf(" QuantNewMin %d, QuantNewMax %d, m_ctx.Quant %d, new %d (%d)\n", QuantNewMin, QuantNewMax, m_ctx.Quant, quant_corrected, quant_new); quant_new = mfx::clamp(quant_corrected, m_ctx.QuantMin, m_ctx.QuantMax); } if ((quant_new - qpY)* (quant_new - GetCurQP (picType, layer, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ)) > 0) // this check is actual for async scheme { //printf(" +++ Update QP %d: totalDeviation %f, bAbPreriod %f (%f), QP %d (%d %d), qp_new %d (qpY %d), type %d, dequant_new %f (%f) , m_ctx.fAbLong %f, m_par.inputBitsPerFrame %f\n", // frame_par->EncodedOrder,totDev , bAbPreriod, GetAbPeriodCoeff(m_ctx.encOrder - m_ctx.LastIEncOrder, m_par.gopPicSize, m_ctx.LastIDRSceneChange), m_ctx.Quant, m_ctx.QuantMin, m_ctx.QuantMax,quant_new, qpY, picType, 1.0/dequant_new, 1.0/m_ctx.dQuantAb, m_ctx.fAbLong, m_par.inputBitsPerFrame); UpdateQPParams(quant_new ,picType, m_ctx, 0, m_ctx.QuantMin , m_ctx.QuantMax, layer, m_par.iDQp, frame_par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); } } m_ctx.bToRecode = 0; } return sts; } const mfxF64 COEFF_INTRA[2] = { -0.107510, 0.694515 }; void get_coeff_intra(mfxF64 /*rscs*/, mfxF64 *pCoeff) { pCoeff[0] = COEFF_INTRA[0]; pCoeff[1] = COEFF_INTRA[1]; } #define PWR_RSCS 0.751 mfxF64 getScaledIntraBits(mfxF64 targetBits, mfxF64 rawSize, mfxF64 rscs) { if (rscs < MIN_RACA) rscs = MIN_RACA; mfxF64 SC = pow(rscs, PWR_RSCS); mfxF64 dBits = log((targetBits / rawSize) / SC); return dBits; } mfxI32 compute_first_qp_intra(mfxI32 targetBits, mfxI32 rawSize, mfxF64 rscs) { mfxF64 dBits = getScaledIntraBits(targetBits, rawSize, rscs); mfxF64 coeffIntra[2]; get_coeff_intra(rscs, coeffIntra); mfxF64 qpNew = (dBits - coeffIntra[1]) / coeffIntra[0]; mfxI32 qp = (mfxI32)(qpNew + 0.5); if (qp < 1) qp = 1; return qp; } mfxI32 compute_new_qp_intra(mfxI32 targetBits, mfxI32 rawSize, mfxF64 raca, mfxI32 iBits, mfxF64 icmplx, mfxI32 iqp) { mfxF64 coeffIntra1[2], coeffIntra2[2]; mfxF64 qp_hat = getScaledIntraBits(iBits, rawSize, icmplx); get_coeff_intra(icmplx, coeffIntra1); qp_hat = (qp_hat - coeffIntra1[1]) / coeffIntra1[0]; mfxF64 dQp = iqp - qp_hat; dQp = mfx::clamp(dQp, (-1.0 * MAX_MODEL_ERR), (1.0 * MAX_MODEL_ERR)); mfxF64 qp_pred = getScaledIntraBits(targetBits, rawSize, raca); get_coeff_intra(raca, coeffIntra2); qp_pred = (qp_pred - coeffIntra2[1]) / coeffIntra2[0]; mfxF64 qpNew = qp_pred + dQp; mfxI32 qp = (mfxI32)(qpNew + 0.5); if (qp < 1) qp = 1; return qp; } mfxStatus ExtBRC::GetFrameCtrl (mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl) { MFX_CHECK_NULL_PTR2(par, ctrl); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxU16 ParClassAPQ = 0; // Use optimal Pyramid QPs for HEVC 8 GOP Pyramid coding if (m_par.gopRefDist == 8 && m_par.bPyr && m_par.codecId == MFX_CODEC_HEVC) ParClassAPQ = 1; mfxU16 ParSceneChange = par->SceneChange; mfxU16 ParLongTerm = par->LongTerm; mfxU32 ParFrameCmplx = par->FrameCmplx; mfxI32 qp = 0; mfxI32 qpMin = 1; mfxU16 type = GetFrameType(par->FrameType, par->PyramidLayer, m_par.gopRefDist); bool bIdr = (type == MFX_FRAMETYPE_IDR); mfxF64 HRDDev = 0.0; mfxF64 maxFrameSizeHrd = 0.0; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { m_hrdSpec->GetBufferDeviationFactor(par->EncodedOrder); HRDDev = m_hrdSpec->GetBufferDeviation(par->EncodedOrder); maxFrameSizeHrd = m_hrdSpec->GetMaxFrameSizeInBits(par->EncodedOrder, bIdr); } if (!m_bDynamicInit) { if (IS_IFRAME(type)) { // Init DQP if (ParLongTerm) { m_par.iDQp = m_par.iDQp0; ltrprintf("DQp0 %d\n", m_par.iDQp); } // Init Qp if (ParFrameCmplx > 0) { mfxF64 raca = (mfxF64)ParFrameCmplx / RACA_SCALE; // MaxFrameSize mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 bufOccupy = LTR_BUF(type, m_par.iDQp, m_par.mIntraBoost, 1, 0, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* (m_par.initialDelayInBytes * 8.0) + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } // Set Intra QP mfxF64 dqf = DQF(type, m_par.iDQp, m_par.mIntraBoost, 1); mfxF64 targetFrameSize = dqf * FRM_RATIO(type, 0, 0, m_par.bPyr) * (mfxF64)m_par.inputBitsPerFrame; targetFrameSize = std::min(maxFrameSize, targetFrameSize); mfxI32 qp0 = compute_first_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca); if (targetFrameSize < 6.5 * m_par.inputBitsPerFrame && qp0>3) qp0 -= 3; // use re-encoding for best results (maxFrameSizeGood) else if (raca == MIN_RACA && qp0>3) qp0 -= 3; // uncertainty; use re-encoding for best results ltrprintf("Qp0 %d\n", qp0); UpdateQPParams(qp0, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, par->FrameType & MFX_FRAMETYPE_REF, 0); qpMin = qp0; } } m_bDynamicInit = true; } if (par->EncodedOrder == m_ctx.encOrder || par->NumRecode) { qp = m_ctx.Quant; } else { if (IS_IFRAME(type)) { if (type == MFX_FRAMETYPE_IDR) { if (!ParLongTerm) { m_par.iDQp = 0; } else if (ParSceneChange) { m_par.iDQp = m_par.iDQp0; } } mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 hrdMaxFrameSize = m_par.initialDelayInBytes * 8; if (maxFrameSizeHrd > 0) hrdMaxFrameSize = std::min(hrdMaxFrameSize, maxFrameSizeHrd); mfxF64 bufOccupy = LTR_BUF(type, m_par.iDQp, ((type == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), (ParSceneChange || (m_ctx.LastIQpSet && m_ctx.QuantP > ((mfxI32)m_ctx.LastIQpSet + (mfxI32)m_par.iDQp + 1))), 0, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* hrdMaxFrameSize + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } if (type == MFX_FRAMETYPE_IDR) { // Re-Determine LTR iDQP if (!ParLongTerm) { m_par.iDQp = 0; } else { mfxF64 maxFrameRatio = 2 * FRM_RATIO(type, par->EncodedOrder, 0, m_par.bPyr); mfxF64 minFrameRatio = FRM_RATIO(type, 0, 0, m_par.bPyr); maxFrameRatio = std::min(maxFrameRatio, (maxFrameSize / m_par.inputBitsPerFrame)); mfxU32 mNumRefsInGop = m_par.mNumRefsInGop; if (m_ctx.LastIQpSetOrder) { mfxU32 pastRefsInGop = (mfxU32)(std::max(1.0, (!m_par.bPyr ? (mfxF64)(par->EncodedOrder - m_ctx.LastIQpSetOrder) / (mfxF64)m_par.gopRefDist : (mfxF64)(par->EncodedOrder - m_ctx.LastIQpSetOrder) / 2.0))); mNumRefsInGop = std::min(mNumRefsInGop, pastRefsInGop); } maxFrameRatio = std::min(maxFrameRatio, mNumRefsInGop); mfxF64 dqpmax = std::max(0.0, 6.0 * (log(maxFrameRatio / minFrameRatio) / log(2.0))); mfxU32 iDQpMax = (mfxU32)(dqpmax + 0.5); if (ParSceneChange) { iDQpMax = mfx::clamp(iDQpMax, 1u, m_par.iDQp0); } else { iDQpMax = mfx::clamp(iDQpMax, 1u, MAX_DQP_LTR); } m_par.iDQp = iDQpMax; ltrprintf("FR %lf DQp %d\n", maxFrameRatio, m_par.iDQp); } } // Determine Min Qp if (ParFrameCmplx > 0) { mfxF64 raca = (mfxF64)ParFrameCmplx / RACA_SCALE; mfxF64 dqf = DQF(type, m_par.iDQp, ((type == MFX_FRAMETYPE_IDR) ? m_par.mIntraBoost : false), ParSceneChange); mfxF64 targetFrameSize = dqf * FRM_RATIO(type, par->EncodedOrder, 0, m_par.bPyr) * m_par.inputBitsPerFrame; if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance != MFX_BRC_NO_HRD) { // CBR HRD Buffer over flow has priority mfxF64 dev = -1.0*targetFrameSize - HRDDev; if (dev > 0) targetFrameSize += std::min(targetFrameSize, (dev/2.0)); } targetFrameSize = std::min(maxFrameSize, targetFrameSize); mfxF64 CmplxRatio = 1.0; if (m_ctx.LastICmplx) CmplxRatio = ParFrameCmplx / m_ctx.LastICmplx; if (!ParSceneChange && m_ctx.LastICmplx && m_ctx.LastIQpAct && m_ctx.LastIFrameSize && CmplxRatio > 0.5 && CmplxRatio < 2.0) { qpMin = compute_new_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca, m_ctx.LastIFrameSize, (mfxF64) m_ctx.LastICmplx / RACA_SCALE, m_ctx.LastIQpAct); if (raca == MIN_RACA && qpMin>3) qpMin -= 3; // uncertainty; use re-encoding for best results } else { qpMin = compute_first_qp_intra((mfxI32)targetFrameSize, m_par.mRawFrameSizeInPixs, raca); if (targetFrameSize < 6.5 * m_par.inputBitsPerFrame && qpMin>3) qpMin -= 3; // uncertainty; use re-encoding for best results else if (raca == MIN_RACA && qpMin>3) qpMin -= 3; // uncertainty; use re-encoding for best results } ltrprintf("Min QpI %d Schg %d\n", qpMin, ParSceneChange); } } else //if (type == MFX_FRAMETYPE_P) { mfxU16 ltype = MFX_FRAMETYPE_P; mfxF64 maxFrameSize = m_par.mRawFrameSizeInBits; if (m_par.maxFrameSizeInBits) { maxFrameSize = std::min(maxFrameSize, m_par.maxFrameSizeInBits); } if (m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 hrdMaxFrameSize = m_par.initialDelayInBytes * 8; if (maxFrameSizeHrd > 0) hrdMaxFrameSize = std::min(hrdMaxFrameSize, (mfxF64)maxFrameSizeHrd); mfxF64 bufOccupy = LTR_BUF(ltype, m_par.iDQp, false, ParSceneChange, ParSceneChange, m_par.mVeryLowDelay); maxFrameSize = std::min(maxFrameSize, (bufOccupy / 9.* hrdMaxFrameSize + (9.0 - bufOccupy) / 9.*m_par.inputBitsPerFrame)); } mfxF64 targetFrameSize = FRM_RATIO(ltype, par->EncodedOrder, 0, m_par.bPyr) * m_par.inputBitsPerFrame; if (m_par.bPyr && m_par.gopRefDist == 8) targetFrameSize *= ((ParClassAPQ == 1) ? 2.0 : 1.66); if (m_par.rateControlMethod == MFX_RATECONTROL_CBR && m_par.HRDConformance != MFX_BRC_NO_HRD) { mfxF64 dev = -1.0*targetFrameSize - HRDDev; if (dev > 0) targetFrameSize += std::min(targetFrameSize, (dev/4.0)); } targetFrameSize = std::min(maxFrameSize, targetFrameSize); qpMin = GetMinQForMaxFrameSize(&m_par, targetFrameSize, ltype); } qp = GetCurQP(type, par->PyramidLayer, par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); // Max Frame Size recode prevention if (qp < qpMin) { if (type != MFX_FRAMETYPE_B) { SetQPParams(qpMin, type, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); qp = GetCurQP(type, par->PyramidLayer, par->FrameType & MFX_FRAMETYPE_REF, ParClassAPQ); } else { qp = qpMin; } } else qpMin = std::min(qp - 1, qpMin); } ctrl->QpY = qp - m_par.quantOffset; if (m_par.HRDConformance != MFX_BRC_NO_HRD) { ctrl->InitialCpbRemovalDelay = m_hrdSpec->GetInitCpbRemovalDelay(par->EncodedOrder); ctrl->InitialCpbRemovalOffset = m_hrdSpec->GetInitCpbRemovalDelayOffset(par->EncodedOrder); } if (m_par.mMBBRC ) { if (ctrl->NumExtParam == 0) { //attach MBBRC buffer ctrl->NumExtParam = 1; ctrl->ExtParam = &(m_ExtBuff[par->EncodedOrder % m_ExtBuff.size()]); } mfxExtMBQP * pExtMBQP = (mfxExtMBQP*)Hevc_GetExtBuffer(ctrl->ExtParam, ctrl->NumExtParam, MFX_EXTBUFF_MBQP); if (pExtMBQP) { //fill QP map for (size_t i = 0; i < pExtMBQP->NumQPAlloc; i++) { pExtMBQP->QP[i] = (mfxU8)(qp +((qp<51)? (i%2):0)); } } } //printf("EncOrder %d ctrl->QpY %d, qp %d quantOffset %d Cmplx %lf\n", par->EncodedOrder, ctrl->QpY , qp , m_par.quantOffset, par->FrameCmplx); if (IS_IFRAME(type)) { m_ctx.LastIQpSetOrder = par->EncodedOrder; m_ctx.LastIQpMin = qpMin - m_par.quantOffset; m_ctx.LastIQpSet = ctrl->QpY; m_ctx.LastIQpAct = 0; m_ctx.LastICmplx = ParFrameCmplx; m_ctx.LastIFrameSize = 0; ResetMinQForMaxFrameSize(&m_par, type); } return MFX_ERR_NONE; } mfxStatus ExtBRC::Reset(mfxVideoParam *par ) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(par); MFX_CHECK(m_bInit, MFX_ERR_NOT_INITIALIZED); mfxExtEncoderResetOption * pRO = (mfxExtEncoderResetOption *)Hevc_GetExtBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_ENCODER_RESET_OPTION); if (pRO && pRO->StartNewSequence == MFX_CODINGOPTION_ON) { Close(); sts = Init(par); } else { bool brcReset = false; bool slidingWindowReset = false; sts = m_par.GetBRCResetType(par, false, brcReset, slidingWindowReset); MFX_CHECK_STS(sts); if (brcReset) { sts = m_par.Init(par, isFieldMode(par)); MFX_CHECK_STS(sts); m_ctx.Quant = (mfxI32)(1. / m_ctx.dQuantAb * pow(m_ctx.fAbLong / m_par.inputBitsPerFrame, 0.32) + 0.5); m_ctx.Quant = mfx::clamp(m_ctx.Quant, m_par.quantMinI, m_par.quantMaxI); UpdateQPParams(m_ctx.Quant, MFX_FRAMETYPE_IDR, m_ctx, 0, m_par.quantMinI, m_par.quantMaxI, 0, m_par.iDQp, MFX_FRAMETYPE_REF, 0); m_ctx.dQuantAb = 1. / m_ctx.Quant; m_ctx.fAbLong = m_par.inputBitsPerFrame; m_ctx.fAbShort = m_par.inputBitsPerFrame; if (slidingWindowReset) { m_avg.reset(new AVGBitrate(m_par.WinBRCSize, (mfxU32)(m_par.WinBRCMaxAvgKbps*1000.0 / m_par.frameRate), (mfxU32)m_par.inputBitsPerFrame)); MFX_CHECK_NULL_PTR1(m_avg.get()); } } } return sts; } void HEVC_HRD::Init(cBRCParams &par) { m_hrdInput.Init(par); m_prevAuCpbRemovalDelayMinus1 = -1; m_prevAuCpbRemovalDelayMsb = 0; m_prevAuFinalArrivalTime = 0; m_prevBpAuNominalRemovalTime = (mfxU32)m_hrdInput.m_initCpbRemovalDelay; m_prevBpEncOrder = 0; } void HEVC_HRD::Reset(cBRCParams &par) { sHrdInput hrdInput; hrdInput.Init(par); m_hrdInput.m_bitrate = hrdInput.m_bitrate; m_hrdInput.m_cpbSize90k = hrdInput.m_cpbSize90k; } void HEVC_HRD::Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) { mfxF64 auNominalRemovalTime = 0.0; mfxF64 initCpbRemovalDelay = GetInitCpbRemovalDelay(eo); if (eo > 0) { mfxU32 auCpbRemovalDelayMinus1 = (eo - m_prevBpEncOrder) - 1; // (D-1) mfxU32 auCpbRemovalDelayMsb = 0; if (!bSEI && (eo - m_prevBpEncOrder) != 1) { auCpbRemovalDelayMsb = ((mfxI32)auCpbRemovalDelayMinus1 <= m_prevAuCpbRemovalDelayMinus1) ? m_prevAuCpbRemovalDelayMsb + m_hrdInput.m_maxCpbRemovalDelay : m_prevAuCpbRemovalDelayMsb; } m_prevAuCpbRemovalDelayMsb = auCpbRemovalDelayMsb; m_prevAuCpbRemovalDelayMinus1 = auCpbRemovalDelayMinus1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_hrdInput.m_clockTick * (auCpbRemovalDelayValMinus1 + 1); } else // (C-9) auNominalRemovalTime = m_hrdInput.m_initCpbRemovalDelay; // (C-3) mfxF64 initArrivalTime = m_prevAuFinalArrivalTime; if (!m_hrdInput.m_cbrFlag) { mfxF64 initArrivalEarliestTime = (bSEI) // (C-7) ? auNominalRemovalTime - initCpbRemovalDelay // (C-6) : auNominalRemovalTime - m_hrdInput.m_cpbSize90k; // (C-4) initArrivalTime = std::max(m_prevAuFinalArrivalTime, initArrivalEarliestTime * m_hrdInput.m_bitrate); } // (C-8) mfxF64 auFinalArrivalTime = initArrivalTime + (mfxF64)sizeInbits * 90000; m_prevAuFinalArrivalTime = auFinalArrivalTime; if (bSEI) { m_prevBpAuNominalRemovalTime = auNominalRemovalTime; m_prevBpEncOrder = eo; } } mfxU32 HEVC_HRD::GetInitCpbRemovalDelay(mfxU32 eo) const { mfxF64 auNominalRemovalTime; if (eo > 0) { // (D-1) mfxU32 auCpbRemovalDelayMsb = 0; mfxU32 auCpbRemovalDelayMinus1 = eo - m_prevBpEncOrder - 1; // (D-2) mfxU32 auCpbRemovalDelayValMinus1 = auCpbRemovalDelayMsb + auCpbRemovalDelayMinus1; // (C-10, C-11) auNominalRemovalTime = m_prevBpAuNominalRemovalTime + m_hrdInput.m_clockTick * (auCpbRemovalDelayValMinus1 + 1); // (C-17) mfxF64 deltaTime90k = auNominalRemovalTime - m_prevAuFinalArrivalTime / m_hrdInput.m_bitrate; return (m_hrdInput.m_cbrFlag // (C-19) ? (mfxU32)(deltaTime90k) // (C-18) : (mfxU32)std::min(deltaTime90k, m_hrdInput.m_cpbSize90k)); } return (mfxU32)m_hrdInput.m_initCpbRemovalDelay; } inline mfxF64 GetTargetDelay(mfxF64 cpbSize90k, mfxF64 initCpbRemovalDelay, bool bVBR) { return bVBR? std::max(std::min(3.0*cpbSize90k / 4.0, initCpbRemovalDelay), cpbSize90k / 2.0): std::min(cpbSize90k / 2.0, initCpbRemovalDelay); } mfxF64 HEVC_HRD::GetBufferDeviation(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate; } mfxF64 HEVC_HRD::GetBufferDeviationFactor(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return abs((targetDelay - delay) / targetDelay); } mfxU32 HEVC_HRD::GetMaxFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { return (mfxU32)(GetInitCpbRemovalDelay(eo) / 90000.0*m_hrdInput.m_bitrate); } mfxU32 HEVC_HRD::GetMinFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); if ((!m_hrdInput.m_cbrFlag) || ((delay + m_hrdInput.m_clockTick + 16.0) < m_hrdInput.m_cpbSize90k)) return 0; return (mfxU32)((delay + m_hrdInput.m_clockTick + 16.0 - m_hrdInput.m_cpbSize90k) /90000.0*m_hrdInput.m_bitrate + 0.99999); } H264_HRD::H264_HRD(): m_trn_cur(0) , m_taf_prv(0) { } void H264_HRD::Init(cBRCParams &par) { m_hrdInput.Init(par); m_hrdInput.m_clockTick *= (1.0 / 90000.0); m_taf_prv = 0.0; m_trn_cur = m_hrdInput.m_initCpbRemovalDelay / 90000.0; m_trn_cur = GetInitCpbRemovalDelay(0) / 90000.0; } void H264_HRD::Reset(cBRCParams &par) { sHrdInput hrdInput; hrdInput.Init(par); m_hrdInput.m_bitrate = hrdInput.m_bitrate; m_hrdInput.m_cpbSize90k = hrdInput.m_cpbSize90k; } void H264_HRD::Update(mfxU32 sizeInbits, mfxU32 eo, bool bSEI) { // const bool interlace = false; //BRC is frame level only mfxU32 initDelay = GetInitCpbRemovalDelay(eo); double tai_earliest = bSEI ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdInput.m_cpbSize90k / 90000.0); double tai_cur = (!m_hrdInput.m_cbrFlag) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; m_taf_prv = tai_cur + (mfxF64)sizeInbits / m_hrdInput.m_bitrate; m_trn_cur += m_hrdInput.m_clockTick ; } mfxU32 H264_HRD::GetInitCpbRemovalDelay(mfxU32 /* eo */) const { double delay = std::max(0.0, m_trn_cur - m_taf_prv); mfxU32 initialCpbRemovalDelay = mfxU32(90000 * delay + 0.5); return (mfxU32)(initialCpbRemovalDelay == 0 ? 1 // should not be equal to 0 : initialCpbRemovalDelay > m_hrdInput.m_cpbSize90k && (!m_hrdInput.m_cbrFlag) ? m_hrdInput.m_cpbSize90k // should not exceed hrd buffer : initialCpbRemovalDelay); } mfxF64 H264_HRD::GetBufferDeviation(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); //printf("%d) GetBufferDeviation %f (%d, target %d)\n", eo, (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate, delay, (int)targetDelay); return (targetDelay - delay) / 90000.0*m_hrdInput.m_bitrate; } mfxF64 H264_HRD::GetBufferDeviationFactor(mfxU32 eo) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); mfxF64 targetDelay = GetTargetDelay(m_hrdInput.m_cpbSize90k, m_hrdInput.m_initCpbRemovalDelay, !m_hrdInput.m_cbrFlag); return abs ((targetDelay - delay) / targetDelay); } mfxU32 H264_HRD::GetInitCpbRemovalDelayOffset(mfxU32 eo) const { // init_cpb_removal_delay + init_cpb_removal_delay_offset should be constant return mfxU32(m_hrdInput.m_cpbSize90k - GetInitCpbRemovalDelay(eo)); } mfxU32 H264_HRD::GetMinFrameSizeInBits(mfxU32 eo, bool /*bSEI*/) const { mfxU32 delay = GetInitCpbRemovalDelay(eo); if ((!m_hrdInput.m_cbrFlag) || ((delay + m_hrdInput.m_clockTick* 90000) < m_hrdInput.m_cpbSize90k)) return 0; return (mfxU32)((delay + m_hrdInput.m_clockTick*90000.0 - m_hrdInput.m_cpbSize90k) / 90000.0*m_hrdInput.m_bitrate) + 16; } mfxU32 H264_HRD::GetMaxFrameSizeInBits(mfxU32 eo, bool bSEI) const { mfxU32 initDelay = GetInitCpbRemovalDelay(eo); double tai_earliest = (bSEI) ? m_trn_cur - (initDelay / 90000.0) : m_trn_cur - (m_hrdInput.m_cpbSize90k / 90000.0); double tai_cur = (!m_hrdInput.m_cbrFlag) ? std::max(m_taf_prv, tai_earliest) : m_taf_prv; mfxU32 maxFrameSize = (mfxU32)((m_trn_cur - tai_cur)*m_hrdInput.m_bitrate); return maxFrameSize; } void sHrdInput::Init(cBRCParams par) { m_cbrFlag = (par.rateControlMethod == MFX_RATECONTROL_CBR); m_bitrate = par.maxbps; m_maxCpbRemovalDelay = 1 << (h264_h265_au_cpb_removal_delay_length_minus1 + 1); m_clockTick = 90000. / par.frameRate; m_cpbSize90k = mfxU32(90000. * par.bufferSizeInBytes*8.0 / m_bitrate); m_initCpbRemovalDelay = 90000. * 8. * par.initialDelayInBytes / m_bitrate; } } #endif // defined(MFX_ENABLE_VIDEO_BRC_COMMON) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_common_decode_int.cpp000066400000000000000000000310511443134507600314350ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common_decode_int.h" #include "mfx_enc_common.h" #include "umc_va_base.h" #include "umc_defs.h" #include "umc_video_data.h" #include "umc_video_decoder.h" MFXMediaDataAdapter::MFXMediaDataAdapter(mfxBitstream *pBitstream) { Load(pBitstream); } void MFXMediaDataAdapter::Load(mfxBitstream *pBitstream) { if (!pBitstream) return; SetBufferPointer(pBitstream->Data, pBitstream->DataOffset + pBitstream->DataLength); SetDataSize(pBitstream->DataOffset + pBitstream->DataLength); MoveDataPointer(pBitstream->DataOffset); SetTime(GetUmcTimeStamp(pBitstream->TimeStamp)); SetFlags(0); if (pBitstream->DataFlag & MFX_BITSTREAM_EOS) { SetFlags(UMC::MediaData::FLAG_VIDEO_DATA_END_OF_STREAM); } else { if (!(pBitstream->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME)) { SetFlags(UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_UNIT | UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME); } } } void MFXMediaDataAdapter::Save(mfxBitstream *pBitstream) { if (!pBitstream) return; pBitstream->DataOffset = (mfxU32)((mfxU8*)GetDataPointer() - (mfxU8*)GetBufferPointer()); pBitstream->DataLength = (mfxU32)GetDataSize(); } void MFXMediaDataAdapter::SetExtBuffer(mfxExtBuffer* extbuf) { if (extbuf) SetAuxInfo(extbuf, extbuf->BufferSz, extbuf->BufferId); } mfxStatus ConvertUMCStatusToMfx(UMC::Status status) { switch((UMC::eUMC_VA_Status)status) { case UMC::UMC_ERR_FRAME_LOCKED: case UMC::UMC_ERR_DEVICE_FAILED: return MFX_ERR_DEVICE_FAILED; case UMC::UMC_ERR_DEVICE_LOST: return MFX_ERR_DEVICE_LOST; } mfxStatus sts = MFX_ERR_NONE; switch (status) { case UMC::UMC_OK: case UMC::UMC_ERR_SYNC: sts = MFX_ERR_NONE; break; case UMC::UMC_ERR_NULL_PTR: sts = MFX_ERR_NULL_PTR; break; case UMC::UMC_ERR_NOT_ENOUGH_BUFFER: sts = MFX_ERR_NOT_ENOUGH_BUFFER; break; case UMC::UMC_ERR_NOT_IMPLEMENTED: case UMC::UMC_ERR_UNSUPPORTED: sts = MFX_ERR_UNSUPPORTED; break; case UMC::UMC_ERR_ALLOC: sts = MFX_ERR_MEMORY_ALLOC; break; case UMC::UMC_ERR_LOCK: sts = MFX_ERR_LOCK_MEMORY; break; case UMC::UMC_ERR_INIT: case UMC::UMC_ERR_INVALID_PARAMS: case UMC::UMC_ERR_INVALID_STREAM: case UMC::UMC_ERR_FAILED: case UMC::UMC_ERR_TIMEOUT: sts = MFX_ERR_UNDEFINED_BEHAVIOR; break; default : sts = MFX_ERR_UNKNOWN; break; } return sts; } void ConvertMFXParamsToUMC(mfxVideoParam const* par, UMC::VideoStreamInfo *umcVideoParams) { umcVideoParams->clip_info.height = par->mfx.FrameInfo.Height; umcVideoParams->clip_info.width = par->mfx.FrameInfo.Width; umcVideoParams->disp_clip_info.height = umcVideoParams->clip_info.height; umcVideoParams->disp_clip_info.width = umcVideoParams->clip_info.width; if(par->mfx.CodecId == MFX_CODEC_JPEG && (MFX_ROTATION_90 == par->mfx.Rotation || MFX_ROTATION_270 == par->mfx.Rotation)) { std::swap(umcVideoParams->clip_info.height, umcVideoParams->clip_info.width); } umcVideoParams->color_format = ConvertFOURCCToUMCColorFormat(par->mfx.FrameInfo.FourCC); umcVideoParams->interlace_type = UMC::PROGRESSIVE; if (par->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_FIELD_BFF) umcVideoParams->interlace_type = UMC::INTERLEAVED_BOTTOM_FIELD_FIRST; if (par->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_FIELD_TFF) umcVideoParams->interlace_type = UMC::INTERLEAVED_TOP_FIELD_FIRST; umcVideoParams->stream_type = UMC::UNDEF_VIDEO; switch (par->mfx.CodecId) { case MFX_CODEC_AVC: umcVideoParams->stream_type = UMC::H264_VIDEO; break; case MFX_CODEC_HEVC: umcVideoParams->stream_type = UMC::HEVC_VIDEO; break; case MFX_CODEC_MPEG2: umcVideoParams->stream_type = UMC::MPEG2_VIDEO; break; case MFX_CODEC_VC1: umcVideoParams->stream_type = UMC::VC1_VIDEO; break; case MFX_CODEC_VP9: umcVideoParams->stream_type = UMC::VP9_VIDEO; break; case MFX_CODEC_AV1: umcVideoParams->stream_type = UMC::AV1_VIDEO; break; default: umcVideoParams->stream_type = UMC::UNDEF_VIDEO; break; } umcVideoParams->stream_subtype = UMC::UNDEF_VIDEO_SUBTYPE; umcVideoParams->framerate = (par->mfx.FrameInfo.FrameRateExtN && par->mfx.FrameInfo.FrameRateExtD)? (Ipp64f)par->mfx.FrameInfo.FrameRateExtN / par->mfx.FrameInfo.FrameRateExtD: 0; umcVideoParams->profile = ExtractProfile(par->mfx.CodecProfile); umcVideoParams->level = par->mfx.CodecLevel; } void ConvertMFXParamsToUMC(mfxVideoParam const* par, UMC::VideoDecoderParams *umcVideoParams) { ConvertMFXParamsToUMC(par, &umcVideoParams->info); umcVideoParams->numThreads = par->mfx.NumThread; // TimeStampCalc is present only in Decoding Options union, not in JPEG Decoding Options union if (par->mfx.CodecId != MFX_CODEC_JPEG) { switch(par->mfx.TimeStampCalc) { case MFX_TIMESTAMPCALC_TELECINE: umcVideoParams->lFlags |= UMC::FLAG_VDEC_TELECINE_PTS; break; case MFX_TIMESTAMPCALC_UNKNOWN: break; default: assert(false); break; } } } UMC::ColorFormat ConvertFOURCCToUMCColorFormat(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_RGB3: return UMC::RGB24; case MFX_FOURCC_BGR4: case MFX_FOURCC_RGB4: return UMC::RGB32; case MFX_FOURCC_RGB565: return UMC::RGB565; case MFX_FOURCC_RGBP: return UMC::YUV444; case MFX_FOURCC_NV12: return UMC::NV12; case MFX_FOURCC_YV12: return UMC::YV12; case MFX_FOURCC_P010: return UMC::P010; case MFX_FOURCC_P016: return UMC::P016; case MFX_FOURCC_YUY2: return UMC::YUY2; case MFX_FOURCC_UYVY: return UMC::UYVY; case MFX_FOURCC_NV16: return UMC::NV16; case MFX_FOURCC_P210: return UMC::P210; case MFX_FOURCC_Y210: return UMC::Y210; case MFX_FOURCC_Y410: return UMC::Y410; case MFX_FOURCC_Y216: return UMC::Y216; case MFX_FOURCC_Y416: return UMC::Y416; case MFX_FOURCC_AYUV: return UMC::AYUV; case MFX_FOURCC_IMC3: return UMC::IMC3; case MFX_FOURCC_YUV400: return UMC::GRAY; case MFX_FOURCC_YUV411: return UMC::YUV411; case MFX_FOURCC_YUV422H: case MFX_FOURCC_YUV422V: return UMC::YUY2; case MFX_FOURCC_YUV444: return UMC::YUV444; default: assert(!"Unknown FOURCC"); return UMC::NV12; } } mfxU32 ConvertUMCColorFormatToFOURCC(UMC::ColorFormat format) { switch (format) { case UMC::NV12: return MFX_FOURCC_NV12; case UMC::RGB32: return MFX_FOURCC_RGB4; case UMC::RGB24: return MFX_FOURCC_RGB3; case UMC::YUY2: return MFX_FOURCC_YUY2; case UMC::YV12: return MFX_FOURCC_YV12; case UMC::P010: return MFX_FOURCC_P010; case UMC::P210: return MFX_FOURCC_P210; case UMC::Y210: return MFX_FOURCC_Y210; case UMC::Y410: return MFX_FOURCC_Y410; case UMC::P016: return MFX_FOURCC_P016; case UMC::Y216: return MFX_FOURCC_Y216; case UMC::Y416: return MFX_FOURCC_Y416; case UMC::YUV444A: case UMC::AYUV: return MFX_FOURCC_AYUV; case UMC::IMC3: return MFX_FOURCC_IMC3; case UMC::YUV411: return MFX_FOURCC_YUV411; case UMC::YUV444: return MFX_FOURCC_YUV444; case UMC::UYVY: return MFX_FOURCC_UYVY; case UMC::GRAY: return MFX_FOURCC_YUV400; default: assert(!"Unknown color format"); return MFX_FOURCC_NV12; } } inline mfxU32 ConvertUMCStreamTypeToCodec(UMC::VideoStreamType type) { switch (type) { case UMC::MPEG2_VIDEO: return MFX_CODEC_MPEG2; case UMC::VC1_VIDEO: return MFX_CODEC_VC1; case UMC::H264_VIDEO: return MFX_CODEC_AVC; case UMC::HEVC_VIDEO: return MFX_CODEC_HEVC; case UMC::VP9_VIDEO: return MFX_CODEC_VP9; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case UMC::AV1_VIDEO: return MFX_CODEC_AV1; #endif default: assert(!"Unknown stream type"); return 0; } } void ConvertUMCParamsToMFX(UMC::VideoStreamInfo const* si, mfxVideoParam* par) { par->mfx.CodecId = ConvertUMCStreamTypeToCodec(si->stream_type); par->mfx.CodecProfile = mfxU16(si->profile); par->mfx.CodecLevel = mfxU16(si->level); par->mfx.FrameInfo.Height = mfx::align2_value(mfxU16(si->clip_info.height), 16); par->mfx.FrameInfo.Width = mfx::align2_value(mfxU16(si->clip_info.width), 16); par->mfx.FrameInfo.CropX = par->mfx.FrameInfo.CropY = 0; par->mfx.FrameInfo.CropH = mfxU16(si->disp_clip_info.height); par->mfx.FrameInfo.CropW = mfxU16(si->disp_clip_info.width); par->mfx.FrameInfo.BitDepthLuma = 0; par->mfx.FrameInfo.BitDepthChroma = 0; par->mfx.FrameInfo.FourCC = ConvertUMCColorFormatToFOURCC(si->color_format); switch (si->interlace_type) { case UMC::PROGRESSIVE: par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; break; case UMC::INTERLEAVED_BOTTOM_FIELD_FIRST: par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_BFF; break; case UMC::INTERLEAVED_TOP_FIELD_FIRST: par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_TFF; break; default: par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; } // set default framerate 30 if si->framerate == 0 par->mfx.FrameInfo.FrameRateExtN = si->framerate < 1e-15 ? 30 : (mfxU32)(si->framerate); par->mfx.FrameInfo.FrameRateExtD = 1; par->mfx.FrameInfo.AspectRatioW = mfxU16(si->aspect_ratio_width); par->mfx.FrameInfo.AspectRatioH = mfxU16(si->aspect_ratio_height); } void ConvertUMCParamsToMFX(UMC::VideoDecoderParams const* vp, mfxVideoParam* par) { ConvertUMCParamsToMFX(&vp->info, par); par->mfx.NumThread = mfxU16(vp->numThreads); par->mfx.TimeStampCalc = mfxU16( vp->lFlags & UMC::FLAG_VDEC_TELECINE_PTS ? MFX_TIMESTAMPCALC_TELECINE : MFX_TIMESTAMPCALC_UNKNOWN ); } bool IsNeedChangeVideoParam(mfxVideoParam *) { return false; } void RefCounter::IncrementReference() const { m_refCounter++; } void RefCounter::DecrementReference() { m_refCounter--; assert(m_refCounter >= 0); if (!m_refCounter) { Free(); } } mfxU16 FourCcBitDepth(mfxU32 fourCC) { mfxU16 bitDepth = 0; switch (fourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: bitDepth = 8; break; case MFX_FOURCC_P010: case MFX_FOURCC_P210: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: bitDepth = 10; break; case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: bitDepth = 12; break; default: bitDepth = 0; } return bitDepth; } bool InitBitDepthFields(mfxFrameInfo *info) { if (info->BitDepthLuma == 0) { info->BitDepthLuma = FourCcBitDepth(info->FourCC); } if (info->BitDepthChroma == 0) { info->BitDepthChroma = info->BitDepthLuma; } return ((info->BitDepthLuma != 0) && (info->BitDepthChroma != 0)); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_common_int.cpp000066400000000000000000001156471443134507600301500ustar00rootroot00000000000000// Copyright (c) 2009-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common_int.h" #include "mfx_ext_buffers.h" #include "mfx_utils.h" #include #include #include #include #define MFX_RT_PLATFORM_METEORLAKE 51 mfxExtBuffer* GetExtendedBuffer(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id) { if (extBuf != 0) { for (mfxU16 i = 0; i < numExtBuf; i++) { if (extBuf[i] != 0 && extBuf[i]->BufferId == id) // assuming aligned buffers return (extBuf[i]); } } return 0; } mfxExtBuffer* GetExtendedBufferInternal(mfxExtBuffer** extBuf, mfxU32 numExtBuf, mfxU32 id) { mfxExtBuffer* result = GetExtendedBuffer(extBuf, numExtBuf, id); if (!result) throw std::logic_error(": no external buffer found"); return result; } mfxStatus CheckFrameInfoCommon(mfxFrameInfo *info, mfxU32 codecId) { MFX_CHECK_NULL_PTR1(info); MFX_CHECK(info->Width && info->Width % 16 == 0, MFX_ERR_INVALID_VIDEO_PARAM); if (codecId == MFX_CODEC_JPEG) { MFX_CHECK(info->Height && info->Height % 8 == 0, MFX_ERR_INVALID_VIDEO_PARAM); } else { MFX_CHECK(info->Height && info->Height % 16 == 0, MFX_ERR_INVALID_VIDEO_PARAM); } switch (info->FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_RGB3: case MFX_FOURCC_RGB4: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_P010: case MFX_FOURCC_NV16: case MFX_FOURCC_P210: case MFX_FOURCC_AYUV: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: case MFX_FOURCC_ABGR16F: break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } MFX_CHECK((!info->BitDepthLuma || (info->BitDepthLuma >= 8)) && (!info->BitDepthChroma || (info->BitDepthChroma >= 8)) , MFX_ERR_INVALID_VIDEO_PARAM); if (info->BitDepthLuma > 8 || info->BitDepthChroma > 8) { switch (info->FourCC) { case MFX_FOURCC_P010: case MFX_FOURCC_P210: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } } if (info->Shift) { if ( info->FourCC != MFX_FOURCC_P010 && info->FourCC != MFX_FOURCC_P210 && info->FourCC != MFX_FOURCC_Y210 && info->FourCC != MFX_FOURCC_P016 && info->FourCC != MFX_FOURCC_Y216 && info->FourCC != MFX_FOURCC_Y416) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } MFX_CHECK(info->ChromaFormat <= MFX_CHROMAFORMAT_YUV444, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!(info->FrameRateExtN != 0 && info->FrameRateExtD == 0), MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK((!info->AspectRatioW && !info->AspectRatioH) || (info->AspectRatioW && info->AspectRatioH), MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info) { if (info->CropX > info->Width) return MFX_ERR_INVALID_VIDEO_PARAM; if (info->CropY > info->Height) return MFX_ERR_INVALID_VIDEO_PARAM; if (info->CropX + info->CropW > info->Width) return MFX_ERR_INVALID_VIDEO_PARAM; if (info->CropY + info->CropH > info->Height) return MFX_ERR_INVALID_VIDEO_PARAM; switch (info->PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: break; default: case MFX_PICSTRUCT_FIELD_REPEATED: case MFX_PICSTRUCT_FRAME_DOUBLING: case MFX_PICSTRUCT_FRAME_TRIPLING: return MFX_ERR_INVALID_VIDEO_PARAM; } // both zero or not zero if ((info->AspectRatioW || info->AspectRatioH) && !(info->AspectRatioW && info->AspectRatioH)) return MFX_ERR_INVALID_VIDEO_PARAM; if ((info->FrameRateExtN || info->FrameRateExtD) && !(info->FrameRateExtN && info->FrameRateExtD)) return MFX_ERR_INVALID_VIDEO_PARAM; return MFX_ERR_NONE; } mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId) { mfxStatus sts = CheckFrameInfoCommon(info, codecId); MFX_CHECK_STS(sts); switch(info->FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_P010: case MFX_FOURCC_P016: if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV420) return MFX_ERR_NONE; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); case MFX_FOURCC_YUY2: case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV422) return MFX_ERR_NONE; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); case MFX_FOURCC_AYUV: case MFX_FOURCC_Y410: case MFX_FOURCC_Y416: case MFX_FOURCC_RGB4: if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV444) return MFX_ERR_NONE; MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } } mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId) { mfxStatus sts = CheckFrameInfoCommon(info, codecId); MFX_CHECK_STS(sts); switch (codecId) { case MFX_CODEC_JPEG: if (info->FourCC != MFX_FOURCC_NV12 && info->FourCC != MFX_FOURCC_RGB4 && info->FourCC != MFX_FOURCC_YUY2) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_VP8: MFX_CHECK(info->FourCC == MFX_FOURCC_NV12 || info->FourCC == MFX_FOURCC_YV12, MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_VP9: if (info->FourCC != MFX_FOURCC_NV12 && info->FourCC != MFX_FOURCC_AYUV && info->FourCC != MFX_FOURCC_P010 && info->FourCC != MFX_FOURCC_Y410 && info->FourCC != MFX_FOURCC_P016 && info->FourCC != MFX_FOURCC_Y416) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_AVC: if (info->FourCC != MFX_FOURCC_NV12 && info->FourCC != MFX_FOURCC_P010 && info->FourCC != MFX_FOURCC_NV16 && info->FourCC != MFX_FOURCC_P210) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_HEVC: if (info->FourCC != MFX_FOURCC_NV12 && info->FourCC != MFX_FOURCC_YUY2 && info->FourCC != MFX_FOURCC_P010 && info->FourCC != MFX_FOURCC_NV16 && info->FourCC != MFX_FOURCC_P210 && info->FourCC != MFX_FOURCC_AYUV && info->FourCC != MFX_FOURCC_Y210 && info->FourCC != MFX_FOURCC_Y410 && info->FourCC != MFX_FOURCC_P016 && info->FourCC != MFX_FOURCC_Y216 && info->FourCC != MFX_FOURCC_Y416 ) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; #if defined(MFX_ENABLE_AV1_VIDEO_CODEC) case MFX_CODEC_AV1: if ( info->FourCC != MFX_FOURCC_NV12 && info->FourCC != MFX_FOURCC_YV12 && info->FourCC != MFX_FOURCC_P010 && info->FourCC != MFX_FOURCC_AYUV && info->FourCC != MFX_FOURCC_Y410) MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; #endif default: MFX_CHECK(info->FourCC == MFX_FOURCC_NV12, MFX_ERR_INVALID_VIDEO_PARAM); break; } switch (codecId) { case MFX_CODEC_JPEG: MFX_CHECK( info->ChromaFormat == MFX_CHROMAFORMAT_YUV420 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV444 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV400 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV422H , MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_AVC: MFX_CHECK( info->ChromaFormat == MFX_CHROMAFORMAT_YUV420 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV422 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV400 , MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_CODEC_HEVC: case MFX_CODEC_VP9: MFX_CHECK( info->ChromaFormat == MFX_CHROMAFORMAT_YUV420 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV400 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV422 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV444 , MFX_ERR_INVALID_VIDEO_PARAM); break; default: MFX_CHECK(info->ChromaFormat == MFX_CHROMAFORMAT_YUV420 || info->ChromaFormat == MFX_CHROMAFORMAT_YUV400, MFX_ERR_INVALID_VIDEO_PARAM); break; } switch (codecId) { case MFX_CODEC_HEVC: break; default: if (info->FourCC == MFX_FOURCC_P010 || info->FourCC == MFX_FOURCC_P210 || info->FourCC == MFX_FOURCC_Y210 || info->FourCC == MFX_FOURCC_P016 || info->FourCC == MFX_FOURCC_Y216 || info->FourCC == MFX_FOURCC_Y416) { MFX_CHECK(info->Shift == 1, MFX_ERR_INVALID_VIDEO_PARAM); } break; } return MFX_ERR_NONE; } mfxStatus UpdateCscOutputFormat(mfxVideoParam *par, mfxFrameAllocRequest *request) { #ifdef MFX_DEC_VIDEO_POSTPROCESS_DISABLE (void)par; (void)request; #else mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing && videoProcessing->Out.FourCC != par->mfx.FrameInfo.FourCC) { request->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; request->Info.FourCC = videoProcessing->Out.FourCC; switch (videoProcessing->Out.FourCC) { // if is 8 bit, shift value has to be 0 case MFX_FOURCC_NV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: request->Info.BitDepthLuma = 8; request->Info.Shift = 0; break; // 10 bit case MFX_FOURCC_P010: case MFX_FOURCC_Y210: request->Info.BitDepthLuma = 10; request->Info.Shift = 1; break; case MFX_FOURCC_Y410: request->Info.BitDepthLuma = 10; request->Info.Shift = 0; break; // 12 bit case MFX_FOURCC_P016: case MFX_FOURCC_Y416: case MFX_FOURCC_Y216: request->Info.BitDepthLuma = 12; request->Info.Shift = 1; break; case MFX_FOURCC_RGB4: request->Info.BitDepthLuma = 0; request->Info.Shift = 0; break; default: return MFX_ERR_UNSUPPORTED; } request->Info.BitDepthChroma = request->Info.BitDepthLuma; } #endif // !MFX_DEC_VIDEO_POSTPROCESS_DISABLE return MFX_ERR_NONE; } static mfxStatus CheckVideoParamCommon(mfxVideoParam *in, eMFXHWType type) { MFX_CHECK_NULL_PTR1(in); mfxStatus sts = CheckFrameInfoCodecs(&in->mfx.FrameInfo, in->mfx.CodecId); MFX_CHECK_STS(sts); if (in->Protected) { MFX_CHECK(type != MFX_HW_UNKNOWN && IS_PROTECTION_ANY(in->Protected), MFX_ERR_INVALID_VIDEO_PARAM); } switch (in->mfx.CodecId) { case MFX_CODEC_AVC: case MFX_CODEC_HEVC: case MFX_CODEC_MPEG2: case MFX_CODEC_VC1: case MFX_CODEC_JPEG: case MFX_CODEC_VP8: case MFX_CODEC_VP9: #if defined(MFX_ENABLE_AV1_VIDEO_CODEC) case MFX_CODEC_AV1: #endif break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } MFX_CHECK(in->IOPattern, MFX_ERR_INVALID_VIDEO_PARAM); if ( in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) { if (type == MFX_HW_UNKNOWN) { MFX_CHECK(in->mfx.FrameInfo.Shift == 0, MFX_ERR_INVALID_VIDEO_PARAM); } else { MFX_CHECK(!(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || in->mfx.FrameInfo.Shift == 1, MFX_ERR_INVALID_VIDEO_PARAM); } } return MFX_ERR_NONE; } mfxStatus CheckVideoParamDecoders(mfxVideoParam *in, eMFXHWType type) { mfxStatus sts = CheckVideoParamCommon(in, type); MFX_CHECK(sts >= MFX_ERR_NONE, sts); auto const supportedMemoryType = (in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); MFX_CHECK(supportedMemoryType, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(!(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) || !(in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) , MFX_ERR_INVALID_VIDEO_PARAM); sts = CheckDecodersExtendedBuffers(in); MFX_CHECK(sts >= MFX_ERR_NONE, sts); return MFX_ERR_NONE; } mfxStatus CheckVideoParamEncoders(mfxVideoParam *in, eMFXHWType type) { mfxStatus sts = CheckFrameInfoEncoders(&in->mfx.FrameInfo); MFX_CHECK(sts >= MFX_ERR_NONE, sts); sts = CheckVideoParamCommon(in, type); MFX_CHECK(sts >= MFX_ERR_NONE, sts); MFX_CHECK(!in->Protected || (in->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY), MFX_ERR_INVALID_VIDEO_PARAM); return MFX_ERR_NONE; } mfxStatus CheckBitstream(const mfxBitstream *bs) { if (!bs || !bs->Data) return MFX_ERR_NULL_PTR; if (bs->DataOffset + bs->DataLength > bs->MaxLength) return MFX_ERR_UNDEFINED_BEHAVIOR; return MFX_ERR_NONE; } /* Check if pointers required for given FOURCC is NOT null */ mfxStatus CheckFramePointers(mfxFrameInfo const& info, mfxFrameData const& data) { switch (info.FourCC) { case MFX_FOURCC_A2RGB10: MFX_CHECK(data.B, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_Y410: MFX_CHECK(data.Y410, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_Y210: MFX_CHECK(data.Y16 && data.U16 && data.V16, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_P8: case MFX_FOURCC_P8_TEXTURE: case MFX_FOURCC_R16: MFX_CHECK(data.Y, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: case MFX_FOURCC_P010: case MFX_FOURCC_P016: case MFX_FOURCC_P210: MFX_CHECK(data.Y && data.UV, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_Y216: MFX_CHECK(data.Y16 && data.U16 && data.V16, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_Y416: MFX_CHECK(data.Y16 && data.U16 && data.V16 && data.A , MFX_ERR_UNDEFINED_BEHAVIOR); break; #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: MFX_CHECK(data.R && data.G && data.B, MFX_ERR_UNDEFINED_BEHAVIOR); break; #endif // MFX_ENABLE_FOURCC_RGB565 #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_RGB3: MFX_CHECK(data.R && data.G && data.B, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_AYUV: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_ABGR16F: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: MFX_CHECK(data.R && data.G && data.B && data.A, MFX_ERR_UNDEFINED_BEHAVIOR); break; case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_I420: default: MFX_CHECK(data.Y && data.U && data.V, MFX_ERR_UNDEFINED_BEHAVIOR); break; } return MFX_ERR_NONE; } mfxStatus CheckFrameData(const mfxFrameSurface1 *surface) { if (!surface) return MFX_ERR_NULL_PTR; if (surface->Data.MemId) return MFX_ERR_NONE; mfxStatus sts; return sts = CheckFramePointers(surface->Info, surface->Data); } mfxStatus CheckDecodersExtendedBuffers(mfxVideoParam const* par) { static const mfxU32 g_commonSupportedExtBuffers[] = { #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK, #endif MFX_EXTBUFF_ALLOCATION_HINTS }; static const mfxU32 g_decoderSupportedExtBuffersAVC[] = { MFX_EXTBUFF_MVC_SEQ_DESC, MFX_EXTBUFF_MVC_TARGET_VIEWS, #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE MFX_EXTBUFF_DEC_VIDEO_PROCESSING, #endif }; static const mfxU32 g_decoderSupportedExtBuffersHEVC[] = { MFX_EXTBUFF_HEVC_PARAM #ifdef MFX_EXTBUFF_FORCE_PRIVATE_DDI_ENABLE , MFX_EXTBUFF_FORCE_PRIVATE_DDI #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE ,MFX_EXTBUFF_DEC_VIDEO_PROCESSING #endif }; static const mfxU32 g_decoderSupportedExtBuffersVC1[] = { 0 //Fallback }; static const mfxU32 g_decoderSupportedExtBuffersVP9[] = { #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK, #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE MFX_EXTBUFF_DEC_VIDEO_PROCESSING, #endif 0 //Fallback }; static const mfxU32 g_decoderSupportedExtBuffersMJPEG[] = {MFX_EXTBUFF_JPEG_HUFFMAN, MFX_EXTBUFF_DEC_VIDEO_PROCESSING, MFX_EXTBUFF_JPEG_QT}; static const mfxU32 g_decoderSupportedExtBuffersAV1[] = { #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE MFX_EXTBUFF_DEC_VIDEO_PROCESSING, #endif MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM, 0 //Fallback }; const mfxU32 *supported_buffers = 0; mfxU32 numberOfSupported = 0; if (par->mfx.CodecId == MFX_CODEC_AVC) { supported_buffers = g_decoderSupportedExtBuffersAVC; numberOfSupported = sizeof(g_decoderSupportedExtBuffersAVC) / sizeof(g_decoderSupportedExtBuffersAVC[0]); } else if (par->mfx.CodecId == MFX_CODEC_VC1 || par->mfx.CodecId == MFX_CODEC_MPEG2) { supported_buffers = g_decoderSupportedExtBuffersVC1; numberOfSupported = sizeof(g_decoderSupportedExtBuffersVC1) / sizeof(g_decoderSupportedExtBuffersVC1[0]); } else if (par->mfx.CodecId == MFX_CODEC_HEVC) { supported_buffers = g_decoderSupportedExtBuffersHEVC; numberOfSupported = sizeof(g_decoderSupportedExtBuffersHEVC) / sizeof(g_decoderSupportedExtBuffersHEVC[0]); } else if (par->mfx.CodecId == MFX_CODEC_JPEG) { supported_buffers = g_decoderSupportedExtBuffersMJPEG; numberOfSupported = sizeof(g_decoderSupportedExtBuffersMJPEG) / sizeof(g_decoderSupportedExtBuffersMJPEG[0]); } else if (par->mfx.CodecId == MFX_CODEC_VP9) { supported_buffers = g_decoderSupportedExtBuffersVP9; numberOfSupported = sizeof(g_decoderSupportedExtBuffersVP9) / sizeof(g_decoderSupportedExtBuffersVP9[0]); } else if (par->mfx.CodecId == MFX_CODEC_AV1) { supported_buffers = g_decoderSupportedExtBuffersAV1; numberOfSupported = sizeof(g_decoderSupportedExtBuffersAV1) / sizeof(g_decoderSupportedExtBuffersAV1[0]); } else { supported_buffers = g_commonSupportedExtBuffers; numberOfSupported = sizeof(g_commonSupportedExtBuffers) / sizeof(g_commonSupportedExtBuffers[0]); } if (!supported_buffers) return MFX_ERR_NONE; const mfxU32 *common_supported_buffers = g_commonSupportedExtBuffers; mfxU32 common_numberOfSupported = sizeof(g_commonSupportedExtBuffers) / sizeof(g_commonSupportedExtBuffers[0]); for (mfxU32 i = 0; i < par->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(par->ExtParam[i]); bool is_known = false; for (mfxU32 j = 0; j < numberOfSupported; ++j) { if (supported_buffers[j] && par->ExtParam[i]->BufferId == supported_buffers[j]) { is_known = true; break; } } for (mfxU32 j = 0; j < common_numberOfSupported; ++j) { if (par->ExtParam[i]->BufferId == common_supported_buffers[j]) { is_known = true; break; } } MFX_CHECK(is_known, MFX_ERR_UNSUPPORTED); if (par->ExtParam[i]->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS) { MFX_SAFE_CALL(CheckAllocationHintsBuffer(*reinterpret_cast(par->ExtParam[i]))); } } return MFX_ERR_NONE; } // converts u32 nom and denom to packed u16+u16, used in va mfxStatus PackMfxFrameRate(mfxU32 nom, mfxU32 den, mfxU32& packed) { mfxStatus sts = MFX_ERR_NONE; if (!nom) { packed = 0; return sts; } if (!den) // denominator assumed 1 if is 0 den = 1; if ((nom | den) >> 16) // don't fit to u16 { mfxU32 gcd = nom; // will be greatest common divisor mfxU32 rem = den; while (rem > 0) { mfxU32 oldrem = rem; rem = gcd % rem; gcd = oldrem; } if (gcd > 1) { nom /= gcd; den /= gcd; } if ((nom | den) >> 16) // still don't fit to u16 - lose precision { if (nom > den) // make nom 0xffff for max precision { den = (mfxU32)((mfxF64)den * 0xffff / nom + .5); if (!den) den = 1; nom = 0xffff; } else { nom = (mfxU32)((mfxF64)nom * 0xffff / den + .5); den = 0xffff; } sts = MFX_WRN_VIDEO_PARAM_CHANGED; } } packed = (den << 16) | nom; return sts; } ////////////////////////////////////////////////////////////////////////////////////////////////////////// // Extended Buffer class ////////////////////////////////////////////////////////////////////////////////////////////////////////// ExtendedBuffer::ExtendedBuffer() { } ExtendedBuffer::~ExtendedBuffer() { Release(); } void ExtendedBuffer::Release() { if(m_buffers.empty()) return; BuffersList::iterator iter = m_buffers.begin(); BuffersList::iterator iter_end = m_buffers.end(); for( ; iter != iter_end; ++iter) { mfxU8 * buffer = (mfxU8 *)*iter; delete[] buffer; } m_buffers.clear(); } size_t ExtendedBuffer::GetCount() const { return m_buffers.size(); } void ExtendedBuffer::AddBuffer(mfxExtBuffer * in) { if (GetBufferByIdInternal(in->BufferId)) return; mfxExtBuffer * buffer = (mfxExtBuffer *)(new mfxU8[in->BufferSz]); memset(buffer, 0, in->BufferSz); buffer->BufferSz = in->BufferSz; buffer->BufferId = in->BufferId; AddBufferInternal(buffer); } void ExtendedBuffer::AddBufferInternal(mfxExtBuffer * buffer) { m_buffers.push_back(buffer); } mfxExtBuffer ** ExtendedBuffer::GetBuffers() { return &m_buffers[0]; } mfxExtBuffer * ExtendedBuffer::GetBufferByIdInternal(mfxU32 id) { BuffersList::iterator iter = m_buffers.begin(); BuffersList::iterator iter_end = m_buffers.end(); for( ; iter != iter_end; ++iter) { mfxExtBuffer * buffer = *iter; if (buffer->BufferId == id) return buffer; } return 0; } mfxExtBuffer * ExtendedBuffer::GetBufferByPositionInternal(mfxU32 pos) { if (pos >= m_buffers.size()) return 0; return m_buffers[pos]; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// // mfxVideoParamWrapper implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////// mfxVideoParamWrapper::mfxVideoParamWrapper() : m_mvcSequenceBuffer(0) { } mfxVideoParamWrapper::mfxVideoParamWrapper(const mfxVideoParam & par) : m_mvcSequenceBuffer(0) { CopyVideoParam(par); } mfxVideoParamWrapper::~mfxVideoParamWrapper() { delete[] m_mvcSequenceBuffer; } mfxVideoParamWrapper & mfxVideoParamWrapper::operator = (const mfxVideoParam & par) { CopyVideoParam(par); return *this; } mfxVideoParamWrapper & mfxVideoParamWrapper::operator = (const mfxVideoParamWrapper & par) { return mfxVideoParamWrapper::operator = ( *((const mfxVideoParam *)&par)); } bool mfxVideoParamWrapper::CreateExtendedBuffer(mfxU32 bufferId) { if (m_buffers.GetBufferById(bufferId)) return true; switch(bufferId) { case MFX_EXTBUFF_VIDEO_SIGNAL_INFO: m_buffers.AddTypedBuffer(bufferId); break; case MFX_EXTBUFF_CODING_OPTION_SPSPPS: m_buffers.AddTypedBuffer(bufferId); break; case MFX_EXTBUFF_HEVC_PARAM: m_buffers.AddTypedBuffer(bufferId); break; case MFX_EXTBUFF_CODING_OPTION: m_buffers.AddTypedBuffer(bufferId); break; case MFX_EXTBUFF_CHROMA_LOC_INFO: m_buffers.AddTypedBuffer(bufferId); break; default: assert(false); return false; } NumExtParam = (mfxU16)m_buffers.GetCount(); ExtParam = NumExtParam ? m_buffers.GetBuffers() : 0; return true; } void mfxVideoParamWrapper::CopyVideoParam(const mfxVideoParam & par) { mfxVideoParam * temp = this; *temp = par; this->NumExtParam = 0; this->ExtParam = 0; for (mfxU32 i = 0; i < par.NumExtParam; i++) { switch(par.ExtParam[i]->BufferId) { case MFX_EXTBUFF_MVC_SEQ_DESC: { mfxExtMVCSeqDesc * mvcPoints = (mfxExtMVCSeqDesc *)GetExtendedBufferInternal(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); m_buffers.AddTypedBuffer(MFX_EXTBUFF_MVC_SEQ_DESC); mfxExtMVCSeqDesc * points = m_buffers.GetBufferById(MFX_EXTBUFF_MVC_SEQ_DESC); size_t size = mvcPoints->NumView * sizeof(mfxMVCViewDependency) + mvcPoints->NumOP * sizeof(mfxMVCOperationPoint) + mvcPoints->NumViewId * sizeof(mfxU16); if (!m_mvcSequenceBuffer) m_mvcSequenceBuffer = new mfxU8[size]; else { delete[] m_mvcSequenceBuffer; m_mvcSequenceBuffer = new mfxU8[size]; } mfxU8 * ptr = m_mvcSequenceBuffer; if (points) { points->NumView = points->NumViewAlloc = mvcPoints->NumView; points->View = (mfxMVCViewDependency * )ptr; std::copy(mvcPoints->View, mvcPoints->View + mvcPoints->NumView, points->View); ptr += mvcPoints->NumView * sizeof(mfxMVCViewDependency); points->NumView = points->NumViewAlloc = mvcPoints->NumView; points->ViewId = (mfxU16 *)ptr; std::copy(mvcPoints->ViewId, mvcPoints->ViewId + mvcPoints->NumViewId, points->ViewId); ptr += mvcPoints->NumViewId * sizeof(mfxU16); points->NumOP = points->NumOPAlloc = mvcPoints->NumOP; points->OP = (mfxMVCOperationPoint *)ptr; std::copy(mvcPoints->OP, mvcPoints->OP + mvcPoints->NumOP, points->OP); mfxU16 * targetView = points->ViewId; for (mfxU32 j = 0; j < points->NumOP; j++) { points->OP[j].TargetViewId = targetView; targetView += points->OP[j].NumTargetViews; } } } break; #ifdef MFX_EXTBUFF_FORCE_PRIVATE_DDI_ENABLE case MFX_EXTBUFF_FORCE_PRIVATE_DDI: #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE case MFX_EXTBUFF_DEC_VIDEO_PROCESSING: #endif case MFX_EXTBUFF_MVC_TARGET_VIEWS: case MFX_EXTBUFF_VIDEO_SIGNAL_INFO: #if defined(MFX_ENABLE_SVC_VIDEO_DECODE) case MFX_EXTBUFF_SVC_SEQ_DESC: case MFX_EXTBUFF_SVC_TARGET_LAYER: #endif #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE case MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK: #endif case MFX_EXTBUFF_JPEG_QT: case MFX_EXTBUFF_JPEG_HUFFMAN: case MFX_EXTBUFF_HEVC_PARAM: default: { void * in = GetExtendedBufferInternal(par.ExtParam, par.NumExtParam, par.ExtParam[i]->BufferId); m_buffers.AddBuffer(par.ExtParam[i]); mfxExtBuffer * out = m_buffers.GetBufferById(par.ExtParam[i]->BufferId); if (NULL == out) { assert(false); throw UMC::UMC_ERR_FAILED; } mfxU8 *src = reinterpret_cast(in), *dst = reinterpret_cast(out); std::copy(src, src + par.ExtParam[i]->BufferSz, dst); } break; }; } NumExtParam = (mfxU16)m_buffers.GetCount(); ExtParam = NumExtParam ? m_buffers.GetBuffers() : 0; } inline mfxU32 GetMinPitch(mfxU32 fourcc, mfxU16 width) { switch (fourcc) { case MFX_FOURCC_P8: case MFX_FOURCC_P8_TEXTURE: case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_I420: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_NV16: return width * 1; #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: return width * 2; #endif // MFX_ENABLE_FOURCC_RGB565 case MFX_FOURCC_R16: return width * 2; case MFX_FOURCC_RGB3: return width * 3; case MFX_FOURCC_AYUV: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_A2RGB10: return width * 4; case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: case MFX_FOURCC_ABGR16F: return width * 8; case MFX_FOURCC_YUY2: case MFX_FOURCC_UYVY: return width * 2; case MFX_FOURCC_P010: case MFX_FOURCC_P016: case MFX_FOURCC_P210: return width * 2; case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: return width * 4; case MFX_FOURCC_Y216: return width * 4; case MFX_FOURCC_Y416: return width * 8; } return 0; } mfxU8* GetFramePointer(mfxU32 fourcc, mfxFrameData const& data) { switch (fourcc) { case MFX_FOURCC_RGB3: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: return std::min({data.R, data.G, data.B}); break; #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: return data.R; break; #endif // MFX_ENABLE_FOURCC_RGB565 case MFX_FOURCC_R16: return reinterpret_cast(data.Y16); break; case MFX_FOURCC_AYUV: return data.V; break; case MFX_FOURCC_UYVY: return data.U; break; case MFX_FOURCC_A2RGB10: return data.B; break; case MFX_FOURCC_Y410: return reinterpret_cast(data.Y410); break; case MFX_FOURCC_Y416: return reinterpret_cast(data.U16); break; case MFX_FOURCC_ABGR16F: return reinterpret_cast(data.ABGRFP16); break; default: return data.Y; } } mfxU8* GetFramePointer(const mfxFrameSurface1& surf) { return GetFramePointer(surf.Info.FourCC, surf.Data); } mfxStatus GetFramePointerChecked(mfxFrameInfo const& info, mfxFrameData const& data, mfxU8** ptr) { MFX_CHECK(ptr, MFX_ERR_UNDEFINED_BEHAVIOR); *ptr = GetFramePointer(info.FourCC, data); if (!*ptr) return MFX_ERR_NONE; mfxStatus sts = CheckFramePointers(info, data); MFX_CHECK_STS(sts); mfxU32 const pitch = (data.PitchHigh << 16) | data.PitchLow; mfxU32 const min_pitch = GetMinPitch(info.FourCC, info.Width); MFX_CHECK(min_pitch, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(pitch >= min_pitch, MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_ERR_NONE; } bool IsSurfaceEmpty(const mfxFrameSurface1 & surface) { return !(surface.Data.MemId || surface.Data.Y || surface.Data.U || surface.Data.V || surface.Data.A); } mfxFrameSurface1 MakeSurface(mfxFrameInfo const& fi, const mfxFrameSurface1& surface) { mfxFrameSurface1 tmpSrf{}; tmpSrf.Info = fi; tmpSrf.Data = surface.Data; tmpSrf.FrameInterface = surface.FrameInterface; tmpSrf.Version = surface.Version; return tmpSrf; } mfxFrameSurface1 MakeSurface(mfxFrameInfo const& fi, mfxMemId mid) { mfxFrameSurface1 surface{}; surface.Info = fi; surface.Data.MemId = mid; return surface; } mfxU16 BitDepthFromFourcc(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: case MFX_FOURCC_UYVY: return 8; case MFX_FOURCC_P010: case MFX_FOURCC_P210: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: return 10; case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: return 12; case MFX_FOURCC_ABGR16F: return 16; // RGB formats #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: #endif case MFX_FOURCC_RGB3: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_A2RGB10: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_R16: // Plain data formats case MFX_FOURCC_P8: case MFX_FOURCC_P8_TEXTURE: default: return 0; } } mfxU16 ChromaFormatFromFourcc(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_P010: case MFX_FOURCC_P016: return MFX_CHROMAFORMAT_YUV420; case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: case MFX_FOURCC_YUY2: case MFX_FOURCC_UYVY: case MFX_FOURCC_NV16: case MFX_FOURCC_P210: return MFX_CHROMAFORMAT_YUV422H; case MFX_FOURCC_AYUV: case MFX_FOURCC_Y410: case MFX_FOURCC_Y416: return MFX_CHROMAFORMAT_YUV444; // RGB formats #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: #endif case MFX_FOURCC_RGB3: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_A2RGB10: case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: case MFX_FOURCC_AYUV_RGB4: case MFX_FOURCC_R16: // Plain data formats case MFX_FOURCC_P8: case MFX_FOURCC_P8_TEXTURE: default: return 0; } } mfxPlatform MakePlatform(eMFXHWType type, mfxU16 device_id) { mfxPlatform platform = {}; platform.MediaAdapterType = MFX_MEDIA_INTEGRATED; switch (type) { case MFX_HW_SNB : platform.CodeName = MFX_PLATFORM_SANDYBRIDGE; break; case MFX_HW_IVB : platform.CodeName = MFX_PLATFORM_IVYBRIDGE; break; case MFX_HW_HSW: case MFX_HW_HSW_ULT: platform.CodeName = MFX_PLATFORM_HASWELL; break; case MFX_HW_VLV : platform.CodeName = MFX_PLATFORM_BAYTRAIL; break; case MFX_HW_BDW : platform.CodeName = MFX_PLATFORM_BROADWELL; break; case MFX_HW_CHT : platform.CodeName = MFX_PLATFORM_CHERRYTRAIL; break; case MFX_HW_SCL : platform.CodeName = MFX_PLATFORM_SKYLAKE; break; case MFX_HW_APL : platform.CodeName = MFX_PLATFORM_APOLLOLAKE; break; case MFX_HW_KBL : platform.CodeName = MFX_PLATFORM_KABYLAKE; break; case MFX_HW_GLK : platform.CodeName = MFX_PLATFORM_GEMINILAKE; break; case MFX_HW_CFL : platform.CodeName = MFX_PLATFORM_COFFEELAKE; break; case MFX_HW_CNL : platform.CodeName = MFX_PLATFORM_CANNONLAKE; break; case MFX_HW_ICL : case MFX_HW_ICL_LP : platform.CodeName = MFX_PLATFORM_ICELAKE; break; case MFX_HW_EHL : platform.CodeName = MFX_PLATFORM_ELKHARTLAKE; break; case MFX_HW_JSL : platform.CodeName = MFX_PLATFORM_JASPERLAKE; break; case MFX_HW_RKL : case MFX_HW_TGL_LP : platform.CodeName = MFX_PLATFORM_TIGERLAKE; break; case MFX_HW_DG1 : platform.MediaAdapterType = MFX_MEDIA_DISCRETE; platform.CodeName = MFX_PLATFORM_TIGERLAKE; break; case MFX_HW_ADL_S : platform.CodeName = MFX_PLATFORM_ALDERLAKE_S; break; case MFX_HW_ADL_P : platform.CodeName = MFX_PLATFORM_ALDERLAKE_P; break; case MFX_HW_ADL_N : platform.CodeName = MFX_PLATFORM_ALDERLAKE_N; break; case MFX_HW_DG2 : platform.MediaAdapterType = MFX_MEDIA_DISCRETE; platform.CodeName = MFX_PLATFORM_DG2; break; // MFX_PLATFORM_METEORLAKE is not ready in spec, use MFX_RT_PLATFORM_METEORLAKE until spec updated case MFX_HW_MTL : platform.CodeName = MFX_RT_PLATFORM_METEORLAKE; break; default: platform.MediaAdapterType = MFX_MEDIA_UNKNOWN; platform.CodeName = MFX_PLATFORM_UNKNOWN; break; } platform.DeviceId = device_id; return platform; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_critical_error_handler.cpp000066400000000000000000000041771443134507600325010ustar00rootroot00000000000000// Copyright (c) 2016-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_critical_error_handler.h" MfxCriticalErrorHandler::MfxCriticalErrorHandler(void): m_CriticalErrorReportedAtLeastOnce(false), m_CriticalErrorStatus(MFX_ERR_NONE) { } mfxStatus MfxCriticalErrorHandler::ReturningCriticalStatus() { assert(m_CriticalErrorStatus != MFX_ERR_NONE); m_CriticalErrorReportedAtLeastOnce = true; if (m_CriticalErrorStatus == MFX_ERR_NONE) m_CriticalErrorStatus = MFX_ERR_UNKNOWN; return m_CriticalErrorStatus; } bool MfxCriticalErrorHandler::NeedToReturnCriticalStatus(mfxBitstream *bs) { bool RetrievingCachedFrames_and_CriticalErrorReportedAtLeastOnce = m_CriticalErrorReportedAtLeastOnce && bs == NULL; return CriticalErrorOccured() && !RetrievingCachedFrames_and_CriticalErrorReportedAtLeastOnce; } void MfxCriticalErrorHandler::SetCriticalErrorOccured(mfxStatus errorStatus) { assert(errorStatus != MFX_ERR_NONE); m_CriticalErrorStatus = errorStatus; } bool MfxCriticalErrorHandler::CriticalErrorOccured() { return m_CriticalErrorStatus != MFX_ERR_NONE; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_ddi_enc_dump.cpp000066400000000000000000000022041443134507600304000ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_enc_common.cpp000066400000000000000000000665561443134507600301270ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "ipps.h" #include #include #include #include "mfx_enc_common.h" #include "mfx_utils.h" #ifdef MFX_ENABLE_ENCTOOLS #include "mfxenctools-int.h" #endif //----MFX data -> UMC data-------------------------------------------- Ipp8u CalculateMAXBFrames (mfxU8 GopRefDist) { if(GopRefDist) return (GopRefDist - 1); else return 0; } Ipp16u CalculateUMCGOPLength (mfxU16 GOPSize, mfxU8 targetUsage) { if(GOPSize) return (GOPSize); else switch (targetUsage) { case MFX_TARGETUSAGE_BEST_QUALITY: return 200; case 2: return 200; case 3: return 200; case 4: return 20; case 5: return 10; case 6: return 4; case MFX_TARGETUSAGE_BEST_SPEED: return 1; } return 1; } bool SetUFParameters(mfxU8 TargetUsages, bool& mixed,Ipp32u& twoRef ) { switch (TargetUsages) { case MFX_TARGETUSAGE_BEST_QUALITY: mixed=0;twoRef=2; break; case 2: mixed=0;twoRef=2; break; case 3: mixed=0;twoRef=2; break; case 4: mixed=0;twoRef=1; break; case 5: mixed=0;twoRef=1; break; case 6: mixed=0;twoRef=1; break; case MFX_TARGETUSAGE_BEST_SPEED: mixed=0;twoRef=1; break; default: return false; } return true; } bool SetPROParameters (mfxU8 TargetUsages,Ipp8u &MESpeed, bool &UseFB, bool &FastFB, bool &bIntensityCompensation, bool &bChangeInterpolationType, bool &bChangeVLCTables,bool &bTrellisQuantization, bool &bUsePadding, bool &bVSTransform, bool &deblocking, mfxU8 &smoothing, bool &fastUVMC) { switch (TargetUsages) { case MFX_TARGETUSAGE_BEST_QUALITY: MESpeed=25; UseFB=1; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=1;bTrellisQuantization = 1; bUsePadding = 1; bChangeVLCTables =1; bVSTransform = 1; deblocking = 1; smoothing = 0; fastUVMC = 0; break; case 2: MESpeed=25; UseFB=1; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=1;bTrellisQuantization = 1; bUsePadding = 1; bChangeVLCTables =1; bVSTransform = 0; deblocking = 1; smoothing = 0; fastUVMC = 0; break; case 3: MESpeed=25; UseFB=1; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=0;bTrellisQuantization = 0; bUsePadding = 1; bChangeVLCTables =0; bVSTransform = 0; deblocking = 1; smoothing = 0; fastUVMC = 0; break; case 4: MESpeed=25; UseFB=1; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=0;bTrellisQuantization = 0; bUsePadding = 1; bChangeVLCTables =0; bVSTransform = 0; deblocking = 1; smoothing = 0; fastUVMC = 0; break; case 5: MESpeed=25; UseFB=0; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=0;bTrellisQuantization = 0; bUsePadding = 1; bChangeVLCTables =0; bVSTransform = 0; deblocking = 1; smoothing = 0; fastUVMC = 0; break; case 6: MESpeed=25; UseFB=0; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=0;bTrellisQuantization = 0; bUsePadding = 0; bChangeVLCTables =0; bVSTransform = 0; deblocking = 1; smoothing = 0; fastUVMC = 1; break; case MFX_TARGETUSAGE_BEST_SPEED: MESpeed=25; UseFB=0; FastFB=0; bIntensityCompensation=0; bChangeInterpolationType=0;bTrellisQuantization = 0; bUsePadding = 0; bChangeVLCTables =0; bVSTransform = 0; deblocking = 0; smoothing = 0; fastUVMC = 1; break; default: return false; } return true; } Ipp32u CalculateUMCBitrate(mfxU16 TargetKbps) { return TargetKbps*1000; } Ipp64f CalculateUMCFramerate( mfxU32 FrameRateExtN, mfxU32 FrameRateExtD) { if (FrameRateExtN && FrameRateExtD) return (Ipp64f)FrameRateExtN / FrameRateExtD; else return 0; } void CalculateMFXFramerate(Ipp64f framerate, mfxU32* FrameRateExtN, mfxU32* FrameRateExtD) { mfxU32 fr; if (!FrameRateExtN || !FrameRateExtD) return; fr = (mfxU32)(framerate + .5); if (fabs(fr - framerate) < 0.0001) { *FrameRateExtN = fr; *FrameRateExtD = 1; return; } fr = (mfxU32)(framerate * 1.001 + .5); if (fabs(fr * 1000 - framerate * 1001) < 10) { *FrameRateExtN = fr * 1000; *FrameRateExtD = 1001; return; } // can do more *FrameRateExtN = (mfxU32)(framerate * 10000 + .5); *FrameRateExtD = 10000; return; } UMC::FrameType GetFrameType (mfxU16 FrameOrder, mfxInfoMFX* info) { mfxU16 GOPSize = info->GopPicSize; mfxU16 IPDist = info->GopRefDist; mfxU16 pos = (GOPSize)? FrameOrder %(GOPSize):FrameOrder; if (pos == 0 || IPDist == 0) { return UMC::I_PICTURE; } else { pos = pos % (IPDist); return (pos != 0) ? UMC::B_PICTURE : UMC::P_PICTURE; } } //----UMC data -> MFX data-------------------------------------------- mfxU16 CalculateMFXGOPLength (Ipp16u GOPSize) { if(!GOPSize) return GOPSize; else return 15; } mfxU8 CalculateGopRefDist(mfxU8 BNum) { return (BNum + 1); } mfxU32 TranslateMfxFRCodeMPEG2(mfxFrameInfo *info, mfxU32 *codeN, mfxU32* codeD) { mfxU32 n = info->FrameRateExtN, d = info->FrameRateExtD, code = 0; mfxU32 flag1001 = 0; if (!n || !d) return 0; if(d%1001 == 0 && n%1000 == 0) { n /= 1000; d /= 1001; flag1001 = 1; } switch(n) { case 48: case 72: case 96: case 24 : code = 2 - flag1001; n /= 24; break; case 90: case 30 : code = 5 - flag1001; n /= 30; break; case 120: case 180: case 240: case 60 : code = 8 - flag1001; n /= 60; break; case 75: case 25 : code = 3; n /= 25; break; case 100: case 150: case 200: case 50 : code = 6; n /= 50; break; default: code = 0; } if( code != 0 && d <= 0x20 && ((code !=3 && code != 6) || !flag1001) ) { *codeN = n-1; *codeD = d-1; return code; } // can do more return 0; } mfxExtCodingOption* GetExtCodingOptions(mfxExtBuffer** ebuffers, mfxU32 nbuffers) { return (mfxExtCodingOption*)mfx::GetExtBuffer(ebuffers, nbuffers, MFX_EXTBUFF_CODING_OPTION); } mfxExtVideoSignalInfo* GetExtVideoSignalInfo(mfxExtBuffer** ebuffers, mfxU32 nbuffers) { return (mfxExtVideoSignalInfo *)mfx::GetExtBuffer(ebuffers, nbuffers, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); } mfxExtChromaLocInfo* GetExtChromaLocInfo(mfxExtBuffer** ebuffers, mfxU32 nbuffers) { return (mfxExtChromaLocInfo*)mfx::GetExtBuffer(ebuffers, nbuffers, MFX_EXTBUFF_CHROMA_LOC_INFO); } //----------work with marker----------------------------- mfxStatus SetFrameLockMarker(mfxFrameData* pFrame, mfxU8 LockMarker) { MFX_CHECK_NULL_PTR1(pFrame); pFrame->Locked = LockMarker; return MFX_ERR_NONE; } mfxU8 GetFrameLockMarker(mfxFrameData* pFrame) { return (mfxU8)pFrame->Locked; } const Rational RATETAB[8]= { {24000, 1001}, { 24, 1}, { 25, 1}, {30000, 1001}, { 30, 1}, { 50, 1}, {60000, 1001}, { 60, 1}, }; static const Rational SORTED_RATIO[] = { {1,32},{1,31},{1,30},{1,29},{1,28},{1,27},{1,26},{1,25},{1,24},{1,23},{1,22},{1,21},{1,20},{1,19},{1,18},{1,17}, {1,16},{2,31},{1,15},{2,29},{1,14},{2,27},{1,13},{2,25},{1,12},{2,23},{1,11},{3,32},{2,21},{3,31},{1,10},{3,29}, {2,19},{3,28},{1, 9},{3,26},{2,17},{3,25},{1, 8},{4,31},{3,23},{2,15},{3,22},{4,29},{1, 7},{4,27},{3,20},{2,13}, {3,19},{4,25},{1, 6},{4,23},{3,17},{2,11},{3,16},{4,21},{1, 5},{4,19},{3,14},{2, 9},{3,13},{4,17},{1, 4},{4,15}, {3,11},{2, 7},{3,10},{4,13},{1, 3},{4,11},{3, 8},{2, 5},{3, 7},{4, 9},{1, 2},{4, 7},{3, 5},{2, 3},{3, 4},{4, 5}, {1,1},{4,3},{3,2},{2,1},{3,1},{4,1} }; class FR_Compare { public: bool operator () (Rational rfirst, Rational rsecond) { mfxF64 first = (mfxF64) rfirst.n/rfirst.d; mfxF64 second = (mfxF64) rsecond.n/rsecond.d; return ( first < second ); } }; void ConvertFrameRateMPEG2(mfxU32 FrameRateExtD, mfxU32 FrameRateExtN, mfxI32 &frame_rate_code, mfxI32 &frame_rate_extension_n, mfxI32 &frame_rate_extension_d) { Rational convertedFR; Rational bestFR = {INT_MAX, 1}; mfxF64 minDifference = MFX_MAXABS_64F; for (mfxU32 i = 0; i < sizeof(RATETAB) / sizeof(RATETAB[0]); i++) { if (FrameRateExtN * RATETAB[i].d == FrameRateExtD * RATETAB[i].n ) { frame_rate_code = i + 1; frame_rate_extension_n = 0; frame_rate_extension_d = 0; return; } } for (mfxU32 i = 0; i < sizeof(RATETAB) / sizeof(RATETAB[0]); i++) { convertedFR.n = (mfxI64) FrameRateExtN * RATETAB[i].d; convertedFR.d = (mfxI64) FrameRateExtD * RATETAB[i].n; const Rational* it_lower = std::lower_bound( SORTED_RATIO, SORTED_RATIO + sizeof(SORTED_RATIO) / sizeof(SORTED_RATIO[0]), convertedFR, FR_Compare()); if (it_lower == SORTED_RATIO + sizeof(SORTED_RATIO) / sizeof(SORTED_RATIO[0])) // exceed max FR { it_lower--; } else if (it_lower != SORTED_RATIO) // min FR not reached { if ( std::abs( (mfxF64) (it_lower - 1)->n / (it_lower - 1)->d - (mfxF64) convertedFR.n / convertedFR.d) < std::abs((mfxF64)it_lower->n / it_lower->d - (mfxF64)convertedFR.n / convertedFR.d)) { it_lower--; } } if (minDifference > std::abs((mfxF64)convertedFR.n / convertedFR.d - (mfxF64)it_lower->n / it_lower->d)) { minDifference = std::abs((mfxF64)convertedFR.n / convertedFR.d - (mfxF64)it_lower->n / it_lower->d); frame_rate_code = i + 1; bestFR = *it_lower; } } for (mfxU32 i = 0; i < sizeof(RATETAB) / sizeof(RATETAB[0]); i++) {// check that exist equal RATETAB with FR = 1:1 if (RATETAB[i].d * RATETAB[frame_rate_code - 1].n * bestFR.n == RATETAB[i].n * RATETAB[frame_rate_code - 1].d * bestFR.d) { frame_rate_code = i + 1; frame_rate_extension_n = 0; frame_rate_extension_d = 0; return; } } frame_rate_extension_n = (mfxI32) bestFR.n - 1; frame_rate_extension_d = (mfxI32) bestFR.d - 1; return; } mfxStatus CheckFrameRateMPEG2(mfxU32 &FrameRateExtD, mfxU32 &FrameRateExtN) { mfxI32 frame_rate_code = 0; mfxI32 frame_rate_extension_n = 0; mfxI32 frame_rate_extension_d = 0; mfxF64 input_ratio = (mfxF64) FrameRateExtN / FrameRateExtD; mfxF64 difference_ratio = 0; ConvertFrameRateMPEG2(FrameRateExtD, FrameRateExtN, frame_rate_code, frame_rate_extension_n, frame_rate_extension_d); difference_ratio = fabs(input_ratio - (mfxF64)(frame_rate_extension_n + 1) / (frame_rate_extension_d + 1) * RATETAB[frame_rate_code - 1].n / RATETAB[frame_rate_code - 1].d); if (difference_ratio < input_ratio / 50000) { //difference less than 0.05% return MFX_ERR_NONE; } else { FrameRateExtD = (mfxU32) ((frame_rate_extension_d + 1) * RATETAB[frame_rate_code - 1].d); FrameRateExtN = (mfxU32) ((frame_rate_extension_n + 1) * RATETAB[frame_rate_code - 1].n); if (difference_ratio < input_ratio / 1000) return MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; else //difference more than 0.1% return MFX_ERR_INVALID_VIDEO_PARAM; } } mfxStatus CheckAspectRatioMPEG2 (mfxU16 &aspectRatioW, mfxU16 &aspectRatioH, mfxU32 frame_width, mfxU32 frame_heigth, mfxU16 cropW, mfxU16 cropH) { mfxU32 width = (cropW != 0) ? cropW : frame_width; mfxU32 height =(cropH != 0) ? cropH : frame_heigth; if ((aspectRatioW == 0 && aspectRatioH == 0) || (aspectRatioW == 1 && aspectRatioH == 1)) return MFX_ERR_NONE; if (aspectRatioW == 0 || aspectRatioH == 0) return MFX_ERR_INVALID_VIDEO_PARAM; if (width != 0 && height != 0) { mfxU64 k = ((mfxU64)aspectRatioW * width * 100000) / (aspectRatioH * height); if ((aspectRatioW * width * 3 == aspectRatioH * height * 4) || (aspectRatioW * width * 9 == aspectRatioH * height * 16) || (aspectRatioW * width * 100 == aspectRatioH * height * 221) ) { return MFX_ERR_NONE; } if (k > (400000/3 - 133) && k < (400000/3 + 133)) { return MFX_ERR_NONE; } else if ( k > ( 1600000/9 - 177) && k < (1600000/9 + 177) ) { return MFX_ERR_NONE; } else if (k > (22100000/100 - 221) && k < (22100000/100 + 221)) { return MFX_ERR_NONE; } else return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } else { if (width == 0 && height == 0) return MFX_ERR_NONE; else return MFX_ERR_INVALID_VIDEO_PARAM; } } mfxU8 GetAspectRatioCode (mfxU32 dispAspectRatioW, mfxU32 dispAspectRatioH) { if (dispAspectRatioH == 0) { return 1; } mfxU64 k = ((mfxU64)dispAspectRatioW*1000)/(dispAspectRatioH); if (k <= (4000/3 + 1) && k >= (4000/3 - 1)) { return 2; } if (k <= (16000/9 + 1) && k >= (16000/9 - 1)) { return 3; } if (k <= (221000/100 + 1) && k >= (221000/100 - 1)) { return 4; } return 1; } mfxStatus AllocInternalEncBuffer(VideoCORE* pCore, const mfxU16& numFrameMin, const mfxVideoParam& par, mfxFrameAllocResponse& response) { MFX_CHECK(pCore && par.IOPattern != MFX_IOPATTERN_IN_SYSTEM_MEMORY, MFX_ERR_NONE); mfxFrameAllocRequest request = {}; request.Info = par.mfx.FrameInfo; request.Type = MFX_MEMTYPE_FROM_ENCODE | MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = numFrameMin; mfxStatus sts = pCore->AllocFrames(&request, &response); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } bool CorrectProfileLevelMpeg2(mfxU16 &profile, mfxU16 & level, mfxU32 w, mfxU32 h, mfxF64 frame_rate, mfxU32 bitrate, mfxU32 GopRefDist) { mfxU16 oldLevel = level; mfxU16 oldProfile = profile; if (MFX_LEVEL_MPEG2_HIGH != level && MFX_LEVEL_MPEG2_HIGH1440 != level && MFX_LEVEL_MPEG2_MAIN != level && MFX_LEVEL_MPEG2_LOW != level) level = MFX_LEVEL_MPEG2_MAIN; if (MFX_PROFILE_MPEG2_SIMPLE != profile && MFX_PROFILE_MPEG2_MAIN != profile ) { profile = MFX_PROFILE_MPEG2_MAIN; } if (MFX_PROFILE_MPEG2_HIGH == profile) { if (w > 1440 || h > 1152 || frame_rate*w*h > 62668800.0 || bitrate > 80000000) { level = MFX_LEVEL_MPEG2_HIGH; } else if ((w > 720 || h > 576 || frame_rate > 30 || frame_rate*w*h > 14745600.0 || bitrate > 20000000) && (level != MFX_LEVEL_MPEG2_HIGH)) { level = MFX_LEVEL_MPEG2_HIGH1440; } } else { if (w > 1440 || h > 1152 || frame_rate*w*h > 47001600.0 || bitrate > 60000000) { level = MFX_LEVEL_MPEG2_HIGH; } else if ((w > 720 || h > 576 || frame_rate > 30 || frame_rate*w*h > 10368000.0 || bitrate > 15000000) && (level != MFX_LEVEL_MPEG2_HIGH)) { level = MFX_LEVEL_MPEG2_HIGH1440; } else if ((w > 352 || h > 288 || frame_rate*w*h > 3041280.0 || bitrate > 4000000) && (level != MFX_LEVEL_MPEG2_HIGH && level != MFX_LEVEL_MPEG2_HIGH1440)) { level = MFX_LEVEL_MPEG2_MAIN; } } if (MFX_PROFILE_MPEG2_SIMPLE == profile && ((MFX_LEVEL_MPEG2_MAIN != level && MFX_LEVEL_MPEG2_LOW != level) || (GopRefDist >1))) { profile = MFX_PROFILE_MPEG2_MAIN; } if (MFX_PROFILE_MPEG2_HIGH == profile && MFX_LEVEL_MPEG2_LOW == level ) { profile = MFX_PROFILE_MPEG2_MAIN; } return (((oldLevel!=0) && (oldLevel!=level)) || ((oldProfile!=0) && (oldProfile!=profile))); } mfxStatus InputSurfaces::Reset(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; mfxU32 ioPattern = par->IOPattern & ( MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_IN_SYSTEM_MEMORY ); if (ioPattern & (ioPattern - 1)) return MFX_ERR_INVALID_VIDEO_PARAM; MFX_INTERNAL_CPY(&m_Info,&par->mfx.FrameInfo,sizeof(mfxFrameInfo)); bool bSysMemFrames = (par->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY) != 0; MFX_CHECK(bSysMemFrames == m_bSysMemFrames || !m_bInitialized, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); m_bSysMemFrames = bSysMemFrames; m_bInitialized = true; return sts; } mfxStatus InputSurfaces::Close() { if (m_response.NumFrameActual != 0) { m_pCore->FreeFrames (&m_response); } m_bSysMemFrames = false; m_bInitialized = false; memset(&m_request, 0, sizeof(mfxFrameAllocRequest)); memset(&m_response, 0, sizeof (mfxFrameAllocResponse)); return MFX_ERR_NONE; } mfxStatus CheckExtVideoSignalInfo(mfxExtVideoSignalInfo * videoSignalInfo) { mfxStatus sts = MFX_ERR_NONE; if (videoSignalInfo->VideoFormat > 7) { videoSignalInfo->VideoFormat = 5; // unspecified video format sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (videoSignalInfo->ColourDescriptionPresent > 1) { videoSignalInfo->ColourDescriptionPresent = 0; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (videoSignalInfo->ColourDescriptionPresent) { if (videoSignalInfo->ColourPrimaries > 255) { videoSignalInfo->ColourPrimaries = 2; // unspecified image characteristics sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (videoSignalInfo->TransferCharacteristics > 255) { videoSignalInfo->TransferCharacteristics = 2; // unspecified image characteristics sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (videoSignalInfo->MatrixCoefficients > 255) { videoSignalInfo->MatrixCoefficients = 2; // unspecified image characteristics sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return sts; } mfxStatus CheckExtChromaLocInfo(mfxExtChromaLocInfo* chromaLocInfo) { mfxStatus sts = MFX_ERR_NONE; if (chromaLocInfo->ChromaLocInfoPresentFlag) { if (chromaLocInfo->ChromaSampleLocTypeTopField > 255) { chromaLocInfo->ChromaSampleLocTypeTopField = 0; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } if (chromaLocInfo->ChromaSampleLocTypeBottomField > 255) { chromaLocInfo->ChromaSampleLocTypeBottomField = 0; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } } return sts; } typedef std::remove_reference::type RectData; mfxStatus FillMBMapViaROI(const mfxExtEncoderROI& roi, mfxI8* pMbMap, mfxU32 width, mfxU32 height, mfxU32 pitch, mfxU32 block_width, mfxU32 block_height, mfxI8 QpY) { MFX_CHECK_NULL_PTR1(pMbMap); mfxU32 x = 0, y = 0; auto IsXYInRect = [&](const RectData& r) { return (x * block_width) >= r.Left && (x * block_width) < r.Right && (y * block_height) >= r.Top && (y * block_height) < r.Bottom; }; auto NextQP = [&]() { auto pEnd = roi.ROI + roi.NumROI; auto pRect = std::find_if(roi.ROI, pEnd, IsXYInRect); ++x; if (pRect != pEnd) return mfxI8(QpY + pRect->DeltaQP); return mfxI8(QpY); }; auto FillQpMapRow = [&](mfxI8& qpMapRow) { x = 0; std::generate_n(&qpMapRow, width, NextQP); ++y; }; auto itQpMapRowsBegin = mfx::MakeStepIter(pMbMap, pitch); auto itQpMapRowsEnd = mfx::MakeStepIter(pMbMap + height * pitch); std::for_each(itQpMapRowsBegin, itQpMapRowsEnd, FillQpMapRow); return MFX_ERR_NONE; } template inline T CeilDiv(T x, T y) { return (x + y - 1) / y; } mfxStatus FillCUQPData(mfxI8 QpY, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned) { MFX_CHECK_NULL_PTR1(pMbMap); // Fill all LCU blocks: HW hevc averages QP for (mfxU32 i = 0; i < height_aligned; i++) { for (mfxU32 j = 0; j < pitch; j++) { pMbMap[i * pitch + j] = QpY; } } return MFX_ERR_NONE; } mfxStatus FillMBQPBuffer( const mfxU8* mbqpInputBuffer, mfxU32 mbqpInputBufferSize, mfxU32 picWidth, mfxU32 picHeight, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned, mfxU32 block_width, mfxU32 block_height) { mfxU32 drBlkW = block_width; // block size of driver mfxU32 drBlkH = block_height; // block size of driver mfxU32 inBlkSize = 16; //input block size mfxU32 inputW = CeilDiv(picWidth, inBlkSize); mfxU32 inputH = CeilDiv(picHeight, inBlkSize); MFX_CHECK(mbqpInputBufferSize >= inputW * inputH, MFX_ERR_UNDEFINED_BEHAVIOR); // Fill all LCU blocks: HW hevc averages QP for (mfxU32 i = 0; i < height_aligned; i++) { for (mfxU32 j = 0; j < pitch; j++) { mfxU32 y = std::min(i * drBlkH / inBlkSize, inputH - 1); mfxU32 x = std::min(j * drBlkW / inBlkSize, inputW - 1); pMbMap[i * pitch + j] = mbqpInputBuffer[y * inputW + x]; } } return MFX_ERR_NONE; } mfxStatus FillCUQPData(const mfxExtMBQP* mbqpInput, mfxU32 picWidth, mfxU32 picHeight, mfxI8* pMbMap, mfxU32 pitch, mfxU32 height_aligned, mfxU32 block_width, mfxU32 block_height) { MFX_CHECK_NULL_PTR1(pMbMap); MFX_CHECK_NULL_PTR1(mbqpInput); MFX_CHECK_NULL_PTR1(mbqpInput->QP); return FillMBQPBuffer(mbqpInput->QP, mbqpInput->NumQPAlloc, picWidth, picHeight, pMbMap, pitch, height_aligned, block_width, block_height); } bool IsSWBRCMode(const mfxVideoParam& par) { const mfxExtCodingOption2* pCO2 = (mfxExtCodingOption2*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); #ifdef MFX_ENABLE_ENCTOOLS const mfxExtEncToolsConfig* pCfg = (mfxExtEncToolsConfig*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); #endif return ((((pCO2 && IsOn(pCO2->ExtBRC)) #ifdef MFX_ENABLE_ENCTOOLS || (pCfg && IsOn(pCfg->BRC)) #endif ) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) || par.mfx.RateControlMethod == MFX_RATECONTROL_LA || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD || par.mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ ); } static bool ROIViaMBQP(const mfxVideoParam par, mfxU32 maxNumOfROI, mfxU32 ROIDeltaQPSupport) { mfxExtEncoderROI *extRoi = (mfxExtEncoderROI*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCODER_ROI); return extRoi && extRoi->NumROI > 0 && (!maxNumOfROI || !ROIDeltaQPSupport) && IsSWBRCMode(par); } bool IsEnctoolsLABRC(const mfxVideoParam& par) { #if !defined(MFX_ENABLE_ENCTOOLS) std::ignore = par; #else const mfxExtCodingOption2* pCO2 = (mfxExtCodingOption2*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); const mfxExtCodingOption3* pCO3 = (mfxExtCodingOption3*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); const mfxExtEncToolsConfig* pCfg = (mfxExtEncToolsConfig*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if ( ( ((par.mfx.GopRefDist == 2 || par.mfx.GopRefDist == 4 || par.mfx.GopRefDist == 8) && pCO2 && pCO2->ExtBRC == MFX_CODINGOPTION_ON && pCO2->LookAheadDepth > par.mfx.GopRefDist && !(pCO3 && pCO3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) ) || (pCfg && IsOn(pCfg->BRC) && pCO2 && pCO2->LookAheadDepth > par.mfx.GopRefDist) ) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR) ) return true; #endif return false; } static bool IsEnctoolsALQOffset(const mfxVideoParam& par) { #if !defined(MFX_ENABLE_ENCTOOLS) std::ignore = par; #else const mfxExtEncToolsConfig* pCfg = (mfxExtEncToolsConfig*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if (((par.mfx.GopRefDist == 8) && (pCfg && IsOn(pCfg->BRC) && (IsOn(pCfg->AdaptivePyramidQuantB) || IsOn(pCfg->AdaptivePyramidQuantP))) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) && !IsOn(par.mfx.LowPower)) return true; #endif return false; } bool IsEnctoolsLAGS(const mfxVideoParam& par) { #if !defined(MFX_ENABLE_ENCTOOLS) std::ignore = par; #else const mfxExtCodingOption2* pCO2 = (mfxExtCodingOption2*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); const mfxExtCodingOption3* pCO3 = (mfxExtCodingOption3*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); const mfxExtEncToolsConfig* pCfg = (mfxExtEncToolsConfig*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_ENCTOOLS_CONFIG); if (((pCO2 && pCO2->LookAheadDepth > 0) || (pCfg && IsOn(pCfg->BRCBufferHints))) && ((pCO3 && pCO3->ScenarioInfo == MFX_SCENARIO_GAME_STREAMING) || !IsSWBRCMode(par)) && (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR || par.mfx.RateControlMethod == MFX_RATECONTROL_VBR)) return true; #endif return false; } MBQPMode GetMBQPMode(const mfxVideoParam& par, mfxU32 maxNumOfROI, mfxU32 ROIDeltaQPSupport, bool MbQpDataSupport, bool bFieldMode) { const mfxExtCodingOption2* pCO2 = (mfxExtCodingOption2*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION2); const mfxExtCodingOption3* pCO3 = (mfxExtCodingOption3*)mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION3); if (!MbQpDataSupport) return MBQPMode_None; else if (pCO3 && IsOn(pCO3->EnableMBQP)) return MBQPMode_ExternalMap; else if (pCO2 && IsOn(pCO2->MBBRC) && IsEnctoolsLABRC(par) && (!bFieldMode)) return MBQPMode_FromEncToolsBRC; else if (pCO2 && IsOn(pCO2->MBBRC) && IsEnctoolsLAGS(par) && (!bFieldMode)) return MBQPMode_FromEncToolsLA; else if (ROIViaMBQP(par, maxNumOfROI, ROIDeltaQPSupport) && (!bFieldMode)) return MBQPMode_ForROI; else if (IsEnctoolsALQOffset(par) && (!bFieldMode)) return MBQPMode_ForALQOffset; return MBQPMode_None; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_enc_enctools_common.cpp000066400000000000000000000022121443134507600320100ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_enc_enctools_common.h" oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_feature_blocks_base.cpp000066400000000000000000000033371443134507600317600ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_utils_logging.h" #include "mfx_feature_blocks_base.h" namespace MfxFeatureBlocks { BlockTracer::BlockTracer( ID id , const char* fName , const char* bName) : ID(id) , m_featureName(fName) , m_blockName(bName) { #if defined(MFX_ENABLE_LOG_UTILITY) MFX_LOG_TRACE("%s(%d)::%s(%d): Enter\n", m_featureName, FeatureID, m_blockName, BlockID); #endif // MFX_ENABLE_LOG_UTILITY } BlockTracer::~BlockTracer() { #if defined(MFX_ENABLE_LOG_UTILITY) MFX_LOG_TRACE("%s(%d)::%s(%d): Exit\n", m_featureName, FeatureID, m_blockName, BlockID); #endif // MFX_ENABLE_LOG_UTILITY } }; //namespace MfxFeatureBlocks oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_log.cpp000066400000000000000000000214021443134507600265500ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #if defined(MFX_SCHEDULER_LOG) #error Overlappped I/O mechanism is not implemented in Unix version. #include #include #include #include // Be care. Need to check sizeof. typedef char byte_t; typedef long dword_t; typedef long DWORD; typedef bool BOOL; #define FALSE false; #define TRUE true; #include using namespace UMC; // static section of the file namespace { // Declare the byte type typedef unsigned char byte_t; typedef unsigned int dword_t; // Declare the default log path const char *MFX_LOG_DEFAULT_PATH = "c:\\mfx_log.log"; enum { MFX_LOG_ALIGN_VALUE = 64 * 1024, MFX_LOG_NUM_PARTS = 4, MFX_LOG_DEF_SIZE = 1024 * 1024 }; // Declare log class class mfxLogObject { public: // Default constructor mfxLogObject(void) { m_file = NULL; # error Overlappped I/O mechanism is not implemented in Unix version. m_pAlloc = 0; m_allocSize = 0; memset(m_pBuf, 0, sizeof(m_pBuf)); m_pCur = 0; m_bufSize = 0; m_logIdx = 0; m_callNumber = 0; } // Destructor ~mfxLogObject(void) { // exchange the last buffer to avoid data loss if (m_pCur) { if (MFX_LOG_DEF_SIZE != m_bufSize) { memset(m_pCur, 0, m_bufSize); m_pCur += m_bufSize; m_bufSize = 0; ExchangeBuffer(); } } Release(); } bool Init(const char *pLogPath) { dword_t i; // check error(s) if (0 == pLogPath) { return false; } // release the object before initialzation Release(); // open the destination file m_file = fopen(pLogPath, "rw"); if (NULL == m_file) { return false; } # error Overlappped I/O mechanism is not implemented in Unix version. // create the output buffer m_pAlloc = new byte_t [MFX_LOG_DEF_SIZE * MFX_LOG_NUM_PARTS + MFX_LOG_ALIGN_VALUE]; m_allocSize = MFX_LOG_DEF_SIZE * MFX_LOG_NUM_PARTS; // set the working buffers m_pBuf[0] = m_pAlloc + ((MFX_LOG_ALIGN_VALUE - ((size_t) (m_pAlloc - 0))) & (MFX_LOG_ALIGN_VALUE - 1)); for (i = 1; i < MFX_LOG_NUM_PARTS; i += 1) { m_pBuf[i] = m_pBuf[i - 1] + MFX_LOG_DEF_SIZE; } // set the current buffer position m_pCur = m_pBuf[0]; m_bufSize = MFX_LOG_DEF_SIZE; m_callNumber = 0; return true; } void AddString(const char *pStr, size_t strLen) { AutomaticUMCMutex guard(m_guard); char cStr[32]; size_t callNumLen; // check error(s) if (false == isReady()) { return; } // render current call number callNumLen = sprintf(cStr, "[% 8u]", m_callNumber += 1); AddStringSafe(cStr, callNumLen); AddStringSafe(pStr, strLen); } bool isReady(void) { return (0 != m_pCur); } protected: // Release the object void Release(void) { dword_t i; DWORD nWritten; # error Overlappped I/O mechanism is not implemented in Unix version. if (NULL != m_file) { fclose(m_file); m_file = NULL; } if (m_pAlloc) { delete [] m_pAlloc; } # error Overlappped I/O mechanism is not implemented in Unix version. m_pAlloc = 0; m_allocSize = 0; memset(m_pBuf, 0, sizeof(m_pBuf)); m_pCur = 0; m_bufSize = 0; m_logIdx = 0; } void AddStringSafe(const char *pStr, size_t strLen) { // check error(s) if ((0 == pStr) || (strLen > MFX_LOG_DEF_SIZE)) { return; } do { size_t copySize; // copy the string to the buffer copySize = (m_bufSize < strLen) ? (m_bufSize) : (strLen); std::copy(pStr, pStr + copySize, m_pCur); m_pCur += copySize; m_bufSize -= copySize; pStr += copySize; strLen -= copySize; // issue file writing if (0 == m_bufSize) { ExchangeBuffer(); } } while (strLen); } // Set the current buffer to the flushing state, // get a fresh buffer to save. void ExchangeBuffer(void) { dword_t newLogIdx = (m_logIdx + 1) % MFX_LOG_NUM_PARTS; DWORD nWritten; BOOL bRes; // the current buffer has nothing if (m_bufSize == MFX_LOG_DEF_SIZE) { return; } # error Overlappped I/O mechanism is not implemented in Unix version. // start writing operation bRes = fwrite(m_pBuf[m_logIdx], MFX_LOG_DEF_SIZE, 1, m_file); if (MFX_LOG_DEF_SIZE != bRes) { return; } // exchange the buffer m_logIdx = newLogIdx; m_pCur = m_pBuf[m_logIdx]; m_bufSize = MFX_LOG_DEF_SIZE; } // Log guard Mutex m_guard; // Output file FILE *m_file; // Overlapped I/O are absent on Linux. // Unix sockets provides same functionality in the readv() and writev() calls. // Some Unixes provide the aio_*() family of functions, but this is not implemented widely at the moment. // Allocated buffer byte_t *m_pAlloc; // Allocated buffer size size_t m_allocSize; // Array of working buffers byte_t *(m_pBuf[MFX_LOG_NUM_PARTS]); // Current position in the buffer byte_t *m_pCur; // Remain buffer size size_t m_bufSize; // Current log buffer index dword_t m_logIdx; // Current call number dword_t m_callNumber; }; mfxLogObject defaultLogObject; const log_t defaultLog = &defaultLogObject; } // namespace extern "C" log_t mfxLogInit(const char *pLogPath) { mfxLogObject *pLog = NULL; // check if the default log is initialized already if (0 == pLogPath) { if (defaultLogObject.isReady()) { return (log_t) defaultLog; } } try { // allocate one more log object if (pLogPath) { pLog = new mfxLogObject(); } else { pLog = &defaultLogObject; pLogPath = MFX_LOG_DEFAULT_PATH; } if (false == pLog->Init(pLogPath)) { throw (int) 0; } } catch(...) { // delete log object if ((pLog) && (pLog != &defaultLogObject)) { delete pLog; pLog = 0; } } return (log_t) pLog; } // log_t mfxLogInit(const char *pLogPath) extern "C" void mfxLogWriteA(const log_t log, const char *pString, ...) { mfxLogObject *pLog = (mfxLogObject *) log; char cStr[4096]; va_list argList; size_t strLen; if (0 == pLog) { pLog = &defaultLogObject; } // create argument list va_start(argList, pString); // render the string strLen = vsprintf(cStr, pString, argList); pLog->AddString(cStr, strLen); } // void mfxLogWriteA(const log_t log, const char *pString, ...) extern "C" void mfxLogClose(log_t log) { mfxLogObject *pLog = (mfxLogObject *) log; // check if it is not a default log object if ((0 == pLog) || (pLog == &defaultLogObject)) { return; } try { delete pLog; } catch(...) { } } // void mfxLogClose(log_t log) #endif // defined(MFX_SCHEDULER_LOG) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_mpeg2_dec_common.cpp000066400000000000000000000040141443134507600311640ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "mfx_mpeg2_dec_common.h" #include "mfx_enc_common.h" void GetMfxFrameRate(mfxU8 umcFrameRateCode, mfxU32 *frameRateNom, mfxU32 *frameRateDenom) { switch (umcFrameRateCode) { case 0: *frameRateNom = 30; *frameRateDenom = 1; break; case 1: *frameRateNom = 24000; *frameRateDenom = 1001; break; case 2: *frameRateNom = 24; *frameRateDenom = 1; break; case 3: *frameRateNom = 25; *frameRateDenom = 1; break; case 4: *frameRateNom = 30000; *frameRateDenom = 1001; break; case 5: *frameRateNom = 30; *frameRateDenom = 1; break; case 6: *frameRateNom = 50; *frameRateDenom = 1; break; case 7: *frameRateNom = 60000; *frameRateDenom = 1001; break; case 8: *frameRateNom = 60; *frameRateDenom = 1; break; default: *frameRateNom = 30; *frameRateDenom = 1; } return; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_session.cpp000066400000000000000000000356061443134507600274650ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include "mfx_common.h" #include #include #include #include #include "mfx_platform_caps.h" #define TRY_GET_SESSION(verMax,verMin) MFXIPtr TryGetSession_##verMax##_##verMin(mfxSession session) \ { \ if (session == NULL)\ { \ return MFXIPtr(); \ } \ return MFXIPtr(static_cast<_mfxVersionedSessionImpl *>(session)->QueryInterface(MFXISession_##verMax##_##verMin##_GUID)); \ } constexpr mfxU32 default_threads_limit = 16; TRY_GET_SESSION(1,10) TRY_GET_SESSION(2,1) ////////////////////////////////////////////////////////////////////////// // _mfxSession members ////////////////////////////////////////////////////////////////////////// _mfxSession::_mfxSession(const mfxU32 adapterNum) : m_currentPlatform() , m_adapterNum(adapterNum) , m_implInterface() , m_pScheduler() , m_priority() , m_version() , m_versionToReport() , m_pOperatorCore() , m_bIsHWENCSupport() , m_bIsHWDECSupport() { m_currentPlatform = MFX_PLATFORM_HARDWARE; m_versionToReport.Major = MFX_VERSION_MAJOR; m_versionToReport.Minor = MFX_VERSION_MINOR; Clear(); } // _mfxSession::_mfxSession(const mfxU32 adapterNum) : _mfxSession::~_mfxSession(void) { Cleanup(); } // _mfxSession::~_mfxSession(void) void _mfxSession::Clear(void) { m_pScheduler = NULL; m_pSchedulerAllocated = NULL; m_priority = MFX_PRIORITY_NORMAL; m_bIsHWENCSupport = false; } // void _mfxSession::Clear(void) void _mfxSession::Cleanup(void) { // wait until all task are processed if (m_pScheduler) { if (m_pDECODE.get()) m_pScheduler->WaitForAllTasksCompletion(m_pDECODE.get()); if (m_pVPP.get()) m_pScheduler->WaitForAllTasksCompletion(m_pVPP.get()); if (m_pENCODE.get()) m_pScheduler->WaitForAllTasksCompletion(m_pENCODE.get()); } // release the components the excplicit way. // do not relay on default deallocation order, // somebody could change it. m_pVPP.reset(); m_pDECODE.reset(); m_pENCODE.reset(); m_pDVP.reset(); // release m_pScheduler and m_pSchedulerAllocated ReleaseScheduler(); // release core m_pCORE.reset(); //delete m_coreInt.ExternalSurfaceAllocator; Clear(); } // void _mfxSession::Release(void) mfxStatus _mfxSession::Init(mfxIMPL implInterface, mfxVersion *ver) { mfxStatus mfxRes; MFX_SCHEDULER_PARAM schedParam; mfxU32 maxNumThreads; #if defined(MFX_ENABLE_SINGLE_THREAD) bool isExternalThreading = (implInterface & MFX_IMPL_EXTERNAL_THREADING)?true:false; implInterface &= ~MFX_IMPL_EXTERNAL_THREADING; #endif // release the object before initialization Cleanup(); if (ver) { m_version = *ver; } else { mfxStatus sts = MFXQueryVersion(this, &m_version); if (sts != MFX_ERR_NONE) return sts; } // save working HW interface switch (implInterface&-MFX_IMPL_VIA_ANY) { case MFX_IMPL_UNSUPPORTED: assert(!"MFXInit(Ex) was supposed to correct zero-impl to MFX_IMPL_VIA_ANY"); return MFX_ERR_UNDEFINED_BEHAVIOR; // VAAPI is only one supported interface case MFX_IMPL_VIA_ANY: case MFX_IMPL_VIA_VAAPI: m_implInterface = MFX_IMPL_VIA_VAAPI; break; // unknown hardware interface default: if (MFX_PLATFORM_HARDWARE == m_currentPlatform) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } // get the number of available threads maxNumThreads = std::min((mfxU32)default_threads_limit, (mfxU32)std::thread::hardware_concurrency()); if (maxNumThreads == 1) { maxNumThreads = 2; } // allocate video core if (MFX_PLATFORM_SOFTWARE == m_currentPlatform) { m_pCORE.reset(FactoryCORE::CreateCORE(MFX_HW_NO, 0, {}, maxNumThreads, this)); } else { m_pCORE.reset(FactoryCORE::CreateCORE(MFX_HW_VAAPI, m_adapterNum, {}, maxNumThreads, this)); } // query the scheduler interface m_pScheduler = QueryInterface (m_pSchedulerAllocated, MFXIScheduler_GUID); if (NULL == m_pScheduler) { return MFX_ERR_UNKNOWN; } memset(&schedParam, 0, sizeof(schedParam)); schedParam.flags = MFX_SCHEDULER_DEFAULT; #if defined(MFX_ENABLE_SINGLE_THREAD) if (isExternalThreading) schedParam.flags = MFX_SINGLE_THREAD; #endif schedParam.numberOfThreads = maxNumThreads; schedParam.pCore = m_pCORE.get(); mfxRes = m_pScheduler->Initialize(&schedParam); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } m_pOperatorCore = new OperatorCORE(m_pCORE.get()); return MFX_ERR_NONE; } // mfxStatus _mfxSession::Init(mfxIMPL implInterface) mfxStatus _mfxSession::RestoreScheduler(void) { if(m_pSchedulerAllocated) return MFX_ERR_UNDEFINED_BEHAVIOR; // leave the current scheduler if (m_pScheduler) { m_pScheduler->Release(); m_pScheduler = NULL; } // query the scheduler interface m_pScheduler = QueryInterface (m_pSchedulerAllocated, MFXIScheduler_GUID); if (NULL == m_pScheduler) { return MFX_ERR_UNKNOWN; } return MFX_ERR_NONE; } // mfxStatus _mfxSession::RestoreScheduler(void) mfxStatus _mfxSession::ReleaseScheduler(void) { if(m_pScheduler) m_pScheduler->Release(); if(m_pSchedulerAllocated) m_pSchedulerAllocated->Release(); m_pScheduler = nullptr; m_pSchedulerAllocated = nullptr; return MFX_ERR_NONE; } // mfxStatus _mfxSession::RestoreScheduler(void) ////////////////////////////////////////////////////////////////////////// // _mfxVersionedSessionImpl own members ////////////////////////////////////////////////////////////////////////// _mfxVersionedSessionImpl::_mfxVersionedSessionImpl(mfxU32 adapterNum) : _mfxSession(adapterNum) , m_refCounter(1) , m_externalThreads(0) { } _mfxVersionedSessionImpl::~_mfxVersionedSessionImpl(void) { } ////////////////////////////////////////////////////////////////////////// // _mfxVersionedSessionImpl::MFXISession_1_10 members ////////////////////////////////////////////////////////////////////////// void _mfxVersionedSessionImpl::SetAdapterNum(const mfxU32 adapterNum) { m_adapterNum = adapterNum; } ////////////////////////////////////////////////////////////////////////// // _mfxVersionedSessionImpl::MFXIUnknown members ////////////////////////////////////////////////////////////////////////// void *_mfxVersionedSessionImpl::QueryInterface(const MFX_GUID &guid) { // Specific interface is required if (MFXISession_1_10_GUID == guid) { // increment reference counter vm_interlocked_inc32(&m_refCounter); return (MFXISession_1_10 *) this; } // Specific interface is required if (MFXISession_2_1_GUID == guid) { // increment reference counter vm_interlocked_inc32(&m_refCounter); return (MFXISession_2_1 *)this; } // it is unsupported interface return NULL; } // void *_mfxVersionedSessionImpl::QueryInterface(const MFX_GUID &guid) void _mfxVersionedSessionImpl::AddRef(void) { // increment reference counter vm_interlocked_inc32(&m_refCounter); } // void mfxSchedulerCore::AddRef(void) void _mfxVersionedSessionImpl::Release(void) { // decrement reference counter vm_interlocked_dec32(&m_refCounter); if (0 == m_refCounter) { delete this; } } // void _mfxVersionedSessionImpl::Release(void) mfxU32 _mfxVersionedSessionImpl::GetNumRef(void) const { return m_refCounter; } // mfxU32 _mfxVersionedSessionImpl::GetNumRef(void) const mfxStatus _mfxVersionedSessionImpl::InitEx(mfxInitParam& par, bool isSingleThreadMode = false) { mfxStatus mfxRes; mfxU32 maxNumThreads; #if defined(MFX_ENABLE_SINGLE_THREAD) isSingleThreadMode = (par.Implementation & MFX_IMPL_EXTERNAL_THREADING) ? true : isSingleThreadMode; par.Implementation &= ~MFX_IMPL_EXTERNAL_THREADING; #endif // release the object before initialization Cleanup(); m_version = par.Version; // save working HW interface switch (par.Implementation&-MFX_IMPL_VIA_ANY) { case MFX_IMPL_UNSUPPORTED: assert(!"MFXInit(Ex) was supposed to correct zero-impl to MFX_IMPL_VIA_ANY"); return MFX_ERR_UNDEFINED_BEHAVIOR; // VAAPI is only one supported interface case MFX_IMPL_VIA_ANY: case MFX_IMPL_VIA_VAAPI: m_implInterface = MFX_IMPL_VIA_VAAPI; break; // unknown hardware interface default: if (MFX_PLATFORM_HARDWARE == m_currentPlatform) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } if (par.NumExtParam) { MFX_CHECK(par.ExtParam, MFX_ERR_UNSUPPORTED); } // get the number of available threads maxNumThreads = 0; if (par.ExternalThreads == 0) { maxNumThreads = std::min((mfxU32)default_threads_limit, (mfxU32)std::thread::hardware_concurrency()); if (maxNumThreads == 1) { maxNumThreads = 2; } } auto IsMaskValid = [](const std::pair> & affinityMask) -> bool { if (!affinityMask.first || affinityMask.first > 15) // va supports 16 sub-devices return false; mfxU8 byteIdx = 0; mfxU32 numPowerOfTwo = 0; for (auto val : affinityMask.second) { const auto length = affinityMask.first - (8*byteIdx); val &= (1<> affinityMask; if (extAffinityMask) { std::vector mask(extAffinityMask->Mask, extAffinityMask->Mask + (extAffinityMask->NumSubDevices + 7) / 8); affinityMask = {extAffinityMask->NumSubDevices, std::move(mask)}; MFX_CHECK(IsMaskValid(affinityMask), MFX_ERR_UNSUPPORTED); } // allocate video core if (MFX_PLATFORM_SOFTWARE == m_currentPlatform) { m_pCORE.reset(FactoryCORE::CreateCORE(MFX_HW_NO, 0, {}, maxNumThreads, this)); } else { m_pCORE.reset(FactoryCORE::CreateCORE(MFX_HW_VAAPI, m_adapterNum, affinityMask, maxNumThreads, this)); } // query the scheduler interface m_pScheduler = ::QueryInterface(m_pSchedulerAllocated, MFXIScheduler_GUID); if (NULL == m_pScheduler) { return MFX_ERR_UNKNOWN; } MFXIScheduler2* pScheduler2 = ::QueryInterface(m_pSchedulerAllocated, MFXIScheduler2_GUID); auto threadsParam = (mfxExtThreadsParam*) mfx::GetExtBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_THREADS_PARAM); if (threadsParam && !pScheduler2) { return MFX_ERR_UNKNOWN; } if (pScheduler2) { MFX_SCHEDULER_PARAM2 schedParam; memset(&schedParam, 0, sizeof(schedParam)); schedParam.flags = MFX_SCHEDULER_DEFAULT; #if defined(MFX_ENABLE_SINGLE_THREAD) if (isSingleThreadMode) schedParam.flags = MFX_SINGLE_THREAD; #endif schedParam.numberOfThreads = maxNumThreads; schedParam.pCore = m_pCORE.get(); if (threadsParam) { schedParam.params = *threadsParam; } mfxRes = pScheduler2->Initialize2(&schedParam); m_pScheduler->Release(); } else { MFX_SCHEDULER_PARAM schedParam; memset(&schedParam, 0, sizeof(schedParam)); schedParam.flags = MFX_SCHEDULER_DEFAULT; #if defined(MFX_ENABLE_SINGLE_THREAD) if (isSingleThreadMode) schedParam.flags = MFX_SINGLE_THREAD; #endif schedParam.numberOfThreads = maxNumThreads; schedParam.pCore = m_pCORE.get(); mfxRes = m_pScheduler->Initialize(&schedParam); } if (MFX_ERR_NONE != mfxRes) { return mfxRes; } m_pOperatorCore = new OperatorCORE(m_pCORE.get()); auto IsGPUcopyValid = [](mfxU16 gpu_copy) -> bool { return gpu_copy == MFX_GPUCOPY_DEFAULT || gpu_copy == MFX_GPUCOPY_ON || gpu_copy == MFX_GPUCOPY_OFF #ifdef ONEVPL_EXPERIMENTAL || gpu_copy == MFX_GPUCOPY_SAFE #endif ; }; MFX_CHECK(IsGPUcopyValid(par.GPUCopy), MFX_ERR_UNSUPPORTED); if (MFX_PLATFORM_SOFTWARE == m_currentPlatform && (MFX_GPUCOPY_ON == par.GPUCopy #ifdef ONEVPL_EXPERIMENTAL || MFX_GPUCOPY_SAFE == par.GPUCopy #endif )) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (par.GPUCopy != MFX_GPUCOPY_DEFAULT) { CMEnabledCoreInterface* pCmCore = QueryCoreInterface(m_pCORE.get()); if (pCmCore) { pCmCore->SetCmCopyMode(par.GPUCopy); } } return MFX_ERR_NONE; } // mfxStatus _mfxVersionedSessionImpl::InitEx(mfxInitParam& par); //explicit specification of interface creation template<> MFXISession_1_10* CreateInterfaceInstance(const MFX_GUID &guid) { if (MFXISession_1_10_GUID == guid) return (MFXISession_1_10*) (new _mfxVersionedSessionImpl(0)); return NULL; } template<> MFXISession_2_1* CreateInterfaceInstance(const MFX_GUID &guid) { if (MFXISession_2_1_GUID == guid) return (MFXISession_2_1*)(new _mfxVersionedSessionImpl(0)); return NULL; } namespace MFX { unsigned int CreateUniqId() { static volatile mfxU32 g_tasksId = 0; return (unsigned int)vm_interlocked_inc32(&g_tasksId); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_vc1_dec_common.cpp000066400000000000000000000747201443134507600306560ustar00rootroot00000000000000// Copyright (c) 2004-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "mfx_vc1_dec_common.h" #include "umc_vc1_common.h" #include "mfx_common_int.h" #include "umc_vc1_dec_seq.h" mfxStatus MFXVC1DecCommon::ConvertMfxToCodecParams(mfxVideoParam *par, UMC::BaseCodecParams* pVideoParams) { UMC::VideoDecoderParams *init = DynamicCast(pVideoParams); if (init) { init->info.clip_info.height = par->mfx.FrameInfo.Height; init->info.clip_info.width = par->mfx.FrameInfo.Width; if (MFX_PROFILE_VC1_ADVANCED == par->mfx.CodecProfile) { init->info.stream_subtype = UMC::VC1_VIDEO_VC1; init->info.stream_type = UMC::VC1_VIDEO; } else if ((MFX_PROFILE_VC1_MAIN == par->mfx.CodecProfile)|| (MFX_PROFILE_VC1_SIMPLE == par->mfx.CodecProfile)) { init->info.stream_subtype = UMC::VC1_VIDEO_RCV; } return MFX_ERR_NONE; } else return MFX_ERR_UNKNOWN; } mfxStatus MFXVC1DecCommon::Query(VideoCORE* core, mfxVideoParam *in, mfxVideoParam *out) { mfxStatus sts = MFX_ERR_NONE; memset(&out->vpp, 0, sizeof(mfxInfoVPP)); memset(&out->mfx, 0, sizeof(mfxInfoMFX)); if (in) { // frame info { // mfxFrameInfo if (in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12) out->mfx.FrameInfo.FourCC = in->mfx.FrameInfo.FourCC; else sts = MFX_ERR_UNSUPPORTED; if ((in->mfx.FrameInfo.Width % 16 == 0)) out->mfx.FrameInfo.Width = in->mfx.FrameInfo.Width; else sts = MFX_ERR_UNSUPPORTED; if ((in->mfx.FrameInfo.Height % 16 == 0)) out->mfx.FrameInfo.Height = in->mfx.FrameInfo.Height; else sts = MFX_ERR_UNSUPPORTED; if (in->mfx.FrameInfo.CropX <= out->mfx.FrameInfo.Width) out->mfx.FrameInfo.CropX = in->mfx.FrameInfo.CropX; else sts = MFX_ERR_UNSUPPORTED; if (in->mfx.FrameInfo.CropY <= out->mfx.FrameInfo.Height) out->mfx.FrameInfo.CropY = in->mfx.FrameInfo.CropY; else sts = MFX_ERR_UNSUPPORTED; if (out->mfx.FrameInfo.CropX + in->mfx.FrameInfo.CropW <= out->mfx.FrameInfo.Width) out->mfx.FrameInfo.CropW = in->mfx.FrameInfo.CropW; else sts = MFX_ERR_UNSUPPORTED; if (out->mfx.FrameInfo.CropY + in->mfx.FrameInfo.CropH <= out->mfx.FrameInfo.Height) out->mfx.FrameInfo.CropH = in->mfx.FrameInfo.CropH; else sts = MFX_ERR_UNSUPPORTED; out->mfx.FrameInfo.FrameRateExtN = in->mfx.FrameInfo.FrameRateExtN; out->mfx.FrameInfo.FrameRateExtD = in->mfx.FrameInfo.FrameRateExtD; out->mfx.FrameInfo.AspectRatioW = in->mfx.FrameInfo.AspectRatioW; out->mfx.FrameInfo.AspectRatioH = in->mfx.FrameInfo.AspectRatioH; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: case MFX_PICSTRUCT_FIELD_REPEATED: case MFX_PICSTRUCT_FRAME_DOUBLING: case MFX_PICSTRUCT_FRAME_TRIPLING: out->mfx.FrameInfo.PicStruct = in->mfx.FrameInfo.PicStruct; break; } if (in->IOPattern) { if ((in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY) || (in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY) ) out->IOPattern = in->IOPattern; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } if (in->Protected) { out->Protected = in->Protected; if (!(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) sts = MFX_ERR_UNSUPPORTED; if (in->NumExtParam) sts = MFX_ERR_UNSUPPORTED; } else { mfxStatus stsExt = CheckDecodersExtendedBuffers(in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV420) out->mfx.FrameInfo.ChromaFormat = in->mfx.FrameInfo.ChromaFormat; else sts = MFX_ERR_UNSUPPORTED; } if (MFX_CODEC_VC1== in->mfx.CodecId) out->mfx.CodecId = MFX_CODEC_VC1; if ((MFX_PROFILE_VC1_SIMPLE == in->mfx.CodecProfile)|| (MFX_PROFILE_VC1_MAIN == in->mfx.CodecProfile)|| (MFX_PROFILE_VC1_ADVANCED == in->mfx.CodecProfile)) out->mfx.CodecProfile = in->mfx.CodecProfile; // simple/main profiles if ((MFX_LEVEL_VC1_LOW == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_MEDIAN == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_HIGH == in->mfx.CodecLevel)) out->mfx.CodecLevel = in->mfx.CodecLevel; //advanced profile if ((MFX_LEVEL_VC1_0 == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_1 == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_2 == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_3 == in->mfx.CodecLevel)|| (MFX_LEVEL_VC1_4 == in->mfx.CodecLevel)) out->mfx.CodecLevel = in->mfx.CodecLevel; if (in->mfx.DecodedOrder) return MFX_ERR_UNSUPPORTED; if (in->mfx.NumThread) out->mfx.NumThread = in->mfx.NumThread; if ((in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || (in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) out->IOPattern = in->IOPattern; else if (MFX_PLATFORM_SOFTWARE == core->GetPlatformType()) out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; else out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; if (in->AsyncDepth < MFX_MAX_ASYNC_DEPTH_VALUE) out->AsyncDepth = in->AsyncDepth; if (in->mfx.ExtendedPicStruct) { if (in->mfx.ExtendedPicStruct == 1) out->mfx.ExtendedPicStruct = in->mfx.ExtendedPicStruct; else sts = MFX_ERR_UNSUPPORTED; } out->mfx.TimeStampCalc = in->mfx.TimeStampCalc; out->mfx.SliceGroupsPresent = 0; } else { memset(&out->mfx.FrameInfo, 1, sizeof(mfxFrameInfo)); out->mfx.CodecId = MFX_CODEC_VC1; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.NumSlice = 1; out->mfx.ExtendedPicStruct = 1; out->mfx.TimeStampCalc = 1; out->mfx.SliceGroupsPresent = 0; // mfxFrameInfo out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; out->mfx.FrameInfo.Width = 16; out->mfx.FrameInfo.Height = 16; out->mfx.FrameInfo.CropX = 1; out->mfx.FrameInfo.CropY = 1; out->mfx.FrameInfo.CropW = 1; out->mfx.FrameInfo.CropH = 1; out->AsyncDepth = 1; out->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (MFX_PLATFORM_SOFTWARE == core->GetPlatformType()) out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; else out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } return sts; } mfxStatus MFXVC1DecCommon::ParseSeqHeader(mfxBitstream *bs, mfxVideoParam *par, mfxExtVideoSignalInfo *pVideoSignal, mfxExtCodingOptionSPSPPS *pSPS) { mfxStatus MFXSts = MFX_ERR_NONE; if (bs->DataLength < 4) return MFX_ERR_MORE_DATA; // allocated bitstream should be enoudh to parse sequnce header mfxU8 pt_data[1024]; mfxU32* pbs; mfxI32 bitOffset = 31; mfxI32 SHLen = 0; //in bits mfxU32 tempData = GetDWord_s(bs->Data); mfxBitstream bs_out = {}; bool NeedToMapFR = false; mfxU32 frCode = 0; mfxU16 TargetKbps = par->mfx.TargetKbps; memset(par, 0, sizeof(mfxVideoParam)); par->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; par->mfx.CodecId = MFX_CODEC_VC1; par->mfx.TargetKbps = TargetKbps; // simple profile checking // may be need to update if (*(bs->Data+3) == 0xC5) { par->mfx.CodecProfile = MFX_PROFILE_VC1_MAIN; } else // probably advanced profile { bs_out.Data = pt_data; bs_out.MaxLength = 1024; MFXSts = PrepareSeqHeader(bs, &bs_out); if (MFX_ERR_NONE != MFXSts) { return MFX_ERR_NOT_INITIALIZED; } if (pSPS) { if (pSPS->SPSBufSize < bs_out.DataLength) return MFX_ERR_NOT_ENOUGH_BUFFER; std::copy(bs_out.Data, bs_out.Data + bs_out.DataLength, pSPS->SPSBuffer); pSPS->SPSBufSize = (mfxU16)bs_out.DataLength; } par->mfx.CodecProfile = MFX_PROFILE_VC1_ADVANCED; } par->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; mfxExtVideoSignalInfo videoSignal = {}; videoSignal.ColourPrimaries = 1; videoSignal.TransferCharacteristics = 1; videoSignal.MatrixCoefficients = 6; if (MFX_PROFILE_VC1_ADVANCED == par->mfx.CodecProfile) { SHLen =bs_out.DataLength*8; // first 19 bytes are needed only mfxU8* pTemp = bs_out.Data + 4; // skip start code VC1CheckDataLen(SHLen,32); UMC::VC1Common::SwapData(pTemp,19); pbs = (mfxU32*)pTemp; //PROFILE VC1CheckDataLen(SHLen,2); VC1GetNBits(pbs, bitOffset, 2, tempData); if(tempData == VC1_PROFILE_ADVANCED) //PROFILE { //LEVEL VC1CheckDataLen(SHLen,3); VC1GetNBits(pbs, bitOffset, 3, tempData); //CHROMAFORMAT VC1CheckDataLen(SHLen,2); VC1GetNBits(pbs, bitOffset, 2,tempData); //FRMRTQ_POSTPROC VC1CheckDataLen(SHLen,3); VC1GetNBits(pbs, bitOffset, 3, tempData); frCode = tempData; //BITRTQ_POSTPROC. BitRate VC1CheckDataLen(SHLen,5); VC1GetNBits(pbs, bitOffset, 5, tempData); par->mfx.TargetKbps = (mfxU16)tempData; //for advanced profile if ((frCode == 0) && (par->mfx.TargetKbps == 31)) { //Post processing indicators for Frame Rate and Bit Rate are undefined par->mfx.TargetKbps = 0; } else if ((frCode == 0) && (par->mfx.TargetKbps == 30)) { if (par->mfx.FrameInfo.FrameRateExtN && par->mfx.FrameInfo.FrameRateExtD) { mfxF64 frate = (mfxF64)par->mfx.FrameInfo.FrameRateExtN / par->mfx.FrameInfo.FrameRateExtD; if (frate < 1 || frate > 3) // we need to set frame rate is around 2 { par->mfx.FrameInfo.FrameRateExtN = 2; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 2; par->mfx.FrameInfo.FrameRateExtD = 1; } if (par->mfx.TargetKbps) { if (par->mfx.TargetKbps < 1952) par->mfx.TargetKbps = 1952; } else par->mfx.TargetKbps = 1952; } else if ((frCode == 1) && (par->mfx.TargetKbps == 31)) { if (par->mfx.FrameInfo.FrameRateExtN && par->mfx.FrameInfo.FrameRateExtD) { mfxF64 frate = (mfxF64)par->mfx.FrameInfo.FrameRateExtN / par->mfx.FrameInfo.FrameRateExtD; if (frate < 5 || frate > 6) // we need to set frame rate is around 1 { par->mfx.FrameInfo.FrameRateExtN = 6; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 6; par->mfx.FrameInfo.FrameRateExtD = 1; } if (par->mfx.TargetKbps) { if (par->mfx.TargetKbps < 2016) par->mfx.TargetKbps = 2016; } else par->mfx.TargetKbps = 2016; } else { if (7 == frCode) { if (par->mfx.FrameInfo.FrameRateExtN && par->mfx.FrameInfo.FrameRateExtD) { mfxF64 frate = (mfxF64)par->mfx.FrameInfo.FrameRateExtN / par->mfx.FrameInfo.FrameRateExtD; if (frate < 30) // we need to set frame rate is around or more than 30 { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 2 + frCode*4; par->mfx.FrameInfo.FrameRateExtD = 1; } if (par->mfx.TargetKbps == 31) par->mfx.TargetKbps = 2016; else par->mfx.TargetKbps = (32 + par->mfx.TargetKbps * 64); } //POSTPROCFLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); //MAX_CODED_WIDTH VC1CheckDataLen(SHLen,12); VC1GetNBits(pbs, bitOffset, 12, tempData); par->mfx.FrameInfo.Width = (mfxU16)tempData; par->mfx.FrameInfo.Width = (par->mfx.FrameInfo.Width +1)*2; //MAX_CODED_HEIGHT VC1CheckDataLen(SHLen,12); VC1GetNBits(pbs, bitOffset, 12, tempData); par->mfx.FrameInfo.Height = (mfxU16)tempData; par->mfx.FrameInfo.Height = (par->mfx.FrameInfo.Height + 1)*2; par->mfx.FrameInfo.CropH = par->mfx.FrameInfo.Height; par->mfx.FrameInfo.CropW = par->mfx.FrameInfo.Width; //PULLDOWN VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); //INTERLACE VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN; // TBD video_info->interlace_type = INTERLEAVED_TOP_FIELD_FIRST; else par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; if (MFX_PICSTRUCT_PROGRESSIVE == par->mfx.FrameInfo.PicStruct) { // sizes should be align on 16 or 32 in case of fields // !!!!!!!!!!!!!!!!!!!!!TBD. What is aligh in case of fields par->mfx.FrameInfo.Height = mfx::align2_value(par->mfx.FrameInfo.Height, 16); par->mfx.FrameInfo.Width = mfx::align2_value(par->mfx.FrameInfo.Width, 16); } else { // sizes should be align on 16 or 32 in case of fields par->mfx.FrameInfo.Height = mfx::align2_value(par->mfx.FrameInfo.Height, 32); par->mfx.FrameInfo.Width = mfx::align2_value(par->mfx.FrameInfo.Width, 16); } //TFCNTRFLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); //FINTERPFLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1CheckDataLen(SHLen,2); VC1GetNBits(pbs, bitOffset, 2, tempData); //DISPLAY_EXT VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) //DISPLAY_EXT { //DISP_HORIZ_SIZE VC1CheckDataLen(SHLen,14); VC1GetNBits(pbs, bitOffset, 14,tempData); //TBD!!!!! Need to compare the real size with reference //par->mfx.FrameInfo.CropW = tempData + 1; //DISP_VERT_SIZE VC1CheckDataLen(SHLen,14); VC1GetNBits(pbs, bitOffset, 14,tempData); //TBD!!!!! Need to compare the real size with reference //par->mfx.FrameInfo.CropH = tempData + 1; //ASPECT_RATIO_FLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //ASPECT_RATIO_FLAG { //ASPECT_RATIO VC1CheckDataLen(SHLen,4); VC1GetNBits(pbs, bitOffset, 4,tempData); if(tempData == 15) { //ASPECT_HORIZ_SIZE VC1CheckDataLen(SHLen,8); VC1GetNBits(pbs, bitOffset, 8, tempData); par->mfx.FrameInfo.AspectRatioH = (mfxU16)tempData; //ASPECT_VERT_SIZE VC1CheckDataLen(SHLen,9); VC1GetNBits(pbs, bitOffset, 8, tempData); par->mfx.FrameInfo.AspectRatioW = (mfxU16)tempData; } } //FRAMERATE_FLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //FRAMERATE_FLAG { //FRAMERATEIND VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1,tempData); if(!tempData) //FRAMERATEIND { NeedToMapFR = true; //FRAMERATENR VC1CheckDataLen(SHLen,8); VC1GetNBits(pbs, bitOffset, 8,tempData); par->mfx.FrameInfo.FrameRateExtN = tempData; //FRAMERATEDR VC1CheckDataLen(SHLen,4); VC1GetNBits(pbs, bitOffset, 4,tempData); par->mfx.FrameInfo.FrameRateExtD = tempData; } else { //FRAMERATEEXP VC1CheckDataLen(SHLen,16); VC1GetNBits(pbs, bitOffset, 16,tempData); //par->mfx.FrameInfo.FrameRateCode = mfxU16((tempData + 1)/32.0); } } //COLOR_FORMAT_FLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //COLOR_FORMAT_FLAG { videoSignal.ColourDescriptionPresent = 1; //COLOR_PRIM VC1CheckDataLen(SHLen,8); VC1GetNBits(pbs, bitOffset, 8,tempData); videoSignal.ColourPrimaries = (mfxU16)tempData; //TRANSFER_CHAR VC1CheckDataLen(SHLen,8); VC1GetNBits(pbs, bitOffset, 8, tempData); videoSignal.TransferCharacteristics = (mfxU16)tempData; //MATRIX_COEF VC1CheckDataLen(SHLen,8); VC1GetNBits(pbs, bitOffset, 8, tempData); videoSignal.MatrixCoefficients = (mfxU16)tempData; } } ////HRD_PARAM_FLAG VC1CheckDataLen(SHLen,1); VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) //HRD_PARAM_FLAG { mfxU32 hrd_num; //HRD_NUM_LEAKY_BUCKETS VC1CheckDataLen(SHLen,5); VC1GetNBits(pbs, bitOffset, 5,hrd_num); //BIT_RATE_EXPONENT VC1CheckDataLen(SHLen,4); VC1GetNBits(pbs, bitOffset, 4,tempData); //BUFFER_SIZE_EXPONENT VC1CheckDataLen(SHLen,4); VC1GetNBits(pbs, bitOffset, 4,tempData); //!!!!!! for(mfxU8 i=0; i < hrd_num; i++)//HRD_NUM_LEAKY_BUCKETS { //HRD_RATE[i] VC1CheckDataLen(SHLen,16); VC1GetNBits(pbs, bitOffset, 16,tempData); //HRD_BUFFER[i] VC1CheckDataLen(SHLen,16); VC1GetNBits(pbs, bitOffset, 16,tempData); } } } // calculate frame rate according to MFX if (NeedToMapFR) { MapFrameRateIntoMfx(par->mfx.FrameInfo.FrameRateExtN, par->mfx.FrameInfo.FrameRateExtD, (Ipp16u)frCode); //frCode = MFX_FRAMERATE_24; } } // Advanced profile else { mfxU32 size = GetDWord_s(bs->Data + 4); if (bs->DataLength < size + 16) { return MFX_ERR_MORE_DATA; } if (pSPS) { if (pSPS->SPSBufSize < (size + 16)) return MFX_ERR_NOT_ENOUGH_BUFFER; std::copy(bs->Data, bs->Data + size + 16, pSPS->SPSBuffer); pSPS->SPSBufSize = (mfxU16)(size + 16); } //Simple/Main profile par->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; par->mfx.FrameInfo.Height = (mfxU16)GetDWord_s(bs->Data + 8 + size); par->mfx.FrameInfo.Width = (mfxU16)GetDWord_s(bs->Data + 12 + size); // there is no coded cropping par->mfx.FrameInfo.CropH = par->mfx.FrameInfo.Height; par->mfx.FrameInfo.CropW = par->mfx.FrameInfo.Width; // sizes should be aligned par->mfx.FrameInfo.Height = mfx::align2_value(par->mfx.FrameInfo.Height, 16); par->mfx.FrameInfo.Width = mfx::align2_value(par->mfx.FrameInfo.Width, 16); mfxU32 tDWord = GetDWord_s(bs->Data + size); pbs = &tDWord; UMC::VC1Common::SwapData((mfxU8*)pbs,0); //PROFILE VC1GetNBits(pbs, bitOffset, 2, tempData); //LEVEL VC1GetNBits(pbs, bitOffset, 2, tempData); //FRMRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 3, tempData); frCode = tempData; if (7 == frCode) { if (par->mfx.FrameInfo.FrameRateExtN && par->mfx.FrameInfo.FrameRateExtD) { mfxF64 frate = (mfxF64)par->mfx.FrameInfo.FrameRateExtN / par->mfx.FrameInfo.FrameRateExtD; if (frate < 30) // we need to set frame rate is around or more than 30 { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.FrameInfo.FrameRateExtD = 1; } } else { par->mfx.FrameInfo.FrameRateExtN = 2 + frCode*4; par->mfx.FrameInfo.FrameRateExtD = 1; } //BITRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 5, tempData); par->mfx.TargetKbps = (mfxU16)tempData; if (par->mfx.TargetKbps == 31) par->mfx.TargetKbps = 2016; else par->mfx.TargetKbps = (32 + par->mfx.TargetKbps * 64); //LOOPFILTER VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //MULTIRES VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //FASTUVMC VC1GetNBits(pbs, bitOffset, 1, tempData); //EXTENDED_MV VC1GetNBits(pbs, bitOffset, 1, tempData); //DQUANT VC1GetNBits(pbs, bitOffset, 2, tempData); //VSTRANSFORM VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //OVERLAP VC1GetNBits(pbs, bitOffset, 1, tempData); //SYNCMARKER VC1GetNBits(pbs, bitOffset, 1, tempData); //RANGERED VC1GetNBits(pbs, bitOffset, 1, tempData); //MAXBFRAMES VC1GetNBits(pbs, bitOffset, 3, tempData); //QUANTIZER VC1GetNBits(pbs, bitOffset, 2, tempData); //FINTERPFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); } // SM profile if (pVideoSignal) { *pVideoSignal = videoSignal; } return MFXSts; } mfxStatus MFXVC1DecCommon::PrepareSeqHeader(mfxBitstream *bs_in, mfxBitstream *bs_out) { mfxU32 readBufSize = bs_in->DataLength; mfxU8* readBuf = bs_in->Data + bs_in->DataOffset; mfxU8* readPos = readBuf; mfxU32 readDataSize = 0; mfxI32 size = 0; mfxU32 a = 0x0000FF00 | (*readPos); mfxU32 b = 0xFFFFFFFF; bool isFindFirstSC = false; while(readPos < (readBuf + readBufSize)) { //find sequence of 0x000001 or 0x000003 while(!( b == 0x00000001 || b == 0x00000003 ) &&(++readPos < (readBuf + readBufSize))) { a = (a<<8)| (mfxI32)(*readPos); b = a & 0x00FFFFFF; } //check end of read buffer if(readPos < (readBuf + readBufSize - 1)) { if(*readPos == 0x01) { if((*(readPos + 1) == VC1_SequenceHeader) && !isFindFirstSC) { readPos++; a = 0x00000100 |(mfxI32)(*readPos); b = a & 0x00FFFFFF; isFindFirstSC = true; size = (mfxU32)(readPos - readBuf - readDataSize - 3); readDataSize = readDataSize + size; bs_in->DataOffset += size; bs_in->DataLength -= size; } else if (isFindFirstSC) // SH start code already find. Complete unit { //end of SH readPos = readPos - 2; Ipp8u* ptr = readPos - 1; //trim zero bytes while ( (*ptr==0) && (ptr > readBuf) ) ptr--; size = (Ipp32u)(ptr - readBuf - readDataSize +1); if(size + bs_out->DataOffset > bs_out->MaxLength) return MFX_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(bs_out->Data + bs_out->DataOffset, readBuf + readDataSize, size); bs_out->DataLength = size; return MFX_ERR_NONE; } else { readPos++; a = 0x00000100 |(mfxI32)(*readPos); b = a & 0x00FFFFFF; } } else { if (isFindFirstSC) { size = (Ipp32u)(readPos - readBuf - readDataSize); if(size + bs_out->DataOffset > bs_out->MaxLength) return MFX_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(bs_out->Data + bs_out->DataOffset, readBuf + readDataSize, size); bs_out->DataOffset += size; readDataSize = readDataSize + size + 1; } readPos++; a = (a<<8)| (mfxI32)(*readPos); b = a & 0x00FFFFFF; } } else if (!isFindFirstSC) { bs_in->DataOffset += bs_in->DataLength - 4; bs_in->DataLength = 4; return MFX_ERR_MORE_DATA; } else { //not found next SC if(bs_in->DataFlag & MFX_BITSTREAM_COMPLETE_FRAME || bs_in->DataFlag & MFX_BITSTREAM_EOS) { if (isFindFirstSC) // SH start code already find. Complete unit { //end of SH readPos = readPos - 2; Ipp8u* ptr = readPos - 1; //trim zero bytes while ( (*ptr==0) && (ptr > readBuf) ) ptr--; size = (Ipp32u)(ptr - readBuf - readDataSize +1); if(size + bs_out->DataOffset > bs_out->MaxLength) return MFX_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(bs_out->Data + bs_out->DataOffset, readBuf + readDataSize, size); bs_out->DataLength = size; return MFX_ERR_NONE; } else { bs_in->DataOffset += bs_in->DataLength - 4; bs_in->DataLength = 4; return MFX_ERR_MORE_DATA; } } else return MFX_ERR_MORE_DATA; } } // move pointers and wait for next data if (!isFindFirstSC) { bs_in->DataOffset += bs_in->DataLength - 4; bs_in->DataLength = 4; } return MFX_ERR_MORE_DATA; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/shared/src/mfx_vpx_dec_common.cpp000066400000000000000000000415521443134507600307770ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vpx_dec_common.h" #include "mfx_common_decode_int.h" #include "mfx_enc_common.h" #include "umc_defs.h" #include "ippcc.h" namespace MFX_VPX_Utility { inline mfxU32 GetMaxWidth(mfxU32 codecId) { switch (codecId) { case MFX_CODEC_VP8: return 4096; case MFX_CODEC_VP9: return 16384; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case MFX_CODEC_AV1: return 16384; #endif default: return 0; } } inline mfxU32 GetMaxHeight(mfxU32 codecId) { switch (codecId) { case MFX_CODEC_VP8: return 4096; case MFX_CODEC_VP9: return 16384; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case MFX_CODEC_AV1: return 16384; #endif default: return 0; } } inline bool CheckProfile(mfxU32 codecId, mfxU16 profile) { switch (codecId) { case MFX_CODEC_VP8: return profile <= MFX_PROFILE_VP8_3; case MFX_CODEC_VP9: return profile <= MFX_PROFILE_VP9_3; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case MFX_CODEC_AV1: return profile <= MFX_PROFILE_AV1_PRO; #endif default: return false; } } mfxStatus Query(VideoCORE *core, mfxVideoParam const*p_in, mfxVideoParam *p_out, mfxU32 codecId, eMFXHWType type) { MFX_CHECK_NULL_PTR1(p_out); mfxStatus sts = MFX_ERR_NONE; if (p_in == p_out) { mfxVideoParam in1; MFX_INTERNAL_CPY(&in1, p_in, sizeof(mfxVideoParam)); return Query(core, &in1, p_out, codecId, type); } memset(&p_out->mfx, 0, sizeof(mfxInfoMFX)); if (p_in) { if (p_in->mfx.CodecId == codecId) p_out->mfx.CodecId = p_in->mfx.CodecId; if (CheckProfile(codecId, p_in->mfx.CodecProfile)) p_out->mfx.CodecProfile = p_in->mfx.CodecProfile; switch (p_in->mfx.CodecLevel) { case MFX_LEVEL_UNKNOWN: p_out->mfx.CodecLevel = p_in->mfx.CodecLevel; break; } #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) if (codecId == MFX_CODEC_AV1) { p_out->mfx.CodecLevel = p_in->mfx.CodecLevel; p_out->mfx.FilmGrain = p_in->mfx.FilmGrain; } #endif if (p_in->mfx.NumThread < 128) p_out->mfx.NumThread = p_in->mfx.NumThread; if (p_in->AsyncDepth < MFX_MAX_ASYNC_DEPTH_VALUE) // Actually AsyncDepth > 5-7 is for debugging only. p_out->AsyncDepth = p_in->AsyncDepth; if (p_in->IOPattern) { if ((p_in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || (p_in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY)) p_out->IOPattern = p_in->IOPattern; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } switch (p_in->mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_AYUV: case MFX_FOURCC_P010: case MFX_FOURCC_Y410: case MFX_FOURCC_P016: case MFX_FOURCC_Y416: p_out->mfx.FrameInfo.FourCC = p_in->mfx.FrameInfo.FourCC; break; default: sts = MFX_ERR_UNSUPPORTED; break; } switch (p_in->mfx.FrameInfo.ChromaFormat) { case MFX_CHROMAFORMAT_YUV420: case MFX_CHROMAFORMAT_YUV444: p_out->mfx.FrameInfo.ChromaFormat = p_in->mfx.FrameInfo.ChromaFormat; break; default: if (p_in->mfx.FrameInfo.FourCC) sts = MFX_ERR_UNSUPPORTED; break; } if (p_in->mfx.FrameInfo.FourCC && p_in->mfx.FrameInfo.ChromaFormat) { if (( p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_AYUV && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) //|| (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV422) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y410 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444)) { p_out->mfx.FrameInfo.FourCC = 0; p_out->mfx.FrameInfo.ChromaFormat = 0; p_out->mfx.FrameInfo.BitDepthLuma = 0; p_out->mfx.FrameInfo.BitDepthChroma = 0; sts = MFX_ERR_UNSUPPORTED; } } p_out->mfx.FrameInfo.BitDepthLuma = p_in->mfx.FrameInfo.BitDepthLuma; p_out->mfx.FrameInfo.BitDepthChroma = p_in->mfx.FrameInfo.BitDepthChroma; p_out->mfx.FrameInfo.Shift = p_in->mfx.FrameInfo.Shift; if ((p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12 || p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_AYUV) && ((p_in->mfx.FrameInfo.BitDepthLuma != 0 && p_in->mfx.FrameInfo.BitDepthLuma != 8) || (p_in->mfx.FrameInfo.BitDepthChroma != 0 && p_in->mfx.FrameInfo.BitDepthChroma != 8) || p_in->mfx.FrameInfo.Shift)) { p_out->mfx.FrameInfo.BitDepthLuma = 0; p_out->mfx.FrameInfo.BitDepthChroma = 0; p_out->mfx.FrameInfo.Shift = 0; sts = MFX_ERR_UNSUPPORTED; } if (( p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y410) && ((p_in->mfx.FrameInfo.BitDepthLuma != 0 && p_in->mfx.FrameInfo.BitDepthLuma != 10) || (p_in->mfx.FrameInfo.BitDepthChroma != 0 && p_in->mfx.FrameInfo.BitDepthChroma != 10))) { p_out->mfx.FrameInfo.BitDepthLuma = 0; p_out->mfx.FrameInfo.BitDepthChroma = 0; p_out->mfx.FrameInfo.Shift = 0; sts = MFX_ERR_UNSUPPORTED; } if (( p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) && ((p_in->mfx.FrameInfo.BitDepthLuma != 0 && p_in->mfx.FrameInfo.BitDepthLuma != 12) || (p_in->mfx.FrameInfo.BitDepthChroma != 0 && p_in->mfx.FrameInfo.BitDepthChroma != 12))) { p_out->mfx.FrameInfo.BitDepthLuma = 0; p_out->mfx.FrameInfo.BitDepthChroma = 0; p_out->mfx.FrameInfo.Shift = 0; sts = MFX_ERR_UNSUPPORTED; } if (!p_in->mfx.FrameInfo.ChromaFormat && !(!p_in->mfx.FrameInfo.FourCC && !p_in->mfx.FrameInfo.ChromaFormat)) sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.Width % 16 == 0 && p_in->mfx.FrameInfo.Width <= GetMaxWidth(codecId)) p_out->mfx.FrameInfo.Width = p_in->mfx.FrameInfo.Width; else sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.Height % 16 == 0 && p_in->mfx.FrameInfo.Height <= GetMaxHeight(codecId)) p_out->mfx.FrameInfo.Height = p_in->mfx.FrameInfo.Height; else sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.FrameInfo.CropX <= p_out->mfx.FrameInfo.Width) p_out->mfx.FrameInfo.CropX = p_in->mfx.FrameInfo.CropX; if (p_in->mfx.FrameInfo.CropY <= p_out->mfx.FrameInfo.Height) p_out->mfx.FrameInfo.CropY = p_in->mfx.FrameInfo.CropY; if (p_out->mfx.FrameInfo.CropX + p_in->mfx.FrameInfo.CropW <= p_out->mfx.FrameInfo.Width) p_out->mfx.FrameInfo.CropW = p_in->mfx.FrameInfo.CropW; if (p_out->mfx.FrameInfo.CropY + p_in->mfx.FrameInfo.CropH <= p_out->mfx.FrameInfo.Height) p_out->mfx.FrameInfo.CropH = p_in->mfx.FrameInfo.CropH; if (p_in->mfx.FrameInfo.FrameRateExtN != 0 && p_in->mfx.FrameInfo.FrameRateExtD == 0) { sts = MFX_ERR_UNSUPPORTED; } else { p_out->mfx.FrameInfo.FrameRateExtN = p_in->mfx.FrameInfo.FrameRateExtN; p_out->mfx.FrameInfo.FrameRateExtD = p_in->mfx.FrameInfo.FrameRateExtD; } if ((p_in->mfx.FrameInfo.AspectRatioW == 0 && p_in->mfx.FrameInfo.AspectRatioH == 0) || (p_in->mfx.FrameInfo.AspectRatioW != 0 && p_in->mfx.FrameInfo.AspectRatioH != 0)) { p_out->mfx.FrameInfo.AspectRatioW = p_in->mfx.FrameInfo.AspectRatioW; p_out->mfx.FrameInfo.AspectRatioH = p_in->mfx.FrameInfo.AspectRatioH; } else { sts = MFX_ERR_UNSUPPORTED; } switch (p_in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: p_out->mfx.FrameInfo.PicStruct = p_in->mfx.FrameInfo.PicStruct; break; default: sts = MFX_ERR_UNSUPPORTED; break; } if (p_in->mfx.ExtendedPicStruct) sts = MFX_ERR_UNSUPPORTED; if (p_in->mfx.DecodedOrder) sts = MFX_ERR_UNSUPPORTED; mfxStatus stsExt = CheckDecodersExtendedBuffers(p_in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; if (p_in->Protected) { sts = MFX_ERR_UNSUPPORTED; } } else { p_out->mfx.CodecId = codecId; p_out->mfx.CodecProfile = 1; p_out->mfx.CodecLevel = 1; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) if (codecId == MFX_CODEC_AV1) { p_out->mfx.CodecLevel = MFX_LEVEL_AV1_2; p_out->mfx.FilmGrain = 1; } #endif p_out->mfx.NumThread = 1; p_out->AsyncDepth = 1; // mfxFrameInfo p_out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; p_out->mfx.FrameInfo.Width = 16; p_out->mfx.FrameInfo.Height = 16; p_out->mfx.FrameInfo.FrameRateExtN = 1; p_out->mfx.FrameInfo.FrameRateExtD = 1; p_out->mfx.FrameInfo.BitDepthLuma = 8; p_out->mfx.FrameInfo.BitDepthChroma = 8; p_out->mfx.FrameInfo.Shift = 0; p_out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (type == MFX_HW_UNKNOWN) { p_out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } else { p_out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } } return sts; } bool CheckVideoParam(mfxVideoParam const*p_in, mfxU32 codecId, eMFXPlatform platform, eMFXHWType hwtype) { (void)hwtype; if (!p_in) return false; if (p_in->Protected) return false; if (codecId != p_in->mfx.CodecId) return false; if (codecId == MFX_CODEC_VP8 || platform == MFX_PLATFORM_SOFTWARE) if (p_in->mfx.FrameInfo.Width > 4096 || p_in->mfx.FrameInfo.Height > 4096) return false; if (p_in->mfx.FrameInfo.Height % 16 || p_in->mfx.FrameInfo.Width % 16) return false; if ((p_in->mfx.FrameInfo.AspectRatioW != 0 && p_in->mfx.FrameInfo.AspectRatioH == 0) || (p_in->mfx.FrameInfo.AspectRatioW == 0 && p_in->mfx.FrameInfo.AspectRatioH != 0)) return false; if (!(p_in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(p_in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; if ((p_in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (p_in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; if (codecId == MFX_CODEC_VP8) { if (MFX_FOURCC_NV12 != p_in->mfx.FrameInfo.FourCC) return false; if (MFX_CHROMAFORMAT_YUV420 != p_in->mfx.FrameInfo.ChromaFormat) { return false; } if (p_in->mfx.CodecProfile > MFX_PROFILE_VP8_3) return false; if (p_in->mfx.CodecLevel != MFX_LEVEL_UNKNOWN) return false; } else { if ( p_in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && p_in->mfx.FrameInfo.FourCC != MFX_FOURCC_AYUV && p_in->mfx.FrameInfo.FourCC != MFX_FOURCC_P010 && !(p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y410) && p_in->mfx.FrameInfo.FourCC != MFX_FOURCC_P016 && p_in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y416) return false; switch (p_in->mfx.FrameInfo.ChromaFormat) { case MFX_CHROMAFORMAT_YUV420: case MFX_CHROMAFORMAT_YUV422: case MFX_CHROMAFORMAT_YUV444: break; default: return false; } if (p_in->mfx.FrameInfo.ChromaFormat) { if ((p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_AYUV && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y410 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) || (p_in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416 && p_in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444)) return false; } } return true; } mfxStatus QueryIOSurfInternal(mfxVideoParam const*p_params, mfxFrameAllocRequest *p_request) { p_request->Info = p_params->mfx.FrameInfo; p_request->NumFrameMin = p_params->mfx.CodecId == MFX_CODEC_VP8 ? mfxU16(4) : mfxU16(8); p_request->NumFrameMin += p_params->AsyncDepth ? p_params->AsyncDepth : MFX_AUTO_ASYNC_DEPTH_VALUE; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) if ((p_params->mfx.CodecId == MFX_CODEC_AV1) && p_params->mfx.FilmGrain) p_request->NumFrameMin = 2 * p_request->NumFrameMin; // we need two output surfaces for each frame when film_grain is applied #endif // Increase minimum number by one // E.g., decoder unlocks references in sync part (NOT async), so in order to free some surface // application need an additional surface to call DecodeFrameAsync() p_request->NumFrameMin += 1; p_request->NumFrameSuggested = p_request->NumFrameMin; if (p_params->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) { p_request->Type = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_FROM_DECODE; } else if (p_params->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { p_request->Type = MFX_MEMTYPE_DXVA2_DECODER_TARGET | MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_FROM_DECODE; } return MFX_ERR_NONE; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/000077500000000000000000000000001443134507600231625ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/CMakeLists.txt000066400000000000000000000020451443134507600257230ustar00rootroot00000000000000 #==============MCTF======================================================== set(sources src/mfx_denoise_vpp.cpp src/mfx_detail_enhancement_vpp.cpp src/mfx_frame_rate_conversion_vpp.cpp src/mfx_perc_enc_vpp.cpp src/mfx_procamp_vpp.cpp src/mfx_vpp_factory.cpp src/mfx_vpp_hw.cpp src/mfx_vpp_main.cpp src/mfx_vpp_mvc.cpp src/mfx_vpp_sw_core.cpp src/mfx_vpp_sw_internal.cpp src/mfx_vpp_utils.cpp src/mfx_vpp_jpeg.cpp ) add_library(vpp_hw STATIC ${sources}) target_include_directories(vpp_hw PUBLIC include) target_link_libraries(vpp_hw PUBLIC mfx_static_lib umc_va_hw asc $<$:pxp_hw> PRIVATE vpp_hw_avx2 mfx_sdl_properties $<$:mfx_ext> ) add_library(vpp_hw_avx2 STATIC src/mfx_perc_enc_vpp_avx2.cpp) target_include_directories(vpp_hw_avx2 PUBLIC include) target_link_libraries(vpp_hw_avx2 PRIVATE mfx_require_avx2_properties mfx_static_lib mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/000077500000000000000000000000001443134507600246055ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_denoise_vpp.h000066400000000000000000000034441443134507600301500ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_DENOISE_VPP_H #define __MFX_DENOISE_VPP_H #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #define VPP_DN_IN_NUM_FRAMES_REQUIRED (1) #define VPP_DN_OUT_NUM_FRAMES_REQUIRED (2) class MFXVideoVPPDenoise : public FilterVPP{ public: static mfxU8 GetInFramesCountExt( void ) { return VPP_DN_IN_NUM_FRAMES_REQUIRED; }; static mfxU8 GetOutFramesCountExt(void) { return VPP_DN_OUT_NUM_FRAMES_REQUIRED; }; // this function is used by VPP Pipeline Query to correct application request static mfxStatus Query( mfxExtBuffer* pHint ); }; #endif // __MFX_DENOISE_VPP_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_detail_enhancement_vpp.h000066400000000000000000000036261443134507600323330ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_DETAIL_ENHANCEMENT_VPP_H #define __MFX_DETAIL_ENHANCEMENT_VPP_H #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #define VPP_DETAIL_ENHANCEMENT_IN_NUM_FRAMES_REQUIRED (1) #define VPP_DETAIL_ENHANCEMENT_OUT_NUM_FRAMES_REQUIRED (1) class MFXVideoVPPDetailEnhancement : public FilterVPP{ public: static mfxU8 GetInFramesCountExt( void ) { return VPP_DETAIL_ENHANCEMENT_IN_NUM_FRAMES_REQUIRED; }; static mfxU8 GetOutFramesCountExt(void) { return VPP_DETAIL_ENHANCEMENT_OUT_NUM_FRAMES_REQUIRED; }; // this function is used by VPP Pipeline Query to correct application request static mfxStatus Query( mfxExtBuffer* pHint ); }; #endif // __MFX_DETAIL_ENHANCEMENT_VPP_H #endif // MFX_ENABLE_VPP /* EOF */oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_frame_rate_conversion_vpp.h000066400000000000000000000036401443134507600330720ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_FRAME_RATE_CONVERSION_VPP_H #define __MFX_FRAME_RATE_CONVERSION_VPP_H #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #define VPP_FRC_IN_NUM_FRAMES_REQUIRED (2+1) #define VPP_FRC_OUT_NUM_FRAMES_REQUIRED (1) class MFXVideoVPPFrameRateConversion : public FilterVPP{ public: // not correct. must be based on in/out frame rates static mfxU8 GetInFramesCountExt( void ) { return VPP_FRC_IN_NUM_FRAMES_REQUIRED; }; static mfxU8 GetOutFramesCountExt(void) { return VPP_FRC_OUT_NUM_FRAMES_REQUIRED; }; // this function is used by VPP Pipeline Query to correct application request static mfxStatus Query( mfxExtBuffer* pHint ); }; #endif // __MFX_FRAME_RATE_CONVERSION_VPP_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_perc_enc_vpp.h000066400000000000000000000152721443134507600303020ustar00rootroot00000000000000// Copyright (c) 2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_common.h" #if defined (ONEVPL_EXPERIMENTAL) #include "mfx_perc_enc_vpp_avx2.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #include "libmfx_core.h" #if defined(MFX_ENABLE_ENCTOOLS) #include "mfxenctools-int.h" #endif namespace PercEncPrefilter { /* Perceptual Prefilter This filter is designed to enhance video prior to encoding. A description of the algorithm follows. The perceptual prefilter can act as a softening and/or as a sharpening filter depending upon its spatial control parameters (pS) and the characteristics of the input image. Temporal filtering is also supported: this is motion adaptive and recursive, controlled by the temporal parameters (pT). Both temporal and spatial parameters may be modulated per 16x16 block to enable the filter to be responsive to a signal such as saliency or importance. Each output luminance pixel value is a function of * the collocated input pixel value (yC collocated), * the values of the input four nearest spatial neighbors (yU up, yD down, yL left, yR right) and * the value of the collocated pixel in the previous frame's output from the filter (yP previous) Each output luminance pixel value is determined according to the following formula: yOut = yC * rC + yU * f(yU, yC, pS) + yD * f(yD, yC, pS) + yL * f(yL, yC, pS) + yR * f(yR, yC, pS) + yP * f(yP, yC, pT) Where rC = 1 - f(yU, yC, pS) - f(yD, yC, pS) - f(yL, yC, pS) - f(yR, yC, pS) - f(yP, yC, pT) Where pS are the spatial parameters and pT are the temporal parameters applicable to the current block; where f(yN, yC, p) is a range function that allows the filter to behave non-linearly according to the local spatial or temporal pixel differences: f(yN, yC, p) = clamp((p.pivot - abs(yN - yC)) * p.slope, p.min, p.max) Here, "clamp" and "abs" have the same semantics as the similarly named functions in the C++ standard library. The parameter p.min is generally assigned a zero or negative value, p.max a zero or positive value and p.slope a positive value. In the case of the spatial filter, p.pivot specifies a level of texture intensity at which where the filter transitions from softening fine details to sharpening more intense features. The limit parameters p.min and p.max control sharpening of strong details and softening of weak features respectively. Setting p.min or p.max to zero will disable sharpening or softening, respectively. The p.slope parameter controls the transition between sharpening and softening: higher values represent a more abrupt transition. In the case of the temporal filter, p.pivot specifies a threshold of temporal luminance change below which the filter will take effect. The abruptness of filter adaptation to luminance change is influenced by p.slope. The parameter p.max controls the maximum strength of temporal filtering. Parameter p.min should be zero - a negative value would potentially make the filter oscillate. The filter parameters may be modulated by supplying a modulation map. The modulation map has the same shape as the video image but is 16th the resolution of the luminance plane. In other words, each value in the modulation map controls filter behavior for a 16x16 block of the filtered image. Each modulation value can take a value in the range 0 <= m < 1, and affects the pivot, min and max parameters: pT.slope = (1 - m) * qT.slope[0] + m * qT.slope[1] pT.min = (1 - m) * qT.min [0] + m * qT.min [1] pT.max = (1 - m) * qT.max [0] + m * qT.max [1] pS.slope = (1 - m) * qS.slope[0] + m * qS.slope[1] pS.min = (1 - m) * qS.min [0] + m * qS.min [1] pS.max = (1 - m) * qS.max [0] + m * qS.max [1] Here, qS and qT each contain a set of parameter pairs. The first of each pairs is used for blocks where modulation, m = 0. The second of each pair is used where modulation, m = 1. In blocks having m between 0 and 1, a proportionate blend of the pair is used to control the filter. Thus the modulation map controls the "blend" of two different filters that can have very different characteristics. */ class PercEncFilter : public FilterVPP { public: static mfxStatus Query(mfxExtBuffer*); PercEncFilter(VideoCORE*, mfxVideoParam const&); ~PercEncFilter(); mfxStatus Init(mfxFrameInfo*, mfxFrameInfo*) override; mfxStatus Close() override; mfxStatus Reset(mfxVideoParam*) override; mfxStatus SetParam(mfxExtBuffer*) override; mfxStatus RunFrameVPP(mfxFrameSurface1*, mfxFrameSurface1*, InternalParam*) override; mfxStatus RunFrameVPPTask(mfxFrameSurface1*, mfxFrameSurface1*, InternalParam*) override; mfxU8 GetInFramesCount() override { return 1; } mfxU8 GetOutFramesCount() override { return 1; } mfxStatus GetBufferSize(mfxU32* /*size*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus SetBuffer(mfxU8* /*buffer*/) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } mfxStatus CheckProduceOutput(mfxFrameSurface1*, mfxFrameSurface1*) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } bool IsReadyOutput(mfxRequestType) override; private: CommonCORE_VPL* m_core = nullptr; bool m_initialized = false; std::unique_ptr filter; std::vector previousOutput; int width = 0; int height = 0; std::array parametersBlock; Parameters::PerFrame parametersFrame; std::vector modulation; int modulationStride{}; #if defined(MFX_ENABLE_ENCTOOLS) static const mfxU32 blockSizeFilter = 16; //modulation map support mfxU32 m_frameCounter = 0; bool m_saliencyMapSupported = false; mfxEncTools *m_encTools = nullptr; #endif }; }//namespace #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_perc_enc_vpp_avx2.h000066400000000000000000000064621443134507600312430ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #if defined (ONEVPL_EXPERIMENTAL) #include #include #include #include #include namespace PercEncPrefilter { struct Parameters { struct PerFrame { bool temporalEnabled = true; int temporalSlope = 2; int spatialIterations = 1; int spatialSlope = 4; }; struct PerBlock { struct Curve { float pivot; float minimum; float maximum; }; Curve temporal{0.19140625f, 0.0f, 0.0234375f}; Curve spatial{0.05078125f, -0.03125f, 0.015625f}; }; }; struct Filter { Parameters::PerFrame parametersFrame; std::array parametersBlock; template struct ModulatedParameters { T pivot; T minimum; T maximum; }; static constexpr int unityLog2 = 8; static constexpr int unity = 1 << unityLog2; std::vector nullModulation; std::vector> modulatedParametersSpatial; std::vector> modulatedParametersTemporal; std::array, 2> coefficientsVertical; std::vector coefficientsHorizontal; std::vector coefficientsTemporal; bool haveFilteredOneFrame = false; Filter( const Parameters::PerFrame ¶metersFrame, const std::array ¶metersBlock, int width); inline void calculateCoefficients(const __m128i &LeftShift, const Filter::ModulatedParameters *parameters, const uint8_t *a, const uint8_t *b, int16_t *c, int width); inline void processLine( const __m128i &spatialLeftShift, const __m128i &temporalLeftShift, const uint8_t *input, const uint8_t *inputLineAbove, const uint8_t *previousOutput, const uint8_t *inputLineBelow, uint8_t *output, int width, int y); void processFrame(const uint8_t *input, int inputStride, const uint8_t *modulation, int modulationStride, const uint8_t *previousOutput, int previousOutputStride, uint8_t *output, int outputStride, int width, int height); }; }//namespace #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_procamp_vpp.h000066400000000000000000000034771443134507600301710ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_PROCAMP_VPP_H #define __MFX_PROCAMP_VPP_H #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #define VPP_PROCAMP_IN_NUM_FRAMES_REQUIRED (1) #define VPP_PROCAMP_OUT_NUM_FRAMES_REQUIRED (1) class MFXVideoVPPProcAmp : public FilterVPP{ public: static mfxU8 GetInFramesCountExt( void ) { return VPP_PROCAMP_IN_NUM_FRAMES_REQUIRED; }; static mfxU8 GetOutFramesCountExt(void) { return VPP_PROCAMP_OUT_NUM_FRAMES_REQUIRED; }; // this function is used by VPP Pipeline Query to correct application request static mfxStatus Query( mfxExtBuffer* pHint ); }; #endif // __MFX_PROCAMP_VPP_H #endif // MFX_ENABLE_VPP /* EOF */oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_base.h000066400000000000000000000126651443134507600274410ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_BASE_H #define __MFX_VPP_BASE_H #include #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "vm_interlocked.h" class FilterVPP { public: typedef struct { mfxU16 inPicStruct; mfxU16 outPicStruct; mfxExtVppAuxData *aux; mfxU64 inTimeStamp; // advFRC mode only mfxU64 outTimeStamp; // advFRC mode only } InternalParam; virtual ~FilterVPP(void) {} virtual mfxStatus Init(mfxFrameInfo* In, mfxFrameInfo* Out)=0; virtual mfxStatus Close(void)=0; virtual mfxStatus SetParam( mfxExtBuffer* pHint ) = 0; virtual mfxStatus RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, InternalParam* pParam)=0; virtual mfxStatus RunFrameVPPTask(mfxFrameSurface1 *in, mfxFrameSurface1 *out, InternalParam* pParam) { mfxU32 numStarted_cur = vm_interlocked_inc32(reinterpret_cast(&m_numStarted)); if (numStarted_cur > m_maxNumRegions) return MFX_TASK_BUSY; mfxStatus mfxRes = RunFrameVPP(in, out, pParam); // MFX_ERR_MORE_SURFACE may come from FRC only VPP_IGNORE_MFX_STS(mfxRes, MFX_ERR_MORE_SURFACE); if ((mfxRes != MFX_ERR_MORE_DATA) && (mfxRes != MFX_ERR_NONE)) { // there's a bug return MFX_ERR_UNDEFINED_BEHAVIOR; } mfxU32 numFinished_cur = vm_interlocked_inc32(reinterpret_cast(&m_numFinished)); if (numFinished_cur != m_maxNumRegions) { // a region was successfully performed // mfxRes must be always ERR_NONE here return MFX_TASK_WORKING; } return mfxRes; // ERR_NONE or MORE_SURFACE } virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxU8 GetInFramesCount( void )=0; virtual mfxU8 GetOutFramesCount( void )=0; // work buffer management Functions should be called AFTER initialization virtual mfxStatus GetBufferSize( mfxU32* pBufferSize ) = 0; virtual mfxStatus SetBuffer( mfxU8* pBuffer ) = 0; // simulation of async VPP processing in sync part. // this function changes!!! filter state virtual mfxStatus CheckProduceOutput(mfxFrameSurface1 *in, mfxFrameSurface1 *out ) = 0; // this function doesn't change filter state virtual bool IsReadyOutput( mfxRequestType requestType ) = 0; mfxStatus GetFrameInfo(mfxFrameInfo* In, mfxFrameInfo* Out) { VPP_CHECK_NOT_INITIALIZED; if( NULL != In ) { *In = m_errPrtctState.In; } if( NULL != Out ) { *Out = m_errPrtctState.Out; } return MFX_ERR_NONE; } void ResetFilterTaskCounters() { m_numStarted = 0; m_numFinished = 0; } protected: typedef struct { mfxFrameInfo In; mfxFrameInfo Out; bool isInited; bool isFirstFrameProcessed; } sErrPrtctState; // pass through for simple (no delay) filter virtual mfxStatus PassThrough(mfxFrameSurface1 *in, mfxFrameSurface1 *out) { if( in && out ) { // pass through in according with new spec requirement out->Data.FrameOrder = in->Data.FrameOrder; out->Data.TimeStamp = in->Data.TimeStamp; out->Info.AspectRatioH = in->Info.AspectRatioH; out->Info.AspectRatioW = in->Info.AspectRatioW; out->Info.PicStruct = in->Info.PicStruct; } return MFX_ERR_NONE; } FilterVPP(void) { m_core = NULL; memset(&m_errPrtctState, 0, sizeof(sErrPrtctState)); m_numStarted = 0; m_numFinished = 0; m_maxNumRegions = 1; m_hRegionIn = 0; m_hRegionOut = 0; } VideoCORE* m_core; sErrPrtctState m_errPrtctState; mfxU32 m_numStarted; // number of started regions mfxU32 m_numFinished; // number of finished regions mfxU32 m_maxNumRegions; // 1 region - 1 thread mfxU32 m_hRegionIn; // region height of input surface mfxU32 m_hRegionOut; // region height of output surface }; #endif // __MFX_VPP_BASE_H #endif // MFX_ENABLE_VPP /*EOF*/ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_defs.h000066400000000000000000000133701443134507600274420ustar00rootroot00000000000000// Copyright (c) 2010-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_DEFS_H #define __MFX_VPP_DEFS_H #include "mfxvideo++int.h" #include "mfx_ext_buffers.h" #define MAX_NUM_VPP_FILTERS (15) #define MAX_NUM_CONNECTIONS (MAX_NUM_VPP_FILTERS-1) #define VPP_MAX_REQUIRED_FRAMES_COUNT (7) // == MAX( inputFramesCount, outputFramesCount ) // (DN, DTL, ProcAmp, Gamut, TCC, STE) #define MAX_NUM_OF_VPP_CONFIG_FILTERS (6) // Max samples number for composition filter #define MAX_NUM_OF_VPP_COMPOSITE_STREAMS (72) #define MAX_STREAMS_PER_TILE (8) // (DO_NOT_USE, DO_USE) + (MAX_NUM_OF_VPP_CONFIG_FILTERS) #define MAX_NUM_OF_VPP_EXT_PARAM (2 + MAX_NUM_OF_VPP_CONFIG_FILTERS) // common utility for vpp filters see spec #define VPP_GET_WIDTH(info, width) \ { \ width = info->CropW; \ if (width == 0 || \ (width > info->Width && info->Width > 0)) \ width = info->Width; \ } #define VPP_GET_HEIGHT(info, height) \ { \ height = info->CropH; \ if (height == 0 || \ (height > info->Height && info->Height > 0)) \ height = info->Height; \ } #define VPP_GET_REAL_WIDTH(info, width) {width = info->Width;} #define VPP_GET_REAL_HEIGHT(info, height){height = info->Height;} #define VPP_GET_CROPX(info, cropX){cropX = info->CropX;} #define VPP_GET_CROPY(info, cropY){cropY = info->CropY;} // macros for processing #define VPP_INIT_SUCCESSFUL { m_errPrtctState.isInited = true; } #define VPP_CHECK_MULTIPLE_INIT {if( m_errPrtctState.isInited ) return MFX_ERR_UNDEFINED_BEHAVIOR;} #define VPP_CHECK_NOT_INITIALIZED {if( !m_errPrtctState.isInited ) return MFX_ERR_NOT_INITIALIZED;} #define VPP_CLEAN { m_errPrtctState.isInited = false; m_errPrtctState.isFirstFrameProcessed = false; } #define VPP_RESET { m_errPrtctState.isFirstFrameProcessed = false; } // error processing #define VPP_CHECK_STS_CONTINUE(sts1, sts2) { if (sts1 != MFX_ERR_NONE) sts2 = sts1; } #define VPP_CHECK_IPP_STS(err) if (err != ippStsNoErr) {return MFX_ERR_UNDEFINED_BEHAVIOR;} #define IPP_CHECK_STS(err) if (err != ippStsNoErr) {return err;} #define IPP_CHECK_NULL_PTR1(pointer) { if (!(pointer)) return ippStsNullPtrErr; } #define VPP_IGNORE_MFX_STS(P, X) {if ((X) == (P)) {P = MFX_ERR_NONE;}} // memory allign #define VPP_ALIGN32(X) (((mfxU32)((X)+31)) & (~ (mfxU32)31)) // names of VPP smart filters. internal using only enum { MFX_EXTBUFF_VPP_CSC = MFX_MAKEFOURCC('C','S','C','F'),//COLOR SPACE CONVERSION FILTER MFX_EXTBUFF_VPP_RESIZE = MFX_MAKEFOURCC('R','S','Z','F'), MFX_EXTBUFF_VPP_DI = MFX_MAKEFOURCC('S','D','I','F'),//STANDARD DEINTERLACE FILTER (60i->30p) MFX_EXTBUFF_VPP_DI_30i60p = MFX_MAKEFOURCC('F','D','I','F'),//FULL PTS DEINTERLACE FILTER (60i->60p) MFX_EXTBUFF_VPP_DI_WEAVE = MFX_MAKEFOURCC('F','D','I','W'),//WEAVE DEINTERLACE FILTER (60i->30p) MFX_EXTBUFF_VPP_ITC = MFX_MAKEFOURCC('I','T','C','F'), //INV TELECINE FILTER MFX_EXTBUFF_VPP_FIELD_WEAVING = MFX_MAKEFOURCC('F','I','W','F'), MFX_EXTBUFF_VPP_FIELD_SPLITTING = MFX_MAKEFOURCC('F','I','S','F'), MFX_EXTBUFF_VPP_CSC_OUT_RGB4 = MFX_MAKEFOURCC('C','S','R','4'), //COLOR SPACE CONVERSION FILTER MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10 = MFX_MAKEFOURCC('C','S','1','0'), //COLOR SPACE CONVERSION FILTER MFX_EXTBUFF_VPP_RSHIFT_IN = MFX_MAKEFOURCC('R','S','F','I'), MFX_EXTBUFF_VPP_LSHIFT_IN = MFX_MAKEFOURCC('L','S','F','I'), MFX_EXTBUFF_VPP_RSHIFT_OUT = MFX_MAKEFOURCC('R','S','F','O'), MFX_EXTBUFF_VPP_LSHIFT_OUT = MFX_MAKEFOURCC('L','S','F','O'), }; typedef enum { MFX_REQUEST_FROM_VPP_CHECK = 0x0001, MFX_REQUEST_FROM_VPP_PROCESS = 0x0002 } mfxRequestType; enum { VPP_IN = 0x00, VPP_OUT = 0x01 }; typedef enum { PASS_THROUGH_PICSTRUCT_MODE = 0x0001, DYNAMIC_DI_PICSTRUCT_MODE = 0x0004, ERR_PICSTRUCT_MODE = 0x0000 } PicStructMode; typedef enum { // gamut compression GAMUT_COMPRESS_BASE_MODE = 1, GAMUT_COMPRESS_ADVANCED_MODE = 2, // RGB2YUV tuning GAMUT_PASSIVE_MODE = 3, // gamut expansion // none // invalid mode GAMUT_INVALID_MODE = 100 } mfxGamutMode; typedef enum { MIRROR_INPUT = 0x0001, MIRROR_OUTPUT = 0x0002, MIRROR_WO_EXEC = 0x0004 } MirroringPositions; #endif // __MFX_VPP_DEFS_H #endif // MFX_ENABLE_VPP /*EOF*/ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_hw.h000066400000000000000000000734441443134507600271470ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_HW_H #define __MFX_VPP_HW_H #include #include #include #include "umc_mutex.h" #include "mfx_vpp_interface.h" #include "mfx_vpp_defs.h" #include "libmfx_core_interface.h" #ifdef MFX_ENABLE_EXT #include "cmrt_cross_platform.h" // Gpucopy stuff #include "cm_mem_copy.h" // Needed for mirroring kernels #include "cmrt_vpp.h" #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) #include "asc_cm.h" // Scene change detection #endif #ifdef MFX_ENABLE_MCTF #include "mctf_common.h" #include "cpu_detect.h" #include #endif #else #include "asc.h" #endif #if defined (ONEVPL_EXPERIMENTAL) namespace PercEncPrefilter { class PercEncFilter; } #endif namespace MfxHwVideoProcessing { enum WorkloadMode { VPP_SYNC_WORKLOAD = 0, VPP_ASYNC_WORKLOAD = 1, }; enum FrcMode { FRC_DISABLED = 0x00, FRC_ENABLED = 0x01, FRC_STANDARD = 0x02, FRC_DISTRIBUTED_TIMESTAMP = 0x04, FRC_INTERPOLATION = 0x08 }; enum AdvGfxMode { VARIANCE_REPORT = 0x10, IS_REFERENCES = 0x20, COMPOSITE = 0x40 }; //----------------------------------------------------- // Utills from HW H264 Encoder (c) template inline void Zero(T & obj) { memset(&obj, 0, sizeof(obj)); } template inline void Zero(std::vector & vec) { if (vec.size() > 0) memset(&vec[0], 0, sizeof(T) * vec.size()); } template inline void Zero(T * first, size_t cnt) { memset(first, 0, sizeof(T) * cnt); } class State { public: State() : m_free(true) { } bool IsFree() const { return m_free; } void SetFree(bool free) { m_free = free; } private: bool m_free; }; // Helper which checks number of allocated frames and auto-free class MfxFrameAllocResponse : public mfxFrameAllocResponse { public: MfxFrameAllocResponse(); ~MfxFrameAllocResponse(); mfxStatus Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyRequired = true); mfxStatus Alloc( VideoCORE * core , mfxFrameAllocRequest & req ); mfxStatus Free( void ); private: MfxFrameAllocResponse(MfxFrameAllocResponse const &); MfxFrameAllocResponse & operator =(MfxFrameAllocResponse const &); VideoCORE * m_core; mfxU16 m_numFrameActualReturnedByAllocFrames; std::vector m_responseQueue; std::vector m_mids; }; struct ExtSurface { ExtSurface () : pSurf(0) , timeStamp(0) , endTimeStamp(0) , resIdx(0) , bUpdate(false) , bForcedInternalAlloc(false) { } mfxFrameSurface1 *pSurf; mfxU64 timeStamp; // startTimeStamp or targetTimeStamp in DX9 mfxU64 endTimeStamp; // endTimeStamp in DX9. need to ask driver team. probably can be removed mfxU32 resIdx; // index corresponds _real_ video resource bool bUpdate; // should be updated in case of vid<->sys? // this flag being set says that a surface is allocated by calling allocator // via Core interface; which means even though IOMode is set to D3D (so, // surfaces are allocated in video memory but by external allocator), // to extract handle GetFrameHLD must be used; // this is needed for such filters as MCTF that allocate internal surfaces in video memory // to operate on this, in particular, in the begining it substitutes such a surface instead of // real surface; bool bForcedInternalAlloc; }; // auto-lock for frames struct FrameLocker { FrameLocker(VideoCORE * core, mfxFrameData & data, bool external = false) : m_core(core) , m_data(data) , m_memId(data.MemId) , m_status(Lock(external)) { } FrameLocker(VideoCORE * core, mfxFrameData & data, mfxMemId memId, bool external = false) : m_core(core) , m_data(data) , m_memId(memId) , m_status(Lock(external)) { } ~FrameLocker() { Unlock(); } mfxStatus Unlock() { mfxStatus mfxSts = MFX_ERR_NONE; if (m_status == LOCK_INT) mfxSts = m_core->UnlockFrame(m_memId, &m_data); else if (m_status == LOCK_EXT) mfxSts = m_core->UnlockExternalFrame(m_memId, &m_data); m_status = LOCK_NO; return mfxSts; } protected: enum { LOCK_NO, LOCK_INT, LOCK_EXT }; mfxU32 Lock(bool external) { mfxU32 status = LOCK_NO; if (m_data.Y == 0) { status = external ? (m_core->LockExternalFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_EXT : LOCK_NO) : (m_core->LockFrame(m_memId, &m_data) == MFX_ERR_NONE ? LOCK_INT : LOCK_NO); } return status; } private: FrameLocker(FrameLocker const &); FrameLocker & operator =(FrameLocker const &); VideoCORE * m_core; mfxFrameData & m_data; mfxMemId m_memId; mfxU32 m_status; }; //----------------------------------------------------- struct SubTask : SynchronizedTask { SubTask() { taskIndex = NO_INDEX; } SubTask(mfxU32 idx) { taskIndex = idx; } }; struct ReleaseResource { mfxU32 refCount; std::vector surfaceListForRelease; std::vector subTasks; }; struct DdiTask : public SynchronizedTask,State { DdiTask() : bkwdRefCount(0) , fwdRefCount(0) , input() , output() #ifdef MFX_ENABLE_MCTF , outputForApp() #endif , bAdvGfxEnable(false) , bVariance(false) , bEOS(false) , bRunTimeCopyPassThrough(false) #ifdef MFX_ENABLE_MCTF , bMCTF(false) , MctfControlActive(false) , pOuptutSurface(nullptr) #endif , frameNumber(0) , skipQueryStatus(false) , pAuxData(NULL) , pSubResource(NULL) { #ifdef MFX_ENABLE_MCTF memset(&MctfData, 0, sizeof(IntMctfParams)); #endif } mfxU32 bkwdRefCount; mfxU32 fwdRefCount; ExtSurface input; ExtSurface output; #ifdef MFX_ENABLE_MCTF // this is a ext-surface that delivers result to an application ExtSurface outputForApp; #endif bool bAdvGfxEnable; // VarianceReport, FRC_interpolation bool bVariance; bool bEOS; bool bRunTimeCopyPassThrough; // based on config.m_bCopyPassThroughEnable and runtime parameters (input / output surface.Info), if TRUE - VPP must execute task in PassThrough mode #ifdef MFX_ENABLE_MCTF bool bMCTF; // per-frame control IntMctfParams MctfData; bool MctfControlActive; mfxFrameSurface1* pOuptutSurface; #endif mfxU32 frameNumber; bool skipQueryStatus; mfxExtVppAuxData *pAuxData; ReleaseResource* pSubResource; std::vector m_refList; //m_refList.size() == bkwdRefCount +fwdRefCount }; struct ExtendedConfig { mfxU16 mode; CustomRateData customRateData;//for gfxFrc RateRational frcRational[2];//for CpuFrc }; struct Config { bool m_bMode30i60pEnable; bool m_bWeave; bool m_bCopyPassThroughEnable;// if this flag is true input surface will be copied to output via DoFastCopyWrapper() without VPP bool m_bRefFrameEnable; bool m_multiBlt;// this flag defines mode of composition for D3D11: 1 - run few hw calls per frame (Blt), 0 - run one hw call (Blt) ExtendedConfig m_extConfig; mfxU16 m_IOPattern; mfxU16 m_surfCount[2]; bool m_bDisSkipQuery; bool m_bSupportLPLA; }; class ResMngr { public: ResMngr(void) : m_subTaskQueue() , m_surfQueue() { m_bOutputReady = false; m_bRefFrameEnable = false; m_inputIndex = 0; m_outputIndex = 0; m_bkwdRefCount = 0; m_fwdRefCount = 0; m_EOS = false; m_actualNumber = 0; m_indxOutTimeStamp = 0; m_fieldWeaving = false; m_pSubResource = NULL; m_inputFramesOrFieldPerCycle = 0; m_inputIndexCount = 0; m_outputIndexCountPerCycle = 0; m_fwdRefCountRequired = 0; m_bkwdRefCountRequired = 0; m_multiBlt = 0; m_core = NULL; } ~ResMngr(void){} mfxStatus Init( Config & config, VideoCORE* core); mfxStatus Close(void); mfxStatus DoAdvGfx( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); mfxStatus DoMode30i60p( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); mfxStatus FillTask( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF , mfxFrameSurface1 * pOutSurfaceForApp #endif ); mfxStatus FillTaskForMode30i60p( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF , mfxFrameSurface1 * pOutSurfaceForApp #endif ); mfxStatus CompleteTask(DdiTask *pTask); std::vector m_surf[2]; SubTask GetSubTask(DdiTask *pTask); mfxStatus DeleteSubTask(DdiTask *pTask, mfxU32 subtaskIdx); bool IsMultiBlt(); private: mfxStatus ReleaseSubResource(bool bAll); ReleaseResource* CreateSubResource(void); ReleaseResource* CreateSubResourceForMode30i60p(void); //------------------------------------------------- mfxU32 GetNumToRemove( void ) { if (m_fieldWeaving) return 2; return m_inputFramesOrFieldPerCycle - std::min(m_inputFramesOrFieldPerCycle, m_bkwdRefCountRequired - m_bkwdRefCount); } mfxU32 GetNextBkwdRefCount( void ) { if(m_bkwdRefCount == m_bkwdRefCountRequired) { return m_bkwdRefCount; } mfxU32 numBkwdRef = m_bkwdRefCount + (m_inputFramesOrFieldPerCycle - GetNumToRemove()); return std::min(numBkwdRef, m_bkwdRefCountRequired); } //------------------------------------------------- bool m_bOutputReady; bool m_bRefFrameEnable; // counters mfxU32 m_inputIndex; mfxU32 m_outputIndex; mfxU32 m_bkwdRefCount; mfxU32 m_fwdRefCount; mfxU32 m_actualNumber; mfxU32 m_indxOutTimeStamp; bool m_EOS; bool m_fieldWeaving; std::vector m_subTaskQueue; ReleaseResource* m_pSubResource; std::vector m_surfQueue;//container for multi-input in case of advanced processing // init params mfxU32 m_inputFramesOrFieldPerCycle;//it is number of input frames which will be processed during 1 FRC task slot mfxU32 m_inputIndexCount; mfxU32 m_outputIndexCountPerCycle; // how many output during 1 task slot mfxU32 m_fwdRefCountRequired; mfxU32 m_bkwdRefCountRequired; bool m_multiBlt;// this flag defines mode of composition for D3D11: 1 - run few hw calls per frame (Blt), 0 - run one hw call (Blt) VideoCORE* m_core; }; class CpuFrc { public: CpuFrc(void): m_frcMode(0) {} ~CpuFrc(void){} void Reset( mfxU16 frcMode, RateRational frcRational[2]) { m_stdFrc.Reset(frcRational); m_ptsFrc.Reset(frcRational); m_frcMode = frcMode; } mfxStatus DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); private: struct StdFrc { StdFrc(void) { Clear(); } void Reset(RateRational frcRational[2]) { Clear(); mfxF64 inRate; mfxF64 outRate; bool frcUp; mfxU32 high; mfxU32 low; m_frcRational[VPP_IN] = frcRational[VPP_IN]; m_frcRational[VPP_OUT] = frcRational[VPP_OUT]; inRate = 100*(((mfxF64)m_frcRational[VPP_IN].FrameRateExtN / (mfxF64)m_frcRational[VPP_IN].FrameRateExtD)); outRate = 100*(((mfxF64)m_frcRational[VPP_OUT].FrameRateExtN / (mfxF64)m_frcRational[VPP_OUT].FrameRateExtD)); m_inFrameTime = 1000.0 / inRate; m_outFrameTime = 1000.0 / outRate; mfxU32 nInRate = (mfxU32)inRate; mfxU32 nOutRate = (mfxU32)outRate; if ( fabs(inRate - (mfxF64)nInRate) > 0.5 ) nInRate++; if ( fabs(outRate - (mfxF64)nOutRate) > 0.5 ) nOutRate++; frcUp = (nInRate < nOutRate) ? true : false; high = frcUp ? nOutRate : nInRate; low = frcUp ? nInRate : nOutRate; m_in_tick = m_out_tick = 1; m_in_stamp = m_out_stamp = 0; if ( nInRate == nOutRate || 0 == low) return; mfxF64 mul; mfxU32 rate = 1; mfxU32 multiplier = 1; bool bFoldRatio = false; if ( frcUp ) { mul = outRate/inRate; } else { mul = inRate/outRate; } if ( fabs(mul - (mfxU32)mul) < 0.001 ) { // Ratio between framerates is good enough, no need in // searching of common factors rate = (mfxU32)mul; bFoldRatio = true; } else { // Ratio between framerates is fractional, need to find // common factors mfxU32 tmp = high; while(multiplier<100000) { tmp = high *multiplier; rate = tmp / low; if (rate*low == tmp) break; multiplier++; } } if ( frcUp ) { m_in_tick = rate; m_out_tick = multiplier; m_out_stamp = 0; m_in_stamp = 0; } else { m_in_tick = multiplier; m_out_tick = rate; m_out_stamp = m_out_tick; m_in_stamp = ! bFoldRatio ? 0 : m_out_stamp - m_in_tick; } m_in_stamp += m_in_tick; // calculate time interval between input and output frames m_timeFrameInterval = m_inFrameTime - m_outFrameTime; } mfxStatus DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); private: void Clear() { m_inFrameTime = 0; m_outFrameTime = 0; m_externalDeltaTime = 0; m_timeFrameInterval = 0; m_bDuplication = 0; m_in_stamp = m_in_tick = m_out_stamp = m_out_tick = 0; m_LockedSurfacesList.clear(); memset(m_frcRational, 0, sizeof(m_frcRational)); } std::vector m_LockedSurfacesList; mfxU32 m_in_tick; mfxU32 m_out_tick; mfxU32 m_out_stamp; mfxU32 m_in_stamp; mfxF64 m_inFrameTime; mfxF64 m_outFrameTime; mfxF64 m_externalDeltaTime; mfxF64 m_timeFrameInterval; bool m_bDuplication; RateRational m_frcRational[2]; } m_stdFrc; struct PtsFrc { PtsFrc(void) { Clear(); } void Reset(RateRational frcRational[2]) { Clear(); m_frcRational[VPP_IN] = frcRational[VPP_IN]; m_frcRational[VPP_OUT] = frcRational[VPP_OUT]; m_minDeltaTime = std::min((uint64_t(m_frcRational[VPP_IN].FrameRateExtD) * MFX_TIME_STAMP_FREQUENCY) / (mfxU64(2) * m_frcRational[VPP_IN].FrameRateExtN), (uint64_t(m_frcRational[VPP_OUT].FrameRateExtD) * MFX_TIME_STAMP_FREQUENCY) / (mfxU64(2) * m_frcRational[VPP_OUT].FrameRateExtN)); } mfxStatus DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); private: void Clear() { m_bIsSetTimeOffset = false; m_bDownFrameRate = false; m_bUpFrameRate = false; m_timeStampDifference = 0; m_expectedTimeStamp = 0; m_timeStampJump = 0; m_prevInputTimeStamp = 0; m_timeOffset = 0; m_upCoeff = 0; m_numOutputFrames = 0; m_minDeltaTime = 0; m_LockedSurfacesList.clear(); memset(m_frcRational, 0, sizeof(m_frcRational)); } std::vector m_LockedSurfacesList; bool m_bIsSetTimeOffset; bool m_bDownFrameRate; bool m_bUpFrameRate; mfxU64 m_timeStampDifference; mfxU64 m_expectedTimeStamp; mfxU64 m_timeStampJump; mfxU64 m_prevInputTimeStamp; mfxU64 m_timeOffset; mfxU32 m_upCoeff; mfxU32 m_numOutputFrames; mfxU64 m_minDeltaTime; RateRational m_frcRational[2]; } m_ptsFrc; mfxU16 m_frcMode; }; class TaskManager { public: TaskManager(void); ~TaskManager(void); mfxStatus Init( VideoCORE* core, Config & config); mfxStatus Close(void); mfxStatus AssignTask( mfxFrameSurface1 *input, mfxFrameSurface1 *output, #ifdef MFX_ENABLE_MCTF mfxFrameSurface1 *outputForApp, #endif mfxExtVppAuxData *aux, DdiTask*& pTask, mfxStatus & intSts); mfxStatus CompleteTask(DdiTask* pTask); SubTask GetSubTask(DdiTask *pTask); #ifdef MFX_ENABLE_MCTF mfxU32 GetMCTFSurfacesInQueue() { return m_MCTFSurfacesInQueue; }; void DecMCTFSurfacesInQueue() { if (m_MCTFSurfacesInQueue) --m_MCTFSurfacesInQueue; }; void SetMctf(std::shared_ptr& mctf) { pMCTF = mctf; } #endif //mfxU32 GetSubTask(DdiTask *pTask); mfxStatus DeleteSubTask(DdiTask *pTask, mfxU32 subtaskIdx); private: #ifdef MFX_ENABLE_MCTF std::weak_ptr pMCTF; #endif mfxStatus DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); mfxStatus DoAdvGfx( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts); DdiTask* GetTask(void); void FreeTask(DdiTask *pTask) { pTask->m_refList.clear(); pTask->SetFree(true); } // fill task param mfxStatus FillTask( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface, #ifdef MFX_ENABLE_MCTF mfxFrameSurface1 *pOutSurfaceForApp, #endif mfxExtVppAuxData *aux ); #ifdef MFX_ENABLE_MCTF // fill task param; its only for cases // when there is no input surfaces // but we still need to process output // example: MCTF mfxStatus FillLastTasks( DdiTask* pTask, mfxFrameSurface1 *pOutSurface, mfxFrameSurface1 *pOutSurfaceForApp, mfxExtVppAuxData *aux ); #endif void FillTask_Mode30i60p( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF ,mfxFrameSurface1 *pOutSurfaceForApp #endif ); void FillTask_AdvGfxMode( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF ,mfxFrameSurface1 *pOutSurfaceForApp #endif ); void UpdatePTS_Mode30i60p( mfxFrameSurface1 *input, mfxFrameSurface1 *ouput, mfxU32 taskIndex, mfxStatus *intSts); void UpdatePTS_SimpleMode( mfxFrameSurface1 *input, mfxFrameSurface1 *ouput); std::vector m_tasks; VideoCORE* m_core; mfxI32 m_taskIndex; mfxU32 m_actualNumber; struct Mode30i60p { mfxU64 m_prevInputTimeStamp; mfxU32 m_numOutputFrames; void SetEnable(bool mode) { m_isEnabled = mode; } bool IsEnabled( void ) const { return m_isEnabled; } private: bool m_isEnabled; } m_mode30i60p; // init params mfxU16 m_extMode; CpuFrc m_cpuFrc; ResMngr m_resMngr; UMC::Mutex m_mutex; #ifdef MFX_ENABLE_MCTF mfxU32 m_MCTFSurfacesInQueue; #endif }; // class TaskManager class VideoVPPHW { public: enum IOMode { D3D_TO_D3D = 0x1, D3D_TO_SYS = 0x2, SYS_TO_D3D = 0x4, SYS_TO_SYS = 0x8, ALL = 0x10, MODES_MASK = 0x1F }; VideoVPPHW(IOMode, VideoCORE *core); virtual ~VideoVPPHW(void); mfxStatus Init( mfxVideoParam *par, bool isTemporal = false); mfxStatus GetVideoParams(mfxVideoParam *par) const; static mfxStatus QueryIOSurf( IOMode ioMode, VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest* request); static mfxStatus QueryCaps(VideoCORE* core, MfxHwVideoProcessing::mfxVppCaps& caps); mfxStatus Reset(mfxVideoParam *par); mfxStatus Close(void); static mfxStatus Query(VideoCORE* core,mfxVideoParam *par); static mfxStatus QueryImplsDescription(VideoCORE* core, mfxVPPDescription& caps, mfx::PODArraysHolder& arrayHolder); static mfxStatus CheckFormatLimitation(mfxU32 filter, mfxU32 format, mfxU32& formatSupport); static mfxStatus QueryTaskRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); static mfxStatus AsyncTaskSubmission(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); mfxStatus SyncTaskSubmission(DdiTask* pTask); mfxStatus VppFrameCheck( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints); mfxStatus RunFrameVPP(mfxFrameSurface1 * /*in*/, mfxFrameSurface1 * /*out*/, mfxExtVppAuxData * /*aux*/) { //in = in; out = out; aux = aux; return MFX_ERR_UNSUPPORTED; }; static IOMode GetIOMode( mfxVideoParam *par ); private: mfxStatus MergeRuntimeParams(const DdiTask* pTask, MfxHwVideoProcessing::mfxExecuteParams *execParams); mfxStatus QuerySceneChangeResults( mfxExtVppAuxData *pAuxData, mfxU32 frameIndex); mfxStatus CopyPassThrough( mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface); mfxStatus PreWorkOutSurface(ExtSurface & output); mfxStatus PreWorkInputSurface(std::vector & surfQueue); mfxStatus PostWorkOutSurfaceCopy(ExtSurface & output); mfxStatus PostWorkOutSurface(ExtSurface & output); mfxStatus PostWorkInputSurface(mfxU32 numSamples); mfxStatus ProcessFieldCopy(mfxHDL in, mfxHDL out, mfxU32 fieldMask); #ifdef MFX_ENABLE_MCTF mfxStatus InitMCTF(const mfxFrameInfo&, const IntMctfParams&); // help-function to get a handle based on MemId mfxStatus GetFrameHandle(mfxFrameSurface1* InFrame, mfxHDLPair& handle, bool bInternalAlloc); // help-function to get a handle based on MemId mfxStatus GetFrameHandle(mfxFrameSurface1& surf, mfxHDLPair& handle, bool bInternalAlloc); // creates or extracts CmSurface2D from Handle mfxStatus CreateCmSurface2D(void *pSrcHDL, CmSurface2D* & pCmSurface2D, SurfaceIndex* &pCmSrcIndex); // clear(destroy) all surfaces (if any) stored inside m_tableCmRelations2 mfxStatus ClearCmSurfaces2D(); // this function is to take a surface into MCTF for further processing static mfxStatus SubmitToMctf(void *pState, void *pParam, bool* bMctfReadyToReturn); // this is to return a surface out of MCTF static mfxStatus QueryFromMctf(void *pState, void *pParam, bool bMctfReadyToReturn, bool bEoF = false); #endif mfxU16 m_asyncDepth; MfxHwVideoProcessing::mfxExecuteParams m_executeParams; std::vector m_executeSurf; MfxFrameAllocResponse m_internalVidSurf[2]; VideoCORE *m_pCore; UMC::Mutex m_guard; WorkloadMode m_workloadMode; mfxU16 m_IOPattern; IOMode m_ioMode; bool m_isD3D9SimWithVideoMemIn; bool m_isD3D9SimWithVideoMemOut; Config m_config; mfxVideoParam m_params; TaskManager m_taskMngr; mfxU32 m_scene_change; mfxU32 m_frame_num; mfxStatus m_critical_error; // Not a smart pointer anymore since core owns create/delete semantic now. VPPHWResMng * m_ddi; bool m_bMultiView; #ifdef MFX_ENABLE_EXT #ifdef MFX_ENABLE_MCTF bool m_MctfIsFlushing; // responce for MCTF internal surfaces mfxFrameAllocResponse m_MctfMfxAlocResponse; // boolean flag to track if surfaces are allocated bool m_bMctfAllocatedMemory; // storage for mids in responce object std::vector m_MctfMids; // MCTF object std::shared_ptr m_pMCTFilter; // to separate it from m_pCmDevice CmDevice *m_pMctfCmDevice; // list that tracks surfaces needed fort unlock std::list m_Surfaces2Unlock; // pool of surfaces & pointers for MCTF std::vector m_MCTFSurfacePool; std::vector m_pMCTFSurfacePool; // these maps are used to track cm-surfaces for MCTF // CmCopyWrapper also has similar maps, but it implements // additional functionallity which is not required for MCTF std::map m_MCTFtableCmRelations2; std::map m_MCTFtableCmIndex2; #endif CmCopyWrapper *m_pCmCopy; #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) ns_asc::ASC_Cm m_SCD; #endif CmDevice *m_pCmDevice; CmProgram *m_pCmProgram; CmKernel *m_pCmKernel; CmQueue *m_pCmQueue; public: void SetCmDevice(CmDevice * device) { m_pCmDevice = device; } #endif #if defined (ONEVPL_EXPERIMENTAL) std::unique_ptr m_PercEncFilter; #endif }; }; // namespace MfxHwVideoProcessing #endif // __MFX_VPP_HW_H #endif // MFX_ENABLE_VPP oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_jpeg.h000066400000000000000000000046561443134507600274550ustar00rootroot00000000000000// Copyright (c) 2011-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #ifndef __MFX_VPP_JPEG_H #define __MFX_VPP_JPEG_H #include "umc_va_base.h" #include "mfx_vpp_interface.h" #include "umc_mutex.h" #include class VideoVppJpeg { public: VideoVppJpeg(VideoCORE *core, bool useInternalMem); virtual ~VideoVppJpeg(void); mfxStatus Init(const mfxVideoParam *par); mfxStatus Close(void); mfxStatus BeginHwJpegProcessing(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxU16* taskId); mfxStatus BeginHwJpegProcessing(mfxFrameSurface1 *inTop, mfxFrameSurface1 *inBottom, mfxFrameSurface1 *out, mfxU16* taskId); mfxStatus QueryTaskRoutine(mfxU16 taskId); mfxStatus EndHwJpegProcessing(mfxFrameSurface1 *in, mfxFrameSurface1 *out); mfxStatus EndHwJpegProcessing(mfxFrameSurface1 *inTop, mfxFrameSurface1 *inBottom, mfxFrameSurface1 *out); protected: VideoCORE *m_pCore; mfxU16 m_IOPattern; bool m_bUseInternalMem; mfxU16 m_taskId; #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP mfxI32 m_rotation; #endif std::vector m_surfaces; mfxFrameAllocResponse m_response; UMC::Mutex m_guard; std::map AssocIdx; VPPHWResMng m_ddi; }; #endif // __MFX_VPP_JPEG_H #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // MFX_ENABLE_VPP oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_main.h000066400000000000000000000067421443134507600274520ustar00rootroot00000000000000// Copyright (c) 2008-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_MAIN_H #define __MFX_VPP_MAIN_H #include "mfxvideo++int.h" #include "mfx_task.h" #include "mfx_vpp_base.h" /* ******************************************************************** */ /* Main (High Level) Class of MSDK VPP */ /* ******************************************************************** */ class VideoVPPMain : public VideoVPP { public: static mfxStatus Query(VideoCORE* core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest *request); VideoVPPMain(VideoCORE *core, mfxStatus* sts); virtual ~VideoVPPMain(); // VideoVPP virtual mfxStatus RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) override; // VideoBase methods virtual mfxStatus Reset(mfxVideoParam *par) override { MFX_CHECK_NULL_PTR1( par ); return m_impl.get() ? m_impl->Reset(par) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus Close(void) override; virtual mfxStatus Init(mfxVideoParam *par) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { return m_impl.get() ? m_impl->GetVideoParam(par) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus GetVPPStat ( mfxVPPStat *stat) override { return m_impl.get() ? m_impl->GetVPPStat(stat) : MFX_ERR_NOT_INITIALIZED; } virtual mfxStatus VppFrameCheck ( mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints) override; virtual mfxStatus VppFrameCheck( mfxFrameSurface1 *, mfxFrameSurface1 *) override { return MFX_ERR_UNSUPPORTED; } virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) override; // multi threading of SW_VPP functions mfxStatus RunVPPTask( mfxFrameSurface1 *in, mfxFrameSurface1 *out, FilterVPP::InternalParam *pParam ); mfxStatus ResetTaskCounters(); private: VideoCORE* m_core; std::unique_ptr m_impl; }; #endif // __MFX_VPP_MAIN_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_mvc.h000066400000000000000000000066361443134507600273150ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_MVC_H #define __MFX_VPP_MVC_H #include #include #include "mfxvideo++int.h" #include "mfx_task.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #include "mfx_vpp_sw.h" namespace MfxVideoProcessing { class ImplementationMvc : public VideoVPP { public: static mfxStatus Query(VideoCORE* core, mfxVideoParam *in, mfxVideoParam *out) { return VideoVPPBase::Query( core, in, out); } static mfxStatus QueryIOSurf(VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest *request); ImplementationMvc(VideoCORE *core); virtual ~ImplementationMvc(); // VideoVPP virtual mfxStatus RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux); // VideoBase methods virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(void); virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus GetVideoParam( mfxVideoParam *par); virtual mfxStatus GetVPPStat( mfxVPPStat *stat); virtual mfxStatus VppFrameCheck( mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints); virtual mfxStatus VppFrameCheck( mfxFrameSurface1 *, mfxFrameSurface1 *) { return MFX_ERR_UNSUPPORTED; } virtual mfxTaskThreadingPolicy GetThreadingPolicy(void); // multi threading of SW_VPP functions mfxStatus RunVPPTask( mfxFrameSurface1 *in, mfxFrameSurface1 *out, FilterVPP::InternalParam *pParam ); mfxStatus ResetTaskCounters(); private: bool m_bInit; bool m_bMultiViewMode; VideoCORE* m_core; typedef std::map mfxMultiViewVPP; typedef mfxMultiViewVPP::iterator mfxMultiViewVPP_Iterator; mfxMultiViewVPP_Iterator m_iteratorVPP; mfxMultiViewVPP m_VPP; }; }; // namespace MfxVideoProcessing #endif // __MFX_VPP_MVC_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_sw.h000066400000000000000000000117311443134507600271510ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_SW_H #define __MFX_VPP_SW_H #include #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_base.h" #include "mfx_task.h" /* ******************************************************************** */ /* Core Class of MSDK VPP */ /* ******************************************************************** */ #include "mfx_vpp_hw.h" class VideoVPPBase { public: static mfxStatus Query( VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); static mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *request); VideoVPPBase(VideoCORE *core, mfxStatus* sts); virtual ~VideoVPPBase(); // VideoBase methods virtual mfxStatus Reset(mfxVideoParam *par); virtual mfxStatus Close(void); virtual mfxStatus Init(mfxVideoParam *par); virtual mfxStatus GetVideoParam(mfxVideoParam *par); virtual mfxStatus GetVPPStat(mfxVPPStat *stat); virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints); virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *, mfxFrameSurface1 *) { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus RunFrameVPP(mfxFrameSurface1* in, mfxFrameSurface1* out, mfxExtVppAuxData *aux) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void); protected: typedef struct { mfxFrameInfo In; mfxFrameInfo Out; mfxFrameInfo Deffered; mfxU16 IOPattern; mfxU16 AsyncDepth; bool isInited; bool isFirstFrameProcessed; bool isCompositionModeEnabled; } sErrPrtctState; virtual mfxStatus InternalInit(mfxVideoParam *par) = 0; // methods of sync part of VPP for check info/params mfxStatus CheckIOPattern( mfxVideoParam* par ); static mfxStatus QueryCaps(VideoCORE * core, MfxHwVideoProcessing::mfxVppCaps& caps); static mfxStatus CheckPlatformLimitations( VideoCORE* core, mfxVideoParam & param, bool bCorrectionEnable ); mfxU32 GetNumUsedFilters(); std::vector m_pipelineList; // list like DO_USE but contains some internal filter names (ex RESIZE, DEINTERLACE etc) // bool m_bDynamicDeinterlace; VideoCORE* m_core; mfxVPPStat m_stat; // protection state. Keeps Init/Reset params that allows checking that RunFrame params // do not violate Init/Reset params sErrPrtctState m_errPrtctState; // State that keeps Init params. They are changed on Init only sErrPrtctState m_InitState; // // HW VPP Support // std::unique_ptr m_pHWVPP; }; class VideoVPP_HW : public VideoVPPBase { public: VideoVPP_HW(VideoCORE *core, mfxStatus* sts); virtual mfxStatus InternalInit(mfxVideoParam *par) override; virtual mfxStatus Close(void) override; virtual mfxStatus Reset(mfxVideoParam *par) override; virtual mfxStatus GetVideoParam(mfxVideoParam *par) override; virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) override; virtual mfxStatus RunFrameVPP(mfxFrameSurface1* in, mfxFrameSurface1* out, mfxExtVppAuxData *aux) override; mfxStatus PassThrough(mfxFrameInfo* In, mfxFrameInfo* Out, mfxU32 taskIndex); }; mfxStatus RunFrameVPPRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber); mfxStatus CompleteFrameVPPRoutine(void *pState, void *pParam, mfxStatus taskRes); VideoVPPBase* CreateAndInitVPPImpl(mfxVideoParam *par, VideoCORE *core, mfxStatus *mfxSts); #endif // __MFX_VPP_SW_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/include/mfx_vpp_utils.h000066400000000000000000000153311443134507600276600ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_UTILS_H #define __MFX_VPP_UTILS_H #include #include "mfxvideo++int.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_interface.h" // utility for correct processing of frame rates // check if frame rates correspond inverse telecine algorithm (29.97(+-EPS) -> 23.976(+-EPS), EPS=0.1) bool IsFrameRatesCorrespondITC( mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD); // check if frame rates correspond advanced DI algorithm (example: 60i->60p. EPS = 0) bool IsFrameRatesCorrespondMode30i60p( mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD); // check if frame rates correspond Weave DI algorithm, e.g. input framerate is twice bigger than output's. bool IsFrameRatesCorrespondWeaving( mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD); // PicStruct processing PicStructMode GetPicStructMode(mfxU16 inPicStruct, mfxU16 outPicStruct); mfxStatus CheckInputPicStruct( mfxU16 inPicStruct ); mfxU16 UpdatePicStruct( mfxU16 inPicStruct, mfxU16 outPicStruct, bool bDynamicDeinterlace, mfxStatus& sts, mfxU32 outputFrameCounter ); bool IsRoiDifferent(mfxFrameSurface1 *input, mfxFrameSurface1 *output); // utility calculates frames count (in/out) to correct processing in sync/async mode by external application mfxStatus GetExternalFramesCount(VideoCORE* core, mfxVideoParam* pParam, mfxU32* pListID, mfxU32 len, mfxU16 framesCountMin[2], mfxU16 framesCountSuggested[2]); // utility to check is composition enabled in current pipeline or not bool IsCompositionMode(mfxVideoParam* pParam); // select configuration parameters for required filter mfxStatus GetFilterParam(mfxVideoParam* par, mfxU32 filterName, mfxExtBuffer** ppHint); // print names of used filters void ShowPipeline( std::vector pipelineList); // common utils void GetDoNotUseFilterList( mfxVideoParam* par, mfxU32** ppList, mfxU32* pLen ); void GetDoUseFilterList( mfxVideoParam* par, mfxU32** ppList, mfxU32* pLen ); void GetConfigurableFilterList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ); bool GetExtParamList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ); bool CheckFilterList(mfxU32* pList, mfxU32 count, bool bDoUseTable); mfxStatus GetPipelineList( mfxVideoParam* videoParam, std::vector & pipelineList, //mfxU32* pLen, bool bExtended = false); mfxStatus CheckFrameInfo(mfxFrameInfo* info, mfxU32 request); mfxStatus CheckCropParam( mfxFrameInfo* info ); mfxStatus CheckScalingParam(mfxExtBuffer* pScalingExtBuffer); mfxStatus CompareFrameInfo(mfxFrameInfo* info1, mfxFrameInfo* info2); //-------------------------------------------------------- bool IsFilterFound( const mfxU32* pList, mfxU32 len, mfxU32 filterName ); class VppCntx { public: explicit VppCntx(mfxU32* pList, mfxU32 len) { if (len > 0) { m_list.resize(len); for(mfxU32 i = 0; i < len; i++) { m_list[i] = pList[i]; } } } bool IsFilterFound(mfxU32 filterName) { if(m_list.size() > 0 ) { return ::IsFilterFound( &m_list[0], mfxU32(m_list.size()), filterName ); } return false; } private: std::vector m_list; }; //-------------------------------------------------------- mfxU32 GetFilterIndex( mfxU32* pList, mfxU32 len, mfxU32 filterName); mfxU16 vppMax_16u(const mfxU16* pSrc, int len); mfxStatus ExtendedQuery(VideoCORE * core, mfxU32 filterName, mfxExtBuffer* pHint); mfxStatus CheckExtParam(VideoCORE * core, mfxExtBuffer** ppExtParam, mfxU16 count); // gamut processing mfxStatus CheckTransferMatrix( mfxU16 transferMatrix ); mfxGamutMode GetGamutMode( mfxU16 srcTransferMatrix, mfxU16 dstTransferMatrix ); // mfxStatus CheckIOPattern_AndSetIOMemTypes(mfxU16 IOPattern, mfxU16* pInMemType, mfxU16* pOutMemType); // Video Analytics mfxU16 EstimatePicStruct( mfxU32* pVariance, mfxU16 width, mfxU16 height); mfxU16 MapDNFactor( mfxU16 denoiseFactor ); mfxU32 GetMFXFrcMode(const mfxVideoParam & videoParam); mfxStatus SetMFXFrcMode(const mfxVideoParam & videoParam, mfxU32 mode); mfxStatus SetMFXISMode(const mfxVideoParam & videoParam, mfxU32 mode); mfxU32 GetDeinterlacingMode(const mfxVideoParam & videoParam); mfxStatus SetDeinterlacingMode(const mfxVideoParam & videoParam, mfxU32 mode); mfxStatus SetSignalInfo(const mfxVideoParam & videoParam, mfxU32 trMatrix, mfxU32 Range); void ExtractDoUseList( mfxU32* pSrcList, mfxU32 len, std::vector & dstList); bool CheckDoUseCompatibility( mfxU32 filterName ); mfxStatus GetCrossList( const std::vector & pipelineList, const std::vector & capsList, std::vector & douseList, std::vector & dontUseList); void SignalPlatformCapabilities( const mfxVideoParam & param, const std::vector & supportedList); bool IsFrcInterpolationEnable( const mfxVideoParam & param, const MfxHwVideoProcessing::mfxVppCaps & caps); bool IsConfigurable( mfxU32 filterId ); size_t GetConfigSize( mfxU32 filterId ); void ConvertCaps2ListDoUse(MfxHwVideoProcessing::mfxVppCaps& caps, std::vector& list); //mfxStatus QueryExtParams() #endif // __MFX_VPP_UTILS_H #endif // MFX_ENABLE_VPP /*EOF*/ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/000077500000000000000000000000001443134507600237515ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_denoise_vpp.cpp000066400000000000000000000064121443134507600276450ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #include "umc_defs.h" #include "mfx_vpp_utils.h" #include "mfx_denoise_vpp.h" /* ******************************************************************** */ /* implementation of VPP filter [Denoise] */ /* ******************************************************************** */ // this range are used by Query to correct application request #define PAR_NRF_STRENGTH_MIN (0) #define PAR_NRF_STRENGTH_MAX 100 // real value is 63 #define PAR_NRF_STRENGTH_DEFAULT PAR_NRF_STRENGTH_MIN mfxStatus MFXVideoVPPDenoise::Query( mfxExtBuffer* pHint ) { if( NULL == pHint ) { return MFX_ERR_UNSUPPORTED; } mfxStatus sts = MFX_ERR_NONE; mfxU32 bufferId = pHint->BufferId; if (MFX_EXTBUFF_VPP_DENOISE == bufferId) { mfxExtVPPDenoise* bufDN = reinterpret_cast(pHint); MFX_CHECK_NULL_PTR1(bufDN); if (bufDN->DenoiseFactor > PAR_NRF_STRENGTH_MAX) { bufDN->DenoiseFactor = PAR_NRF_STRENGTH_MAX; sts = MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } } else if (MFX_EXTBUFF_VPP_DENOISE2 == bufferId) { mfxExtVPPDenoise2* bufDN = reinterpret_cast(pHint); MFX_CHECK_NULL_PTR1(bufDN); mfxDenoiseMode mode = bufDN->Mode; switch (mode) { case mfxDenoiseMode::MFX_DENOISE_MODE_INTEL_HVS_PRE_MANUAL: case mfxDenoiseMode::MFX_DENOISE_MODE_INTEL_HVS_POST_MANUAL: { if (bufDN->Strength > PAR_NRF_STRENGTH_MAX) { bufDN->Strength = PAR_NRF_STRENGTH_MAX; sts = MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } break; } default: break; } } return sts; } // static mfxStatus MFXVideoVPPDenoise::Query( mfxExtBuffer* pHint ) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_detail_enhancement_vpp.cpp000066400000000000000000000050311443134507600320220ustar00rootroot00000000000000// Copyright (c) 2010-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "ippi.h" #include "umc_defs.h" #include "mfx_vpp_utils.h" #include "mfx_detail_enhancement_vpp.h" #ifndef ALIGN16 #define ALIGN16(SZ) (((SZ + 15) >> 4) << 4) // round up to a multiple of 16 #endif #define VPP_DETAIL_GAIN_MIN (0) #define VPP_DETAIL_GAIN_MAX (63) #define VPP_DETAIL_GAIN_MAX_REAL (63) // replaced range [0...63] to native [0, 100%] wo notification of dev // so a lot of modification required to provide smooth control (recalculate test streams etc) // solution is realGain = CLIP(userGain, 0, 63) #define VPP_DETAIL_GAIN_MAX_USER_LEVEL (100) #define VPP_DETAIL_GAIN_DEFAULT VPP_DETAIL_GAIN_MIN /* ******************************************************************** */ /* implementation of VPP filter [DetailEnhancement] */ /* ******************************************************************** */ mfxStatus MFXVideoVPPDetailEnhancement::Query( mfxExtBuffer* pHint ) { if( NULL == pHint ) { return MFX_ERR_UNSUPPORTED; } mfxStatus sts = MFX_ERR_NONE; mfxExtVPPDetail* pParam = (mfxExtVPPDetail*)pHint; if( pParam->DetailFactor > VPP_DETAIL_GAIN_MAX_USER_LEVEL ) { pParam->DetailFactor = VPP_DETAIL_GAIN_MAX_USER_LEVEL; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return sts; } // mfxStatus MFXVideoVPPDetailEnhancement::Query( mfxExtBuffer* pHint ) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_frame_rate_conversion_vpp.cpp000066400000000000000000000041361443134507600325720ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_vpp_utils.h" #include "mfx_frame_rate_conversion_vpp.h" #include "umc_defs.h" /* ******************************************************************** */ /* implementation of VPP filter [FrameRateConversion] */ /* ******************************************************************** */ mfxStatus MFXVideoVPPFrameRateConversion::Query( mfxExtBuffer* pHint ) { if( NULL == pHint ) { return MFX_ERR_UNSUPPORTED; } mfxExtVPPFrameRateConversion* pParam = (mfxExtVPPFrameRateConversion*)pHint; if( MFX_FRCALGM_PRESERVE_TIMESTAMP == pParam->Algorithm || MFX_FRCALGM_DISTRIBUTED_TIMESTAMP == pParam->Algorithm || MFX_FRCALGM_FRAME_INTERPOLATION == pParam->Algorithm) { return MFX_ERR_NONE; } else { return MFX_ERR_UNSUPPORTED; } } // mfxStatus MFXVideoVPPFrameRateConversion::Query( mfxExtBuffer* pHint ) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_perc_enc_vpp.cpp000066400000000000000000000253141443134507600277770ustar00rootroot00000000000000// Copyright (c) 2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (ONEVPL_EXPERIMENTAL) #include "mfx_perc_enc_vpp.h" #include "mfx_ext_buffers.h" #include "mfx_common_int.h" namespace PercEncPrefilter { mfxStatus PercEncFilter::Query(mfxExtBuffer* hint) { std::ignore = hint; return MFX_ERR_NONE; } PercEncFilter::PercEncFilter(VideoCORE* pCore, mfxVideoParam const& par) { m_core = dynamic_cast (pCore); MFX_CHECK_WITH_THROW_STS(m_core, MFX_ERR_NULL_PTR); std::ignore = par; } PercEncFilter::~PercEncFilter() { std::ignore = Close(); } mfxStatus PercEncFilter::Init(mfxFrameInfo* in, mfxFrameInfo* out) { const bool cpuHasAvx2 = __builtin_cpu_supports("avx2"); MFX_CHECK(cpuHasAvx2, MFX_ERR_UNSUPPORTED) MFX_CHECK_NULL_PTR1(in); MFX_CHECK_NULL_PTR1(out); if (m_initialized) return MFX_ERR_NONE; MFX_CHECK(in->CropW == out->CropW, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->CropH == out->CropH, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->FourCC == out->FourCC, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->BitDepthLuma == out->BitDepthLuma, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->BitDepthChroma == out->BitDepthChroma, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->ChromaFormat == out->ChromaFormat, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->Shift == out->Shift, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->CropW >= 16, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->CropH >= 2, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->FourCC == MFX_FOURCC_NV12, MFX_ERR_INVALID_VIDEO_PARAM); MFX_CHECK(in->ChromaFormat == MFX_CHROMAFORMAT_YUV420, MFX_ERR_INVALID_VIDEO_PARAM); width = in->CropW; height = in->CropH; previousOutput.resize(size_t(width) * height); parametersFrame.spatialSlope = 2; parametersFrame.temporalSlope = 5; parametersBlock[0].spatial.pivot = 0.005909118892594739f; parametersBlock[1].spatial.pivot = 0.008541855174858726f; parametersBlock[0].spatial.minimum = -0.02285621848581362f; parametersBlock[1].spatial.minimum = -0.04005541977955759f; parametersBlock[0].spatial.maximum = 0.041140246241535394f; parametersBlock[1].spatial.maximum = 0.f; parametersBlock[0].temporal.pivot = 0.f; parametersBlock[1].temporal.pivot = 0.f; parametersBlock[0].temporal.minimum = 0.f; parametersBlock[1].temporal.minimum = 0.f; parametersBlock[0].temporal.maximum = 0.f; parametersBlock[1].temporal.maximum = 0.f; filter = std::make_unique(parametersFrame, parametersBlock, width); #if defined(MFX_ENABLE_ENCTOOLS) //modulation map m_frameCounter = 0; m_saliencyMapSupported = false; mfxVideoParam par{}; m_encTools = MFXVideoENCODE_CreateEncTools(par); if(m_encTools) { mfxExtEncToolsConfig config{}; mfxEncToolsCtrl ctrl{}; config.SaliencyMapHint = MFX_CODINGOPTION_ON; ctrl.CodecId = MFX_CODEC_AVC; mfxEncToolsCtrlExtAllocator extAllocBut{}; extAllocBut.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_ALLOCATOR; extAllocBut.Header.BufferSz = sizeof(mfxEncToolsCtrlExtAllocator); mfxFrameAllocator* pFrameAlloc = QueryCoreInterface(m_core, MFXIEXTERNALLOC_GUID); MFX_CHECK_NULL_PTR1(pFrameAlloc); extAllocBut.pAllocator = pFrameAlloc; std::vector extParams; extParams.push_back(&extAllocBut.Header); ctrl.ExtParam = extParams.data(); ctrl.NumExtParam = (mfxU16)extParams.size(); ctrl.FrameInfo.CropH = in->CropH; ctrl.FrameInfo.CropW = in->CropW; mfxStatus sts = m_encTools->Init(m_encTools->Context, &config, &ctrl); m_saliencyMapSupported = (sts == MFX_ERR_NONE); modulationStride = (width + blockSizeFilter - 1) / blockSizeFilter; modulation.resize(size_t(modulationStride) * ((height + blockSizeFilter - 1) / blockSizeFilter)); } #endif m_initialized = true; return MFX_ERR_NONE; } mfxStatus PercEncFilter::Close() { #if defined(MFX_ENABLE_ENCTOOLS) if(m_encTools) { m_encTools->Close(m_encTools->Context); MFXVideoENCODE_DestroyEncTools(m_encTools); } #endif return MFX_ERR_NONE; } mfxStatus PercEncFilter::Reset(mfxVideoParam* video_param) { MFX_CHECK_NULL_PTR1(video_param); MFX_SAFE_CALL(Close()); MFX_SAFE_CALL(Init(&video_param->vpp.In, &video_param->vpp.Out)); return MFX_ERR_NONE; } mfxStatus PercEncFilter::SetParam(mfxExtBuffer*) { return MFX_ERR_NONE; } mfxStatus PercEncFilter::RunFrameVPPTask(mfxFrameSurface1* in, mfxFrameSurface1* out, InternalParam* param) { return RunFrameVPP(in, out, param); } mfxStatus PercEncFilter::RunFrameVPP(mfxFrameSurface1* in, mfxFrameSurface1* out, InternalParam*) { MFX_CHECK_NULL_PTR1(in); MFX_CHECK_NULL_PTR1(out); //skip filtering if cropping or resizing is required if( in->Info.CropX != out->Info.CropX || in->Info.CropX != 0 || in->Info.CropY != out->Info.CropY || in->Info.CropY != 0 || in->Info.CropW != out->Info.CropW || in->Info.CropH != out->Info.CropH ){ return MFX_ERR_NONE; } #if defined(MFX_ENABLE_ENCTOOLS) //get modulation map mfxStatus sts = MFX_ERR_NONE; if(m_saliencyMapSupported) { { mfxEncToolsFrameToAnalyze extFrameData = {}; extFrameData.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE; extFrameData.Header.BufferSz = sizeof(extFrameData); extFrameData.Surface = in; std::vector extParams; extParams.push_back(&extFrameData.Header); mfxEncToolsTaskParam param{}; param.ExtParam = extParams.data(); param.NumExtParam = (mfxU16)extParams.size(); param.DisplayOrder = m_frameCounter; sts = m_encTools->Submit(m_encTools->Context, ¶m); MFX_CHECK_STS(sts); } { mfxEncToolsHintSaliencyMap extSM = {}; extSM.Header.BufferId = MFX_EXTBUFF_ENCTOOLS_HINT_SALIENCY_MAP; extSM.Header.BufferSz = sizeof(extSM); const mfxU32 blockSize = 8; // source saliency is on 8x8 block granularity extSM.AllocatedSize = in->Info.Width * in->Info.Height / (blockSize * blockSize); std::unique_ptr smBuffer(new mfxF32[extSM.AllocatedSize]); extSM.SaliencyMap = smBuffer.get(); std::vector extParams; extParams.push_back(&extSM.Header); mfxEncToolsTaskParam param{}; param.ExtParam = extParams.data(); param.NumExtParam = (mfxU16)extParams.size(); param.DisplayOrder = m_frameCounter; m_frameCounter++; sts = m_encTools->Query(m_encTools->Context, ¶m, 0 /*timeout*/); if (sts == MFX_ERR_NOT_ENOUGH_BUFFER) { extSM.AllocatedSize = extSM.Width * extSM.Height; smBuffer.reset(new mfxF32[extSM.AllocatedSize]); extSM.SaliencyMap = smBuffer.get(); sts = m_encTools->Query(m_encTools->Context, ¶m, 0 /*timeout*/); } MFX_CHECK_STS(sts); MFX_CHECK(extSM.BlockSize == blockSize, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); for (size_t y = 0; y < size_t(height); y += blockSizeFilter) for (size_t x = 0; x < size_t(width); x += blockSizeFilter) { float m = 0.f; int count = 0; for (size_t dy = 0; dy < std::min(blockSizeFilter, height - y); dy += blockSize) for (size_t dx = 0; dx < std::min(blockSizeFilter, width - x); dx +=blockSize) { m += smBuffer[(x + dx) / blockSize + (y + dy) / blockSize * extSM.Width]; ++count; } count = count ? count : 1; int mod = int(256.f * m /count); mod = std::max(mod, 0); mod = std::min(mod, 255); modulation[x / blockSizeFilter + y / blockSizeFilter * modulationStride] = (uint8_t)mod; } } } #endif mfxFrameSurface1_scoped_lock inLock(in, m_core), outLock(out, m_core); MFX_SAFE_CALL(inLock.lock(MFX_MAP_READ)); MFX_SAFE_CALL(outLock.lock(MFX_MAP_WRITE)); if (filter) { filter->processFrame(in->Data.Y, in->Data.Pitch, modulation.data(), modulationStride, previousOutput.data(), width, out->Data.Y, out->Data.Pitch, width, height); } else { for (size_t y = 0; y < size_t(height); ++y) { std::copy( &in->Data.Y[in->Data.Pitch * y], &in->Data.Y[in->Data.Pitch * y + width], &out->Data.Y[out->Data.Pitch * y]); } } // retain a copy of the output for next time... (it would be nice to avoid this copy) for (size_t y = 0; y < size_t(height); ++y) { std::copy( &out->Data.Y[out->Data.Pitch * y], &out->Data.Y[out->Data.Pitch * y + width], &previousOutput[width * y]); } // copy chroma for (int y = 0; y < height / 2; ++y) { std::copy( &in->Data.UV[in->Data.Pitch * y], &in->Data.UV[in->Data.Pitch * y + width], &out->Data.UV[out->Data.Pitch * y]); } return MFX_ERR_NONE; } bool PercEncFilter::IsReadyOutput(mfxRequestType) { //TBD: temporary do processing in sync. part therefore always return true return true; } }//namespace #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_perc_enc_vpp_avx2.cpp000066400000000000000000000260111443134507600307320ustar00rootroot00000000000000// Copyright (c) 2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if defined(ONEVPL_EXPERIMENTAL) #include "mfx_perc_enc_vpp_avx2.h" #include #include #include #include #ifndef RT_FUNC_ENTER // for cases where this code is used elsewhere #define RT_FUNC_ENTER(A) #endif namespace PercEncPrefilter { constexpr int log2(int x) { return x == 1 ? 0 : log2(x >> 1) + 1; } Filter::Filter( const Parameters::PerFrame ¶metersFrame, const std::array ¶metersBlock, int width) : parametersFrame{parametersFrame}, parametersBlock{parametersBlock} { const auto coefficientsSize = (width + 32) / 16 * 16; coefficientsVertical[0].resize(coefficientsSize); coefficientsVertical[1].resize(coefficientsSize); coefficientsHorizontal.resize(coefficientsSize); if (parametersFrame.temporalEnabled) coefficientsTemporal.resize(coefficientsSize); modulatedParametersSpatial.resize((width + 32) / 16); modulatedParametersTemporal.resize((width + 32) / 16); nullModulation.resize((width + 32) / 16); } void Filter::calculateCoefficients(const __m128i &LeftShift, const Filter::ModulatedParameters *parameters, const uint8_t *a, const uint8_t *b, int16_t *c, int width) { for (int i = 0; i < width; i += 16) { auto left = _mm_loadu_si128(reinterpret_cast(a)); auto dataL = _mm256_cvtepu8_epi16(left); auto right = _mm_loadu_si128(reinterpret_cast(b)); auto dataR = _mm256_cvtepu8_epi16(right); auto diff = _mm256_subs_epi16(dataL, dataR); auto absdiff = _mm256_abs_epi16(diff); auto coeff = _mm256_sub_epi16(_mm256_set1_epi16(parameters->pivot), absdiff); coeff = _mm256_sll_epi16(coeff, LeftShift); coeff = _mm256_min_epi16(coeff, _mm256_set1_epi16(parameters->maximum)); coeff = _mm256_max_epi16(coeff, _mm256_set1_epi16(parameters->minimum)); _mm256_storeu_si256(reinterpret_cast<__m256i *>(c), coeff); a += 16; b += 16; c += 16; ++parameters; } } void Filter::processLine( const __m128i &spatialLeftShift, const __m128i &temporalLeftShift, const uint8_t *input, const uint8_t *inputLineAbove, const uint8_t *previousOutput, const uint8_t *inputLineBelow, uint8_t *output, int width, int y) { calculateCoefficients(spatialLeftShift, modulatedParametersSpatial.data(), input, input + 1, coefficientsHorizontal.data() + 1, width); coefficientsHorizontal[width] = 0; calculateCoefficients(spatialLeftShift, modulatedParametersSpatial.data(), input, inputLineBelow, coefficientsVertical[y % 2].data(), width); calculateCoefficients(temporalLeftShift, modulatedParametersTemporal.data(), input, previousOutput, coefficientsTemporal.data(), width); auto h = coefficientsHorizontal.data() + 1; auto d = coefficientsVertical[y % 2].data(); auto u = coefficientsVertical[!(y % 2)].data(); auto t = coefficientsTemporal.data(); const __m128i l2 = _mm_setr_epi32(unityLog2, 0, 0, 0); for (int i = 0; i < width; i += 16) { __m256i coeffTotal; __m256i accumulator = _mm256_set1_epi16(unity / 2); // rounding offset { // left auto x = _mm_loadu_si128(reinterpret_cast(input - 1)); auto x2 = _mm256_cvtepu8_epi16(x); auto c = _mm256_loadu_si256(reinterpret_cast<__m256i const *>(h - 1)); accumulator = _mm256_add_epi16(accumulator, _mm256_mullo_epi16(x2, c)); coeffTotal = c; } { // right auto x = _mm_loadu_si128(reinterpret_cast(input + 1)); auto x2 = _mm256_cvtepu8_epi16(x); auto c = _mm256_loadu_si256(reinterpret_cast<__m256i const *>(h)); accumulator = _mm256_add_epi16(accumulator, _mm256_mullo_epi16(x2, c)); coeffTotal = _mm256_add_epi16(coeffTotal, c); } { // up auto x = _mm_loadu_si128(reinterpret_cast(inputLineAbove)); auto x2 = _mm256_cvtepu8_epi16(x); auto c = _mm256_loadu_si256(reinterpret_cast<__m256i const *>(u)); accumulator = _mm256_add_epi16(accumulator, _mm256_mullo_epi16(x2, c)); coeffTotal = _mm256_add_epi16(coeffTotal, c); } { // down auto x = _mm_loadu_si128(reinterpret_cast(inputLineBelow)); auto x2 = _mm256_cvtepu8_epi16(x); auto c = _mm256_loadu_si256(reinterpret_cast<__m256i const *>(d)); accumulator = _mm256_add_epi16(accumulator, _mm256_mullo_epi16(x2, c)); coeffTotal = _mm256_add_epi16(coeffTotal, c); } { // temporal auto x = _mm_loadu_si128(reinterpret_cast(previousOutput)); auto x2 = _mm256_cvtepu8_epi16(x); auto c = _mm256_loadu_si256(reinterpret_cast<__m256i const *>(t)); accumulator = _mm256_add_epi16(accumulator, _mm256_mullo_epi16(x2, c)); coeffTotal = _mm256_add_epi16(coeffTotal, c); } auto central2 = _mm256_cvtepu8_epi16(_mm_loadu_si128(reinterpret_cast(input))); accumulator = _mm256_sub_epi16(accumulator, _mm256_mullo_epi16(central2, coeffTotal)); accumulator = _mm256_sra_epi16(accumulator, l2); accumulator = _mm256_add_epi16(accumulator, central2); __m128i lo_lane = _mm256_castsi256_si128(accumulator); __m128i hi_lane = _mm256_extracti128_si256(accumulator, 1); auto out = _mm_packus_epi16(lo_lane, hi_lane); _mm_storeu_si128(reinterpret_cast<__m128i *>(output), out); input += 16; inputLineAbove += 16; inputLineBelow += 16; previousOutput += 16; output += 16; h += 16; d += 16; u += 16; t += 16; } } void Filter::processFrame(const uint8_t *input, int inputStride, const uint8_t *modulation, int modulationStride, const uint8_t *previousOutput, int previousOutputStride, uint8_t *output, int outputStride, int width, int height) { const auto width16 = width / 16 * 16; // copy top line std::copy( &input[inputStride * 0], &input[inputStride * 0 + width], &output[outputStride * 0]); __m128i spatialLeftShift, temporalLeftShift{}; spatialLeftShift = _mm_set1_epi64x(log2(parametersFrame.spatialSlope)); if (haveFilteredOneFrame && parametersFrame.temporalEnabled) temporalLeftShift = _mm_set1_epi64x(log2(parametersFrame.temporalSlope)); // don't filter top and bottom picture lines to avoid out-of-bounds read access for (int y = 1; y < height - 1; ++y) { if (y == 1 || y % 16 == 0) for (int x = 0; x < width16 / 16; ++x) { ModulatedParameters spatial = {}; ModulatedParameters temporal = {}; const int modulationValue = modulationStride ? int(modulation[x + y / 16 * modulationStride]) : 0; const int m[2] = {256 - modulationValue, modulationValue}; for (int i = 0; i < 2; ++i) { spatial.pivot += m[i] * parametersBlock[i].spatial.pivot * 256; spatial.maximum += m[i] * parametersBlock[i].spatial.maximum * unity; spatial.minimum += m[i] * parametersBlock[i].spatial.minimum * unity; if (haveFilteredOneFrame && parametersFrame.temporalEnabled) { temporal.pivot += m[i] * parametersBlock[i].temporal.pivot * 256; temporal.maximum += m[i] * parametersBlock[i].temporal.maximum * unity; temporal.minimum += m[i] * parametersBlock[i].temporal.minimum * unity; } } modulatedParametersSpatial[x].pivot = int16_t(round(spatial.pivot / 256.f)); modulatedParametersSpatial[x].maximum = int16_t(round(spatial.maximum / 256.f)); modulatedParametersSpatial[x].minimum = int16_t(round(spatial.minimum / 256.f)); modulatedParametersTemporal[x].pivot = int16_t(round(temporal.pivot / 256.f)); modulatedParametersTemporal[x].maximum = int16_t(round(temporal.maximum / 256.f)); modulatedParametersTemporal[x].minimum = int16_t(round(temporal.minimum / 256.f)); } processLine( spatialLeftShift, temporalLeftShift, &input[inputStride * y], &input[inputStride * (y - 1)], &previousOutput[previousOutputStride * y], &input[inputStride * (y + 1)], &output[outputStride * y], width16, y); // if width is not multiple of 16, any odd pixels at right are unfiltered std::copy( &input[inputStride * y + width16], &input[inputStride * y + width], &output[outputStride * y + width16]); } // copy bottom line std::copy( &input[inputStride * (height - 1)], &input[inputStride * (height - 1) + width], &output[outputStride * (height - 1)]); haveFilteredOneFrame = true; } } // namespace #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_procamp_vpp.cpp000066400000000000000000000074321443134507600276630ustar00rootroot00000000000000// Copyright (c) 2010-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include #include "mfx_vpp_utils.h" #include "mfx_procamp_vpp.h" #include "umc_defs.h" /* Procamp Filter Parameter Settings NAME MIN MAX Step Default Brightness -100.0 100.0 0.1 0.0 Contrast 0.0 10.0 0.01 1.0 Hue -180.0 180.0 0.1 0.0 Saturation 0.0 10.0 0.01 1.0 */ #define VPP_PROCAMP_BRIGHTNESS_MAX 100.0 #define VPP_PROCAMP_BRIGHTNESS_MIN -100.0 #define VPP_PROCAMP_BRIGHTNESS_DEFAULT 0.0 #define VPP_PROCAMP_CONTRAST_MAX 10.0 #define VPP_PROCAMP_CONTRAST_MIN 0.0 #define VPP_PROCAMP_CONTRAST_DEFAULT 1.0 #define VPP_PROCAMP_HUE_MAX 180.0 #define VPP_PROCAMP_HUE_MIN -180.0 #define VPP_PROCAMP_HUE_DEFAULT 0.0 #define VPP_PROCAMP_SATURATION_MAX 10.0 #define VPP_PROCAMP_SATURATION_MIN 0.0 #define VPP_PROCAMP_SATURATION_DEFAULT 1.0 /* ******************************************************************** */ /* implementation of VPP filter [ProcessingAmplified] */ /* ******************************************************************** */ mfxStatus MFXVideoVPPProcAmp::Query( mfxExtBuffer* pHint ) { if( NULL == pHint ) { return MFX_ERR_UNSUPPORTED; } mfxStatus sts = MFX_ERR_NONE; mfxExtVPPProcAmp* pParam = (mfxExtVPPProcAmp*)pHint; /* Brightness */ if( pParam->Brightness < VPP_PROCAMP_BRIGHTNESS_MIN || pParam->Brightness > VPP_PROCAMP_BRIGHTNESS_MAX ) { pParam->Brightness = mfx::clamp(pParam->Brightness, VPP_PROCAMP_BRIGHTNESS_MIN, VPP_PROCAMP_BRIGHTNESS_MAX); sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } /* Contrast */ if( pParam->Contrast < VPP_PROCAMP_CONTRAST_MIN || pParam->Contrast > VPP_PROCAMP_CONTRAST_MAX ) { pParam->Contrast = mfx::clamp(pParam->Contrast, VPP_PROCAMP_CONTRAST_MIN, VPP_PROCAMP_CONTRAST_MAX); sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } /* Hue */ if( pParam->Hue < VPP_PROCAMP_HUE_MIN || pParam->Hue > VPP_PROCAMP_HUE_MAX ) { pParam->Hue = mfx::clamp(pParam->Hue, VPP_PROCAMP_HUE_MIN, VPP_PROCAMP_HUE_MAX); sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } /* Saturation */ if( pParam->Saturation < VPP_PROCAMP_SATURATION_MIN || pParam->Saturation > VPP_PROCAMP_SATURATION_MAX) { pParam->Saturation = mfx::clamp(pParam->Saturation, VPP_PROCAMP_SATURATION_MIN, VPP_PROCAMP_SATURATION_MAX); sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; } return sts; } // static mfxStatus MFXVideoVPPProcAmp::Query( mfxExtBuffer* pHint ) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_factory.cpp000066400000000000000000000052121443134507600276630ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ****************************************************************************** */ #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_vpp_interface.h" #if defined (MFX_ENABLE_PXP) #include "mfx_pxp_vpp_vaapi.h" #endif // MFX_ENABLE_PXP #include "mfx_vpp_vaapi.h" using namespace MfxHwVideoProcessing; // platform switcher DriverVideoProcessing* MfxHwVideoProcessing::CreateVideoProcessing(VideoCORE* core) { //MFX_CHECK_NULL_PTR1( core ); //assert( core ); (void)core; #if defined (MFX_ENABLE_PXP) mfxHDL pPXPCtxHdl = nullptr; mfxStatus sts = core->GetHandle(MFX_HANDLE_PXP_CONTEXT, (mfxHDL*)&pPXPCtxHdl); if ((sts == MFX_ERR_NONE) && (pPXPCtxHdl != nullptr)) { return new PXPVAAPIVPP; } else #endif // MFX_ENABLE_PXP { return new VAAPIVideoProcessing; } } // mfxStatus CreateVideoProcessing( VideoCORE* core ) mfxStatus VPPHWResMng::CreateDevice(VideoCORE * core){ MFX_CHECK_NULL_PTR1(core); mfxStatus sts; Close(); m_ddi.reset(MfxHwVideoProcessing::CreateVideoProcessing(core)); if ( ! m_ddi.get() ) return MFX_ERR_DEVICE_FAILED; mfxVideoParam par = {}; par.vpp.In.Width = 352; par.vpp.In.Height = 288; par.vpp.In.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; par.vpp.In.FourCC = MFX_FOURCC_NV12; par.vpp.Out = par.vpp.In; sts = m_ddi->CreateDevice(core, &par, true); MFX_CHECK_STS(sts); sts = m_ddi->QueryCapabilities(m_caps); return sts; } #endif // ifdefined (MFX_ENABLE_VPP) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_hw.cpp000066400000000000000000010240501443134507600266340ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include #include #include #include #include "math.h" #include "libmfx_core.h" #include "libmfx_core_interface.h" #include "libmfx_core_factory.h" #include "mfx_common_int.h" #include "mfx_enc_common.h" // UMC::FrameRate #include "mfx_vpp_utils.h" #include "mfx_task.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_hw.h" #include "mfx_platform_caps.h" #include "libmfx_core_vaapi.h" #ifdef MFX_ENABLE_MCTF #include "mctf_common.h" #endif #if defined (ONEVPL_EXPERIMENTAL) #include "mfx_perc_enc_vpp.h" #endif #include "umc_defs.h" #include "mfx_common_int.h" #define MFX_FOURCC_R16_BGGR MFX_MAKEFOURCC('I','R','W','0') #define MFX_FOURCC_R16_RGGB MFX_MAKEFOURCC('I','R','W','1') #define MFX_FOURCC_R16_GRBG MFX_MAKEFOURCC('I','R','W','2') #define MFX_FOURCC_R16_GBRG MFX_MAKEFOURCC('I','R','W','3') using namespace std::chrono_literals; using namespace MfxHwVideoProcessing; enum { CURRENT_TIME_STAMP = 100000, FRAME_INTERVAL = 10000, ACCEPTED_DEVICE_ASYNC_DEPTH = 15, // }; enum QueryStatus { VPREP_GPU_READY = 0, VPREP_GPU_BUSY = 1, VPREP_GPU_NOT_REACHED = 2, VPREP_GPU_FAILED = 3 }; enum { DEINTERLACE_ENABLE = 0, DEINTERLACE_DISABLE = 1 }; enum { TFF2TFF = 0x0, TFF2BFF = 0x1, BFF2TFF = 0x2, BFF2BFF = 0x3, FIELD2TFF = 0x4, // FIELD means half-sized frame w/ one field only FIELD2BFF = 0x5, TFF2FIELD = 0x6, BFF2FIELD = 0x7, FRAME2FRAME = 0x16, FROM_RUNTIME_EXTBUFF_FIELD_PROC = 0x100, FROM_RUNTIME_PICSTRUCT = 0x200, }; // enum for m_scene_change states enum { NO_SCENE_CHANGE = 0x0, SCENE_CHANGE = 0x1, // Clean scene change = first field of new scene MORE_SCENE_CHANGE_DETECTED = 0x2, // Back to back scene change detected LAST_IN_SCENE = 0x3, // last field of old scene NEXT_IS_LAST_IN_SCENE = 0x4, //next field is last }; // enum for m_surfQueue with 1 reference enum { PREVIOUS_INPUT = 0, CURRENT_INPUT = 1, }; //////////////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////////////// static void MemSetZero4mfxExecuteParams (mfxExecuteParams *pMfxExecuteParams ) { memset(&pMfxExecuteParams->targetSurface, 0, sizeof(mfxDrvSurface)); pMfxExecuteParams->pRefSurfaces = NULL ; pMfxExecuteParams->dstRects.clear(); memset(&pMfxExecuteParams->customRateData, 0, sizeof(CustomRateData)); pMfxExecuteParams->targetTimeStamp = 0; pMfxExecuteParams->refCount = 0; pMfxExecuteParams->bkwdRefCount = 0; pMfxExecuteParams->fwdRefCount = 0; pMfxExecuteParams->iDeinterlacingAlgorithm = 0; pMfxExecuteParams->bFMDEnable = 0; pMfxExecuteParams->bDenoiseAutoAdjust = 0; pMfxExecuteParams->bDetailAutoAdjust = 0; pMfxExecuteParams->denoiseFactor = 0; pMfxExecuteParams->detailFactor = 0; pMfxExecuteParams->iTargetInterlacingMode = 0; pMfxExecuteParams->bEnableProcAmp = false; pMfxExecuteParams->Brightness = 0; pMfxExecuteParams->Contrast = 0; pMfxExecuteParams->Hue = 0; pMfxExecuteParams->Saturation = 0; pMfxExecuteParams->bVarianceEnable = false; pMfxExecuteParams->bImgStabilizationEnable = false; pMfxExecuteParams->istabMode = 0; pMfxExecuteParams->bFRCEnable = false; pMfxExecuteParams->bComposite = false; pMfxExecuteParams->iBackgroundColor = 0; pMfxExecuteParams->statusReportID = 0; pMfxExecuteParams->bFieldWeaving = false; pMfxExecuteParams->bFieldWeavingExt = false; pMfxExecuteParams->bFieldSplittingExt = false; pMfxExecuteParams->mirroringExt = false; pMfxExecuteParams->iFieldProcessingMode = 0; pMfxExecuteParams->bCameraPipeEnabled = false; pMfxExecuteParams->bCameraBlackLevelCorrection = false; pMfxExecuteParams->bCameraGammaCorrection = false; pMfxExecuteParams->bCameraHotPixelRemoval = false; pMfxExecuteParams->bCameraWhiteBalaceCorrection = false; pMfxExecuteParams->bCCM = false; pMfxExecuteParams->bCameraLensCorrection = false; pMfxExecuteParams->rotation = 0; pMfxExecuteParams->scalingMode = MFX_SCALING_MODE_DEFAULT; pMfxExecuteParams->interpolationMethod = MFX_INTERPOLATION_DEFAULT; pMfxExecuteParams->chromaSiting = MFX_CHROMA_SITING_UNKNOWN; pMfxExecuteParams->bEOS = false; pMfxExecuteParams->scene = VPP_NO_SCENE_CHANGE; pMfxExecuteParams->lut3DInfo = {}; } /*void MemSetZero4mfxExecuteParams (mfxExecuteParams *pMfxExecuteParams )*/ template mfxU32 FindFreeSurface(std::vector const & vec) { for (size_t j = 0; j < vec.size(); j++) { if (vec[j].IsFree()) { return (mfxU32)j; } } return NO_INDEX; } // template mfxU32 FindFreeSurface(std::vector const & vec) template void Clear(std::vector & v) { std::vector().swap(v); } // template void Clear(std::vector & v) //mfxU32 GetMFXFrcMode(mfxVideoParam & videoParam); mfxStatus CheckIOMode(mfxVideoParam *par, VideoVPPHW::IOMode mode); mfxStatus ValidateParams(mfxVideoParam *par, mfxVppCaps *caps, VideoCORE *core, bool bCorrectionEnable = false); mfxStatus GetWorstSts(mfxStatus sts1, mfxStatus sts2) { mfxStatus statuses[] = {MFX_ERR_UNSUPPORTED, MFX_ERR_INVALID_VIDEO_PARAM, MFX_WRN_PARTIAL_ACCELERATION, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, MFX_WRN_FILTER_SKIPPED, MFX_ERR_NONE}; std::vector stsPriority(statuses, statuses + sizeof(statuses) / sizeof(mfxStatus)); // first - the worst, last - the best std::vector::iterator it1 = std::find(stsPriority.begin(), stsPriority.end(), sts1); std::vector::iterator it2 = std::find(stsPriority.begin(), stsPriority.end(), sts2); if (stsPriority.end() == it1 || stsPriority.end() == it2) return MFX_ERR_UNKNOWN; return (it1 < it2) ? *it1 : *it2; } // mfxStatus GetWorstSts(mfxStatus sts1, mfxStatus sts2) mfxStatus ConfigureExecuteParams( mfxVideoParam & videoParam, // [IN] mfxVppCaps & caps, // [IN] mfxExecuteParams & executeParams,// [OUT] Config & config); // [OUT] mfxStatus CopyFrameDataBothFields( VideoCORE * core, mfxMemId dstMid, mfxFrameSurface1* srcSurf, mfxFrameInfo const & info); //////////////////////////////////////////////////////////////////////////////////// // CpuFRC //////////////////////////////////////////////////////////////////////////////////// mfxStatus CpuFrc::StdFrc::DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts) { std::vector::iterator iterator; if (m_in_stamp + m_in_tick <= m_out_stamp) { // skip frame // request new one input surface m_in_stamp += m_in_tick; return MFX_ERR_MORE_DATA; } else if (m_out_stamp + m_out_tick < m_in_stamp) { // Save current input surface and request more output surfaces iterator = std::find(m_LockedSurfacesList.begin(), m_LockedSurfacesList.end(), input); if (m_LockedSurfacesList.end() == iterator) { m_LockedSurfacesList.push_back(input); } if (true == m_bDuplication) { // set output pts equal to -1, because of it is repeated frame output->Data.FrameOrder = (mfxU32) MFX_FRAMEORDER_UNKNOWN; output->Data.TimeStamp = (mfxU64) MFX_TIME_STAMP_INVALID; } else { // KW issue resolved if(NULL != input) { output->Data.TimeStamp = input->Data.TimeStamp; output->Data.FrameOrder = input->Data.FrameOrder; } else { output->Data.FrameOrder = (mfxU32) MFX_FRAMEORDER_UNKNOWN; output->Data.TimeStamp = (mfxU64) MFX_TIME_STAMP_INVALID; } } m_bDuplication = true; // duplicate this frame // request new one output surface *intSts = MFX_ERR_MORE_SURFACE; } else { iterator = std::find(m_LockedSurfacesList.begin(), m_LockedSurfacesList.end(), input); if (m_LockedSurfacesList.end() != iterator) { m_LockedSurfacesList.erase(m_LockedSurfacesList.begin()); } m_in_stamp += m_in_tick; } m_out_stamp += m_out_tick; if (MFX_ERR_MORE_SURFACE != *intSts && NULL != input) { if (true == m_bDuplication) { output->Data.FrameOrder = (mfxU32) MFX_FRAMEORDER_UNKNOWN; output->Data.TimeStamp = (mfxU64) MFX_TIME_STAMP_INVALID; m_bDuplication = false; } else { output->Data.TimeStamp = input->Data.TimeStamp; output->Data.FrameOrder = input->Data.FrameOrder; } } return MFX_ERR_NONE; } // mfxStatus CpuFrc::StdFrc::DoCpuFRC_AndUpdatePTS(...) mfxStatus CpuFrc::PtsFrc::DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts) { std::vector::iterator iterator; mfxU64 inputTimeStamp = input->Data.TimeStamp; if (false == m_bIsSetTimeOffset) { // set initial time stamp offset m_bIsSetTimeOffset = true; m_timeOffset = input->Data.TimeStamp; } // calculate expected timestamp based on output framerate m_expectedTimeStamp = (((mfxU64)m_numOutputFrames * m_frcRational[VPP_OUT].FrameRateExtD * MFX_TIME_STAMP_FREQUENCY) / m_frcRational[VPP_OUT].FrameRateExtN + m_timeOffset + m_timeStampJump); mfxU32 timeStampDifference = abs((mfxI32)(inputTimeStamp - m_expectedTimeStamp)); // process irregularity if (m_minDeltaTime > timeStampDifference) { inputTimeStamp = m_expectedTimeStamp; } // made decision regarding frame rate conversion if ((input->Data.TimeStamp != (mfxU64)-1) && !m_bUpFrameRate && inputTimeStamp < m_expectedTimeStamp) { m_bDownFrameRate = true; // calculate output time stamp output->Data.TimeStamp = m_expectedTimeStamp; // skip frame // request new one input surface return MFX_ERR_MORE_DATA; } else if ((input->Data.TimeStamp != (mfxU64)-1) && !m_bDownFrameRate && (input->Data.TimeStamp > m_expectedTimeStamp || m_timeStampDifference)) { m_bUpFrameRate = true; if (inputTimeStamp <= m_expectedTimeStamp) { m_upCoeff = 0; m_timeStampDifference = 0; // manage locked surfaces iterator = std::find(m_LockedSurfacesList.begin(), m_LockedSurfacesList.end(), input); if (m_LockedSurfacesList.end() != iterator) { m_LockedSurfacesList.erase(m_LockedSurfacesList.begin()); } output->Data.TimeStamp = m_expectedTimeStamp; // save current time stamp value m_prevInputTimeStamp = m_expectedTimeStamp; } else { // manage locked surfaces iterator = std::find(m_LockedSurfacesList.begin(), m_LockedSurfacesList.end(), input); if (m_LockedSurfacesList.end() == iterator) { m_LockedSurfacesList.push_back(input); } else { } // calculate timestamp increment if (false == m_timeStampDifference) { m_timeStampDifference = abs((mfxI32)(m_expectedTimeStamp - m_prevInputTimeStamp)); } m_upCoeff += 1; // calculate output time stamp output->Data.TimeStamp = m_prevInputTimeStamp + m_timeStampDifference * m_upCoeff; // duplicate this frame // request new one output surface *intSts = MFX_ERR_MORE_SURFACE; } } else { // manage locked surfaces iterator = std::find(m_LockedSurfacesList.begin(), m_LockedSurfacesList.end(), input); if (m_LockedSurfacesList.end() != iterator) { m_LockedSurfacesList.erase(m_LockedSurfacesList.begin()); } output->Data.TimeStamp = m_expectedTimeStamp; // save current time stamp value m_prevInputTimeStamp = m_expectedTimeStamp; } output->Data.FrameOrder = m_numOutputFrames; // increment number of output frames m_numOutputFrames += 1; return MFX_ERR_NONE; } // mfxStatus CpuFrc::PtsFrc::DoCpuFRC_AndUpdatePTS(...) mfxStatus CpuFrc::DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts) { if(nullptr == input) return MFX_ERR_MORE_DATA; if (nullptr == output) return MFX_ERR_MORE_SURFACE; if (FRC_STANDARD & m_frcMode) // standard FRC (input frames count -> output frames count) { return m_stdFrc.DoCpuFRC_AndUpdatePTS(input, output, intSts); } else // frame rate conversion by pts { return m_ptsFrc.DoCpuFRC_AndUpdatePTS(input, output, intSts); } } // mfxStatus VideoVPPHW::DoCpuFRC_AndUpdatePTS(...) //////////////////////////////////////////////////////////////////////////////////// // Resource Manager //////////////////////////////////////////////////////////////////////////////////// mfxStatus ResMngr::Close(void) { ReleaseSubResource(true); Clear(m_surf[VPP_IN]); Clear(m_surf[VPP_OUT]); m_bOutputReady = false; m_bRefFrameEnable = false; m_inputIndex = 0; m_outputIndex = 0; m_bkwdRefCount = 0; m_fwdRefCount = 0; m_EOS = false; m_actualNumber = 0; m_indxOutTimeStamp = 0; m_fieldWeaving = false; m_inputFramesOrFieldPerCycle = 0; m_inputIndexCount = 0; m_outputIndexCountPerCycle = 0; m_fwdRefCountRequired = 0; m_bkwdRefCountRequired = 0; /* m_core = NULL; if (NULL != m_pSubResource) { m_pSubResource->refCount = 0; m_pSubResource->surfaceListForRelease.clear(); m_pSubResource = NULL; } */ m_subTaskQueue.clear(); m_surfQueue.clear(); return MFX_ERR_NONE; } // mfxStatus ResMngr::Close(void) mfxStatus ResMngr::Init( Config & config, VideoCORE* core) { bool IsD3D9SimWithVideoMemIn = IsD3D9Simulation(*core) && (config.m_IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); if( config.m_IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY || IsD3D9SimWithVideoMemIn) { m_surf[VPP_IN].resize( config.m_surfCount[VPP_IN] ); } bool IsD3D9SimWithVideoMemOut = IsD3D9Simulation(*core) && (config.m_IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if( config.m_IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY || IsD3D9SimWithVideoMemOut) { m_surf[VPP_OUT].resize( config.m_surfCount[VPP_OUT] ); } m_bRefFrameEnable = config.m_bRefFrameEnable; if( (config.m_extConfig.mode & FRC_INTERPOLATION) || (config.m_extConfig.mode & VARIANCE_REPORT) || (config.m_extConfig.mode & COMPOSITE) || (config.m_extConfig.mode & IS_REFERENCES)) { mfxU32 totalInputFramesCount = config.m_extConfig.customRateData.bkwdRefCount + 1 + config.m_extConfig.customRateData.fwdRefCount; m_inputIndexCount = totalInputFramesCount; m_outputIndexCountPerCycle = config.m_extConfig.customRateData.outputIndexCountPerCycle; m_bkwdRefCountRequired = config.m_extConfig.customRateData.bkwdRefCount; m_fwdRefCountRequired = config.m_extConfig.customRateData.fwdRefCount; m_inputFramesOrFieldPerCycle = config.m_extConfig.customRateData.inputFramesOrFieldPerCycle; //m_core = core; } m_fieldWeaving = config.m_bWeave; m_multiBlt = config.m_multiBlt; m_core = core; return MFX_ERR_NONE; } // mfxStatus ResMngr::Init(...) mfxStatus ResMngr::DoAdvGfx( mfxFrameSurface1 *input, mfxFrameSurface1 * /*output*/, mfxStatus *intSts) { assert( m_inputIndex <= m_inputIndexCount); assert( m_outputIndex < m_outputIndexCountPerCycle); if( m_bOutputReady )// MARKER: output is ready, new out surface is need only { m_outputIndex++; if( m_outputIndex == m_outputIndexCountPerCycle )//MARKER: produce last frame for current Task Slot { // update all state m_bOutputReady= false; m_outputIndex = 0; *intSts = MFX_ERR_NONE; } else { *intSts = MFX_ERR_MORE_SURFACE; } m_indxOutTimeStamp++; return MFX_ERR_NONE; } else // new task { m_fwdRefCount = m_fwdRefCountRequired; if (m_fieldWeaving) m_bkwdRefCount = m_bkwdRefCountRequired; if(input) { m_inputIndex++; mfxStatus sts = m_core->IncreaseReference(*input); MFX_CHECK_STS(sts); ExtSurface surf; surf.pSurf = input; if(m_surf[VPP_IN].size() > 0) // input in system memory { surf.bUpdate = true; surf.resIdx = FindFreeSurface(m_surf[VPP_IN]); if(NO_INDEX == surf.resIdx) return MFX_WRN_DEVICE_BUSY; m_surf[VPP_IN][surf.resIdx].SetFree(false);// marks resource as "locked" } m_surfQueue.push_back(surf); } bool isEOSSignal = ((NULL == input) && (m_bkwdRefCount == m_bkwdRefCountRequired) && (m_inputIndex > m_bkwdRefCountRequired)); if(isEOSSignal) { m_fwdRefCount = m_inputIndex > m_bkwdRefCount + 1 ? m_inputIndex - m_bkwdRefCount - 1 : 0; } if( (m_inputIndex - m_bkwdRefCount == m_inputIndexCount - m_bkwdRefCountRequired) || isEOSSignal) // MARKER: start new Task Slot { m_actualNumber = m_actualNumber + m_inputFramesOrFieldPerCycle; // for driver PTS m_outputIndex++; m_indxOutTimeStamp = 0; if( m_outputIndex == m_outputIndexCountPerCycle ) // MARKER: produce last frame for current Task Slot { // update all state m_outputIndex = 0; *intSts = MFX_ERR_NONE; } else { m_bOutputReady = true; *intSts = MFX_ERR_MORE_SURFACE; } m_pSubResource = CreateSubResource(); return MFX_ERR_NONE; } //------------------------------------------------- // MARKER: task couldn't be started. else { *intSts = MFX_ERR_MORE_DATA; return MFX_ERR_MORE_DATA; } } } // mfxStatus ResMngr::DoAdvGfx(...) /// This function requests for new decoded frame if needed in /// 30i->60p mode /* \param[in] input input surface \param[in] output output surface \param [out] intSts :MFX_ERR_NONE will request for decoded frame, MFX_ERR_MORE_SURFACE will call VPP on previously decoded surface */ mfxStatus ResMngr::DoMode30i60p( mfxFrameSurface1 *input, mfxFrameSurface1 * /*output*/, mfxStatus *intSts) { if( m_bOutputReady )// MARKER: output is ready, new out surface is need only { m_inputIndex++; m_bOutputReady = false; *intSts = MFX_ERR_NONE; m_outputIndex = 0; // marker task end; return MFX_ERR_NONE; } else // new task { m_outputIndex = 1; // marker new task; if(input) { m_EOS = false; // in cases where m_core-> GetVAType () returns value equal to MFX_HW_VAAPI, this is Linux if ((0 == m_inputIndex && m_core->GetVAType() == MFX_HW_VAAPI) || // Linux condition /* this additional check is required to use BOB in Windows. with its help, m_outputIndexCountPerCycle = 2, but m_bkwdRefCount = 0 what allows you to take two surfaces and change odd / even frames to compensate for driver behavior */ (0 == m_inputIndex && m_core->GetVAType() <= MFX_HW_D3D11 && m_bRefFrameEnable)) // Windows condition { *intSts = MFX_ERR_NONE; m_outputIndexCountPerCycle = 3; //was 3 m_bkwdRefCount = 0; // First frame does not have reference } else { m_bOutputReady = true; *intSts = MFX_ERR_MORE_SURFACE; m_outputIndexCountPerCycle = 2; if (true == m_bRefFrameEnable) // ADI { // need one backward reference to enable motion adaptive ADI m_bkwdRefCount = 1; } else { m_bkwdRefCount = 0; } } mfxStatus sts = m_core->IncreaseReference(*input); MFX_CHECK_STS(sts); ExtSurface surf; surf.pSurf = input; if(m_surf[VPP_IN].size() > 0) // input in system memory { surf.bUpdate = true; surf.resIdx = FindFreeSurface(m_surf[VPP_IN]); if(NO_INDEX == surf.resIdx) return MFX_WRN_DEVICE_BUSY; m_surf[VPP_IN][surf.resIdx].SetFree(false);// marks resource as "locked" } m_surfQueue.push_back(surf); if(1 != m_inputIndex) { m_pSubResource = CreateSubResourceForMode30i60p(); } m_inputIndex++; return MFX_ERR_NONE; } else { m_EOS = true; if (m_surfQueue.size() > 0) { *intSts = MFX_ERR_NONE; m_outputIndexCountPerCycle = 1; m_bkwdRefCount = 0; m_outputIndex = 0; // marker task end; m_pSubResource = CreateSubResourceForMode30i60p(); return MFX_ERR_NONE; } else { return MFX_ERR_MORE_DATA; } } } } // mfxStatus ResMngr::DoMode30i60p(...) mfxStatus ResMngr::ReleaseSubResource(bool bAll) { //----------------------------------------------------- // Release SubResource // (1) if all task have been completed (refCount == 0) // (2) if common Close() std::vector taskToRemove; mfxU32 i; for (i = 0; i < m_subTaskQueue.size(); i++) { if (bAll || (0 == m_subTaskQueue[i]->refCount) ) { for (mfxU32 resIndx = 0; resIndx < m_subTaskQueue[i]->surfaceListForRelease.size(); resIndx++ ) { ExtSurface & extSrf = m_subTaskQueue[i]->surfaceListForRelease[resIndx]; mfxU32 freeIdx = extSrf.resIdx; if (NO_INDEX != freeIdx && m_surf[VPP_IN].size() > 0) { m_surf[VPP_IN][freeIdx].SetFree(true); } if (bAll) { // surfaceListForRelease has copies from m_surfQueue. // Remove such elements from m_surfQueue. std::vector::iterator it = m_surfQueue.begin(); while (it != m_surfQueue.end()) { if (it->pSurf == extSrf.pSurf) it = m_surfQueue.erase(it); else it++; } } mfxStatus sts = m_core->DecreaseReference(*extSrf.pSurf); MFX_CHECK_STS(sts); } m_subTaskQueue[i]->subTasks.shrink_to_fit(); m_subTaskQueue[i]->subTasks.clear(); taskToRemove.push_back( m_subTaskQueue[i] ); } } size_t removeCount = taskToRemove.size(); std::vector::iterator it; for (i = 0; i < removeCount; i++) { it = std::find(m_subTaskQueue.begin(), m_subTaskQueue.end(), taskToRemove[i] ); if ( it != m_subTaskQueue.end()) { m_subTaskQueue.erase(it); } delete taskToRemove[i]; } if (bAll) { // DecreaseReference on remaining elements from m_surfQueue while (m_surfQueue.size()) { mfxFrameSurface1 * surf = m_surfQueue.begin()->pSurf; m_surfQueue.erase(m_surfQueue.begin()); m_core->DecreaseReference(*surf); } } return MFX_ERR_NONE; } // mfxStatus ResMngr::ReleaseSubResource(bool bAll) ReleaseResource* ResMngr::CreateSubResource(void) { // fill resource to remove after task slot completion ReleaseResource* subRes = new ReleaseResource; subRes->refCount = 0; subRes->surfaceListForRelease.clear(); subRes->subTasks.clear(); subRes->refCount = m_outputIndexCountPerCycle; mfxU32 numFramesForRemove = std::min(GetNumToRemove(), mfxU32(m_surfQueue.size())); for(mfxU32 i = 0; i < numFramesForRemove; i++) { subRes->surfaceListForRelease.push_back( m_surfQueue[i] ); } m_subTaskQueue.push_back(subRes); return subRes; } // ReleaseResource* ResMngr::CreateSubResource(void) ReleaseResource* ResMngr::CreateSubResourceForMode30i60p(void) { // fill resource to remove after task slot completion ReleaseResource* subRes = new ReleaseResource; subRes->refCount = 0; subRes->surfaceListForRelease.clear(); subRes->subTasks.clear(); subRes->refCount = m_outputIndexCountPerCycle; mfxU32 numFramesForRemove = 1; for(mfxU32 i = 0; i < numFramesForRemove; i++) { subRes->surfaceListForRelease.push_back( m_surfQueue[i] ); } m_subTaskQueue.push_back(subRes); return subRes; } // ReleaseResource* ResMngr::CreateSubResourceForMode30i60p(void) //--------------------------------------------------------- /// Sets up reference, current input and corresponding timeStamp mfxStatus ResMngr::FillTaskForMode30i60p( DdiTask* pTask, mfxFrameSurface1 * /*pInSurface*/, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF , mfxFrameSurface1 * pOutSurfaceForApp #endif ) { mfxU32 refIndx = 0; pTask->bEOS = m_EOS; // bkwd pTask->bkwdRefCount = m_bkwdRefCount; mfxU32 actualNumber = m_actualNumber; // sets up reference frame for(refIndx = 0; refIndx < pTask->bkwdRefCount; refIndx++) { ExtSurface bkwdSurf = m_surfQueue[refIndx]; bkwdSurf.timeStamp = CURRENT_TIME_STAMP + actualNumber * FRAME_INTERVAL; bkwdSurf.endTimeStamp = CURRENT_TIME_STAMP + (actualNumber + 1) * FRAME_INTERVAL; if(m_surf[VPP_IN].size() > 0) // input in system memory { if(m_surfQueue[refIndx].bUpdate) { m_surfQueue[refIndx].bUpdate = false; m_surf[VPP_IN][m_surfQueue[refIndx].resIdx].SetFree(false); } } pTask->m_refList.push_back(bkwdSurf); actualNumber++; } // Current input { pTask->input = m_surfQueue[pTask->bkwdRefCount]; // BOB uses previous input for odd frames and current input for even frames if (pTask->bkwdRefCount == 0 && pTask->taskIndex > 0) { actualNumber++; // increase for BOB as there are no reference frame if ((pTask->taskIndex % 2) == 0) { //in the case of work in Windows to BOB [PREVIOUS_INPUT] used instead of [CURRENT_INPUT] because of the characteristics of the driver pTask->input = m_core->GetVAType() <= MFX_HW_D3D11 ? m_surfQueue[PREVIOUS_INPUT] : m_surfQueue[CURRENT_INPUT]; } } pTask->input.timeStamp = CURRENT_TIME_STAMP + actualNumber * FRAME_INTERVAL; pTask->input.endTimeStamp = CURRENT_TIME_STAMP + (actualNumber + 1) * FRAME_INTERVAL; if(m_surf[VPP_IN].size() > 0) // input in system memory { if(m_surfQueue[pTask->bkwdRefCount].bUpdate) { m_surfQueue[pTask->bkwdRefCount].bUpdate = false; m_surf[VPP_IN][m_surfQueue[pTask->bkwdRefCount].resIdx].SetFree(false); } } } // output { #ifdef MFX_ENABLE_MCTF pTask->output.pSurf = pOutSurface; pTask->output.timeStamp = pTask->input.timeStamp; pTask->outputForApp.pSurf = pOutSurfaceForApp; pTask->outputForApp.timeStamp = pTask->input.timeStamp; if (m_surf[VPP_OUT].size() > 0) // out in system memory { if (pTask->outputForApp.pSurf) m_surf[VPP_OUT][pTask->outputForApp.resIdx].SetFree(false); } #else pTask->output.pSurf = pOutSurface; pTask->output.timeStamp = pTask->input.timeStamp; if(m_surf[VPP_OUT].size() > 0) // out in system memory { m_surf[VPP_OUT][pTask->output.resIdx].SetFree(false); } #endif actualNumber++; } if(m_pSubResource) { pTask->pSubResource = m_pSubResource; } // MARKER: last frame in current Task Slot // after resource are filled we can update generall container and state if( m_outputIndex == 0 ) { size_t numFramesToRemove = m_pSubResource->surfaceListForRelease.size(); for(size_t i = 0; i < numFramesToRemove; i++) { m_surfQueue.erase( m_surfQueue.begin() ); } // correct output pts for target output pTask->output.timeStamp = (pTask->input.timeStamp + pTask->input.endTimeStamp) >> 1; #ifdef MFX_ENABLE_MCTF pTask->outputForApp.timeStamp = (pTask->input.timeStamp + pTask->input.endTimeStamp) >> 1; #endif } // update if(pTask->taskIndex > 0 && !(pTask->taskIndex & 1)) { m_actualNumber++; } return MFX_ERR_NONE; } // void ResMngr::FillTaskForMode30i60p(...) //--------------------------------------------------------- mfxStatus ResMngr::FillTask( DdiTask* pTask, mfxFrameSurface1 * /*pInSurface*/, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF , mfxFrameSurface1 * pOutSurfaceForApp #endif ) { mfxU32 refIndx = 0; // bkwd pTask->bkwdRefCount = m_bkwdRefCount;//we set real bkw frames mfxU32 actualNumber = m_actualNumber; for(refIndx = 0; refIndx < pTask->bkwdRefCount; refIndx++) { ExtSurface bkwdSurf = m_surfQueue[refIndx]; bkwdSurf.timeStamp = CURRENT_TIME_STAMP + actualNumber * FRAME_INTERVAL; bkwdSurf.endTimeStamp = CURRENT_TIME_STAMP + (actualNumber + 1) * FRAME_INTERVAL; if(m_surf[VPP_IN].size() > 0) // input in system memory { if(m_surfQueue[refIndx].bUpdate) { m_surfQueue[refIndx].bUpdate = false; m_surf[VPP_IN][m_surfQueue[refIndx].resIdx].SetFree(false); } } // pTask->m_refList.push_back(bkwdSurf); actualNumber++; } // input { pTask->input = m_surfQueue[pTask->bkwdRefCount]; pTask->input.timeStamp = CURRENT_TIME_STAMP + actualNumber * FRAME_INTERVAL; pTask->input.endTimeStamp = CURRENT_TIME_STAMP + (actualNumber + 1) * FRAME_INTERVAL; if(m_surf[VPP_IN].size() > 0) // input in system memory { if(m_surfQueue[pTask->bkwdRefCount].bUpdate) { m_surfQueue[pTask->bkwdRefCount].bUpdate = false; m_surf[VPP_IN][m_surfQueue[pTask->bkwdRefCount].resIdx].SetFree(false); } } } // output { #ifdef MFX_ENABLE_MCTF // modify by outputForApp? pTask->output.pSurf = pOutSurface; pTask->output.timeStamp = pTask->input.timeStamp + m_indxOutTimeStamp * (FRAME_INTERVAL / m_outputIndexCountPerCycle); pTask->outputForApp.pSurf = pOutSurfaceForApp; pTask->outputForApp.timeStamp = pTask->output.timeStamp; if (m_surf[VPP_OUT].size() > 0) // out in system memory { if (pTask->outputForApp.pSurf) m_surf[VPP_OUT][pTask->outputForApp.resIdx].SetFree(false); } #else pTask->output.pSurf = pOutSurface; pTask->output.timeStamp = pTask->input.timeStamp + m_indxOutTimeStamp * (FRAME_INTERVAL / m_outputIndexCountPerCycle); if(m_surf[VPP_OUT].size() > 0) // out in system memory { m_surf[VPP_OUT][pTask->output.resIdx].SetFree(false); } #endif actualNumber++; } // fwd pTask->fwdRefCount = m_fwdRefCount; for(refIndx = 0; refIndx < pTask->fwdRefCount; refIndx++) { mfxU32 fwdIdx = pTask->bkwdRefCount + 1 + refIndx; ExtSurface fwdSurf = m_surfQueue[fwdIdx]; fwdSurf.timeStamp = CURRENT_TIME_STAMP + actualNumber * FRAME_INTERVAL; fwdSurf.endTimeStamp = CURRENT_TIME_STAMP + (actualNumber + 1) * FRAME_INTERVAL; if(m_surf[VPP_IN].size() > 0) // input in system memory { if(fwdSurf.bUpdate) { m_surfQueue[fwdIdx].bUpdate = false; m_surf[VPP_IN][m_surfQueue[fwdIdx].resIdx].SetFree(false); } } pTask->m_refList.push_back(fwdSurf); if (m_pSubResource && m_multiBlt) { m_pSubResource->subTasks.push_back(pTask->taskIndex + refIndx + 1); } actualNumber++; } if(m_pSubResource) { pTask->pSubResource = m_pSubResource; } // MARKER: last frame in current Task Slot // after resource are filled we can update generall container and state if( m_outputIndex == 0 ) { size_t numFramesToRemove = m_pSubResource->surfaceListForRelease.size(); for(size_t i = 0; i < numFramesToRemove; i++) { m_surfQueue.erase( m_surfQueue.begin() ); } m_inputIndex -= (mfxU32)numFramesToRemove; m_bkwdRefCount = GetNextBkwdRefCount(); } return MFX_ERR_NONE; } // void ResMngr::FillTask(...) mfxStatus ResMngr::CompleteTask(DdiTask *pTask) { if(pTask->pSubResource) { pTask->pSubResource->refCount--; } mfxStatus sts = ReleaseSubResource(false); // false mean release subResource with RefCnt == 0 only MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus ResMngr::CompleteTask(DdiTask *pTask) SubTask ResMngr::GetSubTask(DdiTask *pTask) { if (pTask && pTask->pSubResource && pTask->pSubResource->subTasks.size()) return pTask->pSubResource->subTasks[0]; else return SubTask(); } mfxStatus ResMngr::DeleteSubTask(DdiTask *pTask, mfxU32 subtaskIdx) { if (pTask && pTask->pSubResource) { std::vector::iterator sub_it;//find(pTask->pSubResource->subTasks.begin(), pTask->pSubResource->subTasks.end(), subtaskIdx); for (sub_it = pTask->pSubResource->subTasks.begin(); sub_it != pTask->pSubResource->subTasks.end(); sub_it++) { if (sub_it->taskIndex == subtaskIdx) { pTask->pSubResource->subTasks.erase(sub_it); return MFX_ERR_NONE; } } } return MFX_ERR_NOT_FOUND; } bool ResMngr::IsMultiBlt() { return m_multiBlt; } //////////////////////////////////////////////////////////////////////////////////// // TaskManager //////////////////////////////////////////////////////////////////////////////////// TaskManager::TaskManager() { m_mode30i60p.m_numOutputFrames = 0; m_mode30i60p.m_prevInputTimeStamp = 0; m_taskIndex = 0; m_actualNumber = 0; m_core = 0; m_mode30i60p.SetEnable(false); m_extMode = 0; #ifdef MFX_ENABLE_MCTF m_MCTFSurfacesInQueue = 0; #endif } // TaskManager::TaskManager() TaskManager::~TaskManager() { Close(); } // TaskManager::~TaskManager(void) mfxStatus TaskManager::Init( VideoCORE* core, Config & config) { m_taskIndex = 0; m_actualNumber = 0; m_core = core; // init param m_mode30i60p.SetEnable(config.m_bMode30i60pEnable); m_extMode = config.m_extConfig.mode; m_mode30i60p.m_numOutputFrames = 0; m_mode30i60p.m_prevInputTimeStamp = 0; m_cpuFrc.Reset(m_extMode, config.m_extConfig.frcRational); m_resMngr.Init(config, this->m_core); m_tasks.resize(config.m_surfCount[VPP_OUT]); #ifdef MFX_ENABLE_MCTF m_MCTFSurfacesInQueue = 0; #endif return MFX_ERR_NONE; } // mfxStatus TaskManager::Init(void) mfxStatus TaskManager::Close(void) { m_actualNumber = m_taskIndex = 0; Clear(m_tasks); m_core = NULL; m_mode30i60p.SetEnable(false); m_extMode = 0; RateRational frcRational[2]; frcRational[VPP_IN].FrameRateExtN = 30; frcRational[VPP_IN].FrameRateExtD = 1; frcRational[VPP_OUT].FrameRateExtN = 30; frcRational[VPP_OUT].FrameRateExtD = 1; m_cpuFrc.Reset(m_extMode, frcRational); m_resMngr.Close(); // release all resource return MFX_ERR_NONE; } // mfxStatus TaskManager::Close(void) mfxStatus TaskManager::DoCpuFRC_AndUpdatePTS( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts) { return m_cpuFrc.DoCpuFRC_AndUpdatePTS(input, output, intSts); } // mfxStatus TaskManager::::DoCpuFRC_AndUpdatePTS(...) mfxStatus TaskManager::DoAdvGfx( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxStatus *intSts) { return m_resMngr.DoAdvGfx(input, output, intSts); } // mfxStatus TaskManager::DoAdvGfx(...) mfxStatus TaskManager::AssignTask( mfxFrameSurface1 *input, mfxFrameSurface1 *output, #ifdef MFX_ENABLE_MCTF mfxFrameSurface1 *outputForApp, #endif mfxExtVppAuxData *aux, DdiTask*& pTask, mfxStatus& intSts) { UMC::AutomaticUMCMutex guard(m_mutex); // no state machine in VPP, so transition to previous state isn't possible. // it is the simplest way to resolve issue with MFX_WRN_DEVICE_BUSY, but performance could be affected pTask = GetTask(); if(NULL == pTask) { return MFX_WRN_DEVICE_BUSY; } pTask->input.bForcedInternalAlloc = false; pTask->output.bForcedInternalAlloc = false; #ifdef MFX_ENABLE_MCTF pTask->outputForApp.bForcedInternalAlloc = false; auto mctf = pMCTF.lock(); if (mctf) { mfxExtVppMctf* mctf_ctrl = input ? reinterpret_cast(GetExtendedBuffer(input->Data.ExtParam, input->Data.NumExtParam, MFX_EXTBUFF_VPP_MCTF)) : nullptr; pTask->bMCTF = true; // public or private runtime control if (mctf_ctrl) { pTask->MctfControlActive = true; CMC::FillParamControl(&pTask->MctfData, mctf_ctrl); } else { CMC::QueryDefaultParams(&pTask->MctfData); pTask->MctfControlActive = false; } } else { pTask->bMCTF = false; CMC::QueryDefaultParams(&pTask->MctfData); } #endif //-------------------------------------------------------- mfxStatus sts = MFX_ERR_NONE; bool isAdvGfxMode = (COMPOSITE & m_extMode) || (FRC_INTERPOLATION & m_extMode) || (VARIANCE_REPORT & m_extMode) || (IS_REFERENCES & m_extMode)? true : false; #ifdef MFX_ENABLE_MCTF // calls below may change only TimeStamp & FrameOrder, so // no passing of outputForApp as TimeStamp & FrameOrder // will be copied then. #endif if( isAdvGfxMode ) { sts = DoAdvGfx(input, output, &intSts); } else if ((FRC_ENABLED & m_extMode) && (!m_mode30i60p.IsEnabled()) ) { sts = DoCpuFRC_AndUpdatePTS(input, output, &intSts); } else if( m_mode30i60p.IsEnabled() ) { if( (NULL == input) && (FRC_DISTRIBUTED_TIMESTAMP & m_extMode) ) { sts = MFX_ERR_MORE_DATA; } //------------------------------------------------- if (MFX_ERR_MORE_DATA != sts) sts = m_resMngr.DoMode30i60p(input, output, &intSts); } else // simple mode { if (NULL == input) sts = MFX_ERR_MORE_DATA; } #ifdef MFX_ENABLE_MCTF MFX_CHECK_NULL_PTR1(output); // DoCpuFRC_AndUpdatePTS updates TimeStamp & FrameOrder in output; // copy these values to outputForApp if (outputForApp != output && outputForApp) { outputForApp->Data.TimeStamp = output->Data.TimeStamp; outputForApp->Data.FrameOrder = output->Data.FrameOrder; } // this condition means the end of the stream; for MCTF it stands for // pushing everything out of an internal queue (if any) if (!input && MFX_ERR_MORE_DATA == sts && pTask->bMCTF) { // if MCTF is enabled & it is in a mode with > 1 ref, // and we approached the end, fill the task with only // output surface if (TWO_REFERENCES == mctf->MCTF_GetReferenceNumber() || FOUR_REFERENCES == mctf->MCTF_GetReferenceNumber()) { sts = FillLastTasks(pTask, output, outputForApp, aux); } if (MFX_ERR_NONE == sts) sts = MFX_ERR_MORE_DATA; } #endif MFX_CHECK_STS(sts); sts = FillTask(pTask, input, output, #ifdef MFX_ENABLE_MCTF outputForApp, #endif aux); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_MCTF if (pTask->bMCTF) { // if we here, sts == MFX_ERR_NONE; ++m_MCTFSurfacesInQueue; // m_MCTFSurfacesInQueue means number of frames including the current; // in case of 2 refs or 4 refs, its enough to have 2 or 3 to output. // Effectively, it is used to count number of forward refs + current; // Semantic can be changed to track how many frames are in queue (it // cannot be greater than 3 for 2 refs, or 5 for 4 refs. switch (mctf->MCTF_GetReferenceNumber()) { case NO_REFERENCES: case ONE_REFERENCE: m_MCTFSurfacesInQueue = 1; break; case TWO_REFERENCES: if (m_MCTFSurfacesInQueue < 2) { // MCTF cannot work with FRC if it uses 2-refs if (MFX_ERR_MORE_SURFACE == intSts) return MFX_ERR_UNDEFINED_BEHAVIOR; intSts = MFX_ERR_MORE_DATA_SUBMIT_TASK; } else m_MCTFSurfacesInQueue = 2; break; case FOUR_REFERENCES: if (m_MCTFSurfacesInQueue < 3) { // MCTF cannot work with FRC if it uses 4-refs if (MFX_ERR_MORE_SURFACE == intSts) return MFX_ERR_UNDEFINED_BEHAVIOR; intSts = MFX_ERR_MORE_DATA_SUBMIT_TASK; } else m_MCTFSurfacesInQueue = 3; break; } } #endif if (m_mode30i60p.IsEnabled()) { UpdatePTS_Mode30i60p( input, output, pTask->taskIndex, &intSts); } else if ( !(FRC_ENABLED & m_extMode) && !isAdvGfxMode ) { UpdatePTS_SimpleMode(input, output); } else if (IS_REFERENCES & m_extMode) /* case for ADI with references */ { UpdatePTS_SimpleMode(input, output); } #ifdef MFX_ENABLE_MCTF // update functions may update TimeStamp & FrameOrder if (outputForApp != output && outputForApp) { outputForApp->Data.TimeStamp = output->Data.TimeStamp; outputForApp->Data.FrameOrder = output->Data.FrameOrder; } #endif return MFX_ERR_NONE; } // mfxStatus TaskManager::AssignTask(...) mfxStatus TaskManager::CompleteTask(DdiTask* pTask) { UMC::AutomaticUMCMutex guard(m_mutex); #ifdef MFX_ENABLE_MCTF if (pTask->output.pSurf != pTask->outputForApp.pSurf && pTask->outputForApp.pSurf) MFX_SAFE_CALL(m_core->DecreaseReference(*pTask->outputForApp.pSurf)); #endif mfxStatus sts = m_core->DecreaseReference(*pTask->output.pSurf); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_MCTF mfxU32 freeIdx = pTask->outputForApp.resIdx; #else mfxU32 freeIdx = pTask->output.resIdx; #endif if(NO_INDEX != freeIdx && m_resMngr.m_surf[VPP_OUT].size() > 0) { m_resMngr.m_surf[VPP_OUT][freeIdx].SetFree(true); } if(pTask->bAdvGfxEnable || m_mode30i60p.IsEnabled() ) { sts = m_resMngr.CompleteTask(pTask); MFX_CHECK_STS(sts); } else // simple mode { freeIdx = pTask->input.resIdx; if(NO_INDEX != freeIdx && m_resMngr.m_surf[VPP_IN].size() > 0) { m_resMngr.m_surf[VPP_IN][freeIdx].SetFree(true); } } if (pTask->input.pSurf) sts = m_core->DecreaseReference(*pTask->input.pSurf); MFX_CHECK_STS(sts); FreeTask(pTask); return MFX_TASK_DONE; } // mfxStatus TaskManager::CompleteTask(DdiTask* pTask) DdiTask* TaskManager::GetTask(void) { mfxU32 indx = FindFreeSurface(m_tasks); if(NO_INDEX == indx) return NULL; m_tasks[indx].skipQueryStatus = false; return &(m_tasks[indx]); } // DdiTask* TaskManager::CreateTask(void) void TaskManager::FillTask_Mode30i60p( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF ,mfxFrameSurface1 *pOutSurfaceForApp #endif ) { m_resMngr.FillTaskForMode30i60p(pTask, pInSurface, pOutSurface #ifdef MFX_ENABLE_MCTF ,pOutSurfaceForApp #endif ); } // void TaskManager::FillTask_60i60pMode(DdiTask* pTask) void TaskManager::FillTask_AdvGfxMode( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface #ifdef MFX_ENABLE_MCTF ,mfxFrameSurface1 *pOutSurfaceForApp #endif ) { m_resMngr.FillTask(pTask, pInSurface, pOutSurface #ifdef MFX_ENABLE_MCTF , pOutSurfaceForApp #endif ); } // void TaskManager::FillTask_AdvGfxMode(...) mfxStatus TaskManager::FillTask( DdiTask* pTask, mfxFrameSurface1 *pInSurface, mfxFrameSurface1 *pOutSurface, #ifdef MFX_ENABLE_MCTF mfxFrameSurface1 *pOutSurfaceForApp, #endif mfxExtVppAuxData *aux) { // [0] Set param pTask->input.pSurf = pInSurface; pTask->input.resIdx = NO_INDEX; pTask->output.pSurf = pOutSurface; pTask->output.resIdx = NO_INDEX; #ifdef MFX_ENABLE_MCTF pTask->outputForApp.pSurf = pOutSurfaceForApp; pTask->outputForApp.resIdx = NO_INDEX; #endif if(m_resMngr.m_surf[VPP_OUT].size() > 0) // out in system memory { #ifdef MFX_ENABLE_MCTF // it might be nullptr, meaning MCTF works with delay & its just started // if it is not ready to ouptut, we cannot lock & change output surface // by no means. if (pTask->outputForApp.pSurf) { // resIdx is required to only for outputForApp as only this surface // is the actual surface allocated by an App; output might be an internal // buffer; so, lets update resIdx only in outputForApp. pTask->outputForApp.resIdx = FindFreeSurface(m_resMngr.m_surf[VPP_OUT]); if (NO_INDEX == pTask->outputForApp.resIdx) return MFX_WRN_DEVICE_BUSY; m_resMngr.m_surf[VPP_OUT][pTask->outputForApp.resIdx].SetFree(false); if (pTask->outputForApp.pSurf == pTask->output.pSurf) pTask->output.resIdx = pTask->outputForApp.resIdx; } #else pTask->output.resIdx = FindFreeSurface( m_resMngr.m_surf[VPP_OUT] ); if( NO_INDEX == pTask->output.resIdx) return MFX_WRN_DEVICE_BUSY; m_resMngr.m_surf[VPP_OUT][pTask->output.resIdx].SetFree(false); #endif } pTask->taskIndex = m_taskIndex++; if ((m_taskIndex + pTask->fwdRefCount) >= NO_INDEX) m_taskIndex = 1; pTask->input.timeStamp = CURRENT_TIME_STAMP + m_actualNumber * FRAME_INTERVAL; pTask->input.endTimeStamp = CURRENT_TIME_STAMP + (m_actualNumber + 1) * FRAME_INTERVAL; pTask->output.timeStamp = pTask->input.timeStamp; #ifdef MFX_ENABLE_MCTF pTask->outputForApp.timeStamp = pTask->output.timeStamp; #endif pTask->bAdvGfxEnable = (COMPOSITE & m_extMode) || (FRC_INTERPOLATION & m_extMode) || (VARIANCE_REPORT & m_extMode) || (IS_REFERENCES & m_extMode)? true : false; pTask->pAuxData = aux; if( m_mode30i60p.IsEnabled() ) { FillTask_Mode30i60p( pTask, pInSurface, pOutSurface #ifdef MFX_ENABLE_MCTF , pOutSurfaceForApp #endif ); } else if(pTask->bAdvGfxEnable) { FillTask_AdvGfxMode( pTask, pInSurface, pOutSurface #ifdef MFX_ENABLE_MCTF , pOutSurfaceForApp #endif ); if ((COMPOSITE & m_extMode) && m_resMngr.IsMultiBlt()) m_taskIndex += pTask->fwdRefCount; } else // simple mode { if(m_resMngr.m_surf[VPP_IN].size() > 0) // input in system memory { pTask->input.bUpdate = true; pTask->input.resIdx = FindFreeSurface( m_resMngr.m_surf[VPP_IN] ); if( NO_INDEX == pTask->input.resIdx) return MFX_WRN_DEVICE_BUSY; m_resMngr.m_surf[VPP_IN][pTask->input.resIdx].SetFree(false); } } m_actualNumber += 1; // make sense for simple mode only mfxStatus sts = m_core->IncreaseReference(*pTask->input.pSurf); MFX_CHECK_STS(sts); sts = m_core->IncreaseReference(*pTask->output.pSurf); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_MCTF // prevent double-lock if the same surface is passed an output & outputForApp if (pTask->output.pSurf != pTask->outputForApp.pSurf && pTask->outputForApp.pSurf) { sts = m_core->IncreaseReference(*pTask->outputForApp.pSurf); MFX_CHECK_STS(sts); } #endif pTask->SetFree(false); return MFX_ERR_NONE; } // mfxStatus TaskManager::FillTask(...) #ifdef MFX_ENABLE_MCTF mfxStatus TaskManager::FillLastTasks( DdiTask* pTask, mfxFrameSurface1 *pOutSurface, mfxFrameSurface1 *pOutSurfaceForApp, mfxExtVppAuxData *aux ) { mfxStatus sts = MFX_ERR_NONE; // [0] Set param pTask->input.pSurf = NULL; pTask->input.resIdx = NO_INDEX; pTask->output.pSurf = pOutSurface; pTask->output.resIdx = NO_INDEX; pTask->outputForApp.pSurf = pOutSurfaceForApp; pTask->outputForApp.resIdx = NO_INDEX; if (m_resMngr.m_surf[VPP_OUT].size() > 0) // out in system memory { #ifdef MFX_ENABLE_MCTF // resIdx is required to only for outputForApp as only this surface // is the actual surface allocated by an App; output might be an internal // buffer; so, lets update resIdx only in outputForApp. pTask->outputForApp.resIdx = FindFreeSurface(m_resMngr.m_surf[VPP_OUT]); if (NO_INDEX == pTask->outputForApp.resIdx) return MFX_WRN_DEVICE_BUSY; m_resMngr.m_surf[VPP_OUT][pTask->outputForApp.resIdx].SetFree(false); if (pTask->outputForApp.pSurf == pTask->output.pSurf) pTask->output.resIdx = pTask->outputForApp.resIdx; #else pTask->output.resIdx = FindFreeSurface(m_resMngr.m_surf[VPP_OUT]); if (NO_INDEX == pTask->output.resIdx) return MFX_WRN_DEVICE_BUSY; m_resMngr.m_surf[VPP_OUT][pTask->output.resIdx].SetFree(false); #endif } pTask->taskIndex = m_taskIndex++; pTask->output.timeStamp = CURRENT_TIME_STAMP + m_actualNumber * FRAME_INTERVAL; pTask->outputForApp.timeStamp = pTask->output.timeStamp; pTask->output.pSurf->Data.TimeStamp = pTask->output.timeStamp; pTask->pAuxData = aux; m_actualNumber += 1; // make sense for simple mode only sts = m_core->IncreaseReference(*pTask->output.pSurf); MFX_CHECK_STS(sts); // prevent double-lock if the same surface is passed an output & outputForApp if (pTask->output.pSurf != pTask->outputForApp.pSurf && pTask->outputForApp.pSurf) { pTask->outputForApp.pSurf->Data.TimeStamp = pTask->output.pSurf->Data.TimeStamp; pTask->outputForApp.pSurf->Data.FrameOrder = pTask->output.pSurf->Data.FrameOrder; sts = m_core->IncreaseReference(*pTask->outputForApp.pSurf); MFX_CHECK_STS(sts); } pTask->SetFree(false); return sts; } // mfxStatus TaskManager::FillLastTasks(...) #endif void TaskManager::UpdatePTS_Mode30i60p( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxU32 taskIndex, mfxStatus *intSts) { if (output == nullptr) { *intSts = MFX_ERR_MORE_SURFACE; return; } if (input == nullptr) { output->Data.TimeStamp = (mfxU64)MFX_TIME_STAMP_INVALID; output->Data.FrameOrder = (mfxU32)MFX_FRAMEORDER_UNKNOWN; *intSts = MFX_ERR_MORE_SURFACE; } else if ( (FRC_STANDARD & m_extMode) || (FRC_DISABLED == m_extMode) ) { if (0 != taskIndex % 2) { output->Data.TimeStamp = (mfxU64) MFX_TIME_STAMP_INVALID; output->Data.FrameOrder = (mfxU32) MFX_FRAMEORDER_UNKNOWN; *intSts = MFX_ERR_MORE_SURFACE; } else { output->Data.TimeStamp = input->Data.TimeStamp; output->Data.FrameOrder = input->Data.FrameOrder; *intSts = MFX_ERR_NONE; } } else if (FRC_DISTRIBUTED_TIMESTAMP & m_extMode) { if (0 != taskIndex % 2) { output->Data.TimeStamp = m_mode30i60p.m_prevInputTimeStamp + (input->Data.TimeStamp - m_mode30i60p.m_prevInputTimeStamp) / 2; *intSts = MFX_ERR_MORE_SURFACE; } else { m_mode30i60p.m_prevInputTimeStamp = input->Data.TimeStamp; output->Data.TimeStamp = input->Data.TimeStamp; *intSts = MFX_ERR_NONE; } output->Data.FrameOrder = m_mode30i60p.m_numOutputFrames; m_mode30i60p.m_numOutputFrames += 1; } return; } // void TaskManager::UpdatePTS_Mode30i60p(...) SubTask TaskManager::GetSubTask(DdiTask *pTask) { return m_resMngr.GetSubTask(pTask); } mfxStatus TaskManager::DeleteSubTask(DdiTask *pTask, mfxU32 subtaskIdx) { return m_resMngr.DeleteSubTask(pTask, subtaskIdx); } void TaskManager::UpdatePTS_SimpleMode( mfxFrameSurface1 *input, mfxFrameSurface1 *output) { if (input && output) { output->Data.TimeStamp = input->Data.TimeStamp; output->Data.FrameOrder = input->Data.FrameOrder; } } // void UpdatePTS_SimpleMode(...) //////////////////////////////////////////////////////////////////////////////////// // VideoHWVPP Component: platform independent code //////////////////////////////////////////////////////////////////////////////////// mfxStatus VideoVPPHW::CopyPassThrough(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface) { mfxStatus sts = MFX_ERR_NONE; mfxU16 srcPattern = 0, dstPattern = 0; switch (m_ioMode) { case SYS_TO_SYS: srcPattern = MFX_MEMTYPE_SYSTEM_MEMORY; dstPattern = MFX_MEMTYPE_SYSTEM_MEMORY; break; case SYS_TO_D3D: srcPattern = MFX_MEMTYPE_SYSTEM_MEMORY; dstPattern = MFX_MEMTYPE_DXVA2_DECODER_TARGET; break; case D3D_TO_SYS: srcPattern = MFX_MEMTYPE_DXVA2_DECODER_TARGET; dstPattern = MFX_MEMTYPE_SYSTEM_MEMORY; break; case D3D_TO_D3D: srcPattern = MFX_MEMTYPE_DXVA2_DECODER_TARGET; dstPattern = MFX_MEMTYPE_DXVA2_DECODER_TARGET; break; default: return MFX_ERR_UNDEFINED_BEHAVIOR; } if (m_pCore->IsExternalFrameAllocator()) { srcPattern |= MFX_MEMTYPE_EXTERNAL_FRAME; dstPattern |= MFX_MEMTYPE_EXTERNAL_FRAME; } else { srcPattern |= MFX_MEMTYPE_INTERNAL_FRAME; dstPattern |= MFX_MEMTYPE_INTERNAL_FRAME; } // point that this is passthru copy. srcPattern |= MFX_MEMTYPE_FROM_VPPIN; dstPattern |= MFX_MEMTYPE_FROM_VPPOUT; sts = m_pCore->DoFastCopyWrapper(pOutputSurface, dstPattern, pInputSurface, srcPattern); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::CopyPassThrough(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface) VideoVPPHW::VideoVPPHW(IOMode mode, VideoCORE *core) :m_asyncDepth(ACCEPTED_DEVICE_ASYNC_DEPTH) ,m_executeParams() ,m_executeSurf() ,m_pCore(core) ,m_guard() ,m_workloadMode(VPP_SYNC_WORKLOAD) ,m_IOPattern(0) ,m_ioMode(mode) ,m_isD3D9SimWithVideoMemIn(false) ,m_isD3D9SimWithVideoMemOut(false) ,m_taskMngr() ,m_scene_change(0) ,m_frame_num(0) ,m_critical_error(MFX_ERR_NONE) ,m_ddi(NULL) ,m_bMultiView(false) #ifdef MFX_ENABLE_EXT #ifdef MFX_ENABLE_MCTF ,m_MctfIsFlushing(false) ,m_bMctfAllocatedMemory(false) ,m_pMctfCmDevice(nullptr) #endif // cm devices ,m_pCmCopy(NULL) #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) ,m_SCD() #endif ,m_pCmDevice(NULL) ,m_pCmProgram(NULL) ,m_pCmKernel(NULL) ,m_pCmQueue(NULL) #endif { m_config.m_bRefFrameEnable = false; m_config.m_bMode30i60pEnable = false; m_config.m_bWeave = false; m_config.m_extConfig.mode = FRC_DISABLED; m_config.m_bCopyPassThroughEnable = false; m_config.m_surfCount[VPP_IN] = 1; m_config.m_surfCount[VPP_OUT] = 1; m_config.m_IOPattern = 0; m_config.m_multiBlt = false; m_config.m_bDisSkipQuery = false; m_config.m_bSupportLPLA = false; MemSetZero4mfxExecuteParams(&m_executeParams); memset(&m_params, 0, sizeof(mfxVideoParam)); #ifdef MFX_ENABLE_MCTF memset(&m_MctfMfxAlocResponse, 0, sizeof(m_MctfMfxAlocResponse)); m_bMctfAllocatedMemory = false; #endif } // VideoVPPHW::VideoVPPHW(IOMode mode, VideoCORE *core) VideoVPPHW::~VideoVPPHW() { Close(); } // VideoVPPHW::~VideoVPPHW() mfxStatus VideoVPPHW::GetVideoParams(mfxVideoParam *par) const { MFX_CHECK_NULL_PTR1(par); /* Step 1: Fill filters in use in DOUSE if specified. * This step is skipped since it's done on upper level already */ if( NULL == par->ExtParam || 0 == par->NumExtParam) { return MFX_ERR_NONE; } for( mfxU32 i = 0; i < par->NumExtParam; i++ ) { MFX_CHECK_NULL_PTR1(par->ExtParam[i]); mfxU32 bufferId = par->ExtParam[i]->BufferId; if(MFX_EXTBUFF_VPP_DEINTERLACING == bufferId) { mfxExtVPPDeinterlacing *bufDI = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufDI); bufDI->Mode = static_cast(m_executeParams.iDeinterlacingAlgorithm); } else if (MFX_EXTBUFF_VPP_DENOISE == bufferId) { mfxExtVPPDenoise *bufDN = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufDN); bufDN->DenoiseFactor = m_executeParams.denoiseFactorOriginal; } else if (MFX_EXTBUFF_VPP_DENOISE2 == bufferId) { mfxExtVPPDenoise2 *bufDN = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufDN); bufDN->Strength = m_executeParams.denoiseStrength; bufDN->Mode = m_executeParams.denoiseMode; } #ifdef MFX_ENABLE_MCTF else if (MFX_EXTBUFF_VPP_MCTF == bufferId) { mfxExtVppMctf *bufMCTF = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufMCTF); bufMCTF->FilterStrength = m_executeParams.MctfFilterStrength; } #endif else if (MFX_EXTBUFF_VPP_PROCAMP == bufferId) { mfxExtVPPProcAmp *bufPA = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufPA); bufPA->Brightness = m_executeParams.Brightness; bufPA->Contrast = m_executeParams.Contrast; bufPA->Hue = m_executeParams.Hue; bufPA->Saturation = m_executeParams.Saturation; } else if (MFX_EXTBUFF_VPP_DETAIL == bufferId) { mfxExtVPPDetail *bufDT = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufDT); bufDT->DetailFactor = m_executeParams.detailFactorOriginal; } else if (MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO == bufferId) { mfxExtVPPVideoSignalInfo *bufVSI = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufVSI); bufVSI->In.NominalRange = m_executeParams.VideoSignalInfoIn.NominalRange; bufVSI->In.TransferMatrix = m_executeParams.VideoSignalInfoIn.TransferMatrix; bufVSI->Out.NominalRange = m_executeParams.VideoSignalInfoOut.NominalRange; bufVSI->Out.TransferMatrix = m_executeParams.VideoSignalInfoOut.TransferMatrix; } else if (MFX_EXTBUFF_VPP_COMPOSITE == bufferId) { mfxExtVPPComposite *bufComp = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufComp); MFX_CHECK_NULL_PTR1(bufComp->InputStream); bufComp->NumInputStream = static_cast(m_executeParams.dstRects.size()); bufComp->NumTiles = static_cast(m_executeParams.iTilesNum4Comp); for (size_t k = 0; k < m_executeParams.dstRects.size(); k++) { MFX_CHECK_NULL_PTR1(bufComp->InputStream); bufComp->InputStream[k].DstX = m_executeParams.dstRects[k].DstX; bufComp->InputStream[k].DstY = m_executeParams.dstRects[k].DstY; bufComp->InputStream[k].DstW = m_executeParams.dstRects[k].DstW; bufComp->InputStream[k].DstH = m_executeParams.dstRects[k].DstH; bufComp->InputStream[k].TileId = (mfxU16)m_executeParams.dstRects[k].TileId; bufComp->InputStream[k].GlobalAlpha = m_executeParams.dstRects[k].GlobalAlpha; bufComp->InputStream[k].GlobalAlphaEnable = m_executeParams.dstRects[k].GlobalAlphaEnable; bufComp->InputStream[k].LumaKeyEnable = m_executeParams.dstRects[k].LumaKeyEnable; bufComp->InputStream[k].LumaKeyMax = m_executeParams.dstRects[k].LumaKeyMax; bufComp->InputStream[k].LumaKeyMin = m_executeParams.dstRects[k].LumaKeyMin; bufComp->InputStream[k].PixelAlphaEnable = m_executeParams.dstRects[k].PixelAlphaEnable; } bufComp->R = (m_executeParams.iBackgroundColor >> 32 ) & 0xFF; bufComp->G = (m_executeParams.iBackgroundColor >> 16 ) & 0xFF; bufComp->B = (m_executeParams.iBackgroundColor >> 0 ) & 0xFF; } else if (MFX_EXTBUFF_VPP_FIELD_PROCESSING == bufferId) { mfxExtVPPFieldProcessing *bufFP = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufFP); mfxU32 mode = m_executeParams.iFieldProcessingMode - 1; if (FRAME2FRAME == mode) { bufFP->Mode = MFX_VPP_COPY_FRAME; } else if (TFF2TFF == mode) { bufFP->Mode = MFX_VPP_COPY_FIELD; bufFP->InField = MFX_PICSTRUCT_FIELD_TFF; bufFP->OutField = MFX_PICSTRUCT_FIELD_TFF; } else if (TFF2BFF == mode) { bufFP->Mode = MFX_VPP_COPY_FIELD; bufFP->InField = MFX_PICSTRUCT_FIELD_TFF; bufFP->OutField = MFX_PICSTRUCT_FIELD_BFF; } else if (BFF2TFF == mode) { bufFP->Mode = MFX_VPP_COPY_FIELD; bufFP->InField = MFX_PICSTRUCT_FIELD_BFF; bufFP->OutField = MFX_PICSTRUCT_FIELD_TFF; } else if (BFF2BFF == mode) { bufFP->Mode = MFX_VPP_COPY_FIELD; bufFP->InField = MFX_PICSTRUCT_FIELD_BFF; bufFP->OutField = MFX_PICSTRUCT_FIELD_BFF; } } else if (MFX_EXTBUFF_VPP_ROTATION == bufferId) { mfxExtVPPRotation *bufRot = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufRot); bufRot->Angle = static_cast(m_executeParams.rotation); } else if (MFX_EXTBUFF_VPP_SCALING == bufferId) { mfxExtVPPScaling *bufSc = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufSc); bufSc->ScalingMode = m_executeParams.scalingMode; bufSc->InterpolationMethod = m_executeParams.interpolationMethod; } else if (MFX_EXTBUFF_VPP_3DLUT == bufferId) { mfxExtVPP3DLut *bufSc = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufSc); bufSc->ChannelMapping = m_executeParams.lut3DInfo.ChannelMapping; bufSc->BufferType = m_executeParams.lut3DInfo.BufferType; if (bufSc->BufferType == MFX_RESOURCE_VA_SURFACE) { bufSc->VideoBuffer.DataType = m_executeParams.lut3DInfo.DataType; bufSc->VideoBuffer.MemLayout = m_executeParams.lut3DInfo.MemLayout; bufSc->VideoBuffer.MemId = m_executeParams.lut3DInfo.MemId; } else if (bufSc->BufferType == MFX_RESOURCE_SYSTEM_SURFACE) { bufSc->SystemBuffer.Channel[0].Data = m_executeParams.lut3DInfo.Channel[0].Data; bufSc->SystemBuffer.Channel[0].DataType = m_executeParams.lut3DInfo.Channel[0].DataType; bufSc->SystemBuffer.Channel[0].Size = m_executeParams.lut3DInfo.Channel[0].Size; bufSc->SystemBuffer.Channel[1].Data = m_executeParams.lut3DInfo.Channel[1].Data; bufSc->SystemBuffer.Channel[1].DataType = m_executeParams.lut3DInfo.Channel[1].DataType; bufSc->SystemBuffer.Channel[1].Size = m_executeParams.lut3DInfo.Channel[1].Size; bufSc->SystemBuffer.Channel[2].Data = m_executeParams.lut3DInfo.Channel[2].Data; bufSc->SystemBuffer.Channel[2].DataType = m_executeParams.lut3DInfo.Channel[2].DataType; bufSc->SystemBuffer.Channel[2].Size = m_executeParams.lut3DInfo.Channel[2].Size; } } else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN == bufferId) { mfxExtVideoSignalInfo *bufSc = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufSc); bufSc->VideoFormat = m_executeParams.m_inVideoSignalInfo.VideoFormat; bufSc->VideoFullRange = m_executeParams.m_inVideoSignalInfo.VideoFullRange; bufSc->ColourDescriptionPresent = m_executeParams.m_inVideoSignalInfo.ColourDescriptionPresent; bufSc->ColourPrimaries = m_executeParams.m_inVideoSignalInfo.ColourPrimaries; bufSc->TransferCharacteristics = m_executeParams.m_inVideoSignalInfo.TransferCharacteristics; bufSc->MatrixCoefficients = m_executeParams.m_inVideoSignalInfo.MatrixCoefficients; } else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT == bufferId) { mfxExtVideoSignalInfo *bufSc = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufSc); bufSc->VideoFormat = m_executeParams.m_outVideoSignalInfo.VideoFormat; bufSc->VideoFullRange = m_executeParams.m_outVideoSignalInfo.VideoFullRange; bufSc->ColourDescriptionPresent = m_executeParams.m_outVideoSignalInfo.ColourDescriptionPresent; bufSc->ColourPrimaries = m_executeParams.m_outVideoSignalInfo.ColourPrimaries; bufSc->TransferCharacteristics = m_executeParams.m_outVideoSignalInfo.TransferCharacteristics; bufSc->MatrixCoefficients = m_executeParams.m_outVideoSignalInfo.MatrixCoefficients; } else if (MFX_EXTBUFF_VPP_COLOR_CONVERSION == bufferId) { mfxExtColorConversion *bufSc = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufSc); bufSc->ChromaSiting = m_executeParams.chromaSiting; } else if (MFX_EXTBUFF_VPP_MIRRORING == bufferId) { mfxExtVPPMirroring *bufMir = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufMir); bufMir->Type = static_cast(m_executeParams.mirroring); } else if (MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION == bufferId) { mfxExtVPPFrameRateConversion *bufFRC = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufFRC); bufFRC->Algorithm = m_executeParams.frcModeOrig; } else if (MFX_EXTBUFF_VPP_COLORFILL == bufferId) { mfxExtVPPColorFill *bufColorfill = reinterpret_cast(par->ExtParam[i]); MFX_CHECK_NULL_PTR1(bufColorfill); bufColorfill->Enable = static_cast(m_executeParams.iBackgroundColor?MFX_CODINGOPTION_ON:MFX_CODINGOPTION_OFF); } } return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::GetVideoParams(mfxVideoParam *par) const mfxStatus VideoVPPHW::Query(VideoCORE *core, mfxVideoParam *par) { MFX_CHECK_NULL_PTR2(par, core); mfxStatus sts = MFX_ERR_NONE; VPPHWResMng *vpp_ddi = 0; mfxVideoParam params = *par; Config config = {}; MfxHwVideoProcessing::mfxExecuteParams executeParams; sts = CheckIOMode(par, ALL); MFX_CHECK_STS(sts); sts = core->CreateVideoProcessing(¶ms); MFX_CHECK_STS(sts); core->GetVideoProcessing((mfxHDL*)&vpp_ddi); if (0 == vpp_ddi) { return MFX_WRN_PARTIAL_ACCELERATION; } mfxVppCaps caps; caps = vpp_ddi->GetCaps(); sts = ValidateParams(¶ms, &caps, core, true); MFX_CHECK_STS(sts); config.m_IOPattern = 0; sts = ConfigureExecuteParams(params, caps, executeParams, config); if (MFX_WRN_FILTER_SKIPPED == sts) { sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); return sts; } mfxStatus VideoVPPHW::QueryImplsDescription(VideoCORE* core, mfxVPPDescription& caps, mfx::PODArraysHolder& arrayHolder) { MfxHwVideoProcessing::mfxVppCaps vppCaps; QueryCaps(core, vppCaps); std::vector capsList; ConvertCaps2ListDoUse(vppCaps, capsList); for(auto &filterId : capsList) { mfxVPPDescription::filter filter = { }; filter.FilterFourCC = filterId; auto& memCaps = arrayHolder.PushBack(filter.MemDesc); memCaps.MemHandleType = MFX_RESOURCE_SYSTEM_SURFACE; memCaps.Width = {vppCaps.uMinWidth, vppCaps.uMaxWidth, 1}; memCaps.Height = {vppCaps.uMinHeight, vppCaps.uMaxHeight, 1}; for (auto fourcc : g_TABLE_SUPPORTED_FOURCC) { mfxU32 inputFormat = 0; CheckFormatLimitation(filterId, fourcc, inputFormat); if (inputFormat & MFX_FORMAT_SUPPORT_INPUT) { auto& formatIn = arrayHolder.PushBack(memCaps.Formats); formatIn.InFormat = fourcc; for (auto fourccOut : g_TABLE_SUPPORTED_FOURCC) { mfxU32 outputFormat = 0; CheckFormatLimitation(filterId, fourccOut, outputFormat); if (outputFormat & MFX_FORMAT_SUPPORT_OUTPUT) { arrayHolder.PushBack(formatIn.OutFormats) = fourccOut; ++formatIn.NumOutFormat; } } ++memCaps.NumInFormats; } } arrayHolder.PushBack(filter.MemDesc); filter.MemDesc[1] = filter.MemDesc[0]; filter.MemDesc[1].MemHandleType = core->GetVAType() == MFX_HW_VAAPI ? MFX_RESOURCE_VA_SURFACE : MFX_RESOURCE_DX11_TEXTURE; filter.NumMemTypes = 2; arrayHolder.PushBack(caps.Filters) = filter; caps.NumFilters++; } return MFX_ERR_NONE; } mfxStatus VideoVPPHW::CheckFormatLimitation(mfxU32 filter, mfxU32 format, mfxU32& formatSupport) { switch(filter) { case MFX_EXTBUFF_VPP_SCALING: case MFX_EXTBUFF_VPP_MIRRORING: case MFX_EXTBUFF_VPP_ROTATION: case MFX_EXTBUFF_VPP_COMPOSITE: case MFX_EXTBUFF_VPP_COLORFILL: case MFX_EXTBUFF_VPP_COLOR_CONVERSION: case MFX_EXTBUFF_VPP_3DLUT: if (format == MFX_FOURCC_NV12 || format == MFX_FOURCC_P010 || format == MFX_FOURCC_P016 || format == MFX_FOURCC_YUY2 || format == MFX_FOURCC_Y210 || format == MFX_FOURCC_Y216 || format == MFX_FOURCC_Y410 || format == MFX_FOURCC_Y416 || format == MFX_FOURCC_AYUV || format == MFX_FOURCC_RGB565 || format == MFX_FOURCC_RGB4 || format == MFX_FOURCC_BGR4) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } if (format == MFX_FOURCC_A2RGB10 || format == MFX_FOURCC_RGBP || format == MFX_FOURCC_BGRP) { formatSupport = MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUFF_VPP_PROCAMP: case MFX_EXTBUFF_VPP_DETAIL: case MFX_EXTBUFF_VPP_DENOISE: case MFX_EXTBUFF_VPP_DENOISE2: case MFX_EXTBUFF_VPP_FIELD_WEAVING: case MFX_EXTBUFF_VPP_FIELD_SPLITTING: case MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN: case MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT: if (format == MFX_FOURCC_NV12 || format == MFX_FOURCC_P010 || format == MFX_FOURCC_P016 || format == MFX_FOURCC_YUY2 || format == MFX_FOURCC_Y210 || format == MFX_FOURCC_Y216 || format == MFX_FOURCC_Y410 || format == MFX_FOURCC_Y416 || format == MFX_FOURCC_AYUV) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUFF_VPP_DEINTERLACING: if (format == MFX_FOURCC_NV12 || format == MFX_FOURCC_P010 || format == MFX_FOURCC_P016 || format == MFX_FOURCC_YUY2) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: if (format == MFX_FOURCC_NV12 || format == MFX_FOURCC_P010 || format == MFX_FOURCC_YUY2 || format == MFX_FOURCC_Y210 || format == MFX_FOURCC_Y410 || format == MFX_FOURCC_AYUV) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUFF_VPP_FIELD_PROCESSING: case MFX_EXTBUFF_VPP_MCTF: if(format == MFX_FOURCC_NV12) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUF_CAM_3DLUT: if (format == MFX_FOURCC_R16_BGGR || format == MFX_FOURCC_R16_RGGB || format == MFX_FOURCC_R16_GRBG || format == MFX_FOURCC_R16_GBRG || format == MFX_FOURCC_R16) { formatSupport = MFX_FORMAT_SUPPORT_INPUT; } if (format == MFX_FOURCC_NV12 || format == MFX_FOURCC_RGB4) { formatSupport = MFX_FORMAT_SUPPORT_OUTPUT; } if (format == MFX_FOURCC_ARGB16) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; case MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION: case MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION: case MFX_EXTBUF_CAM_WHITE_BALANCE: case MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION: case MFX_EXTBUF_CAM_BAYER_DENOISE: case MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL: case MFX_EXTBUF_CAM_VIGNETTE_CORRECTION: case MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3: case MFX_EXTBUF_CAM_PADDING: case MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL: case MFX_EXTBUF_CAM_CSC_YUV_RGB: if (format == MFX_FOURCC_R16_BGGR || format == MFX_FOURCC_R16_RGGB || format == MFX_FOURCC_R16_GRBG || format == MFX_FOURCC_R16_GBRG || format == MFX_FOURCC_R16) { formatSupport = MFX_FORMAT_SUPPORT_INPUT; } if (format == MFX_FOURCC_ARGB16 || format == MFX_FOURCC_RGB4) { formatSupport = MFX_FORMAT_SUPPORT_OUTPUT; } break; #if defined (ONEVPL_EXPERIMENTAL) case MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER: if (format == MFX_FOURCC_NV12) { formatSupport = MFX_FORMAT_SUPPORT_INPUT | MFX_FORMAT_SUPPORT_OUTPUT; } break; #endif default: break; } return MFX_ERR_NONE; } mfxStatus VideoVPPHW::Init( mfxVideoParam *par, bool /*isTemporal*/) { mfxStatus sts = MFX_ERR_NONE; bool bIsFilterSkipped = false; m_frame_num = 0; m_critical_error = MFX_ERR_NONE; //----------------------------------------------------- // [1] high level check //----------------------------------------------------- MFX_CHECK_NULL_PTR1(par); sts = CheckIOMode(par, m_ioMode); MFX_CHECK_STS(sts); m_IOPattern = par->IOPattern; if(0 == par->AsyncDepth) { m_asyncDepth = MFX_AUTO_ASYNC_DEPTH_VALUE; } else if( par->AsyncDepth > MFX_MAX_ASYNC_DEPTH_VALUE ) { m_asyncDepth = MFX_MAX_ASYNC_DEPTH_VALUE; } else { m_asyncDepth = par->AsyncDepth; } //----------------------------------------------------- // [2] device creation //----------------------------------------------------- m_params = *par; mfxExtBuffer* pHint = NULL; GetFilterParam(par, MFX_EXTBUFF_MVC_SEQ_DESC, &pHint); if( pHint ) { /* Multi-view processing needs separate devices for each view. Using one device is not possible since * backward/forward references from different views will be messed up. Thus each VPPHW instance needs to * create its own device. Core is not able to handle this like it does for single view case. */ try { m_ddi = new VPPHWResMng(); } catch(std::bad_alloc&) { return MFX_WRN_PARTIAL_ACCELERATION; } sts = m_ddi->CreateDevice(m_pCore); MFX_CHECK_STS(sts); m_bMultiView = true; } else { sts = m_pCore->CreateVideoProcessing(&m_params); MFX_CHECK_STS(sts); m_pCore->GetVideoProcessing((mfxHDL*)&m_ddi); if (0 == m_ddi) { return MFX_WRN_PARTIAL_ACCELERATION; } } mfxVppCaps caps; caps = m_ddi->GetCaps(); sts = ValidateParams(&m_params, &caps, m_pCore); if( MFX_ERR_UNSUPPORTED == sts ) { sts = MFX_ERR_INVALID_VIDEO_PARAM; } if( MFX_WRN_FILTER_SKIPPED == sts ) { bIsFilterSkipped = true; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); for (mfxU32 i = 0; i < m_params.NumExtParam; i++) { if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_3DLUT) { mfxExtCam3DLut *ext3DLut = (mfxExtCam3DLut*)m_params.ExtParam[i]; m_executeParams.Camera3DLUT.Header.BufferId = ext3DLut->Header.BufferId; m_executeParams.Camera3DLUT.Size = ext3DLut->Size; m_executeParams.Camera3DLUT.Table = ext3DLut->Table; m_executeParams.bCamera3DLUT = TRUE; } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION) { mfxExtCamFwdGamma *extFGC = (mfxExtCamFwdGamma*)m_params.ExtParam[i]; m_executeParams.CameraForwardGammaCorrection.Header.BufferId = extFGC->Header.BufferId; m_executeParams.CameraForwardGammaCorrection.NumSegments = extFGC->NumSegments; m_executeParams.CameraForwardGammaCorrection.Segment = extFGC->Segment; m_executeParams.bCameraGammaCorrection = TRUE; } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_PIPECONTROL) { mfxExtCamPipeControl *extCPC = (mfxExtCamPipeControl*)m_params.ExtParam[i]; m_executeParams.CameraPipeControl.Header.BufferId = extCPC->Header.BufferId; m_executeParams.CameraPipeControl.RawFormat = extCPC->RawFormat; m_executeParams.bCameraPipeEnabled = TRUE; m_executeParams.bCameraPipeControl = TRUE; } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_WHITE_BALANCE) { //m_Caps.bWhiteBalance = 1; mfxExtCamWhiteBalance* whiteBalanceExtBufParams = (mfxExtCamWhiteBalance*)par->ExtParam[i]; if ( whiteBalanceExtBufParams ) { m_executeParams.bCameraWhiteBalaceCorrection = TRUE; m_executeParams.CameraWhiteBalance.Header.BufferId = whiteBalanceExtBufParams->Header.BufferId; m_executeParams.CameraWhiteBalance.Mode = whiteBalanceExtBufParams->Mode; m_executeParams.CameraWhiteBalance.B = whiteBalanceExtBufParams->B; m_executeParams.CameraWhiteBalance.G0 = whiteBalanceExtBufParams->G0; m_executeParams.CameraWhiteBalance.G1 = whiteBalanceExtBufParams->G1; m_executeParams.CameraWhiteBalance.R = whiteBalanceExtBufParams->R; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION) { mfxExtCamBlackLevelCorrection* blackLevelExtBufParams = (mfxExtCamBlackLevelCorrection*)par->ExtParam[i]; if ( blackLevelExtBufParams ) { m_executeParams.bCameraBlackLevelCorrection = true; m_executeParams.CameraBlackLevel.Header.BufferId = blackLevelExtBufParams->Header.BufferId; m_executeParams.CameraBlackLevel.B = blackLevelExtBufParams->B; m_executeParams.CameraBlackLevel.G0 = blackLevelExtBufParams->G0; m_executeParams.CameraBlackLevel.G1 = blackLevelExtBufParams->G1; m_executeParams.CameraBlackLevel.R = blackLevelExtBufParams->R; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_BAYER_DENOISE) { mfxExtCamBayerDenoise* denoiseExtBufParams = (mfxExtCamBayerDenoise*)par->ExtParam[i]; if (denoiseExtBufParams) { m_executeParams.bCameraBayerDenoise = TRUE; m_executeParams.CameraBayerDenoise.Header.BufferId = denoiseExtBufParams->Header.BufferId; m_executeParams.CameraBayerDenoise.Threshold = denoiseExtBufParams->Threshold; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL) { mfxExtCamHotPixelRemoval* hotpixelExtBufParams = (mfxExtCamHotPixelRemoval*)par->ExtParam[i]; if (hotpixelExtBufParams) { m_executeParams.bCameraHotPixelRemoval = TRUE; m_executeParams.CameraHotPixel.Header.BufferId = hotpixelExtBufParams->Header.BufferId; m_executeParams.CameraHotPixel.PixelCountThreshold = hotpixelExtBufParams->PixelCountThreshold; m_executeParams.CameraHotPixel.PixelThresholdDifference = hotpixelExtBufParams->PixelThresholdDifference; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_VIGNETTE_CORRECTION) { mfxExtCamVignetteCorrection* VignetteExtBufParams = (mfxExtCamVignetteCorrection*)par->ExtParam[i]; if ( VignetteExtBufParams ) { m_executeParams.bCameraVignetteCorrection = TRUE; m_executeParams.CameraVignetteCorrection.Height = VignetteExtBufParams->Height; m_executeParams.CameraVignetteCorrection.Width = VignetteExtBufParams->Width; m_executeParams.CameraVignetteCorrection.Pitch = VignetteExtBufParams->Pitch; m_executeParams.CameraVignetteCorrection.Header.BufferId = VignetteExtBufParams->Header.BufferId; m_executeParams.CameraVignetteCorrection.CorrectionMap = VignetteExtBufParams->CorrectionMap; /*if ( m_VignetteParams.pCmCorrectionMap ) delete [] m_VignetteParams.pCmCorrectionMap; m_VignetteParams.pCmCorrectionMap = (CameraPipeVignetteCorrectionElem *)new mfxU8[m_VignetteParams.Height * m_VignetteParams.CmStride]; MFX_CHECK_NULL_PTR1(m_VignetteParams.pCorrectionMap); MFX_CHECK_NULL_PTR1(m_VignetteParams.pCmCorrectionMap) IppiSize size = {2, m_VignetteParams.CmWidth*m_VignetteParams.Height / 2 }; IppStatus ippSts; ippSts = ippiCopy_8u_C1R((mfxU8*)m_VignetteParams.pCorrectionMap, 8, (mfxU8*)m_VignetteParams.pCmCorrectionMap, 2, size); MFX_CHECK_STS((mfxStatus)ippSts);*/ } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3) { mfxExtCamColorCorrection3x3* CCMExtBufParams = (mfxExtCamColorCorrection3x3*)par->ExtParam[i]; if ( CCMExtBufParams ) { m_executeParams.CCMParams.Header.BufferId = CCMExtBufParams->Header.BufferId; m_executeParams.bCCM = TRUE; m_executeParams.CCMParams.CCM[0][0] = CCMExtBufParams->CCM[0][0]; m_executeParams.CCMParams.CCM[0][1] = CCMExtBufParams->CCM[0][1]; m_executeParams.CCMParams.CCM[0][2] = CCMExtBufParams->CCM[0][2]; m_executeParams.CCMParams.CCM[1][0] = CCMExtBufParams->CCM[1][0]; m_executeParams.CCMParams.CCM[1][1] = CCMExtBufParams->CCM[1][1]; m_executeParams.CCMParams.CCM[1][2] = CCMExtBufParams->CCM[1][2]; m_executeParams.CCMParams.CCM[2][0] = CCMExtBufParams->CCM[2][0]; m_executeParams.CCMParams.CCM[2][1] = CCMExtBufParams->CCM[2][1]; m_executeParams.CCMParams.CCM[2][2] = CCMExtBufParams->CCM[2][2]; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_PADDING) { // Need Refine the padding offsets mfxExtCamPadding* PaddingParams = (mfxExtCamPadding*)par->ExtParam[i]; if (PaddingParams) { m_executeParams.bCameraPadding = TRUE; m_executeParams.CameraPadding.Header.BufferId = PaddingParams->Header.BufferId; m_executeParams.CameraPadding.Top = PaddingParams->Top; m_executeParams.CameraPadding.Bottom = PaddingParams->Bottom; m_executeParams.CameraPadding.Left = PaddingParams->Left; m_executeParams.CameraPadding.Right = PaddingParams->Right; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION) { mfxExtCamLensGeomDistCorrection* LensExtBufParams = (mfxExtCamLensGeomDistCorrection*)par->ExtParam[i]; if ( LensExtBufParams ) { m_executeParams.bCameraLensCorrection = true; m_executeParams.CameraLensCorrection.Header.BufferId = LensExtBufParams->Header.BufferId; m_executeParams.CameraLensCorrection.a[0] = LensExtBufParams->a[0]; m_executeParams.CameraLensCorrection.a[1] = LensExtBufParams->a[1]; m_executeParams.CameraLensCorrection.a[2] = LensExtBufParams->a[2]; m_executeParams.CameraLensCorrection.b[0] = LensExtBufParams->b[0]; m_executeParams.CameraLensCorrection.b[1] = LensExtBufParams->b[1]; m_executeParams.CameraLensCorrection.b[2] = LensExtBufParams->b[2]; m_executeParams.CameraLensCorrection.c[0] = LensExtBufParams->c[0]; m_executeParams.CameraLensCorrection.c[1] = LensExtBufParams->c[1]; m_executeParams.CameraLensCorrection.c[2] = LensExtBufParams->c[2]; m_executeParams.CameraLensCorrection.d[0] = LensExtBufParams->d[0]; m_executeParams.CameraLensCorrection.d[1] = LensExtBufParams->d[1]; m_executeParams.CameraLensCorrection.d[2] = LensExtBufParams->d[2]; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL) { mfxExtCamTotalColorControl* tccExtBufParams = (mfxExtCamTotalColorControl*)par->ExtParam[i]; if (tccExtBufParams) { m_executeParams.bCameraTCC = TRUE; m_executeParams.CameraTCC.Header.BufferId = tccExtBufParams->Header.BufferId; m_executeParams.CameraTCC.R = tccExtBufParams->R; m_executeParams.CameraTCC.G = tccExtBufParams->G; m_executeParams.CameraTCC.B = tccExtBufParams->B; m_executeParams.CameraTCC.C = tccExtBufParams->C; m_executeParams.CameraTCC.M = tccExtBufParams->M; m_executeParams.CameraTCC.Y = tccExtBufParams->Y; } } else if (m_params.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_CSC_YUV_RGB) { mfxExtCamCscYuvRgb* rgbToYuvExtBufParams = (mfxExtCamCscYuvRgb*)par->ExtParam[i]; if (rgbToYuvExtBufParams) { m_executeParams.bCameraRGBtoYUV = TRUE; m_executeParams.CameraRGBToYUV.Header.BufferId = rgbToYuvExtBufParams->Header.BufferId; for (int k = 0; k < 3; k++) { m_executeParams.CameraRGBToYUV.PreOffset[k] = rgbToYuvExtBufParams->PreOffset[k]; m_executeParams.CameraRGBToYUV.PostOffset[k] = rgbToYuvExtBufParams->PostOffset[k]; } for (int k = 0; k < 3; k++) { for (int m = 0; m < 3; m++) { m_executeParams.CameraRGBToYUV.Matrix[k][m] = rgbToYuvExtBufParams->Matrix[k][m]; } } } } } m_config.m_IOPattern = 0; sts = ConfigureExecuteParams( m_params, caps, m_executeParams, m_config); if( MFX_WRN_FILTER_SKIPPED == sts ) { bIsFilterSkipped = true; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); if( m_executeParams.bFRCEnable && (MFX_HW_D3D11 == m_pCore->GetVAType()) && m_executeParams.customRateData.indexRateConversion != 0 ) { sts = (*m_ddi)->ReconfigDevice(m_executeParams.customRateData.indexRateConversion); MFX_CHECK_STS(sts); } // allocate special structure for ::ExecuteBlt() { m_executeSurf.resize( m_config.m_surfCount[VPP_IN] ); } // count of internal resources based on async_depth m_config.m_surfCount[VPP_OUT] = (mfxU16)(m_config.m_surfCount[VPP_OUT] * m_asyncDepth + 1); m_config.m_surfCount[VPP_IN] = (mfxU16)(m_config.m_surfCount[VPP_IN] * m_asyncDepth + 1); //----------------------------------------------------- // [3] internal frames allocation in case of SW memory requested as input or output //----------------------------------------------------- mfxFrameAllocRequest request; m_isD3D9SimWithVideoMemOut = IsD3D9Simulation(*m_pCore) && (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (D3D_TO_SYS == m_ioMode || SYS_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemOut) // [OUT == SYSTEM_MEMORY] { request.Info = par->vpp.Out; request.Type = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = m_config.m_surfCount[VPP_OUT] ; sts = m_internalVidSurf[VPP_OUT].Alloc(m_pCore, request, par->vpp.Out.FourCC != MFX_FOURCC_YV12); MFX_CHECK(MFX_ERR_NONE == sts, MFX_WRN_PARTIAL_ACCELERATION); m_config.m_IOPattern |= m_isD3D9SimWithVideoMemOut ? MFX_IOPATTERN_OUT_VIDEO_MEMORY : MFX_IOPATTERN_OUT_SYSTEM_MEMORY; m_config.m_surfCount[VPP_OUT] = request.NumFrameMin; } m_isD3D9SimWithVideoMemIn = IsD3D9Simulation(*m_pCore) && (par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); if (SYS_TO_SYS == m_ioMode || SYS_TO_D3D == m_ioMode || m_isD3D9SimWithVideoMemIn) // [IN == SYSTEM_MEMORY] { request.Info = par->vpp.In; request.Type = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = m_config.m_surfCount[VPP_IN] ; sts = m_internalVidSurf[VPP_IN].Alloc(m_pCore, request, par->vpp.In.FourCC != MFX_FOURCC_YV12); MFX_CHECK(MFX_ERR_NONE == sts, MFX_WRN_PARTIAL_ACCELERATION); m_config.m_IOPattern |= m_isD3D9SimWithVideoMemIn ? MFX_IOPATTERN_IN_VIDEO_MEMORY : MFX_IOPATTERN_IN_SYSTEM_MEMORY; m_config.m_surfCount[VPP_IN] = request.NumFrameMin; } // async workload mode by default m_workloadMode = VPP_ASYNC_WORKLOAD; //----------------------------------------------------- // [4] resource and task manager //----------------------------------------------------- sts = m_taskMngr.Init(m_pCore, m_config); MFX_CHECK_STS(sts); //----------------------------------------------------- // [5] cm device //----------------------------------------------------- #ifdef MFX_ENABLE_KERNELS MFX_SAFE_CALL(InitVppCm(m_pCmDevice, m_pCmProgram, m_pCmKernel, m_pCmQueue, m_pCore)); #endif #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) if (MFX_DEINTERLACING_ADVANCED_SCD == m_executeParams.iDeinterlacingAlgorithm) { CmDevice* pCmDevice = QueryCoreInterface(m_pCore, MFXICORECM_GUID); sts = m_SCD.Init(par->vpp.In.CropW, par->vpp.In.CropH, par->vpp.In.Width, par->vpp.In.PicStruct, pCmDevice, CommonCaps::IsCmSupported(m_pCore->GetHWType())); MFX_CHECK_STS(sts); m_SCD.SetGoPSize(ns_asc::Immediate_GoP); } #endif #ifdef MFX_ENABLE_EXT /* Starting from TGL, there is support for HW mirroring, but only with d3d11. On platforms prior to TGL we use driver kernel for Linux with d3d_to_d3d and msdk kernel for other cases*/ bool msdkMirrorIsUsed = m_pCore->GetVAType() == MFX_HW_D3D9; if (m_executeParams.mirroring && msdkMirrorIsUsed && !m_pCmCopy) { m_pCmCopy = QueryCoreInterface(m_pCore, MFXICORECMCOPYWRAPPER_GUID); if ( m_pCmCopy ) { sts = m_pCmCopy->Initialize(m_pCore->GetHWDeviceId(), m_pCore->GetHWType()); MFX_CHECK_STS(sts); } else { return MFX_ERR_DEVICE_FAILED; } } #endif #ifdef MFX_ENABLE_MCTF { if (m_executeParams.bEnableMctf) { m_pMctfCmDevice = m_pCmDevice; if (!m_pMctfCmDevice) { m_pMctfCmDevice = QueryCoreInterface(m_pCore, MFXICORECM_GUID); MFX_CHECK(m_pMctfCmDevice, MFX_ERR_UNDEFINED_BEHAVIOR); } // create "Default" MCTF settings. IntMctfParams MctfConfig; CMC::QueryDefaultParams(&MctfConfig); // create default MCTF control mfxExtVppMctf MctfAPIDefault; CMC::QueryDefaultParams(&MctfAPIDefault); // control possibly passed mfxExtVppMctf* MctfAPIControl = NULL; GetFilterParam(par, MFX_EXTBUFF_VPP_MCTF, reinterpret_cast(&MctfAPIControl)); if (m_pMCTFilter) { m_pMCTFilter->MCTF_CLOSE(); m_pMCTFilter.reset(); } MctfAPIControl = MctfAPIControl ? MctfAPIControl : &MctfAPIDefault; CMC::FillParamControl(&MctfConfig, MctfAPIControl); m_pMCTFilter = std::make_shared(); if (m_pMCTFilter) sts = InitMCTF(par->vpp.Out, MctfConfig); MFX_CHECK_STS(sts); } } #endif #if defined (ONEVPL_EXPERIMENTAL) if (m_executeParams.bEnablePercEncFilter){ m_PercEncFilter = std::make_unique(m_pCore, *par); m_PercEncFilter->Init(&par->vpp.In, &par->vpp.Out); } #endif return (bIsFilterSkipped) ? MFX_WRN_FILTER_SKIPPED : MFX_ERR_NONE; } // mfxStatus VideoVPPHW::Init(mfxVideoParam *par, mfxU32 *tabUsedFiltersID, mfxU32 numOfFilters) #ifdef MFX_ENABLE_MCTF mfxStatus VideoVPPHW::InitMCTF(const mfxFrameInfo& info, const IntMctfParams& MctfConfig) { mfxStatus sts = MFX_ERR_NONE; if (m_pMCTFilter) { sts = m_pMCTFilter->MCTF_INIT(m_pCore, m_pMctfCmDevice, info, &MctfConfig); MFX_CHECK_STS(sts); mfxU32 MctfQueueDepth = m_pMCTFilter->MCTF_GetQueueDepth(); // now allocation of buffers & passing it into MCTF mfxFrameAllocRequest request; memset(&request, 0, sizeof(request)); request.Info = info; request.Info.FourCC = MFX_FOURCC_NV12; request.Type = MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET; request.Type |= MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = (mfxU16)MctfQueueDepth; if (0 == request.NumFrameMin) return MFX_ERR_INVALID_VIDEO_PARAM; // create a pool of surfaces & map pointers to a pool of pointers m_pMCTFSurfacePool.resize(MctfQueueDepth); m_MCTFSurfacePool.resize(MctfQueueDepth); for (size_t idx = 0; idx < MctfQueueDepth; ++idx) { m_pMCTFSurfacePool[idx] = &(m_MCTFSurfacePool[idx]); memset(m_pMCTFSurfacePool[idx], 0, sizeof(mfxFrameSurface1)); } if (m_bMctfAllocatedMemory) { MFX_SAFE_CALL(m_pCore->FreeFrames(&m_MctfMfxAlocResponse)); m_bMctfAllocatedMemory = false; } memset(&m_MctfMfxAlocResponse, 0, sizeof(m_MctfMfxAlocResponse)); // alloc & binds memory for mids m_MctfMids.resize(MctfQueueDepth); m_MctfMfxAlocResponse.mids = &(m_MctfMids[0]); if (D3D_TO_SYS == m_ioMode || SYS_TO_SYS == m_ioMode) // [OUT == SYSTEM_MEMORY] sts = m_pCore->AllocFrames(&request, &m_MctfMfxAlocResponse, false); else sts = m_pCore->AllocFrames(&request, &m_MctfMfxAlocResponse, false); if (m_MctfMfxAlocResponse.NumFrameActual != request.NumFrameMin) sts = MFX_ERR_MEMORY_ALLOC; MFX_CHECK(MFX_ERR_NONE == sts, MFX_ERR_MEMORY_ALLOC); m_bMctfAllocatedMemory = true; // clear & bind video-surfaces to mfxFrameSurface1 structures mfxMemId* pmids = m_MctfMfxAlocResponse.mids; for (auto it = m_pMCTFSurfacePool.begin(); it != m_pMCTFSurfacePool.end(); ++it) { (*it)->Info = request.Info; (*it)->Info.FourCC = MFX_FOURCC_NV12; (*it)->Data.MemType = request.Type; (*it)->Data.MemId = *pmids++; // set to extreamly high value to identify possible incorrectness // with settings (*it)->Data.FrameOrder = 0xFFFFFFFF; (*it)->Data.TimeStamp = 0xFFFFFFFF; } // Set memory, including internal buffers // copy surfaces from m_pMCTFSurfacePool to QfIn in MCTF: m_pMCTFilter->MCTF_SetMemory(m_pMCTFSurfacePool); m_MctfIsFlushing = false; m_taskMngr.SetMctf(m_pMCTFilter); m_MCTFtableCmRelations2.clear(); m_MCTFtableCmIndex2.clear(); return MFX_ERR_NONE; } else return MFX_ERR_UNDEFINED_BEHAVIOR; } mfxStatus VideoVPPHW::GetFrameHandle(mfxFrameSurface1* InFrame, mfxHDLPair& handle, bool bInternalAlloc) { return GetFrameHandle(*InFrame, handle, bInternalAlloc); } mfxStatus VideoVPPHW::GetFrameHandle(mfxFrameSurface1& surf, mfxHDLPair& handle, bool bInternalAlloc) { handle.first = handle.second = nullptr; if ((IOMode::D3D_TO_D3D == m_ioMode || IOMode::SYS_TO_D3D == m_ioMode) && !bInternalAlloc && !m_isD3D9SimWithVideoMemOut) { //MFX_SAFE_CALL(m_pCore->GetFrameHDL(surf, handle)); MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(surf, handle, false)); } else { // in case of system memory, for the purposes of minimization of copy ops, // internal d3d surface is passed to; thus we can extract handle directly from MemId // see VideoVPPHW::PostWorkOutSurfaceCopy for further details & examples MFX_SAFE_CALL(m_pCore->GetFrameHDL(surf, handle)); //MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(surf, handle, false)); } return MFX_ERR_NONE; } // GetFrameHandle(... mfxStatus VideoVPPHW::ClearCmSurfaces2D() { //destroy CmSurfaces2D if (m_pMctfCmDevice) { for (decltype(m_MCTFtableCmRelations2)::iterator item = m_MCTFtableCmRelations2.begin(); item != m_MCTFtableCmRelations2.end(); ++item) m_pMctfCmDevice->DestroySurface(item->second); } m_MCTFtableCmRelations2.clear(); m_MCTFtableCmIndex2.clear(); return MFX_ERR_NONE; } // ClearCmSurfaces2D(... mfxStatus VideoVPPHW::CreateCmSurface2D(void *pSrcHDL, CmSurface2D* & pCmSurface2D, SurfaceIndex* &pCmSrcIndex) { INT cmSts = 0; std::map::iterator it; std::map::iterator it_idx; mfxHDLPair SrcPair = static_cast(*(mfxHDLPair *)pSrcHDL); if (!m_pMctfCmDevice) return MFX_ERR_NOT_INITIALIZED; it = m_MCTFtableCmRelations2.find(SrcPair); if (m_MCTFtableCmRelations2.end() == it) { //UMC::AutomaticUMCMutex guard(m_guard); { cmSts = m_pMctfCmDevice->CreateSurface2D(SrcPair, pCmSurface2D); MFX_CHECK((CM_SUCCESS == cmSts), MFX_ERR_DEVICE_FAILED); m_MCTFtableCmRelations2.insert(std::pair(SrcPair, pCmSurface2D)); } cmSts = pCmSurface2D->GetIndex(pCmSrcIndex); MFX_CHECK((CM_SUCCESS == cmSts), MFX_ERR_DEVICE_FAILED); m_MCTFtableCmIndex2.insert(std::pair(pCmSurface2D, pCmSrcIndex)); } else { pCmSurface2D = it->second; it_idx = m_MCTFtableCmIndex2.find(pCmSurface2D); if (it_idx == m_MCTFtableCmIndex2.end()) return MFX_ERR_UNDEFINED_BEHAVIOR; else pCmSrcIndex = it_idx->second; } return MFX_ERR_NONE; } // CreateCmSurface2D(... #endif mfxStatus VideoVPPHW::QueryCaps(VideoCORE* core, MfxHwVideoProcessing::mfxVppCaps& caps) { MFX_CHECK_NULL_PTR1(core); VPPHWResMng* ddi = 0; mfxStatus sts = MFX_ERR_NONE; mfxVideoParam tmpPar = {}; sts = core->CreateVideoProcessing(&tmpPar); MFX_CHECK_STS( sts ); core->GetVideoProcessing((mfxHDL*)&ddi); if (0 == ddi) { return MFX_WRN_PARTIAL_ACCELERATION; } caps = ddi->GetCaps(); eMFXHWType hwType = core->GetHWType(); #ifdef MFX_ENABLE_MCTF caps.uMCTF = VppCaps::IsMctfSupported(hwType) ? 1 : 0; #endif caps.uVideoSignalInfoInOut = VppCaps::IsVideoSignalSupported(hwType) ? 1 : 0; caps.uFrameRateConversion = 1; caps.uFieldProcessing = VppCaps::IsFieldProcessingSupported(hwType) ? 1 :0; return sts; } // mfxStatus VideoVPPHW::QueryCaps(VideoCORE* core, MfxHwVideoProcessing::mfxVppCaps& caps) mfxStatus VideoVPPHW::QueryIOSurf( IOMode ioMode, VideoCORE* core, mfxVideoParam* par, mfxFrameAllocRequest* request) { mfxStatus sts = MFX_ERR_NONE; VPPHWResMng *vpp_ddi; MFX_CHECK_NULL_PTR1(par); sts = CheckIOMode(par, ioMode); MFX_CHECK_STS(sts); mfxVideoParam tmpPar = {}; sts = core->CreateVideoProcessing(&tmpPar); MFX_CHECK_STS(sts); core->GetVideoProcessing((mfxHDL*)&vpp_ddi); if (0 == vpp_ddi) { return MFX_WRN_PARTIAL_ACCELERATION; } mfxVppCaps caps; caps = vpp_ddi->GetCaps(); sts = ValidateParams(par, &caps, core); if( MFX_WRN_FILTER_SKIPPED == sts || MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts) { sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); mfxExecuteParams executeParams; MemSetZero4mfxExecuteParams(&executeParams); Config config = {}; sts = ConfigureExecuteParams( *par, caps, executeParams, config); if (MFX_WRN_FILTER_SKIPPED == sts ) { sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); request[VPP_IN].NumFrameMin = request[VPP_IN].NumFrameSuggested = config.m_surfCount[VPP_IN]; request[VPP_OUT].NumFrameMin = request[VPP_OUT].NumFrameSuggested = config.m_surfCount[VPP_OUT]; return sts; } // mfxStatus VideoVPPHW::QueryIOSurf(mfxVideoParam *par, mfxU32 *tabUsedFiltersID, mfxU32 numOfFilters) mfxStatus VideoVPPHW::Reset(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1(par); /* This is question: Should we free resource here or not?... */ /* For Dynamic composition we should not to do it !!! */ if (false == m_executeParams.bComposite) { m_taskMngr.Close();// all resource free here } /* Application should close the SDK component and then reinitialize it in case of the parameters change described below */ if (m_params.vpp.In.PicStruct != par->vpp.In.PicStruct || m_params.vpp.Out.PicStruct != par->vpp.Out.PicStruct) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; const mfxF64 inFrameRateCur = (mfxF64) par->vpp.In.FrameRateExtN / (mfxF64) par->vpp.In.FrameRateExtD, outFrameRateCur = (mfxF64) par->vpp.Out.FrameRateExtN / (mfxF64) par->vpp.Out.FrameRateExtD, inFrameRate = (mfxF64) m_params.vpp.In.FrameRateExtN / (mfxF64) m_params.vpp.In.FrameRateExtD, outFrameRate = (mfxF64) m_params.vpp.Out.FrameRateExtN / (mfxF64) m_params.vpp.Out.FrameRateExtD; if ( fabs(inFrameRateCur / outFrameRateCur - inFrameRate / outFrameRate) > std::numeric_limits::epsilon() ) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; // Frame Rate ratio check if (m_params.vpp.In.FourCC != par->vpp.In.FourCC || m_params.vpp.Out.FourCC != par->vpp.Out.FourCC) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; mfxStatus sts = MFX_ERR_NONE; bool bIsFilterSkipped = false; m_frame_num = 0; //----------------------------------------------------- // [1] high level check //----------------------------------------------------- MFX_CHECK_NULL_PTR1(par); sts = CheckIOMode(par, m_ioMode); MFX_CHECK_STS(sts); m_IOPattern = par->IOPattern; if(0 == par->AsyncDepth) { m_asyncDepth = MFX_AUTO_ASYNC_DEPTH_VALUE; } else if( par->AsyncDepth > MFX_AUTO_ASYNC_DEPTH_VALUE ) { m_asyncDepth = MFX_AUTO_ASYNC_DEPTH_VALUE; } else { m_asyncDepth = par->AsyncDepth; } //----------------------------------------------------- // [2] device check //----------------------------------------------------- m_params = *par; mfxVppCaps caps; caps = m_ddi->GetCaps(); sts = ValidateParams(&m_params, &caps, m_pCore); if( MFX_WRN_FILTER_SKIPPED == sts ) { bIsFilterSkipped = true; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); m_config.m_IOPattern = 0; sts = ConfigureExecuteParams( m_params, caps, m_executeParams, m_config); if( MFX_WRN_FILTER_SKIPPED == sts ) { bIsFilterSkipped = true; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); if( m_executeParams.bFRCEnable && (MFX_HW_D3D11 == m_pCore->GetVAType()) && m_executeParams.customRateData.indexRateConversion != 0 ) { sts = (*m_ddi)->ReconfigDevice(m_executeParams.customRateData.indexRateConversion); MFX_CHECK_STS(sts); } // allocate special structure for ::ExecuteBlt() { m_executeSurf.resize( m_config.m_surfCount[VPP_IN] ); } // count of internal resources based on async_depth m_config.m_surfCount[VPP_OUT] = (mfxU16)(m_config.m_surfCount[VPP_OUT] * m_asyncDepth + 1); m_config.m_surfCount[VPP_IN] = (mfxU16)(m_config.m_surfCount[VPP_IN] * m_asyncDepth + 1); //----------------------------------------------------- // [3] internal frames allocation (make sense fo SYSTEM_MEMORY and D3D9ON11 only) //----------------------------------------------------- mfxFrameAllocRequest request; m_isD3D9SimWithVideoMemOut = IsD3D9Simulation(*m_pCore) && (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY); if (D3D_TO_SYS == m_ioMode || SYS_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemOut) // [OUT == SYSTEM_MEMORY] { //m_config.m_surfCount[VPP_OUT] = (mfxU16)(m_config.m_surfCount[VPP_OUT] + m_asyncDepth); request.Info = par->vpp.Out; request.Type = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = m_config.m_surfCount[VPP_OUT] ; if (m_config.m_surfCount[VPP_OUT] != m_internalVidSurf[VPP_OUT].NumFrameActual || m_executeParams.bComposite) { sts = m_internalVidSurf[VPP_OUT].Alloc(m_pCore, request, par->vpp.Out.FourCC != MFX_FOURCC_YV12); MFX_CHECK(MFX_ERR_NONE == sts, MFX_WRN_PARTIAL_ACCELERATION); } m_config.m_IOPattern |= m_isD3D9SimWithVideoMemOut ? MFX_IOPATTERN_OUT_VIDEO_MEMORY : MFX_IOPATTERN_OUT_SYSTEM_MEMORY; m_config.m_surfCount[VPP_OUT] = request.NumFrameMin; } m_isD3D9SimWithVideoMemIn = IsD3D9Simulation(*m_pCore) && (par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY); if (SYS_TO_SYS == m_ioMode || SYS_TO_D3D == m_ioMode || m_isD3D9SimWithVideoMemIn) // [IN == SYSTEM_MEMORY] { //m_config.m_surfCount[VPP_IN] = (mfxU16)(m_config.m_surfCount[VPP_IN] + m_asyncDepth); request.Info = par->vpp.In; request.Type = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_INTERNAL_FRAME; request.NumFrameMin = request.NumFrameSuggested = m_config.m_surfCount[VPP_IN] ; if (m_config.m_surfCount[VPP_IN] != m_internalVidSurf[VPP_IN].NumFrameActual || m_executeParams.bComposite) { sts = m_internalVidSurf[VPP_IN].Alloc(m_pCore, request, par->vpp.In.FourCC != MFX_FOURCC_YV12); MFX_CHECK(MFX_ERR_NONE == sts, MFX_WRN_PARTIAL_ACCELERATION); } m_config.m_IOPattern |= m_isD3D9SimWithVideoMemIn ? MFX_IOPATTERN_IN_VIDEO_MEMORY : MFX_IOPATTERN_IN_SYSTEM_MEMORY; m_config.m_surfCount[VPP_IN] = request.NumFrameMin; } // async workload mode by default m_workloadMode = VPP_ASYNC_WORKLOAD; //----------------------------------------------------- // [5] resource and task manager //----------------------------------------------------- sts = m_taskMngr.Init(m_pCore, m_config); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_MCTF { if (m_executeParams.bEnableMctf) { // create "Default" MCTF settings. IntMctfParams MctfConfig; CMC::QueryDefaultParams(&MctfConfig); // create default MCTF control mfxExtVppMctf MctfAPIDefault; CMC::QueryDefaultParams(&MctfAPIDefault); // control possibly passed mfxExtVppMctf* MctfAPIControl = NULL; GetFilterParam(par, MFX_EXTBUFF_VPP_MCTF, reinterpret_cast(&MctfAPIControl)); if (m_pMCTFilter) { m_pMCTFilter->MCTF_CLOSE(); m_pMCTFilter.reset(); m_MCTFSurfacePool.clear(); m_pMCTFSurfacePool.clear(); } MctfAPIControl = MctfAPIControl ? MctfAPIControl : &MctfAPIDefault; CMC::FillParamControl(&MctfConfig, MctfAPIControl); m_pMCTFilter = std::make_shared(); if (m_pMCTFilter) sts = InitMCTF(par->vpp.Out, MctfConfig); MFX_CHECK_STS(sts); } } #endif return (bIsFilterSkipped) ? MFX_WRN_FILTER_SKIPPED : MFX_ERR_NONE; } // mfxStatus VideoVPPHW::Reset(mfxVideoParam *par) mfxStatus VideoVPPHW::Close() { mfxStatus sts = MFX_ERR_NONE; m_internalVidSurf[VPP_IN].Free(); m_internalVidSurf[VPP_OUT].Free(); m_executeSurf.clear(); m_config.m_extConfig.mode = FRC_DISABLED; m_config.m_bMode30i60pEnable = false; m_config.m_bRefFrameEnable = false; m_config.m_bCopyPassThroughEnable = false; m_config.m_surfCount[VPP_IN] = 1; m_config.m_surfCount[VPP_OUT] = 1; m_IOPattern = 0; //m_acceptedDeviceAsyncDepth = ACCEPTED_DEVICE_ASYNC_DEPTH; m_taskMngr.Close(); // sync workload mode by default m_workloadMode = VPP_SYNC_WORKLOAD; #ifdef MFX_ENABLE_EXT #if defined (MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) m_SCD.Close(); #endif // CM device if(m_pCmDevice) { m_pCmDevice->DestroyKernel(m_pCmKernel); m_pCmKernel = NULL; m_pCmDevice->DestroyProgram(m_pCmProgram); m_pCmProgram = NULL; m_pCmQueue = NULL; //::DestroyCmDevice(device); } #endif #ifdef MFX_ENABLE_MCTF if (m_bMctfAllocatedMemory) { MFX_SAFE_CALL(m_pCore->FreeFrames(&m_MctfMfxAlocResponse)); m_bMctfAllocatedMemory = false; }; if (m_pMCTFilter) { m_pMCTFilter->MCTF_CLOSE(); m_pMCTFilter.reset(); ClearCmSurfaces2D(); } /* if (m_pMctfCmDevice) { ::DestroyCmDevice(m_pMctfCmDevice); m_pMctfCmDevice = nullptr; } */ #endif /* Device close semantic is different for multi-view and single view */ if ( m_bMultiView ) { /* In case of multi-view, VPPHW created dedicated resource manager with * device on Init, so need to close it be deleting resource manager */ delete m_ddi; m_bMultiView = false; } else { /* In case of single-view, VPPHW needs just close device, but does not * need to destroy resource manager. It's still alive inside of the core. * Core will take care on its removal. */ m_pCore->GetVideoProcessing((mfxHDL *)&m_ddi); if (m_ddi->GetDevice()) { m_ddi->Close(); } } return sts; } // mfxStatus VideoVPPHW::Close() mfxStatus VideoVPPHW::VppFrameCheck( mfxFrameSurface1 *input, mfxFrameSurface1 *output, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts; mfxStatus intSts = MFX_ERR_NONE; DdiTask *pTask = NULL; if(input && ((input->Info.CropW == 1) || (input->Info.CropH == 1))){ return MFX_ERR_INVALID_VIDEO_PARAM; } if(output && ((output->Info.CropW == 1) || (output->Info.CropH == 1))){ return MFX_ERR_INVALID_VIDEO_PARAM; } if (input && m_critical_error != MFX_ERR_NONE) return m_critical_error; #ifdef MFX_ENABLE_MCTF sts = MFX_ERR_NONE; mfxFrameSurface1* pWorkOutSurf = output; if (m_pMCTFilter) { // if input != NULL, if MCTF works with > 1 reference, & there are // not enough surfaces accumulated, let use temp surface as an output: if (input && !m_MctfIsFlushing) { MFX_SAFE_CALL(m_pMCTFilter->MCTF_GetEmptySurface(&pWorkOutSurf)); if (!pWorkOutSurf) { guard.Unlock(); mfxU32 iters(0); const mfxU32 MAX_ITER = 1000; while (!pWorkOutSurf && ++iters < MAX_ITER) { std::this_thread::sleep_for(1ms); MFX_SAFE_CALL(m_pMCTFilter->MCTF_GetEmptySurface(&pWorkOutSurf)); } if (MAX_ITER == iters) return MFX_ERR_NOT_ENOUGH_BUFFER; guard.Lock(); } // store a pointer to surface inside MCTF m_Surfaces2Unlock.push_back(pWorkOutSurf); // "disable" actual output surface for the purposes of filling of ddiTask below // if MCTF works with a delay and its just started (1 or 2 frames depending on a tmeporal MCTF mode if ((TWO_REFERENCES == m_pMCTFilter->MCTF_GetReferenceNumber() && m_taskMngr.GetMCTFSurfacesInQueue() < 1) || (FOUR_REFERENCES == m_pMCTFilter->MCTF_GetReferenceNumber() && m_taskMngr.GetMCTFSurfacesInQueue() < 2)) output = nullptr; }; if (m_MctfIsFlushing) { // it means that MCTF already finished its work, but application // asks to continue w/o apropriate close. if (input) return MFX_ERR_UNDEFINED_BEHAVIOR; // this is correct path; just return MFX_ERR_MORE_DATA notifying // that MCTF is done and processing is finished. else if (1 == m_taskMngr.GetMCTFSurfacesInQueue()) return MFX_ERR_MORE_DATA; } else { // this is the case when its not flushing but input is null; the situation when MCTF is not ready, // but an application already asks it to finalize must be correctly processed. if (!input) { if (!m_taskMngr.GetMCTFSurfacesInQueue()) return MFX_ERR_MORE_DATA; else if ((TWO_REFERENCES == m_pMCTFilter->MCTF_GetReferenceNumber() && m_taskMngr.GetMCTFSurfacesInQueue() <= 1) || (FOUR_REFERENCES == m_pMCTFilter->MCTF_GetReferenceNumber() && m_taskMngr.GetMCTFSurfacesInQueue() <= 2)) return MFX_ERR_UNDEFINED_BEHAVIOR; } } MFX_CHECK_NULL_PTR1(pWorkOutSurf); // AssignTask will also clear bForcedInternalAlloc sts = m_taskMngr.AssignTask(input,pWorkOutSurf, output, aux, pTask, intSts); if (MFX_WRN_DEVICE_BUSY != sts) { if (!pTask) return MFX_ERR_UNDEFINED_BEHAVIOR; else // condittion below means MCTF has substited temp surface instead of output if (pWorkOutSurf != output) pTask->output.bForcedInternalAlloc = true; if (MFX_ERR_MORE_DATA == sts && !input) { m_MctfIsFlushing = true; // this is a completion phase. so let ask MCTF to return // all surfaces that are in queue (if any) but following the // order supported by the scheduler // in sync/async submission, finalization is async: //switch (auxMctf->TemporalMode) switch (m_pMCTFilter->MCTF_GetReferenceNumber()) { case NO_REFERENCES: case ONE_REFERENCE: ; //nothing as 0-reference or 1-reference does not impose any delay break; case TWO_REFERENCES: case FOUR_REFERENCES: if (m_taskMngr.GetMCTFSurfacesInQueue() > 1) { m_taskMngr.DecMCTFSurfacesInQueue(); sts = MFX_ERR_NONE; } break; default: sts = MFX_ERR_UNDEFINED_BEHAVIOR; } } else { if (m_MctfIsFlushing && sts != MFX_WRN_DEVICE_BUSY) return MFX_ERR_UNDEFINED_BEHAVIOR; if (MFX_ERR_MORE_DATA == sts) { // let unlock just locked MCTF surface if (!m_Surfaces2Unlock.empty()) { // this is to release a surface inside MCTF pool; correposnds to MCTF_GetEmptySurface in VPPFrameCheck sts = m_pCore->DecreaseReference(*m_Surfaces2Unlock.front()); MFX_CHECK_STS(sts); m_Surfaces2Unlock.pop_front(); } } } } } else { MFX_CHECK_NULL_PTR1(output); sts = m_taskMngr.AssignTask(input, output, output, aux, pTask, intSts); } #else sts = m_taskMngr.AssignTask(input, output, aux, pTask, intSts); #endif MFX_CHECK_STS(sts); pTask->bRunTimeCopyPassThrough = (true == m_config.m_bCopyPassThroughEnable && false == IsRoiDifferent(pTask->input.pSurf, pTask->output.pSurf)); if (VPP_SYNC_WORKLOAD == m_workloadMode) { // submit task SyncTaskSubmission(pTask); if (false == pTask->bRunTimeCopyPassThrough) { // configure entry point pEntryPoint[0].pRoutine = VideoVPPHW::QueryTaskRoutine; pEntryPoint[0].pParam = (void *) pTask; pEntryPoint[0].requiredNumThreads = 1; pEntryPoint[0].pState = (void *) this; pEntryPoint[0].pRoutineName = (char *)"VPP Query"; numEntryPoints = 1; } } else { if (false == pTask->bRunTimeCopyPassThrough) { // configure entry point pEntryPoint[1].pRoutine = VideoVPPHW::QueryTaskRoutine; pEntryPoint[1].pParam = (void *)pTask; pEntryPoint[1].requiredNumThreads = 1; pEntryPoint[1].pState = (void *)this; pEntryPoint[1].pRoutineName = (char *)"VPP Query"; // configure entry point pEntryPoint[0].pRoutine = VideoVPPHW::AsyncTaskSubmission; pEntryPoint[0].pParam = (void *)pTask; pEntryPoint[0].requiredNumThreads = 1; pEntryPoint[0].pState = (void *)this; pEntryPoint[0].pRoutineName = (char *)"VPP Submit"; numEntryPoints = 2; } else { // configure entry point pEntryPoint[0].pRoutine = VideoVPPHW::AsyncTaskSubmission; pEntryPoint[0].pParam = (void *)pTask; pEntryPoint[0].requiredNumThreads = 1; pEntryPoint[0].pState = (void *)this; pEntryPoint[0].pRoutineName = (char *)"VPP Submit"; numEntryPoints = 1; } } return intSts; } // mfxStatus VideoVPPHW::VppFrameCheck(...) mfxStatus VideoVPPHW::PreWorkOutSurface(ExtSurface & output) { mfxHDLPair out = {}; mfxHDLPair hdl = {}; if (!output.pSurf) return MFX_ERR_UNDEFINED_BEHAVIOR; if ((D3D_TO_D3D == m_ioMode || SYS_TO_D3D == m_ioMode) && !m_isD3D9SimWithVideoMemOut) { if ( output.bForcedInternalAlloc || output.pSurf->Data.MemType & MFX_MEMTYPE_INTERNAL_FRAME ) { MFX_SAFE_CALL(m_pCore->GetFrameHDL(*output.pSurf, hdl)); m_executeParams.targetSurface.memId = output.pSurf->Data.MemId; m_executeParams.targetSurface.bExternal = false; } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*output.pSurf, hdl, false)); m_executeParams.targetSurface.memId = output.pSurf->Data.MemId; m_executeParams.targetSurface.bExternal = true; } } else { mfxU32 resId = output.resIdx; mfxMemId MemId = output.bForcedInternalAlloc ? output.pSurf->Data.MemId : m_internalVidSurf[VPP_OUT].mids[resId]; MFX_SAFE_CALL(m_pCore->GetFrameHDL(MemId, (mfxHDL *)&hdl)); m_executeParams.targetSurface.memId = MemId; m_executeParams.targetSurface.bExternal = false; } out = hdl; // register output surface (make sense for DX9 only) mfxStatus sts = (*m_ddi)->Register(&out, 1, TRUE); MFX_CHECK_STS(sts); m_executeParams.targetSurface.hdl = static_cast(out); m_executeParams.targetSurface.frameInfo = output.pSurf->Info; m_executeParams.targetTimeStamp = output.timeStamp; return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::PreWorkOutSurface(DdiTask* pTask) mfxStatus VideoVPPHW::PreWorkInputSurface(std::vector & surfQueue) { mfxStatus sts = MFX_ERR_NONE; mfxU32 numSamples = (mfxU32)surfQueue.size(); mfxHDLPair hdl = {}; mfxHDLPair in = {}; for (mfxU32 i = 0 ; i < numSamples; i += 1) { bool bExternal = true; mfxMemId memId = 0; if (SYS_TO_D3D == m_ioMode || SYS_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemIn) { mfxU32 resIdx = surfQueue[i].resIdx; if( surfQueue[i].bUpdate ) { mfxFrameSurface1 inputVidSurf = MakeSurface(surfQueue[i].pSurf->Info, m_internalVidSurf[VPP_IN].mids[resIdx]); #ifdef MFX_ENABLE_EXT if (MFX_MIRRORING_HORIZONTAL == m_executeParams.mirroring && MIRROR_INPUT == m_executeParams.mirroringPosition && m_pCmCopy && !m_isD3D9SimWithVideoMemIn) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "HW_VPP: Mirror (sys->d3d)"); mfxSize roi = {surfQueue[i].pSurf->Info.Width, surfQueue[i].pSurf->Info.Height}; mfxHDLPair dstHandle = {}; mfxFrameSurface1 *pDst = &inputVidSurf, *pSrc = surfQueue[i].pSurf; mfxFrameSurface1 srcTempSurface = *pSrc; bool isSrcLocked = false; if (NULL == pSrc->Data.Y) { sts = m_pCore->LockExternalFrame(srcTempSurface); MFX_CHECK_STS(sts); isSrcLocked = true; } // Copying functions expect either pointer or memid srcTempSurface.Data.MemId = 0; sts = m_pCore->GetFrameHDL(*pDst, dstHandle); MFX_CHECK_STS(sts); mfxI64 verticalPitch = (mfxI64)(srcTempSurface.Data.UV - srcTempSurface.Data.Y); // offset between Y and UV must be align to pitch MFX_CHECK(!(verticalPitch % srcTempSurface.Data.Pitch), MFX_ERR_UNSUPPORTED); verticalPitch /= srcTempSurface.Data.Pitch; mfxU32 srcPitch = srcTempSurface.Data.PitchLow + ((mfxU32)srcTempSurface.Data.PitchHigh << 16); sts = m_pCmCopy->CopyMirrorSystemToVideoMemory(dstHandle, 0, srcTempSurface.Data.Y, srcPitch, (mfxU32)verticalPitch, roi, MFX_FOURCC_NV12); MFX_CHECK_STS(sts); if (isSrcLocked) { sts = m_pCore->UnlockExternalFrame(srcTempSurface); MFX_CHECK_STS(sts); } } else #endif { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "HW_VPP: Copy input (sys->d3d)"); if (MFX_FOURCC_P010 == inputVidSurf.Info.FourCC && 0 == inputVidSurf.Info.Shift) inputVidSurf.Info.Shift = 1; // internal memory`s shift should be configured to 1 to call CopyShift CM kernel mfxU16 inMemType = static_cast((m_IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); sts = m_pCore->DoFastCopyWrapper( &inputVidSurf, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET, surfQueue[i].pSurf, inMemType); MFX_CHECK_STS(sts); } } MFX_SAFE_CALL(m_pCore->GetFrameHDL(m_internalVidSurf[VPP_IN].mids[resIdx], (mfxHDL *)&hdl)); in = hdl; bExternal = false; memId = m_internalVidSurf[VPP_IN].mids[resIdx]; } else { { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*surfQueue[i].pSurf, hdl)); bExternal = true; } in = hdl; memId = surfQueue[i].pSurf->Data.MemId; } // register input surface sts = (*m_ddi)->Register(&in, 1, TRUE); MFX_CHECK_STS(sts); memset(&m_executeSurf[i], 0, sizeof(mfxDrvSurface)); // set input surface m_executeSurf[i].hdl = static_cast(in); m_executeSurf[i].frameInfo = surfQueue[i].pSurf->Info; // prepare the primary video sample m_executeSurf[i].startTimeStamp = surfQueue[i].timeStamp; m_executeSurf[i].endTimeStamp = surfQueue[i].endTimeStamp; // debug info m_executeSurf[i].bExternal = bExternal; m_executeSurf[i].memId = memId; } return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::PreWorkInputSurface(...) mfxStatus VideoVPPHW::PostWorkOutSurfaceCopy(ExtSurface & output) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::PostWorkOutSurfaceCopy"); mfxStatus sts = MFX_ERR_NONE; MFX_CHECK(output.pSurf, MFX_ERR_UNDEFINED_BEHAVIOR); // code here to resolve issue in case of sync issue with encoder in case of system memory // [3] Copy sys -> vid if(SYS_TO_SYS == m_ioMode || D3D_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemOut) { // This function is to copy from an internal buffer of system surface to actual memory // if bForcedInternalAlloc is true, it says that memid needs to be taken from memid of a the surface // but it contradicts to the fact that this surface is allocated in system memory MFX_CHECK(!output.bForcedInternalAlloc, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(NO_INDEX != output.resIdx, MFX_ERR_UNDEFINED_BEHAVIOR); mfxFrameSurface1 d3dSurf = MakeSurface(output.pSurf->Info, m_internalVidSurf[VPP_OUT].mids[output.resIdx]); #ifdef MFX_ENABLE_EXT if (MFX_MIRRORING_HORIZONTAL == m_executeParams.mirroring && MIRROR_OUTPUT == m_executeParams.mirroringPosition && m_pCmCopy && !m_isD3D9SimWithVideoMemOut) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "HW_VPP: Mirror (d3d->sys)"); mfxSize roi = {output.pSurf->Info.Width, output.pSurf->Info.Height}; mfxHDLPair srcHandle = {}; mfxFrameSurface1 *pDst = output.pSurf, *pSrc = &d3dSurf; mfxFrameSurface1 dstTempSurface = *pDst; bool isDstLocked = false; sts = m_pCore->GetFrameHDL(*pSrc, srcHandle); MFX_CHECK_STS(sts); if (NULL == dstTempSurface.Data.Y) { sts = m_pCore->LockExternalFrame(dstTempSurface); MFX_CHECK_STS(sts); isDstLocked = true; } // Copying functions expect either pointer or memid dstTempSurface.Data.MemId = 0; mfxI64 verticalPitch = (mfxI64)dstTempSurface.Data.UV - (mfxI64)dstTempSurface.Data.Y; // offset between Y and UV must be align to pitch MFX_CHECK(!(verticalPitch % dstTempSurface.Data.Pitch), MFX_ERR_UNSUPPORTED); verticalPitch /= dstTempSurface.Data.Pitch; mfxU32 dstPitch = dstTempSurface.Data.PitchLow + ((mfxU32)dstTempSurface.Data.PitchHigh << 16); sts = m_pCmCopy->CopyMirrorVideoToSystemMemory(dstTempSurface.Data.Y, dstPitch, (mfxU32)verticalPitch, srcHandle, 0, roi, MFX_FOURCC_NV12); MFX_CHECK_STS(sts); if (isDstLocked) { sts = m_pCore->UnlockExternalFrame(dstTempSurface); MFX_CHECK_STS(sts); } } else #endif { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "HW_VPP: Copy output (d3d->sys)"); if (MFX_FOURCC_P010 == d3dSurf.Info.FourCC && 0 == d3dSurf.Info.Shift) d3dSurf.Info.Shift = 1; // internal memory`s shift should be configured to 1 to call CopyShift CM kernel mfxU16 outMemType = static_cast((m_IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); sts = m_pCore->DoFastCopyWrapper( output.pSurf, outMemType, &d3dSurf, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET ); MFX_CHECK_STS(sts); } } return sts; } mfxStatus VideoVPPHW::PostWorkOutSurface(ExtSurface & output) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::PostWorkOutSurface"); mfxStatus sts = MFX_ERR_NONE; if (SYS_TO_SYS == m_ioMode || D3D_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemOut) { bool copy = true #ifdef MFX_ENABLE_MCTF && !m_pMCTFilter #endif #if defined (ONEVPL_EXPERIMENTAL) && !m_PercEncFilter #endif ; if (copy) { // the reason for this is as follows: // in case of sys output surface, vpp allocates internal surfaces and use them // to submit into driver; then results are copied back to sys surface; in case of MCTF, // we have to pass video surface to MCTF, so to avoid redundant copies back-and-forth, // copy to output surface is moved to QueryFromMctf right after // MCTF is ready to retun surface; sts = PostWorkOutSurfaceCopy(output); MFX_CHECK_STS(sts); } }; // unregister output surface (make sense in case DX9 only) sts = (*m_ddi)->Register( &(m_executeParams.targetSurface.hdl), 1, FALSE); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::PostWorkOutSurface(ExtSurface & output) mfxStatus VideoVPPHW::PostWorkInputSurface(mfxU32 numSamples) { // unregister input surface(s) (make sense in case DX9 only) for (mfxU32 i = 0 ; i < numSamples; i += 1) { mfxStatus sts = (*m_ddi)->Register( &(m_executeSurf[i].hdl), 1, FALSE); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::PostWorkInputSurface(mfxU32 numSamples) #define CHECK_CM_ERR(ERR) if ((ERR) != CM_SUCCESS) return MFX_ERR_DEVICE_FAILED; #ifdef MFX_ENABLE_EXT int RunGpu( void* inD3DSurf, void* outD3DSurf, int fieldMask, CmDevice *device, CmQueue *queue, CmKernel *kernel, int WIDTH, int HEIGHT) { int res; mfxHDLPair in_pair = static_cast(*(mfxHDLPair *)inD3DSurf); mfxHDLPair out_pair = static_cast(*(mfxHDLPair *)outD3DSurf); CmSurface2D *input = 0; CmSurface2D *output = 0; res = device->CreateSurface2D(in_pair, input); CHECK_CM_ERR(res); res = device->CreateSurface2D(out_pair, output); CHECK_CM_ERR(res); unsigned int tsWidth = WIDTH / 16; unsigned int tsHeight = HEIGHT / 16; res = kernel->SetThreadCount(tsWidth * tsHeight); CHECK_CM_ERR(res); CmThreadSpace * threadSpace = 0; res = device->CreateThreadSpace(tsWidth, tsHeight, threadSpace); CHECK_CM_ERR(res); res = threadSpace->SelectThreadDependencyPattern(CM_NONE_DEPENDENCY); CHECK_CM_ERR(res); SurfaceIndex *idxInput = 0; SurfaceIndex *idxOutput = 0; res = input->GetIndex(idxInput); CHECK_CM_ERR(res); res = output->GetIndex(idxOutput); CHECK_CM_ERR(res); res = kernel->SetKernelArg(0, sizeof(*idxInput), idxInput); CHECK_CM_ERR(res); res = kernel->SetKernelArg(1, sizeof(*idxOutput), idxOutput); CHECK_CM_ERR(res); res = kernel->SetKernelArg(2, sizeof(int), &fieldMask); CHECK_CM_ERR(res); CmTask * task = 0; res = device->CreateTask(task); CHECK_CM_ERR(res); res = task->AddKernel(kernel); CHECK_CM_ERR(res); CmEvent * e = 0; res = queue->Enqueue(task, e, threadSpace); // wait result here!!! INT sts; mfxStatus status = MFX_ERR_NONE; if (CM_SUCCESS == res && e) { sts = e->WaitForTaskFinished(); if(sts == CM_EXCEED_MAX_TIMEOUT) status = MFX_ERR_GPU_HANG; } else { status = MFX_ERR_DEVICE_FAILED; } std::ignore = status; if(e) queue->DestroyEvent(e); device->DestroyThreadSpace(threadSpace); device->DestroyTask(task); //queue->DestroyEvent(e); device->DestroySurface(input); device->DestroySurface(output); return CM_SUCCESS; } // it is expected video->video, external memory only!!! mfxStatus VideoVPPHW::ProcessFieldCopy(mfxHDL in, mfxHDL out, mfxU32 fieldMask) { MFX_CHECK_NULL_PTR1(in); MFX_CHECK_NULL_PTR1(out); if (fieldMask > BFF2FIELD) //valid kernel mask [0, 1, 2, 3, 4, 5, 6, 7] { return MFX_ERR_INVALID_VIDEO_PARAM; } int sts = RunGpu( in, out, fieldMask, m_pCmDevice, m_pCmQueue, m_pCmKernel, m_executeSurf[0].frameInfo.Width, m_executeSurf[0].frameInfo.Height); CHECK_CM_ERR(sts); return MFX_ERR_NONE; } #endif mfxStatus VideoVPPHW::MergeRuntimeParams(const DdiTask *pTask, MfxHwVideoProcessing::mfxExecuteParams *execParams) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(pTask); MFX_CHECK_NULL_PTR1(execParams); mfxU32 numSamples; std::vector inputSurfs; size_t i, indx; numSamples = pTask->bkwdRefCount + 1 + pTask->fwdRefCount; inputSurfs.resize(numSamples); execParams->VideoSignalInfo.assign(numSamples, m_executeParams.VideoSignalInfoIn); // bkwdFrames for(i = 0; i < pTask->bkwdRefCount; i++) { indx = i; inputSurfs[indx] = pTask->m_refList[i].pSurf; } // cur Frame indx = pTask->bkwdRefCount; inputSurfs[indx] = pTask->input.pSurf; // fwd Frames for( i = 0; i < pTask->fwdRefCount; i++ ) { indx = pTask->bkwdRefCount + 1 + i; inputSurfs[indx] = pTask->m_refList[pTask->bkwdRefCount + i].pSurf; } mfxExtVPPVideoSignalInfo *vsi; for (i = 0; i < numSamples; i++) { // Update Video Signal info params for output vsi = reinterpret_cast(GetExtendedBuffer(inputSurfs[i]->Data.ExtParam, inputSurfs[i]->Data.NumExtParam, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO)); if (vsi) { /* Check params */ if (vsi->TransferMatrix != MFX_TRANSFERMATRIX_BT601 && vsi->TransferMatrix != MFX_TRANSFERMATRIX_BT709 && vsi->TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (vsi->NominalRange != MFX_NOMINALRANGE_0_255 && vsi->NominalRange != MFX_NOMINALRANGE_16_235 && vsi->NominalRange != MFX_NOMINALRANGE_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } /* Params look good */ execParams->VideoSignalInfo[i].enabled = true; execParams->VideoSignalInfo[i].NominalRange = vsi->NominalRange; execParams->VideoSignalInfo[i].TransferMatrix = vsi->TransferMatrix; } } #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) execParams->gpuHangTrigger = false; for (i = 0; i < numSamples; i++) { if (GetExtendedBuffer(inputSurfs[i]->Data.ExtParam, inputSurfs[i]->Data.NumExtParam, MFX_EXTBUFF_GPU_HANG)) { execParams->gpuHangTrigger = true; break; } } #endif mfxFrameSurface1 * outputSurf = pTask->output.pSurf; MFX_CHECK(outputSurf, MFX_ERR_NULL_PTR); // Update Video Signal info params for output vsi = reinterpret_cast(GetExtendedBuffer(outputSurf->Data.ExtParam, outputSurf->Data.NumExtParam, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO)); if (vsi) { /* Check params */ if (vsi->TransferMatrix != MFX_TRANSFERMATRIX_BT601 && vsi->TransferMatrix != MFX_TRANSFERMATRIX_BT709 && vsi->TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (vsi->NominalRange != MFX_NOMINALRANGE_0_255 && vsi->NominalRange != MFX_NOMINALRANGE_16_235 && vsi->NominalRange != MFX_NOMINALRANGE_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } /* Params look good */ execParams->VideoSignalInfoOut.enabled = true; execParams->VideoSignalInfoOut.NominalRange = vsi->NominalRange; execParams->VideoSignalInfoOut.TransferMatrix = vsi->TransferMatrix; } #ifdef MFX_ENABLE_VPP_RUNTIME_HSBC // Update ProcAmp parameters for output mfxExtVPPProcAmp *procamp = reinterpret_cast(GetExtendedBuffer(outputSurf->Data.ExtParam, outputSurf->Data.NumExtParam, MFX_EXTBUFF_VPP_PROCAMP)); if (procamp) { execParams->Brightness = procamp->Brightness; execParams->Saturation = procamp->Saturation; execParams->Hue = procamp->Hue; execParams->Contrast = procamp->Contrast; execParams->bEnableProcAmp = true; } #endif return sts; } /// Main VPP processing entry point /*! This is where all VPP processing happen. This function prepares input/output surface and parameters to pass to driver. DEINTERLACE: ADI with Scene change detector uses SceneChangeDetector::Get_frame_shot_Decision() and SceneChangeDetector::Get_frame_last_in_scene() to detect scene change. It sets up the variable m_executeParams.scene to notify the scene change status to vaapi interface VAAPIVideoProcessing::Execute() function. \param[in] pTask Pointer to task thread \param[out] m_executeParams structure passed to driver VAAPI interface \return[out] mfxStatus MFX_ERR_NONE if there is no error */ mfxStatus VideoVPPHW::SyncTaskSubmission(DdiTask* pTask) { mfxStatus sts = MFX_ERR_NONE; #ifdef MFX_ENABLE_MCTF if (pTask->outputForApp.pSurf) { if (true == pTask->bRunTimeCopyPassThrough) { sts = CopyPassThrough(pTask->input.pSurf, pTask->outputForApp.pSurf); m_taskMngr.CompleteTask(pTask); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } } else { // null output surface is possible IFF MCTF enabled & is used. if (!m_pMCTFilter || !pTask->bMCTF) return MFX_ERR_UNDEFINED_BEHAVIOR; } #else if (true == pTask->bRunTimeCopyPassThrough) { sts = CopyPassThrough(pTask->input.pSurf, pTask->output.pSurf); m_taskMngr.CompleteTask(pTask); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } #endif mfxU32 i = 0; mfxU32 numSamples = pTask->bkwdRefCount + 1 + pTask->fwdRefCount; std::vector surfQueue(numSamples); mfxU32 indx = 0; mfxU32 deinterlaceAlgorithm = 0; bool FMDEnable = 0; // bkwdFrames for(i = 0; i < pTask->bkwdRefCount; i++) { indx = i; surfQueue[indx] = pTask->m_refList[i]; } // cur Frame indx = pTask->bkwdRefCount; surfQueue[indx] = pTask->input; // fwd Frames for( i = 0; i < pTask->fwdRefCount; i++ ) { indx = pTask->bkwdRefCount + 1 + i; surfQueue[indx] = pTask->m_refList[pTask->bkwdRefCount + i]; } /* in VPP Field Copy mode we just copy field only */ mfxU32 imfxFPMode = 0xffffffff; if (m_executeParams.iFieldProcessingMode != 0) { mfxFrameSurface1 * pInputSurface = surfQueue[0].pSurf; MFX_CHECK(pInputSurface, MFX_ERR_NULL_PTR); /* Mean filter was configured as DOUSE, but no ExtBuf in VPP Init() * And ... no any parameters in runtime. This is an error! */ if (((m_executeParams.iFieldProcessingMode -1) == FROM_RUNTIME_EXTBUFF_FIELD_PROC) && (pInputSurface->Data.NumExtParam == 0)) { return MFX_ERR_INVALID_VIDEO_PARAM; } if ((m_executeParams.iFieldProcessingMode -1 ) == FROM_RUNTIME_PICSTRUCT) { mfxU16 srcPicStruct = m_params.vpp.In.PicStruct == MFX_PICSTRUCT_UNKNOWN ? pInputSurface->Info.PicStruct : m_params.vpp.In.PicStruct; mfxU16 dstPicStruct = m_params.vpp.Out.PicStruct == MFX_PICSTRUCT_UNKNOWN ? pTask->output.pSurf->Info.PicStruct : m_params.vpp.Out.PicStruct; if (srcPicStruct == MFX_PICSTRUCT_UNKNOWN || dstPicStruct == MFX_PICSTRUCT_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (srcPicStruct & MFX_PICSTRUCT_FIELD_SINGLE) { if (dstPicStruct & MFX_PICSTRUCT_FIELD_TFF) { imfxFPMode = FIELD2TFF; } else if (dstPicStruct & MFX_PICSTRUCT_FIELD_BFF) { imfxFPMode = FIELD2BFF; } else return MFX_ERR_INVALID_VIDEO_PARAM; } else if (dstPicStruct & MFX_PICSTRUCT_FIELD_SINGLE) { if (srcPicStruct & MFX_PICSTRUCT_FIELD_TFF) { imfxFPMode = TFF2FIELD; } else if (srcPicStruct & MFX_PICSTRUCT_FIELD_BFF) { imfxFPMode = BFF2FIELD; } else return MFX_ERR_INVALID_VIDEO_PARAM; } imfxFPMode++; } /* If there is no ExtBuffer in RunTime we can use value from Init() */ else if ((pInputSurface->Data.NumExtParam == 0) || (pInputSurface->Data.ExtParam == NULL)) { imfxFPMode = m_executeParams.iFieldProcessingMode; } else /* So on looks like ExtBuf is present in runtime */ { mfxExtVPPFieldProcessing * vppFieldProcessingParams = NULL; /* So on, we skip m_executeParams.iFieldProcessingMode from Init() */ for ( mfxU32 jj = 0; jj < pInputSurface->Data.NumExtParam; jj++ ) { if ( (pInputSurface->Data.ExtParam[jj]->BufferId == MFX_EXTBUFF_VPP_FIELD_PROCESSING) && (pInputSurface->Data.ExtParam[jj]->BufferSz == sizeof(mfxExtVPPFieldProcessing)) ) { vppFieldProcessingParams = (mfxExtVPPFieldProcessing *)(pInputSurface->Data.ExtParam[jj]); if (vppFieldProcessingParams->Mode == MFX_VPP_COPY_FIELD) { if(vppFieldProcessingParams->InField == MFX_PICSTRUCT_FIELD_TFF) { imfxFPMode = (vppFieldProcessingParams->OutField == MFX_PICSTRUCT_FIELD_TFF) ? TFF2TFF : TFF2BFF; } else { imfxFPMode = (vppFieldProcessingParams->OutField == MFX_PICSTRUCT_FIELD_TFF) ? BFF2TFF : BFF2BFF; } } /* if (vppFieldProcessingParams->Mode == MFX_VPP_COPY_FIELD)*/ if (vppFieldProcessingParams->Mode == MFX_VPP_COPY_FRAME) imfxFPMode = FRAME2FRAME; } } // "-1" to get valid kernel values is done internally // !!! kernel uses "0" as a "valid" data, but HW_VPP doesn't // to prevent issue we increment here and decrement before kernel call imfxFPMode++; } } if (CommonCaps::IsVppSkipQuerySupported(m_pCore->GetHWType(), m_pCore->GetHWDeviceId()) && (m_ioMode == D3D_TO_D3D || m_ioMode == SYS_TO_D3D) && !m_config.m_bDisSkipQuery && m_config.m_bSupportLPLA) { pTask->skipQueryStatus = true; } #ifdef MFX_ENABLE_EXT if ((m_executeParams.iFieldProcessingMode != 0) /* If Mode is enabled*/ && ((imfxFPMode - 1) != (mfxU32)FRAME2FRAME) /* And we don't do copy frame to frame lets call our FieldCopy*/ && m_pCmDevice /* And cm device is loaded*/ ) /* And remember our previous line imfxFPMode++;*/ { imfxFPMode--; pTask->skipQueryStatus = true; // do not submit any tasks to driver in this mode sts = PreWorkOutSurface(pTask->output); MFX_CHECK_STS(sts); sts = PreWorkInputSurface(surfQueue); MFX_CHECK_STS(sts); if ((imfxFPMode == TFF2FIELD) || (imfxFPMode == BFF2FIELD)) { if (pTask->taskIndex % 2) { // switch between TFF2FIELD<->BFF2FIELD for each second iteration imfxFPMode = (imfxFPMode == TFF2FIELD) ? BFF2FIELD : TFF2FIELD; } } sts = ProcessFieldCopy((mfxHDL)&m_executeSurf[0].hdl, (mfxHDL)&m_executeParams.targetSurface.hdl, imfxFPMode); MFX_CHECK_STS(sts); if ((imfxFPMode == FIELD2TFF) || (imfxFPMode == FIELD2BFF)) { if (numSamples != 2) { return MFX_ERR_UNDEFINED_BEHAVIOR; } // copy the second field to frame imfxFPMode = (imfxFPMode == FIELD2TFF) ? FIELD2BFF : FIELD2TFF; sts = ProcessFieldCopy((mfxHDL)&m_executeSurf[1].hdl, (mfxHDL)&m_executeParams.targetSurface.hdl, imfxFPMode); MFX_CHECK_STS(sts); } m_executeParams.pRefSurfaces = &m_executeSurf[0]; #ifdef MFX_ENABLE_MCTF // this is correct that outputForApp is used: // provided that MCTF is not used, and system memory is an output, // PostWorkOutSurfaceCopy will copy from an internal buffer to real // output surface; if MCTF is used, PostWorkOutSurfaceCopy will be // called but in QueryFromMCTF; for D3D output surface no specific // processing is need: if MCTF is not used, outputForApp must be // the same as output; if MCTF is used, "copy" to an output surface is done // by MCTF when it makes filtration (no copy, just result of filtering // is placed in to the output suface) // NB: if MCTF is not used, and system memory is an output surface, // its important ot have bForcedInternalAlloc == false, if (pTask->outputForApp.pSurf) sts = PostWorkOutSurface(pTask->outputForApp); #else sts = PostWorkOutSurface(pTask->output); #endif MFX_CHECK_STS(sts); sts = PostWorkInputSurface(numSamples); MFX_CHECK_STS(sts); // what should be done if pTask->outputForApp.pSurf == nullptr?? //if (pTask->outputForApp.pSurf) m_executeParams.targetSurface.memId = pTask->output.pSurf->Data.MemId; m_executeParams.statusReportID = pTask->taskIndex; return sts; } if (MFX_MIRRORING_HORIZONTAL == m_executeParams.mirroring && MIRROR_WO_EXEC == m_executeParams.mirroringPosition && m_pCmCopy) { /* Temporal solution for mirroring that makes nothing but mirroring * merge mirroring into pipeline? * UPD: d3d->sys, sys->d3d and sys->sys IO Patterns already merged */ sts = PreWorkOutSurface(pTask->output); MFX_CHECK_STS(sts); sts = PreWorkInputSurface(surfQueue); MFX_CHECK_STS(sts); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "HW_VPP: Mirror (d3d->d3d)"); mfxSize roi = {pTask->output.pSurf->Info.Width, pTask->output.pSurf->Info.Height}; sts = m_pCmCopy->CopyMirrorVideoToVideoMemory(m_executeParams.targetSurface.hdl, m_executeSurf[0].hdl, roi, MFX_FOURCC_NV12); MFX_CHECK_STS(sts); #ifdef MFX_ENABLE_MCTF // this is correct that outputForApp is used: // provided that MCTF is not used, and system memory is an output, // PostWorkOutSurfaceCopy will copy from an internal buffer to real // output surface; if MCTF is used, PostWorkOutSurfaceCopy will be // called but in QueryFromMCTF; for D3D output surface no specific // processing is need: if MCTF is not used, outputForApp must be // the same as output; if MCTF is used, "copy" to an output surface is done // by MCTF when it makes filtration (no copy, just result of filtering // is placed in to the output surface) // NB: if MCTF is not used, and system memory is an output surface, // its important ot have bForcedInternalAlloc == false, if (pTask->outputForApp.pSurf) sts = PostWorkOutSurface(pTask->outputForApp); #else sts = PostWorkOutSurface(pTask->output); #endif MFX_CHECK_STS(sts); sts = PostWorkInputSurface(numSamples); MFX_CHECK_STS(sts); m_executeParams.targetSurface.memId = pTask->output.pSurf->Data.MemId; m_executeParams.statusReportID = pTask->taskIndex; return sts; } #endif sts = PreWorkOutSurface(pTask->output); MFX_CHECK_STS(sts); sts = PreWorkInputSurface(surfQueue); MFX_CHECK_STS(sts); #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) /* In MFX_DEINTERLACING_ADVANCED_SCD (also called ADI_SCD) the current field * uses information from previous field and next field (if it is * present in current frame) in ADI mode. * BOB is used when previous or next field can not be used * 1. To deinterlace first frame * 2. When scene change occur (first of new scene and last of previous scene) * 3. To deinterlace last frame for 30i->60p mode * SCD engine detects if a picture belongs to a new scene */ if (MFX_DEINTERLACING_ADVANCED_SCD == m_executeParams.iDeinterlacingAlgorithm) { mfxU32 scene_change = 0; mfxU32 sc_in_first_field = 0; mfxU32 sc_in_second_field = 0; mfxU32 sc_detected = 0; BOOL is30i60pConversion = 0; mfxU32 frameIndex = pTask->bkwdRefCount; // index of current frame mfxHDLPair frameHandle = { nullptr, nullptr }; mfxFrameSurface1 frameSurface; memset(&frameSurface, 0, sizeof(mfxFrameSurface1)); if (m_executeParams.bDeinterlace30i60p) { is30i60pConversion = 1; } /* Feed scene change detector with input frame */ mfxFrameSurface1 *inFrame = surfQueue[frameIndex].pSurf; MFX_CHECK_NULL_PTR1(inFrame); frameSurface.Info = inFrame->Info; // Set input frame parity in SCD if (frameSurface.Info.PicStruct & MFX_PICSTRUCT_FIELD_TFF) { m_SCD.SetParityTFF(); } else if (frameSurface.Info.PicStruct & MFX_PICSTRUCT_FIELD_BFF) { m_SCD.SetParityBFF(); } // Check for scene change // Do it only when new input frame are fed to deinterlacer. // For 30i->60p, this happens every odd frames as: // m_frame_num = 0: input0 -> BOB -> ouput0 but we need to feed SCD engine with first reference frame // m_frame_num = 1: input1 + reference input 0 -> ADI -> output1 // m_frame_num = 2: input1 + reference input 0 -> ADI -> output2 (no need to check as same input is used) // m_frame_num = 3: input2 + reference input 1 -> ADI -> output3 if (is30i60pConversion == 0 || (m_frame_num % 2) == 1 || m_frame_num == 0) { if (m_SCD.Query_ASCCmDevice()) { if (SYS_TO_D3D == m_ioMode || SYS_TO_SYS == m_ioMode || m_isD3D9SimWithVideoMemIn) { sts = m_pCore->GetFrameHDL(m_internalVidSurf[VPP_IN].mids[surfQueue[frameIndex].resIdx], reinterpret_cast(&frameHandle)); MFX_CHECK_STS(sts); } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*surfQueue[frameIndex].pSurf, frameHandle)); } // SCD detects scene change for field to be display. // 30i->30p displays only first of current (frame N = field 2N) // for 30i->60p, check happends on odd output frame 2N +1 // 30i->60p display output 2N+1, 2N+2 // input fields to SCD detection engine are field 2N + 2 and 2N + 3 // SCD needs field input in display order // SCD detects if input field is the first field of a new Scene // based on current and previous stream statistics sts = m_SCD.PutFrameInterlaced(frameHandle); MFX_CHECK_STS(sts); // detect scene change in first field of current 2N + 2 sc_in_first_field = m_SCD.Get_frame_shot_Decision(); // Feed SCD detector with second field of current frame sts = m_SCD.PutFrameInterlaced(frameHandle); } else { mfxFrameData data = surfQueue[frameIndex].pSurf->Data; FrameLocker lock2(m_pCore, data, true); if (data.Y == 0) return MFX_ERR_LOCK_MEMORY; mfxI32 pitch = (mfxI32)(data.PitchLow + (data.PitchHigh << 16)); sts = m_SCD.PutFrameInterlaced(data.Y, pitch); MFX_CHECK_STS(sts); // detect scene change in first field of current 2N + 2 sc_in_first_field = m_SCD.Get_frame_shot_Decision(); // Feed SCD detector with second field of current frame sts = m_SCD.PutFrameInterlaced(data.Y, pitch); } MFX_CHECK_STS(sts); // check second field of current sc_in_second_field = m_SCD.Get_frame_shot_Decision();//m_SCD.Get_frame_last_in_scene(); sc_detected = sc_in_first_field + sc_in_second_field; scene_change += sc_detected; /* Check next state depending on value of previous * m_scene_change and detected scene change. * Typically, use BOB for last field before scene change and * first field of a new scene. * For 30i->30p: use BOB + first field of input frame to compute * output. For 30i->60p: use BOB + field location when scene * change occurs for the first time. Use BOB and first field * only for reference when more scene change are detected to * avoid out of frame order. */ switch (m_scene_change) // previous status { case NO_SCENE_CHANGE: // for 30i->60p we display second of reference (field 2N+1) here // displayed field is is last if next is new scene if (is30i60pConversion && sc_in_first_field) m_scene_change = LAST_IN_SCENE; else if (is30i60pConversion && sc_in_second_field) // notify that second field of reference display by ADI will be last m_scene_change = NEXT_IS_LAST_IN_SCENE; else if (scene_change) m_scene_change = SCENE_CHANGE; break; case SCENE_CHANGE: if (scene_change) m_scene_change = MORE_SCENE_CHANGE_DETECTED; else m_scene_change = NO_SCENE_CHANGE; break; case MORE_SCENE_CHANGE_DETECTED: if (scene_change) m_scene_change = MORE_SCENE_CHANGE_DETECTED; else m_scene_change = NO_SCENE_CHANGE; break; default: break; } //end switch } // end (is30i60pConversion == 0 || m_frame_num % 2 == 1) // set up m_executeParams.scene for vaapi interface; switch (m_scene_change) { case NO_SCENE_CHANGE: m_executeParams.scene = VPP_NO_SCENE_CHANGE; break; case SCENE_CHANGE: m_executeParams.scene = VPP_SCENE_NEW; break; case MORE_SCENE_CHANGE_DETECTED: m_executeParams.scene = VPP_MORE_SCENE_CHANGE_DETECTED; break; case LAST_IN_SCENE: m_executeParams.scene = VPP_SCENE_NEW; m_scene_change = SCENE_CHANGE; break; case NEXT_IS_LAST_IN_SCENE: if (m_frame_num % 2 == 0) // 2N+2 field processed { m_scene_change = LAST_IN_SCENE; m_executeParams.scene = VPP_SCENE_NEW; } break; default: break; } //end switch } // if (MFX_DEINTERLACING_ADVANCED_SCD == m_executeParams.iDeinterlacingAlgorithm) #endif m_executeParams.refCount = numSamples; m_executeParams.bkwdRefCount = pTask->bkwdRefCount; m_executeParams.fwdRefCount = pTask->fwdRefCount; m_executeParams.pRefSurfaces = &m_executeSurf[0]; m_executeParams.bEOS = pTask->bEOS; m_executeParams.statusReportID = pTask->taskIndex; m_executeParams.iTargetInterlacingMode = DEINTERLACE_ENABLE; if( !(m_executeParams.targetSurface.frameInfo.PicStruct & (MFX_PICSTRUCT_PROGRESSIVE))) { m_executeParams.iTargetInterlacingMode = DEINTERLACE_DISABLE; m_executeParams.iDeinterlacingAlgorithm = 0; m_executeParams.bFMDEnable = false; } // Check for progressive frames in interlace streams deinterlaceAlgorithm = m_executeParams.iDeinterlacingAlgorithm; FMDEnable = m_executeParams.bFMDEnable; mfxU32 currFramePicStruct = m_executeSurf[pTask->bkwdRefCount].frameInfo.PicStruct; mfxU32 refFramePicStruct = m_executeSurf[0].frameInfo.PicStruct; bool isFirstField = true; bool isCurrentProgressive = false; bool isPreviousProgressive = false; // check for progressive frames marked as progressive or pict_struct=5,6,7,8 in H.264 if ((currFramePicStruct == MFX_PICSTRUCT_PROGRESSIVE) || (currFramePicStruct & MFX_PICSTRUCT_FIELD_REPEATED) || (currFramePicStruct & MFX_PICSTRUCT_FRAME_DOUBLING) || (currFramePicStruct & MFX_PICSTRUCT_FRAME_TRIPLING)) { isCurrentProgressive = true; } if ((refFramePicStruct == MFX_PICSTRUCT_PROGRESSIVE) || (refFramePicStruct & MFX_PICSTRUCT_FIELD_REPEATED) || (refFramePicStruct & MFX_PICSTRUCT_FRAME_DOUBLING) || (refFramePicStruct & MFX_PICSTRUCT_FRAME_TRIPLING)) { isPreviousProgressive = true; } // Process progressive frame if (isCurrentProgressive) { m_executeParams.iDeinterlacingAlgorithm = 0; m_executeParams.bFMDEnable = false; } if ((imfxFPMode - 1 == FIELD2TFF || imfxFPMode - 1 == FIELD2BFF) && !VppCaps::IsSwFieldProcessingSupported(m_pCore->GetHWType())) { m_executeParams.bFieldWeavingExt = true; } if ((imfxFPMode - 1 == TFF2FIELD || imfxFPMode - 1 == BFF2FIELD) && !VppCaps::IsSwFieldProcessingSupported(m_pCore->GetHWType())) { m_executeParams.bFieldSplittingExt = true; } if (m_executeParams.mirroring && m_pCore->GetVAType() != MFX_HW_D3D9) m_executeParams.mirroringExt = true; // Need special handling for progressive frame in 30i->60p ADI mode if ((pTask->bkwdRefCount == 1) && m_executeParams.bDeinterlace30i60p) { if ((m_frame_num % 2) == 0) isFirstField = false; // 30i->60p ADI second field correspond to even output frame except for first and last // Process progressive current frame if (isCurrentProgressive) { // First field comes from interlace reference if ((!isPreviousProgressive) && isFirstField) { m_executeParams.iDeinterlacingAlgorithm = deinterlaceAlgorithm; m_executeParams.bFMDEnable = FMDEnable; } else { m_executeParams.iDeinterlacingAlgorithm = 0; // Disable DI for current frame m_executeParams.bFMDEnable = false; } } // Disable DI when previous frame is progressive and current frame is interlace if (isPreviousProgressive && (!isCurrentProgressive) && isFirstField) { m_executeParams.iDeinterlacingAlgorithm = 0; // Disable DI for first output frame m_executeParams.bFMDEnable = false; } } MfxHwVideoProcessing::mfxExecuteParams execParams = m_executeParams; sts = MergeRuntimeParams(pTask, &execParams); MFX_CHECK_STS(sts); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) m_executeParams.gpuHangTrigger = execParams.gpuHangTrigger; #endif if (execParams.bComposite && (MFX_HW_D3D11 == m_pCore->GetVAType() && execParams.refCount > MAX_STREAMS_PER_TILE)) { mfxU32 NumExecute = execParams.refCount; for (mfxU32 execIdx = 0; execIdx < NumExecute; execIdx++) { execParams.execIdx = execIdx; sts = (*m_ddi)->Execute(&execParams); if (sts != MFX_ERR_NONE) break; } } else { sts = (*m_ddi)->Execute(&execParams); } if (sts != MFX_ERR_NONE) { pTask->SetFree(true); return sts; } MFX_CHECK_STS(sts); //wa for variance if(execParams.bVarianceEnable) { //pTask->frameNumber = m_executeParams.frameNumber; pTask->bVariance = true; } #ifdef MFX_ENABLE_MCTF // this is correct that outputForApp is used: // provided that MCTF is not used, and system memory is an output, // PostWorkOutSurfaceCopy will copy from an internal buffer to real // output surface; if MCTF is used, PostWorkOutSurfaceCopy will be // called but in QueryFromMCTF; for D3D output surface no specific // processing is need: if MCTF is not used, outputForApp must be // the same as output; if MCTF is used, "copy" to an output surface is done // by MCTF when it makes filtration (no copy, just result of filtering // is placed in to the output suface) // NB: if MCTF is not used, and system memory is an output surface, // its important ot have bForcedInternalAlloc == false, //if (pTask->outputForApp.pSurf) sts = PostWorkOutSurface(pTask->outputForApp); #else sts = PostWorkOutSurface(pTask->output); #endif MFX_CHECK_STS(sts); sts = PostWorkInputSurface(numSamples); MFX_CHECK_STS(sts); // restore value for m_executeParams.iDeinterlacingAlgorithm m_executeParams.iDeinterlacingAlgorithm = deinterlaceAlgorithm; m_executeParams.bFMDEnable = FMDEnable; m_frame_num++; // used to derive first or second field return MFX_ERR_NONE; } // mfxStatus VideoVPPHW::SyncTaskSubmission(DdiTask* pTask) mfxStatus VideoVPPHW::AsyncTaskSubmission(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { (void)threadNumber; (void)callNumber; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::AsyncTaskSubmission"); mfxStatus sts; #ifdef MFX_ENABLE_MCTF VideoVPPHW *pHwVpp = (VideoVPPHW *)pState; DdiTask *pTask = (DdiTask*)pParam; bool bMCTFinUse = pTask->bMCTF && pHwVpp->m_pMCTFilter; if (bMCTFinUse) if (!pTask->input.pSurf) return MFX_TASK_DONE; #endif sts = ((VideoVPPHW *)pState)->SyncTaskSubmission((DdiTask *)pParam); MFX_CHECK_STS(sts); return MFX_TASK_DONE; } // mfxStatus VideoVPPHW::AsyncTaskSubmission(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) mfxStatus VideoVPPHW::QueryTaskRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) { (void)threadNumber; (void)callNumber; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::QueryTaskRoutine"); mfxStatus sts = MFX_ERR_NONE; VideoVPPHW *pHwVpp = (VideoVPPHW *) pState; DdiTask *pTask = (DdiTask*) pParam; UMC::AutomaticUMCMutex guard(pHwVpp->m_guard); #ifdef MFX_ENABLE_MCTF bool InputSurfaceIsProcessed = true; bool bMCTFinUse = pTask->bMCTF && pHwVpp->m_pMCTFilter; if (bMCTFinUse && !pTask->input.pSurf) InputSurfaceIsProcessed = false; if (InputSurfaceIsProcessed) { #endif if (!pTask->skipQueryStatus && !pHwVpp->m_executeParams.mirroring) { SubTask currSubTask = pHwVpp->m_taskMngr.GetSubTask(pTask); while (currSubTask.taskIndex != NO_INDEX) { sts = (*pHwVpp->m_ddi)->QueryTaskStatus(&currSubTask); if (sts == MFX_TASK_DONE || sts == MFX_ERR_NONE) { pHwVpp->m_taskMngr.DeleteSubTask(pTask, currSubTask.taskIndex); currSubTask = pHwVpp->m_taskMngr.GetSubTask(pTask); } else currSubTask.taskIndex = NO_INDEX; } if (sts == MFX_TASK_DONE || sts == MFX_ERR_NONE) { sts = (*pHwVpp->m_ddi)->QueryTaskStatus(pTask); } #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) if (pHwVpp->m_executeParams.gpuHangTrigger) { sts = MFX_ERR_GPU_HANG; } #endif if(sts == MFX_ERR_DEVICE_FAILED || sts == MFX_ERR_GPU_HANG) { sts = MFX_ERR_GPU_HANG; pHwVpp->m_critical_error = sts; pHwVpp->m_taskMngr.CompleteTask(pTask); } MFX_CHECK_STS(sts); } //[2] Variance if (pTask->bVariance) { // windows part std::vector variance; sts = (*pHwVpp->m_ddi)->QueryVariance( pTask->taskIndex, variance); MFX_CHECK_STS(sts); if (pTask->pAuxData) { if (MFX_EXTBUFF_VPP_AUXDATA == pTask->pAuxData->Header.BufferId) { pTask->pAuxData->PicStruct = EstimatePicStruct( &variance[0], pHwVpp->m_params.vpp.Out.Width, pHwVpp->m_params.vpp.Out.Height); } } } #ifdef MFX_ENABLE_MCTF } if (pTask->bMCTF && pHwVpp->m_pMCTFilter) { guard.Unlock(); bool bMctfReadyToReturn(false); sts = SubmitToMctf(pState, pParam, &bMctfReadyToReturn); MFX_CHECK_STS(sts); sts = QueryFromMctf(pState, pParam, bMctfReadyToReturn); MFX_CHECK_STS(sts); guard.Lock(); // it might be empty if MCTF works with delay and it is finalizing the stream; // in this case no locked internal surfaces if (!pHwVpp->m_Surfaces2Unlock.empty()) { // this is to release a surface inside MCTF pool; correposnds to MCTF_GetEmptySurface in VPPFrameCheck sts = pHwVpp->m_pCore->DecreaseReference(*pHwVpp->m_Surfaces2Unlock.front()); MFX_CHECK_STS(sts); pHwVpp->m_Surfaces2Unlock.pop_front(); } } #endif #if defined (ONEVPL_EXPERIMENTAL) if (pHwVpp->m_PercEncFilter) { sts = pHwVpp->m_PercEncFilter->RunFrameVPPTask(pTask->input.pSurf, pTask->output.pSurf, nullptr); MFX_CHECK_STS(sts); } #endif // [4] Complete task sts = pHwVpp->m_taskMngr.CompleteTask(pTask); return sts; } // mfxStatus VideoVPPHW::QueryTaskRoutine(void *pState, void *pParam, mfxU32 threadNumber, mfxU32 callNumber) #ifdef MFX_ENABLE_MCTF mfxStatus VideoVPPHW::SubmitToMctf(void *pState, void *pParam, bool* bMctfReadyToReturn) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::SubmitToMctf"); mfxStatus sts = MFX_ERR_NONE; VideoVPPHW *pHwVpp = (VideoVPPHW *)pState; DdiTask *pTask = (DdiTask*)pParam; if (pTask->bMCTF && pHwVpp->m_pMCTFilter) { *bMctfReadyToReturn = true; if (pTask->input.pSurf) { // actual output surface in case of system memory has internal buffering // which should substitute outputsurface itself for the purposes of // forceing MCTF to filter directly into output mfxFrameSurface1 d3dSurf; bool bOutForcedInternalAlloc = pTask->outputForApp.bForcedInternalAlloc; memset(&d3dSurf, 0, sizeof(mfxFrameSurface1)); mfxFrameSurface1* pd3dSurf = pTask->outputForApp.pSurf ? &d3dSurf : nullptr; if (pd3dSurf) { d3dSurf.Info = pTask->outputForApp.pSurf->Info; d3dSurf.Data.MemId = pTask->outputForApp.pSurf->Data.MemId; // if an output surface in system memory, MCTF will put results into // an internal buffer associated with system memory that then will be // copied to actual surface. if (SYS_TO_SYS == pHwVpp->m_ioMode || D3D_TO_SYS == pHwVpp->m_ioMode || pHwVpp->m_isD3D9SimWithVideoMemOut) { if (NO_INDEX != pTask->outputForApp.resIdx) { d3dSurf.Data.MemId = pHwVpp->m_internalVidSurf[VPP_OUT].mids[pTask->outputForApp.resIdx]; } else { // if its here, it means there is no internal buffer can be identified for an output surface; // cannot proceed. exit. return MFX_ERR_UNDEFINED_BEHAVIOR; } } } mfxFrameSurface1* pSurf = pTask->output.pSurf; bool bInForcedInternalAlloc = pTask->output.bForcedInternalAlloc; // take control out of input surface: IntMctfParams* MctfData = pTask->MctfControlActive ? &pTask->MctfData : nullptr; // that's Ok to as local variable d3dSurf as it will not be copied; only actual handle will // be taken & CmSurface2D will be created (or found from the pool) mfxHDLPair handle = {}; CmSurface2D* pSurfCm(nullptr), *pSurfOutCm(nullptr); SurfaceIndex* pSurfIdxCm(nullptr), *pSurfOutIdxCm(nullptr); MFX_SAFE_CALL(pHwVpp->GetFrameHandle(pSurf, handle, bInForcedInternalAlloc)); MFX_SAFE_CALL(pHwVpp->CreateCmSurface2D(reinterpret_cast(&handle), pSurfCm, pSurfIdxCm)); if (pd3dSurf) { handle = {}; MFX_SAFE_CALL(pHwVpp->GetFrameHandle(pd3dSurf, handle, bOutForcedInternalAlloc)); MFX_SAFE_CALL(pHwVpp->CreateCmSurface2D(reinterpret_cast(&handle), pSurfOutCm, pSurfOutIdxCm)); } //sts = pHwVpp->m_pMCTFilter->MCTF_PUT_FRAME(MctfData, pSurf, pd3dSurf, bInForcedInternalAlloc, bOutForcedInternalAlloc); sts = pHwVpp->m_pMCTFilter->MCTF_PUT_FRAME(MctfData, pSurfCm, pSurfOutCm); // --- access to the internal MCTF queue to increase buffer_count: no need to protect by mutex, as 1 writer & 1 reader MFX_SAFE_CALL(pHwVpp->m_pMCTFilter->MCTF_UpdateBufferCount()); // filtering itself MFX_SAFE_CALL(pHwVpp->m_pMCTFilter->MCTF_DO_FILTERING()); *bMctfReadyToReturn = pHwVpp->m_pMCTFilter->MCTF_ReadyToOutput(); } } else if (pTask->bMCTF && !pHwVpp->m_pMCTFilter) return MFX_ERR_UNDEFINED_BEHAVIOR; return sts; } mfxStatus VideoVPPHW::QueryFromMctf(void *pState, void *pParam, bool bMctfReadyToReturn, bool bEoF) { (void)bEoF; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, "VideoVPPHW::SubmitToMctf"); mfxStatus sts = MFX_ERR_NONE; VideoVPPHW *pHwVpp = (VideoVPPHW *)pState; DdiTask *pTask = (DdiTask*)pParam; if (!pTask) return sts; if (bMctfReadyToReturn) { mfxFrameSurface1 d3dSurf; memset(&d3dSurf, 0, sizeof(mfxFrameSurface1)); mfxFrameSurface1* pSurf = pTask->outputForApp.pSurf; bool bForcedInternalAlloc = pTask->outputForApp.bForcedInternalAlloc; if (SYS_TO_SYS == pHwVpp->m_ioMode || D3D_TO_SYS == pHwVpp->m_ioMode || pHwVpp->m_isD3D9SimWithVideoMemOut) { //bForcedInternalAlloc = true; // this is true in case of *_TO_SYS ioMode // borrowed from postworkoutput if (NO_INDEX != pTask->outputForApp.resIdx) { d3dSurf.Info = pTask->outputForApp.pSurf->Info; d3dSurf.Data.MemId = pHwVpp->m_internalVidSurf[VPP_OUT].mids[pTask->outputForApp.resIdx]; } else { // if its here, it means there is no internal buffer allocated for a system surface; // cannot proceed. return MFX_ERR_UNDEFINED_BEHAVIOR; } pSurf = &d3dSurf; } mfxHDLPair handle = {}; CmSurface2D* pSurfCm(nullptr); SurfaceIndex* pSurfIdxCm(nullptr); MFX_SAFE_CALL(pHwVpp->GetFrameHandle(pSurf, handle, bForcedInternalAlloc)); MFX_SAFE_CALL(pHwVpp->CreateCmSurface2D(reinterpret_cast(&handle), pSurfCm, pSurfIdxCm)); pHwVpp->m_pMCTFilter->MCTF_GET_FRAME(pSurfCm); pHwVpp->m_pMCTFilter->MCTF_TrackTimeStamp(pSurf); //pHwVpp->m_pMCTFilter->MCTF_GET_FRAME(pSurf, bForcedInternalAlloc); // for an outputForApp surface bForcedInternalAlloc must be false at all times; if (pTask->outputForApp.bForcedInternalAlloc) return MFX_ERR_UNDEFINED_BEHAVIOR; // this function will copy from m_internalVidSurf to system memory only in case of SYS output sts = pHwVpp->PostWorkOutSurfaceCopy(pTask->outputForApp); MFX_CHECK_STS(sts); } /* if (MFX_ERR_NONE != sts) wprintf(L"VideoVPPHW::QueryFromMctf: MFX_ERR_NONE != sts\n"); */ return sts; } #endif mfxStatus ValidateParams(mfxVideoParam *par, mfxVppCaps *caps, VideoCORE *core, bool bCorrectionEnable) { MFX_CHECK_NULL_PTR3(par, caps, core); mfxStatus sts = MFX_ERR_NONE; if((par->vpp.In.CropW == 1) || (par->vpp.In.CropH == 1) || (par->vpp.Out.CropW == 1) || (par->vpp.Out.CropH == 1)){ sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } std::vector pipelineList; mfxStatus internalSts = GetPipelineList(par, pipelineList, true); mfxU32 pLen = (mfxU32)pipelineList.size(); mfxU32* pList = (pLen > 0) ? (mfxU32*)&pipelineList[0] : NULL; MFX_CHECK_STS(internalSts); /* 1. Check ext param */ mfxU32 n_hints_buf = 0, input_hint = 0, output_hint = 0; for (mfxU32 i = 0; i < par->NumExtParam; i++) { void *data = par->ExtParam[i]; MFX_CHECK_NULL_PTR1(data); switch(par->ExtParam[i]->BufferId) { case MFX_EXTBUFF_VPP_SCALING: { mfxExtVPPScaling *extScaling = (mfxExtVPPScaling*)data; // MFX_SCALING_MODE_INTEL_GEN_COMPUTE is only supported on DG2+. If this flag is set on older platforms, return an error message. if (extScaling->ScalingMode == MFX_SCALING_MODE_INTEL_GEN_COMPUTE && !VppCaps::IsScalingModeSupportEU(core->GetHWType())) { extScaling->ScalingMode = MFX_SCALING_MODE_DEFAULT; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } break; } case MFX_EXTBUFF_VPP_MIRRORING: { mfxExtVPPMirroring* extMir = (mfxExtVPPMirroring*)data; bool isOnlyHorizontalMirroringSupported = true; bool isOnlyVideoMemory = false; switch (par->IOPattern) { case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY: case MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: case MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY: { isOnlyVideoMemory = true; break; } default: break; } // On Linux with d3d_to_d3d memory type, mirroring performs through driver kernel // There is support for both modes if (isOnlyVideoMemory && core->GetVAType() == MFX_HW_VAAPI) isOnlyHorizontalMirroringSupported = false; // Starting from TGL, mirroring performs through driver // Driver supports horizontal and vertical modes if (core->GetVAType() != MFX_HW_D3D9) // Starting with TGL, mirroring performs through driver // Driver supports horizontal and vertical modes isOnlyHorizontalMirroringSupported = false; // Only SW mirroring has these limitations if (isOnlyHorizontalMirroringSupported && (par->vpp.In.FourCC != MFX_FOURCC_NV12 || par->vpp.Out.FourCC != MFX_FOURCC_NV12)) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); // SW mirroring does not support crop X and Y if (isOnlyHorizontalMirroringSupported && (par->vpp.In.CropX || par->vpp.In.CropY || par->vpp.Out.CropX || par->vpp.Out.CropY)) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); if (extMir->Type > MFX_MIRRORING_VERTICAL || (extMir->Type==MFX_MIRRORING_VERTICAL && isOnlyHorizontalMirroringSupported)) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); // SW d3d->d3d mirroring does not support resize if (isOnlyHorizontalMirroringSupported && isOnlyVideoMemory && (par->vpp.In.Width != par->vpp.Out.Width || par->vpp.In.Height != par->vpp.Out.Height)) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); // If pipeline contains resize, SW mirroring and other, VPP skips other filters if (isOnlyHorizontalMirroringSupported && isOnlyVideoMemory && pLen > 2) sts = GetWorstSts(sts, MFX_WRN_FILTER_SKIPPED); break; } case MFX_EXTBUFF_VPP_FIELD_PROCESSING: { mfxExtVPPFieldProcessing* extFP = (mfxExtVPPFieldProcessing*)data; if (extFP->Mode != MFX_VPP_COPY_FRAME && extFP->Mode != MFX_VPP_COPY_FIELD) { // Unsupported mode sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } if (extFP->Mode == MFX_VPP_COPY_FIELD) { if( (extFP->InField != MFX_PICSTRUCT_FIELD_TFF && extFP->InField != MFX_PICSTRUCT_FIELD_BFF) || (extFP->OutField != MFX_PICSTRUCT_FIELD_TFF && extFP->OutField != MFX_PICSTRUCT_FIELD_BFF) ) { // Copy field needs specific type of interlace sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } break; } //case MFX_EXTBUFF_VPP_FIELD_PROCESSING case MFX_EXTBUFF_VPP_DENOISE2: { mfxExtVPPDenoise2* extDN2 = (mfxExtVPPDenoise2*) data; // All pre-processing mode will not be applied for interfaced content // In VPL GPU runtime, default mode is BD-Rate mode. if ((extDN2->Mode == MFX_DENOISE_MODE_INTEL_HVS_AUTO_BDRATE) || (extDN2->Mode == MFX_DENOISE_MODE_INTEL_HVS_AUTO_SUBJECTIVE) || (extDN2->Mode == MFX_DENOISE_MODE_INTEL_HVS_PRE_MANUAL) || (extDN2->Mode == MFX_DENOISE_MODE_DEFAULT)) { if ((par->vpp.In.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) || (par->vpp.Out.PicStruct != MFX_PICSTRUCT_PROGRESSIVE)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } break; } case MFX_EXTBUFF_VPP_DEINTERLACING: { mfxExtVPPDeinterlacing* extDI = (mfxExtVPPDeinterlacing*) data; if (extDI->Mode != MFX_DEINTERLACING_ADVANCED && #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) extDI->Mode != MFX_DEINTERLACING_ADVANCED_SCD && #endif extDI->Mode != MFX_DEINTERLACING_ADVANCED_NOREF && extDI->Mode != MFX_DEINTERLACING_BOB && extDI->Mode != MFX_DEINTERLACING_FIELD_WEAVING) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) if (extDI->Mode == MFX_DEINTERLACING_ADVANCED_SCD && par->vpp.Out.FourCC != MFX_FOURCC_NV12 && par->vpp.Out.FourCC != MFX_FOURCC_YV12) { // SCD kernels support only planar 8-bit formats sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } #endif break; } //case MFX_EXTBUFF_VPP_DEINTERLACING case MFX_EXTBUFF_VPP_DOUSE: { mfxExtVPPDoUse* extDoUse = (mfxExtVPPDoUse*)data; for( mfxU32 algIdx = 0; algIdx < extDoUse->NumAlg; algIdx++ ) { if( !CheckDoUseCompatibility( extDoUse->AlgList[algIdx] ) ) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); continue; // stop working with ExtParam[i] } if(MFX_EXTBUFF_VPP_COMPOSITE == extDoUse->AlgList[algIdx]) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); continue; // stop working with ExtParam[i] } if(MFX_EXTBUFF_VPP_FIELD_PROCESSING == extDoUse->AlgList[algIdx]) { /* NOTE: * It's legal to use DOUSE for field processing, * but application must attach appropriate ext buffer to mfxFrameData for each input surface */ //sts = MFX_ERR_INVALID_VIDEO_PARAM; //continue; // stop working with ExtParam[i] } if(MFX_EXTBUFF_VPP_SCENE_ANALYSIS == extDoUse->AlgList[algIdx]) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); continue; // stop working with ExtParam[i] } } break; } //case MFX_EXTBUFF_VPP_DOUSE case MFX_EXTBUFF_VPP_COMPOSITE: { mfxExtVPPComposite* extComp = (mfxExtVPPComposite*)data; MFX_CHECK_NULL_PTR1(extComp); if (extComp->NumInputStream > MAX_NUM_OF_VPP_COMPOSITE_STREAMS) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); if (MFX_HW_D3D9 == core->GetVAType() && extComp->NumInputStream) { // AlphaBlending & LumaKey filters are not supported at first sub-stream on DX9, DX9 can't process more than 8 channels if (extComp->InputStream[0].GlobalAlphaEnable || extComp->InputStream[0].LumaKeyEnable || extComp->InputStream[0].PixelAlphaEnable || (extComp->NumInputStream > MAX_STREAMS_PER_TILE)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } break; } //case MFX_EXTBUFF_VPP_COMPOSITE case MFX_EXTBUFF_ALLOCATION_HINTS: { if (++n_hints_buf > 2) { sts = GetWorstSts(sts, MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)); } mfxExtAllocationHints* hints_buffer = reinterpret_cast(data); if (hints_buffer->VPPPoolType == MFX_VPP_POOL_IN) { if (++input_hint > 2) { sts = GetWorstSts(sts, MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)); } } else if (hints_buffer->VPPPoolType == MFX_VPP_POOL_OUT) { if (++output_hint > 2) { sts = GetWorstSts(sts, MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)); } } sts = GetWorstSts(sts, CheckAllocationHintsBuffer(*hints_buffer, true)); } } // switch if (output_hint + input_hint != n_hints_buf) { sts = GetWorstSts(sts, MFX_STS_TRACE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)); } } /* 2. p010 video memory should be shifted */ if ((MFX_FOURCC_P010 == par->vpp.In.FourCC && 0 == par->vpp.In.Shift && par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) || (MFX_FOURCC_P010 == par->vpp.Out.FourCC && 0 == par->vpp.Out.Shift && par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); /* 3. Check single field cases */ if ( (par->vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && !(par->vpp.Out.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) ) { if (!IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_FIELD_WEAVING)) // FIELD_WEAVING filter must be there { sts = (MFX_ERR_UNSUPPORTED < sts) ? MFX_ERR_UNSUPPORTED : sts; } if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_RESIZE) && pLen > 2) { mfxU32 maxNum = 2; if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_CSC)) ++maxNum; if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_RSHIFT_IN)) ++maxNum; if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_LSHIFT_OUT)) ++maxNum; if (pLen > maxNum) { sts = (MFX_ERR_UNSUPPORTED < sts) ? MFX_ERR_UNSUPPORTED : sts; } } // VPP SyncTaskSubmission returns MFX_ERR_UNSUPPORTED when output picstructure has no parity if (!(par->vpp.Out.PicStruct & (MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_TFF)) && !(par->vpp.Out.PicStruct == MFX_PICSTRUCT_UNKNOWN)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } if( !(par->vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && (par->vpp.Out.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) ) { // Input can not be progressive if (!(par->vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_TFF) && !(par->vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_BFF) && !(par->vpp.In.PicStruct == MFX_PICSTRUCT_UNKNOWN)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } if (!IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_FIELD_SPLITTING) || // FIELD_SPLITTING filter must be there (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_RESIZE) && pLen > 2) ) // there are other filters except implicit RESIZE { sts = (MFX_ERR_UNSUPPORTED < sts) ? MFX_ERR_UNSUPPORTED : sts; } } /* 4. Check size */ if (par->vpp.In.Width > caps->uMaxWidth || par->vpp.In.Height > caps->uMaxHeight || par->vpp.Out.Width > caps->uMaxWidth || par->vpp.Out.Height > caps->uMaxHeight) sts = GetWorstSts(sts, MFX_WRN_PARTIAL_ACCELERATION); /* 5. Check fourcc */ if ( !(caps->mFormatSupport[par->vpp.In.FourCC] & MFX_FORMAT_SUPPORT_INPUT) || !(caps->mFormatSupport[par->vpp.Out.FourCC] & MFX_FORMAT_SUPPORT_OUTPUT) ) sts = GetWorstSts(sts, MFX_WRN_PARTIAL_ACCELERATION); /* 6. BitDepthLuma and BitDepthChroma should be configured for p010 format */ if (MFX_FOURCC_P010 == par->vpp.In.FourCC || par->vpp.In.FourCC == MFX_FOURCC_Y210 || par->vpp.In.FourCC == MFX_FOURCC_Y410) { if (0 == par->vpp.In.BitDepthLuma) { par->vpp.In.BitDepthLuma = 10; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } if (0 == par->vpp.In.BitDepthChroma) { par->vpp.In.BitDepthChroma = 10; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } } if (MFX_FOURCC_P010 == par->vpp.Out.FourCC || par->vpp.Out.FourCC == MFX_FOURCC_Y210 || par->vpp.Out.FourCC == MFX_FOURCC_Y410) { if (0 == par->vpp.Out.BitDepthLuma) { par->vpp.Out.BitDepthLuma = 10; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } if (0 == par->vpp.Out.BitDepthChroma) { par->vpp.Out.BitDepthChroma = 10; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } } if ( par->vpp.In.FourCC == MFX_FOURCC_P016 || par->vpp.In.FourCC == MFX_FOURCC_Y216 || par->vpp.In.FourCC == MFX_FOURCC_Y416 ) { if (0 == par->vpp.In.BitDepthLuma) { par->vpp.In.BitDepthLuma = 12; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } if (0 == par->vpp.In.BitDepthChroma) { par->vpp.In.BitDepthChroma = 12; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } } if ( par->vpp.Out.FourCC == MFX_FOURCC_P016 || par->vpp.Out.FourCC == MFX_FOURCC_Y216 || par->vpp.Out.FourCC == MFX_FOURCC_Y416 ) { if (0 == par->vpp.Out.BitDepthLuma) { par->vpp.Out.BitDepthLuma = 12; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } if (0 == par->vpp.Out.BitDepthChroma) { par->vpp.Out.BitDepthChroma = 12; sts = GetWorstSts(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); } } /* 8. Check unsupported filters on RGB */ if( par->vpp.In.FourCC == MFX_FOURCC_RGB4) { if(IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_DENOISE) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_DENOISE2) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_DETAIL) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_PROCAMP) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_SCENE_CHANGE) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_IMAGE_STABILIZATION) ) { sts = GetWorstSts(sts, MFX_WRN_FILTER_SKIPPED); if(bCorrectionEnable) { std::vector tmpZeroDoUseList; //zero SignalPlatformCapabilities(*par, tmpZeroDoUseList); } } } #ifdef MFX_ENABLE_MCTF { // mctf cannot work with CC others than NV12; also interlace is not supported if (par->vpp.Out.FourCC != MFX_FOURCC_NV12 || par->vpp.Out.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_MCTF)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } if ((par->vpp.Out.FrameRateExtN * par->vpp.In.FrameRateExtD != par->vpp.Out.FrameRateExtD * par->vpp.In.FrameRateExtN) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION) || IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_COMPOSITE)) { if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_MCTF)) { bool bHasFrameDelay(true); if (bHasFrameDelay) sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } } #endif #if defined (ONEVPL_EXPERIMENTAL) { // perceptual encoding filter cannot work with CC others than NV12; also interlace is not supported if (par->vpp.Out.FourCC != MFX_FOURCC_NV12 || par->vpp.Out.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { if (IsFilterFound(pList, pLen, MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER)) { sts = GetWorstSts(sts, MFX_ERR_UNSUPPORTED); } } } #endif return sts; } // mfxStatus VideoVPPHW::ValidateParams(mfxVideoParam *par, mfxVppCaps *caps, VideoCORE *core, bool bCorrectionEnable = false) //--------------------------------------------------------------------------------- // Check DI mode set by user, if not set use advanced as default (if supported) // Returns: 0 - cannot set due to HW limitations or wrong range, 1 - BOB, 2 - ADI ) //--------------------------------------------------------------------------------- mfxI32 GetDeinterlaceMode( const mfxVideoParam& videoParam, const mfxVppCaps& caps ) { mfxI32 deinterlacingMode = 0; // look for user defined deinterlacing mode for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i] && videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DEINTERLACING) { mfxExtVPPDeinterlacing* extDI = (mfxExtVPPDeinterlacing*) videoParam.ExtParam[i]; if (extDI->Mode != MFX_DEINTERLACING_ADVANCED && #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) extDI->Mode != MFX_DEINTERLACING_ADVANCED_SCD && #endif extDI->Mode != MFX_DEINTERLACING_ADVANCED_NOREF && extDI->Mode != MFX_DEINTERLACING_BOB && extDI->Mode != MFX_DEINTERLACING_FIELD_WEAVING) { return 0; } /* To check if driver support desired DI mode*/ if ((MFX_DEINTERLACING_ADVANCED == extDI->Mode) && (caps.uAdvancedDI) ) deinterlacingMode = extDI->Mode; #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) if ((MFX_DEINTERLACING_ADVANCED_SCD == extDI->Mode) && (caps.uAdvancedDI) ) deinterlacingMode = extDI->Mode; #endif if ((MFX_DEINTERLACING_ADVANCED_NOREF == extDI->Mode) && (caps.uAdvancedDI) ) deinterlacingMode = extDI->Mode; if ((MFX_DEINTERLACING_BOB == extDI->Mode) && (caps.uSimpleDI) ) deinterlacingMode = extDI->Mode; if ((MFX_DEINTERLACING_FIELD_WEAVING == extDI->Mode) && (caps.uFieldWeavingControl)) deinterlacingMode = extDI->Mode; /**/ break; } } /* IF there is no DI ext buffer */ if (caps.uAdvancedDI) { if (0 == deinterlacingMode) { deinterlacingMode = MFX_DEINTERLACING_ADVANCED; } } else if (caps.uSimpleDI) { if (0 == deinterlacingMode) { deinterlacingMode = MFX_DEINTERLACING_BOB; } } else { deinterlacingMode = 0; } return deinterlacingMode; } /* functions to detect: does required to set background in composition or not */ template inline T max_local1(const T &x, const T &y) {return (((x) > (y)) ? (x) : (y)); } template inline T min_local1(const T &x, const T &y) {return (((x) < (y)) ? (x) : (y)); } template inline T mid(const T &x, const T &y, const T &z) {return (min_local1(max_local1((x), (y)), (z))); } template class cRect { public: T m_x1, m_y1; T m_x2, m_y2; int m_frag_lvl; int m_surf_idx; int reserved[2]; public: cRect(): m_x1(0), m_y1(0), m_x2(0), m_y2(0), m_frag_lvl(1), m_surf_idx(-1) {}; cRect(T x1, T y1, T x2, T y2, int fragl, int s_id): m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), m_frag_lvl(fragl), m_surf_idx(s_id) {}; inline bool overlap(cRect &B) const { return !((m_x2 <= B.m_x1) || (m_x1 >= B.m_x2) || (m_y2 <= B.m_y1) || (m_y1 >= B.m_y2) ); }; inline T area(void) const { return (m_x2-m_x1) * (m_y2-m_y1); }; }; template void fragment(const cRect a, const cRect &b, std::vector< cRect > &stack) { T xa = mid(a.m_x1, b.m_x1, a.m_x2); T xb = mid(a.m_x1, b.m_x2, a.m_x2); T ya = mid(a.m_y1, b.m_y1, a.m_y2); T yb = mid(a.m_y1, b.m_y2, a.m_y2); int nidx = a.m_frag_lvl + 1; int s_id = a.m_surf_idx; if(a.m_x2 != xb) stack.push_back(cRect(xb, ya, a.m_x2, yb, nidx, s_id)); if(a.m_x1 != xa) stack.push_back(cRect(a.m_x1, ya, xa, yb, nidx, s_id)); if(a.m_y2 != yb) stack.push_back(cRect(a.m_x1, yb, a.m_x2, a.m_y2, nidx, s_id)); if(a.m_y1 != ya) stack.push_back(cRect(a.m_x1, a.m_y1, a.m_x2, ya, nidx, s_id)); } template void add_unique_fragments(const cRect &r, std::vector< cRect > &fragments) { std::vector< cRect > stack; int frag_cnt = (int)fragments.size(); stack.reserve(128); stack.push_back(r); while(!stack.empty()) { cRect &cr = stack.back(); if(cr.m_frag_lvl == frag_cnt) { stack.pop_back(); fragments.push_back(cr); } else { const cRect &cf = fragments[cr.m_frag_lvl]; if (cf.overlap(cr)) { stack.pop_back(); fragment(cr, cf, stack); } else { cr.m_frag_lvl++; } } } } template T get_total_area(std::vector< cRect > &rects) { std::vector< cRect > fragments; size_t i; fragments.reserve(4*rects.size()); fragments.push_back(rects[0]); for (i = 1; i < rects.size(); i++) add_unique_fragments(rects[i], fragments); T area = 0; for (i = 0; i < fragments.size(); i++) area += fragments[i].area(); return area; } inline mfxU64 make_back_color_yuv(mfxU16 bit_depth, mfxU16 Y, mfxU16 U, mfxU16 V) { assert(bit_depth); mfxU64 const shift = bit_depth - 8; mfxU64 const max_val = (1 << bit_depth) - 1; return ((mfxU64) max_val << 48) | ((mfxU64) mfx::clamp(Y, (16 << shift), (235 << shift)) << 32) | ((mfxU64) mfx::clamp(U, (16 << shift), (240 << shift)) << 16) | ((mfxU64) mfx::clamp(V, (16 << shift), (240 << shift)) << 0); } inline mfxU64 make_back_color_argb(mfxU16 bit_depth, mfxU16 R, mfxU16 G, mfxU16 B) { mfxU64 const max_val = (1 << bit_depth) - 1; return ((mfxU64)max_val << 48) | (mfx::clamp(R, 0, max_val) << 32) | (mfx::clamp(G, 0, max_val) << 16) | (mfx::clamp(B, 0, max_val) << 0); } inline mfxU64 make_def_back_color_yuv(mfxU16 bit_depth) { assert(bit_depth); mfxU64 const shift = bit_depth - 8; mfxU16 const min_val = 16 << shift, max_val = 256 << shift; return make_back_color_yuv(bit_depth, min_val, max_val / 2, max_val / 2); } inline mfxU64 make_def_back_color_argb(mfxU16 bit_depth) { return make_back_color_argb(bit_depth, 0, 0, 0); } static mfxU64 get_background_color(const mfxVideoParam & videoParam) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_COLORFILL) { mfxExtVPPColorFill *extCF = reinterpret_cast(videoParam.ExtParam[i]); if (!IsOn(extCF->Enable)) return 0; } if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_COMPOSITE) { mfxExtVPPComposite *extComp = (mfxExtVPPComposite *) videoParam.ExtParam[i]; switch (videoParam.vpp.Out.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_NV16: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: case MFX_FOURCC_UYVY: return make_back_color_yuv(8, extComp->Y, extComp->U, extComp->V); case MFX_FOURCC_P010: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P210: return make_back_color_yuv(10, extComp->Y, extComp->U, extComp->V); case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: return make_back_color_argb(8, extComp->R, extComp->G, extComp->B); case MFX_FOURCC_A2RGB10: return make_back_color_argb(10, extComp->R, extComp->G, extComp->B); case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: { mfxU16 depth = videoParam.vpp.Out.BitDepthLuma ? videoParam.vpp.Out.BitDepthLuma : 12; return make_back_color_yuv(depth, extComp->Y, extComp->U, extComp->V); } default: break; } } } switch (videoParam.vpp.Out.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_NV16: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: case MFX_FOURCC_UYVY: return make_def_back_color_yuv(8); case MFX_FOURCC_P010: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P210: return make_def_back_color_yuv(10); case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: return make_def_back_color_argb(8); case MFX_FOURCC_A2RGB10: return make_def_back_color_argb(10); case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: return make_def_back_color_yuv(videoParam.vpp.Out.BitDepthLuma ? videoParam.vpp.Out.BitDepthLuma : 12); default: break; } /* Default case */ return make_def_back_color_argb(8); } //--------------------------------------------------------- // Do internal configuration //--------------------------------------------------------- mfxStatus ConfigureExecuteParams( mfxVideoParam & videoParam, // [IN] mfxVppCaps & caps, // [IN] mfxExecuteParams & executeParams, // [OUT] Config & config) // [OUT] { //---------------------------------------------- std::vector pipelineList; mfxStatus sts = GetPipelineList( &videoParam, pipelineList, true ); MFX_CHECK_STS(sts); mfxF64 inDNRatio = 0, outDNRatio = 0; bool bIsFilterSkipped = false; bool bitmodeflag = 0; // default config.m_extConfig.frcRational[VPP_IN].FrameRateExtN = videoParam.vpp.In.FrameRateExtN; config.m_extConfig.frcRational[VPP_IN].FrameRateExtD = videoParam.vpp.In.FrameRateExtD; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtN = videoParam.vpp.Out.FrameRateExtN; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtD = videoParam.vpp.Out.FrameRateExtD; config.m_surfCount[VPP_IN] = 1; config.m_surfCount[VPP_OUT] = 1; executeParams.iBackgroundColor = get_background_color(videoParam); for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUF_CAM_PIPECONTROL) { bitmodeflag = TRUE; } } if (!bitmodeflag) { if(videoParam.vpp.In.BitDepthLuma == 16 || videoParam.vpp.In.BitDepthChroma == 16 || videoParam.vpp.Out.BitDepthLuma==16 || videoParam.vpp.Out.BitDepthChroma == 16) return MFX_ERR_INVALID_VIDEO_PARAM; } //----------------------------------------------------- for (mfxU32 j = 0; j < pipelineList.size(); j += 1) { auto SetHdrMetaData = [](mfxExtMasteringDisplayColourVolume* extBuf, mfxExecuteParams::HDR10MetaData& retHDR10MetaData) { retHDR10MetaData.enabled = true; for (int i = 0; i < 3; i++) { retHDR10MetaData.displayPrimariesX[i] = extBuf->DisplayPrimariesX[i]; retHDR10MetaData.displayPrimariesY[i] = extBuf->DisplayPrimariesY[i]; } retHDR10MetaData.whitePoint[0] = extBuf->WhitePointX; retHDR10MetaData.whitePoint[1] = extBuf->WhitePointY; retHDR10MetaData.maxMasteringLuminance = extBuf->MaxDisplayMasteringLuminance; retHDR10MetaData.minMasteringLuminance = extBuf->MinDisplayMasteringLuminance; }; mfxU32 curFilterId = pipelineList[j]; switch(curFilterId) { case MFX_EXTBUFF_VPP_DEINTERLACING: case MFX_EXTBUFF_VPP_DI: { /* this function also take into account is DI ext buffer present or does not */ executeParams.iDeinterlacingAlgorithm = GetDeinterlaceMode( videoParam, caps ); if (0 == executeParams.iDeinterlacingAlgorithm) { /* Tragically case, * Something wrong. User requested DI but MSDK can't do it */ return MFX_ERR_UNKNOWN; } if(MFX_DEINTERLACING_ADVANCED == executeParams.iDeinterlacingAlgorithm #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) || MFX_DEINTERLACING_ADVANCED_SCD == executeParams.iDeinterlacingAlgorithm #endif ) { // use motion adaptive ADI with reference frame (quality) config.m_bRefFrameEnable = true; config.m_extConfig.customRateData.fwdRefCount = 0; config.m_extConfig.customRateData.bkwdRefCount = 1; /* ref frame */ config.m_extConfig.customRateData.inputFramesOrFieldPerCycle= 1; config.m_extConfig.customRateData.outputIndexCountPerCycle = 1; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(1, config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = IS_REFERENCES; } else if (MFX_DEINTERLACING_ADVANCED_NOREF == executeParams.iDeinterlacingAlgorithm) { executeParams.iDeinterlacingAlgorithm = MFX_DEINTERLACING_ADVANCED_NOREF; config.m_bRefFrameEnable = false; config.m_extConfig.customRateData.fwdRefCount = 0; config.m_extConfig.customRateData.bkwdRefCount = 0; /* ref frame */ config.m_extConfig.customRateData.inputFramesOrFieldPerCycle= 1; config.m_extConfig.customRateData.outputIndexCountPerCycle = 1; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(1, config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = 0; } else if (0 == executeParams.iDeinterlacingAlgorithm) { bIsFilterSkipped = true; } config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_DI_WEAVE: { /* this function also take into account is DI ext buffer present or does not */ executeParams.iDeinterlacingAlgorithm = GetDeinterlaceMode( videoParam, caps ); if (0 == executeParams.iDeinterlacingAlgorithm) { /* Tragically case, * Something wrong. User requested DI but MSDK can't do it */ return MFX_ERR_UNKNOWN; } config.m_bWeave = true; executeParams.bFieldWeaving = true; if(MFX_DEINTERLACING_FIELD_WEAVING == executeParams.iDeinterlacingAlgorithm) { // use motion adaptive ADI with reference frame (quality) config.m_bRefFrameEnable = true; config.m_extConfig.customRateData.fwdRefCount = 0; config.m_extConfig.customRateData.bkwdRefCount = 1; /* ref frame */ config.m_extConfig.customRateData.inputFramesOrFieldPerCycle= 1; config.m_extConfig.customRateData.outputIndexCountPerCycle = 1; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(1, config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = IS_REFERENCES; } else { executeParams.iDeinterlacingAlgorithm = 0; bIsFilterSkipped = true; } config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_DI_30i60p: { /* this function also take into account is DI ext buffer present or does not */ executeParams.iDeinterlacingAlgorithm = GetDeinterlaceMode( videoParam, caps ); if (0 == executeParams.iDeinterlacingAlgorithm) { /* Tragically case, * Something wrong. User requested DI but MSDK can't do it */ return MFX_ERR_UNKNOWN; } config.m_bDisSkipQuery = true; config.m_bMode30i60pEnable = true; if(MFX_DEINTERLACING_ADVANCED == executeParams.iDeinterlacingAlgorithm #if defined(MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) || MFX_DEINTERLACING_ADVANCED_SCD == executeParams.iDeinterlacingAlgorithm #endif ) { // use motion adaptive ADI with reference frame (quality) config.m_bRefFrameEnable = true; config.m_extConfig.customRateData.bkwdRefCount = 1; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); executeParams.bFMDEnable = true; executeParams.bDeinterlace30i60p = true; } else if(MFX_DEINTERLACING_BOB == executeParams.iDeinterlacingAlgorithm) { // use ADI with spatial info, no reference frame (speed) config.m_bRefFrameEnable = false; config.m_surfCount[VPP_IN] = std::max(1, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); executeParams.bFMDEnable = false; executeParams.bDeinterlace30i60p = true; } else if (MFX_DEINTERLACING_ADVANCED_NOREF == executeParams.iDeinterlacingAlgorithm) { // use ADI with spatial info, no reference frame (speed) executeParams.iDeinterlacingAlgorithm = MFX_DEINTERLACING_ADVANCED_NOREF; config.m_bRefFrameEnable = false; config.m_surfCount[VPP_IN] = std::max(1, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); executeParams.bFMDEnable = false; executeParams.bDeinterlace30i60p = true; } else { executeParams.iDeinterlacingAlgorithm = 0; bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_DENOISE: { if (caps.uDenoiseFilter) { executeParams.bDenoiseAutoAdjust = TRUE; // set denoise settings for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DENOISE) { mfxExtVPPDenoise *extDenoise= (mfxExtVPPDenoise*) videoParam.ExtParam[i]; executeParams.denoiseFactor = MapDNFactor(extDenoise->DenoiseFactor ); executeParams.denoiseFactorOriginal = extDenoise->DenoiseFactor; executeParams.bDenoiseAutoAdjust = FALSE; } } } else { bIsFilterSkipped = true; } config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_DENOISE2: { if (caps.uDenoise2Filter) { // set denoise settings mfxExtVPPDenoise2* extDenoise = reinterpret_cast(mfx::GetExtBuffer(videoParam.ExtParam, videoParam.NumExtParam, MFX_EXTBUFF_VPP_DENOISE2)); if (extDenoise) { executeParams.denoiseMode = extDenoise->Mode; executeParams.denoiseStrength = extDenoise->Strength; executeParams.bdenoiseAdvanced = true; } } else { bIsFilterSkipped = true; } config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_ROTATION: { if (caps.uRotation) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_ROTATION) { mfxExtVPPRotation *extRotate = (mfxExtVPPRotation*) videoParam.ExtParam[i]; if ( (MFX_ANGLE_0 != extRotate->Angle) && (MFX_ANGLE_90 != extRotate->Angle) && (MFX_ANGLE_180 != extRotate->Angle) && (MFX_ANGLE_270 != extRotate->Angle) ) return MFX_ERR_INVALID_VIDEO_PARAM; if ( ( MFX_PICSTRUCT_FIELD_TFF & videoParam.vpp.Out.PicStruct ) || ( MFX_PICSTRUCT_FIELD_BFF & videoParam.vpp.Out.PicStruct ) ) return MFX_ERR_INVALID_VIDEO_PARAM; executeParams.rotation = extRotate->Angle; } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_SCALING: { if (caps.uScaling) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_SCALING) { mfxExtVPPScaling *extScaling = (mfxExtVPPScaling*) videoParam.ExtParam[i]; executeParams.scalingMode = extScaling->ScalingMode; executeParams.interpolationMethod = extScaling->InterpolationMethod; } } } else { bIsFilterSkipped = true; } config.m_bSupportLPLA = true; break; } case MFX_EXTBUFF_VPP_3DLUT: { if (caps.u3DLut) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_3DLUT) { mfxExtVPP3DLut *ext3DLUT = (mfxExtVPP3DLut*) videoParam.ExtParam[i]; if (ext3DLUT) { executeParams.lut3DInfo.Enabled = true; executeParams.lut3DInfo.ChannelMapping = ext3DLUT->ChannelMapping; executeParams.lut3DInfo.BufferType = ext3DLUT->BufferType; if (ext3DLUT->BufferType == MFX_RESOURCE_VA_SURFACE || ext3DLUT->BufferType == MFX_RESOURCE_DX11_TEXTURE) { executeParams.lut3DInfo.DataType = ext3DLUT->VideoBuffer.DataType; executeParams.lut3DInfo.MemLayout = ext3DLUT->VideoBuffer.MemLayout; executeParams.lut3DInfo.MemId = ext3DLUT->VideoBuffer.MemId; } else if(ext3DLUT->BufferType == MFX_RESOURCE_SYSTEM_SURFACE) { executeParams.lut3DInfo.Channel[0].Data = ext3DLUT->SystemBuffer.Channel[0].Data; executeParams.lut3DInfo.Channel[0].DataType = ext3DLUT->SystemBuffer.Channel[0].DataType; executeParams.lut3DInfo.Channel[0].Size = ext3DLUT->SystemBuffer.Channel[0].Size; executeParams.lut3DInfo.Channel[1].Data = ext3DLUT->SystemBuffer.Channel[1].Data; executeParams.lut3DInfo.Channel[1].DataType = ext3DLUT->SystemBuffer.Channel[1].DataType; executeParams.lut3DInfo.Channel[1].Size = ext3DLUT->SystemBuffer.Channel[1].Size; executeParams.lut3DInfo.Channel[2].Data = ext3DLUT->SystemBuffer.Channel[2].Data; executeParams.lut3DInfo.Channel[2].DataType = ext3DLUT->SystemBuffer.Channel[2].DataType; executeParams.lut3DInfo.Channel[2].Size = ext3DLUT->SystemBuffer.Channel[2].Size; } else { return MFX_ERR_UNSUPPORTED; } } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN: { if (caps.uVideoSignalInfoInOut) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN) { mfxExtVideoSignalInfo *extBuf = (mfxExtVideoSignalInfo*) videoParam.ExtParam[i]; if (extBuf) { executeParams.m_inVideoSignalInfo.enabled = true; executeParams.m_inVideoSignalInfo.VideoFormat = extBuf->VideoFormat; executeParams.m_inVideoSignalInfo.VideoFullRange = extBuf->VideoFullRange; executeParams.m_inVideoSignalInfo.ColourDescriptionPresent = extBuf->ColourDescriptionPresent; executeParams.m_inVideoSignalInfo.ColourPrimaries = extBuf->ColourPrimaries; executeParams.m_inVideoSignalInfo.TransferCharacteristics = extBuf->TransferCharacteristics; executeParams.m_inVideoSignalInfo.MatrixCoefficients = extBuf->MatrixCoefficients; } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT: { if (caps.uVideoSignalInfoInOut) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT) { mfxExtVideoSignalInfo *extBuf = (mfxExtVideoSignalInfo*) videoParam.ExtParam[i]; if (extBuf) { executeParams.m_outVideoSignalInfo.enabled = true; executeParams.m_outVideoSignalInfo.VideoFormat = extBuf->VideoFormat; executeParams.m_outVideoSignalInfo.VideoFullRange = extBuf->VideoFullRange; executeParams.m_outVideoSignalInfo.ColourDescriptionPresent = extBuf->ColourDescriptionPresent; executeParams.m_outVideoSignalInfo.ColourPrimaries = extBuf->ColourPrimaries; executeParams.m_outVideoSignalInfo.TransferCharacteristics = extBuf->TransferCharacteristics; executeParams.m_outVideoSignalInfo.MatrixCoefficients = extBuf->MatrixCoefficients; } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO: { if (caps.uHdr10ToneMapping) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO) { mfxExtContentLightLevelInfo* extBuf = (mfxExtContentLightLevelInfo*)videoParam.ExtParam[i]; if (extBuf) { executeParams.inHDR10MetaData.enabled = true; executeParams.inHDR10MetaData.maxContentLightLevel = extBuf->MaxContentLightLevel; executeParams.inHDR10MetaData.maxFrameAverageLightLevel = extBuf->MaxPicAverageLightLevel; } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN: { if (caps.uHdr10ToneMapping) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN) { mfxExtMasteringDisplayColourVolume* extBuf = (mfxExtMasteringDisplayColourVolume*)videoParam.ExtParam[i]; if (extBuf) { SetHdrMetaData(extBuf, executeParams.inHDR10MetaData); } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT: { if (caps.uHdr10ToneMapping) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT) { mfxExtMasteringDisplayColourVolume* extBuf = (mfxExtMasteringDisplayColourVolume*)videoParam.ExtParam[i]; if (extBuf) { SetHdrMetaData(extBuf, executeParams.outHDR10MetaData); } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_COLOR_CONVERSION: { if (caps.uChromaSiting ) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_COLOR_CONVERSION) { mfxExtColorConversion *extCC = (mfxExtColorConversion*)videoParam.ExtParam[i]; switch (extCC->ChromaSiting) { case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_TOP: case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_CENTER: case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_BOTTOM: case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_CENTER: case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_TOP: case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_BOTTOM: case MFX_CHROMA_SITING_UNKNOWN: // valid values break; default: //bad combination of flags return MFX_ERR_INVALID_VIDEO_PARAM; } executeParams.chromaSiting = extCC->ChromaSiting; } } } else { bIsFilterSkipped = true; } config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_MIRRORING: { if (caps.uMirroring) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_MIRRORING) { mfxExtVPPMirroring *extMirroring = (mfxExtVPPMirroring*) videoParam.ExtParam[i]; executeParams.mirroring = extMirroring->Type; switch (videoParam.IOPattern) { case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: executeParams.mirroringPosition = MIRROR_WO_EXEC; break; case MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: executeParams.mirroringPosition = MIRROR_INPUT; break; case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY: executeParams.mirroringPosition = MIRROR_OUTPUT; break; case MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY: executeParams.mirroringPosition = (videoParam.vpp.In.Width * videoParam.vpp.In.Height < videoParam.vpp.Out.Width * videoParam.vpp.Out.Height) ? MIRROR_INPUT : MIRROR_OUTPUT; break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_DETAIL: { if(caps.uDetailFilter) { executeParams.bDetailAutoAdjust = TRUE; executeParams.detailFactor = 32;// default for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DETAIL) { mfxExtVPPDetail *extDetail = (mfxExtVPPDetail*) videoParam.ExtParam[i]; executeParams.detailFactor = MapDNFactor(extDetail->DetailFactor); executeParams.detailFactorOriginal = extDetail->DetailFactor; executeParams.bDetailAutoAdjust = FALSE; } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_PROCAMP: { if(caps.uProcampFilter) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_PROCAMP) { mfxExtVPPProcAmp *extProcAmp = (mfxExtVPPProcAmp*) videoParam.ExtParam[i]; executeParams.Brightness = extProcAmp->Brightness; executeParams.Saturation = extProcAmp->Saturation; executeParams.Hue = extProcAmp->Hue; executeParams.Contrast = extProcAmp->Contrast; executeParams.bEnableProcAmp = true; } } } else { bIsFilterSkipped = true; } break; } case MFX_EXTBUFF_VPP_RESIZE: { break;// make sense for SW_VPP only } case MFX_EXTBUFF_VPP_CSC: case MFX_EXTBUFF_VPP_CSC_OUT_RGB4: case MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10: { break;// make sense for SW_VPP only } case MFX_EXTBUFF_VPP_RSHIFT_IN: case MFX_EXTBUFF_VPP_LSHIFT_OUT: { break;// make sense for SW_VPP only } case MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: { //default mode config.m_extConfig.mode = FRC_ENABLED | FRC_STANDARD; config.m_extConfig.frcRational[VPP_IN].FrameRateExtN = videoParam.vpp.In.FrameRateExtN; config.m_extConfig.frcRational[VPP_IN].FrameRateExtD = videoParam.vpp.In.FrameRateExtD; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtN = videoParam.vpp.Out.FrameRateExtN; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtD = videoParam.vpp.Out.FrameRateExtD; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); executeParams.frcModeOrig = static_cast(GetMFXFrcMode(videoParam)); inDNRatio = (mfxF64) videoParam.vpp.In.FrameRateExtD / videoParam.vpp.In.FrameRateExtN; outDNRatio = (mfxF64) videoParam.vpp.Out.FrameRateExtD / videoParam.vpp.Out.FrameRateExtN; config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_ITC: { // simulating inverse telecine by simple frame skipping and bob deinterlacing config.m_extConfig.mode = FRC_ENABLED | FRC_STANDARD; config.m_extConfig.frcRational[VPP_IN].FrameRateExtN = videoParam.vpp.In.FrameRateExtN; config.m_extConfig.frcRational[VPP_IN].FrameRateExtD = videoParam.vpp.In.FrameRateExtD; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtN = videoParam.vpp.Out.FrameRateExtN; config.m_extConfig.frcRational[VPP_OUT].FrameRateExtD = videoParam.vpp.Out.FrameRateExtD; inDNRatio = (mfxF64) videoParam.vpp.In.FrameRateExtD / videoParam.vpp.In.FrameRateExtN; outDNRatio = (mfxF64) videoParam.vpp.Out.FrameRateExtD / videoParam.vpp.Out.FrameRateExtN; executeParams.iDeinterlacingAlgorithm = MFX_DEINTERLACING_BOB; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); config.m_bDisSkipQuery = true; break; } case MFX_EXTBUFF_VPP_COMPOSITE: { mfxU32 StreamCount = 0; for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_COMPOSITE) { mfxExtVPPComposite* extComp = (mfxExtVPPComposite*)videoParam.ExtParam[i]; StreamCount = extComp->NumInputStream; if (executeParams.dstRects.empty()) { executeParams.initialStreamNum = StreamCount; } else { MFX_CHECK(StreamCount <= executeParams.initialStreamNum, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); } executeParams.dstRects.resize(StreamCount); executeParams.iTilesNum4Comp = extComp->NumTiles; for (mfxU32 cnt = 0; cnt < StreamCount; ++cnt) { DstRect rec = {}; rec.DstX = extComp->InputStream[cnt].DstX; rec.DstY = extComp->InputStream[cnt].DstY; rec.DstW = extComp->InputStream[cnt].DstW; rec.DstH = extComp->InputStream[cnt].DstH; rec.TileId = extComp->InputStream[cnt].TileId; if ((videoParam.vpp.Out.Width < (rec.DstX + rec.DstW)) || (videoParam.vpp.Out.Height < (rec.DstY + rec.DstH))) return MFX_ERR_INVALID_VIDEO_PARAM; // sub-stream is out of range if (extComp->InputStream[cnt].GlobalAlphaEnable != 0) { rec.GlobalAlphaEnable = extComp->InputStream[cnt].GlobalAlphaEnable; rec.GlobalAlpha = extComp->InputStream[cnt].GlobalAlpha; } if (extComp->InputStream[cnt].LumaKeyEnable != 0) { rec.LumaKeyEnable = extComp->InputStream[cnt].LumaKeyEnable; rec.LumaKeyMin = extComp->InputStream[cnt].LumaKeyMin; rec.LumaKeyMax = extComp->InputStream[cnt].LumaKeyMax; } if (extComp->InputStream[cnt].PixelAlphaEnable != 0) rec.PixelAlphaEnable = 1; executeParams.dstRects[cnt] = rec; } } } config.m_surfCount[VPP_IN] = std::max(mfxU16(StreamCount), config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(mfxU16(1), config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = COMPOSITE; config.m_extConfig.customRateData.bkwdRefCount = 0; config.m_extConfig.customRateData.fwdRefCount = StreamCount-1; // count only secondary streams config.m_extConfig.customRateData.inputFramesOrFieldPerCycle= StreamCount; config.m_extConfig.customRateData.outputIndexCountPerCycle = 1; config.m_multiBlt = false; // not applicable for Linux executeParams.bComposite = true; executeParams.bBackgroundRequired = true; /* by default background required */ /* Let's check: Does background required or not? * If tiling enabled VPP composition will skip background setting * bBackgroundRequired flag ignored on ddi level if tiling enabled * */ if (0 == executeParams.iTilesNum4Comp) { mfxU32 tCropW = videoParam.vpp.Out.CropW; mfxU32 tCropH = videoParam.vpp.Out.CropH; mfxU32 refCount = config.m_extConfig.customRateData.fwdRefCount; cRect t_rect; std::vector< cRect > rects; rects.reserve(refCount); for(mfxU32 i = 0; i < refCount+1; i++) { mfxI32 x1 = mid((mfxU32)0, executeParams.dstRects[i].DstX, tCropW); mfxI32 y1 = mid((mfxU32)0, executeParams.dstRects[i].DstY, tCropH); mfxI32 x2 = mid((mfxU32)0, executeParams.dstRects[i].DstX + executeParams.dstRects[i].DstW, tCropW); mfxI32 y2 = mid((mfxU32)0, executeParams.dstRects[i].DstY + executeParams.dstRects[i].DstH, tCropW); t_rect = cRect(x1, y1, x2, y2, 0, i); if ((t_rect.area() > 0) && (!executeParams.dstRects[i].PixelAlphaEnable)) rects.push_back(t_rect); } if(get_total_area(rects) == tCropW*tCropH) executeParams.bBackgroundRequired = false; } // if (executeParams.iTilesNum4Comp > 0) break; } case MFX_EXTBUFF_VPP_FIELD_PROCESSING: { /* As this filter for now can be configured via DOUSE way */ { executeParams.iFieldProcessingMode = FROM_RUNTIME_EXTBUFF_FIELD_PROC; } for (mfxU32 jj = 0; jj < videoParam.NumExtParam; jj++) { if (videoParam.ExtParam[jj]->BufferId == MFX_EXTBUFF_VPP_FIELD_PROCESSING) { mfxExtVPPFieldProcessing* extFP = (mfxExtVPPFieldProcessing*) videoParam.ExtParam[jj]; if (extFP->Mode == MFX_VPP_COPY_FRAME) { executeParams.iFieldProcessingMode = FRAME2FRAME; } if (extFP->Mode == MFX_VPP_COPY_FIELD) { if(extFP->InField == MFX_PICSTRUCT_FIELD_TFF) { executeParams.iFieldProcessingMode = (extFP->OutField == MFX_PICSTRUCT_FIELD_TFF) ? TFF2TFF : TFF2BFF; } else { executeParams.iFieldProcessingMode = (extFP->OutField == MFX_PICSTRUCT_FIELD_TFF) ? BFF2TFF : BFF2BFF; } } // kernel uses "0" as a "valid" data, but HW_VPP doesn't // to prevent issue we increment here and decrement before kernel call executeParams.iFieldProcessingMode++; } } break; } //case MFX_EXTBUFF_VPP_FIELD_PROCESSING: case MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO: for (mfxU32 jj = 0; jj < videoParam.NumExtParam; jj++) { if (videoParam.ExtParam[jj]->BufferId == MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO) { mfxExtVPPVideoSignalInfo* extVSI = (mfxExtVPPVideoSignalInfo*) videoParam.ExtParam[jj]; MFX_CHECK_NULL_PTR1(extVSI); /* Check params */ if (extVSI->In.TransferMatrix != MFX_TRANSFERMATRIX_BT601 && extVSI->In.TransferMatrix != MFX_TRANSFERMATRIX_BT709 && extVSI->In.TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (extVSI->Out.TransferMatrix != MFX_TRANSFERMATRIX_BT601 && extVSI->Out.TransferMatrix != MFX_TRANSFERMATRIX_BT709 && extVSI->Out.TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (extVSI->In.NominalRange != MFX_NOMINALRANGE_0_255 && extVSI->In.NominalRange != MFX_NOMINALRANGE_16_235 && extVSI->In.NominalRange != MFX_NOMINALRANGE_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (extVSI->Out.NominalRange != MFX_NOMINALRANGE_0_255 && extVSI->Out.NominalRange != MFX_NOMINALRANGE_16_235 && extVSI->Out.NominalRange != MFX_NOMINALRANGE_UNKNOWN) { return MFX_ERR_INVALID_VIDEO_PARAM; } /* Params look good */ executeParams.VideoSignalInfoIn.NominalRange = extVSI->In.NominalRange; executeParams.VideoSignalInfoIn.TransferMatrix = extVSI->In.TransferMatrix; executeParams.VideoSignalInfoIn.enabled = true; executeParams.VideoSignalInfoOut.NominalRange = extVSI->Out.NominalRange; executeParams.VideoSignalInfoOut.TransferMatrix = extVSI->Out.TransferMatrix; executeParams.VideoSignalInfoOut.enabled = true; break; } } config.m_bDisSkipQuery = true; break; case MFX_EXTBUFF_VPP_FIELD_WEAVING: { if (videoParam.vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) { if (videoParam.vpp.Out.PicStruct & MFX_PICSTRUCT_FIELD_TFF) { executeParams.iFieldProcessingMode = FIELD2TFF; } else if (videoParam.vpp.Out.PicStruct & MFX_PICSTRUCT_FIELD_BFF) { executeParams.iFieldProcessingMode = FIELD2BFF; } else { executeParams.iFieldProcessingMode = FROM_RUNTIME_PICSTRUCT; } } config.m_bWeave = true; config.m_bRefFrameEnable = true; config.m_extConfig.customRateData.bkwdRefCount = 1; config.m_extConfig.customRateData.fwdRefCount = 0; config.m_extConfig.customRateData.inputFramesOrFieldPerCycle = 1; config.m_extConfig.customRateData.outputIndexCountPerCycle = 1; config.m_surfCount[VPP_IN] = std::max(2, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(1, config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = IS_REFERENCES; executeParams.bFieldWeaving = true; // kernel uses "0" as a "valid" data, but HW_VPP doesn't. // To prevent an issue we increment here and decrement before kernel call. executeParams.iFieldProcessingMode++; break; } case MFX_EXTBUFF_VPP_FIELD_SPLITTING: { if (videoParam.vpp.Out.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) { if (videoParam.vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_TFF) { executeParams.iFieldProcessingMode = TFF2FIELD; } else if (videoParam.vpp.In.PicStruct & MFX_PICSTRUCT_FIELD_BFF) { executeParams.iFieldProcessingMode = BFF2FIELD; } else { executeParams.iFieldProcessingMode = FROM_RUNTIME_PICSTRUCT; } } config.m_extConfig.customRateData.bkwdRefCount = 0; config.m_extConfig.customRateData.fwdRefCount = 0; config.m_extConfig.customRateData.inputFramesOrFieldPerCycle = 1; config.m_extConfig.customRateData.outputIndexCountPerCycle = 2; config.m_surfCount[VPP_IN] = std::max(1, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(2, config.m_surfCount[VPP_OUT]); config.m_extConfig.mode = IS_REFERENCES; // kernel uses "0" as a "valid" data, but HW_VPP doesn't. // To prevent an issue we increment here and decrement before kernel call. executeParams.iFieldProcessingMode++; break; } #ifdef MFX_ENABLE_MCTF case MFX_EXTBUFF_VPP_MCTF: { executeParams.bEnableMctf = true; // need to analyze uMCTF? mfxU16 MCTF_requiredFrames_In(1), MCTF_requiredFrames_Out(1); for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_MCTF) { mfxExtVppMctf *extMCTF = (mfxExtVppMctf*)videoParam.ExtParam[i]; // if number of min requred frames for MCTF is 2, but async-depth == 1, // should we increase number of input / output surfaces to prevent hangs? executeParams.MctfFilterStrength = extMCTF->FilterStrength; switch (CMC::DEFAULT_REFS) { case MCTF_TEMPORAL_MODE_SPATIAL: case MCTF_TEMPORAL_MODE_1REF: { MCTF_requiredFrames_In = 1; MCTF_requiredFrames_Out = 1; break; } case MCTF_TEMPORAL_MODE_2REF: { MCTF_requiredFrames_In = 2; MCTF_requiredFrames_Out = 2; break; } case MCTF_TEMPORAL_MODE_4REF: { MCTF_requiredFrames_In = 3; MCTF_requiredFrames_Out = 3; break; } default: return MFX_ERR_UNDEFINED_BEHAVIOR; break; } config.m_surfCount[VPP_IN] = std::max(MCTF_requiredFrames_In, config.m_surfCount[VPP_IN]); config.m_surfCount[VPP_OUT] = std::max(MCTF_requiredFrames_Out, config.m_surfCount[VPP_OUT]); break; } } break; } #endif #if defined (ONEVPL_EXPERIMENTAL) case MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER: //perceptual encoding prefilter is compatible only with resize filter if( pipelineList.size() == 2 && ( pipelineList[0]==MFX_EXTBUFF_VPP_RESIZE || pipelineList[1]==MFX_EXTBUFF_VPP_RESIZE )){ executeParams.bEnablePercEncFilter = true; } else { bIsFilterSkipped = true; } break; #endif default: { // there is no such capabilities bIsFilterSkipped = true; break; } }//switch(curFilterId) } // for (mfxU32 i = 0; i < filtersNum; i += 1) //----------------------------------------------------- // disabling filters for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (MFX_EXTBUFF_VPP_DONOTUSE == videoParam.ExtParam[i]->BufferId) { mfxExtVPPDoNotUse* extDoNotUse = (mfxExtVPPDoNotUse*) videoParam.ExtParam[i]; MFX_CHECK_NULL_PTR1(extDoNotUse); for (mfxU32 j = 0; j < extDoNotUse->NumAlg; j++) { mfxU32 bufferId = extDoNotUse->AlgList[j]; if (MFX_EXTBUFF_VPP_DENOISE == bufferId) { executeParams.bDenoiseAutoAdjust = false; executeParams.denoiseFactor = 0; executeParams.denoiseFactorOriginal = 0; } else if (MFX_EXTBUFF_VPP_DENOISE2 == bufferId) { executeParams.denoiseMode = MFX_DENOISE_MODE_DEFAULT; executeParams.denoiseStrength = 0; executeParams.bdenoiseAdvanced = false; } else if (MFX_EXTBUFF_VPP_SCENE_ANALYSIS == bufferId) { } else if (MFX_EXTBUFF_VPP_DETAIL == bufferId) { executeParams.bDetailAutoAdjust = false; executeParams.detailFactor = 0; executeParams.detailFactorOriginal = 0; } else if (MFX_EXTBUFF_VPP_PROCAMP == bufferId) { executeParams.bEnableProcAmp = false; executeParams.Brightness = 0; executeParams.Contrast = 0; executeParams.Hue = 0; executeParams.Saturation = 0; } else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO == bufferId) { executeParams.VideoSignalInfoIn.NominalRange = MFX_NOMINALRANGE_UNKNOWN; executeParams.VideoSignalInfoIn.TransferMatrix = MFX_TRANSFERMATRIX_UNKNOWN; executeParams.VideoSignalInfoOut.NominalRange = MFX_NOMINALRANGE_UNKNOWN; executeParams.VideoSignalInfoOut.TransferMatrix = MFX_TRANSFERMATRIX_UNKNOWN; } else if (MFX_EXTBUFF_VPP_COMPOSITE == bufferId) { executeParams.bComposite = false; executeParams.dstRects.clear(); } else if (MFX_EXTBUFF_VPP_FIELD_PROCESSING == bufferId) { executeParams.iFieldProcessingMode = 0; } else if (MFX_EXTBUFF_VPP_ROTATION == bufferId) { executeParams.rotation = MFX_ANGLE_0; } else if (MFX_EXTBUFF_VPP_SCALING == bufferId) { executeParams.scalingMode = MFX_SCALING_MODE_DEFAULT; } else if (MFX_EXTBUFF_VPP_3DLUT == bufferId) { executeParams.lut3DInfo.Enabled = false; } else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN== bufferId) { executeParams.m_inVideoSignalInfo.enabled = false; } else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT== bufferId) { executeParams.m_outVideoSignalInfo.enabled = false; } else if (MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN== bufferId) { executeParams.inHDR10MetaData.enabled = false; } else if (MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT== bufferId) { executeParams.outHDR10MetaData.enabled = false; } else if (MFX_EXTBUFF_VPP_COLOR_CONVERSION == bufferId) { executeParams.chromaSiting = MFX_CHROMA_SITING_UNKNOWN; } else if (MFX_EXTBUFF_VPP_MIRRORING == bufferId) { executeParams.mirroring = MFX_MIRRORING_DISABLED; } else if (MFX_EXTBUFF_VPP_IMAGE_STABILIZATION == bufferId) { executeParams.bImgStabilizationEnable = false; executeParams.istabMode = 0; } else if (MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO == bufferId) { executeParams.VideoSignalInfoIn.NominalRange = MFX_NOMINALRANGE_UNKNOWN; executeParams.VideoSignalInfoIn.TransferMatrix = MFX_TRANSFERMATRIX_UNKNOWN; executeParams.VideoSignalInfoIn.enabled = false; executeParams.VideoSignalInfoOut.NominalRange = MFX_NOMINALRANGE_UNKNOWN; executeParams.VideoSignalInfoOut.TransferMatrix = MFX_TRANSFERMATRIX_UNKNOWN; executeParams.VideoSignalInfoOut.enabled = false; } #ifdef MFX_ENABLE_MCTF else if (MFX_EXTBUFF_VPP_MCTF == bufferId) { executeParams.bEnableMctf = false; } #endif else { // filter cannot be disabled return MFX_ERR_INVALID_VIDEO_PARAM; } } } } // Post Correction Params if(MFX_FRCALGM_DISTRIBUTED_TIMESTAMP == GetMFXFrcMode(videoParam)) { config.m_extConfig.mode = FRC_ENABLED | FRC_DISTRIBUTED_TIMESTAMP; if (config.m_bMode30i60pEnable) { config.m_extConfig.mode = FRC_DISABLED | FRC_DISTRIBUTED_TIMESTAMP; } } if (inDNRatio == outDNRatio && !executeParams.bVarianceEnable && !executeParams.bComposite && !(config.m_extConfig.mode == IS_REFERENCES) ) { // work around config.m_extConfig.mode = FRC_DISABLED; //config.m_bCopyPassThroughEnable = false; } if (true == executeParams.bComposite && 0 == executeParams.dstRects.size()) // composition was enabled via DO USE return MFX_ERR_INVALID_VIDEO_PARAM; // A2RGB10 input supported only to copy pass thru MFX_CHECK(!(!config.m_bCopyPassThroughEnable && videoParam.vpp.In.FourCC == MFX_FOURCC_A2RGB10), MFX_ERR_INVALID_VIDEO_PARAM); return (bIsFilterSkipped) ? MFX_WRN_FILTER_SKIPPED : MFX_ERR_NONE; } // mfxStatus ConfigureExecuteParams(...) //--------------------------------------------------------- // UTILS //--------------------------------------------------------- VideoVPPHW::IOMode VideoVPPHW::GetIOMode( mfxVideoParam *par) { IOMode mode = VideoVPPHW::ALL; switch (par->IOPattern) { case MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY: mode = VideoVPPHW::SYS_TO_SYS; break; case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_SYSTEM_MEMORY: mode = VideoVPPHW::D3D_TO_SYS; break; case MFX_IOPATTERN_IN_SYSTEM_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: mode = VideoVPPHW::SYS_TO_D3D; break; case MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY: mode = VideoVPPHW::D3D_TO_D3D; break; }// switch ioPattern return mode; } // IOMode VideoVPPHW::GetIOMode(...) mfxStatus CheckIOMode(mfxVideoParam *par, VideoVPPHW::IOMode mode) { switch (mode) { case VideoVPPHW::D3D_TO_D3D: if (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY || par->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY) return MFX_ERR_UNSUPPORTED; break; case VideoVPPHW::D3D_TO_SYS: if (par->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY || par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) return MFX_ERR_UNSUPPORTED; break; case VideoVPPHW::SYS_TO_D3D: if (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY || par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) return MFX_ERR_UNSUPPORTED; break; case VideoVPPHW::SYS_TO_SYS: if (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY || par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) return MFX_ERR_UNSUPPORTED; break; case VideoVPPHW::ALL: return MFX_ERR_NONE; break; default: return MFX_ERR_UNSUPPORTED; } return MFX_ERR_NONE; } // mfxStatus CheckIOMode(mfxVideoParam *par, IOMode mode) mfxU32 GetMFXFrcMode(const mfxVideoParam & videoParam) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION) { mfxExtVPPFrameRateConversion *extFrc = (mfxExtVPPFrameRateConversion *) videoParam.ExtParam[i]; return extFrc->Algorithm; } } for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DOUSE) { mfxExtVPPDoUse *extDoUse = (mfxExtVPPDoUse *) videoParam.ExtParam[i]; for (mfxU32 j = 0; j < extDoUse->NumAlg; j++) { if (extDoUse->AlgList[j] == MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION) { return MFX_FRCALGM_PRESERVE_TIMESTAMP; } } } } return 0;//EMPTY } // mfxU32 GetMFXFrcMode(mfxVideoParam & videoParam) mfxStatus SetMFXFrcMode(const mfxVideoParam & videoParam, mfxU32 mode) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION) { mfxExtVPPFrameRateConversion *extFrc = (mfxExtVPPFrameRateConversion *) videoParam.ExtParam[i]; extFrc->Algorithm = (mfxU16)mode; return MFX_ERR_NONE; } } return MFX_WRN_VALUE_NOT_CHANGED; } // mfxStatus SetMFXFrcMode(const mfxVideoParam & videoParam, mfxU32 mode) mfxStatus SetMFXISMode(const mfxVideoParam & videoParam, mfxU32 mode) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_IMAGE_STABILIZATION) { mfxExtVPPImageStab *extFrc = (mfxExtVPPImageStab *) videoParam.ExtParam[i]; extFrc->Mode = (mfxU16)mode; return MFX_ERR_NONE; } } return MFX_WRN_VALUE_NOT_CHANGED; } // mfxStatus SetMFXISMode(const mfxVideoParam & videoParam, mfxU32 mode) mfxU32 GetDeinterlacingMode(const mfxVideoParam & videoParam) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DEINTERLACING) { mfxExtVPPDeinterlacing *extDeinterlacing = (mfxExtVPPDeinterlacing *) videoParam.ExtParam[i]; return extDeinterlacing->Mode; } } return 0;//EMPTY } // mfxStatus GetDeinterlacingMode(const mfxVideoParam & videoParam, mfxU32 mode) mfxStatus SetDeinterlacingMode(const mfxVideoParam & videoParam, mfxU32 mode) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DEINTERLACING) { mfxExtVPPDeinterlacing *extDeinterlacing = (mfxExtVPPDeinterlacing *) videoParam.ExtParam[i]; extDeinterlacing->Mode = (mfxU16)mode; return MFX_ERR_NONE; } } return MFX_WRN_VALUE_NOT_CHANGED; } // mfxStatus SetDeinterlacingMode(const mfxVideoParam & videoParam, mfxU32 mode) mfxStatus SetSignalInfo(const mfxVideoParam & videoParam, mfxU32 trMatrix, mfxU32 Range) { for (mfxU32 i = 0; i < videoParam.NumExtParam; i++) { if (videoParam.ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO) { mfxExtVPPVideoSignalInfo *extDeinterlacing = (mfxExtVPPVideoSignalInfo *) videoParam.ExtParam[i]; extDeinterlacing->In.TransferMatrix = (mfxU16)trMatrix; extDeinterlacing->In.NominalRange = (mfxU16)Range; extDeinterlacing->Out.TransferMatrix = (mfxU16)trMatrix; extDeinterlacing->Out.NominalRange = (mfxU16)Range; return MFX_ERR_NONE; } } return MFX_WRN_VALUE_NOT_CHANGED; } // mfxStatus SetMFXFrcMode(const mfxVideoParam & videoParam, mfxU32 mode) MfxFrameAllocResponse::MfxFrameAllocResponse() : m_core (0) , m_numFrameActualReturnedByAllocFrames(0) { Zero(dynamic_cast(*this)); } // MfxFrameAllocResponse::MfxFrameAllocResponse() mfxStatus MfxFrameAllocResponse::Free( void ) { if (m_core == 0) return MFX_ERR_NONE; if (MFX_HW_D3D11 == m_core->GetVAType()) { for (size_t i = 0; i < m_responseQueue.size(); i++) { m_core->FreeFrames(&m_responseQueue[i]); } m_responseQueue.clear(); } else { if (mids) { NumFrameActual = m_numFrameActualReturnedByAllocFrames; m_core->FreeFrames(this); } } return MFX_ERR_NONE; } // mfxStatus MfxFrameAllocResponse::Free( void ) MfxFrameAllocResponse::~MfxFrameAllocResponse() { Free(); } // MfxFrameAllocResponse::~MfxFrameAllocResponse() mfxStatus MfxFrameAllocResponse::Alloc( VideoCORE * core, mfxFrameAllocRequest & req, bool isCopyReqiured) { req.NumFrameSuggested = req.NumFrameMin; // no need in 2 different NumFrames { mfxStatus sts = core->AllocFrames(&req, this, isCopyReqiured); MFX_CHECK_STS(sts); } if (NumFrameActual < req.NumFrameMin) return MFX_ERR_MEMORY_ALLOC; m_core = core; m_numFrameActualReturnedByAllocFrames = NumFrameActual; NumFrameActual = req.NumFrameMin; // no need in redundant frames return MFX_ERR_NONE; } mfxStatus MfxFrameAllocResponse::Alloc( VideoCORE * core , mfxFrameAllocRequest & req ) { req.NumFrameSuggested = req.NumFrameMin; // no need in 2 different NumFrames mfxStatus sts = core->AllocFrames(&req , this ); MFX_CHECK_STS(sts); if (NumFrameActual < req.NumFrameMin) return MFX_ERR_MEMORY_ALLOC; m_core = core; m_numFrameActualReturnedByAllocFrames = NumFrameActual; NumFrameActual = req.NumFrameMin; // no need in redundant frames return MFX_ERR_NONE; } mfxStatus CopyFrameDataBothFields( VideoCORE * core, mfxMemId dstMid, mfxFrameSurface1* srcSurf, mfxFrameInfo const & info) { mfxFrameSurface1 sysSurf = MakeSurface(info, *srcSurf); sysSurf.Data.MemId = 0; FrameLocker lock2(core, srcSurf->Data, true); MFX_CHECK(srcSurf->Data.Y != 0, MFX_ERR_LOCK_MEMORY); mfxFrameData dstData{}; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Surface lock (output frame)"); FrameLocker lock(core, dstData, dstMid); MFX_CHECK(dstData.Y != 0, MFX_ERR_LOCK_MEMORY); MFX_AUTO_TRACE_STOP(); mfxFrameSurface1 vidSurf{}; vidSurf.Info = info; vidSurf.Data = dstData; return core->DoFastCopyExtended(&vidSurf, &sysSurf); } // mfxStatus CopyFrameDataBothFields( #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_jpeg.cpp000066400000000000000000000410051443134507600271410ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include "umc_va_base.h" #include "libmfx_core.h" #include "mfx_task.h" #include "mfx_vpp_defs.h" #include "mfx_vpp_jpeg.h" using namespace MfxHwVideoProcessing; static void MemSetZero4mfxExecuteParams (mfxExecuteParams *pMfxExecuteParams ) { memset(&pMfxExecuteParams->targetSurface, 0, sizeof(mfxDrvSurface)); pMfxExecuteParams->pRefSurfaces = NULL; pMfxExecuteParams->dstRects.clear(); memset(&pMfxExecuteParams->customRateData, 0, sizeof(CustomRateData)); pMfxExecuteParams->targetTimeStamp = 0; pMfxExecuteParams->refCount = 0; pMfxExecuteParams->bkwdRefCount = 0; pMfxExecuteParams->fwdRefCount = 0; pMfxExecuteParams->iDeinterlacingAlgorithm = 0; pMfxExecuteParams->bFMDEnable = 0; pMfxExecuteParams->bDenoiseAutoAdjust = 0; pMfxExecuteParams->bDetailAutoAdjust = 0; pMfxExecuteParams->denoiseFactor = 0; pMfxExecuteParams->detailFactor = 0; pMfxExecuteParams->iTargetInterlacingMode = 0; pMfxExecuteParams->bEnableProcAmp = false; pMfxExecuteParams->Brightness = 0; pMfxExecuteParams->Contrast = 0; pMfxExecuteParams->Hue = 0; pMfxExecuteParams->Saturation = 0; pMfxExecuteParams->bVarianceEnable = false; pMfxExecuteParams->bImgStabilizationEnable = false; pMfxExecuteParams->istabMode = 0; pMfxExecuteParams->bFRCEnable = false; pMfxExecuteParams->bComposite = false; pMfxExecuteParams->iBackgroundColor = 0; pMfxExecuteParams->statusReportID = 0; pMfxExecuteParams->bFieldWeaving = false; pMfxExecuteParams->iFieldProcessingMode = 0; pMfxExecuteParams->rotation = 0; pMfxExecuteParams->scalingMode = MFX_SCALING_MODE_DEFAULT; pMfxExecuteParams->bEOS = false; } /*void MemSetZero4mfxExecuteParams (mfxExecuteParams *pMfxExecuteParams )*/ enum QueryStatus { VPREP_GPU_READY = 0, VPREP_GPU_BUSY = 1, VPREP_GPU_NOT_REACHED = 2, VPREP_GPU_FAILED = 3 }; enum { CURRENT_TIME_STAMP = 100000, FRAME_INTERVAL = 10000, ACCEPTED_DEVICE_ASYNC_DEPTH = 0x06, }; VideoVppJpeg::VideoVppJpeg(VideoCORE *core, bool useInternalMem) : m_pCore(core) , m_IOPattern() , m_bUseInternalMem(useInternalMem) , m_taskId(1) #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP , m_rotation(0) #endif , m_surfaces() , m_guard() , AssocIdx() , m_ddi() { memset(&m_response, 0, sizeof(mfxFrameAllocResponse)); } // VideoVppJpeg::VideoVppJpeg(VideoCORE *core) VideoVppJpeg::~VideoVppJpeg() { Close(); } // VideoVppJpeg::~VideoVppJpeg() mfxStatus VideoVppJpeg::Init(const mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; if (m_bUseInternalMem) { mfxFrameAllocRequest request; memset(&request, 0, sizeof(request)); memset(&m_response, 0, sizeof(m_response)); mfxU32 asyncDepth = (par->AsyncDepth ? par->AsyncDepth : m_pCore->GetAutoAsyncDepth()); request.Info = par->mfx.FrameInfo; request.NumFrameMin = mfxU16 (asyncDepth); request.NumFrameSuggested = request.NumFrameMin; request.Type = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET | MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_INTERNAL_FRAME; sts = m_pCore->AllocFrames(&request, &m_response, true); MFX_CHECK_STS(sts); m_surfaces.resize(m_response.NumFrameActual); for (mfxU32 i = 0; i < m_response.NumFrameActual; i++) { m_surfaces[i].Data.MemId = m_response.mids[i]; m_surfaces[i].Info = request.Info; } } sts = MFX_ERR_NONE; if (!m_ddi.GetDevice()) { sts = m_ddi.CreateDevice(m_pCore); } if (sts != 0) { return MFX_ERR_INVALID_VIDEO_PARAM; } mfxVppCaps caps; caps = m_ddi.GetCaps(); #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP if (caps.uRotation) { switch(par->mfx.Rotation) { case MFX_ROTATION_0: m_rotation = MFX_ANGLE_0; break; case MFX_ROTATION_90: m_rotation = MFX_ANGLE_90; break; case MFX_ROTATION_180: m_rotation = MFX_ANGLE_180; break; case MFX_ROTATION_270: m_rotation = MFX_ANGLE_270; break; } } else { if(MFX_ROTATION_0 != par->mfx.Rotation) return MFX_ERR_INVALID_VIDEO_PARAM; } #endif if(par->vpp.In.Width > caps.uMaxWidth || par->vpp.In.Height > caps.uMaxHeight || par->vpp.Out.Width > caps.uMaxWidth || par->vpp.Out.Height > caps.uMaxHeight) { return MFX_ERR_INVALID_VIDEO_PARAM; } if( par->mfx.FrameInfo.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && FALSE == caps.uFieldWeavingControl) { return MFX_ERR_INVALID_VIDEO_PARAM; } m_IOPattern = par->IOPattern; return sts; } // mfxStatus VideoVppJpeg::Init(void) mfxStatus VideoVppJpeg::Close() { mfxStatus sts = MFX_ERR_NONE; m_taskId = 1; m_ddi.Close(); if(m_bUseInternalMem) { m_surfaces.clear(); if (m_response.NumFrameActual) { sts = m_pCore->FreeFrames(&m_response, true); MFX_CHECK_STS(sts); } m_bUseInternalMem = false; } return MFX_ERR_NONE; } // mfxStatus VideoVppJpeg::Close() mfxStatus VideoVppJpeg::BeginHwJpegProcessing(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface, mfxU16* taskId) { mfxStatus sts = MFX_ERR_NONE; mfxHDLPair hdl; mfxHDLPair in; mfxHDLPair out; MfxHwVideoProcessing::mfxDrvSurface m_pExecuteSurface; MfxHwVideoProcessing::mfxExecuteParams m_executeParams; memset(&m_pExecuteSurface, 0, sizeof(MfxHwVideoProcessing::mfxDrvSurface)); if(m_bUseInternalMem) { mfxI32 index = -1; for (mfxU32 i = 0; i < m_surfaces.size(); i++) { if (!m_surfaces[i].Data.Locked) { index = i; } } if (index == -1) { return MFX_ERR_LOCK_MEMORY; } m_pCore->IncreasePureReference(m_surfaces[index].Data.Locked); MFX_SAFE_CALL(m_pCore->GetFrameHDL(m_surfaces[index], hdl)); { UMC::AutomaticUMCMutex guard(m_guard); AssocIdx.insert(std::pair(pInputSurface->Data.MemId, index)); } } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*pOutputSurface, hdl)); } out = hdl; // register output surface sts = (m_ddi)->Register(&out, 1, TRUE); MFX_CHECK_STS(sts); MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurface, hdl)); in = hdl; // register input surface sts = (m_ddi)->Register(&in, 1, TRUE); MFX_CHECK_STS(sts); // set input surface m_pExecuteSurface.hdl = static_cast(in); m_pExecuteSurface.frameInfo = pInputSurface->Info; // prepare the primary video sample m_pExecuteSurface.startTimeStamp = m_taskId * CURRENT_TIME_STAMP; m_pExecuteSurface.endTimeStamp = m_taskId * CURRENT_TIME_STAMP + FRAME_INTERVAL; m_executeParams.targetTimeStamp = m_taskId * CURRENT_TIME_STAMP; m_executeParams.targetSurface.memId = pOutputSurface->Data.MemId; m_executeParams.targetSurface.hdl = static_cast(out); m_executeParams.targetSurface.frameInfo = pOutputSurface->Info; m_executeParams.refCount = 1; m_executeParams.pRefSurfaces = &m_pExecuteSurface; #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP m_executeParams.rotation = m_rotation; #endif m_executeParams.statusReportID = m_taskId; *taskId = m_taskId; m_taskId += 1; sts = (m_ddi)->Execute(&m_executeParams); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VideoVppJpeg::BeginHwJpegProcessing(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface, mfxU16* taskId) mfxStatus VideoVppJpeg::BeginHwJpegProcessing(mfxFrameSurface1 *pInputSurfaceTop, mfxFrameSurface1 *pInputSurfaceBottom, mfxFrameSurface1 *pOutputSurface, mfxU16* taskId) { mfxStatus sts = MFX_ERR_NONE; mfxHDLPair hdl; mfxHDLPair inTop,inBottom; mfxHDLPair out; MfxHwVideoProcessing::mfxDrvSurface m_pExecuteSurface[2]; MfxHwVideoProcessing::mfxExecuteParams m_executeParams; memset(&m_pExecuteSurface[0], 0, sizeof(MfxHwVideoProcessing::mfxDrvSurface)); memset(&m_pExecuteSurface[1], 0, sizeof(MfxHwVideoProcessing::mfxDrvSurface)); MemSetZero4mfxExecuteParams(&m_executeParams); if(m_bUseInternalMem) { mfxI32 index = -1; for (mfxU32 i = 0; i < m_surfaces.size(); i++) { if (!m_surfaces[i].Data.Locked) { index = i; } } if (index == -1) { return MFX_ERR_LOCK_MEMORY; } m_pCore->IncreasePureReference(m_surfaces[index].Data.Locked); MFX_SAFE_CALL(m_pCore->GetFrameHDL(m_surfaces[index], hdl)); { UMC::AutomaticUMCMutex guard(m_guard); AssocIdx.insert(std::pair(pInputSurfaceTop->Data.MemId, index)); } } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*pOutputSurface, hdl)); } out = hdl; // register output surface sts = (m_ddi)->Register(&out, 1, TRUE); MFX_CHECK_STS(sts); MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurfaceTop, hdl)); inTop = hdl; MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurfaceBottom, hdl)); inBottom = hdl; // register input surfaces sts = (m_ddi)->Register(&inTop, 1, TRUE); MFX_CHECK_STS(sts); sts = (m_ddi)->Register(&inBottom, 1, TRUE); MFX_CHECK_STS(sts); // set input surface m_pExecuteSurface[0].hdl = static_cast(inBottom); m_pExecuteSurface[0].frameInfo = pInputSurfaceBottom->Info; m_pExecuteSurface[1].hdl = static_cast(inTop); m_pExecuteSurface[1].frameInfo = pInputSurfaceTop->Info; // prepare the primary video sample m_pExecuteSurface[0].startTimeStamp = m_taskId + 1; m_pExecuteSurface[0].endTimeStamp = m_taskId + 1; m_pExecuteSurface[1].startTimeStamp = m_taskId; m_pExecuteSurface[1].endTimeStamp = m_taskId; m_executeParams.targetTimeStamp = m_taskId; m_executeParams.targetSurface.hdl = static_cast(out); m_executeParams.targetSurface.frameInfo = pOutputSurface->Info; m_executeParams.refCount = 2; m_executeParams.pRefSurfaces = m_pExecuteSurface; m_executeParams.statusReportID = m_taskId; m_executeParams.bFieldWeaving = true; m_executeParams.bkwdRefCount = 1; *taskId = m_taskId; m_taskId += 1; sts = (m_ddi)->Execute(&m_executeParams); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } // mfxStatus VideoVppJpeg::BeginHwJpegProcessing(mfxFrameSurface1 *pInputSurfaceTop, mfxFrameSurface1 *pInputSurfaceBottom, mfxFrameSurface1 *pOutputSurface, mfxU16* taskId) mfxStatus VideoVppJpeg::EndHwJpegProcessing(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface) { mfxStatus sts = MFX_ERR_NONE; mfxHDLPair hdl; mfxHDLPair in; mfxHDLPair out; mfxI32 index = -1; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_PRIVATE, "EndHwJpegProcessing"); if(m_bUseInternalMem) { { UMC::AutomaticUMCMutex guard(m_guard); auto it = AssocIdx.find(pInputSurface->Data.MemId); if(it != AssocIdx.end()) { index = it->second; AssocIdx.erase(it); } } MFX_SAFE_CALL(m_pCore->GetFrameHDL(m_surfaces[index], hdl)); } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*pOutputSurface, hdl)); } out = hdl; MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurface, hdl)); in = hdl; if (m_bUseInternalMem) { mfxU16 outMemType = static_cast((m_IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); sts = m_pCore->DoFastCopyWrapper(pOutputSurface, outMemType, &m_surfaces[index], MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET); MFX_CHECK_STS(sts); } // unregister output surface sts = (m_ddi)->Register(&out, 1, FALSE); MFX_CHECK_STS(sts); // unregister input surface sts = (m_ddi)->Register(&in, 1, FALSE); MFX_CHECK_STS(sts); if(m_bUseInternalMem) { m_pCore->DecreasePureReference(m_surfaces[index].Data.Locked); } return MFX_ERR_NONE; } // mfxStatus VideoVppJpeg::EndHwJpegProcessing(mfxFrameSurface1 *pInputSurface, mfxFrameSurface1 *pOutputSurface) mfxStatus VideoVppJpeg::EndHwJpegProcessing(mfxFrameSurface1 *pInputSurfaceTop, mfxFrameSurface1 *pInputSurfaceBottom, mfxFrameSurface1 *pOutputSurface) { mfxStatus sts = MFX_ERR_NONE; mfxHDLPair hdl; mfxHDLPair inTop,inBottom; mfxHDLPair out; mfxI32 index = -1; if(m_bUseInternalMem) { { UMC::AutomaticUMCMutex guard(m_guard); auto it = AssocIdx.find(pInputSurfaceTop->Data.MemId); if(it != AssocIdx.end()) { index = it->second; AssocIdx.erase(it); } } MFX_SAFE_CALL(m_pCore->GetFrameHDL(m_surfaces[index], hdl)); } else { MFX_SAFE_CALL(m_pCore->GetExternalFrameHDL(*pOutputSurface, hdl)); } out = hdl; MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurfaceTop, hdl)); inTop = hdl; MFX_SAFE_CALL(m_pCore->GetFrameHDL(*pInputSurfaceBottom, hdl)); inBottom = hdl; if (m_bUseInternalMem) { mfxU16 outMemType = static_cast((m_IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); sts = m_pCore->DoFastCopyWrapper(pOutputSurface, outMemType, &m_surfaces[index], MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET ); MFX_CHECK_STS(sts); } // unregister output surface sts = (m_ddi)->Register(&out, 1, FALSE); MFX_CHECK_STS(sts); // unregister input surface sts = (m_ddi)->Register(&inTop, 1, FALSE); MFX_CHECK_STS(sts); sts = (m_ddi)->Register(&inBottom, 1, FALSE); MFX_CHECK_STS(sts); if(m_bUseInternalMem) { m_pCore->DecreasePureReference(m_surfaces[index].Data.Locked); } return MFX_ERR_NONE; } // mfxStatus VideoVppJpeg::EndHwJpegProcessing(mfxFrameSurface1 *pInputSurfaceTop, mfxFrameSurface1 *pInputSurfaceBottom, mfxFrameSurface1 *pOutputSurface) mfxStatus VideoVppJpeg::QueryTaskRoutine(mfxU16 taskId) { mfxStatus sts = MFX_ERR_NONE; SynchronizedTask task={}; task.taskIndex = taskId; sts = (m_ddi)->QueryTaskStatus(&task); return sts; } // mfxStatus VideoVppJpeg::QueryTask(mfxU16 taskId) #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_main.cpp000066400000000000000000000112011443134507600271330ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "math.h" #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_enc_common.h" #include "mfx_session.h" #include "mfxmvc.h" #include "mfx_vpp_utils.h" #include "mfx_vpp_main.h" #include "mfx_vpp_sw.h" #include "mfx_vpp_mvc.h" using namespace MfxVideoProcessing; /* ******************************************************************** */ /* Main (High Level) Class of MSDK VPP */ /* ******************************************************************** */ mfxStatus VideoVPPMain::Query(VideoCORE* core, mfxVideoParam *in, mfxVideoParam *out) { return ImplementationMvc::Query(core, in, out); } // mfxStatus VideoVPPMain::Query(VideoCORE* core, mfxVideoParam *in, mfxVideoParam *out) mfxStatus VideoVPPMain::QueryIOSurf(VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest *request) { return ImplementationMvc::QueryIOSurf(core, par, request); } // mfxStatus VideoVPPMain::QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request, const mfxU32 adapterNum) VideoVPPMain::VideoVPPMain(VideoCORE *core, mfxStatus* sts ) : m_core( core ) { *sts = MFX_ERR_NONE; } // VideoVPPMain::VideoVPPMain(VideoCORE *core, mfxStatus* sts ) VideoVPPMain::~VideoVPPMain() { Close(); } // VideoVPPMain::~VideoVPPMain() mfxStatus VideoVPPMain::Init(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1( par ); mfxStatus internalSts = MFX_ERR_NONE; if( m_impl.get() ) { return MFX_ERR_UNDEFINED_BEHAVIOR; } std::unique_ptr impl((VideoVPP*) new ImplementationMvc(m_core)); mfxStatus mfxSts = impl->Init(par); MFX_CHECK( mfxSts == MFX_ERR_NONE || mfxSts == MFX_WRN_PARTIAL_ACCELERATION || mfxSts == MFX_WRN_FILTER_SKIPPED || mfxSts == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, mfxSts); /*if( MFX_WRN_PARTIAL_ACCELERATION == mfxSts) { isPartialAcceleration = true; } else if(MFX_WRN_FILTER_SKIPPED == mfxSts) { isFilterSkipped = true; } else if(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxSts) { isIncompatibleParam = true; }*/ internalSts = mfxSts; m_impl = std::move(impl); return mfxSts; } // mfxStatus VideoVPPMain::Init(mfxVideoParam *par) mfxStatus VideoVPPMain::Close( void ) { if( !m_impl.get() ) { return MFX_ERR_NONE; } m_impl->Close(); m_impl.reset(); return MFX_ERR_NONE; } // mfxStatus VideoVPPMain::Close( void ) mfxTaskThreadingPolicy VideoVPPMain::GetThreadingPolicy(void) { return MFX_TASK_THREADING_INTRA; } // mfxTaskThreadingPolicy VideoVPPMain::GetThreadingPolicy(void) mfxStatus VideoVPPMain::VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints) { MFX_CHECK_NULL_PTR1( out ); if( !m_impl.get() ) { return MFX_ERR_NOT_INITIALIZED; } mfxStatus mfxSts = m_impl->VppFrameCheck( in, out, aux, pEntryPoint, numEntryPoints ); return mfxSts; } // mfxStatus VideoVPPMain::VppFrameCheck(...) mfxStatus VideoVPPMain::RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) { mfxStatus mfxSts = m_impl->RunFrameVPP( in, out, aux); return mfxSts; } // mfxStatus VideoVPPMain::RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_mvc.cpp000066400000000000000000000216761443134507600270150ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "math.h" #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_enc_common.h" #include "mfx_session.h" #include "mfxmvc.h" #include "mfxsvc.h" #include "mfx_vpp_utils.h" #include "mfx_vpp_mvc.h" using namespace MfxVideoProcessing; mfxStatus ImplementationMvc::QueryIOSurf(VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest *request) { mfxStatus sts = VideoVPPBase::QueryIOSurf(core, par, request); // in case of multiview we should correct result if( MFX_ERR_NONE == sts || MFX_WRN_PARTIAL_ACCELERATION == sts ) { mfxExtBuffer* pHint = NULL; GetFilterParam(par, MFX_EXTBUFF_MVC_SEQ_DESC, &pHint); if( pHint ) { mfxExtMVCSeqDesc* pHintMVC = (mfxExtMVCSeqDesc*)pHint; request[VPP_IN].NumFrameMin = (mfxU16)(request[VPP_IN].NumFrameMin * pHintMVC->NumView); request[VPP_IN].NumFrameSuggested = (mfxU16)(request[VPP_IN].NumFrameSuggested * pHintMVC->NumView); request[VPP_OUT].NumFrameMin = (mfxU16)(request[VPP_OUT].NumFrameMin * pHintMVC->NumView); request[VPP_OUT].NumFrameSuggested = (mfxU16)(request[VPP_OUT].NumFrameSuggested * pHintMVC->NumView); } } return sts; } // mfxStatus ImplementationMvc::QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request, const mfxU32 adapterNum) ImplementationMvc::ImplementationMvc(VideoCORE *core) : m_bInit( false ) , m_bMultiViewMode(false) , m_core( core ) , m_iteratorVPP( ) { } // ImplementationMvc::ImplementationMvc(VideoCORE *core) ImplementationMvc::~ImplementationMvc() { Close(); } // ImplementationMvc::~ImplementationMvc() mfxStatus ImplementationMvc::Init(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1( par ); if( m_bInit ) { return MFX_ERR_UNDEFINED_BEHAVIOR; } // [1] multi-view Configuration mfxU32 viewCount = 1; // default mfxExtMVCSeqDesc* pHintMVC = NULL; mfxExtBuffer* pHint = NULL; GetFilterParam(par, MFX_EXTBUFF_MVC_SEQ_DESC, &pHint); m_bMultiViewMode = false; // really, constructor, destructor & close set one to false, but KW mark as issue if( pHint ) { pHintMVC = (mfxExtMVCSeqDesc*)pHint; viewCount = pHintMVC->NumView; m_bMultiViewMode = true; } if( viewCount == 0 ) return MFX_ERR_INVALID_VIDEO_PARAM; // [2] initialization mfxStatus mfxSts = MFX_ERR_NONE; mfxStatus intSts = MFX_ERR_NONE; for( mfxU32 viewIndx = 0; viewIndx < viewCount; viewIndx++ ) { mfxU16 viewId = 0; if(m_bMultiViewMode) { viewId = (pHintMVC->View)? pHintMVC->View[viewIndx].ViewId : (mfxU16)viewIndx; if(viewId >= 1024) return MFX_ERR_INVALID_VIDEO_PARAM; } VideoVPPBase* pNewVPP = CreateAndInitVPPImpl(par, m_core, &mfxSts); if (mfxSts < MFX_ERR_NONE || !pNewVPP) { return mfxSts; } if (MFX_WRN_PARTIAL_ACCELERATION == mfxSts || MFX_WRN_FILTER_SKIPPED == mfxSts || MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxSts) { intSts = mfxSts; mfxSts = MFX_ERR_NONE; } std::pair insertSts = m_VPP.insert( std::make_pair(viewId, pNewVPP) ); if( !insertSts.second ) { return MFX_ERR_UNDEFINED_BEHAVIOR; } } m_iteratorVPP = m_VPP.begin(); // save for EndOfStream processing m_bInit = true; return intSts; } // mfxStatus ImplementationMvc::Init(mfxVideoParam *par) mfxStatus ImplementationMvc::Reset(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1( par ); if( !m_bInit ) { return MFX_ERR_NOT_INITIALIZED; } mfxStatus sts = MFX_ERR_NONE; mfxStatus internalSts = MFX_ERR_NONE; sts = CheckExtParam(m_core, par->ExtParam, par->NumExtParam); if( MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts || MFX_WRN_FILTER_SKIPPED == sts ) { internalSts = sts; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); mfxMultiViewVPP_Iterator curVPP; for( curVPP = m_VPP.begin(); curVPP != m_VPP.end(); curVPP++) { sts = (curVPP->second)->Reset( par ); if(MFX_WRN_PARTIAL_ACCELERATION == sts || MFX_WRN_FILTER_SKIPPED == sts || MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts) { internalSts = sts; sts = MFX_ERR_NONE; } MFX_CHECK_STS( sts ); } m_iteratorVPP = m_VPP.begin(); // save for EndOfStream processing return (MFX_ERR_NONE == sts) ? internalSts : sts; } // mfxStatus ImplementationMvc::Reset(mfxVideoParam *par) mfxStatus ImplementationMvc::GetVideoParam(mfxVideoParam *par) { if( !m_bInit ) { return MFX_ERR_NOT_INITIALIZED; } if(m_VPP.empty()) { return MFX_ERR_NOT_INITIALIZED; } mfxStatus mfxSts = (m_VPP.begin()->second)->GetVideoParam( par ); return mfxSts; } // mfxStatus VideoVPPMain::GetVideoParam(mfxVideoParam *par) mfxStatus ImplementationMvc::GetVPPStat(mfxVPPStat *stat) { if( !m_bInit ) { return MFX_ERR_NOT_INITIALIZED; } if(m_VPP.empty()) { return MFX_ERR_NOT_INITIALIZED; } mfxStatus mfxSts = (m_VPP.begin()->second)->GetVPPStat( stat ); return mfxSts; } // mfxStatus ImplementationMvc::GetVPPStat(mfxVPPStat *stat) mfxTaskThreadingPolicy ImplementationMvc::GetThreadingPolicy(void) { return MFX_TASK_THREADING_INTRA; } // mfxTaskThreadingPolicy ImplementationMvc::GetThreadingPolicy(void) mfxStatus ImplementationMvc::VppFrameCheck( mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoint[], mfxU32 &numEntryPoints) { MFX_CHECK_NULL_PTR1( out ); mfxStatus mfxSts; if( !m_bInit ) { return MFX_ERR_NOT_INITIALIZED; } mfxU16 viewId = 0; if( m_bMultiViewMode ) { // check in->info.viewId belong (set of viewId on init) viewId = (in) ? in->Info.FrameId.ViewId : m_iteratorVPP->first; if( m_VPP.find(viewId) == m_VPP.end() ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } mfxSts = m_VPP[ viewId ]->VppFrameCheck( in, out, aux, pEntryPoint, numEntryPoints ); if( m_bMultiViewMode ) { // pass through viewID if( MFX_ERR_NONE == mfxSts || MFX_ERR_MORE_SURFACE == mfxSts ) { out->Info.FrameId.ViewId = viewId; } // update iterator for EndOfStream processing m_iteratorVPP++; if( m_iteratorVPP == m_VPP.end() ) { m_iteratorVPP = m_VPP.begin(); } } return mfxSts; } // mfxStatus ImplementationMvc::VppFrameCheck(...) // depreciated mfxStatus ImplementationMvc::RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) { MFX_CHECK_NULL_PTR1( out ); mfxU16 viewId = 0; if( m_bMultiViewMode ) { // check in->info.viewId belong (set of viewId on init) viewId = (in) ? in->Info.FrameId.ViewId : out->Info.FrameId.ViewId; // it is correct because outputViewID filled by Check() if( m_VPP.find(viewId) == m_VPP.end() ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } mfxStatus mfxSts = m_VPP[ viewId ]->RunFrameVPP( in, out, aux); return mfxSts; } // mfxStatus ImplementationMvc::RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) mfxStatus ImplementationMvc::Close(void) { //VPP_CHECK_NOT_INITIALIZED; if( !m_bInit ) { return MFX_ERR_NONE; } mfxMultiViewVPP_Iterator curVPP; for( curVPP = m_VPP.begin(); curVPP != m_VPP.end(); curVPP++) { (curVPP->second)->Close( ); delete (curVPP->second); //MFX_CHECK_STS( mfxSts ); } m_VPP.erase( m_VPP.begin(), m_VPP.end() ); m_bMultiViewMode = false; m_bInit = false; return MFX_ERR_NONE; } // mfxStatus ImplementationMvc::Close( void ) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_sw_core.cpp000066400000000000000000001373431443134507600276700ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "math.h" #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_enc_common.h" #include "mfx_session.h" #include "mfx_vpp_hw.h" #include "libmfx_core.h" #include "libmfx_core_factory.h" #include "libmfx_core_interface.h" #include "mfx_platform_caps.h" #include "mfx_vpp_utils.h" #include "mfx_vpp_sw.h" #include "umc_defs.h" #include "ipps.h" using namespace MfxHwVideoProcessing; class CmDevice; VideoVPPBase* CreateAndInitVPPImpl(mfxVideoParam *par, VideoCORE *core, mfxStatus *mfxSts) { VideoVPPBase * vpp = 0; if( MFX_PLATFORM_HARDWARE == core->GetPlatformType()) { vpp = new VideoVPP_HW(core, mfxSts); if (*mfxSts != MFX_ERR_NONE) { delete vpp; return 0; } *mfxSts = vpp->Init(par); if (*mfxSts < MFX_ERR_NONE) { delete vpp; return 0; } if(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == *mfxSts || MFX_WRN_FILTER_SKIPPED == *mfxSts || MFX_ERR_NONE == *mfxSts) { return vpp; } delete vpp; vpp = 0; } *mfxSts = MFX_ERR_UNSUPPORTED; return 0; } /* ******************************************************************** */ /* useful macros */ /* ******************************************************************** */ #ifndef VPP_CHECK_STS_SAFE #define VPP_CHECK_STS_SAFE(sts, in, out) \ { \ if (sts != MFX_ERR_NONE && in) \ { \ m_core->DecreaseReference(*in); \ } \ if (sts != MFX_ERR_NONE && out) \ { \ m_core->DecreaseReference(*out); \ } \ MFX_CHECK_STS( sts ); \ } #endif #define VPP_UPDATE_STAT( sts, stat ) \ { \ if( MFX_ERR_NONE == sts ) stat.NumFrame++; \ if( MFX_ERR_NULL_PTR == sts ) stat.NumCachedFrame++;\ } #define VPP_UNLOCK_SURFACE(sts, surface) \ { \ if( MFX_ERR_NONE == sts ) m_core->DecreaseReference(*surface);\ } /* ******************************************************************** */ /* implementation of VPP Pipeline: interface methods */ /* ******************************************************************** */ VideoVPPBase::VideoVPPBase(VideoCORE *core, mfxStatus* sts ) : m_pipelineList() , m_core(core) , m_pHWVPP() { /* common */ m_bDynamicDeinterlace = false; memset(&m_stat, 0, sizeof(mfxVPPStat)); memset(&m_errPrtctState, 0, sizeof(sErrPrtctState)); memset(&m_InitState, 0, sizeof(sErrPrtctState)); VPP_CLEAN; *sts = MFX_ERR_NONE; } // VideoVPPBase::VideoVPPBase(VideoCORE *core, mfxStatus* sts ) : VideoVPP() VideoVPPBase::~VideoVPPBase() { Close(); } // VideoVPPBase::~VideoVPPBase() mfxStatus VideoVPPBase::Close(void) { VPP_CHECK_NOT_INITIALIZED; m_stat.NumCachedFrame = 0; m_stat.NumFrame = 0; m_bDynamicDeinterlace = false; //m_numUsedFilters = 0; m_pipelineList.resize(0); VPP_CLEAN; return MFX_ERR_NONE;// in according with spec } // mfxStatus VideoVPPBase::Close(void) mfxStatus VideoVPPBase::Init(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_INVALID_VIDEO_PARAM; mfxStatus sts_wrn = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1( par ); VPP_CHECK_MULTIPLE_INIT; /* step [0]: checking */ sts = CheckIOPattern( par ); MFX_CHECK_STS(sts); if (par->Protected) return MFX_ERR_INVALID_VIDEO_PARAM; sts = CheckFrameInfo( &(par->vpp.In), VPP_IN); MFX_CHECK_STS( sts ); sts = CheckFrameInfo( &(par->vpp.Out), VPP_OUT); MFX_CHECK_STS(sts); PicStructMode picStructMode = GetPicStructMode(par->vpp.In.PicStruct, par->vpp.Out.PicStruct); m_bDynamicDeinterlace = (DYNAMIC_DI_PICSTRUCT_MODE == picStructMode) ? true : false; sts = CheckExtParam(m_core, par->ExtParam, par->NumExtParam); if( MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts || MFX_WRN_FILTER_SKIPPED == sts) { sts_wrn = sts; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); /* step [1]: building stage of VPP pipeline */ sts = GetPipelineList( par, m_pipelineList, true); MFX_CHECK_STS(sts); sts = InternalInit(par); if (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts || MFX_WRN_FILTER_SKIPPED == sts) { sts_wrn = sts; sts = MFX_ERR_NONE; } MFX_CHECK_STS( sts ); /* save init params to prevent core crash */ m_errPrtctState.In = par->vpp.In; m_errPrtctState.Out = par->vpp.Out; m_errPrtctState.IOPattern = par->IOPattern; m_errPrtctState.AsyncDepth = par->AsyncDepth; m_errPrtctState.isCompositionModeEnabled = IsCompositionMode(par); m_InitState = m_errPrtctState; // Save params on init m_stat.NumCachedFrame = 0; m_stat.NumFrame = 0; VPP_INIT_SUCCESSFUL; if( MFX_ERR_NONE != sts_wrn ) { return sts_wrn; } bool bCorrectionEnable = false; sts = CheckPlatformLimitations(m_core, *par, bCorrectionEnable); if (MFX_ERR_UNSUPPORTED == sts) { sts = MFX_ERR_INVALID_VIDEO_PARAM; } return sts; } // mfxStatus VideoVPPBase::Init(mfxVideoParam *par) mfxStatus VideoVPPBase::VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *, MFX_ENTRY_POINT [], mfxU32 &) { //printf("\nVideoVPPBase::VppFrameCheck()\n"); fflush(stdout); mfxStatus sts = MFX_ERR_NONE; /* [IN] */ // it is end of stream procedure if(NULL == in) if( NULL == out ) { return MFX_ERR_NULL_PTR; } if (!out->FrameInterface) MFX_CHECK(!out->Data.Locked, MFX_ERR_UNDEFINED_BEHAVIOR); /* *************************************** */ /* check info */ /* *************************************** */ if (in) { sts = CheckInputPicStruct( in->Info.PicStruct ); MFX_CHECK_STS(sts); /* we have special case for composition: * if composition enabled sub stream's picture (WxH) * can be less than primary stream (WxH) * So, do check frame info only if composition is not enabled */ if (m_errPrtctState.isCompositionModeEnabled == false) { sts = CompareFrameInfo( &(in->Info), &(m_errPrtctState.In)); MFX_CHECK_STS(sts); } sts = CheckCropParam( &(in->Info) ); MFX_CHECK_STS( sts ); } sts = CompareFrameInfo( &(out->Info), &(m_errPrtctState.Out)); MFX_CHECK_STS(sts); sts = CheckCropParam( &(out->Info) ); MFX_CHECK_STS( sts ); return sts; } // mfxStatus VideoVPPBase::VppFrameCheck(...) mfxStatus VideoVPPBase::QueryIOSurf(VideoCORE* core, mfxVideoParam *par, mfxFrameAllocRequest *request) { mfxStatus mfxSts; MFX_CHECK_NULL_PTR2(par, request); mfxSts = CheckFrameInfo( &(par->vpp.In), VPP_IN); MFX_CHECK_STS( mfxSts ); mfxSts = CheckFrameInfo( &(par->vpp.Out), VPP_OUT); MFX_CHECK_STS( mfxSts ); // make sense? //mfxSts = CheckExtParam(par->ExtParam, par->NumExtParam); //if( MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == mfxSts ) //{ // mfxSts = MFX_ERR_NONE; // //bWarningIncompatible = true; //} //MFX_CHECK_STS(mfxSts); //PicStructMode m_picStructSupport = GetTypeOfInitPicStructSupport(par->vpp.In.PicStruct, par->vpp.Out.PicStruct); // default settings // VPP_IN request[VPP_IN].Info = par->vpp.In; request[VPP_IN].NumFrameMin = 1; request[VPP_IN].NumFrameSuggested = 1; //VPP_OUT request[VPP_OUT].Info = par->vpp.Out; request[VPP_OUT].NumFrameMin = 1; request[VPP_OUT].NumFrameSuggested = 1; /* correction */ std::vector pipelineList; //mfxU32 lenList; mfxSts = GetPipelineList( par, pipelineList, true ); MFX_CHECK_STS( mfxSts ); mfxU16 framesCountMin[2]; mfxU16 framesCountSuggested[2]; mfxSts = GetExternalFramesCount(core, par, &pipelineList[0], (mfxU32)pipelineList.size(), framesCountMin, framesCountSuggested); MFX_CHECK_STS( mfxSts ); request[VPP_IN].NumFrameMin = framesCountMin[VPP_IN]; request[VPP_OUT].NumFrameMin = framesCountMin[VPP_OUT]; request[VPP_IN].NumFrameSuggested = framesCountSuggested[VPP_IN]; request[VPP_OUT].NumFrameSuggested = framesCountSuggested[VPP_OUT]; if( MFX_PLATFORM_HARDWARE == core->GetPlatformType() ) { mfxFrameAllocRequest hwRequest[2]; mfxSts = VideoVPPHW::QueryIOSurf(VideoVPPHW::ALL, core, par, hwRequest); bool bSWLib = (mfxSts == MFX_ERR_NONE) ? false : true; if( !bSWLib ) { // suggested request[VPP_IN].NumFrameSuggested = std::max(request[VPP_IN].NumFrameSuggested, hwRequest[VPP_IN].NumFrameSuggested); request[VPP_OUT].NumFrameSuggested = std::max(request[VPP_OUT].NumFrameSuggested, hwRequest[VPP_OUT].NumFrameSuggested); // min request[VPP_IN].NumFrameMin = std::max(request[VPP_IN].NumFrameMin, hwRequest[VPP_IN].NumFrameMin); request[VPP_OUT].NumFrameMin = std::max(request[VPP_OUT].NumFrameMin, hwRequest[VPP_OUT].NumFrameMin); } mfxU16 vppAsyncDepth = (0 == par->AsyncDepth) ? MFX_AUTO_ASYNC_DEPTH_VALUE : par->AsyncDepth; { // suggested request[VPP_IN].NumFrameSuggested *= vppAsyncDepth; request[VPP_OUT].NumFrameSuggested *= vppAsyncDepth; // min request[VPP_IN].NumFrameMin *= vppAsyncDepth; request[VPP_OUT].NumFrameMin *= vppAsyncDepth; } mfxSts = CheckIOPattern_AndSetIOMemTypes(par->IOPattern, &(request[VPP_IN].Type), &(request[VPP_OUT].Type)); MFX_CHECK_STS(mfxSts); return (bSWLib)? MFX_ERR_UNSUPPORTED : MFX_ERR_NONE; } return MFX_ERR_NONE; } // mfxStatus VideoVPPBase::QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request, const mfxU32 adapterNum) mfxStatus VideoVPPBase::GetVPPStat(mfxVPPStat *stat) { MFX_CHECK_NULL_PTR1(stat); VPP_CHECK_NOT_INITIALIZED; if( 0 == m_pipelineList.size() ) return MFX_ERR_NOT_INITIALIZED; stat->NumCachedFrame = m_stat.NumCachedFrame; stat->NumFrame = m_stat.NumFrame; return MFX_ERR_NONE; } // mfxStatus VideoVPPBase::GetVPPStat(mfxVPPStat *stat) mfxStatus VideoVPPBase::GetVideoParam(mfxVideoParam *par) { MFX_CHECK_NULL_PTR1( par ) par->vpp.In = m_errPrtctState.In; par->vpp.Out = m_errPrtctState.Out; par->Protected = 0; par->IOPattern = m_errPrtctState.IOPattern; par->AsyncDepth = m_errPrtctState.AsyncDepth; if( NULL == par->ExtParam || 0 == par->NumExtParam) { return MFX_ERR_NONE; } for( mfxU32 i = 0; i < par->NumExtParam; i++ ) { if( MFX_EXTBUFF_VPP_DOUSE == par->ExtParam[i]->BufferId ) { mfxExtVPPDoUse* pVPPHint = (mfxExtVPPDoUse*)(par->ExtParam[i]); mfxU32 numUsedFilters = 0; for( mfxU32 filterIndex = 0; filterIndex < GetNumUsedFilters(); filterIndex++ ) { switch ( m_pipelineList[filterIndex] ) { case MFX_EXTBUFF_VPP_CSC: case MFX_EXTBUFF_VPP_RESIZE: case MFX_EXTBUFF_VPP_ITC: case MFX_EXTBUFF_VPP_CSC_OUT_RGB4: case MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10: { continue; } case MFX_EXTBUFF_VPP_DENOISE: case MFX_EXTBUFF_VPP_DENOISE2: case MFX_EXTBUFF_VPP_SCENE_ANALYSIS: case MFX_EXTBUFF_VPP_PROCAMP: case MFX_EXTBUFF_VPP_DETAIL: case MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: case MFX_EXTBUFF_VPP_IMAGE_STABILIZATION: case MFX_EXTBUFF_VPP_COMPOSITE: case MFX_EXTBUFF_VPP_FIELD_PROCESSING: case MFX_EXTBUFF_VPP_DEINTERLACING: case MFX_EXTBUFF_VPP_DI: case MFX_EXTBUFF_VPP_DI_30i60p: case MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO: case MFX_EXTBUFF_VPP_MIRRORING: case MFX_EXTBUFF_VPP_COLOR_CONVERSION: #ifdef MFX_ENABLE_MCTF case MFX_EXTBUFF_VPP_MCTF: #endif #ifdef ONEVPL_EXPERIMENTAL case MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER: #endif { if(numUsedFilters + 1 > pVPPHint->NumAlg) return MFX_ERR_UNDEFINED_BEHAVIOR; pVPPHint->AlgList[numUsedFilters] = m_pipelineList[filterIndex]; numUsedFilters++; break; } default: return MFX_ERR_UNDEFINED_BEHAVIOR; } } } } return MFX_ERR_NONE; } // mfxStatus VideoVPPBase::GetVideoParam(mfxVideoParam *par) mfxU32 VideoVPPBase::GetNumUsedFilters() { return ( (mfxU32)m_pipelineList.size() ); } // mfxU32 VideoVPPBase::GetNumUsedFilters() mfxStatus VideoVPPBase::CheckIOPattern( mfxVideoParam* par ) { if (0 == par->IOPattern) // IOPattern is mandatory parameter { return MFX_ERR_INVALID_VIDEO_PARAM; } // VPL supports internal allocation without Ext. allocator set bool vpl_interface = SupportsVPLFeatureSet(*m_core); if (!vpl_interface) MFX_CHECK(m_core->IsExternalFrameAllocator() || !(par->IOPattern & (MFX_IOPATTERN_OUT_VIDEO_MEMORY | MFX_IOPATTERN_IN_VIDEO_MEMORY)), MFX_ERR_INVALID_VIDEO_PARAM); if ((par->IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY)) { return MFX_ERR_INVALID_VIDEO_PARAM; } if ((par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (par->IOPattern & (MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY)) return MFX_ERR_INVALID_VIDEO_PARAM; return MFX_ERR_NONE; } // mfxStatus VideoVPPBase::CheckIOPattern( mfxVideoParam* par ) mfxStatus VideoVPPBase::QueryCaps(VideoCORE * core, MfxHwVideoProcessing::mfxVppCaps& caps) { mfxStatus sts = MFX_ERR_NONE; if(MFX_PLATFORM_HARDWARE == core->GetPlatformType() ) { sts = VideoVPPHW::QueryCaps(core, caps); caps.uFrameRateConversion = 1; // "1" means general FRC is supported. "Interpolation" modes descibed by caps.frcCaps caps.uDeinterlacing = 1; // "1" means general deinterlacing is supported caps.uVideoSignalInfoInOut = 1; // "1" means general VSII is supported caps.uVideoSignalInfo = 1; // "1" means general VSIN is supported if (sts >= MFX_ERR_NONE) return sts; } return MFX_ERR_UNSUPPORTED; } // mfxStatus VideoVPPBase::QueryCaps((VideoCORE * core, MfxHwVideoProcessing::mfxVppCaps& caps) mfxStatus VideoVPPBase::Query(VideoCORE * core, mfxVideoParam *in, mfxVideoParam *out) { mfxStatus mfxSts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1( out ); if( NULL == in ) { memset(&out->mfx, 0, sizeof(mfxInfoMFX)); memset(&out->vpp, 0, sizeof(mfxInfoVPP)); // We have to set FourCC and FrameRate below to // pass requirements of CheckPlatformLimitation for frame interpolation /* vppIn */ out->vpp.In.FourCC = 1; out->vpp.In.Height = 1; out->vpp.In.Width = 1; out->vpp.In.PicStruct = 1; out->vpp.In.FrameRateExtN = 1; out->vpp.In.FrameRateExtD = 1; /* vppOut */ out->vpp.Out.FourCC = 1; out->vpp.Out.Height = 1; out->vpp.Out.Width = 1; out->vpp.Out.PicStruct = 1; out->vpp.Out.FrameRateExtN = 1; out->vpp.Out.FrameRateExtD = 1; out->IOPattern = 1; /* protected content is not supported. check it */ out->Protected = 1; out->AsyncDepth = 1; if (0 == out->NumExtParam) { out->NumExtParam = 1; } else { // check for IS and AFRC out->vpp.In.FourCC = MFX_FOURCC_NV12; out->vpp.Out.FourCC = MFX_FOURCC_NV12; out->vpp.In.FrameRateExtN = 30; out->vpp.Out.FrameRateExtN = 60; mfxSts = CheckPlatformLimitations(core, *out, true); } return mfxSts; } else { out->vpp = in->vpp; /* [asyncDepth] section */ out->AsyncDepth = in->AsyncDepth; /* [Protected] section */ out->Protected = in->Protected; if( out->Protected ) { out->Protected = 0; mfxSts = MFX_ERR_UNSUPPORTED; } /* [IOPattern] section * Reuse check function from QueryIOsurf * Zero value just skipped. */ mfxU16 inPattern; mfxU16 outPattern; if (0 == in->IOPattern || MFX_ERR_NONE == CheckIOPattern_AndSetIOMemTypes(in->IOPattern, &inPattern, &outPattern)) { out->IOPattern = in->IOPattern; } else { mfxSts = MFX_ERR_UNSUPPORTED; out->IOPattern = 0; } /* [ExtParam] section */ if ((in->ExtParam == 0 && out->ExtParam != 0) || (in->ExtParam != 0 && out->ExtParam == 0) || (in->NumExtParam != out->NumExtParam)) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; } if (0 != in->ExtParam) { for (int i = 0; i < in->NumExtParam; i++) { MFX_CHECK_NULL_PTR1( in->ExtParam[i] ); } } if (0 != out->ExtParam) { for (int i = 0; i < out->NumExtParam; i++) { MFX_CHECK_NULL_PTR1(out->ExtParam[i]); } } if( out->NumExtParam > MAX_NUM_OF_VPP_EXT_PARAM) { out->NumExtParam = 0; mfxSts = MFX_ERR_UNSUPPORTED; } if( 0 == out->NumExtParam && in->ExtParam ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; } if (in->ExtParam && out->ExtParam && (in->NumExtParam == out->NumExtParam) ) { mfxU16 i; // to prevent multiple initialization std::vector filterList(1); bool bMultipleInitDNU = false; bool bMultipleInitDOUSE = false; for (i = 0; i < out->NumExtParam; i++) { if ((in->ExtParam[i] == 0 && out->ExtParam[i] != 0) || (in->ExtParam[i] != 0 && out->ExtParam[i] == 0)) { //mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } if (in->ExtParam[i] && out->ExtParam[i]) { if (in->ExtParam[i]->BufferId != out->ExtParam[i]->BufferId) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } if (in->ExtParam[i]->BufferSz != out->ExtParam[i]->BufferSz) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } // -------------------------------- // analysis of configurable filters // -------------------------------- if( IsConfigurable( in->ExtParam[i]->BufferId ) ) { if( IsFilterFound(&filterList[0], (mfxU32)filterList.size(), in->ExtParam[i]->BufferId) ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; } else { uint8_t *src = reinterpret_cast(in->ExtParam[i]), *dst = reinterpret_cast(out->ExtParam[i]); std::copy(src, src + GetConfigSize(in->ExtParam[i]->BufferId), dst); mfxStatus extSts = ExtendedQuery(core, in->ExtParam[i]->BufferId, out->ExtParam[i]); if( MFX_ERR_NONE != extSts ) { mfxSts = extSts; } filterList.push_back(in->ExtParam[i]->BufferId); } continue; // stop working with ExtParam[i] } // -------------------------------- // analysis of DONOTUSE structure // -------------------------------- else if( MFX_EXTBUFF_VPP_DONOTUSE == in->ExtParam[i]->BufferId ) { if( bMultipleInitDNU ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue;// stop working with ExtParam[i] } bMultipleInitDNU = true; // deep analysis //-------------------------------------- { mfxExtVPPDoNotUse* extDoNotUseIn = (mfxExtVPPDoNotUse*)in->ExtParam[i]; mfxExtVPPDoNotUse* extDoNotUseOut = (mfxExtVPPDoNotUse*)out->ExtParam[i]; if(extDoNotUseIn->NumAlg != extDoNotUseOut->NumAlg) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } if( 0 == extDoNotUseIn->NumAlg ) { extDoNotUseIn->NumAlg = 0; mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } if(extDoNotUseIn->NumAlg > 4) { extDoNotUseIn->NumAlg = 0; mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } if( NULL == extDoNotUseOut->AlgList || NULL == extDoNotUseIn->AlgList ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } for( mfxU32 algIdx = 0; algIdx < extDoNotUseIn->NumAlg; algIdx++ ) { // app must turn off filter once only if( IsFilterFound( extDoNotUseIn->AlgList, algIdx, extDoNotUseIn->AlgList[algIdx] ) ) { mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } extDoNotUseOut->AlgList[algIdx] = extDoNotUseIn->AlgList[algIdx]; } extDoNotUseOut->NumAlg = extDoNotUseIn->NumAlg; for( mfxU32 extParIdx = 0; extParIdx < in->NumExtParam; extParIdx++ ) { // configured via extended parameters filter should not be disabled if ( IsFilterFound( extDoNotUseIn->AlgList, extDoNotUseIn->NumAlg, in->ExtParam[extParIdx]->BufferId ) ) { mfxU32 filterIdx = GetFilterIndex( extDoNotUseIn->AlgList, extDoNotUseIn->NumAlg, in->ExtParam[extParIdx]->BufferId ); extDoNotUseIn->AlgList[filterIdx] = 0; mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } } } } // -------------------------------- // analysis of DOUSE structure // -------------------------------- else if( MFX_EXTBUFF_VPP_DOUSE == in->ExtParam[i]->BufferId ) { if( bMultipleInitDOUSE ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue;// stop working with ExtParam[i] } bMultipleInitDOUSE = true; // deep analysis //-------------------------------------- { mfxExtVPPDoUse* extDoUseIn = (mfxExtVPPDoUse*)in->ExtParam[i]; mfxExtVPPDoUse* extDoUseOut = (mfxExtVPPDoUse*)out->ExtParam[i]; if(extDoUseIn->NumAlg != extDoUseOut->NumAlg) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } if( 0 == extDoUseIn->NumAlg ) { extDoUseIn->NumAlg = 0; mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } if( NULL == extDoUseOut->AlgList || NULL == extDoUseIn->AlgList ) { mfxSts = MFX_ERR_UNDEFINED_BEHAVIOR; continue; // stop working with ExtParam[i] } for( mfxU32 algIdx = 0; algIdx < extDoUseIn->NumAlg; algIdx++ ) { if( !CheckDoUseCompatibility( extDoUseIn->AlgList[algIdx] ) ) { mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } // app must turn off filter once only if( IsFilterFound( extDoUseIn->AlgList, algIdx, extDoUseIn->AlgList[algIdx] ) ) { mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } if(MFX_EXTBUFF_VPP_COMPOSITE == extDoUseIn->AlgList[algIdx]) { mfxSts = MFX_ERR_UNSUPPORTED; continue; // stop working with ExtParam[i] } if(MFX_EXTBUFF_VPP_FIELD_PROCESSING == extDoUseIn->AlgList[algIdx]) { /* NOTE: * It's legal to use DOUSE for field processing, * but application must attach appropriate ext buffer to mfxFrameData for each input surface */ //mfxSts = MFX_ERR_UNSUPPORTED; //continue; } extDoUseOut->AlgList[algIdx] = extDoUseIn->AlgList[algIdx]; } extDoUseOut->NumAlg = extDoUseIn->NumAlg; } //-------------------------------------- } #ifdef MFX_ENABLE_MCTF else if (MFX_EXTBUFF_VPP_MCTF == in->ExtParam[i]->BufferId) { // no specific checks for MCTF control buffer continue; } #endif else if (MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN == in->ExtParam[i]->BufferId) { continue; } else if (MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO == in->ExtParam[i]->BufferId) { continue; } else if (MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN == in->ExtParam[i]->BufferId) { continue; } else { out->ExtParam[i]->BufferId = 0; mfxSts = MFX_ERR_UNSUPPORTED; }// if( MFX_EXTBUFF_VPP_XXX == in->ExtParam[i]->BufferId ) } // if(in->ExtParam[i] && out->ExtParam[i]) } // for (i = 0; i < out->NumExtParam; i++) } // if (in->ExtParam && out->ExtParam && (in->NumExtParam == out->NumExtParam) ) if ( out->vpp.In.FourCC != MFX_FOURCC_P010 && out->vpp.In.FourCC != MFX_FOURCC_P210 && out->vpp.In.FourCC != MFX_FOURCC_A2RGB10 && out->vpp.In.FourCC != MFX_FOURCC_Y210 && out->vpp.In.FourCC != MFX_FOURCC_Y410 && out->vpp.In.FourCC != MFX_FOURCC_BGRA && out->vpp.In.FourCC != MFX_FOURCC_P016 && out->vpp.In.FourCC != MFX_FOURCC_YUY2 && out->vpp.In.FourCC != MFX_FOURCC_NV12 && out->vpp.In.FourCC != MFX_FOURCC_Y416 && out->vpp.In.FourCC != MFX_FOURCC_Y216 && out->vpp.In.FourCC != MFX_FOURCC_AYUV && out->vpp.Out.FourCC == MFX_FOURCC_A2RGB10 ){ if( out->vpp.In.FourCC ) { out->vpp.In.FourCC = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } if ( out->vpp.In.FourCC == MFX_FOURCC_P010 && out->vpp.Out.FourCC != MFX_FOURCC_A2RGB10 && out->vpp.Out.FourCC != MFX_FOURCC_NV12 && out->vpp.Out.FourCC != MFX_FOURCC_YV12 && out->vpp.Out.FourCC != MFX_FOURCC_P010 && out->vpp.Out.FourCC != MFX_FOURCC_P210 && out->vpp.Out.FourCC != MFX_FOURCC_YUY2 && out->vpp.Out.FourCC != MFX_FOURCC_UYVY && out->vpp.Out.FourCC != MFX_FOURCC_AYUV && out->vpp.Out.FourCC != MFX_FOURCC_Y210 && out->vpp.Out.FourCC != MFX_FOURCC_Y410 && out->vpp.Out.FourCC != MFX_FOURCC_RGB4 && out->vpp.Out.FourCC != MFX_FOURCC_Y416 && out->vpp.Out.FourCC != MFX_FOURCC_Y216 && out->vpp.Out.FourCC != MFX_FOURCC_P016) { if( out->vpp.In.FourCC ) { out->vpp.In.FourCC = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } /* [IN VPP] data */ if( out->vpp.In.FourCC != MFX_FOURCC_YV12 && out->vpp.In.FourCC != MFX_FOURCC_NV12 && out->vpp.In.FourCC != MFX_FOURCC_YUY2 && #if defined (MFX_ENABLE_FOURCC_RGB565) out->vpp.In.FourCC != MFX_FOURCC_RGB565 && #endif // MFX_ENABLE_FOURCC_RGB565 out->vpp.In.FourCC != MFX_FOURCC_RGB4 && out->vpp.In.FourCC != MFX_FOURCC_BGR4 && out->vpp.In.FourCC != MFX_FOURCC_ABGR16F && out->vpp.In.FourCC != MFX_FOURCC_P010 && out->vpp.In.FourCC != MFX_FOURCC_UYVY && out->vpp.In.FourCC != MFX_FOURCC_I420 && out->vpp.In.FourCC != MFX_FOURCC_P210 && out->vpp.In.FourCC != MFX_FOURCC_Y210 && out->vpp.In.FourCC != MFX_FOURCC_Y410 && out->vpp.In.FourCC != MFX_FOURCC_P016 && out->vpp.In.FourCC != MFX_FOURCC_Y216 && out->vpp.In.FourCC != MFX_FOURCC_Y416 && out->vpp.In.FourCC != MFX_FOURCC_AYUV && out->vpp.In.FourCC != MFX_FOURCC_R16 && out->vpp.In.FourCC != MFX_FOURCC_ARGB16 && // A2RGB10 supported as input in case of passthru copy out->vpp.In.FourCC != MFX_FOURCC_A2RGB10) { if( out->vpp.In.FourCC ) { out->vpp.In.FourCC = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } // Check for invalid cases if (out->vpp.In.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && out->vpp.In.PicStruct != MFX_PICSTRUCT_FIELD_TFF && out->vpp.In.PicStruct != MFX_PICSTRUCT_FIELD_BFF && out->vpp.In.PicStruct != MFX_PICSTRUCT_FIELD_SINGLE && out->vpp.In.PicStruct != MFX_PICSTRUCT_FIELD_TOP && // Field pass-through out->vpp.In.PicStruct != MFX_PICSTRUCT_FIELD_BOTTOM && out->vpp.In.PicStruct != MFX_PICSTRUCT_UNKNOWN) { if( out->vpp.In.PicStruct ) { out->vpp.In.PicStruct = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } if ((0 == (out->vpp.In.FrameRateExtN * out->vpp.In.FrameRateExtD)) && (out->vpp.In.FrameRateExtN + out->vpp.In.FrameRateExtD) ) { out->vpp.In.FrameRateExtN = 0; out->vpp.In.FrameRateExtD = 0; mfxSts = MFX_ERR_UNSUPPORTED; } if( out->vpp.In.Width ) { if ( (out->vpp.In.Width & 15 ) != 0 ) { out->vpp.In.Width = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } if (out->vpp.In.Height) { if ((out->vpp.In.Height & 15) !=0 ) { out->vpp.In.Height = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } /* [OUT VPP] data */ if( out->vpp.Out.FourCC != MFX_FOURCC_YV12 && out->vpp.Out.FourCC != MFX_FOURCC_NV12 && out->vpp.Out.FourCC != MFX_FOURCC_YUY2 && out->vpp.Out.FourCC != MFX_FOURCC_RGB4 && out->vpp.Out.FourCC != MFX_FOURCC_BGR4 && #ifdef MFX_ENABLE_RGBP out->vpp.Out.FourCC != MFX_FOURCC_RGBP && #endif out->vpp.Out.FourCC != MFX_FOURCC_UYVY && out->vpp.Out.FourCC != MFX_FOURCC_I420 && out->vpp.Out.FourCC != MFX_FOURCC_BGRP && out->vpp.Out.FourCC != MFX_FOURCC_P010 && out->vpp.Out.FourCC != MFX_FOURCC_P210 && out->vpp.Out.FourCC != MFX_FOURCC_Y210 && out->vpp.Out.FourCC != MFX_FOURCC_Y410 && out->vpp.Out.FourCC != MFX_FOURCC_P016 && out->vpp.Out.FourCC != MFX_FOURCC_Y216 && out->vpp.Out.FourCC != MFX_FOURCC_Y416 && out->vpp.Out.FourCC != MFX_FOURCC_AYUV && out->vpp.Out.FourCC != MFX_FOURCC_ARGB16 && out->vpp.Out.FourCC != MFX_FOURCC_A2RGB10) { out->vpp.Out.FourCC = 0; mfxSts = MFX_ERR_UNSUPPORTED; } if (out->vpp.Out.PicStruct != MFX_PICSTRUCT_PROGRESSIVE && out->vpp.Out.PicStruct != MFX_PICSTRUCT_FIELD_TFF && out->vpp.Out.PicStruct != MFX_PICSTRUCT_FIELD_BFF && out->vpp.Out.PicStruct != MFX_PICSTRUCT_FIELD_SINGLE && // Field pass-through out->vpp.Out.PicStruct != MFX_PICSTRUCT_FIELD_TOP && out->vpp.Out.PicStruct != MFX_PICSTRUCT_FIELD_BOTTOM && out->vpp.Out.PicStruct != MFX_PICSTRUCT_UNKNOWN) { if(out->vpp.Out.PicStruct) { out->vpp.Out.PicStruct = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } if ((0 == (out->vpp.Out.FrameRateExtN * out->vpp.Out.FrameRateExtD)) && (out->vpp.Out.FrameRateExtN + out->vpp.Out.FrameRateExtD)) { out->vpp.Out.FrameRateExtN = 0; out->vpp.Out.FrameRateExtD = 0; mfxSts = MFX_ERR_UNSUPPORTED; } if ( out->vpp.Out.Width ) { if ( (out->vpp.Out.Width & 15 ) != 0 ) { out->vpp.Out.Width = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } if( out->vpp.Out.Height ) { if ((out->vpp.Out.Height & 15) !=0) { out->vpp.Out.Height = 0; mfxSts = MFX_ERR_UNSUPPORTED; } } MFX_CHECK_STS(mfxSts); //------------------------------------------------- // FRC, IS and similar enhancement algorithms // special "interface" to signal on application level about support/unsupport ones //------------------------------------------------- bool bCorrectionEnable = true; mfxSts = CheckPlatformLimitations(core, *out, bCorrectionEnable); //------------------------------------------------- mfxStatus hwQuerySts = MFX_ERR_NONE; if(MFX_PLATFORM_HARDWARE == core->GetPlatformType()) { // HW VPP checking hwQuerySts = VideoVPPHW::Query(core, out); // Statuses returned by Init differ in several cases from Query if (MFX_ERR_INVALID_VIDEO_PARAM == hwQuerySts || MFX_ERR_UNSUPPORTED == hwQuerySts) { return MFX_ERR_UNSUPPORTED; } if (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == hwQuerySts || MFX_WRN_FILTER_SKIPPED == hwQuerySts) { return hwQuerySts; } if(MFX_ERR_NONE == hwQuerySts) { return mfxSts; } else { hwQuerySts = MFX_ERR_UNSUPPORTED; } } MFX_CHECK_STS(MFX_ERR_UNSUPPORTED); if (hwQuerySts != MFX_ERR_NONE) return hwQuerySts; return mfxSts; }//else } // mfxStatus VideoVPPBase::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) mfxStatus VideoVPPBase::Reset(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1( par ); VPP_CHECK_NOT_INITIALIZED; sts = CheckFrameInfo( &(par->vpp.In), VPP_IN); MFX_CHECK_STS( sts ); sts = CheckFrameInfo( &(par->vpp.Out), VPP_OUT); MFX_CHECK_STS(sts); //----------------------------------------------------- // specific check for Reset() if( m_InitState.In.PicStruct != par->vpp.In.PicStruct || m_InitState.Out.PicStruct != par->vpp.Out.PicStruct) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } /* IOPattern check */ if( m_InitState.IOPattern != par->IOPattern ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } if (par->Protected) return MFX_ERR_INVALID_VIDEO_PARAM; /* AsyncDepth */ if( m_InitState.AsyncDepth < par->AsyncDepth ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } /* in general, in/out resolution should be <= m_initParam.resolution */ if( (par->vpp.In.Width > m_InitState.In.Width) || (par->vpp.In.Height > m_InitState.In.Height) || (par->vpp.Out.Width > m_InitState.Out.Width) || (par->vpp.Out.Height > m_InitState.Out.Height) ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } //----------------------------------------------------- bool isCompositionModeInNewParams = IsCompositionMode(par); // Enabling/disabling composition via Reset() doesn't work currently. // This is a workaround to prevent undefined behavior. MFX_CHECK(m_errPrtctState.isCompositionModeEnabled == isCompositionModeInNewParams, MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); /* save init params to prevent core crash */ m_errPrtctState.In = par->vpp.In; m_errPrtctState.Out = par->vpp.Out; m_errPrtctState.IOPattern = par->IOPattern; m_errPrtctState.AsyncDepth = par->AsyncDepth; m_errPrtctState.isCompositionModeEnabled = isCompositionModeInNewParams; return sts; } // mfxStatus VideoVPPBase::Reset(mfxVideoParam *par) mfxTaskThreadingPolicy VideoVPPBase::GetThreadingPolicy(void) { return MFX_TASK_THREADING_INTRA; } // mfxTaskThreadingPolicy VideoVPPBase::GetThreadingPolicy(void) //--------------------------------------------------------- // UTILS //--------------------------------------------------------- mfxStatus VideoVPPBase::CheckPlatformLimitations( VideoCORE* core, mfxVideoParam & param, bool bCorrectionEnable) { std::vector capsList; MfxHwVideoProcessing::mfxVppCaps caps; QueryCaps(core, caps); ConvertCaps2ListDoUse(caps, capsList); std::vector pipelineList; bool bExtendedSupport = true; mfxStatus sts = GetPipelineList( ¶m, pipelineList, bExtendedSupport ); MFX_CHECK_STS(sts); std::vector supportedList; std::vector unsupportedList; // compare pipelineList and capsList mfxStatus capsSts = GetCrossList(pipelineList, capsList, supportedList, unsupportedList);// this function could return WRN_FILTER_SKIPPED (void)bCorrectionEnable; // check unsupported list if we need to reset ext buffer fields if(!unsupportedList.empty()) { if (IsFilterFound(&unsupportedList[0], (mfxU32)unsupportedList.size(), MFX_EXTBUFF_VPP_IMAGE_STABILIZATION)) { SetMFXISMode(param, 0); } } return (MFX_ERR_NONE != capsSts) ? capsSts : sts; } // mfxStatus CheckPlatformLimitations(...) VideoVPP_HW::VideoVPP_HW(VideoCORE *core, mfxStatus* sts) : VideoVPPBase(core, sts) { } mfxStatus VideoVPP_HW::InternalInit(mfxVideoParam *par) { mfxStatus sts = MFX_ERR_UNDEFINED_BEHAVIOR; CommonCORE* pCommonCore = NULL; bool bIsFilterSkipped = false; #ifdef MFX_ENABLE_EXT bool isSWFieldProcessing = IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_PROCESSING) || IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_WEAVING) || IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_SPLITTING); /* We call driver instead of kernel on XeHP_SDV+ for field weaving and splitting */ if ((IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_WEAVING) || IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_SPLITTING)) && !VppCaps::IsSwFieldProcessingSupported(m_core->GetHWType())) isSWFieldProcessing = false; #endif pCommonCore = QueryCoreInterface(m_core, MFXIVideoCORE_GUID); MFX_CHECK(pCommonCore, MFX_ERR_UNDEFINED_BEHAVIOR); VideoVPPHW::IOMode mode = VideoVPPHW::GetIOMode(par ); m_pHWVPP.reset(new VideoVPPHW(mode, m_core)); #ifdef MFX_ENABLE_EXT if (isSWFieldProcessing) { CmDevice * device = QueryCoreInterface(m_core, MFXICORECM_GUID); MFX_CHECK(device, MFX_ERR_UNDEFINED_BEHAVIOR); m_pHWVPP.get()->SetCmDevice(device); } #endif sts = m_pHWVPP.get()->Init(par); // OK or ERR only if (MFX_WRN_FILTER_SKIPPED == sts) { bIsFilterSkipped = true; sts = MFX_ERR_NONE; } if (MFX_ERR_NONE != sts) { m_pHWVPP.reset(0); } MFX_CHECK_STS( sts ); return (bIsFilterSkipped) ? MFX_WRN_FILTER_SKIPPED : MFX_ERR_NONE; } mfxStatus VideoVPP_HW::Reset(mfxVideoParam *par) { mfxStatus sts = VideoVPPBase::Reset(par); MFX_CHECK_STS( sts ); sts = m_pHWVPP.get()->Reset(par); MFX_CHECK_STS(sts); bool bCorrectionEnable = false; sts = CheckPlatformLimitations(m_core, *par, bCorrectionEnable); return sts; } mfxStatus VideoVPP_HW::Close(void) { mfxStatus sts = VideoVPPBase::Close(); m_pHWVPP.reset(0); return sts; } // mfxStatus VideoVPPBase::Close(void) mfxStatus VideoVPP_HW::GetVideoParam(mfxVideoParam *par) { mfxStatus sts = VideoVPPBase::GetVideoParam(par); MFX_CHECK_STS( sts ); if (m_pHWVPP.get()) { return m_pHWVPP->GetVideoParams(par); } return sts; } mfxStatus VideoVPP_HW::VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { mfxStatus sts = VideoVPPBase::VppFrameCheck(in, out, aux, pEntryPoints, numEntryPoints); MFX_CHECK_STS( sts ); mfxStatus internalSts = m_pHWVPP.get()->VppFrameCheck( in, out, aux, pEntryPoints, numEntryPoints); bool isInverseTelecinedEnabled = false; const DdiTask* pTask = (DdiTask*)pEntryPoints[0].pParam ; isInverseTelecinedEnabled = IsFilterFound(&m_pipelineList[0], (mfxU32)m_pipelineList.size(), MFX_EXTBUFF_VPP_ITC); if (MFX_ERR_MORE_DATA == internalSts && true == isInverseTelecinedEnabled) { //internalSts = (mfxStatus) MFX_ERR_MORE_DATA_SUBMIT_TASK; } if( out && pTask && (MFX_ERR_NONE == internalSts || MFX_ERR_MORE_SURFACE == internalSts) ) { sts = PassThrough(NULL != in ? &(in->Info) : NULL, &(out->Info), pTask->taskIndex); //MFX_CHECK_STS( sts ); } return (MFX_ERR_NONE == internalSts) ? sts : internalSts; } mfxStatus VideoVPP_HW::PassThrough(mfxFrameInfo* In, mfxFrameInfo* Out, mfxU32 taskIndex) { if( In ) // no delay { mfxStatus sts; Out->AspectRatioH = In->AspectRatioH; Out->AspectRatioW = In->AspectRatioW; Out->PicStruct = UpdatePicStruct( In->PicStruct, Out->PicStruct, m_bDynamicDeinterlace, sts, taskIndex ); m_errPrtctState.Deffered.AspectRatioH = Out->AspectRatioH; m_errPrtctState.Deffered.AspectRatioW = Out->AspectRatioW; m_errPrtctState.Deffered.PicStruct = Out->PicStruct; // not "pass through" process. Frame Rates from Init. Out->FrameRateExtN = m_errPrtctState.Out.FrameRateExtN; Out->FrameRateExtD = m_errPrtctState.Out.FrameRateExtD; //return MFX_ERR_NONE; return sts; } else { if ( MFX_PICSTRUCT_UNKNOWN == Out->PicStruct && m_bDynamicDeinterlace ) { // Fix for case when app retrievs cached frames from ADI3->60 and output surf has unknown picstruct Out->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; } // in case of HW_VPP in==NULL means ERROR due to absence of delayed frames and should be processed before. // here we return OK only return MFX_ERR_NONE; } } // mfxStatus VideoVPPBase::PassThrough(mfxFrameInfo* In, mfxFrameInfo* Out) mfxStatus VideoVPP_HW::RunFrameVPP(mfxFrameSurface1* , mfxFrameSurface1* , mfxExtVppAuxData *) { return MFX_ERR_NONE; } #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_sw_internal.cpp000066400000000000000000000351741443134507600305530ustar00rootroot00000000000000// Copyright (c) 2010-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "math.h" #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_enc_common.h" #include "mfx_session.h" #include "mfx_vpp_hw.h" #include "mfxpcp.h" #include "mfx_vpp_sw.h" #include "mfx_vpp_utils.h" #include "umc_defs.h" // internal filters #include "mfx_denoise_vpp.h" #include "mfx_frame_rate_conversion_vpp.h" #include "mfx_procamp_vpp.h" #include "mfx_detail_enhancement_vpp.h" #if defined (ONEVPL_EXPERIMENTAL) #include "mfx_perc_enc_vpp.h" #endif //----------------------------------------------------------------------------- // independent functions //----------------------------------------------------------------------------- // all check must be done before call mfxStatus GetExternalFramesCount(VideoCORE* core, mfxVideoParam* pParam, mfxU32* pListID, mfxU32 len, mfxU16 framesCountMin[2], mfxU16 framesCountSuggested[2]) { mfxU32 filterIndex; mfxU16 inputFramesCount[MAX_NUM_VPP_FILTERS] = {0}; mfxU16 outputFramesCount[MAX_NUM_VPP_FILTERS] = {0}; for( filterIndex = 0; filterIndex < len; filterIndex++ ) { switch( pListID[filterIndex] ) { case (mfxU32)MFX_EXTBUFF_VPP_RSHIFT_IN: case (mfxU32)MFX_EXTBUFF_VPP_RSHIFT_OUT: case (mfxU32)MFX_EXTBUFF_VPP_LSHIFT_IN: case (mfxU32)MFX_EXTBUFF_VPP_LSHIFT_OUT: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_DENOISE: case (mfxU32)MFX_EXTBUFF_VPP_DENOISE2: { inputFramesCount[filterIndex] = MFXVideoVPPDenoise::GetInFramesCountExt(); outputFramesCount[filterIndex] = MFXVideoVPPDenoise::GetOutFramesCountExt(); break; } #ifdef MFX_ENABLE_MCTF case (mfxU32)MFX_EXTBUFF_VPP_MCTF: { mfxU16 MctfTemporalMode = CMC::DEFAULT_REFS; switch (MctfTemporalMode) { case MCTF_TEMPORAL_MODE_SPATIAL: // this is for spatial filtering mode only; 1 input is enough inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; case MCTF_TEMPORAL_MODE_1REF: // preasumably, this is for filtering mode with 1 backward refernce; 1 input is enough inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; case MCTF_TEMPORAL_MODE_2REF: // this is bi-directional MCTF with 2 referencies; thus 2 inputs are needed inputFramesCount[filterIndex] = 2; outputFramesCount[filterIndex] = 2; break; case MCTF_TEMPORAL_MODE_4REF: // this is bi-directional MCTF with 4 references(its not a mistake! thus 3 inputs are needed inputFramesCount[filterIndex] = 3; outputFramesCount[filterIndex] = 3; break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } break; } #endif #ifdef ONEVPL_EXPERIMENTAL case (mfxU32)MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } #endif case (mfxU32)MFX_EXTBUFF_VPP_RESIZE: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_ROTATION: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_SCALING: { break; } case (mfxU32)MFX_EXTBUFF_VPP_COLOR_CONVERSION: { break; } case (mfxU32)MFX_EXTBUFF_VPP_MIRRORING: { break; } case (mfxU32)MFX_EXTBUFF_VPP_3DLUT: { break; } case (mfxU32)MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN: { break; } case (mfxU32)MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT: { break; } case (mfxU32)MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO: { break; } case (mfxU32)MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN: { break; } case (mfxU32)MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT: { break; } case (mfxU32)MFX_EXTBUFF_VPP_DEINTERLACING: { break; } case (mfxU32)MFX_EXTBUFF_VPP_ITC: case (mfxU32)MFX_EXTBUFF_VPP_DI: { inputFramesCount[filterIndex] = 3; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_DI_30i60p: { inputFramesCount[filterIndex] = 3; outputFramesCount[filterIndex] = 1 << 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_DI_WEAVE: { inputFramesCount[filterIndex] = 3 << 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_CSC: case (mfxU32)MFX_EXTBUFF_VPP_CSC_OUT_RGB4: case (mfxU32)MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10: case (mfxU32)MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_SCENE_ANALYSIS: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: { // call Get[In/Out]FramesCountExt not correct for external application // result must be based on in/out frame rates mfxFrameInfo info; info = pParam->vpp.In; mfxF64 inFrameRate = CalculateUMCFramerate(info.FrameRateExtN, info.FrameRateExtD); if (fabs(inFrameRate-0) < 0.01) { return MFX_ERR_INVALID_VIDEO_PARAM; } info = pParam->vpp.Out; mfxF64 outFrameRate = CalculateUMCFramerate(info.FrameRateExtN, info.FrameRateExtD); outputFramesCount[ filterIndex ] = (mfxU16)(ceil(outFrameRate / inFrameRate)); outputFramesCount[ filterIndex ] = std::max(outputFramesCount[ filterIndex ], 1);//robustness // numInFrames = inFrameRate / inFrameRate = 1; inputFramesCount[ filterIndex ] = 1; // after analysis for correct FRC processing we require following equations inputFramesCount[ filterIndex ] = std::max( inputFramesCount[ filterIndex ], MFXVideoVPPFrameRateConversion::GetInFramesCountExt() ); outputFramesCount[ filterIndex ] = std::max( outputFramesCount[ filterIndex ], MFXVideoVPPFrameRateConversion::GetOutFramesCountExt() ); break; } case (mfxU32)MFX_EXTBUFF_VPP_PROCAMP: { inputFramesCount[filterIndex] = MFXVideoVPPProcAmp::GetInFramesCountExt(); outputFramesCount[filterIndex] = MFXVideoVPPProcAmp::GetOutFramesCountExt(); break; } case (mfxU32)MFX_EXTBUFF_VPP_DETAIL: { inputFramesCount[filterIndex] = MFXVideoVPPDetailEnhancement::GetInFramesCountExt(); outputFramesCount[filterIndex] = MFXVideoVPPDetailEnhancement::GetOutFramesCountExt(); break; } case (mfxU32)MFX_EXTBUFF_VPP_COMPOSITE: { for (mfxU32 i = 0; i < pParam->NumExtParam; i++) { if (pParam->ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_COMPOSITE) { mfxExtVPPComposite* extComp = (mfxExtVPPComposite*) pParam->ExtParam[i]; if (extComp->NumInputStream > MAX_NUM_OF_VPP_COMPOSITE_STREAMS) { return MFX_ERR_INVALID_VIDEO_PARAM; } else { if ((core->GetVAType() == MFX_HW_D3D9) && (extComp->NumInputStream > MAX_STREAMS_PER_TILE)) return MFX_ERR_INVALID_VIDEO_PARAM; inputFramesCount[filterIndex] = extComp->NumInputStream; } for(mfxU32 j = 0; j < extComp->NumInputStream; j++) { if (pParam->vpp.Out.Width < (extComp->InputStream[j].DstX + extComp->InputStream[j].DstW)) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; if (pParam->vpp.Out.Height < (extComp->InputStream[j].DstY + extComp->InputStream[j].DstH)) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } } } /*for (mfxU32 i = 0; i < pParam->NumExtParam; i++)*/ /* for output always one */ outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_PROCESSING: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_WEAVING: { inputFramesCount[filterIndex] = 2; outputFramesCount[filterIndex] = 1; break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_SPLITTING: { inputFramesCount[filterIndex] = 1; outputFramesCount[filterIndex] = 2; break; } default: { return MFX_ERR_INVALID_VIDEO_PARAM; } }// CASE }//end of framesCountSuggested[VPP_IN] = vppMax_16u(inputFramesCount, len); framesCountSuggested[VPP_OUT] = vppMax_16u(outputFramesCount, len); // so, SW min frames must be equal MAX(filter0, filter1, ..., filterN-1) framesCountMin[VPP_IN] = framesCountSuggested[VPP_IN]; framesCountMin[VPP_OUT] = framesCountSuggested[VPP_OUT]; //robustness if( VPP_MAX_REQUIRED_FRAMES_COUNT < framesCountMin[VPP_IN] ) { framesCountMin[VPP_IN] = VPP_MAX_REQUIRED_FRAMES_COUNT; } if( VPP_MAX_REQUIRED_FRAMES_COUNT < framesCountMin[VPP_OUT] ) { framesCountMin[VPP_OUT] = VPP_MAX_REQUIRED_FRAMES_COUNT; } return MFX_ERR_NONE; } // mfxStatus GetExternalFramesCount(...) // all check must be done before call bool IsCompositionMode(mfxVideoParam* pParam) { if (pParam->ExtParam && pParam->NumExtParam > 0) { for (mfxU32 i = 0; i < pParam->NumExtParam; ++i) { mfxExtBuffer *pExtBuffer = pParam->ExtParam[i]; if (pExtBuffer->BufferId == (mfxU32)MFX_EXTBUFF_VPP_COMPOSITE) return true; } } return false; } mfxStatus ExtendedQuery(VideoCORE *, mfxU32 filterName, mfxExtBuffer* pHint) { if( MFX_EXTBUFF_VPP_DENOISE == filterName || MFX_EXTBUFF_VPP_DENOISE2 == filterName ) { MFX_RETURN(MFXVideoVPPDenoise::Query( pHint )); } #ifdef MFX_ENABLE_MCTF else if (MFX_EXTBUFF_VPP_MCTF == filterName) { MFX_RETURN(CMC::CheckAndFixParams((mfxExtVppMctf*)pHint)); } #endif #ifdef ONEVPL_EXPERIMENTAL else if (MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER == filterName) { MFX_RETURN(PercEncPrefilter::PercEncFilter::Query(pHint)); } #endif else if( MFX_EXTBUFF_VPP_DETAIL == filterName ) { MFX_RETURN(MFXVideoVPPDetailEnhancement::Query( pHint )); } else if( MFX_EXTBUFF_VPP_PROCAMP == filterName ) { MFX_RETURN(MFXVideoVPPProcAmp::Query( pHint )); } else if( MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION == filterName ) { MFX_RETURN(MFXVideoVPPFrameRateConversion::Query( pHint )); } else if( MFX_EXTBUFF_VPP_IMAGE_STABILIZATION == filterName ) { MFX_RETURN(MFX_WRN_FILTER_SKIPPED); } else if( MFX_EXTBUFF_VPP_SCENE_ANALYSIS == filterName ) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } else if( MFX_EXTBUFF_VPP_COMPOSITE == filterName ) { return MFX_ERR_NONE; } else if( MFX_EXTBUFF_VPP_FIELD_PROCESSING == filterName ) { return MFX_ERR_NONE; } else if (MFX_EXTBUFF_VPP_SCALING == filterName) { MFX_RETURN(CheckScalingParam(pHint)); } else // ignore { return MFX_ERR_NONE; } } // mfxStatus ExtendedQuery(VideoCORE * core, mfxU32 filterName, mfxExtBuffer* pHint) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/mfx_lib/vpp/src/mfx_vpp_utils.cpp000066400000000000000000002277561443134507600273770ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include "mfx_enc_common.h" #include "mfx_vpp_utils.h" #include "mfx_vpp_hw.h" #include "ipps.h" #include "ippi.h" #include "ippcc.h" #include "umc_defs.h" const mfxU32 g_TABLE_DO_NOT_USE [] = { MFX_EXTBUFF_VPP_DENOISE, #ifdef MFX_ENABLE_MCTF MFX_EXTBUFF_VPP_MCTF, #endif MFX_EXTBUFF_VPP_SCENE_ANALYSIS, MFX_EXTBUFF_VPP_PROCAMP, MFX_EXTBUFF_VPP_DETAIL, MFX_EXTBUFF_VPP_IMAGE_STABILIZATION, MFX_EXTBUFF_VPP_COMPOSITE, MFX_EXTBUFF_VPP_ROTATION, MFX_EXTBUFF_VPP_SCALING, MFX_EXTBUFF_VPP_COLOR_CONVERSION, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO, MFX_EXTBUFF_VPP_FIELD_PROCESSING, MFX_EXTBUFF_VPP_MIRRORING, MFX_EXTBUFF_VPP_3DLUT, MFX_EXTBUFF_VPP_DENOISE2, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT }; const mfxU32 g_TABLE_DO_USE [] = { MFX_EXTBUFF_VPP_DENOISE, #ifdef MFX_ENABLE_MCTF MFX_EXTBUFF_VPP_MCTF, #endif MFX_EXTBUFF_VPP_SCENE_ANALYSIS, MFX_EXTBUFF_VPP_PROCAMP, MFX_EXTBUFF_VPP_DETAIL, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION, MFX_EXTBUFF_VPP_IMAGE_STABILIZATION, MFX_EXTBUFF_VPP_COMPOSITE, MFX_EXTBUFF_VPP_ROTATION, MFX_EXTBUFF_VPP_SCALING, MFX_EXTBUFF_VPP_COLOR_CONVERSION, MFX_EXTBUFF_VPP_DEINTERLACING, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO, MFX_EXTBUFF_VPP_FIELD_PROCESSING, MFX_EXTBUFF_VPP_MIRRORING, MFX_EXTBUFF_VPP_3DLUT, MFX_EXTBUFF_VPP_DENOISE2, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT }; // should be synch with GetConfigSize() const mfxU32 g_TABLE_CONFIG [] = { MFX_EXTBUFF_VPP_DENOISE, #ifdef MFX_ENABLE_MCTF MFX_EXTBUFF_VPP_MCTF, #endif MFX_EXTBUFF_VPP_SCENE_ANALYSIS, MFX_EXTBUFF_VPP_PROCAMP, MFX_EXTBUFF_VPP_DETAIL, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION, MFX_EXTBUFF_VPP_IMAGE_STABILIZATION, MFX_EXTBUFF_VPP_COMPOSITE, MFX_EXTBUFF_VPP_ROTATION, MFX_EXTBUFF_VPP_DEINTERLACING, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO, MFX_EXTBUFF_VPP_FIELD_PROCESSING, MFX_EXTBUFF_VPP_SCALING, MFX_EXTBUFF_VPP_COLOR_CONVERSION, MFX_EXTBUFF_VPP_MIRRORING, MFX_EXTBUFF_VPP_3DLUT, MFX_EXTBUFF_VPP_DENOISE2, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT, MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT, MFX_EXTBUF_CAM_PIPECONTROL, MFX_EXTBUF_CAM_3DLUT, MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION, MFX_EXTBUF_CAM_WHITE_BALANCE, MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION, MFX_EXTBUF_CAM_BAYER_DENOISE, MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL, MFX_EXTBUF_CAM_VIGNETTE_CORRECTION, MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3, MFX_EXTBUF_CAM_PADDING, MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION, MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL, MFX_EXTBUF_CAM_CSC_YUV_RGB #if defined (ONEVPL_EXPERIMENTAL) , MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER #endif }; const mfxU32 g_TABLE_EXT_PARAM [] = { MFX_EXTBUFF_ALLOCATION_HINTS, MFX_EXTBUFF_MVC_SEQ_DESC, MFX_EXTBUFF_VPP_DONOTUSE, MFX_EXTBUFF_VPP_DOUSE, // should be the same as g_TABLE_CONFIG MFX_EXTBUFF_VPP_DENOISE, #ifdef MFX_ENABLE_MCTF MFX_EXTBUFF_VPP_MCTF, #endif MFX_EXTBUFF_VPP_SCENE_ANALYSIS, MFX_EXTBUFF_VPP_PROCAMP, MFX_EXTBUFF_VPP_DETAIL, MFX_EXTBUFF_VPP_ROTATION, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION, MFX_EXTBUFF_VPP_IMAGE_STABILIZATION, MFX_EXTBUFF_VPP_COMPOSITE, MFX_EXTBUFF_VPP_DEINTERLACING, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO, MFX_EXTBUFF_VPP_FIELD_PROCESSING, MFX_EXTBUFF_VPP_SCALING, MFX_EXTBUFF_VPP_COLOR_CONVERSION, MFX_EXTBUFF_VPP_MIRRORING, MFX_EXTBUFF_VPP_3DLUT, MFX_EXTBUFF_VPP_DENOISE2, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT, MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT, MFX_EXTBUF_CAM_PIPECONTROL, MFX_EXTBUF_CAM_3DLUT, MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION, MFX_EXTBUF_CAM_WHITE_BALANCE, MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION, MFX_EXTBUF_CAM_BAYER_DENOISE, MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL, MFX_EXTBUF_CAM_VIGNETTE_CORRECTION, MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3, MFX_EXTBUF_CAM_PADDING, MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION, MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL, MFX_EXTBUF_CAM_CSC_YUV_RGB #if defined (ONEVPL_EXPERIMENTAL) , MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER #endif }; PicStructMode GetPicStructMode(mfxU16 inPicStruct, mfxU16 outPicStruct) { if( (inPicStruct & (MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_TFF)) && MFX_PICSTRUCT_PROGRESSIVE == outPicStruct) { return DYNAMIC_DI_PICSTRUCT_MODE; } else if( MFX_PICSTRUCT_UNKNOWN == inPicStruct && MFX_PICSTRUCT_PROGRESSIVE == outPicStruct) { return DYNAMIC_DI_PICSTRUCT_MODE; } else { return PASS_THROUGH_PICSTRUCT_MODE; } } // PicStructMode GetPicStructMode(mfxU16 inPicStruct, mfxU16 outPicStruct) // in according with spec requirements VPP controls input picstruct mfxStatus CheckInputPicStruct( mfxU16 inPicStruct ) { /*if( MFX_PICSTRUCT_UNKNOWN == inPicStruct ) { return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; }*/ const mfxU16 case1 = MFX_PICSTRUCT_PROGRESSIVE; const mfxU16 case2 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_DOUBLING; const mfxU16 case3 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FRAME_TRIPLING; const mfxU16 case4 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF; const mfxU16 case5 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF; const mfxU16 case6 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_BFF | MFX_PICSTRUCT_FIELD_REPEATED; const mfxU16 case7 = MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_REPEATED; const mfxU16 case8 = MFX_PICSTRUCT_FIELD_BFF; const mfxU16 case9 = MFX_PICSTRUCT_FIELD_TFF; const mfxU16 case10 = MFX_PICSTRUCT_FIELD_SINGLE; const mfxU16 case11 = MFX_PICSTRUCT_FIELD_TOP; const mfxU16 case12 = MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_PAIRED_NEXT; const mfxU16 case13 = MFX_PICSTRUCT_FIELD_TOP | MFX_PICSTRUCT_FIELD_PAIRED_PREV; const mfxU16 case14 = MFX_PICSTRUCT_FIELD_BOTTOM; const mfxU16 case15 = MFX_PICSTRUCT_FIELD_BOTTOM | MFX_PICSTRUCT_FIELD_PAIRED_NEXT; const mfxU16 case16 = MFX_PICSTRUCT_FIELD_BOTTOM | MFX_PICSTRUCT_FIELD_PAIRED_PREV; mfxStatus sts = MFX_ERR_NONE; switch( inPicStruct ) { case case1: case case2: case case3: case case4: case case5: case case6: case case7: case case8: case case9: case case10: case case11: case case12: case case13: case case14: case case15: case case16: { sts = MFX_ERR_NONE; break; } default: { sts = MFX_ERR_UNDEFINED_BEHAVIOR; break; } } return sts; } // mfxStatus CheckInputPicStruct( mfxU16 inPicStruct ) // rules for this algorithm see in spec mfxU16 UpdatePicStruct( mfxU16 inPicStruct, mfxU16 outPicStruct, bool bDynamicDeinterlace, mfxStatus& sts, mfxU32 outputFrameCounter ) { mfxU16 resultPicStruct; // XXX->UNKOWN if( MFX_PICSTRUCT_UNKNOWN == outPicStruct ) { if( (inPicStruct & MFX_PICSTRUCT_PROGRESSIVE) || !bDynamicDeinterlace ) { resultPicStruct = inPicStruct; } else // DynamicDeinterlace { resultPicStruct = MFX_PICSTRUCT_PROGRESSIVE; } sts = MFX_ERR_NONE; return resultPicStruct; } // PROGRESSIVE->PROGRESSIVE mfxU16 inPicStructCore = (mfxU16)(inPicStruct & MFX_PICSTRUCT_PROGRESSIVE); mfxU16 outPicStructCore = (mfxU16)(outPicStruct & MFX_PICSTRUCT_PROGRESSIVE); if( inPicStructCore && outPicStructCore ) { mfxU16 decorateFlags = ( MFX_PICSTRUCT_FRAME_DOUBLING | MFX_PICSTRUCT_FRAME_TRIPLING | MFX_PICSTRUCT_FIELD_REPEATED | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF ); resultPicStruct = outPicStruct | ( inPicStruct & decorateFlags ); sts = MFX_ERR_NONE; return resultPicStruct; } // PROGRESSIVE->INTERLACE else if( (inPicStruct & MFX_PICSTRUCT_PROGRESSIVE) && (outPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) ) { resultPicStruct = outPicStruct; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return resultPicStruct; } // INTERLACE->PROGRESSIVE else if( (inPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) && (outPicStruct & MFX_PICSTRUCT_PROGRESSIVE) ) { resultPicStruct = outPicStruct; sts = (bDynamicDeinterlace) ? MFX_ERR_NONE : MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return resultPicStruct; } // INTERLACE->FIELDS if( (inPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) && (outPicStruct & MFX_PICSTRUCT_FIELD_SINGLE) ) { if (inPicStruct & MFX_PICSTRUCT_FIELD_TFF) { resultPicStruct = (mfxU16)((outputFrameCounter & 1) ? MFX_PICSTRUCT_FIELD_BOTTOM : MFX_PICSTRUCT_FIELD_TOP); } else if(inPicStruct & MFX_PICSTRUCT_FIELD_BFF) { resultPicStruct = (mfxU16)((outputFrameCounter & 1) ? MFX_PICSTRUCT_FIELD_TOP : MFX_PICSTRUCT_FIELD_BOTTOM); } else // return error on progressive input { sts = MFX_ERR_INVALID_VIDEO_PARAM; resultPicStruct = outPicStruct; return resultPicStruct; } sts = MFX_ERR_NONE; return resultPicStruct; } // FIELDS->INTERLACE if( (inPicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && (outPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF)) ) { resultPicStruct = outPicStruct; sts = MFX_ERR_NONE; return resultPicStruct; } // INTERLACE->INTERLACE inPicStructCore = inPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF); outPicStructCore = outPicStruct & (MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_BFF); if( inPicStructCore == outPicStructCore ) // the same type (tff->tff or bff->bff) { mfxU16 decorateFlags = ( MFX_PICSTRUCT_FRAME_DOUBLING | MFX_PICSTRUCT_FRAME_TRIPLING | MFX_PICSTRUCT_FIELD_REPEATED ); resultPicStruct = outPicStruct | ( inPicStruct & decorateFlags ); //sts = MFX_ERR_NONE; sts = ( !bDynamicDeinterlace ) ? MFX_ERR_NONE : MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return resultPicStruct; } else if( inPicStructCore && outPicStructCore ) // different type (tff->bff or bff->tff) { resultPicStruct = outPicStruct; sts = MFX_WRN_INCOMPATIBLE_VIDEO_PARAM; return resultPicStruct; } // default resultPicStruct = outPicStruct; sts = MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; return resultPicStruct; } // void UpdatePicStruct( mfxU16 inPicStruct, mfxU16& outPicStruct, PicStructMode mode ) // this function requires 0!= FrameRate bool IsFrameRatesCorrespondITC(mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD) { //under investigation. now we decided ITC is enabled 29.97(+/-)0.1 -> 23.976(+/-)0.1 const mfxF64 EPS = 0.1; const mfxF64 IN_FRAME_RATE_ETALON = 30.0 * 1000.0 / 1001.0; const mfxF64 OUT_FRAME_RATE_ETALON = 24.0 * 1000.0 / 1001.0; mfxF64 inFrameRate = CalculateUMCFramerate(inFrameRateExtN, inFrameRateExtD); mfxF64 outFrameRate = CalculateUMCFramerate(outFrameRateExtN, outFrameRateExtD); if( fabs(IN_FRAME_RATE_ETALON - inFrameRate) < EPS && fabs(OUT_FRAME_RATE_ETALON - outFrameRate) < EPS ) { return true; } return false; } // bool IsFrameRatesCorrespondITC(...) // this function requires 0!= FrameRate bool IsFrameRatesCorrespondDI(mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD, mfxU32* mode) { const mfxU32 RATIO_FOR_SINGLE_FIELD_PROCESSED = 1; const mfxU32 RATIO_FOR_BOTH_FIELDS_PROCESSED = 2; // convert to internal mfx frame rates range mfxF64 inFrameRate = CalculateUMCFramerate(inFrameRateExtN, inFrameRateExtD); mfxF64 outFrameRate = CalculateUMCFramerate(outFrameRateExtN, outFrameRateExtD); CalculateMFXFramerate(inFrameRate, &inFrameRateExtN, &inFrameRateExtD); CalculateMFXFramerate(outFrameRate, &outFrameRateExtN, &outFrameRateExtD); if( inFrameRateExtD != outFrameRateExtD ) { return false; } mfxU32 residue = outFrameRateExtN % inFrameRateExtN; mfxU32 ratio = outFrameRateExtN / inFrameRateExtN; if( (inFrameRateExtD == outFrameRateExtD) && (0 == residue) && ( (RATIO_FOR_SINGLE_FIELD_PROCESSED == ratio) || ( RATIO_FOR_BOTH_FIELDS_PROCESSED == ratio) ) ) { if( NULL != mode ) { *mode = ratio-1; } return true; } return false; } // bool IsFrameRatesCorrespondDI(...) bool IsFrameRatesCorrespondWeaving(mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD) { const mfxU32 RATIO_FOR_SINGLE_FIELD_PROCESSED = 1; const mfxU32 RATIO_FOR_BOTH_FIELDS_PROCESSED = 2; // convert to internal mfx frame rates range mfxF64 inFrameRate = CalculateUMCFramerate(inFrameRateExtN, inFrameRateExtD); mfxF64 outFrameRate = CalculateUMCFramerate(outFrameRateExtN, outFrameRateExtD); CalculateMFXFramerate(inFrameRate, &inFrameRateExtN, &inFrameRateExtD); CalculateMFXFramerate(outFrameRate, &outFrameRateExtN, &outFrameRateExtD); if( inFrameRateExtD != outFrameRateExtD ) { return false; } mfxU32 residue = inFrameRateExtN % outFrameRateExtN; mfxU32 ratio = inFrameRateExtN / outFrameRateExtN; if( (inFrameRateExtD == outFrameRateExtD) && (0 == residue) && ( (RATIO_FOR_SINGLE_FIELD_PROCESSED == ratio) || ( RATIO_FOR_BOTH_FIELDS_PROCESSED == ratio) ) ) { return true; } return false; } // bool IsFrameRatesCorrespondModeWeaving(...) bool IsFrameRatesCorrespondMode30i60p(mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD) { mfxU32 modeAdvDI; bool bResult = IsFrameRatesCorrespondDI(inFrameRateExtN, inFrameRateExtD, outFrameRateExtN, outFrameRateExtD, &modeAdvDI); if( bResult && modeAdvDI ) { return true; } return false; } // bool IsFrameRatesCorrespondMode60i60p(...) bool IsFrameRatesCorrespondDIorITC(mfxU32 inFrameRateExtN, mfxU32 inFrameRateExtD, mfxU32 outFrameRateExtN, mfxU32 outFrameRateExtD) { bool isITCRespond = IsFrameRatesCorrespondITC(inFrameRateExtN, inFrameRateExtD, outFrameRateExtN, outFrameRateExtD); bool isDIRespond = IsFrameRatesCorrespondDI(inFrameRateExtN, inFrameRateExtD, outFrameRateExtN, outFrameRateExtD, NULL); if( isITCRespond || isDIRespond ) { return true; } return false; } // bool IsFrameRatesCorrespondDIorITC(...) mfxStatus GetFilterParam(mfxVideoParam* par, mfxU32 filterName, mfxExtBuffer** ppHint) { MFX_CHECK_NULL_PTR1( par ); MFX_CHECK_NULL_PTR1( ppHint ); *ppHint = NULL; if( par->ExtParam && par->NumExtParam > 0 ) { mfxU32 paramIndex; for( paramIndex = 0; paramIndex < par->NumExtParam; paramIndex++ ) { if( filterName == par->ExtParam[paramIndex]->BufferId ) { *ppHint = par->ExtParam[paramIndex]; break; } } } return MFX_ERR_NONE; } // mfxStatus GetFilterParam(mfxVideoParam* par, mfxU32 filterName, mfxExtBuffer** ppHint) bool IsRoiDifferent(mfxFrameSurface1 *input, mfxFrameSurface1 *output) { if ((input->Info.Width == output->Info.Width && input->Info.Height == output->Info.Height) && (input->Info.CropW == output->Info.CropW && input->Info.CropH == output->Info.CropH) && (input->Info.CropX == output->Info.CropX && input->Info.CropY == output->Info.CropY) && (input->Info.PicStruct == output->Info.PicStruct) ) { return false; } return true; } // bool IsRoiDifferent(mfxFrameSurface1 *input, mfxFrameSurface1 *output) void ShowPipeline( std::vector pipelineList ) { #if !defined(_DEBUG) (void)pipelineList; #endif #ifdef _DEBUG mfxU32 filterIndx; fprintf(stderr, "VPP PIPELINE: \n"); for( filterIndx = 0; filterIndx < pipelineList.size(); filterIndx++ ) { switch( pipelineList[filterIndx] ) { case (mfxU32)MFX_EXTBUFF_VPP_DENOISE: case (mfxU32)MFX_EXTBUFF_VPP_DENOISE2: { fprintf(stderr, "DENOISE \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_RSHIFT_IN: { fprintf(stderr, "MFX_EXTBUFF_VPP_RSHIFT_IN \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_RSHIFT_OUT: { fprintf(stderr, "MFX_EXTBUFF_VPP_RSHIFT_OUT \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_LSHIFT_IN: { fprintf(stderr, "MFX_EXTBUFF_VPP_LSHIFT_IN \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_LSHIFT_OUT: { fprintf(stderr, "MFX_EXTBUFF_VPP_LSHIFT_OUT \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_RESIZE: { fprintf(stderr, "RESIZE \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: { fprintf(stderr, "FRC \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_DI_30i60p: { fprintf(stderr, "ADV DI 30i60p \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_DI_WEAVE: { fprintf(stderr, "WEAVE DI\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_ITC: { fprintf(stderr, "ITC \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_DI: { fprintf(stderr, "DI \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_DEINTERLACING: { fprintf(stderr, "DI EXT BUF\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_CSC: { fprintf(stderr, "CSC_NV12 \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_CSC_OUT_RGB4: { fprintf(stderr,"%s \n", "CSC_RGB4"); break; } case (mfxU32)MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10: { fprintf(stderr, "CSC_A2RGB10 \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_SCENE_ANALYSIS: { fprintf(stderr, "SA \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_PROCAMP: { fprintf(stderr, "PROCAMP \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_DETAIL: { fprintf(stderr, "DETAIL \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_COMPOSITE: { fprintf(stderr, "COMPOSITE \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_PROCESSING: { fprintf(stderr, "VPP_FIELD_PROCESSING \n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_ROTATION: { fprintf(stderr, "VPP_ROTATION\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_SCALING: { fprintf(stderr,"MFX_EXTBUFF_VPP_SCALING\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_COLOR_CONVERSION: { fprintf(stderr,"MFX_EXTBUFF_VPP_COLOR_CONVERSION\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO: { fprintf(stderr,"MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_MIRRORING: { fprintf(stderr,"MFX_EXTBUFF_VPP_MIRRORING\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_WEAVING: { fprintf(stderr, "VPP_FIELD_WEAVING\n"); break; } case (mfxU32)MFX_EXTBUFF_VPP_FIELD_SPLITTING: { fprintf(stderr, "VPP_FIELD_SPLITTING\n"); break; } #ifdef MFX_ENABLE_MCTF case (mfxU32)MFX_EXTBUFF_VPP_MCTF: { fprintf(stderr, "VPP_MCTF\n"); break; } #endif #if defined (ONEVPL_EXPERIMENTAL) case MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER: { fprintf(stderr, "VPP_PERC_ENC_PREFILTER\n"); break; } #endif case (mfxU32)MFX_EXTBUFF_VPP_3DLUT: { fprintf(stderr, "MFX_EXTBUFF_VPP_3DLUT\n"); break; } case (mfxU32)MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN: { fprintf(stderr, "MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN\n"); break; } case (mfxU32)MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT: { fprintf(stderr, "MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT\n"); break; } default: { fprintf(stderr, "UNKNOWN Filter ID!!! \n"); break; } }// CASE } //end of filter search //fprintf(stderr,"\n"); #endif //#ifdef _DEBUG return; } // void ShowPipeline( std::vector pipelineList ) /* ********************************************************************************************** */ /* Pipeline Building Stage */ /* ********************************************************************************************** */ /* VPP best quality is |CSC| + |DN| + |DI| + |IS| + |RS| + |Detail| + |ProcAmp| + |FRC| + |SA| */ /* SW_VPP reorder |FRC| to meet best speed */ /* ********************************************************************************************** */ void ReorderPipelineListForQuality( std::vector & pipelineList ) { //mfxU32 newList[MAX_NUM_VPP_FILTERS] = {0}; std::vector newList; newList.resize( pipelineList.size() ); mfxU32 index = 0; // [-1] Shift is very first, since shifted content is not supported by VPP if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_RSHIFT_IN ) ) { newList[index] = MFX_EXTBUFF_VPP_RSHIFT_IN; index++; } // [0] canonical order if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_CSC ) ) { newList[index] = MFX_EXTBUFF_VPP_CSC; index++; } // Resize for Best Speed /*if( IsFilterFound( pList, len, MFX_EXTBUFF_VPP_RESIZE ) ) { newList[index] = MFX_EXTBUFF_VPP_RESIZE; index++; }*/ if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DENOISE2 )) { newList[index] = MFX_EXTBUFF_VPP_DENOISE2; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DENOISE ) ) { newList[index] = MFX_EXTBUFF_VPP_DENOISE; index++; } // DI, advDI, ITC has the same priority if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI ) ) { newList[index] = MFX_EXTBUFF_VPP_DI; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_WEAVE ) ) { newList[index] = MFX_EXTBUFF_VPP_DI_WEAVE; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_30i60p ) ) { newList[index] = MFX_EXTBUFF_VPP_DI_30i60p; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ITC ) ) { newList[index] = MFX_EXTBUFF_VPP_ITC; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DEINTERLACING ) && ! IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_30i60p ) && ! IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_WEAVE ) && ! IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI )) { newList[index] = MFX_EXTBUFF_VPP_DEINTERLACING; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO ) ) { newList[index] = MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO; index++; } // Resize for Best Quality if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_RESIZE ) ) { newList[index] = MFX_EXTBUFF_VPP_RESIZE; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DETAIL ) ) { newList[index] = MFX_EXTBUFF_VPP_DETAIL; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_PROCAMP ) ) { newList[index] = MFX_EXTBUFF_VPP_PROCAMP; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ) ) { newList[index] = MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_3DLUT ) ) { newList[index] = MFX_EXTBUFF_VPP_3DLUT; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN) ) { newList[index] = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT) ) { newList[index] = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT; index++; } if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO)) { newList[index] = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO; index++; } if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN)) { newList[index] = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN; index++; } if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT)) { newList[index] = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_SCENE_ANALYSIS ) ) { newList[index] = MFX_EXTBUFF_VPP_SCENE_ANALYSIS; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_CSC_OUT_RGB4 ) ) { newList[index] = MFX_EXTBUFF_VPP_CSC_OUT_RGB4; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10 ) ) { newList[index] = MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_COMPOSITE ) ) { newList[index] = MFX_EXTBUFF_VPP_COMPOSITE; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_PROCESSING ) ) { newList[index] = MFX_EXTBUFF_VPP_FIELD_PROCESSING; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_WEAVING ) ) { newList[index] = MFX_EXTBUFF_VPP_FIELD_WEAVING; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FIELD_SPLITTING ) ) { newList[index] = MFX_EXTBUFF_VPP_FIELD_SPLITTING; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_LSHIFT_OUT ) ) { newList[index] = MFX_EXTBUFF_VPP_LSHIFT_OUT; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ROTATION ) ) { newList[index] = MFX_EXTBUFF_VPP_ROTATION; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_SCALING ) ) { newList[index] = MFX_EXTBUFF_VPP_SCALING; index++; } if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_COLOR_CONVERSION)) { newList[index] = MFX_EXTBUFF_VPP_COLOR_CONVERSION; index++; } if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_MIRRORING ) ) { newList[index] = MFX_EXTBUFF_VPP_MIRRORING; index++; } #ifdef MFX_ENABLE_MCTF // add to the end if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_MCTF)) { newList[index] = MFX_EXTBUFF_VPP_MCTF; index++; } #endif #if defined (ONEVPL_EXPERIMENTAL) if (IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER)) { newList[index] = MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER; index++; } #endif // [1] update pipelineList.resize(index); for( index = 0; index < (mfxU32)pipelineList.size(); index++ ) { pipelineList[index] = newList[index]; } } // void ReorderPipelineListForQuality(std::vector & pipelineList) void ReorderPipelineListForSpeed( mfxVideoParam* videoParam, std::vector & pipelineList) { // optimization in case of FRC if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ) ) { mfxFrameInfo* in = &(videoParam->vpp.In); mfxFrameInfo* out = &(videoParam->vpp.Out); mfxF64 inFrameRate = CalculateUMCFramerate(in->FrameRateExtN, in->FrameRateExtD); mfxF64 outFrameRate = CalculateUMCFramerate(out->FrameRateExtN, out->FrameRateExtD); mfxU32 filterIndex = 0; mfxU32 filterIndexFRC = GetFilterIndex(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION); if( inFrameRate > outFrameRate ) { // FRC_DOWN must be first filter in pipeline for( filterIndex = filterIndexFRC; filterIndex > 0; filterIndex-- ) { std::swap(pipelineList[filterIndex], pipelineList[filterIndex-1]); } //exclude CSC if( IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_CSC ) ) { std::swap(pipelineList[1], pipelineList[0]); } } } } // void ReorderPipelineListForSpeed(mfxVideoParam* videoParam, std::vector & pipelineList) mfxStatus GetPipelineList( mfxVideoParam* videoParam, //mfxU32* pList, std::vector & pipelineList, //mfxU32* pLen, bool bExtended) { mfxInfoVPP* par = NULL; mfxFrameInfo* srcFrameInfo = NULL; mfxFrameInfo* dstFrameInfo = NULL; mfxStatus sts = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1( videoParam ); //MFX_CHECK_NULL_PTR2( pList, pLen ); par = &(videoParam->vpp); srcFrameInfo = &(par->In); dstFrameInfo = &(par->Out); /* ************************************************************************** */ /* [1] the filter chain first based on input and output mismatch formats only */ /* ************************************************************************** */ if( (MFX_FOURCC_RGB4 != par->In.FourCC) || (MFX_FOURCC_RGB4 != par->Out.FourCC) ) { switch (par->In.FourCC) { case MFX_FOURCC_P210: switch (par->Out.FourCC) { case MFX_FOURCC_A2RGB10: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10); break; case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: case MFX_FOURCC_P010: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC); break; } break; case MFX_FOURCC_P010: switch (par->Out.FourCC) { case MFX_FOURCC_A2RGB10: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC_OUT_A2RGB10); break; case MFX_FOURCC_NV12: case MFX_FOURCC_P210: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC); break; } break; case MFX_FOURCC_NV12: switch (par->Out.FourCC) { case MFX_FOURCC_NV16: case MFX_FOURCC_P010: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC); break; case MFX_FOURCC_RGB4: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC_OUT_RGB4); break; } break; default: switch (par->Out.FourCC) { case MFX_FOURCC_RGB4: pipelineList.push_back(MFX_EXTBUFF_VPP_CSC_OUT_RGB4); break; } break; } if( MFX_FOURCC_NV12 != par->In.FourCC && MFX_FOURCC_P010 != par->In.FourCC && MFX_FOURCC_P210 != par->In.FourCC) { /* [Color Space Conversion] FILTER */ pipelineList.push_back(MFX_EXTBUFF_VPP_CSC); } } else if (!bExtended) { /* ********************************************************************** */ /* RGB32->RGB32 (resize only) */ /* ********************************************************************** */ pipelineList.push_back(MFX_EXTBUFF_VPP_RESIZE); return MFX_ERR_NONE; } /* VPP natively supports P010 and P210 formats w/o shift. If input is shifted, * need get it back to normal position. */ if ( ( MFX_FOURCC_P010 == srcFrameInfo->FourCC || MFX_FOURCC_P210 == srcFrameInfo->FourCC) && srcFrameInfo->Shift ) { pipelineList.push_back(MFX_EXTBUFF_VPP_RSHIFT_IN); } /* * VPP produces P010 and P210 formats w/o shift. If output is requested to be shifted, need to do so */ if ( ( MFX_FOURCC_P010 == dstFrameInfo->FourCC || MFX_FOURCC_P210 == dstFrameInfo->FourCC) && dstFrameInfo->Shift ) { pipelineList.push_back(MFX_EXTBUFF_VPP_LSHIFT_OUT); } { //resize or cropping pipelineList.push_back(MFX_EXTBUFF_VPP_RESIZE); } /* [Deinterlace] FILTER */ if( 0 != videoParam->NumExtParam && NULL == videoParam->ExtParam ) { return MFX_ERR_INVALID_VIDEO_PARAM; } PicStructMode picStructMode = GetPicStructMode(par->In.PicStruct, par->Out.PicStruct); mfxI32 deinterlacingMode = 0; for (mfxU32 i = 0; i < videoParam->NumExtParam; i++) { // look for user defined deinterlacing mode if (videoParam->ExtParam[i] && videoParam->ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_DEINTERLACING) { mfxExtVPPDeinterlacing* extDI = (mfxExtVPPDeinterlacing*) videoParam->ExtParam[i]; /* MSDK ignored all any DI modes values except two defined: * MFX_DEINTERLACING_ADVANCED && MFX_DEINTERLACING_BOB * If DI mode in Ext Buffer is not related BOB or ADVANCED Ext buffer ignored * */ if (extDI->Mode == MFX_DEINTERLACING_ADVANCED || #if defined (MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP) extDI->Mode == MFX_DEINTERLACING_ADVANCED_SCD || #endif extDI->Mode == MFX_DEINTERLACING_BOB || extDI->Mode == MFX_DEINTERLACING_ADVANCED_NOREF || extDI->Mode == MFX_DEINTERLACING_FIELD_WEAVING) { /* DI Ext buffer present * and DI type is correct * */ deinterlacingMode = extDI->Mode; } break; } // check scaling parameters else if (videoParam->ExtParam[i] && videoParam->ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_SCALING) { sts = CheckScalingParam(videoParam->ExtParam[i]); break; } } MFX_CHECK_STS(sts); /* DI configuration cases: * Default "-spic 0 -dpic 1" (TFF to progressive ) -> MFX_EXTBUFF_VPP_DI * Default "-spic 0 -dpic 1 -sf 30 -df 60" -> MFX_EXTBUFF_VPP_DI_30i60p * !!! in both cases above, DI mode, ADVANCED(ADI) or BOB will be selected later, by driver's caps analysis. * If ADI reported in driver's Caps MSDK should select ADI mode * */ if ((DYNAMIC_DI_PICSTRUCT_MODE == picStructMode ) || /* configuration via "-spic 0 -spic 1" */ (0 != deinterlacingMode) ) /* configuration via Ext Buf */ { if( IsFrameRatesCorrespondMode30i60p(par->In.FrameRateExtN, par->In.FrameRateExtD, par->Out.FrameRateExtN, par->Out.FrameRateExtD) ) { pipelineList.push_back(MFX_EXTBUFF_VPP_DI_30i60p); } else if( IsFrameRatesCorrespondITC(par->In.FrameRateExtN, par->In.FrameRateExtD, par->Out.FrameRateExtN, par->Out.FrameRateExtD) ) { pipelineList.push_back(MFX_EXTBUFF_VPP_ITC); } else if (0 != deinterlacingMode) // no need to create filter if both picstructs are progressive. { /* Put DI filter in pipeline only if filter configured via Ext buffer */ pipelineList.push_back(MFX_EXTBUFF_VPP_DEINTERLACING); } else if (DYNAMIC_DI_PICSTRUCT_MODE == picStructMode) { /* Put DI filter in pipeline only if filter configured via default way "-spic 0 -dpic 1" */ pipelineList.push_back(MFX_EXTBUFF_VPP_DI); } } /* Weaving DI part. Can be enabled thru ext buffer only, there is no dinamic enabling based on * input/output pic type */ if (MFX_DEINTERLACING_FIELD_WEAVING == deinterlacingMode && IsFrameRatesCorrespondWeaving(par->In.FrameRateExtN, par->In.FrameRateExtD, par->Out.FrameRateExtN, par->Out.FrameRateExtD)) { pipelineList.push_back(MFX_EXTBUFF_VPP_DI_WEAVE); } /* Field weaving/splitting cases: */ if ((par->In.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && !(par->Out.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE)) { pipelineList.push_back(MFX_EXTBUFF_VPP_FIELD_WEAVING); } else if (!(par->In.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && (par->Out.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE)) { pipelineList.push_back(MFX_EXTBUFF_VPP_FIELD_SPLITTING); } #ifdef MFX_ENABLE_MCTF for (mfxU32 i = 0; i < videoParam->NumExtParam; i++) { if (videoParam->ExtParam[i] && videoParam->ExtParam[i]->BufferId == MFX_EXTBUFF_VPP_MCTF) { pipelineList.push_back(MFX_EXTBUFF_VPP_MCTF); break; } } #endif /* ********************************************************************** */ /* 2. optional filters, enabled by default, disabled by DO_NOT_USE */ /* ********************************************************************** */ // DO_NOT_USE structure is ignored by VPP since MSDK 3.0 /* *************************************************************************** */ /* 3. optional filters, disabled by default, enabled by DO_USE */ /* *************************************************************************** */ mfxU32* pExtList = NULL; mfxU32 extCount = 0; GetDoUseFilterList( videoParam, &pExtList, &extCount ); /* [Core Frame Rate Conversion] FILTER */ /* must be used AFTER [Deinterlace] FILTER !!! due to SW performance specific */ if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_30i60p ) && !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_WEAVE ) && !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ITC ) ) { if( IsFilterFound( pExtList, extCount, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ) || ( par->In.FrameRateExtN * par->Out.FrameRateExtD != par->Out.FrameRateExtN * par->In.FrameRateExtD ) ) { pipelineList.push_back(MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION); } } mfxU32 searchCount = sizeof(g_TABLE_DO_USE) / sizeof(*g_TABLE_DO_USE); mfxU32 fCount = extCount; mfxU32 fIdx = 0; for(fIdx = 0; fIdx < fCount; fIdx++) { if( IsFilterFound( &g_TABLE_DO_USE[0], searchCount, pExtList[fIdx] ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), pExtList[fIdx]) ) { pipelineList.push_back( pExtList[fIdx] ); } } /* *************************************************************************** */ /* 4. optional filters, disabled by default, enabled by EXT_BUFFER */ /* *************************************************************************** */ mfxU32 configCount = std::max(sizeof(g_TABLE_CONFIG) / sizeof(*g_TABLE_CONFIG), videoParam->NumExtParam); std::vector configList(configCount); GetConfigurableFilterList( videoParam, &configList[0], &configCount ); /* [FrameRateConversion] FILTER */ if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_DI_30i60p ) && !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ITC ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ); } } /* ROTATION FILTER */ if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_ROTATION ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ROTATION) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_ROTATION ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_ROTATION ); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_SCALING ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_SCALING) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_SCALING ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_SCALING ); } } if (IsFilterFound(&configList[0], configCount, MFX_EXTBUFF_VPP_COLOR_CONVERSION) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_COLOR_CONVERSION)) { if (!IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_COLOR_CONVERSION)) { pipelineList.push_back(MFX_EXTBUFF_VPP_COLOR_CONVERSION); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_MIRRORING ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_MIRRORING) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_MIRRORING ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_MIRRORING ); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO ); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VPP_3DLUT ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_3DLUT) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_3DLUT ) ) { pipelineList.push_back( MFX_EXTBUFF_VPP_3DLUT ); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN ) ) { pipelineList.push_back( MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN ); } } if( IsFilterFound( &configList[0], configCount, MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT) ) { if( !IsFilterFound( &pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT ) ) { pipelineList.push_back( MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT ); } } if (IsFilterFound(&configList[0], configCount, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN)) { if (!IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN)) { pipelineList.push_back(MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN); } } if (IsFilterFound(&configList[0], configCount, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT)) { if (!IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT)) { pipelineList.push_back(MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT); } } if (IsFilterFound(&configList[0], configCount, MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO)) { if (!IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO)) { pipelineList.push_back(MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO); } } #if defined (ONEVPL_EXPERIMENTAL) if ( IsFilterFound(&configList[0], configCount, MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER)) { pipelineList.push_back(MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER); } #endif searchCount = sizeof(g_TABLE_CONFIG) / sizeof(*g_TABLE_CONFIG); fCount = configCount; for(fIdx = 0; fIdx < fCount; fIdx++) { if( IsFilterFound( g_TABLE_CONFIG, searchCount, configList[fIdx] ) && !IsFilterFound(&pipelineList[0], (mfxU32)pipelineList.size(), configList[fIdx]) ) { /* Add filter to the list. * Don't care about duplicates, they will be eliminated by Reorder... calls below */ pipelineList.push_back(configList[fIdx]); } /* if( IsFilterFound( g_TABLE_CONFIG */ } /*for(fIdx = 0; fIdx < fCount; fIdx++)*/ /* *************************************************************************** */ /* 5. reordering for speed/quality */ /* *************************************************************************** */ if( pipelineList.size() > 1 ) { ReorderPipelineListForQuality(pipelineList); ReorderPipelineListForSpeed(videoParam, pipelineList); } if( pipelineList.size() > 0 ) { ShowPipeline(pipelineList); } return ( ( pipelineList.size() > 0 ) ? MFX_ERR_NONE : MFX_ERR_INVALID_VIDEO_PARAM ); } // mfxStatus GetPipelineList(mfxVideoParam* videoParam, std::vector pipelineList) bool IsFilterFound( const mfxU32* pList, mfxU32 len, mfxU32 filterName ) { mfxU32 i; if( 0 == len ) { return false; } for( i = 0; i < len; i++ ) { if( filterName == pList[i] ) { return true; } } return false; } // bool IsFilterFound( mfxU32* pList, mfxU32 len, mfxU32 filterName ) // function requires filterName belong pList. all check must be done before mfxU32 GetFilterIndex( mfxU32* pList, mfxU32 len, mfxU32 filterName ) { mfxU32 filterIndex; for( filterIndex = 0; filterIndex < len; filterIndex++ ) { if( filterName == pList[filterIndex] ) { return filterIndex; } } return 0; } // mfxU32 GetFilterIndex( mfxU32* pList, mfxU32 len, mfxU32 filterName ) /* check each field of FrameInfo excluding PicStruct */ mfxStatus CheckFrameInfo(mfxFrameInfo* info, mfxU32 request) { mfxStatus mfxSts = MFX_ERR_NONE; /* FourCC */ switch (info->FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: #endif // MFX_ENABLE_FOURCC_RGB565 case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_P010: case MFX_FOURCC_P210: case MFX_FOURCC_NV16: case MFX_FOURCC_YUY2: // A2RGB10 supported as input in case of passthru copy case MFX_FOURCC_A2RGB10: break; case MFX_FOURCC_AYUV: break; case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: break; case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: break; case MFX_FOURCC_ABGR16F: case MFX_FOURCC_I420: case MFX_FOURCC_UYVY: break; case MFX_FOURCC_ARGB16: break; case MFX_FOURCC_R16: break; case MFX_FOURCC_IMC3: case MFX_FOURCC_YUV400: case MFX_FOURCC_YUV411: case MFX_FOURCC_YUV422H: case MFX_FOURCC_YUV422V: case MFX_FOURCC_YUV444: // UYVY is supported as input on Linux only if (VPP_OUT == request) return MFX_ERR_INVALID_VIDEO_PARAM; break; #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: if (VPP_IN == request) return MFX_ERR_INVALID_VIDEO_PARAM; break; default: return MFX_ERR_INVALID_VIDEO_PARAM; } /* Picture Size */ if( 0 == info->Width || 0 == info->Height ) { return MFX_ERR_INVALID_VIDEO_PARAM; } if ( (info->Width & 15 ) != 0 ) { return MFX_ERR_INVALID_VIDEO_PARAM; } /* Frame Rate */ if (0 == info->FrameRateExtN || 0 == info->FrameRateExtD) { return MFX_ERR_INVALID_VIDEO_PARAM; } /* checking Height based on PicStruct filed */ if (MFX_PICSTRUCT_PROGRESSIVE & info->PicStruct || MFX_PICSTRUCT_FIELD_SINGLE & info->PicStruct) { if ((info->Height & 15) !=0) { return MFX_ERR_INVALID_VIDEO_PARAM; } } else if( MFX_PICSTRUCT_FIELD_BFF & info->PicStruct || MFX_PICSTRUCT_FIELD_TFF & info->PicStruct || (MFX_PICSTRUCT_UNKNOWN == info->PicStruct)) { if ((info->Height & 15) != 0 ) { return MFX_ERR_INVALID_VIDEO_PARAM; } } else//error protection { return MFX_ERR_INVALID_VIDEO_PARAM; } return mfxSts; } // mfxStatus CheckFrameInfo(mfxFrameInfo* info, mfxU32 request) mfxStatus CompareFrameInfo(mfxFrameInfo* info1, mfxFrameInfo* info2) { MFX_CHECK_NULL_PTR2( info1, info2 ); if( info1->FourCC != info2->FourCC ) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; if( info1->Width < info2->Width ) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; if( info1->Height < info2->Height ) return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; return MFX_ERR_NONE; } // mfxStatus CompareFrameInfo(mfxFrameInfo* info1, mfxFrameInfo* info2) mfxStatus CheckCropParam( mfxFrameInfo* info ) { // in according with spec CropW/H are mandatory for VPP if( 0 == info->CropH || 0 == info->CropW ) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropX > info->Width) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropY > info->Height) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropW > info->Width) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropH > info->Height) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropX + info->CropW > info->Width) { return MFX_ERR_INVALID_VIDEO_PARAM; } if (info->CropY + info->CropH > info->Height) { return MFX_ERR_INVALID_VIDEO_PARAM; } return MFX_ERR_NONE; } // mfxStatus CheckCropParam( mfxFrameInfo* info ) mfxU16 vppMax_16u(const mfxU16* pSrc, int len) { mfxU16 maxElement = 0; for (int indx = 0 ; indx < len; indx++) { if ( pSrc[indx] > maxElement ) { maxElement = pSrc[indx]; } } return maxElement; } // mfxU16 vppMax_16u(const mfxU16* pSrc, int len) /* ********************************************* */ /* utility for parsering of VPP optional filters */ /* ********************************************* */ void GetDoNotUseFilterList( mfxVideoParam* par, mfxU32** ppList, mfxU32* pLen ) { mfxU32 i = 0; mfxExtVPPDoNotUse* pVPPHint = NULL; /* robustness */ *ppList = NULL; *pLen = 0; for( i = 0; i < par->NumExtParam; i++ ) { if( MFX_EXTBUFF_VPP_DONOTUSE == par->ExtParam[i]->BufferId ) { pVPPHint = (mfxExtVPPDoNotUse*)(par->ExtParam[i]); *ppList = pVPPHint->AlgList; *pLen = pVPPHint->NumAlg; return; } } return; } // void GetDoNotUseFilterList( mfxVideoParam* par, mfxU32** ppList, mfxU32* pLen ) void GetDoUseFilterList( mfxVideoParam* par, mfxU32** ppList, mfxU32* pLen ) { mfxU32 i = 0; mfxExtVPPDoUse* pVPPHint = NULL; /* robustness */ *ppList = NULL; *pLen = 0; for( i = 0; i < par->NumExtParam; i++ ) { if( MFX_EXTBUFF_VPP_DOUSE == par->ExtParam[i]->BufferId ) { pVPPHint = (mfxExtVPPDoUse*)(par->ExtParam[i]); *ppList = pVPPHint->AlgList; *pLen = pVPPHint->NumAlg; return; } } return; } // void GetDoUseFilterList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ) bool CheckFilterList(mfxU32* pList, mfxU32 count, bool bDoUseTable) { bool bResOK = true; // strong check if( (NULL == pList && count > 0) || (NULL != pList && count == 0) ) { bResOK = false; return bResOK; } mfxU32 searchCount = sizeof(g_TABLE_DO_USE) / sizeof( *g_TABLE_DO_USE ); mfxU32* pSearchTab = (mfxU32*)&g_TABLE_DO_USE[0]; if( !bDoUseTable ) { searchCount = sizeof(g_TABLE_DO_NOT_USE) / sizeof( *g_TABLE_DO_NOT_USE ); pSearchTab = (mfxU32*)&g_TABLE_DO_NOT_USE[0]; } mfxU32 fIdx = 0; for( fIdx = 0; fIdx < count; fIdx++ ) { mfxU32 curId = pList[fIdx]; if( !IsFilterFound(pSearchTab, searchCount, curId) ) { bResOK = false; //invalid ID } else if( fIdx == count - 1 ) { continue; } else if( IsFilterFound(pList + 1 + fIdx, count - 1 - fIdx, curId) ) { bResOK = false; //duplicate ID } } return bResOK; } // bool CheckFilterList(mfxU32* pList, mfxU32 count, bool bDoUseTable) bool GetExtParamList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen) { mfxU32 fIdx = 0; /* robustness */ *pLen = 0; mfxU32 searchCount = sizeof(g_TABLE_EXT_PARAM) / sizeof( *g_TABLE_EXT_PARAM ); mfxU32 fCount = par->NumExtParam; bool bResOK = true; for( fIdx = 0; fIdx < fCount; fIdx++ ) { mfxU32 curId = par->ExtParam[fIdx]->BufferId; if( IsFilterFound(g_TABLE_EXT_PARAM, searchCount, curId) ) { if( !IsFilterFound(pList, *pLen, curId) ) { pList[ (*pLen)++ ] = curId; } else { bResOK = false; // duplicate ID } } else { bResOK = false; //invalid ID } } return bResOK; } // void GetExtParamList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ) void GetConfigurableFilterList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ) { mfxU32 fIdx = 0; /* robustness */ *pLen = 0; mfxU32 fCount = par->NumExtParam; mfxU32 searchCount = sizeof(g_TABLE_CONFIG) / sizeof( *g_TABLE_CONFIG ); for( fIdx = 0; fIdx < fCount; fIdx++ ) { mfxU32 curId = par->ExtParam[fIdx]->BufferId; if( IsFilterFound(g_TABLE_CONFIG, searchCount, curId) && !IsFilterFound(pList, *pLen, curId) ) { pList[ (*pLen)++ ] = curId; } } return; } // void GetConfigurableFilterList( mfxVideoParam* par, mfxU32* pList, mfxU32* pLen ) // check is buffer or filter are configurable bool IsConfigurable( mfxU32 filterId ) { mfxU32 searchCount = sizeof(g_TABLE_CONFIG) / sizeof( *g_TABLE_CONFIG ); return IsFilterFound(g_TABLE_CONFIG, searchCount, filterId) ? true : false; } // void GetConfigurableFilterList( mfxU32 filterId ) size_t GetConfigSize( mfxU32 filterId ) { switch( filterId ) { case MFX_EXTBUFF_VPP_DENOISE: { return sizeof(mfxExtVPPDenoise); } case MFX_EXTBUFF_VPP_DENOISE2: { return sizeof(mfxExtVPPDenoise2); } case MFX_EXTBUFF_VPP_PROCAMP: { return sizeof(mfxExtVPPProcAmp); } case MFX_EXTBUFF_VPP_DETAIL: { return sizeof(mfxExtVPPDetail); } case MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: { return sizeof(mfxExtVPPFrameRateConversion); } case MFX_EXTBUFF_VPP_DEINTERLACING: { return sizeof(mfxExtVPPDeinterlacing); } /*case MFX_EXTBUFF_VPP_COMPOSITE: { return sizeof(mfxExtVPPDeinterlacing); }???*/ default: return 0; } } // size_t GetConfigSize( mfxU32 filterId ) mfxStatus CheckTransferMatrix( mfxU16 /*transferMatrix*/ ) { return MFX_ERR_NONE; } // mfxStatus CheckTransferMatrix( mfxU16 transferMatrix ) mfxGamutMode GetGamutMode( mfxU16 srcTransferMatrix, mfxU16 dstTransferMatrix ) { mfxStatus mfxSts; mfxSts = CheckTransferMatrix( srcTransferMatrix ); if( MFX_ERR_NONE != mfxSts ) { return GAMUT_INVALID_MODE; } mfxSts = CheckTransferMatrix( dstTransferMatrix ); if( MFX_ERR_NONE != mfxSts ) { return GAMUT_INVALID_MODE; } mfxGamutMode mode = GAMUT_COMPRESS_BASE_MODE; if( srcTransferMatrix == dstTransferMatrix ) { mode = GAMUT_PASSIVE_MODE; } return mode; } // mfxGamutMode GetGamutMode( mfxU16 srcTransferMatrix, mfxU16 dstTransferMatrix ) mfxStatus CheckIOPattern_AndSetIOMemTypes(mfxU16 IOPattern, mfxU16* pInMemType, mfxU16* pOutMemType) { if ((IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) && (IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY)) { return MFX_ERR_INVALID_VIDEO_PARAM; } if ((IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) { return MFX_ERR_INVALID_VIDEO_PARAM; } if( IOPattern & MFX_IOPATTERN_IN_SYSTEM_MEMORY ) { *pInMemType = MFX_MEMTYPE_FROM_VPPIN|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_SYSTEM_MEMORY; } else if (IOPattern & MFX_IOPATTERN_IN_VIDEO_MEMORY) { *pInMemType = MFX_MEMTYPE_FROM_VPPIN|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET; } else { return MFX_ERR_INVALID_VIDEO_PARAM; } if( IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ) { *pOutMemType = MFX_MEMTYPE_FROM_VPPOUT|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_SYSTEM_MEMORY; } else if (IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) { *pOutMemType = MFX_MEMTYPE_FROM_VPPOUT|MFX_MEMTYPE_EXTERNAL_FRAME|MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET; } else { return MFX_ERR_INVALID_VIDEO_PARAM; } return MFX_ERR_NONE; } // mfxStatus CheckIOPattern_AndSetIOMemTypes(mfxU16 IOPattern,mfxU16* pInMemType, mfxU16* pOutMemType) mfxU16 EstimatePicStruct( mfxU32* pVariance, mfxU16 width, mfxU16 height) { mfxU16 resPicStruct = MFX_PICSTRUCT_UNKNOWN; mfxU32 varMin = pVariance[0]* 16 / (width * height); mfxU32 varMax = pVariance[1]* 16 / (width * height); //mfxU32 v0 = pVariance[0]* 16 / (width * height); //mfxU32 v1 = pVariance[1]* 16 / (width * height); mfxU32 v2 = pVariance[2]* 16 / (width * height); mfxU32 v3 = pVariance[3]* 16 / (width * height); mfxU32 v4 = pVariance[4]* 16 / (width * height); if(varMin > varMax) { std::swap(varMin, varMax); } if(varMax == 0) { resPicStruct = MFX_PICSTRUCT_UNKNOWN; } else { mfxF64 varRatio = (mfxF64)(varMin) / (mfxF64)(varMax); mfxF64 result = 100.0 * (1.0 - varRatio); mfxU32 absDiff= (mfxU32)abs((int)varMax - (int)varMin); bool bProgressive = false; if( absDiff < 2 && v2 < 50) // strong progressive; { bProgressive = true; } else if( result <= 1.0 && v2 < 50) // middle { bProgressive = true; } else if(result <= 1.0 && v2 < 110) // weak { bProgressive = true; } if( !bProgressive ) { //printf("\n picstruct = INTERLACE ("); fflush(stderr); if( v3 < v4) { //printf("TFF) \n"); fflush(stderr); resPicStruct = MFX_PICSTRUCT_FIELD_TFF; } else { //printf("BFF) \n"); fflush(stderr); resPicStruct = MFX_PICSTRUCT_FIELD_BFF; } } else { /*printf("\n picstruct = PROGRESSIVE (%f %i %i) \n", result, varMin, varMax); fflush(stderr);*/ resPicStruct = MFX_PICSTRUCT_PROGRESSIVE; } } return resPicStruct; } // mfxU16 EstimatePicStruct( mfxU32* pVariance ) mfxU16 MapDNFactor( mfxU16 denoiseFactor ) { // On Linux detail and de-noise factors mapped to the real libva values // at execution time. mfxU16 gfxFactor = denoiseFactor; return gfxFactor; } // mfxU16 MapDNFactor( mfxU16 denoiseFactor ) mfxStatus CheckScalingParam(mfxExtBuffer* pScalingExtBuffer) { if (!pScalingExtBuffer) return MFX_ERR_NONE; mfxExtVPPScaling* pScalingParams = (mfxExtVPPScaling*)pScalingExtBuffer; // Scaling parameter combination includes the below 2 cases // (MFX_SCALING_MODE_DEFAULT / MFX_SCALING_MODE_QUALITY) + (MFX_INTERPOLATION_DEFAULT / MFX_INTERPOLATION_ADVANCED) // MFX_SCALING_MODE_LOWPOWER + (MFX_INTERPOLATION_DEFAULT / MFX_INTERPOLATION_NEAREST_NEIGHBOR / MFX_INTERPOLATION_BILINEAR / MFX_INTERPOLATION_ADVANCED) switch (pScalingParams->ScalingMode) { case MFX_SCALING_MODE_DEFAULT: MFX_RETURN(((pScalingParams->InterpolationMethod == MFX_INTERPOLATION_DEFAULT) || (pScalingParams->InterpolationMethod == MFX_INTERPOLATION_ADVANCED)) ? MFX_ERR_NONE : MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_SCALING_MODE_QUALITY: MFX_RETURN(((pScalingParams->InterpolationMethod == MFX_INTERPOLATION_DEFAULT) || (pScalingParams->InterpolationMethod == MFX_INTERPOLATION_ADVANCED)) ? MFX_ERR_NONE : MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_SCALING_MODE_LOWPOWER: MFX_RETURN((pScalingParams->InterpolationMethod <= MFX_INTERPOLATION_ADVANCED) ? MFX_ERR_NONE : MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_SCALING_MODE_INTEL_GEN_COMPUTE: MFX_RETURN(MFX_ERR_NONE); break; case MFX_SCALING_MODE_INTEL_GEN_VDBOX: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; case MFX_SCALING_MODE_INTEL_GEN_VEBOX: MFX_RETURN(MFX_ERR_NONE); break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); break; } } mfxStatus CheckExtParam(VideoCORE * core, mfxExtBuffer** ppExtParam, mfxU16 count) { if( (NULL == ppExtParam && count > 0) ) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } bool bError = false; // [1] ExtParam mfxVideoParam tmpParam; tmpParam.ExtParam = ppExtParam; tmpParam.NumExtParam= count; mfxU32 extParamCount = sizeof(g_TABLE_EXT_PARAM) / sizeof(*g_TABLE_EXT_PARAM); std::vector extParamList(extParamCount); if( !GetExtParamList( &tmpParam, &extParamList[0], &extParamCount ) ) { bError = true; } // [2] configurable mfxU32 configCount = sizeof(g_TABLE_CONFIG) / sizeof(*g_TABLE_CONFIG); std::vector configList(configCount); GetConfigurableFilterList( &tmpParam, &configList[0], &configCount ); //----------------------------------------------------- mfxStatus sts = MFX_ERR_NONE, sts_wrn = MFX_ERR_NONE; mfxU32 fIdx = 0; for(fIdx = 0; fIdx < configCount; fIdx++) { mfxU32 curId = configList[fIdx]; mfxExtBuffer* pHint = NULL; GetFilterParam( &tmpParam, curId, &pHint); //3 status's could be returned only: MFX_ERR_NONE, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, MFX_ERR_UNSUPPORTED // AL update: now 4 status, added MFX_WRN_FILTER_SKIPPED sts = ExtendedQuery(core, curId, pHint); if( MFX_WRN_INCOMPATIBLE_VIDEO_PARAM == sts || MFX_WRN_FILTER_SKIPPED == sts ) { sts_wrn = sts; sts = MFX_ERR_NONE; } else if( MFX_ERR_UNSUPPORTED == sts ) { bError = true; sts = MFX_ERR_NONE; } MFX_CHECK_STS(sts); // for double check only } //----------------------------------------------------- // [3] Do NOT USE mfxU32* pDnuList = NULL; mfxU32 dnuCount = 0; GetDoNotUseFilterList( &tmpParam, &pDnuList, &dnuCount ); if( !CheckFilterList(pDnuList, dnuCount, false) ) { bError = true; } for( mfxU32 extParIdx = 0; extParIdx < count; extParIdx++ ) { // configured via extended parameters filter should not be disabled if ( IsFilterFound( pDnuList, dnuCount, ppExtParam[extParIdx]->BufferId ) ) { sts = MFX_ERR_INVALID_VIDEO_PARAM; } MFX_CHECK_STS(sts); } // [4] Do USE mfxU32* pDO_USE_List = NULL; mfxU32 douseCount = 0; GetDoUseFilterList( &tmpParam, &pDO_USE_List, &douseCount ); if( !CheckFilterList(pDO_USE_List, douseCount, true) ) { bError = true; } // [5] cmp DO_USE vs DO_NOT_USE for( fIdx = 0; fIdx < dnuCount; fIdx++ ) { if( IsFilterFound(pDO_USE_List, douseCount, pDnuList[fIdx]) ) { bError = true; } } if( bError ) { MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } else if( MFX_ERR_NONE != sts_wrn ) { MFX_RETURN(sts_wrn); } else { return MFX_ERR_NONE; } } // mfxStatus CheckExtParam(mfxExtBuffer** ppExtParam, mfxU32 count) void SignalPlatformCapabilities( const mfxVideoParam & param, const std::vector & supportedList) { // fill output DOUSE list //if(bCorrectionEnable) { mfxU32* pDO_USE_List = NULL; mfxU32 douseCount = 0; GetDoUseFilterList( (mfxVideoParam*)¶m, &pDO_USE_List, &douseCount ); if(douseCount > 0) { size_t fCount = std::min(supportedList.size(), douseCount); size_t fIdx = 0; for(fIdx = 0; fIdx < fCount; fIdx++) { pDO_USE_List[fIdx] = supportedList[fIdx]; } for(; fIdx< douseCount; fIdx++) { pDO_USE_List[fIdx] = 0;// EMPTY } } } // ExtBuffer Correction (will be fixed late) } // mfxStatus SignalPlatformCapabilities(...) void ExtractDoUseList(mfxU32* pSrcList, mfxU32 len, std::vector & dstList) { dstList.resize(0); mfxU32 searchCount = sizeof(g_TABLE_DO_USE) / sizeof( *g_TABLE_DO_USE ); for(mfxU32 searchIdx = 0; searchIdx < searchCount; searchIdx++) { if( IsFilterFound(pSrcList, len, g_TABLE_DO_USE[searchIdx]) ) { dstList.push_back(g_TABLE_DO_USE[searchIdx]); } } } // void ExtractDoUseList(mfxU32* pSrcList, mfxU32 len, std::vector & dstList) bool CheckDoUseCompatibility( mfxU32 filterName ) { bool bResult = false; mfxU32 douseCount = sizeof(g_TABLE_DO_USE) / sizeof( *g_TABLE_DO_USE ); bResult = IsFilterFound(g_TABLE_DO_USE, douseCount, filterName); return bResult; } // bool CheckDoUseCompatibility( mfxU32 filterName ) mfxStatus GetCrossList( const std::vector & pipelineList, const std::vector & capsList, std::vector & doUseList, std::vector & dontUseList ) { mfxStatus sts = MFX_ERR_NONE; mfxU32 fIdx; for(fIdx = 0; fIdx < pipelineList.size(); fIdx++) { if( !IsFilterFound(&capsList[0], (mfxU32)capsList.size(), pipelineList[fIdx]) ) { if( CheckDoUseCompatibility( pipelineList[fIdx] ) ) { dontUseList.push_back( pipelineList[fIdx] ); sts = MFX_WRN_FILTER_SKIPPED; } } else { doUseList.push_back( pipelineList[fIdx] ); } } return sts; } // mfxStatus GetCrossList(...) bool IsFrcInterpolationEnable(const mfxVideoParam & param, const MfxHwVideoProcessing::mfxVppCaps & caps) { mfxF64 inFrameRate = CalculateUMCFramerate(param.vpp.In.FrameRateExtN, param.vpp.In.FrameRateExtD); mfxF64 outFrameRate = CalculateUMCFramerate(param.vpp.Out.FrameRateExtN, param.vpp.Out.FrameRateExtD); mfxF64 mfxRatio = inFrameRate == 0 ? 0 : outFrameRate / inFrameRate; mfxU32 frcCount = (mfxU32)caps.frcCaps.customRateData.size(); mfxF64 FRC_EPS = 0.01; for(mfxU32 frcIdx = 0; frcIdx < frcCount; frcIdx++) { MfxHwVideoProcessing::CustomRateData* rateData = (MfxHwVideoProcessing::CustomRateData*)&(caps.frcCaps.customRateData[frcIdx]); // it is outFrameRate / inputFrameRate. mfxF64 gfxRatio = CalculateUMCFramerate(rateData->customRate.FrameRateExtN, rateData->customRate.FrameRateExtD); if( fabs(gfxRatio - mfxRatio) < FRC_EPS ) { return true; } } return false; } // bool IsFrcInterpolationEnable(const mfxVideoParam & param, const MfxHwVideoProcessing::mfxVppCaps & caps) void ConvertCaps2ListDoUse(MfxHwVideoProcessing::mfxVppCaps& caps, std::vector& list) { if(caps.uProcampFilter) { list.push_back(MFX_EXTBUFF_VPP_PROCAMP); } #ifdef MFX_ENABLE_MCTF if (caps.uMCTF) { list.push_back(MFX_EXTBUFF_VPP_MCTF); } #endif if(caps.uDenoiseFilter) { list.push_back(MFX_EXTBUFF_VPP_DENOISE); } if(caps.uDenoise2Filter) { list.push_back(MFX_EXTBUFF_VPP_DENOISE2); } if(caps.uDetailFilter) { list.push_back(MFX_EXTBUFF_VPP_DETAIL); } if(caps.uFrameRateConversion) { list.push_back(MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION); } if(caps.uDeinterlacing) { list.push_back(MFX_EXTBUFF_VPP_DEINTERLACING); } if(caps.uVideoSignalInfo) { list.push_back(MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO); } if(caps.uVideoSignalInfoInOut) { list.push_back(MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN); list.push_back(MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT); } if(caps.uIStabFilter) { list.push_back(MFX_EXTBUFF_VPP_IMAGE_STABILIZATION); } if(caps.uRotation) { list.push_back(MFX_EXTBUFF_VPP_ROTATION); } if(caps.uMirroring) { list.push_back(MFX_EXTBUFF_VPP_MIRRORING); } if(caps.uScaling) { list.push_back(MFX_EXTBUFF_VPP_SCALING); } if(caps.u3DLut) { list.push_back(MFX_EXTBUFF_VPP_3DLUT); } if (caps.uChromaSiting) { list.push_back(MFX_EXTBUFF_VPP_COLOR_CONVERSION); } if (caps.uAdvancedDI || caps.uSimpleDI) { list.push_back(MFX_EXTBUFF_VPP_DEINTERLACING); } if (caps.uFieldProcessing) { list.push_back(MFX_EXTBUFF_VPP_FIELD_PROCESSING); } if (caps.cameraCaps.uGammaCorrection) { list.push_back(MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION); } if (caps.cameraCaps.u3DLUT) { list.push_back(MFX_EXTBUF_CAM_3DLUT); } if (caps.cameraCaps.uWhiteBalance) { list.push_back(MFX_EXTBUF_CAM_WHITE_BALANCE); } if (caps.cameraCaps.uBlackLevelCorrection) { list.push_back(MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION); } if (caps.cameraCaps.uBayerDenoise) { list.push_back(MFX_EXTBUF_CAM_BAYER_DENOISE); } if (caps.cameraCaps.uHotPixelCheck) { list.push_back(MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL); } if (caps.cameraCaps.uVignetteCorrection) { list.push_back(MFX_EXTBUF_CAM_VIGNETTE_CORRECTION); } if (caps.cameraCaps.uColorCorrectionMatrix) { list.push_back(MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3); } if (caps.cameraCaps.uPadding) { list.push_back(MFX_EXTBUF_CAM_PADDING); } if (caps.cameraCaps.uLensGeomDistCorrection) { list.push_back(MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION); } if (caps.cameraCaps.uTotalColorControl) { list.push_back(MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL); } if (caps.cameraCaps.uCscYuvRgb) { list.push_back(MFX_EXTBUF_CAM_CSC_YUV_RGB); } /*ColorFill is always present*/ list.push_back(MFX_EXTBUFF_VPP_COLORFILL); /* Field weaving is always present*/ list.push_back(MFX_EXTBUFF_VPP_FIELD_WEAVING); /* Field splitting is always present*/ list.push_back(MFX_EXTBUFF_VPP_FIELD_SPLITTING); /* Composition is always present*/ list.push_back(MFX_EXTBUFF_VPP_COMPOSITE); } // void ConvertCaps2ListDoUse(MfxHwVideoProcessing::mfxVppCaps& caps, std::vector list) #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/000077500000000000000000000000001443134507600222035ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/IntelMediaSDK/000077500000000000000000000000001443134507600245605ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/IntelMediaSDK/CMakeLists.txt000066400000000000000000000033051443134507600273210ustar00rootroot00000000000000if (NOT CMAKE_SYSTEM_NAME MATCHES Windows) return() endif() cmake_minimum_required(VERSION 3.5) project(IntelMediaSDK) set(DLL_NAME IntelMediaSDK) # MediaEtwSetLinkerFlags: apply linker flags for given configuration # linkerFlags: linker specific options # linkerTarget: optional parameter - apply linker flags for specfied target macro (MediaEtwSetLinkerFlags linkerFlags linkerTarget) foreach (opt ${linkerFlags}) if ("${linkerTarget}" STREQUAL "") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${opt}") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${opt}") else() set (CMAKE_SHARED_LINKER_FLAGS_${linkerTarget} "${CMAKE_SHARED_LINKER_FLAGS_${linkerTarget}} ${opt}") set (CMAKE_EXE_LINKER_FLAGS_${linkerTarget} "${CMAKE_SHARED_LINKER_FLAGS_${linkerTarget}} ${opt}") endif() endforeach() endmacro() set(SOURCES_ ${MSDK_STUDIO_ROOT}/shared/mfx_trace/IntelMediaSDK.man ) source_group("Resource Files" FILES ${MSDK_STUDIO_ROOT}/shared/mfx_trace/IntelMediaSDK.man ${CMAKE_BINARY_DIR}/IntelMediaSDK.rc ) # set compiler options include(sources_ext.cmake) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_UNICODE /DUNICODE") set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) add_library(${DLL_NAME} SHARED ${SOURCES_} ${CMAKE_BINARY_DIR}/IntelMediaSDK.rc) set_target_properties(${DLL_NAME} PROPERTIES OUTPUT_NAME IntelMediaSDK) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/IntelMediaSDK.rc COMMENT "Running mc.exe to compile Media ETW manifest" COMMAND mc -h ${CMAKE_BINARY_DIR} -r ${CMAKE_BINARY_DIR} -z IntelMediaSDK -um ${MSDK_STUDIO_ROOT}/shared/mfx_trace/IntelMediaSDK.man )oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/000077500000000000000000000000001443134507600227515ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/CMakeLists.txt000066400000000000000000000027461443134507600255220ustar00rootroot00000000000000 add_library(asc_sse4 OBJECT include/asc_sse4_impl.h include/motion_estimation_engine.h src/asc_sse4_impl.cpp src/motion_estimation_engine.cpp ) set_property(TARGET asc_sse4 PROPERTY FOLDER "optimization/asc") target_include_directories(asc_sse4 PRIVATE include) target_link_libraries(asc_sse4 PRIVATE mfx_require_sse4_properties mfx_static_lib mfx_sdl_properties) #===================================================================== add_library(asc_avx2 OBJECT include/asc_avx2_impl.h src/asc_avx2_impl.cpp ) set_property(TARGET asc_avx2 PROPERTY FOLDER "optimization/asc") target_include_directories(asc_avx2 PRIVATE include) target_link_libraries(asc_avx2 PRIVATE mfx_require_avx2_properties mfx_static_lib mfx_sdl_properties) #===================================================================== list( APPEND sources include/asc_c_impl.h include/asc_common_impl.h include/asc_cpu_dispatcher.h include/asc_defs.h include/asc.h include/asc_structures.h include/cpu_detect.h include/iofunctions.h include/me_asc.h include/tree.h src/asc.cpp src/asc_c_impl.cpp src/iofunctions.cpp src/tree.cpp $ $ ) add_library(asc STATIC ${sources}) target_include_directories(asc PUBLIC include) target_link_libraries(asc PUBLIC mfx_static_lib PRIVATE mfx_sdl_properties umc $<$:mfx_ext> ) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/000077500000000000000000000000001443134507600243745ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc.h000066400000000000000000000213541443134507600253200ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _ASC_H_ #define _ASC_H_ #include #include #include "asc_structures.h" namespace ns_asc { #if defined(__AVX2__) #define ASC_CPU_DISP_INIT_AVX2(func) (func = (func ## _AVX2)) #define ASC_CPU_DISP_INIT_AVX2_SSE4_C(func) (m_AVX2_available ? ASC_CPU_DISP_INIT_AVX2(func) : ASC_CPU_DISP_INIT_SSE4_C(func)) #define ASC_CPU_DISP_INIT_AVX2_C(func) (m_AVX2_available ? ASC_CPU_DISP_INIT_AVX2(func) : ASC_CPU_DISP_INIT_C(func)) #else #define ASC_CPU_DISP_INIT_AVX2_SSE4_C ASC_CPU_DISP_INIT_SSE4_C #define ASC_CPU_DISP_INIT_AVX2_C ASC_CPU_DISP_INIT_C #endif #define ASC_CPU_DISP_INIT_C(func) (func = (func ## _C)) #define ASC_CPU_DISP_INIT_SSE4(func) (func = (func ## _SSE4)) #define ASC_CPU_DISP_INIT_SSE4_C(func) (m_SSE4_available ? ASC_CPU_DISP_INIT_SSE4(func) : ASC_CPU_DISP_INIT_C(func)) typedef void(*t_GainOffset)(pmfxU8 *pSrc, pmfxU8 *pDst, mfxU16 width, mfxU16 height, mfxU16 pitch, mfxI16 gainDiff); typedef void(*t_RsCsCalc)(pmfxU8 pSrc, int srcPitch, int wblocks, int hblocks, pmfxU16 pRs, pmfxU16 pCs); typedef void(*t_RsCsCalc_bound)(pmfxU16 pRs, pmfxU16 pCs, pmfxU16 pRsCs, pmfxU32 pRsFrame, pmfxU32 pCsFrame, int wblocks, int hblocks); typedef void(*t_RsCsCalc_diff)(pmfxU16 pRs0, pmfxU16 pCs0, pmfxU16 pRs1, pmfxU16 pCs1, int wblocks, int hblocks, pmfxU32 pRsDiff, pmfxU32 pCsDiff); typedef void(*t_ImageDiffHistogram)(pmfxU8 pSrc, pmfxU8 pRef, mfxU32 pitch, mfxU32 width, mfxU32 height, mfxI32 histogram[5], mfxI64 *pSrcDC, mfxI64 *pRefDC); typedef mfxI16(*t_AvgLumaCalc)(pmfxU32 pAvgLineVal, int len); typedef void(*t_ME_SAD_8x8_Block_Search)(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU16 *bestSAD, int *bestX, int *bestY); typedef void(*t_ME_SAD_8x8_Block_FSearch)(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU32 *bestSAD, int *bestX, int *bestY); typedef mfxStatus(*t_Calc_RaCa_pic)(mfxU8 *pPicY, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs); class ASCimageData { public: ASCimageData(); ASCYUV Image; ASCMVector *pInteger; mfxI32 var, jtvar, mcjtvar; mfxI16 tcor, mcTcor; mfxU32 CsVal, RsVal; mfxI16 avgval; mfxU16 *Cs, *Rs, *RsCs, *SAD; mfxStatus InitFrame(ASCImDetails *pDetails); mfxStatus InitAuxFrame(ASCImDetails *pDetails); void Close(); }; typedef struct ASCvideoBuffer { ASCimageData layer; mfxI32 frame_number, forward_reference, backward_reference; } ASCVidSample; typedef struct ASCextended_storage { mfxI32 average; mfxI32 avgSAD; mfxU32 gopSize, lastSCdetectionDistance, detectedSch, pendingSch; ASCTSCstat **logic; // For Pdistance table selection pmfxI8 PDistanceTable; ASCLayers size; bool firstFrame; ASCimageData gainCorrection; mfxU8 control; mfxU32 frameOrder; }ASCVidRead; class ASC { public: ASC(); protected: mfxU32 m_gpuImPitch, m_threadsWidth, m_threadsHeight; mfxU8 *m_frameBkp; mfxI32 m_gpuwidth, m_gpuheight; static const int subWidth = 128; static const int subHeight = 64; ASCVidRead *m_support; ASCVidData *m_dataIn; bool m_dataReady, m_is_LTR_on, m_ASCinitialized; mfxI32 m_width, m_height, m_pitch; /** **************************************************************** * \Brief List of long term reference friendly frame detection * * The list keeps the history of ltr friendly frame detections, * each element in the listis made of a frame number and * its detection as a pair. * */ std::list > ltr_check_history; int m_AVX2_available; int m_SSE4_available; t_GainOffset GainOffset; t_RsCsCalc RsCsCalc_4x4; t_RsCsCalc_bound RsCsCalc_bound; t_RsCsCalc_diff RsCsCalc_diff; t_ImageDiffHistogram ImageDiffHistogram; t_ME_SAD_8x8_Block_Search ME_SAD_8x8_Block_Search; t_Calc_RaCa_pic Calc_RaCa_pic; virtual void VidSample_dispose(); void SubSample_Point( pmfxU8 pSrc, mfxU32 srcWidth, mfxU32 srcHeight, mfxU32 srcPitch, pmfxU8 pDst, mfxU32 dstWidth, mfxU32 dstHeight, mfxU32 dstPitch, mfxI16 &avgLuma); mfxStatus RsCsCalc(); mfxI32 ShotDetect(ASCimageData& Data, ASCimageData& DataRef, ASCImDetails& imageInfo, ASCTSCstat *current, ASCTSCstat *reference, mfxU8 controlLevel); void MotionAnalysis(ASCVidSample *videoIn, ASCVidSample *videoRef, mfxU32 *TSC, mfxU16 *AFD, mfxU32 *MVdiffVal, mfxU32 *AbsMVSize, mfxU32 *AbsMVHSize, mfxU32 *AbsMVVSize, ASCLayers lyrIdx); typedef void(ASC::*t_resizeImg)(mfxU8 *frame, mfxI32 srcWidth, mfxI32 srcHeight, mfxI32 inputPitch, ns_asc::ASCLayers dstIdx, mfxU32 parity); t_resizeImg resizeFunc; void VidRead_dispose(); mfxStatus SetWidth(mfxI32 Width); mfxStatus SetHeight(mfxI32 Height); mfxStatus SetPitch(mfxI32 Pitch); void SetNextField(); mfxStatus SetDimensions(mfxI32 Width, mfxI32 Height, mfxI32 Pitch); void Setup_Environment(); void SetUltraFastDetection(); void Params_Init(); void InitStruct(); mfxStatus VidRead_Init(); void VidSample_Init(); void SubSampleASC_ImagePro(mfxU8 *frame, mfxI32 srcWidth, mfxI32 srcHeight, mfxI32 inputPitch, ASCLayers dstIdx, mfxU32 parity); void SubSampleASC_ImageInt(mfxU8 *frame, mfxI32 srcWidth, mfxI32 srcHeight, mfxI32 inputPitch, ASCLayers dstIdx, mfxU32 parity); bool CompareStats(mfxU8 current, mfxU8 reference); bool DenoiseIFrameRec(); bool FrameRepeatCheck(); bool DoMCTFFilteringCheck(); void DetectShotChangeFrame(); void GeneralBufferRotation(); void Put_LTR_Hint(); ASC_LTR_DEC Continue_LTR_Mode(mfxU16 goodLTRLimit, mfxU16 badLTRLimit); void AscFrameAnalysis(); mfxStatus SetInterlaceMode(ASCFTS interlaceMode); public: virtual mfxStatus Init(mfxI32 Width, mfxI32 Height, mfxI32 Pitch, mfxU32 PicStruct, bool isCmSupported); virtual void Close(); bool IsASCinitialized(); void SetControlLevel(mfxU8 level); mfxStatus SetGoPSize(mfxU32 GoPSize); void ResetGoPSize(); inline void SetParityTFF() { SetInterlaceMode(ASCtopfieldfirst_frame); } inline void SetParityBFF() { SetInterlaceMode(ASCbotfieldFirst_frame); } inline void SetProgressiveOp() { SetInterlaceMode(ASCprogressive_frame); } bool Get_Last_frame_Data(); mfxU16 Get_asc_subsampling_width(); mfxU16 Get_asc_subsampling_height(); mfxU32 Get_starting_frame_number(); mfxU32 Get_frame_number(); mfxU32 Get_frame_shot_Decision(); mfxU32 Get_frame_last_in_scene(); bool Get_GoPcorrected_frame_shot_Decision(); mfxI32 Get_frame_Spatial_complexity(); mfxI32 Get_frame_Temporal_complexity(); bool Get_intra_frame_denoise_recommendation(); mfxU32 Get_PDist_advice(); bool Get_LTR_advice(); bool Get_RepeatedFrame_advice(); bool Get_Filter_advice(); mfxStatus get_LTR_op_hint(ASC_LTR_DEC& scd_LTR_hint); mfxStatus calc_RaCa_pic(mfxU8 *pSrc, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs); bool Check_last_frame_processed(mfxU32 frameOrder); void Reset_last_frame_processed(); static mfxI32 Get_CpuFeature_AVX2(); static mfxI32 Get_CpuFeature_SSE41(); virtual mfxStatus calc_RaCa_Surf(mfxHDLPair surface, mfxF64& rscs); protected: ASCVidSample** m_videoData; }; }; #endif //_ASC_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc_avx2_impl.h000066400000000000000000000045221443134507600272770ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #ifndef _ASC_AVX2_IMPL_H_ #define _ASC_AVX2_IMPL_H_ #if defined(__AVX2__) #include "asc_common_impl.h" void ME_SAD_8x8_Block_Search_AVX2(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU16 *bestSAD, int *bestX, int *bestY); void ME_SAD_8x8_Block_FSearch_AVX2(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU32 *bestSAD, int *bestX, int *bestY); void RsCsCalc_4x4_AVX2(pmfxU8 pSrc, int srcPitch, int wblocks, int hblocks, pmfxU16 pRs, pmfxU16 pCs); void RsCsCalc_bound_AVX2(pmfxU16 pRs, pmfxU16 pCs, pmfxU16 pRsCs, pmfxU32 pRsFrame, pmfxU32 pCsFrame, int wblocks, int hblocks); void RsCsCalc_diff_AVX2(pmfxU16 pRs0, pmfxU16 pCs0, pmfxU16 pRs1, pmfxU16 pCs1, int wblocks, int hblocks, pmfxU32 pRsDiff, pmfxU32 pCsDiff); void ImageDiffHistogram_AVX2(pmfxU8 pSrc, pmfxU8 pRef, mfxU32 pitch, mfxU32 width, mfxU32 height, mfxI32 histogram[5], mfxI64 *pSrcDC, mfxI64 *pRefDC); void GainOffset_AVX2(pmfxU8 *pSrc, pmfxU8 *pDst, mfxU16 width, mfxU16 height, mfxU16 pitch, mfxI16 gainDiff); mfxStatus Calc_RaCa_pic_AVX2(mfxU8 *pSrc, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs); mfxI16 AvgLumaCalc_AVX2(pmfxU32 pAvgLineVal, int len); #endif //defined(__AVX2__) #endif //_ASC_AVX2_IMPL_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc_c_impl.h000066400000000000000000000043721443134507600266440ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #ifndef _ASC_C_IMPL_H_ #define _ASC_C_IMPL_H_ #include "asc_common_impl.h" void ME_SAD_8x8_Block_Search_C(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU16 *bestSAD, int *bestX, int *bestY); void ME_SAD_8x8_Block_FSearch_C(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU32 *bestSAD, int *bestX, int *bestY); void RsCsCalc_4x4_C(pmfxU8 pSrc, int srcPitch, int wblocks, int hblocks, pmfxU16 pRs, pmfxU16 pCs); void RsCsCalc_bound_C(pmfxU16 pRs, pmfxU16 pCs, pmfxU16 pRsCs, pmfxU32 pRsFrame, pmfxU32 pCsFrame, int wblocks, int hblocks); void RsCsCalc_diff_C(pmfxU16 pRs0, pmfxU16 pCs0, pmfxU16 pRs1, pmfxU16 pCs1, int wblocks, int hblocks, pmfxU32 pRsDiff, pmfxU32 pCsDiff); void ImageDiffHistogram_C(pmfxU8 pSrc, pmfxU8 pRef, mfxU32 pitch, mfxU32 width, mfxU32 height, mfxI32 histogram[5], mfxI64 *pSrcDC, mfxI64 *pRefDC); void GainOffset_C(pmfxU8 *pSrc, pmfxU8 *pDst, mfxU16 width, mfxU16 height, mfxU16 pitch, mfxI16 gainDiff); mfxStatus Calc_RaCa_pic_C(mfxU8 *pPicY, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs); mfxI16 AvgLumaCalc_C(pmfxU32 pAvgLineVal, int len); #endif //_ASC_C_IMPL_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc_common_impl.h000066400000000000000000000140601443134507600277050ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #ifndef _ASC_COMMON_IMPL_H_ #define _ASC_COMMON_IMPL_H_ #include "asc_defs.h" #include "asc_structures.h" static const int HIST_THRESH_LO = 1; static const int HIST_THRESH_HI = 12; #define SAD_SEARCH_VSTEP 2 // 1=FS 2=FHS ASC_ALIGN_DECL(16) static const mfxU16 tab_twostep[8] = { 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, }; ASC_ALIGN_DECL(16) static const mfxU16 tab_killmask[8][8] = { { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, { 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, { 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, { 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, { 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff }, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff }, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff }, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff }, }; #define _mm_loadh_epi64(a, ptr) _mm_castps_si128(_mm_loadh_pi(_mm_castsi128_ps(a), (__m64 *)(ptr))) #define _mm_movehl_epi64(a, b) _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b))) // Load 0..3 floats to XMM register from memory // NOTE: elements of XMM are permuted [ 2 - 1 ] static inline __m128 LoadPartialXmm(float *pSrc, mfxI32 len) { __m128 xmm = _mm_setzero_ps(); if (len & 2) { xmm = _mm_loadh_pi(xmm, (__m64 *)pSrc); pSrc += 2; } if (len & 1) { xmm = _mm_move_ss(xmm, _mm_load_ss(pSrc)); } return xmm; } // Store 0..3 floats from XMM register to memory // NOTE: elements of XMM are permuted [ 2 - 1 ] static inline void StorePartialXmm(float *pDst, __m128 xmm, mfxI32 len) { if (len & 2) { _mm_storeh_pi((__m64 *)pDst, xmm); pDst += 2; } if (len & 1) { _mm_store_ss(pDst, xmm); } } #if defined(__AVX2__) // Load 0..7 floats to YMM register from memory // NOTE: elements of YMM are permuted [ 4 2 - 1 ] static inline __m256 LoadPartialYmm(float *pSrc, mfxI32 len) { __m128 xlo = _mm_setzero_ps(); __m128 xhi = _mm_setzero_ps(); if (len & 4) { xhi = _mm_loadu_ps(pSrc); pSrc += 4; } if (len & 2) { xlo = _mm_loadh_pi(xlo, (__m64 *)pSrc); pSrc += 2; } if (len & 1) { xlo = _mm_move_ss(xlo, _mm_load_ss(pSrc)); } return _mm256_insertf128_ps(_mm256_castps128_ps256(xlo), xhi, 1); } // Store 0..7 floats from YMM register to memory // NOTE: elements of YMM are permuted [ 4 2 - 1 ] static inline void StorePartialYmm(float *pDst, __m256 ymm, mfxI32 len) { __m128 xlo = _mm256_castps256_ps128(ymm); __m128 xhi = _mm256_extractf128_ps(ymm, 1); if (len & 4) { _mm_storeu_ps(pDst, xhi); pDst += 4; } if (len & 2) { _mm_storeh_pi((__m64 *)pDst, xlo); pDst += 2; } if (len & 1) { _mm_store_ss(pDst, xlo); } } #endif //defined(__AVX2__) // Load 0..15 bytes to XMM register from memory // NOTE: elements of XMM are permuted [ 8 4 2 - 1 ] template static inline __m128i LoadPartialXmm(unsigned char *pSrc, mfxI32 len) { __m128i xmm = _mm_set1_epi8(init); if (len & 8) { xmm = _mm_loadh_epi64(xmm, (__m64 *)pSrc); pSrc += 8; } if (len & 4) { xmm = _mm_insert_epi32(xmm, *((int *)pSrc), 1); pSrc += 4; } if (len & 2) { xmm = _mm_insert_epi16(xmm, *((short *)pSrc), 1); pSrc += 2; } if (len & 1) { xmm = _mm_insert_epi8(xmm, *pSrc, 0); } return xmm; } #if defined(__AVX2__) // Load 0..31 bytes to YMM register from memory // NOTE: elements of YMM are permuted [ 16 8 4 2 - 1 ] template static inline __m256i LoadPartialYmm(unsigned char *pSrc, mfxI32 len) { __m128i xlo = _mm_set1_epi8(init); __m128i xhi = _mm_set1_epi8(init); if (len & 16) { xhi = _mm_loadu_si128((__m128i *)pSrc); pSrc += 16; } if (len & 8) { xlo = _mm_loadh_epi64(xlo, (__m64 *)pSrc); pSrc += 8; } if (len & 4) { xlo = _mm_insert_epi32(xlo, *((int *)pSrc), 1); pSrc += 4; } if (len & 2) { xlo = _mm_insert_epi16(xlo, *((short *)pSrc), 1); pSrc += 2; } if (len & 1) { xlo = _mm_insert_epi8(xlo, *pSrc, 0); } return _mm256_inserti128_si256(_mm256_castsi128_si256(xlo), xhi, 1); } #endif //defined(__AVX2__) static inline void calc_RACA_4x4_C(mfxU8 *pSrc, mfxI32 pitch, mfxI32 *RS, mfxI32 *CS) { mfxI32 i, j; mfxU8 *pS = pSrc; mfxU8 *pS2 = pSrc + pitch; mfxI32 Rs, Cs; Cs = 0; Rs = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { Cs += (pS[j] > pS[j + 1]) ? (pS[j] - pS[j + 1]) : (pS[j + 1] - pS[j]); Rs += (pS[j] > pS2[j]) ? (pS[j] - pS2[j]) : (pS2[j] - pS[j]); } pS += pitch; pS2 += pitch; } *CS += Cs >> 4; *RS += Rs >> 4; } #endif //_ASC_COMMON_IMPL_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc_cpu_dispatcher.h000066400000000000000000000024641443134507600303760ustar00rootroot00000000000000// Copyright (c) 2018-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #ifndef _ASC_CPU_DISPATCHER_H_ #define _ASC_CPU_DISPATCHER_H_ #include "cpu_detect.h" #include "asc_c_impl.h" #include "asc_sse4_impl.h" #include "asc_avx2_impl.h" #endif //_ASC_CPU_DISPATCHER_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/asc_defs.h000066400000000000000000000055531443134507600263240ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_config.h" #ifndef __ASC_DEFS_H__ #define __ASC_DEFS_H__ #define ASCTUNEDATA 0 #undef NULL #define NULL 0 #define OUT_BLOCK 16 // output pixels computed per thread #define MVBLK_SIZE 8 #define BLOCK_SIZE 4 #define BLOCK_SIZE_SHIFT 2 #define NumTSC 10 #define NumSC 10 #define FLOAT_MAX 2241178.0 #define FRAMEMUL 16 #define CHROMASUBSAMPLE 4 #define ASC_SMALL_WIDTH 128 #define ASC_SMALL_HEIGHT 64 #define MAXLTRHISTORY 120 #define ASC_SMALL_AREA 8192//13 bits #define S_AREA_SHIFT 13 #define TSC_INT_SCALE 5 #define GAINDIFF_THR 20 /*--MACROS--*/ #define NMAX(a,b) ((a>b)?a:b) #define NMIN(a,b) ((a #include #include #include #include #include #include "mfx_config.h" #include #include "mfxdefs.h" typedef mfxU8* pmfxU8; typedef mfxI8* pmfxI8; typedef mfxU16* pmfxU16; typedef mfxI16* pmfxI16; typedef mfxU32* pmfxU32; typedef mfxI32* pmfxI32; typedef mfxL32* pmfxL32; typedef mfxF32* pmfxF32; typedef mfxF64* pmfxF64; typedef mfxU64* pmfxU64; typedef mfxI64* pmfxI64; typedef struct _LARGE_INTEGER { int64_t QuadPart; } LARGE_INTEGER; namespace ns_asc{ typedef enum ASC_LTR_DESICION { NO_LTR = false, YES_LTR = true, FORCE_LTR } ASC_LTR_DEC; typedef enum ASCSimilar { Not_same, Same } ASCSimil; typedef enum ASCLayers { ASCFull_Size, ASCSmall_Size } ASClayer; typedef enum ASCResizing_Target { ASCSmall_Target } ASCRT; typedef enum ASCData_Flow_Direction { ASCReference_Frame, ASCCurrent_Frame, ASCScene_Diff_Frame }ASCDFD; typedef enum ASCGoP_Sizes { Forbidden_GoP, Immediate_GoP, QuarterHEVC_GoP, Three_GoP, HalfHEVC_GoP, Five_GoP, Six_GoP, Seven_Gop, HEVC_Gop, Nine_Gop, Ten_Gop, Eleven_Gop, Twelve_Gop, Thirteen_Gop, Fourteen_Gop, Fifteen_Gop, Double_HEVC_Gop } ASCGOP; typedef enum ASCBufferPosition { ASCcurrent_frame_data, ASCprevious_frame_data, ASCprevious_previous_frame_data, ASCSceneVariation_frame_data } ASCBP; typedef enum ASCGPU_USAGE { ASCNo_GPU_Proc, ASCDo_GPU_Proc }ASCGU; typedef enum ASCFrameTypeScan { ASC_UNKNOWN, ASCprogressive_frame, ASCtopfieldfirst_frame, ASCbotfieldFirst_frame }ASCFTS; typedef enum ASCFrameFields { ASCTopField, ASCBottomField }ASCFF; typedef struct ASCtimming_measurement_var { LARGE_INTEGER tFrequency, tStart, tPause[10], tStop; mfxF64 timeval, calctime; }ASCTime; typedef struct ASCcoordinates { mfxI16 x; mfxI16 y; }ASCMVector; typedef struct ASCBaseline { mfxI32 start; mfxI32 end; }ASCLine; typedef struct ASCYUV_layer_store { mfxU8 *data, *Y, *U, *V; mfxU32 width, height, pitch, hBorder, wBorder, extWidth, extHeight; }ASCYUV; typedef struct ASCSAD_range { mfxU16 SAD, distance; ASCMVector BestMV; }ASCRsad; typedef struct ASCImage_details { mfxI32 Original_Width, //User input Original_Height, //User input horizontal_pad, //User input for original resolution in multiples of FRAMEMUL, derived for the other two layers vertical_pad, //User input for original resolution in multiples of FRAMEMUL, derived for the other two layers _cwidth, //corrected size if width not multiple of FRAMEMUL _cheight, //corrected size if height not multiple of FRAMEMUL pitch, //horizontal_pad + _cwidth + horizontal_pad Extended_Width, //horizontal_pad + _cwidth + horizontal_pad Extended_Height, //vertical_pad + _cheight + vertical_pad block_width, //User input block_height, //User input Width_in_blocks, //_cwidth / block_width Height_in_blocks, //_cheight / block_height initial_point, //(Extended_Width * vertical_pad) + horizontal_pad sidesize, //_cheight + (1 * vertical_pad) MVspaceSize; //Pixels_in_Y_layer / block_width / block_height }ASCImDetails; typedef struct ASCVideo_characteristics { ASCImDetails *layer; mfxI32 starting_frame, //Frame number where the video is going to be accessed total_number_of_frames, //Total number of frames in video file processed_frames, //Number of frames that are going to be processed, taking into account the starting frame accuracy, key_frame_frequency, limitRange, maxXrange, maxYrange, interlaceMode, StartingField, currentField; ASCTime timer; }ASCVidData; typedef struct ASCstats_structure { mfxI32 frameNum, scVal, tscVal, pdist, histogram[5], Schg, last_shot_distance; mfxU32 SCindex, TSCindex, Rs, Cs, SC, TSC, RsDiff, CsDiff, RsCsDiff, MVdiffVal, AbsMVSize, AbsMVHSize, AbsMVVSize; mfxI16 tcor, mcTcor; mfxU16 AFD; mfxI32 ssDCval, refDCval, diffAFD, diffTSC, diffRsCsDiff, diffMVdiffVal; mfxU32 gchDC, posBalance, negBalance, avgVal; mfxI64 ssDCint, refDCint; bool Gchg; mfxU8 picType, lastFrameInShot; bool repeatedFrame, firstFrame, copyFrameDelay, fadeIn, filterIntra_flag, doFilter_flag, ltr_flag; }ASCTSCstat; }; //namespace ns_asc #endif //_STRUCTURES_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/cpu_detect.h000066400000000000000000000032051443134507600266640ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _CPUDETECT_H_ #define _CPUDETECT_H_ #include "asc_structures.h" #include // // CPU Dispatcher // 1) global CPU flags are initialized at startup // 2) each stub configures a function pointer on first call // static inline mfxI32 CpuFeature_SSE41() { return((__builtin_cpu_supports("sse4.1"))); } #if defined(__AVX2__) #endif static inline mfxI32 CpuFeature_AVX2() { #if defined(__AVX2__) return((__builtin_cpu_supports("avx2"))); #else return 0; #endif //defined(__AVX2__) } // // end Dispatcher // #endifoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/iofunctions.h000066400000000000000000000036771443134507600271220ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _IOFUNCTIONS_H_ #define _IOFUNCTIONS_H_ #include "asc_structures.h" #include "asc.h" static inline mfxF64 TimeMeasurement(LARGE_INTEGER start, LARGE_INTEGER stop, LARGE_INTEGER frequency) { return((stop.QuadPart - start.QuadPart) * mfxF64(1000.0) / frequency.QuadPart); } void TimeStart(ns_asc::ASCTime* timer); void TimeStart(ns_asc::ASCTime* timer, int index); void TimeStop(ns_asc::ASCTime* timer); mfxF64 CatchTime(ns_asc::ASCTime *timer, const char* message); mfxF64 CatchTime(ns_asc::ASCTime *timer, int index, const char* message); mfxF64 CatchTime(ns_asc::ASCTime *timer, int indexInit, int indexEnd, const char* message); void imageInit(ns_asc::ASCYUV *buffer); void nullifier(ns_asc::ASCimageData *Buffer); void ImDetails_Init(ns_asc::ASCImDetails *Rdata); mfxStatus ASCTSCstat_Init(ns_asc::ASCTSCstat **logic); #endif //_IOFUNCTIONS_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/me_asc.h000066400000000000000000000343521443134507600260030ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __ME_HEADER__ #define __ME_HEADER__ #include namespace ns_asc { #define _mm_loadh_epi64(a, ptr) _mm_castps_si128(_mm_loadh_pi(_mm_castsi128_ps(a), (__m64 *)(ptr))) #define _mm_movehl_epi64(a, b) _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b))) mfxU16 ME_SAD_4x4_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_cvtsi32_si128(*(int *)&pSrc[0*srcPitch]); __m128i s1 = _mm_cvtsi32_si128(*(int *)&pSrc[1*srcPitch]); __m128i r0 = _mm_cvtsi32_si128(*(int *)&pRef[0*refPitch]); __m128i r1 = _mm_cvtsi32_si128(*(int *)&pRef[1*refPitch]); __m128i s2 = _mm_cvtsi32_si128(*(int *)&pSrc[2*srcPitch]); __m128i s3 = _mm_cvtsi32_si128(*(int *)&pSrc[3*srcPitch]); __m128i r2 = _mm_cvtsi32_si128(*(int *)&pRef[2*refPitch]); __m128i r3 = _mm_cvtsi32_si128(*(int *)&pRef[3*refPitch]); s0 = _mm_unpacklo_epi32(s0, s1); r0 = _mm_unpacklo_epi32(r0, r1); s2 = _mm_unpacklo_epi32(s2, s3); r2 = _mm_unpacklo_epi32(r2, r3); s0 = _mm_sad_epu8(s0, r0); s2 = _mm_sad_epu8(s2, r2); s0 = _mm_add_epi32(s0, s2); return (mfxU16)_mm_extract_epi16(s0, 0); } mfxU16 ME_SAD_8x8_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0*srcPitch]), (__m128i *)&pSrc[1*srcPitch]); __m128i r0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[0*refPitch]), (__m128i *)&pRef[1*refPitch]); __m128i s1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2*srcPitch]), (__m128i *)&pSrc[3*srcPitch]); __m128i r1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[2*refPitch]), (__m128i *)&pRef[3*refPitch]); __m128i s2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4*srcPitch]), (__m128i *)&pSrc[5*srcPitch]); __m128i r2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[4*refPitch]), (__m128i *)&pRef[5*refPitch]); __m128i s3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6*srcPitch]), (__m128i *)&pSrc[7*srcPitch]); __m128i r3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[6*refPitch]), (__m128i *)&pRef[7*refPitch]); s0 = _mm_sad_epu8(s0, r0); s1 = _mm_sad_epu8(s1, r1); s2 = _mm_sad_epu8(s2, r2); s3 = _mm_sad_epu8(s3, r3); s0 = _mm_add_epi32(s0, s1); s2 = _mm_add_epi32(s2, s3); s0 = _mm_add_epi32(s0, s2); s2 = _mm_movehl_epi64(s2, s0); s0 = _mm_add_epi32(s0, s2); return (mfxU16)_mm_extract_epi16(s0, 0); } void ME_VAR_8x8_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU8 *pMCref, mfxI16 srcAvgVal, mfxI16 refAvgVal, mfxU32 srcPitch, mfxU32 refPitch, mfxI32 &var, mfxI32 &jtvar, mfxI32 &jtMCvar) { __m128i srcAvg = _mm_set1_epi16(srcAvgVal); __m128i refAvg = _mm_set1_epi16(refAvgVal); __m128i src[8], ref[8], rmc[8], accuVar = { 0 }, accuJtvar = { 0 }, accuMcJtvar = { 0 }; #ifdef __INTEL_COMPILER #pragma unroll(8) #endif for (mfxU8 i = 0; i < 8; i++) { src[i] = _mm_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&pSrc[i * srcPitch])); ref[i] = _mm_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&pRef[i * refPitch])); rmc[i] = _mm_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&pMCref[i * refPitch])); src[i] = _mm_sub_epi16(src[i], srcAvg); ref[i] = _mm_sub_epi16(ref[i], refAvg); rmc[i] = _mm_sub_epi16(rmc[i], refAvg); accuVar = _mm_add_epi32(_mm_madd_epi16(src[i], src[i]),accuVar); accuJtvar = _mm_add_epi32(_mm_madd_epi16(src[i], ref[i]),accuJtvar); accuMcJtvar = _mm_add_epi32(_mm_madd_epi16(src[i], rmc[i]),accuMcJtvar); } accuVar = _mm_hadd_epi32(accuVar, accuVar); accuVar = _mm_hadd_epi32(accuVar, accuVar); accuJtvar = _mm_hadd_epi32(accuJtvar, accuJtvar); accuJtvar = _mm_hadd_epi32(accuJtvar, accuJtvar); accuMcJtvar = _mm_hadd_epi32(accuMcJtvar, accuMcJtvar); accuMcJtvar = _mm_hadd_epi32(accuMcJtvar, accuMcJtvar); var += _mm_extract_epi32(accuVar, 0); jtvar += _mm_extract_epi32(accuJtvar, 0); jtMCvar += _mm_extract_epi32(accuMcJtvar, 0); } mfxU16 ME_preSAD_8x8_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0*srcPitch]), (__m128i *)&pSrc[1*srcPitch]); __m128i r0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[0*refPitch]), (__m128i *)&pRef[1*refPitch]); __m128i s1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2*srcPitch]), (__m128i *)&pSrc[3*srcPitch]); __m128i r1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[2*refPitch]), (__m128i *)&pRef[3*refPitch]); s0 = _mm_sad_epu8(s0, r0); s1 = _mm_sad_epu8(s1, r1); s0 = _mm_add_epi32(s0, s1); s1 = _mm_movehl_epi64(s1, s0); s0 = _mm_add_epi32(s0, s1); return (mfxU16)_mm_extract_epi16(s0, 0); } mfxU16 ME_SAD_8x16_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0*srcPitch]), (__m128i *)&pSrc[1*srcPitch]); __m128i r0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[0*refPitch]), (__m128i *)&pRef[1*refPitch]); __m128i s1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2*srcPitch]), (__m128i *)&pSrc[3*srcPitch]); __m128i r1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[2*refPitch]), (__m128i *)&pRef[3*refPitch]); __m128i s2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4*srcPitch]), (__m128i *)&pSrc[5*srcPitch]); __m128i r2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[4*refPitch]), (__m128i *)&pRef[5*refPitch]); __m128i s3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6*srcPitch]), (__m128i *)&pSrc[7*srcPitch]); __m128i r3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[6*refPitch]), (__m128i *)&pRef[7*refPitch]); __m128i s4 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[8*srcPitch]), (__m128i *)&pSrc[9*srcPitch]); __m128i r4 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[8*refPitch]), (__m128i *)&pRef[9*refPitch]); __m128i s5 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[10*srcPitch]), (__m128i *)&pSrc[11*srcPitch]); __m128i r5 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[10*refPitch]), (__m128i *)&pRef[11*refPitch]); __m128i s6 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[12*srcPitch]), (__m128i *)&pSrc[13*srcPitch]); __m128i r6 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[12*refPitch]), (__m128i *)&pRef[13*refPitch]); __m128i s7 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[14*srcPitch]), (__m128i *)&pSrc[15*srcPitch]); __m128i r7 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pRef[14*refPitch]), (__m128i *)&pRef[15*refPitch]); s0 = _mm_sad_epu8(s0, r0); s1 = _mm_sad_epu8(s1, r1); s2 = _mm_sad_epu8(s2, r2); s3 = _mm_sad_epu8(s3, r3); s4 = _mm_sad_epu8(s4, r4); s5 = _mm_sad_epu8(s5, r5); s6 = _mm_sad_epu8(s6, r6); s7 = _mm_sad_epu8(s7, r7); s0 = _mm_add_epi32(s0, s1); s2 = _mm_add_epi32(s2, s3); s4 = _mm_add_epi32(s4, s5); s6 = _mm_add_epi32(s6, s7); s0 = _mm_add_epi32(s0, s2); s4 = _mm_add_epi32(s4, s6); s0 = _mm_add_epi32(s0, s4); s4 = _mm_movehl_epi64(s4, s0); s0 = _mm_add_epi32(s0, s4); return (mfxU16)_mm_extract_epi16(s0, 0); } mfxU16 ME_SAD_16x8_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[0*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[0*refPitch])); __m128i s1 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[1*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[1*refPitch])); __m128i s2 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[2*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[2*refPitch])); __m128i s3 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[3*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[3*refPitch])); __m128i s4 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[4*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[4*refPitch])); __m128i s5 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[5*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[5*refPitch])); __m128i s6 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[6*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[6*refPitch])); __m128i s7 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[7*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[7*refPitch])); s0 = _mm_add_epi32(s0, s1); s2 = _mm_add_epi32(s2, s3); s4 = _mm_add_epi32(s4, s5); s6 = _mm_add_epi32(s6, s7); s0 = _mm_add_epi32(s0, s2); s4 = _mm_add_epi32(s4, s6); s0 = _mm_add_epi32(s0, s4); s4 = _mm_movehl_epi64(s4, s0); s0 = _mm_add_epi32(s0, s4); return (mfxU16)_mm_extract_epi16(s0, 0); } mfxU16 ME_SAD_16x16_Block(mfxU8 *pSrc, mfxU8 *pRef, mfxU32 srcPitch, mfxU32 refPitch) { __m128i s0 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[0*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[0*refPitch])); __m128i s1 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[1*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[1*refPitch])); __m128i s2 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[2*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[2*refPitch])); __m128i s3 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[3*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[3*refPitch])); __m128i s4 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[4*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[4*refPitch])); __m128i s5 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[5*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[5*refPitch])); __m128i s6 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[6*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[6*refPitch])); __m128i s7 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[7*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[7*refPitch])); __m128i s8 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[8*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[8*refPitch])); __m128i s9 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[9*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[9*refPitch])); __m128i s10 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[10*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[10*refPitch])); __m128i s11 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[11*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[11*refPitch])); __m128i s12 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[12*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[12*refPitch])); __m128i s13 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[13*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[13*refPitch])); __m128i s14 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[14*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[14*refPitch])); __m128i s15 = _mm_sad_epu8(_mm_loadu_si128((__m128i *)&pSrc[15*srcPitch]), _mm_loadu_si128((__m128i *)&pRef[15*refPitch])); s0 = _mm_add_epi32(s0, s1); s2 = _mm_add_epi32(s2, s3); s4 = _mm_add_epi32(s4, s5); s6 = _mm_add_epi32(s6, s7); s8 = _mm_add_epi32(s8, s9); s10 = _mm_add_epi32(s10, s11); s12 = _mm_add_epi32(s12, s13); s14 = _mm_add_epi32(s14, s15); s0 = _mm_add_epi32(s0, s2); s4 = _mm_add_epi32(s4, s6); s8 = _mm_add_epi32(s8, s10); s12 = _mm_add_epi32(s12, s14); s0 = _mm_add_epi32(s0, s4); s8 = _mm_add_epi32(s8, s12); s0 = _mm_add_epi32(s0, s8); s8 = _mm_movehl_epi64(s8, s0); s0 = _mm_add_epi32(s0, s8); return (mfxU16)_mm_cvtsi128_si32(s0); } mfxU32 ME_SAD_4x4_Block_Search_25(mfxI32 *x, mfxI32 *y, mfxU8 *src, mfxU8 *ref, mfxU32 stride) { mfxU32 result = 0xffffffff; mfxI32 limit = 2*stride; for(int i= -limit;i<=limit;i+=stride) for(int j=-limit;j<=limit;j+=stride) { mfxU32 r = ME_SAD_4x4_Block(src, ref + (i + stride * j), stride, stride); if( r < result ) { result = r; *x = i; *y = j; } } return result; } mfxU32 ME_SAD_4x4_Block_Search_5x5(mfxI32 *x, mfxI32 *y, mfxU8 *src, mfxU8 *ref, mfxU32 stride) { mfxU32 result = 0xffffffff; for(int i = -2; i <= 2; ++i ) for(int j = -2; j <= 2; ++j ) { mfxU32 r = ME_SAD_4x4_Block(src, ref + (i + stride * j), stride, stride); if( r < result ) { result = r; *x = i; *y = j; } } return result; } mfxU32 ME_SAD_8x8_Block_Search_25(mfxI32 *x, mfxI32 *y, mfxU8 *src, mfxU8 *ref, mfxU32 stride) { mfxU32 result = 0xffffffff; mfxI32 limit = 2*stride; for(int i=-limit;i<=limit;i+=stride) for(int j=-limit;j<=limit;j+=stride) { mfxU32 r = ME_SAD_8x8_Block(src, ref + (i + stride * j), stride, stride); if( r < result ) { result = r; *x = i; *y = j; } } return result; } mfxU32 ME_SAD_8x8_Block_Search_5x5(mfxI32 *x, mfxI32 *y, mfxU8 *src, mfxU8 *ref, mfxU32 stride) { mfxU32 result = 0xffffffff; for(int i = -2; i <= 2; ++i ) for(int j = -2; j <= 2; ++j ) { mfxU32 r = ME_SAD_8x8_Block(src, ref + (i + stride * j), stride, stride); if( r < result ) { result = r; *x = i; *y = j; } } return result; } }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/motion_estimation_engine.h000066400000000000000000000047451443134507600316450ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MOTIONESTIMATIONENGINE_H_ #define _MOTIONESTIMATIONENGINE_H_ #include "asc_structures.h" #include "asc.h" namespace ns_asc { void MotionRangeDeliveryF(mfxI16 xLoc, mfxI16 yLoc, mfxI16 *limitXleft, mfxI16 *limitXright, mfxI16 *limitYup, mfxI16 *limitYdown, ASCImDetails dataIn); /* 4x4 Block size Functions */ bool MVcalcSAD4x4(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU32 *bestSAD, mfxI32 *distance); /* 8x8 Block size Functions */ bool MVcalcSAD8x8(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails *dataIn, mfxU32 *bestSAD, mfxI32 *distance); mfxU16 ME_simple(ASCVidRead *videoIn, mfxI32 fPos, ASCImDetails *dataIn, ASCimageData *scale, ASCimageData *scaleRef, bool first, ASCVidData *limits, t_ME_SAD_8x8_Block_Search ME_SAD_8x8_Block_Search); /* All Block sizes -general case- */ bool MVcalcSAD(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxI32 fPos,mfxI32 xLoc, mfxI32 yLoc, mfxU32 *bestSAD, mfxI32 *distance); /* ------------------------------ */ void SearchLimitsCalc(mfxI32 xLoc, mfxI32 yLoc, mfxI32 *limitXleft, mfxI32 *limitXright, mfxI32 *limitYup, mfxI32 *limitYdown, ASCImDetails dataIn, mfxI32 range, ASCMVector mv, ASCVidData limits); mfxF32 Dist(ASCMVector vector); mfxI32 DistInt(ASCMVector vector); void MVpropagationCheck(mfxI32 xLoc, mfxI32 yLoc, ASCImDetails dataIn, ASCMVector *propagatedMV); }; #endif //_MOTIONESTIMATIONENGINE_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/include/tree.h000066400000000000000000000031761443134507600255130ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _TREE_H_ #define _TREE_H_ #include "asc_structures.h" bool SCDetectRF( mfxI32 diffMVdiffVal, mfxU32 RsCsDiff, mfxU32 MVDiff, mfxU32 Rs, mfxU32 AFD, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 TSC, mfxU32 gchDC, mfxI32 diffRsCsdiff, mfxU32 posBalance, mfxU32 SC, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 Cs, mfxI32 diffAFD, mfxU32 negBalance, mfxU32 ssDCval, mfxU32 refDCval, mfxU32 RsDiff, mfxU8 control); #endif //_TREE_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/000077500000000000000000000000001443134507600235405ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/asc.cpp000066400000000000000000001206471443134507600250240ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc.h" #include "asc_defs.h" #include "asc_cpu_dispatcher.h" #include "libmfx_core_interface.h" #include "tree.h" #include "iofunctions.h" #include "motion_estimation_engine.h" #include #include #include #include using std::min; using std::max; namespace ns_asc { static mfxI8 PDISTTbl2[NumTSC*NumSC] = { 2, 3, 3, 4, 4, 5, 5, 5, 5, 5, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static mfxU32 lmt_sc2[NumSC] = { 112, 255, 512, 1536, 4096, 6144, 10752, 16384, 23040, UINT_MAX }; static mfxU32 lmt_tsc2[NumTSC] = { 24, 48, 72, 96, 128, 160, 192, 224, 256, UINT_MAX }; ASCimageData::ASCimageData() { Image.data = nullptr; Image.Y = nullptr; Image.U = nullptr; Image.V = nullptr; Image.extHeight = 0; Image.extWidth = 0; Image.hBorder = 0; Image.wBorder = 0; Image.height = 0; Image.width = 0; Image.pitch = 0; pInteger = nullptr; Cs = nullptr; Rs = nullptr; RsCs = nullptr; SAD = nullptr; CsVal = 0; RsVal = 0; avgval = 0; var = 0; jtvar = 0; mcjtvar = 0; tcor = 0; mcTcor = 0; } mfxStatus ASCimageData::InitFrame(ASCImDetails *pDetails) { mfxU32 imageSpaceSize = pDetails->Extended_Height * pDetails->Extended_Width, mvSpaceSize = (pDetails->_cheight * pDetails->_cwidth) >> 6, texSpaceSize = (pDetails->_cheight * pDetails->_cwidth) >> 4; Image.extHeight = pDetails->Extended_Height; Image.extWidth = pDetails->Extended_Width; Image.pitch = pDetails->Extended_Width; Image.height = pDetails->_cheight; Image.width = pDetails->_cwidth; Image.hBorder = pDetails->vertical_pad; Image.wBorder = pDetails->horizontal_pad; Image.data = NULL; Image.Y = NULL; Image.U = NULL; Image.V = NULL; //Memory Allocation Image.data = (mfxU8*)memalign(0x1000, imageSpaceSize); SAD = (mfxU16 *)memalign(0x1000, sizeof(mfxU16) * mvSpaceSize); Rs = (mfxU16 *)memalign(0x1000, sizeof(mfxU16) * texSpaceSize); Cs = (mfxU16 *)memalign(0x1000, sizeof(mfxU16) * texSpaceSize); RsCs = (mfxU16 *)memalign(0x1000, sizeof(mfxU16) * texSpaceSize); pInteger = (ASCMVector *)memalign(0x1000, sizeof(ASCMVector) * mvSpaceSize); if (Image.data == NULL) return MFX_ERR_MEMORY_ALLOC; //Pointer conf. memset(Image.data, 0, sizeof(mfxU8) * imageSpaceSize); Image.Y = Image.data + pDetails->initial_point; if (SAD == NULL || Rs == NULL) return MFX_ERR_MEMORY_ALLOC; memset(Rs, 0, sizeof(mfxU16) * texSpaceSize); if (Cs == NULL) return MFX_ERR_MEMORY_ALLOC; memset(Cs, 0, sizeof(mfxU16) * texSpaceSize); if (RsCs == NULL) return MFX_ERR_MEMORY_ALLOC; memset(RsCs, 0, sizeof(mfxU16) * texSpaceSize); if (pInteger == NULL) return MFX_ERR_MEMORY_ALLOC; memset(pInteger, 0, sizeof(ASCMVector) * mvSpaceSize); return MFX_ERR_NONE; } mfxStatus ASCimageData::InitAuxFrame(ASCImDetails *pDetails) { mfxU32 imageSpaceSize = pDetails->Extended_Height * pDetails->Extended_Width; Image.extHeight = pDetails->Extended_Height; Image.extWidth = pDetails->Extended_Width; Image.pitch = pDetails->Extended_Width; Image.height = pDetails->_cheight; Image.width = pDetails->_cwidth; Image.hBorder = pDetails->vertical_pad; Image.wBorder = pDetails->horizontal_pad; Image.data = NULL; Image.Y = NULL; Image.U = NULL; Image.V = NULL; //Memory Allocation Image.data = (mfxU8*)memalign(0x1000, imageSpaceSize); if (Image.data == NULL) return MFX_ERR_MEMORY_ALLOC; //Pointer conf. memset(Image.data, 0, sizeof(mfxU8) * imageSpaceSize); Image.Y = Image.data + pDetails->initial_point; return MFX_ERR_NONE; } void ASCimageData::Close() { if (Rs) free(Rs); if (Cs) free(Cs); if (RsCs) free(RsCs); if (pInteger) free(pInteger); if (SAD) free(SAD); if (Image.data) free(Image.data); Rs = nullptr; Cs = nullptr; RsCs = nullptr; pInteger = nullptr; SAD = nullptr; Image.data = nullptr; Image.Y = nullptr; Image.U = nullptr; Image.V = nullptr; } ASC::ASC() : m_gpuImPitch(0) , m_threadsWidth(0) , m_threadsHeight(0) , m_frameBkp(nullptr) , m_gpuwidth(0) , m_gpuheight(0) , m_support(nullptr) , m_dataIn(nullptr) , m_dataReady(false) , m_is_LTR_on(false) , m_ASCinitialized(false) , m_width(0) , m_height(0) , m_pitch(0) , ltr_check_history() , m_AVX2_available(0) , m_SSE4_available(0) , GainOffset(nullptr) , RsCsCalc_4x4(nullptr) , RsCsCalc_bound(nullptr) , RsCsCalc_diff(nullptr) , ImageDiffHistogram(nullptr) , ME_SAD_8x8_Block_Search(nullptr) , Calc_RaCa_pic(nullptr) , resizeFunc(nullptr) , m_videoData(nullptr) { } void ASC::Setup_Environment() { m_dataIn->accuracy = 1; m_dataIn->layer->Original_Width = ASC_SMALL_WIDTH; m_dataIn->layer->Original_Height = ASC_SMALL_HEIGHT; m_dataIn->layer->_cwidth = ASC_SMALL_WIDTH; m_dataIn->layer->_cheight = ASC_SMALL_HEIGHT; m_dataIn->layer->block_width = 8; m_dataIn->layer->block_height = 8; m_dataIn->layer->vertical_pad = 0; m_dataIn->layer->horizontal_pad = 0; m_dataIn->layer->Extended_Height = m_dataIn->layer->vertical_pad + ASC_SMALL_HEIGHT + m_dataIn->layer->vertical_pad; m_dataIn->layer->Extended_Width = m_dataIn->layer->horizontal_pad + ASC_SMALL_WIDTH + m_dataIn->layer->horizontal_pad; m_dataIn->layer->pitch = m_dataIn->layer->Extended_Width; m_dataIn->layer->Height_in_blocks = m_dataIn->layer->_cheight / m_dataIn->layer->block_height; m_dataIn->layer->Width_in_blocks = m_dataIn->layer->_cwidth / m_dataIn->layer->block_width; m_dataIn->layer->sidesize = m_dataIn->layer->_cheight + (1 * m_dataIn->layer->vertical_pad); m_dataIn->layer->initial_point = (m_dataIn->layer->Extended_Width * m_dataIn->layer->vertical_pad) + m_dataIn->layer->horizontal_pad; m_dataIn->layer->MVspaceSize = (m_dataIn->layer->_cheight / m_dataIn->layer->block_height) * (m_dataIn->layer->_cwidth / m_dataIn->layer->block_width); } void ASC::Params_Init() { m_dataIn->accuracy = 1; m_dataIn->processed_frames = 0; m_dataIn->total_number_of_frames = -1; m_dataIn->starting_frame = 0; m_dataIn->key_frame_frequency = INT_MAX; m_dataIn->limitRange = 0; m_dataIn->maxXrange = 32; m_dataIn->maxYrange = 32; m_dataIn->interlaceMode = 0; m_dataIn->StartingField = ASCTopField; m_dataIn->currentField = ASCTopField; ImDetails_Init(m_dataIn->layer); } mfxStatus ASC::SetInterlaceMode(ASCFTS interlaceMode) { if (interlaceMode > ASCbotfieldFirst_frame) { ASC_PRINTF("\nError: Interlace Mode invalid, valid values are: 1 (progressive), 2 (TFF), 3 (BFF)\n"); return MFX_ERR_INVALID_VIDEO_PARAM; } else m_dataIn->interlaceMode = interlaceMode; m_dataIn->StartingField = ASCTopField; if (m_dataIn->interlaceMode != ASCprogressive_frame) { if (m_dataIn->interlaceMode == ASCbotfieldFirst_frame) m_dataIn->StartingField = ASCBottomField; resizeFunc = &ASC::SubSampleASC_ImageInt; } else { resizeFunc = &ASC::SubSampleASC_ImagePro; } m_dataIn->currentField = m_dataIn->StartingField; return MFX_ERR_NONE; } void ASC::VidRead_dispose() { if (m_support->logic != nullptr) { for (mfxI32 i = 0; i < TSCSTATBUFFER; i++) delete m_support->logic[i]; delete[] m_support->logic; } if (m_support->gainCorrection.Image.data != nullptr) m_support->gainCorrection.Close(); } void ASC::InitStruct() { m_dataIn = nullptr; m_support = nullptr; m_videoData = nullptr; resizeFunc = nullptr; } mfxStatus ASC::VidRead_Init() { mfxStatus sts = MFX_ERR_NONE; m_support->control = 0; m_support->average = 0; m_support->avgSAD = 0; m_support->gopSize = 1; m_support->pendingSch = 0; m_support->lastSCdetectionDistance = 0; m_support->detectedSch = 0; m_support->frameOrder = 0; m_support->PDistanceTable = PDISTTbl2; m_support->size = ASCSmall_Size; m_support->firstFrame = true; m_support->gainCorrection.Image.data = nullptr; m_support->gainCorrection.Image.Y = nullptr; m_support->gainCorrection.Image.U = nullptr; m_support->gainCorrection.Image.V = nullptr; m_support->gainCorrection.Cs = nullptr; m_support->gainCorrection.Rs = nullptr; m_support->gainCorrection.RsCs = nullptr; m_support->gainCorrection.pInteger = nullptr; m_support->gainCorrection.SAD = nullptr; try { m_support->logic = new ASCTSCstat *[TSCSTATBUFFER]; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } sts = ASCTSCstat_Init(m_support->logic); SCD_CHECK_MFX_ERR(sts); //#if USE_SCD sts = m_support->gainCorrection.InitAuxFrame(m_dataIn->layer); //#else // sts = m_support->gainCorrection.InitFrame(m_dataIn->layer); //#endif SCD_CHECK_MFX_ERR(sts); return sts; } void ASC::VidSample_Init() { for(mfxI32 i = 0; i < ASCVIDEOSTATSBUF; i++) { nullifier(&m_videoData[i]->layer); imageInit(&m_videoData[i]->layer.Image); m_videoData[i]->frame_number = -1; m_videoData[i]->forward_reference = -1; m_videoData[i]->backward_reference = -1; } } void ASC::SetUltraFastDetection() { m_support->size = ASCSmall_Size; resizeFunc = &ASC::SubSampleASC_ImagePro; } mfxStatus ASC::SetWidth(mfxI32 Width) { if(Width < ASC_SMALL_WIDTH) { ASC_PRINTF("\nError: Width value is too small, it needs to be bigger than %i\n", ASC_SMALL_WIDTH); return MFX_ERR_UNSUPPORTED; } else m_width = Width; return MFX_ERR_NONE; } mfxStatus ASC::SetHeight(mfxI32 Height) { if(Height < ASC_SMALL_HEIGHT) { ASC_PRINTF("\nError: Height value is too small, it needs to be bigger than %i\n", ASC_SMALL_HEIGHT); return MFX_ERR_UNSUPPORTED; } else m_height = Height; return MFX_ERR_NONE; } mfxStatus ASC::SetPitch(mfxI32 Pitch) { if(m_width < ASC_SMALL_WIDTH) { ASC_PRINTF("\nError: Width value has not been set, init the variables first\n"); return MFX_ERR_UNSUPPORTED; } if(Pitch < m_width) { ASC_PRINTF("\nError: Pitch value is too small, it needs to be bigger than %i\n", m_width); return MFX_ERR_UNSUPPORTED; } else m_pitch = Pitch; return MFX_ERR_NONE; } void ASC::SetNextField() { if(m_dataIn->interlaceMode != ASCprogressive_frame) m_dataIn->currentField = !m_dataIn->currentField; } mfxStatus ASC::SetDimensions(mfxI32 Width, mfxI32 Height, mfxI32 Pitch) { mfxStatus sts; sts = SetWidth(Width); SCD_CHECK_MFX_ERR(sts); sts = SetHeight(Height); SCD_CHECK_MFX_ERR(sts); sts = SetPitch(Pitch); SCD_CHECK_MFX_ERR(sts); return sts; } mfxStatus ASC::Init(mfxI32 Width, mfxI32 Height, mfxI32 Pitch, mfxU32 PicStruct, bool isCmSupported) { mfxStatus sts = MFX_ERR_NONE; m_AVX2_available = CpuFeature_AVX2(); m_SSE4_available = CpuFeature_SSE41(); ASC_CPU_DISP_INIT_C(GainOffset); ASC_CPU_DISP_INIT_SSE4_C(RsCsCalc_4x4); ASC_CPU_DISP_INIT_C(RsCsCalc_bound); ASC_CPU_DISP_INIT_C(RsCsCalc_diff); ASC_CPU_DISP_INIT_SSE4_C(ImageDiffHistogram); ASC_CPU_DISP_INIT_AVX2_SSE4_C(ME_SAD_8x8_Block_Search); ASC_CPU_DISP_INIT_SSE4_C(Calc_RaCa_pic); InitStruct(); try { m_dataIn = new ASCVidData; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } m_dataIn->layer = nullptr; try { m_dataIn->layer = new ASCImDetails; m_videoData = new ASCVidSample * [ASCVIDEOSTATSBUF]; for (mfxU8 i = 0; i < ASCVIDEOSTATSBUF; i++) m_videoData[i] = nullptr; m_support = new ASCVidRead; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } for (mfxI32 i = 0; i < ASCVIDEOSTATSBUF; i++) { try { m_videoData[i] = new ASCVidSample; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } } Params_Init(); sts = SetDimensions(Width, Height, Pitch); SCD_CHECK_MFX_ERR(sts); m_gpuwidth = Width; m_gpuheight = Height; VidSample_Init(); Setup_Environment(); sts = VidRead_Init(); SCD_CHECK_MFX_ERR(sts); SetUltraFastDetection(); sts = SetInterlaceMode((PicStruct & MFX_PICSTRUCT_FIELD_TFF) ? ASCtopfieldfirst_frame : (PicStruct & MFX_PICSTRUCT_FIELD_BFF) ? ASCbotfieldFirst_frame : ASCprogressive_frame); SCD_CHECK_MFX_ERR(sts); m_dataReady = false; m_ASCinitialized = (sts == MFX_ERR_NONE); (void)isCmSupported; return sts; } bool ASC::IsASCinitialized(){ return m_ASCinitialized; } void ASC::SetControlLevel(mfxU8 level) { if(level >= RF_DECISION_LEVEL) { ASC_PRINTF("\nWarning: Control level too high, shot change detection disabled! (%i)\n", level); ASC_PRINTF("Control levels 0 to %i, smaller value means more sensitive detection\n", RF_DECISION_LEVEL); } m_support->control = level; } mfxStatus ASC::SetGoPSize(mfxU32 GoPSize) { if (GoPSize > Double_HEVC_Gop) { ASC_PRINTF("\nError: GoPSize is too big! (%i)\n", GoPSize); return MFX_ERR_INVALID_VIDEO_PARAM; } else if (GoPSize == Forbidden_GoP) { ASC_PRINTF("\nError: GoPSize value cannot be zero!\n"); return MFX_ERR_INVALID_VIDEO_PARAM; } else if (GoPSize > HEVC_Gop && GoPSize <= Double_HEVC_Gop) { ASC_PRINTF("\nWarning: Your GoPSize is larger than usual! (%i)\n", GoPSize); return MFX_ERR_INVALID_VIDEO_PARAM; } m_support->gopSize = GoPSize; m_support->pendingSch = 0; return MFX_ERR_NONE; } void ASC::ResetGoPSize() { SetGoPSize(Immediate_GoP); } void ASC::Close() { if(m_videoData != nullptr) { VidSample_dispose(); delete[] m_videoData; m_videoData = nullptr; } if(m_support != nullptr) { VidRead_dispose(); delete m_support; m_support = nullptr; } if(m_dataIn != nullptr) { delete m_dataIn->layer; delete m_dataIn; m_dataIn = nullptr; } } void ASC::SubSampleASC_ImagePro(mfxU8 *frame, mfxI32 srcWidth, mfxI32 srcHeight, mfxI32 inputPitch, ASCLayers dstIdx, mfxU32 /*parity*/) { ASCImDetails *pIDetDst = &m_dataIn->layer[dstIdx]; mfxU8 *pDst = m_videoData[ASCCurrent_Frame]->layer.Image.Y; mfxI16& avgLuma = m_videoData[ASCCurrent_Frame]->layer.avgval; mfxI32 dstWidth = pIDetDst->Original_Width; mfxI32 dstHeight = pIDetDst->Original_Height; mfxI32 dstPitch = pIDetDst->pitch; SubSample_Point(frame, srcWidth, srcHeight, inputPitch, pDst, dstWidth, dstHeight, dstPitch, avgLuma); } void ASC::SubSampleASC_ImageInt(mfxU8 *frame, mfxI32 srcWidth, mfxI32 srcHeight, mfxI32 inputPitch, ASCLayers dstIdx, mfxU32 parity) { ASCImDetails *pIDetDst = &m_dataIn->layer[dstIdx]; mfxU8 *pDst = m_videoData[ASCCurrent_Frame]->layer.Image.Y; mfxI16 &avgLuma = m_videoData[ASCCurrent_Frame]->layer.avgval; mfxI32 dstWidth = pIDetDst->Original_Width; mfxI32 dstHeight = pIDetDst->Original_Height; mfxI32 dstPitch = pIDetDst->pitch; SubSample_Point(frame + (parity * inputPitch), srcWidth, srcHeight / 2, inputPitch * 2, pDst, dstWidth, dstHeight, dstPitch, avgLuma); } // // SubSample pSrc into pDst, using point-sampling of source pixels // Corrects the position on odd lines in case the input video is // interlaced // void ASC::SubSample_Point( pmfxU8 pSrc, mfxU32 srcWidth, mfxU32 srcHeight, mfxU32 srcPitch, pmfxU8 pDst, mfxU32 dstWidth, mfxU32 dstHeight, mfxU32 dstPitch, mfxI16 &avgLuma) { mfxI32 step_w = srcWidth / dstWidth; mfxI32 step_h = srcHeight / dstHeight; mfxI32 need_correction = !(step_h % 2); mfxI32 correction = 0; mfxU32 sumAll = 0; mfxI32 y = 0; for (y = 0; y < (mfxI32)dstHeight; y++) { correction = (y % 2) & need_correction; for (mfxI32 x = 0; x < (mfxI32)dstWidth; x++) { pmfxU8 ps = pSrc + ((y * step_h + correction) * srcPitch) + (x * step_w); pmfxU8 pd = pDst + (y * dstPitch) + x; pd[0] = ps[0]; sumAll += ps[0]; } } avgLuma = (mfxI16)(sumAll >> 13); } mfxStatus ASC::RsCsCalc() { ASCYUV *pFrame = &m_videoData[ASCCurrent_Frame]->layer.Image; ASCImDetails vidCar = m_dataIn->layer[0]; pmfxU8 ss = pFrame->Y; mfxU32 hblocks = (pFrame->height >> BLOCK_SIZE_SHIFT) /*- 2*/, wblocks = (pFrame->width >> BLOCK_SIZE_SHIFT) /*- 2*/; mfxI16 diff = m_videoData[ASCReference_Frame]->layer.avgval - m_videoData[ASCCurrent_Frame]->layer.avgval; ss = m_videoData[ASCReference_Frame]->layer.Image.Y; if (!m_support->firstFrame && abs(diff) >= GAINDIFF_THR) { if (m_support->gainCorrection.Image.Y == nullptr) return MFX_ERR_MEMORY_ALLOC; GainOffset(&ss, &m_support->gainCorrection.Image.Y, (mfxU16)vidCar._cwidth, (mfxU16)vidCar._cheight, (mfxU16)vidCar.Extended_Width, diff); } ss = m_videoData[ASCCurrent_Frame]->layer.Image.Y; RsCsCalc_4x4(ss, pFrame->pitch, wblocks, hblocks, m_videoData[ASCCurrent_Frame]->layer.Rs, m_videoData[ASCCurrent_Frame]->layer.Cs); RsCsCalc_bound(m_videoData[ASCCurrent_Frame]->layer.Rs, m_videoData[ASCCurrent_Frame]->layer.Cs, m_videoData[ASCCurrent_Frame]->layer.RsCs, &m_videoData[ASCCurrent_Frame]->layer.RsVal, &m_videoData[ASCCurrent_Frame]->layer.CsVal, wblocks, hblocks); return MFX_ERR_NONE; } bool Hint_LTR_op_on(mfxU32 SC, mfxU32 TSC) { bool ltr = TSC *TSC < (std::max(SC, 64u) / 12); return ltr; } mfxI32 ASC::ShotDetect(ASCimageData& Data, ASCimageData& DataRef, ASCImDetails& imageInfo, ASCTSCstat *current, ASCTSCstat *reference, mfxU8 controlLevel) { pmfxU8 ssFrame = Data.Image.Y, refFrame = DataRef.Image.Y; pmfxU16 objRs = Data.Rs, objCs = Data.Cs, refRs = DataRef.Rs, refCs = DataRef.Cs; current->RsCsDiff = 0; current->Schg = -1; current->Gchg = 0; RsCsCalc_diff(objRs, objCs, refRs, refCs, 2*imageInfo.Width_in_blocks, 2*imageInfo.Height_in_blocks, ¤t->RsDiff, ¤t->CsDiff); ImageDiffHistogram(ssFrame, refFrame, imageInfo.Extended_Width, imageInfo._cwidth, imageInfo._cheight, current->histogram, ¤t->ssDCint, ¤t->refDCint); if(reference->Schg) current->last_shot_distance = 1; else current->last_shot_distance++; current->RsDiff >>= 9; current->CsDiff >>= 9; current->RsCsDiff = (current->RsDiff*current->RsDiff) + (current->CsDiff*current->CsDiff); current->ssDCval = (mfxI32)current->ssDCint >> 13; current->refDCval = (mfxI32)current->refDCint >> 13; current->gchDC = NABS(current->ssDCval - current->refDCval); current->posBalance = (current->histogram[3] + current->histogram[4]) >> 6; current->negBalance = (current->histogram[0] + current->histogram[1]) >> 6; current->diffAFD = current->AFD - reference->AFD; current->diffTSC = current->TSC - reference->TSC; current->diffRsCsDiff = current->RsCsDiff - reference->RsCsDiff; current->diffMVdiffVal = current->MVdiffVal - reference->MVdiffVal; mfxI32 SChange = SCDetectRF( current->diffMVdiffVal, current->RsCsDiff, current->MVdiffVal, current->Rs, current->AFD, current->CsDiff, current->diffTSC, current->TSC, current->gchDC, current->diffRsCsDiff, current->posBalance, current->SC, current->TSCindex, current->SCindex, current->Cs, current->diffAFD, current->negBalance, current->ssDCval, current->refDCval, current->RsDiff, controlLevel); #if ASCTUNEDATA { FILE *dataFile = NULL; fopen_s(&dataFile, "stats_shotdetect.txt", "a+"); fprintf(dataFile, "%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n", current->frameNum, current->Rs, current->Cs, current->SC, current->AFD, current->TSC, current->RsDiff, current->CsDiff, current->RsCsDiff, current->MVdiffVal, current->avgVal, current->ssDCval, current->refDCval, current->gchDC, current->posBalance, current->negBalance, current->diffAFD, current->diffTSC, current->diffRsCsDiff, current->diffMVdiffVal, current->SCindex, current->TSCindex, current->tcor, current->mcTcor, SChange); fclose(dataFile); } #endif current->ltr_flag = Hint_LTR_op_on(current->SC, current->TSC); return SChange; } void ASC::MotionAnalysis(ASCVidSample *videoIn, ASCVidSample *videoRef, mfxU32 *TSC, mfxU16 *AFD, mfxU32 *MVdiffVal, mfxU32 *AbsMVSize, mfxU32 *AbsMVHSize, mfxU32 *AbsMVVSize, ASCLayers lyrIdx) { mfxU32//24bit is enough valb = 0; mfxU32 acc = 0; /*--Motion Estimation--*/ *MVdiffVal = 0; *AbsMVSize = 0; *AbsMVHSize = 0; *AbsMVVSize = 0; mfxI16 diff = (int)videoIn->layer.avgval - (int)videoRef->layer.avgval; ASCimageData *referenceImageIn = &videoRef->layer; if (abs(diff) >= GAINDIFF_THR) { referenceImageIn = &m_support->gainCorrection; } m_support->average = 0; videoIn->layer.var = 0; videoIn->layer.jtvar = 0; videoIn->layer.mcjtvar = 0; for (mfxU16 i = 0; i < m_dataIn->layer[lyrIdx].Height_in_blocks; i++) { mfxU16 prevFPos = i << 4; for (mfxU16 j = 0; j < m_dataIn->layer[lyrIdx].Width_in_blocks; j++) { mfxU16 fPos = prevFPos + j; acc += ME_simple(m_support, fPos, m_dataIn->layer, &videoIn->layer, referenceImageIn, true, m_dataIn, ME_SAD_8x8_Block_Search); valb += videoIn->layer.SAD[fPos]; *MVdiffVal += (videoIn->layer.pInteger[fPos].x - videoRef->layer.pInteger[fPos].x) * (videoIn->layer.pInteger[fPos].x - videoRef->layer.pInteger[fPos].x); *MVdiffVal += (videoIn->layer.pInteger[fPos].y - videoRef->layer.pInteger[fPos].y) * (videoIn->layer.pInteger[fPos].y - videoRef->layer.pInteger[fPos].y); *AbsMVHSize += (videoIn->layer.pInteger[fPos].x * videoIn->layer.pInteger[fPos].x); *AbsMVVSize += (videoIn->layer.pInteger[fPos].y * videoIn->layer.pInteger[fPos].y); *AbsMVSize += (videoIn->layer.pInteger[fPos].x * videoIn->layer.pInteger[fPos].x) + (videoIn->layer.pInteger[fPos].y * videoIn->layer.pInteger[fPos].y); } } videoIn->layer.var = videoIn->layer.var * 10 / 128 / 64; videoIn->layer.jtvar = videoIn->layer.jtvar * 10 / 128 / 64; videoIn->layer.mcjtvar = videoIn->layer.mcjtvar * 10 / 128 / 64; if (videoIn->layer.var == 0) { if (videoIn->layer.jtvar == 0) videoIn->layer.tcor = 100; else videoIn->layer.tcor = (mfxI16)NMIN(1000 * videoIn->layer.jtvar, 2000); if (videoIn->layer.mcjtvar == 0) videoIn->layer.mcTcor = 100; else videoIn->layer.mcTcor = (mfxI16)NMIN(1000 * videoIn->layer.mcjtvar, 2000); } else { videoIn->layer.tcor = (mfxI16)(100 * videoIn->layer.jtvar / videoIn->layer.var); videoIn->layer.mcTcor = (mfxI16)(100 * videoIn->layer.mcjtvar / videoIn->layer.var); } *TSC = valb >> 8; *AFD = (mfxU16)(acc >> 13);//Picture area is 2^13, and 10 have been done before so it needs to shift 3 more. *MVdiffVal = *MVdiffVal >> 7; } mfxU32 TableLookUp(mfxU32 limit, mfxU32 *table, mfxU32 comparisonValue) { for (mfxU32 pos = 0; pos < limit; pos++) { if (comparisonValue < table[pos]) return pos; } return limit; } void CorrectionForGoPSize(ASCVidRead *m_support, mfxU32 PdIndex) { m_support->detectedSch = 0; if(m_support->logic[PdIndex]->Schg) { if(m_support->lastSCdetectionDistance % m_support->gopSize) m_support->pendingSch = 1; else { m_support->lastSCdetectionDistance = 0; m_support->pendingSch = 0; m_support->detectedSch = 1; } } else if(m_support->pendingSch) { if(!(m_support->lastSCdetectionDistance % m_support->gopSize)) { m_support->lastSCdetectionDistance = 0; m_support->pendingSch = 0; m_support->detectedSch = 1; } } m_support->lastSCdetectionDistance++; } bool ASC::CompareStats(mfxU8 current, mfxU8 reference) { if (current > 2 || reference > 2 || current == reference) { ASC_PRINTF("Error: Invalid stats comparison\n"); assert(!"Error: Invalid stats comparison"); } mfxU8 comparison = 0; if (m_dataIn->interlaceMode == ASCprogressive_frame) { comparison += m_support->logic[current]->AFD == 0; comparison += m_support->logic[current]->RsCsDiff == 0; comparison += m_support->logic[current]->TSCindex == 0; comparison += m_support->logic[current]->negBalance <= 3; comparison += m_support->logic[current]->posBalance <= 20; comparison += ((m_support->logic[current]->diffAFD <= 0) && (m_support->logic[current]->diffTSC <= 0)); comparison += (m_support->logic[current]->diffAFD <= m_support->logic[current]->diffTSC); if (comparison == 7) return Same; } else if ((m_dataIn->interlaceMode == ASCbotfieldFirst_frame) || (m_dataIn->interlaceMode == ASCtopfieldfirst_frame)) { comparison += m_support->logic[current]->AFD == m_support->logic[current]->TSC; comparison += m_support->logic[current]->AFD <= 9; comparison += m_support->logic[current]->gchDC <= 1; comparison += m_support->logic[current]->RsCsDiff <= 9; comparison += ((m_support->logic[current]->diffAFD <= 1) && (m_support->logic[current]->diffTSC <= 1)); comparison += (m_support->logic[current]->diffAFD <= m_support->logic[current]->diffTSC); if (comparison == 6) return Same; } else { ASC_PRINTF("Error: Invalid interlace mode for stats comparison\n"); assert(!"Error: Invalid interlace mode for stats comparison\n"); } return Not_same; } bool ASC::DenoiseIFrameRec() { bool result = false; mfxF64 c1 = 10.24346, c0 = -11.5751, x = (mfxF64)m_support->logic[ASCcurrent_frame_data]->SC, y = (mfxF64)m_support->logic[ASCcurrent_frame_data]->avgVal; result = ((c1 * std::log(x)) + c0) >= y; return result; } bool ASC::FrameRepeatCheck() { mfxU8 reference = ASCprevious_frame_data; if (m_dataIn->interlaceMode > ASCprogressive_frame) reference = ASCprevious_previous_frame_data; return(CompareStats(ASCcurrent_frame_data, reference)); } bool ASC::DoMCTFFilteringCheck() { return true; } void ASC::DetectShotChangeFrame() { m_support->logic[ASCcurrent_frame_data]->frameNum = m_videoData[ASCCurrent_Frame]->frame_number; m_support->logic[ASCcurrent_frame_data]->firstFrame = m_support->firstFrame; m_support->logic[ASCcurrent_frame_data]->avgVal = m_videoData[ASCCurrent_Frame]->layer.avgval; /*---------RsCs data--------*/ m_support->logic[ASCcurrent_frame_data]->Rs = m_videoData[ASCCurrent_Frame]->layer.RsVal; m_support->logic[ASCcurrent_frame_data]->Cs = m_videoData[ASCCurrent_Frame]->layer.CsVal; m_support->logic[ASCcurrent_frame_data]->SC = m_videoData[ASCCurrent_Frame]->layer.RsVal + m_videoData[ASCCurrent_Frame]->layer.CsVal; m_support->logic[ASCcurrent_frame_data]->doFilter_flag = DoMCTFFilteringCheck(); m_support->logic[ASCcurrent_frame_data]->filterIntra_flag = DenoiseIFrameRec(); if (m_support->firstFrame) { m_support->logic[ASCcurrent_frame_data]->TSC = 0; m_support->logic[ASCcurrent_frame_data]->AFD = 0; m_support->logic[ASCcurrent_frame_data]->TSCindex = 0; m_support->logic[ASCcurrent_frame_data]->SCindex = 0; m_support->logic[ASCcurrent_frame_data]->Schg = 0; m_support->logic[ASCcurrent_frame_data]->Gchg = 0; m_support->logic[ASCcurrent_frame_data]->picType = 0; m_support->logic[ASCcurrent_frame_data]->lastFrameInShot = 0; m_support->logic[ASCcurrent_frame_data]->pdist = 0; m_support->logic[ASCcurrent_frame_data]->MVdiffVal = 0; m_support->logic[ASCcurrent_frame_data]->RsCsDiff = 0; m_support->logic[ASCcurrent_frame_data]->last_shot_distance = 0; m_support->logic[ASCcurrent_frame_data]->tcor = 0; m_support->logic[ASCcurrent_frame_data]->mcTcor = 0; m_support->firstFrame = false; } else { /*--------Motion data-------*/ MotionAnalysis(m_videoData[ASCCurrent_Frame], m_videoData[ASCReference_Frame], &m_support->logic[ASCcurrent_frame_data]->TSC, &m_support->logic[ASCcurrent_frame_data]->AFD, &m_support->logic[ASCcurrent_frame_data]->MVdiffVal, &m_support->logic[ASCcurrent_frame_data]->AbsMVSize, &m_support->logic[ASCcurrent_frame_data]->AbsMVHSize, &m_support->logic[ASCcurrent_frame_data]->AbsMVVSize, (ASCLayers)0); m_support->logic[ASCcurrent_frame_data]->TSCindex = TableLookUp(NumTSC, lmt_tsc2, m_support->logic[ASCcurrent_frame_data]->TSC); m_support->logic[ASCcurrent_frame_data]->SCindex = TableLookUp(NumSC, lmt_sc2, m_support->logic[ASCcurrent_frame_data]->SC); m_support->logic[ASCcurrent_frame_data]->pdist = m_support->PDistanceTable[(m_support->logic[ASCcurrent_frame_data]->TSCindex * NumSC) + m_support->logic[ASCcurrent_frame_data]->SCindex]; m_support->logic[ASCcurrent_frame_data]->TSC >>= 5; m_support->logic[ASCcurrent_frame_data]->tcor = m_videoData[ASCCurrent_Frame]->layer.tcor; m_support->logic[ASCcurrent_frame_data]->mcTcor = m_videoData[ASCCurrent_Frame]->layer.mcTcor; /*------Shot Detection------*/ m_support->logic[ASCcurrent_frame_data]->Schg = ShotDetect(m_videoData[ASCCurrent_Frame]->layer, m_videoData[ASCReference_Frame]->layer, *m_dataIn->layer, m_support->logic[ASCcurrent_frame_data], m_support->logic[ASCprevious_frame_data], m_support->control); m_support->logic[ASCprevious_frame_data]->lastFrameInShot = (mfxU8)m_support->logic[ASCcurrent_frame_data]->Schg; m_support->logic[ASCcurrent_frame_data]->repeatedFrame = FrameRepeatCheck(); } m_dataIn->processed_frames++; } /** *********************************************************************** * \Brief Adds LTR friendly frame decision to list * * Adds frame number and ltr friendly frame decision pair to list, but * first checks if the size of the list is same or less to MAXLTRHISTORY, * if the list is longer, then it removes the top elements of the list * until it is MAXLTRHISTORY - 1, then it adds the new pair to the bottom * of the list. * * \return none */ void ASC::Put_LTR_Hint() { mfxI16 list_size = (mfxI16)ltr_check_history.size(); for (mfxI16 i = 0; i < list_size - (MAXLTRHISTORY - 1); i++) ltr_check_history.pop_front(); ltr_check_history.push_back(std::make_pair(m_videoData[ASCCurrent_Frame]->frame_number, m_support->logic[ASCcurrent_frame_data]->ltr_flag)); } /** *********************************************************************** * \Brief Checks LTR friendly decision history per frame and returns if * LTR operation should be turn on or off. * * Travels the LTR friendly decision list backwards checking for frequency * and amount of true/false LTR friendly frame decision, based on the * good and bad limit inputs, if bad limit condition is reached first, * then it inmediately returns 0 (zero) which means to stop LTR operation * * \param goodLTRLimit [IN] - Amount of true values to determine * if the sequence should run in LTR mode. * \param badLTRLimit [IN] - Amount of consecutive false values to * stop LTR mode. * * \return ASC_LTR_DEC to flag stop(false)/continue(true) or FORCE LTR operation */ ASC_LTR_DEC ASC::Continue_LTR_Mode(mfxU16 goodLTRLimit, mfxU16 badLTRLimit) { size_t goodLTRCounter = 0, goodLTRRelativeCount = 0, badLTRCounter = 0, list_size = ltr_check_history.size(); std::list >::iterator ltr_list_it = std::prev(ltr_check_history.end()); goodLTRLimit = goodLTRLimit > MAXLTRHISTORY ? MAXLTRHISTORY : goodLTRLimit; //When a scene change happens, all history is discarded if (Get_frame_shot_Decision()) { ltr_check_history.resize(0); list_size = 0; } //If not enough history then let it be LTR if (list_size < badLTRLimit) return YES_LTR; //Travel trhough the list to determine if LTR operation should be kept on mfxU16 bkp_size = (mfxU16)list_size; while ((bkp_size > 1) && (goodLTRCounter < goodLTRLimit)) { auto scd = ltr_list_it->second; if (!scd) { badLTRCounter++; goodLTRRelativeCount = 0; } if (badLTRCounter >= badLTRLimit) return NO_LTR; goodLTRCounter += (mfxU16)ltr_list_it->second; goodLTRRelativeCount += (mfxU16)ltr_list_it->second; if (goodLTRRelativeCount >= badLTRLimit) badLTRCounter = 0; ltr_list_it = std::prev(ltr_list_it); bkp_size--; } if (goodLTRCounter >= goodLTRLimit) return FORCE_LTR; else if (goodLTRRelativeCount >= (size_t)NMIN(badLTRLimit, list_size - 1) && badLTRCounter < goodLTRRelativeCount) return YES_LTR; else return NO_LTR; } void ASC::AscFrameAnalysis() { mfxU8 *ss = m_videoData[ASCCurrent_Frame]->layer.Image.Y; mfxU32 sumAll = 0; #if __INTEL_COMPILER #pragma unroll #endif for (mfxU16 i = 0; i < m_dataIn->layer->_cheight; i++) { #if __INTEL_COMPILER #pragma unroll #endif for (mfxU16 j = 0; j < m_dataIn->layer->_cwidth; j++) sumAll += ss[j]; ss += m_dataIn->layer->Extended_Width; } sumAll >>= 13; m_videoData[ASCCurrent_Frame]->layer.avgval = (mfxU16)sumAll; RsCsCalc(); DetectShotChangeFrame(); Put_LTR_Hint(); GeneralBufferRotation(); } mfxStatus ASC::calc_RaCa_pic(mfxU8 *pSrc, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; return Calc_RaCa_pic(pSrc, width, height, pitch, RsCs); } bool ASC::Get_Last_frame_Data() { if(m_dataReady) GeneralBufferRotation(); else ASC_PRINTF("Warning: Trying to grab data not ready\n"); return(m_dataReady); } mfxU16 ASC::Get_asc_subsampling_width() { return mfxU16(subWidth); } mfxU16 ASC::Get_asc_subsampling_height() { return mfxU16(subHeight); } mfxU32 ASC::Get_starting_frame_number() { return m_dataIn->starting_frame; } mfxU32 ASC::Get_frame_number() { if(m_dataReady) return m_support->logic[ASCprevious_frame_data]->frameNum; else return 0; } mfxU32 ASC::Get_frame_shot_Decision() { if(m_dataReady) return m_support->logic[ASCprevious_frame_data]->Schg; else return 0; } mfxU32 ASC::Get_frame_last_in_scene() { if(m_dataReady) return m_support->logic[ASCprevious_frame_data]->lastFrameInShot; else return 0; } bool ASC::Get_GoPcorrected_frame_shot_Decision() { if(m_dataReady) return (m_support->detectedSch > 0); else return 0; } mfxI32 ASC::Get_frame_Spatial_complexity() { if(m_dataReady) return m_support->logic[ASCprevious_frame_data]->SCindex; else return 0; } mfxI32 ASC::Get_frame_Temporal_complexity() { if(m_dataReady) return m_support->logic[ASCprevious_frame_data]->TSCindex; else return 0; } bool ASC::Get_intra_frame_denoise_recommendation() { return m_support->logic[ASCprevious_frame_data]->filterIntra_flag; } mfxU32 ASC::Get_PDist_advice() { if (m_dataReady) return m_support->logic[ASCprevious_frame_data]->pdist; else return 0; } bool ASC::Get_LTR_advice() { if (m_dataReady) return m_support->logic[ASCprevious_frame_data]->ltr_flag; else return false; } bool ASC::Get_RepeatedFrame_advice() { if (m_dataReady) return m_support->logic[ASCprevious_frame_data]->repeatedFrame; else return false; } bool ASC::Get_Filter_advice() { return m_support->logic[ASCprevious_frame_data]->doFilter_flag; } /** *********************************************************************** * \Brief Tells if LTR mode should be on/off or forced on. * * \return ASC_LTR_DEC& to flag stop(false)/continue(true) or force (2) * LTR operation */ mfxStatus ASC::get_LTR_op_hint(ASC_LTR_DEC& scd_LTR_hint) { if (!m_ASCinitialized) return MFX_ERR_NOT_INITIALIZED; scd_LTR_hint = Continue_LTR_Mode(50, 5); return MFX_ERR_NONE; } bool ASC::Check_last_frame_processed(mfxU32 frameOrder) { if (m_support->frameOrder <= frameOrder && (m_support->frameOrder == frameOrder && frameOrder > 0)) return 0; else m_support->frameOrder = frameOrder; return 1; } void ASC::Reset_last_frame_processed() { m_support->frameOrder = 0; } mfxI32 ASC::Get_CpuFeature_AVX2() { return CpuFeature_AVX2(); } mfxI32 ASC::Get_CpuFeature_SSE41() { return CpuFeature_SSE41(); } void bufferRotation(void *Buffer1, void *Buffer2) { void *transfer; transfer = Buffer2; Buffer2 = Buffer1; Buffer1 = transfer; } void ASC::GeneralBufferRotation() { ASCVidSample *videoTransfer; ASCTSCstat *metaTransfer; if (m_support->logic[ASCcurrent_frame_data]->repeatedFrame) { m_videoData[ASCReference_Frame]->frame_number = m_videoData[ASCCurrent_Frame]->frame_number; m_support->logic[ASCprevious_frame_data]->frameNum = m_support->logic[ASCcurrent_frame_data]->frameNum; m_support->logic[ASCcurrent_frame_data]->Schg = 0; m_support->logic[ASCprevious_frame_data]->Schg = 0; m_support->logic[ASCprevious_frame_data]->repeatedFrame = true; m_support->logic[ASCprevious_previous_frame_data]->Schg = 0; } else { videoTransfer = m_videoData[0]; m_videoData[0] = m_videoData[1]; m_videoData[1] = videoTransfer; metaTransfer = m_support->logic[ASCprevious_previous_frame_data]; m_support->logic[ASCprevious_previous_frame_data] = m_support->logic[ASCprevious_frame_data]; m_support->logic[ASCprevious_frame_data] = m_support->logic[ASCcurrent_frame_data]; m_support->logic[ASCcurrent_frame_data] = metaTransfer; } } mfxStatus ASC::calc_RaCa_Surf(mfxHDLPair surface, mfxF64& rscs) { (void)surface; (void)rscs; return MFX_ERR_UNDEFINED_BEHAVIOR; } void ASC::VidSample_dispose() { for (mfxI32 i = ASCVIDEOSTATSBUF - 1; i >= 0; i--) { if (m_videoData[i] != nullptr) { m_videoData[i]->layer.Close(); delete (m_videoData[i]); } } free(m_frameBkp); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/asc_avx2_impl.cpp000066400000000000000000000174531443134507600270050ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc_avx2_impl.h" #include #include #if defined(__AVX2__) void ME_SAD_8x8_Block_Search_AVX2( mfxU8 * pSrc, mfxU8 * pRef, int pitch, int xrange, int yrange, mfxU16 * bestSAD, int * bestX, int * bestY ) { __m256i s0 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0 * pitch]), (__m128i *)&pSrc[1 * pitch])), s1 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2 * pitch]), (__m128i *)&pSrc[3 * pitch])), s2 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4 * pitch]), (__m128i *)&pSrc[5 * pitch])), s3 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6 * pitch]), (__m128i *)&pSrc[7 * pitch])); for (int y = 0; y < yrange; y += SAD_SEARCH_VSTEP) { for (int x = 0; x < xrange; x += 8) { pmfxU8 pr = pRef + (y * pitch) + x; __m256i r0 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[0 * pitch])), r1 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[1 * pitch])), r2 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[2 * pitch])), r3 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[3 * pitch])), r4 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[4 * pitch])), r5 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[5 * pitch])), r6 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[6 * pitch])), r7 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[7 * pitch])); r0 = _mm256_mpsadbw_epu8(r0, s0, 0x28); r1 = _mm256_mpsadbw_epu8(r1, s0, 0x3a); r2 = _mm256_mpsadbw_epu8(r2, s1, 0x28); r3 = _mm256_mpsadbw_epu8(r3, s1, 0x3a); r4 = _mm256_mpsadbw_epu8(r4, s2, 0x28); r5 = _mm256_mpsadbw_epu8(r5, s2, 0x3a); r6 = _mm256_mpsadbw_epu8(r6, s3, 0x28); r7 = _mm256_mpsadbw_epu8(r7, s3, 0x3a); r0 = _mm256_add_epi16(r0, r1); r2 = _mm256_add_epi16(r2, r3); r4 = _mm256_add_epi16(r4, r5); r6 = _mm256_add_epi16(r6, r7); r0 = _mm256_add_epi16(r0, r2); r4 = _mm256_add_epi16(r4, r6); r0 = _mm256_add_epi16(r0, r4); // horizontal sum __m128i t = _mm_add_epi16(_mm256_castsi256_si128(r0), _mm256_extractf128_si256(r0, 1)); // kill every other SAD results, simulating search every two in X dimension t = _mm_or_si128(t, _mm_load_si128((__m128i *)tab_twostep)); // kill out-of-bound values if (xrange - x < 8) t = _mm_or_si128(t, _mm_load_si128((__m128i *)tab_killmask[xrange - x])); t = _mm_minpos_epu16(t); mfxU16 SAD = (mfxU16)_mm_extract_epi16(t, 0); if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x + _mm_extract_epi16(t, 1); *bestY = y; } } } } void ME_SAD_8x8_Block_FSearch_AVX2( mfxU8 * pSrc, mfxU8 * pRef, int pitch, int xrange, int yrange, mfxU32 * bestSAD, int * bestX, int * bestY ) { __m256i s0 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0 * pitch]), (__m128i *)&pSrc[1 * pitch])), s1 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2 * pitch]), (__m128i *)&pSrc[3 * pitch])), s2 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4 * pitch]), (__m128i *)&pSrc[5 * pitch])), s3 = _mm256_broadcastsi128_si256(_mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6 * pitch]), (__m128i *)&pSrc[7 * pitch])); for (int y = 0; y < yrange; y++) { for (int x = 0; x < xrange; x += 8) { pmfxU8 pr = pRef + (y * pitch) + x; __m256i r0 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[0 * pitch])), r1 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[1 * pitch])), r2 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[2 * pitch])), r3 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[3 * pitch])), r4 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[4 * pitch])), r5 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[5 * pitch])), r6 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[6 * pitch])), r7 = _mm256_broadcastsi128_si256(_mm_loadu_si128((__m128i *)&pr[7 * pitch])); r0 = _mm256_mpsadbw_epu8(r0, s0, 0x28); r1 = _mm256_mpsadbw_epu8(r1, s0, 0x3a); r2 = _mm256_mpsadbw_epu8(r2, s1, 0x28); r3 = _mm256_mpsadbw_epu8(r3, s1, 0x3a); r4 = _mm256_mpsadbw_epu8(r4, s2, 0x28); r5 = _mm256_mpsadbw_epu8(r5, s2, 0x3a); r6 = _mm256_mpsadbw_epu8(r6, s3, 0x28); r7 = _mm256_mpsadbw_epu8(r7, s3, 0x3a); r0 = _mm256_add_epi16(r0, r1); r2 = _mm256_add_epi16(r2, r3); r4 = _mm256_add_epi16(r4, r5); r6 = _mm256_add_epi16(r6, r7); r0 = _mm256_add_epi16(r0, r2); r4 = _mm256_add_epi16(r4, r6); r0 = _mm256_add_epi16(r0, r4); // horizontal sum __m128i t = _mm_add_epi16(_mm256_castsi256_si128(r0), _mm256_extractf128_si256(r0, 1)); // kill out-of-bound values if (xrange - x < 8) t = _mm_or_si128(t, _mm_load_si128((__m128i *)tab_killmask[xrange - x])); t = _mm_minpos_epu16(t); mfxU32 SAD = _mm_extract_epi16(t, 0); if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x + _mm_extract_epi16(t, 1); *bestY = y; } } } } mfxI16 AvgLumaCalc_AVX2(pmfxU32 pAvgLineVal, int len) { __m256i acc = _mm256_setzero_si256(); __m128i shiftVal = _mm_setr_epi32(9, 0, 0, 0); mfxI16 avgVal = 0; for (int i = 0; i < len - 7; i += 8) { acc = _mm256_add_epi32(_mm256_loadu_si256((__m256i*)&pAvgLineVal[i]), acc); } acc = _mm256_hadd_epi32(acc, acc); acc = _mm256_hadd_epi32(acc, acc); __m128i tmp = _mm_add_epi32(_mm256_extracti128_si256(acc, 0), _mm256_extracti128_si256(acc, 1)); tmp = _mm_sra_epi32(tmp, shiftVal); avgVal = (mfxI16)_mm_extract_epi32(tmp, 0); return avgVal; } #endif //defined(__AVX2__) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/asc_c_impl.cpp000066400000000000000000000163411443134507600263420ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc_c_impl.h" #include using std::min; using std::max; void ME_SAD_8x8_Block_Search_C(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU16 *bestSAD, int *bestX, int *bestY) { for (int y = 0; y < yrange; y += SAD_SEARCH_VSTEP) { for (int x = 0; x < xrange; x += SAD_SEARCH_VSTEP) {/*x++) {*/ pmfxU8 pr = pRef + (y * pitch) + x, ps = pSrc; mfxU16 SAD = 0; for (int i = 0; i < 8; i++) { SAD += (mfxU16)abs(pr[0] - ps[0]); SAD += (mfxU16)abs(pr[1] - ps[1]); SAD += (mfxU16)abs(pr[2] - ps[2]); SAD += (mfxU16)abs(pr[3] - ps[3]); SAD += (mfxU16)abs(pr[4] - ps[4]); SAD += (mfxU16)abs(pr[5] - ps[5]); SAD += (mfxU16)abs(pr[6] - ps[6]); SAD += (mfxU16)abs(pr[7] - ps[7]); pr += pitch; ps += pitch; } if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x; *bestY = y; } } } } void ME_SAD_8x8_Block_FSearch_C(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU32 *bestSAD, int *bestX, int *bestY) { for (int y = 0; y < yrange; y++) { for (int x = 0; x < xrange; x++) { pmfxU8 pr = pRef + (y * pitch) + x, ps = pSrc; mfxU32 SAD = 0; for (int i = 0; i < 8; i++) { SAD += abs(pr[0] - ps[0]); SAD += abs(pr[1] - ps[1]); SAD += abs(pr[2] - ps[2]); SAD += abs(pr[3] - ps[3]); SAD += abs(pr[4] - ps[4]); SAD += abs(pr[5] - ps[5]); SAD += abs(pr[6] - ps[6]); SAD += abs(pr[7] - ps[7]); pr += pitch; ps += pitch; } if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x; *bestY = y; } } } } void RsCsCalc_4x4_C(pmfxU8 pSrc, int srcPitch, int wblocks, int hblocks, pmfxU16 pRs, pmfxU16 pCs) { pSrc += (4 * srcPitch) + 4; for (mfxI16 i = 0; i < hblocks - 2; i++) { for (mfxI16 j = 0; j < wblocks - 2; j++) { mfxU16 accRs = 0; mfxU16 accCs = 0; for (mfxI32 k = 0; k < 4; k++) { for (mfxI32 l = 0; l < 4; l++) { mfxU16 dRs = (mfxU16)abs(pSrc[l] - pSrc[l - srcPitch]) >> 2; mfxU16 dCs = (mfxU16)abs(pSrc[l] - pSrc[l - 1]) >> 2; accRs += (mfxU16)(dRs * dRs); accCs += (mfxU16)(dCs * dCs); } pSrc += srcPitch; } pRs[i * wblocks + j] = accRs; pCs[i * wblocks + j] = accCs; pSrc -= 4 * srcPitch; pSrc += 4; } pSrc -= 4 * (wblocks - 2); pSrc += 4 * srcPitch; } } void RsCsCalc_bound_C(pmfxU16 pRs, pmfxU16 pCs, pmfxU16 pRsCs, pmfxU32 pRsFrame, pmfxU32 pCsFrame, int wblocks, int hblocks) { mfxI32 len = wblocks * hblocks; mfxU16 accRs = 0; mfxU16 accCs = 0; //ASC_PRINTF("\n"); for (mfxI32 i = 0; i < len; i++) { // ASC_PRINTF("%i\t", pRs[i]); accRs += pRs[i] >> 7; accCs += pCs[i] >> 7; pRsCs[i] = (pRs[i] + pCs[i]) >> 1; } //ASC_PRINTF("\n"); *pRsFrame = accRs; *pCsFrame = accCs; } void RsCsCalc_diff_C(pmfxU16 pRs0, pmfxU16 pCs0, pmfxU16 pRs1, pmfxU16 pCs1, int wblocks, int hblocks, pmfxU32 pRsDiff, pmfxU32 pCsDiff) { mfxU32 len = wblocks * hblocks; mfxU16 accRs = 0; mfxU16 accCs = 0; for (mfxU32 i = 0; i < len; i++) { accRs += (mfxU16)abs((pRs0[i] >> 5) - (pRs1[i] >> 5)); accCs += (mfxU16)abs((pCs0[i] >> 5) - (pCs1[i] >> 5)); } *pRsDiff = accRs; *pCsDiff = accCs; } void ImageDiffHistogram_C(pmfxU8 pSrc, pmfxU8 pRef, mfxU32 pitch, mfxU32 width, mfxU32 height, mfxI32 histogram[5], mfxI64 *pSrcDC, mfxI64 *pRefDC) { mfxI64 srcDC = 0; mfxI64 refDC = 0; histogram[0] = 0; histogram[1] = 0; histogram[2] = 0; histogram[3] = 0; histogram[4] = 0; for (mfxU32 i = 0; i < height; i++) { for (mfxU32 j = 0; j < width; j++) { int s = pSrc[j]; int r = pRef[j]; int d = s - r; srcDC += s; refDC += r; if (d < -HIST_THRESH_HI) histogram[0]++; else if (d < -HIST_THRESH_LO) histogram[1]++; else if (d < HIST_THRESH_LO) histogram[2]++; else if (d < HIST_THRESH_HI) histogram[3]++; else histogram[4]++; } pSrc += pitch; pRef += pitch; } *pSrcDC = srcDC; *pRefDC = refDC; } void GainOffset_C(pmfxU8 *pSrc, pmfxU8 *pDst, mfxU16 width, mfxU16 height, mfxU16 pitch, mfxI16 gainDiff) { pmfxU8 ss = *pSrc, dd = *pDst; for (mfxU16 i = 0; i < height; i++) { for (mfxU16 j = 0; j < width; j++) { mfxI16 val = ss[j + i * pitch] - gainDiff; dd[j + i * pitch] = (mfxU8)min(max(val, mfxI16(0)), mfxI16(255)); } } *pSrc = *pDst; } mfxStatus Calc_RaCa_pic_C(mfxU8 *pPicY, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs) { mfxI32 i, j; mfxI32 Rs, Cs; Rs = Cs = 0; for (i = 4; i < (height - 4); i += 4) { for (j = 4; j < (width - 4); j += 4) { calc_RACA_4x4_C(pPicY + i * pitch + j, pitch, &Rs, &Cs); } } mfxI32 w4 = (width - 8) >> 2; mfxI32 h4 = (height - 8) >> 2; mfxF64 d1 = 1.0 / (mfxF64)(w4*h4); mfxF64 drs = (mfxF64)Rs * d1; mfxF64 dcs = (mfxF64)Cs * d1; RsCs = sqrt(drs * drs + dcs * dcs); return MFX_ERR_NONE; } mfxI16 AvgLumaCalc_C(pmfxU32 pAvgLineVal, int len) { mfxU32 acc = 0; mfxI16 avgVal = 0; for (int i = 0; i < len; i++) acc += pAvgLineVal[i]; avgVal = (mfxI16)(acc >> 9); return avgVal; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/asc_sse4_impl.cpp000066400000000000000000000476121443134507600270030ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc_sse4_impl.h" #include void ME_SAD_8x8_Block_Search_SSE4(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU16 *bestSAD, int *bestX, int *bestY) { __m128i s0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0 * pitch]), (__m128i *)&pSrc[1 * pitch]), s1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2 * pitch]), (__m128i *)&pSrc[3 * pitch]), s2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4 * pitch]), (__m128i *)&pSrc[5 * pitch]), s3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6 * pitch]), (__m128i *)&pSrc[7 * pitch]); for (int y = 0; y < yrange; y += SAD_SEARCH_VSTEP) { for (int x = 0; x < xrange; x += 8) { pmfxU8 pr = pRef + (y * pitch) + x; __m128i r0 = _mm_loadu_si128((__m128i *)&pr[0 * pitch]), r1 = _mm_loadu_si128((__m128i *)&pr[1 * pitch]), r2 = _mm_loadu_si128((__m128i *)&pr[2 * pitch]), r3 = _mm_loadu_si128((__m128i *)&pr[3 * pitch]), r4 = _mm_loadu_si128((__m128i *)&pr[4 * pitch]), r5 = _mm_loadu_si128((__m128i *)&pr[5 * pitch]), r6 = _mm_loadu_si128((__m128i *)&pr[6 * pitch]), r7 = _mm_loadu_si128((__m128i *)&pr[7 * pitch]); r0 = _mm_add_epi16(_mm_mpsadbw_epu8(r0, s0, 0), _mm_mpsadbw_epu8(r0, s0, 5)); r1 = _mm_add_epi16(_mm_mpsadbw_epu8(r1, s0, 2), _mm_mpsadbw_epu8(r1, s0, 7)); r2 = _mm_add_epi16(_mm_mpsadbw_epu8(r2, s1, 0), _mm_mpsadbw_epu8(r2, s1, 5)); r3 = _mm_add_epi16(_mm_mpsadbw_epu8(r3, s1, 2), _mm_mpsadbw_epu8(r3, s1, 7)); r4 = _mm_add_epi16(_mm_mpsadbw_epu8(r4, s2, 0), _mm_mpsadbw_epu8(r4, s2, 5)); r5 = _mm_add_epi16(_mm_mpsadbw_epu8(r5, s2, 2), _mm_mpsadbw_epu8(r5, s2, 7)); r6 = _mm_add_epi16(_mm_mpsadbw_epu8(r6, s3, 0), _mm_mpsadbw_epu8(r6, s3, 5)); r7 = _mm_add_epi16(_mm_mpsadbw_epu8(r7, s3, 2), _mm_mpsadbw_epu8(r7, s3, 7)); r0 = _mm_add_epi16(r0, r1); r2 = _mm_add_epi16(r2, r3); r4 = _mm_add_epi16(r4, r5); r6 = _mm_add_epi16(r6, r7); r0 = _mm_add_epi16(r0, r2); r4 = _mm_add_epi16(r4, r6); r0 = _mm_add_epi16(r0, r4); // kill every other SAD results, simulating search every two in X dimension r0 = _mm_or_si128(r0, _mm_load_si128((__m128i *)tab_twostep)); // kill out-of-bound values if (xrange - x < 8) r0 = _mm_or_si128(r0, _mm_load_si128((__m128i *)tab_killmask[xrange - x])); r0 = _mm_minpos_epu16(r0); mfxU16 SAD = (mfxU16)_mm_extract_epi16(r0, 0); if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x + _mm_extract_epi16(r0, 1); *bestY = y; } } } } void ME_SAD_8x8_Block_FSearch_SSE4(mfxU8 *pSrc, mfxU8 *pRef, int pitch, int xrange, int yrange, mfxU32 *bestSAD, int *bestX, int *bestY) { __m128i s0 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[0 * pitch]), (__m128i *)&pSrc[1 * pitch]), s1 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[2 * pitch]), (__m128i *)&pSrc[3 * pitch]), s2 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[4 * pitch]), (__m128i *)&pSrc[5 * pitch]), s3 = _mm_loadh_epi64(_mm_loadl_epi64((__m128i *)&pSrc[6 * pitch]), (__m128i *)&pSrc[7 * pitch]); for (int y = 0; y < yrange; y++) { for (int x = 0; x < xrange; x += 8) { pmfxU8 pr = pRef + (y * pitch) + x; __m128i r0 = _mm_loadu_si128((__m128i *)&pr[0 * pitch]), r1 = _mm_loadu_si128((__m128i *)&pr[1 * pitch]), r2 = _mm_loadu_si128((__m128i *)&pr[2 * pitch]), r3 = _mm_loadu_si128((__m128i *)&pr[3 * pitch]), r4 = _mm_loadu_si128((__m128i *)&pr[4 * pitch]), r5 = _mm_loadu_si128((__m128i *)&pr[5 * pitch]), r6 = _mm_loadu_si128((__m128i *)&pr[6 * pitch]), r7 = _mm_loadu_si128((__m128i *)&pr[7 * pitch]); r0 = _mm_add_epi16(_mm_mpsadbw_epu8(r0, s0, 0), _mm_mpsadbw_epu8(r0, s0, 5)); r1 = _mm_add_epi16(_mm_mpsadbw_epu8(r1, s0, 2), _mm_mpsadbw_epu8(r1, s0, 7)); r2 = _mm_add_epi16(_mm_mpsadbw_epu8(r2, s1, 0), _mm_mpsadbw_epu8(r2, s1, 5)); r3 = _mm_add_epi16(_mm_mpsadbw_epu8(r3, s1, 2), _mm_mpsadbw_epu8(r3, s1, 7)); r4 = _mm_add_epi16(_mm_mpsadbw_epu8(r4, s2, 0), _mm_mpsadbw_epu8(r4, s2, 5)); r5 = _mm_add_epi16(_mm_mpsadbw_epu8(r5, s2, 2), _mm_mpsadbw_epu8(r5, s2, 7)); r6 = _mm_add_epi16(_mm_mpsadbw_epu8(r6, s3, 0), _mm_mpsadbw_epu8(r6, s3, 5)); r7 = _mm_add_epi16(_mm_mpsadbw_epu8(r7, s3, 2), _mm_mpsadbw_epu8(r7, s3, 7)); r0 = _mm_add_epi16(r0, r1); r2 = _mm_add_epi16(r2, r3); r4 = _mm_add_epi16(r4, r5); r6 = _mm_add_epi16(r6, r7); r0 = _mm_add_epi16(r0, r2); r4 = _mm_add_epi16(r4, r6); r0 = _mm_add_epi16(r0, r4); // kill out-of-bound values if (xrange - x < 8) r0 = _mm_or_si128(r0, _mm_load_si128((__m128i *)tab_killmask[xrange - x])); r0 = _mm_minpos_epu16(r0); mfxU32 SAD = _mm_extract_epi16(r0, 0); if (SAD < *bestSAD) { *bestSAD = SAD; *bestX = x + _mm_extract_epi16(r0, 1); *bestY = y; } } } } void RsCsCalc_4x4_SSE4(pmfxU8 pSrc, int srcPitch, int wblocks, int hblocks, pmfxU16 pRs, pmfxU16 pCs) { pSrc += (4 * srcPitch) + 4; for (mfxI16 i = 0; i < hblocks - 2; i++) { // 4 horizontal blocks at a time mfxI16 j; for (j = 0; j < wblocks - 5; j += 4) { __m128i rs0 = _mm_setzero_si128(); __m128i cs0 = _mm_setzero_si128(); __m128i rs1 = _mm_setzero_si128(); __m128i cs1 = _mm_setzero_si128(); __m128i a0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-srcPitch + 0])); __m128i a1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-srcPitch + 8])); #ifdef __INTEL_COMPILER #pragma unroll(4) #endif for (mfxI32 k = 0; k < 4; k++) { __m128i b0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-1])); __m128i b1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[7])); __m128i c0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[0])); __m128i c1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[8])); pSrc += srcPitch; // accRs += dRs * dRs a0 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c0, a0)), 2); a1 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c1, a1)), 2); a0 = _mm_madd_epi16(a0, a0); a1 = _mm_madd_epi16(a1, a1); rs0 = _mm_add_epi32(rs0, a0); rs1 = _mm_add_epi32(rs1, a1); // accCs += dCs * dCs b0 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c0, b0)), 2); b1 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c1, b1)), 2); b0 = _mm_madd_epi16(b0, b0); b1 = _mm_madd_epi16(b1, b1); cs0 = _mm_add_epi32(cs0, b0); cs1 = _mm_add_epi32(cs1, b1); // reuse next iteration a0 = c0; a1 = c1; } rs0 = _mm_hadd_epi32(rs0, rs1); cs0 = _mm_hadd_epi32(cs0, cs1); // store rs0 = _mm_packus_epi32(rs0, cs0); #ifdef ARCH64 pmfxU64 t = (pmfxU64)&(pRs[i * wblocks + j]); *t = _mm_extract_epi64(rs0, 0); t = (pmfxU64)&(pCs[i * wblocks + j]); *t = _mm_extract_epi64(rs0, 1); #else pmfxU32 t = (pmfxU32)&(pRs[i * wblocks + j]); *t = _mm_extract_epi32(rs0, 0); t = (pmfxU32)&(pRs[i * wblocks + j + 2]); *t = _mm_extract_epi32(rs0, 1); t = (pmfxU32)&(pCs[i * wblocks + j]); *t = _mm_extract_epi32(rs0, 2); t = (pmfxU32)&(pCs[i * wblocks + j + 2]); *t = _mm_extract_epi32(rs0, 3); #endif pSrc -= 4 * srcPitch; pSrc += 16; } //2 horizontal blocks for (; j < wblocks - 3; j += 2) { __m128i rs0 = _mm_setzero_si128(); __m128i cs0 = _mm_setzero_si128(); __m128i rs1 = _mm_setzero_si128(); __m128i cs1 = _mm_setzero_si128(); __m128i a0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-srcPitch + 0])); __m128i a1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-srcPitch + 8])); #ifdef __INTEL_COMPILER #pragma unroll(4) #endif for (mfxI32 k = 0; k < 4; k++) { __m128i b0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[-1])); __m128i b1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[7])); __m128i c0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[0])); __m128i c1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pSrc[8])); pSrc += srcPitch; // accRs += dRs * dRs a0 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c0, a0)), 2); a1 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c1, a1)), 2); a0 = _mm_madd_epi16(a0, a0); a1 = _mm_madd_epi16(a1, a1); rs0 = _mm_add_epi32(rs0, a0); rs1 = _mm_add_epi32(rs1, a1); // accCs += dCs * dCs b0 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c0, b0)), 2); b1 = _mm_srai_epi16(_mm_abs_epi16(_mm_sub_epi16(c1, b1)), 2); b0 = _mm_madd_epi16(b0, b0); b1 = _mm_madd_epi16(b1, b1); cs0 = _mm_add_epi32(cs0, b0); cs1 = _mm_add_epi32(cs1, b1); // reuse next iteration a0 = c0; a1 = c1; } rs0 = _mm_hadd_epi32(rs0, rs1); cs0 = _mm_hadd_epi32(cs0, cs1); // store rs0 = _mm_packus_epi32(rs0, cs0); pmfxU32 t = (pmfxU32)&(pRs[i * wblocks + j]); *t = _mm_extract_epi32(rs0, 0); t = (pmfxU32)&(pCs[i * wblocks + j]); *t = _mm_extract_epi32(rs0, 2); pSrc -= 4 * srcPitch; pSrc += 8; } // remaining blocks for (; j < wblocks - 2; j++) { mfxU16 accRs = 0; mfxU16 accCs = 0; for (mfxU16 k = 0; k < 4; k++) { for (mfxI16 l = 0; l < 4; l++) { mfxU16 dRs = (mfxU16)abs(pSrc[l] - pSrc[l - srcPitch]) >> 2; mfxU16 dCs = (mfxU16)abs(pSrc[l] - pSrc[l - 1]) >> 2; accRs += dRs * dRs; accCs += dCs * dCs; } pSrc += srcPitch; } pRs[i * wblocks + j] = accRs; pCs[i * wblocks + j] = accCs; pSrc -= 4 * srcPitch; pSrc += 4; } pSrc -= 4 * (wblocks - 2); pSrc += 4 * srcPitch; } } void ImageDiffHistogram_SSE4(pmfxU8 pSrc, pmfxU8 pRef, mfxU32 pitch, mfxU32 width, mfxU32 height, mfxI32 histogram[5], mfxI64 *pSrcDC, mfxI64 *pRefDC) { __m128i sDC = _mm_setzero_si128(); __m128i rDC = _mm_setzero_si128(); __m128i h0 = _mm_setzero_si128(); __m128i h1 = _mm_setzero_si128(); __m128i h2 = _mm_setzero_si128(); __m128i h3 = _mm_setzero_si128(); __m128i zero = _mm_setzero_si128(); for (mfxU32 i = 0; i < height; i++) { // process 16 pixels per iteration mfxU32 j; for (j = 0; j < width - 15; j += 16) { __m128i s = _mm_loadu_si128((__m128i *)(&pSrc[j])); __m128i r = _mm_loadu_si128((__m128i *)(&pRef[j])); sDC = _mm_add_epi64(sDC, _mm_sad_epu8(s, zero)); //accumulate horizontal sums rDC = _mm_add_epi64(rDC, _mm_sad_epu8(r, zero)); r = _mm_sub_epi8(r, _mm_set1_epi8(-128)); // convert to signed s = _mm_sub_epi8(s, _mm_set1_epi8(-128)); __m128i dn = _mm_subs_epi8(r, s); // -d saturated to [-128,127] __m128i dp = _mm_subs_epi8(s, r); // +d saturated to [-128,127] __m128i m0 = _mm_cmpgt_epi8(dn, _mm_set1_epi8(HIST_THRESH_HI)); // d < -12 __m128i m1 = _mm_cmpgt_epi8(dn, _mm_set1_epi8(HIST_THRESH_LO)); // d < -4 __m128i m2 = _mm_cmpgt_epi8(_mm_set1_epi8(HIST_THRESH_LO), dp); // d < +4 __m128i m3 = _mm_cmpgt_epi8(_mm_set1_epi8(HIST_THRESH_HI), dp); // d < +12 m0 = _mm_sub_epi8(zero, m0); // negate masks from 0xff to 1 m1 = _mm_sub_epi8(zero, m1); m2 = _mm_sub_epi8(zero, m2); m3 = _mm_sub_epi8(zero, m3); h0 = _mm_add_epi32(h0, _mm_sad_epu8(m0, zero)); // accumulate horizontal sums h1 = _mm_add_epi32(h1, _mm_sad_epu8(m1, zero)); h2 = _mm_add_epi32(h2, _mm_sad_epu8(m2, zero)); h3 = _mm_add_epi32(h3, _mm_sad_epu8(m3, zero)); } // process remaining 1..15 pixels if (j < width) { __m128i s = LoadPartialXmm<0>(&pSrc[j], width & 0xf); __m128i r = LoadPartialXmm<0>(&pRef[j], width & 0xf); sDC = _mm_add_epi64(sDC, _mm_sad_epu8(s, zero)); //accumulate horizontal sums rDC = _mm_add_epi64(rDC, _mm_sad_epu8(r, zero)); s = LoadPartialXmm<-1>(&pSrc[j], width & 0xf); // ensure unused elements not counted r = _mm_sub_epi8(r, _mm_set1_epi8(-128)); // convert to signed s = _mm_sub_epi8(s, _mm_set1_epi8(-128)); __m128i dn = _mm_subs_epi8(r, s); // -d saturated to [-128,127] __m128i dp = _mm_subs_epi8(s, r); // +d saturated to [-128,127] __m128i m0 = _mm_cmpgt_epi8(dn, _mm_set1_epi8(HIST_THRESH_HI)); // d < -12 __m128i m1 = _mm_cmpgt_epi8(dn, _mm_set1_epi8(HIST_THRESH_LO)); // d < -4 __m128i m2 = _mm_cmpgt_epi8(_mm_set1_epi8(HIST_THRESH_LO), dp); // d < +4 __m128i m3 = _mm_cmpgt_epi8(_mm_set1_epi8(HIST_THRESH_HI), dp); // d < +12 m0 = _mm_sub_epi8(zero, m0); // negate masks from 0xff to 1 m1 = _mm_sub_epi8(zero, m1); m2 = _mm_sub_epi8(zero, m2); m3 = _mm_sub_epi8(zero, m3); h0 = _mm_add_epi32(h0, _mm_sad_epu8(m0, zero)); // accumulate horizontal sums h1 = _mm_add_epi32(h1, _mm_sad_epu8(m1, zero)); h2 = _mm_add_epi32(h2, _mm_sad_epu8(m2, zero)); h3 = _mm_add_epi32(h3, _mm_sad_epu8(m3, zero)); } pSrc += pitch; pRef += pitch; } // finish horizontal sums sDC = _mm_add_epi64(sDC, _mm_movehl_epi64(sDC, sDC)); rDC = _mm_add_epi64(rDC, _mm_movehl_epi64(rDC, rDC)); h0 = _mm_add_epi32(h0, _mm_movehl_epi64(h0, h0)); h1 = _mm_add_epi32(h1, _mm_movehl_epi64(h1, h1)); h2 = _mm_add_epi32(h2, _mm_movehl_epi64(h2, h2)); h3 = _mm_add_epi32(h3, _mm_movehl_epi64(h3, h3)); _mm_storel_epi64((__m128i *)pSrcDC, sDC); _mm_storel_epi64((__m128i *)pRefDC, rDC); histogram[0] = _mm_cvtsi128_si32(h0); histogram[1] = _mm_cvtsi128_si32(h1); histogram[2] = _mm_cvtsi128_si32(h2); histogram[3] = _mm_cvtsi128_si32(h3); histogram[4] = width * height; // undo cumulative counts, by differencing histogram[4] -= histogram[3]; histogram[3] -= histogram[2]; histogram[2] -= histogram[1]; histogram[1] -= histogram[0]; } mfxStatus Calc_RaCa_pic_SSE4(mfxU8 *pSrc, mfxI32 width, mfxI32 height, mfxI32 pitch, mfxF64 &RsCs) { mfxU32 count = 0; mfxU8* pY = pSrc + (4 * pitch) + 4; mfxI32 RS = 0, CS = 0, i; for (i = 0; i < height - 8; i += 4) { // 4 horizontal blocks at a time mfxI32 j; for (j = 0; j < width - 20; j += 16) { __m128i rs = _mm_setzero_si128(); __m128i cs = _mm_setzero_si128(); __m128i c0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[0])); __m128i c1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[8])); #ifdef __INTEL_COMPILER #pragma unroll(4) #endif for (mfxI32 k = 0; k < 4; k++) { __m128i b0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[1])); __m128i b1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[9])); __m128i a0 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[pitch + 0])); __m128i a1 = _mm_cvtepu8_epi16(_mm_loadl_epi64((__m128i *)&pY[pitch + 8])); pY += pitch; // Cs += (pS[j] > pS[j + 1]) ? (pS[j] - pS[j + 1]) : (pS[j + 1] - pS[j]); b0 = _mm_abs_epi16(_mm_sub_epi16(c0, b0)); b1 = _mm_abs_epi16(_mm_sub_epi16(c1, b1)); b0 = _mm_hadd_epi16(b0, b1); cs = _mm_add_epi16(cs, b0); // Rs += (pS[j] > pS2[j]) ? (pS[j] - pS2[j]) : (pS2[j] - pS[j]); c0 = _mm_abs_epi16(_mm_sub_epi16(c0, a0)); c1 = _mm_abs_epi16(_mm_sub_epi16(c1, a1)); c0 = _mm_hadd_epi16(c0, c1); rs = _mm_add_epi16(rs, c0); // reuse next iteration c0 = a0; c1 = a1; } // horizontal sum rs = _mm_hadd_epi16(rs, cs); //Cs >> 4; Rs >> 4; rs = _mm_srai_epi16(rs, 4); //*CS += Cs; *RS += Rs; rs = _mm_hadd_epi16(rs, rs); rs = _mm_hadd_epi16(rs, rs); RS += _mm_extract_epi16(rs, 0); CS += _mm_extract_epi16(rs, 1); pY -= 4 * pitch; pY += 16; count += 4; } // remaining blocks for (; j < width - 8; j += 4) { calc_RACA_4x4_C(pY, pitch, &RS, &CS); pY += 4; count++; } pY -= width - 8; pY += 4 * pitch; } mfxI32 w4 = (width - 8) >> 2; mfxI32 h4 = (height - 8) >> 2; mfxF64 d1 = 1.0 / (mfxF64)(w4*h4); mfxF64 drs = (mfxF64)RS * d1; mfxF64 dcs = (mfxF64)CS * d1; RsCs = sqrt(drs * drs + dcs * dcs); return MFX_ERR_NONE; } mfxI16 AvgLumaCalc_SSE4(pmfxU32 pAvgLineVal, int len) { __m128i acc = _mm_setzero_si128(), shiftVal = _mm_setr_epi32(9, 0, 0, 0); mfxI16 avgVal = 0; for (int i = 0; i < len - 3; i += 4) { acc = _mm_add_epi32(_mm_loadu_si128((__m128i*)&pAvgLineVal[i]), acc); } acc = _mm_hadd_epi32(acc, acc); acc = _mm_hadd_epi32(acc, acc); acc = _mm_sra_epi32(acc, shiftVal); avgVal = (mfxI16)_mm_extract_epi32(acc, 0); return avgVal; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/iofunctions.cpp000066400000000000000000000054661443134507600266170ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "../include/iofunctions.h" #include "asc_structures.h" #include "asc_defs.h" using namespace ns_asc; void TimeStart(ASCTime* timer) { (void)timer; } void TimeStart(ASCTime* timer, int index) { (void)timer; (void)index; } void TimeStop(ASCTime* timer) { (void)timer; } mfxF64 CatchTime(ASCTime *timer, const char* message) { (void)message; mfxF64 timeval = 0.0; timeval = TimeMeasurement(timer->tStart, timer->tStop, timer->tFrequency); ASC_PRINTF("%s %0.3f ms.\n", message, timeval); return timeval; } mfxF64 CatchTime(ASCTime *timer, int index, const char* message) { (void)message; (void)timer; (void)index; return 0.0; } mfxF64 CatchTime(ASCTime *timer, int indexInit, int indexEnd, const char* message) { (void)message; (void)timer; (void)indexInit; (void)indexEnd; return 0.0; } void imageInit(ASCYUV *buffer) { memset(buffer, 0, sizeof(ASCYUV)); } void nullifier(ASCimageData *Buffer) { imageInit(&Buffer->Image); memset(&Buffer->pInteger, 0, sizeof(ASCMVector)); memset(&Buffer->Cs, 0, sizeof(Buffer->Cs)); memset(&Buffer->Rs, 0, sizeof(Buffer->Rs)); memset(&Buffer->RsCs, 0, sizeof(Buffer->RsCs)); memset(&Buffer->SAD, 0, sizeof(Buffer->SAD)); Buffer->CsVal = 0; Buffer->RsVal = 0; } void ImDetails_Init(ASCImDetails *Rdata) { memset(Rdata, 0, sizeof(ASCImDetails)); } mfxStatus ASCTSCstat_Init(ASCTSCstat **logic) { for(int i = 0; i < TSCSTATBUFFER; i++) { try { logic[i] = new ASCTSCstat; } catch (...) { return MFX_ERR_MEMORY_ALLOC; } memset(logic[i],0,sizeof(ASCTSCstat)); } return MFX_ERR_NONE; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/motion_estimation_engine.cpp000066400000000000000000000347741443134507600313510ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "asc_defs.h" #include "motion_estimation_engine.h" #include "me_asc.h" #include "asc_structures.h" #include #include #include #include #include #include namespace ns_asc{ const ASCMVector zero = {0,0}; void MotionRangeDeliveryF(mfxI16 xLoc, mfxI16 yLoc, mfxI16 *limitXleft, mfxI16 *limitXright, mfxI16 *limitYup, mfxI16 *limitYdown, ASCImDetails dataIn) { *limitXleft = (mfxI16)NMAX(-8, -(xLoc * dataIn.block_width) - dataIn.horizontal_pad); *limitXright = (mfxI16)NMIN(7, dataIn.Extended_Width - (((xLoc + 1) * dataIn.block_width) + dataIn.horizontal_pad)); *limitYup = (mfxI16)NMAX(-8, -(yLoc * dataIn.block_height) - dataIn.vertical_pad); *limitYdown = (mfxI16)NMIN(7, dataIn.Extended_Height - (((yLoc + 1) * dataIn.block_width) + dataIn.vertical_pad)); } bool MVcalcSAD(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxU16 SAD = 0; mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y); pmfxU8 fRef = refY + MV.x + (MV.y * dataIn.Extended_Width); if(dataIn.block_width == 4 && dataIn.block_height == 4) SAD = ME_SAD_4x4_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); else if(dataIn.block_width == 8 && dataIn.block_height == 8) SAD = ME_SAD_8x8_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); else if(dataIn.block_width == 16 && dataIn.block_height == 8) SAD = ME_SAD_16x8_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); else if(dataIn.block_width == 8 && dataIn.block_height == 16) SAD = ME_SAD_8x16_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); else if(dataIn.block_width == 16 && dataIn.block_height == 16) SAD = ME_SAD_16x16_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); if((SAD < *bestSAD) ||((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } bool MVcalcSAD4x4(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y); pmfxU8 fRef = refY + MV.x + (MV.y * dataIn.Extended_Width); mfxU16 SAD = ME_SAD_4x4_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); if((SAD < *bestSAD) ||((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } bool MVcalcSAD8x8(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails *dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y), _fPos = MV.x + (MV.y * dataIn->Extended_Width); pmfxU8 fRef = &refY[_fPos]; mfxU16 SAD = ME_SAD_8x8_Block(curY, fRef, dataIn->Extended_Width, dataIn->Extended_Width); if((SAD < *bestSAD) || ((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } void MVcalcVar8x8(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, mfxI16 curAvg, mfxI16 refAvg, mfxI32 &var, mfxI32 &jtvar, mfxI32 &jtMCvar, ASCImDetails *dataIn) { mfxI32 _fPos = MV.x + (MV.y * dataIn->Extended_Width); pmfxU8 fRef = &refY[_fPos]; ME_VAR_8x8_Block(curY, refY, fRef, curAvg, refAvg, dataIn->Extended_Width, dataIn->Extended_Width, var, jtvar, jtMCvar); } bool MVcalcSAD16x8(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y); pmfxU8 fRef = refY + MV.x + (MV.y * dataIn.Extended_Width); mfxU16 SAD = ME_SAD_16x8_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); if((SAD < *bestSAD) || ((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } bool MVcalcSAD8x16(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y); pmfxU8 fRef = refY + MV.x + (MV.y * dataIn.Extended_Width); mfxU16 SAD = ME_SAD_8x16_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); if((SAD < *bestSAD) || ((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } bool MVcalcSAD16x16(ASCMVector MV, pmfxU8 curY, pmfxU8 refY, ASCImDetails dataIn, mfxU16 *bestSAD, mfxI32 *distance) { mfxI32 preDist = (MV.x * MV.x) + (MV.y * MV.y); pmfxU8 fRef = refY + MV.x + (MV.y * dataIn.Extended_Width); mfxU16 SAD = ME_SAD_16x16_Block(curY, fRef, dataIn.Extended_Width, dataIn.Extended_Width); if((SAD < *bestSAD) || ((SAD == *(bestSAD)) && *distance > preDist)) { *distance = preDist; *(bestSAD) = SAD; return true; } return false; } void SearchLimitsCalcSqr(mfxI16 xLoc, mfxI16 yLoc, mfxI16 *limitXleft, mfxI16 *limitXright, mfxI16 *limitYup, mfxI16 *limitYdown, ASCImDetails *dataIn, mfxI32 range, ASCMVector mv, ASCVidData *limits) { mfxI16 locX = (mfxI16)((xLoc * dataIn->block_width) + dataIn->horizontal_pad + mv.x), locY = (mfxI16)((yLoc * dataIn->block_height) + dataIn->vertical_pad + mv.y); *limitXleft = (mfxI16)NMAX(-locX,-range); *limitXright = (mfxI16)NMIN(dataIn->Extended_Width - ((xLoc + 1) * dataIn->block_width) - dataIn->horizontal_pad - mv.x,range - 1); *limitYup = (mfxI16)NMAX(-locY,-range); *limitYdown = (mfxI16)NMIN(dataIn->Extended_Height - ((yLoc + 1) * dataIn->block_height) - dataIn->vertical_pad - mv.y,range - 1); if(limits->limitRange) { *limitXleft = (mfxI16)NMAX(*limitXleft,-limits->maxXrange); *limitXright = (mfxI16)NMIN(*limitXright,limits->maxXrange); *limitYup = (mfxI16)NMAX(*limitYup,-limits->maxYrange); *limitYdown = (mfxI16)NMIN(*limitYdown,limits->maxYrange); } } void SearchLimitsCalc(mfxI16 xLoc, mfxI16 yLoc, mfxI16 *limitXleft, mfxI16 *limitXright, mfxI16 *limitYup, mfxI16 *limitYdown, ASCImDetails *dataIn, mfxI32 range, ASCMVector mv, ASCVidData *limits) { mfxI16 locX = (mfxI16)((xLoc * dataIn->block_width) + dataIn->horizontal_pad + mv.x), locY = (mfxI16)((yLoc * dataIn->block_height) + dataIn->vertical_pad + mv.y); *limitXleft = (mfxI16)NMAX(-locX,-range); *limitXright = (mfxI16)NMIN(dataIn->Extended_Width - ((xLoc + 1) * dataIn->block_width) - dataIn->horizontal_pad - mv.x,range); *limitYup = (mfxI16)NMAX(-locY,-range); *limitYdown = (mfxI16)NMIN(dataIn->Extended_Height - ((yLoc + 1) * dataIn->block_height) - dataIn->vertical_pad - mv.y,range); if(limits->limitRange) { *limitXleft = (mfxI16)NMAX(*limitXleft,-limits->maxXrange); *limitXright = (mfxI16)NMIN(*limitXright,limits->maxXrange); *limitYup = (mfxI16)NMAX(*limitYup,-limits->maxYrange); *limitYdown = (mfxI16)NMIN(*limitYdown,limits->maxYrange); } } mfxF32 Dist(ASCMVector vector) { return (mfxF32)sqrt((double)(vector.x*vector.x) + (double)(vector.y*vector.y)); } mfxI32 DistInt(ASCMVector vector) { return (vector.x*vector.x) + (vector.y*vector.y); } void MVpropagationCheck(mfxI32 xLoc, mfxI32 yLoc, ASCImDetails dataIn, ASCMVector *propagatedMV) { mfxI16 left = (mfxI16)((xLoc * dataIn.block_width) + dataIn.horizontal_pad), right = (mfxI16)(dataIn.Extended_Width - left - dataIn.block_width), up = (mfxI16)((yLoc * dataIn.block_height) + dataIn.vertical_pad), down = (mfxI16)(dataIn.Extended_Height - up - dataIn.block_height); if(propagatedMV->x < 0) { if(left + propagatedMV->x < 0) propagatedMV->x = -left; } else { if(right - propagatedMV->x < 0) propagatedMV->x = right; } if(propagatedMV->y < 0) { if(up + propagatedMV->y < 0) propagatedMV->y = -up; } else { if(down - propagatedMV->y < 0) propagatedMV->y = down; } } #define _mm_loadh_epi64(a, ptr) _mm_castps_si128(_mm_loadh_pi(_mm_castsi128_ps(a), (__m64 *)(ptr))) #define SAD_SEARCH_VSTEP 2 // 1=FS 2=FHS mfxU16 ME_simple(ASCVidRead *videoIn, mfxI32 fPos, ASCImDetails *dataIn, ASCimageData *scale, ASCimageData *scaleRef, bool /*first*/, ASCVidData *limits, t_ME_SAD_8x8_Block_Search ME_SAD_8x8_Block_Search) { ASCMVector tMV, ttMV, *current, predMV = zero, Nmv = zero; mfxU8 *objFrame = NULL, *refFrame = NULL; mfxI16 limitXleft = 0, limitXright = 0, limitYup = 0, limitYdown = 0, xLoc = ((mfxI16)fPos % (mfxI16)dataIn->Width_in_blocks), yLoc = ((mfxI16)fPos / (mfxI16)dataIn->Width_in_blocks); mfxI32 distance = 0, mainDistance = 0, offset = (yLoc * (mfxI16)dataIn->Extended_Width * (mfxI16)dataIn->block_height) + (xLoc * (mfxI16)dataIn->block_width); mfxU16 *outSAD, zeroSAD = USHRT_MAX, bestSAD = USHRT_MAX; mfxU8 neighbor_count = 0; bool foundBetter = false; objFrame = &scale->Image.Y[offset]; refFrame = &scaleRef->Image.Y[offset]; current = scale->pInteger; outSAD = scale->SAD; outSAD[fPos] = USHRT_MAX; MVcalcSAD8x8(zero, objFrame, refFrame, dataIn, &bestSAD, &distance); current[fPos] = zero; outSAD[fPos] = bestSAD; zeroSAD = bestSAD; mainDistance = distance; if (bestSAD == 0) return bestSAD; if ((fPos > (mfxI32)dataIn->Width_in_blocks) && (xLoc > 0)) { //Top Left neighbor_count++; Nmv.x += current[fPos - dataIn->Width_in_blocks - 1].x; Nmv.y += current[fPos - dataIn->Width_in_blocks - 1].y; } if (fPos > (mfxI32)dataIn->Width_in_blocks) { // Top neighbor_count++; Nmv.x += current[fPos - dataIn->Width_in_blocks].x; Nmv.y += current[fPos - dataIn->Width_in_blocks].y; } if (xLoc > 0) {//Left neighbor_count++; Nmv.x += current[fPos - 1].x; Nmv.y += current[fPos - 1].y; } if (neighbor_count) { Nmv.x /= neighbor_count; Nmv.y /= neighbor_count; if ((Nmv.x + ((xLoc + 1) * MVBLK_SIZE)) > ASC_SMALL_WIDTH) Nmv.x -= (Nmv.x + ((xLoc + 1) * MVBLK_SIZE)) - ASC_SMALL_WIDTH; else if (((xLoc * MVBLK_SIZE) + Nmv.x) < 0) Nmv.x -= ((xLoc * MVBLK_SIZE) + Nmv.x); if ((Nmv.y + ((yLoc + 1) * MVBLK_SIZE)) > ASC_SMALL_HEIGHT) Nmv.y -= (Nmv.y + ((yLoc + 1) * MVBLK_SIZE)) - ASC_SMALL_HEIGHT; else if (((yLoc * MVBLK_SIZE) + Nmv.y) < 0) Nmv.y -= ((yLoc * MVBLK_SIZE) + Nmv.y); distance = mainDistance; if (Nmv.x != zero.x || Nmv.y != zero.y) { foundBetter = MVcalcSAD8x8(Nmv, objFrame, refFrame, dataIn, &bestSAD, &distance); if (foundBetter) { current[fPos] = Nmv; outSAD[fPos] = bestSAD; mainDistance = distance; } } } //Search around the best predictor (zero or Neighbor) SearchLimitsCalcSqr(xLoc, yLoc, &limitXleft, &limitXright, &limitYup, &limitYdown, dataIn, 8, current[fPos], limits);//Checks limits for +-8 ttMV = current[fPos]; bestSAD = outSAD[fPos]; distance = mainDistance; {//Search area in steps of 2 for x and y mfxI32 _fPos = (limitYup + ttMV.y) * dataIn->Extended_Width + limitXleft + ttMV.x; mfxU8 *ps = objFrame, *pr = &refFrame[_fPos]; int xrange = limitXright - limitXleft/* + 1*/, yrange = limitYdown - limitYup/* + 1*/, bX = 0, bY = 0; ME_SAD_8x8_Block_Search(ps, pr, dataIn->Extended_Width, xrange, yrange, &bestSAD, &bX, &bY); if (bestSAD < outSAD[fPos]) { outSAD[fPos] = bestSAD; current[fPos].x = (mfxI16)bX + limitXleft + ttMV.x; current[fPos].y = (mfxI16)bY + limitYup + ttMV.y; mainDistance = DistInt(current[fPos]); } } //Final refinement +-1 search ttMV = current[fPos]; bestSAD = outSAD[fPos]; distance = mainDistance; SearchLimitsCalc(xLoc, yLoc, &limitXleft, &limitXright, &limitYup, &limitYdown, dataIn, 1, ttMV, limits); for (tMV.y = limitYup; tMV.y <= limitYdown; tMV.y++) { for (tMV.x = limitXleft; tMV.x <= limitXright; tMV.x++) { if (tMV.x != 0 || tMV.y != 0) {// don't search on center position predMV.x = tMV.x + ttMV.x; predMV.y = tMV.y + ttMV.y; foundBetter = MVcalcSAD8x8(predMV, objFrame, refFrame, dataIn, &bestSAD, &distance); if (foundBetter) { current[fPos] = predMV; outSAD[fPos] = bestSAD; mainDistance = distance; foundBetter = false; } } } } videoIn->average += (current[fPos].x * current[fPos].x) + (current[fPos].y * current[fPos].y); MVcalcVar8x8(current[fPos], objFrame, refFrame, scale->avgval, scaleRef->avgval, scale->var, scale->jtvar, scale->mcjtvar, dataIn); return(zeroSAD); } };oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/asc/src/tree.cpp000066400000000000000000056202611443134507600252170ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "../include/tree.h" #include "../include/asc_defs.h" bool SCDetect1(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffTSC < 7) { if (MVDiff < 93) { if (diffMVdiffVal < 31) { if (negBalance < 9) { if (gchDC < 133) { if (diffTSC < 1) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (TSCindex < 1) { if (SC < 1376) { if (negBalance < 1) { return 1; } else if (negBalance >= 1) { return 0; } } else if (SC >= 1376) { return 0; } } else if (TSCindex >= 1) { return 0; } } } else if (diffTSC >= 1) { if (ssDCval < 21) { if (Cs < 363) { return 0; } else if (Cs >= 363) { return 1; } } else if (ssDCval >= 21) { return 0; } } } else if (gchDC >= 133) { return 1; } } else if (negBalance >= 9) { if (RsDiff < 111) { if (gchDC < 31) { return 0; } else if (gchDC >= 31) { if (refDCval < 213) { return 0; } else if (refDCval >= 213) { return 1; } } } else if (RsDiff >= 111) { if (SC < 3109) { return 0; } else if (SC >= 3109) { return 1; } } } } else if (diffMVdiffVal >= 31) { if (CsDiff < 23) { if (ssDCval < 35) { if (RsDiff < 6) { if (posBalance < 45) { return 0; } else if (posBalance >= 45) { if (AFD < 10) { return 0; } else if (AFD >= 10) { return 1; } } } else if (RsDiff >= 6) { if (CsDiff < 18) { return 1; } else if (CsDiff >= 18) { return 0; } } } else if (ssDCval >= 35) { return 0; } } else if (CsDiff >= 23) { if (posBalance < 70) { return 0; } else if (posBalance >= 70) { if (TSC < 23) { if (AFD < 19) { return 1; } else if (AFD >= 19) { return 0; } } else if (TSC >= 23) { return 1; } } } } } else if (MVDiff >= 93) { if (diffAFD < 8) { if (diffTSC < 4) { if (diffRsCsdiff < 34) { if (Rs < 68) { if (gchDC < 66) { if (RsCsDiff < 5) { if (gchDC < 2) { return 0; } else if (gchDC >= 2) { if (MVDiff < 375) { return 0; } else if (MVDiff >= 375) { if (posBalance < 58) { if (TSCindex < 6) { return 0; } else if (TSCindex >= 6) { if (refDCval < 227) { return 0; } else if (refDCval >= 227) { return 1; } } } else if (posBalance >= 58) { if (gchDC < 3) { if (Cs < 7) { return 0; } else if (Cs >= 7) { return 1; } } else if (gchDC >= 3) { if (negBalance < 57) { return 0; } else if (negBalance >= 57) { return 1; } } } } } } else if (RsCsDiff >= 5) { if (refDCval < 30) { if (Cs < 50) { return 0; } else if (Cs >= 50) { return 1; } } else if (refDCval >= 30) { if (diffRsCsdiff < -12) { if (TSC < 4) { return 1; } else if (TSC >= 4) { if (AFD < 31) { return 0; } else if (AFD >= 31) { if (gchDC < 14) { return 0; } else if (gchDC >= 14) { if (Cs < 18) { return 0; } else if (Cs >= 18) { return 1; } } } } } else if (diffRsCsdiff >= -12) { return 0; } } } } else if (gchDC >= 66) { if (AFD < 26) { if (refDCval < 201) { if (Cs < 1) { return 1; } else if (Cs >= 1) { if (Rs < 29) { return 0; } else if (Rs >= 29) { return 1; } } } else if (refDCval >= 201) { return 0; } } else if (AFD >= 26) { return 0; } } } else if (Rs >= 68) { if (gchDC < 6) { return 0; } else if (gchDC >= 6) { if (RsCsDiff < 43) { return 0; } else if (RsCsDiff >= 43) { if (AFD < 62) { if (RsDiff < 6) { if (TSC < 7) { if (AFD < 17) { return 0; } else if (AFD >= 17) { return 1; } } else if (TSC >= 7) { if (Rs < 449) { if (diffRsCsdiff < 4) { return 0; } else if (diffRsCsdiff >= 4) { if (negBalance < 80) { if (AFD < 22) { return 0; } else if (AFD >= 22) { return 1; } } else if (negBalance >= 80) { return 0; } } } else if (Rs >= 449) { return 0; } } } else if (RsDiff >= 6) { if (Rs < 716) { if (Rs < 713) { if (AFD < 40) { return 0; } else if (AFD >= 40) { if (SC < 449) { return 1; } else if (SC >= 449) { if (MVDiff < 161) { return 1; } else if (MVDiff >= 161) { return 0; } } } } else if (Rs >= 713) { return 1; } } else if (Rs >= 716) { return 0; } } } else if (AFD >= 62) { if (Rs < 1425) { return 0; } else if (Rs >= 1425) { return 1; } } } } } } else if (diffRsCsdiff >= 34) { if (refDCval < 50) { if (ssDCval < 31) { return 1; } else if (ssDCval >= 31) { if (diffTSC < -5) { if (ssDCval < 36) { return 0; } else if (ssDCval >= 36) { return 1; } } else if (diffTSC >= -5) { if (diffRsCsdiff < 282) { return 0; } else if (diffRsCsdiff >= 282) { return 1; } } } } else if (refDCval >= 50) { if (gchDC < 32) { return 0; } else if (gchDC >= 32) { if (refDCval < 72) { if (Rs < 364) { return 1; } else if (Rs >= 364) { return 0; } } else if (refDCval >= 72) { if (RsCsDiff < 901) { return 0; } else if (RsCsDiff >= 901) { return 1; } } } } } } else if (diffTSC >= 4) { if (MVDiff < 227) { if (TSCindex < 8) { if (refDCval < 42) { return 0; } else if (refDCval >= 42) { return 1; } } else if (TSCindex >= 8) { return 0; } } else if (MVDiff >= 227) { if (refDCval < 31) { if (SC < 441) { if (CsDiff < 1) { return 1; } else if (CsDiff >= 1) { return 0; } } else if (SC >= 441) { return 1; } } else if (refDCval >= 31) { if (AFD < 60) { if (SC < 10) { if (AFD < 7) { return 0; } else if (AFD >= 7) { return 1; } } else if (SC >= 10) { if (ssDCval < 58) { if (Cs < 537) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (Rs < 396) { return 0; } else if (Rs >= 396) { return 1; } } } else if (Cs >= 537) { return 1; } } else if (ssDCval >= 58) { return 0; } } } else if (AFD >= 60) { return 1; } } } } } else if (diffAFD >= 8) { if (ssDCval < 50) { if (Cs < 82) { if (MVDiff < 129) { if (AFD < 13) { return 1; } else if (AFD >= 13) { return 0; } } else if (MVDiff >= 129) { if (posBalance < 23) { if (negBalance < 100) { if (diffAFD < 13) { return 0; } else if (diffAFD >= 13) { return 1; } } else if (negBalance >= 100) { if (RsDiff < 5) { return 1; } else if (RsDiff >= 5) { if (diffMVdiffVal < 344) { return 0; } else if (diffMVdiffVal >= 344) { return 1; } } } } else if (posBalance >= 23) { if (Rs < 82) { return 1; } else if (Rs >= 82) { if (SC < 142) { return 0; } else if (SC >= 142) { return 1; } } } } } else if (Cs >= 82) { if (diffRsCsdiff < 2) { return 0; } else if (diffRsCsdiff >= 2) { if (AFD < 20) { if (diffTSC < 4) { if (SC < 729) { return 0; } else if (SC >= 729) { return 1; } } else if (diffTSC >= 4) { return 1; } } else if (AFD >= 20) { if (gchDC < 12) { if (Cs < 593) { if (CsDiff < 5) { if (ssDCval < 34) { return 1; } else if (ssDCval >= 34) { return 0; } } else if (CsDiff >= 5) { return 1; } } else if (Cs >= 593) { return 0; } } else if (gchDC >= 12) { if (negBalance < 96) { return 1; } else if (negBalance >= 96) { if (RsCsDiff < 43) { return 0; } else if (RsCsDiff >= 43) { if (diffAFD < 10) { return 0; } else if (diffAFD >= 10) { return 1; } } } } } } } } else if (ssDCval >= 50) { if (gchDC < 40) { if (SC < 297) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { if (diffMVdiffVal < 142) { return 0; } else if (diffMVdiffVal >= 142) { return 1; } } } else if (SC >= 297) { if (MVDiff < 621) { if (diffAFD < 18) { return 0; } else if (diffAFD >= 18) { if (Rs < 484) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { return 1; } } else if (Rs >= 484) { return 0; } } } else if (MVDiff >= 621) { if (AFD < 28) { return 1; } else if (AFD >= 28) { return 0; } } } } else if (gchDC >= 40) { if (TSCindex < 9) { return 1; } else if (TSCindex >= 9) { if (diffRsCsdiff < 16) { return 0; } else if (diffRsCsdiff >= 16) { if (TSC < 19) { return 1; } else if (TSC >= 19) { if (MVDiff < 277) { return 0; } else if (MVDiff >= 277) { if (RsCsDiff < 275) { return 0; } else if (RsCsDiff >= 275) { return 1; } } } } } } } } } } else if (diffTSC >= 7) { if (Cs < 2676) { if (diffMVdiffVal < 71) { if (diffTSC < 13) { if (MVDiff < 56) { if (SC < 243) { if (SC < 79) { return 0; } else if (SC >= 79) { return 1; } } else if (SC >= 243) { if (diffTSC < 10) { return 0; } else if (diffTSC >= 10) { if (RsDiff < 26) { return 0; } else if (RsDiff >= 26) { return 1; } } } } else if (MVDiff >= 56) { if (RsCsDiff < 74) { if (diffMVdiffVal < -982) { return 1; } else if (diffMVdiffVal >= -982) { if (gchDC < 6) { if (ssDCval < 90) { if (refDCval < 37) { return 0; } else if (refDCval >= 37) { return 1; } } else if (ssDCval >= 90) { if (AFD < 54) { return 0; } else if (AFD >= 54) { return 1; } } } else if (gchDC >= 6) { if (diffMVdiffVal < 55) { return 0; } else if (diffMVdiffVal >= 55) { if (diffRsCsdiff < 15) { return 0; } else if (diffRsCsdiff >= 15) { return 1; } } } } } else if (RsCsDiff >= 74) { if (ssDCval < 76) { if (diffAFD < 15) { if (gchDC < 2) { return 1; } else if (gchDC >= 2) { if (diffMVdiffVal < -25) { if (diffMVdiffVal < -46) { return 0; } else if (diffMVdiffVal >= -46) { return 1; } } else if (diffMVdiffVal >= -25) { if (refDCval < 34) { return 1; } else if (refDCval >= 34) { return 0; } } } } else if (diffAFD >= 15) { if (AFD < 35) { if (diffMVdiffVal < 51) { if (diffRsCsdiff < 161) { return 0; } else if (diffRsCsdiff >= 161) { return 1; } } else if (diffMVdiffVal >= 51) { if (RsCsDiff < 212) { return 1; } else if (RsCsDiff >= 212) { if (SC < 1860) { return 0; } else if (SC >= 1860) { return 1; } } } } else if (AFD >= 35) { return 1; } } } else if (ssDCval >= 76) { if (RsDiff < 12) { return 0; } else if (RsDiff >= 12) { if (diffAFD < 26) { if (gchDC < 22) { if (gchDC < 18) { if (ssDCval < 134) { return 0; } else if (ssDCval >= 134) { if (SC < 2103) { return 1; } else if (SC >= 2103) { return 0; } } } else if (gchDC >= 18) { return 1; } } else if (gchDC >= 22) { return 0; } } else if (diffAFD >= 26) { return 1; } } } } } } else if (diffTSC >= 13) { if (diffRsCsdiff < 233) { if (TSC < 57) { if (diffRsCsdiff < 67) { if (diffTSC < 31) { if (Cs < 369) { if (refDCval < 24) { return 1; } else if (refDCval >= 24) { if (AFD < 43) { return 0; } else if (AFD >= 43) { if (AFD < 44) { return 1; } else if (AFD >= 44) { return 0; } } } } else if (Cs >= 369) { return 0; } } else if (diffTSC >= 31) { if (MVDiff < 141) { return 1; } else if (MVDiff >= 141) { if (Rs < 162) { return 1; } else if (Rs >= 162) { return 0; } } } } else if (diffRsCsdiff >= 67) { if (Cs < 1173) { if (diffMVdiffVal < 28) { if (Rs < 2120) { if (RsCsDiff < 151) { if (RsDiff < 8) { if (TSC < 20) { return 1; } else if (TSC >= 20) { if (CsDiff < 8) { return 0; } else if (CsDiff >= 8) { return 1; } } } else if (RsDiff >= 8) { if (refDCval < 29) { return 1; } else if (refDCval >= 29) { return 0; } } } else if (RsCsDiff >= 151) { return 1; } } else if (Rs >= 2120) { return 0; } } else if (diffMVdiffVal >= 28) { if (Rs < 3549) { return 0; } else if (Rs >= 3549) { return 1; } } } else if (Cs >= 1173) { return 0; } } } else if (TSC >= 57) { return 1; } } else if (diffRsCsdiff >= 233) { if (gchDC < 46) { if (RsDiff < 21) { if (Scindex < 5) { if (MVDiff < 89) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (MVDiff < 64) { return 1; } else if (MVDiff >= 64) { if (RsDiff < 20) { return 0; } else if (RsDiff >= 20) { return 1; } } } } else if (MVDiff >= 89) { return 1; } } else if (Scindex >= 5) { return 0; } } else if (RsDiff >= 21) { return 1; } } else if (gchDC >= 46) { if (AFD < 54) { if (MVDiff < 41) { return 1; } else if (MVDiff >= 41) { return 0; } } else if (AFD >= 54) { if (MVDiff < 178) { return 1; } else if (MVDiff >= 178) { return 0; } } } } } } else if (diffMVdiffVal >= 71) { if (negBalance < 28) { if (diffRsCsdiff < 157) { if (Rs < 1437) { if (diffAFD < 34) { if (refDCval < 32) { if (diffMVdiffVal < 91) { return 0; } else if (diffMVdiffVal >= 91) { if (diffMVdiffVal < 196) { if (diffTSC < 8) { return 1; } else if (diffTSC >= 8) { if (SC < 140) { return 0; } else if (SC >= 140) { if (AFD < 25) { return 1; } else if (AFD >= 25) { return 0; } } } } else if (diffMVdiffVal >= 196) { return 1; } } } else if (refDCval >= 32) { if (negBalance < 22) { if (TSC < 22) { if (MVDiff < 783) { if (SC < 172) { if (gchDC < 53) { if (posBalance < 112) { return 0; } else if (posBalance >= 112) { return 1; } } else if (gchDC >= 53) { if (Rs < 1) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (Rs >= 1) { return 0; } } } else if (SC >= 172) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { if (Rs < 1184) { if (gchDC < 39) { if (SC < 403) { return 1; } else if (SC >= 403) { if (Cs < 199) { if (Rs < 439) { return 1; } else if (Rs >= 439) { return 0; } } else if (Cs >= 199) { return 0; } } } else if (gchDC >= 39) { if (RsDiff < 3) { return 0; } else if (RsDiff >= 3) { return 1; } } } else if (Rs >= 1184) { return 1; } } } } else if (MVDiff >= 783) { return 1; } } else if (TSC >= 22) { return 0; } } else if (negBalance >= 22) { if (diffRsCsdiff < 23) { if (diffRsCsdiff < 14) { return 0; } else if (diffRsCsdiff >= 14) { if (Rs < 343) { return 1; } else if (Rs >= 343) { return 0; } } } else if (diffRsCsdiff >= 23) { if (Rs < 593) { return 1; } else if (Rs >= 593) { if (TSC < 17) { return 0; } else if (TSC >= 17) { return 1; } } } } } } else if (diffAFD >= 34) { if (TSC < 32) { return 1; } else if (TSC >= 32) { if (ssDCval < 114) { return 0; } else if (ssDCval >= 114) { return 1; } } } } else if (Rs >= 1437) { return 0; } } else if (diffRsCsdiff >= 157) { if (TSC < 20) { return 1; } else if (TSC >= 20) { if (Rs < 2234) { if (posBalance < 125) { if (MVDiff < 521) { if (negBalance < 12) { if (gchDC < 61) { return 0; } else if (gchDC >= 61) { return 1; } } else if (negBalance >= 12) { return 1; } } else if (MVDiff >= 521) { return 0; } } else if (posBalance >= 125) { if (gchDC < 121) { return 0; } else if (gchDC >= 121) { return 1; } } } else if (Rs >= 2234) { if (RsDiff < 29) { if (MVDiff < 107) { return 1; } else if (MVDiff >= 107) { return 0; } } else if (RsDiff >= 29) { return 1; } } } } } else if (negBalance >= 28) { if (ssDCval < 149) { if (diffTSC < 12) { if (ssDCval < 73) { if (gchDC < 8) { if (CsDiff < 7) { return 1; } else if (CsDiff >= 7) { if (diffMVdiffVal < 74) { if (SC < 1269) { return 0; } else if (SC >= 1269) { return 1; } } else if (diffMVdiffVal >= 74) { return 1; } } } else if (gchDC >= 8) { if (diffAFD < 15) { if (ssDCval < 41) { return 1; } else if (ssDCval >= 41) { if (posBalance < 83) { return 0; } else if (posBalance >= 83) { return 1; } } } else if (diffAFD >= 15) { if (diffRsCsdiff < -8) { return 0; } else if (diffRsCsdiff >= -8) { if (diffMVdiffVal < 78) { return 0; } else if (diffMVdiffVal >= 78) { if (ssDCval < 45) { return 1; } else if (ssDCval >= 45) { if (Rs < 2209) { if (negBalance < 41) { if (diffAFD < 27) { return 1; } else if (diffAFD >= 27) { return 0; } } else if (negBalance >= 41) { return 1; } } else if (Rs >= 2209) { return 0; } } } } } } } else if (ssDCval >= 73) { if (TSC < 15) { if (CsDiff < 1) { if (Rs < 249) { return 1; } else if (Rs >= 249) { return 0; } } else if (CsDiff >= 1) { return 1; } } else if (TSC >= 15) { if (diffRsCsdiff < 43) { return 0; } else if (diffRsCsdiff >= 43) { if (Scindex < 4) { if (Rs < 1129) { return 1; } else if (Rs >= 1129) { return 0; } } else if (Scindex >= 4) { if (posBalance < 77) { if (SC < 3679) { if (MVDiff < 267) { return 1; } else if (MVDiff >= 267) { if (CsDiff < 22) { if (MVDiff < 484) { return 0; } else if (MVDiff >= 484) { if (posBalance < 42) { return 1; } else if (posBalance >= 42) { return 0; } } } else if (CsDiff >= 22) { return 1; } } } else if (SC >= 3679) { if (diffMVdiffVal < 243) { return 0; } else if (diffMVdiffVal >= 243) { return 1; } } } else if (posBalance >= 77) { return 0; } } } } } } else if (diffTSC >= 12) { if (RsCsDiff < 245) { if (gchDC < 20) { if (AFD < 83) { if (diffMVdiffVal < 81) { if (SC < 1253) { return 1; } else if (SC >= 1253) { return 0; } } else if (diffMVdiffVal >= 81) { return 1; } } else if (AFD >= 83) { if (Rs < 387) { return 0; } else if (Rs >= 387) { return 1; } } } else if (gchDC >= 20) { if (negBalance < 81) { if (posBalance < 89) { if (diffMVdiffVal < 103) { return 0; } else if (diffMVdiffVal >= 103) { if (RsDiff < 8) { if (diffRsCsdiff < 68) { if (diffTSC < 20) { if (Cs < 417) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } else if (Cs >= 417) { return 0; } } else if (diffTSC >= 20) { if (Cs < 526) { return 1; } else if (Cs >= 526) { return 0; } } } else if (diffRsCsdiff >= 68) { return 1; } } else if (RsDiff >= 8) { if (RsDiff < 14) { return 1; } else if (RsDiff >= 14) { if (Cs < 679) { return 1; } else if (Cs >= 679) { return 0; } } } } } else if (posBalance >= 89) { return 1; } } else if (negBalance >= 81) { if (MVDiff < 1062) { return 1; } else if (MVDiff >= 1062) { if (TSC < 24) { return 1; } else if (TSC >= 24) { return 0; } } } } } else if (RsCsDiff >= 245) { if (diffTSC < 16) { if (diffAFD < 26) { if (refDCval < 86) { return 1; } else if (refDCval >= 86) { if (MVDiff < 193) { return 1; } else if (MVDiff >= 193) { if (gchDC < 37) { return 0; } else if (gchDC >= 37) { return 1; } } } } else if (diffAFD >= 26) { return 1; } } else if (diffTSC >= 16) { return 1; } } } } else if (ssDCval >= 149) { if (diffRsCsdiff < 17) { if (MVDiff < 177) { return 1; } else if (MVDiff >= 177) { return 0; } } else if (diffRsCsdiff >= 17) { if (diffAFD < 21) { return 0; } else if (diffAFD >= 21) { if (TSC < 23) { if (gchDC < 3) { if (CsDiff < 7) { return 1; } else if (CsDiff >= 7) { return 0; } } else if (gchDC >= 3) { return 1; } } else if (TSC >= 23) { return 1; } } } } } } } else if (Cs >= 2676) { if (diffMVdiffVal < 63) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (gchDC < 37) { if (ssDCval < 133) { return 0; } else if (ssDCval >= 133) { if (diffRsCsdiff < 4855) { return 1; } else if (diffRsCsdiff >= 4855) { return 0; } } } else if (gchDC >= 37) { if (RsDiff < 41) { return 1; } else if (RsDiff >= 41) { return 0; } } } } else if (diffMVdiffVal >= 63) { if (TSC < 20) { if (Rs < 4782) { if (MVDiff < 143) { if (Cs < 4645) { return 0; } else if (Cs >= 4645) { return 1; } } else if (MVDiff >= 143) { return 1; } } else if (Rs >= 4782) { return 0; } } else if (TSC >= 20) { if (MVDiff < 75) { if (refDCval < 129) { return 1; } else if (refDCval >= 129) { return 0; } } else if (MVDiff >= 75) { if (gchDC < 29) { return 1; } else if (gchDC >= 29) { if (CsDiff < 46) { if (CsDiff < 31) { return 1; } else if (CsDiff >= 31) { if (Rs < 6212) { return 0; } else if (Rs >= 6212) { if (gchDC < 38) { return 0; } else if (gchDC >= 38) { return 1; } } } } else if (CsDiff >= 46) { return 1; } } } } } } } return 0; } bool SCDetect2(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 /*TSCindex*/, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (MVDiff < 67) { if (diffTSC < 13) { if (gchDC < 7) { if (refDCval < 21) { if (diffRsCsdiff < 77) { if (diffMVdiffVal < -1) { return 0; } else if (diffMVdiffVal >= -1) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (ssDCval < 18) { if (MVDiff < 9) { return 1; } else if (MVDiff >= 9) { return 0; } } else if (ssDCval >= 18) { return 0; } } } } else if (diffRsCsdiff >= 77) { if (CsDiff < 11) { if (Cs < 1352) { return 1; } else if (Cs >= 1352) { return 0; } } else if (CsDiff >= 11) { return 1; } } } else if (refDCval >= 21) { if (diffTSC < 8) { if (diffRsCsdiff < 260) { return 0; } else if (diffRsCsdiff >= 260) { if (refDCval < 25) { return 1; } else if (refDCval >= 25) { return 0; } } } else if (diffTSC >= 8) { if (MVDiff < 59) { if (diffMVdiffVal < 14) { return 0; } else if (diffMVdiffVal >= 14) { if (ssDCval < 43) { return 1; } else if (ssDCval >= 43) { return 0; } } } else if (MVDiff >= 59) { if (Cs < 1683) { if (RsCsDiff < 191) { return 0; } else if (RsCsDiff >= 191) { return 1; } } else if (Cs >= 1683) { return 0; } } } } } else if (gchDC >= 7) { if (Scindex < 1) { if (gchDC < 41) { if (ssDCval < 175) { return 0; } else if (ssDCval >= 175) { if (MVDiff < 41) { return 1; } else if (MVDiff >= 41) { return 0; } } } else if (gchDC >= 41) { return 1; } } else if (Scindex >= 1) { if (diffAFD < -17) { if (Cs < 1865) { return 0; } else if (Cs >= 1865) { return 1; } } else if (diffAFD >= -17) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (MVDiff < 63) { if (Cs < 79) { return 1; } else if (Cs >= 79) { if (diffMVdiffVal < 54) { return 0; } else if (diffMVdiffVal >= 54) { return 1; } } } else if (MVDiff >= 63) { if (diffRsCsdiff < 393) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { return 1; } } else if (diffRsCsdiff >= 393) { return 1; } } } } } } } else if (diffTSC >= 13) { if (Cs < 3011) { if (SC < 2704) { if (diffAFD < 29) { if (RsDiff < 13) { return 0; } else if (RsDiff >= 13) { if (AFD < 29) { return 1; } else if (AFD >= 29) { return 0; } } } else if (diffAFD >= 29) { return 1; } } else if (SC >= 2704) { if (diffRsCsdiff < 271) { return 0; } else if (diffRsCsdiff >= 271) { if (gchDC < 1) { return 0; } else if (gchDC >= 1) { if (RsCsDiff < 539) { if (posBalance < 61) { return 1; } else if (posBalance >= 61) { if (Cs < 1801) { return 1; } else if (Cs >= 1801) { return 0; } } } else if (RsCsDiff >= 539) { return 1; } } } } } else if (Cs >= 3011) { if (MVDiff < 46) { return 0; } else if (MVDiff >= 46) { return 1; } } } } else if (MVDiff >= 67) { if (diffAFD < 13) { if (gchDC < 22) { if (diffAFD < 9) { if (MVDiff < 149) { if (diffAFD < 3) { return 0; } else if (diffAFD >= 3) { if (diffRsCsdiff < 398) { return 0; } else if (diffRsCsdiff >= 398) { if (Scindex < 5) { return 1; } else if (Scindex >= 5) { return 0; } } } } else if (MVDiff >= 149) { if (diffTSC < 1) { if (refDCval < 56) { if (SC < 7282) { if (RsDiff < 2) { if (refDCval < 24) { if (posBalance < 38) { return 0; } else if (posBalance >= 38) { if (diffAFD < -19) { if (ssDCval < 26) { return 1; } else if (ssDCval >= 26) { return 0; } } else if (diffAFD >= -19) { return 0; } } } else if (refDCval >= 24) { return 0; } } else if (RsDiff >= 2) { if (ssDCval < 24) { if (negBalance < 4) { return 1; } else if (negBalance >= 4) { if (TSC < 3) { return 0; } else if (TSC >= 3) { return 1; } } } else if (ssDCval >= 24) { if (RsCsDiff < 19) { return 0; } else if (RsCsDiff >= 19) { if (TSC < 13) { if (SC < 855) { if (SC < 841) { if (AFD < 31) { if (Rs < 94) { if (posBalance < 42) { return 0; } else if (posBalance >= 42) { return 1; } } else if (Rs >= 94) { return 0; } } else if (AFD >= 31) { if (Rs < 213) { return 1; } else if (Rs >= 213) { return 0; } } } else if (SC >= 841) { return 1; } } else if (SC >= 855) { return 0; } } else if (TSC >= 13) { if (Rs < 945) { return 1; } else if (Rs >= 945) { return 0; } } } } } } else if (SC >= 7282) { if (Rs < 3078) { return 1; } else if (Rs >= 3078) { return 0; } } } else if (refDCval >= 56) { if (AFD < 34) { return 0; } else if (AFD >= 34) { if (SC < 1068) { if (RsDiff < 10) { if (CsDiff < 6) { return 0; } else if (CsDiff >= 6) { return 1; } } else if (RsDiff >= 10) { if (Rs < 865) { return 0; } else if (Rs >= 865) { return 1; } } } else if (SC >= 1068) { return 0; } } } } else if (diffTSC >= 1) { if (AFD < 15) { if (ssDCval < 30) { if (CsDiff < 1) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { if (Rs < 94) { return 1; } else if (Rs >= 94) { return 0; } } } else if (CsDiff >= 1) { return 1; } } else if (ssDCval >= 30) { if (TSC < 12) { if (AFD < 14) { if (diffAFD < 7) { return 0; } else if (diffAFD >= 7) { if (negBalance < 61) { return 0; } else if (negBalance >= 61) { if (RsDiff < 1) { return 1; } else if (RsDiff >= 1) { return 0; } } } } else if (AFD >= 14) { if (Cs < 79) { return 0; } else if (Cs >= 79) { if (diffRsCsdiff < 11) { return 0; } else if (diffRsCsdiff >= 11) { if (Cs < 367) { return 1; } else if (Cs >= 367) { return 0; } } } } } else if (TSC >= 12) { if (SC < 336) { return 0; } else if (SC >= 336) { return 1; } } } } else if (AFD >= 15) { if (refDCval < 48) { if (ssDCval < 48) { if (diffRsCsdiff < 244) { if (negBalance < 84) { if (Scindex < 3) { if (SC < 197) { return 0; } else if (SC >= 197) { return 1; } } else if (Scindex >= 3) { if (refDCval < 32) { if (gchDC < 11) { return 1; } else if (gchDC >= 11) { return 0; } } else if (refDCval >= 32) { return 0; } } } else if (negBalance >= 84) { return 1; } } else if (diffRsCsdiff >= 244) { return 1; } } else if (ssDCval >= 48) { return 0; } } else if (refDCval >= 48) { if (diffRsCsdiff < 94) { return 0; } else if (diffRsCsdiff >= 94) { if (SC < 1492) { return 1; } else if (SC >= 1492) { return 0; } } } } } } } else if (diffAFD >= 9) { if (Cs < 210) { if (refDCval < 51) { if (CsDiff < 3) { if (ssDCval < 45) { if (Rs < 148) { if (refDCval < 39) { return 1; } else if (refDCval >= 39) { if (AFD < 18) { return 1; } else if (AFD >= 18) { return 0; } } } else if (Rs >= 148) { if (RsDiff < 2) { return 1; } else if (RsDiff >= 2) { if (RsCsDiff < 25) { return 0; } else if (RsCsDiff >= 25) { return 1; } } } } else if (ssDCval >= 45) { return 0; } } else if (CsDiff >= 3) { return 1; } } else if (refDCval >= 51) { if (gchDC < 15) { if (Rs < 94) { if (RsCsDiff < 11) { if (Rs < 47) { return 0; } else if (Rs >= 47) { return 1; } } else if (RsCsDiff >= 11) { return 1; } } else if (Rs >= 94) { return 0; } } else if (gchDC >= 15) { return 0; } } } else if (Cs >= 210) { if (ssDCval < 46) { if (diffMVdiffVal < 92) { if (AFD < 18) { if (Cs < 783) { return 0; } else if (Cs >= 783) { return 1; } } else if (AFD >= 18) { return 0; } } else if (diffMVdiffVal >= 92) { if (Rs < 307) { if (SC < 393) { return 1; } else if (SC >= 393) { if (Cs < 309) { return 0; } else if (Cs >= 309) { return 1; } } } else if (Rs >= 307) { if (MVDiff < 364) { return 1; } else if (MVDiff >= 364) { return 0; } } } } else if (ssDCval >= 46) { if (diffRsCsdiff < 56) { return 0; } else if (diffRsCsdiff >= 56) { if (Rs < 916) { if (negBalance < 36) { return 0; } else if (negBalance >= 36) { if (MVDiff < 265) { if (ssDCval < 59) { return 0; } else if (ssDCval >= 59) { return 1; } } else if (MVDiff >= 265) { return 1; } } } else if (Rs >= 916) { if (RsCsDiff < 1401) { return 0; } else if (RsCsDiff >= 1401) { if (TSC < 26) { return 0; } else if (TSC >= 26) { return 1; } } } } } } } } else if (gchDC >= 22) { if (SC < 1) { if (TSC < 6) { return 1; } else if (TSC >= 6) { if (RsDiff < 5) { if (ssDCval < 89) { return 1; } else if (ssDCval >= 89) { return 0; } } else if (RsDiff >= 5) { return 1; } } } else if (SC >= 1) { if (RsCsDiff < 749) { if (SC < 2185) { if (SC < 2170) { if (ssDCval < 91) { if (diffRsCsdiff < 38) { if (gchDC < 59) { if (posBalance < 28) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (Rs < 574) { return 1; } else if (Rs >= 574) { return 0; } } } else if (posBalance >= 28) { if (RsDiff < 5) { if (refDCval < 38) { return 1; } else if (refDCval >= 38) { if (negBalance < 90) { return 0; } else if (negBalance >= 90) { if (ssDCval < 47) { return 1; } else if (ssDCval >= 47) { return 0; } } } } else if (RsDiff >= 5) { return 0; } } } else if (gchDC >= 59) { if (diffAFD < 2) { return 0; } else if (diffAFD >= 2) { if (diffRsCsdiff < 8) { return 1; } else if (diffRsCsdiff >= 8) { return 0; } } } } else if (diffRsCsdiff >= 38) { if (Rs < 302) { if (CsDiff < 16) { if (gchDC < 31) { return 0; } else if (gchDC >= 31) { return 1; } } else if (CsDiff >= 16) { return 0; } } else if (Rs >= 302) { if (refDCval < 39) { return 1; } else if (refDCval >= 39) { if (gchDC < 85) { return 0; } else if (gchDC >= 85) { if (Cs < 768) { return 1; } else if (Cs >= 768) { return 0; } } } } } } else if (ssDCval >= 91) { if (diffTSC < 25) { if (AFD < 40) { return 0; } else if (AFD >= 40) { if (refDCval < 78) { if (Cs < 136) { return 1; } else if (Cs >= 136) { return 0; } } else if (refDCval >= 78) { return 0; } } } else if (diffTSC >= 25) { if (Rs < 508) { return 0; } else if (Rs >= 508) { return 1; } } } } else if (SC >= 2170) { return 1; } } else if (SC >= 2185) { return 0; } } else if (RsCsDiff >= 749) { if (AFD < 39) { return 0; } else if (AFD >= 39) { if (diffAFD < -2) { return 1; } else if (diffAFD >= -2) { if (AFD < 59) { if (diffRsCsdiff < 928) { return 0; } else if (diffRsCsdiff >= 928) { if (SC < 573) { return 0; } else if (SC >= 573) { return 1; } } } else if (AFD >= 59) { if (diffTSC < 3) { if (negBalance < 45) { return 1; } else if (negBalance >= 45) { if (diffMVdiffVal < -13) { return 1; } else if (diffMVdiffVal >= -13) { return 0; } } } else if (diffTSC >= 3) { return 1; } } } } } } } } else if (diffAFD >= 13) { if (CsDiff < 7) { if (negBalance < 22) { if (MVDiff < 862) { if (SC < 788) { if (diffMVdiffVal < 144) { if (posBalance < 128) { if (diffRsCsdiff < 18) { return 0; } else if (diffRsCsdiff >= 18) { if (diffMVdiffVal < 98) { return 0; } else if (diffMVdiffVal >= 98) { return 1; } } } else if (posBalance >= 128) { return 1; } } else if (diffMVdiffVal >= 144) { if (AFD < 24) { return 1; } else if (AFD >= 24) { if (RsCsDiff < 29) { if (diffTSC < 16) { return 0; } else if (diffTSC >= 16) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { if (Rs < 301) { return 1; } else if (Rs >= 301) { return 0; } } } } else if (RsCsDiff >= 29) { if (ssDCval < 96) { return 0; } else if (ssDCval >= 96) { return 1; } } } } } else if (SC >= 788) { if (diffRsCsdiff < 57) { return 0; } else if (diffRsCsdiff >= 57) { if (diffAFD < 29) { return 0; } else if (diffAFD >= 29) { if (AFD < 42) { return 1; } else if (AFD >= 42) { if (Rs < 1905) { return 0; } else if (Rs >= 1905) { return 1; } } } } } } else if (MVDiff >= 862) { if (ssDCval < 79) { return 0; } else if (ssDCval >= 79) { return 1; } } } else if (negBalance >= 22) { if (diffMVdiffVal < 83) { if (posBalance < 56) { if (gchDC < 30) { if (RsDiff < 10) { if (negBalance < 62) { if (SC < 247) { if (Cs < 17) { return 0; } else if (Cs >= 17) { return 1; } } else if (SC >= 247) { return 0; } } else if (negBalance >= 62) { if (RsDiff < 7) { return 1; } else if (RsDiff >= 7) { return 0; } } } else if (RsDiff >= 10) { return 1; } } else if (gchDC >= 30) { if (diffTSC < 7) { return 1; } else if (diffTSC >= 7) { if (Cs < 570) { return 0; } else if (Cs >= 570) { if (TSC < 27) { return 1; } else if (TSC >= 27) { return 0; } } } } } else if (posBalance >= 56) { if (diffTSC < 22) { if (AFD < 30) { if (SC < 1449) { if (posBalance < 60) { if (Cs < 273) { return 1; } else if (Cs >= 273) { return 0; } } else if (posBalance >= 60) { return 0; } } else if (SC >= 1449) { if (ssDCval < 109) { if (Cs < 805) { return 1; } else if (Cs >= 805) { return 0; } } else if (ssDCval >= 109) { return 0; } } } else if (AFD >= 30) { return 0; } } else if (diffTSC >= 22) { if (SC < 1603) { return 0; } else if (SC >= 1603) { return 1; } } } } else if (diffMVdiffVal >= 83) { if (MVDiff < 417) { if (Cs < 636) { if (ssDCval < 105) { if (diffRsCsdiff < -1) { if (AFD < 36) { return 0; } else if (AFD >= 36) { return 1; } } else if (diffRsCsdiff >= -1) { if (diffMVdiffVal < 130) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (gchDC < 9) { if (posBalance < 76) { return 0; } else if (posBalance >= 76) { return 1; } } else if (gchDC >= 9) { if (ssDCval < 84) { return 1; } else if (ssDCval >= 84) { if (RsCsDiff < 47) { return 0; } else if (RsCsDiff >= 47) { return 1; } } } } } else if (diffMVdiffVal >= 130) { if (posBalance < 2) { if (Cs < 11) { return 0; } else if (Cs >= 11) { return 1; } } else if (posBalance >= 2) { return 1; } } } } else if (ssDCval >= 105) { if (refDCval < 107) { return 1; } else if (refDCval >= 107) { if (diffAFD < 24) { return 0; } else if (diffAFD >= 24) { if (refDCval < 135) { return 0; } else if (refDCval >= 135) { return 1; } } } } } else if (Cs >= 636) { if (diffAFD < 21) { return 0; } else if (diffAFD >= 21) { if (TSC < 25) { return 1; } else if (TSC >= 25) { if (SC < 3466) { return 0; } else if (SC >= 3466) { return 1; } } } } } else if (MVDiff >= 417) { if (Cs < 492) { if (diffAFD < 18) { if (refDCval < 53) { return 1; } else if (refDCval >= 53) { if (SC < 3) { return 1; } else if (SC >= 3) { if (diffMVdiffVal < 1381) { return 0; } else if (diffMVdiffVal >= 1381) { return 1; } } } } else if (diffAFD >= 18) { if (diffRsCsdiff < 9) { if (TSC < 19) { return 1; } else if (TSC >= 19) { if (Cs < 115) { return 0; } else if (Cs >= 115) { if (Cs < 216) { return 1; } else if (Cs >= 216) { return 0; } } } } else if (diffRsCsdiff >= 9) { return 1; } } } else if (Cs >= 492) { if (MVDiff < 1057) { return 0; } else if (MVDiff >= 1057) { return 1; } } } } } } else if (CsDiff >= 7) { if (gchDC < 16) { if (diffAFD < 22) { if (ssDCval < 78) { if (diffTSC < 6) { if (AFD < 24) { return 1; } else if (AFD >= 24) { if (Cs < 512) { return 1; } else if (Cs >= 512) { return 0; } } } else if (diffTSC >= 6) { if (Rs < 643) { return 1; } else if (Rs >= 643) { if (RsDiff < 10) { if (ssDCval < 46) { return 1; } else if (ssDCval >= 46) { return 0; } } else if (RsDiff >= 10) { if (refDCval < 82) { return 1; } else if (refDCval >= 82) { return 0; } } } } } else if (ssDCval >= 78) { if (TSC < 21) { if (RsCsDiff < 106) { return 1; } else if (RsCsDiff >= 106) { return 0; } } else if (TSC >= 21) { if (refDCval < 87) { return 1; } else if (refDCval >= 87) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { return 1; } } } } } else if (diffAFD >= 22) { if (diffMVdiffVal < 73) { if (refDCval < 131) { if (RsDiff < 48) { if (gchDC < 8) { if (ssDCval < 52) { return 0; } else if (ssDCval >= 52) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { return 1; } } } else if (gchDC >= 8) { return 1; } } else if (RsDiff >= 48) { return 0; } } else if (refDCval >= 131) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (Rs < 7533) { return 1; } else if (Rs >= 7533) { if (Cs < 7014) { return 0; } else if (Cs >= 7014) { return 1; } } } } } else if (diffMVdiffVal >= 73) { if (gchDC < 3) { if (AFD < 54) { if (TSC < 16) { if (ssDCval < 87) { return 1; } else if (ssDCval >= 87) { return 0; } } else if (TSC >= 16) { return 1; } } else if (AFD >= 54) { if (Rs < 1589) { return 0; } else if (Rs >= 1589) { return 1; } } } else if (gchDC >= 3) { return 1; } } } } else if (gchDC >= 16) { if (diffRsCsdiff < 65) { if (TSC < 65) { if (CsDiff < 10) { if (Cs < 439) { if (MVDiff < 202) { if (MVDiff < 169) { return 0; } else if (MVDiff >= 169) { if (Rs < 371) { return 1; } else if (Rs >= 371) { return 0; } } } else if (MVDiff >= 202) { return 1; } } else if (Cs >= 439) { if (diffTSC < 20) { return 0; } else if (diffTSC >= 20) { if (gchDC < 34) { return 1; } else if (gchDC >= 34) { return 0; } } } } else if (CsDiff >= 10) { return 0; } } else if (TSC >= 65) { return 1; } } else if (diffRsCsdiff >= 65) { if (diffMVdiffVal < 80) { if (RsCsDiff < 633) { if (AFD < 54) { if (MVDiff < 87) { if (diffMVdiffVal < 66) { return 0; } else if (diffMVdiffVal >= 66) { return 1; } } else if (MVDiff >= 87) { return 0; } } else if (AFD >= 54) { if (RsCsDiff < 269) { return 0; } else if (RsCsDiff >= 269) { return 1; } } } else if (RsCsDiff >= 633) { if (diffTSC < 16) { if (posBalance < 44) { if (CsDiff < 28) { return 1; } else if (CsDiff >= 28) { return 0; } } else if (posBalance >= 44) { return 0; } } else if (diffTSC >= 16) { return 1; } } } else if (diffMVdiffVal >= 80) { if (SC < 3327) { if (ssDCval < 229) { if (Cs < 1033) { if (diffMVdiffVal < 98) { if (diffAFD < 26) { return 0; } else if (diffAFD >= 26) { return 1; } } else if (diffMVdiffVal >= 98) { return 1; } } else if (Cs >= 1033) { if (diffAFD < 34) { if (TSC < 30) { if (MVDiff < 116) { return 0; } else if (MVDiff >= 116) { return 1; } } else if (TSC >= 30) { if (refDCval < 42) { return 1; } else if (refDCval >= 42) { return 0; } } } else if (diffAFD >= 34) { if (RsDiff < 7) { if (Cs < 1356) { return 1; } else if (Cs >= 1356) { return 0; } } else if (RsDiff >= 7) { if (AFD < 46) { if (diffTSC < 26) { return 1; } else if (diffTSC >= 26) { return 0; } } else if (AFD >= 46) { return 1; } } } } } else if (ssDCval >= 229) { return 0; } } else if (SC >= 3327) { if (diffTSC < 18) { if (posBalance < 104) { if (diffRsCsdiff < 439) { return 0; } else if (diffRsCsdiff >= 439) { if (posBalance < 60) { return 1; } else if (posBalance >= 60) { if (gchDC < 44) { if (MVDiff < 156) { return 1; } else if (MVDiff >= 156) { if (SC < 7554) { return 0; } else if (SC >= 7554) { return 1; } } } else if (gchDC >= 44) { return 1; } } } } else if (posBalance >= 104) { return 0; } } else if (diffTSC >= 18) { if (RsDiff < 12) { return 0; } else if (RsDiff >= 12) { if (posBalance < 125) { if (SC < 4217) { if (diffRsCsdiff < 460) { if (RsCsDiff < 455) { if (MVDiff < 288) { return 1; } else if (MVDiff >= 288) { return 0; } } else if (RsCsDiff >= 455) { return 0; } } else if (diffRsCsdiff >= 460) { return 1; } } else if (SC >= 4217) { return 1; } } else if (posBalance >= 125) { return 0; } } } } } } } } } } return 0; } bool SCDetect3(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 /*TSCindex*/, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (AFD < 29) { if (diffMVdiffVal < 66) { if (diffAFD < 9) { if (refDCval < 24) { if (RsCsDiff < 231) { if (diffRsCsdiff < 4) { if (Rs < 1) { if (ssDCval < 130) { return 0; } else if (ssDCval >= 130) { return 1; } } else if (Rs >= 1) { return 0; } } else if (diffRsCsdiff >= 4) { if (negBalance < 4) { if (CsDiff < 4) { if (refDCval < 17) { return 1; } else if (refDCval >= 17) { return 0; } } else if (CsDiff >= 4) { return 1; } } else if (negBalance >= 4) { return 0; } } } else if (RsCsDiff >= 231) { return 1; } } else if (refDCval >= 24) { if (AFD < 22) { if (refDCval < 173) { return 0; } else if (refDCval >= 173) { if (RsDiff < 36) { if (gchDC < 30) { return 0; } else if (gchDC >= 30) { if (RsDiff < 1) { return 1; } else if (RsDiff >= 1) { return 0; } } } else if (RsDiff >= 36) { if (RsDiff < 40) { return 1; } else if (RsDiff >= 40) { return 0; } } } } else if (AFD >= 22) { if (refDCval < 48) { if (RsDiff < 5) { if (diffRsCsdiff < 31) { if (diffTSC < 5) { if (SC < 1063) { return 0; } else if (SC >= 1063) { return 1; } } else if (diffTSC >= 5) { return 1; } } else if (diffRsCsdiff >= 31) { return 1; } } else if (RsDiff >= 5) { return 0; } } else if (refDCval >= 48) { return 0; } } } } else if (diffAFD >= 9) { if (diffTSC < 13) { if (refDCval < 57) { if (SC < 101) { if (ssDCval < 41) { if (MVDiff < 73) { return 0; } else if (MVDiff >= 73) { return 1; } } else if (ssDCval >= 41) { return 0; } } else if (SC >= 101) { if (diffMVdiffVal < 51) { if (Rs < 5133) { if (diffMVdiffVal < -105) { if (Cs < 60) { return 1; } else if (Cs >= 60) { if (negBalance < 54) { return 0; } else if (negBalance >= 54) { return 1; } } } else if (diffMVdiffVal >= -105) { return 0; } } else if (Rs >= 5133) { return 1; } } else if (diffMVdiffVal >= 51) { if (CsDiff < 9) { if (gchDC < 13) { if (MVDiff < 233) { return 0; } else if (MVDiff >= 233) { return 1; } } else if (gchDC >= 13) { return 0; } } else if (CsDiff >= 9) { return 1; } } } } else if (refDCval >= 57) { if (CsDiff < 2) { if (Rs < 2455) { return 0; } else if (Rs >= 2455) { return 1; } } else if (CsDiff >= 2) { return 0; } } } else if (diffTSC >= 13) { if (RsCsDiff < 230) { if (refDCval < 25) { if (MVDiff < 361) { return 1; } else if (MVDiff >= 361) { return 0; } } else if (refDCval >= 25) { if (AFD < 19) { if (SC < 2080) { return 0; } else if (SC >= 2080) { return 1; } } else if (AFD >= 19) { return 0; } } } else if (RsCsDiff >= 230) { if (gchDC < 6) { if (CsDiff < 12) { return 1; } else if (CsDiff >= 12) { return 0; } } else if (gchDC >= 6) { if (AFD < 25) { return 1; } else if (AFD >= 25) { if (TSC < 24) { return 0; } else if (TSC >= 24) { return 1; } } } } } } } else if (diffMVdiffVal >= 66) { if (diffTSC < 6) { if (refDCval < 68) { if (diffAFD < 8) { if (CsDiff < 22) { if (diffTSC < -1) { return 0; } else if (diffTSC >= -1) { if (ssDCval < 38) { if (AFD < 15) { if (diffTSC < 3) { if (Rs < 430) { return 0; } else if (Rs >= 430) { if (Rs < 483) { return 1; } else if (Rs >= 483) { return 0; } } } else if (diffTSC >= 3) { if (Cs < 31) { return 0; } else if (Cs >= 31) { if (MVDiff < 163) { return 0; } else if (MVDiff >= 163) { return 1; } } } } else if (AFD >= 15) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } } else if (ssDCval >= 38) { if (refDCval < 35) { if (posBalance < 123) { return 0; } else if (posBalance >= 123) { return 1; } } else if (refDCval >= 35) { return 0; } } } } else if (CsDiff >= 22) { return 1; } } else if (diffAFD >= 8) { if (SC < 383) { if (ssDCval < 31) { return 1; } else if (ssDCval >= 31) { if (diffMVdiffVal < 125) { if (CsDiff < 10) { return 0; } else if (CsDiff >= 10) { return 1; } } else if (diffMVdiffVal >= 125) { if (Cs < 43) { if (Cs < 22) { return 1; } else if (Cs >= 22) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { return 1; } } } else if (Cs >= 43) { return 1; } } } } else if (SC >= 383) { if (ssDCval < 40) { if (MVDiff < 170) { return 1; } else if (MVDiff >= 170) { if (AFD < 22) { return 0; } else if (AFD >= 22) { return 1; } } } else if (ssDCval >= 40) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (TSC < 9) { return 1; } else if (TSC >= 9) { return 0; } } } } } } else if (refDCval >= 68) { if (diffMVdiffVal < 667) { if (posBalance < 128) { if (diffMVdiffVal < 100) { return 0; } else if (diffMVdiffVal >= 100) { if (gchDC < 100) { if (TSC < 9) { return 0; } else if (TSC >= 9) { if (MVDiff < 159) { if (Cs < 535) { return 1; } else if (Cs >= 535) { return 0; } } else if (MVDiff >= 159) { return 0; } } } else if (gchDC >= 100) { if (SC < 13) { return 1; } else if (SC >= 13) { return 0; } } } } else if (posBalance >= 128) { return 1; } } else if (diffMVdiffVal >= 667) { if (TSC < 13) { if (ssDCval < 34) { if (AFD < 25) { return 1; } else if (AFD >= 25) { return 0; } } else if (ssDCval >= 34) { if (RsCsDiff < 315) { return 0; } else if (RsCsDiff >= 315) { return 1; } } } else if (TSC >= 13) { return 1; } } } } else if (diffTSC >= 6) { if (posBalance < 86) { if (diffAFD < 12) { if (gchDC < 10) { if (SC < 499) { if (SC < 71) { return 0; } else if (SC >= 71) { return 1; } } else if (SC >= 499) { if (diffMVdiffVal < 158) { if (Rs < 801) { return 1; } else if (Rs >= 801) { if (SC < 4114) { return 0; } else if (SC >= 4114) { return 1; } } } else if (diffMVdiffVal >= 158) { return 0; } } } else if (gchDC >= 10) { return 0; } } else if (diffAFD >= 12) { if (SC < 3578) { if (negBalance < 34) { if (CsDiff < 8) { if (Cs < 171) { return 1; } else if (Cs >= 171) { return 0; } } else if (CsDiff >= 8) { return 1; } } else if (negBalance >= 34) { if (SC < 524) { return 1; } else if (SC >= 524) { if (RsDiff < 8) { if (gchDC < 12) { if (TSC < 9) { if (RsCsDiff < 59) { return 1; } else if (RsCsDiff >= 59) { return 0; } } else if (TSC >= 9) { return 1; } } else if (gchDC >= 12) { if (gchDC < 34) { if (gchDC < 17) { if (refDCval < 53) { return 1; } else if (refDCval >= 53) { if (RsCsDiff < 99) { return 0; } else if (RsCsDiff >= 99) { return 1; } } } else if (gchDC >= 17) { if (RsDiff < 5) { return 1; } else if (RsDiff >= 5) { return 0; } } } else if (gchDC >= 34) { return 1; } } } else if (RsDiff >= 8) { return 1; } } } } else if (SC >= 3578) { if (Rs < 4691) { if (refDCval < 172) { return 0; } else if (refDCval >= 172) { if (AFD < 24) { return 0; } else if (AFD >= 24) { return 1; } } } else if (Rs >= 4691) { return 1; } } } } else if (posBalance >= 86) { if (negBalance < 25) { if (Scindex < 3) { if (RsCsDiff < 19) { if (Cs < 9) { return 0; } else if (Cs >= 9) { if (TSC < 12) { if (SC < 258) { if (diffRsCsdiff < 1) { return 0; } else if (diffRsCsdiff >= 1) { return 1; } } else if (SC >= 258) { return 0; } } else if (TSC >= 12) { if (SC < 314) { return 0; } else if (SC >= 314) { if (TSC < 19) { return 1; } else if (TSC >= 19) { return 0; } } } } } else if (RsCsDiff >= 19) { return 1; } } else if (Scindex >= 3) { if (Rs < 1323) { if (diffMVdiffVal < 657) { if (TSC < 11) { if (AFD < 16) { return 0; } else if (AFD >= 16) { return 1; } } else if (TSC >= 11) { return 0; } } else if (diffMVdiffVal >= 657) { return 1; } } else if (Rs >= 1323) { if (Rs < 1459) { return 1; } else if (Rs >= 1459) { if (RsDiff < 23) { return 0; } else if (RsDiff >= 23) { return 1; } } } } } else if (negBalance >= 25) { return 1; } } } } } else if (AFD >= 29) { if (diffAFD < 23) { if (TSC < 16) { if (MVDiff < 125) { return 0; } else if (MVDiff >= 125) { if (ssDCval < 61) { if (diffTSC < -2) { if (CsDiff < 3) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { if (diffTSC < -5) { return 0; } else if (diffTSC >= -5) { return 1; } } } else if (CsDiff >= 3) { return 0; } } else if (diffTSC >= -2) { if (RsCsDiff < 4) { return 1; } else if (RsCsDiff >= 4) { if (CsDiff < 6) { if (TSC < 13) { if (diffRsCsdiff < 6) { return 0; } else if (diffRsCsdiff >= 6) { if (RsCsDiff < 33) { return 1; } else if (RsCsDiff >= 33) { return 0; } } } else if (TSC >= 13) { return 0; } } else if (CsDiff >= 6) { if (Cs < 435) { return 1; } else if (Cs >= 435) { if (MVDiff < 278) { return 0; } else if (MVDiff >= 278) { if (diffRsCsdiff < -27) { return 0; } else if (diffRsCsdiff >= -27) { return 1; } } } } } } } else if (ssDCval >= 61) { if (gchDC < 119) { return 0; } else if (gchDC >= 119) { return 1; } } } } else if (TSC >= 16) { if (diffMVdiffVal < 92) { if (refDCval < 26) { if (Cs < 298) { return 0; } else if (Cs >= 298) { return 1; } } else if (refDCval >= 26) { if (MVDiff < 46) { return 0; } else if (MVDiff >= 46) { if (AFD < 58) { if (diffAFD < 19) { if (diffRsCsdiff < 96) { if (TSC < 20) { return 0; } else if (TSC >= 20) { if (Scindex < 1) { if (Rs < 21) { return 1; } else if (Rs >= 21) { return 0; } } else if (Scindex >= 1) { if (diffMVdiffVal < -38) { if (diffMVdiffVal < -40) { if (ssDCval < 59) { if (AFD < 45) { return 0; } else if (AFD >= 45) { return 1; } } else if (ssDCval >= 59) { return 0; } } else if (diffMVdiffVal >= -40) { return 1; } } else if (diffMVdiffVal >= -38) { if (Rs < 1738) { return 0; } else if (Rs >= 1738) { if (Rs < 1777) { return 1; } else if (Rs >= 1777) { return 0; } } } } } } else if (diffRsCsdiff >= 96) { if (RsDiff < 13) { if (diffTSC < 9) { if (Cs < 278) { return 1; } else if (Cs >= 278) { return 0; } } else if (diffTSC >= 9) { if (diffTSC < 15) { return 1; } else if (diffTSC >= 15) { return 0; } } } else if (RsDiff >= 13) { if (refDCval < 79) { if (gchDC < 9) { if (MVDiff < 148) { return 1; } else if (MVDiff >= 148) { return 0; } } else if (gchDC >= 9) { return 0; } } else if (refDCval >= 79) { return 0; } } } } else if (diffAFD >= 19) { if (refDCval < 61) { return 0; } else if (refDCval >= 61) { if (diffMVdiffVal < 56) { if (Rs < 622) { if (Rs < 193) { return 0; } else if (Rs >= 193) { return 1; } } else if (Rs >= 622) { if (RsCsDiff < 16225) { if (diffMVdiffVal < -57) { if (AFD < 43) { return 1; } else if (AFD >= 43) { return 0; } } else if (diffMVdiffVal >= -57) { return 0; } } else if (RsCsDiff >= 16225) { return 1; } } } else if (diffMVdiffVal >= 56) { return 1; } } } } else if (AFD >= 58) { if (Scindex < 4) { return 0; } else if (Scindex >= 4) { if (RsDiff < 24) { if (diffMVdiffVal < -5) { return 1; } else if (diffMVdiffVal >= -5) { if (Cs < 1466) { return 0; } else if (Cs >= 1466) { if (SC < 3716) { return 1; } else if (SC >= 3716) { return 0; } } } } else if (RsDiff >= 24) { return 0; } } } } } } else if (diffMVdiffVal >= 92) { if (diffTSC < 1) { if (ssDCval < 39) { if (Cs < 302) { return 0; } else if (Cs >= 302) { return 1; } } else if (ssDCval >= 39) { return 0; } } else if (diffTSC >= 1) { if (diffRsCsdiff < 85) { if (refDCval < 127) { if (ssDCval < 90) { if (negBalance < 70) { if (TSC < 20) { if (diffRsCsdiff < 36) { return 0; } else if (diffRsCsdiff >= 36) { return 1; } } else if (TSC >= 20) { return 0; } } else if (negBalance >= 70) { return 1; } } else if (ssDCval >= 90) { if (Cs < 450) { if (ssDCval < 108) { return 0; } else if (ssDCval >= 108) { if (AFD < 48) { return 1; } else if (AFD >= 48) { return 0; } } } else if (Cs >= 450) { return 0; } } } else if (refDCval >= 127) { if (Cs < 53) { return 1; } else if (Cs >= 53) { return 0; } } } else if (diffRsCsdiff >= 85) { if (Rs < 1456) { if (gchDC < 31) { if (posBalance < 89) { if (diffTSC < 7) { if (RsCsDiff < 1287) { if (gchDC < 3) { return 1; } else if (gchDC >= 3) { return 0; } } else if (RsCsDiff >= 1287) { return 1; } } else if (diffTSC >= 7) { return 1; } } else if (posBalance >= 89) { return 0; } } else if (gchDC >= 31) { return 1; } } else if (Rs >= 1456) { if (gchDC < 21) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (gchDC < 19) { return 1; } else if (gchDC >= 19) { if (AFD < 42) { return 1; } else if (AFD >= 42) { return 0; } } } } else if (gchDC >= 21) { return 0; } } } } } } } else if (diffAFD >= 23) { if (posBalance < 81) { if (diffRsCsdiff < 1) { if (Cs < 204) { return 1; } else if (Cs >= 204) { if (AFD < 40) { return 1; } else if (AFD >= 40) { return 0; } } } else if (diffRsCsdiff >= 1) { if (ssDCval < 82) { if (TSC < 14) { if (diffMVdiffVal < 132) { if (AFD < 30) { if (ssDCval < 64) { return 1; } else if (ssDCval >= 64) { return 0; } } else if (AFD >= 30) { return 0; } } else if (diffMVdiffVal >= 132) { return 1; } } else if (TSC >= 14) { if (TSC < 23) { if (diffMVdiffVal < 77) { if (RsCsDiff < 291) { if (AFD < 40) { return 1; } else if (AFD >= 40) { return 0; } } else if (RsCsDiff >= 291) { return 1; } } else if (diffMVdiffVal >= 77) { return 1; } } else if (TSC >= 23) { if (negBalance < 39) { if (MVDiff < 244) { if (diffAFD < 33) { return 0; } else if (diffAFD >= 33) { return 1; } } else if (MVDiff >= 244) { return 0; } } else if (negBalance >= 39) { if (negBalance < 68) { if (ssDCval < 55) { if (RsCsDiff < 670) { return 0; } else if (RsCsDiff >= 670) { return 1; } } else if (ssDCval >= 55) { if (AFD < 64) { return 1; } else if (AFD >= 64) { if (Rs < 1449) { return 1; } else if (Rs >= 1449) { return 0; } } } } else if (negBalance >= 68) { return 1; } } } } } else if (ssDCval >= 82) { if (TSC < 18) { if (diffRsCsdiff < 101) { return 1; } else if (diffRsCsdiff >= 101) { if (gchDC < 8) { if (TSC < 16) { return 0; } else if (TSC >= 16) { if (negBalance < 40) { return 0; } else if (negBalance >= 40) { return 1; } } } else if (gchDC >= 8) { if (TSC < 13) { return 0; } else if (TSC >= 13) { return 1; } } } } else if (TSC >= 18) { if (diffAFD < 29) { if (AFD < 32) { return 1; } else if (AFD >= 32) { if (diffRsCsdiff < 186) { if (TSC < 51) { if (Cs < 737) { if (MVDiff < 262) { if (Cs < 553) { if (Rs < 136) { return 1; } else if (Rs >= 136) { return 0; } } else if (Cs >= 553) { return 1; } } else if (MVDiff >= 262) { return 0; } } else if (Cs >= 737) { return 0; } } else if (TSC >= 51) { return 1; } } else if (diffRsCsdiff >= 186) { if (SC < 6949) { return 1; } else if (SC >= 6949) { if (TSC < 27) { return 0; } else if (TSC >= 27) { return 1; } } } } } else if (diffAFD >= 29) { if (RsDiff < 6) { if (refDCval < 67) { return 0; } else if (refDCval >= 67) { if (TSC < 46) { return 1; } else if (TSC >= 46) { return 0; } } } else if (RsDiff >= 6) { if (AFD < 45) { if (Scindex < 7) { if (SC < 2767) { if (posBalance < 36) { if (posBalance < 33) { return 1; } else if (posBalance >= 33) { return 0; } } else if (posBalance >= 36) { return 1; } } else if (SC >= 2767) { return 1; } } else if (Scindex >= 7) { if (CsDiff < 33) { return 0; } else if (CsDiff >= 33) { if (TSC < 22) { return 0; } else if (TSC >= 22) { return 1; } } } } else if (AFD >= 45) { if (gchDC < 6) { if (negBalance < 54) { if (diffRsCsdiff < 1516) { if (CsDiff < 16) { if (SC < 1792) { return 0; } else if (SC >= 1792) { return 1; } } else if (CsDiff >= 16) { return 0; } } else if (diffRsCsdiff >= 1516) { return 1; } } else if (negBalance >= 54) { return 1; } } else if (gchDC >= 6) { return 1; } } } } } } } } else if (posBalance >= 81) { if (CsDiff < 16) { if (diffMVdiffVal < 106) { if (RsCsDiff < 831) { if (MVDiff < 40) { return 1; } else if (MVDiff >= 40) { if (MVDiff < 645) { if (diffAFD < 30) { return 0; } else if (diffAFD >= 30) { if (AFD < 44) { if (diffMVdiffVal < 90) { return 0; } else if (diffMVdiffVal >= 90) { return 1; } } else if (AFD >= 44) { return 0; } } } else if (MVDiff >= 645) { return 1; } } } else if (RsCsDiff >= 831) { return 1; } } else if (diffMVdiffVal >= 106) { if (AFD < 51) { if (diffAFD < 32) { if (negBalance < 6) { return 0; } else if (negBalance >= 6) { if (diffRsCsdiff < 88) { if (SC < 797) { return 1; } else if (SC >= 797) { if (negBalance < 10) { return 1; } else if (negBalance >= 10) { if (TSC < 19) { return 1; } else if (TSC >= 19) { return 0; } } } } else if (diffRsCsdiff >= 88) { if (Rs < 2087) { return 1; } else if (Rs >= 2087) { if (Cs < 652) { return 0; } else if (Cs >= 652) { return 1; } } } } } else if (diffAFD >= 32) { if (negBalance < 8) { if (RsDiff < 11) { return 0; } else if (RsDiff >= 11) { return 1; } } else if (negBalance >= 8) { if (RsDiff < 5) { if (Cs < 600) { return 1; } else if (Cs >= 600) { return 0; } } else if (RsDiff >= 5) { return 1; } } } } else if (AFD >= 51) { if (RsDiff < 7) { if (MVDiff < 262) { if (Cs < 38) { return 0; } else if (Cs >= 38) { if (gchDC < 54) { return 0; } else if (gchDC >= 54) { return 1; } } } else if (MVDiff >= 262) { return 0; } } else if (RsDiff >= 7) { if (gchDC < 121) { if (Rs < 1599) { return 1; } else if (Rs >= 1599) { if (refDCval < 89) { return 1; } else if (refDCval >= 89) { return 0; } } } else if (gchDC >= 121) { return 0; } } } } } else if (CsDiff >= 16) { if (negBalance < 6) { if (ssDCval < 123) { return 1; } else if (ssDCval >= 123) { return 0; } } else if (negBalance >= 6) { if (diffTSC < 15) { if (diffTSC < 14) { return 1; } else if (diffTSC >= 14) { if (negBalance < 30) { return 0; } else if (negBalance >= 30) { return 1; } } } else if (diffTSC >= 15) { return 1; } } } } } } return 0; } bool SCDetect4(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 /*TSCindex*/, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (TSC < 16) { if (Rs < 569) { if (diffAFD < 9) { if (MVDiff < 127) { if (RsCsDiff < 510) { if (posBalance < 2) { if (Rs < 566) { if (SC < 76) { if (SC < 73) { if (negBalance < 106) { return 0; } else if (negBalance >= 106) { if (refDCval < 211) { return 0; } else if (refDCval >= 211) { return 1; } } } else if (SC >= 73) { return 1; } } else if (SC >= 76) { return 0; } } else if (Rs >= 566) { return 1; } } else if (posBalance >= 2) { if (diffAFD < 8) { return 0; } else if (diffAFD >= 8) { if (diffMVdiffVal < 85) { return 0; } else if (diffMVdiffVal >= 85) { return 1; } } } } else if (RsCsDiff >= 510) { if (RsCsDiff < 1568) { return 1; } else if (RsCsDiff >= 1568) { return 0; } } } else if (MVDiff >= 127) { if (negBalance < 66) { if (CsDiff < 3) { if (diffMVdiffVal < 224) { if (MVDiff < 1768) { return 0; } else if (MVDiff >= 1768) { if (gchDC < 101) { return 0; } else if (gchDC >= 101) { return 1; } } } else if (diffMVdiffVal >= 224) { if (MVDiff < 393) { if (Rs < 69) { if (AFD < 7) { return 0; } else if (AFD >= 7) { if (AFD < 9) { return 1; } else if (AFD >= 9) { return 0; } } } else if (Rs >= 69) { return 0; } } else if (MVDiff >= 393) { return 0; } } } else if (CsDiff >= 3) { if (Rs < 1) { return 1; } else if (Rs >= 1) { if (refDCval < 28) { if (TSC < 8) { return 1; } else if (TSC >= 8) { return 0; } } else if (refDCval >= 28) { if (SC < 539) { if (diffRsCsdiff < 8) { return 0; } else if (diffRsCsdiff >= 8) { if (Cs < 243) { return 0; } else if (Cs >= 243) { return 1; } } } else if (SC >= 539) { return 0; } } } } } else if (negBalance >= 66) { if (ssDCval < 25) { if (refDCval < 27) { if (negBalance < 71) { return 0; } else if (negBalance >= 71) { if (MVDiff < 2641) { return 1; } else if (MVDiff >= 2641) { return 0; } } } else if (refDCval >= 27) { return 1; } } else if (ssDCval >= 25) { if (posBalance < 42) { if (diffRsCsdiff < 36) { if (refDCval < 227) { if (diffRsCsdiff < -241) { if (diffRsCsdiff < -282) { return 0; } else if (diffRsCsdiff >= -282) { return 1; } } else if (diffRsCsdiff >= -241) { return 0; } } else if (refDCval >= 227) { if (ssDCval < 226) { if (TSC < 7) { return 1; } else if (TSC >= 7) { return 0; } } else if (ssDCval >= 226) { return 0; } } } else if (diffRsCsdiff >= 36) { if (Rs < 296) { return 1; } else if (Rs >= 296) { return 0; } } } else if (posBalance >= 42) { if (refDCval < 51) { if (diffAFD < 2) { return 0; } else if (diffAFD >= 2) { if (gchDC < 2) { return 0; } else if (gchDC >= 2) { return 1; } } } else if (refDCval >= 51) { if (posBalance < 59) { return 0; } else if (posBalance >= 59) { if (TSC < 14) { return 1; } else if (TSC >= 14) { return 0; } } } } } } } } else if (diffAFD >= 9) { if (diffMVdiffVal < 64) { if (refDCval < 65) { if (Rs < 99) { if (negBalance < 43) { if (RsDiff < 13) { return 0; } else if (RsDiff >= 13) { return 1; } } else if (negBalance >= 43) { if (RsDiff < 2) { return 1; } else if (RsDiff >= 2) { if (Rs < 86) { return 0; } else if (Rs >= 86) { return 1; } } } } else if (Rs >= 99) { if (CsDiff < 13) { if (negBalance < 54) { return 0; } else if (negBalance >= 54) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (SC < 1066) { return 1; } else if (SC >= 1066) { return 0; } } } } else if (CsDiff >= 13) { return 1; } } } else if (refDCval >= 65) { if (posBalance < 7) { if (posBalance < 6) { return 0; } else if (posBalance >= 6) { return 1; } } else if (posBalance >= 7) { return 0; } } } else if (diffMVdiffVal >= 64) { if (diffTSC < 6) { if (diffRsCsdiff < 53) { if (SC < 302) { if (refDCval < 78) { if (diffMVdiffVal < 234) { if (diffRsCsdiff < 14) { if (gchDC < 9) { if (SC < 58) { if (TSC < 6) { return 1; } else if (TSC >= 6) { return 0; } } else if (SC >= 58) { return 1; } } else if (gchDC >= 9) { if (gchDC < 20) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { if (SC < 125) { return 0; } else if (SC >= 125) { return 1; } } } else if (gchDC >= 20) { return 1; } } } else if (diffRsCsdiff >= 14) { return 1; } } else if (diffMVdiffVal >= 234) { if (gchDC < 5) { if (Rs < 16) { return 0; } else if (Rs >= 16) { return 1; } } else if (gchDC >= 5) { return 1; } } } else if (refDCval >= 78) { return 0; } } else if (SC >= 302) { if (refDCval < 45) { if (diffAFD < 10) { return 1; } else if (diffAFD >= 10) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { return 0; } } } else if (refDCval >= 45) { return 0; } } } else if (diffRsCsdiff >= 53) { if (diffTSC < 1) { if (Rs < 149) { return 1; } else if (Rs >= 149) { return 0; } } else if (diffTSC >= 1) { return 1; } } } else if (diffTSC >= 6) { if (ssDCval < 127) { if (diffAFD < 13) { if (SC < 274) { if (diffTSC < 8) { return 1; } else if (diffTSC >= 8) { if (Cs < 87) { return 1; } else if (Cs >= 87) { return 0; } } } else if (SC >= 274) { if (ssDCval < 47) { if (AFD < 11) { return 0; } else if (AFD >= 11) { return 1; } } else if (ssDCval >= 47) { if (diffRsCsdiff < 31) { return 0; } else if (diffRsCsdiff >= 31) { return 1; } } } } else if (diffAFD >= 13) { if (AFD < 31) { if (CsDiff < 1) { if (SC < 185) { return 1; } else if (SC >= 185) { return 0; } } else if (CsDiff >= 1) { return 1; } } else if (AFD >= 31) { if (RsCsDiff < 46) { if (Rs < 278) { if (Cs < 55) { if (Rs < 33) { return 1; } else if (Rs >= 33) { return 0; } } else if (Cs >= 55) { return 1; } } else if (Rs >= 278) { if (ssDCval < 61) { return 0; } else if (ssDCval >= 61) { return 1; } } } else if (RsCsDiff >= 46) { return 1; } } } } else if (ssDCval >= 127) { if (RsCsDiff < 43) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (TSC < 12) { return 1; } else if (TSC >= 12) { return 0; } } } else if (RsCsDiff >= 43) { if (diffAFD < 32) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { return 1; } } else if (diffAFD >= 32) { return 0; } } } } } } } else if (Rs >= 569) { if (diffAFD < 11) { if (refDCval < 21) { if (diffAFD < 2) { if (diffMVdiffVal < -1) { return 0; } else if (diffMVdiffVal >= -1) { if (MVDiff < 6) { if (AFD < 1) { if (RsCsDiff < 4) { return 0; } else if (RsCsDiff >= 4) { return 1; } } else if (AFD >= 1) { return 1; } } else if (MVDiff >= 6) { return 0; } } } else if (diffAFD >= 2) { return 1; } } else if (refDCval >= 21) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { if (ssDCval < 43) { if (RsCsDiff < 410) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { if (diffMVdiffVal < 92) { return 0; } else if (diffMVdiffVal >= 92) { return 1; } } } else if (RsCsDiff >= 410) { if (diffMVdiffVal < 12) { return 0; } else if (diffMVdiffVal >= 12) { return 1; } } } else if (ssDCval >= 43) { return 0; } } } } else if (diffAFD >= 11) { if (MVDiff < 56) { if (Cs < 340) { if (Rs < 1979) { return 0; } else if (Rs >= 1979) { if (AFD < 13) { return 0; } else if (AFD >= 13) { return 1; } } } else if (Cs >= 340) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { if (SC < 3770) { if (SC < 3706) { if (refDCval < 68) { if (SC < 2270) { return 0; } else if (SC >= 2270) { return 1; } } else if (refDCval >= 68) { return 0; } } else if (SC >= 3706) { return 1; } } else if (SC >= 3770) { return 0; } } } } else if (MVDiff >= 56) { if (diffMVdiffVal < 54) { if (ssDCval < 41) { if (AFD < 27) { return 1; } else if (AFD >= 27) { return 0; } } else if (ssDCval >= 41) { if (RsDiff < 22) { return 0; } else if (RsDiff >= 22) { if (Rs < 1833) { return 1; } else if (Rs >= 1833) { return 0; } } } } else if (diffMVdiffVal >= 54) { if (ssDCval < 75) { if (diffAFD < 17) { if (diffRsCsdiff < 84) { return 0; } else if (diffRsCsdiff >= 84) { if (Rs < 2030) { return 1; } else if (Rs >= 2030) { if (AFD < 18) { return 1; } else if (AFD >= 18) { return 0; } } } } else if (diffAFD >= 17) { if (diffRsCsdiff < 321) { if (Rs < 2062) { if (MVDiff < 178) { if (gchDC < 16) { if (diffTSC < 9) { if (RsDiff < 12) { return 0; } else if (RsDiff >= 12) { return 1; } } else if (diffTSC >= 9) { return 1; } } else if (gchDC >= 16) { return 0; } } else if (MVDiff >= 178) { return 1; } } else if (Rs >= 2062) { return 0; } } else if (diffRsCsdiff >= 321) { return 1; } } } else if (ssDCval >= 75) { if (diffAFD < 21) { if (Rs < 1277) { if (diffRsCsdiff < 84) { return 0; } else if (diffRsCsdiff >= 84) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { return 0; } } } else if (Rs >= 1277) { return 0; } } else if (diffAFD >= 21) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { if (Cs < 1995) { return 1; } else if (Cs >= 1995) { return 0; } } } } } } } } } else if (TSC >= 16) { if (diffTSC < 10) { if (Scindex < 5) { if (diffAFD < 13) { if (CsDiff < 20) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (AFD < 47) { if (CsDiff < 10) { if (Rs < 449) { if (SC < 968) { return 0; } else if (SC >= 968) { if (Rs < 444) { return 0; } else if (Rs >= 444) { return 1; } } } else if (Rs >= 449) { return 0; } } else if (CsDiff >= 10) { if (gchDC < 13) { if (MVDiff < 122) { if (RsDiff < 81) { return 0; } else if (RsDiff >= 81) { return 1; } } else if (MVDiff >= 122) { if (MVDiff < 140) { return 1; } else if (MVDiff >= 140) { if (negBalance < 54) { return 0; } else if (negBalance >= 54) { if (RsCsDiff < 547) { return 1; } else if (RsCsDiff >= 547) { return 0; } } } } } else if (gchDC >= 13) { if (refDCval < 47) { return 1; } else if (refDCval >= 47) { return 0; } } } } else if (AFD >= 47) { if (posBalance < 51) { if (diffRsCsdiff < 40) { if (Cs < 349) { return 1; } else if (Cs >= 349) { return 0; } } else if (diffRsCsdiff >= 40) { return 1; } } else if (posBalance >= 51) { if (RsCsDiff < 200) { return 0; } else if (RsCsDiff >= 200) { return 1; } } } } } else if (CsDiff >= 20) { if (SC < 3703) { if (diffMVdiffVal < 5) { return 1; } else if (diffMVdiffVal >= 5) { if (diffMVdiffVal < 98) { return 0; } else if (diffMVdiffVal >= 98) { return 1; } } } else if (SC >= 3703) { return 0; } } } else if (diffAFD >= 13) { if (RsCsDiff < 147) { if (negBalance < 89) { if (diffRsCsdiff < 82) { return 0; } else if (diffRsCsdiff >= 82) { if (MVDiff < 1455) { return 0; } else if (MVDiff >= 1455) { return 1; } } } else if (negBalance >= 89) { if (posBalance < 29) { if (Cs < 53) { return 1; } else if (Cs >= 53) { return 0; } } else if (posBalance >= 29) { return 1; } } } else if (RsCsDiff >= 147) { if (MVDiff < 526) { if (diffMVdiffVal < 193) { if (posBalance < 76) { if (MVDiff < 116) { return 1; } else if (MVDiff >= 116) { if (TSC < 20) { if (Cs < 969) { return 1; } else if (Cs >= 969) { return 0; } } else if (TSC >= 20) { if (Cs < 1425) { return 0; } else if (Cs >= 1425) { return 1; } } } } else if (posBalance >= 76) { return 0; } } else if (diffMVdiffVal >= 193) { if (diffMVdiffVal < 277) { return 1; } else if (diffMVdiffVal >= 277) { return 0; } } } else if (MVDiff >= 526) { if (Rs < 1749) { return 1; } else if (Rs >= 1749) { return 0; } } } } } else if (Scindex >= 5) { if (diffMVdiffVal < 36) { return 0; } else if (diffMVdiffVal >= 36) { if (CsDiff < 23) { return 0; } else if (CsDiff >= 23) { if (Cs < 2238) { return 1; } else if (Cs >= 2238) { if (refDCval < 160) { if (diffMVdiffVal < 205) { return 0; } else if (diffMVdiffVal >= 205) { if (Cs < 4026) { return 1; } else if (Cs >= 4026) { return 0; } } } else if (refDCval >= 160) { return 1; } } } } } } else if (diffTSC >= 10) { if (negBalance < 25) { if (CsDiff < 13) { if (diffMVdiffVal < 111) { if (gchDC < 127) { if (SC < 113) { return 1; } else if (SC >= 113) { if (RsCsDiff < 127) { if (MVDiff < 533) { return 0; } else if (MVDiff >= 533) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { return 0; } } } else if (RsCsDiff >= 127) { if (Cs < 683) { return 1; } else if (Cs >= 683) { if (refDCval < 26) { if (AFD < 33) { return 1; } else if (AFD >= 33) { return 0; } } else if (refDCval >= 26) { if (Rs < 1155) { if (Cs < 995) { return 1; } else if (Cs >= 995) { return 0; } } else if (Rs >= 1155) { return 0; } } } } } } else if (gchDC >= 127) { return 1; } } else if (diffMVdiffVal >= 111) { if (negBalance < 10) { if (diffAFD < 56) { if (ssDCval < 127) { if (SC < 122) { return 1; } else if (SC >= 122) { if (diffAFD < 17) { if (AFD < 22) { return 1; } else if (AFD >= 22) { return 0; } } else if (diffAFD >= 17) { return 0; } } } else if (ssDCval >= 127) { if (Cs < 1006) { return 1; } else if (Cs >= 1006) { return 0; } } } else if (diffAFD >= 56) { return 1; } } else if (negBalance >= 10) { if (refDCval < 58) { if (posBalance < 84) { return 1; } else if (posBalance >= 84) { if (SC < 290) { return 0; } else if (SC >= 290) { if (diffRsCsdiff < 187) { if (Rs < 904) { if (Cs < 576) { if (ssDCval < 68) { return 0; } else if (ssDCval >= 68) { if (diffTSC < 22) { return 1; } else if (diffTSC >= 22) { if (Cs < 272) { return 0; } else if (Cs >= 272) { return 1; } } } } else if (Cs >= 576) { return 1; } } else if (Rs >= 904) { return 0; } } else if (diffRsCsdiff >= 187) { return 1; } } } } else if (refDCval >= 58) { if (Rs < 1354) { return 1; } else if (Rs >= 1354) { if (Cs < 1131) { return 1; } else if (Cs >= 1131) { return 0; } } } } } } else if (CsDiff >= 13) { if (AFD < 44) { if (refDCval < 27) { return 1; } else if (refDCval >= 27) { if (Cs < 1316) { return 1; } else if (Cs >= 1316) { if (negBalance < 14) { return 0; } else if (negBalance >= 14) { if (diffTSC < 18) { return 0; } else if (diffTSC >= 18) { return 1; } } } } } else if (AFD >= 44) { if (MVDiff < 359) { if (SC < 4852) { return 1; } else if (SC >= 4852) { if (Cs < 5815) { return 0; } else if (Cs >= 5815) { return 1; } } } else if (MVDiff >= 359) { if (CsDiff < 18) { if (AFD < 63) { return 0; } else if (AFD >= 63) { return 1; } } else if (CsDiff >= 18) { return 1; } } } } } else if (negBalance >= 25) { if (diffRsCsdiff < 12) { if (diffMVdiffVal < 96) { return 0; } else if (diffMVdiffVal >= 96) { if (diffAFD < 11) { if (MVDiff < 1095) { return 0; } else if (MVDiff >= 1095) { return 1; } } else if (diffAFD >= 11) { if (AFD < 48) { if (Cs < 345) { if (refDCval < 39) { return 0; } else if (refDCval >= 39) { if (Rs < 22) { return 0; } else if (Rs >= 22) { return 1; } } } else if (Cs >= 345) { return 0; } } else if (AFD >= 48) { if (RsDiff < 5) { return 0; } else if (RsDiff >= 5) { if (TSC < 33) { if (AFD < 53) { return 0; } else if (AFD >= 53) { return 1; } } else if (TSC >= 33) { return 1; } } } } } } else if (diffRsCsdiff >= 12) { if (diffMVdiffVal < 62) { if (Cs < 448) { return 1; } else if (Cs >= 448) { if (diffAFD < 23) { if (refDCval < 59) { if (Rs < 5774) { return 0; } else if (Rs >= 5774) { return 1; } } else if (refDCval >= 59) { return 0; } } else if (diffAFD >= 23) { if (TSC < 24) { if (negBalance < 63) { if (diffMVdiffVal < 50) { if (diffAFD < 35) { if (gchDC < 5) { return 0; } else if (gchDC >= 5) { return 1; } } else if (diffAFD >= 35) { return 0; } } else if (diffMVdiffVal >= 50) { return 1; } } else if (negBalance >= 63) { return 0; } } else if (TSC >= 24) { if (Cs < 2677) { if (SC < 2388) { if (SC < 1637) { return 1; } else if (SC >= 1637) { return 0; } } else if (SC >= 2388) { return 1; } } else if (Cs >= 2677) { if (posBalance < 50) { return 0; } else if (posBalance >= 50) { if (Rs < 9944) { return 1; } else if (Rs >= 9944) { if (Rs < 11454) { return 0; } else if (Rs >= 11454) { return 1; } } } } } } } } else if (diffMVdiffVal >= 62) { if (diffRsCsdiff < 238) { if (SC < 3032) { if (diffMVdiffVal < 82) { if (diffMVdiffVal < 76) { if (diffAFD < 35) { if (Cs < 624) { return 1; } else if (Cs >= 624) { if (AFD < 55) { return 1; } else if (AFD >= 55) { return 0; } } } else if (diffAFD >= 35) { return 0; } } else if (diffMVdiffVal >= 76) { if (MVDiff < 93) { if (Rs < 1285) { return 1; } else if (Rs >= 1285) { return 0; } } else if (MVDiff >= 93) { return 0; } } } else if (diffMVdiffVal >= 82) { if (ssDCval < 92) { if (negBalance < 74) { if (MVDiff < 634) { if (RsDiff < 14) { if (SC < 324) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { return 1; } } else if (SC >= 324) { return 1; } } else if (RsDiff >= 14) { if (Cs < 679) { return 1; } else if (Cs >= 679) { return 0; } } } else if (MVDiff >= 634) { if (Rs < 762) { if (refDCval < 62) { if (Rs < 689) { return 1; } else if (Rs >= 689) { return 0; } } else if (refDCval >= 62) { return 0; } } else if (Rs >= 762) { return 1; } } } else if (negBalance >= 74) { return 1; } } else if (ssDCval >= 92) { if (refDCval < 83) { if (TSC < 20) { return 0; } else if (TSC >= 20) { if (diffAFD < 32) { if (Rs < 380) { return 1; } else if (Rs >= 380) { return 0; } } else if (diffAFD >= 32) { return 1; } } } else if (refDCval >= 83) { if (RsCsDiff < 98) { return 1; } else if (RsCsDiff >= 98) { if (refDCval < 151) { return 1; } else if (refDCval >= 151) { if (CsDiff < 6) { return 1; } else if (CsDiff >= 6) { if (SC < 437) { return 1; } else if (SC >= 437) { return 0; } } } } } } } } else if (SC >= 3032) { return 0; } } else if (diffRsCsdiff >= 238) { if (Rs < 2300) { if (MVDiff < 358) { return 1; } else if (MVDiff >= 358) { if (negBalance < 28) { if (AFD < 50) { return 0; } else if (AFD >= 50) { return 1; } } else if (negBalance >= 28) { return 1; } } } else if (Rs >= 2300) { if (diffRsCsdiff < 833) { if (diffAFD < 33) { if (diffMVdiffVal < 97) { return 1; } else if (diffMVdiffVal >= 97) { if (gchDC < 17) { return 1; } else if (gchDC >= 17) { return 0; } } } else if (diffAFD >= 33) { return 1; } } else if (diffRsCsdiff >= 833) { if (negBalance < 121) { if (diffAFD < 15) { return 0; } else if (diffAFD >= 15) { if (RsDiff < 22) { if (AFD < 66) { return 1; } else if (AFD >= 66) { return 0; } } else if (RsDiff >= 22) { return 1; } } } else if (negBalance >= 121) { return 0; } } } } } } } } } return 0; } bool SCDetect5(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffAFD < 12) { if (diffTSC < 4) { if (diffMVdiffVal < 53) { if (posBalance < 9) { if (RsDiff < 11) { if (CsDiff < 2) { if (negBalance < 123) { return 0; } else if (negBalance >= 123) { if (AFD < 1) { if (Rs < 17) { return 0; } else if (Rs >= 17) { return 1; } } else if (AFD >= 1) { if (diffTSC < -2) { if (MVDiff < 570) { return 0; } else if (MVDiff >= 570) { return 1; } } else if (diffTSC >= -2) { return 0; } } } } else if (CsDiff >= 2) { if (ssDCval < 18) { if (MVDiff < 6) { return 1; } else if (MVDiff >= 6) { if (TSCindex < 1) { if (Cs < 588) { return 1; } else if (Cs >= 588) { return 0; } } else if (TSCindex >= 1) { return 1; } } } else if (ssDCval >= 18) { return 0; } } } else if (RsDiff >= 11) { if (refDCval < 85) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { if (Rs < 234) { if (TSC < 1) { return 0; } else if (TSC >= 1) { return 1; } } else if (Rs >= 234) { return 1; } } } else if (refDCval >= 85) { return 0; } } } else if (posBalance >= 9) { if (AFD < 43) { if (RsCsDiff < 2455) { if (diffAFD < -7) { if (Cs < 27) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (Rs < 74) { return 1; } else if (Rs >= 74) { return 0; } } } else if (Cs >= 27) { if (negBalance < 46) { return 0; } else if (negBalance >= 46) { if (gchDC < 15) { return 0; } else if (gchDC >= 15) { if (posBalance < 62) { return 0; } else if (posBalance >= 62) { return 1; } } } } } else if (diffAFD >= -7) { if (diffTSC < -4) { if (SC < 307) { if (diffRsCsdiff < 11) { return 0; } else if (diffRsCsdiff >= 11) { return 1; } } else if (SC >= 307) { return 0; } } else if (diffTSC >= -4) { return 0; } } } else if (RsCsDiff >= 2455) { if (Scindex < 5) { if (Rs < 1541) { return 0; } else if (Rs >= 1541) { return 1; } } else if (Scindex >= 5) { return 0; } } } else if (AFD >= 43) { if (refDCval < 117) { if (refDCval < 116) { if (CsDiff < 19) { return 0; } else if (CsDiff >= 19) { if (Scindex < 5) { if (Cs < 1905) { return 1; } else if (Cs >= 1905) { return 0; } } else if (Scindex >= 5) { return 0; } } } else if (refDCval >= 116) { return 1; } } else if (refDCval >= 117) { return 0; } } } } else if (diffMVdiffVal >= 53) { if (gchDC < 124) { if (diffAFD < 7) { if (diffRsCsdiff < 12) { if (CsDiff < 6) { if (refDCval < 74) { if (ssDCval < 76) { if (posBalance < 80) { return 0; } else if (posBalance >= 80) { if (gchDC < 3) { if (diffMVdiffVal < 275) { return 0; } else if (diffMVdiffVal >= 275) { return 1; } } else if (gchDC >= 3) { return 0; } } } else if (ssDCval >= 76) { if (Rs < 901) { return 0; } else if (Rs >= 901) { if (AFD < 31) { return 0; } else if (AFD >= 31) { return 1; } } } } else if (refDCval >= 74) { return 0; } } else if (CsDiff >= 6) { if (ssDCval < 33) { return 1; } else if (ssDCval >= 33) { if (Scindex < 3) { if (TSC < 18) { return 0; } else if (TSC >= 18) { return 1; } } else if (Scindex >= 3) { return 0; } } } } else if (diffRsCsdiff >= 12) { if (SC < 980) { if (refDCval < 34) { return 1; } else if (refDCval >= 34) { if (Cs < 280) { return 0; } else if (Cs >= 280) { if (Cs < 290) { return 1; } else if (Cs >= 290) { if (MVDiff < 733) { if (AFD < 38) { return 0; } else if (AFD >= 38) { if (RsDiff < 5) { return 1; } else if (RsDiff >= 5) { return 0; } } } else if (MVDiff >= 733) { if (AFD < 25) { return 1; } else if (AFD >= 25) { return 0; } } } } } } else if (SC >= 980) { if (CsDiff < 26) { return 0; } else if (CsDiff >= 26) { if (RsDiff < 23) { return 1; } else if (RsDiff >= 23) { return 0; } } } } } else if (diffAFD >= 7) { if (posBalance < 50) { if (AFD < 16) { if (TSCindex < 7) { if (AFD < 9) { if (MVDiff < 201) { return 0; } else if (MVDiff >= 201) { return 1; } } else if (AFD >= 9) { return 1; } } else if (TSCindex >= 7) { if (negBalance < 70) { return 1; } else if (negBalance >= 70) { return 0; } } } else if (AFD >= 16) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { if (Cs < 460) { return 1; } else if (Cs >= 460) { if (AFD < 41) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (TSC < 10) { return 0; } else if (TSC >= 10) { return 1; } } } else if (AFD >= 41) { return 1; } } } } } else if (posBalance >= 50) { if (Cs < 1085) { return 0; } else if (Cs >= 1085) { if (Cs < 1120) { return 1; } else if (Cs >= 1120) { if (TSC < 6) { return 1; } else if (TSC >= 6) { return 0; } } } } } } else if (gchDC >= 124) { if (AFD < 27) { if (Rs < 7) { return 1; } else if (Rs >= 7) { if (AFD < 17) { return 1; } else if (AFD >= 17) { return 0; } } } else if (AFD >= 27) { return 0; } } } } else if (diffTSC >= 4) { if (diffMVdiffVal < 66) { if (refDCval < 34) { if (CsDiff < 9) { if (diffRsCsdiff < -15) { if (Cs < 385) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } else if (Cs >= 385) { return 0; } } else if (diffRsCsdiff >= -15) { if (SC < 5136) { return 0; } else if (SC >= 5136) { return 1; } } } else if (CsDiff >= 9) { return 1; } } else if (refDCval >= 34) { if (MVDiff < 63) { return 0; } else if (MVDiff >= 63) { if (TSC < 17) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (refDCval < 46) { if (refDCval < 41) { return 0; } else if (refDCval >= 41) { return 1; } } else if (refDCval >= 46) { return 0; } } } else if (TSC >= 17) { if (ssDCval < 87) { if (refDCval < 72) { if (MVDiff < 218) { return 0; } else if (MVDiff >= 218) { if (RsDiff < 11) { return 1; } else if (RsDiff >= 11) { return 0; } } } else if (refDCval >= 72) { if (SC < 1397) { return 0; } else if (SC >= 1397) { return 1; } } } else if (ssDCval >= 87) { return 0; } } } } } else if (diffMVdiffVal >= 66) { if (ssDCval < 50) { if (negBalance < 25) { if (SC < 2673) { return 0; } else if (SC >= 2673) { return 1; } } else if (negBalance >= 25) { if (MVDiff < 135) { return 1; } else if (MVDiff >= 135) { if (RsDiff < 2) { if (negBalance < 103) { return 1; } else if (negBalance >= 103) { return 0; } } else if (RsDiff >= 2) { if (Cs < 588) { if (MVDiff < 142) { return 0; } else if (MVDiff >= 142) { if (refDCval < 52) { if (Rs < 75) { return 0; } else if (Rs >= 75) { if (SC < 944) { return 1; } else if (SC >= 944) { return 0; } } } else if (refDCval >= 52) { return 0; } } } else if (Cs >= 588) { return 1; } } } } } else if (ssDCval >= 50) { if (SC < 2) { if (RsCsDiff < 31) { if (AFD < 15) { return 1; } else if (AFD >= 15) { return 0; } } else if (RsCsDiff >= 31) { return 1; } } else if (SC >= 2) { if (diffAFD < 8) { if (RsCsDiff < 775) { return 0; } else if (RsCsDiff >= 775) { return 1; } } else if (diffAFD >= 8) { if (RsDiff < 7) { if (posBalance < 115) { return 0; } else if (posBalance >= 115) { if (SC < 861) { return 1; } else if (SC >= 861) { return 0; } } } else if (RsDiff >= 7) { if (Cs < 383) { return 1; } else if (Cs >= 383) { if (diffRsCsdiff < 255) { if (MVDiff < 229) { if (diffMVdiffVal < 88) { return 0; } else if (diffMVdiffVal >= 88) { if (RsCsDiff < 90) { return 0; } else if (RsCsDiff >= 90) { return 1; } } } else if (MVDiff >= 229) { return 0; } } else if (diffRsCsdiff >= 255) { return 0; } } } } } } } } } else if (diffAFD >= 12) { if (diffMVdiffVal < 65) { if (MVDiff < 45) { if (refDCval < 32) { return 1; } else if (refDCval >= 32) { if (RsDiff < 68) { if (Cs < 542) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { return 1; } } else if (Cs >= 542) { return 0; } } else if (RsDiff >= 68) { if (TSC < 22) { return 0; } else if (TSC >= 22) { return 1; } } } } else if (MVDiff >= 45) { if (diffAFD < 23) { if (diffRsCsdiff < 5087) { if (diffAFD < 13) { return 0; } else if (diffAFD >= 13) { if (MVDiff < 706) { if (ssDCval < 33) { if (SC < 54) { return 0; } else if (SC >= 54) { return 1; } } else if (ssDCval >= 33) { if (diffMVdiffVal < -71) { if (negBalance < 78) { if (ssDCval < 100) { if (Rs < 1466) { if (gchDC < 8) { if (ssDCval < 74) { if (MVDiff < 308) { return 0; } else if (MVDiff >= 308) { if (Rs < 204) { return 0; } else if (Rs >= 204) { return 1; } } } else if (ssDCval >= 74) { return 1; } } else if (gchDC >= 8) { return 0; } } else if (Rs >= 1466) { return 1; } } else if (ssDCval >= 100) { return 0; } } else if (negBalance >= 78) { if (Rs < 1390) { if (RsCsDiff < 20) { return 0; } else if (RsCsDiff >= 20) { return 1; } } else if (Rs >= 1390) { return 0; } } } else if (diffMVdiffVal >= -71) { if (diffTSC < 7) { return 0; } else if (diffTSC >= 7) { if (TSC < 19) { if (refDCval < 22) { return 1; } else if (refDCval >= 22) { if (diffAFD < 14) { return 0; } else if (diffAFD >= 14) { if (AFD < 33) { if (negBalance < 18) { return 0; } else if (negBalance >= 18) { if (diffMVdiffVal < 36) { return 0; } else if (diffMVdiffVal >= 36) { if (RsCsDiff < 137) { if (Cs < 222) { return 1; } else if (Cs >= 222) { return 0; } } else if (RsCsDiff >= 137) { return 1; } } } } else if (AFD >= 33) { if (Cs < 777) { if (RsCsDiff < 124) { if (TSC < 17) { return 0; } else if (TSC >= 17) { return 1; } } else if (RsCsDiff >= 124) { return 0; } } else if (Cs >= 777) { return 1; } } } } } else if (TSC >= 19) { if (Rs < 7129) { return 0; } else if (Rs >= 7129) { if (Rs < 8092) { return 1; } else if (Rs >= 8092) { return 0; } } } } } } } else if (MVDiff >= 706) { return 1; } } } else if (diffRsCsdiff >= 5087) { return 1; } } else if (diffAFD >= 23) { if (RsCsDiff < 313) { if (gchDC < 20) { if (refDCval < 64) { return 0; } else if (refDCval >= 64) { if (TSC < 12) { return 0; } else if (TSC >= 12) { return 1; } } } else if (gchDC >= 20) { return 0; } } else if (RsCsDiff >= 313) { if (negBalance < 31) { if (TSC < 29) { return 0; } else if (TSC >= 29) { if (posBalance < 110) { return 1; } else if (posBalance >= 110) { return 0; } } } else if (negBalance >= 31) { if (Scindex < 6) { if (TSC < 12) { return 0; } else if (TSC >= 12) { if (AFD < 45) { if (MVDiff < 76) { return 1; } else if (MVDiff >= 76) { if (AFD < 30) { return 1; } else if (AFD >= 30) { return 0; } } } else if (AFD >= 45) { return 1; } } } else if (Scindex >= 6) { if (negBalance < 56) { if (Rs < 8691) { if (SC < 7680) { return 1; } else if (SC >= 7680) { return 0; } } else if (Rs >= 8691) { return 1; } } else if (negBalance >= 56) { return 0; } } } } } } } else if (diffMVdiffVal >= 65) { if (diffAFD < 23) { if (negBalance < 34) { if (refDCval < 33) { if (TSC < 13) { return 1; } else if (TSC >= 13) { if (RsCsDiff < 103) { if (diffMVdiffVal < 385) { return 0; } else if (diffMVdiffVal >= 385) { return 1; } } else if (RsCsDiff >= 103) { return 1; } } } else if (refDCval >= 33) { if (AFD < 20) { if (Cs < 128) { return 1; } else if (Cs >= 128) { if (TSC < 12) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (AFD < 18) { return 0; } else if (AFD >= 18) { return 1; } } } else if (TSC >= 12) { return 0; } } } else if (AFD >= 20) { if (diffRsCsdiff < 295) { if (diffRsCsdiff < 25) { if (AFD < 22) { if (Cs < 60) { return 1; } else if (Cs >= 60) { return 0; } } else if (AFD >= 22) { return 0; } } else if (diffRsCsdiff >= 25) { if (SC < 437) { return 1; } else if (SC >= 437) { if (Cs < 810) { if (RsCsDiff < 81) { if (Cs < 532) { if (AFD < 22) { if (refDCval < 69) { return 0; } else if (refDCval >= 69) { return 1; } } else if (AFD >= 22) { return 0; } } else if (Cs >= 532) { return 1; } } else if (RsCsDiff >= 81) { return 0; } } else if (Cs >= 810) { return 0; } } } } else if (diffRsCsdiff >= 295) { if (RsDiff < 19) { return 1; } else if (RsDiff >= 19) { if (SC < 7507) { if (MVDiff < 785) { return 0; } else if (MVDiff >= 785) { return 1; } } else if (SC >= 7507) { return 1; } } } } } } else if (negBalance >= 34) { if (Rs < 635) { if (diffTSC < -2) { return 0; } else if (diffTSC >= -2) { if (MVDiff < 119) { return 1; } else if (MVDiff >= 119) { if (MVDiff < 124) { return 0; } else if (MVDiff >= 124) { if (Rs < 141) { if (refDCval < 59) { return 1; } else if (refDCval >= 59) { if (CsDiff < 6) { if (diffMVdiffVal < 119) { return 0; } else if (diffMVdiffVal >= 119) { if (CsDiff < 5) { if (AFD < 32) { return 1; } else if (AFD >= 32) { if (ssDCval < 31) { return 1; } else if (ssDCval >= 31) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { return 1; } } } } else if (CsDiff >= 5) { return 0; } } } else if (CsDiff >= 6) { return 1; } } } else if (Rs >= 141) { if (AFD < 45) { if (CsDiff < 3) { if (AFD < 19) { return 1; } else if (AFD >= 19) { if (ssDCval < 48) { return 1; } else if (ssDCval >= 48) { return 0; } } } else if (CsDiff >= 3) { if (gchDC < 12) { return 1; } else if (gchDC >= 12) { if (diffAFD < 14) { if (gchDC < 26) { return 0; } else if (gchDC >= 26) { return 1; } } else if (diffAFD >= 14) { return 1; } } } } else if (AFD >= 45) { if (Cs < 727) { if (ssDCval < 62) { if (TSC < 19) { return 0; } else if (TSC >= 19) { return 1; } } else if (ssDCval >= 62) { return 0; } } else if (Cs >= 727) { return 1; } } } } } } } else if (Rs >= 635) { if (diffTSC < 6) { if (MVDiff < 1256) { return 0; } else if (MVDiff >= 1256) { return 1; } } else if (diffTSC >= 6) { if (diffRsCsdiff < 80) { if (RsCsDiff < 80) { if (SC < 1448) { return 0; } else if (SC >= 1448) { if (refDCval < 116) { return 0; } else if (refDCval >= 116) { return 1; } } } else if (RsCsDiff >= 80) { return 0; } } else if (diffRsCsdiff >= 80) { if (Rs < 1860) { if (diffRsCsdiff < 126) { if (negBalance < 45) { return 1; } else if (negBalance >= 45) { return 0; } } else if (diffRsCsdiff >= 126) { return 1; } } else if (Rs >= 1860) { if (refDCval < 135) { if (diffTSC < 10) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { if (RsCsDiff < 515) { return 0; } else if (RsCsDiff >= 515) { return 1; } } } else if (diffTSC >= 10) { return 1; } } else if (refDCval >= 135) { return 0; } } } } } } } else if (diffAFD >= 23) { if (negBalance < 27) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { if (refDCval < 54) { if (TSC < 23) { if (diffTSC < 20) { if (diffTSC < 14) { if (TSC < 13) { return 1; } else if (TSC >= 13) { return 0; } } else if (diffTSC >= 14) { return 1; } } else if (diffTSC >= 20) { if (MVDiff < 694) { return 1; } else if (MVDiff >= 694) { return 0; } } } else if (TSC >= 23) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (diffMVdiffVal < 154) { if (posBalance < 86) { return 1; } else if (posBalance >= 86) { if (AFD < 49) { if (AFD < 29) { if (Cs < 1742) { return 0; } else if (Cs >= 1742) { return 1; } } else if (AFD >= 29) { return 0; } } else if (AFD >= 49) { if (AFD < 61) { return 1; } else if (AFD >= 61) { return 0; } } } } else if (diffMVdiffVal >= 154) { if (gchDC < 76) { if (negBalance < 12) { return 0; } else if (negBalance >= 12) { if (ssDCval < 116) { if (gchDC < 42) { if (Rs < 1077) { return 1; } else if (Rs >= 1077) { return 0; } } else if (gchDC >= 42) { return 1; } } else if (ssDCval >= 116) { return 0; } } } else if (gchDC >= 76) { if (Rs < 3011) { return 1; } else if (Rs >= 3011) { return 0; } } } } } } else if (refDCval >= 54) { if (diffMVdiffVal < 132) { if (MVDiff < 103) { return 1; } else if (MVDiff >= 103) { if (RsDiff < 10) { return 0; } else if (RsDiff >= 10) { if (SC < 4408) { return 1; } else if (SC >= 4408) { if (RsCsDiff < 989) { return 0; } else if (RsCsDiff >= 989) { return 1; } } } } } else if (diffMVdiffVal >= 132) { if (RsDiff < 3) { if (Rs < 151) { return 1; } else if (Rs >= 151) { return 0; } } else if (RsDiff >= 3) { if (diffAFD < 24) { if (RsDiff < 32) { return 0; } else if (RsDiff >= 32) { return 1; } } else if (diffAFD >= 24) { if (TSC < 34) { return 1; } else if (TSC >= 34) { if (RsCsDiff < 183) { return 0; } else if (RsCsDiff >= 183) { return 1; } } } } } } } } else if (negBalance >= 27) { if (diffRsCsdiff < 254) { if (AFD < 54) { if (RsDiff < 15) { if (diffMVdiffVal < 80) { if (posBalance < 50) { return 1; } else if (posBalance >= 50) { return 0; } } else if (diffMVdiffVal >= 80) { if (MVDiff < 595) { if (diffMVdiffVal < 129) { if (MVDiff < 158) { if (AFD < 39) { return 1; } else if (AFD >= 39) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { return 1; } } } else if (MVDiff >= 158) { if (AFD < 51) { if (CsDiff < 7) { return 0; } else if (CsDiff >= 7) { return 1; } } else if (AFD >= 51) { return 1; } } } else if (diffMVdiffVal >= 129) { if (AFD < 41) { return 1; } else if (AFD >= 41) { if (ssDCval < 36) { return 0; } else if (ssDCval >= 36) { if (Cs < 1469) { if (TSC < 38) { return 1; } else if (TSC >= 38) { return 0; } } else if (Cs >= 1469) { return 0; } } } } } else if (MVDiff >= 595) { if (diffAFD < 25) { return 0; } else if (diffAFD >= 25) { if (TSC < 21) { return 1; } else if (TSC >= 21) { if (refDCval < 79) { if (diffMVdiffVal < 663) { return 0; } else if (diffMVdiffVal >= 663) { return 1; } } else if (refDCval >= 79) { return 1; } } } } } } else if (RsDiff >= 15) { if (MVDiff < 229) { return 0; } else if (MVDiff >= 229) { return 1; } } } else if (AFD >= 54) { if (MVDiff < 331) { if (diffAFD < 39) { if (MVDiff < 149) { return 1; } else if (MVDiff >= 149) { if (Rs < 38) { return 1; } else if (Rs >= 38) { return 0; } } } else if (diffAFD >= 39) { return 1; } } else if (MVDiff >= 331) { if (diffAFD < 43) { if (Cs < 883) { if (diffRsCsdiff < 54) { if (Rs < 1055) { return 0; } else if (Rs >= 1055) { return 1; } } else if (diffRsCsdiff >= 54) { return 1; } } else if (Cs >= 883) { return 0; } } else if (diffAFD >= 43) { if (TSC < 59) { if (diffMVdiffVal < 886) { return 1; } else if (diffMVdiffVal >= 886) { if (AFD < 56) { return 0; } else if (AFD >= 56) { return 1; } } } else if (TSC >= 59) { return 0; } } } } } else if (diffRsCsdiff >= 254) { if (diffTSC < 16) { if (gchDC < 22) { if (TSC < 10) { if (Rs < 2761) { return 0; } else if (Rs >= 2761) { return 1; } } else if (TSC >= 10) { return 1; } } else if (gchDC >= 22) { if (diffAFD < 27) { if (TSC < 23) { if (Rs < 2076) { return 1; } else if (Rs >= 2076) { return 0; } } else if (TSC >= 23) { if (SC < 4161) { return 0; } else if (SC >= 4161) { return 1; } } } else if (diffAFD >= 27) { return 1; } } } else if (diffTSC >= 16) { if (RsCsDiff < 4065) { if (SC < 4994) { return 1; } else if (SC >= 4994) { if (RsCsDiff < 1233) { if (AFD < 63) { return 1; } else if (AFD >= 63) { return 0; } } else if (RsCsDiff >= 1233) { return 1; } } } else if (RsCsDiff >= 4065) { if (negBalance < 114) { if (negBalance < 43) { if (gchDC < 7) { return 0; } else if (gchDC >= 7) { return 1; } } else if (negBalance >= 43) { return 1; } } else if (negBalance >= 114) { return 0; } } } } } } } } return 0; } bool SCDetect6(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffMVdiffVal < 66) { if (diffTSC < 12) { if (MVDiff < 42) { if (diffAFD < 4) { if (Scindex < 1) { if (negBalance < 106) { if (diffRsCsdiff < -2) { if (MVDiff < 4) { if (gchDC < 104) { return 0; } else if (gchDC >= 104) { return 1; } } else if (MVDiff >= 4) { return 0; } } else if (diffRsCsdiff >= -2) { return 0; } } else if (negBalance >= 106) { if (refDCval < 226) { return 0; } else if (refDCval >= 226) { return 1; } } } else if (Scindex >= 1) { if (TSC < 2) { if (CsDiff < 4) { if (diffRsCsdiff < 7) { return 0; } else if (diffRsCsdiff >= 7) { if (refDCval < 20) { return 1; } else if (refDCval >= 20) { return 0; } } } else if (CsDiff >= 4) { if (SC < 2341) { if (Rs < 613) { return 0; } else if (Rs >= 613) { if (MVDiff < 2) { return 0; } else if (MVDiff >= 2) { return 1; } } } else if (SC >= 2341) { return 0; } } } else if (TSC >= 2) { return 0; } } } else if (diffAFD >= 4) { if (refDCval < 22) { if (Cs < 742) { return 0; } else if (Cs >= 742) { return 1; } } else if (refDCval >= 22) { return 0; } } } else if (MVDiff >= 42) { if (diffAFD < 10) { if (CsDiff < 16) { if (ssDCval < 38) { if (TSCindex < 8) { if (RsCsDiff < 5) { return 0; } else if (RsCsDiff >= 5) { if (AFD < 1) { if (ssDCval < 17) { return 1; } else if (ssDCval >= 17) { return 0; } } else if (AFD >= 1) { if (Scindex < 1) { if (Cs < 44) { return 0; } else if (Cs >= 44) { return 1; } } else if (Scindex >= 1) { return 0; } } } } else if (TSCindex >= 8) { if (CsDiff < 5) { if (MVDiff < 143) { return 0; } else if (MVDiff >= 143) { if (negBalance < 66) { return 1; } else if (negBalance >= 66) { if (posBalance < 36) { return 0; } else if (posBalance >= 36) { if (RsCsDiff < 39) { return 1; } else if (RsCsDiff >= 39) { return 0; } } } } } else if (CsDiff >= 5) { return 0; } } } else if (ssDCval >= 38) { if (diffTSC < 6) { if (refDCval < 230) { if (TSC < 17) { return 0; } else if (TSC >= 17) { if (ssDCval < 46) { if (RsCsDiff < 296) { return 0; } else if (RsCsDiff >= 296) { return 1; } } else if (ssDCval >= 46) { return 0; } } } else if (refDCval >= 230) { if (gchDC < 5) { return 0; } else if (gchDC >= 5) { if (negBalance < 126) { return 1; } else if (negBalance >= 126) { return 0; } } } } else if (diffTSC >= 6) { if (Rs < 601) { return 0; } else if (Rs >= 601) { if (diffMVdiffVal < -26) { if (diffMVdiffVal < -40) { if (MVDiff < 458) { return 0; } else if (MVDiff >= 458) { return 1; } } else if (diffMVdiffVal >= -40) { return 1; } } else if (diffMVdiffVal >= -26) { if (gchDC < 2) { if (AFD < 24) { return 0; } else if (AFD >= 24) { return 1; } } else if (gchDC >= 2) { return 0; } } } } } } else if (CsDiff >= 16) { if (AFD < 10) { if (posBalance < 6) { if (SC < 604) { return 0; } else if (SC >= 604) { return 1; } } else if (posBalance >= 6) { if (diffAFD < 6) { if (diffMVdiffVal < 22) { return 0; } else if (diffMVdiffVal >= 22) { if (Cs < 2019) { return 1; } else if (Cs >= 2019) { return 0; } } } else if (diffAFD >= 6) { if (Rs < 3753) { return 0; } else if (Rs >= 3753) { return 1; } } } } else if (AFD >= 10) { if (AFD < 57) { if (MVDiff < 499) { return 0; } else if (MVDiff >= 499) { if (SC < 6135) { return 1; } else if (SC >= 6135) { return 0; } } } else if (AFD >= 57) { if (SC < 3705) { return 1; } else if (SC >= 3705) { return 0; } } } } } else if (diffAFD >= 10) { if (ssDCval < 52) { if (RsCsDiff < 236) { if (negBalance < 41) { return 0; } else if (negBalance >= 41) { if (negBalance < 42) { return 1; } else if (negBalance >= 42) { if (MVDiff < 155) { if (diffMVdiffVal < -6) { if (AFD < 16) { return 0; } else if (AFD >= 16) { return 1; } } else if (diffMVdiffVal >= -6) { return 0; } } else if (MVDiff >= 155) { if (Cs < 177) { return 1; } else if (Cs >= 177) { if (Cs < 482) { return 0; } else if (Cs >= 482) { return 1; } } } } } } else if (RsCsDiff >= 236) { if (diffAFD < 19) { return 1; } else if (diffAFD >= 19) { return 0; } } } else if (ssDCval >= 52) { if (diffAFD < 21) { if (AFD < 35) { return 0; } else if (AFD >= 35) { if (diffRsCsdiff < 1075) { if (Rs < 41) { if (SC < 13) { return 0; } else if (SC >= 13) { if (Cs < 23) { return 1; } else if (Cs >= 23) { return 0; } } } else if (Rs >= 41) { return 0; } } else if (diffRsCsdiff >= 1075) { return 1; } } } else if (diffAFD >= 21) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { if (Scindex < 5) { if (posBalance < 57) { return 1; } else if (posBalance >= 57) { if (diffMVdiffVal < 50) { if (MVDiff < 306) { return 0; } else if (MVDiff >= 306) { return 1; } } else if (diffMVdiffVal >= 50) { return 1; } } } else if (Scindex >= 5) { return 0; } } } } } } } else if (diffTSC >= 12) { if (diffAFD < 25) { if (diffTSC < 13) { if (MVDiff < 370) { return 0; } else if (MVDiff >= 370) { if (RsCsDiff < 125) { return 0; } else if (RsCsDiff >= 125) { return 1; } } } else if (diffTSC >= 13) { if (RsCsDiff < 618) { if (Cs < 1132) { if (RsCsDiff < 115) { if (MVDiff < 140) { if (refDCval < 24) { return 1; } else if (refDCval >= 24) { if (negBalance < 27) { return 0; } else if (negBalance >= 27) { if (Rs < 783) { return 1; } else if (Rs >= 783) { return 0; } } } } else if (MVDiff >= 140) { if (MVDiff < 544) { return 0; } else if (MVDiff >= 544) { if (RsCsDiff < 6) { return 0; } else if (RsCsDiff >= 6) { return 1; } } } } else if (RsCsDiff >= 115) { if (RsDiff < 13) { if (RsCsDiff < 149) { if (TSC < 25) { return 0; } else if (TSC >= 25) { return 1; } } else if (RsCsDiff >= 149) { return 1; } } else if (RsDiff >= 13) { if (CsDiff < 4) { if (TSC < 18) { return 1; } else if (TSC >= 18) { return 0; } } else if (CsDiff >= 4) { return 0; } } } } else if (Cs >= 1132) { if (RsCsDiff < 381) { return 0; } else if (RsCsDiff >= 381) { if (TSC < 42) { return 0; } else if (TSC >= 42) { return 1; } } } } else if (RsCsDiff >= 618) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { return 1; } } } } else if (diffAFD >= 25) { if (RsCsDiff < 389) { if (MVDiff < 22) { return 1; } else if (MVDiff >= 22) { if (gchDC < 20) { if (TSC < 16) { return 0; } else if (TSC >= 16) { if (refDCval < 56) { if (SC < 381) { return 0; } else if (SC >= 381) { return 1; } } else if (refDCval >= 56) { return 1; } } } else if (gchDC >= 20) { if (SC < 2725) { return 0; } else if (SC >= 2725) { if (MVDiff < 89) { return 0; } else if (MVDiff >= 89) { if (RsCsDiff < 258) { return 0; } else if (RsCsDiff >= 258) { return 1; } } } } } } else if (RsCsDiff >= 389) { if (ssDCval < 111) { if (refDCval < 82) { return 1; } else if (refDCval >= 82) { if (SC < 5837) { return 1; } else if (SC >= 5837) { if (Rs < 4505) { return 0; } else if (Rs >= 4505) { return 1; } } } } else if (ssDCval >= 111) { if (AFD < 36) { return 0; } else if (AFD >= 36) { if (Rs < 1752) { if (RsCsDiff < 502) { return 1; } else if (RsCsDiff >= 502) { return 0; } } else if (Rs >= 1752) { if (negBalance < 28) { if (CsDiff < 13) { return 1; } else if (CsDiff >= 13) { return 0; } } else if (negBalance >= 28) { return 1; } } } } } } } } else if (diffMVdiffVal >= 66) { if (diffAFD < 12) { if (diffAFD < 7) { if (diffTSC < 4) { if (gchDC < 108) { if (CsDiff < 5) { if (ssDCval < 24) { if (gchDC < 42) { return 0; } else if (gchDC >= 42) { return 1; } } else if (ssDCval >= 24) { return 0; } } else if (CsDiff >= 5) { if (SC < 1444) { if (diffRsCsdiff < 65) { if (gchDC < 13) { if (TSC < 14) { if (refDCval < 39) { if (Rs < 508) { if (diffAFD < -3) { return 0; } else if (diffAFD >= -3) { return 1; } } else if (Rs >= 508) { return 0; } } else if (refDCval >= 39) { return 0; } } else if (TSC >= 14) { return 1; } } else if (gchDC >= 13) { return 0; } } else if (diffRsCsdiff >= 65) { if (refDCval < 111) { return 1; } else if (refDCval >= 111) { return 0; } } } else if (SC >= 1444) { if (Cs < 6689) { return 0; } else if (Cs >= 6689) { return 1; } } } } else if (gchDC >= 108) { if (Cs < 9) { if (refDCval < 99) { return 0; } else if (refDCval >= 99) { return 1; } } else if (Cs >= 9) { return 0; } } } else if (diffTSC >= 4) { if (CsDiff < 19) { if (SC < 4) { if (TSC < 14) { return 0; } else if (TSC >= 14) { return 1; } } else if (SC >= 4) { if (diffMVdiffVal < 208) { if (negBalance < 122) { return 0; } else if (negBalance >= 122) { if (Cs < 471) { return 0; } else if (Cs >= 471) { return 1; } } } else if (diffMVdiffVal >= 208) { if (diffTSC < 5) { if (Cs < 23) { return 0; } else if (Cs >= 23) { return 1; } } else if (diffTSC >= 5) { if (Cs < 612) { return 0; } else if (Cs >= 612) { if (Rs < 1548) { return 1; } else if (Rs >= 1548) { return 0; } } } } } } else if (CsDiff >= 19) { if (MVDiff < 198) { return 0; } else if (MVDiff >= 198) { return 1; } } } } else if (diffAFD >= 7) { if (ssDCval < 45) { if (gchDC < 5) { if (RsCsDiff < 23) { return 1; } else if (RsCsDiff >= 23) { if (Rs < 468) { if (diffAFD < 10) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } else if (diffAFD >= 10) { return 0; } } else if (Rs >= 468) { return 1; } } } else if (gchDC >= 5) { if (RsDiff < 5) { if (AFD < 13) { if (Rs < 35) { return 0; } else if (Rs >= 35) { return 1; } } else if (AFD >= 13) { if (diffRsCsdiff < 17) { if (TSC < 6) { if (AFD < 16) { return 1; } else if (AFD >= 16) { return 0; } } else if (TSC >= 6) { return 0; } } else if (diffRsCsdiff >= 17) { return 1; } } } else if (RsDiff >= 5) { return 1; } } } else if (ssDCval >= 45) { if (AFD < 13) { if (SC < 958) { return 1; } else if (SC >= 958) { return 0; } } else if (AFD >= 13) { if (Cs < 694) { if (RsDiff < 5) { if (diffMVdiffVal < 391) { return 0; } else if (diffMVdiffVal >= 391) { if (AFD < 16) { return 1; } else if (AFD >= 16) { return 0; } } } else if (RsDiff >= 5) { if (Scindex < 3) { if (diffRsCsdiff < 31) { return 0; } else if (diffRsCsdiff >= 31) { return 1; } } else if (Scindex >= 3) { if (gchDC < 8) { if (TSC < 12) { return 0; } else if (TSC >= 12) { if (diffTSC < -4) { return 0; } else if (diffTSC >= -4) { return 1; } } } else if (gchDC >= 8) { return 0; } } } } else if (Cs >= 694) { if (RsDiff < 33) { return 0; } else if (RsDiff >= 33) { if (Rs < 2231) { return 1; } else if (Rs >= 2231) { return 0; } } } } } } } else if (diffAFD >= 12) { if (diffMVdiffVal < 93) { if (MVDiff < 100) { if (posBalance < 100) { if (AFD < 32) { if (RsCsDiff < 145) { if (Scindex < 4) { if (Cs < 678) { return 1; } else if (Cs >= 678) { return 0; } } else if (Scindex >= 4) { return 0; } } else if (RsCsDiff >= 145) { return 1; } } else if (AFD >= 32) { if (Scindex < 8) { return 1; } else if (Scindex >= 8) { if (ssDCval < 136) { return 1; } else if (ssDCval >= 136) { return 0; } } } } else if (posBalance >= 100) { if (MVDiff < 75) { return 1; } else if (MVDiff >= 75) { if (Cs < 661) { return 1; } else if (Cs >= 661) { return 0; } } } } else if (MVDiff >= 100) { if (diffRsCsdiff < 27) { return 0; } else if (diffRsCsdiff >= 27) { if (posBalance < 61) { if (diffMVdiffVal < 89) { if (diffAFD < 18) { return 0; } else if (diffAFD >= 18) { if (MVDiff < 144) { return 1; } else if (MVDiff >= 144) { if (Cs < 404) { return 1; } else if (Cs >= 404) { return 0; } } } } else if (diffMVdiffVal >= 89) { return 1; } } else if (posBalance >= 61) { if (Cs < 3592) { if (Rs < 411) { return 1; } else if (Rs >= 411) { if (Cs < 225) { return 1; } else if (Cs >= 225) { if (MVDiff < 107) { if (Cs < 1368) { return 1; } else if (Cs >= 1368) { return 0; } } else if (MVDiff >= 107) { return 0; } } } } else if (Cs >= 3592) { return 1; } } } } } else if (diffMVdiffVal >= 93) { if (diffRsCsdiff < 58) { if (Cs < 591) { if (diffRsCsdiff < 2) { if (Cs < 264) { if (AFD < 46) { if (negBalance < 43) { if (TSC < 11) { if (Rs < 119) { return 1; } else if (Rs >= 119) { return 0; } } else if (TSC >= 11) { if (TSC < 21) { if (diffMVdiffVal < 169) { if (MVDiff < 254) { return 0; } else if (MVDiff >= 254) { return 1; } } else if (diffMVdiffVal >= 169) { return 0; } } else if (TSC >= 21) { return 1; } } } else if (negBalance >= 43) { if (CsDiff < 3) { if (RsDiff < 1) { return 1; } else if (RsDiff >= 1) { if (Cs < 33) { return 0; } else if (Cs >= 33) { if (Cs < 146) { return 1; } else if (Cs >= 146) { return 0; } } } } else if (CsDiff >= 3) { return 1; } } } else if (AFD >= 46) { return 0; } } else if (Cs >= 264) { if (diffRsCsdiff < -152) { return 1; } else if (diffRsCsdiff >= -152) { return 0; } } } else if (diffRsCsdiff >= 2) { if (gchDC < 14) { if (gchDC < 5) { return 1; } else if (gchDC >= 5) { if (posBalance < 71) { if (ssDCval < 44) { return 1; } else if (ssDCval >= 44) { if (CsDiff < 3) { if (posBalance < 46) { return 1; } else if (posBalance >= 46) { return 0; } } else if (CsDiff >= 3) { if (ssDCval < 46) { return 0; } else if (ssDCval >= 46) { return 1; } } } } else if (posBalance >= 71) { return 1; } } } else if (gchDC >= 14) { if (Rs < 151) { if (diffAFD < 15) { if (MVDiff < 183) { return 1; } else if (MVDiff >= 183) { if (gchDC < 43) { return 0; } else if (gchDC >= 43) { if (SC < 130) { return 0; } else if (SC >= 130) { return 1; } } } } else if (diffAFD >= 15) { if (gchDC < 42) { return 1; } else if (gchDC >= 42) { if (gchDC < 46) { if (CsDiff < 2) { return 1; } else if (CsDiff >= 2) { return 0; } } else if (gchDC >= 46) { if (refDCval < 54) { return 0; } else if (refDCval >= 54) { return 1; } } } } } else if (Rs >= 151) { if (posBalance < 92) { if (diffTSC < 12) { if (gchDC < 27) { if (posBalance < 80) { return 0; } else if (posBalance >= 80) { if (gchDC < 18) { return 1; } else if (gchDC >= 18) { return 0; } } } else if (gchDC >= 27) { return 1; } } else if (diffTSC >= 12) { if (diffTSC < 47) { if (diffMVdiffVal < 219) { if (AFD < 39) { return 1; } else if (AFD >= 39) { if (AFD < 43) { return 0; } else if (AFD >= 43) { return 1; } } } else if (diffMVdiffVal >= 219) { return 1; } } else if (diffTSC >= 47) { return 0; } } } else if (posBalance >= 92) { if (diffTSC < 13) { if (CsDiff < 6) { if (Cs < 271) { if (AFD < 21) { return 1; } else if (AFD >= 21) { return 0; } } else if (Cs >= 271) { return 0; } } else if (CsDiff >= 6) { return 1; } } else if (diffTSC >= 13) { if (negBalance < 10) { if (MVDiff < 823) { if (AFD < 21) { return 1; } else if (AFD >= 21) { return 0; } } else if (MVDiff >= 823) { return 1; } } else if (negBalance >= 10) { if (diffAFD < 39) { if (diffTSC < 19) { return 1; } else if (diffTSC >= 19) { if (ssDCval < 116) { return 0; } else if (ssDCval >= 116) { return 1; } } } else if (diffAFD >= 39) { return 0; } } } } } } } } else if (Cs >= 591) { if (Cs < 803) { if (ssDCval < 66) { if (diffAFD < 21) { return 0; } else if (diffAFD >= 21) { return 1; } } else if (ssDCval >= 66) { if (SC < 1651) { if (SC < 985) { if (diffMVdiffVal < 536) { return 0; } else if (diffMVdiffVal >= 536) { return 1; } } else if (SC >= 985) { return 0; } } else if (SC >= 1651) { return 1; } } } else if (Cs >= 803) { return 0; } } } else if (diffRsCsdiff >= 58) { if (diffTSC < 12) { if (SC < 1749) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (negBalance < 8) { if (diffTSC < 8) { return 1; } else if (diffTSC >= 8) { return 0; } } else if (negBalance >= 8) { if (diffMVdiffVal < 105) { if (MVDiff < 133) { return 1; } else if (MVDiff >= 133) { return 0; } } else if (diffMVdiffVal >= 105) { return 1; } } } } else if (SC >= 1749) { if (ssDCval < 58) { if (SC < 3505) { return 1; } else if (SC >= 3505) { if (TSC < 13) { return 0; } else if (TSC >= 13) { return 1; } } } else if (ssDCval >= 58) { if (posBalance < 69) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { if (RsDiff < 34) { if (MVDiff < 227) { if (ssDCval < 75) { return 1; } else if (ssDCval >= 75) { return 0; } } else if (MVDiff >= 227) { if (posBalance < 39) { return 0; } else if (posBalance >= 39) { if (CsDiff < 14) { return 0; } else if (CsDiff >= 14) { return 1; } } } } else if (RsDiff >= 34) { return 1; } } } } else if (posBalance >= 69) { if (SC < 7378) { return 0; } else if (SC >= 7378) { return 1; } } } } } else if (diffTSC >= 12) { if (gchDC < 21) { if (MVDiff < 1206) { return 1; } else if (MVDiff >= 1206) { if (Scindex < 4) { if (Rs < 513) { return 0; } else if (Rs >= 513) { return 1; } } else if (Scindex >= 4) { return 1; } } } else if (gchDC >= 21) { if (negBalance < 3) { if (Rs < 261) { return 1; } else if (Rs >= 261) { if (diffTSC < 41) { return 0; } else if (diffTSC >= 41) { if (AFD < 56) { return 0; } else if (AFD >= 56) { return 1; } } } } else if (negBalance >= 3) { if (Rs < 724) { return 1; } else if (Rs >= 724) { if (diffTSC < 17) { if (Rs < 2290) { if (TSC < 29) { return 1; } else if (TSC >= 29) { if (Cs < 2405) { return 0; } else if (Cs >= 2405) { return 1; } } } else if (Rs >= 2290) { if (AFD < 34) { return 1; } else if (AFD >= 34) { if (refDCval < 116) { return 0; } else if (refDCval >= 116) { return 1; } } } } else if (diffTSC >= 17) { if (diffRsCsdiff < 181) { if (diffMVdiffVal < 450) { if (MVDiff < 415) { if (CsDiff < 7) { if (diffAFD < 35) { if (negBalance < 89) { return 0; } else if (negBalance >= 89) { if (AFD < 40) { return 1; } else if (AFD >= 40) { return 0; } } } else if (diffAFD >= 35) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { return 1; } } } else if (CsDiff >= 7) { return 1; } } else if (MVDiff >= 415) { if (SC < 1589) { return 1; } else if (SC >= 1589) { return 0; } } } else if (diffMVdiffVal >= 450) { return 1; } } else if (diffRsCsdiff >= 181) { if (negBalance < 21) { if (diffMVdiffVal < 117) { if (Rs < 1867) { return 0; } else if (Rs >= 1867) { return 1; } } else if (diffMVdiffVal >= 117) { if (posBalance < 107) { if (MVDiff < 302) { return 1; } else if (MVDiff >= 302) { return 0; } } else if (posBalance >= 107) { return 1; } } } else if (negBalance >= 21) { if (TSC < 40) { return 1; } else if (TSC >= 40) { if (diffAFD < 38) { return 0; } else if (diffAFD >= 38) { return 1; } } } } } } } } } } } } } return 0; } bool SCDetect7(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (TSC < 16) { if (diffMVdiffVal < 65) { if (gchDC < 6) { if (ssDCval < 21) { if (RsDiff < 15) { if (Cs < 1155) { if (Cs < 1151) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { if (TSCindex < 2) { if (Cs < 652) { return 1; } else if (Cs >= 652) { if (MVDiff < 5) { return 1; } else if (MVDiff >= 5) { return 0; } } } else if (TSCindex >= 2) { return 0; } } } else if (Cs >= 1151) { return 1; } } else if (Cs >= 1155) { return 0; } } else if (RsDiff >= 15) { return 1; } } else if (ssDCval >= 21) { if (diffAFD < 7) { if (diffRsCsdiff < 1477) { if (gchDC < 4) { return 0; } else if (gchDC >= 4) { if (refDCval < 43) { if (ssDCval < 25) { return 1; } else if (ssDCval >= 25) { if (diffTSC < -6) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (Cs < 133) { return 1; } else if (Cs >= 133) { return 0; } } } else if (diffTSC >= -6) { return 0; } } } else if (refDCval >= 43) { return 0; } } } else if (diffRsCsdiff >= 1477) { if (diffRsCsdiff < 1531) { return 1; } else if (diffRsCsdiff >= 1531) { return 0; } } } else if (diffAFD >= 7) { if (MVDiff < 70) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (RsCsDiff < 189) { if (SC < 3434) { return 1; } else if (SC >= 3434) { return 0; } } else if (RsCsDiff >= 189) { return 0; } } } else if (MVDiff >= 70) { if (ssDCval < 47) { if (SC < 623) { if (Rs < 8) { return 0; } else if (Rs >= 8) { return 1; } } else if (SC >= 623) { return 0; } } else if (ssDCval >= 47) { if (negBalance < 22) { return 1; } else if (negBalance >= 22) { return 0; } } } } } } else if (gchDC >= 6) { if (diffRsCsdiff < 247) { if (SC < 125) { if (refDCval < 24) { if (diffAFD < 3) { return 1; } else if (diffAFD >= 3) { return 0; } } else if (refDCval >= 24) { if (SC < 122) { if (diffRsCsdiff < -97) { if (diffAFD < -11) { return 0; } else if (diffAFD >= -11) { return 1; } } else if (diffRsCsdiff >= -97) { if (RsCsDiff < 2) { if (diffRsCsdiff < -22) { if (AFD < 6) { return 1; } else if (AFD >= 6) { return 0; } } else if (diffRsCsdiff >= -22) { return 0; } } else if (RsCsDiff >= 2) { if (TSCindex < 8) { return 0; } else if (TSCindex >= 8) { if (diffMVdiffVal < -17) { return 0; } else if (diffMVdiffVal >= -17) { if (Rs < 87) { return 1; } else if (Rs >= 87) { return 0; } } } } } } else if (SC >= 122) { return 1; } } } else if (SC >= 125) { if (MVDiff < 175) { if (RsDiff < 10) { return 0; } else if (RsDiff >= 10) { if (diffMVdiffVal < 54) { return 0; } else if (diffMVdiffVal >= 54) { if (SC < 2716) { if (RsCsDiff < 192) { return 1; } else if (RsCsDiff >= 192) { return 0; } } else if (SC >= 2716) { return 0; } } } } else if (MVDiff >= 175) { if (gchDC < 51) { if (diffAFD < 15) { return 0; } else if (diffAFD >= 15) { if (diffAFD < 16) { return 1; } else if (diffAFD >= 16) { return 0; } } } else if (gchDC >= 51) { if (gchDC < 55) { return 1; } else if (gchDC >= 55) { return 0; } } } } } else if (diffRsCsdiff >= 247) { if (SC < 3613) { if (diffTSC < 7) { if (refDCval < 78) { if (CsDiff < 10) { return 0; } else if (CsDiff >= 10) { return 1; } } else if (refDCval >= 78) { return 0; } } else if (diffTSC >= 7) { if (posBalance < 61) { return 1; } else if (posBalance >= 61) { if (Rs < 366) { return 1; } else if (Rs >= 366) { return 0; } } } } else if (SC >= 3613) { if (ssDCval < 46) { return 1; } else if (ssDCval >= 46) { return 0; } } } } } else if (diffMVdiffVal >= 65) { if (diffRsCsdiff < 1) { if (Rs < 94) { if (diffAFD < 7) { if (diffMVdiffVal < 397) { if (diffTSC < -21) { if (refDCval < 94) { return 1; } else if (refDCval >= 94) { return 0; } } else if (diffTSC >= -21) { return 0; } } else if (diffMVdiffVal >= 397) { if (RsCsDiff < 15) { if (negBalance < 127) { return 0; } else if (negBalance >= 127) { if (MVDiff < 611) { return 1; } else if (MVDiff >= 611) { if (MVDiff < 1653) { return 0; } else if (MVDiff >= 1653) { return 1; } } } } else if (RsCsDiff >= 15) { return 1; } } } else if (diffAFD >= 7) { if (ssDCval < 94) { if (ssDCval < 21) { return 0; } else if (ssDCval >= 21) { if (diffAFD < 8) { return 0; } else if (diffAFD >= 8) { if (refDCval < 38) { return 1; } else if (refDCval >= 38) { if (diffMVdiffVal < 119) { return 0; } else if (diffMVdiffVal >= 119) { if (gchDC < 34) { if (refDCval < 40) { return 0; } else if (refDCval >= 40) { return 1; } } else if (gchDC >= 34) { if (Rs < 2) { return 1; } else if (Rs >= 2) { return 0; } } } } } } } else if (ssDCval >= 94) { if (diffMVdiffVal < 233) { return 0; } else if (diffMVdiffVal >= 233) { if (AFD < 18) { return 1; } else if (AFD >= 18) { return 0; } } } } } else if (Rs >= 94) { if (gchDC < 41) { return 0; } else if (gchDC >= 41) { if (gchDC < 45) { return 1; } else if (gchDC >= 45) { return 0; } } } } else if (diffRsCsdiff >= 1) { if (Cs < 1209) { if (diffTSC < 3) { if (ssDCval < 51) { if (diffRsCsdiff < 87) { if (diffTSC < -2) { return 0; } else if (diffTSC >= -2) { if (diffAFD < 1) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (diffAFD >= 1) { if (refDCval < 29) { return 1; } else if (refDCval >= 29) { if (Rs < 130) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { if (Rs < 10) { return 0; } else if (Rs >= 10) { if (gchDC < 96) { return 1; } else if (gchDC >= 96) { return 0; } } } } else if (Rs >= 130) { return 0; } } } } } else if (diffRsCsdiff >= 87) { if (RsDiff < 45) { return 1; } else if (RsDiff >= 45) { return 0; } } } else if (ssDCval >= 51) { if (AFD < 15) { if (SC < 621) { if (RsCsDiff < 11) { return 0; } else if (RsCsDiff >= 11) { return 1; } } else if (SC >= 621) { return 0; } } else if (AFD >= 15) { return 0; } } } else if (diffTSC >= 3) { if (diffAFD < 13) { if (ssDCval < 50) { if (Rs < 278) { if (gchDC < 10) { if (Rs < 230) { return 1; } else if (Rs >= 230) { if (Rs < 233) { return 0; } else if (Rs >= 233) { return 1; } } } else if (gchDC >= 10) { if (diffMVdiffVal < 224) { return 0; } else if (diffMVdiffVal >= 224) { return 1; } } } else if (Rs >= 278) { if (Cs < 170) { return 1; } else if (Cs >= 170) { if (MVDiff < 135) { return 1; } else if (MVDiff >= 135) { if (diffMVdiffVal < 139) { return 0; } else if (diffMVdiffVal >= 139) { if (SC < 661) { return 0; } else if (SC >= 661) { return 1; } } } } } } else if (ssDCval >= 50) { if (Rs < 99) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (Rs >= 99) { if (CsDiff < 7) { return 0; } else if (CsDiff >= 7) { if (Rs < 803) { if (AFD < 31) { return 1; } else if (AFD >= 31) { return 0; } } else if (Rs >= 803) { return 0; } } } } } else if (diffAFD >= 13) { if (posBalance < 112) { if (diffTSC < 5) { if (refDCval < 68) { return 1; } else if (refDCval >= 68) { return 0; } } else if (diffTSC >= 5) { if (diffMVdiffVal < 180) { if (negBalance < 43) { if (diffAFD < 30) { if (Cs < 383) { return 1; } else if (Cs >= 383) { if (diffRsCsdiff < 134) { return 0; } else if (diffRsCsdiff >= 134) { return 1; } } } else if (diffAFD >= 30) { return 0; } } else if (negBalance >= 43) { if (diffTSC < 15) { if (diffRsCsdiff < 86) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { if (diffAFD < 14) { return 0; } else if (diffAFD >= 14) { if (diffMVdiffVal < 87) { if (SC < 898) { return 0; } else if (SC >= 898) { return 1; } } else if (diffMVdiffVal >= 87) { if (SC < 1459) { return 1; } else if (SC >= 1459) { if (Cs < 661) { return 0; } else if (Cs >= 661) { return 1; } } } } } } else if (diffRsCsdiff >= 86) { return 1; } } else if (diffTSC >= 15) { return 0; } } } else if (diffMVdiffVal >= 180) { if (gchDC < 74) { return 1; } else if (gchDC >= 74) { return 0; } } } } else if (posBalance >= 112) { if (ssDCval < 121) { if (SC < 1348) { return 1; } else if (SC >= 1348) { return 0; } } else if (ssDCval >= 121) { if (CsDiff < 6) { return 0; } else if (CsDiff >= 6) { if (refDCval < 155) { if (CsDiff < 9) { return 1; } else if (CsDiff >= 9) { return 0; } } else if (refDCval >= 155) { return 1; } } } } } } } else if (Cs >= 1209) { if (diffRsCsdiff < 249) { return 0; } else if (diffRsCsdiff >= 249) { if (Cs < 1483) { if (RsDiff < 22) { return 1; } else if (RsDiff >= 22) { if (AFD < 23) { return 1; } else if (AFD >= 23) { return 0; } } } else if (Cs >= 1483) { if (diffAFD < 21) { if (AFD < 19) { return 1; } else if (AFD >= 19) { return 0; } } else if (diffAFD >= 21) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { if (gchDC < 21) { return 1; } else if (gchDC >= 21) { return 0; } } } } } } } } } else if (TSC >= 16) { if (diffMVdiffVal < 65) { if (diffAFD < 19) { if (refDCval < 61) { if (refDCval < 25) { if (SC < 1212) { if (TSC < 28) { return 1; } else if (TSC >= 28) { return 0; } } else if (SC >= 1212) { return 1; } } else if (refDCval >= 25) { if (negBalance < 42) { if (refDCval < 54) { if (RsDiff < 4) { if (ssDCval < 57) { if (Cs < 579) { return 0; } else if (Cs >= 579) { return 1; } } else if (ssDCval >= 57) { return 0; } } else if (RsDiff >= 4) { return 0; } } else if (refDCval >= 54) { if (SC < 2255) { if (TSC < 20) { return 1; } else if (TSC >= 20) { return 0; } } else if (SC >= 2255) { return 0; } } } else if (negBalance >= 42) { if (gchDC < 6) { if (refDCval < 47) { return 1; } else if (refDCval >= 47) { return 0; } } else if (gchDC >= 6) { return 1; } } } } else if (refDCval >= 61) { if (Cs < 2381) { if (AFD < 59) { if (diffMVdiffVal < 43) { if (diffTSC < -2) { if (CsDiff < 8) { return 0; } else if (CsDiff >= 8) { if (AFD < 49) { if (RsDiff < 92) { return 0; } else if (RsDiff >= 92) { return 1; } } else if (AFD >= 49) { return 1; } } } else if (diffTSC >= -2) { return 0; } } else if (diffMVdiffVal >= 43) { if (posBalance < 48) { return 0; } else if (posBalance >= 48) { if (Cs < 2322) { if (CsDiff < 6) { if (gchDC < 17) { if (RsCsDiff < 590) { return 1; } else if (RsCsDiff >= 590) { return 0; } } else if (gchDC >= 17) { return 0; } } else if (CsDiff >= 6) { if (MVDiff < 66) { if (AFD < 32) { return 0; } else if (AFD >= 32) { return 1; } } else if (MVDiff >= 66) { return 0; } } } else if (Cs >= 2322) { return 1; } } } } else if (AFD >= 59) { if (ssDCval < 108) { return 1; } else if (ssDCval >= 108) { if (RsCsDiff < 470) { return 0; } else if (RsCsDiff >= 470) { if (SC < 3672) { return 1; } else if (SC >= 3672) { return 0; } } } } } else if (Cs >= 2381) { return 0; } } } else if (diffAFD >= 19) { if (diffAFD < 30) { if (RsCsDiff < 5423) { if (RsCsDiff < 80) { if (refDCval < 29) { return 1; } else if (refDCval >= 29) { return 0; } } else if (RsCsDiff >= 80) { if (RsCsDiff < 1213) { if (posBalance < 103) { if (Rs < 630) { return 1; } else if (Rs >= 630) { if (Rs < 1387) { if (diffMVdiffVal < -401) { return 1; } else if (diffMVdiffVal >= -401) { return 0; } } else if (Rs >= 1387) { if (diffAFD < 22) { if (negBalance < 10) { return 1; } else if (negBalance >= 10) { return 0; } } else if (diffAFD >= 22) { if (Cs < 1464) { if (SC < 2958) { return 1; } else if (SC >= 2958) { if (posBalance < 71) { return 1; } else if (posBalance >= 71) { return 0; } } } else if (Cs >= 1464) { if (CsDiff < 15) { return 0; } else if (CsDiff >= 15) { return 1; } } } } } } else if (posBalance >= 103) { return 0; } } else if (RsCsDiff >= 1213) { return 0; } } } else if (RsCsDiff >= 5423) { return 1; } } else if (diffAFD >= 30) { if (refDCval < 136) { if (AFD < 39) { return 1; } else if (AFD >= 39) { if (RsCsDiff < 209) { if (Rs < 206) { if (SC < 253) { return 0; } else if (SC >= 253) { return 1; } } else if (Rs >= 206) { return 0; } } else if (RsCsDiff >= 209) { if (MVDiff < 68) { return 1; } else if (MVDiff >= 68) { if (MVDiff < 113) { return 0; } else if (MVDiff >= 113) { return 1; } } } } } else if (refDCval >= 136) { if (posBalance < 6) { return 1; } else if (posBalance >= 6) { if (diffAFD < 58) { return 0; } else if (diffAFD >= 58) { return 1; } } } } } } else if (diffMVdiffVal >= 65) { if (diffRsCsdiff < 66) { if (diffMVdiffVal < 96) { if (ssDCval < 184) { return 0; } else if (ssDCval >= 184) { if (ssDCval < 185) { return 1; } else if (ssDCval >= 185) { return 0; } } } else if (diffMVdiffVal >= 96) { if (Cs < 691) { if (negBalance < 14) { if (gchDC < 77) { if (AFD < 19) { return 1; } else if (AFD >= 19) { return 0; } } else if (gchDC >= 77) { if (MVDiff < 433) { return 1; } else if (MVDiff >= 433) { return 0; } } } else if (negBalance >= 14) { if (diffAFD < 24) { if (diffRsCsdiff < 36) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (TSC < 17) { return 1; } else if (TSC >= 17) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (negBalance < 53) { if (diffMVdiffVal < 138) { return 0; } else if (diffMVdiffVal >= 138) { if (Cs < 404) { if (SC < 298) { return 1; } else if (SC >= 298) { return 0; } } else if (Cs >= 404) { return 1; } } } else if (negBalance >= 53) { if (SC < 481) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (SC >= 481) { return 0; } } } } } } else if (diffRsCsdiff >= 36) { if (MVDiff < 298) { if (Rs < 938) { return 1; } else if (Rs >= 938) { return 0; } } else if (MVDiff >= 298) { if (diffMVdiffVal < 192) { return 0; } else if (diffMVdiffVal >= 192) { if (AFD < 50) { return 1; } else if (AFD >= 50) { return 0; } } } } } else if (diffAFD >= 24) { if (AFD < 82) { if (SC < 216) { if (CsDiff < 2) { if (MVDiff < 324) { return 1; } else if (MVDiff >= 324) { return 0; } } else if (CsDiff >= 2) { if (posBalance < 22) { return 0; } else if (posBalance >= 22) { return 1; } } } else if (SC >= 216) { if (negBalance < 50) { if (posBalance < 99) { if (negBalance < 28) { if (AFD < 28) { return 1; } else if (AFD >= 28) { return 0; } } else if (negBalance >= 28) { if (posBalance < 71) { return 0; } else if (posBalance >= 71) { return 1; } } } else if (posBalance >= 99) { return 1; } } else if (negBalance >= 50) { if (Rs < 73) { return 0; } else if (Rs >= 73) { return 1; } } } } else if (AFD >= 82) { return 0; } } } } else if (Cs >= 691) { if (gchDC < 24) { if (AFD < 53) { if (diffAFD < 19) { return 0; } else if (diffAFD >= 19) { if (negBalance < 37) { return 0; } else if (negBalance >= 37) { return 1; } } } else if (AFD >= 53) { return 1; } } else if (gchDC >= 24) { return 0; } } } } else if (diffRsCsdiff >= 66) { if (diffAFD < 22) { if (ssDCval < 63) { if (MVDiff < 146) { if (RsDiff < 15) { return 0; } else if (RsDiff >= 15) { return 1; } } else if (MVDiff >= 146) { return 1; } } else if (ssDCval >= 63) { if (diffRsCsdiff < 174) { if (MVDiff < 740) { return 0; } else if (MVDiff >= 740) { if (RsCsDiff < 296) { return 0; } else if (RsCsDiff >= 296) { return 1; } } } else if (diffRsCsdiff >= 174) { if (diffTSC < 10) { if (CsDiff < 15) { return 0; } else if (CsDiff >= 15) { if (Rs < 1541) { return 1; } else if (Rs >= 1541) { if (Rs < 8557) { if (TSC < 22) { return 0; } else if (TSC >= 22) { if (Cs < 2574) { return 1; } else if (Cs >= 2574) { return 0; } } } else if (Rs >= 8557) { return 1; } } } } else if (diffTSC >= 10) { if (SC < 3908) { return 1; } else if (SC >= 3908) { if (diffRsCsdiff < 1276) { if (TSC < 27) { return 0; } else if (TSC >= 27) { if (AFD < 51) { return 1; } else if (AFD >= 51) { return 0; } } } else if (diffRsCsdiff >= 1276) { if (Cs < 4743) { return 1; } else if (Cs >= 4743) { return 0; } } } } } } } else if (diffAFD >= 22) { if (diffAFD < 38) { if (negBalance < 27) { if (AFD < 54) { if (diffMVdiffVal < 151) { if (diffTSC < 20) { if (Scindex < 5) { if (negBalance < 16) { return 0; } else if (negBalance >= 16) { return 1; } } else if (Scindex >= 5) { return 0; } } else if (diffTSC >= 20) { if (SC < 1727) { return 1; } else if (SC >= 1727) { if (diffRsCsdiff < 1180) { return 0; } else if (diffRsCsdiff >= 1180) { if (SC < 10013) { return 1; } else if (SC >= 10013) { return 0; } } } } } else if (diffMVdiffVal >= 151) { if (diffAFD < 30) { if (diffRsCsdiff < 414) { if (Rs < 874) { return 1; } else if (Rs >= 874) { if (gchDC < 48) { return 0; } else if (gchDC >= 48) { if (RsCsDiff < 195) { return 0; } else if (RsCsDiff >= 195) { return 1; } } } } else if (diffRsCsdiff >= 414) { return 1; } } else if (diffAFD >= 30) { return 1; } } } else if (AFD >= 54) { return 0; } } else if (negBalance >= 27) { if (MVDiff < 144) { return 1; } else if (MVDiff >= 144) { if (diffMVdiffVal < 98) { return 0; } else if (diffMVdiffVal >= 98) { if (SC < 2204) { return 1; } else if (SC >= 2204) { if (gchDC < 20) { return 1; } else if (gchDC >= 20) { if (RsCsDiff < 1327) { if (negBalance < 73) { if (AFD < 41) { if (posBalance < 90) { if (SC < 4121) { return 0; } else if (SC >= 4121) { return 1; } } else if (posBalance >= 90) { return 1; } } else if (AFD >= 41) { return 0; } } else if (negBalance >= 73) { if (Cs < 2197) { return 1; } else if (Cs >= 2197) { return 0; } } } else if (RsCsDiff >= 1327) { return 1; } } } } } } } else if (diffAFD >= 38) { if (posBalance < 125) { if (diffRsCsdiff < 194) { if (refDCval < 47) { if (TSC < 33) { return 1; } else if (TSC >= 33) { return 0; } } else if (refDCval >= 47) { return 1; } } else if (diffRsCsdiff >= 194) { return 1; } } else if (posBalance >= 125) { return 0; } } } } } } return 0; } bool SCDetect8(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 /*TSCindex*/, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffTSC < 7) { if (diffMVdiffVal < 56) { if (TSC < 24) { if (diffRsCsdiff < 248) { if (Cs < 56) { if (TSC < 5) { if (posBalance < 128) { if (refDCval < 228) { if (negBalance < 1) { if (AFD < 1) { return 0; } else if (AFD >= 1) { if (MVDiff < 1179) { return 0; } else if (MVDiff >= 1179) { return 1; } } } else if (negBalance >= 1) { return 0; } } else if (refDCval >= 228) { if (SC < 38) { return 0; } else if (SC >= 38) { return 1; } } } else if (posBalance >= 128) { return 1; } } else if (TSC >= 5) { if (MVDiff < 232) { return 0; } else if (MVDiff >= 232) { if (diffMVdiffVal < -16) { if (MVDiff < 747) { if (diffRsCsdiff < 25) { return 0; } else if (diffRsCsdiff >= 25) { if (Rs < 126) { return 1; } else if (Rs >= 126) { return 0; } } } else if (MVDiff >= 747) { if (AFD < 18) { return 1; } else if (AFD >= 18) { return 0; } } } else if (diffMVdiffVal >= -16) { if (refDCval < 227) { if (diffRsCsdiff < -96) { if (RsCsDiff < 15) { return 0; } else if (RsCsDiff >= 15) { return 1; } } else if (diffRsCsdiff >= -96) { if (diffMVdiffVal < -9) { if (AFD < 12) { return 1; } else if (AFD >= 12) { if (TSC < 12) { return 0; } else if (TSC >= 12) { return 1; } } } else if (diffMVdiffVal >= -9) { return 0; } } } else if (refDCval >= 227) { return 1; } } } } } else if (Cs >= 56) { if (negBalance < 67) { if (refDCval < 18) { if (diffRsCsdiff < 7) { return 0; } else if (diffRsCsdiff >= 7) { if (SC < 882) { return 0; } else if (SC >= 882) { return 1; } } } else if (refDCval >= 18) { if (diffMVdiffVal < -9) { if (TSC < 11) { return 0; } else if (TSC >= 11) { if (SC < 1136) { if (ssDCval < 57) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (MVDiff < 110) { return 0; } else if (MVDiff >= 110) { return 1; } } } else if (ssDCval >= 57) { return 0; } } else if (SC >= 1136) { return 0; } } } else if (diffMVdiffVal >= -9) { return 0; } } } else if (negBalance >= 67) { if (ssDCval < 50) { if (diffRsCsdiff < 12) { return 0; } else if (diffRsCsdiff >= 12) { if (diffTSC < 5) { if (AFD < 41) { if (diffMVdiffVal < -273) { return 1; } else if (diffMVdiffVal >= -273) { return 0; } } else if (AFD >= 41) { return 1; } } else if (diffTSC >= 5) { return 1; } } } else if (ssDCval >= 50) { return 0; } } } } else if (diffRsCsdiff >= 248) { if (negBalance < 9) { if (Cs < 2604) { if (ssDCval < 21) { return 1; } else if (ssDCval >= 21) { if (SC < 4038) { if (TSC < 3) { return 0; } else if (TSC >= 3) { return 1; } } else if (SC >= 4038) { return 0; } } } else if (Cs >= 2604) { return 0; } } else if (negBalance >= 9) { if (RsDiff < 14) { if (Cs < 1771) { if (ssDCval < 63) { if (AFD < 29) { return 1; } else if (AFD >= 29) { return 0; } } else if (ssDCval >= 63) { return 0; } } else if (Cs >= 1771) { return 0; } } else if (RsDiff >= 14) { return 0; } } } } else if (TSC >= 24) { if (ssDCval < 111) { if (RsCsDiff < 387) { return 0; } else if (RsCsDiff >= 387) { if (Cs < 2454) { if (diffAFD < 11) { if (CsDiff < 10) { return 0; } else if (CsDiff >= 10) { if (SC < 3716) { return 1; } else if (SC >= 3716) { if (SC < 5712) { return 0; } else if (SC >= 5712) { return 1; } } } } else if (diffAFD >= 11) { return 0; } } else if (Cs >= 2454) { return 0; } } } else if (ssDCval >= 111) { return 0; } } } else if (diffMVdiffVal >= 56) { if (diffTSC < 4) { if (negBalance < 59) { if (gchDC < 103) { if (RsCsDiff < 12) { if (ssDCval < 24) { if (negBalance < 46) { return 0; } else if (negBalance >= 46) { return 1; } } else if (ssDCval >= 24) { return 0; } } else if (RsCsDiff >= 12) { if (diffAFD < 18) { if (Cs < 99) { if (SC < 145) { return 1; } else if (SC >= 145) { if (Cs < 91) { return 0; } else if (Cs >= 91) { return 1; } } } else if (Cs >= 99) { if (TSC < 1) { if (SC < 920) { return 0; } else if (SC >= 920) { return 1; } } else if (TSC >= 1) { if (RsCsDiff < 15) { if (posBalance < 87) { return 0; } else if (posBalance >= 87) { return 1; } } else if (RsCsDiff >= 15) { return 0; } } } } else if (diffAFD >= 18) { if (refDCval < 64) { return 1; } else if (refDCval >= 64) { return 0; } } } } else if (gchDC >= 103) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } } else if (negBalance >= 59) { if (diffAFD < 8) { if (diffAFD < -36) { if (SC < 431) { return 1; } else if (SC >= 431) { return 0; } } else if (diffAFD >= -36) { if (negBalance < 83) { if (gchDC < 5) { return 0; } else if (gchDC >= 5) { if (ssDCval < 31) { if (RsDiff < 3) { if (diffRsCsdiff < -21) { return 1; } else if (diffRsCsdiff >= -21) { return 0; } } else if (RsDiff >= 3) { return 1; } } else if (ssDCval >= 31) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { if (posBalance < 48) { return 0; } else if (posBalance >= 48) { if (ssDCval < 48) { return 1; } else if (ssDCval >= 48) { if (ssDCval < 124) { return 0; } else if (ssDCval >= 124) { if (AFD < 56) { return 1; } else if (AFD >= 56) { return 0; } } } } } } } } else if (negBalance >= 83) { if (ssDCval < 24) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } else if (ssDCval >= 24) { return 0; } } } } else if (diffAFD >= 8) { if (posBalance < 2) { return 1; } else if (posBalance >= 2) { if (SC < 2894) { if (diffRsCsdiff < 85) { if (AFD < 16) { return 1; } else if (AFD >= 16) { if (Rs < 146) { if (diffMVdiffVal < 236) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (diffMVdiffVal >= 236) { return 1; } } else if (Rs >= 146) { if (MVDiff < 1442) { return 0; } else if (MVDiff >= 1442) { return 1; } } } } else if (diffRsCsdiff >= 85) { if (AFD < 69) { if (CsDiff < 20) { return 1; } else if (CsDiff >= 20) { return 0; } } else if (AFD >= 69) { return 0; } } } else if (SC >= 2894) { return 0; } } } } } else if (diffTSC >= 4) { if (Rs < 102) { if (diffAFD < 9) { if (Rs < 6) { return 1; } else if (Rs >= 6) { if (ssDCval < 28) { return 1; } else if (ssDCval >= 28) { return 0; } } } else if (diffAFD >= 9) { if (refDCval < 64) { if (diffMVdiffVal < 135) { if (AFD < 15) { return 1; } else if (AFD >= 15) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { return 1; } } } else if (diffMVdiffVal >= 135) { return 1; } } else if (refDCval >= 64) { if (RsDiff < 7) { if (AFD < 23) { if (Rs < 42) { return 0; } else if (Rs >= 42) { return 1; } } else if (AFD >= 23) { return 0; } } else if (RsDiff >= 7) { return 1; } } } } else if (Rs >= 102) { if (TSC < 34) { if (diffRsCsdiff < 8) { return 0; } else if (diffRsCsdiff >= 8) { if (SC < 1410) { if (diffRsCsdiff < 50) { if (ssDCval < 43) { if (MVDiff < 97) { return 0; } else if (MVDiff >= 97) { if (RsDiff < 5) { return 1; } else if (RsDiff >= 5) { if (Cs < 164) { return 1; } else if (Cs >= 164) { return 0; } } } } else if (ssDCval >= 43) { if (ssDCval < 120) { return 0; } else if (ssDCval >= 120) { return 1; } } } else if (diffRsCsdiff >= 50) { if (Rs < 792) { if (TSC < 8) { if (AFD < 24) { return 1; } else if (AFD >= 24) { return 0; } } else if (TSC >= 8) { return 1; } } else if (Rs >= 792) { return 0; } } } else if (SC >= 1410) { if (ssDCval < 40) { return 1; } else if (ssDCval >= 40) { if (MVDiff < 534) { return 0; } else if (MVDiff >= 534) { if (refDCval < 52) { return 0; } else if (refDCval >= 52) { return 1; } } } } } } else if (TSC >= 34) { return 1; } } } } } else if (diffTSC >= 7) { if (MVDiff < 56) { if (Cs < 2138) { if (TSC < 27) { if (diffRsCsdiff < 565) { if (refDCval < 29) { if (SC < 79) { return 0; } else if (SC >= 79) { return 1; } } else if (refDCval >= 29) { if (ssDCval < 70) { if (ssDCval < 63) { return 0; } else if (ssDCval >= 63) { if (diffAFD < 16) { return 0; } else if (diffAFD >= 16) { return 1; } } } else if (ssDCval >= 70) { return 0; } } } else if (diffRsCsdiff >= 565) { if (negBalance < 35) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { return 1; } } else if (negBalance >= 35) { return 1; } } } else if (TSC >= 27) { return 1; } } else if (Cs >= 2138) { if (TSC < 33) { return 0; } else if (TSC >= 33) { if (Rs < 4830) { return 1; } else if (Rs >= 4830) { return 0; } } } } else if (MVDiff >= 56) { if (negBalance < 30) { if (diffMVdiffVal < 99) { if (RsDiff < 10) { if (Scindex < 3) { if (negBalance < 1) { return 1; } else if (negBalance >= 1) { if (Cs < 104) { if (diffMVdiffVal < 89) { if (negBalance < 12) { return 0; } else if (negBalance >= 12) { if (Cs < 99) { return 0; } else if (Cs >= 99) { return 1; } } } else if (diffMVdiffVal >= 89) { return 1; } } else if (Cs >= 104) { if (SC < 488) { return 0; } else if (SC >= 488) { return 1; } } } } else if (Scindex >= 3) { if (refDCval < 39) { if (diffRsCsdiff < 40) { return 0; } else if (diffRsCsdiff >= 40) { if (refDCval < 37) { if (SC < 1054) { return 1; } else if (SC >= 1054) { if (diffTSC < 26) { return 0; } else if (diffTSC >= 26) { if (Cs < 1213) { return 1; } else if (Cs >= 1213) { return 0; } } } } else if (refDCval >= 37) { return 1; } } } else if (refDCval >= 39) { return 0; } } } else if (RsDiff >= 10) { if (SC < 2375) { if (refDCval < 97) { if (MVDiff < 68) { return 0; } else if (MVDiff >= 68) { return 1; } } else if (refDCval >= 97) { if (TSC < 26) { return 0; } else if (TSC >= 26) { return 1; } } } else if (SC >= 2375) { if (RsDiff < 22) { if (diffAFD < 19) { return 0; } else if (diffAFD >= 19) { if (MVDiff < 141) { if (diffRsCsdiff < 222) { if (Cs < 742) { return 1; } else if (Cs >= 742) { return 0; } } else if (diffRsCsdiff >= 222) { return 0; } } else if (MVDiff >= 141) { if (Rs < 2152) { if (gchDC < 92) { if (Rs < 1771) { return 1; } else if (Rs >= 1771) { if (SC < 3012) { return 1; } else if (SC >= 3012) { return 0; } } } else if (gchDC >= 92) { return 0; } } else if (Rs >= 2152) { return 0; } } } } else if (RsDiff >= 22) { if (diffTSC < 14) { if (AFD < 19) { return 1; } else if (AFD >= 19) { return 0; } } else if (diffTSC >= 14) { return 1; } } } } } else if (diffMVdiffVal >= 99) { if (diffRsCsdiff < 66) { if (Rs < 377) { if (RsCsDiff < 53) { if (RsCsDiff < 31) { if (SC < 685) { if (MVDiff < 353) { if (TSC < 20) { if (Cs < 94) { return 1; } else if (Cs >= 94) { if (Cs < 126) { return 0; } else if (Cs >= 126) { return 1; } } } else if (TSC >= 20) { if (MVDiff < 232) { return 0; } else if (MVDiff >= 232) { return 1; } } } else if (MVDiff >= 353) { if (AFD < 28) { if (RsCsDiff < 3) { return 0; } else if (RsCsDiff >= 3) { return 1; } } else if (AFD >= 28) { if (negBalance < 9) { return 0; } else if (negBalance >= 9) { if (SC < 111) { return 1; } else if (SC >= 111) { return 0; } } } } } else if (SC >= 685) { return 0; } } else if (RsCsDiff >= 31) { if (gchDC < 30) { if (Rs < 206) { return 1; } else if (Rs >= 206) { return 0; } } else if (gchDC >= 30) { return 1; } } } else if (RsCsDiff >= 53) { if (MVDiff < 1028) { return 0; } else if (MVDiff >= 1028) { return 1; } } } else if (Rs >= 377) { if (gchDC < 71) { if (RsDiff < 5) { return 0; } else if (RsDiff >= 5) { if (ssDCval < 111) { if (AFD < 31) { if (diffTSC < 16) { if (diffAFD < 20) { return 0; } else if (diffAFD >= 20) { return 1; } } else if (diffTSC >= 16) { return 1; } } else if (AFD >= 31) { return 0; } } else if (ssDCval >= 111) { return 1; } } } else if (gchDC >= 71) { return 1; } } } else if (diffRsCsdiff >= 66) { if (diffRsCsdiff < 740) { if (Cs < 990) { if (Rs < 2373) { if (diffTSC < 10) { if (MVDiff < 715) { if (TSC < 22) { return 1; } else if (TSC >= 22) { return 0; } } else if (MVDiff >= 715) { return 0; } } else if (diffTSC >= 10) { return 1; } } else if (Rs >= 2373) { if (Cs < 394) { return 1; } else if (Cs >= 394) { return 0; } } } else if (Cs >= 990) { if (diffMVdiffVal < 377) { if (gchDC < 30) { return 1; } else if (gchDC >= 30) { if (posBalance < 104) { return 0; } else if (posBalance >= 104) { if (Rs < 836) { return 0; } else if (Rs >= 836) { if (diffRsCsdiff < 433) { if (MVDiff < 139) { return 0; } else if (MVDiff >= 139) { if (RsCsDiff < 138) { return 0; } else if (RsCsDiff >= 138) { return 1; } } } else if (diffRsCsdiff >= 433) { return 0; } } } } } else if (diffMVdiffVal >= 377) { return 1; } } } else if (diffRsCsdiff >= 740) { return 1; } } } } else if (negBalance >= 30) { if (diffTSC < 16) { if (diffAFD < 12) { if (diffMVdiffVal < 74) { return 0; } else if (diffMVdiffVal >= 74) { if (posBalance < 16) { return 0; } else if (posBalance >= 16) { if (ssDCval < 55) { if (AFD < 11) { return 0; } else if (AFD >= 11) { return 1; } } else if (ssDCval >= 55) { if (TSC < 22) { return 0; } else if (TSC >= 22) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (Rs < 1366) { return 1; } else if (Rs >= 1366) { return 0; } } } } } } } else if (diffAFD >= 12) { if (diffMVdiffVal < 63) { if (diffTSC < 11) { if (AFD < 21) { if (TSC < 10) { return 0; } else if (TSC >= 10) { return 1; } } else if (AFD >= 21) { if (Cs < 699) { if (refDCval < 93) { if (CsDiff < 4) { return 1; } else if (CsDiff >= 4) { if (Rs < 475) { return 0; } else if (Rs >= 475) { if (negBalance < 62) { return 0; } else if (negBalance >= 62) { return 1; } } } } else if (refDCval >= 93) { return 0; } } else if (Cs >= 699) { return 0; } } } else if (diffTSC >= 11) { if (diffRsCsdiff < 18) { return 0; } else if (diffRsCsdiff >= 18) { if (Cs < 505) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { return 1; } } else if (Cs >= 505) { if (MVDiff < 69) { return 1; } else if (MVDiff >= 69) { if (refDCval < 63) { return 0; } else if (refDCval >= 63) { if (diffRsCsdiff < 493) { if (TSC < 28) { return 1; } else if (TSC >= 28) { return 0; } } else if (diffRsCsdiff >= 493) { return 0; } } } } } } } else if (diffMVdiffVal >= 63) { if (TSC < 25) { if (ssDCval < 93) { if (negBalance < 43) { if (RsDiff < 4) { return 1; } else if (RsDiff >= 4) { if (SC < 732) { if (Scindex < 3) { return 1; } else if (Scindex >= 3) { return 0; } } else if (SC >= 732) { if (CsDiff < 6) { if (SC < 1013) { return 1; } else if (SC >= 1013) { return 0; } } else if (CsDiff >= 6) { if (diffMVdiffVal < 83) { if (refDCval < 63) { return 1; } else if (refDCval >= 63) { return 0; } } else if (diffMVdiffVal >= 83) { return 1; } } } } } else if (negBalance >= 43) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (Cs < 677) { if (gchDC < 79) { if (diffRsCsdiff < 1) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { return 1; } } else if (diffRsCsdiff >= 1) { return 1; } } else if (gchDC >= 79) { if (SC < 213) { if (Cs < 45) { return 1; } else if (Cs >= 45) { return 0; } } else if (SC >= 213) { return 1; } } } else if (Cs >= 677) { if (AFD < 34) { if (ssDCval < 36) { if (ssDCval < 33) { return 1; } else if (ssDCval >= 33) { return 0; } } else if (ssDCval >= 36) { return 1; } } else if (AFD >= 34) { if (Cs < 811) { return 0; } else if (Cs >= 811) { if (CsDiff < 20) { if (RsDiff < 35) { return 0; } else if (RsDiff >= 35) { return 1; } } else if (CsDiff >= 20) { return 1; } } } } } } } else if (ssDCval >= 93) { if (diffRsCsdiff < 2) { return 0; } else if (diffRsCsdiff >= 2) { if (diffAFD < 25) { if (diffAFD < 19) { return 0; } else if (diffAFD >= 19) { if (Scindex < 4) { return 1; } else if (Scindex >= 4) { if (diffAFD < 20) { return 1; } else if (diffAFD >= 20) { if (diffRsCsdiff < 2026) { return 0; } else if (diffRsCsdiff >= 2026) { return 1; } } } } } else if (diffAFD >= 25) { return 1; } } } } else if (TSC >= 25) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (CsDiff < 15) { return 0; } else if (CsDiff >= 15) { if (CsDiff < 31) { return 1; } else if (CsDiff >= 31) { return 0; } } } } } } } else if (diffTSC >= 16) { if (diffRsCsdiff < 63) { if (diffMVdiffVal < 95) { return 0; } else if (diffMVdiffVal >= 95) { if (diffTSC < 25) { if (diffRsCsdiff < 1) { if (gchDC < 29) { return 1; } else if (gchDC >= 29) { if (Rs < 2319) { return 0; } else if (Rs >= 2319) { return 1; } } } else if (diffRsCsdiff >= 1) { if (diffRsCsdiff < 62) { if (Cs < 754) { if (refDCval < 56) { if (AFD < 43) { return 1; } else if (AFD >= 43) { return 0; } } else if (refDCval >= 56) { return 1; } } else if (Cs >= 754) { return 0; } } else if (diffRsCsdiff >= 62) { return 0; } } } else if (diffTSC >= 25) { if (refDCval < 183) { return 1; } else if (refDCval >= 183) { if (gchDC < 47) { return 1; } else if (gchDC >= 47) { return 0; } } } } } else if (diffRsCsdiff >= 63) { if (posBalance < 36) { if (posBalance < 35) { if (SC < 1745) { return 1; } else if (SC >= 1745) { if (diffMVdiffVal < 120) { if (MVDiff < 170) { if (RsDiff < 9) { return 0; } else if (RsDiff >= 9) { if (AFD < 59) { return 1; } else if (AFD >= 59) { return 0; } } } else if (MVDiff >= 170) { if (refDCval < 195) { return 0; } else if (refDCval >= 195) { if (Rs < 1676) { return 0; } else if (Rs >= 1676) { return 1; } } } } else if (diffMVdiffVal >= 120) { if (gchDC < 82) { return 1; } else if (gchDC >= 82) { return 0; } } } } else if (posBalance >= 35) { if (TSC < 22) { return 0; } else if (TSC >= 22) { return 1; } } } else if (posBalance >= 36) { if (MVDiff < 95) { if (RsCsDiff < 245) { if (refDCval < 68) { return 1; } else if (refDCval >= 68) { return 0; } } else if (RsCsDiff >= 245) { if (Cs < 6363) { return 1; } else if (Cs >= 6363) { if (TSC < 32) { return 0; } else if (TSC >= 32) { return 1; } } } } else if (MVDiff >= 95) { if (diffAFD < 25) { if (TSC < 44) { if (diffAFD < 24) { return 1; } else if (diffAFD >= 24) { return 0; } } else if (TSC >= 44) { return 0; } } else if (diffAFD >= 25) { return 1; } } } } } } } } return 0; } bool SCDetect9(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 /*Scindex*/, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffAFD < 14) { if (diffMVdiffVal < 54) { if (refDCval < 24) { if (diffRsCsdiff < 115) { if (gchDC < 32) { if (diffRsCsdiff < 5) { if (diffAFD < -1) { if (diffMVdiffVal < 2) { if (TSCindex < 2) { return 0; } else if (TSCindex >= 2) { if (diffTSC < -2) { if (diffTSC < -3) { return 0; } else if (diffTSC >= -3) { return 1; } } else if (diffTSC >= -2) { return 0; } } } else if (diffMVdiffVal >= 2) { if (MVDiff < 10) { return 1; } else if (MVDiff >= 10) { if (ssDCval < 30) { return 0; } else if (ssDCval >= 30) { return 1; } } } } else if (diffAFD >= -1) { return 0; } } else if (diffRsCsdiff >= 5) { if (negBalance < 4) { if (diffRsCsdiff < 7) { if (TSC < 1) { return 0; } else if (TSC >= 1) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } } else if (diffRsCsdiff >= 7) { return 1; } } else if (negBalance >= 4) { return 0; } } } else if (gchDC >= 32) { return 1; } } else if (diffRsCsdiff >= 115) { return 1; } } else if (refDCval >= 24) { if (gchDC < 5) { if (refDCval < 44) { if (diffAFD < 10) { if (TSCindex < 9) { return 0; } else if (TSCindex >= 9) { if (MVDiff < 311) { return 0; } else if (MVDiff >= 311) { return 1; } } } else if (diffAFD >= 10) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (Cs < 2320) { return 1; } else if (Cs >= 2320) { return 0; } } } } else if (refDCval >= 44) { if (ssDCval < 174) { return 0; } else if (ssDCval >= 174) { if (refDCval < 174) { if (diffRsCsdiff < 814) { return 0; } else if (diffRsCsdiff >= 814) { return 1; } } else if (refDCval >= 174) { return 0; } } } } else if (gchDC >= 5) { if (diffRsCsdiff < 255) { if (MVDiff < 224) { if (SC < 81) { if (Cs < 61) { if (refDCval < 227) { return 0; } else if (refDCval >= 227) { if (Rs < 1) { return 1; } else if (Rs >= 1) { return 0; } } } else if (Cs >= 61) { if (Rs < 8) { return 0; } else if (Rs >= 8) { return 1; } } } else if (SC >= 81) { return 0; } } else if (MVDiff >= 224) { if (diffTSC < 4) { if (gchDC < 7) { if (Rs < 1) { return 1; } else if (Rs >= 1) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (RsDiff < 8) { if (ssDCval < 65) { return 1; } else if (ssDCval >= 65) { return 0; } } else if (RsDiff >= 8) { return 0; } } } } else if (gchDC >= 7) { if (AFD < 62) { return 0; } else if (AFD >= 62) { if (SC < 3672) { return 1; } else if (SC >= 3672) { return 0; } } } } else if (diffTSC >= 4) { if (refDCval < 114) { if (negBalance < 48) { if (MVDiff < 241) { if (MVDiff < 233) { return 0; } else if (MVDiff >= 233) { return 1; } } else if (MVDiff >= 241) { return 0; } } else if (negBalance >= 48) { if (SC < 647) { return 0; } else if (SC >= 647) { if (diffRsCsdiff < 62) { if (TSC < 14) { if (Rs < 540) { return 1; } else if (Rs >= 540) { return 0; } } else if (TSC >= 14) { return 1; } } else if (diffRsCsdiff >= 62) { return 0; } } } } else if (refDCval >= 114) { return 0; } } } } else if (diffRsCsdiff >= 255) { if (ssDCval < 47) { if (Rs < 2156) { if (diffAFD < 5) { if (RsCsDiff < 6622) { return 1; } else if (RsCsDiff >= 6622) { return 0; } } else if (diffAFD >= 5) { return 0; } } else if (Rs >= 2156) { return 1; } } else if (ssDCval >= 47) { if (Cs < 177) { return 1; } else if (Cs >= 177) { if (AFD < 58) { return 0; } else if (AFD >= 58) { return 1; } } } } } } } else if (diffMVdiffVal >= 54) { if (diffAFD < 7) { if (ssDCval < 38) { if (Cs < 63) { if (MVDiff < 1653) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (TSC < 4) { return 1; } else if (TSC >= 4) { return 0; } } } else if (MVDiff >= 1653) { if (diffMVdiffVal < 1131) { return 0; } else if (diffMVdiffVal >= 1131) { return 1; } } } else if (Cs >= 63) { if (TSC < 5) { if (Rs < 40) { return 1; } else if (Rs >= 40) { if (Cs < 574) { return 0; } else if (Cs >= 574) { if (Cs < 992) { return 1; } else if (Cs >= 992) { return 0; } } } } else if (TSC >= 5) { if (diffMVdiffVal < 74) { return 0; } else if (diffMVdiffVal >= 74) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { if (diffTSC < -6) { return 1; } else if (diffTSC >= -6) { if (refDCval < 34) { if (posBalance < 72) { return 1; } else if (posBalance >= 72) { return 0; } } else if (refDCval >= 34) { if (MVDiff < 1099) { return 0; } else if (MVDiff >= 1099) { return 1; } } } } } } } } else if (ssDCval >= 38) { if (TSC < 36) { if (AFD < 34) { if (SC < 1) { if (diffTSC < -7) { return 1; } else if (diffTSC >= -7) { if (MVDiff < 272) { return 1; } else if (MVDiff >= 272) { return 0; } } } else if (SC >= 1) { return 0; } } else if (AFD >= 34) { if (SC < 1104) { if (diffRsCsdiff < 18) { if (refDCval < 76) { if (RsCsDiff < 77) { return 0; } else if (RsCsDiff >= 77) { return 1; } } else if (refDCval >= 76) { return 0; } } else if (diffRsCsdiff >= 18) { if (diffTSC < -6) { return 0; } else if (diffTSC >= -6) { if (gchDC < 9) { return 0; } else if (gchDC >= 9) { return 1; } } } } else if (SC >= 1104) { return 0; } } } else if (TSC >= 36) { if (SC < 2017) { return 0; } else if (SC >= 2017) { return 1; } } } } else if (diffAFD >= 7) { if (SC < 825) { if (ssDCval < 50) { if (gchDC < 10) { if (SC < 740) { if (diffRsCsdiff < 5) { if (MVDiff < 200) { if (diffTSC < 5) { if (AFD < 12) { if (posBalance < 65) { return 1; } else if (posBalance >= 65) { return 0; } } else if (AFD >= 12) { return 0; } } else if (diffTSC >= 5) { return 1; } } else if (MVDiff >= 200) { return 1; } } else if (diffRsCsdiff >= 5) { return 1; } } else if (SC >= 740) { if (ssDCval < 44) { return 0; } else if (ssDCval >= 44) { return 1; } } } else if (gchDC >= 10) { if (diffMVdiffVal < 214) { if (gchDC < 20) { if (Rs < 458) { return 0; } else if (Rs >= 458) { return 1; } } else if (gchDC >= 20) { if (CsDiff < 9) { return 1; } else if (CsDiff >= 9) { return 0; } } } else if (diffMVdiffVal >= 214) { if (gchDC < 23) { return 1; } else if (gchDC >= 23) { if (diffAFD < 10) { return 0; } else if (diffAFD >= 10) { return 1; } } } } } else if (ssDCval >= 50) { if (ssDCval < 224) { if (CsDiff < 12) { if (refDCval < 65) { if (negBalance < 34) { return 0; } else if (negBalance >= 34) { if (gchDC < 8) { return 0; } else if (gchDC >= 8) { return 1; } } } else if (refDCval >= 65) { return 0; } } else if (CsDiff >= 12) { return 1; } } else if (ssDCval >= 224) { if (AFD < 20) { return 1; } else if (AFD >= 20) { return 0; } } } } else if (SC >= 825) { if (SC < 2557) { if (diffRsCsdiff < 45) { if (diffRsCsdiff < -82) { if (refDCval < 81) { return 1; } else if (refDCval >= 81) { return 0; } } else if (diffRsCsdiff >= -82) { return 0; } } else if (diffRsCsdiff >= 45) { if (TSC < 27) { if (negBalance < 40) { if (negBalance < 24) { return 0; } else if (negBalance >= 24) { if (diffAFD < 12) { return 0; } else if (diffAFD >= 12) { if (Rs < 1391) { return 1; } else if (Rs >= 1391) { return 0; } } } } else if (negBalance >= 40) { if (diffMVdiffVal < 128) { if (ssDCval < 71) { if (RsDiff < 10) { return 1; } else if (RsDiff >= 10) { if (SC < 1198) { return 0; } else if (SC >= 1198) { if (RsCsDiff < 521) { return 1; } else if (RsCsDiff >= 521) { if (Cs < 1428) { return 1; } else if (Cs >= 1428) { return 0; } } } } } else if (ssDCval >= 71) { if (gchDC < 34) { return 0; } else if (gchDC >= 34) { return 1; } } } else if (diffMVdiffVal >= 128) { return 1; } } } else if (TSC >= 27) { return 1; } } } else if (SC >= 2557) { return 0; } } } } } else if (diffAFD >= 14) { if (diffMVdiffVal < 65) { if (diffAFD < 25) { if (MVDiff < 153) { if (gchDC < 4) { if (ssDCval < 36) { if (SC < 1436) { return 0; } else if (SC >= 1436) { return 1; } } else if (ssDCval >= 36) { if (diffMVdiffVal < 59) { if (SC < 2658) { if (TSC < 13) { return 0; } else if (TSC >= 13) { if (RsCsDiff < 158) { return 1; } else if (RsCsDiff >= 158) { return 0; } } } else if (SC >= 2658) { return 0; } } else if (diffMVdiffVal >= 59) { if (Cs < 557) { return 0; } else if (Cs >= 557) { return 1; } } } } else if (gchDC >= 4) { if (Rs < 7070) { if (ssDCval < 53) { if (Rs < 1146) { if (diffRsCsdiff < 169) { if (diffTSC < 17) { return 0; } else if (diffTSC >= 17) { return 1; } } else if (diffRsCsdiff >= 169) { return 1; } } else if (Rs >= 1146) { return 1; } } else if (ssDCval >= 53) { if (diffMVdiffVal < -506) { return 1; } else if (diffMVdiffVal >= -506) { if (Cs < 4218) { return 0; } else if (Cs >= 4218) { if (Cs < 4368) { return 1; } else if (Cs >= 4368) { return 0; } } } } } else if (Rs >= 7070) { return 1; } } } else if (MVDiff >= 153) { if (gchDC < 8) { if (AFD < 42) { return 1; } else if (AFD >= 42) { return 0; } } else if (gchDC >= 8) { if (gchDC < 56) { if (RsCsDiff < 345) { if (ssDCval < 44) { return 1; } else if (ssDCval >= 44) { if (diffAFD < 23) { return 0; } else if (diffAFD >= 23) { if (RsCsDiff < 73) { if (Rs < 425) { return 0; } else if (Rs >= 425) { return 1; } } else if (RsCsDiff >= 73) { return 0; } } } } else if (RsCsDiff >= 345) { if (RsCsDiff < 549) { return 1; } else if (RsCsDiff >= 549) { if (refDCval < 132) { return 0; } else if (refDCval >= 132) { return 1; } } } } else if (gchDC >= 56) { if (AFD < 32) { return 0; } else if (AFD >= 32) { if (CsDiff < 8) { if (MVDiff < 720) { return 0; } else if (MVDiff >= 720) { return 1; } } else if (CsDiff >= 8) { return 1; } } } } } } else if (diffAFD >= 25) { if (diffAFD < 47) { if (Rs < 1682) { if (ssDCval < 76) { if (Rs < 127) { return 0; } else if (Rs >= 127) { if (SC < 948) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (SC >= 948) { if (Cs < 486) { return 1; } else if (Cs >= 486) { if (CsDiff < 18) { return 0; } else if (CsDiff >= 18) { return 1; } } } } } else if (ssDCval >= 76) { if (AFD < 57) { if (posBalance < 124) { return 0; } else if (posBalance >= 124) { if (MVDiff < 120) { return 1; } else if (MVDiff >= 120) { return 0; } } } else if (AFD >= 57) { if (diffMVdiffVal < -2) { return 1; } else if (diffMVdiffVal >= -2) { return 0; } } } } else if (Rs >= 1682) { if (MVDiff < 152) { if (Cs < 3562) { if (TSC < 18) { return 0; } else if (TSC >= 18) { if (RsCsDiff < 809) { if (Rs < 2145) { return 1; } else if (Rs >= 2145) { return 0; } } else if (RsCsDiff >= 809) { return 1; } } } else if (Cs >= 3562) { return 0; } } else if (MVDiff >= 152) { return 1; } } } else if (diffAFD >= 47) { return 1; } } } else if (diffMVdiffVal >= 65) { if (RsDiff < 14) { if (negBalance < 30) { if (diffMVdiffVal < 142) { if (ssDCval < 69) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { if (MVDiff < 117) { if (Rs < 322) { return 0; } else if (Rs >= 322) { if (Cs < 1093) { return 1; } else if (Cs >= 1093) { return 0; } } } else if (MVDiff >= 117) { return 1; } } } else if (ssDCval >= 69) { if (diffMVdiffVal < 99) { return 0; } else if (diffMVdiffVal >= 99) { if (TSC < 30) { if (AFD < 45) { if (gchDC < 73) { if (negBalance < 16) { return 0; } else if (negBalance >= 16) { if (RsDiff < 10) { if (ssDCval < 89) { return 1; } else if (ssDCval >= 89) { return 0; } } else if (RsDiff >= 10) { return 1; } } } else if (gchDC >= 73) { return 1; } } else if (AFD >= 45) { return 1; } } else if (TSC >= 30) { return 0; } } } } else if (diffMVdiffVal >= 142) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (negBalance < 10) { if (diffMVdiffVal < 415) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (TSC < 18) { if (refDCval < 107) { return 1; } else if (refDCval >= 107) { return 0; } } else if (TSC >= 18) { if (SC < 2876) { if (MVDiff < 190) { return 1; } else if (MVDiff >= 190) { return 0; } } else if (SC >= 2876) { return 1; } } } } else if (diffMVdiffVal >= 415) { if (RsCsDiff < 14) { return 0; } else if (RsCsDiff >= 14) { if (refDCval < 125) { return 1; } else if (refDCval >= 125) { return 0; } } } } else if (negBalance >= 10) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (MVDiff < 1439) { if (TSC < 20) { return 1; } else if (TSC >= 20) { if (ssDCval < 103) { if (CsDiff < 7) { return 0; } else if (CsDiff >= 7) { if (Rs < 1199) { return 1; } else if (Rs >= 1199) { if (Cs < 1280) { return 0; } else if (Cs >= 1280) { return 1; } } } } else if (ssDCval >= 103) { if (RsDiff < 13) { return 1; } else if (RsDiff >= 13) { if (posBalance < 103) { return 0; } else if (posBalance >= 103) { return 1; } } } } } else if (MVDiff >= 1439) { return 0; } } } } } } else if (negBalance >= 30) { if (diffTSC < 7) { if (AFD < 43) { if (Rs < 541) { if (diffMVdiffVal < 93) { return 0; } else if (diffMVdiffVal >= 93) { if (refDCval < 111) { return 1; } else if (refDCval >= 111) { if (CsDiff < 6) { return 0; } else if (CsDiff >= 6) { return 1; } } } } else if (Rs >= 541) { return 0; } } else if (AFD >= 43) { if (diffAFD < 26) { return 0; } else if (diffAFD >= 26) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } } } else if (diffTSC >= 7) { if (TSC < 29) { if (diffRsCsdiff < 1) { if (negBalance < 51) { return 0; } else if (negBalance >= 51) { if (CsDiff < 12) { if (gchDC < 34) { return 1; } else if (gchDC >= 34) { if (Cs < 124) { return 0; } else if (Cs >= 124) { return 1; } } } else if (CsDiff >= 12) { return 0; } } } else if (diffRsCsdiff >= 1) { if (diffAFD < 25) { if (CsDiff < 5) { if (Cs < 43) { if (diffMVdiffVal < 328) { return 1; } else if (diffMVdiffVal >= 328) { return 0; } } else if (Cs >= 43) { return 1; } } else if (CsDiff >= 5) { if (diffRsCsdiff < 98) { if (SC < 627) { return 1; } else if (SC >= 627) { if (diffMVdiffVal < 85) { return 0; } else if (diffMVdiffVal >= 85) { if (AFD < 33) { return 1; } else if (AFD >= 33) { if (diffMVdiffVal < 146) { return 0; } else if (diffMVdiffVal >= 146) { if (ssDCval < 81) { return 1; } else if (ssDCval >= 81) { return 0; } } } } } } else if (diffRsCsdiff >= 98) { if (TSC < 24) { return 1; } else if (TSC >= 24) { return 0; } } } } else if (diffAFD >= 25) { if (diffMVdiffVal < 80) { if (AFD < 30) { return 1; } else if (AFD >= 30) { if (posBalance < 34) { return 1; } else if (posBalance >= 34) { return 0; } } } else if (diffMVdiffVal >= 80) { if (ssDCval < 46) { if (diffRsCsdiff < 46) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (negBalance < 71) { return 0; } else if (negBalance >= 71) { return 1; } } } else if (diffRsCsdiff >= 46) { return 1; } } else if (ssDCval >= 46) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { if (diffRsCsdiff < 91) { return 0; } else if (diffRsCsdiff >= 91) { if (diffAFD < 52) { return 1; } else if (diffAFD >= 52) { if (SC < 1118) { return 0; } else if (SC >= 1118) { return 1; } } } } } } } } } else if (TSC >= 29) { if (diffRsCsdiff < 64) { if (SC < 897) { if (diffTSC < 27) { return 0; } else if (diffTSC >= 27) { if (posBalance < 17) { return 0; } else if (posBalance >= 17) { return 1; } } } else if (SC >= 897) { return 0; } } else if (diffRsCsdiff >= 64) { return 1; } } } } } else if (RsDiff >= 14) { if (negBalance < 31) { if (SC < 3198) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } else if (SC >= 3198) { if (RsDiff < 30) { if (CsDiff < 19) { if (RsCsDiff < 373) { return 1; } else if (RsCsDiff >= 373) { return 0; } } else if (CsDiff >= 19) { if (SC < 4537) { if (AFD < 32) { return 1; } else if (AFD >= 32) { return 0; } } else if (SC >= 4537) { return 1; } } } else if (RsDiff >= 30) { if (negBalance < 2) { return 0; } else if (negBalance >= 2) { return 1; } } } } else if (negBalance >= 31) { if (diffRsCsdiff < 218) { if (SC < 2115) { if (TSC < 26) { return 0; } else if (TSC >= 26) { if (refDCval < 149) { return 1; } else if (refDCval >= 149) { return 0; } } } else if (SC >= 2115) { return 0; } } else if (diffRsCsdiff >= 218) { if (TSC < 16) { if (refDCval < 71) { return 1; } else if (refDCval >= 71) { if (MVDiff < 272) { if (diffTSC < 10) { if (posBalance < 75) { return 0; } else if (posBalance >= 75) { return 1; } } else if (diffTSC >= 10) { if (negBalance < 72) { return 0; } else if (negBalance >= 72) { return 1; } } } else if (MVDiff >= 272) { return 1; } } } else if (TSC >= 16) { if (AFD < 76) { if (diffMVdiffVal < 113) { if (MVDiff < 128) { if (SC < 16399) { return 1; } else if (SC >= 16399) { if (TSC < 32) { return 0; } else if (TSC >= 32) { return 1; } } } else if (MVDiff >= 128) { if (diffAFD < 25) { return 0; } else if (diffAFD >= 25) { if (CsDiff < 28) { return 1; } else if (CsDiff >= 28) { return 0; } } } } else if (diffMVdiffVal >= 113) { if (Rs < 2296) { return 1; } else if (Rs >= 2296) { if (Rs < 2341) { if (MVDiff < 213) { return 1; } else if (MVDiff >= 213) { return 0; } } else if (Rs >= 2341) { if (diffMVdiffVal < 126) { if (MVDiff < 149) { return 1; } else if (MVDiff >= 149) { return 0; } } else if (diffMVdiffVal >= 126) { return 1; } } } } } else if (AFD >= 76) { if (Rs < 4638) { return 1; } else if (Rs >= 4638) { return 0; } } } } } } } } return 0; } bool SCDetectA(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffMVdiffVal < 53) { if (diffTSC < 12) { if (MVDiff < 54) { if (ssDCval < 20) { if (diffRsCsdiff < 5) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { if (RsCsDiff < 9) { return 0; } else if (RsCsDiff >= 9) { return 1; } } } else if (diffRsCsdiff >= 5) { if (RsDiff < 3) { if (posBalance < 2) { if (refDCval < 17) { return 1; } else if (refDCval >= 17) { return 0; } } else if (posBalance >= 2) { return 0; } } else if (RsDiff >= 3) { return 1; } } } else if (ssDCval >= 20) { if (SC < 158) { if (diffRsCsdiff < 5) { if (posBalance < 124) { if (diffMVdiffVal < -443) { if (negBalance < 87) { return 0; } else if (negBalance >= 87) { if (Rs < 17) { return 0; } else if (Rs >= 17) { return 1; } } } else if (diffMVdiffVal >= -443) { return 0; } } else if (posBalance >= 124) { return 1; } } else if (diffRsCsdiff >= 5) { if (CsDiff < 30) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (CsDiff >= 30) { return 0; } } } else if (SC >= 158) { if (diffRsCsdiff < 260) { return 0; } else if (diffRsCsdiff >= 260) { if (RsCsDiff < 261) { return 1; } else if (RsCsDiff >= 261) { if (refDCval < 44) { if (RsDiff < 25) { return 0; } else if (RsDiff >= 25) { return 1; } } else if (refDCval >= 44) { return 0; } } } } } } else if (MVDiff >= 54) { if (TSCindex < 9) { if (CsDiff < 17) { if (diffRsCsdiff < 1) { if (Rs < 5) { if (diffAFD < -21) { if (TSCindex < 2) { return 0; } else if (TSCindex >= 2) { if (Rs < 4) { return 0; } else if (Rs >= 4) { return 1; } } } else if (diffAFD >= -21) { return 0; } } else if (Rs >= 5) { return 0; } } else if (diffRsCsdiff >= 1) { if (ssDCval < 36) { if (MVDiff < 152) { return 0; } else if (MVDiff >= 152) { if (SC < 329) { return 1; } else if (SC >= 329) { if (Rs < 288) { return 0; } else if (Rs >= 288) { return 1; } } } } else if (ssDCval >= 36) { return 0; } } } else if (CsDiff >= 17) { if (diffAFD < 4) { return 0; } else if (diffAFD >= 4) { if (RsDiff < 14) { return 0; } else if (RsDiff >= 14) { if (SC < 6059) { return 1; } else if (SC >= 6059) { return 0; } } } } } else if (TSCindex >= 9) { if (MVDiff < 155) { if (RsCsDiff < 17299) { if (ssDCval < 87) { if (diffRsCsdiff < 1181) { if (SC < 80) { if (Cs < 44) { return 0; } else if (Cs >= 44) { return 1; } } else if (SC >= 80) { if (diffMVdiffVal < 36) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (Cs < 163) { if (Rs < 230) { return 0; } else if (Rs >= 230) { return 1; } } else if (Cs >= 163) { return 0; } } } else if (diffMVdiffVal >= 36) { if (ssDCval < 35) { return 1; } else if (ssDCval >= 35) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { if (Rs < 914) { return 0; } else if (Rs >= 914) { return 1; } } } } } } else if (diffRsCsdiff >= 1181) { if (TSC < 20) { return 0; } else if (TSC >= 20) { return 1; } } } else if (ssDCval >= 87) { return 0; } } else if (RsCsDiff >= 17299) { return 1; } } else if (MVDiff >= 155) { if (TSC < 30) { if (SC < 1290) { if (ssDCval < 66) { if (posBalance < 29) { return 0; } else if (posBalance >= 29) { if (Cs < 582) { if (negBalance < 49) { return 0; } else if (negBalance >= 49) { if (SC < 227) { if (CsDiff < 2) { if (AFD < 23) { return 1; } else if (AFD >= 23) { return 0; } } else if (CsDiff >= 2) { return 1; } } else if (SC >= 227) { if (posBalance < 67) { if (Rs < 120) { if (TSC < 13) { return 0; } else if (TSC >= 13) { return 1; } } else if (Rs >= 120) { return 0; } } else if (posBalance >= 67) { return 1; } } } } else if (Cs >= 582) { if (RsCsDiff < 38) { return 0; } else if (RsCsDiff >= 38) { if (CsDiff < 11) { return 1; } else if (CsDiff >= 11) { return 0; } } } } } else if (ssDCval >= 66) { return 0; } } else if (SC >= 1290) { if (diffAFD < 27) { if (diffMVdiffVal < -121) { if (ssDCval < 46) { if (CsDiff < 8) { return 0; } else if (CsDiff >= 8) { return 1; } } else if (ssDCval >= 46) { return 0; } } else if (diffMVdiffVal >= -121) { return 0; } } else if (diffAFD >= 27) { return 1; } } } else if (TSC >= 30) { if (Cs < 1905) { if (MVDiff < 366) { if (CsDiff < 12) { if (Cs < 819) { return 1; } else if (Cs >= 819) { return 0; } } else if (CsDiff >= 12) { return 1; } } else if (MVDiff >= 366) { return 0; } } else if (Cs >= 1905) { return 0; } } } } } } else if (diffTSC >= 12) { if (RsCsDiff < 245) { if (Rs < 291) { if (RsDiff < 5) { if (diffRsCsdiff < -12) { if (ssDCval < 70) { return 0; } else if (ssDCval >= 70) { return 1; } } else if (diffRsCsdiff >= -12) { if (RsDiff < 3) { return 0; } else if (RsDiff >= 3) { return 1; } } } else if (RsDiff >= 5) { return 1; } } else if (Rs >= 291) { if (diffMVdiffVal < -70) { if (Rs < 602) { return 0; } else if (Rs >= 602) { if (negBalance < 36) { if (MVDiff < 1058) { return 0; } else if (MVDiff >= 1058) { return 1; } } else if (negBalance >= 36) { return 1; } } } else if (diffMVdiffVal >= -70) { if (diffTSC < 43) { if (ssDCval < 60) { if (CsDiff < 5) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (CsDiff >= 5) { return 0; } } else if (ssDCval >= 60) { if (RsDiff < 12) { return 0; } else if (RsDiff >= 12) { if (Rs < 1806) { if (RsCsDiff < 206) { return 0; } else if (RsCsDiff >= 206) { return 1; } } else if (Rs >= 1806) { return 0; } } } } else if (diffTSC >= 43) { return 1; } } } } else if (RsCsDiff >= 245) { if (Cs < 3054) { if (negBalance < 5) { return 1; } else if (negBalance >= 5) { if (RsDiff < 27) { if (posBalance < 91) { if (diffTSC < 22) { if (diffRsCsdiff < 564) { if (diffMVdiffVal < 46) { if (SC < 1467) { return 1; } else if (SC >= 1467) { if (posBalance < 76) { return 0; } else if (posBalance >= 76) { if (Cs < 1534) { return 1; } else if (Cs >= 1534) { return 0; } } } } else if (diffMVdiffVal >= 46) { return 1; } } else if (diffRsCsdiff >= 564) { return 1; } } else if (diffTSC >= 22) { return 1; } } else if (posBalance >= 91) { return 0; } } else if (RsDiff >= 27) { if (gchDC < 61) { return 1; } else if (gchDC >= 61) { return 0; } } } } else if (Cs >= 3054) { if (gchDC < 7) { return 0; } else if (gchDC >= 7) { if (MVDiff < 45) { if (Rs < 3654) { return 1; } else if (Rs >= 3654) { return 0; } } else if (MVDiff >= 45) { return 1; } } } } } } else if (diffMVdiffVal >= 53) { if (diffRsCsdiff < 1) { if (diffMVdiffVal < 219) { if (Rs < 145) { if (CsDiff < 5) { if (TSC < 4) { return 0; } else if (TSC >= 4) { if (TSC < 22) { if (ssDCval < 24) { return 1; } else if (ssDCval >= 24) { if (diffAFD < 9) { return 0; } else if (diffAFD >= 9) { if (ssDCval < 38) { return 1; } else if (ssDCval >= 38) { if (posBalance < 117) { return 0; } else if (posBalance >= 117) { return 1; } } } } } else if (TSC >= 22) { return 1; } } } else if (CsDiff >= 5) { if (TSC < 15) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { return 1; } } else if (TSC >= 15) { if (AFD < 52) { if (Cs < 6) { return 0; } else if (Cs >= 6) { return 1; } } else if (AFD >= 52) { return 0; } } } } else if (Rs >= 145) { if (RsCsDiff < 821) { if (AFD < 34) { return 0; } else if (AFD >= 34) { if (AFD < 35) { if (Cs < 161) { return 1; } else if (Cs >= 161) { return 0; } } else if (AFD >= 35) { return 0; } } } else if (RsCsDiff >= 821) { if (diffMVdiffVal < 93) { return 0; } else if (diffMVdiffVal >= 93) { if (SC < 4164) { return 1; } else if (SC >= 4164) { if (CsDiff < 53) { return 0; } else if (CsDiff >= 53) { return 1; } } } } } } else if (diffMVdiffVal >= 219) { if (diffRsCsdiff < -2) { if (MVDiff < 1805) { if (CsDiff < 5) { if (posBalance < 1) { if (Rs < 38) { return 0; } else if (Rs >= 38) { if (Cs < 324) { return 1; } else if (Cs >= 324) { return 0; } } } else if (posBalance >= 1) { return 0; } } else if (CsDiff >= 5) { if (TSC < 17) { if (Cs < 100) { return 1; } else if (Cs >= 100) { if (diffTSC < 10) { if (diffTSC < -3) { if (AFD < 31) { return 0; } else if (AFD >= 31) { return 1; } } else if (diffTSC >= -3) { return 0; } } else if (diffTSC >= 10) { return 1; } } } else if (TSC >= 17) { return 0; } } } else if (MVDiff >= 1805) { return 1; } } else if (diffRsCsdiff >= -2) { if (MVDiff < 328) { if (Cs < 300) { return 1; } else if (Cs >= 300) { return 0; } } else if (MVDiff >= 328) { if (diffTSC < 4) { if (gchDC < 83) { if (diffMVdiffVal < 797) { return 0; } else if (diffMVdiffVal >= 797) { if (posBalance < 56) { if (negBalance < 119) { return 1; } else if (negBalance >= 119) { return 0; } } else if (posBalance >= 56) { return 0; } } } else if (gchDC >= 83) { return 1; } } else if (diffTSC >= 4) { if (Rs < 132) { if (TSC < 11) { if (ssDCval < 120) { return 1; } else if (ssDCval >= 120) { return 0; } } else if (TSC >= 11) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { if (Rs < 79) { return 1; } else if (Rs >= 79) { return 0; } } } } else if (Rs >= 132) { return 1; } } } } } } else if (diffRsCsdiff >= 1) { if (negBalance < 33) { if (diffTSC < 10) { if (SC < 239) { if (diffAFD < 10) { return 0; } else if (diffAFD >= 10) { if (refDCval < 103) { if (diffAFD < 12) { if (Cs < 103) { return 1; } else if (Cs >= 103) { return 0; } } else if (diffAFD >= 12) { return 1; } } else if (refDCval >= 103) { return 0; } } } else if (SC >= 239) { if (diffRsCsdiff < 3281) { if (posBalance < 10) { return 1; } else if (posBalance >= 10) { if (diffMVdiffVal < 1317) { if (ssDCval < 83) { if (Rs < 304) { if (Rs < 252) { return 0; } else if (Rs >= 252) { if (AFD < 14) { return 0; } else if (AFD >= 14) { return 1; } } } else if (Rs >= 304) { return 0; } } else if (ssDCval >= 83) { return 0; } } else if (diffMVdiffVal >= 1317) { return 1; } } } else if (diffRsCsdiff >= 3281) { return 1; } } } else if (diffTSC >= 10) { if (diffAFD < 28) { if (ssDCval < 58) { if (Rs < 343) { return 1; } else if (Rs >= 343) { if (refDCval < 33) { return 1; } else if (refDCval >= 33) { if (TSC < 12) { return 1; } else if (TSC >= 12) { if (MVDiff < 812) { return 0; } else if (MVDiff >= 812) { if (SC < 1202) { return 1; } else if (SC >= 1202) { return 0; } } } } } } else if (ssDCval >= 58) { if (negBalance < 17) { if (diffMVdiffVal < 505) { if (diffMVdiffVal < 92) { return 0; } else if (diffMVdiffVal >= 92) { if (diffRsCsdiff < 30) { return 0; } else if (diffRsCsdiff >= 30) { if (refDCval < 41) { return 1; } else if (refDCval >= 41) { if (TSC < 13) { return 1; } else if (TSC >= 13) { return 0; } } } } } else if (diffMVdiffVal >= 505) { return 1; } } else if (negBalance >= 17) { if (Cs < 199) { return 1; } else if (Cs >= 199) { if (Cs < 3354) { if (diffMVdiffVal < 93) { return 0; } else if (diffMVdiffVal >= 93) { if (ssDCval < 92) { if (SC < 3234) { return 1; } else if (SC >= 3234) { return 0; } } else if (ssDCval >= 92) { return 0; } } } else if (Cs >= 3354) { return 1; } } } } } else if (diffAFD >= 28) { if (diffRsCsdiff < 124) { if (TSC < 26) { if (posBalance < 119) { if (diffTSC < 12) { return 0; } else if (diffTSC >= 12) { if (Cs < 620) { return 1; } else if (Cs >= 620) { if (Cs < 789) { return 0; } else if (Cs >= 789) { return 1; } } } } else if (posBalance >= 119) { return 0; } } else if (TSC >= 26) { if (ssDCval < 107) { return 0; } else if (ssDCval >= 107) { if (SC < 2082) { if (diffRsCsdiff < 26) { if (SC < 665) { return 1; } else if (SC >= 665) { return 0; } } else if (diffRsCsdiff >= 26) { return 1; } } else if (SC >= 2082) { return 0; } } } } else if (diffRsCsdiff >= 124) { if (diffAFD < 40) { if (gchDC < 58) { if (diffTSC < 32) { if (negBalance < 19) { return 1; } else if (negBalance >= 19) { if (AFD < 42) { if (ssDCval < 75) { return 1; } else if (ssDCval >= 75) { if (Cs < 863) { return 1; } else if (Cs >= 863) { if (SC < 4864) { return 0; } else if (SC >= 4864) { return 1; } } } } else if (AFD >= 42) { return 1; } } } else if (diffTSC >= 32) { return 0; } } else if (gchDC >= 58) { return 0; } } else if (diffAFD >= 40) { if (ssDCval < 86) { if (RsDiff < 11) { return 0; } else if (RsDiff >= 11) { return 1; } } else if (ssDCval >= 86) { return 1; } } } } } } else if (negBalance >= 33) { if (posBalance < 29) { if (gchDC < 27) { if (diffRsCsdiff < 102) { if (diffAFD < 14) { if (RsDiff < 2) { if (diffAFD < 12) { return 0; } else if (diffAFD >= 12) { if (AFD < 17) { return 1; } else if (AFD >= 17) { return 0; } } } else if (RsDiff >= 2) { return 0; } } else if (diffAFD >= 14) { if (Rs < 897) { return 1; } else if (Rs >= 897) { return 0; } } } else if (diffRsCsdiff >= 102) { if (diffRsCsdiff < 165) { if (Scindex < 4) { return 1; } else if (Scindex >= 4) { return 0; } } else if (diffRsCsdiff >= 165) { if (ssDCval < 42) { return 1; } else if (ssDCval >= 42) { if (diffMVdiffVal < 1728) { if (posBalance < 26) { return 0; } else if (posBalance >= 26) { if (SC < 3799) { return 0; } else if (SC >= 3799) { return 1; } } } else if (diffMVdiffVal >= 1728) { return 1; } } } } } else if (gchDC >= 27) { if (TSC < 25) { if (diffMVdiffVal < 97) { if (ssDCval < 68) { if (MVDiff < 106) { if (SC < 1205) { return 1; } else if (SC >= 1205) { if (CsDiff < 16) { return 0; } else if (CsDiff >= 16) { return 1; } } } else if (MVDiff >= 106) { return 0; } } else if (ssDCval >= 68) { return 1; } } else if (diffMVdiffVal >= 97) { if (diffAFD < 17) { if (TSC < 22) { if (MVDiff < 362) { if (AFD < 12) { return 0; } else if (AFD >= 12) { return 1; } } else if (MVDiff >= 362) { if (AFD < 27) { if (AFD < 23) { return 0; } else if (AFD >= 23) { return 1; } } else if (AFD >= 27) { return 0; } } } else if (TSC >= 22) { return 1; } } else if (diffAFD >= 17) { if (Rs < 4411) { if (negBalance < 69) { if (RsDiff < 13) { return 0; } else if (RsDiff >= 13) { return 1; } } else if (negBalance >= 69) { if (Rs < 7) { if (Rs < 4) { return 1; } else if (Rs >= 4) { return 0; } } else if (Rs >= 7) { return 1; } } } else if (Rs >= 4411) { return 0; } } } } else if (TSC >= 25) { if (posBalance < 12) { if (diffMVdiffVal < 312) { return 0; } else if (diffMVdiffVal >= 312) { if (SC < 533) { return 0; } else if (SC >= 533) { return 1; } } } else if (posBalance >= 12) { if (diffTSC < 16) { if (ssDCval < 121) { return 0; } else if (ssDCval >= 121) { if (TSC < 27) { return 1; } else if (TSC >= 27) { return 0; } } } else if (diffTSC >= 16) { if (negBalance < 70) { return 0; } else if (negBalance >= 70) { return 1; } } } } } } else if (posBalance >= 29) { if (diffTSC < 6) { if (Scindex < 3) { if (refDCval < 62) { if (diffAFD < 7) { if (refDCval < 34) { return 1; } else if (refDCval >= 34) { return 0; } } else if (diffAFD >= 7) { if (ssDCval < 52) { return 1; } else if (ssDCval >= 52) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { return 0; } } } } else if (refDCval >= 62) { if (diffRsCsdiff < 18) { return 0; } else if (diffRsCsdiff >= 18) { if (SC < 341) { return 1; } else if (SC >= 341) { return 0; } } } } else if (Scindex >= 3) { if (TSC < 34) { if (diffAFD < 7) { if (ssDCval < 38) { if (negBalance < 74) { return 1; } else if (negBalance >= 74) { return 0; } } else if (ssDCval >= 38) { return 0; } } else if (diffAFD >= 7) { if (negBalance < 66) { if (SC < 1438) { if (RsCsDiff < 83) { if (Cs < 171) { return 1; } else if (Cs >= 171) { return 0; } } else if (RsCsDiff >= 83) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { if (Cs < 422) { if (Rs < 950) { return 0; } else if (Rs >= 950) { return 1; } } else if (Cs >= 422) { return 1; } } } } else if (SC >= 1438) { return 0; } } else if (negBalance >= 66) { if (Cs < 498) { if (posBalance < 46) { return 1; } else if (posBalance >= 46) { if (diffAFD < 15) { return 0; } else if (diffAFD >= 15) { return 1; } } } else if (Cs >= 498) { if (TSC < 20) { return 0; } else if (TSC >= 20) { if (RsDiff < 28) { if (SC < 2822) { if (Rs < 1123) { return 0; } else if (Rs >= 1123) { return 1; } } else if (SC >= 2822) { return 0; } } else if (RsDiff >= 28) { return 1; } } } } } } else if (TSC >= 34) { return 1; } } } else if (diffTSC >= 6) { if (diffAFD < 25) { if (SC < 594) { return 1; } else if (SC >= 594) { if (AFD < 31) { if (Cs < 375) { if (diffMVdiffVal < 84) { if (MVDiff < 292) { return 0; } else if (MVDiff >= 292) { return 1; } } else if (diffMVdiffVal >= 84) { if (Cs < 371) { return 1; } else if (Cs >= 371) { if (Rs < 450) { return 1; } else if (Rs >= 450) { return 0; } } } } else if (Cs >= 375) { if (diffAFD < 13) { if (ssDCval < 70) { return 1; } else if (ssDCval >= 70) { return 0; } } else if (diffAFD >= 13) { return 1; } } } else if (AFD >= 31) { if (diffTSC < 9) { if (refDCval < 90) { if (TSC < 18) { return 0; } else if (TSC >= 18) { if (RsDiff < 28) { return 1; } else if (RsDiff >= 28) { return 0; } } } else if (refDCval >= 90) { return 0; } } else if (diffTSC >= 9) { if (negBalance < 39) { if (AFD < 40) { if (Cs < 506) { return 0; } else if (Cs >= 506) { return 1; } } else if (AFD >= 40) { return 0; } } else if (negBalance >= 39) { if (diffRsCsdiff < 180) { if (ssDCval < 84) { return 1; } else if (ssDCval >= 84) { if (Cs < 678) { return 1; } else if (Cs >= 678) { if (ssDCval < 131) { return 0; } else if (ssDCval >= 131) { if (Rs < 813) { return 0; } else if (Rs >= 813) { return 1; } } } } } else if (diffRsCsdiff >= 180) { if (diffMVdiffVal < 92) { if (diffAFD < 16) { return 0; } else if (diffAFD >= 16) { return 1; } } else if (diffMVdiffVal >= 92) { return 1; } } } } } } } else if (diffAFD >= 25) { if (diffMVdiffVal < 55) { if (Rs < 1339) { return 1; } else if (Rs >= 1339) { return 0; } } else if (diffMVdiffVal >= 55) { if (diffTSC < 12) { if (negBalance < 64) { if (SC < 2363) { if (RsCsDiff < 47) { if (posBalance < 64) { return 0; } else if (posBalance >= 64) { return 1; } } else if (RsCsDiff >= 47) { return 1; } } else if (SC >= 2363) { if (diffMVdiffVal < 95) { return 1; } else if (diffMVdiffVal >= 95) { return 0; } } } else if (negBalance >= 64) { if (posBalance < 30) { return 0; } else if (posBalance >= 30) { if (AFD < 54) { return 1; } else if (AFD >= 54) { if (CsDiff < 9) { return 0; } else if (CsDiff >= 9) { return 1; } } } } } else if (diffTSC >= 12) { if (diffAFD < 38) { if (gchDC < 21) { if (AFD < 41) { return 1; } else if (AFD >= 41) { if (diffMVdiffVal < 77) { if (ssDCval < 56) { return 0; } else if (ssDCval >= 56) { return 1; } } else if (diffMVdiffVal >= 77) { return 1; } } } else if (gchDC >= 21) { if (posBalance < 52) { return 1; } else if (posBalance >= 52) { if (ssDCval < 113) { if (ssDCval < 86) { if (posBalance < 76) { if (RsDiff < 19) { return 0; } else if (RsDiff >= 19) { return 1; } } else if (posBalance >= 76) { return 1; } } else if (ssDCval >= 86) { return 1; } } else if (ssDCval >= 113) { if (SC < 1058) { return 1; } else if (SC >= 1058) { if (TSC < 33) { return 0; } else if (TSC >= 33) { return 1; } } } } } } else if (diffAFD >= 38) { if (ssDCval < 48) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (ssDCval >= 48) { if (Rs < 9291) { return 1; } else if (Rs >= 9291) { if (TSC < 32) { return 0; } else if (TSC >= 32) { return 1; } } } } } } } } } } } } return 0; } bool SCDetectB(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffMVdiffVal < 56) { if (AFD < 27) { if (diffAFD < 9) { if (diffAFD < 3) { if (SC < 87) { if (gchDC < 4) { if (diffTSC < -2) { if (gchDC < 1) { return 0; } else if (gchDC >= 1) { if (ssDCval < 25) { if (diffTSC < -3) { return 0; } else if (diffTSC >= -3) { if (Cs < 2) { return 0; } else if (Cs >= 2) { return 1; } } } else if (ssDCval >= 25) { return 0; } } } else if (diffTSC >= -2) { return 0; } } else if (gchDC >= 4) { if (RsCsDiff < 35) { if (refDCval < 226) { if (MVDiff < 4) { if (MVDiff < 3) { return 0; } else if (MVDiff >= 3) { if (SC < 5) { return 1; } else if (SC >= 5) { return 0; } } } else if (MVDiff >= 4) { return 0; } } else if (refDCval >= 226) { return 1; } } else if (RsCsDiff >= 35) { return 1; } } } else if (SC >= 87) { if (diffRsCsdiff < 5) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (Cs < 68) { return 1; } else if (Cs >= 68) { return 0; } } } else if (diffRsCsdiff >= 5) { if (AFD < 2) { if (refDCval < 20) { return 1; } else if (refDCval >= 20) { return 0; } } else if (AFD >= 2) { if (negBalance < 9) { if (CsDiff < 33) { if (Rs < 525) { if (Rs < 414) { return 0; } else if (Rs >= 414) { return 1; } } else if (Rs >= 525) { return 0; } } else if (CsDiff >= 33) { return 1; } } else if (negBalance >= 9) { return 0; } } } } } else if (diffAFD >= 3) { if (posBalance < 9) { if (ssDCval < 31) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { return 1; } } else if (ssDCval >= 31) { return 0; } } else if (posBalance >= 9) { if (negBalance < 17) { if (RsDiff < 44) { if (MVDiff < 379) { return 0; } else if (MVDiff >= 379) { if (Rs < 117) { return 0; } else if (Rs >= 117) { return 1; } } } else if (RsDiff >= 44) { if (Cs < 2386) { return 0; } else if (Cs >= 2386) { return 1; } } } else if (negBalance >= 17) { return 0; } } } } else if (diffAFD >= 9) { if (refDCval < 43) { if (SC < 162) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } else if (SC >= 162) { if (CsDiff < 15) { if (diffRsCsdiff < -459) { return 1; } else if (diffRsCsdiff >= -459) { if (ssDCval < 44) { if (TSCindex < 9) { return 0; } else if (TSCindex >= 9) { if (negBalance < 1) { return 1; } else if (negBalance >= 1) { if (RsCsDiff < 110) { return 0; } else if (RsCsDiff >= 110) { if (RsDiff < 11) { return 1; } else if (RsDiff >= 11) { return 0; } } } } } else if (ssDCval >= 44) { return 0; } } } else if (CsDiff >= 15) { return 1; } } } else if (refDCval >= 43) { if (diffMVdiffVal < 48) { if (diffTSC < 20) { if (gchDC < 7) { return 0; } else if (gchDC >= 7) { if (Cs < 192) { if (Rs < 2389) { if (diffTSC < 3) { if (ssDCval < 56) { return 1; } else if (ssDCval >= 56) { return 0; } } else if (diffTSC >= 3) { return 0; } } else if (Rs >= 2389) { return 1; } } else if (Cs >= 192) { return 0; } } } else if (diffTSC >= 20) { return 1; } } else if (diffMVdiffVal >= 48) { if (SC < 6361) { if (diffRsCsdiff < 148) { return 0; } else if (diffRsCsdiff >= 148) { return 1; } } else if (SC >= 6361) { return 1; } } } } } else if (AFD >= 27) { if (diffRsCsdiff < 56) { if (AFD < 58) { if (diffTSC < 20) { if (diffAFD < -7) { if (RsDiff < 103) { if (refDCval < 56) { if (posBalance < 39) { return 0; } else if (posBalance >= 39) { if (Rs < 794) { return 1; } else if (Rs >= 794) { return 0; } } } else if (refDCval >= 56) { if (AFD < 48) { return 0; } else if (AFD >= 48) { if (gchDC < 37) { return 0; } else if (gchDC >= 37) { if (RsDiff < 11) { return 0; } else if (RsDiff >= 11) { return 1; } } } } } else if (RsDiff >= 103) { return 1; } } else if (diffAFD >= -7) { if (Rs < 115) { if (Rs < 114) { return 0; } else if (Rs >= 114) { return 1; } } else if (Rs >= 115) { return 0; } } } else if (diffTSC >= 20) { if (ssDCval < 66) { if (AFD < 40) { return 1; } else if (AFD >= 40) { return 0; } } else if (ssDCval >= 66) { if (CsDiff < 3) { if (Cs < 224) { return 0; } else if (Cs >= 224) { return 1; } } else if (CsDiff >= 3) { return 0; } } } } else if (AFD >= 58) { if (CsDiff < 12) { if (diffRsCsdiff < 21) { return 0; } else if (diffRsCsdiff >= 21) { if (TSC < 24) { return 0; } else if (TSC >= 24) { return 1; } } } else if (CsDiff >= 12) { if (ssDCval < 105) { return 1; } else if (ssDCval >= 105) { if (Rs < 1778) { return 1; } else if (Rs >= 1778) { return 0; } } } } } else if (diffRsCsdiff >= 56) { if (refDCval < 69) { if (TSC < 30) { if (SC < 1428) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { if (RsCsDiff < 158) { return 1; } else if (RsCsDiff >= 158) { return 0; } } } else if (SC >= 1428) { if (diffMVdiffVal < 49) { if (diffRsCsdiff < 19722) { if (diffRsCsdiff < 257) { if (SC < 2249) { if (posBalance < 52) { return 0; } else if (posBalance >= 52) { if (Rs < 962) { if (MVDiff < 508) { return 0; } else if (MVDiff >= 508) { return 1; } } else if (Rs >= 962) { return 1; } } } else if (SC >= 2249) { if (diffAFD < -5) { if (RsDiff < 23) { return 1; } else if (RsDiff >= 23) { return 0; } } else if (diffAFD >= -5) { return 0; } } } else if (diffRsCsdiff >= 257) { return 0; } } else if (diffRsCsdiff >= 19722) { return 1; } } else if (diffMVdiffVal >= 49) { if (Rs < 1453) { return 0; } else if (Rs >= 1453) { return 1; } } } } else if (TSC >= 30) { if (diffMVdiffVal < 35) { if (refDCval < 16) { return 0; } else if (refDCval >= 16) { return 1; } } else if (diffMVdiffVal >= 35) { return 0; } } } else if (refDCval >= 69) { if (gchDC < 7) { if (MVDiff < 120) { return 0; } else if (MVDiff >= 120) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { return 1; } } } else if (gchDC >= 7) { if (AFD < 49) { if (diffTSC < 11) { if (diffRsCsdiff < 924) { return 0; } else if (diffRsCsdiff >= 924) { if (SC < 6789) { if (CsDiff < 28) { return 1; } else if (CsDiff >= 28) { return 0; } } else if (SC >= 6789) { return 0; } } } else if (diffTSC >= 11) { if (refDCval < 86) { if (Cs < 3622) { return 1; } else if (Cs >= 3622) { return 0; } } else if (refDCval >= 86) { if (negBalance < 106) { return 0; } else if (negBalance >= 106) { if (Rs < 970) { return 1; } else if (Rs >= 970) { return 0; } } } } } else if (AFD >= 49) { if (SC < 2266) { return 0; } else if (SC >= 2266) { if (RsDiff < 30) { if (AFD < 54) { return 0; } else if (AFD >= 54) { if (RsDiff < 23) { if (diffRsCsdiff < 144) { return 0; } else if (diffRsCsdiff >= 144) { return 1; } } else if (RsDiff >= 23) { return 0; } } } else if (RsDiff >= 30) { return 1; } } } } } } } } else if (diffMVdiffVal >= 56) { if (CsDiff < 7) { if (diffMVdiffVal < 129) { if (diffAFD < 8) { if (diffTSC < 1) { return 0; } else if (diffTSC >= 1) { if (diffRsCsdiff < 12) { return 0; } else if (diffRsCsdiff >= 12) { if (RsCsDiff < 15) { return 1; } else if (RsCsDiff >= 15) { if (MVDiff < 267) { return 0; } else if (MVDiff >= 267) { if (MVDiff < 300) { return 1; } else if (MVDiff >= 300) { if (gchDC < 5) { return 1; } else if (gchDC >= 5) { return 0; } } } } } } } else if (diffAFD >= 8) { if (MVDiff < 126) { if (ssDCval < 54) { if (Cs < 202) { return 1; } else if (Cs >= 202) { if (posBalance < 52) { if (Rs < 203) { return 0; } else if (Rs >= 203) { return 1; } } else if (posBalance >= 52) { if (diffRsCsdiff < 46) { if (Rs < 416) { return 0; } else if (Rs >= 416) { return 1; } } else if (diffRsCsdiff >= 46) { return 0; } } } } else if (ssDCval >= 54) { if (diffAFD < 25) { if (RsDiff < 10) { if (posBalance < 53) { if (AFD < 22) { return 0; } else if (AFD >= 22) { return 1; } } else if (posBalance >= 53) { return 0; } } else if (RsDiff >= 10) { if (TSC < 18) { return 1; } else if (TSC >= 18) { return 0; } } } else if (diffAFD >= 25) { if (RsCsDiff < 41) { if (MVDiff < 80) { return 0; } else if (MVDiff >= 80) { return 1; } } else if (RsCsDiff >= 41) { return 1; } } } } else if (MVDiff >= 126) { if (gchDC < 9) { if (diffAFD < 10) { return 0; } else if (diffAFD >= 10) { if (diffMVdiffVal < 96) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { return 1; } } else if (diffMVdiffVal >= 96) { if (diffAFD < 30) { return 1; } else if (diffAFD >= 30) { return 0; } } } } else if (gchDC >= 9) { if (diffRsCsdiff < 25) { if (diffTSC < -1) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } else if (diffTSC >= -1) { if (posBalance < 13) { if (diffMVdiffVal < 65) { return 1; } else if (diffMVdiffVal >= 65) { return 0; } } else if (posBalance >= 13) { return 0; } } } else if (diffRsCsdiff >= 25) { if (CsDiff < 5) { if (negBalance < 29) { return 0; } else if (negBalance >= 29) { if (TSC < 30) { return 1; } else if (TSC >= 30) { return 0; } } } else if (CsDiff >= 5) { return 0; } } } } } } else if (diffMVdiffVal >= 129) { if (diffAFD < 12) { if (Scindex < 2) { if (diffAFD < 7) { if (diffTSC < -38) { return 1; } else if (diffTSC >= -38) { if (diffAFD < -1) { if (RsCsDiff < 6) { return 0; } else if (RsCsDiff >= 6) { if (gchDC < 125) { return 0; } else if (gchDC >= 125) { return 1; } } } else if (diffAFD >= -1) { if (RsCsDiff < 47) { if (SC < 22) { if (SC < 19) { if (negBalance < 126) { return 0; } else if (negBalance >= 126) { if (AFD < 8) { return 0; } else if (AFD >= 8) { return 1; } } } else if (SC >= 19) { return 1; } } else if (SC >= 22) { return 0; } } else if (RsCsDiff >= 47) { return 1; } } } } else if (diffAFD >= 7) { if (AFD < 15) { if (AFD < 8) { return 0; } else if (AFD >= 8) { if (SC < 102) { if (Cs < 22) { return 1; } else if (Cs >= 22) { return 0; } } else if (SC >= 102) { return 1; } } } else if (AFD >= 15) { if (Cs < 29) { return 0; } else if (Cs >= 29) { if (posBalance < 41) { if (RsCsDiff < 38) { return 0; } else if (RsCsDiff >= 38) { return 1; } } else if (posBalance >= 41) { if (TSC < 13) { return 1; } else if (TSC >= 13) { return 0; } } } } } } else if (Scindex >= 2) { if (ssDCval < 50) { if (AFD < 13) { return 0; } else if (AFD >= 13) { if (MVDiff < 190) { return 1; } else if (MVDiff >= 190) { if (diffTSC < 4) { if (diffRsCsdiff < 47) { return 0; } else if (diffRsCsdiff >= 47) { if (RsCsDiff < 89) { return 1; } else if (RsCsDiff >= 89) { return 0; } } } else if (diffTSC >= 4) { if (MVDiff < 570) { return 1; } else if (MVDiff >= 570) { return 0; } } } } } else if (ssDCval >= 50) { return 0; } } } else if (diffAFD >= 12) { if (negBalance < 43) { if (Cs < 689) { if (diffTSC < 9) { if (refDCval < 84) { if (TSC < 12) { if (Rs < 540) { return 1; } else if (Rs >= 540) { return 0; } } else if (TSC >= 12) { return 0; } } else if (refDCval >= 84) { return 0; } } else if (diffTSC >= 9) { if (ssDCval < 47) { return 1; } else if (ssDCval >= 47) { if (negBalance < 21) { if (posBalance < 104) { if (SC < 1737) { return 0; } else if (SC >= 1737) { return 1; } } else if (posBalance >= 104) { if (diffRsCsdiff < 3) { if (negBalance < 6) { return 0; } else if (negBalance >= 6) { if (RsDiff < 1) { return 1; } else if (RsDiff >= 1) { return 0; } } } else if (diffRsCsdiff >= 3) { if (ssDCval < 105) { if (MVDiff < 583) { if (negBalance < 14) { if (Cs < 247) { return 1; } else if (Cs >= 247) { return 0; } } else if (negBalance >= 14) { return 1; } } else if (MVDiff >= 583) { return 1; } } else if (ssDCval >= 105) { if (gchDC < 163) { return 1; } else if (gchDC >= 163) { if (Rs < 1) { return 1; } else if (Rs >= 1) { return 0; } } } } } } else if (negBalance >= 21) { if (ssDCval < 100) { if (Rs < 615) { return 1; } else if (Rs >= 615) { if (negBalance < 31) { return 0; } else if (negBalance >= 31) { if (MVDiff < 477) { return 1; } else if (MVDiff >= 477) { if (Cs < 615) { return 0; } else if (Cs >= 615) { return 1; } } } } } else if (ssDCval >= 100) { return 1; } } } } } else if (Cs >= 689) { if (Rs < 1362) { return 0; } else if (Rs >= 1362) { if (Cs < 825) { return 1; } else if (Cs >= 825) { if (RsDiff < 9) { return 1; } else if (RsDiff >= 9) { return 0; } } } } } else if (negBalance >= 43) { if (MVDiff < 474) { if (diffMVdiffVal < 211) { if (diffTSC < 9) { if (refDCval < 66) { if (SC < 1047) { return 1; } else if (SC >= 1047) { return 0; } } else if (refDCval >= 66) { return 0; } } else if (diffTSC >= 9) { if (MVDiff < 283) { return 1; } else if (MVDiff >= 283) { if (Rs < 468) { return 1; } else if (Rs >= 468) { return 0; } } } } else if (diffMVdiffVal >= 211) { return 1; } } else if (MVDiff >= 474) { if (refDCval < 64) { return 1; } else if (refDCval >= 64) { if (diffMVdiffVal < 683) { if (Rs < 82) { return 0; } else if (Rs >= 82) { if (AFD < 39) { return 1; } else if (AFD >= 39) { if (ssDCval < 95) { return 0; } else if (ssDCval >= 95) { if (ssDCval < 100) { return 1; } else if (ssDCval >= 100) { if (ssDCval < 113) { return 0; } else if (ssDCval >= 113) { return 1; } } } } } } else if (diffMVdiffVal >= 683) { if (negBalance < 118) { if (CsDiff < 5) { if (diffTSC < -1) { return 0; } else if (diffTSC >= -1) { if (TSC < 24) { if (AFD < 28) { return 0; } else if (AFD >= 28) { return 1; } } else if (TSC >= 24) { return 0; } } } else if (CsDiff >= 5) { return 1; } } else if (negBalance >= 118) { return 1; } } } } } } } } else if (CsDiff >= 7) { if (diffAFD < 15) { if (SC < 2038) { if (diffAFD < 7) { if (refDCval < 46) { if (SC < 1285) { return 1; } else if (SC >= 1285) { return 0; } } else if (refDCval >= 46) { if (AFD < 27) { return 0; } else if (AFD >= 27) { if (AFD < 28) { return 1; } else if (AFD >= 28) { if (diffMVdiffVal < 168) { if (diffRsCsdiff < -82) { return 1; } else if (diffRsCsdiff >= -82) { if (ssDCval < 42) { return 1; } else if (ssDCval >= 42) { if (AFD < 46) { return 0; } else if (AFD >= 46) { return 1; } } } } else if (diffMVdiffVal >= 168) { return 0; } } } } } else if (diffAFD >= 7) { if (gchDC < 2) { return 1; } else if (gchDC >= 2) { if (negBalance < 44) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { if (RsCsDiff < 95) { return 0; } else if (RsCsDiff >= 95) { return 1; } } } else if (negBalance >= 44) { if (gchDC < 47) { if (negBalance < 72) { return 1; } else if (negBalance >= 72) { if (refDCval < 118) { if (MVDiff < 216) { if (TSC < 12) { return 1; } else if (TSC >= 12) { return 0; } } else if (MVDiff >= 216) { return 1; } } else if (refDCval >= 118) { return 0; } } } else if (gchDC >= 47) { return 0; } } } } } else if (SC >= 2038) { if (ssDCval < 39) { if (TSC < 13) { return 1; } else if (TSC >= 13) { return 0; } } else if (ssDCval >= 39) { if (Rs < 2023) { if (TSC < 22) { return 0; } else if (TSC >= 22) { if (negBalance < 77) { return 0; } else if (negBalance >= 77) { if (diffRsCsdiff < 118) { if (SC < 3117) { return 0; } else if (SC >= 3117) { return 1; } } else if (diffRsCsdiff >= 118) { return 1; } } } } else if (Rs >= 2023) { return 0; } } } } else if (diffAFD >= 15) { if (diffAFD < 30) { if (ssDCval < 69) { if (AFD < 34) { if (AFD < 22) { if (diffTSC < 14) { return 1; } else if (diffTSC >= 14) { return 0; } } else if (AFD >= 22) { return 1; } } else if (AFD >= 34) { if (Rs < 606) { return 1; } else if (Rs >= 606) { if (Rs < 773) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { return 0; } } else if (Rs >= 773) { if (TSC < 15) { return 0; } else if (TSC >= 15) { if (refDCval < 92) { return 1; } else if (refDCval >= 92) { if (SC < 4527) { return 1; } else if (SC >= 4527) { return 0; } } } } } } } else if (ssDCval >= 69) { if (negBalance < 24) { if (diffRsCsdiff < 208) { return 0; } else if (diffRsCsdiff >= 208) { if (MVDiff < 144) { if (refDCval < 42) { if (Rs < 1058) { return 1; } else if (Rs >= 1058) { if (Rs < 2960) { return 0; } else if (Rs >= 2960) { return 1; } } } else if (refDCval >= 42) { return 0; } } else if (MVDiff >= 144) { if (RsDiff < 18) { return 1; } else if (RsDiff >= 18) { if (SC < 6511) { return 0; } else if (SC >= 6511) { return 1; } } } } } else if (negBalance >= 24) { if (diffTSC < 10) { if (diffAFD < 21) { if (ssDCval < 73) { if (SC < 2204) { return 1; } else if (SC >= 2204) { return 0; } } else if (ssDCval >= 73) { return 0; } } else if (diffAFD >= 21) { if (diffMVdiffVal < 107) { return 0; } else if (diffMVdiffVal >= 107) { if (refDCval < 101) { return 1; } else if (refDCval >= 101) { if (AFD < 34) { return 1; } else if (AFD >= 34) { if (diffAFD < 23) { return 0; } else if (diffAFD >= 23) { if (diffTSC < 8) { return 1; } else if (diffTSC >= 8) { return 0; } } } } } } } else if (diffTSC >= 10) { if (gchDC < 57) { if (posBalance < 40) { if (posBalance < 33) { return 1; } else if (posBalance >= 33) { return 0; } } else if (posBalance >= 40) { if (CsDiff < 14) { if (negBalance < 37) { if (diffTSC < 15) { if (ssDCval < 87) { return 1; } else if (ssDCval >= 87) { return 0; } } else if (diffTSC >= 15) { return 1; } } else if (negBalance >= 37) { return 1; } } else if (CsDiff >= 14) { return 1; } } } else if (gchDC >= 57) { if (posBalance < 2) { return 1; } else if (posBalance >= 2) { return 0; } } } } } } else if (diffAFD >= 30) { if (refDCval < 46) { if (gchDC < 36) { return 1; } else if (gchDC >= 36) { if (RsCsDiff < 1262) { if (refDCval < 44) { if (posBalance < 123) { if (AFD < 71) { if (MVDiff < 159) { if (Cs < 1432) { return 1; } else if (Cs >= 1432) { return 0; } } else if (MVDiff >= 159) { return 1; } } else if (AFD >= 71) { return 0; } } else if (posBalance >= 123) { return 0; } } else if (refDCval >= 44) { return 0; } } else if (RsCsDiff >= 1262) { return 1; } } } else if (refDCval >= 46) { if (CsDiff < 13) { if (diffRsCsdiff < -1) { return 0; } else if (diffRsCsdiff >= -1) { if (posBalance < 81) { return 1; } else if (posBalance >= 81) { if (Rs < 785) { return 1; } else if (Rs >= 785) { if (CsDiff < 12) { if (refDCval < 74) { return 1; } else if (refDCval >= 74) { if (diffTSC < 21) { return 1; } else if (diffTSC >= 21) { return 0; } } } else if (CsDiff >= 12) { if (RsCsDiff < 401) { if (Rs < 813) { return 0; } else if (Rs >= 813) { return 1; } } else if (RsCsDiff >= 401) { return 0; } } } } } } else if (CsDiff >= 13) { if (gchDC < 84) { if (negBalance < 43) { if (negBalance < 42) { if (AFD < 61) { return 1; } else if (AFD >= 61) { if (diffAFD < 46) { return 0; } else if (diffAFD >= 46) { return 1; } } } else if (negBalance >= 42) { if (AFD < 53) { return 1; } else if (AFD >= 53) { return 0; } } } else if (negBalance >= 43) { return 1; } } else if (gchDC >= 84) { return 0; } } } } } } } return 0; } bool SCDetectC(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 /*Scindex*/, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffMVdiffVal < 58) { if (diffTSC < 8) { if (MVDiff < 140) { if (TSC < 24) { if (posBalance < 14) { if (RsCsDiff < 252) { if (ssDCval < 18) { if (diffRsCsdiff < 7) { if (negBalance < 1) { return 0; } else if (negBalance >= 1) { if (Cs < 646) { if (Cs < 629) { return 0; } else if (Cs >= 629) { return 1; } } else if (Cs >= 646) { return 0; } } } else if (diffRsCsdiff >= 7) { return 1; } } else if (ssDCval >= 18) { if (refDCval < 229) { return 0; } else if (refDCval >= 229) { if (gchDC < 5) { return 0; } else if (gchDC >= 5) { return 1; } } } } else if (RsCsDiff >= 252) { if (refDCval < 74) { if (RsDiff < 30) { return 1; } else if (RsDiff >= 30) { return 0; } } else if (refDCval >= 74) { if (RsCsDiff < 2394) { return 0; } else if (RsCsDiff >= 2394) { return 1; } } } } else if (posBalance >= 14) { if (posBalance < 128) { if (RsDiff < 45) { return 0; } else if (RsDiff >= 45) { if (TSC < 6) { return 1; } else if (TSC >= 6) { return 0; } } } else if (posBalance >= 128) { return 1; } } } else if (TSC >= 24) { if (refDCval < 99) { if (posBalance < 86) { return 1; } else if (posBalance >= 86) { return 0; } } else if (refDCval >= 99) { return 0; } } } else if (MVDiff >= 140) { if (diffRsCsdiff < -4) { if (gchDC < 5) { return 0; } else if (gchDC >= 5) { if (diffTSC < -6) { return 0; } else if (diffTSC >= -6) { if (ssDCval < 24) { return 1; } else if (ssDCval >= 24) { if (refDCval < 29) { return 1; } else if (refDCval >= 29) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (Rs < 116) { return 1; } else if (Rs >= 116) { if (diffTSC < -5) { if (SC < 2729) { return 1; } else if (SC >= 2729) { return 0; } } else if (diffTSC >= -5) { return 0; } } } } } } } } else if (diffRsCsdiff >= -4) { if (AFD < 62) { if (negBalance < 66) { if (ssDCval < 62) { if (Cs < 481) { if (diffAFD < -21) { if (gchDC < 1) { return 0; } else if (gchDC >= 1) { if (SC < 11) { return 1; } else if (SC >= 11) { return 0; } } } else if (diffAFD >= -21) { if (negBalance < 64) { return 0; } else if (negBalance >= 64) { if (refDCval < 33) { return 1; } else if (refDCval >= 33) { return 0; } } } } else if (Cs >= 481) { if (MVDiff < 333) { if (diffRsCsdiff < 244) { return 0; } else if (diffRsCsdiff >= 244) { if (Cs < 963) { return 0; } else if (Cs >= 963) { return 1; } } } else if (MVDiff >= 333) { if (SC < 1184) { return 1; } else if (SC >= 1184) { return 0; } } } } else if (ssDCval >= 62) { return 0; } } else if (negBalance >= 66) { if (ssDCval < 53) { if (RsCsDiff < 2) { return 0; } else if (RsCsDiff >= 2) { if (diffTSC < 2) { if (negBalance < 71) { if (gchDC < 6) { return 0; } else if (gchDC >= 6) { return 1; } } else if (negBalance >= 71) { return 0; } } else if (diffTSC >= 2) { if (diffRsCsdiff < 1) { return 0; } else if (diffRsCsdiff >= 1) { return 1; } } } } else if (ssDCval >= 53) { if (ssDCval < 78) { if (negBalance < 119) { if (ssDCval < 74) { return 0; } else if (ssDCval >= 74) { if (RsDiff < 58) { return 0; } else if (RsDiff >= 58) { return 1; } } } else if (negBalance >= 119) { return 1; } } else if (ssDCval >= 78) { return 0; } } } } else if (AFD >= 62) { if (AFD < 67) { if (Rs < 1778) { return 1; } else if (Rs >= 1778) { if (TSC < 34) { return 0; } else if (TSC >= 34) { return 1; } } } else if (AFD >= 67) { return 0; } } } } } else if (diffTSC >= 8) { if (diffTSC < 13) { if (refDCval < 79) { if (diffAFD < 15) { if (diffMVdiffVal < 52) { if (CsDiff < 37) { if (RsDiff < 23) { if (refDCval < 32) { if (RsCsDiff < 68) { return 0; } else if (RsCsDiff >= 68) { return 1; } } else if (refDCval >= 32) { return 0; } } else if (RsDiff >= 23) { if (Cs < 1718) { return 1; } else if (Cs >= 1718) { return 0; } } } else if (CsDiff >= 37) { return 1; } } else if (diffMVdiffVal >= 52) { if (Cs < 1528) { return 1; } else if (Cs >= 1528) { return 0; } } } else if (diffAFD >= 15) { if (gchDC < 2) { return 0; } else if (gchDC >= 2) { if (Rs < 574) { if (diffTSC < 10) { if (RsDiff < 4) { if (SC < 813) { return 1; } else if (SC >= 813) { return 0; } } else if (RsDiff >= 4) { return 0; } } else if (diffTSC >= 10) { return 0; } } else if (Rs >= 574) { if (AFD < 28) { if (RsCsDiff < 259) { return 0; } else if (RsCsDiff >= 259) { return 1; } } else if (AFD >= 28) { if (Rs < 2553) { return 1; } else if (Rs >= 2553) { return 0; } } } } } } else if (refDCval >= 79) { if (diffMVdiffVal < -28) { if (TSC < 20) { if (RsCsDiff < 25) { return 0; } else if (RsCsDiff >= 25) { if (ssDCval < 111) { return 1; } else if (ssDCval >= 111) { return 0; } } } else if (TSC >= 20) { return 0; } } else if (diffMVdiffVal >= -28) { if (SC < 1999) { if (SC < 1909) { return 0; } else if (SC >= 1909) { return 1; } } else if (SC >= 1999) { return 0; } } } } else if (diffTSC >= 13) { if (diffTSC < 28) { if (RsCsDiff < 583) { if (negBalance < 30) { if (diffAFD < 5) { if (Rs < 1156) { return 1; } else if (Rs >= 1156) { return 0; } } else if (diffAFD >= 5) { return 0; } } else if (negBalance >= 30) { if (refDCval < 103) { if (ssDCval < 54) { return 0; } else if (ssDCval >= 54) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { if (RsCsDiff < 485) { if (MVDiff < 47) { if (diffMVdiffVal < 24) { return 0; } else if (diffMVdiffVal >= 24) { return 1; } } else if (MVDiff >= 47) { return 1; } } else if (RsCsDiff >= 485) { return 0; } } } } else if (refDCval >= 103) { if (ssDCval < 55) { return 1; } else if (ssDCval >= 55) { if (AFD < 58) { return 0; } else if (AFD >= 58) { if (RsDiff < 13) { return 0; } else if (RsDiff >= 13) { return 1; } } } } } } else if (RsCsDiff >= 583) { if (CsDiff < 25) { if (diffRsCsdiff < 344) { return 0; } else if (diffRsCsdiff >= 344) { if (ssDCval < 105) { return 1; } else if (ssDCval >= 105) { if (ssDCval < 134) { return 0; } else if (ssDCval >= 134) { return 1; } } } } else if (CsDiff >= 25) { if (gchDC < 11) { return 0; } else if (gchDC >= 11) { if (gchDC < 53) { return 1; } else if (gchDC >= 53) { return 0; } } } } } else if (diffTSC >= 28) { if (MVDiff < 36) { return 1; } else if (MVDiff >= 36) { if (TSC < 57) { if (diffMVdiffVal < -97) { if (Cs < 683) { return 0; } else if (Cs >= 683) { return 1; } } else if (diffMVdiffVal >= -97) { if (RsDiff < 186) { return 0; } else if (RsDiff >= 186) { return 1; } } } else if (TSC >= 57) { return 1; } } } } } } else if (diffMVdiffVal >= 58) { if (CsDiff < 8) { if (TSCindex < 8) { if (ssDCval < 41) { if (diffTSC < 2) { if (gchDC < 20) { if (TSCindex < 5) { return 0; } else if (TSCindex >= 5) { if (negBalance < 73) { if (gchDC < 16) { if (SC < 29) { if (SC < 11) { return 0; } else if (SC >= 11) { return 1; } } else if (SC >= 29) { return 0; } } else if (gchDC >= 16) { return 1; } } else if (negBalance >= 73) { return 0; } } } else if (gchDC >= 20) { return 1; } } else if (diffTSC >= 2) { if (diffAFD < 8) { if (Cs < 36) { return 0; } else if (Cs >= 36) { if (CsDiff < 2) { return 1; } else if (CsDiff >= 2) { return 0; } } } else if (diffAFD >= 8) { if (Cs < 162) { if (TSC < 5) { if (RsDiff < 1) { return 1; } else if (RsDiff >= 1) { return 0; } } else if (TSC >= 5) { return 1; } } else if (Cs >= 162) { if (gchDC < 2) { return 0; } else if (gchDC >= 2) { return 1; } } } } } else if (ssDCval >= 41) { if (refDCval < 30) { return 1; } else if (refDCval >= 30) { if (MVDiff < 3438) { return 0; } else if (MVDiff >= 3438) { return 1; } } } } else if (TSCindex >= 8) { if (diffAFD < 10) { if (ssDCval < 40) { if (ssDCval < 24) { return 1; } else if (ssDCval >= 24) { if (RsDiff < 7) { if (diffAFD < 8) { if (MVDiff < 1169) { return 0; } else if (MVDiff >= 1169) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } } else if (diffAFD >= 8) { return 1; } } else if (RsDiff >= 7) { if (ssDCval < 32) { return 0; } else if (ssDCval >= 32) { if (SC < 1554) { return 1; } else if (SC >= 1554) { return 0; } } } } } else if (ssDCval >= 40) { if (negBalance < 1) { if (ssDCval < 228) { return 0; } else if (ssDCval >= 228) { return 1; } } else if (negBalance >= 1) { if (diffTSC < 5) { if (posBalance < 95) { return 0; } else if (posBalance >= 95) { if (MVDiff < 171) { if (Rs < 334) { return 1; } else if (Rs >= 334) { return 0; } } else if (MVDiff >= 171) { return 0; } } } else if (diffTSC >= 5) { if (gchDC < 7) { if (refDCval < 76) { return 1; } else if (refDCval >= 76) { return 0; } } else if (gchDC >= 7) { return 0; } } } } } else if (diffAFD >= 10) { if (negBalance < 34) { if (diffAFD < 23) { if (AFD < 23) { if (SC < 819) { if (Cs < 83) { return 1; } else if (Cs >= 83) { if (gchDC < 27) { if (diffMVdiffVal < 106) { return 0; } else if (diffMVdiffVal >= 106) { if (AFD < 20) { if (CsDiff < 3) { if (TSC < 8) { return 1; } else if (TSC >= 8) { return 0; } } else if (CsDiff >= 3) { return 1; } } else if (AFD >= 20) { return 1; } } } else if (gchDC >= 27) { return 1; } } } else if (SC >= 819) { if (Cs < 545) { if (ssDCval < 43) { return 1; } else if (ssDCval >= 43) { return 0; } } else if (Cs >= 545) { return 0; } } } else if (AFD >= 23) { if (gchDC < 28) { if (diffMVdiffVal < 831) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (ssDCval < 73) { return 0; } else if (ssDCval >= 73) { if (negBalance < 22) { return 0; } else if (negBalance >= 22) { return 1; } } } } else if (diffMVdiffVal >= 831) { if (gchDC < 20) { return 1; } else if (gchDC >= 20) { if (TSC < 20) { return 1; } else if (TSC >= 20) { return 0; } } } } else if (gchDC >= 28) { return 0; } } } else if (diffAFD >= 23) { if (CsDiff < 4) { if (TSC < 32) { if (diffAFD < 33) { if (gchDC < 21) { return 1; } else if (gchDC >= 21) { if (diffRsCsdiff < 16) { return 0; } else if (diffRsCsdiff >= 16) { if (Rs < 454) { if (refDCval < 111) { return 1; } else if (refDCval >= 111) { return 0; } } else if (Rs >= 454) { return 0; } } } } else if (diffAFD >= 33) { return 1; } } else if (TSC >= 32) { if (MVDiff < 959) { return 0; } else if (MVDiff >= 959) { if (RsCsDiff < 11) { return 0; } else if (RsCsDiff >= 11) { return 1; } } } } else if (CsDiff >= 4) { if (RsDiff < 14) { if (SC < 1015) { return 1; } else if (SC >= 1015) { if (RsDiff < 5) { return 0; } else if (RsDiff >= 5) { if (Cs < 1017) { if (diffMVdiffVal < 87) { return 0; } else if (diffMVdiffVal >= 87) { if (Rs < 1495) { return 1; } else if (Rs >= 1495) { if (AFD < 59) { if (MVDiff < 174) { return 1; } else if (MVDiff >= 174) { return 0; } } else if (AFD >= 59) { return 0; } } } } else if (Cs >= 1017) { return 0; } } } } else if (RsDiff >= 14) { return 1; } } } } else if (negBalance >= 34) { if (diffAFD < 24) { if (ssDCval < 84) { if (refDCval < 49) { if (CsDiff < 5) { if (AFD < 11) { return 0; } else if (AFD >= 11) { return 1; } } else if (CsDiff >= 5) { if (Rs < 413) { if (ssDCval < 47) { return 0; } else if (ssDCval >= 47) { return 1; } } else if (Rs >= 413) { return 1; } } } else if (refDCval >= 49) { if (diffAFD < 15) { if (Rs < 29) { return 1; } else if (Rs >= 29) { if (Rs < 347) { if (RsCsDiff < 9) { if (RsDiff < 1) { return 0; } else if (RsDiff >= 1) { if (Cs < 46) { return 1; } else if (Cs >= 46) { if (Rs < 113) { return 0; } else if (Rs >= 113) { return 1; } } } } else if (RsCsDiff >= 9) { return 0; } } else if (Rs >= 347) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (refDCval < 60) { return 0; } else if (refDCval >= 60) { if (Rs < 1363) { if (diffTSC < 7) { if (RsCsDiff < 17) { return 0; } else if (RsCsDiff >= 17) { if (TSC < 14) { return 1; } else if (TSC >= 14) { return 0; } } } else if (diffTSC >= 7) { return 1; } } else if (Rs >= 1363) { return 0; } } } } } } else if (diffAFD >= 15) { if (diffRsCsdiff < 3) { if (diffMVdiffVal < 433) { if (RsCsDiff < 15) { return 0; } else if (RsCsDiff >= 15) { return 1; } } else if (diffMVdiffVal >= 433) { return 0; } } else if (diffRsCsdiff >= 3) { if (refDCval < 66) { return 1; } else if (refDCval >= 66) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (Cs < 26) { return 0; } else if (Cs >= 26) { if (MVDiff < 592) { return 1; } else if (MVDiff >= 592) { return 0; } } } } } } } } else if (ssDCval >= 84) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (TSC < 19) { if (diffAFD < 12) { return 0; } else if (diffAFD >= 12) { return 1; } } else if (TSC >= 19) { return 0; } } } } else if (diffAFD >= 24) { if (negBalance < 49) { if (diffMVdiffVal < 90) { if (Cs < 328) { return 0; } else if (Cs >= 328) { return 1; } } else if (diffMVdiffVal >= 90) { if (negBalance < 45) { return 1; } else if (negBalance >= 45) { if (diffRsCsdiff < -10) { return 0; } else if (diffRsCsdiff >= -10) { if (SC < 2436) { return 1; } else if (SC >= 2436) { return 0; } } } } } else if (negBalance >= 49) { if (TSC < 21) { return 1; } else if (TSC >= 21) { if (RsCsDiff < 22) { if (ssDCval < 87) { if (ssDCval < 44) { return 0; } else if (ssDCval >= 44) { return 1; } } else if (ssDCval >= 87) { return 0; } } else if (RsCsDiff >= 22) { if (ssDCval < 62) { if (Rs < 1147) { return 1; } else if (Rs >= 1147) { return 0; } } else if (ssDCval >= 62) { return 1; } } } } } } } } } else if (CsDiff >= 8) { if (diffRsCsdiff < 74) { if (diffMVdiffVal < 100) { return 0; } else if (diffMVdiffVal >= 100) { if (SC < 1080) { if (negBalance < 117) { if (Cs < 723) { if (MVDiff < 300) { if (Rs < 409) { if (CsDiff < 15) { return 0; } else if (CsDiff >= 15) { return 1; } } else if (Rs >= 409) { return 1; } } else if (MVDiff >= 300) { return 0; } } else if (Cs >= 723) { return 1; } } else if (negBalance >= 117) { return 1; } } else if (SC >= 1080) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { if (CsDiff < 19) { return 0; } else if (CsDiff >= 19) { if (ssDCval < 116) { return 1; } else if (ssDCval >= 116) { return 0; } } } } } } else if (diffRsCsdiff >= 74) { if (diffAFD < 22) { if (SC < 1997) { if (posBalance < 89) { if (ssDCval < 72) { if (CsDiff < 10) { if (refDCval < 41) { if (SC < 1644) { return 0; } else if (SC >= 1644) { return 1; } } else if (refDCval >= 41) { return 1; } } else if (CsDiff >= 10) { return 1; } } else if (ssDCval >= 72) { if (RsDiff < 19) { return 0; } else if (RsDiff >= 19) { if (Cs < 273) { return 0; } else if (Cs >= 273) { return 1; } } } } else if (posBalance >= 89) { if (TSC < 18) { if (SC < 771) { return 1; } else if (SC >= 771) { return 0; } } else if (TSC >= 18) { return 0; } } } else if (SC >= 1997) { if (ssDCval < 36) { return 1; } else if (ssDCval >= 36) { if (diffAFD < 13) { if (gchDC < 27) { return 0; } else if (gchDC >= 27) { if (RsCsDiff < 817) { return 0; } else if (RsCsDiff >= 817) { return 1; } } } else if (diffAFD >= 13) { if (gchDC < 36) { if (ssDCval < 107) { if (diffTSC < 7) { return 0; } else if (diffTSC >= 7) { if (gchDC < 11) { return 1; } else if (gchDC >= 11) { if (RsDiff < 30) { if (Rs < 1053) { return 1; } else if (Rs >= 1053) { if (ssDCval < 46) { return 1; } else if (ssDCval >= 46) { return 0; } } } else if (RsDiff >= 30) { return 1; } } } } else if (ssDCval >= 107) { return 0; } } else if (gchDC >= 36) { if (Rs < 2215) { return 1; } else if (Rs >= 2215) { return 0; } } } } } } else if (diffAFD >= 22) { if (negBalance < 27) { if (Cs < 1211) { if (TSC < 12) { return 0; } else if (TSC >= 12) { if (negBalance < 5) { if (CsDiff < 9) { return 0; } else if (CsDiff >= 9) { return 1; } } else if (negBalance >= 5) { return 1; } } } else if (Cs >= 1211) { if (CsDiff < 19) { if (posBalance < 105) { return 0; } else if (posBalance >= 105) { if (RsDiff < 9) { return 0; } else if (RsDiff >= 9) { if (negBalance < 5) { if (gchDC < 52) { return 1; } else if (gchDC >= 52) { return 0; } } else if (negBalance >= 5) { return 1; } } } } else if (CsDiff >= 19) { if (negBalance < 26) { return 1; } else if (negBalance >= 26) { return 0; } } } } else if (negBalance >= 27) { if (Cs < 790) { return 1; } else if (Cs >= 790) { if (diffTSC < 16) { if (gchDC < 13) { if (diffMVdiffVal < 66) { if (Rs < 1116) { return 0; } else if (Rs >= 1116) { return 1; } } else if (diffMVdiffVal >= 66) { return 1; } } else if (gchDC >= 13) { if (Rs < 775) { if (RsDiff < 4) { return 1; } else if (RsDiff >= 4) { return 0; } } else if (Rs >= 775) { if (SC < 3280) { return 1; } else if (SC >= 3280) { if (CsDiff < 17) { return 0; } else if (CsDiff >= 17) { return 1; } } } } } else if (diffTSC >= 16) { if (TSC < 40) { if (ssDCval < 46) { if (refDCval < 127) { return 1; } else if (refDCval >= 127) { return 0; } } else if (ssDCval >= 46) { return 1; } } else if (TSC >= 40) { if (diffAFD < 39) { if (Cs < 5764) { return 0; } else if (Cs >= 5764) { return 1; } } else if (diffAFD >= 39) { return 1; } } } } } } } } } return 0; } bool SCDetectD(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffMVdiffVal < 60) { if (gchDC < 6) { if (diffRsCsdiff < 314) { if (MVDiff < 120) { if (negBalance < 2) { if (refDCval < 18) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (CsDiff < 4) { if (Rs < 653) { return 1; } else if (Rs >= 653) { return 0; } } else if (CsDiff >= 4) { return 1; } } } else if (refDCval >= 18) { return 0; } } else if (negBalance >= 2) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { if (AFD < 19) { if (TSC < 13) { return 0; } else if (TSC >= 13) { return 1; } } else if (AFD >= 19) { return 0; } } } } else if (MVDiff >= 120) { if (diffTSC < 6) { if (gchDC < 4) { if (diffRsCsdiff < 17) { return 0; } else if (diffRsCsdiff >= 17) { if (RsCsDiff < 25) { return 1; } else if (RsCsDiff >= 25) { return 0; } } } else if (gchDC >= 4) { if (Rs < 61) { if (diffRsCsdiff < 2) { return 0; } else if (diffRsCsdiff >= 2) { return 1; } } else if (Rs >= 61) { if (diffMVdiffVal < 54) { return 0; } else if (diffMVdiffVal >= 54) { if (AFD < 27) { return 0; } else if (AFD >= 27) { if (RsCsDiff < 123) { return 1; } else if (RsCsDiff >= 123) { return 0; } } } } } } else if (diffTSC >= 6) { if (diffAFD < 13) { if (diffAFD < 2) { if (RsDiff < 6) { return 1; } else if (RsDiff >= 6) { return 0; } } else if (diffAFD >= 2) { return 0; } } else if (diffAFD >= 13) { if (MVDiff < 186) { return 1; } else if (MVDiff >= 186) { if (TSC < 13) { return 1; } else if (TSC >= 13) { return 0; } } } } } } else if (diffRsCsdiff >= 314) { if (ssDCval < 37) { return 1; } else if (ssDCval >= 37) { if (CsDiff < 41) { if (diffTSC < 14) { if (SC < 3349) { if (RsDiff < 20) { return 0; } else if (RsDiff >= 20) { return 1; } } else if (SC >= 3349) { return 0; } } else if (diffTSC >= 14) { if (Cs < 2020) { return 1; } else if (Cs >= 2020) { return 0; } } } else if (CsDiff >= 41) { if (TSC < 6) { return 1; } else if (TSC >= 6) { if (SC < 24936) { return 0; } else if (SC >= 24936) { return 1; } } } } } } else if (gchDC >= 6) { if (diffRsCsdiff < 199) { if (diffAFD < 14) { if (MVDiff < 231) { if (posBalance < 1) { if (ssDCval < 217) { return 0; } else if (ssDCval >= 217) { return 1; } } else if (posBalance >= 1) { if (RsCsDiff < 15690) { return 0; } else if (RsCsDiff >= 15690) { if (Rs < 1541) { return 0; } else if (Rs >= 1541) { return 1; } } } } else if (MVDiff >= 231) { if (TSC < 27) { if (AFD < 6) { if (AFD < 2) { return 0; } else if (AFD >= 2) { return 1; } } else if (AFD >= 6) { if (diffRsCsdiff < 12) { if (Cs < 56) { if (AFD < 32) { return 0; } else if (AFD >= 32) { if (Cs < 18) { return 0; } else if (Cs >= 18) { if (ssDCval < 104) { return 1; } else if (ssDCval >= 104) { return 0; } } } } else if (Cs >= 56) { return 0; } } else if (diffRsCsdiff >= 12) { if (posBalance < 21) { if (Scindex < 4) { return 0; } else if (Scindex >= 4) { return 1; } } else if (posBalance >= 21) { if (ssDCval < 40) { return 1; } else if (ssDCval >= 40) { if (TSC < 13) { if (diffRsCsdiff < 26) { if (Rs < 413) { return 0; } else if (Rs >= 413) { return 1; } } else if (diffRsCsdiff >= 26) { return 0; } } else if (TSC >= 13) { return 0; } } } } } } else if (TSC >= 27) { if (MVDiff < 232) { return 1; } else if (MVDiff >= 232) { if (diffMVdiffVal < -215) { return 1; } else if (diffMVdiffVal >= -215) { if (AFD < 62) { if (RsCsDiff < 12) { if (gchDC < 51) { return 0; } else if (gchDC >= 51) { return 1; } } else if (RsCsDiff >= 12) { return 0; } } else if (AFD >= 62) { if (posBalance < 63) { return 1; } else if (posBalance >= 63) { if (Rs < 1778) { return 1; } else if (Rs >= 1778) { return 0; } } } } } } } } else if (diffAFD >= 14) { if (posBalance < 95) { if (Rs < 1526) { if (SC < 133) { return 1; } else if (SC >= 133) { if (RsDiff < 12) { if (refDCval < 228) { if (diffMVdiffVal < 56) { if (refDCval < 73) { if (RsCsDiff < 16) { return 0; } else if (RsCsDiff >= 16) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (diffTSC < 16) { return 0; } else if (diffTSC >= 16) { if (SC < 918) { return 1; } else if (SC >= 918) { if (AFD < 56) { return 0; } else if (AFD >= 56) { return 1; } } } } } } else if (refDCval >= 73) { if (CsDiff < 2) { if (ssDCval < 100) { return 1; } else if (ssDCval >= 100) { return 0; } } else if (CsDiff >= 2) { return 0; } } } else if (diffMVdiffVal >= 56) { if (Cs < 179) { return 0; } else if (Cs >= 179) { return 1; } } } else if (refDCval >= 228) { return 1; } } else if (RsDiff >= 12) { if (diffAFD < 22) { return 1; } else if (diffAFD >= 22) { if (ssDCval < 99) { return 0; } else if (ssDCval >= 99) { return 1; } } } } } else if (Rs >= 1526) { return 0; } } else if (posBalance >= 95) { if (MVDiff < 1179) { return 0; } else if (MVDiff >= 1179) { return 1; } } } } else if (diffRsCsdiff >= 199) { if (diffTSC < 12) { if (TSC < 25) { if (Cs < 77) { return 1; } else if (Cs >= 77) { if (ssDCval < 44) { if (TSC < 10) { return 1; } else if (TSC >= 10) { return 0; } } else if (ssDCval >= 44) { if (SC < 2258) { if (MVDiff < 207) { return 0; } else if (MVDiff >= 207) { return 1; } } else if (SC >= 2258) { return 0; } } } } else if (TSC >= 25) { if (diffTSC < -2) { return 1; } else if (diffTSC >= -2) { if (AFD < 36) { return 1; } else if (AFD >= 36) { if (RsCsDiff < 443) { if (AFD < 48) { return 0; } else if (AFD >= 48) { return 1; } } else if (RsCsDiff >= 443) { return 0; } } } } } else if (diffTSC >= 12) { if (diffTSC < 43) { if (Cs < 576) { if (ssDCval < 61) { if (AFD < 13) { return 0; } else if (AFD >= 13) { return 1; } } else if (ssDCval >= 61) { return 1; } } else if (Cs >= 576) { if (RsCsDiff < 5301) { if (MVDiff < 262) { if (ssDCval < 104) { if (MVDiff < 120) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { return 1; } } else if (MVDiff >= 120) { return 0; } } else if (ssDCval >= 104) { if (refDCval < 185) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { return 0; } } else if (refDCval >= 185) { return 1; } } } else if (MVDiff >= 262) { if (diffMVdiffVal < 35) { return 1; } else if (diffMVdiffVal >= 35) { return 0; } } } else if (RsCsDiff >= 5301) { return 1; } } } else if (diffTSC >= 43) { return 1; } } } } } else if (diffMVdiffVal >= 60) { if (TSC < 16) { if (ssDCval < 87) { if (TSCindex < 6) { if (diffMVdiffVal < 126) { if (negBalance < 60) { return 0; } else if (negBalance >= 60) { if (diffMVdiffVal < 99) { return 0; } else if (diffMVdiffVal >= 99) { if (refDCval < 29) { return 1; } else if (refDCval >= 29) { return 0; } } } } else if (diffMVdiffVal >= 126) { if (diffTSC < 1) { if (RsDiff < 9) { if (MVDiff < 1621) { return 0; } else if (MVDiff >= 1621) { return 1; } } else if (RsDiff >= 9) { return 1; } } else if (diffTSC >= 1) { if (Cs < 131) { if (RsDiff < 1) { if (gchDC < 1) { return 0; } else if (gchDC >= 1) { return 1; } } else if (RsDiff >= 1) { return 0; } } else if (Cs >= 131) { return 0; } } } } else if (TSCindex >= 6) { if (diffRsCsdiff < 1) { if (ssDCval < 40) { if (diffAFD < 6) { if (diffTSC < -32) { return 1; } else if (diffTSC >= -32) { if (Rs < 379) { return 0; } else if (Rs >= 379) { if (negBalance < 80) { return 1; } else if (negBalance >= 80) { return 0; } } } } else if (diffAFD >= 6) { if (RsCsDiff < 1) { return 1; } else if (RsCsDiff >= 1) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (MVDiff < 241) { return 0; } else if (MVDiff >= 241) { return 1; } } } } } else if (ssDCval >= 40) { if (diffTSC < 5) { if (Rs < 85) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (gchDC < 14) { return 1; } else if (gchDC >= 14) { return 0; } } } else if (Rs >= 85) { return 0; } } else if (diffTSC >= 5) { if (Cs < 172) { if (diffMVdiffVal < 128) { return 0; } else if (diffMVdiffVal >= 128) { if (AFD < 25) { if (RsDiff < 1) { if (SC < 154) { return 1; } else if (SC >= 154) { return 0; } } else if (RsDiff >= 1) { return 0; } } else if (AFD >= 25) { return 1; } } } else if (Cs >= 172) { return 0; } } } } else if (diffRsCsdiff >= 1) { if (diffTSC < 4) { if (Cs < 128) { if (ssDCval < 37) { return 1; } else if (ssDCval >= 37) { if (Rs < 135) { if (diffMVdiffVal < 209) { return 0; } else if (diffMVdiffVal >= 209) { if (Cs < 118) { return 1; } else if (Cs >= 118) { return 0; } } } else if (Rs >= 135) { if (TSC < 7) { if (SC < 440) { return 0; } else if (SC >= 440) { return 1; } } else if (TSC >= 7) { return 0; } } } } else if (Cs >= 128) { if (refDCval < 39) { if (Rs < 1160) { if (ssDCval < 29) { return 1; } else if (ssDCval >= 29) { return 0; } } else if (Rs >= 1160) { return 1; } } else if (refDCval >= 39) { if (diffAFD < 11) { if (refDCval < 69) { return 0; } else if (refDCval >= 69) { if (AFD < 21) { if (Rs < 262) { if (Cs < 191) { return 1; } else if (Cs >= 191) { if (ssDCval < 72) { return 0; } else if (ssDCval >= 72) { return 1; } } } else if (Rs >= 262) { return 0; } } else if (AFD >= 21) { return 0; } } } else if (diffAFD >= 11) { if (Cs < 245) { return 1; } else if (Cs >= 245) { if (diffRsCsdiff < 269) { if (ssDCval < 40) { if (TSC < 10) { return 0; } else if (TSC >= 10) { return 1; } } else if (ssDCval >= 40) { return 0; } } else if (diffRsCsdiff >= 269) { return 1; } } } } } } else if (diffTSC >= 4) { if (negBalance < 25) { if (refDCval < 28) { return 1; } else if (refDCval >= 28) { if (Rs < 128) { if (diffRsCsdiff < 4) { return 0; } else if (diffRsCsdiff >= 4) { return 1; } } else if (Rs >= 128) { if (CsDiff < 13) { return 0; } else if (CsDiff >= 13) { return 1; } } } } else if (negBalance >= 25) { if (SC < 354) { if (posBalance < 11) { if (gchDC < 22) { return 0; } else if (gchDC >= 22) { if (AFD < 28) { return 1; } else if (AFD >= 28) { if (CsDiff < 6) { return 0; } else if (CsDiff >= 6) { return 1; } } } } else if (posBalance >= 11) { return 1; } } else if (SC >= 354) { if (diffRsCsdiff < 97) { if (RsCsDiff < 103) { if (gchDC < 11) { if (diffTSC < 8) { if (MVDiff < 95) { return 0; } else if (MVDiff >= 95) { if (refDCval < 57) { if (TSC < 8) { if (negBalance < 55) { return 1; } else if (negBalance >= 55) { if (RsDiff < 2) { return 1; } else if (RsDiff >= 2) { return 0; } } } else if (TSC >= 8) { return 1; } } else if (refDCval >= 57) { if (SC < 1058) { return 0; } else if (SC >= 1058) { return 1; } } } } else if (diffTSC >= 8) { if (diffMVdiffVal < 64) { return 0; } else if (diffMVdiffVal >= 64) { return 1; } } } else if (gchDC >= 11) { if (diffAFD < 14) { if (diffRsCsdiff < 24) { return 0; } else if (diffRsCsdiff >= 24) { return 1; } } else if (diffAFD >= 14) { if (negBalance < 28) { return 0; } else if (negBalance >= 28) { return 1; } } } } else if (RsCsDiff >= 103) { return 0; } } else if (diffRsCsdiff >= 97) { if (negBalance < 74) { return 1; } else if (negBalance >= 74) { if (diffAFD < 12) { return 0; } else if (diffAFD >= 12) { if (SC < 1789) { return 1; } else if (SC >= 1789) { if (CsDiff < 13) { if (Cs < 1056) { return 1; } else if (Cs >= 1056) { return 0; } } else if (CsDiff >= 13) { return 1; } } } } } } } } } } } else if (ssDCval >= 87) { if (refDCval < 81) { if (Cs < 390) { if (RsDiff < 3) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (refDCval < 45) { return 0; } else if (refDCval >= 45) { return 1; } } } else if (RsDiff >= 3) { return 1; } } else if (Cs >= 390) { return 0; } } else if (refDCval >= 81) { if (diffAFD < 21) { return 0; } else if (diffAFD >= 21) { if (diffTSC < 12) { if (AFD < 36) { if (gchDC < 6) { return 0; } else if (gchDC >= 6) { if (RsDiff < 12) { if (Cs < 138) { return 0; } else if (Cs >= 138) { return 1; } } else if (RsDiff >= 12) { return 1; } } } else if (AFD >= 36) { return 0; } } else if (diffTSC >= 12) { return 1; } } } } } else if (TSC >= 16) { if (diffAFD < 25) { if (negBalance < 41) { if (diffAFD < 19) { if (diffTSC < 13) { if (Cs < 6) { return 1; } else if (Cs >= 6) { return 0; } } else if (diffTSC >= 13) { if (negBalance < 17) { if (ssDCval < 50) { return 1; } else if (ssDCval >= 50) { return 0; } } else if (negBalance >= 17) { return 1; } } } else if (diffAFD >= 19) { if (ssDCval < 65) { if (refDCval < 38) { if (ssDCval < 56) { return 1; } else if (ssDCval >= 56) { return 0; } } else if (refDCval >= 38) { return 1; } } else if (ssDCval >= 65) { if (SC < 1962) { return 0; } else if (SC >= 1962) { if (Cs < 1223) { if (diffTSC < 13) { if (Cs < 541) { return 0; } else if (Cs >= 541) { return 1; } } else if (diffTSC >= 13) { return 1; } } else if (Cs >= 1223) { if (ssDCval < 127) { return 0; } else if (ssDCval >= 127) { if (ssDCval < 173) { if (diffAFD < 23) { return 1; } else if (diffAFD >= 23) { return 0; } } else if (ssDCval >= 173) { return 1; } } } } } } } else if (negBalance >= 41) { if (refDCval < 81) { if (RsCsDiff < 107) { if (posBalance < 65) { if (TSC < 17) { return 1; } else if (TSC >= 17) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (Cs < 712) { return 0; } else if (Cs >= 712) { return 1; } } } } else if (posBalance >= 65) { if (Rs < 385) { if (AFD < 39) { return 1; } else if (AFD >= 39) { return 0; } } else if (Rs >= 385) { return 0; } } } else if (RsCsDiff >= 107) { if (posBalance < 8) { return 0; } else if (posBalance >= 8) { if (Cs < 120) { if (SC < 656) { return 1; } else if (SC >= 656) { return 0; } } else if (Cs >= 120) { if (CsDiff < 7) { if (Cs < 330) { return 1; } else if (Cs >= 330) { return 0; } } else if (CsDiff >= 7) { if (Cs < 1345) { return 1; } else if (Cs >= 1345) { if (TSC < 17) { return 0; } else if (TSC >= 17) { return 1; } } } } } } } else if (refDCval >= 81) { if (gchDC < 86) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (diffRsCsdiff < 206) { if (ssDCval < 97) { if (diffAFD < 18) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { if (TSC < 34) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (Cs < 429) { if (Rs < 48) { return 0; } else if (Rs >= 48) { return 1; } } else if (Cs >= 429) { return 0; } } } else if (TSC >= 34) { return 1; } } } else if (diffAFD >= 18) { if (refDCval < 151) { return 1; } else if (refDCval >= 151) { return 0; } } } else if (ssDCval >= 97) { if (diffAFD < -4) { if (ssDCval < 119) { return 0; } else if (ssDCval >= 119) { return 1; } } else if (diffAFD >= -4) { return 0; } } } else if (diffRsCsdiff >= 206) { if (diffAFD < 17) { if (TSC < 21) { return 0; } else if (TSC >= 21) { if (Rs < 2277) { return 1; } else if (Rs >= 2277) { if (RsCsDiff < 7652) { return 0; } else if (RsCsDiff >= 7652) { return 1; } } } } else if (diffAFD >= 17) { if (RsCsDiff < 2212) { if (ssDCval < 88) { if (ssDCval < 59) { return 1; } else if (ssDCval >= 59) { if (gchDC < 24) { return 1; } else if (gchDC >= 24) { return 0; } } } else if (ssDCval >= 88) { return 1; } } else if (RsCsDiff >= 2212) { if (RsCsDiff < 3961) { return 0; } else if (RsCsDiff >= 3961) { return 1; } } } } } } else if (gchDC >= 86) { if (diffMVdiffVal < 129) { return 0; } else if (diffMVdiffVal >= 129) { if (diffRsCsdiff < 2) { if (SC < 454) { return 1; } else if (SC >= 454) { return 0; } } else if (diffRsCsdiff >= 2) { return 1; } } } } } } else if (diffAFD >= 25) { if (diffRsCsdiff < 243) { if (CsDiff < 3) { if (negBalance < 28) { if (TSC < 22) { if (diffAFD < 31) { return 0; } else if (diffAFD >= 31) { return 1; } } else if (TSC >= 22) { return 0; } } else if (negBalance >= 28) { if (diffAFD < 39) { return 1; } else if (diffAFD >= 39) { if (Cs < 91) { return 0; } else if (Cs >= 91) { return 1; } } } } else if (CsDiff >= 3) { if (Cs < 778) { if (diffMVdiffVal < 101) { if (refDCval < 87) { if (diffRsCsdiff < 75) { if (AFD < 41) { return 1; } else if (AFD >= 41) { return 0; } } else if (diffRsCsdiff >= 75) { return 1; } } else if (refDCval >= 87) { return 0; } } else if (diffMVdiffVal >= 101) { if (posBalance < 69) { if (TSC < 42) { return 1; } else if (TSC >= 42) { if (AFD < 61) { return 0; } else if (AFD >= 61) { return 1; } } } else if (posBalance >= 69) { if (TSC < 32) { if (refDCval < 152) { return 1; } else if (refDCval >= 152) { if (SC < 664) { return 1; } else if (SC >= 664) { return 0; } } } else if (TSC >= 32) { if (RsDiff < 6) { if (ssDCval < 108) { return 0; } else if (ssDCval >= 108) { return 1; } } else if (RsDiff >= 6) { if (TSC < 37) { return 0; } else if (TSC >= 37) { return 1; } } } } } } else if (Cs >= 778) { if (SC < 2617) { if (Cs < 793) { if (refDCval < 79) { return 0; } else if (refDCval >= 79) { return 1; } } else if (Cs >= 793) { if (CsDiff < 7) { if (diffRsCsdiff < 62) { if (AFD < 47) { return 0; } else if (AFD >= 47) { return 1; } } else if (diffRsCsdiff >= 62) { return 0; } } else if (CsDiff >= 7) { if (CsDiff < 8) { if (diffMVdiffVal < 171) { if (Cs < 808) { return 1; } else if (Cs >= 808) { return 0; } } else if (diffMVdiffVal >= 171) { return 1; } } else if (CsDiff >= 8) { if (negBalance < 25) { if (diffMVdiffVal < 243) { return 0; } else if (diffMVdiffVal >= 243) { return 1; } } else if (negBalance >= 25) { return 1; } } } } } else if (SC >= 2617) { return 0; } } } } else if (diffRsCsdiff >= 243) { if (Rs < 1675) { return 1; } else if (Rs >= 1675) { if (negBalance < 27) { if (Rs < 2872) { if (diffRsCsdiff < 1044) { if (SC < 2992) { return 1; } else if (SC >= 2992) { if (ssDCval < 122) { if (TSC < 26) { return 0; } else if (TSC >= 26) { return 1; } } else if (ssDCval >= 122) { return 0; } } } else if (diffRsCsdiff >= 1044) { return 1; } } else if (Rs >= 2872) { return 1; } } else if (negBalance >= 27) { if (Cs < 6847) { if (diffRsCsdiff < 441) { if (RsDiff < 22) { return 1; } else if (RsDiff >= 22) { return 0; } } else if (diffRsCsdiff >= 441) { if (TSC < 18) { if (negBalance < 57) { return 1; } else if (negBalance >= 57) { if (ssDCval < 70) { return 1; } else if (ssDCval >= 70) { return 0; } } } else if (TSC >= 18) { return 1; } } } else if (Cs >= 6847) { if (MVDiff < 75) { if (CsDiff < 57) { return 1; } else if (CsDiff >= 57) { return 0; } } else if (MVDiff >= 75) { return 1; } } } } } } } } return 0; } bool SCDetectE(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffRsCsdiff < 72) { if (MVDiff < 98) { if (diffAFD < 9) { if (gchDC < 31) { if (posBalance < 2) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (negBalance < 2) { if (Rs < 1030) { if (SC < 1435) { return 1; } else if (SC >= 1435) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { return 1; } } } else if (Rs >= 1030) { return 0; } } else if (negBalance >= 2) { return 0; } } } else if (posBalance >= 2) { return 0; } } else if (gchDC >= 31) { if (AFD < 3) { if (ssDCval < 122) { return 0; } else if (ssDCval >= 122) { return 1; } } else if (AFD >= 3) { return 0; } } } else if (diffAFD >= 9) { if (Cs < 311) { if (diffMVdiffVal < 64) { if (refDCval < 24) { return 1; } else if (refDCval >= 24) { return 0; } } else if (diffMVdiffVal >= 64) { if (MVDiff < 90) { if (gchDC < 7) { return 1; } else if (gchDC >= 7) { if (AFD < 33) { return 0; } else if (AFD >= 33) { return 1; } } } else if (MVDiff >= 90) { return 0; } } } else if (Cs >= 311) { if (MVDiff < 91) { return 0; } else if (MVDiff >= 91) { if (diffRsCsdiff < 47) { return 0; } else if (diffRsCsdiff >= 47) { return 1; } } } } } else if (MVDiff >= 98) { if (gchDC < 3) { if (diffTSC < 5) { if (diffAFD < 7) { if (TSCindex < 3) { if (refDCval < 24) { if (Rs < 3) { return 0; } else if (Rs >= 3) { if (CsDiff < 3) { if (posBalance < 45) { return 0; } else if (posBalance >= 45) { if (Rs < 79) { return 1; } else if (Rs >= 79) { return 0; } } } else if (CsDiff >= 3) { return 1; } } } else if (refDCval >= 24) { return 0; } } else if (TSCindex >= 3) { return 0; } } else if (diffAFD >= 7) { if (AFD < 20) { if (refDCval < 45) { if (negBalance < 48) { if (diffMVdiffVal < 197) { return 0; } else if (diffMVdiffVal >= 197) { return 1; } } else if (negBalance >= 48) { if (posBalance < 49) { return 0; } else if (posBalance >= 49) { return 1; } } } else if (refDCval >= 45) { return 0; } } else if (AFD >= 20) { return 0; } } } else if (diffTSC >= 5) { if (Cs < 793) { if (RsDiff < 9) { if (diffAFD < 8) { return 0; } else if (diffAFD >= 8) { return 1; } } else if (RsDiff >= 9) { return 0; } } else if (Cs >= 793) { return 0; } } } else if (gchDC >= 3) { if (diffMVdiffVal < 97) { if (gchDC < 57) { if (AFD < 62) { if (Cs < 586) { if (diffTSC < 4) { if (refDCval < 74) { if (MVDiff < 175) { return 0; } else if (MVDiff >= 175) { if (diffAFD < -8) { return 0; } else if (diffAFD >= -8) { if (refDCval < 71) { if (negBalance < 53) { return 0; } else if (negBalance >= 53) { if (ssDCval < 37) { if (diffRsCsdiff < 12) { if (posBalance < 33) { return 0; } else if (posBalance >= 33) { if (RsDiff < 1) { return 0; } else if (RsDiff >= 1) { return 1; } } } else if (diffRsCsdiff >= 12) { return 1; } } else if (ssDCval >= 37) { if (RsCsDiff < 71) { return 0; } else if (RsCsDiff >= 71) { if (posBalance < 60) { return 0; } else if (posBalance >= 60) { return 1; } } } } } else if (refDCval >= 71) { if (TSC < 12) { return 0; } else if (TSC >= 12) { return 1; } } } } } else if (refDCval >= 74) { if (refDCval < 229) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (Cs < 62) { return 1; } else if (Cs >= 62) { return 0; } } } else if (refDCval >= 229) { if (diffTSC < -3) { return 0; } else if (diffTSC >= -3) { return 1; } } } } else if (diffTSC >= 4) { if (AFD < 24) { if (gchDC < 6) { if (diffMVdiffVal < -3) { if (MVDiff < 132) { return 0; } else if (MVDiff >= 132) { return 1; } } else if (diffMVdiffVal >= -3) { if (CsDiff < 5) { if (TSC < 10) { return 0; } else if (TSC >= 10) { if (RsCsDiff < 9) { return 1; } else if (RsCsDiff >= 9) { return 0; } } } else if (CsDiff >= 5) { return 1; } } } else if (gchDC >= 6) { if (diffRsCsdiff < -84) { return 1; } else if (diffRsCsdiff >= -84) { if (ssDCval < 40) { if (TSC < 12) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { return 1; } } else if (TSC >= 12) { return 1; } } else if (ssDCval >= 40) { return 0; } } } } else if (AFD >= 24) { if (AFD < 43) { return 0; } else if (AFD >= 43) { if (AFD < 45) { if (Cs < 260) { return 0; } else if (Cs >= 260) { return 1; } } else if (AFD >= 45) { return 0; } } } } } else if (Cs >= 586) { return 0; } } else if (AFD >= 62) { if (Cs < 1174) { return 0; } else if (Cs >= 1174) { return 1; } } } else if (gchDC >= 57) { if (SC < 3124) { if (MVDiff < 879) { if (refDCval < 118) { if (ssDCval < 90) { if (negBalance < 101) { if (gchDC < 73) { return 1; } else if (gchDC >= 73) { return 0; } } else if (negBalance >= 101) { return 0; } } else if (ssDCval >= 90) { return 0; } } else if (refDCval >= 118) { return 0; } } else if (MVDiff >= 879) { return 1; } } else if (SC >= 3124) { return 1; } } } else if (diffMVdiffVal >= 97) { if (diffRsCsdiff < 1) { if (diffAFD < 7) { if (gchDC < 65) { if (ssDCval < 31) { if (diffAFD < -4) { return 0; } else if (diffAFD >= -4) { if (ssDCval < 24) { return 0; } else if (ssDCval >= 24) { if (Rs < 427) { return 1; } else if (Rs >= 427) { return 0; } } } } else if (ssDCval >= 31) { if (RsCsDiff < 821) { return 0; } else if (RsCsDiff >= 821) { if (TSC < 30) { return 0; } else if (TSC >= 30) { return 1; } } } } else if (gchDC >= 65) { if (TSC < 9) { if (Scindex < 3) { return 1; } else if (Scindex >= 3) { return 0; } } else if (TSC >= 9) { if (ssDCval < 24) { return 1; } else if (ssDCval >= 24) { return 0; } } } } else if (diffAFD >= 7) { if (Cs < 185) { if (ssDCval < 84) { if (SC < 11) { return 0; } else if (SC >= 11) { if (AFD < 19) { return 1; } else if (AFD >= 19) { if (negBalance < 90) { if (negBalance < 12) { return 1; } else if (negBalance >= 12) { return 0; } } else if (negBalance >= 90) { if (CsDiff < 6) { return 1; } else if (CsDiff >= 6) { if (Rs < 72) { return 1; } else if (Rs >= 72) { return 0; } } } } } } else if (ssDCval >= 84) { if (AFD < 14) { return 1; } else if (AFD >= 14) { return 0; } } } else if (Cs >= 185) { if (RsCsDiff < 173) { return 0; } else if (RsCsDiff >= 173) { if (RsCsDiff < 222) { return 1; } else if (RsCsDiff >= 222) { if (CsDiff < 53) { return 0; } else if (CsDiff >= 53) { return 1; } } } } } } else if (diffRsCsdiff >= 1) { if (diffAFD < 13) { if (MVDiff < 175) { if (SC < 881) { if (Rs < 83) { if (posBalance < 65) { return 0; } else if (posBalance >= 65) { return 1; } } else if (Rs >= 83) { if (CsDiff < 2) { if (gchDC < 8) { return 1; } else if (gchDC >= 8) { return 0; } } else if (CsDiff >= 2) { return 1; } } } else if (SC >= 881) { if (MVDiff < 163) { return 0; } else if (MVDiff >= 163) { return 1; } } } else if (MVDiff >= 175) { if (ssDCval < 50) { if (refDCval < 31) { return 1; } else if (refDCval >= 31) { if (diffAFD < 7) { if (Cs < 334) { return 0; } else if (Cs >= 334) { if (gchDC < 10) { return 0; } else if (gchDC >= 10) { if (RsDiff < 5) { return 0; } else if (RsDiff >= 5) { return 1; } } } } else if (diffAFD >= 7) { if (MVDiff < 221) { return 0; } else if (MVDiff >= 221) { if (Rs < 18) { return 0; } else if (Rs >= 18) { if (MVDiff < 504) { if (negBalance < 35) { if (Rs < 52) { return 1; } else if (Rs >= 52) { return 0; } } else if (negBalance >= 35) { return 1; } } else if (MVDiff >= 504) { return 0; } } } } } } else if (ssDCval >= 50) { if (Rs < 5) { return 1; } else if (Rs >= 5) { if (diffTSC < 5) { return 0; } else if (diffTSC >= 5) { if (diffAFD < 6) { if (RsCsDiff < 37) { return 0; } else if (RsCsDiff >= 37) { return 1; } } else if (diffAFD >= 6) { if (Cs < 216) { if (MVDiff < 213) { return 1; } else if (MVDiff >= 213) { return 0; } } else if (Cs >= 216) { return 0; } } } } } } } else if (diffAFD >= 13) { if (gchDC < 22) { if (SC < 593) { if (refDCval < 54) { return 1; } else if (refDCval >= 54) { if (refDCval < 55) { return 0; } else if (refDCval >= 55) { if (diffAFD < 18) { if (Rs < 75) { return 0; } else if (Rs >= 75) { if (Rs < 197) { return 1; } else if (Rs >= 197) { return 0; } } } else if (diffAFD >= 18) { return 1; } } } } else if (SC >= 593) { if (gchDC < 9) { return 1; } else if (gchDC >= 9) { if (diffTSC < 7) { return 0; } else if (diffTSC >= 7) { if (negBalance < 41) { if (RsDiff < 7) { if (Cs < 352) { return 0; } else if (Cs >= 352) { return 1; } } else if (RsDiff >= 7) { return 0; } } else if (negBalance >= 41) { return 1; } } } } } else if (gchDC >= 22) { if (Cs < 621) { if (refDCval < 47) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (Rs < 524) { if (CsDiff < 6) { return 1; } else if (CsDiff >= 6) { return 0; } } else if (Rs >= 524) { if (posBalance < 117) { return 0; } else if (posBalance >= 117) { return 1; } } } } else if (refDCval >= 47) { if (posBalance < 116) { if (diffRsCsdiff < 49) { if (SC < 813) { if (MVDiff < 258) { return 1; } else if (MVDiff >= 258) { if (posBalance < 3) { if (diffTSC < 6) { return 1; } else if (diffTSC >= 6) { return 0; } } else if (posBalance >= 3) { if (negBalance < 12) { return 0; } else if (negBalance >= 12) { return 1; } } } } else if (SC >= 813) { if (diffAFD < 28) { if (gchDC < 30) { return 0; } else if (gchDC >= 30) { if (AFD < 56) { if (posBalance < 92) { return 1; } else if (posBalance >= 92) { return 0; } } else if (AFD >= 56) { return 0; } } } else if (diffAFD >= 28) { return 1; } } } else if (diffRsCsdiff >= 49) { return 1; } } else if (posBalance >= 116) { if (Rs < 92) { if (RsCsDiff < 17) { return 0; } else if (RsCsDiff >= 17) { return 1; } } else if (Rs >= 92) { if (ssDCval < 157) { return 1; } else if (ssDCval >= 157) { if (RsCsDiff < 52) { return 1; } else if (RsCsDiff >= 52) { return 0; } } } } } } else if (Cs >= 621) { if (posBalance < 95) { return 0; } else if (posBalance >= 95) { if (posBalance < 114) { if (Cs < 683) { return 1; } else if (Cs >= 683) { if (CsDiff < 5) { return 1; } else if (CsDiff >= 5) { return 0; } } } else if (posBalance >= 114) { return 0; } } } } } } } } } } else if (diffRsCsdiff >= 72) { if (MVDiff < 66) { if (diffTSC < 13) { if (refDCval < 24) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { return 1; } } else if (refDCval >= 24) { if (Cs < 199) { if (RsCsDiff < 511) { return 0; } else if (RsCsDiff >= 511) { return 1; } } else if (Cs >= 199) { if (MVDiff < 55) { return 0; } else if (MVDiff >= 55) { if (diffTSC < 7) { if (TSCindex < 5) { if (Rs < 2121) { return 1; } else if (Rs >= 2121) { return 0; } } else if (TSCindex >= 5) { return 0; } } else if (diffTSC >= 7) { if (AFD < 20) { if (Rs < 2356) { return 1; } else if (Rs >= 2356) { return 0; } } else if (AFD >= 20) { return 0; } } } } } } else if (diffTSC >= 13) { if (Cs < 2361) { if (diffMVdiffVal < 6) { if (posBalance < 50) { return 1; } else if (posBalance >= 50) { if (MVDiff < 14) { return 1; } else if (MVDiff >= 14) { return 0; } } } else if (diffMVdiffVal >= 6) { if (posBalance < 21) { return 0; } else if (posBalance >= 21) { if (diffRsCsdiff < 221) { if (Cs < 975) { return 1; } else if (Cs >= 975) { return 0; } } else if (diffRsCsdiff >= 221) { return 1; } } } } else if (Cs >= 2361) { if (TSC < 23) { if (negBalance < 55) { return 0; } else if (negBalance >= 55) { if (posBalance < 40) { return 1; } else if (posBalance >= 40) { return 0; } } } else if (TSC >= 23) { if (ssDCval < 118) { return 1; } else if (ssDCval >= 118) { return 0; } } } } } else if (MVDiff >= 66) { if (TSC < 17) { if (diffAFD < 18) { if (ssDCval < 43) { if (CsDiff < 12) { if (negBalance < 41) { return 0; } else if (negBalance >= 41) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { if (Cs < 1032) { return 1; } else if (Cs >= 1032) { return 0; } } } } else if (CsDiff >= 12) { return 1; } } else if (ssDCval >= 43) { if (SC < 2026) { if (refDCval < 77) { if (diffMVdiffVal < 61) { return 0; } else if (diffMVdiffVal >= 61) { if (diffRsCsdiff < 103) { if (Rs < 328) { return 1; } else if (Rs >= 328) { return 0; } } else if (diffRsCsdiff >= 103) { if (TSC < 12) { if (SC < 1109) { return 1; } else if (SC >= 1109) { return 0; } } else if (TSC >= 12) { return 1; } } } } else if (refDCval >= 77) { return 0; } } else if (SC >= 2026) { if (RsCsDiff < 3703) { if (Rs < 1271) { if (TSC < 15) { return 0; } else if (TSC >= 15) { if (ssDCval < 80) { return 0; } else if (ssDCval >= 80) { if (Rs < 1135) { return 0; } else if (Rs >= 1135) { return 1; } } } } else if (Rs >= 1271) { return 0; } } else if (RsCsDiff >= 3703) { if (AFD < 12) { return 1; } else if (AFD >= 12) { return 0; } } } } } else if (diffAFD >= 18) { if (Cs < 818) { if (SC < 940) { return 1; } else if (SC >= 940) { if (MVDiff < 110) { if (Cs < 337) { return 0; } else if (Cs >= 337) { if (TSC < 12) { if (ssDCval < 39) { return 1; } else if (ssDCval >= 39) { return 0; } } else if (TSC >= 12) { return 1; } } } else if (MVDiff >= 110) { return 1; } } } else if (Cs >= 818) { if (diffTSC < 13) { if (MVDiff < 399) { if (diffMVdiffVal < 64) { return 0; } else if (diffMVdiffVal >= 64) { if (diffMVdiffVal < 99) { return 1; } else if (diffMVdiffVal >= 99) { if (ssDCval < 53) { if (SC < 4409) { if (TSC < 13) { return 0; } else if (TSC >= 13) { return 1; } } else if (SC >= 4409) { return 1; } } else if (ssDCval >= 53) { return 0; } } } } else if (MVDiff >= 399) { return 1; } } else if (diffTSC >= 13) { if (RsCsDiff < 148) { return 0; } else if (RsCsDiff >= 148) { return 1; } } } } } else if (TSC >= 17) { if (negBalance < 33) { if (SC < 1410) { if (posBalance < 117) { return 1; } else if (posBalance >= 117) { if (negBalance < 6) { return 1; } else if (negBalance >= 6) { return 0; } } } else if (SC >= 1410) { if (CsDiff < 14) { if (SC < 2549) { if (diffAFD < 40) { if (posBalance < 99) { if (RsCsDiff < 175) { if (TSC < 26) { return 0; } else if (TSC >= 26) { return 1; } } else if (RsCsDiff >= 175) { if (Rs < 1361) { if (Rs < 1053) { return 1; } else if (Rs >= 1053) { return 0; } } else if (Rs >= 1361) { return 1; } } } else if (posBalance >= 99) { if (ssDCval < 111) { return 0; } else if (ssDCval >= 111) { if (TSC < 27) { return 0; } else if (TSC >= 27) { if (gchDC < 61) { return 0; } else if (gchDC >= 61) { return 1; } } } } } else if (diffAFD >= 40) { if (MVDiff < 80) { return 0; } else if (MVDiff >= 80) { if (Rs < 1537) { return 1; } else if (Rs >= 1537) { if (Cs < 637) { return 1; } else if (Cs >= 637) { return 0; } } } } } else if (SC >= 2549) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { if (RsCsDiff < 263) { return 0; } else if (RsCsDiff >= 263) { if (diffMVdiffVal < -26) { return 0; } else if (diffMVdiffVal >= -26) { if (TSC < 34) { if (diffAFD < 18) { if (AFD < 30) { return 1; } else if (AFD >= 30) { return 0; } } else if (diffAFD >= 18) { return 1; } } else if (TSC >= 34) { return 0; } } } } } } else if (CsDiff >= 14) { if (Cs < 1854) { return 1; } else if (Cs >= 1854) { if (diffRsCsdiff < 659) { if (diffRsCsdiff < 533) { return 0; } else if (diffRsCsdiff >= 533) { if (TSC < 30) { return 1; } else if (TSC >= 30) { return 0; } } } else if (diffRsCsdiff >= 659) { if (diffAFD < 18) { if (TSC < 24) { return 0; } else if (TSC >= 24) { return 1; } } else if (diffAFD >= 18) { return 1; } } } } } } else if (negBalance >= 33) { if (ssDCval < 78) { if (diffAFD < 23) { if (negBalance < 101) { if (diffAFD < 13) { if (AFD < 46) { if (RsCsDiff < 549) { if (Cs < 2069) { if (RsCsDiff < 299) { if (ssDCval < 63) { return 1; } else if (ssDCval >= 63) { return 0; } } else if (RsCsDiff >= 299) { return 1; } } else if (Cs >= 2069) { return 0; } } else if (RsCsDiff >= 549) { return 0; } } else if (AFD >= 46) { return 1; } } else if (diffAFD >= 13) { if (diffTSC < 14) { return 1; } else if (diffTSC >= 14) { if (Rs < 1318) { return 0; } else if (Rs >= 1318) { return 1; } } } } else if (negBalance >= 101) { if (RsCsDiff < 238) { return 1; } else if (RsCsDiff >= 238) { return 0; } } } else if (diffAFD >= 23) { if (negBalance < 123) { if (Cs < 787) { return 1; } else if (Cs >= 787) { if (diffTSC < 11) { if (RsDiff < 22) { return 1; } else if (RsDiff >= 22) { return 0; } } else if (diffTSC >= 11) { if (SC < 1384) { return 0; } else if (SC >= 1384) { if (Cs < 871) { if (Cs < 853) { return 1; } else if (Cs >= 853) { return 0; } } else if (Cs >= 871) { if (TSC < 40) { return 1; } else if (TSC >= 40) { if (RsCsDiff < 1893) { return 0; } else if (RsCsDiff >= 1893) { return 1; } } } } } } } else if (negBalance >= 123) { if (refDCval < 139) { return 0; } else if (refDCval >= 139) { return 1; } } } } else if (ssDCval >= 78) { if (diffTSC < 9) { if (TSC < 25) { if (diffMVdiffVal < 514) { return 0; } else if (diffMVdiffVal >= 514) { return 1; } } else if (TSC >= 25) { if (TSC < 28) { if (AFD < 54) { if (Rs < 3498) { return 0; } else if (Rs >= 3498) { if (SC < 9206) { return 1; } else if (SC >= 9206) { return 0; } } } else if (AFD >= 54) { return 1; } } else if (TSC >= 28) { if (SC < 3832) { if (AFD < 64) { return 1; } else if (AFD >= 64) { return 0; } } else if (SC >= 3832) { return 0; } } } } else if (diffTSC >= 9) { if (diffAFD < 22) { if (Scindex < 4) { return 1; } else if (Scindex >= 4) { if (negBalance < 42) { return 0; } else if (negBalance >= 42) { if (posBalance < 40) { if (Rs < 1054) { if (MVDiff < 546) { return 1; } else if (MVDiff >= 546) { return 0; } } else if (Rs >= 1054) { return 0; } } else if (posBalance >= 40) { if (ssDCval < 117) { return 1; } else if (ssDCval >= 117) { if (refDCval < 121) { return 1; } else if (refDCval >= 121) { return 0; } } } } } } else if (diffAFD >= 22) { if (ssDCval < 93) { if (diffAFD < 40) { if (MVDiff < 1093) { if (diffRsCsdiff < 198) { if (diffRsCsdiff < 151) { return 1; } else if (diffRsCsdiff >= 151) { if (posBalance < 56) { return 0; } else if (posBalance >= 56) { return 1; } } } else if (diffRsCsdiff >= 198) { return 1; } } else if (MVDiff >= 1093) { return 0; } } else if (diffAFD >= 40) { return 1; } } else if (ssDCval >= 93) { return 1; } } } } } } } } return 0; } bool SCDetectF(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (MVDiff < 69) { if (gchDC < 7) { if (diffMVdiffVal < 50) { if (ssDCval < 20) { if (RsCsDiff < 35) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { if (Cs < 512) { return 0; } else if (Cs >= 512) { if (Rs < 635) { return 1; } else if (Rs >= 635) { return 0; } } } } else if (RsCsDiff >= 35) { return 1; } } else if (ssDCval >= 20) { if (diffTSC < 10) { if (CsDiff < 33) { return 0; } else if (CsDiff >= 33) { if (SC < 4130) { return 1; } else if (SC >= 4130) { return 0; } } } else if (diffTSC >= 10) { if (Cs < 1971) { if (AFD < 19) { return 1; } else if (AFD >= 19) { if (SC < 15001) { return 0; } else if (SC >= 15001) { return 1; } } } else if (Cs >= 1971) { return 0; } } } } else if (diffMVdiffVal >= 50) { if (diffAFD < 13) { return 0; } else if (diffAFD >= 13) { if (diffMVdiffVal < 55) { if (Cs < 1997) { return 1; } else if (Cs >= 1997) { return 0; } } else if (diffMVdiffVal >= 55) { return 1; } } } } else if (gchDC >= 7) { if (TSC < 24) { if (Rs < 7030) { if (diffTSC < 9) { if (Rs < 34) { if (RsCsDiff < 326) { if (ssDCval < 175) { return 0; } else if (ssDCval >= 175) { if (refDCval < 226) { return 0; } else if (refDCval >= 226) { return 1; } } } else if (RsCsDiff >= 326) { return 1; } } else if (Rs >= 34) { return 0; } } else if (diffTSC >= 9) { if (Cs < 469) { if (ssDCval < 75) { if (refDCval < 41) { if (AFD < 20) { return 1; } else if (AFD >= 20) { if (Rs < 173) { return 1; } else if (Rs >= 173) { return 0; } } } else if (refDCval >= 41) { return 1; } } else if (ssDCval >= 75) { if (ssDCval < 204) { return 0; } else if (ssDCval >= 204) { return 1; } } } else if (Cs >= 469) { if (gchDC < 15) { if (diffMVdiffVal < 47) { return 0; } else if (diffMVdiffVal >= 47) { return 1; } } else if (gchDC >= 15) { return 0; } } } } else if (Rs >= 7030) { if (diffAFD < 9) { return 0; } else if (diffAFD >= 9) { return 1; } } } else if (TSC >= 24) { if (diffTSC < 20) { if (MVDiff < 62) { return 0; } else if (MVDiff >= 62) { return 1; } } else if (diffTSC >= 20) { if (Scindex < 6) { return 1; } else if (Scindex >= 6) { if (RsDiff < 20) { return 0; } else if (RsDiff >= 20) { if (posBalance < 119) { return 1; } else if (posBalance >= 119) { if (Cs < 4577) { return 1; } else if (Cs >= 4577) { return 0; } } } } } } } } else if (MVDiff >= 69) { if (AFD < 30) { if (diffAFD < 10) { if (diffRsCsdiff < 5) { if (gchDC < 123) { if (diffTSC < 5) { if (diffMVdiffVal < 283) { if (ssDCval < 25) { if (TSCindex < 2) { return 0; } else if (TSCindex >= 2) { if (refDCval < 23) { return 0; } else if (refDCval >= 23) { if (negBalance < 5) { return 1; } else if (negBalance >= 5) { if (negBalance < 56) { return 0; } else if (negBalance >= 56) { if (Cs < 13) { return 0; } else if (Cs >= 13) { return 1; } } } } } } else if (ssDCval >= 25) { return 0; } } else if (diffMVdiffVal >= 283) { if (diffMVdiffVal < 284) { return 1; } else if (diffMVdiffVal >= 284) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (Rs < 99) { if (ssDCval < 20) { return 0; } else if (ssDCval >= 20) { return 1; } } else if (Rs >= 99) { return 0; } } } } } else if (diffTSC >= 5) { if (gchDC < 59) { if (ssDCval < 53) { if (negBalance < 56) { if (diffAFD < -9) { return 1; } else if (diffAFD >= -9) { if (Cs < 50) { if (AFD < 12) { return 1; } else if (AFD >= 12) { return 0; } } else if (Cs >= 50) { return 0; } } } else if (negBalance >= 56) { if (TSC < 14) { return 1; } else if (TSC >= 14) { return 0; } } } else if (ssDCval >= 53) { return 0; } } else if (gchDC >= 59) { return 1; } } } else if (gchDC >= 123) { if (AFD < 16) { return 1; } else if (AFD >= 16) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } } } else if (diffRsCsdiff >= 5) { if (SC < 367) { if (refDCval < 44) { if (Rs < 174) { return 1; } else if (Rs >= 174) { return 0; } } else if (refDCval >= 44) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { if (ssDCval < 131) { return 1; } else if (ssDCval >= 131) { return 0; } } } } else if (SC >= 367) { if (refDCval < 49) { if (posBalance < 72) { if (diffTSC < 3) { if (AFD < 1) { return 1; } else if (AFD >= 1) { if (CsDiff < 15) { if (diffTSC < -8) { if (SC < 1202) { return 1; } else if (SC >= 1202) { return 0; } } else if (diffTSC >= -8) { return 0; } } else if (CsDiff >= 15) { return 1; } } } else if (diffTSC >= 3) { if (negBalance < 63) { if (TSCindex < 8) { if (SC < 660) { return 0; } else if (SC >= 660) { return 1; } } else if (TSCindex >= 8) { if (TSC < 14) { if (refDCval < 30) { return 1; } else if (refDCval >= 30) { return 0; } } else if (TSC >= 14) { if (Cs < 578) { return 1; } else if (Cs >= 578) { return 0; } } } } else if (negBalance >= 63) { return 1; } } } else if (posBalance >= 72) { return 0; } } else if (refDCval >= 49) { if (diffMVdiffVal < 52) { return 0; } else if (diffMVdiffVal >= 52) { if (gchDC < 85) { if (diffRsCsdiff < 2663) { if (ssDCval < 83) { if (diffTSC < 7) { if (gchDC < 7) { if (Rs < 296) { return 1; } else if (Rs >= 296) { if (negBalance < 73) { return 0; } else if (negBalance >= 73) { return 1; } } } else if (gchDC >= 7) { return 0; } } else if (diffTSC >= 7) { return 1; } } else if (ssDCval >= 83) { return 0; } } else if (diffRsCsdiff >= 2663) { return 1; } } else if (gchDC >= 85) { return 1; } } } } } } else if (diffAFD >= 10) { if (diffMVdiffVal < 65) { if (diffAFD < 22) { if (refDCval < 55) { if (diffTSC < 10) { if (negBalance < 48) { if (Rs < 3082) { if (posBalance < 76) { if (diffTSC < 7) { return 0; } else if (diffTSC >= 7) { if (Rs < 470) { return 0; } else if (Rs >= 470) { return 1; } } } else if (posBalance >= 76) { return 0; } } else if (Rs >= 3082) { return 1; } } else if (negBalance >= 48) { if (Rs < 558) { if (negBalance < 56) { if (RsDiff < 2) { return 1; } else if (RsDiff >= 2) { return 0; } } else if (negBalance >= 56) { if (diffAFD < 13) { if (Cs < 216) { return 1; } else if (Cs >= 216) { return 0; } } else if (diffAFD >= 13) { return 1; } } } else if (Rs >= 558) { return 1; } } } else if (diffTSC >= 10) { return 0; } } else if (refDCval >= 55) { if (negBalance < 105) { return 0; } else if (negBalance >= 105) { if (posBalance < 16) { return 0; } else if (posBalance >= 16) { return 1; } } } } else if (diffAFD >= 22) { if (Rs < 524) { return 0; } else if (Rs >= 524) { if (MVDiff < 182) { return 1; } else if (MVDiff >= 182) { if (Cs < 758) { return 0; } else if (Cs >= 758) { return 1; } } } } } else if (diffMVdiffVal >= 65) { if (ssDCval < 48) { if (diffMVdiffVal < 123) { if (diffRsCsdiff < 131) { if (gchDC < 15) { if (RsDiff < 4) { if (TSCindex < 7) { return 0; } else if (TSCindex >= 7) { if (Cs < 16) { return 0; } else if (Cs >= 16) { return 1; } } } else if (RsDiff >= 4) { if (gchDC < 4) { return 0; } else if (gchDC >= 4) { if (AFD < 23) { return 1; } else if (AFD >= 23) { return 0; } } } } else if (gchDC >= 15) { if (Cs < 256) { return 0; } else if (Cs >= 256) { if (RsDiff < 4) { return 1; } else if (RsDiff >= 4) { return 0; } } } } else if (diffRsCsdiff >= 131) { return 1; } } else if (diffMVdiffVal >= 123) { if (ssDCval < 16) { if (TSC < 6) { return 0; } else if (TSC >= 6) { return 1; } } else if (ssDCval >= 16) { if (diffMVdiffVal < 919) { return 1; } else if (diffMVdiffVal >= 919) { if (Cs < 1098) { return 1; } else if (Cs >= 1098) { return 0; } } } } } else if (ssDCval >= 48) { if (diffTSC < 6) { if (diffTSC < 4) { if (MVDiff < 2511) { return 0; } else if (MVDiff >= 2511) { return 1; } } else if (diffTSC >= 4) { if (RsCsDiff < 75) { if (TSC < 8) { return 1; } else if (TSC >= 8) { if (refDCval < 57) { return 1; } else if (refDCval >= 57) { return 0; } } } else if (RsCsDiff >= 75) { return 0; } } } else if (diffTSC >= 6) { if (AFD < 20) { if (gchDC < 29) { if (gchDC < 12) { if (TSC < 14) { if (Cs < 90) { return 1; } else if (Cs >= 90) { return 0; } } else if (TSC >= 14) { return 1; } } else if (gchDC >= 12) { if (TSC < 8) { return 1; } else if (TSC >= 8) { return 0; } } } else if (gchDC >= 29) { return 1; } } else if (AFD >= 20) { if (negBalance < 24) { if (diffRsCsdiff < 23) { if (AFD < 22) { if (Cs < 75) { return 1; } else if (Cs >= 75) { return 0; } } else if (AFD >= 22) { return 0; } } else if (diffRsCsdiff >= 23) { if (diffMVdiffVal < 117) { if (RsDiff < 10) { return 0; } else if (RsDiff >= 10) { if (refDCval < 42) { if (Rs < 1974) { return 1; } else if (Rs >= 1974) { return 0; } } else if (refDCval >= 42) { return 0; } } } else if (diffMVdiffVal >= 117) { if (Cs < 251) { return 1; } else if (Cs >= 251) { if (TSC < 15) { return 0; } else if (TSC >= 15) { if (RsDiff < 6) { return 1; } else if (RsDiff >= 6) { if (RsCsDiff < 89) { return 0; } else if (RsCsDiff >= 89) { return 1; } } } } } } } else if (negBalance >= 24) { if (diffAFD < 15) { if (posBalance < 63) { return 0; } else if (posBalance >= 63) { if (diffMVdiffVal < 95) { return 0; } else if (diffMVdiffVal >= 95) { return 1; } } } else if (diffAFD >= 15) { if (diffMVdiffVal < 79) { if (MVDiff < 91) { if (AFD < 24) { return 0; } else if (AFD >= 24) { return 1; } } else if (MVDiff >= 91) { return 0; } } else if (diffMVdiffVal >= 79) { if (negBalance < 99) { return 1; } else if (negBalance >= 99) { if (AFD < 28) { return 0; } else if (AFD >= 28) { return 1; } } } } } } } } } } } else if (AFD >= 30) { if (CsDiff < 7) { if (diffAFD < 23) { if (diffTSC < 9) { if (SC < 41) { if (CsDiff < 4) { if (diffRsCsdiff < -85) { return 1; } else if (diffRsCsdiff >= -85) { if (diffMVdiffVal < 1561) { return 0; } else if (diffMVdiffVal >= 1561) { return 1; } } } else if (CsDiff >= 4) { return 1; } } else if (SC >= 41) { if (posBalance < 66) { if (diffAFD < 13) { if (negBalance < 41) { return 1; } else if (negBalance >= 41) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (diffMVdiffVal < 65) { return 0; } else if (diffMVdiffVal >= 65) { if (posBalance < 25) { return 0; } else if (posBalance >= 25) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { if (Cs < 253) { if (SC < 1545) { return 1; } else if (SC >= 1545) { return 0; } } else if (Cs >= 253) { if (refDCval < 148) { return 0; } else if (refDCval >= 148) { return 1; } } } } } } } } else if (diffAFD >= 13) { if (gchDC < 19) { if (refDCval < 64) { if (Cs < 203) { return 1; } else if (Cs >= 203) { return 0; } } else if (refDCval >= 64) { return 0; } } else if (gchDC >= 19) { if (Scindex < 2) { if (Cs < 53) { return 1; } else if (Cs >= 53) { return 0; } } else if (Scindex >= 2) { if (SC < 823) { return 1; } else if (SC >= 823) { if (CsDiff < 3) { return 1; } else if (CsDiff >= 3) { return 0; } } } } } } else if (posBalance >= 66) { return 0; } } } else if (diffTSC >= 9) { if (RsCsDiff < 108) { if (MVDiff < 1224) { if (diffMVdiffVal < 304) { if (posBalance < 33) { return 0; } else if (posBalance >= 33) { if (ssDCval < 62) { if (diffTSC < 11) { return 1; } else if (diffTSC >= 11) { if (diffRsCsdiff < -10) { return 0; } else if (diffRsCsdiff >= -10) { return 1; } } } else if (ssDCval >= 62) { if (Rs < 10) { return 1; } else if (Rs >= 10) { if (diffTSC < 17) { return 0; } else if (diffTSC >= 17) { if (refDCval < 61) { return 0; } else if (refDCval >= 61) { return 1; } } } } } } else if (diffMVdiffVal >= 304) { if (refDCval < 44) { return 0; } else if (refDCval >= 44) { return 1; } } } else if (MVDiff >= 1224) { return 1; } } else if (RsCsDiff >= 108) { if (Cs < 548) { return 1; } else if (Cs >= 548) { if (Rs < 1810) { return 1; } else if (Rs >= 1810) { return 0; } } } } } else if (diffAFD >= 23) { if (negBalance < 41) { if (negBalance < 2) { return 0; } else if (negBalance >= 2) { if (diffAFD < 26) { return 0; } else if (diffAFD >= 26) { if (gchDC < 77) { if (TSC < 29) { if (diffMVdiffVal < 73) { if (SC < 264) { return 0; } else if (SC >= 264) { if (Cs < 228) { return 0; } else if (Cs >= 228) { return 1; } } } else if (diffMVdiffVal >= 73) { if (posBalance < 116) { if (ssDCval < 139) { if (ssDCval < 70) { if (AFD < 39) { return 1; } else if (AFD >= 39) { return 0; } } else if (ssDCval >= 70) { return 1; } } else if (ssDCval >= 139) { return 0; } } else if (posBalance >= 116) { return 0; } } } else if (TSC >= 29) { if (TSC < 52) { if (gchDC < 36) { if (RsDiff < 16) { return 0; } else if (RsDiff >= 16) { return 1; } } else if (gchDC >= 36) { return 0; } } else if (TSC >= 52) { return 1; } } } else if (gchDC >= 77) { return 1; } } } } else if (negBalance >= 41) { if (refDCval < 163) { if (AFD < 83) { if (diffMVdiffVal < 81) { if (RsCsDiff < 400) { if (negBalance < 66) { return 0; } else if (negBalance >= 66) { if (TSC < 27) { return 1; } else if (TSC >= 27) { return 0; } } } else if (RsCsDiff >= 400) { return 1; } } else if (diffMVdiffVal >= 81) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { if (gchDC < 39) { return 1; } else if (gchDC >= 39) { if (RsCsDiff < 201) { if (negBalance < 73) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } else if (negBalance >= 73) { return 1; } } else if (RsCsDiff >= 201) { return 0; } } } } } else if (AFD >= 83) { return 0; } } else if (refDCval >= 163) { if (SC < 544) { return 1; } else if (SC >= 544) { if (diffAFD < 48) { return 0; } else if (diffAFD >= 48) { return 1; } } } } } } else if (CsDiff >= 7) { if (diffAFD < 18) { if (gchDC < 23) { if (diffMVdiffVal < 153) { if (diffAFD < 15) { if (SC < 1481) { if (SC < 1439) { return 0; } else if (SC >= 1439) { return 1; } } else if (SC >= 1481) { return 0; } } else if (diffAFD >= 15) { if (CsDiff < 8) { return 1; } else if (CsDiff >= 8) { if (TSC < 33) { return 0; } else if (TSC >= 33) { return 1; } } } } else if (diffMVdiffVal >= 153) { if (gchDC < 1) { return 1; } else if (gchDC >= 1) { if (diffAFD < 8) { return 0; } else if (diffAFD >= 8) { if (refDCval < 80) { return 1; } else if (refDCval >= 80) { if (SC < 1977) { return 1; } else if (SC >= 1977) { return 0; } } } } } } else if (gchDC >= 23) { if (ssDCval < 41) { return 1; } else if (ssDCval >= 41) { if (RsCsDiff < 607) { if (Cs < 73) { return 1; } else if (Cs >= 73) { if (diffRsCsdiff < 98) { return 0; } else if (diffRsCsdiff >= 98) { if (posBalance < 73) { if (posBalance < 18) { if (SC < 2902) { return 0; } else if (SC >= 2902) { return 1; } } else if (posBalance >= 18) { if (RsDiff < 18) { return 1; } else if (RsDiff >= 18) { return 0; } } } else if (posBalance >= 73) { return 0; } } } } else if (RsCsDiff >= 607) { if (Rs < 2189) { if (SC < 3703) { if (diffRsCsdiff < 247) { return 1; } else if (diffRsCsdiff >= 247) { if (SC < 752) { return 0; } else if (SC >= 752) { return 1; } } } else if (SC >= 3703) { return 0; } } else if (Rs >= 2189) { if (diffAFD < 15) { return 0; } else if (diffAFD >= 15) { return 1; } } } } } } else if (diffAFD >= 18) { if (diffAFD < 27) { if (posBalance < 102) { if (diffTSC < 6) { if (Rs < 418) { return 1; } else if (Rs >= 418) { return 0; } } else if (diffTSC >= 6) { if (AFD < 50) { if (diffMVdiffVal < 73) { if (Cs < 768) { return 1; } else if (Cs >= 768) { if (refDCval < 62) { return 0; } else if (refDCval >= 62) { if (gchDC < 29) { if (posBalance < 53) { return 0; } else if (posBalance >= 53) { return 1; } } else if (gchDC >= 29) { return 0; } } } } else if (diffMVdiffVal >= 73) { if (refDCval < 71) { return 1; } else if (refDCval >= 71) { if (Cs < 819) { return 1; } else if (Cs >= 819) { if (ssDCval < 59) { if (RsCsDiff < 281) { return 1; } else if (RsCsDiff >= 281) { return 0; } } else if (ssDCval >= 59) { if (Rs < 4514) { if (AFD < 41) { if (Rs < 1351) { return 0; } else if (Rs >= 1351) { if (diffRsCsdiff < 643) { return 0; } else if (diffRsCsdiff >= 643) { return 1; } } } else if (AFD >= 41) { return 1; } } else if (Rs >= 4514) { return 1; } } } } } } else if (AFD >= 50) { if (SC < 2762) { return 0; } else if (SC >= 2762) { if (Rs < 1576) { return 1; } else if (Rs >= 1576) { if (Cs < 930) { return 1; } else if (Cs >= 930) { return 0; } } } } } } else if (posBalance >= 102) { if (ssDCval < 139) { return 0; } else if (ssDCval >= 139) { if (negBalance < 6) { if (Rs < 144) { return 1; } else if (Rs >= 144) { return 0; } } else if (negBalance >= 6) { return 1; } } } } else if (diffAFD >= 27) { if (diffMVdiffVal < 61) { if (MVDiff < 112) { return 0; } else if (MVDiff >= 112) { if (ssDCval < 115) { return 1; } else if (ssDCval >= 115) { if (gchDC < 48) { if (ssDCval < 162) { if (MVDiff < 143) { return 0; } else if (MVDiff >= 143) { return 1; } } else if (ssDCval >= 162) { return 0; } } else if (gchDC >= 48) { return 0; } } } } else if (diffMVdiffVal >= 61) { if (diffAFD < 33) { if (gchDC < 21) { return 1; } else if (gchDC >= 21) { if (RsCsDiff < 417) { if (negBalance < 15) { return 0; } else if (negBalance >= 15) { if (TSC < 29) { return 1; } else if (TSC >= 29) { if (diffMVdiffVal < 326) { return 0; } else if (diffMVdiffVal >= 326) { return 1; } } } } else if (RsCsDiff >= 417) { if (TSC < 36) { if (diffRsCsdiff < 871) { return 1; } else if (diffRsCsdiff >= 871) { if (diffRsCsdiff < 916) { return 0; } else if (diffRsCsdiff >= 916) { return 1; } } } else if (TSC >= 36) { return 0; } } } } else if (diffAFD >= 33) { if (posBalance < 105) { if (refDCval < 132) { if (TSC < 40) { return 1; } else if (TSC >= 40) { if (diffTSC < 25) { return 0; } else if (diffTSC >= 25) { return 1; } } } else if (refDCval >= 132) { if (Rs < 9511) { if (gchDC < 84) { if (MVDiff < 1235) { return 1; } else if (MVDiff >= 1235) { if (Rs < 819) { return 0; } else if (Rs >= 819) { return 1; } } } else if (gchDC >= 84) { if (AFD < 41) { return 0; } else if (AFD >= 41) { return 1; } } } else if (Rs >= 9511) { if (Rs < 10400) { return 0; } else if (Rs >= 10400) { return 1; } } } } else if (posBalance >= 105) { if (ssDCval < 168) { if (MVDiff < 362) { return 1; } else if (MVDiff >= 362) { if (SC < 2014) { return 1; } else if (SC >= 2014) { if (Rs < 6578) { return 0; } else if (Rs >= 6578) { return 1; } } } } else if (ssDCval >= 168) { if (CsDiff < 10) { return 1; } else if (CsDiff >= 10) { return 0; } } } } } } } } } } return 0; } bool SCDetect10(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffTSC < 6) { if (diffMVdiffVal < 53) { if (gchDC < 6) { if (negBalance < 9) { if (ssDCval < 21) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (SC < 1346) { return 1; } else if (SC >= 1346) { if (RsDiff < 9) { if (TSC < 1) { return 0; } else if (TSC >= 1) { if (Cs < 1014) { return 1; } else if (Cs >= 1014) { return 0; } } } else if (RsDiff >= 9) { return 1; } } } } else if (ssDCval >= 21) { if (SC < 9) { if (Cs < 4) { return 0; } else if (Cs >= 4) { if (MVDiff < 841) { return 0; } else if (MVDiff >= 841) { if (refDCval < 23) { return 0; } else if (refDCval >= 23) { return 1; } } } } else if (SC >= 9) { return 0; } } } else if (negBalance >= 9) { if (SC < 87) { if (RsCsDiff < 2) { return 0; } else if (RsCsDiff >= 2) { if (diffRsCsdiff < 1) { return 0; } else if (diffRsCsdiff >= 1) { return 1; } } } else if (SC >= 87) { if (diffMVdiffVal < -123) { if (diffMVdiffVal < -124) { return 0; } else if (diffMVdiffVal >= -124) { if (MVDiff < 126) { return 0; } else if (MVDiff >= 126) { return 1; } } } else if (diffMVdiffVal >= -123) { return 0; } } } } else if (gchDC >= 6) { if (refDCval < 229) { if (gchDC < 154) { if (AFD < 53) { if (MVDiff < 224) { if (TSC < 24) { if (diffAFD < 13) { return 0; } else if (diffAFD >= 13) { if (posBalance < 21) { return 1; } else if (posBalance >= 21) { return 0; } } } else if (TSC >= 24) { if (RsDiff < 32) { return 0; } else if (RsDiff >= 32) { if (CsDiff < 30) { return 1; } else if (CsDiff >= 30) { return 0; } } } } else if (MVDiff >= 224) { if (diffTSC < -6) { return 0; } else if (diffTSC >= -6) { if (diffRsCsdiff < -96) { if (MVDiff < 228) { return 1; } else if (MVDiff >= 228) { if (SC < 133) { return 1; } else if (SC >= 133) { return 0; } } } else if (diffRsCsdiff >= -96) { if (diffRsCsdiff < 5) { return 0; } else if (diffRsCsdiff >= 5) { if (diffMVdiffVal < -210) { if (TSC < 8) { return 1; } else if (TSC >= 8) { if (TSC < 15) { return 0; } else if (TSC >= 15) { return 1; } } } else if (diffMVdiffVal >= -210) { return 0; } } } } } } else if (AFD >= 53) { if (negBalance < 74) { if (Cs < 1585) { return 0; } else if (Cs >= 1585) { if (Cs < 1912) { return 1; } else if (Cs >= 1912) { return 0; } } } else if (negBalance >= 74) { return 1; } } } else if (gchDC >= 154) { return 1; } } else if (refDCval >= 229) { return 1; } } } else if (diffMVdiffVal >= 53) { if (diffAFD < 8) { if (AFD < 47) { if (ssDCval < 31) { if (RsCsDiff < 2) { if (TSCindex < 4) { return 0; } else if (TSCindex >= 4) { if (TSC < 5) { if (diffMVdiffVal < 219) { return 0; } else if (diffMVdiffVal >= 219) { return 1; } } else if (TSC >= 5) { return 0; } } } else if (RsCsDiff >= 2) { if (diffRsCsdiff < 12) { if (TSC < 3) { return 0; } else if (TSC >= 3) { if (MVDiff < 167) { return 0; } else if (MVDiff >= 167) { if (gchDC < 10) { return 1; } else if (gchDC >= 10) { if (diffTSC < -9) { return 1; } else if (diffTSC >= -9) { return 0; } } } } } else if (diffRsCsdiff >= 12) { return 1; } } } else if (ssDCval >= 31) { if (diffRsCsdiff < 2302) { if (gchDC < 112) { if (Cs < 378) { if (ssDCval < 41) { if (SC < 718) { if (diffTSC < 1) { return 0; } else if (diffTSC >= 1) { if (AFD < 9) { return 0; } else if (AFD >= 9) { if (Cs < 149) { if (Rs < 7) { return 1; } else if (Rs >= 7) { if (CsDiff < 1) { return 0; } else if (CsDiff >= 1) { return 1; } } } else if (Cs >= 149) { return 0; } } } } else if (SC >= 718) { if (Rs < 625) { return 1; } else if (Rs >= 625) { return 0; } } } else if (ssDCval >= 41) { if (TSC < 15) { return 0; } else if (TSC >= 15) { if (TSC < 17) { if (negBalance < 44) { if (refDCval < 112) { return 1; } else if (refDCval >= 112) { return 0; } } else if (negBalance >= 44) { return 0; } } else if (TSC >= 17) { return 0; } } } } else if (Cs >= 378) { return 0; } } else if (gchDC >= 112) { if (TSC < 14) { return 1; } else if (TSC >= 14) { return 0; } } } else if (diffRsCsdiff >= 2302) { return 1; } } } else if (AFD >= 47) { if (RsCsDiff < 110) { return 0; } else if (RsCsDiff >= 110) { if (TSC < 34) { if (SC < 1565) { if (posBalance < 58) { return 1; } else if (posBalance >= 58) { return 0; } } else if (SC >= 1565) { if (posBalance < 20) { return 1; } else if (posBalance >= 20) { return 0; } } } else if (TSC >= 34) { return 1; } } } } else if (diffAFD >= 8) { if (AFD < 15) { if (refDCval < 48) { return 1; } else if (refDCval >= 48) { if (Cs < 27) { return 1; } else if (Cs >= 27) { return 0; } } } else if (AFD >= 15) { if (negBalance < 42) { if (diffMVdiffVal < 120) { return 0; } else if (diffMVdiffVal >= 120) { if (RsDiff < 8) { return 0; } else if (RsDiff >= 8) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (Cs < 152) { return 1; } else if (Cs >= 152) { return 0; } } } } } else if (negBalance >= 42) { if (refDCval < 82) { if (SC < 543) { if (negBalance < 87) { if (TSC < 15) { if (gchDC < 6) { if (diffRsCsdiff < -2) { return 0; } else if (diffRsCsdiff >= -2) { if (Rs < 278) { return 1; } else if (Rs >= 278) { return 0; } } } else if (gchDC >= 6) { return 1; } } else if (TSC >= 15) { return 0; } } else if (negBalance >= 87) { if (posBalance < 1) { if (diffMVdiffVal < 209) { return 0; } else if (diffMVdiffVal >= 209) { return 1; } } else if (posBalance >= 1) { if (CsDiff < 8) { return 0; } else if (CsDiff >= 8) { return 1; } } } } else if (SC >= 543) { if (RsCsDiff < 47) { if (AFD < 30) { return 0; } else if (AFD >= 30) { if (ssDCval < 51) { return 1; } else if (ssDCval >= 51) { return 0; } } } else if (RsCsDiff >= 47) { if (AFD < 25) { if (Rs < 452) { return 0; } else if (Rs >= 452) { if (SC < 2247) { return 1; } else if (SC >= 2247) { return 0; } } } else if (AFD >= 25) { if (RsCsDiff < 467) { if (AFD < 39) { if (TSC < 11) { return 0; } else if (TSC >= 11) { if (RsCsDiff < 105) { return 0; } else if (RsCsDiff >= 105) { return 1; } } } else if (AFD >= 39) { return 0; } } else if (RsCsDiff >= 467) { return 0; } } } } } else if (refDCval >= 82) { if (SC < 4) { return 1; } else if (SC >= 4) { if (gchDC < 14) { return 0; } else if (gchDC >= 14) { if (refDCval < 165) { if (AFD < 47) { return 0; } else if (AFD >= 47) { if (RsCsDiff < 147) { if (Scindex < 1) { return 1; } else if (Scindex >= 1) { return 0; } } else if (RsCsDiff >= 147) { return 1; } } } else if (refDCval >= 165) { if (ssDCval < 109) { return 0; } else if (ssDCval >= 109) { return 1; } } } } } } } } } } else if (diffTSC >= 6) { if (diffAFD < 21) { if (ssDCval < 46) { if (diffAFD < 10) { if (RsDiff < 4) { if (negBalance < 64) { return 0; } else if (negBalance >= 64) { if (RsCsDiff < 23) { return 1; } else if (RsCsDiff >= 23) { return 0; } } } else if (RsDiff >= 4) { if (negBalance < 87) { return 1; } else if (negBalance >= 87) { return 0; } } } else if (diffAFD >= 10) { if (diffMVdiffVal < 61) { if (diffRsCsdiff < 813) { if (Rs < 884) { if (CsDiff < 7) { if (gchDC < 19) { return 0; } else if (gchDC >= 19) { return 1; } } else if (CsDiff >= 7) { return 1; } } else if (Rs >= 884) { return 0; } } else if (diffRsCsdiff >= 813) { return 1; } } else if (diffMVdiffVal >= 61) { if (MVDiff < 210) { return 1; } else if (MVDiff >= 210) { if (negBalance < 58) { if (diffMVdiffVal < 191) { return 0; } else if (diffMVdiffVal >= 191) { return 1; } } else if (negBalance >= 58) { return 1; } } } } } else if (ssDCval >= 46) { if (diffMVdiffVal < 74) { if (MVDiff < 14) { return 0; } else if (MVDiff >= 14) { if (diffTSC < 24) { if (RsDiff < 24) { if (MVDiff < 185) { if (diffMVdiffVal < 25) { return 0; } else if (diffMVdiffVal >= 25) { if (diffRsCsdiff < 124) { return 0; } else if (diffRsCsdiff >= 124) { if (Cs < 1271) { if (negBalance < 42) { return 0; } else if (negBalance >= 42) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { return 1; } } } else if (Cs >= 1271) { return 0; } } } } else if (MVDiff >= 185) { if (ssDCval < 117) { if (diffTSC < 12) { if (refDCval < 37) { if (diffTSC < 9) { return 1; } else if (diffTSC >= 9) { return 0; } } else if (refDCval >= 37) { return 0; } } else if (diffTSC >= 12) { if (posBalance < 104) { if (AFD < 24) { return 1; } else if (AFD >= 24) { return 0; } } else if (posBalance >= 104) { return 1; } } } else if (ssDCval >= 117) { return 0; } } } else if (RsDiff >= 24) { if (SC < 3594) { return 1; } else if (SC >= 3594) { if (diffMVdiffVal < 19) { return 0; } else if (diffMVdiffVal >= 19) { if (diffAFD < 12) { return 0; } else if (diffAFD >= 12) { if (Cs < 3439) { if (RsCsDiff < 1268) { return 0; } else if (RsCsDiff >= 1268) { return 1; } } else if (Cs >= 3439) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { if (ssDCval < 96) { return 0; } else if (ssDCval >= 96) { return 1; } } } } } } } } else if (diffTSC >= 24) { if (refDCval < 110) { return 1; } else if (refDCval >= 110) { return 0; } } } } else if (diffMVdiffVal >= 74) { if (ssDCval < 125) { if (diffRsCsdiff < 24) { if (TSCindex < 9) { return 1; } else if (TSCindex >= 9) { if (SC < 332) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (diffTSC < 14) { if (Scindex < 1) { if (Rs < 52) { return 0; } else if (Rs >= 52) { return 1; } } else if (Scindex >= 1) { return 0; } } else if (diffTSC >= 14) { return 1; } } } else if (SC >= 332) { if (diffAFD < 17) { if (AFD < 59) { return 0; } else if (AFD >= 59) { return 1; } } else if (diffAFD >= 17) { if (TSC < 15) { if (negBalance < 30) { return 0; } else if (negBalance >= 30) { return 1; } } else if (TSC >= 15) { if (negBalance < 42) { return 0; } else if (negBalance >= 42) { return 1; } } } } } } else if (diffRsCsdiff >= 24) { if (SC < 1069) { if (posBalance < 3) { return 0; } else if (posBalance >= 3) { return 1; } } else if (SC >= 1069) { if (negBalance < 44) { if (posBalance < 68) { return 1; } else if (posBalance >= 68) { if (ssDCval < 68) { if (SC < 2100) { if (RsCsDiff < 61) { return 0; } else if (RsCsDiff >= 61) { return 1; } } else if (SC >= 2100) { return 0; } } else if (ssDCval >= 68) { if (Rs < 4166) { return 0; } else if (Rs >= 4166) { return 1; } } } } else if (negBalance >= 44) { if (posBalance < 7) { return 0; } else if (posBalance >= 7) { if (SC < 4363) { return 1; } else if (SC >= 4363) { if (diffRsCsdiff < 953) { return 0; } else if (diffRsCsdiff >= 953) { return 1; } } } } } } } else if (ssDCval >= 125) { if (SC < 9) { return 1; } else if (SC >= 9) { if (ssDCval < 150) { if (CsDiff < 9) { return 0; } else if (CsDiff >= 9) { if (Cs < 1937) { return 1; } else if (Cs >= 1937) { return 0; } } } else if (ssDCval >= 150) { return 0; } } } } } } else if (diffAFD >= 21) { if (diffMVdiffVal < 63) { if (TSC < 16) { if (gchDC < 10) { return 0; } else if (gchDC >= 10) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (CsDiff < 30) { return 1; } else if (CsDiff >= 30) { return 0; } } } } else if (TSC >= 16) { if (diffTSC < 40) { if (ssDCval < 66) { if (gchDC < 20) { return 1; } else if (gchDC >= 20) { if (refDCval < 32) { return 1; } else if (refDCval >= 32) { if (Cs < 70) { return 1; } else if (Cs >= 70) { if (diffAFD < 31) { return 0; } else if (diffAFD >= 31) { return 1; } } } } } else if (ssDCval >= 66) { if (posBalance < 91) { if (posBalance < 40) { if (diffMVdiffVal < 56) { if (RsDiff < 85) { return 0; } else if (RsDiff >= 85) { return 1; } } else if (diffMVdiffVal >= 56) { if (Cs < 3397) { return 1; } else if (Cs >= 3397) { return 0; } } } else if (posBalance >= 40) { if (diffMVdiffVal < -16) { if (negBalance < 23) { return 0; } else if (negBalance >= 23) { return 1; } } else if (diffMVdiffVal >= -16) { if (diffAFD < 26) { if (AFD < 26) { return 1; } else if (AFD >= 26) { return 0; } } else if (diffAFD >= 26) { if (Cs < 2501) { return 1; } else if (Cs >= 2501) { if (negBalance < 53) { return 1; } else if (negBalance >= 53) { return 0; } } } } } } else if (posBalance >= 91) { if (RsCsDiff < 267) { return 0; } else if (RsCsDiff >= 267) { if (Cs < 571) { return 1; } else if (Cs >= 571) { if (posBalance < 126) { return 0; } else if (posBalance >= 126) { return 1; } } } } } } else if (diffTSC >= 40) { if (RsDiff < 9) { return 0; } else if (RsDiff >= 9) { return 1; } } } } else if (diffMVdiffVal >= 63) { if (negBalance < 12) { if (TSC < 46) { if (refDCval < 54) { if (diffRsCsdiff < 5) { return 1; } else if (diffRsCsdiff >= 5) { if (RsCsDiff < 77) { return 0; } else if (RsCsDiff >= 77) { if (Cs < 754) { return 1; } else if (Cs >= 754) { if (diffMVdiffVal < 96) { return 0; } else if (diffMVdiffVal >= 96) { if (ssDCval < 173) { if (diffAFD < 53) { return 0; } else if (diffAFD >= 53) { return 1; } } else if (ssDCval >= 173) { return 1; } } } } } } else if (refDCval >= 54) { if (diffRsCsdiff < 3) { return 0; } else if (diffRsCsdiff >= 3) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (gchDC < 67) { if (gchDC < 54) { return 1; } else if (gchDC >= 54) { return 0; } } else if (gchDC >= 67) { return 1; } } } } } else if (TSC >= 46) { return 1; } } else if (negBalance >= 12) { if (gchDC < 18) { if (diffRsCsdiff < -2) { return 0; } else if (diffRsCsdiff >= -2) { if (diffMVdiffVal < 73) { if (MVDiff < 71) { return 1; } else if (MVDiff >= 71) { if (diffTSC < 11) { if (Rs < 650) { if (SC < 647) { return 1; } else if (SC >= 647) { return 0; } } else if (Rs >= 650) { return 0; } } else if (diffTSC >= 11) { if (Rs < 9024) { return 1; } else if (Rs >= 9024) { return 0; } } } } else if (diffMVdiffVal >= 73) { if (SC < 1348) { if (Rs < 1061) { if (AFD < 43) { return 1; } else if (AFD >= 43) { if (negBalance < 45) { if (Cs < 461) { return 0; } else if (Cs >= 461) { return 1; } } else if (negBalance >= 45) { if (refDCval < 151) { return 1; } else if (refDCval >= 151) { return 0; } } } } else if (Rs >= 1061) { return 0; } } else if (SC >= 1348) { return 1; } } } } else if (gchDC >= 18) { if (diffAFD < 28) { if (RsDiff < 35) { if (refDCval < 140) { if (posBalance < 43) { if (AFD < 34) { if (SC < 1676) { return 1; } else if (SC >= 1676) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { return 1; } } } else if (AFD >= 34) { if (RsDiff < 22) { if (SC < 101) { return 0; } else if (SC >= 101) { if (negBalance < 84) { if (Cs < 1548) { return 0; } else if (Cs >= 1548) { return 1; } } else if (negBalance >= 84) { return 1; } } } else if (RsDiff >= 22) { return 0; } } } else if (posBalance >= 43) { if (ssDCval < 63) { return 1; } else if (ssDCval >= 63) { if (diffTSC < 12) { if (AFD < 43) { return 1; } else if (AFD >= 43) { return 0; } } else if (diffTSC >= 12) { if (ssDCval < 105) { if (RsDiff < 16) { return 0; } else if (RsDiff >= 16) { if (negBalance < 39) { return 0; } else if (negBalance >= 39) { if (CsDiff < 14) { return 0; } else if (CsDiff >= 14) { return 1; } } } } else if (ssDCval >= 105) { return 1; } } } } } else if (refDCval >= 140) { if (ssDCval < 136) { return 0; } else if (ssDCval >= 136) { return 1; } } } else if (RsDiff >= 35) { return 1; } } else if (diffAFD >= 28) { if (RsCsDiff < 263) { if (refDCval < 57) { if (Rs < 1037) { if (diffRsCsdiff < 70) { if (Rs < 640) { if (AFD < 44) { return 1; } else if (AFD >= 44) { if (posBalance < 92) { return 1; } else if (posBalance >= 92) { return 0; } } } else if (Rs >= 640) { return 0; } } else if (diffRsCsdiff >= 70) { return 1; } } else if (Rs >= 1037) { if (TSC < 30) { if (TSC < 29) { return 0; } else if (TSC >= 29) { return 1; } } else if (TSC >= 30) { return 0; } } } else if (refDCval >= 57) { if (diffRsCsdiff < -10) { return 0; } else if (diffRsCsdiff >= -10) { if (Cs < 680) { if (diffTSC < 40) { if (ssDCval < 37) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } else if (ssDCval >= 37) { return 1; } } else if (diffTSC >= 40) { if (RsCsDiff < 26) { return 0; } else if (RsCsDiff >= 26) { return 1; } } } else if (Cs >= 680) { if (RsDiff < 14) { if (RsDiff < 7) { if (refDCval < 90) { if (negBalance < 44) { return 1; } else if (negBalance >= 44) { return 0; } } else if (refDCval >= 90) { return 1; } } else if (RsDiff >= 7) { return 1; } } else if (RsDiff >= 14) { if (TSC < 27) { return 1; } else if (TSC >= 27) { return 0; } } } } } } else if (RsCsDiff >= 263) { if (TSC < 39) { if (diffMVdiffVal < 455) { return 1; } else if (diffMVdiffVal >= 455) { if (negBalance < 37) { if (Rs < 1686) { return 1; } else if (Rs >= 1686) { return 0; } } else if (negBalance >= 37) { return 1; } } } else if (TSC >= 39) { if (diffMVdiffVal < 171) { if (diffTSC < 20) { return 0; } else if (diffTSC >= 20) { return 1; } } else if (diffMVdiffVal >= 171) { return 1; } } } } } } } } } return 0; } bool SCDetect11(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (gchDC < 5) { if (diffRsCsdiff < 70) { if (diffTSC < 6) { if (diffMVdiffVal < 54) { if (negBalance < 1) { if (diffRsCsdiff < 7) { if (TSCindex < 2) { return 0; } else if (TSCindex >= 2) { if (AFD < 2) { if (posBalance < 68) { return 1; } else if (posBalance >= 68) { return 0; } } else if (AFD >= 2) { return 0; } } } else if (diffRsCsdiff >= 7) { if (ssDCval < 23) { return 1; } else if (ssDCval >= 23) { return 0; } } } else if (negBalance >= 1) { if (diffMVdiffVal < -9) { if (TSC < 11) { return 0; } else if (TSC >= 11) { if (SC < 568) { if (posBalance < 60) { return 0; } else if (posBalance >= 60) { return 1; } } else if (SC >= 568) { return 0; } } } else if (diffMVdiffVal >= -9) { return 0; } } } else if (diffMVdiffVal >= 54) { if (Cs < 251) { if (TSCindex < 5) { if (diffMVdiffVal < 272) { return 0; } else if (diffMVdiffVal >= 272) { if (MVDiff < 356) { return 1; } else if (MVDiff >= 356) { return 0; } } } else if (TSCindex >= 5) { if (refDCval < 32) { return 1; } else if (refDCval >= 32) { if (diffAFD < 7) { if (negBalance < 41) { if (AFD < 25) { return 0; } else if (AFD >= 25) { return 1; } } else if (negBalance >= 41) { return 0; } } else if (diffAFD >= 7) { if (refDCval < 50) { if (diffRsCsdiff < -4) { return 0; } else if (diffRsCsdiff >= -4) { if (Cs < 182) { return 1; } else if (Cs >= 182) { if (SC < 435) { return 0; } else if (SC >= 435) { return 1; } } } } else if (refDCval >= 50) { return 0; } } } } } else if (Cs >= 251) { return 0; } } } else if (diffTSC >= 6) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (posBalance < 62) { if (diffMVdiffVal < 73) { if (AFD < 25) { return 0; } else if (AFD >= 25) { if (Rs < 160) { return 1; } else if (Rs >= 160) { return 0; } } } else if (diffMVdiffVal >= 73) { if (Rs < 28) { return 0; } else if (Rs >= 28) { return 1; } } } else if (posBalance >= 62) { if (Rs < 1241) { return 1; } else if (Rs >= 1241) { return 0; } } } } } else if (diffRsCsdiff >= 70) { if (diffAFD < 21) { if (MVDiff < 54) { if (ssDCval < 20) { return 1; } else if (ssDCval >= 20) { if (Cs < 535) { if (diffTSC < 11) { return 0; } else if (diffTSC >= 11) { return 1; } } else if (Cs >= 535) { if (refDCval < 44) { if (RsCsDiff < 813) { return 0; } else if (RsCsDiff >= 813) { return 1; } } else if (refDCval >= 44) { return 0; } } } } else if (MVDiff >= 54) { if (diffMVdiffVal < 58) { if (AFD < 10) { if (diffRsCsdiff < 764) { return 0; } else if (diffRsCsdiff >= 764) { return 1; } } else if (AFD >= 10) { if (refDCval < 46) { if (diffMVdiffVal < -64) { if (RsCsDiff < 110) { return 0; } else if (RsCsDiff >= 110) { return 1; } } else if (diffMVdiffVal >= -64) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { if (RsDiff < 12) { return 1; } else if (RsDiff >= 12) { return 0; } } } } else if (refDCval >= 46) { return 0; } } } else if (diffMVdiffVal >= 58) { if (ssDCval < 78) { if (negBalance < 43) { if (ssDCval < 34) { return 1; } else if (ssDCval >= 34) { return 0; } } else if (negBalance >= 43) { if (RsDiff < 12) { return 1; } else if (RsDiff >= 12) { if (SC < 2533) { return 1; } else if (SC >= 2533) { if (SC < 3200) { return 0; } else if (SC >= 3200) { return 1; } } } } } else if (ssDCval >= 78) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { if (diffTSC < 12) { if (Rs < 1485) { return 1; } else if (Rs >= 1485) { return 0; } } else if (diffTSC >= 12) { return 1; } } } } } } else if (diffAFD >= 21) { if (MVDiff < 47) { return 0; } else if (MVDiff >= 47) { if (diffMVdiffVal < 73) { if (refDCval < 115) { if (diffTSC < 11) { if (SC < 1039) { return 1; } else if (SC >= 1039) { return 0; } } else if (diffTSC >= 11) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (diffAFD < 39) { return 1; } else if (diffAFD >= 39) { if (SC < 9756) { return 1; } else if (SC >= 9756) { return 0; } } } } } else if (refDCval >= 115) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (TSC < 24) { return 1; } else if (TSC >= 24) { return 0; } } } } else if (diffMVdiffVal >= 73) { if (CsDiff < 8) { if (ssDCval < 105) { return 1; } else if (ssDCval >= 105) { if (RsCsDiff < 233) { return 1; } else if (RsCsDiff >= 233) { return 0; } } } else if (CsDiff >= 8) { return 1; } } } } } } else if (gchDC >= 5) { if (diffMVdiffVal < 65) { if (refDCval < 25) { if (diffMVdiffVal < 3) { if (ssDCval < 45) { return 0; } else if (ssDCval >= 45) { if (Rs < 399) { return 1; } else if (Rs >= 399) { if (SC < 3093) { return 0; } else if (SC >= 3093) { return 1; } } } } else if (diffMVdiffVal >= 3) { return 1; } } else if (refDCval >= 25) { if (diffAFD < 13) { if (AFD < 47) { if (TSC < 24) { if (SC < 111) { if (negBalance < 82) { return 0; } else if (negBalance >= 82) { if (Rs < 11) { if (MVDiff < 662) { return 0; } else if (MVDiff >= 662) { if (ssDCval < 124) { return 0; } else if (ssDCval >= 124) { return 1; } } } else if (Rs >= 11) { if (MVDiff < 20) { return 1; } else if (MVDiff >= 20) { if (RsCsDiff < 4) { return 0; } else if (RsCsDiff >= 4) { if (Rs < 51) { return 1; } else if (Rs >= 51) { return 0; } } } } } } else if (SC >= 111) { if (MVDiff < 224) { return 0; } else if (MVDiff >= 224) { if (Cs < 376) { return 0; } else if (Cs >= 376) { if (Scindex < 4) { if (ssDCval < 63) { if (diffTSC < -9) { return 0; } else if (diffTSC >= -9) { if (CsDiff < 5) { if (Cs < 378) { return 1; } else if (Cs >= 378) { return 0; } } else if (CsDiff >= 5) { if (SC < 1351) { return 1; } else if (SC >= 1351) { return 0; } } } } else if (ssDCval >= 63) { return 0; } } else if (Scindex >= 4) { return 0; } } } } } else if (TSC >= 24) { if (RsCsDiff < 1303) { if (ssDCval < 64) { if (Cs < 502) { return 0; } else if (Cs >= 502) { return 1; } } else if (ssDCval >= 64) { return 0; } } else if (RsCsDiff >= 1303) { if (SC < 8521) { return 1; } else if (SC >= 8521) { return 0; } } } } else if (AFD >= 47) { if (diffTSC < 3) { if (RsDiff < 9) { if (SC < 40) { return 1; } else if (SC >= 40) { return 0; } } else if (RsDiff >= 9) { if (MVDiff < 258) { return 0; } else if (MVDiff >= 258) { if (SC < 3672) { if (MVDiff < 582) { return 1; } else if (MVDiff >= 582) { return 0; } } else if (SC >= 3672) { if (RsCsDiff < 1022) { return 0; } else if (RsCsDiff >= 1022) { return 1; } } } } } else if (diffTSC >= 3) { return 0; } } } else if (diffAFD >= 13) { if (RsDiff < 9) { if (posBalance < 95) { if (MVDiff < 107) { return 0; } else if (MVDiff >= 107) { if (TSC < 26) { if (diffMVdiffVal < -206) { return 1; } else if (diffMVdiffVal >= -206) { if (negBalance < 68) { if (posBalance < 89) { return 0; } else if (posBalance >= 89) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } } else if (negBalance >= 68) { if (Rs < 50) { return 0; } else if (Rs >= 50) { if (Cs < 827) { return 1; } else if (Cs >= 827) { return 0; } } } } } else if (TSC >= 26) { return 0; } } } else if (posBalance >= 95) { return 0; } } else if (RsDiff >= 9) { if (ssDCval < 77) { if (diffRsCsdiff < 283) { if (negBalance < 30) { return 0; } else if (negBalance >= 30) { if (posBalance < 29) { if (gchDC < 101) { return 0; } else if (gchDC >= 101) { return 1; } } else if (posBalance >= 29) { if (TSC < 10) { return 0; } else if (TSC >= 10) { return 1; } } } } else if (diffRsCsdiff >= 283) { if (CsDiff < 33) { return 1; } else if (CsDiff >= 33) { return 0; } } } else if (ssDCval >= 77) { if (MVDiff < 222) { if (RsDiff < 108) { if (diffAFD < 37) { if (Cs < 4333) { return 0; } else if (Cs >= 4333) { if (Rs < 3473) { return 1; } else if (Rs >= 3473) { return 0; } } } else if (diffAFD >= 37) { if (RsDiff < 21) { return 0; } else if (RsDiff >= 21) { if (Rs < 4829) { return 1; } else if (Rs >= 4829) { return 0; } } } } else if (RsDiff >= 108) { return 1; } } else if (MVDiff >= 222) { if (MVDiff < 289) { return 1; } else if (MVDiff >= 289) { if (MVDiff < 401) { if (ssDCval < 99) { return 0; } else if (ssDCval >= 99) { if (RsCsDiff < 273) { return 0; } else if (RsCsDiff >= 273) { if (posBalance < 100) { return 1; } else if (posBalance >= 100) { return 0; } } } } else if (MVDiff >= 401) { return 1; } } } } } } } } else if (diffMVdiffVal >= 65) { if (diffTSC < 7) { if (diffAFD < 8) { if (refDCval < 44) { if (diffRsCsdiff < 11) { if (gchDC < 16) { return 0; } else if (gchDC >= 16) { if (AFD < 19) { if (refDCval < 42) { if (AFD < 13) { return 1; } else if (AFD >= 13) { return 0; } } else if (refDCval >= 42) { return 1; } } else if (AFD >= 19) { return 0; } } } else if (diffRsCsdiff >= 11) { if (diffMVdiffVal < 100) { return 1; } else if (diffMVdiffVal >= 100) { if (posBalance < 50) { return 1; } else if (posBalance >= 50) { return 0; } } } } else if (refDCval >= 44) { if (AFD < 58) { if (gchDC < 123) { if (diffRsCsdiff < -38) { if (AFD < 40) { if (diffAFD < 7) { return 0; } else if (diffAFD >= 7) { return 1; } } else if (AFD >= 40) { if (Rs < 926) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (TSC < 15) { return 0; } else if (TSC >= 15) { return 1; } } } else if (Rs >= 926) { return 0; } } } else if (diffRsCsdiff >= -38) { if (diffTSC < -8) { if (diffAFD < 3) { return 0; } else if (diffAFD >= 3) { return 1; } } else if (diffTSC >= -8) { return 0; } } } else if (gchDC >= 123) { if (ssDCval < 24) { return 1; } else if (ssDCval >= 24) { if (CsDiff < 7) { return 0; } else if (CsDiff >= 7) { return 1; } } } } else if (AFD >= 58) { if (Rs < 1544) { return 0; } else if (Rs >= 1544) { return 1; } } } } else if (diffAFD >= 8) { if (Cs < 211) { if (Rs < 157) { if (ssDCval < 34) { if (diffRsCsdiff < 7) { return 1; } else if (diffRsCsdiff >= 7) { if (ssDCval < 19) { return 0; } else if (ssDCval >= 19) { if (TSC < 11) { return 1; } else if (TSC >= 11) { return 0; } } } } else if (ssDCval >= 34) { if (CsDiff < 4) { if (gchDC < 14) { if (Cs < 26) { return 0; } else if (Cs >= 26) { if (TSC < 5) { return 0; } else if (TSC >= 5) { return 1; } } } else if (gchDC >= 14) { if (MVDiff < 390) { return 0; } else if (MVDiff >= 390) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } } } else if (CsDiff >= 4) { if (diffTSC < -5) { return 0; } else if (diffTSC >= -5) { if (MVDiff < 672) { return 1; } else if (MVDiff >= 672) { if (AFD < 37) { return 1; } else if (AFD >= 37) { return 0; } } } } } } else if (Rs >= 157) { if (refDCval < 49) { if (RsCsDiff < 27) { return 0; } else if (RsCsDiff >= 27) { return 1; } } else if (refDCval >= 49) { return 0; } } } else if (Cs >= 211) { if (diffMVdiffVal < 94) { return 0; } else if (diffMVdiffVal >= 94) { if (MVDiff < 135) { return 1; } else if (MVDiff >= 135) { if (ssDCval < 62) { if (RsCsDiff < 150) { if (gchDC < 9) { return 1; } else if (gchDC >= 9) { if (Cs < 243) { if (AFD < 38) { return 1; } else if (AFD >= 38) { return 0; } } else if (Cs >= 243) { return 0; } } } else if (RsCsDiff >= 150) { if (Cs < 477) { if (RsDiff < 11) { return 1; } else if (RsDiff >= 11) { return 0; } } else if (Cs >= 477) { return 1; } } } else if (ssDCval >= 62) { if (RsDiff < 40) { if (MVDiff < 458) { if (gchDC < 7) { if (diffTSC < 4) { return 0; } else if (diffTSC >= 4) { if (Rs < 1703) { return 1; } else if (Rs >= 1703) { return 0; } } } else if (gchDC >= 7) { return 0; } } else if (MVDiff >= 458) { if (AFD < 59) { if (diffMVdiffVal < 517) { return 0; } else if (diffMVdiffVal >= 517) { if (MVDiff < 653) { return 1; } else if (MVDiff >= 653) { return 0; } } } else if (AFD >= 59) { if (Rs < 1750) { return 1; } else if (Rs >= 1750) { return 0; } } } } else if (RsDiff >= 40) { return 1; } } } } } } } else if (diffTSC >= 7) { if (diffAFD < 20) { if (ssDCval < 47) { if (SC < 104) { if (diffAFD < 9) { return 0; } else if (diffAFD >= 9) { return 1; } } else if (SC >= 104) { return 1; } } else if (ssDCval >= 47) { if (refDCval < 129) { if (diffAFD < 14) { if (gchDC < 22) { return 0; } else if (gchDC >= 22) { if (Cs < 741) { if (refDCval < 56) { return 0; } else if (refDCval >= 56) { if (RsCsDiff < 37) { return 0; } else if (RsCsDiff >= 37) { return 1; } } } else if (Cs >= 741) { return 0; } } } else if (diffAFD >= 14) { if (negBalance < 42) { if (gchDC < 37) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (negBalance < 17) { return 0; } else if (negBalance >= 17) { if (refDCval < 54) { if (diffMVdiffVal < 128) { return 0; } else if (diffMVdiffVal >= 128) { return 1; } } else if (refDCval >= 54) { if (diffMVdiffVal < 104) { if (diffAFD < 17) { return 0; } else if (diffAFD >= 17) { return 1; } } else if (diffMVdiffVal >= 104) { return 0; } } } } } else if (gchDC >= 37) { if (Cs < 406) { if (diffRsCsdiff < 0) { return 0; } else if (diffRsCsdiff >= 0) { return 1; } } else if (Cs >= 406) { return 0; } } } else if (negBalance >= 42) { if (Rs < 3044) { if (Cs < 557) { if (AFD < 37) { return 1; } else if (AFD >= 37) { if (TSC < 16) { return 0; } else if (TSC >= 16) { return 1; } } } else if (Cs >= 557) { if (MVDiff < 138) { return 1; } else if (MVDiff >= 138) { if (ssDCval < 79) { return 0; } else if (ssDCval >= 79) { if (Cs < 1781) { return 1; } else if (Cs >= 1781) { return 0; } } } } } else if (Rs >= 3044) { return 1; } } } } else if (refDCval >= 129) { return 0; } } } else if (diffAFD >= 20) { if (RsCsDiff < 460) { if (negBalance < 30) { if (ssDCval < 94) { if (MVDiff < 191) { if (diffTSC < 20) { if (diffMVdiffVal < 78) { return 0; } else if (diffMVdiffVal >= 78) { return 1; } } else if (diffTSC >= 20) { if (diffAFD < 41) { return 0; } else if (diffAFD >= 41) { return 1; } } } else if (MVDiff >= 191) { if (diffMVdiffVal < 199) { return 0; } else if (diffMVdiffVal >= 199) { if (negBalance < 21) { if (TSC < 18) { return 1; } else if (TSC >= 18) { return 0; } } else if (negBalance >= 21) { if (MVDiff < 1504) { if (Rs < 908) { return 1; } else if (Rs >= 908) { return 0; } } else if (MVDiff >= 1504) { return 0; } } } } } else if (ssDCval >= 94) { if (diffRsCsdiff < 29) { if (SC < 671) { if (ssDCval < 142) { if (RsCsDiff < 13) { if (AFD < 36) { return 1; } else if (AFD >= 36) { if (Rs < 33) { return 1; } else if (Rs >= 33) { return 0; } } } else if (RsCsDiff >= 13) { return 1; } } else if (ssDCval >= 142) { return 0; } } else if (SC >= 671) { if (refDCval < 78) { return 0; } else if (refDCval >= 78) { if (Rs < 1232) { return 1; } else if (Rs >= 1232) { return 0; } } } } else if (diffRsCsdiff >= 29) { if (diffMVdiffVal < 102) { if (diffAFD < 37) { return 0; } else if (diffAFD >= 37) { return 1; } } else if (diffMVdiffVal >= 102) { if (SC < 1702) { return 1; } else if (SC >= 1702) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { if (SC < 2274) { return 1; } else if (SC >= 2274) { if (gchDC < 76) { if (diffAFD < 41) { return 0; } else if (diffAFD >= 41) { return 1; } } else if (gchDC >= 76) { return 1; } } } } } } } } else if (negBalance >= 30) { if (AFD < 46) { if (Cs < 3430) { if (MVDiff < 76) { if (SC < 865) { return 0; } else if (SC >= 865) { return 1; } } else if (MVDiff >= 76) { if (CsDiff < 6) { if (Rs < 1705) { if (diffMVdiffVal < 129) { if (Cs < 91) { return 0; } else if (Cs >= 91) { if (refDCval < 41) { return 0; } else if (refDCval >= 41) { return 1; } } } else if (diffMVdiffVal >= 129) { if (posBalance < 13) { if (RsCsDiff < 24) { return 0; } else if (RsCsDiff >= 24) { return 1; } } else if (posBalance >= 13) { return 1; } } } else if (Rs >= 1705) { return 0; } } else if (CsDiff >= 6) { if (MVDiff < 97) { if (Cs < 1059) { return 1; } else if (Cs >= 1059) { return 0; } } else if (MVDiff >= 97) { return 1; } } } } else if (Cs >= 3430) { return 0; } } else if (AFD >= 46) { if (CsDiff < 7) { if (diffAFD < 42) { if (MVDiff < 166) { return 1; } else if (MVDiff >= 166) { if (diffMVdiffVal < 159) { return 0; } else if (diffMVdiffVal >= 159) { if (diffAFD < 26) { return 0; } else if (diffAFD >= 26) { if (negBalance < 50) { if (Cs < 519) { return 1; } else if (Cs >= 519) { return 0; } } else if (negBalance >= 50) { if (Rs < 137) { return 0; } else if (Rs >= 137) { return 1; } } } } } } else if (diffAFD >= 42) { return 1; } } else if (CsDiff >= 7) { if (diffMVdiffVal < 125) { if (RsCsDiff < 156) { return 0; } else if (RsCsDiff >= 156) { if (diffAFD < 31) { if (TSC < 29) { if (RsDiff < 11) { return 0; } else if (RsDiff >= 11) { return 1; } } else if (TSC >= 29) { return 0; } } else if (diffAFD >= 31) { return 1; } } } else if (diffMVdiffVal >= 125) { if (diffAFD < 29) { if (Cs < 897) { if (Rs < 168) { return 0; } else if (Rs >= 168) { return 1; } } else if (Cs >= 897) { return 0; } } else if (diffAFD >= 29) { if (RsDiff < 5) { if (Rs < 191) { return 0; } else if (Rs >= 191) { return 1; } } else if (RsDiff >= 5) { return 1; } } } } } } } else if (RsCsDiff >= 460) { if (AFD < 42) { if (diffAFD < 24) { if (RsDiff < 24) { if (refDCval < 46) { return 0; } else if (refDCval >= 46) { return 1; } } else if (RsDiff >= 24) { if (Cs < 3157) { return 0; } else if (Cs >= 3157) { return 1; } } } else if (diffAFD >= 24) { if (RsCsDiff < 3210) { if (diffMVdiffVal < 229) { if (AFD < 41) { return 1; } else if (AFD >= 41) { if (negBalance < 36) { return 0; } else if (negBalance >= 36) { return 1; } } } else if (diffMVdiffVal >= 229) { if (diffMVdiffVal < 233) { return 0; } else if (diffMVdiffVal >= 233) { if (diffAFD < 28) { if (AFD < 38) { return 1; } else if (AFD >= 38) { return 0; } } else if (diffAFD >= 28) { return 1; } } } } else if (RsCsDiff >= 3210) { if (gchDC < 54) { return 1; } else if (gchDC >= 54) { return 0; } } } } else if (AFD >= 42) { if (diffMVdiffVal < 458) { if (posBalance < 17) { if (Rs < 1571) { return 0; } else if (Rs >= 1571) { return 1; } } else if (posBalance >= 17) { return 1; } } else if (diffMVdiffVal >= 458) { if (negBalance < 39) { return 0; } else if (negBalance >= 39) { return 1; } } } } } } } } return 0; } bool SCDetect12(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffAFD < 14) { if (diffMVdiffVal < 52) { if (RsCsDiff < 837) { if (MVDiff < 200) { if (Rs < 1148) { if (refDCval < 24) { if (diffRsCsdiff < 5) { if (MVDiff < 6) { if (gchDC < 109) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } else if (gchDC >= 109) { return 1; } } else if (MVDiff >= 6) { return 0; } } else if (diffRsCsdiff >= 5) { if (SC < 1207) { if (RsDiff < 10) { if (gchDC < 23) { return 0; } else if (gchDC >= 23) { return 1; } } else if (RsDiff >= 10) { return 1; } } else if (SC >= 1207) { if (RsCsDiff < 17) { if (ssDCval < 17) { return 1; } else if (ssDCval >= 17) { return 0; } } else if (RsCsDiff >= 17) { return 1; } } } } else if (refDCval >= 24) { if (gchDC < 31) { if (TSCindex < 9) { return 0; } else if (TSCindex >= 9) { if (Rs < 1) { return 1; } else if (Rs >= 1) { if (diffRsCsdiff < 48) { return 0; } else if (diffRsCsdiff >= 48) { if (SC < 705) { return 1; } else if (SC >= 705) { return 0; } } } } } else if (gchDC >= 31) { if (Cs < 52) { if (Cs < 30) { if (RsCsDiff < 325) { return 0; } else if (RsCsDiff >= 325) { return 1; } } else if (Cs >= 30) { return 1; } } else if (Cs >= 52) { return 0; } } } } else if (Rs >= 1148) { return 0; } } else if (MVDiff >= 200) { if (gchDC < 1) { return 0; } else if (gchDC >= 1) { if (diffRsCsdiff < 41) { if (negBalance < 1) { if (refDCval < 24) { if (diffAFD < -25) { return 0; } else if (diffAFD >= -25) { if (Cs < 2) { if (AFD < 3) { return 0; } else if (AFD >= 3) { return 1; } } else if (Cs >= 2) { return 1; } } } else if (refDCval >= 24) { return 0; } } else if (negBalance >= 1) { if (Rs < 2) { if (Cs < 53) { if (MVDiff < 662) { return 0; } else if (MVDiff >= 662) { if (TSC < 4) { return 0; } else if (TSC >= 4) { return 1; } } } else if (Cs >= 53) { return 1; } } else if (Rs >= 2) { if (TSC < 16) { return 0; } else if (TSC >= 16) { if (posBalance < 29) { return 0; } else if (posBalance >= 29) { if (diffMVdiffVal < -205) { if (posBalance < 76) { if (RsDiff < 3) { return 0; } else if (RsDiff >= 3) { return 1; } } else if (posBalance >= 76) { return 0; } } else if (diffMVdiffVal >= -205) { return 0; } } } } } } else if (diffRsCsdiff >= 41) { if (refDCval < 51) { if (Cs < 855) { if (SC < 1438) { return 1; } else if (SC >= 1438) { return 0; } } else if (Cs >= 855) { return 1; } } else if (refDCval >= 51) { if (AFD < 57) { return 0; } else if (AFD >= 57) { return 1; } } } } } } else if (RsCsDiff >= 837) { if (ssDCval < 47) { if (Rs < 1198) { return 0; } else if (Rs >= 1198) { return 1; } } else if (ssDCval >= 47) { if (MVDiff < 140) { if (TSC < 24) { return 0; } else if (TSC >= 24) { if (Cs < 2454) { return 1; } else if (Cs >= 2454) { return 0; } } } else if (MVDiff >= 140) { if (TSC < 24) { return 0; } else if (TSC >= 24) { if (Rs < 2620) { if (Cs < 1912) { return 1; } else if (Cs >= 1912) { return 0; } } else if (Rs >= 2620) { return 0; } } } } } } else if (diffMVdiffVal >= 52) { if (diffAFD < 7) { if (diffRsCsdiff < 5) { if (gchDC < 51) { if (diffAFD < 6) { if (RsCsDiff < 101) { if (negBalance < 81) { return 0; } else if (negBalance >= 81) { if (ssDCval < 24) { if (Cs < 36) { return 0; } else if (Cs >= 36) { return 1; } } else if (ssDCval >= 24) { return 0; } } } else if (RsCsDiff >= 101) { if (Rs < 156) { return 1; } else if (Rs >= 156) { if (diffRsCsdiff < -4) { return 0; } else if (diffRsCsdiff >= -4) { if (AFD < 34) { return 0; } else if (AFD >= 34) { return 1; } } } } } else if (diffAFD >= 6) { if (refDCval < 27) { return 1; } else if (refDCval >= 27) { return 0; } } } else if (gchDC >= 51) { if (Rs < 1) { return 1; } else if (Rs >= 1) { return 0; } } } else if (diffRsCsdiff >= 5) { if (diffMVdiffVal < 160) { if (refDCval < 28) { return 1; } else if (refDCval >= 28) { if (RsCsDiff < 423) { return 0; } else if (RsCsDiff >= 423) { if (Cs < 763) { if (MVDiff < 143) { if (SC < 5269) { return 1; } else if (SC >= 5269) { return 0; } } else if (MVDiff >= 143) { return 0; } } else if (Cs >= 763) { if (MVDiff < 238) { return 0; } else if (MVDiff >= 238) { if (ssDCval < 56) { return 1; } else if (ssDCval >= 56) { return 0; } } } } } } else if (diffMVdiffVal >= 160) { if (refDCval < 31) { return 1; } else if (refDCval >= 31) { if (gchDC < 33) { if (negBalance < 72) { return 0; } else if (negBalance >= 72) { if (posBalance < 44) { return 0; } else if (posBalance >= 44) { if (gchDC < 8) { return 0; } else if (gchDC >= 8) { return 1; } } } } else if (gchDC >= 33) { if (AFD < 34) { if (TSC < 15) { return 1; } else if (TSC >= 15) { return 0; } } else if (AFD >= 34) { if (negBalance < 54) { if (Cs < 190) { return 1; } else if (Cs >= 190) { return 0; } } else if (negBalance >= 54) { return 1; } } } } } } } else if (diffAFD >= 7) { if (AFD < 15) { if (gchDC < 7) { if (diffMVdiffVal < 65) { if (MVDiff < 85) { return 1; } else if (MVDiff >= 85) { return 0; } } else if (diffMVdiffVal >= 65) { if (SC < 490) { return 1; } else if (SC >= 490) { if (Cs < 324) { return 0; } else if (Cs >= 324) { return 1; } } } } else if (gchDC >= 7) { if (diffTSC < 3) { return 0; } else if (diffTSC >= 3) { if (Scindex < 2) { if (gchDC < 15) { if (Cs < 55) { return 0; } else if (Cs >= 55) { return 1; } } else if (gchDC >= 15) { return 1; } } else if (Scindex >= 2) { if (diffAFD < 11) { return 0; } else if (diffAFD >= 11) { if (Cs < 264) { return 1; } else if (Cs >= 264) { return 0; } } } } } } else if (AFD >= 15) { if (Cs < 211) { if (Rs < 102) { if (RsCsDiff < 7) { return 0; } else if (RsCsDiff >= 7) { if (TSC < 24) { if (diffRsCsdiff < 8) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (refDCval < 46) { if (SC < 159) { return 1; } else if (SC >= 159) { return 0; } } else if (refDCval >= 46) { return 1; } } } else if (diffRsCsdiff >= 8) { return 1; } } else if (TSC >= 24) { return 0; } } } else if (Rs >= 102) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (posBalance < 54) { return 0; } else if (posBalance >= 54) { return 1; } } } } } else if (Cs >= 211) { if (ssDCval < 38) { if (Rs < 447) { if (RsDiff < 3) { return 1; } else if (RsDiff >= 3) { return 0; } } else if (Rs >= 447) { return 1; } } else if (ssDCval >= 38) { if (MVDiff < 347) { if (diffTSC < 12) { if (ssDCval < 69) { if (diffAFD < 12) { if (gchDC < 7) { if (ssDCval < 66) { return 0; } else if (ssDCval >= 66) { return 1; } } else if (gchDC >= 7) { return 0; } } else if (diffAFD >= 12) { if (negBalance < 36) { return 0; } else if (negBalance >= 36) { if (posBalance < 41) { return 0; } else if (posBalance >= 41) { if (SC < 491) { return 0; } else if (SC >= 491) { return 1; } } } } } else if (ssDCval >= 69) { return 0; } } else if (diffTSC >= 12) { if (MVDiff < 170) { return 1; } else if (MVDiff >= 170) { if (Rs < 3064) { if (RsCsDiff < 505) { return 0; } else if (RsCsDiff >= 505) { return 1; } } else if (Rs >= 3064) { return 1; } } } } else if (MVDiff >= 347) { if (SC < 1674) { if (posBalance < 77) { if (diffMVdiffVal < 86) { return 1; } else if (diffMVdiffVal >= 86) { if (TSC < 14) { if (Cs < 231) { return 0; } else if (Cs >= 231) { if (refDCval < 87) { return 1; } else if (refDCval >= 87) { return 0; } } } else if (TSC >= 14) { return 0; } } } else if (posBalance >= 77) { return 0; } } else if (SC >= 1674) { if (negBalance < 60) { if (RsCsDiff < 124) { return 1; } else if (RsCsDiff >= 124) { return 0; } } else if (negBalance >= 60) { if (Rs < 1665) { return 1; } else if (Rs >= 1665) { return 0; } } } } } } } } } } else if (diffAFD >= 14) { if (AFD < 37) { if (diffMVdiffVal < 52) { if (TSC < 33) { if (gchDC < 2) { return 0; } else if (gchDC >= 2) { if (RsDiff < 55) { if (MVDiff < 132) { if (refDCval < 31) { if (CsDiff < 9) { return 0; } else if (CsDiff >= 9) { return 1; } } else if (refDCval >= 31) { if (negBalance < 80) { if (Rs < 213) { if (RsDiff < 3) { return 0; } else if (RsDiff >= 3) { return 1; } } else if (Rs >= 213) { return 0; } } else if (negBalance >= 80) { if (AFD < 18) { if (gchDC < 12) { return 1; } else if (gchDC >= 12) { return 0; } } else if (AFD >= 18) { return 0; } } } } else if (MVDiff >= 132) { if (diffAFD < 31) { if (gchDC < 5) { return 1; } else if (gchDC >= 5) { if (Scindex < 6) { if (diffMVdiffVal < -532) { if (AFD < 31) { return 1; } else if (AFD >= 31) { return 0; } } else if (diffMVdiffVal >= -532) { if (diffRsCsdiff < 188) { if (TSC < 8) { return 1; } else if (TSC >= 8) { return 0; } } else if (diffRsCsdiff >= 188) { if (TSC < 20) { return 1; } else if (TSC >= 20) { return 0; } } } } else if (Scindex >= 6) { return 1; } } } else if (diffAFD >= 31) { return 1; } } } else if (RsDiff >= 55) { if (CsDiff < 37) { return 1; } else if (CsDiff >= 37) { if (CsDiff < 75) { return 0; } else if (CsDiff >= 75) { return 1; } } } } } else if (TSC >= 33) { return 1; } } else if (diffMVdiffVal >= 52) { if (ssDCval < 66) { if (gchDC < 15) { if (diffRsCsdiff < 86) { if (TSC < 12) { if (Rs < 235) { return 1; } else if (Rs >= 235) { if (MVDiff < 122) { return 0; } else if (MVDiff >= 122) { if (Cs < 325) { return 0; } else if (Cs >= 325) { return 1; } } } } else if (TSC >= 12) { return 1; } } else if (diffRsCsdiff >= 86) { return 1; } } else if (gchDC >= 15) { if (negBalance < 22) { if (refDCval < 34) { if (CsDiff < 7) { if (RsCsDiff < 51) { return 1; } else if (RsCsDiff >= 51) { return 0; } } else if (CsDiff >= 7) { return 1; } } else if (refDCval >= 34) { return 0; } } else if (negBalance >= 22) { if (Rs < 1921) { if (diffMVdiffVal < 63) { if (Cs < 797) { if (negBalance < 46) { return 0; } else if (negBalance >= 46) { return 1; } } else if (Cs >= 797) { return 0; } } else if (diffMVdiffVal >= 63) { if (diffAFD < 23) { if (RsCsDiff < 128) { if (RsDiff < 5) { return 1; } else if (RsDiff >= 5) { if (ssDCval < 45) { if (Cs < 21) { return 0; } else if (Cs >= 21) { if (Cs < 596) { return 1; } else if (Cs >= 596) { return 0; } } } else if (ssDCval >= 45) { return 1; } } } else if (RsCsDiff >= 128) { return 1; } } else if (diffAFD >= 23) { return 1; } } } else if (Rs >= 1921) { if (SC < 4972) { return 0; } else if (SC >= 4972) { return 1; } } } } } else if (ssDCval >= 66) { if (diffAFD < 22) { if (diffMVdiffVal < 94) { if (negBalance < 42) { return 0; } else if (negBalance >= 42) { if (AFD < 31) { if (refDCval < 64) { return 0; } else if (refDCval >= 64) { if (Cs < 233) { return 0; } else if (Cs >= 233) { return 1; } } } else if (AFD >= 31) { if (TSC < 20) { return 0; } else if (TSC >= 20) { return 1; } } } } else if (diffMVdiffVal >= 94) { if (gchDC < 12) { return 1; } else if (gchDC >= 12) { if (SC < 775) { if (CsDiff < 4) { if (TSC < 11) { return 1; } else if (TSC >= 11) { if (negBalance < 61) { return 0; } else if (negBalance >= 61) { return 1; } } } else if (CsDiff >= 4) { if (diffMVdiffVal < 98) { return 0; } else if (diffMVdiffVal >= 98) { return 1; } } } else if (SC >= 775) { if (diffRsCsdiff < 183) { if (TSC < 19) { return 0; } else if (TSC >= 19) { if (AFD < 35) { if (RsDiff < 4) { if (AFD < 32) { return 1; } else if (AFD >= 32) { return 0; } } else if (RsDiff >= 4) { return 0; } } else if (AFD >= 35) { return 1; } } } else if (diffRsCsdiff >= 183) { if (Rs < 2473) { return 1; } else if (Rs >= 2473) { if (AFD < 29) { return 1; } else if (AFD >= 29) { return 0; } } } } } } } else if (diffAFD >= 22) { if (refDCval < 50) { if (negBalance < 3) { return 0; } else if (negBalance >= 3) { if (SC < 1394) { return 1; } else if (SC >= 1394) { if (Cs < 2716) { return 0; } else if (Cs >= 2716) { return 1; } } } } else if (refDCval >= 50) { if (diffMVdiffVal < 135) { if (ssDCval < 143) { if (Rs < 237) { if (Rs < 124) { return 1; } else if (Rs >= 124) { return 0; } } else if (Rs >= 237) { if (negBalance < 27) { if (MVDiff < 67) { return 0; } else if (MVDiff >= 67) { return 1; } } else if (negBalance >= 27) { return 1; } } } else if (ssDCval >= 143) { if (posBalance < 90) { if (MVDiff < 75) { if (ssDCval < 167) { return 1; } else if (ssDCval >= 167) { return 0; } } else if (MVDiff >= 75) { return 1; } } else if (posBalance >= 90) { return 0; } } } else if (diffMVdiffVal >= 135) { if (Rs < 4773) { return 1; } else if (Rs >= 4773) { return 0; } } } } } } } else if (AFD >= 37) { if (diffAFD < 29) { if (RsCsDiff < 148) { if (gchDC < 26) { if (diffRsCsdiff < 68) { if (refDCval < 91) { if (diffTSC < 16) { if (refDCval < 87) { return 0; } else if (refDCval >= 87) { if (Cs < 53) { return 1; } else if (Cs >= 53) { return 0; } } } else if (diffTSC >= 16) { return 1; } } else if (refDCval >= 91) { return 0; } } else if (diffRsCsdiff >= 68) { return 1; } } else if (gchDC >= 26) { return 0; } } else if (RsCsDiff >= 148) { if (posBalance < 78) { if (diffTSC < 8) { if (ssDCval < 67) { return 1; } else if (ssDCval >= 67) { return 0; } } else if (diffTSC >= 8) { if (MVDiff < 301) { if (CsDiff < 27) { if (AFD < 38) { if (SC < 2526) { return 1; } else if (SC >= 2526) { return 0; } } else if (AFD >= 38) { return 1; } } else if (CsDiff >= 27) { if (refDCval < 129) { if (SC < 4291) { if (diffMVdiffVal < 156) { return 0; } else if (diffMVdiffVal >= 156) { return 1; } } else if (SC >= 4291) { return 1; } } else if (refDCval >= 129) { return 0; } } } else if (MVDiff >= 301) { if (MVDiff < 473) { if (posBalance < 49) { if (TSC < 50) { if (AFD < 45) { if (Cs < 824) { return 1; } else if (Cs >= 824) { return 0; } } else if (AFD >= 45) { return 0; } } else if (TSC >= 50) { return 1; } } else if (posBalance >= 49) { if (TSC < 33) { return 1; } else if (TSC >= 33) { return 0; } } } else if (MVDiff >= 473) { if (posBalance < 68) { return 1; } else if (posBalance >= 68) { if (gchDC < 11) { return 1; } else if (gchDC >= 11) { return 0; } } } } } } else if (posBalance >= 78) { if (diffRsCsdiff < 354) { if (ssDCval < 91) { if (MVDiff < 240) { return 1; } else if (MVDiff >= 240) { return 0; } } else if (ssDCval >= 91) { return 0; } } else if (diffRsCsdiff >= 354) { if (Rs < 2263) { return 1; } else if (Rs >= 2263) { if (Cs < 2172) { return 0; } else if (Cs >= 2172) { return 1; } } } } } } else if (diffAFD >= 29) { if (diffMVdiffVal < 49) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { if (TSC < 23) { if (SC < 2301) { if (gchDC < 18) { return 1; } else if (gchDC >= 18) { return 0; } } else if (SC >= 2301) { return 0; } } else if (TSC >= 23) { if (diffTSC < 39) { return 1; } else if (diffTSC >= 39) { if (ssDCval < 122) { return 1; } else if (ssDCval >= 122) { return 0; } } } } } else if (diffMVdiffVal >= 49) { if (RsCsDiff < 37) { if (TSC < 32) { if (ssDCval < 55) { return 0; } else if (ssDCval >= 55) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } } else if (TSC >= 32) { if (MVDiff < 974) { if (posBalance < 59) { if (AFD < 64) { return 0; } else if (AFD >= 64) { return 1; } } else if (posBalance >= 59) { return 0; } } else if (MVDiff >= 974) { return 1; } } } else if (RsCsDiff >= 37) { if (refDCval < 54) { if (negBalance < 12) { if (diffAFD < 55) { return 0; } else if (diffAFD >= 55) { return 1; } } else if (negBalance >= 12) { if (TSC < 60) { if (negBalance < 43) { if (negBalance < 42) { if (RsCsDiff < 255) { if (Rs < 1342) { if (MVDiff < 757) { return 1; } else if (MVDiff >= 757) { if (SC < 1086) { return 1; } else if (SC >= 1086) { return 0; } } } else if (Rs >= 1342) { if (AFD < 46) { return 0; } else if (AFD >= 46) { return 1; } } } else if (RsCsDiff >= 255) { return 1; } } else if (negBalance >= 42) { return 0; } } else if (negBalance >= 43) { return 1; } } else if (TSC >= 60) { return 0; } } } else if (refDCval >= 54) { if (refDCval < 132) { if (posBalance < 75) { if (diffRsCsdiff < 218) { if (diffMVdiffVal < 81) { return 0; } else if (diffMVdiffVal >= 81) { if (RsDiff < 14) { return 1; } else if (RsDiff >= 14) { return 0; } } } else if (diffRsCsdiff >= 218) { return 1; } } else if (posBalance >= 75) { if (diffAFD < 38) { if (SC < 1736) { return 1; } else if (SC >= 1736) { if (ssDCval < 117) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { return 1; } } else if (ssDCval >= 117) { if (CsDiff < 24) { return 0; } else if (CsDiff >= 24) { return 1; } } } } else if (diffAFD >= 38) { return 1; } } } else if (refDCval >= 132) { if (ssDCval < 156) { if (posBalance < 72) { if (diffRsCsdiff < 53) { return 0; } else if (diffRsCsdiff >= 53) { if (SC < 6154) { return 1; } else if (SC >= 6154) { if (Cs < 6832) { if (Rs < 3561) { if (AFD < 55) { return 0; } else if (AFD >= 55) { return 1; } } else if (Rs >= 3561) { return 1; } } else if (Cs >= 6832) { return 0; } } } } else if (posBalance >= 72) { return 0; } } else if (ssDCval >= 156) { return 1; } } } } } } } } return 0; } bool SCDetect13(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 /*TSCindex*/, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffTSC < 7) { if (diffMVdiffVal < 71) { if (refDCval < 24) { if (gchDC < 2) { if (diffRsCsdiff < 204) { if (diffRsCsdiff < 7) { if (diffAFD < -21) { if (ssDCval < 24) { return 0; } else if (ssDCval >= 24) { if (Cs < 10) { return 1; } else if (Cs >= 10) { return 0; } } } else if (diffAFD >= -21) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { if (MVDiff < 6) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { return 1; } } else if (MVDiff >= 6) { return 0; } } } } else if (diffRsCsdiff >= 7) { if (ssDCval < 18) { return 1; } else if (ssDCval >= 18) { return 0; } } } else if (diffRsCsdiff >= 204) { return 1; } } else if (gchDC >= 2) { if (SC < 1197) { if (AFD < 1) { return 1; } else if (AFD >= 1) { return 0; } } else if (SC >= 1197) { return 1; } } } else if (refDCval >= 24) { if (MVDiff < 55) { if (gchDC < 9) { return 0; } else if (gchDC >= 9) { if (Cs < 48) { if (diffMVdiffVal < -235) { return 1; } else if (diffMVdiffVal >= -235) { if (ssDCval < 213) { if (gchDC < 39) { return 0; } else if (gchDC >= 39) { return 1; } } else if (ssDCval >= 213) { return 1; } } } else if (Cs >= 48) { return 0; } } } else if (MVDiff >= 55) { if (gchDC < 15) { if (diffAFD < 9) { if (MVDiff < 175) { if (RsDiff < 37) { if (AFD < 40) { return 0; } else if (AFD >= 40) { if (refDCval < 133) { return 0; } else if (refDCval >= 133) { return 1; } } } else if (RsDiff >= 37) { if (Rs < 2335) { if (SC < 3109) { return 0; } else if (SC >= 3109) { return 1; } } else if (Rs >= 2335) { return 0; } } } else if (MVDiff >= 175) { if (refDCval < 30) { if (refDCval < 28) { return 0; } else if (refDCval >= 28) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { if (AFD < 14) { return 1; } else if (AFD >= 14) { return 0; } } } } else if (refDCval >= 30) { if (TSC < 14) { return 0; } else if (TSC >= 14) { if (RsCsDiff < 323) { if (diffMVdiffVal < -10) { if (diffRsCsdiff < 216) { if (ssDCval < 59) { if (Cs < 388) { return 0; } else if (Cs >= 388) { return 1; } } else if (ssDCval >= 59) { return 0; } } else if (diffRsCsdiff >= 216) { return 1; } } else if (diffMVdiffVal >= -10) { return 0; } } else if (RsCsDiff >= 323) { return 0; } } } } } else if (diffAFD >= 9) { if (ssDCval < 44) { if (diffTSC < 3) { return 0; } else if (diffTSC >= 3) { if (negBalance < 41) { return 0; } else if (negBalance >= 41) { if (AFD < 28) { if (MVDiff < 128) { return 1; } else if (MVDiff >= 128) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { return 1; } } } else if (AFD >= 28) { return 0; } } } } else if (ssDCval >= 44) { if (Cs < 2369) { return 0; } else if (Cs >= 2369) { if (refDCval < 82) { if (SC < 6502) { return 0; } else if (SC >= 6502) { return 1; } } else if (refDCval >= 82) { return 0; } } } } } else if (gchDC >= 15) { if (CsDiff < 19) { if (diffAFD < 13) { if (ssDCval < 62) { if (TSC < 26) { if (AFD < 27) { return 0; } else if (AFD >= 27) { if (posBalance < 57) { return 0; } else if (posBalance >= 57) { return 1; } } } else if (TSC >= 26) { return 1; } } else if (ssDCval >= 62) { return 0; } } else if (diffAFD >= 13) { if (RsCsDiff < 307) { if (diffTSC < -1) { return 1; } else if (diffTSC >= -1) { if (ssDCval < 87) { if (refDCval < 47) { return 0; } else if (refDCval >= 47) { return 1; } } else if (ssDCval >= 87) { if (diffMVdiffVal < 40) { return 0; } else if (diffMVdiffVal >= 40) { return 1; } } } } else if (RsCsDiff >= 307) { return 0; } } } else if (CsDiff >= 19) { if (ssDCval < 41) { return 1; } else if (ssDCval >= 41) { if (AFD < 43) { return 0; } else if (AFD >= 43) { if (Cs < 1894) { if (refDCval < 111) { return 1; } else if (refDCval >= 111) { return 0; } } else if (Cs >= 1894) { return 0; } } } } } } } } else if (diffMVdiffVal >= 71) { if (diffAFD < 8) { if (diffMVdiffVal < 203) { if (AFD < 61) { if (diffRsCsdiff < 10) { if (RsDiff < 7) { return 0; } else if (RsDiff >= 7) { if (Scindex < 3) { if (RsCsDiff < 172) { return 0; } else if (RsCsDiff >= 172) { return 1; } } else if (Scindex >= 3) { return 0; } } } else if (diffRsCsdiff >= 10) { if (TSC < 6) { if (Rs < 735) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (Rs >= 735) { return 0; } } else if (TSC >= 6) { if (AFD < 7) { return 1; } else if (AFD >= 7) { if (negBalance < 115) { if (diffAFD < -4) { if (diffAFD < -5) { return 0; } else if (diffAFD >= -5) { if (ssDCval < 117) { return 0; } else if (ssDCval >= 117) { return 1; } } } else if (diffAFD >= -4) { return 0; } } else if (negBalance >= 115) { if (diffTSC < 2) { return 0; } else if (diffTSC >= 2) { if (AFD < 28) { return 1; } else if (AFD >= 28) { return 0; } } } } } } } else if (AFD >= 61) { return 1; } } else if (diffMVdiffVal >= 203) { if (SC < 1070) { if (diffAFD < 3) { if (Cs < 618) { if (diffAFD < -44) { if (TSC < 10) { return 1; } else if (TSC >= 10) { return 0; } } else if (diffAFD >= -44) { if (posBalance < 128) { if (MVDiff < 438) { if (MVDiff < 428) { if (Rs < 381) { return 0; } else if (Rs >= 381) { if (RsCsDiff < 15) { return 1; } else if (RsCsDiff >= 15) { return 0; } } } else if (MVDiff >= 428) { return 1; } } else if (MVDiff >= 438) { return 0; } } else if (posBalance >= 128) { return 1; } } } else if (Cs >= 618) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } } else if (diffAFD >= 3) { if (MVDiff < 266) { if (diffMVdiffVal < 229) { return 1; } else if (diffMVdiffVal >= 229) { if (AFD < 9) { return 1; } else if (AFD >= 9) { return 0; } } } else if (MVDiff >= 266) { if (diffMVdiffVal < 343) { if (Rs < 191) { if (RsCsDiff < 4) { if (diffAFD < 6) { return 0; } else if (diffAFD >= 6) { if (Rs < 69) { return 1; } else if (Rs >= 69) { return 0; } } } else if (RsCsDiff >= 4) { if (diffTSC < 1) { return 0; } else if (diffTSC >= 1) { return 1; } } } else if (Rs >= 191) { return 0; } } else if (diffMVdiffVal >= 343) { if (posBalance < 55) { if (gchDC < 29) { if (CsDiff < 3) { return 0; } else if (CsDiff >= 3) { return 1; } } else if (gchDC >= 29) { return 1; } } else if (posBalance >= 55) { return 0; } } } } } else if (SC >= 1070) { return 0; } } } else if (diffAFD >= 8) { if (TSC < 10) { if (ssDCval < 51) { if (diffRsCsdiff < 4) { if (diffMVdiffVal < 214) { if (negBalance < 70) { if (AFD < 15) { return 1; } else if (AFD >= 15) { if (Rs < 25) { return 1; } else if (Rs >= 25) { return 0; } } } else if (negBalance >= 70) { return 0; } } else if (diffMVdiffVal >= 214) { return 1; } } else if (diffRsCsdiff >= 4) { if (TSC < 5) { return 0; } else if (TSC >= 5) { if (gchDC < 18) { return 1; } else if (gchDC >= 18) { if (gchDC < 19) { if (AFD < 21) { return 0; } else if (AFD >= 21) { return 1; } } else if (gchDC >= 19) { return 1; } } } } } else if (ssDCval >= 51) { if (MVDiff < 285) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (ssDCval < 53) { return 1; } else if (ssDCval >= 53) { return 0; } } } else if (MVDiff >= 285) { if (RsCsDiff < 46) { if (negBalance < 76) { return 0; } else if (negBalance >= 76) { if (AFD < 20) { return 0; } else if (AFD >= 20) { return 1; } } } else if (RsCsDiff >= 46) { return 1; } } } } else if (TSC >= 10) { if (Cs < 555) { if (CsDiff < 6) { if (diffMVdiffVal < 142) { return 0; } else if (diffMVdiffVal >= 142) { if (SC < 398) { if (RsCsDiff < 11) { return 0; } else if (RsCsDiff >= 11) { if (refDCval < 69) { return 1; } else if (refDCval >= 69) { if (negBalance < 124) { return 0; } else if (negBalance >= 124) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } } } } else if (SC >= 398) { if (Cs < 249) { if (AFD < 47) { return 1; } else if (AFD >= 47) { return 0; } } else if (Cs >= 249) { return 0; } } } } else if (CsDiff >= 6) { if (SC < 2281) { if (ssDCval < 146) { return 1; } else if (ssDCval >= 146) { if (TSC < 19) { return 1; } else if (TSC >= 19) { return 0; } } } else if (SC >= 2281) { return 0; } } } else if (Cs >= 555) { if (SC < 2727) { if (MVDiff < 267) { return 0; } else if (MVDiff >= 267) { if (SC < 2432) { if (AFD < 45) { if (diffAFD < 10) { return 0; } else if (diffAFD >= 10) { return 1; } } else if (AFD >= 45) { return 0; } } else if (SC >= 2432) { return 1; } } } else if (SC >= 2727) { return 0; } } } } } } else if (diffTSC >= 7) { if (diffAFD < 21) { if (Cs < 777) { if (ssDCval < 47) { if (diffRsCsdiff < 2) { if (diffMVdiffVal < 200) { return 0; } else if (diffMVdiffVal >= 200) { return 1; } } else if (diffRsCsdiff >= 2) { if (posBalance < 56) { if (refDCval < 151) { if (negBalance < 38) { return 0; } else if (negBalance >= 38) { return 1; } } else if (refDCval >= 151) { return 0; } } else if (posBalance >= 56) { if (SC < 251) { return 1; } else if (SC >= 251) { if (Cs < 560) { if (CsDiff < 3) { if (Cs < 83) { return 1; } else if (Cs >= 83) { return 0; } } else if (CsDiff >= 3) { if (posBalance < 69) { if (Rs < 386) { if (MVDiff < 114) { return 0; } else if (MVDiff >= 114) { return 1; } } else if (Rs >= 386) { return 1; } } else if (posBalance >= 69) { return 1; } } } else if (Cs >= 560) { if (CsDiff < 9) { return 0; } else if (CsDiff >= 9) { return 1; } } } } } } else if (ssDCval >= 47) { if (CsDiff < 6) { if (refDCval < 129) { if (TSC < 10) { if (diffMVdiffVal < 84) { if (Cs < 97) { return 1; } else if (Cs >= 97) { return 0; } } else if (diffMVdiffVal >= 84) { return 1; } } else if (TSC >= 10) { if (diffAFD < 15) { if (refDCval < 31) { if (Rs < 237) { return 1; } else if (Rs >= 237) { return 0; } } else if (refDCval >= 31) { if (Cs < 206) { if (gchDC < 9) { if (RsDiff < 4) { return 0; } else if (RsDiff >= 4) { return 1; } } else if (gchDC >= 9) { if (TSC < 15) { return 0; } else if (TSC >= 15) { if (posBalance < 114) { return 0; } else if (posBalance >= 114) { return 1; } } } } else if (Cs >= 206) { if (TSC < 30) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (SC < 1090) { return 0; } else if (SC >= 1090) { return 1; } } } else if (TSC >= 30) { return 1; } } } } else if (diffAFD >= 15) { if (diffMVdiffVal < 151) { if (negBalance < 28) { if (TSC < 12) { return 1; } else if (TSC >= 12) { if (diffTSC < 28) { return 0; } else if (diffTSC >= 28) { return 1; } } } else if (negBalance >= 28) { if (AFD < 29) { return 1; } else if (AFD >= 29) { if (SC < 729) { return 1; } else if (SC >= 729) { return 0; } } } } else if (diffMVdiffVal >= 151) { if (posBalance < 88) { return 1; } else if (posBalance >= 88) { if (Cs < 296) { if (AFD < 26) { return 1; } else if (AFD >= 26) { return 0; } } else if (Cs >= 296) { return 0; } } } } } } else if (refDCval >= 129) { return 0; } } else if (CsDiff >= 6) { if (diffRsCsdiff < 46) { if (Rs < 401) { return 1; } else if (Rs >= 401) { return 0; } } else if (diffRsCsdiff >= 46) { if (RsCsDiff < 173) { return 1; } else if (RsCsDiff >= 173) { if (ssDCval < 134) { if (diffRsCsdiff < 321) { if (SC < 663) { return 1; } else if (SC >= 663) { return 0; } } else if (diffRsCsdiff >= 321) { return 1; } } else if (ssDCval >= 134) { return 1; } } } } } } else if (Cs >= 777) { if (diffAFD < 14) { if (negBalance < 87) { if (posBalance < 55) { if (diffRsCsdiff < 975) { return 0; } else if (diffRsCsdiff >= 975) { if (gchDC < 3) { return 0; } else if (gchDC >= 3) { if (refDCval < 88) { return 1; } else if (refDCval >= 88) { return 0; } } } } else if (posBalance >= 55) { return 0; } } else if (negBalance >= 87) { if (gchDC < 38) { return 0; } else if (gchDC >= 38) { if (posBalance < 17) { return 0; } else if (posBalance >= 17) { return 1; } } } } else if (diffAFD >= 14) { if (MVDiff < 46) { if (SC < 17265) { return 0; } else if (SC >= 17265) { if (Rs < 9867) { return 1; } else if (Rs >= 9867) { return 0; } } } else if (MVDiff >= 46) { if (RsCsDiff < 141) { if (MVDiff < 1273) { return 0; } else if (MVDiff >= 1273) { return 1; } } else if (RsCsDiff >= 141) { if (Rs < 702) { return 1; } else if (Rs >= 702) { if (refDCval < 122) { if (negBalance < 43) { if (RsCsDiff < 215) { return 0; } else if (RsCsDiff >= 215) { if (AFD < 37) { if (diffTSC < 13) { return 1; } else if (diffTSC >= 13) { if (Cs < 983) { return 1; } else if (Cs >= 983) { return 0; } } } else if (AFD >= 37) { if (gchDC < 42) { return 0; } else if (gchDC >= 42) { return 1; } } } } else if (negBalance >= 43) { if (diffMVdiffVal < 53) { if (Rs < 13392) { if (negBalance < 46) { return 1; } else if (negBalance >= 46) { return 0; } } else if (Rs >= 13392) { return 1; } } else if (diffMVdiffVal >= 53) { if (Cs < 1524) { return 1; } else if (Cs >= 1524) { if (diffAFD < 15) { return 0; } else if (diffAFD >= 15) { if (CsDiff < 14) { return 0; } else if (CsDiff >= 14) { return 1; } } } } } } else if (refDCval >= 122) { return 0; } } } } } } } else if (diffAFD >= 21) { if (diffTSC < 15) { if (MVDiff < 51) { if (diffTSC < 13) { return 0; } else if (diffTSC >= 13) { if (gchDC < 10) { return 0; } else if (gchDC >= 10) { if (refDCval < 45) { return 1; } else if (refDCval >= 45) { return 0; } } } } else if (MVDiff >= 51) { if (Rs < 1869) { if (diffMVdiffVal < 50) { if (ssDCval < 58) { if (MVDiff < 600) { return 0; } else if (MVDiff >= 600) { return 1; } } else if (ssDCval >= 58) { if (refDCval < 95) { if (Cs < 830) { return 1; } else if (Cs >= 830) { return 0; } } else if (refDCval >= 95) { if (refDCval < 130) { if (Cs < 306) { return 0; } else if (Cs >= 306) { return 1; } } else if (refDCval >= 130) { return 0; } } } } else if (diffMVdiffVal >= 50) { if (posBalance < 117) { if (AFD < 69) { if (AFD < 37) { if (diffTSC < 12) { if (Rs < 278) { return 1; } else if (Rs >= 278) { if (negBalance < 58) { if (diffMVdiffVal < 67) { if (gchDC < 3) { return 1; } else if (gchDC >= 3) { return 0; } } else if (diffMVdiffVal >= 67) { if (ssDCval < 48) { if (SC < 821) { return 0; } else if (SC >= 821) { return 1; } } else if (ssDCval >= 48) { return 1; } } } else if (negBalance >= 58) { return 1; } } } else if (diffTSC >= 12) { return 1; } } else if (AFD >= 37) { if (diffMVdiffVal < 91) { if (MVDiff < 166) { if (RsDiff < 9) { return 0; } else if (RsDiff >= 9) { return 1; } } else if (MVDiff >= 166) { return 1; } } else if (diffMVdiffVal >= 91) { if (TSC < 27) { if (Cs < 2207) { if (SC < 3045) { if (RsCsDiff < 10) { return 0; } else if (RsCsDiff >= 10) { return 1; } } else if (SC >= 3045) { if (Rs < 1575) { return 0; } else if (Rs >= 1575) { return 1; } } } else if (Cs >= 2207) { return 0; } } else if (TSC >= 27) { if (Rs < 979) { return 0; } else if (Rs >= 979) { return 1; } } } } } else if (AFD >= 69) { if (diffMVdiffVal < 341) { return 0; } else if (diffMVdiffVal >= 341) { return 1; } } } else if (posBalance >= 117) { if (SC < 1716) { return 0; } else if (SC >= 1716) { return 1; } } } } else if (Rs >= 1869) { if (diffMVdiffVal < 61) { return 0; } else if (diffMVdiffVal >= 61) { if (AFD < 29) { if (CsDiff < 12) { return 1; } else if (CsDiff >= 12) { return 0; } } else if (AFD >= 29) { if (CsDiff < 15) { if (RsDiff < 21) { return 0; } else if (RsDiff >= 21) { return 1; } } else if (CsDiff >= 15) { if (refDCval < 96) { if (gchDC < 18) { return 1; } else if (gchDC >= 18) { if (RsDiff < 47) { return 0; } else if (RsDiff >= 47) { return 1; } } } else if (refDCval >= 96) { return 1; } } } } } } } else if (diffTSC >= 15) { if (posBalance < 91) { if (diffMVdiffVal < 62) { if (RsDiff < 13) { if (diffAFD < 24) { if (TSC < 21) { return 1; } else if (TSC >= 21) { return 0; } } else if (diffAFD >= 24) { if (MVDiff < 17) { return 1; } else if (MVDiff >= 17) { if (negBalance < 54) { if (TSC < 21) { return 1; } else if (TSC >= 21) { return 0; } } else if (negBalance >= 54) { return 0; } } } } else if (RsDiff >= 13) { if (Cs < 2537) { if (negBalance < 82) { return 1; } else if (negBalance >= 82) { if (gchDC < 29) { return 0; } else if (gchDC >= 29) { return 1; } } } else if (Cs >= 2537) { if (gchDC < 11) { return 0; } else if (gchDC >= 11) { return 1; } } } } else if (diffMVdiffVal >= 62) { if (CsDiff < 4) { if (diffRsCsdiff < 23) { if (diffTSC < 18) { return 1; } else if (diffTSC >= 18) { if (negBalance < 31) { return 0; } else if (negBalance >= 31) { if (gchDC < 36) { return 1; } else if (gchDC >= 36) { if (TSC < 23) { return 0; } else if (TSC >= 23) { if (posBalance < 17) { return 0; } else if (posBalance >= 17) { return 1; } } } } } } else if (diffRsCsdiff >= 23) { if (refDCval < 47) { return 0; } else if (refDCval >= 47) { if (AFD < 44) { return 1; } else if (AFD >= 44) { if (AFD < 51) { return 0; } else if (AFD >= 51) { return 1; } } } } } else if (CsDiff >= 4) { if (posBalance < 7) { if (Cs < 2127) { if (RsDiff < 7) { if (TSC < 34) { return 1; } else if (TSC >= 34) { return 0; } } else if (RsDiff >= 7) { return 1; } } else if (Cs >= 2127) { return 0; } } else if (posBalance >= 7) { if (CsDiff < 11) { if (negBalance < 39) { if (gchDC < 24) { if (Rs < 266) { return 0; } else if (Rs >= 266) { if (MVDiff < 624) { if (diffAFD < 22) { return 0; } else if (diffAFD >= 22) { if (CsDiff < 5) { return 0; } else if (CsDiff >= 5) { return 1; } } } else if (MVDiff >= 624) { return 0; } } } else if (gchDC >= 24) { return 1; } } else if (negBalance >= 39) { if (AFD < 46) { return 1; } else if (AFD >= 46) { if (diffMVdiffVal < 121) { if (Rs < 697) { return 1; } else if (Rs >= 697) { return 0; } } else if (diffMVdiffVal >= 121) { if (MVDiff < 491) { return 1; } else if (MVDiff >= 491) { if (diffMVdiffVal < 464) { return 0; } else if (diffMVdiffVal >= 464) { if (SC < 780) { return 0; } else if (SC >= 780) { return 1; } } } } } } } else if (CsDiff >= 11) { if (SC < 1452) { if (diffAFD < 32) { if (Cs < 734) { if (gchDC < 25) { return 1; } else if (gchDC >= 25) { return 0; } } else if (Cs >= 734) { return 0; } } else if (diffAFD >= 32) { return 1; } } else if (SC >= 1452) { if (diffRsCsdiff < 10398) { return 1; } else if (diffRsCsdiff >= 10398) { if (MVDiff < 75) { return 0; } else if (MVDiff >= 75) { return 1; } } } } } } } } else if (posBalance >= 91) { if (diffAFD < 26) { if (SC < 4270) { if (Cs < 34) { return 1; } else if (Cs >= 34) { if (negBalance < 2) { if (MVDiff < 117) { return 0; } else if (MVDiff >= 117) { if (Cs < 949) { return 0; } else if (Cs >= 949) { return 1; } } } else if (negBalance >= 2) { return 0; } } } else if (SC >= 4270) { if (Cs < 5284) { return 1; } else if (Cs >= 5284) { return 0; } } } else if (diffAFD >= 26) { if (diffRsCsdiff < 163) { if (Cs < 709) { if (TSC < 28) { if (CsDiff < 5) { if (gchDC < 25) { if (Rs < 246) { return 1; } else if (Rs >= 246) { return 0; } } else if (gchDC >= 25) { return 1; } } else if (CsDiff >= 5) { return 1; } } else if (TSC >= 28) { if (negBalance < 7) { return 1; } else if (negBalance >= 7) { if (refDCval < 62) { return 0; } else if (refDCval >= 62) { return 1; } } } } else if (Cs >= 709) { if (diffMVdiffVal < 354) { if (Cs < 1718) { if (diffTSC < 21) { if (Rs < 742) { if (AFD < 40) { return 0; } else if (AFD >= 40) { return 1; } } else if (Rs >= 742) { return 0; } } else if (diffTSC >= 21) { return 0; } } else if (Cs >= 1718) { return 1; } } else if (diffMVdiffVal >= 354) { return 1; } } } else if (diffRsCsdiff >= 163) { if (SC < 1650) { return 1; } else if (SC >= 1650) { if (diffAFD < 40) { if (MVDiff < 150) { if (ssDCval < 87) { return 1; } else if (ssDCval >= 87) { if (negBalance < 12) { return 0; } else if (negBalance >= 12) { if (MVDiff < 115) { return 1; } else if (MVDiff >= 115) { return 0; } } } } else if (MVDiff >= 150) { if (diffAFD < 33) { if (Cs < 2511) { if (diffMVdiffVal < 138) { return 0; } else if (diffMVdiffVal >= 138) { return 1; } } else if (Cs >= 2511) { return 1; } } else if (diffAFD >= 33) { return 1; } } } else if (diffAFD >= 40) { if (diffTSC < 40) { return 1; } else if (diffTSC >= 40) { if (gchDC < 101) { return 1; } else if (gchDC >= 101) { if (Cs < 1861) { return 0; } else if (Cs >= 1861) { return 1; } } } } } } } } } } } return 0; } bool SCDetect14(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (diffRsCsdiff < 69) { if (diffAFD < 8) { if (negBalance < 66) { if (diffAFD < 3) { if (TSC < 30) { if (refDCval < 24) { if (diffRsCsdiff < 5) { if (ssDCval < 35) { return 0; } else if (ssDCval >= 35) { return 1; } } else if (diffRsCsdiff >= 5) { if (posBalance < 2) { if (diffMVdiffVal < 2) { if (RsDiff < 2) { return 0; } else if (RsDiff >= 2) { return 1; } } else if (diffMVdiffVal >= 2) { return 0; } } else if (posBalance >= 2) { return 0; } } } else if (refDCval >= 24) { if (gchDC < 4) { return 0; } else if (gchDC >= 4) { if (MVDiff < 223) { return 0; } else if (MVDiff >= 223) { if (MVDiff < 225) { if (negBalance < 47) { return 0; } else if (negBalance >= 47) { return 1; } } else if (MVDiff >= 225) { if (ssDCval < 129) { if (ssDCval < 128) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (refDCval < 47) { if (TSCindex < 9) { return 0; } else if (TSCindex >= 9) { if (Cs < 863) { if (Rs < 732) { return 1; } else if (Rs >= 732) { return 0; } } else if (Cs >= 863) { return 0; } } } else if (refDCval >= 47) { return 0; } } } else if (ssDCval >= 128) { return 1; } } else if (ssDCval >= 129) { return 0; } } } } } } else if (TSC >= 30) { if (Rs < 1239) { return 0; } else if (Rs >= 1239) { if (MVDiff < 272) { return 1; } else if (MVDiff >= 272) { return 0; } } } } else if (diffAFD >= 3) { if (gchDC < 63) { if (Cs < 71) { if (MVDiff < 252) { return 0; } else if (MVDiff >= 252) { if (ssDCval < 33) { return 1; } else if (ssDCval >= 33) { return 0; } } } else if (Cs >= 71) { if (diffTSC < 10) { return 0; } else if (diffTSC >= 10) { if (diffRsCsdiff < 48) { return 0; } else if (diffRsCsdiff >= 48) { return 1; } } } } else if (gchDC >= 63) { if (posBalance < 128) { return 0; } else if (posBalance >= 128) { return 1; } } } } else if (negBalance >= 66) { if (SC < 974) { if (diffRsCsdiff < 38) { if (ssDCval < 26) { if (RsCsDiff < 3) { if (gchDC < 84) { return 0; } else if (gchDC >= 84) { if (Rs < 6) { return 1; } else if (Rs >= 6) { return 0; } } } else if (RsCsDiff >= 3) { return 1; } } else if (ssDCval >= 26) { if (posBalance < 59) { if (diffRsCsdiff < -1668) { return 1; } else if (diffRsCsdiff >= -1668) { if (diffMVdiffVal < 99) { if (posBalance < 1) { if (refDCval < 226) { return 0; } else if (refDCval >= 226) { if (diffAFD < -13) { return 0; } else if (diffAFD >= -13) { if (ssDCval < 226) { return 1; } else if (ssDCval >= 226) { return 0; } } } } else if (posBalance >= 1) { if (ssDCval < 36) { if (AFD < 17) { return 0; } else if (AFD >= 17) { if (posBalance < 36) { return 0; } else if (posBalance >= 36) { return 1; } } } else if (ssDCval >= 36) { return 0; } } } else if (diffMVdiffVal >= 99) { if (diffAFD < 7) { if (gchDC < 163) { if (posBalance < 53) { return 0; } else if (posBalance >= 53) { if (SC < 572) { return 0; } else if (SC >= 572) { return 1; } } } else if (gchDC >= 163) { return 1; } } else if (diffAFD >= 7) { if (AFD < 15) { return 1; } else if (AFD >= 15) { if (Rs < 429) { return 0; } else if (Rs >= 429) { return 1; } } } } } } else if (posBalance >= 59) { return 1; } } } else if (diffRsCsdiff >= 38) { if (Rs < 415) { return 1; } else if (Rs >= 415) { if (ssDCval < 38) { return 1; } else if (ssDCval >= 38) { return 0; } } } } else if (SC >= 974) { if (diffTSC < 4) { if (SC < 1443) { if (RsCsDiff < 197) { if (ssDCval < 28) { if (TSC < 11) { return 1; } else if (TSC >= 11) { return 0; } } else if (ssDCval >= 28) { return 0; } } else if (RsCsDiff >= 197) { if (SC < 1428) { return 0; } else if (SC >= 1428) { return 1; } } } else if (SC >= 1443) { return 0; } } else if (diffTSC >= 4) { if (AFD < 58) { return 0; } else if (AFD >= 58) { return 1; } } } } } else if (diffAFD >= 8) { if (MVDiff < 84) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (Cs < 58) { if (RsCsDiff < 2) { if (AFD < 25) { return 0; } else if (AFD >= 25) { return 1; } } else if (RsCsDiff >= 2) { return 1; } } else if (Cs >= 58) { if (CsDiff < 16) { if (diffTSC < 10) { return 0; } else if (diffTSC >= 10) { if (refDCval < 24) { return 1; } else if (refDCval >= 24) { if (diffMVdiffVal < 73) { return 0; } else if (diffMVdiffVal >= 73) { return 1; } } } } else if (CsDiff >= 16) { return 1; } } } } else if (MVDiff >= 84) { if (Cs < 741) { if (diffMVdiffVal < 86) { if (negBalance < 62) { if (MVDiff < 118) { if (gchDC < 18) { return 0; } else if (gchDC >= 18) { if (SC < 573) { if (SC < 411) { return 0; } else if (SC >= 411) { if (Rs < 388) { return 1; } else if (Rs >= 388) { return 0; } } } else if (SC >= 573) { return 0; } } } else if (MVDiff >= 118) { return 0; } } else if (negBalance >= 62) { if (gchDC < 46) { if (gchDC < 6) { if (Cs < 141) { if (AFD < 21) { return 1; } else if (AFD >= 21) { return 0; } } else if (Cs >= 141) { if (MVDiff < 227) { return 1; } else if (MVDiff >= 227) { return 0; } } } else if (gchDC >= 6) { if (ssDCval < 100) { if (MVDiff < 173) { if (refDCval < 53) { return 1; } else if (refDCval >= 53) { return 0; } } else if (MVDiff >= 173) { if (diffTSC < -1) { return 1; } else if (diffTSC >= -1) { if (SC < 925) { if (Rs < 705) { return 0; } else if (Rs >= 705) { return 1; } } else if (SC >= 925) { return 1; } } } } else if (ssDCval >= 100) { return 0; } } } else if (gchDC >= 46) { if (negBalance < 113) { return 0; } else if (negBalance >= 113) { if (diffTSC < 7) { return 1; } else if (diffTSC >= 7) { if (RsCsDiff < 179) { return 0; } else if (RsCsDiff >= 179) { return 1; } } } } } } else if (diffMVdiffVal >= 86) { if (ssDCval < 44) { if (gchDC < 15) { if (posBalance < 97) { if (Rs < 276) { if (diffMVdiffVal < 96) { if (RsCsDiff < 5) { return 0; } else if (RsCsDiff >= 5) { return 1; } } else if (diffMVdiffVal >= 96) { return 1; } } else if (Rs >= 276) { if (Rs < 353) { if (TSC < 6) { return 1; } else if (TSC >= 6) { return 0; } } else if (Rs >= 353) { return 1; } } } else if (posBalance >= 97) { return 0; } } else if (gchDC >= 15) { if (gchDC < 18) { if (diffMVdiffVal < 273) { return 0; } else if (diffMVdiffVal >= 273) { return 1; } } else if (gchDC >= 18) { if (diffMVdiffVal < 287) { if (diffTSC < 4) { if (TSCindex < 9) { return 1; } else if (TSCindex >= 9) { return 0; } } else if (diffTSC >= 4) { return 1; } } else if (diffMVdiffVal >= 287) { if (refDCval < 106) { if (diffRsCsdiff < -5) { return 0; } else if (diffRsCsdiff >= -5) { if (negBalance < 70) { return 0; } else if (negBalance >= 70) { return 1; } } } else if (refDCval >= 106) { return 0; } } } } } else if (ssDCval >= 44) { if (diffTSC < 5) { if (diffRsCsdiff < 37) { return 0; } else if (diffRsCsdiff >= 37) { if (ssDCval < 90) { return 0; } else if (ssDCval >= 90) { return 1; } } } else if (diffTSC >= 5) { if (gchDC < 7) { if (negBalance < 43) { if (diffAFD < 32) { return 1; } else if (diffAFD >= 32) { return 0; } } else if (negBalance >= 43) { return 1; } } else if (gchDC >= 7) { if (AFD < 70) { if (diffRsCsdiff < 16) { if (Scindex < 3) { if (AFD < 49) { if (negBalance < 6) { return 0; } else if (negBalance >= 6) { if (diffRsCsdiff < 4) { if (Rs < 119) { if (RsCsDiff < 1) { return 0; } else if (RsCsDiff >= 1) { if (diffTSC < 9) { if (AFD < 15) { return 1; } else if (AFD >= 15) { if (RsCsDiff < 22) { return 0; } else if (RsCsDiff >= 22) { return 1; } } } else if (diffTSC >= 9) { return 1; } } } else if (Rs >= 119) { if (SC < 211) { return 1; } else if (SC >= 211) { return 0; } } } else if (diffRsCsdiff >= 4) { if (Rs < 260) { if (CsDiff < 3) { return 1; } else if (CsDiff >= 3) { if (MVDiff < 266) { return 1; } else if (MVDiff >= 266) { if (diffAFD < 24) { return 0; } else if (diffAFD >= 24) { return 1; } } } } else if (Rs >= 260) { if (AFD < 18) { return 0; } else if (AFD >= 18) { if (SC < 459) { return 1; } else if (SC >= 459) { return 0; } } } } } } else if (AFD >= 49) { return 0; } } else if (Scindex >= 3) { if (Scindex < 4) { if (TSC < 13) { if (MVDiff < 624) { return 0; } else if (MVDiff >= 624) { return 1; } } else if (TSC >= 13) { return 0; } } else if (Scindex >= 4) { return 1; } } } else if (diffRsCsdiff >= 16) { if (Scindex < 3) { if (diffMVdiffVal < 134) { if (diffAFD < 22) { return 1; } else if (diffAFD >= 22) { return 0; } } else if (diffMVdiffVal >= 134) { return 1; } } else if (Scindex >= 3) { if (SC < 934) { if (gchDC < 107) { if (diffTSC < 8) { return 0; } else if (diffTSC >= 8) { if (diffAFD < 32) { if (refDCval < 48) { if (ssDCval < 67) { return 0; } else if (ssDCval >= 67) { if (TSC < 16) { return 1; } else if (TSC >= 16) { if (SC < 753) { return 1; } else if (SC >= 753) { return 0; } } } } else if (refDCval >= 48) { return 1; } } else if (diffAFD >= 32) { return 1; } } } else if (gchDC >= 107) { return 0; } } else if (SC >= 934) { if (TSC < 26) { if (diffRsCsdiff < 49) { if (posBalance < 90) { if (diffAFD < 21) { return 0; } else if (diffAFD >= 21) { return 1; } } else if (posBalance >= 90) { return 0; } } else if (diffRsCsdiff >= 49) { return 1; } } else if (TSC >= 26) { return 0; } } } } } else if (AFD >= 70) { return 1; } } } } } } else if (Cs >= 741) { if (diffTSC < 20) { return 0; } else if (diffTSC >= 20) { if (gchDC < 24) { return 1; } else if (gchDC >= 24) { if (Cs < 3004) { return 0; } else if (Cs >= 3004) { return 1; } } } } } } } else if (diffRsCsdiff >= 69) { if (diffAFD < 21) { if (ssDCval < 60) { if (MVDiff < 45) { if (diffRsCsdiff < 638) { if (Rs < 1155) { if (Rs < 934) { if (CsDiff < 14) { return 0; } else if (CsDiff >= 14) { return 1; } } else if (Rs >= 934) { return 1; } } else if (Rs >= 1155) { return 0; } } else if (diffRsCsdiff >= 638) { if (TSC < 6) { return 1; } else if (TSC >= 6) { if (diffTSC < 10) { return 0; } else if (diffTSC >= 10) { return 1; } } } } else if (MVDiff >= 45) { if (diffRsCsdiff < 516) { if (diffAFD < 10) { if (SC < 229) { return 1; } else if (SC >= 229) { if (ssDCval < 37) { if (AFD < 28) { return 0; } else if (AFD >= 28) { return 1; } } else if (ssDCval >= 37) { return 0; } } } else if (diffAFD >= 10) { if (CsDiff < 14) { if (Rs < 458) { return 1; } else if (Rs >= 458) { if (diffMVdiffVal < 43) { return 0; } else if (diffMVdiffVal >= 43) { if (gchDC < 18) { if (RsDiff < 6) { return 0; } else if (RsDiff >= 6) { if (posBalance < 65) { return 1; } else if (posBalance >= 65) { if (Rs < 764) { return 1; } else if (Rs >= 764) { return 0; } } } } else if (gchDC >= 18) { return 0; } } } } else if (CsDiff >= 14) { return 1; } } } else if (diffRsCsdiff >= 516) { if (SC < 7396) { return 1; } else if (SC >= 7396) { if (gchDC < 17) { return 1; } else if (gchDC >= 17) { return 0; } } } } } else if (ssDCval >= 60) { if (diffTSC < 9) { if (SC < 1833) { if (AFD < 25) { return 0; } else if (AFD >= 25) { if (gchDC < 4) { if (Cs < 541) { if (RsCsDiff < 254) { if (Cs < 171) { return 0; } else if (Cs >= 171) { return 1; } } else if (RsCsDiff >= 254) { return 1; } } else if (Cs >= 541) { return 0; } } else if (gchDC >= 4) { if (MVDiff < 960) { if (ssDCval < 68) { if (AFD < 28) { return 0; } else if (AFD >= 28) { return 1; } } else if (ssDCval >= 68) { return 0; } } else if (MVDiff >= 960) { return 1; } } } } else if (SC >= 1833) { if (MVDiff < 55) { return 0; } else if (MVDiff >= 55) { if (diffRsCsdiff < 1109) { if (Rs < 1260) { if (AFD < 35) { return 0; } else if (AFD >= 35) { if (diffRsCsdiff < 202) { return 0; } else if (diffRsCsdiff >= 202) { if (RsCsDiff < 735) { return 1; } else if (RsCsDiff >= 735) { return 0; } } } } else if (Rs >= 1260) { return 0; } } else if (diffRsCsdiff >= 1109) { if (Cs < 3730) { if (posBalance < 68) { if (SC < 4691) { return 1; } else if (SC >= 4691) { return 0; } } else if (posBalance >= 68) { return 1; } } else if (Cs >= 3730) { return 0; } } } } } else if (diffTSC >= 9) { if (gchDC < 2) { if (SC < 2786) { return 1; } else if (SC >= 2786) { return 0; } } else if (gchDC >= 2) { if (SC < 1542) { return 1; } else if (SC >= 1542) { if (diffMVdiffVal < 75) { if (AFD < 29) { if (CsDiff < 4) { if (posBalance < 47) { return 1; } else if (posBalance >= 47) { return 0; } } else if (CsDiff >= 4) { return 0; } } else if (AFD >= 29) { if (refDCval < 57) { return 0; } else if (refDCval >= 57) { if (ssDCval < 118) { if (negBalance < 39) { if (refDCval < 59) { return 1; } else if (refDCval >= 59) { return 0; } } else if (negBalance >= 39) { if (TSC < 23) { if (SC < 5898) { return 1; } else if (SC >= 5898) { return 0; } } else if (TSC >= 23) { return 1; } } } else if (ssDCval >= 118) { if (CsDiff < 35) { return 0; } else if (CsDiff >= 35) { if (Cs < 5177) { return 1; } else if (Cs >= 5177) { return 0; } } } } } } else if (diffMVdiffVal >= 75) { if (diffRsCsdiff < 784) { if (RsCsDiff < 769) { if (ssDCval < 87) { if (refDCval < 52) { if (SC < 2181) { return 1; } else if (SC >= 2181) { return 0; } } else if (refDCval >= 52) { if (Cs < 1518) { return 1; } else if (Cs >= 1518) { return 0; } } } else if (ssDCval >= 87) { if (RsCsDiff < 424) { if (diffMVdiffVal < 85) { return 1; } else if (diffMVdiffVal >= 85) { return 0; } } else if (RsCsDiff >= 424) { return 1; } } } else if (RsCsDiff >= 769) { return 0; } } else if (diffRsCsdiff >= 784) { if (diffMVdiffVal < 79) { return 0; } else if (diffMVdiffVal >= 79) { return 1; } } } } } } } } else if (diffAFD >= 21) { if (ssDCval < 78) { if (AFD < 32) { if (TSC < 23) { if (diffMVdiffVal < 62) { if (RsDiff < 16) { if (Cs < 104) { return 1; } else if (Cs >= 104) { if (diffTSC < 15) { return 0; } else if (diffTSC >= 15) { if (Cs < 1148) { return 0; } else if (Cs >= 1148) { return 1; } } } } else if (RsDiff >= 16) { return 1; } } else if (diffMVdiffVal >= 62) { if (AFD < 22) { return 0; } else if (AFD >= 22) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } } } else if (TSC >= 23) { return 0; } } else if (AFD >= 32) { if (ssDCval < 48) { if (RsDiff < 31) { if (AFD < 40) { return 1; } else if (AFD >= 40) { if (gchDC < 23) { return 0; } else if (gchDC >= 23) { return 1; } } } else if (RsDiff >= 31) { if (Rs < 12617) { return 0; } else if (Rs >= 12617) { return 1; } } } else if (ssDCval >= 48) { if (diffMVdiffVal < 10) { if (Rs < 1594) { return 1; } else if (Rs >= 1594) { return 0; } } else if (diffMVdiffVal >= 10) { if (diffAFD < 27) { if (refDCval < 87) { return 1; } else if (refDCval >= 87) { if (AFD < 37) { return 1; } else if (AFD >= 37) { return 0; } } } else if (diffAFD >= 27) { return 1; } } } } } else if (ssDCval >= 78) { if (diffTSC < 13) { if (MVDiff < 107) { return 0; } else if (MVDiff >= 107) { if (TSC < 29) { if (diffMVdiffVal < 107) { if (AFD < 30) { return 1; } else if (AFD >= 30) { if (diffAFD < 30) { return 0; } else if (diffAFD >= 30) { if (ssDCval < 115) { return 1; } else if (ssDCval >= 115) { return 0; } } } } else if (diffMVdiffVal >= 107) { if (Cs < 214) { if (posBalance < 64) { return 0; } else if (posBalance >= 64) { if (Rs < 8) { return 0; } else if (Rs >= 8) { return 1; } } } else if (Cs >= 214) { if (Rs < 3089) { return 1; } else if (Rs >= 3089) { if (Cs < 3240) { return 0; } else if (Cs >= 3240) { return 1; } } } } } else if (TSC >= 29) { return 0; } } } else if (diffTSC >= 13) { if (diffMVdiffVal < 57) { if (AFD < 56) { if (ssDCval < 104) { if (diffRsCsdiff < 275) { return 0; } else if (diffRsCsdiff >= 275) { return 1; } } else if (ssDCval >= 104) { if (RsCsDiff < 6215) { if (gchDC < 8) { if (negBalance < 48) { if (refDCval < 126) { return 0; } else if (refDCval >= 126) { return 1; } } else if (negBalance >= 48) { return 0; } } else if (gchDC >= 8) { return 0; } } else if (RsCsDiff >= 6215) { if (CsDiff < 56) { return 1; } else if (CsDiff >= 56) { return 0; } } } } else if (AFD >= 56) { if (posBalance < 96) { return 1; } else if (posBalance >= 96) { if (Rs < 984) { return 1; } else if (Rs >= 984) { return 0; } } } } else if (diffMVdiffVal >= 57) { if (diffRsCsdiff < 351) { if (negBalance < 4) { if (AFD < 53) { return 0; } else if (AFD >= 53) { return 1; } } else if (negBalance >= 4) { if (posBalance < 95) { if (SC < 3173) { if (diffMVdiffVal < 413) { return 1; } else if (diffMVdiffVal >= 413) { if (negBalance < 53) { if (posBalance < 77) { return 0; } else if (posBalance >= 77) { return 1; } } else if (negBalance >= 53) { return 1; } } } else if (SC >= 3173) { return 0; } } else if (posBalance >= 95) { if (posBalance < 97) { return 0; } else if (posBalance >= 97) { if (diffRsCsdiff < 158) { if (SC < 1534) { return 1; } else if (SC >= 1534) { if (RsCsDiff < 213) { return 0; } else if (RsCsDiff >= 213) { return 1; } } } else if (diffRsCsdiff >= 158) { return 1; } } } } } else if (diffRsCsdiff >= 351) { if (diffTSC < 17) { if (negBalance < 39) { if (Rs < 2166) { return 1; } else if (Rs >= 2166) { return 0; } } else if (negBalance >= 39) { return 1; } } else if (diffTSC >= 17) { if (posBalance < 125) { if (diffRsCsdiff < 10398) { return 1; } else if (diffRsCsdiff >= 10398) { if (CsDiff < 69) { return 0; } else if (CsDiff >= 69) { return 1; } } } else if (posBalance >= 125) { if (Cs < 844) { return 1; } else if (Cs >= 844) { return 0; } } } } } } } } } return 0; } bool SCDetect15(mfxU32 MVDiff, mfxU32 RsCsDiff, mfxU32 Rs, mfxU32 gchDC, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 refDCval, mfxU32 TSC, mfxI32 diffAFD, mfxU32 posBalance, mfxU32 Cs, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 AFD, mfxU32 SC, mfxU32 RsDiff, mfxI32 diffRsCsdiff, mfxU32 negBalance, mfxU32 ssDCval, mfxI32 diffMVdiffVal) { if (Cs < 1116) { if (diffMVdiffVal < 65) { if (diffRsCsdiff < 64) { if (diffTSC < 5) { if (posBalance < 2) { if (diffRsCsdiff < 5) { if (RsCsDiff < 11) { if (refDCval < 229) { return 0; } else if (refDCval >= 229) { if (TSC < 3) { return 0; } else if (TSC >= 3) { return 1; } } } else if (RsCsDiff >= 11) { if (MVDiff < 11) { if (MVDiff < 3) { return 0; } else if (MVDiff >= 3) { return 1; } } else if (MVDiff >= 11) { return 0; } } } else if (diffRsCsdiff >= 5) { if (ssDCval < 20) { if (Rs < 687) { return 1; } else if (Rs >= 687) { if (SC < 1728) { return 0; } else if (SC >= 1728) { return 1; } } } else if (ssDCval >= 20) { return 0; } } } else if (posBalance >= 2) { if (gchDC < 18) { if (MVDiff < 145) { return 0; } else if (MVDiff >= 145) { if (refDCval < 51) { if (diffAFD < 8) { if (TSC < 14) { if (MVDiff < 1538) { return 0; } else if (MVDiff >= 1538) { if (Cs < 137) { return 1; } else if (Cs >= 137) { return 0; } } } else if (TSC >= 14) { if (negBalance < 53) { return 0; } else if (negBalance >= 53) { return 1; } } } else if (diffAFD >= 8) { if (Cs < 79) { return 1; } else if (Cs >= 79) { return 0; } } } else if (refDCval >= 51) { return 0; } } } else if (gchDC >= 18) { if (Scindex < 1) { if (gchDC < 20) { return 1; } else if (gchDC >= 20) { if (AFD < 4) { return 1; } else if (AFD >= 4) { return 0; } } } else if (Scindex >= 1) { if (Rs < 116) { if (Rs < 111) { return 0; } else if (Rs >= 111) { return 1; } } else if (Rs >= 116) { return 0; } } } } } else if (diffTSC >= 5) { if (SC < 993) { if (ssDCval < 47) { if (SC < 826) { if (diffMVdiffVal < 5) { if (RsCsDiff < 63) { if (diffAFD < -6) { return 1; } else if (diffAFD >= -6) { if (negBalance < 46) { return 0; } else if (negBalance >= 46) { return 1; } } } else if (RsCsDiff >= 63) { return 1; } } else if (diffMVdiffVal >= 5) { return 0; } } else if (SC >= 826) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { return 1; } } } else if (ssDCval >= 47) { if (refDCval < 25) { if (AFD < 42) { return 1; } else if (AFD >= 42) { return 0; } } else if (refDCval >= 25) { if (RsCsDiff < 18) { if (gchDC < 46) { if (diffRsCsdiff < 8) { return 0; } else if (diffRsCsdiff >= 8) { if (diffMVdiffVal < 40) { return 0; } else if (diffMVdiffVal >= 40) { if (AFD < 31) { return 1; } else if (AFD >= 31) { return 0; } } } } else if (gchDC >= 46) { if (SC < 239) { if (Cs < 32) { return 0; } else if (Cs >= 32) { return 1; } } else if (SC >= 239) { return 0; } } } else if (RsCsDiff >= 18) { if (AFD < 58) { if (diffMVdiffVal < 54) { if (diffAFD < 18) { return 0; } else if (diffAFD >= 18) { if (refDCval < 60) { return 0; } else if (refDCval >= 60) { if (TSC < 11) { return 0; } else if (TSC >= 11) { if (SC < 921) { if (Cs < 244) { return 1; } else if (Cs >= 244) { if (diffMVdiffVal < -1) { return 0; } else if (diffMVdiffVal >= -1) { return 1; } } } else if (SC >= 921) { return 0; } } } } } else if (diffMVdiffVal >= 54) { if (Rs < 155) { return 0; } else if (Rs >= 155) { return 1; } } } else if (AFD >= 58) { return 1; } } } } } else if (SC >= 993) { if (RsCsDiff < 108) { return 0; } else if (RsCsDiff >= 108) { if (SC < 1355) { if (SC < 1268) { return 0; } else if (SC >= 1268) { return 1; } } else if (SC >= 1355) { return 0; } } } } } else if (diffRsCsdiff >= 64) { if (SC < 1424) { if (AFD < 31) { if (CsDiff < 12) { return 0; } else if (CsDiff >= 12) { if (MVDiff < 43) { return 1; } else if (MVDiff >= 43) { if (gchDC < 4) { return 1; } else if (gchDC >= 4) { return 0; } } } } else if (AFD >= 31) { if (ssDCval < 93) { if (negBalance < 89) { return 1; } else if (negBalance >= 89) { if (Rs < 156) { return 1; } else if (Rs >= 156) { return 0; } } } else if (ssDCval >= 93) { return 0; } } } else if (SC >= 1424) { if (diffAFD < 13) { if (Rs < 1024) { if (diffTSC < 6) { return 0; } else if (diffTSC >= 6) { if (CsDiff < 6) { return 0; } else if (CsDiff >= 6) { return 1; } } } else if (Rs >= 1024) { return 0; } } else if (diffAFD >= 13) { if (diffTSC < 9) { if (CsDiff < 3) { return 1; } else if (CsDiff >= 3) { if (refDCval < 40) { return 1; } else if (refDCval >= 40) { return 0; } } } else if (diffTSC >= 9) { if (Rs < 1069) { return 0; } else if (Rs >= 1069) { if (gchDC < 17) { if (RsCsDiff < 164) { if (Cs < 692) { return 1; } else if (Cs >= 692) { return 0; } } else if (RsCsDiff >= 164) { return 1; } } else if (gchDC >= 17) { if (AFD < 48) { if (gchDC < 53) { return 0; } else if (gchDC >= 53) { if (Rs < 1398) { return 1; } else if (Rs >= 1398) { return 0; } } } else if (AFD >= 48) { return 1; } } } } } } } } else if (diffMVdiffVal >= 65) { if (diffAFD < 10) { if (ssDCval < 41) { if (diffRsCsdiff < 2) { if (diffMVdiffVal < 105) { return 0; } else if (diffMVdiffVal >= 105) { if (TSCindex < 4) { return 0; } else if (TSCindex >= 4) { if (RsCsDiff < 48) { if (Rs < 101) { if (gchDC < 62) { if (SC < 91) { if (diffAFD < 8) { if (negBalance < 38) { if (MVDiff < 405) { return 0; } else if (MVDiff >= 405) { if (AFD < 9) { return 0; } else if (AFD >= 9) { return 1; } } } else if (negBalance >= 38) { return 0; } } else if (diffAFD >= 8) { return 1; } } else if (SC >= 91) { if (SC < 193) { return 1; } else if (SC >= 193) { if (TSC < 9) { return 0; } else if (TSC >= 9) { return 1; } } } } else if (gchDC >= 62) { if (Cs < 9) { return 1; } else if (Cs >= 9) { return 0; } } } else if (Rs >= 101) { return 0; } } else if (RsCsDiff >= 48) { return 1; } } } } else if (diffRsCsdiff >= 2) { if (negBalance < 77) { if (diffAFD < 7) { if (Rs < 59) { return 0; } else if (Rs >= 59) { if (CsDiff < 6) { if (ssDCval < 38) { if (posBalance < 39) { if (Rs < 371) { return 0; } else if (Rs >= 371) { return 1; } } else if (posBalance >= 39) { return 1; } } else if (ssDCval >= 38) { return 0; } } else if (CsDiff >= 6) { if (diffAFD < 5) { return 0; } else if (diffAFD >= 5) { return 1; } } } } else if (diffAFD >= 7) { return 1; } } else if (negBalance >= 77) { if (diffTSC < 3) { if (RsDiff < 9) { return 0; } else if (RsDiff >= 9) { if (TSC < 18) { return 0; } else if (TSC >= 18) { return 1; } } } else if (diffTSC >= 3) { if (ssDCval < 30) { return 1; } else if (ssDCval >= 30) { return 0; } } } } } else if (ssDCval >= 41) { if (TSC < 11) { if (gchDC < 132) { if (negBalance < 30) { if (TSC < 9) { return 0; } else if (TSC >= 9) { if (diffMVdiffVal < 104) { if (gchDC < 8) { return 1; } else if (gchDC >= 8) { return 0; } } else if (diffMVdiffVal >= 104) { return 0; } } } else if (negBalance >= 30) { return 0; } } else if (gchDC >= 132) { return 1; } } else if (TSC >= 11) { if (diffRsCsdiff < 57) { if (refDCval < 42) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { return 1; } } else if (refDCval >= 42) { if (Rs < 4) { if (diffAFD < -2) { return 0; } else if (diffAFD >= -2) { return 1; } } else if (Rs >= 4) { if (Cs < 526) { return 0; } else if (Cs >= 526) { if (TSC < 19) { return 0; } else if (TSC >= 19) { if (Cs < 555) { return 1; } else if (Cs >= 555) { return 0; } } } } } } else if (diffRsCsdiff >= 57) { if (diffRsCsdiff < 106) { if (diffAFD < 6) { return 0; } else if (diffAFD >= 6) { if (ssDCval < 63) { if (Rs < 575) { return 1; } else if (Rs >= 575) { return 0; } } else if (ssDCval >= 63) { return 1; } } } else if (diffRsCsdiff >= 106) { return 0; } } } } } else if (diffAFD >= 10) { if (CsDiff < 7) { if (gchDC < 15) { if (diffTSC < 5) { if (ssDCval < 41) { return 1; } else if (ssDCval >= 41) { if (posBalance < 75) { return 0; } else if (posBalance >= 75) { if (Cs < 418) { return 0; } else if (Cs >= 418) { return 1; } } } } else if (diffTSC >= 5) { if (Rs < 230) { if (diffRsCsdiff < -1) { return 0; } else if (diffRsCsdiff >= -1) { if (posBalance < 101) { if (diffRsCsdiff < 3) { if (Scindex < 2) { return 1; } else if (Scindex >= 2) { if (gchDC < 10) { return 1; } else if (gchDC >= 10) { return 0; } } } else if (diffRsCsdiff >= 3) { return 1; } } else if (posBalance >= 101) { return 0; } } } else if (Rs >= 230) { if (diffMVdiffVal < 73) { if (RsCsDiff < 24) { return 1; } else if (RsCsDiff >= 24) { return 0; } } else if (diffMVdiffVal >= 73) { if (gchDC < 5) { return 1; } else if (gchDC >= 5) { if (diffRsCsdiff < 34) { if (SC < 608) { return 0; } else if (SC >= 608) { if (diffTSC < 7) { return 0; } else if (diffTSC >= 7) { if (Cs < 463) { if (AFD < 17) { return 0; } else if (AFD >= 17) { return 1; } } else if (Cs >= 463) { return 0; } } } } else if (diffRsCsdiff >= 34) { if (diffTSC < 6) { if (Cs < 193) { return 1; } else if (Cs >= 193) { if (Rs < 366) { return 1; } else if (Rs >= 366) { return 0; } } } else if (diffTSC >= 6) { return 1; } } } } } } } else if (gchDC >= 15) { if (negBalance < 56) { if (ssDCval < 86) { if (diffAFD < 24) { if (SC < 149) { return 1; } else if (SC >= 149) { if (CsDiff < 4) { return 0; } else if (CsDiff >= 4) { if (posBalance < 93) { return 0; } else if (posBalance >= 93) { if (refDCval < 31) { return 1; } else if (refDCval >= 31) { if (AFD < 23) { return 0; } else if (AFD >= 23) { if (CsDiff < 5) { return 1; } else if (CsDiff >= 5) { if (Cs < 335) { return 1; } else if (Cs >= 335) { return 0; } } } } } } } } else if (diffAFD >= 24) { if (TSC < 33) { if (gchDC < 18) { return 1; } else if (gchDC >= 18) { if (CsDiff < 2) { return 0; } else if (CsDiff >= 2) { if (diffAFD < 28) { if (Cs < 216) { return 1; } else if (Cs >= 216) { return 0; } } else if (diffAFD >= 28) { if (refDCval < 32) { return 0; } else if (refDCval >= 32) { return 1; } } } } } else if (TSC >= 33) { return 0; } } } else if (ssDCval >= 86) { if (diffRsCsdiff < 21) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (RsCsDiff < 25) { if (negBalance < 19) { if (RsCsDiff < 5) { return 0; } else if (RsCsDiff >= 5) { if (ssDCval < 144) { if (Cs < 293) { return 1; } else if (Cs >= 293) { return 0; } } else if (ssDCval >= 144) { if (diffTSC < 10) { return 1; } else if (diffTSC >= 10) { return 0; } } } } else if (negBalance >= 19) { return 1; } } else if (RsCsDiff >= 25) { return 0; } } } else if (diffRsCsdiff >= 21) { if (posBalance < 121) { if (RsCsDiff < 217) { if (SC < 1010) { return 1; } else if (SC >= 1010) { if (RsCsDiff < 53) { return 0; } else if (RsCsDiff >= 53) { if (diffAFD < 26) { return 0; } else if (diffAFD >= 26) { return 1; } } } } else if (RsCsDiff >= 217) { if (CsDiff < 5) { return 1; } else if (CsDiff >= 5) { if (negBalance < 29) { if (RsCsDiff < 361) { return 1; } else if (RsCsDiff >= 361) { return 0; } } else if (negBalance >= 29) { return 0; } } } } else if (posBalance >= 121) { if (posBalance < 128) { if (AFD < 59) { return 0; } else if (AFD >= 59) { return 1; } } else if (posBalance >= 128) { return 1; } } } } } else if (negBalance >= 56) { if (diffRsCsdiff < 4) { if (refDCval < 203) { if (Cs < 1) { return 1; } else if (Cs >= 1) { if (diffAFD < 16) { return 0; } else if (diffAFD >= 16) { if (TSC < 24) { if (SC < 33) { return 0; } else if (SC >= 33) { if (Cs < 208) { return 1; } else if (Cs >= 208) { return 0; } } } else if (TSC >= 24) { return 0; } } } } else if (refDCval >= 203) { return 0; } } else if (diffRsCsdiff >= 4) { if (diffAFD < 17) { if (TSC < 24) { if (negBalance < 98) { if (diffAFD < 11) { return 1; } else if (diffAFD >= 11) { return 0; } } else if (negBalance >= 98) { if (gchDC < 20) { return 0; } else if (gchDC >= 20) { return 1; } } } else if (TSC >= 24) { return 0; } } else if (diffAFD >= 17) { if (ssDCval < 84) { if (CsDiff < 4) { if (AFD < 41) { return 1; } else if (AFD >= 41) { if (ssDCval < 63) { return 0; } else if (ssDCval >= 63) { return 1; } } } else if (CsDiff >= 4) { return 1; } } else if (ssDCval >= 84) { if (diffAFD < 26) { if (Cs < 232) { return 1; } else if (Cs >= 232) { return 0; } } else if (diffAFD >= 26) { if (diffMVdiffVal < 121) { return 0; } else if (diffMVdiffVal >= 121) { return 1; } } } } } } } } else if (CsDiff >= 7) { if (diffAFD < 20) { if (ssDCval < 63) { if (negBalance < 47) { if (diffMVdiffVal < 100) { if (CsDiff < 11) { return 0; } else if (CsDiff >= 11) { return 1; } } else if (diffMVdiffVal >= 100) { return 1; } } else if (negBalance >= 47) { return 1; } } else if (ssDCval >= 63) { if (diffMVdiffVal < 95) { return 0; } else if (diffMVdiffVal >= 95) { if (ssDCval < 148) { if (diffMVdiffVal < 106) { return 1; } else if (diffMVdiffVal >= 106) { if (refDCval < 74) { if (gchDC < 17) { return 1; } else if (gchDC >= 17) { return 0; } } else if (refDCval >= 74) { return 0; } } } else if (ssDCval >= 148) { return 1; } } } } else if (diffAFD >= 20) { if (negBalance < 5) { if (AFD < 63) { if (gchDC < 139) { return 0; } else if (gchDC >= 139) { return 1; } } else if (AFD >= 63) { return 1; } } else if (negBalance >= 5) { if (diffAFD < 29) { if (TSC < 23) { if (CsDiff < 8) { if (diffMVdiffVal < 80) { return 0; } else if (diffMVdiffVal >= 80) { return 1; } } else if (CsDiff >= 8) { return 1; } } else if (TSC >= 23) { if (diffRsCsdiff < 112) { return 0; } else if (diffRsCsdiff >= 112) { if (posBalance < 29) { return 0; } else if (posBalance >= 29) { return 1; } } } } else if (diffAFD >= 29) { if (MVDiff < 646) { return 1; } else if (MVDiff >= 646) { if (posBalance < 69) { return 1; } else if (posBalance >= 69) { if (refDCval < 133) { if (RsDiff < 5) { return 0; } else if (RsDiff >= 5) { return 1; } } else if (refDCval >= 133) { return 0; } } } } } } } } } } else if (Cs >= 1116) { if (diffTSC < 12) { if (MVDiff < 69) { if (refDCval < 44) { if (RsCsDiff < 649) { if (diffAFD < 3) { return 0; } else if (diffAFD >= 3) { if (ssDCval < 25) { return 1; } else if (ssDCval >= 25) { return 0; } } } else if (RsCsDiff >= 649) { if (TSC < 12) { return 1; } else if (TSC >= 12) { return 0; } } } else if (refDCval >= 44) { if (RsDiff < 37) { return 0; } else if (RsDiff >= 37) { if (SC < 3914) { if (AFD < 9) { return 1; } else if (AFD >= 9) { if (SC < 3568) { return 0; } else if (SC >= 3568) { return 1; } } } else if (SC >= 3914) { return 0; } } } } else if (MVDiff >= 69) { if (diffRsCsdiff < 253) { if (TSC < 31) { if (diffTSC < 9) { return 0; } else if (diffTSC >= 9) { if (negBalance < 52) { return 0; } else if (negBalance >= 52) { if (RsCsDiff < 203) { return 1; } else if (RsCsDiff >= 203) { if (SC < 2364) { return 1; } else if (SC >= 2364) { return 0; } } } } } else if (TSC >= 31) { if (refDCval < 111) { return 1; } else if (refDCval >= 111) { return 0; } } } else if (diffRsCsdiff >= 253) { if (ssDCval < 49) { if (Cs < 4226) { if (TSCindex < 9) { if (Cs < 2441) { return 0; } else if (Cs >= 2441) { return 1; } } else if (TSCindex >= 9) { return 1; } } else if (Cs >= 4226) { return 0; } } else if (ssDCval >= 49) { if (MVDiff < 424) { if (RsDiff < 37) { if (TSC < 21) { if (ssDCval < 51) { if (Rs < 1511) { return 1; } else if (Rs >= 1511) { return 0; } } else if (ssDCval >= 51) { return 0; } } else if (TSC >= 21) { if (diffRsCsdiff < 812) { if (ssDCval < 79) { if (SC < 4402) { return 1; } else if (SC >= 4402) { return 0; } } else if (ssDCval >= 79) { return 0; } } else if (diffRsCsdiff >= 812) { return 1; } } } else if (RsDiff >= 37) { if (diffMVdiffVal < 53) { return 0; } else if (diffMVdiffVal >= 53) { if (AFD < 49) { if (Scindex < 7) { if (diffAFD < 14) { if (SC < 7881) { return 1; } else if (SC >= 7881) { return 0; } } else if (diffAFD >= 14) { return 1; } } else if (Scindex >= 7) { if (RsDiff < 64) { return 1; } else if (RsDiff >= 64) { return 0; } } } else if (AFD >= 49) { return 0; } } } } else if (MVDiff >= 424) { if (diffAFD < 5) { return 0; } else if (diffAFD >= 5) { return 1; } } } } } } else if (diffTSC >= 12) { if (diffAFD < 25) { if (diffMVdiffVal < 65) { if (RsDiff < 61) { if (AFD < 61) { if (diffTSC < 25) { if (diffRsCsdiff < 408) { return 0; } else if (diffRsCsdiff >= 408) { if (MVDiff < 46) { if (Rs < 2319) { return 1; } else if (Rs >= 2319) { return 0; } } else if (MVDiff >= 46) { if (MVDiff < 75) { return 1; } else if (MVDiff >= 75) { return 0; } } } } else if (diffTSC >= 25) { return 1; } } else if (AFD >= 61) { return 1; } } else if (RsDiff >= 61) { return 1; } } else if (diffMVdiffVal >= 65) { if (SC < 9051) { if (gchDC < 14) { return 1; } else if (gchDC >= 14) { if (diffMVdiffVal < 223) { if (diffTSC < 16) { return 0; } else if (diffTSC >= 16) { if (posBalance < 81) { return 1; } else if (posBalance >= 81) { if (Cs < 2675) { return 0; } else if (Cs >= 2675) { return 1; } } } } else if (diffMVdiffVal >= 223) { return 1; } } } else if (SC >= 9051) { return 0; } } } else if (diffAFD >= 25) { if (negBalance < 27) { if (diffTSC < 27) { if (negBalance < 8) { return 0; } else if (negBalance >= 8) { if (Rs < 2012) { if (diffRsCsdiff < 195) { return 0; } else if (diffRsCsdiff >= 195) { return 1; } } else if (Rs >= 2012) { if (ssDCval < 77) { return 1; } else if (ssDCval >= 77) { return 0; } } } } else if (diffTSC >= 27) { if (AFD < 69) { if (negBalance < 1) { if (diffAFD < 35) { return 1; } else if (diffAFD >= 35) { return 0; } } else if (negBalance >= 1) { if (diffTSC < 33) { if (Cs < 2054) { return 1; } else if (Cs >= 2054) { return 0; } } else if (diffTSC >= 33) { return 1; } } } else if (AFD >= 69) { return 0; } } } else if (negBalance >= 27) { if (diffMVdiffVal < 55) { if (MVDiff < 47) { return 0; } else if (MVDiff >= 47) { if (negBalance < 57) { return 1; } else if (negBalance >= 57) { if (Rs < 1308) { return 1; } else if (Rs >= 1308) { return 0; } } } } else if (diffMVdiffVal >= 55) { if (RsCsDiff < 131) { return 0; } else if (RsCsDiff >= 131) { if (SC < 6645) { return 1; } else if (SC >= 6645) { if (negBalance < 121) { if (MVDiff < 75) { if (RsCsDiff < 8537) { return 1; } else if (RsCsDiff >= 8537) { return 0; } } else if (MVDiff >= 75) { return 1; } } else if (negBalance >= 121) { return 0; } } } } } } } } return 0; } bool SCDetectRF( mfxI32 diffMVdiffVal, mfxU32 RsCsDiff, mfxU32 MVDiff, mfxU32 Rs, mfxU32 AFD, mfxU32 CsDiff, mfxI32 diffTSC, mfxU32 TSC, mfxU32 gchDC, mfxI32 diffRsCsdiff, mfxU32 posBalance, mfxU32 SC, mfxU32 TSCindex, mfxU32 Scindex, mfxU32 Cs, mfxI32 diffAFD, mfxU32 negBalance, mfxU32 ssDCval, mfxU32 refDCval, mfxU32 RsDiff, mfxU8 control) { mfxU8 sum = 0; sum += SCDetect1(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect2(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect3(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect4(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect5(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect6(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect7(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect8(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect9(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectA(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectB(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectC(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectD(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectE(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetectF(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect10(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect11(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect12(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect13(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect14(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); sum += SCDetect15(MVDiff, RsCsDiff, Rs, gchDC, CsDiff, diffTSC, refDCval, TSC, diffAFD, posBalance, Cs, TSCindex, Scindex, AFD, SC, RsDiff, diffRsCsdiff, negBalance, ssDCval, diffMVdiffVal); return(sum > RF_DECISION_LEVEL + control); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/000077500000000000000000000000001443134507600240315ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/CMakeLists.txt000066400000000000000000000030211443134507600265650ustar00rootroot00000000000000# Copyright (c) 2022 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set(sources include/mfxenctools-int.h include/mfx_enctools_loader.h include/mfx_ienctools.h include/mfx_enctools_stub.h include/mfx_loader_utils.h src/mfx_enctools.cpp src/mfx_enctools_loader.cpp ) add_library(enctools_base STATIC ${sources}) target_include_directories(enctools_base PUBLIC include ) target_link_libraries(enctools_base PRIVATE mfx_static_lib umc ) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/000077500000000000000000000000001443134507600254545ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/mfx_enctools_loader.h000066400000000000000000000026751443134507600316650ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXENCTOOLS_LOADER_H__ #define __MFXENCTOOLS_LOADER_H__ #include "mfx_common.h" #include "mfxenctools-int.h" class mfxEncToolsLoader { public: mfxEncToolsLoader() {}; ~mfxEncToolsLoader() {}; static void* LoadEncToolsLib(); static mfxStatus UnLoadEncToolsLib(void** hModule); }; void* MFXNewEncTools(void* hModule); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/mfx_enctools_stub.h000066400000000000000000000052651443134507600313720ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_ENCTOOLS_STUB_H__ #define __MFX_ENCTOOLS_STUB_H__ #include "mfxcommon.h" #include "mfx_ienctools.h" class EncToolsStub : public IEncTools { public: EncToolsStub() {} virtual ~EncToolsStub() { } virtual mfxStatus Init(mfxExtEncToolsConfig const* pEncToolConfig, mfxEncToolsCtrl const* ctrl) { (void*)pEncToolConfig; (void*)ctrl; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus GetSupportedConfig(mfxExtEncToolsConfig* pConfig, mfxEncToolsCtrl const* ctrl) { (void*)pConfig; (void*)ctrl; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus GetActiveConfig(mfxExtEncToolsConfig* pConfig) { (void*)pConfig; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus GetDelayInFrames(mfxExtEncToolsConfig const* pConfig, mfxEncToolsCtrl const* ctrl, mfxU32* numFrames) { (void*)pConfig; (void*)ctrl; (void*)numFrames; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus Reset(mfxExtEncToolsConfig const* pEncToolConfig, mfxEncToolsCtrl const* ctrl) { (void*)pEncToolConfig; (void*)ctrl; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus Close() { return MFX_ERR_NOT_IMPLEMENTED;}; virtual mfxStatus Submit(mfxEncToolsTaskParam const* par) { (void*)par; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus Query(mfxEncToolsTaskParam* par, mfxU32 timeOut) { (void*)par; (void)timeOut; return MFX_ERR_NOT_IMPLEMENTED; } virtual mfxStatus Discard(mfxU32 displayOrder) { (void)displayOrder; return MFX_ERR_NOT_IMPLEMENTED; } }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/mfx_ienctools.h000066400000000000000000000103451443134507600305010ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_IENCTOOLS_H__ #define __MFX_IENCTOOLS_H__ #include "mfxcommon.h" #include "mfxenctools-int.h" class IEncTools { public: virtual ~IEncTools() {}; virtual mfxStatus Init(mfxExtEncToolsConfig const* pEncToolConfig, mfxEncToolsCtrl const* ctrl) = 0; virtual mfxStatus GetSupportedConfig(mfxExtEncToolsConfig* pConfig, mfxEncToolsCtrl const* ctrl) = 0; virtual mfxStatus GetActiveConfig(mfxExtEncToolsConfig* pConfig) = 0; virtual mfxStatus GetDelayInFrames(mfxExtEncToolsConfig const* pConfig, mfxEncToolsCtrl const* ctrl, mfxU32* numFrames) = 0; virtual mfxStatus Reset(mfxExtEncToolsConfig const* pEncToolConfig, mfxEncToolsCtrl const* ctrl) = 0; virtual mfxStatus Close() = 0; virtual mfxStatus Submit(mfxEncToolsTaskParam const* par) = 0; virtual mfxStatus Query(mfxEncToolsTaskParam* par, mfxU32 timeOut) = 0; virtual mfxStatus Discard(mfxU32 displayOrder) = 0; void* m_etModule = nullptr; }; namespace EncToolsFuncs { inline mfxStatus Init(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Init(config, ctrl); } inline mfxStatus GetSupportedConfig(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->GetSupportedConfig(config, ctrl); } inline mfxStatus GetActiveConfig(mfxHDL pthis, mfxExtEncToolsConfig* config) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->GetActiveConfig(config); } inline mfxStatus Reset(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Reset(config, ctrl); } inline mfxStatus Close(mfxHDL pthis) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Close(); } // Submit info to tool inline mfxStatus Submit(mfxHDL pthis, mfxEncToolsTaskParam* submitParam) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Submit(submitParam); } // Query info from tool inline mfxStatus Query(mfxHDL pthis, mfxEncToolsTaskParam* queryParam, mfxU32 timeOut) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Query(queryParam, timeOut); } // Query info from tool inline mfxStatus Discard(mfxHDL pthis, mfxU32 displayOrder) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->Discard(displayOrder); } inline mfxStatus GetDelayInFrames(mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl, mfxU32 *numFrames) { if (!pthis) { return MFX_ERR_NULL_PTR; } return ((IEncTools*)pthis)->GetDelayInFrames(config, ctrl, numFrames); } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/mfx_loader_utils.h000066400000000000000000000045011443134507600311650ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_LOADER_UTILS_H__ #define __MFX_LOADER_UTILS_H__ #include "mfx_config.h" #include #include #include inline std::string GetSelfModuleFullPath() { Dl_info dl_info; dladdr((void*)GetSelfModuleFullPath, &dl_info); return std::string(dl_info.dli_fname); } inline std::string GenerateEnctoolPath(const char* fileName) { std::string wdir; std::string path = GetSelfModuleFullPath(); wdir = path.substr(0, path.find_last_of('/') + 1); wdir += "libmfx-gen/"; // enctools.so are inside dir "libmfx-gen" in the path of RT in linux std::string fileNameStr(fileName); std::string enctoolPath = wdir + fileNameStr; return enctoolPath; } inline void* LoadModule(const char* modulePath) { void* hModule = nullptr; hModule = dlopen(modulePath, RTLD_LAZY); return hModule; } inline void UnLoadModule(void* hModule) { if (hModule) { dlclose(hModule); } } inline void* LoadDependency(const char* dependencyFileName) { std::string dllPath = GenerateEnctoolPath(dependencyFileName); return LoadModule(dllPath.c_str()); } inline void* GetModuleFuncAddress(void* hModule, const char* funcName) { return dlsym(hModule, funcName); } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/include/mfxenctools-int.h000066400000000000000000000437511443134507600307700ustar00rootroot00000000000000/******************************************************************************* *\ Copyright (C) 2019-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfxenctools-int.h *******************************************************************************/ #ifndef __MFXENCTOOLS_INT_H__ #define __MFXENCTOOLS_INT_H__ #include "mfx_config.h" #include "mfxbrc.h" #include "mfxenctools.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Extended Buffer Ids */ enum { MFX_EXTBUFF_ENCTOOLS = MFX_MAKEFOURCC('E', 'E', 'T', 'L'), MFX_EXTBUFF_ENCTOOLS_DEVICE = MFX_MAKEFOURCC('E', 'T', 'E', 'D'), MFX_EXTBUFF_ENCTOOLS_ALLOCATOR = MFX_MAKEFOURCC('E', 'T', 'E', 'A'), MFX_EXTBUFF_ENCTOOLS_FRAME_TO_ANALYZE = MFX_MAKEFOURCC('E', 'F', 'T', 'A'), MFX_EXTBUFF_ENCTOOLS_HINT_SCENE_CHANGE = MFX_MAKEFOURCC('E', 'H', 'S', 'C'), MFX_EXTBUFF_ENCTOOLS_HINT_GOP = MFX_MAKEFOURCC('E', 'H', 'G', 'O'), MFX_EXTBUFF_ENCTOOLS_HINT_AREF = MFX_MAKEFOURCC('E', 'H', 'A', 'R'), MFX_EXTBUFF_ENCTOOLS_BRC_BUFFER_HINT = MFX_MAKEFOURCC('E', 'B', 'B', 'H'), MFX_EXTBUFF_ENCTOOLS_BRC_FRAME_PARAM = MFX_MAKEFOURCC('E', 'B', 'F', 'P'), MFX_EXTBUFF_ENCTOOLS_BRC_QUANT_CONTROL = MFX_MAKEFOURCC('E', 'B', 'Q', 'C'), MFX_EXTBUFF_ENCTOOLS_BRC_HRD_POS = MFX_MAKEFOURCC('E', 'B', 'H', 'P'), MFX_EXTBUFF_ENCTOOLS_BRC_ENCODE_RESULT = MFX_MAKEFOURCC('E', 'B', 'E', 'R'), MFX_EXTBUFF_ENCTOOLS_BRC_STATUS = MFX_MAKEFOURCC('E', 'B', 'S', 'T'), MFX_EXTBUFF_ENCTOOLS_HINT_MATRIX = MFX_MAKEFOURCC('E', 'H', 'Q', 'M'), MFX_EXTBUFF_ENCTOOLS_HINT_QPMAP = MFX_MAKEFOURCC('E', 'H', 'Q', 'P'), MFX_EXTBUFF_ENCTOOLS_HINT_SALIENCY_MAP = MFX_MAKEFOURCC('E', 'H', 'S', 'M') }; enum { MFX_BRC_NO_HRD = 0, MFX_BRC_HRD_WEAK, /* IF HRD CALCULATION IS REQUIRED, BUT NOT WRITTEN TO THE STREAM */ MFX_BRC_HRD_STRONG, }; MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxStructVersion Version; mfxU8 GopOptFlag; mfxU8 reserved8b; mfxU16 AsyncDepth; mfxU16 reserved[1]; /* info about codec */ struct /* coding info*/ { mfxU32 CodecId; mfxU16 CodecProfile; mfxU16 CodecLevel; mfxU16 LowPower; mfxU16 reserved2[63]; }; struct /* input frames info */ { /* info about input frames */ mfxFrameInfo FrameInfo; mfxU16 IOPattern; mfxU16 MaxDelayInFrames; mfxU16 reserved3[64]; }; struct { /* Gop limitations */ mfxU16 MaxGopSize; mfxU16 MaxGopRefDist; mfxU32 MaxIDRDist; mfxU16 BRefType; mfxU16 reserved4[63]; }; mfxU16 ScenarioInfo; struct /* Rate control info */ { mfxU16 RateControlMethod; /* CBR, VBR, CRF, CQP */ mfxU32 TargetKbps; /* ignored for CRF, CQP */ mfxU32 MaxKbps; /* ignored for CRF, CQP */ mfxU16 QPLevel[3]; /* for CRF, CQP */ mfxU16 HRDConformance; /* for CBR & VBR */ mfxU32 BufferSizeInKB; /* if HRDConformance is ON */ mfxU32 InitialDelayInKB; /* if HRDConformance is ON */ mfxU32 ConvergencePeriod; /* if HRDConformance is OFF, 0 - the period is whole stream */ mfxU32 Accuracy; /* if HRDConformance is OFF */ mfxU32 WinBRCMaxAvgKbps; /* sliding window restriction */ mfxU16 WinBRCSize; /* sliding window restriction */ mfxU32 MaxFrameSizeInBytes[3]; /* MaxFrameSize limitation */ mfxU16 MinQPLevel[3]; /* QP range limitations */ mfxU16 MaxQPLevel[3]; /* QP range limitations */ mfxU32 PanicMode; mfxU16 LaQp; /* QP used for LookAhead encode */ mfxU16 LaScale; /* Downscale Factor for LookAhead encode */ mfxU16 NumRefP; /* Number for Reference allowed for P frames to handle reflists*/ mfxU16 reserved5[60]; }; mfxU16 NumExtParam; mfxExtBuffer** ExtParam; } mfxEncToolsCtrl; MFX_PACK_END() #define MFX_ENCTOOLS_CTRL_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxHDL DeviceHdl; mfxU32 HdlType; mfxU32 reserved2[3]; } mfxEncToolsCtrlExtDevice; MFX_PACK_END() #define MFX_ENCTOOLS_CTRL_EXTDEVICE_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxFrameAllocator *pAllocator; mfxU32 reserved2[4]; } mfxEncToolsCtrlExtAllocator; MFX_PACK_END() #define MFX_ENCTOOLS_CTRL_EXTALLOCATOR_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxStructVersion Version; mfxU16 reserved; mfxU32 DisplayOrder; mfxExtBuffer **ExtParam; mfxU16 NumExtParam; mfxU16 reserved2; mfxU32 reserved3[3]; } mfxEncToolsTaskParam; MFX_PACK_END() #define MFX_ENCTOOLS_TASKPARAM_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxFrameSurface1 *Surface; /* Input surface */ mfxU32 reserved2[2]; } mfxEncToolsFrameToAnalyze; MFX_PACK_END() #define MFX_ENCTOOLS_FRAMETOANALYZE_VERSION MFX_STRUCT_VERSION(1, 0) #define MFX_ENCTOOLS_PREENC_MAP_WIDTH 16 #define MFX_ENCTOOLS_PREENC_MAP_SIZE 128 MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU16 SceneChangeFlag; mfxU16 RepeatedFrameFlag; mfxU32 TemporalComplexity; mfxU16 SpatialComplexity; // Frame Spatial Complexity (RsCs) computed at low res /* Persistence Parameters */ /* Persistence of a block = number of frames the blk persists without much change */ mfxU16 PersistenceMapNZ; // If !0, Peristence Map has some Non Zero values mfxU8 PersistenceMap[MFX_ENCTOOLS_PREENC_MAP_SIZE]; mfxU32 reserved2[2]; } mfxEncToolsHintPreEncodeSceneChange; MFX_PACK_END() #define MFX_ENCTOOLS_HINTPREENCODE_SCENECHANGE_VERSION MFX_STRUCT_VERSION(1, 0) enum { MFX_QUANT_MATRIX_DEFAULT = 0, MFX_QUANT_MATRIX_FLAT, MFX_QUANT_MATRIX_WEAK, MFX_QUANT_MATRIX_MEDIUM, MFX_QUANT_MATRIX_STRONG, MFX_QUANT_MATRIX_EXTREME }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[2]; mfxU16 MatrixType; /* enum */ } mfxEncToolsHintQuantMatrix; MFX_PACK_END() #define MFX_ENCTOOLS_HINT_QUANTMATRIX_VERSION MFX_STRUCT_VERSION(1, 0) #define MFX_QP_UNDEFINED 0x1111 #define MAX_QP_MODULATION 5 enum { MFX_QP_MODULATION_NOT_DEFINED = 0, /* QPModulation type for the frame is not defined. */ MFX_QP_MODULATION_LOW, /* Use low pyramid delta QP for this frame. This type of content prefers low delta QP between P/B Layers. */ MFX_QP_MODULATION_MEDIUM, /* Use medium pyramid delta QP for this frame. This type of content prefers medium delta QP between P/B Layers. */ MFX_QP_MODULATION_HIGH, /* Use high pyramid delta QP for this frame. This type of content prefers high delta QP between P/B Layers. */ MFX_QP_MODULATION_MIXED, /* Use pyramid delta QP appropriate for mixed content. */ #if defined(MFX_ENABLE_ENCTOOLS) MFX_QP_MODULATION_EXPLICIT, /* Use explicit pyramid delta QP. */ #endif MFX_QP_MODULATION_RESERVED0 }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[2]; mfxU16 QpMapFilled; /* If !0, QP Map is filled */ mfxExtMBQP ExtQpMap; /* Per Block QP Map for current frame */ mfxU16 QpMapPitch; /* Additional parameter for ExtQpMap, number QPs per MB line */ mfxU16 reserved2[9]; } mfxEncToolsHintQPMap; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /* This buffer can be used by encoder to get saliency map from enctools. Encoder should allocate sufficient "SaliencyMap" buffer and set its size in "AllocatedSize" before calling enctools. Enctools fill this buffer with saliency map and set "Width", "Height" and "BlockSize". If buffer size is not sufficient, enctools do not modify "SaliencyMap", but set "Width", "Height", "BlockSize" and return MFX_ERR_NOT_ENOUGH_BUFFER. Encoder should reallocate buffer and call enctools one more time. */ typedef struct { mfxExtBuffer Header; /* MFX_EXTBUFF_ENCTOOLS_HINT_SALIENCY_MAP */ mfxStructVersion Version; mfxU32 Width; /* width of the map in blocks, set by enctools */ mfxU32 Height; /* height of the map in blocks, set by enctools */ mfxU32 BlockSize; /* block size of the saliency map in pixels, set by enctools */ mfxU32 AllocatedSize; /* number of elements (blocks) allocated in "SaliencyMap" array, set by encoder */ mfxF32* SaliencyMap; /* saliency map, in 0..1 range, allocated by encoder */ mfxU32 reserved[64]; } mfxEncToolsHintSaliencyMap; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[2]; mfxU16 FrameType; mfxI16 QPDelta; mfxU16 QPModulation; /* enum */ mfxU16 MiniGopSize; /* Adaptive GOP decision for the frame */ #if defined(MFX_ENABLE_ENCTOOLS) mfxI8 QPDeltaExplicitModulation; /* Explicit adaptive QP offset */ mfxU8 reserved8bits; #endif mfxU16 reserved2[5]; } mfxEncToolsHintPreEncodeGOP; MFX_PACK_END() #define MFX_ENCTOOLS_HINTPREENCODE_GOP_VERSION MFX_STRUCT_VERSION(1, 0) enum { MFX_REF_FRAME_NORMAL = 0, MFX_REF_FRAME_TYPE_LTR, MFX_REF_FRAME_TYPE_KEY }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { /* only for progressive. Need to think about interlace for future support */ mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[2]; mfxU16 CurrFrameType; /* enum */ mfxU32 PreferredRefList[16]; mfxU32 RejectedRefList[16]; mfxU16 PreferredRefListSize; mfxU16 RejectedRefListSize; mfxU32 LongTermRefList[16]; mfxU16 LongTermRefListSize; mfxU16 reserved2[6]; } mfxEncToolsHintPreEncodeARefFrames; /* Output structure */ MFX_PACK_END() #define MFX_ENCTOOLS_HINTPREENCODE_AREFFRAMES_VERSION MFX_STRUCT_VERSION(1, 0) enum { MFX_BUFFERHINT_OUTPUT_ENCORDER = 0, MFX_BUFFERHINT_OUTPUT_DISPORDER }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU32 OptimalFrameSizeInBytes; mfxU32 AvgEncodedSizeInBits; /* Average size of encoded Lookahead frames in bits */ mfxU32 CurEncodedSizeInBits; /* Size of encoded Lookahead frame at current frame location in bits */ mfxU16 DistToNextI; /* Distance to next I Frame in Lookahead frames (0 if not found) */ mfxU16 OutputMode; /* enum */ mfxU32 reserved2[4]; } mfxEncToolsBRCBufferHint; MFX_PACK_END() #define MFX_ENCTOOLS_BRCBUFFER_HINT_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU16 FrameType; /* See FrameType enumerator */ mfxU16 PyramidLayer; /* B-pyramid or P-pyramid layer frame belongs to */ mfxU32 EncodeOrder; /* Frame number in a sequence of reordered frames starting from encoder Init() */ mfxU16 SceneChange; // Frame is Scene Chg frame mfxU16 LongTerm; // Frame is long term refrence mfxU16 SpatialComplexity; // Frame Spatial Complexity (RsCs) computed at low res /* Persistence Parameters */ /* Persistence of a block = number of frames the blk persists without much change */ mfxU16 PersistenceMapNZ; // If !0, Peristence Map has some Non Zero values mfxU8 PersistenceMap[MFX_ENCTOOLS_PREENC_MAP_SIZE]; mfxU32 reserved1[1]; } mfxEncToolsBRCFrameParams; MFX_PACK_END() #define MFX_ENCTOOLS_BRCFRAMEPARAMS_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU32 QpY; /* Frame-level Luma QP. Mandatory */ mfxU32 MaxFrameSize; /* Max frame size in bytes (used for rePak). Optional */ mfxU8 DeltaQP[8]; /* deltaQP[i] is added to QP value while ith-rePakOptional */ mfxU16 NumDeltaQP; /* Max number of rePaks to provide MaxFrameSize (from 0 to 8) */ mfxU16 reserved2[5]; } mfxEncToolsBRCQuantControl; MFX_PACK_END() #define MFX_ENCTOOLS_BRCQUANTCONTROL_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU32 InitialCpbRemovalDelay; mfxU32 InitialCpbRemovalDelayOffset; mfxU32 reserved2[2]; } mfxEncToolsBRCHRDPos; MFX_PACK_END() #define MFX_ENCTOOLS_BRCHRDPOS_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxU16 NumRecodesDone; /* Number of recodings performed for this frame. Optional */ mfxU16 QpY; /* Luma QP the frame was encoded with */ mfxU32 CodedFrameSize; /* Size of frame in bytes after encoding */ mfxU32 reserved2[2]; } mfxEncToolsBRCEncodeResult; MFX_PACK_END() #define MFX_ENCTOOLS_BRCENCODERESULT_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 reserved[3]; mfxBRCFrameStatus FrameStatus; } mfxEncToolsBRCStatus; MFX_PACK_END() #define MFX_ENCTOOLS_BRCSTATUS_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; /* what about to return version of EncTools containing commit_id - return through GetVersion? */ mfxU16 reserved[3]; /* to align with Version */ mfxU32 reserved2[14]; mfxHDL Context; mfxStatus(MFX_CDECL *Init) (mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl); mfxStatus(MFX_CDECL *GetSupportedConfig) (mfxHDL pthis, mfxExtEncToolsConfig* config, mfxEncToolsCtrl* ctrl); mfxStatus(MFX_CDECL *GetActiveConfig) (mfxHDL pthis, mfxExtEncToolsConfig* pEncToolConfig); mfxStatus(MFX_CDECL *GetDelayInFrames)(mfxHDL pthis, mfxExtEncToolsConfig* pEncToolConfig, mfxEncToolsCtrl* ctrl, mfxU32 *numFrames); mfxStatus(MFX_CDECL *Reset) (mfxHDL pthis, mfxExtEncToolsConfig* pEncToolConfig, mfxEncToolsCtrl* ctrl); /* asynchronous reset */ mfxStatus(MFX_CDECL *Close) (mfxHDL pthis); mfxStatus(MFX_CDECL *Submit) (mfxHDL pthis, mfxEncToolsTaskParam* sparam); /* Encoder knows how many buffers should be provided by app/encode and it waits for all of them */ mfxStatus(MFX_CDECL *Query) (mfxHDL pthis, mfxEncToolsTaskParam* param, mfxU32 timeout); mfxStatus(MFX_CDECL *Discard) (mfxHDL pthis, mfxU32 DisplayOrder); mfxHDL reserved3[8]; } mfxEncTools; MFX_PACK_END() #define MFX_ENCTOOLS_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() struct mfxLplastatus { #if defined(MFX_ENABLE_ENCTOOLS_LPLA) mfxU8 ValidInfo = 0; mfxU8 CqmHint = 0xFF; mfxU32 TargetFrameSize = 0; mfxU8 MiniGopSize = 0; mfxU8 QpModulation = 0; #endif mfxU32 AvgEncodedBits = 0; mfxU32 CurEncodedBits = 0; mfxU16 DistToNextI = 0; }; MFX_PACK_END() mfxEncTools* MFX_CDECL MFXVideoENCODE_CreateEncTools(const mfxVideoParam& par); void MFX_CDECL MFXVideoENCODE_DestroyEncTools(mfxEncTools *et); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/src/000077500000000000000000000000001443134507600246205ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/src/mfx_enctools.cpp000066400000000000000000000043741443134507600300340ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // mfx_enctools.cpp : Defines the enctools interfaces for the RT to call. #include "mfx_enctools_stub.h" #include "mfx_enctools_loader.h" mfxEncTools* MFXVideoENCODE_CreateEncTools(const mfxVideoParam&) { std::unique_ptr et(new mfxEncTools); et->Context = MFXNewEncTools(mfxEncToolsLoader::LoadEncToolsLib()); if (!et->Context) { et->Context = new EncToolsStub; } et->Init = EncToolsFuncs::Init; et->Reset = EncToolsFuncs::Reset; et->Close = EncToolsFuncs::Close; et->Submit = EncToolsFuncs::Submit; et->Query = EncToolsFuncs::Query; et->Discard = EncToolsFuncs::Discard; et->GetSupportedConfig = EncToolsFuncs::GetSupportedConfig; et->GetActiveConfig = EncToolsFuncs::GetActiveConfig; et->GetDelayInFrames = EncToolsFuncs::GetDelayInFrames; return et.release(); } void MFX_CDECL MFXVideoENCODE_DestroyEncTools(mfxEncTools* et) { if (et != nullptr && et->Context != nullptr) { void* etmodule = ((IEncTools*)et->Context)->m_etModule; delete (IEncTools*)et->Context; delete et; et = nullptr; mfxEncToolsLoader::UnLoadEncToolsLib(&etmodule); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/enctools/src/mfx_enctools_loader.cpp000066400000000000000000000041111443134507600313470ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfxenctools-int.h" #include "mfx_enctools_loader.h" #include "mfx_loader_utils.h" const char* const encToolsDLLName = "enctools.so"; typedef void* (MFX_CDECL* FuncMFXVideoENCODE_NewEncTools) (void*, const char*); void* mfxEncToolsLoader::LoadEncToolsLib() { void* hModule = nullptr; hModule = LoadDependency(encToolsDLLName); return hModule; } mfxStatus mfxEncToolsLoader::UnLoadEncToolsLib(void** phModule) { if (phModule) { UnLoadModule(*phModule); *phModule = nullptr; } return MFX_ERR_NONE; } void* MFXNewEncTools(void* hModule) { FuncMFXVideoENCODE_NewEncTools pfnNew = nullptr; void* encTools = nullptr; if (hModule) { pfnNew = (FuncMFXVideoENCODE_NewEncTools)GetModuleFuncAddress(hModule, "MFXVideoENCODE_NewEncTools"); } if (pfnNew) { std::string path = GetSelfModuleFullPath(); encTools = (void*)pfnNew(hModule, path.c_str()); } return encTools; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/000077500000000000000000000000001443134507600236265ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/all_functions.h000066400000000000000000000145761443134507600266540ustar00rootroot00000000000000// Copyright (c) 2007-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // Library Common FUNCTION(mfxStatus, MFXQueryIMPL, (mfxSession session, mfxIMPL *impl), (session, impl)) FUNCTION(mfxStatus, MFXQueryVersion, (mfxSession session, mfxVersion *version), (session, version)) // CORE interface functions FUNCTION(mfxStatus, MFXVideoCORE_SetBufferAllocator, (mfxSession session, mfxBufferAllocator *allocator), (session, allocator)) FUNCTION(mfxStatus, MFXVideoCORE_SetFrameAllocator, (mfxSession session, mfxFrameAllocator *allocator), (session, allocator)) FUNCTION(mfxStatus, MFXVideoCORE_SetHandle, (mfxSession session, mfxHandleType type, mfxHDL hdl), (session, type, hdl)) FUNCTION(mfxStatus, MFXVideoCORE_GetHandle, (mfxSession session, mfxHandleType type, mfxHDL *hdl), (session, type, hdl)) FUNCTION(mfxStatus, MFXVideoCORE_SyncOperation, (mfxSession session, mfxSyncPoint syncp, mfxU32 wait), (session, syncp, wait)) // ENCODE interface functions FUNCTION(mfxStatus, MFXVideoENCODE_Query, (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), (session, in, out)) FUNCTION(mfxStatus, MFXVideoENCODE_QueryIOSurf, (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), (session, par, request)) FUNCTION(mfxStatus, MFXVideoENCODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoENCODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoENCODE_Close, (mfxSession session), (session)) FUNCTION(mfxStatus, MFXVideoENCODE_GetVideoParam, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoENCODE_GetEncodeStat, (mfxSession session, mfxEncodeStat *stat), (session, stat)) FUNCTION(mfxStatus, MFXVideoENCODE_EncodeFrameAsync, (mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp), (session, ctrl, surface, bs, syncp)) // DECODE interface functions FUNCTION(mfxStatus, MFXVideoDECODE_Query, (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), (session, in, out)) FUNCTION(mfxStatus, MFXVideoDECODE_DecodeHeader, (mfxSession session, mfxBitstream *bs, mfxVideoParam *par), (session, bs, par)) FUNCTION(mfxStatus, MFXVideoDECODE_QueryIOSurf, (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), (session, par, request)) FUNCTION(mfxStatus, MFXVideoDECODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoDECODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoDECODE_Close, (mfxSession session), (session)) FUNCTION(mfxStatus, MFXVideoDECODE_GetVideoParam, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoDECODE_GetDecodeStat, (mfxSession session, mfxDecodeStat *stat), (session, stat)) FUNCTION(mfxStatus, MFXVideoDECODE_GetPayload, (mfxSession session, mfxU64 *ts, mfxPayload *payload), (session, ts, payload)) FUNCTION(mfxStatus, MFXVideoDECODE_DecodeFrameAsync, (mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp), (session, bs, surface_work, surface_out, syncp)) // VPP interface functions FUNCTION(mfxStatus, MFXVideoVPP_Query, (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), (session, in, out)) FUNCTION(mfxStatus, MFXVideoVPP_QueryIOSurf, (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), (session, par, request)) FUNCTION(mfxStatus, MFXVideoVPP_Init, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoVPP_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoVPP_Close, (mfxSession session), (session)) FUNCTION(mfxStatus, MFXVideoVPP_GetVideoParam, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoVPP_GetVPPStat, (mfxSession session, mfxVPPStat *stat), (session, stat)) FUNCTION(mfxStatus, MFXVideoVPP_RunFrameVPPAsync, (mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp), (session, in, out, aux, syncp)) // ENC interface function FUNCTION(mfxStatus, MFXVideoENC_Query, (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), (session, in, out)) FUNCTION(mfxStatus, MFXVideoENC_QueryIOSurf, (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), (session, par, request)) FUNCTION(mfxStatus, MFXVideoENC_Init, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoENC_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoENC_Close, (mfxSession session), (session)) FUNCTION(mfxStatus, MFXVideoENC_GetVideoParam, (mfxSession session, mfxVideoParam *par), (session, par)) // PAK interface functions FUNCTION(mfxStatus, MFXVideoPAK_Query, (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), (session, in, out)) FUNCTION(mfxStatus, MFXVideoPAK_QueryIOSurf, (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), (session, par, request)) FUNCTION(mfxStatus, MFXVideoPAK_Init, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoPAK_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) FUNCTION(mfxStatus, MFXVideoPAK_Close, (mfxSession session), (session)) FUNCTION(mfxStatus, MFXVideoPAK_GetVideoParam, (mfxSession session, mfxVideoParam *par), (session, par)) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/cm_mem_copy_stub.h000066400000000000000000000053121443134507600273240ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CM_MEM_COPY_INTERFACE_H__ #define __CM_MEM_COPY_INTERFACE_H__ #ifndef MFX_ENABLE_EXT #include "mfxdefs.h" typedef void CmDevice; class CmCopyWrapper { public: CmCopyWrapper(bool /*cm_buffer_cache*/ = false) {} // destructor virtual ~CmCopyWrapper(void) {} template CmDevice* GetCmDevice(D3DAbstract *pD3D) { (void*)pD3D; return nullptr; }; CmDevice* GetCmDevice(VADisplay dpy) { return nullptr; }; static bool CanUseCmCopy(mfxFrameSurface1* pDst, mfxFrameSurface1* pSrc) { (void*)pDst; (void*)pSrc; return false; } void CleanUpCache() {} void Close() {} mfxStatus CopySysToVideo(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) { (void*)pDst; (void*)pSrc; MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxStatus CopyVideoToSys(mfxFrameSurface1* pDst, mfxFrameSurface1* pSrc) { (void*)pDst; (void*)pSrc; MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxStatus CopyVideoToVideo(mfxFrameSurface1* pDst, mfxFrameSurface1* pSrc) { (void*)pDst; (void*)pSrc; MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxStatus InitializeSwapKernels(eMFXHWType hwtype = MFX_HW_UNKNOWN) { (void)hwtype; MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxStatus Initialize(mfxU16 hwDeviceId, eMFXHWType hwtype = MFX_HW_UNKNOWN) { (void)hwtype; (void)hwDeviceId; MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } protected: private: }; #endif #endifoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/dispatch_session.h000066400000000000000000000023621443134507600273440ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DISPATCH_SESSION_H__ #define __DISPATCH_SESSION_H__ struct JumpTable; struct DispatchSession { JumpTable *jump_table; }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/fast_copy.h000066400000000000000000000105571443134507600257760ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __FAST_COPY_H__ #define __FAST_COPY_H__ #include "ippdefs.h" #include "ippi.h" #include "mfx_trace.h" #include "mfxdefs.h" #include #include "umc_mutex.h" #include "fast_copy_c_impl.h" #include "fast_copy_sse4_impl.h" enum { COPY_SYS_TO_SYS = 0, COPY_SYS_TO_VIDEO = 1, COPY_VIDEO_TO_SYS = 2, }; typedef void(*t_copyVideoToSys)(const mfxU8* src, mfxU8* dst, int width); typedef void(*t_copyVideoToSysShift)(const mfxU16* src, mfxU16* dst, int width, int shift); typedef void(*t_copySysToVideoShift)(const mfxU16* src, mfxU16* dst, int width, int shift); void copyVideoToSys(const mfxU8* src, mfxU8* dst, int width); void copyVideoToSysShift(const mfxU16* src, mfxU16* dst, int width, int shift); void copySysToVideoShift(const mfxU16* src, mfxU16* dst, int width, int shift); template inline int mfxCopyRect(const T* pSrc, int srcStep, T* pDst, int dstStep, IppiSize roiSize, int flag) { if (!pDst || !pSrc || roiSize.width < 0 || roiSize.height < 0 || srcStep < 0 || dstStep < 0) return -1; if (flag & COPY_VIDEO_TO_SYS) { for(int h = 0; h < roiSize.height; h++ ) { copyVideoToSys((const mfxU8*)pSrc, (mfxU8*)pDst, roiSize.width*sizeof(T)); pSrc = (T *)((mfxU8*)pSrc + srcStep); pDst = (T *)((mfxU8*)pDst + dstStep); } } else { for(int h = 0; h < roiSize.height; h++ ) { std::copy(pSrc, pSrc + roiSize.width, pDst); pSrc = (T *)((mfxU8*)pSrc + srcStep); pDst = (T *)((mfxU8*)pDst + dstStep); } } return 0; } class FastCopy { public: // copy memory by streaming static mfxStatus Copy(mfxU8 *pDst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, IppiSize roi, int flag) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy::Copy"); if (NULL == pDst || NULL == pSrc) { return MFX_ERR_NULL_PTR; } /* The purpose of mutex here is to make the Copy() atomic. * Without it CPU utilization grows dramatically due to cache trashing. */ static UMC::Mutex mutex; // This is thread-safe since C++11 UMC::AutomaticUMCMutex guard(mutex); mfxCopyRect(pSrc, srcPitch, pDst, dstPitch, roi, flag); return MFX_ERR_NONE; } static mfxStatus CopyAndShift(mfxU16 *pDst, mfxU32 dstPitch, mfxU16 *pSrc, mfxU32 srcPitch, IppiSize roi, mfxU8 lshift, mfxU8 rshift, int flag) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy::Copy"); if (NULL == pDst || NULL == pSrc) { return MFX_ERR_NULL_PTR; } if (flag & COPY_VIDEO_TO_SYS) { for (int h = 0; h < roi.height; h++) { copyVideoToSysShift( pSrc, pDst, roi.width, rshift); pSrc = (mfxU16 *)((mfxU8*)pSrc + srcPitch); pDst = (mfxU16 *)((mfxU8*)pDst + dstPitch); } } else { for (int h = 0; h < roi.height; h++) { copySysToVideoShift( pSrc, pDst, roi.width, lshift); pSrc = (mfxU16 *)((mfxU8*)pSrc + srcPitch); pDst = (mfxU16 *)((mfxU8*)pDst + dstPitch); } } return MFX_ERR_NONE; } }; #endif // __FAST_COPY_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/fast_copy_c_impl.h000066400000000000000000000027241443134507600273160ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __FAST_COPY_C_IMPL_H__ #define __FAST_COPY_C_IMPL_H__ #include "mfxdefs.h" #include void copyVideoToSys_C(const mfxU8* src, mfxU8* dst, int width); void copyVideoToSysShift_C(const mfxU16* src, mfxU16* dst, int width, int shift); void copySysToVideoShift_C(const mfxU16* src, mfxU16* dst, int width, int shift); #endif // __FAST_COPY_C_IMPL_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/fast_copy_sse4_impl.h000066400000000000000000000027461443134507600277560ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __FAST_COPY_SSE4_IMPL_H__ #define __FAST_COPY_SSE4_IMPL_H__ #include "mfxdefs.h" #include void copyVideoToSys_SSE4(const mfxU8* src, mfxU8* dst, int width); void copyVideoToSysShift_SSE4(const mfxU16* src, mfxU16* dst, int width, int shift); void copySysToVideoShift_SSE4(const mfxU16* src, mfxU16* dst, int width, int shift); #endif // __FAST_COPY_SSE4_IMPL_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_allocator.h000066400000000000000000001201401443134507600273160ustar00rootroot00000000000000// Copyright (c) 2007-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _LIBMFX_ALLOCATOR_H_ #define _LIBMFX_ALLOCATOR_H_ #include "mfxvideo.h" #include "mfx_common_int.h" // It is only needed for Synchronize #include "mfx_session.h" #include "mfxsurfacepool.h" #include "vm_interlocked.h" #include #include #include #include #include #ifdef MFX_ENABLE_ENCODE_STATS #include "mfxencodestats.h" #endif // MFX_ENABLE_ENCODE_STATS static const size_t BASE_ADDR_ALIGN = 0x1000; // 4k page size alignment static const size_t BASE_SIZE_ALIGN = 0x1000; // 4k page size alignment // Internal Allocators namespace mfxDefaultAllocator { mfxStatus AllocBuffer(mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); mfxStatus LockBuffer(mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); mfxStatus UnlockBuffer(mfxHDL pthis, mfxMemId mid); mfxStatus FreeBuffer(mfxHDL pthis, mfxMemId mid); mfxStatus AllocFrames(mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); mfxStatus LockFrame(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); mfxStatus GetHDL(mfxHDL pthis, mfxMemId mid, mfxHDL *handle); mfxStatus UnlockFrame(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr=0); mfxStatus FreeFrames(mfxHDL pthis, mfxFrameAllocResponse *response); mfxStatus GetSurfaceSizeInBytes(mfxU32 pitch, mfxU32 height, mfxU32 fourCC, mfxU32& nBytes); mfxStatus GetNumBytesRequired(const mfxFrameInfo& Info, mfxU32& nbytes, size_t power_of_2_alignment = BASE_SIZE_ALIGN); struct BufferStruct { mfxHDL allocator; mfxU32 id; mfxU32 nbytes; mfxU16 type; }; struct FrameStruct { mfxU32 id; mfxFrameInfo info; }; } class mfxWideBufferAllocator { public: std::vector m_bufHdl; mfxWideBufferAllocator(void); ~mfxWideBufferAllocator(void); mfxBufferAllocator bufferAllocator; }; class mfxBaseWideFrameAllocator { public: mfxBaseWideFrameAllocator(mfxU16 type = 0); virtual ~mfxBaseWideFrameAllocator(); mfxFrameAllocator frameAllocator; mfxWideBufferAllocator wbufferAllocator; mfxU32 NumFrames; std::vector m_frameHandles; // Type of this allocator mfxU16 type; }; class mfxWideSWFrameAllocator : public mfxBaseWideFrameAllocator { public: mfxWideSWFrameAllocator(mfxU16 type); virtual ~mfxWideSWFrameAllocator(void) {}; }; inline void clear_frame_data(mfxFrameData& frame_data) noexcept { frame_data.PitchHigh = frame_data.PitchLow = 0; frame_data.U = frame_data.V = frame_data.Y = frame_data.A = nullptr; } #if defined (MFX_DEBUG_REFCOUNT) static class RefcountGlobalRegistry { public: ~RefcountGlobalRegistry() { for (auto id : m_object_id) { printf("\n\nREFCOUNT ERROR: NOT DELETED OBJECT %p\n\n", id); } } void RegisterRefcountObject(void* id) { std::lock_guard lock(m_mutex); if (std::find(std::begin(m_object_id), std::end(m_object_id), id) != std::end(m_object_id)) { printf("\n\nREFCOUNT ERROR: CANNOT RE-REGISTER OBJECT %p\n\n", id); return; } printf("\n\nREFCOUNT NOTIFY: REGISTER OBJECT %p\n\n", id); m_object_id.push_back(id); } void UnregisterRefcountObject(void* id) { std::lock_guard lock(m_mutex); auto it = std::find(std::begin(m_object_id), std::end(m_object_id), id); if (it == std::end(m_object_id)) { printf("\n\nREFCOUNT ERROR: CANNOT DELETE NON-REGISTERED OBJECT %p\n\n", id); return; } printf("\n\nREFCOUNT NOTIFY: UNREGISTER OBJECT %p\n\n", id); m_object_id.erase(it); } private: std::mutex m_mutex; std::vector m_object_id; } g_global_registry; #endif class FrameAllocatorBase { public: FrameAllocatorBase(mfxSession session = nullptr): m_session(session) {} virtual ~FrameAllocatorBase() {} virtual mfxStatus Alloc(mfxFrameAllocRequest& request, mfxFrameAllocResponse& response) = 0; virtual mfxStatus Lock(mfxMemId mid, mfxFrameData* frame_data, mfxU32 flags = MFX_MAP_READ_WRITE) = 0; virtual mfxStatus Unlock(mfxMemId mid, mfxFrameData* frame_data) = 0; virtual mfxStatus GetHDL(mfxMemId mid, mfxHDL& handle) const = 0; virtual mfxStatus Free(mfxFrameAllocResponse& response) = 0; virtual mfxStatus CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1* & output_surf) = 0; virtual mfxStatus ReallocSurface(const mfxFrameInfo& info, mfxMemId id) = 0; virtual void SetDevice(mfxHDL device) = 0; // this is actually a WA, which should be removed after Synchronize will be implemented through dependency manager mfxStatus Synchronize(mfxSyncPoint, mfxU32 /*timeout*/); static bool CheckMemoryFlags(mfxU32 flags) { switch (flags & 0xf) { case MFX_MAP_READ: case MFX_MAP_WRITE: case MFX_MAP_READ_WRITE: break; default: return false; } return ((flags & 0xf0) & ~MFX_MAP_NOWAIT) == 0; } static std::atomic m_allocator_num; protected: // Surface need access to Remove method from destructor, for allocator state update friend class mfxFrameSurfaceBaseInterface; virtual void Remove(mfxMemId mid) = 0; mfxSession m_session; }; class FrameAllocatorExternal : public FrameAllocatorBase { public: FrameAllocatorExternal(const mfxFrameAllocator& ext_allocator) : allocator(ext_allocator) {} mfxStatus Alloc(mfxFrameAllocRequest& request, mfxFrameAllocResponse& response) override { return allocator.Alloc(allocator.pthis, &request, &response); } mfxStatus Lock(mfxMemId mid, mfxFrameData* frame_data, mfxU32 = MFX_MAP_READ) override { return allocator.Lock(allocator.pthis, mid, frame_data); } mfxStatus Unlock(mfxMemId mid, mfxFrameData* frame_data) override { return allocator.Unlock(allocator.pthis, mid, frame_data); } mfxStatus GetHDL(mfxMemId mid, mfxHDL& handle) const override { return allocator.GetHDL(allocator.pthis, mid, &handle); } mfxStatus Free(mfxFrameAllocResponse& response) override { return allocator.Free(allocator.pthis, &response); } mfxStatus CreateSurface(mfxU16, const mfxFrameInfo &, mfxFrameSurface1* &) override { return MFX_ERR_UNSUPPORTED; } mfxStatus ReallocSurface(const mfxFrameInfo &, mfxMemId ) override { return MFX_ERR_UNSUPPORTED; } void SetDevice(mfxHDL ) override { return; } void Remove(mfxMemId) override { return; } mfxFrameAllocator* GetExtAllocator() { return &allocator; } private: mfxFrameAllocator allocator; }; static bool RequiredHWallocator(mfxU16 memtype) { constexpr mfxU16 MFX_MEMTYPE_VIDEO_MASK = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET | MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET; return memtype & MFX_MEMTYPE_VIDEO_MASK; } class FrameAllocatorWrapper { public: FrameAllocatorWrapper(bool delayed_allocation) : m_delayed_allocation(delayed_allocation) {} mfxStatus Alloc(mfxFrameAllocRequest& request, mfxFrameAllocResponse& response, bool ext_alloc_hint = false) { try { // external allocator if (IsExtAllocatorSet() && // Only external frames can go to external allocator ( ((request.Type & MFX_MEMTYPE_EXTERNAL_FRAME) // Make 'fake' Alloc call to retrieve memId's of surfaces already allocated by app && (request.Type & MFX_MEMTYPE_FROM_DECODE)) // Some possible forcing of external allocator || ext_alloc_hint)) { MFX_SAFE_CALL(allocator_ext->Alloc(request, response)); // In delay allocate mode, response frame num only need >= 0. // Delay allocate mode not work with D3D9, D3D9 will use legacy allocator logical if(!m_delayed_allocation && (response.NumFrameActual < request.NumFrameMin)) { std::ignore = MFX_STS_TRACE(allocator_ext->Free(response)); MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } CacheMids(response, *allocator_ext); return MFX_ERR_NONE; } else { // Default Allocator is used for internal memory allocation only MFX_CHECK(!(request.Type & MFX_MEMTYPE_EXTERNAL_FRAME), MFX_ERR_MEMORY_ALLOC); return DefaultAllocFrames(request, response); } } catch (...) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } } mfxStatus Lock(mfxMemId mid, mfxFrameData* frame_data, mfxU32 flags = MFX_MAP_READ_WRITE) { auto allocator = GetAllocatorByMid(mid); MFX_CHECK(allocator, MFX_ERR_LOCK_MEMORY); return allocator->Lock(mid, frame_data, flags); } mfxStatus Unlock(mfxMemId mid, mfxFrameData* frame_data) { auto allocator = GetAllocatorByMid(mid); MFX_CHECK(allocator, MFX_ERR_UNKNOWN); return allocator->Unlock(mid, frame_data); } mfxStatus GetHDL(mfxMemId mid, mfxHDL& handle) { auto allocator = GetAllocatorByMid(mid); MFX_CHECK(allocator, MFX_ERR_UNDEFINED_BEHAVIOR); return allocator->GetHDL(mid, handle); } mfxStatus Free(mfxFrameAllocResponse& response) { MFX_CHECK_NULL_PTR1(response.mids); // We can only Free those surfaces which were allocated inside library, so // we shouldn't default to ext allocator auto allocator = GetAllocatorByMid(response.mids[0], false); MFX_CHECK(allocator, MFX_ERR_UNKNOWN); std::unique_lock lock(m_mutex); for (mfxU32 i = 0; i < response.NumFrameActual; ++i) { m_mid_to_allocator.erase(response.mids[i]); } lock.unlock(); return allocator->Free(response); } mfxStatus CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1* & output_surf) { if (RequiredHWallocator(type)) { MFX_CHECK(allocator_hw, MFX_ERR_UNSUPPORTED); } FrameAllocatorBase* allocator = ((type & MFX_MEMTYPE_SYSTEM_MEMORY) || !allocator_hw) ? allocator_sw.get() : allocator_hw.get(); MFX_CHECK_HDL(allocator); MFX_SAFE_CALL(allocator->CreateSurface(type, info, output_surf)); CacheMid(output_surf->Data.MemId, *allocator); return MFX_ERR_NONE; } mfxStatus ReallocSurface(const mfxFrameInfo & info, mfxMemId id) { // We can't realloc surface from ext allocator, so let's not even try default to it auto allocator = GetAllocatorByMid(id, false); MFX_CHECK(allocator, MFX_ERR_UNKNOWN); return allocator->ReallocSurface(info, id); } void SetDevice(mfxHDL device) { if (allocator_hw) allocator_hw->SetDevice(device); } mfxStatus SetFrameAllocator(const mfxFrameAllocator& allocator) { MFX_CHECK(!IsExtAllocatorSet(), MFX_ERR_UNDEFINED_BEHAVIOR); allocator_ext.reset(new FrameAllocatorExternal(allocator)); return MFX_ERR_NONE; } bool IsExtAllocatorSet() const { return !!allocator_ext; } mfxFrameAllocator* GetExtAllocator() { if (!IsExtAllocatorSet()) return nullptr; auto ext_alloc = dynamic_cast(allocator_ext.get()); return ext_alloc ? ext_alloc->GetExtAllocator() : nullptr; } std::unique_ptr allocator_sw; std::unique_ptr allocator_hw; std::unique_ptr allocator_ext; private: mfxStatus DefaultAllocFrames(mfxFrameAllocRequest& request, mfxFrameAllocResponse& response) { FrameAllocatorBase* allocator; if ((request.Type & MFX_MEMTYPE_SYSTEM_MEMORY) || !allocator_hw) { allocator = allocator_sw.get(); } else { allocator = allocator_hw.get(); } mfxStatus sts = allocator->Alloc(request, response); MFX_CHECK_STS(sts); if (response.NumFrameActual < request.NumFrameMin) { std::ignore = Free(response); MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } CacheMids(response, *allocator); return MFX_ERR_NONE; } FrameAllocatorBase* GetAllocatorByMid(mfxMemId mid, bool default_to_external = true) { std::shared_lock guard(m_mutex); if (m_mid_to_allocator.find(mid) == std::end(m_mid_to_allocator)) { // If this surface wasn't allocated through Alloc call (cache miss), it might be external surface passed by user, // so it should be handled by external allocator return default_to_external ? allocator_ext.get() : nullptr; } return m_mid_to_allocator[mid]; } void CacheMids(const mfxFrameAllocResponse & response, FrameAllocatorBase& allocator) { std::lock_guard guard(m_mutex); for (mfxU32 i = 0; i < response.NumFrameActual; ++i) { m_mid_to_allocator[response.mids[i]] = &allocator; } } void CacheMid(mfxMemId mid, FrameAllocatorBase& allocator) { std::lock_guard guard(m_mutex); m_mid_to_allocator[mid] = &allocator; } std::shared_timed_mutex m_mutex; std::map m_mid_to_allocator; bool m_delayed_allocation; }; inline mfxU16 AdjustTypeInternal(mfxU16 type) { return (type & ~MFX_MEMTYPE_EXTERNAL_FRAME) | MFX_MEMTYPE_INTERNAL_FRAME; } template class FlexibleFrameAllocator : public FrameAllocatorBase { #define MFX_DETACH_FRAME \ [](T* surface) \ { \ /* We already removed from allocator's list, no need to update it through destructor */ \ surface->DetachParentAllocator(); \ \ std::ignore = MFX_STS_TRACE(surface->Release()); \ } using pT = std::unique_ptr; public: FlexibleFrameAllocator(mfxHDL device = nullptr, mfxSession session = nullptr) // ids across different allocators (SW / HW in one core and in different cores (for simplicity)) shouldn't overlap : FrameAllocatorBase(session) , m_last_created_mid(m_allocator_num << 16) , m_device(device) , m_staging_adapter(std::make_shared(device)) { std::ignore = m_allocator_num.fetch_add(1, std::memory_order_relaxed); } mfxStatus Alloc(mfxFrameAllocRequest& request, mfxFrameAllocResponse& response) override { response = {}; if (!request.NumFrameSuggested) return MFX_ERR_NONE; MFX_CHECK(!(request.Type & MFX_MEMTYPE_EXTERNAL_FRAME), MFX_ERR_UNSUPPORTED); mfxU16 type = AdjustTypeInternal(request.Type); try { std::vector mids(request.NumFrameSuggested); std::list alloc_list; for (mfxU16 i = 0; i < request.NumFrameSuggested; ++i) { mids[i] = GenerateMid(); alloc_list.emplace_back(pT(T::Create(request.Info, type, mids[i], m_staging_adapter, m_device, request.AllocId, *this), MFX_DETACH_FRAME)); } std::lock_guard guard(m_mutex); m_allocated_pool.splice(m_allocated_pool.end(), alloc_list); m_returned_mids.emplace_back(std::move(mids)); response.AllocId = request.AllocId; response.mids = m_returned_mids.back().data(); response.NumFrameActual = request.NumFrameSuggested; } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } catch (...) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } return MFX_ERR_NONE; } mfxStatus Lock(mfxMemId mid, mfxFrameData* frame_data, mfxU32 flags = MFX_MAP_READ) override { MFX_CHECK_HDL(mid); MFX_CHECK(CheckMemoryFlags(flags), MFX_ERR_LOCK_MEMORY); std::shared_lock guard(m_mutex); auto it = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); MFX_CHECK(it != std::end(m_allocated_pool), MFX_ERR_NOT_FOUND); MFX_SAFE_CALL((*it)->Lock(flags)); (*it)->CopyPointers(frame_data); return MFX_ERR_NONE; } mfxStatus Unlock(mfxMemId mid, mfxFrameData* frame_data) override { MFX_CHECK_HDL(mid); std::shared_lock guard(m_mutex); auto it = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); MFX_CHECK(it != std::end(m_allocated_pool), MFX_ERR_NOT_FOUND); MFX_SAFE_CALL((*it)->Unlock()); (*it)->CopyPointers(frame_data); return MFX_ERR_NONE; } mfxStatus GetHDL(mfxMemId mid, mfxHDL& handle) const override { MFX_CHECK_HDL(mid); std::shared_lock guard(m_mutex); auto it = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); MFX_CHECK(it != std::end(m_allocated_pool), MFX_ERR_INVALID_HANDLE); return (*it)->GetHDL(handle); } mfxStatus Free(mfxFrameAllocResponse& response) override { std::list frames_to_erase; std::lock_guard guard(m_mutex); // Clear mids auto it_mids = std::find_if(std::begin(m_returned_mids), std::end(m_returned_mids), [this, response](const std::vector & mids) { return mids.size() == response.NumFrameActual && std::equal(response.mids, response.mids + response.NumFrameActual, std::begin(mids), [this](mfxMemId l, mfxMemId r) { return l == r || l == ALREADY_REMOVED_MID || r == ALREADY_REMOVED_MID; }); }); MFX_CHECK(it_mids != std::end(m_returned_mids), MFX_ERR_NOT_FOUND); // Partial freeing is not allowed MFX_CHECK(it_mids->size() == response.NumFrameActual, MFX_ERR_INVALID_HANDLE); mfxStatus sts = MFX_ERR_NONE; for (mfxU32 i = 0; i < response.NumFrameActual; ++i) { // Clear exported pool (if surface is there, MSDK lib might be doing something wrong) auto mid = response.mids[i]; // This mid was already deleted by calling Release (object is deleted when it's refcounter reaches zero) if (mid == ALREADY_REMOVED_MID) continue; auto it_alloc = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); if (it_alloc != std::end(m_allocated_pool)) { frames_to_erase.splice(frames_to_erase.end(), m_allocated_pool, it_alloc); } else { sts = MFX_ERR_NOT_FOUND; } } m_returned_mids.erase(it_mids); return sts; } mfxStatus CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1* & output_surf) override { MFX_CHECK(!(type & MFX_MEMTYPE_EXTERNAL_FRAME), MFX_ERR_UNSUPPORTED); try { std::list alloc_list; alloc_list.emplace_back(pT(T::Create(info, T::AdjustType(type), GenerateMid(), m_staging_adapter, m_device, 0u, *this), MFX_DETACH_FRAME)); std::lock_guard guard(m_mutex); m_allocated_pool.splice(m_allocated_pool.end(), alloc_list); // Fill mfxFrameSurface1 object and return to user output_surf = &(m_allocated_pool.back()->m_exported_surface); return output_surf->FrameInterface->AddRef(output_surf); } catch (const std::system_error& ex) { MFX_CHECK_STS(mfxStatus(ex.code().value())); } catch (...) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } return MFX_ERR_NONE; } mfxStatus ReallocSurface(const mfxFrameInfo & info, mfxMemId mid) override { MFX_CHECK_HDL(mid); std::shared_lock guard(m_mutex); auto it = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); MFX_CHECK(it != std::end(m_allocated_pool), MFX_ERR_NOT_FOUND); // Will not reallocate surface which is locked by someone MFX_CHECK(!(*it)->Locked(), MFX_ERR_LOCK_MEMORY); MFX_CHECK((*it)->ReallocAllowed(info), MFX_ERR_INVALID_VIDEO_PARAM); return (*it)->Realloc(info); } void SetDevice(mfxHDL device) override { m_device = device; m_staging_adapter->SetDevice(device); } protected: void Remove(mfxMemId mid) override { std::lock_guard guard(m_mutex); auto it = std::find_if(std::begin(m_allocated_pool), std::end(m_allocated_pool), [mid](const pT& surf) { return surf->GetMid() == mid; }); if (it == std::end(m_allocated_pool)) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_FOUND); return; } // Surface is being deleted after decreasing refcount to zero, no need decrease refcount in destructor of holder it->release(); m_allocated_pool.erase(it); std::ignore = std::find_if(std::begin(m_returned_mids), std::end(m_returned_mids), [this, mid](std::vector& v_mid) { auto it = std::find(std::begin(v_mid), std::end(v_mid), mid); if (it == std::end(v_mid)) return false; *it = ALREADY_REMOVED_MID; return true; }); } private: std::atomic m_last_created_mid = { 0 }; mfxHDL m_device = nullptr; mutable std::shared_timed_mutex m_mutex; // Do not change order of m_staging_adapter and m_allocated_pool (surfaces destruction has side effect on staging adapter) std::shared_ptr m_staging_adapter; std::list m_allocated_pool; // Pool of allocated surfaces std::list> m_returned_mids; // Storage of memory for mids returned to MSDK lib const mfxMemId ALREADY_REMOVED_MID = mfxMemId(std::numeric_limits::max()); mfxMemId GenerateMid() { return mfxMemId(m_last_created_mid.fetch_add(1, std::memory_order_relaxed) + 1); } #undef MFX_DETACH_FRAME }; class mfxFrameSurfaceBaseInterface : public mfxRefCountableImpl { public: mfxFrameSurfaceBaseInterface(mfxMemId mid, FrameAllocatorBase& allocator) : m_allocator(&allocator) , m_mid(mid) {} virtual mfxStatus Lock(mfxU32 flags) = 0; virtual mfxStatus Unlock() = 0; virtual std::pair GetNativeHandle() const = 0; virtual std::pair GetDeviceHandle() const = 0; mfxMemId GetMid() const { return m_mid; } // this is actually a WA, which should be removed after Synchronize will be implemented through dependency manager mfxStatus Synchronize(mfxU32 timeout) { // If allocator is detached, no need to sychronize surface. It is already synchronized return m_allocator ? m_allocator->Synchronize(m_sp, timeout) : MFX_ERR_NONE; } void SetSyncPoint(mfxSyncPoint Sync) { m_sp = Sync; } void DetachParentAllocator() { m_allocator = nullptr; } mfxSurfacePoolInterface* QueryParentPool() { if (!m_parent_pool) return nullptr; if (MFX_STS_TRACE(m_parent_pool->AddRef(m_parent_pool)) != MFX_ERR_NONE) return nullptr; return m_parent_pool; } void SetParentPool(mfxSurfacePoolInterface* pool) { m_parent_pool = pool; } protected: void Close() override { if (m_allocator) m_allocator->Remove(m_mid); } private: FrameAllocatorBase* m_allocator; mfxMemId m_mid; mfxSyncPoint m_sp = nullptr; mfxSurfacePoolInterface* m_parent_pool = nullptr; }; template <> struct mfxRefCountableInstance { static mfxRefCountable* Get(mfxFrameSurface1* object) { return reinterpret_cast(object->FrameInterface->Context); } }; inline void copy_frame_surface_pixel_pointers(mfxFrameData& buf_dst, const mfxFrameData& buf_src) { MFX_COPY_FIELD_NO_LOG(PitchLow); MFX_COPY_FIELD_NO_LOG(PitchHigh); MFX_COPY_FIELD_NO_LOG(Y); MFX_COPY_FIELD_NO_LOG(U); MFX_COPY_FIELD_NO_LOG(V); MFX_COPY_FIELD_NO_LOG(A); } class mfxFrameSurfaceInterfaceImpl : public mfxFrameSurfaceBaseInterface { public: mfxFrameSurfaceInterfaceImpl(const mfxFrameInfo & info, mfxU16 type, mfxMemId mid, FrameAllocatorBase& allocator) : mfxFrameSurfaceBaseInterface(mid, allocator) { // Surface interface level Context = static_cast(this); Version.Version = MFX_FRAMESURFACEINTERFACE_VERSION; mfxFrameSurfaceInterface::Map = &mfxFrameSurfaceInterfaceImpl::Map_impl; mfxFrameSurfaceInterface::Unmap = &mfxFrameSurfaceInterfaceImpl::Unmap_impl; mfxFrameSurfaceInterface::GetNativeHandle = &mfxFrameSurfaceInterfaceImpl::GetNativeHandle_impl; mfxFrameSurfaceInterface::GetDeviceHandle = &mfxFrameSurfaceInterfaceImpl::GetDeviceHandle_impl; mfxFrameSurfaceInterface::Synchronize = &mfxFrameSurfaceInterfaceImpl::Synchronize_impl; mfxFrameSurfaceInterface::QueryInterface = &mfxFrameSurfaceInterfaceImpl::QueryInterface_impl; // Surface representation m_internal_surface.Version.Version = MFX_FRAMESURFACE1_VERSION; m_internal_surface.Info = info; m_internal_surface.Data.MemId = mid; m_internal_surface.Data.MemType = type; m_internal_surface.FrameInterface = static_cast(this); if (!m_internal_surface.Info.BitDepthLuma) m_internal_surface.Info.BitDepthLuma = BitDepthFromFourcc(m_internal_surface.Info.FourCC); if (!m_internal_surface.Info.BitDepthChroma) m_internal_surface.Info.BitDepthChroma = m_internal_surface.Info.BitDepthLuma ? m_internal_surface.Info.BitDepthLuma : BitDepthFromFourcc(m_internal_surface.Info.FourCC); if (!m_internal_surface.Info.ChromaFormat) m_internal_surface.Info.ChromaFormat = ChromaFormatFromFourcc(m_internal_surface.Info.FourCC); m_exported_surface = m_internal_surface; } static mfxStatus Map_impl(mfxFrameSurface1* surface, mfxU32 flags) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); MFX_SAFE_CALL(reinterpret_cast(surface->FrameInterface->Context)->Lock(flags)); // User may try to Map surface using copy of mfxFrameSurface1 object, so we have to copy internally set pointers reinterpret_cast(surface->FrameInterface->Context)->CopyPointers(&surface->Data); return MFX_ERR_NONE; } static mfxStatus Unmap_impl(mfxFrameSurface1* surface) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); MFX_SAFE_CALL(reinterpret_cast(surface->FrameInterface->Context)->Unlock()); // User may try to Map surface using copy of mfxFrameSurface1 object, so we have to copy internally set pointers // (in Unmap case it means that data pointers will be zeroed if surface becomes unmapped) reinterpret_cast(surface->FrameInterface->Context)->CopyPointers(&surface->Data); return MFX_ERR_NONE; } static mfxStatus GetNativeHandle_impl(mfxFrameSurface1* surface, mfxHDL* resource, mfxResourceType* resource_type) { MFX_CHECK_NULL_PTR3(surface, resource, resource_type); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); std::tie(*resource, *resource_type) = reinterpret_cast(surface->FrameInterface->Context)->GetNativeHandle(); MFX_CHECK(*resource, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus GetDeviceHandle_impl(mfxFrameSurface1* surface, mfxHDL* device_handle, mfxHandleType* device_type) { MFX_CHECK_NULL_PTR3(surface, device_handle, device_type); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); std::tie(*device_handle, *device_type) = reinterpret_cast(surface->FrameInterface->Context)->GetDeviceHandle(); MFX_CHECK(*device_handle, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } static mfxStatus Synchronize_impl(mfxFrameSurface1* surface, mfxU32 timeout) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); return reinterpret_cast(surface->FrameInterface->Context)->Synchronize(timeout); } static mfxStatus QueryInterface_impl(mfxFrameSurface1* surface, mfxGUID guid, mfxHDL* iface) { MFX_CHECK_NULL_PTR2(surface, iface); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); if (guid == MFX_GUID_SURFACE_POOL) { *iface = reinterpret_cast(surface->FrameInterface->Context)->QueryParentPool(); MFX_CHECK(*iface, MFX_ERR_NOT_INITIALIZED); return MFX_ERR_NONE; } MFX_RETURN(MFX_ERR_UNSUPPORTED); } bool ReallocAllowed(const mfxFrameInfo& frame_info) const { mfxU16 bitdepth_luma = frame_info.BitDepthLuma ? frame_info.BitDepthLuma : BitDepthFromFourcc(frame_info.FourCC); mfxU16 bitdepth_chroma = frame_info.BitDepthChroma ? frame_info.BitDepthChroma : BitDepthFromFourcc(frame_info.FourCC); mfxU16 chroma_format = frame_info.ChromaFormat ? frame_info.ChromaFormat : ChromaFormatFromFourcc(frame_info.FourCC); bool realloc_allowed = frame_info.FourCC == m_internal_surface.Info.FourCC && bitdepth_luma == m_internal_surface.Info.BitDepthLuma && bitdepth_chroma == m_internal_surface.Info.BitDepthChroma && frame_info.Shift == m_internal_surface.Info.Shift && chroma_format == m_internal_surface.Info.ChromaFormat; return realloc_allowed; } void CopyPointers(mfxFrameData* frame_data) const { if (!frame_data) return; copy_frame_surface_pixel_pointers(*frame_data, m_internal_surface.Data); } // Will be returned to user, to protect original fields of mfxFrameSurface1 from zeroing on user side mfxFrameSurface1 m_exported_surface = {}; protected: mfxFrameSurface1 m_internal_surface = {}; mutable std::mutex m_mutex; }; class mfxSurfaceArrayImpl; template <> struct mfxRefCountableInstance { static mfxRefCountable* Get(mfxSurfaceArray* object) { return reinterpret_cast(object->Context); } }; class mfxSurfaceArrayImpl : public mfxRefCountableImpl { public: static mfxSurfaceArrayImpl* Create() { mfxSurfaceArrayImpl* surfArr = new mfxSurfaceArrayImpl(); surfArr->AddRef(); return surfArr; } void AddSurface(mfxFrameSurface1* surface) { std::lock_guard guard(m_mutex); m_surfaces.push_back(surface); if (surface) std::ignore = MFX_STS_TRACE(AddRefSurface(*surface)); Surfaces = m_surfaces.data(); NumSurfaces = (mfxU32)m_surfaces.size(); } protected: void Close() override { for (auto surface : m_surfaces) { if (surface) std::ignore = MFX_STS_TRACE(ReleaseSurface(*surface)); } } private: mfxSurfaceArrayImpl() { Context = static_cast(this); Version.Version = MFX_SURFACEARRAY_VERSION; } std::vector m_surfaces; std::mutex m_mutex; }; #ifdef MFX_ENABLE_ENCODE_STATS class mfxEncodeStatsContainerImpl : public mfxRefCountableImpl { public: mfxStatus AllocFrameStatsBuf() { std::lock_guard guard(m_mutex); if (this->EncodeFrameStats == nullptr) { this->EncodeFrameStats = new mfxEncodeFrameStats{}; MFX_CHECK(this->EncodeFrameStats, MFX_ERR_MEMORY_ALLOC); } else { *this->EncodeFrameStats = {}; } return MFX_ERR_NONE; } mfxStatus AllocBlkStatsBuf(mfxU32 numBlk) { MFX_CHECK(numBlk, MFX_ERR_INVALID_VIDEO_PARAM); std::lock_guard guard(m_mutex); if (this->EncodeBlkStats == nullptr) { this->EncodeBlkStats = new mfxEncodeBlkStats{}; MFX_CHECK(this->EncodeBlkStats, MFX_ERR_MEMORY_ALLOC); } MFX_CHECK_STS(AllocBlkStatsArray(numBlk)); return MFX_ERR_NONE; } protected: template static void Delete(T*& p) { if (p) { delete p; p = nullptr; } } template static void DeleteArray(T*& p) { if (p) { delete[] p; p = nullptr; } } template static mfxStatus AllocBlkStatsBuf(mfxU32 numBlkIn, mfxU32& numBlkOut, T*& buf) { if (numBlkIn <= numBlkOut && buf) { for (mfxU32 i = 0; i < numBlkOut; i++) { buf[i] = {}; } return MFX_ERR_NONE; } if (numBlkOut) { DeleteArray(buf); } buf = new T[numBlkIn]{}; MFX_CHECK(buf, MFX_ERR_MEMORY_ALLOC); numBlkOut = numBlkIn; return MFX_ERR_NONE; } virtual mfxStatus AllocBlkStatsArray(mfxU32 numBlk) = 0; virtual void DetroyBlkStatsArray() = 0; void Close() override { if (this->EncodeFrameStats) { Delete(this->EncodeFrameStats); } if (this->EncodeBlkStats) { DetroyBlkStatsArray(); Delete(this->EncodeBlkStats); } } protected: mfxEncodeStatsContainerImpl() { Version.Version = MFX_ENCODESTATSCONTAINER_VERSION; RefInterface.Context = static_cast(this); } std::mutex m_mutex; }; #endif // MFX_ENABLE_ENCODE_STATS class RWAcessSurface : public mfxFrameSurfaceInterfaceImpl { public: RWAcessSurface(const mfxFrameInfo & info, mfxU16 type, mfxMemId mid, FrameAllocatorBase& allocator) : mfxFrameSurfaceInterfaceImpl(info, type, mid, allocator) {} mfxStatus LockRW(std::unique_lock& guard, bool write, bool nowait); mfxStatus UnlockRW(); // Functions below should be called from thread-safe context mfxU32 NumReaders() const { return m_read_locks; } bool Locked() const { return m_write_lock || m_read_locks != 0; } private: // This class provides shared access to read (with possible wait if write lock was acquired and MFX_MAP_NOWAIT wasn't set) // and exclusive write access with immediate return if read lock was acquired std::condition_variable m_wait_before_read; mfxU32 m_read_locks = 0u; bool m_write_lock = false; }; // This stub used for allocators which don't need staging surfaces class staging_adapter_stub { public: staging_adapter_stub(mfxHDL = nullptr) {} operator mfxHDL() const { return nullptr; } void SetDevice(mfxHDL) {} }; struct mfxFrameSurface1_sw : public RWAcessSurface { static mfxFrameSurface1_sw* Create(const mfxFrameInfo& info, mfxU16 type, mfxMemId mid, std::shared_ptr& staging_adapter, mfxHDL device, mfxU32 context, FrameAllocatorBase& allocator) { auto surface = new mfxFrameSurface1_sw(info, type, mid, staging_adapter, device, context, allocator); surface->AddRef(); return surface; } ~mfxFrameSurface1_sw() { // Unmap surface if it is still mapped while (Locked()) { if (MFX_FAILED(Unlock())) break; } } mfxStatus Lock(mfxU32 flags) override; mfxStatus Unlock() override; std::pair GetNativeHandle() const override { return { nullptr, mfxResourceType(0) }; } std::pair GetDeviceHandle() const override { return { nullptr, mfxHandleType(0) }; } mfxStatus GetHDL(mfxHDL& handle) const { handle = reinterpret_cast(GetMid()); return MFX_ERR_NONE; } mfxStatus Realloc(const mfxFrameInfo & info); static mfxU16 AdjustType(mfxU16 type) { return AdjustTypeInternal(type); } protected: mfxFrameSurface1_sw(const mfxFrameInfo& info, mfxU16 type, mfxMemId mid, std::shared_ptr& staging_adapter, mfxHDL device, mfxU32 context, FrameAllocatorBase& allocator); std::unique_ptr m_data; }; using FlexibleFrameAllocatorSW = FlexibleFrameAllocator; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_allocator_vaapi.h000066400000000000000000000214461443134507600305070ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifndef _LIBMFX_ALLOCATOR_VAAPI_H_ #define _LIBMFX_ALLOCATOR_VAAPI_H_ #include #include #include "mfxvideo++int.h" #include "libmfx_allocator.h" // VAAPI Allocator internal Mem ID struct vaapiMemIdInt { VASurfaceID* m_surface; VAImage m_image; unsigned int m_fourcc; }; // Internal Allocators namespace mfxDefaultAllocatorVAAPI { mfxStatus AllocFramesHW(mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); mfxStatus LockFrameHW(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); mfxStatus GetHDLHW(mfxHDL pthis, mfxMemId mid, mfxHDL *handle); mfxStatus UnlockFrameHW(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr = nullptr); mfxStatus FreeFramesHW(mfxHDL pthis, mfxFrameAllocResponse *response); mfxStatus ReallocFrameHW(mfxHDL pthis, mfxFrameSurface1 *surf, VASurfaceID *va_surf); mfxStatus SetFrameData(const VAImage &va_image, mfxU32 mfx_fourcc, mfxU8* p_buffer, mfxFrameData& frame_data); class mfxWideHWFrameAllocator : public mfxBaseWideFrameAllocator { public: mfxWideHWFrameAllocator(mfxU16 type, mfxHDL handle); virtual ~mfxWideHWFrameAllocator(void){}; VADisplay* m_pVADisplay; mfxU32 m_DecId; std::vector m_allocatedSurfaces; std::vector m_allocatedMids; }; } // namespace mfxDefaultAllocatorVAAPI class SurfaceScopedLock { public: SurfaceScopedLock(VADisplay disp, VASurfaceID& surface_id) : m_display(disp) , m_surface_id(surface_id) {} ~SurfaceScopedLock() { if (m_mapped) std::ignore = MFX_STS_TRACE(Unmap()); if (m_image_created) std::ignore = MFX_STS_TRACE(DestroyImage()); } mfxStatus DeriveImage() { MFX_CHECK(!m_image_created, MFX_ERR_UNDEFINED_BEHAVIOR); { PERF_UTILITY_AUTO("vaDeriveImage", PERF_LEVEL_DDI); VAStatus va_sts = vaDeriveImage(m_display, m_surface_id, &m_image); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } m_image_created = true; return MFX_ERR_NONE; } // add map type when vaMapBuffer will support it mfxStatus Map(mfxU8* & ptr/*, MAP_TYPE*/) { ptr = nullptr; MFX_CHECK(m_image_created, MFX_ERR_LOCK_MEMORY); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); VAStatus va_sts = vaMapBuffer(m_display, m_image.buf, (void **)&ptr); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } m_mapped = true; return MFX_ERR_NONE; } mfxStatus Unmap() { MFX_CHECK(m_image_created, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(m_mapped, MFX_ERR_UNDEFINED_BEHAVIOR); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); VAStatus va_sts = vaUnmapBuffer(m_display, m_image.buf); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } m_mapped = false; return MFX_ERR_NONE; } mfxStatus DestroyImage() { MFX_CHECK(m_image_created, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_mapped, MFX_ERR_UNKNOWN); { PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); VAStatus va_sts = vaDestroyImage(m_display, m_image.image_id); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } m_image_created = false; return MFX_ERR_NONE; } VAImage m_image = {}; private: bool m_image_created = false; bool m_mapped = false; VADisplay m_display; VASurfaceID& m_surface_id; }; class VADisplayWrapper : public std::enable_shared_from_this { public: VADisplayWrapper(VADisplay dpy, int fdDRM = -1) : m_display(dpy) , m_fdDRM(fdDRM) {} ~VADisplayWrapper() { if (m_fdDRM != -1) { std::ignore = MFX_STS_TRACE(vaTerminate(m_display)); std::ignore = MFX_STS_TRACE(close(m_fdDRM)); } } VADisplayWrapper(const VADisplayWrapper&) = delete; VADisplayWrapper(VADisplayWrapper&& other) = default; VADisplayWrapper& operator= (const VADisplayWrapper&) = delete; VADisplayWrapper& operator= (VADisplayWrapper&& other) = default; operator VADisplay() const { return m_display; } private: VADisplay m_display; int m_fdDRM = -1; }; class vaapi_resource_wrapper { public: vaapi_resource_wrapper(VADisplayWrapper& display) : m_pVADisplay(display.shared_from_this()) {} virtual mfxStatus Lock(mfxFrameData& frame_data, mfxU32 flags) = 0; virtual mfxStatus Unlock() = 0; virtual ~vaapi_resource_wrapper() {}; VAGenericID* GetHandle() { return &m_resource_id; } VADisplayWrapper& GetDevice() { return *m_pVADisplay; } protected: VAGenericID m_resource_id; std::shared_ptr m_pVADisplay; }; class vaapi_buffer_wrapper : public vaapi_resource_wrapper { public: vaapi_buffer_wrapper(const mfxFrameInfo &info, VADisplayWrapper& display, mfxU32 context); ~vaapi_buffer_wrapper(); virtual mfxStatus Lock(mfxFrameData& frame_data, mfxU32 flags) override; virtual mfxStatus Unlock() override; private: bool m_bIsSegmap; mfxU32 m_pitch; }; class vaapi_surface_wrapper : public vaapi_resource_wrapper { public: vaapi_surface_wrapper(const mfxFrameInfo &info, mfxU16 type, VADisplayWrapper& display); ~vaapi_surface_wrapper(); virtual mfxStatus Lock(mfxFrameData& frame_data, mfxU32 flags) override; virtual mfxStatus Unlock() override; private: SurfaceScopedLock m_surface_lock; mfxU16 m_type; mfxU32 m_fourcc; }; struct mfxFrameSurface1_hw_vaapi : public RWAcessSurface { static mfxFrameSurface1_hw_vaapi* Create(const mfxFrameInfo& info, mfxU16 type, mfxMemId mid, std::shared_ptr& stg_adapter, mfxHDL display, mfxU32 context, FrameAllocatorBase& allocator) { auto surface = new mfxFrameSurface1_hw_vaapi(info, type, mid, stg_adapter, display, context, allocator); surface->AddRef(); return surface; } ~mfxFrameSurface1_hw_vaapi() { // Unmap surface if it is still mapped while (Locked()) { if (MFX_FAILED(Unlock())) break; } } mfxStatus Lock(mfxU32 flags) override; mfxStatus Unlock() override; std::pair GetNativeHandle() const override; std::pair GetDeviceHandle() const override; mfxStatus GetHDL(mfxHDL& handle) const; mfxStatus Realloc(const mfxFrameInfo & info); static mfxU16 AdjustType(mfxU16 type) { return mfxFrameSurface1_sw::AdjustType(type); } private: mfxFrameSurface1_hw_vaapi(const mfxFrameInfo& info, mfxU16 type, mfxMemId mid, std::shared_ptr& stg_adapter, mfxHDL display, mfxU32 context, FrameAllocatorBase& allocator); mutable std::shared_timed_mutex m_hdl_mutex; mfxU16 m_type; VAContextID m_context; std::unique_ptr m_resource_wrapper; }; using FlexibleFrameAllocatorHW_VAAPI = FlexibleFrameAllocator; #endif // LIBMFX_ALLOCATOR_VAAPI_H_ /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core.h000066400000000000000000001015511443134507600262730ustar00rootroot00000000000000// Copyright (c) 2007-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __LIBMFX_CORE_H__ #define __LIBMFX_CORE_H__ #include #include "umc_mutex.h" #include "libmfx_allocator.h" #include "mfxvideo.h" #include "mfxvideo++int.h" #include "mfx_ext_buffers.h" #include "fast_copy.h" #include "libmfx_core_interface.h" #include #include #include #include using AffinityMaskType = std::pair/*mask*/>; class CommonCORE : public VideoCORE { public: friend class FactoryCORE; virtual ~CommonCORE() override { Close(); } virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *handle) override; virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL handle) override; virtual mfxStatus SetBufferAllocator(mfxBufferAllocator *) override; virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) override; // Utility functions for memory access virtual mfxStatus AllocBuffer(mfxU32 nbytes, mfxU16 type, mfxMemId *mid) override; virtual mfxStatus LockBuffer(mfxMemId mid, mfxU8 **ptr) override; virtual mfxStatus UnlockBuffer(mfxMemId mid) override; virtual mfxStatus FreeBuffer(mfxMemId mid) override; // DEPRECATED virtual mfxStatus CheckHandle() override { return MFX_ERR_NONE; } virtual mfxStatus GetFrameHDL(mfxMemId mid, mfxHDL *handle, bool ExtendedSearch = true) override; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isNeedCopy = true) override; virtual mfxStatus LockFrame(mfxMemId mid, mfxFrameData *ptr) override; virtual mfxStatus UnlockFrame(mfxMemId mid, mfxFrameData *ptr = nullptr) override; virtual mfxStatus FreeFrames(mfxFrameAllocResponse *response, bool ExtendedSearch = true) override; virtual mfxStatus LockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool ExtendedSearch = true) override; virtual mfxStatus GetExternalFrameHDL(mfxMemId mid, mfxHDL *handle, bool ExtendedSearch = true) override; virtual mfxStatus UnlockExternalFrame(mfxMemId mid, mfxFrameData *ptr=0, bool ExtendedSearch = true) override; virtual mfxMemId MapIdx(mfxMemId mid) override; // Increment Surface lock caring about opaq virtual mfxStatus IncreaseReference(mfxFrameData *ptr, bool ExtendedSearch = true) override; // Decrement Surface lock caring about opaq virtual mfxStatus DecreaseReference(mfxFrameData *ptr, bool ExtendedSearch = true) override; // no care about surface, opaq and all round. Just increasing reference virtual mfxStatus IncreasePureReference(mfxU16 &Locked) override; // no care about surface, opaq and all round. Just decreasing reference virtual mfxStatus DecreasePureReference(mfxU16 &Locked) override; // Get Video Accelerator. virtual void GetVA(mfxHDL* phdl, mfxU16) override { *phdl = nullptr; } virtual mfxStatus CreateVA(mfxVideoParam *, mfxFrameAllocRequest *, mfxFrameAllocResponse *, UMC::FrameAllocator *) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } // Get the current working adapter's number virtual mfxU32 GetAdapterNumber() override { return 0; } #ifdef _MSVC_LANG #pragma warning(push) #pragma warning(disable : 26812) #endif // virtual eMFXPlatform GetPlatformType() override { return MFX_PLATFORM_SOFTWARE; } #ifdef _MSVC_LANG #pragma warning(pop) #endif // Get Video Processing virtual void GetVideoProcessing(mfxHDL* phdl) override { *phdl = 0; } virtual mfxStatus CreateVideoProcessing(mfxVideoParam *) override { MFX_RETURN(MFX_ERR_UNSUPPORTED); } // Get the current number of working threads virtual mfxU32 GetNumWorkingThreads() override { return m_numThreadsAvailable; } virtual void INeedMoreThreadsInside(const void *pComponent) override; virtual mfxStatus DoFastCopy(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) override; virtual mfxStatus DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32 = MFX_COPY_USE_ANY) override; virtual mfxStatus DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32 = MFX_COPY_USE_ANY) override; // DEPRECATED virtual bool IsFastCopyEnabled() override { return true; } virtual bool IsExternalFrameAllocator() const override; virtual eMFXHWType GetHWType() override { return MFX_HW_UNKNOWN; } virtual mfxU16 GetHWDeviceId() override { return 0; } virtual mfxStatus CopyFrame(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) override; virtual mfxStatus CopyBuffer(mfxU8 *, mfxU32, mfxFrameSurface1 *) override { MFX_RETURN(MFX_ERR_UNKNOWN); } virtual mfxStatus CopyFrameEx(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType) override { return DoFastCopyWrapper(pDst, dstMemType, pSrc, srcMemType); } virtual mfxStatus IsGuidSupported(const GUID, mfxVideoParam *, bool) override { return MFX_ERR_NONE; } virtual eMFXVAType GetVAType() const override { return MFX_HW_NO; } virtual bool SetCoreId(mfxU32 Id) override; virtual void* QueryCoreInterface(const MFX_GUID &guid) override; virtual mfxSession GetSession() override { return m_session; } virtual mfxU16 GetAutoAsyncDepth() override; // keep frame response structure describing plug-in memory surfaces void AddPluginAllocResponse(mfxFrameAllocResponse& response); // get response which corresponds required conditions: same mids and number mfxFrameAllocResponse* GetPluginAllocResponse(mfxFrameAllocResponse& temp_response); // non-virtual QueryPlatform, as we should not change vtable mfxStatus QueryPlatform(mfxPlatform* platform); protected: CommonCORE(const mfxU32 numThreadsAvailable, const mfxSession session = nullptr); class API_1_19_Adapter : public IVideoCore_API_1_19 { public: API_1_19_Adapter(CommonCORE * core) : m_core(core) {} virtual mfxStatus QueryPlatform(mfxPlatform* platform); private: CommonCORE *m_core; }; virtual mfxStatus DefaultAllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); mfxFrameAllocator* GetAllocatorAndMid(mfxMemId& mid); mfxBaseWideFrameAllocator* GetAllocatorByReq(mfxU16 type) const; virtual void Close(); mfxStatus FreeMidArray(mfxFrameAllocator* pAlloc, mfxFrameAllocResponse *response); mfxStatus RegisterMids(mfxFrameAllocResponse *response, mfxU16 memType, bool IsDefaultAlloc, mfxBaseWideFrameAllocator* pAlloc = 0); bool GetUniqID(mfxMemId& mId); bool IsEqual (const mfxFrameAllocResponse &resp1, const mfxFrameAllocResponse &resp2) const { if (resp1.NumFrameActual != resp2.NumFrameActual) return false; for (mfxU32 i=0; i < resp1.NumFrameActual; i++) { if (resp1.mids[i] != resp2.mids[i]) return false; } return true; }; typedef struct { mfxMemId InternalMid; bool isDefaultMem; mfxU16 memType; } MemDesc; typedef std::map CorrespTbl; typedef std::map AllocQueue; typedef std::map MemIDMap; CorrespTbl m_CTbl; AllocQueue m_AllocatorQueue; MemIDMap m_RespMidQ; // Number of available threads const mfxU32 m_numThreadsAvailable; // Handler to the owning session const mfxSession m_session; // Common I/F mfxWideBufferAllocator m_bufferAllocator; mfxBaseWideFrameAllocator m_FrameAllocator; mfxU32 m_NumAllocators; mfxHDL m_hdl; mfxHDL m_DXVA2DecodeHandle; mfxHDL m_D3DDecodeHandle; mfxHDL m_D3DEncodeHandle; mfxHDL m_D3DVPPHandle; bool m_bSetExtBufAlloc; bool m_bSetExtFrameAlloc; std::unique_ptr m_pMemId; std::unique_ptr m_pcAlloc; std::unique_ptr m_pFastCopy; bool m_bUseExtManager; UMC::Mutex m_guard; mfxU32 m_CoreId; EncodeHWCaps m_encode_caps; EncodeHWCaps m_encode_mbprocrate; std::vector m_PlugInMids; API_1_19_Adapter m_API_1_19; #if defined(MFX_ENABLE_PXP) mfxHDL m_pPXPCtxHdl; #endif // MFX_ENABLE_PXP mfxU16 m_deviceId; CommonCORE & operator = (const CommonCORE &) = delete; }; mfxStatus CoreDoSWFastCopy(mfxFrameSurface1 & dst, const mfxFrameSurface1 & src, int copyFlag); // Refactored MSDK 2.0 core template class deprecate_from_base : public Base { public: virtual ~deprecate_from_base() {} virtual mfxMemId MapIdx(mfxMemId mid) override { return mid; } // Clean up code from buffer allocator usage and uncomment following items /* Deprecated functionality : buffer allocator */ /* virtual mfxStatus SetBufferAllocator(mfxBufferAllocator *) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus AllocBuffer(mfxU32, mfxU16, mfxMemId *) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus LockBuffer(mfxMemId, mfxU8 **) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus UnlockBuffer(mfxMemId) override { return MFX_ERR_UNSUPPORTED; } virtual mfxStatus FreeBuffer(mfxMemId) override { return MFX_ERR_UNSUPPORTED; } */ virtual bool SetCoreId(mfxU32) override { return false; } protected: virtual mfxStatus DefaultAllocFrames(mfxFrameAllocRequest *, mfxFrameAllocResponse *) override { return MFX_ERR_UNSUPPORTED; } deprecate_from_base(const mfxU32 numThreadsAvailable, const mfxSession session = nullptr) : Base(numThreadsAvailable, session) {} deprecate_from_base(const mfxU32 adapterNum, const AffinityMaskType& affinityMask, const mfxU32 numThreadsAvailable, const mfxSession session = nullptr) : Base(adapterNum, affinityMask, numThreadsAvailable, session) {} }; class CommonCORE_VPL : public deprecate_from_base { public: friend class FactoryCORE; virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) override; virtual mfxStatus GetFrameHDL(mfxMemId mid, mfxHDL *handle, bool = true) override; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isNeedCopy = true) override; virtual mfxStatus LockFrame(mfxMemId mid, mfxFrameData *ptr) override; virtual mfxStatus UnlockFrame(mfxMemId mid, mfxFrameData *ptr = nullptr) override; virtual mfxStatus FreeFrames(mfxFrameAllocResponse *response, bool = true) override; virtual mfxStatus LockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool = true) override; virtual mfxStatus GetExternalFrameHDL(mfxMemId mid, mfxHDL *handle, bool = true) override; virtual mfxStatus UnlockExternalFrame(mfxMemId mid, mfxFrameData *ptr = nullptr, bool = true) override; std::pair Lock(mfxFrameSurface1& surf, mfxU32 flags); std::pair LockExternal(mfxFrameSurface1& surf, mfxU32 flags); std::pair LockInternal(mfxFrameSurface1& surf, mfxU32 flags); mfxStatus Unlock(mfxFrameSurface1& surf); mfxStatus UnlockExternal(mfxFrameSurface1& surf); mfxStatus UnlockInternal(mfxFrameSurface1& surf); mfxStatus SwitchMemidInSurface(mfxFrameSurface1 & surf, mfxHDLPair& handle_pair); mfxStatus DeriveMemoryType(const mfxFrameSurface1& surf, mfxU16& derived_memtype); virtual mfxStatus DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32 = MFX_COPY_USE_ANY) override; virtual mfxStatus DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32 = MFX_COPY_USE_ANY) override; virtual bool IsExternalFrameAllocator() const override; virtual mfxStatus CopyFrame(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) override; virtual void* QueryCoreInterface(const MFX_GUID &guid) override; virtual mfxStatus CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1* &surf); protected: CommonCORE_VPL(const mfxU32 numThreadsAvailable, const mfxSession session = nullptr); FrameAllocatorWrapper m_frame_allocator_wrapper; }; enum class SurfaceLockType { LOCK_NONE = 0, LOCK_GENERAL = 1, LOCK_EXTERNAL, LOCK_INTERNAL }; // Potentially can be put to std::lock_guard and etc class mfxFrameSurface1_scoped_lock { public: mfxFrameSurface1_scoped_lock(mfxFrameSurface1* surf = nullptr, CommonCORE_VPL* core = nullptr) : surf(surf) , core(core) , mid(surf ? surf->Data.MemId : nullptr) {} mfxStatus lock(mfxU32 flags = MFX_MAP_READ_WRITE, SurfaceLockType lock = SurfaceLockType::LOCK_GENERAL) { MFX_CHECK_HDL(core); MFX_CHECK_NULL_PTR1(surf); mfxStatus sts; bool was_locked = false; switch (lock) { case SurfaceLockType::LOCK_NONE: sts = MFX_ERR_NONE; break; case SurfaceLockType::LOCK_GENERAL: std::tie(sts, was_locked) = core->Lock(*surf, flags); break; case SurfaceLockType::LOCK_EXTERNAL: std::tie(sts, was_locked) = core->LockExternal(*surf, flags); break; case SurfaceLockType::LOCK_INTERNAL: std::tie(sts, was_locked) = core->LockInternal(*surf, flags); break; default: MFX_RETURN(MFX_ERR_UNKNOWN); } MFX_CHECK_STS(sts); lock_type = was_locked ? lock : SurfaceLockType::LOCK_NONE; return MFX_ERR_NONE; } mfxStatus unlock() { MFX_CHECK_HDL(core); MFX_CHECK_NULL_PTR1(surf); // In some cases MSDK zeroes memid before copying. Following assignment guarantees correct unlock in such case surf->Data.MemId = mid; switch (lock_type) { case SurfaceLockType::LOCK_NONE: return MFX_ERR_NONE; case SurfaceLockType::LOCK_GENERAL: MFX_SAFE_CALL(core->Unlock(*surf)); break; case SurfaceLockType::LOCK_EXTERNAL: MFX_SAFE_CALL(core->UnlockExternal(*surf)); break; case SurfaceLockType::LOCK_INTERNAL: MFX_SAFE_CALL(core->UnlockInternal(*surf)); break; default: MFX_RETURN(MFX_ERR_UNKNOWN); } // Do not unlock in destructor lock_type = SurfaceLockType::LOCK_NONE; return MFX_ERR_NONE; } ~mfxFrameSurface1_scoped_lock() { std::ignore = MFX_STS_TRACE(unlock()); } private: mfxFrameSurface1* surf = nullptr; CommonCORE_VPL* core = nullptr; mfxMemId mid = nullptr; SurfaceLockType lock_type = SurfaceLockType::LOCK_NONE; }; template <> struct mfxRefCountableInstance { static mfxRefCountable* Get(mfxSurfacePoolInterface* object) { return reinterpret_cast(object->Context); } }; class SurfaceCache : public mfxRefCountableImpl { public: static SurfaceCache* Create(CommonCORE_VPL& core, mfxU16 type, const mfxFrameInfo& frame_info) { auto cache = new SurfaceCache(core, type, frame_info); cache->AddRef(); return cache; } static mfxStatus SetNumSurfaces_impl(mfxSurfacePoolInterface *pool_interface, mfxU32 num_surfaces) { MFX_CHECK_NULL_PTR1(pool_interface); MFX_CHECK_HDL(pool_interface->Context); auto cache = reinterpret_cast(pool_interface->Context); return cache->UpdateLimits(num_surfaces); } static mfxStatus RevokeSurfaces_impl(mfxSurfacePoolInterface *pool_interface, mfxU32 num_surfaces) { MFX_CHECK_NULL_PTR1(pool_interface); MFX_CHECK_HDL(pool_interface->Context); auto cache = reinterpret_cast(pool_interface->Context); return cache->RevokeSurfaces(num_surfaces); } static mfxStatus GetAllocationPolicy_impl(mfxSurfacePoolInterface *pool_interface, mfxPoolAllocationPolicy *policy) { MFX_CHECK_NULL_PTR2(pool_interface, policy); MFX_CHECK_HDL(pool_interface->Context); auto cache = reinterpret_cast(pool_interface->Context); *policy = cache->ReportPolicy(); return MFX_ERR_NONE; } static mfxStatus GetMaximumPoolSize_impl(mfxSurfacePoolInterface *pool_interface, mfxU32 *size) { MFX_CHECK_NULL_PTR2(pool_interface, size); MFX_CHECK_HDL(pool_interface->Context); auto cache = reinterpret_cast(pool_interface->Context); *size = cache->ReportMaxSize(); return MFX_ERR_NONE; } static mfxStatus GetCurrentPoolSize_impl(mfxSurfacePoolInterface *pool_interface, mfxU32 *size) { MFX_CHECK_NULL_PTR2(pool_interface, size); MFX_CHECK_HDL(pool_interface->Context); auto cache = reinterpret_cast(pool_interface->Context); *size = cache->ReportCurrentSize(); return MFX_ERR_NONE; } std::chrono::milliseconds GetTimeout() const { return m_time_to_wait; } mfxStatus GetSurface(mfxFrameSurface1*& output_surface, bool emulate_zero_refcount_base = false) { return GetSurface(output_surface, m_time_to_wait, emulate_zero_refcount_base); } mfxStatus GetSurface(mfxFrameSurface1* & output_surface, std::chrono::milliseconds current_time_to_wait, bool emulate_zero_refcount_base = false) { /* Note: emulate_zero_refcount_base flag is required for some corner cases in decoders. More precisely it is required to comply with mfx_UMC_FrameAllocator adapter design: It has it's own refcounting logic (We repeat it's AddRef / Release in our "real" refcounting logic of surface), but implementation in mfx_UMC_FrameAllocator assumes that surface refcount started from zero while surface arrive, but that is not true for VPL memory, our new surfaces arrive with refcount equal to 1. So this trick is just allows us to emulate that zero refcount base, and leave mfx_UMC_FrameAllocator code as is. */ std::unique_lock lock(m_mutex); // Try to export existing surface from cache first output_surface = FreeSurfaceLookup(emulate_zero_refcount_base); if (output_surface) { return MFX_ERR_NONE; } if (m_cached_surfaces.size() >= m_limit) { using namespace std::chrono; MFX_CHECK(current_time_to_wait != 0ms, MFX_WRN_ALLOC_TIMEOUT_EXPIRED); // Cannot allocate surface, but we can wait bool wait_succeeded = m_cv_wait_free_surface.wait_for(lock, current_time_to_wait, [&output_surface, emulate_zero_refcount_base, this]() { output_surface = FreeSurfaceLookup(emulate_zero_refcount_base); return output_surface != nullptr; }); MFX_CHECK(wait_succeeded, MFX_WRN_ALLOC_TIMEOUT_EXPIRED); return MFX_ERR_NONE; } // Get the new one from allocator lock.unlock(); mfxFrameSurface1* surf = nullptr; // Surfaces returned by CreateSurface already have RefCounter == 1 mfxStatus sts = m_core.CreateSurface(m_type, m_frame_info, surf); MFX_CHECK_STS(sts); lock.lock(); m_cached_surfaces.emplace_back(*surf, *this); m_cached_surfaces.back().m_exported = true; if (emulate_zero_refcount_base) { m_cached_surfaces.back().FrameInterface->AddRef = &skip_one_addref; } output_surface = &m_cached_surfaces.back(); return MFX_ERR_NONE; } mfxFrameSurface1* FindSurface(const mfxMemId memid) { std::lock_guard guard(m_mutex); auto it = find_if(std::begin(m_cached_surfaces), std::end(m_cached_surfaces), [memid](SurfaceHolder& surface) { return surface.Data.MemId == memid; }); return it != std::end(m_cached_surfaces) ? &(*it) : nullptr; } mfxStatus SetupPolicy(const mfxExtAllocationHints& hints_buffer) { std::lock_guard guard(m_mutex); m_policy = hints_buffer.AllocationPolicy; // Setup upper limit on surface amount if (m_policy == MFX_ALLOCATION_LIMITED) { m_limit = size_t(hints_buffer.NumberToPreAllocate) + hints_buffer.DeltaToAllocateOnTheFly; } else if (m_policy != MFX_ALLOCATION_UNLIMITED) { m_limit = 0; } // Preallocate surfaces if requested if ((m_policy == MFX_ALLOCATION_LIMITED || m_policy == MFX_ALLOCATION_UNLIMITED) && hints_buffer.NumberToPreAllocate) { std::list preallocated_surfaces; mfxFrameSurface1* surf; for (mfxU32 i = 0; i < hints_buffer.NumberToPreAllocate; ++i) { MFX_SAFE_CALL(m_core.CreateSurface(m_type, m_frame_info, surf)); preallocated_surfaces.emplace_back(*surf, *this); } m_cached_surfaces = std::move(preallocated_surfaces); } m_time_to_wait = std::chrono::milliseconds(hints_buffer.Wait); return MFX_ERR_NONE; } mfxStatus UpdateLimits(mfxU32 num_surfaces_requested_by_component) { MFX_CHECK(m_policy != MFX_ALLOCATION_LIMITED && m_policy != MFX_ALLOCATION_UNLIMITED, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); std::lock_guard guard(m_mutex); switch (m_policy) { case MFX_ALLOCATION_OPTIMAL: m_limit += num_surfaces_requested_by_component; break; default: MFX_RETURN(MFX_ERR_UNKNOWN); } m_requests.push_back(num_surfaces_requested_by_component); return MFX_ERR_NONE; } mfxStatus RevokeSurfaces(mfxU32 num_surfaces_requested_by_component) { MFX_CHECK(m_policy != MFX_ALLOCATION_LIMITED && m_policy != MFX_ALLOCATION_UNLIMITED, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); std::unique_lock lock(m_mutex); auto it_to_del = std::find(std::begin(m_requests), std::end(m_requests), num_surfaces_requested_by_component); MFX_CHECK(it_to_del != std::end(m_requests), MFX_WRN_OUT_OF_RANGE); m_requests.erase(it_to_del); size_t num_to_revoke = 0; switch (m_policy) { case MFX_ALLOCATION_OPTIMAL: m_limit -= num_surfaces_requested_by_component; if (m_cached_surfaces.size() <= m_limit) return MFX_ERR_NONE; num_to_revoke = m_cached_surfaces.size() - m_limit; break; default: MFX_RETURN(MFX_ERR_UNKNOWN); } // Decommit surfaces if (num_to_revoke) { m_num_to_revoke += num_to_revoke; DecomitSurfaces(lock); } return MFX_ERR_NONE; } // Refresh called when some free surface returned to the pool void Refresh() { if (!m_num_to_revoke) { // If no surfaces to decommit, notify some waiter m_cv_wait_free_surface.notify_one(); return; } // Decommit current surface std::unique_lock lock(m_mutex); // Here look up repeated, because current surface (which was just returned to cache) may have been already exported again DecomitSurfaces(lock); } void DecomitSurfaces(std::unique_lock& outer_lock) { // Actual delete will happen after mutex unlock std::list surfaces_to_decommit; std::unique_lock lock(std::move(outer_lock)); auto should_remove_predicate = [](const SurfaceHolder& surface_holder) { // Check if surface is still owned by somebody return !surface_holder.m_exported; }; // splice_if for (auto it = std::begin(m_cached_surfaces); it != std::end(m_cached_surfaces) && m_num_to_revoke;) { auto it_to_transfer = it++; if (should_remove_predicate(*it_to_transfer)) { surfaces_to_decommit.splice(std::end(surfaces_to_decommit), m_cached_surfaces, it_to_transfer); --m_num_to_revoke; } } } mfxU32 ReportCurrentSize() const { std::lock_guard guard(m_mutex); return mfxU32(m_cached_surfaces.size()); } mfxU32 ReportMaxSize() const { std::lock_guard guard(m_mutex); return mfxU32(m_limit); } mfxPoolAllocationPolicy ReportPolicy() const { // Right now policy is not changing during runtime, so this function don't have mutex protection return m_policy; } private: SurfaceCache(CommonCORE_VPL& core, mfxU16 type, const mfxFrameInfo& frame_info) : m_core(core) , m_type((type & ~MFX_MEMTYPE_EXTERNAL_FRAME) | MFX_MEMTYPE_INTERNAL_FRAME) , m_frame_info(frame_info) { Context = this; mfxSurfacePoolInterface::SetNumSurfaces = &SurfaceCache::SetNumSurfaces_impl; mfxSurfacePoolInterface::RevokeSurfaces = &SurfaceCache::RevokeSurfaces_impl; mfxSurfacePoolInterface::GetAllocationPolicy = &SurfaceCache::GetAllocationPolicy_impl; mfxSurfacePoolInterface::GetMaximumPoolSize = &SurfaceCache::GetMaximumPoolSize_impl; mfxSurfacePoolInterface::GetCurrentPoolSize = &SurfaceCache::GetCurrentPoolSize_impl; } mfxFrameSurface1* FreeSurfaceLookup(bool emulate_zero_refcount_base = false) { // This function is called only from thread safe context, so no mutex acquiring here auto it = find_if(std::begin(m_cached_surfaces), std::end(m_cached_surfaces), [](SurfaceHolder& surface) { return !surface.m_exported; }); if (it == std::end(m_cached_surfaces)) return nullptr; it->m_exported = true; if (emulate_zero_refcount_base) { it->FrameInterface->AddRef = &skip_one_addref; } #ifndef NDEBUG it->m_was_released = false; #endif return &(*it); } static mfxStatus skip_one_addref(mfxFrameSurface1* surface) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK_HDL(surface->FrameInterface); // Return back original AddRef function surface->FrameInterface->AddRef = mfxFrameSurfaceBaseInterface::_AddRef; return MFX_ERR_NONE; } class SurfaceHolder : public mfxFrameSurface1 { public: bool m_exported = false; #ifndef NDEBUG bool m_was_released = false; #endif SurfaceHolder(mfxFrameSurface1& surf, SurfaceCache& cache) : mfxFrameSurface1(surf) , m_cache(cache) , m_surface_interface(*FrameInterface) , original_release(m_surface_interface.Release) , m_locked_count(surf.Data.Locked) { m_surface_interface.Release = proxy_release; std::ignore = vm_interlocked_inc16((volatile Ipp16u*)&m_locked_count); // Connect surface with it's pool (cache instance) reinterpret_cast(FrameInterface->Context)->SetParentPool(&m_cache); } ~SurfaceHolder() { // Untie surface from pool reinterpret_cast(FrameInterface->Context)->SetParentPool(nullptr); std::ignore = vm_interlocked_dec16((volatile Ipp16u*)&m_locked_count); m_surface_interface.Release = original_release; MFX_STS_TRACE(m_surface_interface.Release(this)); } void RefreshParentPool() { m_cache.Refresh(); } private: // To decommit surfaces on release SurfaceCache & m_cache; // Store it to protect against user zeroing this pointer mfxFrameSurfaceInterface & m_surface_interface; mfxStatus(MFX_CDECL *original_release)(mfxFrameSurface1* surface); // To mimic legacy behavior mfxU16 & m_locked_count; static mfxStatus proxy_release(mfxFrameSurface1* surface) { MFX_CHECK_NULL_PTR1(surface); MFX_CHECK_HDL(surface->FrameInterface); MFX_CHECK_HDL(surface->FrameInterface->Context); static std::mutex proxy_release_mutex; std::lock_guard lock(proxy_release_mutex); mfxU32 ref_counter = reinterpret_cast(surface->FrameInterface->Context)->GetRefCounter(); if (ref_counter > 2) { // Bypass to original release function return reinterpret_cast(surface->FrameInterface->Context)->Release(); } // Return back to pool, don't touch ref counter reinterpret_cast(surface)->m_exported = false; #ifndef NDEBUG assert(!reinterpret_cast(surface)->m_was_released); reinterpret_cast(surface)->m_was_released = true; #endif // Remove surfaces from pool if required or notify waiters about free surface reinterpret_cast(surface)->RefreshParentPool(); return MFX_ERR_NONE; } }; mutable std::mutex m_mutex; std::condition_variable m_cv_wait_free_surface; std::chrono::milliseconds m_time_to_wait = std::chrono::milliseconds(0); CommonCORE_VPL& m_core; mfxU16 m_type; mfxFrameInfo m_frame_info; mfxPoolAllocationPolicy m_policy = MFX_ALLOCATION_UNLIMITED; // Default is MFX_ALLOCATION_UNLIMITED size_t m_limit = std::numeric_limits::max(); size_t m_num_to_revoke = 0; std::list m_cached_surfaces; std::list m_requests; }; inline bool SupportsVPLFeatureSet(VideoCORE& core) { return !!core.QueryCoreInterface(MFXICommonCORE_VPL_GUID); } inline bool IsD3D9Simulation(VideoCORE& core) { bool* cored3d9on11_interface = reinterpret_cast(core.QueryCoreInterface(MFXI_IS_CORED3D9ON11_GUID)); return cored3d9on11_interface && *cored3d9on11_interface; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core_factory.h000066400000000000000000000030531443134507600300200ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __LIBMFX_CORE_FACTORY_H__ #define __LIBMFX_CORE_FACTORY_H__ #include "mfxvideo++int.h" class FactoryCORE { public: static VideoCORE* CreateCORE(eMFXVAType va_type, mfxU32 adapterNum, const std::pair> & affinityMask, mfxU32 numThreadsAvailable, mfxSession session = NULL); }; #endifoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core_hw.h000066400000000000000000000024411443134507600267670ustar00rootroot00000000000000// Copyright (c) 2007-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifndef __LIBMFX_CORE__HW_H__ #define __LIBMFX_CORE__HW_H__ mfxU32 ChooseProfile(mfxVideoParam const* param, eMFXHWType hwType); bool IsHwMvcEncSupported(); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core_interface.h000066400000000000000000000162101443134507600303100ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __LIBMFX_CORE_INTERFACE_H__ #define __LIBMFX_CORE_INTERFACE_H__ #include "mfx_common.h" #include // {1F5BB140-6BB4-416e-81FF-4A8C030FBDC6} static const MFX_GUID MFXIVideoCORE_GUID = { 0x1f5bb140, 0x6bb4, 0x416e, { 0x81, 0xff, 0x4a, 0x8c, 0x3, 0xf, 0xbd, 0xc6 } }; // {3F3C724E-E7DC-469a-A062-B6A23102F7D2} static const MFX_GUID MFXICORED3D_GUID = { 0x3f3c724e, 0xe7dc, 0x469a, { 0xa0, 0x62, 0xb6, 0xa2, 0x31, 0x2, 0xf7, 0xd2 } }; // {C9613F63-3EA3-4D8C-8B5C-96AF6DC2DB0F} static const MFX_GUID MFXICORED3D11_GUID = { 0xc9613f63, 0x3ea3, 0x4d8c, { 0x8b, 0x5c, 0x96, 0xaf, 0x6d, 0xc2, 0xdb, 0xf } }; // {B0FCB183-1A6D-4f00-8BAF-93F285ACEC93} static const MFX_GUID MFXICOREVAAPI_GUID = { 0xb0fcb183, 0x1a6d, 0x4f00, { 0x8b, 0xaf, 0x93, 0xf2, 0x85, 0xac, 0xec, 0x93 } }; // {EA851C02-7F04-4126-9045-48D8282434A5} static const MFX_GUID MFXICORE_API_1_19_GUID = { 0xea851c02, 0x7f04, 0x4126, { 0x90, 0x45, 0x48, 0xd8, 0x28, 0x24, 0x34, 0xa5 } }; // {6ED94B99-DB70-4EBB-BC5C-C7E348FC2396} static const MFX_GUID MFXIHWCAPS_GUID = { 0x6ed94b99, 0xdb70, 0x4ebb, {0xbc, 0x5c, 0xc7, 0xe3, 0x48, 0xfc, 0x23, 0x96 } }; // {0CF4CE38-EA46-456d-A179-8A026AE4E101} static const MFX_GUID MFXIHWMBPROCRATE_GUID = {0xcf4ce38, 0xea46, 0x456d, {0xa1, 0x79, 0x8a, 0x2, 0x6a, 0xe4, 0xe1, 0x1} }; // {6A0665ED-2DE0-403B-A5EE-944E5AAFA8E5} static const MFX_GUID MFXID3D11DECODER_GUID = {0x6a0665ed, 0x2de0, 0x403b, {0xa5, 0xee, 0x94, 0x4e, 0x5a, 0xaf, 0xa8, 0xe5} }; static const MFX_GUID MFXICORECM_GUID = {0xe0b78bba, 0x39d9, 0x48dc,{ 0x99, 0x29, 0xc5, 0xd6, 0x5e, 0xa, 0x6a, 0x66} }; // {1D143E80-4EA8-4238-989C-3A3ED894EFEF} static const MFX_GUID MFXICORECMCOPYWRAPPER_GUID = { 0x1d143e80, 0x4ea8, 0x4238, { 0x98, 0x9c, 0x3a, 0x3e, 0xd8, 0x94, 0xef, 0xef } }; static const MFX_GUID MFXIEXTERNALLOC_GUID = { 0x3e273bfb, 0x5e28, 0x4643, { 0x9f, 0x1d, 0x25, 0x4b, 0x0, 0xb, 0xeb, 0x96 } }; // {2AAFDAE8-F7BA-46ED-B277-B87E94F2D384} static const MFX_GUID MFXICMEnabledCore_GUID = { 0x2aafdae8, 0xf7ba, 0x46ed, { 0xb2, 0x77, 0xb8, 0x7e, 0x94, 0xf2, 0xd3, 0x84 } }; // {D53EF10E-D4CF-41A7-B1C2-D30FAB30BB64} static const MFX_GUID MFXICORE_GT_CONFIG_GUID = { 0xd53ef10e, 0xd4cf, 0x41a7,{ 0xb1, 0xc2, 0xd3, 0xf, 0xab, 0x30, 0xbb, 0x64 } }; // {2C3163A0-B061-4931-AF0D-2301AC99DA77} static const MFX_GUID MFXAllocatorWrapper_GUID = { 0x2c3163a0, 0xb061, 0x4931, {0xaf, 0x0d, 0x23, 0x01, 0xac, 0x99, 0xda, 0x77} }; // {4C849533-839F-4686-9C94-5FBC39008CD9} static const MFX_GUID MFXI_IS_CORED3D9ON11_GUID = { 0x4c849533, 0x839f, 0x4686, { 0x9c, 0x94, 0x5f, 0xbc, 0x39, 0x0, 0x8c, 0xd9 } }; // {9FCB1FD1-A6D8-43AD-B01C-EF2FB5FBD3EF} static const MFX_GUID MFXICommonCORE_VPL_GUID = { 0x9fcb1fd1, 0xa6d8, 0x43ad, { 0xb0, 0x1c, 0xef, 0x2f, 0xb5, 0xfb, 0xd3, 0xef } }; // {D12370E0-71D7-43DE-B704-B0856A414B65} static const MFX_GUID MFXIVAAPIVideoCORE_VPL_GUID = { 0xd12370e0, 0x71d7, 0x43de, { 0xb7, 0x4, 0xb0, 0x85, 0x6a, 0x41, 0x4b, 0x65 } }; // Try to obtain required interface // Declare a template to query an interface template inline T *QueryCoreInterface(VideoCORE* pUnk, const MFX_GUID &guid = T::getGuid()) { void *pInterface = NULL; // query the interface if (pUnk) { pInterface = pUnk->QueryCoreInterface(guid); // cast pointer returned to the required core interface return reinterpret_cast(pInterface); } else { return NULL; } } // T *QueryCoreInterface(MFXIUnknown *pUnk, const MFX_GUID &guid) class EncodeHWCaps { public: static const MFX_GUID getGuid() { return MFXIHWCAPS_GUID; } EncodeHWCaps() : m_encode_guid() , m_caps() , m_size() { }; virtual ~EncodeHWCaps() { if (m_caps) { free(m_caps); m_caps = NULL; } }; template mfxStatus GetHWCaps(GUID encode_guid, CAPS *hwCaps, mfxU32 array_size = 1) { if (m_caps) { if (encode_guid == m_encode_guid && m_size == array_size) { CAPS* src = reinterpret_cast(m_caps); std::copy(src, src + array_size, hwCaps); return MFX_ERR_NONE; } } return MFX_ERR_UNDEFINED_BEHAVIOR; } template mfxStatus SetHWCaps(GUID encode_guid, CAPS *hwCaps, mfxU32 array_size = 1) { if (!m_caps) { m_encode_guid = encode_guid; m_size = array_size; m_caps = malloc(sizeof(CAPS)*array_size); if (!m_caps) return MFX_ERR_MEMORY_ALLOC; std::copy(hwCaps, hwCaps + array_size, reinterpret_cast(m_caps)); } else { m_encode_guid = encode_guid; m_size = array_size; std::copy(hwCaps, hwCaps + array_size, reinterpret_cast(m_caps)); } return MFX_ERR_NONE; } protected: GUID m_encode_guid; mfxHDL m_caps; mfxU32 m_size; private: EncodeHWCaps(const EncodeHWCaps&); void operator=(const EncodeHWCaps&); }; template class ComPtrCore { public: static const MFX_GUID getGuid() { return MFXID3D11DECODER_GUID; } ComPtrCore():m_pComPtr(nullptr) { }; virtual ~ComPtrCore() { if (m_pComPtr) { m_pComPtr->Release(); m_pComPtr = nullptr; } }; ComPtrCore& operator = (T* ptr) { if (m_pComPtr != ptr) { if (m_pComPtr) m_pComPtr->Release(); m_pComPtr = ptr; } return *this; }; T* get() { return m_pComPtr; }; protected: T* m_pComPtr; }; struct VAAPIInterface { static const MFX_GUID & getGuid() { return MFXICOREVAAPI_GUID; } }; struct CMEnabledCoreInterface { static const MFX_GUID & getGuid() { return MFXICMEnabledCore_GUID; } virtual void SetCmCopyMode(mfxU16 cm_copy_mode) = 0; virtual ~CMEnabledCoreInterface() {} }; #endif // __LIBMFX_CORE_INTERFACE_H__ /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core_operation.h000066400000000000000000000125271443134507600303570ustar00rootroot00000000000000// Copyright (c) 2007-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __LIBMFX_CORE_OPERATOR_H__ #define __LIBMFX_CORE_OPERATOR_H__ #include #include #include class VideoCORE; class OperatorCORE { public: OperatorCORE(VideoCORE* pCore) : m_refCounter(1) , m_CoreCounter(0) { m_Cores.push_back(pCore); pCore->SetCoreId(0); }; mfxStatus AddCore(VideoCORE* pCore) { UMC::AutomaticUMCMutex guard(m_guard); if (m_Cores.size() == 0xFFFF) return MFX_ERR_MEMORY_ALLOC; m_Cores.push_back(pCore); pCore->SetCoreId(++m_CoreCounter); m_CoreCounter = (m_CoreCounter == 0xFFFF)?0:m_CoreCounter; return MFX_ERR_NONE; } void RemoveCore(VideoCORE* pCore) { UMC::AutomaticUMCMutex guard(m_guard); std::vector::iterator it = m_Cores.begin(); for (;it != m_Cores.end();it++) { if (*it == pCore) { m_Cores.erase(it); return; } } } // functor to run fuction from child cores template mfxStatus DoFrameOperation(func functor, arg par, arg2 out) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts; std::vector::iterator it = m_Cores.begin(); for (;it != m_Cores.end();it++) { sts = ((*it)->*functor)(par, out, false); // if it is correct Core we can return if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } // functor to run fuction from child cores template mfxStatus DoCoreOperation(func functor, arg par) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts; std::vector::iterator it = m_Cores.begin(); for (;it != m_Cores.end();it++) { sts = ((*it)->*functor)(par, false); // if it is correct Core we can return if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } // functor to get instance from child cores template void* QueryGUID(func functor, arg par) { UMC::AutomaticUMCMutex guard(m_guard); std::vector::iterator it = m_Cores.begin(); for (;it != m_Cores.end();it++) { obj* object = (obj*)((*it)->*functor)(par); // if it is correct Core we can return if (object->get()) return (void*)(object->get()); } return NULL; } // functor to run fuction from child cores template mfxFrameSurface1* GetSurface(func functor, arg par) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* pSurf; std::vector::iterator it = m_Cores.begin(); for (;it != m_Cores.end();it++) { pSurf = ((*it)->*functor)(par, false); // if it is correct Core we can return if (pSurf) return pSurf; } return 0; } // Increment reference counter of the object. virtual void AddRef(void) { vm_interlocked_inc32(&m_refCounter); }; // Decrement reference counter of the object. // If the counter is equal to zero, destructor is called and // object is removed from the memory. virtual void Release(void) { vm_interlocked_dec32(&m_refCounter); if (0 == m_refCounter) { delete this; } }; // Get the current reference counter value virtual mfxU32 GetNumRef(void) { return m_refCounter; }; // Check if we have joined sessions bool HaveJoinedSessions() { return m_Cores.size() > 1; } private: virtual ~OperatorCORE() { m_Cores.clear(); }; // self and child cores std::vector m_Cores; // Reference counters mfxU32 m_refCounter; UMC::Mutex m_guard; mfxU32 m_CoreCounter; // Forbid the assignment operator OperatorCORE & operator = (const OperatorCORE &); }; #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/libmfx_core_vaapi.h000066400000000000000000000264511443134507600274600ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #ifndef __LIBMFX_CORE__VAAPI_H__ #define __LIBMFX_CORE__VAAPI_H__ #include #include "umc_structures.h" #include "libmfx_core.h" #include "libmfx_allocator_vaapi.h" #include "libmfx_core_interface.h" #include "mfx_platform_headers.h" #include "mfx_session.h" #include "va/va.h" #include "vaapi_ext_interface.h" #if defined (MFX_ENABLE_VPP) #include "mfx_vpp_interface.h" #endif // helper struct, it is helper for conversion from between [linux/android GUIDs] and [VAProfile + VAEntryPoint] // linux/android GUIDs is defined in _studio/shared/include/mfxvideo++int.h // // GUID.Data4 is unused in current implementation, but struct stores it for correct GUID comparison // Original mapping between GUID and VAProfile: // {00000000 - 0000-0000 - 0000-000000000000} // VAProfile |VAEntryPoint| UNUSED struct VaGuidMapper { // VAEntrypoint and VAProfile is libVA enum VAProfile m_profile; VAEntrypoint m_entrypoint; unsigned char m_Data4[8] = {}; VaGuidMapper(VAProfile profile, VAEntrypoint entrypoint) : m_profile (profile), m_entrypoint (entrypoint) {} VaGuidMapper(int profile, int entrypoint) : m_profile (static_cast (profile)), m_entrypoint (static_cast (entrypoint)) {} // VaGuidMapper unpacking GUIDs VaGuidMapper(GUID guid) { m_profile = static_cast (guid.Data1); m_entrypoint = static_cast ((guid.Data2 << 16) + guid.Data3); //check to correct copy string static_assert( sizeof(guid.Data4) == sizeof(m_Data4), "Error! Can't store guid.Data4 in m_Data4."); static_assert( sizeof(*guid.Data4) == sizeof(*m_Data4), "Error! Can't store guid.Data4 in m_Data4."); std::copy(std::begin(guid.Data4), std::end(guid.Data4), std::begin(m_Data4)); } operator GUID() const { // packing enum VAProfile and VAEntrypoint to Data1 and Data2 and Data3 GUID res = { (unsigned long) m_profile, (unsigned short) (m_entrypoint >> 16), (unsigned short) (m_entrypoint & 0xffff), { m_Data4[0], m_Data4[1], m_Data4[2], m_Data4[3], m_Data4[4], m_Data4[5], m_Data4[6], m_Data4[7] }}; // check size of Data1 and Data2 and Data3 for enum VAProfile and VAEntrypoint packing static_assert( sizeof(res.Data1) >= sizeof(VAProfile), "Error! Can't store data profile in guid.data1 (unsigned long)."); static_assert((sizeof(res.Data2) + sizeof(res.Data3)) >= sizeof(VAEntrypoint), "Error! Can't store data entrypoint in guid.data2 (unsigned short) and guid.data3 (unsigned short)."); return res; } }; class CmCopyWrapper; class VACopyWrapper; // disable the "conditional expression is constant" warning #ifdef _MSVC_LANG #pragma warning(disable: 4127) #endif namespace UMC { class DXVA2Accelerator; class LinuxVideoAccelerator; }; #if defined(MFX_ENABLE_PXP) class PXPLinuxVideoAccelerator; #endif // MFX_ENABLE_PXP template class VAAPIVideoCORE_T : public Base { public: friend class FactoryCORE; friend class VAAPIVideoCORE_VPL; friend class VAAPIVideoCORE_T; class VAAPIAdapter : public VAAPIInterface { public: VAAPIAdapter(VAAPIVideoCORE_T *pVAAPICore):m_pVAAPICore(pVAAPICore) { } protected: VAAPIVideoCORE_T *m_pVAAPICore; }; class CMEnabledCoreAdapter : public CMEnabledCoreInterface { public: CMEnabledCoreAdapter(VAAPIVideoCORE_T *pVAAPICore): m_pVAAPICore(pVAAPICore) { } virtual void SetCmCopyMode(mfxU16 cm_copy_mode) override { m_pVAAPICore->SetCmCopyMode(cm_copy_mode); } protected: VAAPIVideoCORE_T *m_pVAAPICore; }; virtual ~VAAPIVideoCORE_T(); virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *handle) override; virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL handle) override; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isNeedCopy = true) override; mfxStatus ReallocFrame(mfxFrameSurface1 *surf); virtual void GetVA(mfxHDL* phdl, mfxU16 type) override { if (!phdl) return; (type & MFX_MEMTYPE_FROM_DECODE)?(*phdl = m_pVA.get()):(*phdl = 0); } // Get the current working adapter's number virtual mfxU32 GetAdapterNumber() override { return m_adapterNum; } virtual eMFXPlatform GetPlatformType() override { return MFX_PLATFORM_HARDWARE; } virtual mfxStatus DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) override; virtual mfxStatus DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) override; mfxHDL * GetFastCompositingService(); void SetOnFastCompositingService(void); bool IsFastCompositingEnabled(void) const; virtual eMFXHWType GetHWType() override; virtual mfxU16 GetHWDeviceId() override; virtual mfxStatus CreateVA(mfxVideoParam * param, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, UMC::FrameAllocator *allocator) override; // to check HW capabilities virtual mfxStatus IsGuidSupported(const GUID guid, mfxVideoParam *par, bool isEncoder = false) override; virtual eMFXVAType GetVAType() const override { return MFX_HW_VAAPI; } virtual void* QueryCoreInterface(const MFX_GUID &guid) override; #if defined (MFX_ENABLE_VPP) virtual void GetVideoProcessing(mfxHDL* phdl) override { if (!phdl) return; *phdl = &m_vpp_hw_resmng; } #endif virtual mfxStatus CreateVideoProcessing(mfxVideoParam * param) override; mfxStatus GetVAService(VADisplay *pVADisplay); void SetCmCopyMode(mfxU16 cm_copy_mode); protected: VAAPIVideoCORE_T(const mfxU32 adapterNum, const AffinityMaskType& affinityMask, const mfxU32 numThreadsAvailable, const mfxSession session = nullptr); virtual void Close() override; virtual mfxStatus DefaultAllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) override; mfxStatus CreateVideoAccelerator(mfxVideoParam * param, int profile, int NumOfRenderTarget, VASurfaceID *RenderTargets, UMC::FrameAllocator *allocator); mfxStatus ProcessRenderTargets(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, mfxBaseWideFrameAllocator* pAlloc); mfxStatus OnDeblockingInWinRegistry(mfxU32 codecId); mfxStatus CheckOrInitDisplay(); void ReleaseHandle(); bool IsCmSupported(); bool IsCmCopyEnabledByDefault(); mfxStatus TryInitializeCm(bool force_cm_device_creation); std::unique_ptr m_pVA; std::shared_ptr m_p_display_wrapper; mfxHDL m_VAConfigHandle; mfxHDL m_VAContextHandle; bool m_KeepVAState; const mfxU32 m_adapterNum; // Ordinal number of adapter to work const AffinityMaskType m_affinityMask; // Sub-device mask (for multi-tile systems) bool m_bUseExtAllocForHWFrames; std::unique_ptr m_pcHWAlloc; eMFXHWType m_HWType; eMFXGTConfig m_GTConfig; mfxU32 m_ForcedGpuCopyState = MFX_GPUCOPY_DEFAULT; std::unique_ptr m_pCmCopy; std::unique_ptr m_pVaCopy; #if defined (MFX_ENABLE_VPP) VPPHWResMng m_vpp_hw_resmng; #endif private: std::unique_ptr m_pAdapter; std::unique_ptr m_pCmAdapter; }; // Refactored MSDK 2.0 core using VAAPIVideoCORE_VPL_base = deprecate_from_base < VAAPIVideoCORE_T >; class VAAPIVideoCORE_VPL : public VAAPIVideoCORE_VPL_base { public: friend class FactoryCORE; virtual ~VAAPIVideoCORE_VPL(); virtual void* QueryCoreInterface(const MFX_GUID& guid) override; virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL handle) override; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isNeedCopy = true) override; mfxStatus ReallocFrame(mfxFrameSurface1 *surf); virtual mfxStatus DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) override; virtual mfxStatus DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) override; virtual mfxStatus CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1*& surf) override; protected: VAAPIVideoCORE_VPL(const mfxU32 adapterNum, const AffinityMaskType& affinityMask, const mfxU32 numThreadsAvailable, const mfxSession session = nullptr); }; #endif // __LIBMFX_CORE__VAAPI_H__ /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_common.h000066400000000000000000000032201443134507600261360ustar00rootroot00000000000000// Copyright (c) 2008-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_COMMON_H_ #define _MFX_COMMON_H_ #include "mfxvideo.h" #include "mfxvideo++int.h" #include "ippdefs.h" #include "mfx_utils.h" #include #include #include #include /* for std exceptions on Linux/Android */ #include "mfx_config.h" #include "mfx_functions.h" #include #define MFX_BIT_IN_KB 8*1000 #define MFX_AUTO_ASYNC_DEPTH_VALUE 5 #define MFX_MAX_ASYNC_DEPTH_VALUE 15 struct SynchronizedTask { SynchronizedTask():taskIndex(0) {} mfxU32 taskIndex; }; #endif //_MFX_COMMON_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_config.h000066400000000000000000000056101443134507600261200ustar00rootroot00000000000000// Copyright (c) 2016-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_CONFIG_H_ #define _MFX_CONFIG_H_ #include "mfxdefs.h" #include #undef UMC_VA_LINUX #define UMC_VA_LINUX // mfx_features.h is auto-generated file containing mediasdk per-component // enable defines #include "mfx_features.h" #define SYNCHRONIZATION_BY_VA_MAP_BUFFER #if !defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) #define SYNCHRONIZATION_BY_VA_SYNC_SURFACE #endif #if defined(__SSE4_1__) #define MFX_SSE_4_1 #endif #define UMC_VA #if defined(UNICODE) || defined(_UNICODE) #define MFX_UNICODE #endif #if !defined(NDEBUG) #define MFX_ENV_CFG_ENABLE #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) || defined (MFX_ENABLE_MJPEG_VIDEO_ENCODE) #define MFX_ENABLE_MJPEG_VIDEO_CODEC #endif #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) || defined (UMC_ENABLE_VC1_SPLITTER) #define MFX_ENABLE_VC1_VIDEO_CODEC #endif #if defined(ONEVPL_EXPERIMENTAL) && defined(MFX_ENABLE_PXP_EXT) #define MFX_ENABLE_PXP #endif #if defined (MFX_ENABLE_PXP) || defined (MFX_ENABLE_CP) #define MFX_ENABLE_PROTECT #endif /* * Traces */ #ifndef MFX_TRACE_DISABLE // Uncomment one or several lines below to enable tracing //#define MFX_TRACE_ENABLE_ITT #if !defined (MFX_TRACE_ENABLE_TEXTLOG) #define MFX_TRACE_ENABLE_TEXTLOG #endif //#define MFX_TRACE_ENABLE_STAT #if defined(MFX_TRACE_ENABLE_ITT) && !defined(MFX_TRACE_ENABLE_FTRACE) // Accompany ITT trace with ftrace. This combination is used by VTune. #define MFX_TRACE_ENABLE_FTRACE #endif #if defined(MFX_TRACE_ENABLE_TEXTLOG) || defined(MFX_TRACE_ENABLE_STAT) || defined(MFX_TRACE_ENABLE_ITT) || defined(MFX_TRACE_ENABLE_FTRACE) #define MFX_TRACE_ENABLE #endif #endif // #ifndef MFX_TRACE_DISABLE // Per component configs #include "mfx_config_decode.h" #include "mfx_config_encode.h" #include "mfx_config_vpp.h" #endif // _MFX_CONFIG_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_config_decode.h000066400000000000000000000033621443134507600274250ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_CONFIG_DECODE_H_ #define _MFX_CONFIG_DECODE_H_ #if !defined (DECODE_JPEG_ROTATION) #if !defined(ANDROID) && defined(__linux__) #define MFX_ENABLE_MJPEG_ROTATE_VPP #endif #endif #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) || defined(MFX_ENABLE_AV1_VIDEO_DECODE) #define UMC_ENABLE_VP9_AV1_DECODE #endif #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) #undef MFX_ENABLE_AV1_VIDEO_CODEC #define MFX_ENABLE_AV1_VIDEO_CODEC #endif #define DECODE_DEFAULT_TIMEOUT 60000 #ifdef _DEBUG #define ENABLE_JPEGD_TRACING #endif #undef ENABLE_JPEGD_ERROR_LOGGING //#define ENABLE_JPEGD_ERROR_LOGGING #undef ENABLE_JPEGD_TRACING #endif // _MFX_CONFIG_DECODE_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_config_encode.h000066400000000000000000000055051443134507600274400ustar00rootroot00000000000000// Copyright (c) 2021-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_CONFIG_ENCODE_H_ #define _MFX_CONFIG_ENCODE_H_ #define MFX_ENABLE_PARTIAL_BITSTREAM_OUTPUT //#define MFX_ENABLE_HVS_ON_ANCHOR_FRAMES #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) #undef MFX_ENABLE_H264_PRIVATE_CTRL #define MFX_ENABLE_APQ_LQ #define MFX_ENABLE_H264_REPARTITION_CHECK #define MFX_ENABLE_H264_ROUNDING_OFFSET #define MFX_ENABLE_AVC_CUSTOM_QMATRIX #define MFX_ENABLE_AVCE_VDENC_B_FRAMES #if defined(MFX_ENABLE_MCTF) && defined(MFX_ENABLE_KERNELS) #define MFX_ENABLE_MCTF_IN_AVC #endif #if defined(MFX_ENABLE_EXT) #define MFX_ENABLE_FADE_DETECTION #endif #if !defined(MFX_ENABLE_VIDEO_BRC_COMMON) #define MFX_ENABLE_VIDEO_BRC_COMMON #endif #if !defined(MFX_ENABLE_EXT_BRC) #define MFX_ENABLE_EXT_BRC #endif #endif #if defined(MFX_ENABLE_MVC_VIDEO_ENCODE) #define MFX_ENABLE_MVC_I_TO_P #define MFX_ENABLE_MVC_ADD_REF #undef MFX_ENABLE_AVC_BS #endif #if defined(MFX_ENABLE_H265_VIDEO_ENCODE) #define MFX_ENABLE_HEVCE_INTERLACE #define MFX_ENABLE_HEVCE_ROI #define MFX_ENABLE_HEVCE_WEIGHTED_PREDICTION #if !defined(MFX_ENABLE_EXT_BRC) #define MFX_ENABLE_EXT_BRC #endif #endif #if defined (MFX_ENABLE_MPEG2_VIDEO_ENCODE) #if !defined(MFX_ENABLE_VIDEO_BRC_COMMON) #define MFX_ENABLE_VIDEO_BRC_COMMON #endif #if !defined(UMC_ENABLE_VIDEO_BRC) #define UMC_ENABLE_VIDEO_BRC #endif #endif #define MFX_ENABLE_QVBR #ifdef MFX_ENABLE_ENCTOOLS #if defined(MFX_ENABLE_AENC) #define MFX_ENABLE_ADAPTIVE_ENCODE #endif #endif #ifdef ONEVPL_EXPERIMENTAL #if (!defined(LINUX32) && !defined(LINUX64)) #define MFX_ENABLE_ENCODE_STATS #endif #endif #endif // _MFX_CONFIG_ENCODE_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_config_vpp.h000066400000000000000000000032641443134507600270100ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_CONFIG_VPP_H_ #define _MFX_CONFIG_VPP_H_ #if defined(MFX_ENABLE_VPP) #define MFX_ENABLE_VPP_COMPOSITION #define MFX_ENABLE_VPP_ROTATION #define MFX_ENABLE_VPP_VIDEO_SIGNAL #define MFX_ENABLE_MJPEG_WEAVE_DI_VPP #define MFX_ENABLE_VPP_RUNTIME_HSBC #if !defined (DECODE_JPEG_ROTATION) #define MFX_ENABLE_MJPEG_ROTATE_VPP #endif //#define MFX_ENABLE_VPP_FRC #endif #if defined(MFX_ENABLE_ASC) #define MFX_ENABLE_SCENE_CHANGE_DETECTION_VPP #endif #define MFX_ENABLE_RGBP #define MFX_ENABLE_FOURCC_RGB565 #endif // _MFX_CONFIG_VPP_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_error.h000066400000000000000000000172511443134507600260100ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_config.h" #include #include namespace mfx { struct error_category : std::error_category { const char* name() const noexcept override { return "MFX"; } std::string message(int code) const noexcept override { struct message { mfxStatus code; char const* description; } const messages[] = { //from "mfxdefs.h" { MFX_ERR_NONE, "MFX_ERR_NONE" }, // : no error { MFX_ERR_UNKNOWN, "MFX_ERR_UNKNOWN" }, // : unknown error { MFX_ERR_NULL_PTR, "MFX_ERR_NULL_PTR" }, // : null pointer { MFX_ERR_UNSUPPORTED, "MFX_ERR_UNSUPPORTED" }, // : undeveloped feature { MFX_ERR_MEMORY_ALLOC, "MFX_ERR_MEMORY_ALLOC" }, // : failed to allocate memory { MFX_ERR_NOT_ENOUGH_BUFFER, "MFX_ERR_NOT_ENOUGH_BUFFER" }, // : insufficient buffer at input/output { MFX_ERR_INVALID_HANDLE, "MFX_ERR_INVALID_HANDLE" }, // : invalid handle { MFX_ERR_LOCK_MEMORY, "MFX_ERR_LOCK_MEMORY" }, // : failed to lock the memory block { MFX_ERR_NOT_INITIALIZED, "MFX_ERR_NOT_INITIALIZED" }, // : member function called before initialization { MFX_ERR_NOT_FOUND, "MFX_ERR_NOT_FOUND" }, // : the specified object is not found { MFX_ERR_MORE_DATA, "MFX_ERR_MORE_DATA" }, // : expect more data at input { MFX_ERR_MORE_SURFACE, "MFX_ERR_MORE_SURFACE" }, // : expect more surface at output { MFX_ERR_ABORTED, "MFX_ERR_ABORTED" }, // : operation aborted { MFX_ERR_DEVICE_LOST, "MFX_ERR_DEVICE_LOST" }, // : lose the HW acceleration device { MFX_ERR_INCOMPATIBLE_VIDEO_PARAM, "MFX_ERR_INCOMPATIBLE_VIDEO_PARAM" }, // : incompatible video parameters { MFX_ERR_INVALID_VIDEO_PARAM, "MFX_ERR_INVALID_VIDEO_PARAM" }, // : invalid video parameters { MFX_ERR_UNDEFINED_BEHAVIOR, "MFX_ERR_UNDEFINED_BEHAVIOR" }, // : undefined behavior { MFX_ERR_DEVICE_FAILED, "MFX_ERR_DEVICE_FAILED" }, // : device operation failure { MFX_ERR_MORE_BITSTREAM, "MFX_ERR_MORE_BITSTREAM" }, // : expect more bitstream buffers at output { MFX_ERR_GPU_HANG, "MFX_ERR_GPU_HANG" }, // : device operation failure caused by GPU hang { MFX_ERR_REALLOC_SURFACE, "MFX_ERR_REALLOC_SURFACE" }, // : bigger output surface required { MFX_ERR_RESOURCE_MAPPED, "MFX_ERR_RESOURCE_MAPPED"}, //: write access is already acquired and user requested another write access, or read access with MFX_MEMORY_NO_WAIT flag" { MFX_WRN_IN_EXECUTION, "MFX_WRN_IN_EXECUTION" }, // : the previous asynchronous operation is in execution { MFX_WRN_DEVICE_BUSY, "MFX_WRN_DEVICE_BUSY" }, // : the HW acceleration device is busy { MFX_WRN_VIDEO_PARAM_CHANGED, "MFX_WRN_VIDEO_PARAM_CHANGED" }, // : the video parameters are changed during decoding { MFX_WRN_PARTIAL_ACCELERATION, "MFX_WRN_PARTIAL_ACCELERATION" }, // : SW is used { MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, "MFX_WRN_INCOMPATIBLE_VIDEO_PARAM" }, // : incompatible video parameters { MFX_WRN_VALUE_NOT_CHANGED, "MFX_WRN_VALUE_NOT_CHANGED" }, // : the value is saturated based on its valid range { MFX_WRN_OUT_OF_RANGE, "MFX_WRN_OUT_OF_RANGE" }, // : the value is out of valid range { MFX_WRN_FILTER_SKIPPED, "MFX_WRN_FILTER_SKIPPED" }, // : one of requested filters has been skipped { MFX_ERR_NONE_PARTIAL_OUTPUT, "MFX_ERR_NONE_PARTIAL_OUTPUT" }, // : frame is not ready, but bitstream contains partial output { MFX_TASK_WORKING, "MFX_TASK_WORKING" }, // : there is some more work to do { MFX_TASK_BUSY, "MFX_TASK_BUSY" }, // : task is waiting for resources { MFX_ERR_MORE_DATA_SUBMIT_TASK, "MFX_ERR_MORE_DATA_SUBMIT_TASK" } // : return MFX_ERR_MORE_DATA but submit internal asynchronous task }; auto m = std::find_if(std::begin(messages), std::end(messages), [code](message const& m) { return m.code == code; } ); return m != std::end(messages) ? (*m).description : ""; } std::error_condition default_error_condition(int value) const noexcept override { switch (value) { case MFX_ERR_UNSUPPORTED: return std::errc::not_supported; case MFX_ERR_NULL_PTR: case MFX_ERR_INVALID_HANDLE: return std::errc::bad_address; case MFX_ERR_MEMORY_ALLOC: return std::errc::not_enough_memory; case MFX_ERR_NOT_ENOUGH_BUFFER: case MFX_ERR_MORE_BITSTREAM: return std::errc::no_buffer_space; case MFX_ERR_NOT_FOUND: return std::errc::no_such_file_or_directory; case MFX_ERR_ABORTED: return std::errc::operation_canceled; case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM: case MFX_ERR_INVALID_VIDEO_PARAM: return std::errc::invalid_argument; case MFX_ERR_UNDEFINED_BEHAVIOR: case MFX_ERR_DEVICE_FAILED: return std::errc::state_not_recoverable; case MFX_ERR_REALLOC_SURFACE: return std::errc::message_size; case MFX_ERR_RESOURCE_MAPPED: return std::errc::resource_deadlock_would_occur; case MFX_ERR_GPU_HANG: return std::errc::device_or_resource_busy; default: return std::error_condition(value, *this); } } }; inline std::error_category const& category() { static const error_category c; return c; } inline std::error_code make_error_code(mfxStatus status) { return std::error_code(int(status), category()); } inline std::error_condition make_error_condition(mfxStatus status) { return std::error_condition(int(status), category()); } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_ext_buffers.h000066400000000000000000000147601443134507600271750ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_EXT_BUFFERS_H__ #define __MFX_EXT_BUFFERS_H__ #include "mfxcommon.h" #include "mfx_config.h" #include "vm_strings.h" #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE #define MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK MFX_MAKEFOURCC('A','P','B','K') #endif #define MFX_EXTBUFF_DDI MFX_MAKEFOURCC('D','D','I','P') typedef struct { mfxExtBuffer Header; // parameters below doesn't exist in MediaSDK public API mfxU16 IntraPredCostType; // from DDI: 1=SAD, 2=SSD, 4=SATD_HADAMARD, 8=SATD_HARR mfxU16 MEInterpolationMethod; // from DDI: 1=VME4TAP, 2=BILINEAR, 4=WMV4TAP, 8=AVC6TAP mfxU16 MEFractionalSearchType; // from DDI: 1=FULL, 2=HALF, 4=SQUARE, 8=HQ, 16=DIAMOND mfxU16 MaxMVs; mfxU16 SkipCheck; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 DirectCheck; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 BiDirSearch; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 MBAFF; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 FieldPrediction; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 RefOppositeField; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 ChromaInME; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 WeightedPrediction; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 MVPrediction; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON struct { mfxU16 IntraPredBlockSize; // mask of 1=4x4, 2=8x8, 4=16x16, 8=PCM mfxU16 InterPredBlockSize; // mask of 1=16x16, 2=16x8, 4=8x16, 8=8x8, 16=8x4, 32=4x8, 64=4x4 } DDI; // MediaSDK parametrization mfxU16 BRCPrecision; // 0=default=normal, 1=lowest, 2=normal, 3=highest mfxU16 RefRaw; // (tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON) on=vme reference on raw(input) frames, off=reconstructed frames mfxU16 reserved0; mfxU16 ConstQP; // disable bit-rate control and use constant QP mfxU16 GlobalSearch; // 0=default, 1=long, 2=medium, 3=short mfxU16 LocalSearch; // 0=default, 1=type, 2=small, 3=square, 4=diamond, 5=large diamond, 6=exhaustive, 7=heavy horizontal, 8=heavy vertical mfxU16 EarlySkip; // 0=default (let driver choose), 1=enabled, 2=disabled mfxU16 LaScaleFactor; // 0=default (let msdk choose), 1=1x, 2=2x, 4=4x; Deprecated for legacy H264 encoder, for legacy use mfxExtCodingOption2::LookAheadDS instead mfxU16 IBC; // on/off - SCC IBC Mode mfxU16 Palette; // on/off - SCC Palette Mode mfxU16 StrengthN; // strength=StrengthN/100.0 mfxU16 FractionalQP; // 0=disabled (default), 1=enabled mfxU16 NumActiveRefP; // mfxU16 NumActiveRefBL0; // mfxU16 DisablePSubMBPartition; // tri-state, default depends on Profile and Level mfxU16 DisableBSubMBPartition; // tri-state, default depends on Profile and Level mfxU16 WeightedBiPredIdc; // 0 - off, 1 - explicit (unsupported), 2 - implicit mfxU16 DirectSpatialMvPredFlag; // (tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON)on=spatial on, off=temporal on mfxU16 Transform8x8Mode; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON mfxU16 reserved3; // 0..255 mfxU16 LongStartCodes; // tri-state, use long start-codes for all NALU mfxU16 CabacInitIdcPlus1; // 0 - use default value, 1 - cabac_init_idc = 0 and so on mfxU16 NumActiveRefBL1; // mfxU16 QpUpdateRange; // mfxU16 RegressionWindow; // mfxU16 LookAheadDependency; // LookAheadDependency < LookAhead mfxU16 Hme; // tri-state mfxU16 reserved4; // mfxU16 WriteIVFHeaders; // tri-state mfxU16 RefreshFrameContext; mfxU16 ChangeFrameContextIdxForTS; mfxU16 SuperFrameForTS; mfxU16 QpAdjust; // on/off - forces sps.QpAdjustment mfxU16 TMVP; // tri-state: 0, MFX_CODINGOPTION_OFF, MFX_CODINGOPTION_ON } mfxExtCodingOptionDDI; #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) #define MFX_EXTBUFF_GPU_HANG MFX_MAKEFOURCC('H','A','N','G') typedef struct { mfxExtBuffer Header; } mfxExtIntGPUHang; #endif #if defined(MFX_ENABLE_ENCTOOLS_LPLA) #define MFX_EXTBUFF_LP_LOOKAHEAD MFX_MAKEFOURCC('L','P','L','A') typedef struct { mfxExtBuffer Header; mfxU16 LookAheadDepth; mfxU16 InitialDelayInKB; mfxU16 BufferSizeInKB; mfxU16 TargetKbps; mfxU8 LookAheadScaleX; mfxU8 LookAheadScaleY; mfxU16 GopRefDist; mfxU16 MaxAdaptiveGopSize; mfxU16 MinAdaptiveGopSize; mfxU32 codecTypeInEncodePass; mfxU16 reserved[18]; } mfxExtLplaParam; #define MFX_EXTBUFF_LPLA_STATUS MFX_MAKEFOURCC('L', 'P', 'L', 'S') typedef struct { mfxExtBuffer Header; mfxU32 StatusReportFeedbackNumber; mfxU8 CqmHint; // Custom quantization matrix hint. 0x00 - flat matrix; 0x01 - CQM; 0xFF - invalid hint; other values are reserved. mfxU8 IntraHint; mfxU8 MiniGopSize; mfxU8 QpModulationStrength; mfxU32 TargetFrameSize; mfxU32 TargetBufferFullnessInBit; mfxU16 reserved[19]; } mfxExtLpLaStatus; #endif #endif // __MFX_EXT_BUFFERS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_functions.h000066400000000000000000000434441443134507600266720ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_FUNCTIONS_H_ #define _MFX_FUNCTIONS_H_ /* When public API function is called from RT library - the call goes to dispatcher's exported function instead of internal (RT's) one. Since session object differs between RT and dispatcher this can lead to seg. fault. To avoid this we 1. have to mangle (w/ some prefix) RT's functions implementation and internally use only mangled functions 2. to mangle the function we will use a macro-based substitution, in such way that any public API function will be automatically aliased w/ help of APIImpl_ symbol, for example MFXClose -> APIImpl_MFXClose 3. to export correct (de-mangled) symbols we need to create dedicated translation unit (w/o macro-based substitution) where we will dispatch calls to mangled functions. */ #include "mfxvideo.h" #include "mfximplcaps.h" #include "mfxdeprecated.h" #include "mfxplugin.h" #if !defined(MFX_API_FUNCTION_IMPL) #define MFX_API_FUNCTION_IMPL(NAME, RTYPE, ARGS_DECL, ARGS) RTYPE APIImpl_##NAME ARGS_DECL; #define MFXInit APIImpl_MFXInit #define MFXClose APIImpl_MFXClose #define MFXQueryIMPL APIImpl_MFXQueryIMPL #define MFXQueryVersion APIImpl_MFXQueryVersion #define MFXJoinSession APIImpl_MFXJoinSession #define MFXDisjoinSession APIImpl_MFXDisjoinSession #define MFXCloneSession APIImpl_MFXCloneSession #define MFXSetPriority APIImpl_MFXSetPriority #define MFXGetPriority APIImpl_MFXGetPriority #define MFXVideoCORE_SetBufferAllocator APIImpl_MFXVideoCORE_SetBufferAllocator #define MFXVideoCORE_SetFrameAllocator APIImpl_MFXVideoCORE_SetFrameAllocator #define MFXVideoCORE_SetHandle APIImpl_MFXVideoCORE_SetHandle #define MFXVideoCORE_GetHandle APIImpl_MFXVideoCORE_GetHandle #define MFXVideoCORE_QueryPlatform APIImpl_MFXVideoCORE_QueryPlatform #define MFXVideoCORE_SyncOperation APIImpl_MFXVideoCORE_SyncOperation #define MFXVideoENCODE_Query APIImpl_MFXVideoENCODE_Query #define MFXVideoENCODE_QueryIOSurf APIImpl_MFXVideoENCODE_QueryIOSurf #define MFXVideoENCODE_Init APIImpl_MFXVideoENCODE_Init #define MFXVideoENCODE_Reset APIImpl_MFXVideoENCODE_Reset #define MFXVideoENCODE_Close APIImpl_MFXVideoENCODE_Close #define MFXVideoENCODE_GetVideoParam APIImpl_MFXVideoENCODE_GetVideoParam #define MFXVideoENCODE_GetEncodeStat APIImpl_MFXVideoENCODE_GetEncodeStat #define MFXVideoENCODE_EncodeFrameAsync APIImpl_MFXVideoENCODE_EncodeFrameAsync #define MFXVideoDECODE_Query APIImpl_MFXVideoDECODE_Query #define MFXVideoDECODE_DecodeHeader APIImpl_MFXVideoDECODE_DecodeHeader #define MFXVideoDECODE_QueryIOSurf APIImpl_MFXVideoDECODE_QueryIOSurf #define MFXVideoDECODE_Init APIImpl_MFXVideoDECODE_Init #define MFXVideoDECODE_Reset APIImpl_MFXVideoDECODE_Reset #define MFXVideoDECODE_Close APIImpl_MFXVideoDECODE_Close #define MFXVideoDECODE_GetVideoParam APIImpl_MFXVideoDECODE_GetVideoParam #define MFXVideoDECODE_GetDecodeStat APIImpl_MFXVideoDECODE_GetDecodeStat #define MFXVideoDECODE_SetSkipMode APIImpl_MFXVideoDECODE_SetSkipMode #define MFXVideoDECODE_GetPayload APIImpl_MFXVideoDECODE_GetPayload #define MFXVideoDECODE_DecodeFrameAsync APIImpl_MFXVideoDECODE_DecodeFrameAsync #define MFXVideoVPP_Query APIImpl_MFXVideoVPP_Query #define MFXVideoVPP_QueryIOSurf APIImpl_MFXVideoVPP_QueryIOSurf #define MFXVideoVPP_Init APIImpl_MFXVideoVPP_Init #define MFXVideoVPP_Reset APIImpl_MFXVideoVPP_Reset #define MFXVideoVPP_Close APIImpl_MFXVideoVPP_Close #define MFXVideoVPP_GetVideoParam APIImpl_MFXVideoVPP_GetVideoParam #define MFXVideoVPP_GetVPPStat APIImpl_MFXVideoVPP_GetVPPStat #define MFXVideoVPP_RunFrameVPPAsync APIImpl_MFXVideoVPP_RunFrameVPPAsync #define MFXVideoVPP_RunFrameVPPAsyncEx APIImpl_MFXVideoVPP_RunFrameVPPAsyncEx #define MFXVideoVPP_ProcessFrameAsync APIImpl_MFXVideoVPP_ProcessFrameAsync #define MFXVideoUSER_Register APIImpl_MFXVideoUSER_Register #define MFXVideoUSER_Unregister APIImpl_MFXVideoUSER_Unregister #define MFXVideoUSER_GetPlugin APIImpl_MFXVideoUSER_GetPlugin #define MFXVideoUSER_ProcessFrameAsync APIImpl_MFXVideoUSER_ProcessFrameAsync #define MFXVideoENC_Query APIImpl_MFXVideoENC_Query #define MFXVideoENC_QueryIOSurf APIImpl_MFXVideoENC_QueryIOSurf #define MFXVideoENC_Init APIImpl_MFXVideoENC_Init #define MFXVideoENC_Reset APIImpl_MFXVideoENC_Reset #define MFXVideoENC_Close APIImpl_MFXVideoENC_Close #define MFXVideoENC_ProcessFrameAsync APIImpl_MFXVideoENC_ProcessFrameAsync #define MFXVideoPAK_Query APIImpl_MFXVideoPAK_Query #define MFXVideoPAK_QueryIOSurf APIImpl_MFXVideoPAK_QueryIOSurf #define MFXVideoPAK_Init APIImpl_MFXVideoPAK_Init #define MFXVideoPAK_Reset APIImpl_MFXVideoPAK_Reset #define MFXVideoPAK_Close APIImpl_MFXVideoPAK_Close #define MFXVideoPAK_ProcessFrameAsync APIImpl_MFXVideoPAK_ProcessFrameAsync #define MFXInitEx APIImpl_MFXInitEx #define MFXDoWork APIImpl_MFXDoWork #define MFXVideoENC_GetVideoParam APIImpl_MFXVideoENC_GetVideoParam #define MFXVideoPAK_GetVideoParam APIImpl_MFXVideoPAK_GetVideoParam #define MFXMemory_GetSurfaceForEncode APIImpl_MFXMemory_GetSurfaceForEncode #define MFXMemory_GetSurfaceForDecode APIImpl_MFXMemory_GetSurfaceForDecode #define MFXMemory_GetSurfaceForVPP APIImpl_MFXMemory_GetSurfaceForVPP #define MFXMemory_GetSurfaceForVPPOut APIImpl_MFXMemory_GetSurfaceForVPPOut #define MFXVideoDECODE_VPP_Init APIImpl_MFXVideoDECODE_VPP_Init #define MFXVideoDECODE_VPP_DecodeFrameAsync APIImpl_MFXVideoDECODE_VPP_DecodeFrameAsync #define MFXVideoDECODE_VPP_Reset APIImpl_MFXVideoDECODE_VPP_Reset #define MFXVideoDECODE_VPP_Close APIImpl_MFXVideoDECODE_VPP_Close #define MFXVideoDECODE_VPP_GetChannelParam APIImpl_MFXVideoDECODE_VPP_GetChannelParam #define MFXInitialize APIImpl_MFXInitialize #define MFXQueryImplsDescription APIImpl_MFXQueryImplsDescription #define MFXReleaseImplDescription APIImpl_MFXReleaseImplDescription #endif //defined(MFX_DECLARE_API_FUNCTIONS_WRAPPERS) MFX_API_FUNCTION_IMPL(MFXInit, mfxStatus, (mfxIMPL implParam, mfxVersion* ver, mfxSession* session), (implParam, ver, session)) MFX_API_FUNCTION_IMPL(MFXClose, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXQueryIMPL, mfxStatus, (mfxSession session, mfxIMPL* impl), (session, impl)) MFX_API_FUNCTION_IMPL(MFXQueryVersion, mfxStatus, (mfxSession session, mfxVersion* pVersion), (session, pVersion)) MFX_API_FUNCTION_IMPL(MFXJoinSession, mfxStatus, (mfxSession session, mfxSession child_session), (session, child_session)) MFX_API_FUNCTION_IMPL(MFXDisjoinSession, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXCloneSession, mfxStatus, (mfxSession session, mfxSession* clone), (session, clone)) MFX_API_FUNCTION_IMPL(MFXSetPriority, mfxStatus, (mfxSession session, mfxPriority priority), (session, priority)) MFX_API_FUNCTION_IMPL(MFXGetPriority, mfxStatus, (mfxSession session, mfxPriority* priority), (session, priority)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_SetBufferAllocator, mfxStatus, (mfxSession session, mfxBufferAllocator* allocator), (session, allocator)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_SetFrameAllocator, mfxStatus, (mfxSession session, mfxFrameAllocator* allocator), (session, allocator)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_SetHandle, mfxStatus, (mfxSession session, mfxHandleType type, mfxHDL hdl), (session, type, hdl)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_GetHandle, mfxStatus, (mfxSession session, mfxHandleType type, mfxHDL* hdl), (session, type, hdl)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_QueryPlatform, mfxStatus, (mfxSession session, mfxPlatform* platform), (session, platform)) MFX_API_FUNCTION_IMPL(MFXVideoCORE_SyncOperation, mfxStatus, (mfxSession session, mfxSyncPoint syncp, mfxU32 wait), (session, syncp, wait)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_Query, mfxStatus, (mfxSession session, mfxVideoParam* in, mfxVideoParam* out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_QueryIOSurf, mfxStatus, (mfxSession session, mfxVideoParam* par, mfxFrameAllocRequest* request), (session, par, request)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_Init, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_Reset, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_GetVideoParam, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_GetEncodeStat, mfxStatus, (mfxSession session, mfxEncodeStat* stat), (session, stat)) MFX_API_FUNCTION_IMPL(MFXVideoENCODE_EncodeFrameAsync, mfxStatus, (mfxSession session, mfxEncodeCtrl* ctrl, mfxFrameSurface1* surface, mfxBitstream* bs, mfxSyncPoint* syncp), (session, ctrl, surface, bs, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_Query, mfxStatus, (mfxSession session, mfxVideoParam* in, mfxVideoParam* out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_DecodeHeader, mfxStatus, (mfxSession session, mfxBitstream* bs, mfxVideoParam* par), (session, bs, par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_QueryIOSurf, mfxStatus, (mfxSession session, mfxVideoParam* par, mfxFrameAllocRequest* request), (session, par, request)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_Init, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_Reset, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_GetVideoParam, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_GetDecodeStat, mfxStatus, (mfxSession session, mfxDecodeStat* stat), (session, stat)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_SetSkipMode, mfxStatus, (mfxSession session, mfxSkipMode mode), (session, mode)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_GetPayload, mfxStatus, (mfxSession session, mfxU64* ts, mfxPayload* payload), (session, ts, payload)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_DecodeFrameAsync, mfxStatus, (mfxSession session, mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, mfxSyncPoint* syncp), (session, bs, surface_work, surface_out, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_Query, mfxStatus, (mfxSession session, mfxVideoParam* in, mfxVideoParam* out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_QueryIOSurf, mfxStatus, (mfxSession session, mfxVideoParam* par, mfxFrameAllocRequest request[2]), (session, par, request)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_Init, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_Reset, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_GetVideoParam, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_GetVPPStat, mfxStatus, (mfxSession session, mfxVPPStat* stat), (session, stat)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_RunFrameVPPAsync, mfxStatus, (mfxSession session, mfxFrameSurface1* in, mfxFrameSurface1* out, mfxExtVppAuxData* aux, mfxSyncPoint* syncp), (session, in, out, aux, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_RunFrameVPPAsyncEx, mfxStatus, (mfxSession session, mfxFrameSurface1* in, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, mfxSyncPoint* syncp), (session, in, surface_work, surface_out, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoUSER_Register, mfxStatus, (mfxSession session, mfxU32 type, const mfxPlugin* par), (session, type, par)) MFX_API_FUNCTION_IMPL(MFXVideoUSER_Unregister, mfxStatus, (mfxSession session, mfxU32 type), (session, type)) MFX_API_FUNCTION_IMPL(MFXVideoUSER_GetPlugin, mfxStatus, (mfxSession session, mfxU32 type, mfxPlugin* par), (session, type, par)) MFX_API_FUNCTION_IMPL(MFXVideoUSER_ProcessFrameAsync, mfxStatus, (mfxSession session, const mfxHDL* in, mfxU32 in_num, const mfxHDL* out, mfxU32 out_num, mfxSyncPoint* syncp), (session, in, in_num, out, out_num, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoENC_Query, mfxStatus, (mfxSession session, mfxVideoParam* in, mfxVideoParam* out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXVideoENC_QueryIOSurf, mfxStatus, (mfxSession session, mfxVideoParam* par, mfxFrameAllocRequest* request), (session, par, request)) MFX_API_FUNCTION_IMPL(MFXVideoENC_Init, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoENC_Reset, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoENC_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoENC_ProcessFrameAsync, mfxStatus, (mfxSession session, mfxENCInput* in, mfxENCOutput* out, mfxSyncPoint* syncp), (session, in, out, syncp)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_Query, mfxStatus, (mfxSession session, mfxVideoParam* in, mfxVideoParam* out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_QueryIOSurf, mfxStatus, (mfxSession session, mfxVideoParam* par, mfxFrameAllocRequest* request), (session, par, request)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_Init, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_Reset, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_ProcessFrameAsync, mfxStatus, (mfxSession session, mfxPAKInput* in, mfxPAKOutput* out, mfxSyncPoint* syncp), (session, in, out, syncp)) MFX_API_FUNCTION_IMPL(MFXInitEx, mfxStatus, (mfxInitParam par, mfxSession* session), (par, session)) MFX_API_FUNCTION_IMPL(MFXDoWork, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoENC_GetVideoParam, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoPAK_GetVideoParam, mfxStatus, (mfxSession session, mfxVideoParam* par), (session, par)) MFX_API_FUNCTION_IMPL(MFXVideoVPP_ProcessFrameAsync, mfxStatus, (mfxSession session, mfxFrameSurface1* in, mfxFrameSurface1** out), (session, in, out)) MFX_API_FUNCTION_IMPL(MFXMemory_GetSurfaceForEncode, mfxStatus, (mfxSession session, mfxFrameSurface1** output_surf), (session, output_surf)) MFX_API_FUNCTION_IMPL(MFXMemory_GetSurfaceForDecode, mfxStatus, (mfxSession session, mfxFrameSurface1** output_surf), (session, output_surf)) MFX_API_FUNCTION_IMPL(MFXMemory_GetSurfaceForVPP, mfxStatus, (mfxSession session, mfxFrameSurface1** output_surf), (session, output_surf)) MFX_API_FUNCTION_IMPL(MFXMemory_GetSurfaceForVPPOut, mfxStatus, (mfxSession session, mfxFrameSurface1** output_surf), (session, output_surf)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_VPP_Init, mfxStatus, (mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par), (session, decode_par, vpp_par_array, num_channel_par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_VPP_DecodeFrameAsync, mfxStatus, (mfxSession session, mfxBitstream* bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray** surf_array_out), (session, bs, skip_channels, num_skip_channels, surf_array_out)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_VPP_Reset, mfxStatus, (mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par), (session, decode_par, vpp_par_array, num_channel_par)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_VPP_Close, mfxStatus, (mfxSession session), (session)) MFX_API_FUNCTION_IMPL(MFXVideoDECODE_VPP_GetChannelParam, mfxStatus, (mfxSession session, mfxVideoChannelParam* par, mfxU32 channel_id), (session, par, channel_id)) MFX_API_FUNCTION_IMPL(MFXInitialize, mfxStatus, (mfxInitializationParam param, mfxSession* session), (param, session)) MFX_API_FUNCTION_IMPL(MFXQueryImplsDescription, mfxHDL*, (mfxImplCapsDeliveryFormat format, mfxU32* num_impls), (format, num_impls)) MFX_API_FUNCTION_IMPL(MFXReleaseImplDescription, mfxStatus, (mfxHDL hdl), (hdl)) #undef MFX_API_FUNCTION_IMPL #endif //_MFX_FUNCTIONS_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_h264_ex_param_buf.h000066400000000000000000000037731443134507600300560ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_H264_EX_PARAM_BUF_H_ #define _MFX_H264_EX_PARAM_BUF_H_ #include "mfxvideo.h" /*------------------- CUCs definition ---------------------------------------*/ /* MFX_CUC_VC1_FRAMELABEL FrameCUC Extended buffer Buffer for storing indexes of inner ME frames. Not necessary. Used only for performance optimization. Structure: ExtVC1FrameLabel MFX_LABEL_FRAMELIST */ #define MFX_CUC_H264_FRAMELABEL MFX_MAKEFOURCC('C','U','1','6') /*--------------- Additional structures ---------------------------------------*/ typedef struct { mfxI16 index; mfxU16 coef; } MFX_H264_Coefficient; /*---------Extended buffer descriptions ----------------------------------------*/ struct ExtH264ResidCoeffs { mfxU32 CucId; // MFX_CUC_VC1_FRAMELABEL mfxU32 CucSz; mfxU32 numIndexes; MFX_H264_Coefficient* Coeffs; }; #endif //_MFX_H264_EX_PARAM_BUF_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_reflect.h000066400000000000000000000223631443134507600263030ustar00rootroot00000000000000// Copyright (c) 2017-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include #include //for memcmp on Linux #include #include #include #include #include "mfx_config.h" #include namespace mfx_reflect { class ReflectedField; class ReflectedType; class ReflectedTypesCollection; class ReflectedField { public: typedef std::shared_ptr SP; typedef std::vector FieldsCollection; typedef FieldsCollection::const_iterator FieldsCollectionCI; ReflectedType* FieldType; ReflectedType* AggregatingType; const std::string & FieldTypeName; //single C++ type may have several typedef aliases. This is original name that was used for this field declaration. size_t Offset; const std::string FieldName; size_t Count; ReflectedTypesCollection * m_pCollection; void * GetAddress(void *pBase) { return ((unsigned char*)pBase) + Offset; } protected: ReflectedField(ReflectedTypesCollection *pCollection, ReflectedType* aggregatingType, ReflectedType* fieldType, const std::string& fieldTypeName, size_t offset, const std::string& fieldName, size_t count) : FieldType(fieldType) , AggregatingType(aggregatingType) , FieldTypeName(fieldTypeName) , Offset(offset) , FieldName(fieldName) , Count(count) , m_pCollection(pCollection) { } friend class ReflectedType; }; class ReflectedType { public: std::type_index m_TypeIndex; std::list< std::string > TypeNames; size_t Size; ReflectedTypesCollection *m_pCollection; bool m_bIsPointer; unsigned int ExtBufferId; ReflectedType(ReflectedTypesCollection *pCollection, std::type_index typeIndex, const std::string& typeName, size_t size, bool isPointer, unsigned int extBufferId); ReflectedField::SP AddField(std::type_index typeIndex, const std::string &typeName, size_t typeSize, bool isPointer, size_t offset, const std::string &fieldName, size_t count, unsigned int extBufferId); ReflectedField::FieldsCollectionCI FindField(const std::string& fieldName) const; ReflectedField::FieldsCollection m_Fields; typedef std::shared_ptr SP; typedef std::list< std::string> StringList; }; class ReflectedTypesCollection { public: typedef std::map Container; Container m_KnownTypes; template ReflectedType::SP FindExistingType() { return FindExistingType(std::type_index(typeid(T))); } ReflectedType::SP FindExistingByTypeInfoName(const char* name); ReflectedType::SP FindExistingType(std::type_index typeIndex); ReflectedType::SP FindExtBufferTypeById(unsigned int ExtBufferId); ReflectedType::SP DeclareType(std::type_index typeIndex, const std::string& typeName, size_t typeSize, bool isPointer, unsigned int extBufferId); ReflectedType::SP FindOrDeclareType(std::type_index typeIndex, const std::string& typeName, size_t typeSize, bool isPointer, unsigned int extBufferId); void DeclareMsdkStructs(); }; template class AccessorBase { public: void * m_P; const T* m_pReflection; AccessorBase(void *p, const T &reflection) : m_P(p) , m_pReflection(&reflection) {} typedef std::shared_ptr P; template const ORIGINAL_TYPE& Get() const { return *((const ORIGINAL_TYPE*)m_P); } }; template class IterableAccessor : public AccessorBase < T > { public: I m_Iterator; IterableAccessor(void *p, I iterator) : AccessorBase(p, *(*iterator)) , m_Iterator(iterator) {} }; class AccessorType; class AccessorField : public IterableAccessor < ReflectedField, ReflectedField::FieldsCollectionCI > { public: AccessorField(const AccessorType &baseStruct, ReflectedField::FieldsCollectionCI iterator) : IterableAccessor(NULL, iterator) , m_BaseStruct(baseStruct) { m_IndexElement = 0; SetFieldAddress(); } size_t GetIndexElement() const { return m_IndexElement; } void SetIndexElement(size_t index) { if (index >= m_pReflection->Count) { throw std::invalid_argument(std::string("Index is not valid")); } m_IndexElement = index; SetFieldAddress(); } void Move(std::ptrdiff_t delta) { this->m_P = (char*)this->m_P + delta; } AccessorField& operator++(); bool Equal(const AccessorField& field) const { if (field.m_pReflection != m_pReflection) { throw std::invalid_argument(std::string("Types mismatch")); } if (field.m_IndexElement != m_IndexElement) { throw std::invalid_argument(std::string("Indices mismatch")); } size_t size = m_pReflection->FieldType->Size; return (0 == memcmp(m_P, field.m_P, size)); } AccessorType AccessSubtype() const; bool IsValid() const; protected: void SetFieldAddress(); const AccessorType &m_BaseStruct; size_t m_IndexElement; void SetIterator(ReflectedField::FieldsCollectionCI iterator) { m_Iterator = iterator; m_pReflection = (*m_Iterator).get(); SetFieldAddress(); } }; class AccessorType : public AccessorBase < ReflectedType > { public: AccessorType(void *p, const ReflectedType &reflection) : AccessorBase(p, reflection) {} AccessorField AccessField(ReflectedField::FieldsCollectionCI iter) const; AccessorField AccessField(const std::string& fieldName) const; AccessorField AccessFirstField() const; AccessorType AccessSubtype(const std::string& fieldName) const; }; class AccessibleTypesCollection : public ReflectedTypesCollection { public: AccessibleTypesCollection() : m_bIsInitialized(false) {} bool m_bIsInitialized; template AccessorType Access(T *p) { ReflectedType::SP pType = FindExistingType(std::type_index(typeid(T))); if (pType == NULL) { throw std::invalid_argument(std::string("Unknown type")); } else { return AccessorType(p, *pType); } } }; class TypeComparisonResult; typedef std::shared_ptr TypeComparisonResultP; struct FieldComparisonResult { AccessorField accessorField1; AccessorField accessorField2; TypeComparisonResultP subtypeComparisonResultP; }; class TypeComparisonResult : public std::list < FieldComparisonResult > { public: list extBufferIdList; }; typedef std::shared_ptr AccessorTypeP; TypeComparisonResultP CompareTwoStructs(AccessorType data1, AccessorType data2); std::string CompareStructsToString(AccessorType data1, AccessorType data2); void PrintStuctsComparisonResult(std::ostream& comparisonResult, const std::string& prefix, const TypeComparisonResultP& result); template bool PrintFieldIfTypeMatches(std::ostream& stream, AccessorField field); void PrintFieldValue(std::ostream &stream, AccessorField field); std::ostream& operator<< (std::ostream& stream, AccessorField field); std::ostream& operator<< (std::ostream& stream, AccessorType data); template ReflectedType::SP DeclareTypeT(ReflectedTypesCollection& collection, const std::string typeName); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_search_dll.h000066400000000000000000000024571443134507600267610ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined(__MFX_SEARCH_DLL_H) #define __MFX_SEARCH_DLL_H #include // declare max buffer length for DLL path enum { MFX_MAX_DLL_PATH = 1024 }; #endif // __MFX_SEARCH_DLL_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_timing.h000066400000000000000000000073441443134507600261500ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TIMING_H__ #define __MFX_TIMING_H__ //uncomment this define for timing instrumentation //#define MFX_TIMING #define MFX_TIMING_CHECK_REGISTRY 0x10000000 #define MFX_TIMING_PROXY_LIBSW 0x20000000 #define MFX_TIMING_PROXY_LIBHW 0x40000000 #define MFX_INVALID_STATUS_CODE (int)0xffff // for SetInput/SetOutput enum { MFX_COMP_DECODE = 1, MFX_COMP_VPP = 2, MFX_COMP_ENCODE = 3, }; #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif namespace MFX { #ifndef MFX_TIMING // empty declaration for normal build class AutoTimer { public: static int Init(const void * /*filename*/, int /*level = -1*/) { return 0; } static unsigned int CreateUniqTaskId() {return 0;} AutoTimer(const char * /*name*/) {} AutoTimer(const char * /*name*/, const char * /*param*/, int /*parami = 0*/) {} AutoTimer(const char * /*name*/, bool /*bCreateId*/, unsigned int /*child_of*/, unsigned int /*parent_of*/) {} ~AutoTimer() {}; AutoTimer() {}; void SetInput(void * /*handle*/, int /*component_index = -1*/) {}; void SetOutput(void * /*handle*/, int /*component_index = -1*/) {}; void AddParam(const char * /*param_name*/, const char * /*param_value*/) {}; void AddParam(const char * /*param_name*/, int /*param_value*/) {}; void Start(const char * /*name*/) {}; void Stop(int /*return_code = MFX_INVALID_STATUS_CODE*/) {}; }; #else // MFX_TIMING class AutoTimer { public: // static method to initialize timing capture static int Init(const void *filename, int level = -1); //returned uniq task ID static unsigned int CreateUniqTaskId(); AutoTimer(const char *name); // start timer AutoTimer(const char *name, const char *param, int parami = 0); // start timer AutoTimer(const char *name, bool bCreateId, unsigned int child_of, unsigned int parent_of); // start timer ~AutoTimer(); // stop timer AutoTimer(); // default constructor. Aftewards call SetInput/SetOutput/AddParam, then Start void SetInput(void *handle, int component_index = -1); void SetOutput(void *handle, int component_index = -1); void AddParam(const char *param_name, const char *param_value); void AddParam(const char *param_name, int param_value); void Start(const char *name); void Stop(int return_code = MFX_INVALID_STATUS_CODE); unsigned int ID(){return m_timerid;} protected: void Reset(); void SendNamedEvent(int opcode); const char *m_Name; unsigned int m_timerid; unsigned int m_parentid; unsigned int m_childid; }; #endif // MFX_TIMING } // namespace UMC #endif // __MFX_TIMING_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_trace.h000066400000000000000000000730111443134507600257510ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_H__ #define __MFX_TRACE_H__ #include #ifdef __cplusplus #include #include #include #include #endif #include #include "mfx_config.h" #include "mfx_trace_dump.h" #include "mfx_error.h" #define MAX_PATH 260 #define __INT64 long long #define __UINT64 unsigned long long typedef char mfxTraceChar; #define MFX_TRACE_STRING(x) x #define DISABLE_WARN_HIDE_PREV_LOCAL_DECLARATION \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wshadow\"") #define ROLLBACK_WARN_HIDE_PREV_LOCAL_DECLARATION \ _Pragma("GCC diagnostic pop") typedef unsigned int mfxTraceU32; typedef __UINT64 mfxTraceU64; /*------------------------------------------------------------------------------*/ extern mfxTraceU64 EventCfg; extern mfxTraceU32 LogConfig; extern int32_t FrameIndex; // C section #ifdef __cplusplus extern "C" { #endif // this is for RT events enum mfxTraceTaskType { MFX_TRACE_DEFAULT_TASK = 0, MFX_TRACE_API_DECODE_QUERY_TASK, MFX_TRACE_API_DECODE_QUERY_IOSURF_TASK, MFX_TRACE_API_DECODE_HEADER_TASK, MFX_TRACE_API_DECODE_INIT_TASK, MFX_TRACE_API_DECODE_CLOSE_TASK, MFX_TRACE_API_DECODE_FRAME_ASYNC_TASK, MFX_TRACE_API_ENCODE_QUERY_TASK, MFX_TRACE_API_ENCODE_QUERY_IOSURF_TASK, MFX_TRACE_API_ENCODE_INIT_TASK, MFX_TRACE_API_ENCODE_CLOSE_TASK, MFX_TRACE_API_ENCODE_FRAME_ASYNC_TASK, MFX_TRACE_API_VPP_QUERY_TASK, MFX_TRACE_API_VPP_QUERY_IOSURF_TASK, MFX_TRACE_API_VPP_INIT_TASK, MFX_TRACE_API_VPP_CLOSE_TASK, MFX_TRACE_API_VPP_LEGACY_ROUTINE_TASK, MFX_TRACE_API_VPP_RUN_FRAME_VPP_ASYNC_TASK, MFX_TRACE_API_VPP_RUN_FRAME_VPP_ASYNC_EX_TASK, MFX_TRACE_API_MFX_INIT_EX_TASK, MFX_TRACE_API_MFX_CLOSE_TASK, MFX_TRACE_API_DO_WORK_TASK, MFX_TRACE_API_SYNC_OPERATION_TASK, MFX_TRACE_HOTSPOT_SCHED_WAIT_GLOBAL_EVENT_TASK, MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, MFX_TRACE_HOTSPOT_DDI_EXECUTE_TASK, MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, MFX_TRACE_HOTSPOT_DDI_WAIT_TASK_SYNC, MFX_TRACE_HOTSPOT_DDI_QUERY_TASK, MFX_TRACE_HOTSPOT_CM_COPY, MFX_TRACE_HOTSPOT_COPY_DX11_TO_DX9, MFX_TRACE_HOTSPOT_COPY_DX9_TO_DX11, MFX_TRACE_HOTSPOT_SCHED_ROUTINE, MFX_TRACE_API_MFXINITIALIZE_TASK, MFX_TRACE_API_MFXQUERYIMPLSDESCRIPTION_TASK, MFX_TRACE_API_HEVC_OUTPUTINFO_TASK, MFX_TRACE_API_AVC_OUTPUTINFO_TASK, MFX_TRACE_API_AV1_OUTPUTINFO_TASK, MFX_TRACE_API_VP9_OUTPUTINFO_TASK, MFX_TRACE_API_HEVC_SYNCINFO_TASK, MFX_TRACE_API_AVC_SYNCINFO_TASK, MFX_TRACE_API_AV1_SYNCINFO_TASK, MFX_TRACE_API_VP9_SYNCINFO_TASK, MFX_TRACE_API_HEVC_DISPLAYINFO_TASK, MFX_TRACE_API_AVC_DISPLAYINFO_TASK, MFX_TRACE_API_AV1_DISPLAYINFO_TASK, MFX_TRACE_API_VP9_DISPLAYINFO_TASK, MFX_TRACE_API_HEVC_PICTUREPARAMETER_TASK, MFX_TRACE_API_HEVC_SLICEPARAMETER_TASK, MFX_TRACE_API_HEVC_QMATRIXARAMETER_TASK, MFX_TRACE_API_AVC_PICTUREPARAMETER_TASK, MFX_TRACE_API_AVC_SLICEPARAMETER_TASK, MFX_TRACE_API_AVC_QMATRIXARAMETER_TASK, MFX_TRACE_API_AV1_PICTUREPARAMETER_TASK, MFX_TRACE_API_AV1_TILECONTROLPARAMETER_TASK, MFX_TRACE_API_VP9_PICTUREPARAMETER_TASK, MFX_TRACE_API_VP9_SEGMENTPARAMETER_TASK, MFX_TRACE_API_BITSTREAM_TASK, MFX_TRACE_API_HEVC_DPBPARAMETER_TASK, MFX_TRACE_API_AVC_DPBPARAMETER_TASK, MFX_TRACE_API_AV1_DPBPARAMETER_TASK, MFX_TRACE_API_VP9_DPBPARAMETER_TASK, VA_TRACE_API_AV1_PICTUREPARAMETER_TASK, VA_TRACE_API_AV1_TILECONTROLPARAMETER_TASK, VA_TRACE_API_AVC_PICTUREPARAMETER_TASK, VA_TRACE_API_AVC_SLICEPARAMETER_TASK, VA_TRACE_API_AVC_QMATRIXARAMETER_TASK, VA_TRACE_API_HEVC_PICTUREPARAMETER_TASK, VA_TRACE_API_HEVC_SLICEPARAMETER_TASK, VA_TRACE_API_HEVC_QMATRIXARAMETER_TASK, VA_TRACE_API_VP9_PICTUREPARAMETER_TASK, VA_TRACE_API_VP9_SLICEPARAMETER_TASK, VA_TRACE_API_HEVC_DPBPARAMETER_TASK, MFX_TRACE_PIPELINE_STICKER_TASK, VPLMessage_TASK, }; // list of output modes enum { MFX_TRACE_OUTPUT_TRASH = 0x00, MFX_TRACE_OUTPUT_TEXTLOG = 0x01, MFX_TRACE_OUTPUT_STAT = 0x02, MFX_TRACE_OUTPUT_ETW = 0x04, MFX_TRACE_OUTPUT_TAL = 0x08, MFX_TRACE_OUTPUT_ITT = 0x10, MFX_TRACE_OUTPUT_FTRACE = 0x20, // special keys MFX_TRACE_OUTPUT_ALL = 0xFFFFFFFF, MFX_TRACE_OUTPUT_REG = MFX_TRACE_OUTPUT_ALL // output mode should be read from registry }; // enumeration of the trace levels inside any category typedef enum { MFX_TRACE_LEVEL_0 = 0, MFX_TRACE_LEVEL_1 = 1, MFX_TRACE_LEVEL_2 = 2, MFX_TRACE_LEVEL_3 = 3, MFX_TRACE_LEVEL_4 = 4, MFX_TRACE_LEVEL_5 = 5, MFX_TRACE_LEVEL_6 = 6, MFX_TRACE_LEVEL_7 = 7, MFX_TRACE_LEVEL_8 = 8, MFX_TRACE_LEVEL_9 = 9, MFX_TRACE_LEVEL_10 = 10, MFX_TRACE_LEVEL_11 = 11, MFX_TRACE_LEVEL_12 = 12, MFX_TRACE_LEVEL_13 = 13, MFX_TRACE_LEVEL_14 = 14, MFX_TRACE_LEVEL_15 = 15, MFX_TRACE_LEVEL_16 = 16, MFX_TRACE_LEVEL_MAX = 0xFF } mfxTraceLevel; // enumeration of the TXT log levels typedef enum { #ifndef NDEBUG MFX_TXTLOG_LEVEL_MAX = 1, //include API Func, API PARAMS and internal Func MFX_TXTLOG_LEVEL_API_AND_INTERNAL = 2, //include API Func and internal Func MFX_TXTLOG_LEVEL_API_AND_PARAMS = 3, //include API Func and API PARAMS MFX_TXTLOG_LEVEL_API = 4, //include API Func #else MFX_TXTLOG_LEVEL_API_AND_PARAMS = 1, //include API Func, API PARAMS MFX_TXTLOG_LEVEL_API = 2 //include API Func #endif } mfxTxtLogLevel; typedef enum _MEDIA_EVENT_TYPE { EVENT_TYPE_INFO = 0, //! function information event EVENT_TYPE_START = 1, //! function entry event EVENT_TYPE_END = 2, //! function exit event EVENT_TYPE_INFO2 = 3, //! function extra information event } MEDIA_EVENT_TYPE; //! //! \brief Keyword for ETW tracing, 1bit per keyworld, total 64bits //! typedef enum _MEDIA_EVENT_FILTER_KEYID { //Common key TR_KEY_MFX_API = 0, TR_KEY_DDI_API, //Decode key TR_KEY_DECODE_PICPARAM, TR_KEY_DECODE_SLICEPARAM, TR_KEY_DECODE_TILEPARAM, TR_KEY_DECODE_QMATRIX, TR_KEY_DECODE_SEGMENT, TR_KEY_DECODE_BITSTREAM_INFO, TR_KEY_DECODE_DPB_INFO, TR_KEY_DECODE_BASIC_INFO, TR_KEY_PIPELINE_STICKER, } MEDIA_EVENT_FILTER_KEYID; #define MFX_ETWLOG_ENABLE 16 // delete the following levels completely #define MFX_TRACE_LEVEL_SCHED MFX_TRACE_LEVEL_10 #define MFX_TRACE_LEVEL_PRIVATE MFX_TRACE_LEVEL_16 // the following levels should remain only /** API level * - Media SDK library entry points exposed in Media SDK official API * - Media SDK library important internal entry points */ #define MFX_TRACE_LEVEL_API MFX_TRACE_LEVEL_1 /** HOTSPOTS level * - Known Media SDK library internal hotspots (functions taking > ~50us on selected platforms/contents) */ #define MFX_TRACE_LEVEL_HOTSPOTS MFX_TRACE_LEVEL_2 /** EXTCALL level * - Calls to external libaries (DXVA, LibVA, MDF/CM, etc.) */ #define MFX_TRACE_LEVEL_EXTCALL MFX_TRACE_LEVEL_2 // should be MFX_TRACE_LEVEL_3 /** SCHEDULER level * - Media SDK internal scheduler functions calls */ #define MFX_TRACE_LEVEL_API_PARAMS MFX_TRACE_LEVEL_4 /** INTERNAL level * - Media SDK components function calls. Use this level to get more deeper knowledge of * calling stack. */ #define MFX_TRACE_LEVEL_INTERNAL MFX_TRACE_LEVEL_5 /** PARAMS level * - Tracing of function parameters, variables, etc. Note that not all tracing modules support this. */ #define MFX_TRACE_LEVEL_PARAMS MFX_TRACE_LEVEL_6 // defines default trace category #define MFX_TRACE_CATEGORY_DEFAULT NULL // defines category for the current module #ifndef MFX_TRACE_CATEGORY #define MFX_TRACE_CATEGORY MFX_TRACE_CATEGORY_DEFAULT #endif // defines default trace level #define MFX_TRACE_LEVEL_DEFAULT MFX_TRACE_LEVEL_MAX // defines default trace level for the current module #ifndef MFX_TRACE_LEVEL #define MFX_TRACE_LEVEL MFX_TRACE_LEVEL_DEFAULT #endif // Perf traces mfxTraceU32 MFXTrace_EventInit(); mfxTraceU32 MFXTrace_EventClose(); /*------------------------------------------------------------------------------*/ #ifdef MFX_TRACE_ENABLE typedef union { unsigned int uint32; __UINT64 uint64; __INT64 tick; char* str; void* ptr; mfxTraceChar* category; mfxTraceLevel level; } mfxTraceHandle; typedef struct { uint64_t callCount; double totalTime; }TimeStampInfo; typedef struct { mfxTraceChar* category; mfxTraceLevel level; // reserved for stat dump: mfxTraceHandle sd1; mfxTraceHandle sd2; mfxTraceHandle sd3; mfxTraceHandle sd4; mfxTraceHandle sd5; mfxTraceHandle sd6; mfxTraceHandle sd7; // reserved for itt mfxTraceHandle itt1; //timeStamp TimeStampInfo tick; } mfxTraceStaticHandle; typedef struct { // reserved for file dump: mfxTraceHandle fd1; mfxTraceHandle fd2; mfxTraceHandle fd3; mfxTraceHandle fd4; // reserved for stat dump: mfxTraceHandle sd1; // reserved for TAL: mfxTraceHandle tal1; // reserved for ETW: mfxTraceHandle etw1; mfxTraceHandle etw2; mfxTraceHandle etw3; // reserved for itt mfxTraceHandle itt1; } mfxTraceTaskHandle; /*------------------------------------------------------------------------------*/ // basic trace functions (macroses are recommended to use instead) mfxTraceU32 MFXTrace_Init(); mfxTraceU32 MFXTrace_Close(void); mfxTraceU32 MFXTrace_SetLevel(mfxTraceChar* category, mfxTraceLevel level); mfxTraceU32 MFXTrace_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); mfxTraceU32 MFXTrace_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); mfxTraceU32 MFXTrace_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); mfxTraceU32 MFXTrace_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); /*------------------------------------------------------------------------------*/ // Perf traces mfxTraceU32 MFXTraceEvent(uint16_t task, uint8_t opcode, uint8_t level, uint64_t size, const void *ptr); #ifdef __cplusplus } #endif #pragma pack(push, 2) // struct event_data contains arguments we need to trace in perf events // It contains variadic amount of arguments template struct event_data; template <> struct event_data<> { event_data() = default; }; template struct event_data : event_data { typename std::decay::type value; template event_data(A&& a, Args&&... args) : event_data(std::forward(args)...) , value(std::forward(a)) {} }; #pragma pack(pop) // Utility function for maintaining correct arguments order in event_data<...>() template auto make_event_data(Tuple&& t, std::index_sequence) { return event_data< typename std::tuple_element::type... >(std::get(std::forward(t))...); } // Helper function for creating event_data<...>() object template auto make_event_data(Args&&... args) { return make_event_data( std::forward_as_tuple(std::forward(args)...), std::make_index_sequence{} ); } // PerfScopedTrace objects are created using PERF_EVENT macro class PerfScopedTrace { public: template PerfScopedTrace(uint16_t task, uint8_t ucType, uint8_t level, event_data data) { // Send event data on PerfScopedTrace creation write(task, ucType, level, data); } ~PerfScopedTrace() { } template static void write(uint16_t task, uint8_t opcode, uint8_t level, T&& data) { MFXTraceEvent(task, opcode, level, sizeof(data), &data); } static void write(uint16_t task, uint8_t opcode, uint8_t level, event_data<>& /*data*/) { MFXTraceEvent(task, opcode, level, 0, nullptr); } template static void thunk(void* f, uint16_t task, uint8_t level) { std::unique_ptr p { static_cast(f) }; auto e = (*p)(); // Send event data at function exit write(task, 2, level, e); } template static constexpr auto get_thunk() noexcept { return &thunk; } }; #define TRACE_CHECK(keyWord) \ (EventCfg & (1 << keyWord)) || keyWord == TR_KEY_MFX_API || keyWord == TR_KEY_DDI_API // This macro is recommended to use instead creating RT Info ScopedTrace object directly #define TRACE_BUFFER_EVENT(task, level, keyWord, pData, funcName, structType) \ if (TRACE_CHECK(keyWord)) \ { \ EVENTDATA_##structType eventData; \ Event##funcName(&eventData, pData); \ PerfScopedTrace _info_scoped_trace##__LINE__(task, level, 0, make_event_data(eventData)); \ } #define TRACE_EVENT(task, level, keyWord, at_exit_func) \ if (TRACE_CHECK(keyWord)) \ { \ PerfScopedTrace _info_scoped_trace##__LINE__(task, level, 0, at_exit_func); \ } #ifdef __cplusplus extern "C" { #endif /*------------------------------------------------------------------------------*/ // basic macroses #define MFX_TRACE_PARAMS \ &_trace_static_handle, __FILE__, __LINE__, __FUNCTION__, MFX_TRACE_CATEGORY #define MFX_TRACE_INIT() \ MFXTrace_Init(); #define MFX_TRACE_INIT_RES(_res) \ _res = MFXTrace_Init(); #define MFX_TRACE_CLOSE() \ MFXTrace_Close(); #define MFX_TRACE_CLOSE_RES(_res) \ _res = MFXTrace_Close(); #define MFX_LTRACE(_trace_all_params) \ { \ DISABLE_WARN_HIDE_PREV_LOCAL_DECLARATION \ static mfxTraceStaticHandle _trace_static_handle = {}; \ MFXTrace_DebugMessage _trace_all_params; \ ROLLBACK_WARN_HIDE_PREV_LOCAL_DECLARATION \ } #else #define MFX_TRACE_INIT() #define MFX_TRACE_INIT_RES(res) #define MFX_TRACE_CLOSE() #define MFX_TRACE_CLOSE_RES(res) #define MFX_LTRACE(_trace_all_params) #define PERF_EVENT(task, level, ...) #define TRACE_EVENT(task, level, ...) #endif /*------------------------------------------------------------------------------*/ // standard formats #define MFX_TRACE_FORMAT_S "%s" #define MFX_TRACE_FORMAT_WS "%S" #define MFX_TRACE_FORMAT_P "%p" #define MFX_TRACE_FORMAT_I "%d" #define MFX_TRACE_FORMAT_X "%x" #define MFX_TRACE_FORMAT_D "%d (0x%x)" #define MFX_TRACE_FORMAT_F "%g" #define MFX_TRACE_FORMAT_GUID "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}" /*------------------------------------------------------------------------------*/ // these macroses permit to set trace level #define MFX_LTRACE_1(_level, _message, _format, _arg1) \ MFX_LTRACE((MFX_TRACE_PARAMS, _level, _message, _format, _arg1)) #define MFX_LTRACE_2(_level, _message, _format, _arg1, _arg2) \ MFX_LTRACE((MFX_TRACE_PARAMS, _level, _message, _format, _arg1, _arg2)) #define MFX_LTRACE_3(_level, _message, _format, _arg1, _arg2, _arg3) \ MFX_LTRACE((MFX_TRACE_PARAMS, _level, _message, _format, _arg1, _arg2, _arg3)) #define MFX_LTRACE_MSG(_level, _message) \ MFX_LTRACE_1(_level, _message, NULL, 0) #define MFX_LTRACE_MSG_1(_level, ...) \ char str[256]; \ sprintf(str, __VA_ARGS__); \ MFX_LTRACE_MSG(_level, str); \ #define MFX_LTRACE_S(_level, _string) \ MFX_LTRACE_1(_level, #_string " = ", MFX_TRACE_FORMAT_S, _string) #define MFX_LTRACE_WS(_level, _string) \ MFX_LTRACE_1(_level, #_string " = ", MFX_TRACE_FORMAT_WS, _string) #define MFX_LTRACE_P(_level, _arg1) \ MFX_LTRACE_1(_level, #_arg1 " = ", MFX_TRACE_FORMAT_P, _arg1) #define MFX_LTRACE_X(_level, _arg1) \ MFX_LTRACE_1(_level, #_arg1 " = ", MFX_TRACE_FORMAT_X, _arg1) #define MFX_LTRACE_D(_level, _arg1) \ MFX_LTRACE_2(_level, #_arg1 " = ", MFX_TRACE_FORMAT_D, _arg1, _arg1) #define MFX_LTRACE_F(_level, _arg1) \ MFX_LTRACE_1(_level, #_arg1 " = ", MFX_TRACE_FORMAT_F, _arg1) #ifdef MFX_TRACE_ENABLE #define MFX_LTRACE_BUFFER_S(_level, _name, _buffer, _size) \ if (_buffer) \ MFX_LTRACE_2(_level, _name, "%p[%d]", _buffer, _size) #else #define MFX_LTRACE_BUFFER_S(_level, _name, _buffer, _size) #endif #ifdef MFX_TRACE_ENABLE #define MFX_LTRACE_BUFFER(_level, _message, _buffer) \ { \ if (0 != LogConfig && _buffer) \ { \ DumpContext context; \ std::string _str = context.dump(#_buffer, *_buffer); \ MFX_LTRACE_1(_level, "\n" _message, "%s", _str.c_str()) \ } \ else { \ MFX_LTRACE_BUFFER_S(_level, #_buffer, _buffer, sizeof(*_buffer)) \ } \ } #else #define MFX_LTRACE_BUFFER(_level, _buffer) \ MFX_LTRACE_BUFFER_S(_level, #_buffer, _buffer, sizeof(*_buffer)) #endif #define MFX_LTRACE_GUID(_level, _guid) \ MFX_LTRACE((MFX_TRACE_PARAMS, _level, #_guid " = ", \ MFX_TRACE_FORMAT_GUID, \ (_guid).Data1, (_guid).Data2, (_guid).Data3, \ (_guid).Data4[0], (_guid).Data4[1], (_guid).Data4[2], (_guid).Data4[3], \ (_guid).Data4[4], (_guid).Data4[5], (_guid).Data4[6], (_guid).Data4[7])) /*------------------------------------------------------------------------------*/ // these macroses uses default trace level #define MFX_TRACE_1(_message, _format, _arg1) \ MFX_LTRACE_1(MFX_TRACE_LEVEL, _message, _format, _arg1) #define MFX_TRACE_2(_message, _format, _arg1, _arg2) \ MFX_LTRACE_2(MFX_TRACE_LEVEL, _message, _format, _arg1, _arg2) #define MFX_TRACE_3(_message, _format, _arg1, _arg2, _arg3) \ MFX_LTRACE_3(MFX_TRACE_LEVEL, _message, _format, _arg1, _arg2, _arg3) #define MFX_TRACE_S(_arg1) \ MFX_LTRACE_S(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_WS(_message) \ MFX_LTRACE_WS(MFX_TRACE_LEVEL, _message) #define MFX_TRACE_P(_arg1) \ MFX_LTRACE_P(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_I(_arg1) \ MFX_LTRACE_I(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_X(_arg1) \ MFX_LTRACE_X(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_D(_arg1) \ MFX_LTRACE_D(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_F(_arg1) \ MFX_LTRACE_F(MFX_TRACE_LEVEL, _arg1) #define MFX_TRACE_GUID(_guid) \ MFX_LTRACE_GUID(MFX_TRACE_LEVEL, _guid) #define MFX_TRACE_BUFFER(_name, _buffer, _size) \ MFX_LTRACE_BUFFER(MFX_TRACE_LEVEL, _name, _buffer, _size) /*------------------------------------------------------------------------------*/ #ifdef __cplusplus } // extern "C" #endif /*------------------------------------------------------------------------------*/ // C++ section #ifdef __cplusplus #include "mfx_reflect.h" mfx_reflect::AccessibleTypesCollection GetReflection(); #ifdef MFX_TRACE_ENABLE // C++ class for BeginTask/EndTask class MFXTraceTask { public: MFXTraceTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, const bool bCreateID = false); mfxTraceU32 GetID(); void Stop(); ~MFXTraceTask(); private: bool m_bStarted; mfxTraceU32 m_TaskID; mfxTraceStaticHandle *m_pStaticHandle; mfxTraceTaskHandle m_TraceTaskHandle; }; #endif // #ifdef MFX_TRACE_ENABLE /*------------------------------------------------------------------------------*/ // auto tracing of the functions #ifdef MFX_TRACE_ENABLE #define _MFX_AUTO_LTRACE_(_level, _task_name, _task_type, _bCreateID) \ DISABLE_WARN_HIDE_PREV_LOCAL_DECLARATION \ static mfxTraceStaticHandle _trace_static_handle; \ MFXTraceTask _mfx_trace_task(MFX_TRACE_PARAMS, _level, _task_name, _task_type, _bCreateID); \ ROLLBACK_WARN_HIDE_PREV_LOCAL_DECLARATION #define MFX_AUTO_TRACE_STOP() _mfx_trace_task.Stop() #define MFX_AUTO_TRACE_GETID() _mfx_trace_task.GetID() #else #define _MFX_AUTO_LTRACE_(_level, _task_name, _task_type, _bCreateID) #define MFX_AUTO_TRACE_STOP() #define MFX_AUTO_TRACE_GETID() 0 #endif #define MFX_AUTO_LTRACE(_level, _task_name) \ _MFX_AUTO_LTRACE_(_level, _task_name, MFX_TRACE_DEFAULT_TASK, false) #define MFX_AUTO_TRACE(_task_name) \ _MFX_AUTO_LTRACE_(MFX_TRACE_LEVEL, _task_name, MFX_TRACE_DEFAULT_TASK, false) #define MFX_AUTO_LTRACE_FUNC(_level) \ _MFX_AUTO_LTRACE_(_level, __FUNCTION__, MFX_TRACE_DEFAULT_TASK, false) #define MFX_AUTO_LTRACE_WITHID(_level, _task_name) \ _MFX_AUTO_LTRACE_(_level, _task_name, MFX_TRACE_DEFAULT_TASK, true) #define MFX_AUTO_TRACE_WITHID(_task_name) \ _MFX_AUTO_LTRACE_(MFX_TRACE_LEVEL, _task_name, MFX_TRACE_DEFAULT_TASK, true) #ifdef MFX_TRACE_ENABLE class MFXLTraceI { public: template void mfx_ltrace_i(mfxTraceLevel _level, const char* _mesg, const char* _function, const char* _filename, mfxTraceU32 _line, T _arg1) { std::stringstream ss; if (_arg1 > 0) { ss << "[warning] "; } else if (_arg1 < 0) { ss << "[critical] "; } ss << _mesg << " = "; MFX_LTRACE((&_trace_static_handle, _filename, _line, _function, MFX_TRACE_CATEGORY, _level, ss.str().c_str(), MFX_TRACE_FORMAT_I, _arg1)) } void mfx_ltrace_i(mfxTraceLevel _level, const char* _mesg, const char* _function, const char* _filename, mfxTraceU32 _line, mfxStatus _arg1) { std::error_code code = mfx::make_error_code(_arg1); std::stringstream ss; if (_arg1 > 0) { ss << "[warning] "; } else if (_arg1 < 0) { ss << "[critical] "; } ss << _mesg << " = "; MFX_LTRACE((&_trace_static_handle, _filename, _line, _function, MFX_TRACE_CATEGORY, _level, ss.str().c_str(), MFX_TRACE_FORMAT_S, code.message().c_str())) } }; #define MFX_LTRACE_I(_level, _arg1) \ { \ MFXLTraceI mFXLTraceI; \ mFXLTraceI.mfx_ltrace_i(_level, #_arg1, __FUNCTION__, __FILE__, __LINE__,_arg1); \ } #else #define MFX_LTRACE_I(_level, _arg1) \ MFX_LTRACE_1(_level, #_arg1 " = ", MFX_TRACE_FORMAT_I, _arg1) #endif #endif // ifdef __cplusplus template struct TraceTaskType2TraceLevel; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; template <> struct TraceTaskType2TraceLevel : std::integral_constant {}; #endif // #ifndef __MFX_TRACE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_trace_dump.h000066400000000000000000000436321443134507600270040ustar00rootroot00000000000000/* ****************************************************************************** *\ Copyright (C) 2012-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfx_trace_dump.h \* ****************************************************************************** */ #ifndef _MFX_TRACE_DUMP_H_ #define _MFX_TRACE_DUMP_H_ #include #include #include #include #include #include "mfxstructures.h" std::string PointerToHexString(void* x); std::string GetFourCCInString(mfxU32 fourcc); std::string GetCodecIdInString(mfxU32 id); std::string GetIOPatternInString(mfxU32 io); bool _IsBadReadPtr(void *ptr, size_t size); #define DUMP_RESERVED_ARRAY(r) dump_reserved_array(&(r[0]), sizeof(r)/sizeof(r[0])) #define DUMP_FIELD(_field) \ str += structName + "." #_field "=" + ToString(_struct._field) + "\n"; #define DUMP_FIELD_UCHAR(_field) \ str += structName + "." #_field "=" + ToString((int)_struct._field) + "\n"; #define DUMP_FIELD_RESERVED(_field) \ str += structName + "." #_field "[]=" + DUMP_RESERVED_ARRAY(_struct._field) + "\n"; #define ToString(x) static_cast( \ ( std::ostringstream() << std::dec << (x) ) ).str() #define ToHexFormatString(x) (static_cast( \ ( std::ostringstream() << std::hex << PointerToHexString((void*)(x)) ) ).str() ) #define DEFINE_DUMP_FUNCTION(type) \ std::string dump(const std::string structName, const type & var); enum eDumpContect { DUMPCONTEXT_MFX, DUMPCONTEXT_VPP, DUMPCONTEXT_ALL, }; enum eDumpFormat { DUMP_DEC, DUMP_HEX }; class DumpContext { public: eDumpContect context; DumpContext(void) { context = DUMPCONTEXT_ALL; } ~DumpContext(void) {} template inline std::string toString(T x, eDumpFormat format = DUMP_DEC){ return static_cast (( std::ostringstream() << ((format == DUMP_DEC) ? std::dec : std::hex) << x )).str(); } std::string GetBufferIdInString(mfxU32 bufferid); template std::string dump_reserved_array(T* data, size_t size) { std::stringstream result; result << "{ "; for (size_t i = 0; i < size; ++i) { result << data[i]; if (i < (size-1)) result << ", "; } result << " }"; return result.str(); } template std::string dump_array_with_cast(T0* data, size_t size) { std::stringstream result; result << "{ "; for (size_t i = 0; i < size; ++i) { result << (T1)data[i]; if (i < (size - 1)) result << ", "; } result << " }"; return result.str(); } template std::string dump_hex_array(T* data, size_t size) { std::stringstream result; result << "{ " << std::hex << std::uppercase; for (size_t i = 0; i < size; ++i) result << std::setw(sizeof(T) * 2) << std::setfill('0') << (mfxU64)data[i]; result << " }"; return result.str(); } template inline std::string dump_hex_array(T (&data)[N]) { return dump_hex_array(data, N); } template inline const char* get_type(){ return typeid(T).name(); } template std::string dump(const std::string structName, const T&) { return static_cast < std::ostringstream const & > (std::ostringstream() << "Not support dump " << get_type() << "!!!").str(); } template inline std::string dump_mfxExtParams(const std::string structName, const T& _struct) { std::string str; std::string name; str += structName + ".NumExtParam=" + ToString(_struct.NumExtParam) + "\n"; str += structName + ".ExtParam=" + ToString(_struct.ExtParam) + "\n"; if (_struct.ExtParam) { for (mfxU16 i = 0; i < _struct.NumExtParam; ++i) { if ((!_IsBadReadPtr(_struct.ExtParam, sizeof(mfxExtBuffer**))) && (!_IsBadReadPtr(_struct.ExtParam[i], sizeof(mfxExtBuffer*)))) { name = structName + ".ExtParam[" + ToString(i) + "]"; str += name + "=" + ToString(_struct.ExtParam[i]) + "\n"; switch (_struct.ExtParam[i]->BufferId) { case MFX_EXTBUFF_CODING_OPTION: str += dump(name, *((mfxExtCodingOption*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_CODING_OPTION2: str += dump(name, *((mfxExtCodingOption2*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_CODING_OPTION3: str += dump(name, *((mfxExtCodingOption3*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODER_RESET_OPTION: str += dump(name, *((mfxExtEncoderResetOption*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_AVC_REFLIST_CTRL: str += dump(name, *((mfxExtAVCRefListCtrl*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_AVC_TEMPORAL_LAYERS: str += dump(name, *((mfxExtAvcTemporalLayers*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODED_FRAME_INFO: str += dump(name, *((mfxExtAVCEncodedFrameInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_AVC_REFLISTS: str += dump(name, *((mfxExtAVCRefLists*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_DENOISE: str += dump(name, *((mfxExtVPPDenoise*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_DETAIL: str += dump(name, *((mfxExtVPPDetail*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_PROCAMP: str += dump(name, *((mfxExtVPPProcAmp*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_CODING_OPTION_SPSPPS: str += dump(name, *((mfxExtCodingOptionSPSPPS*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VIDEO_SIGNAL_INFO: str += dump(name, *((mfxExtVideoSignalInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_DOUSE: str += dump(name, *((mfxExtVPPDoUse*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_PICTURE_TIMING_SEI: str += dump(name, *((mfxExtPictureTimingSEI*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_COMPOSITE: str += dump(name, *((mfxExtVPPComposite*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO: str += dump(name, *((mfxExtVPPVideoSignalInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_DEINTERLACING: str += dump(name, *((mfxExtVPPDeinterlacing*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_HEVC_TILES: str += dump(name, *((mfxExtHEVCTiles*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_HEVC_PARAM: str += dump(name, *((mfxExtHEVCParam*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_HEVC_REGION: str += dump(name, *((mfxExtHEVCRegion*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_DECODED_FRAME_INFO: str += dump(name, *((mfxExtDecodedFrameInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_TIME_CODE: str += dump(name, *((mfxExtTimeCode*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_PRED_WEIGHT_TABLE: str += dump(name, *((mfxExtPredWeightTable*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODER_CAPABILITY: str += dump(name, *((mfxExtEncoderCapability*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_DIRTY_RECTANGLES: str += dump(name, *((mfxExtDirtyRect*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_MOVING_RECTANGLES: str += dump(name, *((mfxExtMoveRect*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION: str += dump(name, *((mfxExtVPPFrameRateConversion*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_IMAGE_STABILIZATION: str += dump(name, *((mfxExtVPPImageStab*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODER_ROI: str += dump(name, *((mfxExtEncoderROI*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_CODING_OPTION_VPS: str += dump(name, *((mfxExtCodingOptionVPS*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_ROTATION: str += dump(name, *((mfxExtVPPRotation*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODED_SLICES_INFO: str += dump(name, *((mfxExtEncodedSlicesInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_SCALING: str += dump(name, *((mfxExtVPPScaling*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_MIRRORING: str += dump(name, *((mfxExtVPPMirroring*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES: str += dump(name, *((mfxExtMVOverPicBoundaries*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_COLORFILL: str += dump(name, *((mfxExtVPPColorFill*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_DEC_VIDEO_PROCESSING: str += dump(name, *((mfxExtDecVideoProcessing*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_MBQP: str += dump(name, *((mfxExtMBQP*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODER_IPCM_AREA: str += dump(name, *((mfxExtEncoderIPCMArea*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_INSERT_HEADERS: str += dump(name, *((mfxExtInsertHeaders*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_DECODE_ERROR_REPORT: str += dump(name, *((mfxExtDecodeErrorReport*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME: str += dump(name, *((mfxExtMasteringDisplayColourVolume*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO: str += dump(name, *((mfxExtContentLightLevelInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_ENCODED_UNITS_INFO: str += dump(name, *((mfxExtEncodedUnitsInfo*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_COLOR_CONVERSION: str += dump(name, *((mfxExtColorConversion*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VPP_MCTF: str += dump(name, *((mfxExtVppMctf*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VP9_SEGMENTATION: str += dump(name, *((mfxExtVP9Segmentation*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VP9_TEMPORAL_LAYERS: str += dump(name, *((mfxExtVP9TemporalLayers*)_struct.ExtParam[i])) + "\n"; break; case MFX_EXTBUFF_VP9_PARAM: str += dump(name, *((mfxExtVP9Param*)_struct.ExtParam[i])) + "\n"; break; default: str += dump(name, *(_struct.ExtParam[i])) + "\n"; break; }; } else { str += "WARNING: Can't read from ExtParam[" + ToString(i) + "]!\n"; return str; } } } return str; } DEFINE_DUMP_FUNCTION(mfxEncodeCtrl); DEFINE_DUMP_FUNCTION(mfxExtBuffer); DEFINE_DUMP_FUNCTION(mfxVideoParam); DEFINE_DUMP_FUNCTION(mfxInfoMFX); DEFINE_DUMP_FUNCTION(mfxInfoVPP); DEFINE_DUMP_FUNCTION(mfxFrameAllocRequest); DEFINE_DUMP_FUNCTION(mfxFrameInfo); DEFINE_DUMP_FUNCTION(mfxFrameId); DEFINE_DUMP_FUNCTION(mfxBitstream); DEFINE_DUMP_FUNCTION(mfxFrameSurface1); DEFINE_DUMP_FUNCTION(mfxFrameData); DEFINE_DUMP_FUNCTION(mfxExtCodingOption); DEFINE_DUMP_FUNCTION(mfxExtCodingOption2); DEFINE_DUMP_FUNCTION(mfxExtCodingOption3); DEFINE_DUMP_FUNCTION(mfxExtEncoderResetOption); DEFINE_DUMP_FUNCTION(mfxExtAVCRefListCtrl); DEFINE_DUMP_FUNCTION(mfxExtAvcTemporalLayers); DEFINE_DUMP_FUNCTION(mfxExtAVCEncodedFrameInfo); DEFINE_DUMP_FUNCTION(mfxExtAVCRefLists); DEFINE_DUMP_FUNCTION(mfxExtVPPDenoise); DEFINE_DUMP_FUNCTION(mfxExtVPPDetail); DEFINE_DUMP_FUNCTION(mfxExtVPPProcAmp); DEFINE_DUMP_FUNCTION(mfxExtCodingOptionSPSPPS); DEFINE_DUMP_FUNCTION(mfxExtVideoSignalInfo); DEFINE_DUMP_FUNCTION(mfxExtVPPDoUse); DEFINE_DUMP_FUNCTION(mfxExtPictureTimingSEI); DEFINE_DUMP_FUNCTION(mfxExtVPPComposite); DEFINE_DUMP_FUNCTION(mfxExtVPPVideoSignalInfo); DEFINE_DUMP_FUNCTION(mfxExtVPPDeinterlacing); DEFINE_DUMP_FUNCTION(mfxExtHEVCTiles); DEFINE_DUMP_FUNCTION(mfxExtHEVCParam); DEFINE_DUMP_FUNCTION(mfxExtHEVCRegion); DEFINE_DUMP_FUNCTION(mfxExtDecodedFrameInfo); DEFINE_DUMP_FUNCTION(mfxExtTimeCode); DEFINE_DUMP_FUNCTION(mfxExtPredWeightTable); DEFINE_DUMP_FUNCTION(mfxExtEncoderCapability); DEFINE_DUMP_FUNCTION(mfxExtDirtyRect); DEFINE_DUMP_FUNCTION(mfxExtMoveRect); DEFINE_DUMP_FUNCTION(mfxExtVPPFrameRateConversion); DEFINE_DUMP_FUNCTION(mfxExtVPPImageStab); DEFINE_DUMP_FUNCTION(mfxExtEncoderROI); DEFINE_DUMP_FUNCTION(mfxExtCodingOptionVPS); DEFINE_DUMP_FUNCTION(mfxExtVPPRotation); DEFINE_DUMP_FUNCTION(mfxExtEncodedSlicesInfo); DEFINE_DUMP_FUNCTION(mfxExtVPPScaling); DEFINE_DUMP_FUNCTION(mfxExtVPPMirroring); DEFINE_DUMP_FUNCTION(mfxExtMVOverPicBoundaries); DEFINE_DUMP_FUNCTION(mfxExtVPPColorFill); DEFINE_DUMP_FUNCTION(mfxExtDecVideoProcessing); DEFINE_DUMP_FUNCTION(mfxExtMBQP); DEFINE_DUMP_FUNCTION(mfxExtEncoderIPCMArea); DEFINE_DUMP_FUNCTION(mfxExtInsertHeaders); DEFINE_DUMP_FUNCTION(mfxExtDecodeErrorReport); DEFINE_DUMP_FUNCTION(mfxExtMasteringDisplayColourVolume); DEFINE_DUMP_FUNCTION(mfxExtContentLightLevelInfo); DEFINE_DUMP_FUNCTION(mfxExtEncodedUnitsInfo); DEFINE_DUMP_FUNCTION(mfxExtColorConversion); DEFINE_DUMP_FUNCTION(mfxExtVppMctf); DEFINE_DUMP_FUNCTION(mfxExtVP9Segmentation); DEFINE_DUMP_FUNCTION(mfxVP9SegmentParam); DEFINE_DUMP_FUNCTION(mfxExtVP9TemporalLayers); DEFINE_DUMP_FUNCTION(mfxVP9TemporalLayer); DEFINE_DUMP_FUNCTION(mfxExtVP9Param); }; #endif //_MFX_TRACE_DUMP_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_umc_alloc_wrapper.h000066400000000000000000000362741443134507600303630ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_ALLOC_WRAPPER_H_ #define _MFX_ALLOC_WRAPPER_H_ #include #include // unique_ptr #include "mfx_common.h" #include "umc_memory_allocator.h" #include "umc_frame_allocator.h" #include "umc_frame_data.h" #include "mfxvideo++int.h" #include "libmfx_core.h" #define MFX_UMC_MAX_ALLOC_SIZE 128 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // mfx_UMC_MemAllocator - buffer allocator ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class mfx_UMC_MemAllocator : public UMC::MemoryAllocator { DYNAMIC_CAST_DECL(mfx_UMC_MemAllocator, MemoryAllocator) public: mfx_UMC_MemAllocator(void); virtual ~mfx_UMC_MemAllocator(void); // Initiates object virtual UMC::Status InitMem(UMC::MemoryAllocatorParams *pParams, VideoCORE* mfxCore); // Closes object and releases all allocated memory virtual UMC::Status Close() override; // Allocates or reserves physical memory and return unique ID // Sets lock counter to 0 virtual UMC::Status Alloc(UMC::MemID *pNewMemID, size_t Size, uint32_t Flags, uint32_t Align = 16) override; // Lock() provides pointer from ID. If data is not in memory (swapped) // prepares (restores) it. Increases lock counter virtual void *Lock(UMC::MemID MID) override; // Unlock() decreases lock counter virtual UMC::Status Unlock(UMC::MemID MID) override; // Notifies that the data wont be used anymore. Memory can be free virtual UMC::Status Free(UMC::MemID MID) override; // Immediately deallocates memory regardless of whether it is in use (locked) or no virtual UMC::Status DeallocateMem(UMC::MemID MID) override; protected: VideoCORE* m_pCore; }; enum mfx_UMC_FrameAllocator_Flags { mfx_UMC_ReallocAllowed = 1, }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // mfx_UMC_FrameAllocator ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class mfx_UMC_FrameAllocator : public UMC::FrameAllocator { DYNAMIC_CAST_DECL(mfx_UMC_FrameAllocator, UMC::FrameAllocator) public: mfx_UMC_FrameAllocator(void); virtual ~mfx_UMC_FrameAllocator(void); // Initiates object virtual UMC::Status InitMfx(UMC::FrameAllocatorParams *pParams, VideoCORE* mfxCore, const mfxVideoParam *params, const mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isUseExternalFrames, bool isSWplatform); // Closes object and releases all allocated memory virtual UMC::Status Close() override; // Allocates or reserves physical memory and returns unique ID // Sets lock counter to 0 virtual UMC::Status Alloc(UMC::FrameMemID *pNewMemID, const UMC::VideoDataInfo * info, uint32_t flags) override; virtual UMC::Status GetFrameHandle(UMC::FrameMemID memId, void * handle) override; // Lock() provides pointer from ID. If data is not in memory (swapped) // prepares (restores) it. Increases lock counter virtual const UMC::FrameData* Lock(UMC::FrameMemID mid) override; // Unlock() decreases lock counter virtual UMC::Status Unlock(UMC::FrameMemID mid) override; // Notifies that the data won't be used anymore. Memory can be freed. virtual UMC::Status IncreaseReference(UMC::FrameMemID mid) override; // Notifies that the data won't be used anymore. Memory can be freed. virtual UMC::Status DecreaseReference(UMC::FrameMemID mid) override; virtual UMC::Status Reset() override; virtual mfxStatus SetCurrentMFXSurface(mfxFrameSurface1 *srf); virtual mfxFrameSurface1* GetSurface(UMC::FrameMemID index, mfxFrameSurface1 *surface_work, const mfxVideoParam * videoPar); virtual mfxStatus PrepareToOutput(mfxFrameSurface1 *surface_work, UMC::FrameMemID index, const mfxVideoParam * videoPar, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY); mfxI32 FindSurface(mfxFrameSurface1 *surf); bool HasFreeSurface(); void SetSfcPostProcessingFlag(bool flagToSet); void SetExternalFramesResponse(mfxFrameAllocResponse *response); mfxFrameSurface1 * GetInternalSurface(UMC::FrameMemID index); mfxFrameSurface1 * GetSurfaceByIndex(UMC::FrameMemID index); mfxMemId ConvertMemId(UMC::FrameMemID index) { return m_frameDataInternal.GetSurface(index).Data.MemId; }; protected: struct surf_descr { surf_descr(mfxFrameSurface1* FrameSurface, bool isUsed):FrameSurface(FrameSurface), isUsed(isUsed) { }; surf_descr():FrameSurface(0), isUsed(false) { }; mfxFrameSurface1* FrameSurface; bool isUsed; }; virtual UMC::Status Free(UMC::FrameMemID mid); virtual mfxI32 AddSurface(mfxFrameSurface1 *surface); class InternalFrameData { class FrameRefInfo { public: FrameRefInfo(); void Reset(); mfxU32 m_referenceCounter; }; typedef std::pair FrameInfo; public: mfxFrameSurface1 & GetSurface(mfxU32 index); UMC::FrameData & GetFrameData(mfxU32 index); void ResetFrameData(mfxU32 index); mfxU32 IncreaseRef(mfxU32 index); mfxU32 DecreaseRef(mfxU32 index); bool IsValidMID(mfxU32 index) const; void AddNewFrame(mfx_UMC_FrameAllocator * alloc, mfxFrameSurface1 *surface, UMC::VideoDataInfo * info); mfxU32 GetSize() const; void Close(); void Reset(); void Resize(mfxU32 size); private: std::vector m_frameData; std::vector m_frameDataRefs; }; InternalFrameData m_frameDataInternal; std::vector m_extSurfaces; mfxI32 m_curIndex; bool m_IsUseExternalFrames; bool m_sfcVideoPostProcessing; mfxFrameInfo m_surface_info; // for copying UMC::VideoDataInfo m_info; VideoCORE* m_pCore; mfxFrameAllocResponse *m_externalFramesResponse; bool m_isSWDecode; mfxU16 m_IOPattern; private: mfxI32 FindFreeSurface(); }; class SurfaceSource : public UMC::FrameAllocator { public: SurfaceSource(VideoCORE* core, const mfxVideoParam & video_param, eMFXPlatform platform, mfxFrameAllocRequest& request, mfxFrameAllocRequest& request_internal, mfxFrameAllocResponse& response, mfxFrameAllocResponse& response_alien, bool needVppJPEG = false); ~SurfaceSource(); virtual UMC::Status Close() override; virtual UMC::Status Reset() override; virtual UMC::Status Alloc(UMC::FrameMemID *pNewMemID, const UMC::VideoDataInfo * info, uint32_t Flags) override; virtual UMC::Status GetFrameHandle(UMC::FrameMemID MID, void * handle) override; virtual const UMC::FrameData* Lock(UMC::FrameMemID MID) override; virtual UMC::Status Unlock(UMC::FrameMemID MID) override; virtual UMC::Status IncreaseReference(UMC::FrameMemID MID) override; virtual UMC::Status DecreaseReference(UMC::FrameMemID MID) override; // Performs mapping mfxMemId <-> UMC::FrameMimID mfxI32 FindSurface(mfxFrameSurface1 *surf); // Adding new surface to cache mfxStatus SetCurrentMFXSurface(mfxFrameSurface1 *surf); mfxFrameSurface1 * GetSurface(UMC::FrameMemID index, mfxFrameSurface1 *surface, const mfxVideoParam * videoPar); mfxFrameSurface1 * GetInternalSurface(UMC::FrameMemID index); mfxStatus GetSurface(mfxFrameSurface1* & surf); mfxFrameSurface1 * GetInternalSurface(mfxFrameSurface1 *sfc_surf); mfxFrameSurface1 * GetSurfaceByIndex(UMC::FrameMemID index); mfxStatus PrepareToOutput(mfxFrameSurface1 *surface_work, UMC::FrameMemID index, const mfxVideoParam * videoPar, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY); bool HasFreeSurface(); void SetFreeSurfaceAllowedFlag(bool flag); protected: VideoCORE* m_core; // Decoder works with these surfaces //shared_surface_cache_controller std::shared_ptr > m_vpl_cache_decoder_surfaces; // These surfaces are outputted to user (different with previous pool // in case of IO pattern and decoder impl mismatch or SFC on Linux) std::shared_ptr > m_vpl_cache_output_surfaces; bool m_redirect_to_vpl_path = false; std::unique_ptr m_umc_allocator_adapter; // Parameters required for proper conversion of mfx <-> UMC params std::map m_mfx2umc_memid; std::map m_umc2mfx_memid; private: void CreateUMCAllocator(const mfxVideoParam & video_param, eMFXPlatform platform, bool needVppJPEG); bool CreateCorrespondence(mfxFrameSurface1& surface_work, mfxFrameSurface1& surface_out); void RemoveCorrespondence(mfxFrameSurface1& surface_work); void CreateBinding(const mfxFrameSurface1 & surf); void RemoveBinding(const mfxFrameSurface1 & surf); mfxFrameSurface1* GetDecoderSurface(UMC::FrameMemID index); UMC::Status CheckForRealloc(const UMC::VideoDataInfo & info, const mfxFrameSurface1& surf, bool realloc_allowed) const; void ReleaseCurrentWorkSurface(); // Parameters required for proper conversion of mfx <-> UMC params std::map m_umc2framedata; UMC::VideoDataInfo m_video_data_info; // Case when platform of decoder (SW / HW) and type of output surfaces (SW / HW) mismatch // or if SFC on linux used bool m_allocate_internal = false; // If m_allocate_internal and not SFC on linux, then we need to copy before output bool m_need_to_copy_before_output = false; // If sys mem with sw fallback then ext alloc can be off so surface cache will be empty bool m_sw_fallback_sys_mem = false; // Mapping of work surfaces <-> output surfaces (if they differ) std::map m_work_output_surface_map; std::map m_output_work_surface_map; // For surface handling in case of sys mem with sw fallback and no ext allocator std::vector m_sw_fallback_surfaces; /* Several skip frame surfaces may be related to one work surface. Map new output surface on decoder's surface used for last not skipped frame. */ std::map m_output_work_surface_skip_frames; // VPL memory model 2 (GetSurfaceForDecode + DecodeFrameAsync) bool m_memory_model2 = false; mfxFrameSurface1* m_current_work_surface = nullptr; mfx::ResettableTimerMs m_timer; // Parameters for proper work with mfx_UMC_FrameAllocator (i.e. support of MSDK 1.x path) mfxFrameAllocResponse& m_response; mfxFrameAllocResponse& m_response_alien; }; class mfx_UMC_FrameAllocator_D3D : public mfx_UMC_FrameAllocator { public: virtual mfxStatus PrepareToOutput(mfxFrameSurface1 *surface_work, UMC::FrameMemID index, const mfxVideoParam * videoPar, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY); }; #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) class VideoVppJpeg; struct JPEG_Info { int32_t colorFormat = 0; size_t UOffset = 0; size_t VOffset = 0; }; class SurfaceSourceJPEG : public SurfaceSource { public: SurfaceSourceJPEG(VideoCORE* core, const mfxVideoParam & video_param, eMFXPlatform platform, mfxFrameAllocRequest& request, mfxFrameAllocRequest& request_internal, mfxFrameAllocResponse& response, mfxFrameAllocResponse& response_alien); // suppose that Close() calls Reset(), so override only Reset() virtual UMC::Status Reset() override; void SetJPEGInfo(JPEG_Info * jpegInfo); mfxStatus StartPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 *taskId); mfxStatus CheckPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 taskId); private: JPEG_Info m_jpegInfo; std::unique_ptr m_pCc; mfxStatus InitVideoVppJpeg(const mfxVideoParam *params); mfxStatus FindSurfaceByMemId(const UMC::FrameData* in, const mfxHDLPair &hdlPair, mfxFrameSurface1 &out_surface); }; class mfx_UMC_FrameAllocator_D3D_Converter : public mfx_UMC_FrameAllocator_D3D { public: virtual UMC::Status InitMfx(UMC::FrameAllocatorParams *pParams, VideoCORE* mfxCore, const mfxVideoParam *params, const mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isUseExternalFrames, bool isSWplatform) override; // suppose that Close() calls Reset(), so override only Reset() virtual UMC::Status Reset() override; void SetJPEGInfo(JPEG_Info * jpegInfo); mfxStatus StartPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 *taskId); mfxStatus CheckPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 taskId); private: JPEG_Info m_jpegInfo; std::unique_ptr m_pCc; mfxStatus InitVideoVppJpeg(const mfxVideoParam *params); mfxStatus FindSurfaceByMemId(const UMC::FrameData* in, const mfxHDLPair &hdlPair, mfxFrameSurface1 &out_surface); friend class SurfaceSourceJPEG; }; #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) && defined (MFX_VA_WIN) #endif //_MFX_ALLOC_WRAPPER_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_utils.h000066400000000000000000001153271443134507600260220ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXUTILS_H__ #define __MFXUTILS_H__ #include "mfx_config.h" #include "mfxstructures.h" #include "mfxdeprecated.h" #include "mfxplugin.h" #include "umc_structures.h" #include "mfx_trace.h" #include "mfx_utils_logging.h" #include "mfx_utils_perf.h" #include "mfx_timing.h" #include "mfxsurfacepool.h" #include "mfx_error.h" #include #include #include #include #include #include #include #include #include #include #include #if defined(MFX_ENABLE_LOG_UTILITY) template < typename T , typename = typename std::enable_if::value>::type> static inline T mfx_sts_trace(const char* fileName, const uint32_t lineNum, const char* funcName, T sts) { const std::string stsString = GetMFXStatusInString(sts); std::string mfxSts; if (sts < MFX_ERR_NONE) { MFX_LOG(LEVEL_ERROR, fileName, lineNum, "%s: returns %s\n", funcName, stsString.c_str()); mfxSts = "[critical] mfxRes = "; } else if (sts > MFX_ERR_NONE) { MFX_LOG(LEVEL_WARN, fileName, lineNum, "%s: returns %s\n", funcName, stsString.c_str()); mfxSts = "[warning] mfxRes = "; } return sts; } template < typename T , typename std::enable_if::value, int>::type = 0> static inline T mfx_sts_trace(const char* fileName, const uint32_t lineNum, const char* funcName, T sts) { if (sts) { MFX_LOG(LEVEL_ERROR, fileName, lineNum, "%s: returns %d\n", funcName, sts); } return sts; } #define MFX_STS_TRACE(sts) mfx_sts_trace(__FILE__, __LINE__, __FUNCTION__, sts) #else #define MFX_STS_TRACE(sts) sts #endif #define MFX_SUCCEEDED(sts) (MFX_STS_TRACE(sts) == MFX_ERR_NONE) #define MFX_FAILED(sts) (MFX_STS_TRACE(sts) != MFX_ERR_NONE) #define MFX_RETURN(sts) { return MFX_STS_TRACE(sts); } #define MFX_RETURN_IF_ERR_NONE(sts) { if (MFX_SUCCEEDED(sts)) return MFX_ERR_NONE; } #define MFX_CHECK(EXPR, ERR) { if (!(EXPR)) MFX_RETURN(ERR); } #define MFX_CHECK_NO_RET(EXPR, STS, ERR){ if (!(EXPR)) { std::ignore = MFX_STS_TRACE(ERR); STS = ERR; } } #define MFX_CHECK_STS(sts) MFX_CHECK(MFX_SUCCEEDED(sts), sts) #define MFX_CHECK_STS_RET(sts, ret) { if (MFX_FAILED(sts)) return ret; } #define MFX_CHECK_STS_RET_NULL(sts) MFX_CHECK_STS_RET(sts, nullptr) #define MFX_SAFE_CALL(FUNC) { mfxStatus _sts = FUNC; MFX_CHECK_STS(_sts); } #define MFX_CHECK_NULL_PTR1(pointer) MFX_CHECK(pointer, MFX_ERR_NULL_PTR) #define MFX_CHECK_NULL_PTR2(p1, p2) { MFX_CHECK(p1, MFX_ERR_NULL_PTR); MFX_CHECK(p2, MFX_ERR_NULL_PTR); } #define MFX_CHECK_NULL_PTR3(p1, p2, p3) { MFX_CHECK(p1, MFX_ERR_NULL_PTR); MFX_CHECK(p2, MFX_ERR_NULL_PTR); MFX_CHECK(p3, MFX_ERR_NULL_PTR); } #define MFX_CHECK_STS_ALLOC(pointer) MFX_CHECK(pointer, MFX_ERR_MEMORY_ALLOC) #define MFX_CHECK_COND(cond) MFX_CHECK(cond, MFX_ERR_UNSUPPORTED) #define MFX_CHECK_INIT(InitFlag) MFX_CHECK(InitFlag, MFX_ERR_MORE_DATA) #define MFX_CHECK_HDL(hdl) MFX_CHECK(hdl, MFX_ERR_INVALID_HANDLE) #define MFX_CHECK_UMC_ALLOC(err) { if (err != true) {return MFX_ERR_MEMORY_ALLOC;} } #define MFX_CHECK_EXBUF_INDEX(index) { if (index == -1) {return MFX_ERR_MEMORY_ALLOC;} } #define MFX_CHECK_WITH_ASSERT(EXPR, ERR) { assert(EXPR); MFX_CHECK(EXPR,ERR); } #define MFX_CHECK_WITH_THROW(EXPR, ERR, EXP) { if (!(EXPR)) { std::ignore = MFX_STS_TRACE(ERR); throw EXP; } } #define MFX_CHECK_WITH_THROW_STS(EXPR, ERR) MFX_CHECK_WITH_THROW(EXPR, ERR, std::system_error(mfx::make_error_code(mfxStatus(ERR)))) static const mfxU32 MFX_TIME_STAMP_FREQUENCY = 90000; // will go to mfxdefs.h static const mfxU64 MFX_TIME_STAMP_INVALID = (mfxU64)-1; // will go to mfxdefs.h static const mfxU32 NO_INDEX = 0xffffffff; static const mfxU8 NO_INDEX_U8 = 0xff; static const mfxU16 NO_INDEX_U16 = 0xffff; #define MFX_CHECK_UMC_STS(err) { if (err != static_cast(UMC::UMC_OK)) {return ConvertStatusUmc2Mfx(err);} } inline mfxStatus ConvertStatusUmc2Mfx(UMC::Status umcStatus) { switch (umcStatus) { case UMC::UMC_OK: return MFX_ERR_NONE; case UMC::UMC_ERR_NULL_PTR: return MFX_ERR_NULL_PTR; case UMC::UMC_ERR_UNSUPPORTED: return MFX_ERR_UNSUPPORTED; case UMC::UMC_ERR_ALLOC: return MFX_ERR_MEMORY_ALLOC; case UMC::UMC_ERR_LOCK: return MFX_ERR_LOCK_MEMORY; case UMC::UMC_ERR_NOT_IMPLEMENTED: return MFX_ERR_NOT_IMPLEMENTED; case UMC::UMC_ERR_GPU_HANG: return MFX_ERR_GPU_HANG; case UMC::UMC_ERR_NOT_ENOUGH_BUFFER: return MFX_ERR_NOT_ENOUGH_BUFFER; case UMC::UMC_ERR_NOT_ENOUGH_DATA: return MFX_ERR_MORE_DATA; case UMC::UMC_ERR_SYNC: return MFX_ERR_MORE_DATA; // need to skip bad frames default: return MFX_ERR_UNKNOWN; // need general error code here } } inline UMC::Status ConvertStatusMfx2Umc(mfxStatus mfxStatus) { switch (mfxStatus) { case MFX_ERR_NONE: return UMC::UMC_OK; case MFX_ERR_NULL_PTR: return UMC::UMC_ERR_NULL_PTR; case MFX_ERR_UNSUPPORTED: return UMC::UMC_ERR_UNSUPPORTED; case MFX_ERR_MEMORY_ALLOC: return UMC::UMC_ERR_ALLOC; case MFX_ERR_LOCK_MEMORY: return UMC::UMC_ERR_LOCK; case MFX_ERR_NOT_ENOUGH_BUFFER: return UMC::UMC_ERR_NOT_ENOUGH_BUFFER; case MFX_ERR_MORE_DATA: return UMC::UMC_ERR_NOT_ENOUGH_DATA; case MFX_ERR_NOT_IMPLEMENTED: return UMC::UMC_ERR_NOT_IMPLEMENTED; case MFX_ERR_GPU_HANG: return UMC::UMC_ERR_GPU_HANG; case MFX_ERR_UNKNOWN: default: return UMC::UMC_ERR_FAILED; } } inline mfxF64 GetUmcTimeStamp(mfxU64 ts) { return ts == MFX_TIME_STAMP_INVALID ? -1.0 : ts / (mfxF64)MFX_TIME_STAMP_FREQUENCY; } inline mfxU64 GetMfxTimeStamp(mfxF64 ts) { return ts < 0.0 ? MFX_TIME_STAMP_INVALID : (mfxU64)(ts * MFX_TIME_STAMP_FREQUENCY + .5); } inline bool LumaIsNull(const mfxFrameSurface1 * surf) { if (surf->Info.FourCC == MFX_FOURCC_Y410) { return !surf->Data.Y410; } else { return !surf->Data.Y; } } #ifndef SAFE_RELEASE #define SAFE_RELEASE(PTR) { if (PTR) { PTR->Release(); PTR = NULL; } } #endif #define IS_PROTECTION_ANY(val) (false) #define MFX_COPY_FIELD_NO_LOG(Field) buf_dst.Field = buf_src.Field #if !defined(MFX_ENABLE_LOG_UTILITY) #define MFX_COPY_FIELD(Field) buf_dst.Field = buf_src.Field #define MFX_COPY_ARRAY_FIELD(Array) std::copy(std::begin(buf_src.Array), std::end(buf_src.Array), std::begin(buf_dst.Array)) #else #define MFX_COPY_FIELD(Field) \ buf_dst.Field = buf_src.Field; \ { \ const std::string fieldForamt = GetNumberFormat(buf_src.Field); \ const std::string typeName = std::string(typeid(buf_src).name()); \ const std::string format = typeName + ".%s = " + fieldForamt + "\n"; \ MFX_LOG_API_TRACE(format.c_str(), #Field, buf_src.Field); \ } #define MFX_COPY_ARRAY_FIELD(Array) \ std::copy(std::begin(buf_src.Array), std::end(buf_src.Array), std::begin(buf_dst.Array)); \ { \ int idx = 0; \ const std::string fieldForamt = GetNumberFormat(buf_src.Array[0]); \ const std::string typeName = std::string(typeid(buf_src).name()); \ const std::string format = typeName + ".%s[%d] = " + fieldForamt + "\n"; \ for (auto it = std::begin(buf_src.Array); it != std::end(buf_src.Array); it++, idx++) { \ MFX_LOG_API_TRACE(format.c_str(), #Array, idx, *it); \ } \ } #endif namespace mfx { template T GetEnv(const char* name, T defaultVal) { #if defined (MFX_ENV_CFG_ENABLE) if (const char* strVal = std::getenv(name)) { std::istringstream(strVal) >> defaultVal; MFX_LTRACE_1(MFX_TRACE_LEVEL_INTERNAL, name, "=%s", strVal); return defaultVal; } #endif #if defined (MFX_TRACE_ENABLE) { std::ostringstream ss; ss << name << "=" << defaultVal; MFX_LTRACE_MSG(MFX_TRACE_LEVEL_INTERNAL, ss.str().c_str()); } #endif return defaultVal; } // switch to std::clamp when C++17 support will be enabled // Clip value v to range [lo, hi] template constexpr const T& clamp( const T& v, const T& lo, const T& hi ) { return std::min(hi, std::max(v, lo)); } // Comp is comparison function object with meaning of 'less' operator (i.e. std::less<> or operator<) template constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp ) { return comp(v, lo) ? lo : comp(hi, v) ? hi : v; } // Clip value to range [0, 255] template constexpr uint8_t byte_clamp(T v) { return uint8_t(clamp(v, 0, 255)); } // Aligns value to next power of two template inline T align2_value(T value, size_t alignment = 16) { assert((alignment & (alignment - 1)) == 0); return static_cast ((value + (alignment - 1)) & ~(alignment - 1)); } template constexpr size_t size(const T& c) { return (size_t)c.size(); } template constexpr size_t size(const T(&)[N]) { return N; } template constexpr T CeilDiv(T x, T y) { return (x + y - 1) / y; } inline mfxU32 CeilLog2(mfxU32 x) { mfxU32 l = 0; while (x > (1U << l)) ++l; return l; } template struct TupleArgs; template struct TupleArgs { using type = std::tuple; }; template struct TupleArgs { using type = std::tuple; }; template struct result_of; template struct result_of : std::result_of {}; template struct result_of { using type = TRes; }; template inline typename mfx::result_of::type apply_impl(TFunc&& fn, TTuple&& t, std::index_sequence) { return fn(std::get(t) ...); } template inline typename mfx::result_of::type apply(TFunc&& fn, TTuple&& t) { return apply_impl( std::forward(fn) , std::forward(t) , typename std::make_index_sequence::type>::value>()); } template class IterStepWrapper : public std::iterator_traits { public: using iterator_category = std::forward_iterator_tag; using iterator_type = IterStepWrapper; using reference = typename std::iterator_traits::reference; using pointer = typename std::iterator_traits::pointer; IterStepWrapper(T ptr, ptrdiff_t step = 1) : m_ptr(ptr) , m_step(step) {} iterator_type& operator++() { std::advance(m_ptr, m_step); return *this; } iterator_type operator++(int) { auto i = *this; ++(*this); return i; } reference operator*() { return *m_ptr; } pointer operator->() { return m_ptr; } bool operator==(const iterator_type& other) { return m_ptr == other.m_ptr || abs(std::distance(m_ptr, other.m_ptr)) < std::max(abs(m_step), abs(other.m_step)); } bool operator!=(const iterator_type& other) { return !((*this) == other); } private: T m_ptr; ptrdiff_t m_step; }; template inline IterStepWrapper MakeStepIter(T ptr, ptrdiff_t step = 1) { return IterStepWrapper(ptr, step); } class OnExit : public std::function { public: OnExit(const OnExit&) = delete; template OnExit(TArg&& ...arg) : std::function(std::forward(arg)...) {} ~OnExit() { if (operator bool()) operator()(); } template OnExit& operator=(TArg&& ...arg) { std::function tmp(std::forward(arg)...); swap(tmp); return *this; } }; namespace options //MSDK API options verification utilities { //Each Check... function return true if verification failed, false otherwise template inline bool Check(const T&) { return true; } template inline bool Check(const T & opt) { if (opt == val) return false; return Check(opt); } template inline bool CheckGE(T opt) { return !(opt >= val); } template inline bool Check(T & opt, T next, U... other) { if (opt == next) return false; return Check(opt, other...); } template inline bool CheckOrZero(T& opt) { opt = T(0); return true; } template inline bool CheckOrZero(T & opt) { if (opt == val) return false; return CheckOrZero(opt); } template inline bool CheckOrZero(T & opt, T next, U... other) { if (opt == next) return false; return CheckOrZero(opt, (T)other...); } template inline bool CheckMaxOrZero(T & opt, U max) { if (opt <= max) return false; opt = 0; return true; } template inline bool CheckMinOrZero(T & opt, U min) { if (opt >= min) return false; opt = 0; return true; } template inline bool CheckMaxOrClip(T & opt, U max) { if (opt <= max) return false; opt = T(max); return true; } template inline bool CheckMinOrClip(T & opt, U min) { if (opt >= min) return false; opt = T(min); return true; } template inline bool CheckRangeOrClip(T & opt, I min, I max) { if (opt < static_cast(min)) { opt = static_cast(min); return true; } if (opt > static_cast(max)) { opt = static_cast(max); return true; } return false; } template inline bool CheckRangeOrSetDefault(T & opt, T min, T max, T dflt) { if (opt >= min && opt <= max) return false; opt = dflt; return true; } inline bool CheckTriState(mfxU16 opt) { return Check(opt); } inline bool CheckTriStateOrZero(mfxU16& opt) { return CheckOrZero(opt); } template::value, int>::type = 0> inline TVal GetOrCall(TArg val) { return val(); } template::value>::type> inline TVal GetOrCall(TArg val) { return TVal(val); } template inline bool SetDefault(T& opt, TF get_dflt) { if (opt) return false; opt = GetOrCall(get_dflt); return true; } inline void SetDefaultOpt(mfxU16 &opt, bool bCond) { SetDefault(opt, bCond ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF); } template inline bool SetIf(T& opt, bool bSet, TF get) { if (!bSet) return false; opt = GetOrCall(get); return true; } template inline bool SetIf(T& opt, bool bSet, TF&& get, TA&&... arg) { if (!bSet) return false; opt = get(std::forward(arg)...); return true; } template inline bool InheritOption(T optInit, T & optReset) { if (optReset == 0) { optReset = optInit; return true; } return false; } template TDstIt InheritOptions(TSrcIt initFirst, TSrcIt initLast, TDstIt resetFirst) { while (initFirst != initLast) { InheritOption(*initFirst++, *resetFirst++); } return resetFirst; } inline mfxU16 Bool2CO(bool bOptON) { return mfxU16(MFX_CODINGOPTION_OFF - !!bOptON * MFX_CODINGOPTION_ON); } template inline bool AlignDown(T& value, mfxU32 alignment) { assert((alignment & (alignment - 1)) == 0); // should be 2^n if (!(value & (alignment - 1))) return false; value = value & ~(alignment - 1); return true; } template inline bool AlignUp(T& value, mfxU32 alignment) { assert((alignment & (alignment - 1)) == 0); // should be 2^n if (!(value & (alignment - 1))) return false; value = (value + alignment - 1) & ~(alignment - 1); return true; } namespace frametype { inline bool IsIdr(mfxU32 type) { return !!(type & MFX_FRAMETYPE_IDR); } inline bool IsI(mfxU32 type) { return !!(type & MFX_FRAMETYPE_I); } inline bool IsB(mfxU32 type) { return !!(type & MFX_FRAMETYPE_B); } inline bool IsP(mfxU32 type) { return !!(type & MFX_FRAMETYPE_P); } inline bool IsRef(mfxU32 type) { return !!(type & MFX_FRAMETYPE_REF); } } } class PODArraysHolder { public: template T& PushBack(T*& p) { auto IsSameData = [p](std::vector& v) { return (uint8_t*)p == v.data(); }; auto it = std::find_if(std::begin(m_attachedData), std::end(m_attachedData), IsSameData); if (it == m_attachedData.end()) { m_attachedData.emplace_back(std::vector(sizeof(T), 0)); return *(p = (T*)m_attachedData.back().data()); } auto itNew = it->insert(it->end(), sizeof(T), 0); p = (T*)it->data(); return *(T*)&*itNew; } protected: std::list> m_attachedData; }; template class Timer { public: Timer(Representation left) : m_end(std::chrono::steady_clock::now() + Duration(left)) {} Timer(std::chrono::steady_clock::time_point end) : m_end(end) {} Representation Left() const { auto now = std::chrono::steady_clock::now(); return m_end < now ? Representation{} : Representation(std::chrono::duration_cast(m_end - now).count()); } std::chrono::steady_clock::time_point End() const { return m_end; } static bool Expired(Representation left) { return left == Representation{}; } bool Expired() const { return Expired(Left()); } protected: std::chrono::steady_clock::time_point m_end; }; template class ResettableTimer : public Timer { public: ResettableTimer(Representation left = Representation{}) : Timer(left) {} void Reset(Representation left) { this->m_end = std::chrono::steady_clock::now() + Duration(left); m_running = true; } bool IsRunnig() const { return m_running; } void Stop() { m_running = false; } private: bool m_running = false; }; template using TimerMs = Timer; using ResettableTimerMs = ResettableTimer; inline mfxExtBuffer* GetExtBuffer(mfxExtBuffer** ExtParam, mfxU32 NumExtParam, mfxU32 BufferId, mfxU32 offset = 0) { if (!ExtParam) return nullptr; mfxU32 count = 0; for (mfxU32 i = 0; i < NumExtParam; ++i) { if (ExtParam[i] && ExtParam[i]->BufferId == BufferId && count++ == offset) { return ExtParam[i]; } } return nullptr; } } //namespace mfx inline mfxStatus CheckAndDestroyVAbuffer(VADisplay display, VABufferID & buffer_id) { if (buffer_id != VA_INVALID_ID) { VAStatus vaSts = vaDestroyBuffer(display, buffer_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); buffer_id = VA_INVALID_ID; } return MFX_ERR_NONE; } inline mfxStatus AddRefSurface(mfxFrameSurface1 & surf, bool allow_legacy_surface = false) { if (allow_legacy_surface && !surf.FrameInterface) { return MFX_ERR_NONE; } MFX_CHECK(surf.FrameInterface && surf.FrameInterface->AddRef, MFX_ERR_UNSUPPORTED); return surf.FrameInterface->AddRef(&surf); } inline mfxStatus ReleaseSurface(mfxFrameSurface1 & surf, bool allow_legacy_surface = false) { if (allow_legacy_surface && !surf.FrameInterface) { return MFX_ERR_NONE; } MFX_CHECK(surf.FrameInterface && surf.FrameInterface->Release, MFX_ERR_UNSUPPORTED); return surf.FrameInterface->Release(&surf); } struct surface_refcount_scoped_lock : public std::unique_ptr { surface_refcount_scoped_lock(mfxFrameSurface1* surface) : std::unique_ptr( surface, [](mfxFrameSurface1* surface) { std::ignore = MFX_STS_TRACE(ReleaseSurface(*surface)); }) {} }; struct mfxRefCountable { virtual mfxU32 GetRefCounter() const = 0; virtual void AddRef() = 0; virtual mfxStatus Release() = 0; }; template struct mfxRefCountableInstance { static mfxRefCountable* Get(T* object) { return static_cast(object); } }; template class mfxRefCountableImpl : public mfxRefCountable , public T { protected: template struct HasRefInterface : std::false_type { }; template struct HasRefInterface : std::true_type { }; template ::value, bool>::type = true> void AssignFunctionPointers() { T::RefInterface.AddRef = _AddRef2; T::RefInterface.Release = _Release2; T::RefInterface.GetRefCounter = _GetRefCounter2; } template ::value, bool>::type = true> void AssignFunctionPointers() { T::AddRef = _AddRef; T::Release = _Release; T::GetRefCounter = _GetRefCounter; } public: mfxRefCountableImpl() : T() , m_ref_count(0) { #if defined (MFX_DEBUG_REFCOUNT) g_global_registry.RegisterRefcountObject(this); #endif AssignFunctionPointers(); } virtual ~mfxRefCountableImpl() { if (m_ref_count.load(std::memory_order_relaxed) != 0) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); } #if defined (MFX_DEBUG_REFCOUNT) g_global_registry.UnregisterRefcountObject(this); #endif } mfxU32 GetRefCounter() const override { return m_ref_count.load(std::memory_order_relaxed); } void AddRef() override { std::ignore = m_ref_count.fetch_add(1, std::memory_order_relaxed); } mfxStatus Release() override { MFX_CHECK(m_ref_count.load(std::memory_order_relaxed), MFX_ERR_UNDEFINED_BEHAVIOR); // fetch_sub return value immediately preceding if (m_ref_count.fetch_sub(1, std::memory_order_relaxed) - 1 == 0) { // Refcount is zero // Update state of parent allocator if set Close(); // Delete refcounted object, here wrapper is finally destroyed and underlying texture / memory released delete this; } return MFX_ERR_NONE; } static mfxStatus _AddRef(U* object) { MFX_CHECK_NULL_PTR1(object); auto instance = mfxRefCountableInstance::Get(object); MFX_CHECK_HDL(instance); instance->AddRef(); return MFX_ERR_NONE; } static mfxStatus _Release(U* object) { MFX_CHECK_NULL_PTR1(object); auto instance = mfxRefCountableInstance::Get(object); MFX_CHECK_HDL(instance); return instance->Release(); } static mfxStatus _GetRefCounter(U* object, mfxU32* counter) { MFX_CHECK_NULL_PTR1(object); MFX_CHECK_NULL_PTR1(counter); auto instance = mfxRefCountableInstance::Get(object); MFX_CHECK_HDL(instance); *counter = instance->GetRefCounter(); return MFX_ERR_NONE; } static mfxStatus _AddRef2(mfxRefInterface* object) { MFX_CHECK_NULL_PTR1(object); auto instance = static_cast(object->Context); MFX_CHECK_HDL(instance); instance->AddRef(); return MFX_ERR_NONE; } static mfxStatus _Release2(mfxRefInterface* object) { MFX_CHECK_NULL_PTR1(object); auto instance = static_cast(object->Context); MFX_CHECK_HDL(instance); return instance->Release(); } static mfxStatus _GetRefCounter2(mfxRefInterface* object, mfxU32* counter) { MFX_CHECK_NULL_PTR1(object); MFX_CHECK_NULL_PTR1(counter); auto instance = static_cast(object->Context); MFX_CHECK_HDL(instance); *counter = instance->GetRefCounter(); return MFX_ERR_NONE; } protected: virtual void Close() { return; } private: std::atomic m_ref_count; }; // This class calls release at destruction template struct unique_ptr_refcountable : public std::unique_ptr { explicit unique_ptr_refcountable(RefCountable* refcountable = nullptr) : std::unique_ptr( refcountable, [](RefCountable* obj) { auto instance = mfxRefCountableInstance::Get(obj); instance->Release(); }) {} }; #define MFX_EQ_FIELD(Field) l.Field == r.Field #define MFX_EQ_ARRAY(Array, Num) std::equal(l.Array, l.Array + Num, r.Array) #define MFX_DECL_OPERATOR_NOT_EQ(Name) \ static inline bool operator!=(Name const& l, Name const& r) \ { \ return !(l == r); \ } static inline bool operator==(mfxPluginUID const& l, mfxPluginUID const& r) { return MFX_EQ_ARRAY(Data, 16); } MFX_DECL_OPERATOR_NOT_EQ(mfxPluginUID) static inline bool operator==(mfxGUID const& l, mfxGUID const& r) { return MFX_EQ_ARRAY(Data, 16); } MFX_DECL_OPERATOR_NOT_EQ(mfxGUID) static inline bool operator==(mfxExtBuffer const& l, mfxExtBuffer const& r) { return MFX_EQ_FIELD(BufferId) && MFX_EQ_FIELD(BufferSz); } static inline bool operator==(mfxExtAllocationHints const& l, mfxExtAllocationHints const& r) { return MFX_EQ_FIELD(Header) && MFX_EQ_FIELD(AllocationPolicy) && MFX_EQ_FIELD(NumberToPreAllocate) && MFX_EQ_FIELD(DeltaToAllocateOnTheFly) && MFX_EQ_FIELD(VPPPoolType) && MFX_EQ_FIELD(Wait); } inline mfxStatus CheckAllocationHintsBuffer(const mfxExtAllocationHints& allocation_hints, bool is_vpp = false) { switch (allocation_hints.AllocationPolicy) { case MFX_ALLOCATION_OPTIMAL: MFX_CHECK(!allocation_hints.NumberToPreAllocate, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); MFX_CHECK(!allocation_hints.DeltaToAllocateOnTheFly, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); break; case MFX_ALLOCATION_UNLIMITED: MFX_CHECK(!allocation_hints.DeltaToAllocateOnTheFly, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); break; case MFX_ALLOCATION_LIMITED: break; default: MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); } if (is_vpp) { MFX_CHECK(allocation_hints.VPPPoolType == MFX_VPP_POOL_IN || allocation_hints.VPPPoolType == MFX_VPP_POOL_OUT, MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } enum class ComponentType { UNINITIALIZED = 0, DECODE = 1, ENCODE = 2, VPP = 3 }; template struct surface_cache_controller { surface_cache_controller(CacheType* cache, ComponentType type, mfxVPPPoolType vpp_pool_type = mfxVPPPoolType(-1)) : m_cache(cache) , m_type(type) , m_vpp_pool(vpp_pool_type) {} ~surface_cache_controller() { Close(); } mfxStatus SetupCache(mfxSession session, const mfxVideoParam& par) { auto it = std::find_if(par.ExtParam, par.ExtParam + par.NumExtParam, [this](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS && (m_type != ComponentType::VPP || reinterpret_cast(buffer)->VPPPoolType == m_vpp_pool); }); mfxExtAllocationHints* allocation_hints = nullptr; bool optimal_caching_policy_requested = false; if (it != par.ExtParam + par.NumExtParam) { allocation_hints = reinterpret_cast(*it); optimal_caching_policy_requested = allocation_hints->AllocationPolicy == MFX_ALLOCATION_OPTIMAL; } if (optimal_caching_policy_requested) { // Use temporal copy for possible IOPattern adjustment. Hitorically Init doesn't require setting of IOPatter, but QueryIOSurf does. // This function is invoked during Init mfxVideoParam tmp_par = par; switch (m_type) { case ComponentType::DECODE: { mfxFrameAllocRequest req = {}; if (!tmp_par.IOPattern) tmp_par.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; mfxStatus sts = MFX_STS_TRACE(MFXVideoDECODE_QueryIOSurf(session, &tmp_par, &req)); MFX_CHECK(sts >= MFX_ERR_NONE, sts); m_required_num_surf = req.NumFrameSuggested; } break; case ComponentType::ENCODE: { mfxFrameAllocRequest req = {}; if (!tmp_par.IOPattern) tmp_par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; mfxStatus sts = MFX_STS_TRACE(MFXVideoENCODE_QueryIOSurf(session, &tmp_par, &req)); MFX_CHECK(sts >= MFX_ERR_NONE, sts); m_required_num_surf = req.NumFrameSuggested; } break; case ComponentType::VPP: { mfxFrameAllocRequest req[2] = {}; if (!tmp_par.IOPattern) tmp_par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; mfxStatus sts = MFX_STS_TRACE(MFXVideoVPP_QueryIOSurf(session, &tmp_par, req)); MFX_CHECK(sts >= MFX_ERR_NONE, sts); MFX_CHECK(m_vpp_pool == MFX_VPP_POOL_IN || m_vpp_pool == MFX_VPP_POOL_OUT, MFX_ERR_INVALID_VIDEO_PARAM); m_required_num_surf = req[m_vpp_pool].NumFrameSuggested; } break; default: MFX_RETURN(MFX_ERR_NOT_IMPLEMENTED); } } MFX_CHECK(m_cache, MFX_ERR_NOT_INITIALIZED); if (!allocation_hints) return MFX_ERR_NONE; MFX_SAFE_CALL(CheckAllocationHintsBuffer(*allocation_hints, m_type == ComponentType::VPP)); MFX_SAFE_CALL(m_cache->SetupPolicy(*allocation_hints)); if (optimal_caching_policy_requested) { unique_ptr_refcountable scoped_surface_lock(m_cache.get()); // AddRef here because m_cache is also a smart pointer, so will be decremented twice MFX_SAFE_CALL(scoped_surface_lock->AddRef(scoped_surface_lock.get())); MFX_CHECK(m_updated_caches.find(scoped_surface_lock) == std::end(m_updated_caches), MFX_ERR_UNKNOWN); MFX_SAFE_CALL(m_cache->UpdateLimits(m_required_num_surf)); m_updated_caches[std::move(scoped_surface_lock)] = m_required_num_surf; } m_cache_hints_set = *allocation_hints; return MFX_ERR_NONE; } mfxStatus Update(const mfxFrameSurface1& surf) { if (!surf.FrameInterface) return MFX_ERR_NONE; MFX_CHECK_HDL(surf.FrameInterface->QueryInterface); mfxSurfacePoolInterface* pool_interface = nullptr; MFX_SAFE_CALL(surf.FrameInterface->QueryInterface(const_cast(&surf), MFX_GUID_SURFACE_POOL, reinterpret_cast(&pool_interface))); MFX_CHECK_HDL(pool_interface); unique_ptr_refcountable scoped_surface_lock(pool_interface); // If pool already was updated, do nothing if (m_updated_caches.find(scoped_surface_lock) != std::end(m_updated_caches)) return MFX_ERR_NONE; MFX_CHECK_HDL(scoped_surface_lock->GetAllocationPolicy); mfxPoolAllocationPolicy policy; MFX_SAFE_CALL(scoped_surface_lock->GetAllocationPolicy(scoped_surface_lock.get(), &policy)); if (policy != MFX_ALLOCATION_OPTIMAL) return MFX_ERR_NONE; MFX_SAFE_CALL(scoped_surface_lock->SetNumSurfaces(scoped_surface_lock.get(), m_required_num_surf)); m_updated_caches[std::move(scoped_surface_lock)] = m_required_num_surf; return MFX_ERR_NONE; } mfxStatus ResetCache(const mfxVideoParam& par) { return ResetCache(par.ExtParam, par.NumExtParam); } mfxStatus ResetCache(mfxExtBuffer** ExtParam, mfxU16 NumExtParam) { MFX_CHECK(m_cache, MFX_ERR_NOT_INITIALIZED); auto allocation_hints = std::find_if(ExtParam, ExtParam + NumExtParam, [this](mfxExtBuffer* buffer) { return buffer->BufferId == MFX_EXTBUFF_ALLOCATION_HINTS /* According to VPL spec reserved fields should be zeroed, so VPPPoolType is zero for non-VPP components */ && reinterpret_cast(buffer)->VPPPoolType == m_cache_hints_set.VPPPoolType; }); if (allocation_hints != ExtParam + NumExtParam) { // For now it is not allowed to change cache parameters during Reset MFX_CHECK(*reinterpret_cast(*allocation_hints) == m_cache_hints_set, MFX_ERR_INVALID_VIDEO_PARAM); } return MFX_ERR_NONE; } void Close() { if (!m_cache) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return; } // Revoke in other caches (pools) for (auto& pool_num_surf : m_updated_caches) std::ignore = MFX_STS_TRACE(pool_num_surf.first->RevokeSurfaces(pool_num_surf.first.get(), pool_num_surf.second)); m_updated_caches.clear(); } CacheType* operator->() { MFX_CHECK_WITH_THROW_STS(m_cache, MFX_ERR_NOT_INITIALIZED); return m_cache.get(); } private: unique_ptr_refcountable m_cache; ComponentType m_type; mfxVPPPoolType m_vpp_pool; mfxU16 m_required_num_surf = 0; mfxExtAllocationHints m_cache_hints_set = {}; struct ptr_comparator { bool operator()(const unique_ptr_refcountable& left, const unique_ptr_refcountable& right) const { return left.get() < right.get(); } }; std::map, mfxU32, ptr_comparator> m_updated_caches; }; struct GUID { size_t GetHashCode() const { std::stringstream ss; ss << Data1 << Data2 << Data3 // Pass Data4 element-wise to allow zeroes in GUID << Data4[0] << Data4[1] << Data4[2] << Data4[3] << Data4[4] << Data4[5] << Data4[6] << Data4[7]; return std::hash()(ss.str()); } unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; }; static inline int operator==(const GUID& guidOne, const GUID& guidOther) { return guidOne.Data1 == guidOther.Data1 && guidOne.Data2 == guidOther.Data2 && guidOne.Data3 == guidOther.Data3 && std::equal(guidOne.Data4, guidOne.Data4 + sizeof(guidOne.Data4), guidOther.Data4); } inline bool IsOn(mfxU32 opt) { return opt == MFX_CODINGOPTION_ON; } inline bool IsOff(mfxU32 opt) { return opt == MFX_CODINGOPTION_OFF; } inline bool IsAdapt(mfxU32 opt) { return opt == MFX_CODINGOPTION_ADAPTIVE; } inline void* AlignedMalloc(size_t size, size_t alignment) { return aligned_alloc(alignment, size); } inline void AlignedFree(void* memory) { free(memory); } #endif // __MFXUTILS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_vpp_helper.h000066400000000000000000000043021443134507600270140ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfx_task.h" #ifndef _MFX_VPP_HELPER_H_ #define _MFX_VPP_HELPER_H_ class VideoVPPMain; class MfxVppHelper { public: MfxVppHelper(VideoCORE* core, mfxStatus* mfxRes); virtual ~MfxVppHelper(); virtual mfxStatus Init(mfxVideoParam* param); virtual mfxStatus Reset(mfxVideoParam* param); virtual mfxStatus Close(); virtual mfxStatus Submit(mfxFrameSurface1* input, mfxFrameSurface1* output = nullptr); virtual mfxFrameSurface1 const& GetOutputSurface() const; protected: mfxStatus CreateVpp(mfxVideoParam* param); void DestroyVpp(); protected: bool m_bInitialized = false; bool m_taskSubmitted= false; VideoCORE* m_core = nullptr; std::unique_ptr m_pVpp; MFX_ENTRY_POINT m_entryPoint[2] = {}; mfxFrameAllocResponse m_dsResponse = {}; mfxFrameSurface1 m_dsSurface = {}; mfxU16 m_dstWidth = 128; // target down scaled size mfxU16 m_dstHeight = 64; }; #endif // !_MFX_VPP_HELPER_H_oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_vpp_hint_buf.h000066400000000000000000000032271443134507600273400ustar00rootroot00000000000000// Copyright (c) 2008-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_VPP_HINT_BUF_H__ #define __MFX_VPP_HINT_BUF_H__ #include "mfxdefs.h" #include "mfxstructures.h" typedef struct _mfxVPPHintDenoise { mfxExtBuffer Header; } mfxVPPHintDenoise; typedef struct _mfxVPPHintRangeMap { mfxExtBuffer Header; mfxU8 RangeMap; mfxU8 Reserved[3]; } mfxVPPHintRangeMap; typedef struct _mfxVPPHintVideoAnalysis { mfxExtBuffer Header; /*mfxU32 SpatialComplexity; mfxU32 TemporalComplexity; mfxU32 SceneChangeRate;*/ } mfxVPPHintVideoAnalysis; #endif //__MFX_VPP_HINT_BUF_H__oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_vpp_interface.h000066400000000000000000000552721443134507600275110ustar00rootroot00000000000000// Copyright (c) 2018-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "mfxcamera.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_DDI_H #define __MFX_VPP_DDI_H #include #include #include "mfxdefs.h" #include "libmfx_core.h" #include "mfx_platform_headers.h" typedef unsigned int UINT; typedef struct tagVPreP_StatusParams_V1_0 { UINT StatusReportID; UINT Reserved1; } VPreP_StatusParams_V1_0; typedef struct tagFASTCOMP_QUERY_STATUS { UINT QueryStatusID; UINT Status; UINT Reserved0; UINT Reserved1; UINT Reserved2; UINT Reserved3; UINT Reserved4; } FASTCOMP_QUERY_STATUS; typedef enum _VPREP_ISTAB_MODE { ISTAB_MODE_NONE, ISTAB_MODE_BLACKEN, ISTAB_MODE_UPSCALE } VPREP_ISTAB_MODE; namespace MfxHwVideoProcessing { const mfxU32 g_TABLE_SUPPORTED_FOURCC [] = { MFX_FOURCC_NV12 , MFX_FOURCC_YV12 , MFX_FOURCC_NV16 , MFX_FOURCC_YUY2 , MFX_FOURCC_RGB3 , MFX_FOURCC_RGB4 , MFX_FOURCC_BGR4 , #if defined (MFX_ENABLE_FOURCC_RGB565) MFX_FOURCC_RGB565 , #endif #ifdef MFX_ENABLE_RGBP MFX_FOURCC_RGBP , #endif MFX_FOURCC_P8 , MFX_FOURCC_P8_TEXTURE, MFX_FOURCC_P010 , MFX_FOURCC_P210 , MFX_FOURCC_A2RGB10 , MFX_FOURCC_ARGB16 , MFX_FOURCC_R16 , MFX_FOURCC_AYUV , MFX_FOURCC_AYUV_RGB4 , MFX_FOURCC_UYVY , MFX_FOURCC_Y210 , MFX_FOURCC_Y410 , MFX_FOURCC_P016 , MFX_FOURCC_Y216 , MFX_FOURCC_Y416 , MFX_FOURCC_BGRP , MFX_FOURCC_ABGR16F , MFX_FOURCC_I420 , }; typedef enum mfxFormatSupport { MFX_FORMAT_SUPPORT_INPUT = 1, MFX_FORMAT_SUPPORT_OUTPUT = 2 } mfxFormatSupport; struct RateRational { mfxU32 FrameRateExtN; mfxU32 FrameRateExtD; }; struct CustomRateData { RateRational customRate; mfxU32 inputFramesOrFieldPerCycle; mfxU32 outputIndexCountPerCycle; mfxU32 bkwdRefCount; mfxU32 fwdRefCount; mfxU32 indexRateConversion; }; struct FrcCaps { std::vector customRateData; }; struct DstRect { mfxU32 DstX; mfxU32 DstY; mfxU32 DstW; mfxU32 DstH; mfxU16 LumaKeyEnable; mfxU16 LumaKeyMin; mfxU16 LumaKeyMax; mfxU16 GlobalAlphaEnable; mfxU16 GlobalAlpha; mfxU16 PixelAlphaEnable; mfxU16 IOPattern; //sys/video/opaque memory mfxU16 ChromaFormat; mfxU32 FourCC; mfxU32 TileId; }; typedef struct _CameraCaps { mfxU32 uBlackLevelCorrection; mfxU32 uHotPixelCheck; mfxU32 uWhiteBalance; mfxU32 uColorCorrectionMatrix; mfxU32 uGammaCorrection; mfxU32 uVignetteCorrection; mfxU32 u3DLUT; mfxU32 uCscYuvRgb; mfxU32 uTotalColorControl; mfxU32 uLensGeomDistCorrection; mfxU32 uPadding; mfxU32 uBayerDenoise; } CameraCaps; struct mfxVppCaps { mfxU32 uAdvancedDI; mfxU32 uSimpleDI; mfxU32 uInverseTC; mfxU32 uDenoiseFilter; #ifdef MFX_ENABLE_MCTF mfxU32 uMCTF; #endif mfxU32 uDetailFilter; mfxU32 uProcampFilter; mfxU32 uSceneChangeDetection; CameraCaps cameraCaps; mfxU32 uFrameRateConversion; mfxU32 uDeinterlacing; mfxU32 uVideoSignalInfoInOut; mfxU32 uHdr10ToneMapping; mfxU32 uVideoSignalInfo; FrcCaps frcCaps; mfxU32 uIStabFilter; mfxU32 uVariance; mfxI32 iNumBackwardSamples; mfxI32 iNumForwardSamples; mfxU32 uMaxWidth; mfxU32 uMaxHeight; mfxU32 uMinWidth; mfxU32 uMinHeight; mfxU32 uFieldWeavingControl; mfxU32 uRotation; mfxU32 uScaling; mfxU32 uChromaSiting; std::map mFormatSupport; mfxU32 uMirroring; mfxU32 uFieldProcessing; mfxU32 u3DLut; mfxU32 uDenoise2Filter; // mfxExtVPPDenoise2 mfxVppCaps() : uAdvancedDI(0) , uSimpleDI(0) , uInverseTC(0) , uDenoiseFilter(0) #ifdef MFX_ENABLE_MCTF , uMCTF(0) #endif , uDetailFilter(0) , uProcampFilter(0) , uSceneChangeDetection(0) , uFrameRateConversion(0) , uDeinterlacing(0) , uVideoSignalInfoInOut(0) , uHdr10ToneMapping(0) , uVideoSignalInfo(0) , frcCaps() , uIStabFilter(0) , uVariance(0) , iNumBackwardSamples(0) , iNumForwardSamples(0) , uMaxWidth(0) , uMaxHeight(0) , uMinWidth(0) , uMinHeight(0) , uFieldWeavingControl(0) , uRotation(0) , uScaling(0) , uChromaSiting(0) , mFormatSupport() , uMirroring(0) , uFieldProcessing(0) , u3DLut(0) , uDenoise2Filter(0) { memset(&cameraCaps, 0, sizeof(CameraCaps)); }; }; typedef struct _mfxDrvSurface { mfxFrameInfo frameInfo; mfxHDLPair hdl; mfxMemId memId; bool bExternal; mfxU64 startTimeStamp; mfxU64 endTimeStamp; } mfxDrvSurface; // Scene change detection typedef enum { VPP_NO_SCENE_CHANGE = 0, VPP_SCENE_NEW = 1, // BOB display current field to generate output VPP_MORE_SCENE_CHANGE_DETECTED = 2 // BOB display only first field to avoid out of frame order } vppScene; // mfxVideoSignalInfo is for MFX_EXTBUFF_VIDEO_SIGNAL_INFO which supports the video signal info // in the video spec theoretically. See the mfxExtVideoSignalInfo structure for details. struct mfxVideoSignalInfo { bool enabled; mfxU16 VideoFormat; mfxU16 VideoFullRange; mfxU16 ColourDescriptionPresent; mfxU16 ColourPrimaries; mfxU16 TransferCharacteristics; mfxU16 MatrixCoefficients; bool operator!=(const mfxVideoSignalInfo & other) const { return enabled != other.enabled || VideoFormat != other.VideoFormat || VideoFullRange != other.VideoFullRange || ColourPrimaries != other.ColourPrimaries || TransferCharacteristics != other.TransferCharacteristics || MatrixCoefficients != other.MatrixCoefficients; } }; class mfxExecuteParams { // SignalInfo is for MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO which only // supports the signal info of SDR struct SignalInfo { bool enabled; mfxU16 TransferMatrix; mfxU16 NominalRange; bool operator!=(const SignalInfo & other) const { return enabled != other.enabled || TransferMatrix != other.TransferMatrix || NominalRange != other.NominalRange; } }; struct Lut3DInfo { bool Enabled; mfxMemId MemId; mfxDataType DataType; mfxResourceType BufferType; mfx3DLutMemoryLayout MemLayout; mfx3DLutChannelMapping ChannelMapping; mfxChannel Channel[3]; }; public: mfxExecuteParams(): targetSurface() ,targetTimeStamp() ,pRefSurfaces(0) ,refCount(0) ,bkwdRefCount(0) ,fwdRefCount(0) ,iDeinterlacingAlgorithm(0) ,bFMDEnable(false) ,bDenoiseAutoAdjust(false) ,denoiseFactor(0) ,denoiseFactorOriginal(0) ,denoiseMode(MFX_DENOISE_MODE_DEFAULT) ,bdenoiseAdvanced(false) ,bDetailAutoAdjust(false) ,detailFactor(0) ,detailFactorOriginal(0) ,iTargetInterlacingMode(0) ,bEnableProcAmp(false) ,Brightness(0) ,Contrast(0) ,Hue(0) ,Saturation(0) ,bVarianceEnable(false) ,bImgStabilizationEnable(false) ,istabMode(0) ,bFRCEnable(false) ,frcModeOrig(0) ,bComposite(false) ,dstRects(0) ,bBackgroundRequired(true) ,iBackgroundColor(0) ,iTilesNum4Comp(0) ,execIdx(NO_INDEX) ,initialStreamNum(0) ,statusReportID(0) ,bFieldWeaving(false) ,bFieldWeavingExt(false) ,bFieldSplittingExt(false) ,iFieldProcessingMode(0) ,bCameraPipeEnabled(false) ,bCameraPipeControl(0) ,CameraPipeControl() ,bCameraBlackLevelCorrection(false) ,CameraBlackLevel() ,bCameraWhiteBalaceCorrection(false) ,CameraWhiteBalance() ,bCameraHotPixelRemoval(false) ,CameraHotPixel() ,bCCM(false) ,CCMParams() ,bCameraTCC(false) ,CameraTCC() ,bCameraRGBtoYUV(false) ,CameraRGBToYUV() ,bCameraGammaCorrection(false) ,CameraForwardGammaCorrection() ,bCameraVignetteCorrection(false) ,CameraVignetteCorrection() ,bCameraLensCorrection(false) ,CameraLensCorrection() ,bCamera3DLUT(false) ,Camera3DLUT() ,bCameraPadding(false) ,CameraPadding() ,bCameraBayerDenoise(false) ,CameraBayerDenoise() ,rotation(0) ,scalingMode(MFX_SCALING_MODE_DEFAULT) ,interpolationMethod(MFX_INTERPOLATION_DEFAULT) ,chromaSiting(MFX_CHROMA_SITING_UNKNOWN) ,bEOS(false) ,mirroring(0) ,mirroringPosition(0) ,mirroringExt(false) ,scene(VPP_NO_SCENE_CHANGE) ,bDeinterlace30i60p(false) #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) ,gpuHangTrigger(false) #endif #ifdef MFX_ENABLE_MCTF , bEnableMctf(false) , MctfFilterStrength(0) #endif #if defined (ONEVPL_EXPERIMENTAL) , bEnablePercEncFilter(false) #endif , reset(0) { memset(&targetSurface, 0, sizeof(mfxDrvSurface)); dstRects.clear(); memset(&customRateData, 0, sizeof(CustomRateData)); VideoSignalInfoIn.enabled = false; VideoSignalInfoIn.NominalRange = MFX_NOMINALRANGE_16_235; VideoSignalInfoIn.TransferMatrix = MFX_TRANSFERMATRIX_BT601; VideoSignalInfoOut.enabled = false; VideoSignalInfoOut.NominalRange = MFX_NOMINALRANGE_16_235; VideoSignalInfoOut.TransferMatrix = MFX_TRANSFERMATRIX_BT601; VideoSignalInfo.clear(); VideoSignalInfo.assign(1, VideoSignalInfoIn); lut3DInfo= {}; m_inVideoSignalInfo = {}; m_outVideoSignalInfo = {}; inHDR10MetaData = {}; outHDR10MetaData = {}; }; bool IsDoNothing() { CustomRateData refCustomRateData; memset(&refCustomRateData, 0, sizeof(CustomRateData)); if (memcmp(&refCustomRateData, &customRateData, sizeof(CustomRateData))) return false; if (iDeinterlacingAlgorithm != 0 || bFMDEnable != 0 || bDenoiseAutoAdjust != 0 || bDetailAutoAdjust != 0 || denoiseFactor != 0 || bdenoiseAdvanced != false || detailFactor != 0 || iTargetInterlacingMode != 0 || bEnableProcAmp != false || bVarianceEnable != false || bImgStabilizationEnable != false || bFRCEnable != false || bComposite != false || bFieldWeaving != false || bFieldSplittingExt != false || iFieldProcessingMode != 0 || bCameraPipeEnabled != false || bCameraBlackLevelCorrection != false || bCameraGammaCorrection != false || bCameraHotPixelRemoval != false || bCameraWhiteBalaceCorrection != false || bCCM != false || bCameraLensCorrection != false || rotation != 0 || scalingMode != MFX_SCALING_MODE_DEFAULT || mirroring != 0 || mirroringExt != false || scene != VPP_NO_SCENE_CHANGE || bDeinterlace30i60p != false || chromaSiting != MFX_CHROMA_SITING_UNKNOWN #ifdef MFX_ENABLE_MCTF || bEnableMctf != false #endif #if defined (ONEVPL_EXPERIMENTAL) || bEnablePercEncFilter #endif || lut3DInfo.Enabled != false ) return false; if (VideoSignalInfoIn != VideoSignalInfoOut) return false; if (m_inVideoSignalInfo != m_outVideoSignalInfo) return false; return true; }; //surfaces mfxDrvSurface targetSurface; mfxU64 targetTimeStamp; mfxDrvSurface* pRefSurfaces; int refCount; // refCount == bkwdRefCount + 1 + fwdRefCount int bkwdRefCount; // filled from DdiTask int fwdRefCount; // // params mfxI32 iDeinterlacingAlgorithm; //0 - none, 1 - BOB, 2 - advanced (means reference need) bool bFMDEnable; bool bDenoiseAutoAdjust; // MFX_EXTBUFF_VPP_DENOISE mfxU16 denoiseFactor; // MFX_EXTBUFF_VPP_DENOISE mfxU16 denoiseFactorOriginal; // MFX_EXTBUFF_VPP_DENOISE, Original denoise factor or strength provided by app. mfxDenoiseMode denoiseMode; // MFX_EXTBUFF_VPP_DENOISE2 Denoise mode mfxU16 denoiseStrength; // MFX_EXTBUFF_VPP_DENOISE2 denoiseStrength bool bdenoiseAdvanced; // Indicate MFX_EXTBUFF_VPP_DENOISE2 bool bDetailAutoAdjust; mfxU16 detailFactor; mfxU16 detailFactorOriginal; // Original detail factor provided by app. mfxU32 iTargetInterlacingMode; bool bEnableProcAmp; mfxF64 Brightness; mfxF64 Contrast; mfxF64 Hue; mfxF64 Saturation; bool bVarianceEnable; bool bImgStabilizationEnable; mfxU32 istabMode; bool bFRCEnable; CustomRateData customRateData; mfxU16 frcModeOrig; // Original mode provided by app bool bComposite; std::vector dstRects; bool bBackgroundRequired; mfxU64 iBackgroundColor; mfxU32 iTilesNum4Comp; mfxU32 execIdx; //index call of execute for current frame, actual for composition mfxU32 initialStreamNum; mfxU32 statusReportID; bool bFieldWeaving; bool bFieldWeavingExt; bool bFieldSplittingExt; mfxU32 iFieldProcessingMode; // Camera Pipe specific params bool bCameraPipeEnabled; bool bCameraPipeControl; mfxExtCamPipeControl CameraPipeControl; bool bCameraBlackLevelCorrection; mfxExtCamBlackLevelCorrection CameraBlackLevel; bool bCameraWhiteBalaceCorrection; mfxExtCamWhiteBalance CameraWhiteBalance; bool bCameraHotPixelRemoval; mfxExtCamHotPixelRemoval CameraHotPixel; bool bCCM; mfxExtCamColorCorrection3x3 CCMParams; bool bCameraTCC; mfxExtCamTotalColorControl CameraTCC; bool bCameraRGBtoYUV; mfxExtCamCscYuvRgb CameraRGBToYUV; bool bCameraGammaCorrection; mfxExtCamFwdGamma CameraForwardGammaCorrection; bool bCameraVignetteCorrection; mfxExtCamVignetteCorrection CameraVignetteCorrection; bool bCameraLensCorrection; mfxExtCamLensGeomDistCorrection CameraLensCorrection; bool bCamera3DLUT; mfxExtCam3DLut Camera3DLUT; bool bCameraPadding; mfxExtCamPadding CameraPadding; bool bCameraBayerDenoise; mfxExtCamBayerDenoise CameraBayerDenoise; int rotation; mfxU16 scalingMode; mfxU16 interpolationMethod; mfxU16 chromaSiting; bool bEOS; SignalInfo VideoSignalInfoIn; // Common video signal info set on Init SignalInfo VideoSignalInfoOut; // Video signal info for output std::vector VideoSignalInfo; // Video signal info for each frame in a single run int mirroring; int mirroringPosition; bool mirroringExt; vppScene scene; // Keep information about scene change bool bDeinterlace30i60p; #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) bool gpuHangTrigger; #endif #ifdef MFX_ENABLE_MCTF bool bEnableMctf; mfxU16 MctfFilterStrength; #endif #if defined (ONEVPL_EXPERIMENTAL) bool bEnablePercEncFilter; #endif bool reset; Lut3DInfo lut3DInfo; mfxVideoSignalInfo m_inVideoSignalInfo; mfxVideoSignalInfo m_outVideoSignalInfo; struct HDR10MetaData { bool enabled; mfxU16 displayPrimariesX[3]; mfxU16 displayPrimariesY[3]; mfxU16 whitePoint[2]; mfxU32 maxMasteringLuminance; mfxU32 minMasteringLuminance; mfxU16 maxContentLightLevel; mfxU16 maxFrameAverageLightLevel; }; HDR10MetaData inHDR10MetaData; HDR10MetaData outHDR10MetaData; }; class DriverVideoProcessing { public: virtual ~DriverVideoProcessing(void){} virtual mfxStatus CreateDevice(VideoCORE * core, mfxVideoParam* par, bool isTemporal = false) = 0; virtual mfxStatus ReconfigDevice(mfxU32 indx) = 0; virtual mfxStatus DestroyDevice( void ) = 0; virtual mfxStatus Register(mfxHDLPair* pSurfaces, mfxU32 num, BOOL bRegister) = 0; virtual mfxStatus QueryTaskStatus(SynchronizedTask* pSyncTask) = 0; virtual mfxStatus Execute(mfxExecuteParams *pParams) = 0; virtual mfxStatus QueryCapabilities( mfxVppCaps& caps ) = 0; virtual mfxStatus QueryVariance( mfxU32 frameIndex, std::vector &variance) = 0; }; // DriverVideoProcessing DriverVideoProcessing* CreateVideoProcessing( VideoCORE* core ); }; // namespace /* * Simple proxy for VPP device/caps create. It simplifies having a single * cached vpp processing device accessible thru VideoCORE */ class VPPHWResMng { public: VPPHWResMng(): m_ddi(nullptr), m_caps() {}; ~VPPHWResMng() { Close(); }; mfxStatus Close(void){ m_ddi.reset(0); return MFX_ERR_NONE; } MfxHwVideoProcessing::DriverVideoProcessing *GetDevice(void) const { return m_ddi.get(); }; mfxStatus SetDevice(MfxHwVideoProcessing::DriverVideoProcessing *ddi){ MFX_CHECK_NULL_PTR1(ddi); MFX_CHECK_STS(Close()); m_ddi.reset(ddi); return MFX_ERR_NONE; } MfxHwVideoProcessing::mfxVppCaps GetCaps(void) const { return m_caps; } mfxStatus SetCaps(const MfxHwVideoProcessing::mfxVppCaps &caps){ m_caps = caps; return MFX_ERR_NONE; } mfxStatus CreateDevice(VideoCORE * core); // Just to make ResMang easier to use with existing code of DriverVideoProcessing MfxHwVideoProcessing::DriverVideoProcessing *operator->() const { return m_ddi.get(); } private: VPPHWResMng(const VPPHWResMng &); VPPHWResMng &operator=(const VPPHWResMng &); std::unique_ptr m_ddi; MfxHwVideoProcessing::mfxVppCaps m_caps; }; #endif // __MFX_VPP_BASE_DDI_H #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_vpp_vaapi.h000066400000000000000000000133441443134507600266430ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_VAAPI_H__ #define __MFX_VPP_VAAPI_H__ #include "umc_va_base.h" #include "mfx_vpp_interface.h" #include "mfx_platform_headers.h" #include #include #include #include namespace MfxHwVideoProcessing { class VAAPIVideoProcessing : public DriverVideoProcessing { public: VAAPIVideoProcessing(); virtual ~VAAPIVideoProcessing(); virtual mfxStatus CreateDevice(VideoCORE * core, mfxVideoParam *pParams, bool isTemporal = false); virtual mfxStatus ReconfigDevice(mfxU32 /*indx*/) { return MFX_ERR_NONE; } virtual mfxStatus DestroyDevice( void ); virtual mfxStatus Register(mfxHDLPair* pSurfaces, mfxU32 num, BOOL bRegister); virtual mfxStatus QueryTaskStatus(SynchronizedTask* pSyncTask); virtual mfxStatus QueryCapabilities( mfxVppCaps& caps ); virtual mfxStatus QueryVariance( mfxU32 frameIndex, std::vector &variance); virtual BOOL IsRunning() { return m_bRunning; } virtual mfxStatus Execute(mfxExecuteParams *pParams); virtual mfxStatus Execute_Composition(mfxExecuteParams *pParams); virtual mfxStatus Execute_Composition_TiledVideoWall(mfxExecuteParams *pParams); private: // VideoSignalInfo contains infor for backward reference, current and forward reference // frames. Indices in the info array are: // { , , } // For example, in case of ADI we will have: 1 bwd ref, 1 current, 0 fwd ref; indices will be: // VideoSignalInfo[0] - for bwd ref // VideoSignalInfo[1] - for cur reference inline int GetCurFrameSignalIdx(mfxExecuteParams* pParams) { if (!pParams) return -1; if ((size_t)pParams->bkwdRefCount < pParams->VideoSignalInfo.size()) { return pParams->bkwdRefCount; } return -1; } typedef struct _compositionStreamElement { mfxU16 index; BOOL active; mfxU16 x; mfxU16 y; _compositionStreamElement() : index(0) , active(false) , x(0) , y(0) {}; } compStreamElem; typedef struct vppTileVW{ mfxU32 numChannels; VARectangle targerRect; mfxU8 channelIds[8]; } m_tiledVideoWallParams; BOOL isVideoWall(mfxExecuteParams *pParams); BOOL m_bRunning; VideoCORE* m_core; VADisplay m_vaDisplay; VAConfigID m_vaConfig; protected: VAContextID m_vaContextVPP; private: VAProcFilterCap m_denoiseCaps; VAProcFilterCap m_detailCaps; VAProcPipelineCaps m_pipelineCaps; VAProcFilterCapColorBalance m_procampCaps[VAProcColorBalanceCount]; VAProcFilterCapDeinterlacing m_deinterlacingCaps[VAProcDeinterlacingCount]; #ifdef MFX_ENABLE_VPP_FRC VAProcFilterCapFrameRateConversion m_frcCaps[2]; /* only two modes, 24p->60p and 30p->60p */ mfxU32 m_frcCyclicCounter; #endif VABufferID m_denoiseFilterID; VABufferID m_detailFilterID; VABufferID m_deintFilterID; VABufferID m_procampFilterID; VABufferID m_frcFilterID; mfxU32 m_deintFrameCount; VASurfaceID m_refForFRC[5]; VABufferID m_filterBufs[VAProcFilterCount]; mfxU32 m_numFilterBufs; std::vector m_pipelineParam; std::vector m_pipelineParamID; std::set m_cachedReadyTaskIndex; typedef struct { VASurfaceID surface; mfxU32 number; } ExtVASurface; VASurfaceID* m_primarySurface4Composition ; std::vector m_feedbackCache; UMC::Mutex m_guard; std::vector m_3dlutCaps; VABufferID m_3dlutFilterID; VABufferID m_hvsDenoiseFilterID; VABufferID m_hdrtmFilterID; VAProcFilterCapHighDynamicRange m_hdrtm_caps[VAProcHighDynamicRangeMetadataTypeCount]; mfxStatus Init( _mfxPlatformAccelerationService* pVADisplay, mfxVideoParam *pParams); mfxStatus Close( void ); mfxStatus RemoveBufferFromPipe(VABufferID & id); virtual mfxStatus ConfigHVSDenoise(mfxExecuteParams *pParams); }; }; // namespace #endif //__MFX_VPP_VAAPI_H__ #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfx_vpp_vaapi_simulation.h000066400000000000000000000053001443134507600311000ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #ifndef __MFX_VPP_VAAPI_SIMULATION_H__ #define __MFX_VPP_VAAPI_SIMULATION_H__ #include "umc_va_base.h" #include "mfx_vpp_driver.h" #include "mfx_platform_headers.h" //#include namespace MfxHwVideoProcessing { class VAAPIVideoProcessing : public DriverVideoProcessing { public: VAAPIVideoProcessing(); virtual ~VAAPIVideoProcessing(); virtual mfxStatus CreateDevice(VideoCORE * core); virtual mfxStatus DestroyDevice( void ); virtual mfxStatus Register(mfxHDL *pSurfaces, mfxU32 num, BOOL bRegister); virtual mfxStatus QueryTaskStatus(PREPROC_QUERY_STATUS *pQueryStatus, mfxU32 numStructures); virtual mfxStatus QueryCapabilities( mfxVppCaps& caps ); virtual BOOL IsRunning() { return m_bRunning; } virtual mfxStatus Execute(mfxExecuteParams *pParams); private: BOOL m_bRunning; VideoCORE* m_core; //VADisplay m_vaDisplay; std::vector m_cachedReadyTaskIndex; UMC::Mutex m_guard; _mfxPlatformAccelerationService m_vaDisplay; mfxStatus Init( _mfxPlatformAccelerationService* pVADisplay ); mfxStatus Close( void ); mfxStatus SimulationExecute( VASurfaceID in, VASurfaceID out, mfxFrameInfo srcRect, mfxFrameInfo dstRect); }; }; // namespace #endif //__MFX_VPP_VAAPI_SIMULATION_H__ #endif // MFX_ENABLE_VPP /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfxstructures-int.h000066400000000000000000000514571443134507600275410ustar00rootroot00000000000000// Copyright (c) 2007-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXSTRUCTURES_INT_H__ #define __MFXSTRUCTURES_INT_H__ #include "mfxstructures.h" #include "mfx_config.h" #include "mfxdeprecated.h" #ifdef __cplusplus extern "C" { #endif enum eMFXPlatform { MFX_PLATFORM_SOFTWARE = 0, MFX_PLATFORM_HARDWARE = 1, }; enum eMFXVAType { MFX_HW_NO = 0, MFX_HW_D3D9 = 1, MFX_HW_D3D11 = 2, MFX_HW_VAAPI = 4,// Linux VA-API }; enum eMFXHWType { MFX_HW_UNKNOWN = 0, MFX_HW_SNB = 0x300000, MFX_HW_IVB = 0x400000, MFX_HW_HSW = 0x500000, MFX_HW_HSW_ULT = 0x500001, MFX_HW_VLV = 0x600000, MFX_HW_BDW = 0x700000, MFX_HW_CHT = 0x800000, MFX_HW_SCL = 0x900000, MFX_HW_APL = 0x1000000, MFX_HW_KBL = 0x1100000, MFX_HW_GLK = MFX_HW_KBL + 1, MFX_HW_CFL = MFX_HW_KBL + 2, MFX_HW_CNL = 0x1200000, MFX_HW_ICL = 0x1400000, MFX_HW_ICL_LP = MFX_HW_ICL + 1, MFX_HW_JSL = 0x1500001, MFX_HW_EHL = 0x1500002, MFX_HW_TGL_LP = 0x1600000, MFX_HW_RKL = MFX_HW_TGL_LP + 2, MFX_HW_DG1 = MFX_HW_TGL_LP + 3, MFX_HW_ADL_S = MFX_HW_TGL_LP + 4, MFX_HW_ADL_P = MFX_HW_TGL_LP + 5, MFX_HW_ADL_N = MFX_HW_TGL_LP + 6, MFX_HW_XE_HP_SDV = MFX_HW_TGL_LP + 7, MFX_HW_DG2 = MFX_HW_TGL_LP + 8, MFX_HW_PVC = MFX_HW_XE_HP_SDV + 2, MFX_HW_MTL = 0x1700000, }; enum eMFXGTConfig { MFX_GT_UNKNOWN = 0, MFX_GT1 = 1, MFX_GT2 = 2, MFX_GT3 = 3, MFX_GT4 = 4 }; typedef struct { int device_id; eMFXHWType platform; eMFXGTConfig config; } mfx_device_item; // list of legal dev ID for Intel's graphics const mfx_device_item listLegalDevIDs[] = { /*IVB*/ { 0x0156, MFX_HW_IVB, MFX_GT1 }, /* GT1 mobile */ { 0x0166, MFX_HW_IVB, MFX_GT2 }, /* GT2 mobile */ { 0x0152, MFX_HW_IVB, MFX_GT1 }, /* GT1 desktop */ { 0x0162, MFX_HW_IVB, MFX_GT2 }, /* GT2 desktop */ { 0x015a, MFX_HW_IVB, MFX_GT1 }, /* GT1 server */ { 0x016a, MFX_HW_IVB, MFX_GT2 }, /* GT2 server */ /*HSW*/ { 0x0402, MFX_HW_HSW, MFX_GT1 }, /* GT1 desktop */ { 0x0412, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */ { 0x0422, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */ { 0x041e, MFX_HW_HSW, MFX_GT2 }, /* Core i3-4130 */ { 0x040a, MFX_HW_HSW, MFX_GT1 }, /* GT1 server */ { 0x041a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */ { 0x042a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */ { 0x0406, MFX_HW_HSW, MFX_GT1 }, /* GT1 mobile */ { 0x0416, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */ { 0x0426, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */ { 0x0C02, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 desktop */ { 0x0C12, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */ { 0x0C22, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */ { 0x0C0A, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 server */ { 0x0C1A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */ { 0x0C2A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */ { 0x0C06, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 mobile */ { 0x0C16, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */ { 0x0C26, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */ { 0x0A02, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 desktop */ { 0x0A12, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */ { 0x0A22, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */ { 0x0A0A, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 server */ { 0x0A1A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */ { 0x0A2A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */ { 0x0A06, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 mobile */ { 0x0A16, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */ { 0x0A26, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */ { 0x0D02, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 desktop */ { 0x0D12, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */ { 0x0D22, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */ { 0x0D0A, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 server */ { 0x0D1A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */ { 0x0D2A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */ { 0x0D06, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 mobile */ { 0x0D16, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */ { 0x0D26, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */ { 0x040B, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_B_GT1 *//* Reserved */ { 0x041B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_B_GT2*/ { 0x042B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_B_GT3*/ { 0x040E, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_E_GT1*//* Reserved */ { 0x041E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_E_GT2*/ { 0x042E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_E_GT3*/ { 0x0C0B, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_SDV_B_GT1*/ /* Reserved */ { 0x0C1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/ { 0x0C2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/ { 0x0C0E, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_SDV_B_GT1*//* Reserved */ { 0x0C1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/ { 0x0C2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/ { 0x0A0B, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_ULT_B_GT1*/ /* Reserved */ { 0x0A1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_B_GT2*/ { 0x0A2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_B_GT3*/ { 0x0A0E, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_ULT_E_GT1*/ /* Reserved */ { 0x0A1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_E_GT2*/ { 0x0A2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_E_GT3*/ { 0x0D0B, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_CRW_B_GT1*/ /* Reserved */ { 0x0D1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_B_GT2*/ { 0x0D2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_B_GT3*/ { 0x0D0E, MFX_HW_HSW, MFX_GT1 }, /*HASWELL_CRW_E_GT1*/ /* Reserved */ { 0x0D1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_E_GT2*/ { 0x0D2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_E_GT3*/ /* VLV */ { 0x0f30, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ { 0x0f31, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ { 0x0f32, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ { 0x0f33, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ { 0x0157, MFX_HW_VLV, MFX_GT1 }, { 0x0155, MFX_HW_VLV, MFX_GT1 }, /* BDW */ /*GT3: */ { 0x162D, MFX_HW_BDW, MFX_GT3 }, { 0x162A, MFX_HW_BDW, MFX_GT3 }, /*GT2: */ { 0x161D, MFX_HW_BDW, MFX_GT2 }, { 0x161A, MFX_HW_BDW, MFX_GT2 }, /* GT1: */ { 0x160D, MFX_HW_BDW, MFX_GT1 }, { 0x160A, MFX_HW_BDW, MFX_GT1 }, /* BDW-ULT */ /* (16x2 - ULT, 16x6 - ULT, 16xB - Iris, 16xE - ULX) */ /*GT3: */ { 0x162E, MFX_HW_BDW, MFX_GT3 }, { 0x162B, MFX_HW_BDW, MFX_GT3 }, { 0x1626, MFX_HW_BDW, MFX_GT3 }, { 0x1622, MFX_HW_BDW, MFX_GT3 }, { 0x1636, MFX_HW_BDW, MFX_GT3 }, /* ULT */ { 0x163B, MFX_HW_BDW, MFX_GT3 }, /* Iris */ { 0x163E, MFX_HW_BDW, MFX_GT3 }, /* ULX */ { 0x1632, MFX_HW_BDW, MFX_GT3 }, /* ULT */ { 0x163A, MFX_HW_BDW, MFX_GT3 }, /* Server */ { 0x163D, MFX_HW_BDW, MFX_GT3 }, /* Workstation */ /* GT2: */ { 0x161E, MFX_HW_BDW, MFX_GT2 }, { 0x161B, MFX_HW_BDW, MFX_GT2 }, { 0x1616, MFX_HW_BDW, MFX_GT2 }, { 0x1612, MFX_HW_BDW, MFX_GT2 }, /* GT1: */ { 0x160E, MFX_HW_BDW, MFX_GT1 }, { 0x160B, MFX_HW_BDW, MFX_GT1 }, { 0x1606, MFX_HW_BDW, MFX_GT1 }, { 0x1602, MFX_HW_BDW, MFX_GT1 }, /* CHT */ { 0x22b0, MFX_HW_CHT, MFX_GT1 }, { 0x22b1, MFX_HW_CHT, MFX_GT1 }, { 0x22b2, MFX_HW_CHT, MFX_GT1 }, { 0x22b3, MFX_HW_CHT, MFX_GT1 }, /* SCL */ /* GT1F */ { 0x1902, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1F, 510 { 0x1906, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1F, 510 { 0x190A, MFX_HW_SCL, MFX_GT1 }, // Server, 4x1F { 0x190B, MFX_HW_SCL, MFX_GT1 }, { 0x190E, MFX_HW_SCL, MFX_GT1 }, // Y-ULX 2x1F /*GT1.5*/ { 0x1913, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1.5 { 0x1915, MFX_HW_SCL, MFX_GT1 }, // Y-ULX, 2x1.5 { 0x1917, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1.5 /* GT2 */ { 0x1912, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530 { 0x1916, MFX_HW_SCL, MFX_GT2 }, // U-ULD 2x2, 520 { 0x191A, MFX_HW_SCL, MFX_GT2 }, // 2x2,4x2, Server { 0x191B, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530 { 0x191D, MFX_HW_SCL, MFX_GT2 }, // 4x2, WKS, P530 { 0x191E, MFX_HW_SCL, MFX_GT2 }, // Y-ULX, 2x2, P510,515 { 0x1921, MFX_HW_SCL, MFX_GT2 }, // U-ULT, 2x2F, 540 /* GT3 */ { 0x1923, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 535 { 0x1926, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 540 (15W) { 0x1927, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3e, 550 (28W) { 0x192A, MFX_HW_SCL, MFX_GT3 }, // Server, 2x3 { 0x192B, MFX_HW_SCL, MFX_GT3 }, // Halo 3e { 0x192D, MFX_HW_SCL, MFX_GT3 }, /* GT4e*/ { 0x1932, MFX_HW_SCL, MFX_GT4 }, // DT { 0x193A, MFX_HW_SCL, MFX_GT4 }, // SRV { 0x193B, MFX_HW_SCL, MFX_GT4 }, // Halo { 0x193D, MFX_HW_SCL, MFX_GT4 }, // WKS /* APL */ { 0x0A84, MFX_HW_APL, MFX_GT1 }, { 0x0A85, MFX_HW_APL, MFX_GT1 }, { 0x0A86, MFX_HW_APL, MFX_GT1 }, { 0x0A87, MFX_HW_APL, MFX_GT1 }, { 0x1A84, MFX_HW_APL, MFX_GT1 }, { 0x1A85, MFX_HW_APL, MFX_GT1 }, { 0x5A84, MFX_HW_APL, MFX_GT1 }, { 0x5A85, MFX_HW_APL, MFX_GT1 }, /* KBL */ { 0x5902, MFX_HW_KBL, MFX_GT1 }, // DT GT1 { 0x5906, MFX_HW_KBL, MFX_GT1 }, // ULT GT1 { 0x5908, MFX_HW_KBL, MFX_GT1 }, // HALO GT1F { 0x590A, MFX_HW_KBL, MFX_GT1 }, // SERV GT1 { 0x590B, MFX_HW_KBL, MFX_GT1 }, // HALO GT1 { 0x590E, MFX_HW_KBL, MFX_GT1 }, // ULX GT1 { 0x5912, MFX_HW_KBL, MFX_GT2 }, // DT GT2 { 0x5913, MFX_HW_KBL, MFX_GT1 }, // ULT GT1 5 { 0x5915, MFX_HW_KBL, MFX_GT1 }, // ULX GT1 5 { 0x5916, MFX_HW_KBL, MFX_GT2 }, // ULT GT2 { 0x5917, MFX_HW_KBL, MFX_GT2 }, // ULT GT2 R { 0x591A, MFX_HW_KBL, MFX_GT2 }, // SERV GT2 { 0x591B, MFX_HW_KBL, MFX_GT2 }, // HALO GT2 { 0x591C, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 { 0x591D, MFX_HW_KBL, MFX_GT2 }, // WRK GT2 { 0x591E, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 { 0x5921, MFX_HW_KBL, MFX_GT2 }, // ULT GT2F { 0x5923, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 { 0x5926, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 15W { 0x5927, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 28W { 0x592A, MFX_HW_KBL, MFX_GT3 }, // SERV GT3 { 0x592B, MFX_HW_KBL, MFX_GT3 }, // HALO GT3 { 0x5932, MFX_HW_KBL, MFX_GT4 }, // DT GT4 { 0x593A, MFX_HW_KBL, MFX_GT4 }, // SERV GT4 { 0x593B, MFX_HW_KBL, MFX_GT4 }, // HALO GT4 { 0x593D, MFX_HW_KBL, MFX_GT4 }, // WRK GT4 { 0x87C0, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 /* GLK */ { 0x3184, MFX_HW_GLK, MFX_GT1 }, { 0x3185, MFX_HW_GLK, MFX_GT1 }, /* CFL */ { 0x3E90, MFX_HW_CFL, MFX_GT1 }, { 0x3E91, MFX_HW_CFL, MFX_GT2 }, { 0x3E92, MFX_HW_CFL, MFX_GT2 }, { 0x3E93, MFX_HW_CFL, MFX_GT1 }, { 0x3E94, MFX_HW_CFL, MFX_GT2 }, { 0x3E96, MFX_HW_CFL, MFX_GT2 }, { 0x3E98, MFX_HW_CFL, MFX_GT2 }, { 0x3E99, MFX_HW_CFL, MFX_GT1 }, { 0x3E9A, MFX_HW_CFL, MFX_GT2 }, { 0x3E9C, MFX_HW_CFL, MFX_GT1 }, { 0x3E9B, MFX_HW_CFL, MFX_GT2 }, { 0x3EA5, MFX_HW_CFL, MFX_GT3 }, { 0x3EA6, MFX_HW_CFL, MFX_GT3 }, { 0x3EA7, MFX_HW_CFL, MFX_GT3 }, { 0x3EA8, MFX_HW_CFL, MFX_GT3 }, { 0x3EA9, MFX_HW_CFL, MFX_GT2 }, { 0x87CA, MFX_HW_CFL, MFX_GT2 }, /* WHL */ { 0x3EA0, MFX_HW_CFL, MFX_GT2 }, { 0x3EA1, MFX_HW_CFL, MFX_GT1 }, { 0x3EA2, MFX_HW_CFL, MFX_GT3 }, { 0x3EA3, MFX_HW_CFL, MFX_GT2 }, { 0x3EA4, MFX_HW_CFL, MFX_GT1 }, /* CML GT1 */ { 0x9b21, MFX_HW_CFL, MFX_GT1 }, { 0x9baa, MFX_HW_CFL, MFX_GT1 }, { 0x9bab, MFX_HW_CFL, MFX_GT1 }, { 0x9bac, MFX_HW_CFL, MFX_GT1 }, { 0x9ba0, MFX_HW_CFL, MFX_GT1 }, { 0x9ba5, MFX_HW_CFL, MFX_GT1 }, { 0x9ba8, MFX_HW_CFL, MFX_GT1 }, { 0x9ba4, MFX_HW_CFL, MFX_GT1 }, { 0x9ba2, MFX_HW_CFL, MFX_GT1 }, /* CML GT2 */ { 0x9b41, MFX_HW_CFL, MFX_GT2 }, { 0x9bca, MFX_HW_CFL, MFX_GT2 }, { 0x9bcb, MFX_HW_CFL, MFX_GT2 }, { 0x9bcc, MFX_HW_CFL, MFX_GT2 }, { 0x9bc0, MFX_HW_CFL, MFX_GT2 }, { 0x9bc5, MFX_HW_CFL, MFX_GT2 }, { 0x9bc8, MFX_HW_CFL, MFX_GT2 }, { 0x9bc4, MFX_HW_CFL, MFX_GT2 }, { 0x9bc2, MFX_HW_CFL, MFX_GT2 }, { 0x9bc6, MFX_HW_CFL, MFX_GT2 }, { 0x9be6, MFX_HW_CFL, MFX_GT2 }, { 0x9bf6, MFX_HW_CFL, MFX_GT2 }, /* CNL */ { 0x5A51, MFX_HW_CNL, MFX_GT2 }, { 0x5A52, MFX_HW_CNL, MFX_GT2 }, { 0x5A5A, MFX_HW_CNL, MFX_GT2 }, { 0x5A40, MFX_HW_CNL, MFX_GT2 }, { 0x5A42, MFX_HW_CNL, MFX_GT2 }, { 0x5A4A, MFX_HW_CNL, MFX_GT2 }, { 0x5A4C, MFX_HW_CNL, MFX_GT1 }, { 0x5A50, MFX_HW_CNL, MFX_GT2 }, { 0x5A54, MFX_HW_CNL, MFX_GT1 }, { 0x5A59, MFX_HW_CNL, MFX_GT2 }, { 0x5A5C, MFX_HW_CNL, MFX_GT1 }, { 0x5A41, MFX_HW_CNL, MFX_GT2 }, { 0x5A44, MFX_HW_CNL, MFX_GT1 }, { 0x5A49, MFX_HW_CNL, MFX_GT2 }, /* ICL LP */ { 0xFF05, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A50, MFX_HW_ICL_LP, MFX_GT2 }, { 0x8A51, MFX_HW_ICL_LP, MFX_GT2 }, { 0x8A52, MFX_HW_ICL_LP, MFX_GT2 }, { 0x8A53, MFX_HW_ICL_LP, MFX_GT2 }, { 0x8A54, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A56, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A57, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A58, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A59, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A5A, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A5B, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A5C, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A5D, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A70, MFX_HW_ICL_LP, MFX_GT1 }, { 0x8A71, MFX_HW_ICL_LP, MFX_GT1 }, // GT05, but 1 ok in this context /* JSL */ { 0x4E51, MFX_HW_JSL, MFX_GT2 }, { 0x4E55, MFX_HW_JSL, MFX_GT2 }, { 0x4E61, MFX_HW_JSL, MFX_GT2 }, { 0x4E71, MFX_HW_JSL, MFX_GT2 }, /* EHL */ { 0x4500, MFX_HW_EHL, MFX_GT2 }, { 0x4541, MFX_HW_EHL, MFX_GT2 }, { 0x4551, MFX_HW_EHL, MFX_GT2 }, { 0x4555, MFX_HW_EHL, MFX_GT2 }, { 0x4569, MFX_HW_EHL, MFX_GT2 }, { 0x4571, MFX_HW_EHL, MFX_GT2 }, /* TGL */ { 0x9A40, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A49, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A59, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A60, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A68, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A70, MFX_HW_TGL_LP, MFX_GT2 }, { 0x9A78, MFX_HW_TGL_LP, MFX_GT2 }, /* DG1/SG1 */ { 0x4905, MFX_HW_DG1, MFX_GT2 }, { 0x4906, MFX_HW_DG1, MFX_GT2 }, { 0x4907, MFX_HW_DG1, MFX_GT2 }, // SG1 { 0x4908, MFX_HW_DG1, MFX_GT2 }, /* RKL */ { 0x4C80, MFX_HW_RKL, MFX_GT1 }, // RKL-S { 0x4C8A, MFX_HW_RKL, MFX_GT1 }, // RKL-S { 0x4C81, MFX_HW_RKL, MFX_GT1 }, // RKL-S { 0x4C8B, MFX_HW_RKL, MFX_GT1 }, // RKL-S { 0x4C90, MFX_HW_RKL, MFX_GT1 }, // RKL-S { 0x4C9A, MFX_HW_RKL, MFX_GT1 }, // RKL-S /* ADL-S */ { 0x4600, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4680, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4681, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4682, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4683, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4688, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x468A, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4690, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4691, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4692, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4693, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4698, MFX_HW_ADL_S, MFX_GT1 },//ADL-S { 0x4699, MFX_HW_ADL_S, MFX_GT1 },//ADL-S /* RPL-S */ { 0xA780, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA781, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA782, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA783, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA784, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA785, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA786, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA787, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA788, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA789, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA78A, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA78B, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA78C, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA78D, MFX_HW_ADL_S, MFX_GT1 },//RPL-S { 0xA78E, MFX_HW_ADL_S, MFX_GT1 },//RPL-S /* ADL-P */ { 0x46A0, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46A1, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46A2, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46A3, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46A6, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x4626, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46B0, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46B1, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46B2, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46B3, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46A8, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x4628, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46C0, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46C1, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46C2, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46C3, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x46AA, MFX_HW_ADL_P, MFX_GT2 },//ADL-P { 0x462A, MFX_HW_ADL_P, MFX_GT2 },//ADL-P /* RPL-P */ { 0xA7A0, MFX_HW_ADL_P, MFX_GT2 }, { 0xA720, MFX_HW_ADL_P, MFX_GT2 }, { 0xA7A8, MFX_HW_ADL_P, MFX_GT2 }, { 0xA7A1, MFX_HW_ADL_P, MFX_GT2 }, { 0xA721, MFX_HW_ADL_P, MFX_GT2 }, { 0xA7A9, MFX_HW_ADL_P, MFX_GT2 }, /* ADL-N */ { 0x46D0, MFX_HW_ADL_N, MFX_GT1 },//ADL-N { 0x46D1, MFX_HW_ADL_N, MFX_GT1 },//ADL-N { 0x46D2, MFX_HW_ADL_N, MFX_GT1 },//ADL-N /* DG2 */ { 0x4F80, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F81, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F82, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F83, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F84, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F85, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F86, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F87, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x4F88, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5690, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5691, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5692, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5693, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5694, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5695, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5696, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x5697, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A0, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A1, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A2, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A3, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A4, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A5, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56A6, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56B0, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56B1, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56B2, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56B3, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56C0, MFX_HW_DG2, MFX_GT4 }, // DG2 { 0x56C1, MFX_HW_DG2, MFX_GT4 }, // DG2 /* PVC */ { 0x0BD0, MFX_HW_PVC, MFX_GT4 }, { 0x0BD5, MFX_HW_PVC, MFX_GT4 }, { 0x0BD6, MFX_HW_PVC, MFX_GT4 }, { 0x0BD7, MFX_HW_PVC, MFX_GT4 }, { 0x0BD8, MFX_HW_PVC, MFX_GT4 }, { 0x0BD9, MFX_HW_PVC, MFX_GT4 }, { 0x0BDA, MFX_HW_PVC, MFX_GT4 }, { 0x0BDB, MFX_HW_PVC, MFX_GT4 }, { 0x0BE0, MFX_HW_PVC, MFX_GT4 }, { 0x0BE1, MFX_HW_PVC, MFX_GT4 }, { 0x0BE5, MFX_HW_PVC, MFX_GT4 }, /* MTL */ { 0x7D40, MFX_HW_MTL, MFX_GT2 }, { 0x7D50, MFX_HW_MTL, MFX_GT2 }, { 0x7D55, MFX_HW_MTL, MFX_GT2 }, { 0x7D60, MFX_HW_MTL, MFX_GT2 }, { 0x7D70, MFX_HW_MTL, MFX_GT2 }, { 0x7D75, MFX_HW_MTL, MFX_GT2 }, { 0x7D79, MFX_HW_MTL, MFX_GT2 }, { 0x7D76, MFX_HW_MTL, MFX_GT2 }, { 0x7D66, MFX_HW_MTL, MFX_GT2 }, { 0x7DD5, MFX_HW_MTL, MFX_GT2 }, { 0x7D45, MFX_HW_MTL, MFX_GT2 }, { 0x7DE0, MFX_HW_MTL, MFX_GT2 }, }; /* Some components (samples, JPEG decoder) has used MFX_FOURCC_RGBP already. So, for API 1.27 and below "MFX_FOURCC_RGBP" defined inside of msdk library and samples. Since next version of API (1.28) "MFX_FOURCC_RGBP" should officially defined in API "mfxstructures.h". */ enum { MFX_FOURCC_IMC3 = MFX_MAKEFOURCC('I','M','C','3'), MFX_FOURCC_YUV400 = MFX_MAKEFOURCC('4','0','0','P'), MFX_FOURCC_YUV411 = MFX_MAKEFOURCC('4','1','1','P'), MFX_FOURCC_YUV422H = MFX_MAKEFOURCC('4','2','2','H'), MFX_FOURCC_YUV422V = MFX_MAKEFOURCC('4','2','2','V'), MFX_FOURCC_YUV444 = MFX_MAKEFOURCC('4','4','4','P'), }; #ifdef __cplusplus }; #endif #endif // __MFXSTRUCTURES_INT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfxstructurespro.h000066400000000000000000000154121443134507600274610ustar00rootroot00000000000000// Copyright (c) 2007-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXSTRUCTURESPRO_H__ #define __MFXSTRUCTURESPRO_H__ #include "mfxstructures.h" #ifdef _MSVC_LANG #pragma warning(disable: 4201) #endif #ifdef __cplusplus extern "C" { #endif /* Frame Parameters for AVC */ typedef struct { mfxU32 CucId; mfxU32 CucSz; mfxU8 FrameType; mfxU8 FrameType2nd; mfxU8 reserved1a; mfxU8 RecFrameLabel; mfxU8 DecFrameLabel; mfxU8 VppFrameLabel; mfxU16 NumMb; mfxU16 FrameWinMbMinus1; mfxU16 FrameHinMbMinus1; mfxU8 CurrFrameLabel; mfxU8 NumRefFrame; union { mfxU16 CodecFlags; struct { mfxU16 FieldPicFlag :1; union { mfxU16 MbaffFrameFlag :1; mfxU16 SecondFieldPicFlag :1; }; mfxU16 ResColorTransFlag :1; mfxU16 SPforSwitchFlag :1; mfxU16 ChromaFormatIdc :2; mfxU16 RefPicFlag :1; mfxU16 ConstraintIntraFlag :1; mfxU16 WeightedPredFlag :1; mfxU16 WeightedBipredIdc :2; mfxU16 MbsConsecutiveFlag :1; mfxU16 FrameMbsOnlyFlag :1; mfxU16 Transform8x8Flag :1; mfxU16 NoMinorBipredFlag :1; mfxU16 IntraPicFlag :1; }; }; union { mfxU16 ExtraFlags; struct { mfxU16 EntropyCodingModeFlag :1; mfxU16 Direct8x8InferenceFlag :1; mfxU16 TransCoeffFlag :1; mfxU16 reserved2b :1; mfxU16 ZeroDeltaPicOrderFlag :1; mfxU16 GapsInFrameNumAllowed :1; mfxU16 reserved3c :2; mfxU16 PicOrderPresent :1; mfxU16 RedundantPicCntPresent :1; mfxU16 ScalingListPresent :1; mfxU16 SliceGroupMapPresent :1; mfxU16 ILDBControlPresent :1; mfxU16 MbCodePresent :1; mfxU16 MvDataPresent :1; mfxU16 ResDataPresent :1; }; }; mfxI8 PicInitQpMinus26; mfxI8 PicInitQsMinus26; mfxI8 ChromaQp1stOffset; mfxI8 ChromaQp2ndOffset; mfxU8 NumRefIdxL0Minus1; mfxU8 NumRefIdxL1Minus1; mfxU8 BitDepthLumaMinus8; mfxU8 BitDepthChromaMinus8; mfxU8 Log2MaxFrameCntMinus4; mfxU8 PicOrderCntType; mfxU8 Log2MaxPicOrdCntMinus4; mfxU8 NumSliceGroupMinus1; mfxU8 SliceGroupMapType; mfxU8 SliceGroupXRateMinus1; union { mfxU8 RefFrameListP[16]; mfxU8 RefFrameListB[2][8]; }; mfxU32 MinFrameSize; mfxU32 MaxFrameSize; } mfxFrameParamAVC; /* Frame Parameters for MPEG-2 */ typedef struct { mfxU32 CucId; mfxU32 CucSz; mfxU8 FrameType; mfxU8 FrameType2nd; mfxU8 reserved1a; mfxU8 RecFrameLabel; mfxU8 DecFrameLabel; mfxU8 VppFrameLabel; mfxU16 NumMb; mfxU16 FrameWinMbMinus1; mfxU16 FrameHinMbMinus1; mfxU8 CurrFrameLabel; mfxU8 NumRefFrame; union { mfxU16 CodecFlags; struct { mfxU16 FieldPicFlag :1; mfxU16 InterlacedFrameFlag :1; mfxU16 SecondFieldFlag :1; mfxU16 BottomFieldFlag :1; mfxU16 ChromaFormatIdc :2; mfxU16 RefPicFlag :1; mfxU16 BackwardPredFlag :1; mfxU16 ForwardPredFlag :1; mfxU16 NoResidDiffs :1; mfxU16 reserved3c :2; mfxU16 FrameMbsOnlyFlag :1; mfxU16 BrokenLinkFlag :1; mfxU16 CloseEntryFlag :1; mfxU16 IntraPicFlag :1; }; }; union { mfxU16 ExtraFlags; struct { mfxU16 reserved4d :4; mfxU16 MvGridAndChroma :4; mfxU16 reserved5e :8; }; }; mfxU16 reserved6f; mfxU16 BitStreamFcodes; union { mfxU16 BitStreamPCEelement; struct { mfxU16 reserved7g :3; mfxU16 ProgressiveFrame :1; mfxU16 Chroma420type :1; mfxU16 RepeatFirstField :1; mfxU16 AlternateScan :1; mfxU16 IntraVLCformat :1; mfxU16 QuantScaleType :1; mfxU16 ConcealmentMVs :1; mfxU16 FrameDCTprediction :1; mfxU16 TopFieldFirst :1; mfxU16 PicStructure :2; mfxU16 IntraDCprecision :2; }; }; mfxU8 BSConcealmentNeed; mfxU8 BSConcealmentMethod; mfxU16 TemporalReference; mfxU32 VBVDelay; union{ mfxU8 RefFrameListP[16]; mfxU8 RefFrameListB[2][8]; }; mfxU32 MinFrameSize; mfxU32 MaxFrameSize; } mfxFrameParamMPEG2; typedef union { mfxFrameParamAVC AVC; mfxFrameParamMPEG2 MPEG2; } mfxFrameParam; enum { CQM_HINT_USE_FLAT_MATRIX = 0, //use flat matrix CQM_HINT_USE_CUST_MATRIX1 = 1, //use weak customized matrixm CQM_HINT_USE_CUST_MATRIX2 = 2, //use medium customized matrixm CQM_HINT_USE_CUST_MATRIX3 = 3, //use strong customized matrixm CQM_HINT_USE_CUST_MATRIX4 = 4, //use extreme customized matrixm CQM_HINT_NUM_CUST_MATRIX = 4, //the number of customized matrixm CQM_HINT_INVALID = 0xFF //invalid hint }; inline bool IsCustMatrix(mfxU32 CqmHint) { return CqmHint >= CQM_HINT_USE_CUST_MATRIX1 && CqmHint < (CQM_HINT_USE_CUST_MATRIX1 + CQM_HINT_NUM_CUST_MATRIX); } #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfxsvc.h000066400000000000000000000103041443134507600253030ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXSVC_H__ #define __MFXSVC_H__ #include "mfxdefs.h" #ifdef __cplusplus extern "C" { #endif /* CodecProfile, CodecLevel */ enum { MFX_PROFILE_AVC_SCALABLE_BASELINE = 83, MFX_PROFILE_AVC_SCALABLE_HIGH = 86 }; /* Extended Buffer Ids */ enum { MFX_EXTBUFF_SVC_SEQ_DESC = MFX_MAKEFOURCC('S','V','C','D'), MFX_EXTBUFF_SVC_RATE_CONTROL = MFX_MAKEFOURCC('S','V','C','R'), MFX_EXTBUFF_SVC_TARGET_LAYER = MFX_MAKEFOURCC('S','V','C','T'), MFX_EXTBUFF_VPP_SVC_DOWNSAMPLING = MFX_MAKEFOURCC('D','W','N','S') }; typedef struct { mfxExtBuffer Header; mfxU16 RateControlMethod; mfxU16 reserved1[10]; mfxU16 NumLayers; struct mfxLayer { mfxU16 TemporalId; mfxU16 DependencyId; mfxU16 QualityId; mfxU16 reserved2[5]; union{ struct{ mfxU32 TargetKbps; mfxU32 InitialDelayInKB; mfxU32 BufferSizeInKB; mfxU32 MaxKbps; mfxU32 reserved3[4]; } CbrVbr; struct{ mfxU16 QPI; mfxU16 QPP; mfxU16 QPB; }Cqp; struct{ mfxU32 TargetKbps; mfxU32 Convergence; mfxU32 Accuracy; }Avbr; }; }Layer[1024]; } mfxExtSVCRateControl; typedef struct { mfxU16 Active; mfxU16 Width; mfxU16 Height; mfxU16 CropX; mfxU16 CropY; mfxU16 CropW; mfxU16 CropH; mfxU16 RefLayerDid; mfxU16 RefLayerQid; mfxU16 GopPicSize; mfxU16 GopRefDist; mfxU16 GopOptFlag; mfxU16 IdrInterval; mfxU16 BasemodePred; /* four-state option, UNKNOWN/ON/OFF/ADAPTIVE */ mfxU16 MotionPred; /* four-state option, UNKNOWN/ON/OFF/ADAPTIVE */ mfxU16 ResidualPred; /* four-state option, UNKNOWN/ON/OFF/ADAPTIVE */ mfxU16 DisableDeblockingFilter; /* tri -state option */ mfxI16 ScaledRefLayerOffsets[4]; mfxU16 ScanIdxPresent; /* tri -state option */ mfxU16 reserved2[8]; mfxU16 TemporalNum; mfxU16 TemporalId[8]; mfxU16 QualityNum; struct mfxQualityLayer { mfxU16 ScanIdxStart; mfxU16 ScanIdxEnd; mfxU16 TcoeffPredictionFlag; /* tri -state option */ mfxU16 reserved3[5]; } QualityLayer[16]; } mfxExtSVCDepLayer; typedef struct { mfxExtBuffer Header; mfxU16 TemporalScale[8]; mfxU16 RefBaseDist; mfxU16 reserved1[3]; mfxExtSVCDepLayer DependencyLayer[8]; } mfxExtSVCSeqDesc; typedef struct { mfxExtBuffer Header; mfxU16 TargetTemporalID; mfxU16 TargetDependencyID; mfxU16 TargetQualityID; mfxU16 reserved[9]; } mfxExtSvcTargetLayer ; enum { MFX_DWNSAMPLING_ALGM_BEST_QUALITY = 0x0001, MFX_DWNSAMPLING_ALGM_BEST_SPEED = 0x0002 }; typedef struct { mfxExtBuffer Header; mfxU16 Algorithm; mfxU16 reserved[11]; } mfxExtSVCDownsampling; #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/mfxvideo++int.h000066400000000000000000000466141443134507600264740ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFXVIDEOPLUSPLUS_INTERNAL_H #define __MFXVIDEOPLUSPLUS_INTERNAL_H #include "mfxvideo.h" #include "mfxstructures-int.h" #include #include #include "mfxstructurespro.h" #include "mfxmvc.h" #include "mfxsvc.h" #include "mfxjpeg.h" #include "mfxvp8.h" #include #include #include "mfx_utils.h" #ifdef _MSVC_LANG #pragma warning(push) #pragma warning(disable:26812) #endif #include "va/va.h" // Helper struct VaGuidMapper is placed _studio/shared/include/libmfx_core_vaapi.h for use linux/android GUIDs // Pack VAEntrypoint and VAProfile into GUID data structure #define DEFINE_GUID_VA(name, profile, entrypoint) \ static const GUID name = { profile, entrypoint >> 16, entrypoint & 0xffff, {} } /* H.264/AVC Enc */ DEFINE_GUID_VA(DXVA2_Intel_Encode_AVC , VAProfileH264High, VAEntrypointEncSlice); DEFINE_GUID_VA(DXVA2_INTEL_LOWPOWERENCODE_AVC, VAProfileH264High, VAEntrypointEncSliceLP); /* H.264/AVC VLD */ DEFINE_GUID_VA(sDXVA_ModeH264_VLD_Multiview_NoFGT, VAProfileH264MultiviewHigh, VAEntrypointVLD); DEFINE_GUID_VA(sDXVA_ModeH264_VLD_Stereo_NoFGT, VAProfileH264StereoHigh, VAEntrypointVLD); DEFINE_GUID_VA(sDXVA2_ModeH264_VLD_NoFGT, VAProfileH264High, VAEntrypointVLD); DEFINE_GUID_VA(sDXVA_ModeH264_VLD_Stereo_Progressive_NoFGT, VAProfileH264StereoHigh, VAEntrypointVLD); DEFINE_GUID_VA(DXVA_Intel_Decode_Elementary_Stream_AVC, VAProfileH264High, VAEntrypointVLD); /* H.265 VLD */ DEFINE_GUID_VA(DXVA_ModeHEVC_VLD_Main, VAProfileHEVCMain, VAEntrypointVLD); /* VP9 */ DEFINE_GUID_VA(DXVA_Intel_ModeVP9_Profile0_VLD, VAProfileVP9Profile0, VAEntrypointVLD); DEFINE_GUID_VA(DXVA_Intel_ModeVP9_Profile1_YUV444_VLD, VAProfileVP9Profile1, VAEntrypointVLD); DEFINE_GUID_VA(DXVA_Intel_ModeVP9_Profile2_10bit_VLD, VAProfileVP9Profile2, VAEntrypointVLD); DEFINE_GUID_VA(DXVA_Intel_ModeVP9_Profile3_YUV444_10bit_VLD, VAProfileVP9Profile3, VAEntrypointVLD); /* VP8 */ DEFINE_GUID_VA(sDXVA_Intel_ModeVP8_VLD, VAProfileVP8Version0_3, VAEntrypointVLD); DEFINE_GUID_VA(DXVA2_Intel_Encode_VP8, VAProfileVP8Version0_3, VAEntrypointEncSlice); /* VC1 */ DEFINE_GUID_VA(sDXVA2_Intel_ModeVC1_D_Super, VAProfileVC1Advanced, VAEntrypointVLD); /* JPEG */ DEFINE_GUID_VA(sDXVA2_Intel_IVB_ModeJPEG_VLD_NoFGT, VAProfileJPEGBaseline, VAEntrypointVLD); /* MPEG2 */ DEFINE_GUID_VA(sDXVA2_ModeMPEG2_VLD, VAProfileMPEG2Main, VAEntrypointVLD); DEFINE_GUID_VA(DXVA2_Intel_Encode_MPEG2, VAProfileMPEG2Main, VAEntrypointEncSlice); /* AV1 */ #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) DEFINE_GUID_VA(DXVA_Intel_ModeAV1_VLD, VAProfileAV1Profile0, VAEntrypointVLD); #endif namespace UMC { class FrameAllocator; } // Forward declaration of used classes struct MFX_ENTRY_POINT; enum { MFX_COPY_USE_CM = 0x00000001u , MFX_COPY_USE_VACOPY_VE = 0x00000002u , MFX_COPY_USE_VACOPY_BLT = 0x00000004u , MFX_COPY_USE_VACOPY_EU = 0x00000008u , MFX_COPY_USE_VACOPY_ANY = (MFX_COPY_USE_VACOPY_VE | MFX_COPY_USE_VACOPY_BLT | MFX_COPY_USE_VACOPY_EU) , MFX_COPY_USE_ANY = 0xffffffffu }; class VideoCORE { public: virtual ~VideoCORE(void) {} // imported to external API virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *handle) = 0; virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL handle) = 0; virtual mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) = 0; virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) = 0; // Internal interface only // Utility functions for memory access virtual mfxStatus AllocBuffer(mfxU32 nbytes, mfxU16 type, mfxMemId *mid) = 0; virtual mfxStatus LockBuffer(mfxMemId mid, mfxU8 **ptr) = 0; virtual mfxStatus UnlockBuffer(mfxMemId mid) = 0; virtual mfxStatus FreeBuffer(mfxMemId mid) = 0; // Function checks D3D device for I/O D3D surfaces // If external allocator exists means that component can obtain device handle // If I/O surfaces in system memory returns MFX_ERR_NONE // THIS IS DEPRECATED FUNCTION kept here only for backward compatibility. virtual mfxStatus CheckHandle() = 0; virtual mfxStatus GetFrameHDL(mfxMemId mid, mfxHDL *handle, bool ExtendedSearch = true) = 0; virtual mfxStatus AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isNeedCopy = true) = 0; virtual mfxStatus LockFrame(mfxMemId mid, mfxFrameData *ptr) = 0; virtual mfxStatus UnlockFrame(mfxMemId mid, mfxFrameData *ptr=0) = 0; virtual mfxStatus FreeFrames(mfxFrameAllocResponse *response, bool ExtendedSearch = true) = 0; virtual mfxStatus LockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool ExtendedSearch = true) = 0; virtual mfxStatus GetExternalFrameHDL(mfxMemId mid, mfxHDL *handle, bool ExtendedSearch = true) = 0; virtual mfxStatus UnlockExternalFrame(mfxMemId mid, mfxFrameData *ptr=0, bool ExtendedSearch = true) = 0; virtual mfxMemId MapIdx(mfxMemId mid) = 0; // Increment Surface lock virtual mfxStatus IncreaseReference(mfxFrameData *ptr, bool ExtendedSearch = true) = 0; // Decrement Surface lock virtual mfxStatus DecreaseReference(mfxFrameData *ptr, bool ExtendedSearch = true) = 0; // no care about surface, opaq and all round. Just increasing reference virtual mfxStatus IncreasePureReference(mfxU16 &) = 0; // no care about surface, opaq and all round. Just decreasing reference virtual mfxStatus DecreasePureReference(mfxU16 &) = 0; // Check HW property virtual void GetVA(mfxHDL* phdl, mfxU16 type) = 0; virtual mfxStatus CreateVA(mfxVideoParam * , mfxFrameAllocRequest *, mfxFrameAllocResponse *, UMC::FrameAllocator *) = 0; // Get the current working adapter's number virtual mfxU32 GetAdapterNumber(void) = 0; // Get Video Processing virtual void GetVideoProcessing(mfxHDL* phdl) = 0; virtual mfxStatus CreateVideoProcessing(mfxVideoParam *) = 0; virtual eMFXPlatform GetPlatformType() = 0; // Get the current number of working threads virtual mfxU32 GetNumWorkingThreads(void) = 0; virtual void INeedMoreThreadsInside(const void *pComponent) = 0; // need for correct video accelerator creation virtual mfxStatus DoFastCopy(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) = 0; virtual mfxStatus DoFastCopyExtended(mfxFrameSurface1 *dst, mfxFrameSurface1 *src, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) = 0; virtual mfxStatus DoFastCopyWrapper(mfxFrameSurface1 *dst, mfxU16 dstMemType, mfxFrameSurface1 *src, mfxU16 srcMemType, mfxU32 gpuCopyMode = MFX_COPY_USE_ANY) = 0; // DEPRECATED virtual bool IsFastCopyEnabled(void) = 0; virtual bool IsExternalFrameAllocator(void) const = 0; virtual eMFXHWType GetHWType() { return MFX_HW_UNKNOWN; }; virtual mfxU16 GetHWDeviceId() = 0; virtual bool SetCoreId(mfxU32 Id) = 0; virtual eMFXVAType GetVAType() const = 0; virtual mfxStatus CopyFrame(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) = 0; virtual mfxStatus CopyBuffer(mfxU8 *dst, mfxU32 dst_size, mfxFrameSurface1 *src) = 0; virtual mfxStatus CopyFrameEx(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType) = 0; virtual mfxStatus IsGuidSupported(const GUID guid, mfxVideoParam *par, bool isEncoder = false) = 0; virtual void* QueryCoreInterface(const MFX_GUID &guid) = 0; virtual mfxSession GetSession() = 0; virtual mfxU16 GetAutoAsyncDepth() = 0; virtual bool IsSupportedDelayAlloc() const { return true; } mfxStatus GetFrameHDL(mfxFrameSurface1& surf, mfxHDLPair& handle, bool ExtendedSearch = true) { handle = {}; if (surf.FrameInterface) { mfxResourceType rt = mfxResourceType(0); mfxStatus sts = surf.FrameInterface->GetNativeHandle ? surf.FrameInterface->GetNativeHandle(&surf, &handle.first, &rt) : MFX_ERR_NULL_PTR; if (sts != MFX_ERR_NONE) return sts; eMFXVAType type = GetVAType(); bool bValidType = (type == MFX_HW_D3D11 && rt == MFX_RESOURCE_DX11_TEXTURE) || (type == MFX_HW_D3D9 && rt == MFX_RESOURCE_DX9_SURFACE) || (type == MFX_HW_VAAPI && rt == MFX_RESOURCE_VA_SURFACE); return bValidType ? MFX_ERR_NONE : MFX_ERR_UNDEFINED_BEHAVIOR; } return GetFrameHDL(surf.Data.MemId, &handle.first, ExtendedSearch); } mfxStatus IncreaseReference(mfxFrameSurface1& surf) { if (surf.FrameInterface) { mfxStatus sts = surf.FrameInterface->AddRef ? surf.FrameInterface->AddRef(&surf) : MFX_ERR_NULL_PTR; if (sts != MFX_ERR_NONE) return sts; } return IncreaseReference(&surf.Data); } mfxStatus DecreaseReference(mfxFrameSurface1& surf) { mfxStatus sts = DecreaseReference(&surf.Data); if (sts != MFX_ERR_NONE) return sts; if (surf.FrameInterface) { sts = surf.FrameInterface->Release ? surf.FrameInterface->Release(&surf) : MFX_ERR_NULL_PTR; if (sts != MFX_ERR_NONE) return sts; } return MFX_ERR_NONE; } mfxStatus LockFrame(mfxFrameSurface1& surf, mfxU32 flags = 3u /*MFX_MAP_READ_WRITE*/) { if (surf.FrameInterface) { return surf.FrameInterface->Map ? surf.FrameInterface->Map(&surf, flags) : MFX_ERR_NULL_PTR; } return LockFrame(surf.Data.MemId, &surf.Data); } mfxStatus UnlockFrame(mfxFrameSurface1& surf) { if (surf.FrameInterface) { return surf.FrameInterface->Unmap ? surf.FrameInterface->Unmap(&surf) : MFX_ERR_NULL_PTR; } return UnlockFrame(surf.Data.MemId, &surf.Data); } mfxStatus GetExternalFrameHDL(mfxFrameSurface1& surf, mfxHDLPair& handle, bool ExtendedSearch = true) { handle = {}; if (surf.FrameInterface) { return GetFrameHDL(surf, handle, ExtendedSearch); } return GetExternalFrameHDL(surf.Data.MemId, &handle.first, ExtendedSearch); } mfxStatus LockExternalFrame(mfxFrameSurface1& surf, bool ExtendedSearch = true) { if (surf.FrameInterface) { return LockFrame(surf); } return LockExternalFrame(surf.Data.MemId, &surf.Data, ExtendedSearch); } mfxStatus UnlockExternalFrame(mfxFrameSurface1& surf, bool ExtendedSearch = true) { if (surf.FrameInterface) { return UnlockFrame(surf); } return UnlockExternalFrame(surf.Data.MemId, &surf.Data, ExtendedSearch); } }; // Core extension should be obtained using MFXICORE_API_1_19_GUID class IVideoCore_API_1_19 { public: virtual ~IVideoCore_API_1_19() {} virtual mfxStatus QueryPlatform(mfxPlatform* platform) = 0; }; class VideoENC { public: virtual ~VideoENC(void){} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_DEFAULT;} virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetFrameParam(mfxFrameParam *par) = 0; }; class VideoPAK { public: virtual ~VideoPAK(void) {} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_DEFAULT;} virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetFrameParam(mfxFrameParam *par) = 0; }; // mfxEncodeInternalParams typedef enum { MFX_IFLAG_ADD_HEADER = 1, // MPEG2: add SeqHeader before this frame MFX_IFLAG_ADD_EOS = 2, // MPEG2: add EOS after this frame MFX_IFLAG_BWD_ONLY = 4, // MPEG2: only backward prediction for this frame MFX_IFLAG_FWD_ONLY = 8 // MPEG2: only forward prediction for this frame } MFX_ENCODE_INTERNAL_FLAGS; typedef struct _mfxEncodeInternalParams : public mfxEncodeCtrl { mfxU32 FrameOrder; mfxU32 InternalFlags; //MFX_ENCODE_INTERNAL_FLAGS mfxFrameSurface1 *surface; } mfxEncodeInternalParams; class SurfaceCache; class VideoENCODE { public: virtual ~VideoENCODE(void) {} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_DEFAULT;} virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetFrameParam(mfxFrameParam *par) = 0; virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) = 0; virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT *pEntryPoint) { (void)pEntryPoint; return EncodeFrameCheck(ctrl, surface, bs, reordered_surface, pInternalParams); } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { mfxStatus mfxRes; // call the overloaded version mfxRes = EncodeFrameCheck(ctrl, surface, bs, reordered_surface, pInternalParams, pEntryPoints); numEntryPoints = 1; return mfxRes; } virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxFrameSurface1 **reordered_surface, mfxEncodeInternalParams *pInternalParams) = 0; virtual mfxStatus EncodeFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) = 0; virtual mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) = 0; mfxStatus ResetCache(mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(par); if (m_pSurfaceCache) MFX_SAFE_CALL(m_pSurfaceCache->ResetCache(*par)); return MFX_ERR_NONE; } std::unique_ptr, std::function*)>> m_pSurfaceCache; }; class VideoDECODE { public: virtual ~VideoDECODE(void) {} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_DEFAULT;} virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) = 0; virtual mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT *pEntryPoint) = 0; virtual mfxStatus SetSkipMode(mfxSkipMode mode) { (void)mode; return MFX_ERR_UNSUPPORTED; } virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) = 0; virtual mfxStatus GetSurface(mfxFrameSurface1* & surface) { surface = nullptr; return MFX_ERR_UNSUPPORTED; } virtual mfxFrameSurface1* GetInternalSurface(mfxFrameSurface1 * /*surface*/) { return nullptr; } mfxStatus ResetCache(mfxVideoParam*) { return MFX_ERR_NONE; } }; class VideoVPP { public: virtual ~VideoVPP(void) {} virtual mfxStatus Init(mfxVideoParam *par) = 0; virtual mfxStatus Reset(mfxVideoParam *par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxTaskThreadingPolicy GetThreadingPolicy(void) {return MFX_TASK_THREADING_DEFAULT;} virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; virtual mfxStatus GetVPPStat(mfxVPPStat *stat) = 0; virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT *pEntryPoint) { (void)pEntryPoint; (void)aux; return VppFrameCheck(in, out); } virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT pEntryPoints[], mfxU32 &numEntryPoints) { mfxStatus mfxRes; // call the overloaded version mfxRes = VppFrameCheck(in, out, aux, pEntryPoints); numEntryPoints = 1; return mfxRes; } virtual mfxStatus VppFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out) = 0; virtual mfxStatus RunFrameVPP(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux) = 0; mfxStatus ResetCache(mfxVideoParam* par) { MFX_CHECK_NULL_PTR1(par); if (m_pSurfaceCacheIn) MFX_SAFE_CALL(m_pSurfaceCacheIn->ResetCache(*par)); if (m_pSurfaceCacheOut) MFX_SAFE_CALL(m_pSurfaceCacheOut->ResetCache(*par)); return MFX_ERR_NONE; } std::unique_ptr, std::function*)>> m_pSurfaceCacheIn; std::unique_ptr, std::function*)>> m_pSurfaceCacheOut; }; #ifdef _MSVC_LANG #pragma warning(pop) #endif #endif // __MFXVIDEOPLUSPLUS_INTERNAL_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/include/vaapi_ext_interface.h000066400000000000000000000026311443134507600300010ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VAAPI_EXT_INTERFACE_H__ #define __VAAPI_EXT_INTERFACE_H__ #include "mfx_config.h" #ifdef MFX_EXTBUFF_GPU_HANG_ENABLE #define VATriggerCodecHangBufferType ((VABufferType)-16) #endif // MFX_EXTBUFF_GPU_HANG_ENABLE #define VA_CODED_BUF_STATUS_HW_TEAR_DOWN 0x4000 #endif // __VAAPI_EXT_INTERFACE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/000077500000000000000000000000001443134507600245035ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/CMakeLists.txt000066400000000000000000000020051443134507600272400ustar00rootroot00000000000000add_library(mfx_logging STATIC) target_sources(mfx_logging PRIVATE include/mfx_utils_logging.h include/mfx_utils_perf.h include/mfx_unified_decode_logging.h include/mfx_unified_h265d_logging.h include/mfx_unified_h264d_logging.h include/mfx_unified_av1d_logging.h include/mfx_unified_vp9d_logging.h src/mfx_utils_logging.cpp src/mfx_utils_perf.cpp src/mfx_unified_decode_logging.cpp src/mfx_unified_h265d_logging.cpp src/mfx_unified_h264d_logging.cpp src/mfx_unified_av1d_logging.cpp src/mfx_unified_vp9d_logging.cpp ) target_include_directories(mfx_logging PUBLIC include ${MFX_API_HOME}/mediasdk_structures ${MSDK_STUDIO_ROOT}/shared/umc/codec/h265_dec/include ${MSDK_STUDIO_ROOT}/shared/umc/codec/h264_dec/include ${MSDK_STUDIO_ROOT}/shared/umc/codec/av1_dec/include ${MSDK_STUDIO_ROOT}/shared/umc/codec/vp9_dec/include ${MSDK_STUDIO_ROOT}/shared/umc/io/umc_va/include ) target_link_libraries(mfx_logging PUBLIC mfx_static_lib vm ) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/000077500000000000000000000000001443134507600261265ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_unified_av1d_logging.h000066400000000000000000000134061443134507600332210ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_UNIFIED_AV1D_LOGGING_H_ #define _MFX_UNIFIED_AV1D_LOGGING_H_ #include "mfx_config.h" #include "umc_va_base.h" #include "umc_av1_frame.h" #include "mfx_unified_decode_logging.h" typedef struct _EVENTDATA_SURFACEOUT_AV1D { uint32_t CropH; uint32_t CropW; uint32_t CropX; uint32_t CropY; uint32_t ChromaFormat; uint32_t AspectRatioH; uint32_t AspectRatioW; uint32_t FrameRateExtD; uint32_t FrameRateExtN; uint32_t FrameOrder; uint32_t PicStruct; uint32_t DataFlag; uint32_t TimeStamp; } EVENTDATA_SURFACEOUT_AV1D; typedef struct _DECODE_EVENTDATA_AV1DPBINFO { int32_t MemID; uint32_t Refvalid; int32_t RefCounter; } DECODE_EVENTDATA_AV1DPBINFO; typedef struct _EVENTDATA_DPBINFO_AV1D { DECODE_EVENTDATA_AV1DPBINFO DpbInfo[6]; } EVENTDATA_DPBINFO_AV1D; typedef struct _EVENT_SEG_INFO_FIELDS { uint32_t still_picture; uint32_t use_128x128_superblock; uint32_t enable_filter_intra; uint32_t enable_intra_edge_filter; uint32_t enable_interintra_compound; uint32_t enable_masked_compound; uint32_t enable_cdef; uint32_t enable_dual_filter; uint32_t enable_order_hint; uint32_t enable_jnt_comp; uint32_t mono_chrome; uint32_t color_range; uint32_t subsampling_x; uint32_t subsampling_y; uint32_t chroma_sample_position; uint32_t film_grain_params_present; } EVENT_SEG_INFO_FIELDS; typedef struct _EVENT_PIC_INFO_FIELDS { uint32_t frame_type; uint32_t show_frame; uint32_t showable_frame; uint32_t error_resilient_mode; uint32_t disable_cdf_update; uint32_t allow_screen_content_tools; uint32_t force_integer_mv; uint32_t allow_intrabc; uint32_t use_superres; uint32_t allow_high_precision_mv; uint32_t is_motion_mode_switchable; uint32_t disable_frame_end_update_cdf; uint32_t uniform_tile_spacing_flag; uint32_t allow_warped_motion; uint32_t large_scale_tile; } EVENT_PIC_INFO_FIELDS; typedef struct _EVENT_SEGMENTATION { uint32_t enabled; uint32_t update_map; uint32_t temporal_update; uint32_t update_data; uint32_t feature_mask[8]; } EVENT_SEGMENTATION; typedef struct _EVENT_LOOP_FILTER { uint32_t sharpness_level; uint32_t mode_ref_delta_enabled; uint32_t mode_ref_delta_update; } EVENT_LOOP_FILTER; typedef struct _EVENT_PicEntry_AV1 { uint32_t wmtype; int32_t wmmat[8]; uint32_t invalid; } EVENT_PicEntry_AV1; typedef struct _EVENTDATA_PICTUREPARAM_AV1D { uint32_t frame_width_minus1; uint32_t frame_height_minus1; uint32_t output_frame_width_in_tiles_minus_1; uint32_t output_frame_height_in_tiles_minus_1; uint32_t profile; EVENT_SEG_INFO_FIELDS seqInfo; uint32_t matrix_coefficients; uint32_t bit_depth_idx; uint32_t order_hint_bits_minus_1; EVENT_PIC_INFO_FIELDS picInfo; uint32_t tile_count_minus_1; uint32_t anchor_frames_num; uint32_t order_hint; uint32_t superres_scale_denominator; uint32_t interp_filter; EVENT_SEGMENTATION seg; uint32_t seg_feature_data[8][8]; uint32_t current_frame; uint32_t current_display_picture; uint32_t ref_frame_map[8]; uint32_t ref_frame_idx[7]; uint32_t primary_ref_frame; uint32_t filter_level[2]; uint32_t filter_level_u; uint32_t filter_level_v; EVENT_LOOP_FILTER lfInfo; int32_t ref_deltas[8]; int32_t mode_deltas[2]; uint32_t base_qindex; int32_t y_dc_delta_q; int32_t u_dc_delta_q; int32_t v_dc_delta_q; int32_t u_ac_delta_q; int32_t v_ac_delta_q; uint32_t cdef_damping_minus_3; uint32_t cdef_bits; uint32_t cdef_y_strengths[8]; uint32_t cdef_uv_strengths[8]; EVENT_PicEntry_AV1 wm[7]; uint32_t tile_cols; uint32_t tile_rows; uint32_t width_in_sbs_minus_1[63]; uint32_t height_in_sbs_minus_1[63]; uint32_t context_update_tile_id; } EVENTDATA_PICTUREPARAM_AV1D; typedef struct _EVENTDATA_TILECONTROLPARAMS_AV1D { uint32_t slice_data_offset; uint32_t slice_data_size; uint32_t slice_data_flag; uint32_t tile_row; uint32_t tile_column; uint32_t tg_start; uint32_t tg_end; uint32_t anchor_frame_idx; uint32_t tile_idx_in_tile_list; } EVENTDATA_TILECONTROLPARAMS_AV1D; void EventAV1DecodeSurfaceOutparam(EVENTDATA_SURFACEOUT_AV1D* pEventData, mfxFrameSurface1* surface_out); void EventAV1DecodePicparam(EVENTDATA_PICTUREPARAM_AV1D* pEventData, VADecPictureParameterBufferAV1& picParam); void EventAV1DecodeTileControlparam(EVENTDATA_TILECONTROLPARAMS_AV1D* pEventData, VASliceParameterBufferAV1& tileControlParam); void EventAV1DecodeDpbInfo(EVENTDATA_DPBINFO_AV1D* pEventData, std::vector updated_refs); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_unified_decode_logging.h000066400000000000000000000054321443134507600336110ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_UNIFIED_DECODE_LOGGING_H_ #define _MFX_UNIFIED_DECODE_LOGGING_H_ #include "mfx_config.h" #include "umc_va_base.h" typedef struct _EVENTDATA_DECODE_INIT { uint32_t CodecId; uint32_t frameWidth; uint32_t frameHeight; uint32_t BitDepthLuma; uint32_t BitDepthChroma; uint32_t frameCropX; uint32_t frameCropY; uint32_t frameCropH; uint32_t frameCropW; uint32_t framePicStruct; uint32_t frameChromaFormat; uint32_t frameAspectRatioW; uint32_t frameAspectRatioH; uint32_t frameRateExtD; uint32_t frameRateExtN; uint32_t CodecProfile; uint32_t CodecLevel; uint32_t MaxDecFrameBuffering; uint32_t frameFourCC; } EVENTDATA_DECODE_INIT; typedef struct _EventFrameDecodeInfo { uint32_t ChannelId; uint32_t BitDepthLuma; uint32_t BitDepthChroma; uint32_t Shift; uint32_t FourCC; uint32_t Width; uint32_t Height; uint32_t CropX; uint32_t CropY; uint32_t CropW; uint32_t CropH; uint32_t BufferSize; uint32_t FrameRateExtN; uint32_t FrameRateExtD; uint32_t AspectRatioW; uint32_t AspectRatioH; uint32_t PicStruct; uint32_t ChromaFormat; } EventFrameDecodeInfo; typedef struct _EVENTDATA_DECODE_QUERY { uint32_t NumFrameSuggested; uint32_t NumFrameMin; uint32_t Type; EventFrameDecodeInfo Info; } EVENTDATA_DECODE_QUERY; typedef struct _EVENTDATA_DECODE_BITSTREAM { uint8_t Data[32]; } EVENTDATA_DECODE_BITSTREAM; void EventDecodeInitParam(EVENTDATA_DECODE_INIT* pEventData, mfxVideoParam* par); void EventDecodeQueryParam(EVENTDATA_DECODE_QUERY* pEventData, mfxFrameAllocRequest* request); #endif //_MFX_UNIFIED_DECODE_LOGGING_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_unified_h264d_logging.h000066400000000000000000000121751443134507600332170ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_UNIFIED_H264D_LOGGING_H_ #define _MFX_UNIFIED_H264D_LOGGING_H_ #include "mfx_config.h" #include "umc_va_base.h" #include "umc_h264_frame_list.h" #include "mfx_unified_decode_logging.h" typedef struct _EVENTDATA_SURFACEOUT_H264 { uint32_t CropH; uint32_t CropW; uint32_t CropX; uint32_t CropY; uint32_t ChromaFormat; uint32_t AspectRatioH; uint32_t AspectRatioW; uint32_t FrameRateExtD; uint32_t FrameRateExtN; uint32_t PicStruct; uint32_t FrameOrder; uint32_t DataFlag; uint32_t TimeStamp; } EVENTDATA_SURFACEOUT_H264D; typedef struct _EVENT_PicEntry_H264 { uint32_t picture_id; uint32_t frame_idx; uint32_t flags; uint32_t TopFieldOrderCnt; uint32_t BottomFieldOrderCnt; } EVENT_PicEntry_H264; typedef struct _EVENTDATA_PICTUREPARAM_AVC { EVENT_PicEntry_H264 CurrPic; uint32_t picture_width_in_mbs_minus1; uint32_t picture_height_in_mbs_minus1; uint32_t bit_depth_luma_minus8; uint32_t bit_depth_chroma_minus8; uint32_t num_ref_frames; uint32_t chroma_format_idc; uint32_t residual_colour_transform_flag; uint32_t frame_mbs_only_flag; uint32_t mb_adaptive_frame_field_flag; uint32_t direct_8x8_inference_flag; uint32_t MinLumaBiPredSize8x8; uint32_t log2_max_frame_num_minus4; uint32_t pic_order_cnt_type; uint32_t log2_max_pic_order_cnt_lsb_minus4; uint32_t delta_pic_order_always_zero_flag; uint32_t pic_init_qp_minus26; uint32_t pic_init_qs_minus26; uint32_t chroma_qp_index_offset; uint32_t second_chroma_qp_index_offset; uint32_t entropy_coding_mode_flag; uint32_t weighted_pred_flag; uint32_t weighted_bipred_idc; uint32_t transform_8x8_mode_flag; uint32_t field_pic_flag; uint32_t constrained_intra_pred_flag; uint32_t pic_order_present_flag; uint32_t deblocking_filter_control_present_flag; uint32_t redundant_pic_cnt_present_flag; uint32_t reference_pic_flag; uint32_t frame_num; EVENT_PicEntry_H264 ReferenceFrames[16]; } EVENTDATA_PICTUREPARAM_AVC; typedef struct _EVENTDATA_SLICEPARAM_AVC { uint32_t slice_data_flag; uint32_t slice_data_size; uint32_t slice_data_offset; uint32_t slice_data_bit_offset; uint32_t first_mb_in_slice; uint32_t slice_type; uint32_t direct_spatial_mv_pred_flag; uint32_t cabac_init_idc; uint32_t slice_qp_delta; uint32_t disable_deblocking_filter_idc; uint32_t luma_log2_weight_denom; uint32_t chroma_log2_weight_denom; uint32_t num_ref_idx_l0_active_minus1; uint32_t num_ref_idx_l1_active_minus1; uint32_t slice_alpha_c0_offset_div2; uint32_t slice_beta_offset_div2; uint32_t luma_weight_l0[32]; uint32_t luma_offset_l0[32]; uint32_t luma_weight_l1[32]; uint32_t luma_offset_l1[32]; uint32_t chroma_weight_l0[32][2]; uint32_t chroma_offset_l0[32][2]; uint32_t chroma_weight_l1[32][2]; uint32_t chroma_offset_l1[32][2]; EVENT_PicEntry_H264 RefPicList0[32]; EVENT_PicEntry_H264 RefPicList1[32]; } EVENTDATA_SLICEPARAM_AVC; typedef struct _EVENTDATA_H264DPBINFO { uint32_t PicOrderCnt[2]; int32_t FrameId; uint32_t isShortTermRef; uint32_t isLongTermRef; int32_t refCounter; } EVENTDATA_H264DPBINFO; typedef struct _EVENTDATA_DPBINFO_H264D { uint32_t eventCount; EVENTDATA_H264DPBINFO DpbInfo[16]; } EVENTDATA_DPBINFO_H264D; typedef struct _EVENTDATA_QMATRIX_H264D { uint32_t bScalingLists4x4[6][16]; uint32_t bScalingLists8x8[2][64]; } EVENTDATA_QMATRIX_H264D; void EventH264DecodeSurfaceOutparam(EVENTDATA_SURFACEOUT_H264D* pEventData, mfxFrameSurface1* surface_out); void EventH264DecodePicparam(EVENTDATA_PICTUREPARAM_AVC* pEventData, VAPictureParameterBufferH264* pPicParams_H264); void EventH264DecodeSliceParam(EVENTDATA_SLICEPARAM_AVC* pEventData, VASliceParameterBufferH264* SliceParam); void EventH264DecodeQmatrixParam(EVENTDATA_QMATRIX_H264D* pEventData, VAIQMatrixBufferH264* IQMatrixParam); void EventH264DecodeDpbInfo(EVENTDATA_DPBINFO_H264D* pEventData, UMC::H264DBPList* pDPBList); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_unified_h265d_logging.h000066400000000000000000000167371443134507600332300ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_UNIFIED_LOGGING_H_ #define _MFX_UNIFIED_LOGGING_H_ #include "mfx_config.h" #include "umc_va_base.h" #include "umc_h265_frame_list.h" #include "mfx_unified_decode_logging.h" typedef struct _EVENTDATA_SURFACEOUT_H265 { uint32_t CropH; uint32_t CropW; uint32_t CropX; uint32_t CropY; uint32_t ChromaFormat; uint32_t AspectRatioH; uint32_t AspectRatioW; uint32_t FrameRateExtD; uint32_t FrameRateExtN; uint32_t PicStruct; uint32_t FrameOrder; uint32_t DataFlag; uint32_t TimeStamp; } EVENTDATA_SURFACEOUT_H265D; typedef struct _DECODE_EVENTDATA_SYNC_H265 { uint32_t PicOrderCnt; uint32_t m_index; uint32_t isDecodingCompleted; uint32_t m_isDisplayable; uint32_t m_wasOutputted; uint32_t eventSts; } DECODE_EVENTDATA_SYNC_H265; typedef struct _DECODE_EVENTDATA_outputFrame_h265 { uint32_t PicOrderCnt; uint32_t wasDisplayed; uint32_t wasOutputted; } DECODE_EVENTDATA_outputFrame_h265; typedef struct _EVENT_PicEntry_HEVC { uint32_t picture_id; uint32_t pic_order_cnt; uint32_t flags; } EVENT_PicEntry_HEVC; typedef struct _EVENTDATA_PICTUREPARAM_HEVC { EVENT_PicEntry_HEVC CurrPic; EVENT_PicEntry_HEVC ReferenceFrames[15]; uint32_t pic_width_in_luma_samples; uint32_t pic_height_in_luma_samples; uint32_t chroma_format_idc; uint32_t separate_colour_plane_flag; uint32_t pcm_enabled_flag; uint32_t scaling_list_enabled_flag; uint32_t transform_skip_enabled_flag; uint32_t amp_enabled_flag; uint32_t strong_intra_smoothing_enabled_flag; uint32_t sign_data_hiding_enabled_flag; uint32_t constrained_intra_pred_flag; uint32_t cu_qp_delta_enabled_flag; uint32_t weighted_pred_flag; uint32_t weighted_bipred_flag; uint32_t transquant_bypass_enabled_flag; uint32_t tiles_enabled_flag; uint32_t entropy_coding_sync_enabled_flag; uint32_t pps_loop_filter_across_slices_enabled_flag; uint32_t loop_filter_across_tiles_enabled_flag; uint32_t pcm_loop_filter_disabled_flag; uint32_t NoPicReorderingFlag; uint32_t NoBiPredFlag; uint32_t sps_max_dec_pic_buffering_minus1; uint32_t bit_depth_luma_minus8; uint32_t bit_depth_chroma_minus8; uint32_t pcm_sample_bit_depth_luma_minus1; uint32_t pcm_sample_bit_depth_chroma_minus1; uint32_t log2_min_luma_coding_block_size_minus3; uint32_t log2_diff_max_min_luma_coding_block_size; uint32_t log2_min_transform_block_size_minus2; uint32_t log2_diff_max_min_transform_block_size; uint32_t log2_min_pcm_luma_coding_block_size_minus3; uint32_t log2_diff_max_min_pcm_luma_coding_block_size; uint32_t max_transform_hierarchy_depth_intra; uint32_t max_transform_hierarchy_depth_inter; uint32_t init_qp_minus26; uint32_t diff_cu_qp_delta_depth; uint32_t pps_cb_qp_offset; uint32_t pps_cr_qp_offset; uint32_t log2_parallel_merge_level_minus2; uint32_t num_tile_columns_minus1; uint32_t num_tile_rows_minus1; uint32_t column_width_minus1[19]; uint32_t row_height_minus1[21]; uint32_t lists_modification_present_flag; uint32_t long_term_ref_pics_present_flag; uint32_t sps_temporal_mvp_enabled_flag; uint32_t cabac_init_present_flag; uint32_t output_flag_present_flag; uint32_t dependent_slice_segments_enabled_flag; uint32_t pps_slice_chroma_qp_offsets_present_flag; uint32_t sample_adaptive_offset_enabled_flag; uint32_t deblocking_filter_override_enabled_flag; uint32_t pps_disable_deblocking_filter_flag; uint32_t slice_segment_header_extension_present_flag ; uint32_t RapPicFlag; uint32_t IdrPicFlag; uint32_t IntraPicFlag; uint32_t ReservedBits; uint32_t log2_max_pic_order_cnt_lsb_minus4; uint32_t num_short_term_ref_pic_sets; uint32_t num_long_term_ref_pic_sps; uint32_t num_ref_idx_l0_default_active_minus1; uint32_t num_ref_idx_l1_default_active_minus1; uint32_t pps_beta_offset_div2; uint32_t pps_tc_offset_div2; uint32_t num_extra_slice_header_bits; uint32_t st_rps_bits; } EVENTDATA_PICTUREPARAM_HEVC; typedef struct _EVENTDATA_SLICEPARAM_HEVC { uint32_t slice_data_byte_offset; uint32_t slice_segment_address; uint32_t RefPicList[2][15]; uint32_t LastSliceOfPic; uint32_t dependent_slice_segment_flag; uint32_t slice_type; uint32_t color_plane_id; uint32_t slice_sao_luma_flag; uint32_t slice_sao_chroma_flag; uint32_t mvd_l1_zero_flag; uint32_t cabac_init_flag; uint32_t slice_temporal_mvp_enabled_flag; uint32_t slice_deblocking_filter_disabled_flag; uint32_t collocated_from_l0_flag; uint32_t slice_loop_filter_across_slices_enabled_flag; uint32_t collocated_ref_idx; uint32_t num_ref_idx_l0_active_minus1; uint32_t num_ref_idx_l1_active_minus1; uint32_t slice_qp_delta; uint32_t slice_cb_qp_offset; uint32_t slice_cr_qp_offset; uint32_t slice_beta_offset_div2; uint32_t slice_tc_offset_div2; uint32_t luma_log2_weight_denom; uint32_t delta_chroma_log2_weight_denom; uint32_t luma_offset_l0[15]; uint32_t delta_luma_weight_l0[15]; uint32_t delta_chroma_weight_l0[15][2]; uint32_t ChromaOffsetL0[15][2]; uint32_t luma_offset_l1[15]; uint32_t delta_luma_weight_l1[15]; uint32_t delta_chroma_weight_l1[15][2]; uint32_t ChromaOffsetL1[15][2]; uint32_t five_minus_max_num_merge_cand; } EVENTDATA_SLICEPARAM_HEVC; typedef struct _EVENTDATA_Qmatrix_HEVC { uint32_t ScalingList4x4[6][16]; uint32_t ScalingList8x8[6][64]; uint32_t ScalingList16x16[6][64]; uint32_t ScalingList32x32[2][64]; uint32_t ScalingListDC16x16[6]; uint32_t ScalingListDC32x32[2]; } EVENTDATA_Qmatrix_HEVC; typedef struct _EVENTDATA_DPBINFO_HEVC { uint32_t count; EVENT_PicEntry_HEVC ReferenceFrames[15]; } EVENTDATA_DPBINFO_HEVC; void EventH265DecodeSurfaceOutparam(EVENTDATA_SURFACEOUT_H265D* pEventData, mfxFrameSurface1* surface_out); void EventH265DecodePicparam(EVENTDATA_PICTUREPARAM_HEVC* pEventData, VAPictureParameterBufferHEVC* pPicParam); void EventH265DecodeSliceparam(EVENTDATA_SLICEPARAM_HEVC* pEventData, VASliceParameterBufferHEVC* sliceHdr); void EventH265DecodeQmatrixParam(EVENTDATA_Qmatrix_HEVC* pEventData, VAIQMatrixBufferHEVC* qmatrix); void EventH265DecodeDpbInfo(EVENTDATA_DPBINFO_HEVC* pEventData, VAPictureParameterBufferHEVC* pPicParam); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_unified_vp9d_logging.h000066400000000000000000000103101443134507600332370ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_UNIFIED_LOGGING_H_ #define _MFX_UNIFIED_LOGGING_H_ #include "mfx_config.h" #include "umc_va_base.h" #include "umc_vp9_frame.h" #include "mfx_unified_decode_logging.h" typedef struct _EVENTDATA_SURFACEOUT_VP9D { uint32_t CropH; uint32_t CropW; uint32_t CropX; uint32_t CropY; uint32_t ChromaFormat; uint32_t AspectRatioH; uint32_t AspectRatioW; uint32_t FrameRateExtD; uint32_t FrameRateExtN; uint32_t PicStruct; uint32_t DataFlag; uint32_t FrameOrder; uint32_t TimeStamp; } EVENTDATA_SURFACEOUT_VP9D; typedef struct _EVENTDATA_PICTUREPARAM_VP9 { uint32_t frame_width; uint32_t frame_height; uint32_t reference_frames[8]; uint32_t subsampling_x; uint32_t subsampling_y; uint32_t frame_type; uint32_t show_frame; uint32_t error_resilient_mode; uint32_t intra_only; uint32_t allow_high_precision_mv; uint32_t mcomp_filter_type; uint32_t frame_parallel_decoding_mode; uint32_t reset_frame_context; uint32_t refresh_frame_context; uint32_t frame_context_idx; uint32_t segmentation_enabled; uint32_t segmentation_temporal_update; uint32_t segmentation_update_map; uint32_t last_ref_frame; uint32_t last_ref_frame_sign_bias; uint32_t golden_ref_frame; uint32_t golden_ref_frame_sign_bias; uint32_t alt_ref_frame; uint32_t alt_ref_frame_sign_bias; uint32_t lossless_flag; uint32_t filter_level; uint32_t sharpness_level; uint32_t log2_tile_rows; uint32_t log2_tile_columns; uint32_t frame_header_length_in_bytes; uint32_t first_partition_size; uint32_t mb_segment_tree_probs[7]; uint32_t segment_pred_probs[3]; uint32_t profile; uint32_t bit_depth; } EVENTDATA_PICTUREPARAM_VP9; typedef struct _VASegmentParameterVP9_VA { uint32_t segment_reference_enabled; uint32_t segment_reference; uint32_t segment_reference_skipped; uint32_t filter_level[4][2]; uint32_t luma_ac_quant_scale; uint32_t luma_dc_quant_scale; uint32_t chroma_ac_quant_scale; uint32_t chroma_dc_quant_scale; } VASegmentParameterVP9_VA; typedef struct _EVENTDATA_SLICEPARAM_VP9 { uint32_t slice_data_size; uint32_t slice_data_offset; uint32_t slice_data_flag; VASegmentParameterVP9_VA seg_param[8]; } EVENTDATA_SLICEPARAM_VP9; typedef struct _EVENTDATA_OUTPUTFRAME_VP9 { uint32_t MemID; uint32_t wasDisplayed; } EVENTDATA_OUTPUTFRAME_VP9; typedef struct _EVENTDATA_DPBINFO { uint32_t FrameId; uint32_t isDecoded; } EVENTDATA_DPBINFO; typedef struct _EVENTDATA_DPBINFO_VP9D { uint32_t eventCount; EVENTDATA_DPBINFO DpbInfo[16]; } EVENTDATA_DPBINFO_VP9D; void EventVP9DecodeSurfaceOutparam(EVENTDATA_SURFACEOUT_VP9D* pEventData, mfxFrameSurface1** surface_out); void EventVP9DecodePicparam(EVENTDATA_PICTUREPARAM_VP9* pEventData, VADecPictureParameterBufferVP9* picParam); void EventVP9DecodeSegmentParam(EVENTDATA_SLICEPARAM_VP9* pEventData, VASliceParameterBufferVP9* sliceParam); void EventVP9DecodeDpbInfo(EVENTDATA_DPBINFO_VP9D* pEventData, std::vector m_submittedFrames); #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_utils_logging.h000066400000000000000000000147131443134507600320250ustar00rootroot00000000000000// Copyright (c) 2021-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "mfx_ext_buffers.h" #include #include #include #include #include #include #include typedef enum { LEVEL_UNKNOWN = 0, LEVEL_DISABLED = 1, LEVEL_TRACE = 2, LEVEL_DEBUG = 3, LEVEL_INFO = 4, LEVEL_WARN = 5, LEVEL_ERROR = 6, LEVEL_FATAL = 7, } mfxLogLevel; extern bool gMfxLogSkipped; extern mfxLogLevel gMfxLogLevel; extern std::shared_ptr gMfxLogFile; extern std::shared_ptr gMfxAPIDumpFile; extern std::mutex gMfxLogMutex; #define COLOR_BLACK 0x0000 #define COLOR_GREEN 0x0002 #define COLOR_RED 0x0004 #define COLOR_GRAY 0x0008 #define COLOR_YELLOW 0x000E #define COLOR_WHITE 0x000F class MfxLogSkip { public: MfxLogSkip() { gMfxLogSkipped = true; }; ~MfxLogSkip() { gMfxLogSkipped = false; } }; std::unique_ptr GetMfxLogSkip(); void InitMfxLogging(); const std::string GetMFXStatusInString(mfxStatus mfxSts); #if defined(MFX_ENABLE_LOG_UTILITY) #define SET_LOG_GUARD() std::unique_lock closeGuard(gMfxLogMutex) #else #define SET_LOG_GUARD() #endif #if defined(MFX_ENABLE_LOG_UTILITY) #define CHECK_LOG_LEVEL(level) \ if (gMfxLogSkipped || gMfxLogLevel == LEVEL_DISABLED || level < gMfxLogLevel) break #else #define CHECK_LOG_LEVEL(level) #endif inline void SetLogColor(uint16_t backColor, uint16_t frontColor) { #if defined(MFX_ENABLE_LOG_UTILITY) std::ignore = backColor; std::ignore = frontColor; #else std::ignore = backColor; std::ignore = frontColor; #endif } #if defined(_MSVC_LANG) #pragma warning(push) #pragma warning(disable: 4100) #endif // Fix GCC warning: format not a string literal and no format arguments template::type = true> inline void MfxFprintf(FILE* file, Args&&... args) { fprintf(file, "%s", std::forward(args)...); } template= 2, bool>::type = true> inline void MfxFprintf(FILE* file, Args&&... args) { fprintf(file, std::forward(args)...); } template inline void MfxLog(FILE* file, const char* levelName, const char* fileName, const uint32_t lineNum, Args&&... args) { #if defined(MFX_ENABLE_LOG_UTILITY) std::stringstream threadID; threadID << std::this_thread::get_id(); MfxFprintf(file, "TH#%s %s %s[Line: %d]", threadID.str().c_str(), levelName, fileName, lineNum); MfxFprintf(file, std::forward(args)...); fflush(file); #endif } template inline void MfxLog(const mfxLogLevel level, const char* levelName, const char* fileName, const uint32_t lineNum, Args&&... args) { #if defined(MFX_ENABLE_LOG_UTILITY) FILE* file = gMfxLogFile != nullptr ? gMfxLogFile.get() : stdout; bool bSetColor = gMfxLogFile == nullptr; if (bSetColor) { if (level == LEVEL_INFO) { SetLogColor(COLOR_BLACK, COLOR_GREEN); } else if (level == LEVEL_WARN) { SetLogColor(COLOR_BLACK, COLOR_GRAY); } else if (level == LEVEL_ERROR) { SetLogColor(COLOR_BLACK, COLOR_YELLOW); } else if (level == LEVEL_FATAL) { SetLogColor(COLOR_BLACK, COLOR_RED); } else { bSetColor = false; } } MfxLog(file, levelName, fileName, lineNum, std::forward(args)...); if (bSetColor) { SetLogColor(COLOR_BLACK, COLOR_WHITE); } #endif } #if defined(_MSVC_LANG) #pragma warning(pop) #endif template inline void MfxLogPrint(FILE* file, Args&&... args) { MfxFprintf(file, std::forward(args)...); fflush(file); } template inline void MfxLogPrint(Args&&... args) { FILE* file = gMfxLogFile != nullptr ? gMfxLogFile.get() : stdout; MfxLogPrint(file, std::forward(args)...); } #define MFX_LOG(level, ...) do { \ CHECK_LOG_LEVEL(level); \ SET_LOG_GUARD(); \ MfxLog(level, #level, __VA_ARGS__); } \ while(0) #define MFX_LOG_TRACE(...) MFX_LOG(LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__) #define MFX_LOG_DEBUG(...) MFX_LOG(LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__) #define MFX_LOG_INFO(...) MFX_LOG(LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__) #define MFX_LOG_WARN(...) MFX_LOG(LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__) #define MFX_LOG_ERROR(...) MFX_LOG(LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__) #if defined(MFX_ENABLE_LOG_UTILITY) #define MFX_LOG_FATAL(...) MFX_LOG(LEVEL_FATAL, __FILE__, __LINE__, __VA_ARGS__) #else #define MFX_LOG_FATAL(...) MfxLogPrint(stdout, ##__VA_ARGS__) #endif #if defined(MFX_ENABLE_LOG_UTILITY) #define MFX_LOG_DDI_TRACE(file, ...) do { \ CHECK_LOG_LEVEL(LEVEL_TRACE); \ MfxLogPrint(file, ##__VA_ARGS__); } \ while (0) #endif #if defined(MFX_ENABLE_LOG_UTILITY) template const std::string GetNumberFormat(T&) { if (std::is_signed::value) return "%d"; else return "%u"; } #endif #if defined(MFX_ENABLE_LOG_UTILITY) #define MFX_LOG_API_TRACE(...) do { \ CHECK_LOG_LEVEL(LEVEL_TRACE); \ if (gMfxAPIDumpFile != nullptr) MfxLogPrint(gMfxAPIDumpFile.get(), ##__VA_ARGS__); } \ while (0) #else #define MFX_LOG_API_TRACE(...) #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/include/mfx_utils_perf.h000066400000000000000000000053511443134507600313310ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include #include #include #include #define MFX_MAX_PERF_FILENAME_LEN 260 #define MFX_MAX_PATH_LENGTH 256 //For perf log typedef struct _Tick { std::string tag; int64_t timestamp; int64_t freq; std::string functionType; std::string level; }Tick; //For TXT trace typedef struct _TickTime { double freq; int64_t start; int64_t stop; }TickTime; class PerfUtility { public: static PerfUtility* getInstance(); ~PerfUtility(); PerfUtility(); int32_t getPid(); int32_t getTid(); void timeStampTick(const std::string &tag, const std::string &level, const std::string &flag, const std::vector &taskIds); void startTick(const std::string &tag); void stopTick(const std::string &tag); void savePerfData(); int32_t dwPerfUtilityIsEnabled; std::string perfFilePath; std::atomic timeStamp; private: void printPerfTimeStamp(Tick* newTick, const std::vector& taskIds); private: static std::shared_ptr instance; static std::mutex perfMutex; std::map log_buffer{}; std::map, std::vector*> records{}; }; extern PerfUtility* g_perfutility; #define PERF_LEVEL_API "API" #define PERF_LEVEL_DDI "DDI" #define PERF_LEVEL_HW "HW" #define PERF_LEVEL_ROUTINE "Routine" #define PERF_LEVEL_INTERNAL "INTERNAL" #define MFX_FLAG_ENTER ": ENTER" #define MFX_FLAG_EXIT ": EXIT" #define PERF_UTILITY_TIMESTAMP(TAG,LEVEL,FLAG) \ do \ { \ if (g_perfutility->dwPerfUtilityIsEnabled) \ { \ g_perfutility->timeStampTick(TAG, LEVEL, FLAG, std::vector()); \ } \ } while(0) #define PERF_UTILITY_AUTO(TAG,LEVEL) AutoPerfUtility apu(TAG,LEVEL) #define PERF_UTILITY_SET_ASYNC_TASK_ID(id) AutoPerfUtility::SetTaskId(id) class AutoPerfUtility { public: static void SetTaskId(uint32_t id); AutoPerfUtility(const std::string &tag, const std::string &level); ~AutoPerfUtility(); private: static std::mutex map_guard; static std::map> tid2taskIds; bool bEnable = false; bool bPrintTaskIds = false; std::string autotag = "intialized"; std::string autolevel = "intialized"; };oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/000077500000000000000000000000001443134507600252725ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_unified_av1d_logging.cpp000066400000000000000000000240461443134507600327220ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_unified_av1d_logging.h" void EventAV1DecodeSurfaceOutparam( EVENTDATA_SURFACEOUT_AV1D* pEventData, mfxFrameSurface1* surface_out) { pEventData->CropH = surface_out->Info.CropH; pEventData->CropW = surface_out->Info.CropW; pEventData->CropX = surface_out->Info.CropX; pEventData->CropY = surface_out->Info.CropY; pEventData->ChromaFormat = surface_out->Info.ChromaFormat; pEventData->AspectRatioH = surface_out->Info.AspectRatioH; pEventData->AspectRatioW = surface_out->Info.AspectRatioW; pEventData->FrameRateExtD = surface_out->Info.FrameRateExtD; pEventData->FrameRateExtN = surface_out->Info.FrameRateExtN; pEventData->FrameOrder = surface_out->Data.FrameOrder; pEventData->PicStruct = surface_out->Info.PicStruct; pEventData->DataFlag = surface_out->Data.DataFlag; pEventData->TimeStamp = (uint32_t)surface_out->Data.TimeStamp; } void EventAV1DecodePicparam( EVENTDATA_PICTUREPARAM_AV1D* pEventData, VADecPictureParameterBufferAV1& picParam) { pEventData->frame_width_minus1 = picParam.frame_width_minus1; pEventData->frame_height_minus1 = picParam.frame_height_minus1; pEventData->output_frame_width_in_tiles_minus_1 = picParam.output_frame_width_in_tiles_minus_1; pEventData->output_frame_height_in_tiles_minus_1 = picParam.output_frame_height_in_tiles_minus_1; pEventData->profile = picParam.profile; pEventData->seqInfo.still_picture = picParam.seq_info_fields.fields.still_picture; pEventData->seqInfo.use_128x128_superblock = picParam.seq_info_fields.fields.use_128x128_superblock; pEventData->seqInfo.enable_filter_intra = picParam.seq_info_fields.fields.enable_filter_intra; pEventData->seqInfo.enable_intra_edge_filter = picParam.seq_info_fields.fields.enable_intra_edge_filter; pEventData->seqInfo.enable_interintra_compound = picParam.seq_info_fields.fields.enable_interintra_compound; pEventData->seqInfo.enable_masked_compound = picParam.seq_info_fields.fields.enable_masked_compound; pEventData->seqInfo.enable_cdef = picParam.seq_info_fields.fields.enable_cdef; pEventData->seqInfo.enable_dual_filter = picParam.seq_info_fields.fields.enable_dual_filter; pEventData->seqInfo.enable_order_hint = picParam.seq_info_fields.fields.enable_order_hint; pEventData->seqInfo.enable_jnt_comp = picParam.seq_info_fields.fields.enable_jnt_comp; pEventData->seqInfo.mono_chrome = picParam.seq_info_fields.fields.mono_chrome; pEventData->seqInfo.color_range = picParam.seq_info_fields.fields.color_range; pEventData->seqInfo.subsampling_x = picParam.seq_info_fields.fields.subsampling_x; pEventData->seqInfo.subsampling_y = picParam.seq_info_fields.fields.subsampling_y; pEventData->seqInfo.chroma_sample_position = picParam.seq_info_fields.fields.chroma_sample_position; pEventData->seqInfo.film_grain_params_present = picParam.seq_info_fields.fields.film_grain_params_present; pEventData->matrix_coefficients = picParam.matrix_coefficients; pEventData->bit_depth_idx = picParam.bit_depth_idx; pEventData->order_hint_bits_minus_1 = picParam.order_hint_bits_minus_1; pEventData->picInfo.frame_type = picParam.pic_info_fields.bits.frame_type; pEventData->picInfo.show_frame = picParam.pic_info_fields.bits.show_frame; pEventData->picInfo.showable_frame = picParam.pic_info_fields.bits.showable_frame; pEventData->picInfo.error_resilient_mode = picParam.pic_info_fields.bits.error_resilient_mode; pEventData->picInfo.disable_cdf_update = picParam.pic_info_fields.bits.disable_cdf_update; pEventData->picInfo.allow_screen_content_tools = picParam.pic_info_fields.bits.allow_screen_content_tools; pEventData->picInfo.force_integer_mv = picParam.pic_info_fields.bits.force_integer_mv; pEventData->picInfo.allow_intrabc = picParam.pic_info_fields.bits.allow_intrabc; pEventData->picInfo.use_superres = picParam.pic_info_fields.bits.use_superres; pEventData->picInfo.allow_high_precision_mv = picParam.pic_info_fields.bits.allow_high_precision_mv; pEventData->picInfo.is_motion_mode_switchable = picParam.pic_info_fields.bits.is_motion_mode_switchable; pEventData->picInfo.disable_frame_end_update_cdf = picParam.pic_info_fields.bits.disable_frame_end_update_cdf; pEventData->picInfo.uniform_tile_spacing_flag = picParam.pic_info_fields.bits.uniform_tile_spacing_flag; pEventData->picInfo.allow_warped_motion = picParam.pic_info_fields.bits.allow_warped_motion; pEventData->picInfo.large_scale_tile = picParam.pic_info_fields.bits.large_scale_tile; pEventData->tile_count_minus_1 = picParam.tile_count_minus_1; pEventData->anchor_frames_num = picParam.anchor_frames_num; pEventData->order_hint = picParam.order_hint; pEventData->superres_scale_denominator = picParam.superres_scale_denominator; pEventData->interp_filter = picParam.interp_filter; pEventData->seg.enabled = picParam.seg_info.segment_info_fields.bits.enabled; pEventData->seg.update_map = picParam.seg_info.segment_info_fields.bits.update_map; pEventData->seg.temporal_update = picParam.seg_info.segment_info_fields.bits.temporal_update; pEventData->seg.update_data = picParam.seg_info.segment_info_fields.bits.update_data; for (uint8_t i = 0; i < 8; i++) { pEventData->seg.feature_mask[i] = picParam.seg_info.feature_mask[i]; for (uint8_t j = 0; j < 8; j++) { pEventData->seg_feature_data[i][j] = picParam.seg_info.feature_data[i][j]; } } pEventData->current_frame = picParam.current_frame; pEventData->current_display_picture = picParam.current_display_picture; for (uint8_t i = 0; i < 8; i++) { pEventData->ref_frame_map[i] = picParam.ref_frame_map[i]; } for (uint8_t i = 0; i < 7; i++) { pEventData->ref_frame_idx[i] = picParam.ref_frame_idx[i]; } pEventData->primary_ref_frame = picParam.primary_ref_frame; pEventData->filter_level[0] = picParam.filter_level[0]; pEventData->filter_level[1] = picParam.filter_level[1]; pEventData->filter_level_u = picParam.filter_level_u; pEventData->filter_level_v = picParam.filter_level_v; pEventData->lfInfo.sharpness_level = picParam.loop_filter_info_fields.bits.sharpness_level; pEventData->lfInfo.mode_ref_delta_enabled = picParam.loop_filter_info_fields.bits.mode_ref_delta_enabled; pEventData->lfInfo.mode_ref_delta_update = picParam.loop_filter_info_fields.bits.mode_ref_delta_update; for (uint8_t i = 0; i < 8; i++) { pEventData->ref_deltas[i] = picParam.ref_deltas[i]; } pEventData->mode_deltas[0] = picParam.mode_deltas[0]; pEventData->mode_deltas[1] = picParam.mode_deltas[1]; pEventData->base_qindex = picParam.base_qindex; pEventData->y_dc_delta_q = picParam.y_dc_delta_q; pEventData->u_dc_delta_q = picParam.u_dc_delta_q; pEventData->v_dc_delta_q = picParam.v_dc_delta_q; pEventData->u_ac_delta_q = picParam.u_ac_delta_q; pEventData->v_ac_delta_q = picParam.v_ac_delta_q; pEventData->cdef_damping_minus_3 = picParam.cdef_damping_minus_3; pEventData->cdef_bits = picParam.cdef_bits; for (uint8_t i = 0; i < 8; i++) { pEventData->cdef_y_strengths[i] = picParam.cdef_y_strengths[i]; pEventData->cdef_uv_strengths[i] = picParam.cdef_uv_strengths[i]; } for (uint8_t i = 0; i < 7; i++) { pEventData->wm[i].wmtype = picParam.wm[i].wmtype; for (uint8_t j = 0; j < 8; j++) { pEventData->wm[i].wmmat[j] = picParam.wm[i].wmmat[j]; } pEventData->wm[i].invalid = picParam.wm[i].invalid; } pEventData->tile_cols = picParam.tile_cols; pEventData->tile_rows = picParam.tile_rows; for (uint8_t i = 0; i < 63; i++) { pEventData->width_in_sbs_minus_1[i] = picParam.width_in_sbs_minus_1[i]; pEventData->height_in_sbs_minus_1[i] = picParam.height_in_sbs_minus_1[i]; } pEventData->context_update_tile_id = picParam.context_update_tile_id; } void EventAV1DecodeTileControlparam( EVENTDATA_TILECONTROLPARAMS_AV1D* pEventData, VASliceParameterBufferAV1& tileControlParam) { pEventData->slice_data_offset = tileControlParam.slice_data_offset; pEventData->slice_data_size = tileControlParam.slice_data_size; pEventData->slice_data_flag = tileControlParam.slice_data_flag; pEventData->tile_row = tileControlParam.tile_row; pEventData->tile_column = tileControlParam.tile_column; pEventData->tg_start = tileControlParam.tg_start; pEventData->tg_end = tileControlParam.tg_end; pEventData->anchor_frame_idx = tileControlParam.anchor_frame_idx; pEventData->tile_idx_in_tile_list = tileControlParam.tile_idx_in_tile_list; } void EventAV1DecodeDpbInfo( EVENTDATA_DPBINFO_AV1D* pEventData, std::vector updated_refs) { for (uint8_t i = 0; i < 6; ++i) { pEventData->DpbInfo[i].MemID = updated_refs[i]->GetMemID(); pEventData->DpbInfo[i].Refvalid = updated_refs[i]->RefValid(); pEventData->DpbInfo[i].RefCounter = updated_refs[i]->GetRefCounter(); } }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_unified_decode_logging.cpp000066400000000000000000000071631443134507600333130ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_unified_decode_logging.h" void EventDecodeInitParam( EVENTDATA_DECODE_INIT* pEventData, mfxVideoParam* par) { pEventData->CodecId = par->mfx.CodecId; pEventData->frameWidth = par->mfx.FrameInfo.Width; pEventData->frameHeight = par->mfx.FrameInfo.Height; pEventData->BitDepthLuma = par->mfx.FrameInfo.BitDepthLuma; pEventData->BitDepthChroma = par->mfx.FrameInfo.BitDepthChroma, pEventData->frameCropX = par->mfx.FrameInfo.CropX; pEventData->frameCropY = par->mfx.FrameInfo.CropY; pEventData->frameCropH = par->mfx.FrameInfo.CropH; pEventData->frameCropW = par->mfx.FrameInfo.CropW; pEventData->framePicStruct = par->mfx.FrameInfo.PicStruct; pEventData->frameChromaFormat = par->mfx.FrameInfo.ChromaFormat; pEventData->frameAspectRatioW = par->mfx.FrameInfo.AspectRatioW; pEventData->frameAspectRatioH = par->mfx.FrameInfo.AspectRatioH; pEventData->frameRateExtD = par->mfx.FrameInfo.FrameRateExtD; pEventData->frameRateExtN = par->mfx.FrameInfo.FrameRateExtN; pEventData->CodecProfile = par->mfx.CodecProfile; pEventData->CodecLevel = par->mfx.CodecLevel; pEventData->MaxDecFrameBuffering = par->mfx.MaxDecFrameBuffering; pEventData->frameFourCC = par->mfx.FrameInfo.FourCC; } void EventDecodeQueryParam( EVENTDATA_DECODE_QUERY* pEventData, mfxFrameAllocRequest* request) { pEventData->NumFrameSuggested = request->NumFrameSuggested; pEventData->NumFrameMin = request->NumFrameMin; pEventData->Type = request->Type; pEventData->Info.ChannelId = request->Info.ChannelId; pEventData->Info.BitDepthLuma = request->Info.BitDepthLuma; pEventData->Info.BitDepthChroma = request->Info.BitDepthChroma; pEventData->Info.Shift = request->Info.Shift; pEventData->Info.FourCC = request->Info.FourCC; pEventData->Info.Width = request->Info.Width; pEventData->Info.Height = request->Info.Height; pEventData->Info.CropX = request->Info.CropX; pEventData->Info.CropY = request->Info.CropY; pEventData->Info.CropW = request->Info.CropW; pEventData->Info.CropH = request->Info.CropH; pEventData->Info.BufferSize = (uint32_t)request->Info.BufferSize; pEventData->Info.FrameRateExtN = request->Info.FrameRateExtN; pEventData->Info.FrameRateExtD = request->Info.FrameRateExtD; pEventData->Info.AspectRatioW = request->Info.AspectRatioW; pEventData->Info.AspectRatioH = request->Info.AspectRatioH; pEventData->Info.PicStruct = request->Info.PicStruct; pEventData->Info.ChromaFormat = request->Info.ChromaFormat; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_unified_h264d_logging.cpp000066400000000000000000000246151443134507600327200ustar00rootroot00000000000000// Copyright (c) 2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_unified_h264d_logging.h" void EventH264DecodeSurfaceOutparam( EVENTDATA_SURFACEOUT_H264D* pEventData, mfxFrameSurface1* surface_out) { pEventData->CropH = surface_out->Info.CropH; pEventData->CropW = surface_out->Info.CropW; pEventData->CropX = surface_out->Info.CropX; pEventData->CropY = surface_out->Info.CropY; pEventData->ChromaFormat = surface_out->Info.ChromaFormat; pEventData->AspectRatioH = surface_out->Info.AspectRatioH; pEventData->AspectRatioW = surface_out->Info.AspectRatioW; pEventData->FrameRateExtD = surface_out->Info.FrameRateExtD; pEventData->FrameRateExtN = surface_out->Info.FrameRateExtN; pEventData->FrameOrder = surface_out->Data.FrameOrder; pEventData->PicStruct = surface_out->Info.PicStruct; pEventData->DataFlag = surface_out->Data.DataFlag; pEventData->TimeStamp = (uint32_t)surface_out->Data.TimeStamp; } void EventH264DecodePicparam( EVENTDATA_PICTUREPARAM_AVC* pEventData, VAPictureParameterBufferH264* pPicParams_H264) { pEventData->CurrPic.picture_id = pPicParams_H264->CurrPic.picture_id; pEventData->CurrPic.frame_idx = pPicParams_H264->CurrPic.frame_idx; pEventData->CurrPic.flags = pPicParams_H264->CurrPic.flags; pEventData->CurrPic.TopFieldOrderCnt = pPicParams_H264->CurrPic.TopFieldOrderCnt; pEventData->CurrPic.BottomFieldOrderCnt = pPicParams_H264->CurrPic.BottomFieldOrderCnt; pEventData->picture_width_in_mbs_minus1 = pPicParams_H264->picture_width_in_mbs_minus1; pEventData->bit_depth_luma_minus8 = pPicParams_H264->bit_depth_luma_minus8; pEventData->bit_depth_chroma_minus8 = pPicParams_H264->bit_depth_chroma_minus8; pEventData->num_ref_frames = pPicParams_H264->num_ref_frames; pEventData->chroma_format_idc = pPicParams_H264->seq_fields.bits.chroma_format_idc; pEventData->residual_colour_transform_flag = pPicParams_H264->seq_fields.bits.residual_colour_transform_flag; pEventData->frame_mbs_only_flag = pPicParams_H264->seq_fields.bits.frame_mbs_only_flag; pEventData->mb_adaptive_frame_field_flag = pPicParams_H264->seq_fields.bits.mb_adaptive_frame_field_flag; pEventData->direct_8x8_inference_flag = pPicParams_H264->seq_fields.bits.direct_8x8_inference_flag; pEventData->MinLumaBiPredSize8x8 = pPicParams_H264->seq_fields.bits.MinLumaBiPredSize8x8; pEventData->log2_max_frame_num_minus4 = pPicParams_H264->seq_fields.bits.log2_max_frame_num_minus4; pEventData->pic_order_cnt_type = pPicParams_H264->seq_fields.bits.pic_order_cnt_type; pEventData->log2_max_pic_order_cnt_lsb_minus4 = pPicParams_H264->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4; pEventData->delta_pic_order_always_zero_flag = pPicParams_H264->seq_fields.bits.delta_pic_order_always_zero_flag; pEventData->pic_init_qp_minus26 = pPicParams_H264->pic_init_qp_minus26; pEventData->pic_init_qs_minus26 = pPicParams_H264->pic_init_qs_minus26; pEventData->chroma_qp_index_offset = pPicParams_H264->chroma_qp_index_offset; pEventData->second_chroma_qp_index_offset = pPicParams_H264->second_chroma_qp_index_offset; pEventData->entropy_coding_mode_flag = pPicParams_H264->pic_fields.bits.entropy_coding_mode_flag; pEventData->weighted_pred_flag = pPicParams_H264->pic_fields.bits.weighted_pred_flag; pEventData->weighted_bipred_idc = pPicParams_H264->pic_fields.bits.weighted_bipred_idc; pEventData->transform_8x8_mode_flag = pPicParams_H264->pic_fields.bits.transform_8x8_mode_flag; pEventData->field_pic_flag = pPicParams_H264->pic_fields.bits.field_pic_flag; pEventData->constrained_intra_pred_flag = pPicParams_H264->pic_fields.bits.constrained_intra_pred_flag; pEventData->pic_order_present_flag = pPicParams_H264->pic_fields.bits.pic_order_present_flag; pEventData->deblocking_filter_control_present_flag = pPicParams_H264->pic_fields.bits.deblocking_filter_control_present_flag; pEventData->redundant_pic_cnt_present_flag = pPicParams_H264->pic_fields.bits.redundant_pic_cnt_present_flag; pEventData->reference_pic_flag = pPicParams_H264->pic_fields.bits.reference_pic_flag; pEventData->frame_num = pPicParams_H264->frame_num; for (uint32_t i = 0; i < 16; i++) { pEventData->ReferenceFrames[i].picture_id = pPicParams_H264->ReferenceFrames[i].picture_id; pEventData->ReferenceFrames[i].frame_idx = pPicParams_H264->ReferenceFrames[i].frame_idx; pEventData->ReferenceFrames[i].flags = pPicParams_H264->ReferenceFrames[i].flags; pEventData->ReferenceFrames[i].TopFieldOrderCnt = pPicParams_H264->ReferenceFrames[i].TopFieldOrderCnt; pEventData->ReferenceFrames[i].BottomFieldOrderCnt = pPicParams_H264->ReferenceFrames[i].BottomFieldOrderCnt; } } void EventH264DecodeSliceParam( EVENTDATA_SLICEPARAM_AVC* pEventData, VASliceParameterBufferH264* SliceParam) { pEventData->slice_data_flag = SliceParam->slice_data_flag; pEventData->slice_data_size = SliceParam->slice_data_size; pEventData->slice_data_offset = SliceParam->slice_data_offset; pEventData->slice_data_bit_offset = SliceParam->slice_data_bit_offset; pEventData->first_mb_in_slice = SliceParam->first_mb_in_slice; pEventData->slice_type = SliceParam->slice_type; pEventData->direct_spatial_mv_pred_flag = SliceParam->direct_spatial_mv_pred_flag; pEventData->cabac_init_idc = SliceParam->cabac_init_idc; pEventData->slice_qp_delta = SliceParam->slice_qp_delta; pEventData->disable_deblocking_filter_idc = SliceParam->disable_deblocking_filter_idc; pEventData->luma_log2_weight_denom = SliceParam->luma_log2_weight_denom; pEventData->chroma_log2_weight_denom = SliceParam->chroma_log2_weight_denom; pEventData->num_ref_idx_l0_active_minus1 = SliceParam->num_ref_idx_l0_active_minus1; pEventData->num_ref_idx_l1_active_minus1 = SliceParam->num_ref_idx_l1_active_minus1; pEventData->slice_alpha_c0_offset_div2 = SliceParam->slice_alpha_c0_offset_div2; pEventData->slice_beta_offset_div2 = SliceParam->slice_beta_offset_div2; for (uint32_t i = 0; i < 32; i++) { pEventData->luma_weight_l0[i] = SliceParam->luma_weight_l0[i]; pEventData->luma_offset_l0[i] = SliceParam->luma_offset_l0[i]; } for (uint32_t i = 0; i < 32; i++) { pEventData->luma_weight_l1[i] = SliceParam->luma_weight_l1[i]; pEventData->luma_offset_l1[i] = SliceParam->luma_offset_l1[i]; } for (uint32_t i = 0; i < 32; i++) { pEventData->chroma_weight_l0[i][0] = SliceParam->chroma_weight_l0[i][0]; pEventData->chroma_weight_l0[i][1] = SliceParam->chroma_weight_l0[i][1]; pEventData->chroma_offset_l0[i][0] = SliceParam->chroma_offset_l0[i][0]; pEventData->chroma_offset_l0[i][1] = SliceParam->chroma_offset_l0[i][1]; } for (uint32_t i = 0; i < 32; i++) { pEventData->chroma_weight_l1[i][0] = SliceParam->chroma_weight_l1[i][0]; pEventData->chroma_weight_l1[i][1] = SliceParam->chroma_weight_l1[i][1]; pEventData->chroma_offset_l1[i][0] = SliceParam->chroma_offset_l1[i][0]; pEventData->chroma_offset_l1[i][1] = SliceParam->chroma_offset_l1[i][1]; } for (uint32_t i = 0; i < 32; i++) { pEventData->RefPicList0[i].picture_id = SliceParam->RefPicList0[i].picture_id; pEventData->RefPicList0[i].frame_idx = SliceParam->RefPicList0[i].frame_idx; pEventData->RefPicList0[i].flags = SliceParam->RefPicList0[i].flags; pEventData->RefPicList0[i].TopFieldOrderCnt = SliceParam->RefPicList0[i].TopFieldOrderCnt; pEventData->RefPicList0[i].BottomFieldOrderCnt = SliceParam->RefPicList0[i].BottomFieldOrderCnt; pEventData->RefPicList1[i].picture_id = SliceParam->RefPicList1[i].picture_id; pEventData->RefPicList1[i].frame_idx = SliceParam->RefPicList1[i].frame_idx; pEventData->RefPicList1[i].flags = SliceParam->RefPicList1[i].flags; pEventData->RefPicList1[i].TopFieldOrderCnt = SliceParam->RefPicList1[i].TopFieldOrderCnt; pEventData->RefPicList1[i].BottomFieldOrderCnt = SliceParam->RefPicList1[i].BottomFieldOrderCnt; } } void EventH264DecodeQmatrixParam( EVENTDATA_QMATRIX_H264D* pEventData, VAIQMatrixBufferH264* pQmatrix_H264) { for (uint32_t i = 0; i < 6; i++) { for (uint32_t j = 0; j < 16; j++) pEventData->bScalingLists4x4[i][j] = pQmatrix_H264->ScalingList4x4[i][j]; } for (uint32_t i = 0; i < 2; i++) { for (uint32_t j = 0; j < 64; j++) pEventData->bScalingLists8x8[i][j] = pQmatrix_H264->ScalingList8x8[i][j]; } } void EventH264DecodeDpbInfo( EVENTDATA_DPBINFO_H264D* pEventData, UMC::H264DBPList* pDPBList) { int32_t j = 0; int32_t dpbSize = pDPBList->GetDPBSize(); int32_t start = j; for (UMC::H264DecoderFrame* pFrm = pDPBList->head(); pFrm && (j < dpbSize + start); pFrm = pFrm->future()) { pEventData->DpbInfo[j].PicOrderCnt[0] = pFrm->m_PicOrderCnt[0]; pEventData->DpbInfo[j].PicOrderCnt[1] = pFrm->m_PicOrderCnt[1]; pEventData->DpbInfo[j].FrameId = pFrm->GetFrameData()->GetFrameMID(); pEventData->DpbInfo[j].isShortTermRef = pFrm->isShortTermRef(); pEventData->DpbInfo[j].isLongTermRef = pFrm->isLongTermRef(); pEventData->DpbInfo[j].refCounter = pFrm->GetRefCounter(); j++; } pEventData->eventCount = j; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_unified_h265d_logging.cpp000066400000000000000000000334761443134507600327260ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_unified_h265d_logging.h" void EventH265DecodeSurfaceOutparam( EVENTDATA_SURFACEOUT_H265D* pEventData, mfxFrameSurface1* surface_out) { pEventData->CropH = surface_out->Info.CropH; pEventData->CropW = surface_out->Info.CropW; pEventData->CropX = surface_out->Info.CropX; pEventData->CropY = surface_out->Info.CropY; pEventData->ChromaFormat = surface_out->Info.ChromaFormat; pEventData->AspectRatioH = surface_out->Info.AspectRatioH; pEventData->AspectRatioW = surface_out->Info.AspectRatioW; pEventData->FrameRateExtD = surface_out->Info.FrameRateExtD; pEventData->FrameRateExtN = surface_out->Info.FrameRateExtN; pEventData->PicStruct = surface_out->Info.PicStruct; pEventData->FrameOrder = surface_out->Data.FrameOrder; pEventData->DataFlag = surface_out->Data.DataFlag; pEventData->TimeStamp = (uint32_t)surface_out->Data.TimeStamp; } void EventH265DecodePicparam( EVENTDATA_PICTUREPARAM_HEVC* pEventData, VAPictureParameterBufferHEVC* pPicParam) { pEventData->CurrPic.picture_id = pPicParam->CurrPic.picture_id; pEventData->CurrPic.pic_order_cnt = pPicParam->CurrPic.pic_order_cnt; pEventData->CurrPic.flags = pPicParam->CurrPic.flags; for (uint32_t i = 0; i < 15; i++) { pEventData->ReferenceFrames[i].picture_id = pPicParam->ReferenceFrames[i].picture_id; pEventData->ReferenceFrames[i].pic_order_cnt = pPicParam->ReferenceFrames[i].pic_order_cnt; pEventData->ReferenceFrames[i].flags = pPicParam->ReferenceFrames[i].flags; } pEventData->pic_width_in_luma_samples = pPicParam->pic_width_in_luma_samples; pEventData->pic_height_in_luma_samples = pPicParam->pic_height_in_luma_samples; pEventData->chroma_format_idc = pPicParam->pic_fields.bits.chroma_format_idc; pEventData->separate_colour_plane_flag = pPicParam->pic_fields.bits.separate_colour_plane_flag; pEventData->pcm_enabled_flag = pPicParam->pic_fields.bits.pcm_enabled_flag; pEventData->scaling_list_enabled_flag = pPicParam->pic_fields.bits.scaling_list_enabled_flag; pEventData->transform_skip_enabled_flag = pPicParam->pic_fields.bits.transform_skip_enabled_flag; pEventData->amp_enabled_flag = pPicParam->pic_fields.bits.amp_enabled_flag; pEventData->strong_intra_smoothing_enabled_flag = pPicParam->pic_fields.bits.strong_intra_smoothing_enabled_flag; pEventData->sign_data_hiding_enabled_flag = pPicParam->pic_fields.bits.sign_data_hiding_enabled_flag; pEventData->constrained_intra_pred_flag = pPicParam->pic_fields.bits.constrained_intra_pred_flag; pEventData->cu_qp_delta_enabled_flag = pPicParam->pic_fields.bits.cu_qp_delta_enabled_flag; pEventData->weighted_pred_flag = pPicParam->pic_fields.bits.weighted_pred_flag; pEventData->weighted_bipred_flag = pPicParam->pic_fields.bits.weighted_bipred_flag; pEventData->transquant_bypass_enabled_flag = pPicParam->pic_fields.bits.transquant_bypass_enabled_flag; pEventData->tiles_enabled_flag = pPicParam->pic_fields.bits.tiles_enabled_flag; pEventData->entropy_coding_sync_enabled_flag = pPicParam->pic_fields.bits.entropy_coding_sync_enabled_flag; pEventData->pps_loop_filter_across_slices_enabled_flag = pPicParam->pic_fields.bits.pps_loop_filter_across_slices_enabled_flag; pEventData->loop_filter_across_tiles_enabled_flag = pPicParam->pic_fields.bits.loop_filter_across_tiles_enabled_flag; pEventData->pcm_loop_filter_disabled_flag = pPicParam->pic_fields.bits.pcm_loop_filter_disabled_flag; pEventData->NoPicReorderingFlag = pPicParam->pic_fields.bits.NoPicReorderingFlag; pEventData->NoBiPredFlag = pPicParam->pic_fields.bits.NoBiPredFlag; pEventData->sps_max_dec_pic_buffering_minus1 = pPicParam->sps_max_dec_pic_buffering_minus1; pEventData->bit_depth_luma_minus8 = pPicParam->bit_depth_luma_minus8; pEventData->bit_depth_chroma_minus8 = pPicParam->bit_depth_chroma_minus8; pEventData->pcm_sample_bit_depth_luma_minus1 = pPicParam->pcm_sample_bit_depth_luma_minus1; pEventData->pcm_sample_bit_depth_chroma_minus1 = pPicParam->pcm_sample_bit_depth_chroma_minus1; pEventData->log2_min_luma_coding_block_size_minus3 = pPicParam->log2_min_luma_coding_block_size_minus3; pEventData->log2_diff_max_min_luma_coding_block_size = pPicParam->log2_diff_max_min_luma_coding_block_size; pEventData->log2_min_transform_block_size_minus2 = pPicParam->log2_min_transform_block_size_minus2; pEventData->log2_diff_max_min_transform_block_size = pPicParam->log2_diff_max_min_transform_block_size; pEventData->log2_min_pcm_luma_coding_block_size_minus3 = pPicParam->log2_min_pcm_luma_coding_block_size_minus3; pEventData->log2_diff_max_min_pcm_luma_coding_block_size = pPicParam->log2_diff_max_min_pcm_luma_coding_block_size; pEventData->max_transform_hierarchy_depth_intra = pPicParam->max_transform_hierarchy_depth_intra; pEventData->max_transform_hierarchy_depth_inter = pPicParam->max_transform_hierarchy_depth_inter; pEventData->init_qp_minus26 = pPicParam->init_qp_minus26; pEventData->diff_cu_qp_delta_depth = pPicParam->diff_cu_qp_delta_depth; pEventData->pps_cb_qp_offset = pPicParam->pps_cb_qp_offset; pEventData->pps_cr_qp_offset = pPicParam->pps_cr_qp_offset; pEventData->log2_parallel_merge_level_minus2 = pPicParam->log2_parallel_merge_level_minus2; pEventData->num_tile_columns_minus1 = pPicParam->num_tile_columns_minus1; pEventData->num_tile_rows_minus1 = pPicParam->num_tile_rows_minus1; for (uint32_t i = 0; i < 19; i++) { pEventData->column_width_minus1[i] = pPicParam->column_width_minus1[i]; } for (uint32_t i = 0; i < 21; i++) { pEventData->row_height_minus1[i] = pPicParam->row_height_minus1[i]; } pEventData->lists_modification_present_flag = pPicParam->slice_parsing_fields.bits.lists_modification_present_flag; pEventData->long_term_ref_pics_present_flag = pPicParam->slice_parsing_fields.bits.long_term_ref_pics_present_flag; pEventData->sps_temporal_mvp_enabled_flag = pPicParam->slice_parsing_fields.bits.sps_temporal_mvp_enabled_flag; pEventData->cabac_init_present_flag = pPicParam->slice_parsing_fields.bits.cabac_init_present_flag; pEventData->output_flag_present_flag = pPicParam->slice_parsing_fields.bits.output_flag_present_flag; pEventData->dependent_slice_segments_enabled_flag = pPicParam->slice_parsing_fields.bits.dependent_slice_segments_enabled_flag; pEventData->pps_slice_chroma_qp_offsets_present_flag = pPicParam->slice_parsing_fields.bits.pps_slice_chroma_qp_offsets_present_flag; pEventData->sample_adaptive_offset_enabled_flag = pPicParam->slice_parsing_fields.bits.sample_adaptive_offset_enabled_flag; pEventData->deblocking_filter_override_enabled_flag = pPicParam->slice_parsing_fields.bits.deblocking_filter_override_enabled_flag; pEventData->pps_disable_deblocking_filter_flag = pPicParam->slice_parsing_fields.bits.pps_disable_deblocking_filter_flag; pEventData->slice_segment_header_extension_present_flag = pPicParam->slice_parsing_fields.bits.slice_segment_header_extension_present_flag; pEventData->RapPicFlag = pPicParam->slice_parsing_fields.bits.RapPicFlag; pEventData->IdrPicFlag = pPicParam->slice_parsing_fields.bits.IdrPicFlag; pEventData->IntraPicFlag = pPicParam->slice_parsing_fields.bits.IntraPicFlag; pEventData->ReservedBits = pPicParam->slice_parsing_fields.bits.ReservedBits; pEventData->log2_max_pic_order_cnt_lsb_minus4 = pPicParam->log2_max_pic_order_cnt_lsb_minus4; pEventData->num_short_term_ref_pic_sets = pPicParam->num_short_term_ref_pic_sets; pEventData->num_long_term_ref_pic_sps = pPicParam->num_long_term_ref_pic_sps; pEventData->num_ref_idx_l0_default_active_minus1 = pPicParam->num_ref_idx_l0_default_active_minus1; pEventData->num_ref_idx_l1_default_active_minus1 = pPicParam->num_ref_idx_l1_default_active_minus1; pEventData->pps_beta_offset_div2 = pPicParam->pps_beta_offset_div2; pEventData->pps_tc_offset_div2 = pPicParam->pps_tc_offset_div2; pEventData->num_extra_slice_header_bits = pPicParam->num_extra_slice_header_bits; pEventData->st_rps_bits = pPicParam->st_rps_bits; } void EventH265DecodeSliceparam( EVENTDATA_SLICEPARAM_HEVC* pEventData, VASliceParameterBufferHEVC* sliceHdr) { pEventData->slice_data_byte_offset = sliceHdr->slice_data_byte_offset; pEventData->slice_segment_address = sliceHdr->slice_segment_address; for (uint32_t i = 0; i < 2; i++) { for (uint32_t j = 0; j < 15; j++) { pEventData->RefPicList[i][j] = sliceHdr->RefPicList[i][j]; } } pEventData->LastSliceOfPic = sliceHdr->LongSliceFlags.fields.LastSliceOfPic; pEventData->dependent_slice_segment_flag = sliceHdr->LongSliceFlags.fields.dependent_slice_segment_flag; pEventData->slice_type = sliceHdr->LongSliceFlags.fields.slice_type; pEventData->color_plane_id = sliceHdr->LongSliceFlags.fields.color_plane_id; pEventData->slice_sao_luma_flag = sliceHdr->LongSliceFlags.fields.slice_sao_luma_flag; pEventData->slice_sao_chroma_flag = sliceHdr->LongSliceFlags.fields.slice_sao_chroma_flag; pEventData->mvd_l1_zero_flag = sliceHdr->LongSliceFlags.fields.mvd_l1_zero_flag; pEventData->cabac_init_flag = sliceHdr->LongSliceFlags.fields.cabac_init_flag; pEventData->slice_temporal_mvp_enabled_flag = sliceHdr->LongSliceFlags.fields.slice_temporal_mvp_enabled_flag; pEventData->slice_deblocking_filter_disabled_flag = sliceHdr->LongSliceFlags.fields.slice_deblocking_filter_disabled_flag; pEventData->collocated_from_l0_flag = sliceHdr->LongSliceFlags.fields.collocated_from_l0_flag; pEventData->slice_loop_filter_across_slices_enabled_flag = sliceHdr->LongSliceFlags.fields.slice_loop_filter_across_slices_enabled_flag; pEventData->collocated_ref_idx = sliceHdr->collocated_ref_idx; pEventData->num_ref_idx_l0_active_minus1 = sliceHdr->num_ref_idx_l0_active_minus1; pEventData->num_ref_idx_l1_active_minus1 = sliceHdr->num_ref_idx_l1_active_minus1; pEventData->slice_qp_delta = sliceHdr->slice_qp_delta; pEventData->slice_cb_qp_offset = sliceHdr->slice_cb_qp_offset; pEventData->slice_cr_qp_offset = sliceHdr->slice_cr_qp_offset; pEventData->slice_beta_offset_div2 = sliceHdr->slice_beta_offset_div2; pEventData->slice_tc_offset_div2 = sliceHdr->slice_tc_offset_div2; pEventData->luma_log2_weight_denom = sliceHdr->luma_log2_weight_denom; pEventData->delta_chroma_log2_weight_denom = sliceHdr->delta_chroma_log2_weight_denom; for (uint32_t i = 0; i < 15; i++) { pEventData->luma_offset_l0[i] = sliceHdr->luma_offset_l0[i]; pEventData->delta_luma_weight_l0[i] = sliceHdr->delta_luma_weight_l0[i]; } for (uint32_t i = 0; i < 15; i++) { for (uint32_t j = 0; j < 2; j++) { pEventData->delta_chroma_weight_l0[i][j] = sliceHdr->delta_chroma_weight_l0[i][j]; pEventData->ChromaOffsetL0[i][j] = sliceHdr->ChromaOffsetL0[i][j]; } } for (uint32_t i = 0; i < 15; i++) { pEventData->luma_offset_l1[i] = sliceHdr->luma_offset_l1[i]; pEventData->delta_luma_weight_l1[i] = sliceHdr->delta_luma_weight_l1[i]; } for (uint32_t i = 0; i < 15; i++) { for (uint32_t j = 0; j < 2; j++) { pEventData->delta_chroma_weight_l1[i][j] = sliceHdr->delta_chroma_weight_l1[i][j]; pEventData->ChromaOffsetL1[i][j] = sliceHdr->ChromaOffsetL1[i][j]; } } pEventData->five_minus_max_num_merge_cand = sliceHdr->five_minus_max_num_merge_cand; } void EventH265DecodeQmatrixParam( EVENTDATA_Qmatrix_HEVC* pEventData, VAIQMatrixBufferHEVC* qmatrix) { for (uint32_t i = 0; i < 6; i++) { for (uint32_t j = 0; j < 16; j++) { pEventData->ScalingList4x4[i][j] = qmatrix->ScalingList4x4[i][j]; } for (uint32_t j = 0; j < 64; j++) { pEventData->ScalingList8x8[i][j] = qmatrix->ScalingList8x8[i][j]; pEventData->ScalingList16x16[i][j] = qmatrix->ScalingList16x16[i][j]; } pEventData->ScalingListDC16x16[i] = qmatrix->ScalingListDC16x16[i]; } for (uint32_t i = 0; i < 2; i++) { for (uint32_t j = 0; j < 64; j++) pEventData->ScalingList32x32[i][j] = qmatrix->ScalingList32x32[i][j]; pEventData->ScalingListDC32x32[i] = qmatrix->ScalingListDC32x32[i]; } } void EventH265DecodeDpbInfo( EVENTDATA_DPBINFO_HEVC* pEventData, VAPictureParameterBufferHEVC* pPicParam) { uint32_t count = 0; for (uint32_t i = 0; i < 15; i++) { pEventData->ReferenceFrames[i].picture_id = pPicParam->ReferenceFrames[i].picture_id; pEventData->ReferenceFrames[i].pic_order_cnt = pPicParam->ReferenceFrames[i].pic_order_cnt; pEventData->ReferenceFrames[i].flags = pPicParam->ReferenceFrames[i].flags; count++; } pEventData->count = count; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_unified_vp9d_logging.cpp000066400000000000000000000152401443134507600327450ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_unified_vp9d_logging.h" void EventVP9DecodeSurfaceOutparam( EVENTDATA_SURFACEOUT_VP9D* pEventData, mfxFrameSurface1** surface_out) { pEventData->CropH = (*surface_out)->Info.CropH; pEventData->CropW = (*surface_out)->Info.CropW; pEventData->CropX = (*surface_out)->Info.CropX; pEventData->CropY = (*surface_out)->Info.CropY; pEventData->ChromaFormat = (*surface_out)->Info.ChromaFormat; pEventData->AspectRatioH = (*surface_out)->Info.AspectRatioH; pEventData->AspectRatioW = (*surface_out)->Info.AspectRatioW; pEventData->FrameRateExtD = (*surface_out)->Info.FrameRateExtD; pEventData->FrameRateExtN = (*surface_out)->Info.FrameRateExtN; pEventData->PicStruct = (*surface_out)->Info.PicStruct; pEventData->DataFlag = (*surface_out)->Data.DataFlag; pEventData->FrameOrder = (*surface_out)->Data.FrameOrder; pEventData->TimeStamp = (uint32_t)(*surface_out)->Data.TimeStamp; } void EventVP9DecodePicparam( EVENTDATA_PICTUREPARAM_VP9* pEventData, VADecPictureParameterBufferVP9* picParam) { pEventData->frame_width = picParam->frame_width; pEventData->frame_height = picParam->frame_height; for (uint32_t i = 0; i < 8; i++) pEventData->reference_frames[i] = picParam->reference_frames[i]; pEventData->subsampling_x = picParam->pic_fields.bits.subsampling_x; pEventData->subsampling_y = picParam->pic_fields.bits.subsampling_y; pEventData->frame_type = picParam->pic_fields.bits.frame_type; pEventData->show_frame = picParam->pic_fields.bits.show_frame; pEventData->error_resilient_mode = picParam->pic_fields.bits.error_resilient_mode; pEventData->intra_only = picParam->pic_fields.bits.intra_only; pEventData->allow_high_precision_mv = picParam->pic_fields.bits.allow_high_precision_mv; pEventData->mcomp_filter_type = picParam->pic_fields.bits.mcomp_filter_type; pEventData->frame_parallel_decoding_mode = picParam->pic_fields.bits.frame_parallel_decoding_mode; pEventData->reset_frame_context = picParam->pic_fields.bits.reset_frame_context; pEventData->refresh_frame_context = picParam->pic_fields.bits.refresh_frame_context; pEventData->frame_context_idx = picParam->pic_fields.bits.frame_context_idx; pEventData->segmentation_enabled = picParam->pic_fields.bits.segmentation_enabled; pEventData->segmentation_temporal_update = picParam->pic_fields.bits.segmentation_temporal_update; pEventData->segmentation_update_map = picParam->pic_fields.bits.segmentation_update_map; pEventData->last_ref_frame = picParam->pic_fields.bits.last_ref_frame; pEventData->last_ref_frame_sign_bias = picParam->pic_fields.bits.last_ref_frame_sign_bias; pEventData->golden_ref_frame = picParam->pic_fields.bits.golden_ref_frame; pEventData->golden_ref_frame_sign_bias = picParam->pic_fields.bits.golden_ref_frame_sign_bias; pEventData->alt_ref_frame = picParam->pic_fields.bits.alt_ref_frame; pEventData->alt_ref_frame_sign_bias = picParam->pic_fields.bits.alt_ref_frame_sign_bias; pEventData->lossless_flag = picParam->pic_fields.bits.lossless_flag; pEventData->filter_level = picParam->filter_level; pEventData->sharpness_level = picParam->sharpness_level; pEventData->log2_tile_rows = picParam->log2_tile_rows; pEventData->log2_tile_columns = picParam->log2_tile_columns; pEventData->frame_header_length_in_bytes = picParam->frame_header_length_in_bytes; pEventData->first_partition_size = picParam->first_partition_size; for (uint32_t i = 0; i < 7; i++) pEventData->mb_segment_tree_probs[i] = picParam->mb_segment_tree_probs[i]; for (uint32_t i = 0; i < 3; i++) pEventData->segment_pred_probs[i] = picParam->segment_pred_probs[i]; pEventData->profile = picParam->profile; pEventData->bit_depth = picParam->bit_depth; } void EventVP9DecodeSegmentParam( EVENTDATA_SLICEPARAM_VP9* pEventData, VASliceParameterBufferVP9* sliceParam) { pEventData->slice_data_size = sliceParam->slice_data_size; pEventData->slice_data_offset = sliceParam->slice_data_offset; pEventData->slice_data_flag = sliceParam->slice_data_flag; for (uint32_t i = 0; i < 8; i++) { pEventData->seg_param[i].segment_reference_enabled = sliceParam->seg_param[i].segment_flags.fields.segment_reference_enabled; pEventData->seg_param[i].segment_reference = sliceParam->seg_param[i].segment_flags.fields.segment_reference; pEventData->seg_param[i].segment_reference_skipped = sliceParam->seg_param[i].segment_flags.fields.segment_reference_skipped; for (uint32_t j = 0; j < 4; j++) { pEventData->seg_param[i].filter_level[j][0] = sliceParam->seg_param[i].filter_level[j][0]; pEventData->seg_param[i].filter_level[j][1] = sliceParam->seg_param[i].filter_level[j][1]; } pEventData->seg_param[i].luma_ac_quant_scale = sliceParam->seg_param[i].luma_ac_quant_scale; pEventData->seg_param[i].luma_dc_quant_scale = sliceParam->seg_param[i].luma_dc_quant_scale; pEventData->seg_param[i].chroma_ac_quant_scale = sliceParam->seg_param[i].chroma_ac_quant_scale; pEventData->seg_param[i].chroma_dc_quant_scale = sliceParam->seg_param[i].chroma_dc_quant_scale; } } void EventVP9DecodeDpbInfo( EVENTDATA_DPBINFO_VP9D* pEventData, std::vector m_submittedFrames) { pEventData->eventCount = m_submittedFrames.size(); for (uint32_t i = 0; i < m_submittedFrames.size(); i++) { pEventData->DpbInfo[i].FrameId = m_submittedFrames[i].currFrame; pEventData->DpbInfo[i].isDecoded = m_submittedFrames[i].isDecoded; } }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_utils_logging.cpp000066400000000000000000000117331443134507600315230ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_utils_logging.h" auto fileDeleter = [](FILE* file)->void { if (file) fclose(file); }; bool gMfxLogSkipped = false; mfxLogLevel gMfxLogLevel = LEVEL_WARN; std::shared_ptr gMfxLogFile = {}; std::mutex gMfxLogMutex = {}; std::shared_ptr gMfxAPIDumpFile = {}; #define DEFINE_ERR_CODE(code)\ {code, #code} static const std::map StringsOfStatus = { DEFINE_ERR_CODE(MFX_ERR_NONE ), DEFINE_ERR_CODE(MFX_ERR_UNKNOWN ), DEFINE_ERR_CODE(MFX_ERR_NULL_PTR ), DEFINE_ERR_CODE(MFX_ERR_UNSUPPORTED ), DEFINE_ERR_CODE(MFX_ERR_MEMORY_ALLOC ), DEFINE_ERR_CODE(MFX_ERR_NOT_ENOUGH_BUFFER ), DEFINE_ERR_CODE(MFX_ERR_INVALID_HANDLE ), DEFINE_ERR_CODE(MFX_ERR_LOCK_MEMORY ), DEFINE_ERR_CODE(MFX_ERR_NOT_INITIALIZED ), DEFINE_ERR_CODE(MFX_ERR_NOT_FOUND ), DEFINE_ERR_CODE(MFX_ERR_MORE_DATA ), DEFINE_ERR_CODE(MFX_ERR_MORE_SURFACE ), DEFINE_ERR_CODE(MFX_ERR_ABORTED ), DEFINE_ERR_CODE(MFX_ERR_DEVICE_LOST ), DEFINE_ERR_CODE(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM), DEFINE_ERR_CODE(MFX_ERR_INVALID_VIDEO_PARAM ), DEFINE_ERR_CODE(MFX_ERR_UNDEFINED_BEHAVIOR ), DEFINE_ERR_CODE(MFX_ERR_DEVICE_FAILED ), DEFINE_ERR_CODE(MFX_ERR_MORE_BITSTREAM ), DEFINE_ERR_CODE(MFX_ERR_GPU_HANG ), DEFINE_ERR_CODE(MFX_ERR_REALLOC_SURFACE ), DEFINE_ERR_CODE(MFX_ERR_RESOURCE_MAPPED ), DEFINE_ERR_CODE(MFX_ERR_NOT_IMPLEMENTED ), DEFINE_ERR_CODE(MFX_WRN_IN_EXECUTION ), DEFINE_ERR_CODE(MFX_WRN_DEVICE_BUSY ), DEFINE_ERR_CODE(MFX_WRN_VIDEO_PARAM_CHANGED ), DEFINE_ERR_CODE(MFX_WRN_PARTIAL_ACCELERATION ), DEFINE_ERR_CODE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM), DEFINE_ERR_CODE(MFX_WRN_VALUE_NOT_CHANGED ), DEFINE_ERR_CODE(MFX_WRN_OUT_OF_RANGE ), DEFINE_ERR_CODE(MFX_WRN_FILTER_SKIPPED ), DEFINE_ERR_CODE(MFX_ERR_NONE_PARTIAL_OUTPUT ), DEFINE_ERR_CODE(MFX_WRN_ALLOC_TIMEOUT_EXPIRED ), DEFINE_ERR_CODE(MFX_TASK_WORKING ), DEFINE_ERR_CODE(MFX_TASK_BUSY ), DEFINE_ERR_CODE(MFX_ERR_MORE_DATA_SUBMIT_TASK ) }; const std::string GetMFXStatusInString(mfxStatus mfxSts) { auto it = StringsOfStatus.find(mfxSts); if (it != StringsOfStatus.end()) { return it->second; } return std::to_string(mfxSts); } inline bool SetLogLevelFromEnv() { const char* logLevelChar = std::getenv("VPL_RUNTIME_LOG_LEVEL"); if (logLevelChar) { char** endPtr = nullptr; auto logLevel = std::strtol(logLevelChar, endPtr, 10); if (logLevel != LEVEL_UNKNOWN) { gMfxLogLevel = static_cast(logLevel); return true; } } return false; } inline void SetLogFileFromEnv() { const char* logFileName = std::getenv("VPL_RUNTIME_LOG_FILE"); if (logFileName && gMfxLogFile == nullptr) { gMfxLogFile = std::shared_ptr(fopen(logFileName, "a"), fileDeleter); } std::stringstream trace_name_stream; trace_name_stream << "VPL_API_LOG_THREAD_" << std::this_thread::get_id() << ".txt"; if (gMfxAPIDumpFile == nullptr) { gMfxAPIDumpFile = std::shared_ptr(fopen(trace_name_stream.str().c_str(), "a"), fileDeleter); } } void InitMfxLogging() { #if defined(MFX_ENABLE_LOG_UTILITY) std::unique_lock closeGuard(gMfxLogMutex); SetLogLevelFromEnv(); SetLogFileFromEnv(); #endif } std::unique_ptr GetMfxLogSkip() { #if defined(MFX_ENABLE_LOG_UTILITY) return std::make_unique(); #else return nullptr; #endif } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_logging/src/mfx_utils_perf.cpp000066400000000000000000000142651443134507600310340ustar00rootroot00000000000000#include "mfx_config.h" #include #include #include #include "unistd.h" #include #include "mfx_utils_perf.h" int32_t QueryPerformanceFrequency(int64_t & frequency) { struct timespec res; if ( clock_getres(CLOCK_MONOTONIC, &res) != 0 ) { return -1; } // resolution (precision) can't be in seconds for current machine and OS if (res.tv_sec != 0) { return -1; } frequency = (1000000000LL) / res.tv_nsec; return 0; } int32_t QueryPerformanceCounter(int64_t & performanceCount) { struct timespec res; struct timespec t; if ( clock_getres (CLOCK_MONOTONIC, &res) != 0 ) { return -1; } if (res.tv_sec != 0) { // resolution (precision) can't be in seconds for current machine and OS return -1; } if( clock_gettime(CLOCK_MONOTONIC, &t) != 0) { return -1; } performanceCount = (1000000000LL * t.tv_sec + t.tv_nsec) / res.tv_nsec; return 0; } int32_t MfxSecureStringPrint(char* buffer, size_t bufSize, size_t length, const char* const format, ...) { int32_t iRet = 0; va_list var_args; va_start(var_args, format); iRet = vsnprintf(buffer, bufSize, format, var_args); va_end(var_args); return iRet; } #define MFX_SecureStringPrint(buffer, bufSize, length, format, ...) \ MfxSecureStringPrint(buffer, bufSize, length, format, ##__VA_ARGS__) PerfUtility* g_perfutility = PerfUtility::getInstance(); std::shared_ptr PerfUtility::instance = nullptr; std::mutex PerfUtility::perfMutex; std::mutex AutoPerfUtility::map_guard; std::map> AutoPerfUtility::tid2taskIds; void AutoPerfUtility::SetTaskId(uint32_t id) { uint64_t tid = pthread_self(); decltype(tid2taskIds)::iterator it; if ((it = tid2taskIds.find(tid)) == tid2taskIds.end()) { std::lock_guard lg(map_guard); tid2taskIds[tid] = {}; it = tid2taskIds.find(tid); } it->second.push_back(id); } AutoPerfUtility::AutoPerfUtility(const std::string& tag, const std::string& level) { if (g_perfutility->dwPerfUtilityIsEnabled) { std::string flag = MFX_FLAG_ENTER; g_perfutility->timeStampTick(tag, level, flag, std::vector()); autotag = tag; autolevel = level; bEnable = true; if (level == PERF_LEVEL_API || level == PERF_LEVEL_ROUTINE) { bPrintTaskIds = true; } } } AutoPerfUtility::~AutoPerfUtility() { if (bEnable) { std::string flag = MFX_FLAG_EXIT; std::vector ids; uint64_t tid = pthread_self(); if (bPrintTaskIds && tid2taskIds.find(tid) != tid2taskIds.end()) { tid2taskIds[tid].swap(ids); } g_perfutility->timeStampTick(autotag, autolevel, flag, ids); } } PerfUtility* PerfUtility::getInstance() { if (instance == nullptr) { instance = std::make_shared(); } return instance.get(); } PerfUtility::PerfUtility() { int32_t dwPerfUtilityIsEnabled = 0; double timeStamp = 0; } PerfUtility::~PerfUtility() { // save perf data here if (instance->dwPerfUtilityIsEnabled) { instance->savePerfData(); } } int32_t PerfUtility::getPid() { int32_t pid = getpid(); return pid; } int32_t PerfUtility::getTid() { int32_t tid = pthread_self(); return tid; } void PerfUtility::savePerfData() { std::fstream pTimeStampFile; int32_t pid = getPid(); const char* const perf_log_path_fmt = "%s/perf_details_pid%d_tid%d.txt"; for (auto it : log_buffer) { char sDetailsFileName[MFX_MAX_PERF_FILENAME_LEN + 1] = { '\0' }; MFX_SecureStringPrint(sDetailsFileName, MFX_MAX_PATH_LENGTH + 1, MFX_MAX_PATH_LENGTH + 1, perf_log_path_fmt, perfFilePath.c_str(), pid, it.first); if (access(perfFilePath.c_str(), 0) == -1) { int folder_exist_status = mkdir(perfFilePath.c_str(), S_IRWXU); if (folder_exist_status == -1) { return; } } pTimeStampFile.open(sDetailsFileName, std::ios::app); if (pTimeStampFile.good() == false) { pTimeStampFile.close(); return; } pTimeStampFile << it.second; pTimeStampFile.close(); pTimeStampFile.clear(); } } void PerfUtility::timeStampTick(const std::string &tag, const std::string &level, const std::string &flag, const std::vector& taskIds) { Tick newTick; newTick.tag = tag; int64_t _freq = 0; QueryPerformanceFrequency(_freq); newTick.freq = _freq / 1000; // ms QueryPerformanceCounter(newTick.timestamp); newTick.functionType = flag; newTick.level = level; printPerfTimeStamp(&newTick, taskIds); } void PerfUtility::startTick(const std::string &tag) { } void PerfUtility::stopTick(const std::string &tag) { } void PerfUtility::printPerfTimeStamp(Tick *newTick, const std::vector& taskIds) { int32_t current_tid = getTid(); std::map::iterator it; it = log_buffer.find(current_tid); if (it == log_buffer.end()) { std::lock_guard lock(perfMutex); log_buffer[current_tid] = {}; it = log_buffer.find(current_tid); } if (newTick->level == PERF_LEVEL_DDI || newTick->level == PERF_LEVEL_HW) { it->second.append(" "); } else if(newTick->level == PERF_LEVEL_ROUTINE) { it->second.append(" "); } else if (newTick->level == PERF_LEVEL_INTERNAL) { log_buffer[current_tid].append(" "); } it->second.append(newTick->tag); it->second.append(newTick->functionType); it->second.append("\tTimeStamp: "); it->second.append(std::to_string(newTick->timestamp)); it->second.append("\tFreq: "); it->second.append(std::to_string(newTick->freq)); if (!taskIds.empty()) { it->second.append("\tAsync Task ID: "); for (auto id : taskIds) { it->second.append(std::to_string(id)); } } it->second.append("\n"); }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/000077500000000000000000000000001443134507600241535ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/CMakeLists.txt000066400000000000000000000016271443134507600267210ustar00rootroot00000000000000 add_library(mfx_trace STATIC) target_sources(mfx_trace PRIVATE include/mfx_trace_ftrace.h include/mfx_trace_itt.h include/mfx_trace_stat.h include/mfx_trace_textlog.h include/mfx_trace_utils.h include/sys/mfx_trace_utils_linux.h src/mfx_trace.cpp src/mfx_trace_ftrace.cpp src/mfx_trace_itt.cpp src/mfx_trace_ir.cpp src/mfx_trace_stat.cpp src/mfx_trace_textlog.cpp src/mfx_trace_utils.cpp src/mfx_trace_utils_linux.cpp src/mfx_trace_dump.cpp src/mfx_trace_dump_common.cpp src/mfx_trace_dump_structures.cpp $<$>:src/mfx_reflect.cpp> ) target_include_directories(mfx_trace PUBLIC include ${MFX_API_HOME}/mediasdk_structures ${MSDK_STUDIO_ROOT}/shared/include ) target_link_libraries(mfx_trace PUBLIC mfx_static_lib vm PRIVATE mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/IntelMediaSDK.man000066400000000000000000006026641443134507600272430ustar00rootroot00000000000000 oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/000077500000000000000000000000001443134507600255765ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/mfx_trace_ftrace.h000066400000000000000000000046641443134507600312550ustar00rootroot00000000000000// Copyright (c) 2015-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_FTRACE_LOG_H__ #define __MFX_TRACE_FTRACE_LOG_H__ #include "mfx_trace.h" #if defined(MFX_TRACE_ENABLE_FTRACE) mfxTraceU32 MFXTraceFtrace_Init(); mfxTraceU32 MFXTraceFtrace_SetLevel(mfxTraceChar* category, mfxTraceLevel level); mfxTraceU32 MFXTraceFtrace_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); mfxTraceU32 MFXTraceFtrace_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); mfxTraceU32 MFXTraceFtrace_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); mfxTraceU32 MFXTraceFtrace_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); mfxTraceU32 MFXTraceFtrace_Close(void); #endif // defined(MFX_TRACE_ENABLE_FTRACE) #endif // #ifndef __MFX_TRACE_FTRACE_LOG_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/mfx_trace_itt.h000066400000000000000000000071751443134507600306110ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_ITT_LOG_H__ #define __MFX_TRACE_ITT_LOG_H__ #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE_ITT /*------------------------------------------------------------------------------*/ /* // trace registry options and parameters #define MFX_TRACE_TEXTLOG_REG_FILE_NAME MFX_TRACE_STRING("TextLog") #define MFX_TRACE_TEXTLOG_REG_SUPPRESS MFX_TRACE_STRING("TextLogSuppress") #define MFX_TRACE_TEXTLOG_REG_PERMIT MFX_TRACE_STRING("TextLogPermit") // defines suppresses of the output (where applicable) enum { MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME = 0x01, MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM = 0x02, MFX_TRACE_TEXTLOG_SUPPRESS_CATEGORY = 0x04, MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL = 0x08, MFX_TRACE_TEXTLOG_SUPPRESS_FUNCTION_NAME = 0x10 }; */ /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_Init(); mfxTraceU32 MFXTraceITT_SetLevel(mfxTraceChar* category, mfxTraceLevel level); mfxTraceU32 MFXTraceITT_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); mfxTraceU32 MFXTraceITT_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); mfxTraceU32 MFXTraceITT_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); mfxTraceU32 MFXTraceITT_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); mfxTraceU32 MFXTraceITT_Close(void); #endif // #ifdef MFX_TRACE_ENABLE_TEXTLOG #endif // #ifndef __MFX_TRACE_ITT_LOG_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/mfx_trace_stat.h000066400000000000000000000070211443134507600307520ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_STAT_H__ #define __MFX_TRACE_STAT_H__ #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE_STAT /*------------------------------------------------------------------------------*/ // trace registry options and parameters #define MFX_TRACE_STAT_REG_FILE_NAME MFX_TRACE_STRING("Statistic") #define MFX_TRACE_STAT_REG_SUPPRESS MFX_TRACE_STRING("StatisticSuppress") #define MFX_TRACE_STAT_REG_PERMIT MFX_TRACE_STRING("StatisticPermit") // defines suppresses of the output (where applicable) enum { MFX_TRACE_STAT_SUPPRESS_FILE_NAME = 0x01, MFX_TRACE_STAT_SUPPRESS_LINE_NUM = 0x02, MFX_TRACE_STAT_SUPPRESS_CATEGORY = 0x04, MFX_TRACE_STAT_SUPPRESS_LEVEL = 0x08 }; /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_Init(); mfxTraceU32 MFXTraceStat_SetLevel(mfxTraceChar* category, mfxTraceLevel level); mfxTraceU32 MFXTraceStat_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); mfxTraceU32 MFXTraceStat_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); mfxTraceU32 MFXTraceStat_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); mfxTraceU32 MFXTraceStat_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); mfxTraceU32 MFXTraceStat_Close(void); #endif // #ifdef MFX_TRACE_ENABLE_STAT #endif // #ifndef __MFX_TRACE_STAT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/mfx_trace_textlog.h000066400000000000000000000072311443134507600314700ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_TEXTLOG_H__ #define __MFX_TRACE_TEXTLOG_H__ #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE_TEXTLOG /*------------------------------------------------------------------------------*/ // trace registry options and parameters #define MFX_TRACE_TEXTLOG_REG_FILE_NAME MFX_TRACE_STRING("TextLog") #define MFX_TRACE_TEXTLOG_REG_SUPPRESS MFX_TRACE_STRING("TextLogSuppress") #define MFX_TRACE_TEXTLOG_REG_PERMIT MFX_TRACE_STRING("TextLogPermit") // defines suppresses of the output (where applicable) enum { MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME = 0x01, MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM = 0x02, MFX_TRACE_TEXTLOG_SUPPRESS_CATEGORY = 0x04, MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL = 0x08, MFX_TRACE_TEXTLOG_SUPPRESS_FUNCTION_NAME = 0x10 }; /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_Init(); mfxTraceU32 MFXTraceTextLog_SetLevel(mfxTraceChar* category, mfxTraceLevel level); mfxTraceU32 MFXTraceTextLog_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); mfxTraceU32 MFXTraceTextLog_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); mfxTraceU32 MFXTraceTextLog_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); mfxTraceU32 MFXTraceTextLog_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); mfxTraceU32 MFXTraceTextLog_Close(void); #endif // #ifdef MFX_TRACE_ENABLE_TEXTLOG #endif // #ifndef __MFX_TRACE_TEXTLOG_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/mfx_trace_utils.h000066400000000000000000000043161443134507600311430ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_UTILS_H__ #define __MFX_TRACE_UTILS_H__ #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE #include "sys/mfx_trace_utils_linux.h" #include #include #include // defines maximum length of output line #define MFX_TRACE_MAX_LINE_LENGTH 10240 /*------------------------------------------------------------------------------*/ struct mfxTraceCategoryItem { mfxTraceChar m_name[MAX_PATH]; mfxTraceU32 m_level; }; /*------------------------------------------------------------------------------*/ // help functions extern "C" { char* mfx_trace_vsprintf(char* str, size_t& str_size, const char* format, va_list args); char* mfx_trace_sprintf(char* str, size_t& str_size, const char* format, ...); int mfx_trace_tcmp(const mfxTraceChar* str1, const mfxTraceChar* str2); } /*------------------------------------------------------------------------------*/ // help macroses #define mfx_trace_fopen(FNAME, FMODE) fopen(FNAME, FMODE) #define mfx_trace_tfopen(FNAME, FMODE) mfx_trace_fopen(FNAME, FMODE) #endif // #ifdef MFX_TRACE_ENABLE #endif // #ifndef __MFX_TRACE_UTILS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/sys/000077500000000000000000000000001443134507600264145ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/include/sys/mfx_trace_utils_linux.h000066400000000000000000000037141443134507600332010ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_TRACE_UTILS_LINUX_H__ #define __MFX_TRACE_UTILS_LINUX_H__ #ifdef MFX_TRACE_ENABLE #include #define MFX_TRACE_CONFIG "mfx_trace" #define MFX_TRACE_CONFIG_PATH "/etc" #define MFX_TRACE_CONF_OMODE_TYPE "Output" #define MFX_TRACE_CONF_LEVEL "Level" /*------------------------------------------------------------------------------*/ extern "C" { FILE* mfx_trace_open_conf_file(const char* name); mfxTraceU32 mfx_trace_get_conf_dword(FILE* file, const char* pName, mfxTraceU32* pValue); mfxTraceU32 mfx_trace_get_conf_string(FILE* file, const char* pName, char* pValue, mfxTraceU32 cValueMaxSize); } #endif // #ifdef MFX_TRACE_ENABLE #endif // #ifndef __MFX_TRACE_UTILS_LINUX_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/000077500000000000000000000000001443134507600247425ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_reflect.cpp000066400000000000000000000512241443134507600277500ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_reflect.h" #include #include #include #include #include #include "mfxstructures.h" #include "mfxvp8.h" #include "mfxmvc.h" #if defined(MFX_ENABLE_ENCTOOLS) #include "mfxenctools.h" #endif #include "mfxbrc.h" #include "mfxdeprecated.h" #include "ts_typedef.h" #ifdef MFX_ENABLE_ENCODE_STATS #include "mfxencodestats.h" #endif #include namespace mfx_reflect { template struct mfx_ext_buffer_id { enum { id = 0 }; }; #define EXTBUF(STRUCT, ID) \ template<>struct mfx_ext_buffer_id { \ enum { id = ID }; }; #include "ts_ext_buffers_decl.h" void AccessorField::SetFieldAddress() { m_P = (*m_Iterator)->GetAddress(m_BaseStruct.m_P); char *result = (char*)m_P; result += m_pReflection->FieldType->Size * m_IndexElement; m_P = (void*)result; } AccessorField& AccessorField::operator++() { m_IndexElement = 0; m_Iterator++; if (IsValid()) { SetIterator(m_Iterator); } return *this; } bool AccessorField::IsValid() const { return m_Iterator != m_BaseStruct.m_pReflection->m_Fields.end(); } AccessorType AccessorField::AccessSubtype() const { return AccessorType(m_P, *(m_pReflection->FieldType)); } AccessorField AccessorType::AccessField(ReflectedField::FieldsCollectionCI iter) const { if (m_pReflection->m_Fields.end() != iter) { return AccessorField(*this, iter); // Address of base, not field. } else { throw std::invalid_argument(std::string("No such field")); } } AccessorField AccessorType::AccessField(const std::string& fieldName) const { ReflectedField::FieldsCollectionCI iter = m_pReflection->FindField(fieldName); return AccessField(iter); } AccessorField AccessorType::AccessFirstField() const { return AccessField(m_pReflection->m_Fields.begin()); } AccessorType AccessorType::AccessSubtype(const std::string& fieldName) const { return AccessField(fieldName).AccessSubtype(); } ReflectedType::ReflectedType(ReflectedTypesCollection *pCollection, std::type_index typeIndex, const std::string& typeName, size_t size, bool isPointer, mfxU32 extBufferId) : m_TypeIndex(typeIndex) , TypeNames(1, typeName) , Size(size) , m_pCollection(pCollection) , m_bIsPointer(isPointer) , ExtBufferId(extBufferId) { if (NULL == m_pCollection) { m_pCollection = NULL; } } ReflectedField::SP ReflectedType::AddField(std::type_index typeIndex, const std::string &typeName, size_t typeSize, bool isPointer, size_t offset, const std::string &fieldName, size_t count, mfxU32 extBufferId) { ReflectedField::SP pField; if (typeName.empty()) { throw std::invalid_argument(std::string("Unexpected behavior - typeName is empty")); } if (NULL == m_pCollection) { return pField; } else { ReflectedType* pType = m_pCollection->FindOrDeclareType(typeIndex, typeName, typeSize, isPointer, extBufferId).get(); if (pType != NULL) { StringList::iterator findIterator = std::find(pType->TypeNames.begin(), pType->TypeNames.end(), typeName); if (pType->TypeNames.end() == findIterator) { throw std::invalid_argument(std::string("Unexpected behavior - fieldTypeName is NULL")); } m_Fields.push_back(ReflectedField::SP(new ReflectedField(m_pCollection, this, pType, *findIterator, offset, fieldName, count))); //std::make_shared cannot access protected constructor pField = m_Fields.back(); } return pField; } } ReflectedField::FieldsCollectionCI ReflectedType::FindField(const std::string& fieldName) const { ReflectedField::FieldsCollectionCI iter = m_Fields.begin(); for (; iter != m_Fields.end(); ++iter) { if ((*iter)->FieldName == fieldName) { break; } } return iter; } ReflectedType::SP ReflectedTypesCollection::FindExistingByTypeInfoName(const char* name) //currenly we are not using this { for (Container::iterator iter = m_KnownTypes.begin(); iter != m_KnownTypes.end(); ++iter) { if (0 == strcmp(iter->first.name(), name)) { return iter->second; } } ReflectedType::SP pEmptyType; return pEmptyType; } ReflectedType::SP ReflectedTypesCollection::FindExistingType(std::type_index typeIndex) { Container::const_iterator it = m_KnownTypes.find(typeIndex); if (m_KnownTypes.end() != it) { return it->second; } ReflectedType::SP pEmptyType; return pEmptyType; } ReflectedType::SP ReflectedTypesCollection::FindExtBufferTypeById(mfxU32 ExtBufferId) //optimize with map (index -> type) { for (Container::iterator iter = m_KnownTypes.begin(); iter != m_KnownTypes.end(); ++iter) { if (ExtBufferId == iter->second->ExtBufferId) { return iter->second; } } ReflectedType::SP pEmptyExtBufferType; return pEmptyExtBufferType; } ReflectedType::SP ReflectedTypesCollection::DeclareType(std::type_index typeIndex, const std::string& typeName, size_t typeSize, bool isPointer, mfxU32 extBufferId) { if (m_KnownTypes.end() == m_KnownTypes.find(typeIndex)) { ReflectedType::SP pType; pType = std::make_shared(this, typeIndex, typeName, typeSize, isPointer, extBufferId); m_KnownTypes.insert(std::make_pair(pType->m_TypeIndex, pType)); return pType; } throw std::invalid_argument(std::string("Unexpected behavior - type is already declared")); } ReflectedType::SP ReflectedTypesCollection::FindOrDeclareType(std::type_index typeIndex, const std::string& typeName, size_t typeSize, bool isPointer, mfxU32 extBufferId) { ReflectedType::SP pType = FindExistingType(typeIndex); if (pType == NULL) { pType = DeclareType(typeIndex, typeName, typeSize, isPointer, extBufferId); } else { if (typeSize != pType->Size) { pType.reset(); } else if (!typeName.empty()) { ReflectedType::StringList::iterator findIterator = std::find(pType->TypeNames.begin(), pType->TypeNames.end(), typeName); if (pType->TypeNames.end() == findIterator) { pType->TypeNames.push_back(typeName); } } } return pType; } template bool PrintFieldIfTypeMatches(std::ostream& stream, AccessorField field) { bool bResult = false; if (field.m_pReflection->FieldType->m_TypeIndex == field.m_pReflection->m_pCollection->FindExistingType()->m_TypeIndex) { stream << field.Get(); bResult = true; } return bResult; } void PrintFieldValue(std::ostream &stream, AccessorField field) { if (field.m_pReflection->FieldType->m_bIsPointer) { stream << "0x" << field.Get(); } else { bool bPrinted = false; #define PRINT_IF_TYPE(T) if (!bPrinted) { bPrinted = PrintFieldIfTypeMatches(stream, field); } PRINT_IF_TYPE(mfxU16); PRINT_IF_TYPE(mfxI16); PRINT_IF_TYPE(mfxU32); PRINT_IF_TYPE(mfxI32); if (!bPrinted) { size_t fieldSize = field.m_pReflection->FieldType->Size; { stream << "FieldType->m_TypeIndex.name() << "\" (size = " << fieldSize << ")>"; } } } } void PrintFieldName(std::ostream &stream, AccessorField field) { stream << field.m_pReflection->FieldName; if (field.m_pReflection->Count > 1) { stream << "[" << field.GetIndexElement() << "]"; } } std::ostream& operator<< (std::ostream& stream, AccessorField field) { PrintFieldName(stream, field); stream << " = "; PrintFieldValue(stream, field); return stream; } std::ostream& operator<< (std::ostream& stream, AccessorType data) { stream << data.m_pReflection->m_TypeIndex.name() << " = {"; size_t nFields = data.m_pReflection->m_Fields.size(); for (AccessorField field = data.AccessFirstField(); field.IsValid(); ++field) { if (nFields > 1) { stream << std::endl; } stream << "\t" << field; } stream << "}"; return stream; } TypeComparisonResultP CompareExtBufferLists(mfxExtBuffer** pExtParam1, mfxU16 numExtParam1, mfxExtBuffer** pExtParam2, mfxU16 numExtParam2, ReflectedTypesCollection* collection); AccessorTypeP GetAccessorOfExtBufferOriginalType(mfxExtBuffer& pExtInnerParam, ReflectedTypesCollection& collection); TypeComparisonResultP CompareTwoStructs(AccessorType data1, AccessorType data2) // Always return not null result { TypeComparisonResultP result = std::make_shared(); if (data1.m_pReflection != data2.m_pReflection) { throw std::invalid_argument(std::string("Types mismatch")); } mfxExtBuffer** pExtParam1 = NULL; mfxExtBuffer** pExtParam2 = NULL; mfxU16 numExtParam = 0; for (AccessorField field1 = data1.AccessFirstField(); field1.IsValid(); ++field1) { AccessorField field2 = data2.AccessField(field1.m_Iterator); if (std::type_index(typeid(mfxExtBuffer**)) == field1.m_pReflection->FieldType->m_TypeIndex) { pExtParam1 = field1.Get(); pExtParam2 = field2.Get(); } else if ((field1.m_pReflection->FieldName == "NumExtParam") && (field1.m_pReflection->FieldType->m_TypeIndex == std::type_index(typeid(mfxU16))) && (field2.m_pReflection->FieldType->m_TypeIndex == std::type_index(typeid(mfxU16)))) { if (field1.Get() == field2.Get()) { numExtParam = field1.Get(); } else { throw std::invalid_argument(std::string("NumExtParam mismatch")); } } else { for (size_t i = 0; i < field1.m_pReflection->Count; ++i) { field1.SetIndexElement(i); field2.SetIndexElement(i); AccessorType subtype1 = field1.AccessSubtype(); TypeComparisonResultP subtypeResult = NULL; if (subtype1.m_pReflection->m_Fields.size() > 0) { AccessorType subtype2 = field2.AccessSubtype(); if (subtype1.m_pReflection != subtype2.m_pReflection) { throw std::invalid_argument(std::string("Subtypes mismatch - should never happen for same types")); } subtypeResult = CompareTwoStructs(subtype1, subtype2); } if (!field1.Equal(field2)) { FieldComparisonResult fields = { field1 , field2, subtypeResult }; result->push_back(fields); } } } } if ((pExtParam1 != NULL) && (pExtParam2 != NULL) && (numExtParam > 0)) { TypeComparisonResultP extBufferCompareResult = CompareExtBufferLists(pExtParam1, numExtParam, pExtParam2, numExtParam, data1.AccessFirstField().m_pReflection->m_pCollection); if (extBufferCompareResult != NULL) { result->splice(result->end(), *extBufferCompareResult); //move elements of *extBufferCompareResult to the end of *result if (!extBufferCompareResult->extBufferIdList.empty()) { result->extBufferIdList.splice(result->extBufferIdList.end(), extBufferCompareResult->extBufferIdList); } } else { throw std::invalid_argument(std::string("Unexpected behavior - ExtBuffer comparison result is NULL")); } } return result; } AccessorTypeP GetAccessorOfExtBufferOriginalType(mfxExtBuffer& pExtBufferParam, ReflectedTypesCollection& collection) { AccessorTypeP pExtBuffer; mfxU32 id = pExtBufferParam.BufferId; if (0 != id) { ReflectedType::SP pTypeExtBuffer = collection.FindExtBufferTypeById(id); //find in KnownTypes this BufferId if (pTypeExtBuffer != NULL) { pExtBuffer = std::make_shared(&pExtBufferParam, *pTypeExtBuffer); } } return pExtBuffer; } TypeComparisonResultP CompareExtBufferLists(mfxExtBuffer** pExtParam1, mfxU16 numExtParam1, mfxExtBuffer** pExtParam2, mfxU16 numExtParam2, ReflectedTypesCollection* collection) //always return not null result { TypeComparisonResultP result = std::make_shared(); if (NULL != pExtParam1 && NULL != pExtParam2 && NULL != collection) { for (int i = 0; i < numExtParam1 && i < numExtParam2; i++) { //supported only extBuffers with same Id order if (NULL != pExtParam1[i] && NULL != pExtParam2[i]) { AccessorTypeP extBufferOriginTypeAccessor1 = GetAccessorOfExtBufferOriginalType(*pExtParam1[i], *collection); AccessorTypeP extBufferOriginTypeAccessor2 = GetAccessorOfExtBufferOriginalType(*pExtParam2[i], *collection); if (NULL != extBufferOriginTypeAccessor1 && NULL != extBufferOriginTypeAccessor2) { TypeComparisonResultP tempResult = CompareTwoStructs(*extBufferOriginTypeAccessor1, *extBufferOriginTypeAccessor2); if (NULL != tempResult) { result->splice(result->end(), *tempResult); } else { throw std::invalid_argument(std::string("Unexpected behavior - comparison result is NULL")); } } else { result->extBufferIdList.push_back(pExtParam1[i]->BufferId); } } } } return result; } void PrintStuctsComparisonResult(std::ostream& comparisonResult, const std::string& prefix, const TypeComparisonResultP& result) { for (std::list::iterator i = result->begin(); i != result->end(); ++i) { TypeComparisonResultP subtypeResult = i->subtypeComparisonResultP; ReflectedType* aggregatingType = i->accessorField1.m_pReflection->AggregatingType; std::list< std::string >::const_iterator it = aggregatingType->TypeNames.begin(); std::string strTypeName = ((it != aggregatingType->TypeNames.end()) ? *(it) : "unknown_type"); if (NULL != subtypeResult) { std::stringstream fieldName; PrintFieldName(fieldName, i->accessorField1); std::string strFieldName = fieldName.str(); std::string newprefix; newprefix = prefix.empty() ? (strTypeName + "." + strFieldName) : (prefix + "." + strFieldName); PrintStuctsComparisonResult(comparisonResult, newprefix, subtypeResult); } else { if (!prefix.empty()) { comparisonResult << prefix << "."; } else if (!strTypeName.empty()) { comparisonResult << strTypeName << "."; } comparisonResult << i->accessorField1 << " -> "; PrintFieldValue(comparisonResult, i->accessorField2); comparisonResult << std::endl; } } if (!result->extBufferIdList.empty()) { comparisonResult << "Id of unparsed ExtBuffer types: " << std::endl; while (!result->extBufferIdList.empty()) { unsigned char* FourCC = reinterpret_cast(&result->extBufferIdList.front()); comparisonResult << "0x" << std::hex << std::setfill('0') << result->extBufferIdList.front() << " \"" << FourCC[0] << FourCC[1] << FourCC[2] << FourCC[3] << "\""; result->extBufferIdList.pop_front(); if (!result->extBufferIdList.empty()) { comparisonResult << ", "; } } } } std::string CompareStructsToString(AccessorType data1, AccessorType data2) { std::ostringstream comparisonResult; if (data1.m_P == data2.m_P) { comparisonResult << "Comparing of VideoParams is unsupported: In and Out pointers are the same."; } else { comparisonResult << "Incompatible VideoParams were updated:" << std::endl; TypeComparisonResultP result = CompareTwoStructs(data1, data2); PrintStuctsComparisonResult(comparisonResult, "", result); } return comparisonResult.str(); } template ReflectedField::SP AddFieldT(ReflectedType &type, const std::string typeName, size_t offset, const std::string fieldName, size_t count) { unsigned int extBufId = 0; extBufId = mfx_ext_buffer_id::id; bool isPointer = false; isPointer = std::is_pointer(); return type.AddField(std::type_index(typeid(T)), typeName, sizeof(T), isPointer, offset, fieldName, count, extBufId); } template ReflectedType::SP DeclareTypeT(ReflectedTypesCollection& collection, const std::string typeName) { unsigned int extBufId = 0; extBufId = mfx_ext_buffer_id::id; bool isPointer = false; isPointer = std::is_pointer(); return collection.DeclareType(std::type_index(typeid(T)), typeName, sizeof(T), isPointer, extBufId); } void ReflectedTypesCollection::DeclareMsdkStructs() { #define STRUCT(TYPE, FIELDS) { \ typedef TYPE BaseType; \ ReflectedType::SP pType = DeclareTypeT(*this, #TYPE); \ FIELDS \ } #define FIELD_T(FIELD_TYPE, FIELD_NAME) \ (void)AddFieldT( \ *pType, \ #FIELD_TYPE, \ offsetof(BaseType, FIELD_NAME), \ #FIELD_NAME, \ (sizeof(((BaseType*)0)->FIELD_NAME)/sizeof(::FIELD_TYPE)) ); #define FIELD_S(FIELD_TYPE, FIELD_NAME) FIELD_T(FIELD_TYPE, FIELD_NAME) #include "ts_struct_decl.h" } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace.cpp000066400000000000000000000462461443134507600274320ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfxdefs.h" #include "mfx_trace.h" #include "mfx_utils_perf.h" static mfx_reflect::AccessibleTypesCollection g_Reflection; mfx_reflect::AccessibleTypesCollection GetReflection() { return g_Reflection; } #ifdef MFX_TRACE_ENABLE #ifdef _MSVC_LANG #pragma warning(disable: 4127) // conditional expression is constant #endif extern "C" { #include "mfx_trace_utils.h" #include "mfx_trace_textlog.h" #include "mfx_trace_stat.h" #include "mfx_trace_itt.h" #include "mfx_trace_ftrace.h" } #include #include #include "vm_interlocked.h" #include "mfx_reflect.h" /*------------------------------------------------------------------------------*/ typedef mfxTraceU32 (*MFXTrace_InitFn)(); typedef mfxTraceU32 (*MFXTrace_SetLevelFn)(mfxTraceChar* category, mfxTraceLevel level); typedef mfxTraceU32 (*MFXTrace_DebugMessageFn)(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...); typedef mfxTraceU32 (*MFXTrace_vDebugMessageFn)(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args); typedef mfxTraceU32 (*MFXTrace_BeginTaskFn)(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params); typedef mfxTraceU32 (*MFXTrace_EndTaskFn)(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle); typedef mfxTraceU32 (*MFXTrace_CloseFn)(void); struct mfxTraceAlgorithm { mfxTraceU32 m_OutputInitilized; mfxTraceU32 m_OutputMask; MFXTrace_InitFn m_InitFn; MFXTrace_SetLevelFn m_SetLevelFn; MFXTrace_DebugMessageFn m_DebugMessageFn; MFXTrace_vDebugMessageFn m_vDebugMessageFn; MFXTrace_BeginTaskFn m_BeginTaskFn; MFXTrace_EndTaskFn m_EndTaskFn; MFXTrace_CloseFn m_CloseFn; }; /*------------------------------------------------------------------------------*/ static mfxTraceU32 g_OutputMode = MFX_TRACE_OUTPUT_TRASH; static mfxTraceU32 g_Level = MFX_TRACE_LEVEL_DEFAULT; mfxTraceU64 EventCfg = 0; mfxTraceU32 LogConfig = 0; int32_t FrameIndex = -1; static volatile uint32_t g_refCounter = 0; static mfxTraceU32 g_mfxTraceCategoriesNum = 0; static mfxTraceCategoryItem* g_mfxTraceCategoriesTable = NULL; mfxTraceAlgorithm g_TraceAlgorithms[] = { #ifdef MFX_TRACE_ENABLE_TEXTLOG { 0, MFX_TRACE_OUTPUT_TEXTLOG, MFXTraceTextLog_Init, MFXTraceTextLog_SetLevel, MFXTraceTextLog_DebugMessage, MFXTraceTextLog_vDebugMessage, MFXTraceTextLog_BeginTask, MFXTraceTextLog_EndTask, MFXTraceTextLog_Close }, #endif #ifdef MFX_TRACE_ENABLE_STAT { 0, MFX_TRACE_OUTPUT_STAT, MFXTraceStat_Init, MFXTraceStat_SetLevel, MFXTraceStat_DebugMessage, MFXTraceStat_vDebugMessage, MFXTraceStat_BeginTask, MFXTraceStat_EndTask, MFXTraceStat_Close }, #endif #ifdef MFX_TRACE_ENABLE_TAL { 0, MFX_TRACE_OUTPUT_TAL, MFXTraceTAL_Init, MFXTraceTAL_SetLevel, MFXTraceTAL_DebugMessage, MFXTraceTAL_vDebugMessage, MFXTraceTAL_BeginTask, MFXTraceTAL_EndTask, MFXTraceTAL_Close }, #endif #ifdef MFX_TRACE_ENABLE_ITT { 0, MFX_TRACE_OUTPUT_ITT, MFXTraceITT_Init, MFXTraceITT_SetLevel, MFXTraceITT_DebugMessage, MFXTraceITT_vDebugMessage, MFXTraceITT_BeginTask, MFXTraceITT_EndTask, MFXTraceITT_Close }, #endif #ifdef MFX_TRACE_ENABLE_FTRACE { 0, MFX_TRACE_OUTPUT_FTRACE, MFXTraceFtrace_Init, MFXTraceFtrace_SetLevel, MFXTraceFtrace_DebugMessage, MFXTraceFtrace_vDebugMessage, MFXTraceFtrace_BeginTask, MFXTraceFtrace_EndTask, MFXTraceFtrace_Close }, #endif }; /*------------------------------------------------------------------------------*/ #define CATEGORIES_BUFFER_SIZE 1024 mfxTraceU32 MFXTrace_GetRegistryParams(void) { mfxTraceU32 value = 0; FILE* conf_file = mfx_trace_open_conf_file(MFX_TRACE_CONFIG); if (!conf_file) return 1; if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_CONF_OMODE_TYPE, &value)) { g_OutputMode = value; } if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_CONF_LEVEL, &value)) { g_Level = value; } fclose(conf_file); return 0; } mfxTraceU32 MFXTrace_GetEnvParams(void) { //get VPL TXT log environment variable const char* tracelogChar = std::getenv("VPL_TXT_LOG"); char* endPtr = nullptr; if (tracelogChar != nullptr) { LogConfig = std::strtol(tracelogChar, &endPtr, 10); if (LogConfig > 0 && LogConfig <= MFX_TXTLOG_LEVEL_API) { g_OutputMode |= MFX_TRACE_OUTPUT_TEXTLOG; g_Level = LogConfig; } } //get VPL perf log environment variable const char* PerflogChar = std::getenv("VPL_PERF_LOG"); const char* PerfPathChar = std::getenv("VPL_PERF_PATH"); char* pEndPerf = nullptr; if (PerflogChar != nullptr) { g_perfutility->dwPerfUtilityIsEnabled = std::strtol(PerflogChar, &pEndPerf, 10); if (PerfPathChar != nullptr) { g_perfutility->perfFilePath = PerfPathChar; } else { g_perfutility->perfFilePath = "/tmp/"; } } //Capture different info according to VPL_EVENT_TRACE_CFG const char* g_eventCfg = std::getenv("VPL_EVENT_TRACE_CFG"); char* endEventCfg = nullptr; if (g_eventCfg != nullptr) { EventCfg = std::strtol(g_eventCfg, &endEventCfg, 16); } return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 mfx_trace_get_category_index(mfxTraceChar* category, mfxTraceU32& index) { if (category && g_mfxTraceCategoriesTable) { mfxTraceU32 i = 0; for (i = 0; i < g_mfxTraceCategoriesNum; ++i) { if (!mfx_trace_tcmp(g_mfxTraceCategoriesTable[i].m_name, category)) { index = i; return 0; } } } return 1; } /*------------------------------------------------------------------------------*/ inline bool MFXTrace_IsPrintableCategoryAndLevel(mfxTraceU32 m_OutputInitilized, mfxTraceU32 level) { bool logFlag = false; if (m_OutputInitilized == MFX_TRACE_OUTPUT_TEXTLOG) { #ifndef NDEBUG if (g_Level == MFX_TXTLOG_LEVEL_MAX) { logFlag = true; } else if (g_Level == MFX_TXTLOG_LEVEL_API_AND_INTERNAL) { if (level != MFX_TRACE_LEVEL_API_PARAMS) { logFlag = true; } } else if (g_Level == MFX_TXTLOG_LEVEL_API_AND_PARAMS) #else if (g_Level == MFX_TXTLOG_LEVEL_API_AND_PARAMS) #endif { if (level == MFX_TRACE_LEVEL_API_PARAMS || level == MFX_TRACE_LEVEL_API) { logFlag = true; } } else if (g_Level == MFX_TXTLOG_LEVEL_API) { if (level == MFX_TRACE_LEVEL_API) { logFlag = true; } } } else if(m_OutputInitilized == MFX_TRACE_OUTPUT_ETW) { if (EventCfg & (1 << MFX_ETWLOG_ENABLE)) { logFlag = true; } } return logFlag; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_Init() { mfxTraceU32 sts = 0; mfxTraceU32 i = 0; mfxTraceU32 output_mode = 0; #if defined(MFX_TRACE_ENABLE_TRASH) g_OutputMode |= MFX_TRACE_OUTPUT_TRASH; #endif #if defined(MFX_TRACE_ENABLE_STAT) g_OutputMode |= MFX_TRACE_OUTPUT_STAT; #endif #if defined(MFX_TRACE_ENABLE_TAL) g_OutputMode |= MFX_TRACE_OUTPUT_TAL; #endif #if defined(MFX_TRACE_ENABLE_ITT) g_OutputMode |= MFX_TRACE_OUTPUT_ITT; #endif #if defined(MFX_TRACE_ENABLE_FTRACE) g_OutputMode |= MFX_TRACE_OUTPUT_FTRACE; #endif if (vm_interlocked_inc32(&g_refCounter) != 1) { return sts; } if (!g_Reflection.m_bIsInitialized && g_OutputMode & (MFX_TRACE_OUTPUT_ETW | MFX_TRACE_OUTPUT_TEXTLOG)) { g_Reflection.DeclareMsdkStructs(); g_Reflection.m_bIsInitialized = true; } sts = MFXTrace_GetRegistryParams(); sts = MFXTrace_GetEnvParams(); if (!sts) { output_mode = g_OutputMode; g_OutputMode = 0; for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (output_mode & g_TraceAlgorithms[i].m_OutputMask) { sts = g_TraceAlgorithms[i].m_InitFn(); if (sts == 0) { g_OutputMode |= output_mode; g_TraceAlgorithms[i].m_OutputInitilized = g_TraceAlgorithms[i].m_OutputMask; } } } // checking search failure if (g_OutputMode == MFX_TRACE_OUTPUT_TRASH) { sts = 1; } } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_Close(void) { mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; if (vm_interlocked_dec32(&g_refCounter) != 0) { return sts; } for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { res = g_TraceAlgorithms[i].m_CloseFn(); if (!sts && res) sts = res; } } g_OutputMode = 0; g_Level = MFX_TRACE_LEVEL_DEFAULT; if (g_mfxTraceCategoriesTable) { free(g_mfxTraceCategoriesTable); g_mfxTraceCategoriesTable = NULL; } g_mfxTraceCategoriesNum = 0; return res; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_SetLevel(mfxTraceChar* category, mfxTraceLevel level) { mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { res = g_TraceAlgorithms[i].m_SetLevelFn(category, level); if (!sts && res) sts = res; } } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_DebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...) { mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; va_list args; va_start(args, format); for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { if (!MFXTrace_IsPrintableCategoryAndLevel(g_TraceAlgorithms[i].m_OutputInitilized, level)) continue; res = g_TraceAlgorithms[i].m_vDebugMessageFn(static_handle, file_name, line_num, function_name, category, level, message, format, args); if (!sts && res) sts = res; } } va_end(args); return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_vDebugMessage(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args) { mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { if (!MFXTrace_IsPrintableCategoryAndLevel(g_TraceAlgorithms[i].m_OutputInitilized, level)) continue; res = g_TraceAlgorithms[i].m_vDebugMessageFn(static_handle, file_name, line_num, function_name, category, level, message, format, args); if (!sts && res) sts = res; } } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, mfxTraceTaskHandle *task_handle, const void *task_params) { // store category and level to check for MFXTrace_IsPrintableCategoryAndLevel in MFXTrace_EndTask if (static_handle) { static_handle->category = category; static_handle->level = level; } mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { if (!MFXTrace_IsPrintableCategoryAndLevel(g_TraceAlgorithms[i].m_OutputInitilized, level)) continue; res = g_TraceAlgorithms[i].m_BeginTaskFn(static_handle, file_name, line_num, function_name, category, level, task_name, task_type, task_handle, task_params); if (!sts && res) sts = res; } } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTrace_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle) { mfxTraceChar* category = NULL; mfxTraceLevel level = MFX_TRACE_LEVEL_DEFAULT; // use category and level stored in MFXTrace_BeginTask values to check for MFXTrace_IsPrintableCategoryAndLevel // preserve previous behaviour if static_handle is null that should never happend in normal usage model if (static_handle) { category = static_handle->category; level = static_handle->level; } mfxTraceU32 sts = 0, res = 0; mfxTraceU32 i = 0; for (i = 0; i < sizeof(g_TraceAlgorithms)/sizeof(mfxTraceAlgorithm); ++i) { if (g_OutputMode & g_TraceAlgorithms[i].m_OutputInitilized) { if (!MFXTrace_IsPrintableCategoryAndLevel(g_TraceAlgorithms[i].m_OutputInitilized, level)) continue; res = g_TraceAlgorithms[i].m_EndTaskFn(static_handle, task_handle); if (!sts && res) sts = res; } } return sts; } /*------------------------------------------------------------------------------*/ // C++ class MFXTraceTask static unsigned int CreateUniqTaskId() { static unsigned int g_tasksId = 0; unsigned int add_val = 1; asm volatile ("lock; xaddl %0,%1" : "=r" (add_val), "=m" (g_tasksId) : "0" (add_val), "m" (g_tasksId) : "memory", "cc"); return add_val; // incremented result will be stored in add_val } MFXTraceTask::MFXTraceTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType task_type, const bool bCreateID) { mfxTraceU32 sts; m_pStaticHandle = static_handle; memset(&m_TraceTaskHandle, 0, sizeof(m_TraceTaskHandle)); m_TaskID = (bCreateID) ? CreateUniqTaskId() : 0; sts = MFXTrace_BeginTask(static_handle, file_name, line_num, function_name, category, level, task_name, task_type, &m_TraceTaskHandle, (bCreateID) ? &m_TaskID : 0); m_bStarted = (sts == 0); } mfxTraceU32 MFXTraceTask::GetID() { return m_TaskID; } void MFXTraceTask::Stop() { if (m_bStarted) { MFXTrace_EndTask(m_pStaticHandle, &m_TraceTaskHandle); m_bStarted = false; } } MFXTraceTask::~MFXTraceTask() { Stop(); } #endif //#ifdef MFX_TRACE_ENABLE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_dump.cpp000066400000000000000000000175361443134507600304570ustar00rootroot00000000000000/* ****************************************************************************** *\ Copyright (C) 2012-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfx_trace_dump.cpp \* ****************************************************************************** */ #include "mfx_trace_dump.h" #include "unistd.h" std::string PointerToHexString(void* x) { std::ostringstream result; result << std::setw(16) << std::setfill('0') << std::hex << std::uppercase << ((mfxU64)x); return result.str(); } struct IdTable { mfxI32 id; const char* str; }; #define TABLE_ENTRY(_name) \ { _name, #_name } static IdTable tbl_BufferId[] = { TABLE_ENTRY(MFX_EXTBUFF_AVC_REFLIST_CTRL), TABLE_ENTRY(MFX_EXTBUFF_AVC_TEMPORAL_LAYERS), TABLE_ENTRY(MFX_EXTBUFF_CODING_OPTION), TABLE_ENTRY(MFX_EXTBUFF_CODING_OPTION2), TABLE_ENTRY(MFX_EXTBUFF_CODING_OPTION3), TABLE_ENTRY(MFX_EXTBUFF_CODING_OPTION_SPSPPS), TABLE_ENTRY(MFX_EXTBUFF_ENCODER_CAPABILITY), TABLE_ENTRY(MFX_EXTBUFF_ENCODED_FRAME_INFO), TABLE_ENTRY(MFX_EXTBUFF_ENCODER_RESET_OPTION), TABLE_ENTRY(MFX_EXTBUFF_ENCODER_ROI), TABLE_ENTRY(MFX_EXTBUFF_PICTURE_TIMING_SEI), TABLE_ENTRY(MFX_EXTBUFF_VPP_AUXDATA), TABLE_ENTRY(MFX_EXTBUFF_VPP_COMPOSITE), TABLE_ENTRY(MFX_EXTBUFF_VPP_DEINTERLACING), TABLE_ENTRY(MFX_EXTBUFF_VPP_DENOISE), TABLE_ENTRY(MFX_EXTBUFF_VPP_DETAIL), TABLE_ENTRY(MFX_EXTBUFF_VPP_DONOTUSE), TABLE_ENTRY(MFX_EXTBUFF_VPP_DOUSE), TABLE_ENTRY(MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION), TABLE_ENTRY(MFX_EXTBUFF_VPP_IMAGE_STABILIZATION), TABLE_ENTRY(MFX_EXTBUFF_VPP_PROCAMP), TABLE_ENTRY(MFX_EXTBUFF_VPP_SCENE_ANALYSIS), TABLE_ENTRY(MFX_EXTBUFF_VPP_SCENE_CHANGE), TABLE_ENTRY(MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO), TABLE_ENTRY(MFX_EXTBUFF_VIDEO_SIGNAL_INFO), TABLE_ENTRY(MFX_EXTBUFF_AVC_REFLIST_CTRL), TABLE_ENTRY(MFX_EXTBUFF_AVC_TEMPORAL_LAYERS), TABLE_ENTRY(MFX_EXTBUFF_ENCODED_FRAME_INFO), TABLE_ENTRY(MFX_EXTBUFF_AVC_REFLISTS), TABLE_ENTRY(MFX_EXTBUFF_HEVC_TILES), TABLE_ENTRY(MFX_EXTBUFF_HEVC_PARAM), TABLE_ENTRY(MFX_EXTBUFF_HEVC_REGION), TABLE_ENTRY(MFX_EXTBUFF_DECODED_FRAME_INFO), TABLE_ENTRY(MFX_EXTBUFF_TIME_CODE), TABLE_ENTRY(MFX_EXTBUFF_THREADS_PARAM), TABLE_ENTRY(MFX_EXTBUFF_PRED_WEIGHT_TABLE), TABLE_ENTRY(MFX_EXTBUFF_DIRTY_RECTANGLES), TABLE_ENTRY(MFX_EXTBUFF_MOVING_RECTANGLES), TABLE_ENTRY(MFX_EXTBUFF_CODING_OPTION_VPS), TABLE_ENTRY(MFX_EXTBUFF_VPP_ROTATION), TABLE_ENTRY(MFX_EXTBUFF_ENCODED_SLICES_INFO), TABLE_ENTRY(MFX_EXTBUFF_VPP_SCALING), TABLE_ENTRY(MFX_EXTBUFF_ENCODER_IPCM_AREA), TABLE_ENTRY(MFX_EXTBUFF_INSERT_HEADERS), TABLE_ENTRY(MFX_EXTBUFF_VP9_SEGMENTATION), TABLE_ENTRY(MFX_EXTBUFF_VP9_TEMPORAL_LAYERS), TABLE_ENTRY(MFX_EXTBUFF_VP9_PARAM) }; static IdTable tbl_FourCC[] = { TABLE_ENTRY(MFX_FOURCC_NV12), TABLE_ENTRY(MFX_FOURCC_YV12), TABLE_ENTRY(MFX_FOURCC_NV16), TABLE_ENTRY(MFX_FOURCC_YUY2), TABLE_ENTRY(MFX_FOURCC_RGB3), TABLE_ENTRY(MFX_FOURCC_RGB4), TABLE_ENTRY(MFX_FOURCC_P8), TABLE_ENTRY(MFX_FOURCC_P8_TEXTURE), TABLE_ENTRY(MFX_FOURCC_P010), TABLE_ENTRY(MFX_FOURCC_P016), TABLE_ENTRY(MFX_FOURCC_P210), TABLE_ENTRY(MFX_FOURCC_BGR4), TABLE_ENTRY(MFX_FOURCC_A2RGB10), TABLE_ENTRY(MFX_FOURCC_ARGB16), TABLE_ENTRY(MFX_FOURCC_R16), TABLE_ENTRY(MFX_FOURCC_ABGR16), TABLE_ENTRY(MFX_FOURCC_AYUV), TABLE_ENTRY(MFX_FOURCC_AYUV_RGB4), TABLE_ENTRY(MFX_FOURCC_UYVY), TABLE_ENTRY(MFX_FOURCC_Y210), TABLE_ENTRY(MFX_FOURCC_Y410), TABLE_ENTRY(MFX_FOURCC_NV21), TABLE_ENTRY(MFX_FOURCC_IYUV), TABLE_ENTRY(MFX_FOURCC_I010), TABLE_ENTRY(MFX_FOURCC_Y216), TABLE_ENTRY(MFX_FOURCC_Y416), TABLE_ENTRY(MFX_FOURCC_RGBP), TABLE_ENTRY(MFX_FOURCC_I210), TABLE_ENTRY(MFX_FOURCC_I420), TABLE_ENTRY(MFX_FOURCC_I422), TABLE_ENTRY(MFX_FOURCC_BGRA), TABLE_ENTRY(MFX_FOURCC_BGRP), #ifdef ONEVPL_EXPERIMENTAL TABLE_ENTRY(MFX_FOURCC_XYUV), TABLE_ENTRY(MFX_FOURCC_ABGR16F), #endif }; static IdTable tbl_CodecId[] = { TABLE_ENTRY(MFX_CODEC_AVC), TABLE_ENTRY(MFX_CODEC_HEVC), TABLE_ENTRY(MFX_CODEC_MPEG2), TABLE_ENTRY(MFX_CODEC_VC1), TABLE_ENTRY(MFX_CODEC_CAPTURE), TABLE_ENTRY(MFX_CODEC_VP9), TABLE_ENTRY(MFX_CODEC_AV1) }; static IdTable tbl_IOPattern[] = { TABLE_ENTRY(MFX_IOPATTERN_IN_VIDEO_MEMORY), TABLE_ENTRY(MFX_IOPATTERN_IN_SYSTEM_MEMORY), TABLE_ENTRY(MFX_IOPATTERN_OUT_VIDEO_MEMORY), TABLE_ENTRY(MFX_IOPATTERN_OUT_SYSTEM_MEMORY) }; std::string DumpContext::GetBufferIdInString(mfxU32 bufferid) { std::string str; for (size_t i = 0; i < sizeof(tbl_BufferId) / sizeof(tbl_BufferId[0]); ++i) { if (tbl_BufferId[i].id == static_cast(bufferid)) { str = tbl_BufferId[i].str; break; } } return str; } std::string GetFourCCInString(mfxU32 fourcc) { std::basic_stringstream stream; std::string name = "UNKNOWN"; int j = 0; for (unsigned int i = 0; i < (sizeof(tbl_FourCC) / sizeof(tbl_FourCC[0])); i++) { if (tbl_FourCC[i].id == static_cast(fourcc)) { name = ""; while (tbl_FourCC[i].str[j + 11] != '\0') { name = name + tbl_FourCC[i].str[j + 11]; j++; } name = name + "\0"; break; } } stream << name; return stream.str(); } std::string GetCodecIdInString(mfxU32 id) { std::basic_stringstream stream; std::string name = "UNKNOWN"; for (unsigned int i = 0; i < (sizeof(tbl_CodecId) / sizeof(tbl_CodecId[0])); i++) { if (tbl_CodecId[i].id == static_cast(id)) { name = tbl_CodecId[i].str; break; } } stream << name; return stream.str(); } std::string GetIOPatternInString(mfxU32 io) { std::basic_stringstream stream; std::string name; for (unsigned int i = 0; i < (sizeof(tbl_IOPattern) / sizeof(tbl_IOPattern[0])); i++) { if (tbl_IOPattern[i].id & static_cast(io)) { name += tbl_IOPattern[i].str; name += "; "; } } if (!name.length()) { name = "UNKNOWN"; name += "(" + ToString(io) + ")"; } stream << name; return stream.str(); } bool _IsBadReadPtr(void *ptr, size_t size) { int fb[2]; if (pipe(fb) >= 0) { bool tmp = (write(fb[1], ptr, size) <= 0); close(fb[0]); close(fb[1]); return tmp; } return true; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_dump_common.cpp000066400000000000000000000066501443134507600320220ustar00rootroot00000000000000/* ****************************************************************************** *\ Copyright (C) 2012-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfx_trace_dump_common.cpp \* ****************************************************************************** */ #include "mfx_trace_dump.h" std::string DumpContext::dump(const std::string structName, const mfxBitstream& bitstream) { std::string str = "mfxBitstream " + structName + " : addr[" + ToHexFormatString(&bitstream) + "]" + " size[" + ToString(sizeof(bitstream)) + "]" + "\n"; str += structName + ".EncryptedData=" + ToString(bitstream.EncryptedData) + "\n"; str += dump_mfxExtParams(structName, bitstream); str += structName + ".CodecId=" + ToString(bitstream.CodecId) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(bitstream.reserved) + "\n"; str += structName + ".DecodeTimeStamp=" + ToString(bitstream.DecodeTimeStamp) + "\n"; str += structName + ".TimeStamp=" + ToString(bitstream.TimeStamp) + "\n"; str += structName + ".Data=" + ToHexFormatString(bitstream.Data) + "\n"; str += structName + ".DataOffset=" + ToString(bitstream.DataOffset) + "\n"; str += structName + ".DataLength=" + ToString(bitstream.DataLength) + "\n"; str += structName + ".MaxLength=" + ToString(bitstream.MaxLength) + "\n"; str += structName + ".PicStruct=" + ToString(bitstream.PicStruct) + "\n"; str += structName + ".FrameType=" + ToString(bitstream.FrameType) + "\n"; str += structName + ".DataFlag=" + ToString(bitstream.DataFlag) + "\n"; str += structName + ".reserved2=" + ToString(bitstream.reserved2) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtBuffer& extBuffer) { std::string str; std::string bufid_str = GetBufferIdInString(extBuffer.BufferId); if (!bufid_str.empty()) str += structName + ".BufferId=" + bufid_str + "\n"; else str += structName + ".BufferId=" + ToString(extBuffer.BufferId) + "\n"; str += structName + ".BufferSz=" + ToString(extBuffer.BufferSz); return str; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_dump_structures.cpp000066400000000000000000001562561443134507600327650ustar00rootroot00000000000000/* ****************************************************************************** *\ Copyright (C) 2012-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfx_trace_dump_structures.cpp \* ****************************************************************************** */ #include "mfx_trace_dump.h" std::string DumpContext::dump(const std::string structName, const mfxEncodeCtrl& EncodeCtrl) { std::string str = "mfxEncodeCtrl " + structName + " : addr[" + ToHexFormatString(&EncodeCtrl) + "]" + " size[" + ToString(sizeof(EncodeCtrl)) + "]" + "\n"; str += dump(structName + ".Header", EncodeCtrl.Header) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(EncodeCtrl.reserved) + "\n"; str += structName + ".reserved1=" + ToString(EncodeCtrl.reserved1) + "\n"; str += structName + ".MfxNalUnitType=" + ToString(EncodeCtrl.MfxNalUnitType) + "\n"; str += structName + ".SkipFrame=" + ToString(EncodeCtrl.SkipFrame) + "\n"; str += structName + ".QP=" + ToString(EncodeCtrl.QP) + "\n"; str += structName + ".FrameType=" + ToString(EncodeCtrl.FrameType) + "\n"; str += structName + ".NumPayload=" + ToString(EncodeCtrl.NumPayload) + "\n"; str += structName + ".reserved2=" + ToString(EncodeCtrl.reserved2) + "\n"; str += dump_mfxExtParams(structName, EncodeCtrl); str += structName + ".Payload=" + ToString(EncodeCtrl.Payload); return str; } std::string DumpContext::dump(const std::string structName, const mfxVideoParam& videoParam) { std::string str = "mfxVideoParam " + structName + " : addr[" + ToHexFormatString(&videoParam) + "]" + " size[" + ToString(sizeof(videoParam)) + "]" + "\n"; str += structName + ".AllocId=" + ToString(videoParam.AllocId) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(videoParam.reserved) + "\n"; str += structName + ".reserved3=" + ToString(videoParam.reserved3) + "\n"; str += structName + ".AsyncDepth=" + ToString(videoParam.AsyncDepth) + "\n"; str += dump(structName + ".mfx", videoParam.mfx); str += dump(structName + ".vpp", videoParam.vpp) + "\n"; str += structName + ".Protected=" + ToString(videoParam.Protected) + "\n"; str += structName + ".IOPattern=" + GetIOPatternInString(videoParam.IOPattern) + "\n"; str += dump_mfxExtParams(structName, videoParam); str += structName + ".reserved2=" + ToString(videoParam.reserved2); return str; } std::string DumpContext::dump(const std::string structName, const mfxInfoMFX& mfx) { std::string str; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(mfx.reserved) + "\n"; str += structName + ".LowPower=" + ToString(mfx.LowPower) + "\n"; str += structName + ".BRCParamMultiplier=" + ToString(mfx.BRCParamMultiplier) + "\n"; str += dump(structName + ".FrameInfo", mfx.FrameInfo) + "\n"; str += structName + ".CodecId=" + GetCodecIdInString(mfx.CodecId) + "\n"; str += structName + ".CodecProfile=" + ToString(mfx.CodecProfile) + "\n"; str += structName + ".CodecLevel=" + ToString(mfx.CodecLevel) + "\n"; str += structName + ".NumThread=" + ToString(mfx.NumThread) + "\n"; str += structName + ".TargetUsage=" + ToString(mfx.TargetUsage) + "\n"; str += structName + ".GopPicSize=" + ToString(mfx.GopPicSize) + "\n"; str += structName + ".GopRefDist=" + ToString(mfx.GopRefDist) + "\n"; str += structName + ".GopOptFlag=" + ToString(mfx.GopOptFlag) + "\n"; str += structName + ".IdrInterval=" + ToString(mfx.IdrInterval) + "\n"; str += structName + ".RateControlMethod=" + ToString(mfx.RateControlMethod) + "\n"; str += structName + ".InitialDelayInKB=" + ToString(mfx.InitialDelayInKB) + "\n"; str += structName + ".QPI=" + ToString(mfx.QPI) + "\n"; str += structName + ".Accuracy=" + ToString(mfx.Accuracy) + "\n"; str += structName + ".BufferSizeInKB=" + ToString(mfx.BufferSizeInKB) + "\n"; str += structName + ".TargetKbps=" + ToString(mfx.TargetKbps) + "\n"; str += structName + ".QPP=" + ToString(mfx.QPP) + "\n"; str += structName + ".ICQQuality=" + ToString(mfx.ICQQuality) + "\n"; str += structName + ".MaxKbps=" + ToString(mfx.MaxKbps) + "\n"; str += structName + ".QPB=" + ToString(mfx.QPB) + "\n"; str += structName + ".Convergence=" + ToString(mfx.Convergence) + "\n"; str += structName + ".NumSlice=" + ToString(mfx.NumSlice) + "\n"; str += structName + ".NumRefFrame=" + ToString(mfx.NumRefFrame) + "\n"; str += structName + ".EncodedOrder=" + ToString(mfx.EncodedOrder) + "\n"; str += structName + ".DecodedOrder=" + ToString(mfx.DecodedOrder) + "\n"; str += structName + ".ExtendedPicStruct=" + ToString(mfx.ExtendedPicStruct) + "\n"; str += structName + ".TimeStampCalc=" + ToString(mfx.TimeStampCalc) + "\n"; str += structName + ".SliceGroupsPresent=" + ToString(mfx.SliceGroupsPresent) + "\n"; str += structName + ".MaxDecFrameBuffering=" + ToString(mfx.MaxDecFrameBuffering) + "\n"; str += structName + ".EnableReallocRequest=" + ToString(mfx.EnableReallocRequest) + "\n"; str += structName + ".FilmGrain=" + ToString(mfx.FilmGrain) + "\n"; str += structName + ".IgnoreLevelConstrain=" + ToString(mfx.IgnoreLevelConstrain) + "\n"; str += structName + ".reserved2[]=" + DUMP_RESERVED_ARRAY(mfx.reserved2) + "\n"; str += structName + ".JPEGChromaFormat=" + ToString(mfx.JPEGChromaFormat) + "\n"; str += structName + ".Rotation=" + ToString(mfx.Rotation) + "\n"; str += structName + ".JPEGColorFormat=" + ToString(mfx.JPEGColorFormat) + "\n"; str += structName + ".InterleavedDec=" + ToString(mfx.InterleavedDec) + "\n"; str += structName + ".reserved3[]=" + DUMP_RESERVED_ARRAY(mfx.reserved3) + "\n"; str += structName + ".Interleaved=" + ToString(mfx.Interleaved) + "\n"; str += structName + ".Quality=" + ToString(mfx.Quality) + "\n"; str += structName + ".RestartInterval=" + ToString(mfx.RestartInterval) + "\n"; str += structName + ".reserved5[]=" + DUMP_RESERVED_ARRAY(mfx.reserved5) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxInfoVPP& vpp) { std::string str; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(vpp.reserved) + "\n"; str += dump(structName + ".In", vpp.In) + "\n" + str += dump(structName + ".Out", vpp.Out); return str; } std::string DumpContext::dump(const std::string structName, const mfxFrameAllocRequest& frameAllocRequest) { std::string str = "mfxFrameAllocRequest " + structName + " : addr[" + ToHexFormatString(&frameAllocRequest) + "]" + " size[" + ToString(sizeof(frameAllocRequest)) + "]" + "\n"; str += structName + ".AllocId=" + ToString(frameAllocRequest.AllocId) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(frameAllocRequest.reserved) + "\n"; str += structName + ".reserved3[]=" + DUMP_RESERVED_ARRAY(frameAllocRequest.reserved3) + "\n"; str += dump(structName + ".Info", frameAllocRequest.Info) + "\n"; str += structName + ".Type=" + ToString(frameAllocRequest.Type) + "\n"; str += structName + ".NumFrameMin=" + ToString(frameAllocRequest.NumFrameMin) + "\n"; str += structName + ".NumFrameSuggested=" + ToString(frameAllocRequest.NumFrameSuggested) + "\n"; str += structName + ".reserved2=" + ToString(frameAllocRequest.reserved2); return str; } std::string DumpContext::dump(const std::string structName, const mfxFrameInfo& info) { std::string str; str += structName + ".reserved=" + DUMP_RESERVED_ARRAY(info.reserved) + "\n"; str += structName + ".ChannelId=" + ToString(info.ChannelId) + "\n"; str += structName + ".BitDepthLuma=" + ToString(info.BitDepthLuma) + "\n"; str += structName + ".BitDepthChroma=" + ToString(info.BitDepthChroma) + "\n"; str += structName + ".Shift=" + ToString(info.Shift) + "\n"; str += dump(structName + ".mfxFrameId", info.FrameId) + "\n"; str += structName + ".FourCC=" + GetFourCCInString(info.FourCC) + "\n"; str += structName + ".Width=" + ToString(info.Width) + "\n"; str += structName + ".Height=" + ToString(info.Height) + "\n"; str += structName + ".CropX=" + ToString(info.CropX) + "\n"; str += structName + ".CropY=" + ToString(info.CropY) + "\n"; str += structName + ".CropW=" + ToString(info.CropW) + "\n"; str += structName + ".CropH=" + ToString(info.CropH) + "\n"; str += structName + ".BufferSize=" + ToString(info.BufferSize) + "\n"; str += structName + ".reserved5=" + ToString(info.reserved5) + "\n"; str += structName + ".FrameRateExtN=" + ToString(info.FrameRateExtN) + "\n"; str += structName + ".FrameRateExtD=" + ToString(info.FrameRateExtD) + "\n"; str += structName + ".reserved3=" + ToString(info.reserved3) + "\n"; str += structName + ".AspectRatioW=" + ToString(info.AspectRatioW) + "\n"; str += structName + ".AspectRatioH=" + ToString(info.AspectRatioH) + "\n"; str += structName + ".PicStruct=" + ToString(info.PicStruct) + "\n"; str += structName + ".ChromaFormat=" + ToString(info.ChromaFormat) + "\n"; str += structName + ".reserved2=" + ToString(info.reserved2); return str; } std::string DumpContext::dump(const std::string structName, const mfxFrameId& frame) { std::string str; str += structName + ".TemporalId=" + ToString(frame.TemporalId) + "\n"; str += structName + ".PriorityId=" + ToString(frame.PriorityId) + "\n"; str += structName + ".DependencyId=" + ToString(frame.DependencyId) + "\n"; str += structName + ".QualityId=" + ToString(frame.QualityId) + "\n"; str += structName + ".ViewId=" + ToString(frame.ViewId); return str; } std::string DumpContext::dump(const std::string structName, const mfxFrameSurface1& frameSurface1) { std::string str = "mfxFrameSurface1 " + structName + " : addr[" + ToHexFormatString(&frameSurface1) + "]" + " size[" + ToString(sizeof(frameSurface1)) + "]" + "\n"; str += structName + ".FrameInterface=" + ToHexFormatString(frameSurface1.FrameInterface) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(frameSurface1.reserved) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(frameSurface1.reserved1) + "\n"; str += dump(structName + ".Info", frameSurface1.Info) + "\n"; str += dump(structName + ".Data", frameSurface1.Data); return str; } std::string DumpContext::dump(const std::string structName, const mfxFrameData& frameData) { std::string str; str += dump_mfxExtParams(structName, frameData); str += structName + ".MemType=" + ToString(frameData.MemType) + "\n"; str += structName + ".PitchHigh=" + ToString(frameData.PitchHigh) + "\n"; str += structName + ".TimeStamp=" + ToString(frameData.TimeStamp) + "\n"; str += structName + ".FrameOrder=" + ToString(frameData.FrameOrder) + "\n"; str += structName + ".Locked=" + ToString(frameData.Locked) + "\n"; str += structName + ".Pitch=" + ToString(frameData.Pitch) + "\n"; str += structName + ".PitchLow=" + ToString(frameData.PitchLow) + "\n"; str += structName + ".Y=" + ToHexFormatString(frameData.Y) + "\n"; str += structName + ".Y16=" + ToHexFormatString(frameData.Y16) + "\n"; str += structName + ".R=" + ToHexFormatString(frameData.R) + "\n"; str += structName + ".UV=" + ToHexFormatString(frameData.UV) + "\n"; str += structName + ".VU=" + ToHexFormatString(frameData.VU) + "\n"; str += structName + ".CbCr=" + ToHexFormatString(frameData.CbCr) + "\n"; str += structName + ".CrCb=" + ToHexFormatString(frameData.CrCb) + "\n"; str += structName + ".Cb=" + ToHexFormatString(frameData.Cb) + "\n"; str += structName + ".U=" + ToHexFormatString(frameData.U) + "\n"; str += structName + ".U16=" + ToHexFormatString(frameData.U16) + "\n"; str += structName + ".G=" + ToHexFormatString(frameData.G) + "\n"; str += structName + ".Y410=" + ToHexFormatString(frameData.Y410) + "\n"; str += structName + ".Y416=" + ToHexFormatString(frameData.Y416) + "\n"; str += structName + ".Cr=" + ToHexFormatString(frameData.Cr) + "\n"; str += structName + ".V=" + ToHexFormatString(frameData.V) + "\n"; str += structName + ".V16=" + ToHexFormatString(frameData.V16) + "\n"; str += structName + ".B=" + ToHexFormatString(frameData.B) + "\n"; str += structName + ".A2RGB10=" + ToString(frameData.A2RGB10) + "\n"; #ifdef ONEVPL_EXPERIMENTAL str += structName + ".ABGRFP16=" + ToString(frameData.ABGRFP16) + "\n"; #endif str += structName + ".A=" + ToHexFormatString(frameData.A) + "\n"; str += structName + ".MemId=" + ToString(frameData.MemId) + "\n"; str += structName + ".Corrupted=" + ToString(frameData.Corrupted) + "\n"; str += structName + ".DataFlag=" + ToString(frameData.DataFlag) + "\n"; return str; } //ExtendedBuffer std::string DumpContext::dump(const std::string structName, const mfxExtCodingOption& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; str += structName + ".reserved1=" + ToString(_struct.reserved1) + "\n"; str += structName + ".RateDistortionOpt=" + ToString(_struct.RateDistortionOpt) + "\n"; str += structName + ".MECostType=" + ToString(_struct.MECostType) + "\n"; str += structName + ".MESearchType=" + ToString(_struct.MESearchType) + "\n"; str += structName + ".MVSearchWindow.x=" + ToString(_struct.MVSearchWindow.x) + "\n"; str += structName + ".MVSearchWindow.y=" + ToString(_struct.MVSearchWindow.y) + "\n"; str += structName + ".EndOfSequence=" + ToString(_struct.EndOfSequence) + "\n"; str += structName + ".FramePicture=" + ToString(_struct.FramePicture) + "\n"; str += structName + ".CAVLC=" + ToString(_struct.CAVLC) + "\n"; str += structName + ".reserved2[]=" + DUMP_RESERVED_ARRAY(_struct.reserved2) + "\n"; str += structName + ".RecoveryPointSEI=" + ToString(_struct.RecoveryPointSEI) + "\n"; str += structName + ".ViewOutput=" + ToString(_struct.ViewOutput) + "\n"; str += structName + ".NalHrdConformance=" + ToString(_struct.NalHrdConformance) + "\n"; str += structName + ".SingleSeiNalUnit=" + ToString(_struct.SingleSeiNalUnit) + "\n"; str += structName + ".VuiVclHrdParameters=" + ToString(_struct.VuiVclHrdParameters) + "\n"; str += structName + ".RefPicListReordering=" + ToString(_struct.RefPicListReordering) + "\n"; str += structName + ".ResetRefList=" + ToString(_struct.ResetRefList) + "\n"; str += structName + ".RefPicMarkRep=" + ToString(_struct.RefPicMarkRep) + "\n"; str += structName + ".FieldOutput=" + ToString(_struct.FieldOutput) + "\n"; str += structName + ".IntraPredBlockSize=" + ToString(_struct.IntraPredBlockSize) + "\n"; str += structName + ".InterPredBlockSize=" + ToString(_struct.InterPredBlockSize) + "\n"; str += structName + ".MVPrecision=" + ToString(_struct.MVPrecision) + "\n"; str += structName + ".MaxDecFrameBuffering=" + ToString(_struct.MaxDecFrameBuffering) + "\n"; str += structName + ".AUDelimiter=" + ToString(_struct.AUDelimiter) + "\n"; str += structName + ".EndOfStream=" + ToString(_struct.EndOfStream) + "\n"; str += structName + ".PicTimingSEI=" + ToString(_struct.PicTimingSEI) + "\n"; str += structName + ".VuiNalHrdParameters=" + ToString(_struct.VuiNalHrdParameters) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtCodingOption2& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(IntRefType); DUMP_FIELD(IntRefCycleSize); DUMP_FIELD(IntRefQPDelta); DUMP_FIELD(MaxFrameSize); DUMP_FIELD(MaxSliceSize); DUMP_FIELD(BitrateLimit); DUMP_FIELD(MBBRC); DUMP_FIELD(ExtBRC); DUMP_FIELD(LookAheadDepth); DUMP_FIELD(Trellis); DUMP_FIELD(RepeatPPS); DUMP_FIELD(BRefType); DUMP_FIELD(AdaptiveI); DUMP_FIELD(AdaptiveB); DUMP_FIELD(LookAheadDS); DUMP_FIELD(NumMbPerSlice); DUMP_FIELD(SkipFrame); DUMP_FIELD_UCHAR(MinQPI); DUMP_FIELD_UCHAR(MaxQPI); DUMP_FIELD_UCHAR(MinQPP); DUMP_FIELD_UCHAR(MaxQPP); DUMP_FIELD_UCHAR(MinQPB); DUMP_FIELD_UCHAR(MaxQPB); DUMP_FIELD(FixedFrameRate); DUMP_FIELD(DisableDeblockingIdc); DUMP_FIELD(DisableVUI); DUMP_FIELD(BufferingPeriodSEI); DUMP_FIELD(EnableMAD); DUMP_FIELD(UseRawRef); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtCodingOption3& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(NumSliceI); DUMP_FIELD(NumSliceP); DUMP_FIELD(NumSliceB); DUMP_FIELD(WinBRCMaxAvgKbps); DUMP_FIELD(WinBRCSize); DUMP_FIELD(QVBRQuality); DUMP_FIELD(EnableMBQP); DUMP_FIELD(IntRefCycleDist); DUMP_FIELD(DirectBiasAdjustment); DUMP_FIELD(GlobalMotionBiasAdjustment); DUMP_FIELD(MVCostScalingFactor); DUMP_FIELD(MBDisableSkipMap); DUMP_FIELD(WeightedPred); DUMP_FIELD(WeightedBiPred); DUMP_FIELD(AspectRatioInfoPresent); DUMP_FIELD(OverscanInfoPresent); DUMP_FIELD(OverscanAppropriate); DUMP_FIELD(TimingInfoPresent); DUMP_FIELD(BitstreamRestriction); DUMP_FIELD(LowDelayHrd); DUMP_FIELD(MotionVectorsOverPicBoundaries); DUMP_FIELD_RESERVED(reserved1); DUMP_FIELD(ScenarioInfo); DUMP_FIELD(ContentInfo); DUMP_FIELD(PRefType); DUMP_FIELD(FadeDetection); DUMP_FIELD(GPB); DUMP_FIELD(MaxFrameSizeI); DUMP_FIELD(MaxFrameSizeP); DUMP_FIELD(EnableQPOffset); DUMP_FIELD_RESERVED(QPOffset); DUMP_FIELD_RESERVED(NumRefActiveP); DUMP_FIELD_RESERVED(NumRefActiveBL0); DUMP_FIELD_RESERVED(NumRefActiveBL1); DUMP_FIELD(TransformSkip); DUMP_FIELD(TargetChromaFormatPlus1); DUMP_FIELD(TargetBitDepthLuma); DUMP_FIELD(TargetBitDepthChroma); DUMP_FIELD(BRCPanicMode); DUMP_FIELD(LowDelayBRC); DUMP_FIELD(EnableMBForceIntra); DUMP_FIELD(AdaptiveMaxFrameSize); DUMP_FIELD(RepartitionCheckEnable); DUMP_FIELD_RESERVED(reserved5); DUMP_FIELD(EncodedUnitsInfo); DUMP_FIELD(EnableNalUnitType); DUMP_FIELD(AdaptiveLTR); DUMP_FIELD(AdaptiveCQM); DUMP_FIELD(AdaptiveRef); #ifdef ONEVPL_EXPERIMENTAL DUMP_FIELD(CPUEncToolsProcessing); DUMP_FIELD_RESERVED(reserved); #else DUMP_FIELD_RESERVED(reserved); #endif return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncoderResetOption& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(StartNewSequence); DUMP_FIELD_RESERVED(reserved); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtAVCRefListCtrl& ExtAVCRefListCtrl) { std::string str; str += dump(structName + ".Header", ExtAVCRefListCtrl.Header) + "\n"; str += structName + ".NumRefIdxL0Active=" + ToString(ExtAVCRefListCtrl.NumRefIdxL0Active) + "\n"; str += structName + ".NumRefIdxL1Active=" + ToString(ExtAVCRefListCtrl.NumRefIdxL1Active) + "\n"; str += structName + ".PreferredRefList=" + ToString(ExtAVCRefListCtrl.PreferredRefList) + "\n"; str += structName + ".RejectedRefList=" + ToString(ExtAVCRefListCtrl.RejectedRefList) + "\n"; str += structName + ".LongTermRefList=" + ToString(ExtAVCRefListCtrl.LongTermRefList) + "\n"; str += structName + ".ApplyLongTermIdx=" + ToString(ExtAVCRefListCtrl.ApplyLongTermIdx) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtAVCRefListCtrl.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtAvcTemporalLayers& ExtAvcTemporalLayers) { std::string str; str += dump(structName + ".Header", ExtAvcTemporalLayers.Header) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtAvcTemporalLayers.reserved1) + "\n"; str += structName + ".reserved2=" + ToString(ExtAvcTemporalLayers.reserved2) + "\n"; str += structName + ".BaseLayerPID=" + ToString(ExtAvcTemporalLayers.BaseLayerPID) + "\n"; str += structName + ".Layer=" + ToString(ExtAvcTemporalLayers.Layer) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtAVCEncodedFrameInfo& ExtAVCEncodedFrameInfo) { std::string str; str += dump(structName + ".Header", ExtAVCEncodedFrameInfo.Header) + "\n"; str += structName + ".FrameOrder=" + ToString(ExtAVCEncodedFrameInfo.FrameOrder) + "\n"; str += structName + ".PicStruct=" + ToString(ExtAVCEncodedFrameInfo.PicStruct) + "\n"; str += structName + ".LongTermIdx=" + ToString(ExtAVCEncodedFrameInfo.LongTermIdx) + "\n"; str += structName + ".MAD=" + ToString(ExtAVCEncodedFrameInfo.MAD) + "\n"; str += structName + ".BRCPanicMode=" + ToString(ExtAVCEncodedFrameInfo.BRCPanicMode) + "\n"; str += structName + ".QP=" + ToString(ExtAVCEncodedFrameInfo.QP) + "\n"; str += structName + ".SecondFieldOffset=" + ToString(ExtAVCEncodedFrameInfo.SecondFieldOffset) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtAVCEncodedFrameInfo.reserved) + "\n"; str += structName + ".UsedRefListL0=" + ToHexFormatString(ExtAVCEncodedFrameInfo.UsedRefListL0) + "\n"; str += structName + ".UsedRefListL1=" + ToHexFormatString(ExtAVCEncodedFrameInfo.UsedRefListL1) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtAVCRefLists& ExtAVCRefLists) { std::string str; str += dump(structName + ".Header", ExtAVCRefLists.Header) + "\n"; str += structName + ".NumRefIdxL0Active=" + ToString(ExtAVCRefLists.NumRefIdxL0Active) + "\n"; str += structName + ".NumRefIdxL1Active=" + ToString(ExtAVCRefLists.NumRefIdxL1Active) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtAVCRefLists.reserved) + "\n"; str += structName + ".RefPicList0=" + ToString(ExtAVCRefLists.RefPicList0) + "\n"; str += structName + ".RefPicList1=" + ToString(ExtAVCRefLists.RefPicList1) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPDenoise& ExtVPPDenoise) { std::string str; str += dump(structName + ".Header", ExtVPPDenoise.Header) + "\n"; str += structName + ".DenoiseFactor=" + ToString(ExtVPPDenoise.DenoiseFactor) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPDetail& ExtVPPDetail) { std::string str; str += dump(structName + ".Header", ExtVPPDetail.Header) + "\n"; str += structName + ".DetailFactor=" + ToString(ExtVPPDetail.DetailFactor) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPProcAmp& ExtVPPProcAmp) { std::string str; str += dump(structName + ".Header", ExtVPPProcAmp.Header) + "\n"; str += structName + ".Brightness=" + ToString(ExtVPPProcAmp.Brightness) + "\n"; str += structName + ".Contrast=" + ToString(ExtVPPProcAmp.Contrast) + "\n"; str += structName + ".Hue=" + ToString(ExtVPPProcAmp.Hue) + "\n"; str += structName + ".Saturation=" + ToString(ExtVPPProcAmp.Saturation) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtCodingOptionSPSPPS& ExtCodingOptionSPSPPS) { std::string str; str += dump(structName + ".Header", ExtCodingOptionSPSPPS.Header) + "\n"; str += structName + ".SPSBuffer=" + ToHexFormatString(ExtCodingOptionSPSPPS.SPSBuffer) + "\n"; str += structName + ".PPSBuffer=" + ToHexFormatString(ExtCodingOptionSPSPPS.PPSBuffer) + "\n"; str += structName + ".SPSBufSize=" + ToString(ExtCodingOptionSPSPPS.SPSBufSize) + "\n"; str += structName + ".PPSBufSize=" + ToString(ExtCodingOptionSPSPPS.PPSBufSize) + "\n"; str += structName + ".SPSId=" + ToString(ExtCodingOptionSPSPPS.SPSId) + "\n"; str += structName + ".PPSId=" + ToString(ExtCodingOptionSPSPPS.PPSId) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVideoSignalInfo& ExtVideoSignalInfo) { std::string str; str += dump(structName + ".Header", ExtVideoSignalInfo.Header) + "\n"; str += structName + ".VideoFormat=" + ToString(ExtVideoSignalInfo.VideoFormat) + "\n"; str += structName + ".VideoFullRange=" + ToString(ExtVideoSignalInfo.VideoFullRange) + "\n"; str += structName + ".ColourDescriptionPresent=" + ToString(ExtVideoSignalInfo.ColourDescriptionPresent) + "\n"; str += structName + ".ColourPrimaries=" + ToString(ExtVideoSignalInfo.ColourPrimaries) + "\n"; str += structName + ".TransferCharacteristics=" + ToString(ExtVideoSignalInfo.TransferCharacteristics) + "\n"; str += structName + ".MatrixCoefficients=" + ToString(ExtVideoSignalInfo.MatrixCoefficients) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPDoUse& ExtVPPDoUse) { std::string str; str += dump(structName + ".Header", ExtVPPDoUse.Header) + "\n"; str += structName + ".NumAlg=" + ToString(ExtVPPDoUse.NumAlg) + "\n"; str += structName + ".AlgList=" + ToHexFormatString(ExtVPPDoUse.AlgList) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtPictureTimingSEI& ExtPictureTimingSEI) { std::string str; str += dump(structName + ".Header", ExtPictureTimingSEI.Header) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtPictureTimingSEI.reserved) + "\n"; str += structName + ".TimeStamp[0].ClockTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].ClockTimestampFlag) + "\n"; str += structName + ".TimeStamp[0].CtType=" + ToString(ExtPictureTimingSEI.TimeStamp[0].CtType) + "\n"; str += structName + ".TimeStamp[0].NuitFieldBasedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].NuitFieldBasedFlag) + "\n"; str += structName + ".TimeStamp[0].CountingType=" + ToString(ExtPictureTimingSEI.TimeStamp[0].CountingType) + "\n"; str += structName + ".TimeStamp[0].FullTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].FullTimestampFlag) + "\n"; str += structName + ".TimeStamp[0].DiscontinuityFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].DiscontinuityFlag) + "\n"; str += structName + ".TimeStamp[0].CntDroppedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].CntDroppedFlag) + "\n"; str += structName + ".TimeStamp[0].NFrames=" + ToString(ExtPictureTimingSEI.TimeStamp[0].NFrames) + "\n"; str += structName + ".TimeStamp[0].SecondsFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].SecondsFlag) + "\n"; str += structName + ".TimeStamp[0].MinutesFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].MinutesFlag) + "\n"; str += structName + ".TimeStamp[0].HoursFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[0].HoursFlag) + "\n"; str += structName + ".TimeStamp[0].SecondsValue=" + ToString(ExtPictureTimingSEI.TimeStamp[0].SecondsValue) + "\n"; str += structName + ".TimeStamp[0].MinutesValue=" + ToString(ExtPictureTimingSEI.TimeStamp[0].MinutesValue) + "\n"; str += structName + ".TimeStamp[0].HoursValue=" + ToString(ExtPictureTimingSEI.TimeStamp[0].HoursValue) + "\n"; str += structName + ".TimeStamp[0].TimeOffset=" + ToString(ExtPictureTimingSEI.TimeStamp[0].TimeOffset) + "\n"; str += structName + ".TimeStamp[1].ClockTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].ClockTimestampFlag) + "\n"; str += structName + ".TimeStamp[1].CtType=" + ToString(ExtPictureTimingSEI.TimeStamp[1].CtType) + "\n"; str += structName + ".TimeStamp[1].NuitFieldBasedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].NuitFieldBasedFlag) + "\n"; str += structName + ".TimeStamp[1].CountingType=" + ToString(ExtPictureTimingSEI.TimeStamp[1].CountingType) + "\n"; str += structName + ".TimeStamp[1].FullTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].FullTimestampFlag) + "\n"; str += structName + ".TimeStamp[1].DiscontinuityFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].DiscontinuityFlag) + "\n"; str += structName + ".TimeStamp[1].CntDroppedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].CntDroppedFlag) + "\n"; str += structName + ".TimeStamp[1].NFrames=" + ToString(ExtPictureTimingSEI.TimeStamp[1].NFrames) + "\n"; str += structName + ".TimeStamp[1].SecondsFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].SecondsFlag) + "\n"; str += structName + ".TimeStamp[1].MinutesFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].MinutesFlag) + "\n"; str += structName + ".TimeStamp[1].HoursFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[1].HoursFlag) + "\n"; str += structName + ".TimeStamp[1].SecondsValue=" + ToString(ExtPictureTimingSEI.TimeStamp[1].SecondsValue) + "\n"; str += structName + ".TimeStamp[1].MinutesValue=" + ToString(ExtPictureTimingSEI.TimeStamp[1].MinutesValue) + "\n"; str += structName + ".TimeStamp[1].HoursValue=" + ToString(ExtPictureTimingSEI.TimeStamp[1].HoursValue) + "\n"; str += structName + ".TimeStamp[1].TimeOffset=" + ToString(ExtPictureTimingSEI.TimeStamp[1].TimeOffset) + "\n"; str += structName + ".TimeStamp[2].ClockTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].ClockTimestampFlag) + "\n"; str += structName + ".TimeStamp[2].CtType=" + ToString(ExtPictureTimingSEI.TimeStamp[2].CtType) + "\n"; str += structName + ".TimeStamp[2].NuitFieldBasedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].NuitFieldBasedFlag) + "\n"; str += structName + ".TimeStamp[2].CountingType=" + ToString(ExtPictureTimingSEI.TimeStamp[2].CountingType) + "\n"; str += structName + ".TimeStamp[2].FullTimestampFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].FullTimestampFlag) + "\n"; str += structName + ".TimeStamp[2].DiscontinuityFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].DiscontinuityFlag) + "\n"; str += structName + ".TimeStamp[2].CntDroppedFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].CntDroppedFlag) + "\n"; str += structName + ".TimeStamp[2].NFrames=" + ToString(ExtPictureTimingSEI.TimeStamp[2].NFrames) + "\n"; str += structName + ".TimeStamp[2].SecondsFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].SecondsFlag) + "\n"; str += structName + ".TimeStamp[2].MinutesFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].MinutesFlag) + "\n"; str += structName + ".TimeStamp[2].HoursFlag=" + ToString(ExtPictureTimingSEI.TimeStamp[2].HoursFlag) + "\n"; str += structName + ".TimeStamp[2].SecondsValue=" + ToString(ExtPictureTimingSEI.TimeStamp[2].SecondsValue) + "\n"; str += structName + ".TimeStamp[2].MinutesValue=" + ToString(ExtPictureTimingSEI.TimeStamp[2].MinutesValue) + "\n"; str += structName + ".TimeStamp[2].HoursValue=" + ToString(ExtPictureTimingSEI.TimeStamp[2].HoursValue) + "\n"; str += structName + ".TimeStamp[2].TimeOffset=" + ToString(ExtPictureTimingSEI.TimeStamp[2].TimeOffset) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPComposite& ExtVPPComposite) { std::string str; str += dump(structName + ".Header", ExtVPPComposite.Header) + "\n"; str += structName + ".Y=" + ToString(ExtVPPComposite.Y) + "\n"; str += structName + ".R=" + ToString(ExtVPPComposite.R) + "\n"; str += structName + ".U=" + ToString(ExtVPPComposite.U) + "\n"; str += structName + ".G=" + ToString(ExtVPPComposite.G) + "\n"; str += structName + ".V=" + ToString(ExtVPPComposite.V) + "\n"; str += structName + ".B=" + ToString(ExtVPPComposite.B) + "\n"; str += structName + ".NumTiles=" + ToString(ExtVPPComposite.NumTiles) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtVPPComposite.reserved1) + "\n"; str += structName + ".NumInputStream=" + ToString(ExtVPPComposite.NumInputStream) + "\n"; str += structName + ".InputStream=" + ToHexFormatString(ExtVPPComposite.InputStream) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPVideoSignalInfo& ExtVPPVideoSignalInfo) { std::string str; str += dump(structName + ".Header", ExtVPPVideoSignalInfo.Header) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtVPPVideoSignalInfo.reserved1) + "\n"; str += structName + ".In.TransferMatrix=" + ToString(ExtVPPVideoSignalInfo.In.TransferMatrix) + "\n"; str += structName + ".In.NominalRange=" + ToString(ExtVPPVideoSignalInfo.In.NominalRange) + "\n"; str += structName + ".In.reserved2[]=" + DUMP_RESERVED_ARRAY(ExtVPPVideoSignalInfo.In.reserved2) + "\n"; str += structName + ".Out.TransferMatrix=" + ToString(ExtVPPVideoSignalInfo.Out.TransferMatrix) + "\n"; str += structName + ".Out.NominalRange=" + ToString(ExtVPPVideoSignalInfo.Out.NominalRange) + "\n"; str += structName + ".Out.reserved2[]=" + DUMP_RESERVED_ARRAY(ExtVPPVideoSignalInfo.Out.reserved2) + "\n"; str += structName + ".TransferMatrix=" + ToString(ExtVPPVideoSignalInfo.TransferMatrix) + "\n"; str += structName + ".NominalRange=" + ToString(ExtVPPVideoSignalInfo.NominalRange) + "\n"; str += structName + ".reserved3[]=" + DUMP_RESERVED_ARRAY(ExtVPPVideoSignalInfo.reserved3) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPDeinterlacing& ExtVPPDeinterlacing) { std::string str; str += dump(structName + ".Header", ExtVPPDeinterlacing.Header) + "\n"; str += structName + ".Mode=" + ToString(ExtVPPDeinterlacing.Mode) + "\n"; str += structName + ".TelecinePattern=" + ToString(ExtVPPDeinterlacing.TelecinePattern) + "\n"; str += structName + ".TelecineLocation=" + ToString(ExtVPPDeinterlacing.TelecineLocation) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPDeinterlacing.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtHEVCTiles& ExtHEVCTiles) { std::string str; str += dump(structName + ".Header", ExtHEVCTiles.Header) + "\n"; str += structName + ".NumTileRows=" + ToString(ExtHEVCTiles.NumTileRows) + "\n"; str += structName + ".NumTileColumns=" + ToString(ExtHEVCTiles.NumTileColumns) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtHEVCTiles.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtHEVCParam& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(PicWidthInLumaSamples); DUMP_FIELD(PicHeightInLumaSamples); DUMP_FIELD(GeneralConstraintFlags); DUMP_FIELD(SampleAdaptiveOffset); DUMP_FIELD(LCUSize); str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(_struct.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtHEVCRegion& ExtHEVCRegion) { std::string str; str += dump(structName + ".Header", ExtHEVCRegion.Header) + "\n"; str += structName + ".RegionId=" + ToString(ExtHEVCRegion.RegionId) + "\n"; str += structName + ".RegionType=" + ToString(ExtHEVCRegion.RegionType) + "\n"; str += structName + ".RegionEncoding=" + ToString(ExtHEVCRegion.RegionEncoding) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtHEVCRegion.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtDecodedFrameInfo& ExtDecodedFrameInfo) { std::string str; str += dump(structName + ".Header", ExtDecodedFrameInfo.Header) + "\n"; str += structName + ".FrameType=" + ToString(ExtDecodedFrameInfo.FrameType) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtDecodedFrameInfo.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtTimeCode& ExtTimeCode) { std::string str; str += dump(structName + ".Header", ExtTimeCode.Header) + "\n"; str += structName + ".DropFrameFlag=" + ToString(ExtTimeCode.DropFrameFlag) + "\n"; str += structName + ".TimeCodeHours=" + ToString(ExtTimeCode.TimeCodeHours) + "\n"; str += structName + ".TimeCodeMinutes=" + ToString(ExtTimeCode.TimeCodeMinutes) + "\n"; str += structName + ".TimeCodeSeconds=" + ToString(ExtTimeCode.TimeCodeSeconds) + "\n"; str += structName + ".TimeCodePictures=" + ToString(ExtTimeCode.TimeCodePictures) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtTimeCode.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtPredWeightTable& ExtPredWeightTable) { std::string str; str += dump(structName + ".Header", ExtPredWeightTable.Header) + "\n"; str += structName + ".LumaLog2WeightDenom=" + ToString(ExtPredWeightTable.LumaLog2WeightDenom) + "\n"; str += structName + ".ChromaLog2WeightDenom=" + ToString(ExtPredWeightTable.ChromaLog2WeightDenom) + "\n"; for (int i = 0; i < 2; i++) str += structName + ".LumaWeightFlag[" + ToString(i) + "][]=" + DUMP_RESERVED_ARRAY(ExtPredWeightTable.LumaWeightFlag[i]) + "\n"; for (int i = 0; i < 2; i++) str += structName + ".ChromaWeightFlag[" + ToString(i) + "][]=" + DUMP_RESERVED_ARRAY(ExtPredWeightTable.ChromaWeightFlag[i]) + "\n"; for (int i = 0; i < 2; i++) for (int j = 0; j < 32; j++) for (int k = 0; k < 3; k++) str += structName + ".Weights[" + ToString(i) + "][" + ToString(j) + "][" + ToString(k) + "][]=" + DUMP_RESERVED_ARRAY(ExtPredWeightTable.Weights[i][j][k]) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtPredWeightTable.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncoderCapability& ExtEncoderCapability) { std::string str; str += dump(structName + ".Header", ExtEncoderCapability.Header) + "\n"; str += structName + ".MBPerSec=" + ToString(ExtEncoderCapability.MBPerSec) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtEncoderCapability.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtDirtyRect& ExtDirtyRect) { std::string str; str += dump(structName + ".Header", ExtDirtyRect.Header) + "\n"; str += structName + ".NumRect=" + ToString(ExtDirtyRect.NumRect) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtDirtyRect.reserved1) + "\n"; str += structName + ".Rect=" + ToString(ExtDirtyRect.Rect) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtMoveRect& ExtMoveRect) { std::string str; str += dump(structName + ".Header", ExtMoveRect.Header) + "\n"; str += structName + ".NumRect=" + ToString(ExtMoveRect.NumRect) + "\n"; str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtMoveRect.reserved1) + "\n"; str += structName + ".Rect=" + ToString(ExtMoveRect.Rect) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPFrameRateConversion& ExtVPPFrameRateConversion) { std::string str; str += dump(structName + ".Header", ExtVPPFrameRateConversion.Header) + "\n"; str += structName + ".Algorithm=" + ToString(ExtVPPFrameRateConversion.Algorithm) + "\n"; str += structName + ".reserved=" + ToString(ExtVPPFrameRateConversion.reserved) + "\n"; str += structName + ".reserved2[]=" + DUMP_RESERVED_ARRAY(ExtVPPFrameRateConversion.reserved2) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPImageStab& ExtVPPImageStab) { std::string str; str += dump(structName + ".Header", ExtVPPImageStab.Header) + "\n"; str += structName + ".Mode=" + ToString(ExtVPPImageStab.Mode) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPImageStab.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncoderROI& ExtEncoderROI) { std::string str; str += dump(structName + ".Header", ExtEncoderROI.Header) + "\n"; str += structName + ".NumROI=" + ToString(ExtEncoderROI.NumROI) + "\n"; str += structName + ".ROIMode=" + ToString(ExtEncoderROI.ROIMode) + "\n"; for (int i = 0; i < ExtEncoderROI.NumROI; i++) { str += structName + ".ROI[" + ToString(i) + "].Left=" + ToString(ExtEncoderROI.ROI[i].Left) + "\n"; str += structName + ".ROI[" + ToString(i) + "].Top=" + ToString(ExtEncoderROI.ROI[i].Top) + "\n"; str += structName + ".ROI[" + ToString(i) + "].Right=" + ToString(ExtEncoderROI.ROI[i].Right) + "\n"; str += structName + ".ROI[" + ToString(i) + "].Bottom=" + ToString(ExtEncoderROI.ROI[i].Bottom) + "\n"; if (ExtEncoderROI.ROIMode == MFX_ROI_MODE_QP_DELTA) { str += structName + ".ROI[" + ToString(i) + "].DeltaQP=" + ToString(ExtEncoderROI.ROI[i].DeltaQP) + "\n"; } else { str += structName + ".ROI[" + ToString(i) + "].Priority=" + ToString(ExtEncoderROI.ROI[i].Priority) + "\n"; } str += structName + ".ROI[" + ToString(i) + "].reserved2[]=" + DUMP_RESERVED_ARRAY(ExtEncoderROI.ROI[i].reserved2) + "\n"; } str += structName + ".reserved1[]=" + DUMP_RESERVED_ARRAY(ExtEncoderROI.reserved1) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtCodingOptionVPS& ExtCodingOptionVPS) { std::string str; str += dump(structName + ".Header", ExtCodingOptionVPS.Header) + "\n"; str += structName + ".VPSBuffer=" + ToHexFormatString(ExtCodingOptionVPS.VPSBuffer) + "\n"; str += structName + ".reserved1=" + ToString(ExtCodingOptionVPS.reserved1) + "\n"; str += structName + ".VPSBufSize=" + ToString(ExtCodingOptionVPS.VPSBufSize) + "\n"; str += structName + ".VPSId=" + ToString(ExtCodingOptionVPS.VPSId) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtCodingOptionVPS.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPRotation& ExtVPPRotation) { std::string str; str += dump(structName + ".Header", ExtVPPRotation.Header) + "\n"; str += structName + "Angle.=" + ToString(ExtVPPRotation.Angle) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPRotation.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncodedSlicesInfo& ExtEncodedSlicesInfo) { std::string str; str += dump(structName + ".Header", ExtEncodedSlicesInfo.Header) + "\n"; str += structName + "SliceSizeOverflow.=" + ToString(ExtEncodedSlicesInfo.SliceSizeOverflow) + "\n"; str += structName + "NumSliceNonCopliant.=" + ToString(ExtEncodedSlicesInfo.NumSliceNonCopliant) + "\n"; str += structName + "NumEncodedSlice.=" + ToString(ExtEncodedSlicesInfo.NumEncodedSlice) + "\n"; str += structName + "NumSliceSizeAlloc.=" + ToString(ExtEncodedSlicesInfo.NumSliceSizeAlloc) + "\n"; str += structName + "SliceSize.=" + ToHexFormatString(ExtEncodedSlicesInfo.SliceSize) + "\n"; str += structName + "reserved1.=" + ToString(ExtEncodedSlicesInfo.reserved1) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtEncodedSlicesInfo.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPScaling& ExtVPPScaling) { std::string str; str += dump(structName + ".Header", ExtVPPScaling.Header) + "\n"; str += structName + "ScalingMode.=" + ToString(ExtVPPScaling.ScalingMode) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPScaling.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPMirroring& ExtVPPMirroring) { std::string str; str += dump(structName + ".Header", ExtVPPMirroring.Header) + "\n"; str += structName + ".Type=" + ToString(ExtVPPMirroring.Type) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPMirroring.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtMVOverPicBoundaries& ExtMVOverPicBoundaries) { std::string str; str += dump(structName + ".Header", ExtMVOverPicBoundaries.Header) + "\n"; str += structName + ".StickTop=" + ToString(ExtMVOverPicBoundaries.StickTop) + "\n"; str += structName + ".StickBottom=" + ToString(ExtMVOverPicBoundaries.StickBottom) + "\n"; str += structName + ".StickLeft=" + ToString(ExtMVOverPicBoundaries.StickLeft) + "\n"; str += structName + ".StickRight=" + ToString(ExtMVOverPicBoundaries.StickRight) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtMVOverPicBoundaries.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVPPColorFill& ExtVPPColorFill) { std::string str; str += dump(structName + ".Header", ExtVPPColorFill.Header) + "\n"; str += structName + ".Enable=" + ToString(ExtVPPColorFill.Enable) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtVPPColorFill.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtDecVideoProcessing& ExtDecVideoProcessing) { std::string str; /* IN structures */ str += dump(structName + ".Header", ExtDecVideoProcessing.Header) + "\n"; str += structName + "In.CropX=" + ToString(ExtDecVideoProcessing.In.CropX) + "\n"; str += structName + "In.CropY=" + ToString(ExtDecVideoProcessing.In.CropY) + "\n"; str += structName + "In.CropW=" + ToString(ExtDecVideoProcessing.In.CropW) + "\n"; str += structName + "In.CropH=" + ToString(ExtDecVideoProcessing.In.CropH) + "\n"; str += structName + "In.reserved[]=" + DUMP_RESERVED_ARRAY(ExtDecVideoProcessing.In.reserved) + "\n"; /* Out structures */ str += structName + "Out.FourCC=" + ToString(ExtDecVideoProcessing.Out.FourCC) + "\n"; str += structName + "Out.ChromaFormat=" + ToString(ExtDecVideoProcessing.Out.ChromaFormat) + "\n"; str += structName + "Out.reserved1=" + ToString(ExtDecVideoProcessing.Out.reserved1) + "\n"; str += structName + "Out.Width=" + ToString(ExtDecVideoProcessing.Out.Width) + "\n"; str += structName + "Out.Height=" + ToString(ExtDecVideoProcessing.Out.Height) + "\n"; str += structName + "OutCropX.=" + ToString(ExtDecVideoProcessing.Out.CropX) + "\n"; str += structName + "OutCropY.=" + ToString(ExtDecVideoProcessing.Out.CropY) + "\n"; str += structName + "OutCropW.=" + ToString(ExtDecVideoProcessing.Out.CropW) + "\n"; str += structName + "OutCropH.=" + ToString(ExtDecVideoProcessing.Out.CropH) + "\n"; str += structName + "Out.reserved[]=" + DUMP_RESERVED_ARRAY(ExtDecVideoProcessing.Out.reserved) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtDecVideoProcessing.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtMBQP& ExtMBQP) { std::string str; str += dump(structName + ".Header", ExtMBQP.Header) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtMBQP.reserved) + "\n"; str += structName + ".Mode=" + ToString(ExtMBQP.Mode) + "\n"; str += structName + ".BlockSize=" + ToString(ExtMBQP.BlockSize) + "\n"; str += structName + ".NumQPAlloc=" + ToString(ExtMBQP.NumQPAlloc) + "\n"; str += structName + ".QP=" + ToHexFormatString(ExtMBQP.QP) + "\n"; str += structName + ".DeltaQP=" + ToHexFormatString(ExtMBQP.DeltaQP) + "\n"; str += structName + "reserverd2=" + ToString(ExtMBQP.reserved2) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncoderIPCMArea& ExtEncoderIPCMArea) { std::string str; str += dump(structName + ".Header", ExtEncoderIPCMArea.Header) + "\n"; str += structName + ".reserve1[]=" + DUMP_RESERVED_ARRAY(ExtEncoderIPCMArea.reserve1) + "\n"; str += structName + ".NumArea=" + ToString(ExtEncoderIPCMArea.NumArea) + "\n"; // dump Area if (ExtEncoderIPCMArea.Areas == nullptr) { str += structName + ".Areas = nullptr \n"; return str; } for (mfxU16 i = 0; i < ExtEncoderIPCMArea.NumArea; i++) { str += structName + ".Areas[" + ToString(i) + "].Left=" + ToString(ExtEncoderIPCMArea.Areas[i].Left) + "\n"; str += structName + ".Areas[" + ToString(i) + "].Top=" + ToString(ExtEncoderIPCMArea.Areas[i].Top) + "\n"; str += structName + ".Areas[" + ToString(i) + "].Right=" + ToString(ExtEncoderIPCMArea.Areas[i].Right) + "\n"; str += structName + ".Areas[" + ToString(i) + "].Bottom=" + ToString(ExtEncoderIPCMArea.Areas[i].Bottom) + "\n"; str += structName + ".Areas[" + ToString(i) + "].reserved2=" + DUMP_RESERVED_ARRAY(ExtEncoderIPCMArea.Areas[i].reserved2) + "\n"; } return str; } std::string DumpContext::dump(const std::string structName, const mfxExtInsertHeaders& ExtInsertHeaders) { std::string str; str += dump(structName + ".Header", ExtInsertHeaders.Header) + "\n"; str += structName + ".SPS=" + ToString(ExtInsertHeaders.SPS) + "\n"; str += structName + ".PPS=" + ToString(ExtInsertHeaders.PPS) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtDecodeErrorReport& ExtDecodeErrorReport) { std::string str; str += dump(structName + ".Header", ExtDecodeErrorReport.Header) + "\n"; str += structName + ".ErrorTypes=" + toString(ExtDecodeErrorReport.ErrorTypes, DUMP_HEX) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtDecodeErrorReport.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtMasteringDisplayColourVolume& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; str += structName + ".InsertPayloadToggle=" + ToString(_struct.InsertPayloadToggle) + "\n"; for (int i = 0; i < 3; i++) { str += structName + ".DisplayPrimariesX[" + ToString(i) + "]=" + ToString(_struct.DisplayPrimariesX[i]) + "\n"; str += structName + ".DisplayPrimariesY[" + ToString(i) + "]=" + ToString(_struct.DisplayPrimariesY[i]) + "\n"; } str += structName + ".WhitePointX=" + ToString(_struct.WhitePointX) + "\n"; str += structName + ".WhitePointY=" + ToString(_struct.WhitePointY) + "\n"; str += structName + ".MaxDisplayMasteringLuminance=" + ToString(_struct.MaxDisplayMasteringLuminance) + "\n"; str += structName + ".MinDisplayMasteringLuminance=" + ToString(_struct.MinDisplayMasteringLuminance) + "\n"; DUMP_FIELD_RESERVED(reserved); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtContentLightLevelInfo& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; str += structName + ".InsertPayloadToggle=" + ToString(_struct.InsertPayloadToggle) + "\n"; str += structName + ".MaxContentLightLevel=" + ToString(_struct.MaxContentLightLevel) + "\n"; str += structName + ".MaxPicAverageLightLevel=" + ToString(_struct.MaxPicAverageLightLevel) + "\n"; DUMP_FIELD_RESERVED(reserved); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtEncodedUnitsInfo& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; str += structName + ".NumUnitsAlloc=" + ToString(_struct.NumUnitsAlloc) + "\n"; str += structName + ".NumUnitsEncoded=" + ToString(_struct.NumUnitsEncoded) + "\n"; if (_struct.UnitInfo != NULL) { int count = _struct.NumUnitsEncoded < _struct.NumUnitsAlloc ? _struct.NumUnitsEncoded : _struct.NumUnitsAlloc; for (int i = 0; i < count; i++) { str += structName + ".UnitInfo[" + ToString(i) + "].Type=" + ToString(_struct.UnitInfo[i].Type) + "\n"; str += structName + ".UnitInfo[" + ToString(i) + "].Offset=" + ToString(_struct.UnitInfo[i].Offset) + "\n"; str += structName + ".UnitInfo[" + ToString(i) + "].Size=" + ToString(_struct.UnitInfo[i].Size) + "\n"; } } else { str += structName + ".UnitInfo=NULL\n"; } DUMP_FIELD_RESERVED(reserved); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtColorConversion& ExtColorConversion) { std::string str; str += dump(structName + ".Header", ExtColorConversion.Header) + "\n"; str += structName + ".ChromaSiting=" + ToString(ExtColorConversion.ChromaSiting) + "\n"; str += structName + ".reserved[]=" + DUMP_RESERVED_ARRAY(ExtColorConversion.reserved) + "\n"; return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVppMctf& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; str += structName + ".FilterStrength=" + ToString(_struct.FilterStrength) + "\n"; DUMP_FIELD_RESERVED(reserved); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVP9Segmentation& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(NumSegments); for (mfxU16 i = 0; i < 8 && i < _struct.NumSegments; i++) { str += dump(structName + ".Segment[" + ToString(i) + "]", _struct.Segment[i]) + "\n"; } DUMP_FIELD(SegmentIdBlockSize); DUMP_FIELD(NumSegmentIdAlloc); if (_struct.SegmentId) { str += dump_array_with_cast(_struct.SegmentId, _struct.NumSegmentIdAlloc); } else { DUMP_FIELD(SegmentId); } return str; } std::string DumpContext::dump(const std::string structName, const mfxVP9SegmentParam& _struct) { std::string str; DUMP_FIELD(FeatureEnabled); DUMP_FIELD(QIndexDelta); DUMP_FIELD(LoopFilterLevelDelta); DUMP_FIELD(ReferenceFrame); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVP9TemporalLayers& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; for (mfxU16 i = 0; i < 8; i++) { str += dump(structName + ".Layer[" + ToString(i) + "]", _struct.Layer[i]) + "\n"; } return str; } std::string DumpContext::dump(const std::string structName, const mfxVP9TemporalLayer& _struct) { std::string str; DUMP_FIELD(FrameRateScale); DUMP_FIELD(TargetKbps); return str; } std::string DumpContext::dump(const std::string structName, const mfxExtVP9Param& _struct) { std::string str; str += dump(structName + ".Header", _struct.Header) + "\n"; DUMP_FIELD(FrameWidth); DUMP_FIELD(FrameHeight); DUMP_FIELD(WriteIVFHeaders); DUMP_FIELD_RESERVED(reserved1); DUMP_FIELD(QIndexDeltaLumaDC); DUMP_FIELD(QIndexDeltaChromaAC); DUMP_FIELD(QIndexDeltaChromaDC); DUMP_FIELD(NumTileRows); DUMP_FIELD(NumTileColumns); DUMP_FIELD_RESERVED(reserved); return str; }oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_ftrace.cpp000066400000000000000000000151461443134507600307510ustar00rootroot00000000000000// Copyright (c) 2015-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace.h" #if defined(MFX_TRACE_ENABLE_FTRACE) extern "C" { #include #include #include #include #include #include #include "mfx_trace_utils.h" #include "mfx_trace_ftrace.h" static int trace_handle = -1; static char debugfs_prefix[MAX_PATH+1]; static char trace_file_name[MAX_PATH+1]; namespace { // not thread-safe const char *get_debugfs_prefix() { FILE *fp = fopen("/proc/mounts","r"); if (!fp) { return "noperm"; } bool found = false; while (!found) { char type[100]; if (fscanf(fp, "%*s %256s %99s %*s %*d %*d\n", debugfs_prefix, type) != 2) { // eof reached break; } if (strcmp(type, "debugfs") == 0) { // got debugfs line found = true; } } fclose(fp); if (!found) { return "notfound"; } return debugfs_prefix; } // not thread-safe const char *get_tracing_file(const char *file_name) { snprintf(trace_file_name, MAX_PATH, "%.160s/%.96s", get_debugfs_prefix(), file_name); return trace_file_name; } } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_Init() { MFXTraceFtrace_Close(); const char* file_name = get_tracing_file("tracing/trace_marker"); trace_handle = open(file_name , O_WRONLY); if (trace_handle == -1){ // printf("@@@@ Can't open trace file!\n"); return 1; } //printf("@@@@ Trace file opened!\n"); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_Close(void) { if (trace_handle != -1) close(trace_handle); trace_handle = -1; return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_SetLevel(mfxTraceChar* /*category*/, mfxTraceLevel /*level*/) { return 1; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_DebugMessage(mfxTraceStaticHandle* static_handle, const char * file_name, mfxTraceU32 line_num, const char * function_name, mfxTraceChar* category, mfxTraceLevel level, const char * message, const char * format, ...) { mfxTraceU32 res = 0; va_list args; va_start(args, format); res = MFXTraceFtrace_vDebugMessage(static_handle, file_name , line_num, function_name, category, level, message, format, args); va_end(args); return res; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_vDebugMessage(mfxTraceStaticHandle* //static_handle , const char * //file_name , mfxTraceU32 //line_num , const char * function_name , mfxTraceChar* //category , mfxTraceLevel level , const char * message , const char * format , va_list args ) { (void)function_name; if (trace_handle == -1) return 1; size_t len = MFX_TRACE_MAX_LINE_LENGTH; char str[MFX_TRACE_MAX_LINE_LENGTH] = {0}, *p_str = str; // if (file_name /*&& !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME)*/) // { // p_str = mfx_trace_sprintf(p_str, len, "%-60s: ", file_name); // } // if (line_num /*&& !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM)*/) // { // p_str = mfx_trace_sprintf(p_str, len, "%4d: ", line_num); // } // if (category /*&& !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_CATEGORY)*/) // { // p_str = mfx_trace_sprintf(p_str, len, "%S: ", category); // } // if (!(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL)) // { // p_str = mfx_trace_sprintf(p_str, len, "LEV_%d: ", level); // } p_str = mfx_trace_sprintf(p_str, len, "msdk_v1: "); // if (function_name /*&& !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_FUNCTION_NAME)*/) // { // p_str = mfx_trace_sprintf(p_str, len, "%-40s: ", function_name); // } if (message) { p_str = mfx_trace_sprintf(p_str, len, "%s", message); } if (format) { p_str = mfx_trace_vsprintf(p_str, len, format, args); } { p_str = mfx_trace_sprintf(p_str, len, "\n"); } int ret_value = 0; if (write(trace_handle, str, strlen(str)) == -1) { ret_value = 1; } // printf("@@@ %s\n", str); if (fsync(trace_handle) == -1) { ret_value = 1; } return ret_value; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_BeginTask(mfxTraceStaticHandle *//static_handle , const char * //file_name , mfxTraceU32 //line_num , const char * //function_name , mfxTraceChar* //category , mfxTraceLevel //level , const char * //task_name , const mfxTraceTaskType //task_type , mfxTraceTaskHandle *//handle , const void * /*task_params*/) { if (trace_handle == -1) return 1; return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceFtrace_EndTask(mfxTraceStaticHandle * //static_handle , mfxTraceTaskHandle *handle ) { (void)handle; if (trace_handle == -1) return 1; return 0; } } // extern "C" #endif // #if defined(MFX_TRACE_ENABLE_FTRACE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_ir.cpp000066400000000000000000000065541443134507600301220ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include "mfx_trace.h" extern "C" { static const int MFX_PERF_TRACE_BUFFER_SIZE = 3072; static char *perf_trace_var = nullptr; static struct PerfTraceCtx { int32_t ftrace_fd = -1; std::mutex perf_mutex; uint32_t count = 0; } perf_ctx; mfxTraceU32 MFXTrace_EventInit() { perf_trace_var = getenv("VPL_EVENT_TRACE"); if (perf_trace_var == nullptr) { return 1; } std::lock_guard lock(perf_ctx.perf_mutex); if (perf_ctx.ftrace_fd == -1) { perf_ctx.ftrace_fd = open("/sys/kernel/debug/tracing/trace_marker_raw", O_WRONLY); if (perf_ctx.ftrace_fd == -1) { return 1; } } ++perf_ctx.count; return 0; } // It dumps traces to binary format (internal representation) for future offline processing mfxTraceU32 MFXTraceEvent(uint16_t task, uint8_t opcode, uint8_t level, uint64_t size, const void *ptr) { if (perf_ctx.ftrace_fd == -1) { return 0; } uint64_t thread_id = syscall(SYS_gettid); uint64_t timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); uint8_t trace_buf[MFX_PERF_TRACE_BUFFER_SIZE]; memset(trace_buf,0,MFX_PERF_TRACE_BUFFER_SIZE); uint32_t *header = (uint32_t *)trace_buf; const char *tag = "FTMI"; // IMTE + 1 = IMTF (IntelMediaTraceEvent + 1) value is used as ftrace raw marker tag // It is reversed due to endianness memcpy(&header[0], tag, sizeof(header[0])); header[1] = task << 16 | size; header[2] = opcode; size_t buf_len = sizeof(uint32_t) * 3; if (buf_len + size >= MFX_PERF_TRACE_BUFFER_SIZE) { return 1; } if (ptr && size > 0) { memcpy(trace_buf + buf_len, ptr, size); buf_len += size; } size_t written_bytes = write(perf_ctx.ftrace_fd, trace_buf, buf_len); if (written_bytes != buf_len) { return 1; } return 0; } mfxTraceU32 MFXTrace_EventClose() { std::lock_guard lock(perf_ctx.perf_mutex); --perf_ctx.count; if (!perf_ctx.count) { if (close(perf_ctx.ftrace_fd)) { return 1; } perf_ctx.ftrace_fd = -1; } return 0; } } // extern "C" oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_itt.cpp000066400000000000000000000115051443134507600303000ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE_ITT extern "C" { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wattributes" #include #pragma GCC diagnostic pop #include #include "mfx_trace_utils.h" #include "mfx_trace_textlog.h" static __itt_domain* GetDomain(){ static __itt_domain* pTheDomain = __itt_domain_create("MediaSDK"); return pTheDomain; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_Init() { return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_Close(void) { return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_SetLevel(mfxTraceChar* /*category*/, mfxTraceLevel /*level*/) { return 1; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_DebugMessage(mfxTraceStaticHandle* /*static_handle*/, const char * /*file_name*/, mfxTraceU32 /*line_num*/, const char * /*function_name*/, mfxTraceChar* /*category*/, mfxTraceLevel /*level*/, const char * /*message*/, const char * /*format*/, ...) { mfxTraceU32 res = 0; return res; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_vDebugMessage(mfxTraceStaticHandle* //static_handle ,const char * //file_name ,mfxTraceU32 //line_num ,const char * //function_name ,mfxTraceChar* //category ,mfxTraceLevel //level ,const char * //message ,const char * //format ,va_list //args ) { return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_BeginTask(mfxTraceStaticHandle *static_handle ,const char * //file_name ,mfxTraceU32 //line_num ,const char * //function_name ,mfxTraceChar* //category ,mfxTraceLevel level ,const char * task_name ,const mfxTraceTaskType //task_type ,mfxTraceTaskHandle *handle ,const void * /*task_params*/) { if (!static_handle || !handle) return 1; if (MFX_TRACE_LEVEL_API == level || MFX_TRACE_LEVEL_HOTSPOTS == level || MFX_TRACE_LEVEL_EXTCALL == level) { // cache string handle across task instances if (NULL == static_handle->itt1.ptr) { static_handle->itt1.ptr = __itt_string_handle_create(task_name); } // task is traced handle->itt1.uint32 = 1; __itt_task_begin(GetDomain(), __itt_null, __itt_null, (__itt_string_handle*)static_handle->itt1.ptr); } return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceITT_EndTask(mfxTraceStaticHandle * //static_handle ,mfxTraceTaskHandle *handle ) { if (!handle) return 1; if (1 == handle->itt1.uint32) __itt_task_end(GetDomain()); return 0; } } // extern "C" #endif // #ifdef MFX_TRACE_ENABLE_ITT oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_stat.cpp000066400000000000000000000355371443134507600304660ustar00rootroot00000000000000// Copyright (c) 2010-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace.h" #ifdef MFX_TRACE_ENABLE_STAT extern "C" { #include "mfx_trace_utils.h" #include "mfx_trace_stat.h" #include #include #include /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_PrintHeader(void); mfxTraceU32 MFXTraceStat_PrintInfo(mfxTraceStaticHandle* static_handle); #define FORMAT_FN_NAME "%-40s: " #define FORMAT_TASK_NAME "%-40s: " #define FORMAT_FULL_STAT "%10.6f, %6d, %10.6f, %10.6f" #define FORMAT_SHORT_STAT "%10.6f, %6d, %10s, %10s" #define FORMAT_CAT ": %s" #define FORMAT_LEV ": LEV_%-02d" #define FORMAT_FILE_NAME ": %s" #define FORMAT_LINE_NUM ": %d" #define FORMAT_HDR_FN_NAME "%-40s: " #define FORMAT_HDR_TASK_NAME "%-40s: " #define FORMAT_HDR_STAT "%10s, %6s, %10s, %10s" #define FORMAT_HDR_CAT FORMAT_CAT #define FORMAT_HDR_LEV ": %-6s" #define FORMAT_HDR_FILE_NAME FORMAT_FILE_NAME #define FORMAT_HDR_LINE_NUM ": %s" /*------------------------------------------------------------------------------*/ typedef mfxTraceU64 mfxTraceTick; #include #define MFX_TRACE_TIME_MHZ 1000000 /*------------------------------------------------------------------------------*/ static mfxTraceTick mfx_trace_get_frequency(void) { return (mfxTraceTick)MFX_TRACE_TIME_MHZ; } static mfxTraceTick mfx_trace_get_tick(void) { struct timeval tv; gettimeofday(&tv, NULL); return (mfxTraceTick)tv.tv_sec * (mfxTraceTick)MFX_TRACE_TIME_MHZ + (mfxTraceTick)tv.tv_usec; } #define mfx_trace_get_time(T,S,F) ((double)(__INT64)((T)-(S))/(double)(__INT64)(F)) /*------------------------------------------------------------------------------*/ #define MFX_TRACE_STAT_NUM_OF_STAT_ITEMS 100 class mfxStatGlobalHandle { public: mfxStatGlobalHandle(void) : m_StatTableIndex(0), m_StatTableSize(0), m_pStatTable(NULL) { m_pStatTable = (mfxTraceStaticHandle**)malloc(MFX_TRACE_STAT_NUM_OF_STAT_ITEMS * sizeof(mfxTraceStaticHandle*)); if (m_pStatTable) m_StatTableSize = MFX_TRACE_STAT_NUM_OF_STAT_ITEMS; }; ~mfxStatGlobalHandle(void) { Close(); if (m_pStatTable) { free(m_pStatTable); m_pStatTable = NULL; } }; mfxTraceU32 AddItem(mfxTraceStaticHandle* pStatHandle) { if (!pStatHandle) return 1; if (m_StatTableIndex >= m_StatTableSize) { mfxTraceStaticHandle** pStatTable = NULL; pStatTable = (mfxTraceStaticHandle**)realloc(m_pStatTable, (m_StatTableSize + MFX_TRACE_STAT_NUM_OF_STAT_ITEMS) * sizeof(mfxTraceStaticHandle*)); if (pStatTable) { m_pStatTable = pStatTable; m_StatTableSize += MFX_TRACE_STAT_NUM_OF_STAT_ITEMS; } else return 1; } if (!m_pStatTable || (m_StatTableIndex >= m_StatTableSize)) return 1; if (m_StatTableIndex < m_StatTableSize) { m_pStatTable[m_StatTableIndex] = pStatHandle; ++m_StatTableIndex; } return 0; }; void Close(void) { mfxTraceU32 i = 0; if (m_StatTableIndex) MFXTraceStat_PrintHeader(); for (i = 0; i < m_StatTableIndex; ++i) { MFXTraceStat_PrintInfo(m_pStatTable[i]); if (m_pStatTable[i]->sd4.str) { free(m_pStatTable[i]->sd4.str); m_pStatTable[i]->sd4.str = NULL; } } m_StatTableIndex = 0; }; protected: mfxTraceU32 m_StatTableIndex; mfxTraceU32 m_StatTableSize; mfxTraceStaticHandle** m_pStatTable; }; /*------------------------------------------------------------------------------*/ static mfxStatGlobalHandle g_StatGlobalHandle; static mfxTraceChar g_mfxTraceStatFileName[MAX_PATH] = {0}; static FILE* g_mfxTraceStatFile = NULL; static mfxTraceU32 g_StatSuppress = MFX_TRACE_STAT_SUPPRESS_FILE_NAME | MFX_TRACE_STAT_SUPPRESS_LINE_NUM | MFX_TRACE_STAT_SUPPRESS_LEVEL; /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_GetRegistryParams(void) { FILE* conf_file = mfx_trace_open_conf_file(MFX_TRACE_CONFIG); mfxTraceU32 value = 0; if (!conf_file) return 1; if (mfx_trace_get_conf_string(conf_file, MFX_TRACE_STAT_REG_FILE_NAME, g_mfxTraceStatFileName, sizeof(g_mfxTraceStatFileName))) { g_mfxTraceStatFileName[0] = '\0'; } if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_STAT_REG_SUPPRESS, &value)) { g_StatSuppress = value; } if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_STAT_REG_PERMIT, &value)) { g_StatSuppress &= ~value; } fclose(conf_file); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_Init() { mfxTraceU32 sts = 0; sts = MFXTraceStat_Close(); if (!sts) sts = MFXTraceStat_GetRegistryParams(); if (!sts) { if (!mfx_trace_tcmp(g_mfxTraceStatFileName, MFX_TRACE_STRING("stdout"))) g_mfxTraceStatFile = stdout; else g_mfxTraceStatFile = mfx_trace_tfopen(g_mfxTraceStatFileName, MFX_TRACE_STRING("a")); if (!g_mfxTraceStatFile) return 1; } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_Close(void) { g_StatGlobalHandle.Close(); if (g_mfxTraceStatFile) { fclose(g_mfxTraceStatFile); g_mfxTraceStatFile = NULL; } g_mfxTraceStatFileName[0] = '\0'; g_StatSuppress = MFX_TRACE_STAT_SUPPRESS_FILE_NAME | MFX_TRACE_STAT_SUPPRESS_LINE_NUM | MFX_TRACE_STAT_SUPPRESS_LEVEL; return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_SetLevel(mfxTraceChar* /*category*/, mfxTraceLevel /*level*/) { return 1; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_DebugMessage(mfxTraceStaticHandle* static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...) { mfxTraceU32 res = 0; va_list args; va_start(args, format); res = MFXTraceStat_vDebugMessage(static_handle, file_name , line_num, function_name, category, level, message, format, args); va_end(args); return res; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_vDebugMessage(mfxTraceStaticHandle* /*static_handle*/, const char* /*file_name*/, mfxTraceU32 /*line_num*/, const char* /*function_name*/, mfxTraceChar* /*category*/, mfxTraceLevel /*level*/, const char* /*message*/, const char* /*format*/, va_list /*args*/) { if (!g_mfxTraceStatFile) return 1; return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_PrintHeader(void) { if (!g_mfxTraceStatFile) return 1; char str[MFX_TRACE_MAX_LINE_LENGTH] = {0}, *p_str = str; size_t len = MFX_TRACE_MAX_LINE_LENGTH; { p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_FN_NAME, "Function name"); p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_TASK_NAME, "Task name"); p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_STAT, "Total time", "Number", "Avg. time", "Std. dev."); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_CATEGORY)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_CAT, MFX_TRACE_STRING("Category")); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_LEVEL)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_LEV, "Level"); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_FILE_NAME)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_FILE_NAME, "File name"); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_LINE_NUM)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_HDR_LINE_NUM, "Line number"); } { p_str = mfx_trace_sprintf(p_str, len, "\n"); } fprintf(g_mfxTraceStatFile, "%s", str); fflush(g_mfxTraceStatFile); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_PrintInfo(mfxTraceStaticHandle* static_handle) { if (!g_mfxTraceStatFile) return 1; if (!static_handle) return 1; char str[MFX_TRACE_MAX_LINE_LENGTH] = {0}, *p_str = str; size_t len = MFX_TRACE_MAX_LINE_LENGTH; char *file_name = NULL, *function_name = NULL, *task_name = NULL; mfxTraceU32 line_num = 0; mfxTraceChar* category = NULL; mfxTraceLevel level = MFX_TRACE_LEVEL_DEFAULT; bool b_avg_not_applicable = (1 == static_handle->sd5.uint32)? true: false; double time = 0, avg_time = 0, std_div = 0; // restoring info category = static_handle->category; level = static_handle->level; file_name = static_handle->sd1.str; line_num = static_handle->sd2.uint32; function_name = static_handle->sd3.str; task_name = static_handle->sd4.str; mfxTraceTick trace_frequency = mfx_trace_get_frequency(); // calculating statistics time = mfx_trace_get_time(static_handle->sd6.tick, 0, trace_frequency); if (!b_avg_not_applicable) { avg_time = time/(double)static_handle->sd5.uint32; // that's approximation of standard deviation: // should be: n/(n-1) * [ sum (xk - x_avg)^2 ] // approximation is: n/(n-1) * [ 1/n * sum (xk*xk) - x_avg * x_avg] std_div = mfx_trace_get_time(static_handle->sd7.tick, 0, trace_frequency)/(double)static_handle->sd5.uint32; std_div /= trace_frequency; std_div -= avg_time*avg_time; std_div *= (double)static_handle->sd5.uint32/((double)(static_handle->sd5.uint32 - 1)); std_div = sqrt(std_div); } { p_str = mfx_trace_sprintf(p_str, len, FORMAT_FN_NAME, function_name); if (task_name) p_str = mfx_trace_sprintf(p_str, len, FORMAT_TASK_NAME, task_name); else p_str = mfx_trace_sprintf(p_str, len, FORMAT_TASK_NAME, ""); } if (!b_avg_not_applicable) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_FULL_STAT, time, static_handle->sd5.uint32, avg_time, std_div); } else { p_str = mfx_trace_sprintf(p_str, len, FORMAT_SHORT_STAT, time, static_handle->sd5.uint32, "", ""); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_CATEGORY)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_CAT, category); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_LEVEL)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_LEV, level); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_FILE_NAME)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_FILE_NAME, file_name); } if (!(g_StatSuppress & MFX_TRACE_STAT_SUPPRESS_LINE_NUM)) { p_str = mfx_trace_sprintf(p_str, len, FORMAT_LINE_NUM, line_num); } { p_str = mfx_trace_sprintf(p_str, len, "\n"); } fprintf(g_mfxTraceStatFile, "%s", str); fflush(g_mfxTraceStatFile); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* /*category*/, mfxTraceLevel /*level*/, const char *task_name, const mfxTraceTaskType /*task_type*/, mfxTraceTaskHandle *task_handle, const void * /*task_params*/) { if (!static_handle || !task_handle) return 1; if (0 == static_handle->sd5.uint32) { static_handle->sd1.str = (char*)file_name; static_handle->sd2.uint32 = line_num; static_handle->sd3.str = (char*)function_name; if (task_name) { static_handle->sd4.str = (char*)malloc( (strlen(task_name)+1)*sizeof(char) ); if (static_handle->sd4.str) { strcpy(static_handle->sd4.str, task_name); } } else static_handle->sd4.str = NULL; } task_handle->sd1.tick = mfx_trace_get_tick(); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceStat_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *task_handle) { if (!static_handle || !task_handle) return 1; mfxTraceTick time = 0; ++(static_handle->sd5.uint32); time = mfx_trace_get_tick() - task_handle->sd1.tick; static_handle->sd6.tick += time; static_handle->sd7.tick += time*time; if (1 == static_handle->sd5.uint32) { return g_StatGlobalHandle.AddItem(static_handle); } return 0; } } // extern "C" #endif // #ifdef MFX_TRACE_ENABLE_STAT oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_textlog.cpp000066400000000000000000000237001443134507600311660ustar00rootroot00000000000000// Copyright (c) 2010-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace.h" #include "mfx_utils_perf.h" #ifdef MFX_TRACE_ENABLE_TEXTLOG extern "C" { #define MFT_TRACE_PATH_TO_TEMP_LIBLOG MFX_TRACE_STRING("/tmp/mfxlib.log") #include #include "mfx_trace_utils.h" #include "mfx_trace_textlog.h" #include "unistd.h" /*------------------------------------------------------------------------------*/ static FILE* g_mfxTracePrintfFile = NULL; static mfxTraceChar g_mfxTracePrintfFileName[MAX_PATH] = MFT_TRACE_PATH_TO_TEMP_LIBLOG; static mfxTraceU32 g_PrintfSuppress = MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME | MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM | MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL; bool trace_bEnable = false; std::string trace_autotag = "intialized"; /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_GetRegistryParams(void) { FILE* conf_file = mfx_trace_open_conf_file(MFX_TRACE_CONFIG); mfxTraceU32 value = 0; if (!conf_file) return 0; mfx_trace_get_conf_string(conf_file, MFX_TRACE_TEXTLOG_REG_FILE_NAME, g_mfxTracePrintfFileName, sizeof(g_mfxTracePrintfFileName)); if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_TEXTLOG_REG_SUPPRESS, &value)) { g_PrintfSuppress = value; } if (!mfx_trace_get_conf_dword(conf_file, MFX_TRACE_TEXTLOG_REG_PERMIT, &value)) { g_PrintfSuppress &= ~value; } fclose(conf_file); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_Init() { mfxTraceU32 sts = 0; sts = MFXTraceTextLog_Close(); if (!sts) sts = MFXTraceTextLog_GetRegistryParams(); std::string filename_path = "/tmp/mfxlib_Pid" + std::to_string(getpid()) + "_Tid" + std::to_string(pthread_self()) + ".log"; strcpy(g_mfxTracePrintfFileName,filename_path.c_str()); if (!sts) { if (!g_mfxTracePrintfFile) { if (!mfx_trace_tcmp(g_mfxTracePrintfFileName, MFX_TRACE_STRING("stdout"))) g_mfxTracePrintfFile = stdout; else g_mfxTracePrintfFile = mfx_trace_tfopen(g_mfxTracePrintfFileName, MFX_TRACE_STRING("a")); } if (!g_mfxTracePrintfFile) return 1; } return sts; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_Close(void) { g_PrintfSuppress = //MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME | //MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM | MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL; if (g_mfxTracePrintfFile) { fclose(g_mfxTracePrintfFile); g_mfxTracePrintfFile = NULL; } return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_SetLevel(mfxTraceChar* /*category*/, mfxTraceLevel /*level*/) { return 1; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_DebugMessage(mfxTraceStaticHandle* static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, ...) { mfxTraceU32 res = 0; va_list args; va_start(args, format); res = MFXTraceTextLog_vDebugMessage(static_handle, file_name , line_num, function_name, category, level, message, format, args); va_end(args); return res; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_vDebugMessage(mfxTraceStaticHandle* static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *message, const char *format, va_list args) { if (!g_mfxTracePrintfFile) return 1; size_t len = MFX_TRACE_MAX_LINE_LENGTH; char str[MFX_TRACE_MAX_LINE_LENGTH] = {0}, *p_str = str; char strfile_name[MFX_TRACE_MAX_LINE_LENGTH] = {0}; char enterChr[] = ": ENTER"; char exitChr[] = ": EXIT"; strncpy(strfile_name, file_name, MFX_TRACE_MAX_LINE_LENGTH-1); strfile_name[MFX_TRACE_MAX_LINE_LENGTH - 1] = 0; char* g_fimeName = strrchr(strfile_name, '/') + 1; if (g_fimeName && !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_FILE_NAME)) { p_str = mfx_trace_sprintf(p_str, len, "=====>%-40s: ", g_fimeName); } if (line_num && !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_LINE_NUM)) { p_str = mfx_trace_sprintf(p_str, len, "%-10d: ", line_num); } if (category && !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_CATEGORY)) { p_str = mfx_trace_sprintf(p_str, len, "%S: ", category); } if (!(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_LEVEL)) { p_str = mfx_trace_sprintf(p_str, len, "LEV_%d: ", level); } if (function_name && !(g_PrintfSuppress & MFX_TRACE_TEXTLOG_SUPPRESS_FUNCTION_NAME) && !(format && ((strcmp(format, exitChr) == 0) || (strcmp(format, enterChr) == 0)))) { p_str = mfx_trace_sprintf(p_str, len, "%-60s: ", function_name); } if (message && strlen(message) != 0) { if (format && ((strcmp(format, exitChr) == 0) || (strcmp(format, enterChr) == 0))) { p_str = mfx_trace_sprintf(p_str, len, "%-40s", message); } else { p_str = mfx_trace_sprintf(p_str, len, "%s", message); } } if (format) { p_str = mfx_trace_vsprintf(p_str, len, format, args); if (strcmp(format, exitChr) == 0) { if (static_handle->tick.totalTime) { p_str = mfx_trace_sprintf(p_str, len, "\t\tExec Time: %5.4fms\t\t", static_handle->tick.totalTime); } if (static_handle->tick.callCount) { p_str = mfx_trace_sprintf(p_str, len, "\tCall Count: %-d", static_handle->tick.callCount); } p_str = mfx_trace_sprintf(p_str, len, "\n"); } } { p_str = mfx_trace_sprintf(p_str, len, "\n"); } fprintf(g_mfxTracePrintfFile, "%s", str); fflush(g_mfxTracePrintfFile); return 0; } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_BeginTask(mfxTraceStaticHandle *static_handle, const char *file_name, mfxTraceU32 line_num, const char *function_name, mfxTraceChar* category, mfxTraceLevel level, const char *task_name, const mfxTraceTaskType /*task_type*/, mfxTraceTaskHandle* handle, const void * /*task_params*/) { if (handle) { handle->fd1.str = (char*)file_name; handle->fd2.uint32 = line_num; handle->fd3.str = (char*)function_name; handle->fd4.str = (char*)task_name; } return MFXTraceTextLog_DebugMessage(static_handle, file_name, line_num, function_name, category, level, task_name, (task_name)? ": ENTER": "ENTER"); } /*------------------------------------------------------------------------------*/ mfxTraceU32 MFXTraceTextLog_EndTask(mfxTraceStaticHandle *static_handle, mfxTraceTaskHandle *handle) { if (!handle) return 1; char *file_name = NULL, *function_name = NULL, *task_name = NULL; mfxTraceU32 line_num = 0; mfxTraceChar* category = NULL; mfxTraceLevel level = MFX_TRACE_LEVEL_DEFAULT; if (handle) { category = static_handle->category; level = static_handle->level; file_name = handle->fd1.str; line_num = handle->fd2.uint32; function_name = handle->fd3.str; task_name = handle->fd4.str; } return MFXTraceTextLog_DebugMessage(static_handle, file_name, line_num, function_name, category, level, task_name, (task_name)? ": EXIT": "EXIT"); } } // extern "C" #endif // #ifdef MFX_TRACE_ENABLE_TEXTLOG oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_utils.cpp000066400000000000000000000040361443134507600306410ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace_utils.h" #ifdef MFX_TRACE_ENABLE extern "C" { /*------------------------------------------------------------------------------*/ char* mfx_trace_vsprintf(char* str, size_t& str_size, const char* format, va_list args) { char* p_str = str; if (str_size > 0) { p_str += vsnprintf(str, str_size, format, args); str_size -= p_str-str; } return p_str; } /*------------------------------------------------------------------------------*/ char* mfx_trace_sprintf(char* str, size_t& str_size, const char* format, ...) { va_list args; va_start(args, format); str = mfx_trace_vsprintf(str, str_size, format, args); va_end(args); return str; } /*------------------------------------------------------------------------------*/ int mfx_trace_tcmp(const mfxTraceChar* str1, const mfxTraceChar* str2) { return strcmp(str1, str2); } } // extern "C" #endif // #ifdef MFX_TRACE_ENABLE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/mfx_trace/src/mfx_trace_utils_linux.cpp000066400000000000000000000070611443134507600320610ustar00rootroot00000000000000// Copyright (c) 2011-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_trace_utils.h" #include #include #ifdef MFX_TRACE_ENABLE inline std::string& trim_string(std::string&& s) { // Remove leading spaces, tabulation, = character size_t pos = s.find_first_not_of(" =\t"); if (pos != std::string::npos) s.erase(0, pos); // Remove trailing spaces, tabulation, newline symbol, spaces pos = s.find_last_not_of(" \t\n\r\f\v"); if (pos != std::string::npos) s.erase(pos + 1); return s; } std::string mfx_trace_get_value(FILE* file, const char* pName) { if (!file || !pName) return std::string(""); char line[MAX_PATH] = {0}, *s = nullptr; std::string str, str_name(pName); while ((s = fgets(line, MAX_PATH, file))) { str = s; size_t pos = str.find(str_name); if (pos != std::string::npos) { pos += str_name.size(); return trim_string(str.substr(pos)); } } return std::string(""); } extern "C" { #include FILE* mfx_trace_open_conf_file(const char* name) { FILE* file = nullptr; std::stringstream ss; #if defined(ANDROID) const char* home = "/data/data/com.intel.vtune/mediasdk"; #else const char* home = getenv("HOME"); #endif if (home) { ss << home << "/." << name; file = fopen(ss.str().c_str(), "r"); } if (!file) { ss << MFX_TRACE_CONFIG_PATH << "/" << name; file = fopen(ss.str().c_str(), "r"); } return file; } mfxTraceU32 mfx_trace_get_conf_dword(FILE* file, const char* pName, mfxTraceU32* pValue) { std::string value_from_file = mfx_trace_get_value(file, pName); if (value_from_file.empty()) return 1; if (!value_from_file.compare(0, 2, "0x")) { std::stringstream(value_from_file.substr(2)) >> std::hex >> *pValue; } else { *pValue = std::stoi(value_from_file); } return 0; } mfxTraceU32 mfx_trace_get_conf_string(FILE* file, const char* pName, mfxTraceChar* pValue, mfxTraceU32 cValueMaxSize) { std::string value_from_file = mfx_trace_get_value(file, pName); if (value_from_file.empty()) return 1; if (cValueMaxSize > 0) std::strncpy(pValue, value_from_file.c_str(), cValueMaxSize-1); return 0; } } // extern "C" #endif // #ifdef MFX_TRACE_ENABLE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/000077500000000000000000000000001443134507600227725ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/fast_copy.cpp000066400000000000000000000045411443134507600254710ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "fast_copy.h" #define FAFT_COPY_CPU_DISP_INIT_C(func) (func ## _C) #define FAFT_COPY_CPU_DISP_INIT_SSE4(func) (func ## _SSE4) #define FAFT_COPY_CPU_DISP_INIT_SSE4_C(func) (m_SSE4_available ? FAFT_COPY_CPU_DISP_INIT_SSE4(func) : FAFT_COPY_CPU_DISP_INIT_C(func)) mfxI32 CpuFeature_SSE41() { return((__builtin_cpu_supports("sse4.1"))); } void copyVideoToSys(const mfxU8* src, mfxU8* dst, int width) { static const int m_SSE4_available = CpuFeature_SSE41(); static const t_copyVideoToSys copyVideoToSys_impl = FAFT_COPY_CPU_DISP_INIT_SSE4_C(copyVideoToSys); copyVideoToSys_impl(src, dst, width); } void copyVideoToSysShift(const mfxU16* src, mfxU16* dst, int width, int shift) { static const int m_SSE4_available = CpuFeature_SSE41(); static const t_copyVideoToSysShift copyVideoToSysShift_impl = FAFT_COPY_CPU_DISP_INIT_SSE4_C(copyVideoToSysShift); copyVideoToSysShift_impl(src, dst, width, shift); } void copySysToVideoShift(const mfxU16* src, mfxU16* dst, int width, int shift) { static const int m_SSE4_available = CpuFeature_SSE41(); static const t_copySysToVideoShift copySysToVideoShift_impl = FAFT_COPY_CPU_DISP_INIT_SSE4_C(copySysToVideoShift); copySysToVideoShift_impl(src, dst, width, shift); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/fast_copy_c_impl.cpp000066400000000000000000000031661443134507600270160ustar00rootroot00000000000000/*////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. */ #include "fast_copy_c_impl.h" void copyVideoToSys_C(const mfxU8* src, mfxU8* dst, int width) { std::copy(src, src + width, dst); } void copyVideoToSysShift_C(const mfxU16* src, mfxU16* dst, int width, int shift) { for (int i = 0; i < width; i++) *dst++ = (*src++) >> shift; } void copySysToVideoShift_C(const mfxU16* src, mfxU16* dst, int width, int shift) { for (int i = 0; i < width; i++) *dst++ = (*src++) << shift; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/fast_copy_multithreading.cpp000066400000000000000000000144501443134507600305710ustar00rootroot00000000000000// Copyright (c) 2009-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "fast_copy.h" #include "umc_event.h" #include #include "libmfx_allocator.h" struct FC_TASK { // pointers to source and destination Ipp8u *pS; Ipp8u *pD; // size of chunk to copy Ipp32u chunkSize; // pitches and frame size IppiSize roi; Ipp32u srcPitch, dstPitch; int flag; // event handles UMC::Event EventStart; UMC::Event EventEnd; }; class FastCopyMultithreading : public FastCopy { public: // constructor FastCopyMultithreading(void); // destructor virtual ~FastCopyMultithreading(void); // initialize available functionality mfxStatus Initialize(void); // release object mfxStatus Release(void); // copy memory by streaming mfxStatus Copy(mfxU8 *pDst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, IppiSize roi, int flag); protected: // synchronize threads mfxStatus Synchronize(void); static mfxU32 __STDCALL CopyByThread(void *object); static IppBool m_bCopyQuit; // handles std::thread *m_pThreads; Ipp32u m_numThreads; FC_TASK *m_tasks; }; IppBool FastCopyMultithreading::m_bCopyQuit = ippFalse; FastCopyMultithreading::FastCopyMultithreading(void) { m_pThreads = NULL; m_tasks = NULL; m_numThreads = 0; } // FastCopy::FastCopy(void) FastCopyMultithreading::~FastCopyMultithreading(void) { Release(); } // FastCopy::~FastCopy(void) mfxStatus FastCopyMultithreading::Initialize(void) { mfxStatus sts = MFX_ERR_NONE; mfxU32 i = 0; // release object before allocation Release(); if (MFX_ERR_NONE == sts) { // streaming is on m_numThreads = 1; } if (MFX_ERR_NONE == sts) { m_pThreads = new std::thread[m_numThreads]; m_tasks = new FC_TASK[m_numThreads]; if (!m_pThreads || !m_tasks) sts = MFX_ERR_MEMORY_ALLOC; } // initialize events for (i = 0; (MFX_ERR_NONE == sts) && (i < m_numThreads - 1); i += 1) { if (UMC::UMC_OK != m_tasks[i].EventStart.Init(0, 0)) { sts = MFX_ERR_UNKNOWN; } if (UMC::UMC_OK != m_tasks[i].EventEnd.Init(0, 0)) { sts = MFX_ERR_UNKNOWN; } } // run threads for (i = 0; (MFX_ERR_NONE == sts) && (i < m_numThreads - 1); i += 1) { m_pThreads[i] = std::thread([this, i]() { CopyByThread((void *)(m_tasks + i)); }); } return MFX_ERR_NONE; } // mfxStatus FastCopy::Initialize(void) mfxStatus FastCopyMultithreading::Release(void) { m_bCopyQuit = ippTrue; if ((m_numThreads > 1) && m_tasks && m_pThreads) { // set event for (mfxU32 i = 0; i < m_numThreads - 1; i += 1) { m_tasks[i].EventStart.Set(); if (m_pThreads[i].joinable()) m_pThreads[i].join(); } } m_numThreads = 0; if (m_pThreads) { delete [] m_pThreads; m_pThreads = NULL; } if (m_tasks) { delete [] m_tasks; m_tasks = NULL; } m_bCopyQuit = ippFalse; return MFX_ERR_NONE; } // mfxStatus FastCopy::Release(void) mfxStatus FastCopyMultithreading::Copy(mfxU8 *pDst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, IppiSize roi, int flag) { if (NULL == pDst || NULL == pSrc) { return MFX_ERR_NULL_PTR; } mfxU32 partSize = roi.height / m_numThreads; mfxU32 rest = roi.height % m_numThreads; roi.height = partSize; // distribute tasks for (mfxU32 i = 0; i < m_numThreads - 1; i += 1) { m_tasks[i].pS = pSrc + i * (partSize * srcPitch); m_tasks[i].pD = pDst + i * (partSize * dstPitch); m_tasks[i].srcPitch = srcPitch; m_tasks[i].dstPitch = dstPitch; m_tasks[i].roi = roi; m_tasks[i].flag = flag; m_tasks[i].EventStart.Set(); } if (rest != 0) { roi.height = rest; } pSrc = pSrc + (m_numThreads - 1) * (partSize * srcPitch); pDst = pDst + (m_numThreads - 1) * (partSize * dstPitch); FastCopy::Copy(pDst, dstPitch, pSrc, srcPitch, roi, flag); Synchronize(); return MFX_ERR_NONE; } // mfxStatus FastCopy::Copy(mfxU8 *pDst, mfxU32 dstPitch, mfxU8 *pSrc, mfxU32 srcPitch, IppiSize roi) mfxStatus FastCopyMultithreading::Synchronize(void) { for (mfxU32 i = 0; i < m_numThreads - 1; i += 1) { m_tasks[i].EventEnd.Wait(); } return MFX_ERR_NONE; } // mfxStatus FastCopy::Synchronize(void) // thread function mfxU32 __STDCALL FastCopyMultithreading::CopyByThread(void *arg) { FC_TASK *task = (FC_TASK *)arg; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "ThreadName=FastCopy"); // wait to event task->EventStart.Wait(); while (!m_bCopyQuit) { mfxU32 srcPitch = task->srcPitch; mfxU32 dstPitch = task->dstPitch; IppiSize roi = task->roi; Ipp8u *pSrc = task->pS; Ipp8u *pDst = task->pD; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "FastCopy::Copy"); FastCopy::Copy(pDst, dstPitch, pSrc, srcPitch, roi, task->flag); } // done copy task->EventEnd.Set(); // wait for the next frame task->EventStart.Wait(); } return 0; } // mfxU32 __stdcall FastCopyMultithreading::CopyByThread(void *arg) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/fast_copy_sse4_impl.cpp000066400000000000000000000141551443134507600274520ustar00rootroot00000000000000/*////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. */ #include "fast_copy_sse4_impl.h" #include "mfx_config.h" #if defined(MFX_SSE_4_1) #include void copyVideoToSys_SSE4(const mfxU8* src, mfxU8* dst, int width) { static const int item_size = 4*sizeof(__m128i); int align16 = (0x10 - (reinterpret_cast(src) & 0xf)) & 0xf; for (int i = 0; i < align16; i++) *dst++ = *src++; int w = width - align16; if (w < 0) return; int width4 = w & (-item_size); __m128i * src_reg = (__m128i *)src; __m128i * dst_reg = (__m128i *)dst; int i = 0; for (; i < width4; i += item_size) { __m128i xmm0 = _mm_stream_load_si128(src_reg); __m128i xmm1 = _mm_stream_load_si128(src_reg+1); __m128i xmm2 = _mm_stream_load_si128(src_reg+2); __m128i xmm3 = _mm_stream_load_si128(src_reg+3); _mm_storeu_si128(dst_reg, xmm0); _mm_storeu_si128(dst_reg+1, xmm1); _mm_storeu_si128(dst_reg+2, xmm2); _mm_storeu_si128(dst_reg+3, xmm3); src_reg += 4; dst_reg += 4; } size_t tail_data_sz = w & (item_size - 1); if (tail_data_sz) { for (; tail_data_sz >= sizeof(__m128i); tail_data_sz -= sizeof(__m128i)) { __m128i xmm0 = _mm_stream_load_si128(src_reg); _mm_storeu_si128(dst_reg, xmm0); src_reg += 1; dst_reg += 1; } src = (const mfxU8 *)src_reg; dst = (mfxU8 *)dst_reg; for (; tail_data_sz > 0; tail_data_sz--) *dst++ = *src++; } } void copyVideoToSysShift_SSE4(const mfxU16* src, mfxU16* dst, int width, int shift) { static const int item_size = 4 * sizeof(__m128i); int align16 = (0x10 - (reinterpret_cast((mfxU8*)src) & 0xf)) & 0xf; for (int i = 0; i < align16/2; i++) *dst++ = (*src++)>>shift; int w = width*2 - align16; if (w < 0) return; int width4 = w & (-item_size); __m128i * src_reg = (__m128i *)src; __m128i * dst_reg = (__m128i *)dst; int i = 0; for (; i < width4; i += item_size) { __m128i xmm0 = _mm_stream_load_si128(src_reg); __m128i xmm1 = _mm_stream_load_si128(src_reg + 1); __m128i xmm2 = _mm_stream_load_si128(src_reg + 2); __m128i xmm3 = _mm_stream_load_si128(src_reg + 3); __m128i xmm4 = _mm_srli_epi16(xmm0, shift); __m128i xmm5 = _mm_srli_epi16(xmm1, shift); __m128i xmm6 = _mm_srli_epi16(xmm2, shift); __m128i xmm7 = _mm_srli_epi16(xmm3, shift); _mm_storeu_si128(dst_reg, xmm4); _mm_storeu_si128(dst_reg + 1, xmm5); _mm_storeu_si128(dst_reg + 2, xmm6); _mm_storeu_si128(dst_reg + 3, xmm7); src_reg += 4; dst_reg += 4; } size_t tail_data_sz = w & (item_size - 1); if (tail_data_sz) { for (; tail_data_sz >= sizeof(__m128i); tail_data_sz -= sizeof(__m128i)) { __m128i xmm0 = _mm_stream_load_si128(src_reg); __m128i xmm1 = _mm_srli_epi16(xmm0, shift); _mm_storeu_si128(dst_reg, xmm1); src_reg += 1; dst_reg += 1; } src = (const mfxU16 *)src_reg; dst = (mfxU16 *)dst_reg; for (; tail_data_sz > 0; tail_data_sz--) *dst++ = (*src++)>>shift; } } void copySysToVideoShift_SSE4(const mfxU16* src, mfxU16* dst, int width, int shift) { static const int item_size = 4 * sizeof(__m128i); int align16 = (0x10 - (reinterpret_cast((mfxU8*)src) & 0xf)) & 0xf; for (int i = 0; i < align16; i++) *dst++ = (*src++)<< shift; int w = width*2 - align16; if (w < 0) return; int width4 = w & (-item_size); __m128i * src_reg = (__m128i *)src; __m128i * dst_reg = (__m128i *)dst; int i = 0; for (; i < width4; i += item_size) { __m128i xmm0 = _mm_load_si128(src_reg); __m128i xmm1 = _mm_load_si128(src_reg + 1); __m128i xmm2 = _mm_load_si128(src_reg + 2); __m128i xmm3 = _mm_load_si128(src_reg + 3); __m128i xmm4 = _mm_slli_epi32(xmm0, shift); __m128i xmm5 = _mm_slli_epi32(xmm1, shift); __m128i xmm6 = _mm_slli_epi32(xmm2, shift); __m128i xmm7 = _mm_slli_epi32(xmm3, shift); _mm_storeu_si128(dst_reg, xmm4); _mm_storeu_si128(dst_reg + 1, xmm5); _mm_storeu_si128(dst_reg + 2, xmm6); _mm_storeu_si128(dst_reg + 3, xmm7); src_reg += 4; dst_reg += 4; } size_t tail_data_sz = w & (item_size - 1); if (tail_data_sz) { for (; tail_data_sz >= sizeof(__m128i); tail_data_sz -= sizeof(__m128i)) { __m128i xmm0 = _mm_load_si128(src_reg); __m128i xmm1 = _mm_slli_epi32(xmm0, shift); _mm_storeu_si128(dst_reg, xmm1); src_reg += 1; dst_reg += 1; } src = (const mfxU16 *)src_reg; dst = (mfxU16 *)dst_reg; for (; tail_data_sz > 0; tail_data_sz--) *dst++ = (*src++)< #define ALIGN32(X) (((mfxU32)((X)+31)) & (~ (mfxU32)31)) #define ID_BUFFER MFX_MAKEFOURCC('B','U','F','F') #define ID_FRAME MFX_MAKEFOURCC('F','R','M','E') #define ERROR_STATUS(sts) ((sts)allocator = pthis; bs->id = ID_BUFFER; bs->type = type; bs->nbytes = nbytes; // save index { mfxWideBufferAllocator* pBA = (mfxWideBufferAllocator*)pthis; pBA->m_bufHdl.push_back(bs); *mid = (mfxHDL) pBA->m_bufHdl.size(); } return MFX_ERR_NONE; } inline size_t midToSizeT(mfxHDL mid) { return ((Ipp8u *) mid - (Ipp8u *) 0); } // size_t midToSizeT(mfxHDL mid) mfxStatus mfxDefaultAllocator::LockBuffer(mfxHDL pthis, mfxHDL mid, mfxU8 **ptr) { //BufferStruct *bs=(BufferStruct *)mid; BufferStruct *bs; try { size_t index = midToSizeT(mid); if (!pthis) return MFX_ERR_INVALID_HANDLE; mfxWideBufferAllocator* pBA = (mfxWideBufferAllocator*)pthis; if ((index > pBA->m_bufHdl.size())|| (index == 0)) return MFX_ERR_INVALID_HANDLE; bs = pBA->m_bufHdl[index - 1]; } catch (...) { return MFX_ERR_INVALID_HANDLE; } if (ptr) *ptr = UMC::align_pointer((mfxU8 *)bs + ALIGN32(sizeof(BufferStruct)), DEFAULT_ALIGNMENT_SIZE); return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::UnlockBuffer(mfxHDL pthis, mfxHDL mid) { try { if (!pthis) return MFX_ERR_INVALID_HANDLE; BufferStruct *bs; size_t index = midToSizeT(mid); mfxWideBufferAllocator* pBA = (mfxWideBufferAllocator*)pthis; if (index > pBA->m_bufHdl.size()) return MFX_ERR_INVALID_HANDLE; bs = pBA->m_bufHdl[index - 1]; if (bs->id!=ID_BUFFER) return MFX_ERR_INVALID_HANDLE; } catch (...) { return MFX_ERR_INVALID_HANDLE; } return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::FreeBuffer(mfxHDL pthis, mfxMemId mid) { try { if (!pthis) return MFX_ERR_INVALID_HANDLE; BufferStruct *bs; size_t index = midToSizeT(mid); mfxWideBufferAllocator* pBA = (mfxWideBufferAllocator*)pthis; if (index > pBA->m_bufHdl.size()) return MFX_ERR_INVALID_HANDLE; bs = pBA->m_bufHdl[index - 1]; if (bs->id!=ID_BUFFER) return MFX_ERR_INVALID_HANDLE; if (bs->id!=ID_BUFFER) return MFX_ERR_INVALID_HANDLE; free(bs); return MFX_ERR_NONE; } catch (...) { return MFX_ERR_INVALID_HANDLE; } } mfxStatus mfxDefaultAllocator::GetSurfaceSizeInBytes(mfxU32 pitch, mfxU32 height, mfxU32 fourCC, mfxU32& nBytes) { switch (fourCC) { case MFX_FOURCC_YV12: case MFX_FOURCC_NV12: case MFX_FOURCC_P010: case MFX_FOURCC_P016: nBytes = pitch * height + (pitch >> 1) * (height >> 1) + (pitch >> 1) * (height >> 1); break; case MFX_FOURCC_P210: case MFX_FOURCC_YUY2: case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: nBytes = pitch * height + (pitch >> 1) * height + (pitch >> 1) * height; break; case MFX_FOURCC_RGB3: case MFX_FOURCC_RGBP: case MFX_FOURCC_BGRP: nBytes = pitch * height + pitch * height + pitch * height; break; case MFX_FOURCC_RGB565: nBytes = 2 * pitch * height; break; case MFX_FOURCC_BGR4: case MFX_FOURCC_RGB4: case MFX_FOURCC_AYUV: case MFX_FOURCC_A2RGB10: nBytes = pitch * height + pitch * height + pitch * height + pitch * height; break; case MFX_FOURCC_Y410: case MFX_FOURCC_Y416: case MFX_FOURCC_P8: case MFX_FOURCC_P8_TEXTURE: nBytes = pitch * height; break; case MFX_FOURCC_IMC3: nBytes = pitch * height + pitch * (height >> 1) + pitch * (height >> 1); break; case MFX_FOURCC_ABGR16F: nBytes = (pitch * height + pitch * height + pitch * height + pitch * height) * 2; break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); break; } return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::GetNumBytesRequired(const mfxFrameInfo & Info, mfxU32& nbytes, size_t power_of_2_alignment) { mfxU32 Pitch = mfx::align2_value(Info.Width, 32), Height2 = mfx::align2_value(Info.Height, 32); MFX_CHECK(Pitch, MFX_ERR_MEMORY_ALLOC); MFX_CHECK(Height2, MFX_ERR_MEMORY_ALLOC); // Decoders and Encoders use YV12 and NV12 only switch (Info.FourCC) { case MFX_FOURCC_P010: case MFX_FOURCC_P016: case MFX_FOURCC_P210: case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: Pitch = mfx::align2_value(Info.Width * 2, 32); break; case MFX_FOURCC_Y410: Pitch = mfx::align2_value(Info.Width * 4, 32); break; case MFX_FOURCC_Y416: Pitch = mfx::align2_value(Info.Width * 8, 32); break; default: break; } MFX_SAFE_CALL(mfxDefaultAllocator::GetSurfaceSizeInBytes(Pitch, Height2, Info.FourCC, nbytes)); // Allocate SW memmory with page aligned size nbytes = mfx::align2_value(nbytes, power_of_2_alignment); return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::AllocFrames(mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) { if (!pthis) return MFX_ERR_INVALID_HANDLE; mfxU32 numAllocated, maxNumFrames; mfxWideSWFrameAllocator *pSelf = (mfxWideSWFrameAllocator*)pthis; // frames were allocated // return existent frames if (pSelf->NumFrames) { if (request->NumFrameSuggested > pSelf->NumFrames) return MFX_ERR_MEMORY_ALLOC; else { response->mids = &pSelf->m_frameHandles[0]; return MFX_ERR_NONE; } } mfxU32 nbytes = 0; mfxStatus sts = mfxDefaultAllocator::GetNumBytesRequired(request->Info, nbytes); MFX_CHECK_STS(sts); // allocate frames in cycle maxNumFrames = request->NumFrameSuggested; pSelf->m_frameHandles.resize(request->NumFrameSuggested); for (numAllocated = 0; numAllocated < maxNumFrames; numAllocated += 1) { sts = (pSelf->wbufferAllocator.bufferAllocator.Alloc)(pSelf->wbufferAllocator.bufferAllocator.pthis, nbytes + ALIGN32(sizeof(FrameStruct)), request->Type, &pSelf->m_frameHandles[numAllocated]); if (ERROR_STATUS(sts)) break; FrameStruct *fs; sts = (pSelf->wbufferAllocator.bufferAllocator.Lock)(pSelf->wbufferAllocator.bufferAllocator.pthis, pSelf->m_frameHandles[numAllocated], (mfxU8 **)&fs); if (ERROR_STATUS(sts)) break; fs->id = ID_FRAME; fs->info = request->Info; (pSelf->wbufferAllocator.bufferAllocator.Unlock)(pSelf->wbufferAllocator.bufferAllocator.pthis, pSelf->m_frameHandles[numAllocated]); } response->mids = &pSelf->m_frameHandles[0]; response->NumFrameActual = (mfxU16) numAllocated; // check the number of allocated frames if (numAllocated < request->NumFrameMin) { FreeFrames(pSelf, response); return MFX_ERR_MEMORY_ALLOC; } pSelf->NumFrames = maxNumFrames; return MFX_ERR_NONE; } static inline std::pair pitch_from_width(mfxU32 width, mfxU32 multiplier) { mfxU32 pitch = multiplier * mfx::align2_value(width, 32u); return { mfxU16(pitch >> 16), mfxU16(pitch & 0xffff) }; } static inline mfxStatus SetPointers(mfxFrameData& frame_data, const mfxFrameInfo & info, mfxU8* bytes) { clear_frame_data(frame_data); mfxU32 Height2 = mfx::align2_value(info.Height, 32u); switch (info.FourCC) { case MFX_FOURCC_NV12: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 1u); frame_data.Y = bytes; frame_data.U = frame_data.Y + frame_data.Pitch*Height2; frame_data.V = frame_data.U + 1; break; case MFX_FOURCC_P010: case MFX_FOURCC_P016: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 2u); frame_data.Y = bytes; frame_data.U = frame_data.Y + frame_data.Pitch*Height2; frame_data.V = frame_data.U + 2; break; case MFX_FOURCC_P210: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 2u); frame_data.Y = bytes; frame_data.U = frame_data.Y + frame_data.Pitch*Height2; frame_data.V = frame_data.U + 2; break; case MFX_FOURCC_YV12: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 1u); frame_data.Y = bytes; frame_data.V = frame_data.Y + frame_data.Pitch*Height2; frame_data.U = frame_data.V + (frame_data.Pitch >> 1)*(Height2 >> 1); break; case MFX_FOURCC_YUY2: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 2u); frame_data.Y = bytes; frame_data.U = frame_data.Y + 1; frame_data.V = frame_data.Y + 3; break; case MFX_FOURCC_UYVY: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 2u); frame_data.U = bytes; frame_data.Y = frame_data.Y + 1; frame_data.V = frame_data.Y + 2; break; #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 2u); frame_data.B = bytes; frame_data.G = frame_data.B; frame_data.R = frame_data.B; break; #endif case MFX_FOURCC_RGB3: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 3u); frame_data.B = bytes; frame_data.G = frame_data.B + 1; frame_data.R = frame_data.B + 2; break; #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 1u); frame_data.R = bytes; frame_data.G = frame_data.R + frame_data.Pitch*Height2; frame_data.B = frame_data.R + 2*frame_data.Pitch*Height2; break; #endif case MFX_FOURCC_BGRP: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 1u); frame_data.B = bytes; frame_data.G = frame_data.B + frame_data.Pitch*Height2; frame_data.R = frame_data.B + 2 * frame_data.Pitch*Height2; break; case MFX_FOURCC_RGB4: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.B = bytes; frame_data.G = frame_data.B + 1; frame_data.R = frame_data.B + 2; frame_data.A = frame_data.B + 3; break; case MFX_FOURCC_BGR4: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.R = bytes; frame_data.G = frame_data.R + 1; frame_data.B = frame_data.R + 2; frame_data.A = frame_data.R + 3; break; case MFX_FOURCC_A2RGB10: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.R = frame_data.G = frame_data.B = frame_data.A = bytes; break; case MFX_FOURCC_P8: // Linear data buffer, so pitch is the size of buffer std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, Height2); frame_data.Y = bytes; break; case MFX_FOURCC_P8_TEXTURE: // 2-D data buffer, so pitch is width of picture std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 1u); frame_data.Y = bytes; break; case MFX_FOURCC_AYUV: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.V = bytes; frame_data.U = frame_data.V + 1; frame_data.Y = frame_data.V + 2; frame_data.A = frame_data.V + 3; break; case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.Y16 = (mfxU16*)bytes; frame_data.U16 = frame_data.Y16 + 1; frame_data.V16 = frame_data.Y16 + 3; break; case MFX_FOURCC_Y410: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 4u); frame_data.Y410 = (mfxY410*)bytes; break; case MFX_FOURCC_Y416: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 8u); frame_data.U16 = (mfxU16*)bytes; frame_data.Y16 = frame_data.U16 + 1; frame_data.V16 = frame_data.Y16 + 1; frame_data.A = (mfxU8 *)(frame_data.V16 + 1); break; case MFX_FOURCC_ABGR16F: std::tie(frame_data.PitchHigh, frame_data.PitchLow) = pitch_from_width(info.Width, 8u); frame_data.R = frame_data.G = frame_data.B = frame_data.A = bytes; break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::LockFrame(mfxHDL pthis, mfxHDL mid, mfxFrameData *ptr) { if (!pthis) return MFX_ERR_INVALID_HANDLE; mfxWideSWFrameAllocator *pSelf = (mfxWideSWFrameAllocator*)pthis; // The default LockFrame is to simulate using LockBuffer. FrameStruct *fs; mfxStatus sts = (pSelf->wbufferAllocator.bufferAllocator.Lock)(pSelf->wbufferAllocator.bufferAllocator.pthis, mid,(mfxU8 **)&fs); if (ERROR_STATUS(sts)) return sts; if (fs->id!=ID_FRAME) { (pSelf->wbufferAllocator.bufferAllocator.Unlock)(pSelf->wbufferAllocator.bufferAllocator.pthis, mid); return MFX_ERR_INVALID_HANDLE; } //ptr->MemId = mid; !!!!!!!!!!!!!!!!!!!!!!!!! mfxU8 *sptr = (mfxU8 *)fs+mfx::align2_value(sizeof(FrameStruct), 32); return SetPointers(*ptr, fs->info, sptr); } mfxStatus mfxDefaultAllocator::GetHDL(mfxHDL pthis, mfxMemId mid, mfxHDL *handle) { if (!pthis) return MFX_ERR_INVALID_HANDLE; *handle = mid; return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocator::UnlockFrame(mfxHDL pthis, mfxHDL mid, mfxFrameData *ptr) { if (!pthis) return MFX_ERR_INVALID_HANDLE; mfxWideSWFrameAllocator *pSelf = (mfxWideSWFrameAllocator*)pthis; // The default UnlockFrame behavior is to simulate using UnlockBuffer mfxStatus sts = (pSelf->wbufferAllocator.bufferAllocator.Unlock)(pSelf->wbufferAllocator.bufferAllocator.pthis, mid); if (ERROR_STATUS(sts)) return sts; if (ptr) { ptr->PitchHigh=0; ptr->PitchLow=0; ptr->U=ptr->V=ptr->Y=nullptr; ptr->A=ptr->R=ptr->G=ptr->B=nullptr; } return sts; } // mfxStatus SWVideoCORE::UnlockFrame(mfxHDL mid, mfxFrameData *ptr) mfxStatus mfxDefaultAllocator::FreeFrames(mfxHDL pthis, mfxFrameAllocResponse *response) { if (!pthis) return MFX_ERR_INVALID_HANDLE; mfxWideSWFrameAllocator *pSelf = (mfxWideSWFrameAllocator*)pthis; mfxU32 i; // free all allocated frames in cycle for (i = 0; i < response->NumFrameActual; i += 1) { if (response->mids[i]) { (pSelf->wbufferAllocator.bufferAllocator.Free)(pSelf->wbufferAllocator.bufferAllocator.pthis, response->mids[i]); } } pSelf->m_frameHandles.clear(); return MFX_ERR_NONE; } // mfxStatus SWVideoCORE::FreeFrames(void) mfxWideBufferAllocator::mfxWideBufferAllocator() { memset(bufferAllocator.reserved, 0, sizeof(bufferAllocator.reserved)); bufferAllocator.Alloc = &mfxDefaultAllocator::AllocBuffer; bufferAllocator.Lock = &mfxDefaultAllocator::LockBuffer; bufferAllocator.Unlock = &mfxDefaultAllocator::UnlockBuffer; bufferAllocator.Free = &mfxDefaultAllocator::FreeBuffer; bufferAllocator.pthis = 0; } mfxWideBufferAllocator::~mfxWideBufferAllocator() { memset((void*)&bufferAllocator, 0, sizeof(mfxBufferAllocator)); } mfxBaseWideFrameAllocator::mfxBaseWideFrameAllocator(mfxU16 type) : NumFrames(0) , type(type) { memset((void*)&frameAllocator, 0, sizeof(frameAllocator)); } mfxBaseWideFrameAllocator::~mfxBaseWideFrameAllocator() { memset((void*)&frameAllocator, 0, sizeof(mfxFrameAllocator)); } mfxWideSWFrameAllocator::mfxWideSWFrameAllocator(mfxU16 type):mfxBaseWideFrameAllocator(type) { frameAllocator.Alloc = &mfxDefaultAllocator::AllocFrames; frameAllocator.Lock = &mfxDefaultAllocator::LockFrame; frameAllocator.GetHDL = &mfxDefaultAllocator::GetHDL; frameAllocator.Unlock = &mfxDefaultAllocator::UnlockFrame; frameAllocator.Free = &mfxDefaultAllocator::FreeFrames; } std::atomic FrameAllocatorBase::m_allocator_num(0u); mfxStatus FrameAllocatorBase::Synchronize(mfxSyncPoint sp, mfxU32 timeout) { if (sp == nullptr) return MFX_ERR_NONE; MFX_CHECK(m_session != nullptr, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_HDL(m_session->m_pScheduler); mfxStatus sts = MFXVideoCORE_SyncOperation(m_session, sp, timeout); // We ignore nullptr sts because in this case mfxFrameSurface1 has been already synchronized MFX_RETURN(sts != MFX_ERR_NULL_PTR ? sts : MFX_ERR_NONE); } mfxStatus RWAcessSurface::LockRW(std::unique_lock& guard, bool write, bool nowait) { if (write) { // Try to lock for write, if not succeeded - return MFX_CHECK(!Locked(), MFX_ERR_LOCK_MEMORY); m_write_lock = true; } else { if (m_write_lock) { // If there exists lock for write - and nowait is set, return error; otherwise wait untill writing finished MFX_CHECK(!nowait, MFX_ERR_RESOURCE_MAPPED); m_wait_before_read.wait(guard, [this] { return !m_write_lock; }); } else if (!m_read_locks && !nowait) { guard.unlock(); MFX_SAFE_CALL(mfxFrameSurfaceBaseInterface::Synchronize(MFX_INFINITE)); guard.lock(); } ++m_read_locks; } return MFX_ERR_NONE; } mfxStatus RWAcessSurface::UnlockRW() { if (m_write_lock) { m_write_lock = false; m_wait_before_read.notify_all(); } else { // Check if this surface really was locked MFX_CHECK(m_read_locks, MFX_ERR_UNDEFINED_BEHAVIOR); --m_read_locks; } return MFX_ERR_NONE; } mfxFrameSurface1_sw::mfxFrameSurface1_sw(const mfxFrameInfo & info, mfxU16 type, mfxMemId mid, std::shared_ptr&, mfxHDL, mfxU32, FrameAllocatorBase& allocator) : RWAcessSurface(info, type, mid, allocator) , m_data(nullptr, free) { MFX_CHECK_WITH_THROW_STS(m_internal_surface.Data.MemType & MFX_MEMTYPE_SYSTEM_MEMORY, MFX_ERR_UNSUPPORTED); mfxU32 nbytes = 0; mfxStatus sts = mfxDefaultAllocator::GetNumBytesRequired(info, nbytes, BASE_SIZE_ALIGN); MFX_CHECK_WITH_THROW_STS(sts == MFX_ERR_NONE, sts); m_data.reset(reinterpret_cast(aligned_alloc(BASE_ADDR_ALIGN, nbytes))); MFX_CHECK_WITH_THROW_STS(m_data, MFX_ERR_MEMORY_ALLOC); } mfxStatus mfxFrameSurface1_sw::Lock(mfxU32 flags) { MFX_CHECK(FrameAllocatorBase::CheckMemoryFlags(flags), MFX_ERR_LOCK_MEMORY); std::unique_lock guard(m_mutex); mfxStatus sts = LockRW(guard, flags & MFX_MAP_WRITE, flags & MFX_MAP_NOWAIT); MFX_CHECK_STS(sts); auto Unlock = [](RWAcessSurface* s) { s->UnlockRW(); }; // Scope guard to decrease locked count if real lock fails std::unique_ptr scoped_lock(this, Unlock); if (NumReaders() < 2) { // First reader or unique writer has just acquired resource sts = SetPointers(m_internal_surface.Data, m_internal_surface.Info, m_data.get()); MFX_CHECK_STS(sts); } // No error, remove guard without decreasing locked counter scoped_lock.release(); return MFX_ERR_NONE; } mfxStatus mfxFrameSurface1_sw::Unlock() { std::unique_lock guard(m_mutex); MFX_SAFE_CALL(UnlockRW()); if (NumReaders() == 0) // So it was 1 before UnlockRW { clear_frame_data(m_internal_surface.Data); } return MFX_ERR_NONE; } mfxStatus mfxFrameSurface1_sw::Realloc(const mfxFrameInfo & info) { std::lock_guard guard(m_mutex); MFX_CHECK(!Locked(), MFX_ERR_LOCK_MEMORY); mfxU32 nbytes = 0; MFX_SAFE_CALL(mfxDefaultAllocator::GetNumBytesRequired(info, nbytes, BASE_SIZE_ALIGN)); m_data.reset(reinterpret_cast(aligned_alloc(BASE_ADDR_ALIGN, nbytes))); MFX_CHECK(m_data, MFX_ERR_MEMORY_ALLOC); m_internal_surface.Info = info; return SetPointers(m_internal_surface.Data, m_internal_surface.Info, m_data.get()); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/libmfx_allocator_vaapi.cpp000066400000000000000000001060401443134507600302000ustar00rootroot00000000000000// Copyright (c) 2007-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include #include #include "ippcore.h" #include "ipps.h" #include "libmfx_allocator_vaapi.h" #include "mfx_utils.h" #include "mfx_ext_buffers.h" /* These memory types and corresponding processing functions used not only by VP8 but for VP9 encoder as well. */ enum { MFX_FOURCC_VP8_NV12 = MFX_MAKEFOURCC('V','P','8','N'), MFX_FOURCC_VP8_MBDATA = MFX_MAKEFOURCC('V','P','8','M'), MFX_FOURCC_VP8_SEGMAP = MFX_MAKEFOURCC('V','P','8','S'), }; static inline mfxU32 ConvertVP8FourccToMfxFourcc(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_VP8_NV12: case MFX_FOURCC_VP8_MBDATA: return MFX_FOURCC_NV12; case MFX_FOURCC_VP8_SEGMAP: return MFX_FOURCC_P8; default: return fourcc; } } static inline mfxU32 ConvertMfxFourccToVAFormat(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: return VA_FOURCC_NV12; case MFX_FOURCC_YUY2: return VA_FOURCC_YUY2; case MFX_FOURCC_YV12: return VA_FOURCC_YV12; #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: return VA_FOURCC_RGB565; #endif case MFX_FOURCC_RGB4: return VA_FOURCC_ARGB; case MFX_FOURCC_BGR4: return VA_FOURCC_ABGR; case MFX_FOURCC_A2RGB10: return VA_FOURCC_ARGB; // rt format will be VA_RT_FORMAT_RGB32_10BPP #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: return VA_FOURCC_RGBP; #endif case MFX_FOURCC_BGRP: return VA_FOURCC_BGRP; case MFX_FOURCC_P8: return VA_FOURCC_P208; case MFX_FOURCC_UYVY: return VA_FOURCC_UYVY; case MFX_FOURCC_P010: return VA_FOURCC_P010; case MFX_FOURCC_AYUV: return VA_FOURCC_AYUV; case MFX_FOURCC_Y210: return VA_FOURCC_Y210; case MFX_FOURCC_Y410: return VA_FOURCC_Y410; case MFX_FOURCC_YUV400: return VA_FOURCC_Y800; case MFX_FOURCC_P016: return VA_FOURCC_P016; case MFX_FOURCC_Y216: return VA_FOURCC_Y216; case MFX_FOURCC_Y416: return VA_FOURCC_Y416; #if defined (DECODE_JPEG_ROTATION) case MFX_FOURCC_YUV422H: return VA_FOURCC_422H; case MFX_FOURCC_YUV422V: return VA_FOURCC_422V; #endif case MFX_FOURCC_I420: return VA_FOURCC_I420; default: return 0; } } static void FillSurfaceAttrs(std::vector &attrib, unsigned int &format, const mfxU32 fourcc, const mfxU32 va_fourcc, const mfxU32 memType) { attrib.clear(); attrib.reserve(2); attrib.resize(attrib.size()+1); attrib[0].type = VASurfaceAttribPixelFormat; attrib[0].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[0].value.type = VAGenericValueTypeInteger; attrib[0].value.value.i = va_fourcc; switch (fourcc) { case MFX_FOURCC_VP8_NV12: // special configuration for NV12 surf allocation for VP8 hybrid encoder is required attrib.resize(attrib.size()+1); attrib[1].type = VASurfaceAttribUsageHint; attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[1].value.type = VAGenericValueTypeInteger; attrib[1].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; format = va_fourcc; break; case MFX_FOURCC_VP8_MBDATA: // special configuration for MB data surf allocation for VP8 hybrid encoder is required attrib[0].value.value.i = VA_FOURCC_P208; format = VA_FOURCC_P208; break; case MFX_FOURCC_NV12: format = VA_RT_FORMAT_YUV420; break; case MFX_FOURCC_UYVY: case MFX_FOURCC_YUY2: format = VA_RT_FORMAT_YUV422; break; case MFX_FOURCC_A2RGB10: format = VA_RT_FORMAT_RGB32_10BPP; break; case MFX_FOURCC_YUV400: format = VA_RT_FORMAT_YUV400; // Enable this hint as required for creating YUV400 surface for JPEG. if ((memType & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) && (memType & MFX_MEMTYPE_FROM_DECODE)) { attrib.resize(attrib.size()+1); attrib[1].type = VASurfaceAttribUsageHint; attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[1].value.type = VAGenericValueTypeInteger; attrib[1].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_DECODER; } break; case MFX_FOURCC_RGBP: format = VA_RT_FORMAT_RGBP; // Enable this hint as required for creating RGBP surface for JPEG. if ((memType & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) && (memType & MFX_MEMTYPE_FROM_DECODE)) { attrib.resize(attrib.size()+1); attrib[1].type = VASurfaceAttribUsageHint; attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[1].value.type = VAGenericValueTypeInteger; attrib[1].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_DECODER; } break; case MFX_FOURCC_BGRP: format = VA_RT_FORMAT_RGBP; break; case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: format = VA_RT_FORMAT_RGB32; // Enable this hint as required for creating RGB32 surface for MJPEG. if ((memType & MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET) && (memType & MFX_MEMTYPE_FROM_ENCODE)) { // Input Attribute Usage Hint attrib.resize(attrib.size()+1); attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[1].type = VASurfaceAttribUsageHint; attrib[1].value.type = VAGenericValueTypeInteger; attrib[1].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; } break; default: format = va_fourcc; break; } } static inline bool isFourCCSupported(mfxU32 va_fourcc) { switch (va_fourcc) { case VA_FOURCC_NV12: case VA_FOURCC_YV12: case VA_FOURCC_YUY2: case VA_FOURCC_ARGB: case VA_FOURCC_ABGR: #ifdef MFX_ENABLE_RGBP case VA_FOURCC_RGBP: #endif case VA_FOURCC_BGRP: case VA_FOURCC_UYVY: case VA_FOURCC_P208: case VA_FOURCC_P010: case VA_FOURCC_AYUV: #if defined (MFX_ENABLE_FOURCC_RGB565) case VA_FOURCC_RGB565: #endif case VA_FOURCC_Y210: case VA_FOURCC_Y410: case VA_FOURCC_Y800: case VA_FOURCC_P016: case VA_FOURCC_Y216: case VA_FOURCC_Y416: #if defined (DECODE_JPEG_ROTATION) case VA_FOURCC_422H: case VA_FOURCC_422V: #endif case VA_FOURCC_I420: return true; default: return false; } } static mfxStatus ReallocImpl(VADisplay* va_disp, vaapiMemIdInt *vaapi_mid, mfxFrameSurface1 *surf) { MFX_CHECK_NULL_PTR3(va_disp, vaapi_mid, surf); MFX_CHECK_NULL_PTR1(vaapi_mid->m_surface); // VP8 hybrid driver has weird requirements for allocation of surfaces/buffers for VP8 encoding // to comply with them additional logic is required to support regular and VP8 hybrid allocation paths mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(surf->Info.FourCC); unsigned int va_fourcc = ConvertMfxFourccToVAFormat(mfx_fourcc); MFX_CHECK(isFourCCSupported(va_fourcc), MFX_ERR_UNSUPPORTED); VAStatus va_res = VA_STATUS_SUCCESS; if (MFX_FOURCC_P8 == vaapi_mid->m_fourcc) { mfxStatus sts = CheckAndDestroyVAbuffer(va_disp, *vaapi_mid->m_surface); MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_MEMORY_ALLOC); } else { va_res = vaDestroySurfaces(va_disp, vaapi_mid->m_surface, 1); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_MEMORY_ALLOC); *vaapi_mid->m_surface = VA_INVALID_ID; } std::vector attrib; unsigned int format; FillSurfaceAttrs(attrib, format, surf->Info.FourCC, va_fourcc, 0); va_res = vaCreateSurfaces(va_disp, format, surf->Info.Width, surf->Info.Height, vaapi_mid->m_surface, 1, attrib.data(), attrib.size()); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_MEMORY_ALLOC); // Update fourcc of reallocated element. VAid was updated automatically vaapi_mid->m_fourcc = surf->Info.FourCC; return MFX_ERR_NONE; } // aka AllocImpl(surface) mfxStatus mfxDefaultAllocatorVAAPI::ReallocFrameHW(mfxHDL pthis, mfxFrameSurface1 *surf, VASurfaceID *va_surf) { MFX_CHECK_NULL_PTR3(pthis, surf, va_surf); mfxWideHWFrameAllocator *self = reinterpret_cast(pthis); auto it = std::find_if(std::begin(self->m_frameHandles), std::end(self->m_frameHandles), [va_surf](mfxHDL hndl){ return hndl && *(reinterpret_cast(hndl))->m_surface == *va_surf; }); MFX_CHECK(it != std::end(self->m_frameHandles), MFX_ERR_MEMORY_ALLOC); return ReallocImpl(self->m_pVADisplay, reinterpret_cast(*it), surf); } mfxStatus mfxDefaultAllocatorVAAPI::AllocFramesHW( mfxHDL pthis, mfxFrameAllocRequest* request, mfxFrameAllocResponse* response) { MFX_CHECK_NULL_PTR2(request, response); MFX_CHECK(pthis, MFX_ERR_INVALID_HANDLE); MFX_CHECK(request->NumFrameSuggested, MFX_ERR_MEMORY_ALLOC); *response = {}; // VP8/VP9 driver has weird requirements for allocation of surfaces/buffers for VP8/VP9 encoding // to comply with them additional logic is required to support regular and VP8/VP9 allocation paths mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(request->Info.FourCC); unsigned int va_fourcc = ConvertMfxFourccToVAFormat(mfx_fourcc); MFX_CHECK(isFourCCSupported(va_fourcc), MFX_ERR_UNSUPPORTED); auto self = reinterpret_cast(pthis); // Enough frames were allocated previously. Return existing frames if (self->NumFrames) { MFX_CHECK(request->NumFrameSuggested <= self->NumFrames, MFX_ERR_MEMORY_ALLOC); response->mids = self->m_frameHandles.data(); response->NumFrameActual = request->NumFrameSuggested; response->AllocId = request->AllocId; return MFX_ERR_NONE; } // Use temporary storage for preliminary operations. If some of them fail, current state of allocator remain unchanged. // When allocation will be finished, just move content of these vectors to internal allocator storage std::vector allocated_surfaces(request->NumFrameSuggested, VA_INVALID_ID); std::vector allocated_mids(request->NumFrameSuggested); VAStatus va_res = VA_STATUS_SUCCESS; mfxStatus mfx_res = MFX_ERR_NONE; if( VA_FOURCC_P208 != va_fourcc) { unsigned int format; std::vector attrib; FillSurfaceAttrs(attrib, format, request->Info.FourCC, va_fourcc, request->Type); va_res = vaCreateSurfaces(self->m_pVADisplay, format, request->Info.Width, request->Info.Height, allocated_surfaces.data(), allocated_surfaces.size(), attrib.data(), attrib.size()); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } else { mfxU32 codedbuf_size, codedbuf_num; VABufferType codedbuf_type; if (request->Info.FourCC == MFX_FOURCC_VP8_SEGMAP) { codedbuf_size = request->Info.Width; codedbuf_num = request->Info.Height; codedbuf_type = VAEncMacroblockMapBufferType; } else { int aligned_width = mfx::align2_value(request->Info.Width, 32); int aligned_height = mfx::align2_value(request->Info.Height, 32); codedbuf_size = static_cast((aligned_width * aligned_height) * 400LL / (16 * 16)); codedbuf_num = 1; codedbuf_type = VAEncCodedBufferType; } for (VABufferID& coded_buf : allocated_surfaces) { va_res = vaCreateBuffer(self->m_pVADisplay, VAContextID(request->AllocId), codedbuf_type, codedbuf_size, codedbuf_num, nullptr, &coded_buf); if (va_res != VA_STATUS_SUCCESS) { // Need to clean up already allocated buffers mfx_res = MFX_ERR_DEVICE_FAILED; break; } } } if (MFX_ERR_NONE == mfx_res) { // Clean up existing state self->NumFrames = 0; self->m_frameHandles.clear(); self->m_frameHandles.reserve(request->NumFrameSuggested); // Push new frames for (mfxU32 i = 0; i < request->NumFrameSuggested; ++i) { allocated_mids[i].m_surface = &allocated_surfaces[i]; allocated_mids[i].m_fourcc = request->Info.FourCC; self->m_frameHandles.push_back(&allocated_mids[i]); } response->mids = self->m_frameHandles.data(); response->NumFrameActual = request->NumFrameSuggested; response->AllocId = request->AllocId; self->NumFrames = self->m_frameHandles.size(); // Save new frames in internal state self->m_allocatedSurfaces = std::move(allocated_surfaces); self->m_allocatedMids = std::move(allocated_mids); } else { // Some of vaCreateBuffer calls failed for (VABufferID& coded_buf : allocated_surfaces) { mfxStatus sts = CheckAndDestroyVAbuffer(self->m_pVADisplay, coded_buf); MFX_CHECK_STS(sts); } } return mfx_res; } mfxStatus mfxDefaultAllocatorVAAPI::FreeFramesHW( mfxHDL pthis, mfxFrameAllocResponse* response) { MFX_CHECK(pthis, MFX_ERR_INVALID_HANDLE); MFX_CHECK_NULL_PTR1(response); if (response->mids) { auto vaapi_mids = reinterpret_cast(response->mids[0]); MFX_CHECK_NULL_PTR1(vaapi_mids); MFX_CHECK_NULL_PTR1(vaapi_mids->m_surface); auto self = reinterpret_cast(pthis); // Make sure that we are asked to clean memory which was allocated by current allocator MFX_CHECK(self->m_allocatedSurfaces.data() == vaapi_mids->m_surface, MFX_ERR_UNDEFINED_BEHAVIOR); if (ConvertVP8FourccToMfxFourcc(vaapi_mids->m_fourcc) == MFX_FOURCC_P8) { for (VABufferID& coded_buf : self->m_allocatedSurfaces) { mfxStatus sts = CheckAndDestroyVAbuffer(self->m_pVADisplay, coded_buf); MFX_CHECK_STS(sts); } } else { // Not Buffered memory VAStatus va_sts = vaDestroySurfaces(self->m_pVADisplay, vaapi_mids->m_surface, response->NumFrameActual); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } response->mids = nullptr; // Reset internal state self->NumFrames = 0; self->m_frameHandles.clear(); self->m_allocatedSurfaces.clear(); self->m_allocatedMids.clear(); } response->NumFrameActual = 0; return MFX_ERR_NONE; } static inline mfxU32 SupportedVAfourccToMFXfourcc(mfxU32 va_fourcc) { switch (va_fourcc) { case VA_FOURCC_RGB565: return MFX_FOURCC_RGB565; case VA_FOURCC_ARGB: return MFX_FOURCC_RGB4; case VA_FOURCC_A2R10G10B10: return MFX_FOURCC_A2RGB10; case VA_FOURCC_ABGR: return MFX_FOURCC_BGR4; case VA_FOURCC_P208: return MFX_FOURCC_NV12; case MFX_FOURCC_VP8_SEGMAP: return MFX_FOURCC_P8; case VA_FOURCC_I420: return MFX_FOURCC_I420; case VA_FOURCC_P012: return VA_FOURCC_P016; case VA_FOURCC_Y212: return VA_FOURCC_Y216; case VA_FOURCC_Y412: return VA_FOURCC_Y416; default: return va_fourcc; } } mfxStatus mfxDefaultAllocatorVAAPI::SetFrameData(const VAImage &va_image, mfxU32 mfx_fourcc, mfxU8* p_buffer, mfxFrameData& frame_data) { MFX_CHECK_NULL_PTR1(p_buffer); MFX_CHECK(mfx_fourcc == SupportedVAfourccToMFXfourcc(va_image.format.fourcc), MFX_ERR_LOCK_MEMORY); clear_frame_data(frame_data); switch (va_image.format.fourcc) { case VA_FOURCC_NV12: frame_data.Y = p_buffer + va_image.offsets[0]; frame_data.U = p_buffer + va_image.offsets[1]; frame_data.V = frame_data.U + 1; break; case VA_FOURCC_YV12: frame_data.Y = p_buffer + va_image.offsets[0]; frame_data.V = p_buffer + va_image.offsets[1]; frame_data.U = p_buffer + va_image.offsets[2]; break; case VA_FOURCC_I420: frame_data.Y = p_buffer + va_image.offsets[0]; frame_data.U = p_buffer + va_image.offsets[1]; frame_data.V = p_buffer + va_image.offsets[2]; break; case VA_FOURCC_YUY2: frame_data.Y = p_buffer + va_image.offsets[0]; frame_data.U = frame_data.Y + 1; frame_data.V = frame_data.Y + 3; break; case VA_FOURCC_UYVY: frame_data.U = p_buffer + va_image.offsets[0]; frame_data.Y = frame_data.U + 1; frame_data.V = frame_data.U + 2; break; #if defined (MFX_ENABLE_FOURCC_RGB565) case VA_FOURCC_RGB565: frame_data.B = p_buffer + va_image.offsets[0]; frame_data.G = frame_data.B; frame_data.R = frame_data.B; break; #endif case VA_FOURCC_ARGB: frame_data.B = p_buffer + va_image.offsets[0]; frame_data.G = frame_data.B + 1; frame_data.R = frame_data.B + 2; frame_data.A = frame_data.B + 3; break; #ifndef ANDROID case VA_FOURCC_A2R10G10B10: frame_data.B = p_buffer + va_image.offsets[0]; frame_data.G = frame_data.B; frame_data.R = frame_data.B; frame_data.A = frame_data.B; break; #endif #ifdef MFX_ENABLE_RGBP case VA_FOURCC_RGBP: frame_data.R = p_buffer + va_image.offsets[0]; frame_data.G = p_buffer + va_image.offsets[1]; frame_data.B = p_buffer + va_image.offsets[2]; break; #endif case VA_FOURCC_BGRP: frame_data.B = p_buffer + va_image.offsets[0]; frame_data.G = p_buffer + va_image.offsets[1]; frame_data.R = p_buffer + va_image.offsets[2]; break; case VA_FOURCC_ABGR: frame_data.R = p_buffer + va_image.offsets[0]; frame_data.G = frame_data.R + 1; frame_data.B = frame_data.R + 2; frame_data.A = frame_data.R + 3; break; case VA_FOURCC_P208: frame_data.Y = p_buffer + va_image.offsets[0]; break; case VA_FOURCC_P010: case VA_FOURCC_P012: case VA_FOURCC_P016: frame_data.Y = p_buffer + va_image.offsets[0]; frame_data.U = p_buffer + va_image.offsets[1]; frame_data.V = frame_data.U + sizeof(mfxU16); break; case VA_FOURCC_AYUV: frame_data.V = p_buffer + va_image.offsets[0]; frame_data.U = frame_data.V + 1; frame_data.Y = frame_data.V + 2; frame_data.A = frame_data.V + 3; break; case VA_FOURCC_Y210: case VA_FOURCC_Y212: case VA_FOURCC_Y216: frame_data.Y16 = (mfxU16 *) (p_buffer + va_image.offsets[0]); frame_data.U16 = frame_data.Y16 + 1; frame_data.V16 = frame_data.Y16 + 3; break; case VA_FOURCC_Y410: frame_data.Y = frame_data.U = frame_data.V = frame_data.A = 0; frame_data.Y410 = (mfxY410*)(p_buffer + va_image.offsets[0]); break; case VA_FOURCC_Y412: case VA_FOURCC_Y416: frame_data.U16 = (mfxU16 *) (p_buffer + va_image.offsets[0]); frame_data.Y16 = frame_data.U16 + 1; frame_data.V16 = frame_data.Y16 + 1; frame_data.A = (mfxU8 *)(frame_data.V16 + 1); break; default: MFX_RETURN(MFX_ERR_LOCK_MEMORY); } frame_data.PitchHigh = mfxU16(va_image.pitches[0] >> 16); frame_data.PitchLow = mfxU16(va_image.pitches[0] & 0xffff); return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocatorVAAPI::LockFrameHW( mfxHDL pthis, mfxMemId mid, mfxFrameData* ptr) { MFX_CHECK(pthis, MFX_ERR_INVALID_HANDLE); MFX_CHECK(mid, MFX_ERR_INVALID_HANDLE); MFX_CHECK_NULL_PTR1(ptr); auto vaapi_mids = reinterpret_cast(mid); MFX_CHECK(vaapi_mids->m_surface, MFX_ERR_INVALID_HANDLE); auto self = reinterpret_cast(pthis); VAStatus va_res = VA_STATUS_SUCCESS; mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(vaapi_mids->m_fourcc); if (MFX_FOURCC_P8 == mfx_fourcc) // bitstream processing { if (vaapi_mids->m_fourcc == MFX_FOURCC_VP8_SEGMAP) { mfxU8* p_buffer = nullptr; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); va_res = vaMapBuffer(self->m_pVADisplay, *(vaapi_mids->m_surface), (void **)(&p_buffer)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } ptr->Y = p_buffer; } else { VACodedBufferSegment *coded_buffer_segment; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); va_res = vaMapBuffer(self->m_pVADisplay, *(vaapi_mids->m_surface), (void **)(&coded_buffer_segment)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } ptr->Y = reinterpret_cast(coded_buffer_segment->buf); } } else { { PERF_UTILITY_AUTO("vaDeriveImage", PERF_LEVEL_DDI); va_res = vaDeriveImage(self->m_pVADisplay, *(vaapi_mids->m_surface), &(vaapi_mids->m_image)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } mfxU8* p_buffer = nullptr; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); va_res = vaMapBuffer(self->m_pVADisplay, vaapi_mids->m_image.buf, (void **) &p_buffer); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } mfxStatus mfx_res = SetFrameData(vaapi_mids->m_image, mfx_fourcc, p_buffer, *ptr); MFX_CHECK_STS(mfx_res); } return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocatorVAAPI::UnlockFrameHW( mfxHDL pthis, mfxMemId mid, mfxFrameData* ptr) { MFX_CHECK(pthis, MFX_ERR_INVALID_HANDLE); MFX_CHECK(mid, MFX_ERR_INVALID_HANDLE); auto vaapi_mids = reinterpret_cast(mid); MFX_CHECK(vaapi_mids->m_surface, MFX_ERR_INVALID_HANDLE); auto self = reinterpret_cast(pthis); VAStatus va_res = VA_STATUS_SUCCESS; mfxU32 mfx_fourcc = ConvertVP8FourccToMfxFourcc(vaapi_mids->m_fourcc); if (MFX_FOURCC_P8 == mfx_fourcc) // bitstream processing { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); va_res = vaUnmapBuffer(self->m_pVADisplay, *(vaapi_mids->m_surface)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } else // Image processing { { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); va_res = vaUnmapBuffer(self->m_pVADisplay, vaapi_mids->m_image.buf); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } { PERF_UTILITY_AUTO("vaDestroyImage", PERF_LEVEL_DDI); va_res = vaDestroyImage(self->m_pVADisplay, vaapi_mids->m_image.image_id); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } if (ptr) { ptr->PitchLow = 0; ptr->PitchHigh = 0; ptr->Y = nullptr; ptr->U = nullptr; ptr->V = nullptr; ptr->A = nullptr; } } return MFX_ERR_NONE; } mfxStatus mfxDefaultAllocatorVAAPI::GetHDLHW( mfxHDL pthis, mfxMemId mid, mfxHDL* handle) { MFX_CHECK(pthis, MFX_ERR_INVALID_HANDLE); MFX_CHECK(mid, MFX_ERR_INVALID_HANDLE); auto vaapi_mids = reinterpret_cast(mid); MFX_CHECK(vaapi_mids->m_surface, MFX_ERR_INVALID_HANDLE); *handle = vaapi_mids->m_surface; //VASurfaceID* <-> mfxHDL return MFX_ERR_NONE; } mfxDefaultAllocatorVAAPI::mfxWideHWFrameAllocator::mfxWideHWFrameAllocator( mfxU16 type, mfxHDL handle) : mfxBaseWideFrameAllocator(type) , m_pVADisplay(reinterpret_cast(handle)) , m_DecId(0) { frameAllocator.Alloc = &mfxDefaultAllocatorVAAPI::AllocFramesHW; frameAllocator.Lock = &mfxDefaultAllocatorVAAPI::LockFrameHW; frameAllocator.GetHDL = &mfxDefaultAllocatorVAAPI::GetHDLHW; frameAllocator.Unlock = &mfxDefaultAllocatorVAAPI::UnlockFrameHW; frameAllocator.Free = &mfxDefaultAllocatorVAAPI::FreeFramesHW; } vaapi_buffer_wrapper::vaapi_buffer_wrapper(const mfxFrameInfo &info, VADisplayWrapper& display, mfxU32 context) : vaapi_resource_wrapper(display) , m_bIsSegmap(info.FourCC == MFX_FOURCC_VP8_SEGMAP) { mfxU32 codedbuf_size, codedbuf_num; VABufferType codedbuf_type; if (m_bIsSegmap) { codedbuf_size = info.Width; codedbuf_num = info.Height; codedbuf_type = VAEncMacroblockMapBufferType; } else { mfxI32 aligned_width = mfx::align2_value(info.Width, 32); mfxI32 aligned_height = mfx::align2_value(info.Height, 32); codedbuf_size = static_cast((aligned_width * aligned_height) * 400LL / (16 * 16)); codedbuf_num = 1; codedbuf_type = VAEncCodedBufferType; } m_pitch = codedbuf_size; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateBuffer"); PERF_UTILITY_AUTO("vaCreateBuffer", PERF_LEVEL_DDI); VAStatus va_res = vaCreateBuffer(*m_pVADisplay, context, codedbuf_type, codedbuf_size, codedbuf_num, nullptr, &m_resource_id); MFX_CHECK_WITH_THROW_STS(MFX_STS_TRACE(va_res) == VA_STATUS_SUCCESS, MFX_ERR_MEMORY_ALLOC); } } vaapi_buffer_wrapper::~vaapi_buffer_wrapper() { std::ignore = MFX_STS_TRACE(vaDestroyBuffer(*m_pVADisplay, m_resource_id)); } mfxStatus vaapi_buffer_wrapper::Lock(mfxFrameData& frame_data, mfxU32 flags) { MFX_CHECK(FrameAllocatorBase::CheckMemoryFlags(flags), MFX_ERR_LOCK_MEMORY); clear_frame_data(frame_data); if (m_bIsSegmap) { mfxU8* p_buffer; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); VAStatus va_res = vaMapBuffer(*m_pVADisplay, m_resource_id, (void **)(&p_buffer)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_LOCK_MEMORY); } frame_data.Y = p_buffer; } else { VACodedBufferSegment *coded_buffer_segment; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); VAStatus va_res = vaMapBuffer(*m_pVADisplay, m_resource_id, (void **)(&coded_buffer_segment)); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_LOCK_MEMORY); } frame_data.Y = reinterpret_cast(coded_buffer_segment->buf); } frame_data.PitchLow = mfxU16(m_pitch & 0xffff); frame_data.PitchHigh = mfxU16(m_pitch >> 16); return MFX_ERR_NONE; } mfxStatus vaapi_buffer_wrapper::Unlock() { { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); VAStatus va_res = vaUnmapBuffer(*m_pVADisplay, m_resource_id); MFX_CHECK(va_res == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; } vaapi_surface_wrapper::vaapi_surface_wrapper(const mfxFrameInfo &info, mfxU16 type, VADisplayWrapper& display) : vaapi_resource_wrapper(display) , m_surface_lock(*m_pVADisplay, m_resource_id) , m_type(type) , m_fourcc(info.FourCC) { mfxU32 format; std::vector attrib; mfxU32 va_fourcc = ConvertMfxFourccToVAFormat(ConvertVP8FourccToMfxFourcc(m_fourcc)); FillSurfaceAttrs(attrib, format, m_fourcc, va_fourcc, m_type); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateSurfaces"); PERF_UTILITY_AUTO("vaCreateSurfaces", PERF_LEVEL_DDI); VAStatus va_res = vaCreateSurfaces(*m_pVADisplay, format, info.Width, info.Height, &m_resource_id, 1, attrib.data(), attrib.size()); MFX_CHECK_WITH_THROW_STS(MFX_STS_TRACE(va_res) == VA_STATUS_SUCCESS, MFX_ERR_MEMORY_ALLOC); } } vaapi_surface_wrapper::~vaapi_surface_wrapper() { std::ignore = MFX_STS_TRACE(vaDestroySurfaces(*m_pVADisplay, &m_resource_id, 1)); } mfxStatus vaapi_surface_wrapper::Lock(mfxFrameData& frame_data, mfxU32 flags) { MFX_CHECK(FrameAllocatorBase::CheckMemoryFlags(flags), MFX_ERR_LOCK_MEMORY); mfxStatus sts = m_surface_lock.DeriveImage(); MFX_CHECK_STS(sts); mfxU8* p_buffer = nullptr; sts = m_surface_lock.Map(p_buffer); MFX_CHECK_STS(sts); return mfxDefaultAllocatorVAAPI::SetFrameData(m_surface_lock.m_image, ConvertVP8FourccToMfxFourcc(m_fourcc), p_buffer, frame_data); } mfxStatus vaapi_surface_wrapper::Unlock() { mfxStatus sts = m_surface_lock.Unmap(); MFX_CHECK_STS(sts); sts = m_surface_lock.DestroyImage(); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } mfxFrameSurface1_hw_vaapi::mfxFrameSurface1_hw_vaapi(const mfxFrameInfo & info, mfxU16 type, mfxMemId mid, std::shared_ptr&, mfxHDL display, mfxU32 context, FrameAllocatorBase& allocator) : RWAcessSurface(info, type, mid, allocator) , m_type(type) , m_context(VAContextID(context)) { mfxU32 vp8_fourcc = ConvertVP8FourccToMfxFourcc(info.FourCC); MFX_CHECK_WITH_THROW_STS(isFourCCSupported(ConvertMfxFourccToVAFormat(vp8_fourcc)), MFX_ERR_UNSUPPORTED); MFX_CHECK_WITH_THROW_STS(!(m_type & MFX_MEMTYPE_SYSTEM_MEMORY), MFX_ERR_UNSUPPORTED); auto p_va_display_wrapper = reinterpret_cast(display); MFX_CHECK_WITH_THROW_STS(p_va_display_wrapper, MFX_ERR_INVALID_HANDLE); if (vp8_fourcc == MFX_FOURCC_P8) { m_resource_wrapper.reset(new vaapi_buffer_wrapper(info, *p_va_display_wrapper, m_context)); } else { m_resource_wrapper.reset(new vaapi_surface_wrapper(info, m_type, *p_va_display_wrapper)); } } mfxStatus mfxFrameSurface1_hw_vaapi::Lock(mfxU32 flags) { MFX_CHECK(FrameAllocatorBase::CheckMemoryFlags(flags), MFX_ERR_LOCK_MEMORY); std::unique_lock guard(m_mutex); mfxStatus sts = LockRW(guard, flags & MFX_MAP_WRITE, flags & MFX_MAP_NOWAIT); MFX_CHECK_STS(sts); auto Unlock = [](RWAcessSurface* s) { s->UnlockRW(); }; // Scope guard to decrease locked count if real lock fails std::unique_ptr scoped_lock(this, Unlock); if (NumReaders() < 2) { // First reader or unique writer has just acquired resource sts = m_resource_wrapper->Lock(m_internal_surface.Data, flags); MFX_CHECK_STS(sts); } // No error, remove guard without decreasing locked counter scoped_lock.release(); return MFX_ERR_NONE; } mfxStatus mfxFrameSurface1_hw_vaapi::Unlock() { std::unique_lock guard(m_mutex); MFX_SAFE_CALL(UnlockRW()); if (NumReaders() == 0) // So it was 1 before UnlockRW { MFX_SAFE_CALL(m_resource_wrapper->Unlock()); clear_frame_data(m_internal_surface.Data); } return MFX_ERR_NONE; } std::pair mfxFrameSurface1_hw_vaapi::GetNativeHandle() const { std::shared_lock guard(m_hdl_mutex); return { reinterpret_cast(m_resource_wrapper->GetHandle()), MFX_RESOURCE_VA_SURFACE }; } std::pair mfxFrameSurface1_hw_vaapi::GetDeviceHandle() const { return { reinterpret_cast((VADisplay)(m_resource_wrapper->GetDevice())), MFX_HANDLE_VA_DISPLAY }; } mfxStatus mfxFrameSurface1_hw_vaapi::GetHDL(mfxHDL& handle) const { std::shared_lock guard(m_hdl_mutex); handle = m_resource_wrapper->GetHandle(); return MFX_ERR_NONE; } mfxStatus mfxFrameSurface1_hw_vaapi::Realloc(const mfxFrameInfo & info) { std::lock_guard guard(m_mutex); std::lock_guard guard_hdl(m_hdl_mutex); MFX_CHECK(!Locked(), MFX_ERR_LOCK_MEMORY); m_internal_surface.Info = info; if (info.FourCC == MFX_FOURCC_P8) { m_resource_wrapper.reset(new vaapi_buffer_wrapper(info, m_resource_wrapper->GetDevice(), m_context)); } else { m_resource_wrapper.reset(new vaapi_surface_wrapper(info, m_type, m_resource_wrapper->GetDevice())); } return MFX_ERR_NONE; } template<> void FlexibleFrameAllocatorHW_VAAPI::SetDevice(mfxHDL device) { if (m_session) { mfxHDL hdl = nullptr; mfxStatus sts = m_session->m_pCORE->GetHandle(MFX_HANDLE_VA_DISPLAY, &hdl); MFX_CHECK_WITH_THROW_STS(sts == MFX_ERR_NONE, sts); auto p_va_display = reinterpret_cast(device); MFX_CHECK_WITH_THROW_STS(p_va_display, MFX_ERR_INVALID_HANDLE); MFX_CHECK_WITH_THROW_STS(hdl == *p_va_display, MFX_ERR_INVALID_HANDLE); } m_device = device; m_staging_adapter->SetDevice(device); } /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/libmfx_core.cpp000066400000000000000000001473511443134507600260020ustar00rootroot00000000000000// Copyright (c) 2007-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include "mfx_session.h" #include "libmfx_core.h" #include "mfx_utils.h" #include "mfx_common_int.h" #include "vm_interlocked.h" #include "ippi.h" #include "mfx_umc_alloc_wrapper.h" using namespace std; // // THE OTHER CORE FUNCTIONS HAVE IMPLICIT IMPLEMENTATION // FUNCTION_IMPL(CORE, SetBufferAllocator, (mfxSession session, mfxBufferAllocator *allocator), (allocator)) FUNCTION_IMPL(CORE, SetFrameAllocator, (mfxSession session, mfxFrameAllocator *allocator), (allocator)) FUNCTION_IMPL(CORE, SetHandle, (mfxSession session, mfxHandleType type, mfxHDL hdl), (type, hdl)) FUNCTION_IMPL(CORE, GetHandle, (mfxSession session, mfxHandleType type, mfxHDL *hdl), (type, hdl)) mfxStatus MFXVideoCORE_QueryPlatform(mfxSession session, mfxPlatform* platform) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_LTRACE_1(MFX_TRACE_LEVEL_API_PARAMS, "In: session = ", MFX_TRACE_FORMAT_P, session); MFX_CHECK(session, MFX_ERR_INVALID_HANDLE); MFX_CHECK(session->m_pCORE.get(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK_NULL_PTR1(platform); try { /* call the codec's method */ IVideoCore_API_1_19 * pInt = QueryCoreInterface(session->m_pCORE.get(), MFXICORE_API_1_19_GUID); if (pInt) { return pInt->QueryPlatform(platform); } platform = {}; MFX_RETURN(MFX_ERR_UNSUPPORTED); } catch (...) { MFX_RETURN(MFX_ERR_NULL_PTR); } } mfxStatus MFXMemory_GetSurfaceForDecode(mfxSession session, mfxFrameSurface1** output_surf) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); MFX_CHECK_NULL_PTR1(output_surf); MFX_CHECK_HDL(session); MFX_CHECK(session->m_pCORE.get(), MFX_ERR_NOT_INITIALIZED); MFX_CHECK(session->m_pDECODE, MFX_ERR_NOT_INITIALIZED); return session->m_pDECODE->GetSurface(*output_surf); } mfxStatus CommonCORE::API_1_19_Adapter::QueryPlatform(mfxPlatform* platform) { return m_core->QueryPlatform(platform); } mfxStatus CommonCORE::AllocBuffer(mfxU32 nbytes, mfxU16 type, mfxMemId *mid) { UMC::AutomaticUMCMutex guard(m_guard); return (*m_bufferAllocator.bufferAllocator.Alloc)(m_bufferAllocator.bufferAllocator.pthis,nbytes, type, mid); } mfxStatus CommonCORE::LockBuffer(mfxMemId mid, mfxU8 **ptr) { UMC::AutomaticUMCMutex guard(m_guard); return (*m_bufferAllocator.bufferAllocator.Lock)(m_bufferAllocator.bufferAllocator.pthis, mid, ptr); } mfxStatus CommonCORE::UnlockBuffer(mfxMemId mid) { UMC::AutomaticUMCMutex guard(m_guard); return (*m_bufferAllocator.bufferAllocator.Unlock)(m_bufferAllocator.bufferAllocator.pthis,mid); } mfxStatus CommonCORE::FreeBuffer(mfxMemId mid) { UMC::AutomaticUMCMutex guard(m_guard); return (*m_bufferAllocator.bufferAllocator.Free)(m_bufferAllocator.bufferAllocator.pthis,mid); } mfxStatus CommonCORE::AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool ) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; try { MFX_CHECK_NULL_PTR2(request, response); mfxFrameAllocRequest temp_request = *request; // external allocator if (m_bSetExtFrameAlloc && !(request->Type & MFX_MEMTYPE_INTERNAL_FRAME)) { sts = (*m_FrameAllocator.frameAllocator.Alloc)(m_FrameAllocator.frameAllocator.pthis, &temp_request, response); if (MFX_ERR_UNSUPPORTED == sts) { // Default Allocator is used for internal memory allocation only if (request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) return sts; return this->DefaultAllocFrames(request, response); } else if (MFX_ERR_NONE == sts) { sts = RegisterMids(response, request->Type, false); MFX_CHECK_STS(sts); } } else { // Default Allocator is used for internal memory allocation only if (request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) return MFX_ERR_MEMORY_ALLOC; return this->DefaultAllocFrames(request, response); } } catch(...) { return MFX_ERR_MEMORY_ALLOC; } MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, sts); return sts; } mfxStatus CommonCORE::DefaultAllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response) { mfxStatus sts = MFX_ERR_NONE; if ((request->Type & MFX_MEMTYPE_DXVA2_DECODER_TARGET)|| (request->Type & MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET)) // should be SW return MFX_ERR_UNSUPPORTED; //if (request->Type & MFX_MEMTYPE_INTERNAL_FRAME) // TBD - only internal frames can be allocated { mfxBaseWideFrameAllocator* pAlloc = GetAllocatorByReq(request->Type); // VPP, ENC, PAK can request frames for several times if (pAlloc) return MFX_ERR_MEMORY_ALLOC; m_pcAlloc.reset(new mfxWideSWFrameAllocator(request->Type)); pAlloc = m_pcAlloc.get(); // set frame allocator pAlloc->frameAllocator.pthis = pAlloc; // set buffer allocator for current frame single allocator pAlloc->wbufferAllocator.bufferAllocator = m_bufferAllocator.bufferAllocator; sts = (*pAlloc->frameAllocator.Alloc)(pAlloc->frameAllocator.pthis, request, response); MFX_CHECK_STS(sts); sts = RegisterMids(response, request->Type, true, pAlloc); MFX_CHECK_STS(sts); } ++m_NumAllocators; m_pcAlloc.release(); return sts; } mfxStatus CommonCORE::LockFrame(mfxMemId mid, mfxFrameData *ptr) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::LockFrame"); UMC::AutomaticUMCMutex guard(m_guard); try { MFX_CHECK_HDL(mid); MFX_CHECK_NULL_PTR1(ptr); mfxFrameAllocator* pAlloc = GetAllocatorAndMid(mid); if (!pAlloc) return MFX_ERR_INVALID_HANDLE; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::LockFrame->Allocator"); return (*pAlloc->Lock)(pAlloc->pthis, mid, ptr); } catch(...) { return MFX_ERR_INVALID_HANDLE; } } mfxStatus CommonCORE::GetFrameHDL(mfxMemId mid, mfxHDL* handle, bool ExtendedSearch) { mfxStatus sts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::GetFrameHDL"); try { MFX_CHECK_HDL(mid); MFX_CHECK_NULL_PTR1(handle); mfxFrameAllocator* pAlloc = GetAllocatorAndMid(mid); if (!pAlloc) { // we couldn't define behavior if external allocator did not set if (ExtendedSearch)// try to find in another cores { using TFPtr = mfxStatus (VideoCORE::*)(mfxMemId, mfxHDL*, bool); sts = m_session->m_pOperatorCore->DoFrameOperation(&VideoCORE::GetFrameHDL, mid, handle); if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } else return (*pAlloc->GetHDL)(pAlloc->pthis, mid, handle); } catch(...) { return MFX_ERR_UNDEFINED_BEHAVIOR; } } mfxStatus CommonCORE::UnlockFrame(mfxMemId mid, mfxFrameData *ptr) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::UnlockFrame"); UMC::AutomaticUMCMutex guard(m_guard); try { MFX_CHECK_HDL(mid); mfxFrameAllocator* pAlloc = GetAllocatorAndMid(mid); if (!pAlloc) return MFX_ERR_INVALID_HANDLE; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::UnlockFrame->Allocator"); return (*pAlloc->Unlock)(pAlloc->pthis, mid, ptr); } } catch(...) { return MFX_ERR_INVALID_HANDLE; } } mfxStatus CommonCORE::FreeFrames(mfxFrameAllocResponse *response, bool) { UMC::AutomaticUMCMutex guard(m_guard); try { MFX_CHECK_NULL_PTR1(response); MFX_CHECK(response->NumFrameActual, MFX_ERR_NONE); mfxStatus sts = MFX_ERR_NONE; m_pMemId.reset(new mfxMemId[response->NumFrameActual]); mfxFrameAllocator* pAlloc; CorrespTbl::iterator ctbl_it; AllocQueue::iterator it; ctbl_it = m_CTbl.find(response->mids[0]); if (ctbl_it == m_CTbl.end()) return MFX_ERR_INVALID_HANDLE; bool IsDefaultMem = ctbl_it->second.isDefaultMem; mfxMemId extMem = response->mids[0]; mfxFrameAllocator* pFirstAlloc = GetAllocatorAndMid(extMem); MFX_CHECK_NULL_PTR1(pFirstAlloc); // checking and correspond parameters for (mfxU32 i = 0; i < response->NumFrameActual; i++) { extMem = response->mids[i]; ctbl_it = m_CTbl.find(response->mids[i]); if (m_CTbl.end() == ctbl_it) return MFX_ERR_INVALID_HANDLE; m_pMemId[i] = ctbl_it->second.InternalMid; pAlloc = GetAllocatorAndMid(extMem); // all frames should be allocated by one allocator if ((IsDefaultMem != ctbl_it->second.isDefaultMem)|| (pAlloc != pFirstAlloc)) return MFX_ERR_INVALID_HANDLE; } // save first mid. Need for future internal memory free extMem = response->mids[0]; sts = FreeMidArray(pFirstAlloc, response); MFX_CHECK_STS(sts); // delete self allocator if (IsDefaultMem) { it = m_AllocatorQueue.find(extMem); if (m_AllocatorQueue.end() == it) return MFX_ERR_INVALID_HANDLE; if (it->second) { delete it->second; it->second = 0; } } // delete self queues for (mfxU32 i = 0; i < response->NumFrameActual; i++) { ctbl_it = m_CTbl.find(response->mids[i]); if (IsDefaultMem) m_AllocatorQueue.erase(response->mids[i]); m_CTbl.erase(ctbl_it); } m_pMemId.reset(); // we sure about response->mids delete[] response->mids; response->mids = 0; return sts; } catch(...) { return MFX_ERR_UNDEFINED_BEHAVIOR; } } mfxStatus CommonCORE::LockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool ExtendedSearch) { mfxStatus sts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::LockExternalFrame"); try { { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK_NULL_PTR1(ptr); if (m_bSetExtFrameAlloc) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "pAlloc->Lock"); mfxFrameAllocator* pAlloc = &m_FrameAllocator.frameAllocator; return (*pAlloc->Lock)(pAlloc->pthis, mid, ptr); } } // we couldn't define behavior if external allocator did not set // try to find in another cores if (ExtendedSearch)// try to find in another cores { using TFPtr = mfxStatus(VideoCORE::*)(mfxMemId, mfxFrameData*, bool); sts = m_session->m_pOperatorCore->DoFrameOperation(&VideoCORE::LockExternalFrame, mid, ptr); if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } catch(...) { return MFX_ERR_LOCK_MEMORY; } } mfxStatus CommonCORE::GetExternalFrameHDL(mfxMemId mid, mfxHDL *handle, bool ExtendedSearch) { mfxStatus sts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::GetExternalFrameHDL"); try { MFX_CHECK_NULL_PTR1(handle); if (m_bSetExtFrameAlloc) { mfxFrameAllocator* pAlloc = &m_FrameAllocator.frameAllocator; return (*pAlloc->GetHDL)(pAlloc->pthis, mid, handle); } // we couldn't define behavior if external allocator did not set if (ExtendedSearch)// try to find in another cores { using TFPtr = mfxStatus(VideoCORE::*)(mfxMemId, mfxHDL*, bool); sts = m_session->m_pOperatorCore->DoFrameOperation(&VideoCORE::GetExternalFrameHDL, mid, handle); if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } catch(...) { return MFX_ERR_UNDEFINED_BEHAVIOR; } } mfxStatus CommonCORE::UnlockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool ExtendedSearch) { mfxStatus sts; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "CommonCORE::UnlockExternalFrame"); if(!ptr) return MFX_ERR_NULL_PTR; try { { UMC::AutomaticUMCMutex guard(m_guard); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "UnlockFrame"); if (m_bSetExtFrameAlloc) { mfxFrameAllocator* pAlloc = &m_FrameAllocator.frameAllocator; return (*pAlloc->Unlock)(pAlloc->pthis, mid, ptr); } } // we couldn't define behavior if external allocator did not set if (ExtendedSearch)// try to find in another cores { using TFPtr = mfxStatus(VideoCORE::*)(mfxMemId, mfxFrameData*, bool); sts = m_session->m_pOperatorCore->DoFrameOperation(&VideoCORE::UnlockExternalFrame, mid, ptr); if (MFX_ERR_NONE == sts) return sts; } return MFX_ERR_UNDEFINED_BEHAVIOR; } catch(...) { return MFX_ERR_LOCK_MEMORY; } } mfxMemId CommonCORE::MapIdx(mfxMemId mid) { UMC::AutomaticUMCMutex guard(m_guard); if (0 == mid) return 0; CorrespTbl::iterator ctbl_it; ctbl_it = m_CTbl.find(mid); if (m_CTbl.end() == ctbl_it) return 0; else return ctbl_it->second.InternalMid; } mfxStatus CommonCORE::FreeMidArray(mfxFrameAllocator* pAlloc, mfxFrameAllocResponse *response) { UMC::AutomaticUMCMutex guard(m_guard); MemIDMap::iterator it = m_RespMidQ.find(response->mids); if (m_RespMidQ.end() == it) return MFX_ERR_INVALID_HANDLE; mfxFrameAllocResponse sResponse = *response; mfxStatus sts; sResponse.mids = it->second; sts = (*pAlloc->Free)(pAlloc->pthis, &sResponse); MFX_CHECK_STS(sts); m_RespMidQ.erase(it); return sts; } mfxStatus CommonCORE::RegisterMids(mfxFrameAllocResponse *response, mfxU16 memType, bool IsDefaultAlloc, mfxBaseWideFrameAllocator* pAlloc) { m_pMemId.reset(new mfxMemId[response->NumFrameActual]); mfxMemId mId; for (mfxU32 i = 0; i < response->NumFrameActual; i++) { MemDesc ds; if (!GetUniqID(mId)) { return MFX_ERR_UNDEFINED_BEHAVIOR; } // add in queue only self allocators // need to define SW or HW allocation mode if (IsDefaultAlloc) m_AllocatorQueue.insert(pair(mId, pAlloc)); ds.InternalMid = response->mids[i]; ds.isDefaultMem = IsDefaultAlloc; // set render target memory description ds.memType = memType; m_CTbl.insert(pair(mId, ds)); m_pMemId[i] = mId; } m_RespMidQ.insert(pair(m_pMemId.get(), response->mids)); response->mids = m_pMemId.release(); return MFX_ERR_NONE; } CommonCORE::CommonCORE(const mfxU32 numThreadsAvailable, const mfxSession session) : m_numThreadsAvailable(numThreadsAvailable), m_session(session), m_NumAllocators(0), m_hdl(NULL), m_DXVA2DecodeHandle(NULL), m_D3DDecodeHandle(NULL), m_D3DEncodeHandle(NULL), m_D3DVPPHandle(NULL), m_bSetExtBufAlloc(false), m_bSetExtFrameAlloc(false), m_bUseExtManager(false), m_CoreId(0), m_API_1_19(this), #if defined(MFX_ENABLE_PXP) m_pPXPCtxHdl(nullptr), #endif // MFX_ENABLE_PXP m_deviceId(0) { m_bufferAllocator.bufferAllocator.pthis = &m_bufferAllocator; } void CommonCORE::Close() { m_CTbl.clear(); m_AllocatorQueue.clear(); } mfxStatus CommonCORE::GetHandle(mfxHandleType type, mfxHDL *handle) { MFX_CHECK_NULL_PTR1(handle); UMC::AutomaticUMCMutex guard(m_guard); switch (type) { case MFX_HANDLE_VA_DISPLAY: MFX_CHECK(m_hdl, MFX_ERR_NOT_FOUND); *handle = m_hdl; break; #if defined(MFX_ENABLE_PXP) case MFX_HANDLE_PXP_CONTEXT: MFX_CHECK(m_pPXPCtxHdl, MFX_ERR_NOT_FOUND); *handle = m_pPXPCtxHdl; break; #endif // MFX_ENABLE_PXP default: MFX_RETURN(MFX_ERR_NOT_FOUND); } return MFX_ERR_NONE; } // mfxStatus CommonCORE::GetHandle(mfxHandleType type, mfxHDL *handle) mfxStatus CommonCORE::SetHandle(mfxHandleType type, mfxHDL hdl) { MFX_CHECK_HDL(hdl); #if defined(MFX_ENABLE_PXP) UMC::AutomaticUMCMutex guard(m_guard); if (MFX_HANDLE_PXP_CONTEXT == type) { m_pPXPCtxHdl = hdl; return MFX_ERR_NONE; } #else std::ignore = type; #endif // MFX_ENABLE_PXP MFX_RETURN(MFX_ERR_INVALID_HANDLE); }// mfxStatus CommonCORE::SetHandle(mfxHandleType type, mfxHDL handle) mfxStatus CommonCORE::QueryPlatform(mfxPlatform* platform) { MFX_CHECK_NULL_PTR1(platform); MFX_CHECK(m_hdl || MFX_HW_VAAPI != GetVAType(), MFX_ERR_UNDEFINED_BEHAVIOR); auto type = GetHWType(); *platform = MakePlatform(type, m_deviceId); return MFX_ERR_NONE; } // mfxStatus CommonCORE::QueryPlatform(mfxPlatform* platform) mfxStatus CommonCORE::SetBufferAllocator(mfxBufferAllocator *allocator) { UMC::AutomaticUMCMutex guard(m_guard); if (!allocator) return MFX_ERR_NONE; if (!m_bSetExtBufAlloc) { m_bufferAllocator.bufferAllocator = *allocator; m_bSetExtBufAlloc = true; return MFX_ERR_NONE; } else return MFX_ERR_UNDEFINED_BEHAVIOR; } mfxFrameAllocator* CommonCORE::GetAllocatorAndMid(mfxMemId& mid) { UMC::AutomaticUMCMutex guard(m_guard); CorrespTbl::iterator ctbl_it = m_CTbl.find(mid); if (m_CTbl.end() == ctbl_it) return 0; if (!ctbl_it->second.isDefaultMem) { if (m_bSetExtFrameAlloc) { mid = ctbl_it->second.InternalMid; return &m_FrameAllocator.frameAllocator; } else // error { mid = 0; return 0; } } else { AllocQueue::iterator it = m_AllocatorQueue.find(mid); if (it == m_AllocatorQueue.end()) { mid = 0; return 0; } else { mid = ctbl_it->second.InternalMid; return &it->second->frameAllocator; } } } mfxBaseWideFrameAllocator* CommonCORE::GetAllocatorByReq(mfxU16 type) const { AllocQueue::const_iterator it = m_AllocatorQueue.begin(); while (it != m_AllocatorQueue.end()) { // external frames should be allocated at once // internal frames can be allocated many times if ((it->second->type == type)&& (it->second->type & MFX_MEMTYPE_EXTERNAL_FRAME)) return it->second; ++it; } return 0; } mfxStatus CommonCORE::SetFrameAllocator(mfxFrameAllocator *allocator) { UMC::AutomaticUMCMutex guard(m_guard); if (!allocator) return MFX_ERR_NONE; if (!m_bSetExtFrameAlloc) { m_FrameAllocator.frameAllocator = *allocator; m_bSetExtFrameAlloc = true; return MFX_ERR_NONE; } else return MFX_ERR_UNDEFINED_BEHAVIOR; } // no care about surface, opaq and all round. Just increasing reference mfxStatus CommonCORE::IncreasePureReference(mfxU16& Locked) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK(Locked <= 65534, MFX_ERR_LOCK_MEMORY); vm_interlocked_inc16((volatile uint16_t*)&Locked); return MFX_ERR_NONE; }// CommonCORE::IncreasePureReference(mfxFrameData *ptr) // no care about surface, opaq and all round. Just increasing reference mfxStatus CommonCORE::DecreasePureReference(mfxU16& Locked) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK(Locked != 0, MFX_ERR_LOCK_MEMORY); vm_interlocked_dec16((volatile uint16_t*)&Locked); return MFX_ERR_NONE; }// CommonCORE::IncreasePureReference(mfxFrameData *ptr) mfxStatus CommonCORE::IncreaseReference(mfxFrameData *ptr, bool) { MFX_CHECK_NULL_PTR1(ptr); return IncreasePureReference(ptr->Locked); } mfxStatus CommonCORE::DecreaseReference(mfxFrameData *ptr, bool) { MFX_CHECK_NULL_PTR1(ptr); return DecreasePureReference(ptr->Locked); } void CommonCORE::INeedMoreThreadsInside(const void *pComponent) { if ((m_session) && (m_session->m_pScheduler)) { ignore = MFX_STS_TRACE(m_session->m_pScheduler->ResetWaitingStatus(pComponent)); } } // void CommonCORE::INeedMoreThreadsInside(const void *pComponent) bool CommonCORE::IsExternalFrameAllocator() const { return m_bSetExtFrameAlloc; } mfxStatus CommonCORE::DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32) { mfxStatus sts = MFX_ERR_NONE; mfxFrameSurface1 srcTempSurface, dstTempSurface; mfxMemId srcMemId, dstMemId; memset(&srcTempSurface, 0, sizeof(mfxFrameSurface1)); memset(&dstTempSurface, 0, sizeof(mfxFrameSurface1)); // save original mem ids srcMemId = pSrc->Data.MemId; dstMemId = pDst->Data.MemId; mfxU8* srcPtr = GetFramePointer(pSrc->Info.FourCC, pSrc->Data); mfxU8* dstPtr = GetFramePointer(pDst->Info.FourCC, pDst->Data); srcTempSurface.Info = pSrc->Info; dstTempSurface.Info = pDst->Info; srcTempSurface.Data.MemId = srcMemId; dstTempSurface.Data.MemId = dstMemId; bool isSrcLocked = false; bool isDstLocked = false; if (srcMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { //if (srcMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (NULL == srcPtr) { // only if pointers are absence sts = LockExternalFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(sts); isSrcLocked = true; } else { srcTempSurface.Data = pSrc->Data; } srcTempSurface.Data.MemId = 0; } } else if (srcMemType & MFX_MEMTYPE_INTERNAL_FRAME) { //if (srcMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (NULL == srcPtr) { sts = LockFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(sts); isSrcLocked = true; } else { srcTempSurface.Data = pSrc->Data; } srcTempSurface.Data.MemId = 0; } } if (dstMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { //if (dstMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (NULL == dstPtr) { // only if pointers are absence sts = LockExternalFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(sts); isDstLocked = true; } else { dstTempSurface.Data = pDst->Data; } dstTempSurface.Data.MemId = 0; } } else if (dstMemType & MFX_MEMTYPE_INTERNAL_FRAME) { if (dstMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (NULL == dstPtr) { // only if pointers are absence sts = LockFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(sts); isDstLocked = true; } else { dstTempSurface.Data = pDst->Data; } dstTempSurface.Data.MemId = 0; } } // check that external allocator was set if ((NULL != pDst->Data.MemId || NULL != pSrc->Data.MemId) && false == m_bSetExtFrameAlloc) { return MFX_ERR_UNDEFINED_BEHAVIOR; } mfxStatus fcSts = DoFastCopyExtended(&dstTempSurface, &srcTempSurface); if (true == isSrcLocked) { if (srcMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { sts = UnlockExternalFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } else if (srcMemType & MFX_MEMTYPE_INTERNAL_FRAME) { sts = UnlockFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } } if (true == isDstLocked) { if (dstMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { sts = UnlockExternalFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } else if (dstMemType & MFX_MEMTYPE_INTERNAL_FRAME) { sts = UnlockFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } } return fcSts; } mfxStatus CommonCORE::DoFastCopy(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK_NULL_PTR2(src, dst); IppiSize roi = { min(src->Info.Width, dst->Info.Width), min(src->Info.Height, dst->Info.Height) }; MFX_CHECK(roi.width && roi.height, MFX_ERR_UNDEFINED_BEHAVIOR); if(!m_pFastCopy) { m_pFastCopy.reset(new FastCopy()); } mfxU8 *pDst = dst->Data.Y, *pSrc = src->Data.Y; MFX_CHECK_NULL_PTR2(pSrc, pDst); mfxU32 srcPitch = src->Data.PitchLow + ((mfxU32)src->Data.PitchHigh << 16); mfxU32 dstPitch = dst->Data.PitchLow + ((mfxU32)dst->Data.PitchHigh << 16); switch (dst->Info.FourCC) { case MFX_FOURCC_NV12: MFX_SAFE_CALL(m_pFastCopy->Copy(pDst, dstPitch, pSrc, srcPitch, roi, COPY_SYS_TO_SYS)); roi.height >>= 1; pSrc = src->Data.UV; pDst = dst->Data.UV; MFX_CHECK_NULL_PTR2(pSrc, pDst); return m_pFastCopy->Copy(pDst, dstPitch, pSrc, srcPitch, roi, COPY_SYS_TO_SYS); case MFX_FOURCC_YV12: MFX_SAFE_CALL(m_pFastCopy->Copy(pDst, dstPitch, pSrc, srcPitch, roi, COPY_SYS_TO_SYS)); roi.height >>= 1; pSrc = src->Data.U; pDst = dst->Data.U; MFX_CHECK_NULL_PTR2(pSrc, pDst); roi.width >>= 1; srcPitch >>= 1; dstPitch >>= 1; MFX_SAFE_CALL(m_pFastCopy->Copy((mfxU8 *)pDst, dstPitch, (mfxU8 *)pSrc, srcPitch, roi, COPY_SYS_TO_SYS)); pSrc = src->Data.V; pDst = dst->Data.V; MFX_CHECK_NULL_PTR2(pSrc, pDst); return m_pFastCopy->Copy((mfxU8 *)pDst, dstPitch, (mfxU8 *)pSrc, srcPitch, roi, COPY_SYS_TO_SYS); case MFX_FOURCC_YUY2: roi.width *= 2; return m_pFastCopy->Copy(pDst, dstPitch, pSrc, srcPitch, roi, COPY_SYS_TO_SYS); case MFX_FOURCC_P8: MFX_CHECK(mfxU32(roi.width) * roi.height <= mfxU32(std::numeric_limits::max()), MFX_ERR_UNDEFINED_BEHAVIOR); roi = { roi.width * roi.height, 1 }; return m_pFastCopy->Copy(pDst, dstPitch, pSrc, srcPitch, roi, COPY_SYS_TO_SYS); default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } return MFX_ERR_NONE; } mfxStatus CoreDoSWFastCopy(mfxFrameSurface1 & dst, const mfxFrameSurface1 & src, int copyFlag) { IppiSize roi = { min(src.Info.Width, dst.Info.Width), min(src.Info.Height, dst.Info.Height) }; // check that region of interest is valid MFX_CHECK(roi.width && roi.height, MFX_ERR_UNDEFINED_BEHAVIOR); uint32_t srcPitch = src.Data.PitchLow + ((mfxU32)src.Data.PitchHigh << 16); uint32_t dstPitch = dst.Data.PitchLow + ((mfxU32)dst.Data.PitchHigh << 16); switch (dst.Info.FourCC) { case MFX_FOURCC_R16: roi.width *= 2; MFX_SAFE_CALL(FastCopy::Copy(dst.Data.R, dstPitch, src.Data.R, srcPitch, roi, copyFlag)); return MFX_ERR_NONE; case MFX_FOURCC_P010: case MFX_FOURCC_P016: if (src.Info.Shift != dst.Info.Shift) { mfxU8 lshift = 0; mfxU8 rshift = 0; if (src.Info.Shift != 0) rshift = (uint8_t)(16 - dst.Info.BitDepthLuma); else lshift = (uint8_t)(16 - dst.Info.BitDepthLuma); // CopyAndShift operates with 2-byte words, no need to multiply width by 2 MFX_SAFE_CALL(FastCopy::CopyAndShift((mfxU16*)(dst.Data.Y), dstPitch, (mfxU16 *)src.Data.Y, srcPitch, roi, lshift, rshift, copyFlag)); roi.height >>= 1; return FastCopy::CopyAndShift((mfxU16*)(dst.Data.UV), dstPitch, (mfxU16 *)src.Data.UV, srcPitch, roi, lshift, rshift, copyFlag); } else { roi.width <<= 1; MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); roi.height >>= 1; return FastCopy::Copy(dst.Data.UV, dstPitch, src.Data.UV, srcPitch, roi, copyFlag); } case MFX_FOURCC_P210: roi.width <<= 1; MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); return FastCopy::Copy(dst.Data.UV, dstPitch, src.Data.UV, srcPitch, roi, copyFlag); case MFX_FOURCC_NV12: MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); roi.height >>= 1; return FastCopy::Copy(dst.Data.UV, dstPitch, src.Data.UV, srcPitch, roi, copyFlag); case MFX_FOURCC_NV16: MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); return FastCopy::Copy(dst.Data.UV, dstPitch, src.Data.UV, srcPitch, roi, copyFlag); case MFX_FOURCC_YV12: MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); roi.width >>= 1; roi.height >>= 1; srcPitch >>= 1; dstPitch >>= 1; MFX_SAFE_CALL(FastCopy::Copy(dst.Data.U, dstPitch, src.Data.U, srcPitch, roi, copyFlag)); return FastCopy::Copy(dst.Data.V, dstPitch, src.Data.V, srcPitch, roi, copyFlag); case MFX_FOURCC_I420: MFX_SAFE_CALL(FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag)); roi.width >>= 1; roi.height >>= 1; srcPitch >>= 1; dstPitch >>= 1; MFX_SAFE_CALL(FastCopy::Copy(dst.Data.U, dstPitch, src.Data.U, srcPitch, roi, copyFlag)); return FastCopy::Copy(dst.Data.V, dstPitch, src.Data.V, srcPitch, roi, copyFlag); case MFX_FOURCC_UYVY: roi.width *= 2; return FastCopy::Copy(dst.Data.U, dstPitch, src.Data.U, srcPitch, roi, copyFlag); case MFX_FOURCC_YUY2: roi.width *= 2; return FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag); case MFX_FOURCC_Y210: case MFX_FOURCC_Y216: MFX_CHECK_NULL_PTR1(src.Data.Y); //we use 8u copy, so we need to increase ROI to handle 16 bit samples if (src.Info.Shift != dst.Info.Shift) { roi.width *= 2; // CopyAndShift operates with 2-byte words mfxU8 lshift = 0; mfxU8 rshift = 0; if (src.Info.Shift != 0) rshift = (mfxU8)(16 - dst.Info.BitDepthLuma); else lshift = (mfxU8)(16 - dst.Info.BitDepthLuma); return FastCopy::CopyAndShift((mfxU16*)(dst.Data.Y), dstPitch, (mfxU16 *)src.Data.Y, srcPitch, roi, lshift, rshift, copyFlag); } else { roi.width *= 4; return FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag); } case MFX_FOURCC_Y410: { MFX_CHECK_NULL_PTR1(dst.Data.Y410); mfxU8* ptrDst = (mfxU8*)dst.Data.Y410; mfxU8* ptrSrc = (mfxU8*)src.Data.Y410; roi.width *= 4; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } case MFX_FOURCC_Y416: MFX_CHECK_NULL_PTR1(src.Data.U16); //we use 8u copy, so we need to increase ROI to handle 16 bit samples if (src.Info.Shift != dst.Info.Shift) { roi.width *= 4; // CopyAndShift operates with 2-byte words mfxU8 lshift = 0; mfxU8 rshift = 0; if (src.Info.Shift != 0) rshift = (mfxU8)(16 - dst.Info.BitDepthLuma); else lshift = (mfxU8)(16 - dst.Info.BitDepthLuma); return FastCopy::CopyAndShift(dst.Data.U16, dstPitch, src.Data.U16, srcPitch, roi, lshift, rshift, copyFlag); } else { roi.width *= 8; return FastCopy::Copy((mfxU8*)dst.Data.U16, dstPitch, (mfxU8*)src.Data.U16, srcPitch, roi, copyFlag); } #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: { mfxU8* ptrSrc = src.Data.B; mfxU8* ptrDst = dst.Data.B; roi.width *= 2; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } #endif // MFX_ENABLE_FOURCC_RGB565 case MFX_FOURCC_RGB3: { mfxU8* ptrSrc = min({ src.Data.R, src.Data.G, src.Data.B }); mfxU8* ptrDst = min({ dst.Data.R, dst.Data.G, dst.Data.B }); roi.width *= 3; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: case MFX_FOURCC_BGRP: { mfxU8* ptrSrc = src.Data.B; mfxU8* ptrDst = dst.Data.B; MFX_SAFE_CALL(FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag)); ptrSrc = src.Data.G; ptrDst = dst.Data.G; MFX_SAFE_CALL(FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag)); ptrSrc = src.Data.R; ptrDst = dst.Data.R; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } #endif case MFX_FOURCC_AYUV: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_A2RGB10: { mfxU8* ptrSrc = min({ src.Data.R, src.Data.G, src.Data.B }); mfxU8* ptrDst = min({ dst.Data.R, dst.Data.G, dst.Data.B }); roi.width *= 4; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } case MFX_FOURCC_ARGB16: case MFX_FOURCC_ABGR16: { mfxU8* ptrSrc = min({ src.Data.R, src.Data.G, src.Data.B }); mfxU8* ptrDst = min({ dst.Data.R, dst.Data.G, dst.Data.B }); roi.width *= 8; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } case MFX_FOURCC_P8: return FastCopy::Copy(dst.Data.Y, dstPitch, src.Data.Y, srcPitch, roi, copyFlag); case MFX_FOURCC_ABGR16F: { MFX_CHECK_NULL_PTR1(src.Data.ABGRFP16); mfxU8* ptrSrc = (mfxU8*)src.Data.ABGRFP16; mfxU8* ptrDst = (mfxU8*)dst.Data.ABGRFP16; roi.width *= 8; return FastCopy::Copy(ptrDst, dstPitch, ptrSrc, srcPitch, roi, copyFlag); } default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } } mfxStatus CommonCORE::DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32) { // up mutex UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts; sts = CheckFrameData(pSrc); MFX_CHECK_STS(sts); sts = CheckFrameData(pDst); MFX_CHECK_STS(sts); // CheckFrameData should be added // check that only memId or pointer are passed // otherwise don't know which type of memory copying is requested if ( (NULL != pDst->Data.Y && NULL != pDst->Data.MemId) || (NULL != pSrc->Data.Y && NULL != pSrc->Data.MemId) ) { return MFX_ERR_UNDEFINED_BEHAVIOR; } bool isSrcLocked = false; bool isDstLocked = false; int copyFlag = COPY_SYS_TO_SYS; if (NULL != pSrc->Data.MemId) { // lock external frame sts = LockExternalFrame(pSrc->Data.MemId, &pSrc->Data); MFX_CHECK_STS(sts); isSrcLocked = true; copyFlag = COPY_VIDEO_TO_SYS; } if (NULL != pDst->Data.MemId) { sts = LockExternalFrame(pDst->Data.MemId, &pDst->Data); MFX_CHECK_STS(sts); isDstLocked = true; copyFlag = COPY_SYS_TO_VIDEO; } // system memories were passed // use common way to copy frames sts = CoreDoSWFastCopy(*pDst, *pSrc, copyFlag); if (isDstLocked) { // unlock external frame sts = UnlockExternalFrame(pDst->Data.MemId, &pDst->Data); MFX_CHECK_STS(sts); } if (isSrcLocked) { // unlock external frame sts = UnlockExternalFrame(pSrc->Data.MemId, &pSrc->Data); MFX_CHECK_STS(sts); } return MFX_ERR_NONE; } mfxStatus CommonCORE::CopyFrame(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) { if(!dst || !src) return MFX_ERR_NULL_PTR; if(!LumaIsNull(src) && !LumaIsNull(dst)) //input video frame is locked or system, call old copy function { mfxU16 srcMemType = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME; mfxU16 dstMemType = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME; return DoFastCopyWrapper(dst, dstMemType, src, srcMemType); } else if(src->Data.MemId && !LumaIsNull(dst)) { mfxHDLPair srcHandle = {}; mfxU16 srcMemType = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; mfxU16 dstMemType = MFX_MEMTYPE_SYSTEM_MEMORY; mfxStatus sts = GetExternalFrameHDL(src->Data.MemId, (mfxHDL *)&srcHandle); if(MFX_ERR_UNDEFINED_BEHAVIOR == sts) srcMemType |= MFX_MEMTYPE_INTERNAL_FRAME; else srcMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; dstMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = DoFastCopyWrapper(dst, dstMemType, src, srcMemType); MFX_CHECK_STS(sts); return sts; } else if(!LumaIsNull(src) && dst->Data.MemId) { mfxHDLPair dstHandle = {}; mfxU16 dstMemType = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; mfxU16 srcMemType = MFX_MEMTYPE_SYSTEM_MEMORY; mfxStatus sts = GetExternalFrameHDL(dst->Data.MemId, (mfxHDL *)&dstHandle); if(MFX_ERR_UNDEFINED_BEHAVIOR == sts) dstMemType |= MFX_MEMTYPE_INTERNAL_FRAME; else dstMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; srcMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = DoFastCopyWrapper(dst, dstMemType, src, srcMemType); MFX_CHECK_STS(sts); return sts; } else if(src->Data.MemId && dst->Data.MemId) { mfxHDLPair dstHandle = {}; mfxHDLPair srcHandle = {}; mfxU16 dstMemType = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; mfxU16 srcMemType = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; mfxStatus sts = GetExternalFrameHDL(dst->Data.MemId, (mfxHDL *)&dstHandle); if(MFX_ERR_UNDEFINED_BEHAVIOR == sts) dstMemType |= MFX_MEMTYPE_INTERNAL_FRAME; else dstMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = GetExternalFrameHDL(src->Data.MemId, (mfxHDL *)&srcHandle); if(MFX_ERR_UNDEFINED_BEHAVIOR == sts) srcMemType |= MFX_MEMTYPE_INTERNAL_FRAME; else srcMemType |= MFX_MEMTYPE_EXTERNAL_FRAME; sts = DoFastCopyWrapper(dst, dstMemType, src, srcMemType); return sts; } else { return MFX_ERR_UNDEFINED_BEHAVIOR; } } // 15 bits - uniq surface Id // 15 bits score Id bool CommonCORE::GetUniqID(mfxMemId& id) { size_t count = 1; CorrespTbl::iterator ctbl_it; for (; count < (1 << 15); count++) { ctbl_it = m_CTbl.find((mfxMemId)(count | (m_CoreId << 15))); if (ctbl_it == m_CTbl.end()) { id = (mfxMemId)(count | (m_CoreId << 15)); return true; } } return false; } bool CommonCORE::SetCoreId(mfxU32 Id) { if (m_CoreId < (1 << 15)) { m_CoreId = Id; return true; } return false; } void* CommonCORE::QueryCoreInterface(const MFX_GUID &guid) { if (MFXIVideoCORE_GUID == guid) return (void*) this; if (MFXIEXTERNALLOC_GUID == guid && m_bSetExtFrameAlloc) return &m_FrameAllocator.frameAllocator; if (MFXICORE_API_1_19_GUID == guid) return &m_API_1_19; return nullptr; } mfxU16 CommonCORE::GetAutoAsyncDepth() { return (mfxU16)std::thread::hardware_concurrency(); } // keep frame response structure describing plug-in memory surfaces void CommonCORE::AddPluginAllocResponse(mfxFrameAllocResponse& response) { m_PlugInMids.push_back(response); } // get response which corresponds required conditions: same mids and number mfxFrameAllocResponse *CommonCORE::GetPluginAllocResponse(mfxFrameAllocResponse& temp_response) { std::vector::iterator ref_it; for (ref_it = m_PlugInMids.begin(); ref_it != m_PlugInMids.end(); ref_it++) { if (IsEqual(*ref_it, temp_response)) { temp_response = *ref_it; m_PlugInMids.erase(ref_it); return &temp_response; } } return NULL; } mfxStatus CommonCORE_VPL::AllocFrames(mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool) { MFX_CHECK_NULL_PTR2(request, response); // Do not lock mutex here, allocator designed to be thread-safe mfxStatus sts = m_frame_allocator_wrapper.Alloc(*request, *response); MFX_LTRACE_I(MFX_TRACE_LEVEL_PARAMS, sts); return sts; } mfxStatus CommonCORE_VPL::LockFrame(mfxMemId mid, mfxFrameData *ptr) { MFX_CHECK_NULL_PTR1(ptr); return m_frame_allocator_wrapper.Lock(mid, ptr); } mfxStatus CommonCORE_VPL::GetFrameHDL(mfxMemId mid, mfxHDL* handle, bool) { MFX_CHECK_HDL(handle); return m_frame_allocator_wrapper.GetHDL(mid, *handle); } mfxStatus CommonCORE_VPL::UnlockFrame(mfxMemId mid, mfxFrameData *ptr) { return m_frame_allocator_wrapper.Unlock(mid, ptr); } mfxStatus CommonCORE_VPL::FreeFrames(mfxFrameAllocResponse *response, bool) { MFX_CHECK_NULL_PTR1(response); return m_frame_allocator_wrapper.Free(*response); } mfxStatus CommonCORE_VPL::LockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool) { return LockFrame(mid, ptr); } mfxStatus CommonCORE_VPL::GetExternalFrameHDL(mfxMemId mid, mfxHDL *handle, bool) { return GetFrameHDL(mid, handle); } mfxStatus CommonCORE_VPL::UnlockExternalFrame(mfxMemId mid, mfxFrameData *ptr, bool) { return UnlockFrame(mid, ptr); } CommonCORE_VPL::CommonCORE_VPL(const mfxU32 numThreadsAvailable, const mfxSession session) : deprecate_from_base(numThreadsAvailable, session) // At this point only object of CommonCORE_VPL exists, so it is CommonCORE_VPL::IsSupportedDelayAlloc being called , m_frame_allocator_wrapper(IsSupportedDelayAlloc()) { m_frame_allocator_wrapper.allocator_sw.reset(new FlexibleFrameAllocatorSW(nullptr, m_session)); } mfxStatus CommonCORE_VPL::SetFrameAllocator(mfxFrameAllocator *allocator) { // Unconditional call to set it to both cores because on Linux SetAllocator // may precede SetHandle for device // i.e. we won't know which feature set will be used at this point MFX_SAFE_CALL(CommonCORE::SetFrameAllocator(allocator)); if (!allocator) return MFX_ERR_NONE; UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK(!m_frame_allocator_wrapper.IsExtAllocatorSet(), MFX_ERR_UNDEFINED_BEHAVIOR); m_frame_allocator_wrapper.SetFrameAllocator(*allocator); return MFX_ERR_NONE; } bool CommonCORE_VPL::IsExternalFrameAllocator() const { return m_frame_allocator_wrapper.IsExtAllocatorSet(); } pair CommonCORE_VPL::Lock(mfxFrameSurface1& surf, mfxU32 flags) { // Priority 1: If pointers were already set - do nothing if (GetFramePointer(surf.Info.FourCC, surf.Data)) return { MFX_ERR_NONE, false }; // Priority 2: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Map) return { surf.FrameInterface->Map(&surf, flags), true }; // Priority 3: type set to external / not set, lock as external if (!surf.Data.MemType || (surf.Data.MemType & MFX_MEMTYPE_EXTERNAL_FRAME)) return { LockExternalFrame(surf.Data.MemId, &surf.Data), true }; // Priority 4: Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) return { LockFrame(surf.Data.MemId, &surf.Data), true }; } pair CommonCORE_VPL::LockInternal(mfxFrameSurface1& surf, mfxU32 flags) { // Priority 1: If pointers were already set - do nothing if (GetFramePointer(surf.Info.FourCC, surf.Data)) return { MFX_ERR_NONE, false }; // Priority 2: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Map) return { surf.FrameInterface->Map(&surf, flags), true }; // Priority 3: SKIPPED type set to external / not set, lock as external // Priority 4: Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) return { LockFrame(surf.Data.MemId, &surf.Data), true }; } pair CommonCORE_VPL::LockExternal(mfxFrameSurface1& surf, mfxU32 flags) { // Priority 1: If pointers were already set - do nothing if (GetFramePointer(surf.Info.FourCC, surf.Data)) return { MFX_ERR_NONE, false }; // Priority 2: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Map) return { surf.FrameInterface->Map(&surf, flags), true }; // Priority 3: type set to external / not set, lock as external return { LockExternalFrame(surf.Data.MemId, &surf.Data), true }; // Priority 4: SKIPPED - Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) } mfxStatus CommonCORE_VPL::Unlock(mfxFrameSurface1& surf) { // Priority 1: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Unmap) return surf.FrameInterface->Unmap(&surf); // Priority 2: type set to external / not set, unlock as external if (!surf.Data.MemType || (surf.Data.MemType & MFX_MEMTYPE_EXTERNAL_FRAME)) return UnlockExternalFrame(surf.Data.MemId, &surf.Data); // Priority 3: Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) return UnlockFrame(surf.Data.MemId, &surf.Data); } mfxStatus CommonCORE_VPL::UnlockExternal(mfxFrameSurface1& surf) { // Priority 1: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Unmap) return surf.FrameInterface->Unmap(&surf); // Priority 2: type set to external / not set, unlock as external return UnlockExternalFrame(surf.Data.MemId, &surf.Data); // Priority 3: SKIPPED - Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) } mfxStatus CommonCORE_VPL::UnlockInternal(mfxFrameSurface1& surf) { // Priority 1: If mfxFrameSurfaceInterface is provided, use it if (surf.FrameInterface && surf.FrameInterface->Unmap) return surf.FrameInterface->Unmap(&surf); // Priority 2: SKIPPED type set to external / not set, unlock as external // Priority 3: Remaining case - internal frame (MFX_MEMTYPE_INTERNAL_FRAME) return UnlockFrame(surf.Data.MemId, &surf.Data); } mfxStatus CommonCORE_VPL::SwitchMemidInSurface(mfxFrameSurface1 & surf, mfxHDLPair& handle_pair) { if (surf.Data.MemType & MFX_MEMTYPE_INTERNAL_FRAME) { MFX_SAFE_CALL(VideoCORE::GetFrameHDL(surf, handle_pair)); } else { MFX_SAFE_CALL(VideoCORE::GetExternalFrameHDL(surf, handle_pair)); } surf.Data.MemId = &handle_pair; return MFX_ERR_NONE; } mfxStatus CommonCORE_VPL::DoFastCopyWrapper(mfxFrameSurface1 *pDst, mfxU16 dstMemType, mfxFrameSurface1 *pSrc, mfxU16 srcMemType, mfxU32) { MFX_CHECK_NULL_PTR2(pSrc, pDst); // uncomment underlying checks after additional validation //MFX_CHECK(!pSrc->Data.MemType || MFX_MEMTYPE_BASE(pSrc->Data.MemType) == MFX_MEMTYPE_BASE(srcMemType), MFX_ERR_UNSUPPORTED); //MFX_CHECK(!pDst->Data.MemType || MFX_MEMTYPE_BASE(pDst->Data.MemType) == MFX_MEMTYPE_BASE(dstMemType), MFX_ERR_UNSUPPORTED); mfxFrameSurface1 srcTempSurface = *pSrc, dstTempSurface = *pDst; srcTempSurface.Data.MemType = srcMemType; dstTempSurface.Data.MemType = dstMemType; mfxFrameSurface1_scoped_lock src_surf_lock(&srcTempSurface, this); mfxStatus sts = src_surf_lock.lock(MFX_MAP_READ, SurfaceLockType::LOCK_GENERAL); MFX_CHECK_STS(sts); srcTempSurface.Data.MemId = 0; mfxFrameSurface1_scoped_lock dst_surf_lock(&dstTempSurface, this); sts = dst_surf_lock.lock(MFX_MAP_WRITE, SurfaceLockType::LOCK_GENERAL); MFX_CHECK_STS(sts); dstTempSurface.Data.MemId = 0; sts = DoFastCopyExtended(&dstTempSurface, &srcTempSurface); MFX_CHECK_STS(sts); sts = src_surf_lock.unlock(); MFX_CHECK_STS(sts); return dst_surf_lock.unlock(); } mfxStatus CommonCORE_VPL::DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, mfxU32) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = CheckFrameData(pSrc); MFX_CHECK_STS(sts); sts = CheckFrameData(pDst); MFX_CHECK_STS(sts); // Check that only memId or pointer are passed // otherwise don't know which type of memory copying is requested MFX_CHECK((!!GetFramePointer(*pDst) != !!pDst->Data.MemId) && (!!GetFramePointer(*pSrc) != !!pSrc->Data.MemId), MFX_ERR_UNDEFINED_BEHAVIOR); // Check that it is not VIDEO_TO_VIDEO case MFX_CHECK(!pDst->Data.MemId || !pSrc->Data.MemId, MFX_ERR_UNDEFINED_BEHAVIOR); int copyFlag = COPY_SYS_TO_SYS; if (pSrc->Data.MemId) { copyFlag = COPY_VIDEO_TO_SYS; } if (pDst->Data.MemId) { copyFlag = COPY_SYS_TO_VIDEO; } // system memories were passed // use common way to copy frames return CoreDoSWFastCopy(*pDst, *pSrc, copyFlag); } mfxStatus CommonCORE_VPL::DeriveMemoryType(const mfxFrameSurface1& surf, mfxU16& derived_memtype) { // Priority 1. If pointers set - treat as SYSTEM | EXTERNAL and pass further if (!LumaIsNull(&surf)) { derived_memtype = MFX_MEMTYPE_SYSTEM_MEMORY | MFX_MEMTYPE_EXTERNAL_FRAME; return MFX_ERR_NONE; } // Priority 2. If memId set - treat as VIDEO | (EXTERNAL or INTERNAL) and pass further if (surf.Data.MemId) { mfxHDLPair handle_pair = {}; derived_memtype = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; mfxStatus sts = GetExternalFrameHDL(surf.Data.MemId, (mfxHDL *)&handle_pair); if (MFX_ERR_UNDEFINED_BEHAVIOR == sts) derived_memtype |= MFX_MEMTYPE_INTERNAL_FRAME; else derived_memtype |= MFX_MEMTYPE_EXTERNAL_FRAME; return MFX_ERR_NONE; } MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } mfxStatus CommonCORE_VPL::CopyFrame(mfxFrameSurface1 *dst, mfxFrameSurface1 *src) { MFX_CHECK_NULL_PTR2(dst, src); mfxU16 srcMemType, dstMemType; mfxStatus sts = DeriveMemoryType(*src, srcMemType); MFX_CHECK_STS(sts); sts = DeriveMemoryType(*dst, dstMemType); MFX_CHECK_STS(sts); return DoFastCopyWrapper(dst, dstMemType, src, srcMemType); } void* CommonCORE_VPL::QueryCoreInterface(const MFX_GUID &guid) { if (MFXIEXTERNALLOC_GUID == guid) return m_frame_allocator_wrapper.GetExtAllocator(); if (MFXAllocatorWrapper_GUID == guid) return &m_frame_allocator_wrapper; if (MFXICommonCORE_VPL_GUID == guid) return this; return CommonCORE::QueryCoreInterface(guid); } mfxStatus CommonCORE_VPL::CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1* & surf) { return m_frame_allocator_wrapper.CreateSurface(type, info, surf); } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/libmfx_core_factory.cpp000066400000000000000000000036361443134507600275260ustar00rootroot00000000000000// Copyright (c) 2011-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include #include #include VideoCORE* FactoryCORE::CreateCORE(eMFXVAType va_type, mfxU32 adapterNum, const std::pair> & affinityMask, mfxU32 numThreadsAvailable, mfxSession session) { (void)adapterNum; std::ignore = affinityMask; switch (va_type) { case MFX_HW_NO: return new CommonCORE_VPL(numThreadsAvailable, session); case MFX_HW_VAAPI: return new VAAPIVideoCORE_VPL(adapterNum, affinityMask, numThreadsAvailable, session); default: return nullptr; } } // VideoCORE* FactoryCORE::CreateCORE(eMFXVAType va_type) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/libmfx_core_hw.cpp000066400000000000000000000107671443134507600265000ustar00rootroot00000000000000// Copyright (c) 2007-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #include "libmfx_core_hw.h" #include "mfx_common_decode_int.h" #include "mfx_enc_common.h" #include "mfxpcp.h" #include "mfx_ext_buffers.h" #include "umc_va_base.h" using namespace UMC; mfxU32 ChooseProfile(mfxVideoParam const* param, eMFXHWType) { mfxU32 profile = UMC::VA_VLD; // video accelerator is needed for decoders only switch (param->mfx.CodecId) { case MFX_CODEC_VC1: profile |= VA_VC1; break; case MFX_CODEC_MPEG2: profile |= VA_MPEG2; break; case MFX_CODEC_AVC: { profile |= VA_H264; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (IsSVCProfile(profile_idc)) { profile |= (profile_idc == MFX_PROFILE_AVC_SCALABLE_HIGH) ? VA_PROFILE_SVC_HIGH : VA_PROFILE_SVC_BASELINE; } #endif } break; case MFX_CODEC_JPEG: profile |= VA_JPEG; break; case MFX_CODEC_VP8: profile |= VA_VP8; break; case MFX_CODEC_VP9: profile |= VA_VP9; switch (param->mfx.FrameInfo.FourCC) { case MFX_FOURCC_P010: profile |= VA_PROFILE_10; break; case MFX_FOURCC_AYUV: profile |= VA_PROFILE_444; break; case MFX_FOURCC_Y410: profile |= VA_PROFILE_10 | VA_PROFILE_444; break; case MFX_FOURCC_P016: profile |= VA_PROFILE_12; break; case MFX_FOURCC_Y416: profile |= VA_PROFILE_12 | VA_PROFILE_444; break; } break; #if defined(MFX_ENABLE_AV1_VIDEO_CODEC) case MFX_CODEC_AV1: profile |= VA_AV1; switch (param->mfx.FrameInfo.FourCC) { case MFX_FOURCC_P010: profile |= VA_PROFILE_10; break; } break; #endif case MFX_CODEC_HEVC: profile |= VA_H265; switch (param->mfx.FrameInfo.FourCC) { case MFX_FOURCC_P010: profile |= VA_PROFILE_10; break; case MFX_FOURCC_YUY2: profile |= VA_PROFILE_422; break; case MFX_FOURCC_AYUV: profile |= VA_PROFILE_444; break; case MFX_FOURCC_Y210: profile |= VA_PROFILE_10 | VA_PROFILE_422; break; case MFX_FOURCC_Y410: profile |= VA_PROFILE_10 | VA_PROFILE_444; break; case MFX_FOURCC_P016: profile |= VA_PROFILE_12; break; case MFX_FOURCC_Y216: profile |= VA_PROFILE_12 | VA_PROFILE_422; break; case MFX_FOURCC_Y416: profile |= VA_PROFILE_12 | VA_PROFILE_444; break; } { mfxU32 const profile_idc = ExtractProfile(param->mfx.CodecProfile); if (profile_idc == MFX_PROFILE_HEVC_SCC) profile |= VA_PROFILE_SCC; if (profile_idc == MFX_PROFILE_HEVC_REXT) profile |= VA_PROFILE_REXT; } break; default: return 0; } #ifdef MFX_EXTBUFF_FORCE_PRIVATE_DDI_ENABLE { mfxExtBuffer* extbuf = GetExtendedBuffer(param->ExtParam, param->NumExtParam, MFX_EXTBUFF_FORCE_PRIVATE_DDI); if (extbuf) profile |= VA_PRIVATE_DDI_MODE; } #endif return profile; } /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/libmfx_core_vaapi.cpp000066400000000000000000002121001443134507600271430ustar00rootroot00000000000000// Copyright (c) 2007-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfx_common.h" #include "umc_va_linux.h" #include "libmfx_core_vaapi.h" #include "mfx_utils.h" #include "mfx_session.h" #include "ippi.h" #include "mfx_common_decode_int.h" #include "mfx_enc_common.h" #include "libmfx_core_hw.h" #ifdef MFX_ENABLE_EXT #include "cm_mem_copy.h" #else #include "cm_mem_copy_stub.h" #endif #include #include "va/va.h" #include #include "va/va_drm.h" #include #include #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_video_accelerator_vaapi.h" #endif // MFX_ENABLE_PXP typedef struct drm_i915_getparam { int param; int *value; } drm_i915_getparam_t; #define I915_PARAM_CHIPSET_ID 4 #define DRM_I915_GETPARAM 0x06 #define DRM_IOCTL_BASE 'd' #define DRM_COMMAND_BASE 0x40 #define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type) #define DRM_IOCTL_I915_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, drm_i915_getparam_t) using namespace std; using namespace UMC; static mfx_device_item getDeviceItem(VADisplay pVaDisplay) { /* This is value by default */ mfx_device_item retDeviceItem = { 0x0000, MFX_HW_UNKNOWN, MFX_GT_UNKNOWN }; VADisplayContextP pDisplayContext_test = reinterpret_cast(pVaDisplay); VADriverContextP pDriverContext_test = pDisplayContext_test->pDriverContext; int fd = *(int*)pDriverContext_test->drm_state; /* Now as we know real authenticated fd of VAAPI library, * we can call ioctl() to kernel mode driver, * get device ID and find out platform type * */ int devID = 0; drm_i915_getparam_t gp; gp.param = I915_PARAM_CHIPSET_ID; gp.value = &devID; int ret = ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp); if (!ret) { mfxU32 listSize = (sizeof(listLegalDevIDs) / sizeof(mfx_device_item)); for (mfxU32 i = 0; i < listSize; ++i) { if (listLegalDevIDs[i].device_id == devID) { retDeviceItem = listLegalDevIDs[i]; break; } } } return retDeviceItem; } // eMFXHWType getDeviceItem (VADisplay pVaDisplay) class VACopyWrapper { public: enum eMode { VACOPY_UNSUPPORTED = -1 , VACOPY_VIDEO_TO_VIDEO , VACOPY_SYSTEM_TO_VIDEO , VACOPY_VIDEO_TO_SYSTEM }; enum eEngine { INVALID = uint32_t(-1) , BLT = VA_EXEC_MODE_POWER_SAVING , VE = VA_EXEC_MODE_DEFAULT , EU = VA_EXEC_MODE_PERFORMANCE , DEFAULT = 0xff }; struct FCCDesc { uint32_t VAFourcc; std::function SetBuffers; std::function CheckPlanes; }; struct Buffer { bool bLocked = false; std::vector Buffer; }; class SurfaceWrapper { public: SurfaceWrapper(VADisplay dpy, const mfxFrameSurface1& surf, Buffer* pStagingBuffer, uint32_t copyEngine) : m_dpy(dpy) { if (copyEngine == EU || copyEngine == BLT) m_pitchAlign = 16; else if(copyEngine == VE) m_pitchAlign = 64; if (pStagingBuffer) { m_pBuffer = &pStagingBuffer->Buffer; AcquireSurface(surf); } else { m_id = *(VASurfaceID*)((mfxHDLPair*)surf.Data.MemId)->first; } } ~SurfaceWrapper() { if (m_id != VA_INVALID_SURFACE && m_bDestroySurface) std::ignore = MFX_STS_TRACE(vaDestroySurfaces(m_dpy, &m_id, 1)); } VASurfaceID GetId() const { return m_id; } void CopyUserToStaging() { if (m_bUseStaging) Copy(m_user, m_staging); } void CopyStagingToUser() { if (m_bUseStaging) Copy(m_staging, m_user); } protected: void AcquireSurface(const mfxFrameSurface1& surf) { auto& fcc = FccMap.at(surf.Info.FourCC); VASurfaceAttrib attrib[3] = {}; VASurfaceAttribExternalBuffers eb = {}; attrib[0].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[0].type = VASurfaceAttribPixelFormat; attrib[0].value.type = VAGenericValueTypeInteger; attrib[0].value.value.i = fcc.VAFourcc; attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[1].type = VASurfaceAttribMemoryType; attrib[1].value.type = VAGenericValueTypeInteger; attrib[1].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR; attrib[2].flags = VA_SURFACE_ATTRIB_SETTABLE; attrib[2].type = VASurfaceAttribExternalBufferDescriptor; attrib[2].value.type = VAGenericValueTypePointer; attrib[2].value.value.p = (void*)&eb; eb = SetBuffers(surf, fcc); auto vaSts = vaCreateSurfaces(m_dpy, eb.pixel_format, eb.width, eb.height, &m_id, 1, attrib, 3); if (vaSts != VA_STATUS_SUCCESS) m_id = VA_INVALID_SURFACE; else m_bDestroySurface = true; } VASurfaceAttribExternalBuffers SetBuffers(const mfxFrameSurface1& surf, const VACopyWrapper::FCCDesc& fcc) { auto GetPlane0Size = [](const VASurfaceAttribExternalBuffers& eb) { return (eb.num_planes > 1 ? eb.offsets[1] : eb.data_size) - eb.offsets[0]; }; auto upBase = uintptr_t(GetFramePointer(surf)); m_user.pixel_format = fcc.VAFourcc; m_user.width = surf.Info.Width; m_user.height = surf.Info.Height; m_user.flags = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR; m_user.buffers = m_buffersUser; m_user.buffers[0] = (upBase - (upBase % BASE_ADDR_ALIGN)); m_user.offsets[0] = (upBase - m_user.buffers[0]); m_user.pitches[0] = VACopyWrapper::GetPitch(surf); m_user.num_buffers = 1; m_staging = m_user; fcc.SetBuffers(surf, m_user, true); m_bUseStaging = (!m_bOffsetSupported && m_user.offsets[0]) // data offset from mem page start || (!m_bOffsetSupported && (m_user.data_size % BASE_ADDR_ALIGN)) // data size alignment || (m_user.pitches[0] % m_pitchAlign) // H-pitch || ((GetPlane0Size(m_user) / m_user.pitches[0]) % m_pitchAlign) // V-pitch || !fcc.CheckPlanes(surf); // continuous planes allocation if (!m_bUseStaging) { m_staging = {}; return m_user; } m_staging.offsets[0] = 0; m_staging.pitches[0] = mfx::align2_value(m_user.pitches[0], m_pitchAlign); fcc.SetBuffers(surf, m_staging, false); if(m_pBuffer->size() < (m_staging.data_size + BASE_ADDR_ALIGN)) m_pBuffer->resize(m_staging.data_size + BASE_ADDR_ALIGN); m_staging.buffers = m_buffersStaging; m_staging.buffers[0] = uintptr_t(mfx::align2_value(uintptr_t(m_pBuffer->data()), BASE_ADDR_ALIGN)); m_staging.data_size = mfx::align2_value(m_staging.data_size, BASE_ADDR_ALIGN); return m_staging; } void Copy(const VASurfaceAttribExternalBuffers& src, VASurfaceAttribExternalBuffers& dst) { for (uint32_t plane = 0; plane < dst.num_planes; ++plane) { auto pSrc = (uint8_t*)(src.buffers[0] + src.offsets[plane]); auto pDst = (uint8_t*)(dst.buffers[0] + dst.offsets[plane]); auto hpitchSrc = src.pitches[plane]; auto hpitchDst = dst.pitches[plane]; auto vpitchSrc = (src.num_planes > (plane + 1)) ? (src.offsets[plane + 1] - src.offsets[plane]) / hpitchSrc : (src.data_size - src.offsets[plane]) / hpitchSrc; auto vpitchDst = (dst.num_planes > (plane + 1)) ? (dst.offsets[plane + 1] - dst.offsets[plane]) / hpitchDst : (dst.data_size - dst.offsets[plane]) / hpitchDst; auto roiW = std::min(hpitchSrc, hpitchDst); auto roiH = std::min(vpitchSrc, vpitchDst); for (uint32_t y = 0; y < roiH; ++y) { std::copy(pSrc, pSrc + roiW, pDst); pSrc += hpitchSrc; pDst += hpitchDst; } } } static const uint32_t BASE_ADDR_ALIGN = 0x1000; // vaCreateSurfaces requires user ptr data to be aligned to memory page bool m_bOffsetSupported = false; // is copy engine supports data offset from mem page start // it looks like is unsupported by vaCreateSurfaces atm uint32_t m_pitchAlign = 64; // copy engine requirements to both h-pitch and v-pitch VADisplay m_dpy = nullptr; VASurfaceID m_id = VA_INVALID_SURFACE; VASurfaceAttribExternalBuffers m_user = {}, m_staging = {}; uintptr_t m_buffersUser[1] = {}, m_buffersStaging[1] = {}; bool m_bUseStaging = false; std::vector* m_pBuffer = nullptr; bool m_bDestroySurface = false; }; static const std::map FccMap; VADisplay m_dpy = nullptr; uint32_t m_copyEngine = INVALID; uint32_t m_copyEngineSupported = 0; VACopyWrapper(VADisplay dpy) : m_dpy(dpy) { int nAttr = vaMaxNumDisplayAttributes(m_dpy); std::vector attrs(nAttr); if (VA_STATUS_SUCCESS != vaQueryDisplayAttributes(m_dpy, attrs.data(), &nAttr)) nAttr = 0; auto itEnd = std::next(attrs.begin(), nAttr); auto it = std::find_if(attrs.begin(), itEnd , [](const VADisplayAttribute& attr) { return attr.type == VADisplayAttribCopy; }); if (it != itEnd) { m_copyEngineSupported = it->value; if (m_copyEngineSupported & (1 << EU)) m_copyEngine = EU; else if (m_copyEngineSupported & (1 << BLT)) m_copyEngine = BLT; else if (m_copyEngineSupported & (1 << VE)) m_copyEngine = VE; } } bool IsSupported() const { return m_dpy && m_copyEngine != INVALID; } eMode GetMode(const mfxFrameSurface1& src, const mfxFrameSurface1& dst) const { bool bSupported = IsSupported() && dst.Info.FourCC == src.Info.FourCC && !dst.Info.Shift == !src.Info.Shift && FccMap.count(dst.Info.FourCC) ; if (bSupported) { auto pSrc = GetFramePointer(src); auto pDst = GetFramePointer(dst); auto midSrc = src.Data.MemId; auto midDst = dst.Data.MemId; if (midSrc && midDst) return VACOPY_VIDEO_TO_VIDEO; if (pSrc && midDst) return VACOPY_SYSTEM_TO_VIDEO; if (midSrc && pDst) return VACOPY_VIDEO_TO_SYSTEM; } return VACOPY_UNSUPPORTED; } mfxStatus Copy(const mfxFrameSurface1& src, const mfxFrameSurface1& dst, eEngine forceEngine = DEFAULT) { uint32_t copyEngine = (forceEngine == DEFAULT) ? m_copyEngine : uint32_t(forceEngine); auto copyMode = GetMode(src, dst); MFX_CHECK(copyMode != VACOPY_UNSUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK(forceEngine == DEFAULT || ((1 << forceEngine) & m_copyEngineSupported), MFX_ERR_UNSUPPORTED); if ( src.Info.Width != dst.Info.Width || src.Info.Height != dst.Info.Height) copyEngine = BLT; auto pSrcBuffer = GetSrcBuffer(copyMode); mfx::OnExit releaseSrc([&] { Release(pSrcBuffer); }); auto pDstBuffer = GetDstBuffer(copyMode); mfx::OnExit releaseDst([&] { Release(pDstBuffer); }); SurfaceWrapper surfSrc(m_dpy, src, pSrcBuffer, copyEngine); MFX_CHECK(surfSrc.GetId() != VA_INVALID_SURFACE, MFX_ERR_DEVICE_FAILED); SurfaceWrapper surfDst(m_dpy, dst, pDstBuffer, copyEngine); MFX_CHECK(surfDst.GetId() != VA_INVALID_SURFACE, MFX_ERR_DEVICE_FAILED); surfSrc.CopyUserToStaging(); VACopyObject objSrc = {}, objDst = {}; VACopyOption opt = {}; objSrc.obj_type = VACopyObjectSurface; objSrc.object.surface_id = surfSrc.GetId(); objDst.obj_type = VACopyObjectSurface; objDst.object.surface_id = surfDst.GetId(); opt.bits.va_copy_mode = copyEngine; opt.bits.va_copy_sync = VA_EXEC_SYNC; auto vaCopySts = vaCopy(m_dpy, &objDst, &objSrc, opt); MFX_CHECK(vaCopySts == VA_STATUS_SUCCESS, MFX_ERR_DEVICE_FAILED); surfDst.CopyStagingToUser(); return MFX_ERR_NONE; } static bool IsSupportedByPlatform(eMFXHWType hw_type) { switch (hw_type) { case MFX_HW_PVC: case MFX_HW_MTL: case MFX_HW_DG2: return true; default: return false; } } static void SetBuffersNV12(const mfxFrameSurface1& surf, VASurfaceAttribExternalBuffers& eb, bool bUsePtrs) { eb.offsets[1] = bUsePtrs ? uint32_t(uintptr_t(surf.Data.UV) - eb.buffers[0]) : uint32_t(eb.pitches[0] * eb.height); eb.pitches[1] = eb.pitches[0]; eb.num_planes = 2; eb.data_size = eb.offsets[1] + (eb.height * eb.pitches[1] / 2); } static void SetBuffersYV12(const mfxFrameSurface1& surf, VASurfaceAttribExternalBuffers& eb, bool bUsePtrs) { eb.pitches[1] = eb.pitches[0] / 2; eb.pitches[2] = eb.pitches[0] / 2; if (bUsePtrs) { eb.offsets[1] = uint32_t(uintptr_t(surf.Data.V) - eb.buffers[0]); eb.offsets[2] = uint32_t(uintptr_t(surf.Data.U) - eb.buffers[0]); } else { eb.offsets[1] = eb.offsets[0] + uint32_t(eb.height * eb.pitches[1] / 2); eb.offsets[2] = eb.offsets[1] + uint32_t(eb.height * eb.pitches[2] / 2); } eb.num_planes = 3; eb.data_size = eb.offsets[2] + (eb.height * eb.pitches[2] / 2); } static void SetBuffersOnePlane(const mfxFrameSurface1& surf, VASurfaceAttribExternalBuffers& eb, bool /*bUsePtrs*/) { eb.num_planes = 1; eb.data_size = eb.offsets[0] + (eb.height * eb.pitches[0]); } template static void SetBuffersNPlanes444(const mfxFrameSurface1& surf, VASurfaceAttribExternalBuffers& eb, bool bUsePtrs) { eb.num_planes = N; if (bUsePtrs) { std::list ptrs({ uintptr_t(surf.Data.A), uintptr_t(surf.Data.B), uintptr_t(surf.Data.G), uintptr_t(surf.Data.R) }); ptrs.sort(); while (ptrs.size() >= N) ptrs.pop_front(); for (uint32_t plane = 1; plane < eb.num_planes; ++plane) { eb.pitches[plane] = eb.pitches[0]; eb.offsets[plane] = uint32_t(ptrs.front() - eb.buffers[0]); ptrs.pop_front(); } } else { for (uint32_t plane = 1; plane < eb.num_planes; ++plane) { eb.pitches[plane] = eb.pitches[0]; eb.offsets[plane] = uint32_t(eb.pitches[0] * eb.height); } } eb.data_size = eb.offsets[N - 1] + (eb.height * eb.pitches[0]); } static uint32_t GetPitch(const mfxFrameSurface1& surf) { return (surf.Data.PitchHigh << 16) + surf.Data.PitchLow; } static bool CheckPlanesNV12(const mfxFrameSurface1& surf) { uint32_t pitch = GetPitch(surf); ptrdiff_t offset = surf.Data.UV - (surf.Data.Y + surf.Info.Height * pitch); return offset == 0; } static bool CheckPlanesYV12(const mfxFrameSurface1& surf) { uint32_t pitch = GetPitch(surf); ptrdiff_t offsetV = surf.Data.V - (surf.Data.Y + surf.Info.Height * pitch); ptrdiff_t offsetU = surf.Data.U - (surf.Data.V + surf.Info.Height * pitch / 4); return offsetV == 0 && offsetU == 0; } static bool CheckPlanes444(const mfxFrameSurface1& surf) { uint32_t pitch = GetPitch(surf); std::list ptrs({ uintptr_t(surf.Data.A), uintptr_t(surf.Data.B), uintptr_t(surf.Data.G), uintptr_t(surf.Data.R) }); ptrs.sort(); ptrs.remove(0); while (ptrs.size() >= 2) { uintptr_t ptr0 = ptrs.front(); ptrs.pop_front(); if (ptrs.front() != (ptr0 + pitch * surf.Info.Height)) return false; } return true; } static bool CheckPlanesOne(const mfxFrameSurface1&) { return true; } static bool IsTwoPlanesFormat(mfxU32 fourcc) { return fourcc == MFX_FOURCC_NV12 || fourcc == MFX_FOURCC_P010 || fourcc == MFX_FOURCC_P016; } static bool IsVaCopySupportSurface(const mfxFrameSurface1& dst_surface, const mfxFrameSurface1& src_surface) { auto CheckOneSurface = [](const mfxFrameSurface1& sw_surface) { // Only start addresses with 4k aligment for UsrPtr surface are supported, refer: https://dri.freedesktop.org/docs/drm/gpu/driver-uapi.html#c.drm_i915_gem_userptr if ((size_t)sw_surface.Data.Y % BASE_ADDR_ALIGN) return false; // Pitch should be 16-aligned if (sw_surface.Data.Pitch % 16) return false; // Pixel data is stored continuously for chroma and Luma for multiplane format. if (!IsTwoPlanesFormat(sw_surface.Info.FourCC)) return true; // Two planes format size_t luma_size_in_bytes_aligned = sw_surface.Data.Pitch * mfx::align2_value(sw_surface.Info.Height, 32); size_t luma_size_in_bytes = sw_surface.Data.Pitch * mfx::align2_value(sw_surface.Info.Height, 1); // Assume that frame data is stored in continuous chunk (Chroma right after Luma) // use relative offset between UV and Y, not pitch * height // Two cases need to be checked: // 1. Height 32 aligned, e.g, internal allocator need this path // 2. Height not aligned, i.e., app uses specific allocator without alignment. // vaCopy can't support the two planes' formats which are not stored continuously. // App need copy each plane as 1 plane format if it still keep Luma/ chroma plan using noncontinuous chunk. return (sw_surface.Data.Y + luma_size_in_bytes_aligned == sw_surface.Data.UV) || (sw_surface.Data.Y + luma_size_in_bytes == sw_surface.Data.UV); }; // SW to SW copy is not supported if (dst_surface.Data.Y && src_surface.Data.Y) return false; // If dst surface is in SW memory, check it's data layout if (dst_surface.Data.Y && !CheckOneSurface(dst_surface)) return false; // If src surface is in SW memory, check it's data layout if (src_surface.Data.Y && !CheckOneSurface(src_surface)) return false; return true; } protected: static const uint32_t VACOPY_CACHE_SIZE = 3; static const uint32_t VACOPY_CACHE_WAIT_MS = 2000; std::mutex m_mtx; std::condition_variable m_cv; Buffer m_buffer[VACOPY_CACHE_SIZE]; Buffer* GetBuffer() { std::unique_lock lock(m_mtx); Buffer* pBuffer = nullptr; auto FindFreeBuffer = [&]() { for (auto& buf : m_buffer) { if (!buf.bLocked) { buf.bLocked = true; pBuffer = &buf; return true; } } return false; }; auto waitTime = std::chrono::milliseconds(VACOPY_CACHE_WAIT_MS); MFX_CHECK_WITH_THROW_STS(m_cv.wait_for(lock, waitTime, FindFreeBuffer), MFX_ERR_UNKNOWN); return pBuffer; } Buffer* GetSrcBuffer(eMode mode) { if (mode == VACOPY_SYSTEM_TO_VIDEO) return GetBuffer(); return nullptr; } Buffer* GetDstBuffer(eMode mode) { if (mode == VACOPY_VIDEO_TO_SYSTEM) return GetBuffer(); return nullptr; } void Release(Buffer* pBuffer) { if (pBuffer) { { std::unique_lock lock(m_mtx); pBuffer->bLocked = false; } m_cv.notify_one(); } } }; const std::map VACopyWrapper::FccMap = { { MFX_FOURCC_NV12, { VA_FOURCC_NV12, SetBuffersNV12, CheckPlanesNV12 } } , { MFX_FOURCC_YV12, { VA_FOURCC_YV12, SetBuffersYV12, CheckPlanesYV12 } } , { MFX_FOURCC_P010, { VA_FOURCC_P010, SetBuffersNV12, CheckPlanesNV12 } } , { MFX_FOURCC_P016, { VA_FOURCC_P016, SetBuffersNV12, CheckPlanesNV12 } } , { MFX_FOURCC_YUY2, { VA_FOURCC_YUY2, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_RGB565, { VA_FOURCC_RGB565, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_RGBP, { VA_FOURCC_RGBP, SetBuffersNPlanes444<3>, CheckPlanes444 } } , { MFX_FOURCC_BGRP, { VA_FOURCC_BGRP, SetBuffersNPlanes444<3>, CheckPlanes444 } } , { MFX_FOURCC_A2RGB10, { VA_FOURCC_A2R10G10B10, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_AYUV, { VA_FOURCC_AYUV, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_Y210, { VA_FOURCC_Y210, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_Y216, { VA_FOURCC_Y216, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_Y410, { VA_FOURCC_Y410, SetBuffersOnePlane, CheckPlanesOne } } , { MFX_FOURCC_Y416, { VA_FOURCC_Y416, SetBuffersOnePlane, CheckPlanesOne } } }; template VAAPIVideoCORE_T::VAAPIVideoCORE_T( const mfxU32 adapterNum, const AffinityMaskType& affinityMask, const mfxU32 numThreadsAvailable, const mfxSession session) : Base(numThreadsAvailable, session) , m_VAConfigHandle((mfxHDL)VA_INVALID_ID) , m_VAContextHandle((mfxHDL)VA_INVALID_ID) , m_KeepVAState(false) , m_adapterNum(adapterNum) , m_affinityMask(affinityMask) , m_bUseExtAllocForHWFrames(false) , m_HWType(MFX_HW_UNKNOWN) , m_GTConfig(MFX_GT_UNKNOWN) { } // VAAPIVideoCORE_T::VAAPIVideoCORE_T(...) template VAAPIVideoCORE_T::~VAAPIVideoCORE_T() { Close(); } template void VAAPIVideoCORE_T::Close() { m_KeepVAState = false; m_pVA.reset(); // It's important to close CM device when VA display is alive m_pCmCopy.reset(); #if defined (MFX_ENABLE_VPP) // Destroy this object when VA display is alive m_vpp_hw_resmng.Close(); #endif m_p_display_wrapper.reset(); } template mfxStatus VAAPIVideoCORE_T::CheckOrInitDisplay() { if (!m_p_display_wrapper) { std::string path = std::string("/dev/dri/renderD") + std::to_string(128 + m_adapterNum); VADisplay displ = nullptr; int fd = open(path.c_str(), O_RDWR); MFX_CHECK(fd >= 0, MFX_ERR_NOT_INITIALIZED); mfx::OnExit closeFD([&displ, fd] { if (displ) vaTerminate(displ); close(fd); }); displ = vaGetDisplayDRM(fd); MFX_CHECK(displ, MFX_ERR_NOT_INITIALIZED); int vamajor = 0, vaminor = 0; MFX_CHECK(VA_STATUS_SUCCESS == vaInitialize(displ, &vamajor, &vaminor), MFX_ERR_NOT_INITIALIZED); if (m_affinityMask.first) { auto GetSubDeviceIdxPlus1 = [](const AffinityMaskType & affinityMask) -> mfxU8 { mfxU8 byteIdx = 0; for (auto val : affinityMask.second) { const auto length = affinityMask.first - (8*byteIdx); val &= (1<(subDev.value), VA_DISPLAY_ATTRIB_SETTABLE}; MFX_CHECK(VA_STATUS_SUCCESS == vaSetDisplayAttributes(displ, &attr, 1), MFX_ERR_NOT_INITIALIZED); } MFX_SAFE_CALL(this->SetHandle(MFX_HANDLE_VA_DISPLAY, displ)); m_p_display_wrapper = std::make_shared(displ, fd); closeFD = [] {}; } return MFX_ERR_NONE; } template eMFXHWType VAAPIVideoCORE_T::GetHWType() { std::ignore = MFX_STS_TRACE(this->CheckOrInitDisplay()); return m_HWType; } template mfxU16 VAAPIVideoCORE_T::GetHWDeviceId() { std::ignore = MFX_STS_TRACE(this->CheckOrInitDisplay()); return this->m_deviceId; } template mfxStatus VAAPIVideoCORE_T::GetHandle( mfxHandleType type, mfxHDL *handle) { MFX_CHECK_NULL_PTR1(handle); UMC::AutomaticUMCMutex guard(this->m_guard); return Base::GetHandle(type, handle); } // mfxStatus VAAPIVideoCORE_T::GetHandle(mfxHandleType type, mfxHDL *handle) template mfxStatus VAAPIVideoCORE_T::SetHandle( mfxHandleType type, mfxHDL hdl) { MFX_CHECK_HDL(hdl); UMC::AutomaticUMCMutex guard(this->m_guard); try { switch (type) { case MFX_HANDLE_VA_DISPLAY: { // If device manager already set, return error MFX_CHECK(!this->m_hdl, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(!m_p_display_wrapper, MFX_ERR_UNDEFINED_BEHAVIOR); this->m_hdl = hdl; m_p_display_wrapper = std::make_shared(reinterpret_cast(this->m_hdl)); /* As we know right VA handle (pointer), * we can get real authenticated fd of VAAPI library(display), * and can call ioctl() to kernel mode driver, * to get device ID and find out platform type */ const auto devItem = getDeviceItem(*m_p_display_wrapper); MFX_CHECK(MFX_HW_UNKNOWN != devItem.platform, MFX_ERR_DEVICE_FAILED); m_HWType = devItem.platform; m_GTConfig = devItem.config; this->m_deviceId = mfxU16(devItem.device_id); std::ignore = MFX_STS_TRACE(TryInitializeCm(false)); if (VACopyWrapper::IsSupportedByPlatform(m_HWType)) { this->m_pVaCopy.reset(new VACopyWrapper(*m_p_display_wrapper)); if (!this->m_pVaCopy->IsSupported()) { this->m_pVaCopy.reset(); } } } break; default: return Base::SetHandle(type, hdl); } return MFX_ERR_NONE; } catch (...) { MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } }// mfxStatus VAAPIVideoCORE_T::SetHandle(mfxHandleType type, mfxHDL handle) template bool VAAPIVideoCORE_T::IsCmSupported() { return GetHWType() < MFX_HW_DG2; } template bool VAAPIVideoCORE_T::IsCmCopyEnabledByDefault() { // For Linux by default CM copy is ON on RKL/ADL-S return IsCmSupported() && GetHWType() != MFX_HW_DG1 && GetHWType() != MFX_HW_TGL_LP && GetHWType() != MFX_HW_ADL_P; } template mfxStatus VAAPIVideoCORE_T::TryInitializeCm(bool force_cm_device_creation) { if (m_pCmCopy) return MFX_ERR_NONE; // Return immediately if user requested to turn OFF GPU copy. // Device creation may be forced, since other components may need the device for non-copy kernels if (m_ForcedGpuCopyState == MFX_GPUCOPY_OFF && !force_cm_device_creation) { return MFX_ERR_NONE; } MFX_CHECK(IsCmSupported(), MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); // Copy wrapper creation can be forced, since CM device depends on copy wrapper. Other component may require CM device. // VPP is calling QueryCoreInterface, if copy wrapper isn't created, then CM device cannot be obtained. // If copy force state is default and CM copy disabled by default, set copy force state as off. if (m_ForcedGpuCopyState == MFX_GPUCOPY_DEFAULT && !IsCmCopyEnabledByDefault()) { m_ForcedGpuCopyState = MFX_GPUCOPY_OFF; } /* // Uncomment after additional changes #ifdef ONEVPL_EXPERIMENTAL bool use_cm_buffer_cache = m_ForcedGpuCopyState != MFX_GPUCOPY_SAFE; #else bool use_cm_buffer_cache = true; #endif */ bool use_cm_buffer_cache = false; std::unique_ptr tmp_cm(new CmCopyWrapper(use_cm_buffer_cache)); MFX_CHECK_NULL_PTR1(tmp_cm->GetCmDevice(*m_p_display_wrapper)); MFX_SAFE_CALL(tmp_cm->Initialize(GetHWDeviceId(), GetHWType())); m_pCmCopy = std::move(tmp_cm); return MFX_ERR_NONE; } template mfxStatus VAAPIVideoCORE_T::AllocFrames( mfxFrameAllocRequest* request, mfxFrameAllocResponse* response, bool isNeedCopy) { MFX_CHECK_NULL_PTR2(request, response); UMC::AutomaticUMCMutex guard(this->m_guard); try { mfxStatus sts = MFX_ERR_NONE; mfxFrameAllocRequest temp_request = *request; // use common core for sw surface allocation if (request->Type & MFX_MEMTYPE_SYSTEM_MEMORY) { sts = Base::AllocFrames(request, response); MFX_RETURN(sts); } else { bool isExtAllocatorCallAllowed = ((request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) && (request->Type & MFX_MEMTYPE_FROM_DECODE)) || // 'fake' Alloc call to retrieve memId's of surfaces already allocated by app (request->Type & (MFX_MEMTYPE_FROM_ENC | MFX_MEMTYPE_FROM_PAK)); // 'fake' Alloc call for FEI ENC/PAC cases to get reconstructed surfaces // external allocator if (this->m_bSetExtFrameAlloc && isExtAllocatorCallAllowed) { sts = (*this->m_FrameAllocator.frameAllocator.Alloc)(this->m_FrameAllocator.frameAllocator.pthis, &temp_request, response); m_bUseExtAllocForHWFrames = false; MFX_CHECK_STS(sts); // let's create video accelerator // Checking for unsupported mode - external allocator exist but Device handle doesn't set MFX_CHECK(m_p_display_wrapper, MFX_ERR_UNSUPPORTED) if (response->NumFrameActual < request->NumFrameMin) { (*this->m_FrameAllocator.frameAllocator.Free)(this->m_FrameAllocator.frameAllocator.pthis, response); MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } m_bUseExtAllocForHWFrames = true; sts = ProcessRenderTargets(request, response, &this->m_FrameAllocator); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } else { // Default Allocator is used for internal memory allocation and all coded buffers allocation m_bUseExtAllocForHWFrames = false; sts = this->DefaultAllocFrames(request, response); MFX_CHECK_STS(sts); return MFX_ERR_NONE; } } } catch(...) { return MFX_ERR_MEMORY_ALLOC; } } // mfxStatus VAAPIVideoCORE_T::AllocFrames(...) template mfxStatus VAAPIVideoCORE_T::ReallocFrame(mfxFrameSurface1 *surf) { MFX_CHECK_NULL_PTR1(surf); mfxMemId memid = surf->Data.MemId; if (!(surf->Data.MemType & MFX_MEMTYPE_INTERNAL_FRAME && ((surf->Data.MemType & MFX_MEMTYPE_DXVA2_DECODER_TARGET)|| (surf->Data.MemType & MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET)))) return MFX_ERR_MEMORY_ALLOC; mfxFrameAllocator *pFrameAlloc = this->GetAllocatorAndMid(memid); if (!pFrameAlloc) return MFX_ERR_MEMORY_ALLOC; mfxHDL srcHandle; if (MFX_ERR_NONE == this->GetFrameHDL(surf->Data.MemId, &srcHandle)) { VASurfaceID *va_surf = (VASurfaceID*)srcHandle; return mfxDefaultAllocatorVAAPI::ReallocFrameHW(pFrameAlloc->pthis, surf, va_surf); } return MFX_ERR_MEMORY_ALLOC; } template mfxStatus VAAPIVideoCORE_T::DefaultAllocFrames( mfxFrameAllocRequest* request, mfxFrameAllocResponse* response) { mfxStatus sts = MFX_ERR_NONE; if ((request->Type & MFX_MEMTYPE_DXVA2_DECODER_TARGET)|| (request->Type & MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET)) // SW - TBD !!!!!!!!!!!!!! { MFX_SAFE_CALL(this->CheckOrInitDisplay()); mfxBaseWideFrameAllocator* pAlloc = this->GetAllocatorByReq(request->Type); // VPP, ENC, PAK can request frames for several times if (pAlloc && (request->Type & MFX_MEMTYPE_FROM_DECODE)) return MFX_ERR_MEMORY_ALLOC; if (!pAlloc) { m_pcHWAlloc.reset(new mfxDefaultAllocatorVAAPI::mfxWideHWFrameAllocator(request->Type, *m_p_display_wrapper)); pAlloc = m_pcHWAlloc.get(); } // else ??? pAlloc->frameAllocator.pthis = pAlloc; sts = (*pAlloc->frameAllocator.Alloc)(pAlloc->frameAllocator.pthis,request, response); MFX_CHECK_STS(sts); sts = ProcessRenderTargets(request, response, pAlloc); MFX_CHECK_STS(sts); } else { return Base::DefaultAllocFrames(request, response); } ++this->m_NumAllocators; return sts; } // mfxStatus VAAPIVideoCORE_T::DefaultAllocFrames(...) template mfxStatus VAAPIVideoCORE_T::CreateVA( mfxVideoParam* param, mfxFrameAllocRequest* request, mfxFrameAllocResponse* response, UMC::FrameAllocator *allocator) { MFX_CHECK_NULL_PTR3(param, request, response); if (!(request->Type & MFX_MEMTYPE_FROM_DECODE) || !(request->Type & MFX_MEMTYPE_DXVA2_DECODER_TARGET)) return MFX_ERR_NONE; auto const profile = ChooseProfile(param, GetHWType()); MFX_CHECK(profile != UMC::UNKNOWN, MFX_ERR_UNSUPPORTED); #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE if (mfx::GetExtBuffer(param->ExtParam, param->NumExtParam, MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK)) m_KeepVAState = true; else #endif m_KeepVAState = false; return CreateVideoAccelerator(param, profile, 0, nullptr, allocator); } // mfxStatus VAAPIVideoCORE_T::CreateVA(...) template mfxStatus VAAPIVideoCORE_T::CreateVideoProcessing(mfxVideoParam * param) { (void)param; #if defined (MFX_ENABLE_VPP) if (!m_vpp_hw_resmng.GetDevice()){ return m_vpp_hw_resmng.CreateDevice(this); } return MFX_ERR_NONE; #else MFX_RETURN(MFX_ERR_UNSUPPORTED); #endif } template mfxStatus VAAPIVideoCORE_T::ProcessRenderTargets( mfxFrameAllocRequest* request, mfxFrameAllocResponse* response, mfxBaseWideFrameAllocator* pAlloc) { #if defined(ANDROID) if (response->NumFrameActual > 128) return MFX_ERR_UNSUPPORTED; #endif this->RegisterMids(response, request->Type, !m_bUseExtAllocForHWFrames, pAlloc); m_pcHWAlloc.release(); return MFX_ERR_NONE; } // mfxStatus VAAPIVideoCORE_T::ProcessRenderTargets(...) template mfxStatus VAAPIVideoCORE_T::GetVAService( VADisplay* pVADisplay) { // check if created already MFX_SAFE_CALL(this->CheckOrInitDisplay()); if (pVADisplay) { *pVADisplay = *m_p_display_wrapper; } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoCORE_T::GetVAService(...) template void VAAPIVideoCORE_T::SetCmCopyMode(mfxU16 cm_copy_mode) { UMC::AutomaticUMCMutex guard(this->m_guard); m_ForcedGpuCopyState = cm_copy_mode; } // void VAAPIVideoCORE_T::SetCmCopyMode(...) template mfxStatus VAAPIVideoCORE_T::CreateVideoAccelerator( mfxVideoParam* param, int profile, int NumOfRenderTarget, VASurfaceID* RenderTargets, UMC::FrameAllocator *allocator) { MFX_CHECK_NULL_PTR1(param); MFX_SAFE_CALL(this->CheckOrInitDisplay()); UMC::AutomaticUMCMutex guard(this->m_guard); UMC::LinuxVideoAcceleratorParams params; mfxFrameInfo *pInfo = &(param->mfx.FrameInfo); UMC::VideoStreamInfo VideoInfo; VideoInfo.clip_info.width = pInfo->Width; VideoInfo.clip_info.height = pInfo->Height; // Init Accelerator params.m_Display = *m_p_display_wrapper; params.m_pConfigId = (VAConfigID*)&m_VAConfigHandle; params.m_pContext = (VAContextID*)&m_VAContextHandle; params.m_pKeepVAState = &m_KeepVAState; params.m_pVideoStreamInfo = &VideoInfo; params.m_iNumberSurfaces = NumOfRenderTarget; params.m_allocator = allocator; params.m_surf = (void **)RenderTargets; params.m_protectedVA = param->Protected; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE /* There are following conditions for post processing via HW fixed function engine: * (1): AVC * (2): Progressive only * (3): Supported on SKL (Core) and APL (Atom) platforms and above * */ if ( (mfx::GetExtBuffer(param->ExtParam, param->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING)) && (MFX_PICSTRUCT_PROGRESSIVE == param->mfx.FrameInfo.PicStruct) && (param->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) { params.m_needVideoProcessingVA = true; } #endif #if defined(MFX_ENABLE_PXP) if ( this->m_pPXPCtxHdl ) { m_pVA.reset(new PXPLinuxVideoAccelerator()); params.m_pPXPCtxHdl = this->m_pPXPCtxHdl; } else #endif // MFX_ENABLE_PXP m_pVA.reset(new LinuxVideoAccelerator()); m_pVA->m_Platform = UMC::VA_LINUX; m_pVA->m_Profile = (VideoAccelerationProfile)profile; m_pVA->m_HWPlatform = m_HWType; m_pVA->m_HWDeviceID = this->m_deviceId; Status st = m_pVA->Init(¶ms); MFX_CHECK(st == UMC_OK, MFX_ERR_UNSUPPORTED); return MFX_ERR_NONE; } // mfxStatus VAAPIVideoCORE_T::CreateVideoAccelerator(...) template mfxStatus VAAPIVideoCORE_T::DoFastCopyWrapper( mfxFrameSurface1* pDst, mfxU16 dstMemType, mfxFrameSurface1* pSrc, mfxU16 srcMemType, mfxU32 gpuCopyMode) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIVideoCORE_T::DoFastCopyWrapper"); mfxStatus sts; mfxHDLPair srcHandle = {}, dstHandle = {}; mfxMemId srcMemId, dstMemId; mfxFrameSurface1 srcTempSurface, dstTempSurface; memset(&srcTempSurface, 0, sizeof(mfxFrameSurface1)); memset(&dstTempSurface, 0, sizeof(mfxFrameSurface1)); // save original mem ids srcMemId = pSrc->Data.MemId; dstMemId = pDst->Data.MemId; mfxU8* srcPtr = GetFramePointer(pSrc->Info.FourCC, pSrc->Data); mfxU8* dstPtr = GetFramePointer(pDst->Info.FourCC, pDst->Data); srcTempSurface.Info = pSrc->Info; dstTempSurface.Info = pDst->Info; bool isSrcLocked = false; bool isDstLocked = false; if (srcMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { if (srcMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (nullptr == srcPtr) { sts = this->LockExternalFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(sts); isSrcLocked = true; } else { srcTempSurface.Data = pSrc->Data; srcTempSurface.Data.MemId = 0; } } else if (srcMemType & MFX_MEMTYPE_DXVA2_DECODER_TARGET) { sts = this->GetExternalFrameHDL(srcMemId, (mfxHDL *)&srcHandle); MFX_CHECK_STS(sts); srcTempSurface.Data.MemId = &srcHandle; } } else if (srcMemType & MFX_MEMTYPE_INTERNAL_FRAME) { if (srcMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (nullptr == srcPtr) { sts = this->LockFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(sts); isSrcLocked = true; } else { srcTempSurface.Data = pSrc->Data; srcTempSurface.Data.MemId = 0; } } else if (srcMemType & MFX_MEMTYPE_DXVA2_DECODER_TARGET) { sts = this->GetFrameHDL(srcMemId, (mfxHDL *)&srcHandle); MFX_CHECK_STS(sts); srcTempSurface.Data.MemId = &srcHandle; } } if (dstMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { if (dstMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (nullptr == dstPtr) { sts = this->LockExternalFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(sts); isDstLocked = true; } else { dstTempSurface.Data = pDst->Data; dstTempSurface.Data.MemId = 0; } } else if (dstMemType & MFX_MEMTYPE_DXVA2_DECODER_TARGET) { sts = this->GetExternalFrameHDL(dstMemId, (mfxHDL *)&dstHandle); MFX_CHECK_STS(sts); dstTempSurface.Data.MemId = &dstHandle; } } else if (dstMemType & MFX_MEMTYPE_INTERNAL_FRAME) { if (dstMemType & MFX_MEMTYPE_SYSTEM_MEMORY) { if (nullptr == dstPtr) { sts = this->LockFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(sts); isDstLocked = true; } else { dstTempSurface.Data = pDst->Data; dstTempSurface.Data.MemId = 0; } } else if (dstMemType & MFX_MEMTYPE_DXVA2_DECODER_TARGET) { sts = this->GetFrameHDL(dstMemId, (mfxHDL *)&dstHandle); MFX_CHECK_STS(sts); dstTempSurface.Data.MemId = &dstHandle; } } mfxStatus fcSts = DoFastCopyExtended(&dstTempSurface, &srcTempSurface, gpuCopyMode); if (MFX_ERR_DEVICE_FAILED == fcSts && 0 != dstTempSurface.Data.Corrupted) { // complete task even if frame corrupted pDst->Data.Corrupted = dstTempSurface.Data.Corrupted; fcSts = MFX_ERR_NONE; } if (true == isSrcLocked) { if (srcMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { sts = this->UnlockExternalFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } else if (srcMemType & MFX_MEMTYPE_INTERNAL_FRAME) { sts = this->UnlockFrame(srcMemId, &srcTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } } if (true == isDstLocked) { if (dstMemType & MFX_MEMTYPE_EXTERNAL_FRAME) { sts = this->UnlockExternalFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } else if (dstMemType & MFX_MEMTYPE_INTERNAL_FRAME) { sts = this->UnlockFrame(dstMemId, &dstTempSurface.Data); MFX_CHECK_STS(fcSts); MFX_CHECK_STS(sts); } } return fcSts; } // mfxStatus VAAPIVideoCORE_T::DoFastCopyWrapper(...) template mfxStatus VAAPIVideoCORE_T::DoFastCopyExtended( mfxFrameSurface1* pDst, mfxFrameSurface1* pSrc, mfxU32 gpuCopyMode) { mfxStatus sts; mfxU8* srcPtr; mfxU8* dstPtr; sts = GetFramePointerChecked(pSrc->Info, pSrc->Data, &srcPtr); MFX_CHECK(MFX_SUCCEEDED(sts), MFX_ERR_UNDEFINED_BEHAVIOR); sts = GetFramePointerChecked(pDst->Info, pDst->Data, &dstPtr); MFX_CHECK(MFX_SUCCEEDED(sts), MFX_ERR_UNDEFINED_BEHAVIOR); // check that only memId or pointer are passed // otherwise don't know which type of memory copying is requested if ( (nullptr != dstPtr && nullptr != pDst->Data.MemId) || (nullptr != srcPtr && nullptr != pSrc->Data.MemId) ) { return MFX_ERR_UNDEFINED_BEHAVIOR; } IppiSize roi = {std::min(pSrc->Info.Width, pDst->Info.Width), std::min(pSrc->Info.Height, pDst->Info.Height)}; // check that region of interest is valid if (0 == roi.width || 0 == roi.height) { return MFX_ERR_UNDEFINED_BEHAVIOR; } // Check if requested copy backend is CM and CM is capable to perform copy bool canUseCMCopy = (gpuCopyMode & MFX_COPY_USE_CM) && m_pCmCopy && (m_ForcedGpuCopyState != MFX_GPUCOPY_OFF) && CmCopyWrapper::CanUseCmCopy(pDst, pSrc); if (NULL != pSrc->Data.MemId && NULL != pDst->Data.MemId) { if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopyVideoToVideo(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } VASurfaceID *va_surf_src = (VASurfaceID*)(((mfxHDLPair *)pSrc->Data.MemId)->first); VASurfaceID *va_surf_dst = (VASurfaceID*)(((mfxHDLPair *)pDst->Data.MemId)->first); MFX_CHECK(va_surf_src != va_surf_dst, MFX_ERR_UNDEFINED_BEHAVIOR); VAImage va_img_src = {}; VAStatus va_sts; { PERF_UTILITY_AUTO("vaDeriveImage", PERF_LEVEL_DDI); va_sts = vaDeriveImage(*m_p_display_wrapper, *va_surf_src, &va_img_src); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaPutImage"); PERF_UTILITY_AUTO("vaPutImage", PERF_LEVEL_DDI); va_sts = vaPutImage(*m_p_display_wrapper, *va_surf_dst, va_img_src.image_id, 0, 0, roi.width, roi.height, 0, 0, roi.width, roi.height); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { PERF_UTILITY_AUTO("vaDestroyImage", PERF_LEVEL_DDI); va_sts = vaDestroyImage(*m_p_display_wrapper, va_img_src.image_id); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } else if (nullptr != pSrc->Data.MemId && nullptr != dstPtr) { // copy data { if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopyVideoToSys(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } VASurfaceID *va_surface = (VASurfaceID*)(((mfxHDLPair *)pSrc->Data.MemId)->first); VAImage va_image; VAStatus va_sts; void *pBits = NULL; va_sts = vaDeriveImage(*m_p_display_wrapper, *va_surface, &va_image); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); va_sts = vaMapBuffer(*m_p_display_wrapper, va_image.buf, (void **) &pBits); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_vid2sys"); mfxStatus sts = mfxDefaultAllocatorVAAPI::SetFrameData(va_image, pDst->Info.FourCC, (mfxU8*)pBits, pSrc->Data); MFX_CHECK_STS(sts); mfxMemId saveMemId = pSrc->Data.MemId; pSrc->Data.MemId = 0; sts = CoreDoSWFastCopy(*pDst, *pSrc, COPY_VIDEO_TO_SYS); // sw copy MFX_CHECK_STS(sts); pSrc->Data.MemId = saveMemId; MFX_CHECK_STS(sts); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); va_sts = vaUnmapBuffer(*m_p_display_wrapper, va_image.buf); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { PERF_UTILITY_AUTO("vaDestroyImage", PERF_LEVEL_DDI); va_sts = vaDestroyImage(*m_p_display_wrapper, va_image.image_id); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } } else if (nullptr != srcPtr && nullptr != dstPtr) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_sys2sys"); // system memories were passed // use common way to copy frames sts = CoreDoSWFastCopy(*pDst, *pSrc, COPY_SYS_TO_SYS); // sw copy MFX_CHECK_STS(sts); } else if (nullptr != srcPtr && nullptr != pDst->Data.MemId) { if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopySysToVideo(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } VAStatus va_sts = VA_STATUS_SUCCESS; VASurfaceID *va_surface = (VASurfaceID*)((mfxHDLPair *)pDst->Data.MemId)->first; VAImage va_image; void *pBits = NULL; va_sts = vaDeriveImage(*m_p_display_wrapper, *va_surface, &va_image); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaMapBuffer"); PERF_UTILITY_AUTO("vaMapBuffer", PERF_LEVEL_DDI); va_sts = vaMapBuffer(*m_p_display_wrapper, va_image.buf, (void **) &pBits); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_sys2vid"); mfxStatus sts = mfxDefaultAllocatorVAAPI::SetFrameData(va_image, pDst->Info.FourCC, (mfxU8*)pBits, pDst->Data); MFX_CHECK_STS(sts); mfxMemId saveMemId = pDst->Data.MemId; pDst->Data.MemId = 0; sts = CoreDoSWFastCopy(*pDst, *pSrc, COPY_SYS_TO_VIDEO); // sw copy MFX_CHECK_STS(sts); pDst->Data.MemId = saveMemId; MFX_CHECK_STS(sts); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaUnmapBuffer"); PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); va_sts = vaUnmapBuffer(*m_p_display_wrapper, va_image.buf); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); // vaDestroyImage { PERF_UTILITY_AUTO("vaDestroyImage", PERF_LEVEL_DDI); va_sts = vaDestroyImage(*m_p_display_wrapper, va_image.image_id); } MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } else { return MFX_ERR_UNDEFINED_BEHAVIOR; } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoCORE_T::DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc, bool gpuCopyMode) // On linux/android specific function! // correct work since libva 1.2 (libva 2.2.1.pre1) // function checks profile and entrypoint and video resolution support template mfxStatus VAAPIVideoCORE_T::IsGuidSupported(const GUID guid, mfxVideoParam *par, bool /* isEncoder */) { MFX_CHECK(par, MFX_ERR_UNSUPPORTED); MFX_CHECK(!IsMVCProfile(par->mfx.CodecProfile), MFX_ERR_UNSUPPORTED); MFX_SAFE_CALL(this->CheckOrInitDisplay()); #if VA_CHECK_VERSION(1, 2, 0) VaGuidMapper mapper(guid); VAProfile req_profile = mapper.m_profile; VAEntrypoint req_entrypoint = mapper.m_entrypoint; mfxI32 va_max_num_entrypoints = vaMaxNumEntrypoints(*m_p_display_wrapper); mfxI32 va_max_num_profiles = vaMaxNumProfiles(*m_p_display_wrapper); MFX_CHECK_COND(va_max_num_entrypoints && va_max_num_profiles); //driver always support VAProfileNone if (req_profile != VAProfileNone) { vector va_profiles (va_max_num_profiles, VAProfileNone); //ask driver about profile support VAStatus va_sts = vaQueryConfigProfiles(*m_p_display_wrapper, va_profiles.data(), &va_max_num_profiles); MFX_CHECK(va_sts == VA_STATUS_SUCCESS, MFX_ERR_UNSUPPORTED); //check profile support auto it_profile = find(va_profiles.begin(), va_profiles.end(), req_profile); MFX_CHECK(it_profile != va_profiles.end(), MFX_ERR_UNSUPPORTED); } vector va_entrypoints (va_max_num_entrypoints, static_cast (0)); //ask driver about entrypoint support VAStatus va_sts = vaQueryConfigEntrypoints(*m_p_display_wrapper, req_profile, va_entrypoints.data(), &va_max_num_entrypoints); MFX_CHECK(va_sts == VA_STATUS_SUCCESS, MFX_ERR_UNSUPPORTED); //check entrypoint support auto it_entrypoint = find(va_entrypoints.begin(), va_entrypoints.end(), req_entrypoint); MFX_CHECK(it_entrypoint != va_entrypoints.end(), MFX_ERR_UNSUPPORTED); VAConfigAttrib attr[] = {{VAConfigAttribMaxPictureWidth, 0}, {VAConfigAttribMaxPictureHeight, 0}}; //ask driver about support va_sts = vaGetConfigAttributes(*m_p_display_wrapper, req_profile, req_entrypoint, attr, sizeof(attr)/sizeof(*attr)); MFX_CHECK(va_sts == VA_STATUS_SUCCESS, MFX_ERR_UNSUPPORTED); //check video resolution MFX_CHECK(attr[0].value != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK(attr[1].value != VA_ATTRIB_NOT_SUPPORTED, MFX_ERR_UNSUPPORTED); MFX_CHECK_COND(attr[0].value && attr[1].value); MFX_CHECK(attr[0].value >= par->mfx.FrameInfo.Width, MFX_ERR_UNSUPPORTED); MFX_CHECK(attr[1].value >= par->mfx.FrameInfo.Height, MFX_ERR_UNSUPPORTED); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE //check VD-SFC support mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessing) { VAConfigAttrib attrDecProcess = {VAConfigAttribDecProcessing, 0}; //ask driver about support va_sts = vaGetConfigAttributes(*m_p_display_wrapper, req_profile, req_entrypoint, &attrDecProcess, 1); MFX_CHECK(va_sts == VA_STATUS_SUCCESS, MFX_ERR_UNSUPPORTED); MFX_CHECK(attrDecProcess.value == VA_DEC_PROCESSING , MFX_ERR_UNSUPPORTED); } #endif return MFX_ERR_NONE; #else (void)guid; switch (par->mfx.CodecId) { case MFX_CODEC_VC1: case MFX_CODEC_AVC: case MFX_CODEC_VP9: break; case MFX_CODEC_HEVC: MFX_CHECK(par->mfx.FrameInfo.Width <= 8192 && par->mfx.FrameInfo.Height <= 8192, MFX_ERR_UNSUPPORTED); break; case MFX_CODEC_MPEG2: //MPEG2 decoder doesn't support resolution bigger than 2K MFX_CHECK(par->mfx.FrameInfo.Width <= 2048 && par->mfx.FrameInfo.Height <= 2048, MFX_ERR_UNSUPPORTED); break; case MFX_CODEC_JPEG: MFX_CHECK(par->mfx.FrameInfo.Width <= 8192 && par->mfx.FrameInfo.Height <= 8192, MFX_WRN_PARTIAL_ACCELERATION); break; case MFX_CODEC_VP8: break; default: MFX_RETURN(MFX_ERR_UNSUPPORTED); } MFX_CHECK(MFX_CODEC_JPEG == par->mfx.CodecId || MFX_CODEC_HEVC == par->mfx.CodecId || (par->mfx.FrameInfo.Width <= 4096 && par->mfx.FrameInfo.Height <= 4096), MFX_ERR_UNSUPPORTED ); return MFX_ERR_NONE; #endif } template void* VAAPIVideoCORE_T::QueryCoreInterface(const MFX_GUID &guid) { if (MFXICOREVAAPI_GUID == guid) { return (void*) m_pAdapter.get(); } if (MFXICORE_GT_CONFIG_GUID == guid) { return (void*)&m_GTConfig; } if (MFXIHWCAPS_GUID == guid) { return (void*) &this->m_encode_caps; } if (MFXICORECM_GUID == guid) { if (!m_pCmCopy) { UMC::AutomaticUMCMutex guard(this->m_guard); MFX_CHECK_STS_RET_NULL(TryInitializeCm(true)); } return m_pCmCopy ? (void*)m_pCmCopy->GetCmDevice(*m_p_display_wrapper) : nullptr; } if (MFXICORECMCOPYWRAPPER_GUID == guid) { if (!m_pCmCopy) { UMC::AutomaticUMCMutex guard(this->m_guard); MFX_CHECK_STS_RET_NULL(TryInitializeCm(false)); } return (void*)m_pCmCopy.get(); } if (MFXICMEnabledCore_GUID == guid) { if (!m_pCmAdapter) { UMC::AutomaticUMCMutex guard(this->m_guard); m_pCmAdapter.reset(new CMEnabledCoreAdapter(this)); } return (void*)m_pCmAdapter.get(); } if (MFXIHWMBPROCRATE_GUID == guid) { return (void*) &this->m_encode_mbprocrate; } return Base::QueryCoreInterface(guid); } // void* VAAPIVideoCORE_T::QueryCoreInterface(const MFX_GUID &guid) bool IsHwMvcEncSupported() { return false; } VAAPIVideoCORE_VPL::VAAPIVideoCORE_VPL( const mfxU32 adapterNum, const AffinityMaskType & affinityMask, const mfxU32 numThreadsAvailable, const mfxSession session) : VAAPIVideoCORE_VPL_base(adapterNum, affinityMask, numThreadsAvailable, session) { m_frame_allocator_wrapper.allocator_hw.reset(new FlexibleFrameAllocatorHW_VAAPI(nullptr, m_session)); } mfxStatus VAAPIVideoCORE_VPL::SetHandle( mfxHandleType type, mfxHDL hdl) { MFX_SAFE_CALL(VAAPIVideoCORE_VPL_base::SetHandle(type, hdl)); if (type == MFX_HANDLE_VA_DISPLAY) { // Pass display to allocator m_frame_allocator_wrapper.SetDevice(m_p_display_wrapper.get()); } return MFX_ERR_NONE; } VAAPIVideoCORE_VPL::~VAAPIVideoCORE_VPL() { // Need to clean up allocated surfaces before display is closed in destructor of base class (VAAPIVideoCORE_T) m_frame_allocator_wrapper.allocator_hw.reset(); } void* VAAPIVideoCORE_VPL::QueryCoreInterface(const MFX_GUID& guid) { if (MFXIVAAPIVideoCORE_VPL_GUID == guid) { return (void*)this; } return VAAPIVideoCORE_VPL_base::QueryCoreInterface(guid); } mfxStatus VAAPIVideoCORE_VPL::AllocFrames( mfxFrameAllocRequest* request, mfxFrameAllocResponse* response, bool isNeedCopy) { MFX_CHECK_NULL_PTR2(request, response); MFX_CHECK(!(request->Type & 0x0004), MFX_ERR_UNSUPPORTED); // 0x0004 means MFX_MEMTYPE_OPAQUE_FRAME UMC::AutomaticUMCMutex guard(this->m_guard); try { MFX_SAFE_CALL(CheckOrInitDisplay()); m_frame_allocator_wrapper.SetDevice(m_p_display_wrapper.get()); mfxStatus sts = m_frame_allocator_wrapper.Alloc(*request, *response, request->Type & (MFX_MEMTYPE_FROM_ENC | MFX_MEMTYPE_FROM_PAK)); #if defined(ANDROID) MFX_CHECK(response->NumFrameActual <= 128, MFX_ERR_UNSUPPORTED); #endif MFX_RETURN(sts); } catch (...) { MFX_RETURN(MFX_ERR_MEMORY_ALLOC); } } // mfxStatus VAAPIVideoCORE_VPL::AllocFrames(...) mfxStatus VAAPIVideoCORE_VPL::ReallocFrame(mfxFrameSurface1 *surf) { MFX_CHECK_NULL_PTR1(surf); return m_frame_allocator_wrapper.ReallocSurface(surf->Info, surf->Data.MemId); } mfxStatus VAAPIVideoCORE_VPL::DoFastCopyWrapper( mfxFrameSurface1* pDst, mfxU16 dstMemType, mfxFrameSurface1* pSrc, mfxU16 srcMemType, mfxU32 gpuCopyMode) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIVideoCORE_VPL::DoFastCopyWrapper"); MFX_CHECK_NULL_PTR2(pSrc, pDst); // uncomment underlying checks after additional validation //MFX_CHECK(!pSrc->Data.MemType || MFX_MEMTYPE_BASE(pSrc->Data.MemType) == MFX_MEMTYPE_BASE(srcMemType), MFX_ERR_UNSUPPORTED); //MFX_CHECK(!pDst->Data.MemType || MFX_MEMTYPE_BASE(pDst->Data.MemType) == MFX_MEMTYPE_BASE(dstMemType), MFX_ERR_UNSUPPORTED); mfxFrameSurface1 srcTempSurface = *pSrc, dstTempSurface = *pDst; srcTempSurface.Data.MemType = srcMemType; dstTempSurface.Data.MemType = dstMemType; mfxFrameSurface1_scoped_lock src_surf_lock(&srcTempSurface, this), dst_surf_lock(&dstTempSurface, this); mfxHDLPair handle_pair_src, handle_pair_dst; mfxStatus sts; if (srcTempSurface.Data.MemType & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) { clear_frame_data(srcTempSurface.Data); sts = SwitchMemidInSurface(srcTempSurface, handle_pair_src); MFX_CHECK_STS(sts); } else { sts = src_surf_lock.lock(MFX_MAP_READ, SurfaceLockType::LOCK_GENERAL); MFX_CHECK_STS(sts); srcTempSurface.Data.MemId = 0; } if (dstTempSurface.Data.MemType & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) { clear_frame_data(dstTempSurface.Data); sts = SwitchMemidInSurface(dstTempSurface, handle_pair_dst); MFX_CHECK_STS(sts); } else { sts = dst_surf_lock.lock(MFX_MAP_WRITE, SurfaceLockType::LOCK_GENERAL); MFX_CHECK_STS(sts); dstTempSurface.Data.MemId = 0; } sts = DoFastCopyExtended(&dstTempSurface, &srcTempSurface, gpuCopyMode); MFX_CHECK_STS(sts); sts = src_surf_lock.unlock(); MFX_CHECK_STS(sts); return dst_surf_lock.unlock(); } mfxStatus VAAPIVideoCORE_VPL::DoFastCopyExtended( mfxFrameSurface1* pDst, mfxFrameSurface1* pSrc, mfxU32 gpuCopyMode) { MFX_CHECK_NULL_PTR2(pDst, pSrc); mfxU8 *srcPtr, *dstPtr; mfxStatus sts = GetFramePointerChecked(pSrc->Info, pSrc->Data, &srcPtr); MFX_CHECK(MFX_SUCCEEDED(sts), MFX_ERR_UNDEFINED_BEHAVIOR); sts = GetFramePointerChecked(pDst->Info, pDst->Data, &dstPtr); MFX_CHECK(MFX_SUCCEEDED(sts), MFX_ERR_UNDEFINED_BEHAVIOR); // check that only memId or pointer are passed // otherwise don't know which type of memory copying is requested MFX_CHECK(!dstPtr || !pDst->Data.MemId, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK(!srcPtr || !pSrc->Data.MemId, MFX_ERR_UNDEFINED_BEHAVIOR); IppiSize roi = { min(pSrc->Info.Width, pDst->Info.Width), min(pSrc->Info.Height, pDst->Info.Height) }; // check that region of interest is valid MFX_CHECK(roi.width && roi.height, MFX_ERR_UNDEFINED_BEHAVIOR); // Check if requested copy backend is CM and CM is capable to perform copy bool canUseCMCopy = (gpuCopyMode & MFX_COPY_USE_CM) && m_pCmCopy && (m_ForcedGpuCopyState != MFX_GPUCOPY_OFF) && CmCopyWrapper::CanUseCmCopy(pDst, pSrc); if (m_pVaCopy && (VACopyWrapper::IsVaCopySupportSurface(*pDst, *pSrc)) && (gpuCopyMode & MFX_COPY_USE_VACOPY_ANY) && (m_ForcedGpuCopyState != MFX_GPUCOPY_OFF)) { auto vacopyMode = ((gpuCopyMode & MFX_COPY_USE_VACOPY_ANY) == MFX_COPY_USE_VACOPY_ANY) ? VACopyWrapper::DEFAULT : (gpuCopyMode & MFX_COPY_USE_VACOPY_EU) ? VACopyWrapper::EU : (gpuCopyMode & MFX_COPY_USE_VACOPY_BLT) ? VACopyWrapper::BLT : VACopyWrapper::VE ; if (m_HWType == MFX_HW_DG2) { vacopyMode = VACopyWrapper::BLT; } auto vaCopySts = m_pVaCopy->Copy(*pSrc, *pDst, vacopyMode); MFX_RETURN_IF_ERR_NONE(vaCopySts); if (vaCopySts == MFX_ERR_DEVICE_FAILED) { UMC::AutomaticUMCMutex guard(this->m_guard); m_pVaCopy.reset(); //once failed, don't try to use it anymore } } if (NULL != pSrc->Data.MemId && NULL != pDst->Data.MemId) { // At First try to copy with CM if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopyVideoToVideo(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } // Fallback to VA copy in case of failed CM copy VASurfaceID *va_surf_src = (VASurfaceID*)(((mfxHDLPair *)pSrc->Data.MemId)->first); VASurfaceID *va_surf_dst = (VASurfaceID*)(((mfxHDLPair *)pDst->Data.MemId)->first); MFX_CHECK(va_surf_src != va_surf_dst, MFX_ERR_UNDEFINED_BEHAVIOR); MFX_CHECK_HDL(va_surf_src); MFX_CHECK_HDL(va_surf_dst); SurfaceScopedLock src_lock(*m_p_display_wrapper, *va_surf_src); sts = src_lock.DeriveImage(); MFX_CHECK_STS(sts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaPutImage"); PERF_UTILITY_AUTO("vaPutImage", PERF_LEVEL_DDI); VAStatus va_sts = vaPutImage(*m_p_display_wrapper, *va_surf_dst, src_lock.m_image.image_id, 0, 0, roi.width, roi.height, 0, 0, roi.width, roi.height); MFX_CHECK(VA_STATUS_SUCCESS == va_sts, MFX_ERR_DEVICE_FAILED); } return src_lock.DestroyImage(); } if (NULL != pSrc->Data.MemId && NULL != dstPtr) { // At First try to copy with CM if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopyVideoToSys(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } // Fallback to SW copy in case of failed CM copy VASurfaceID *va_surface = (VASurfaceID*)(((mfxHDLPair *)pSrc->Data.MemId)->first); MFX_CHECK_HDL(va_surface); SurfaceScopedLock src_lock(*m_p_display_wrapper, *va_surface); sts = src_lock.DeriveImage(); MFX_CHECK_STS(sts); mfxU8* pBits; sts = src_lock.Map(pBits); MFX_CHECK_STS(sts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_vid2sys"); mfxStatus sts = mfxDefaultAllocatorVAAPI::SetFrameData(src_lock.m_image, pDst->Info.FourCC, pBits, pSrc->Data); MFX_CHECK_STS(sts); mfxMemId saveMemId = pSrc->Data.MemId; pSrc->Data.MemId = 0; sts = CoreDoSWFastCopy(*pDst, *pSrc, COPY_VIDEO_TO_SYS); // sw copy MFX_CHECK_STS(sts); pSrc->Data.MemId = saveMemId; MFX_CHECK_STS(sts); } sts = src_lock.Unmap(); MFX_CHECK_STS(sts); return src_lock.DestroyImage(); } if (NULL != srcPtr && NULL != dstPtr) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_sys2sys"); // system memories were passed // use common way to copy frames return CoreDoSWFastCopy(*pDst, *pSrc, COPY_SYS_TO_SYS); // sw copy } if (NULL != srcPtr && NULL != pDst->Data.MemId) { // At First try to copy with CM if (canUseCMCopy) { // If CM copy failed, fallback to VA copy MFX_RETURN_IF_ERR_NONE(m_pCmCopy->CopySysToVideo(pDst, pSrc)); // Remove CM adapter in case of failed copy this->SetCmCopyMode(MFX_GPUCOPY_OFF); } // Fallback to SW copy in case of failed CM copy VASurfaceID *va_surface = (VASurfaceID*)(((mfxHDLPair *)pDst->Data.MemId)->first); MFX_CHECK_HDL(va_surface); SurfaceScopedLock dst_lock(*m_p_display_wrapper, *va_surface); sts = dst_lock.DeriveImage(); MFX_CHECK_STS(sts); mfxU8* pBits; sts = dst_lock.Map(pBits); MFX_CHECK_STS(sts); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "FastCopy_sys2vid"); sts = mfxDefaultAllocatorVAAPI::SetFrameData(dst_lock.m_image, pDst->Info.FourCC, (mfxU8*)pBits, pDst->Data); MFX_CHECK_STS(sts); mfxMemId saveMemId = pDst->Data.MemId; pDst->Data.MemId = 0; sts = CoreDoSWFastCopy(*pDst, *pSrc, COPY_SYS_TO_VIDEO); // sw copy MFX_CHECK_STS(sts); pDst->Data.MemId = saveMemId; } sts = dst_lock.Unmap(); MFX_CHECK_STS(sts); return dst_lock.DestroyImage(); } MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); } // mfxStatus VAAPIVideoCORE_VPL::DoFastCopyExtended(mfxFrameSurface1 *pDst, mfxFrameSurface1 *pSrc) mfxStatus VAAPIVideoCORE_VPL::CreateSurface(mfxU16 type, const mfxFrameInfo& info, mfxFrameSurface1*& surf) { { UMC::AutomaticUMCMutex guard(m_guard); MFX_SAFE_CALL(CheckOrInitDisplay()); m_frame_allocator_wrapper.SetDevice(m_p_display_wrapper.get()); } return m_frame_allocator_wrapper.CreateSurface(type, info, surf); } template class VAAPIVideoCORE_T; /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/mfx_static_assert_structs.cpp000066400000000000000000004173201443134507600310160ustar00rootroot00000000000000// Copyright (c) 2014-2023 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "mfxstructures.h" #include "mfxjpeg.h" #include "mfxmvc.h" #include "mfxvp8.h" #include "mfxvideo.h" #include "mfxbrc.h" #include "mfxpcp.h" #include "mfxadapter.h" #if defined(MFX_ENABLE_ENCTOOLS) #include "mfxenctools-int.h" #endif /* .cpp instead of .h to avoid changing of include files dependencies graph and not to include unnecessary includes into libmfx library */ /* VC's IntelliSense calculates sizeof(object*) wrongly and marks several expressions by red lines. This is IntelliSense bug not ours*/ #define MSDK_STATIC_ASSERT(COND, MSG) static_assert(COND, MSG); #define MSDK_STATIC_ASSERT_STRUCT_SIZE(STRUCT, SIZE) MSDK_STATIC_ASSERT(sizeof(STRUCT) == SIZE, "struct size violation: sizeof "#STRUCT" was fixed to "#SIZE); #define MSDK_STATIC_ASSERT_STRUCT_OFFSET(STRUCT, FIELD, OFFSET) MSDK_STATIC_ASSERT(offsetof(STRUCT, FIELD) == OFFSET, "struct's field offset violation: offsetof "#STRUCT"::"#FIELD" was fixed to "#OFFSET); //mfxastructures.h #if defined (__MFXASTRUCTURES_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAudioInfoMFX ,192 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAudioParam ,240 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAudioAllocRequest ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAudioFrame ,64 ) #endif //defined (__MFXASTRUCTURES_H__) //mfxcommon.h #if defined (__MFXCOMMON_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtBuffer ,8 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVersion ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxBitstream ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxInitParam ,80 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtThreadsParam ,132 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPlatform ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxStructVersion ,2 ) #endif //defined (__MFXCOMMON_H__) //mfxdefs.h #if defined (__MFXDEFS_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxI16Pair ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxHDLPair ,16 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxStatus ,4 ) #endif //defined (__MFXCOMMON_H__) //mfxenc.h #if defined (__MFXENC_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(_mfxENCInput ,184) MSDK_STATIC_ASSERT_STRUCT_SIZE(_mfxENCOutput ,152) #endif //defined (__MFXENC_H__) //mfxfei.h #if defined (__MFXFEI_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPreEncCtrl ,128) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPreEncMVPredictors,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncQP ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPreEncMV ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPreEncMBStat ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncFrameCtrl ,128) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncMVPredictors ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncMBCtrl ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncMV ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiEncMBStat ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFeiPakMBCtrl ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPakMBCtrl ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiRepackCtrl ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiRepackStat ,128) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFeiDecStreamOutMBCtrl ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiDecStreamOut ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiSPS ,256) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiPPS ,768) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiSliceHeader ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiCodingOption ,128) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFeiFunction ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiParam ,128) #endif //defined (__MFXFEI_H__) //mfxfeihevc.h #if defined (__MFXFEIHEVC_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcEncFrameCtrl ,256) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFeiHevcEncMVPredictors ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcEncMVPredictors ,136) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcEncQP ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFeiHevcEncCtuCtrl ,16 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcEncCtuCtrl ,136) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcRepackCtrl ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtFeiHevcRepackStat ,128) #endif //defined (__MFXFEIHEVC_H__) //mfxpak.h #if defined (__MFXPAK_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPAKInput ,136) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPAKOutput ,96) #endif //defined (__MFXPAK_H__) //mfxjpeg.h #if defined (__MFX_JPEG_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtJPEGQuantTables ,536 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtJPEGHuffmanTables ,840 ) #endif //defined (__MFX_JPEG_H__) //mfxla.h #if defined (__MFXLA_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtLAControl ,576 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxLAFrameInfo ,496 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtLAFrameStatistics ,72 ) #endif //defined (__MFXLA_H__) //mfxmvc.h #if defined (__MFXMVC_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxMVCViewDependency ,138 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxMVCOperationPoint ,16 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMVCSeqDesc ,128 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMVCTargetViews ,2064 ) #endif //defined (__MFXMVC_H__) //mfxplugin.h #if defined (__MFXPLUGIN_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPluginParam ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPluginUID ,16 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPluginType ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxThreadPolicy ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxCoreParam ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxCoreInterface ,256) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVideoCodecPlugin ,160) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPlugin ,128) #endif //defined (__MFXPLUGIN_H__) //mfxstructures.h #if defined (__MFXSTRUCTURES_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameId ,8 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameInfo ,68 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxY410 ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxA2RGB10 ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameData ,96 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameSurface1 ,184 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameSurfaceInterface ,112 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxSurfaceArray ,56 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVideoChannelParam ,96 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxInfoMFX ,136 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxInfoVPP ,168 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVideoParam ,208 ) //IntelliSense wrongly marks this line (looks to be outdated comment) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCodingOption ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCodingOption2 ,68 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCodingOption3 ,512 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPDoNotUse ,24 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPDenoise ,12 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPDetail ,12 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPProcAmp ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxEncodeStat ,88 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxDecodeStat ,80 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVPPStat ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVppAuxData ,20 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxPayload ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxEncodeCtrl ,56 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameAllocRequest ,92 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameAllocResponse ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCodingOptionSPSPPS ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCodingOptionVPS ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVideoSignalInfo ,20 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPDoUse ,24 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAVCRefListCtrl ,1068) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPFrameRateConversion ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPImageStab ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMasteringDisplayColourVolume,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtContentLightLevelInfo ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtPictureTimingSEI ,160 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAvcTemporalLayers ,92 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncoderCapability ,128 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncoderResetOption ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAVCEncodedFrameInfo ,1056) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVPPCompInputStream ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPComposite ,72 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPVideoSignalInfo ,48 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncoderROI ,8224) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPDeinterlacing ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAVCRefLists ,1040 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPFieldProcessing ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtDecVideoProcessing ,132 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtChromaLocInfo ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMBQP ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxQPandMode ,4 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtInsertHeaders ,28 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncoderIPCMArea ,40 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncoderIPCMArea::area ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMBForceIntra ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtHEVCTiles ,160 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMBDisableSkipMap ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtHEVCParam ,256 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtDecodeErrorReport ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtDecodedFrameInfo ,128 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtTimeCode ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtHEVCRegion ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtPredWeightTable ,1152 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAVCRoundingOffset ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtDirtyRect ,8224 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMoveRect ,8224 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPRotation ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncodedSlicesInfo ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPScaling ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPMirroring ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtMVOverPicBoundaries ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVPPColorFill ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtColorConversion ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVP9SegmentParam ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVP9Segmentation ,384 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxVP9TemporalLayer ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVP9TemporalLayers ,384 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVP9Param ,256 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxEncodedUnitInfo ,32 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtEncodedUnitsInfo ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVppMctf ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAV1FilmGrainPoint ,2 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtAV1FilmGrainParam ,256 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxComponentInfo ,224 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAdapterInfo ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxAdaptersInfo ,24 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtPartialBitstreamParam ,32 ) #endif //defined (__MFXSTRUCTURES_H__) //mfxvideo.h #if defined (__MFXVIDEO_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxFrameAllocator ,64) #endif //defined (__MFXVIDEO_H__) //mfxvp8.h #if defined (__MFXVP8_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtVP8CodingOption ,516 ) #endif //defined (__MFXVP8_H__) //mfxbrc.h #if defined (__MFXBRC_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxBRCFrameParam ,128 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxBRCFrameCtrl ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxBRCFrameStatus ,64 ) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtBRC ,192 ) #endif //defined (__MFXBRC_H__) //mfxpcp.h #if defined (__MFXPCP_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtCencParam ,72 ) #endif //defined (__MFXPCP_H__) //mfxsc.h #if defined (__MFXSC_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtScreenCaptureParam ,64 ) #endif //defined (__MFXSC_H__) //mfxscd.h #if defined (__MFXSCD_H__) MSDK_STATIC_ASSERT_STRUCT_SIZE(mfxExtSCD ,64 ) #endif //defined (__MFXSCD_H__) // Offsets //mfxastructures.h #if defined (__MFXASTRUCTURES_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,CodecId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,CodecProfile ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,CodecLevel ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,Bitrate ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,SampleFrequency ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,NumChannel ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,BitPerSample ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,FlagPSSupportLev ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,Layer ,66 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,AACHeaderDataSize ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,AACHeaderData ,70 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,OutputFormat ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioInfoMFX ,StereoMode ,66 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioParam ,AsyncDepth ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioParam ,Protected ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioParam ,mfx ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioParam ,ExtParam ,224 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioParam ,NumExtParam ,232 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioAllocRequest ,SuggestedInputSize ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioAllocRequest ,SuggestedOutputSize ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,TimeStamp ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,Locked ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,NumChannels ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,SampleFrequency ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,BitPerSample ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,Data ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,DataLength ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,MaxLength ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,NumExtParam ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAudioFrame ,ExtParam ,56 ) #endif //defined (__MFXASTRUCTURES_H__) //mfxcommon.h #if defined (__MFXCOMMON_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBuffer ,BufferId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBuffer ,BufferSz ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVersion ,Minor ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVersion ,Major ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVersion ,Version ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxStructVersion ,Minor ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxStructVersion ,Major ,1 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxStructVersion ,Version ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,EncryptedData ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,ExtParam ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,NumExtParam ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,DecodeTimeStamp ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,TimeStamp ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,Data ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,DataOffset ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,DataLength ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,MaxLength ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,PicStruct ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,FrameType ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBitstream ,DataFlag ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,Implementation ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,Version ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,ExternalThreads ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,ExtParam ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,NumExtParam ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInitParam ,GPUCopy ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtThreadsParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtThreadsParam ,NumThread ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtThreadsParam ,SchedulingType ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtThreadsParam ,Priority ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlatform ,CodeName ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlatform ,DeviceId ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlatform ,MediaAdapterType ,4 ) #endif //defined (__MFXCOMMON_H__) //mfxdefs.h #if defined (__MFXDEFS_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxI16Pair ,x ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxI16Pair ,y ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxHDLPair ,first ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxHDLPair ,second ,8 ) #endif //defined (__MFXDEFS_H__) //mfxstructures.h #if defined (__MFXSTRUCTURES_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameId ,TemporalId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameId ,PriorityId ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameId ,DependencyId ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameId ,QualityId ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameId ,ViewId ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,ChannelId ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,BitDepthLuma ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,BitDepthChroma ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,Shift ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,FrameId ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,FourCC ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,Width ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,Height ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,CropX ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,CropY ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,CropW ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,CropH ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,BufferSize ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,FrameRateExtN ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,FrameRateExtD ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,AspectRatioW ,58 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,AspectRatioH ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,PicStruct ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameInfo ,ChromaFormat ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,ExtParam ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,NumExtParam ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,MemType ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,PitchHigh ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,TimeStamp ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,FrameOrder ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Locked ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Pitch ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,PitchLow ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Y ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Y16 ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,R ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,UV ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,VU ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,CbCr ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,CrCb ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Cb ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,U ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,U16 ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,G ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Y410 ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Cr ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,V ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,V16 ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,B ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,A2RGB10 ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,A ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,MemId ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,Corrupted ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameData ,DataFlag ,90 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurface1 ,FrameInterface ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurface1 ,Version ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurface1 ,Info ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurface1 ,Data ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Context ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Version ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,AddRef ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Release ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,GetRefCounter ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Map ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Unmap ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,GetNativeHandle ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,GetDeviceHandle ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameSurfaceInterface ,Synchronize ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,Context ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,Version ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,AddRef ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,Release ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,GetRefCounter ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,Surfaces ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxSurfaceArray ,NumSurfaces ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoChannelParam ,VPP ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoChannelParam ,Protected ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoChannelParam ,IOPattern ,70 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoChannelParam ,ExtParam ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoChannelParam ,NumExtParam ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,LowPower ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,BRCParamMultiplier ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,FrameInfo ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,CodecId ,100 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,CodecProfile ,104 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,CodecLevel ,106 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,NumThread ,108 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,TargetUsage ,110 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,GopPicSize ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,GopRefDist ,114 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,GopOptFlag ,116 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,IdrInterval ,118 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,RateControlMethod ,120 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,InitialDelayInKB ,122 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,QPI ,122 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,Accuracy ,122 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,BufferSizeInKB ,124 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,TargetKbps ,126 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,QPP ,126 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,ICQQuality ,126 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,MaxKbps ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,QPB ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,Convergence ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,NumSlice ,130 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,NumRefFrame ,132 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,EncodedOrder ,134 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,DecodedOrder ,110 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,ExtendedPicStruct ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,TimeStampCalc ,114 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,SliceGroupsPresent ,116 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,MaxDecFrameBuffering ,118 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,EnableReallocRequest ,120 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,JPEGChromaFormat ,110 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,Rotation ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,JPEGColorFormat ,114 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,InterleavedDec ,116 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,SamplingFactorH ,118 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,SamplingFactorV ,122 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,Interleaved ,110 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,Quality ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoMFX ,RestartInterval ,114 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoVPP ,In ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxInfoVPP ,Out ,100 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,AllocId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,AsyncDepth ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,mfx ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,vpp ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,Protected ,184 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,IOPattern ,186 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,ExtParam ,192 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoParam ,NumExtParam ,200 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,RateDistortionOpt ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,MECostType ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,MESearchType ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,MVSearchWindow ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,EndOfSequence ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,FramePicture ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,CAVLC ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,RecoveryPointSEI ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,ViewOutput ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,NalHrdConformance ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,SingleSeiNalUnit ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,VuiVclHrdParameters ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,RefPicListReordering ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,ResetRefList ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,RefPicMarkRep ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,FieldOutput ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,IntraPredBlockSize ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,InterPredBlockSize ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,MVPrecision ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,MaxDecFrameBuffering ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,AUDelimiter ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,EndOfStream ,58 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,PicTimingSEI ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption ,VuiNalHrdParameters ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,IntRefType ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,IntRefCycleSize ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,IntRefQPDelta ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MaxFrameSize ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MaxSliceSize ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,BitrateLimit ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MBBRC ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,ExtBRC ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,LookAheadDepth ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,Trellis ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,RepeatPPS ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,BRefType ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,AdaptiveI ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,AdaptiveB ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,LookAheadDS ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,NumMbPerSlice ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,SkipFrame ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MinQPI ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MaxQPI ,49 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MinQPP ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MaxQPP ,51 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MinQPB ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,MaxQPB ,53 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,FixedFrameRate ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,DisableDeblockingIdc ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,DisableVUI ,58 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,BufferingPeriodSEI ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,EnableMAD ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption2 ,UseRawRef ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumSliceI ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumSliceP ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumSliceB ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,WinBRCMaxAvgKbps ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,WinBRCSize ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,QVBRQuality ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,EnableMBQP ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,IntRefCycleDist ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,DirectBiasAdjustment ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,GlobalMotionBiasAdjustment ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,MVCostScalingFactor ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,MBDisableSkipMap ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,WeightedPred ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,WeightedBiPred ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,AspectRatioInfoPresent ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,OverscanInfoPresent ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,OverscanAppropriate ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,TimingInfoPresent ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,BitstreamRestriction ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,LowDelayHrd ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,MotionVectorsOverPicBoundaries,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,ScenarioInfo ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,ContentInfo ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,PRefType ,58 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,FadeDetection ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,GPB ,66 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,MaxFrameSizeI ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,MaxFrameSizeP ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,EnableQPOffset ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,QPOffset ,90 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumRefActiveP ,106 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumRefActiveBL0 ,122 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,NumRefActiveBL1 ,138 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,TransformSkip ,156 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,BRCPanicMode ,164 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,LowDelayBRC ,166 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,EnableMBForceIntra ,168 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,AdaptiveMaxFrameSize ,170 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,RepartitionCheckEnable ,172 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,EncodedUnitsInfo ,180 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,EnableNalUnitType ,182 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOption3 ,ExtBrcAdaptiveLTR ,184 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoNotUse ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoNotUse ,NumAlg ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoNotUse ,AlgList ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDenoise ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDenoise ,DenoiseFactor ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDetail ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDetail ,DetailFactor ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPProcAmp ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPProcAmp ,Brightness ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPProcAmp ,Contrast ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPProcAmp ,Hue ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPProcAmp ,Saturation ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeStat ,NumFrame ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeStat ,NumBit ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeStat ,NumCachedFrame ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxDecodeStat ,NumFrame ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxDecodeStat ,NumSkippedFrame ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxDecodeStat ,NumError ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxDecodeStat ,NumCachedFrame ,76 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPStat ,NumFrame ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPStat ,NumCachedFrame ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,SpatialComplexity ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,TemporalComplexity ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,PicStruct ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,SceneChangeRate ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppAuxData ,RepeatedFrame ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPayload ,CtrlFlags ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPayload ,Data ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPayload ,NumBit ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPayload ,Type ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPayload ,BufSize ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,MfxNalUnitType ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,SkipFrame ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,QP ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,FrameType ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,NumExtParam ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,NumPayload ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,ExtParam ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodeCtrl ,Payload ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocRequest ,AllocId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocRequest ,Info ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocRequest ,Type ,84 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocRequest ,NumFrameMin ,86 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocRequest ,NumFrameSuggested ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocResponse ,AllocId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocResponse ,mids ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocResponse ,NumFrameActual ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,SPSBuffer ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,PPSBuffer ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,SPSBufSize ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,PPSBufSize ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,SPSId ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionSPSPPS ,PPSId ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionVPS ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionVPS ,VPSBuffer ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionVPS ,VPSBufSize ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCodingOptionVPS ,VPSId ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,VideoFormat ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,VideoFullRange ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,ColourDescriptionPresent ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,ColourPrimaries ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,TransferCharacteristics ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVideoSignalInfo ,MatrixCoefficients ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoUse ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoUse ,NumAlg ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDoUse ,AlgList ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,NumRefIdxL0Active ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,NumRefIdxL1Active ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,PreferredRefList ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,PreferredRefList[0].FrameOrder ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,PreferredRefList[0].PicStruct ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,PreferredRefList[0].ViewId ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,PreferredRefList[0].LongTermIdx,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,RejectedRefList ,524 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,RejectedRefList[0].FrameOrder ,524 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,RejectedRefList[0].PicStruct ,528 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,RejectedRefList[0].ViewId ,530 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,RejectedRefList[0].LongTermIdx ,532 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,LongTermRefList ,780 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,LongTermRefList[0].FrameOrder ,780 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,LongTermRefList[0].PicStruct ,784 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,LongTermRefList[0].ViewId ,786 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,LongTermRefList[0].LongTermIdx ,788 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefListCtrl ,ApplyLongTermIdx ,1036 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFrameRateConversion ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFrameRateConversion ,Algorithm ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPImageStab ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPImageStab ,Mode ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,InsertPayloadToggle ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,DisplayPrimariesX ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,DisplayPrimariesY ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,WhitePointX ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,WhitePointY ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,MaxDisplayMasteringLuminance ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMasteringDisplayColourVolume ,MinDisplayMasteringLuminance ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtContentLightLevelInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtContentLightLevelInfo ,InsertPayloadToggle ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtContentLightLevelInfo ,MaxContentLightLevel ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtContentLightLevelInfo ,MaxPicAverageLightLevel ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].ClockTimestampFlag ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].CtType ,66 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].NuitFieldBasedFlag ,68 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].CountingType ,70 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].FullTimestampFlag ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].DiscontinuityFlag ,74 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].CntDroppedFlag ,76 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].NFrames ,78 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].SecondsFlag ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].MinutesFlag ,82 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].HoursFlag ,84 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].SecondsValue ,86 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].MinutesValue ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].HoursValue ,90 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPictureTimingSEI ,TimeStamp[0].TimeOffset ,92 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAvcTemporalLayers ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAvcTemporalLayers ,BaseLayerPID ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAvcTemporalLayers ,Layer ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAvcTemporalLayers ,Layer[0].Scale ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderCapability ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderCapability ,MBPerSec ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderResetOption ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderResetOption ,StartNewSequence ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,FrameOrder ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,PicStruct ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,LongTermIdx ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,MAD ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,BRCPanicMode ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,QP ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,SecondFieldOffset ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL0 ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL0[0].FrameOrder ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL0[0].PicStruct ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL0[0].LongTermIdx ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL1 ,544 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL1[0].FrameOrder ,544 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL1[0].PicStruct ,548 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCEncodedFrameInfo ,UsedRefListL1[0].LongTermIdx ,550 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,DstX ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,DstY ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,DstW ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,DstH ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,LumaKeyEnable ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,LumaKeyMin ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,LumaKeyMax ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,GlobalAlphaEnable ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,GlobalAlpha ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,PixelAlphaEnable ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVPPCompInputStream ,TileId ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,Y ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,U ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,V ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,R ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,G ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,B ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,NumTiles ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,NumInputStream ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPComposite ,InputStream ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,In ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,In.TransferMatrix ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,In.NominalRange ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,Out ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,Out.TransferMatrix ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,Out.NominalRange ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,TransferMatrix ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPVideoSignalInfo ,NominalRange ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,NumROI ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROIMode ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].Left ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].Top ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].Right ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].Bottom ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].Priority ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncoderROI ,ROI[0].DeltaQP ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDeinterlacing ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDeinterlacing ,Mode ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDeinterlacing ,TelecinePattern ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPDeinterlacing ,TelecineLocation ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,NumRefIdxL0Active ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,NumRefIdxL1Active ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList0 ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList0[0].FrameOrder ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList0[0].PicStruct ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList1 ,528 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList1[0].FrameOrder ,528 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRefLists ,RefPicList1[0].PicStruct ,532 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFieldProcessing ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFieldProcessing ,Mode ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFieldProcessing ,InField ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPFieldProcessing ,OutField ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,In.CropX ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,In.CropY ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,In.CropW ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,In.CropH ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.FourCC ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.ChromaFormat ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.Width ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.Height ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.CropX ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.CropY ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.CropW ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecVideoProcessing ,Out.CropH ,58 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtChromaLocInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtChromaLocInfo ,ChromaLocInfoPresentFlag ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtChromaLocInfo ,ChromaSampleLocTypeTopField ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtChromaLocInfo ,ChromaSampleLocTypeBottomField,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,Mode ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,BlockSize ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,NumQPAlloc ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,QP ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBQP ,DeltaQP ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBForceIntra ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBForceIntra ,MapSize ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBForceIntra ,Map ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCTiles ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCTiles ,NumTileRows ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCTiles ,NumTileColumns ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBDisableSkipMap ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBDisableSkipMap ,MapSize ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMBDisableSkipMap ,Map ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,PicWidthInLumaSamples ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,PicHeightInLumaSamples ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,GeneralConstraintFlags ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,SampleAdaptiveOffset ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCParam ,LCUSize ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecodeErrorReport ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecodeErrorReport ,ErrorTypes ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecodedFrameInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDecodedFrameInfo ,FrameType ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,DropFrameFlag ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,TimeCodeHours ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,TimeCodeMinutes ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,TimeCodeSeconds ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtTimeCode ,TimeCodePictures ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCRegion ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCRegion ,RegionId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCRegion ,RegionType ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtHEVCRegion ,RegionEncoding ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,LumaLog2WeightDenom ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,ChromaLog2WeightDenom ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,LumaWeightFlag ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,ChromaWeightFlag ,140 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtPredWeightTable ,Weights ,268 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRoundingOffset ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRoundingOffset ,EnableRoundingIntra ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRoundingOffset ,RoundingOffsetIntra ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRoundingOffset ,EnableRoundingInter ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAVCRoundingOffset ,RoundingOffsetInter ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,NumRect ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Rect ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Rect[0].Left ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Rect[0].Top ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Rect[0].Right ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtDirtyRect ,Rect[0].Bottom ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,NumRect ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].DestLeft ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].DestTop ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].DestRight ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].DestBottom ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].SourceLeft ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMoveRect ,Rect[0].SourceTop ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPRotation ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPRotation ,Angle ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,SliceSizeOverflow ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,NumSliceNonCopliant ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,NumEncodedSlice ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,NumSliceSizeAlloc ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedSlicesInfo ,SliceSize ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPScaling ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPScaling ,ScalingMode ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPMirroring ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPMirroring ,Type ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVOverPicBoundaries ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVOverPicBoundaries ,StickTop ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVOverPicBoundaries ,StickBottom ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVOverPicBoundaries ,StickLeft ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVOverPicBoundaries ,StickRight ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPColorFill ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVPPColorFill ,Enable ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtColorConversion ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtColorConversion ,ChromaSiting ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9SegmentParam ,FeatureEnabled ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9SegmentParam ,QIndexDelta ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9SegmentParam ,LoopFilterLevelDelta ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9SegmentParam ,ReferenceFrame ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,NumSegments ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,Segment ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,SegmentIdBlockSize ,266 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,NumSegmentIdAlloc ,268 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Segmentation ,SegmentId ,272 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9TemporalLayer ,FrameRateScale ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVP9TemporalLayer ,TargetKbps ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9TemporalLayers ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9TemporalLayers ,Layer ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,FrameWidth ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,FrameHeight ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,WriteIVFHeaders ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,QIndexDeltaLumaDC ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,QIndexDeltaChromaAC ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,QIndexDeltaChromaDC ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,NumTileRows ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP9Param ,NumTileColumns ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodedUnitInfo ,Type ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodedUnitInfo ,Offset ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxEncodedUnitInfo ,Size ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedUnitsInfo ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedUnitsInfo ,UnitInfo ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedUnitsInfo ,NumUnitsAlloc ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtEncodedUnitsInfo ,NumUnitsEncoded ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppMctf ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVppMctf ,FilterStrength ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAV1FilmGrainPoint ,Value ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxAV1FilmGrainPoint ,Scaling ,1 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,FilmGrainFlags ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,GrainSeed ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,RefIdx ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,NumYPoints ,13 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,NumCbPoints ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,NumCrPoints ,15 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,PointY ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,PointCb ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,PointCr ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,GrainScalingMinus8 ,84 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,ArCoeffLag ,85 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,ArCoeffsYPlus128 ,86 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,ArCoeffsCbPlus128 ,110 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,ArCoeffsCrPlus128 ,135 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,ArCoeffShiftMinus6 ,160 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,GrainScaleShift ,161 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CbMult ,162 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CbLumaMult ,163 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CbOffset ,164 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CrMult ,166 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CrLumaMult ,167 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtAV1FilmGrainParam ,CrOffset ,168 ) #endif //defined (__MFXSTRUCTURES_H__) //mfxvideo.h #if defined (__MFXVIDEO_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,pthis ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,Alloc ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,Lock ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,Unlock ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,GetHDL ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFrameAllocator ,Free ,56 ) #endif //defined (__MFXVIDEO_H__) //mfxplugin.h #if defined (__MFXPLUGIN_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginUID ,Data ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,PluginVersion ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,APIVersion ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,PluginUID ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,Type ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,CodecId ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,ThreadPolicy ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPluginParam ,MaxThreadNum ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreParam ,Impl ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreParam ,Version ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreParam ,NumWorkingThread ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,pthis ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,FrameAllocator ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,GetCoreParam ,144 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,GetHandle ,152 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,IncreaseReference ,160 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,DecreaseReference ,168 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,CopyFrame ,176 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,CopyBuffer ,184 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,MapOpaqueSurface ,192 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,UnmapOpaqueSurface ,200 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,GetRealSurface ,208 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,CreateAccelerationDevice ,224 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,GetFrameHandle ,232 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxCoreInterface ,QueryPlatform ,240 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,Query ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,QueryIOSurf ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,Init ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,Reset ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,Close ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,GetVideoParam ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,EncodeFrameSubmit ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,DecodeHeader ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,GetPayload ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,DecodeFrameSubmit ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,VPPFrameSubmit ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,VPPFrameSubmitEx ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxVideoCodecPlugin ,ENCFrameSubmit ,96 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,pthis ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,PluginInit ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,PluginClose ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,GetPluginParam ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,Submit ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,Execute ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,FreeResources ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,Video ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPlugin ,Audio ,56 ) #endif //defined (__MFXPLUGIN_H__) //mfxenc.h #if defined (__MFXENC_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,InSurface ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,NumFrameL0 ,136 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,L0Surface ,144 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,NumFrameL1 ,152 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,L1Surface ,160 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,NumExtParam ,168 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCInput ,ExtParam ,176 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCOutput ,OutSurface ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCOutput ,NumExtParam ,136 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(_mfxENCOutput ,ExtParam ,144 ) #endif //defined (__MFXENC_H__) //mfxfei.h #if defined (__MFXFEI_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,Qp ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,LenSP ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,SearchPath ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,SubMBPartMask ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,SubPelMode ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,InterSAD ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,IntraSAD ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,AdaptiveSearch ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,MVPredictor ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,MBQp ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,FTEnable ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,IntraPartMask ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,RefWidth ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,RefHeight ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,SearchWindow ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,DisableMVOutput ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,DisableStatisticsOutput ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,Enable8x8Stat ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,PictureType ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,DownsampleInput ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,RefPictureType ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,DownsampleReference ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncCtrl ,RefFrame ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMVPredictors ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMVPredictors ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMVPredictors ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMVPredictors::mfxExtFeiPreEncMVPredictorsMB ,MV ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncQP ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncQP ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncQP ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMV ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMV ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMV ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMV::mfxExtFeiPreEncMVMB ,MV ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,Inter ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,BestIntraDistortion ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,IntraMode ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,NumOfNonZeroCoef ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,SumOfCoef ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,Variance16x16 ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,Variance8x8 ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,PixelAverage16x16 ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB ,PixelAverage8x8 ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB::mfxExtFeiPreEncMBStatMBInter ,BestDistortion ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPreEncMBStat::mfxExtFeiPreEncMBStatMB::mfxExtFeiPreEncMBStatMBInter ,Mode ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,SearchPath ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,LenSP ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,SubMBPartMask ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,IntraPartMask ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,MultiPredL0 ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,MultiPredL1 ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,SubPelMode ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,InterSAD ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,IntraSAD ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,DistortionType ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,RepartitionCheckEnable ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,AdaptiveSearch ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,MVPredictor ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,NumMVPredictors ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,PerMBQp ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,PerMBInput ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,MBSizeCtrl ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,RefWidth ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,RefHeight ,46 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,SearchWindow ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncFrameCtrl ,ColocatedMbDistortion ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMVPredictors ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMVPredictors ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMVPredictors ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMVPredictors::mfxExtFeiEncMVPredictorsMB ,RefIdx ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMVPredictors::mfxExtFeiEncMVPredictorsMB ,MV ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBCtrl ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBCtrl ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMV ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMV ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMV ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMV::mfxExtFeiEncMVMB ,MV ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat::mfxExtFeiEncMBStatMB ,InterDistortion ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat::mfxExtFeiEncMBStatMB ,BestInterDistortion ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat::mfxExtFeiEncMBStatMB ,BestIntraDistortion ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiEncMBStat::mfxExtFeiEncMBStatMB ,ColocatedMbDistortion ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,MVDataLength ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,MVDataOffset ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,HorzOrigin ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,VertOrigin ,17 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,CbpY ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,CbpCb ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,CbpCr ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,IntraMB ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,IntraMB.LumaIntraPredModes ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,InterMB ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,InterMB.SubMbShapes ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,InterMB.SubMbPredModes ,29 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,InterMB.RefIdx ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,TargetSizeInWord ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiPakMBCtrl ,MaxSizeInWord ,43 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPakMBCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPakMBCtrl ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPakMBCtrl ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackCtrl ,MaxFrameSize ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackCtrl ,NumPasses ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackCtrl ,DeltaQP ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackStat ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiRepackStat ,NumPasses ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,HorzOrigin ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,VertOrigin ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,IntraMB.LumaIntraPredModes ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,InterMB ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,InterMB.SubMbShapes ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,InterMB.SubMbPredModes ,17 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,InterMB.RefIdx ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiDecStreamOutMBCtrl ,MV ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiDecStreamOut ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiDecStreamOut ,NumMBAlloc ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiDecStreamOut ,RemapRefIdx ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiDecStreamOut ,PicStruct ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiDecStreamOut ,MB ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSPS ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSPS ,SPSId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSPS ,PicOrderCntType ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSPS ,Log2MaxPicOrderCntLsb ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,SPSId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,PPSId ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,PictureType ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,PicInitQP ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,NumRefIdxL0Active ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,NumRefIdxL1Active ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,ChromaQPIndexOffset ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,SecondChromaQPIndexOffset ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,Transform8x8ModeFlag ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,DpbBefore ,256 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS::mfxExtFeiPpsDPB ,Index ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS::mfxExtFeiPpsDPB ,PicType ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS::mfxExtFeiPpsDPB ,FrameNumWrap ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS::mfxExtFeiPpsDPB ,LongTermFrameIdx ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiPPS ,DpbAfter ,512 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader ,NumSlice ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader ,Slice ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,MBAddress ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,NumMBs ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,SliceType ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,PPSId ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,IdrPicId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,CabacInitIdc ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,NumRefIdxL0Active ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,NumRefIdxL1Active ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,SliceQPDelta ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,DisableDeblockingFilterIdc ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,SliceAlphaC0OffsetDiv2 ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,SliceBetaOffsetDiv2 ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,RefL0 ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice ,RefL1 ,320 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice::mfxSliceRef ,PictureType ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiSliceHeader::mfxSlice::mfxSliceRef ,Index ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiCodingOption ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiCodingOption ,DisableHME ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiCodingOption ,DisableSuperHME ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiCodingOption ,DisableUltraHME ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiParam ,Func ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiParam ,SingleFieldProcessing ,12 ) #endif //defined (__MFXFEI_H__) //mfxfeihevc.h #if defined (__MFXFEIHEVC_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,SearchPath ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,LenSP ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,RefWidth ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,RefHeight ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,SearchWindow ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,NumMvPredictors ,18 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,MultiPred ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,SubPelMode ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,AdaptiveSearch ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,MVPredictor ,30 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,PerCuQp ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,PerCtuInput ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,ForceCtuSplit ,36 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,NumFramePartitions ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncFrameCtrl ,FastIntraMode ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiHevcEncMVPredictors ,RefIdx ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxFeiHevcEncMVPredictors ,MV ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncMVPredictors ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncMVPredictors ,VaBufferID ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncMVPredictors ,Pitch ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncMVPredictors ,Height ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncMVPredictors ,Data ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncQP ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncQP ,VaBufferID ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncQP ,Pitch ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncQP ,Height ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncQP ,Data ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncCtuCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncCtuCtrl ,VaBufferID ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncCtuCtrl ,Pitch ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncCtuCtrl ,Height ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcEncCtuCtrl ,Data ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackCtrl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackCtrl ,MaxFrameSize ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackCtrl ,NumPasses ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackCtrl ,DeltaQP ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackStat ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtFeiHevcRepackStat ,NumPasses ,8 ) #endif //defined (__MFXFEIHEVC_H__) //mfxjpeg.h #if defined (__MFX_JPEG_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGQuantTables ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGQuantTables ,NumTable ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGQuantTables ,Qm ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,NumDCTable ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,NumACTable ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,DCTables[0].Bits ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,DCTables[0].Values ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,ACTables[0].Bits ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtJPEGHuffmanTables ,ACTables[0].Values ,144 ) #endif //defined (__MFX_JPEG_H__) //mfxla.h #if defined (__MFXLA_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,LookAheadDepth ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,DependencyDepth ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,DownScaleFactor ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,BPyramid ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,NumOutStream ,62 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl ,OutStream ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl::mfxStream ,Width ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAControl::mfxStream ,Height ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,Width ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,Height ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,FrameType ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,FrameDisplayOrder ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,FrameEncodeOrder ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,IntraCost ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,InterCost ,20 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,DependencyCost ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,Layer ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxLAFrameInfo ,EstimatedRate ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,NumAlloc ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,NumStream ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,NumFrame ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,FrameStat ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtLAFrameStatistics ,OutSurface ,64 ) #endif //defined (__MFXLA_H__) //mfxmvc.h #if defined (__MFXMVC_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,ViewId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NumAnchorRefsL0 ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NumAnchorRefsL1 ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,AnchorRefL0 ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,AnchorRefL1 ,38 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NumNonAnchorRefsL0 ,70 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NumNonAnchorRefsL1 ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NonAnchorRefL0 ,74 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCViewDependency ,NonAnchorRefL1 ,106 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCOperationPoint ,TemporalId ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCOperationPoint ,LevelIdc ,2 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCOperationPoint ,NumViews ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCOperationPoint ,NumTargetViews ,6 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxMVCOperationPoint ,TargetViewId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumView ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumViewAlloc ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,View ,16 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumViewId ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumViewIdAlloc ,28 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,ViewId ,32 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumOP ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumOPAlloc ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,OP ,48 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCSeqDesc ,NumRefsTotal ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCTargetViews ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCTargetViews ,TemporalId ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCTargetViews ,NumView ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtMVCTargetViews ,ViewId ,16 ) #endif //defined (__MFXMVC_H__) //mfxpak.h #if defined (__MFXPAK_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,InSurface ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,NumFrameL0 ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,L0Surface ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,NumFrameL1 ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,L1Surface ,96 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,NumExtParam ,104 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,ExtParam ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,NumPayload ,120 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKInput ,Payload ,128 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKOutput ,Bs ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKOutput ,OutSurface ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKOutput ,NumExtParam ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxPAKOutput ,ExtParam ,88 ) #endif //defined (__MFXPAK_H__) //mfxvp8.h #if defined (__MFXVP8_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,Version ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,EnableMultipleSegments ,10 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,LoopFilterType ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,LoopFilterLevel ,14 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,SharpnessLevel ,22 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,NumTokenPartitions ,24 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,LoopFilterRefTypeDelta ,26 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,LoopFilterMbModeDelta ,34 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,SegmentQPDelta ,42 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,CoeffTypeQPDelta ,50 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,WriteIVFHeaders ,60 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtVP8CodingOption ,NumFramesForIVFHeader ,64 ) #endif //defined (__MFXVP8_H__) //mfxbrc.h #if defined (__MFXBRC_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,SceneChange ,92 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,LongTerm ,94 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,FrameCmplx ,96 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,EncodedOrder ,100 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,DisplayOrder ,104 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,CodedFrameSize ,108 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,FrameType ,112 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,PyramidLayer ,114 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,NumRecode ,116 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,NumExtParam ,118 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameParam ,ExtParam ,120 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,QpY ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,InitialCpbRemovalDelay ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,InitialCpbRemovalOffset ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,MaxFrameSize ,40 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,DeltaQP ,44 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,MaxNumRepak ,52 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,NumExtParam ,54 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameCtrl ,ExtParam ,56 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameStatus ,MinFrameSize ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxBRCFrameStatus ,BRCStatus ,4 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,pthis ,64 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,Init ,72 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,Reset ,80 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,Close ,88 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,GetFrameCtrl ,96 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtBRC ,Update ,104 ) #endif //defined (__MFXBRC_H__) //mfxpcp.h #if defined (__MFXPCP_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCencParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtCencParam ,StatusReportIndex ,8 ) #endif //defined (__MFXPCP_H__) //mfxsc.h #if defined (__MFXSC_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtScreenCaptureParam ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtScreenCaptureParam ,DisplayIndex ,8 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtScreenCaptureParam ,EnableDirtyRect ,12 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtScreenCaptureParam ,EnableCursorCapture ,14 ) #endif //defined (__MFXSC_H__) //mfxscd.h #if defined (__MFXSCD_H__) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtSCD ,Header ,0 ) MSDK_STATIC_ASSERT_STRUCT_OFFSET(mfxExtSCD ,SceneType ,8 ) #endif //defined (__MFXSCD_H__) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/mfx_umc_alloc_wrapper.cpp000066400000000000000000002160301443134507600300500ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_common.h" #include "libmfx_core.h" #include "mfx_common_int.h" #include "mfx_common_decode_int.h" #include #if !defined MFX_DEC_VIDEO_POSTPROCESS_DISABLE // For setting SFC surface #include "umc_va_video_processing.h" #endif #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "mfx_vpp_jpeg.h" #endif mfx_UMC_MemAllocator::mfx_UMC_MemAllocator():m_pCore(NULL) { } mfx_UMC_MemAllocator::~mfx_UMC_MemAllocator() { } UMC::Status mfx_UMC_MemAllocator::InitMem(UMC::MemoryAllocatorParams *, VideoCORE* mfxCore) { UMC::AutomaticUMCMutex guard(m_guard); UMC::Status Sts = UMC::UMC_OK; if(!mfxCore) return UMC::UMC_ERR_NULL_PTR; m_pCore = mfxCore; return Sts; } UMC::Status mfx_UMC_MemAllocator::Close() { UMC::AutomaticUMCMutex guard(m_guard); UMC::Status sts = UMC::UMC_OK; m_pCore = 0; return sts; } UMC::Status mfx_UMC_MemAllocator::Alloc(UMC::MemID *pNewMemID, size_t Size, Ipp32u , Ipp32u ) { UMC::AutomaticUMCMutex guard(m_guard); mfxMemId memId; mfxStatus Sts = m_pCore->AllocBuffer((mfxU32)Size, /*MFX_MEMTYPE_PERSISTENT_MEMORY*/ MFX_MEMTYPE_SYSTEM_MEMORY, &memId); MFX_CHECK_UMC_STS(Sts); *pNewMemID = ((UMC::MemID)memId + 1); return UMC::UMC_OK; } void* mfx_UMC_MemAllocator::Lock(UMC::MemID MID) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus Sts = MFX_ERR_NONE; mfxU8 *ptr; Sts = m_pCore->LockBuffer((mfxHDL)(MID - 1), &ptr); if (Sts < MFX_ERR_NONE) return 0; return ptr; } UMC::Status mfx_UMC_MemAllocator::Unlock(UMC::MemID MID) { UMC::AutomaticUMCMutex guard(m_guard); UMC::Status sts = UMC::UMC_OK; m_pCore->UnlockBuffer((mfxHDL)(MID - 1)); return sts; } UMC::Status mfx_UMC_MemAllocator::Free(UMC::MemID MID) { UMC::AutomaticUMCMutex guard(m_guard); m_pCore->FreeBuffer((mfxHDL)(MID - 1)); return UMC::UMC_OK; } UMC::Status mfx_UMC_MemAllocator::DeallocateMem(UMC::MemID ) { UMC::Status sts = UMC::UMC_OK; return sts; } //////////////////////////////////////////////////////////////////////////////////////////////// // mfx_UMC_FrameAllocator implementation //////////////////////////////////////////////////////////////////////////////////////////////// mfx_UMC_FrameAllocator::InternalFrameData::FrameRefInfo::FrameRefInfo() : m_referenceCounter(0) { } void mfx_UMC_FrameAllocator::InternalFrameData::FrameRefInfo::Reset() { m_referenceCounter = 0; } bool mfx_UMC_FrameAllocator::InternalFrameData::IsValidMID(mfxU32 index) const { if (index >= m_frameData.size()) return false; return true; } mfxFrameSurface1 & mfx_UMC_FrameAllocator::InternalFrameData::GetSurface(mfxU32 index) { if (!IsValidMID(index)) throw std::exception(); return m_frameData[index].first; } UMC::FrameData & mfx_UMC_FrameAllocator::InternalFrameData::GetFrameData(mfxU32 index) { if (!IsValidMID(index)) throw std::exception(); return m_frameData[index].second; } void mfx_UMC_FrameAllocator::InternalFrameData::Close() { m_frameData.clear(); m_frameDataRefs.clear(); } void mfx_UMC_FrameAllocator::InternalFrameData::ResetFrameData(mfxU32 index) { if (!IsValidMID(index)) throw std::exception(); m_frameDataRefs[index].Reset(); m_frameData[index].second.Reset(); } void mfx_UMC_FrameAllocator::InternalFrameData::Resize(mfxU32 size) { m_frameData.resize(size); m_frameDataRefs.resize(size); } mfxU32 mfx_UMC_FrameAllocator::InternalFrameData::IncreaseRef(mfxU32 index) { if (!IsValidMID(index)) throw std::exception(); FrameRefInfo * frameRef = &m_frameDataRefs[index]; frameRef->m_referenceCounter++; return frameRef->m_referenceCounter; } mfxU32 mfx_UMC_FrameAllocator::InternalFrameData::DecreaseRef(mfxU32 index) { if (!IsValidMID(index)) throw std::exception(); FrameRefInfo * frameRef = &m_frameDataRefs[index]; frameRef->m_referenceCounter--; return frameRef->m_referenceCounter; } void mfx_UMC_FrameAllocator::InternalFrameData::Reset() { // unlock internal surfaces for (mfxU32 i = 0; i < m_frameData.size(); i++) { m_frameData[i].first.Data.Locked = 0; // if app ext allocator then should decrease Locked counter same times as locked by medisSDK m_frameData[i].second.Reset(); } for (mfxU32 i = 0; i < m_frameDataRefs.size(); i++) { m_frameDataRefs[i].Reset(); } } mfxU32 mfx_UMC_FrameAllocator::InternalFrameData::GetSize() const { return (mfxU32)m_frameData.size(); } void mfx_UMC_FrameAllocator::InternalFrameData::AddNewFrame(mfx_UMC_FrameAllocator * alloc, mfxFrameSurface1 *surface, UMC::VideoDataInfo * info) { FrameRefInfo refInfo; m_frameDataRefs.push_back(refInfo); FrameInfo frameInfo; m_frameData.push_back(frameInfo); mfxU32 index = (mfxU32)(m_frameData.size() - 1);; memset(&(m_frameData[index].first), 0, sizeof(m_frameData[index].first)); m_frameData[index].first.Data.MemId = surface->Data.MemId; m_frameData[index].first.Info = surface->Info; // fill UMC frameData UMC::FrameData* frameData = &GetFrameData(index); // set correct width & height to planes frameData->Init(info, (UMC::FrameMemID)index, alloc); } mfx_UMC_FrameAllocator::mfx_UMC_FrameAllocator() : m_curIndex(-1) , m_IsUseExternalFrames(true) , m_sfcVideoPostProcessing(false) , m_surface_info() , m_pCore(0) , m_externalFramesResponse(0) , m_isSWDecode(false) , m_IOPattern(0) { } mfx_UMC_FrameAllocator::~mfx_UMC_FrameAllocator() { Close(); } UMC::Status mfx_UMC_FrameAllocator::InitMfx(UMC::FrameAllocatorParams *, VideoCORE* mfxCore, const mfxVideoParam *params, const mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isUseExternalFrames, bool isSWplatform) { UMC::AutomaticUMCMutex guard(m_guard); m_isSWDecode = isSWplatform; if (!mfxCore || !params) return UMC::UMC_ERR_NULL_PTR; m_IOPattern = params->IOPattern; if (!isUseExternalFrames && (!request || !response)) return UMC::UMC_ERR_NULL_PTR; m_pCore = mfxCore; m_IsUseExternalFrames = isUseExternalFrames; mfxU32 bit_depth = BitDepthFromFourcc(params->mfx.FrameInfo.FourCC); UMC::ColorFormat color_format; switch (params->mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: color_format = UMC::NV12; break; case MFX_FOURCC_P010: color_format = UMC::NV12; break; case MFX_FOURCC_NV16: color_format = UMC::NV16; break; case MFX_FOURCC_P210: color_format = UMC::NV16; break; case MFX_FOURCC_RGB4: color_format = UMC::RGB32; break; case MFX_FOURCC_YV12: color_format = UMC::YUV420; break; case MFX_FOURCC_YUY2: color_format = UMC::YUY2; break; case MFX_FOURCC_AYUV: color_format = UMC::AYUV; break; case MFX_FOURCC_Y210: color_format = UMC::Y210; break; case MFX_FOURCC_Y410: color_format = UMC::Y410; break; case MFX_FOURCC_P016: color_format = UMC::P016; break; case MFX_FOURCC_Y216: color_format = UMC::Y216; break; case MFX_FOURCC_Y416: color_format = UMC::Y416; break; default: return UMC::UMC_ERR_UNSUPPORTED; } UMC::Status umcSts = m_info.Init(request->Info.Width, request->Info.Height, color_format, bit_depth); m_surface_info = request->Info; if (umcSts != UMC::UMC_OK) return umcSts; if (!m_IsUseExternalFrames || !m_isSWDecode) { m_frameDataInternal.Resize(response->NumFrameActual); m_extSurfaces.resize(response->NumFrameActual); for (mfxU32 i = 0; i < response->NumFrameActual; i++) { mfxFrameSurface1 & surface = m_frameDataInternal.GetSurface(i); surface.Data.MemId = response->mids[i]; surface.Data.MemType = request->Type; surface.Info = request->Info; // fill UMC frameData UMC::FrameData& frameData = m_frameDataInternal.GetFrameData(i); // set correct width & height to planes frameData.Init(&m_info, (UMC::FrameMemID)i, this); } } else { m_extSurfaces.reserve(response->NumFrameActual); } return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator::Close() { UMC::AutomaticUMCMutex guard(m_guard); Reset(); m_frameDataInternal.Close(); m_extSurfaces.clear(); return UMC::UMC_OK; } void mfx_UMC_FrameAllocator::SetExternalFramesResponse(mfxFrameAllocResponse *response) { m_externalFramesResponse = 0; if (!response || (!m_pCore->IsSupportedDelayAlloc() && !response->NumFrameActual)) return; m_externalFramesResponse = response; } UMC::Status mfx_UMC_FrameAllocator::Reset() { UMC::AutomaticUMCMutex guard(m_guard); m_curIndex = -1; mfxStatus sts = MFX_ERR_NONE; m_frameDataInternal.Reset(); // free external surfaces for (mfxU32 i = 0; i < m_extSurfaces.size(); i++) { if (m_extSurfaces[i].isUsed) { sts = m_pCore->DecreaseReference(&m_extSurfaces[i].FrameSurface->Data); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; m_extSurfaces[i].isUsed = false; } m_extSurfaces[i].FrameSurface = 0; } if (m_IsUseExternalFrames && m_isSWDecode) { m_extSurfaces.clear(); m_frameDataInternal.Close(); } return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator::GetFrameHandle(UMC::FrameMemID memId, void * handle) { if (m_pCore->GetFrameHDL(ConvertMemId(memId), (mfxHDL*)handle) != MFX_ERR_NONE) return UMC::UMC_ERR_ALLOC; return UMC::UMC_OK; } static mfxStatus SetSurfaceForSFC(VideoCORE& core, mfxFrameSurface1& surf) { #if !defined MFX_DEC_VIDEO_POSTPROCESS_DISABLE // Set surface for SFC UMC::VideoAccelerator * va = nullptr; core.GetVA((mfxHDL*)&va, MFX_MEMTYPE_FROM_DECODE); MFX_CHECK_HDL(va); auto video_processing_va = va->GetVideoProcessingVA(); if (video_processing_va && core.GetVAType() == MFX_HW_VAAPI) { mfxHDLPair surfHDLpair = {}; MFX_SAFE_CALL(core.GetExternalFrameHDL(surf, surfHDLpair, false)); video_processing_va->SetOutputSurface(surfHDLpair.first); } #else std::ignore = core; std::ignore = surf; #endif return MFX_ERR_NONE; } UMC::Status mfx_UMC_FrameAllocator::Alloc(UMC::FrameMemID *pNewMemID, const UMC::VideoDataInfo * info, uint32_t a_flags) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; if (!pNewMemID) return UMC::UMC_ERR_NULL_PTR; mfxI32 index = FindFreeSurface(); if (index == -1) { *pNewMemID = UMC::FRAME_MID_INVALID; return UMC::UMC_ERR_ALLOC; } *pNewMemID = (UMC::FrameMemID)index; mfxFrameInfo &surfInfo = m_frameDataInternal.GetSurface(index).Info; IppiSize allocated = { surfInfo.Width, surfInfo.Height}; IppiSize passed = {static_cast(info->GetWidth()), static_cast(info->GetHeight())}; UMC::ColorFormat colorFormat = m_info.GetColorFormat(); switch(colorFormat) { case UMC::YUV420: case UMC::GRAY: case UMC::YV12: case UMC::YUV422: case UMC::NV12: case UMC::NV16: case UMC::YUY2: case UMC::IMC3: case UMC::RGB32: case UMC::AYUV: case UMC::YUV444: case UMC::YUV411: case UMC::Y210: case UMC::Y216: case UMC::Y410: case UMC::P016: case UMC::Y416: break; default: return UMC::UMC_ERR_UNSUPPORTED; } if (colorFormat == UMC::NV12 && info->GetColorFormat() == UMC::NV12) { if ((m_info.GetPlaneSampleSize(0) != info->GetPlaneSampleSize(0)) || (m_info.GetPlaneSampleSize(1) != info->GetPlaneSampleSize(1))) return UMC::UMC_ERR_UNSUPPORTED; } if (passed.width > allocated.width || passed.height > allocated.height) { if (!(a_flags & mfx_UMC_ReallocAllowed)) return UMC::UMC_ERR_UNSUPPORTED; } sts = m_pCore->IncreasePureReference(m_frameDataInternal.GetSurface(index).Data.Locked); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; if ((m_IsUseExternalFrames) || (m_sfcVideoPostProcessing)) { if (m_extSurfaces[index].FrameSurface) { sts = m_pCore->IncreaseReference(&m_extSurfaces[index].FrameSurface->Data); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; m_extSurfaces[m_curIndex].isUsed = true; if (m_sfcVideoPostProcessing) { SetSurfaceForSFC(*m_pCore, *m_extSurfaces[index].FrameSurface); } } } m_frameDataInternal.ResetFrameData(index); m_curIndex = -1; if (passed.width > allocated.width || passed.height > allocated.height) { if (a_flags & mfx_UMC_ReallocAllowed) return UMC::UMC_ERR_NOT_ENOUGH_BUFFER; } return UMC::UMC_OK; } const UMC::FrameData* mfx_UMC_FrameAllocator::Lock(UMC::FrameMemID mid) { UMC::AutomaticUMCMutex guard(m_guard); mfxU32 index = (mfxU32)mid; if (!m_frameDataInternal.IsValidMID(index)) return 0; mfxFrameData *data = 0; mfxFrameSurface1 check_surface = {}; mfxFrameSurface1 &internal_surface = m_frameDataInternal.GetSurface(index); check_surface.Info.FourCC = internal_surface.Info.FourCC; if (m_IsUseExternalFrames) { if (internal_surface.Data.MemId != 0) { data = &internal_surface.Data; mfxStatus sts = m_pCore->LockExternalFrame(internal_surface.Data.MemId, data); if (sts < MFX_ERR_NONE || !data) return 0; check_surface.Data = *data; check_surface.Data.MemId = 0; sts = CheckFrameData(&check_surface); if (sts < MFX_ERR_NONE) return 0; } else { data = &m_extSurfaces[index].FrameSurface->Data; } } else { if (internal_surface.Data.MemId != 0) { data = &internal_surface.Data; mfxStatus sts = m_pCore->LockFrame(internal_surface.Data.MemId, data); if (sts < MFX_ERR_NONE || !data) return 0; check_surface.Data = *data; check_surface.Data.MemId = 0; sts = CheckFrameData(&check_surface); if (sts < MFX_ERR_NONE) return 0; } else // invalid situation, we always allocate internal frames with MemId return 0; } UMC::FrameData* frameData = &m_frameDataInternal.GetFrameData(index); mfxU32 pitch = data->PitchLow + ((mfxU32)data->PitchHigh << 16); switch (frameData->GetInfo()->GetColorFormat()) { case UMC::NV16: case UMC::NV12: frameData->SetPlanePointer(data->Y, 0, pitch); frameData->SetPlanePointer(data->U, 1, pitch); break; case UMC::YUV420: case UMC::YUV422: frameData->SetPlanePointer(data->Y, 0, pitch); frameData->SetPlanePointer(data->U, 1, pitch >> 1); frameData->SetPlanePointer(data->V, 2, pitch >> 1); break; case UMC::IMC3: frameData->SetPlanePointer(data->Y, 0, pitch); frameData->SetPlanePointer(data->U, 1, pitch); frameData->SetPlanePointer(data->V, 2, pitch); break; case UMC::RGB32: { frameData->SetPlanePointer(data->B, 0, pitch); } break; case UMC::YUY2: { frameData->SetPlanePointer(data->Y, 0, pitch); } break; default: if (internal_surface.Data.MemId) { if (m_IsUseExternalFrames) { m_pCore->UnlockExternalFrame(m_extSurfaces[index].FrameSurface->Data.MemId); } else { m_pCore->UnlockFrame(internal_surface.Data.MemId); } } return 0; } //frameMID->m_locks++; return frameData; } UMC::Status mfx_UMC_FrameAllocator::Unlock(UMC::FrameMemID mid) { UMC::AutomaticUMCMutex guard(m_guard); mfxU32 index = (mfxU32)mid; if (!m_frameDataInternal.IsValidMID(index)) return UMC::UMC_ERR_FAILED; mfxFrameSurface1 &internal_surface = m_frameDataInternal.GetSurface(index); if (internal_surface.Data.MemId) { mfxStatus sts; if (m_IsUseExternalFrames) sts = m_pCore->UnlockExternalFrame(m_extSurfaces[index].FrameSurface->Data.MemId); else sts = m_pCore->UnlockFrame(internal_surface.Data.MemId); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; } return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator::IncreaseReference(UMC::FrameMemID mid) { UMC::AutomaticUMCMutex guard(m_guard); mfxU32 index = (mfxU32)mid; if (!m_frameDataInternal.IsValidMID(index)) return UMC::UMC_ERR_FAILED; m_frameDataInternal.IncreaseRef(index); return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator::DecreaseReference(UMC::FrameMemID mid) { UMC::AutomaticUMCMutex guard(m_guard); mfxU32 index = (mfxU32)mid; if (!m_frameDataInternal.IsValidMID(index)) return UMC::UMC_ERR_FAILED; mfxU32 refCounter = m_frameDataInternal.DecreaseRef(index); if (!refCounter) { return Free(mid); } return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator::Free(UMC::FrameMemID mid) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; mfxU32 index = (mfxU32)mid; if (!m_frameDataInternal.IsValidMID(index)) return UMC::UMC_ERR_FAILED; sts = m_pCore->DecreasePureReference(m_frameDataInternal.GetSurface(index).Data.Locked); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; if ((m_IsUseExternalFrames) || (m_sfcVideoPostProcessing)) { if (m_extSurfaces[index].FrameSurface) { sts = m_pCore->DecreaseReference(&m_extSurfaces[index].FrameSurface->Data); if (sts < MFX_ERR_NONE) return UMC::UMC_ERR_FAILED; } m_extSurfaces[index].isUsed = false; } return UMC::UMC_OK; } mfxStatus mfx_UMC_FrameAllocator::SetCurrentMFXSurface(mfxFrameSurface1 *surf) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK_NULL_PTR1(surf); if (surf->Data.Locked) return MFX_ERR_MORE_SURFACE; // check input surface if (!(m_sfcVideoPostProcessing && (surf->Info.FourCC != m_surface_info.FourCC)))// if csc is done via sfc, will not do below checks { if ((surf->Info.BitDepthLuma ? surf->Info.BitDepthLuma : 8) != (m_surface_info.BitDepthLuma ? m_surface_info.BitDepthLuma : 8)) return MFX_ERR_INVALID_VIDEO_PARAM; if ((surf->Info.BitDepthChroma ? surf->Info.BitDepthChroma : 8) != (m_surface_info.BitDepthChroma ? m_surface_info.BitDepthChroma : 8)) return MFX_ERR_INVALID_VIDEO_PARAM; } if (surf->Info.FourCC == MFX_FOURCC_P010 || surf->Info.FourCC == MFX_FOURCC_P210 || surf->Info.FourCC == MFX_FOURCC_Y210 || surf->Info.FourCC == MFX_FOURCC_P016 || surf->Info.FourCC == MFX_FOURCC_Y216 || surf->Info.FourCC == MFX_FOURCC_Y416) { if (m_isSWDecode) { if (surf->Info.Shift != 0) return MFX_ERR_INVALID_VIDEO_PARAM; } else { if ((m_IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && surf->Info.Shift != 1) return MFX_ERR_INVALID_VIDEO_PARAM; } } if (m_externalFramesResponse && surf->Data.MemId) { bool isFound = false; for (mfxI32 i = 0; i < m_externalFramesResponse->NumFrameActual; i++) { if (m_pCore->MapIdx(m_externalFramesResponse->mids[i]) == surf->Data.MemId) { isFound = true; break; } } // in delay allocate mode, the m_externalFramesResponse->mids maybe not filled in the MFXInit // surface will be added into m_frameDataInternal on the fly // Delay allocate mode not work with D3D9, D3D9 will use legacy allocator logical if (!isFound) { MFX_CHECK(m_pCore->IsSupportedDelayAlloc(), MFX_ERR_UNDEFINED_BEHAVIOR); for (mfxU32 i = 0; i < m_frameDataInternal.GetSize(); i++) { auto& internal_surf = m_frameDataInternal.GetSurface(i); if (internal_surf.Data.MemId == surf->Data.MemId) { isFound = true; break; } } } // add the new APP surface on the fly if (m_pCore->IsSupportedDelayAlloc() && !isFound) { m_frameDataInternal.AddNewFrame(this, surf, &m_info); m_extSurfaces.push_back(surf_descr(surf, false)); } } m_curIndex = -1; if ((!m_IsUseExternalFrames) && (!m_sfcVideoPostProcessing)) m_curIndex = FindFreeSurface(); else if ((!m_IsUseExternalFrames) && (m_sfcVideoPostProcessing)) { for (mfxU32 i = 0; i < m_extSurfaces.size(); i++) { if (NULL == m_extSurfaces[i].FrameSurface) { /* new surface */ m_curIndex = i; m_extSurfaces[m_curIndex].FrameSurface = surf; break; } if ( (NULL != m_extSurfaces[i].FrameSurface) && (0 == m_extSurfaces[i].FrameSurface->Data.Locked) && (m_extSurfaces[i].FrameSurface->Data.MemId == surf->Data.MemId) && (0 == m_frameDataInternal.GetSurface(i).Data.Locked) ) { /* surfaces filled already */ m_curIndex = i; m_extSurfaces[m_curIndex].FrameSurface = surf; break; } } // Still not found. It may happen if decoder gets 'surf' surface which on app side belongs to // a pool bigger than m_extSurfaces/m_frameDataInternal pools which decoder is aware. if (m_curIndex == -1) { for (mfxU32 i = 0; i < m_extSurfaces.size(); i++) { // So attemping to find an expired slot in m_extSurfaces if (!m_extSurfaces[i].isUsed && (0 == m_frameDataInternal.GetSurface(i).Data.Locked)) { m_curIndex = i; m_extSurfaces[m_curIndex].FrameSurface = surf; break; } } } } else { m_curIndex = FindSurface(surf); if (m_curIndex != -1) { mfxFrameSurface1 &internalSurf = m_frameDataInternal.GetSurface(m_curIndex); m_extSurfaces[m_curIndex].FrameSurface = surf; if (internalSurf.Data.Locked) // surface was locked yet { m_curIndex = -1; } // update info internalSurf.Info = surf->Info; } else { m_curIndex = AddSurface(surf); if (m_curIndex != -1) m_extSurfaces[m_curIndex].FrameSurface = surf; } } return MFX_ERR_NONE; } mfxI32 mfx_UMC_FrameAllocator::AddSurface(mfxFrameSurface1 *surface) { UMC::AutomaticUMCMutex guard(m_guard); mfxI32 index = -1; if (!m_IsUseExternalFrames) return -1; if (surface->Data.MemId && !m_isSWDecode) { mfxU32 i; for (i = 0; i < m_extSurfaces.size(); i++) { if (surface->Data.MemId == m_pCore->MapIdx(m_frameDataInternal.GetSurface(i).Data.MemId)) { m_extSurfaces[i].FrameSurface = surface; index = i; break; } } } else { m_extSurfaces.push_back(surf_descr(surface,false)); index = (mfxI32)(m_extSurfaces.size() - 1); } switch (surface->Info.FourCC) { case MFX_FOURCC_NV12: case MFX_FOURCC_NV16: case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_RGB4: case MFX_FOURCC_AYUV: case MFX_FOURCC_P010: case MFX_FOURCC_P210: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_Y216: break; default: return -1; } if (m_IsUseExternalFrames && m_isSWDecode) { m_frameDataInternal.AddNewFrame(this, surface, &m_info); } return index; } mfxI32 mfx_UMC_FrameAllocator::FindSurface(mfxFrameSurface1 *surf) { UMC::AutomaticUMCMutex guard(m_guard); if (!surf) return -1; mfxFrameData * data = &surf->Data; if (data->MemId && m_IsUseExternalFrames) { mfxMemId sMemId; for (mfxU32 i = 0; i < m_frameDataInternal.GetSize(); i++) { mfxMemId memId = m_frameDataInternal.GetSurface(i).Data.MemId; sMemId = m_pCore->MapIdx(memId); if (sMemId == data->MemId) { return i; } } } for (mfxU32 i = 0; i < m_extSurfaces.size(); i++) { if (m_extSurfaces[i].FrameSurface == surf) { return i; } } return -1; } mfxI32 mfx_UMC_FrameAllocator::FindFreeSurface() { UMC::AutomaticUMCMutex guard(m_guard); if ((m_IsUseExternalFrames) || (m_sfcVideoPostProcessing)) { return m_curIndex; } if (m_curIndex != -1) return m_curIndex; for (mfxU32 i = 0; i < m_frameDataInternal.GetSize(); i++) { if (!m_frameDataInternal.GetSurface(i).Data.Locked) { return i; } } return -1; } bool mfx_UMC_FrameAllocator::HasFreeSurface() { return FindFreeSurface() != -1; } mfxFrameSurface1 * mfx_UMC_FrameAllocator::GetInternalSurface(UMC::FrameMemID index) { UMC::AutomaticUMCMutex guard(m_guard); if (m_IsUseExternalFrames) { return 0; } if (index >= 0) { if (!m_frameDataInternal.IsValidMID((mfxU32)index)) return 0; return &m_frameDataInternal.GetSurface(index); } return 0; } mfxFrameSurface1 * mfx_UMC_FrameAllocator::GetSurfaceByIndex(UMC::FrameMemID index) { UMC::AutomaticUMCMutex guard(m_guard); if (index < 0) return 0; if (!m_frameDataInternal.IsValidMID((mfxU32)index)) return 0; return m_IsUseExternalFrames ? m_extSurfaces[index].FrameSurface : &m_frameDataInternal.GetSurface(index); } void mfx_UMC_FrameAllocator::SetSfcPostProcessingFlag(bool flagToSet) { m_sfcVideoPostProcessing = flagToSet; } mfxFrameSurface1 * mfx_UMC_FrameAllocator::GetSurface(UMC::FrameMemID index, mfxFrameSurface1 *surface, const mfxVideoParam * videoPar) { UMC::AutomaticUMCMutex guard(m_guard); if (!surface || !videoPar || 0 > index) return 0; if ((m_IsUseExternalFrames) || (m_sfcVideoPostProcessing)) { if ((Ipp32u)index >= m_extSurfaces.size()) return 0; return m_extSurfaces[index].FrameSurface; } else { mfxStatus sts = m_pCore->IncreaseReference(&surface->Data); if (sts < MFX_ERR_NONE) return 0; m_extSurfaces[index].FrameSurface = surface; } return surface; } mfxStatus mfx_UMC_FrameAllocator::PrepareToOutput(mfxFrameSurface1 *surface_work, UMC::FrameMemID index, const mfxVideoParam *, mfxU32 gpuCopyMode) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts; mfxU16 dstMemType = (MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET); UMC::FrameData* frame = &m_frameDataInternal.GetFrameData(index); if (m_IsUseExternalFrames) return MFX_ERR_NONE; mfxFrameSurface1 surface; memset(&surface, 0, sizeof(mfxFrameSurface1)); surface.Info = m_surface_info; surface.Info.Width = (mfxU16)frame->GetInfo()->GetWidth(); surface.Info.Height = (mfxU16)frame->GetInfo()->GetHeight(); switch (frame->GetInfo()->GetColorFormat()) { case UMC::NV12: surface.Data.Y = frame->GetPlaneMemoryInfo(0)->m_planePtr; surface.Data.UV = frame->GetPlaneMemoryInfo(1)->m_planePtr; surface.Data.PitchHigh = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch / (1 << 16)); surface.Data.PitchLow = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch % (1 << 16)); break; case UMC::YUV420: surface.Data.Y = frame->GetPlaneMemoryInfo(0)->m_planePtr; surface.Data.U = frame->GetPlaneMemoryInfo(1)->m_planePtr; surface.Data.V = frame->GetPlaneMemoryInfo(2)->m_planePtr; surface.Data.PitchHigh = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch / (1 << 16)); surface.Data.PitchLow = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch % (1 << 16)); break; case UMC::IMC3: surface.Data.Y = frame->GetPlaneMemoryInfo(0)->m_planePtr; surface.Data.U = frame->GetPlaneMemoryInfo(1)->m_planePtr; surface.Data.V = frame->GetPlaneMemoryInfo(2)->m_planePtr; surface.Data.PitchHigh = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch / (1 << 16)); surface.Data.PitchLow = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch % (1 << 16)); break; case UMC::RGB32: surface.Data.B = frame->GetPlaneMemoryInfo(0)->m_planePtr; surface.Data.G = surface.Data.B + 1; surface.Data.R = surface.Data.B + 2; surface.Data.A = surface.Data.B + 3; surface.Data.PitchHigh = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch / (1 << 16)); surface.Data.PitchLow = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch % (1 << 16)); break; case UMC::YUY2: surface.Data.Y = frame->GetPlaneMemoryInfo(0)->m_planePtr; surface.Data.U = surface.Data.Y + 1; surface.Data.V = surface.Data.Y + 3; surface.Data.PitchHigh = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch / (1 << 16)); surface.Data.PitchLow = (mfxU16)(frame->GetPlaneMemoryInfo(0)->m_pitch % (1 << 16)); break; default: return MFX_ERR_UNSUPPORTED; } surface.Info.FourCC = surface_work->Info.FourCC; surface.Info.Shift = m_IsUseExternalFrames ? m_extSurfaces[index].FrameSurface->Info.Shift : m_frameDataInternal.GetSurface(index).Info.Shift; //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCore->DoFastCopyWrapper(surface_work, dstMemType, &surface, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_SYSTEM_MEMORY, gpuCopyMode); guard.Lock(); MFX_CHECK_STS(sts); if (!m_IsUseExternalFrames) { mfxStatus temp_sts = m_pCore->DecreaseReference(&surface_work->Data); if (temp_sts < MFX_ERR_NONE && sts >= MFX_ERR_NONE) { sts = temp_sts; } m_extSurfaces[index].FrameSurface = 0; } return sts; } SurfaceSource::SurfaceSource(VideoCORE* core, const mfxVideoParam& video_param, eMFXPlatform platform, mfxFrameAllocRequest& request, mfxFrameAllocRequest& request_internal, mfxFrameAllocResponse& response, mfxFrameAllocResponse& response_alien, bool needVppJPEG) : m_core(core) , m_response(response) , m_response_alien(response_alien) { MFX_CHECK_WITH_THROW_STS(m_core, MFX_ERR_NULL_PTR); m_response = {}; // Since DECODE uses internal allocation at init step (when we can't actually understand whether user will use // VPL interface or not) we are forcing 1.x interface in case if ext allocator set bool vpl_interface = SupportsVPLFeatureSet(*m_core); m_redirect_to_vpl_path = vpl_interface && !m_core->IsExternalFrameAllocator(); if (m_redirect_to_vpl_path) { auto dec_postprocessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(video_param.ExtParam, video_param.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxFrameInfo output_info = needVppJPEG ? request_internal.Info : request.Info; mfxU16 request_type = request.Type; mfxFrameInfo request_info = request.Info; if (dec_postprocessing) { output_info.FourCC = dec_postprocessing->Out.FourCC; output_info.ChromaFormat = dec_postprocessing->Out.ChromaFormat; output_info.Width = dec_postprocessing->Out.Width; output_info.Height = dec_postprocessing->Out.Height; output_info.CropX = dec_postprocessing->Out.CropX; output_info.CropY = dec_postprocessing->Out.CropY; output_info.CropW = dec_postprocessing->Out.CropW; output_info.CropH = dec_postprocessing->Out.CropH; } mfxU16 output_type = MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_FROM_DECODE; output_type |= (video_param.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET; auto base_core_vpl = dynamic_cast(m_core); MFX_CHECK_WITH_THROW_STS(base_core_vpl, MFX_ERR_UNSUPPORTED); if ((request.Type & MFX_MEMTYPE_INTERNAL_FRAME) || needVppJPEG) { request = request_internal; } std::unique_ptr scoped_cache_ptr(SurfaceCache::Create(*base_core_vpl, request.Type, request.Info)); m_vpl_cache_decoder_surfaces.reset(new surface_cache_controller(scoped_cache_ptr.get(), ComponentType::DECODE)); scoped_cache_ptr.release(); m_sw_fallback_sys_mem = (MFX_PLATFORM_SOFTWARE == platform) && (video_param.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY); m_need_to_copy_before_output = // SW / HW config mismatch between decoder impl and requested IOPattern ((MFX_PLATFORM_SOFTWARE == platform) ? (video_param.IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) : (video_param.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) || needVppJPEG; m_allocate_internal = m_need_to_copy_before_output // SFC requested on Linux (Windows uses SFC surfaces as decoders work surface directly) || (dec_postprocessing && m_core->GetVAType() == MFX_HW_VAAPI); if (!m_allocate_internal) { // We simply use the same surfaces m_vpl_cache_output_surfaces = m_vpl_cache_decoder_surfaces; } else { scoped_cache_ptr.reset(SurfaceCache::Create(*base_core_vpl, needVppJPEG ? request_type : output_type, needVppJPEG ? request_info : output_info)); m_vpl_cache_output_surfaces.reset(new surface_cache_controller(scoped_cache_ptr.get(), ComponentType::DECODE)); scoped_cache_ptr.release(); } mfxSession session = m_core->GetSession(); MFX_CHECK_WITH_THROW_STS(session, MFX_ERR_INVALID_HANDLE); mfxStatus sts = m_vpl_cache_output_surfaces->SetupCache(session, video_param); MFX_CHECK_WITH_THROW_STS(sts == MFX_ERR_NONE, sts); mfxU32 bit_depth = BitDepthFromFourcc(video_param.mfx.FrameInfo.FourCC); UMC::ColorFormat color_format; switch (video_param.mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: color_format = UMC::NV12; break; case MFX_FOURCC_P010: color_format = UMC::NV12; break; case MFX_FOURCC_NV16: color_format = UMC::NV16; break; case MFX_FOURCC_P210: color_format = UMC::NV16; break; case MFX_FOURCC_RGB4: color_format = UMC::RGB32; break; case MFX_FOURCC_YV12: color_format = UMC::YUV420; break; case MFX_FOURCC_YUY2: color_format = UMC::YUY2; break; case MFX_FOURCC_AYUV: color_format = UMC::AYUV; break; case MFX_FOURCC_Y210: color_format = UMC::Y210; break; case MFX_FOURCC_Y410: color_format = UMC::Y410; break; case MFX_FOURCC_P016: color_format = UMC::P016; break; case MFX_FOURCC_Y216: color_format = UMC::Y216; break; case MFX_FOURCC_Y416: color_format = UMC::Y416; break; default: MFX_CHECK_WITH_THROW_STS(false, MFX_ERR_UNSUPPORTED); } UMC::Status umcSts = m_video_data_info.Init(request.Info.Width, request.Info.Height, color_format, bit_depth); MFX_CHECK_WITH_THROW_STS(ConvertStatusUmc2Mfx(umcSts) == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); } else { CreateUMCAllocator(video_param, platform, needVppJPEG); MFX_CHECK_WITH_THROW_STS(m_umc_allocator_adapter.get(), MFX_ERR_INVALID_HANDLE); bool useInternal = request.Type & MFX_MEMTYPE_INTERNAL_FRAME; mfxStatus mfxSts = MFX_ERR_NONE; if (platform != MFX_PLATFORM_SOFTWARE && !useInternal) { request.AllocId = video_param.AllocId; mfxSts = m_core->AllocFrames(&request, &m_response, false); } MFX_CHECK_WITH_THROW_STS(mfxSts >= MFX_ERR_NONE, mfxSts); useInternal |= needVppJPEG; // allocates internal surfaces: if (useInternal) { request = request_internal; bool useSystem = needVppJPEG ? video_param.IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY : true; mfxSts = m_core->AllocFrames(&request_internal, &m_response, useSystem); MFX_CHECK_WITH_THROW_STS(mfxSts >= MFX_ERR_NONE, mfxSts); UMC::Status umcSts = m_umc_allocator_adapter->InitMfx(0, m_core, &video_param, &request, &m_response, !useInternal, platform == MFX_PLATFORM_SOFTWARE); MFX_CHECK_WITH_THROW_STS(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); } else { UMC::Status umcSts = m_umc_allocator_adapter->InitMfx(0, m_core, &video_param, &request, &m_response, !useInternal, platform == MFX_PLATFORM_SOFTWARE); MFX_CHECK_WITH_THROW_STS(umcSts == UMC::UMC_OK, MFX_ERR_MEMORY_ALLOC); m_umc_allocator_adapter->SetExternalFramesResponse(&m_response); } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if ((mfxExtDecVideoProcessing *)GetExtendedBuffer(video_param.ExtParam, video_param.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING)) { MFX_CHECK_WITH_THROW_STS(useInternal || MFX_HW_D3D11 == m_core->GetVAType() || MFX_HW_VAAPI == m_core->GetVAType(), MFX_ERR_UNSUPPORTED); m_umc_allocator_adapter->SetSfcPostProcessingFlag(true); } #endif } } void SurfaceSource::CreateUMCAllocator(const mfxVideoParam & video_param, eMFXPlatform platform, bool needVppJPEG) { (void) needVppJPEG; if (MFX_PLATFORM_SOFTWARE == platform) { #ifdef MFX_ENABLE_JPEG_SW_FALLBACK MFX_CHECK_WITH_THROW_STS(video_param.mfx.CodecId == MFX_CODEC_JPEG, MFX_ERR_UNSUPPORTED); m_umc_allocator_adapter.reset(new mfx_UMC_FrameAllocator()); #else MFX_CHECK_WITH_THROW_STS(false, MFX_ERR_UNSUPPORTED); #endif } else { switch (video_param.mfx.CodecId) { case MFX_CODEC_VC1: #if defined(MFX_ENABLE_VC1_VIDEO_DECODE) if (MFX_ERR_NONE == m_core->IsGuidSupported(sDXVA2_Intel_ModeVC1_D_Super, const_cast(&video_param))) m_umc_allocator_adapter.reset(new mfx_UMC_FrameAllocator_D3D()); #endif // #if defined(MFX_ENABLE_VC1_VIDEO_DECODE) break; case MFX_CODEC_JPEG: #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) if (!needVppJPEG) m_umc_allocator_adapter.reset(new mfx_UMC_FrameAllocator_D3D()); #if defined (MFX_ENABLE_VPP) else m_umc_allocator_adapter.reset(new mfx_UMC_FrameAllocator_D3D_Converter()); #endif #endif // defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) break; default: m_umc_allocator_adapter.reset(new mfx_UMC_FrameAllocator_D3D()); } } } SurfaceSource::~SurfaceSource() { std::ignore = MFX_STS_TRACE(ConvertStatusUmc2Mfx(Close())); } void SurfaceSource::ReleaseCurrentWorkSurface() { // Release previously set surface if it wasn't taken by decoder if (m_current_work_surface && m_allocate_internal) { if (!m_need_to_copy_before_output) { RemoveCorrespondence(*m_current_work_surface); } std::ignore = MFX_STS_TRACE(ReleaseSurface(*m_current_work_surface)); } } // Closes object and releases all allocated memory UMC::Status SurfaceSource::Close() { MFX_CHECK( m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); ReleaseCurrentWorkSurface(); m_vpl_cache_decoder_surfaces.reset(); m_vpl_cache_output_surfaces.reset(); m_mfx2umc_memid.clear(); m_umc2mfx_memid.clear(); m_umc2framedata.clear(); m_work_output_surface_map.clear(); m_output_work_surface_map.clear(); m_sw_fallback_surfaces.clear(); return UMC::UMC_OK; } else { UMC::Status sts = m_umc_allocator_adapter->Close(); if (m_response.NumFrameActual) std::ignore = MFX_STS_TRACE(m_core->FreeFrames(&m_response)); if (m_response_alien.NumFrameActual) std::ignore = MFX_STS_TRACE(m_core->FreeFrames(&m_response_alien)); m_umc_allocator_adapter.reset(); return sts; } } UMC::Status SurfaceSource::Reset() { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); ReleaseCurrentWorkSurface(); m_mfx2umc_memid.clear(); m_umc2mfx_memid.clear(); m_umc2framedata.clear(); m_work_output_surface_map.clear(); m_output_work_surface_map.clear(); m_sw_fallback_surfaces.clear(); m_current_work_surface = nullptr; return UMC::UMC_OK; } else { return m_umc_allocator_adapter->Reset(); } } void SurfaceSource::CreateBinding(const mfxFrameSurface1 & surf) { if (m_mfx2umc_memid.find(surf.Data.MemId) != std::end(m_mfx2umc_memid)) RemoveBinding(surf); UMC::FrameMemID mid_to_insert = 0; for (; m_umc2mfx_memid.find(mid_to_insert) != std::end(m_umc2mfx_memid); ++mid_to_insert) {} m_mfx2umc_memid.insert({ surf.Data.MemId, mid_to_insert }); m_umc2mfx_memid.insert({ mid_to_insert, surf.Data.MemId }); } void SurfaceSource::RemoveBinding(const mfxFrameSurface1 & surf) { auto it = m_mfx2umc_memid.find(surf.Data.MemId); if (it == std::end(m_mfx2umc_memid)) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_FOUND); return; } m_umc2mfx_memid.erase(it->second); m_umc2framedata.erase(it->second); m_mfx2umc_memid.erase(it); } mfxFrameSurface1* SurfaceSource::GetDecoderSurface(UMC::FrameMemID index) { auto it = m_umc2mfx_memid.find(index); if (it == std::end(m_umc2mfx_memid)) { std::ignore = MFX_STS_TRACE(MFX_ERR_INVALID_HANDLE); return nullptr; } mfxFrameSurface1* surf = (*m_vpl_cache_decoder_surfaces)->FindSurface(it->second); if (m_sw_fallback_sys_mem) { if (index >= (UMC::FrameMemID)m_sw_fallback_surfaces.size()) { std::ignore = MFX_STS_TRACE(MFX_ERR_INVALID_HANDLE); return nullptr; } surf = m_sw_fallback_surfaces[index]; } return surf; } UMC::Status SurfaceSource::CheckForRealloc(const UMC::VideoDataInfo & info, const mfxFrameSurface1& surf, bool realloc_allowed) const { bool realloc_required = info.GetWidth() > surf.Info.Width || info.GetHeight() > surf.Info.Height; MFX_CHECK(!realloc_required, realloc_allowed ? UMC::UMC_ERR_NOT_ENOUGH_BUFFER : UMC::UMC_ERR_UNSUPPORTED); return UMC::UMC_OK; } static inline mfxMemId GetIdentifier(const mfxFrameSurface1& surf) { return surf.Data.MemId ? surf.Data.MemId : mfxMemId(&surf); } bool SurfaceSource::CreateCorrespondence(mfxFrameSurface1& surface_work, mfxFrameSurface1& surface_out) { if (m_work_output_surface_map.find(surface_work.Data.MemId) != std::end(m_work_output_surface_map)) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); return false; } if (m_output_work_surface_map.find(GetIdentifier(surface_out)) != std::end(m_output_work_surface_map)) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); return false; } // AddRef and ++Data.Locked if (MFX_STS_TRACE(m_core->IncreaseReference(surface_out)) != MFX_ERR_NONE) return false; m_work_output_surface_map.insert({ surface_work.Data.MemId, &surface_out }); m_output_work_surface_map.insert({ GetIdentifier(surface_out), &surface_work }); return true; } void SurfaceSource::RemoveCorrespondence(mfxFrameSurface1& surface_work) { if (!m_allocate_internal) return; auto it_wo = m_work_output_surface_map.find(surface_work.Data.MemId); if (it_wo == std::end(m_work_output_surface_map)) { return; } mfxFrameSurface1* output_surface = it_wo->second; if (!output_surface) { std::ignore = MFX_STS_TRACE(MFX_ERR_NULL_PTR); return; } m_work_output_surface_map.erase(it_wo); m_output_work_surface_map.erase(GetIdentifier(*output_surface)); // Release and --Data.Locked std::ignore = MFX_STS_TRACE(m_core->DecreaseReference(*output_surface)); } UMC::Status SurfaceSource::Alloc(UMC::FrameMemID *pNewMemID, const UMC::VideoDataInfo * info, uint32_t Flags) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK(pNewMemID, UMC::UMC_ERR_NULL_PTR); mfxStatus sts; if (m_current_work_surface) { // MSDK 2.0 memory model 2, returning work surface auto it = m_mfx2umc_memid.find(m_current_work_surface->Data.MemId); MFX_CHECK(it != std::end(m_mfx2umc_memid), UMC::UMC_ERR_FAILED); *pNewMemID = it->second; if (m_allocate_internal && !m_need_to_copy_before_output) { // SFC on Linux auto it_wo = m_work_output_surface_map.find(m_current_work_surface->Data.MemId); MFX_CHECK(it_wo != std::end(m_work_output_surface_map), UMC::UMC_ERR_FAILED); sts = SetSurfaceForSFC(*m_core, *(it_wo->second)); MFX_CHECK(sts == MFX_ERR_NONE, UMC::UMC_ERR_FAILED); } const mfxFrameSurface1 & tmp_surf = *m_current_work_surface; // Drop current state, then next alloc will result in ERR_MORE_SURFACE m_current_work_surface = nullptr; return CheckForRealloc(*info, tmp_surf, Flags & mfx_UMC_ReallocAllowed); } // In MSDK 2.0 memory model 2 we don't allocate missing frames on the fly if (m_memory_model2) { *pNewMemID = UMC::FRAME_MID_INVALID; return UMC::UMC_ERR_ALLOC; } // MSDK 2.0 memory model 3, allocating and returning new work surface using namespace std::chrono; auto cache_timeout = (*m_vpl_cache_decoder_surfaces)->GetTimeout(); // Start timer if first entry to Alloc and timeout option passed on Init if (!m_timer.IsRunnig() && cache_timeout != 0ms) { m_timer.Reset(cache_timeout); } // Check if timer already expired if (m_timer.IsRunnig()) { if (m_timer.Expired()) { *pNewMemID = UMC::FRAME_MID_INVALID; MFX_RETURN(UMC::UMC_ERR_ALLOC); } cache_timeout = m_timer.Left(); } mfxFrameSurface1* surf = nullptr; // If timer wasn't set (i.e. cache hints buffer wasn't attached) cache timeout below would be zero (i.e. no waiting for free surface) sts = (*m_vpl_cache_decoder_surfaces)->GetSurface(surf, cache_timeout, true); MFX_CHECK(sts == MFX_ERR_NONE, UMC::UMC_ERR_ALLOC); if (m_sw_fallback_sys_mem) { /* In case of sw fallback and sys mem we can have no ext allocator. In this case we can't manage surface through surface cache. Instead we will manage them through m_sw_fallback_surfaces. */ m_sw_fallback_surfaces.push_back(surf); } if (m_allocate_internal && !m_need_to_copy_before_output) { // SFC on Linux mfxFrameSurface1* output_surface = nullptr; sts = (*m_vpl_cache_output_surfaces)->GetSurface(output_surface, true); MFX_CHECK(sts == MFX_ERR_NONE, UMC::UMC_ERR_ALLOC); // RAII lock to drop refcount in case of error surface_refcount_scoped_lock output_surf_scoped_lock(output_surface); MFX_CHECK(CreateCorrespondence(*surf, *output_surface), UMC::UMC_ERR_FAILED); sts = SetSurfaceForSFC(*m_core, *output_surface); MFX_CHECK(sts == MFX_ERR_NONE, UMC::UMC_ERR_FAILED); output_surf_scoped_lock.release(); } CreateBinding(*surf); *pNewMemID = m_mfx2umc_memid[surf->Data.MemId]; return CheckForRealloc(*info, *surf, Flags & mfx_UMC_ReallocAllowed); } else { return m_umc_allocator_adapter->Alloc(pNewMemID, info, Flags); } } UMC::Status SurfaceSource::GetFrameHandle(UMC::FrameMemID MID, void * handle) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); auto it = m_umc2mfx_memid.find(MID); MFX_CHECK(it != std::end(m_umc2mfx_memid), MFX_ERR_INVALID_HANDLE); return ConvertStatusMfx2Umc(MFX_STS_TRACE(m_core->GetFrameHDL(it->second, reinterpret_cast(handle), false))); } else { return m_umc_allocator_adapter->GetFrameHandle(MID, handle); } } const UMC::FrameData* SurfaceSource::Lock(UMC::FrameMemID MID) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* surf = GetDecoderSurface(MID); if (!surf) { std::ignore = MFX_STS_TRACE(MFX_ERR_INVALID_HANDLE); return nullptr; } auto base_core_vpl = dynamic_cast(m_core); if (!base_core_vpl) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } auto sts_was_locked_pair = base_core_vpl->Lock(*surf, MFX_MAP_READ_WRITE); if (MFX_STS_TRACE(sts_was_locked_pair.first) != MFX_ERR_NONE) { return nullptr; } auto it_framedata = m_umc2framedata.find(MID); if (it_framedata == std::end(m_umc2framedata)) { UMC::FrameData umc_frame_data; umc_frame_data.Init(&m_video_data_info, MID, this); std::tie(it_framedata, std::ignore) = m_umc2framedata.insert({ MID, umc_frame_data }); } UMC::FrameData& umc_frame_data = it_framedata->second; mfxU32 pitch = surf->Data.PitchLow + ((mfxU32)surf->Data.PitchHigh << 16); switch (umc_frame_data.GetInfo()->GetColorFormat()) { case UMC::NV16: case UMC::NV12: umc_frame_data.SetPlanePointer(surf->Data.Y, 0, pitch); umc_frame_data.SetPlanePointer(surf->Data.U, 1, pitch); break; case UMC::YUV420: case UMC::YUV422: umc_frame_data.SetPlanePointer(surf->Data.Y, 0, pitch); umc_frame_data.SetPlanePointer(surf->Data.U, 1, pitch >> 1); umc_frame_data.SetPlanePointer(surf->Data.V, 2, pitch >> 1); break; case UMC::IMC3: umc_frame_data.SetPlanePointer(surf->Data.Y, 0, pitch); umc_frame_data.SetPlanePointer(surf->Data.U, 1, pitch); umc_frame_data.SetPlanePointer(surf->Data.V, 2, pitch); break; case UMC::RGB32: { umc_frame_data.SetPlanePointer(surf->Data.B, 0, pitch); } break; case UMC::YUY2: { umc_frame_data.SetPlanePointer(surf->Data.Y, 0, pitch); } break; default: std::ignore = MFX_STS_TRACE(base_core_vpl->Unlock(*surf)); return nullptr; } return &umc_frame_data; } else { return m_umc_allocator_adapter->Lock(MID); } } UMC::Status SurfaceSource::Unlock(UMC::FrameMemID MID) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* surf = GetDecoderSurface(MID); MFX_CHECK(surf, UMC::UMC_ERR_NULL_PTR); auto base_core_vpl = dynamic_cast(m_core); MFX_CHECK(base_core_vpl, UMC::UMC_ERR_NULL_PTR); return ConvertStatusMfx2Umc(MFX_STS_TRACE(base_core_vpl->Unlock(*surf))); } else { return m_umc_allocator_adapter->Unlock(MID); } } UMC::Status SurfaceSource::IncreaseReference(UMC::FrameMemID MID) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* surf = GetDecoderSurface(MID); MFX_CHECK(surf, UMC::UMC_ERR_NULL_PTR); return ConvertStatusMfx2Umc(MFX_STS_TRACE(AddRefSurface(*surf, true))); } else { return m_umc_allocator_adapter->IncreaseReference(MID); } } UMC::Status SurfaceSource::DecreaseReference(UMC::FrameMemID MID) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* surf = GetDecoderSurface(MID); MFX_CHECK(surf, UMC::UMC_ERR_NULL_PTR); if (surf->FrameInterface && surf->FrameInterface->GetRefCounter) { mfxU32 counter = 0; MFX_CHECK(surf->FrameInterface->GetRefCounter(surf, &counter) == MFX_ERR_NONE, UMC::UMC_ERR_FAILED); if (counter == 2) RemoveCorrespondence(*surf); } return ConvertStatusMfx2Umc(MFX_STS_TRACE(ReleaseSurface(*surf, true))); } else { return m_umc_allocator_adapter->DecreaseReference(MID); } } mfxI32 SurfaceSource::FindSurface(mfxFrameSurface1 *surf) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return -1; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return -1; } if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); if (!surf) { std::ignore = MFX_STS_TRACE(MFX_ERR_NULL_PTR); return -1; } auto it = m_mfx2umc_memid.find(GetIdentifier(*surf)); if (it == std::end(m_mfx2umc_memid)) { // First try to find corresponding decoder work surface (case of internal allocation) auto it_ws = m_output_work_surface_map.find(GetIdentifier(*surf)); if (it_ws == std::end(m_output_work_surface_map) || (it = m_mfx2umc_memid.find(it_ws->second->Data.MemId)) == std::end(m_mfx2umc_memid)) { std::ignore = MFX_STS_TRACE(MFX_ERR_INVALID_HANDLE); return -1; } } return it->second; } else { return m_umc_allocator_adapter->FindSurface(surf); } } mfxFrameSurface1* SurfaceSource::GetInternalSurface(mfxFrameSurface1* sfc_surf) { auto decSurfIt = m_output_work_surface_map.find(sfc_surf->Data.MemId); if (decSurfIt == std::end(m_output_work_surface_map)) { return nullptr; } return decSurfIt->second; } mfxStatus SurfaceSource::SetCurrentMFXSurface(mfxFrameSurface1 *surf) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); // Stop the timer on new DecodeFrameAsync call m_timer.Stop(); m_memory_model2 = surf != nullptr; if (!surf) return MFX_ERR_NONE; MFX_CHECK(surf->Data.Locked == 0, MFX_ERR_MORE_SURFACE); MFX_SAFE_CALL(m_vpl_cache_output_surfaces->Update(*surf)); // Memory model 2, non-null work surface passed // If we try to set the same surface twice in a row, do nothing auto it = m_output_work_surface_map.find(GetIdentifier(*surf)); if (m_current_work_surface && (m_current_work_surface->Data.MemId == surf->Data.MemId || (it != std::end(m_output_work_surface_map) && it->second->Data.MemId == m_current_work_surface->Data.MemId))) return MFX_ERR_NONE; if (m_allocate_internal) { // Create internal surface mfxFrameSurface1* internal_surf = nullptr; MFX_SAFE_CALL((*m_vpl_cache_decoder_surfaces)->GetSurface(internal_surf, true)); MFX_CHECK_NULL_PTR1(internal_surf); // RAII lock to drop refcount in case of error surface_refcount_scoped_lock internal_surf_scoped_lock(internal_surf); if (!m_need_to_copy_before_output) { // SFC Linux MFX_CHECK(CreateCorrespondence(*internal_surf, *surf), MFX_ERR_UNKNOWN); } // Drop RAII lock and proceed with internal surface surf = internal_surf_scoped_lock.release(); } CreateBinding(*surf); if (m_sw_fallback_sys_mem) { /* In case of sw fallback and sys mem we can have no ext allocator. In this case we can't manage surface through surface cache. Instead we will manage them through m_sw_fallback_surfaces. */ m_sw_fallback_surfaces.push_back(surf); } ReleaseCurrentWorkSurface(); m_current_work_surface = surf; return MFX_ERR_NONE; } else { return m_umc_allocator_adapter->SetCurrentMFXSurface(surf); } } mfxFrameSurface1 * SurfaceSource::GetSurface(UMC::FrameMemID index, mfxFrameSurface1 *surface, const mfxVideoParam * videoPar) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* work_surf = GetDecoderSurface(index); if (!work_surf) { std::ignore = MFX_STS_TRACE(MFX_ERR_NULL_PTR); return nullptr; } if (!m_allocate_internal) { // HW memory std::ignore = MFX_STS_TRACE(AddRefSurface(*work_surf, true)); return work_surf; } auto it_wo = m_work_output_surface_map.find(work_surf->Data.MemId); if (!m_need_to_copy_before_output) { // SFC Linux if (it_wo == std::end(m_work_output_surface_map)) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_FOUND); return nullptr; } std::ignore = MFX_STS_TRACE(AddRefSurface(*(it_wo->second), true)); return it_wo->second; } // SW surfaces if (!surface) { // Model 3: null work_surface passed by user // Allocate SW output surface here mfxStatus sts = (*m_vpl_cache_output_surfaces)->GetSurface(surface, true); if (MFX_STS_TRACE(sts) != MFX_ERR_NONE) { return nullptr; } if (!surface) { std::ignore = MFX_STS_TRACE(MFX_ERR_NULL_PTR); return nullptr; } } std::ignore = MFX_STS_TRACE(AddRefSurface(*surface, true)); if (it_wo == std::end(m_work_output_surface_map)) { // Create mapping between HW <-> SW surfaces if (!CreateCorrespondence(*work_surf, *surface)) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); return nullptr; } } else { // Both decoder's and output surfaces already in use if (m_output_work_surface_skip_frames.find(surface) != std::end(m_output_work_surface_skip_frames) || it_wo->second == surface) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); return nullptr; } /* Decoder's surface already in use but output surface is new one. Current frame is skip frame and use previous work surface but new user surface */ if (m_core->IncreaseReference(*surface) != MFX_ERR_NONE) { std::ignore = MFX_STS_TRACE(MFX_ERR_UNKNOWN); return nullptr; } /* Output surface mapped on work surface wich is already in m_work_output_surface_map. It is possible in case of skip frame. So, can't use m_work_output_surface_map and use m_output_work_surface_skip_frames instead */ m_output_work_surface_skip_frames.insert({ surface, work_surf }); } return surface; } else { return m_umc_allocator_adapter->GetSurface(index, surface, videoPar); } } mfxFrameSurface1 * SurfaceSource::GetInternalSurface(UMC::FrameMemID index) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (m_redirect_to_vpl_path) { if (!m_allocate_internal) return nullptr; return GetSurfaceByIndex(index); } else { return m_umc_allocator_adapter->GetInternalSurface(index); } } mfxStatus SurfaceSource::GetSurface(mfxFrameSurface1* & surface) { MFX_CHECK(m_redirect_to_vpl_path, MFX_ERR_UNSUPPORTED); MFX_CHECK(m_vpl_cache_output_surfaces, MFX_ERR_NOT_INITIALIZED); return (*m_vpl_cache_output_surfaces)->GetSurface(surface); } mfxFrameSurface1 * SurfaceSource::GetSurfaceByIndex(UMC::FrameMemID index) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return nullptr; } if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxFrameSurface1* surf = GetDecoderSurface(index); return surf; } else { return m_umc_allocator_adapter->GetSurfaceByIndex(index); } } mfxStatus SurfaceSource::PrepareToOutput(mfxFrameSurface1 *surface_out, UMC::FrameMemID index, const mfxVideoParam * videoPar, mfxU32 gpuCopyMode) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { MFX_CHECK_NULL_PTR1(surface_out); UMC::AutomaticUMCMutex guard(m_guard); if (m_allocate_internal && m_need_to_copy_before_output) { std::unique_ptr> srcSurface; auto it = m_output_work_surface_map.find(GetIdentifier(*surface_out)); if (it != std::end(m_output_work_surface_map)) { srcSurface = std::unique_ptr>(it->second, [this](mfxFrameSurface1* surf) {RemoveCorrespondence(*surf);}); } else // One decoder's surface used for several output surfaces (skip frame case) { auto itSkipFrame = m_output_work_surface_skip_frames.find(surface_out); MFX_CHECK(itSkipFrame != std::end(m_output_work_surface_skip_frames), MFX_ERR_NOT_FOUND); srcSurface = std::unique_ptr>(itSkipFrame->second, [&surface_out, this](mfxFrameSurface1*) { // Need to decrease output surface ref count after m_core->DoFastCopyWrapper std::ignore = MFX_STS_TRACE(m_core->DecreaseReference(*surface_out)); }); m_output_work_surface_skip_frames.erase(itSkipFrame); } MFX_SAFE_CALL(m_core->DoFastCopyWrapper(surface_out, // When this is user provided SW memory surface it might not have correct type set surface_out->Data.MemType ? surface_out->Data.MemType : MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_SYSTEM_MEMORY, srcSurface.get(), srcSurface->Data.MemType, gpuCopyMode )); } return MFX_ERR_NONE; } else { return m_umc_allocator_adapter->PrepareToOutput(surface_out, index, videoPar, gpuCopyMode); } } bool SurfaceSource::HasFreeSurface() { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return false; } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); return false; } if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); return (m_memory_model2 && !m_need_to_copy_before_output) ? (m_current_work_surface != nullptr) : true; } else { return m_umc_allocator_adapter->HasFreeSurface(); } } void SurfaceSource::SetFreeSurfaceAllowedFlag(bool flag) { if (m_redirect_to_vpl_path != !!m_vpl_cache_decoder_surfaces) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); } if (!m_redirect_to_vpl_path != !!m_umc_allocator_adapter) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); } if (m_redirect_to_vpl_path) { std::ignore = MFX_STS_TRACE(MFX_ERR_NOT_INITIALIZED); } else { m_umc_allocator_adapter->SetSfcPostProcessingFlag(flag); } } // D3D functionality // we should copy to external SW surface mfxStatus mfx_UMC_FrameAllocator_D3D::PrepareToOutput(mfxFrameSurface1 *surface_work, UMC::FrameMemID index, const mfxVideoParam *, mfxU32 gpuCopyMode) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; mfxMemId memInternal = m_frameDataInternal.GetSurface(index).Data.MemId; mfxMemId memId = m_pCore->MapIdx(memInternal); if ((surface_work->Data.MemId)&& (surface_work->Data.MemId == memId)) { mfxHDLPair surfHDLExt = {}; mfxHDLPair surfHDLInt = {}; MFX_CHECK_STS(m_pCore->GetExternalFrameHDL(surface_work->Data.MemId, &surfHDLExt.first, false)); MFX_CHECK_STS(m_pCore->GetFrameHDL(memId, &surfHDLInt.first, false)); if (surfHDLExt.first == surfHDLInt.first && surfHDLExt.second == surfHDLInt.second) // The same frame. No need to do anything return MFX_ERR_NONE; } if (!m_sfcVideoPostProcessing) { mfxFrameSurface1 & internalSurf = m_frameDataInternal.GetSurface(index); mfxFrameSurface1 surface = MakeSurface(internalSurf.Info, internalSurf.Data.MemId); mfxU16 outMemType = static_cast((m_IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY ? MFX_MEMTYPE_SYSTEM_MEMORY : MFX_MEMTYPE_DXVA2_DECODER_TARGET) | MFX_MEMTYPE_EXTERNAL_FRAME); //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCore->DoFastCopyWrapper(surface_work, outMemType, &surface, MFX_MEMTYPE_INTERNAL_FRAME | MFX_MEMTYPE_DXVA2_DECODER_TARGET, gpuCopyMode ); guard.Lock(); MFX_CHECK_STS(sts); } if (!m_IsUseExternalFrames) { if (!m_sfcVideoPostProcessing) { m_pCore->DecreaseReference(&surface_work->Data); m_extSurfaces[index].FrameSurface = 0; } } return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/mfx_umc_mjpeg_vpp.cpp000066400000000000000000000472171443134507600272160ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_common.h" #include "libmfx_core.h" #include "mfx_common_int.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "mfx_vpp_jpeg.h" UMC::Status mfx_UMC_FrameAllocator_D3D_Converter::InitMfx(UMC::FrameAllocatorParams *, VideoCORE* mfxCore, const mfxVideoParam *params, const mfxFrameAllocRequest *request, mfxFrameAllocResponse *response, bool isUseExternalFrames, bool isSWplatform) { UMC::AutomaticUMCMutex guard(m_guard); m_isSWDecode = isSWplatform; if (!mfxCore || !params) return UMC::UMC_ERR_NULL_PTR; if (!isUseExternalFrames && (!request || !response)) return UMC::UMC_ERR_NULL_PTR; m_pCore = mfxCore; m_IsUseExternalFrames = isUseExternalFrames; UMC::ColorFormat color_format; switch (params->mfx.FrameInfo.FourCC) { case MFX_FOURCC_NV12: color_format = UMC::NV12; break; case MFX_FOURCC_RGB4: color_format = UMC::RGB32; break; //case MFX_FOURCC_YV12: // color_format = UMC::YUV420; // break; case MFX_FOURCC_YUV400: color_format = UMC::GRAY; break; case MFX_FOURCC_IMC3: color_format = UMC::IMC3; break; case MFX_FOURCC_YUV422H: case MFX_FOURCC_YUV422V: color_format = UMC::YUV422; break; case MFX_FOURCC_YUV444: color_format = UMC::YUV444; break; case MFX_FOURCC_YUV411: color_format = UMC::YUV411; break; case MFX_FOURCC_BGRP: color_format = UMC::YUV444; break; case MFX_FOURCC_RGBP: color_format = UMC::YUV444; break; case MFX_FOURCC_YUY2: color_format = UMC::YUY2; break; default: return UMC::UMC_ERR_UNSUPPORTED; } UMC::Status umcSts = m_info.Init(params->mfx.FrameInfo.Width, params->mfx.FrameInfo.Height, color_format, 8); m_surface_info = params->mfx.FrameInfo; if (umcSts != UMC::UMC_OK) return umcSts; if (!m_IsUseExternalFrames || !m_isSWDecode) { m_frameDataInternal.Resize(response->NumFrameActual); m_extSurfaces.resize(response->NumFrameActual); for (mfxU32 i = 0; i < response->NumFrameActual; i++) { mfxFrameSurface1 & surface = m_frameDataInternal.GetSurface(i); surface.Data.MemId = response->mids[i]; MFX_INTERNAL_CPY(&surface.Info, &request->Info, sizeof(mfxFrameInfo)); // fill UMC frameData UMC::FrameData& frameData = m_frameDataInternal.GetFrameData(i); // set correct width & height to planes frameData.Init(&m_info, (UMC::FrameMemID)i, this); } } return UMC::UMC_OK; } UMC::Status mfx_UMC_FrameAllocator_D3D_Converter::Reset() { m_pCc.reset(); return mfx_UMC_FrameAllocator_D3D::Reset(); } mfxStatus mfx_UMC_FrameAllocator_D3D_Converter::InitVideoVppJpeg(const mfxVideoParam *params) { bool useInternalMem = false; if(params->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) { useInternalMem = true; } m_pCc.reset(new VideoVppJpeg(m_pCore, useInternalMem)); mfxStatus mfxSts; if (params->mfx.Rotation == MFX_ROTATION_90 || params->mfx.Rotation == MFX_ROTATION_270) { mfxVideoParam localParams = *params; // Frame allocation is possible inside VideoVppJpeg::Init(). // Those frames must have width/height of target image, so the swapping. std::swap(localParams.mfx.FrameInfo.Width, localParams.mfx.FrameInfo.Height); std::swap(localParams.mfx.FrameInfo.CropW, localParams.mfx.FrameInfo.CropH); mfxSts = m_pCc->Init(&localParams); } else { mfxSts = m_pCc->Init(params); } MFX_CHECK_STS( mfxSts ); return mfxSts; } mfxStatus mfx_UMC_FrameAllocator_D3D_Converter::FindSurfaceByMemId(const UMC::FrameData* in, const mfxHDLPair &hdlPair, mfxFrameSurface1 &out_surface) { MFX_CHECK_NULL_PTR1(in); UMC::FrameMemID index = in->GetFrameMID(); mfxMemId memInter = m_frameDataInternal.GetSurface(index).Data.MemId; mfxMemId memId = m_pCore->MapIdx(memInter); // if memid of in is same as memid of surface_work, StartPreparingToOutput() must not be called MFX_CHECK_WITH_ASSERT(!hdlPair.first || hdlPair.first != memId, MFX_ERR_UNSUPPORTED); out_surface = m_frameDataInternal.GetSurface(index); return MFX_ERR_NONE; } mfxStatus mfx_UMC_FrameAllocator_D3D_Converter::StartPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam *par, mfxU16 *taskId) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; if (!m_pCc) { MFX_SAFE_CALL( InitVideoVppJpeg(par) ); } mfxHDLPair hdlPair; sts = m_pCore->GetExternalFrameHDL(surface_work->Data.MemId, (mfxHDL*)&hdlPair); if (sts == MFX_ERR_UNDEFINED_BEHAVIOR // nothing found by Get*FrameHDL() || sts == MFX_ERR_UNSUPPORTED) // Get*FrameHDL() does not support obtaining OS-specific handle { hdlPair.first = nullptr; } else { MFX_CHECK_STS(sts); } // for interlaced case, [0] is top and [1] is bottom; for progressive only [0] is used mfxFrameSurface1 srcSurface[2]; for (int i = 0; i < 1 + (surface_work->Info.PicStruct != MFX_PICSTRUCT_PROGRESSIVE); ++i) { MFX_SAFE_CALL( FindSurfaceByMemId(&in[i], hdlPair, srcSurface[i]) ); #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP /* JPEG standard does not support crops as it is done in AVC, so: - CropX and CropY are always 0, - CropW and CropH represents picture size for current frame (in case of rotation, surface_work has rotated CropW and CropH), - Width and Height represents surface allocation size (they are initialized in decoder Init and are correct). */ if (par->mfx.Rotation == MFX_ROTATION_90 || par->mfx.Rotation == MFX_ROTATION_270) { srcSurface[i].Info.CropW = surface_work->Info.CropH; srcSurface[i].Info.CropH = surface_work->Info.CropW; } else #endif // MFX_ENABLE_MJPEG_ROTATE_VPP { srcSurface[i].Info.CropW = surface_work->Info.CropW; srcSurface[i].Info.CropH = surface_work->Info.CropH; } if (surface_work->Info.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { srcSurface[i].Info.CropH /= 2; } } return par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE? m_pCc->BeginHwJpegProcessing(&srcSurface[0], surface_work, taskId) : m_pCc->BeginHwJpegProcessing(&srcSurface[0], &srcSurface[1], surface_work, taskId); } mfxStatus mfx_UMC_FrameAllocator_D3D_Converter::CheckPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 taskId) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK_NULL_PTR1(m_pCc); mfxStatus sts = m_pCc->QueryTaskRoutine(taskId); if (sts == MFX_TASK_BUSY) { return sts; } if (sts != MFX_TASK_DONE) return sts; if(par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) { UMC::FrameMemID index = in->GetFrameMID(); mfxFrameSurface1* pSrc = &m_frameDataInternal.GetSurface(index); //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCc->EndHwJpegProcessing(pSrc, surface_work); guard.Lock(); if (sts < MFX_ERR_NONE) return sts; if (!m_IsUseExternalFrames) { m_pCore->DecreaseReference(&surface_work->Data); m_extSurfaces[index].FrameSurface = 0; } } else { UMC::FrameMemID indexTop = in[0].GetFrameMID(); UMC::FrameMemID indexBottom = in[1].GetFrameMID(); mfxFrameSurface1 srcTop, srcBottom; srcTop = m_frameDataInternal.GetSurface(indexTop); srcBottom = m_frameDataInternal.GetSurface(indexBottom); //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCc->EndHwJpegProcessing(&srcTop, &srcBottom, surface_work); guard.Lock(); if (sts < MFX_ERR_NONE) return sts; if (!m_IsUseExternalFrames) { m_pCore->DecreaseReference(&surface_work->Data); m_extSurfaces[indexTop].FrameSurface = 0; } } return MFX_ERR_NONE; } void mfx_UMC_FrameAllocator_D3D_Converter::SetJPEGInfo(JPEG_Info * jpegInfo) { m_jpegInfo = *jpegInfo; } SurfaceSourceJPEG::SurfaceSourceJPEG(VideoCORE* core, const mfxVideoParam & video_param, eMFXPlatform platform, mfxFrameAllocRequest& request, mfxFrameAllocRequest& request_internal, mfxFrameAllocResponse& response, mfxFrameAllocResponse& response_alien) : SurfaceSource(core, video_param, platform, request, request_internal, response, response_alien, true) {} void SurfaceSourceJPEG::SetJPEGInfo(JPEG_Info * jpegInfo) { MFX_CHECK_WITH_THROW_STS(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK_WITH_THROW_STS(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); m_jpegInfo = *jpegInfo; } else { ((mfx_UMC_FrameAllocator_D3D_Converter*)m_umc_allocator_adapter.get())->SetJPEGInfo(jpegInfo); } } UMC::Status SurfaceSourceJPEG::Reset() { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, UMC::UMC_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, UMC::UMC_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); m_pCc.reset(); return SurfaceSource::Reset(); } else { return m_umc_allocator_adapter->Reset(); } } mfxStatus SurfaceSourceJPEG::InitVideoVppJpeg(const mfxVideoParam *params) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); bool isD3DToSys = params->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY; m_pCc.reset(new VideoVppJpeg(m_core, isD3DToSys)); if (params->mfx.Rotation == MFX_ROTATION_90 || params->mfx.Rotation == MFX_ROTATION_270) { mfxVideoParam localParams = *params; // Frame allocation is possible inside VideoVppJpeg::Init(). // Those frames must have width/height of target image, so do the swapping. std::swap(localParams.mfx.FrameInfo.Width, localParams.mfx.FrameInfo.Height); std::swap(localParams.mfx.FrameInfo.CropW, localParams.mfx.FrameInfo.CropH); return m_pCc->Init(&localParams); } return m_pCc->Init(params); } else { return ((mfx_UMC_FrameAllocator_D3D_Converter*)m_umc_allocator_adapter.get())->InitVideoVppJpeg(params); } } mfxStatus SurfaceSourceJPEG::FindSurfaceByMemId(const UMC::FrameData* in, const mfxHDLPair &hdlPair, mfxFrameSurface1 &out_surface) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { MFX_CHECK_NULL_PTR1(in); UMC::AutomaticUMCMutex guard(m_guard); UMC::FrameMemID index = in->GetFrameMID(); auto midIt = m_umc2mfx_memid.find(index); MFX_CHECK_WITH_ASSERT(midIt != m_umc2mfx_memid.end(), MFX_ERR_NOT_FOUND); mfxMemId memId = midIt->second; // if memid of in is same as memid of surface_work, StartPreparingToOutput() must not be called MFX_CHECK_WITH_ASSERT(!hdlPair.first || hdlPair.first != memId, MFX_ERR_UNSUPPORTED); mfxFrameSurface1* pSurf = (*m_vpl_cache_decoder_surfaces)->FindSurface(memId); MFX_CHECK_NULL_PTR1(pSurf); out_surface = *pSurf; return MFX_ERR_NONE; } else { return ((mfx_UMC_FrameAllocator_D3D_Converter*)m_umc_allocator_adapter.get())->FindSurfaceByMemId(in, hdlPair, out_surface); } } mfxStatus SurfaceSourceJPEG::StartPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam *par, mfxU16 *taskId) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); mfxStatus sts = MFX_ERR_NONE; if (!m_pCc) { MFX_SAFE_CALL(InitVideoVppJpeg(par)); } mfxHDLPair hdlPair; sts = m_core->GetFrameHDL(surface_work->Data.MemId, (mfxHDL*)&hdlPair); if (sts == MFX_ERR_UNDEFINED_BEHAVIOR // nothing found by Get*FrameHDL() || sts == MFX_ERR_UNSUPPORTED) // Get*FrameHDL() does not support obtaining OS-specific handle { hdlPair.first = nullptr; } else { MFX_CHECK_STS(sts); } // for interlaced case, [0] is top and [1] is bottom; for progressive only [0] is used mfxFrameSurface1 srcSurface[2]; for (int i = 0; i < 1 + (surface_work->Info.PicStruct != MFX_PICSTRUCT_PROGRESSIVE); ++i) { MFX_SAFE_CALL(FindSurfaceByMemId(&in[i], hdlPair, srcSurface[i])); #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP /* JPEG standard does not support crops as it is done in AVC, so: - CropX and CropY are always 0, - CropW and CropH represents picture size for current frame (in case of rotation, surface_work has rotated CropW and CropH), - Width and Height represents surface allocation size (they are initialized in decoder Init and are correct). */ if (par->mfx.Rotation == MFX_ROTATION_90 || par->mfx.Rotation == MFX_ROTATION_270) { srcSurface[i].Info.CropW = surface_work->Info.CropH; srcSurface[i].Info.CropH = surface_work->Info.CropW; } else #endif // MFX_ENABLE_MJPEG_ROTATE_VPP { srcSurface[i].Info.CropW = surface_work->Info.CropW; srcSurface[i].Info.CropH = surface_work->Info.CropH; } if (surface_work->Info.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) { srcSurface[i].Info.CropH /= 2; } } return par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE ? m_pCc->BeginHwJpegProcessing(&srcSurface[0], surface_work, taskId) : m_pCc->BeginHwJpegProcessing(&srcSurface[0], &srcSurface[1], surface_work, taskId); } else { return ((mfx_UMC_FrameAllocator_D3D_Converter*)m_umc_allocator_adapter.get())->StartPreparingToOutput(surface_work, in, par, taskId); } } mfxStatus SurfaceSourceJPEG::CheckPreparingToOutput(mfxFrameSurface1 *surface_work, UMC::FrameData* in, const mfxVideoParam * par, mfxU16 taskId) { MFX_CHECK(m_redirect_to_vpl_path == !!m_vpl_cache_decoder_surfaces, MFX_ERR_NOT_INITIALIZED); MFX_CHECK(!m_redirect_to_vpl_path == !!m_umc_allocator_adapter, MFX_ERR_NOT_INITIALIZED); if (m_redirect_to_vpl_path) { UMC::AutomaticUMCMutex guard(m_guard); MFX_CHECK_NULL_PTR1(m_pCc); mfxStatus sts = m_pCc->QueryTaskRoutine(taskId); if (sts == MFX_TASK_BUSY) { return sts; } if (sts != MFX_TASK_DONE) return sts; if (par->mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) { UMC::FrameMemID index = in->GetFrameMID(); auto midIt = m_umc2mfx_memid.find(index); MFX_CHECK_WITH_ASSERT(midIt != m_umc2mfx_memid.end(), MFX_ERR_NOT_FOUND); mfxMemId memId = midIt->second; mfxFrameSurface1* pSrc = (*m_vpl_cache_decoder_surfaces)->FindSurface(memId); MFX_CHECK_NULL_PTR1(pSrc); //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCc->EndHwJpegProcessing(pSrc, surface_work); guard.Lock(); MFX_CHECK(sts >= MFX_ERR_NONE, sts); } else { UMC::FrameMemID indexTop = in[0].GetFrameMID(); UMC::FrameMemID indexBottom = in[1].GetFrameMID(); // find mfx MemId auto midItTop = m_umc2mfx_memid.find(indexTop); MFX_CHECK_WITH_ASSERT(midItTop != m_umc2mfx_memid.end(), MFX_ERR_NOT_FOUND); auto midItBottom = m_umc2mfx_memid.find(indexBottom); MFX_CHECK_WITH_ASSERT(midItBottom != m_umc2mfx_memid.end(), MFX_ERR_NOT_FOUND); // find surface mfxFrameSurface1* srcTop = (*m_vpl_cache_decoder_surfaces)->FindSurface(midItTop->second); MFX_CHECK_NULL_PTR1(srcTop); mfxFrameSurface1* srcBottom = (*m_vpl_cache_decoder_surfaces)->FindSurface(midItBottom->second); MFX_CHECK_NULL_PTR1(srcBottom); //Performance issue. We need to unlock mutex to let decoding thread run async. guard.Unlock(); sts = m_pCc->EndHwJpegProcessing(srcTop, srcBottom, surface_work); guard.Lock(); MFX_CHECK(sts >= MFX_ERR_NONE, sts); } return MFX_ERR_NONE; } else { return ((mfx_UMC_FrameAllocator_D3D_Converter*)m_umc_allocator_adapter.get())->CheckPreparingToOutput(surface_work, in, par, taskId); } } #endif // #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/mfx_vpp_helper.cpp000066400000000000000000000076431443134507600265260ustar00rootroot00000000000000// Copyright (c) 2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vpp_helper.h" #include "mfx_task.h" #include "mfx_vpp_main.h" MfxVppHelper::MfxVppHelper(VideoCORE* core, mfxStatus* mfxRes) : m_core(core) { if (m_pVpp) DestroyVpp(); m_pVpp.reset(new VideoVPPMain(m_core, mfxRes)); } MfxVppHelper::~MfxVppHelper() { Close(); } mfxStatus MfxVppHelper::Init(mfxVideoParam* param) { mfxStatus mfxRes = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(param); if (m_bInitialized) return MFX_ERR_NONE; mfxRes = CreateVpp(param); MFX_CHECK_STS(mfxRes); m_bInitialized = true; return mfxRes; } mfxStatus MfxVppHelper::Reset(mfxVideoParam* /*param*/) { return MFX_ERR_UNSUPPORTED; } mfxStatus MfxVppHelper::Close() { if (!m_bInitialized) { return MFX_ERR_NONE; } DestroyVpp(); m_bInitialized = false; return MFX_ERR_NONE; } mfxStatus MfxVppHelper::Submit(mfxFrameSurface1 * input, mfxFrameSurface1* output) { mfxStatus mfxRes = MFX_ERR_NONE; MFX_CHECK_NULL_PTR1(input); MFX_CHECK(m_bInitialized, MFX_ERR_NOT_INITIALIZED); if (!m_bInitialized) { return MFX_ERR_NOT_INITIALIZED; } mfxFrameSurface1* vppout = output ? output : &m_dsSurface; mfxU32 numEntryPoints = 2; mfxRes = m_pVpp->VppFrameCheck(input, vppout, nullptr, m_entryPoint, numEntryPoints); MFX_CHECK_STS(mfxRes); if (m_entryPoint[0].pRoutine) { mfxRes = m_entryPoint[0].pRoutine(m_entryPoint[0].pState, m_entryPoint[0].pParam, 0, 0); if (mfxRes != MFX_TASK_DONE && mfxRes != MFX_TASK_BUSY) return mfxRes; } if (m_entryPoint[1].pRoutine) { mfxRes = m_entryPoint[1].pRoutine(m_entryPoint[1].pState, m_entryPoint[1].pParam, 0, 0); if (mfxRes != MFX_TASK_DONE && mfxRes != MFX_TASK_BUSY) return mfxRes; } return mfxRes; } mfxStatus MfxVppHelper::CreateVpp(mfxVideoParam* param) { mfxStatus mfxRes = MFX_ERR_NONE; mfxFrameAllocRequest vppRequest[2] = {}; // [0] - in, [1] - out mfxRes = m_pVpp->QueryIOSurf(m_core, param, vppRequest); MFX_CHECK_STS(mfxRes); vppRequest[1].Type &= ~MFX_MEMTYPE_EXTERNAL_FRAME; vppRequest[1].Type |= MFX_MEMTYPE_INTERNAL_FRAME; vppRequest[1].Type |= MFX_MEMTYPE_FROM_VPPOUT; mfxRes = m_core->AllocFrames(&vppRequest[1], &m_dsResponse, false); MFX_CHECK_STS(mfxRes); m_dsSurface.Info = vppRequest[1].Info; m_dsSurface.Data.MemId = m_dsResponse.mids[0]; m_dsSurface.Data.MemType = vppRequest[1].Type; mfxRes = m_pVpp->Init(param); m_core->LockFrame(m_dsSurface.Data.MemId, &m_dsSurface.Data); return mfxRes; } void MfxVppHelper::DestroyVpp() { m_core->UnlockFrame(m_dsSurface.Data.MemId, &m_dsSurface.Data); m_core->FreeFrames(&m_dsResponse, false); } mfxFrameSurface1 const& MfxVppHelper::GetOutputSurface() const { return m_dsSurface; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/src/mfx_vpp_vaapi.cpp000066400000000000000000003567151443134507600263560ustar00rootroot00000000000000// Copyright (c) 2011-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_common.h" #if defined (MFX_ENABLE_VPP) #include #include "mfx_vpp_defs.h" #include "mfx_vpp_vaapi.h" #include "mfx_utils.h" #include "libmfx_core_vaapi.h" #include "ippcore.h" #include "ippi.h" #include template bool SetPlaneROI(T value, T* pDst, int dstStep, IppiSize roiSize) { if (!pDst || roiSize.width < 0 || roiSize.height < 0) return false; for(int h = 0; h < roiSize.height; h++ ) { std::fill(pDst, pDst + roiSize.width, value); pDst = (T *)((unsigned char*)pDst + dstStep); } return true; } enum QueryStatus { VPREP_GPU_READY = 0, VPREP_GPU_BUSY = 1, VPREP_GPU_NOT_REACHED = 2, VPREP_GPU_FAILED = 3 }; ////////////////////////////////////////////////////////////////////////// using namespace MfxHwVideoProcessing; static float convertValue(const float OldMin,const float OldMax,const float NewMin,const float NewMax,const float OldValue) { if((0 == NewMin) && (0 == NewMax)) return OldValue; //workaround float oldRange = OldMax - OldMin; float newRange = NewMax - NewMin; return (((OldValue - OldMin) * newRange) / oldRange) + NewMin; } #define DEFAULT_HUE 0 #define DEFAULT_SATURATION 1 #define DEFAULT_CONTRAST 1 #define DEFAULT_BRIGHTNESS 0 #define VA_TOP_FIELD_WEAVE 0x00000002 #define VA_BOTTOM_FIELD_WEAVE 0x00000004 #define VPP_COMP_BACKGROUND_SURFACE_WIDTH 320 #define VPP_COMP_BACKGROUND_SURFACE_HEIGHT 256 VAAPIVideoProcessing::VAAPIVideoProcessing(): m_bRunning(false) , m_core(NULL) , m_vaDisplay(0) , m_vaConfig(VA_INVALID_ID) , m_vaContextVPP(VA_INVALID_ID) , m_denoiseFilterID(VA_INVALID_ID) , m_detailFilterID(VA_INVALID_ID) , m_deintFilterID(VA_INVALID_ID) , m_procampFilterID(VA_INVALID_ID) , m_frcFilterID(VA_INVALID_ID) , m_deintFrameCount(0) #ifdef MFX_ENABLE_VPP_FRC , m_frcCyclicCounter(0) #endif , m_numFilterBufs(0) , m_primarySurface4Composition(NULL) , m_3dlutFilterID(VA_INVALID_ID) , m_hvsDenoiseFilterID(VA_INVALID_ID) , m_hdrtmFilterID(VA_INVALID_ID) { for(int i = 0; i < VAProcFilterCount; i++) m_filterBufs[i] = VA_INVALID_ID; memset( (void*)&m_pipelineCaps, 0, sizeof(m_pipelineCaps)); memset( (void*)&m_denoiseCaps, 0, sizeof(m_denoiseCaps)); memset( (void*)&m_detailCaps, 0, sizeof(m_detailCaps)); memset( (void*)&m_deinterlacingCaps, 0, sizeof(m_deinterlacingCaps)); #ifdef MFX_ENABLE_VPP_FRC memset( (void*)&m_frcCaps, 0, sizeof(m_frcCaps)); #endif memset( (void*)&m_procampCaps, 0, sizeof(m_procampCaps)); memset( (void*)&m_hdrtm_caps, 0, sizeof(m_hdrtm_caps)); m_cachedReadyTaskIndex.clear(); m_feedbackCache.clear(); } // VAAPIVideoProcessing::VAAPIVideoProcessing() VAAPIVideoProcessing::~VAAPIVideoProcessing() { Close(); } // VAAPIVideoProcessing::~VAAPIVideoProcessing() mfxStatus VAAPIVideoProcessing::CreateDevice(VideoCORE * core, mfxVideoParam* pParams, bool /*isTemporal*/) { MFX_CHECK_NULL_PTR1(core); VAAPIVideoCORE_VPL* vaapi_core_vpl = reinterpret_cast(core->QueryCoreInterface(MFXIVAAPIVideoCORE_VPL_GUID)); MFX_CHECK_NULL_PTR1(vaapi_core_vpl); MFX_SAFE_CALL(vaapi_core_vpl->GetVAService(&m_vaDisplay)); MFX_SAFE_CALL(Init(&m_vaDisplay, pParams)); m_cachedReadyTaskIndex.clear(); m_core = core; return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::CreateDevice(VideoCORE * core, mfxInitParams* pParams) mfxStatus VAAPIVideoProcessing::DestroyDevice(void) { mfxStatus sts = Close(); return sts; } // mfxStatus VAAPIVideoProcessing::DestroyDevice(void) mfxStatus VAAPIVideoProcessing::Close(void) { VAStatus vaSts; if (m_primarySurface4Composition != NULL) { vaSts = vaDestroySurfaces(m_vaDisplay,m_primarySurface4Composition,1); std::ignore = MFX_STS_TRACE(vaSts); free(m_primarySurface4Composition); m_primarySurface4Composition = NULL; } mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_denoiseFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_detailFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_procampFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_deintFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_frcFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_3dlutFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_hvsDenoiseFilterID); std::ignore = MFX_STS_TRACE(sts); sts = CheckAndDestroyVAbuffer(m_vaDisplay, m_hdrtmFilterID); std::ignore = MFX_STS_TRACE(sts); if (m_vaContextVPP != VA_INVALID_ID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaDestroyContext"); vaSts = vaDestroyContext( m_vaDisplay, m_vaContextVPP ); std::ignore = MFX_STS_TRACE(vaSts); m_vaContextVPP = VA_INVALID_ID; } if (m_vaConfig != VA_INVALID_ID) { vaSts = vaDestroyConfig( m_vaDisplay, m_vaConfig ); std::ignore = MFX_STS_TRACE(vaSts); m_vaConfig = VA_INVALID_ID; } for(int i = 0; i < VAProcFilterCount; i++) m_filterBufs[i] = VA_INVALID_ID; m_denoiseFilterID = VA_INVALID_ID; m_deintFilterID = VA_INVALID_ID; m_procampFilterID = VA_INVALID_ID; m_3dlutFilterID = VA_INVALID_ID; m_hvsDenoiseFilterID= VA_INVALID_ID; m_hdrtmFilterID = VA_INVALID_ID; memset( (void*)&m_pipelineCaps, 0, sizeof(m_pipelineCaps)); memset( (void*)&m_denoiseCaps, 0, sizeof(m_denoiseCaps)); memset( (void*)&m_detailCaps, 0, sizeof(m_detailCaps)); memset( (void*)&m_procampCaps, 0, sizeof(m_procampCaps)); memset( (void*)&m_deinterlacingCaps, 0, sizeof(m_deinterlacingCaps)); memset( (void*)&m_hdrtm_caps, 0, sizeof(m_hdrtm_caps)); return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Close(void) mfxStatus VAAPIVideoProcessing::Init(_mfxPlatformAccelerationService* pVADisplay, mfxVideoParam* pParams) { if(false == m_bRunning) { MFX_CHECK_NULL_PTR1( pVADisplay ); MFX_CHECK_NULL_PTR1( pParams ); m_cachedReadyTaskIndex.clear(); int va_max_num_entrypoints = vaMaxNumEntrypoints(m_vaDisplay); MFX_CHECK(va_max_num_entrypoints, MFX_ERR_DEVICE_FAILED); std::unique_ptr va_entrypoints(new VAEntrypoint[va_max_num_entrypoints]); mfxI32 entrypointsCount = 0, entrypointsIndx = 0; VAStatus vaSts = vaQueryConfigEntrypoints(m_vaDisplay, VAProfileNone, va_entrypoints.get(), &entrypointsCount); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); for( entrypointsIndx = 0; entrypointsIndx < entrypointsCount; entrypointsIndx++ ) { if( VAEntrypointVideoProc == va_entrypoints[entrypointsIndx] ) { m_bRunning = true; break; } } if( !m_bRunning ) { return MFX_ERR_DEVICE_FAILED; } vaSts = vaCreateConfig( m_vaDisplay, VAProfileNone, VAEntrypointVideoProc, NULL, 0, &m_vaConfig); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); // Context int width = pParams->vpp.Out.Width; int height = pParams->vpp.Out.Height; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateContext"); vaSts = vaCreateContext(m_vaDisplay, m_vaConfig, width, height, VA_PROGRESSIVE, 0, 0, &m_vaContextVPP); } MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Init(_mfxPlatformAccelerationService* pVADisplay, mfxVideoParam* pParams) mfxStatus VAAPIVideoProcessing::Register( mfxHDLPair* /*pSurfaces*/, mfxU32 /*num*/, BOOL /*bRegister*/) { return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Register(_mfxPlatformVideoSurface *pSurfaces, ...) mfxStatus VAAPIVideoProcessing::QueryCapabilities(mfxVppCaps& caps) { VAStatus vaSts; VAProcFilterType filters[VAProcFilterCount]; mfxU32 num_filters = VAProcFilterCount; vaSts = vaQueryVideoProcFilters(m_vaDisplay, m_vaContextVPP, filters, &num_filters); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU32 num_procamp_caps = VAProcColorBalanceCount; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterColorBalance, &m_procampCaps, &num_procamp_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU32 num_denoise_caps = 1; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterNoiseReduction, &m_denoiseCaps, &num_denoise_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU32 num_detail_caps = 1; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterSharpening, &m_detailCaps, &num_detail_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); mfxU32 num_deinterlacing_caps = VAProcDeinterlacingCount; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterDeinterlacing, &m_deinterlacingCaps, &num_deinterlacing_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); #ifdef MFX_ENABLE_VPP_FRC /* to check is FRC enabled or not*/ /* first need to get number of modes supported by driver*/ VAProcFilterCapFrameRateConversion tempFRC_Caps; mfxU32 num_frc_caps = 1; tempFRC_Caps.bget_custom_rates = 1; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterFrameRateConversion, &tempFRC_Caps, &num_frc_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (0 != tempFRC_Caps.frc_custom_rates) /* FRC is enabled, at least one mode */ { caps.uFrameRateConversion = 1 ; /* Again, only two modes: 24p->60p and 30p->60p is available * But driver report 3, but 3rd is equal to 2rd, * So only 2 real modes*/ if (tempFRC_Caps.frc_custom_rates > 2) tempFRC_Caps.frc_custom_rates = 2; caps.frcCaps.customRateData.resize(tempFRC_Caps.frc_custom_rates); /*to get details about each mode */ tempFRC_Caps.bget_custom_rates = 0; for (mfxU32 ii = 0; ii < tempFRC_Caps.frc_custom_rates; ii++) { m_frcCaps[ii].frc_custom_rates = ii + 1; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterFrameRateConversion, &m_frcCaps[ii], &num_frc_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); caps.frcCaps.customRateData[ii].inputFramesOrFieldPerCycle = m_frcCaps[ii].input_frames; caps.frcCaps.customRateData[ii].outputIndexCountPerCycle = m_frcCaps[ii].output_frames; /* out frame rate*/ caps.frcCaps.customRateData[ii].customRate.FrameRateExtN = m_frcCaps[ii].output_fps; /*input frame rate */ caps.frcCaps.customRateData[ii].customRate.FrameRateExtD = m_frcCaps[ii].input_fps; } } #endif // #ifdef MFX_ENABLE_VPP_FRC for( mfxU32 filtersIndx = 0; filtersIndx < num_filters; filtersIndx++ ) { if (filters[filtersIndx]) { switch (filters[filtersIndx]) { case VAProcFilterNoiseReduction: caps.uDenoiseFilter = 1; break; case VAProcFilterSharpening: caps.uDetailFilter = 1; break; case VAProcFilterDeinterlacing: for (mfxU32 i = 0; i < num_deinterlacing_caps; i++) { if (VAProcDeinterlacingBob == m_deinterlacingCaps[i].type) caps.uSimpleDI = 1; if (VAProcDeinterlacingWeave == m_deinterlacingCaps[i].type || VAProcDeinterlacingMotionAdaptive == m_deinterlacingCaps[i].type || VAProcDeinterlacingMotionCompensated == m_deinterlacingCaps[i].type) caps.uAdvancedDI = 1; } break; case VAProcFilterColorBalance: caps.uProcampFilter = 1; break; case VAProcFilter3DLUT: caps.u3DLut = 1; break; case VAProcFilterHVSNoiseReduction: caps.uDenoise2Filter= 1; break; case VAProcFilterHighDynamicRangeToneMapping: caps.uHdr10ToneMapping = 1; break; default: break; } } } if (caps.u3DLut == 1){ mfxU32 num_3dlut_caps = 0; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilter3DLUT, (void*)m_3dlutCaps.data(), &num_3dlut_caps); MFX_CHECK(((VA_STATUS_SUCCESS == vaSts) || (VA_STATUS_ERROR_MAX_NUM_EXCEEDED == vaSts)), MFX_ERR_DEVICE_FAILED); MFX_CHECK(num_3dlut_caps != 0, MFX_ERR_UNSUPPORTED); m_3dlutCaps.resize(num_3dlut_caps); vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilter3DLUT, (void*)m_3dlutCaps.data(), &num_3dlut_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } if (caps.uDenoise2Filter) { mfxU32 num_denoise2_caps = 0; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterHVSNoiseReduction, nullptr, &num_denoise2_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); MFX_CHECK(num_denoise2_caps != 0, MFX_ERR_UNSUPPORTED); } if (caps.uHdr10ToneMapping) { mfxU32 num_hdrtm_caps = VAProcHighDynamicRangeMetadataTypeCount; vaSts = vaQueryVideoProcFilterCaps(m_vaDisplay, m_vaContextVPP, VAProcFilterHighDynamicRangeToneMapping, &m_hdrtm_caps, &num_hdrtm_caps); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); MFX_CHECK(num_hdrtm_caps != 0, MFX_ERR_UNSUPPORTED); } memset(&m_pipelineCaps, 0, sizeof(VAProcPipelineCaps)); vaSts = vaQueryVideoProcPipelineCaps(m_vaDisplay, m_vaContextVPP, NULL, 0, &m_pipelineCaps); #ifdef MFX_ENABLE_VPP_ROTATION MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); if (m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_90 ) && m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_180) && m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_270)) { caps.uRotation = 1; } #endif if (m_pipelineCaps.max_output_width && m_pipelineCaps.max_output_height) { caps.uMaxWidth = m_pipelineCaps.max_output_width; caps.uMaxHeight = m_pipelineCaps.max_output_height; caps.uMinWidth = m_pipelineCaps.min_output_width; caps.uMinHeight = m_pipelineCaps.min_output_height; } else { caps.uMaxWidth = 4096; caps.uMaxHeight = 4096; caps.uMinWidth = 16; caps.uMinHeight = 16; } #if defined (MFX_ENABLE_MJPEG_WEAVE_DI_VPP) caps.uFieldWeavingControl = 1; #else caps.uFieldWeavingControl = 0; #endif // [FourCC] // should be changed by libva support for (auto fourcc : g_TABLE_SUPPORTED_FOURCC) { // Mark supported input switch(fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_UYVY: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: #if defined (MFX_ENABLE_FOURCC_RGB565) case MFX_FOURCC_RGB565: #endif #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_AYUV: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: case MFX_FOURCC_P010: // A2RGB10 supported as input in case of passthru copy case MFX_FOURCC_A2RGB10: case MFX_FOURCC_I420: caps.mFormatSupport[fourcc] |= MFX_FORMAT_SUPPORT_INPUT; break; default: break; } // Mark supported output switch(fourcc) { case MFX_FOURCC_NV12: case MFX_FOURCC_YV12: case MFX_FOURCC_YUY2: case MFX_FOURCC_UYVY: case MFX_FOURCC_RGB4: case MFX_FOURCC_BGR4: case MFX_FOURCC_A2RGB10: case MFX_FOURCC_AYUV: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: case MFX_FOURCC_P010: case MFX_FOURCC_I420: caps.mFormatSupport[fourcc] |= MFX_FORMAT_SUPPORT_OUTPUT; break; default: break; } } caps.uMirroring = 1; caps.uScaling = 1; eMFXPlatform platform = m_core->GetPlatformType(); if (platform == MFX_PLATFORM_HARDWARE) { caps.uChromaSiting = 1; caps.uVideoSignalInfoInOut = 1; } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::QueryCapabilities(mfxVppCaps& caps) mfxStatus VAAPIVideoProcessing::QueryVariance( mfxU32 frameIndex, std::vector &variance) { (void)frameIndex; (void)variance; return MFX_ERR_UNSUPPORTED; } // mfxStatus VAAPIVideoProcessing::QueryVariance(mfxU32 frameIndex, std::vector &variance) mfxStatus VAAPIVideoProcessing::ConfigHVSDenoise(mfxExecuteParams *pParams) { VAStatus vaSts = VA_STATUS_SUCCESS; MFX_CHECK_NULL_PTR1(pParams); if (pParams->bdenoiseAdvanced) { VAProcFilterParameterBufferHVSNoiseReduction hvs_param = {}; hvs_param.type = VAProcFilterHVSNoiseReduction; switch(pParams->denoiseMode) { case MFX_DENOISE_MODE_INTEL_HVS_AUTO_BDRATE: hvs_param.mode = VA_PROC_HVS_DENOISE_AUTO_BDRATE; break; case MFX_DENOISE_MODE_INTEL_HVS_AUTO_SUBJECTIVE: hvs_param.mode = VA_PROC_HVS_DENOISE_AUTO_SUBJECTIVE; break; case MFX_DENOISE_MODE_INTEL_HVS_PRE_MANUAL: hvs_param.mode = VA_PROC_HVS_DENOISE_MANUAL; hvs_param.strength = (mfxU16)floor(16.0 / 100.0 * pParams->denoiseStrength); break; case MFX_DENOISE_MODE_INTEL_HVS_POST_MANUAL: hvs_param.mode = VA_PROC_HVS_DENOISE_MANUAL; hvs_param.strength = pParams->denoiseStrength; break; case MFX_DENOISE_MODE_INTEL_HVS_AUTO_ADJUST: case MFX_DENOISE_MODE_DEFAULT: default: hvs_param.mode = VA_PROC_HVS_DENOISE_DEFAULT; break; } /* create hvs denoise fitler buffer */ vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(hvs_param), 1, &hvs_param, &m_hvsDenoiseFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_hvsDenoiseFilterID; } return MFX_ERR_NONE; } /// Setup VPP VAAPI driver parameters /*! Setup VPP surfaces and VPP VAAPI parameters. \param[in] pParams structure with VPP parameters and associated input and reference surfaces. \param[out] deint VAProcFilterParameterBufferDeinterlacing structure containing deinterlace information (scene change, which field to display). \param[out] m_pipelineParam VAProcPipelineParameterBuffer structure containing input and reference frames. return mfxStatus MFX_ERR_NONE id successful */ mfxStatus VAAPIVideoProcessing::Execute(mfxExecuteParams *pParams) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VPP DDISubmitTask"); bool bIsFirstField = true; bool bUseReference = false; VAStatus vaSts = VA_STATUS_SUCCESS; eMFXHWType hwType = m_core->GetHWType(); // NOTE the following variables should be visible till vaRenderPicture/vaEndPicture, // not till vaCreateBuffer as the data they hold are passed to the driver via a pointer // to the memory and driver simply copies the pointer till further dereference in the // functions noted above. Thus, safer to simply make sure these variable are visible // thru the whole scope of the function. VARectangle input_region, output_region; MFX_CHECK_NULL_PTR1( pParams ); MFX_CHECK_NULL_PTR1( pParams->targetSurface.hdl.first ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces[0].hdl.first ); UMC::AutomaticUMCMutex guard(m_guard); /* There is a special case for composition */ mfxStatus mfxSts = MFX_ERR_NONE; if (pParams->bComposite) { if ((pParams->iTilesNum4Comp > 0) || (isVideoWall(pParams)) ) { mfxSts = Execute_Composition_TiledVideoWall(pParams); if (MFX_ERR_NONE == mfxSts) return mfxSts; } /* if there is errors in params for tiling usage it may work for usual composition */ else mfxSts = Execute_Composition(pParams); return mfxSts; } #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) struct gpu_hang_trigger { VADisplay disp; VABufferID id; VAStatus sts; gpu_hang_trigger(VADisplay disp, VAContextID ctx, bool on) : disp(disp), id(VA_INVALID_ID) , sts(VA_STATUS_SUCCESS) { if (!on) return; sts = vaCreateBuffer(disp, ctx, VATriggerCodecHangBufferType, sizeof(unsigned int), 1, 0, &id); if (sts == VA_STATUS_SUCCESS) { unsigned int* trigger = NULL; sts = vaMapBuffer(disp, id, (void**)&trigger); if (sts != VA_STATUS_SUCCESS) return; if (trigger) *trigger = 1; else sts = VA_STATUS_ERROR_UNKNOWN; vaUnmapBuffer(disp, id); } } ~gpu_hang_trigger() { if (id != VA_INVALID_ID) sts = vaDestroyBuffer(disp, id); } } trigger(m_vaDisplay, m_vaContextVPP, pParams->gpuHangTrigger); if (trigger.sts != VA_STATUS_SUCCESS) return MFX_ERR_DEVICE_FAILED; #endif // #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) // This works for ADI 30i->30p for now // Better way may involve enabling bEOS for 30i->30p mode if ((1 == pParams->refCount) && (pParams->bDeinterlace30i60p == false)) m_deintFrameCount = 0; if (VA_INVALID_ID == m_deintFilterID) { if (pParams->iDeinterlacingAlgorithm) { VAProcFilterParameterBufferDeinterlacing deint; deint.type = VAProcFilterDeinterlacing; deint.flags = 0; if (MFX_DEINTERLACING_BOB == pParams->iDeinterlacingAlgorithm) { deint.algorithm = VAProcDeinterlacingBob; } else if(0 == pParams->iDeinterlacingAlgorithm) // skip DI for progressive frames { deint.algorithm = VAProcDeinterlacingNone; } else { deint.algorithm = VAProcDeinterlacingMotionAdaptive; } // Get picture structure of ouput frame mfxDrvSurface* pRefSurf_frameInfo = &(pParams->pRefSurfaces[0]); // previous input frame mfxDrvSurface *pCurSurf_frameInfo = &(pParams->pRefSurfaces[pParams->bkwdRefCount]); // current input frame // PicStruc can take values: MFX_PICSTRUCT_PROGRESSIVE | MFX_PICSTRUCT_FIELD_TFF | MFX_PICSTRUCT_FIELD_REPEATED=0x10 // default deint.flags = 0 is for top field in TFF frame. if (pCurSurf_frameInfo->frameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE) deint.flags = VA_DEINTERLACING_ONE_FIELD; else if (pCurSurf_frameInfo->frameInfo.PicStruct & MFX_PICSTRUCT_FIELD_BFF) deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD; /* Deinterlacer: * BOB is used in first output frame (pParams->refCount = 1) and * when scene change flag is set (pParams->scene > 0) ADI is * used otherwise. * ADI output is late by one field. Current and reference field * are fed into de-interlacer. **/ /* ADI 30i->30p: To get first field of current frame only * For TFF cases, deint.flags required to set VA_DEINTERLACING_ONE_FIELD * ensure driver go 30i->30p mode and surface set correct * For BFF cases, deint.flags required to set all bits * ensure driver go 30i->30p mode and surface set correct **/ if(deint.algorithm == VAProcDeinterlacingMotionAdaptive && (pParams->refCount > 1)) { if (MFX_PICSTRUCT_FIELD_TFF & pCurSurf_frameInfo->frameInfo.PicStruct) deint.flags = VA_DEINTERLACING_ONE_FIELD; else /* For BFF case required to set all bits */ deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD | VA_DEINTERLACING_ONE_FIELD; } /* For 30i->60p case we have to indicate * to driver which field Top or Bottom we a going to send. * ADI uses reference frame and start after first frame: * m_deintFrameCount==1, if TFF, TOP=second field of reference, BOTTOM=first field of current * BOB, ADI_no_ref do not use reference frame and are used on first frame: * m_deintFrameCount==0, if TFF, TOP=first field of current, BOTTOM=seconf field of current. */ if (pParams->bDeinterlace30i60p == true) { mfxU32 refFramePicStruct = pRefSurf_frameInfo->frameInfo.PicStruct; mfxU32 currFramePicStruct = pCurSurf_frameInfo->frameInfo.PicStruct; bool isCurrentProgressive = false; bool isPreviousProgressive = false; bool isSameParity = false; // Deinterlace with reference can be used after first frame is processed if(pParams->refCount > 1 && m_deintFrameCount) bUseReference = true; // Check if previous is progressive if ((refFramePicStruct == MFX_PICSTRUCT_PROGRESSIVE) || (refFramePicStruct & MFX_PICSTRUCT_FIELD_REPEATED) || (refFramePicStruct & MFX_PICSTRUCT_FRAME_DOUBLING) || (refFramePicStruct & MFX_PICSTRUCT_FRAME_TRIPLING)) { isPreviousProgressive = true; } if ((currFramePicStruct == MFX_PICSTRUCT_PROGRESSIVE) || (currFramePicStruct & MFX_PICSTRUCT_FIELD_REPEATED) || (currFramePicStruct & MFX_PICSTRUCT_FRAME_DOUBLING) || (currFramePicStruct & MFX_PICSTRUCT_FRAME_TRIPLING)) { isCurrentProgressive = true; } // Use BOB when scene change occur if ( MFX_DEINTERLACING_ADVANCED_SCD == pParams->iDeinterlacingAlgorithm && ( pParams->scene != VPP_NO_SCENE_CHANGE)) bUseReference = false; // Set up wich field to display for 30i->60p mode // ADI uses second Field on even frames // BOB, ADI_no_ref uses second Field on odd frames if (0 == (m_deintFrameCount %2) && bUseReference) { bIsFirstField = false; } else if (1 == (m_deintFrameCount %2) && ((!bUseReference))) { bIsFirstField = false; } // Set deinterlace flag depending on parity and field to display if (bIsFirstField) // output is second field of previous input { if (MFX_PICSTRUCT_FIELD_TFF & pRefSurf_frameInfo->frameInfo.PicStruct) deint.flags = 0; else deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD; } else // output is first field of current input { if (MFX_PICSTRUCT_FIELD_TFF & pCurSurf_frameInfo->frameInfo.PicStruct) deint.flags = VA_DEINTERLACING_BOTTOM_FIELD; else deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST; } // case where previous and current have different parity -> use ADI no ref on current // To avoid frame duplication if((refFramePicStruct & MFX_PICSTRUCT_FIELD_TFF) && (currFramePicStruct & MFX_PICSTRUCT_FIELD_TFF)) isSameParity = true; else if((refFramePicStruct & MFX_PICSTRUCT_FIELD_BFF) && (currFramePicStruct & MFX_PICSTRUCT_FIELD_BFF)) isSameParity = true; if((!isPreviousProgressive) && (!isCurrentProgressive) && (!isSameParity)) { // Current is BFF if(!bIsFirstField && (currFramePicStruct & MFX_PICSTRUCT_FIELD_BFF)) { deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD; pParams->refCount =1; // Force ADI no ref on first Field of current frame } // Current is TFF if(!bIsFirstField && (currFramePicStruct & MFX_PICSTRUCT_FIELD_TFF)) { deint.flags = 0; pParams->refCount =1; // Force ADI no ref on first Field of current frame } } } // if ((30i->60p) && (pParams->refCount > 1)) /* 30i->60p mode only*/ /* Process special case and scene change flag*/ if ( MFX_DEINTERLACING_ADVANCED_SCD == pParams->iDeinterlacingAlgorithm && ( pParams->scene != VPP_NO_SCENE_CHANGE)) { if(pParams->bDeinterlace30i60p) // 30i->60p mode { // In case of multiple scene changes, use BOB with same field to avoid out of frame order if(VPP_MORE_SCENE_CHANGE_DETECTED == pParams->scene) { if (MFX_PICSTRUCT_FIELD_TFF & pCurSurf_frameInfo->frameInfo.PicStruct) deint.flags = 0; else /* BFF */ deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD; } } else /* BOB 30i->30p use First Field to generate output*/ { if (MFX_PICSTRUCT_FIELD_TFF & pCurSurf_frameInfo->frameInfo.PicStruct) deint.flags = 0; else /* Frame is BFF */ deint.flags = VA_DEINTERLACING_BOTTOM_FIELD_FIRST | VA_DEINTERLACING_BOTTOM_FIELD; } deint.flags |= VA_DEINTERLACING_SCD_ENABLE; // It forces BOB } vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(deint), 1, &deint, &m_deintFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_deintFilterID; } } if (pParams->bEnableProcAmp) { /* Buffer was created earlier and it's time to refresh its value */ mfxSts = RemoveBufferFromPipe(m_procampFilterID); MFX_CHECK_STS(mfxSts); } if (VA_INVALID_ID == m_procampFilterID) { if ( pParams->bEnableProcAmp ) { VAProcFilterParameterBufferColorBalance procamp[4]; procamp[0].type = VAProcFilterColorBalance; procamp[0].attrib = VAProcColorBalanceBrightness; procamp[0].value = 0; if ( pParams->Brightness) { procamp[0].value = convertValue(-100, 100, m_procampCaps[VAProcColorBalanceBrightness-1].range.min_value, m_procampCaps[VAProcColorBalanceBrightness-1].range.max_value, pParams->Brightness); } procamp[1].type = VAProcFilterColorBalance; procamp[1].attrib = VAProcColorBalanceContrast; procamp[1].value = 1; if ( pParams->Contrast != 1 ) { procamp[1].value = convertValue(0, 10, m_procampCaps[VAProcColorBalanceContrast-1].range.min_value, m_procampCaps[VAProcColorBalanceContrast-1].range.max_value, pParams->Contrast); } procamp[2].type = VAProcFilterColorBalance; procamp[2].attrib = VAProcColorBalanceHue; procamp[2].value = 0; if ( pParams->Hue) { procamp[2].value = convertValue(-180, 180, m_procampCaps[VAProcColorBalanceHue-1].range.min_value, m_procampCaps[VAProcColorBalanceHue-1].range.max_value, pParams->Hue); } procamp[3].type = VAProcFilterColorBalance; procamp[3].attrib = VAProcColorBalanceSaturation; procamp[3].value = 1; if ( pParams->Saturation != 1 ) { procamp[3].value = convertValue(0, 10, m_procampCaps[VAProcColorBalanceSaturation-1].range.min_value, m_procampCaps[VAProcColorBalanceSaturation-1].range.max_value, pParams->Saturation); } vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(procamp), 4, &procamp, &m_procampFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_procampFilterID; /* Clear enable flag. Since appropriate buffer has been created, * it will be used in consequent Execute calls. * If application will Reset or call Init/Close with setting procamp * with new value, this flag will be raised again thus new buffer with * new value will be created. */ pParams->bEnableProcAmp = false; } } if (pParams->denoiseFactor || pParams->bDenoiseAutoAdjust) { /* Buffer was created earlier and it's time to refresh its value */ mfxSts = RemoveBufferFromPipe(m_denoiseFilterID); MFX_CHECK_STS(mfxSts); } if (VA_INVALID_ID == m_denoiseFilterID) { if (pParams->denoiseFactor || pParams->bDenoiseAutoAdjust) { VAProcFilterParameterBuffer denoise; denoise.type = VAProcFilterNoiseReduction; if(pParams->bDenoiseAutoAdjust) denoise.value = m_denoiseCaps.range.default_value; else denoise.value = (mfxU16)floor( convertValue(0, 100, m_denoiseCaps.range.min_value, m_denoiseCaps.range.max_value, pParams->denoiseFactor) + 0.5); vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(denoise), 1, &denoise, &m_denoiseFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_denoiseFilterID; pParams->denoiseFactor = 0; pParams->bDenoiseAutoAdjust = false; } } if (pParams->bdenoiseAdvanced) { /* Buffer was created earlier and it's time to refresh its value */ mfxSts = RemoveBufferFromPipe(m_hvsDenoiseFilterID); MFX_CHECK_STS(mfxSts); } if (VA_INVALID_ID == m_hvsDenoiseFilterID) { mfxSts = ConfigHVSDenoise(pParams); MFX_CHECK_STS(mfxSts); } if (VA_INVALID_ID == m_3dlutFilterID) { if (pParams->lut3DInfo.Enabled) { const mfxU16 lut17_seg_size = 17, lut17_mul_size = 32; const mfxU16 lut33_seg_size = 33, lut33_mul_size = 64; const mfxU16 lut65_seg_size = 65, lut65_mul_size = 128; VAProcFilterParameterBuffer3DLUT lut3d_param = {}; lut3d_param.type = VAProcFilter3DLUT; lut3d_param.bit_depth = 16; lut3d_param.num_channel = 4; switch(pParams->lut3DInfo.ChannelMapping) { case MFX_3DLUT_CHANNEL_MAPPING_RGB_RGB: case MFX_3DLUT_CHANNEL_MAPPING_DEFAULT: lut3d_param.channel_mapping = VA_3DLUT_CHANNEL_RGB_RGB; break; case MFX_3DLUT_CHANNEL_MAPPING_YUV_RGB: lut3d_param.channel_mapping = VA_3DLUT_CHANNEL_YUV_RGB; break; case MFX_3DLUT_CHANNEL_MAPPING_VUY_RGB: lut3d_param.channel_mapping = VA_3DLUT_CHANNEL_VUY_RGB; break; default: break; } if(pParams->lut3DInfo.BufferType == MFX_RESOURCE_VA_SURFACE) { lut3d_param.lut_surface = *((VASurfaceID*)pParams->lut3DInfo.MemId); switch(pParams->lut3DInfo.MemLayout) { case MFX_3DLUT_MEMORY_LAYOUT_INTEL_17LUT: lut3d_param.lut_size = lut17_seg_size; lut3d_param.lut_stride[0] = lut17_seg_size; lut3d_param.lut_stride[1] = lut17_seg_size; lut3d_param.lut_stride[2] = lut17_mul_size; break; case MFX_3DLUT_MEMORY_LAYOUT_INTEL_33LUT: lut3d_param.lut_size = lut33_seg_size; lut3d_param.lut_stride[0] = lut33_seg_size; lut3d_param.lut_stride[1] = lut33_seg_size; lut3d_param.lut_stride[2] = lut33_mul_size; break; case MFX_3DLUT_MEMORY_LAYOUT_INTEL_65LUT: case MFX_3DLUT_MEMORY_LAYOUT_DEFAULT: lut3d_param.lut_size = lut65_seg_size; lut3d_param.lut_stride[0] = lut65_seg_size; lut3d_param.lut_stride[1] = lut65_seg_size; lut3d_param.lut_stride[2] = lut65_mul_size; break; default: break; } } else if(pParams->lut3DInfo.BufferType == MFX_RESOURCE_SYSTEM_SURFACE) { mfxU16 seg_size, mul_size; switch(pParams->lut3DInfo.Channel[0].Size) { case lut17_seg_size: seg_size = lut17_seg_size; mul_size = lut17_mul_size; break; case lut33_seg_size: seg_size = lut33_seg_size; mul_size = lut33_mul_size; break; case lut65_seg_size: default: seg_size = lut65_seg_size; mul_size = lut65_mul_size; break; } lut3d_param.lut_size = seg_size; // create VA surface VASurfaceAttrib surface_attrib = {}; surface_attrib.type = VASurfaceAttribPixelFormat; surface_attrib.flags = VA_SURFACE_ATTRIB_SETTABLE; surface_attrib.value.type = VAGenericValueTypeInteger; surface_attrib.value.value.i = VA_FOURCC_RGBA; VASurfaceID surface_id = VA_INVALID_ID; vaSts = vaCreateSurfaces(m_vaDisplay, VA_RT_FORMAT_RGB32, seg_size * mul_size, seg_size * 2, &surface_id, 1, &surface_attrib, 1); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaSyncSurface(m_vaDisplay, surface_id); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); VAImage surface_image = {}; vaSts = vaDeriveImage(m_vaDisplay, surface_id, &surface_image); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); void* surface_p = nullptr; vaSts = vaMapBuffer(m_vaDisplay, surface_image.buf, &surface_p); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); memcpy((char*)surface_p, pParams->lut3DInfo.Channel[0].Data, pParams->lut3DInfo.Channel[0].Size); memcpy((char*)surface_p + pParams->lut3DInfo.Channel[0].Size, pParams->lut3DInfo.Channel[1].Data, pParams->lut3DInfo.Channel[1].Size); memcpy((char*)surface_p + pParams->lut3DInfo.Channel[0].Size + pParams->lut3DInfo.Channel[1].Size, pParams->lut3DInfo.Channel[2].Data, pParams->lut3DInfo.Channel[2].Size); vaSts = vaUnmapBuffer(m_vaDisplay, surface_image.buf); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaDestroyImage(m_vaDisplay, surface_image.image_id); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); lut3d_param.lut_surface = surface_id; } /* create 3dlut fitler buffer */ vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(lut3d_param), 1, &lut3d_param, &m_3dlutFilterID); MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_3dlutFilterID; } } if (pParams->detailFactor || pParams->bDetailAutoAdjust) { /* Buffer was created earlier and it's time to refresh its value */ mfxSts = RemoveBufferFromPipe(m_detailFilterID); MFX_CHECK_STS(mfxSts); } if (VA_INVALID_ID == m_detailFilterID) { if (pParams->detailFactor || pParams->bDetailAutoAdjust) { VAProcFilterParameterBuffer detail; detail.type = VAProcFilterSharpening; if(pParams->bDetailAutoAdjust) detail.value = m_detailCaps.range.default_value; else detail.value = (mfxU16)floor( convertValue(0, 100, m_detailCaps.range.min_value, m_detailCaps.range.max_value, pParams->detailFactor) + 0.5); vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(detail), 1, &detail, &m_detailFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_detailFilterID; pParams->detailFactor = 0; pParams->bDetailAutoAdjust = false; } } if (VA_INVALID_ID == m_frcFilterID) { if (pParams->bFRCEnable) { #ifdef MFX_ENABLE_VPP_FRC VAProcFilterParameterBufferFrameRateConversion frcParams; memset(&frcParams, 0, sizeof(VAProcFilterParameterBufferFrameRateConversion)); frcParams.type = VAProcFilterFrameRateConversion; if (30 == pParams->customRateData.customRate.FrameRateExtD) { frcParams.input_fps = 30; frcParams.output_fps = 60; frcParams.num_output_frames = 2; frcParams.repeat_frame = 0; } else if (24 == pParams->customRateData.customRate.FrameRateExtD) { frcParams.input_fps = 24; frcParams.output_fps = 60; frcParams.num_output_frames = 5; frcParams.repeat_frame = 0; } frcParams.cyclic_counter = m_frcCyclicCounter++; if ((frcParams.input_fps == 30) && (m_frcCyclicCounter == 2)) m_frcCyclicCounter = 0; if ((frcParams.input_fps == 24) && (m_frcCyclicCounter == 5)) m_frcCyclicCounter = 0; frcParams.output_frames = (VASurfaceID*)(pParams->targetSurface.hdl.first); vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(frcParams), 1, &frcParams, &m_frcFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_frcFilterID; #else return MFX_ERR_UNSUPPORTED; #endif } } /* pParams->refCount is total number of processing surfaces: * in case of composition this is primary + sub streams*/ m_pipelineParam.resize(pParams->refCount); m_pipelineParamID.resize(pParams->refCount, VA_INVALID_ID); mfxDrvSurface* pRefSurf = &(pParams->pRefSurfaces[0]); memset(&m_pipelineParam[0], 0, sizeof(m_pipelineParam[0])); if (pParams->bFieldWeaving || ( (pParams->refCount > 1) && (0 != pParams->iDeinterlacingAlgorithm ))) { m_pipelineParam[0].num_backward_references = 1; mfxDrvSurface* pRefSurf_1 = NULL; /* in pRefSurfaces * first is backward references * then current src surface * and only after this is forward references * */ pRefSurf_1 = &(pParams->pRefSurfaces[0]); // point to previous frame VASurfaceID *ref_srf = (VASurfaceID *)(pRefSurf_1->hdl.first); m_pipelineParam[0].backward_references = ref_srf; } /* FRC Interpolated case */ if (0 != pParams->bFRCEnable) { if (30 == pParams->customRateData.customRate.FrameRateExtD) m_pipelineParam[0].num_forward_references = 2; else if (24 == pParams->customRateData.customRate.FrameRateExtD) m_pipelineParam[0].num_forward_references = 3; if (2 == pParams->refCount) /* may be End of Stream case */ { mfxDrvSurface* pRefSurf_frc1; pRefSurf_frc1 = &(pParams->pRefSurfaces[1]); m_refForFRC[0] = *(VASurfaceID*)(pRefSurf_frc1->hdl.first); m_refForFRC[2] = m_refForFRC[1] = m_refForFRC[0]; } if (3 == pParams->refCount) { mfxDrvSurface* pRefSurf_frc1; pRefSurf_frc1 = &(pParams->pRefSurfaces[1]); m_refForFRC[0] = *(VASurfaceID*)(pRefSurf_frc1->hdl.first); mfxDrvSurface* pRefSurf_frc2; pRefSurf_frc2 = &(pParams->pRefSurfaces[2]); m_refForFRC[1] = *(VASurfaceID*) (pRefSurf_frc2->hdl.first); } if (4 == pParams->refCount) { mfxDrvSurface* pRefSurf_frc1; pRefSurf_frc1 = &(pParams->pRefSurfaces[1]); m_refForFRC[0] = *(VASurfaceID*)(pRefSurf_frc1->hdl.first); mfxDrvSurface* pRefSurf_frc2; pRefSurf_frc2 = &(pParams->pRefSurfaces[2]); m_refForFRC[1] = *(VASurfaceID*) (pRefSurf_frc2->hdl.first); mfxDrvSurface* pRefSurf_frc3; pRefSurf_frc3 = &(pParams->pRefSurfaces[3]); m_refForFRC[2] = *(VASurfaceID*) (pRefSurf_frc3->hdl.first); } /* to pass ref list to pipeline */ m_pipelineParam[0].forward_references = m_refForFRC; } /*if (0 != pParams->bFRCEnable)*/ /* SRC surface */ mfxDrvSurface* pSrcInputSurf = &pRefSurf[pParams->bkwdRefCount]; /* in 30i->60p mode, when scene change occurs, BOB is used and needs current input frame. * Current frame = ADI reference for odd output frames * Current frame = ADI input for even output frames * when mixed picture is progressive, even frame use reference frame for output due to ADI delay **/ if(pParams->bDeinterlace30i60p && ((VPP_SCENE_NEW == pParams->scene)|| (pParams->iDeinterlacingAlgorithm == 0))) { if(m_deintFrameCount % 2) pSrcInputSurf = &(pParams->pRefSurfaces[0]); // point to reference frame } VASurfaceID *srf = (VASurfaceID *)(pSrcInputSurf->hdl.first); m_pipelineParam[0].surface = *srf; #ifdef MFX_ENABLE_VPP_ROTATION switch (pParams->rotation) { case MFX_ANGLE_90: if ( m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_90)) { m_pipelineParam[0].rotation_state = VA_ROTATION_90; } break; case MFX_ANGLE_180: if ( m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_180)) { m_pipelineParam[0].rotation_state = VA_ROTATION_180; } break; case MFX_ANGLE_270: if ( m_pipelineCaps.rotation_flags & (1 << VA_ROTATION_270)) { m_pipelineParam[0].rotation_state = VA_ROTATION_270; } break; } #endif /* * Execute mirroring for MIRROR_WO_EXEC only because MSDK will do * copy-with-mirror for others. */ if (pParams->mirroringPosition == MIRROR_WO_EXEC) { switch (pParams->mirroring) { case MFX_MIRRORING_HORIZONTAL: m_pipelineParam[0].mirror_state = VA_MIRROR_HORIZONTAL; break; case MFX_MIRRORING_VERTICAL: m_pipelineParam[0].mirror_state = VA_MIRROR_VERTICAL; break; } } // source cropping mfxFrameInfo *inInfo = &(pRefSurf->frameInfo); input_region.y = inInfo->CropY; input_region.x = inInfo->CropX; input_region.height = inInfo->CropH; input_region.width = inInfo->CropW; m_pipelineParam[0].surface_region = &input_region; // destination cropping mfxFrameInfo *outInfo = &(pParams->targetSurface.frameInfo); output_region.y = outInfo->CropY; output_region.x = outInfo->CropX; output_region.height= outInfo->CropH; output_region.width = outInfo->CropW; m_pipelineParam[0].output_region = &output_region; m_pipelineParam[0].output_background_color = 0xff000000; // black for ARGB #ifdef MFX_ENABLE_VPP_VIDEO_SIGNAL #define ENABLE_VPP_VIDEO_SIGNAL(X) X #else #define ENABLE_VPP_VIDEO_SIGNAL(X) #endif mfxU32 refFourcc = pRefSurf->frameInfo.FourCC; switch (refFourcc) { case MFX_FOURCC_RGB4: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_RGB565: m_pipelineParam[0].surface_color_standard = VAProcColorStandardNone; ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].input_color_properties.color_range = VA_SOURCE_RANGE_FULL); break; case MFX_FOURCC_NV12: default: m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT601; ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].input_color_properties.color_range = VA_SOURCE_RANGE_REDUCED); break; } mfxU32 targetFourcc = pParams->targetSurface.frameInfo.FourCC; switch (targetFourcc) { case MFX_FOURCC_RGB4: #ifdef MFX_ENABLE_RGBP case MFX_FOURCC_RGBP: #endif case MFX_FOURCC_BGRP: case MFX_FOURCC_RGB565: m_pipelineParam[0].output_color_standard = VAProcColorStandardNone; ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].output_color_properties.color_range = VA_SOURCE_RANGE_FULL); break; case MFX_FOURCC_NV12: m_pipelineParam[0].output_color_standard = VAProcColorStandardBT601; if(refFourcc == MFX_FOURCC_RGBP) { ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].output_color_properties.color_range = VA_SOURCE_RANGE_FULL); } else { ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].output_color_properties.color_range = VA_SOURCE_RANGE_REDUCED); } break; default: m_pipelineParam[0].output_color_standard = VAProcColorStandardBT601; ENABLE_VPP_VIDEO_SIGNAL(m_pipelineParam[0].output_color_properties.color_range = VA_SOURCE_RANGE_REDUCED); break; } m_pipelineParam[0].input_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; m_pipelineParam[0].output_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; /* It needs interlaced flag passed only for * deinterlacing and scaling. All other filters must * use progressive even for interlaced content. */ bool forceProgressive = true; if (pParams->iDeinterlacingAlgorithm || inInfo->CropH != outInfo->CropH || inInfo->CropW != outInfo->CropW) { forceProgressive = false; } switch (pRefSurf->frameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: m_pipelineParam[0].filter_flags = VA_FRAME_PICTURE; break; case MFX_PICSTRUCT_FIELD_TFF: m_pipelineParam[0].filter_flags = forceProgressive ? VA_FRAME_PICTURE : VA_TOP_FIELD; break; case MFX_PICSTRUCT_FIELD_BFF: m_pipelineParam[0].filter_flags = forceProgressive ? VA_FRAME_PICTURE : VA_BOTTOM_FIELD; break; } // If field weaving is perform on driver // Kernel don't uses these parameters if (pParams->bFieldWeavingExt) { // TFF and BFF are output frame types for field weaving switch (pParams->targetSurface.frameInfo.PicStruct) { case MFX_PICSTRUCT_FIELD_TFF: { m_pipelineParam[0].filter_flags = VA_TOP_FIELD_WEAVE; m_pipelineParam[0].input_surface_flag = VA_TOP_FIELD; m_pipelineParam[0].output_surface_flag = VA_TOP_FIELD_FIRST; break; } case MFX_PICSTRUCT_FIELD_BFF: { m_pipelineParam[0].filter_flags = VA_BOTTOM_FIELD_WEAVE; m_pipelineParam[0].input_surface_flag = VA_BOTTOM_FIELD; m_pipelineParam[0].output_surface_flag = VA_BOTTOM_FIELD_FIRST; break; } } } // If field splitting is perform on driver if (pParams->bFieldSplittingExt) { // TFF and BFF are input frame types for field splitting switch (pRefSurf->frameInfo.PicStruct) { case MFX_PICSTRUCT_FIELD_TFF: { m_pipelineParam[0].input_surface_flag = VA_TOP_FIELD_FIRST; m_pipelineParam[0].output_surface_flag = (pParams->statusReportID % 2 == 0) ? VA_TOP_FIELD : VA_BOTTOM_FIELD; break; } case MFX_PICSTRUCT_FIELD_BFF: { m_pipelineParam[0].input_surface_flag = VA_BOTTOM_FIELD_FIRST; m_pipelineParam[0].output_surface_flag = (pParams->statusReportID % 2 == 0) ? VA_BOTTOM_FIELD : VA_TOP_FIELD; break; } } } m_pipelineParam[0].filters = m_filterBufs; m_pipelineParam[0].num_filters = m_numFilterBufs; int index = GetCurFrameSignalIdx(pParams); if ((index >= 0) && pParams->VideoSignalInfo[index].enabled) { #ifdef MFX_ENABLE_VPP_VIDEO_SIGNAL if(pParams->VideoSignalInfo[index].TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[0].surface_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfo[index].TransferMatrix ? VAProcColorStandardBT709 : VAProcColorStandardBT601); } if(pParams->VideoSignalInfo[index].NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[0].input_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfo[index].NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } if (pParams->VideoSignalInfoOut.enabled) { if(pParams->VideoSignalInfoOut.TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[0].output_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfoOut.TransferMatrix ? VAProcColorStandardBT709 : VAProcColorStandardBT601); } if(pParams->VideoSignalInfoOut.NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[0].output_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfoOut.NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } #else return MFX_ERR_UNSUPPORTED; #endif // #ifdef MFX_ENABLE_VPP_VIDEO_SIGNAL } if (pParams->m_inVideoSignalInfo.enabled) { // Video Range m_pipelineParam[0].input_color_properties.color_range = (pParams->m_inVideoSignalInfo.VideoFullRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; switch (pParams->m_inVideoSignalInfo.ColourPrimaries) { case 9: // BT.2020 m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT2020; break; case 1: // BT.709 m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT709; break; case 6: default: m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT601; break; } m_pipelineParam[0].input_color_properties.colour_primaries = pParams->m_inVideoSignalInfo.ColourPrimaries; m_pipelineParam[0].input_color_properties.transfer_characteristics = pParams->m_inVideoSignalInfo.TransferCharacteristics; } if (pParams->m_outVideoSignalInfo.enabled) { // Video Range m_pipelineParam[0].output_color_properties.color_range = (pParams->m_outVideoSignalInfo.VideoFullRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; switch (pParams->m_outVideoSignalInfo.ColourPrimaries) { case 9: // BT.2020 m_pipelineParam[0].output_color_standard = VAProcColorStandardBT2020; break; case 1: // BT.709 m_pipelineParam[0].output_color_standard = VAProcColorStandardBT709; break; case 6: default: m_pipelineParam[0].output_color_standard = VAProcColorStandardBT601; break; } m_pipelineParam[0].output_color_properties.colour_primaries = pParams->m_outVideoSignalInfo.ColourPrimaries; m_pipelineParam[0].output_color_properties.transfer_characteristics = pParams->m_outVideoSignalInfo.TransferCharacteristics; } m_pipelineParam[0].input_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; m_pipelineParam[0].output_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; VAHdrMetaData out_metadata = {}; VAHdrMetaDataHDR10 outHDR10MetaData = {}; auto SetHdrMetaData = [](const mfxExecuteParams::HDR10MetaData& data) { mfxU32 kLuminanceFixedPoint = 10000; //In VAAPI, maxMasteringLuminance and minMasteringLuminance are in the unit of 0.0001 nits. VAHdrMetaDataHDR10 retHDR10MetaData = { {data.displayPrimariesX[0], data.displayPrimariesX[1], data.displayPrimariesX[2]}, {data.displayPrimariesY[0], data.displayPrimariesY[1], data.displayPrimariesY[2]}, data.whitePoint[0], data.whitePoint[1], data.maxMasteringLuminance * kLuminanceFixedPoint, data.minMasteringLuminance * kLuminanceFixedPoint, data.maxContentLightLevel, data.maxFrameAverageLightLevel }; return retHDR10MetaData; }; VAHdrMetaDataHDR10 inHDR10MetaData = {}; if(pParams->inHDR10MetaData.enabled) { if (m_hdrtmFilterID != VA_INVALID_ID) { mfxSts = RemoveBufferFromPipe(m_hdrtmFilterID); MFX_CHECK_STS(mfxSts); } inHDR10MetaData = SetHdrMetaData(pParams->inHDR10MetaData); VAProcFilterParameterBufferHDRToneMapping hdrtm_param = {}; hdrtm_param.type = VAProcFilterHighDynamicRangeToneMapping; hdrtm_param.data.metadata_type = VAProcHighDynamicRangeMetadataHDR10; hdrtm_param.data.metadata = &inHDR10MetaData; hdrtm_param.data.metadata_size = sizeof(VAHdrMetaDataHDR10); vaSts = vaCreateBuffer((void*)m_vaDisplay, m_vaContextVPP, VAProcFilterParameterBufferType, sizeof(hdrtm_param), 1, (void*)&hdrtm_param, &m_hdrtmFilterID); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); m_filterBufs[m_numFilterBufs++] = m_hdrtmFilterID; m_pipelineParam[0].num_filters = m_numFilterBufs; m_pipelineParam[0].surface_color_standard = VAProcColorStandardExplicit; } if (pParams->outHDR10MetaData.enabled) { outHDR10MetaData = SetHdrMetaData(pParams->outHDR10MetaData); out_metadata.metadata_type = VAProcHighDynamicRangeMetadataHDR10; out_metadata.metadata = &outHDR10MetaData; out_metadata.metadata_size = sizeof(VAHdrMetaDataHDR10); m_pipelineParam[0].output_hdr_metadata = &out_metadata; m_pipelineParam[0].output_color_standard = VAProcColorStandardExplicit; } mfxU32 interpolation[4] = { VA_FILTER_INTERPOLATION_DEFAULT, // MFX_INTERPOLATION_DEFAULT = 0, VA_FILTER_INTERPOLATION_NEAREST_NEIGHBOR, // MFX_INTERPOLATION_NEAREST_NEIGHBOR = 1, VA_FILTER_INTERPOLATION_BILINEAR, // MFX_INTERPOLATION_BILINEAR = 2, VA_FILTER_INTERPOLATION_ADVANCED // MFX_INTERPOLATION_ADVANCED = 3 }; mfxSts = (pParams->interpolationMethod > MFX_INTERPOLATION_ADVANCED) ? MFX_ERR_UNSUPPORTED : MFX_ERR_NONE; MFX_CHECK_STS(mfxSts); /* Scaling params */ switch (pParams->scalingMode) { case MFX_SCALING_MODE_LOWPOWER: /* VA_FILTER_SCALING_DEFAULT means the following: * First priority is HW fixed function scaling engine. If it can't work, revert to AVS * If scaling ratio between 1/8...8 -> HW fixed function * If scaling ratio between 1/16...1/8 or larger than 8 -> AVS * If scaling ratio is less than 1/16 -> bilinear */ m_pipelineParam[0].filter_flags |= VA_FILTER_SCALING_DEFAULT; m_pipelineParam[0].filter_flags |= interpolation[pParams->interpolationMethod]; break; case MFX_SCALING_MODE_QUALITY: /* VA_FILTER_SCALING_HQ means the following: * If scaling ratio is less than 1/16 -> bilinear * For all other cases, AVS is used. */ m_pipelineParam[0].filter_flags |= VA_FILTER_SCALING_HQ; m_pipelineParam[0].filter_flags |= interpolation[pParams->interpolationMethod]; mfxSts = ((pParams->interpolationMethod == MFX_INTERPOLATION_DEFAULT) || (pParams->interpolationMethod == MFX_INTERPOLATION_ADVANCED)) ? MFX_ERR_NONE : MFX_ERR_UNSUPPORTED; break; case MFX_SCALING_MODE_INTEL_GEN_COMPUTE: m_pipelineParam[0].filter_flags |= VA_FILTER_SCALING_HQ; m_pipelineParam[0].filter_flags |= interpolation[pParams->interpolationMethod]; m_pipelineParam[0].pipeline_flags |= VA_PROC_PIPELINE_FAST; break; case MFX_SCALING_MODE_INTEL_GEN_VDBOX: /* In VPP RT, invalid parameters. */ mfxSts = MFX_ERR_INVALID_VIDEO_PARAM; break; case MFX_SCALING_MODE_INTEL_GEN_VEBOX: m_pipelineParam[0].filter_flags |= VA_FILTER_SCALING_DEFAULT; m_pipelineParam[0].filter_flags |= interpolation[pParams->interpolationMethod]; break; case MFX_SCALING_MODE_DEFAULT: default: /* Force AVS by default for all platforms except BXT */ m_pipelineParam[0].filter_flags |= VA_FILTER_SCALING_HQ; m_pipelineParam[0].filter_flags |= interpolation[pParams->interpolationMethod]; mfxSts = ((pParams->interpolationMethod == MFX_INTERPOLATION_DEFAULT) || (pParams->interpolationMethod == MFX_INTERPOLATION_ADVANCED)) ? MFX_ERR_NONE : MFX_ERR_UNSUPPORTED; break; } MFX_CHECK_STS(mfxSts); uint8_t& chromaSitingMode = m_pipelineParam[0].input_color_properties.chroma_sample_location; chromaSitingMode = VA_CHROMA_SITING_UNKNOWN; switch (pParams->chromaSiting) { case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_TOP: //Option A : Chroma samples are aligned horizontally and vertically with multiples of the luma samples chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_LEFT | VA_CHROMA_SITING_VERTICAL_TOP; break; case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_CENTER: //Option AB : Chroma samples are vertically centered between, but horizontally aligned with luma samples. chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_LEFT | VA_CHROMA_SITING_VERTICAL_CENTER; break; case MFX_CHROMA_SITING_HORIZONTAL_LEFT | MFX_CHROMA_SITING_VERTICAL_BOTTOM: //Option B : Chroma samples are horizontally aligned and vertically 1 pixel offset to the bottom. chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_LEFT | VA_CHROMA_SITING_VERTICAL_BOTTOM; break; case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_CENTER: //Option ABCD : Chroma samples are centered between luma samples both horizontally and vertically. chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_CENTER | VA_CHROMA_SITING_VERTICAL_CENTER; break; case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_TOP: //Option AC : Chroma samples are vertically aligned with, and horizontally centered between luma chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_CENTER | VA_CHROMA_SITING_VERTICAL_TOP; break; case MFX_CHROMA_SITING_HORIZONTAL_CENTER | MFX_CHROMA_SITING_VERTICAL_BOTTOM: //Option BD : Chroma samples are horizontally 0.5 pixel offset to the right and vertically 1 pixel offset to the bottom. chromaSitingMode = VA_CHROMA_SITING_HORIZONTAL_CENTER | VA_CHROMA_SITING_VERTICAL_BOTTOM; break; case MFX_CHROMA_SITING_UNKNOWN: default: break; } m_pipelineParam[0].output_color_properties.chroma_sample_location = chromaSitingMode; if (pParams->mirroringExt) { // First priority is HW fixed function scaling engine. If it can't work, revert to AVS m_pipelineParam[0].filter_flags = VA_FILTER_SCALING_DEFAULT; switch (pParams->mirroring) { case MFX_MIRRORING_VERTICAL: m_pipelineParam[0].mirror_state = VA_MIRROR_VERTICAL; break; case MFX_MIRRORING_HORIZONTAL: m_pipelineParam[0].mirror_state = VA_MIRROR_HORIZONTAL; break; } } // Additional parameters for interlaced cases { if (pParams->targetSurface.frameInfo.PicStruct == MFX_PICSTRUCT_FIELD_TFF && pRefSurf->frameInfo.PicStruct == MFX_PICSTRUCT_FIELD_TFF) { m_pipelineParam[0].input_surface_flag = VA_TOP_FIELD_FIRST; m_pipelineParam[0].output_surface_flag = VA_TOP_FIELD_FIRST; } if (pParams->targetSurface.frameInfo.PicStruct == MFX_PICSTRUCT_FIELD_BFF && pRefSurf->frameInfo.PicStruct == MFX_PICSTRUCT_FIELD_BFF) { m_pipelineParam[0].input_surface_flag = VA_BOTTOM_FIELD_FIRST; m_pipelineParam[0].output_surface_flag = VA_BOTTOM_FIELD_FIRST; } } vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &m_pipelineParam[0], &m_pipelineParamID[0]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); // increase deinterlacer frame count after frame has been processed m_deintFrameCount ++; // for ADI 30i->60p, EOS is received on second field after vpp_reset // reset m_deintFrameCount to zero after processing second field if((pParams->bEOS) && (pParams->bDeinterlace30i60p == true)) m_deintFrameCount = 0; VASurfaceID *outputSurface = (VASurfaceID*)(pParams->targetSurface.hdl.first); MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|VPP|FILTER|PACKET_START|", "%d|%d", m_vaContextVPP, 0); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); vaSts = vaBeginPicture(m_vaDisplay, m_vaContextVPP, *outputSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) if (trigger.id != VA_INVALID_ID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &trigger.id, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #endif { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &m_pipelineParamID[0], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); vaSts = vaEndPicture(m_vaDisplay, m_vaContextVPP); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|VPP|FILTER|PACKET_END|", "%d|%d", m_vaContextVPP, 0); for (VABufferID& id : m_pipelineParamID) { mfxSts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(mfxSts); } mfxSts = RemoveBufferFromPipe(m_deintFilterID); MFX_CHECK_STS(mfxSts); // (3) info needed for sync operation //------------------------------------------------------- { // UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback; // {surface & number_of_task} currentFeedback.surface = *outputSurface; currentFeedback.number = pParams->statusReportID; m_feedbackCache.push_back(currentFeedback); } mfxSts = RemoveBufferFromPipe(m_frcFilterID); MFX_CHECK_STS(mfxSts); return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Execute(FASTCOMP_BLT_PARAMS *pVideoCompositingBlt) mfxStatus VAAPIVideoProcessing::RemoveBufferFromPipe(VABufferID& id) { if (id != VA_INVALID_ID) { VABufferID tmp = id; mfxStatus sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); std::remove(m_filterBufs, m_filterBufs + m_numFilterBufs, tmp); m_filterBufs[m_numFilterBufs] = VA_INVALID_ID; --m_numFilterBufs; } return MFX_ERR_NONE; } BOOL VAAPIVideoProcessing::isVideoWall(mfxExecuteParams *pParams) { BOOL result = false; mfxU16 outputWidth; mfxU16 outputHeight; mfxU16 layerWidth = 0; mfxU16 layerHeight = 0; mfxU16 numX = 0; mfxU16 numY = 0; std::vector indexVW; std::map layout; mfxU32 layerCount = (mfxU32) pParams->fwdRefCount + 1; if ( layerCount % MAX_STREAMS_PER_TILE != 0 ) { /* Number of streams must be multiple of 8. That's just for simplicity. * Need to handle the case when number is not multiple of 8*/ return result; } indexVW.reserve(layerCount); outputWidth = pParams->targetSurface.frameInfo.CropW; outputHeight = pParams->targetSurface.frameInfo.CropH; /**/ layerWidth = pParams->dstRects[0].DstW; numX = outputWidth / layerWidth; layerHeight = pParams->dstRects[0].DstH; numY = outputHeight / layerHeight; // Set up perfect layout of the video wall for ( unsigned int j = 0; j < layerCount; j++ ) { mfxU16 render_order = (j/numX)*numX + (j % numX); compStreamElem element; element.x = (j % numX)*layerWidth; element.y = (j/numX)*layerHeight; layout.insert(std::pair(render_order, element)); } for ( unsigned int i = 0; i < layerCount; i++) { std::map::iterator it; DstRect rect = pParams->dstRects[i]; if ( outputWidth % rect.DstW != 0 ) { /* Layer width should fit output */ return result; } if ( layerWidth != rect.DstW) { /* All layers must have the same width */ return result; } if ( outputHeight % rect.DstH != 0 ) { /* Layer height should fit output */ return result; } if ( layerHeight != rect.DstH) { /* All layers must have the same height */ return result; } mfxU16 render_order = 0; render_order = rect.DstX/(outputWidth/numX); render_order += numX * (rect.DstY/(outputHeight/numY)); it = layout.find(render_order); if ( layout.end() == it ) { /* All layers must have the same height */ return result; } else if (it->second.active) { /* Slot is busy with another layer already */ return result; } else if (it->second.x != rect.DstX || it->second.y != rect.DstY) { /* Layers should be ordered in proper way allowing partial rendering on output */ return result; } else { it->second.active = true; it->second.index = i; indexVW.push_back(render_order); } } if ( numX > 1 && numX % 2 != 0 ) { /* Number of layers on X-axis is not correct */ return result; } if ( numY % 2 != 0 ) { /* Number of layers on Y-axis is not correct */ return result; } result = true; pParams->iTilesNum4Comp = layerCount / MAX_STREAMS_PER_TILE; for ( unsigned int i = 0; i < layerCount; i++) { pParams->dstRects[i].TileId = indexVW[i] / MAX_STREAMS_PER_TILE; } return result; } #ifdef MFX_ENABLE_VPP_COMPOSITION mfxStatus VAAPIVideoProcessing::Execute_Composition_TiledVideoWall(mfxExecuteParams *pParams) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIVideoProcessing::Execute_Composition_TiledVideoWall"); mfxStatus sts; VAStatus vaSts = VA_STATUS_SUCCESS; std::vector blend_state; MFX_CHECK_NULL_PTR1( pParams ); MFX_CHECK_NULL_PTR1( pParams->targetSurface.hdl.first ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces[0].hdl.first ); if ( 0 == pParams->iTilesNum4Comp ) { return MFX_ERR_UNKNOWN; } mfxU32 layerCount = (mfxU32) pParams->fwdRefCount + 1; std::vector tilingParams; tilingParams.resize(pParams->iTilesNum4Comp); for ( unsigned int i = 0; i < tilingParams.size(); i++) { tilingParams[i].targerRect.x = tilingParams[i].targerRect.y = 0x7fff; tilingParams[i].targerRect.width = tilingParams[i].targerRect.height = 0; } m_pipelineParam.resize(pParams->refCount + 1); m_pipelineParamID.resize(pParams->refCount + 1, VA_INVALID_ID); blend_state.resize(pParams->refCount + 1); std::vector input_region; input_region.resize(pParams->refCount + 1); std::vector output_region; output_region.resize(pParams->refCount + 1); /* Initial set up for layers */ for ( unsigned int i = 0; i < layerCount; i++) { mfxDrvSurface* pRefSurf = &(pParams->pRefSurfaces[i]); VASurfaceID* srf = (VASurfaceID*)(pRefSurf->hdl.first); m_pipelineParam[i].surface = *srf; // source cropping mfxU32 refFourcc = pRefSurf->frameInfo.FourCC; switch (refFourcc) { case MFX_FOURCC_RGB4: m_pipelineParam[i].surface_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParam[i].surface_color_standard = VAProcColorStandardBT601; break; } mfxU32 targetFourcc = pParams->targetSurface.frameInfo.FourCC; switch (targetFourcc) { case MFX_FOURCC_RGB4: m_pipelineParam[i].output_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParam[i].output_color_standard = VAProcColorStandardBT601; break; } if(pParams->VideoSignalInfo[i].enabled) { if(pParams->VideoSignalInfo[i].TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[i].surface_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfo[i].TransferMatrix) ? VAProcColorStandardBT709 : VAProcColorStandardBT601; } if(pParams->VideoSignalInfo[i].NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[i].input_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfo[i].NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } switch (pRefSurf->frameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: m_pipelineParam[i].filter_flags = VA_FRAME_PICTURE; break; case MFX_PICSTRUCT_FIELD_TFF: m_pipelineParam[i].filter_flags = VA_TOP_FIELD; break; case MFX_PICSTRUCT_FIELD_BFF: m_pipelineParam[i].filter_flags = VA_BOTTOM_FIELD; break; } /* to process input parameters of sub stream: * crop info and original size*/ mfxFrameInfo *inInfo = &(pRefSurf->frameInfo); input_region[i].y = inInfo->CropY; input_region[i].x = inInfo->CropX; input_region[i].height = inInfo->CropH; input_region[i].width = inInfo->CropW; m_pipelineParam[i].surface_region = &input_region[i]; /* to process output parameters of sub stream: * position and destination size */ output_region[i].y = pParams->dstRects[i].DstY; output_region[i].x = pParams->dstRects[i].DstX; output_region[i].height = pParams->dstRects[i].DstH; output_region[i].width = pParams->dstRects[i].DstW; m_pipelineParam[i].output_region = &output_region[i]; mfxU32 currTileId = pParams->dstRects[i].TileId; if (((currTileId > (pParams->iTilesNum4Comp - 1) )) || (tilingParams[currTileId].numChannels >=8)) { // Maximum number channels in tile is 8 // fallback case return MFX_ERR_INCOMPATIBLE_VIDEO_PARAM; } else { tilingParams[currTileId].channelIds[tilingParams[currTileId].numChannels] = i; tilingParams[currTileId].numChannels++; /* lets define tiles working rectangle */ if (tilingParams[currTileId].targerRect.x > output_region[i].x) tilingParams[currTileId].targerRect.x = output_region[i].x; if (tilingParams[currTileId].targerRect.y > output_region[i].y) tilingParams[currTileId].targerRect.y = output_region[i].y; if (tilingParams[currTileId].targerRect.width < (output_region[i].x + output_region[i].width) ) tilingParams[currTileId].targerRect.width = output_region[i].x + output_region[i].width; if (tilingParams[currTileId].targerRect.height < (output_region[i].y + output_region[i].height) ) tilingParams[currTileId].targerRect.height = output_region[i].y + output_region[i].height; } /* Global alpha and luma key can not be enabled together*/ if (pParams->dstRects[i].GlobalAlphaEnable !=0) { blend_state[i].flags = VA_BLEND_GLOBAL_ALPHA; blend_state[i].global_alpha = ((float)pParams->dstRects[i].GlobalAlpha) /255; } /* Luma color key for YUV surfaces only. * And Premultiplied alpha blending for RGBA surfaces only. * So, these two flags can't combine together */ if ((pParams->dstRects[i].LumaKeyEnable != 0) && (pParams->dstRects[i].PixelAlphaEnable == 0) ) { blend_state[i].flags |= VA_BLEND_LUMA_KEY; blend_state[i].min_luma = ((float)pParams->dstRects[i].LumaKeyMin/255); blend_state[i].max_luma = ((float)pParams->dstRects[i].LumaKeyMax/255); } if ((pParams->dstRects[i].LumaKeyEnable == 0 ) && (pParams->dstRects[i].PixelAlphaEnable != 0 ) ) { blend_state[i].flags |= VA_BLEND_PREMULTIPLIED_ALPHA; } if ((pParams->dstRects[i].GlobalAlphaEnable != 0) || (pParams->dstRects[i].LumaKeyEnable != 0) || (pParams->dstRects[i].PixelAlphaEnable != 0)) { m_pipelineParam[i].blend_state = &blend_state[i]; } m_pipelineParam[i].pipeline_flags |= VA_PROC_PIPELINE_SUBPICTURES; m_pipelineParam[i].filter_flags |= VA_FILTER_SCALING_HQ; m_pipelineParam[i].filters = 0; m_pipelineParam[i].num_filters = 0; m_pipelineParam[i].output_background_color = 0xff000000; vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &m_pipelineParam[i], &m_pipelineParamID[i]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } VASurfaceID *outputSurface = (VASurfaceID*)(pParams->targetSurface.hdl.first); VAProcPipelineParameterBuffer outputparam = {}; VABufferID vpp_pipeline_outbuf = VA_INVALID_ID; MFX_CHECK_NULL_PTR1(outputSurface); /* Process by groups. Video wall case assumes * that surfaces has the same output dimensions * We split output by several horizontal tiles */ for (unsigned int currTile = 0; currTile < tilingParams.size(); currTile++) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); vaSts = vaBeginPicture(m_vaDisplay, m_vaContextVPP, *outputSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); outputparam.surface = *outputSurface; // The targerRect.width and targerRect.height here actually storing the x2 and y2 // value. Deduct x and y respectively to get the exact targerRect.width and // targerRect.height tilingParams[currTile].targerRect.width -= tilingParams[currTile].targerRect.x; tilingParams[currTile].targerRect.height -= tilingParams[currTile].targerRect.y; outputparam.output_region = &tilingParams[currTile].targerRect; outputparam.surface_region = &tilingParams[currTile].targerRect; outputparam.output_background_color = 0; vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &outputparam, &vpp_pipeline_outbuf); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &vpp_pipeline_outbuf, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); for (unsigned int i = 0; i < tilingParams[currTile].numChannels; i++) { vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &m_pipelineParamID[tilingParams[currTile].channelIds[i]], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); vaSts = vaEndPicture(m_vaDisplay, m_vaContextVPP); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } sts = CheckAndDestroyVAbuffer(m_vaDisplay, vpp_pipeline_outbuf); MFX_CHECK_STS(sts); } for (VABufferID& id : m_pipelineParamID) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); } // (3) info needed for sync operation //------------------------------------------------------- { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback; // {surface & number_of_task} currentFeedback.surface = *outputSurface; currentFeedback.number = pParams->statusReportID; m_feedbackCache.push_back(currentFeedback); } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Execute_Composition_TileVideoWall(mfxExecuteParams *pParams) mfxStatus VAAPIVideoProcessing::Execute_Composition(mfxExecuteParams *pParams) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VAAPIVideoProcessing::Execute_Composition"); VAStatus vaSts = VA_STATUS_SUCCESS; VASurfaceAttrib attrib; std::vector blend_state; VAImage imagePrimarySurface; mfxU8* pPrimarySurfaceBuffer; MFX_CHECK_NULL_PTR1( pParams ); MFX_CHECK_NULL_PTR1( pParams->targetSurface.hdl.first ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces ); MFX_CHECK_NULL_PTR1( pParams->pRefSurfaces[0].hdl.first ); mfxU32 refCount = (mfxU32) pParams->fwdRefCount; bool hasResize = false; for(mfxU32 i = 0; i < refCount; i++) { // Check if there is a resize for input streams mfxFrameInfo *surf_info = &(pParams->pRefSurfaces[i].frameInfo); if (surf_info->CropW != pParams->dstRects[i].DstW || surf_info->CropH != pParams->dstRects[i].DstH){ hasResize = true; break; } } if ((m_primarySurface4Composition == NULL) && (pParams->bBackgroundRequired)) { mfxDrvSurface* pRefSurf = &(pParams->targetSurface); mfxFrameInfo *inInfo = &(pRefSurf->frameInfo); m_primarySurface4Composition = (VASurfaceID*)calloc(1,1*sizeof(VASurfaceID)); /* required to check, is memory allocated o not */ if (m_primarySurface4Composition == NULL) return MFX_ERR_MEMORY_ALLOC; attrib.type = VASurfaceAttribPixelFormat; attrib.value.type = VAGenericValueTypeInteger; unsigned int rt_format; // default format is NV12 if (inInfo->FourCC == MFX_FOURCC_RGB4) { attrib.value.value.i = VA_FOURCC_ARGB; rt_format = VA_RT_FORMAT_RGB32; } else if(inInfo->FourCC == MFX_FOURCC_P010 || inInfo->FourCC == MFX_FOURCC_P210 || inInfo->FourCC == MFX_FOURCC_Y210 || inInfo->FourCC == MFX_FOURCC_Y410) { attrib.value.value.i = VA_FOURCC_P010; // We're going to flood fill this surface, so let's use most common 10-bit format rt_format = VA_RT_FORMAT_YUV420_10BPP; } else if(inInfo->FourCC == MFX_FOURCC_P016 || inInfo->FourCC == MFX_FOURCC_Y216 || inInfo->FourCC == MFX_FOURCC_Y416) { attrib.value.value.i = VA_FOURCC_P016; // We're going to flood fill this surface, so let's use most common 10-bit format rt_format = VA_RT_FORMAT_YUV420_10BPP; } else { attrib.value.value.i = VA_FOURCC_NV12; rt_format = VA_RT_FORMAT_YUV420; } attrib.flags = VA_SURFACE_ATTRIB_SETTABLE; // Check what resolution is better. If input surfaces are going to be resized, then // it's better to allocate small surface for background. If there is no resize for // input streams, then it's better to allocate surface with the resolution equal to // the output stream to eliminate resize for background surface. mfxU32 width = hasResize ? VPP_COMP_BACKGROUND_SURFACE_WIDTH : inInfo->Width; mfxU32 height = hasResize ? VPP_COMP_BACKGROUND_SURFACE_HEIGHT : inInfo->Height; vaSts = vaCreateSurfaces(m_vaDisplay, rt_format, width, height, m_primarySurface4Composition, 1, &attrib, 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); for ( int iPrSurfCount = 0; iPrSurfCount < 1; iPrSurfCount++) { vaSts = vaDeriveImage(m_vaDisplay, m_primarySurface4Composition[iPrSurfCount], &imagePrimarySurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaMapBuffer(m_vaDisplay, imagePrimarySurface.buf, (void **) &pPrimarySurfaceBuffer); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); IppiSize roiSize; roiSize.width = imagePrimarySurface.width; roiSize.height = imagePrimarySurface.height; /* We need to fill up empty surface by background color... * iBackgroundColor is now U64, with 16 bits per channel (see mfx_vpp_hw.cpp) * it is easy for ARGB format as Initial background value ARGB*/ if (imagePrimarySurface.format.fourcc == VA_FOURCC_ARGB) { Ipp32u A, R, G, B; Ipp32u iBackgroundColorRGBA; A = (Ipp32u)((pParams->iBackgroundColor >> 48) & 0x00ff); R = (Ipp32u)((pParams->iBackgroundColor >> 32) & 0x00ff); G = (Ipp32u)((pParams->iBackgroundColor >> 16) & 0x00ff); B = (Ipp32u)((pParams->iBackgroundColor >> 0) & 0x00ff); iBackgroundColorRGBA = (A << 24) | (R << 16) | (G << 8) | (B << 0); bool setPlaneSts = SetPlaneROI(iBackgroundColorRGBA, (Ipp32u *)pPrimarySurfaceBuffer, imagePrimarySurface.pitches[0], roiSize); MFX_CHECK(setPlaneSts, MFX_ERR_DEVICE_FAILED); } /* A bit more complicated for NV12 as you need to do conversion ARGB => NV12 */ if (imagePrimarySurface.format.fourcc == VA_FOURCC_NV12) { Ipp32u Y = (Ipp32u)((pParams->iBackgroundColor >> 32) & 0x00ff); Ipp32u U = (Ipp32u)((pParams->iBackgroundColor >> 16) & 0x00ff); Ipp32u V = (Ipp32u)((pParams->iBackgroundColor >> 0) & 0x00ff); uint8_t valueY = (uint8_t) Y; int16_t valueUV = (int16_t)((V<<8) + U); // Keep in mind that short is stored in memory using little-endian notation bool setPlaneSts = SetPlaneROI(valueY, pPrimarySurfaceBuffer, imagePrimarySurface.pitches[0], roiSize); MFX_CHECK(setPlaneSts, MFX_ERR_DEVICE_FAILED); // NV12 format -> need to divide height 2 times less roiSize.height = roiSize.height/2; // "UV" this is short (16 bit) value already // so need to divide width 2 times less too! roiSize.width = roiSize.width/2; setPlaneSts = SetPlaneROI(valueUV, (Ipp16s *)(pPrimarySurfaceBuffer + imagePrimarySurface.offsets[1]), imagePrimarySurface.pitches[1], roiSize); MFX_CHECK(setPlaneSts, MFX_ERR_DEVICE_FAILED); } if (imagePrimarySurface.format.fourcc == VA_FOURCC_P010 || imagePrimarySurface.format.fourcc == VA_FOURCC_P016) { uint32_t Y=0; uint32_t U=0; uint32_t V=0; if(imagePrimarySurface.format.fourcc == VA_FOURCC_P010 ) { Y = (uint32_t)((pParams->iBackgroundColor >> 26) & 0xffC0); U = (uint32_t)((pParams->iBackgroundColor >> 10) & 0xffC0); V = (uint32_t)((pParams->iBackgroundColor << 6) & 0xffC0); } else { // 12 bit depth is used for these CCs Y = (uint32_t)((pParams->iBackgroundColor >> 28) & 0xfff0); U = (uint32_t)((pParams->iBackgroundColor >> 12) & 0xfff0); V = (uint32_t)((pParams->iBackgroundColor << 4) & 0xfff0); } uint16_t valueY = (uint16_t)Y; uint32_t valueUV = (int32_t)((V << 16) + U); // Keep in mind that short is stored in memory using little-endian notation bool setPlaneSts = SetPlaneROI(valueY, (uint16_t*)pPrimarySurfaceBuffer, imagePrimarySurface.pitches[0], roiSize); MFX_CHECK(setPlaneSts, MFX_ERR_DEVICE_FAILED); // NV12 format -> need to divide height 2 times less roiSize.height = roiSize.height / 2; // "UV" encodes 2 pixels in a row // so need to divide width 2 times roiSize.width = roiSize.width / 2; setPlaneSts = SetPlaneROI(valueUV, (uint32_t *)(pPrimarySurfaceBuffer + imagePrimarySurface.offsets[1]), imagePrimarySurface.pitches[1], roiSize); MFX_CHECK(setPlaneSts, MFX_ERR_DEVICE_FAILED); } vaSts = vaUnmapBuffer(m_vaDisplay, imagePrimarySurface.buf); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); vaSts = vaDestroyImage(m_vaDisplay, imagePrimarySurface.image_id); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } // for ( int iPrSurfCount = 0; iPrSurfCount < 3; iPrSurfCount++) } /* pParams->refCount is total number of processing surfaces: * in case of composition this is primary + sub streams*/ mfxU32 SampleCount = 1; mfxU32 refIdx = 0; m_pipelineParam.resize(pParams->refCount + 1); m_pipelineParamID.resize(pParams->refCount + 1, VA_INVALID_ID); blend_state.resize(pParams->refCount + 1); std::vector input_region; input_region.resize(pParams->refCount + 1); std::vector output_region; output_region.resize(pParams->refCount + 1); VASurfaceID *outputSurface = (VASurfaceID*)(pParams->targetSurface.hdl.first); for( refIdx = 0; refIdx < SampleCount; refIdx++ ) { mfxDrvSurface* pRefSurf = &(pParams->targetSurface); memset(&m_pipelineParam[refIdx], 0, sizeof(m_pipelineParam[refIdx])); //VASurfaceID* srf_1 = (VASurfaceID*)(pRefSurf->hdl.first); //m_pipelineParam[refIdx].surface = *srf_1; /* First "primary" surface should be our allocated empty surface filled by background color. * Else we can not process first input surface as usual one */ if (pParams->bBackgroundRequired) m_pipelineParam[refIdx].surface = m_primarySurface4Composition[0]; //VASurfaceID *outputSurface = (VASurfaceID*)(pParams->targetSurface.hdl.first); //m_pipelineParam[refIdx].surface = *outputSurface; // source cropping //mfxFrameInfo *inInfo = &(pRefSurf->frameInfo); mfxFrameInfo *outInfo = &(pParams->targetSurface.frameInfo); input_region[refIdx].y = 0; input_region[refIdx].x = 0; input_region[refIdx].height = outInfo->CropH; input_region[refIdx].width = outInfo->CropW; m_pipelineParam[refIdx].surface_region = &input_region[refIdx]; // destination cropping //mfxFrameInfo *outInfo = &(pParams->targetSurface.frameInfo); output_region[refIdx].y = 0; //outInfo->CropY; output_region[refIdx].x = 0; //outInfo->CropX; output_region[refIdx].height= outInfo->CropH; output_region[refIdx].width = outInfo->CropW; m_pipelineParam[refIdx].output_region = &output_region[refIdx]; /* Actually as background color managed by "m_primarySurface4Composition" surface * this param will not make sense */ //m_pipelineParam[refIdx].output_background_color = pParams->iBackgroundColor; mfxU32 refFourcc = pRefSurf->frameInfo.FourCC; switch (refFourcc) { case MFX_FOURCC_RGB4: m_pipelineParam[refIdx].surface_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParam[refIdx].surface_color_standard = VAProcColorStandardBT601; break; } mfxU32 targetFourcc = pParams->targetSurface.frameInfo.FourCC; switch (targetFourcc) { case MFX_FOURCC_RGB4: m_pipelineParam[refIdx].output_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParam[refIdx].output_color_standard = VAProcColorStandardBT601; break; } if(refIdx > 0 && pParams->VideoSignalInfo[refIdx-1].enabled) { if(pParams->VideoSignalInfo[refIdx-1].TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[refIdx].surface_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfo[refIdx-1].TransferMatrix) ? VAProcColorStandardBT709 : VAProcColorStandardBT601; } if(pParams->VideoSignalInfo[refIdx-1].NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[refIdx].input_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfo[refIdx-1].NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } if (pParams->VideoSignalInfoOut.enabled) { if(pParams->VideoSignalInfoOut.TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[refIdx].output_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfoOut.TransferMatrix ? VAProcColorStandardBT709 : VAProcColorStandardBT601); } if(pParams->VideoSignalInfoOut.NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[refIdx].output_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfoOut.NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } m_pipelineParam[refIdx].input_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; m_pipelineParam[refIdx].output_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; switch (pRefSurf->frameInfo.PicStruct) { case MFX_PICSTRUCT_PROGRESSIVE: default: m_pipelineParam[refIdx].filter_flags = VA_FRAME_PICTURE; break; } m_pipelineParam[refIdx].filters = m_filterBufs; m_pipelineParam[refIdx].num_filters = m_numFilterBufs; /* Special case for composition: * as primary surface processed as sub-stream * pipeline and filter properties should be *_FAST */ if (pParams->bComposite) { m_pipelineParam[refIdx].num_filters = 0; m_pipelineParam[refIdx].pipeline_flags |= VA_PROC_PIPELINE_SUBPICTURES; m_pipelineParam[refIdx].filter_flags |= VA_FILTER_SCALING_HQ; } } { MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|VPP|COMP|PACKET_START|", "%d|%d", m_vaContextVPP, 0); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "vaBeginPicture"); vaSts = vaBeginPicture(m_vaDisplay, m_vaContextVPP, *outputSurface); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } if (pParams->bBackgroundRequired) { refIdx = 0; vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &m_pipelineParam[refIdx], &m_pipelineParamID[refIdx]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "vaRenderPicture"); for( refIdx = 0; refIdx < SampleCount; refIdx++ ) { vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &m_pipelineParamID[refIdx], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } } // if (pParams->bBackgroundRequired) unsigned int uBeginPictureCounter = 0; std::vector m_pipelineParamComp; std::vector m_pipelineParamCompID; /* for new buffers for Begin Picture*/ m_pipelineParamComp.resize(pParams->fwdRefCount/7); m_pipelineParamCompID.resize(pParams->fwdRefCount/7, VA_INVALID_ID); /* pParams->fwdRefCount actually is number of sub stream*/ for( refIdx = 1; refIdx <= (refCount + 1); refIdx++ ) { /*for frames 8, 15, 22, 29,... */ if ((refIdx != 1) && ((refIdx %7) == 1) ) { { vaSts = vaBeginPicture(m_vaDisplay, m_vaContextVPP, *outputSurface); } MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); /*to copy initial properties of primary surface... */ m_pipelineParamComp[uBeginPictureCounter] = m_pipelineParam[0]; /* ... and to In-place output*/ //m_pipelineParamComp[uBeginPictureCounter].surface = m_primarySurface4Composition[uInputIndex]; m_pipelineParamComp[uBeginPictureCounter].surface = *outputSurface; //m_pipelineParam[0].surface = *outputSurface; /* As used IN-PLACE variant of Composition * this values does not used*/ //uOutputIndex++; //uInputIndex++; //if (uOutputIndex > 2) // uOutputIndex = 0; //if (uInputIndex > 2) // uInputIndex = 0; switch (pParams->targetSurface.frameInfo.FourCC) { case MFX_FOURCC_RGB4: m_pipelineParamComp[uBeginPictureCounter].surface_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParamComp[uBeginPictureCounter].surface_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfoOut.TransferMatrix) ? VAProcColorStandardBT709 : VAProcColorStandardBT601; break; } vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &m_pipelineParamComp[uBeginPictureCounter], &m_pipelineParamCompID[uBeginPictureCounter]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "vaBeginPicture"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &m_pipelineParamCompID[uBeginPictureCounter], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); uBeginPictureCounter++; } m_pipelineParam[refIdx] = m_pipelineParam[0]; mfxDrvSurface* pRefSurf = &(pParams->pRefSurfaces[refIdx-1]); VASurfaceID* srf_2 = (VASurfaceID*)(pRefSurf->hdl.first); m_pipelineParam[refIdx].surface = *srf_2; mfxU32 refFourcc = pRefSurf->frameInfo.FourCC; switch (refFourcc) { case MFX_FOURCC_RGB4: m_pipelineParam[refIdx].surface_color_standard = VAProcColorStandardNone; break; case MFX_FOURCC_NV12: default: m_pipelineParam[refIdx].surface_color_standard = VAProcColorStandardBT601; break; } if(refIdx > 0 && pParams->VideoSignalInfo[refIdx-1].enabled) { if(pParams->VideoSignalInfo[refIdx-1].TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[refIdx].surface_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfo[refIdx-1].TransferMatrix ? VAProcColorStandardBT709 : VAProcColorStandardBT601); } if(pParams->VideoSignalInfo[refIdx-1].NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[refIdx].input_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfo[refIdx-1].NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } if (pParams->VideoSignalInfoOut.enabled) { if(pParams->VideoSignalInfoOut.TransferMatrix != MFX_TRANSFERMATRIX_UNKNOWN) { m_pipelineParam[refIdx].output_color_standard = (MFX_TRANSFERMATRIX_BT709 == pParams->VideoSignalInfoOut.TransferMatrix ? VAProcColorStandardBT709 : VAProcColorStandardBT601); } if(pParams->VideoSignalInfoOut.NominalRange != MFX_NOMINALRANGE_UNKNOWN) { m_pipelineParam[refIdx].output_color_properties.color_range = (MFX_NOMINALRANGE_0_255 == pParams->VideoSignalInfoOut.NominalRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; } } m_pipelineParam[refIdx].input_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; m_pipelineParam[refIdx].output_color_properties.chroma_sample_location = VA_CHROMA_SITING_UNKNOWN; if (pParams->m_inVideoSignalInfo.enabled) { // Video Range m_pipelineParam[0].input_color_properties.color_range = (pParams->m_inVideoSignalInfo.VideoFullRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; switch (pParams->m_inVideoSignalInfo.ColourPrimaries) { case 9: // BT.2020 m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT2020; break; case 1: // BT.709 m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT709; break; case 6: default: m_pipelineParam[0].surface_color_standard = VAProcColorStandardBT601; break; } } if (pParams->m_outVideoSignalInfo.enabled) { // Video Range m_pipelineParam[0].output_color_properties.color_range = (pParams->m_outVideoSignalInfo.VideoFullRange) ? VA_SOURCE_RANGE_FULL : VA_SOURCE_RANGE_REDUCED; switch (pParams->m_outVideoSignalInfo.ColourPrimaries) { case 9: // BT.2020 m_pipelineParam[0].output_color_standard = VAProcColorStandardBT2020; break; case 1: // BT.709 m_pipelineParam[0].output_color_standard = VAProcColorStandardBT709; break; case 6: default: m_pipelineParam[0].output_color_standard = VAProcColorStandardBT601; break; } } /* to process input parameters of sub stream: * crop info and original size*/ mfxFrameInfo *inInfo = &(pRefSurf->frameInfo); input_region[refIdx].y = inInfo->CropY; input_region[refIdx].x = inInfo->CropX; input_region[refIdx].height = inInfo->CropH; input_region[refIdx].width = inInfo->CropW; m_pipelineParam[refIdx].surface_region = &input_region[refIdx]; /* to process output parameters of sub stream: * position and destination size */ output_region[refIdx].y = pParams->dstRects[refIdx-1].DstY; output_region[refIdx].x = pParams->dstRects[refIdx-1].DstX; output_region[refIdx].height= pParams->dstRects[refIdx-1].DstH; output_region[refIdx].width = pParams->dstRects[refIdx-1].DstW; m_pipelineParam[refIdx].output_region = &output_region[refIdx]; /* Global alpha and luma key can not be enabled together*/ /* Global alpha and luma key can not be enabled together*/ if (pParams->dstRects[refIdx-1].GlobalAlphaEnable !=0) { blend_state[refIdx].flags = VA_BLEND_GLOBAL_ALPHA; blend_state[refIdx].global_alpha = ((float)pParams->dstRects[refIdx-1].GlobalAlpha) /255; } /* Luma color key for YUV surfaces only. * And Premultiplied alpha blending for RGBA surfaces only. * So, these two flags can't combine together */ if ((pParams->dstRects[refIdx-1].LumaKeyEnable != 0) && (pParams->dstRects[refIdx-1].PixelAlphaEnable == 0) ) { blend_state[refIdx].flags |= VA_BLEND_LUMA_KEY; blend_state[refIdx].min_luma = ((float)pParams->dstRects[refIdx-1].LumaKeyMin/255); blend_state[refIdx].max_luma = ((float)pParams->dstRects[refIdx-1].LumaKeyMax/255); } if ((pParams->dstRects[refIdx-1].LumaKeyEnable == 0 ) && (pParams->dstRects[refIdx-1].PixelAlphaEnable != 0 ) ) { /* Per-pixel alpha case. Having VA_BLEND_PREMULTIPLIED_ALPHA as a parameter * leads to using BLEND_PARTIAL approach by driver that may produce * "white line"-like artifacts on transparent-opaque borders. * Setting nothing here triggers using a BLEND_SOURCE approach that is used on * Windows and looks to be free of such kind of artifacts */ blend_state[refIdx].flags |= 0; } if ((pParams->dstRects[refIdx-1].GlobalAlphaEnable != 0) || (pParams->dstRects[refIdx-1].LumaKeyEnable != 0) || (pParams->dstRects[refIdx-1].PixelAlphaEnable != 0)) { m_pipelineParam[refIdx].blend_state = &blend_state[refIdx]; } //m_pipelineParam[refIdx].pipeline_flags = ?? //VA_PROC_PIPELINE_FAST or VA_PROC_PIPELINE_SUBPICTURES m_pipelineParam[refIdx].pipeline_flags |= VA_PROC_PIPELINE_FAST; m_pipelineParam[refIdx].filter_flags |= VA_FILTER_SCALING_FAST; m_pipelineParam[refIdx].filters = m_filterBufs; m_pipelineParam[refIdx].num_filters = 0; vaSts = vaCreateBuffer(m_vaDisplay, m_vaContextVPP, VAProcPipelineParameterBufferType, sizeof(VAProcPipelineParameterBuffer), 1, &m_pipelineParam[refIdx], &m_pipelineParamID[refIdx]); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "vaRenderPicture"); vaSts = vaRenderPicture(m_vaDisplay, m_vaContextVPP, &m_pipelineParamID[refIdx], 1); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); /*for frames 7, 14, 21, ... * or for the last frame*/ if ( ((refIdx % 7) ==0) || ((refCount + 1) == refIdx) ) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "vaEndPicture"); vaSts = vaEndPicture(m_vaDisplay, m_vaContextVPP); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } } /* for( refIdx = 1; refIdx <= (pParams->fwdRefCount); refIdx++ )*/ MFX_LTRACE_2(MFX_TRACE_LEVEL_HOTSPOTS, "A|VPP|COMP|PACKET_END|", "%d|%d", m_vaContextVPP, 0); mfxStatus sts; for (VABufferID& id : m_pipelineParamCompID) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); } for (VABufferID& id : m_pipelineParamID) { sts = CheckAndDestroyVAbuffer(m_vaDisplay, id); MFX_CHECK_STS(sts); } // (3) info needed for sync operation //------------------------------------------------------- { UMC::AutomaticUMCMutex guard(m_guard); ExtVASurface currentFeedback; // {surface & number_of_task} currentFeedback.surface = *outputSurface; currentFeedback.number = pParams->statusReportID; m_feedbackCache.push_back(currentFeedback); } return MFX_ERR_NONE; } // mfxStatus VAAPIVideoProcessing::Execute_Composition(mfxExecuteParams *pParams) #else mfxStatus VAAPIVideoProcessing::Execute_Composition_TiledVideoWall(mfxExecuteParams *pParams) { return MFX_ERR_UNSUPPORTED; } mfxStatus VAAPIVideoProcessing::Execute_Composition(mfxExecuteParams *pParams) { return MFX_ERR_UNSUPPORTED; } #endif //#ifdef MFX_ENABLE_VPP_COMPOSITION mfxStatus VAAPIVideoProcessing::QueryTaskStatus(SynchronizedTask* pSyncTask) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VPP DDIWaitTaskSync"); #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) VASurfaceID waitSurface = VA_INVALID_SURFACE; mfxU32 indxSurf = 0; // (1) find params (sutface & number) are required by feedbackNumber //----------------------------------------------- { UMC::AutomaticUMCMutex guard(m_guard); for (indxSurf = 0; indxSurf < m_feedbackCache.size(); indxSurf++) { if (m_feedbackCache[indxSurf].number == pSyncTask->taskIndex) { waitSurface = m_feedbackCache[indxSurf].surface; break; } } if (VA_INVALID_SURFACE == waitSurface) { return MFX_ERR_UNKNOWN; } m_feedbackCache.erase(m_feedbackCache.begin() + indxSurf); } #if !defined(ANDROID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncSurface"); VAStatus vaSts = vaSyncSurface(m_vaDisplay, waitSurface); if (vaSts == VA_STATUS_ERROR_HW_BUSY) return MFX_ERR_GPU_HANG; else MFX_CHECK(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); } #endif return MFX_TASK_DONE; #else FASTCOMP_QUERY_STATUS queryStatus; // (1) find params (sutface & number) are required by feedbackNumber //----------------------------------------------- { UMC::AutomaticUMCMutex guard(m_guard); std::vector::iterator iter = m_feedbackCache.begin(); while(iter != m_feedbackCache.end()) { ExtVASurface currentFeedback = *iter; VASurfaceStatus surfSts = VASurfaceSkipped; VAStatus vaSts = vaQuerySurfaceStatus(m_vaDisplay, currentFeedback.surface, &surfSts); MFX_CHECK_WITH_ASSERT(VA_STATUS_SUCCESS == vaSts, MFX_ERR_DEVICE_FAILED); switch (surfSts) { case VASurfaceReady: queryStatus.QueryStatusID = currentFeedback.number; queryStatus.Status = VPREP_GPU_READY; m_cachedReadyTaskIndex.insert(queryStatus.QueryStatusID); iter = m_feedbackCache.erase(iter); break; case VASurfaceRendering: case VASurfaceDisplaying: ++iter; break; case VASurfaceSkipped: default: assert(!"bad feedback status"); return MFX_ERR_DEVICE_FAILED; } } std::set::iterator iterator = m_cachedReadyTaskIndex.find(pSyncTask->taskIndex); if (m_cachedReadyTaskIndex.end() == iterator) { return MFX_TASK_BUSY; } m_cachedReadyTaskIndex.erase(iterator); } return MFX_TASK_DONE; #endif } // mfxStatus VAAPIVideoProcessing::QueryTaskStatus(SynchronizedTask* pSyncTask) #endif // #if defined (MFX_VPP_ENABLE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/000077500000000000000000000000001443134507600227675ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/CMakeLists.txt000066400000000000000000000050131443134507600255260ustar00rootroot00000000000000# Copyright (c) 2017-2019 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. ### UMC vm add_subdirectory(core/vm) ### UMC vm plus add_subdirectory(core/vm_plus) ### UMC core umc add_subdirectory(core/umc) ### UMC VA (ex. umc_va_elk) add_library(umc_va_hw STATIC) set_property(TARGET umc_va_hw PROPERTY FOLDER "umc") target_sources(umc_va_hw PRIVATE io/umc_va/include/umc_va.h io/umc_va/include/umc_va_linux.h io/umc_va/include/umc_va_video_processing.h io/umc_va/src/umc_va_linux.cpp io/umc_va/src/umc_va_video_processing.cpp ) target_compile_definitions(umc_va_hw PRIVATE ${API_FLAGS} ${WARNING_FLAGS} ) target_include_directories(umc_va_hw PUBLIC io/umc_va/include ) target_link_libraries(umc_va_hw PUBLIC umc $<$:va> ) ### UMC VA ### UMC codec brc add_library(bitrate_control STATIC) set_property(TARGET bitrate_control PROPERTY FOLDER "umc") target_sources(bitrate_control PRIVATE codec/brc/include/umc_brc.h codec/brc/include/umc_h264_brc.h codec/brc/include/umc_mpeg2_brc.h codec/brc/include/umc_video_brc.h codec/brc/src/umc_brc.cpp codec/brc/src/umc_h264_brc.cpp codec/brc/src/umc_mpeg2_brc.cpp codec/brc/src/umc_video_brc.cpp ) target_include_directories(bitrate_control PUBLIC core/umc/include codec/brc/include PRIVATE codec/h264_enc/include ) target_link_libraries(bitrate_control PUBLIC umc) ### UMC codec brc include(sources_ext.cmake OPTIONAL) include(sources_tool_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/000077500000000000000000000000001443134507600240445ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/000077500000000000000000000000001443134507600253465ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/CMakeLists.txt000066400000000000000000000021151443134507600301050ustar00rootroot00000000000000if( NOT MFX_LIB_ONLY ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/umc/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/vm/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/vm_plus/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../io/media_buffers/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../api/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../mfx_lib/shared/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../io/umc_va/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../codec/vp9_dec/include ) set( sources "" ) file( GLOB_RECURSE srcs "src/*.c" "src/*.cpp" ) list( APPEND sources ${srcs}) list( APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/../../codec/vp9_dec/src/umc_vp9_bitstream.cpp ) set( defs "${API_FLAGS} ${WARNING_FLAGS} -DUMC_AV1_DECODER_REV=8500" ) make_library( umc_av1 hw static ) set( defs "" ) endif(0) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/000077500000000000000000000000001443134507600267715ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_bitstream.h000066400000000000000000000044311443134507600325510ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_av1_frame.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_BITSTREAM_H_ #define __UMC_AV1_BITSTREAM_H_ #include "umc_vp9_bitstream.h" namespace UMC_AV1_DECODER { class AV1DecoderFrame; class AV1Bitstream : public UMC_VP9_DECODER::VP9Bitstream { public: void ReadOBUInfo(OBUInfo&); void ReadTileGroupHeader(FrameHeader const&, TileGroupInfo&); void ReadTile(uint32_t const, size_t&, size_t&); void ReadTileListHeader(FrameHeader const&, TileListInfo&); void ReadTileListEntry(TileListInfo const&, TileLocation&); void ReadTileListEntryData(size_t const tileSizeBytes, size_t& actualSize); void ReadByteAlignment(); uint64_t GetLE(uint32_t); void ReadSequenceHeader(SequenceHeader&); void ReadUncompressedHeader(FrameHeader&, SequenceHeader const&, DPBType const&, OBUHeader const&, uint32_t&); using UMC_VP9_DECODER::VP9Bitstream::VP9Bitstream; uint8_t GetBit() { return static_cast(UMC_VP9_DECODER::VP9Bitstream::GetBit()); } }; } #endif // __UMC_AV1_BITSTREAM_H_ #endif // MFX_ENABLE_AV1_VIDEO_DECODE umc_av1_bitstream_utils.h000066400000000000000000000256671443134507600337300ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_BITSTREAM_UTILS_H_ #define __UMC_AV1_BITSTREAM_UTILS_H_ #include #include "mfx_utils.h" #include "umc_av1_bitstream.h" #include "umc_vp9_utils.h" namespace UMC_AV1_DECODER { inline int read_inv_signed_literal(AV1Bitstream& bs, int bits) { const unsigned sign = bs.GetBit(); const unsigned literal = bs.GetBits(bits); if (sign == 0) return literal; // if positive: literal else return literal - (1 << bits); // if negative: complement to literal with respect to 2^bits } inline int32_t read_uniform(AV1Bitstream& bs, uint32_t n) { const uint32_t l = UMC_VP9_DECODER::GetUnsignedBits(n); const uint32_t m = (1 << l) - n; const uint32_t v = bs.GetBits(l - 1); if (v < m) return v; else return (v << 1) - m + bs.GetBits(1); } inline uint32_t read_uvlc(AV1Bitstream& bs) { uint32_t leading_zeros = 0; while (!bs.GetBit()) ++leading_zeros; // Maximum 32 bits. if (leading_zeros >= 32) return std::numeric_limits::max(); const uint32_t base = (1u << leading_zeros) - 1; const uint32_t value = bs.GetBits(leading_zeros); return base + value; } inline uint16_t inv_recenter_non_neg(uint16_t r, uint16_t v) { if (v >(r << 1)) return v; else if ((v & 1) == 0) return (v >> 1) + r; else return r - ((v + 1) >> 1); } inline uint16_t inv_recenter_finite_non_neg(uint16_t n, uint16_t r, uint16_t v) { if ((r << 1) <= n) { return inv_recenter_non_neg(r, v); } else { return n - 1 - inv_recenter_non_neg(n - 1 - r, v); } } inline uint8_t get_msb(uint32_t n) { if (n == 0) throw av1_exception(UMC::UMC_ERR_FAILED); uint8_t pos = 0; while (n > 1) { pos++; n >>= 1; } return pos; } inline uint16_t read_primitive_quniform(AV1Bitstream& bs, uint16_t n) { if (n <= 1) return 0; uint8_t l = get_msb(n - 1) + 1; const int m = (1 << l) - n; const int v = bs.GetBits(l - 1); const int result = v < m ? v : (v << 1) - m + bs.GetBit(); return static_cast(result); } inline uint16_t read_primitive_subexpfin(AV1Bitstream& bs, uint16_t n, uint16_t k) { int i = 0; int mk = 0; uint16_t v; while (1) { int b = (i ? k + i - 1 : k); int a = (1 << b); if (n <= mk + 3 * a) { v = static_cast(read_primitive_quniform(bs, static_cast(n - mk)) + mk); break; } else { if (bs.GetBit()) { i = i + 1; mk += a; } else { v = static_cast(bs.GetBits(b) + mk); break; } } } return v; } inline uint16_t read_primitive_refsubexpfin(AV1Bitstream& bs, uint16_t n, uint16_t k, uint16_t ref) { return inv_recenter_finite_non_neg(n, ref, read_primitive_subexpfin(bs, n, k)); } inline int16_t read_signed_primitive_refsubexpfin(AV1Bitstream& bs, uint16_t n, uint16_t k, int16_t ref) { ref += n - 1; const uint16_t scaled_n = (n << 1) - 1; return read_primitive_refsubexpfin(bs, scaled_n, k, ref) - n + 1; } inline size_t read_leb128(AV1Bitstream& bs) { size_t value = 0; for (size_t i = 0; i < MAX_LEB128_SIZE; ++i) { const uint8_t cur_byte = static_cast(bs.GetBits(8)); const uint8_t decoded_byte = cur_byte & LEB128_BYTE_MASK; value |= ((uint64_t)decoded_byte) << (i * 7); if ((cur_byte & ~LEB128_BYTE_MASK) == 0) return value; } throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } const uint8_t DIV_LUT_PREC_BITS = 14; const uint8_t DIV_LUT_BITS = 8; const uint16_t DIV_LUT_NUM = (1 << DIV_LUT_BITS); static const uint16_t div_lut[DIV_LUT_NUM + 1] = { 16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768, 15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142, 15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564, 14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028, 13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530, 13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066, 13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633, 12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228, 12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848, 11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491, 11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155, 11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838, 10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538, 10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255, 10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986, 9963, 9939, 9916, 9892, 9869, 9846, 9823, 9800, 9777, 9754, 9732, 9709, 9687, 9664, 9642, 9620, 9598, 9576, 9554, 9533, 9511, 9489, 9468, 9447, 9425, 9404, 9383, 9362, 9341, 9321, 9300, 9279, 9259, 9239, 9218, 9198, 9178, 9158, 9138, 9118, 9098, 9079, 9059, 9039, 9020, 9001, 8981, 8962, 8943, 8924, 8905, 8886, 8867, 8849, 8830, 8812, 8793, 8775, 8756, 8738, 8720, 8702, 8684, 8666, 8648, 8630, 8613, 8595, 8577, 8560, 8542, 8525, 8508, 8490, 8473, 8456, 8439, 8422, 8405, 8389, 8372, 8355, 8339, 8322, 8306, 8289, 8273, 8257, 8240, 8224, 8208, 8192, }; /* Shift down with rounding for use when n >= 0, value >= 0 */ inline uint64_t round_power_of_two(uint64_t value, uint16_t n) { return (value + ((static_cast(1) << n) >> 1)) >> n; } /* Shift down with rounding for signed integers, for use when n >= 0 */ inline int64_t round_power_of_two_signed(int64_t value, uint16_t n) { return (value < 0) ? -(static_cast(round_power_of_two(-value, n))) : round_power_of_two(value, n); } // Decomposes a divisor D such that 1/D = y/2^shift, where y is returned // at precision of DIV_LUT_PREC_BITS along with the shift. inline int16_t resolve_divisor_32(uint32_t D, uint16_t& shift) { int32_t f; shift = get_msb(D); // e is obtained from D after resetting the most significant 1 bit. const int32_t e = D - (static_cast < uint32_t>(1) << shift); // Get the most significant DIV_LUT_BITS (8) bits of e into f if (shift > DIV_LUT_BITS) f = static_cast(round_power_of_two(e, shift - DIV_LUT_BITS)); else f = e << (DIV_LUT_BITS - shift); assert(f <= DIV_LUT_NUM); shift += DIV_LUT_PREC_BITS; // Use f as lookup into the precomputed table of multipliers return div_lut[f]; } inline bool is_affine_valid(GlobalMotionParams const & params) { return (params.wmmat[2] > 0); } inline bool is_affine_shear_allowed(int16_t alpha, int16_t beta, int16_t gamma, int16_t delta) { if ((4 * abs(alpha) + 7 * abs(beta) >= (1 << WARPEDMODEL_PREC_BITS)) || (4 * abs(gamma) + 4 * abs(delta) >= (1 << WARPEDMODEL_PREC_BITS))) return false; else return true; } inline bool av1_get_shear_params(GlobalMotionParams& params) { if (!is_affine_valid(params)) return false; const int32_t int16Min = std::numeric_limits::min(); const int32_t int16Max = std::numeric_limits::max(); params.alpha = static_cast(mfx::clamp(params.wmmat[2] - (1 << WARPEDMODEL_PREC_BITS), int16Min, int16Max)); params.beta = static_cast(mfx::clamp(params.wmmat[3], int16Min, int16Max)); uint16_t shift; int16_t y = resolve_divisor_32(abs(params.wmmat[2]), shift) * (params.wmmat[2] < 0 ? -1 : 1); int64_t v = ((int64_t)params.wmmat[4] * (1 << WARPEDMODEL_PREC_BITS)) * y; params.gamma = static_cast(mfx::clamp((int)round_power_of_two_signed(v, shift), int16Min, int16Max)); v = ((int64_t)params.wmmat[3] * params.wmmat[4]) * y; params.delta = static_cast(mfx::clamp(params.wmmat[5] - (int)round_power_of_two_signed(v, shift) - (1 << WARPEDMODEL_PREC_BITS), int16Min, int16Max)); params.alpha = static_cast(round_power_of_two_signed(params.alpha, WARP_PARAM_REDUCE_BITS) * (1 << WARP_PARAM_REDUCE_BITS)); params.beta = static_cast(round_power_of_two_signed(params.beta, WARP_PARAM_REDUCE_BITS) * (1 << WARP_PARAM_REDUCE_BITS)); params.gamma = static_cast(round_power_of_two_signed(params.gamma, WARP_PARAM_REDUCE_BITS) * (1 << WARP_PARAM_REDUCE_BITS)); params.delta = static_cast(round_power_of_two_signed(params.delta, WARP_PARAM_REDUCE_BITS) * (1 << WARP_PARAM_REDUCE_BITS)); if (!is_affine_shear_allowed(params.alpha, params.beta, params.gamma, params.delta)) return false; return true; } } #endif // __UMC_AV1_BITSTREAM_H_ #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_dec_defs.h000066400000000000000000000541341443134507600323200ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_DEC_DEFS_DEC_H__ #define __UMC_AV1_DEC_DEFS_DEC_H__ #include #include #include "umc_structures.h" #include "umc_vp9_dec_defs.h" namespace UMC_AV1_DECODER { class AV1DecoderFrame; typedef std::vector DPBType; using UMC_VP9_DECODER::NUM_REF_FRAMES; const uint8_t SYNC_CODE_0 = 0x49; const uint8_t SYNC_CODE_1 = 0x83; const uint8_t SYNC_CODE_2 = 0x43; const uint8_t FRAME_MARKER = 0x2; const uint8_t MINIMAL_DATA_SIZE = 3; const uint8_t INTER_REFS = 7; const uint8_t TOTAL_REFS = 8; const uint8_t QM_LEVEL_BITS = 4; const uint8_t LOG2_SWITCHABLE_FILTERS = 2; const uint8_t CDEF_MAX_STRENGTHS = 8; const uint8_t CDEF_STRENGTH_BITS = 6; const uint8_t MAX_MB_PLANE = 3; const uint8_t MAX_LEB128_SIZE = 8; const uint8_t LEB128_BYTE_MASK = 0x7f; const uint8_t MAX_SB_SIZE_LOG2 = 7; const uint16_t RESTORATION_UNITSIZE_MAX = 256; const uint16_t MAX_ANCHOR_SIZE = 128; const int32_t AV1_INVALID_IDX = -1; const uint8_t MI_SIZE_LOG2 = 2; const uint8_t MI_SIZE = (1 << MI_SIZE_LOG2); const uint8_t MAX_MIB_SIZE_LOG2 = MAX_SB_SIZE_LOG2 - MI_SIZE_LOG2; const uint8_t SCALE_NUMERATOR = 8; const uint8_t SUPERRES_SCALE_BITS = 3; const uint8_t SUPERRES_SCALE_DENOMINATOR_MIN = SCALE_NUMERATOR + 1; const uint8_t PRIMARY_REF_BITS = 3; const uint8_t PRIMARY_REF_NONE = 7; const uint32_t MAX_NUM_TILES_IN_LIST = 512; const uint32_t MAX_EXTERNAL_REFS = 128; const uint32_t MAX_TILE_WIDTH = 4096; // Max Tile width in pixels const uint32_t MAX_TILE_AREA = 4096 * 2304; // Maximum tile area in pixels const uint32_t MAX_TILE_ROWS = 64; const uint32_t MAX_TILE_COLS = 64; const uint8_t FRAME_CONTEXTS_LOG2 = 3; const uint8_t MAX_MODE_LF_DELTAS = 2; const uint8_t WARPEDMODEL_PREC_BITS = 16; const uint8_t WARP_PARAM_REDUCE_BITS = 6; const uint8_t MAX_NUM_TEMPORAL_LAYERS = 8; const uint8_t MAX_NUM_SPATIAL_LAYERS = 4; const uint8_t MAX_NUM_OPERATING_POINTS = MAX_NUM_TEMPORAL_LAYERS * MAX_NUM_SPATIAL_LAYERS; const uint8_t SELECT_SCREEN_CONTENT_TOOLS = 2; const uint8_t SELECT_INTEGER_MV = 2; const uint8_t MAX_POINTS_IN_SCALING_FUNCTION_LUMA = 14; const uint8_t MAX_POINTS_IN_SCALING_FUNCTION_CHROMA = 10; const uint8_t MAX_AUTOREG_COEFFS_LUMA = 24; const uint8_t MAX_AUTOREG_COEFFS_CHROMA = MAX_AUTOREG_COEFFS_LUMA + 1; enum AV1_OBU_TYPE { OBU_SEQUENCE_HEADER = 1, OBU_TEMPORAL_DELIMITER = 2, OBU_FRAME_HEADER = 3, OBU_TILE_GROUP = 4, OBU_METADATA = 5, OBU_FRAME = 6, OBU_REDUNDANT_FRAME_HEADER = 7, OBU_TILE_LIST = 8, OBU_PADDING = 15, }; const uint32_t OBU_TILE_LIST_HEADER_LENGTH = 4; const uint32_t OBU_TILE_LIST_ENTRY_HEDAER_LENGTH = 5; enum AOM_COLOR_PRIMARIES { AOM_CICP_CP_RESERVED_0 = 0, /**< For future use */ AOM_CICP_CP_BT_709 = 1, /**< BT.709 */ AOM_CICP_CP_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_CP_RESERVED_3 = 3, /**< For future use */ AOM_CICP_CP_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_CP_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_CP_BT_601 = 6, /**< BT.601 */ AOM_CICP_CP_SMPTE_240 = 7, /**< SMPTE 240 */ AOM_CICP_CP_GENERIC_FILM = 8, /**< Generic film (color filters using illuminant C) */ AOM_CICP_CP_BT_2020 = 9, /**< BT.2020, BT.2100 */ AOM_CICP_CP_XYZ = 10, /**< SMPTE 428 (CIE 1921 XYZ) */ AOM_CICP_CP_SMPTE_431 = 11, /**< SMPTE RP 431-2 */ AOM_CICP_CP_SMPTE_432 = 12, /**< SMPTE EG 432-1 */ AOM_CICP_CP_RESERVED_13 = 13, /**< For future use (values 13 - 21) */ AOM_CICP_CP_EBU_3213 = 22, /**< EBU Tech. 3213-E */ AOM_CICP_CP_RESERVED_23 = 23 /**< For future use (values 23 - 255) */ }; enum AOM_TRANSFER_CHARACTERISTICS { AOM_CICP_TC_RESERVED_0 = 0, /**< For future use */ AOM_CICP_TC_BT_709 = 1, /**< BT.709 */ AOM_CICP_TC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_TC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_TC_BT_470_M = 4, /**< BT.470 System M (historical) */ AOM_CICP_TC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_TC_BT_601 = 6, /**< BT.601 */ AOM_CICP_TC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_TC_LINEAR = 8, /**< Linear */ AOM_CICP_TC_LOG_100 = 9, /**< Logarithmic (100 : 1 range) */ AOM_CICP_TC_LOG_100_SQRT10 = 10, /**< Logarithmic (100 * Sqrt(10) : 1 range) */ AOM_CICP_TC_IEC_61966 = 11, /**< IEC 61966-2-4 */ AOM_CICP_TC_BT_1361 = 12, /**< BT.1361 */ AOM_CICP_TC_SRGB = 13, /**< sRGB or sYCC*/ AOM_CICP_TC_BT_2020_10_BIT = 14, /**< BT.2020 10-bit systems */ AOM_CICP_TC_BT_2020_12_BIT = 15, /**< BT.2020 12-bit systems */ AOM_CICP_TC_SMPTE_2084 = 16, /**< SMPTE ST 2084, ITU BT.2100 PQ */ AOM_CICP_TC_SMPTE_428 = 17, /**< SMPTE ST 428 */ AOM_CICP_TC_HLG = 18, /**< BT.2100 HLG, ARIB STD-B67 */ AOM_CICP_TC_RESERVED_19 = 19 /**< For future use (values 19-255) */ }; enum AOM_MATRIX_COEFFICIENTS { AOM_CICP_MC_IDENTITY = 0, /**< Identity matrix */ AOM_CICP_MC_BT_709 = 1, /**< BT.709 */ AOM_CICP_MC_UNSPECIFIED = 2, /**< Unspecified */ AOM_CICP_MC_RESERVED_3 = 3, /**< For future use */ AOM_CICP_MC_FCC = 4, /**< US FCC 73.628 */ AOM_CICP_MC_BT_470_B_G = 5, /**< BT.470 System B, G (historical) */ AOM_CICP_MC_BT_601 = 6, /**< BT.601 */ AOM_CICP_MC_SMPTE_240 = 7, /**< SMPTE 240 M */ AOM_CICP_MC_SMPTE_YCGCO = 8, /**< YCgCo */ AOM_CICP_MC_BT_2020_NCL = 9, /**< BT.2020 non-constant luminance, BT.2100 YCbCr */ AOM_CICP_MC_BT_2020_CL = 10, /**< BT.2020 constant luminance */ AOM_CICP_MC_SMPTE_2085 = 11, /**< SMPTE ST 2085 YDzDx */ AOM_CICP_MC_CHROMAT_NCL = 12, /**< Chromaticity-derived non-constant luminance */ AOM_CICP_MC_CHROMAT_CL = 13, /**< Chromaticity-derived constant luminance */ AOM_CICP_MC_ICTCP = 14, /**< BT.2100 ICtCp */ AOM_CICP_MC_RESERVED_15 = 15 /**< For future use (values 15-255) */ }; enum AOM_COLOR_RANGE { AOM_CR_STUDIO_RANGE = 0, /**< Y [16..235], UV [16..240] */ AOM_CR_FULL_RANGE = 1 /**< YUV/RGB [0..255] */ }; enum AOM_CHROMA_SAMPLE_POSITION { AOM_CSP_UNKNOWN = 0, /**< Unknown */ AOM_CSP_VERTICAL = 1, /**< Horizontally co-located with luma(0, 0)*/ /**< sample, between two vertical samples */ AOM_CSP_COLOCATED = 2, /**< Co-located with luma(0, 0) sample */ AOM_CSP_RESERVED = 3 /**< Reserved value */ }; enum FRAME_TYPE { KEY_FRAME = 0, INTER_FRAME = 1, INTRA_ONLY_FRAME = 2, // replaces intra-only SWITCH_FRAME = 3, FRAME_TYPES, }; enum SB_SIZE { BLOCK_64X64 = 0, BLOCK_128X128 = 1, }; using UMC_VP9_DECODER::VP9_MAX_NUM_OF_SEGMENTS; using UMC_VP9_DECODER::MAX_LOOP_FILTER; enum SEG_LVL_FEATURES { SEG_LVL_ALT_Q, // Use alternate Quantizer .... SEG_LVL_ALT_LF_Y_V, // Use alternate loop filter value on y plane vertical SEG_LVL_ALT_LF_Y_H, // Use alternate loop filter value on y plane horizontal SEG_LVL_ALT_LF_U, // Use alternate loop filter value on u plane SEG_LVL_ALT_LF_V, // Use alternate loop filter value on v plane SEG_LVL_REF_FRAME, // Optional Segment reference frame SEG_LVL_SKIP, // Optional Segment (0,0) + skip mode SEG_LVL_GLOBALMV, SEG_LVL_MAX }; const uint8_t MAX_REF_IDX_FOR_SEGMENT = 7; const uint8_t SEG_FEATURE_DATA_SIGNED[SEG_LVL_MAX] = { 1, 1, 1, 1, 1, 0, 0}; const uint8_t SEG_FEATURE_DATA_MAX[SEG_LVL_MAX] = { UMC_VP9_DECODER::MAXQ, MAX_LOOP_FILTER, MAX_LOOP_FILTER, MAX_LOOP_FILTER, MAX_LOOP_FILTER, MAX_REF_IDX_FOR_SEGMENT, 0 }; enum { RESET_FRAME_CONTEXT_NONE = 0, RESET_FRAME_CONTEXT_CURRENT = 1, RESET_FRAME_CONTEXT_ALL = 2 }; enum INTERP_FILTER{ EIGHTTAP_REGULAR, EIGHTTAP_SMOOTH, MULTITAP_SHARP, BILINEAR, INTERP_FILTERS_ALL, SWITCHABLE_FILTERS = BILINEAR, SWITCHABLE = SWITCHABLE_FILTERS + 1, /* the last switchable one */ EXTRA_FILTERS = INTERP_FILTERS_ALL - SWITCHABLE_FILTERS, }; enum TX_MODE{ ONLY_4X4 = 0, // only 4x4 transform used TX_MODE_LARGEST, // transform size is the largest possible for pu size TX_MODE_SELECT, // transform specified for each block TX_MODES, }; enum REFERENCE_MODE { SINGLE_REFERENCE = 0, COMPOUND_REFERENCE = 1, REFERENCE_MODE_SELECT = 2, REFERENCE_MODES = 3, }; enum REFRESH_FRAME_CONTEXT_MODE { REFRESH_FRAME_CONTEXT_DISABLED, REFRESH_FRAME_CONTEXT_BACKWARD, }; enum TRANSFORMATION_TYPE { IDENTITY = 0, // identity transformation, 0-parameter TRANSLATION = 1, // translational motion 2-parameter ROTZOOM = 2, // simplified affine with rotation + zoom only, 4-parameter AFFINE = 3, // affine, 6-parameter HORTRAPEZOID = 4, // constrained homography, hor trapezoid, 6-parameter VERTRAPEZOID = 5, // constrained homography, ver trapezoid, 6-parameter HOMOGRAPHY = 6, // homography, 8-parameter TRANS_TYPES = 7, }; enum MV_REFERENCE_FRAME { NONE = -1, INTRA_FRAME = 0, LAST_FRAME = 1, LAST2_FRAME = 2, LAST3_FRAME = 3, GOLDEN_FRAME = 4, BWDREF_FRAME = 5, ALTREF2_FRAME = 6, ALTREF_FRAME = 7, MAX_REF_FRAMES = 8 }; struct TimingInfo { uint32_t num_units_in_display_tick; uint32_t time_scale; uint32_t equal_picture_interval; uint32_t num_ticks_per_picture_minus_1; }; struct DecoderModelInfo { uint32_t buffer_delay_length_minus_1; uint32_t num_units_in_decoding_tick; uint32_t buffer_removal_time_length_minus_1; uint32_t frame_presentation_time_length_minus_1; }; struct OperatingParametersInfo { uint32_t decoder_buffer_delay; uint32_t encoder_buffer_delay; uint32_t low_delay_mode_flag; }; struct ColorConfig { uint32_t BitDepth; uint32_t mono_chrome; uint32_t color_primaries; uint32_t transfer_characteristics; uint32_t matrix_coefficients; uint32_t color_range; uint32_t chroma_sample_position; uint32_t subsampling_x; uint32_t subsampling_y; uint32_t separate_uv_delta_q; }; struct SequenceHeader { //Rev 0.85 parameters (AV1 spec version 1.0) in order of appearance/calculation in sequence_header_obu() uint32_t seq_profile; uint32_t still_picture; uint32_t reduced_still_picture_header; uint32_t timing_info_present_flag; TimingInfo timing_info; uint32_t decoder_model_info_present_flag; DecoderModelInfo decoder_model_info; uint32_t operating_points_cnt_minus_1; uint32_t operating_point_idc[MAX_NUM_OPERATING_POINTS]; uint32_t seq_level_idx[MAX_NUM_OPERATING_POINTS]; uint32_t seq_tier[MAX_NUM_OPERATING_POINTS]; uint32_t decoder_model_present_for_this_op[MAX_NUM_OPERATING_POINTS]; OperatingParametersInfo operating_parameters_info[MAX_NUM_OPERATING_POINTS]; uint32_t initial_display_delay_minus_1[MAX_NUM_OPERATING_POINTS]; uint32_t frame_width_bits; uint32_t frame_height_bits; uint32_t max_frame_width; uint32_t max_frame_height; uint32_t frame_id_numbers_present_flag; uint32_t delta_frame_id_length; uint32_t idLen; uint32_t sbSize; uint32_t enable_filter_intra; uint32_t enable_intra_edge_filter; uint32_t enable_interintra_compound; uint32_t enable_masked_compound; uint32_t enable_warped_motion; uint32_t enable_dual_filter; uint32_t enable_order_hint; uint32_t enable_jnt_comp; uint32_t enable_ref_frame_mvs; uint32_t seq_force_screen_content_tools; uint32_t seq_force_integer_mv; int32_t order_hint_bits_minus1; uint32_t enable_superres; uint32_t enable_cdef; uint32_t enable_restoration; ColorConfig color_config; uint32_t film_grain_param_present; }; struct TileInfo { uint32_t uniform_tile_spacing_flag; uint32_t TileColsLog2; uint32_t TileRowsLog2; uint32_t TileCols; uint32_t TileRows; uint32_t SbColStarts[MAX_TILE_COLS + 1]; // valid for 0 <= i <= TileCols uint32_t SbRowStarts[MAX_TILE_ROWS + 1]; // valid for 0 <= i <= TileRows uint32_t context_update_tile_id; uint32_t TileSizeBytes; uint32_t TileWidth; uint32_t TileHeight; //Rev 0.5 parameters uint32_t loop_filter_across_tiles_v_enabled; uint32_t loop_filter_across_tiles_h_enabled; }; struct QuantizationParams { uint32_t base_q_idx; int32_t DeltaQYDc; int32_t DeltaQUDc; int32_t DeltaQUAc; int32_t DeltaQVDc; int32_t DeltaQVAc; uint32_t using_qmatrix; uint32_t qm_y; uint32_t qm_u; uint32_t qm_v; }; struct SegmentationParams { uint8_t segmentation_enabled; uint8_t segmentation_update_map; uint8_t segmentation_temporal_update; uint8_t segmentation_update_data; int32_t FeatureData[VP9_MAX_NUM_OF_SEGMENTS][SEG_LVL_MAX]; uint32_t FeatureMask[VP9_MAX_NUM_OF_SEGMENTS]; }; struct LoopFilterParams { int32_t loop_filter_level[4]; int32_t loop_filter_sharpness; uint8_t loop_filter_delta_enabled; uint8_t loop_filter_delta_update; // 0 = Intra, Last, Last2, Last3, GF, BWD, ARF int8_t loop_filter_ref_deltas[TOTAL_REFS]; // 0 = ZERO_MV, MV int8_t loop_filter_mode_deltas[MAX_MODE_LF_DELTAS]; }; struct CdefParams { uint32_t cdef_damping; uint32_t cdef_bits; uint32_t cdef_y_pri_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_y_sec_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_uv_pri_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_uv_sec_strength[CDEF_MAX_STRENGTHS]; //Rev 0.5 parameters uint32_t cdef_y_strength[CDEF_MAX_STRENGTHS]; uint32_t cdef_uv_strength[CDEF_MAX_STRENGTHS]; }; enum RestorationType { RESTORE_NONE, RESTORE_WIENER, RESTORE_SGRPROJ, RESTORE_SWITCHABLE, RESTORE_SWITCHABLE_TYPES = RESTORE_SWITCHABLE, RESTORE_TYPES = 4, }; struct LRParams { RestorationType lr_type[MAX_MB_PLANE]; uint32_t lr_unit_shift; uint32_t lr_uv_shift; }; struct GlobalMotionParams { TRANSFORMATION_TYPE wmtype; int32_t wmmat[8]; int16_t alpha; int16_t beta; int16_t gamma; int16_t delta; int8_t invalid; }; struct FilmGrainParams{ uint32_t apply_grain; uint32_t grain_seed; uint32_t update_grain; uint32_t film_grain_params_ref_idx; // 8 bit values int32_t num_y_points; // value: 0..14 int32_t point_y_value[MAX_POINTS_IN_SCALING_FUNCTION_LUMA]; int32_t point_y_scaling[MAX_POINTS_IN_SCALING_FUNCTION_LUMA]; int32_t chroma_scaling_from_luma; // 8 bit values int32_t num_cb_points; // value: 0..10 int32_t point_cb_value[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t point_cb_scaling[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; // 8 bit values int32_t num_cr_points; // value: 0..10 int32_t point_cr_value[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t point_cr_scaling[MAX_POINTS_IN_SCALING_FUNCTION_CHROMA]; int32_t grain_scaling; int32_t ar_coeff_lag; // values: 0..3 // 8 bit values int32_t ar_coeffs_y[MAX_AUTOREG_COEFFS_LUMA]; int32_t ar_coeffs_cb[MAX_AUTOREG_COEFFS_CHROMA]; int32_t ar_coeffs_cr[MAX_AUTOREG_COEFFS_CHROMA]; // Shift value: AR coeffs range // 6: [-2, 2) // 7: [-1, 1) // 8: [-0.5, 0.5) // 9: [-0.25, 0.25) int32_t ar_coeff_shift; // values : 6..9 int32_t grain_scale_shift; int32_t cb_mult; // 8 bits int32_t cb_luma_mult; // 8 bits int32_t cb_offset; // 9 bits int32_t cr_mult; // 8 bits int32_t cr_luma_mult; // 8 bits int32_t cr_offset; // 9 bits int32_t overlap_flag; int32_t clip_to_restricted_range; int32_t BitDepth; // video bit depth }; struct SizeOfFrame{ uint32_t FrameWidth; uint32_t FrameHeight; }; struct FrameHeader { //Rev 0.85 parameters (AV1 spec version 1.0) in order of appearance/calculation in uncompressed_header() uint32_t show_existing_frame; uint32_t frame_to_show_map_idx; uint64_t frame_presentation_time; uint32_t display_frame_id; FRAME_TYPE frame_type; uint32_t show_frame; uint32_t showable_frame; uint32_t error_resilient_mode; uint32_t disable_cdf_update; uint32_t allow_screen_content_tools; uint32_t force_integer_mv; uint32_t current_frame_id; uint32_t frame_size_override_flag; uint32_t order_hint; uint32_t primary_ref_frame; uint8_t refresh_frame_flags; uint32_t ref_order_hint[NUM_REF_FRAMES]; uint32_t FrameWidth; uint32_t FrameHeight; uint32_t SuperresDenom; uint32_t UpscaledWidth; uint32_t MiCols; uint32_t MiRows; uint32_t RenderWidth; uint32_t RenderHeight; uint32_t allow_intrabc; int32_t ref_frame_idx[INTER_REFS]; uint32_t allow_high_precision_mv; INTERP_FILTER interpolation_filter; uint32_t is_motion_mode_switchable; uint32_t use_ref_frame_mvs; uint32_t disable_frame_end_update_cdf; uint32_t sbCols; uint32_t sbRows; uint32_t sbSize; TileInfo tile_info; QuantizationParams quantization_params; SegmentationParams segmentation_params; uint32_t delta_q_present; uint32_t delta_q_res; uint32_t delta_lf_present; uint32_t delta_lf_res; uint32_t delta_lf_multi; uint32_t CodedLossless; uint32_t AllLossless; LoopFilterParams loop_filter_params; CdefParams cdef_params; LRParams lr_params; TX_MODE TxMode; uint32_t reference_mode; uint32_t skip_mode_present; uint32_t allow_warped_motion; uint32_t reduced_tx_set; GlobalMotionParams global_motion_params[TOTAL_REFS]; FilmGrainParams film_grain_params; uint32_t NumPlanes; uint32_t large_scale_tile; uint32_t tile_count_in_list; uint32_t output_frame_width_in_tiles; uint32_t output_frame_height_in_tiles; uint32_t is_anchor; //Rev 0.5 parameters uint32_t enable_interintra_compound; uint32_t enable_masked_compound; uint32_t enable_intra_edge_filter; uint32_t enable_filter_intra; }; struct OBUHeader { AV1_OBU_TYPE obu_type; uint32_t obu_has_size_field; uint32_t temporal_id; uint32_t spatial_id; }; struct OBUInfo { OBUHeader header; size_t size; }; struct TileGroupInfo { uint32_t numTiles; uint32_t startTileIdx; uint32_t endTileIdx; }; struct TileListInfo { uint32_t frameWidthInTiles; uint32_t frameHeightInTiles; uint32_t numTiles; }; class av1_exception : public std::runtime_error { public: av1_exception(int32_t status) : std::runtime_error("AV1 error") , m_status(status) {} int32_t GetStatus() const { return m_status; } private: int32_t m_status; }; } #endif // __UMC_AV1_DEC_DEFS_DEC_H__ #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_decoder.h000077500000000000000000000174251443134507600321760ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_DECODER_H #define __UMC_AV1_DECODER_H #include "umc_video_decoder.h" #include "umc_frame_allocator.h" #include "umc_av1_frame.h" #include #include #include #include namespace UMC { class FrameAllocator; } namespace UMC_AV1_DECODER { struct SequenceHeader; struct FrameHeader; class AV1DecoderFrame; class AV1DecoderParams : public UMC::VideoDecoderParams { DYNAMIC_CAST_DECL(AV1DecoderParams, UMC::VideoDecoderParams) public: AV1DecoderParams() : allocator(nullptr) , async_depth(0) , film_grain(0) , io_pattern(0) , lst_mode(0) , anchors_num(0) , anchors_loaded(false) , skip_first_frames(0) {} public: UMC::FrameAllocator* allocator; uint32_t async_depth; uint32_t film_grain; uint32_t io_pattern; uint32_t lst_mode; uint32_t anchors_num; bool anchors_loaded; uint32_t skip_first_frames; mfxFrameSurface1** pre_loaded_anchors; }; class ReportItem // adopted from HEVC/AVC decoders { public: uint32_t m_index; uint8_t m_status; ReportItem(uint32_t index, uint8_t status) : m_index(index) , m_status(status) { } bool operator == (const ReportItem & item) const { return (item.m_index == m_index); } bool operator != (const ReportItem & item) const { return (item.m_index != m_index); } }; class AV1Decoder : public UMC::VideoDecoder { public: AV1Decoder(); ~AV1Decoder(); public: static UMC::Status DecodeHeader(UMC::MediaData*, UMC_AV1_DECODER::AV1DecoderParams&); /* UMC::BaseCodec interface */ UMC::Status Init(UMC::BaseCodecParams*) override; UMC::Status GetFrame(UMC::MediaData* in, UMC::MediaData* out) override; virtual UMC::Status Reset() override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } UMC::Status GetInfo(UMC::BaseCodecParams*) override; public: /* UMC::VideoDecoder interface */ virtual UMC::Status ResetSkipCount() override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } virtual UMC::Status SkipVideoFrame(int32_t) override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } virtual uint32_t GetNumOfSkippedFrames() override { return 0; } public: AV1DecoderFrame* FindFrameByMemID(UMC::FrameMemID); AV1DecoderFrame* GetFrameToDisplay(); AV1DecoderFrame* FindFrameByUID(int64_t uid); AV1DecoderFrame* DecodeFrameID(UMC::FrameMemID); AV1DecoderFrame* FindFrameInProgress(); AV1DecoderFrame* GetCurrFrame() { return Curr; } UMC::FrameMemID GetRepeatedFrame(){return repeateFrame;} void SetInFrameRate(mfxF64 rate) { in_framerate = rate; } void SetAnchorIdx(UMC::FrameMemID idx) { m_specified_anchor_Idx = idx;} void SetAsAnchor(bool isAnchorFrame) { m_isAnchor = isAnchorFrame;} virtual bool QueryFrames() = 0; void Flush(); protected: static UMC::Status FillVideoParam(SequenceHeader const&, UMC_AV1_DECODER::AV1DecoderParams&); virtual void SetDPBSize(uint32_t); virtual void SetRefSize(uint32_t); virtual AV1DecoderFrame* GetFreeFrame(AV1DecoderFrame*); virtual AV1DecoderFrame* GetFrameBuffer(FrameHeader const&, AV1DecoderFrame*); virtual void AddFrameData(AV1DecoderFrame&); virtual void AddFrameDataByIdx(AV1DecoderFrame& frame, uint32_t idx); virtual void AllocateFrameData(UMC::VideoDataInfo const&, UMC::FrameMemID, AV1DecoderFrame&) = 0; virtual void CompleteDecodedFrames(FrameHeader const&, AV1DecoderFrame*, AV1DecoderFrame*); virtual UMC::Status SubmitTiles(AV1DecoderFrame&, bool) = 0; virtual UMC::Status SubmitTileList(AV1DecoderFrame&) = 0; virtual UMC::Status RegisterAnchorFrame(uint32_t id) = 0; private: template AV1DecoderFrame* FindFrame(F pred); AV1DecoderFrame* StartFrame(FrameHeader const&, DPBType &, AV1DecoderFrame*); void CalcFrameTime(AV1DecoderFrame*); AV1DecoderFrame* GetFrameBufferByIdx(FrameHeader const& fh, UMC::FrameMemID id); AV1DecoderFrame* StartAnchorFrame(FrameHeader const& fh, DPBType const& frameDPB, uint32_t idx); DPBType DPBUpdate(AV1DecoderFrame * prevFrame); protected: std::mutex guard; UMC::FrameAllocator* allocator; std::unique_ptr sequence_header; DPBType dpb; // store of decoded frames uint32_t counter; AV1DecoderParams params; std::vector outputed_frames; // tore frames need to be output AV1DecoderFrame* Curr; // store current frame for Poutput AV1DecoderFrame* Curr_temp; // store current frame insist double updateDPB uint32_t Repeat_show; // show if current frame is repeated frame uint32_t PreFrame_id;//id of previous frame uint32_t OldPreFrame_id;//old id of previous frame. When decode LST clip, need this for parsing twice DPBType refs_temp; // previous updated frameDPB mfxU16 frame_order; mfxF64 in_framerate; UMC::FrameMemID repeateFrame;//frame to be repeated uint32_t anchor_frames_count; uint32_t tile_list_idx; uint32_t frames_to_skip; uint32_t saved_clip_info_width; uint32_t saved_clip_info_height; bool clip_info_size_saved; FrameHeader m_prev_frame_header; bool m_prev_frame_header_exist; UMC::FrameMemID m_anchor_frame_mem_ids[MAX_ANCHOR_SIZE]; UMC::FrameMemID m_specified_anchor_Idx; // anchor frame index specified by application bool m_isAnchor; // check if current frame is a anchor frame }; } #endif // __UMC_AV1_DECODER_H #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_decoder_va.h000066400000000000000000000041401443134507600326470ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include "umc_av1_decoder.h" #ifndef __UMC_AV1_DECODER_VA_H #define __UMC_AV1_DECODER_VA_H namespace UMC_AV1_DECODER { class Packer; class AV1DecoderVA : public AV1Decoder { UMC::VideoAccelerator* va; std::unique_ptr packer; public: AV1DecoderVA(); UMC::Status SetParams(UMC::BaseCodecParams*) override; bool QueryFrames() override; private: void AllocateFrameData(UMC::VideoDataInfo const&, UMC::FrameMemID, AV1DecoderFrame&) override; UMC::Status SubmitTiles(AV1DecoderFrame&, bool) override; int32_t GetFreeIndex(UMC::FrameMemID) const; UMC::Status SubmitTileList(AV1DecoderFrame&) override; UMC::Status RegisterAnchorFrame(uint32_t id) override; private: std::vector reports; typedef std::vector Report; }; } #endif // __UMC_AV1_DECODER_VA_H #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_frame.h000066400000000000000000000226221443134507600316530ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_FRAME_H__ #define __UMC_AV1_FRAME_H__ #include "umc_frame_allocator.h" #include "umc_av1_dec_defs.h" #include "mfx_common_decode_int.h" #include namespace UMC_AV1_DECODER { struct SequenceHeader; struct FrameHeader; struct TileLocation { uint32_t startIdx; // index of 1st tile in current tile group uint32_t endIdx; // index of last tile in current tile group size_t offset; // offset in the buffer size_t size; // size of the tile uint32_t row; // row in tile grid uint32_t col; // column in tile grid // Large scale tile mode int32_t tileIdxInTileList; int32_t anchorFrameIdx; uint32_t anchorTileRow; uint32_t anchorTileCol; bool tile_location_type; // 0 - tile group entry, 1 = tile list entry uint32_t shift; // shift size of tile list entry which indicate OBU header size }; typedef std::vector TileLayout; class TileSet { public: TileSet() {}; TileSet(UMC::MediaData*, TileLayout const&); ~TileSet() {}; size_t Submit(uint8_t*, size_t, size_t, TileLayout&); bool Submitted() const { return submitted; } uint32_t GetTileCount() const { return static_cast(layout.size()); } size_t GetSize() const { return source.GetDataSize(); } void GetTileLayout(TileLayout &lyt) { lyt = layout; } private: UMC::MediaData source; TileLayout layout; bool submitted = false; }; inline uint32_t CalcTilesInTileSets(std::vector const& tileSets) { uint32_t numTiles = 0; for (auto& tileSet : tileSets) numTiles += tileSet.GetTileCount(); return numTiles; } inline size_t BytesReadyForSubmission(std::vector const& tileSets) { size_t bytes = 0; for (auto& tileSet : tileSets) bytes += tileSet.Submitted() ? tileSet.GetSize() : 0; return bytes; } inline size_t CalcSizeOfTileSets(std::vector const& tileSets) { size_t size = 0; for (auto& tileSet : tileSets) size += tileSet.GetSize(); return size; } enum { SURFACE_DISPLAY = 0, SURFACE_RECON = 1 }; class AV1DecoderFrame : public RefCounter { public: AV1DecoderFrame(); ~AV1DecoderFrame(); void Reset(); void Reset(FrameHeader const*); void AllocateAndLock(UMC::FrameData const*); void AddSource(UMC::MediaData*); UMC::MediaData* GetSource() { return source.get(); } void AddTileSet(UMC::MediaData* in, TileLayout const& layout); std::vector const& GetTileSets() const { return tile_sets; } std::vector& GetTileSets() { return tile_sets; } int32_t GetError() const { return error; } void SetError(int32_t e) { error = e; } void AddError(int32_t e) { error |= e; } void SetSeqHeader(SequenceHeader const&); SequenceHeader const& GetSeqHeader() const { return *seq_header; } FrameHeader& GetFrameHeader() { return *header; } FrameHeader const& GetFrameHeader() const { return *header; } bool Empty() const; bool Decoded() const; bool Displayed() const { return displayed; } void Displayed(bool d) { displayed = d; } bool DpbUpdated() const { return dpb_updated; } void DpbUpdated(bool u) { dpb_updated = u; } bool Repeated() const { return repeated; } void Repeated(bool d) { repeated = d; } bool Outputted() const { return outputted; } void Outputted(bool o) { outputted = o; } bool Skipped() const { return skipped; } void SetSkipFlag(bool o) { skipped = o; } bool DecodingStarted() const { return decoding_started; } void StartDecoding() { decoding_started = true; } bool DecodingCompleted() const { return decoding_completed; } void CompleteDecoding() { decoding_completed = true; } bool ShowAsExisting() const { return show_as_existing; } void ShowAsExisting(bool show) { show_as_existing = show; } bool FilmGrainDisabled() const { return film_grain_disabled; } void DisableFilmGrain() { film_grain_disabled = true; } UMC::FrameData* GetFrameData(int idx = SURFACE_DISPLAY) { return data[idx].get(); } UMC::FrameData const* GetFrameData(int idx = SURFACE_DISPLAY) const { return data[idx].get(); } UMC::FrameMemID GetMemID(int idx = SURFACE_DISPLAY) const; void AddReferenceFrame(AV1DecoderFrame* frm); void FreeReferenceFrames(); void UpdateReferenceList(); void OnDecodingCompleted(); void SetRefValid(bool valid) { ref_valid = valid; } bool RefValid() const { return ref_valid; }; uint32_t GetUpscaledWidth() const; uint32_t GetFrameHeight() const; uint32_t GetRenderWidth() const; uint32_t GetRenderHeight() const; void SetFrameTime(mfxF64 time) { frame_time = time; }; mfxF64 FrameTime() const { return frame_time; }; void SetFrameOrder(mfxU16 order) { frame_order = order; }; mfxU16 FrameOrder() const { return frame_order; }; void SetAnchorMap(UMC::FrameMemID* map) { anchor_map = map; } UMC::FrameMemID* AnchorMap() const { return anchor_map; } public: int64_t UID; DPBType frame_dpb; UMC::FrameMemID m_index; UMC::FrameMemID m_anchorFrameIdx; // application to specify anchor frame index used by current frame protected: virtual void Free() { Reset(); } private: bool outputted; // set in [application thread] when frame is mapped to respective output mfxFrameSurface bool displayed; // set in [scheduler thread] when frame decoding is finished and // respective mfxFrameSurface prepared for output to application bool decoded; // set in [application thread] to signal that frame is completed and respective reference counter decremented // after it frame still may remain in [AV1Decoder::dpb], but only as reference bool repeated; bool dpb_updated; bool decoding_started; // set in [application thread] right after frame submission to the driver started bool decoding_completed; // set in [scheduler thread] after getting driver status report for the frame bool show_as_existing; std::shared_ptr data[2]; // if FilmGrain is applied: data[SURFACE_DISPLAY] points to data of frame with film grain, and data[SURFACE_RECON] points to data of reconstructed frame // if FilmGrain is not applied: both data[SURFACE_DISPLAY] and data[SURFACE_RECON] point to data of reconstructed frame std::unique_ptr source; std::vector tile_sets; int32_t error; std::unique_ptr seq_header; std::unique_ptr header; DPBType references; bool ref_valid; bool film_grain_disabled; mfxF64 frame_time; mfxU16 frame_order; bool skipped; UMC::FrameMemID *anchor_map; }; } // end namespace UMC_AV1_DECODER #endif // __UMC_AV1_FRAME_H__ #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_utils.h000066400000000000000000000142041443134507600317160ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_UTILS_H_ #define __UMC_AV1_UTILS_H_ #include "umc_av1_dec_defs.h" #include "umc_av1_frame.h" namespace UMC_AV1_DECODER { inline uint32_t CeilLog2(uint32_t x) { uint32_t l = 0; while (x > (1U << l)) l++; return l; } // we stop using UMC_VP9_DECODER namespace starting from Rev 0.25.2 // because after switch to AV1-specific segmentation stuff there are only few definitions we need to re-use from VP9 void SetSegData(SegmentationParams & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId, int32_t seg_data); inline int32_t GetSegData(SegmentationParams const& seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { return seg.FeatureData[segmentId][featureId]; } inline bool IsSegFeatureActive(SegmentationParams const& seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { return seg.segmentation_enabled && (seg.FeatureMask[segmentId] & (1 << featureId)); } inline void EnableSegFeature(SegmentationParams & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { seg.FeatureMask[segmentId] |= 1 << featureId; } inline uint8_t IsSegFeatureSigned(SEG_LVL_FEATURES featureId) { return SEG_FEATURE_DATA_SIGNED[featureId]; } inline void ClearAllSegFeatures(SegmentationParams & seg) { std::fill_n(reinterpret_cast(seg.FeatureData), std::extent::value * std::extent::value, 0); std::fill_n(seg.FeatureMask, std::extent::value, 0); } void SetupPastIndependence(FrameHeader & info); inline bool FrameIsIntraOnly(FrameHeader const& fh) { return fh.frame_type == INTRA_ONLY_FRAME; } inline bool FrameIsIntra(FrameHeader const& fh) { return (fh.frame_type == KEY_FRAME || FrameIsIntraOnly(fh)); } inline bool FrameIsResilient(FrameHeader const& fh) { return FrameIsIntra(fh) || fh.error_resilient_mode; } inline uint32_t NumTiles(TileInfo const & info) { return info.TileCols * info.TileRows; } int IsCodedLossless(FrameHeader const&); inline void Av1LoadPrevious(FrameHeader& fh, DPBType const& frameDpb) { const int prevFrame = fh.ref_frame_idx[fh.primary_ref_frame]; FrameHeader const& prevFH = frameDpb[prevFrame]->GetFrameHeader(); for (uint32_t i = 0; i < TOTAL_REFS; i++) fh.loop_filter_params.loop_filter_ref_deltas[i] = prevFH.loop_filter_params.loop_filter_ref_deltas[i]; for (uint32_t i = 0; i < MAX_MODE_LF_DELTAS; i++) fh.loop_filter_params.loop_filter_mode_deltas[i] = prevFH.loop_filter_params.loop_filter_mode_deltas[i]; for (uint32_t i = 0; i < VP9_MAX_NUM_OF_SEGMENTS; i++) { fh.segmentation_params.FeatureMask[i] = prevFH.segmentation_params.FeatureMask[i]; for (uint32_t j = 0; j < SEG_LVL_MAX; j++) fh.segmentation_params.FeatureData[i][j] = prevFH.segmentation_params.FeatureData[i][j]; } } inline bool FrameMightUsePrevFrameMVs(FrameHeader const& fh, SequenceHeader const& sh) { return !FrameIsResilient(fh) && sh.enable_order_hint && sh.enable_ref_frame_mvs; } inline void SetDefaultLFParams(LoopFilterParams& par) { par.loop_filter_delta_enabled = 1; par.loop_filter_delta_update = 1; par.loop_filter_ref_deltas[INTRA_FRAME] = 1; par.loop_filter_ref_deltas[LAST_FRAME] = 0; par.loop_filter_ref_deltas[LAST2_FRAME] = par.loop_filter_ref_deltas[LAST_FRAME]; par.loop_filter_ref_deltas[LAST3_FRAME] = par.loop_filter_ref_deltas[LAST_FRAME]; par.loop_filter_ref_deltas[BWDREF_FRAME] = par.loop_filter_ref_deltas[LAST_FRAME]; par.loop_filter_ref_deltas[GOLDEN_FRAME] = -1; par.loop_filter_ref_deltas[ALTREF2_FRAME] = -1; par.loop_filter_ref_deltas[ALTREF_FRAME] = -1; par.loop_filter_mode_deltas[0] = 0; par.loop_filter_mode_deltas[1] = 0; } inline uint8_t GetNumPlanes(SequenceHeader const& sh) { return sh.color_config.mono_chrome ? 1 : MAX_MB_PLANE; } inline unsigned GetNumArrivedTiles(AV1DecoderFrame const& frame) { auto &tileSets = frame.GetTileSets(); return CalcTilesInTileSets(tileSets); } inline unsigned GetNumMissingTiles(AV1DecoderFrame const& frame) { FrameHeader const& fh = frame.GetFrameHeader(); if (frame.AnchorMap()) { //large scale tile auto& tileSets = frame.GetTileSets(); size_t num_tile = 0; for (auto& tileSet : tileSets) { num_tile += tileSet.GetTileCount(); } return (unsigned)num_tile - GetNumArrivedTiles(frame); } else { return NumTiles(fh.tile_info) - GetNumArrivedTiles(frame); } } } #endif //__UMC_AV1_UTILS_H_ #endif //MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include/umc_av1_va_packer.h000066400000000000000000000040571443134507600325160ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_VA_PACKER_H #define __UMC_AV1_VA_PACKER_H #include "umc_va_base.h" #include "umc_av1_frame.h" #include namespace UMC { class MediaData; } namespace UMC_AV1_DECODER { class VP9Bitstream; class VP9DecoderFrame; class Packer { public: Packer(UMC::VideoAccelerator * va); virtual ~Packer(); virtual UMC::Status GetStatusReport(void* pStatusReport, size_t size) = 0; virtual UMC::Status SyncTask(int32_t index, void * error) = 0; virtual void BeginFrame() = 0; virtual void EndFrame() = 0; virtual void PackAU(std::vector&, AV1DecoderFrame const&, bool) = 0; virtual void RegisterAnchor(UMC::FrameMemID) = 0; static Packer* CreatePacker(UMC::VideoAccelerator * va); protected: UMC::VideoAccelerator *m_va; }; } // namespace UMC_AV1_DECODER #endif /* __UMC_AV1_VA_PACKER_H */ #endif // MFX_ENABLE_AV1_VIDEO_DECODE umc_av1_va_packer_vaapi.h000066400000000000000000000043471443134507600336210ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/include// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #ifndef __UMC_AV1_VA_PACKER_H #include "umc_av1_va_packer.h" #define __UMC_AV1_VA_PACKER_H namespace UMC { class MediaData; } namespace UMC_AV1_DECODER { class VP9Bitstream; class VP9DecoderFrame; class PackerVA : public Packer { public: PackerVA(UMC::VideoAccelerator * va); UMC::Status GetStatusReport(void * pStatusReport, size_t size) override; UMC::Status SyncTask(int32_t index, void * error) override { return m_va->SyncTask(index, error); } void BeginFrame() override; void EndFrame() override; void PackAU(std::vector&, AV1DecoderFrame const&, bool) override; void RegisterAnchor(UMC::FrameMemID) override; private: void PackPicParams(VADecPictureParameterBufferAV1&, AV1DecoderFrame const&); void PackTileControlParams(VASliceParameterBufferAV1&, TileLocation const&); std::vector anchors_frames; }; } // namespace UMC_AV1_DECODER #endif /* __UMC_AV1_VA_PACKER_H */ #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/000077500000000000000000000000001443134507600261355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/umc_av1_bitstream.cpp000066400000000000000000002145221443134507600322540ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include #include #include "umc_av1_bitstream_utils.h" #include "umc_av1_utils.h" #include "umc_av1_frame.h" #define AV1D_LOG(string, ...) using UMC_VP9_DECODER::AlignPowerOfTwo; namespace UMC_AV1_DECODER { inline bool av1_sync_code(AV1Bitstream& bs) { return bs.GetBits(8) == SYNC_CODE_0 && bs.GetBits(8) == SYNC_CODE_1 && bs.GetBits(8) == SYNC_CODE_2 ; } inline uint32_t av1_profile(AV1Bitstream& bs) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); uint32_t profile = bs.GetBit(); profile |= bs.GetBit() << 1; if (profile > 2) profile += bs.GetBit(); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return profile; } inline void av1_decoder_model_info(AV1Bitstream& bs, DecoderModelInfo& info) { info.buffer_delay_length_minus_1 = bs.GetBits(5); info.num_units_in_decoding_tick = bs.GetBits(32); info.buffer_removal_time_length_minus_1 = bs.GetBits(5); info.frame_presentation_time_length_minus_1 = bs.GetBits(5); } inline void av1_operating_parameters_info(AV1Bitstream& bs, OperatingParametersInfo& info, uint32_t length) { info.decoder_buffer_delay = bs.GetBits(length); info.encoder_buffer_delay = bs.GetBits(length); info.low_delay_mode_flag = bs.GetBit(); } inline void av1_timing_info(AV1Bitstream& bs, TimingInfo& info) { info.num_units_in_display_tick = bs.GetBits(32); info.time_scale = bs.GetBits(32); info.equal_picture_interval = bs.GetBit(); if (info.equal_picture_interval) info.num_ticks_per_picture_minus_1 = read_uvlc(bs); } static void av1_color_config(AV1Bitstream& bs, ColorConfig& config, uint32_t profile) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); config.BitDepth = bs.GetBit() ? 10 : 8; if (profile == 2 && config.BitDepth != 8) config.BitDepth = bs.GetBit() ? 12 : 10; config.mono_chrome = profile != 1 ? bs.GetBit() : 0; uint32_t color_description_present_flag = bs.GetBit(); if (color_description_present_flag) { config.color_primaries = bs.GetBits(8); config.transfer_characteristics = bs.GetBits(8); config.matrix_coefficients = bs.GetBits(8); } else { config.color_primaries = AOM_CICP_CP_UNSPECIFIED; config.transfer_characteristics = AOM_CICP_TC_UNSPECIFIED; config.matrix_coefficients = AOM_CICP_MC_UNSPECIFIED; } if (config.mono_chrome) { config.color_range = bs.GetBit(); config.subsampling_y = config.subsampling_x = 1; config.chroma_sample_position = AOM_CSP_UNKNOWN; config.separate_uv_delta_q = 0; AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } if (config.color_primaries == AOM_CICP_CP_BT_709 && config.transfer_characteristics == AOM_CICP_TC_SRGB && config.matrix_coefficients == AOM_CICP_MC_IDENTITY) { config.color_range = AOM_CR_FULL_RANGE; config.subsampling_y = config.subsampling_x = 0; if (!(profile == 1 || (profile == 2 && config.BitDepth == 12))) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } else { // [16,235] (including xvycc) vs [0,255] range config.color_range = bs.GetBit(); if (profile == 0) // 420 only config.subsampling_x = config.subsampling_y = 1; else if (profile == 1) // 444 only config.subsampling_x = config.subsampling_y = 0; else if (profile == 2) { if (config.BitDepth == 12) { config.subsampling_x = bs.GetBit(); if (config.subsampling_x == 0) config.subsampling_y = 0; // 444 else config.subsampling_y = bs.GetBit(); // 422 or 420 } else { // 422 config.subsampling_x = 1; config.subsampling_y = 0; } } if (config.subsampling_x == 1 && config.subsampling_y == 1) config.chroma_sample_position = bs.GetBits(2); } config.separate_uv_delta_q = bs.GetBit(); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_set_mi_and_sb_size(FrameHeader& fh, SequenceHeader const& sh) { // set frame width and heignt in MI const unsigned int alignedWidth = AlignPowerOfTwo(fh.FrameWidth, 3); const int alignedHeight = AlignPowerOfTwo(fh.FrameHeight, 3); fh.MiCols = alignedWidth >> MI_SIZE_LOG2; fh.MiRows = alignedHeight >> MI_SIZE_LOG2; // set frame width and height in SB const uint32_t mibSizeLog2 = sh.sbSize == BLOCK_64X64 ? 4 : 5; const unsigned int widthMI = AlignPowerOfTwo(fh.MiCols, mibSizeLog2); const unsigned int heightMI = AlignPowerOfTwo(fh.MiRows, mibSizeLog2); fh.sbCols = widthMI >> mibSizeLog2; fh.sbRows = heightMI >> mibSizeLog2; } static void av1_setup_superres(AV1Bitstream& bs, FrameHeader& fh, SequenceHeader const& sh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); fh.UpscaledWidth = fh.FrameWidth; fh.SuperresDenom = SCALE_NUMERATOR; if (!sh.enable_superres) { AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } if (bs.GetBit()) { uint32_t denom = bs.GetBits(SUPERRES_SCALE_BITS); denom += SUPERRES_SCALE_DENOMINATOR_MIN; if (denom != SCALE_NUMERATOR) fh.FrameWidth = (fh.FrameWidth * SCALE_NUMERATOR + denom / 2) / (denom); fh.SuperresDenom = denom; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_setup_render_size(AV1Bitstream& bs, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); fh.RenderWidth = fh.UpscaledWidth; fh.RenderHeight = fh.FrameHeight; if (bs.GetBit()) { fh.RenderWidth = bs.GetBits(16) + 1; fh.RenderHeight = bs.GetBits(16) + 1; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_setup_frame_size(AV1Bitstream& bs, FrameHeader& fh, SequenceHeader const& sh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (fh.frame_size_override_flag) { fh.FrameWidth = bs.GetBits(sh.frame_width_bits) + 1; fh.FrameHeight = bs.GetBits(sh.frame_height_bits) + 1; if (fh.FrameWidth > sh.max_frame_width || fh.FrameHeight > sh.max_frame_height) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } else { fh.FrameWidth = sh.max_frame_width; fh.FrameHeight = sh.max_frame_height; } av1_setup_superres(bs, fh, sh); av1_set_mi_and_sb_size(fh, sh); av1_setup_render_size(bs, fh); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_setup_frame_size_with_refs(AV1Bitstream& bs, FrameHeader& fh, DPBType const& frameDpb, SequenceHeader const& sh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); bool bFound = false; for (uint8_t i = 0; i < INTER_REFS; ++i) { if (bs.GetBit()) { bFound = true; FrameHeader const& refHrd = frameDpb[fh.ref_frame_idx[i]]->GetFrameHeader(); fh.FrameWidth = refHrd.UpscaledWidth; fh.FrameHeight = refHrd.FrameHeight; fh.RenderWidth = refHrd.RenderWidth; fh.RenderHeight = refHrd.RenderHeight; av1_setup_superres(bs, fh, sh); break; } } if (!bFound) { // here AV1 spec 1.0 contradicts to reference implementation: // AV1 spec calls frame_size() which internally checks frame_size_override_flag before reading width/heignt from bs // reference implementation reads width/height from bs right away w/o preliminary check of frame_size_override_flag // current code mimics behavior of reference implementation fh.FrameWidth = bs.GetBits(sh.frame_width_bits) + 1; fh.FrameHeight = bs.GetBits(sh.frame_height_bits) + 1; av1_setup_superres(bs, fh, sh); av1_setup_render_size(bs, fh); } av1_set_mi_and_sb_size(fh, sh); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_setup_loop_filter(AV1Bitstream& bs, LoopFilterParams& params, FrameHeader const& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (fh.CodedLossless || fh.allow_intrabc) { SetDefaultLFParams(params); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } params.loop_filter_level[0] = bs.GetBits(6); params.loop_filter_level[1] = bs.GetBits(6); if (fh.NumPlanes > 1) { if (params.loop_filter_level[0] || params.loop_filter_level[1]) { params.loop_filter_level[2] = bs.GetBits(6); params.loop_filter_level[3] = bs.GetBits(6); } } params.loop_filter_sharpness = bs.GetBits(3); params.loop_filter_delta_update = 0; params.loop_filter_delta_enabled = (uint8_t)bs.GetBit(); if (params.loop_filter_delta_enabled) { params.loop_filter_delta_update = (uint8_t)bs.GetBit(); if (params.loop_filter_delta_update) { uint8_t bits = 6; for (uint32_t i = 0; i < TOTAL_REFS; i++) { if (bs.GetBit()) { const uint8_t nbits = sizeof(unsigned) * 8 - bits - 1; const uint32_t value = (unsigned)bs.GetBits(bits + 1) << nbits; params.loop_filter_ref_deltas[i] = (int8_t)(((int32_t)value) >> nbits); } } for (uint32_t i = 0; i < MAX_MODE_LF_DELTAS; i++) { if (bs.GetBit()) { const uint8_t nbits = sizeof(unsigned) * 8 - bits - 1; const uint32_t value = (unsigned)bs.GetBits(bits + 1) << nbits; params.loop_filter_mode_deltas[i] = (int8_t)(((int32_t)value) >> nbits); } } } } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_cdef(AV1Bitstream& bs, CdefParams& params, SequenceHeader const& sh, FrameHeader const& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (fh.CodedLossless || fh.allow_intrabc || !sh.enable_cdef) { params.cdef_damping = 3; std::fill_n(params.cdef_y_strength, std::extent::value, 0); std::fill_n(params.cdef_uv_strength, std::extent::value, 0); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } params.cdef_damping = bs.GetBits(2) + 3; params.cdef_bits = bs.GetBits(2); uint32_t numStrengths = 1 << params.cdef_bits; for (uint8_t i = 0; i < numStrengths; i++) { params.cdef_y_pri_strength[i] = bs.GetBits(4); params.cdef_y_sec_strength[i] = bs.GetBits(2); if (fh.NumPlanes > 1) { params.cdef_uv_pri_strength[i] = bs.GetBits(4); params.cdef_uv_sec_strength[i] = bs.GetBits(2); } } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_lr_params(AV1Bitstream& bs, LRParams& params, SequenceHeader const& sh, FrameHeader const& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (fh.AllLossless || fh.allow_intrabc || !sh.enable_restoration) { AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } bool usesLR = false; bool usesChromaLR = false; for (uint8_t p = 0; p < fh.NumPlanes; ++p) { if (bs.GetBit()) { params.lr_type[p] = bs.GetBit() ? RESTORE_SGRPROJ : RESTORE_WIENER; } else { params.lr_type[p] = bs.GetBit() ? RESTORE_SWITCHABLE : RESTORE_NONE; } if (params.lr_type[p] != RESTORE_NONE) { usesLR = true; if (p != 0) usesChromaLR = true; } } if (usesLR) { if (sh.sbSize == BLOCK_128X128) params.lr_unit_shift = bs.GetBit() + 1; else { params.lr_unit_shift = bs.GetBit(); if (params.lr_unit_shift) params.lr_unit_shift += bs.GetBit(); // lr_unit_extra_shift } if (sh.color_config.subsampling_x && sh.color_config.subsampling_y && usesChromaLR) params.lr_uv_shift = bs.GetBit(); } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_tx_mode(AV1Bitstream& bs, FrameHeader& fh, bool allLosless) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (allLosless) fh.TxMode = ONLY_4X4; else fh.TxMode = bs.GetBit() ? TX_MODE_SELECT : TX_MODE_LARGEST; AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_frame_reference_mode(AV1Bitstream& bs, FrameHeader& fh, DPBType const&) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); fh.reference_mode = SINGLE_REFERENCE; if (!FrameIsIntra(fh)) { fh.reference_mode = bs.GetBit() ? REFERENCE_MODE_SELECT : SINGLE_REFERENCE; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_compound_tools(AV1Bitstream& bs, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (!FrameIsIntra(fh)) fh.enable_interintra_compound = bs.GetBit(); if (!FrameIsIntra(fh) && fh.reference_mode != SINGLE_REFERENCE) fh.enable_masked_compound = bs.GetBit(); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline int32_t av1_get_relative_dist(SequenceHeader const& sh, const uint32_t a, const uint32_t b) { if (!sh.enable_order_hint) return 0; const uint32_t bits = sh.order_hint_bits_minus1 + 1; int32_t diff = a - b; int32_t m = 1 << (bits - 1); diff = (diff & (m - 1)) - (diff & m); return diff; } static bool av1_is_skip_mode_allowed(FrameHeader const& fh, SequenceHeader const& sh, DPBType const& frameDpb) { if (!sh.enable_order_hint || FrameIsIntra(fh) || fh.reference_mode == SINGLE_REFERENCE) return false; const int32_t MAX_VALUE = (std::numeric_limits::max)(); const int32_t INVALID_IDX = -1; int32_t refFrameOffset[2] = { -1, MAX_VALUE }; int refIdx[2] = { INVALID_IDX, INVALID_IDX }; // Identify the nearest forward and backward references. for (int32_t i = 0; i < INTER_REFS; ++i) { AV1DecoderFrame *pFrame = frameDpb[fh.ref_frame_idx[i]]; if (!pFrame || pFrame->UID == -1) continue; FrameHeader const& refHdr = pFrame->GetFrameHeader(); const uint32_t refOrderHint = refHdr.order_hint; if (av1_get_relative_dist(sh, refOrderHint, fh.order_hint) < 0) { // Forward reference if (refFrameOffset[0] == -1 || av1_get_relative_dist(sh, refOrderHint, refFrameOffset[0]) > 0) { refFrameOffset[0] = refOrderHint; refIdx[0] = i; } } else if (av1_get_relative_dist(sh, refOrderHint, fh.order_hint) > 0) { // Backward reference if (refFrameOffset[1] == MAX_VALUE || av1_get_relative_dist(sh, refOrderHint, refFrameOffset[1]) < 0) { refFrameOffset[1] = refOrderHint; refIdx[1] = i; } } } if (refIdx[0] != INVALID_IDX && refIdx[1] != INVALID_IDX) { return true; } else if (refIdx[0] != INVALID_IDX && refIdx[1] == INVALID_IDX) { // == Forward prediction only == // Identify the second nearest forward reference. refFrameOffset[1] = -1; for (int i = 0; i < INTER_REFS; ++i) { FrameHeader const& refHdr = frameDpb[fh.ref_frame_idx[i]]->GetFrameHeader(); const uint32_t refOrderHint = refHdr.order_hint; if ((refFrameOffset[0] >= 0 && av1_get_relative_dist(sh, refOrderHint, refFrameOffset[0]) < 0) && (refFrameOffset[1] < 0 || av1_get_relative_dist(sh, refOrderHint, refFrameOffset[1]) > 0)) { // Second closest forward reference refFrameOffset[1] = refOrderHint; refIdx[1] = i; } } if (refFrameOffset[1] >= 0) return true; } return false; } inline int32_t av1_read_q_delta(AV1Bitstream& bs) { return (bs.GetBit()) ? read_inv_signed_literal(bs, 6) : 0; } inline void av1_setup_quantization(AV1Bitstream& bs, QuantizationParams& params, SequenceHeader const& sh, int numPlanes) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); params.base_q_idx = bs.GetBits(UMC_VP9_DECODER::QINDEX_BITS); params.DeltaQYDc = av1_read_q_delta(bs); if (numPlanes > 1) { int32_t diffUVDelta = 0; if (sh.color_config.separate_uv_delta_q) diffUVDelta = bs.GetBit(); params.DeltaQUDc = av1_read_q_delta(bs); params.DeltaQUAc = av1_read_q_delta(bs); if (diffUVDelta) { params.DeltaQVDc = av1_read_q_delta(bs); params.DeltaQVAc = av1_read_q_delta(bs); } else { params.DeltaQVDc = params.DeltaQUDc; params.DeltaQVAc = params.DeltaQUAc; } } params.using_qmatrix = bs.GetBit(); if (params.using_qmatrix) { params.qm_y = bs.GetBits(QM_LEVEL_BITS); params.qm_u = bs.GetBits(QM_LEVEL_BITS); if (!sh.color_config.separate_uv_delta_q) params.qm_v = params.qm_u; else params.qm_v = bs.GetBits(QM_LEVEL_BITS); } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline bool av1_setup_segmentation(AV1Bitstream& bs, SegmentationParams& params, FrameHeader const& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); bool segmentQuantizerActive = false; params.segmentation_update_map = 0; params.segmentation_update_data = 0; params.segmentation_enabled = bs.GetBit(); if (params.segmentation_enabled) { if (fh.primary_ref_frame == PRIMARY_REF_NONE) { params.segmentation_update_map = 1; params.segmentation_temporal_update = 0; params.segmentation_update_data = 1; } else { params.segmentation_update_map = bs.GetBit(); if (params.segmentation_update_map) params.segmentation_temporal_update = bs.GetBit(); params.segmentation_update_data = bs.GetBit(); } if (params.segmentation_update_data) { ClearAllSegFeatures(params); for (uint8_t i = 0; i < VP9_MAX_NUM_OF_SEGMENTS; ++i) { for (uint8_t j = 0; j < SEG_LVL_MAX; ++j) { int32_t data = 0; if (bs.GetBit()) // feature_enabled { if (j == SEG_LVL_ALT_Q) segmentQuantizerActive = true; EnableSegFeature(params, i, (SEG_LVL_FEATURES)j); const uint32_t nBits = UMC_VP9_DECODER::GetUnsignedBits(SEG_FEATURE_DATA_MAX[j]); const uint32_t isSigned = IsSegFeatureSigned((SEG_LVL_FEATURES)j); const int32_t dataMax = SEG_FEATURE_DATA_MAX[j]; const int32_t dataMin = -dataMax; if (isSigned) data = read_inv_signed_literal(bs, nBits); else data = bs.GetBits(nBits); data = mfx::clamp(data, dataMin, dataMax); } SetSegData(params, i, (SEG_LVL_FEATURES)j, data); } } } } else ClearAllSegFeatures(params); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return segmentQuantizerActive; } struct TileLimits { uint32_t maxTileWidthSB; uint32_t maxTileHeightSB; uint32_t maxTileAreaInSB; uint32_t maxlog2_tile_cols; uint32_t maxlog2_tile_rows; uint32_t minlog2_tile_cols; uint32_t minlog2_tile_rows; uint32_t minLog2Tiles; }; inline uint32_t av1_tile_log2(uint32_t blockSize, uint32_t target) { uint32_t k; for (k = 0; (blockSize << k) < target; k++) {} return k; } inline void av1_get_tile_limits(FrameHeader const& fh, uint32_t sbSize, TileLimits& limits) { const uint32_t mibSizeLog2 = sbSize == BLOCK_64X64 ? 4 : 5; const uint32_t sbSizeLog2 = mibSizeLog2 + MI_SIZE_LOG2; limits.maxTileWidthSB = MAX_TILE_WIDTH >> sbSizeLog2; limits.maxTileAreaInSB = MAX_TILE_AREA >> (2 * sbSizeLog2); limits.minlog2_tile_cols = av1_tile_log2(limits.maxTileWidthSB,fh.sbCols); limits.maxlog2_tile_cols = av1_tile_log2(1, std::min(fh.sbCols, MAX_TILE_COLS)); limits.maxlog2_tile_rows = av1_tile_log2(1, std::min(fh.sbRows, MAX_TILE_ROWS)); limits.minLog2Tiles = av1_tile_log2(limits.maxTileAreaInSB, fh.sbCols * fh.sbRows); limits.minLog2Tiles = std::max(limits.minLog2Tiles, limits.minlog2_tile_cols); } static void av1_calculate_tile_cols(TileInfo& info, TileLimits& limits, FrameHeader const& fh, uint32_t sbSize) { uint32_t i; if (info.uniform_tile_spacing_flag) { uint32_t startSB; unsigned int sizeSB = AlignPowerOfTwo(fh.sbCols, info.TileColsLog2); sizeSB >>= info.TileColsLog2; assert(sizeSB > 0); for (i = 0, startSB = 0; startSB < fh.sbCols; i++) { info.SbColStarts[i] = startSB; startSB += sizeSB; } info.TileCols = i; info.SbColStarts[i] = fh.sbCols; limits.minlog2_tile_rows = std::max(static_cast(limits.minLog2Tiles - info.TileColsLog2), 0); limits.maxTileHeightSB = fh.sbRows >> limits.minlog2_tile_rows; const uint32_t mibSizeLog2 = sbSize == BLOCK_64X64 ? 4 : 5; info.TileWidth = sizeSB << mibSizeLog2; info.TileWidth = std::min(info.TileWidth, fh.MiCols); } else { limits.maxTileAreaInSB = (fh.sbRows * fh.sbCols); uint32_t widestTileSB = 1; info.TileColsLog2 = av1_tile_log2(1, info.TileCols); for (i = 0; i < info.TileCols; i++) { uint32_t sizeSB = info.SbColStarts[i + 1] - info.SbColStarts[i]; widestTileSB = std::max(widestTileSB, sizeSB); } if (limits.minLog2Tiles) limits.maxTileAreaInSB >>= (limits.minLog2Tiles + 1); limits.maxTileHeightSB = std::max(limits.maxTileAreaInSB / widestTileSB, 1u); const uint32_t mibSize = sbSize == BLOCK_64X64 ? 16 : 32; info.TileWidth = widestTileSB * mibSize; } } static void av1_calculate_tile_rows(TileInfo& info, FrameHeader const& fh, uint32_t sbSize) { uint32_t startSB; uint32_t sizeSB; uint32_t i; if (info.uniform_tile_spacing_flag) { sizeSB = AlignPowerOfTwo(fh.sbRows, info.TileRowsLog2); sizeSB >>= info.TileRowsLog2; assert(sizeSB > 0); for (i = 0, startSB = 0; startSB < fh.sbRows; i++) { info.SbRowStarts[i] = startSB; startSB += sizeSB; } info.TileRows = i; info.SbRowStarts[i] = fh.sbRows; const uint32_t mibSizeLog2 = sbSize == BLOCK_64X64 ? 4 : 5; info.TileHeight = sizeSB << mibSizeLog2; info.TileHeight = std::min(info.TileHeight, fh.MiRows); } else { info.TileRowsLog2 = av1_tile_log2(1, info.TileRows); uint32_t highestTileSB = 1; for (i = 0; i < info.TileRows; i++) { sizeSB = info.SbRowStarts[i + 1] - info.SbRowStarts[i]; highestTileSB = std::max(highestTileSB, sizeSB); } const uint32_t mibSize = sbSize == BLOCK_64X64 ? 16 : 32; info.TileHeight = highestTileSB * mibSize; } } static void av1_read_tile_info_max_tile(AV1Bitstream& bs, TileInfo& info, FrameHeader const& fh, uint32_t sbSize) { TileLimits limits = {}; av1_get_tile_limits(fh, sbSize, limits); info.uniform_tile_spacing_flag = bs.GetBit(); // Read tile columns if (info.uniform_tile_spacing_flag) { info.TileColsLog2 = limits.minlog2_tile_cols; while (info.TileColsLog2 < limits.maxlog2_tile_cols) { if (!bs.GetBit()) break; info.TileColsLog2++; } } else { uint32_t i; uint32_t startSB; uint32_t sbCols = fh.sbCols; for (i = 0, startSB = 0; sbCols > 0 && i < MAX_TILE_COLS; i++) { const uint32_t sizeInSB = 1 + read_uniform(bs, std::min(sbCols, limits.maxTileWidthSB)); info.SbColStarts[i] = startSB; startSB += sizeInSB; sbCols -= sizeInSB; } info.TileCols = i; info.SbColStarts[i] = startSB + sbCols; } av1_calculate_tile_cols(info, limits, fh, sbSize); if (!info.TileCols) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); // Read tile rows if (info.uniform_tile_spacing_flag) { info.TileRowsLog2 = limits.minlog2_tile_rows; while (info.TileRowsLog2 < limits.maxlog2_tile_rows) { if (!bs.GetBit()) break; info.TileRowsLog2++; } } else { uint32_t i; uint32_t startSB; uint32_t sbRows = fh.sbRows; for (i = 0, startSB = 0; sbRows > 0 && i < MAX_TILE_ROWS; i++) { const uint32_t sizeSB = 1 + read_uniform(bs, std::min(sbRows, limits.maxTileHeightSB)); info.SbRowStarts[i] = startSB; startSB += sizeSB; sbRows -= sizeSB; } info.TileRows = i; info.SbRowStarts[i] = startSB + sbRows; } av1_calculate_tile_rows(info, fh, sbSize); } inline void av1_read_tile_info(AV1Bitstream& bs, TileInfo& info, FrameHeader const& fh, uint32_t sbSize) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); av1_read_tile_info_max_tile(bs, info, fh, sbSize); if (info.TileColsLog2 || info.TileRowsLog2) info.context_update_tile_id = bs.GetBits(info.TileColsLog2 + info.TileRowsLog2); if (NumTiles(info) > 1) info.TileSizeBytes = bs.GetBits(2) + 1; AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } const GlobalMotionParams default_warp_params = { IDENTITY, { 0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0, (1 << WARPEDMODEL_PREC_BITS), 0, 0 }, 0, 0, 0, 0, 0 }; inline bool av1_read_global_motion_params(AV1Bitstream& bs, GlobalMotionParams& params, GlobalMotionParams const& ref_params, FrameHeader const& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); const uint8_t SUBEXPFIN_K = 3; const uint8_t GM_TRANS_PREC_BITS = 6; const uint8_t GM_ABS_TRANS_BITS = 12; const uint8_t GM_ABS_TRANS_ONLY_BITS = (GM_ABS_TRANS_BITS - GM_TRANS_PREC_BITS + 3); const uint8_t GM_TRANS_PREC_DIFF = WARPEDMODEL_PREC_BITS - GM_TRANS_PREC_BITS; const uint8_t GM_TRANS_ONLY_PREC_DIFF = WARPEDMODEL_PREC_BITS - 3; const uint16_t GM_TRANS_DECODE_FACTOR = 1 << GM_TRANS_PREC_DIFF; const uint16_t GM_TRANS_ONLY_DECODE_FACTOR = 1 << GM_TRANS_ONLY_PREC_DIFF; const uint8_t GM_ALPHA_PREC_BITS = 15; const uint8_t GM_ABS_ALPHA_BITS = 12; const int8_t GM_ALPHA_PREC_DIFF = WARPEDMODEL_PREC_BITS - GM_ALPHA_PREC_BITS; const uint8_t GM_ALPHA_DECODE_FACTOR = 1 << GM_ALPHA_PREC_DIFF; const uint16_t GM_ALPHA_MAX = 1 << GM_ABS_ALPHA_BITS; TRANSFORMATION_TYPE type; type = static_cast(bs.GetBit()); if (type != IDENTITY) { if (bs.GetBit()) type = ROTZOOM; else type = bs.GetBit() ? TRANSLATION : AFFINE; } params = default_warp_params; params.wmtype = type; if (type >= ROTZOOM) { params.wmmat[2] = read_signed_primitive_refsubexpfin( bs, GM_ALPHA_MAX + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[2] >> GM_ALPHA_PREC_DIFF) - (1 << GM_ALPHA_PREC_BITS)) * GM_ALPHA_DECODE_FACTOR + (1 << WARPEDMODEL_PREC_BITS); params.wmmat[3] = read_signed_primitive_refsubexpfin( bs, GM_ALPHA_MAX + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[3] >> GM_ALPHA_PREC_DIFF)) * GM_ALPHA_DECODE_FACTOR; } if (type >= AFFINE) { params.wmmat[4] = read_signed_primitive_refsubexpfin( bs, GM_ALPHA_MAX + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[4] >> GM_ALPHA_PREC_DIFF)) * GM_ALPHA_DECODE_FACTOR; params.wmmat[5] = read_signed_primitive_refsubexpfin( bs, GM_ALPHA_MAX + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[5] >> GM_ALPHA_PREC_DIFF) - (1 << GM_ALPHA_PREC_BITS)) * GM_ALPHA_DECODE_FACTOR + (1 << WARPEDMODEL_PREC_BITS); } else { params.wmmat[4] = -params.wmmat[3]; params.wmmat[5] = params.wmmat[2]; } if (type >= TRANSLATION) { const uint8_t disallowHP = fh.allow_high_precision_mv ? 0 : 1; const int32_t trans_bits = (type == TRANSLATION) ? GM_ABS_TRANS_ONLY_BITS - disallowHP : GM_ABS_TRANS_BITS; const int32_t trans_dec_factor = (type == TRANSLATION) ? GM_TRANS_ONLY_DECODE_FACTOR * (1 << disallowHP) : GM_TRANS_DECODE_FACTOR; const int32_t trans_prec_diff = (type == TRANSLATION) ? GM_TRANS_ONLY_PREC_DIFF + disallowHP : GM_TRANS_PREC_DIFF; params.wmmat[0] = read_signed_primitive_refsubexpfin( bs, (1 << trans_bits) + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[0] >> trans_prec_diff)) * trans_dec_factor; params.wmmat[1] = read_signed_primitive_refsubexpfin( bs, (1 << trans_bits) + 1, SUBEXPFIN_K, static_cast(ref_params.wmmat[1] >> trans_prec_diff)) * trans_dec_factor; } if (params.wmtype <= AFFINE) { const bool goodParams = av1_get_shear_params(params); if (!goodParams) return false; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return true; } inline void av1_read_global_motion(AV1Bitstream& bs, FrameHeader& fh, DPBType const& frameDpb) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); for (int i = 0; i < TOTAL_REFS; i++) { fh.global_motion_params[i] = default_warp_params; } if (FrameIsIntra(fh)) { AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } int frame; for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame) { FrameHeader const* refFH = nullptr; if (fh.primary_ref_frame != PRIMARY_REF_NONE) refFH = &frameDpb[fh.ref_frame_idx[fh.primary_ref_frame]]->GetFrameHeader(); GlobalMotionParams const& ref_params = fh.error_resilient_mode || !refFH ? default_warp_params : refFH->global_motion_params[frame]; GlobalMotionParams& params = fh.global_motion_params[frame]; const bool goodParams = av1_read_global_motion_params(bs, params, ref_params, fh); if (!goodParams) params.invalid = 1; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } static void av1_read_film_grain_params(AV1Bitstream& bs, FilmGrainParams& params, SequenceHeader const& sh, FrameHeader const& fh, DPBType const& frameDpb) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); params.apply_grain = bs.GetBit(); if (!params.apply_grain) { params = FilmGrainParams{}; AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } params.grain_seed = bs.GetBits(16); if (fh.frame_type == INTER_FRAME) params.update_grain = bs.GetBit(); else params.update_grain = 1; if (!params.update_grain) { // inherit parameters from a previous reference frame int film_grain_params_ref_idx = bs.GetBits(3); FrameHeader const* refFH = nullptr; refFH = &frameDpb[film_grain_params_ref_idx]->GetFrameHeader(); uint32_t random_seed = params.grain_seed; params = refFH->film_grain_params; params.grain_seed = random_seed; AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); return; } // Scaling functions parameters params.num_y_points = bs.GetBits(4); // max 14 if (params.num_y_points > MAX_POINTS_IN_SCALING_FUNCTION_LUMA) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); for (int i = 0; i < params.num_y_points; i++) { params.point_y_value[i] = bs.GetBits(8); if (i && params.point_y_value[i - 1] >= params.point_y_value[i]) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); params.point_y_scaling[i] = bs.GetBits(8); } if (!sh.color_config.mono_chrome) params.chroma_scaling_from_luma = bs.GetBit(); if (sh.color_config.mono_chrome || params.chroma_scaling_from_luma || (sh.color_config.subsampling_x == 1 && sh.color_config.subsampling_y == 1 && params.num_y_points == 0)) { params.num_cb_points = 0; params.num_cr_points = 0; } else { params.num_cb_points = bs.GetBits(4); // max 10 if (params.num_cb_points > MAX_POINTS_IN_SCALING_FUNCTION_CHROMA) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); for (int i = 0; i < params.num_cb_points; i++) { params.point_cb_value[i] = bs.GetBits(8); if (i && params.point_cb_value[i - 1] >= params.point_cb_value[i]) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); params.point_cb_scaling[i] = bs.GetBits(8); } params.num_cr_points = bs.GetBits(4); // max 10 if (params.num_cr_points > MAX_POINTS_IN_SCALING_FUNCTION_CHROMA) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); for (int i = 0; i < params.num_cr_points; i++) { params.point_cr_value[i] = bs.GetBits(8); if (i && params.point_cr_value[i - 1] >= params.point_cr_value[i]) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); params.point_cr_scaling[i] = bs.GetBits(8); } } params.grain_scaling = bs.GetBits(2) + 8; // 8 + value // AR coefficients // Only sent if the corresponsing scaling function has // more than 0 points params.ar_coeff_lag = bs.GetBits(2); int num_pos_luma = 2 * params.ar_coeff_lag * (params.ar_coeff_lag + 1); int num_pos_chroma = num_pos_luma; if (params.num_y_points > 0) ++num_pos_chroma; if (params.num_y_points) for (int i = 0; i < num_pos_luma; i++) params.ar_coeffs_y[i] = bs.GetBits(8) - 128; if (params.num_cb_points || params.chroma_scaling_from_luma) for (int i = 0; i < num_pos_chroma; i++) params.ar_coeffs_cb[i] = bs.GetBits(8) - 128; if (params.num_cr_points || params.chroma_scaling_from_luma) for (int i = 0; i < num_pos_chroma; i++) params.ar_coeffs_cr[i] = bs.GetBits(8) - 128; params.ar_coeff_shift = bs.GetBits(2) + 6; // 6 + value params.grain_scale_shift = bs.GetBits(2); if (params.num_cb_points) { params.cb_mult = bs.GetBits(8); params.cb_luma_mult = bs.GetBits(8); params.cb_offset = bs.GetBits(9); } if (params.num_cr_points) { params.cr_mult = bs.GetBits(8); params.cr_luma_mult = bs.GetBits(8); params.cr_offset = bs.GetBits(9); } params.overlap_flag = bs.GetBit(); params.clip_to_restricted_range = bs.GetBit(); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } static void av1_read_film_grain(AV1Bitstream& bs, SequenceHeader const& sh, FrameHeader& fh, DPBType const& frameDpb) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (fh.show_frame || fh.showable_frame) { if (sh.film_grain_param_present) av1_read_film_grain_params(bs, fh.film_grain_params, sh, fh, frameDpb); else fh.film_grain_params = FilmGrainParams{}; fh.film_grain_params.BitDepth = sh.color_config.BitDepth; } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_obu_size(AV1Bitstream& bs, size_t& size, size_t& length) { size_t start = bs.BytesDecoded(); size = read_leb128(bs); length = bs.BytesDecoded() - start; } OBUHeader av1_read_obu_header(AV1Bitstream& bs) { bs.GetBit(); // first bit is obu_forbidden_bit (0) - hello and thanks to Dima G. :) OBUHeader header = {}; header.obu_type = (AV1_OBU_TYPE)bs.GetBits(4); const int obu_extension_flag = bs.GetBit(); header.obu_has_size_field = bs.GetBit(); bs.GetBit(); // reserved if (obu_extension_flag) // if has extension { header.temporal_id = bs.GetBits(3); header.spatial_id = bs.GetBits(2); bs.GetBits(3); // reserved } return header; } void AV1Bitstream::ReadOBUInfo(OBUInfo& info) { size_t sizeFieldLength = 0; size_t obu_size = 0; const size_t start = BytesDecoded(); info.header = av1_read_obu_header(*this); size_t headerSize = BytesDecoded() - start; if (info.header.obu_has_size_field) av1_read_obu_size(*this, obu_size, sizeFieldLength); else if (info.header.obu_type != OBU_TEMPORAL_DELIMITER) throw av1_exception(UMC::UMC_ERR_NOT_IMPLEMENTED); // no support for OBUs w/o size field so far info.size = headerSize + sizeFieldLength + obu_size; } void AV1Bitstream::ReadByteAlignment() { if (m_bitOffset) { const uint32_t bitsToRead = 8 - m_bitOffset; const uint32_t bits = GetBits(bitsToRead); if (bits) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } } void AV1Bitstream::ReadTileGroupHeader(FrameHeader const& fh, TileGroupInfo& info) { uint8_t tile_start_and_end_present_flag = 0; if (NumTiles(fh.tile_info) > 1) tile_start_and_end_present_flag = GetBit(); if (tile_start_and_end_present_flag) { const uint32_t log2Tiles = fh.tile_info.TileColsLog2 + fh.tile_info.TileRowsLog2; info.startTileIdx = GetBits(log2Tiles); info.endTileIdx = GetBits(log2Tiles); info.numTiles = info.endTileIdx - info.startTileIdx + 1; } else { info.numTiles = NumTiles(fh.tile_info); info.startTileIdx = 0; info.endTileIdx = info.numTiles - 1; } ReadByteAlignment(); } void AV1Bitstream::ReadTileListHeader(FrameHeader const&, TileListInfo& tlHeader) { tlHeader.frameWidthInTiles = GetBits(8)+1; tlHeader.frameHeightInTiles = GetBits(8)+1; tlHeader.numTiles = GetBits(16) + 1; if (tlHeader.numTiles > MAX_NUM_TILES_IN_LIST) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } void AV1Bitstream::ReadTileListEntry(TileListInfo const&, TileLocation& entry) { entry.anchorFrameIdx = GetBits(8); if (entry.anchorFrameIdx < 0 || entry.anchorFrameIdx >= (int32_t)MAX_EXTERNAL_REFS) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); entry.anchorTileRow = GetBits(8); entry.anchorTileCol = GetBits(8); entry.size = GetBits(16) + 1; entry.tile_location_type = 1; } uint64_t AV1Bitstream::GetLE(uint32_t n) { assert(m_bitOffset == 0); assert(n <= 8); uint64_t t = 0; for (uint32_t i = 0; i < n; i++) { if (BytesLeft() <= 0) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); t += (*m_pbs++) << (i * 8); } return t; } void AV1Bitstream::ReadTile(uint32_t const tileSizeBytes, size_t& reportedSize, size_t& actualSize) { const size_t tile_size_minus_1 = static_cast(GetLE(tileSizeBytes)); actualSize = reportedSize = tile_size_minus_1 + 1; if (BytesLeft() < reportedSize) actualSize = BytesLeft(); m_pbs += actualSize; } void AV1Bitstream::ReadTileListEntryData(size_t const tileSizeBytes, size_t& actualSize) { actualSize = tileSizeBytes; if (BytesLeft() < tileSizeBytes) actualSize = BytesLeft(); m_pbs += actualSize; } void AV1Bitstream::ReadSequenceHeader(SequenceHeader& sh) { AV1D_LOG("[+]: %d", (uint32_t)BitsDecoded()); sh.seq_profile = GetBits(3); sh.still_picture = GetBit(); sh.reduced_still_picture_header = GetBit(); if (sh.reduced_still_picture_header) GetBits(5); // seq_level_idx[0] else { sh.timing_info_present_flag = GetBit(); if (sh.timing_info_present_flag) { av1_timing_info(*this, sh.timing_info); sh.decoder_model_info_present_flag = GetBit(); if (sh.decoder_model_info_present_flag) av1_decoder_model_info(*this, sh.decoder_model_info); } const int initial_display_delay_present_flag = GetBit(); sh.operating_points_cnt_minus_1 = GetBits(5); for (unsigned int i = 0; i <= sh.operating_points_cnt_minus_1; i++) { sh.operating_point_idc[i] = GetBits(12); sh.seq_level_idx[i] = GetBits(5); if (sh.seq_level_idx[i] > 7) sh.seq_tier[i] = GetBit(); if (sh.decoder_model_info_present_flag) { sh.decoder_model_present_for_this_op[i] = GetBit(); if (sh.decoder_model_present_for_this_op[i]) av1_operating_parameters_info(*this, sh.operating_parameters_info[i], sh.decoder_model_info.buffer_delay_length_minus_1 + 1); } const int BufferPoolMaxSize = 10; // av1 spec E.2 sh.initial_display_delay_minus_1[i] = BufferPoolMaxSize - 1; if (initial_display_delay_present_flag) { if (GetBit()) // initial_display_delay_present_for_this_op[i] sh.initial_display_delay_minus_1[i] = GetBits(4); } } } sh.frame_width_bits = GetBits(4) + 1; sh.frame_height_bits = GetBits(4) + 1; sh.max_frame_width = GetBits(sh.frame_width_bits) + 1; sh.max_frame_height = GetBits(sh.frame_height_bits) + 1; if (sh.reduced_still_picture_header) { sh.frame_id_numbers_present_flag = 0; } else { sh.frame_id_numbers_present_flag = GetBit(); } if (sh.frame_id_numbers_present_flag) { sh.delta_frame_id_length = GetBits(4) + 2; sh.idLen = GetBits(3) + sh.delta_frame_id_length + 1; } sh.sbSize = GetBit() ? BLOCK_128X128 : BLOCK_64X64; sh.enable_filter_intra = GetBit(); sh.enable_intra_edge_filter = GetBit(); if (sh.reduced_still_picture_header) { sh.seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS; sh.seq_force_integer_mv = SELECT_INTEGER_MV; sh.order_hint_bits_minus1 = -1; } else { sh.enable_interintra_compound = GetBit(); sh.enable_masked_compound = GetBit(); sh.enable_warped_motion = GetBit(); sh.enable_dual_filter = GetBit(); sh.enable_order_hint = GetBit(); if (sh.enable_order_hint) { sh.enable_jnt_comp = GetBit(); sh.enable_ref_frame_mvs = GetBit(); } if (GetBit()) // seq_choose_screen_content_tools sh.seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS; else sh.seq_force_screen_content_tools = GetBit(); if (sh.seq_force_screen_content_tools > 0) { if (GetBit()) // seq_choose_integer_mv sh.seq_force_integer_mv = 2; else sh.seq_force_integer_mv = GetBit(); } else sh.seq_force_integer_mv = 2; sh.order_hint_bits_minus1 = sh.enable_order_hint ? GetBits(3) : -1; } sh.enable_superres = GetBit(); sh.enable_cdef = GetBit(); sh.enable_restoration = GetBit(); av1_color_config(*this, sh.color_config, sh.seq_profile); sh.film_grain_param_present = GetBit(); AV1D_LOG("[-]: %d", (uint32_t)BitsDecoded()); } struct RefFrameInfo { uint32_t mapIdx; uint32_t shiftedOrderHint; }; inline int32_t av1_compare_ref_frame_info(void const* left, void const* right) { assert(left); assert(right); RefFrameInfo const* a = (RefFrameInfo*)left; RefFrameInfo const* b = (RefFrameInfo*)right; if (a->shiftedOrderHint < b->shiftedOrderHint) return -1; if (a->shiftedOrderHint > b->shiftedOrderHint) return 1; return (a->mapIdx < b->mapIdx) ? -1 : ((a->mapIdx > b->mapIdx) ? 1 : 0); } static void av1_set_frame_refs(SequenceHeader const& sh, FrameHeader& fh, DPBType const& frameDpb, uint32_t last_frame_idx, uint32_t gold_frame_idx) { const uint32_t curFrameHint = 1 << sh.order_hint_bits_minus1; RefFrameInfo refFrameInfo[NUM_REF_FRAMES]; // RefFrameInfo structure contains // (1) shiftedOrderHint // (2) index in DPB (allows to correct sorting of frames having equal shiftedOrderHint) uint32_t refFlagList[INTER_REFS] = {}; for (int i = 0; i < NUM_REF_FRAMES; ++i) { const uint32_t mapIdx = i; refFrameInfo[i].mapIdx = mapIdx; FrameHeader const& refHdr = frameDpb[i]->GetFrameHeader(); refFrameInfo[i].shiftedOrderHint = curFrameHint + av1_get_relative_dist(sh, refHdr.order_hint, fh.order_hint); } const uint32_t lastOrderHint = refFrameInfo[last_frame_idx].shiftedOrderHint; const uint32_t goldOrderHint = refFrameInfo[gold_frame_idx].shiftedOrderHint; // Confirm both LAST_FRAME and GOLDEN_FRAME are valid forward reference frames if (lastOrderHint >= curFrameHint) { assert("lastOrderHint is not less than curFrameHint!"); throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } if (goldOrderHint >= curFrameHint) { assert("goldOrderHint is not less than curFrameHint!"); throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } // Sort ref frames based on their shiftedOrderHint values. qsort(refFrameInfo, NUM_REF_FRAMES, sizeof(RefFrameInfo), av1_compare_ref_frame_info); // Identify forward and backward reference frames. // Forward reference: ref order_hint < fh.order_hint // Backward reference: ref order_hint >= fh.order_hint int fwdStartIdx = 0; int fwdEndIdx = NUM_REF_FRAMES - 1; for (uint32_t i = 0; i < NUM_REF_FRAMES; i++) { if (refFrameInfo[i].shiftedOrderHint >= curFrameHint) { fwdEndIdx = i - 1; break; } } int bwdStartIdx = fwdEndIdx + 1; int bwdEndIdx = NUM_REF_FRAMES - 1; // === Backward Reference Frames === // == ALTREF_FRAME == if (bwdStartIdx <= bwdEndIdx) { fh.ref_frame_idx[ALTREF_FRAME - LAST_FRAME] = refFrameInfo[bwdEndIdx].mapIdx; refFlagList[ALTREF_FRAME - LAST_FRAME] = 1; bwdEndIdx--; } // == BWDREF_FRAME == if (bwdStartIdx <= bwdEndIdx) { fh.ref_frame_idx[BWDREF_FRAME - LAST_FRAME] = refFrameInfo[bwdStartIdx].mapIdx; refFlagList[BWDREF_FRAME - LAST_FRAME] = 1; bwdStartIdx++; } // == ALTREF2_FRAME == if (bwdStartIdx <= bwdEndIdx) { fh.ref_frame_idx[ALTREF2_FRAME - LAST_FRAME] = refFrameInfo[bwdStartIdx].mapIdx; refFlagList[ALTREF2_FRAME - LAST_FRAME] = 1; } // === Forward Reference Frames === for (int i = fwdStartIdx; i <= fwdEndIdx; ++i) { // == LAST_FRAME == if (refFrameInfo[i].mapIdx == last_frame_idx) { fh.ref_frame_idx[LAST_FRAME - LAST_FRAME] = refFrameInfo[i].mapIdx; refFlagList[LAST_FRAME - LAST_FRAME] = 1; } // == GOLDEN_FRAME == if (refFrameInfo[i].mapIdx == gold_frame_idx) { fh.ref_frame_idx[GOLDEN_FRAME - LAST_FRAME] = refFrameInfo[i].mapIdx; refFlagList[GOLDEN_FRAME - LAST_FRAME] = 1; } } assert(refFlagList[LAST_FRAME - LAST_FRAME] == 1 && refFlagList[GOLDEN_FRAME - LAST_FRAME] == 1); // == LAST2_FRAME == // == LAST3_FRAME == // == BWDREF_FRAME == // == ALTREF2_FRAME == // == ALTREF_FRAME == // Set up the reference frames in the anti-chronological order. static const MV_REFERENCE_FRAME ref_frame_list[INTER_REFS - 2] = { LAST2_FRAME, LAST3_FRAME, BWDREF_FRAME, ALTREF2_FRAME, ALTREF_FRAME }; uint32_t refIdx; for (refIdx = 0; refIdx < (INTER_REFS - 2); refIdx++) { const MV_REFERENCE_FRAME refFrame = ref_frame_list[refIdx]; if (refFlagList[refFrame - LAST_FRAME] == 1) continue; while (fwdStartIdx <= fwdEndIdx && (refFrameInfo[fwdEndIdx].mapIdx == last_frame_idx || refFrameInfo[fwdEndIdx].mapIdx == gold_frame_idx)) { fwdEndIdx--; } if (fwdStartIdx > fwdEndIdx) break; fh.ref_frame_idx[refFrame - LAST_FRAME] = refFrameInfo[fwdEndIdx].mapIdx; refFlagList[refFrame - LAST_FRAME] = 1; fwdEndIdx--; } // Assign all the remaining frame(s), if any, to the earliest reference frame. for (; refIdx < (INTER_REFS - 2); refIdx++) { const MV_REFERENCE_FRAME refFrame = ref_frame_list[refIdx]; if (refFlagList[refFrame - LAST_FRAME] == 1) continue; fh.ref_frame_idx[refFrame - LAST_FRAME] = refFrameInfo[fwdStartIdx].mapIdx; refFlagList[refFrame - LAST_FRAME] = 1; } for (int i = 0; i < INTER_REFS; i++) assert(refFlagList[i] == 1); } static void av1_mark_ref_frames(SequenceHeader const& sh, FrameHeader& fh, DPBType const& frameDpb) { const uint32_t idLen = sh.idLen; const uint32_t diffLen = sh.delta_frame_id_length; for (int32_t i = 0; i < NUM_REF_FRAMES; i++) { FrameHeader const& refHdr = frameDpb[i]->GetFrameHeader(); if ((static_cast(fh.current_frame_id) - (1 << diffLen)) > 0) { if (refHdr.current_frame_id > fh.current_frame_id || refHdr.current_frame_id < fh.current_frame_id - (1 << diffLen)) frameDpb[i]->SetRefValid(false); } else { if (refHdr.current_frame_id > fh.current_frame_id && refHdr.current_frame_id < ((1 << idLen) + fh.current_frame_id - (1 << diffLen))) frameDpb[i]->SetRefValid(false); } } } inline void av1_read_timing_point_info(AV1Bitstream& bs, SequenceHeader const& sh, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (sh.decoder_model_info_present_flag && !sh.timing_info.equal_picture_interval) { const int n = sh.decoder_model_info.frame_presentation_time_length_minus_1 + 1; fh.frame_presentation_time = bs.GetBits(n); } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_interpolation_filter(AV1Bitstream& bs, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); if (bs.GetBit()) // is_filter_switchable fh.interpolation_filter = SWITCHABLE; else fh.interpolation_filter = static_cast(bs.GetBits(LOG2_SWITCHABLE_FILTERS)); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_delta_q_params(AV1Bitstream& bs, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); // here AV1 spec 1.0 contradicts to reference implementation: // spec sets fh.delta_q_res to 0 and reference sets it to 1 // current code mimics behavior of reference implementation fh.delta_q_res = 1; if (fh.quantization_params.base_q_idx > 0) fh.delta_q_present = bs.GetBit(); if (fh.delta_q_present) fh.delta_q_res = 1 << bs.GetBits(2); AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } inline void av1_read_delta_lf_params(AV1Bitstream& bs, FrameHeader& fh) { AV1D_LOG("[+]: %d", (uint32_t)bs.BitsDecoded()); // here AV1 spec 1.0 contradicts to reference implementation: // spec sets fh.delta_lf_res to 0 and reference sets it to 1 // current code mimics behavior of reference implementation fh.delta_lf_res = 1; if (fh.delta_q_present) { if (!fh.allow_intrabc) fh.delta_lf_present = bs.GetBit(); if (fh.delta_lf_present) { fh.delta_lf_res = 1 << bs.GetBits(2); fh.delta_lf_multi = bs.GetBit(); } } AV1D_LOG("[-]: %d", (uint32_t)bs.BitsDecoded()); } void AV1Bitstream::ReadUncompressedHeader(FrameHeader& fh, SequenceHeader const& sh, DPBType const& frameDpb, OBUHeader const& obuHeader, uint32_t& PreFrame_id) { using UMC_VP9_DECODER::REF_FRAMES_LOG2; AV1D_LOG("[+]: %d", (uint32_t)BitsDecoded()); fh.current_frame_id = PreFrame_id; if (sh.reduced_still_picture_header) { fh.frame_type = KEY_FRAME; fh.show_frame = 1; } else { fh.show_existing_frame = GetBit(); if (fh.show_existing_frame) { fh.frame_to_show_map_idx = GetBits(3); av1_read_timing_point_info(*this, sh, fh); FrameHeader & refHdr = frameDpb[fh.frame_to_show_map_idx]->GetFrameHeader(); if (sh.frame_id_numbers_present_flag) { fh.display_frame_id = GetBits(sh.idLen); // check that there is no confilct between display_frame_id and respective frame in DPB if ((fh.display_frame_id != refHdr.current_frame_id || false == frameDpb[fh.frame_to_show_map_idx]->RefValid())) { assert("Frame_to_show is absent in DPB or invalid!"); } } if (refHdr.frame_type == KEY_FRAME) { fh.current_frame_id = refHdr.current_frame_id; refHdr.refresh_frame_flags = 255; } // get frame resolution fh.FrameWidth = refHdr.FrameWidth; fh.FrameHeight = refHdr.FrameHeight; fh.show_frame = 1; PreFrame_id = fh.current_frame_id; AV1D_LOG("[-]: %d", (uint32_t)BitsDecoded()); return; } fh.frame_type = static_cast(GetBits(2)); fh.show_frame = GetBit(); if (fh.show_frame) { av1_read_timing_point_info(*this, sh, fh); fh.showable_frame = (fh.frame_type != KEY_FRAME); } else fh.showable_frame = GetBit(); if (fh.frame_type == SWITCH_FRAME || (fh.frame_type == KEY_FRAME && fh.show_frame)) fh.error_resilient_mode = 1; else fh.error_resilient_mode = GetBit(); } if (fh.frame_type == KEY_FRAME && !frameDpb.empty()) { for (int i = 0; i < NUM_REF_FRAMES; i++) if (frameDpb[i] != nullptr) { frameDpb[i]->SetRefValid(false); } } if (fh.frame_type != KEY_FRAME) { assert(frameDpb.size() == NUM_REF_FRAMES); } fh.disable_cdf_update = GetBit(); if (sh.seq_force_screen_content_tools == 2) fh.allow_screen_content_tools = GetBit(); else fh.allow_screen_content_tools = sh.seq_force_screen_content_tools; if (fh.allow_screen_content_tools) { if (sh.seq_force_integer_mv == 2) fh.force_integer_mv = GetBit(); else fh.force_integer_mv = sh.seq_force_integer_mv; } else fh.force_integer_mv = 0; if (FrameIsIntra(fh)) fh.force_integer_mv = 1; if (sh.frame_id_numbers_present_flag) { fh.current_frame_id = GetBits(sh.idLen); if (fh.frame_type != KEY_FRAME) { // check current_frame_id as described in AV1 spec 6.8.2 const uint32_t idLen = sh.idLen; const int32_t diffFrameId = fh.current_frame_id > PreFrame_id ? fh.current_frame_id - PreFrame_id : (1 << idLen) + fh.current_frame_id - PreFrame_id; if (fh.current_frame_id == PreFrame_id || diffFrameId >= (1 << (idLen - 1))) { assert("current_frame_id is incompliant to AV1 spec!"); throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } // check and mark ref frames as not valid as described in "Reference frame marking process" AV1 spec 5.9.4 av1_mark_ref_frames(sh, fh, frameDpb); } PreFrame_id = fh.current_frame_id; } if (fh.frame_type == SWITCH_FRAME) fh.frame_size_override_flag = 1; else if (sh.reduced_still_picture_header) fh.frame_size_override_flag = 0; else fh.frame_size_override_flag = GetBits(1); fh.order_hint = GetBits(sh.order_hint_bits_minus1 + 1); const uint8_t allFrames = (1 << NUM_REF_FRAMES) - 1; if (FrameIsResilient(fh)) fh.primary_ref_frame = PRIMARY_REF_NONE; else fh.primary_ref_frame = GetBits(PRIMARY_REF_BITS); if (sh.decoder_model_info_present_flag) { const int buffer_removal_time_present_flag = GetBit(); if (buffer_removal_time_present_flag) { for (uint32_t opNum = 0; opNum <= sh.operating_points_cnt_minus_1; opNum++) { if (sh.decoder_model_present_for_this_op[opNum]) { const int opPtIdc = sh.operating_point_idc[opNum]; const int inTemporalLayer = (opPtIdc >> obuHeader.temporal_id) & 1; const int inSpatialLayer = (opPtIdc >> (obuHeader.spatial_id + 8)) & 1; if (opPtIdc == 0 || (inTemporalLayer && inSpatialLayer)) { const int n = sh.decoder_model_info.buffer_removal_time_length_minus_1 + 1; GetBits(n); // buffer_removal_time } } } } } if (fh.frame_type == SWITCH_FRAME || (fh.frame_type == KEY_FRAME && fh.show_frame)) fh.refresh_frame_flags = allFrames; else fh.refresh_frame_flags = static_cast(GetBits(NUM_REF_FRAMES)); if (!FrameIsIntra(fh) || fh.refresh_frame_flags != allFrames) { if (fh.error_resilient_mode && sh.enable_order_hint) { for (int i = 0; i < NUM_REF_FRAMES; i++) { const int OrderHintBits = sh.order_hint_bits_minus1 + 1; fh.ref_order_hint[i] = GetBits(OrderHintBits); FrameHeader const& refHdr = frameDpb[i]->GetFrameHeader(); if (fh.ref_order_hint[i] != refHdr.order_hint) frameDpb[i]->SetRefValid(false); } } } if (KEY_FRAME == fh.frame_type) { for (uint8_t i = 0; i < INTER_REFS; ++i) { fh.ref_frame_idx[i] = -1; } av1_setup_frame_size(*this, fh, sh); if (fh.allow_screen_content_tools && fh.FrameWidth == fh.UpscaledWidth) fh.allow_intrabc = GetBit(); } else { if (FrameIsIntraOnly(fh)) { av1_setup_frame_size(*this, fh, sh); if (fh.allow_screen_content_tools && fh.FrameWidth == fh.UpscaledWidth) fh.allow_intrabc = GetBit(); } else { uint32_t frame_refs_short_signalling = 0; if (sh.enable_order_hint) frame_refs_short_signalling = GetBit(); if (frame_refs_short_signalling) { const uint32_t last_frame_idx = GetBits(REF_FRAMES_LOG2); const uint32_t gold_frame_idx = GetBits(REF_FRAMES_LOG2); // set last and gold reference frames fh.ref_frame_idx[LAST_FRAME - LAST_FRAME] = last_frame_idx; fh.ref_frame_idx[GOLDEN_FRAME - LAST_FRAME] = gold_frame_idx; // compute other active references as specified in "Set frame refs process" AV1 spec 7.8 av1_set_frame_refs(sh, fh, frameDpb, last_frame_idx, gold_frame_idx); } for (uint8_t i = 0; i < INTER_REFS; ++i) { if (!frame_refs_short_signalling) fh.ref_frame_idx[i] = GetBits(REF_FRAMES_LOG2); if (sh.frame_id_numbers_present_flag) { const int32_t deltaFrameId = GetBits(sh.delta_frame_id_length) + 1; // compute expected reference frame id from delta_frame_id and check that it's equal to one saved in DPB const uint32_t idLen = sh.idLen; const uint32_t expectedFrameId = ((fh.current_frame_id - deltaFrameId + (1 << idLen)) % (1 << idLen)); AV1DecoderFrame const* refFrm = frameDpb[fh.ref_frame_idx[i]]; FrameHeader const& refHdr = refFrm->GetFrameHeader(); if (expectedFrameId != refHdr.current_frame_id || false == refFrm->RefValid()) { assert("Active reference frame is absent in DPB or invalid!"); } } } if (fh.error_resilient_mode == 0 && fh.frame_size_override_flag) av1_setup_frame_size_with_refs(*this, fh, frameDpb, sh); else av1_setup_frame_size(*this, fh, sh); if (fh.force_integer_mv) fh.allow_high_precision_mv = 0; else fh.allow_high_precision_mv = GetBit(); av1_read_interpolation_filter(*this, fh); fh.is_motion_mode_switchable = GetBit(); if (FrameMightUsePrevFrameMVs(fh, sh)) { fh.use_ref_frame_mvs = GetBit(); } } } if (!fh.FrameWidth || !fh.FrameHeight) throw av1_exception(UMC::UMC_ERR_FAILED); const int mightBwdAdapt = !sh.reduced_still_picture_header && !fh.disable_cdf_update; if (mightBwdAdapt) fh.disable_frame_end_update_cdf = GetBit(); else fh.disable_frame_end_update_cdf = 1; if (fh.primary_ref_frame == PRIMARY_REF_NONE) SetupPastIndependence(fh); else Av1LoadPrevious(fh, frameDpb); av1_read_tile_info(*this, fh.tile_info, fh, sh.sbSize); fh.NumPlanes = GetNumPlanes(sh); av1_setup_quantization(*this, fh.quantization_params, sh, fh.NumPlanes); av1_setup_segmentation(*this, fh.segmentation_params, fh); av1_read_delta_q_params(*this, fh); av1_read_delta_lf_params(*this, fh); fh.CodedLossless = IsCodedLossless(fh); fh.AllLossless = fh.CodedLossless && (fh.FrameWidth == fh.UpscaledWidth); av1_setup_loop_filter(*this, fh.loop_filter_params, fh); av1_read_cdef(*this, fh.cdef_params, sh, fh); av1_read_lr_params(*this, fh.lr_params, sh, fh); av1_read_tx_mode(*this, fh, fh.CodedLossless); av1_read_frame_reference_mode(*this, fh, frameDpb); if (fh.large_scale_tile) fh.skip_mode_present = 0; else fh.skip_mode_present = av1_is_skip_mode_allowed(fh, sh, frameDpb) ? GetBit() : 0; if (!FrameIsResilient(fh) && sh.enable_warped_motion) fh.allow_warped_motion = GetBit(); fh.reduced_tx_set = GetBit(); av1_read_global_motion(*this, fh, frameDpb); if (!fh.large_scale_tile) av1_read_film_grain(*this, sh, fh, frameDpb); AV1D_LOG("[-]: %d", (uint32_t)BitsDecoded()); } } // namespace UMC_AV1_DECODER #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/umc_av1_decoder.cpp000077500000000000000000001232721443134507600316730ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include "umc_structures.h" #include "umc_frame_data.h" #include "umc_av1_decoder.h" #include "umc_av1_utils.h" #include "umc_av1_bitstream.h" #include "umc_av1_frame.h" #include #include "mfx_unified_av1d_logging.h" namespace UMC_AV1_DECODER { AV1Decoder::AV1Decoder() : allocator(nullptr) , sequence_header(nullptr) , counter(0) , Curr(nullptr) , Curr_temp(nullptr) , Repeat_show(0) , PreFrame_id(0) , OldPreFrame_id(0) , frame_order(0) , in_framerate(0) , repeateFrame(UMC::FRAME_MID_INVALID) , anchor_frames_count(0) , tile_list_idx(0) , frames_to_skip(0) , saved_clip_info_width(0) , saved_clip_info_height(0) , clip_info_size_saved(false) , m_prev_frame_header_exist(false) { outputed_frames.clear(); } AV1Decoder::~AV1Decoder() { std::for_each(std::begin(dpb), std::end(dpb), std::default_delete() ); outputed_frames.clear(); } inline bool CheckOBUType(AV1_OBU_TYPE type) { switch (type) { case OBU_TEMPORAL_DELIMITER: case OBU_SEQUENCE_HEADER: case OBU_FRAME_HEADER: case OBU_REDUNDANT_FRAME_HEADER: case OBU_FRAME: case OBU_TILE_GROUP: case OBU_TILE_LIST: case OBU_METADATA: case OBU_PADDING: return true; default: return false; } } inline uint32_t MapLevel(uint32_t levelIdx) { if (levelIdx < 20) return (2 + (levelIdx >> 2)) * 10 + (levelIdx & 3); else return MFX_LEVEL_UNKNOWN; } static bool IsNeedSPSInvalidate(const SequenceHeader *old_sps, const SequenceHeader *new_sps) { if (!old_sps || !new_sps) { return false; } if ((old_sps->max_frame_width != new_sps->max_frame_width) || (old_sps->max_frame_height != new_sps->max_frame_height)) { return true; } if (old_sps->seq_profile != new_sps->seq_profile) { return true; } if (old_sps->film_grain_param_present != new_sps->film_grain_param_present) { return true; } return false; } UMC::Status AV1Decoder::DecodeHeader(UMC::MediaData* in, UMC_AV1_DECODER::AV1DecoderParams& par) { if (!in) return UMC::UMC_ERR_NULL_PTR; SequenceHeader sh = {}; while (in->GetDataSize() >= MINIMAL_DATA_SIZE) { try { const auto src = reinterpret_cast(in->GetDataPointer()); AV1Bitstream bs(src, uint32_t(in->GetDataSize())); OBUInfo obuInfo; bs.ReadOBUInfo(obuInfo); if (obuInfo.header.obu_type > OBU_PADDING) return UMC::UMC_ERR_INVALID_PARAMS; if (obuInfo.header.obu_type == OBU_SEQUENCE_HEADER) { bs.ReadSequenceHeader(sh); in->MoveDataPointer(static_cast(obuInfo.size)); if (FillVideoParam(sh, par) == UMC::UMC_OK) return UMC::UMC_OK; } if(in->MoveDataPointer(static_cast(obuInfo.size)) != UMC::UMC_OK) return UMC::UMC_ERR_NOT_ENOUGH_DATA; } catch (av1_exception const& e) { return e.GetStatus(); } } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } UMC::Status AV1Decoder::Init(UMC::BaseCodecParams* vp) { if (!vp) return UMC::UMC_ERR_NULL_PTR; AV1DecoderParams* dp = DynamicCast(vp); if (!dp) return UMC::UMC_ERR_INVALID_PARAMS; if (!dp->allocator) return UMC::UMC_ERR_INVALID_PARAMS; allocator = dp->allocator; if (dp->anchors_loaded) { // Parameter for clips started with anchor frames (Vicue) // and anchor loaded from secondary source frames_to_skip = dp->skip_first_frames; } params = *dp; frame_order = 0; return SetParams(vp); } UMC::Status AV1Decoder::GetInfo(UMC::BaseCodecParams* info) { AV1DecoderParams* vp = DynamicCast(info); if (!vp) return UMC::UMC_ERR_INVALID_PARAMS; *vp = params; return UMC::UMC_OK; } DPBType AV1Decoder::DPBUpdate(AV1DecoderFrame * prevFrame) { assert(prevFrame); std::unique_lock l(guard); DPBType updatedFrameDPB; DPBType const& prevFrameDPB = prevFrame->frame_dpb; if (prevFrameDPB.empty()) updatedFrameDPB.resize(NUM_REF_FRAMES); else updatedFrameDPB = prevFrameDPB; const FrameHeader& fh = prevFrame->GetFrameHeader(); prevFrame->DpbUpdated(true); if (fh.refresh_frame_flags == 0) return updatedFrameDPB; for (uint8_t i = 0; i < NUM_REF_FRAMES; i++) { if ((fh.refresh_frame_flags >> i) & 1) { if (!prevFrameDPB.empty() && prevFrameDPB[i] && prevFrameDPB[i]->UID != -1) prevFrameDPB[i]->DecrementReference(); updatedFrameDPB[i] = const_cast(prevFrame); prevFrame->IncrementReference(); } } return updatedFrameDPB; } static void GetTileLocation( AV1Bitstream* bs, FrameHeader const& fh, TileGroupInfo const& tgInfo, uint32_t idxInTG, size_t OBUSize, size_t OBUOffset, TileLocation& loc) { // calculate tile row and column const uint32_t idxInFrame = tgInfo.startTileIdx + idxInTG; loc.row = idxInFrame / fh.tile_info.TileCols; loc.col = idxInFrame - loc.row * fh.tile_info.TileCols; loc.anchorFrameIdx = AV1_INVALID_IDX; loc.tileIdxInTileList = AV1_INVALID_IDX; size_t tileOffsetInTG = bs->BytesDecoded(); if (idxInTG == tgInfo.numTiles - 1) loc.size = OBUSize - tileOffsetInTG; // tile is last in tile group - no explicit size signaling else { tileOffsetInTG += fh.tile_info.TileSizeBytes; // read tile size size_t reportedSize = 0; size_t actualSize = 0; bs->ReadTile(fh.tile_info.TileSizeBytes, reportedSize, actualSize); if (actualSize != reportedSize) { // before parsing tiles we check that tile_group_obu() is complete (bitstream has enough bytes to hold whole OBU) // but here we encountered incomplete tile inside this tile_group_obu() which means tile size corruption // [maybe] later check for complete tile_group_obu() will be removed, and thus incomplete tile will be possible assert("Tile size corruption: Incomplete tile encountered inside complete tile_group_obu()!"); throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } loc.size = reportedSize; } loc.offset = OBUOffset + tileOffsetInTG; loc.tile_location_type = 0; } static void GetTileListEntry( AV1Bitstream& bs, TileListInfo &tlInfo, uint32_t idxInTL, size_t OBUOffset, uint32_t shift, size_t &OBUSize, TileLocation& loc) { // calculate tile row and column const uint32_t idxInFrame = idxInTL; loc.shift = shift; loc.row = idxInFrame / tlInfo.frameWidthInTiles; loc.col = idxInFrame - loc.row * tlInfo.frameWidthInTiles; loc.tileIdxInTileList = idxInTL; size_t tileOffsetInTL = bs.BytesDecoded(); bs.ReadTileListEntry(tlInfo, loc); OBUSize = loc.size + OBU_TILE_LIST_ENTRY_HEDAER_LENGTH; loc.offset = OBUOffset + OBU_TILE_LIST_ENTRY_HEDAER_LENGTH; tileOffsetInTL += loc.size; size_t actualSize = 0; bs.ReadTileListEntryData(loc.size, actualSize); if (loc.size != actualSize) { throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); } } inline bool CheckTileGroup(uint32_t prevNumTiles, FrameHeader const& fh, TileGroupInfo const& tgInfo) { if (prevNumTiles + tgInfo.numTiles > NumTiles(fh.tile_info)) return false; if (tgInfo.numTiles == 0 || tgInfo.startTileIdx > tgInfo.endTileIdx) return false; return true; } AV1DecoderFrame* AV1Decoder::StartFrame(FrameHeader const& fh, DPBType & frameDPB, AV1DecoderFrame* pPrevFrame) { AV1DecoderFrame* pFrame = nullptr; if (fh.show_existing_frame) { std::unique_lock l(guard); pFrame = frameDPB[fh.frame_to_show_map_idx]; if (pFrame->Repeated()) return nullptr; //Increase referernce here, and will be decreased when //CompleteDecodedFrames not show_frame case. pFrame->IncrementReference(); assert(pFrame); repeateFrame = pFrame->GetMemID(); //Add one more Reference, and add it into outputed frame list //When QueryFrame finished and update status in outputed frame //list, then it will be released in CompleteDecodedFrames. pFrame->IncrementReference(); pFrame->Repeated(true); outputed_frames.push_back(pFrame); FrameHeader const& refFH = pFrame->GetFrameHeader(); if (!refFH.showable_frame) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); FrameHeader const& Repeat_H = pFrame->GetFrameHeader(); if (Repeat_H.frame_type == KEY_FRAME) { for (uint8_t i = 0; i < NUM_REF_FRAMES; i++) { if ((Repeat_H.refresh_frame_flags >> i) & 1) { if (!frameDPB.empty() && frameDPB[i] && frameDPB[i]->GetRefCounter()) frameDPB[i]->DecrementReference(); frameDPB[i] = const_cast(pFrame); pFrame->IncrementReference(); } } } refs_temp = frameDPB; if (pPrevFrame) { DPBType & prevFrameDPB = pPrevFrame->frame_dpb; prevFrameDPB = frameDPB; } return pFrame; } else { AV1DecoderFrame *pExFrame = nullptr; if (fh.refresh_frame_flags != 0) { for (uint8_t i = 0; i < NUM_REF_FRAMES; i++) { if ((fh.refresh_frame_flags >> i) & 1) { pExFrame = frameDPB[i]; break; } } } pFrame = GetFrameBuffer(fh, pExFrame); } if (!pFrame) return nullptr; pFrame->SetSeqHeader(*sequence_header.get()); if (fh.refresh_frame_flags) pFrame->SetRefValid(true); pFrame->frame_dpb = frameDPB; pFrame->UpdateReferenceList(); if (!params.film_grain) pFrame->DisableFilmGrain(); return pFrame; } AV1DecoderFrame* AV1Decoder::StartAnchorFrame(FrameHeader const& fh, DPBType const& frameDPB, uint32_t idx) { AV1DecoderFrame* pFrame = nullptr; pFrame = GetFrameBufferByIdx(fh, idx); if (!pFrame) return nullptr; pFrame->SetSeqHeader(*sequence_header.get()); if (fh.refresh_frame_flags) pFrame->SetRefValid(true); pFrame->frame_dpb = frameDPB; pFrame->UpdateReferenceList(); m_anchor_frame_mem_ids[idx] = pFrame->m_index; return pFrame; } static void ReadTileGroup(TileLayout& layout, AV1Bitstream& bs, FrameHeader const& fh, size_t obuOffset, size_t obuSize) { TileGroupInfo tgInfo = {}; bs.ReadTileGroupHeader(fh, tgInfo); if (!CheckTileGroup(static_cast(layout.size()), fh, tgInfo)) throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t idxInLayout = static_cast(layout.size()); layout.resize(layout.size() + tgInfo.numTiles, { tgInfo.startTileIdx, tgInfo.endTileIdx }); for (int idxInTG = 0; idxInLayout < layout.size(); idxInLayout++, idxInTG++) { TileLocation& loc = layout[idxInLayout]; GetTileLocation(&bs, fh, tgInfo, idxInTG, obuSize, obuOffset, loc); } } static uint32_t ReadTileListHeader(AV1Bitstream& bs, FrameHeader const& fh, TileListInfo &tlInfo) { bs.ReadTileListHeader(fh, tlInfo); return tlInfo.numTiles; } static uint32_t ReadTileList(TileLayout& layout, AV1Bitstream& bs, FrameHeader const& /*fh*/, size_t /*obuOffset*/, TileListInfo tlInfo, uint32_t shift) { uint32_t idxInLayout = static_cast(layout.size()); layout.resize(layout.size() + tlInfo.numTiles); size_t TileListEntryOffset = OBU_TILE_LIST_HEADER_LENGTH; for (uint32_t idxInTL = 0; idxInLayout < layout.size() && idxInTL < tlInfo.numTiles; idxInLayout++, idxInTL++) { size_t obuSize; TileLocation& loc = layout[idxInLayout]; GetTileListEntry(bs, tlInfo, idxInTL, TileListEntryOffset, shift, obuSize, loc); TileListEntryOffset += obuSize; } return tlInfo.numTiles; } inline bool NextFrameDetected(AV1_OBU_TYPE obuType) { switch (obuType) { case OBU_REDUNDANT_FRAME_HEADER: case OBU_TILE_GROUP: case OBU_TILE_LIST: case OBU_PADDING: case OBU_SEQUENCE_HEADER: case OBU_METADATA: return false; default: return true; } } inline bool GotFullFrame(AV1DecoderFrame const* curr_frame, FrameHeader const& fh, TileLayout const& layout) { const unsigned numMissingTiles = curr_frame ? GetNumMissingTiles(*curr_frame) : NumTiles(fh.tile_info); if (layout.size() == numMissingTiles) // current tile group_obu() contains all missing tiles return true; else return false; } inline bool HaveTilesToSubmit(AV1DecoderFrame const* curr_frame, TileLayout const& layout) { if (!layout.empty() || (curr_frame && BytesReadyForSubmission(curr_frame->GetTileSets()))) return true; return false; } inline bool AllocComplete(AV1DecoderFrame const& frame) { return frame.GetFrameData(SURFACE_DISPLAY) && frame.GetFrameData(SURFACE_RECON); } inline bool FrameInProgress(AV1DecoderFrame const& frame) { // frame preparation to decoding is in progress // i.e. SDK decoder still getting tiles of the frame from application (has both arrived and missing tiles) // or it got all tiles and waits for output surface to start decoding if (GetNumArrivedTiles(frame) == 0 || frame.UID == -1) return false; return GetNumMissingTiles(frame) || !AllocComplete(frame); } inline void AV1Decoder::CalcFrameTime(AV1DecoderFrame* frame) { if (!frame) return; frame->SetFrameTime(frame_order * in_framerate); frame->SetFrameOrder(frame_order); frame_order++; } UMC::Status AV1Decoder::GetFrame(UMC::MediaData* in, UMC::MediaData*) { if (!in) return UMC::UMC_ERR_NULL_PTR; FrameHeader fh = {}; AV1DecoderFrame* pPrevFrame = FindFrameByUID(counter - 1); AV1DecoderFrame* pFrameInProgress = FindFrameInProgress(); DPBType updated_refs; UMC::MediaData tmper = *in; repeateFrame = UMC::FRAME_MID_INVALID; if ((tmper.GetDataSize() >= MINIMAL_DATA_SIZE) && pPrevFrame && !pFrameInProgress) { if (!Repeat_show) { if (!pPrevFrame->DpbUpdated()) { updated_refs = DPBUpdate(pPrevFrame); refs_temp = updated_refs; } else { updated_refs = refs_temp; } } else { DPBType const& prevFrameDPB = pPrevFrame->frame_dpb; updated_refs = prevFrameDPB; Repeat_show = 0; } Curr_temp = Curr; } if (!pPrevFrame) { updated_refs = refs_temp; Curr_temp = Curr; Repeat_show = 0; } if ((!updated_refs.empty())&& (updated_refs[0] != nullptr)) { TRACE_BUFFER_EVENT(MFX_TRACE_API_AV1_DPBPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_DPB_INFO, updated_refs, AV1DecodeDpbInfo, DPBINFO_AV1D); } bool gotFullFrame = false; bool repeatedFrame = false; bool skipFrame = false; bool anchor_decode = params.lst_mode && m_isAnchor; bool firstSubmission = false; AV1DecoderFrame* pCurrFrame = nullptr; if (pFrameInProgress && GetNumMissingTiles(*pFrameInProgress) == 0) { /* this code is executed if and only if whole frame (all tiles) was already got from applicaiton during previous calls of DecodeFrameAsync but there were no sufficient surfaces to start decoding (e.g. to apply film_grain) in this case reading from bitstream must be skipped, and code should proceed to frame submission to the driver */ assert(!AllocComplete(*pFrameInProgress)); pCurrFrame = pFrameInProgress; gotFullFrame = true; } else { /*do bitstream parsing*/ bool gotFrameHeader = false; uint32_t OBUOffset = 0; TileLayout layout; UMC::MediaData tmp = *in; // use local copy of [in] for OBU header parsing to not move data pointer in original [in] prematurely OldPreFrame_id = PreFrame_id; while (tmp.GetDataSize() >= MINIMAL_DATA_SIZE && gotFullFrame == false && repeatedFrame == false) { const auto src = reinterpret_cast(tmp.GetDataPointer()); AV1Bitstream bs(src, uint32_t(tmp.GetDataSize())); OBUInfo obuInfo; TileListInfo tlInfo = {}; uint32_t lst_shift; bs.ReadOBUInfo(obuInfo); const AV1_OBU_TYPE obuType = obuInfo.header.obu_type; if (obuInfo.header.obu_type > OBU_PADDING) return UMC::UMC_ERR_INVALID_PARAMS; if (tmp.GetDataSize() < obuInfo.size) // not enough data left in the buffer to hold full OBU unit break; if (pFrameInProgress && NextFrameDetected(obuType)) { assert(!"Current frame was interrupted unexpectedly!"); throw av1_exception(UMC::UMC_ERR_INVALID_STREAM); // [robust] add support for cases when series of tile_group_obu() interrupted by other OBU type before end of frame was reached } switch (obuType) { case OBU_SEQUENCE_HEADER: { if (!sequence_header.get()) sequence_header.reset(new SequenceHeader); *sequence_header = SequenceHeader{}; bs.ReadSequenceHeader(*sequence_header); SequenceHeader const *old_seqHdr = nullptr; if (pPrevFrame) { old_seqHdr= &pPrevFrame->GetSeqHeader(); } // check if sequence header has been changed if (IsNeedSPSInvalidate(old_seqHdr, sequence_header.get())) { // new resolution required return UMC::UMC_NTF_NEW_RESOLUTION; } break; } case OBU_TILE_LIST: // a ext-tile sequence composition: a sequence header OBU, followed by // a number of OBUs that together constitue one or more coded anchors frames, followed by // a frame header OBU, followed by // a set of one or more tile list OBUs // so for multi tile lists case, need get saved frame header since have only one single fh // before tile list OBUs. if (tile_list_idx > 0 && m_prev_frame_header_exist) { fh = m_prev_frame_header; } // different tile lists could have different recon frame size, so need save original clip size, // then use it as a condition for surfaces reallocation of next tile lists. if (!clip_info_size_saved) { saved_clip_info_width = params.info.clip_info.width; saved_clip_info_height= params.info.clip_info.height; clip_info_size_saved = true; } lst_shift = (uint32_t)bs.BytesDecoded(); ReadTileListHeader(bs, fh, tlInfo); if ((params.info.clip_info.width != (int32_t)(tlInfo.frameWidthInTiles * fh.tile_info.TileWidth * MI_SIZE) || params.info.clip_info.height != (int32_t)(tlInfo.frameHeightInTiles * fh.tile_info.TileHeight * MI_SIZE))) { params.info.clip_info.width = (int32_t)(tlInfo.frameWidthInTiles * fh.tile_info.TileWidth * MI_SIZE); params.info.clip_info.height = (int32_t)(tlInfo.frameHeightInTiles * fh.tile_info.TileHeight * MI_SIZE); params.info.disp_clip_info = params.info.clip_info; PreFrame_id = OldPreFrame_id; return UMC::UMC_NTF_NEW_RESOLUTION; } fh.output_frame_width_in_tiles = tlInfo.frameWidthInTiles; fh.output_frame_height_in_tiles = tlInfo.frameHeightInTiles; fh.tile_count_in_list += ReadTileList(layout, bs, fh, OBUOffset, tlInfo, lst_shift); if (params.lst_mode) { fh.large_scale_tile = true; } in->MoveDataPointer(OBUOffset); // do not submit frame header in data buffer OBUOffset = 0; gotFullFrame = true; // tile list is a complete frame tile_list_idx++; break; case OBU_FRAME_HEADER: case OBU_REDUNDANT_FRAME_HEADER: case OBU_FRAME: if (!sequence_header.get()) break; // bypass frame header if there is no active seq header if (!gotFrameHeader && !updated_refs.empty()) { // we read only first entry of uncompressed header in the frame // each subsequent copy of uncompressed header (i.e. OBU_REDUNDANT_FRAME_HEADER) must be exact copy of first entry by AV1 spec // [robust] maybe need to add check that OBU_REDUNDANT_FRAME_HEADER contains copy of OBU_FRAME_HEADER OldPreFrame_id = PreFrame_id; bs.ReadUncompressedHeader(fh, *sequence_header, updated_refs, obuInfo.header, PreFrame_id); gotFrameHeader = true; m_prev_frame_header_exist = true; m_prev_frame_header = fh; } // got frame in large scale tile mode if (obuType == OBU_FRAME && params.lst_mode) { if (frames_to_skip) { skipFrame = true; gotFrameHeader = false; gotFullFrame = true; frames_to_skip--; fh.is_anchor = 1; } else if (anchor_decode) { gotFullFrame = true; fh.is_anchor = 1; } else { fh.is_anchor = 0; } } if (obuType != OBU_FRAME) { if (fh.show_existing_frame) { repeatedFrame = true; gotFullFrame = true; } break; } bs.ReadByteAlignment(); // There are no following tile group if (params.lst_mode && !anchor_decode) break; case OBU_TILE_GROUP: { FrameHeader const* pFH = nullptr; if (pFrameInProgress) pFH = &(pFrameInProgress->GetFrameHeader()); else if (gotFrameHeader) pFH = &fh; if (pFH) // bypass tile group if there is no respective frame header { ReadTileGroup(layout, bs, *pFH, OBUOffset, obuInfo.size); gotFullFrame = GotFullFrame(pFrameInProgress, *pFH, layout); break; } } default: break; } OBUOffset += static_cast(obuInfo.size); tmp.MoveDataPointer(static_cast(obuInfo.size)); } // For small decbufsize, cur bitstream may not contain any tile, then deocder will read more data and do header parse again. // So we use OldPreFrame_id to update PreFrame_id to avoid the Frame_id check fail in ReadUncompressedHeader. if (layout.empty() && !gotFullFrame) PreFrame_id = OldPreFrame_id; else if (gotFullFrame) OldPreFrame_id = PreFrame_id; if (!params.lst_mode || !anchor_decode) { if (!HaveTilesToSubmit(pFrameInProgress, layout) && !repeatedFrame) { if (params.lst_mode && !anchor_decode) { PreFrame_id = OldPreFrame_id; } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } } if (!sequence_header.get()) return UMC::UMC_ERR_NOT_ENOUGH_DATA; if (anchor_decode) { // For anchor frame decoding in ext-tile mode, no need to update DPB since they could be treated as // reference surfaces of tile list, but will be not in the reference list if update DPB per frame. // Max anchor_frames_count <= 128 per Spec, so no out-of-bound risk if set DPB size = 128. pCurrFrame = StartAnchorFrame(fh, updated_refs, anchor_frames_count); if (!pCurrFrame) throw av1_exception(UMC::UMC_ERR_NOT_INITIALIZED); CompleteDecodedFrames(fh, pCurrFrame, pPrevFrame); pCurrFrame->SetSkipFlag(true); } else { if (!updated_refs.empty()) { pCurrFrame = pFrameInProgress ? pFrameInProgress : StartFrame(fh, updated_refs, pPrevFrame); } CompleteDecodedFrames(fh, pCurrFrame, pPrevFrame); CalcFrameTime(pCurrFrame); if (!pCurrFrame) return UMC::UMC_ERR_NOT_ENOUGH_BUFFER; if (params.lst_mode) { // Update frame width and height since it may be different with orinial input FrameHeader &lst_fh = pCurrFrame->GetFrameHeader(); lst_fh.RenderWidth = params.info.clip_info.width; lst_fh.RenderHeight = params.info.clip_info.height; } } if (!layout.empty()) pCurrFrame->AddTileSet(in, layout); if (!layout.empty() || repeatedFrame || anchor_decode) in->MoveDataPointer(OBUOffset); if (repeatedFrame) { pCurrFrame->ShowAsExisting(true); if (anchor_decode && !updated_refs.empty()) { m_anchor_frame_mem_ids[anchor_frames_count] = updated_refs[pCurrFrame->GetFrameHeader().frame_to_show_map_idx]->m_index; RegisterAnchorFrame(anchor_frames_count++); } return UMC::UMC_OK; } if (skipFrame) { in->MoveDataPointer(OBUOffset); pCurrFrame->StartDecoding(); pCurrFrame->CompleteDecoding(); pCurrFrame->SetSkipFlag(true); if (anchor_decode) RegisterAnchorFrame(anchor_frames_count++); return UMC::UMC_ERR_NOT_ENOUGH_DATA; } } if (anchor_decode && skipFrame) { if (!AllocComplete(*pCurrFrame)) { AddFrameDataByIdx(*pCurrFrame, anchor_frames_count); if (!AllocComplete(*pCurrFrame)) return UMC::UMC_OK; firstSubmission = true; } } else { if (!AllocComplete(*pCurrFrame)) { AddFrameData(*pCurrFrame); // for lst mode, different tile lists could have different output buffer size // and only have 1 frame header OUB before tile list OBU in exe-tile sequence, // so need save clip_info_width/height for new surface re-allocation if (params.lst_mode && !anchor_decode) { params.info.clip_info.width = saved_clip_info_width; params.info.clip_info.height = saved_clip_info_height; } if (!AllocComplete(*pCurrFrame)) return UMC::UMC_OK; firstSubmission = true; } if (anchor_decode) m_anchor_frame_mem_ids[m_specified_anchor_Idx] = pCurrFrame->m_index; } UMC::Status umcRes = UMC::UMC_OK; if (!params.lst_mode) { umcRes = SubmitTiles(*pCurrFrame, firstSubmission); } else if (anchor_decode) { umcRes = SubmitTiles(*pCurrFrame, firstSubmission); RegisterAnchorFrame(anchor_frames_count++); QueryFrames(); return UMC::UMC_ERR_NOT_ENOUGH_DATA; } else { pCurrFrame->SetAnchorMap(m_anchor_frame_mem_ids); umcRes = SubmitTileList(*pCurrFrame); } if (umcRes != UMC::UMC_OK) return umcRes; if (!gotFullFrame) return UMC::UMC_ERR_NOT_ENOUGH_DATA; return UMC::UMC_OK; } AV1DecoderFrame* AV1Decoder::FindFrameByMemID(UMC::FrameMemID id) { return FindFrame( [id](AV1DecoderFrame const* f) { return f->GetMemID() == id; } ); } AV1DecoderFrame* AV1Decoder::DecodeFrameID(UMC::FrameMemID id) { std::unique_lock l(guard); auto find_it = std::find_if(outputed_frames.begin(), outputed_frames.end(), [id](AV1DecoderFrame const* f) { return f->GetMemID() == id; }); return find_it != std::end(outputed_frames) ? (*find_it) : nullptr; } AV1DecoderFrame* AV1Decoder::GetFrameToDisplay() { return FindFrame( [](AV1DecoderFrame const* f) { FrameHeader const& h = f->GetFrameHeader(); bool regularShowFrame = h.show_frame && !h.is_anchor && !FrameInProgress(*f) && !f->Outputted(); return regularShowFrame || f->ShowAsExisting(); } ); } AV1DecoderFrame* AV1Decoder::FindFrameByUID(int64_t uid) { return FindFrame( [uid](AV1DecoderFrame const* f) { return f->UID == uid; } ); } AV1DecoderFrame* AV1Decoder::FindFrameInProgress() { return FindFrame( [](AV1DecoderFrame const* f) { return FrameInProgress(*f); } ); } UMC::Status AV1Decoder::FillVideoParam(SequenceHeader const& sh, UMC_AV1_DECODER::AV1DecoderParams& par) { par.info.stream_type = UMC::AV1_VIDEO; par.info.profile = sh.seq_profile; par.info.level = MapLevel(sh.seq_level_idx[0]); par.info.clip_info = { int32_t(sh.max_frame_width), int32_t(sh.max_frame_height) }; par.info.disp_clip_info = par.info.clip_info; if (!sh.color_config.subsampling_x && !sh.color_config.subsampling_y) par.info.color_format = UMC::YUV444; else if (sh.color_config.subsampling_x && !sh.color_config.subsampling_y) par.info.color_format = UMC::YUY2; else if (sh.color_config.subsampling_x && sh.color_config.subsampling_y) par.info.color_format = UMC::NV12; if (sh.color_config.BitDepth == 8 && par.info.color_format == UMC::YUV444) par.info.color_format = UMC::AYUV; if (sh.color_config.BitDepth == 10) { switch (par.info.color_format) { case UMC::NV12: par.info.color_format = UMC::P010; break; case UMC::YUY2: par.info.color_format = UMC::Y210; break; case UMC::YUV444: par.info.color_format = UMC::Y410; break; default: assert(!"Unknown subsampling"); return UMC::UMC_ERR_UNSUPPORTED; } } else if (sh.color_config.BitDepth == 12) { switch (par.info.color_format) { case UMC::NV12: par.info.color_format = UMC::P016; break; case UMC::YUY2: par.info.color_format = UMC::Y216; break; case UMC::YUV444: par.info.color_format = UMC::Y416; break; default: assert(!"Unknown subsampling"); return UMC::UMC_ERR_UNSUPPORTED; } } par.info.interlace_type = UMC::PROGRESSIVE; par.info.aspect_ratio_width = par.info.aspect_ratio_height = 1; par.lFlags = 0; par.film_grain = sh.film_grain_param_present; return UMC::UMC_OK; } void AV1Decoder::SetDPBSize(uint32_t size) { assert(size > 0); assert(size <= MAX_EXTERNAL_REFS); dpb.resize(size); std::generate(std::begin(dpb), std::end(dpb), [] { return new AV1DecoderFrame{}; } ); } void AV1Decoder::SetRefSize(uint32_t size) { assert(size > 0); assert(size <= MAX_EXTERNAL_REFS); refs_temp.resize(size); } void AV1Decoder::CompleteDecodedFrames(FrameHeader const& fh, AV1DecoderFrame* pCurrFrame, AV1DecoderFrame*) { std::unique_lock l(guard); if (Curr) { FrameHeader const& FH_OutTemp = Curr->GetFrameHeader(); if (Repeat_show || FH_OutTemp.show_frame) { bool bAdded = false; for(std::vector::iterator iter=outputed_frames.begin(); iter!=outputed_frames.end(); iter++) { AV1DecoderFrame* temp = *iter; if (Curr->UID == temp->UID) { bAdded = true; break; } } if (!bAdded) outputed_frames.push_back(Curr); } else { // For no display case, decrease reference here which is increased // in pFrame->IncrementReference() in show_existing_frame case. if(pCurrFrame) { if (Curr->UID == -1) Curr = nullptr; else if(Curr != pCurrFrame) Curr->DecrementReference(); } } } for(std::vector::iterator iter=outputed_frames.begin(); iter!=outputed_frames.end(); ) { AV1DecoderFrame* temp = *iter; if(temp->Outputted() && temp->Displayed() && !temp->Decoded() && !temp->Repeated() && temp->DpbUpdated()) { temp->DecrementReference(); iter = outputed_frames.erase(iter); } else iter++; } // When no available buffer, don't update Curr buffer to avoid update DPB duplicated. if(pCurrFrame!= NULL) Curr = pCurrFrame; if (fh.show_existing_frame) { Repeat_show = 1; } else { Repeat_show = 0; } } void AV1Decoder::Flush() { std::unique_lock l(guard); for(std::vector::iterator iter=outputed_frames.begin(); iter!=outputed_frames.end(); ) { AV1DecoderFrame* temp = *iter; if(temp->Outputted() && temp->Displayed() && !temp->Decoded() && !temp->Repeated() && temp->DpbUpdated()) { temp->DecrementReference(); iter = outputed_frames.erase(iter); } else iter++; } } AV1DecoderFrame* AV1Decoder::GetFreeFrame(AV1DecoderFrame* excepted) { std::unique_lock l(guard); auto i = std::find_if(std::begin(dpb), std::end(dpb), [excepted](AV1DecoderFrame const* frame) { return frame->Empty() && frame != excepted; } ); AV1DecoderFrame* frame = i != std::end(dpb) ? *i : nullptr; if (frame) frame->UID = counter++; return frame; } AV1DecoderFrame* AV1Decoder::GetFrameBuffer(FrameHeader const& fh, AV1DecoderFrame* excepted) { AV1DecoderFrame* frame = GetFreeFrame(excepted); if (!frame) { return nullptr; } frame->Reset(&fh); // increase ref counter when we get empty frame from DPB frame->IncrementReference(); return frame; } AV1DecoderFrame* AV1Decoder::GetFrameBufferByIdx(FrameHeader const& fh, UMC::FrameMemID id) { AV1DecoderFrame* frame = dpb[id]; if (!frame) return nullptr; frame->UID = counter++; frame->Reset(&fh); frame->IncrementReference(); return frame; } void AV1Decoder::AddFrameData(AV1DecoderFrame& frame) { FrameHeader const& fh = frame.GetFrameHeader(); if (fh.show_existing_frame) throw av1_exception(UMC::UMC_ERR_NOT_IMPLEMENTED); if (!allocator) throw av1_exception(UMC::UMC_ERR_NOT_INITIALIZED); UMC::VideoDataInfo info{}; UMC::Status sts = info.Init(params.info.clip_info.width, params.info.clip_info.height, params.info.color_format, 0); if (sts != UMC::UMC_OK) throw av1_exception(sts); UMC::FrameMemID id; sts = allocator->Alloc(&id, &info, 0); if (sts != UMC::UMC_OK) throw av1_exception(UMC::UMC_ERR_ALLOC); AllocateFrameData(info, id, frame); if (frame.m_index < 0) { throw av1_exception(UMC::UMC_ERR_ALLOC); } } void AV1Decoder::AddFrameDataByIdx(AV1DecoderFrame& frame, uint32_t id) { if (!allocator) throw av1_exception(UMC::UMC_ERR_NOT_INITIALIZED); UMC::VideoDataInfo info{}; UMC::Status sts = info.Init(params.info.clip_info.width, params.info.clip_info.height, params.info.color_format, 0); if (sts != UMC::UMC_OK) throw av1_exception(sts); AllocateFrameData(info, id, frame); } template AV1DecoderFrame* AV1Decoder::FindFrame(F pred) { std::unique_lock l(guard); auto i = std::find_if(std::begin(dpb), std::end(dpb),pred); return i != std::end(dpb) ? (*i) : nullptr; } } #endif //MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/umc_av1_decoder_va.cpp000077500000000000000000000172531443134507600323620ustar00rootroot00000000000000// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include "umc_structures.h" #include "umc_va_base.h" #include "umc_av1_decoder_va.h" #include "umc_av1_utils.h" #include "umc_av1_frame.h" #include "umc_av1_bitstream.h" #include "umc_av1_va_packer.h" #include "umc_frame_data.h" #include #include "mfx_unified_av1d_logging.h" namespace UMC_AV1_DECODER { AV1DecoderVA::AV1DecoderVA() : va(nullptr) {} UMC::Status AV1DecoderVA::SetParams(UMC::BaseCodecParams* info) { if (!info) return UMC::UMC_ERR_NULL_PTR; AV1DecoderParams* dp = DynamicCast(info); if (!dp) return UMC::UMC_ERR_INVALID_PARAMS; if (!dp->pVideoAccelerator) return UMC::UMC_ERR_NULL_PTR; va = dp->pVideoAccelerator; packer.reset(Packer::CreatePacker(va)); uint32_t dpb_size = std::max(params.async_depth + TOTAL_REFS, 8u); if (dp->lst_mode) { dpb_size = MAX_EXTERNAL_REFS; } SetDPBSize(dpb_size); SetRefSize(TOTAL_REFS); return UMC::UMC_OK; } UMC::Status AV1DecoderVA::SubmitTiles(AV1DecoderFrame& frame, bool firstSubmission) { UMC::Status sts = UMC::UMC_OK; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "AV1 decode DDISubmitTask"); assert(va); if (firstSubmission) { // it's first submission for current frame - need to call BeginFrame sts = va->BeginFrame(frame.GetMemID(SURFACE_RECON)); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, frame.GetMemID(), sts)); if (sts != UMC::UMC_OK) return sts; assert(packer); packer->BeginFrame(); frame.StartDecoding(); } auto &tileSets = frame.GetTileSets(); packer->PackAU(tileSets, frame, firstSubmission); const bool lastSubmission = (GetNumMissingTiles(frame) == 0); if (lastSubmission) { packer->EndFrame(); // VA Execute after full frame detected to avoid duplicate submission // of the decode buffer when app use small decbufsize. sts = va->Execute(); } if (sts != UMC::UMC_OK) { sts = UMC::UMC_ERR_DEVICE_FAILED; return sts; } if (lastSubmission) // it's last submission for current frame - need to call EndFrame { TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(FrameIndex, sts)); sts = va->EndFrame(); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, sts)); } return sts; } UMC::Status AV1DecoderVA::SubmitTileList(AV1DecoderFrame& frame) { assert(va); UMC::Status sts = UMC::UMC_OK; sts = va->BeginFrame(frame.GetMemID(SURFACE_RECON)); if (sts != UMC::UMC_OK) return sts; assert(packer); packer->BeginFrame(); frame.StartDecoding(); auto &tileSets = frame.GetTileSets(); packer->PackAU(tileSets, frame, true); packer->EndFrame(); sts = va->Execute(); if (sts != UMC::UMC_OK) return UMC::UMC_ERR_DEVICE_FAILED; sts = va->EndFrame(); if (sts != UMC::UMC_OK) return sts; return sts; } UMC::Status AV1DecoderVA::RegisterAnchorFrame(uint32_t id) { UMC::Status sts = UMC::UMC_OK; assert(packer); packer->RegisterAnchor(id); return sts; } void AV1DecoderVA::AllocateFrameData(UMC::VideoDataInfo const& info, UMC::FrameMemID id, AV1DecoderFrame& frame) { assert(id != UMC::FRAME_MID_INVALID); UMC::FrameData fd; fd.Init(&info, id, allocator); frame.AllocateAndLock(&fd); frame.m_index = GetFreeIndex(id); } int32_t AV1DecoderVA::GetFreeIndex (UMC::FrameMemID id) const { int32_t index = id; return index; } inline bool InProgress(AV1DecoderFrame const& frame) { return frame.DecodingStarted() && !frame.DecodingCompleted(); } bool AV1DecoderVA::QueryFrames() { std::unique_lock auto_guard(guard); // form frame queue in decoded order DPBType decode_queue; for (DPBType::iterator frm = dpb.begin(); frm != dpb.end(); frm++) if (InProgress(**frm)) decode_queue.push_back(*frm); std::sort(decode_queue.begin(), decode_queue.end(), [](AV1DecoderFrame const* f1, AV1DecoderFrame const* f2) {return f1->UID < f2->UID; }); // below logic around "wasCompleted" was adopted from AVC/HEVC decoders bool wasCompleted = false; UMC::Status sts = UMC::UMC_OK; // iterate through frames submitted to the driver in decoded order for (DPBType::iterator frm = decode_queue.begin(); frm != decode_queue.end(); frm++) { wasCompleted = false; AV1DecoderFrame& frame = **frm; uint32_t index = 0; if (va->IsGPUSyncEventEnable()) { auto_guard.unlock(); { sts = packer->SyncTask(frame.GetMemID(), NULL); } auto_guard.lock(); } VAStatus surfErr = VA_STATUS_SUCCESS; index = frame.GetMemID(); auto_guard.unlock(); UMC::Status sts = packer->SyncTask(index, &surfErr); auto_guard.lock(); frame.CompleteDecoding(); wasCompleted = true; if (sts < UMC::UMC_OK) { // [Global] Add GPU hang reporting } else if (sts == UMC::UMC_OK) { switch (surfErr) { case MFX_CORRUPTION_MAJOR: frame.AddError(UMC::ERROR_FRAME_MAJOR); break; case MFX_CORRUPTION_MINOR: frame.AddError(UMC::ERROR_FRAME_MINOR); break; } } TRACE_EVENT(MFX_TRACE_API_AV1_SYNCINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( frame.m_index, (uint32_t)frame.Outputted(), (uint32_t)frame.DecodingCompleted(), (uint32_t)frame.Displayed(), sts)); } return wasCompleted; } } #endif //MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/umc_av1_frame.cpp000077500000000000000000000174251443134507600313620ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include "umc_av1_dec_defs.h" #include "umc_av1_frame.h" #include "umc_av1_utils.h" #include #include #include "umc_frame_data.h" #include "umc_media_data.h" namespace UMC_AV1_DECODER { TileSet::TileSet(UMC::MediaData* in, TileLayout const& layout_) : layout(layout_) { if (!in) throw av1_exception(UMC::UMC_ERR_NULL_PTR); TileLocation const& lastTile = layout.back(); size_t size = lastTile.offset + lastTile.size; if (lastTile.tile_location_type == 1) size = mfx::align2_value(size + OBU_TILE_LIST_HEADER_LENGTH, 128); source.Alloc(size); if (source.GetBufferSize() < size) throw av1_exception(UMC::UMC_ERR_ALLOC); const uint8_t *src = reinterpret_cast (in->GetDataPointer()); uint8_t *dst = reinterpret_cast (source.GetDataPointer()); std::copy(src, src + size, dst); source.SetDataSize(size); } size_t TileSet::Submit(uint8_t* bsBuffer, size_t spaceInBuffer, size_t offsetInBuffer, TileLayout& layoutWithOffset) { if (submitted) return 0; if (!bsBuffer) throw av1_exception(UMC::UMC_ERR_NULL_PTR); TileLocation const& lastTile = layout.back(); uint32_t shift = 0; if (lastTile.tile_location_type == 1) shift = lastTile.shift; uint8_t* data = static_cast(source.GetDataPointer()); const size_t length = std::min(source.GetDataSize(), spaceInBuffer); MFX_INTERNAL_CPY(bsBuffer + offsetInBuffer, data + shift, length); source.Close(); for (auto& loc : layout) { layoutWithOffset.emplace_back(loc); layoutWithOffset.back().offset += offsetInBuffer; } submitted = true; return length; } AV1DecoderFrame::AV1DecoderFrame() : seq_header(new SequenceHeader{}) , header(new FrameHeader{}) { Reset(); } AV1DecoderFrame::~AV1DecoderFrame() { //assert(Empty()); } void AV1DecoderFrame::Reset() { error = 0; displayed = false; dpb_updated = false; repeated = false; outputted = false; decoded = false; skipped = false; decoding_started = false; decoding_completed = false; show_as_existing = false; data[SURFACE_DISPLAY].reset(); data[SURFACE_RECON].reset(); tile_sets.resize(0); seq_header.reset(new SequenceHeader{}); header.reset(new FrameHeader{}); header->display_frame_id = (std::numeric_limits::max)(); ResetRefCounter(); FreeReferenceFrames(); frame_dpb.clear(); SetRefValid(false); film_grain_disabled = false; UID = -1; frame_time = -1; frame_order = 0; anchor_map = nullptr; } void AV1DecoderFrame::Reset(FrameHeader const* fh) { if (!fh) throw av1_exception(UMC::UMC_ERR_NULL_PTR); int64_t id = UID; Reset(); UID = id; *header = *fh; } void AV1DecoderFrame::AllocateAndLock(UMC::FrameData const* fd) { if (!fd) throw av1_exception(UMC::UMC_ERR_NULL_PTR); if (header->film_grain_params.apply_grain && !film_grain_disabled) { /* film grain is applied - two output surfaces required */ assert(!data[SURFACE_DISPLAY].get() || !data[SURFACE_RECON].get()); int surf = SURFACE_RECON; if (!data[SURFACE_DISPLAY].get()) surf = SURFACE_DISPLAY; data[surf].reset(new UMC::FrameData{}); *data[surf] = *fd; } else { /* film grain not applied - single output surface required both data[SURFACE_DISPLAY] and data[SURFACE_RECON] point to same FrameData */ assert(!data[SURFACE_DISPLAY].get()); assert(!data[SURFACE_RECON].get()); data[SURFACE_DISPLAY].reset(new UMC::FrameData{}); *data[SURFACE_DISPLAY] = *fd; data[SURFACE_RECON] = data[SURFACE_DISPLAY]; } } void AV1DecoderFrame::AddSource(UMC::MediaData* in) { if (!in) throw av1_exception(UMC::UMC_ERR_NULL_PTR); size_t const size = in->GetDataSize(); source->Alloc(size); if (source->GetBufferSize() < size) throw av1_exception(UMC::UMC_ERR_ALLOC); const uint8_t *src = reinterpret_cast (in->GetDataPointer()); uint8_t *dst = reinterpret_cast (source->GetDataPointer()); std::copy(src, src + size, dst); source->SetDataSize(size); } void AV1DecoderFrame::AddTileSet(UMC::MediaData* in, TileLayout const& layout) { if (!in) throw av1_exception(UMC::UMC_ERR_NULL_PTR); tile_sets.emplace_back(in, layout); } void AV1DecoderFrame::SetSeqHeader(SequenceHeader const& sh) { *seq_header = sh; } bool AV1DecoderFrame::Empty() const { return !data[SURFACE_DISPLAY].get(); } bool AV1DecoderFrame::Decoded() const { return decoded; } UMC::FrameMemID AV1DecoderFrame::GetMemID(int idx) const { if (!data[idx].get()) { return -1; } return data[idx]->GetFrameMID(); } void AV1DecoderFrame::AddReferenceFrame(AV1DecoderFrame * frm) { if (!frm || frm == this) return; if (std::find(references.begin(), references.end(), frm) != references.end()) return; references.push_back(frm); } void AV1DecoderFrame::FreeReferenceFrames() { references.clear(); } void AV1DecoderFrame::UpdateReferenceList() { if (header->frame_type == KEY_FRAME) return; for (uint8_t i = 0; i < INTER_REFS; ++i) { int32_t refIdx = header->ref_frame_idx[i]; AddReferenceFrame(frame_dpb[refIdx]); } } void AV1DecoderFrame::OnDecodingCompleted() { DecrementReference(); FreeReferenceFrames(); decoded = true; } uint32_t AV1DecoderFrame::GetUpscaledWidth() const { return header->UpscaledWidth; } uint32_t AV1DecoderFrame::GetFrameHeight() const { return header->FrameHeight; } uint32_t AV1DecoderFrame::GetRenderWidth() const { return header->RenderWidth; } uint32_t AV1DecoderFrame::GetRenderHeight() const { return header->RenderHeight; } } #endif //MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src/umc_av1_utils.cpp000066400000000000000000000056671443134507600314320ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include "umc_structures.h" #include "umc_vp9_utils.h" #include "umc_av1_utils.h" namespace UMC_AV1_DECODER { void SetSegData(SegmentationParams & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId, int32_t seg_data) { assert(seg_data <= SEG_FEATURE_DATA_MAX[featureId]); if (seg_data < 0) { assert(SEG_FEATURE_DATA_SIGNED[featureId]); assert(-seg_data <= SEG_FEATURE_DATA_MAX[featureId]); } seg.FeatureData[segmentId][featureId] = seg_data; } void SetupPastIndependence(FrameHeader & info) { ClearAllSegFeatures(info.segmentation_params); SetDefaultLFParams(info.loop_filter_params); } inline uint32_t Av1GetQindex(FrameHeader const& fh, uint8_t segmentId) { if (IsSegFeatureActive(fh.segmentation_params, segmentId, SEG_LVL_ALT_Q)) { const int32_t segQIndex = fh.quantization_params.base_q_idx + GetSegData(fh.segmentation_params, segmentId, SEG_LVL_ALT_Q);; return mfx::clamp(segQIndex, 0, static_cast(UMC_VP9_DECODER::MAXQ)); } else return fh.quantization_params.base_q_idx; } int IsCodedLossless(FrameHeader const& fh) { int CodedLossless = 1; for (uint8_t i = 0; i < VP9_MAX_NUM_OF_SEGMENTS; ++i) { const uint32_t qindex = Av1GetQindex(fh, i); if (qindex || fh.quantization_params.DeltaQYDc || fh.quantization_params.DeltaQUAc || fh.quantization_params.DeltaQUDc || fh.quantization_params.DeltaQVAc || fh.quantization_params.DeltaQVDc) { CodedLossless = 0; break; } } return CodedLossless; } } #endif //MFX_ENABLE_AV1_VIDEO_DECODE umc_av1_va_packer_vaapi.cpp000077500000000000000000000501251443134507600333160ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/av1_dec/src// Copyright (c) 2017-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_vp9_dec_defs.h" #ifdef MFX_ENABLE_AV1_VIDEO_DECODE #include #include "umc_structures.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_frame.h" #include "umc_av1_utils.h" #include "umc_av1_frame.h" #include "umc_av1_va_packer_vaapi.h" #include "mfx_unified_av1d_logging.h" using namespace UMC; namespace UMC_AV1_DECODER { Packer * Packer::CreatePacker(UMC::VideoAccelerator * va) { return new PackerVA(va); } Packer::Packer(UMC::VideoAccelerator * va) : m_va(va) {} Packer::~Packer() {} /****************************************************************************************************/ // Linux VAAPI packer implementation /****************************************************************************************************/ PackerVA::PackerVA(UMC::VideoAccelerator * va) : Packer(va) {} UMC::Status PackerVA::GetStatusReport(void * pStatusReport, size_t size) { return UMC_OK; } void PackerVA::BeginFrame() {} void PackerVA::EndFrame() {} void PackerVA::RegisterAnchor(UMC::FrameMemID id) { VASurfaceID anchorSurfaceId = (VASurfaceID)m_va->GetSurfaceID(id); anchors_frames.push_back(anchorSurfaceId); } void PackerVA::PackAU(std::vector& tileSets, AV1DecoderFrame const& info, bool firstSubmission) { if (firstSubmission) { // it's first submission for current frame - need to fill and submit picture parameters UMC::UMCVACompBuffer* compBufPic = nullptr; VADecPictureParameterBufferAV1 *picParam = (VADecPictureParameterBufferAV1*)m_va->GetCompBuffer(VAPictureParameterBufferType, &compBufPic, sizeof(VADecPictureParameterBufferAV1)); if (!picParam || !compBufPic || (compBufPic->GetBufferSize() < static_cast(sizeof(VADecPictureParameterBufferAV1)))) throw av1_exception(MFX_ERR_MEMORY_ALLOC); compBufPic->SetDataSize(sizeof(VADecPictureParameterBufferAV1)); *picParam = VADecPictureParameterBufferAV1{}; PackPicParams(*picParam, info); } if (!tileSets.size()) return; UMC::UMCVACompBuffer* compBufBs = nullptr; uint8_t* const bitstreamData = (uint8_t *)m_va->GetCompBuffer(VASliceDataBufferType, &compBufBs, CalcSizeOfTileSets(tileSets), tileSets.size()); if (!bitstreamData || !compBufBs) throw av1_exception(MFX_ERR_MEMORY_ALLOC); std::vector tileControlParams; size_t offsetInBuffer = 0; UMC::FrameMemID* anchor_map = info.AnchorMap(); for (auto& tileSet : tileSets) { offsetInBuffer = compBufBs->GetDataSize(); const size_t spaceInBuffer = compBufBs->GetBufferSize() - offsetInBuffer; TileLayout layout; const size_t bytesSubmitted = tileSet.Submit(bitstreamData, spaceInBuffer, offsetInBuffer, layout); if (bytesSubmitted) { offsetInBuffer += bytesSubmitted; for (auto& loc : layout) { tileControlParams.emplace_back(); if (anchor_map) loc.anchorFrameIdx = anchor_map[loc.anchorFrameIdx]; PackTileControlParams(tileControlParams.back(), loc); } } compBufBs->SetDataSize(static_cast(offsetInBuffer)); } UMCVACompBuffer* compBufTile = nullptr; const int32_t tileControlInfoSize = static_cast(sizeof(VASliceParameterBufferAV1) * tileControlParams.size()); VASliceParameterBufferAV1 *tileControlParam = (VASliceParameterBufferAV1*)m_va->GetCompBuffer(VASliceParameterBufferType, &compBufTile, tileControlInfoSize, tileSets.size()); if (!tileControlParam || !compBufTile || (compBufTile->GetBufferSize() < tileControlInfoSize)) throw av1_exception(MFX_ERR_MEMORY_ALLOC); std::copy(tileControlParams.begin(), tileControlParams.end(), tileControlParam); compBufTile->SetDataSize(tileControlInfoSize); } void PackerVA::PackPicParams(VADecPictureParameterBufferAV1& picParam, AV1DecoderFrame const& frame) { SequenceHeader const& sh = frame.GetSeqHeader(); picParam.frame_width_minus1 = (uint16_t)frame.GetUpscaledWidth() - 1; picParam.frame_height_minus1 = (uint16_t)frame.GetFrameHeight() - 1; FrameHeader const& info = frame.GetFrameHeader(); picParam.output_frame_width_in_tiles_minus_1 = 0; picParam.output_frame_height_in_tiles_minus_1 = 0; // fill seq parameters picParam.profile = (uint8_t)sh.seq_profile; auto& seqInfo = picParam.seq_info_fields.fields; seqInfo.still_picture = 0; seqInfo.use_128x128_superblock = (sh.sbSize == BLOCK_128X128) ? 1 : 0; seqInfo.enable_filter_intra = sh.enable_filter_intra; seqInfo.enable_intra_edge_filter = sh.enable_intra_edge_filter; seqInfo.enable_interintra_compound = sh.enable_interintra_compound; seqInfo.enable_masked_compound = sh.enable_masked_compound; seqInfo.enable_cdef = sh.enable_cdef; seqInfo.enable_dual_filter = sh.enable_dual_filter; seqInfo.enable_order_hint = sh.enable_order_hint; seqInfo.enable_jnt_comp = sh.enable_jnt_comp; seqInfo.mono_chrome = sh.color_config.mono_chrome; seqInfo.color_range = sh.color_config.color_range; seqInfo.subsampling_x = sh.color_config.subsampling_x; seqInfo.subsampling_y = sh.color_config.subsampling_y; seqInfo.chroma_sample_position = sh.color_config.chroma_sample_position; seqInfo.film_grain_params_present = sh.film_grain_param_present; picParam.matrix_coefficients = sh.color_config.matrix_coefficients; picParam.bit_depth_idx = (sh.color_config.BitDepth == 10) ? 1 : (sh.color_config.BitDepth == 12) ? 2 : 0; picParam.order_hint_bits_minus_1 = (uint8_t)sh.order_hint_bits_minus1; // fill pic params auto& picInfo = picParam.pic_info_fields.bits; picInfo.frame_type = info.frame_type; picInfo.show_frame = info.show_frame; picInfo.showable_frame = info.showable_frame; picInfo.error_resilient_mode = info.error_resilient_mode; picInfo.disable_cdf_update = info.disable_cdf_update; picInfo.allow_screen_content_tools = info.allow_screen_content_tools; picInfo.force_integer_mv = info.force_integer_mv; picInfo.allow_intrabc = info.allow_intrabc; picInfo.use_superres = (info.SuperresDenom == SCALE_NUMERATOR) ? 0 : 1; picInfo.allow_high_precision_mv = info.allow_high_precision_mv; picInfo.is_motion_mode_switchable = info.is_motion_mode_switchable; picInfo.use_ref_frame_mvs = info.use_ref_frame_mvs; picInfo.disable_frame_end_update_cdf = info.disable_frame_end_update_cdf; picInfo.uniform_tile_spacing_flag = info.tile_info.uniform_tile_spacing_flag; picInfo.allow_warped_motion = info.allow_warped_motion; if (info.large_scale_tile) { if (info.is_anchor) { picInfo.large_scale_tile = 0; } else { picInfo.large_scale_tile = 1; picParam.tile_count_minus_1 = info.tile_count_in_list - 1; picParam.anchor_frames_num = anchors_frames.size(); picParam.output_frame_width_in_tiles_minus_1 = info.output_frame_width_in_tiles - 1; picParam.output_frame_height_in_tiles_minus_1 = info.output_frame_height_in_tiles - 1; picParam.anchor_frames_list = reinterpret_cast(anchors_frames.data()); } } else { picInfo.large_scale_tile = 0; picParam.tile_count_minus_1 = 0; picParam.output_frame_width_in_tiles_minus_1 = 0; picParam.output_frame_height_in_tiles_minus_1 = 0; picParam.anchor_frames_num = 0; picParam.anchor_frames_list = nullptr; } picParam.order_hint = (uint8_t)info.order_hint; picParam.superres_scale_denominator = (uint8_t)info.SuperresDenom; picParam.interp_filter = (uint8_t)info.interpolation_filter; // fill segmentation params and map auto& seg = picParam.seg_info; seg.segment_info_fields.bits.enabled = info.segmentation_params.segmentation_enabled;; seg.segment_info_fields.bits.temporal_update = info.segmentation_params.segmentation_temporal_update; seg.segment_info_fields.bits.update_map = info.segmentation_params.segmentation_update_map; seg.segment_info_fields.bits.update_data = info.segmentation_params.segmentation_update_data; // set current and reference frames picParam.current_frame = (VASurfaceID)m_va->GetSurfaceID(frame.GetMemID(SURFACE_RECON)); if (!frame.FilmGrainDisabled()) picParam.current_display_picture = (VASurfaceID)m_va->GetSurfaceID(frame.GetMemID()); if (seg.segment_info_fields.bits.enabled) { for (uint8_t i = 0; i < VP9_MAX_NUM_OF_SEGMENTS; i++) { seg.feature_mask[i] = (uint8_t)info.segmentation_params.FeatureMask[i]; for (uint8_t j = 0; j < SEG_LVL_MAX; j++) seg.feature_data[i][j] = (int16_t)info.segmentation_params.FeatureData[i][j]; } } for (uint8_t ref = 0; ref < NUM_REF_FRAMES; ++ref) { if (frame.frame_dpb[ref] != nullptr) { picParam.ref_frame_map[ref] = (VASurfaceID)m_va->GetSurfaceID(frame.frame_dpb[ref]->GetMemID(SURFACE_RECON)); } } for (uint8_t ref_idx = 0; ref_idx < INTER_REFS; ref_idx++) { const uint8_t idxInDPB = (uint8_t)info.ref_frame_idx[ref_idx]; picParam.ref_frame_idx[ref_idx] = idxInDPB; } picParam.primary_ref_frame = (uint8_t)info.primary_ref_frame; // fill loop filter params picParam.filter_level[0] = (uint8_t)info.loop_filter_params.loop_filter_level[0]; picParam.filter_level[1] = (uint8_t)info.loop_filter_params.loop_filter_level[1]; picParam.filter_level_u = (uint8_t)info.loop_filter_params.loop_filter_level[2]; picParam.filter_level_v = (uint8_t)info.loop_filter_params.loop_filter_level[3]; auto& lfInfo = picParam.loop_filter_info_fields.bits; lfInfo.sharpness_level = (uint8_t)info.loop_filter_params.loop_filter_sharpness; lfInfo.mode_ref_delta_enabled = info.loop_filter_params.loop_filter_delta_enabled; lfInfo.mode_ref_delta_update = info.loop_filter_params.loop_filter_delta_update; for (uint8_t i = 0; i < TOTAL_REFS; i++) { picParam.ref_deltas[i] = info.loop_filter_params.loop_filter_ref_deltas[i]; } for (uint8_t i = 0; i < UMC_VP9_DECODER::MAX_MODE_LF_DELTAS; i++) { picParam.mode_deltas[i] = info.loop_filter_params.loop_filter_mode_deltas[i]; } // fill quantization params picParam.base_qindex = (int16_t)info.quantization_params.base_q_idx; picParam.y_dc_delta_q = (int8_t)info.quantization_params.DeltaQYDc; picParam.u_dc_delta_q = (int8_t)info.quantization_params.DeltaQUDc; picParam.v_dc_delta_q = (int8_t)info.quantization_params.DeltaQVDc; picParam.u_ac_delta_q = (int8_t)info.quantization_params.DeltaQUAc; picParam.v_ac_delta_q = (int8_t)info.quantization_params.DeltaQVAc; // fill CDEF picParam.cdef_damping_minus_3 = (uint8_t)(info.cdef_params.cdef_damping - 3); picParam.cdef_bits = (uint8_t)info.cdef_params.cdef_bits; for (uint8_t i = 0; i < CDEF_MAX_STRENGTHS; i++) { picParam.cdef_y_strengths[i] = (uint8_t)((info.cdef_params.cdef_y_pri_strength[i] << 2) + info.cdef_params.cdef_y_sec_strength[i]); picParam.cdef_uv_strengths[i] = (uint8_t)((info.cdef_params.cdef_uv_pri_strength[i] << 2) + info.cdef_params.cdef_uv_sec_strength[i]); } // fill quantization matrix params auto& qmFlags = picParam.qmatrix_fields.bits; qmFlags.using_qmatrix = info.quantization_params.using_qmatrix; qmFlags.qm_y = info.quantization_params.qm_y; qmFlags.qm_u = info.quantization_params.qm_u; qmFlags.qm_v = info.quantization_params.qm_v; auto& modeCtrl = picParam.mode_control_fields.bits; modeCtrl.delta_q_present_flag = info.delta_q_present; modeCtrl.log2_delta_q_res = CeilLog2(info.delta_q_res); modeCtrl.delta_lf_present_flag = info.delta_lf_present; modeCtrl.log2_delta_lf_res = CeilLog2(info.delta_lf_res); modeCtrl.delta_lf_multi = info.delta_lf_multi; modeCtrl.tx_mode = info.TxMode; modeCtrl.reference_select = (info.reference_mode == SINGLE_REFERENCE)?0:1; modeCtrl.reduced_tx_set_used = info.reduced_tx_set; modeCtrl.skip_mode_present = info.skip_mode_present; // fill loop restoration params auto& lrInfo = picParam.loop_restoration_fields.bits; lrInfo.yframe_restoration_type = info.lr_params.lr_type[0]; lrInfo.cbframe_restoration_type = info.lr_params.lr_type[1]; lrInfo.crframe_restoration_type = info.lr_params.lr_type[2];; lrInfo.lr_unit_shift = info.lr_params.lr_unit_shift; lrInfo.lr_uv_shift = info.lr_params.lr_uv_shift; // fill global motion params for (uint8_t i = 0; i < INTER_REFS; i++) { picParam.wm[i].invalid = info.global_motion_params[i + 1].invalid; picParam.wm[i].wmtype = static_cast(info.global_motion_params[i + 1].wmtype); for (uint8_t j = 0; j < 8; j++) { picParam.wm[i].wmmat[j] = info.global_motion_params[i + 1].wmmat[j]; for (uint8_t j = 0; j < 8; j++) picParam.wm[i].wmmat[j] = info.global_motion_params[i + 1].wmmat[j]; } } // fill film grain params auto& fg = picParam.film_grain_info; auto& fgInfo = fg.film_grain_info_fields.bits; if (!frame.FilmGrainDisabled()) { fgInfo.apply_grain = info.film_grain_params.apply_grain; fgInfo.chroma_scaling_from_luma = info.film_grain_params.chroma_scaling_from_luma; fgInfo.grain_scaling_minus_8 = info.film_grain_params.grain_scaling - 8; fgInfo.ar_coeff_lag = info.film_grain_params.ar_coeff_lag; fgInfo.ar_coeff_shift_minus_6 = info.film_grain_params.ar_coeff_shift - 6; fgInfo.grain_scale_shift = info.film_grain_params.grain_scale_shift; fgInfo.overlap_flag = info.film_grain_params.overlap_flag; fgInfo.clip_to_restricted_range = info.film_grain_params.clip_to_restricted_range; fg.grain_seed = (uint16_t)info.film_grain_params.grain_seed; fg.num_y_points = (uint8_t)info.film_grain_params.num_y_points; for (uint8_t i = 0; i < MAX_POINTS_IN_SCALING_FUNCTION_LUMA; i++) { fg.point_y_value[i] = (uint8_t)info.film_grain_params.point_y_value[i]; fg.point_y_scaling[i] = (uint8_t)info.film_grain_params.point_y_scaling[i]; } fg.num_cb_points = (uint8_t)info.film_grain_params.num_cb_points; fg.num_cr_points = (uint8_t)info.film_grain_params.num_cr_points; for (uint8_t i = 0; i < MAX_POINTS_IN_SCALING_FUNCTION_CHROMA; i++) { fg.point_cb_value[i] = (uint8_t)info.film_grain_params.point_cb_value[i]; fg.point_cb_scaling[i] = (uint8_t)info.film_grain_params.point_cb_scaling[i]; fg.point_cr_value[i] = (uint8_t)info.film_grain_params.point_cr_value[i]; fg.point_cr_scaling[i] = (uint8_t)info.film_grain_params.point_cr_scaling[i]; } for (uint8_t i = 0; i < MAX_AUTOREG_COEFFS_LUMA; i++) fg.ar_coeffs_y[i] = (int8_t)info.film_grain_params.ar_coeffs_y[i]; for (uint8_t i = 0; i < MAX_AUTOREG_COEFFS_CHROMA; i++) { fg.ar_coeffs_cb[i] = (int8_t)info.film_grain_params.ar_coeffs_cb[i]; fg.ar_coeffs_cr[i] = (int8_t)info.film_grain_params.ar_coeffs_cr[i]; } fg.cb_mult = (uint8_t)info.film_grain_params.cb_mult; fg.cb_luma_mult = (uint8_t)info.film_grain_params.cb_luma_mult; fg.cb_offset = (uint16_t)info.film_grain_params.cb_offset; fg.cr_mult = (uint8_t)info.film_grain_params.cr_mult; fg.cr_luma_mult = (uint8_t)info.film_grain_params.cr_luma_mult; fg.cr_offset = (uint16_t)info.film_grain_params.cr_offset; } // fill tile params picParam.tile_cols = (uint8_t)info.tile_info.TileCols; picParam.tile_rows = (uint8_t)info.tile_info.TileRows; for (uint32_t i = 0; i < picParam.tile_cols; i++) { picParam.width_in_sbs_minus_1[i] = (uint16_t)(info.tile_info.SbColStarts[i + 1] - info.tile_info.SbColStarts[i] - 1); } for (int i = 0; i < picParam.tile_rows; i++) { picParam.height_in_sbs_minus_1[i] = (uint16_t)(info.tile_info.SbRowStarts[i + 1] - info.tile_info.SbRowStarts[i] - 1); } picParam.context_update_tile_id = (uint16_t)info.tile_info.context_update_tile_id; TRACE_BUFFER_EVENT(VA_TRACE_API_AV1_PICTUREPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_PICPARAM, picParam, AV1DecodePicparam, PICTUREPARAM_AV1D); } void PackerVA::PackTileControlParams(VASliceParameterBufferAV1& tileControlParam, TileLocation const& loc) { tileControlParam.slice_data_offset = (uint32_t)loc.offset; tileControlParam.slice_data_size = (uint32_t)loc.size; tileControlParam.slice_data_flag = 0; if (loc.anchorFrameIdx == AV1_INVALID_IDX || loc.tileIdxInTileList == AV1_INVALID_IDX) { // tile group entry tileControlParam.tile_row = (uint16_t)loc.row; tileControlParam.tile_column = (uint16_t)loc.col; tileControlParam.tg_start = (uint16_t)loc.startIdx; tileControlParam.tg_end = (uint16_t)loc.endIdx; tileControlParam.anchor_frame_idx = 0; tileControlParam.tile_idx_in_tile_list = 0; } else { // tile list entry tileControlParam.tile_row = (uint16_t)loc.anchorTileRow; tileControlParam.tile_column = (uint16_t)loc.anchorTileCol; tileControlParam.tg_start = 0; tileControlParam.tg_end = 0; tileControlParam.anchor_frame_idx = loc.anchorFrameIdx; tileControlParam.tile_idx_in_tile_list = loc.tileIdxInTileList; } TRACE_BUFFER_EVENT(VA_TRACE_API_AV1_TILECONTROLPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_TILEPARAM, tileControlParam, AV1DecodeTileControlparam, TILECONTROLPARAMS_AV1D); } } // namespace UMC_AV1_DECODER #endif // MFX_ENABLE_AV1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/000077500000000000000000000000001443134507600246125ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/000077500000000000000000000000001443134507600262355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_brc.h000066400000000000000000000076401443134507600300270ustar00rootroot00000000000000// Copyright (c) 2009-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifndef _UMC_BRC_H_ #define _UMC_BRC_H_ #include "umc_video_encoder.h" #include "umc_video_brc.h" #include "mfx_utils.h" #define BRC_ABS(a) ((a) >= 0 ? (a) : -(a)) namespace UMC { typedef struct _BRC_HRDState { uint32_t bufSize; double bufFullness; double prevBufFullness; double maxBitrate; double inputBitsPerFrame; double maxInputBitsPerFrame; int32_t frameNum; int32_t minFrameSize; int32_t maxFrameSize; int32_t underflowQuant; double roundError; } BRC_HRDState; class BrcParams : public VideoEncoderParams { DYNAMIC_CAST_DECL(BrcParams, VideoEncoderParams) public: BrcParams(); }; class CommonBRC : public VideoBrc { public: CommonBRC(); virtual ~CommonBRC(); // Initialize with specified parameter(s) virtual Status Init(BaseCodecParams *init, int32_t nl = 1); // Close all resources virtual Status Close(); virtual Status Reset(BaseCodecParams *init, int32_t) { return Init(init); }; virtual Status SetParams(BaseCodecParams* params, int32_t) { return Init(params); }; virtual Status GetParams(BaseCodecParams* params, int32_t tid = 0); virtual Status PreEncFrame(FrameType frameType, int32_t recode = 0, int32_t tid = 0); // virtual BRCStatus PostPackFrame(MediaData *inData, int32_t bitsEncodedFrame, int32_t recode = 0); virtual BRCStatus PostPackFrame(FrameType picType, int32_t bitsEncodedFrame, int32_t payloadBits = 0, int32_t recode = 0, int32_t poc = 0); virtual int32_t GetQP(FrameType picType, int32_t tid = 0); virtual Status SetQP(int32_t qp, FrameType picType, int32_t tid = 0); // virtual Status ScaleRemovalDelay(double removalDelayScale = 1.0); virtual Status GetHRDBufferFullness(double *hrdBufFullness, int32_t recode = 0, int32_t tid = 0); virtual Status GetInitialCPBRemovalDelay(uint32_t *initial_cpb_removal_delay, int32_t recode = 0); Status GetMinMaxFrameSize(int32_t *minFrameSizeInBits, int32_t *maxFrameSizeInBits) { if (minFrameSizeInBits) *minFrameSizeInBits = mHRD.minFrameSize; if (maxFrameSizeInBits) *maxFrameSizeInBits = mHRD.maxFrameSize; return UMC_OK; }; protected: void *brc; // can be a ptr to either common or codec-specific BRC (?) bool mIsInit; Status InitHRD(); BRCStatus UpdateAndCheckHRD(int32_t frameBits, int32_t recode); void SetGOP(); int32_t mRCMode; uint32_t mBitrate; double mFramerate; BRC_HRDState mHRD; FrameType mFrameType; int32_t mQuantUpdated; int32_t mGOPPicSize; int32_t mGOPRefDist; int32_t mBitsDesiredFrame; int32_t N_P_frame, N_B_frame; // number of sP,B frames in GOP, calculated at init int32_t N_P_field, N_B_field; // number of sP,B frames in GOP, calculated at init int32_t N_P, N_B; // number of P,B frames in GOP, calculated at init }; } // namespace UMC #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_h264_brc.h000066400000000000000000000061131443134507600305640ustar00rootroot00000000000000// Copyright (c) 2009-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifndef _UMC_H264_BRC_H_ #define _UMC_H264_BRC_H_ #include "umc_video_encoder.h" #include "umc_brc.h" namespace UMC { class H264BRC : public CommonBRC { public: H264BRC(); ~H264BRC(); // Initialize with specified parameter(s) virtual Status Init(BaseCodecParams *init, int32_t nl = 1); // Close all resources virtual Status Close(); virtual Status Reset(BaseCodecParams *init, int32_t nl = 1); virtual Status SetParams(BaseCodecParams* params, int32_t tid = 0); virtual BRCStatus PostPackFrame(FrameType picType, int32_t bitsEncodedFrame, int32_t payloadBits, int32_t recode = 0, int32_t poc = 0); virtual int32_t GetQP(FrameType frameType, int32_t tid = 0); virtual Status SetQP(int32_t qp, FrameType frameType, int32_t tid = 0); virtual Status SetPictureFlags(FrameType frameType, int32_t picture_structure, int32_t repeat_first_field = 0, int32_t top_field_first = 0, int32_t second_field = 0); // virtual Status Query(UMCExtBuffer *pStat, uint32_t *numEntries); virtual Status GetInitialCPBRemovalDelay(uint32_t *initial_cpb_removal_delay, int32_t recode = 0); protected: bool mIsInit; // int32_t mBitsDesiredFrame; long long mBitsEncodedTotal, mBitsDesiredTotal; int32_t mQuantI, mQuantP, mQuantB, mQuantMax, mQuantMin, mQuantPrev, mQuantOffset, mQPprev; int32_t mRCfap, mRCqap, mRCbap, mRCq; double mRCqa, mRCfa, mRCqa0; double mRCfa_short; int32_t mQuantIprev, mQuantPprev, mQuantBprev; int32_t mBitsEncoded; int32_t mBitDepth; BrcPictureFlags mPictureFlags, mPictureFlagsPrev; int32_t mRecode; int32_t GetInitQP(); BRCStatus UpdateQuant(int32_t bEncoded, int32_t totalPicBits); BRCStatus UpdateQuantHRD(int32_t bEncoded, BRCStatus sts, int32_t payloadBits = 0); Status InitHRD(); unsigned long long mMaxBitsPerPic, mMaxBitsPerPicNot0; int32_t mSceneChange; int32_t mBitsEncodedP, mBitsEncodedPrev; int32_t mPoc, mSChPoc; uint32_t mMaxBitrate; long long mBF, mBFsaved; }; } // namespace UMC #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_h264_common.h000066400000000000000000000161161443134507600313120ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) #ifndef __UMC_H264_COMMON_H__ #define __UMC_H264_COMMON_H__ #include "ippdefs.h" #define H264_LIMIT_TABLE_MAX_MBPS 0 #define H264_LIMIT_TABLE_MAX_FS 1 #define H264_LIMIT_TABLE_MAX_DPB 2 #define H264_LIMIT_TABLE_MAX_BR 3 #define H264_LIMIT_TABLE_MAX_CPB 4 #define H264_LIMIT_TABLE_MAX_MVV 5 namespace UMC { typedef enum { H264_BASE_PROFILE = 66, H264_MAIN_PROFILE = 77, H264_SCALABLE_BASELINE_PROFILE = 83, H264_SCALABLE_HIGH_PROFILE = 86, H264_EXTENDED_PROFILE = 88, H264_HIGH_PROFILE = 100, H264_HIGH10_PROFILE = 110, H264_MULTIVIEWHIGH_PROFILE = 118, H264_STEREOHIGH_PROFILE = 128, H264_HIGH422_PROFILE = 122, H264_HIGH444_PROFILE = 144 } H264_PROFILE_IDC; } namespace UMC_H264_ENCODER { typedef enum { H264_LIMIT_TABLE_BASE_PROFILE = 0, H264_LIMIT_TABLE_MAIN_PROFILE = 0, H264_LIMIT_TABLE_EXTENDED_PROFILE = 0, H264_LIMIT_TABLE_HIGH_PROFILE = 1, H264_LIMIT_TABLE_STEREOHIGH_PROFILE = 1, H264_LIMIT_TABLE_MULTIVIEWHIGH_PROFILE = 1, H264_LIMIT_TABLE_HIGH10_PROFILE = 2, H264_LIMIT_TABLE_HIGH422_PROFILE = 3, H264_LIMIT_TABLE_HIGH444_PROFILE = 3, H264_LIMIT_TABLE_INVALID_PROFILE = 4 } H264_LIMIT_TABLE_PROFILE_IDC; typedef enum { H264_LIMIT_TABLE_LEVEL_1, H264_LIMIT_TABLE_LEVEL_1B, H264_LIMIT_TABLE_LEVEL_11, H264_LIMIT_TABLE_LEVEL_12, H264_LIMIT_TABLE_LEVEL_13, H264_LIMIT_TABLE_LEVEL_2, H264_LIMIT_TABLE_LEVEL_21, H264_LIMIT_TABLE_LEVEL_22, H264_LIMIT_TABLE_LEVEL_3, H264_LIMIT_TABLE_LEVEL_31, H264_LIMIT_TABLE_LEVEL_32, H264_LIMIT_TABLE_LEVEL_4, H264_LIMIT_TABLE_LEVEL_41, H264_LIMIT_TABLE_LEVEL_42, H264_LIMIT_TABLE_LEVEL_5, H264_LIMIT_TABLE_LEVEL_51, H264_LIMIT_TABLE_LEVEL_52, H264_LIMIT_TABLE_LEVEL_MAX = H264_LIMIT_TABLE_LEVEL_52 } H264_LIMIT_TABLE_LEVEL_IDC; #define ConvertProfileToTable(profile) (profile == H264_BASE_PROFILE) ? H264_LIMIT_TABLE_BASE_PROFILE : \ (profile == H264_MAIN_PROFILE) ? H264_LIMIT_TABLE_MAIN_PROFILE : \ (profile == H264_EXTENDED_PROFILE) ? H264_LIMIT_TABLE_EXTENDED_PROFILE : \ (profile == H264_HIGH_PROFILE) ? H264_LIMIT_TABLE_HIGH_PROFILE : \ (profile == H264_MULTIVIEWHIGH_PROFILE) ? H264_LIMIT_TABLE_MULTIVIEWHIGH_PROFILE : \ (profile == H264_STEREOHIGH_PROFILE) ? H264_LIMIT_TABLE_STEREOHIGH_PROFILE : \ (profile == H264_SCALABLE_BASELINE_PROFILE) ? H264_LIMIT_TABLE_BASE_PROFILE : \ (profile == H264_SCALABLE_HIGH_PROFILE) ? H264_LIMIT_TABLE_HIGH_PROFILE : \ (profile == H264_HIGH10_PROFILE) ? H264_LIMIT_TABLE_HIGH10_PROFILE : \ (profile == H264_HIGH422_PROFILE) ? H264_LIMIT_TABLE_HIGH422_PROFILE : \ (profile == H264_HIGH444_PROFILE) ? H264_LIMIT_TABLE_HIGH444_PROFILE : -1; #define ConvertProfileFromTable(profile) ((profile == H264_LIMIT_TABLE_BASE_PROFILE) ? H264_BASE_PROFILE : \ (profile == H264_LIMIT_TABLE_MAIN_PROFILE) ? H264_MAIN_PROFILE : \ (profile == H264_LIMIT_TABLE_EXTENDED_PROFILE) ? H264_EXTENDED_PROFILE : \ (profile == H264_LIMIT_TABLE_HIGH_PROFILE) ? H264_HIGH_PROFILE : \ (profile == H264_LIMIT_TABLE_STEREOHIGH_PROFILE) ? H264_STEREOHIGH_PROFILE : \ (profile == H264_LIMIT_TABLE_MULTIVIEWHIGH_PROFILE) ? H264_MULTIVIEWHIGH_PROFILE : \ (profile == H264_LIMIT_TABLE_HIGH10_PROFILE) ? H264_HIGH10_PROFILE : \ (profile == H264_LIMIT_TABLE_HIGH422_PROFILE) ? H264_HIGH422_PROFILE : H264_HIGH444_PROFILE); #define ConvertLevelToTable(level) (level == 10) ? H264_LIMIT_TABLE_LEVEL_1 : \ (level == 11) ? H264_LIMIT_TABLE_LEVEL_11 : \ (level == 12) ? H264_LIMIT_TABLE_LEVEL_12 : \ (level == 13) ? H264_LIMIT_TABLE_LEVEL_13 : \ (level == 20) ? H264_LIMIT_TABLE_LEVEL_2 : \ (level == 21) ? H264_LIMIT_TABLE_LEVEL_21 : \ (level == 22) ? H264_LIMIT_TABLE_LEVEL_22 : \ (level == 30) ? H264_LIMIT_TABLE_LEVEL_3 : \ (level == 31) ? H264_LIMIT_TABLE_LEVEL_31 : \ (level == 32) ? H264_LIMIT_TABLE_LEVEL_32 : \ (level == 40) ? H264_LIMIT_TABLE_LEVEL_4 : \ (level == 41) ? H264_LIMIT_TABLE_LEVEL_41 : \ (level == 42) ? H264_LIMIT_TABLE_LEVEL_42 : \ (level == 50) ? H264_LIMIT_TABLE_LEVEL_5 : \ (level == 51) ? H264_LIMIT_TABLE_LEVEL_51 : \ (level == 52) ? H264_LIMIT_TABLE_LEVEL_52 : -1; #define ConvertLevelFromTable(level) ((level == H264_LIMIT_TABLE_LEVEL_1) ? 10 : \ ((level == H264_LIMIT_TABLE_LEVEL_11) || (level == H264_LIMIT_TABLE_LEVEL_1B)) ? 11 : \ (level == H264_LIMIT_TABLE_LEVEL_12) ? 12 : \ (level == H264_LIMIT_TABLE_LEVEL_13) ? 13 : \ (level == H264_LIMIT_TABLE_LEVEL_2) ? 20 : \ (level == H264_LIMIT_TABLE_LEVEL_21) ? 21 : \ (level == H264_LIMIT_TABLE_LEVEL_22) ? 22 : \ (level == H264_LIMIT_TABLE_LEVEL_3) ? 30 : \ (level == H264_LIMIT_TABLE_LEVEL_31) ? 31 : \ (level == H264_LIMIT_TABLE_LEVEL_32) ? 32 : \ (level == H264_LIMIT_TABLE_LEVEL_4) ? 40 : \ (level == H264_LIMIT_TABLE_LEVEL_41) ? 41 : \ (level == H264_LIMIT_TABLE_LEVEL_42) ? 42 : \ (level == H264_LIMIT_TABLE_LEVEL_5) ? 50 : \ (level == H264_LIMIT_TABLE_LEVEL_51) ? 51 : 52); ////////////////////////////////////////////////////////// // scan matrices const Ipp32s dec_single_scan[2][16] = { {0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15}, {0,4,1,8,12,5,9,13,2,6,10,14,3,7,11,15} }; const Ipp32s dec_single_scan_8x8[2][64] = { {0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63}, {0, 8, 16, 1, 9, 24, 32, 17, 2, 25, 40, 48, 56, 33, 10, 3, 18, 41, 49, 57, 26, 11, 4, 19, 34, 42, 50, 58, 27, 12, 5, 20, 35, 43, 51, 59, 28, 13, 6, 21, 36, 44, 52, 60, 29, 14, 22, 37, 45, 53, 61, 30, 7, 15, 38, 46, 54, 62, 23, 31, 39, 47, 55, 63} }; } // end namespace UMC_H264_ENCODER #endif // __UMC_H264_COMMON_H__ #endif // #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_mpeg2_brc.h000066400000000000000000000206721443134507600311210ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifndef _UMC_MPEG2_BRC_H_ #define _UMC_MPEG2_BRC_H_ #include "umc_video_encoder.h" #include "umc_brc.h" #define APA_MPEG2_BRC 1 #if APA_MPEG2_BRC #include "mfxdefs.h" #define BRC_MIN(a, b) ((a) < (b) ? (a) : (b)) #define BRC_MAX(a, b) ((a) > (b) ? (a) : (b)) #define N_INST_RATE_THRESHLDS 4 #define N_QUALITY_LEVELS 7 #define N_QP_THRESHLDS 4 #define N_DEV_THRESHLDS 8 #define N_VAR_THRESHLDS 7 #endif namespace UMC { class MPEG2BRC : public CommonBRC { public: MPEG2BRC(); ~MPEG2BRC(); // Initialize with specified parameter(s) virtual Status Init(BaseCodecParams *init, int32_t nl = 1); // Close all resources virtual Status Close(); virtual Status Reset(BaseCodecParams *init, int32_t nl = 1); virtual Status SetParams(BaseCodecParams* params, int32_t tid = 0); virtual Status PreEncFrame(FrameType frameType, int32_t recode = 0, int32_t tid = 0); virtual BRCStatus PostPackFrame(FrameType picType, int32_t bitsEncodedFrame, int32_t payloadBits = 0, int32_t recode = 0, int32_t = 0); virtual int32_t GetQP(FrameType frameType, int32_t tid = 0); virtual Status SetQP(int32_t qp, FrameType frameType, int32_t tid = 0); virtual Status SetPictureFlags(FrameType frameType, int32_t picture_structure, int32_t repeat_first_field, int32_t top_field_first, int32_t second_field); // virtual Status Query(UMCExtBuffer *pStat, uint32_t *numEntries); protected: bool mIsInit; double rc_weight[3]; // frame weight (length proportion) double rc_tagsize[3]; // bitsize target of the type double rc_tagsize_frame[3]; // bitsize target of the type double rc_tagsize_field[3]; // bitsize target of the type double rc_dev; // bitrate deviation (sum of GOP's frame diffs) double rc_dev_saved; // bitrate deviation (sum of GOP's frame diffs) double gopw; int32_t block_count; int32_t qscale[3]; // qscale codes for 3 frame types (int32_t!) int32_t prsize[3]; // bitsize of previous frame of the type int32_t prqscale[3]; // quant scale value, used with previous frame of the type BrcPictureFlags prpicture_flags[3]; BrcPictureFlags picture_flags, picture_flags_prev, picture_flags_IP; int32_t quantiser_scale_value; int32_t quantiser_scale_code; int32_t q_scale_type; bool full_hw; // int32_t mBitsDesiredFrame; int32_t GetInitQP(); BRCStatus UpdateQuantHRD(int32_t bEncoded, BRCStatus sts); Status CheckHRDParams(); // Status CalculatePicTargets(); int32_t ChangeQuant(int32_t quant); #if APA_MPEG2_BRC virtual Status PreEncFrameMidRange(FrameType frameType, int32_t recode = 0); virtual Status PreEncFrameFallBack(FrameType frameType, int32_t recode = 0); mfxI32 mIsFallBack; // depending on bitrate calls PreEncFrameFallBack mfxI32 mQuantMax; // max quantizer, just handy for using in different standards. mfxI32 mQuantMin; // min quantizer /* mfxI32 N_P_frame, N_B_frame; // number of sP,B frames in GOP, calculated at init mfxI32 N_P_field, N_B_field; // number of sP,B frames in GOP, calculated at init mfxI32 N_I, N_P, N_B; // number of I,P,B frames in GOP, calculated at init */ mfxI32 prev_frame_type; // previous frame type mfxI32 mQualityLevel; // quality level, from 0 to N_QUALITY_LEVELS-1, the higher - the better mfxF64 instant_rate_thresholds[N_INST_RATE_THRESHLDS]; // constant, calculated at init, thresholds for instatnt bitrate mfxF64 deviation_thresholds[N_DEV_THRESHLDS]; // constant, calculated at init, buffer fullness/deviation thresholds #endif }; class Mpeg2_BrcParams : public VideoEncoderParams { DYNAMIC_CAST_DECL(Mpeg2_BrcParams, VideoEncoderParams) public: Mpeg2_BrcParams(): frameWidth (0), frameHeight (0), maxFrameSize(0) { quant[0] = quant[1] = quant[2] = 0; } int32_t frameWidth; int32_t frameHeight; int32_t maxFrameSize; int16_t quant[3]; // I,P,B }; class MPEG2BRC_CONST_QUNT : public CommonBRC { public: MPEG2BRC_CONST_QUNT() {}; ~MPEG2BRC_CONST_QUNT(){}; // Initialize with specified parameter(s) virtual Status Init(BaseCodecParams *init, int32_t = 0) { Mpeg2_BrcParams *brcParams = DynamicCast(init); if (brcParams && brcParams->quant[0]>0 && brcParams->frameHeight > 0 && brcParams->frameWidth >0 ) { MFX_INTERNAL_CPY((uint8_t*)&m_params, (uint8_t*)brcParams, sizeof(Mpeg2_BrcParams)); m_params.frameHeight = brcParams->frameHeight; m_params.frameWidth = brcParams->frameWidth; m_params.maxFrameSize = brcParams->frameHeight*brcParams->frameWidth * 2; m_params.quant[0] = brcParams->quant[0]; m_params.quant[1] = (brcParams->quant[1]>0) ? brcParams->quant[1]:brcParams->quant[0]; m_params.quant[2] = (brcParams->quant[2]>0) ? brcParams->quant[2]:brcParams->quant[0]; return UMC_OK; } return UMC_ERR_UNSUPPORTED; } // Close all resources virtual Status Close() {return UMC_OK;} virtual Status Reset(BaseCodecParams *, int32_t) {return UMC_OK;} virtual Status SetParams(BaseCodecParams* params, int32_t = 0) { return Init(params); } virtual Status GetParams(BaseCodecParams* params, int32_t = 0) { Mpeg2_BrcParams *brcParams = DynamicCast(params); if (brcParams) { brcParams->maxFrameSize = m_params.maxFrameSize; brcParams->quant[0] = m_params.quant[0]; brcParams->quant[1] = m_params.quant[1]; brcParams->quant[2] = m_params.quant[2]; brcParams->frameHeight = m_params.frameHeight; brcParams->frameWidth = m_params.frameWidth; } else { VideoBrcParams *videoParams = DynamicCast(params); videoParams->HRDBufferSizeBytes = m_params.maxFrameSize; videoParams->HRDInitialDelayBytes = 0; videoParams->maxBitrate = 0; videoParams->BRCMode = BRC_VBR; } return UMC_OK; } virtual Status PreEncFrame(FrameType /*frameType*/, int32_t /*recode*/, int32_t) { return UMC_OK; } virtual BRCStatus PostPackFrame(FrameType /*picType*/, int32_t /*bitsEncodedFrame*/, int32_t /*payloadBits*/ = 0, int32_t /*recode*/ = 0, int32_t = 0) { return UMC_OK; } virtual int32_t GetQP(FrameType frameType, int32_t = 0) { switch (frameType) { case I_PICTURE: return m_params.quant[0]; case P_PICTURE: return m_params.quant[1]; case B_PICTURE: return m_params.quant[2]; default: return m_params.quant[0]; } } virtual Status SetQP(int32_t qp, FrameType frameType, int32_t = 0) { switch (frameType) { case I_PICTURE: return m_params.quant[0] = (int16_t)qp; case P_PICTURE: return m_params.quant[1] = (int16_t)qp; case B_PICTURE: return m_params.quant[2] = (int16_t)qp; default: return UMC_ERR_UNSUPPORTED; } } virtual Status SetPictureFlags(FrameType /*frameType*/, int32_t /*picture_structure*/, int32_t /*repeat_first_field*/, int32_t /*top_field_first*/, int32_t /*second_field*/) { return UMC_OK; } private: Mpeg2_BrcParams m_params; }; } // namespace UMC #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_svc_brc.h000066400000000000000000000131331443134507600306740ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifndef _UMC_SVC_BRC_H_ #define _UMC_SVC_BRC_H_ #include "umc_h264_video_encoder.h" #ifndef _UMC_VIDEO_BRC_H_ #include "umc_video_brc.h" #endif #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) /* typedef struct _BRCSVC_Params { } BRCSVC_Params; */ #define BRC_CLIP(a, l, r) if (a < (l)) a = l; else if (a > (r)) a = r #define BRC_CLIPL(a, l) if (a < (l)) a = l #define BRC_CLIPR(a, r) if (a > (r)) a = r #define BRC_ABS(a) ((a) >= 0 ? (a) : -(a)) namespace UMC { typedef struct _BRCSVC_HRD_State { uint32_t bufSize; double bufFullness; double prevBufFullness; double maxBitrate; double inputBitsPerFrame; double maxInputBitsPerFrame; double minBufFullness; double maxBufFullness; int32_t frameNum; int32_t minFrameSize; int32_t maxFrameSize; long long mBF; long long mBFsaved; } BRCSVC_HRDState; typedef struct _BRC_SVCLayer_State { int32_t mBitsDesiredFrame; long long mBitsEncodedTotal, mBitsDesiredTotal; int32_t mQuant, mQuantI, mQuantP, mQuantB, mQuantPrev, mQuantOffset, mQPprev; int32_t mRCfap, mRCqap, mRCbap, mRCq; double mRCqa, mRCfa, mRCqa0; int32_t mQuantIprev, mQuantPprev, mQuantBprev; int32_t mQuantUpdated; int32_t mBitsEncodedP, mBitsEncodedPrev; } BRC_SVCLayer_State; class SVCBRC : public VideoBrc { public: SVCBRC(); virtual ~SVCBRC(); // Initialize with specified parameter(s) Status Init(BaseCodecParams *init, int32_t numTemporalLayers = 1); Status InitLayer(VideoBrcParams *params, int32_t tid); Status InitHRDLayer(int32_t tid); // Close all resources Status Close(); Status Reset(BaseCodecParams *init, int32_t numTemporalLayers = 1); Status SetParams(BaseCodecParams* params, int32_t tid = 0); Status GetParams(BaseCodecParams* params, int32_t tid = 0); Status GetHRDBufferFullness(double *hrdBufFullness, int32_t recode = 0, int32_t tid = 0); Status PreEncFrame(FrameType frameType, int32_t recode = 0, int32_t tid = 0); BRCStatus PostPackFrame(FrameType frameType, int32_t bitsEncodedFrame, int32_t payloadBits = 0, int32_t recode = 0, int32_t poc = 0); BRCStatus UpdateAndCheckHRD(int32_t tid, int32_t bitsEncodedFrame, int32_t payloadBits, int32_t recode); int32_t GetQP(FrameType frameType, int32_t tid = -1); Status SetQP(int32_t qp, FrameType frameType, int32_t tid); Status SetPictureFlags(FrameType frameType, int32_t picture_structure, int32_t repeat_first_field = 0, int32_t top_field_first = 0, int32_t second_field = 0); Status GetMinMaxFrameSize(int32_t *minFrameSizeInBits, int32_t *maxFrameSizeInBits); // Status GetInitialCPBRemovalDelay(uint32_t *initial_cpb_removal_delay, int32_t tid, int32_t recode = 0); protected: VideoBrcParams mParams[MAX_TEMP_LEVELS]; bool mIsInit; BRCSVC_HRDState mHRD[MAX_TEMP_LEVELS]; BRC_SVCLayer_State mBRC[MAX_TEMP_LEVELS]; int32_t mNumTemporalLayers; /* long long mBitsEncodedTotal, mBitsDesiredTotal; int32_t mQuantI, mQuantP, mQuantB, mQuantMax, mQuantPrev, mQuantOffset, mQPprev; int32_t mRCfap, mRCqap, mRCbap, mRCq; double mRCqa, mRCfa, mRCqa0; int32_t mQuantIprev, mQuantPprev, mQuantBprev; */ int32_t mTid; // current frame temporal layer ID int32_t mRCMode; int32_t mQuant; int32_t mQuantI, mQuantP, mQuantB; FrameType mFrameType; int32_t mBitsEncoded; BrcPictureFlags mPictureFlags, mPictureFlagsPrev; int32_t mQuantUpdated; int32_t mQuantUnderflow; int32_t mQuantOverflow; int32_t mRecodeInternal; int32_t GetInitQP(); BRCStatus UpdateQuant(int32_t tid, int32_t bEncoded, int32_t totalPicBits); // BRCStatus UpdateQuant_ScCh(int32_t bEncoded, int32_t totalPicBits); BRCStatus UpdateQuantHRD(int32_t tid, int32_t bEncoded, BRCStatus sts, int32_t payloadBits = 0); Status InitHRD(); int32_t mQuantMax; int32_t mRCfap, mRCqap, mRCbap, mRCq; double mRCqa, mRCfa, mRCqa0; int32_t mMaxFrameSize, mMinFrameSize; int32_t mOversize, mUndersize; // unsigned long long mMaxBitsPerPic, mMaxBitsPerPicNot0; /* int32_t mSceneChange; int32_t mBitsEncodedP, mBitsEncodedPrev; int32_t mPoc, mSChPoc; int32_t mRCfapMax, mRCqapMax; uint32_t mMaxBitrate; double mRCfsize; int32_t mScChFrameCnt; */ /* double instant_rate_thresholds[N_INST_RATE_THRESHLDS]; // constant, calculated at init, thresholds for instant bitrate double deviation_thresholds[N_DEV_THRESHLDS]; // constant, calculated at init, buffer fullness/deviation thresholds double sizeRatio[3], sizeRatio_field[3], sRatio[3]; */ }; } // namespace UMC #endif #endif //defined(MFX_ENABLE_H264_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/include/umc_video_brc.h000066400000000000000000000102331443134507600312050ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifndef _UMC_VIDEO_BRC_H_ #define _UMC_VIDEO_BRC_H_ #include "umc_video_encoder.h" namespace UMC { enum eBrcPictureFlags { BRC_TOP_FIELD = 1, BRC_BOTTOM_FIELD = 2, BRC_FRAME = BRC_TOP_FIELD | BRC_BOTTOM_FIELD, BRC_REPEAT_FIRST_FIELD = 4, BRC_TOP_FIELD_FIRST = 8, BRC_SECOND_FIELD = 12 }; typedef int32_t BrcPictureFlags; #define BRC_BYTES_IN_KBYTE 1000 #define BRC_BITS_IN_KBIT 1000 enum BRCMethod { BRC_CBR = 0, BRC_VBR, BRC_AVBR, }; enum BRCAlgorithm { BRC_COMMON = -1, BRC_H264, BRC_MPEG2, BRC_SVC }; enum eBRCStatus { BRC_ERROR = -1, BRC_OK = 0x0, BRC_ERR_BIG_FRAME = 0x1, BRC_BIG_FRAME = 0x2, BRC_ERR_SMALL_FRAME = 0x4, BRC_SMALL_FRAME = 0x8, BRC_NOT_ENOUGH_BUFFER = 0x10 }; enum eBRCRecode { BRC_RECODE_NONE = 0, BRC_RECODE_QP = 1, BRC_RECODE_PANIC = 2, BRC_RECODE_EXT_QP = 3, BRC_RECODE_EXT_PANIC = 4, BRC_EXT_FRAMESKIP = 16 }; typedef int32_t BRCStatus; class VideoBrcParams : public VideoEncoderParams { DYNAMIC_CAST_DECL(VideoBrcParams, VideoEncoderParams) public: VideoBrcParams(); int32_t HRDInitialDelayBytes; int32_t HRDBufferSizeBytes; int32_t targetBitrate; int32_t maxBitrate; int32_t BRCMode; int32_t GOPPicSize; int32_t GOPRefDist; uint32_t frameRateExtD; uint32_t frameRateExtN; uint32_t frameRateExtN_1; uint16_t accuracy; uint16_t convergence; }; class VideoBrc { public: VideoBrc(); virtual ~VideoBrc(); // Initialize with specified parameter(s) virtual Status Init(BaseCodecParams *init, int32_t numTempLayers = 1) = 0; // Close all resources virtual Status Close() = 0; virtual Status Reset(BaseCodecParams *init, int32_t numTempLayers = 1) = 0; virtual Status SetParams(BaseCodecParams* params, int32_t tid = 0) = 0; virtual Status GetParams(BaseCodecParams* params, int32_t tid = 0) = 0; virtual Status GetHRDBufferFullness(double *hrdBufFullness, int32_t recode = 0, int32_t tid = 0) = 0; virtual Status PreEncFrame(FrameType frameType, int32_t recode = 0, int32_t tid = 0) = 0; virtual BRCStatus PostPackFrame(FrameType picType, int32_t bitsEncodedFrame, int32_t payloadBits = 0, int32_t recode = 0, int32_t poc = 0) = 0; virtual int32_t GetQP(FrameType frameType, int32_t tid = -1) = 0; virtual Status SetQP(int32_t qp, FrameType frameType, int32_t tid = 0) = 0; // virtual Status ScaleRemovalDelay(double removalDelayScale) = 0; virtual Status SetPictureFlags(FrameType frameType, int32_t picture_structure, int32_t repeat_first_field = 0, int32_t top_field_first = 0, int32_t second_field = 0); virtual Status GetMinMaxFrameSize(int32_t *minFrameSizeInBits, int32_t *maxFrameSizeInBits) = 0; static Status CheckCorrectParams_MPEG2(VideoBrcParams *inBrcParams, VideoBrcParams *outBrcParams = NULL); virtual Status GetInitialCPBRemovalDelay(uint32_t *initial_cpb_removal_delay, int32_t recode = 0); protected: //VideoBrc *brc; VideoBrcParams mParams; }; } // namespace UMC #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/000077500000000000000000000000001443134507600254015ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/umc_brc.cpp000066400000000000000000000173521443134507600275270ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_brc.h" namespace UMC { CommonBRC::CommonBRC() { mIsInit = 0; mBitrate = 0; mFramerate = 30; mRCMode = BRC_CBR; mGOPPicSize = 20; mGOPRefDist = 1; memset(&mHRD, 0, sizeof(mHRD)); N_B_frame = 0; N_B = 0; N_P = 0; N_P_field = 0; N_B_field = 0; mQuantUpdated = 0; mBitsDesiredFrame = 0; N_P_frame = 0; brc = NULL; mFrameType = NONE_PICTURE; } CommonBRC::~CommonBRC() { Close(); } Status CommonBRC::InitHRD() { int32_t bitsPerFrame; if (mFramerate <= 0) return UMC_ERR_INVALID_PARAMS; bitsPerFrame = (int32_t)(mBitrate / mFramerate); if (BRC_CBR == mRCMode) mParams.maxBitrate = mParams.targetBitrate; if (mParams.maxBitrate < mParams.targetBitrate) mParams.maxBitrate = 1200 * 240000; // max for H.264 level 5.1, profile <= EXTENDED if (mParams.HRDBufferSizeBytes <= 0) mParams.HRDBufferSizeBytes = MFX_MAX_32S/2/8; if (mParams.HRDBufferSizeBytes * 8 < (bitsPerFrame << 1)) mParams.HRDBufferSizeBytes = (bitsPerFrame << 1) / 8; if (mParams.HRDInitialDelayBytes <= 0) mParams.HRDInitialDelayBytes = (BRC_CBR == mRCMode ? mParams.HRDBufferSizeBytes/2 : mParams.HRDBufferSizeBytes); if (mParams.HRDInitialDelayBytes * 8 < bitsPerFrame) mParams.HRDInitialDelayBytes = bitsPerFrame / 8; if (mParams.HRDInitialDelayBytes > mParams.HRDBufferSizeBytes) mParams.HRDInitialDelayBytes = mParams.HRDBufferSizeBytes; mHRD.bufSize = mParams.HRDBufferSizeBytes * 8; mHRD.maxBitrate = mParams.maxBitrate; mHRD.bufFullness = mParams.HRDInitialDelayBytes * 8; mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame = mHRD.maxBitrate / mFramerate; mHRD.underflowQuant = -1; mHRD.frameNum = 0; return UMC_OK; } Status CommonBRC::Init(BaseCodecParams *params, int32_t) { Status status = UMC_OK; VideoEncoderParams *videoParams = DynamicCast(params); VideoBrcParams *brcParams = DynamicCast(params); if (videoParams != 0) { if (videoParams->info.clip_info.width <= 0 || videoParams->info.clip_info.height <= 0) { return UMC_ERR_INVALID_PARAMS; } if (NULL != brcParams) { // BRC parameters mParams = *brcParams; mBitrate = (uint32_t)mParams.targetBitrate; if (mParams.frameRateExtN && mParams.frameRateExtD) mFramerate = (double) mParams.frameRateExtN / mParams.frameRateExtD; else mFramerate = mParams.info.framerate; mRCMode = mParams.BRCMode; if (mParams.GOPPicSize > 0) mGOPPicSize = mParams.GOPPicSize; else mParams.GOPPicSize = mGOPPicSize; if (mParams.GOPRefDist > 0 && mParams.GOPRefDist < mParams.GOPPicSize) mGOPRefDist = mParams.GOPRefDist; else mParams.GOPRefDist = mGOPRefDist; } else { *(VideoEncoderParams*) &mParams = *videoParams; mBitrate = mParams.info.bitrate; mFramerate = mParams.info.framerate; } } else if (params != 0) { return UMC_ERR_INVALID_PARAMS; // *(BaseCodecParams*)&mParams = *params; } else { if (!mIsInit) return UMC_ERR_NULL_PTR; else { // reset return UMC_OK; } } if (mBitrate <= 0 || mFramerate <= 0) return UMC_ERR_INVALID_PARAMS; mBitsDesiredFrame = (int32_t)((double)mBitrate / mFramerate); if (mBitsDesiredFrame <= 0) return UMC_ERR_INVALID_PARAMS; mIsInit = true; return status; } Status CommonBRC::GetParams(BaseCodecParams* params, int32_t) { VideoBrcParams *brcParams = DynamicCast(params); VideoEncoderParams *videoParams = DynamicCast(params); if (NULL != brcParams) { *brcParams = mParams; } else if (NULL != videoParams) { *params = *(VideoEncoderParams*)&mParams; } else { *params = *(BaseCodecParams*)&mParams; } return UMC_OK; }; Status CommonBRC::Close() { Status status = UMC_OK; if (!mIsInit) return UMC_ERR_NOT_INITIALIZED; mIsInit = false; return status; } Status CommonBRC::PreEncFrame(FrameType, int32_t, int32_t) { return UMC_OK; } Status CommonBRC::PostPackFrame(FrameType, int32_t, int32_t, int32_t, int32_t) { return UMC_OK; } int32_t CommonBRC::GetQP(FrameType, int32_t) { return UMC_OK; } Status CommonBRC::SetQP(int32_t, FrameType, int32_t) { return UMC_OK; } BRCStatus CommonBRC::UpdateAndCheckHRD(int32_t frameBits, int32_t recode) { BRCStatus ret = BRC_OK; double bufFullness; if (!(recode & (BRC_EXT_FRAMESKIP - 1))) { // BRC_EXT_FRAMESKIP == 16 mHRD.prevBufFullness = mHRD.bufFullness; mHRD.underflowQuant = -1; } else { // frame is being recoded - restore buffer state mHRD.bufFullness = mHRD.prevBufFullness; } mHRD.maxFrameSize = (int32_t)(mHRD.bufFullness - mHRD.roundError); mHRD.minFrameSize = (mRCMode == BRC_VBR ? 0 : (int32_t)(mHRD.bufFullness + 1 + mHRD.roundError + mHRD.inputBitsPerFrame - mHRD.bufSize)); if (mHRD.minFrameSize < 0) mHRD.minFrameSize = 0; bufFullness = mHRD.bufFullness - frameBits; if (bufFullness < 1 + mHRD.roundError) { bufFullness = mHRD.inputBitsPerFrame; ret = BRC_ERR_BIG_FRAME; if (bufFullness > (double)mHRD.bufSize) // possible in VBR mode if at all (???) bufFullness = (double)mHRD.bufSize; } else { bufFullness += mHRD.inputBitsPerFrame; if (bufFullness > (double)mHRD.bufSize - mHRD.roundError) { bufFullness = (double)mHRD.bufSize - mHRD.roundError; if (mRCMode != BRC_VBR) ret = BRC_ERR_SMALL_FRAME; } } if (BRC_OK == ret) mHRD.frameNum++; else if ((recode & BRC_EXT_FRAMESKIP) || BRC_RECODE_EXT_PANIC == recode || BRC_RECODE_PANIC == recode) // no use in changing QP ret |= BRC_NOT_ENOUGH_BUFFER; mHRD.bufFullness = bufFullness; return ret; } /* Status CommonBRC::ScaleRemovalDelay(double removalDelayScale) { if (removalDelayScale <= 0) return UMC_ERR_INVALID_PARAMS; // mHRD.maxInputBitsPerFrame = (uint32_t)((mHRD.maxBitrate / mFramerate) * removalDelayScale); // == mHRD.inputBitsPerFrame for CBR mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame * removalDelayScale; //??? return UMC_OK; } */ Status CommonBRC::GetHRDBufferFullness(double *hrdBufFullness, int32_t recode, int32_t) { *hrdBufFullness = (recode & (BRC_EXT_FRAMESKIP - 1)) ? mHRD.prevBufFullness : mHRD.bufFullness; return UMC_OK; } void CommonBRC::SetGOP() { if (mGOPRefDist < 1) { N_P = 0; N_B = 0; } else if (mGOPRefDist == 1) { N_P = mGOPPicSize - 1; N_B = 0; } else { N_P = (mGOPPicSize/mGOPRefDist) - 1; N_B = (mGOPRefDist - 1) * (mGOPPicSize/mGOPRefDist); } N_P_frame = N_P; N_B_frame = N_B; N_P_field = N_P_frame * 2 + 1; // 2nd field of I is coded as P N_B_field = N_B_frame * 2; } Status CommonBRC::GetInitialCPBRemovalDelay(uint32_t*, int32_t) { return UMC_OK; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/umc_h264_brc.cpp000066400000000000000000001131731443134507600302700ustar00rootroot00000000000000// Copyright (c) 2009-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_h264_brc.h" #include "umc_video_data.h" #include "umc_h264_common.h" #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) using namespace UMC_H264_ENCODER; namespace UMC { H264BRC::H264BRC() { mIsInit = 0; mRCqap = 0; mRCqa = 0; mRCbap = 0; mBitsDesiredTotal = 0; mQuantPprev = 0; mRCqa0 = 0; mQuantBprev = 0; mRCfap = 0; mBitDepth = 0; mPoc = 0; mMaxBitrate = 0; mQuantIprev = 0; mBFsaved = 0; mBitsEncodedP = 0; mSChPoc = 0; mBitsEncodedTotal = 0; mPictureFlags = 0; mMaxBitsPerPic = 0; mRCfa_short = 0; mRCfa = 0; mQuantOffset = 0; mQuantMax = 0; mQuantPrev = 0; mQuantMin = 0; mQuantP = 0; mQuantB = 0; mQuantI = 0; mSceneChange = 0; mPictureFlagsPrev = 0; mBitsEncodedPrev = 0; mRCq = 0; mBitsEncoded = 0; mQPprev = 0; mRecode = 0; mBF = 0; mMaxBitsPerPicNot0 = 0; } H264BRC::~H264BRC() { Close(); } // Copy of mfx_h264_enc_common.cpp::LevelProfileLimitsNal const unsigned long long LevelProfileLimits[4][H264_LIMIT_TABLE_LEVEL_MAX+1][6] = { { // BASE_PROFILE, MAIN_PROFILE, EXTENDED_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 76800, 210000, 64}, /* 1b */ { 1485, 99, 152064, 153600, 420000, 64}, /* 11 */ { 3000, 396, 345600, 230400, 600000, 128}, /* 12 */ { 6000, 396, 912384, 460800, 1200000, 128}, /* 13 */ { 11880, 396, 912384, 921600, 2400000, 128}, /* 2 */ { 11880, 396, 912384, 2400000, 2400000, 128}, /* 21 */ { 19800, 792, 1824768, 4800000, 4800000, 256}, /* 22 */ { 20250, 1620, 3110400, 4800000, 4800000, 256}, /* 3 */ { 40500, 1620, 3110400, 12000000, 12000000, 256}, /* 31 */ { 108000, 3600, 6912000, 16800000, 16800000, 512}, /* 32 */ { 216000, 5120, 7864320, 24000000, 24000000, 512}, /* 4 */ { 245760, 8192, 12582912, 24000000, 30000000, 512}, /* 41 */ { 245760, 8192, 12582912, 60000000, 75000000, 512}, /* 42 */ { 522240, 8704, 13369344, 60000000, 75000000, 512}, /* 5 */ { 589824, 22080, 42393600, 162000000, 162000000, 512}, /* 51 */ { 983040, 36864, 70778880, 288000000, 288000000, 512}, /* 52 */ { 2073600, 36864, 70778880, 288000000, 288000000, 512}, }, { // HIGH_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 96000, 262500, 64}, /* 1b */ { 1485, 99, 152064, 192000, 525000, 64}, /* 11 */ { 3000, 396, 345600, 288000, 750000, 128}, /* 12 */ { 6000, 396, 912384, 576000, 1500000, 128}, /* 13 */ { 11880, 396, 912384, 1152000, 3000000, 128}, /* 2 */ { 11880, 396, 912384, 3000000, 3000000, 128}, /* 21 */ { 19800, 792, 1824768, 6000000, 6000000, 256}, /* 22 */ { 20250, 1620, 3110400, 6000000, 6000000, 256}, /* 3 */ { 40500, 1620, 3110400, 15000000, 15000000, 256}, /* 31 */ { 108000, 3600, 6912000, 21000000, 21000000, 512}, /* 32 */ { 216000, 5120, 7864320, 30000000, 30000000, 512}, /* 4 */ { 245760, 8192, 12582912, 30000000, 37500000, 512}, /* 41 */ { 245760, 8192, 12582912, 75000000, 93750000, 512}, /* 42 */ { 522240, 8704, 13369344, 75000000, 93750000, 512}, /* 5 */ { 589824, 22080, 42393600, 202500000, 202500000, 512}, /* 51 */ { 983040, 36864, 70778880, 360000000, 360000000, 512}, /* 52 */ { 2073600, 36864, 70778880, 360000000, 360000000, 512}, }, { // HIGH10_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 230400, 630000, 64}, /* 1b */ { 1485, 99, 152064, 460800, 1260000, 64}, /* 11 */ { 3000, 396, 345600, 691200, 1800000, 128}, /* 12 */ { 6000, 396, 912384, 1382400, 3600000, 128}, /* 13 */ { 11880, 396, 912384, 2764800, 7200000, 128}, /* 2 */ { 11880, 396, 912384, 7200000, 7200000, 128}, /* 21 */ { 19800, 792, 1824768, 14400000, 14400000, 256}, /* 22 */ { 20250, 1620, 3110400, 14400000, 14400000, 256}, /* 3 */ { 40500, 1620, 3110400, 36000000, 36000000, 256}, /* 31 */ { 108000, 3600, 6912000, 50400000, 50400000, 512}, /* 32 */ { 216000, 5120, 7864320, 72000000, 72000000, 512}, /* 4 */ { 245760, 8192, 12582912, 72000000, 90000000, 512}, /* 41 */ { 245760, 8192, 12582912, 180000000, 225000000, 512}, /* 42 */ { 522240, 8704, 13369344, 180000000, 225000000, 512}, /* 5 */ { 589824, 22080, 42393600, 486000000, 486000000, 512}, /* 51 */ { 983040, 36864, 70778880, 864000000, 864000000, 512}, /* 52 */ { 2073600, 36864, 70778880, 864000000, 864000000, 512}, }, { // HIGH422_PROFILE, HIGH444_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 307200, 840000, 64}, /* 1b */ { 1485, 99, 152064, 614400, 1680000, 64}, /* 11 */ { 3000, 396, 345600, 921600, 2400000, 128}, /* 12 */ { 6000, 396, 912384, 1843200, 4800000, 128}, /* 13 */ { 11880, 396, 912384, 3686400, 9600000, 128}, /* 2 */ { 11880, 396, 912384, 9600000, 9600000, 128}, /* 21 */ { 19800, 792, 1824768, 19200000, 19200000, 256}, /* 22 */ { 20250, 1620, 3110400, 19200000, 19200000, 256}, /* 3 */ { 40500, 1620, 3110400, 48000000, 48000000, 256}, /* 31 */ { 108000, 3600, 6912000, 67200000, 67200000, 512}, /* 32 */ { 216000, 5120, 7864320, 96000000, 96000000, 512}, /* 4 */ { 245760, 8192, 12582912, 96000000, 120000000, 512}, /* 41 */ { 245760, 8192, 12582912, 240000000, 300000000, 512}, /* 42 */ { 522240, 8704, 13369344, 240000000, 300000000, 512}, /* 5 */ { 589824, 22080, 42393600, 648000000, 648000000, 512}, /* 51 */ { 983040, 36864, 70778880, 1152000000,1152000000,512}, /* 52 */ { 2073600, 36864, 70778880, 1152000000,1152000000,512}, }, }; static double QP2Qstep (int32_t QP) { return (double)(pow(2.0, (QP - 4.0) / 6.0)); } static int32_t Qstep2QP (double Qstep) { return (int32_t)(4.0 + 6.0 * log(Qstep) / log(2.0)); } Status H264BRC::InitHRD() { int32_t profile_ind, level_ind; unsigned long long bufSizeBits = mParams.HRDBufferSizeBytes << 3; unsigned long long maxBitrate = mParams.maxBitrate; int32_t bitsPerFrame; if (mFramerate <= 0) return UMC_ERR_INVALID_PARAMS; bitsPerFrame = (int32_t)(mBitrate / mFramerate); if (BRC_CBR == mRCMode) maxBitrate = mParams.maxBitrate = mParams.targetBitrate; if (maxBitrate < (unsigned long long)mParams.targetBitrate) maxBitrate = mParams.maxBitrate = 0; if (bufSizeBits > 0 && bufSizeBits < static_cast(bitsPerFrame << 1)) bufSizeBits = (bitsPerFrame << 1); profile_ind = ConvertProfileToTable(mParams.profile); level_ind = ConvertLevelToTable(mParams.level); if (mParams.targetBitrate > (int32_t)LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]) mParams.targetBitrate = (int32_t)LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]; if (static_cast(mParams.maxBitrate) > LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]) maxBitrate = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]; if (bufSizeBits > LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_CPB]) bufSizeBits = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_CPB]; if (mParams.maxBitrate <= 0 && mParams.HRDBufferSizeBytes <= 0) { if (profile_ind < 0) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_MAX; } else if (level_ind < 0) level_ind = H264_LIMIT_TABLE_LEVEL_MAX; maxBitrate = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]; bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } else if (mParams.HRDBufferSizeBytes <= 0) { if (profile_ind < 0) bufSizeBits = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_CPB]; else if (level_ind < 0) { for (; profile_ind < H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) if (maxBitrate <= LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]) break; bufSizeBits = LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_CPB]; } else { for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_MAX; level_ind++) { if (maxBitrate <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_MAX) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_MAX; } bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } } else if (mParams.maxBitrate <= 0) { if (profile_ind < 0) maxBitrate = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]; else if (level_ind < 0) { for (; profile_ind < H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) if (bufSizeBits <= LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_CPB]) break; maxBitrate = LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_MAX][H264_LIMIT_TABLE_MAX_BR]; } else { for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_MAX; level_ind++) { if (bufSizeBits <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_MAX) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_MAX; } maxBitrate = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]; } } if (maxBitrate < (unsigned long long)mParams.targetBitrate) { maxBitrate = (unsigned long long)mParams.targetBitrate; for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_MAX; level_ind++) { if (maxBitrate <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_MAX) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_MAX; } bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } mParams.HRDBufferSizeBytes = (int32_t)(bufSizeBits >> 3); mParams.maxBitrate = (int32_t)((maxBitrate >> 6) << 6); // In H.264 HRD params bitrate is coded as value*2^(6+scale), we assume scale=0 mHRD.maxBitrate = mParams.maxBitrate; mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame = mHRD.maxBitrate / mFramerate; mParams.HRDBufferSizeBytes = (mParams.HRDBufferSizeBytes >> 4) << 4; // coded in bits as value*2^(4+scale), assume scale<=3 if (mParams.HRDInitialDelayBytes <= 0) mParams.HRDInitialDelayBytes = (BRC_CBR == mRCMode ? mParams.HRDBufferSizeBytes/2 : mParams.HRDBufferSizeBytes); else if (mParams.HRDInitialDelayBytes * 8 < bitsPerFrame) mParams.HRDInitialDelayBytes = bitsPerFrame / 8; if (mParams.HRDInitialDelayBytes > mParams.HRDBufferSizeBytes) mParams.HRDInitialDelayBytes = mParams.HRDBufferSizeBytes; mHRD.bufSize = mParams.HRDBufferSizeBytes * 8; mHRD.bufFullness = mParams.HRDInitialDelayBytes * 8; mHRD.underflowQuant = -1; mHRD.frameNum = 0; mHRD.roundError = 1; return UMC_OK; } int32_t H264BRC::GetInitQP() { const double x0 = 0, y0 = 1.19, x1 = 1.75, y1 = 1.75; int32_t fs, fsLuma; fsLuma = mParams.info.clip_info.width * mParams.info.clip_info.height; fs = fsLuma; if (mParams.info.color_format == YUV420) fs += fsLuma / 2; else if (mParams.info.color_format == YUV422) fs += fsLuma; else if (mParams.info.color_format == YUV444) fs += fsLuma * 2; fs = fs * mBitDepth / 8; int32_t q = (int32_t)(1. / 1.2 * pow(10.0, (log10(fs * 2. / 3. * mParams.info.framerate / mBitrate) - x0) * (y1 - y0) / (x1 - x0) + y0) + 0.5); return mfx::clamp(q, 1, mQuantMax); } Status H264BRC::Init(BaseCodecParams *params, int32_t enableRecode) { Status status = UMC_OK; int32_t level_ind; int32_t maxMBPS; int32_t numMBPerFrame; double bitsPerMB, tmpf; status = CommonBRC::Init(params); if (status != UMC_OK) return status; mRecode = enableRecode ? 1 : 0; if (mParams.frameRateExtN_1 > 0) { if (mParams.frameRateExtN == mParams.frameRateExtN_1 * 2) { mParams.frameRateExtN = mParams.frameRateExtN_1; mParams.frameRateExtN_1 = 0; mFramerate *= 0.5; mBitsDesiredFrame *= 2; } else { mBitsDesiredFrame = mBitrate / ((mParams.frameRateExtN - mParams.frameRateExtN_1) / mParams.frameRateExtD); } } if (mParams.HRDBufferSizeBytes != 0) { status = InitHRD(); mMaxBitrate = mParams.maxBitrate >> 3; mBF = (long long)mParams.HRDInitialDelayBytes * mParams.frameRateExtN; mBFsaved = mBF; } else { // no HRD mHRD.bufSize = mHRD.maxFrameSize = MFX_MAX_32S; mHRD.bufFullness = (double)mHRD.bufSize/2; // just need buffer fullness not to trigger any hrd related actions mHRD.minFrameSize = 0; } if (status != UMC_OK) return status; if (mBitrate <= 0 || mFramerate <= 0) return UMC_ERR_INVALID_PARAMS; level_ind = ConvertLevelToTable(mParams.level); if (level_ind < 0) return UMC_ERR_INVALID_PARAMS; if (level_ind >= H264_LIMIT_TABLE_LEVEL_31 && level_ind <= H264_LIMIT_TABLE_LEVEL_42) bitsPerMB = 96.; // 384 / minCR; minCR = 4 else bitsPerMB = 192.; // minCR = 2 maxMBPS = (int32_t)LevelProfileLimits[0][level_ind][H264_LIMIT_TABLE_MAX_MBPS]; numMBPerFrame = ((mParams.info.clip_info.width + 15) >> 4) * ((mParams.info.clip_info.height + 15) >> 4); tmpf = (double)numMBPerFrame; if (tmpf < maxMBPS / 172.) tmpf = maxMBPS / 172.; mMaxBitsPerPic = (unsigned long long)(tmpf * bitsPerMB) * 8; mMaxBitsPerPicNot0 = (unsigned long long)((double)maxMBPS / mFramerate * bitsPerMB) * 8; mBitDepth = 8; // hard coded for now mQuantOffset = 6 * (mBitDepth - 8); mQuantMax = 51 + mQuantOffset; mQuantMin = 1; mBitsDesiredTotal = 0; mBitsEncodedTotal = 0; mBitsDesiredFrame = (int32_t)((double)mBitrate / mFramerate); if (mBitsDesiredFrame < 10) return UMC_ERR_INVALID_PARAMS; mQuantUpdated = 1; int32_t q = GetInitQP(); if (!mRecode) { if (q - 6 > 10) mQuantMin = std::max(10, q - 24); else mQuantMin = std::max(q - 6, 2); if (q < mQuantMin) q = mQuantMin; } mQuantPrev = mQuantI = mQuantP = mQuantB = mQPprev = q; mRCqap = 100; mRCfap = 100; mRCbap = 100; mRCq = q; mRCqa = mRCqa0 = 1. / (double)mRCq; mRCfa = mBitsDesiredFrame; mRCfa_short = mBitsDesiredFrame; mPictureFlags = mPictureFlagsPrev = BRC_FRAME; mIsInit = true; mSChPoc = 0; mSceneChange = 0; mBitsEncodedPrev = mBitsDesiredFrame; //??? mFrameType = I_PICTURE; return status; } Status H264BRC::Reset(BaseCodecParams *params, int32_t enableRecode) { Status status = UMC_OK; VideoBrcParams *brcParams = DynamicCast(params); VideoBrcParams tmpParams; if (NULL == brcParams) return UMC_ERR_NULL_PTR; int32_t bufSize = mHRD.bufSize, maxBitrate = mParams.maxBitrate; double bufFullness = mHRD.bufFullness; int32_t bufSize_new = (brcParams->HRDBufferSizeBytes >> 4) << 7; // coded in bits as value*2^(4+scale), assume scale<=3 int32_t maxBitrate_new = (brcParams->maxBitrate >> 6) << 6; // In H.264 HRD params bitrate is coded as value*2^(6+scale), we assume scale=0 int32_t targetBitrate_new = brcParams->targetBitrate; int32_t targetBitrate_new_r = (targetBitrate_new >> 6) << 6; int32_t rcmode_new = brcParams->BRCMode, rcmode = mRCMode; int32_t targetBitrate = mBitrate; int32_t profile_ind, level_ind; int32_t profile = mParams.profile, level = mParams.level; mRecode = enableRecode ? 1 : 0; if (BRC_AVBR != rcmode_new && BRC_AVBR == rcmode) return UMC_ERR_INVALID_PARAMS; if (BRC_CBR == rcmode_new && BRC_VBR == rcmode) return UMC_ERR_INVALID_PARAMS; rcmode = rcmode_new; if (BRC_AVBR == rcmode) { targetBitrate_new_r = targetBitrate_new; maxBitrate_new = maxBitrate = 0; bufSize_new = bufSize = 0; } if (targetBitrate_new_r > maxBitrate_new && maxBitrate_new > 0) return UMC_ERR_INVALID_PARAMS; else if (BRC_CBR == rcmode && targetBitrate_new > 0 && maxBitrate_new > 0 && maxBitrate_new != targetBitrate_new_r) return UMC_ERR_INVALID_PARAMS; if (BRC_CBR == rcmode) { if (targetBitrate_new > 0 && maxBitrate_new <= 0) maxBitrate_new = targetBitrate_new_r; else if (targetBitrate_new <= 0 && maxBitrate_new > 0) targetBitrate_new = maxBitrate_new; } if (targetBitrate_new > 0) targetBitrate = targetBitrate_new; if (bufSize_new > bufSize) bufSize = bufSize_new; if (maxBitrate_new > 0 && maxBitrate_new < maxBitrate) { bufFullness = mHRD.bufFullness * maxBitrate_new / maxBitrate; if ((unsigned long long)mBF < (unsigned long long)MFX_MAX_64S / (unsigned long long)(maxBitrate_new >> 7)) mBF = (long long)((unsigned long long)mBF * (maxBitrate_new >> 6) / (mMaxBitrate >> 3)); else mBF = (long long)((unsigned long long)mBF / (mMaxBitrate >> 3) * (maxBitrate_new >> 6)); maxBitrate = maxBitrate_new; } else if (maxBitrate_new > maxBitrate) { if (BRC_VBR == rcmode) { int32_t isField = ((mPictureFlagsPrev & BRC_FRAME) == BRC_FRAME) ? 0 : 1; double bf_delta = (maxBitrate_new - maxBitrate) / mFramerate; if (isField) bf_delta *= 0.5; // lower estimate for the fullness with the bitrate updated at tai; // for VBR the fullness encoded in buffering period SEI can be below the real buffer fullness bufFullness += bf_delta; if (bufFullness > (double)bufSize - mHRD.roundError) bufFullness = (double)bufSize - mHRD.roundError; mBF += (long long)((maxBitrate_new >> 3) - mMaxBitrate) * (long long)mParams.frameRateExtD >> isField; if (mBF > (long long)(bufSize >> 3) * mParams.frameRateExtN) mBF = (long long)(bufSize >> 3) * mParams.frameRateExtN; maxBitrate = maxBitrate_new; } else if (BRC_CBR == rcmode) { return UMC_ERR_INVALID_PARAMS; // tmp ??? } } if (BRC_AVBR != rcmode && bufSize_new > 0 && bufSize_new < bufSize) { bufSize = bufSize_new; if (bufFullness > (double)bufSize - mHRD.roundError) { if (BRC_VBR == rcmode) bufFullness = (double)bufSize - mHRD.roundError; else return UMC_ERR_INVALID_PARAMS; } } /* // ignore new fullness if (brcParams->HRDInitialDelayBytes > 0 && (brcParams->HRDInitialDelayBytes << 3) < bufFullness && BRC_VBR == mRCMode) { bufFullness = brcParams->HRDInitialDelayBytes << 3; } */ if (targetBitrate > maxBitrate && BRC_AVBR != rcmode) targetBitrate = maxBitrate; if (brcParams->profile > 0) profile = brcParams->profile; if (brcParams->level > 0) level = brcParams->level; profile_ind = ConvertProfileToTable(profile); level_ind = ConvertLevelToTable(level); if (profile_ind < 0 || level_ind < 0) return UMC_ERR_INVALID_PARAMS; if (static_cast(bufSize) > LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]) return UMC_ERR_INVALID_PARAMS; if (static_cast(maxBitrate) > LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]) return UMC_ERR_INVALID_PARAMS; bool sizeNotChanged = (brcParams->info.clip_info.height == mParams.info.clip_info.height && brcParams->info.clip_info.width == mParams.info.clip_info.width); tmpParams = *brcParams; tmpParams.BRCMode = rcmode; tmpParams.HRDBufferSizeBytes = bufSize >> 3; tmpParams.maxBitrate = maxBitrate; tmpParams.HRDInitialDelayBytes = (int32_t)(bufFullness / 8); tmpParams.targetBitrate = targetBitrate; tmpParams.profile = profile; tmpParams.level = level; if (BRC_AVBR == rcmode) // just in case tmpParams.HRDBufferSizeBytes = 0; int32_t bitsDesiredFrameOld = mBitsDesiredFrame; status = CommonBRC::Init(&tmpParams); if (status != UMC_OK) return status; if (mParams.HRDBufferSizeBytes > 0) { mHRD.bufSize = bufSize; mHRD.maxBitrate = (double)maxBitrate; mHRD.bufFullness = bufFullness; mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame = mHRD.maxBitrate / mFramerate; mMaxBitrate = (uint32_t)(maxBitrate >> 3); } else { mHRD.bufSize = mHRD.maxFrameSize = MFX_MAX_32S; mHRD.bufFullness = (double)mHRD.bufSize/2; // just need buffer fullness not to trigger any hrd related actions mHRD.minFrameSize = 0; } double bitsPerMB; int32_t maxMBPS; if (level_ind >= H264_LIMIT_TABLE_LEVEL_31 && level_ind <= H264_LIMIT_TABLE_LEVEL_42) bitsPerMB = 96.; // 384 / minCR; minCR = 4 else bitsPerMB = 192.; // minCR = 2 maxMBPS = (int32_t)LevelProfileLimits[0][level_ind][H264_LIMIT_TABLE_MAX_MBPS]; mMaxBitsPerPic = mMaxBitsPerPicNot0 = (unsigned long long)((double)maxMBPS / mFramerate * bitsPerMB) * 8; if (sizeNotChanged) { mRCq = (int32_t)(1./mRCqa * pow(mRCfa/mBitsDesiredFrame, 0.32) + 0.5); mRCq = mfx::clamp(mRCq, 1, mQuantMax); } else { mRCq = GetInitQP(); if (!mRecode) { if (mRCq - 6 > 10) mQuantMin = std::max(10, mRCq - 24); else mQuantMin = std::max(mRCq - 6, 2); if (mRCq < mQuantMin) mRCq = mQuantMin; } } mQuantPrev = mQuantI = mQuantP = mQuantB = mQPprev = mRCq; mRCqa = mRCqa0 = 1./mRCq; mRCfa = mBitsDesiredFrame; mRCfa_short = mBitsDesiredFrame; double ratio = (double)mBitsDesiredFrame / bitsDesiredFrameOld; mBitsEncodedTotal = (int32_t)(mBitsEncodedTotal * ratio + 0.5); mBitsDesiredTotal = (int32_t)(mBitsDesiredTotal * ratio + 0.5); mSceneChange = 0; mBitsEncodedPrev = mBitsDesiredFrame; //??? return status; } Status H264BRC::Close() { Status status = UMC_OK; if (!mIsInit) return UMC_ERR_NOT_INITIALIZED; mIsInit = false; return status; } Status H264BRC::SetParams(BaseCodecParams* params, int32_t) { return Init(params); } Status H264BRC::SetPictureFlags(FrameType, int32_t picture_structure, int32_t, int32_t, int32_t) { switch (picture_structure & PS_FRAME) { case (PS_TOP_FIELD): mPictureFlags = BRC_TOP_FIELD; break; case (PS_BOTTOM_FIELD): mPictureFlags = BRC_BOTTOM_FIELD; break; case (PS_FRAME): default: mPictureFlags = BRC_FRAME; } return UMC_OK; } int32_t H264BRC::GetQP(FrameType frameType, int32_t) { return ((frameType == I_PICTURE) ? mQuantI : (frameType == B_PICTURE) ? mQuantB : mQuantP) - mQuantOffset; } Status H264BRC::SetQP(int32_t qp, FrameType frameType, int32_t) { if (B_PICTURE == frameType) { mQuantB = qp + mQuantOffset; mQuantB = mfx::clamp(mQuantB, 1, mQuantMax); } else { mRCq = qp + mQuantOffset; mRCq = mfx::clamp(mRCq, 1, mQuantMax); mQuantI = mQuantP = mRCq; } return UMC_OK; } #define BRC_SCENE_CHANGE_RATIO1 20.0 #define BRC_SCENE_CHANGE_RATIO2 10.0 #define BRC_RCFAP_SHORT 5 BRCStatus H264BRC::PostPackFrame(FrameType picType, int32_t totalFrameBits, int32_t payloadBits, int32_t repack, int32_t poc) { BRCStatus Sts = BRC_OK; int32_t bitsEncoded = totalFrameBits - payloadBits; double e2pe; int32_t qp, qpprev; double qs, qstep; FrameType prevFrameType = mFrameType; if (mBitrate == 0) return Sts; mPoc = poc; if (!repack && mQuantUpdated <= 0) { // BRC reported buffer over/underflow but the application ignored it mQuantI = mQuantIprev; mQuantP = mQuantPprev; mQuantB = mQuantBprev; mPictureFlags = mPictureFlagsPrev; mRecode |= 2; // ??? UpdateQuant(mBitsEncoded, totalFrameBits); } mQuantIprev = mQuantI; mQuantPprev = mQuantP; mQuantBprev = mQuantB; mPictureFlagsPrev = mPictureFlags; mBitsEncoded = bitsEncoded; int32_t isField = ((mPictureFlags & BRC_FRAME) == BRC_FRAME) ? 0 : 1; if (mSceneChange) if (mQuantUpdated == 1 && poc > mSChPoc + 1) mSceneChange &= ~16; qpprev = qp = (picType == I_PICTURE) ? mQuantI : (picType == B_PICTURE) ? mQuantB : mQuantP; double buffullness = repack ? mHRD.prevBufFullness : mHRD.bufFullness; if (mParams.HRDBufferSizeBytes > 0) { mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame; if (isField) mHRD.inputBitsPerFrame *= 0.5; Sts = UpdateAndCheckHRD(totalFrameBits, repack); } double fa_short0 = mRCfa_short; mRCfa_short += (bitsEncoded - mRCfa_short) / BRC_RCFAP_SHORT; double frameFactor = 1.0; double targetFrameSize = std::max(mBitsDesiredFrame, mRCfa); if (isField) targetFrameSize *= 0.5; qstep = QP2Qstep(qp); double qstep_prev = QP2Qstep(mQPprev); e2pe = bitsEncoded * sqrt(qstep) / (mBitsEncodedPrev * sqrt(qstep_prev)); e2pe *= frameFactor; double maxFrameSize; maxFrameSize = 2.5/9. * buffullness + 5./9. * targetFrameSize; maxFrameSize = mfx::clamp(maxFrameSize, targetFrameSize, BRC_SCENE_CHANGE_RATIO2 * targetFrameSize); double famax = 1./9. * buffullness + 8./9. * mRCfa ; if (bitsEncoded > maxFrameSize && qp < mQuantMax) { double targetSizeScaled = maxFrameSize * 0.8; double qstepnew = qstep * bitsEncoded / targetSizeScaled; int32_t qpnew = Qstep2QP(qstepnew); if (qpnew == qp) qpnew++; qpnew = mfx::clamp(qpnew, 1, mQuantMax); mRCq = mQuantI = mQuantP = qpnew; if (picType == B_PICTURE) mQuantB = qpnew; else mQuantB = mfx::clamp(((mQuantP + mQuantPrev) * 563 >> 10) + 1, 1, mQuantMax); mRCfa_short = fa_short0; if (e2pe > BRC_SCENE_CHANGE_RATIO1) { // scene change, resetting BRC statistics mRCfa = mBitsDesiredFrame; mRCqa = 1./qpnew; mRCq = mQuantI = mQuantP = mQuantB = mQuantPrev = qpnew; mSceneChange |= 1; if (picType != B_PICTURE) { mSceneChange |= 16; mSChPoc = poc; } mRCfa_short = mBitsDesiredFrame; } if (mRecode) { mQuantUpdated = 0; mHRD.frameNum--; return BRC_ERR_BIG_FRAME; } } if (mRCfa_short > famax && (!repack) && qp < mQuantMax) { double qstepnew = qstep * mRCfa_short / (famax * 0.8); int32_t qpnew = Qstep2QP(qstepnew); if (qpnew == qp) qpnew++; qpnew = mfx::clamp(qpnew, 1, mQuantMax); mRCfa = mBitsDesiredFrame; mRCqa = 1./qpnew; mRCq = mQuantI = mQuantP = mQuantB = mQuantPrev = qpnew; mRCfa_short = mBitsDesiredFrame; if (mRecode) { mQuantUpdated = 0; mHRD.frameNum--; return BRC_ERR_BIG_FRAME; } } mFrameType = picType; double fa = isField ? mRCfa*0.5 : mRCfa; bool oldScene = false; if ((mSceneChange & 16) && (mPoc < mSChPoc) && (mBitsEncoded * (0.9 * BRC_SCENE_CHANGE_RATIO1) < (double)mBitsEncodedP) && (double)mBitsEncoded < 1.5*fa) oldScene = true; if (Sts != BRC_OK && mRecode) { Sts = UpdateQuantHRD(totalFrameBits, Sts, payloadBits); mQuantUpdated = 0; mFrameType = prevFrameType; mRCfa_short = fa_short0; } else { unsigned long long maxBitsPerFrame = std::min(mMaxBitsPerPic >> isField, mHRD.bufSize); if (static_cast(totalFrameBits) > maxBitsPerFrame) { if (maxBitsPerFrame > static_cast(mHRD.minFrameSize)) { // otherwise we ignore minCR requirement qstep = QP2Qstep(qp); qs = (double)totalFrameBits/maxBitsPerFrame; qstep *= qs; qp = Qstep2QP(qstep); if (qp == qpprev) qp++; if (qp > mQuantMax) qp = mQuantMax; if (qpprev < mQuantMax) { // compression below minCR is hardly achievable at mQuantMax, but anyways mQuantUpdated = -1; mRCq = mQuantI = mQuantP = qp; // ??? if (mFrameType == B_PICTURE) mQuantB = qp; else mQuantB = mfx::clamp(((mQuantP + mQuantPrev) * 563 >> 10) + 1, 1, mQuantMax); Sts = BRC_ERR_BIG_FRAME; mFrameType = prevFrameType; mRCfa_short = fa_short0; mHRD.frameNum--; return Sts; } } } if (mQuantUpdated == 0 && 1./qp < mRCqa) mRCqa += (1. / qp - mRCqa) / 16; else if (mQuantUpdated == 0) mRCqa += (1. / qp - mRCqa) / (mRCqap > 25 ? 25 : mRCqap); else mRCqa += (1. / qp - mRCqa) / mRCqap; if (mRecode) { mRCqa = mfx::clamp(mRCqa, 1./mQuantMax , 1./1.); } else { mRCqa = mfx::clamp(mRCqa, 1./mQuantMax , 1./mQuantMin); } if (repack != BRC_RECODE_PANIC && repack != BRC_RECODE_EXT_PANIC && !oldScene) { mQPprev = qp; mBitsEncodedPrev = mBitsEncoded; Sts = UpdateQuant(bitsEncoded, totalFrameBits); if (!mRecode) { if (mRCq < mQuantMin) mRCq = mQuantMin; } if (mFrameType != B_PICTURE) { mQuantPrev = mQuantP; mBitsEncodedP = mBitsEncoded; } mQuantP = mQuantI = mRCq; } mHRD.underflowQuant = -1; mQuantUpdated = 1; mMaxBitsPerPic = mMaxBitsPerPicNot0; mBF += (long long)mMaxBitrate * (long long)mParams.frameRateExtD >> isField; mBF -= ((long long)totalFrameBits >> 3) * mParams.frameRateExtN; if ((BRC_VBR == mRCMode) && (mBF > (long long)mParams.HRDBufferSizeBytes * mParams.frameRateExtN)) mBF = (long long)mParams.HRDBufferSizeBytes * mParams.frameRateExtN; } return Sts; }; BRCStatus H264BRC::UpdateQuant(int32_t bEncoded, int32_t totalPicBits) { BRCStatus Sts = BRC_OK; double bo, qs, dq; int32_t quant; int32_t isfield = ((mPictureFlags & BRC_FRAME) != BRC_FRAME) ? 1 : 0; uint32_t bitsPerPic = (uint32_t)mBitsDesiredFrame >> isfield; long long totalBitsDeviation; // int32_t fap = mRCfap, qap = mRCqap; if (isfield) mRCfa *= 0.5; quant = (mFrameType == I_PICTURE) ? mQuantI : (mFrameType == B_PICTURE) ? mQuantB : mQuantP; if (mRecode & 2) { mRCfa = bitsPerPic; mRCqa = mRCqa0; mRecode &= ~2; } mBitsEncodedTotal += totalPicBits; mBitsDesiredTotal += bitsPerPic; long long targetFullness = mParams.HRDInitialDelayBytes << 3; long long minTargetFullness = std::min(mHRD.bufSize / 2, mBitrate * 2); // half bufsize or 2 sec if (targetFullness < minTargetFullness) targetFullness = minTargetFullness; totalBitsDeviation = targetFullness - (long long)mHRD.bufFullness; if (totalBitsDeviation < mBitsEncodedTotal - mBitsDesiredTotal) totalBitsDeviation = mBitsEncodedTotal - mBitsDesiredTotal; if (mFrameType != I_PICTURE || mRCMode == BRC_CBR || mQuantUpdated == 0) mRCfa += (bEncoded - mRCfa) / mRCfap; mQuantB = mfx::clamp(((mQuantP + mQuantPrev) * 563 >> 10) + 1, 1, mQuantMax); if (mQuantUpdated == 0) if (mQuantB < quant) mQuantB = quant; qs = pow(bitsPerPic / mRCfa, 2.0); dq = mRCqa * qs; int32_t bap = mRCbap; double bfRatio = mHRD.bufFullness / mBitsDesiredFrame; if (totalBitsDeviation > 0) { bap = (int32_t)bfRatio*3; bap = std::max(bap, 10); bap = mfx::clamp(bap, mRCbap/10, mRCbap); } bo = (double)totalBitsDeviation / bap / mBitsDesiredFrame; // ??? bitsPerPic ? bo = mfx::clamp(bo, -1.0, 1.0); dq = dq + (1./mQuantMax - dq) * bo; dq = mfx::clamp(dq, 1./mQuantMax, 1./1.); quant = (int) (1. / dq + 0.5); if (quant >= mRCq + 5) quant = mRCq + 3; else if (quant >= mRCq + 3) quant = mRCq + 2; else if (quant > mRCq + 1) quant = mRCq + 1; else if (quant <= mRCq - 5) quant = mRCq - 3; else if (quant <= mRCq - 3) quant = mRCq - 2; else if (quant < mRCq - 1) quant = mRCq - 1; mRCq = quant; double qstep = QP2Qstep(quant); double fullnessThreshold = std::min(bitsPerPic * 12, mHRD.bufSize*3/16); qs = 1.0; if (bEncoded > mHRD.bufFullness && mFrameType != I_PICTURE) { qs = (double)bEncoded / (mHRD.bufFullness); } if (mHRD.bufFullness < fullnessThreshold && ((uint32_t)totalPicBits > bitsPerPic || quant < mQuantPrev)) qs *= sqrt((double)fullnessThreshold * 1.3 / mHRD.bufFullness); // ??? is often useless (quant == quant_old) if (qs > 1.0) { qstep *= qs; quant = Qstep2QP(qstep); if (mRCq == quant) quant++; quant = mfx::clamp(quant, 1, mQuantMax); mQuantB = ((quant + quant) * 563 >> 10) + 1; mQuantB = mfx::clamp(mQuantB, 1, mQuantMax); mRCq = quant; } if (isfield) mRCfa *= 2; return Sts; } BRCStatus H264BRC::UpdateQuantHRD(int32_t totalFrameBits, BRCStatus sts, int32_t payloadBits) { int32_t quant, quant_prev; double qs; int32_t wantedBits = (sts == BRC_ERR_BIG_FRAME ? mHRD.maxFrameSize : mHRD.minFrameSize); int32_t bEncoded = totalFrameBits - payloadBits; wantedBits -= payloadBits; if (wantedBits <= 0) // possible only if BRC_ERR_BIG_FRAME return (sts | BRC_NOT_ENOUGH_BUFFER); quant_prev = quant = (mFrameType == I_PICTURE) ? mQuantI : (mFrameType == B_PICTURE) ? mQuantB : mQuantP; if (sts & BRC_ERR_BIG_FRAME) mHRD.underflowQuant = quant; qs = pow((double)bEncoded/wantedBits, 2.0); quant = (int32_t)(quant * qs + 0.5); if (quant == quant_prev) quant += (sts == BRC_ERR_BIG_FRAME ? 1 : -1); quant = mfx::clamp(quant, 1, mQuantMax); if (quant < quant_prev) { while (quant <= mHRD.underflowQuant) quant++; } if (quant == quant_prev) return (sts | BRC_NOT_ENOUGH_BUFFER); // need this ??? loosen the limits ??? if (quant >= quant_prev + 5) quant = quant_prev + 3; else if (quant >= quant_prev + 3) quant = quant_prev + 2; else if (quant > quant_prev + 1) quant = quant_prev + 1; else if (quant <= quant_prev - 5) quant = quant_prev - 3; else if (quant <= quant_prev - 3) quant = quant_prev - 2; else if (quant < quant_prev - 1) quant = quant_prev - 1; switch (mFrameType) { case (I_PICTURE): mQuantI = quant; break; case (B_PICTURE): mQuantB = quant; break; case (P_PICTURE): default: mQuantP = quant; } return sts; } Status H264BRC::GetInitialCPBRemovalDelay(uint32_t *initial_cpb_removal_delay, int32_t recode) { uint32_t cpb_rem_del_u32; unsigned long long cpb_rem_del_u64, temp1_u64, temp2_u64; if (BRC_VBR == mRCMode) { if (recode) mBF = mBFsaved; else mBFsaved = mBF; } temp1_u64 = (unsigned long long)mBF * 90000; temp2_u64 = (unsigned long long)mMaxBitrate * mParams.frameRateExtN; cpb_rem_del_u64 = temp1_u64 / temp2_u64; cpb_rem_del_u32 = (uint32_t)cpb_rem_del_u64; if (BRC_VBR == mRCMode) { mBF = temp2_u64 * cpb_rem_del_u32 / 90000; temp1_u64 = (unsigned long long)cpb_rem_del_u32 * mMaxBitrate; uint32_t dec_buf_ful = (uint32_t)(temp1_u64 / (90000/8)); if (recode) mHRD.prevBufFullness = (double)dec_buf_ful; else mHRD.bufFullness = (double)dec_buf_ful; } *initial_cpb_removal_delay = cpb_rem_del_u32; return UMC_OK; } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/umc_mpeg2_brc.cpp000066400000000000000000000716571443134507600306310ustar00rootroot00000000000000// Copyright (c) 2009-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_mpeg2_brc.h" #include "umc_video_data.h" namespace UMC { static int32_t Val_QScale[2][32] = { /* linear q_scale */ {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62}, /* non-linear q_scale */ {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96,104,112} }; #if APA_MPEG2_BRC static int32_t QQuality_AddI[N_QUALITY_LEVELS][N_QP_THRESHLDS+1] = { {0,0,0,0,0}, {0,0,0,0,-1}, {0,0,0,-1,-2}, {0,0,-1,-2,-3}, {0,-1,-2,-3,-4}, {-1,-2,-3,-4,-5}, {-2,-3,-4,-5,-6} }; static int32_t QQuality_AddP[N_QUALITY_LEVELS][N_QP_THRESHLDS+1] = { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,-1}, {0,0,0,-1,-2}, {0,0,-1,-2,-3}, {0,1,-2,-3,-4}, {-1,-2,-3,-4,-5} }; static int32_t delta_qp[][N_INST_RATE_THRESHLDS+1][N_QP_THRESHLDS+1]={ {{1,1,1,0,0,}, {1,2,1,0,0,}, {1,2,3,3,4,}, {3,4,4,5,5,}, {4,5,5,6,7,},}, {{1,0,0,0,-1,}, {1,1,0,0,-1,}, {1,1,2,2,2,}, {2,2,3,4,5,}, {2,3,4,5,6,},}, {{0,0,0,0,-1,}, {1,0,0,-1,-1,}, {1,1,1,2,2,}, {1,2,3,4,4,}, {2,2,3,4,4,},}, {{0,0,0,-1,-1,}, {0,-1,-1,-1,-1,}, {0,0,0,0,-1,}, {1,1,1,0,0,}, {2,3,3,3,4,},}, // normal {{-1,-1,-2,-2,-3,}, {0,-1,-1,-2,-2,}, {0,0,0,-1,-2,}, {1,1,0,0,0,}, {1,2,2,3,3,},}, {{-1,-2,-3,-3,-4,}, {0,-1,-2,-2,-2,}, {0,0,-1,-1,-2,}, {1,1,0,0,-1,}, {1,2,2,2,3,},}, {{-2,-3,-3,-4,-4,}, {-1,-1,-2,-3,-3,}, {0,-1,-2,-2,-2,}, {1,0,0,-1,-1,}, {1,1,2,2,2,},}, {{-2,-3,-4,-4,-5,}, {-1,-2,-3,-3,-4,}, {0,-1,-2,-3,-3,}, {0,0,0,-1,-1,}, {0,1,1,1,1,},}, {{-2,-3,-4,-5,-7,}, {-1,-2,-3,-4,-5,}, {0,-1,-2,-3,-4,}, {0,-1,-2,-2,-2,}, {0,0,-1,-2,-3,},}, }; #define Q_THRESHOLD1 5 #define Q_THRESHOLD2 11 #define Q_THRESHOLD3 22 #define Q_THRESHOLD4 44 static int32_t qp_thresh[N_QP_THRESHLDS] = { Q_THRESHOLD1, Q_THRESHOLD2, Q_THRESHOLD3, Q_THRESHOLD4 }; static double inst_rate_thresh[N_INST_RATE_THRESHLDS] = { 0.3, 0.6, 0.9, 1.25, }; static double dev_thresh[N_DEV_THRESHLDS] = { -0.45, -0.33, -0.2, -0.1, 0.1, 0.2, 0.3, 0.4, }; #define HRD_DELTA 256 #define FIND_INDEX_SHORT(ptr, size, value, index) { \ for (index = 0; index < size; index++) { \ if (ptr[index] >= value) \ break; \ } \ } #define FIND_INDEX_MED(ptr, size, value, index) { \ if (ptr[(size >> 1) - 1] < value) { \ for (index = size >> 1; index < size; index++) { \ if (ptr[index] >= value) \ break; \ } \ } else { \ for (index = (size >> 1) - 2; index >= 0; index--) { \ if (ptr[index] < value) \ break; \ } \ index++; \ } \ } //size should be even! #define FIND_INDEX(ptr,size,value,index) { \ int32_t delta, test; delta = test = size >> 1; test--; \ while (delta > 1) { \ delta >>= 1; \ if (ptr[test] < value) test += delta; \ else test -= delta; \ } \ if (ptr[test] < value) test++; \ if (ptr[test] < value) test++; \ index = test; \ } #endif MPEG2BRC::MPEG2BRC() { mIsInit = 0; prqscale[0] = prqscale[1] = prqscale[2] = 0; prsize[0] = prsize[1] = prsize[2] = 0; quantiser_scale_value = -1; mQuantMin = 0; q_scale_type = 0; full_hw = false; prev_frame_type = 0; mQuantMax = 0; mIsFallBack = 0; rc_dev = 0; quantiser_scale_code = 0; gopw = 0; picture_flags_IP = 0; block_count = 0; rc_dev_saved = 0; mQualityLevel = 0; picture_flags = 0; picture_flags_prev = 0; } MPEG2BRC::~MPEG2BRC() { Close(); } Status MPEG2BRC::CheckHRDParams() { mParams.maxBitrate = (mParams.maxBitrate / 400) * 400; // In MPEG2 bitrate is coded in units of 400 bits mHRD.maxBitrate = mParams.maxBitrate; if ((int32_t)mBitrate > mParams.maxBitrate) mBitrate = mParams.targetBitrate = mParams.maxBitrate; mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame = mHRD.maxBitrate / mFramerate; if (BRC_VBR == mRCMode) { if (mHRD.bufSize > (uint32_t)16384 * 0x3fffe) mHRD.bufSize = (uint32_t)16384 * 0x3fffe; if(!full_hw) //allow initial delay to be different from buffer size mHRD.bufFullness = mHRD.bufSize; // vbv_delay = 0xffff in case of VBR } else { // BRC_CBR uint32_t max_buf_size = (uint32_t)(0xfffe * (unsigned long long)mHRD.maxBitrate / 90000); // vbv_delay is coded with 16 bits: // it is either 0xffff everywhere (VBR) or < 0xffff if (mHRD.bufSize > max_buf_size) { if (max_buf_size > (uint32_t)16384 * 0x3fffe) max_buf_size = (uint32_t)16384 * 0x3fffe; if (mHRD.bufFullness > max_buf_size/2) { // leave mHRD.bufFullness unchanged if below mHRD.bufSize/2 double newBufFullness = mHRD.bufFullness * max_buf_size / mHRD.bufSize; if (newBufFullness < (double)max_buf_size / 2) newBufFullness = (double)max_buf_size / 2; mHRD.bufFullness = newBufFullness; } mHRD.bufSize = max_buf_size; } else { if (mHRD.bufSize > (uint32_t)16384 * 0x3fffe) mHRD.bufSize = (uint32_t)16384 * 0x3fffe; if (mHRD.bufFullness > (double)mHRD.bufSize) mHRD.bufFullness = (double)mHRD.bufSize; } } mParams.HRDBufferSizeBytes = mHRD.bufSize / 8; mHRD.bufSize = mParams.HRDBufferSizeBytes * 8; mParams.HRDInitialDelayBytes = (int32_t)(mHRD.bufFullness / 8); mHRD.bufFullness = mParams.HRDInitialDelayBytes * 8; if (mHRD.bufSize < mHRD.inputBitsPerFrame) return UMC_ERR_INVALID_PARAMS; return UMC_OK; } Status MPEG2BRC::Init(BaseCodecParams *params, int32_t no_full_HW) { Status status = UMC_OK; double u_len; full_hw = (no_full_HW == 0); status = CommonBRC::Init(params); if (status != UMC_OK) return status; status = InitHRD(); if (status != UMC_OK) return status; CheckHRDParams(); mHRD.roundError = mHRD.maxBitrate / 90000; if (mBitrate <= 0 || mFramerate <= 0) return UMC_ERR_INVALID_PARAMS; double ppb; //pixels per bit (~ density) int32_t i; mBitsDesiredFrame = (int32_t)((double)mBitrate / mFramerate); // one can vary weights, can be added to API rc_weight[0] = 120; rc_weight[1] = 50; rc_weight[2] = 25; rc_dev = rc_dev_saved = 0; // deviation from ideal bitrate (should be float or renewed) SetGOP(); gopw = N_B_frame * rc_weight[2] + rc_weight[1] * N_P_frame + rc_weight[0]; u_len = mBitsDesiredFrame * mGOPPicSize / gopw; rc_tagsize[0] = rc_tagsize_frame[0] = u_len * rc_weight[0]; rc_tagsize[1] = rc_tagsize_frame[1] = u_len * rc_weight[1]; rc_tagsize[2] = rc_tagsize_frame[2] = u_len * rc_weight[2]; double rrel = gopw / (rc_weight[0] * mGOPPicSize); block_count = (mParams.info.color_format == YUV444 ? 12 : (mParams.info.color_format == YUV422 ? 8 : 6)); ppb = mParams.info.clip_info.width * mParams.info.clip_info.height * mFramerate / mBitrate * (block_count-2) / (6-2); qscale[0] = (int32_t)(6.0 * rrel * ppb); // numbers are empiric qscale[1] = (int32_t)(9.0 * rrel * ppb); qscale[2] = (int32_t)(12.0 * rrel * ppb); for (i = 0; i < 3; i++) { if (qscale[i] < 1) qscale[i] = 1; else if (qscale[i] > 63) qscale[i] = 63; // can be even more if (prqscale[i] == 0) prqscale[i] = qscale[i]; } gopw = N_B_field * rc_weight[2] + rc_weight[1] * N_P_field + rc_weight[0]; u_len = (double)mBitsDesiredFrame * mGOPPicSize / gopw; rc_tagsize_field[0] = u_len * rc_weight[0]; rc_tagsize_field[1] = u_len * rc_weight[1]; rc_tagsize_field[2] = u_len * rc_weight[2]; #if APA_MPEG2_BRC mIsFallBack = 0; double orig_frame_size = mParams.info.clip_info.width * mParams.info.clip_info.height * (mParams.info.color_format == YUV444 ? 3. : (mParams.info.color_format == YUV422 ? 2. : 1.5))*8; if ( mHRD.inputBitsPerFrame != 0 ){ if ( orig_frame_size/mHRD.inputBitsPerFrame > 100) mIsFallBack = 1; if ( orig_frame_size/mHRD.inputBitsPerFrame < 10) mIsFallBack = 1; } mQualityLevel=5; if (mGOPRefDist < 1) mQualityLevel = 0; else if (mGOPRefDist == 1) mQualityLevel = 2; else { mQualityLevel = 2 + mGOPRefDist; if (mQualityLevel > (N_QUALITY_LEVELS-1)) mQualityLevel = (N_QUALITY_LEVELS-1); } /* calculating instant bitrate thresholds */ for (i = 0; i < N_INST_RATE_THRESHLDS; i++) { instant_rate_thresholds[i]=((double)mBitrate*inst_rate_thresh[i]); } /* calculating deviation from ideal fullness/bitrate thresholds */ for (i = 0; i < N_DEV_THRESHLDS; i++) { deviation_thresholds[i]=((double)mHRD.bufSize*dev_thresh[i]); } mQuantMin=1; mQuantMax=112; #endif for (i = 0; i < 3; i++) { // just in case - will be set in PreEnc for (frameNum == 0) prpicture_flags[i] = BRC_FRAME; prsize[i] = (int32_t)rc_tagsize_frame[i]; } picture_flags_prev = picture_flags_IP = picture_flags = BRC_FRAME; mIsInit = true; return status; } Status MPEG2BRC::Reset(BaseCodecParams *init, int32_t) { return Init(init); } Status MPEG2BRC::Close() { Status status = UMC_OK; if (!mIsInit) return UMC_ERR_NOT_INITIALIZED; mIsInit = false; return status; } Status MPEG2BRC::SetParams(BaseCodecParams* params, int32_t) { return Init(params); } Status MPEG2BRC::SetPictureFlags(FrameType frameType, int32_t picture_structure, int32_t repeat_first_field, int32_t top_field_first, int32_t second_field) { if (frameType != B_PICTURE) { picture_flags_prev = picture_flags_IP; picture_flags_IP = picture_flags; } switch (picture_structure & PS_FRAME) { case (PS_TOP_FIELD): picture_flags = BRC_TOP_FIELD; break; case (PS_BOTTOM_FIELD): picture_flags = BRC_BOTTOM_FIELD; break; case (PS_FRAME): default: picture_flags = BRC_FRAME; } picture_flags |= (repeat_first_field ? BRC_REPEAT_FIRST_FIELD : 0); picture_flags |= (top_field_first ? BRC_TOP_FIELD_FIRST : 0); picture_flags |= (second_field ? BRC_SECOND_FIELD : 0); return UMC_OK; } int32_t MPEG2BRC::ChangeQuant(int32_t quant_value) { int32_t curq = quantiser_scale_value; if (quant_value == quantiser_scale_value) return quantiser_scale_value; if (quant_value > 7 && quant_value <= 62) { q_scale_type = 0; quantiser_scale_code = (quant_value + 1) >> 1; } else { // non-linear quantizer q_scale_type = 1; if (quant_value <= 8) quantiser_scale_code = quant_value; else if (quant_value > 62) quantiser_scale_code = 25 + ((quant_value - 64 + 4) >> 3); } if (quantiser_scale_code < 1) quantiser_scale_code = 1; if (quantiser_scale_code > 31) quantiser_scale_code = 31; quantiser_scale_value = Val_QScale[q_scale_type][quantiser_scale_code]; if (quantiser_scale_value == curq) { if (quant_value > curq) { if (quantiser_scale_code == 31) return quantiser_scale_value; else quantiser_scale_code++; } if (quant_value < curq) { if (quantiser_scale_code == 1) return quantiser_scale_value; else quantiser_scale_code--; } quantiser_scale_value = Val_QScale[q_scale_type][quantiser_scale_code]; } return quantiser_scale_value; } #if APA_MPEG2_BRC Status MPEG2BRC::PreEncFrame(FrameType frameType, int32_t recode, int32_t) { int32_t isfield = ((picture_flags & BRC_FRAME) != BRC_FRAME); int32_t i; if (recode & BRC_EXT_FRAMESKIP) return UMC_OK; if (frameType == I_PICTURE) { if (isfield) { N_P = N_P_field; N_B = N_B_field; for (i = 0; i < 3; i++) rc_tagsize[i] = rc_tagsize_field[i]; } else { N_P = N_P_frame; N_B = N_B_frame; for (i = 0; i < 3; i++) rc_tagsize[i] = rc_tagsize_frame[i]; } if (mHRD.frameNum == 0) { // first frame for (i = 0; i < 3; i++) { if (prsize[i] == 0) prsize[i] = (int32_t)rc_tagsize[i]; prpicture_flags[i] = picture_flags; } } } if (mIsFallBack) return PreEncFrameFallBack(frameType,recode); else return PreEncFrameMidRange(frameType,recode); } Status MPEG2BRC::PreEncFrameMidRange(FrameType frameType, int32_t recode) { int32_t q0, q1; int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); int32_t (*qp_delta_ptr)[5][5] = &delta_qp[0]; int32_t i,j,t; Status status = UMC_OK; if (recode < BRC_RECODE_EXT_QP) // skip in case of external recode if (frameType == I_PICTURE && mRCMode == BRC_CBR && mHRD.frameNum) { double ip_tagsize = rc_tagsize[0]; double dev, adev, arc_dev; /* if (BRC_FRAME != (picture_flags & 0x3)) ip_tagsize = (rc_tagsize[0] + rc_tagsize[1]) * .5; // every second I-field became P-field */ if (mHRD.bufFullness < 2 * ip_tagsize || (double)mHRD.bufSize - mHRD.bufFullness < mHRD.maxInputBitsPerFrame) { dev = mHRD.bufSize / 2 // half of vbv_buffer + ip_tagsize / 2 // top to center length of I (or IP) frame - mHRD.bufFullness; if (dev * rc_dev < 0) { dev = mfx::clamp(dev, -mHRD.maxInputBitsPerFrame, ip_tagsize); rc_dev = dev; } else { adev = BRC_ABS(dev); arc_dev = BRC_ABS(rc_dev); if (adev > arc_dev) { dev = mfx::clamp(dev, -arc_dev - mHRD.maxInputBitsPerFrame, arc_dev + ip_tagsize); rc_dev = dev; } } } } if (recode > BRC_RECODE_NONE) { if (mFrameType != frameType) { // recoding due to frame type change int32_t prevIndx = (mFrameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); qscale[prevIndx] = ChangeQuant(prqscale[prevIndx]); } return status; } q0 = qscale[indx]; //I-frame start QP if (indx == 0) { if (q0 < Q_THRESHOLD1) { if (N_B > 0 && N_P > 0) q0 = (5*qscale[0]+qscale[0]+qscale[1]+qscale[2])>>3; else if (N_P > 0) q0 = (2*qscale[0]+qscale[0]+qscale[1])>>2; } else if (q0 < Q_THRESHOLD2 && N_P > 0) q0 = (2*qscale[0]+qscale[0]+qscale[1])>>2; if (q0 < Q_THRESHOLD1) { if (N_P > 0 && qscale[0] >= qscale[1]) q0 = qscale[1]-1; if (N_B > 0 && qscale[0] >= qscale[2]){ q0 = qscale[2]-1; } } else { if (N_P > 0 && qscale[0] >= qscale[1]) q0 = (int)(0.8*(double)qscale[1]); if (N_B > 0 && qscale[0] >= qscale[2]){ q0 = (int)(0.8*(double)qscale[2]); } } } //P-frames start QP if (indx == 1) { if (N_B > 0) { q0 = (5*qscale[1]+qscale[0]+qscale[1]+qscale[2])>>3; if (q0 > Q_THRESHOLD4) { if (q0 > qscale[2] + 3) q0 -= 4; } else if (q0 > Q_THRESHOLD3) { if (q0 > qscale[2] + 2) q0 -= 3; } else if (q0 > Q_THRESHOLD2) { if (q0 > qscale[2] + 1) q0 -= 2; } else { if (q0 > qscale[2] + 0) q0 -= 1; } } else { // only I & P frames if (mHRD.bufFullness > prsize[1]*2 && mHRD.bufFullness > prsize[0]*1.5) q0 = (2*qscale[1]+qscale[0]+qscale[1])>>2; } if (q0 < qscale[0]) q0++; } //B-frames start QP if (indx == 2) { if (mHRD.bufFullness > prsize[2]*2 && mHRD.bufFullness > prsize[1]*1.5) q0 = (2*qscale[2]+qscale[2]+qscale[1])>>2; if (q0 < Q_THRESHOLD2) { if (q0 < qscale[0]) q0++; } if (q0 < qscale[1]) q0++; } double inst_bitrate = (((double)prsize[0]+(double)prsize[1]*N_P+(double)prsize[2]*N_B)*mFramerate)/(double)mGOPPicSize; double deviation; if (mRCMode == BRC_CBR) deviation = (double)mHRD.bufFullness - (double)mHRD.bufSize/2; else // deviation = (double)mHRD.bufFullness - (double)mParams.HRDInitialDelayBytes*8; deviation = (double)mHRD.bufFullness - (double)mHRD.bufSize; // initial fullness = bufsize for VBR FIND_INDEX_MED(deviation_thresholds,N_DEV_THRESHLDS,deviation,t); qp_delta_ptr = &delta_qp[t]; FIND_INDEX_SHORT(instant_rate_thresholds,N_INST_RATE_THRESHLDS,inst_bitrate,i); FIND_INDEX_SHORT(qp_thresh,N_QP_THRESHLDS,q0,j); q0 += (*qp_delta_ptr)[i][j]; if (indx == 2 ) { if ( q0 < 2) q0++; } else { FIND_INDEX_SHORT(qp_thresh,N_QP_THRESHLDS,q0,j); if (indx == 0) q0 += QQuality_AddI[mQualityLevel][j]; else if (indx == 1) q0 += QQuality_AddP[mQualityLevel][j]; } //clip qp to a valid value q0 = mfx::clamp(q0, mQuantMin, mQuantMax); // this call is used to accept small changes in value, which are mapped to the same code // changeQuant bothers about changing scale code if value changes i = 0; int act_delta_qp = q0-qscale[indx]; q1 = ChangeQuant(q0); //enforcing to change QP in the direction of sign of act_delta_qp if (act_delta_qp != 0){ while ( i < 10 && q1 == qscale[indx] ){ if (act_delta_qp < 0) act_delta_qp--; else act_delta_qp++; q0 = qscale[indx] + act_delta_qp; q1 = ChangeQuant(q0); i++; } } qscale[indx] = q1; return status; } Status MPEG2BRC::PreEncFrameFallBack(FrameType frameType, int32_t recode) { int32_t q0, q2, sz1; int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); double target_size; int32_t wanted_size; Status status = UMC_OK; // refresh rate deviation with every new I frame if (recode < BRC_RECODE_EXT_QP) // skip in case of external recode if (frameType == I_PICTURE && mRCMode == BRC_CBR && mHRD.frameNum) { double ip_tagsize = rc_tagsize[0]; double dev, adev, arc_dev; /* if (BRC_FRAME != (picture_flags & 0x3)) ip_tagsize = (rc_tagsize[0] + rc_tagsize[1]) * .5; // every second I-field became P-field */ if (mHRD.bufFullness < 2 * ip_tagsize || (double)mHRD.bufSize - mHRD.bufFullness < mHRD.maxInputBitsPerFrame ) { dev = mHRD.bufSize / 2 // half of vbv_buffer + ip_tagsize / 2 // top to center length of I (or IP) frame - mHRD.bufFullness; if (dev * rc_dev < 0) { dev = mfx::clamp(dev, -mHRD.maxInputBitsPerFrame, ip_tagsize); rc_dev = dev; } else { adev = BRC_ABS(dev); arc_dev = BRC_ABS(rc_dev); if (adev > arc_dev) { dev = mfx::clamp(dev, -arc_dev - mHRD.maxInputBitsPerFrame, arc_dev + ip_tagsize); rc_dev = dev; } } } } if (recode > BRC_RECODE_NONE) { if (mFrameType != frameType) { // recoding due to frame type change int32_t prevIndx = (mFrameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); qscale[prevIndx] = ChangeQuant(prqscale[prevIndx]); } return status; } q0 = qscale[indx]; // proposed from post picture q2 = prqscale[indx]; // last used scale sz1 = prsize[indx]; // last coded size target_size = rc_tagsize[indx]; wanted_size = (int32_t)(target_size - rc_dev / 3 * target_size / rc_tagsize[0]); if (sz1 > 2*wanted_size) q2 = q2 * 3 / 2 + 1; else if (sz1 > wanted_size + 100) q2++; else if (2*sz1 < wanted_size) q2 = q2 * 3 / 4; else if (sz1 < wanted_size-100 && q2 > 2) q2--; if (rc_dev > 0) { q2 = std::max(q0,q2); } else { q2 = std::min(q0,q2); } // this call is used to accept small changes in value, which are mapped to the same code // changeQuant bothers about changing scale code if value changes q2 = ChangeQuant(q2); qscale[indx] = q2; return status; } #else Status MPEG2BRC::PreEncFrame(FrameType frameType, int32_t recode) { int32_t q0, q2, sz1; int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); double target_size; int32_t wanted_size; Status status = UMC_OK; // refresh rate deviation with every new I frame if (frameType == I_PICTURE && mRCMode == BRC_CBR && mHRD.frameNum) { double ip_tagsize = rc_tagsize[0]; double dev, adev, arc_dev; if (BRC_FRAME != (picture_flags & 0x3)) ip_tagsize = (rc_tagsize[0] + rc_tagsize[1]) * .5; // every second I-field became P-field if (mHRD.bufFullness < 2 * ip_tagsize || (double)mHRD.bufSize - mHRD.bufFullness < mHRD.maxInputBitsPerFrame ) { dev = mHRD.bufSize / 2 // half of vbv_buffer + ip_tagsize / 2 // top to center length of I (or IP) frame - mHRD.bufFullness; if (dev * rc_dev < 0) { BRC_CLIP(dev, -mHRD.maxInputBitsPerFrame, ip_tagsize); rc_dev = dev; } else { adev = BRC_ABS(dev); arc_dev = BRC_ABS(rc_dev); if (adev > arc_dev) { BRC_CLIP(dev, -arc_dev - mHRD.maxInputBitsPerFrame, arc_dev + ip_tagsize); rc_dev = dev; } } } } if (recode) { if (mFrameType != frameType) { // recoding due to frame type change int32_t prevIndx = (mFrameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); qscale[prevIndx] = ChangeQuant(prqscale[prevIndx]); } return status; } q0 = qscale[indx]; // proposed from post picture q2 = prqscale[indx]; // last used scale sz1 = prsize[indx]; // last coded size target_size = rc_tagsize[indx]; wanted_size = (int32_t)(target_size - rc_dev / 3 * target_size / rc_tagsize[0]); if (sz1 > 2*wanted_size) q2 = q2 * 3 / 2 + 1; else if (sz1 > wanted_size + 100) q2++; else if (2*sz1 < wanted_size) q2 = q2 * 3 / 4; else if (sz1 < wanted_size-100 && q2 > 2) q2--; if (rc_dev > 0) { q2 = std::max(q0,q2); } else { q2 = std::min(q0,q2); } // this call is used to accept small changes in value, which are mapped to the same code // changeQuant bothers about changing scale code if value changes q2 = ChangeQuant(q2); qscale[indx] = q2; return status; } #endif int32_t MPEG2BRC::GetQP(FrameType frameType, int32_t) { int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); return qscale[indx]; } Status MPEG2BRC::SetQP(int32_t qp, FrameType frameType, int32_t) { int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); qscale[indx] = qp; return UMC_OK; } BRCStatus MPEG2BRC::PostPackFrame(FrameType frameType, int32_t bits_encoded, int32_t, int32_t repack, int32_t) { int32_t isfield = ((picture_flags & BRC_FRAME) != BRC_FRAME); uint32_t picFlags = (frameType == B_PICTURE ? picture_flags : picture_flags_prev); int32_t Sts = BRC_OK; int32_t indx = (frameType == B_PICTURE ? 2 : (frameType == P_PICTURE ? 1 : 0)); mFrameType = frameType; if (mParams.info.interlace_type == PROGRESSIVE) { mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame; if (picFlags & BRC_REPEAT_FIRST_FIELD) { mHRD.inputBitsPerFrame += mHRD.maxInputBitsPerFrame; if (picFlags & BRC_TOP_FIELD_FIRST) mHRD.inputBitsPerFrame += mHRD.maxInputBitsPerFrame; } } else { mHRD.inputBitsPerFrame = mHRD.maxInputBitsPerFrame / 2; if (!isfield) { if (picFlags & BRC_REPEAT_FIRST_FIELD) mHRD.inputBitsPerFrame *= 3; else mHRD.inputBitsPerFrame *= 2; } else if (frameType != B_PICTURE) { if ((picture_flags & BRC_SECOND_FIELD) && ((picture_flags_prev & BRC_FRAME) == BRC_FRAME) && (picture_flags_prev & BRC_REPEAT_FIRST_FIELD)) mHRD.inputBitsPerFrame *= 2; } } // prsize[indx] = (int32_t)(bits_encoded << isfield); prsize[indx] = bits_encoded; prqscale[indx] = qscale[indx]; prpicture_flags[indx] = picture_flags; Sts = UpdateAndCheckHRD(bits_encoded, repack); if ((repack & BRC_EXT_FRAMESKIP) || BRC_RECODE_EXT_PANIC == repack || BRC_RECODE_PANIC == repack) // no use in changing QP return Sts; if (Sts != BRC_OK) { Sts = UpdateQuantHRD(bits_encoded, Sts); return Sts; } #if APA_MPEG2_BRC if (!mIsFallBack) { if (qscale[indx] < Q_THRESHOLD1) { if (bits_encoded > (int)(4*(int)mHRD.inputBitsPerFrame) ){ Sts = UpdateQuantHRD(bits_encoded, BRC_ERR_BIG_FRAME); mHRD.frameNum--; if (Sts & BRC_NOT_ENOUGH_BUFFER) Sts = BRC_OK; else return Sts; } } else if (indx == 0) { //(qscale[indx] < Q_THRESHOLD2) { if (bits_encoded > (int)(8*(int)mHRD.inputBitsPerFrame) ){ Sts = UpdateQuantHRD(bits_encoded, BRC_ERR_BIG_FRAME); mHRD.frameNum--; if (Sts & BRC_NOT_ENOUGH_BUFFER) Sts = BRC_OK; else return Sts; } } } /* else { if (bits_encoded > (int)(4*(int)mHRD.bufFullness) ){ Sts = UpdateQuantHRD(bits_encoded, BRC_ERR_BIG_FRAME); mHRD.frameNum--; if (Sts & BRC_NOT_ENOUGH_BUFFER) Sts = BRC_OK; else return Sts; } } */ #endif /* rc_vbv_fullness = rc_vbv_fullness - bits_encoded; rc_vbv_fullness += rc_delay; // if(encodeInfo.rc_mode != RC_CBR && rc_vbv_fullness >= vbv_size) { rc_vbv_fullness = (double) vbv_size; vbv_delay = 0xffff; // input } if(encodeInfo.rc_mode != RC_CBR) return 0; */ if (repack > BRC_RECODE_PANIC) // recoding decision made outside BRC rc_dev = rc_dev_saved; int32_t cur_qscale = qscale[indx]; double target_size = rc_tagsize[indx]; // rc_dev += bits_encoded - (isfield ? target_size/2 : target_size); rc_dev_saved = rc_dev; rc_dev += bits_encoded - target_size; // if (repack == BRC_RECODE_PANIC || repack == BRC_RECODE_EXT_PANIC) // do not change QP based on panic data // return Sts; int32_t wanted_size = (int32_t)(target_size - rc_dev / 3 * target_size / rc_tagsize[0]); int32_t newscale; int32_t del_sc; newscale = cur_qscale; // wanted_size >>= isfield; if (bits_encoded > wanted_size) newscale++; if (bits_encoded > 2*wanted_size) newscale = cur_qscale * 3 / 2 + 1; if (bits_encoded < wanted_size && cur_qscale>2) newscale--; if (2*bits_encoded < wanted_size) newscale = cur_qscale * 3 / 4; if (repack == BRC_RECODE_EXT_QP) { if (newscale > cur_qscale) // don't decrease QP in case of external QP qscale[indx] = ChangeQuant(newscale); return Sts; } // this call is used to accept small changes in value, which are mapped to the same code // changeQuant bothers about to change scale code if value changes newscale = ChangeQuant(newscale); #if APA_MPEG2_BRC if (mIsFallBack) { #endif if (frameType == I_PICTURE) { if (newscale + 1 > qscale[1]) qscale[1] = newscale+1; if (newscale + 2 > qscale[2]) qscale[2] = newscale+2; } else if (frameType == P_PICTURE) { if (newscale < qscale[0]) { del_sc = qscale[0] - newscale; qscale[0] -= del_sc/2; newscale = qscale[0]; newscale = ChangeQuant(newscale); } if (newscale+1 > qscale[2]) qscale[2] = newscale + 1; } else { if (newscale < qscale[1]) { del_sc = qscale[1] - newscale; qscale[1] -= del_sc/2; newscale = qscale[1]; newscale = ChangeQuant(newscale); if( qscale[1] < qscale[0]) qscale[0] = qscale[1]; } } #if APA_MPEG2_BRC } else { if (frameType == P_PICTURE) { if (newscale < qscale[0]) { del_sc = qscale[0] - newscale; newscale = qscale[0] - del_sc/2; newscale = ChangeQuant(newscale); } } else if (frameType == B_PICTURE) { if (newscale < qscale[1]) { del_sc = qscale[1] - newscale; newscale = qscale[1] - del_sc/2; newscale = ChangeQuant(newscale); } } } #endif qscale[indx] = newscale; return Sts; } BRCStatus MPEG2BRC::UpdateQuantHRD(int32_t bits_encoded, BRCStatus sts) { int32_t quant, quant_prev; int32_t indx = (mFrameType == B_PICTURE ? 2 : (mFrameType == P_PICTURE ? 1 : 0)); double qs; int32_t wantedBits = (sts == BRC_ERR_BIG_FRAME ? mHRD.maxFrameSize : mHRD.minFrameSize); if (wantedBits == 0) // KW-inspired safety check { wantedBits = 1; } quant = qscale[indx]; quant_prev = quant; if (sts & BRC_ERR_BIG_FRAME) mHRD.underflowQuant = quant; qs = (double)bits_encoded/wantedBits; quant = (int32_t)(quant * qs + 0.5); if (quant == quant_prev) quant += (sts == BRC_ERR_BIG_FRAME ? 1 : -1); if (quant < quant_prev) { if (quant <= mHRD.underflowQuant) quant = mHRD.underflowQuant + 1; } quant = ChangeQuant(quant); if (quant == quant_prev || quant <= mHRD.underflowQuant) { return (sts | BRC_NOT_ENOUGH_BUFFER); } qscale[indx] = quant; return sts; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/umc_svc_brc.cpp000066400000000000000000001134361443134507600304020ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_svc_brc.h" #include "umc_h264_video_encoder.h" #include "umc_h264_tables.h" #if defined(MFX_ENABLE_H264_VIDEO_ENCODE) namespace UMC { SVCBRC::SVCBRC() { mIsInit = 0; mNumTemporalLayers = 0; mRCfa = 0; mQuant = 0; mQuantP = 0; mQuantI = 0; mQuantB = 0; mPictureFlagsPrev = 0; mQuantUnderflow = 0; mQuantOverflow = 0; mMaxFrameSize = 0; mOversize = 0; mUndersize = 0; mQuantMax = 0; mPictureFlags = 0; mRCfap = 0; mRCMode = 0; mFrameType = NONE_PICTURE; mRCqa = 0; mRCq = 0; mRCqa0 = 0; mMinFrameSize = 0; mTid = 0; mQuantUpdated = 0; mRCqap = 0; mBitsEncoded = 0; mRCbap = 0; mRecodeInternal = 0; } SVCBRC::~SVCBRC() { Close(); } // Copy of mfx_h264_enc_common.cpp::LevelProfileLimitsNal const unsigned long long LevelProfileLimits[4][16][6] = { { // BASE_PROFILE, MAIN_PROFILE, EXTENDED_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 76800, 210000, 64}, /* 1b */ { 1485, 99, 152064, 153600, 420000, 64}, /* 11 */ { 3000, 396, 345600, 230400, 600000, 128}, /* 12 */ { 6000, 396, 912384, 460800, 1200000, 128}, /* 13 */ { 11880, 396, 912384, 921600, 2400000, 128}, /* 2 */ { 11880, 396, 912384, 2400000, 2400000, 128}, /* 21 */ { 19800, 792, 1824768, 4800000, 4800000, 256}, /* 22 */ { 20250, 1620, 3110400, 4800000, 4800000, 256}, /* 3 */ { 40500, 1620, 3110400, 12000000, 12000000, 256}, /* 31 */ { 108000, 3600, 6912000, 16800000, 16800000, 512}, /* 32 */ { 216000, 5120, 7864320, 24000000, 24000000, 512}, /* 4 */ { 245760, 8192, 12582912, 24000000, 30000000, 512}, /* 41 */ { 245760, 8192, 12582912, 60000000, 75000000, 512}, /* 42 */ { 522240, 8704, 13369344, 60000000, 75000000, 512}, /* 5 */ { 589824, 22080, 42393600, 162000000, 162000000, 512}, /* 51 */ { 983040, 36864, 70778880, 288000000, 288000000, 512}, }, { // HIGH_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 96000, 262500, 64}, /* 1b */ { 1485, 99, 152064, 192000, 525000, 64}, /* 11 */ { 3000, 396, 345600, 288000, 750000, 128}, /* 12 */ { 6000, 396, 912384, 576000, 1500000, 128}, /* 13 */ { 11880, 396, 912384, 1152000, 3000000, 128}, /* 2 */ { 11880, 396, 912384, 3000000, 3000000, 128}, /* 21 */ { 19800, 792, 1824768, 6000000, 6000000, 256}, /* 22 */ { 20250, 1620, 3110400, 6000000, 6000000, 256}, /* 3 */ { 40500, 1620, 3110400, 15000000, 15000000, 256}, /* 31 */ { 108000, 3600, 6912000, 21000000, 21000000, 512}, /* 32 */ { 216000, 5120, 7864320, 30000000, 30000000, 512}, /* 4 */ { 245760, 8192, 12582912, 30000000, 37500000, 512}, /* 41 */ { 245760, 8192, 12582912, 75000000, 93750000, 512}, /* 42 */ { 522240, 8704, 13369344, 75000000, 93750000, 512}, /* 5 */ { 589824, 22080, 42393600, 202500000, 202500000, 512}, /* 51 */ { 983040, 36864, 70778880, 360000000, 360000000, 512}, }, { // HIGH10_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 230400, 630000, 64}, /* 1b */ { 1485, 99, 152064, 460800, 1260000, 64}, /* 11 */ { 3000, 396, 345600, 691200, 1800000, 128}, /* 12 */ { 6000, 396, 912384, 1382400, 3600000, 128}, /* 13 */ { 11880, 396, 912384, 2764800, 7200000, 128}, /* 2 */ { 11880, 396, 912384, 7200000, 7200000, 128}, /* 21 */ { 19800, 792, 1824768, 14400000, 14400000, 256}, /* 22 */ { 20250, 1620, 3110400, 14400000, 14400000, 256}, /* 3 */ { 40500, 1620, 3110400, 36000000, 36000000, 256}, /* 31 */ { 108000, 3600, 6912000, 50400000, 50400000, 512}, /* 32 */ { 216000, 5120, 7864320, 72000000, 72000000, 512}, /* 4 */ { 245760, 8192, 12582912, 72000000, 90000000, 512}, /* 41 */ { 245760, 8192, 12582912, 180000000, 225000000, 512}, /* 42 */ { 522240, 8704, 13369344, 180000000, 225000000, 512}, /* 5 */ { 589824, 22080, 42393600, 486000000, 486000000, 512}, /* 51 */ { 983040, 36864, 70778880, 864000000, 864000000, 512}, }, { // HIGH422_PROFILE, HIGH444_PROFILE // MaxMBPS MaxFS Max DPB MaxBR MaxCPB MaxMvV /* 1 */ { 1485, 99, 152064, 307200, 840000, 64}, /* 1b */ { 1485, 99, 152064, 614400, 1680000, 64}, /* 11 */ { 3000, 396, 345600, 921600, 2400000, 128}, /* 12 */ { 6000, 396, 912384, 1843200, 4800000, 128}, /* 13 */ { 11880, 396, 912384, 3686400, 9600000, 128}, /* 2 */ { 11880, 396, 912384, 9600000, 9600000, 128}, /* 21 */ { 19800, 792, 1824768, 19200000, 19200000, 256}, /* 22 */ { 20250, 1620, 3110400, 19200000, 19200000, 256}, /* 3 */ { 40500, 1620, 3110400, 48000000, 48000000, 256}, /* 31 */ { 108000, 3600, 6912000, 67200000, 67200000, 512}, /* 32 */ { 216000, 5120, 7864320, 96000000, 96000000, 512}, /* 4 */ { 245760, 8192, 12582912, 96000000, 120000000, 512}, /* 41 */ { 245760, 8192, 12582912, 240000000, 300000000, 512}, /* 42 */ { 522240, 8704, 13369344, 240000000, 300000000, 512}, /* 5 */ { 589824, 22080, 42393600, 648000000, 648000000, 512}, /* 51 */ { 983040, 36864, 70778880, 1152000000,1152000000,512}, }, }; /* static double QP2Qstep (int32_t QP) { return (double)(0.85 * pow(2.0, (QP - 12.0) / 6.0)); } static int32_t Qstep2QP (double Qstep) { return (int32_t)(12.0 + 6.0 * log(Qstep/0.85) / log(2.0)); } */ Status SVCBRC::InitHRDLayer(int32_t tid) { VideoBrcParams *pParams = &mParams[tid]; int32_t profile_ind, level_ind; unsigned long long bufSizeBits = pParams->HRDBufferSizeBytes << 3; unsigned long long maxBitrate = pParams->maxBitrate; int32_t bitsPerFrame; bitsPerFrame = (int32_t)(pParams->targetBitrate / pParams->info.framerate); if (BRC_CBR == pParams->BRCMode) maxBitrate = pParams->maxBitrate = pParams->targetBitrate; if (maxBitrate < (unsigned long long)pParams->targetBitrate) maxBitrate = pParams->maxBitrate = 0; if (bufSizeBits > 0 && bufSizeBits < static_cast(bitsPerFrame << 1)) bufSizeBits = (bitsPerFrame << 1); profile_ind = ConvertProfileToTable(pParams->profile); level_ind = ConvertLevelToTable(pParams->level); if (level_ind > H264_LIMIT_TABLE_LEVEL_51) // just in case svc brc is called with mvc level level_ind = H264_LIMIT_TABLE_LEVEL_51; if (pParams->targetBitrate > (int32_t)LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]) pParams->targetBitrate = (int32_t)LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]; if (static_cast(pParams->maxBitrate) > LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]) maxBitrate = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]; if (bufSizeBits > LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_CPB]) bufSizeBits = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_CPB]; if (pParams->maxBitrate <= 0 && pParams->HRDBufferSizeBytes <= 0) { if (profile_ind < 0) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_51; } else if (level_ind < 0) level_ind = H264_LIMIT_TABLE_LEVEL_51; maxBitrate = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]; bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } else if (pParams->HRDBufferSizeBytes <= 0) { if (profile_ind < 0) bufSizeBits = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_CPB]; else if (level_ind < 0) { for (; profile_ind < H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) if (maxBitrate <= LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]) break; bufSizeBits = LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_CPB]; } else { for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_51; level_ind++) { if (maxBitrate <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_51) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_51; } bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } } else if (pParams->maxBitrate <= 0) { if (profile_ind < 0) maxBitrate = LevelProfileLimits[H264_LIMIT_TABLE_HIGH_PROFILE][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]; else if (level_ind < 0) { for (; profile_ind < H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) if (bufSizeBits <= LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_CPB]) break; maxBitrate = LevelProfileLimits[profile_ind][H264_LIMIT_TABLE_LEVEL_51][H264_LIMIT_TABLE_MAX_BR]; } else { for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_51; level_ind++) { if (bufSizeBits <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_51) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_51; } maxBitrate = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]; } } if (maxBitrate < (unsigned long long)pParams->targetBitrate) { maxBitrate = (unsigned long long)pParams->targetBitrate; for (; profile_ind <= H264_LIMIT_TABLE_HIGH_PROFILE; profile_ind++) { for (; level_ind <= H264_LIMIT_TABLE_LEVEL_51; level_ind++) { if (maxBitrate <= LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_BR]) break; } if (level_ind <= H264_LIMIT_TABLE_LEVEL_51) break; level_ind = 0; } if (profile_ind > H264_LIMIT_TABLE_HIGH_PROFILE) { profile_ind = H264_LIMIT_TABLE_HIGH_PROFILE; level_ind = H264_LIMIT_TABLE_LEVEL_51; } bufSizeBits = LevelProfileLimits[profile_ind][level_ind][H264_LIMIT_TABLE_MAX_CPB]; } pParams->HRDBufferSizeBytes = (int32_t)(bufSizeBits >> 3); pParams->maxBitrate = (int32_t)((maxBitrate >> 6) << 6); // In H.264 HRD params bitrate is coded as value*2^(6+scale), we assume scale=0 mHRD[tid].maxBitrate = pParams->maxBitrate; mHRD[tid].inputBitsPerFrame = mHRD[tid].maxInputBitsPerFrame = mHRD[tid].maxBitrate / pParams->info.framerate; pParams->HRDBufferSizeBytes = (pParams->HRDBufferSizeBytes >> 4) << 4; // coded in bits as value*2^(4+scale), assume scale<=3 if (pParams->HRDInitialDelayBytes <= 0) pParams->HRDInitialDelayBytes = (BRC_CBR == pParams->BRCMode ? pParams->HRDBufferSizeBytes/2 : pParams->HRDBufferSizeBytes); else if (pParams->HRDInitialDelayBytes * 8 < bitsPerFrame) pParams->HRDInitialDelayBytes = bitsPerFrame / 8; if (pParams->HRDInitialDelayBytes > pParams->HRDBufferSizeBytes) pParams->HRDInitialDelayBytes = pParams->HRDBufferSizeBytes; mHRD[tid].bufSize = pParams->HRDBufferSizeBytes * 8; mHRD[tid].bufFullness = pParams->HRDInitialDelayBytes * 8; mHRD[tid].frameNum = 0; mHRD[tid].maxFrameSize = (int32_t)(mHRD[tid].bufFullness - 1); mHRD[tid].minFrameSize = (mParams[tid].BRCMode == BRC_VBR ? 0 : (int32_t)(mHRD[tid].bufFullness + 1 + 1 + mHRD[tid].inputBitsPerFrame - mHRD[tid].bufSize)); mHRD[tid].minBufFullness = 0; mHRD[tid].maxBufFullness = mHRD[tid].bufSize - mHRD[tid].inputBitsPerFrame; return UMC_OK; } #define SVCBRC_BUFSIZE2BPF_RATIO 30 #define SVCBRC_BPF2BUFSIZE_RATIO (1./SVCBRC_BUFSIZE2BPF_RATIO) int32_t SVCBRC::GetInitQP() { const double x0 = 0, y0 = 1.19, x1 = 1.75, y1 = 1.75; int32_t fsLuma; int32_t i; int32_t bpfSum, bpfAv, bpfMin, bpfTarget; int32_t bpfMin_ind; double bs2bpfMin, bf2bpfMin; fsLuma = mParams[0].info.clip_info.width * mParams[0].info.clip_info.height; bpfMin = bpfSum = mBRC[mNumTemporalLayers-1].mBitsDesiredFrame; bpfMin_ind = mNumTemporalLayers-1; bs2bpfMin = bf2bpfMin = (double)MFX_MAX_32S; for (i = mNumTemporalLayers - 1; i >= 0; i--) { if (mHRD[i].bufSize > 0) { double bs2bpf = (double)mHRD[i].bufSize / mBRC[i].mBitsDesiredFrame; if (bs2bpf < bs2bpfMin) { bs2bpfMin = bs2bpf; } } } for (i = mNumTemporalLayers - 2; i >= 0; i--) { bpfSum += mBRC[i].mBitsDesiredFrame; if (mBRC[i].mBitsDesiredFrame < bpfMin) { bpfMin = mBRC[i].mBitsDesiredFrame; bpfMin_ind = i; } mBRC[i].mQuantI = mBRC[i].mQuantP = (int32_t)(1. / 1.2 * pow(10.0, (log10((double)fsLuma / mBRC[i].mBitsDesiredFrame) - x0) * (y1 - y0) / (x1 - x0) + y0) + 0.5); } bpfAv = bpfSum / mNumTemporalLayers; if (bpfMin_ind == mNumTemporalLayers - 1) { bpfTarget = bpfMin; for (i = mNumTemporalLayers - 2; i >= 0; i--) { if (mHRD[i].bufSize > 0) { if (bpfTarget < mHRD[i].minFrameSize) bpfTarget = mHRD[i].minFrameSize; } } } else { double bpfTarget0, bpfTarget1, weight; bpfTarget0 = (3*mBRC[mNumTemporalLayers - 1].mBitsDesiredFrame + bpfAv) >> 2; if (bs2bpfMin > SVCBRC_BUFSIZE2BPF_RATIO) { bpfTarget = (int32_t)bpfTarget0; } else { if (mHRD[mNumTemporalLayers - 1].bufSize > 0) { double bs2bpfN_1 = mHRD[mNumTemporalLayers - 1].bufSize / mBRC[mNumTemporalLayers - 1].mBitsDesiredFrame; weight = bs2bpfMin / bs2bpfN_1; bpfTarget1 = weight * mBRC[mNumTemporalLayers - 1].mBitsDesiredFrame + (1 - weight) * mBRC[bpfMin_ind].mBitsDesiredFrame; } else { bpfTarget1 = mBRC[bpfMin_ind].mBitsDesiredFrame; } weight = bs2bpfMin / SVCBRC_BUFSIZE2BPF_RATIO; bpfTarget = (int32_t)(weight * bpfTarget0 + (1 - weight) * bpfTarget1); } } for (i = mNumTemporalLayers - 1; i >= 0; i--) { if (mHRD[i].bufSize > 0) { if (bpfTarget > mHRD[i].maxFrameSize) bpfTarget = mHRD[i].maxFrameSize; if (bpfTarget < mHRD[i].minFrameSize) bpfTarget = mHRD[i].minFrameSize; } } mRCfa = bpfTarget; int32_t q = (int32_t)(1. / 1.2 * pow(10.0, (log10((double)fsLuma / bpfTarget) - x0) * (y1 - y0) / (x1 - x0) + y0) + 0.5); BRC_CLIP(q, 1, mQuantMax); for (i = mNumTemporalLayers - 1; i >= 0; i--) { mBRC[i].mRCq = mBRC[i].mQuant = mBRC[i].mQuantI = mBRC[i].mQuantP = mBRC[i].mQuantB = mBRC[i].mQuantPrev = q; mBRC[i].mRCqa = mBRC[i].mRCqa0 = 1. / (double)mBRC[i].mRCq; mBRC[i].mRCfa = mBRC[i].mBitsDesiredFrame; //??? bpfTarget ? } return q; } Status SVCBRC::InitLayer(VideoBrcParams *brcParams, int32_t tid) { Status status = UMC_OK; if (!brcParams) return UMC_ERR_NULL_PTR; if (brcParams->targetBitrate <= 0 || brcParams->info.framerate <= 0) return UMC_ERR_INVALID_PARAMS; VideoBrcParams *pmParams = &mParams[tid]; *pmParams = *brcParams; if (pmParams->frameRateExtN && pmParams->frameRateExtD) pmParams->info.framerate = (double)pmParams->frameRateExtN / pmParams->frameRateExtD; mIsInit = true; return status; } Status SVCBRC::Init(BaseCodecParams *params, int32_t numTemporalLayers) { VideoBrcParams *brcParams = DynamicCast(params); Status status = UMC_OK; int32_t i; if (!brcParams) return UMC_ERR_INVALID_PARAMS; if (numTemporalLayers > MAX_TEMP_LEVELS) return UMC_ERR_INVALID_PARAMS; mNumTemporalLayers = numTemporalLayers; for (i = 0; i < numTemporalLayers; i++) { status = InitLayer(brcParams + i, i); if (status != UMC_OK) return status; } for (i = 0; i < numTemporalLayers; i++) { if (mParams[i].HRDBufferSizeBytes != 0) { status = InitHRDLayer(i); if (status != UMC_OK) return status; // mHRD[i].mBF = (long long)mParams[i].HRDInitialDelayBytes * mParams[i].frameRateExtN; // mHRD[i].mBFsaved = mHRD[i].mBF; } else { mHRD[i].bufSize = 0; } mBRC[i].mBitsDesiredTotal = mBRC[i].mBitsEncodedTotal = 0; mBRC[i].mQuantUpdated = 1; mBRC[i].mBitsDesiredFrame = (int32_t)((double)mParams[i].targetBitrate / mParams[i].info.framerate); /* level_ind = ConvertLevelToTable(mParams[i].level); if (level_ind < 0) return UMC_ERR_INVALID_PARAMS; if (level_ind >= H264_LIMIT_TABLE_LEVEL_31 && level_ind <= H264_LIMIT_TABLE_LEVEL_4) bitsPerMB = 96.; // 384 / minCR; minCR = 4 else bitsPerMB = 192.; // minCR = 2 maxMBPS = (int32_t)LevelProfileLimits[0][level_ind][H264_LIMIT_TABLE_MAX_MBPS]; numMBPerFrame = ((mParams[i].info.clip_info.width + 15) >> 4) * ((mParams.info.clip_info.height + 15) >> 4); // numMBPerFrame should include ref layers as well - see G10.2.1 !!! ??? tmpf = (double)numMBPerFrame; if (tmpf < maxMBPS / 172.) tmpf = maxMBPS / 172.; mMaxBitsPerPic = (unsigned long long)(tmpf * bitsPerMB) * 8; mMaxBitsPerPicNot0 = (unsigned long long)((double)maxMBPS / mFramerate * bitsPerMB) * 8; */ } mQuantUpdated = 1; mQuantMax = 51; mQuantUnderflow = -1; mQuantOverflow = mQuantMax + 1; int32_t q = GetInitQP(); mRCqap = 100; mRCfap = 100; mRCbap = 100; mQuant = mRCq = q; mRCqa = mRCqa0 = 1. / (double)mRCq; for (i = 0; i < mNumTemporalLayers; i++) { mBRC[i].mRCqap = mRCqap; mBRC[i].mRCfap = mRCfap; mBRC[i].mRCbap = mRCbap; } mPictureFlags = mPictureFlagsPrev = BRC_FRAME; mIsInit = true; mRecodeInternal = 0; return status; } Status SVCBRC::Reset(BaseCodecParams *params, int32_t numTemporalLayers) { VideoBrcParams *brcParams = DynamicCast(params); // VideoBrcParams tmpParams; if (NULL == brcParams) return UMC_ERR_NULL_PTR; else // tmp !!! return Init(params, numTemporalLayers); } Status SVCBRC::Close() { Status status = UMC_OK; if (!mIsInit) return UMC_ERR_NOT_INITIALIZED; mIsInit = false; return status; } Status SVCBRC::SetParams(BaseCodecParams* params, int32_t tid) { return Init(params, tid); } Status SVCBRC::GetParams(BaseCodecParams* params, int32_t tid) { VideoBrcParams *brcParams = DynamicCast(params); VideoEncoderParams *videoParams = DynamicCast(params); // ??? if (tid < 0 || tid >= mNumTemporalLayers) { for (tid = 0; tid < mNumTemporalLayers; tid++) { if (NULL != brcParams) { brcParams[tid] = mParams[tid]; } else if (NULL != videoParams) { params[tid] = *(VideoEncoderParams*)&(mParams[tid]); } else { params[tid] = *(BaseCodecParams*)&(mParams[tid]); } } return UMC_OK; } if (NULL != brcParams) { *brcParams = mParams[tid]; } else if (NULL != videoParams) { *params = *(VideoEncoderParams*)&(mParams[tid]); } else { *params = *(BaseCodecParams*)&(mParams[tid]); } return UMC_OK; }; /* Status SVCBRC::SetParams(BaseCodecParams* params) { return Init(params); } */ Status SVCBRC::SetPictureFlags(FrameType, int32_t picture_structure, int32_t, int32_t, int32_t) { switch (picture_structure & PS_FRAME) { case (PS_TOP_FIELD): mPictureFlags = BRC_TOP_FIELD; break; case (PS_BOTTOM_FIELD): mPictureFlags = BRC_BOTTOM_FIELD; break; case (PS_FRAME): default: mPictureFlags = BRC_FRAME; } return UMC_OK; } int32_t SVCBRC::GetQP(FrameType frameType, int32_t tid) { if (tid < 0) { return mQuant; } else if (tid < mNumTemporalLayers) return ((frameType == I_PICTURE) ? mBRC[tid].mQuantI : (frameType == B_PICTURE) ? mBRC[tid].mQuantB : mBRC[tid].mQuantP); else return -1; } Status SVCBRC::SetQP(int32_t qp, FrameType frameType, int32_t tid) { if (tid < 0) mQuant = qp; else if (tid < mNumTemporalLayers) { mBRC[tid].mQuant = qp; if (B_PICTURE == frameType) { mBRC[tid].mQuantB = qp; BRC_CLIP(mBRC[tid].mQuantB, 1, mQuantMax); } else { mBRC[tid].mRCq = qp; BRC_CLIP(mBRC[tid].mRCq, 1, mQuantMax); mBRC[tid].mQuantI = mBRC[tid].mQuantP = mRCq; } } else return UMC_ERR_INVALID_PARAMS; return UMC_OK; } #define BRC_SCENE_CHANGE_RATIO1 10.0 #define BRC_SCENE_CHANGE_RATIO2 5.0 #define BRC_QP_DELTA_WMAX 5 #define BRC_QP_DELTA_WMIN 5 BRCStatus SVCBRC::PreEncFrame(FrameType picType, int32_t, int32_t tid) { int32_t maxfs, minfs, maxfsi, minfsi; int32_t maxfsind, minfsind; int32_t i; int32_t qp, qpmax, qpmin, qpav, qpi, qpminind, qpmaxind, qptop; double fqpav; BRCStatus Sts = BRC_OK; int32_t cnt; mTid = tid; if (mHRD[tid].bufSize > 0) { maxfs = (int32_t)(mHRD[tid].bufFullness - mHRD[tid].minBufFullness); minfs = (int32_t)(mHRD[tid].inputBitsPerFrame - mHRD[tid].maxBufFullness + mHRD[tid].bufFullness); maxfsind = minfsind = tid; qpmaxind = qpminind = tid; qpav = qpmax = qpmin = (picType == I_PICTURE) ? mBRC[tid].mQuantI : (picType == B_PICTURE) ? mBRC[tid].mQuantB : mBRC[tid].mQuantP; cnt = 1; } else { maxfs = MFX_MAX_32S; minfs = 0; maxfsind = minfsind = mNumTemporalLayers-1; cnt = 0; qpav = (picType == I_PICTURE) ? mBRC[mNumTemporalLayers-1].mQuantI : (picType == B_PICTURE) ? mBRC[mNumTemporalLayers-1].mQuantB : mBRC[mNumTemporalLayers-1].mQuantP; qpmax = 101; qpmin = -1; qpmaxind = qpminind = tid; } for (i = tid + 1; i < mNumTemporalLayers; i++) { if (mHRD[i].bufSize > 0) { maxfsi = (int32_t)(mHRD[i].bufFullness - mHRD[i].minBufFullness); minfsi = (int32_t)(mHRD[i].inputBitsPerFrame - mHRD[i].maxBufFullness + mHRD[i].bufFullness); qpi = (picType == I_PICTURE) ? mBRC[i].mQuantI : (picType == B_PICTURE) ? mBRC[i].mQuantB : mBRC[i].mQuantP; if (maxfsi <= maxfs) { maxfs = maxfsi; maxfsind = i; } if (minfsi >= minfs) { minfs = minfsi; minfsind = i; } if (qpi >= qpmax) { qpmax = qpi; qpmaxind = i; } if (qpi <= qpmin) { qpmin = qpi; qpminind = i; } qpav += qpi; cnt++; } } if (cnt == 0) { mQuant = (picType == I_PICTURE) ? mBRC[mNumTemporalLayers-1].mQuantI : (picType == B_PICTURE) ? mBRC[mNumTemporalLayers-1].mQuantB : mBRC[mNumTemporalLayers-1].mQuantP; mMaxFrameSize = MFX_MAX_32S; mMinFrameSize = 0; return Sts; } fqpav = (double)qpav / cnt; qptop = picType == I_PICTURE ? mBRC[mNumTemporalLayers-1].mQuantI : (picType == B_PICTURE ? mBRC[mNumTemporalLayers-1].mQuantB : mBRC[mNumTemporalLayers-1].mQuantP); qp = (qptop * 3 + (int32_t)fqpav + 3) >> 2; // ??? for (i = mNumTemporalLayers - 2; i >= tid; i--) { if (mHRD[i].bufSize > 0) { maxfsi = (int32_t)(mHRD[i].bufFullness - mHRD[i].minBufFullness); minfsi = (int32_t)(mHRD[i].inputBitsPerFrame - mHRD[i].maxBufFullness + mHRD[i].bufFullness); qpi = (picType == I_PICTURE) ? mBRC[i].mQuantI : (picType == B_PICTURE) ? mBRC[i].mQuantB : mBRC[i].mQuantP; if (qpi > qp) { if (maxfsi < mHRD[i].inputBitsPerFrame) qp = qpi; else if (maxfsi < 2*mHRD[i].inputBitsPerFrame) qp = (qp + qpi + 1) >> 1; } if (qpi < qp) { if (minfsi > (double)(mHRD[i].inputBitsPerFrame * 0.5)) qp = qpi; else if (minfsi > (double)(mHRD[i].inputBitsPerFrame * 0.25)) qp = (qp + qpi) >> 1; } } } int32_t qpt = (picType == I_PICTURE) ? mBRC[maxfsind].mQuantI : (picType == B_PICTURE) ? mBRC[maxfsind].mQuantB : mBRC[maxfsind].mQuantP; if (qp < qpt) { if (maxfs < 4*mHRD[maxfsind].inputBitsPerFrame) qp = (qp + qpt + 1) >> 1; } qpt = (picType == I_PICTURE) ? mBRC[minfsind].mQuantI : (picType == B_PICTURE) ? mBRC[minfsind].mQuantB : mBRC[minfsind].mQuantP; if (qp > qpt) { if (minfs > 0) // ??? qp = (qp + qpt) >> 1; } if (qp < qpmax - BRC_QP_DELTA_WMAX) { if ((int32_t)(mHRD[qpmaxind].bufFullness - mHRD[qpmaxind].minBufFullness) < 4*mHRD[qpmaxind].inputBitsPerFrame) qp = (qp + qpmax + 1) >> 1; } if (qp > qpmin + BRC_QP_DELTA_WMIN) { if ((mHRD[qpminind].maxBufFullness - (int32_t)mHRD[qpminind].bufFullness) < 2*mHRD[qpminind].inputBitsPerFrame) qp = (qp + qpmin + 1) >> 1; } mQuant = qp; mMaxFrameSize = maxfs; mMinFrameSize = minfs; return Sts; } BRCStatus SVCBRC::UpdateAndCheckHRD(int32_t tid, int32_t frameBits, int32_t payloadbits, int32_t recode) { BRCStatus ret = BRC_OK; BRCSVC_HRDState *pHRD = &mHRD[tid]; if (!(recode & (BRC_EXT_FRAMESKIP - 1))) { // BRC_EXT_FRAMESKIP == 16 pHRD->prevBufFullness = pHRD->bufFullness; } else { // frame is being recoded - restore buffer state pHRD->bufFullness = pHRD->prevBufFullness; } pHRD->maxFrameSize = (int32_t)(pHRD->bufFullness - 1); pHRD->minFrameSize = (mParams[tid].BRCMode == BRC_VBR ? 0 : (int32_t)(pHRD->bufFullness + 2 + pHRD->inputBitsPerFrame - pHRD->bufSize)); if (pHRD->minFrameSize < 0) pHRD->minFrameSize = 0; if (frameBits > pHRD->maxFrameSize) { ret = BRC_ERR_BIG_FRAME; } else if (frameBits < pHRD->minFrameSize) { ret = BRC_ERR_SMALL_FRAME; } else { pHRD->bufFullness += pHRD->inputBitsPerFrame - frameBits; } if (BRC_OK != ret) { if ((recode & BRC_EXT_FRAMESKIP) || BRC_RECODE_EXT_PANIC == recode || BRC_RECODE_PANIC == recode) // no use in changing QP ret |= BRC_NOT_ENOUGH_BUFFER; else { ret = UpdateQuantHRD(tid, frameBits, ret, payloadbits); } mBRC[tid].mQuantUpdated = 0; } return ret; } Status SVCBRC::GetMinMaxFrameSize(int32_t *minFrameSizeInBits, int32_t *maxFrameSizeInBits) { int32_t i, minfs = 0, maxfs = MFX_MAX_32S; for (i = mTid; i < mNumTemporalLayers; i++) { if (mHRD[i].bufSize > 0) { if (mHRD[i].minFrameSize > minfs) minfs = mHRD[i].minFrameSize; if (mHRD[i].maxFrameSize < maxfs) maxfs = mHRD[i].maxFrameSize; } } if (minFrameSizeInBits) *minFrameSizeInBits = minfs; if (maxFrameSizeInBits) *maxFrameSizeInBits = maxfs; return UMC_OK; }; BRCStatus SVCBRC::PostPackFrame(FrameType picType, int32_t totalFrameBits, int32_t payloadBits, int32_t repack, int32_t /* poc */) { BRCStatus Sts = BRC_OK; int32_t bitsEncoded = totalFrameBits - payloadBits; mBitsEncoded = bitsEncoded; mOversize = bitsEncoded - mMaxFrameSize; mUndersize = mMinFrameSize - bitsEncoded; if (mOversize > 0) Sts |= BRC_BIG_FRAME; if (mUndersize > 0) Sts |= BRC_SMALL_FRAME; if (Sts & BRC_BIG_FRAME) { if (mQuant < mQuantUnderflow - 1) { mQuant++; mQuantUpdated = 0; return BRC_ERR_BIG_FRAME; // ??? } } else if (Sts & BRC_SMALL_FRAME) { if (mQuant > mQuantOverflow + 1) { mQuant--; mQuantUpdated = 0; return BRC_ERR_SMALL_FRAME; } } Sts = BRC_OK; int32_t quant = mQuant; int32_t i; int32_t tid = mTid; for (i = tid; i < mNumTemporalLayers; i++) { if (mHRD[i].bufSize > 0) { BRCStatus sts = UpdateAndCheckHRD(i, totalFrameBits, payloadBits, repack); Sts |= sts; if ((sts & BRC_ERR_BIG_FRAME) && (mBRC[i].mQuant > quant)) quant = mBRC[i].mQuant; else if ((sts & BRC_ERR_SMALL_FRAME) && (mBRC[i].mQuant < quant)) quant = mBRC[i].mQuant; } } if (Sts != BRC_OK) { if (((Sts & BRC_ERR_BIG_FRAME) && (Sts & BRC_ERR_SMALL_FRAME)) || (Sts & BRC_NOT_ENOUGH_BUFFER)) { return BRC_NOT_ENOUGH_BUFFER; } if (Sts & BRC_ERR_BIG_FRAME) mQuantUnderflow = mQuant; if (Sts & BRC_ERR_SMALL_FRAME) mQuantOverflow = mQuant; if (quant != mQuant) mQuant = quant; else mQuant = quant + ((Sts & BRC_ERR_BIG_FRAME) ? 1 : -1); mQuantUpdated = 0; return Sts; } int32_t j; if (mHRD[tid].bufSize > 0) { mHRD[tid].minBufFullness = 0; mHRD[tid].maxBufFullness = mHRD[tid].bufSize - mHRD[tid].inputBitsPerFrame; } for (i = tid; i < mNumTemporalLayers; i++) { if (mHRD[i].bufSize > 0) { mHRD[i].minFrameSize = (mParams[i].BRCMode == BRC_VBR ? 0 : (int32_t)(mHRD[i].bufFullness + 1 + 1 + mHRD[i].inputBitsPerFrame - mHRD[i].bufSize)); for (j = i + 1; j < mNumTemporalLayers; j++) { if (mHRD[j].bufSize > 0) { double minbf, maxbf; minbf = mHRD[i].minFrameSize - mHRD[j].inputBitsPerFrame; maxbf = mHRD[j].bufSize - mHRD[j].inputBitsPerFrame + mHRD[i].bufFullness - mHRD[j].inputBitsPerFrame; if (minbf > mHRD[j].minBufFullness) mHRD[j].minBufFullness = minbf; if (maxbf < mHRD[j].maxBufFullness) mHRD[j].maxBufFullness = maxbf; } } } } for (i = tid; i < mNumTemporalLayers; i++) { if (mHRD[i].bufSize > 0) { if (mHRD[i].bufFullness - mHRD[i].inputBitsPerFrame < mHRD[i].minBufFullness) Sts |= BRC_BIG_FRAME; if (mHRD[i].bufFullness - mHRD[i].inputBitsPerFrame > mHRD[i].maxBufFullness) Sts |= BRC_SMALL_FRAME; } } if ((Sts & BRC_BIG_FRAME) && (Sts & BRC_SMALL_FRAME)) Sts = BRC_OK; // don't do anything, everything is already bad if (Sts & BRC_BIG_FRAME) { if (mQuant < mQuantUnderflow - 1) { mQuant++; mQuantUpdated = 0; return BRC_ERR_BIG_FRAME; // ??? } } else if (Sts & BRC_SMALL_FRAME) { if (mQuant > mQuantOverflow + 1) { mQuant--; mQuantUpdated = 0; return BRC_ERR_SMALL_FRAME; } } Sts = BRC_OK; mQuantOverflow = mQuantMax + 1; mQuantUnderflow = -1; mFrameType = picType; { if (repack != BRC_RECODE_PANIC && repack != BRC_RECODE_EXT_PANIC) { for (i = mNumTemporalLayers - 1; i >= tid; i--) { UpdateQuant(i, bitsEncoded, totalFrameBits); } mQuantP = mQuantI = mRCq = mQuant; // ??? } mQuantUpdated = 1; } return Sts; }; BRCStatus SVCBRC::UpdateQuant(int32_t tid, int32_t bEncoded, int32_t totalPicBits) { BRCStatus Sts = BRC_OK; double bo, qs, dq; int32_t quant; int32_t isfield = ((mPictureFlags & BRC_FRAME) != BRC_FRAME) ? 1 : 0; long long totalBitsDeviation; BRC_SVCLayer_State *pBRC = &mBRC[tid]; uint32_t bitsPerPic = (uint32_t)pBRC->mBitsDesiredFrame >> isfield; if (isfield) pBRC->mRCfa *= 0.5; quant = mQuant; if (mQuantUpdated) pBRC->mRCqa += (1. / quant - pBRC->mRCqa) / mRCqap; else { if (pBRC->mQuantUpdated) pBRC->mRCqa += (1. / quant - pBRC->mRCqa) / (mRCqap > 25 ? 25 : mRCqap); else pBRC->mRCqa += (1. / quant - pBRC->mRCqa) / (mRCqap > 10 ? 10 : mRCqap); } if (mRecodeInternal) { pBRC->mRCfa = bitsPerPic; pBRC->mRCqa = mRCqa0; } mRecodeInternal = 0; pBRC->mBitsEncodedTotal += totalPicBits; pBRC->mBitsDesiredTotal += bitsPerPic; totalBitsDeviation = pBRC->mBitsEncodedTotal - pBRC->mBitsDesiredTotal; if (mFrameType != I_PICTURE || mParams[tid].BRCMode == BRC_CBR || mQuantUpdated == 0) pBRC->mRCfa += (bEncoded - pBRC->mRCfa) / pBRC->mRCfap; pBRC->mQuantB = ((pBRC->mQuantP + pBRC->mQuantPrev) * 563 >> 10) + 1; \ BRC_CLIP(pBRC->mQuantB, 1, mQuantMax); if (pBRC->mQuantUpdated == 0) if (pBRC->mQuantB < quant) pBRC->mQuantB = quant; qs = pow(bitsPerPic / pBRC->mRCfa, 2.0); dq = pBRC->mRCqa * qs; bo = (double)totalBitsDeviation / pBRC->mRCbap / pBRC->mBitsDesiredFrame; // ??? bitsPerPic ? BRC_CLIP(bo, -1.0, 1.0); dq = dq + (1./mQuantMax - dq) * bo; BRC_CLIP(dq, 1./mQuantMax, 1./1.); quant = (int) (1. / dq + 0.5); if (quant >= pBRC->mRCq + 5) quant = pBRC->mRCq + 3; else if (quant >= pBRC->mRCq + 3) quant = pBRC->mRCq + 2; else if (quant > pBRC->mRCq + 1) quant = pBRC->mRCq + 1; else if (quant <= pBRC->mRCq - 5) quant = pBRC->mRCq - 3; else if (quant <= pBRC->mRCq - 3) quant = pBRC->mRCq - 2; else if (quant < pBRC->mRCq - 1) quant = pBRC->mRCq - 1; pBRC->mRCq = quant; if (isfield) pBRC->mRCfa *= 2; if (mFrameType != B_PICTURE) { pBRC->mQuantPrev = pBRC->mQuantP; pBRC->mBitsEncodedP = mBitsEncoded; } pBRC->mQuant = pBRC->mQuantP = pBRC->mQuantI = pBRC->mRCq; pBRC->mQuantUpdated = 1; return Sts; } BRCStatus SVCBRC::UpdateQuantHRD(int32_t tid, int32_t totalFrameBits, BRCStatus sts, int32_t payloadBits) { int32_t quant, quant_prev; double qs; BRCSVC_HRDState *pHRD = &mHRD[tid]; int32_t wantedBits = (sts == BRC_ERR_BIG_FRAME ? pHRD->maxFrameSize : pHRD->minFrameSize); int32_t bEncoded = totalFrameBits - payloadBits; wantedBits -= payloadBits; if (wantedBits <= 0) // possible only if BRC_ERR_BIG_FRAME return (sts | BRC_NOT_ENOUGH_BUFFER); quant_prev = quant = mQuant; if (sts & BRC_ERR_BIG_FRAME) mQuantUnderflow = quant; else if (sts & BRC_ERR_SMALL_FRAME) mQuantOverflow = quant; qs = pow((double)bEncoded/wantedBits, 1.5); quant = (int32_t)(quant * qs + 0.5); if (quant == quant_prev) quant += (sts == BRC_ERR_BIG_FRAME ? 1 : -1); BRC_CLIP(quant, 1, mQuantMax); if (quant < quant_prev) { while (quant <= mQuantUnderflow) quant++; } else { while (quant >= mQuantOverflow) quant--; } if (quant == quant_prev) return (sts | BRC_NOT_ENOUGH_BUFFER); mBRC[tid].mQuant = quant; switch (mFrameType) { case (I_PICTURE): mBRC[tid].mQuantI = quant; break; case (B_PICTURE): mBRC[tid].mQuantB = quant; break; case (P_PICTURE): default: mBRC[tid].mQuantP = quant; } return sts; } Status SVCBRC::GetHRDBufferFullness(double *hrdBufFullness, int32_t recode, int32_t tid) { *hrdBufFullness = (recode & (BRC_EXT_FRAMESKIP - 1)) ? mHRD[tid].prevBufFullness : mHRD[tid].bufFullness; return UMC_OK; } /* Status SVCBRC::GetInitialCPBRemovalDelay(int32_t tid, uint32_t *initial_cpb_removal_delay, int32_t recode) { uint32_t cpb_rem_del_u32; unsigned long long cpb_rem_del_u64, temp1_u64, temp2_u64; if (BRC_VBR == mRCMode) { if (recode) mBF = mBFsaved; else mBFsaved = mBF; } temp1_u64 = (unsigned long long)mBF * 90000; temp2_u64 = (unsigned long long)mMaxBitrate * mParams.frameRateExtN; cpb_rem_del_u64 = temp1_u64 / temp2_u64; cpb_rem_del_u32 = (uint32_t)cpb_rem_del_u64; if (BRC_VBR == mRCMode) { mBF = temp2_u64 * cpb_rem_del_u32 / 90000; temp1_u64 = (unsigned long long)cpb_rem_del_u32 * mMaxBitrate; uint32_t dec_buf_ful = (uint32_t)(temp1_u64 / (90000/8)); if (recode) mHRD.prevBufFullness = (double)dec_buf_ful; else mHRD.bufFullness = (double)dec_buf_ful; } *initial_cpb_removal_delay = cpb_rem_del_u32; return UMC_OK; } */ } #endif //defined(MFX_ENABLE_H264_VIDEO_ENCODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/brc/src/umc_video_brc.cpp000066400000000000000000000131501443134507600307050ustar00rootroot00000000000000// Copyright (c) 2010-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_video_brc.h" namespace UMC { VideoBrcParams::VideoBrcParams() { BRCMode = BRC_CBR; targetBitrate = 500000; // Kbps = 1000 bps maxBitrate = targetBitrate; HRDBufferSizeBytes = targetBitrate * 2 / 30; // ~target frame size (at 30 fps) * 16; KB = 1024 B HRDInitialDelayBytes = HRDBufferSizeBytes / 2; GOPPicSize = 20; GOPRefDist = 1; accuracy = 10; convergence = 500; frameRateExtN_1 = 0; // svc specific frameRateExtD = 0; frameRateExtN = 0; } VideoBrc::VideoBrc() { } VideoBrc::~VideoBrc() { } Status VideoBrc::CheckCorrectParams_MPEG2(VideoBrcParams *inBrcParams, VideoBrcParams *outBrcParams) { double bitsPerFrame; Status status = UMC_OK; int32_t brcMode, maxBitrate, targetBitrate, bufferSizeBytes; uint32_t maxBufSizeBits, bufSizeBits; double framerate; int32_t initialDelayBytes; double bufFullness; double gopFactor; if (inBrcParams == 0) return UMC_ERR_NULL_PTR; brcMode = inBrcParams->BRCMode; maxBitrate = inBrcParams->maxBitrate; targetBitrate = inBrcParams->targetBitrate; bufferSizeBytes = inBrcParams->HRDBufferSizeBytes; framerate = inBrcParams->info.framerate; bufFullness = inBrcParams->HRDInitialDelayBytes * 8; gopFactor = inBrcParams->GOPPicSize >= 100 ? 1 : 10 / sqrt((double)inBrcParams->GOPPicSize); if (framerate <= 0) return UMC_ERR_FAILED; if (outBrcParams) *outBrcParams = *inBrcParams; if (static_cast(bufferSizeBytes) > MFX_MAX_32U >> 3) bufferSizeBytes = MFX_MAX_32U >> 3; bufSizeBits = bufferSizeBytes << 3; bitsPerFrame = targetBitrate / framerate; maxBufSizeBits = (uint32_t)(0xfffe * (unsigned long long)targetBitrate / 90000); // for CBR if (bitsPerFrame < inBrcParams->info.clip_info.width * inBrcParams->info.clip_info.height * 8 * gopFactor / (double)500) { status = UMC_ERR_INVALID_PARAMS; bitsPerFrame = inBrcParams->info.clip_info.width * inBrcParams->info.clip_info.height * 8 * gopFactor / (double)500; targetBitrate = (int32_t)(bitsPerFrame * framerate); } if (brcMode != BRC_CBR && brcMode != BRC_VBR) { status = UMC_ERR_INVALID_PARAMS; brcMode = BRC_VBR; } if (brcMode == BRC_VBR) { if (maxBitrate <= targetBitrate) { status = UMC_ERR_INVALID_PARAMS; maxBitrate = targetBitrate; } if (bufSizeBits > (uint32_t)16384 * 0x3fffe) bufSizeBits = (uint32_t)16384 * 0x3fffe; } else { if (bufSizeBits > maxBufSizeBits) { status = UMC_ERR_INVALID_PARAMS; if (maxBufSizeBits > (uint32_t)16384 * 0x3fffe) maxBufSizeBits = (uint32_t)16384 * 0x3fffe; if (maxBufSizeBits < (uint32_t)(bitsPerFrame + 0.5)) { // framerate is too low for CBR brcMode = BRC_VBR; maxBitrate = targetBitrate; } if (bufFullness > maxBufSizeBits/2) { // leave mHRD.bufFullness unchanged if below mHRD.bufSize/2 double newBufFullness = bufFullness * maxBufSizeBits / bufSizeBits; if (newBufFullness < (double)maxBufSizeBits / 2) newBufFullness = (double)maxBufSizeBits / 2; bufFullness = newBufFullness; } bufSizeBits = maxBufSizeBits; // will be coded as (mHRD.bufSize + 16383) &~ 0x3fff } else { if (bufSizeBits > (uint32_t)16384 * 0x3fffe) { status = UMC_ERR_INVALID_PARAMS; bufSizeBits = (uint32_t)16384 * 0x3fffe; } if (bufFullness > (double)bufSizeBits) { status = UMC_ERR_INVALID_PARAMS; bufFullness = bufSizeBits; } } } if (bufSizeBits < 2 * bitsPerFrame) { status = UMC_ERR_INVALID_PARAMS; bufSizeBits = (uint32_t)(2 * bitsPerFrame); } if (brcMode == BRC_VBR) bufFullness = bufSizeBits; // vbv_delay = 0xffff (buffer is initially full) in case of VBR if (bufFullness <= 0) { // not set status = UMC_ERR_INVALID_PARAMS; bufFullness = bufSizeBits / 2; } else if (bufFullness < bitsPerFrame) { // set but is too small status = UMC_ERR_INVALID_PARAMS; bufFullness = bitsPerFrame; } bufferSizeBytes = bufSizeBits >> 3; initialDelayBytes = (uint32_t)bufFullness >> 3; if (outBrcParams) { outBrcParams->BRCMode = brcMode; outBrcParams->targetBitrate = targetBitrate; if (brcMode == BRC_VBR) outBrcParams->maxBitrate = maxBitrate; outBrcParams->HRDBufferSizeBytes = bufferSizeBytes; outBrcParams->HRDInitialDelayBytes = initialDelayBytes; } return status; } Status VideoBrc::SetPictureFlags(FrameType, int32_t, int32_t, int32_t, int32_t) { return UMC_OK; } Status VideoBrc::GetInitialCPBRemovalDelay(uint32_t *, int32_t) { return UMC_OK; } } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/000077500000000000000000000000001443134507600304245ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include/000077500000000000000000000000001443134507600320475ustar00rootroot00000000000000umc_color_space_conversion.h000066400000000000000000000037411443134507600375500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_COLOR_SPACE_CONVERSION_H__ #define __UMC_COLOR_SPACE_CONVERSION_H__ #include "umc_base_codec.h" namespace UMC { class ColorSpaceConversion : public BaseCodec { DYNAMIC_CAST_DECL(ColorSpaceConversion, BaseCodec) public: // Initialize codec with specified parameter(s) virtual Status Init(BaseCodecParams *) override { return UMC_OK; }; // Convert next frame virtual Status GetFrame(MediaData *in, MediaData *out) override; // Get codec working (initialization) parameter(s) virtual Status GetInfo(BaseCodecParams *) override { return UMC_OK; }; // Close all codec resources virtual Status Close(void) override { return UMC_OK; }; // Set codec to initial state virtual Status Reset(void) override { return UMC_OK; }; private: Status GetFrameInternal(MediaData *in, MediaData *out); }; } // namespace UMC #endif /* __UMC_COLOR_SPACE_CONVERSION_H__ */ umc_data_pointers_copy.h000066400000000000000000000042731443134507600367010ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_DATA_POINTERS_COPY_H__ #define __UMC_DATA_POINTERS_COPY_H__ #include "vm_types.h" #include "ippdefs.h" #include "umc_video_data.h" #include "umc_base_codec.h" namespace UMC { // This class is designed as special kind of VideoProcessing which just // copies pointers and therefore gives access to internal buffers of decoders. class DataPointersCopy : public BaseCodec { DYNAMIC_CAST_DECL(DataPointersCopy, BaseCodec) public: virtual Status Init(BaseCodecParams* /*init*/) { return UMC_OK; } virtual Status GetFrame(MediaData *input, MediaData *output) { VideoData *video_input = DynamicCast(input); VideoData *video_output = DynamicCast(output); if (video_input && video_output) { *video_output = *video_input; } else { *output = *input; } return UMC_OK; } virtual Status GetInfo(BaseCodecParams* /*info*/) { return UMC_OK; } virtual Status Close(void) { return UMC_OK; } virtual Status Reset(void) { return UMC_OK; } }; } // namespace UMC #endif /* __UMC_DATA_POINTERS_COPY_H__ */ umc_deinterlacing.h000066400000000000000000000040741443134507600356220ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_DEINTERLACING_H__ #define __UMC_DEINTERLACING_H__ #include "ippdefs.h" #include "umc_base_codec.h" #include "umc_video_processing.h" namespace UMC { class Deinterlacing : public BaseCodec { DYNAMIC_CAST_DECL(Deinterlacing, BaseCodec) public: Deinterlacing(); // Set deinterlacing method virtual Status SetMethod(DeinterlacingMethod method); // Initialize codec with specified parameter(s) virtual Status Init(BaseCodecParams *) override { return UMC_OK; }; // Convert frame virtual Status GetFrame(MediaData *in, MediaData *out) override; // Get codec working (initialization) parameter(s) virtual Status GetInfo(BaseCodecParams *) override { return UMC_OK; }; // Close all codec resources virtual Status Close(void) override { return UMC_OK; }; // Set codec to initial state virtual Status Reset(void) override { return UMC_OK; }; protected: DeinterlacingMethod mMethod; }; } // namespace UMC #endif /* __UMC_DEINTERLACING_H__ */ umc_video_processing.h000066400000000000000000000070721443134507600363550ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VIDEO_PROCESSING_H__ #define __UMC_VIDEO_PROCESSING_H__ #include "umc_video_data.h" #include "umc_base_codec.h" namespace UMC { BaseCodec *createVideoProcessing(); enum DeinterlacingMethod { NO_DEINTERLACING = 0, DEINTERLACING_BLEND = 1, DEINTERLACING_DUPLICATE = 2, DEINTERLACING_SPATIAL = 3, DEINTERLACING_ADAPTIVE = 4, DEINTERLACING_SMOOTH = 5 }; ////////////////////////////////////////////////////////////////////// class VideoProcessingParams : public BaseCodecParams { DYNAMIC_CAST_DECL(VideoProcessingParams, BaseCodecParams) public: uint32_t InterpolationMethod; // interpolation method to perform image resampling (see ippi.h) DeinterlacingMethod m_DeinterlacingMethod; // deinterlacing method UMC::sRECT SrcCropArea; // source crop region (zero region means full frame) VideoProcessingParams() { InterpolationMethod = 0; m_DeinterlacingMethod = NO_DEINTERLACING; //DEINTERLACING_BLEND;//DEINTERLACING_DUPLICATE; /* KW fix*/ //memset(&SrcCropArea, 0, sizeof(SrcCropArea)); SrcCropArea.bottom = 0; SrcCropArea.left = 0; SrcCropArea.right = 0; SrcCropArea.top = 0; } }; ////////////////////////////////////////////////////////////////////// // auxiliary class class VideoDataExt : public VideoData { DYNAMIC_CAST_DECL(VideoDataExt, VideoData) public: Status Crop(UMC::sRECT SrcCropArea) override; Status Convert_YV12_To_YUV420(); }; ////////////////////////////////////////////////////////////////////// #define MAX_NUM_FILTERS 8 class VideoProcessing : public BaseCodec { DYNAMIC_CAST_DECL(VideoProcessing, BaseCodec) public: VideoProcessing(); virtual ~VideoProcessing(); virtual Status Init(BaseCodecParams *init) override; virtual Status AddFilter(BaseCodec *filter, int atEnd); virtual Status GetFrame(MediaData *input, MediaData *output) override; virtual Status GetInfo(BaseCodecParams *info) override; virtual Status Close(void) override; virtual Status Reset(void) override; virtual Status SetParams(BaseCodecParams *params); protected: VideoProcessingParams Param; int numFilters; int iD3DProcessing; int iDeinterlacing; int iColorConv; int iColorConv0; int iResizing; bool bSrcCropArea; BaseCodec *pFilter[MAX_NUM_FILTERS]; uint8_t bFiltering[MAX_NUM_FILTERS]; VideoData tmpData[MAX_NUM_FILTERS]; VideoDataExt tmp_in[1]; VideoDataExt tmp_out[1]; }; } // namespace UMC #endif /* __UMC_VIDEO_PROCESSING_H__ */ umc_video_resizing.h000066400000000000000000000041111443134507600360220ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (UMC_ENABLE_VPP_RESIZE) #ifndef __UMC_VIDEO_RESIZING_H__ #define __UMC_VIDEO_RESIZING_H__ #include "ippdefs.h" #include "umc_base_codec.h" namespace UMC { class VideoResizing : public BaseCodec { DYNAMIC_CAST_DECL(VideoResizing, BaseCodec) public: VideoResizing(); // Set interpolation method virtual Status SetMethod(int lInterpolation); // Initialize codec with specified parameter(s) virtual Status Init(BaseCodecParams *) { return UMC_OK; }; // Convert frame virtual Status GetFrame(MediaData *in, MediaData *out); // Get codec working (initialization) parameter(s) virtual Status GetInfo(BaseCodecParams *) { return UMC_OK; }; // Close all codec resources virtual Status Close(void) { return UMC_OK; }; // Set codec to initial state virtual Status Reset(void) { return UMC_OK; }; protected: int mInterpolation; }; } // namespace UMC #endif /* __UMC_VIDEO_RESIZING_H__ */ #endif // #if defined (UMC_ENABLE_VPP_RESIZE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/src/000077500000000000000000000000001443134507600312135ustar00rootroot00000000000000umc_color_space_conversion.cpp000066400000000000000000000657671443134507600372670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/src// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_color_space_conversion.h" #include "umc_video_data.h" #if !defined(MSDK_USE_EXTERNAL_IPP) #include "ippi.h" #include "ippcc.h" #include "ippvc.h" #else #include "ippcc2mfx.h" #include "ipp2mfx.h" #endif #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #if defined(__INTEL_COMPILER) #pragma warning disable 1478 #endif using namespace UMC; template inline void SwapValues(T &one, T& two) { T tmp; tmp = one; one = two; two = tmp; } static void ConvertImage_16s8u_C1R(const int16_t *pSrc, int32_t iSrcStride, int32_t iSrcBitsPerSample, uint8_t *pDst, int32_t iDstStride, mfxSize size); static IppStatus cc_BGRAToBGR(const uint8_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize); static IppStatus cc_BGRToBGRA(const uint8_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize); static IppStatus cc_BGR555ToBGR(const uint16_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize); static IppStatus cc_BGR565ToBGR(const uint16_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize); static IppStatus cc_Y41P_to_I420(const uint8_t *pSrc, int32_t iSrcStride, uint8_t **pDst, int32_t *iDstStride, mfxSize srcSize); static IppStatus cc_I420_to_Y41P(const uint8_t **pSrc, int32_t *iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize); static IppStatus cc_YUV411_to_YUV420(const uint8_t *pSrc[3], int32_t iSrcStride[3], uint8_t *pDst[3], int32_t iDstStride[3], mfxSize srcSize); static IppStatus cc_RGB3_to_NV12(const uint8_t *pSrc, int32_t iSrcStride, uint8_t* pDst[2], int32_t dstStep[2], mfxSize srcSize, uint8_t isInterlace); static IppStatus cc_RGB4_to_NV12(const uint8_t *pSrc, int32_t iSrcStride, uint8_t* pDst[2], int32_t dstStep[2], mfxSize srcSize, uint8_t isInterlace); static Status CopyImage(VideoData *pSrc, VideoData *pDst, int flag, int bSwapUV) { VideoData::PlaneInfo src = {}; VideoData::PlaneInfo dst = {}; mfxSize size = {}; int cPlanes = 0; int iDstPlane = 0; int sts = ippStsNoErr; cPlanes = pSrc->GetNumPlanes(); if (cPlanes > pDst->GetNumPlanes()) cPlanes = pDst->GetNumPlanes(); for (iDstPlane = 0; iDstPlane < cPlanes; iDstPlane++) { int iSrcPlane = iDstPlane; if (bSwapUV) { if (iDstPlane == 1) iSrcPlane = 2; else if (iDstPlane == 2) iSrcPlane = 1; } pSrc->GetPlaneInfo(&src, iSrcPlane); pDst->GetPlaneInfo(&dst, iDstPlane); size.width = src.m_ippSize.width * src.m_iSamples; size.height = src.m_ippSize.height; if (src.m_iSampleSize == dst.m_iSampleSize) { size.width *= src.m_iSampleSize; if (flag == 2 && src.m_iBitDepth >= 0) { // case VC1->YUV420 sts = mfxiRangeMapping_VC1_8u_C1R(src.m_pPlane, (int32_t)src.m_nPitch, dst.m_pPlane, (int32_t)dst.m_nPitch, size, src.m_iBitDepth); } else { sts = mfxiCopy_8u_C1R(src.m_pPlane, (int32_t)src.m_nPitch, dst.m_pPlane, (int32_t)dst.m_nPitch, size); } } else if (src.m_iSampleSize == 2 && dst.m_iSampleSize == 1) { ConvertImage_16s8u_C1R((const int16_t*)src.m_pPlane, (int32_t)src.m_nPitch, src.m_iBitDepth, dst.m_pPlane, (int32_t)dst.m_nPitch, size); } else { return UMC_ERR_UNSUPPORTED; } } return (ippStsNoErr == sts) ? UMC_OK : UMC_ERR_FAILED; } int cc_IMC3_to_YUV420(const uint8_t *pSrc[3], int32_t pSrcStep[3], uint8_t *pDst[3], int32_t pDstStep[3], mfxSize srcSize) { mfxSize roi[3] = { {srcSize.width, srcSize.height}, {srcSize.width >> 1, srcSize.height >> 1}, {srcSize.width >> 1, srcSize.height >> 1} }; for (int32_t c = 0; c < 3; c++) { mfxiCopy_8u_C1R( pSrc[c], pSrcStep[c], pDst[c], pDstStep[c], roi[c]); } return ippStsNoErr; } Status ColorSpaceConversion::GetFrame(MediaData *input, MediaData *output) { VideoData *in = DynamicCast(input); VideoData *out = DynamicCast(output); if (NULL == in || NULL == out) { return UMC_ERR_NULL_PTR; } Status sts = UMC_OK; if (in->GetPictureStructure() != PS_FRAME && out->GetPictureStructure() != PS_FRAME) { VideoData in_interlace; VideoData out_interlace; in_interlace = *in; out_interlace = *out; PictureStructure inTemp = in_interlace.GetPictureStructure(); PictureStructure outTemp = out_interlace.GetPictureStructure(); in_interlace.SetPictureStructure(PS_FRAME); out_interlace.SetPictureStructure(PS_FRAME); in_interlace.ConvertPictureStructure(PS_TOP_FIELD); out_interlace.ConvertPictureStructure(PS_TOP_FIELD); sts = GetFrameInternal(&in_interlace, &out_interlace); if (sts == UMC_OK) { in_interlace.ConvertPictureStructure(PS_BOTTOM_FIELD); out_interlace.ConvertPictureStructure(PS_BOTTOM_FIELD); sts = GetFrameInternal(&in_interlace, &out_interlace); } in_interlace.SetPictureStructure(inTemp); out_interlace.SetPictureStructure(outTemp); } else { sts = GetFrameInternal(input, output); } return sts; } Status ColorSpaceConversion::GetFrameInternal(MediaData *input, MediaData *output) { VideoData *in = DynamicCast(input); VideoData *out = DynamicCast(output); if (NULL == in || NULL == out) { return UMC_ERR_NULL_PTR; } mfxSize srcSize = {in->GetWidth(), in->GetHeight()}; mfxSize dstSize = {out->GetWidth(), out->GetHeight()}; if (srcSize.width != dstSize.width || srcSize.height != dstSize.height) { return UMC_ERR_INVALID_PARAMS; } ColorFormat srcFormat = in->GetColorFormat(); ColorFormat dstFormat = out->GetColorFormat(); int bSrcSwapUV = 0; int bDstSwapUV = 0; if (srcFormat == YV12) // process YV12 as YUV420 { bSrcSwapUV = 1; srcFormat = YUV420; } if (dstFormat == YV12) // process YV12 as YUV420 { bDstSwapUV = 1; dstFormat = YUV420; } int flag_OnlyCopy = 0; if (srcFormat == dstFormat) flag_OnlyCopy = 1; if (YUV_VC1 == srcFormat && YUV420 == dstFormat) flag_OnlyCopy = 2; if (YUV420A == srcFormat && YUV420 == dstFormat) flag_OnlyCopy = 3; if (GRAYA == srcFormat && GRAY == dstFormat) flag_OnlyCopy = 4; if (flag_OnlyCopy) { return CopyImage(in, out, flag_OnlyCopy, bSrcSwapUV ^ bDstSwapUV); } const uint8_t *pSrc[3] = {(uint8_t*)in->GetPlanePointer(0), (uint8_t*)in->GetPlanePointer(1), (uint8_t*)in->GetPlanePointer(2)}; int32_t pSrcStep[3] = {(int32_t)in->GetPlanePitch(0), (int32_t)in->GetPlanePitch(1), (int32_t)in->GetPlanePitch(2)}; uint8_t *pDst[3] = {(uint8_t*)out->GetPlanePointer(0), (uint8_t*)out->GetPlanePointer(1), (uint8_t*)out->GetPlanePointer(2)}; int32_t pDstStep[3] = {(int32_t)out->GetPlanePitch(0), (int32_t)out->GetPlanePitch(1), (int32_t)out->GetPlanePitch(2)}; if (bSrcSwapUV) { SwapValues(pSrc[1], pSrc[2]); SwapValues(pSrcStep[1], pSrcStep[2]); } if (bDstSwapUV) { SwapValues(pDst[1], pDst[2]); SwapValues(pDstStep[1], pDstStep[2]); } if (srcFormat == YUV422 && dstFormat != YUV420) { // 422->X as 420->X pSrcStep[1] *= 2; pSrcStep[2] *= 2; srcFormat = YUV420; } const uint8_t *pYVU[3] = {pSrc[0], pSrc[2], pSrc[1]}; int32_t pYVUStep[3] = {pSrcStep[0], pSrcStep[2], pSrcStep[1]}; int status; switch (srcFormat) { case IMC3: switch (dstFormat) { case YUV420: //status = mfxiYCbCr411ToYCbCr420_8u_P3R(pSrc, pSrcStep, pDst, pDstStep, srcSize); status = cc_IMC3_to_YUV420(pSrc, pSrcStep, pDst, pDstStep, srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case YUV411: switch (dstFormat) { case YUV420: //status = mfxiYCbCr411ToYCbCr420_8u_P3R(pSrc, pSrcStep, pDst, pDstStep, srcSize); status = cc_YUV411_to_YUV420(pSrc, pSrcStep, pDst, pDstStep, srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case YUV420: switch (dstFormat) { case YUV422: status = mfxiYCbCr420ToYCbCr422_8u_P3R(pSrc, pSrcStep, pDst, pDstStep, srcSize); break; case Y41P: status = cc_I420_to_Y41P(pYVU, pYVUStep, pDst[0], pDstStep[0], srcSize); break; case YUY2: status = mfxiYCrCb420ToYCbCr422_8u_P3C2R(pYVU, pYVUStep, pDst[0], pDstStep[0], srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case YUV422: case YUV422A: switch (dstFormat) { case YUV420: status = mfxiYCbCr422ToYCbCr420_8u_P3R(pSrc, pSrcStep, pDst, pDstStep, srcSize); break; case YUY2: status = mfxiYCbCr422_8u_P3C2R(pSrc, pSrcStep, pDst[0], pDstStep[0], srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case YUV444: return UMC_ERR_NOT_IMPLEMENTED; break; case YUY2: switch (dstFormat) { case YUV420: status = mfxiYCbCr422ToYCbCr420_8u_C2P3R(pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize); break; case YUV422: status = mfxiYCbCr422_8u_C2P3R( pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case UYVY: switch (dstFormat) { case YUV422: status = mfxiCbYCr422ToYCbCr422_8u_C2P3R( pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case NV12: switch (dstFormat) { case YUV420: status = mfxiYCbCr420_8u_P2P3R(pSrc[0], pSrcStep[0], pSrc[1], pSrcStep[1], pDst, pDstStep, srcSize); break; case YUY2: status = mfxiYCbCr420ToYCbCr422_8u_P2C2R(pSrc[0], pSrcStep[0], pSrc[1], pSrcStep[1], pDst[0], pDstStep[0], srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case RGB24: switch (dstFormat) { case RGB32: status = cc_BGRToBGRA(pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize); break; case NV12: status = cc_RGB3_to_NV12(pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize, false); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case RGB32: switch (dstFormat) { case RGB24: status = cc_BGRAToBGR(pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize); break; case NV12: status = cc_RGB4_to_NV12(pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize, false); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case RGB555: switch (dstFormat) { case RGB24: status = cc_BGR555ToBGR((const uint16_t*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case RGB565: switch (dstFormat) { case RGB24: status = cc_BGR565ToBGR((const uint16_t*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; case Y41P: switch (dstFormat) { case YUV420: status = cc_Y41P_to_I420(pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize); break; default: return UMC_ERR_NOT_IMPLEMENTED; } break; default: return UMC_ERR_NOT_IMPLEMENTED; } return (status == ippStsNoErr) ? UMC_OK : UMC_ERR_INVALID_PARAMS; } //////////////////////////////////////////////////////////////////////// static void ConvertImage_16s8u_C1R(const int16_t *pSrc, int32_t iSrcStride, int32_t iSrcBitsPerSample, uint8_t *pDst, int32_t iDstStride, mfxSize size) { int iWidth = size.width; int iHeight = size.height; int rnd = (1 << (iSrcBitsPerSample - 8 - 1)); int32_t x, y; for (y = 0; y < iHeight; y += 1) { for (x = 0; x < iWidth; x += 1) { pDst[x] = (uint8_t) ((pSrc[x] + rnd) >> (iSrcBitsPerSample - 8)); } pSrc = (int16_t *) ((uint8_t *) pSrc + iSrcStride); pDst = pDst + iDstStride; } } IppStatus cc_BGRAToBGR(const uint8_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize) { int i, j ; for (i = 0; i < srcSize.height; i++) { for (j = 0; j < srcSize.width; j++) { pDst[3*j + 0] = pSrc[4*j + 0]; pDst[3*j + 1] = pSrc[4*j + 1]; pDst[3*j + 2] = pSrc[4*j + 2]; } pSrc += iSrcStride; pDst += iDstStride; } return ippStsNoErr; } IppStatus cc_BGRToBGRA(const uint8_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize) { int i, j ; for (i = 0; i < srcSize.height; i++) { for (j = 0; j < srcSize.width; j++) { pDst[4*j + 0] = pSrc[3*j + 0]; pDst[4*j + 1] = pSrc[3*j + 1]; pDst[4*j + 2] = pSrc[3*j + 2]; pDst[4*j + 3] = 0xFF; } pSrc += iSrcStride; pDst += iDstStride; } return ippStsNoErr; } IppStatus cc_BGR555ToBGR(const uint16_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize) { int i, j; for (i = 0; i < srcSize.height; i++) { for (j = 0; j < srcSize.width; j++) { uint16_t pix = pSrc[j]; //pDst[3*j + 0] = (uint8_t)((pix >> 10) & 0x1f); //pDst[3*j + 1] = (uint8_t)((pix >> 5) & 0x1f); //pDst[3*j + 2] = (uint8_t)((pix & 0x1f) << 3); pDst[3*j + 2] = (uint8_t)((pix & 0x7c00) >> 7); pDst[3*j + 1] = (uint8_t)((pix & 0x03e0) >> 2); pDst[3*j + 0] = (uint8_t)((pix & 0x001f) << 3); } pSrc = (uint16_t *) ((uint8_t *) pSrc + iSrcStride); pDst += iDstStride; } return ippStsNoErr; } IppStatus cc_BGR565ToBGR(const uint16_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize) { int i, j; for (i = 0; i < srcSize.height; i++) { for (j = 0; j < srcSize.width; j++) { uint16_t pix = pSrc[j]; pDst[3*j + 2] = (uint8_t)((pix & 0xf800) >> 8); //pDst[3*j + 0] = (uint8_t)((pix & 0x001f) << 3); pDst[3*j + 1] = (uint8_t)((pix & 0x07e0) >> 3); pDst[3*j + 0] = (uint8_t)((pix & 0x001f) << 3); //pDst[3*j + 2] = (uint8_t)((pix & 0xf800) >> 8); } pSrc = (uint16_t *) ((uint8_t *) pSrc + iSrcStride); pDst += iDstStride; } return ippStsNoErr; } IppStatus cc_Y41P_to_I420(const uint8_t *pSrc, int32_t iSrcStride, uint8_t **pDst, int32_t *iDstStride, mfxSize srcSize) { uint8_t *Y = pDst[0]; uint8_t *U = pDst[1]; uint8_t *V = pDst[2]; int Y_stride = iDstStride[0]; int U_stride = iDstStride[1]; int V_stride = iDstStride[2]; int i, j; for (j = 0; j < srcSize.height; j++) { for (i = 0; i < srcSize.width/8; i++) { int U0 = pSrc[12*i + 0]; int Y0 = pSrc[12*i + 1]; int V0 = pSrc[12*i + 2]; int Y1 = pSrc[12*i + 3]; int U4 = pSrc[12*i + 4]; int Y2 = pSrc[12*i + 5]; int V4 = pSrc[12*i + 6]; int Y3 = pSrc[12*i + 7]; int Y4 = pSrc[12*i + 8]; int Y5 = pSrc[12*i + 9]; int Y6 = pSrc[12*i + 10]; int Y7 = pSrc[12*i + 11]; Y[8*i + 0] = (uint8_t)Y0; Y[8*i + 1] = (uint8_t)Y1; Y[8*i + 2] = (uint8_t)Y2; Y[8*i + 3] = (uint8_t)Y3; Y[8*i + 4] = (uint8_t)Y4; Y[8*i + 5] = (uint8_t)Y5; Y[8*i + 6] = (uint8_t)Y6; Y[8*i + 7] = (uint8_t)Y7; if (!(j & 1)) { U[4*i + 0] = (uint8_t)U0; U[4*i + 1] = (uint8_t)U0; U[4*i + 2] = (uint8_t)U4; U[4*i + 3] = (uint8_t)U4; V[4*i + 0] = (uint8_t)V0; V[4*i + 1] = (uint8_t)V0; V[4*i + 2] = (uint8_t)V4; V[4*i + 3] = (uint8_t)V4; } } pSrc += iSrcStride; Y += Y_stride; if (j & 1) { U += U_stride; V += V_stride; } } return ippStsNoErr; } IppStatus cc_I420_to_Y41P(const uint8_t **pSrc, int32_t *iSrcStride, uint8_t *pDst, int32_t iDstStride, mfxSize srcSize) { const uint8_t *Y = pSrc[0]; const uint8_t *U = pSrc[1]; const uint8_t *V = pSrc[2]; int Y_stride = iSrcStride[0]; int U_stride = iSrcStride[1]; int V_stride = iSrcStride[2]; int i, j; for (j = 0; j < srcSize.height; j++) { for (i = 0; i < srcSize.width/8; i++) { int Y0 = Y[8*i + 0]; int Y1 = Y[8*i + 1]; int Y2 = Y[8*i + 2]; int Y3 = Y[8*i + 3]; int Y4 = Y[8*i + 4]; int Y5 = Y[8*i + 5]; int Y6 = Y[8*i + 6]; int Y7 = Y[8*i + 7]; int U0 = U[4*i + 0]; int U4 = U[4*i + 2]; int V0 = V[4*i + 0]; int V4 = V[4*i + 2]; pDst[12*i + 0] = (uint8_t)U0; pDst[12*i + 1] = (uint8_t)Y0; pDst[12*i + 2] = (uint8_t)V0; pDst[12*i + 3] = (uint8_t)Y1; pDst[12*i + 4] = (uint8_t)U4; pDst[12*i + 5] = (uint8_t)Y2; pDst[12*i + 6] = (uint8_t)V4; pDst[12*i + 7] = (uint8_t)Y3; pDst[12*i + 8] = (uint8_t)Y4; pDst[12*i + 9] = (uint8_t)Y5; pDst[12*i + 10] = (uint8_t)Y6; pDst[12*i + 11] = (uint8_t)Y7; } pDst += iDstStride; Y += Y_stride; if (j & 1) { U += U_stride; V += V_stride; } } return ippStsNoErr; } IppStatus cc_YUV411_to_YUV420(const uint8_t *pSrc[3], int32_t pSrcStep[3], uint8_t *pDst[3], int32_t pDstStep[3], mfxSize srcSize) { int32_t h,w; int32_t srcStepU , srcStepV ; int32_t dstStepU , dstStepV ; int width ; int height ; const uint8_t* srcu; const uint8_t* srcv; IppStatus sts = ippStsNoErr; uint8_t* dstu; uint8_t* dstv; srcu = pSrc[1]; srcv = pSrc[2]; dstu = pDst[1]; dstv = pDst[2]; srcStepU = pSrcStep[1]; srcStepV = pSrcStep[2]; dstStepU = pDstStep[1]; dstStepV = pDstStep[2]; width = srcSize.width ; height = srcSize.height; /* Y plane */ sts = mfxiCopy_8u_C1R( pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize ); if (ippStsNoErr != sts) return sts; for( h = 0; h < height ; h +=2) { for( w = 0; w < (width/4 -1) ;w ++ ) { dstu[w*2] = srcu[w]; dstu[w*2+1] = (srcu[w] + srcu[w+1]) / 2; dstv[w*2] = srcv[w]; dstv[w*2+1] = (srcv[w] + srcv[w+1]) / 2; } dstu[w*2] = dstu[w*2 + 1] = srcu[w]; dstv[w*2] = dstv[w*2 + 1] = srcv[w]; srcu += 2*srcStepU; dstu += dstStepU; srcv += 2*srcStepV; dstv += dstStepV; } return sts; } #define kry0 0x000041cb #define kry1 0x00008106 #define kry2 0x00001917 #define kry3 0x000025e3 #define kry4 0x00004a7f #define kry5 0x00007062 #define kry6 0x00005e35 #define kry7 0x0000122d static IppStatus ownBGRToYCbCr420_8u_AC4P2R(const uint8_t* pSrc, int srcStep, uint8_t* pDst[2],int dstStep[2], mfxSize roiSize ) { IppStatus sts = ippStsNoErr; int h,w; int dstStepY = dstStep[0]; int width2 = roiSize.width & ~1; int height2 = roiSize.height >> 1; uint8_t* pDstUV = pDst[1]; for( h = 0; h < height2; h++ ){ const uint8_t* src; uint8_t* dsty,*dstu,*dstv; src = pSrc + h * 2 * srcStep; dsty = pDst[0]+ h * 2 * dstStepY; dstu = pDstUV + h * dstStep[1]; dstv = dstu + 1; for( w = 0; w < width2; w += 2 ){ int g,g1,g2,g3; int r,r1,r2,r3; int b,b1,b2,b3; b = src[0];g = src[1];r = src[2]; b1= src[4];g1= src[5];r1= src[6]; b2= src[0+srcStep];g2= src[1+srcStep];r2= src[2+srcStep]; b3= src[4+srcStep];g3= src[5+srcStep];r3= src[6+srcStep]; src += 8; dsty[0] = ( uint8_t )(( kry0 * r + kry1 * g + kry2 * b + 0x108000) >> 16 ); dsty[1] = ( uint8_t )(( kry0 * r1 + kry1 * g1 + kry2 * b1 + 0x108000) >> 16 ); dsty[0+dstStepY] = ( uint8_t )(( kry0 * r2 + kry1 * g2 + kry2 * b2 + 0x108000) >> 16 ); dsty[1+dstStepY] = ( uint8_t )(( kry0 * r3 + kry1 * g3 + kry2 * b3 + 0x108000) >> 16 ); dsty += 2; r += r1;r += r2;r += r3; b += b1;b += b2;b += b3; g += g1;g += g2;g += g3; *dstu = ( uint8_t )((-kry3 * r - kry4 * g + kry5 * b + 0x2008000)>> 18 ); /* Cb */ *dstv = ( uint8_t )(( kry5 * r - kry6 * g - kry7 * b + 0x2008000)>> 18 ); /* Cr */ dstu += 2; dstv += 2; } } return sts; } // int ownBGRToYCbCr420_8u_AC4P3R( ... ) static IppStatus cc_RGB4_to_NV12(const uint8_t *pSrc, int32_t iSrcStride, uint8_t* pDst[2], int32_t dstStep[2], mfxSize srcSize, uint8_t isInterlace) { IppStatus sts = ippStsNoErr; // alpha channel is ignore due to d3d issue if (!isInterlace) { sts = ownBGRToYCbCr420_8u_AC4P2R(pSrc, iSrcStride, pDst, dstStep, srcSize); } else { int32_t pDstFieldStep[2] = {dstStep[0]<<1, dstStep[1]<<1}; mfxSize roiFieldSize = {srcSize.width, srcSize.height >> 1}; uint8_t* pDstSecondField[2] = {pDst[0]+dstStep[0], pDst[1]+dstStep[1]}; /* first field */ sts = ownBGRToYCbCr420_8u_AC4P2R(pSrc, iSrcStride<<1, pDst, pDstFieldStep, roiFieldSize); if( ippStsNoErr != sts ) return sts; /* second field */ sts = ownBGRToYCbCr420_8u_AC4P2R(pSrc + iSrcStride, iSrcStride<<1, pDstSecondField, pDstFieldStep, roiFieldSize); } return sts; } // int cc_RGB4_to_NV12( mfxFrameData* inData, mfxFrameInfo* inInfo, ... ) static IppStatus ownBGRToYCbCr420_8u_C3P2R( const uint8_t* pSrc, int32_t srcStep, uint8_t* pDst[2],int32_t dstStep[2], mfxSize roiSize ) { int32_t h,w; int32_t dstStepY = dstStep[0]; int32_t width2 = roiSize.width & ~1; int32_t height2 = roiSize.height >> 1; uint8_t* pDstU = pDst[1]; uint8_t* pDstV = pDstU + 1; IppStatus sts = ippStsNoErr; for( h = 0; h < height2; h++ ){ const uint8_t* src; uint8_t* dsty, *dstu, *dstv; src = pSrc + h * 2 * srcStep; dsty = pDst[0]+ h * 2 * dstStepY; dstu = pDstU + h * dstStep[1]; dstv = pDstV + h * dstStep[1]; for( w = 0; w < width2; w += 2 ) { int32_t g,g1,g2,g3; int32_t r,r1,r2,r3; int32_t b,b1,b2,b3; b = src[0];g = src[1];r = src[2]; b1= src[3];g1= src[4];r1= src[5]; b2= src[0+srcStep];g2= src[1+srcStep];r2= src[2+srcStep]; b3= src[3+srcStep];g3= src[4+srcStep];r3= src[5+srcStep]; src += 6; dsty[0] = (uint8_t)(( kry0 * r + kry1 * g + kry2 * b + 0x108000) >> 16 ); dsty[1] = (uint8_t)(( kry0 * r1 + kry1 * g1 + kry2 * b1 + 0x108000) >> 16 ); dsty[0+dstStepY] = (uint8_t)(( kry0 * r2 + kry1 * g2 + kry2 * b2 + 0x108000) >> 16 ); dsty[1+dstStepY] = (uint8_t)(( kry0 * r3 + kry1 * g3 + kry2 * b3 + 0x108000) >> 16 ); dsty += 2; r += r1;r += r2;r += r3; b += b1;b += b2;b += b3; g += g1;g += g2;g += g3; *dstu = ( uint8_t )((-kry3 * r - kry4 * g + kry5 * b + 0x2008000)>> 18 ); /* Cb */ *dstv = ( uint8_t )(( kry5 * r - kry6 * g - kry7 * b + 0x2008000)>> 18 ); /* Cr */ dstu += 2; dstv += 2; } } return sts; } // int ownBGRToYCbCr420_8u_C3P2R( const mfxU8* pSrc, mfxI32 srcStep, ...) static IppStatus cc_RGB3_to_NV12(const uint8_t *pSrc, int32_t iSrcStride, uint8_t* pDst[2], int32_t dstStep[2], mfxSize srcSize, uint8_t isInterlace) { IppStatus sts = ippStsNoErr; if (!isInterlace) { sts = ownBGRToYCbCr420_8u_C3P2R(pSrc, iSrcStride, pDst, dstStep, srcSize); } else { int32_t pDstFieldStep[2] = {dstStep[0]<<1, dstStep[1]<<1}; mfxSize roiFieldSize = {srcSize.width, srcSize.height >> 1}; uint8_t* pDstSecondField[2] = {pDst[0]+dstStep[0], pDst[1]+dstStep[1]}; /* first field */ sts = ownBGRToYCbCr420_8u_C3P2R(pSrc, iSrcStride<<1, pDst, pDstFieldStep, roiFieldSize); if( ippStsNoErr != sts ) return sts; /* second field */ sts = ownBGRToYCbCr420_8u_C3P2R( pSrc + iSrcStride, iSrcStride<<1, pDstSecondField, pDstFieldStep, roiFieldSize); } return sts; } // int cc_RGB3_to_NV12( mfxFrameData* inData, mfxFrameInfo* inInfo,...) umc_deinterlacing.cpp000066400000000000000000000141121443134507600353130ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/src// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_deinterlacing.h" #include "umc_video_data.h" #if !defined(MSDK_USE_EXTERNAL_IPP) #include "ippi.h" #include "ippvc.h" #else #include "ipp2mfx.h" #endif using namespace UMC; Deinterlacing::Deinterlacing() { mMethod = DEINTERLACING_DUPLICATE; } Status Deinterlacing::SetMethod(DeinterlacingMethod method) { mMethod = method; return UMC_OK; } static void DeinterlacingEdgeDetect(uint8_t *psrc, int32_t iSrcPitch, uint8_t *pdst, int32_t iDstPitch, int32_t w, int32_t h); Status Deinterlacing::GetFrame(MediaData *input, MediaData *output) { VideoData *in = DynamicCast(input); VideoData *out = DynamicCast(output); DeinterlacingMethod method = mMethod; int k; if (NULL == in || NULL == out) { return UMC_ERR_NULL_PTR; } ColorFormat cFormat = in->GetColorFormat(); if (out->GetColorFormat() != cFormat) { return UMC_ERR_INVALID_PARAMS; } int32_t in_Width = in->GetWidth(); int32_t in_Height = in->GetHeight(); int32_t out_Width = out->GetWidth(); int32_t out_Height = out->GetHeight(); if ( (in_Width != out_Width) || (in_Height != out_Height) ) { return UMC_ERR_INVALID_PARAMS; } for (k = 0; k < in->GetNumPlanes(); k++) { VideoData::PlaneInfo srcPlane = {}; const uint8_t *pSrc0; //, *pSrc1; uint8_t *pDst0, *pDst1; int srcPitch, dstPitch; mfxSize size; in->GetPlaneInfo(&srcPlane, k); pSrc0 = (const uint8_t*)in->GetPlanePointer(k); srcPitch = (int32_t)in->GetPlanePitch(k); pDst0 = (uint8_t*)out->GetPlanePointer(k); dstPitch = (int32_t)out->GetPlanePitch(k); size.width = srcPlane.m_ippSize.width * srcPlane.m_iSamples * srcPlane.m_iSampleSize; size.height = srcPlane.m_ippSize.height; if (method == DEINTERLACING_BLEND) { if (srcPlane.m_iSampleSize != 1) { //return UMC_ERR_UNSUPPORTED; method = DEINTERLACING_DUPLICATE; } mfxiDeinterlaceFilterTriangle_8u_C1R(pSrc0, srcPitch, pDst0, dstPitch, size, 128, IPP_LOWER | IPP_UPPER | IPP_CENTER); continue; } if (method == DEINTERLACING_SPATIAL) { if (k == 0) { // Y if (srcPlane.m_iSampleSize != 1 || srcPlane.m_iSamples != 1) { //return UMC_ERR_UNSUPPORTED; method = DEINTERLACING_DUPLICATE; } DeinterlacingEdgeDetect((uint8_t*)pSrc0, srcPitch, pDst0, dstPitch, size.width, size.height); continue; } else { // U,V method = DEINTERLACING_DUPLICATE; } } // DEINTERLACING_DUPLICATE //pSrc1 = pSrc0 += srcPitch; pSrc0 += srcPitch; srcPitch *= 2; pDst1 = pDst0 + dstPitch; dstPitch *= 2; size.height /= 2; mfxiCopy_8u_C1R(pSrc0, srcPitch, pDst0, dstPitch, size); mfxiCopy_8u_C1R(pSrc0, srcPitch, pDst1, dstPitch, size); } return UMC_OK; } static void DeinterlacingEdgeDetect(uint8_t *psrc, int32_t iSrcPitch, uint8_t *pdst, int32_t iDstPitch, int32_t w, int32_t h) { int32_t /*hi, lo,*/ x, y; int32_t res; uint8_t *pInA, *pInB, *pInC, *pInD, *pInE, *pInF; int32_t dif1, dif2, dif3; mfxSize roi = {w, h/2}; // copy even lines mfxiCopy_8u_C1R(psrc, 2*iSrcPitch, pdst, 2*iDstPitch, roi); // then line #1 and line before last std::copy(psrc + iSrcPitch, psrc + 2*iSrcPitch, pdst + iDstPitch); std::copy(psrc + (h - 2) * iSrcPitch, psrc + (h - 2) * iSrcPitch + w, pdst + (h - 1)*iDstPitch); psrc += 3*iSrcPitch; pdst += 3*iDstPitch; pInB = psrc - iSrcPitch; pInA = pInB - 1; pInC = pInB + 1; pInE = psrc + iSrcPitch; pInD = pInE - 1; pInF = pInE + 1; for (y = 3; y <= h - 3; y += 2) { pdst[0] = psrc[0]; pdst[w - 1] = psrc[w - 1]; for (x = 1; x < w - 1; x++) { dif1 = abs((int32_t)pInA[x] - (int32_t)pInF[x]); dif2 = abs((int32_t)pInC[x] - (int32_t)pInD[x]); dif3 = abs((int32_t)pInB[x] - (int32_t)pInE[x]); if (dif1 < dif2) { if (dif1 < dif3) { res = ((int32_t)pInA[x] + (int32_t)pInF[x]) >> 1; //1 } else { res = ((int32_t)pInB[x] + (int32_t)pInE[x]) >> 1; //3 } } else { if (dif2 < dif3) { res = ((int32_t)pInC[x] + (int32_t)pInD[x]) >> 1; //2 } else { res = ((int32_t)pInB[x] + (int32_t)pInE[x]) >> 1; //3 } } pdst[x] = (uint8_t)res; } psrc += 2*iSrcPitch; pdst += 2*iDstPitch; pInA += 2*iSrcPitch; pInB += 2*iSrcPitch; pInC += 2*iSrcPitch; pInD += 2*iSrcPitch; pInE += 2*iSrcPitch; pInF += 2*iSrcPitch; } } umc_video_processing.cpp000066400000000000000000000237611443134507600360570ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/src// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "umc_video_processing.h" #include "umc_deinterlacing.h" #include "umc_color_space_conversion.h" #include "umc_deinterlacing.h" using namespace UMC; namespace UMC { BaseCodec *createVideoProcessing() { return (new VideoProcessing); } } VideoProcessing::VideoProcessing() { memset(pFilter, 0, sizeof(pFilter)); memset(bFiltering, 0, sizeof(bFiltering)); bSrcCropArea = false; // order of filters numFilters = 0; iDeinterlacing = numFilters++; iColorConv0 = numFilters++; iColorConv = numFilters++; iResizing = numFilters++; // create filters pFilter[iDeinterlacing] = new Deinterlacing; pFilter[iColorConv0] = new ColorSpaceConversion; // first color conversion pFilter[iColorConv] = pFilter[iColorConv0]; // second color conversion #if defined (UMC_ENABLE_VPP_RESIZE) pFilter[iResizing] = new VideoResizing; #endif iD3DProcessing = 0; } Status VideoProcessing::Close() { pFilter[iColorConv0] = NULL; // duplication of iColorConv!!! for (unsigned int i = 0; i < UMC_ARRAY_SIZE(pFilter); i++) { UMC_DELETE(pFilter[i]); } return UMC_OK; } Status VideoProcessing::AddFilter(BaseCodec *filter, int atEnd) { int k; if (atEnd) { bFiltering[numFilters] = true; pFilter[numFilters++] = filter; } else { for (k = numFilters; k > 0; k--) { pFilter[k] = pFilter[k - 1]; bFiltering[k] = bFiltering[k - 1]; } bFiltering[0] = true; pFilter[0] = filter; iDeinterlacing++; iColorConv0++; iColorConv++; iResizing++; numFilters++; } return UMC_OK; } Status VideoProcessing::Init(BaseCodecParams *init) { return SetParams(init); } static Status InitVideoData(VideoData *tmpData, int w, int h, ColorFormat color) { if (tmpData->GetWidth() != w || tmpData->GetHeight() != h || tmpData->GetColorFormat() != color) { tmpData->Init(w, h, color); return tmpData->Alloc(); } return UMC_OK; } static ColorFormat GetIntermediatedColor(ColorFormat src_color) { switch (src_color) { case YV12: return YUV420; case NV12: return YUV420; case YUY2: return YUV420; case UYVY: return YUV420; case YUV411: return YUV422; case YUV420: return YV12; case YUV422: return YUY2; case YUV444: return RGB24; case YUV_VC1: return YUV420; case Y411: return YUV411; case Y41P: return YUV411; case RGB32: return RGB24; case RGB24: return RGB32; case RGB565: return RGB24; case RGB555: return RGB24; case RGB444: return RGB24; case GRAY: return YUV420; case YUV420A: return YUV420; case YUV422A: return YUV422; case YUV444A: return YUV444; case YVU9: return YUV420; default: return YUV420; } } Status VideoProcessing::GetFrame(MediaData *input, MediaData *output) { VideoData *in = DynamicCast(input); VideoData *out = DynamicCast(output); VideoData *src; VideoData *dst; Status res; double timeStart, timeEnd; int k; UMC_CHECK(in, UMC_ERR_NULL_PTR); UMC_CHECK(out, UMC_ERR_NULL_PTR); // copy FrameType and Time out->SetFrameType(in->GetFrameType()); in->GetTime(timeStart, timeEnd); out->SetTime(timeStart, timeEnd); // Crop if (bSrcCropArea) { *(VideoData*)tmp_in = *in; in = tmp_in; tmp_in->Crop(Param.SrcCropArea); } int src_w = in->GetWidth(); int src_h = in->GetHeight(); int dst_w = out->GetWidth(); int dst_h = out->GetHeight(); ColorFormat src_c = in->GetColorFormat(); ColorFormat dst_c = out->GetColorFormat(); memset(bFiltering, 0, sizeof(bFiltering)); { // if filter index is out of bound, return error if(iDeinterlacing >= MAX_NUM_FILTERS || iColorConv >= MAX_NUM_FILTERS || iResizing >= MAX_NUM_FILTERS) return UMC_ERR_INVALID_PARAMS; bFiltering[iDeinterlacing] = (Param.m_DeinterlacingMethod != NO_DEINTERLACING) && (in->GetPictureStructure() != PS_FRAME); bFiltering[iColorConv] = (src_c != dst_c); bFiltering[iResizing] = (src_w != dst_w || src_h != dst_h); UMC_CHECK(in->GetPlanePointer(0), UMC_ERR_NOT_ENOUGH_DATA); } // Get frame size int32_t lFrameSize = (int32_t)out->GetMappingSize(); if (lFrameSize <= 0) lFrameSize = (int32_t)in->GetMappingSize(); if (lFrameSize <= 0) lFrameSize = 1; // Set PictureStructure if (!bFiltering[iDeinterlacing]) { out->SetPictureStructure(in->GetPictureStructure()); } else { out->SetPictureStructure(PS_FRAME); } // skip color conversion between YUV420 and YV12 int skip_flag = 0; if (src_c == YUV420 && dst_c == YV12) skip_flag = 1; // YUV420->YV12 if (src_c == YV12 && dst_c == YUV420) skip_flag = 2; // YV12->YUV420 if (skip_flag) { for (k = 0; k < numFilters; k++) { if (bFiltering[k] && k != iColorConv) { if (skip_flag == 1) { *(VideoData*)tmp_out = *out; out = tmp_out; tmp_out->Convert_YV12_To_YUV420(); dst_c = YUV420; bFiltering[iColorConv] = false; } else { // skip_flag == 2 if (in != tmp_in) { *(VideoData*)tmp_in = *in; in = tmp_in; } tmp_in->Convert_YV12_To_YUV420(); src_c = YUV420; bFiltering[iColorConv] = false; } break; } } } // if filter index is out of bound, return error if(numFilters >= MAX_NUM_FILTERS || iColorConv0 >= MAX_NUM_FILTERS) return UMC_ERR_INVALID_PARAMS; // Get last filter in chain int iLastFilter = numFilters - 1; while (iLastFilter >= 0 && bFiltering[iLastFilter] == false) iLastFilter--; if (iLastFilter < 0) { // if no filters bFiltering[iColorConv] = true; iLastFilter = iColorConv; } src = in; for (k = 0; k <= iLastFilter; k++) { if (!bFiltering[k] || pFilter[k] == NULL) continue; if (k == iLastFilter) { dst = out; } else { dst = &tmpData[k]; if (k == iD3DProcessing || k == iColorConv) { src_c = dst_c; } else if (k == iResizing) { src_w = dst_w; src_h = dst_h; } InitVideoData(dst, src_w, src_h, src_c); } res = pFilter[k]->GetFrame(src, dst); if (res != UMC_OK) { if (k == iColorConv && res == UMC_ERR_NOT_IMPLEMENTED && !bFiltering[iColorConv0]) { bFiltering[iColorConv0] = true; // try double color conversion src_c = GetIntermediatedColor(src->GetColorFormat()); // intermediated color k = iColorConv0 - 1; // back to first color conversion continue; } return res; } src = dst; } input->SetDataSize(0); output->SetDataSize(lFrameSize); return UMC_OK; } Status VideoProcessing::SetParams(BaseCodecParams *params) { VideoProcessingParams *p_params = DynamicCast(params); UMC_CHECK(p_params, UMC_OK); Param = *p_params; /* KW fix */ if (pFilter[iDeinterlacing]) { ( static_cast(pFilter[iDeinterlacing])->SetMethod(Param.m_DeinterlacingMethod)); } #if defined (UMC_ENABLE_VPP_RESIZE) if (pFilter[iResizing]) { ( static_cast (pFilter[iResizing])->SetMethod(Param.InterpolationMethod)); } #endif bSrcCropArea = Param.SrcCropArea.left || Param.SrcCropArea.right || Param.SrcCropArea.top || Param.SrcCropArea.bottom; return UMC_OK; } Status VideoProcessing::GetInfo(BaseCodecParams *info) { VideoProcessingParams *p_params = DynamicCast(info); if (!p_params) { return UMC_ERR_NULL_PTR; } *p_params = Param; return UMC_OK; } Status VideoProcessing::Reset() { return UMC_OK; } VideoProcessing::~VideoProcessing() { Close(); } ////////////////////////////////////////////////////////////////////// Status VideoDataExt::Crop(UMC::sRECT SrcCropArea) { int left = SrcCropArea.left; int top = SrcCropArea.top; int right = SrcCropArea.right; int bottom = SrcCropArea.bottom; if (!right) right = m_ippSize.width; if (!bottom) bottom = m_ippSize.height; int w = right - left; int h = bottom - top; int k; if (w <= 0 || h <= 0) return UMC_ERR_INVALID_PARAMS; if (left < 0 || top < 0) return UMC_ERR_INVALID_PARAMS; if (right > m_ippSize.width || bottom > m_ippSize.height) return UMC_ERR_INVALID_PARAMS; for (k = 0; k < m_iPlanes; k++) { int wDiv = (m_pPlaneData[k].m_ippSize.width) ? m_ippSize.width/m_pPlaneData[k].m_ippSize.width : 1; int hDiv = (m_pPlaneData[k].m_ippSize.height) ? m_ippSize.height/m_pPlaneData[k].m_ippSize.height : 1; m_pPlaneData[k].m_pPlane += (top / hDiv) * m_pPlaneData[k].m_nPitch + (left / wDiv) * m_pPlaneData[k].m_iSamples * m_pPlaneData[k].m_iSampleSize; m_pPlaneData[k].m_ippSize.width = w / wDiv; m_pPlaneData[k].m_ippSize.height = h / hDiv; } m_ippSize.width = w; m_ippSize.height = h; return UMC_OK; } Status VideoDataExt::Convert_YV12_To_YUV420() { if (m_ColorFormat == YV12) { PlaneInfo tmp_plane = m_pPlaneData[1]; m_pPlaneData[1] = m_pPlaneData[2]; m_pPlaneData[2] = tmp_plane; m_ColorFormat = YUV420; } return UMC_OK; } umc_video_resizing.cpp000066400000000000000000000146431443134507600355340ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/color_space_converter/src// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (UMC_ENABLE_VPP_RESIZE) #include "umc_video_resizing.h" #include "umc_video_data.h" #include "ippi.h" using namespace UMC; VideoResizing::VideoResizing() { mInterpolation = IPPI_INTER_NN; } Status VideoResizing::SetMethod(int lInterpolation) { mInterpolation = lInterpolation; return UMC_OK; } Status VideoResizing::GetFrame(MediaData *input, MediaData *output) { VideoData *in = DynamicCast(input); VideoData *out = DynamicCast(output); VideoData::PlaneInfo srcPlane; VideoData::PlaneInfo dstPlane; int k; if (NULL == in || NULL == out) { return UMC_ERR_NULL_PTR; } ColorFormat cFormat = in->GetColorFormat(); if (out->GetColorFormat() != cFormat) { return UMC_ERR_INVALID_PARAMS; } int32_t in_Width = in->GetWidth(); int32_t in_Height = in->GetHeight(); int32_t out_Width = out->GetWidth(); int32_t out_Height = out->GetHeight(); double xRatio = static_cast (out_Width) / static_cast (in_Width); double yRatio = static_cast (out_Height) / static_cast (in_Height); for (k = 0; k < in->GetNumPlanes(); k++) { in->GetPlaneInfo(&srcPlane, k); out->GetPlaneInfo(&dstPlane, k); UMC_CHECK(srcPlane.m_iSampleSize == dstPlane.m_iSampleSize, UMC_ERR_INVALID_PARAMS); UMC_CHECK(srcPlane.m_iSamples == dstPlane.m_iSamples, UMC_ERR_INVALID_PARAMS); IppiRect RectSrc = {0, 0, srcPlane.m_ippSize.width, srcPlane.m_ippSize.height}; if (cFormat == YUY2) { // YUY2 format defined in VideoData with WidthDiv = 2 srcPlane.m_ippSize.width *= 2; dstPlane.m_ippSize.width *= 2; RectSrc.width *= 2; ippiResizeYUV422_8u_C2R((const uint8_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint8_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); return UMC_OK; } if (srcPlane.m_iSampleSize == sizeof(uint8_t)) { switch (srcPlane.m_iSamples) { case 1: ippiResize_8u_C1R((const uint8_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint8_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; case 3: ippiResize_8u_C3R((const uint8_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint8_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; case 4: ippiResize_8u_C4R((const uint8_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint8_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; default: return UMC_ERR_UNSUPPORTED; } } else if (srcPlane.m_iSampleSize == sizeof(uint16_t)) { switch (srcPlane.m_iSamples) { case 1: ippiResize_16u_C1R((const uint16_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint16_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; case 3: ippiResize_16u_C3R((const uint16_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint16_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; case 4: ippiResize_16u_C4R((const uint16_t *)srcPlane.m_pPlane, srcPlane.m_ippSize, (int32_t)srcPlane.m_nPitch, RectSrc, (uint16_t *)dstPlane.m_pPlane, (int32_t)dstPlane.m_nPitch, dstPlane.m_ippSize, xRatio, yRatio, mInterpolation); break; default: return UMC_ERR_UNSUPPORTED; } } else { return UMC_ERR_UNSUPPORTED; } } return UMC_OK; } #endif // #if defined (UMC_ENABLE_VPP_RESIZE) /* EOF */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/000077500000000000000000000000001443134507600253425ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/000077500000000000000000000000001443134507600267655ustar00rootroot00000000000000umc_h264_au_splitter.h000066400000000000000000000113061443134507600330220ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_AU_SPLITTER_H #define __UMC_H264_AU_SPLITTER_H #include #include "umc_h264_dec_defs_dec.h" #include "umc_media_data_ex.h" #include "umc_h264_heap.h" #include "umc_h264_slice_decoding.h" #include "umc_h264_frame_info.h" #include "umc_h264_headers.h" namespace UMC { class NALUnitSplitter; class NalUnit; /****************************************************************************************************/ // SeiPayloadArray class routine /****************************************************************************************************/ class SeiPayloadArray { public: SeiPayloadArray(); SeiPayloadArray(const SeiPayloadArray & payloads); ~SeiPayloadArray(); void Release(); void AddPayload(UMC_H264_DECODER::H264SEIPayLoad*); void MovePayloadsFrom(SeiPayloadArray &messages); UMC_H264_DECODER::H264SEIPayLoad* GetPayload(size_t pos) const; size_t GetPayloadCount() const; UMC_H264_DECODER::H264SEIPayLoad* FindPayload(SEI_TYPE type) const; protected: typedef std::vector PayloadArray; PayloadArray m_payloads; int32_t FindPayloadPos(SEI_TYPE type) const; }; /****************************************************************************************************/ // SetOfSlices class routine /****************************************************************************************************/ class SetOfSlices { public: SetOfSlices(); ~SetOfSlices(); SetOfSlices(const SetOfSlices& set); H264Slice * GetSlice(size_t pos) const; size_t GetSliceCount() const; void AddSlice(H264Slice * slice); void Release(); void Reset(); void SortSlices(); void CleanUseless(); void AddSet(const SetOfSlices *set); size_t GetViewId() const; H264DecoderFrame * m_frame; bool m_isCompleted; bool m_isFull; SeiPayloadArray m_payloads; SetOfSlices& operator=(const SetOfSlices& set); protected: std::vector m_pSliceQueue; }; /****************************************************************************************************/ // AccessUnit class routine /****************************************************************************************************/ class AccessUnit { public: AccessUnit(); virtual ~AccessUnit(); bool AddSlice(H264Slice * slice); void CombineSets(); void Release(); void Reset(); bool IsItSliceOfThisAU(H264Slice * slice); size_t GetLayersCount() const; SetOfSlices * GetLayer(size_t pos); SetOfSlices * GetLastLayer(); void CompleteLastLayer(); int32_t FindLayerByDependency(int32_t dependency); uint32_t GetAUIndentifier() const; void SortforASO(); void CleanUseless(); bool IsFullAU() const; bool m_isInitialized; SeiPayloadArray m_payloads; protected: SetOfSlices * GetLayerBySlice(H264Slice * slice); SetOfSlices * AddLayer(H264Slice * slice); std::vector m_layers; bool m_isFullAU; uint32_t m_auCounter; }; class AU_Splitter { public: AU_Splitter(H264_Heap_Objects *objectHeap); virtual ~AU_Splitter(); void Init(); void Close(); void Reset(); virtual NalUnit * GetNalUnit(MediaData * src); NALUnitSplitter * GetNalUnitSplitter(); protected: Headers m_Headers; H264_Heap_Objects *m_objHeap; protected: //Status DecodeHeaders(MediaDataEx *nalUnit); std::unique_ptr m_pNALSplitter; }; } // namespace UMC #endif // __UMC_H264_AU_SPLITTER_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_bitstream_headers.h000066400000000000000000000357401443134507600341640ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_BITSTREAM_HEADERS_H_ #define __UMC_H264_BITSTREAM_HEADERS_H_ #include "umc_structures.h" #include "umc_h264_dec_defs_dec.h" #define h264GetBits(current_data, offset, nbits, data) \ { \ uint32_t x; \ offset -= (nbits); \ if (offset >= 0) \ { \ x = current_data[0] >> (offset + 1); \ } \ else \ { \ offset += 32; \ x = current_data[1] >> (offset); \ x >>= 1; \ x += current_data[0] << (31 - offset); \ current_data++; \ } \ (data) = x & UMC::bits_data[nbits]; \ } #define h264UngetNBits(current_data, offset, nbits) \ { \ offset += (nbits); \ if (offset > 31) \ { \ offset -= 32; \ current_data--; \ } \ } #define SkipNBits(current_data, offset, nbits) \ { \ /* check error(s) */ \ assert((nbits) > 0 && (nbits) <= 32); \ assert(offset >= 0 && offset <= 31); \ /* decrease number of available bits */ \ offset -= (nbits); \ /* normalize bitstream pointer */ \ if (0 > offset) \ { \ offset += 32; \ current_data++; \ } \ /* check error(s) again */ \ assert(offset >= 0 && offset <= 31); \ } #define GetBits1(current_data, offset, data) \ { \ data = ((current_data[0] >> (offset)) & 1); \ offset -= 1; \ if (offset < 0) \ { \ offset = 31; \ current_data += 1; \ } \ } namespace UMC { extern const uint32_t bits_data[]; extern const int32_t mp_scan4x4[2][16]; extern const int32_t hp_scan8x8[2][64]; extern const uint16_t SAspectRatio[17][2]; extern const uint8_t default_intra_scaling_list4x4[16]; extern const uint8_t default_inter_scaling_list4x4[16]; extern const uint8_t default_intra_scaling_list8x8[64]; extern const uint8_t default_inter_scaling_list8x8[64]; class Headers; class H264BaseBitstream { public: H264BaseBitstream(); H264BaseBitstream(uint8_t * const pb, const uint32_t maxsize); virtual ~H264BaseBitstream(); // Reset the bitstream with new data pointer void Reset(uint8_t * const pb, const uint32_t maxsize); void Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize); inline uint32_t GetBits(const uint32_t nbits); // Read one VLC int32_t or uint32_t value from bitstream inline int32_t GetVLCElement(bool bIsSigned); // Reads one bit from the buffer. inline uint8_t Get1Bit(); inline bool IsBSLeft(size_t sizeToRead = 0); inline void CheckBSLeft(size_t sizeToRead = 0); inline bool IsBitsLeft(size_t sizeToRead = 0); inline void CheckBitsLeft(size_t sizeToRead = 0); // Check amount of data bool More_RBSP_Data(); inline size_t BytesDecoded(); inline size_t BitsDecoded(); inline size_t BytesLeft(); // Align bitstream pointer to the right inline void AlignPointerRight(); void GetOrg(uint32_t **pbs, uint32_t *size); void GetState(uint32_t **pbs, uint32_t *bitOffset); void SetState(uint32_t *pbs, uint32_t bitOffset); // Set current decoding position void SetDecodedBytes(size_t); // Set dummy buffer size in bytes void SetTailBsSize(const uint32_t nBytes); size_t BytesDecodedRoundOff() { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase); } protected: uint32_t *m_pbs; // (uint32_t *) pointer to the current position of the buffer. int32_t m_bitOffset; // (int32_t) the bit position (0 to 31) in the dword pointed by m_pbs. uint32_t *m_pbsBase; // (uint32_t *) pointer to the first byte of the buffer. uint32_t m_maxBsSize; // (uint32_t) maximum buffer size in bytes. uint32_t m_tailBsSize; // (uint32_t) dummy buffer size in bytes at the buffer end. }; class H264HeadersBitstream : public H264BaseBitstream { public: H264HeadersBitstream(); H264HeadersBitstream(uint8_t * const pb, const uint32_t maxsize); // Decode sequence parameter set Status GetSequenceParamSet(UMC_H264_DECODER::H264SeqParamSet *sps, bool ignoreLevelConstrain=false); Status GetSequenceParamSetSvcExt(UMC_H264_DECODER::H264SeqParamSetSVCExtension *pSPSSvcExt); Status GetSequenceParamSetSvcVuiExt(UMC_H264_DECODER::H264SeqParamSetSVCExtension *pSPSSvcExt); // Decode sequence parameter set extension Status GetSequenceParamSetExtension(UMC_H264_DECODER::H264SeqParamSetExtension *sps_ex); // Decode sequence param set MVC extension Status GetSequenceParamSetMvcExt(UMC_H264_DECODER::H264SeqParamSetMVCExtension *pSPSMvcExt); // Decoding picture's parameter set functions Status GetPictureParamSetPart1(UMC_H264_DECODER::H264PicParamSet *pps); Status GetPictureParamSetPart2(UMC_H264_DECODER::H264PicParamSet *pps, UMC_H264_DECODER::H264SeqParamSet const*); // Decode NAL unit prefix Status GetNalUnitPrefix(UMC_H264_DECODER::H264NalExtension *pExt, uint32_t NALRef_idc); // Decode NAL unit extension parameters Status GetNalUnitExtension(UMC_H264_DECODER::H264NalExtension *pExt); // Decoding slice header functions Status GetSliceHeaderPart1(UMC_H264_DECODER::H264SliceHeader *pSliceHeader); Status GetSliceHeaderPart2(UMC_H264_DECODER::H264SliceHeader *pSliceHeader, const UMC_H264_DECODER::H264PicParamSet *pps, const UMC_H264_DECODER::H264SeqParamSet *sps); Status GetSliceHeaderPart3(UMC_H264_DECODER::H264SliceHeader *pSliceHeader, UMC_H264_DECODER::PredWeightTable *pPredWeight_L0, UMC_H264_DECODER::PredWeightTable *pPredWeight_L1, UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo_L0, UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo_L1, UMC_H264_DECODER::AdaptiveMarkingInfo *pAdaptiveMarkingInfo, UMC_H264_DECODER::AdaptiveMarkingInfo *pBaseAdaptiveMarkingInfo, const UMC_H264_DECODER::H264PicParamSet *pps, const UMC_H264_DECODER::H264SeqParamSet *sps, const UMC_H264_DECODER::H264SeqParamSetSVCExtension *spsSvcExt); Status GetSliceHeaderPart4(UMC_H264_DECODER::H264SliceHeader *hdr, const UMC_H264_DECODER::H264SeqParamSetSVCExtension *spsSvcExt); // from slice header in // scalable extension NAL unit Status GetNALUnitType(NAL_Unit_Type &nal_unit_type, uint32_t &nal_ref_idc); // SEI part int32_t ParseSEI(const Headers & headers, UMC_H264_DECODER::H264SEIPayLoad *spl); int32_t sei_message(const Headers & headers, int32_t current_sps, UMC_H264_DECODER::H264SEIPayLoad *spl); int32_t sei_payload(const Headers & headers, int32_t current_sps, UMC_H264_DECODER::H264SEIPayLoad *spl); int32_t buffering_period(const Headers & headers, int32_t, UMC_H264_DECODER::H264SEIPayLoad *spl); int32_t pic_timing(const Headers & headers, int32_t current_sps, UMC_H264_DECODER::H264SEIPayLoad *spl); void user_data_registered_itu_t_t35(UMC_H264_DECODER::H264SEIPayLoad *spl); void recovery_point(UMC_H264_DECODER::H264SEIPayLoad *spl); int32_t dec_ref_pic_marking_repetition(const Headers & headers, int32_t current_sps, UMC_H264_DECODER::H264SEIPayLoad *spl); void unparsed_sei_message(UMC_H264_DECODER::H264SEIPayLoad *spl); void scalability_info(UMC_H264_DECODER::H264SEIPayLoad *spl); protected: Status DecRefBasePicMarking(UMC_H264_DECODER::AdaptiveMarkingInfo *pAdaptiveMarkingInfo, uint8_t &adaptive_ref_pic_marking_mode_flag); Status DecRefPicMarking(UMC_H264_DECODER::H264SliceHeader *hdr, UMC_H264_DECODER::AdaptiveMarkingInfo *pAdaptiveMarkingInfo); void GetScalingList4x4(H264ScalingList4x4 *scl, uint8_t *def, uint8_t *scl_type); void GetScalingList8x8(H264ScalingList8x8 *scl, uint8_t *def, uint8_t *scl_type); Status GetVUIParam(UMC_H264_DECODER::H264SeqParamSet *sps, UMC_H264_DECODER::H264VUI *vui); Status GetHRDParam(UMC_H264_DECODER::H264SeqParamSet *sps, UMC_H264_DECODER::H264VUI *vui); Status GetPredWeightTable(UMC_H264_DECODER::H264SliceHeader *hdr, const UMC_H264_DECODER::H264SeqParamSet *sps, UMC_H264_DECODER::PredWeightTable *pPredWeight_L0, UMC_H264_DECODER::PredWeightTable *pPredWeight_L1); }; void SetDefaultScalingLists(UMC_H264_DECODER::H264SeqParamSet * sps); inline void FillFlatScalingList4x4(H264ScalingList4x4 *scl) { for (int32_t i=0;i<16;i++) scl->ScalingListCoeffs[i] = 16; } inline void FillFlatScalingList8x8(H264ScalingList8x8 *scl) { for (int32_t i=0;i<64;i++) scl->ScalingListCoeffs[i] = 16; } inline void FillScalingList4x4(H264ScalingList4x4 *scl_dst, const uint8_t *coefs_src) { for (int32_t i=0;i<16;i++) scl_dst->ScalingListCoeffs[i] = coefs_src[i]; } inline void FillScalingList8x8(H264ScalingList8x8 *scl_dst, const uint8_t *coefs_src) { for (int32_t i=0;i<64;i++) scl_dst->ScalingListCoeffs[i] = coefs_src[i]; } inline bool DecodeExpGolombOne_H264_1u32s (uint32_t **ppBitStream, int32_t *pBitOffset, int32_t *pDst, int32_t remainingBits, int32_t isSigned) { uint32_t code; uint32_t info = 0; int32_t length = 1; /* for first bit read above*/ uint32_t thisChunksLength = 0; uint32_t sval; /* check error(s) */ /* Fast check for element = 0 */ if ((remainingBits < 1)) { throw h264_exception(UMC::UMC_ERR_INVALID_STREAM); } h264GetBits((*ppBitStream), (*pBitOffset), 1, code); remainingBits -= 1; if (code) { *pDst = 0; return true; } if ((remainingBits < 8)) { throw h264_exception(UMC::UMC_ERR_INVALID_STREAM); } h264GetBits((*ppBitStream), (*pBitOffset), 8, code); length += 8; remainingBits -= 8; /* find nonzero byte */ while (code == 0 && 32 > length) { if ((remainingBits < 8)) { throw h264_exception(UMC::UMC_ERR_INVALID_STREAM); } h264GetBits((*ppBitStream), (*pBitOffset), 8, code); length += 8; remainingBits -= 8; } /* find leading '1' */ while ((code & 0x80) == 0 && 32 > thisChunksLength) { code <<= 1; thisChunksLength++; } length -= 8 - thisChunksLength; h264UngetNBits((*ppBitStream), (*pBitOffset),8 - (thisChunksLength + 1)); remainingBits += 8 - (thisChunksLength + 1); /* skipping very long codes, let's assume what the code is corrupted */ if (32 <= length || 32 <= thisChunksLength) { uint32_t dwords; length -= (*pBitOffset + 1); dwords = length/32; length -= (32*dwords); *ppBitStream += (dwords + 1); *pBitOffset = 31 - length; *pDst = 0; return false; } /* Get info portion of codeword */ if (length) { if ((remainingBits < length)) { throw h264_exception(UMC::UMC_ERR_INVALID_STREAM); } h264GetBits((*ppBitStream), (*pBitOffset),length, info); } sval = ((1 << (length)) + (info) - 1); if (isSigned) { if (sval & 1) *pDst = (int32_t) ((sval + 1) >> 1); else *pDst = -((int32_t) (sval >> 1)); } else *pDst = (int32_t) sval; return true; } inline bool H264BaseBitstream::IsBSLeft(size_t sizeToRead) { size_t bitsDecoded = BitsDecoded(); return (bitsDecoded + sizeToRead * 8 <= m_maxBsSize * 8); } inline void H264BaseBitstream::CheckBSLeft(size_t sizeToRead) { if (!IsBSLeft(sizeToRead)) throw h264_exception(UMC_ERR_INVALID_STREAM); } inline bool H264BaseBitstream::IsBitsLeft(size_t sizeToRead) { size_t bitsDecoded = BitsDecoded(); return (bitsDecoded + sizeToRead <= m_maxBsSize * 8); } inline void H264BaseBitstream::CheckBitsLeft(size_t sizeToRead) { if (!IsBitsLeft(sizeToRead)) throw h264_exception(UMC_ERR_INVALID_STREAM); } inline uint32_t H264BaseBitstream::GetBits(const uint32_t nbits) { uint32_t w, n = nbits; CheckBitsLeft(n); h264GetBits(m_pbs, m_bitOffset, n, w); return(w); } inline int32_t H264BaseBitstream::GetVLCElement(bool bIsSigned) { int32_t sval = 0; int32_t remainingbits = (int32_t)((m_maxBsSize + m_tailBsSize) * 8) - (int32_t)BitsDecoded(); bool res = DecodeExpGolombOne_H264_1u32s(&m_pbs, &m_bitOffset, &sval, remainingbits, bIsSigned); if (!res) throw h264_exception(UMC_ERR_INVALID_STREAM); return sval; } inline uint8_t H264BaseBitstream::Get1Bit() { uint32_t w; CheckBitsLeft(1); GetBits1(m_pbs, m_bitOffset, w); return (uint8_t)w; } inline size_t H264BaseBitstream::BytesDecoded() { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase) + ((31 - m_bitOffset) >> 3); } inline size_t H264BaseBitstream::BitsDecoded() { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase) * 8 + (31 - m_bitOffset); } inline size_t H264BaseBitstream::BytesLeft() { return((int32_t)m_maxBsSize - (int32_t) BytesDecoded()); } inline void H264BaseBitstream::AlignPointerRight() { if ((m_bitOffset & 0x07) != 0x07) { m_bitOffset = (m_bitOffset | 0x07) - 8; if (m_bitOffset == -1) { m_bitOffset = 31; m_pbs++; } } } Status InitializePictureParamSet(UMC_H264_DECODER::H264PicParamSet *pps, const UMC_H264_DECODER::H264SeqParamSet *sps, bool isExtension); } // namespace UMC #endif // __UMC_H264_BITSTREAM_HEADERS_H_ #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_dec.h000066400000000000000000000072301443134507600313020ustar00rootroot00000000000000// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_DEC_H__ #define __UMC_H264_DEC_H__ #include "umc_video_decoder.h" namespace UMC { class H264VideoDecoderParams : public VideoDecoderParams { public: DYNAMIC_CAST_DECL(H264VideoDecoderParams, VideoDecoderParams); enum { ENTROPY_CODING_CAVLC = 0, ENTROPY_CODING_CABAC = 1 }; enum { H264_PROFILE_UNKNOWN = 0, H264_PROFILE_BASELINE = 66, H264_PROFILE_MAIN = 77, H264_PROFILE_SCALABLE_BASELINE = 83, H264_PROFILE_SCALABLE_HIGH = 86, H264_PROFILE_EXTENDED = 88, H264_PROFILE_HIGH = 100, H264_PROFILE_HIGH10 = 110, H264_PROFILE_MULTIVIEW_HIGH = 118, H264_PROFILE_HIGH422 = 122, H264_PROFILE_STEREO_HIGH = 128, H264_PROFILE_HIGH444 = 144, H264_PROFILE_ADVANCED444_INTRA = 166, H264_PROFILE_ADVANCED444 = 188, H264_PROFILE_HIGH444_PRED = 244, H264_PROFILE_CAVLC444_INTRA = 44 }; enum { H264_LEVEL_UNKNOWN = 0, H264_LEVEL_1 = 10, H264_LEVEL_11 = 11, H264_LEVEL_1b = 11, H264_LEVEL_12 = 12, H264_LEVEL_13 = 13, H264_LEVEL_2 = 20, H264_LEVEL_21 = 21, H264_LEVEL_22 = 22, H264_LEVEL_3 = 30, H264_LEVEL_31 = 31, H264_LEVEL_32 = 32, H264_LEVEL_4 = 40, H264_LEVEL_41 = 41, H264_LEVEL_42 = 42, H264_LEVEL_5 = 50, H264_LEVEL_51 = 51, H264_LEVEL_52 = 52, H264_LEVEL_6 = 60, H264_LEVEL_61 = 61, H264_LEVEL_62 = 62, H264_LEVEL_MAX = 62, H264_LEVEL_9 = 9 // for SVC profiles }; H264VideoDecoderParams() : m_entropy_coding_type(ENTROPY_CODING_CAVLC) , m_DPBSize(16) , m_auxiliary_format_idc(0) , m_bufferedFrames(0) { m_fullSize.width = 0; m_fullSize.height = 0; m_cropArea.top = 0; m_cropArea.bottom = 0; m_cropArea.left = 0; m_cropArea.right = 0; m_ignore_level_constrain = false; } int32_t m_entropy_coding_type; int32_t m_DPBSize; int32_t m_auxiliary_format_idc; mfxSize m_fullSize; UMC::sRECT m_cropArea; bool m_ignore_level_constrain; int32_t m_bufferedFrames; }; } // namespace UMC #endif // __UMC_H264_DEC_H__ #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_dec_debug.h000066400000000000000000000031741443134507600324530ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_DEC_DEBUG_H #define __UMC_H264_DEC_DEBUG_H #include "umc_h264_dec_defs_dec.h" //#define ENABLE_TRACE namespace UMC { #ifdef ENABLE_TRACE void Trace(vm_char const* format, ...); #if defined _DEBUG #define DEBUG_PRINT(x) Trace x static int pppp = 0; #else #define DEBUG_PRINT(x) #endif #else // ENABLE_TRACE #define DEBUG_PRINT(x) #endif // ENABLE_TRACE } // namespace UMC #endif // __UMC_H264_DEC_DEBUG_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_dec_defs_dec.h000066400000000000000000001270101443134507600330360ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_DEC_DEFS_DEC_H__ #define __UMC_H264_DEC_DEFS_DEC_H__ #if defined (__ICL) // remark #981: operands are evaluated in unspecified order #pragma warning(disable: 981) #endif #include #include "umc_structures.h" namespace UMC { // NAL unit definitions enum { NAL_STORAGE_IDC_BITS = 0x60, NAL_UNITTYPE_BITS = 0x1f }; // Although the standard allows for a minimum width or height of 4, this // implementation restricts the minimum value to 32. enum { FLD_STRUCTURE = 0, TOP_FLD_STRUCTURE = 0, BOTTOM_FLD_STRUCTURE = 1, FRM_STRUCTURE = 2, AFRM_STRUCTURE = 3 }; enum DisplayPictureStruct { DPS_UNKNOWN = 100, DPS_FRAME = 0, DPS_TOP, // one field DPS_BOTTOM, // one field DPS_TOP_BOTTOM, DPS_BOTTOM_TOP, DPS_TOP_BOTTOM_TOP, DPS_BOTTOM_TOP_BOTTOM, DPS_FRAME_DOUBLING, DPS_FRAME_TRIPLING }; enum // Valid QP range { QP_MAX = 51, QP_MIN = 0 }; enum { LIST_0 = 0, // Ref/mvs list 0 (L0) LIST_1 = 1 // Ref/mvs list 1 (L1) }; // default plane & coeffs types: typedef uint8_t PlaneYCommon; typedef uint8_t PlaneUVCommon; typedef PlaneYCommon * PlanePtrYCommon; typedef PlaneUVCommon * PlanePtrUVCommon; typedef int16_t CoeffsCommon; typedef CoeffsCommon * CoeffsPtrCommon; typedef enum { NAL_UT_UNSPECIFIED = 0, // Unspecified NAL_UT_SLICE = 1, // Coded Slice - slice_layer_no_partioning_rbsp NAL_UT_DPA = 2, // Coded Data partition A - dpa_layer_rbsp NAL_UT_DPB = 3, // Coded Data partition A - dpa_layer_rbsp NAL_UT_DPC = 4, // Coded Data partition A - dpa_layer_rbsp NAL_UT_IDR_SLICE = 5, // Coded Slice of a IDR Picture - slice_layer_no_partioning_rbsp NAL_UT_SEI = 6, // Supplemental Enhancement Information - sei_rbsp NAL_UT_SPS = 7, // Sequence Parameter Set - seq_parameter_set_rbsp NAL_UT_PPS = 8, // Picture Parameter Set - pic_parameter_set_rbsp NAL_UT_AUD = 9, // Access Unit Delimiter - access_unit_delimiter_rbsp NAL_UT_END_OF_SEQ = 10, // End of sequence end_of_seq_rbsp() NAL_UT_END_OF_STREAM = 11, // End of stream end_of_stream_rbsp NAL_UT_FD = 12, // Filler Data - filler_data_rbsp NAL_UT_SPS_EX = 13, // Sequence Parameter Set Extension - seq_parameter_set_extension_rbsp NAL_UT_PREFIX = 14, // Prefix NAL unit in scalable extension - prefix_nal_unit_rbsp NAL_UT_SUBSET_SPS = 15, // Subset Sequence Parameter Set - subset_seq_parameter_set_rbsp NAL_UT_AUXILIARY = 19, // Auxiliary coded picture NAL_UT_CODED_SLICE_EXTENSION = 20 // Coded slice in scalable/multiview extension } NAL_Unit_Type; // Note! The Picture Code Type values below are no longer used in the // core encoder. It only knows about slice types, and whether or not // the frame is IDR, Reference or Disposable. See enum above. enum EnumSliceCodType // Permitted MB Prediction Types { // ------------------------------------ PREDSLICE = 0, // I (Intra), P (Pred) BPREDSLICE = 1, // I, P, B (BiPred) INTRASLICE = 2, // I S_PREDSLICE = 3, // SP (SPred), I S_INTRASLICE = 4 // SI (SIntra), I }; inline FrameType SliceTypeToFrameType(EnumSliceCodType slice_type) { switch(slice_type) { case PREDSLICE: case S_PREDSLICE: return P_PICTURE; case BPREDSLICE: return B_PICTURE; case INTRASLICE: case S_INTRASLICE: return I_PICTURE; } return NONE_PICTURE; } typedef enum { SEI_BUFFERING_PERIOD_TYPE = 0, SEI_PIC_TIMING_TYPE = 1, SEI_PAN_SCAN_RECT_TYPE = 2, SEI_FILLER_TYPE = 3, SEI_USER_DATA_REGISTERED_TYPE = 4, SEI_USER_DATA_UNREGISTERED_TYPE = 5, SEI_RECOVERY_POINT_TYPE = 6, SEI_DEC_REF_PIC_MARKING_TYPE = 7, SEI_SPARE_PIC_TYPE = 8, SEI_SCENE_INFO_TYPE = 9, SEI_SUB_SEQ_INFO_TYPE = 10, SEI_SUB_SEQ_LAYER_TYPE = 11, SEI_SUB_SEQ_TYPE = 12, SEI_FULL_FRAME_FREEZE_TYPE = 13, SEI_FULL_FRAME_FREEZE_RELEASE_TYPE = 14, SEI_FULL_FRAME_SNAPSHOT_TYPE = 15, SEI_PROGRESSIVE_REF_SEGMENT_START_TYPE = 16, SEI_PROGRESSIVE_REF_SEGMENT_END_TYPE = 17, SEI_MOTION_CONSTRAINED_SG_SET_TYPE = 18, SEI_FILM_GRAIN_CHARACTERISTICS = 19, SEI_DEBLOCKING_FILTER_DISPLAY_PREFERENCE = 20, SEI_STEREO_VIDEO_INFO = 21, SEI_POST_FILTER_HINT = 22, SEI_TONE_MAPPING_INFO = 23, SEI_SCALABILITY_INFO = 24, SEI_SUB_PIC_SCALABLE_LAYER = 25, SEI_NON_REQUIRED_LAYER_REP = 26, SEI_PRIORITY_LAYER_INFO = 27, SEI_LAYERS_NOT_PRESENT = 28, SEI_LAYER_DEPENDENCY_CHANGE = 29, SEI_SCALABLE_NESTING = 30, SEI_BASE_LAYER_TEMPORAL_HRD = 31, SEI_QUALITY_LAYER_INTEGRITY_CHECK = 32, SEI_REDUNDANT_PIC_PROPERTY = 33, SEI_TL0_DEP_REP_INDEX = 34, SEI_TL_SWITCHING_POINT = 35, SEI_PARALLEL_DECODING_INFO = 36, SEI_MVC_SCAOLABLE_NESTING = 37, SEI_VIEW_SCALABILITY_INFO = 38, SEI_MULTIVIEW_SCENE_INFO = 39, SEI_MULTIVIEW_ACQUISITION_INFO = 40, SEI_NONT_REQUERED_VIEW_COMPONENT = 41, SEI_VIEW_DEPENDENCY_CHANGE = 42, SEI_OPERATION_POINTS_NOT_PRESENT = 43, SEI_BASE_VIEW_TEMPORAL_HRD = 44, SEI_FRAME_PACKING_ARRANGEMENT = 45, SEI_RESERVED = 50, SEI_NUM_MESSAGES } SEI_TYPE; #define IS_SKIP_DEBLOCKING_MODE_NON_REF (m_PermanentTurnOffDeblocking == 1) #define IS_SKIP_DEBLOCKING_MODE_PERMANENT (m_PermanentTurnOffDeblocking == 2) #define IS_SKIP_DEBLOCKING_MODE_PREVENTIVE (m_PermanentTurnOffDeblocking == 3) enum // unsigned enum { INVALID_DPB_OUTPUT_DELAY = 0xffffffff, }; enum // usual int { MAX_NUM_SEQ_PARAM_SETS = 32, MAX_NUM_PIC_PARAM_SETS = 256, MAX_NUM_REF_FRAMES = 32, MAX_NUM_REF_FIELDS = 32, MAX_NUM_MMCO_ENTRIES = 35, MAX_REF_FRAMES_IN_POC_CYCLE = 256, MAX_NUM_SLICE_GROUPS = 8, MAX_SLICE_GROUP_MAP_TYPE = 6, NUM_INTRA_TYPE_ELEMENTS = 16, COEFFICIENTS_BUFFER_SIZE = 16 * 51, MINIMAL_DATA_SIZE = 4, MAX_NUM_LAYERS = 16, DEFAULT_NU_HEADER_TAIL_VALUE = 0, // for sei DEFAULT_NU_TAIL_VALUE = 0, DEFAULT_NU_TAIL_SIZE = 128, DEFAULT_NU_SLICE_TAIL_SIZE = 512, }; // Possible values for disable_deblocking_filter_idc: enum DeblockingModes_t { DEBLOCK_FILTER_ON = 0, DEBLOCK_FILTER_OFF = 1, DEBLOCK_FILTER_ON_NO_SLICE_EDGES = 2, DEBLOCK_FILTER_ON_2_PASS = 3, DEBLOCK_FILTER_ON_NO_CHROMA = 4, DEBLOCK_FILTER_ON_NO_SLICE_EDGES_NO_CHROMA = 5, DEBLOCK_FILTER_ON_2_PASS_NO_CHROMA = 6 }; enum { H264_MAX_DEPENDENCY_ID = 7, // svc decoder H264_MAX_QUALITY_ID = 15,// svc decoder H264_MAX_TEMPORAL_ID = 7, // svc decoder H264_MAX_NUM_VIEW = 1024, H264_MAX_NUM_OPS = 64, H264_MAX_VUI_EXT_NUM = 1024, H264_MAX_NUM_VIEW_REF = 16 }; struct H264ScalingList4x4 { uint8_t ScalingListCoeffs[16]; }; struct H264ScalingList8x8 { uint8_t ScalingListCoeffs[64]; }; struct H264WholeQPLevelScale4x4 { int16_t LevelScaleCoeffs[88]/*since we do not support 422 and 444*/[16]; }; struct H264WholeQPLevelScale8x8 { int16_t LevelScaleCoeffs[88]/*since we do not support 422 and 444*/[64]; }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Memory class ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class RefCounter { public: RefCounter() : m_refCounter(0) { } void IncrementReference() const; void DecrementReference(); void ResetRefCounter() {m_refCounter = 0;} uint32_t GetRefCounter() {return m_refCounter;} protected: volatile mutable int32_t m_refCounter; virtual ~RefCounter() { } virtual void Free() { } }; class HeapObject : public RefCounter { public: virtual ~HeapObject() {} virtual void Reset() { } virtual void Free(); }; } // end namespace UMC namespace UMC_H264_DECODER { struct H264VUI { void Reset() { H264VUI vui = {}; // set some parameters by default vui.video_format = 5; // unspecified vui.video_full_range_flag = 0; vui.colour_primaries = 2; // unspecified vui.transfer_characteristics = 2; // unspecified vui.matrix_coefficients = 2; // unspecified *this = vui; } uint8_t aspect_ratio_info_present_flag; uint8_t aspect_ratio_idc; uint16_t sar_width; uint16_t sar_height; uint8_t overscan_info_present_flag; uint8_t overscan_appropriate_flag; uint8_t video_signal_type_present_flag; uint8_t video_format; uint8_t video_full_range_flag; uint8_t colour_description_present_flag; uint8_t colour_primaries; uint8_t transfer_characteristics; uint8_t matrix_coefficients; uint8_t chroma_loc_info_present_flag; uint8_t chroma_sample_loc_type_top_field; uint8_t chroma_sample_loc_type_bottom_field; uint8_t timing_info_present_flag; uint32_t num_units_in_tick; uint32_t time_scale; uint8_t fixed_frame_rate_flag; uint8_t nal_hrd_parameters_present_flag; uint8_t vcl_hrd_parameters_present_flag; uint8_t low_delay_hrd_flag; uint8_t pic_struct_present_flag; uint8_t bitstream_restriction_flag; uint8_t motion_vectors_over_pic_boundaries_flag; uint8_t max_bytes_per_pic_denom; uint8_t max_bits_per_mb_denom; uint8_t log2_max_mv_length_horizontal; uint8_t log2_max_mv_length_vertical; uint8_t num_reorder_frames; uint8_t max_dec_frame_buffering; //hrd_parameters uint8_t cpb_cnt; uint8_t bit_rate_scale; uint8_t cpb_size_scale; uint32_t bit_rate_value[32]; uint32_t cpb_size_value[32]; uint8_t cbr_flag[32]; uint8_t initial_cpb_removal_delay_length; uint8_t cpb_removal_delay_length; uint8_t dpb_output_delay_length; uint8_t time_offset_length; }; // Sequence parameter set structure, corresponding to the H.264 bitstream definition. struct H264SeqParamSetBase { uint8_t profile_idc; // baseline, main, etc. uint8_t level_idc; uint8_t constraint_set0_flag; uint8_t constraint_set1_flag; uint8_t constraint_set2_flag; uint8_t constraint_set3_flag; uint8_t constraint_set4_flag; uint8_t constraint_set5_flag; uint8_t chroma_format_idc; uint8_t residual_colour_transform_flag; uint8_t bit_depth_luma; uint8_t bit_depth_chroma; uint8_t qpprime_y_zero_transform_bypass_flag; uint8_t type_of_scaling_list_used[8]; uint8_t seq_scaling_matrix_present_flag; UMC::H264ScalingList4x4 ScalingLists4x4[6]; UMC::H264ScalingList8x8 ScalingLists8x8[2]; uint8_t gaps_in_frame_num_value_allowed_flag; uint8_t frame_cropping_flag; uint32_t frame_cropping_rect_left_offset; uint32_t frame_cropping_rect_right_offset; uint32_t frame_cropping_rect_top_offset; uint32_t frame_cropping_rect_bottom_offset; uint8_t seq_parameter_set_id; // id of this sequence parameter set uint8_t log2_max_frame_num; // Number of bits to hold the frame_num uint8_t pic_order_cnt_type; // Picture order counting method uint8_t delta_pic_order_always_zero_flag; // If zero, delta_pic_order_cnt fields are // present in slice header. uint8_t frame_mbs_only_flag; // Nonzero indicates all pictures in sequence // are coded as frames (not fields). uint8_t mb_adaptive_frame_field_flag; // Nonzero indicates frame/field switch // at macroblock level uint8_t direct_8x8_inference_flag; // Direct motion vector derivation method uint8_t vui_parameters_present_flag; // Zero indicates default VUI parameters uint32_t log2_max_pic_order_cnt_lsb; // Value of MaxPicOrderCntLsb. int32_t offset_for_non_ref_pic; int32_t offset_for_top_to_bottom_field; // Expected pic order count difference from // top field to bottom field. uint32_t num_ref_frames_in_pic_order_cnt_cycle; uint32_t num_ref_frames; // total number of pics in decoded pic buffer uint32_t frame_width_in_mbs; uint32_t frame_height_in_mbs; // These fields are calculated from values above. They are not written to the bitstream uint32_t MaxPicOrderCntLsb; // vui part H264VUI vui; int32_t poffset_for_ref_frame[UMC::MAX_REF_FRAMES_IN_POC_CYCLE]; // for pic order cnt type 1 uint8_t errorFlags; void Reset() { H264SeqParamSetBase sps = {}; *this = sps; } }; // H264SeqParamSet // Sequence parameter set structure, corresponding to the H.264 bitstream definition. struct H264SeqParamSet : public UMC::HeapObject, public H264SeqParamSetBase { H264SeqParamSet() : HeapObject() , H264SeqParamSetBase() { Reset(); } ~H264SeqParamSet() { } int32_t GetID() const { return seq_parameter_set_id; } virtual void Reset() { H264SeqParamSetBase::Reset(); seq_parameter_set_id = UMC::MAX_NUM_SEQ_PARAM_SETS; vui.Reset(); } }; // H264SeqParamSet // Sequence parameter set extension structure, corresponding to the H.264 bitstream definition. struct H264SeqParamSetExtension : public UMC::HeapObject { uint8_t seq_parameter_set_id; uint8_t aux_format_idc; uint8_t bit_depth_aux; uint8_t alpha_incr_flag; uint8_t alpha_opaque_value; uint8_t alpha_transparent_value; uint8_t additional_extension_flag; H264SeqParamSetExtension() { Reset(); } virtual void Reset() { aux_format_idc = 0; seq_parameter_set_id = UMC::MAX_NUM_SEQ_PARAM_SETS; // illegal id bit_depth_aux = 0; alpha_incr_flag = 0; alpha_opaque_value = 0; alpha_transparent_value = 0; additional_extension_flag = 0; } int32_t GetID() const { return seq_parameter_set_id; } }; // H264SeqParamSetExtension // MVC view's reference info structure struct H264ViewRefInfo { // ue(v) specifies the view_id of the view with VOIdx equal to i. uint32_t view_id; // ue(v) specifies the number of view components for inter-view prediction // in the initialised RefPicListX in decoding anchor view components with // VOIdx equal to i. The value of num_anchor_refs_lx[ i ] shall not // be greater than 15. uint8_t num_anchor_refs_lx[2]; // ue(v) specifies the view_id of the j-th view component for inter-view // prediction in the initialised RefPicListX in decoding anchor view // components with VOIdx equal to i. uint16_t anchor_refs_lx[2][UMC::H264_MAX_NUM_VIEW_REF]; // ue(v) specifies the number of view components for inter-view prediction // in the initialised RefPicListX in decoding non-anchor view components // with VOIdx equal to i. The value of num_non_anchor_refs_lx[ i ] // shall not be greater than 15 uint8_t num_non_anchor_refs_lx[2]; // ue(v) specifies the view_id of the j-th view component for inter-view // prediction in the initialised RefPicListX in decoding non-anchor view // components with VOIdx equal to i. uint16_t non_anchor_refs_lx[2][UMC::H264_MAX_NUM_VIEW_REF]; }; struct H264ApplicableOp { // u(3) specifies the temporal_id of the j-th operation point to which the // the level indicated by level_idc[ i ] applies. uint8_t applicable_op_temporal_id; // ue(v) plus 1 specifies the number of target output views for the j-th // operation point to which the level indicated by level_idc[ i ] applies. // The value of applicable_op_num_target_views_minus1[ i ][ j ] shall be in // the range of 0 to 1023, inclusive. uint16_t applicable_op_num_target_views_minus1; // ue(v) specifies the k-th target output view for the j-th operation point // to which the the level indicated by level_idc[ i ] applies. The value of // applicable_op_num_target_views_minus1[ i ][ j ] shall be in the // range of 0 to 1023, inclusive. std::vector applicable_op_target_view_id; // ue(v) plus 1 specifies the number of views required for decoding the // target output views corresponding to the j-th operation point to which // the level indicated by level_idc[ i ] applies. uint16_t applicable_op_num_views_minus1; }; struct H264LevelValueSignaled { // u(8) specifies the i-th level value signalled for the coded video sequence. uint8_t level_idc; // ue(v) plus 1 specifies the number of operation points to which the level // indicated by level_idc[ i ] applies. The value of // num_applicable_ops_minus1[ i ] shall be in the range of 0 to 1023, inclusive. uint16_t num_applicable_ops_minus1; // Array of applicable operation points for the current level value signalled std::vector opsInfo; }; // MVC extensions for sequence parameter set struct H264SeqParamSetMVCExtension : public H264SeqParamSet { // ue(v) plus 1 specifies the maximum number of coded views in the coded // video sequence. The value of num_view_minus1 shall be in the range of // 0 to 1023, inclusive uint32_t num_views_minus1; // Array of views reference info structures. std::vector viewInfo; // ue(v) plus 1 specifies the number of level values signalled for // the coded video sequence. The value of num_level_values_signalled_minus1 // shall be in the range of 0 to 63, inclusive. uint32_t num_level_values_signalled_minus1; // Array of level value signaled structures std::vector levelInfo; virtual void Reset() { //H264SeqParamSetBase::Reset(); num_views_minus1 = 0; num_level_values_signalled_minus1 = 0; //viewInfo.Clean(); //levelInfo.Clean(); } }; // SVC extensions for sequence parameter set struct H264SeqParamSetSVCExtension : public H264SeqParamSet { /* For scalable stream */ uint8_t inter_layer_deblocking_filter_control_present_flag; uint8_t extended_spatial_scalability; int8_t chroma_phase_x; int8_t chroma_phase_y; int8_t seq_ref_layer_chroma_phase_x; int8_t seq_ref_layer_chroma_phase_y; uint8_t seq_tcoeff_level_prediction_flag; uint8_t adaptive_tcoeff_level_prediction_flag; uint8_t slice_header_restriction_flag; int32_t seq_scaled_ref_layer_left_offset; int32_t seq_scaled_ref_layer_top_offset; int32_t seq_scaled_ref_layer_right_offset; int32_t seq_scaled_ref_layer_bottom_offset; virtual void Reset() { //H264SeqParamSetBase::Reset(); inter_layer_deblocking_filter_control_present_flag = 0; extended_spatial_scalability = 0; chroma_phase_x = 0; chroma_phase_y = 0; seq_ref_layer_chroma_phase_x = 0; seq_ref_layer_chroma_phase_y = 0; seq_tcoeff_level_prediction_flag = 0; adaptive_tcoeff_level_prediction_flag = 0; slice_header_restriction_flag = 0; seq_scaled_ref_layer_left_offset = 0; seq_scaled_ref_layer_top_offset = 0; seq_scaled_ref_layer_right_offset = 0; seq_scaled_ref_layer_bottom_offset = 0; } }; struct H264ScalingPicParams { UMC::H264ScalingList4x4 ScalingLists4x4[6]; UMC::H264ScalingList8x8 ScalingLists8x8[2]; // Level Scale addition UMC::H264WholeQPLevelScale4x4 m_LevelScale4x4[6]; UMC::H264WholeQPLevelScale8x8 m_LevelScale8x8[2]; }; // Picture parameter set structure, corresponding to the H.264 bitstream definition. struct H264PicParamSetBase { // Flexible macroblock order structure, defining the FMO map for a picture // paramter set. struct SliceGroupInfoStruct { uint8_t slice_group_map_type; // 0..6 // The additional slice group data depends upon map type union { // type 0 uint32_t run_length[UMC::MAX_NUM_SLICE_GROUPS]; // type 2 struct { uint32_t top_left[UMC::MAX_NUM_SLICE_GROUPS-1]; uint32_t bottom_right[UMC::MAX_NUM_SLICE_GROUPS-1]; }t1; // types 3-5 struct { uint8_t slice_group_change_direction_flag; uint32_t slice_group_change_rate; }t2; // type 6 struct { uint32_t pic_size_in_map_units; // number of macroblocks if no field coding }t3; }; std::vector pSliceGroupIDMap; // Id for each slice group map unit (for t3 struct of) }; // SliceGroupInfoStruct uint16_t pic_parameter_set_id; // of this picture parameter set uint8_t seq_parameter_set_id; // of seq param set used for this pic param set uint8_t entropy_coding_mode; // zero: CAVLC, else CABAC uint8_t bottom_field_pic_order_in_frame_present_flag; // Zero indicates only delta_pic_order_cnt[0] is // present in slice header; nonzero indicates // delta_pic_order_cnt[1] is also present. uint8_t weighted_pred_flag; // Nonzero indicates weighted prediction applied to // P and SP slices uint8_t weighted_bipred_idc; // 0: no weighted prediction in B slices // 1: explicit weighted prediction // 2: implicit weighted prediction int8_t pic_init_qp; // default QP for I,P,B slices int8_t pic_init_qs; // default QP for SP, SI slices int8_t chroma_qp_index_offset[2]; // offset to add to QP for chroma uint8_t deblocking_filter_variables_present_flag; // If nonzero, deblock filter params are // present in the slice header. uint8_t constrained_intra_pred_flag; // Nonzero indicates constrained intra mode uint8_t redundant_pic_cnt_present_flag; // Nonzero indicates presence of redundant_pic_cnt // in slice header uint32_t num_slice_groups; // One: no FMO uint32_t num_ref_idx_l0_active; // num of ref pics in list 0 used to decode the picture uint32_t num_ref_idx_l1_active; // num of ref pics in list 1 used to decode the picture uint8_t transform_8x8_mode_flag; uint8_t pic_scaling_matrix_present_flag; uint8_t pic_scaling_list_present_flag[8]; uint8_t type_of_scaling_list_used[8]; SliceGroupInfoStruct SliceGroupInfo; // Used only when num_slice_groups > 1 H264ScalingPicParams scaling[2]; uint8_t initialized[2]; uint8_t errorFlags; void Reset() { H264PicParamSetBase pps = {}; *this = pps; } }; // Picture parameter set structure, corresponding to the H.264 bitstream definition. struct H264PicParamSet : public UMC::HeapObject, public H264PicParamSetBase { H264PicParamSet() : H264PicParamSetBase() { Reset(); } void Reset() { H264PicParamSetBase::Reset(); pic_parameter_set_id = UMC::MAX_NUM_PIC_PARAM_SETS; seq_parameter_set_id = UMC::MAX_NUM_SEQ_PARAM_SETS; num_slice_groups = 0; SliceGroupInfo.pSliceGroupIDMap.clear(); } ~H264PicParamSet() { } int32_t GetID() const { return pic_parameter_set_id; } }; // H264PicParamSet struct RefPicListReorderInfo { uint32_t num_entries; // number of currently valid idc,value pairs uint8_t reordering_of_pic_nums_idc[UMC::MAX_NUM_REF_FRAMES]; uint32_t reorder_value[UMC::MAX_NUM_REF_FRAMES]; // abs_diff_pic_num or long_term_pic_num }; struct AdaptiveMarkingInfo { uint32_t num_entries; // number of currently valid mmco,value pairs uint8_t mmco[UMC::MAX_NUM_MMCO_ENTRIES]; // memory management control operation id uint32_t value[UMC::MAX_NUM_MMCO_ENTRIES *2]; // operation-dependent data, max 2 per operation }; struct PredWeightTable { uint8_t luma_weight_flag; // nonzero: luma weight and offset in bitstream uint8_t chroma_weight_flag; // nonzero: chroma weight and offset in bitstream int8_t luma_weight; // luma weighting factor int8_t luma_offset; // luma weighting offset int8_t chroma_weight[2]; // chroma weighting factor (Cb,Cr) int8_t chroma_offset[2]; // chroma weighting offset (Cb,Cr) }; // PredWeightTable typedef int32_t H264DecoderMBAddr; // NAL unit SVC extension structure struct H264NalSvcExtension { uint8_t idr_flag; uint8_t priority_id; uint8_t no_inter_layer_pred_flag; uint8_t dependency_id; uint8_t quality_id; uint8_t temporal_id; uint8_t use_ref_base_pic_flag; uint8_t discardable_flag; uint8_t output_flag; uint8_t store_ref_base_pic_flag; uint8_t adaptive_ref_base_pic_marking_mode_flag; AdaptiveMarkingInfo adaptiveMarkingInfo; void Reset() { idr_flag = 0; priority_id = 0; no_inter_layer_pred_flag = 0; dependency_id = 0; quality_id = 0; temporal_id = 0; use_ref_base_pic_flag = 0; discardable_flag = 0; output_flag = 0; store_ref_base_pic_flag = 0; adaptive_ref_base_pic_marking_mode_flag = 0; } }; // NAL unit SVC extension structure struct H264NalMvcExtension { uint8_t non_idr_flag; uint16_t priority_id; // view_id variable is duplicated to the slice header itself uint16_t view_id; uint8_t temporal_id; uint8_t anchor_pic_flag; uint8_t inter_view_flag; uint8_t padding[3]; void Reset() { non_idr_flag = 0; priority_id = 0; view_id = 0; temporal_id = 0; anchor_pic_flag = 0; inter_view_flag = 0; } }; // NAL unit extension structure struct H264NalExtension { uint8_t extension_present; uint8_t svc_extension_flag; // equal to 1 specifies that NAL extension contains SVC related parameters H264NalSvcExtension svc; H264NalMvcExtension mvc; void Reset() { memset(this, 0, sizeof(H264NalExtension)); } }; // Slice header structure, corresponding to the H.264 bitstream definition. struct H264SliceHeader { // flag equal 1 means that the slice belong to IDR or anchor access unit uint32_t IdrPicFlag; // specified that NAL unit contains any information accessed from // the decoding process of other NAL units. uint32_t nal_ref_idc; // specifies the type of RBSP data structure contained in the NAL unit as // specified in Table 7-1 of h264 standard UMC::NAL_Unit_Type nal_unit_type; // NAL unit extension parameters H264NalExtension nal_ext; uint16_t pic_parameter_set_id; // of pic param set used for this slice uint8_t field_pic_flag; // zero: frame picture, else field picture uint8_t MbaffFrameFlag; uint8_t bottom_field_flag; // zero: top field, else bottom field uint8_t direct_spatial_mv_pred_flag; // zero: temporal direct, else spatial direct uint8_t num_ref_idx_active_override_flag; // nonzero: use ref_idx_active from slice header // instead of those from pic param set uint8_t no_output_of_prior_pics_flag; // nonzero: remove previously decoded pictures // from decoded picture buffer uint8_t long_term_reference_flag; // How to set MaxLongTermFrameIdx uint32_t cabac_init_idc; // CABAC initialization table index (0..2) uint8_t adaptive_ref_pic_marking_mode_flag; // Ref pic marking mode of current picture int32_t slice_qp_delta; // to calculate default slice QP uint8_t sp_for_switch_flag; // SP slice decoding control int32_t slice_qs_delta; // to calculate default SP,SI slice QS uint32_t disable_deblocking_filter_idc; // deblock filter control, 0=filter all edges int32_t slice_alpha_c0_offset; // deblock filter c0, alpha table offset int32_t slice_beta_offset; // deblock filter beta table offset H264DecoderMBAddr first_mb_in_slice; int32_t frame_num; UMC::EnumSliceCodType slice_type; uint32_t idr_pic_id; // ID of an IDR picture int32_t pic_order_cnt_lsb; // picture order count (mod MaxPicOrderCntLsb) int32_t delta_pic_order_cnt_bottom; // Pic order count difference, top & bottom fields uint32_t difference_of_pic_nums; // Ref pic memory mgmt uint32_t long_term_pic_num; // Ref pic memory mgmt uint32_t long_term_frame_idx; // Ref pic memory mgmt uint32_t max_long_term_frame_idx; // Ref pic memory mgmt int32_t delta_pic_order_cnt[2]; // picture order count differences uint32_t redundant_pic_cnt; // for redundant slices int32_t num_ref_idx_l0_active; // num of ref pics in list 0 used to decode the slice, // see num_ref_idx_active_override_flag int32_t num_ref_idx_l1_active; // num of ref pics in list 1 used to decode the slice // see num_ref_idx_active_override_flag uint32_t slice_group_change_cycle; // for FMO uint8_t luma_log2_weight_denom; // luma weighting denominator uint8_t chroma_log2_weight_denom; // chroma weighting denominator bool is_auxiliary; /* for scalable stream */ uint8_t scan_idx_start; uint8_t scan_idx_end; uint32_t hw_wa_redundant_elimination_bits[3]; // [0] - start redundant element, [1] - end redundant element [2] - header size in bits }; // H264SliceHeader typedef struct { uint32_t layer_id; uint8_t priority_id; uint8_t discardable_flag; uint8_t dependency_id; uint8_t quality_id; uint8_t temporal_id; uint32_t frm_width_in_mbs; uint32_t frm_height_in_mbs; // frm_rate_info_present_flag section uint32_t constant_frm_rate_idc; uint32_t avg_frm_rate; // layer_dependency_info_present_flag uint32_t num_directly_dependent_layers; uint32_t directly_dependent_layer_id_delta_minus1[256]; uint32_t layer_dependency_info_src_layer_id_delta; } scalability_layer_info; struct H264SEIPayLoadBase { UMC::SEI_TYPE payLoadType; uint32_t payLoadSize; uint8_t isValid; union SEIMessages { struct BufferingPeriod { uint32_t initial_cpb_removal_delay[2][32]; uint32_t initial_cpb_removal_delay_offset[2][32]; }buffering_period; struct PicTiming { int32_t cbp_removal_delay; int32_t dpb_output_delay; UMC::DisplayPictureStruct pic_struct; uint8_t clock_timestamp_flag[16]; struct ClockTimestamps { uint8_t ct_type; uint8_t nunit_field_based_flag; uint8_t counting_type; uint8_t full_timestamp_flag; uint8_t discontinuity_flag; uint8_t cnt_dropped_flag; uint8_t n_frames; uint8_t seconds_value; uint8_t minutes_value; uint8_t hours_value; uint8_t time_offset; }clock_timestamps[16]; }pic_timing; struct PanScanRect { uint8_t pan_scan_rect_id; uint8_t pan_scan_rect_cancel_flag; uint8_t pan_scan_cnt; uint32_t pan_scan_rect_left_offset[32]; uint32_t pan_scan_rect_right_offset[32]; uint32_t pan_scan_rect_top_offset[32]; uint32_t pan_scan_rect_bottom_offset[32]; uint8_t pan_scan_rect_repetition_period; }pan_scan_rect; struct UserDataRegistered { uint8_t itu_t_t35_country_code; uint8_t itu_t_t35_country_code_extension_byte; } user_data_registered; struct RecoveryPoint { uint8_t recovery_frame_cnt; uint8_t exact_match_flag; uint8_t broken_link_flag; uint8_t changing_slice_group_idc; }recovery_point; struct DecRefPicMarkingRepetition { uint8_t original_idr_flag; uint8_t original_frame_num; uint8_t original_field_pic_flag; uint8_t original_bottom_field_flag; uint8_t long_term_reference_flag; AdaptiveMarkingInfo adaptiveMarkingInfo; }dec_ref_pic_marking_repetition; struct SparePic { uint32_t target_frame_num; uint8_t spare_field_flag; uint8_t target_bottom_field_flag; uint8_t num_spare_pics; uint8_t delta_spare_frame_num[16]; uint8_t spare_bottom_field_flag[16]; uint8_t spare_area_idc[16]; uint8_t *spare_unit_flag[16]; uint8_t *zero_run_length[16]; }spare_pic; struct SceneInfo { uint8_t scene_info_present_flag; uint8_t scene_id; uint8_t scene_transition_type; uint8_t second_scene_id; }scene_info; struct SubSeqInfo { uint8_t sub_seq_layer_num; uint8_t sub_seq_id; uint8_t first_ref_pic_flag; uint8_t leading_non_ref_pic_flag; uint8_t last_pic_flag; uint8_t sub_seq_frame_num_flag; uint8_t sub_seq_frame_num; }sub_seq_info; struct SubSeqLayerCharacteristics { uint8_t num_sub_seq_layers; uint8_t accurate_statistics_flag[16]; uint16_t average_bit_rate[16]; uint16_t average_frame_rate[16]; }sub_seq_layer_characteristics; struct SubSeqCharacteristics { uint8_t sub_seq_layer_num; uint8_t sub_seq_id; uint8_t duration_flag; uint8_t sub_seq_duration; uint8_t average_rate_flag; uint8_t accurate_statistics_flag; uint16_t average_bit_rate; uint16_t average_frame_rate; uint8_t num_referenced_subseqs; uint8_t ref_sub_seq_layer_num[16]; uint8_t ref_sub_seq_id[16]; uint8_t ref_sub_seq_direction[16]; }sub_seq_characteristics; struct FullFrameFreeze { uint32_t full_frame_freeze_repetition_period; }full_frame_freeze; struct FullFrameSnapshot { uint8_t snapshot_id; }full_frame_snapshot; struct ProgressiveRefinementSegmentStart { uint8_t progressive_refinement_id; uint8_t num_refinement_steps; }progressive_refinement_segment_start; struct MotionConstrainedSliceGroupSet { uint8_t num_slice_groups_in_set; uint8_t slice_group_id[8]; uint8_t exact_sample_value_match_flag; uint8_t pan_scan_rect_flag; uint8_t pan_scan_rect_id; }motion_constrained_slice_group_set; struct FilmGrainCharacteristics { uint8_t film_grain_characteristics_cancel_flag; uint8_t model_id; uint8_t separate_colour_description_present_flag; uint8_t film_grain_bit_depth_luma; uint8_t film_grain_bit_depth_chroma; uint8_t film_grain_full_range_flag; uint8_t film_grain_colour_primaries; uint8_t film_grain_transfer_characteristics; uint8_t film_grain_matrix_coefficients; uint8_t blending_mode_id; uint8_t log2_scale_factor; uint8_t comp_model_present_flag[3]; uint8_t num_intensity_intervals[3]; uint8_t num_model_values[3]; uint8_t intensity_interval_lower_bound[3][256]; uint8_t intensity_interval_upper_bound[3][256]; uint8_t comp_model_value[3][3][256]; uint8_t film_grain_characteristics_repetition_period; }film_grain_characteristics; struct DeblockingFilterDisplayPreference { uint8_t deblocking_display_preference_cancel_flag; uint8_t display_prior_to_deblocking_preferred_flag; uint8_t dec_frame_buffering_constraint_flag; uint8_t deblocking_display_preference_repetition_period; }deblocking_filter_display_preference; struct StereoVideoInfo { uint8_t field_views_flag; uint8_t top_field_is_left_view_flag; uint8_t current_frame_is_left_view_flag; uint8_t next_frame_is_second_view_flag; uint8_t left_view_self_contained_flag; uint8_t right_view_self_contained_flag; }stereo_video_info; struct ScalabilityInfo { uint8_t temporal_id_nesting_flag; uint8_t priority_layer_info_present_flag; uint8_t priority_id_setting_flag; uint32_t num_layers; } scalability_info; }SEI_messages; void Reset() { memset(this, 0, sizeof(H264SEIPayLoadBase)); payLoadType = UMC::SEI_RESERVED; payLoadSize = 0; } }; struct H264SEIPayLoad : public UMC::HeapObject, public H264SEIPayLoadBase { std::vector user_data; // for UserDataRegistered or UserDataUnRegistered H264SEIPayLoad() : H264SEIPayLoadBase() { } virtual void Reset() { H264SEIPayLoadBase::Reset(); user_data.clear(); } int32_t GetID() const { return payLoadType; } }; } // end of namespace UMC_H264_DECODER namespace UMC { enum { CHROMA_FORMAT_400 = 0, CHROMA_FORMAT_420 = 1, CHROMA_FORMAT_422 = 2, CHROMA_FORMAT_444 = 3 }; ///////////////// New structures struct ReferenceFlags // flags use for reference frames of slice { char field : 3; unsigned char isShortReference : 1; unsigned char isLongReference : 1; }; class h264_exception { public: h264_exception(int32_t status = -1) : m_Status(status) { } virtual ~h264_exception() { } int32_t GetStatus() const { return m_Status; } private: int32_t m_Status; }; template inline T * h264_new_array_throw(int32_t size) { T * t = new T[size]; if (!t) throw h264_exception(UMC_ERR_ALLOC); return t; } template inline T * h264_new_throw() { T * t = new T(); if (!t) throw h264_exception(UMC_ERR_ALLOC); return t; } inline ColorFormat GetUMCColorFormat(int32_t color_format) { ColorFormat format; switch(color_format) { case 0: format = GRAY; break; case 2: format = NV16; break; case 3: format = YUV444; break; case 1: default: format = NV12; break; } return format; } inline int32_t GetH264ColorFormat(ColorFormat color_format) { int32_t format; switch(color_format) { case GRAY: case GRAYA: format = 0; break; case YUV422A: case YUV422: case NV16: format = 2; break; case YUV444: case YUV444A: format = 3; break; case YUV420: case YUV420A: case NV12: case YV12: default: format = 1; break; } return format; } inline size_t CalculateSuggestedSize(const UMC_H264_DECODER::H264SeqParamSet * sps) { size_t base_size = sps->frame_width_in_mbs * sps->frame_height_in_mbs * 256; size_t size = 0; switch (sps->chroma_format_idc) { case 0: // YUV400 size = base_size; break; case 1: // YUV420 size = (base_size * 3) / 2; break; case 2: // YUV422 size = base_size + base_size; break; case 3: // YUV444 size = base_size + base_size + base_size; break; }; return size; } extern const uint32_t SubWidthC[4]; extern const uint32_t SubHeightC[4]; } // end namespace UMC #endif // __UMC_H264_DEC_DEFS_DEC_H__ #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_dec_defs_yuv.h000066400000000000000000000060771443134507600331370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_DEC_DEFS_YUV_H__ #define __UMC_H264_DEC_DEFS_YUV_H__ #include "umc_h264_dec_defs_dec.h" #include "umc_video_decoder.h" #include "umc_frame_data.h" namespace UMC { class H264DecYUVBufferPadded { DYNAMIC_CAST_DECL_BASE(H264DecYUVBufferPadded) public: int32_t m_bpp; // should be >= 8 int32_t m_chroma_format; // AVC standard value chroma_format_idc PlanePtrYCommon m_pYPlane; PlanePtrUVCommon m_pUVPlane; // for NV12 support PlanePtrUVCommon m_pUPlane; PlanePtrUVCommon m_pVPlane; H264DecYUVBufferPadded(); virtual ~H264DecYUVBufferPadded(); void Init(const VideoDataInfo *info); void allocate(const FrameData * frameData, const VideoDataInfo *info); void deallocate(); const mfxSize& lumaSize() const { return m_lumaSize; } const mfxSize& chromaSize() const { return m_chromaSize; } uint32_t pitch_luma() const { return m_pitch_luma; } uint32_t pitch_chroma() const { return m_pitch_chroma; } void setImageSize(mfxSize dimensions, int32_t chroma_format) { m_lumaSize.width = dimensions.width; m_lumaSize.height = dimensions.height; dimensions.width = dimensions.width >> ((int32_t) (3 > chroma_format)); dimensions.height = dimensions.height >> ((int32_t) (2 > chroma_format)); m_chromaSize.width = dimensions.width; m_chromaSize.height = dimensions.height; m_chroma_format = chroma_format; } FrameData * GetFrameData(); const FrameData * GetFrameData() const; ColorFormat GetColorFormat() const; protected: mfxSize m_lumaSize; mfxSize m_chromaSize; int32_t m_pitch_luma; int32_t m_pitch_chroma; FrameData m_frameData; ColorFormat m_color_format; }; } // namespace UMC #endif // __UMC_H264_DEC_DEFS_YUV_H__ #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_dec_mfx.h000066400000000000000000000044101443134507600321510ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_H264_DEC_MFX_H #define __UMC_H264_DEC_MFX_H #include #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_dec_defs_dec.h" #include "mfxdefs.h" #include "mfxstructures.h" namespace UMC { inline mfxU8 ConvertH264FrameTypeToMFX(int32_t slice_type) { mfxU8 mfx_type; switch(slice_type) { case UMC::INTRASLICE: mfx_type = MFX_FRAMETYPE_I; break; case UMC::PREDSLICE: mfx_type = MFX_FRAMETYPE_P; break; case UMC::BPREDSLICE: mfx_type = MFX_FRAMETYPE_B; break; case UMC::S_PREDSLICE: mfx_type = MFX_FRAMETYPE_P;//MFX_SLICETYPE_SP; break; case UMC::S_INTRASLICE: mfx_type = MFX_FRAMETYPE_I;//MFX_SLICETYPE_SI; break; default: assert(false); mfx_type = MFX_FRAMETYPE_I; } return mfx_type; } Status FillVideoParam(const UMC_H264_DECODER::H264SeqParamSet * seq, mfxVideoParam *par, bool full); Status FillVideoParamExtension(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * seqEx, mfxVideoParam *par); } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE #endif // __UMC_H264_DEC_MFX_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_frame.h000066400000000000000000000310421443134507600316370ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_FRAME_H__ #define __UMC_H264_FRAME_H__ #include "umc_h264_dec_defs_yuv.h" #include "umc_h264_slice_decoding.h" #include "umc_h264_frame_info.h" namespace UMC { class H264DecoderFrameInfo; class H264StreamOut; enum BusyStates { BUSY_STATE_FREE = 0, BUSY_STATE_LOCK1 = 1, BUSY_STATE_LOCK2 = 2, BUSY_STATE_NOT_DECODED = 3 }; class H264DecoderFrame : public H264DecYUVBufferPadded , public RefCounter { DYNAMIC_CAST_DECL(H264DecoderFrame, H264DecYUVBufferPadded) int32_t m_PictureStructureForRef; int32_t m_PicOrderCnt[2]; // Display order picture count mod MAX_PIC_ORDER_CNT. int32_t m_bottom_field_flag[2]; int32_t m_PicNum[2]; int32_t m_LongTermPicNum[2]; int32_t m_FrameNum; int32_t m_FrameNumWrap; int32_t m_LongTermFrameIdx; // ID of view the frame belongs to int32_t m_viewId; int32_t m_TopSliceCount; int32_t m_frameOrder; int32_t m_ErrorType; H264DecoderFrameInfo m_pSlicesInfo; H264DecoderFrameInfo m_pSlicesInfoBottom; bool prepared[2]; H264DecoderFrameInfo * GetAU(int32_t field = 0) { return (field) ? &m_pSlicesInfoBottom : &m_pSlicesInfo; } const H264DecoderFrameInfo * GetAU(int32_t field = 0) const { return (field) ? &m_pSlicesInfoBottom : &m_pSlicesInfo; } H264DecoderFrame *m_pPreviousFrame; H264DecoderFrame *m_pFutureFrame; UMC_H264_DECODER::H264SEIPayLoad m_UserData; double m_dFrameTime; bool m_isOriginalPTS; bool m_IsFrameExist; int32_t m_dpb_output_delay; int32_t m_PictureStructureForDec; DisplayPictureStruct m_displayPictureStruct; int32_t totalMBs; // For type 1 calculation of m_PicOrderCnt. m_FrameNum is needed to // be used as previous frame num. bool post_procces_complete; int32_t m_iNumberOfSlices; int32_t m_iResourceNumber; int32_t m_auIndex; int32_t m_index; int32_t m_UID; size_t m_ID[2]; FrameType m_FrameType; MemID m_MemID; int32_t m_RefPicListResetCount[2]; int32_t m_crop_left; int32_t m_crop_right; int32_t m_crop_top; int32_t m_crop_bottom; int32_t m_crop_flag; int32_t m_aspect_width; int32_t m_aspect_height; bool m_isShortTermRef[2]; bool m_isLongTermRef[2]; bool m_isInterViewRef[2]; bool m_bIDRFlag; bool m_bIFlag; bool IsFullFrame() const; void SetFullFrame(bool isFull); uint8_t m_isFull; uint8_t m_isDecoded; uint8_t m_isDecodingStarted; uint8_t m_isDecodingCompleted; uint8_t m_isSkipped; uint8_t m_wasDisplayed; uint8_t m_wasOutputted; typedef std::list ReferenceList; ReferenceList m_references; void FreeReferenceFrames(); void Reset(); virtual void FreeResources(); H264DecoderFrame( const H264DecoderFrame &s ); // no copy CTR H264DecoderFrame & operator=(const H264DecoderFrame &s ); public: void AddReference(RefCounter * reference); void OnDecodingCompleted(); virtual void Free() override; void SetSkipped(bool isSkipped) { m_isSkipped = (uint8_t) (isSkipped ? 1 : 0); } bool IsSkipped() const { return m_isSkipped != 0; } bool IsDecoded() const; bool IsFrameExist() const { return m_IsFrameExist; } void SetFrameAsNonExist() { m_IsFrameExist = false; m_isFull = true; m_isSkipped = true; m_isDecoded = 1; m_wasOutputted = 1; m_wasDisplayed = 1; } // m_pParsedFrameData's allocated size is remembered so that a // re-allocation is done only if size requirements exceed the // existing allocation. // m_paddedParsedFrameDataSize contains the image dimensions, // rounded up to a multiple of 16, that were used. H264DecoderFrame(MemoryAllocator *pMemoryAllocator, H264_Heap_Objects * pObjHeap); virtual ~H264DecoderFrame(); // The following methods provide access to the H264Decoder's doubly // linked list of H264DecoderFrames. Note that m_pPreviousFrame can // be non-NULL even for an I frame. H264DecoderFrame *previous() { return m_pPreviousFrame; } H264DecoderFrame *future() { return m_pFutureFrame; } const H264DecoderFrame *previous() const { return m_pPreviousFrame; } const H264DecoderFrame *future() const { return m_pFutureFrame; } void setPrevious(H264DecoderFrame *pPrev) { m_pPreviousFrame = pPrev; } void setFuture(H264DecoderFrame *pFut) { m_pFutureFrame = pFut; } bool IsDecodingStarted() const { return m_isDecodingStarted != 0;} void StartDecoding() { m_isDecodingStarted = 1;} bool IsDecodingCompleted() const { return m_isDecodingCompleted != 0;} void CompleteDecoding(); void UpdateErrorWithRefFrameStatus(); bool wasDisplayed() { return m_wasDisplayed != 0; } void setWasDisplayed() { m_wasDisplayed = 1; } bool wasOutputted() { return m_wasOutputted != 0; } void setWasOutputted(); bool isDisposable() { return (!IsFullFrame() || (m_wasOutputted && m_wasDisplayed)) && !GetRefCounter(); } // A decoded frame can be "disposed" if it is not an active reference // and it is not locked by the calling application and it has been // output for display. int32_t PicNum(int32_t f, int32_t force=0) const { if ((m_PictureStructureForRef >= FRM_STRUCTURE && force==0) || force==3) { return std::min(m_PicNum[0],m_PicNum[1]); } return m_PicNum[f]; } void setPicNum(int32_t picNum, int32_t f) { if (m_PictureStructureForRef >= FRM_STRUCTURE) { m_PicNum[0] = m_PicNum[1] = picNum; } else m_PicNum[f] = picNum; } // Updates m_LongTermPicNum for if long term reference, based upon // m_LongTermFrameIdx. int32_t FrameNum() const { return m_FrameNum; } void setFrameNum(int32_t FrameNum) { m_FrameNum = FrameNum; } int32_t FrameNumWrap() const { return m_FrameNumWrap; } void setFrameNumWrap(int32_t FrameNumWrap) { m_FrameNumWrap = FrameNumWrap; } void UpdateFrameNumWrap(int32_t CurrFrameNum, int32_t MaxFrameNum, int32_t CurrPicStruct); // Updates m_FrameNumWrap and m_PicNum if the frame is a short-term // reference and a frame number wrap has occurred. int32_t LongTermFrameIdx() const { return m_LongTermFrameIdx; } void setLongTermFrameIdx(int32_t LongTermFrameIdx) { m_LongTermFrameIdx = LongTermFrameIdx; } bool isShortTermRef(int32_t WhichField) const { if (m_PictureStructureForRef>=FRM_STRUCTURE ) return m_isShortTermRef[0] && m_isShortTermRef[1]; else return m_isShortTermRef[WhichField]; } int32_t isShortTermRef() const { return m_isShortTermRef[0] + m_isShortTermRef[1]*2; } void SetisShortTermRef(bool isRef, int32_t WhichField); int32_t PicOrderCnt(int32_t index, int32_t force=0) const { if ((m_PictureStructureForRef>=FRM_STRUCTURE && force==0) || force==3) { return std::min(m_PicOrderCnt[0],m_PicOrderCnt[1]); } else if (force==2) { if (isShortTermRef(0) && isShortTermRef(1)) return std::min(m_PicOrderCnt[0],m_PicOrderCnt[1]); else if (isShortTermRef(0)) return m_PicOrderCnt[0]; else return m_PicOrderCnt[1]; } return m_PicOrderCnt[index]; } size_t DeblockPicID(int32_t index) const { return m_ID[index]; } void setPicOrderCnt(int32_t PicOrderCnt, int32_t index) {m_PicOrderCnt[index] = PicOrderCnt;} bool isLongTermRef(int32_t WhichField) const { if (m_PictureStructureForRef>=FRM_STRUCTURE) return m_isLongTermRef[0] && m_isLongTermRef[1]; else return m_isLongTermRef[WhichField]; } int32_t isLongTermRef() const { return m_isLongTermRef[0] + m_isLongTermRef[1]*2; } void SetisLongTermRef(bool isRef, int32_t WhichField); int32_t LongTermPicNum(int32_t f, int32_t force=0) const { if ((m_PictureStructureForRef>=FRM_STRUCTURE && force==0) || force==3) { return std::min(m_LongTermPicNum[0],m_LongTermPicNum[1]); } else if (force==2) { if (isLongTermRef(0) && isLongTermRef(1)) return std::min(m_LongTermPicNum[0],m_LongTermPicNum[1]); else if (isLongTermRef(0)) return m_LongTermPicNum[0]; else return m_LongTermPicNum[1]; } return m_LongTermPicNum[f]; } void setLongTermPicNum(int32_t LongTermPicNum,int32_t f) {m_LongTermPicNum[f] = LongTermPicNum;} void UpdateLongTermPicNum(int32_t CurrPicStruct); bool isInterViewRef(uint32_t WhichField) const { if (m_PictureStructureForDec>=FRM_STRUCTURE ) return m_isInterViewRef[0]; else return m_isInterViewRef[WhichField]; } void SetInterViewRef(bool bInterViewRef, uint32_t WhichField) { if (m_PictureStructureForDec >= FRM_STRUCTURE) m_isInterViewRef[0] = m_isInterViewRef[1] = bInterViewRef; else m_isInterViewRef[WhichField] = bInterViewRef; } // set the view_id the frame belongs to void setViewId(uint32_t view_id) { m_viewId = view_id; } void IncreaseRefPicListResetCount(uint32_t f) { m_RefPicListResetCount[f]++; } void InitRefPicListResetCount(uint32_t f) { if (m_PictureStructureForRef >= FRM_STRUCTURE) m_RefPicListResetCount[0]=m_RefPicListResetCount[1]=0; else m_RefPicListResetCount[f]=0; } uint32_t RefPicListResetCount(int32_t f) const { if (m_PictureStructureForRef >= FRM_STRUCTURE) return std::max(m_RefPicListResetCount[0], m_RefPicListResetCount[1]); else return m_RefPicListResetCount[f]; } int8_t GetNumberByParity(int32_t parity) const { assert(!parity || parity == 1); return m_bottom_field_flag[1]==parity ? 1 : 0; } ////////////////////////////////////////////////////////////////////////////// // GetRefPicList // Returns pointer to start of specified ref pic list. ////////////////////////////////////////////////////////////////////////////// H264DecoderRefPicList* GetRefPicList(int32_t sliceNumber, int32_t list); int32_t GetError() const { return m_ErrorType; } void SetError(int32_t errorType) { m_ErrorType = errorType; } void SetErrorFlagged(int32_t errorType) { m_ErrorType |= errorType; } int32_t GetTotalMBs() const { return totalMBs; } protected: // Declare memory management tools MemoryAllocator *m_pMemoryAllocator; H264_Heap_Objects * m_pObjHeap; }; inline bool isAlmostDisposable(H264DecoderFrame * pTmp) { return (pTmp->m_wasOutputted || !pTmp->IsFullFrame())&& !pTmp->GetRefCounter(); } } // end namespace UMC #endif // __UMC_H264_FRAME_H__ #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_frame_info.h000066400000000000000000000261741443134507600326640ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_FRAME_INFO_H #define __UMC_H264_FRAME_INFO_H #include namespace UMC { class H264DecoderFrame; extern H264DecoderFrame g_GlobalFakeFrame; // Struct containing list 0 and list 1 reference picture lists for one slice. // Length is plus 1 to provide for null termination. class H264DecoderRefPicList { public: H264DecoderFrame **m_RefPicList; ReferenceFlags *m_Flags; H264DecoderRefPicList() { memset(this, 0, sizeof(H264DecoderRefPicList)); m_RefPicList = &(m_refPicList1[1]); m_Flags = &(m_flags1[1]); m_flags1[0].field = 0; m_flags1[0].isShortReference = 1; m_refPicList1[0] = &g_GlobalFakeFrame; } H264DecoderRefPicList(const H264DecoderRefPicList& copy) { m_RefPicList = &(m_refPicList1[1]); m_Flags = &(m_flags1[1]); MFX_INTERNAL_CPY(&m_refPicList1, ©.m_refPicList1, sizeof(m_refPicList1)); MFX_INTERNAL_CPY(&m_flags1, ©.m_flags1, sizeof(m_flags1)); } H264DecoderRefPicList& operator=(const H264DecoderRefPicList & copy) { MFX_INTERNAL_CPY(&m_refPicList1, ©.m_refPicList1, sizeof(m_refPicList1)); MFX_INTERNAL_CPY(&m_flags1, ©.m_flags1, sizeof(m_flags1)); return *this; } private: H264DecoderFrame *m_refPicList1[MAX_NUM_REF_FRAMES + 3]; ReferenceFlags m_flags1[MAX_NUM_REF_FRAMES + 3]; }; class H264DecoderLayer { public: enum FillnessStatus { STATUS_NONE, STATUS_NOT_FILLED, STATUS_FILLED, STATUS_COMPLETED, STATUS_STARTED }; H264DecoderLayer() { m_IsBottomField = false; m_IsSliceGroups = 0; } virtual ~H264DecoderLayer() { } protected: std::vector m_pSliceQueue; bool m_IsSliceGroups; bool m_IsBottomField; struct H264DecoderRefPicListPair { public: H264DecoderRefPicList m_refPicList[2]; }; std::vector m_refPicList; }; class H264DecoderFrameInfo : public H264DecoderLayer { public: H264DecoderFrameInfo(H264DecoderFrame * pFrame) : m_pFrame(pFrame) , m_prepared(0) , m_SliceCount(0) , decRefPicMarking() { Reset(); } virtual ~H264DecoderFrameInfo() { } bool IsSliceGroups() const { return m_IsSliceGroups; } bool IsField() const { return m_IsField; } void AddSlice(H264Slice * pSlice) { if (!m_SliceCount) { FillDecRefPicMarking(pSlice); // on first slice } m_refPicList.resize(pSlice->GetSliceNum() + 1); m_pSliceQueue.push_back(pSlice); m_SliceCount++; const UMC_H264_DECODER::H264SliceHeader &sliceHeader = *(pSlice->GetSliceHeader()); m_IsReferenceAU = m_IsReferenceAU || (sliceHeader.nal_ref_idc != 0); m_IsBottomField = sliceHeader.bottom_field_flag != 0; if (sliceHeader.nal_ext.extension_present && (0 == sliceHeader.nal_ext.svc_extension_flag) && (sliceHeader.nal_ext.mvc.inter_view_flag)) { m_IsReferenceAU = true; } m_IsIntraAU = m_IsIntraAU && (sliceHeader.slice_type == INTRASLICE); m_IsField = !!sliceHeader.field_pic_flag; m_IsIDR = sliceHeader.IdrPicFlag != 0; m_isBExist = m_isBExist || (sliceHeader.slice_type == BPREDSLICE); m_isPExist = m_isPExist || (sliceHeader.slice_type == PREDSLICE); m_IsNeedDeblocking = m_IsNeedDeblocking || (sliceHeader.disable_deblocking_filter_idc != DEBLOCK_FILTER_OFF); m_IsSliceGroups = pSlice->IsSliceGroups(); } const UMC_H264_DECODER::H264SEIPayLoadBase::SEIMessages::DecRefPicMarkingRepetition *GetDecRefPicMarking() const { return &decRefPicMarking; } void FillDecRefPicMarking(H264Slice * pSlice) { UMC_H264_DECODER::H264SliceHeader *hdr = pSlice->GetSliceHeader(); decRefPicMarking.original_idr_flag = (uint8_t)hdr->IdrPicFlag; decRefPicMarking.original_field_pic_flag = hdr->field_pic_flag; decRefPicMarking.original_bottom_field_flag = hdr->bottom_field_flag; decRefPicMarking.original_frame_num = (uint8_t)hdr->frame_num; decRefPicMarking.long_term_reference_flag = hdr->long_term_reference_flag; MFX_INTERNAL_CPY(&decRefPicMarking.adaptiveMarkingInfo, pSlice->GetAdaptiveMarkingInfo(), sizeof(UMC_H264_DECODER::AdaptiveMarkingInfo)); } uint32_t GetSliceCount() const { return m_SliceCount; } H264Slice* GetAnySlice() const { H264Slice* slice = GetSlice(0); if (!slice) throw h264_exception(UMC_ERR_FAILED); return slice; } H264Slice* GetSlice(int32_t num) const { if (num < 0 || num >= m_SliceCount) return 0; return m_pSliceQueue[num]; } void SwapSlices(uint32_t pos1, uint32_t pos2) { H264Slice* slice = m_pSliceQueue[pos2]; m_pSliceQueue[pos2] = m_pSliceQueue[pos1]; m_pSliceQueue[pos1] = slice; } H264Slice* GetSliceByNumber(int32_t num) const { size_t count = m_pSliceQueue.size(); for (uint32_t i = 0; i < count; i++) { if (m_pSliceQueue[i]->GetSliceNum() == num) return m_pSliceQueue[i]; } return 0; } int32_t GetPositionByNumber(int32_t num) const { size_t count = m_pSliceQueue.size(); for (uint32_t i = 0; i < count; i++) { if (m_pSliceQueue[i]->GetSliceNum() == num) return i; } return -1; } void Reset() { Free(); m_refPicList.clear(); m_iDecMBReady = 0; m_iRecMBReady = 0; m_IsNeedDeblocking = false; m_IsReferenceAU = false; m_IsIntraAU = true; m_IsField = false; m_IsIDR = false; m_isPExist = false; m_isBExist = false; m_IsBottomField = false; m_NextAU = 0; m_PrevAU = 0; m_RefAU = 0; m_IsSliceGroups = false; m_Status = STATUS_NONE; m_prepared = 0; } void SetStatus(FillnessStatus status) { m_Status = status; } FillnessStatus GetStatus () const { return m_Status; } void Free() { size_t count = m_pSliceQueue.size(); for (size_t i = 0; i < count; i ++) { H264Slice * pCurSlice = m_pSliceQueue[i]; pCurSlice->Release(); pCurSlice->DecrementReference(); } m_SliceCount = 0; m_pSliceQueue.clear(); m_prepared = 0; } void RemoveSlice(int32_t num) { H264Slice * pCurSlice = GetSlice(num); if (!pCurSlice) // nothing to do return; for (int32_t i = num; i < m_SliceCount - 1; i++) { m_pSliceQueue[i] = m_pSliceQueue[i + 1]; } m_SliceCount--; m_pSliceQueue[m_SliceCount] = pCurSlice; } bool IsNeedDeblocking () const { return m_IsNeedDeblocking; } void SkipDeblocking() { m_IsNeedDeblocking = false; for (int32_t i = 0; i < m_SliceCount; i ++) { H264Slice *pSlice = m_pSliceQueue[i]; pSlice->m_bDeblocked = true; pSlice->GetSliceHeader()->disable_deblocking_filter_idc = DEBLOCK_FILTER_OFF; } } bool IsCompleted() const { if (GetStatus() == H264DecoderFrameInfo::STATUS_COMPLETED) return true; for (int32_t i = 0; i < m_SliceCount; i ++) { const H264Slice *pSlice = m_pSliceQueue[i]; if (!pSlice->m_bDecoded || !pSlice->m_bDeblocked) return false; } return true; } bool IsBottom() const { return m_IsBottomField; } bool IsIntraAU() const { return m_IsIntraAU; } bool IsReference() const { return m_IsReferenceAU; } bool IsInterviewReference() const { H264Slice * slice = GetSlice(0); if (!slice) return false; return ( /*slice->GetSliceHeader()->nal_ext.extension_present && */ (0 == slice->GetSliceHeader()->nal_ext.svc_extension_flag) && slice->GetSliceHeader()->nal_ext.mvc.inter_view_flag); } void SetReference(bool isReference) { m_IsReferenceAU = isReference; } H264DecoderRefPicList* GetRefPicList(uint32_t sliceNumber, int32_t list) { assert(list <= LIST_1 && list >= 0); if (sliceNumber >= m_refPicList.size()) { return 0; } return &m_refPicList[sliceNumber].m_refPicList[list]; }; bool CheckReferenceFrameError(); H264DecoderFrameInfo * GetNextAU() {return m_NextAU;} H264DecoderFrameInfo * GetPrevAU() {return m_PrevAU;} H264DecoderFrameInfo * GetRefAU() {return m_RefAU;} void SetNextAU(H264DecoderFrameInfo *au) {m_NextAU = au;} void SetPrevAU(H264DecoderFrameInfo *au) {m_PrevAU = au;} void SetRefAU(H264DecoderFrameInfo *au) {m_RefAU = au;} int32_t m_iDecMBReady; int32_t m_iRecMBReady; H264DecoderFrame * m_pFrame; int32_t m_prepared; bool m_isBExist; bool m_isPExist; bool m_IsIDR; void IncreaseRefPicList(size_t newSize) // DEBUG !!! temporal solution { m_refPicList.resize(newSize); } private: FillnessStatus m_Status; int32_t m_SliceCount; bool m_IsNeedDeblocking; bool m_IsReferenceAU; bool m_IsIntraAU; bool m_IsField; H264DecoderFrameInfo *m_NextAU; H264DecoderFrameInfo *m_RefAU; H264DecoderFrameInfo *m_PrevAU; UMC_H264_DECODER::H264SEIPayLoadBase::SEIMessages::DecRefPicMarkingRepetition decRefPicMarking; class FakeFrameInitializer { public: FakeFrameInitializer(); }; static FakeFrameInitializer g_FakeFrameInitializer; }; } // namespace UMC #endif // __UMC_H264_FRAME_INFO_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_frame_list.h000066400000000000000000000116561443134507600327030ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_FRAME_LIST_H__ #define __UMC_H264_FRAME_LIST_H__ #include "umc_h264_frame.h" namespace UMC { class H264DecoderFrameList { public: // Default constructor H264DecoderFrameList(void); // Destructor virtual ~H264DecoderFrameList(void); H264DecoderFrame *head() { return m_pHead; } H264DecoderFrame *tail() { return m_pTail; } const H264DecoderFrame *head() const { return m_pHead; } const H264DecoderFrame *tail() const { return m_pTail; } bool isEmpty() { return !m_pHead; } void swapFrames(H264DecoderFrame *pFrame1, H264DecoderFrame *pFrame2); void append(H264DecoderFrame *pFrame); int32_t GetFreeIndex() { for (int32_t i = 0; i < 127; i++) { H264DecoderFrame *pFrm; for (pFrm = head(); pFrm && pFrm->m_index != i; pFrm = pFrm->future()) { } if (pFrm == NULL) { return i; } } assert(false); return -1; }; protected: // Release object void Release(void); H264DecoderFrame *m_pHead; // (H264DecoderFrame *) pointer to first frame in list H264DecoderFrame *m_pTail; // (H264DecoderFrame *) pointer to last frame in list }; class H264DBPList : public H264DecoderFrameList { public: H264DBPList(); bool IsDisposableExist(); bool IsAlmostDisposableExist(); H264DecoderFrame *GetDisposable(); // Search through the list for the disposable frame to decode into // Move disposable frame to tail void IncreaseRefPicListResetCount(H264DecoderFrame *excludeFrame); // Mark all frames as not used as reference frames. H264DecoderFrame * findLongTermRefIdx(int32_t LongTermFrameIdx); H264DecoderFrame * findOldLongTermRef(int32_t MaxLongTermFrameIdx); // Mark any long-term reference frame with LongTermFrameIdx greater // than MaxLongTermFrameIdx as not used. H264DecoderFrame * findOldestShortTermRef(); H264DecoderFrame * findOldestLongTermRef(); H264DecoderFrame *findShortTermPic(int32_t picNum, int32_t * field); H264DecoderFrame *findLongTermPic(int32_t picNum, int32_t * field); H264DecoderFrame *findInterViewRef(int32_t auIndex, uint32_t bottomFieldFlag); uint32_t countAllFrames(); void countActiveRefs(uint32_t &numShortTerm, uint32_t &numLongTerm); // Return number of active int16_t and long term reference frames. H264DecoderFrame * findDisplayableByDPBDelay(); H264DecoderFrame *findOldestDisplayable(int32_t dbpSize); // Search through the list for the oldest displayable frame. uint32_t countNumDisplayable(); // Return number of displayable frames. H264DecoderFrame * FindClosest(H264DecoderFrame * pFrame); H264DecoderFrame * FindByIndex(int32_t index); int32_t GetDPBSize() const { return m_dpbSize; } void SetDPBSize(int32_t dpbSize) { m_dpbSize = dpbSize; } int32_t GetRecoveryFrameCnt() const; void SetRecoveryFrameCnt(int32_t recovery_frame_cnt); // Reset the buffer and reset every single frame of it void Reset(void); void DebugPrint(); // reference list functions void InitPSliceRefPicList(H264Slice *slice, H264DecoderFrame **pRefPicList); void InitBSliceRefPicLists(H264Slice *slice, H264DecoderFrame **pRefPicList0, H264DecoderFrame **pRefPicList1, H264RefListInfo &rli); void AddInterViewRefs(H264Slice *slice, H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, uint32_t listNum, ViewList &views); protected: int32_t m_dpbSize; int32_t m_recovery_frame_cnt; bool m_wasRecoveryPointFound; }; } // end namespace UMC #endif // __UMC_H264_FRAME_LIST_H__ #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_headers.h000066400000000000000000000125411443134507600321630ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_HEADERS_H #define __UMC_H264_HEADERS_H #include "umc_h264_dec_defs_dec.h" #include "umc_h264_heap.h" #include "umc_h264_slice_decoding.h" namespace UMC { template class HeaderSet { public: HeaderSet(H264_Heap_Objects *pObjHeap) : m_pObjHeap(pObjHeap) , m_currentID(-1) { } virtual ~HeaderSet() { Reset(false); } T * AddHeader(T* hdr) { uint32_t id = hdr->GetID(); if (id >= m_Header.size()) { m_Header.resize(id + 1); } m_currentID = id; if (m_Header[id]) { m_Header[id]->DecrementReference(); } T * header = m_pObjHeap->AllocateObject(); *header = *hdr; //ref. counter may not be 0 here since it can be copied from given [hdr] object header->ResetRefCounter(); header->IncrementReference(); m_Header[id] = header; return header; } T * GetHeader(int32_t id) { if ((uint32_t)id >= m_Header.size()) { return 0; } return m_Header[id]; } const T * GetHeader(int32_t id) const { if ((uint32_t)id >= m_Header.size()) { return 0; } return m_Header[id]; } void RemoveHeader(void * hdr) { T * tmp = (T *)hdr; if (!tmp) { assert(false); return; } uint32_t id = tmp->GetID(); if (id >= m_Header.size()) { assert(false); return; } if (!m_Header[id]) { assert(false); return; } assert(m_Header[id] == hdr); m_Header[id]->DecrementReference(); m_Header[id] = 0; } void Reset(bool isPartialReset = false) { if (!isPartialReset) { for (uint32_t i = 0; i < m_Header.size(); i++) { if (m_Header[i]) m_Header[i]->DecrementReference(); } m_Header.clear(); m_currentID = -1; } } void SetCurrentID(int32_t id) { if (GetHeader(id)) m_currentID = id; } int32_t GetCurrentID() const { return m_currentID; } T * GetCurrentHeader() { if (m_currentID == -1) return 0; return GetHeader(m_currentID); } const T * GetCurrentHeader() const { if (m_currentID == -1) return 0; return GetHeader(m_currentID); } private: std::vector m_Header; H264_Heap_Objects *m_pObjHeap; int32_t m_currentID; }; /****************************************************************************************************/ // Headers stuff /****************************************************************************************************/ class Headers { public: Headers(H264_Heap_Objects *pObjHeap) : m_SeqParams(pObjHeap) , m_SeqExParams(pObjHeap) , m_SeqParamsMvcExt(pObjHeap) , m_SeqParamsSvcExt(pObjHeap) , m_PicParams(pObjHeap) , m_SEIParams(pObjHeap) { memset(&m_nalExtension, 0, sizeof(m_nalExtension)); } void Reset(bool isPartialReset = false) { m_SeqParams.Reset(isPartialReset); m_SeqExParams.Reset(isPartialReset); m_SeqParamsMvcExt.Reset(isPartialReset); m_SeqParamsSvcExt.Reset(isPartialReset); m_PicParams.Reset(isPartialReset); m_SEIParams.Reset(isPartialReset); } HeaderSet m_SeqParams; HeaderSet m_SeqExParams; HeaderSet m_SeqParamsMvcExt; HeaderSet m_SeqParamsSvcExt; HeaderSet m_PicParams; HeaderSet m_SEIParams; UMC_H264_DECODER::H264NalExtension m_nalExtension; }; } // namespace UMC #endif // __UMC_H264_HEADERS_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_heap.h000066400000000000000000000332761443134507600314750ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_HEAP_H #define __UMC_H264_HEAP_H #include #include "umc_mutex.h" #include "umc_h264_dec_defs_dec.h" #include "umc_media_data.h" namespace UMC { //*********************************************************************************************/ // //*********************************************************************************************/ class H264MemoryPiece { public: // Default constructor H264MemoryPiece() { m_pNext = 0; m_pts = 0; Reset(); } // Destructor ~H264MemoryPiece() { Release(); } void Release() { delete[] m_pSourceBuffer; Reset(); } void SetData(MediaData *out) { Release(); m_pDataPointer = (uint8_t*)out->GetDataPointer(); m_nDataSize = out->GetDataSize(); m_pts = out->GetTime(); } void MoveToInternalBuffer() { if (m_pSourceBuffer) return; m_nSourceSize = m_nDataSize + DEFAULT_NU_TAIL_SIZE; m_pSourceBuffer = h264_new_array_throw((int32_t)m_nSourceSize); MFX_INTERNAL_CPY(m_pSourceBuffer, m_pDataPointer, m_nDataSize); m_pDataPointer = m_pSourceBuffer; } // Allocate memory piece bool Allocate(size_t nSize) { Release(); // allocate little more m_pSourceBuffer = h264_new_array_throw((int32_t)nSize); m_pDataPointer = m_pSourceBuffer; m_nSourceSize = nSize; return true; } // Get next element H264MemoryPiece *GetNext(){return m_pNext;} // Obtain data pointer uint8_t *GetPointer(){return m_pDataPointer;} size_t GetSize() const {return m_nSourceSize;} size_t GetDataSize() const {return m_nDataSize;} void SetDataSize(size_t dataSize) {m_nDataSize = dataSize;} double GetTime() const {return m_pts;} void SetTime(double pts) {m_pts = pts;} protected: uint8_t *m_pSourceBuffer; // (uint8_t *) pointer to source memory uint8_t *m_pDataPointer; // (uint8_t *) pointer to source memory size_t m_nSourceSize; // (size_t) allocated memory size size_t m_nDataSize; // (size_t) data memory size H264MemoryPiece *m_pNext; // (H264MemoryPiece *) pointer to next memory piece double m_pts; void Reset() { m_pSourceBuffer = 0; m_pDataPointer = 0; m_nSourceSize = 0; m_nDataSize = 0; } private: H264MemoryPiece( const H264MemoryPiece &s ); // no copy CTR H264MemoryPiece & operator=(const H264MemoryPiece &s ); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Item class ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class H264_Heap_Objects; class Item { public: Item(H264_Heap_Objects * heap, void * ptr, size_t size, bool isTyped = false) : m_pNext(0) , m_Ptr(ptr) , m_Size(size) , m_isTyped(isTyped) , m_heap(heap) { } ~Item() { } Item* m_pNext; void * m_Ptr; size_t m_Size; bool m_isTyped; H264_Heap_Objects * m_heap; static Item * Allocate(H264_Heap_Objects * heap, size_t size, bool isTyped = false) { uint8_t * ppp = new uint8_t[size + sizeof(Item)]; if (!ppp) throw h264_exception(UMC_ERR_ALLOC); Item * item = new (ppp) Item(heap, 0, size, isTyped); item->m_Ptr = (uint8_t*)ppp + sizeof(Item); return item; } static void Free(Item *item) { if (item->m_isTyped) { HeapObject * obj = reinterpret_cast(item->m_Ptr); obj->~HeapObject(); } item->~Item(); delete[] (uint8_t*)item; } }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // H264_Heap_Objects class ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class H264_Heap_Objects { public: H264_Heap_Objects() : m_pFirstFree(0) { } virtual ~H264_Heap_Objects() { Release(); } Item * GetItemForAllocation(size_t size, bool typed = false) { if (!m_pFirstFree) { return 0; } if (m_pFirstFree->m_Size == size && m_pFirstFree->m_isTyped == typed) { Item * ptr = m_pFirstFree; m_pFirstFree = m_pFirstFree->m_pNext; return ptr; } Item * temp = m_pFirstFree; while (temp->m_pNext) { if (temp->m_pNext->m_Size == size && temp->m_pNext->m_isTyped == typed) { Item * ptr = temp->m_pNext; temp->m_pNext = temp->m_pNext->m_pNext; return ptr; } temp = temp->m_pNext; } return 0; } void* Allocate(size_t size, bool isTyped = false) { Item * item = GetItemForAllocation(size); if (!item) { item = Item::Allocate(this, size, isTyped); } return item->m_Ptr; } template T* Allocate(size_t size = sizeof(T), bool isTyped = false) { return (T*)Allocate(size, isTyped); } template T* AllocateObject() { Item * item = GetItemForAllocation(sizeof(T), true); if (!item) { void * ptr = Allocate(sizeof(T), true); return new(ptr) T(); } return (T*)(item->m_Ptr); } void FreeObject(void * obj, bool force = false) { Free(obj, force); } void Free(void * obj, bool force = false) { if (!obj) return; Item * item = (Item *) ((uint8_t*)obj - sizeof(Item)); // check Item * temp = m_pFirstFree; while (temp) { if (temp == item) { //was removed yet return; } temp = temp->m_pNext; } if (force) { Item::Free(item); return; } else { if (item->m_isTyped) { HeapObject * object = reinterpret_cast(item->m_Ptr); object->Reset(); } } item->m_pNext = m_pFirstFree; m_pFirstFree = item; } void Release() { while (m_pFirstFree) { Item *pTemp = m_pFirstFree->m_pNext; Item::Free(m_pFirstFree); m_pFirstFree = pTemp; } } private: Item * m_pFirstFree; }; //*********************************************************************************************/ // H264_List implementation //*********************************************************************************************/ template class H264_List { public: class Item : public HeapObject { public: Item(T *item, int32_t pid) : m_pNext(0) , m_Item(item) , m_pid(pid) { } virtual void Reset() { m_Item->Reset(); } Item * m_pNext; T *m_Item; int32_t m_pid; }; H264_List(H264_Heap_Objects * pObjHeap) : m_pHead(0) , m_pObjHeap(pObjHeap) { } ~H264_List() { Reset(); } void RemoveHead() { Item * tmp = m_pHead; m_pHead = m_pHead->m_pNext; m_pObjHeap->FreeObject(tmp); } void RemoveItem(T * item) { if (!m_pHead) { assert(false); return; } Item *tmp = m_pHead; if (tmp->m_Item == item) { m_pHead = m_pHead->m_pNext; m_pObjHeap->FreeObject(tmp); return; } while (tmp->m_pNext) { if (tmp->m_pNext->m_Item == item) { Item * list_item = tmp->m_pNext; tmp->m_pNext = tmp->m_pNext->m_pNext; m_pObjHeap->FreeObject(list_item); return; } tmp = tmp->m_pNext; } // it was removed before assert(false); } T * DetachItemByPid(int32_t pid) { if (!m_pHead) { return 0; } T * item = 0; Item *tmp = m_pHead; for (; tmp; tmp = tmp->m_pNext) { if (tmp->m_pid == pid) { item = tmp->m_Item; break; } } if (!tmp) return 0; tmp = m_pHead; if (tmp->m_Item == item) { m_pHead = m_pHead->m_pNext; m_pObjHeap->FreeObject(tmp); return item; } while (tmp->m_pNext) { if (tmp->m_pNext->m_Item == item) { Item * list_item = tmp->m_pNext; tmp->m_pNext = tmp->m_pNext->m_pNext; m_pObjHeap->FreeObject(list_item); return item; } tmp = tmp->m_pNext; } assert(false); return 0; } T* FindByPid(int32_t pid) { for (Item *tmp = m_pHead; tmp; tmp = tmp->m_pNext) { if (tmp->m_pid == pid) return tmp->m_Item; } return 0; } T* FindLastByPid(int32_t pid) const { T *last = 0; for (Item *tmp = m_pHead; tmp; tmp = tmp->m_pNext) { if (tmp->m_pid == pid) last = tmp->m_Item; } return last; } void AddItem(T *item, int32_t pid) { Item * buf = (Item*)m_pObjHeap->Allocate(sizeof(Item)); Item *newItem = new(buf) Item(item, pid); Item *tmp = m_pHead; if (m_pHead) { while (tmp->m_pNext) { tmp = tmp->m_pNext; } tmp->m_pNext = newItem; } else { m_pHead = newItem; } } T * GetHead() { return m_pHead->m_Item; } const T * GetHead() const { return m_pHead->m_Item; } void Reset() { for (Item *tmp = m_pHead; tmp; ) { Item *tmp1 = tmp; tmp = tmp->m_pNext; m_pObjHeap->FreeObject(tmp1); } m_pHead = 0; } private: Item * m_pHead; H264_Heap_Objects * m_pObjHeap; }; //*********************************************************************************************/ // //*********************************************************************************************/ class H264CoeffsBuffer : public HeapObject { public: // Default constructor H264CoeffsBuffer(void); // Destructor virtual ~H264CoeffsBuffer(void); // Initialize buffer Status Init(int32_t numberOfItems, int32_t sizeOfItem); bool IsInputAvailable() const; // Lock input buffer uint8_t* LockInputBuffer(); // Unlock input buffer bool UnLockInputBuffer(size_t size); bool IsOutputAvailable() const; // Lock output buffer bool LockOutputBuffer(uint8_t *& pointer, size_t &size); // Unlock output buffer bool UnLockOutputBuffer(); // Release object void Close(void); // Reset object virtual void Reset(void); virtual void Free(); protected: uint8_t *m_pbAllocatedBuffer; // (uint8_t *) pointer to allocated unaligned buffer size_t m_lAllocatedBufferSize; // (int32_t) size of allocated buffer uint8_t *m_pbBuffer; // (uint8_t *) pointer to allocated buffer size_t m_lBufferSize; // (int32_t) size of using buffer uint8_t *m_pbFree; // (uint8_t *) pointer to free space size_t m_lFreeSize; // (int32_t) size of free space size_t m_lItemSize; // (int32_t) size of output data portion struct BufferInfo { uint8_t * m_pPointer; size_t m_Size; BufferInfo *m_pNext; }; BufferInfo *m_pBuffers; // (Buffer *) queue of filled sample info private: H264CoeffsBuffer( const H264CoeffsBuffer &s ); // no copy CTR H264CoeffsBuffer & operator=(const H264CoeffsBuffer &s ); }; } // namespace UMC #endif // __UMC_H264_HEAP_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_mfx_supplier.h000066400000000000000000000102311443134507600332000ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_MFX_SUPPLIER_H #define __UMC_H264_MFX_SUPPLIER_H #include "umc_h264_task_supplier.h" #include "umc_media_data_ex.h" #include "umc_h264_task_broker.h" #include "mfxvideo++int.h" class VideoDECODEH264; namespace UMC { class RawHeader { public: RawHeader(); void Reset(); int32_t GetID() const; size_t GetSize() const; uint8_t * GetPointer(); void Resize(int32_t id, size_t newSize); protected: typedef std::vector BufferType; BufferType m_buffer; int32_t m_id; }; class RawHeaders { public: void Reset(); RawHeader * GetSPS(); RawHeader * GetPPS(); protected: RawHeader m_sps; RawHeader m_pps; }; /****************************************************************************************************/ // TaskSupplier /****************************************************************************************************/ class MFXTaskSupplier : public TaskSupplier, public RawHeaders { friend class ::VideoDECODEH264; public: MFXTaskSupplier(); virtual ~MFXTaskSupplier(); virtual Status Init(VideoDecoderParams *pInit); virtual void Reset(); virtual Status CompleteFrame(H264DecoderFrame * pFrame, int32_t field); virtual bool ProcessNonPairedField(H264DecoderFrame * pFrame); bool CheckDecoding(H264DecoderFrame * decoded); void SetVideoParams(mfxVideoParam * par); protected: virtual Status DecodeSEI(NalUnit *nalUnit); virtual void AddFakeReferenceFrame(H264Slice * pSlice); virtual Status DecodeHeaders(NalUnit *nalUnit); mfxStatus RunThread(mfxU32 threadNumber); mfxVideoParam m_firstVideoParams; private: MFXTaskSupplier & operator = (MFXTaskSupplier &) { return *this; } // MFXTaskSupplier & operator = (MFXTaskSupplier &) }; inline uint32_t ExtractProfile(mfxU32 profile) { return profile & 0xFF; } inline bool isMVCProfile(mfxU32 profile) { return (profile == MFX_PROFILE_AVC_MULTIVIEW_HIGH || profile == MFX_PROFILE_AVC_STEREO_HIGH); } #if defined(MFX_ENABLE_SVC_VIDEO_DECODE) inline bool isSVCProfile(mfxU32 profile) { return (profile == MFX_PROFILE_AVC_SCALABLE_BASELINE || profile == MFX_PROFILE_AVC_SCALABLE_HIGH); } #endif } // namespace UMC class MFX_Utility { public: static eMFXPlatform GetPlatform(VideoCORE * core, mfxVideoParam * par); static UMC::Status FillVideoParam(UMC::TaskSupplier * supplier, ::mfxVideoParam *par, bool full); static UMC::Status FillVideoParamMVCEx(UMC::TaskSupplier * supplier, ::mfxVideoParam *par); static UMC::Status DecodeHeader(UMC::TaskSupplier * supplier, UMC::H264VideoDecoderParams* params, mfxBitstream *bs, mfxVideoParam *out); static mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type); static bool CheckVideoParam(mfxVideoParam *in, eMFXHWType type); private: static bool IsNeedPartialAcceleration(mfxVideoParam * par, eMFXHWType type); }; #endif // __UMC_H264_MFX_SUPPLIER_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_nal_spl.h000066400000000000000000000120261443134507600321760ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_NAL_SPL_H #define __UMC_H264_NAL_SPL_H #include #include "umc_h264_dec_defs_dec.h" #include "umc_media_data_ex.h" #include "umc_h264_heap.h" namespace UMC { inline bool IsItAllowedCode(int32_t iCode) { return ((NAL_UT_SLICE <= (iCode & NAL_UNITTYPE_BITS)) && (NAL_UT_PPS >= (iCode & NAL_UNITTYPE_BITS)) && (NAL_UT_SEI != (iCode & NAL_UNITTYPE_BITS))) || (NAL_UT_SPS_EX == (iCode & NAL_UNITTYPE_BITS)) || (NAL_UT_AUXILIARY == (iCode & NAL_UNITTYPE_BITS)); } // bool IsItAllowedCode(int32_t iCode) inline bool IsHeaderCode(int32_t iCode) { return (NAL_UT_SPS == (iCode & NAL_UNITTYPE_BITS)) || (NAL_UT_SPS_EX == (iCode & NAL_UNITTYPE_BITS)) || (NAL_UT_PPS == (iCode & NAL_UNITTYPE_BITS)) || (NAL_UT_SUBSET_SPS == (iCode & NAL_UNITTYPE_BITS)); } inline bool IsVLCCode(int32_t iCode) { return ((NAL_UT_SLICE <= (iCode & NAL_UNITTYPE_BITS)) && (NAL_UT_IDR_SLICE >= (iCode & NAL_UNITTYPE_BITS))) || (NAL_UT_AUXILIARY == (iCode & NAL_UNITTYPE_BITS)) || (NAL_UT_CODED_SLICE_EXTENSION == (iCode & NAL_UNITTYPE_BITS)); } class MediaData; class NALUnitSplitter; class NalUnit : public MediaData { public: NalUnit() : MediaData() , m_nal_unit_type(NAL_UT_UNSPECIFIED) , m_use_external_memory(false) { } NAL_Unit_Type GetNalUnitType() const { return (NAL_Unit_Type)m_nal_unit_type; } bool IsUsedExternalMem() const { return m_use_external_memory; } int m_nal_unit_type; bool m_use_external_memory; }; class SwapperBase { public: virtual ~SwapperBase() {} virtual void SwapMemory(uint8_t *pDestination, size_t &nDstSize, uint8_t *pSource, size_t nSrcSize) = 0; virtual void SwapMemory(H264MemoryPiece * pMemDst, H264MemoryPiece * pMemSrc, uint8_t defaultValue = DEFAULT_NU_TAIL_VALUE) = 0; virtual void CopyBitStream(uint8_t *pDestination, uint8_t *pSource, size_t &nSrcSize) = 0; }; class StartCodeIteratorBase { public: StartCodeIteratorBase() : m_pSource(0) , m_nSourceSize(0) , m_pSourceBase(0) , m_nSourceBaseSize(0) , m_suggestedSize(10 * 1024) { } virtual ~StartCodeIteratorBase() { } virtual int32_t Init(MediaData * pSource) { m_pSourceBase = m_pSource = (uint8_t *) pSource->GetDataPointer(); m_nSourceBaseSize = m_nSourceSize = pSource->GetDataSize(); return -1; } int32_t GetCurrentOffset() { return (int32_t)(m_pSource - m_pSourceBase); } virtual void SetSuggestedSize(size_t size) { if (size > m_suggestedSize) m_suggestedSize = size; } virtual int32_t GetNext() = 0; virtual int32_t CheckNalUnitType(MediaData * pSource) = 0; virtual int32_t MoveToStartCode(MediaData * pSource) = 0; virtual int32_t GetNALUnit(MediaData * pSource, NalUnit * pDst) = 0; virtual void Reset() = 0; protected: uint8_t * m_pSource; size_t m_nSourceSize; uint8_t * m_pSourceBase; size_t m_nSourceBaseSize; size_t m_suggestedSize; }; class NALUnitSplitter { public: NALUnitSplitter(); virtual ~NALUnitSplitter(); virtual void Init(); virtual void Release(); virtual int32_t CheckNalUnitType(MediaData * pSource); virtual int32_t MoveToStartCode(MediaData * pSource); virtual NalUnit * GetNalUnits(MediaData * in); virtual void Reset(); virtual void SetSuggestedSize(size_t size) { if (!m_pStartCodeIter) return; m_pStartCodeIter->SetSuggestedSize(size); } SwapperBase * GetSwapper() { return m_pSwapper; } protected: SwapperBase * m_pSwapper; StartCodeIteratorBase * m_pStartCodeIter; NalUnit m_nalUnit; }; } // namespace UMC #endif // __UMC_H264_NAL_SPL_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_notify.h000066400000000000000000000101671443134507600320620ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_NOTIFY_H #define __UMC_H264_NOTIFY_H #include "umc_h264_heap.h" #include namespace UMC { class notifier_base { public: notifier_base() : next_(0) , m_isNeedNotification(true) { } virtual ~notifier_base() {} virtual void Notify() = 0; void ClearNotification() { m_isNeedNotification = false; } notifier_base * next_; protected: bool m_isNeedNotification; }; template class notifier0 : public notifier_base { public: typedef void (Object::*Function)(); notifier0(Object* object, Function function) : object_(object) , function_(function) { } virtual ~notifier0() { Notify(); } virtual void Notify() { if (m_isNeedNotification) { m_isNeedNotification = false; (object_->*function_)(); } } private: Object* object_; Function function_; }; template class notifierH : public notifier_base { public: notifierH(Object* object, Param1 param1) : object_(object) , param1_(param1) { } virtual ~notifierH() { Notify(); } virtual void Notify() { if (m_isNeedNotification) { m_isNeedNotification = false; (object_->Signal)(param1_); } } private: Object* object_; Param1 param1_; }; template class notifier1 : public notifier_base { public: typedef void (Object::*Function)(Param1 param1); notifier1(Object* object, Function function, Param1 param1) : object_(object) , function_(function) , param1_(param1) { } virtual ~notifier1() { Notify(); } virtual void Notify() { if (m_isNeedNotification) { m_isNeedNotification = false; (object_->*function_)(param1_); } } private: Object* object_; Function function_; Param1 param1_; }; template class notifier2 : public notifier_base { public: typedef void (Object::*Function)(Param1 param1, Param2 param2); notifier2(Object* object, Function function, Param1 param1, Param2 param2) : object_(object) , function_(function) , param1_(param1) , param2_(param2) { } virtual ~notifier2() { Notify(); } void SetParam1(Param1 param1) { param1_ = param1; } void SetParam2(Param2 param2) { param2_ = param2; } virtual void Notify() { if (m_isNeedNotification) { m_isNeedNotification = false; (object_->*function_)(param1_, param2_); } } private: Object* object_; Function function_; Param1 param1_; Param2 param2_; }; } // namespace UMC #endif // __UMC_H264_NOTIFY_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_segment_decoder_base.h000066400000000000000000000040701443134507600346100ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_SEGMENT_DECODER_BASE_H #define __UMC_H264_SEGMENT_DECODER_BASE_H #include "umc_h264_dec.h" namespace UMC { class H264Slice; class TaskBroker; class H264SegmentDecoderBase { public: H264SegmentDecoderBase(TaskBroker * pTaskBroker) : m_iNumber(0) , m_pTaskBroker(pTaskBroker) { } virtual ~H264SegmentDecoderBase() { } virtual UMC::Status Init(int32_t iNumber) { m_iNumber = iNumber; return UMC::UMC_OK; } // Decode slice's segment virtual UMC::Status ProcessSegment(void) = 0; virtual void RestoreErrorRect(int32_t , int32_t , H264Slice * ) { } protected: int32_t m_iNumber; // (int32_t) ordinal number of decoder TaskBroker * m_pTaskBroker; }; } // namespace UMC #endif /* __UMC_H264_SEGMENT_DECODER_BASE_H */ #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_segment_decoder_dxva.h000066400000000000000000000146341443134507600346470ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_SEGMENT_DECODER_DXVA_H #define __UMC_H264_SEGMENT_DECODER_DXVA_H #include "umc_va_base.h" #include #include "umc_h264_segment_decoder_base.h" #include "umc_h264_task_broker.h" #include "umc_h264_va_packer.h" #include "umc_h264_frame.h" #define UMC_VA_MAX_FRAME_BUFFER 32 //max number of uncompressed buffers #define SECOND_IN_US 1000000 namespace UMC { class TaskSupplier; class H264_DXVA_SegmentDecoderCommon : public H264SegmentDecoderBase { public: H264_DXVA_SegmentDecoderCommon(TaskSupplier * pTaskSupplier); VideoAccelerator *m_va; void SetVideoAccelerator(VideoAccelerator *va); protected: TaskSupplier * m_pTaskSupplier; private: H264_DXVA_SegmentDecoderCommon & operator = (H264_DXVA_SegmentDecoderCommon &) { return *this; } }; class H264_DXVA_SegmentDecoder : public H264_DXVA_SegmentDecoderCommon { public: H264_DXVA_SegmentDecoder(TaskSupplier * pTaskSupplier); ~H264_DXVA_SegmentDecoder(); // Initialize object virtual Status Init(int32_t iNumber); void PackAllHeaders(H264DecoderFrame * pFrame, int32_t field); virtual Status ProcessSegment(void); Packer * GetPacker() { return m_Packer.get();} virtual void Reset(); protected: std::unique_ptr m_Packer; private: H264_DXVA_SegmentDecoder & operator = (H264_DXVA_SegmentDecoder &) { return *this; } }; /****************************************************************************************************/ // DXVASupport class implementation /****************************************************************************************************/ template class DXVASupport { public: DXVASupport() : m_va(0) , m_Base(0) { } ~DXVASupport() { } void Init() { m_Base = (BaseClass*)(this); if (!m_va) return; } void Reset() { H264_DXVA_SegmentDecoder * dxva_sd = (H264_DXVA_SegmentDecoder*)(m_Base->m_pSegmentDecoder[0]); if (dxva_sd) dxva_sd->Reset(); } void DecodePicture(H264DecoderFrame * pFrame, int32_t field) { Status sts = 0; if (!m_va) return; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H264 decode DDISubmitTask"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(++FrameIndex, pFrame->GetFrameData()->GetFrameMID())); sts = m_va->BeginFrame(pFrame->GetFrameData()->GetFrameMID(), field); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, pFrame->GetFrameData()->GetFrameMID(), sts)); if (sts != UMC_OK) throw h264_exception(sts); H264_DXVA_SegmentDecoder * dxva_sd = (H264_DXVA_SegmentDecoder*)(m_Base->m_pSegmentDecoder[0]); assert(dxva_sd); for (uint32_t i = 0; i < m_Base->m_iThreadNum; i++) { ((H264_DXVA_SegmentDecoder *)m_Base->m_pSegmentDecoder[i])->SetVideoAccelerator(m_va); } dxva_sd->PackAllHeaders(pFrame, field); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(FrameIndex, m_va)); sts = m_va->EndFrame(); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, sts)); if (sts != UMC_OK) throw h264_exception(sts); } void SetVideoHardwareAccelerator(VideoAccelerator * va) { if (va) m_va = (VideoAccelerator*)va; } protected: VideoAccelerator *m_va; BaseClass * m_Base; }; class TaskBrokerSingleThreadDXVA : public TaskBroker { public: TaskBrokerSingleThreadDXVA(TaskSupplier * pTaskSupplier); virtual bool PrepareFrame(H264DecoderFrame * pFrame); // Get next working task virtual bool GetNextTaskInternal(H264Task *pTask); virtual void Start(); virtual void Reset(); void DXVAStatusReportingMode(bool mode) { m_useDXVAStatusReporting = mode; } protected: virtual void AwakeThreads(); class ReportItem { public: uint32_t m_index; uint32_t m_field; uint8_t m_status; ReportItem(uint32_t index, uint32_t field, uint8_t status) : m_index(index) , m_field(field) , m_status(status) { } bool operator == (const ReportItem & item) { return (item.m_index == m_index) && (item.m_field == m_field); } bool operator != (const ReportItem & item) { return (item.m_index != m_index) || (item.m_field != m_field); } }; // Check cached feedback if found // frame removed from cache and marked as completed bool CheckCachedFeedbackAndComplete(H264DecoderFrameInfo * au); // Mark frame as Completed and update Error stasus // according to uiStatus reported by driver void SetCompletedAndErrorStatus(uint8_t uiStatus, H264DecoderFrameInfo * au); typedef std::vector Report; Report m_reports; mfx::ResettableTimerMs timer; bool m_useDXVAStatusReporting; }; } // namespace UMC #endif /* __UMC_H264_SEGMENT_DECODER_DXVA_H */ #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_slice_decoding.h000066400000000000000000000313551443134507600334300ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_SLICE_DECODING_H #define __UMC_H264_SLICE_DECODING_H #include #include "umc_h264_dec_defs_dec.h" #include "umc_h264_dec.h" #include "umc_h264_bitstream_headers.h" #include "umc_h264_heap.h" #include "mfx_common.h" namespace UMC { struct H264RefListInfo { int32_t m_iNumShortEntriesInList; int32_t m_iNumLongEntriesInList; int32_t m_iNumFramesInL0List; int32_t m_iNumFramesInL1List; int32_t m_iNumFramesInLTList; H264RefListInfo() : m_iNumShortEntriesInList(0) , m_iNumLongEntriesInList(0) , m_iNumFramesInL0List(0) , m_iNumFramesInL1List(0) , m_iNumFramesInLTList(0) { } }; class H264MemoryPiece; class H264DecoderFrame; class H264DecoderFrameInfo; struct ViewItem; typedef std::list ViewList; class H264Slice : public HeapObject { // It is OK. H264SliceStore is owner of H264Slice object. // He can do what he wants. friend class H264SegmentDecoderMultiThreaded; friend class TaskSupplier; friend class TaskBroker; friend class TaskBrokerTwoThread; friend class H264DecoderFrameInfo; friend void PrintInfoStatus(H264DecoderFrameInfo * info); public: // Default constructor H264Slice(MemoryAllocator *pMemoryAllocator = 0); // Destructor virtual ~H264Slice(void); // Set slice source data virtual bool Reset(UMC_H264_DECODER::H264NalExtension *pNalExt); // Set current slice number void SetSliceNumber(int32_t iSliceNumber); virtual void FreeResources(); int32_t RetrievePicParamSetNumber(); // // method(s) to obtain slice specific information // // Obtain pointer to slice header const UMC_H264_DECODER::H264SliceHeader *GetSliceHeader(void) const {return &m_SliceHeader;} UMC_H264_DECODER::H264SliceHeader *GetSliceHeader(void) {return &m_SliceHeader;} // Obtain bit stream object H264HeadersBitstream *GetBitStream(void){return &m_BitStream;} // Obtain prediction weigth table const UMC_H264_DECODER::PredWeightTable *GetPredWeigthTable(int32_t iNum) const {return m_PredWeight[iNum & 1];} // Obtain first MB number int32_t GetFirstMBNumber(void) const {return m_iFirstMBFld;} int32_t GetStreamFirstMB(void) const {return m_iFirstMB;} void SetFirstMBNumber(int32_t x) {m_iFirstMB = x;} // Obtain MB width int32_t GetMBWidth(void) const {return m_iMBWidth;} // Obtain MB row width int32_t GetMBRowWidth(void) const {return (m_iMBWidth * (m_SliceHeader.MbaffFrameFlag + 1));} // Obtain MB height int32_t GetMBHeight(void) const {return m_iMBHeight;} // Obtain current picture parameter set number int32_t GetPicParamSet(void) const {return m_pPicParamSet->pic_parameter_set_id;} // Obtain current sequence parameter set number int32_t GetSeqParamSet(void) const {return m_pSeqParamSet->seq_parameter_set_id;} // Obtain current picture parameter set const UMC_H264_DECODER::H264PicParamSet *GetPicParam(void) const {return m_pPicParamSet;} void SetPicParam(const UMC_H264_DECODER::H264PicParamSet * pps) {m_pPicParamSet = pps;} // Obtain current sequence parameter set const UMC_H264_DECODER::H264SeqParamSet *GetSeqParam(void) const {return m_pSeqParamSet;} void SetSeqParam(const UMC_H264_DECODER::H264SeqParamSet * sps) {m_pSeqParamSet = sps;} // Obtain current sequence extension parameter set const UMC_H264_DECODER::H264SeqParamSetExtension *GetSeqParamEx(void) const {return m_pSeqParamSetEx;} void SetSeqExParam(const UMC_H264_DECODER::H264SeqParamSetExtension * spsex) {m_pSeqParamSetEx = spsex;} const UMC_H264_DECODER::H264SeqParamSetMVCExtension *GetSeqMVCParam(void) const {return m_pSeqParamSetMvcEx;} void SetSeqMVCParam(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * sps); const UMC_H264_DECODER::H264SeqParamSetSVCExtension *GetSeqSVCParam(void) const {return m_pSeqParamSetSvcEx;} void SetSeqSVCParam(const UMC_H264_DECODER::H264SeqParamSetSVCExtension * sps); // Obtain current destination frame H264DecoderFrame *GetCurrentFrame(void){return m_pCurrentFrame;} void SetCurrentFrame(H264DecoderFrame * pFrame){m_pCurrentFrame = pFrame;} // Obtain slice number int32_t GetSliceNum(void) const {return m_iNumber;} // Obtain maximum of macroblock int32_t GetMaxMB(void) const {return m_iMaxMB;} void SetMaxMB(int32_t x) {m_iMaxMB = x;} int32_t GetMBCount() const { return m_iMaxMB - m_iFirstMB;} // Check field slice bool IsField() const {return m_SliceHeader.field_pic_flag != 0;} // Check top field slice bool IsTopField() const {return m_SliceHeader.bottom_field_flag == 0;} // Check top field slice bool IsBottomField() const {return !IsTopField();} // Check slice organization bool IsSliceGroups(void) const {return (1 < m_pPicParamSet->num_slice_groups);}; // Do we require to do deblocking through slice boundaries bool DeblockThroughBoundaries(void) const {return (DEBLOCK_FILTER_ON_NO_SLICE_EDGES != m_SliceHeader.disable_deblocking_filter_idc);}; // Update reference list virtual Status UpdateReferenceList(ViewList &views, int32_t dIdIndex); // // Segment decoding mode's variables // UMC_H264_DECODER::AdaptiveMarkingInfo * GetAdaptiveMarkingInfo(); bool IsError() const {return m_bError;} bool IsReference() const {return m_SliceHeader.nal_ref_idc != 0;} void SetHeap(H264_Heap_Objects *pObjHeap) { m_pObjHeap = pObjHeap; } void CompleteDecoding(); public: H264MemoryPiece m_pSource; // (H264MemoryPiece *) pointer to owning memory piece double m_dTime; // (double) slice's time stamp public: // DEBUG !!!! should remove dependence void Reset(); virtual void Release(); virtual void ZeroedMembers(); // Decode slice header bool DecodeSliceHeader(UMC_H264_DECODER::H264NalExtension *pNalExt); // Reference list(s) management functions & tools int32_t AdjustRefPicListForFields(H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, H264RefListInfo &rli); void ReOrderRefPicList(H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo, int32_t MaxPicNum, ViewList &views, int32_t dIdIndex, uint32_t listNum); UMC_H264_DECODER::RefPicListReorderInfo ReorderInfoL0; // (RefPicListReorderInfo) reference list 0 info UMC_H264_DECODER::RefPicListReorderInfo ReorderInfoL1; // (RefPicListReorderInfo) reference list 1 info UMC_H264_DECODER::H264SliceHeader m_SliceHeader; // (H264SliceHeader) slice header H264HeadersBitstream m_BitStream; // (H264Bitstream) slice bit stream UMC_H264_DECODER::PredWeightTable m_PredWeight[2][MAX_NUM_REF_FRAMES]; // (PredWeightTable []) prediction weight table const UMC_H264_DECODER::H264PicParamSet* m_pPicParamSet; // (H264PicParamSet *) pointer to array of picture parameters sets const UMC_H264_DECODER::H264SeqParamSet* m_pSeqParamSet; // (H264SeqParamSet *) pointer to array of sequence parameters sets const UMC_H264_DECODER::H264SeqParamSetExtension* m_pSeqParamSetEx; const UMC_H264_DECODER::H264SeqParamSetMVCExtension* m_pSeqParamSetMvcEx; const UMC_H264_DECODER::H264SeqParamSetSVCExtension* m_pSeqParamSetSvcEx; H264DecoderFrame *m_pCurrentFrame; // (H264DecoderFrame *) pointer to destination frame int32_t m_iMBWidth; // (int32_t) width in macroblock units int32_t m_iMBHeight; // (int32_t) height in macroblock units int32_t m_iNumber; // (int32_t) current slice number int32_t m_iFirstMB; // (int32_t) first MB number in slice int32_t m_iMaxMB; // (int32_t) last unavailable MB number in slice int32_t m_iFirstMBFld; // (int32_t) first MB number in slice int32_t m_iAvailableMB; // (int32_t) available number of macroblocks (used in "unknown mode") bool m_bFirstDebThreadedCall; // (bool) "first threaded deblocking call" flag bool m_bPermanentTurnOffDeblocking; // (bool) "disable deblocking" flag bool m_bError; // (bool) there is an error in decoding bool m_isInitialized; UMC_H264_DECODER::AdaptiveMarkingInfo m_AdaptiveMarkingInfo; UMC_H264_DECODER::AdaptiveMarkingInfo m_BaseAdaptiveMarkingInfo; bool m_bDecoded; // (bool) "slice has been decoded" flag bool m_bPrevDeblocked; // (bool) "previous slice has been deblocked" flag bool m_bDeblocked; // (bool) "slice has been deblocked" flag bool m_bInited; // memory management tools MemoryAllocator *m_pMemoryAllocator; // (MemoryAllocator *) pointer to memory allocation tool H264_Heap_Objects *m_pObjHeap; }; inline bool IsPictureTheSame(H264Slice *pSliceOne, H264Slice *pSliceTwo) { if (!pSliceOne) return true; const UMC_H264_DECODER::H264SliceHeader *pOne = pSliceOne->GetSliceHeader(); const UMC_H264_DECODER::H264SliceHeader *pTwo = pSliceTwo->GetSliceHeader(); // this function checks two slices are from same picture or not // 7.4.1.2.4 and G.7.4.1.2.4 parts of h264 standard if (pOne->nal_ext.mvc.view_id != pTwo->nal_ext.mvc.view_id) { return false; } if (pOne->nal_ext.svc.dependency_id < pTwo->nal_ext.svc.dependency_id) return true; if (pOne->nal_ext.svc.dependency_id > pTwo->nal_ext.svc.dependency_id) return false; if (pOne->nal_ext.svc.quality_id < pTwo->nal_ext.svc.quality_id) return true; if (pOne->nal_ext.svc.quality_id > pTwo->nal_ext.svc.quality_id) return false; if ((pOne->frame_num != pTwo->frame_num) || //(pOne->first_mb_in_slice == pTwo->first_mb_in_slice) || // need to remove in case of duplicate slices !!! (pOne->pic_parameter_set_id != pTwo->pic_parameter_set_id) || (pOne->field_pic_flag != pTwo->field_pic_flag) || (pOne->bottom_field_flag != pTwo->bottom_field_flag)) return false; if ((pOne->nal_ref_idc != pTwo->nal_ref_idc) && (0 == std::min(pOne->nal_ref_idc, pTwo->nal_ref_idc))) return false; if (0 == pSliceTwo->GetSeqParam()->pic_order_cnt_type) { if ((pOne->pic_order_cnt_lsb != pTwo->pic_order_cnt_lsb) || (pOne->delta_pic_order_cnt_bottom != pTwo->delta_pic_order_cnt_bottom)) return false; } else { if ((pOne->delta_pic_order_cnt[0] != pTwo->delta_pic_order_cnt[0]) || (pOne->delta_pic_order_cnt[1] != pTwo->delta_pic_order_cnt[1])) return false; } if (pOne->IdrPicFlag != pTwo->IdrPicFlag) { return false; } if (pOne->IdrPicFlag) { if (pOne->idr_pic_id != pTwo->idr_pic_id) return false; } return true; } // bool IsPictureTheSame(H264SliceHeader *pOne, H264SliceHeader *pTwo) // Declare function to swapping memory extern void SwapMemoryAndRemovePreventingBytes(void *pDst, size_t &nDstSize, void *pSrc, size_t nSrcSize); } // namespace UMC #endif // __UMC_H264_SLICE_DECODING_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_task_broker.h000066400000000000000000000056261443134507600330050ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_TASK_BROKER_H #define __UMC_H264_TASK_BROKER_H #include #include #include "umc_h264_dec_defs_dec.h" #include "umc_h264_slice_decoding.h" #include "umc_h264_heap.h" namespace UMC { class TaskSupplier; class H264Task; /****************************************************************************************************/ // TaskBroker /****************************************************************************************************/ class TaskBroker { public: TaskBroker(TaskSupplier * pTaskSupplier); virtual bool Init(int32_t iConsumerNumber); virtual ~TaskBroker(); virtual bool AddFrameToDecoding(H264DecoderFrame * pFrame); virtual bool IsEnoughForStartDecoding(bool force); // Get next working task virtual bool GetNextTask(H264Task *pTask); virtual void Reset(); virtual void Release(); // Task was performed virtual void AddPerformedTask(H264Task *pTask); virtual void Start(); void Lock(); void Unlock(); TaskSupplier * m_pTaskSupplier; protected: bool IsFrameCompleted(H264DecoderFrame * pFrame); virtual bool GetNextTaskInternal(H264Task *pTask) = 0; virtual bool PrepareFrame(H264DecoderFrame * pFrame) = 0; void InitAUs(); H264DecoderFrameInfo * FindAU(); void SwitchCurrentAU(); virtual void CompleteFrame(H264DecoderFrame * frame); void RemoveAU(H264DecoderFrameInfo * toRemove); int32_t m_iConsumerNumber; H264DecoderFrameInfo * m_FirstAU; bool m_IsShouldQuit; typedef std::list FrameQueue; FrameQueue m_decodingQueue; FrameQueue m_completedQueue; Mutex m_mGuard; }; } // namespace UMC #endif // __UMC_H264_TASK_BROKER_H #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_task_supplier.h000066400000000000000000000623341443134507600333630ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_TASK_SUPPLIER_H #define __UMC_H264_TASK_SUPPLIER_H #include "umc_va_base.h" #include #include #include "umc_h264_dec_defs_dec.h" #include "umc_media_data_ex.h" #include "umc_h264_heap.h" #include "umc_h264_slice_decoding.h" #include "umc_h264_frame_info.h" #include "umc_h264_frame_list.h" #include "umc_h264_segment_decoder_base.h" #include "umc_h264_headers.h" #include "umc_frame_allocator.h" #include "umc_h264_au_splitter.h" namespace UMC { class TaskBroker; class H264DBPList; class H264DecoderFrame; class MediaData; class BaseCodecParams; class H264SegmentDecoderMultiThreaded; class TaskBrokerSingleThreadDXVA; class MemoryAllocator; struct H264IntraTypesProp; class LocalResources; enum { BASE_VIEW = 0, INVALID_VIEW_ID = 0xffffffff }; class ErrorStatus { public: bool IsExistHeadersError() const { return isSPSError || isPPSError; } protected: int32_t isSPSError; int32_t isPPSError; ErrorStatus() { Reset(); } void Reset() { isSPSError = 0; isPPSError = 0; } }; /****************************************************************************************************/ // DPBOutput class routine /****************************************************************************************************/ class DPBOutput { public: DPBOutput(); void Reset(bool disableDelayFeature = false); bool IsUseSEIDelayOutputValue() const; bool IsUsePicOrderCnt() const; bool IsUseDelayOutputValue() const; int32_t GetDPBOutputDelay(UMC_H264_DECODER::H264SEIPayLoad * payload); void OnNewSps(UMC_H264_DECODER::H264SeqParamSet * sps); private: struct { uint32_t use_payload_sei_delay : 1; uint32_t use_pic_order_cnt_type : 1; } m_isUseFlags; }; /****************************************************************************************************/ // Skipping class routine /****************************************************************************************************/ class Skipping { public: Skipping(); virtual ~Skipping(); void PermanentDisableDeblocking(bool disable); bool IsShouldSkipDeblocking(H264DecoderFrame * pFrame, int32_t field); bool IsShouldSkipFrame(H264DecoderFrame * pFrame, int32_t field); void ChangeVideoDecodingSpeed(int32_t& num); void Reset(); struct SkipInfo { bool isDeblockingTurnedOff; int32_t numberOfSkippedFrames; }; SkipInfo GetSkipInfo() const; private: int32_t m_VideoDecodingSpeed; int32_t m_SkipCycle; int32_t m_ModSkipCycle; int32_t m_PermanentTurnOffDeblocking; int32_t m_SkipFlag; int32_t m_NumberOfSkippedFrames; }; /****************************************************************************************************/ // POCDecoder /****************************************************************************************************/ class POCDecoder { public: POCDecoder(); virtual ~POCDecoder(); virtual void DecodePictureOrderCount(const H264Slice *slice, int32_t frame_num); int32_t DetectFrameNumGap(const H264Slice *slice, bool ignore_gaps_allowed_flag = false); // Set the POCs when frame gap is processed void DecodePictureOrderCountFrameGap(H264DecoderFrame *pFrame, const UMC_H264_DECODER::H264SliceHeader *pSliceHeader, int32_t frameNum); // Set the POCs when fake frames are imagined void DecodePictureOrderCountFakeFrames(H264DecoderFrame *pFrame, const UMC_H264_DECODER::H264SliceHeader *pSliceHeader); // Set the POCs when the frame is initialized void DecodePictureOrderCountInitFrame(H264DecoderFrame *pFrame, int32_t fieldIdx); void Reset(int32_t IDRFrameNum = 0); protected: int32_t m_PrevFrameRefNum; int32_t m_FrameNum; int32_t m_PicOrderCnt; int32_t m_PicOrderCntMsb; int32_t m_PicOrderCntLsb; int32_t m_FrameNumOffset; uint32_t m_TopFieldPOC; uint32_t m_BottomFieldPOC; }; /****************************************************************************************************/ // TaskSupplier /****************************************************************************************************/ class SEI_Storer { public: struct SEI_Message { size_t msg_size; size_t offset; uint8_t * data; double timestamp; SEI_TYPE type; int32_t isUsed; int32_t auID; int32_t inputID; H264DecoderFrame * frame; SEI_Message() : msg_size(0) , offset(0) , data(0) , timestamp(0) , type(SEI_RESERVED) , isUsed(0) , auID(0) , inputID(0) , frame(0) { } }; SEI_Storer(); virtual ~SEI_Storer(); void Init(); void Close(); void Reset(); void SetTimestamp(H264DecoderFrame * frame); SEI_Message* AddMessage(UMC::MediaDataEx *nalUnit, SEI_TYPE type, int32_t auIndex); const SEI_Message * GetPayloadMessage(); void SetFrame(H264DecoderFrame * frame, int32_t auIndex); void SetAUID(int32_t auIndex); private: enum { MAX_BUFFERED_SIZE = 16 * 1024, // 16 kb START_ELEMENTS = 10, MAX_ELEMENTS = 128 }; std::vector m_data; std::vector m_payloads; size_t m_offset; int32_t m_lastUsed; }; /****************************************************************************************************/ // ViewItem class routine /****************************************************************************************************/ struct ViewItem { // Default constructor ViewItem(void); // Copy constructor ViewItem(const ViewItem &src); // Copy assignment ViewItem &operator =(const ViewItem &src); ~ViewItem(); // Initialize th view, allocate resources Status Init(uint32_t view_id); // Close the view and release all resources void Close(void); // Reset the view and reset all resource void Reset(void); // Reset the size of DPB for particular view item void SetDPBSize(UMC_H264_DECODER::H264SeqParamSet *pSps, uint8_t & level_idc); H264DBPList *GetDPBList(int32_t dIdRev = 0) { return pDPB[dIdRev].get(); } POCDecoder *GetPOCDecoder(int32_t dIdRev = 0) { return pPOCDec[dIdRev].get(); } // Keep view ID to identify initialized views int32_t viewId; // Pointer to the view's DPB mutable std::unique_ptr pDPB[MAX_NUM_LAYERS]; // Pointer to the POC processing object mutable std::unique_ptr pPOCDec[MAX_NUM_LAYERS]; bool m_isDisplayable; // Maximum number frames used semultaneously uint32_t maxDecFrameBuffering; // Maximum possible long term reference index int32_t MaxLongTermFrameIdx[MAX_NUM_LAYERS]; // Pointer to the frame being processed H264DecoderFrame *pCurFrame; double localFrameTime; // SPS.VUI.(bitstream_restriction_flag == 1).max_num_reorder_frames uint32_t maxNumReorderFrames; }; typedef std::list ViewList; /****************************************************************************************************/ // MVC extension class routine /****************************************************************************************************/ class MVC_Extension { public: MVC_Extension(); virtual ~MVC_Extension(); Status Init(); virtual void Close(); virtual void Reset(); virtual bool IsShouldSkipSlice(H264Slice * slice); virtual bool IsShouldSkipSlice(UMC_H264_DECODER::H264NalExtension *nal_ext); uint32_t GetLevelIDC() const; void SetTemporalId(uint32_t temporalId); Status SetViewList(const std::vector & targetView, const std::vector & dependencyList); ViewItem *FindView(int32_t viewId); ViewItem &GetView(int32_t viewId = -1); ViewItem &GetViewByNumber(int32_t viewNum); void MoveViewToHead(int32_t view_id); int32_t GetViewCount() const; bool IncreaseCurrentView(); int32_t GetBaseViewId() const; bool IsExtension() const; // MVC or SVC protected: uint32_t m_temporal_id; uint32_t m_priority_id; uint8_t m_level_idc; uint32_t m_currentDisplayView; uint32_t m_currentView; enum DecodingMode { UNKNOWN_DECODING_MODE, AVC_DECODING_MODE, MVC_DECODING_MODE, SVC_DECODING_MODE }; DecodingMode m_decodingMode; typedef std::list ViewIDsList; ViewIDsList m_viewIDsList; // Array of pointers to views and their components ViewList m_views; void ChooseLevelIdc(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * extension, uint8_t baseViewLevelIDC, uint8_t extensionLevelIdc); void AnalyzeDependencies(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * extension); Status AllocateView(int32_t view_id); ViewItem & AllocateAndInitializeView(H264Slice * slice); }; /****************************************************************************************************/ // SVC extension class routine /****************************************************************************************************/ class SVC_Extension : public MVC_Extension { public: SVC_Extension(); virtual ~SVC_Extension(); virtual void Reset(); virtual void Close(); virtual bool IsShouldSkipSlice(H264Slice * slice); virtual bool IsShouldSkipSlice(UMC_H264_DECODER::H264NalExtension *nal_ext); void ChooseLevelIdc(const UMC_H264_DECODER::H264SeqParamSetSVCExtension * extension, uint8_t baseViewLevelIDC, uint8_t extensionLevelIdc); void SetSVCTargetLayer(uint32_t dependency_id, uint32_t quality_id, uint32_t temporal_id); protected: uint32_t m_dependency_id; uint32_t m_quality_id; }; /****************************************************************************************************/ // DecReferencePictureMarking /****************************************************************************************************/ class DecReferencePictureMarking { public: DecReferencePictureMarking(); Status UpdateRefPicMarking(ViewItem &view, H264DecoderFrame * pFrame, H264Slice * pSlice, int32_t field_index); void SlideWindow(ViewItem &view, H264Slice * pSlice, int32_t field_index); void ResetUnusedFrames(ViewItem &view); void Reset(); void CheckSEIRepetition(ViewItem &view, H264DecoderFrame * frame); Status CheckSEIRepetition(ViewItem &view, UMC_H264_DECODER::H264SEIPayLoad *payload); uint32_t GetDPBError() const; protected: uint32_t m_isDPBErrorFound; enum ChangeItemFlags { SHORT_TERM = 0x00000001, LONG_TERM = 0x00000002, FULL_FRAME = 0x00000010, BOTTOM_FIELD = 0x00000020, TOP_FIELD = 0x00000040, SET_REFERENCE = 0x00000100, UNSET_REFERENCE = 0x00000200 }; struct DPBChangeItem { struct { uint8_t isShortTerm : 1; // short or long uint8_t isSet : 1; // set or free uint8_t isFrame : 1; // full frame uint8_t isBottom : 1; // if doesn't full frame is it top or bottom? } m_type; H264DecoderFrame * m_pRefFrame; H264DecoderFrame * m_pCurrentFrame; }; typedef std::list DPBCommandsList; DPBCommandsList m_commandsList; int32_t m_frameCount; DPBChangeItem* AddItem(DPBCommandsList & list, H264DecoderFrame * currentFrame, H264DecoderFrame * refFrame, uint32_t flags); DPBChangeItem* AddItemAndRun(H264DecoderFrame * currentFrame, H264DecoderFrame * refFrame, uint32_t flags); void Undo(const DPBChangeItem * item); void Redo(const DPBChangeItem * item); void MakeChange(bool isUndo, const DPBChangeItem * item); void Undo(const H264DecoderFrame * frame); void Redo(const H264DecoderFrame * frame); void MakeChange(bool isUndo, const H264DecoderFrame * frame); void Remove(H264DecoderFrame * frame); void RemoveOld(); #ifdef _DEBUG void DebugPrintItems(); #endif bool CheckUseless(DPBChangeItem * item); void ResetError(); }; /****************************************************************************************************/ // TaskSupplier /****************************************************************************************************/ class TaskSupplier : public Skipping, public AU_Splitter, public SVC_Extension, public DecReferencePictureMarking, public DPBOutput, public ErrorStatus { friend class TaskBrokerSingleThreadDXVA; public: TaskSupplier(); virtual ~TaskSupplier(); virtual Status Init(VideoDecoderParams *pInit); virtual Status PreInit(VideoDecoderParams *pInit); virtual void Reset(); virtual void Close(); Status GetInfo(VideoDecoderParams *lpInfo); virtual Status AddSource(MediaData *pSource); Status ProcessNalUnit(NalUnit *nalUnit, mfxExtDecodeErrorReport *pDecodeErrorReport); void SetMemoryAllocator(MemoryAllocator *pMemoryAllocator) { m_pMemoryAllocator = pMemoryAllocator; } MemoryAllocator * GetMemoryAllocator() const { return m_pMemoryAllocator; }; void SetFrameAllocator(FrameAllocator *pFrameAllocator) { m_pFrameAllocator = pFrameAllocator; } virtual H264DecoderFrame *GetFrameToDisplayInternal(bool force); Status GetUserData(MediaData *pUD); H264DBPList *GetDPBList(uint32_t viewId, int32_t dIdRev) { ViewItem *pView = FindView(viewId); if (!pView) return NULL; return pView->GetDPBList(dIdRev); } TaskBroker * GetTaskBroker() { return m_pTaskBroker; } virtual Status RunDecoding(); virtual H264DecoderFrame * FindSurface(FrameMemID id); void PostProcessDisplayFrame(H264DecoderFrame *pFrame); virtual void AfterErrorRestore(); SEI_Storer * GetSEIStorer() const { return m_sei_messages;} Headers * GetHeaders() { return &m_Headers;} inline const UMC_H264_DECODER::H264SeqParamSet *GetCurrentSequence(void) const { return m_Headers.m_SeqParams.GetCurrentHeader(); } virtual H264Slice * DecodeSliceHeader(NalUnit *nalUnit); virtual H264Slice * CreateSlice(); H264_Heap_Objects * GetObjHeap() { return &m_ObjHeap; } // Initialize MB ordering for the picture using slice groups as // defined in the picture parameter set. virtual void SetMBMap(const H264Slice * slice, H264DecoderFrame *frame, LocalResources * localRes); protected: virtual void CreateTaskBroker() = 0; void AddSliceToFrame(H264DecoderFrame *pFrame, H264Slice *pSlice); // Initialize just allocated frame with slice parameters virtual void InitFreeFrame(H264DecoderFrame *pFrame, const H264Slice *pSlice); // Initialize frame's counter and corresponding parameters virtual void InitFrameCounter(H264DecoderFrame *pFrame, const H264Slice *pSlice); Status AddSlice(H264Slice * pSlice, bool force); virtual Status CompleteFrame(H264DecoderFrame * pFrame, int32_t m_field_index); virtual void OnFullFrame(H264DecoderFrame * pFrame); virtual bool ProcessNonPairedField(H264DecoderFrame * pFrame) = 0; void DPBSanitize(H264DecoderFrame * pDPBHead, const H264DecoderFrame * pFrame); void DBPUpdate(H264DecoderFrame * pFrame, int32_t field); virtual void AddFakeReferenceFrame(H264Slice * pSlice); virtual Status AddOneFrame(MediaData * pSource); virtual Status AllocateFrameData(H264DecoderFrame * pFrame) = 0; virtual Status DecodeHeaders(NalUnit *nalUnit); virtual Status DecodeSEI(NalUnit *nalUnit); Status ProcessFrameNumGap(H264Slice *slice, int32_t field, int32_t did, int32_t maxDid); // Obtain free frame from queue virtual H264DecoderFrame *GetFreeFrame(const H264Slice *pSlice = NULL) = 0; Status CompleteDecodedFrames(H264DecoderFrame ** decoded); H264DecoderFrame *GetAnyFrameToDisplay(bool force); void PreventDPBFullness(); Status AllocateNewFrame(const H264Slice *pSlice, H264DecoderFrame **frame); Status InitializeLayers(AccessUnit *accessUnit, H264DecoderFrame * pFrame, int32_t field); void ApplyPayloadsToFrame(H264DecoderFrame * frame, H264Slice *slice, SeiPayloadArray * payloads); H264_Heap_Objects m_ObjHeap; H264SegmentDecoderBase **m_pSegmentDecoder; uint32_t m_iThreadNum; double m_local_delta_frame_time; bool m_use_external_framerate; H264Slice * m_pLastSlice; H264DecoderFrame *m_pLastDisplayed; MemoryAllocator *m_pMemoryAllocator; FrameAllocator *m_pFrameAllocator; // Keep track of which parameter set is in use. bool m_WaitForIDR; uint32_t m_DPBSizeEx; int32_t m_frameOrder; TaskBroker * m_pTaskBroker; VideoDecoderParams m_initializationParams; int32_t m_UIDFrameCounter; UMC_H264_DECODER::H264SEIPayLoad m_UserData; SEI_Storer *m_sei_messages; AccessUnit m_accessUnit; bool m_isInitialized; Mutex m_mGuard; bool m_ignoreLevelConstrain; private: TaskSupplier & operator = (TaskSupplier &) { return *this; } // TaskSupplier & operator = (TaskSupplier &) }; // can increase level_idc to hold num_ref_frames inline int32_t CalculateDPBSize(uint8_t & level_idc, int32_t width, int32_t height, uint32_t num_ref_frames) { uint32_t dpbSize; auto constexpr INTERNAL_MAX_LEVEL = H264VideoDecoderParams::H264_LEVEL_MAX + 1; num_ref_frames = std::min(16u, num_ref_frames); for (;;) { uint32_t MaxDPBMbs; // MaxDPB, per Table A-1, Level Limits switch (level_idc) { case H264VideoDecoderParams::H264_LEVEL_1: MaxDPBMbs = 396; break; case H264VideoDecoderParams::H264_LEVEL_11: MaxDPBMbs = 900; break; case H264VideoDecoderParams::H264_LEVEL_12: case H264VideoDecoderParams::H264_LEVEL_13: case H264VideoDecoderParams::H264_LEVEL_2: MaxDPBMbs = 2376; break; case H264VideoDecoderParams::H264_LEVEL_21: MaxDPBMbs = 4752; break; case H264VideoDecoderParams::H264_LEVEL_22: case H264VideoDecoderParams::H264_LEVEL_3: MaxDPBMbs = 8100; break; case H264VideoDecoderParams::H264_LEVEL_31: MaxDPBMbs = 18000; break; case H264VideoDecoderParams::H264_LEVEL_32: MaxDPBMbs = 20480; break; case H264VideoDecoderParams::H264_LEVEL_4: case H264VideoDecoderParams::H264_LEVEL_41: MaxDPBMbs = 32768; break; case H264VideoDecoderParams::H264_LEVEL_42: MaxDPBMbs = 34816; break; case H264VideoDecoderParams::H264_LEVEL_5: MaxDPBMbs = 110400; break; case H264VideoDecoderParams::H264_LEVEL_51: case H264VideoDecoderParams::H264_LEVEL_52: MaxDPBMbs = 184320; break; case H264VideoDecoderParams::H264_LEVEL_6: case H264VideoDecoderParams::H264_LEVEL_61: case H264VideoDecoderParams::H264_LEVEL_62: MaxDPBMbs = 696320; break; default: // We don't support level greater than 5.2 but // relax resolution constrains up to 4K, hence // use value 696320 which is from level 6+ for // the calculation of the DPB size when level_idc // reaches 5.1+ but dpbSize is still less // than num_ref_frames MaxDPBMbs = 696320; break; } if (width == 0 || height == 0) { throw h264_exception(UMC_ERR_INVALID_PARAMS); } uint32_t dpbLevel = MaxDPBMbs*256 / (width * height); dpbSize = std::min(16u, dpbLevel); if (num_ref_frames <= dpbSize || level_idc == INTERNAL_MAX_LEVEL) break; switch (level_idc) // increase level_idc { case H264VideoDecoderParams::H264_LEVEL_1: level_idc = H264VideoDecoderParams::H264_LEVEL_11; break; case H264VideoDecoderParams::H264_LEVEL_11: level_idc = H264VideoDecoderParams::H264_LEVEL_12; break; case H264VideoDecoderParams::H264_LEVEL_12: case H264VideoDecoderParams::H264_LEVEL_13: case H264VideoDecoderParams::H264_LEVEL_2: level_idc = H264VideoDecoderParams::H264_LEVEL_21; break; case H264VideoDecoderParams::H264_LEVEL_21: level_idc = H264VideoDecoderParams::H264_LEVEL_22; break; case H264VideoDecoderParams::H264_LEVEL_22: case H264VideoDecoderParams::H264_LEVEL_3: level_idc = H264VideoDecoderParams::H264_LEVEL_31; break; case H264VideoDecoderParams::H264_LEVEL_31: level_idc = H264VideoDecoderParams::H264_LEVEL_32; break; case H264VideoDecoderParams::H264_LEVEL_32: level_idc = H264VideoDecoderParams::H264_LEVEL_4; break; case H264VideoDecoderParams::H264_LEVEL_4: case H264VideoDecoderParams::H264_LEVEL_41: case H264VideoDecoderParams::H264_LEVEL_42: level_idc = H264VideoDecoderParams::H264_LEVEL_5; break; case H264VideoDecoderParams::H264_LEVEL_5: level_idc = H264VideoDecoderParams::H264_LEVEL_51; break; // Set level_idc to INTERNAL_MAX_LEVEL so that MaxDPBMbs = 696320 // can be used to calculate the DPB size. case H264VideoDecoderParams::H264_LEVEL_51: case H264VideoDecoderParams::H264_LEVEL_52: level_idc = H264VideoDecoderParams::H264_LEVEL_6; break; case H264VideoDecoderParams::H264_LEVEL_6: case H264VideoDecoderParams::H264_LEVEL_61: case H264VideoDecoderParams::H264_LEVEL_62: level_idc = INTERNAL_MAX_LEVEL; break; default: throw h264_exception(UMC_ERR_FAILED); } } // Restore level_idc to H264_LEVEL_MAX if (level_idc == INTERNAL_MAX_LEVEL) level_idc = H264VideoDecoderParams::H264_LEVEL_MAX; return dpbSize; } inline H264DBPList *GetDPB(ViewList &views, int32_t viewId, int32_t dIdRev = 0) { ViewList::iterator iter = views.begin(); ViewList::iterator iter_end = views.end(); for (; iter != iter_end; ++iter) { if (viewId == (*iter).viewId) { return (*iter).GetDPBList(dIdRev); } } throw h264_exception(UMC_ERR_FAILED); } // H264DBPList *GetDPB(ViewList &views) inline uint32_t GetVOIdx(const UMC_H264_DECODER::H264SeqParamSetMVCExtension *pSeqParamSetMvc, uint32_t viewId) { auto it = std::find_if(pSeqParamSetMvc->viewInfo.begin(), pSeqParamSetMvc->viewInfo.end(), [viewId](const UMC_H264_DECODER::H264ViewRefInfo & item) { return item.view_id == viewId; }); return (pSeqParamSetMvc->viewInfo.end() != it) ? (uint32_t)(it - pSeqParamSetMvc->viewInfo.begin()) : 0; } // uint32_t GetVOIdx(const H264SeqParamSetMVCExtension *pSeqParamSetMvc, uint32_t viewId) inline uint32_t GetInterViewFrameRefs(ViewList &views, int32_t viewId, int32_t auIndex, uint32_t bottomFieldFlag) { ViewList::iterator iter = views.begin(); ViewList::iterator iter_end = views.end(); uint32_t numInterViewRefs = 0; for (; iter != iter_end; ++iter) { if (iter->viewId == viewId) break; // take into account DPBs with lower view ID H264DecoderFrame *pInterViewRef = iter->GetDPBList()->findInterViewRef(auIndex, bottomFieldFlag); if (pInterViewRef) { ++numInterViewRefs; } } return numInterViewRefs; } } // namespace UMC #endif // __UMC_H264_TASK_SUPPLIER_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include/umc_h264_va_packer.h000066400000000000000000000076651443134507600325160ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_VA_PACKER_H #define __UMC_H264_VA_PACKER_H #include "umc_va_base.h" namespace UMC_H264_DECODER { struct H264PicParamSet; struct H264ScalingPicParams; } namespace UMC { class H264DecoderFrame; class H264Slice; class H264DecoderFrameInfo; struct ReferenceFlags; class TaskSupplier; class Packer { public: Packer(VideoAccelerator * va, TaskSupplier * supplier); virtual ~Packer(); virtual Status GetStatusReport(void * pStatusReport, size_t size) = 0; virtual Status SyncTask(H264DecoderFrame*, void * error); virtual Status QueryTaskStatus(int32_t index, void * status, void * error); virtual Status QueryStreamOut(H264DecoderFrame*); VideoAccelerator * GetVideoAccelerator() { return m_va; } virtual void PackAU(const H264DecoderFrame*, int32_t isTop) = 0; virtual void BeginFrame(H264DecoderFrame*, int32_t field) = 0; virtual void EndFrame() = 0; virtual void Reset() {} static Packer * CreatePacker(VideoAccelerator * va, TaskSupplier* supplier); private: virtual void PackPicParams(H264DecoderFrameInfo * pSliceInfo, H264Slice * pSlice) = 0; virtual int32_t PackSliceParams(H264Slice *pSlice, int32_t sliceNum, int32_t chopping, int32_t numSlicesOfPrevField) = 0; virtual void PackQmatrix(const UMC_H264_DECODER::H264ScalingPicParams * scaling) = 0; protected: VideoAccelerator *m_va; TaskSupplier *m_supplier; }; class PackerVA : public Packer { public: PackerVA(VideoAccelerator * va, TaskSupplier * supplier); Status GetStatusReport(void * pStatusReport, size_t size); Status QueryStreamOut(H264DecoderFrame*); void PackAU(const H264DecoderFrame*, int32_t isTop); void BeginFrame(H264DecoderFrame*, int32_t field); void EndFrame(); protected: void PackPicParams(H264DecoderFrameInfo * pSliceInfo, H264Slice * pSlice); void FillFrame(VAPictureH264 * pic, const H264DecoderFrame *pFrame, int32_t field, int32_t reference, int32_t defaultIndex); int32_t FillRefFrame(VAPictureH264 * pic, const H264DecoderFrame *pFrame, ReferenceFlags flags, bool isField, int32_t defaultIndex); void FillFrameAsInvalid(VAPictureH264 * pic); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE void PackProcessingInfo(H264DecoderFrameInfo * sliceInfo); #endif enum { VA_FRAME_INDEX_INVALID = 0x7f }; protected: void CreateSliceParamBuffer(H264DecoderFrameInfo * pSliceInfo); void CreateSliceDataBuffer(H264DecoderFrameInfo * pSliceInfo); int32_t PackSliceParams(H264Slice *pSlice, int32_t sliceNum, int32_t chopping, int32_t numSlicesOfPrevField); void PackQmatrix(const UMC_H264_DECODER::H264ScalingPicParams * scaling); }; } // namespace UMC #endif /* __UMC_H264_VA_PACKER_H */ #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_va_supplier.h000066400000000000000000000074341443134507600330270ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #ifndef __UMC_H264_VA_SUPPLIER_H #define __UMC_H264_VA_SUPPLIER_H #include "umc_h264_dec_mfx.h" #include "umc_h264_mfx_supplier.h" #include "umc_h264_segment_decoder_dxva.h" namespace UMC { class MFXVideoDECODEH264; class LazyCopier { public: void Reset(); void Add(H264Slice * slice); void Remove(H264DecoderFrameInfo * info); void Remove(H264Slice * slice); void CopyAll(); private: typedef std::list SlicesList; SlicesList m_slices; }; /****************************************************************************************************/ // TaskSupplier /****************************************************************************************************/ class VATaskSupplier : public MFXTaskSupplier , public DXVASupport { friend class TaskBroker; friend class DXVASupport; friend class VideoDECODEH264; public: VATaskSupplier(); virtual Status Init(VideoDecoderParams *pInit); virtual void Close(); virtual void Reset(); void SetBufferedFramesNumber(uint32_t buffered); virtual Status DecodeHeaders(NalUnit *nalUnit); virtual Status AddSource(MediaData * pSource); protected: virtual void CreateTaskBroker(); virtual Status AllocateFrameData(H264DecoderFrame * pFrame); virtual void InitFrameCounter(H264DecoderFrame * pFrame, const H264Slice *pSlice); virtual Status CompleteFrame(H264DecoderFrame * pFrame, int32_t field); virtual void AfterErrorRestore(); virtual H264DecoderFrame * GetFreeFrame(const H264Slice *pSlice = NULL); virtual H264Slice * DecodeSliceHeader(NalUnit *nalUnit); virtual H264DecoderFrame *GetFrameToDisplayInternal(bool force); protected: virtual int32_t GetFreeFrameIndex(); uint32_t m_bufferedFrameNumber; LazyCopier m_lazyCopier; private: VATaskSupplier & operator = (VATaskSupplier &) { return *this; } }; // this template class added to apply big surface pool workaround depends on platform // because platform check can't be added inside VATaskSupplier template class VATaskSupplierBigSurfacePool : public BaseClass { public: VATaskSupplierBigSurfacePool() {}; virtual ~VATaskSupplierBigSurfacePool() {}; protected: virtual Status AllocateFrameData(H264DecoderFrame * pFrame) { Status ret = BaseClass::AllocateFrameData(pFrame); if (ret == UMC_OK) { pFrame->m_index = BaseClass::GetFreeFrameIndex(); } return ret; } }; } // namespace UMC #endif // __UMC_H264_VA_SUPPLIER_H #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/000077500000000000000000000000001443134507600261315ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_au_splitter.cpp000066400000000000000000000320141443134507600325770ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include "umc_h264_au_splitter.h" #include "umc_h264_nal_spl.h" #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_h264_nal_spl.h" #endif // MFX_ENABLE_PXP namespace UMC { /****************************************************************************************************/ // SeiPayloadArray class routine /****************************************************************************************************/ SeiPayloadArray::SeiPayloadArray() { m_payloads.reserve(3); } SeiPayloadArray::SeiPayloadArray(const SeiPayloadArray & payloads) { size_t count = payloads.GetPayloadCount(); for (size_t i = 0; i < count; i++) { AddPayload(payloads.GetPayload(i)); } } SeiPayloadArray::~SeiPayloadArray() { Release(); } size_t SeiPayloadArray::GetPayloadCount() const { return m_payloads.size(); } UMC_H264_DECODER::H264SEIPayLoad* SeiPayloadArray::GetPayload(size_t pos) const { if (pos >= m_payloads.size()) return 0; return m_payloads[pos]; } UMC_H264_DECODER::H264SEIPayLoad* SeiPayloadArray::FindPayload(SEI_TYPE type) const { int32_t pos = FindPayloadPos(type); return (pos < 0) ? 0 : GetPayload(pos); } int32_t SeiPayloadArray::FindPayloadPos(SEI_TYPE type) const { size_t count = m_payloads.size(); for (size_t i = 0; i < count; i++) { UMC_H264_DECODER::H264SEIPayLoad* payload = m_payloads[i]; if (payload->payLoadType == type) return (int32_t)i; } return -1; } void SeiPayloadArray::MovePayloadsFrom(SeiPayloadArray &payloads) { size_t count = payloads.GetPayloadCount(); for (size_t i = 0; i < count; i++) { AddPayload(payloads.GetPayload(i)); } payloads.Release(); } void SeiPayloadArray::Release() { PayloadArray::iterator iter = m_payloads.begin(); PayloadArray::iterator iter_end = m_payloads.end(); for (; iter != iter_end; ++iter) { UMC_H264_DECODER::H264SEIPayLoad* payload = *iter; payload->DecrementReference(); } m_payloads.clear(); } void SeiPayloadArray::AddPayload(UMC_H264_DECODER::H264SEIPayLoad* payload) { if (!payload) return; payload->IncrementReference(); int32_t pos = FindPayloadPos(payload->payLoadType); if (pos >= 0) // always use last payload { m_payloads[pos]->DecrementReference(); m_payloads[pos] = payload; return; } m_payloads.push_back(payload); } /****************************************************************************************************/ // SetOfSlices class routine /****************************************************************************************************/ SetOfSlices::SetOfSlices() : m_frame(0) , m_isCompleted(false) , m_isFull(false) { } SetOfSlices::SetOfSlices(const SetOfSlices& set) : m_frame(set.m_frame) , m_isCompleted(set.m_isCompleted) , m_isFull(set.m_isFull) , m_payloads(set.m_payloads) , m_pSliceQueue(set.m_pSliceQueue) { for (auto pSlice : m_pSliceQueue) { pSlice->IncrementReference(); } } SetOfSlices::~SetOfSlices() { Release(); } SetOfSlices& SetOfSlices::operator=(const SetOfSlices& set) { if (this == &set) { return *this; } *this = set; for (auto pSlice : m_pSliceQueue) { pSlice->IncrementReference(); } return *this; } H264Slice * SetOfSlices::GetSlice(size_t pos) const { if (pos >= m_pSliceQueue.size()) return nullptr; return m_pSliceQueue[pos]; } size_t SetOfSlices::GetSliceCount() const { return m_pSliceQueue.size(); } void SetOfSlices::AddSlice(H264Slice * slice) { m_pSliceQueue.push_back(slice); } void SetOfSlices::Release() { size_t count = m_pSliceQueue.size(); for (size_t sliceId = 0; sliceId < count; sliceId++) { H264Slice * slice = m_pSliceQueue[sliceId]; slice->DecrementReference(); } Reset(); } void SetOfSlices::Reset() { m_frame = 0; m_isCompleted = false; m_isFull = false; m_pSliceQueue.clear(); m_payloads.Release(); } void SetOfSlices::AddSet(const SetOfSlices *set) { size_t count = set->GetSliceCount(); for (size_t sliceId = 0; sliceId < count; sliceId++) { AddSlice(set->GetSlice(sliceId)); } } void SetOfSlices::CleanUseless() { size_t count = m_pSliceQueue.size(); for (size_t sliceId = 0; sliceId < count; sliceId++) { H264Slice * curSlice = m_pSliceQueue[sliceId]; if (curSlice->m_bDecoded) { m_pSliceQueue.erase(m_pSliceQueue.begin() + sliceId); // remove count = m_pSliceQueue.size(); --sliceId; curSlice->Release(); curSlice->DecrementReference(); } } } void SetOfSlices::SortSlices() { static int32_t MAX_MB_NUMBER = 0x7fffffff; if (!m_pSliceQueue.empty() && m_pSliceQueue[0]->IsSliceGroups()) return; size_t count = m_pSliceQueue.size(); for (size_t sliceId = 0; sliceId < count; sliceId++) { H264Slice * curSlice = m_pSliceQueue[sliceId]; int32_t minFirst = MAX_MB_NUMBER; size_t minSlice = 0; for (size_t j = sliceId; j < count; j++) { H264Slice * slice = m_pSliceQueue[j]; if (slice->GetStreamFirstMB() < curSlice->GetStreamFirstMB() && minFirst > slice->GetStreamFirstMB() && curSlice->GetSliceHeader()->nal_ext.svc.dependency_id == slice->GetSliceHeader()->nal_ext.svc.dependency_id && curSlice->GetSliceHeader()->nal_ext.svc.quality_id == slice->GetSliceHeader()->nal_ext.svc.quality_id) { minFirst = slice->GetStreamFirstMB(); minSlice = j; } } if (minFirst != MAX_MB_NUMBER) { H264Slice * temp = m_pSliceQueue[sliceId]; m_pSliceQueue[sliceId] = m_pSliceQueue[minSlice]; m_pSliceQueue[minSlice] = temp; } } for (size_t sliceId = 0; sliceId < count - 1; sliceId++) { H264Slice * slice = m_pSliceQueue[sliceId]; H264Slice * nextSlice = m_pSliceQueue[sliceId + 1]; if (!nextSlice) break; if (nextSlice->IsSliceGroups() || slice->IsSliceGroups()) continue; if (nextSlice->GetSliceHeader()->nal_ext.svc.quality_id == slice->GetSliceHeader()->nal_ext.svc.quality_id) slice->SetMaxMB(nextSlice->GetStreamFirstMB()); if (slice->GetStreamFirstMB() == slice->GetMaxMB()) { count--; for (size_t i = sliceId; i < count; i++) { m_pSliceQueue[i] = m_pSliceQueue[i + 1]; } m_pSliceQueue.resize(count); slice->DecrementReference(); sliceId = uint32_t(-1); continue; } } } /****************************************************************************************************/ // AccessUnit class routine /****************************************************************************************************/ AccessUnit::AccessUnit() : m_isInitialized(false) , m_isFullAU(false) , m_auCounter(0) { } AccessUnit::~AccessUnit() { } uint32_t AccessUnit::GetAUIndentifier() const { return m_auCounter; } size_t AccessUnit::GetLayersCount() const { return m_layers.size(); } void AccessUnit::CleanUseless() { size_t count = m_layers.size(); for (size_t pos = 0; pos < count; pos++) { SetOfSlices * set = &m_layers[pos]; set->CleanUseless(); if (!set->GetSliceCount()) { m_layers.erase(m_layers.begin() + pos); count = m_layers.size(); pos--; } } } int32_t AccessUnit::FindLayerByDependency(int32_t dependency) { size_t count = m_layers.size(); for (size_t i = 0; i < count; i++) { SetOfSlices * set = &m_layers[i]; if (set->GetSlice(0) && set->GetSlice(0)->GetSliceHeader()->nal_ext.svc.dependency_id == dependency) return (int32_t)i; } return -1; } SetOfSlices * AccessUnit::GetLastLayer() { if (m_layers.empty()) return nullptr; return &m_layers.back(); } SetOfSlices * AccessUnit::GetLayer(size_t pos) { if (pos >= m_layers.size()) return nullptr; return &m_layers[pos]; } void AccessUnit::CombineSets() { if (m_layers.empty()) return; SetOfSlices * setOfSlices = &m_layers[0]; size_t count = m_layers.size(); for (size_t i = 1; i < count; i++) { SetOfSlices * set = &m_layers[i]; setOfSlices->AddSet(set); set->Reset(); } m_layers.resize(1); } bool AccessUnit::IsFullAU() const { return m_isFullAU; } void AccessUnit::CompleteLastLayer() { if (!m_layers.empty()) m_layers.back().m_isFull = true; } bool AccessUnit::AddSlice(H264Slice * slice) { if (!slice) { if (!m_layers.empty()) { m_isFullAU = true; } return false; } SetOfSlices * setOfSlices = GetLayerBySlice(slice); if (!setOfSlices) { if (!m_layers.empty()) { SetOfSlices * lastSetOfSlices = GetLastLayer(); if (lastSetOfSlices->GetSlice(0)->GetSliceHeader()->nal_ext.svc.dependency_id > slice->GetSliceHeader()->nal_ext.svc.dependency_id) { m_isFullAU = true; return false; } } setOfSlices = AddLayer(slice); setOfSlices->m_payloads.MovePayloadsFrom(m_payloads); } H264Slice * lastSlice = setOfSlices->GetSlice(setOfSlices->GetSliceCount() - 1); if (!IsPictureTheSame(lastSlice, slice) || setOfSlices->m_isFull) { m_isFullAU = true; return false; } m_payloads.Release(); setOfSlices->AddSlice(slice); return true; } void AccessUnit::Release() { for (auto & set: m_layers) { set.Release(); } Reset(); m_payloads.Release(); } void AccessUnit::Reset() { for (auto & set: m_layers) { set.Reset(); } m_layers.clear(); m_auCounter++; m_isFullAU = false; m_isInitialized = false; } void AccessUnit::SortforASO() { for (auto & set: m_layers) { set.SortSlices(); } } SetOfSlices * AccessUnit::AddLayer(H264Slice * ) { SetOfSlices setofSlices; m_layers.push_back(setofSlices); return &m_layers.back(); } bool AccessUnit::IsItSliceOfThisAU(H264Slice * slice) { SetOfSlices * setOfSlices = GetLayerBySlice(slice); if (!setOfSlices) return false; H264Slice * lastSlice = setOfSlices->GetSlice(0); return IsPictureTheSame(lastSlice, slice); } SetOfSlices * AccessUnit::GetLayerBySlice(H264Slice * slice) { if (!slice) return nullptr; size_t count = m_layers.size(); for (size_t i = 0; i < count; i++) { H264Slice * temp = m_layers[i].GetSlice(0); if (!temp) continue; if (temp->GetSliceHeader()->nal_ext.mvc.view_id == slice->GetSliceHeader()->nal_ext.mvc.view_id && temp->GetSliceHeader()->nal_ext.svc.dependency_id == slice->GetSliceHeader()->nal_ext.svc.dependency_id) return &m_layers[i]; } return nullptr; } AU_Splitter::AU_Splitter(H264_Heap_Objects *objectHeap) : m_Headers(objectHeap) , m_objHeap(objectHeap) { } AU_Splitter::~AU_Splitter() { Close(); } void AU_Splitter::Init() { Close(); #if defined(MFX_ENABLE_PXP) m_pNALSplitter.reset(new PXPNALUnitSplitter()); #else m_pNALSplitter.reset(new NALUnitSplitter()); #endif // MFX_ENABLE_PXP m_pNALSplitter->Init(); } void AU_Splitter::Close() { m_pNALSplitter.reset(0); } void AU_Splitter::Reset() { if (m_pNALSplitter.get()) m_pNALSplitter->Reset(); m_Headers.Reset(); } NalUnit * AU_Splitter::GetNalUnit(MediaData * src) { return m_pNALSplitter->GetNalUnits(src); } NALUnitSplitter * AU_Splitter::GetNalUnitSplitter() { return m_pNALSplitter.get(); } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_dec_bitstream_headers.cpp000066400000000000000000003103051443134507600344670ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_dec.h" #include "umc_h264_bitstream_headers.h" #include "umc_h264_headers.h" #include #define SCLFLAT16 0 #define SCLDEFAULT 1 #define SCLREDEFINED 2 #define PeakNextBits(current_data, bp, nbits, data) \ { \ uint32_t x; \ \ assert((nbits) > 0 && (nbits) <= 32); \ assert(nbits >= 0 && nbits <= 31); \ \ int32_t offset = bp - (nbits); \ \ if (offset >= 0) \ { \ x = current_data[0] >> (offset + 1); \ } \ else \ { \ offset += 32; \ \ x = current_data[1] >> (offset); \ x >>= 1; \ x += current_data[0] << (31 - offset); \ } \ \ assert(offset >= 0 && offset <= 31); \ \ (data) = x & UMC::bits_data[nbits]; \ } using namespace UMC_H264_DECODER; namespace UMC { static const int32_t pre_norm_adjust_index4x4[16] = {// 0 1 2 3 0,2,0,2,//0 2,1,2,1,//1 0,2,0,2,//2 2,1,2,1 //3 }; static const int32_t pre_norm_adjust4x4[6][3] = { {10,16,13}, {11,18,14}, {13,20,16}, {14,23,18}, {16,25,20}, {18,29,23} }; static const int32_t pre_norm_adjust8x8[6][6] = { {20, 18, 32, 19, 25, 24}, {22, 19, 35, 21, 28, 26}, {26, 23, 42, 24, 33, 31}, {28, 25, 45, 26, 35, 33}, {32, 28, 51, 30, 40, 38}, {36, 32, 58, 34, 46, 43} }; static const int32_t pre_norm_adjust_index8x8[64] = {// 0 1 2 3 4 5 6 7 0,3,4,3,0,3,4,3,//0 3,1,5,1,3,1,5,1,//1 4,5,2,5,4,5,2,5,//2 3,1,5,1,3,1,5,1,//3 0,3,4,3,0,3,4,3,//4 3,1,5,1,3,1,5,1,//5 4,5,2,5,4,5,2,5,//6 3,1,5,1,3,1,5,1 //7 }; const int32_t mp_scan4x4[2][16] = { { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 }, { 0, 4, 1, 8, 12, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 } }; const int32_t hp_scan8x8[2][64] = { //8x8 zigzag scan { 0, 1, 8,16, 9, 2, 3,10, 17,24,32,25,18,11, 4, 5, 12,19,26,33,40,48,41,34, 27,20,13, 6, 7,14,21,28, 35,42,49,56,57,50,43,36, 29,22,15,23,30,37,44,51, 58,59,52,45,38,31,39,46, 53,60,61,54,47,55,62,63 }, //8x8 field scan { 0, 8,16, 1, 9,24,32,17, 2,25,40,48,56,33,10, 3, 18,41,49,57,26,11, 4,19, 34,42,50,58,27,12, 5,20, 35,43,51,59,28,13, 6,21, 36,44,52,60,29,14,22,37, 45,53,61,30, 7,15,38,46, 54,62,23,31,39,47,55,63 } }; const uint32_t bits_data[] = { (((uint32_t)0x01 << (0)) - 1), (((uint32_t)0x01 << (1)) - 1), (((uint32_t)0x01 << (2)) - 1), (((uint32_t)0x01 << (3)) - 1), (((uint32_t)0x01 << (4)) - 1), (((uint32_t)0x01 << (5)) - 1), (((uint32_t)0x01 << (6)) - 1), (((uint32_t)0x01 << (7)) - 1), (((uint32_t)0x01 << (8)) - 1), (((uint32_t)0x01 << (9)) - 1), (((uint32_t)0x01 << (10)) - 1), (((uint32_t)0x01 << (11)) - 1), (((uint32_t)0x01 << (12)) - 1), (((uint32_t)0x01 << (13)) - 1), (((uint32_t)0x01 << (14)) - 1), (((uint32_t)0x01 << (15)) - 1), (((uint32_t)0x01 << (16)) - 1), (((uint32_t)0x01 << (17)) - 1), (((uint32_t)0x01 << (18)) - 1), (((uint32_t)0x01 << (19)) - 1), (((uint32_t)0x01 << (20)) - 1), (((uint32_t)0x01 << (21)) - 1), (((uint32_t)0x01 << (22)) - 1), (((uint32_t)0x01 << (23)) - 1), (((uint32_t)0x01 << (24)) - 1), (((uint32_t)0x01 << (25)) - 1), (((uint32_t)0x01 << (26)) - 1), (((uint32_t)0x01 << (27)) - 1), (((uint32_t)0x01 << (28)) - 1), (((uint32_t)0x01 << (29)) - 1), (((uint32_t)0x01 << (30)) - 1), (((uint32_t)0x01 << (31)) - 1), ((uint32_t)0xFFFFFFFF), }; const uint16_t SAspectRatio[17][2] = { { 0, 0}, { 1, 1}, {12, 11}, {10, 11}, {16, 11}, {40, 33}, { 24, 11}, {20, 11}, {32, 11}, {80, 33}, {18, 11}, {15, 11}, {64, 33}, {160, 99}, {4, 3}, {3, 2}, {2, 1} }; const uint32_t SubWidthC[4] = { 1, 2, 2, 1 }; const uint32_t SubHeightC[4] = { 1, 2, 1, 1 }; const uint8_t default_intra_scaling_list4x4[16]= { 6, 13, 20, 28, 13, 20, 28, 32, 20, 28, 32, 37, 28, 32, 37, 42 }; const uint8_t default_inter_scaling_list4x4[16]= { 10, 14, 20, 24, 14, 20, 24, 27, 20, 24, 27, 30, 24, 27, 30, 34 }; const uint8_t default_intra_scaling_list8x8[64]= { 6, 10, 13, 16, 18, 23, 25, 27, 10, 11, 16, 18, 23, 25, 27, 29, 13, 16, 18, 23, 25, 27, 29, 31, 16, 18, 23, 25, 27, 29, 31, 33, 18, 23, 25, 27, 29, 31, 33, 36, 23, 25, 27, 29, 31, 33, 36, 38, 25, 27, 29, 31, 33, 36, 38, 40, 27, 29, 31, 33, 36, 38, 40, 42 }; const uint8_t default_inter_scaling_list8x8[64]= { 9, 13, 15, 17, 19, 21, 22, 24, 13, 13, 17, 19, 21, 22, 24, 25, 15, 17, 19, 21, 22, 24, 25, 27, 17, 19, 21, 22, 24, 25, 27, 28, 19, 21, 22, 24, 25, 27, 28, 30, 21, 22, 24, 25, 27, 28, 30, 32, 22, 24, 25, 27, 28, 30, 32, 33, 24, 25, 27, 28, 30, 32, 33, 35 }; H264BaseBitstream::H264BaseBitstream() { Reset(0, 0); } H264BaseBitstream::H264BaseBitstream(uint8_t * const pb, const uint32_t maxsize) { Reset(pb, maxsize); } H264BaseBitstream::~H264BaseBitstream() { } void H264BaseBitstream::Reset(uint8_t * const pb, const uint32_t maxsize) { m_pbs = (uint32_t*)pb; m_pbsBase = (uint32_t*)pb; m_bitOffset = 31; m_maxBsSize = maxsize; m_tailBsSize = 0; } // void Reset(uint8_t * const pb, const uint32_t maxsize) void H264BaseBitstream::Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize) { m_pbs = (uint32_t*)pb; m_pbsBase = (uint32_t*)pb; m_bitOffset = offset; m_maxBsSize = maxsize; m_tailBsSize = 0; } // void Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize) bool H264BaseBitstream::More_RBSP_Data() { int32_t code, tmp; uint32_t* ptr_state = m_pbs; int32_t bit_state = m_bitOffset; assert(m_bitOffset >= 0 && m_bitOffset <= 31); int32_t remaining_bytes = (int32_t)BytesLeft(); if (remaining_bytes <= 0) return false; // get top bit, it can be "rbsp stop" bit CheckBitsLeft(1); h264GetBits(m_pbs, m_bitOffset, 1, code); // get remain bits, which is less then byte tmp = (m_bitOffset + 1) % 8; if(tmp) { CheckBitsLeft(tmp); h264GetBits(m_pbs, m_bitOffset, tmp, code); if ((code << (8 - tmp)) & 0x7f) // most sig bit could be rbsp stop bit { m_pbs = ptr_state; m_bitOffset = bit_state; // there are more data return true; } } remaining_bytes = (int32_t)BytesLeft(); // run through remain bytes while (0 < remaining_bytes) { h264GetBits(m_pbs, m_bitOffset, 8, code); if (code) { m_pbs = ptr_state; m_bitOffset = bit_state; // there are more data return true; } remaining_bytes -= 1; } return false; } void H264BaseBitstream::GetOrg(uint32_t **pbs, uint32_t *size) { *pbs = m_pbsBase; *size = m_maxBsSize; } void H264BaseBitstream::GetState(uint32_t** pbs,uint32_t* bitOffset) { *pbs = m_pbs; *bitOffset = m_bitOffset; } void H264BaseBitstream::SetState(uint32_t* pbs,uint32_t bitOffset) { m_pbs = pbs; m_bitOffset = bitOffset; } void H264BaseBitstream::SetDecodedBytes(size_t nBytes) { m_pbs = m_pbsBase + (nBytes / 4); m_bitOffset = 31 - ((int32_t) ((nBytes % sizeof(uint32_t)) * 8)); } void H264BaseBitstream::SetTailBsSize(const uint32_t nBytes) { m_tailBsSize = nBytes; } H264HeadersBitstream::H264HeadersBitstream() : H264BaseBitstream() { } H264HeadersBitstream::H264HeadersBitstream(uint8_t * const pb, const uint32_t maxsize) : H264BaseBitstream(pb, maxsize) { } inline bool CheckLevel(uint8_t level_idc, bool ignore_level_constrain = false) { (void)(ignore_level_constrain); //UNREFERENCED_PARAMETER switch(level_idc) { case H264VideoDecoderParams::H264_LEVEL_1: case H264VideoDecoderParams::H264_LEVEL_11: case H264VideoDecoderParams::H264_LEVEL_12: case H264VideoDecoderParams::H264_LEVEL_13: case H264VideoDecoderParams::H264_LEVEL_2: case H264VideoDecoderParams::H264_LEVEL_21: case H264VideoDecoderParams::H264_LEVEL_22: case H264VideoDecoderParams::H264_LEVEL_3: case H264VideoDecoderParams::H264_LEVEL_31: case H264VideoDecoderParams::H264_LEVEL_32: case H264VideoDecoderParams::H264_LEVEL_4: case H264VideoDecoderParams::H264_LEVEL_41: case H264VideoDecoderParams::H264_LEVEL_42: case H264VideoDecoderParams::H264_LEVEL_5: case H264VideoDecoderParams::H264_LEVEL_51: case H264VideoDecoderParams::H264_LEVEL_52: case H264VideoDecoderParams::H264_LEVEL_9: case H264VideoDecoderParams::H264_LEVEL_6: case H264VideoDecoderParams::H264_LEVEL_61: case H264VideoDecoderParams::H264_LEVEL_62: return true; default: return false; } } // --------------------------------------------------------------------------- // H264Bitstream::GetSequenceParamSet() // Read sequence parameter set data from bitstream. // --------------------------------------------------------------------------- Status H264HeadersBitstream::GetSequenceParamSet(H264SeqParamSet *sps, bool ignore_level_constrain) { // Not all members of the seq param set structure are contained in all // seq param sets. So start by init all to zero. Status ps = UMC_OK; sps->Reset(); // profile // TBD: add rejection of unsupported profile sps->profile_idc = (uint8_t)GetBits(8); switch (sps->profile_idc) { case H264VideoDecoderParams::H264_PROFILE_BASELINE: case H264VideoDecoderParams::H264_PROFILE_MAIN: case H264VideoDecoderParams::H264_PROFILE_SCALABLE_BASELINE: case H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH: case H264VideoDecoderParams::H264_PROFILE_EXTENDED: case H264VideoDecoderParams::H264_PROFILE_HIGH: case H264VideoDecoderParams::H264_PROFILE_HIGH10: case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_HIGH422: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: case H264VideoDecoderParams::H264_PROFILE_HIGH444: case H264VideoDecoderParams::H264_PROFILE_ADVANCED444_INTRA: case H264VideoDecoderParams::H264_PROFILE_ADVANCED444: case H264VideoDecoderParams::H264_PROFILE_HIGH444_PRED: case H264VideoDecoderParams::H264_PROFILE_CAVLC444_INTRA: break; default: return UMC_ERR_INVALID_STREAM; } sps->constraint_set0_flag = Get1Bit(); sps->constraint_set1_flag = Get1Bit(); sps->constraint_set2_flag = Get1Bit(); sps->constraint_set3_flag = Get1Bit(); sps->constraint_set4_flag = Get1Bit(); sps->constraint_set5_flag = Get1Bit(); // skip 2 zero bits GetBits(2); sps->level_idc = (uint8_t)GetBits(8); if (sps->level_idc == H264VideoDecoderParams::H264_LEVEL_UNKNOWN) sps->level_idc = H264VideoDecoderParams::H264_LEVEL_52; MFX_CHECK(CheckLevel(sps->level_idc, ignore_level_constrain), UMC_ERR_INVALID_STREAM); if (sps->level_idc == H264VideoDecoderParams::H264_LEVEL_9 && sps->profile_idc != H264VideoDecoderParams::H264_PROFILE_BASELINE && sps->profile_idc != H264VideoDecoderParams::H264_PROFILE_MAIN && sps->profile_idc != H264VideoDecoderParams::H264_PROFILE_EXTENDED) { sps->level_idc = H264VideoDecoderParams::H264_LEVEL_1b; } // id int32_t sps_id = GetVLCElement(false); if (sps_id > (int32_t)(MAX_NUM_SEQ_PARAM_SETS - 1)) { return UMC_ERR_INVALID_STREAM; } sps->seq_parameter_set_id = (uint8_t)sps_id; // see 7.3.2.1.1 "Sequence parameter set data syntax" // chapter of H264 standard for full list of profiles with chrominance if ((H264VideoDecoderParams::H264_PROFILE_SCALABLE_BASELINE == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_HIGH == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_HIGH10 == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_HIGH422 == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH == sps->profile_idc) || /* what're these profiles ??? */ (H264VideoDecoderParams::H264_PROFILE_HIGH444 == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_HIGH444_PRED == sps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_CAVLC444_INTRA == sps->profile_idc)) { uint32_t chroma_format_idc = GetVLCElement(false); if (chroma_format_idc > 3) return UMC_ERR_INVALID_STREAM; sps->chroma_format_idc = (uint8_t)chroma_format_idc; if (sps->chroma_format_idc==3) { sps->residual_colour_transform_flag = Get1Bit(); } uint32_t bit_depth_luma = GetVLCElement(false) + 8; uint32_t bit_depth_chroma = GetVLCElement(false) + 8; if (bit_depth_luma > 16 || bit_depth_chroma > 16) return UMC_ERR_INVALID_STREAM; sps->bit_depth_luma = (uint8_t)bit_depth_luma; sps->bit_depth_chroma = (uint8_t)bit_depth_chroma; if (!chroma_format_idc) sps->bit_depth_chroma = sps->bit_depth_luma; assert(!sps->residual_colour_transform_flag); if (sps->residual_colour_transform_flag == 1) { return UMC_ERR_INVALID_STREAM; } sps->qpprime_y_zero_transform_bypass_flag = Get1Bit(); sps->seq_scaling_matrix_present_flag = Get1Bit(); if(sps->seq_scaling_matrix_present_flag) { // 0 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[0],(uint8_t*)default_intra_scaling_list4x4,&sps->type_of_scaling_list_used[0]); } else { FillScalingList4x4(&sps->ScalingLists4x4[0],(uint8_t*) default_intra_scaling_list4x4); sps->type_of_scaling_list_used[0] = SCLDEFAULT; } // 1 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[1],(uint8_t*) default_intra_scaling_list4x4,&sps->type_of_scaling_list_used[1]); } else { FillScalingList4x4(&sps->ScalingLists4x4[1],(uint8_t*) sps->ScalingLists4x4[0].ScalingListCoeffs); sps->type_of_scaling_list_used[1] = SCLDEFAULT; } // 2 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[2],(uint8_t*) default_intra_scaling_list4x4,&sps->type_of_scaling_list_used[2]); } else { FillScalingList4x4(&sps->ScalingLists4x4[2],(uint8_t*) sps->ScalingLists4x4[1].ScalingListCoeffs); sps->type_of_scaling_list_used[2] = SCLDEFAULT; } // 3 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[3],(uint8_t*)default_inter_scaling_list4x4,&sps->type_of_scaling_list_used[3]); } else { FillScalingList4x4(&sps->ScalingLists4x4[3],(uint8_t*) default_inter_scaling_list4x4); sps->type_of_scaling_list_used[3] = SCLDEFAULT; } // 4 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[4],(uint8_t*) default_inter_scaling_list4x4,&sps->type_of_scaling_list_used[4]); } else { FillScalingList4x4(&sps->ScalingLists4x4[4],(uint8_t*) sps->ScalingLists4x4[3].ScalingListCoeffs); sps->type_of_scaling_list_used[4] = SCLDEFAULT; } // 5 if(Get1Bit()) { GetScalingList4x4(&sps->ScalingLists4x4[5],(uint8_t*) default_inter_scaling_list4x4,&sps->type_of_scaling_list_used[5]); } else { FillScalingList4x4(&sps->ScalingLists4x4[5],(uint8_t*) sps->ScalingLists4x4[4].ScalingListCoeffs); sps->type_of_scaling_list_used[5] = SCLDEFAULT; } // 0 if(Get1Bit()) { GetScalingList8x8(&sps->ScalingLists8x8[0],(uint8_t*)default_intra_scaling_list8x8,&sps->type_of_scaling_list_used[6]); } else { FillScalingList8x8(&sps->ScalingLists8x8[0],(uint8_t*) default_intra_scaling_list8x8); sps->type_of_scaling_list_used[6] = SCLDEFAULT; } // 1 if(Get1Bit()) { GetScalingList8x8(&sps->ScalingLists8x8[1],(uint8_t*) default_inter_scaling_list8x8,&sps->type_of_scaling_list_used[7]); } else { FillScalingList8x8(&sps->ScalingLists8x8[1],(uint8_t*) default_inter_scaling_list8x8); sps->type_of_scaling_list_used[7] = SCLDEFAULT; } } else { int32_t i; for (i = 0; i < 6; i += 1) { FillFlatScalingList4x4(&sps->ScalingLists4x4[i]); } for (i = 0; i < 2; i += 1) { FillFlatScalingList8x8(&sps->ScalingLists8x8[i]); } } } else { sps->chroma_format_idc = 1; sps->bit_depth_luma = 8; sps->bit_depth_chroma = 8; SetDefaultScalingLists(sps); } // log2 max frame num (bitstream contains value - 4) uint32_t log2_max_frame_num = GetVLCElement(false) + 4; sps->log2_max_frame_num = (uint8_t)log2_max_frame_num; if (log2_max_frame_num > 16 || log2_max_frame_num < 4) return UMC_ERR_INVALID_STREAM; // pic order cnt type (0..2) uint32_t pic_order_cnt_type = GetVLCElement(false); sps->pic_order_cnt_type = (uint8_t)pic_order_cnt_type; if (pic_order_cnt_type > 2) { return UMC_ERR_INVALID_STREAM; } if (sps->pic_order_cnt_type == 0) { // log2 max pic order count lsb (bitstream contains value - 4) uint32_t log2_max_pic_order_cnt_lsb = GetVLCElement(false) + 4; sps->log2_max_pic_order_cnt_lsb = (uint8_t)log2_max_pic_order_cnt_lsb; if (log2_max_pic_order_cnt_lsb > 16 || log2_max_pic_order_cnt_lsb < 4) return UMC_ERR_INVALID_STREAM; sps->MaxPicOrderCntLsb = (1 << sps->log2_max_pic_order_cnt_lsb); } else if (sps->pic_order_cnt_type == 1) { sps->delta_pic_order_always_zero_flag = Get1Bit(); sps->offset_for_non_ref_pic = GetVLCElement(true); sps->offset_for_top_to_bottom_field = GetVLCElement(true); sps->num_ref_frames_in_pic_order_cnt_cycle = GetVLCElement(false); if (sps->num_ref_frames_in_pic_order_cnt_cycle > 255) return UMC_ERR_INVALID_STREAM; // get offsets for (uint32_t i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++) { sps->poffset_for_ref_frame[i] = GetVLCElement(true); } } // pic order count type 1 // num ref frames sps->num_ref_frames = GetVLCElement(false); if (sps->num_ref_frames > 16) return UMC_ERR_INVALID_STREAM; sps->gaps_in_frame_num_value_allowed_flag = Get1Bit(); // picture width in MBs (bitstream contains value - 1) sps->frame_width_in_mbs = GetVLCElement(false) + 1; // picture height in MBs (bitstream contains value - 1) sps->frame_height_in_mbs = GetVLCElement(false) + 1; if (!(sps->frame_width_in_mbs * 16 < USHRT_MAX) || !(sps->frame_height_in_mbs * 16 < USHRT_MAX)) return UMC_ERR_INVALID_STREAM; sps->frame_mbs_only_flag = Get1Bit(); sps->frame_height_in_mbs = (2-sps->frame_mbs_only_flag)*sps->frame_height_in_mbs; if (sps->frame_mbs_only_flag == 0) { sps->mb_adaptive_frame_field_flag = Get1Bit(); } sps->direct_8x8_inference_flag = Get1Bit(); if (sps->frame_mbs_only_flag==0) { sps->direct_8x8_inference_flag = 1; } sps->frame_cropping_flag = Get1Bit(); if (sps->frame_cropping_flag) { sps->frame_cropping_rect_left_offset = GetVLCElement(false); sps->frame_cropping_rect_right_offset = GetVLCElement(false); sps->frame_cropping_rect_top_offset = GetVLCElement(false); sps->frame_cropping_rect_bottom_offset = GetVLCElement(false); // check cropping parameters int32_t cropX = SubWidthC[sps->chroma_format_idc] * sps->frame_cropping_rect_left_offset; int32_t cropY = SubHeightC[sps->chroma_format_idc] * sps->frame_cropping_rect_top_offset * (2 - sps->frame_mbs_only_flag); int32_t cropH = sps->frame_height_in_mbs * 16 - SubHeightC[sps->chroma_format_idc]*(2 - sps->frame_mbs_only_flag) * (sps->frame_cropping_rect_top_offset + sps->frame_cropping_rect_bottom_offset); int32_t cropW = sps->frame_width_in_mbs * 16 - SubWidthC[sps->chroma_format_idc] * (sps->frame_cropping_rect_left_offset + sps->frame_cropping_rect_right_offset); if (cropX < 0 || cropY < 0 || cropW < 0 || cropH < 0) return UMC_ERR_INVALID_STREAM; if (cropX > (int32_t)sps->frame_width_in_mbs * 16) return UMC_ERR_INVALID_STREAM; if (cropY > (int32_t)sps->frame_height_in_mbs * 16) return UMC_ERR_INVALID_STREAM; if (cropX + cropW > (int32_t)sps->frame_width_in_mbs * 16) return UMC_ERR_INVALID_STREAM; if (cropY + cropH > (int32_t)sps->frame_height_in_mbs * 16) return UMC_ERR_INVALID_STREAM; } // don't need else because we zeroid structure CheckBSLeft(); sps->vui_parameters_present_flag = Get1Bit(); if (sps->vui_parameters_present_flag) { H264VUI vui; Status vui_ps = GetVUIParam(sps, &vui); if (vui_ps == UMC_OK && IsBSLeft()) { sps->vui = vui; } } return ps; } // GetSequenceParamSet Status H264HeadersBitstream::GetVUIParam(H264SeqParamSet *sps, H264VUI *vui) { Status ps = UMC_OK; vui->Reset(); vui->aspect_ratio_info_present_flag = Get1Bit(); vui->sar_width = 1; // default values vui->sar_height = 1; if (vui->aspect_ratio_info_present_flag) { vui->aspect_ratio_idc = (uint8_t) GetBits(8); if (vui->aspect_ratio_idc == 255) { vui->sar_width = (uint16_t) GetBits(16); vui->sar_height = (uint16_t) GetBits(16); } else { if (!vui->aspect_ratio_idc || vui->aspect_ratio_idc >= sizeof(SAspectRatio)/sizeof(SAspectRatio[0])) { vui->aspect_ratio_info_present_flag = 0; } else { vui->sar_width = SAspectRatio[vui->aspect_ratio_idc][0]; vui->sar_height = SAspectRatio[vui->aspect_ratio_idc][1]; } } } vui->overscan_info_present_flag = Get1Bit(); if (vui->overscan_info_present_flag) vui->overscan_appropriate_flag = Get1Bit(); vui->video_signal_type_present_flag = Get1Bit(); if( vui->video_signal_type_present_flag ) { vui->video_format = (uint8_t) GetBits(3); vui->video_full_range_flag = Get1Bit(); vui->colour_description_present_flag = Get1Bit(); if( vui->colour_description_present_flag ) { vui->colour_primaries = (uint8_t) GetBits(8); vui->transfer_characteristics = (uint8_t) GetBits(8); vui->matrix_coefficients = (uint8_t) GetBits(8); } } vui->chroma_loc_info_present_flag = Get1Bit(); if( vui->chroma_loc_info_present_flag ) { vui->chroma_sample_loc_type_top_field = (uint8_t) GetVLCElement(false); vui->chroma_sample_loc_type_bottom_field = (uint8_t) GetVLCElement(false); } vui->timing_info_present_flag = Get1Bit(); if (vui->timing_info_present_flag) { vui->num_units_in_tick = GetBits(32); vui->time_scale = GetBits(32); vui->fixed_frame_rate_flag = Get1Bit(); if (!vui->num_units_in_tick || !vui->time_scale) vui->timing_info_present_flag = 0; } vui->nal_hrd_parameters_present_flag = Get1Bit(); if( vui->nal_hrd_parameters_present_flag ) ps=GetHRDParam(sps, vui); vui->vcl_hrd_parameters_present_flag = Get1Bit(); if( vui->vcl_hrd_parameters_present_flag ) ps=GetHRDParam(sps, vui); if( vui->nal_hrd_parameters_present_flag || vui->vcl_hrd_parameters_present_flag ) vui->low_delay_hrd_flag = Get1Bit(); vui->pic_struct_present_flag = Get1Bit(); vui->bitstream_restriction_flag = Get1Bit(); if( vui->bitstream_restriction_flag ) { vui->motion_vectors_over_pic_boundaries_flag = Get1Bit(); vui->max_bytes_per_pic_denom = (uint8_t) GetVLCElement(false); vui->max_bits_per_mb_denom = (uint8_t) GetVLCElement(false); vui->log2_max_mv_length_horizontal = (uint8_t) GetVLCElement(false); vui->log2_max_mv_length_vertical = (uint8_t) GetVLCElement(false); vui->num_reorder_frames = (uint8_t) GetVLCElement(false); int32_t value = GetVLCElement(false); if (value < (int32_t)sps->num_ref_frames || value < 0) { return UMC_ERR_INVALID_STREAM; } vui->max_dec_frame_buffering = (uint8_t)value; if (vui->max_dec_frame_buffering > 16) { return UMC_ERR_INVALID_STREAM; } } return ps; } Status H264HeadersBitstream::GetHRDParam(H264SeqParamSet *, H264VUI *vui) { uint32_t cpb_cnt = (uint32_t) (GetVLCElement(false) + 1); if (cpb_cnt >= 32) { return UMC_ERR_INVALID_STREAM; } vui->cpb_cnt = (uint8_t)cpb_cnt; vui->bit_rate_scale = (uint8_t) GetBits(4); vui->cpb_size_scale = (uint8_t) GetBits(4); for( int32_t idx= 0; idx < vui->cpb_cnt; idx++ ) { vui->bit_rate_value[ idx ] = (uint32_t) (GetVLCElement(false)+1); vui->cpb_size_value[ idx ] = (uint32_t) ((GetVLCElement(false)+1)); vui->cbr_flag[ idx ] = Get1Bit(); } vui->initial_cpb_removal_delay_length = (uint8_t)(GetBits(5)+1); vui->cpb_removal_delay_length = (uint8_t)(GetBits(5)+1); vui->dpb_output_delay_length = (uint8_t) (GetBits(5)+1); vui->time_offset_length = (uint8_t) GetBits(5); return UMC_OK; } // --------------------------------------------------------------------------- // Read sequence parameter set extension data from bitstream. // --------------------------------------------------------------------------- Status H264HeadersBitstream::GetSequenceParamSetExtension(H264SeqParamSetExtension *sps_ex) { sps_ex->Reset(); uint32_t seq_parameter_set_id = GetVLCElement(false); sps_ex->seq_parameter_set_id = (uint8_t)seq_parameter_set_id; if (seq_parameter_set_id > MAX_NUM_SEQ_PARAM_SETS-1) { return UMC_ERR_INVALID_STREAM; } uint32_t aux_format_idc = GetVLCElement(false); sps_ex->aux_format_idc = (uint8_t)aux_format_idc; if (aux_format_idc > 3) { return UMC_ERR_INVALID_STREAM; } if (sps_ex->aux_format_idc != 1 && sps_ex->aux_format_idc != 2) sps_ex->aux_format_idc = 0; if (sps_ex->aux_format_idc) { uint32_t bit_depth_aux = GetVLCElement(false) + 8; sps_ex->bit_depth_aux = (uint8_t)bit_depth_aux; if (bit_depth_aux > 12) { return UMC_ERR_INVALID_STREAM; } sps_ex->alpha_incr_flag = Get1Bit(); sps_ex->alpha_opaque_value = (uint8_t)GetBits(sps_ex->bit_depth_aux + 1); sps_ex->alpha_transparent_value = (uint8_t)GetBits(sps_ex->bit_depth_aux + 1); } sps_ex->additional_extension_flag = Get1Bit(); CheckBSLeft(); return UMC_OK; } // GetSequenceParamSetExtension template static Status DecodeViewReferenceInfo(num_t &numItems, items_t *pItems, H264HeadersBitstream &bitStream) { uint32_t j; // decode number of items numItems = (num_t) bitStream.GetVLCElement(false); if (H264_MAX_NUM_VIEW_REF <= numItems) { return UMC_ERR_INVALID_STREAM; } // decode items for (j = 0; j < numItems; j += 1) { pItems[j] = (items_t) bitStream.GetVLCElement(false); if (H264_MAX_NUM_VIEW <= pItems[j]) { return UMC_ERR_INVALID_STREAM; } } return UMC_OK; } // Status DecodeViewReferenceInfo(num_t &numItems, items_t *pItems, H264HeadersBitstream &bitStream) Status H264HeadersBitstream::GetSequenceParamSetSvcExt(H264SeqParamSetSVCExtension *pSPSSvcExt) { pSPSSvcExt->Reset(); if ((pSPSSvcExt->profile_idc != H264VideoDecoderParams::H264_PROFILE_SCALABLE_BASELINE) && (pSPSSvcExt->profile_idc != H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH)) return UMC_OK; pSPSSvcExt->inter_layer_deblocking_filter_control_present_flag = Get1Bit(); pSPSSvcExt->extended_spatial_scalability = (uint8_t)GetBits(2); if (pSPSSvcExt->chroma_format_idc == 1 || pSPSSvcExt->chroma_format_idc == 2) { pSPSSvcExt->chroma_phase_x = Get1Bit() - 1; pSPSSvcExt->seq_ref_layer_chroma_phase_x = pSPSSvcExt->chroma_phase_x; } if (pSPSSvcExt->chroma_format_idc == 1) { pSPSSvcExt->chroma_phase_y = (int8_t)(GetBits(2) - 1); pSPSSvcExt->seq_ref_layer_chroma_phase_y = pSPSSvcExt->chroma_phase_y; } if (pSPSSvcExt->extended_spatial_scalability == 1) { if (pSPSSvcExt->chroma_format_idc > 0) { pSPSSvcExt->seq_ref_layer_chroma_phase_x = Get1Bit() - 1; pSPSSvcExt->seq_ref_layer_chroma_phase_y = (int8_t)(GetBits(2) - 1); } pSPSSvcExt->seq_scaled_ref_layer_left_offset = GetVLCElement(true); pSPSSvcExt->seq_scaled_ref_layer_top_offset = GetVLCElement(true); pSPSSvcExt->seq_scaled_ref_layer_right_offset = GetVLCElement(true); pSPSSvcExt->seq_scaled_ref_layer_bottom_offset = GetVLCElement(true); } pSPSSvcExt->seq_tcoeff_level_prediction_flag = Get1Bit(); if (pSPSSvcExt->seq_tcoeff_level_prediction_flag) { pSPSSvcExt->adaptive_tcoeff_level_prediction_flag = Get1Bit(); } pSPSSvcExt->slice_header_restriction_flag = Get1Bit(); CheckBSLeft(); /* Reference has SVC VUI extension here, but there is no mention about it in standard */ uint32_t svc_vui_parameters_present_flag = Get1Bit(); if (svc_vui_parameters_present_flag) { GetSequenceParamSetSvcVuiExt(pSPSSvcExt); // ignore return status } Get1Bit(); // additional_extension2_flag return UMC_OK; } struct VUI_Entry { uint32_t vui_ext_dependency_id; uint32_t vui_ext_quality_id; uint32_t vui_ext_temporal_id; uint32_t vui_ext_timing_info_present_flag; uint32_t vui_ext_num_units_in_tick; uint32_t vui_ext_time_scale; uint32_t vui_ext_fixed_frame_rate_flag; uint32_t vui_ext_nal_hrd_parameters_present_flag; uint32_t vui_ext_vcl_hrd_parameters_present_flag; uint32_t vui_ext_low_delay_hrd_flag; uint32_t vui_ext_pic_struct_present_flag; }; struct SVC_VUI { uint32_t vui_ext_num_entries; VUI_Entry vui_entry[1023]; }; Status H264HeadersBitstream::GetSequenceParamSetSvcVuiExt(H264SeqParamSetSVCExtension *pSPSSvcExt) { SVC_VUI vui; vui.vui_ext_num_entries = GetVLCElement(false) + 1; if(vui.vui_ext_num_entries >= H264_MAX_VUI_EXT_NUM - 1) return UMC_ERR_INVALID_STREAM; for(uint32_t i = 0; i < vui.vui_ext_num_entries; i++) { vui.vui_entry[i].vui_ext_dependency_id = GetBits(3); vui.vui_entry[i].vui_ext_quality_id = GetBits(4); vui.vui_entry[i].vui_ext_temporal_id = GetBits(3); vui.vui_entry[i].vui_ext_timing_info_present_flag = Get1Bit(); if (vui.vui_entry[i].vui_ext_timing_info_present_flag) { vui.vui_entry[i].vui_ext_num_units_in_tick = GetBits(32); vui.vui_entry[i].vui_ext_time_scale = GetBits(32); vui.vui_entry[i].vui_ext_fixed_frame_rate_flag = Get1Bit(); } vui.vui_entry[i].vui_ext_nal_hrd_parameters_present_flag = Get1Bit(); if (vui.vui_entry[i].vui_ext_nal_hrd_parameters_present_flag) { Status sts = GetHRDParam(pSPSSvcExt, &pSPSSvcExt->vui); if (sts != UMC_OK) return sts; } vui.vui_entry[i].vui_ext_vcl_hrd_parameters_present_flag = Get1Bit(); if (vui.vui_entry[i].vui_ext_vcl_hrd_parameters_present_flag) { Status sts = GetHRDParam(pSPSSvcExt, &pSPSSvcExt->vui); if (sts != UMC_OK) return sts; } if (vui.vui_entry[i].vui_ext_nal_hrd_parameters_present_flag || vui.vui_entry[i].vui_ext_vcl_hrd_parameters_present_flag) vui.vui_entry[i].vui_ext_low_delay_hrd_flag = Get1Bit(); vui.vui_entry[i].vui_ext_pic_struct_present_flag = Get1Bit(); } return UMC_OK; } Status H264HeadersBitstream::GetSequenceParamSetMvcExt(H264SeqParamSetMVCExtension *pSPSMvcExt) { pSPSMvcExt->Reset(); // decode the number of available views pSPSMvcExt->num_views_minus1 = GetVLCElement(false); if (H264_MAX_NUM_VIEW <= pSPSMvcExt->num_views_minus1) { return UMC_ERR_INVALID_STREAM; } // allocate the views' info structs pSPSMvcExt->viewInfo.resize(pSPSMvcExt->num_views_minus1 + 1); // parse view IDs for (uint32_t i = 0; i <= pSPSMvcExt->num_views_minus1; i += 1) { H264ViewRefInfo &viewRefInfo = pSPSMvcExt->viewInfo[i]; // get the view ID viewRefInfo.view_id = GetVLCElement(false); if (H264_MAX_NUM_VIEW <= viewRefInfo.view_id) { return UMC_ERR_INVALID_STREAM; } } // parse anchor refs for (uint32_t i = 1; i <= pSPSMvcExt->num_views_minus1; i += 1) { H264ViewRefInfo &viewRefInfo = pSPSMvcExt->viewInfo[i]; uint32_t listNum; for (listNum = LIST_0; listNum <= LIST_1; listNum += 1) { // decode LX anchor refs info Status umcRes = DecodeViewReferenceInfo(viewRefInfo.num_anchor_refs_lx[listNum], viewRefInfo.anchor_refs_lx[listNum], *this); if (UMC_OK != umcRes) { return umcRes; } } } // parse non-anchor refs for (uint32_t i = 1; i <= pSPSMvcExt->num_views_minus1; i += 1) { H264ViewRefInfo &viewRefInfo = pSPSMvcExt->viewInfo[i]; uint32_t listNum; for (listNum = LIST_0; listNum <= LIST_1; listNum += 1) { // decode L0 non-anchor refs info Status umcRes = DecodeViewReferenceInfo(viewRefInfo.num_non_anchor_refs_lx[listNum], viewRefInfo.non_anchor_refs_lx[listNum], *this); if (UMC_OK != umcRes) { return umcRes; } } } // decode the number of applicable signal points pSPSMvcExt->num_level_values_signalled_minus1 = GetVLCElement(false); if (H264_MAX_NUM_OPS <= pSPSMvcExt->num_level_values_signalled_minus1) { return UMC_ERR_INVALID_STREAM; } // allocate the level info structure pSPSMvcExt->levelInfo.resize(pSPSMvcExt->num_level_values_signalled_minus1 + 1); // decode all ops for (uint32_t i = 0; i <= pSPSMvcExt->num_level_values_signalled_minus1; i += 1) { H264LevelValueSignaled &levelInfo = pSPSMvcExt->levelInfo[i]; uint32_t j; // decode the level's profile idc levelInfo.level_idc = (uint8_t) GetBits(8); MFX_CHECK(CheckLevel(levelInfo.level_idc), UMC_ERR_INVALID_STREAM); // decode the number of operation points levelInfo.num_applicable_ops_minus1 = (uint16_t) GetVLCElement(false); if (H264_MAX_NUM_VIEW <= levelInfo.num_applicable_ops_minus1) { return UMC_ERR_INVALID_STREAM; } // allocate the operation points structures levelInfo.opsInfo.resize(levelInfo.num_applicable_ops_minus1 + 1); // decode operation points for (j = 0; j <= levelInfo.num_applicable_ops_minus1; j += 1) { H264ApplicableOp &op = levelInfo.opsInfo[j]; uint32_t k; // decode the temporal ID of the op op.applicable_op_temporal_id = (uint8_t) GetBits(3); // decode the number of target views op.applicable_op_num_target_views_minus1 = (uint16_t) GetVLCElement(false); if (H264_MAX_NUM_VIEW <= op.applicable_op_num_target_views_minus1) { return UMC_ERR_INVALID_STREAM; } // allocate the target view ID array op.applicable_op_target_view_id.resize(op.applicable_op_num_target_views_minus1 + 1); // read target view IDs for (k = 0; k <= op.applicable_op_num_target_views_minus1; k += 1) { op.applicable_op_target_view_id[k] = (uint16_t) GetVLCElement(false); if (H264_MAX_NUM_VIEW <= op.applicable_op_target_view_id[k]) { return UMC_ERR_INVALID_STREAM; } } // decode applicable number of views op.applicable_op_num_views_minus1 = (uint16_t) GetVLCElement(false); if (H264_MAX_NUM_VIEW <= op.applicable_op_num_views_minus1) { return UMC_ERR_INVALID_STREAM; } } } CheckBSLeft(); return UMC_OK; } // Status H264HeadersBitstream::GetSequenceParamSetMvcExt(H264SeqParamSetMVCExtension *pSPSMvcExt) Status H264HeadersBitstream::GetPictureParamSetPart1(H264PicParamSet *pps) { // Not all members of the pic param set structure are contained in all // pic param sets. So start by init all to zero. pps->Reset(); // id uint32_t pic_parameter_set_id = GetVLCElement(false); pps->pic_parameter_set_id = (uint16_t)pic_parameter_set_id; if (pic_parameter_set_id > MAX_NUM_PIC_PARAM_SETS-1) { return UMC_ERR_INVALID_STREAM; } // seq param set referred to by this pic param set uint32_t seq_parameter_set_id = GetVLCElement(false); pps->seq_parameter_set_id = (uint8_t)seq_parameter_set_id; if (seq_parameter_set_id > MAX_NUM_SEQ_PARAM_SETS-1) { return UMC_ERR_INVALID_STREAM; } CheckBSLeft(); return UMC_OK; } // GetPictureParamSetPart1 // Number of bits required to code slice group ID, index is num_slice_groups - 2 static const uint8_t SGIdBits[7] = {1,2,2,3,3,3,3}; // --------------------------------------------------------------------------- // Read picture parameter set data from bitstream. // --------------------------------------------------------------------------- Status H264HeadersBitstream::GetPictureParamSetPart2(H264PicParamSet *pps, H264SeqParamSet const* sps) { if (!sps) return UMC_ERR_NULL_PTR; pps->entropy_coding_mode = Get1Bit(); pps->bottom_field_pic_order_in_frame_present_flag = Get1Bit(); // number of slice groups, bitstream has value - 1 pps->num_slice_groups = GetVLCElement(false) + 1; if (pps->num_slice_groups != 1) { if (pps->num_slice_groups > MAX_NUM_SLICE_GROUPS) { return UMC_ERR_INVALID_STREAM; } uint32_t slice_group_map_type = GetVLCElement(false); pps->SliceGroupInfo.slice_group_map_type = (uint8_t)slice_group_map_type; if (slice_group_map_type > 6) return UMC_ERR_INVALID_STREAM; uint32_t const PicSizeInMapUnits = sps->frame_width_in_mbs * sps->frame_height_in_mbs; // Get additional, map type dependent slice group data switch (pps->SliceGroupInfo.slice_group_map_type) { case 0: for (uint32_t slice_group = 0; slice_group < pps->num_slice_groups; slice_group++) { // run length, bitstream has value - 1 pps->SliceGroupInfo.run_length[slice_group] = GetVLCElement(false) + 1; if (pps->SliceGroupInfo.run_length[slice_group] > PicSizeInMapUnits) return UMC_ERR_INVALID_STREAM; } break; case 1: // no additional info break; case 2: for (uint32_t slice_group = 0; slice_group < (uint32_t)(pps->num_slice_groups-1); slice_group++) { pps->SliceGroupInfo.t1.top_left[slice_group] = GetVLCElement(false); if (pps->SliceGroupInfo.t1.top_left[slice_group] >= PicSizeInMapUnits) return UMC_ERR_INVALID_STREAM; pps->SliceGroupInfo.t1.bottom_right[slice_group] = GetVLCElement(false); if (pps->SliceGroupInfo.t1.bottom_right[slice_group] >= PicSizeInMapUnits) return UMC_ERR_INVALID_STREAM; // check for legal values if (pps->SliceGroupInfo.t1.top_left[slice_group] > pps->SliceGroupInfo.t1.bottom_right[slice_group]) { return UMC_ERR_INVALID_STREAM; } } break; case 3: case 4: case 5: // For map types 3..5, number of slice groups must be 2 if (pps->num_slice_groups != 2) { return UMC_ERR_INVALID_STREAM; } pps->SliceGroupInfo.t2.slice_group_change_direction_flag = Get1Bit(); pps->SliceGroupInfo.t2.slice_group_change_rate = GetVLCElement(false) + 1; if (pps->SliceGroupInfo.t2.slice_group_change_rate > PicSizeInMapUnits) return UMC_ERR_INVALID_STREAM; break; case 6: // mapping of slice group to map unit (macroblock if not fields) is // per map unit, read from bitstream { // number of map units, bitstream has value - 1 pps->SliceGroupInfo.t3.pic_size_in_map_units = GetVLCElement(false) + 1; if (pps->SliceGroupInfo.t3.pic_size_in_map_units != PicSizeInMapUnits) return UMC_ERR_INVALID_STREAM; uint32_t const len = std::max(1u, pps->SliceGroupInfo.t3.pic_size_in_map_units); pps->SliceGroupInfo.pSliceGroupIDMap.resize(len); // num_bits is Ceil(log2(num_groups)) - number of bits used to code each slice group id uint32_t const num_bits = SGIdBits[pps->num_slice_groups - 2]; for (uint32_t map_unit = 0; map_unit < pps->SliceGroupInfo.t3.pic_size_in_map_units; map_unit++) { uint8_t const slice_group_id = (uint8_t)GetBits(num_bits); if (slice_group_id > pps->num_slice_groups - 1) return UMC_ERR_INVALID_STREAM; pps->SliceGroupInfo.pSliceGroupIDMap[map_unit] = slice_group_id; } } break; default: return UMC_ERR_INVALID_STREAM; } // switch } // slice group info // number of list 0 ref pics used to decode picture, bitstream has value - 1 pps->num_ref_idx_l0_active = GetVLCElement(false) + 1; // number of list 1 ref pics used to decode picture, bitstream has value - 1 pps->num_ref_idx_l1_active = GetVLCElement(false) + 1; if (pps->num_ref_idx_l1_active > MAX_NUM_REF_FRAMES || pps->num_ref_idx_l0_active > MAX_NUM_REF_FRAMES) return UMC_ERR_INVALID_STREAM; // weighted pediction pps->weighted_pred_flag = Get1Bit(); pps->weighted_bipred_idc = (uint8_t)GetBits(2); // default slice QP, bitstream has value - 26 int32_t pic_init_qp = GetVLCElement(true) + 26; pps->pic_init_qp = (int8_t)pic_init_qp; if (pic_init_qp > QP_MAX) { //return UMC_ERR_INVALID_STREAM; } // default SP/SI slice QP, bitstream has value - 26 pps->pic_init_qs = (uint8_t)(GetVLCElement(true) + 26); if (pps->pic_init_qs > QP_MAX) { //return UMC_ERR_INVALID_STREAM; } pps->chroma_qp_index_offset[0] = (int8_t)GetVLCElement(true); if ((pps->chroma_qp_index_offset[0] < -12) || (pps->chroma_qp_index_offset[0] > 12)) { //return UMC_ERR_INVALID_STREAM; } pps->deblocking_filter_variables_present_flag = Get1Bit(); pps->constrained_intra_pred_flag = Get1Bit(); pps->redundant_pic_cnt_present_flag = Get1Bit(); if (More_RBSP_Data()) { pps->transform_8x8_mode_flag = Get1Bit(); pps->pic_scaling_matrix_present_flag = Get1Bit(); H264ScalingPicParams * scaling = &pps->scaling[0]; if (pps->pic_scaling_matrix_present_flag) { for (int32_t i = 0; i < 3; i++) { pps->pic_scaling_list_present_flag[i] = Get1Bit(); if (pps->pic_scaling_list_present_flag[i]) { GetScalingList4x4(&scaling->ScalingLists4x4[i], (uint8_t*)default_intra_scaling_list4x4, &pps->type_of_scaling_list_used[i]); } else { pps->type_of_scaling_list_used[i] = SCLDEFAULT; } } for (int32_t i = 3; i < 6; i++) { pps->pic_scaling_list_present_flag[i] = Get1Bit(); if (pps->pic_scaling_list_present_flag[i]) { GetScalingList4x4(&scaling->ScalingLists4x4[i], (uint8_t*)default_inter_scaling_list4x4, &pps->type_of_scaling_list_used[i]); } else { pps->type_of_scaling_list_used[i] = SCLDEFAULT; } } if (pps->transform_8x8_mode_flag) { pps->pic_scaling_list_present_flag[6] = Get1Bit(); if (pps->pic_scaling_list_present_flag[6]) { GetScalingList8x8(&scaling->ScalingLists8x8[0], (uint8_t*)default_intra_scaling_list8x8, &pps->type_of_scaling_list_used[6]); } else { pps->type_of_scaling_list_used[6] = SCLDEFAULT; } pps->pic_scaling_list_present_flag[7] = Get1Bit(); if (pps->pic_scaling_list_present_flag[7]) { GetScalingList8x8(&scaling->ScalingLists8x8[1], (uint8_t*)default_inter_scaling_list8x8, &pps->type_of_scaling_list_used[7]); } else { pps->type_of_scaling_list_used[7] = SCLDEFAULT; } } MFX_INTERNAL_CPY(&pps->scaling[1], &pps->scaling[0], sizeof(H264ScalingPicParams)); } pps->chroma_qp_index_offset[1] = (int8_t)GetVLCElement(true); } else { pps->chroma_qp_index_offset[1] = pps->chroma_qp_index_offset[0]; } CheckBSLeft(); return UMC_OK; } // GetPictureParamSet Status InitializePictureParamSet(H264PicParamSet *pps, const H264SeqParamSet *sps, bool isExtension) { if (!pps || !sps || pps->initialized[isExtension]) return UMC_OK; if (pps->num_slice_groups != 1) { uint32_t PicSizeInMapUnits = sps->frame_width_in_mbs * sps->frame_height_in_mbs; // for range checks // Get additional, map type dependent slice group data switch (pps->SliceGroupInfo.slice_group_map_type) { case 0: for (uint32_t slice_group=0; slice_groupnum_slice_groups; slice_group++) { if (pps->SliceGroupInfo.run_length[slice_group] > PicSizeInMapUnits) { return UMC_ERR_INVALID_STREAM; } } break; case 1: // no additional info break; case 2: for (uint32_t slice_group=0; slice_group<(uint32_t)(pps->num_slice_groups-1); slice_group++) { if (pps->SliceGroupInfo.t1.bottom_right[slice_group] >= PicSizeInMapUnits) { return UMC_ERR_INVALID_STREAM; } if ((pps->SliceGroupInfo.t1.top_left[slice_group] % sps->frame_width_in_mbs) > (pps->SliceGroupInfo.t1.bottom_right[slice_group] % sps->frame_width_in_mbs)) { return UMC_ERR_INVALID_STREAM; } } break; case 3: case 4: case 5: if (pps->SliceGroupInfo.t2.slice_group_change_rate > PicSizeInMapUnits) { return UMC_ERR_INVALID_STREAM; } break; case 6: // mapping of slice group to map unit (macroblock if not fields) is // per map unit, read from bitstream { if (pps->SliceGroupInfo.t3.pic_size_in_map_units != PicSizeInMapUnits) { return UMC_ERR_INVALID_STREAM; } for (uint32_t map_unit = 0; map_unit < pps->SliceGroupInfo.t3.pic_size_in_map_units; map_unit++) { if (pps->SliceGroupInfo.pSliceGroupIDMap[map_unit] > pps->num_slice_groups - 1) { return UMC_ERR_INVALID_STREAM; } } } break; default: return UMC_ERR_INVALID_STREAM; } // switch } // slice group info H264ScalingPicParams * scaling = &pps->scaling[isExtension]; if (pps->pic_scaling_matrix_present_flag) { uint8_t *default_scaling = (uint8_t*)default_intra_scaling_list4x4; for (int32_t i = 0; i < 6; i += 3) { if (!pps->pic_scaling_list_present_flag[i]) { if (sps->seq_scaling_matrix_present_flag) { FillScalingList4x4(&scaling->ScalingLists4x4[i], (uint8_t*)sps->ScalingLists4x4[i].ScalingListCoeffs); } else { FillScalingList4x4(&scaling->ScalingLists4x4[i], (uint8_t*)default_scaling); } } if (!pps->pic_scaling_list_present_flag[i+1]) { FillScalingList4x4(&scaling->ScalingLists4x4[i+1], (uint8_t*)scaling->ScalingLists4x4[i].ScalingListCoeffs); } if (!pps->pic_scaling_list_present_flag[i+2]) { FillScalingList4x4(&scaling->ScalingLists4x4[i+2], (uint8_t*)scaling->ScalingLists4x4[i+1].ScalingListCoeffs); } default_scaling = (uint8_t*)default_inter_scaling_list4x4; } if (pps->transform_8x8_mode_flag) { if (sps->seq_scaling_matrix_present_flag) { for (int32_t i = 6; i < 8; i++) { if (!pps->pic_scaling_list_present_flag[i]) { FillScalingList8x8(&scaling->ScalingLists8x8[i-6], (uint8_t*)sps->ScalingLists8x8[i-6].ScalingListCoeffs); } } } else { if (!pps->pic_scaling_list_present_flag[6]) { FillScalingList8x8(&scaling->ScalingLists8x8[0], (uint8_t*)default_intra_scaling_list8x8); } if (!pps->pic_scaling_list_present_flag[7]) { FillScalingList8x8(&scaling->ScalingLists8x8[1], (uint8_t*)default_inter_scaling_list8x8); } } } } else { for (int32_t i = 0; i < 6; i++) { FillScalingList4x4(&scaling->ScalingLists4x4[i],(uint8_t *)sps->ScalingLists4x4[i].ScalingListCoeffs); pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i]; } if (pps->transform_8x8_mode_flag) { for (int32_t i = 0; i < 2; i++) { FillScalingList8x8(&scaling->ScalingLists8x8[i],(uint8_t *)sps->ScalingLists8x8[i].ScalingListCoeffs); pps->type_of_scaling_list_used[i] = sps->type_of_scaling_list_used[i]; } } } // calculate level scale matrices //start DC first //to do: reduce th anumber of matrices (in fact 1 is enough) // now process other 4x4 matrices for (int32_t i = 0; i < 6; i++) { for (int32_t j = 0; j < 88; j++) for (int32_t k = 0; k < 16; k++) { uint32_t level_scale = scaling->ScalingLists4x4[i].ScalingListCoeffs[k]*pre_norm_adjust4x4[j%6][pre_norm_adjust_index4x4[k]]; scaling->m_LevelScale4x4[i].LevelScaleCoeffs[j][k] = (int16_t) level_scale; } } // process remaining 8x8 matrices for (int32_t i = 0; i < 2; i++) { for (int32_t j = 0; j < 88; j++) for (int32_t k = 0; k < 64; k++) { uint32_t level_scale = scaling->ScalingLists8x8[i].ScalingListCoeffs[k]*pre_norm_adjust8x8[j%6][pre_norm_adjust_index8x8[k]]; scaling->m_LevelScale8x8[i].LevelScaleCoeffs[j][k] = (int16_t) level_scale; } } pps->initialized[isExtension] = 1; return UMC_OK; } Status H264HeadersBitstream::GetNalUnitPrefix(H264NalExtension *pExt, uint32_t NALRef_idc) { Status ps = UMC_OK; ps = GetNalUnitExtension(pExt); if (ps != UMC_OK || !pExt->svc_extension_flag) return ps; if (pExt->svc.dependency_id || pExt->svc.quality_id) // shall be equals zero for prefix NAL units return UMC_ERR_INVALID_STREAM; pExt->svc.adaptiveMarkingInfo.num_entries = 0; if (NALRef_idc != 0) { pExt->svc.store_ref_base_pic_flag = Get1Bit(); if ((pExt->svc.use_ref_base_pic_flag || pExt->svc.store_ref_base_pic_flag) && !pExt->svc.idr_flag) { ps = DecRefBasePicMarking(&pExt->svc.adaptiveMarkingInfo, pExt->svc.adaptive_ref_base_pic_marking_mode_flag); if (ps != UMC_OK) return ps; } /*int32_t additional_prefix_nal_unit_extension_flag = (int32_t) Get1Bit(); if (additional_prefix_nal_unit_extension_flag == 1) { additional_prefix_nal_unit_extension_flag = Get1Bit(); }*/ } CheckBSLeft(); return ps; } // Status H264HeadersBitstream::GetNalUnitPrefix(void) Status H264HeadersBitstream::GetNalUnitExtension(H264NalExtension *pExt) { pExt->Reset(); pExt->extension_present = 1; // decode the type of the extension pExt->svc_extension_flag = (uint8_t) GetBits(1); // decode SVC extension if (pExt->svc_extension_flag) { pExt->svc.idr_flag = Get1Bit(); pExt->svc.priority_id = (uint8_t) GetBits(6); pExt->svc.no_inter_layer_pred_flag = Get1Bit(); pExt->svc.dependency_id = (uint8_t) GetBits(3); pExt->svc.quality_id = (uint8_t) GetBits(4); pExt->svc.temporal_id = (uint8_t) GetBits(3); pExt->svc.use_ref_base_pic_flag = Get1Bit(); pExt->svc.discardable_flag = Get1Bit(); pExt->svc.output_flag = Get1Bit(); GetBits(2); } // decode MVC extension else { pExt->mvc.non_idr_flag = Get1Bit(); pExt->mvc.priority_id = (uint16_t) GetBits(6); pExt->mvc.view_id = (uint16_t) GetBits(10); pExt->mvc.temporal_id = (uint8_t) GetBits(3); pExt->mvc.anchor_pic_flag = Get1Bit(); pExt->mvc.inter_view_flag = Get1Bit(); GetBits(1); } CheckBSLeft(); return UMC_OK; } // Status H264HeadersBitstream::GetNalUnitExtension(H264NalExtension *pExt) // --------------------------------------------------------------------------- // Read H.264 first part of slice header // // Reading the rest of the header requires info in the picture and sequence // parameter sets referred to by this slice header. // // Do not print debug messages when IsSearch is true. In that case the function // is being used to find the next compressed frame, errors may occur and should // not be reported. // // --------------------------------------------------------------------------- Status H264HeadersBitstream::GetSliceHeaderPart1(H264SliceHeader *hdr) { uint32_t val; // decode NAL extension if (NAL_UT_CODED_SLICE_EXTENSION == hdr->nal_unit_type) { GetNalUnitExtension(&hdr->nal_ext); // set the IDR flag if (hdr->nal_ext.svc_extension_flag) { hdr->IdrPicFlag = hdr->nal_ext.svc.idr_flag; } else { hdr->IdrPicFlag = hdr->nal_ext.mvc.non_idr_flag ^ 1; } } else { if (hdr->nal_ext.extension_present) { if (hdr->nal_ext.svc_extension_flag) { //hdr->IdrPicFlag = hdr->nal_ext.svc.idr_flag; } else { //hdr->IdrPicFlag = hdr->nal_ext.mvc.non_idr_flag ^ 1; } } else { //hdr->IdrPicFlag = (NAL_UT_IDR_SLICE == hdr->nal_unit_type) ? 1 : 0; hdr->nal_ext.mvc.anchor_pic_flag = (uint8_t) hdr->IdrPicFlag ? 1 : 0; hdr->nal_ext.mvc.inter_view_flag = (uint8_t) 1; } hdr->IdrPicFlag = (NAL_UT_IDR_SLICE == hdr->nal_unit_type) ? 1 : 0; } hdr->first_mb_in_slice = GetVLCElement(false); if (0 > hdr->first_mb_in_slice) // upper bound is checked in H264Slice return UMC_ERR_INVALID_STREAM; // slice type val = GetVLCElement(false); if (val > S_INTRASLICE) { if (val > S_INTRASLICE + S_INTRASLICE + 1) { return UMC_ERR_INVALID_STREAM; } else { // Slice type is specifying type of not only this but all remaining // slices in the picture. Since slice type is always present, this bit // of info is not used in our implementation. Adjust (just shift range) // and return type without this extra info. val -= (S_INTRASLICE + 1); } } if (val > INTRASLICE) // all other doesn't support return UMC_ERR_INVALID_STREAM; hdr->slice_type = (EnumSliceCodType)val; if (NAL_UT_IDR_SLICE == hdr->nal_unit_type && hdr->slice_type != INTRASLICE) return UMC_ERR_INVALID_STREAM; uint32_t pic_parameter_set_id = GetVLCElement(false); hdr->pic_parameter_set_id = (uint16_t)pic_parameter_set_id; if (pic_parameter_set_id > MAX_NUM_PIC_PARAM_SETS - 1) { return UMC_ERR_INVALID_STREAM; } CheckBSLeft(); return UMC_OK; } // Status GetSliceHeaderPart1(H264SliceHeader *pSliceHeader) Status H264HeadersBitstream::GetSliceHeaderPart2(H264SliceHeader *hdr, const H264PicParamSet *pps, const H264SeqParamSet *sps) { hdr->frame_num = GetBits(sps->log2_max_frame_num); hdr->bottom_field_flag = 0; if (sps->frame_mbs_only_flag == 0) { hdr->field_pic_flag = Get1Bit(); hdr->MbaffFrameFlag = !hdr->field_pic_flag && sps->mb_adaptive_frame_field_flag; if (hdr->field_pic_flag != 0) { hdr->bottom_field_flag = Get1Bit(); } } if (hdr->MbaffFrameFlag) { uint32_t const first_mb_in_slice = hdr->first_mb_in_slice; if (first_mb_in_slice * 2 > INT_MAX) return UMC_ERR_INVALID_STREAM; // correct frst_mb_in_slice in order to handle MBAFF hdr->first_mb_in_slice *= 2; } if (hdr->IdrPicFlag) { int32_t pic_id = hdr->idr_pic_id = GetVLCElement(false); if (pic_id < 0 || pic_id > 65535) return UMC_ERR_INVALID_STREAM; } if (sps->pic_order_cnt_type == 0) { hdr->pic_order_cnt_lsb = GetBits(sps->log2_max_pic_order_cnt_lsb); if (pps->bottom_field_pic_order_in_frame_present_flag && (!hdr->field_pic_flag)) hdr->delta_pic_order_cnt_bottom = GetVLCElement(true); } if ((sps->pic_order_cnt_type == 1) && (sps->delta_pic_order_always_zero_flag == 0)) { hdr->delta_pic_order_cnt[0] = GetVLCElement(true); if (pps->bottom_field_pic_order_in_frame_present_flag && (!hdr->field_pic_flag)) hdr->delta_pic_order_cnt[1] = GetVLCElement(true); } if (pps->redundant_pic_cnt_present_flag) { hdr->hw_wa_redundant_elimination_bits[0] = (uint32_t)BitsDecoded(); // redundant pic count hdr->redundant_pic_cnt = GetVLCElement(false); if (hdr->redundant_pic_cnt > 127) return UMC_ERR_INVALID_STREAM; hdr->hw_wa_redundant_elimination_bits[1] = (uint32_t)BitsDecoded(); } CheckBSLeft(); return UMC_OK; } Status H264HeadersBitstream::DecRefBasePicMarking(AdaptiveMarkingInfo *pAdaptiveMarkingInfo, uint8_t &adaptive_ref_pic_marking_mode_flag) { uint32_t memory_management_control_operation; uint32_t num_entries = 0; adaptive_ref_pic_marking_mode_flag = Get1Bit(); while (adaptive_ref_pic_marking_mode_flag != 0) { memory_management_control_operation = (uint8_t)GetVLCElement(false); if (memory_management_control_operation == 0) break; if (memory_management_control_operation > 6) return UMC_ERR_INVALID_STREAM; pAdaptiveMarkingInfo->mmco[num_entries] = (uint8_t)memory_management_control_operation; if (memory_management_control_operation != 5) pAdaptiveMarkingInfo->value[num_entries*2] = GetVLCElement(false); // Only mmco 3 requires 2 values if (memory_management_control_operation == 3) pAdaptiveMarkingInfo->value[num_entries*2+1] = GetVLCElement(false); num_entries++; if (num_entries >= MAX_NUM_MMCO_ENTRIES) { return UMC_ERR_INVALID_STREAM; } } // while pAdaptiveMarkingInfo->num_entries = num_entries; return UMC_OK; } Status H264HeadersBitstream::GetPredWeightTable( H264SliceHeader *hdr, // slice header read goes here const H264SeqParamSet *sps, PredWeightTable *pPredWeight_L0, // L0 weight table goes here PredWeightTable *pPredWeight_L1) // L1 weight table goes here { uint32_t luma_log2_weight_denom = GetVLCElement(false); hdr->luma_log2_weight_denom = (uint8_t)luma_log2_weight_denom; if (luma_log2_weight_denom > 7) return UMC_ERR_INVALID_STREAM; if (sps->chroma_format_idc != 0) { uint32_t chroma_log2_weight_denom = GetVLCElement(false); hdr->chroma_log2_weight_denom = (uint8_t)chroma_log2_weight_denom; if (chroma_log2_weight_denom > 7) return UMC_ERR_INVALID_STREAM; } for (int32_t refindex = 0; refindex < hdr->num_ref_idx_l0_active; refindex++) { pPredWeight_L0[refindex].luma_weight_flag = Get1Bit(); if (pPredWeight_L0[refindex].luma_weight_flag) { pPredWeight_L0[refindex].luma_weight = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].luma_offset = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].luma_offset <<= (sps->bit_depth_luma - 8); } else { pPredWeight_L0[refindex].luma_weight = (int8_t)(1 << hdr->luma_log2_weight_denom); pPredWeight_L0[refindex].luma_offset = 0; } pPredWeight_L0[refindex].chroma_weight_flag = 0; if (sps->chroma_format_idc != 0) { pPredWeight_L0[refindex].chroma_weight_flag = Get1Bit(); } if (pPredWeight_L0[refindex].chroma_weight_flag) { pPredWeight_L0[refindex].chroma_weight[0] = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].chroma_offset[0] = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].chroma_weight[1] = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].chroma_offset[1] = (int8_t)GetVLCElement(true); pPredWeight_L0[refindex].chroma_offset[0] <<= (sps->bit_depth_chroma - 8); pPredWeight_L0[refindex].chroma_offset[1] <<= (sps->bit_depth_chroma - 8); } else { pPredWeight_L0[refindex].chroma_weight[0] = (int8_t)(1 << hdr->chroma_log2_weight_denom); pPredWeight_L0[refindex].chroma_weight[1] = (int8_t)(1 << hdr->chroma_log2_weight_denom); pPredWeight_L0[refindex].chroma_offset[0] = 0; pPredWeight_L0[refindex].chroma_offset[1] = 0; } } if (BPREDSLICE == hdr->slice_type) { for (int32_t refindex = 0; refindex < hdr->num_ref_idx_l1_active; refindex++) { pPredWeight_L1[refindex].luma_weight_flag = Get1Bit(); if (pPredWeight_L1[refindex].luma_weight_flag) { pPredWeight_L1[refindex].luma_weight = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].luma_offset = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].luma_offset <<= (sps->bit_depth_luma - 8); } else { pPredWeight_L1[refindex].luma_weight = (int8_t)(1 << hdr->luma_log2_weight_denom); pPredWeight_L1[refindex].luma_offset = 0; } pPredWeight_L1[refindex].chroma_weight_flag = 0; if (sps->chroma_format_idc != 0) pPredWeight_L1[refindex].chroma_weight_flag = Get1Bit(); if (pPredWeight_L1[refindex].chroma_weight_flag) { pPredWeight_L1[refindex].chroma_weight[0] = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].chroma_offset[0] = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].chroma_weight[1] = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].chroma_offset[1] = (int8_t)GetVLCElement(true); pPredWeight_L1[refindex].chroma_offset[0] <<= (sps->bit_depth_chroma - 8); pPredWeight_L1[refindex].chroma_offset[1] <<= (sps->bit_depth_chroma - 8); } else { pPredWeight_L1[refindex].chroma_weight[0] = (int8_t)(1 << hdr->chroma_log2_weight_denom); pPredWeight_L1[refindex].chroma_weight[1] = (int8_t)(1 << hdr->chroma_log2_weight_denom); pPredWeight_L1[refindex].chroma_offset[0] = 0; pPredWeight_L1[refindex].chroma_offset[1] = 0; } } } // B slice return UMC_OK; } Status H264HeadersBitstream::GetSliceHeaderPart3( H264SliceHeader *hdr, // slice header read goes here PredWeightTable *pPredWeight_L0, // L0 weight table goes here PredWeightTable *pPredWeight_L1, // L1 weight table goes here RefPicListReorderInfo *pReorderInfo_L0, RefPicListReorderInfo *pReorderInfo_L1, AdaptiveMarkingInfo *pAdaptiveMarkingInfo, AdaptiveMarkingInfo *pBaseAdaptiveMarkingInfo, const H264PicParamSet *pps, const H264SeqParamSet *sps, const H264SeqParamSetSVCExtension *spsSvcExt) { uint8_t ref_pic_list_reordering_flag_l0 = 0; uint8_t ref_pic_list_reordering_flag_l1 = 0; Status ps = UMC_OK; pReorderInfo_L0->num_entries = 0; pReorderInfo_L1->num_entries = 0; hdr->num_ref_idx_l0_active = pps->num_ref_idx_l0_active; hdr->num_ref_idx_l1_active = pps->num_ref_idx_l1_active; hdr->direct_spatial_mv_pred_flag = 1; if (!hdr->nal_ext.svc_extension_flag || hdr->nal_ext.svc.quality_id == 0) { if (BPREDSLICE == hdr->slice_type) { // direct mode prediction method hdr->direct_spatial_mv_pred_flag = Get1Bit(); } if (PREDSLICE == hdr->slice_type || S_PREDSLICE == hdr->slice_type || BPREDSLICE == hdr->slice_type) { hdr->num_ref_idx_active_override_flag = Get1Bit(); if (hdr->num_ref_idx_active_override_flag != 0) // ref idx active l0 and l1 { hdr->num_ref_idx_l0_active = GetVLCElement(false) + 1; if (BPREDSLICE == hdr->slice_type) hdr->num_ref_idx_l1_active = GetVLCElement(false) + 1; } } // ref idx override if (hdr->num_ref_idx_l0_active < 0 || hdr->num_ref_idx_l0_active > (int32_t)MAX_NUM_REF_FRAMES || hdr->num_ref_idx_l1_active < 0 || hdr->num_ref_idx_l1_active > (int32_t)MAX_NUM_REF_FRAMES) return UMC_ERR_INVALID_STREAM; if (hdr->slice_type != INTRASLICE && hdr->slice_type != S_INTRASLICE) { uint32_t reordering_of_pic_nums_idc; uint32_t reorder_idx; // Reference picture list reordering ref_pic_list_reordering_flag_l0 = Get1Bit(); if (ref_pic_list_reordering_flag_l0) { reorder_idx = 0; reordering_of_pic_nums_idc = 0; // Get reorder idc,pic_num pairs until idc==3 for (;;) { reordering_of_pic_nums_idc = (uint8_t)GetVLCElement(false); if (reordering_of_pic_nums_idc > 5) return UMC_ERR_INVALID_STREAM; if (reordering_of_pic_nums_idc == 3) break; if (reorder_idx >= MAX_NUM_REF_FRAMES) { return UMC_ERR_INVALID_STREAM; } pReorderInfo_L0->reordering_of_pic_nums_idc[reorder_idx] = (uint8_t)reordering_of_pic_nums_idc; pReorderInfo_L0->reorder_value[reorder_idx] = GetVLCElement(false); if (reordering_of_pic_nums_idc != 2) // abs_diff_pic_num is coded minus 1 pReorderInfo_L0->reorder_value[reorder_idx]++; reorder_idx++; } // while pReorderInfo_L0->num_entries = reorder_idx; } // L0 reordering info else pReorderInfo_L0->num_entries = 0; if (BPREDSLICE == hdr->slice_type) { ref_pic_list_reordering_flag_l1 = Get1Bit(); if (ref_pic_list_reordering_flag_l1) { // Get reorder idc,pic_num pairs until idc==3 reorder_idx = 0; reordering_of_pic_nums_idc = 0; for (;;) { reordering_of_pic_nums_idc = GetVLCElement(false); if (reordering_of_pic_nums_idc > 5) return UMC_ERR_INVALID_STREAM; if (reordering_of_pic_nums_idc == 3) break; if (reorder_idx >= MAX_NUM_REF_FRAMES) return UMC_ERR_INVALID_STREAM; pReorderInfo_L1->reordering_of_pic_nums_idc[reorder_idx] = (uint8_t)reordering_of_pic_nums_idc; pReorderInfo_L1->reorder_value[reorder_idx] = GetVLCElement(false); if (reordering_of_pic_nums_idc != 2) // abs_diff_pic_num is coded minus 1 pReorderInfo_L1->reorder_value[reorder_idx]++; reorder_idx++; } // while pReorderInfo_L1->num_entries = reorder_idx; } // L1 reordering info else pReorderInfo_L1->num_entries = 0; } // B slice } // reordering info hdr->luma_log2_weight_denom = 0; hdr->chroma_log2_weight_denom = 0; // prediction weight table if ( (pps->weighted_pred_flag && ((PREDSLICE == hdr->slice_type) || (S_PREDSLICE == hdr->slice_type))) || ((pps->weighted_bipred_idc == 1) && (BPREDSLICE == hdr->slice_type))) { ps = GetPredWeightTable(hdr, sps, pPredWeight_L0, pPredWeight_L1); if (ps != UMC_OK) return ps; } // dec_ref_pic_marking pAdaptiveMarkingInfo->num_entries = 0; pBaseAdaptiveMarkingInfo->num_entries = 0; if (hdr->nal_ref_idc) { ps = DecRefPicMarking(hdr, pAdaptiveMarkingInfo); if (ps != UMC_OK) { return ps; } if (hdr->nal_unit_type == NAL_UT_CODED_SLICE_EXTENSION && hdr->nal_ext.svc_extension_flag && spsSvcExt && !spsSvcExt->slice_header_restriction_flag) { hdr->nal_ext.svc.store_ref_base_pic_flag = Get1Bit(); if ((hdr->nal_ext.svc.use_ref_base_pic_flag || hdr->nal_ext.svc.store_ref_base_pic_flag) && (!hdr->nal_ext.svc.idr_flag)) { ps = DecRefBasePicMarking(pBaseAdaptiveMarkingInfo, hdr->nal_ext.svc.adaptive_ref_base_pic_marking_mode_flag); if (ps != UMC_OK) return ps; } } } // def_ref_pic_marking } if (pps->entropy_coding_mode == 1 && // CABAC (hdr->slice_type != INTRASLICE && hdr->slice_type != S_INTRASLICE)) hdr->cabac_init_idc = GetVLCElement(false); else hdr->cabac_init_idc = 0; if (hdr->cabac_init_idc > 2) return UMC_ERR_INVALID_STREAM; hdr->slice_qp_delta = GetVLCElement(true); if (S_PREDSLICE == hdr->slice_type || S_INTRASLICE == hdr->slice_type) { if (S_PREDSLICE == hdr->slice_type) hdr->sp_for_switch_flag = Get1Bit(); hdr->slice_qs_delta = GetVLCElement(true); } if (pps->deblocking_filter_variables_present_flag) { // deblock filter flag and offsets hdr->disable_deblocking_filter_idc = GetVLCElement(false); if (hdr->disable_deblocking_filter_idc > DEBLOCK_FILTER_ON_NO_SLICE_EDGES) return UMC_ERR_INVALID_STREAM; if (hdr->disable_deblocking_filter_idc != DEBLOCK_FILTER_OFF) { hdr->slice_alpha_c0_offset = GetVLCElement(true)<<1; hdr->slice_beta_offset = GetVLCElement(true)<<1; if (hdr->slice_alpha_c0_offset < -12 || hdr->slice_alpha_c0_offset > 12) { return UMC_ERR_INVALID_STREAM; } if (hdr->slice_beta_offset < -12 || hdr->slice_beta_offset > 12) { return UMC_ERR_INVALID_STREAM; } } else { // set filter offsets to max values to disable filter hdr->slice_alpha_c0_offset = (int8_t)(0 - QP_MAX); hdr->slice_beta_offset = (int8_t)(0 - QP_MAX); } } if (pps->num_slice_groups > 1 && pps->SliceGroupInfo.slice_group_map_type >= 3 && pps->SliceGroupInfo.slice_group_map_type <= 5) { uint32_t num_bits; // number of bits used to code slice_group_change_cycle uint32_t val; uint32_t pic_size_in_map_units; uint32_t max_slice_group_change_cycle=0; // num_bits is Ceil(log2(picsizeinmapunits/slicegroupchangerate + 1)) pic_size_in_map_units = sps->frame_width_in_mbs * sps->frame_height_in_mbs; // TBD: change above to support fields max_slice_group_change_cycle = pic_size_in_map_units / pps->SliceGroupInfo.t2.slice_group_change_rate; if (pic_size_in_map_units % pps->SliceGroupInfo.t2.slice_group_change_rate) max_slice_group_change_cycle++; val = max_slice_group_change_cycle;// + 1; num_bits = 0; while (val) { num_bits++; val >>= 1; } hdr->slice_group_change_cycle = GetBits(num_bits); if (hdr->slice_group_change_cycle > max_slice_group_change_cycle) { //return UMC_ERR_INVALID_STREAM; don't see any reasons for that } } CheckBSLeft(); return UMC_OK; } // GetSliceHeaderPart3() Status H264HeadersBitstream::DecRefPicMarking(H264SliceHeader *hdr, // slice header read goes here AdaptiveMarkingInfo *pAdaptiveMarkingInfo) { if (hdr->IdrPicFlag) { hdr->no_output_of_prior_pics_flag = Get1Bit(); hdr->long_term_reference_flag = Get1Bit(); } else { return DecRefBasePicMarking(pAdaptiveMarkingInfo, hdr->adaptive_ref_pic_marking_mode_flag); } return UMC_OK; } Status H264HeadersBitstream::GetSliceHeaderPart4(H264SliceHeader *hdr, const H264SeqParamSetSVCExtension *) { hdr->scan_idx_start = 0; hdr->scan_idx_end = 15; return UMC_OK; }// GetSliceHeaderPart4() void H264HeadersBitstream::GetScalingList4x4(H264ScalingList4x4 *scl, uint8_t *def, uint8_t *scl_type) { uint32_t lastScale = 8; uint32_t nextScale = 8; bool DefaultMatrix = false; int32_t j; for (j = 0; j < 16; j++ ) { if (nextScale != 0) { int32_t delta_scale = GetVLCElement(true); if (delta_scale < -128 || delta_scale > 127) throw h264_exception(UMC_ERR_INVALID_STREAM); nextScale = ( lastScale + delta_scale + 256 ) & 0xff; DefaultMatrix = ( j == 0 && nextScale == 0 ); } scl->ScalingListCoeffs[ mp_scan4x4[0][j] ] = ( nextScale == 0 ) ? (uint8_t)lastScale : (uint8_t)nextScale; lastScale = scl->ScalingListCoeffs[ mp_scan4x4[0][j] ]; } if (!DefaultMatrix) { *scl_type=SCLREDEFINED; return; } *scl_type= SCLDEFAULT; FillScalingList4x4(scl,def); return; } void H264HeadersBitstream::GetScalingList8x8(H264ScalingList8x8 *scl, uint8_t *def, uint8_t *scl_type) { uint32_t lastScale = 8; uint32_t nextScale = 8; bool DefaultMatrix=false; int32_t j; for (j = 0; j < 64; j++ ) { if (nextScale != 0) { int32_t delta_scale = GetVLCElement(true); if (delta_scale < -128 || delta_scale > 127) throw h264_exception(UMC_ERR_INVALID_STREAM); nextScale = ( lastScale + delta_scale + 256 ) & 0xff; DefaultMatrix = ( j == 0 && nextScale == 0 ); } scl->ScalingListCoeffs[ hp_scan8x8[0][j] ] = ( nextScale == 0 ) ? (uint8_t)lastScale : (uint8_t)nextScale; lastScale = scl->ScalingListCoeffs[ hp_scan8x8[0][j] ]; } if (!DefaultMatrix) { *scl_type=SCLREDEFINED; return; } *scl_type= SCLDEFAULT; FillScalingList8x8(scl,def); return; } Status H264HeadersBitstream::GetNALUnitType(NAL_Unit_Type &nal_unit_type, uint32_t &nal_ref_idc) { uint32_t code; CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, code); nal_ref_idc = (uint32_t) ((code & NAL_STORAGE_IDC_BITS)>>5); nal_unit_type = (NAL_Unit_Type) (code & NAL_UNITTYPE_BITS); return UMC_OK; } const H264SeqParamSet *GetSeqParams(const Headers & headers, int32_t seq_parameter_set_id) { if (seq_parameter_set_id == -1) return 0; const H264SeqParamSet *csps = headers.m_SeqParams.GetHeader(seq_parameter_set_id); if (csps) return csps; csps = headers.m_SeqParamsMvcExt.GetHeader(seq_parameter_set_id); if (csps) return csps; csps = headers.m_SeqParamsSvcExt.GetHeader(seq_parameter_set_id); if (csps) return csps; return 0; } int32_t H264HeadersBitstream::ParseSEI(const Headers & headers, H264SEIPayLoad *spl) { int32_t current_sps = headers.m_SeqParams.GetCurrentID(); return sei_message(headers, current_sps, spl); } int32_t H264HeadersBitstream::sei_message(const Headers & headers, int32_t current_sps, H264SEIPayLoad *spl) { uint32_t code; int32_t payloadType = 0; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); while (code == 0xFF) { /* fixed-pattern bit string using 8 bits written equal to 0xFF */ CheckBitsLeft(16); h264GetBits(m_pbs, m_bitOffset, 8, code); payloadType += 255; PeakNextBits(m_pbs, m_bitOffset, 8, code); } int32_t last_payload_type_byte; //uint32_t integer using 8 bits CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, last_payload_type_byte); payloadType += last_payload_type_byte; int32_t payloadSize = 0; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); while( code == 0xFF ) { /* fixed-pattern bit string using 8 bits written equal to 0xFF */ CheckBitsLeft(16); h264GetBits(m_pbs, m_bitOffset, 8, code); payloadSize += 255; PeakNextBits(m_pbs, m_bitOffset, 8, code); } int32_t last_payload_size_byte; //uint32_t integer using 8 bits CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, last_payload_size_byte); payloadSize += last_payload_size_byte; spl->Reset(); spl->payLoadSize = payloadSize; if (payloadType < 0 || payloadType > SEI_RESERVED) payloadType = SEI_RESERVED; spl->payLoadType = (SEI_TYPE)payloadType; if (spl->payLoadSize > BytesLeft()) { throw h264_exception(UMC_ERR_INVALID_STREAM); } uint32_t * pbs; uint32_t bitOffsetU; int32_t bitOffset; GetState(&pbs, &bitOffsetU); bitOffset = bitOffsetU; CheckBSLeft(spl->payLoadSize); spl->isValid = 1; int32_t ret = sei_payload(headers, current_sps, spl); for (uint32_t i = 0; i < spl->payLoadSize; i++) { SkipNBits(pbs, bitOffset, 8); } SetState(pbs, bitOffset); return ret; } int32_t H264HeadersBitstream::sei_payload(const Headers & headers, int32_t current_sps,H264SEIPayLoad *spl) { uint32_t payloadType =spl->payLoadType; switch( payloadType) { case SEI_BUFFERING_PERIOD_TYPE: buffering_period(headers, current_sps,spl); break; case SEI_PIC_TIMING_TYPE: pic_timing(headers,current_sps,spl); break; case SEI_DEC_REF_PIC_MARKING_TYPE: dec_ref_pic_marking_repetition(headers,current_sps,spl); break; case SEI_USER_DATA_REGISTERED_TYPE: user_data_registered_itu_t_t35(spl); break; case SEI_RECOVERY_POINT_TYPE: recovery_point(spl); break; case SEI_SCALABILITY_INFO: scalability_info(spl); break; case SEI_SCALABLE_NESTING: case SEI_USER_DATA_UNREGISTERED_TYPE: case SEI_PAN_SCAN_RECT_TYPE: case SEI_FILLER_TYPE: case SEI_SPARE_PIC_TYPE: case SEI_SCENE_INFO_TYPE: case SEI_SUB_SEQ_INFO_TYPE: case SEI_SUB_SEQ_LAYER_TYPE: case SEI_SUB_SEQ_TYPE: case SEI_FULL_FRAME_FREEZE_TYPE: case SEI_FULL_FRAME_FREEZE_RELEASE_TYPE: case SEI_FULL_FRAME_SNAPSHOT_TYPE: case SEI_PROGRESSIVE_REF_SEGMENT_START_TYPE: case SEI_PROGRESSIVE_REF_SEGMENT_END_TYPE: case SEI_MOTION_CONSTRAINED_SG_SET_TYPE: default: unparsed_sei_message(spl); break; } return current_sps; } int32_t H264HeadersBitstream::buffering_period(const Headers & headers, int32_t , H264SEIPayLoad *spl) { int32_t seq_parameter_set_id = (uint8_t) GetVLCElement(false); const H264SeqParamSet *csps = GetSeqParams(headers, seq_parameter_set_id); H264SEIPayLoad::SEIMessages::BufferingPeriod &bps = spl->SEI_messages.buffering_period; // touch unreferenced parameters if (!csps) { throw h264_exception(UMC_ERR_INVALID_STREAM); } if (csps->vui.nal_hrd_parameters_present_flag) { if (csps->vui.cpb_cnt >= 32) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t i=0; i < csps->vui.cpb_cnt; i++) { bps.initial_cpb_removal_delay[0][i] = GetBits(csps->vui.initial_cpb_removal_delay_length); bps.initial_cpb_removal_delay_offset[0][i] = GetBits(csps->vui.initial_cpb_removal_delay_length); } } if (csps->vui.vcl_hrd_parameters_present_flag) { if (csps->vui.cpb_cnt >= 32) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t i=0; i < csps->vui.cpb_cnt; i++) { bps.initial_cpb_removal_delay[1][i] = GetBits(csps->vui.cpb_removal_delay_length); bps.initial_cpb_removal_delay_offset[1][i] = GetBits(csps->vui.cpb_removal_delay_length); } } AlignPointerRight(); return seq_parameter_set_id; } int32_t H264HeadersBitstream::pic_timing(const Headers & headers, int32_t current_sps, H264SEIPayLoad *spl) { if (current_sps == -1) throw h264_exception(UMC_ERR_INVALID_STREAM); const uint8_t NumClockTS[]={1,1,1,2,2,3,3,2,3}; const H264SeqParamSet *csps = GetSeqParams(headers, current_sps); H264SEIPayLoad::SEIMessages::PicTiming &pts = spl->SEI_messages.pic_timing; if (!csps) throw h264_exception(UMC_ERR_INVALID_STREAM); if (csps->vui.nal_hrd_parameters_present_flag || csps->vui.vcl_hrd_parameters_present_flag) { pts.cbp_removal_delay = GetBits(csps->vui.cpb_removal_delay_length); pts.dpb_output_delay = GetBits(csps->vui.dpb_output_delay_length); } else { pts.cbp_removal_delay = INVALID_DPB_OUTPUT_DELAY; pts.dpb_output_delay = INVALID_DPB_OUTPUT_DELAY; } if (csps->vui.pic_struct_present_flag) { uint8_t picStruct = (uint8_t)GetBits(4); if (picStruct > 8) return UMC_ERR_INVALID_STREAM; pts.pic_struct = (DisplayPictureStruct)picStruct; for (int32_t i = 0; i < NumClockTS[pts.pic_struct]; i++) { pts.clock_timestamp_flag[i] = (uint8_t)Get1Bit(); if (pts.clock_timestamp_flag[i]) { pts.clock_timestamps[i].ct_type = (uint8_t)GetBits(2); pts.clock_timestamps[i].nunit_field_based_flag = (uint8_t)Get1Bit(); pts.clock_timestamps[i].counting_type = (uint8_t)GetBits(5); pts.clock_timestamps[i].full_timestamp_flag = (uint8_t)Get1Bit(); pts.clock_timestamps[i].discontinuity_flag = (uint8_t)Get1Bit(); pts.clock_timestamps[i].cnt_dropped_flag = (uint8_t)Get1Bit(); pts.clock_timestamps[i].n_frames = (uint8_t)GetBits(8); if (pts.clock_timestamps[i].full_timestamp_flag) { pts.clock_timestamps[i].seconds_value = (uint8_t)GetBits(6); pts.clock_timestamps[i].minutes_value = (uint8_t)GetBits(6); pts.clock_timestamps[i].hours_value = (uint8_t)GetBits(5); } else { if (Get1Bit()) { pts.clock_timestamps[i].seconds_value = (uint8_t)GetBits(6); if (Get1Bit()) { pts.clock_timestamps[i].minutes_value = (uint8_t)GetBits(6); if (Get1Bit()) { pts.clock_timestamps[i].hours_value = (uint8_t)GetBits(5); } } } } if (csps->vui.time_offset_length > 0) pts.clock_timestamps[i].time_offset = (uint8_t)GetBits(csps->vui.time_offset_length); } } } AlignPointerRight(); return current_sps; } void H264HeadersBitstream::user_data_registered_itu_t_t35(H264SEIPayLoad *spl) { H264SEIPayLoad::SEIMessages::UserDataRegistered * user_data = &(spl->SEI_messages.user_data_registered); uint32_t code; CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, code); user_data->itu_t_t35_country_code = (uint8_t)code; uint32_t i = 1; user_data->itu_t_t35_country_code_extension_byte = 0; if (user_data->itu_t_t35_country_code == 0xff) { CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, code); user_data->itu_t_t35_country_code_extension_byte = (uint8_t)code; i++; } spl->user_data.resize(spl->payLoadSize + 1); for(int32_t k = 0; i < spl->payLoadSize; i++, k++) { CheckBitsLeft(8); h264GetBits(m_pbs, m_bitOffset, 8, code); spl->user_data[k] = (uint8_t) code; } } void H264HeadersBitstream::recovery_point(H264SEIPayLoad *spl) { H264SEIPayLoad::SEIMessages::RecoveryPoint * recPoint = &(spl->SEI_messages.recovery_point); recPoint->recovery_frame_cnt = (uint8_t)GetVLCElement(false); recPoint->exact_match_flag = (uint8_t)Get1Bit(); recPoint->broken_link_flag = (uint8_t)Get1Bit(); recPoint->changing_slice_group_idc = (uint8_t)GetBits(2); if (recPoint->changing_slice_group_idc > 2) { spl->isValid = 0; } } int32_t H264HeadersBitstream::dec_ref_pic_marking_repetition(const Headers & headers, int32_t current_sps, H264SEIPayLoad *spl) { if (current_sps == -1) throw h264_exception(UMC_ERR_INVALID_STREAM); const H264SeqParamSet *csps = GetSeqParams(headers, current_sps); if (!csps) throw h264_exception(UMC_ERR_INVALID_STREAM); spl->SEI_messages.dec_ref_pic_marking_repetition.original_idr_flag = (uint8_t)Get1Bit(); spl->SEI_messages.dec_ref_pic_marking_repetition.original_frame_num = (uint8_t)GetVLCElement(false); if (!csps->frame_mbs_only_flag) { spl->SEI_messages.dec_ref_pic_marking_repetition.original_field_pic_flag = (uint8_t)Get1Bit(); if (spl->SEI_messages.dec_ref_pic_marking_repetition.original_field_pic_flag) { spl->SEI_messages.dec_ref_pic_marking_repetition.original_bottom_field_flag = (uint8_t)Get1Bit(); } } H264SliceHeader hdr; memset(&hdr, 0, sizeof(H264SliceHeader)); hdr.IdrPicFlag = spl->SEI_messages.dec_ref_pic_marking_repetition.original_idr_flag; Status sts = DecRefPicMarking(&hdr, &spl->SEI_messages.dec_ref_pic_marking_repetition.adaptiveMarkingInfo); if (sts != UMC_OK) throw h264_exception(UMC_ERR_INVALID_STREAM); spl->SEI_messages.dec_ref_pic_marking_repetition.long_term_reference_flag = hdr.long_term_reference_flag; return current_sps; } void H264HeadersBitstream::unparsed_sei_message(H264SEIPayLoad *spl) { for(uint32_t i = 0; i < spl->payLoadSize; i++) SkipNBits(m_pbs, m_bitOffset, 8) AlignPointerRight(); } // turn off the "local variable is initialized but not referenced" warning #ifdef _MSVC_LANG #pragma warning(disable : 4189) #endif void H264HeadersBitstream::scalability_info(H264SEIPayLoad *spl) { spl->SEI_messages.scalability_info.temporal_id_nesting_flag = (uint8_t)Get1Bit(); spl->SEI_messages.scalability_info.priority_layer_info_present_flag = (uint8_t)Get1Bit(); spl->SEI_messages.scalability_info.priority_id_setting_flag = (uint8_t)Get1Bit(); spl->SEI_messages.scalability_info.num_layers = GetVLCElement(false) + 1; if (spl->SEI_messages.scalability_info.num_layers > 1024) throw h264_exception(UMC_ERR_INVALID_STREAM); spl->user_data.resize(sizeof(scalability_layer_info) * spl->SEI_messages.scalability_info.num_layers); scalability_layer_info * layers = (scalability_layer_info *) (&spl->user_data[0]); for (uint32_t i = 0; i < spl->SEI_messages.scalability_info.num_layers; i++) { layers[i].layer_id = GetVLCElement(false); layers[i].priority_id = (uint8_t)GetBits(6); layers[i].discardable_flag = (uint8_t)Get1Bit(); layers[i].dependency_id = (uint8_t)GetBits(3); layers[i].quality_id = (uint8_t)GetBits(4); layers[i].temporal_id = (uint8_t)GetBits(3); uint8_t sub_pic_layer_flag = (uint8_t)Get1Bit(); // Need to check uint8_t sub_region_layer_flag = (uint8_t)Get1Bit(); // Need to check //if (sub_pic_layer_flag && !sub_region_layer_flag) // throw h264_exception(UMC_ERR_INVALID_STREAM); uint8_t iroi_division_info_present_flag = (uint8_t)Get1Bit(); // Need to check //if (sub_pic_layer_flag && iroi_division_info_present_flag) // throw h264_exception(UMC_ERR_INVALID_STREAM); uint8_t profile_level_info_present_flag = (uint8_t)Get1Bit(); uint8_t bitrate_info_present_flag = (uint8_t)Get1Bit(); uint8_t frm_rate_info_present_flag = (uint8_t)Get1Bit(); uint8_t frm_size_info_present_flag = (uint8_t)Get1Bit(); uint8_t layer_dependency_info_present_flag = (uint8_t)Get1Bit(); uint8_t parameter_sets_info_present_flag = (uint8_t)Get1Bit(); uint8_t bitstream_restriction_info_present_flag = (uint8_t)Get1Bit(); /*uint8_t exact_inter_layer_pred_flag = (uint8_t)*/Get1Bit(); if (sub_pic_layer_flag || iroi_division_info_present_flag) { /*uint8_t exact_sample_value_match_flag = (uint8_t)*/Get1Bit(); } uint8_t layer_conversion_flag = (uint8_t)Get1Bit(); /*uint8_t layer_output_flag = (uint8_t)*/Get1Bit(); if (profile_level_info_present_flag) { /*uint32_t layer_profile_level_idc = (uint8_t)*/GetBits(24); } if (bitrate_info_present_flag) { /*uint32_t avg_bitrate = */GetBits(16); /*uint32_t max_bitrate_layer = */GetBits(16); /*uint32_t max_bitrate_layer_representation = */GetBits(16); /*uint32_t max_bitrate_calc_window = */GetBits(16); } if (frm_rate_info_present_flag) { layers[i].constant_frm_rate_idc = GetBits(2); layers[i].avg_frm_rate = GetBits(16); } if (frm_size_info_present_flag || iroi_division_info_present_flag) { layers[i].frm_width_in_mbs = GetVLCElement(false) + 1; layers[i].frm_height_in_mbs = GetVLCElement(false) + 1; } if (sub_region_layer_flag) { /*uint32_t base_region_layer_id = */GetVLCElement(false); uint8_t dynamic_rect_flag = (uint8_t)Get1Bit(); if (!dynamic_rect_flag) { /*uint32_t horizontal_offset = */GetBits(16); /*uint32_t vertical_offset = */GetBits(16); /*uint32_t region_width = */GetBits(16); /*uint32_t region_height = */GetBits(16); } } if(sub_pic_layer_flag) { /*uint32_t roi_id = */GetVLCElement(false); } if (iroi_division_info_present_flag) { uint8_t iroi_grid_flag = (uint8_t)Get1Bit(); if (iroi_grid_flag) { /*uint32_t grid_width_in_mbs_minus1 = */GetVLCElement(false); /*uint32_t grid_height_in_mbs_minus1 = */GetVLCElement(false); } else { int32_t num_rois_minus1 = GetVLCElement(false); int32_t FrmSizeInMbs = layers[i].frm_height_in_mbs * layers[i].frm_width_in_mbs; if (num_rois_minus1 < 0 || num_rois_minus1 > FrmSizeInMbs) throw h264_exception(UMC_ERR_INVALID_STREAM); for (int32_t j = 0; j <= num_rois_minus1; j++) { /*uint32_t first_mb_in_roi = */GetVLCElement(false); /*uint32_t roi_width_in_mbs_minus1 = */GetVLCElement(false); /*uint32_t roi_height_in_mbs_minus1 = */GetVLCElement(false); } } } if (layer_dependency_info_present_flag) { layers[i].num_directly_dependent_layers = GetVLCElement(false); if (layers[i].num_directly_dependent_layers > 255) throw h264_exception(UMC_ERR_INVALID_STREAM); for(uint32_t j = 0; j < layers[i].num_directly_dependent_layers; j++) { layers[i].directly_dependent_layer_id_delta_minus1[j] = GetVLCElement(false); } } else { layers[i].layer_dependency_info_src_layer_id_delta = GetVLCElement(false); } if (parameter_sets_info_present_flag) { int32_t num_seq_parameter_set_minus1 = GetVLCElement(false); if (num_seq_parameter_set_minus1 < 0 || num_seq_parameter_set_minus1 > 32) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t j = 0; j <= num_seq_parameter_set_minus1; j++ ) /*uint32_t seq_parameter_set_id_delta = */GetVLCElement(false); int32_t num_subset_seq_parameter_set_minus1 = GetVLCElement(false); if (num_subset_seq_parameter_set_minus1 < 0 || num_subset_seq_parameter_set_minus1 > 32) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t j = 0; j <= num_subset_seq_parameter_set_minus1; j++ ) /*uint32_t subset_seq_parameter_set_id_delta = */GetVLCElement(false); int32_t num_pic_parameter_set_minus1 = GetVLCElement(false); if (num_pic_parameter_set_minus1 < 0 || num_pic_parameter_set_minus1 > 255) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t j = 0; j <= num_pic_parameter_set_minus1; j++) /*uint32_t pic_parameter_set_id_delta = */GetVLCElement(false); } else { /*uint32_t parameter_sets_info_src_layer_id_delta = */GetVLCElement(false); } if (bitstream_restriction_info_present_flag) { /*uint8_t motion_vectors_over_pic_boundaries_flag = (uint8_t)*/Get1Bit(); /*uint32_t max_bytes_per_pic_denom = */GetVLCElement(false); /*uint32_t max_bits_per_mb_denom = */GetVLCElement(false); /*uint32_t log2_max_mv_length_horizontal = */GetVLCElement(false); /*uint32_t log2_max_mv_length_vertical = */GetVLCElement(false); /*uint32_t num_reorder_frames = */GetVLCElement(false); /*uint32_t max_dec_frame_buffering = */GetVLCElement(false); } if (layer_conversion_flag) { /*uint32_t conversion_type_idc = */GetVLCElement(false); for(uint32_t j = 0; j < 2; j++) { uint8_t rewriting_info_flag = (uint8_t)Get1Bit(); if (rewriting_info_flag) { /*uint32_t rewriting_profile_level_idc = */GetBits(24); /*uint32_t rewriting_avg_bitrate = */GetBits(16); /*uint32_t rewriting_max_bitrate = */GetBits(16); } } } } // for 0..num_layers if (spl->SEI_messages.scalability_info.priority_layer_info_present_flag) { uint32_t pr_num_dId_minus1 = GetVLCElement(false); for(uint32_t i = 0; i <= pr_num_dId_minus1; i++) { /*uint32_t pr_dependency_id = */GetBits(3); int32_t pr_num_minus1 = GetVLCElement(false); if (pr_num_minus1 < 0 || pr_num_minus1 > 63) throw h264_exception(UMC_ERR_INVALID_STREAM); for(int32_t j = 0; j <= pr_num_minus1; j++) { /*uint32_t pr_id = */GetVLCElement(false); /*uint32_t pr_profile_level_idc = */GetBits(24); /*uint32_t pr_avg_bitrate = */GetBits(16); /*uint32_t pr_max_bitrate = */GetBits(16); } } } if (spl->SEI_messages.scalability_info.priority_id_setting_flag) { std::vector priority_id_setting_uri; // it is string uint32_t PriorityIdSettingUriIdx = 0; do { priority_id_setting_uri.push_back(1); priority_id_setting_uri[PriorityIdSettingUriIdx] = (uint8_t)GetBits(8); } while (priority_id_setting_uri[PriorityIdSettingUriIdx++] != 0); } } // restore the "local variable is initialized but not referenced" warning #ifdef _MSVC_LANG #pragma warning(default : 4189) #endif void SetDefaultScalingLists(H264SeqParamSet * sps) { int32_t i; for (i = 0; i < 6; i += 1) { FillFlatScalingList4x4(&sps->ScalingLists4x4[i]); } for (i = 0; i < 2; i += 1) { FillFlatScalingList8x8(&sps->ScalingLists8x8[i]); } } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_dec_debug.cpp000066400000000000000000000035261443134507600321530ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_dec_debug.h" //#include "umc_h264_timing.h" #include namespace UMC { void Trace(vm_char const* format, ...) { va_list arglist; va_start(arglist, format); vm_char cStr[256]; #ifdef _MSVC_LANG #pragma warning(push) #pragma warning(disable : 4996) #endif vm_string_vsnprintf(cStr, sizeof(cStr)-1, format, arglist); #ifdef _MSVC_LANG #pragma warning(pop) #endif //OutputDebugString(cStr); vm_string_printf(VM_STRING("%s"), cStr); //fflush(stdout); } #ifdef USE_DETAILED_H264_TIMING TimingInfo* GetGlobalTimingInfo() { static TimingInfo info; return &info; } #endif } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_dec_defs_yuv.cpp000066400000000000000000000113131443134507600327020ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_dec_defs_yuv.h" namespace UMC { H264DecYUVBufferPadded::H264DecYUVBufferPadded() : m_bpp(0) , m_chroma_format(0) , m_pYPlane(0) , m_pUVPlane(0) , m_pUPlane(0) , m_pVPlane(0) , m_lumaSize() , m_chromaSize() , m_pitch_luma(0) , m_pitch_chroma(0) , m_color_format(NV12) { } H264DecYUVBufferPadded::~H264DecYUVBufferPadded() { deallocate(); } FrameData * H264DecYUVBufferPadded::GetFrameData() { return &m_frameData; } const FrameData * H264DecYUVBufferPadded::GetFrameData() const { return &m_frameData; } void H264DecYUVBufferPadded::deallocate() { if (m_frameData.GetFrameMID() != FRAME_MID_INVALID) { m_frameData.Close(); return; } m_pYPlane = m_pUPlane = m_pVPlane = m_pUVPlane = 0; m_lumaSize = { 0, 0 }; m_pitch_luma = 0; m_pitch_chroma = 0; } void H264DecYUVBufferPadded::Init(const VideoDataInfo *info) { if (info == nullptr) throw h264_exception(UMC_ERR_NULL_PTR); if (info->GetNumPlanes() == 0) throw h264_exception(UMC_ERR_NULL_PTR); m_bpp = std::max(info->GetPlaneBitDepth(0), info->GetPlaneBitDepth(1)); m_color_format = info->GetColorFormat(); m_chroma_format = GetH264ColorFormat(info->GetColorFormat()); m_lumaSize = info->GetPlaneInfo(0)->m_ippSize; m_pYPlane = 0; m_pUPlane = 0; m_pVPlane = 0; m_pUVPlane = 0; if ((m_chroma_format > 0) && (info->GetNumPlanes() >= 2)) { m_chromaSize = info->GetPlaneInfo(1)->m_ippSize; } else { m_chromaSize = { 0, 0 }; } } void H264DecYUVBufferPadded::allocate(const FrameData * frameData, const VideoDataInfo *info) { if (info == nullptr || frameData == nullptr || info->GetNumPlanes() == 0) { deallocate(); return; } m_frameData = *frameData; if (frameData->GetPlaneMemoryInfo(0)->m_planePtr) m_frameData.m_locked = true; m_color_format = info->GetColorFormat(); m_bpp = std::max(info->GetPlaneBitDepth(0), info->GetPlaneBitDepth(1)); m_chroma_format = GetH264ColorFormat(info->GetColorFormat()); m_lumaSize = info->GetPlaneInfo(0)->m_ippSize; m_pitch_luma = (int32_t)m_frameData.GetPlaneMemoryInfo(0)->m_pitch / info->GetPlaneInfo(0)->m_iSampleSize; m_pYPlane = m_frameData.GetPlaneMemoryInfo(0)->m_planePtr; if ((m_chroma_format > 0 || GetH264ColorFormat(frameData->GetInfo()->GetColorFormat()) > 0) && (info->GetNumPlanes() >= 2)) { if (m_chroma_format == 0) info = frameData->GetInfo(); if (info->GetPlaneInfo(1) == 0) throw h264_exception(UMC_ERR_NULL_PTR); m_chromaSize = info->GetPlaneInfo(1)->m_ippSize; m_pitch_chroma = (int32_t)m_frameData.GetPlaneMemoryInfo(1)->m_pitch / info->GetPlaneInfo(1)->m_iSampleSize; if (m_frameData.GetInfo()->GetNumPlanes() == 2) { m_pUVPlane = m_frameData.GetPlaneMemoryInfo(1)->m_planePtr; m_pUPlane = 0; m_pVPlane = 0; } else { assert(m_frameData.GetInfo()->GetNumPlanes() == 3); m_pUPlane = m_frameData.GetPlaneMemoryInfo(1)->m_planePtr; m_pVPlane = m_frameData.GetPlaneMemoryInfo(2)->m_planePtr; m_pUVPlane = 0; } } else { m_chromaSize = { 0, 0 }; m_pitch_chroma = 0; m_pUPlane = 0; m_pVPlane = 0; } } ColorFormat H264DecYUVBufferPadded::GetColorFormat() const { return m_color_format; } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_dec_mfx.cpp000066400000000000000000000175511443134507600316620ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_dec_mfx.h" #include "mfxmvc.h" #include "mfx_enc_common.h" namespace UMC { Status FillVideoParamExtension(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * seqEx, mfxVideoParam *par) { if (!seqEx || !par) return UMC_ERR_NULL_PTR; mfxExtMVCSeqDesc * points = (mfxExtMVCSeqDesc*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (!points) return UMC_ERR_NULL_PTR; // calculate size if ((uint32_t)seqEx->num_level_values_signalled_minus1 + 1 != seqEx->levelInfo.size()) { return UMC_ERR_FAILED; } points->NumView = (mfxU16)(seqEx->num_views_minus1 + 1); size_t numberOfPoints = 0; size_t numberOfTargets = 0; for (const auto & levelSignal : seqEx->levelInfo) { if ((uint32_t)levelSignal.num_applicable_ops_minus1 + 1 != levelSignal.opsInfo.size()) { return UMC_ERR_FAILED; } for (const auto & ops : levelSignal.opsInfo) { if ((uint32_t)ops.applicable_op_num_target_views_minus1 + 1 != ops.applicable_op_target_view_id.size()) { return UMC_ERR_FAILED; } numberOfPoints++; numberOfTargets += ops.applicable_op_target_view_id.size(); } } points->NumOP = (mfxU32)numberOfPoints; points->NumViewId = (mfxU32)numberOfTargets; if (points->NumOP > points->NumOPAlloc || points->NumView > points->NumViewAlloc || points->NumViewId > points->NumViewIdAlloc) { return UMC_ERR_NOT_ENOUGH_BUFFER; } size_t view_number = 0; for (const auto & viewInfo : seqEx->viewInfo) { mfxMVCViewDependency * dependency = &points->View[view_number]; dependency->ViewId = (mfxU16)viewInfo.view_id; dependency->NumAnchorRefsL0 = viewInfo.num_anchor_refs_lx[0]; dependency->NumAnchorRefsL1 = viewInfo.num_anchor_refs_lx[1]; for (uint32_t k = 0; k < 16; k++) { dependency->AnchorRefL0[k] = viewInfo.anchor_refs_lx[0][k]; dependency->AnchorRefL1[k] = viewInfo.anchor_refs_lx[1][k]; } dependency->NumNonAnchorRefsL0 = viewInfo.num_non_anchor_refs_lx[0]; dependency->NumNonAnchorRefsL1 = viewInfo.num_non_anchor_refs_lx[1]; for (uint32_t k = 0; k < 16; k++) { dependency->NonAnchorRefL0[k] = viewInfo.non_anchor_refs_lx[0][k]; dependency->NonAnchorRefL1[k] = viewInfo.non_anchor_refs_lx[1][k]; } view_number++; } mfxU16 * targetViews = points->ViewId; mfxMVCOperationPoint * operationPoints = &points->OP[0]; for (const auto & levelSignal : seqEx->levelInfo) { for (const auto & ops : levelSignal.opsInfo) { operationPoints->TemporalId = ops.applicable_op_temporal_id; operationPoints->LevelIdc = levelSignal.level_idc; operationPoints->NumViews = ops.applicable_op_num_views_minus1 + 1; operationPoints->NumTargetViews = ops.applicable_op_num_target_views_minus1 + 1; operationPoints->TargetViewId = targetViews; std::copy(ops.applicable_op_target_view_id.begin(), ops.applicable_op_target_view_id.end(), operationPoints->TargetViewId); operationPoints++; targetViews += ops.applicable_op_target_view_id.size(); } } return UMC_OK; } Status FillVideoParam(const UMC_H264_DECODER::H264SeqParamSet * seq, mfxVideoParam *par, bool full) { par->mfx.CodecId = MFX_CODEC_AVC; if (seq->bit_depth_luma > 8 || seq->bit_depth_chroma > 8) { par->mfx.FrameInfo.FourCC = seq->chroma_format_idc == 2 ? MFX_FOURCC_Y210 : MFX_FOURCC_P010; } else { par->mfx.FrameInfo.FourCC = seq->chroma_format_idc == 2 ? MFX_FOURCC_NV16 : MFX_FOURCC_NV12; } par->mfx.FrameInfo.Width = (mfxU16) (seq->frame_width_in_mbs * 16); par->mfx.FrameInfo.Height = (mfxU16) (seq->frame_height_in_mbs * 16); par->mfx.FrameInfo.BitDepthLuma = seq->bit_depth_luma; par->mfx.FrameInfo.BitDepthChroma = seq->bit_depth_chroma; //if (seq->frame_cropping_flag) { par->mfx.FrameInfo.CropX = (mfxU16)(SubWidthC[seq->chroma_format_idc] * seq->frame_cropping_rect_left_offset); par->mfx.FrameInfo.CropY = (mfxU16)(SubHeightC[seq->chroma_format_idc] * seq->frame_cropping_rect_top_offset * (2 - seq->frame_mbs_only_flag)); par->mfx.FrameInfo.CropH = (mfxU16)(seq->frame_height_in_mbs * 16 - SubHeightC[seq->chroma_format_idc]*(2 - seq->frame_mbs_only_flag) * (seq->frame_cropping_rect_top_offset + seq->frame_cropping_rect_bottom_offset)); par->mfx.FrameInfo.CropW = (mfxU16)(seq->frame_width_in_mbs * 16 - SubWidthC[seq->chroma_format_idc] * (seq->frame_cropping_rect_left_offset + seq->frame_cropping_rect_right_offset)); } par->mfx.FrameInfo.PicStruct = (mfxU8)(seq->frame_mbs_only_flag ? MFX_PICSTRUCT_PROGRESSIVE : MFX_PICSTRUCT_UNKNOWN); if (seq->chroma_format_idc == 2) { par->mfx.FrameInfo.ChromaFormat = (mfxU16)MFX_CHROMAFORMAT_YUV422; } else par->mfx.FrameInfo.ChromaFormat = (mfxU16)(seq->chroma_format_idc ? MFX_CHROMAFORMAT_YUV420 : MFX_CHROMAFORMAT_YUV400); if (seq->vui.aspect_ratio_info_present_flag || full) { par->mfx.FrameInfo.AspectRatioW = seq->vui.sar_width; par->mfx.FrameInfo.AspectRatioH = seq->vui.sar_height; } else { par->mfx.FrameInfo.AspectRatioW = 0; par->mfx.FrameInfo.AspectRatioH = 0; } if (seq->vui.timing_info_present_flag || full) { par->mfx.FrameInfo.FrameRateExtD = seq->vui.num_units_in_tick * 2; par->mfx.FrameInfo.FrameRateExtN = seq->vui.time_scale; } else { par->mfx.FrameInfo.FrameRateExtD = 0; par->mfx.FrameInfo.FrameRateExtN = 0; } par->mfx.CodecProfile = seq->profile_idc; par->mfx.CodecLevel = seq->level_idc; par->mfx.MaxDecFrameBuffering = seq->vui.bitstream_restriction_flag ? seq->vui.max_dec_frame_buffering : 0; // video signal section mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { videoSignal->VideoFormat = seq->vui.video_format; videoSignal->VideoFullRange = seq->vui.video_full_range_flag; videoSignal->ColourDescriptionPresent = seq->vui.colour_description_present_flag; videoSignal->ColourPrimaries = seq->vui.colour_primaries; videoSignal->TransferCharacteristics = seq->vui.transfer_characteristics; videoSignal->MatrixCoefficients = seq->vui.matrix_coefficients; } return UMC_OK; } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_dec_slice_decoder_decode_pic.cpp000066400000000000000000000720251443134507600357300ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) /* DEBUG: this file is requred to changing name to umc_h264_dec_slice_decode_pic */ #include "umc_h264_slice_decoding.h" #include "umc_h264_dec.h" #include "umc_h264_frame_list.h" #include "umc_h264_task_supplier.h" //#define ENABLE_LIST_TRACE #define LIST_TRACE_FILE_NAME "d:/ipp.ref" namespace UMC { static H264DecoderFrame *FindLastValidReference(H264DecoderFrame **pList, int32_t iLength) { int32_t i; H264DecoderFrame *pLast = NULL; for (i = 0; i < iLength; i += 1) { if (pList[i]) pLast = pList[i]; } return pLast; } // H264DecoderFrame *FindLastValidReference(H264DecoderFrame **pList, Status H264Slice::UpdateReferenceList(ViewList &views, int32_t dIdIndex) { UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo_L0 = &ReorderInfoL0; UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo_L1 = &ReorderInfoL1; const UMC_H264_DECODER::H264SeqParamSet *sps = GetSeqParam(); uint32_t uMaxFrameNum; uint32_t uMaxPicNum; H264DecoderFrame *pFrm; H264DBPList *pDecoderFrameList = GetDPB(views, m_SliceHeader.nal_ext.mvc.view_id, dIdIndex); H264DecoderFrame *pHead = pDecoderFrameList->head(); //uint32_t i; H264DecoderFrame **pRefPicList0; H264DecoderFrame **pRefPicList1; ReferenceFlags *pFields0; ReferenceFlags *pFields1; uint32_t NumShortTermRefs, NumLongTermRefs; H264RefListInfo rli; H264DecoderFrame *pLastInList[2] = {NULL, NULL}; if (m_pCurrentFrame == nullptr) return UMC_ERR_FAILED; const H264DecoderRefPicList* pH264DecRefPicList0 = m_pCurrentFrame->GetRefPicList(m_iNumber, 0); const H264DecoderRefPicList* pH264DecRefPicList1 = m_pCurrentFrame->GetRefPicList(m_iNumber, 1); if (pH264DecRefPicList0 == nullptr || pH264DecRefPicList1 == nullptr) return UMC_ERR_FAILED; pRefPicList0 = pH264DecRefPicList0->m_RefPicList; pRefPicList1 = pH264DecRefPicList1->m_RefPicList; pFields0 = pH264DecRefPicList0->m_Flags; pFields1 = pH264DecRefPicList1->m_Flags; // Spec reference: 8.2.4, "Decoding process for reference picture lists // construction" // get pointers to the picture and sequence parameter sets currently in use uMaxFrameNum = (1<log2_max_frame_num); uMaxPicNum = (m_SliceHeader.field_pic_flag == 0) ? uMaxFrameNum : uMaxFrameNum<<1; for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { // update FrameNumWrap and picNum if frame number wrap occurred, // for short-term frames // TBD: modify for fields pFrm->UpdateFrameNumWrap((int32_t)m_SliceHeader.frame_num, uMaxFrameNum, m_pCurrentFrame->m_PictureStructureForDec + m_SliceHeader.bottom_field_flag); // For long-term references, update LongTermPicNum. Note this // could be done when LongTermFrameIdx is set, but this would // only work for frames, not fields. // TBD: modify for fields pFrm->UpdateLongTermPicNum(m_pCurrentFrame->m_PictureStructureForDec + m_SliceHeader.bottom_field_flag); } for (uint32_t number = 0; number <= MAX_NUM_REF_FRAMES + 1; number++) { pRefPicList0[number] = 0; pRefPicList1[number] = 0; pFields0[number].field = 0; pFields0[number].isShortReference = 0; pFields1[number].field = 0; pFields1[number].isShortReference = 0; } if ((m_SliceHeader.slice_type != INTRASLICE) && (m_SliceHeader.slice_type != S_INTRASLICE)) { uint32_t NumInterViewRefs = 0; // Detect and report no available reference frames pDecoderFrameList->countActiveRefs(NumShortTermRefs, NumLongTermRefs); // calculate number of inter-view references if (m_SliceHeader.nal_ext.mvc.view_id != views.front().viewId) { NumInterViewRefs = GetInterViewFrameRefs(views, m_SliceHeader.nal_ext.mvc.view_id, m_pCurrentFrame->m_auIndex, m_SliceHeader.bottom_field_flag); } if ((NumShortTermRefs + NumLongTermRefs + NumInterViewRefs) == 0) { return UMC_ERR_INVALID_STREAM; } #ifdef ENABLE_LIST_TRACE static int kkkk = 0; kkkk++; #endif // Initialize the reference picture lists // Note the slice header get function always fills num_ref_idx_lx_active // fields with a valid value; either the override from the slice // header in the bitstream or the values from the pic param set when // there is no override. if (!m_SliceHeader.IdrPicFlag) { if ((m_SliceHeader.slice_type == PREDSLICE) || (m_SliceHeader.slice_type == S_PREDSLICE)) { pDecoderFrameList->InitPSliceRefPicList(this, pRefPicList0); pLastInList[0] = FindLastValidReference(pRefPicList0, m_SliceHeader.num_ref_idx_l0_active); } else { pDecoderFrameList->InitBSliceRefPicLists(this, pRefPicList0, pRefPicList1, rli); pLastInList[0] = FindLastValidReference(pRefPicList0, m_SliceHeader.num_ref_idx_l0_active); pLastInList[1] = FindLastValidReference(pRefPicList1, m_SliceHeader.num_ref_idx_l1_active); } // Reorder the reference picture lists if (m_pCurrentFrame->m_PictureStructureForDec < FRM_STRUCTURE) { rli.m_iNumFramesInL0List = AdjustRefPicListForFields(pRefPicList0, pFields0, rli); } if (BPREDSLICE == m_SliceHeader.slice_type) { if (m_pCurrentFrame->m_PictureStructureForDec < FRM_STRUCTURE) { rli.m_iNumFramesInL1List = AdjustRefPicListForFields(pRefPicList1, pFields1, rli); } if ((rli.m_iNumFramesInL0List == rli.m_iNumFramesInL1List) && (rli.m_iNumFramesInL0List > 1)) { bool isNeedSwap = true; for (int32_t i = 0; i < rli.m_iNumFramesInL0List; i++) { if (pRefPicList1[i] != pRefPicList0[i] || pFields1[i].field != pFields0[i].field) { isNeedSwap = false; break; } } if (isNeedSwap) { std::swap(pRefPicList1[0], pRefPicList1[1]); std::swap(pFields1[0], pFields1[1]); } } } } // MVC extension. Add inter-view references if ((H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH == m_pSeqParamSet->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH == m_pSeqParamSet->profile_idc)) { pDecoderFrameList->AddInterViewRefs(this, pRefPicList0, pFields0, LIST_0, views); if (m_SliceHeader.IdrPicFlag) { pLastInList[0] = FindLastValidReference(pRefPicList0, m_SliceHeader.num_ref_idx_l0_active); } if (BPREDSLICE == m_SliceHeader.slice_type) { pDecoderFrameList->AddInterViewRefs(this, pRefPicList1, pFields1, LIST_1, views); if (m_SliceHeader.IdrPicFlag) pLastInList[1] = FindLastValidReference(pRefPicList1, m_SliceHeader.num_ref_idx_l1_active); } } #ifdef ENABLE_LIST_TRACE { FILE * fl = fopen(LIST_TRACE_FILE_NAME, "a+"); fprintf(fl, "init - l0 - %d\n", kkkk); for (int32_t k1 = 0; k1 < m_SliceHeader.num_ref_idx_l0_active; k1++) { if (!pRefPicList0[k1]) break; fprintf(fl, "i - %d, field - %d, poc %d \n", k1, pFields0[k1].field, pRefPicList0[k1]->m_PicOrderCnt[pRefPicList0[k1]->GetNumberByParity(pFields0[k1].field)]); } fprintf(fl, "l1 - %d\n", kkkk); for (int32_t k1 = 0; k1 < m_SliceHeader.num_ref_idx_l1_active; k1++) { if (!pRefPicList1[k1]) break; fprintf(fl, "i - %d, field - %d, poc %d \n", k1, pFields1[k1].field, pRefPicList1[k1]->m_PicOrderCnt[pRefPicList1[k1]->GetNumberByParity(pFields1[k1].field)]); } fclose(fl); } #endif if (pReorderInfo_L0->num_entries > 0) ReOrderRefPicList(pRefPicList0, pFields0, pReorderInfo_L0, uMaxPicNum, views, dIdIndex, 0); pRefPicList0[m_SliceHeader.num_ref_idx_l0_active] = 0; if (BPREDSLICE == m_SliceHeader.slice_type) { if (pReorderInfo_L1->num_entries > 0) ReOrderRefPicList(pRefPicList1, pFields1, pReorderInfo_L1, uMaxPicNum, views, dIdIndex, 1); pRefPicList1[m_SliceHeader.num_ref_idx_l1_active] = 0; } #ifdef ENABLE_LIST_TRACE {kkkk++; FILE * fl = fopen(LIST_TRACE_FILE_NAME, "a+"); fprintf(fl, "reorder - l0 - %d\n", kkkk); for (int32_t k1 = 0; k1 < m_SliceHeader.num_ref_idx_l0_active; k1++) { if (!pRefPicList0[k1]) break; fprintf(fl, "i - %d, field - %d, poc %d \n", k1, pFields0[k1].field, pRefPicList0[k1]->m_PicOrderCnt[pRefPicList0[k1]->GetNumberByParity(pFields0[k1].field)]); } fprintf(fl, "l1 - %d\n", kkkk); for (int32_t k1 = 0; k1 < m_SliceHeader.num_ref_idx_l1_active; k1++) { if (!pRefPicList1[k1]) break; fprintf(fl, "i - %d, field - %d, poc %d \n", k1, pFields1[k1].field, pRefPicList1[k1]->m_PicOrderCnt[pRefPicList1[k1]->GetNumberByParity(pFields1[k1].field)]); } fclose(fl); } #endif // set absent references { int32_t i; int32_t iCurField = 1; if (!pLastInList[0]) { for (;;) { for (H264DecoderFrame *pFrame = pDecoderFrameList->head(); pFrame; pFrame = pFrame->future()) { if (pFrame->isShortTermRef()==3) pLastInList[0] = pFrame; } if (pLastInList[0]) break; for (H264DecoderFrame *pFrame = pDecoderFrameList->head(); pFrame; pFrame = pFrame->future()) { if (pFrame->isLongTermRef()==3) pLastInList[0] = pFrame; } break; } } if (BPREDSLICE == m_SliceHeader.slice_type && !pLastInList[1]) { pLastInList[1] = pLastInList[0]; } for (i = 0; i < m_SliceHeader.num_ref_idx_l0_active; i += 1) { if (NULL == pRefPicList0[i]) { pRefPicList0[i] = pLastInList[0]; m_pCurrentFrame->AddReference(pLastInList[0]); pFields0[i].field = (int8_t) (iCurField ^= 1); if (pRefPicList0[i]) pFields0[i].isShortReference = (pRefPicList0[i]->m_viewId == m_pCurrentFrame->m_viewId) ? 1 : 0; else pFields0[i].isShortReference = 1; pFields0[i].isLongReference = 0; m_pCurrentFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); } else { m_pCurrentFrame->AddReference(pRefPicList0[i]); m_pCurrentFrame->SetErrorFlagged(pRefPicList0[i]->IsFrameExist() ? 0 : ERROR_FRAME_MAJOR); pFields0[i].isShortReference = pRefPicList0[i]->isShortTermRef(pRefPicList0[i]->GetNumberByParity(pFields0[i].field)); pFields0[i].isLongReference = pRefPicList0[i]->isLongTermRef(pRefPicList0[i]->GetNumberByParity(pFields0[i].field)); if (pRefPicList0[i]->m_viewId != m_pCurrentFrame->m_viewId) pFields0[i].isShortReference = pFields0[i].isLongReference = 0; } } if (BPREDSLICE == m_SliceHeader.slice_type) { iCurField = 1; for (i = 0; i < m_SliceHeader.num_ref_idx_l1_active; i += 1) { if (NULL == pRefPicList1[i]) { pRefPicList1[i] = pLastInList[1]; m_pCurrentFrame->AddReference(pLastInList[1]); pFields1[i].field = (int8_t) (iCurField ^= 1); pFields1[i].isShortReference = 1; if (pRefPicList1[i]) pFields1[i].isShortReference = (pRefPicList1[i]->m_viewId == m_pCurrentFrame->m_viewId) ? 1 : 0; else pFields1[i].isShortReference = 1; pFields1[i].isLongReference = 0; m_pCurrentFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); } else { m_pCurrentFrame->AddReference(pRefPicList1[i]); m_pCurrentFrame->SetErrorFlagged(pRefPicList1[i]->IsFrameExist() ? 0 : ERROR_FRAME_MAJOR); pFields1[i].isShortReference = pRefPicList1[i]->isShortTermRef(pRefPicList1[i]->GetNumberByParity(pFields1[i].field)); pFields1[i].isLongReference = pRefPicList1[i]->isLongTermRef(pRefPicList1[i]->GetNumberByParity(pFields1[i].field)); if (pRefPicList1[i]->m_viewId != m_pCurrentFrame->m_viewId) pFields1[i].isShortReference = pFields1[i].isLongReference = 0; } } } } } return UMC_OK; } // Status H264Slice::UpdateRefPicList(H264DecoderFrameList *pDecoderFrameList) int32_t H264Slice::AdjustRefPicListForFields(H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, H264RefListInfo &rli) { H264DecoderFrame *TempList[MAX_NUM_REF_FRAMES+1]; uint8_t TempFields[MAX_NUM_REF_FRAMES+1]; //walk through list and set correct indices int32_t i=0,j=0,numSTR=0,numLTR=0; int32_t num_same_parity = 0, num_opposite_parity = 0; int8_t current_parity = m_SliceHeader.bottom_field_flag; //first scan the list to determine number of shortterm and longterm reference frames while ((numSTR < 16) && pRefPicList[numSTR] && pRefPicList[numSTR]->isShortTermRef()) numSTR++; while ((numSTR + numLTR < 16) && pRefPicList[numSTR+numLTR] && pRefPicList[numSTR+numLTR]->isLongTermRef()) numLTR++; while (num_same_parity < numSTR || num_opposite_parity < numSTR) { //try to fill shorttermref fields with the same parity first if (num_same_parity < numSTR) { while (num_same_parity < numSTR) { int32_t ref_field = pRefPicList[num_same_parity]->GetNumberByParity(current_parity); if (pRefPicList[num_same_parity]->isShortTermRef(ref_field)) break; num_same_parity++; } if (num_same_parityGetNumberByParity(!current_parity); if (pRefPicList[num_opposite_parity]->isShortTermRef(ref_field)) break; num_opposite_parity++; } if (num_opposite_parityGetNumberByParity(current_parity); if (pRefPicList[num_same_parity+numSTR]->isLongTermRef(ref_field)) break; num_same_parity++; } if (num_same_parityGetNumberByParity(!current_parity); if (pRefPicList[num_opposite_parity+numSTR]->isLongTermRef(ref_field)) break; num_opposite_parity++; } if (num_opposite_parityisShortTermRef(pRefPicList[j]->GetNumberByParity(TempFields[j])) ? 1 : 0); j++; } while(j < (int32_t)MAX_NUM_REF_FRAMES)//fill remaining entries { pRefPicList[j] = NULL; pFields[j].field = 0; pFields[j].isShortReference = 0; j++; } return i; } // int32_t H264Slice::AdjustRefPicListForFields(H264DecoderFrame **pRefPicList, int8_t *pFields) void H264Slice::ReOrderRefPicList(H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, UMC_H264_DECODER::RefPicListReorderInfo *pReorderInfo, int32_t MaxPicNum, ViewList &views, int32_t dIdIndex, uint32_t listNum) { bool bIsFieldSlice = (m_SliceHeader.field_pic_flag != 0); uint32_t NumRefActive = (0 == listNum) ? m_SliceHeader.num_ref_idx_l0_active : m_SliceHeader.num_ref_idx_l1_active; uint32_t i; int32_t picNumNoWrap; int32_t picNum; int32_t picNumPred; int32_t picNumCurr; int32_t picViewIdxLXPred = -1; H264DBPList *pDecoderFrameList = GetDPB(views, m_SliceHeader.nal_ext.mvc.view_id, dIdIndex); int32_t pocForce = bIsFieldSlice ? 0 : 3; // Reference: Reordering process for reference picture lists, 8.2.4.3 picNumCurr = m_pCurrentFrame->PicNum(m_pCurrentFrame->GetNumberByParity(m_SliceHeader.bottom_field_flag), pocForce); picNumPred = picNumCurr; for (i=0; inum_entries; i++) { if (pReorderInfo->reordering_of_pic_nums_idc[i] < 2) { // short-term reorder if (pReorderInfo->reordering_of_pic_nums_idc[i] == 0) { picNumNoWrap = picNumPred - pReorderInfo->reorder_value[i]; if (picNumNoWrap < 0) picNumNoWrap += MaxPicNum; } else { picNumNoWrap = picNumPred + pReorderInfo->reorder_value[i]; if (picNumNoWrap >= MaxPicNum) picNumNoWrap -= MaxPicNum; } picNumPred = picNumNoWrap; picNum = picNumNoWrap; if (picNum > picNumCurr) picNum -= MaxPicNum; int32_t frameField; H264DecoderFrame* pFrame = pDecoderFrameList->findShortTermPic(picNum, &frameField); for (uint32_t k = NumRefActive; k > i; k--) { pRefPicList[k] = pRefPicList[k - 1]; pFields[k] = pFields[k - 1]; } // Place picture with picNum on list, shifting pictures // down by one while removing any duplication of picture with picNum. pRefPicList[i] = pFrame; pFields[i].field = (char) ((pFrame && bIsFieldSlice) ? pFrame->m_bottom_field_flag[frameField] : 0); pFields[i].isShortReference = 1; int32_t refIdxLX = i + 1; for(uint32_t kk = i + 1; kk <= NumRefActive; kk++) { if (pRefPicList[kk]) { if (!(pRefPicList[kk]->isShortTermRef(pRefPicList[kk]->GetNumberByParity(pFields[kk].field)) && pRefPicList[kk]->PicNum(pRefPicList[kk]->GetNumberByParity(pFields[kk].field), 1) == picNum)) { pRefPicList[refIdxLX] = pRefPicList[kk]; pFields[refIdxLX] = pFields[kk]; refIdxLX++; } } } } // short-term reorder else if (2 == pReorderInfo->reordering_of_pic_nums_idc[i]) { // long term reorder picNum = pReorderInfo->reorder_value[i]; int32_t frameField; H264DecoderFrame* pFrame = pDecoderFrameList->findLongTermPic(picNum, &frameField); for (uint32_t k = NumRefActive; k > i; k--) { pRefPicList[k] = pRefPicList[k - 1]; pFields[k] = pFields[k - 1]; } // Place picture with picNum on list, shifting pictures // down by one while removing any duplication of picture with picNum. pRefPicList[i] = pFrame; pFields[i].field = (char) ((pFrame && bIsFieldSlice) ? pFrame->m_bottom_field_flag[frameField] : 0); pFields[i].isShortReference = 0; int32_t refIdxLX = i + 1; for(uint32_t kk = i + 1; kk <= NumRefActive; kk++) { if (pRefPicList[kk]) { if (!(pRefPicList[kk]->isLongTermRef(pRefPicList[kk]->GetNumberByParity(pFields[kk].field)) && pRefPicList[kk]->LongTermPicNum(pRefPicList[kk]->GetNumberByParity(pFields[kk].field), 1) == picNum)) { pRefPicList[refIdxLX] = pRefPicList[kk]; pFields[refIdxLX] = pFields[kk]; refIdxLX++; } } } } // long term reorder // MVC reordering else if ((4 == pReorderInfo->reordering_of_pic_nums_idc[i]) || (5 == pReorderInfo->reordering_of_pic_nums_idc[i])) { int32_t abs_diff_view_idx = pReorderInfo->reorder_value[i]; int32_t maxViewIdx; int32_t targetViewID; if (!m_pSeqParamSetMvcEx) { m_pCurrentFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); continue; } uint32_t picViewIdxLX; H264DecoderFrame* pFrame = NULL; int32_t curPOC = m_pCurrentFrame->PicOrderCnt(m_pCurrentFrame->GetNumberByParity(m_SliceHeader.bottom_field_flag), pocForce); // set current VO index const auto & currView = std::find_if(m_pSeqParamSetMvcEx->viewInfo.begin(), m_pSeqParamSetMvcEx->viewInfo.end(), [this](const UMC_H264_DECODER::H264ViewRefInfo & item) { return item.view_id == m_SliceHeader.nal_ext.mvc.view_id; }); if (currView == m_pSeqParamSetMvcEx->viewInfo.end()) { throw h264_exception(UMC_ERR_INVALID_STREAM); } // get the maximum number of reference if (m_SliceHeader.nal_ext.mvc.anchor_pic_flag) { maxViewIdx = currView->num_anchor_refs_lx[listNum]; } else { maxViewIdx = currView->num_non_anchor_refs_lx[listNum]; } // get the index of view reference if (4 == pReorderInfo->reordering_of_pic_nums_idc[i]) { if (picViewIdxLXPred - abs_diff_view_idx < 0) { picViewIdxLX = picViewIdxLXPred - abs_diff_view_idx + maxViewIdx; } else { picViewIdxLX = picViewIdxLXPred - abs_diff_view_idx; } } else { if (picViewIdxLXPred + abs_diff_view_idx >= maxViewIdx) { picViewIdxLX = picViewIdxLXPred + abs_diff_view_idx - maxViewIdx; } else { picViewIdxLX = picViewIdxLXPred + abs_diff_view_idx; } } picViewIdxLXPred = picViewIdxLX; if (picViewIdxLX >= UMC::H264_MAX_NUM_VIEW_REF) { m_pCurrentFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); continue; } // get the target view if (m_SliceHeader.nal_ext.mvc.anchor_pic_flag) { targetViewID = currView->anchor_refs_lx[listNum][picViewIdxLX]; } else { targetViewID = currView->non_anchor_refs_lx[listNum][picViewIdxLX]; } ViewList::iterator iter = views.begin(); ViewList::iterator iter_end = views.end(); for (; iter != iter_end; ++iter) { if (targetViewID == iter->viewId) { pFrame = iter->GetDPBList(dIdIndex)->findInterViewRef(m_pCurrentFrame->m_auIndex, m_SliceHeader.bottom_field_flag); break; } } // corresponding frame is found if (!pFrame) continue; // make some space to insert the reference for (uint32_t k = NumRefActive; k > i; k--) { pRefPicList[k] = pRefPicList[k - 1]; pFields[k] = pFields[k - 1]; } // Place picture with picNum on list, shifting pictures // down by one while removing any duplication of picture with cuuPOC. pRefPicList[i] = pFrame; pFields[i].field = m_SliceHeader.bottom_field_flag; pFields[i].isShortReference = 1; uint32_t refIdxLX = i + 1; for (uint32_t kk = i + 1; kk <= NumRefActive; kk++) { if (pRefPicList[kk]) { uint32_t refFieldIdx = pRefPicList[kk]->GetNumberByParity(m_SliceHeader.bottom_field_flag); if ((pRefPicList[kk]->m_viewId != targetViewID) || (pRefPicList[kk]->PicOrderCnt(refFieldIdx, pocForce) != curPOC)) { pRefPicList[refIdxLX] = pRefPicList[kk]; pFields[refIdxLX] = pFields[kk]; refIdxLX++; } } } } } // for i } // void H264Slice::ReOrderRefPicList(H264DecoderFrame **pRefPicList, } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_frame.cpp000066400000000000000000000303351443134507600313420ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include "umc_h264_frame.h" #include "umc_h264_task_supplier.h" #include "umc_h264_dec_debug.h" namespace UMC { H264DecoderFrame g_GlobalFakeFrame(0, 0); H264DecoderFrameInfo::FakeFrameInitializer H264DecoderFrameInfo::g_FakeFrameInitializer; H264DecoderFrameInfo::FakeFrameInitializer::FakeFrameInitializer() { g_GlobalFakeFrame.m_ID[0] = (size_t)-1; g_GlobalFakeFrame.m_ID[1] = (size_t)-1; }; H264DecoderFrame::H264DecoderFrame(MemoryAllocator *pMemoryAllocator, H264_Heap_Objects * pObjHeap) : H264DecYUVBufferPadded() , m_TopSliceCount(0) , m_frameOrder(0) , m_ErrorType(0) , m_pSlicesInfo(this) , m_pSlicesInfoBottom(this) , m_pPreviousFrame(0) , m_pFutureFrame(0) , m_dFrameTime(-1.0) , m_isOriginalPTS(false) , m_IsFrameExist(0) , m_dpb_output_delay(INVALID_DPB_OUTPUT_DELAY) , m_PictureStructureForDec(0) , m_displayPictureStruct(DPS_UNKNOWN) , totalMBs(0) , post_procces_complete(false) , m_iNumberOfSlices(0) , m_auIndex(-1) , m_index(-1) , m_UID(-1) , m_FrameType(NONE_PICTURE) , m_MemID(0) , m_crop_left(0) , m_crop_right(0) , m_crop_top(0) , m_crop_bottom(0) , m_crop_flag(0) , m_aspect_width(0) , m_aspect_height(0) , m_pObjHeap(pObjHeap) { m_isShortTermRef[0] = m_isShortTermRef[1] = false; m_isLongTermRef[0] = m_isLongTermRef[1] = false; m_isInterViewRef[0] = m_isInterViewRef[1] = false; m_LongTermPicNum[0] = m_LongTermPicNum[1] = -1; m_FrameNumWrap = m_FrameNum = -1; m_LongTermFrameIdx = -1; m_viewId = 0; m_RefPicListResetCount[0] = m_RefPicListResetCount[1] = 0; m_PicNum[0] = m_PicNum[1] = -1; m_LongTermFrameIdx = -1; m_FrameNumWrap = m_FrameNum = -1; m_LongTermPicNum[0] = m_PicNum[1] = -1; m_PicOrderCnt[0] = m_PicOrderCnt[1] = 0; m_bIDRFlag = false; m_bIFlag = false; // set memory managment tools m_pMemoryAllocator = pMemoryAllocator; ResetRefCounter(); m_ID[0] = (int32_t) ((uint8_t *) this - (uint8_t *) 0); m_ID[1] = m_ID[0] + 1; m_PictureStructureForRef = FRM_STRUCTURE; m_isFull = 0; m_isDecoded = 0; m_isDecodingStarted = 0; m_isDecodingCompleted = 0; m_isSkipped = 0; m_wasOutputted = 0; m_wasDisplayed = 0; prepared[0] = false; prepared[1] = false; m_iResourceNumber = -1; } H264DecoderFrame::~H264DecoderFrame() { // Just to be safe. m_pPreviousFrame = 0; m_pFutureFrame = 0; Reset(); deallocate(); } void H264DecoderFrame::AddReference(RefCounter * reference) { if (!reference || reference == this) return; if (std::find(m_references.begin(), m_references.end(), reference) != m_references.end()) return; reference->IncrementReference(); m_references.push_back(reference); } void H264DecoderFrame::FreeReferenceFrames() { ReferenceList::iterator iter = m_references.begin(); ReferenceList::iterator end_iter = m_references.end(); for (; iter != end_iter; ++iter) { RefCounter * reference = *iter; reference->DecrementReference(); } m_references.clear(); } void H264DecoderFrame::Reset() { m_TopSliceCount = 0; m_pSlicesInfo.Reset(); m_pSlicesInfoBottom.Reset(); ResetRefCounter(); m_isShortTermRef[0] = m_isShortTermRef[1] = false; m_isLongTermRef[0] = m_isLongTermRef[1] = false; m_isInterViewRef[0] = m_isInterViewRef[1] = false; post_procces_complete = false; m_bIDRFlag = false; m_bIFlag = false; m_RefPicListResetCount[0] = m_RefPicListResetCount[1] = 0; m_PicNum[0] = m_PicNum[1] = -1; m_LongTermPicNum[0] = m_LongTermPicNum[1] = -1; m_PictureStructureForRef = FRM_STRUCTURE; m_PicOrderCnt[0] = m_PicOrderCnt[1] = 0; m_viewId = 0; m_LongTermFrameIdx = -1; m_FrameNumWrap = m_FrameNum = -1; m_isFull = 0; m_isDecoded = 0; m_isDecodingStarted = 0; m_isDecodingCompleted = 0; m_isSkipped = 0; m_auIndex = -1; m_wasOutputted = 0; m_wasDisplayed = 0; m_dpb_output_delay = INVALID_DPB_OUTPUT_DELAY; m_bottom_field_flag[0] = m_bottom_field_flag[1] = -1; m_dFrameTime = -1; m_isOriginalPTS = false; m_IsFrameExist = true; m_iNumberOfSlices = 0; m_UserData.Reset(); m_ErrorType = 0; m_UID = -1; m_index = -1; m_auIndex = -1; m_iResourceNumber = -1; m_MemID = MID_INVALID; prepared[0] = false; prepared[1] = false; m_displayPictureStruct = DPS_UNKNOWN; FreeReferenceFrames(); deallocate(); } bool H264DecoderFrame::IsFullFrame() const { return (m_isFull == 1); } void H264DecoderFrame::SetFullFrame(bool isFull) { m_isFull = (uint8_t) (isFull ? 1 : 0); } bool H264DecoderFrame::IsDecoded() const { return m_isDecoded == 1; } void H264DecoderFrame::FreeResources() { FreeReferenceFrames(); if (IsDecoded()) { m_pSlicesInfo.Free(); m_pSlicesInfoBottom.Free(); } } void H264DecoderFrame::CompleteDecoding() { UpdateErrorWithRefFrameStatus(); m_isDecodingCompleted = 1; } void H264DecoderFrame::UpdateErrorWithRefFrameStatus() { if (m_pSlicesInfo.CheckReferenceFrameError() || m_pSlicesInfoBottom.CheckReferenceFrameError()) { SetErrorFlagged(ERROR_FRAME_REFERENCE_FRAME); } } void H264DecoderFrame::OnDecodingCompleted() { UpdateErrorWithRefFrameStatus(); m_isDecoded = 1; FreeResources(); DecrementReference(); } void H264DecoderFrame::SetisShortTermRef(bool isRef, int32_t WhichField) { if (isRef) { if (!isShortTermRef() && !isLongTermRef()) IncrementReference(); if (m_PictureStructureForRef >= FRM_STRUCTURE) m_isShortTermRef[0] = m_isShortTermRef[1] = true; else m_isShortTermRef[WhichField] = true; } else { bool wasRef = isShortTermRef() != 0; if (m_PictureStructureForRef >= FRM_STRUCTURE) { m_isShortTermRef[0] = m_isShortTermRef[1] = false; } else m_isShortTermRef[WhichField] = false; if (wasRef && !isShortTermRef() && !isLongTermRef()) { DecrementReference(); } } } void H264DecoderFrame::SetisLongTermRef(bool isRef, int32_t WhichField) { if (isRef) { if (!isShortTermRef() && !isLongTermRef()) IncrementReference(); if (m_PictureStructureForRef >= FRM_STRUCTURE) m_isLongTermRef[0] = m_isLongTermRef[1] = true; else m_isLongTermRef[WhichField] = true; } else { bool wasRef = isLongTermRef() != 0; if (m_PictureStructureForRef >= FRM_STRUCTURE) { m_isLongTermRef[0] = m_isLongTermRef[1] = false; } else m_isLongTermRef[WhichField] = false; if (wasRef && !isShortTermRef() && !isLongTermRef()) { DecrementReference(); } } } void H264DecoderFrame::setWasOutputted() { m_wasOutputted = 1; } void H264DecoderFrame::Free() { DEBUG_PRINT((VM_STRING("Free reference POC - %d, ref. count - %d, uid - %d, state D.%d O.%d\n"), m_PicOrderCnt[0], m_refCounter, m_UID, m_wasDisplayed, m_wasOutputted)); if (wasDisplayed() && wasOutputted()) Reset(); } H264DecoderRefPicList* H264DecoderFrame::GetRefPicList(int32_t sliceNumber, int32_t list) { H264DecoderRefPicList *pList; pList = GetAU(sliceNumber > m_TopSliceCount ? 1 : 0)->GetRefPicList(sliceNumber, list); return pList; } // RefPicList. Returns pointer to start of specified ref pic list. ////////////////////////////////////////////////////////////////////////////// // updateFrameNumWrap // Updates m_FrameNumWrap and m_PicNum if the frame is a short-term // reference and a frame number wrap has occurred. ////////////////////////////////////////////////////////////////////////////// void H264DecoderFrame::UpdateFrameNumWrap(int32_t CurrFrameNum, int32_t MaxFrameNum, int32_t CurrPicStruct) { if (isShortTermRef()) { m_FrameNumWrap = m_FrameNum; if (m_FrameNum > CurrFrameNum) m_FrameNumWrap -= MaxFrameNum; if (CurrPicStruct >= FRM_STRUCTURE) { setPicNum(m_FrameNumWrap, 0); setPicNum(m_FrameNumWrap, 1); m_PictureStructureForRef = FRM_STRUCTURE; } else { m_PictureStructureForRef = FLD_STRUCTURE; if (m_bottom_field_flag[0]) { //1st - bottom, 2nd - top if (isShortTermRef(0)) setPicNum((2*m_FrameNumWrap) + (CurrPicStruct == BOTTOM_FLD_STRUCTURE), 0); if (isShortTermRef(1)) setPicNum((2*m_FrameNumWrap) + (CurrPicStruct == TOP_FLD_STRUCTURE), 1); } else { //1st - top , 2nd - bottom if (isShortTermRef(0)) setPicNum((2*m_FrameNumWrap) + (CurrPicStruct == TOP_FLD_STRUCTURE), 0); if (isShortTermRef(1)) setPicNum((2*m_FrameNumWrap) + (CurrPicStruct == BOTTOM_FLD_STRUCTURE), 1); } } } } // updateFrameNumWrap ////////////////////////////////////////////////////////////////////////////// // updateLongTermPicNum // Updates m_LongTermPicNum for if long term reference, based upon // m_LongTermFrameIdx. ////////////////////////////////////////////////////////////////////////////// void H264DecoderFrame::UpdateLongTermPicNum(int32_t CurrPicStruct) { if (isLongTermRef()) { if (CurrPicStruct >= FRM_STRUCTURE) { m_LongTermPicNum[0] = m_LongTermFrameIdx; m_LongTermPicNum[1] = m_LongTermFrameIdx; m_PictureStructureForRef = FRM_STRUCTURE; } else { m_PictureStructureForRef = FLD_STRUCTURE; if (m_bottom_field_flag[0]) { //1st - bottom, 2nd - top m_LongTermPicNum[0] = 2*m_LongTermFrameIdx + (CurrPicStruct == BOTTOM_FLD_STRUCTURE); m_LongTermPicNum[1] = 2*m_LongTermFrameIdx + (CurrPicStruct == TOP_FLD_STRUCTURE); } else { //1st - top , 2nd - bottom m_LongTermPicNum[0] = 2*m_LongTermFrameIdx + (CurrPicStruct == TOP_FLD_STRUCTURE); m_LongTermPicNum[1] = 2*m_LongTermFrameIdx + (CurrPicStruct == BOTTOM_FLD_STRUCTURE); } } } } // updateLongTermPicNum bool H264DecoderFrameInfo::CheckReferenceFrameError() { uint32_t checkedErrorMask = ERROR_FRAME_MINOR | ERROR_FRAME_MAJOR | ERROR_FRAME_REFERENCE_FRAME; for (size_t i = 0; i < m_refPicList.size(); i++) { H264DecoderRefPicList* list = &m_refPicList[i].m_refPicList[LIST_0]; for (size_t k = 0; list->m_RefPicList[k]; k++) { if (list->m_RefPicList[k]->GetError() & checkedErrorMask) return true; } list = &m_refPicList[i].m_refPicList[LIST_1]; for (size_t k = 0; list->m_RefPicList[k]; k++) { if (list->m_RefPicList[k]->GetError() & checkedErrorMask) return true; } } return false; } } // end namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_frame_list.cpp000066400000000000000000001162631443134507600324020ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_frame_list.h" #include "umc_h264_dec_debug.h" #include "umc_h264_task_supplier.h" namespace UMC { H264DecoderFrameList::H264DecoderFrameList(void) { m_pHead = NULL; m_pTail = NULL; } // H264DecoderFrameList::H264DecoderFrameList(void) H264DecoderFrameList::~H264DecoderFrameList(void) { Release(); } // H264DecoderFrameList::~H264DecoderFrameList(void) void H264DecoderFrameList::Release(void) { // destroy frame list while (m_pHead) { H264DecoderFrame *pNext = m_pHead->future(); delete m_pHead; m_pHead = pNext; } m_pHead = NULL; m_pTail = NULL; } // void H264DecoderFrameList::Release(void) ////////////////////////////////////////////////////////////////////////////// // append // Appends a new decoded frame buffer to the "end" of the linked list ////////////////////////////////////////////////////////////////////////////// void H264DecoderFrameList::append(H264DecoderFrame *pFrame) { // Error check if (!pFrame) { // Sent in a NULL frame return; } // Has a list been constructed - is their a head? if (!m_pHead) { // Must be the first frame appended // Set the head to the current m_pHead = pFrame; m_pHead->setPrevious(0); } if (m_pTail) { // Set the old tail as the previous for the current pFrame->setPrevious(m_pTail); // Set the old tail's future to the current m_pTail->setFuture(pFrame); } else { // Must be the first frame appended // Set the tail to the current m_pTail = pFrame; } // The current is now the new tail m_pTail = pFrame; m_pTail->setFuture(0); // } void H264DecoderFrameList::swapFrames(H264DecoderFrame *pFrame1, H264DecoderFrame *pFrame2) { H264DecoderFrame * temp1 = pFrame1->previous(); H264DecoderFrame * temp2 = pFrame2->previous(); if (temp1) { temp1->setFuture(pFrame2); } if (temp2) { temp2->setFuture(pFrame1); } pFrame1->setPrevious(temp2); pFrame2->setPrevious(temp1); temp1 = pFrame1->future(); temp2 = pFrame2->future(); if (temp1) { temp1->setPrevious(pFrame2); } if (temp2) { temp2->setPrevious(pFrame1); } pFrame1->setFuture(temp2); pFrame2->setFuture(temp1); if (m_pHead == pFrame1) { m_pHead = pFrame2; } else { if (m_pHead == pFrame2) { m_pHead = pFrame1; } } if (m_pTail == pFrame1) { m_pTail = pFrame2; } else { if (m_pTail == pFrame2) { m_pTail = pFrame1; } } } H264DBPList::H264DBPList() : m_dpbSize(0) , m_recovery_frame_cnt(-1) , m_wasRecoveryPointFound(false) { } H264DecoderFrame * H264DBPList::GetDisposable(void) { H264DecoderFrame *pOldest = NULL; for (H264DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable()) { pOldest = pTmp; } } return pOldest; } bool H264DBPList::IsDisposableExist() { for (H264DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable()) { return true; } } return false; } bool H264DBPList::IsAlmostDisposableExist() { int32_t count = 0; for (H264DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { count++; if (isAlmostDisposable(pTmp)) { return true; } } return count < m_dpbSize; } H264DecoderFrame * H264DBPList::findDisplayableByDPBDelay(void) { H264DecoderFrame *pCurr = m_pHead; H264DecoderFrame *pOldest = NULL; int32_t SmallestPicOrderCnt = 0x7fffffff; // very large positive uint32_t LargestRefPicListResetCount = 0; int32_t count = 0; while (pCurr) { if (pCurr->IsFullFrame() && !pCurr->wasOutputted() && !pCurr->m_dpb_output_delay) { // corresponding frame if (pCurr->RefPicListResetCount(0) > LargestRefPicListResetCount) { pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(0,3); LargestRefPicListResetCount = pCurr->RefPicListResetCount(0); } else if (pCurr->RefPicListResetCount(0) == LargestRefPicListResetCount && pCurr->PicOrderCnt(0,3) <= SmallestPicOrderCnt) { assert(pCurr->m_UID != -1); pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(0,3); } if (pOldest && !pOldest->IsFrameExist() && pCurr->IsFrameExist()) { if (pCurr->PicOrderCnt(0,3) == SmallestPicOrderCnt && pCurr->RefPicListResetCount(0) == LargestRefPicListResetCount) pOldest = pCurr; } count++; } pCurr = pCurr->future(); } // may be OK if NULL return pOldest; } /////////////////////////////////////////////////////////////////////////////// // findOldestDisplayable // Search through the list for the oldest displayable frame. It must be // not disposable, not outputted, and have smallest PicOrderCnt. /////////////////////////////////////////////////////////////////////////////// H264DecoderFrame * H264DBPList::findOldestDisplayable(int32_t /*dbpSize*/ ) { H264DecoderFrame *pCurr = m_pHead; H264DecoderFrame *pOldest = NULL; int32_t SmallestPicOrderCnt = 0x7fffffff; // very large positive uint32_t LargestRefPicListResetCount = 0; int32_t count = 0; while (pCurr) { if (pCurr->IsFullFrame() && !pCurr->wasOutputted()) { // corresponding frame if (pCurr->RefPicListResetCount(0) > LargestRefPicListResetCount) { pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(0,3); LargestRefPicListResetCount = pCurr->RefPicListResetCount(0); } else if ((pCurr->PicOrderCnt(0,3) <= SmallestPicOrderCnt) && (pCurr->RefPicListResetCount(0) == LargestRefPicListResetCount)) { assert(pCurr->m_UID != -1); pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(0,3); } if (pOldest && !pOldest->IsFrameExist() && pCurr->IsFrameExist()) { if (pCurr->PicOrderCnt(0,3) == SmallestPicOrderCnt && pCurr->RefPicListResetCount(0) == LargestRefPicListResetCount) pOldest = pCurr; } count++; } pCurr = pCurr->future(); } // may be OK if NULL return pOldest; } // findOldestDisplayable uint32_t H264DBPList::countAllFrames() { H264DecoderFrame *pCurr = head(); uint32_t count = 0; while (pCurr) { count++; pCurr = pCurr->future(); } return count; } uint32_t H264DBPList::countNumDisplayable() { H264DecoderFrame *pCurr = head(); uint32_t NumDisplayable = 0; while (pCurr) { if (pCurr->IsFullFrame() && (pCurr->isShortTermRef() || pCurr->isLongTermRef() || !pCurr->wasOutputted())) NumDisplayable++; pCurr = pCurr->future(); } return NumDisplayable; } /////////////////////////////////////////////////////////////////////////////// // countActiveRefs // Return number of active int16_t and long term reference frames. /////////////////////////////////////////////////////////////////////////////// void H264DBPList::countActiveRefs(uint32_t &NumShortTerm, uint32_t &NumLongTerm) { H264DecoderFrame *pCurr = m_pHead; NumShortTerm = 0; NumLongTerm = 0; while (pCurr) { if (pCurr->isShortTermRef()) NumShortTerm++; else if (pCurr->isLongTermRef()) NumLongTerm++; pCurr = pCurr->future(); } } // countActiveRefs void H264DBPList::IncreaseRefPicListResetCount(H264DecoderFrame *ExcludeFrame) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr!=ExcludeFrame) { pCurr->IncreaseRefPicListResetCount(0); pCurr->IncreaseRefPicListResetCount(1); } pCurr = pCurr->future(); } } // IncreaseRefPicListResetCount H264DecoderFrame * H264DBPList::findOldestShortTermRef() { H264DecoderFrame *pCurr = m_pHead; H264DecoderFrame *pOldest = 0; int32_t SmallestFrameNumWrap = 0x0fffffff; // very large positive while (pCurr) { if (pCurr->isShortTermRef() && (pCurr->FrameNumWrap() < SmallestFrameNumWrap)) { pOldest = pCurr; SmallestFrameNumWrap = pCurr->FrameNumWrap(); } pCurr = pCurr->future(); } return pOldest; } // findOldestShortTermRef H264DecoderFrame * H264DBPList::findOldestLongTermRef() { H264DecoderFrame *pCurr = m_pHead; H264DecoderFrame *pOldest = 0; int32_t SmallestFrameNumWrap = 0x0fffffff; // very large positive while (pCurr) { if (pCurr->isLongTermRef() && (pCurr->FrameNumWrap() < SmallestFrameNumWrap)) { pOldest = pCurr; SmallestFrameNumWrap = pCurr->FrameNumWrap(); } pCurr = pCurr->future(); } return pOldest; } // findOldestLongTermRef H264DecoderFrame * H264DBPList::findLongTermRefIdx(int32_t LongTermFrameIdx) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->m_PictureStructureForRef >= FRM_STRUCTURE) { if (pCurr->isLongTermRef() && (pCurr->LongTermFrameIdx() == LongTermFrameIdx )) { return pCurr; } } else { if (pCurr->isLongTermRef(0) && (pCurr->LongTermFrameIdx() == LongTermFrameIdx )) { return pCurr; } if (pCurr->isLongTermRef(1) && (pCurr->LongTermFrameIdx() == LongTermFrameIdx )) { return pCurr; } } pCurr = pCurr->future(); } //assert(false); return 0; } H264DecoderFrame * H264DBPList::findOldLongTermRef(int32_t MaxLongTermFrameIdx) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->isLongTermRef(0) && (pCurr->LongTermFrameIdx() > MaxLongTermFrameIdx)) { return pCurr; } pCurr = pCurr->future(); } return 0; // OK to not find any to free } H264DecoderFrame *H264DBPList::findShortTermPic(int32_t picNum, int32_t * field) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->m_PictureStructureForRef >= FRM_STRUCTURE) { if ((pCurr->isShortTermRef() == 3) && (pCurr->PicNum(0) == picNum)) { if (field) *field = 0; return pCurr; } } else { if (pCurr->isShortTermRef(0) && (pCurr->PicNum(0) == picNum)) { if (field) *field = 0; return pCurr; } if (pCurr->isShortTermRef(1) && (pCurr->PicNum(1) == picNum)) { if (field) *field = 1; return pCurr; } } pCurr = pCurr->future(); } //assert(false); // No match found, should not happen. return 0; } // findShortTermPic H264DecoderFrame *H264DBPList::findLongTermPic(int32_t picNum, int32_t * field) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->m_PictureStructureForRef >= FRM_STRUCTURE) { if ((pCurr->isLongTermRef() == 3) && (pCurr->LongTermPicNum(0) == picNum)) { if (field) *field = 0; return pCurr; } } else { if (pCurr->isLongTermRef(0) && (pCurr->LongTermPicNum(0) == picNum)) { if (field) *field = 0; return pCurr; } if (pCurr->isLongTermRef(1) && (pCurr->LongTermPicNum(1) == picNum)) { if (field) *field = 1; return pCurr; } } pCurr = pCurr->future(); } //assert(false); // No match found, should not happen. return 0; } // findLongTermPic H264DecoderFrame *H264DBPList::findInterViewRef(int32_t auIndex, uint32_t bottomFieldFlag) { H264DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->m_auIndex == auIndex) { uint32_t fieldIdx = pCurr->GetNumberByParity(bottomFieldFlag); return pCurr->isInterViewRef(fieldIdx) ? pCurr : 0; } // get the next frame pCurr = pCurr->future(); } return 0; } H264DecoderFrame * H264DBPList::FindClosest(H264DecoderFrame * pFrame) { int32_t originalPOC = pFrame->PicOrderCnt(0, 3); uint32_t originalResetCount = pFrame->RefPicListResetCount(0); H264DecoderFrame * pOldest = 0; int32_t SmallestPicOrderCnt = 0; // very large positive uint32_t SmallestRefPicListResetCount = 0x7fffffff; for (H264DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->IsSkipped() || pTmp == pFrame || !pTmp->IsDecodingCompleted()) continue; if (pTmp->m_chroma_format != pFrame->m_chroma_format || pTmp->lumaSize().width != pFrame->lumaSize().width || pTmp->lumaSize().height != pFrame->lumaSize().height) continue; if (pTmp->RefPicListResetCount(0) < SmallestRefPicListResetCount) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(0,3); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(0); } else if (pTmp->RefPicListResetCount(0) == SmallestRefPicListResetCount) { if (pTmp->RefPicListResetCount(0) == originalResetCount) { if (SmallestRefPicListResetCount != originalResetCount) { SmallestPicOrderCnt = 0x7fff; } if (abs(pTmp->PicOrderCnt(0,3) - originalPOC) < SmallestPicOrderCnt) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(0,3); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(0); } } else { if (pTmp->PicOrderCnt(0,3) > SmallestPicOrderCnt) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(0,3); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(0); } } } } return pOldest; } H264DecoderFrame * H264DBPList::FindByIndex(int32_t index) { for (H264DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->m_index == index) return pTmp; } return 0; } int32_t H264DBPList::GetRecoveryFrameCnt() const { return m_recovery_frame_cnt; } void H264DBPList::SetRecoveryFrameCnt(int32_t recovery_frame_cnt) { if (m_wasRecoveryPointFound && recovery_frame_cnt != -1) { return; } m_recovery_frame_cnt = recovery_frame_cnt; m_wasRecoveryPointFound = true; } void H264DBPList::Reset(void) { H264DecoderFrame *pFrame ; for (pFrame = head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } for (pFrame = head(); pFrame; pFrame = pFrame->future()) { pFrame->Reset(); } m_wasRecoveryPointFound = false; m_recovery_frame_cnt = -1; } // void H264DBPList::Reset(void) void H264DBPList::InitPSliceRefPicList(H264Slice *slice, H264DecoderFrame **pRefPicList) { int32_t j, k; int32_t NumFramesInList; H264DecoderFrame *pHead = head(); H264DecoderFrame *pFrm; int32_t picNum; bool bError = false; bool bIsFieldSlice = (slice->GetSliceHeader()->field_pic_flag != 0); assert(pRefPicList); NumFramesInList = 0; if (!bIsFieldSlice) { // Frame. Ref pic list ordering: Short term largest pic num to // smallest, followed by long term, largest long term pic num to // smallest. Note that ref pic list has one extra slot to assist // with re-ordering. for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { if (pFrm->isShortTermRef()==3) { // add to ordered list picNum = pFrm->PicNum(0); // find insertion point j=0; while (jisShortTermRef() && pRefPicList[j]->PicNum(0) > picNum) j++; // make room if needed if (pRefPicList[j]) { for (k=NumFramesInList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList[k] = pRefPicList[k-1]; } } // add the short-term reference pRefPicList[j] = pFrm; NumFramesInList++; } else if (pFrm->isLongTermRef()==3) { // add to ordered list picNum = pFrm->LongTermPicNum(0,3); // find insertion point j=0; // Skip past short-term refs and long term refs with smaller // long term pic num while (jisShortTermRef() || (pRefPicList[j]->isLongTermRef() && pRefPicList[j]->LongTermPicNum(0,2) < picNum))) j++; // make room if needed if (pRefPicList[j]) { for (k=NumFramesInList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList[k] = pRefPicList[k-1]; } } // add the long-term reference pRefPicList[j] = pFrm; NumFramesInList++; } if (bError) break; } } else { // TBD: field for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { if (pFrm->isShortTermRef()) { // add to ordered list picNum = pFrm->FrameNumWrap(); // find insertion point j=0; while (jisShortTermRef() && pRefPicList[j]->FrameNumWrap() > picNum) j++; // make room if needed if (pRefPicList[j]) { for (k=NumFramesInList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList[k] = pRefPicList[k-1]; } } // add the short-term reference pRefPicList[j] = pFrm; NumFramesInList++; } else if (pFrm->isLongTermRef()) { // long term reference picNum = pFrm->LongTermPicNum(0,2); // find insertion point j=0; // Skip past short-term refs and long term refs with smaller // long term pic num while (jisShortTermRef() || (pRefPicList[j]->isLongTermRef() && pRefPicList[j]->LongTermPicNum(0,2) < picNum))) j++; // make room if needed if (pRefPicList[j]) { for (k=NumFramesInList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList[k] = pRefPicList[k-1]; } } // add the long-term reference pRefPicList[j] = pFrm; NumFramesInList++; } if (bError) break; } } } void H264DBPList::InitBSliceRefPicLists(H264Slice *slice, H264DecoderFrame **pRefPicList0, H264DecoderFrame **pRefPicList1, H264RefListInfo &rli) { bool bIsFieldSlice = (slice->GetSliceHeader()->field_pic_flag != 0); int32_t i, j, k; int32_t NumFramesInL0List; int32_t NumFramesInL1List; int32_t NumFramesInLTList; H264DecoderFrame *pHead = head(); H264DecoderFrame *pFrm; int32_t FrmPicOrderCnt; H264DecoderFrame *LTRefPicList[MAX_NUM_REF_FRAMES]; // temp storage for long-term ordered list int32_t LongTermPicNum; bool bError = false; for (i=0; i<(int32_t)MAX_NUM_REF_FRAMES; i++) { LTRefPicList[i] = 0; } NumFramesInL0List = 0; NumFramesInL1List = 0; NumFramesInLTList = 0; if (!bIsFieldSlice) { int32_t CurrPicOrderCnt = slice->GetCurrentFrame()->PicOrderCnt(0); // Short term references: // Need L0 and L1 lists. Both contain 2 sets of reference frames ordered // by PicOrderCnt. The "previous" set contains the reference frames with // a PicOrderCnt < current frame. The "future" set contains the reference // frames with a PicOrderCnt > current frame. In both cases the ordering // is from closest to current frame to farthest. L0 has the previous set // followed by the future set; L1 has the future set followed by the previous set. // Accomplish this by one pass through the decoded frames list creating // the ordered previous list in the L0 array and the ordered future list // in the L1 array. Then copy from both to the other for the second set. // Long term references: // The ordered list is the same for L0 and L1, is ordered by ascending // LongTermPicNum. The ordered list is created using local temp then // appended to the L0 and L1 lists after the short-term references. for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { if (pFrm->isShortTermRef()==3) { // add to ordered list FrmPicOrderCnt = pFrm->PicOrderCnt(0,3); if (FrmPicOrderCnt < CurrPicOrderCnt) { // Previous reference to L0, order large to small j=0; while (j < NumFramesInL0List && (pRefPicList0[j]->PicOrderCnt(0,3) > FrmPicOrderCnt)) j++; // make room if needed if (pRefPicList0[j]) { for (k = NumFramesInL0List; k > j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList0[k] = pRefPicList0[k-1]; } } // add the short-term reference pRefPicList0[j] = pFrm; NumFramesInL0List++; } else { // Future reference to L1, order small to large j=0; while (jPicOrderCnt(0,3) < FrmPicOrderCnt) j++; // make room if needed if (pRefPicList1[j]) { for (k=NumFramesInL1List; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList1[k] = pRefPicList1[k-1]; } } // add the short-term reference pRefPicList1[j] = pFrm; NumFramesInL1List++; } } // short-term B else if (pFrm->isLongTermRef()==3) { // long term reference LongTermPicNum = pFrm->LongTermPicNum(0,3); // order smallest to largest j=0; while (jLongTermPicNum(0) < LongTermPicNum) j++; // make room if needed if (LTRefPicList[j]) { for (k=NumFramesInLTList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } LTRefPicList[k] = LTRefPicList[k-1]; } } // add the long-term reference LTRefPicList[j] = pFrm; NumFramesInLTList++; } // long term reference if (bError) break; } // for pFrm if ((NumFramesInL0List + NumFramesInL1List + NumFramesInLTList) < MAX_NUM_REF_FRAMES) { // Complete L0 and L1 lists // Add future short-term references to L0 list, after previous for (i=0; i 1)) { pRefPicList1[0] = pRefPicList0[1]; pRefPicList1[1] = pRefPicList0[0]; } } else { // too many reference frames assert(0); } } // not field slice else { int32_t CurrPicOrderCnt = slice->GetCurrentFrame()->PicOrderCnt(slice->GetCurrentFrame()->GetNumberByParity(slice->GetSliceHeader()->bottom_field_flag)); // Short term references: // Need L0 and L1 lists. Both contain 2 sets of reference frames ordered // by PicOrderCnt. The "previous" set contains the reference frames with // a PicOrderCnt < current frame. The "future" set contains the reference // frames with a PicOrderCnt > current frame. In both cases the ordering // is from closest to current frame to farthest. L0 has the previous set // followed by the future set; L1 has the future set followed by the previous set. // Accomplish this by one pass through the decoded frames list creating // the ordered previous list in the L0 array and the ordered future list // in the L1 array. Then copy from both to the other for the second set. // Long term references: // The ordered list is the same for L0 and L1, is ordered by ascending // LongTermPicNum. The ordered list is created using local temp then // appended to the L0 and L1 lists after the short-term references. for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { if (pFrm->isShortTermRef()) { // add to ordered list FrmPicOrderCnt = pFrm->PicOrderCnt(0,2);//returns POC of reference field (or min if both are reference) if (FrmPicOrderCnt <= CurrPicOrderCnt) { // Previous reference to L0, order large to small j=0; while (j < NumFramesInL0List && (pRefPicList0[j]->PicOrderCnt(0,2) > FrmPicOrderCnt)) j++; // make room if needed if (pRefPicList0[j]) { for (k = NumFramesInL0List; k > j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList0[k] = pRefPicList0[k-1]; } } // add the short-term reference pRefPicList0[j] = pFrm; NumFramesInL0List++; } else { // Future reference to L1, order small to large j=0; while (jPicOrderCnt(0,2) < FrmPicOrderCnt) j++; // make room if needed if (pRefPicList1[j]) { for (k=NumFramesInL1List; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } pRefPicList1[k] = pRefPicList1[k-1]; } } // add the short-term reference pRefPicList1[j] = pFrm; NumFramesInL1List++; } } // short-term B else if (pFrm->isLongTermRef()) { // long term reference LongTermPicNum = pFrm->LongTermPicNum(0,2); // order smallest to largest j=0; while (j < NumFramesInLTList && LTRefPicList[j]->LongTermPicNum(0,2) < LongTermPicNum) j++; // make room if needed if (LTRefPicList[j]) { for (k=NumFramesInLTList; k>j; k--) { // Avoid writing beyond end of list if (k > (int32_t)(MAX_NUM_REF_FRAMES-1)) { assert(0); bError = true; break; } LTRefPicList[k] = LTRefPicList[k-1]; } } // add the long-term reference LTRefPicList[j] = pFrm; NumFramesInLTList++; } // long term reference if (bError) break; } // for pFrm if ((NumFramesInL0List+NumFramesInL1List+NumFramesInLTList) < MAX_NUM_REF_FRAMES) { // Complete L0 and L1 lists // Add future short-term references to L0 list, after previous for (i=0; i 1)) { pRefPicList1[0] = pRefPicList0[1]; pRefPicList1[1] = pRefPicList0[0]; }*/ } else { // too many reference frames assert(0); } } rli.m_iNumFramesInL0List = NumFramesInL0List; rli.m_iNumFramesInL1List = NumFramesInL1List; rli.m_iNumFramesInLTList = NumFramesInLTList; } void H264DBPList::AddInterViewRefs(H264Slice *slice, H264DecoderFrame **pRefPicList, ReferenceFlags *pFields, uint32_t listNum, ViewList &views) { uint32_t curRefIdx = 0; uint32_t num_refs_lx; const uint16_t *refs_lx; // get the number of entries in the list while ((MAX_NUM_REF_FIELDS > curRefIdx) && (pRefPicList[curRefIdx])) { curRefIdx += 1; } // get the number of inter-view references and // corresponding view Id array { uint32_t VOIdx = GetVOIdx(slice->GetSeqMVCParam(), slice->GetSliceHeader()->nal_ext.mvc.view_id); const UMC_H264_DECODER::H264ViewRefInfo &refInfo = slice->GetSeqMVCParam()->viewInfo[VOIdx]; if (slice->GetSliceHeader()->nal_ext.mvc.anchor_pic_flag) { num_refs_lx = refInfo.num_anchor_refs_lx[listNum]; refs_lx = refInfo.anchor_refs_lx[listNum]; } else { num_refs_lx = refInfo.num_non_anchor_refs_lx[listNum]; refs_lx = refInfo.non_anchor_refs_lx[listNum]; } } // append inter-view references to ref list for (uint32_t j = 0; j < num_refs_lx; j += 1) { // get reference view Id uint32_t refViewIdx = refs_lx[j]; // get the corresponding view H264DBPList *pDPB = GetDPB(views, refViewIdx); if (pDPB) { // get the reference from the same access unit H264DecoderFrame *pRef = pDPB->findInterViewRef(slice->GetCurrentFrame()->m_auIndex, slice->GetSliceHeader()->bottom_field_flag); if (pRef) { pRefPicList[curRefIdx] = pRef; pFields[curRefIdx].field = slice->GetSliceHeader()->bottom_field_flag; pFields[curRefIdx].isShortReference = 1; curRefIdx += 1; } } } } // void AddInterViewRefs(H264DecoderFrame **pRefPicList, void H264DBPList::DebugPrint() { #ifdef ENABLE_TRACE Trace(VM_STRING("-==========================================\n")); H264DecoderFrame * pTmp = m_pHead; for (int i = 0; pTmp; pTmp = pTmp->future(), i++) { Trace(VM_STRING("\n\n#%02d: UID - %d POC - %d %d - resetcount - %d\n"), i, pTmp->m_UID, pTmp->m_PicOrderCnt[0], pTmp->m_PicOrderCnt[1], pTmp->RefPicListResetCount(0)); Trace(VM_STRING("ViewId - %d, m_isInterViewRef - %d \n"), pTmp->m_viewId, pTmp->m_isInterViewRef[0]); Trace(VM_STRING("Short - %d %d \n"), pTmp->isShortTermRef(0), pTmp->isShortTermRef(1)); Trace(VM_STRING("Long - %d %d \n"), pTmp->isLongTermRef(0), pTmp->isLongTermRef(1)); Trace(VM_STRING("Busy - %d \n"), pTmp->GetRefCounter()); Trace(VM_STRING("Skipping - %d, FrameExist - %d \n"), pTmp->IsSkipped(), pTmp->IsFrameExist()); Trace(VM_STRING("FrameNum - %d \n"), pTmp->m_FrameNum); Trace(VM_STRING("PicNum - (%d, %d) \n"), pTmp->m_PicNum[0], pTmp->m_PicNum[1]); Trace(VM_STRING("LongPicNum - (%d, %d) \n"), pTmp->m_LongTermPicNum[0], pTmp->m_LongTermPicNum[1]); Trace(VM_STRING("Disp - %d , wasOutput - %d wasDisplayed - %d\n"), pTmp->IsDecoded(), pTmp->wasOutputted(), pTmp->wasDisplayed()); Trace(VM_STRING("frame ID - %d, this - %d, decoded - %d, %d \n"), pTmp->GetFrameData()->GetFrameMID(), pTmp, pTmp->m_isDecoded, pTmp->m_isDecodingCompleted); } Trace(VM_STRING("-==========================================\n")); fflush(stdout); #endif } } // end namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_heap.cpp000066400000000000000000000205731443134507600311700ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_structures.h" #include "umc_h264_heap.h" #include "umc_h264_dec_defs_dec.h" namespace UMC { enum { COEFFS_BUFFER_ALIGN_VALUE = 128 }; H264CoeffsBuffer::H264CoeffsBuffer(void) { // reset variables m_pbAllocatedBuffer = 0; m_lAllocatedBufferSize = 0; m_pbBuffer = 0; m_lBufferSize = 0; m_pbFree = 0; m_lFreeSize = 0; m_pBuffers = 0; m_lItemSize = 0; } // H264CoeffsBuffer::H264CoeffsBuffer(void) H264CoeffsBuffer::~H264CoeffsBuffer(void) { Close(); } // H264CoeffsBuffer::~H264CoeffsBuffer(void) void H264CoeffsBuffer::Close(void) { // delete buffer if (m_pbAllocatedBuffer) delete[] m_pbAllocatedBuffer; // reset variables m_pbAllocatedBuffer = 0; m_lAllocatedBufferSize = 0; m_pbBuffer = 0; m_lBufferSize = 0; m_pbFree = 0; m_lFreeSize = 0; m_pBuffers = 0; } // void H264CoeffsBuffer::Close(void) Status H264CoeffsBuffer::Init(int32_t numberOfItems, int32_t sizeOfItem) { int32_t lMaxSampleSize = sizeOfItem + COEFFS_BUFFER_ALIGN_VALUE + (int32_t)sizeof(BufferInfo); int32_t lAllocate = lMaxSampleSize * numberOfItems; if ((int32_t)m_lBufferSize < lAllocate) { Close(); // allocate buffer m_pbAllocatedBuffer = h264_new_array_throw(lAllocate + COEFFS_BUFFER_ALIGN_VALUE); m_lBufferSize = lAllocate; m_lAllocatedBufferSize = lAllocate + COEFFS_BUFFER_ALIGN_VALUE; // align buffer m_pbBuffer = align_pointer (m_pbAllocatedBuffer, COEFFS_BUFFER_ALIGN_VALUE); } m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; // save preferred size(s) m_lItemSize = sizeOfItem; return UMC_OK; } // Status H264CoeffsBuffer::Init(MediaReceiverParams *init) bool H264CoeffsBuffer::IsInputAvailable() const { size_t lFreeSize; // check error(s) if (NULL == m_pbFree) return false; // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) { lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; } else { lFreeSize = m_lFreeSize; if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo)) return false; } // check free size if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo)) { // when used data is present, // concatenate dummy bytes to last buffer info if (m_pBuffers) { return (m_lFreeSize - lFreeSize > m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo)); } // when no used data, // simple move pointer(s) else { return (m_lFreeSize == m_lBufferSize); } } return true; } // bool H264CoeffsBuffer::IsInputAvailable() const uint8_t* H264CoeffsBuffer::LockInputBuffer() { size_t lFreeSize; // check error(s) if (NULL == m_pbFree) return 0; if (m_pBuffers == 0) { // We could do it, because only one thread could get input buffer m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; } // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) { lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; } else { lFreeSize = m_lFreeSize; if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo)) return 0; } // check free size if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo)) { // when used data is present, // concatenate dummy bytes to last buffer info if (m_pBuffers) { BufferInfo *pTemp; // find last sample info pTemp = m_pBuffers; while (pTemp->m_pNext) pTemp = pTemp->m_pNext; pTemp->m_Size += lFreeSize; // update variable(s) m_pbFree = m_pbBuffer; m_lFreeSize -= lFreeSize; return LockInputBuffer(); } // when no used data, // simple move pointer(s) else { if (m_lFreeSize == m_lBufferSize) { m_pbFree = m_pbBuffer; return m_pbFree; } return 0; } } return m_pbFree; } // bool H264CoeffsBuffer::LockInputBuffer(MediaData* in) bool H264CoeffsBuffer::UnLockInputBuffer(size_t size) { size_t lFreeSize; BufferInfo *pTemp; uint8_t *pb; // check error(s) if (NULL == m_pbFree) return false; // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; else lFreeSize = m_lFreeSize; // check free size if (lFreeSize < m_lItemSize) return false; // check used data if (size + COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo) > lFreeSize) // DEBUG : should not be !!! { assert(false); return false; } // get new buffer info pb = align_pointer (m_pbFree + size, COEFFS_BUFFER_ALIGN_VALUE); pTemp = reinterpret_cast (pb); size += COEFFS_BUFFER_ALIGN_VALUE + sizeof(BufferInfo); // fill buffer info pTemp->m_Size = size; pTemp->m_pPointer = m_pbFree; pTemp->m_pNext = 0; // add sample to end of queue if (m_pBuffers) { BufferInfo *pWork = m_pBuffers; while (pWork->m_pNext) pWork = pWork->m_pNext; pWork->m_pNext = pTemp; } else m_pBuffers = pTemp; // update variable(s) m_pbFree += size; if (m_pbBuffer + m_lBufferSize == m_pbFree) m_pbFree = m_pbBuffer; m_lFreeSize -= size; return true; } // bool H264CoeffsBuffer::UnLockInputBuffer(size_t size) bool H264CoeffsBuffer::IsOutputAvailable() const { return (0 != m_pBuffers); } // bool H264CoeffsBuffer::IsOutputAvailable() const bool H264CoeffsBuffer::LockOutputBuffer(uint8_t* &pointer, size_t &size) { // check error(s) if (0 == m_pBuffers) return false; // set used pointer pointer = m_pBuffers->m_pPointer; size = m_pBuffers->m_Size; return true; } // bool H264CoeffsBuffer::LockOutputBuffer(uint8_t* &pointer, size_t &size) bool H264CoeffsBuffer::UnLockOutputBuffer() { // no filled data is present if (0 == m_pBuffers) return false; // update variable(s) m_lFreeSize += m_pBuffers->m_Size; m_pBuffers = m_pBuffers->m_pNext; return true; } // bool H264CoeffsBuffer::UnLockOutputBuffer() void H264CoeffsBuffer::Reset() { // align buffer m_pbBuffer = align_pointer (m_pbAllocatedBuffer, COEFFS_BUFFER_ALIGN_VALUE); m_pBuffers = 0; m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; } //void H264CoeffsBuffer::Reset() void H264CoeffsBuffer::Free() { HeapObject::Free(); } void HeapObject::Free() { Item * item = (Item *) ((uint8_t*)this - sizeof(Item)); item->m_heap->Free(this); } void RefCounter::IncrementReference() const { m_refCounter++; } void RefCounter::DecrementReference() { m_refCounter--; assert(m_refCounter >= 0); if (!m_refCounter) { Free(); } } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_mfx_supplier.cpp000066400000000000000000001715121443134507600327700ustar00rootroot00000000000000// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include #include "umc_h264_mfx_supplier.h" #include "umc_h264_frame_list.h" #include "umc_h264_nal_spl.h" #include "umc_h264_bitstream_headers.h" #include "umc_h264_dec_defs_dec.h" #include "umc_h264_dec_mfx.h" #include "umc_h264_dec_debug.h" #include "mfx_enc_common.h" namespace UMC { //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// RawHeader::RawHeader() { Reset(); } void RawHeader::Reset() { m_id = -1; m_buffer.clear(); } int32_t RawHeader::GetID() const { return m_id; } size_t RawHeader::GetSize() const { return m_buffer.size(); } uint8_t * RawHeader::GetPointer() { return &m_buffer[0]; } void RawHeader::Resize(int32_t id, size_t newSize) { m_id = id; m_buffer.resize(newSize); } //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// void RawHeaders::Reset() { m_sps.Reset(); m_pps.Reset(); } RawHeader * RawHeaders::GetSPS() { return &m_sps; } RawHeader * RawHeaders::GetPPS() { return &m_pps; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// MFXTaskSupplier::MFXTaskSupplier() : TaskSupplier() { memset(&m_firstVideoParams, 0, sizeof(mfxVideoParam)); } MFXTaskSupplier::~MFXTaskSupplier() { Close(); } Status MFXTaskSupplier::Init(VideoDecoderParams *init) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXTaskSupplier::Init"); if (NULL == init) return UMC_ERR_NULL_PTR; Close(); m_initializationParams = *init; m_pMemoryAllocator = init->lpMemoryAllocator; m_DPBSizeEx = 0; m_sei_messages = new SEI_Storer(); m_sei_messages->Init(); int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); Status umcRes = SVC_Extension::Init(); if (UMC_OK != umcRes) { return umcRes; } switch (m_initializationParams.info.profile) // after MVC_Extension::Init() { case 0: m_decodingMode = UNKNOWN_DECODING_MODE; break; case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: m_decodingMode = MVC_DECODING_MODE; break; default: m_decodingMode = AVC_DECODING_MODE; break; } AU_Splitter::Init(); DPBOutput::Reset(m_iThreadNum != 1); // create slice decoder(s) m_pSegmentDecoder = new H264SegmentDecoderBase *[m_iThreadNum]; if (NULL == m_pSegmentDecoder) return UMC_ERR_ALLOC; memset(m_pSegmentDecoder, 0, sizeof(H264SegmentDecoderBase *) * m_iThreadNum); CreateTaskBroker(); m_pTaskBroker->Init(m_iThreadNum); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { if (UMC_OK != m_pSegmentDecoder[i]->Init(i)) return UMC_ERR_INIT; } m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } H264VideoDecoderParams *initH264 = DynamicCast (init); m_DPBSizeEx = m_iThreadNum + (initH264 ? initH264->m_bufferedFrames : 0); return UMC_OK; } void MFXTaskSupplier::Reset() { TaskSupplier::Reset(); m_Headers.Reset(); if (m_pTaskBroker) m_pTaskBroker->Init(m_iThreadNum); } bool MFXTaskSupplier::CheckDecoding(H264DecoderFrame * outputFrame) { ViewItem &view = GetView(outputFrame->m_viewId); if (!outputFrame->IsDecodingStarted()) return false; if (!outputFrame->IsDecodingCompleted()) return false; AutomaticUMCMutex guard(m_mGuard); int32_t count = 0; int32_t notDecoded = 0; for (H264DecoderFrame * pTmp = view.GetDPBList(0)->head(); pTmp; pTmp = pTmp->future()) { if (!pTmp->m_isShortTermRef[0] && !pTmp->m_isShortTermRef[1] && !pTmp->m_isLongTermRef[0] && !pTmp->m_isLongTermRef[1] && ((pTmp->m_wasOutputted != 0) || (pTmp->IsDecoded() == 0))) { count++; break; } if (!pTmp->IsDecoded() && !pTmp->IsDecodingCompleted() && pTmp->IsFullFrame()) notDecoded++; } if (count || (view.GetDPBList(0)->countAllFrames() < view.maxDecFrameBuffering + m_DPBSizeEx)) return true; if (!notDecoded) return true; return false; } mfxStatus MFXTaskSupplier::RunThread(mfxU32 threadNumber) { Status sts = m_pSegmentDecoder[threadNumber]->ProcessSegment(); if (sts == UMC_ERR_NOT_ENOUGH_DATA) return MFX_TASK_BUSY; else if(sts == UMC_ERR_DEVICE_FAILED) MFX_RETURN(MFX_ERR_DEVICE_FAILED) else if (sts == UMC_ERR_GPU_HANG) MFX_RETURN(MFX_ERR_GPU_HANG); if (sts != UMC_OK) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_TASK_WORKING; } bool MFXTaskSupplier::ProcessNonPairedField(H264DecoderFrame * pFrame) { if (pFrame && pFrame->GetAU(1)->GetStatus() == H264DecoderFrameInfo::STATUS_NOT_FILLED) { pFrame->setPicOrderCnt(pFrame->PicOrderCnt(0, 1), 1); pFrame->GetAU(1)->SetStatus(H264DecoderFrameInfo::STATUS_NONE); pFrame->m_bottom_field_flag[1] = !pFrame->m_bottom_field_flag[0]; H264Slice * pSlice = pFrame->GetAU(0)->GetSlice(0); assert(pSlice); if (!pSlice) return false; pFrame->setPicNum(pSlice->GetSliceHeader()->frame_num*2 + 1, 1); int32_t isBottom = pSlice->IsBottomField() ? 0 : 1; pFrame->SetErrorFlagged(isBottom ? ERROR_FRAME_BOTTOM_FIELD_ABSENT : ERROR_FRAME_TOP_FIELD_ABSENT); return true; } return false; } Status MFXTaskSupplier::CompleteFrame(H264DecoderFrame * pFrame, int32_t field) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXTaskSupplier::CompleteFrame"); if (!pFrame) return UMC_OK; H264DecoderFrameInfo * slicesInfo = pFrame->GetAU(field); if (slicesInfo->GetStatus() > H264DecoderFrameInfo::STATUS_NOT_FILLED) return UMC_OK; return TaskSupplier::CompleteFrame(pFrame, field); } void MFXTaskSupplier::SetVideoParams(mfxVideoParam * par) { m_firstVideoParams = *par; } Status MFXTaskSupplier::DecodeHeaders(NalUnit *nalUnit) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFXTaskSupplier::DecodeHeaders"); Status sts = TaskSupplier::DecodeHeaders(nalUnit); if (sts != UMC_OK) return sts; UMC_H264_DECODER::H264SeqParamSet * currSPS = m_Headers.m_SeqParams.GetCurrentHeader(); if (currSPS) { if (currSPS->chroma_format_idc > 2) throw h264_exception(UMC_ERR_UNSUPPORTED); switch (currSPS->profile_idc) { case H264VideoDecoderParams::H264_PROFILE_UNKNOWN: case H264VideoDecoderParams::H264_PROFILE_BASELINE: case H264VideoDecoderParams::H264_PROFILE_MAIN: case H264VideoDecoderParams::H264_PROFILE_EXTENDED: case H264VideoDecoderParams::H264_PROFILE_HIGH: case H264VideoDecoderParams::H264_PROFILE_HIGH10: case H264VideoDecoderParams::H264_PROFILE_HIGH422: case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: case H264VideoDecoderParams::H264_PROFILE_SCALABLE_BASELINE: case H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH: break; default: throw h264_exception(UMC_ERR_UNSUPPORTED); } DPBOutput::OnNewSps(currSPS); } { // save sps/pps uint32_t nal_unit_type = nalUnit->GetNalUnitType(); switch(nal_unit_type) { case NAL_UT_SPS: case NAL_UT_PPS: { static uint8_t start_code_prefix[] = {0, 0, 0, 1}; size_t size = nalUnit->GetDataSize(); bool isSPS = (nal_unit_type == NAL_UT_SPS); RawHeader * hdr = isSPS ? GetSPS() : GetPPS(); int32_t id = isSPS ? m_Headers.m_SeqParams.GetCurrentID() : m_Headers.m_PicParams.GetCurrentID(); hdr->Resize(id, size + sizeof(start_code_prefix)); MFX_INTERNAL_CPY(hdr->GetPointer(), start_code_prefix, sizeof(start_code_prefix)); MFX_INTERNAL_CPY(hdr->GetPointer() + sizeof(start_code_prefix), (uint8_t*)nalUnit->GetDataPointer(), (uint32_t)size); } break; } } if (nalUnit->GetNalUnitType() == NAL_UT_SPS && m_firstVideoParams.mfx.FrameInfo.Width) { currSPS = m_Headers.m_SeqParams.GetCurrentHeader(); if (currSPS) { if (m_firstVideoParams.mfx.FrameInfo.Width < (currSPS->frame_width_in_mbs * 16) || m_firstVideoParams.mfx.FrameInfo.Height < (currSPS->frame_height_in_mbs * 16) || (currSPS->level_idc && m_firstVideoParams.mfx.CodecLevel && m_firstVideoParams.mfx.CodecLevel < currSPS->level_idc)) { return UMC_NTF_NEW_RESOLUTION; } } return UMC_WRN_REPOSITION_INPROGRESS; } return UMC_OK; } Status MFXTaskSupplier::DecodeSEI(NalUnit *nalUnit) { H264HeadersBitstream bitStream; try { H264MemoryPiece mem; mem.SetData(nalUnit); H264MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem, DEFAULT_NU_HEADER_TAIL_VALUE); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NAL_Unit_Type nal_unit_type = NAL_UT_UNSPECIFIED; uint32_t nal_ref_idc = 0; bitStream.GetNALUnitType(nal_unit_type, nal_ref_idc); nalUnit->MoveDataPointer(1); // nal_unit_type - 8 bits do { UMC_H264_DECODER::H264SEIPayLoad m_SEIPayLoads; size_t decoded1 = bitStream.BytesDecoded(); bitStream.ParseSEI(m_Headers, &m_SEIPayLoads); if (m_SEIPayLoads.payLoadType == SEI_PIC_TIMING_TYPE) { DEBUG_PRINT((VM_STRING("debug headers SEI - %d, picstruct - %d\n"), m_SEIPayLoads.payLoadType, m_SEIPayLoads.SEI_messages.pic_timing.pic_struct)); } else { DEBUG_PRINT((VM_STRING("debug headers SEI - %d\n"), m_SEIPayLoads.payLoadType)); } if (m_SEIPayLoads.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { m_UserData = m_SEIPayLoads; } else { if (m_SEIPayLoads.payLoadType == SEI_RESERVED) continue; UMC_H264_DECODER::H264SEIPayLoad* payload = m_Headers.m_SEIParams.AddHeader(&m_SEIPayLoads); m_accessUnit.m_payloads.AddPayload(payload); } size_t decoded2 = bitStream.BytesDecoded(); // calculate payload size size_t size = decoded2 - decoded1; assert(size == m_SEIPayLoads.payLoadSize + 2 + (m_SEIPayLoads.payLoadSize / 255) + (m_SEIPayLoads.payLoadType / 255)); if (m_sei_messages) { MediaDataEx nalUnit1; size_t nal_u_size = size; for(uint8_t *ptr = (uint8_t*)nalUnit->GetDataPointer(); ptr < (uint8_t*)nalUnit->GetDataPointer() + nal_u_size; ptr++) if (ptr[0]==0 && ptr[1]==0 && ptr[2]==3) nal_u_size += 1; nalUnit1.SetBufferPointer((uint8_t*)nalUnit->GetDataPointer(), nal_u_size); nalUnit1.SetDataSize(nal_u_size); nalUnit->MoveDataPointer((int32_t)nal_u_size); m_sei_messages->AddMessage(&nalUnit1, m_SEIPayLoads.payLoadType, -1); } } while (bitStream.More_RBSP_Data()); } catch(...) { // nothing to do just catch it } return UMC_OK; } void MFXTaskSupplier::AddFakeReferenceFrame(H264Slice * ) { } } // namespace UMC #ifdef MFX_ENABLE_SVC_VIDEO_DECODE bool IsBaselineConstraints(mfxExtSVCSeqDesc * svcDesc) { bool isBaselineConstraints = true; for (uint32_t i = 0; i < sizeof(svcDesc->DependencyLayer)/sizeof(svcDesc->DependencyLayer[0]); i++) { if (svcDesc->DependencyLayer[i].Active) { if ((svcDesc->DependencyLayer[i].ScaledRefLayerOffsets[0] & 0xf) || (svcDesc->DependencyLayer[i].ScaledRefLayerOffsets[1] & 0xf)) { isBaselineConstraints = false; break; } uint32_t depD = svcDesc->DependencyLayer[i].RefLayerDid; if (depD >= 8) continue; if ( ! ((svcDesc->DependencyLayer[i].Width == svcDesc->DependencyLayer[depD].Width && svcDesc->DependencyLayer[i].Height == svcDesc->DependencyLayer[depD].Height) || (svcDesc->DependencyLayer[i].Width == 2*svcDesc->DependencyLayer[depD].Width && svcDesc->DependencyLayer[i].Height == 2*svcDesc->DependencyLayer[depD].Height) || (svcDesc->DependencyLayer[i].Width == (2*svcDesc->DependencyLayer[depD].Width)/3 && svcDesc->DependencyLayer[i].Height == (2*svcDesc->DependencyLayer[depD].Height)/3) )) { isBaselineConstraints = false; break; } } } return isBaselineConstraints; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE bool MFX_Utility::IsNeedPartialAcceleration(mfxVideoParam * par, eMFXHWType ) { if (!par) return false; if (par->mfx.SliceGroupsPresent) // Is FMO return true; if (par->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12) // yuv422 in SW only return true; if (par->mfx.FrameInfo.BitDepthLuma > 8 || par->mfx.FrameInfo.BitDepthChroma > 8) // yuv422 in SW only return true; mfxExtMVCSeqDesc * points = (mfxExtMVCSeqDesc*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (points && points->NumRefsTotal > 16) return true; return false; } eMFXPlatform MFX_Utility::GetPlatform(VideoCORE * core, mfxVideoParam * par) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFX_Utility::GetPlatform"); eMFXPlatform platform = core->GetPlatformType(); if (!par) return platform; eMFXHWType typeHW = MFX_HW_UNKNOWN; typeHW = core->GetHWType(); if (par && IsNeedPartialAcceleration(par, typeHW) && platform != MFX_PLATFORM_SOFTWARE) { return MFX_PLATFORM_SOFTWARE; } GUID name = sDXVA2_ModeH264_VLD_NoFGT; if (MFX_ERR_NONE != core->IsGuidSupported(name, par) && platform != MFX_PLATFORM_SOFTWARE) { return MFX_PLATFORM_SOFTWARE; } return platform; } UMC::Status MFX_Utility::FillVideoParam(UMC::TaskSupplier * supplier, mfxVideoParam *par, bool full) { const UMC_H264_DECODER::H264SeqParamSet * seq = supplier->GetHeaders()->m_SeqParams.GetCurrentHeader(); if (!seq) return UMC::UMC_ERR_FAILED; if (UMC::FillVideoParam(seq, par, full) != UMC::UMC_OK) return UMC::UMC_ERR_FAILED; const UMC_H264_DECODER::H264PicParamSet * pps = supplier->GetHeaders()->m_PicParams.GetCurrentHeader(); if (pps) par->mfx.SliceGroupsPresent = pps->num_slice_groups > 1; return UMC::UMC_OK; } static inline bool IsFieldOfOneFrame(UMC::H264Slice * pSlice1, UMC::H264Slice *pSlice2) { if (!pSlice2 || !pSlice1) return true; if ((pSlice1->GetSliceHeader()->nal_ref_idc && !pSlice2->GetSliceHeader()->nal_ref_idc) || (!pSlice1->GetSliceHeader()->nal_ref_idc && pSlice2->GetSliceHeader()->nal_ref_idc)) return false; if (pSlice1->GetSliceHeader()->field_pic_flag != pSlice2->GetSliceHeader()->field_pic_flag) return false; if (pSlice1->GetSliceHeader()->bottom_field_flag == pSlice2->GetSliceHeader()->bottom_field_flag) return false; return true; } class PosibleMVC { public: PosibleMVC(UMC::TaskSupplier * supplier); virtual ~PosibleMVC(); virtual UMC::Status DecodeHeader(UMC::MediaData* params, mfxBitstream *bs, mfxVideoParam *out); virtual UMC::Status ProcessNalUnit(UMC::MediaData * data, mfxBitstream *bs); virtual bool IsEnough() const; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc * GetSVCSeqDesc(); #endif protected: bool m_isSPSFound; bool m_isPPSFound; bool m_isSubSPSFound; bool m_isFrameLooked; bool m_isSVC_SEIFound; bool m_isMVCBuffer; bool m_isSVCBuffer; bool IsAVCEnough() const; bool isMVCRequered() const; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc m_svcSeqDesc; #endif UMC::TaskSupplier * m_supplier; UMC::H264Slice * m_lastSlice; }; PosibleMVC::PosibleMVC(UMC::TaskSupplier * supplier) : m_isSPSFound(false) , m_isPPSFound(false) , m_isSubSPSFound(false) , m_isFrameLooked(false) , m_isSVC_SEIFound(false) , m_isMVCBuffer(false) , m_isSVCBuffer(false) , m_supplier(supplier) , m_lastSlice(0) { #ifdef MFX_ENABLE_SVC_VIDEO_DECODE m_svcSeqDesc.RefBaseDist = 0; #endif } PosibleMVC::~PosibleMVC() { if (m_lastSlice) m_lastSlice->DecrementReference(); } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc* PosibleMVC::GetSVCSeqDesc() { return &m_svcSeqDesc; } #endif bool PosibleMVC::IsEnough() const { return m_isSPSFound && m_isPPSFound && m_isSubSPSFound && m_isFrameLooked; } bool PosibleMVC::IsAVCEnough() const { return m_isSPSFound && m_isPPSFound; } bool PosibleMVC::isMVCRequered() const { return m_isMVCBuffer || m_isSVCBuffer; } UMC::Status PosibleMVC::DecodeHeader(UMC::MediaData * data, mfxBitstream *bs, mfxVideoParam *out) { if (!data) return UMC::UMC_ERR_NULL_PTR; m_isMVCBuffer = GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC) != 0; #ifdef MFX_ENABLE_SVC_VIDEO_DECODE m_isSVCBuffer = GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC) != 0; memset(&m_svcSeqDesc, 0, sizeof(m_svcSeqDesc)); #endif if (isMVCRequered()) { m_isFrameLooked = !m_isSVCBuffer; } else { m_isSubSPSFound = true; // do not need to find it } m_lastSlice = 0; struct sps_heap_obj { UMC_H264_DECODER::H264SeqParamSet* obj; sps_heap_obj() : obj(0) {} ~sps_heap_obj() { if (obj) obj->DecrementReference(); } void set(UMC_H264_DECODER::H264SeqParamSet* sps) { if(sps) { obj = sps; obj->IncrementReference();} } } first_sps; UMC::Status umcRes = UMC::UMC_ERR_NOT_ENOUGH_DATA; for ( ; data->GetDataSize() > 3; ) { m_supplier->GetNalUnitSplitter()->MoveToStartCode(data); // move data pointer to start code if (!m_isSPSFound && !m_isSVC_SEIFound) // move point to first start code { bs->DataOffset = (mfxU32)((mfxU8*)data->GetDataPointer() - (mfxU8*)data->GetBufferPointer()); bs->DataLength = (mfxU32)data->GetDataSize(); } umcRes = ProcessNalUnit(data, bs); if (umcRes == UMC::UMC_ERR_UNSUPPORTED) umcRes = UMC::UMC_OK; if (umcRes != UMC::UMC_OK) break; if (!first_sps.obj && m_isSPSFound) first_sps.set(m_supplier->GetHeaders()->m_SeqParams.GetCurrentHeader()); if (IsEnough()) break; } if (umcRes == UMC::UMC_ERR_SYNC) // move pointer { bs->DataOffset = (mfxU32)((mfxU8*)data->GetDataPointer() - (mfxU8*)data->GetBufferPointer()); bs->DataLength = (mfxU32)data->GetDataSize(); return UMC::UMC_ERR_NOT_ENOUGH_DATA; } if (!m_isFrameLooked && ((data->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) == 0)) m_isFrameLooked = true; if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA) { bool isEOS = ((data->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_END_OF_STREAM) != 0) || ((data->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) == 0); if (isEOS) { return UMC::UMC_OK; } } if (!isMVCRequered()) { m_isSubSPSFound = true; m_isFrameLooked = true; } if (IsEnough()) { assert(first_sps.obj && "Current SPS should be valid when [m_isSPSFound]"); UMC_H264_DECODER::H264SeqParamSet* last_sps = m_supplier->GetHeaders()->m_SeqParams.GetCurrentHeader(); if (first_sps.obj && first_sps.obj != last_sps) m_supplier->GetHeaders()->m_SeqParams.AddHeader(first_sps.obj); return UMC::UMC_OK; } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } UMC::Status PosibleMVC::ProcessNalUnit(UMC::MediaData * data, mfxBitstream * bs) { mfxExtDecodeErrorReport * pDecodeErrorReport = (mfxExtDecodeErrorReport*)GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT); try { int32_t startCode = m_supplier->GetNalUnitSplitter()->CheckNalUnitType(data); bool needProcess = false; UMC::NalUnit *nalUnit = m_supplier->GetNalUnit(data); switch ((UMC::NAL_Unit_Type)startCode) { case UMC::NAL_UT_IDR_SLICE: case UMC::NAL_UT_SLICE: case UMC::NAL_UT_AUXILIARY: case UMC::NAL_UT_CODED_SLICE_EXTENSION: { if (IsAVCEnough()) { if (!isMVCRequered()) { m_isFrameLooked = true; return UMC::UMC_OK; } } else break; // skip nal unit if (!nalUnit) { return UMC::UMC_ERR_NOT_ENOUGH_DATA; } int32_t sps_id = m_supplier->GetHeaders()->m_SeqParams.GetCurrentID(); int32_t sps_mvc_id = m_supplier->GetHeaders()->m_SeqParamsMvcExt.GetCurrentID(); int32_t sps_svc_id = m_supplier->GetHeaders()->m_SeqParamsSvcExt.GetCurrentID(); int32_t sps_pps_id = m_supplier->GetHeaders()->m_PicParams.GetCurrentID(); UMC::H264Slice * pSlice = m_supplier->DecodeSliceHeader(nalUnit); if (pSlice) { if (!m_lastSlice) { m_lastSlice = pSlice; m_lastSlice->Release(); return UMC::UMC_OK; } if ((false == IsPictureTheSame(m_lastSlice, pSlice))) { if (!IsFieldOfOneFrame(pSlice, m_lastSlice)) { m_supplier->GetHeaders()->m_SeqParams.SetCurrentID(sps_id); m_supplier->GetHeaders()->m_SeqParamsMvcExt.SetCurrentID(sps_mvc_id); m_supplier->GetHeaders()->m_SeqParamsSvcExt.SetCurrentID(sps_svc_id); m_supplier->GetHeaders()->m_PicParams.SetCurrentID(sps_pps_id); pSlice->Release(); pSlice->DecrementReference(); m_isFrameLooked = true; return UMC::UMC_OK; } } pSlice->Release(); m_lastSlice->DecrementReference(); m_lastSlice = pSlice; return UMC::UMC_OK; } } break; case UMC::NAL_UT_SPS: needProcess = true; break; case UMC::NAL_UT_PPS: needProcess = true; break; case UMC::NAL_UT_SUBSET_SPS: needProcess = true; break; case UMC::NAL_UT_AUD: //if (header_was_started) //quite = true; break; case UMC::NAL_UT_SEI: // SVC scalable SEI can be before SPS/PPS case UMC::NAL_UT_PREFIX: needProcess = true; break; case UMC::NAL_UT_UNSPECIFIED: case UMC::NAL_UT_DPA: case UMC::NAL_UT_DPB: case UMC::NAL_UT_DPC: case UMC::NAL_UT_END_OF_SEQ: case UMC::NAL_UT_END_OF_STREAM: case UMC::NAL_UT_FD: case UMC::NAL_UT_SPS_EX: default: break; }; if (!nalUnit) { return UMC::UMC_ERR_NOT_ENOUGH_DATA; } if (needProcess) { try { UMC::Status umcRes = m_supplier->ProcessNalUnit(nalUnit, pDecodeErrorReport); if (umcRes < UMC::UMC_OK) { return UMC::UMC_OK; } } catch(UMC::h264_exception &ex) { if (ex.GetStatus() != UMC::UMC_ERR_UNSUPPORTED) { throw; } } switch ((UMC::NAL_Unit_Type)startCode) { case UMC::NAL_UT_SPS: m_isSPSFound = true; break; case UMC::NAL_UT_PPS: m_isPPSFound = true; break; case UMC::NAL_UT_SUBSET_SPS: m_isSubSPSFound = true; break; case UMC::NAL_UT_SEI: // SVC scalable SEI can be before SPS/PPS case UMC::NAL_UT_PREFIX: if (!m_isSVC_SEIFound) { const UMC_H264_DECODER::H264SEIPayLoad * svcPayload = m_supplier->GetHeaders()->m_SEIParams.GetHeader(UMC::SEI_SCALABILITY_INFO); m_isSVC_SEIFound = svcPayload != 0; } break; case UMC::NAL_UT_UNSPECIFIED: case UMC::NAL_UT_SLICE: case UMC::NAL_UT_IDR_SLICE: case UMC::NAL_UT_AUD: case UMC::NAL_UT_DPA: case UMC::NAL_UT_DPB: case UMC::NAL_UT_DPC: case UMC::NAL_UT_END_OF_SEQ: case UMC::NAL_UT_END_OF_STREAM: case UMC::NAL_UT_FD: case UMC::NAL_UT_SPS_EX: case UMC::NAL_UT_AUXILIARY: case UMC::NAL_UT_CODED_SLICE_EXTENSION: default: break; }; return UMC::UMC_OK; } } catch(const UMC::h264_exception & ex) { return ex.GetStatus(); } return UMC::UMC_OK; } UMC::Status MFX_Utility::DecodeHeader(UMC::TaskSupplier * supplier, UMC::H264VideoDecoderParams* lpInfo, mfxBitstream *bs, mfxVideoParam *out) { UMC::Status umcRes = UMC::UMC_OK; if (!lpInfo->m_pData) return UMC::UMC_ERR_NULL_PTR; if (!lpInfo->m_pData->GetDataSize()) return UMC::UMC_ERR_NOT_ENOUGH_DATA; lpInfo->m_ignore_level_constrain = out->mfx.IgnoreLevelConstrain; umcRes = supplier->PreInit(lpInfo); if (umcRes != UMC::UMC_OK) return UMC::UMC_ERR_FAILED; PosibleMVC headersDecoder(supplier); umcRes = headersDecoder.DecodeHeader(lpInfo->m_pData, bs, out); if (umcRes != UMC::UMC_OK) return umcRes; umcRes = supplier->GetInfo(lpInfo); if (umcRes == UMC::UMC_OK) { #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc *svcSeqDescInput = (mfxExtSVCSeqDesc *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); if (svcSeqDescInput) { MFX_INTERNAL_CPY(svcSeqDescInput->DependencyLayer, &headersDecoder.GetSVCSeqDesc()->DependencyLayer, sizeof(headersDecoder.GetSVCSeqDesc()->DependencyLayer)); MFX_INTERNAL_CPY(svcSeqDescInput->TemporalScale, &headersDecoder.GetSVCSeqDesc()->TemporalScale, sizeof(headersDecoder.GetSVCSeqDesc()->TemporalScale)); } #endif FillVideoParam(supplier, out, false); } else { } return umcRes; } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE UMC::Status FillVideoParamSVC(mfxExtSVCSeqDesc *seqDesc, const UMC_H264_DECODER::H264SEIPayLoad * svcPayload) { if (!seqDesc || !svcPayload || svcPayload->payLoadType != UMC::SEI_SCALABILITY_INFO || !svcPayload->user_data.size()) return UMC::UMC_OK; uint32_t currentLayer = 0; UMC_H264_DECODER::scalability_layer_info* layers = (UMC_H264_DECODER::scalability_layer_info*)&svcPayload->user_data[0]; if (!layers) return UMC::UMC_OK; for (uint32_t i = 0; i < svcPayload->SEI_messages.scalability_info.num_layers; i++) { currentLayer = layers[i].dependency_id; seqDesc->DependencyLayer[currentLayer].Active = 1; if (!seqDesc->DependencyLayer[currentLayer].Width && layers[i].frm_width_in_mbs) { seqDesc->DependencyLayer[currentLayer].Width = (mfxU16)(layers[i].frm_width_in_mbs * 16); seqDesc->DependencyLayer[currentLayer].Height = (mfxU16)(layers[i].frm_height_in_mbs * 16); } if (layers[i].quality_id + 1 > seqDesc->DependencyLayer[currentLayer].QualityNum) { seqDesc->DependencyLayer[currentLayer].QualityNum = layers[i].quality_id + 1; } bool isTempFound = false; for (uint32_t temp = 0; temp < seqDesc->DependencyLayer[currentLayer].TemporalNum; temp++) { if (layers[i].temporal_id == seqDesc->DependencyLayer[currentLayer].TemporalId[temp]) { isTempFound = true; break; } } if (!isTempFound) { uint32_t tempNum = seqDesc->DependencyLayer[currentLayer].TemporalNum; seqDesc->DependencyLayer[currentLayer].TemporalId[tempNum] = layers[i].temporal_id; seqDesc->DependencyLayer[currentLayer].TemporalNum++; } } return UMC::UMC_OK; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE UMC::Status MFX_Utility::FillVideoParamMVCEx(UMC::TaskSupplier * supplier, ::mfxVideoParam *par) { #ifdef MFX_ENABLE_SVC_VIDEO_DECODE const UMC_H264_DECODER::H264SeqParamSetSVCExtension * seqSVC = supplier->GetHeaders()->m_SeqParamsSvcExt.GetCurrentHeader(); if (seqSVC) { const UMC_H264_DECODER::H264SEIPayLoad * svcPayload = supplier->GetHeaders()->m_SEIParams.GetHeader(UMC::SEI_SCALABILITY_INFO); mfxExtSVCSeqDesc *svcSeqDesc = (mfxExtSVCSeqDesc *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); UMC::Status sts = FillVideoParamSVC(svcSeqDesc, svcPayload); if (sts != UMC::UMC_OK) return sts; UMC::FillVideoParam(seqSVC, par, true); return UMC::UMC_OK; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE const UMC_H264_DECODER::H264SeqParamSetMVCExtension * seqMVC = supplier->GetHeaders()->m_SeqParamsMvcExt.GetCurrentHeader(); mfxExtMVCSeqDesc * points = (mfxExtMVCSeqDesc*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (!seqMVC) return UMC::UMC_OK; par->mfx.CodecProfile = seqMVC->profile_idc; par->mfx.CodecLevel = (mfxU16)supplier->GetLevelIDC(); mfxU16 maxDecPicBuffering = seqMVC->vui.bitstream_restriction_flag ? seqMVC->vui.max_dec_frame_buffering : 0;; if (par->mfx.MaxDecFrameBuffering && maxDecPicBuffering) par->mfx.MaxDecFrameBuffering = std::max(maxDecPicBuffering, par->mfx.MaxDecFrameBuffering); if (!points) return UMC::UMC_OK; uint32_t numRefFrames = (seqMVC->num_ref_frames + 1) * (seqMVC->num_views_minus1 + 1); points->NumRefsTotal = (mfxU16)numRefFrames; UMC::Status sts = FillVideoParamExtension(seqMVC, par); par->mfx.CodecProfile = seqMVC->profile_idc; par->mfx.CodecLevel = (mfxU16)supplier->GetLevelIDC(); return sts; } void CheckCrops(const mfxFrameInfo &in, mfxFrameInfo &out, mfxStatus & sts) { mfxU32 maskW = 1; mfxU32 maskH = 1; if (in.ChromaFormat >= MFX_CHROMAFORMAT_MONOCHROME && in.ChromaFormat <= MFX_CHROMAFORMAT_YUV444) { maskW = UMC::SubWidthC[in.ChromaFormat]; maskH = UMC::SubHeightC[in.ChromaFormat]; if (in.PicStruct != MFX_PICSTRUCT_PROGRESSIVE) maskH <<= 1; } maskW--; maskH--; out.CropX = in.CropX; out.CropY = in.CropY; out.CropW = in.CropW; out.CropH = in.CropH; if ((in.CropX & maskW) || in.CropX + in.CropW > in.Width) out.CropX = 0; if ((in.CropY & maskH) || in.CropY + in.CropH > in.Height) out.CropY = 0; if ((in.CropW & maskW) || in.CropX + in.CropW > in.Width) out.CropW = 0; if ((in.CropH & maskH) || in.CropY + in.CropH > in.Height) out.CropH = 0; if (out.CropX != in.CropX || out.CropY != in.CropY || out.CropW != in.CropW || out.CropH != in.CropH) sts = MFX_ERR_UNSUPPORTED; } template void CheckDimensions(T &info_in, T &info_out, mfxStatus & sts) { if (info_in.Width % 16 == 0 && info_in.Width <= 16384) info_out.Width = info_in.Width; else { info_out.Width = 0; sts = MFX_ERR_UNSUPPORTED; } if (info_in.Height % 16 == 0 && info_in.Height <= 16384) info_out.Height = info_in.Height; else { info_out.Height = 0; sts = MFX_ERR_UNSUPPORTED; } if ((info_in.Width || info_in.Height) && !(info_in.Width && info_in.Height)) { info_out.Width = 0; info_out.Height = 0; sts = MFX_ERR_UNSUPPORTED; } } mfxStatus MFX_Utility::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MFX_Utility::Query"); MFX_CHECK_NULL_PTR1(out); mfxStatus sts = MFX_ERR_NONE; if (in == out) { mfxVideoParam in1; MFX_INTERNAL_CPY(&in1, in, sizeof(mfxVideoParam)); return MFX_Utility::Query(core, &in1, out, type); } memset(&out->mfx, 0, sizeof(mfxInfoMFX)); if (in) { out->mfx.MaxDecFrameBuffering = in->mfx.MaxDecFrameBuffering; if (in->mfx.CodecId == MFX_CODEC_AVC) out->mfx.CodecId = in->mfx.CodecId; if ((MFX_PROFILE_UNKNOWN == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_BASELINE == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_MAIN == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_HIGH == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_EXTENDED == in->mfx.CodecProfile) || #ifdef MFX_ENABLE_SVC_VIDEO_DECODE (MFX_PROFILE_AVC_SCALABLE_BASELINE == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_SCALABLE_HIGH == in->mfx.CodecProfile) || #endif (MFX_PROFILE_AVC_MULTIVIEW_HIGH == in->mfx.CodecProfile) || (MFX_PROFILE_AVC_STEREO_HIGH == in->mfx.CodecProfile) ) out->mfx.CodecProfile = in->mfx.CodecProfile; else { sts = MFX_ERR_UNSUPPORTED; } if (core->GetVAType() == MFX_HW_VAAPI) { int codecProfile = in->mfx.CodecProfile & 0xFF; if ( (codecProfile == MFX_PROFILE_AVC_STEREO_HIGH) || (codecProfile == MFX_PROFILE_AVC_MULTIVIEW_HIGH)) MFX_RETURN(MFX_ERR_UNSUPPORTED); #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if ( (codecProfile == MFX_PROFILE_AVC_SCALABLE_BASELINE) || (codecProfile == MFX_PROFILE_AVC_SCALABLE_HIGH) ) MFX_RETURN(MFX_ERR_UNSUPPORTED); #endif } out->mfx.IgnoreLevelConstrain = in->mfx.IgnoreLevelConstrain; switch (in->mfx.CodecLevel) { case MFX_LEVEL_UNKNOWN: case MFX_LEVEL_AVC_1: case MFX_LEVEL_AVC_1b: case MFX_LEVEL_AVC_11: case MFX_LEVEL_AVC_12: case MFX_LEVEL_AVC_13: case MFX_LEVEL_AVC_2: case MFX_LEVEL_AVC_21: case MFX_LEVEL_AVC_22: case MFX_LEVEL_AVC_3: case MFX_LEVEL_AVC_31: case MFX_LEVEL_AVC_32: case MFX_LEVEL_AVC_4: case MFX_LEVEL_AVC_41: case MFX_LEVEL_AVC_42: case MFX_LEVEL_AVC_5: case MFX_LEVEL_AVC_51: case MFX_LEVEL_AVC_52: case MFX_LEVEL_AVC_6: case MFX_LEVEL_AVC_61: case MFX_LEVEL_AVC_62: out->mfx.CodecLevel = in->mfx.CodecLevel; break; default: sts = MFX_ERR_UNSUPPORTED; break; } if (in->mfx.NumThread < 128) { out->mfx.NumThread = in->mfx.NumThread; } else { sts = MFX_ERR_UNSUPPORTED; } out->AsyncDepth = in->AsyncDepth; out->mfx.DecodedOrder = in->mfx.DecodedOrder; if (in->mfx.DecodedOrder > 1) { sts = MFX_ERR_UNSUPPORTED; out->mfx.DecodedOrder = 0; } if (in->mfx.SliceGroupsPresent) { if (in->mfx.SliceGroupsPresent == 1) out->mfx.SliceGroupsPresent = in->mfx.SliceGroupsPresent; else sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.TimeStampCalc) { if (in->mfx.TimeStampCalc == 1) in->mfx.TimeStampCalc = out->mfx.TimeStampCalc; else sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.ExtendedPicStruct) { if (in->mfx.ExtendedPicStruct == 1) in->mfx.ExtendedPicStruct = out->mfx.ExtendedPicStruct; else sts = MFX_ERR_UNSUPPORTED; } if (in->IOPattern) { if ( in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY || in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY ) out->IOPattern = in->IOPattern; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } if (in->mfx.FrameInfo.FourCC) { if (in->mfx.FrameInfo.FourCC == MFX_FOURCC_NV12) out->mfx.FrameInfo.FourCC = in->mfx.FrameInfo.FourCC; else sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV420 || in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV400 || in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV422) out->mfx.FrameInfo.ChromaFormat = in->mfx.FrameInfo.ChromaFormat; else sts = MFX_ERR_UNSUPPORTED; CheckDimensions(in->mfx.FrameInfo, out->mfx.FrameInfo, sts); CheckCrops(in->mfx.FrameInfo, out->mfx.FrameInfo, sts); out->mfx.FrameInfo.FrameRateExtN = in->mfx.FrameInfo.FrameRateExtN; out->mfx.FrameInfo.FrameRateExtD = in->mfx.FrameInfo.FrameRateExtD; if ((in->mfx.FrameInfo.FrameRateExtN || in->mfx.FrameInfo.FrameRateExtD) && !(in->mfx.FrameInfo.FrameRateExtN && in->mfx.FrameInfo.FrameRateExtD)) { out->mfx.FrameInfo.FrameRateExtN = 0; out->mfx.FrameInfo.FrameRateExtD = 0; sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.AspectRatioW = in->mfx.FrameInfo.AspectRatioW; out->mfx.FrameInfo.AspectRatioH = in->mfx.FrameInfo.AspectRatioH; if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) { out->mfx.FrameInfo.AspectRatioW = 0; out->mfx.FrameInfo.AspectRatioH = 0; sts = MFX_ERR_UNSUPPORTED; } switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: case MFX_PICSTRUCT_FIELD_REPEATED: case MFX_PICSTRUCT_FRAME_DOUBLING: case MFX_PICSTRUCT_FRAME_TRIPLING: out->mfx.FrameInfo.PicStruct = in->mfx.FrameInfo.PicStruct; break; default: sts = MFX_ERR_UNSUPPORTED; break; } mfxStatus stsExt = CheckDecodersExtendedBuffers(in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; if (in->Protected) { out->Protected = in->Protected; if (type == MFX_HW_UNKNOWN) { sts = MFX_ERR_UNSUPPORTED; out->Protected = 0; } if (!IS_PROTECTION_ANY(in->Protected)) { sts = MFX_ERR_UNSUPPORTED; out->Protected = 0; } if (!(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) { out->IOPattern = 0; sts = MFX_ERR_UNSUPPORTED; } } mfxExtMVCSeqDesc * mvcPointsIn = (mfxExtMVCSeqDesc *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); mfxExtMVCSeqDesc * mvcPointsOut = (mfxExtMVCSeqDesc *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (mvcPointsIn && mvcPointsOut) { if (mvcPointsIn->NumView <= UMC::H264_MAX_NUM_VIEW && mvcPointsIn->NumView <= mvcPointsIn->NumViewAlloc && mvcPointsOut->NumViewAlloc >= mvcPointsIn->NumView) { mvcPointsOut->NumView = mvcPointsIn->NumView; for (uint32_t i = 0; i < mvcPointsIn->NumView; i++) { if (mvcPointsIn->View[i].ViewId >= UMC::H264_MAX_NUM_VIEW) continue; mvcPointsOut->View[i].ViewId = mvcPointsIn->View[i].ViewId; if (mvcPointsIn->View[i].NumAnchorRefsL0 <= UMC::H264_MAX_NUM_VIEW_REF) { mvcPointsOut->View[i].NumAnchorRefsL0 = mvcPointsIn->View[i].NumAnchorRefsL0; MFX_INTERNAL_CPY(mvcPointsOut->View[i].AnchorRefL0, mvcPointsIn->View[i].AnchorRefL0, sizeof(mvcPointsIn->View[i].AnchorRefL0)); } else sts = MFX_ERR_UNSUPPORTED; if (mvcPointsIn->View[i].NumAnchorRefsL1 <= UMC::H264_MAX_NUM_VIEW_REF) { mvcPointsOut->View[i].NumAnchorRefsL1 = mvcPointsIn->View[i].NumAnchorRefsL1; MFX_INTERNAL_CPY(mvcPointsOut->View[i].AnchorRefL1, mvcPointsIn->View[i].AnchorRefL1, sizeof(mvcPointsIn->View[i].AnchorRefL1)); } else sts = MFX_ERR_UNSUPPORTED; if (mvcPointsIn->View[i].NumNonAnchorRefsL0 <= UMC::H264_MAX_NUM_VIEW_REF) { mvcPointsOut->View[i].NumNonAnchorRefsL0 = mvcPointsIn->View[i].NumNonAnchorRefsL0; MFX_INTERNAL_CPY(mvcPointsOut->View[i].NonAnchorRefL0, mvcPointsIn->View[i].NonAnchorRefL0, sizeof(mvcPointsIn->View[i].NonAnchorRefL0)); } else sts = MFX_ERR_UNSUPPORTED; if (mvcPointsIn->View[i].NumNonAnchorRefsL1 <= UMC::H264_MAX_NUM_VIEW_REF) { mvcPointsOut->View[i].NumNonAnchorRefsL1 = mvcPointsIn->View[i].NumNonAnchorRefsL1; MFX_INTERNAL_CPY(mvcPointsOut->View[i].NonAnchorRefL1, mvcPointsIn->View[i].NonAnchorRefL1, sizeof(mvcPointsIn->View[i].NonAnchorRefL1)); } else sts = MFX_ERR_UNSUPPORTED; } } if (mvcPointsIn->NumOP <= mvcPointsIn->NumOPAlloc && mvcPointsOut->NumOPAlloc >= mvcPointsIn->NumOP && mvcPointsIn->NumViewId <= mvcPointsIn->NumViewIdAlloc && mvcPointsOut->NumViewIdAlloc >= mvcPointsIn->NumViewId) { mfxU16 * targetViews = mvcPointsOut->ViewId; mvcPointsOut->NumOP = mvcPointsIn->NumOP; for (uint32_t i = 0; i < mvcPointsIn->NumOP; i++) { if (mvcPointsIn->OP[i].TemporalId <= 7) mvcPointsOut->OP[i].TemporalId = mvcPointsIn->OP[i].TemporalId; else sts = MFX_ERR_UNSUPPORTED; switch (mvcPointsIn->OP[i].LevelIdc) { case MFX_LEVEL_UNKNOWN: case MFX_LEVEL_AVC_1: case MFX_LEVEL_AVC_1b: case MFX_LEVEL_AVC_11: case MFX_LEVEL_AVC_12: case MFX_LEVEL_AVC_13: case MFX_LEVEL_AVC_2: case MFX_LEVEL_AVC_21: case MFX_LEVEL_AVC_22: case MFX_LEVEL_AVC_3: case MFX_LEVEL_AVC_31: case MFX_LEVEL_AVC_32: case MFX_LEVEL_AVC_4: case MFX_LEVEL_AVC_41: case MFX_LEVEL_AVC_42: case MFX_LEVEL_AVC_5: case MFX_LEVEL_AVC_51: case MFX_LEVEL_AVC_52: case MFX_LEVEL_AVC_6: case MFX_LEVEL_AVC_61: case MFX_LEVEL_AVC_62: mvcPointsOut->OP[i].LevelIdc = mvcPointsIn->OP[i].LevelIdc; break; default: sts = MFX_ERR_UNSUPPORTED; } if (mvcPointsIn->OP[i].NumViews <= UMC::H264_MAX_NUM_VIEW) mvcPointsOut->OP[i].NumViews = mvcPointsIn->OP[i].NumViews; else sts = MFX_ERR_UNSUPPORTED; if (mvcPointsIn->OP[i].NumTargetViews <= mvcPointsIn->OP[i].NumViews && mvcPointsIn->OP[i].NumTargetViews <= UMC::H264_MAX_NUM_VIEW) { mvcPointsOut->OP[i].TargetViewId = targetViews; mvcPointsOut->OP[i].NumTargetViews = mvcPointsIn->OP[i].NumTargetViews; for (uint32_t j = 0; j < mvcPointsIn->OP[i].NumTargetViews; j++) { if (mvcPointsIn->OP[i].TargetViewId[j] <= UMC::H264_MAX_NUM_VIEW) mvcPointsOut->OP[i].TargetViewId[j] = mvcPointsIn->OP[i].TargetViewId[j]; else sts = MFX_ERR_UNSUPPORTED; } targetViews += mvcPointsIn->OP[i].NumTargetViews; } } } //if (mvcPointsIn->CompatibilityMode > 0 && mvcPointsIn->CompatibilityMode < 2) // mvcPointsOut->CompatibilityMode = mvcPointsIn->CompatibilityMode; } else { if (mvcPointsIn || mvcPointsOut) { sts = MFX_ERR_UNDEFINED_BEHAVIOR; } } mfxExtMVCTargetViews * targetViewsIn = (mfxExtMVCTargetViews *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); mfxExtMVCTargetViews * targetViewsOut = (mfxExtMVCTargetViews *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (targetViewsIn && targetViewsOut) { if (targetViewsIn->TemporalId <= 7) targetViewsOut->TemporalId = targetViewsIn->TemporalId; else sts = MFX_ERR_UNSUPPORTED; if (targetViewsIn->NumView <= 1024) targetViewsOut->NumView = targetViewsIn->NumView; else sts = MFX_ERR_UNSUPPORTED; MFX_INTERNAL_CPY(targetViewsOut->ViewId, targetViewsIn->ViewId, sizeof(targetViewsIn->ViewId)); } else { if (targetViewsIn || targetViewsOut) { sts = MFX_ERR_UNDEFINED_BEHAVIOR; } } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSVCSeqDesc * svcDescIn = (mfxExtSVCSeqDesc *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); mfxExtSVCSeqDesc * svcDescOut = (mfxExtSVCSeqDesc *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); if (svcDescIn && svcDescOut) { MFX_INTERNAL_CPY(svcDescOut, svcDescIn, sizeof(mfxExtSVCSeqDesc)); for (uint32_t layer = 0; layer < sizeof(svcDescIn->DependencyLayer)/sizeof(svcDescIn->DependencyLayer[0]); layer++) { CheckDimensions(svcDescIn->DependencyLayer[layer], svcDescOut->DependencyLayer[layer], sts); if (svcDescIn->DependencyLayer[layer].TemporalNum > 7) { svcDescOut->DependencyLayer[layer].TemporalNum = 0; memset(svcDescOut->DependencyLayer[layer].TemporalId, 0, sizeof(svcDescOut->DependencyLayer[layer].TemporalId)); sts = MFX_ERR_UNSUPPORTED; } if (svcDescIn->DependencyLayer[layer].QualityNum > 15) { svcDescOut->DependencyLayer[layer].QualityNum = 0; sts = MFX_ERR_UNSUPPORTED; } if (svcDescOut->DependencyLayer[layer].TemporalNum) { typedef std::vector TemporalIDList; TemporalIDList vec(svcDescIn->DependencyLayer[layer].TemporalId, svcDescIn->DependencyLayer[layer].TemporalId + svcDescOut->DependencyLayer[layer].TemporalNum); std::sort(vec.begin(), vec.end()); TemporalIDList::iterator end_iter = std::adjacent_find(vec.begin(), vec.end()); if (end_iter != vec.end()) { svcDescOut->DependencyLayer[layer].TemporalNum = 0; memset(svcDescOut->DependencyLayer[layer].TemporalId, 0, sizeof(svcDescOut->DependencyLayer[layer].TemporalId)); sts = MFX_ERR_UNSUPPORTED; } } } } else { if (svcDescIn || svcDescOut) { sts = MFX_ERR_UNDEFINED_BEHAVIOR; } } mfxExtSvcTargetLayer * svcTargetIn = (mfxExtSvcTargetLayer *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); mfxExtSvcTargetLayer * svcTargetOut = (mfxExtSvcTargetLayer *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (svcTargetIn && svcTargetOut) { if (svcTargetIn->TargetDependencyID <= 7) { svcTargetOut->TargetDependencyID = svcTargetIn->TargetDependencyID; if (svcDescOut && !svcDescOut->DependencyLayer[svcTargetOut->TargetDependencyID].Active) { svcTargetOut->TargetDependencyID = 0; sts = MFX_ERR_INVALID_VIDEO_PARAM; } } else sts = MFX_ERR_UNSUPPORTED; if (svcTargetIn->TargetQualityID <= 15) svcTargetOut->TargetQualityID = svcTargetIn->TargetQualityID; else sts = MFX_ERR_UNSUPPORTED; if (svcTargetIn->TargetTemporalID <= 7) svcTargetOut->TargetTemporalID = svcTargetIn->TargetTemporalID; else sts = MFX_ERR_UNSUPPORTED; } else { if (svcTargetIn || svcTargetOut) { sts = MFX_ERR_UNDEFINED_BEHAVIOR; } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE if (GetPlatform(core, out) != core->GetPlatformType() && sts == MFX_ERR_NONE) { assert(GetPlatform(core, out) == MFX_PLATFORM_SOFTWARE); sts = MFX_ERR_UNSUPPORTED; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE /*SFC*/ mfxExtDecVideoProcessing * videoProcessingTargetIn = (mfxExtDecVideoProcessing *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); mfxExtDecVideoProcessing * videoProcessingTargetOut = (mfxExtDecVideoProcessing *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); if (videoProcessingTargetIn && videoProcessingTargetOut) { if (((MFX_HW_VAAPI == core->GetVAType()) || (MFX_HW_D3D11 == core->GetVAType())) && (MFX_PICSTRUCT_PROGRESSIVE == in->mfx.FrameInfo.PicStruct) && (in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) ) { /* Check Input cropping */ if (!((videoProcessingTargetIn->In.CropX <= videoProcessingTargetIn->In.CropW) && (videoProcessingTargetIn->In.CropW <= in->mfx.FrameInfo.CropW) && (videoProcessingTargetIn->In.CropY <= videoProcessingTargetIn->In.CropH) && (videoProcessingTargetIn->In.CropH <= in->mfx.FrameInfo.CropH) )) sts = MFX_ERR_UNSUPPORTED; /* Check output cropping */ if (!((videoProcessingTargetIn->Out.CropX <= videoProcessingTargetIn->Out.CropW) && (videoProcessingTargetIn->Out.CropW <= videoProcessingTargetIn->Out.Width) && ((videoProcessingTargetIn->Out.CropX + videoProcessingTargetIn->Out.CropW) <= videoProcessingTargetIn->Out.Width) && (videoProcessingTargetIn->Out.CropY <= videoProcessingTargetIn->Out.CropH) && (videoProcessingTargetIn->Out.CropH <= videoProcessingTargetIn->Out.Height) && ((videoProcessingTargetIn->Out.CropY + videoProcessingTargetIn->Out.CropH ) <= videoProcessingTargetIn->Out.Height) )) sts = MFX_ERR_UNSUPPORTED; if (MFX_ERR_UNSUPPORTED != sts) *videoProcessingTargetOut = *videoProcessingTargetIn; } else { sts = MFX_ERR_UNSUPPORTED; } } #endif //MFX_DEC_VIDEO_POSTPROCESS_DISABLE } else { out->mfx.CodecId = MFX_CODEC_AVC; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.NumThread = 1; out->mfx.DecodedOrder = 1; out->mfx.TimeStampCalc = 1; out->mfx.SliceGroupsPresent = 1; out->mfx.ExtendedPicStruct = 1; out->AsyncDepth = 1; // mfxFrameInfo out->mfx.FrameInfo.FourCC = 1; out->mfx.FrameInfo.Width = 16; out->mfx.FrameInfo.Height = 16; //out->mfx.FrameInfo.CropX = 1; //out->mfx.FrameInfo.CropY = 1; //out->mfx.FrameInfo.CropW = 1; //out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; out->Protected = 0; mfxExtMVCTargetViews * targetViewsOut = (mfxExtMVCTargetViews *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (targetViewsOut) { targetViewsOut->TemporalId = 1; targetViewsOut->NumView = 1; } mfxExtMVCSeqDesc * mvcPointsOut = (mfxExtMVCSeqDesc *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC); if (mvcPointsOut) { } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSvcTargetLayer * targetLayerOut = (mfxExtSvcTargetLayer *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (targetLayerOut) { targetLayerOut->TargetDependencyID = 1; targetLayerOut->TargetQualityID = 1; targetLayerOut->TargetTemporalID = 1; } mfxExtSVCSeqDesc * svcDescOut = (mfxExtSVCSeqDesc *)GetExtendedBuffer(out->ExtParam, out->NumExtParam, MFX_EXTBUFF_SVC_SEQ_DESC); if (svcDescOut) { for (size_t i = 0; i < sizeof(svcDescOut->DependencyLayer)/sizeof(svcDescOut->DependencyLayer[0]); i++) { svcDescOut->DependencyLayer[i].Active = 1; svcDescOut->DependencyLayer[i].Width = 1; svcDescOut->DependencyLayer[i].Height = 1; svcDescOut->DependencyLayer[i].QualityNum = 1; svcDescOut->DependencyLayer[i].TemporalNum = 1; } } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (type == MFX_HW_UNKNOWN) { out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } else { out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } } return sts; } bool MFX_Utility::CheckVideoParam(mfxVideoParam *in, eMFXHWType type) { if (!in) return false; if (in->Protected) { if (type == MFX_HW_UNKNOWN || !IS_PROTECTION_ANY(in->Protected)) return false; } if (MFX_CODEC_AVC != in->mfx.CodecId) return false; uint32_t profile_idc = UMC::ExtractProfile(in->mfx.CodecProfile); switch (profile_idc) { case MFX_PROFILE_UNKNOWN: case MFX_PROFILE_AVC_BASELINE: case MFX_PROFILE_AVC_MAIN: case MFX_PROFILE_AVC_EXTENDED: case MFX_PROFILE_AVC_HIGH: case MFX_PROFILE_AVC_STEREO_HIGH: case MFX_PROFILE_AVC_MULTIVIEW_HIGH: #ifdef MFX_ENABLE_SVC_VIDEO_DECODE case MFX_PROFILE_AVC_SCALABLE_BASELINE: case MFX_PROFILE_AVC_SCALABLE_HIGH: #endif break; default: return false; } #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtSvcTargetLayer * svcTarget = (mfxExtSvcTargetLayer*)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_SVC_TARGET_LAYER); if (svcTarget) { if (svcTarget->TargetDependencyID > 7) return false; if (svcTarget->TargetQualityID > 15) return false; if (svcTarget->TargetTemporalID > 7) return false; } #endif // #ifdef MFX_ENABLE_SVC_VIDEO_DECODE mfxExtMVCTargetViews * targetViews = (mfxExtMVCTargetViews *)GetExtendedBuffer(in->ExtParam, in->NumExtParam, MFX_EXTBUFF_MVC_TARGET_VIEWS); if (targetViews) { if (targetViews->TemporalId > 7) return false; if (targetViews->NumView > 1024) return false; } if (in->mfx.FrameInfo.Width > 16384 || (in->mfx.FrameInfo.Width % 16)) return false; if (in->mfx.FrameInfo.Height > 16384 || (in->mfx.FrameInfo.Height % 16)) return false; if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P010 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210) return false; // both zero or not zero if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) return false; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: case MFX_PICSTRUCT_FIELD_REPEATED: case MFX_PICSTRUCT_FRAME_DOUBLING: case MFX_PICSTRUCT_FRAME_TRIPLING: break; default: return false; } if (in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV400 && in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV422) return false; if (in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV422) { if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16) return false; } if ( !(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) ) return false; if ((in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; return true; } #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_nal_spl.cpp000066400000000000000000000366761443134507600317160ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include "umc_structures.h" #include "umc_h264_nal_spl.h" namespace UMC { void SwapMemoryAndRemovePreventingBytes(void *pDestination, size_t &nDstSize, void *pSource, size_t nSrcSize); static int32_t FindStartCode(uint8_t * (&pb), size_t &nSize) { // there is no data if ((int32_t) nSize < 4) return -1; // find start code while ((4 <= nSize) && ((0 != pb[0]) || (0 != pb[1]) || (1 != pb[2]))) { pb += 1; nSize -= 1; } if (4 <= nSize) return ((pb[0] << 24) | (pb[1] << 16) | (pb[2] << 8) | (pb[3])); return -1; } // int32_t FindStartCode(uint8_t * (&pb), size_t &nSize) class StartCodeIterator : public StartCodeIteratorBase { public: StartCodeIterator() : m_code(-1) , m_pts(-1) { Reset(); } virtual void Reset() { m_code = -1; m_pts = -1; m_prev.clear(); } virtual int32_t Init(MediaData * pSource) { Reset(); StartCodeIteratorBase::Init(pSource); int32_t iCode = UMC::FindStartCode(m_pSource, m_nSourceSize); return iCode; } virtual int32_t GetNext() { m_pSource += 3; m_nSourceSize -= 3; int32_t iCode = UMC::FindStartCode(m_pSource, m_nSourceSize); return iCode; } virtual int32_t CheckNalUnitType(MediaData * pSource) { if (!pSource) return -1; uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); int32_t startCodeSize; return FindStartCode(source, size, startCodeSize); } virtual int32_t MoveToStartCode(MediaData * pSource) { if (!pSource) return -1; if (m_code == -1) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); int32_t startCodeSize; int32_t iCodeNext = FindStartCode(source, size, startCodeSize); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); if (iCodeNext != -1) { pSource->MoveDataPointer(-startCodeSize); } return iCodeNext; } virtual int32_t GetNALUnit(MediaData * pSource, NalUnit * pDst) { if (!pSource) return EndOfStream(pDst); int32_t iCode = GetNALUnitInternal(pSource, pDst); if (iCode == -1) { bool endOfStream = pSource && ((pSource->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_END_OF_STREAM) != 0); if (endOfStream) iCode = EndOfStream(pDst); } return iCode; } int32_t GetNALUnitInternal(MediaData * pSource, NalUnit * pDst) { if (m_code == -1) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); if (!size) return -1; int32_t startCodeSize; int32_t iCodeNext = FindStartCode(source, size, startCodeSize); if (m_prev.size()) { if (iCodeNext == -1) { size_t sz = source - (uint8_t *)pSource->GetDataPointer(); if (m_prev.size() + sz > m_suggestedSize) { m_prev.clear(); sz = std::min(sz, m_suggestedSize); } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + sz); pSource->MoveDataPointer((int32_t)sz); return -1; } source -= startCodeSize; m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), source); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); pDst->m_use_external_memory = false; pDst->SetFlags(MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME); pDst->SetBufferPointer(&(m_prev[0]), m_prev.size()); pDst->SetDataSize(m_prev.size()); pDst->SetTime(m_pts); int32_t code = m_code; m_code = -1; m_pts = -1; return code; } if (iCodeNext == -1) { pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); return -1; } m_pts = pSource->GetTime(); m_code = iCodeNext; // move before start code pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer() - startCodeSize)); int32_t startCodeSize1; iCodeNext = FindStartCode(source, size, startCodeSize1); pSource->MoveDataPointer(startCodeSize); uint32_t flags = pSource->GetFlags(); if (iCodeNext == -1 && !(flags & MediaData::FLAG_VIDEO_DATA_NOT_FULL_UNIT)) { iCodeNext = 1; startCodeSize1 = 0; source += size; size = 0; } if (iCodeNext == -1) { if (m_code == NAL_UT_SPS) { pSource->MoveDataPointer(-startCodeSize); // leave start code for SPS return -1; } assert(!m_prev.size()); size_t sz = source - (uint8_t *)pSource->GetDataPointer(); if (sz > m_suggestedSize) { sz = m_suggestedSize; } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + sz); pSource->MoveDataPointer((int32_t)sz); return -1; } // fill size_t nal_size = source - (uint8_t *)pSource->GetDataPointer() - startCodeSize1; pDst->SetBufferPointer((uint8_t*)pSource->GetDataPointer(), nal_size); pDst->SetDataSize(nal_size); pSource->MoveDataPointer((int32_t)nal_size); pDst->SetFlags(pSource->GetFlags()); int32_t code = m_code; m_code = -1; pDst->SetTime(m_pts); m_pts = -1; return code; } int32_t EndOfStream(NalUnit * pDst) { if (m_code == -1) { m_prev.clear(); return -1; } if (m_prev.size()) { pDst->SetBufferPointer(&(m_prev[0]), m_prev.size()); pDst->SetDataSize(m_prev.size()); pDst->SetTime(m_pts); pDst->m_use_external_memory = false; int32_t code = m_code; m_code = -1; m_pts = -1; return code; } m_code = -1; return -1; } private: std::vector m_prev; int32_t m_code; double m_pts; int32_t FindStartCode(uint8_t * (&pb), size_t & size, int32_t & startCodeSize) { uint32_t zeroCount = 0; int32_t i = 0; for (; i < (int32_t)size - 2; ) { if (pb[1]) { pb += 2; i += 2; continue; } zeroCount = 0; if (!pb[0]) zeroCount++; uint32_t j; for (j = 1; j < (uint32_t)size - i; j++) { if (pb[j]) break; } zeroCount = zeroCount ? j: j - 1; pb += j; i += j; if (i >= (int32_t)size) { break; } if (zeroCount >= 2 && pb[0] == 1) { startCodeSize = std::min(zeroCount + 1, 4u); size -= i + 1; pb++; // remove 0x01 symbol zeroCount = 0; if (size >= 1) { return pb[0] & NAL_UNITTYPE_BITS; } else { pb -= startCodeSize; size += startCodeSize; startCodeSize = 0; return -1; } } zeroCount = 0; } if (!zeroCount) { for (uint32_t k = 0; k < size - i; k++, pb++) { if (pb[0]) { zeroCount = 0; continue; } zeroCount++; } } zeroCount = std::min(zeroCount, 3u); pb -= zeroCount; size = zeroCount; zeroCount = 0; startCodeSize = 0; return -1; } }; class Swapper : public SwapperBase { public: virtual void SwapMemory(uint8_t *pDestination, size_t &nDstSize, uint8_t *pSource, size_t nSrcSize) { SwapMemoryAndRemovePreventingBytes(pDestination, nDstSize, pSource, nSrcSize); } virtual void SwapMemory(H264MemoryPiece * pMemDst, H264MemoryPiece * pMemSrc, uint8_t defaultValue) { size_t dstSize = pMemSrc->GetDataSize(); SwapMemory(pMemDst->GetPointer(), dstSize, pMemSrc->GetPointer(), pMemSrc->GetDataSize()); size_t tail_size = pMemDst->GetSize() - dstSize; memset(pMemDst->GetPointer() + dstSize, defaultValue, tail_size); assert(pMemDst->GetSize() >= dstSize); pMemDst->SetDataSize(dstSize); pMemDst->SetTime(pMemSrc->GetTime()); } virtual void CopyBitStream(uint8_t *pDestination, uint8_t *pSource, size_t &nSrcSize) { MFX_INTERNAL_CPY(pDestination, pSource, (uint32_t)nSrcSize); } }; NALUnitSplitter::NALUnitSplitter() : m_pSwapper(0) , m_pStartCodeIter(0) { } NALUnitSplitter::~NALUnitSplitter() { Release(); } void NALUnitSplitter::Init() { Release(); m_pSwapper = new Swapper(); m_pStartCodeIter = new StartCodeIterator(); } void NALUnitSplitter::Reset() { if (m_pStartCodeIter) { m_pStartCodeIter->Reset(); } } void NALUnitSplitter::Release() { delete m_pSwapper; m_pSwapper = 0; delete m_pStartCodeIter; m_pStartCodeIter = 0; } int32_t NALUnitSplitter::CheckNalUnitType(MediaData * pSource) { return m_pStartCodeIter->CheckNalUnitType(pSource); // find first start code } int32_t NALUnitSplitter::MoveToStartCode(MediaData * pSource) { return m_pStartCodeIter->MoveToStartCode(pSource); // find first start code } NalUnit * NALUnitSplitter::GetNalUnits(MediaData * pSource) { m_nalUnit.m_use_external_memory = true; int32_t iCode = m_pStartCodeIter->GetNALUnit(pSource, &m_nalUnit); if (iCode == -1) { return 0; } m_nalUnit.m_nal_unit_type = iCode; /*static int k = 0; if (k) { static FILE * fl = fopen("f:\\out.avc", "wb"); fwrite(start_code_prefix, 4, 1, fl); fwrite(out->GetDataPointer(), out->GetDataSize(), 1, fl); }*/ return &m_nalUnit; } /* temporal class definition */ class H264DwordPointer_ { public: // Default constructor H264DwordPointer_(void) { m_pDest = NULL; m_nByteNum = 0; m_iCur = 0; } H264DwordPointer_ operator = (void *pDest) { m_pDest = (uint32_t *) pDest; m_nByteNum = 0; m_iCur = 0; return *this; } // Increment operator H264DwordPointer_ &operator ++ (void) { if (4 == ++m_nByteNum) { *m_pDest = m_iCur; m_pDest += 1; m_nByteNum = 0; m_iCur = 0; } else m_iCur <<= 8; return *this; } uint8_t operator = (uint8_t nByte) { m_iCur = (m_iCur & ~0x0ff) | ((uint32_t) nByte); return nByte; } protected: uint32_t *m_pDest; // (uint32_t *) pointer to destination buffer uint32_t m_nByteNum; // (uint32_t) number of current byte in dword uint32_t m_iCur; // (uint32_t) current dword }; class H264SourcePointer_ { public: // Default constructor H264SourcePointer_(void) { m_pSource = NULL; m_nZeros = 0; m_nRemovedBytes = 0; } H264SourcePointer_ &operator = (void *pSource) { m_pSource = (uint8_t *) pSource; m_nZeros = 0; m_nRemovedBytes = 0; return *this; } H264SourcePointer_ &operator ++ (void) { uint8_t bCurByte = m_pSource[0]; if (0 == bCurByte) m_nZeros += 1; else { if ((3 == bCurByte) && (2 <= m_nZeros)) m_nRemovedBytes += 1; m_nZeros = 0; } m_pSource += 1; return *this; } bool IsPrevent(void) { if ((3 == m_pSource[0]) && (2 <= m_nZeros)) return true; else return false; } operator uint8_t (void) { return m_pSource[0]; } uint32_t GetRemovedBytes(void) { return m_nRemovedBytes; } protected: uint8_t *m_pSource; // (uint8_t *) pointer to destination buffer uint32_t m_nZeros; // (uint32_t) number of preceding zeros uint32_t m_nRemovedBytes; // (uint32_t) number of removed bytes }; void SwapMemoryAndRemovePreventingBytes(void *pDestination, size_t &nDstSize, void *pSource, size_t nSrcSize) { H264DwordPointer_ pDst; H264SourcePointer_ pSrc; size_t i; // DwordPointer object is swapping written bytes // H264SourcePointer_ removes preventing start-code bytes // reset pointer(s) pSrc = pSource; pDst = pDestination; // first two bytes i = 0; while (i < std::min(size_t(2), nSrcSize)) { pDst = (uint8_t) pSrc; ++pDst; ++pSrc; ++i; } // do swapping while (i < (uint32_t) nSrcSize) { if (false == pSrc.IsPrevent()) { pDst = (uint8_t) pSrc; ++pDst; } ++pSrc; ++i; } // write padding bytes nDstSize = nSrcSize - pSrc.GetRemovedBytes(); while (nDstSize & 3) { pDst = (uint8_t) (DEFAULT_NU_TAIL_VALUE); ++nDstSize; ++pDst; } } // void SwapMemoryAndRemovePreventingBytes(void *pDst, size_t &nDstSize, void *pSrc, size_t nSrcSize) } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_segment_decoder_dxva.cpp000066400000000000000000000206571443134507600343500ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include "umc_h264_segment_decoder_dxva.h" #include "umc_h264_task_supplier.h" #include "mfx_trace.h" #include "mfxstructures.h" #include "mfx_unified_h264d_logging.h" namespace UMC { H264_DXVA_SegmentDecoderCommon::H264_DXVA_SegmentDecoderCommon(TaskSupplier * pTaskSupplier) : H264SegmentDecoderBase(pTaskSupplier->GetTaskBroker()) , m_va(0) , m_pTaskSupplier(pTaskSupplier) { } void H264_DXVA_SegmentDecoderCommon::SetVideoAccelerator(VideoAccelerator *va) { assert(va); m_va = (VideoAccelerator*)va; } H264_DXVA_SegmentDecoder::H264_DXVA_SegmentDecoder(TaskSupplier * pTaskSupplier) : H264_DXVA_SegmentDecoderCommon(pTaskSupplier) { } H264_DXVA_SegmentDecoder::~H264_DXVA_SegmentDecoder() { } Status H264_DXVA_SegmentDecoder::Init(int32_t iNumber) { return H264SegmentDecoderBase::Init(iNumber); } void H264_DXVA_SegmentDecoder::Reset() { if (m_Packer.get()) m_Packer->Reset(); } void H264_DXVA_SegmentDecoder::PackAllHeaders(H264DecoderFrame * pFrame, int32_t field) { if (!m_Packer.get()) { m_Packer.reset(Packer::CreatePacker(m_va, m_pTaskSupplier)); if (!m_Packer.get()) throw h264_exception(UMC_ERR_FAILED); } m_Packer->BeginFrame(pFrame, field); m_Packer->PackAU(pFrame, field); m_Packer->EndFrame(); } Status H264_DXVA_SegmentDecoder::ProcessSegment(void) { try{ if (m_pTaskBroker->GetNextTask(0)) { } else { return UMC_ERR_NOT_ENOUGH_DATA; } }catch(h264_exception &ex){ return ex.GetStatus(); } return UMC_OK; } TaskBrokerSingleThreadDXVA::TaskBrokerSingleThreadDXVA(TaskSupplier * pTaskSupplier) : TaskBroker(pTaskSupplier) , m_useDXVAStatusReporting(true) { } bool TaskBrokerSingleThreadDXVA::PrepareFrame(H264DecoderFrame * pFrame) { if (!pFrame || pFrame->m_iResourceNumber < 0) { return true; } bool isSliceGroups = pFrame->GetAU(0)->IsSliceGroups() || pFrame->GetAU(1)->IsSliceGroups(); if (isSliceGroups) pFrame->m_iResourceNumber = 0; if (pFrame->prepared[0] && pFrame->prepared[1]) return true; if (!pFrame->prepared[0] && (pFrame->GetAU(0)->GetStatus() == H264DecoderFrameInfo::STATUS_FILLED || pFrame->GetAU(0)->GetStatus() == H264DecoderFrameInfo::STATUS_STARTED)) { pFrame->prepared[0] = true; } if (!pFrame->prepared[1] && (pFrame->GetAU(1)->GetStatus() == H264DecoderFrameInfo::STATUS_FILLED || pFrame->GetAU(1)->GetStatus() == H264DecoderFrameInfo::STATUS_STARTED)) { pFrame->prepared[1] = true; } return true; } void TaskBrokerSingleThreadDXVA::Reset() { timer.Stop(); TaskBroker::Reset(); m_reports.clear(); } void TaskBrokerSingleThreadDXVA::Start() { AutomaticUMCMutex guard(m_mGuard); TaskBroker::Start(); m_completedQueue.clear(); H264_DXVA_SegmentDecoder * dxva_sd = static_cast(m_pTaskSupplier->m_pSegmentDecoder[0]); if (dxva_sd && dxva_sd->GetPacker() && dxva_sd->GetPacker()->GetVideoAccelerator()) { m_useDXVAStatusReporting = dxva_sd->GetPacker()->GetVideoAccelerator()->IsUseStatusReport(); } if (m_useDXVAStatusReporting) return; for (H264DecoderFrameInfo *pTemp = m_FirstAU; pTemp; pTemp = pTemp->GetNextAU()) { pTemp->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); } for (H264DecoderFrameInfo *pTemp = m_FirstAU; pTemp; ) { CompleteFrame(pTemp->m_pFrame); pTemp = m_FirstAU; } m_FirstAU = 0; } enum { NUMBER_OF_STATUS = 512, }; void TaskBrokerSingleThreadDXVA::SetCompletedAndErrorStatus(uint8_t uiStatus, H264DecoderFrameInfo * au) { switch (uiStatus) { case 1: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MINOR); break; case 2: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); break; case 3: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); break; case 4: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); break; } au->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); CompleteFrame(au->m_pFrame); } bool TaskBrokerSingleThreadDXVA::CheckCachedFeedbackAndComplete(H264DecoderFrameInfo * au) { for (uint32_t i = 0; i < m_reports.size(); i++) { if ((m_reports[i].m_index == (uint32_t)au->m_pFrame->m_index) && (au->IsBottom() == (m_reports[i].m_field != 0))) { SetCompletedAndErrorStatus(m_reports[i].m_status, au); m_reports.erase(m_reports.begin() + i); return true; } } return false; } bool TaskBrokerSingleThreadDXVA::GetNextTaskInternal(H264Task *) { AutomaticUMCMutex guard(m_mGuard); if (!m_useDXVAStatusReporting) return false; H264_DXVA_SegmentDecoder * dxva_sd = static_cast(m_pTaskSupplier->m_pSegmentDecoder[0]); if (!dxva_sd->GetPacker()) return false; Status sts = UMC_OK; for (H264DecoderFrameInfo * au = m_FirstAU; au; au = au->GetNextAU()) { H264DecoderFrameInfo* prev = au->GetPrevAU(); //skip second field for sync. bool skip = (prev && prev->m_pFrame == au->m_pFrame); uint16_t surfCorruption = 0; #if defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) if (!skip) { m_mGuard.Unlock(); MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Dec vaSyncSurface"); sts = dxva_sd->GetPacker()->SyncTask(au->m_pFrame, &surfCorruption); m_mGuard.Lock(); } #else sts = dxva_sd->GetPacker()->QueryTaskStatus(au->m_pFrame, &surfSts, &surfCorruption); #endif //we should complete frame even we got an error //this allows to return the error from [RunDecoding] au->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); CompleteFrame(au->m_pFrame); if (sts < UMC_OK) { if (sts != UMC_ERR_GPU_HANG) sts = UMC_ERR_DEVICE_FAILED; au->m_pFrame->SetError(sts); } #if !defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) else if (surfSts == VASurfaceReady) #else else #endif switch (surfCorruption) { case MFX_CORRUPTION_MAJOR: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MAJOR); break; case MFX_CORRUPTION_MINOR: au->m_pFrame->SetErrorFlagged(ERROR_FRAME_MINOR); break; } if (sts != UMC_OK) throw h264_exception(sts); if (!skip) { //query SO buffer with [SyncTask] only sts = dxva_sd->GetPacker()->QueryStreamOut(au->m_pFrame); if (sts != UMC_OK) throw h264_exception(sts); } TRACE_EVENT(MFX_TRACE_API_AVC_SYNCINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data( au->m_pFrame->m_PicOrderCnt[0], au->m_pFrame->m_PicOrderCnt[1], au->m_pFrame->m_index, (uint32_t)au->m_pFrame->IsDecodingCompleted(), (uint32_t)au->m_pFrame->wasDisplayed(), (uint32_t)au->m_pFrame->wasOutputted(), sts)); } SwitchCurrentAU(); return false; } void TaskBrokerSingleThreadDXVA::AwakeThreads() { } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_slice_decoding.cpp000066400000000000000000000250331443134507600331230ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_frame.h" #include "umc_h264_slice_decoding.h" #include "umc_h264_heap.h" namespace UMC { H264Slice::H264Slice(MemoryAllocator *pMemoryAllocator) : m_pSeqParamSet(0) , m_bInited(false) , m_pMemoryAllocator(pMemoryAllocator) { Reset(); } // H264Slice::H264Slice() H264Slice::~H264Slice() { Release(); } // H264Slice::~H264Slice(void) void H264Slice::Reset() { m_pSource.Release(); if (m_bInited && m_pSeqParamSet) { if (m_pSeqParamSet) ((UMC_H264_DECODER::H264SeqParamSet*)m_pSeqParamSet)->DecrementReference(); if (m_pPicParamSet) ((UMC_H264_DECODER::H264PicParamSet*)m_pPicParamSet)->DecrementReference(); m_pSeqParamSet = 0; m_pPicParamSet = 0; if (m_pSeqParamSetEx) { ((UMC_H264_DECODER::H264SeqParamSetExtension*)m_pSeqParamSetEx)->DecrementReference(); m_pSeqParamSetEx = 0; } if (m_pSeqParamSetMvcEx) { ((UMC_H264_DECODER::H264SeqParamSetMVCExtension*)m_pSeqParamSetMvcEx)->DecrementReference(); m_pSeqParamSetMvcEx = 0; } if (m_pSeqParamSetSvcEx) { ((UMC_H264_DECODER::H264SeqParamSetSVCExtension*)m_pSeqParamSetSvcEx)->DecrementReference(); m_pSeqParamSetSvcEx = 0; } } ZeroedMembers(); FreeResources(); } void H264Slice::ZeroedMembers() { m_pPicParamSet = 0; m_pSeqParamSet = 0; m_pSeqParamSetEx = 0; m_pSeqParamSetMvcEx = 0; m_pSeqParamSetSvcEx = 0; m_iMBWidth = -1; m_iMBHeight = -1; m_pCurrentFrame = 0; memset(&m_AdaptiveMarkingInfo, 0, sizeof(m_AdaptiveMarkingInfo)); m_bInited = false; m_isInitialized = false; } void H264Slice::Release() { Reset(); } int32_t H264Slice::RetrievePicParamSetNumber() { if (!m_pSource.GetDataSize()) return -1; memset(&m_SliceHeader, 0, sizeof(m_SliceHeader)); m_BitStream.Reset((uint8_t *) m_pSource.GetPointer(), (uint32_t) m_pSource.GetDataSize()); Status umcRes = UMC_OK; try { umcRes = m_BitStream.GetNALUnitType(m_SliceHeader.nal_unit_type, m_SliceHeader.nal_ref_idc); if (UMC_OK != umcRes) return false; // decode first part of slice header umcRes = m_BitStream.GetSliceHeaderPart1(&m_SliceHeader); if (UMC_OK != umcRes) return -1; } catch (...) { return -1; } return m_SliceHeader.pic_parameter_set_id; } void H264Slice::FreeResources() { } bool H264Slice::Reset(UMC_H264_DECODER::H264NalExtension *pNalExt) { int32_t iMBInFrame; int32_t iFieldIndex; m_BitStream.Reset((uint8_t *) m_pSource.GetPointer(), (uint32_t) m_pSource.GetDataSize()); // decode slice header if (m_pSource.GetDataSize() && false == DecodeSliceHeader(pNalExt)) { ZeroedMembers(); return false; } m_iMBWidth = GetSeqParam()->frame_width_in_mbs; m_iMBHeight = GetSeqParam()->frame_height_in_mbs; iMBInFrame = (m_iMBWidth * m_iMBHeight) / ((m_SliceHeader.field_pic_flag) ? (2) : (1)); iFieldIndex = (m_SliceHeader.field_pic_flag && m_SliceHeader.bottom_field_flag) ? (1) : (0); // set slice variables m_iFirstMB = m_SliceHeader.first_mb_in_slice; m_iMaxMB = iMBInFrame; m_iFirstMBFld = m_SliceHeader.first_mb_in_slice + iMBInFrame * iFieldIndex; m_iAvailableMB = iMBInFrame; if (m_iFirstMB >= m_iAvailableMB) return false; // reset all internal variables m_bFirstDebThreadedCall = true; m_bError = false; // set conditional flags m_bDecoded = false; m_bPrevDeblocked = false; m_bDeblocked = (m_SliceHeader.disable_deblocking_filter_idc == DEBLOCK_FILTER_OFF); // frame is not associated yet m_pCurrentFrame = NULL; m_bInited = true; m_pSeqParamSet->IncrementReference(); m_pPicParamSet->IncrementReference(); if (m_pSeqParamSetEx) m_pSeqParamSetEx->IncrementReference(); if (m_pSeqParamSetMvcEx) m_pSeqParamSetMvcEx->IncrementReference(); if (m_pSeqParamSetSvcEx) m_pSeqParamSetSvcEx->IncrementReference(); return true; } // bool H264Slice::Reset(void *pSource, size_t nSourceSize, int32_t iNumber) void H264Slice::SetSeqMVCParam(const UMC_H264_DECODER::H264SeqParamSetMVCExtension * sps) { const UMC_H264_DECODER::H264SeqParamSetMVCExtension * temp = m_pSeqParamSetMvcEx; m_pSeqParamSetMvcEx = sps; if (m_pSeqParamSetMvcEx) m_pSeqParamSetMvcEx->IncrementReference(); if (temp) ((UMC_H264_DECODER::H264SeqParamSetMVCExtension*)temp)->DecrementReference(); } void H264Slice::SetSeqSVCParam(const UMC_H264_DECODER::H264SeqParamSetSVCExtension * sps) { const UMC_H264_DECODER::H264SeqParamSetSVCExtension * temp = m_pSeqParamSetSvcEx; m_pSeqParamSetSvcEx = sps; if (m_pSeqParamSetSvcEx) m_pSeqParamSetSvcEx->IncrementReference(); if (temp) ((UMC_H264_DECODER::H264SeqParamSetSVCExtension*)temp)->DecrementReference(); } void H264Slice::SetSliceNumber(int32_t iSliceNumber) { m_iNumber = iSliceNumber; } UMC_H264_DECODER::AdaptiveMarkingInfo * H264Slice::GetAdaptiveMarkingInfo() { return &m_AdaptiveMarkingInfo; } bool H264Slice::DecodeSliceHeader(UMC_H264_DECODER::H264NalExtension *pNalExt) { Status umcRes = UMC_OK; // Locals for additional slice data to be read into, the data // was read and saved from the first slice header of the picture, // is not supposed to change within the picture, so can be // discarded when read again here. int32_t iSQUANT; try { memset(&m_SliceHeader, 0, sizeof(m_SliceHeader)); umcRes = m_BitStream.GetNALUnitType(m_SliceHeader.nal_unit_type, m_SliceHeader.nal_ref_idc); if (UMC_OK != umcRes) return false; if (pNalExt && (NAL_UT_CODED_SLICE_EXTENSION != m_SliceHeader.nal_unit_type)) { if (pNalExt->extension_present) m_SliceHeader.nal_ext = *pNalExt; pNalExt->extension_present = 0; } // adjust slice type for auxilary slice if (NAL_UT_AUXILIARY == m_SliceHeader.nal_unit_type) { if (!m_pCurrentFrame || !GetSeqParamEx()) return false; m_SliceHeader.nal_unit_type = m_pCurrentFrame->m_bIDRFlag ? NAL_UT_IDR_SLICE : NAL_UT_SLICE; m_SliceHeader.is_auxiliary = true; } // decode first part of slice header umcRes = m_BitStream.GetSliceHeaderPart1(&m_SliceHeader); if (UMC_OK != umcRes) return false; // decode second part of slice header umcRes = m_BitStream.GetSliceHeaderPart2(&m_SliceHeader, m_pPicParamSet, m_pSeqParamSet); if (UMC_OK != umcRes) return false; // decode second part of slice header umcRes = m_BitStream.GetSliceHeaderPart3(&m_SliceHeader, m_PredWeight[0], m_PredWeight[1], &ReorderInfoL0, &ReorderInfoL1, &m_AdaptiveMarkingInfo, &m_BaseAdaptiveMarkingInfo, m_pPicParamSet, m_pSeqParamSet, m_pSeqParamSetSvcEx); if (UMC_OK != umcRes) return false; //7.4.3 Slice header semantics //If the current picture is an IDR picture, frame_num shall be equal to 0 //If this restrictions is violated, clear LT flag to avoid ref. pic. marking process corruption if (m_SliceHeader.IdrPicFlag && m_SliceHeader.frame_num != 0) m_SliceHeader.long_term_reference_flag = 0; // decode 4 part of slice header umcRes = m_BitStream.GetSliceHeaderPart4(&m_SliceHeader, m_pSeqParamSetSvcEx); if (UMC_OK != umcRes) return false; m_iMBWidth = m_pSeqParamSet->frame_width_in_mbs; m_iMBHeight = m_pSeqParamSet->frame_height_in_mbs; // redundant slice, discard if (m_SliceHeader.redundant_pic_cnt) return false; // Set next MB. if (m_SliceHeader.first_mb_in_slice >= (int32_t) (m_iMBWidth * m_iMBHeight)) { return false; } int32_t bit_depth_luma = m_SliceHeader.is_auxiliary ? GetSeqParamEx()->bit_depth_aux : GetSeqParam()->bit_depth_luma; iSQUANT = m_pPicParamSet->pic_init_qp + m_SliceHeader.slice_qp_delta; if (iSQUANT < QP_MIN - 6*(bit_depth_luma - 8) || iSQUANT > QP_MAX) { return false; } m_SliceHeader.hw_wa_redundant_elimination_bits[2] = (uint32_t)m_BitStream.BitsDecoded(); if (m_pPicParamSet->entropy_coding_mode) m_BitStream.AlignPointerRight(); } catch(const h264_exception & ) { return false; } catch(...) { return false; } return (UMC_OK == umcRes); } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_task_broker.cpp000066400000000000000000000240651443134507600325610ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include "umc_h264_task_broker.h" #include "umc_h264_heap.h" #include "umc_h264_task_supplier.h" #include "umc_h264_frame_list.h" #include "umc_h264_dec_debug.h" #include "mfx_trace.h" namespace UMC { TaskBroker::TaskBroker(TaskSupplier * pTaskSupplier) : m_pTaskSupplier(pTaskSupplier) , m_iConsumerNumber(0) , m_FirstAU(0) , m_IsShouldQuit(false) { Release(); } TaskBroker::~TaskBroker() { Release(); } bool TaskBroker::Init(int32_t iConsumerNumber) { Release(); // we keep this variable due some optimizations purposes m_iConsumerNumber = iConsumerNumber; m_IsShouldQuit = false; return true; } void TaskBroker::Reset() { AutomaticUMCMutex guard(m_mGuard); m_FirstAU = 0; m_IsShouldQuit = true; m_decodingQueue.clear(); m_completedQueue.clear(); } void TaskBroker::Release() { Reset(); } /*LocalResources * TaskBroker::GetLocalResource() { return &m_localResourses; }*/ void TaskBroker::Lock() { m_mGuard.Lock(); /*if ((m_mGuard.TryLock() != UMC_OK)) { lock_failed++; m_mGuard.Lock(); }*/ } void TaskBroker::Unlock() { m_mGuard.Unlock(); } bool TaskBroker::AddFrameToDecoding(H264DecoderFrame * frame) { if (!frame || frame->IsDecodingStarted()) return false; H264DecoderLayer::FillnessStatus status = frame->GetAU(0)->GetStatus(); if (!((status == H264DecoderFrameInfo::STATUS_FILLED) || (status == H264DecoderFrameInfo::STATUS_STARTED))) return false; AutomaticUMCMutex guard(m_mGuard); #ifdef VM_DEBUG FrameQueue::iterator iter = m_decodingQueue.begin(); FrameQueue::iterator end_iter = m_decodingQueue.end(); for (; iter != end_iter; ++iter) { if ((*iter) == frame) { assert(false); } } #endif m_decodingQueue.push_back(frame); frame->StartDecoding(); return true; } void TaskBroker::RemoveAU(H264DecoderFrameInfo * toRemove) { H264DecoderFrameInfo * temp = m_FirstAU; if (!temp) return; H264DecoderFrameInfo * reference = 0; for (; temp; temp = temp->GetNextAU()) { if (temp == toRemove) break; if (temp->IsReference()) reference = temp; } if (!temp) return; if (temp->GetPrevAU()) temp->GetPrevAU()->SetNextAU(temp->GetNextAU()); if (temp->GetNextAU()) temp->GetNextAU()->SetPrevAU(temp->GetPrevAU()); H264DecoderFrameInfo * temp1 = temp->GetNextAU(); temp->SetPrevAU(0); temp->SetNextAU(0); if (temp == m_FirstAU) m_FirstAU = temp1; if (temp1) { temp = temp1; for (; temp; temp = temp->GetNextAU()) { if (temp->GetRefAU()) temp->SetRefAU(reference); if (temp->IsReference()) break; } } } void TaskBroker::CompleteFrame(H264DecoderFrame * frame) { if (!frame || m_decodingQueue.empty() || !frame->IsFullFrame()) return; if (!IsFrameCompleted(frame) || frame->IsDecodingCompleted()) return; if (frame == m_decodingQueue.front()) { RemoveAU(frame->GetAU(0)); RemoveAU(frame->GetAU(1)); m_decodingQueue.pop_front(); } else { RemoveAU(frame->GetAU(0)); RemoveAU(frame->GetAU(1)); m_decodingQueue.remove(frame); } frame->CompleteDecoding(); } void TaskBroker::SwitchCurrentAU() { if (!m_FirstAU || !m_FirstAU->IsCompleted()) return; DEBUG_PRINT((VM_STRING("Switch current AU - is_completed %d, poc - %d, m_FirstAU - %X\n"), m_FirstAU->IsCompleted(), m_FirstAU->m_pFrame->m_PicOrderCnt[0], m_FirstAU)); while (m_FirstAU) { if (!IsFrameCompleted(m_FirstAU->m_pFrame)) { if (m_FirstAU->IsCompleted()) { m_FirstAU = m_FirstAU->GetNextAU(); assert(!m_FirstAU || !IsFrameCompleted(m_FirstAU->m_pFrame)); continue; } m_FirstAU->SetPrevAU(0); H264DecoderFrameInfo * temp = m_FirstAU; for (; temp; temp = temp->GetNextAU()) { temp->SetRefAU(0); if (temp->IsReference()) break; } break; } H264DecoderFrameInfo* completed = m_FirstAU; m_FirstAU = m_FirstAU->GetNextAU(); if (m_FirstAU && m_FirstAU->m_pFrame == completed->m_pFrame) m_FirstAU = m_FirstAU->GetNextAU(); CompleteFrame(completed->m_pFrame); } InitAUs(); } void TaskBroker::Start() { AutomaticUMCMutex guard(m_mGuard); FrameQueue::iterator iter = m_decodingQueue.begin(); for (; iter != m_decodingQueue.end(); ++iter) { H264DecoderFrame * frame = *iter; if (IsFrameCompleted(frame)) { CompleteFrame(frame); iter = m_decodingQueue.begin(); if (iter == m_decodingQueue.end()) // avoid ++iter operation break; } } InitAUs(); DEBUG_PRINT((VM_STRING("Start\n"))); } H264DecoderFrameInfo * TaskBroker::FindAU() { FrameQueue::iterator iter = m_decodingQueue.begin(); FrameQueue::iterator end_iter = m_decodingQueue.end(); for (; iter != end_iter; ++iter) { H264DecoderFrame * frame = *iter; H264DecoderFrameInfo *slicesInfo = frame->GetAU(0); if (slicesInfo->GetStatus() == H264DecoderFrameInfo::STATUS_FILLED) return slicesInfo; if (slicesInfo->IsField() && frame->GetAU(1)->GetStatus() == H264DecoderFrameInfo::STATUS_FILLED) return frame->GetAU(1); } return 0; } void TaskBroker::InitAUs() { H264DecoderFrameInfo * pPrev; H264DecoderFrameInfo * refAU; if (!m_FirstAU) { m_FirstAU = FindAU(); if (!m_FirstAU) return; if (!PrepareFrame(m_FirstAU->m_pFrame)) { m_FirstAU = 0; return; } m_FirstAU->SetStatus(H264DecoderFrameInfo::STATUS_STARTED); pPrev = m_FirstAU; m_FirstAU->SetPrevAU(0); m_FirstAU->SetNextAU(0); m_FirstAU->SetRefAU(0); refAU = 0; if (m_FirstAU->IsReference()) { refAU = m_FirstAU; } } else { pPrev = m_FirstAU; refAU = 0; pPrev->SetRefAU(0); pPrev->SetPrevAU(0); if (m_FirstAU->IsReference()) { refAU = pPrev; } while (pPrev->GetNextAU()) { pPrev = pPrev->GetNextAU(); if (!refAU) pPrev->SetRefAU(0); if (pPrev->IsReference()) { refAU = pPrev; } }; } H264DecoderFrameInfo * pTemp = FindAU(); for (; pTemp; ) { if (!PrepareFrame(pTemp->m_pFrame)) { pPrev->SetNextAU(0); break; } if (pPrev->IsInterviewReference() && pPrev != refAU) { if (pPrev->m_pFrame->m_viewId != pTemp->m_pFrame->m_viewId) { pPrev->SetReference(true); refAU = pPrev; if (pPrev->GetPrevAU() && pPrev->m_pFrame == pPrev->GetPrevAU()->m_pFrame) { pPrev->GetPrevAU()->SetReference(true); pPrev->SetRefAU(pPrev->GetPrevAU()); } } } pTemp->SetStatus(H264DecoderFrameInfo::STATUS_STARTED); pTemp->SetNextAU(0); pTemp->SetPrevAU(pPrev); /*if (pTemp->IsIntraAU()) pTemp->SetRefAU(0); else*/ pTemp->SetRefAU(refAU); if (pTemp->IsReference()) { refAU = pTemp; } pPrev->SetNextAU(pTemp); pPrev = pTemp; pTemp = FindAU(); } } bool TaskBroker::IsFrameCompleted(H264DecoderFrame * pFrame) { if (!pFrame) return true; if (!pFrame->GetAU(0)->IsCompleted()) return false; //pFrame->GetAU(0)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); //quuu H264DecoderFrameInfo::FillnessStatus status1 = pFrame->GetAU(1)->GetStatus(); bool ret; switch (status1) { case H264DecoderFrameInfo::STATUS_NONE: ret = true; break; case H264DecoderFrameInfo::STATUS_NOT_FILLED: ret = false; break; case H264DecoderFrameInfo::STATUS_COMPLETED: ret = true; break; default: ret = pFrame->GetAU(1)->IsCompleted(); break; } return ret; } bool TaskBroker::GetNextTask(H264Task *pTask) { return GetNextTaskInternal(pTask); } // bool TaskBroker::GetNextTask(H264Task *pTask) void TaskBroker::AddPerformedTask(H264Task *) { // nothing to do } // void TaskBroker::AddPerformedTask(H264Task *pTask) bool TaskBroker::IsEnoughForStartDecoding(bool ) { AutomaticUMCMutex guard(m_mGuard); InitAUs(); return m_FirstAU != 0; } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE umc_h264_task_supplier.cpp000066400000000000000000004022671443134507600330650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include #include #include #include "mfx_trace.h" #include "umc_h264_task_supplier.h" #include "umc_h264_frame_list.h" #include "umc_h264_nal_spl.h" #include "umc_h264_bitstream_headers.h" #include "umc_h264_task_broker.h" #include "umc_h264_dec_defs_dec.h" #include "umc_structures.h" #include "umc_frame_data.h" #include "umc_h264_notify.h" #include "umc_h264_dec_debug.h" using namespace UMC_H264_DECODER; namespace UMC { inline void SetDecodeErrorTypes(NAL_Unit_Type nalUnit, mfxExtDecodeErrorReport *pDecodeErrorReport) { switch (nalUnit) { case NAL_UT_SPS: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_SPS; break; case NAL_UT_PPS: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_PPS; break; default: break; }; } /****************************************************************************************************/ // DPBOutput class routine /****************************************************************************************************/ DPBOutput::DPBOutput() { Reset(); } void DPBOutput::Reset(bool disableDelayFeature) { m_isUseFlags.use_payload_sei_delay = 1; m_isUseFlags.use_pic_order_cnt_type = 1; if (disableDelayFeature) { m_isUseFlags.use_payload_sei_delay = 0; m_isUseFlags.use_pic_order_cnt_type = 0; } } bool DPBOutput::IsUseDelayOutputValue() const { return IsUseSEIDelayOutputValue() || IsUsePicOrderCnt(); } bool DPBOutput::IsUseSEIDelayOutputValue() const { return m_isUseFlags.use_payload_sei_delay != 0; } bool DPBOutput::IsUsePicOrderCnt() const { return m_isUseFlags.use_pic_order_cnt_type != 0; } void DPBOutput::OnNewSps(H264SeqParamSet * sps) { if (sps && sps->pic_order_cnt_type != 2) { m_isUseFlags.use_pic_order_cnt_type = 0; } } int32_t DPBOutput::GetDPBOutputDelay(H264SEIPayLoad * payload) { if (IsUsePicOrderCnt()) return 0; if (!payload) { m_isUseFlags.use_payload_sei_delay = 0; return INVALID_DPB_OUTPUT_DELAY; } if (IsUseSEIDelayOutputValue()) { if (payload->SEI_messages.pic_timing.dpb_output_delay != 0) m_isUseFlags.use_payload_sei_delay = 0; return payload->SEI_messages.pic_timing.dpb_output_delay; } return INVALID_DPB_OUTPUT_DELAY; } /****************************************************************************************************/ // SVC extension class routine /****************************************************************************************************/ SVC_Extension::SVC_Extension() : MVC_Extension() , m_dependency_id(H264_MAX_DEPENDENCY_ID) , m_quality_id(H264_MAX_QUALITY_ID) { } SVC_Extension::~SVC_Extension() { Reset(); } void SVC_Extension::Reset() { MVC_Extension::Reset(); m_quality_id = 15; m_dependency_id = 7; } void SVC_Extension::Close() { SVC_Extension::Reset(); MVC_Extension::Close(); } void SVC_Extension::SetSVCTargetLayer(uint32_t dependency_id, uint32_t quality_id, uint32_t temporal_id) { m_dependency_id = dependency_id; m_quality_id = quality_id; m_temporal_id = temporal_id; } bool SVC_Extension::IsShouldSkipSlice(H264NalExtension *nal_ext) { if (!nal_ext) return true; if (!nal_ext->svc_extension_flag) return MVC_Extension::IsShouldSkipSlice(nal_ext); //if (nal_ext->svc.discardable_flag) // return true; if (nal_ext->svc.temporal_id > m_temporal_id) return true; if (nal_ext->svc.priority_id > m_priority_id) return true; if (nal_ext->svc.quality_id > m_quality_id) return true; if (nal_ext->svc.dependency_id > m_dependency_id) return true; return false; } bool SVC_Extension::IsShouldSkipSlice(H264Slice * slice) { return IsShouldSkipSlice(&slice->GetSliceHeader()->nal_ext); } void SVC_Extension::ChooseLevelIdc(const H264SeqParamSetSVCExtension * extension, uint8_t baseViewLevelIDC, uint8_t extensionLevelIdc) { if (m_level_idc) return; m_level_idc = std::max({baseViewLevelIDC, extensionLevelIdc, extension->level_idc}); assert(m_level_idc != 0); } /****************************************************************************************************/ // DecReferencePictureMarking /****************************************************************************************************/ DecReferencePictureMarking::DecReferencePictureMarking() : m_isDPBErrorFound(0) , m_frameCount(0) { } void DecReferencePictureMarking::Reset() { m_frameCount = 0; m_isDPBErrorFound = 0; m_commandsList.clear(); } void DecReferencePictureMarking::ResetError() { m_isDPBErrorFound = 0; } uint32_t DecReferencePictureMarking::GetDPBError() const { return m_isDPBErrorFound; } bool IsDecRefPicMarkingEquals(const H264SEIPayLoadBase::SEIMessages::DecRefPicMarkingRepetition *decRefPicMarking1, const H264SEIPayLoadBase::SEIMessages::DecRefPicMarkingRepetition *decRefPicMarking2) { if (!decRefPicMarking1 || !decRefPicMarking2) return true; if (decRefPicMarking1->original_idr_flag != decRefPicMarking2->original_idr_flag || decRefPicMarking1->original_frame_num != decRefPicMarking2->original_frame_num || decRefPicMarking1->original_field_pic_flag != decRefPicMarking2->original_field_pic_flag || decRefPicMarking1->original_bottom_field_flag != decRefPicMarking2->original_bottom_field_flag || decRefPicMarking1->long_term_reference_flag != decRefPicMarking2->long_term_reference_flag) return false; if (decRefPicMarking1->adaptiveMarkingInfo.num_entries != decRefPicMarking2->adaptiveMarkingInfo.num_entries) return false; for (uint32_t i = 0; i < decRefPicMarking1->adaptiveMarkingInfo.num_entries; i++) { if (decRefPicMarking1->adaptiveMarkingInfo.value[i] != decRefPicMarking2->adaptiveMarkingInfo.value[i] || decRefPicMarking1->adaptiveMarkingInfo.mmco[i] != decRefPicMarking2->adaptiveMarkingInfo.mmco[i]) return false; } return true; } Status DecReferencePictureMarking::CheckSEIRepetition(ViewItem &view, H264SEIPayLoad *payload) { Status umcRes = UMC_OK; if (!payload || payload->payLoadType != SEI_DEC_REF_PIC_MARKING_TYPE) return UMC_OK; H264DecoderFrame * pFrame = 0; for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { if (pCurr->FrameNum() == payload->SEI_messages.dec_ref_pic_marking_repetition.original_frame_num) { pFrame = pCurr; break; } } if (!pFrame) return UMC_OK; const H264SEIPayLoadBase::SEIMessages::DecRefPicMarkingRepetition *forCheck = pFrame->GetAU(0)->GetDecRefPicMarking(); if (payload->SEI_messages.dec_ref_pic_marking_repetition.original_field_pic_flag) { forCheck = pFrame->GetAU(pFrame->GetNumberByParity(payload->SEI_messages.dec_ref_pic_marking_repetition.original_bottom_field_flag))->GetDecRefPicMarking(); } if (!IsDecRefPicMarkingEquals(&payload->SEI_messages.dec_ref_pic_marking_repetition, forCheck)) { pFrame->SetErrorFlagged(ERROR_FRAME_DPB); m_isDPBErrorFound = 1; return UMC_ERR_FAILED; } return umcRes; } void DecReferencePictureMarking::CheckSEIRepetition(ViewItem &view, H264DecoderFrame * frame) { bool isEqual = false; if (isEqual) return; DPBCommandsList::iterator end_iter = m_commandsList.end(); H264DecoderFrame * temp = 0; bool wasFrame = false; for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { pCurr->IncrementReference(); pCurr->IncrementReference(); } { DPBCommandsList::reverse_iterator rev_iter = m_commandsList.rbegin(); DPBCommandsList::reverse_iterator rev_end_iter = m_commandsList.rend(); for (; rev_iter != rev_end_iter; ++rev_iter) { DPBChangeItem& item = *rev_iter; if (item.m_pCurrentFrame == frame) { wasFrame = true; Undo(frame); break; } if (temp != item.m_pCurrentFrame) { temp = 0; } if (!temp) { temp = item.m_pCurrentFrame; Undo(temp); } } } bool start = false; temp = 0; DPBCommandsList::iterator iter = m_commandsList.begin(); // stl issue. we can't reuse iterator for (; iter != end_iter; ++iter) { DPBChangeItem& item = *iter; if (item.m_pCurrentFrame == frame) { Redo(frame); start = true; break; } if (!start && wasFrame) continue; if (temp != item.m_pCurrentFrame) { temp = 0; } if (!temp) { temp = item.m_pCurrentFrame; Redo(temp); } } for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { pCurr->DecrementReference(); pCurr->DecrementReference(); } } void DecReferencePictureMarking::Undo(const H264DecoderFrame * frame) { MakeChange(true, frame); } void DecReferencePictureMarking::Redo(const H264DecoderFrame * frame) { MakeChange(false, frame); } void DecReferencePictureMarking::MakeChange(bool isUndo, const H264DecoderFrame * frame) { DPBCommandsList::iterator iter = m_commandsList.begin(); DPBCommandsList::iterator end_iter = m_commandsList.end(); for (; iter != end_iter; ++iter) { DPBChangeItem& item = *iter; if (item.m_pCurrentFrame == frame) { MakeChange(isUndo, &item); } } } void DecReferencePictureMarking::RemoveOld() { if (!m_commandsList.size()) { m_frameCount = 0; return; } Remove(m_commandsList.front().m_pCurrentFrame); } #ifdef _DEBUG void DecReferencePictureMarking::DebugPrintItems() { printf("==================================\n"); DPBCommandsList::iterator iter = m_commandsList.begin(); // stl issue. we can't reuse iterator for (; iter != m_commandsList.end(); ++iter) { DPBChangeItem& item = *iter; printf("current - %d, ref - %d\n", item.m_pCurrentFrame->m_PicOrderCnt[0], item.m_pRefFrame->m_PicOrderCnt[0]); } printf("==================================\n"); } #endif void DecReferencePictureMarking::Remove(H264DecoderFrame * frame) { //printf("remove frame - %d\n", frame->m_PicOrderCnt[0]); //DebugPrintItems(); DPBCommandsList::iterator iter = m_commandsList.begin(); DPBCommandsList::iterator end_iter = m_commandsList.end(); DPBCommandsList::iterator start = m_commandsList.end(); DPBCommandsList::iterator end = m_commandsList.end(); for (; iter != end_iter; ++iter) { DPBChangeItem& item = *iter; if (start == m_commandsList.end()) { if (item.m_pCurrentFrame == frame) { m_frameCount--; start = iter; } } else { if (item.m_pCurrentFrame != frame) { end = iter; break; } } } if (start != m_commandsList.end()) m_commandsList.erase(m_commandsList.begin(), end); iter = m_commandsList.begin(); for (; iter != m_commandsList.end(); ++iter) { DPBChangeItem& item = *iter; if (item.m_pRefFrame == frame) { m_commandsList.erase(iter); iter = m_commandsList.begin(); if (iter == m_commandsList.end()) // avoid ++iter operation break; } } //DebugPrintItems(); } DecReferencePictureMarking::DPBChangeItem* DecReferencePictureMarking::AddItemAndRun(H264DecoderFrame * currentFrame, H264DecoderFrame * refFrame, uint32_t flags) { DPBChangeItem* item = AddItem(m_commandsList, currentFrame, refFrame, flags); if (!item) return 0; Redo(item); return item; } DecReferencePictureMarking::DPBChangeItem* DecReferencePictureMarking::AddItem(DPBCommandsList & list, H264DecoderFrame * currentFrame, H264DecoderFrame * refFrame, uint32_t flags) { if (!currentFrame || !refFrame) return 0; DPBChangeItem item; item.m_pCurrentFrame = currentFrame; item.m_pRefFrame = refFrame; item.m_type.isShortTerm = (flags & SHORT_TERM) ? 1 : 0; item.m_type.isFrame = (flags & FULL_FRAME) ? 1 : 0; item.m_type.isSet = (flags & SET_REFERENCE) ? 1 : 0; item.m_type.isBottom = (flags & BOTTOM_FIELD) ? 1 : 0; if (CheckUseless(&item)) return 0; list.push_back(item); return &list.back(); } bool DecReferencePictureMarking::CheckUseless(DPBChangeItem * item) { if (!item) return true; if (item->m_type.isShortTerm) { if (item->m_type.isFrame) { return item->m_type.isSet ? (item->m_pRefFrame->isShortTermRef() == 3) : (!item->m_pRefFrame->isShortTermRef()); } else { return item->m_type.isSet ? item->m_pRefFrame->isShortTermRef(item->m_type.isBottom) : !item->m_pRefFrame->isShortTermRef(item->m_type.isBottom); } } else { if (item->m_type.isFrame) { return item->m_type.isSet ? item->m_pRefFrame->isLongTermRef() == 3 : !item->m_pRefFrame->isLongTermRef(); } else { return item->m_type.isSet ? item->m_pRefFrame->isLongTermRef(item->m_type.isBottom) : !item->m_pRefFrame->isLongTermRef(item->m_type.isBottom); } } } void DecReferencePictureMarking::MakeChange(bool isUndo, const DPBChangeItem * item) { if (!item) return; DPBChangeItem temp = *item; if (isUndo) { temp.m_type.isSet ^= 1; } item = &temp; int32_t savePSRef = item->m_pRefFrame->m_PictureStructureForRef; item->m_pRefFrame->m_PictureStructureForRef = item->m_pCurrentFrame->m_PictureStructureForDec; if (item->m_type.isFrame) { if (item->m_type.isShortTerm) { item->m_pRefFrame->SetisShortTermRef(item->m_type.isSet == 1, 0); item->m_pRefFrame->SetisShortTermRef(item->m_type.isSet == 1, 1); } else { item->m_pRefFrame->SetisLongTermRef(item->m_type.isSet == 1, 0); item->m_pRefFrame->SetisLongTermRef(item->m_type.isSet == 1, 1); } } else { if (item->m_type.isShortTerm) { item->m_pRefFrame->SetisShortTermRef(item->m_type.isSet == 1, item->m_type.isBottom); } else { item->m_pRefFrame->SetisLongTermRef(item->m_type.isSet == 1, item->m_type.isBottom); } } item->m_pRefFrame->m_PictureStructureForRef = savePSRef; } void DecReferencePictureMarking::Undo(const DPBChangeItem * item) { MakeChange(true, item); } void DecReferencePictureMarking::Redo(const DPBChangeItem * item) { MakeChange(false, item); } void DecReferencePictureMarking::SlideWindow(ViewItem &view, H264Slice * pSlice, int32_t field_index) { uint32_t NumShortTermRefs, NumLongTermRefs; const H264SeqParamSet* sps = pSlice->GetSeqParam(); // find out how many active reference frames currently in decoded // frames buffer view.GetDPBList(0)->countActiveRefs(NumShortTermRefs, NumLongTermRefs); while (NumShortTermRefs > 0 && (NumShortTermRefs + NumLongTermRefs >= sps->num_ref_frames) && !field_index) { // mark oldest short-term reference as unused assert(NumShortTermRefs > 0); H264DecoderFrame * pFrame = view.GetDPBList(0)->findOldestShortTermRef(); if (!pFrame) break; AddItemAndRun(pSlice->GetCurrentFrame(), pFrame, UNSET_REFERENCE | FULL_FRAME | SHORT_TERM); NumShortTermRefs--; } } Status DecReferencePictureMarking::UpdateRefPicMarking(ViewItem &view, H264DecoderFrame * pFrame, H264Slice * pSlice, int32_t field_index) { Status umcRes = UMC_OK; bool bCurrentisST = true; m_frameCount++; H264SliceHeader * sliceHeader = pSlice->GetSliceHeader(); // set MVC 'inter view flag' pFrame->SetInterViewRef(0 != sliceHeader->nal_ext.mvc.inter_view_flag, field_index); if (pFrame->m_bIFlag) { for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { if (pCurr->GetError() & ERROR_FRAME_SHORT_TERM_STUCK) { AddItemAndRun(pFrame, pCurr, UNSET_REFERENCE | FULL_FRAME | SHORT_TERM); } } } if (pFrame->m_bIDRFlag) { // mark all reference pictures as unused for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { if (pCurr->isShortTermRef() || pCurr->isLongTermRef()) { AddItemAndRun(pFrame, pCurr, UNSET_REFERENCE | FULL_FRAME | SHORT_TERM); AddItemAndRun(pFrame, pCurr, UNSET_REFERENCE | FULL_FRAME | LONG_TERM); } } if (sliceHeader->long_term_reference_flag) { AddItemAndRun(pFrame, pFrame, SET_REFERENCE | LONG_TERM | (field_index ? BOTTOM_FIELD : TOP_FIELD)); //pFrame->SetisLongTermRef(true, field_index); pFrame->setLongTermFrameIdx(0); view.MaxLongTermFrameIdx[0] = 0; } else { AddItemAndRun(pFrame, pFrame, SET_REFERENCE | SHORT_TERM | (field_index ? BOTTOM_FIELD : TOP_FIELD)); //pFrame->SetisShortTermRef(true, field_index); view.MaxLongTermFrameIdx[0] = -1; // no long term frame indices } bCurrentisST = false; } else { AdaptiveMarkingInfo* pAdaptiveMarkingInfo = pSlice->GetAdaptiveMarkingInfo(); // adaptive ref pic marking if (pAdaptiveMarkingInfo && pAdaptiveMarkingInfo->num_entries > 0) { for (uint32_t arpmmf_idx = 0; arpmmf_idx < pAdaptiveMarkingInfo->num_entries; arpmmf_idx++) { int32_t LongTermFrameIdx; int32_t picNum; H264DecoderFrame * pRefFrame = 0; int32_t field = 0; switch (pAdaptiveMarkingInfo->mmco[arpmmf_idx]) { case 1: // mark a short-term picture as unused for reference // Value is difference_of_pic_nums_minus1 picNum = pFrame->PicNum(field_index) - (pAdaptiveMarkingInfo->value[arpmmf_idx*2] + 1); pRefFrame = view.GetDPBList(0)->findShortTermPic(picNum, &field); AddItemAndRun(pFrame, pRefFrame, UNSET_REFERENCE | SHORT_TERM | (field ? BOTTOM_FIELD : TOP_FIELD)); break; case 2: // mark a long-term picture as unused for reference // value is long_term_pic_num picNum = pAdaptiveMarkingInfo->value[arpmmf_idx*2]; pRefFrame = view.GetDPBList(0)->findLongTermPic(picNum, &field); AddItemAndRun(pFrame, pRefFrame, UNSET_REFERENCE | LONG_TERM | (field ? BOTTOM_FIELD : TOP_FIELD)); break; case 3: // Assign a long-term frame idx to a short-term picture // Value is difference_of_pic_nums_minus1 followed by // long_term_frame_idx. Only this case uses 2 value entries. picNum = pFrame->PicNum(field_index) - (pAdaptiveMarkingInfo->value[arpmmf_idx*2] + 1); LongTermFrameIdx = pAdaptiveMarkingInfo->value[arpmmf_idx*2+1]; pRefFrame = view.GetDPBList(0)->findShortTermPic(picNum, &field); if (!pRefFrame) break; { H264DecoderFrame * longTerm = view.GetDPBList(0)->findLongTermRefIdx(LongTermFrameIdx); if (longTerm != pRefFrame) AddItemAndRun(pFrame, longTerm, UNSET_REFERENCE | LONG_TERM | FULL_FRAME); } AddItemAndRun(pFrame, pRefFrame, SET_REFERENCE | LONG_TERM | (field ? BOTTOM_FIELD : TOP_FIELD)); AddItemAndRun(pFrame, pRefFrame, UNSET_REFERENCE | SHORT_TERM | (field ? BOTTOM_FIELD : TOP_FIELD)); pRefFrame->setLongTermFrameIdx(LongTermFrameIdx); pRefFrame->UpdateLongTermPicNum(pRefFrame->m_PictureStructureForRef >= FRM_STRUCTURE ? 2 : pRefFrame->m_bottom_field_flag[field]); break; case 4: // Specify max long term frame idx // Value is max_long_term_frame_idx_plus1 // Set to "no long-term frame indices" (-1) when value == 0. view.MaxLongTermFrameIdx[0] = pAdaptiveMarkingInfo->value[arpmmf_idx*2] - 1; pRefFrame = view.GetDPBList(0)->findOldLongTermRef(view.MaxLongTermFrameIdx[0]); while (pRefFrame) { AddItemAndRun(pFrame, pRefFrame, UNSET_REFERENCE | LONG_TERM | FULL_FRAME); pRefFrame = view.GetDPBList(0)->findOldLongTermRef(view.MaxLongTermFrameIdx[0]); } break; case 5: // Mark all as unused for reference // no value for (H264DecoderFrame *pCurr = view.GetDPBList(0)->head(); pCurr; pCurr = pCurr->future()) { if (pCurr->isShortTermRef() || pCurr->isLongTermRef()) { AddItemAndRun(pFrame, pCurr, UNSET_REFERENCE | FULL_FRAME | SHORT_TERM); AddItemAndRun(pFrame, pCurr, UNSET_REFERENCE | FULL_FRAME | LONG_TERM); } } view.GetDPBList(0)->IncreaseRefPicListResetCount(pFrame); view.MaxLongTermFrameIdx[0] = -1; // no long term frame indices // set "previous" picture order count vars for future if (pFrame->m_PictureStructureForDec < FRM_STRUCTURE) { pFrame->setPicOrderCnt(0, field_index); pFrame->setPicNum(0, field_index); } else { int32_t poc = pFrame->PicOrderCnt(0, 3); pFrame->setPicOrderCnt(pFrame->PicOrderCnt(0, 1) - poc, 0); pFrame->setPicOrderCnt(pFrame->PicOrderCnt(1, 1) - poc, 1); pFrame->setPicNum(0, 0); pFrame->setPicNum(0, 1); } pFrame->m_bIDRFlag = true; view.GetPOCDecoder(0)->Reset(0); // set frame_num to zero for this picture, for correct // FrameNumWrap pFrame->setFrameNum(0); sliceHeader->frame_num = 0; break; case 6: // Assign long term frame idx to current picture // Value is long_term_frame_idx LongTermFrameIdx = pAdaptiveMarkingInfo->value[arpmmf_idx*2]; bCurrentisST = false; pRefFrame = view.GetDPBList(0)->findLongTermRefIdx(LongTermFrameIdx); if (pRefFrame != pFrame) AddItemAndRun(pFrame, pRefFrame, UNSET_REFERENCE | LONG_TERM | FULL_FRAME); AddItemAndRun(pFrame, pFrame, SET_REFERENCE | LONG_TERM | (field_index ? BOTTOM_FIELD : TOP_FIELD)); pFrame->setLongTermFrameIdx(LongTermFrameIdx); break; case 0: default: // invalid mmco command in bitstream assert(0); umcRes = UMC_ERR_INVALID_STREAM; } // switch } // for arpmmf_idx } } // not IDR picture if (bCurrentisST) { AdaptiveMarkingInfo* pAdaptiveMarkingInfo = pSlice->GetAdaptiveMarkingInfo(); if (pAdaptiveMarkingInfo && pAdaptiveMarkingInfo->num_entries > 0 && !field_index) { //with MMCO we could overflow DPB after we add current picture as short term //this case is not valid but could occure in broken streams and we try to handle it uint32_t NumShortTermRefs, NumLongTermRefs; view.GetDPBList(0)->countActiveRefs(NumShortTermRefs, NumLongTermRefs); const H264SeqParamSet* sps = pSlice->GetSeqParam(); if (NumShortTermRefs + NumLongTermRefs + 1 > sps->num_ref_frames) { DPBCommandsList::iterator f = m_commandsList.begin(), l = m_commandsList.end(); for (; f != l; ++f) if ((*f).m_type.isSet && !(*f).m_type.isShortTerm) break; if (f != l) { Undo(&(*f)); m_commandsList.erase(f); } } } if (sliceHeader->field_pic_flag && field_index) { } else { SlideWindow(view, pSlice, field_index); } AddItemAndRun(pFrame, pFrame, SET_REFERENCE | SHORT_TERM | (field_index ? BOTTOM_FIELD : TOP_FIELD)); } return umcRes; } void DecReferencePictureMarking::ResetUnusedFrames(ViewItem &view) { for (H264DecoderFrame *pTmp = view.GetDPBList(0)->head(); pTmp; pTmp = pTmp->future()) { if(!pTmp->isShortTermRef() && !pTmp->isLongTermRef() && pTmp->GetRefCounter() == 0 && pTmp->m_wasOutputted && pTmp->m_wasDisplayed) { pTmp->Reset(); } } } /****************************************************************************************************/ // /****************************************************************************************************/ static bool IsNeedSPSInvalidate(const H264SeqParamSet *old_sps, const H264SeqParamSet *new_sps) { if (!old_sps || !new_sps) return false; //if (new_sps->no_output_of_prior_pics_flag) // return true; if (old_sps->frame_width_in_mbs != new_sps->frame_width_in_mbs) return true; if (old_sps->frame_height_in_mbs != new_sps->frame_height_in_mbs) return true; if (old_sps->vui.max_dec_frame_buffering < new_sps->vui.max_dec_frame_buffering) return true; if (old_sps->chroma_format_idc != new_sps->chroma_format_idc) return true; if (old_sps->profile_idc != new_sps->profile_idc) return true; if (old_sps->bit_depth_luma != new_sps->bit_depth_luma) return true; if (old_sps->bit_depth_chroma != new_sps->bit_depth_chroma) return true; return false; } /****************************************************************************************************/ // MVC_Extension class routine /****************************************************************************************************/ MVC_Extension::MVC_Extension() : m_temporal_id(H264_MAX_TEMPORAL_ID) , m_priority_id(63) , m_level_idc(0) , m_currentDisplayView(BASE_VIEW) , m_currentView((uint32_t)INVALID_VIEW_ID) , m_decodingMode(UNKNOWN_DECODING_MODE) { Reset(); } MVC_Extension::~MVC_Extension() { Close(); } bool MVC_Extension::IsExtension() const { return m_decodingMode != AVC_DECODING_MODE; } Status MVC_Extension::Init() { MVC_Extension::Close(); Status umcRes = AllocateView((uint32_t)INVALID_VIEW_ID); if (UMC_OK != umcRes) { return umcRes; } return UMC_OK; } void MVC_Extension::Close() { MVC_Extension::Reset(); m_viewIDsList.clear(); m_views.clear(); } void MVC_Extension::Reset() { m_temporal_id = H264_MAX_TEMPORAL_ID; m_priority_id = 63; m_level_idc = 0; m_currentDisplayView = BASE_VIEW; m_currentView = (uint32_t)INVALID_VIEW_ID; m_decodingMode = UNKNOWN_DECODING_MODE; ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { iter->Reset(); } } ViewItem * MVC_Extension::FindView(int32_t viewId) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); // run over the list and try to find the corresponding view for (; iter != iter_end; ++iter) { ViewItem & item = *iter; if (item.viewId == viewId) { return &item; } } return NULL; } ViewItem & MVC_Extension::GetView(int32_t viewId) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); // run over the list and try to find the corresponding view for (; iter != iter_end; ++iter) { ViewItem & item = *iter; //if (viewId == INVALID_VIEW_ID && item.m_isDisplayable) // return &item; if (item.viewId == viewId) { return item; } } throw h264_exception(UMC_ERR_FAILED); //return NULL; } void MVC_Extension::MoveViewToHead(int32_t view_id) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); // run over the list and try to find the corresponding view for (; iter != iter_end; ++iter) { if (iter->viewId == view_id) { ViewItem item = *iter; ViewItem &front = m_views.front(); *iter = front; front = item; break; } } } ViewItem & MVC_Extension::GetViewByNumber(int32_t viewNum) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); // run over the list and try to find the corresponding view for (int32_t i = 0; iter != iter_end; ++iter, i++) { ViewItem & item = *iter; if (i == viewNum) return item; } throw h264_exception(UMC_ERR_FAILED); //return NULL; } int32_t MVC_Extension::GetBaseViewId() const { return BASE_VIEW; } int32_t MVC_Extension::GetViewCount() const { return (int32_t)m_views.size(); } bool MVC_Extension::IncreaseCurrentView() { bool isWrapped = false; for (size_t i = 0; i < m_views.size(); ++i) { m_currentDisplayView++; if (m_views.size() == m_currentDisplayView) { m_currentDisplayView = BASE_VIEW; isWrapped = true; } ViewItem & view = GetViewByNumber(m_currentDisplayView); if (view.m_isDisplayable) break; } return isWrapped; } void MVC_Extension::SetTemporalId(uint32_t temporalId) { m_temporal_id = temporalId; } Status MVC_Extension::SetViewList(const std::vector & targetView, const std::vector & dependencyList) { for (size_t i = 0; i < targetView.size(); i++) { m_viewIDsList.push_back(targetView[i]); } for (size_t i = 0; i < dependencyList.size(); i++) { Status umcRes = AllocateView(dependencyList[i]); if (UMC_OK != umcRes) { return umcRes; } ViewItem & viewItem = GetView(dependencyList[i]); viewItem.m_isDisplayable = false; m_viewIDsList.push_back(dependencyList[i]); } m_viewIDsList.sort(); m_viewIDsList.unique(); return UMC_OK; } uint32_t MVC_Extension::GetLevelIDC() const { return m_level_idc; } ViewItem & MVC_Extension::AllocateAndInitializeView(H264Slice * slice) { if (slice == nullptr) { throw h264_exception(UMC_ERR_NULL_PTR); } ViewItem * view = FindView(slice->GetSliceHeader()->nal_ext.mvc.view_id); if (view) return *view; Status umcRes = AllocateView(slice->GetSliceHeader()->nal_ext.mvc.view_id); if (UMC_OK != umcRes) { throw h264_exception(umcRes); } ViewItem &viewRef = GetView(slice->GetSliceHeader()->nal_ext.mvc.view_id); viewRef.SetDPBSize(const_cast(slice->m_pSeqParamSet), m_level_idc); return viewRef; } Status MVC_Extension::AllocateView(int32_t view_id) { // check error(s) if (((int32_t)H264_MAX_NUM_VIEW <= view_id) && (view_id != (int32_t)INVALID_VIEW_ID) ) { return UMC_ERR_INVALID_PARAMS; } // already allocated if (FindView(view_id)) { return UMC_OK; } if (FindView(INVALID_VIEW_ID)) { ViewItem &view = GetView((uint32_t)INVALID_VIEW_ID); view.viewId = view_id; return UMC_OK; } ViewItem view; try { // allocate DPB and POC counter for (uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { view.pDPB[i].reset(new H264DBPList()); view.pPOCDec[i].reset(new POCDecoder()); } view.viewId = view_id; view.maxDecFrameBuffering = 16; } catch(...) { return UMC_ERR_ALLOC; } // reset the variables m_views.push_back(view); return UMC_OK; } // Status AllocateView(uint32_t view_id) bool MVC_Extension::IsShouldSkipSlice(H264NalExtension *nal_ext) { // check is view at view_list; ViewIDsList::const_iterator iter = std::find(m_viewIDsList.begin(), m_viewIDsList.end(), nal_ext->mvc.view_id); if (iter == m_viewIDsList.end() && m_viewIDsList.size()) return true; if (nal_ext->mvc.temporal_id > m_temporal_id) return true; if (nal_ext->mvc.priority_id > m_priority_id) return true; return false; } bool MVC_Extension::IsShouldSkipSlice(H264Slice * slice) { bool isMVC = slice->GetSeqMVCParam() != 0; if (!isMVC) return false; return IsShouldSkipSlice(&slice->GetSliceHeader()->nal_ext); } void MVC_Extension::AnalyzeDependencies(const H264SeqParamSetMVCExtension *) { } void MVC_Extension::ChooseLevelIdc(const H264SeqParamSetMVCExtension * extension, uint8_t baseViewLevelIDC, uint8_t extensionLevelIdc) { if (m_level_idc) return; assert(extension->viewInfo.size() == extension->num_views_minus1 + 1); if (m_viewIDsList.empty()) { for (const auto & viewInfo : extension->viewInfo) { m_viewIDsList.push_back(viewInfo.view_id); } ViewIDsList::iterator iter = m_viewIDsList.begin(); ViewIDsList::iterator iter_end = m_viewIDsList.end(); for (; iter != iter_end; ++iter) { uint32_t targetView = *iter; ViewItem * view = FindView(targetView); if (!view) continue; view->m_isDisplayable = true; } } AnalyzeDependencies(extension); m_level_idc = 0; for (const auto & levelInfo : extension->levelInfo) { for (const auto & operationPoint : levelInfo.opsInfo) { bool foundAll = true; for (const auto & targetView : m_viewIDsList) { auto it = std::find_if(operationPoint.applicable_op_target_view_id.begin(), operationPoint.applicable_op_target_view_id.end(), [targetView](const uint16_t & item) { return item == targetView; }); if (it == operationPoint.applicable_op_target_view_id.end()) { foundAll = false; break; } } if (!foundAll) break; if (!m_level_idc || m_level_idc > levelInfo.level_idc) { m_level_idc = levelInfo.level_idc; } } } m_level_idc = std::max({baseViewLevelIDC, extensionLevelIdc, m_level_idc}); assert(m_level_idc != 0); } /****************************************************************************************************/ // Skipping class routine /****************************************************************************************************/ Skipping::Skipping() : m_VideoDecodingSpeed(0) , m_SkipCycle(1) , m_ModSkipCycle(1) , m_PermanentTurnOffDeblocking(0) , m_SkipFlag(0) , m_NumberOfSkippedFrames(0) { } Skipping::~Skipping() { } void Skipping::Reset() { m_VideoDecodingSpeed = 0; m_SkipCycle = 0; m_ModSkipCycle = 0; m_PermanentTurnOffDeblocking = 0; m_NumberOfSkippedFrames = 0; } void Skipping::PermanentDisableDeblocking(bool disable) { m_PermanentTurnOffDeblocking = disable ? 3 : 0; } bool Skipping::IsShouldSkipDeblocking(H264DecoderFrame * pFrame, int32_t field) { return (IS_SKIP_DEBLOCKING_MODE_PREVENTIVE || IS_SKIP_DEBLOCKING_MODE_PERMANENT || (IS_SKIP_DEBLOCKING_MODE_NON_REF && !pFrame->GetAU(field)->IsReference())); } bool Skipping::IsShouldSkipFrame(H264DecoderFrame * pFrame, int32_t /*field*/) { bool isShouldSkip = false; //bool isReference = pFrame->GetAU(field)->IsReference(); bool isReference0 = pFrame->GetAU(0)->IsReference(); bool isReference1 = pFrame->GetAU(1)->IsReference(); bool isReference = isReference0 || isReference1; if ((m_VideoDecodingSpeed > 0) && !isReference) { if ((m_SkipFlag % m_ModSkipCycle) == 0) { isShouldSkip = true; } m_SkipFlag++; if (m_SkipFlag >= m_SkipCycle) m_SkipFlag = 0; } if (isShouldSkip) m_NumberOfSkippedFrames++; return isShouldSkip; } void Skipping::ChangeVideoDecodingSpeed(int32_t & num) { m_VideoDecodingSpeed += num; if (m_VideoDecodingSpeed < 0) m_VideoDecodingSpeed = 0; if (m_VideoDecodingSpeed > 7) m_VideoDecodingSpeed = 7; num = m_VideoDecodingSpeed; int32_t deblocking_off = m_PermanentTurnOffDeblocking; if (m_VideoDecodingSpeed > 6) { m_SkipCycle = 1; m_ModSkipCycle = 1; m_PermanentTurnOffDeblocking = 2; } else if (m_VideoDecodingSpeed > 5) { m_SkipCycle = 1; m_ModSkipCycle = 1; m_PermanentTurnOffDeblocking = 0; } else if (m_VideoDecodingSpeed > 4) { m_SkipCycle = 3; m_ModSkipCycle = 2; m_PermanentTurnOffDeblocking = 1; } else if (m_VideoDecodingSpeed > 3) { m_SkipCycle = 3; m_ModSkipCycle = 2; m_PermanentTurnOffDeblocking = 0; } else if (m_VideoDecodingSpeed > 2) { m_SkipCycle = 2; m_ModSkipCycle = 2; m_PermanentTurnOffDeblocking = 0; } else if (m_VideoDecodingSpeed > 1) { m_SkipCycle = 3; m_ModSkipCycle = 3; m_PermanentTurnOffDeblocking = 0; } else if (m_VideoDecodingSpeed == 1) { m_SkipCycle = 4; m_ModSkipCycle = 4; m_PermanentTurnOffDeblocking = 0; } else { m_PermanentTurnOffDeblocking = 0; } if (deblocking_off == 3) m_PermanentTurnOffDeblocking = 3; } Skipping::SkipInfo Skipping::GetSkipInfo() const { Skipping::SkipInfo info; info.isDeblockingTurnedOff = (m_VideoDecodingSpeed == 5) || (m_VideoDecodingSpeed == 7); info.numberOfSkippedFrames = m_NumberOfSkippedFrames; return info; } /****************************************************************************************************/ // POCDecoder /****************************************************************************************************/ POCDecoder::POCDecoder() { Reset(); } POCDecoder::~POCDecoder() { } void POCDecoder::Reset(int32_t IDRFrameNum) { m_PicOrderCnt = 0; m_PicOrderCntMsb = 0; m_PicOrderCntLsb = 0; m_FrameNum = IDRFrameNum; m_PrevFrameRefNum = IDRFrameNum; m_FrameNumOffset = 0; m_TopFieldPOC = 0; m_BottomFieldPOC = 0; } void POCDecoder::DecodePictureOrderCount(const H264Slice *slice, int32_t frame_num) { const H264SliceHeader *sliceHeader = slice->GetSliceHeader(); const H264SeqParamSet* sps = slice->GetSeqParam(); int32_t uMaxFrameNum = (1<log2_max_frame_num); if (sps->pic_order_cnt_type == 0) { // pic_order_cnt type 0 int32_t CurrPicOrderCntMsb; int32_t MaxPicOrderCntLsb = sps->MaxPicOrderCntLsb; if ((sliceHeader->pic_order_cnt_lsb < m_PicOrderCntLsb) && ((m_PicOrderCntLsb - sliceHeader->pic_order_cnt_lsb) >= (MaxPicOrderCntLsb >> 1))) CurrPicOrderCntMsb = m_PicOrderCntMsb + MaxPicOrderCntLsb; else if ((sliceHeader->pic_order_cnt_lsb > m_PicOrderCntLsb) && ((sliceHeader->pic_order_cnt_lsb - m_PicOrderCntLsb) > (MaxPicOrderCntLsb >> 1))) CurrPicOrderCntMsb = m_PicOrderCntMsb - MaxPicOrderCntLsb; else CurrPicOrderCntMsb = m_PicOrderCntMsb; if (sliceHeader->nal_ref_idc) { // reference picture m_PicOrderCntMsb = CurrPicOrderCntMsb & (~(MaxPicOrderCntLsb - 1)); m_PicOrderCntLsb = sliceHeader->pic_order_cnt_lsb; } m_PicOrderCnt = CurrPicOrderCntMsb + sliceHeader->pic_order_cnt_lsb; if (sliceHeader->field_pic_flag == 0) { m_TopFieldPOC = CurrPicOrderCntMsb + sliceHeader->pic_order_cnt_lsb; m_BottomFieldPOC = m_TopFieldPOC + sliceHeader->delta_pic_order_cnt_bottom; } } // pic_order_cnt type 0 else if (sps->pic_order_cnt_type == 1) { // pic_order_cnt type 1 uint32_t i; uint32_t uAbsFrameNum; // frame # relative to last IDR pic uint32_t uPicOrderCycleCnt = 0; uint32_t uFrameNuminPicOrderCntCycle = 0; int32_t ExpectedPicOrderCnt = 0; int32_t ExpectedDeltaPerPicOrderCntCycle; uint32_t uNumRefFramesinPicOrderCntCycle = sps->num_ref_frames_in_pic_order_cnt_cycle; if (frame_num < m_FrameNum) m_FrameNumOffset += uMaxFrameNum; if (uNumRefFramesinPicOrderCntCycle != 0) uAbsFrameNum = m_FrameNumOffset + frame_num; else uAbsFrameNum = 0; if ((sliceHeader->nal_ref_idc == false) && (uAbsFrameNum > 0)) uAbsFrameNum--; if (uAbsFrameNum) { uPicOrderCycleCnt = (uAbsFrameNum - 1) / uNumRefFramesinPicOrderCntCycle; uFrameNuminPicOrderCntCycle = (uAbsFrameNum - 1) % uNumRefFramesinPicOrderCntCycle; } ExpectedDeltaPerPicOrderCntCycle = 0; for (i=0; i < uNumRefFramesinPicOrderCntCycle; i++) { ExpectedDeltaPerPicOrderCntCycle += sps->poffset_for_ref_frame[i]; } if (uAbsFrameNum) { ExpectedPicOrderCnt = uPicOrderCycleCnt * ExpectedDeltaPerPicOrderCntCycle; for (i=0; i<=uFrameNuminPicOrderCntCycle; i++) { ExpectedPicOrderCnt += sps->poffset_for_ref_frame[i]; } } else ExpectedPicOrderCnt = 0; if (sliceHeader->nal_ref_idc == false) ExpectedPicOrderCnt += sps->offset_for_non_ref_pic; m_PicOrderCnt = ExpectedPicOrderCnt + sliceHeader->delta_pic_order_cnt[0]; if( sliceHeader->field_pic_flag==0) { m_TopFieldPOC = ExpectedPicOrderCnt + sliceHeader->delta_pic_order_cnt[ 0 ]; m_BottomFieldPOC = m_TopFieldPOC + sps->offset_for_top_to_bottom_field + sliceHeader->delta_pic_order_cnt[ 1 ]; } else if( ! sliceHeader->bottom_field_flag) m_PicOrderCnt = ExpectedPicOrderCnt + sliceHeader->delta_pic_order_cnt[ 0 ]; else m_PicOrderCnt = ExpectedPicOrderCnt + sps->offset_for_top_to_bottom_field + sliceHeader->delta_pic_order_cnt[ 0 ]; } // pic_order_cnt type 1 else if (sps->pic_order_cnt_type == 2) { // pic_order_cnt type 2 int32_t iMaxFrameNum = (1<log2_max_frame_num); uint32_t uAbsFrameNum; // frame # relative to last IDR pic if (frame_num < m_FrameNum) m_FrameNumOffset += iMaxFrameNum; uAbsFrameNum = frame_num + m_FrameNumOffset; m_PicOrderCnt = uAbsFrameNum*2; if (sliceHeader->nal_ref_idc == false) m_PicOrderCnt--; m_TopFieldPOC = m_PicOrderCnt; m_BottomFieldPOC = m_PicOrderCnt; } // pic_order_cnt type 2 if (sliceHeader->nal_ref_idc) { m_PrevFrameRefNum = frame_num; } m_FrameNum = frame_num; } // decodePictureOrderCount int32_t POCDecoder::DetectFrameNumGap(const H264Slice *slice, bool ignore_gaps_allowed_flag) { const H264SeqParamSet* sps = slice->GetSeqParam(); if (!ignore_gaps_allowed_flag && sps->gaps_in_frame_num_value_allowed_flag != 1) return 0; const H264SliceHeader *sliceHeader = slice->GetSliceHeader(); int32_t uMaxFrameNum = (1<log2_max_frame_num); int32_t frameNumGap; if (sliceHeader->IdrPicFlag) return 0; // Capture any frame_num gap if (sliceHeader->frame_num != m_PrevFrameRefNum && sliceHeader->frame_num != (m_PrevFrameRefNum + 1) % uMaxFrameNum) { // note this could be negative if frame num wrapped if (sliceHeader->frame_num > m_PrevFrameRefNum - 1) { frameNumGap = (sliceHeader->frame_num - m_PrevFrameRefNum - 1) % uMaxFrameNum; } else { frameNumGap = (uMaxFrameNum - (m_PrevFrameRefNum + 1 - sliceHeader->frame_num)) % uMaxFrameNum; } } else { frameNumGap = 0; } return frameNumGap; } void POCDecoder::DecodePictureOrderCountFrameGap(H264DecoderFrame *pFrame, const H264SliceHeader *pSliceHeader, int32_t frameNum) { m_PrevFrameRefNum = frameNum; m_FrameNum = frameNum; if (pSliceHeader->field_pic_flag) { pFrame->setPicOrderCnt(m_PicOrderCnt, 0); pFrame->setPicOrderCnt(m_PicOrderCnt, 1); } else { pFrame->setPicOrderCnt(m_TopFieldPOC, 0); pFrame->setPicOrderCnt(m_BottomFieldPOC, 1); } } void POCDecoder::DecodePictureOrderCountFakeFrames(H264DecoderFrame *pFrame, const H264SliceHeader *pSliceHeader) { if (pSliceHeader->field_pic_flag) { pFrame->setPicOrderCnt(m_PicOrderCnt, 0); pFrame->setPicOrderCnt(m_PicOrderCnt, 1); } else { pFrame->setPicOrderCnt(m_TopFieldPOC, 0); pFrame->setPicOrderCnt(m_BottomFieldPOC, 1); } } void POCDecoder::DecodePictureOrderCountInitFrame(H264DecoderFrame *pFrame, int32_t fieldIdx) { //transfer previosly calculated PicOrdeCnts into current Frame if (pFrame->m_PictureStructureForRef < FRM_STRUCTURE) { pFrame->setPicOrderCnt(m_PicOrderCnt, fieldIdx); if (!fieldIdx) // temporally set same POC for second field pFrame->setPicOrderCnt(m_PicOrderCnt, 1); } else { pFrame->setPicOrderCnt(m_TopFieldPOC, 0); pFrame->setPicOrderCnt(m_BottomFieldPOC, 1); } } /****************************************************************************************************/ // SEI_Storer /****************************************************************************************************/ SEI_Storer::SEI_Storer() { m_offset = 0; Reset(); } SEI_Storer::~SEI_Storer() { Close(); } void SEI_Storer::Init() { Close(); m_data.resize(MAX_BUFFERED_SIZE); m_payloads.resize(START_ELEMENTS); m_offset = 0; m_lastUsed = 2; } void SEI_Storer::Close() { Reset(); m_data.clear(); m_payloads.clear(); } void SEI_Storer::Reset() { m_lastUsed = 2; for (uint32_t i = 0; i < m_payloads.size(); i++) { m_payloads[i].isUsed = 0; } } void SEI_Storer::SetFrame(H264DecoderFrame * frame, int32_t auIndex) { assert(frame); for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == 0 && m_payloads[i].isUsed && m_payloads[i].auID == auIndex) { m_payloads[i].frame = frame; } } } void SEI_Storer::SetAUID(int32_t auIndex) { for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].isUsed && m_payloads[i].auID == -1) { m_payloads[i].auID = auIndex; } } } void SEI_Storer::SetTimestamp(H264DecoderFrame * frame) { assert(frame); double ts = frame->m_dFrameTime; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == frame) { m_payloads[i].timestamp = ts; if (m_payloads[i].isUsed) m_payloads[i].isUsed = m_lastUsed; } } m_lastUsed++; } const SEI_Storer::SEI_Message * SEI_Storer::GetPayloadMessage() { SEI_Storer::SEI_Message * msg = 0; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].isUsed > 1) { if (!msg || msg->isUsed > m_payloads[i].isUsed || msg->inputID > m_payloads[i].inputID) { msg = &m_payloads[i]; } } } if (msg) { msg->isUsed = 0; msg->frame = 0; msg->auID = 0; msg->inputID = 0; } return msg; } SEI_Storer::SEI_Message* SEI_Storer::AddMessage(UMC::MediaDataEx *nalUnit, SEI_TYPE type, int32_t auIndex) { size_t sz = nalUnit->GetDataSize(); if (sz > (m_data.size() >> 2)) return 0; if (m_offset + sz > m_data.size()) { m_offset = 0; } // clear overwriting messages: for (uint32_t i = 0; i < m_payloads.size(); i++) { if (!m_payloads[i].isUsed) continue; SEI_Message & mmsg = m_payloads[i]; if ((m_offset + sz > mmsg.offset) && (m_offset < mmsg.offset + mmsg.msg_size)) { m_payloads[i].isUsed = 0; return 0; } } size_t freeSlot = 0; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (!m_payloads[i].isUsed) { freeSlot = i; break; } } if (m_payloads[freeSlot].isUsed) { if (m_payloads.size() >= MAX_ELEMENTS) return 0; m_payloads.push_back(SEI_Message()); freeSlot = m_payloads.size() - 1; } m_payloads[freeSlot].msg_size = sz; m_payloads[freeSlot].offset = m_offset; m_payloads[freeSlot].timestamp = 0; m_payloads[freeSlot].frame = 0; m_payloads[freeSlot].isUsed = 1; m_payloads[freeSlot].inputID = m_lastUsed++; m_payloads[freeSlot].data = &(m_data.front()) + m_offset; m_payloads[freeSlot].type = type; m_payloads[freeSlot].auID = auIndex; MFX_INTERNAL_CPY(&m_data[m_offset], (uint8_t*)nalUnit->GetDataPointer(), (uint32_t)sz); m_offset += sz; return &m_payloads[freeSlot]; } ViewItem::ViewItem() { viewId = 0; maxDecFrameBuffering = 0; maxNumReorderFrames = 16; // Max DPB size Reset(); } // ViewItem::ViewItem(void) ViewItem::ViewItem(const ViewItem &src) { Reset(); viewId = src.viewId; for (uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { pDPB[i].reset(src.pDPB[i].release()); pPOCDec[i].reset(src.pPOCDec[i].release()); MaxLongTermFrameIdx[i] = src.MaxLongTermFrameIdx[i]; } maxDecFrameBuffering = src.maxDecFrameBuffering; maxNumReorderFrames = src.maxNumReorderFrames; } // ViewItem::ViewItem(const ViewItem &src) ViewItem &ViewItem::operator =(const ViewItem &src) { Reset(); viewId = src.viewId; for (uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { pDPB[i].reset(src.pDPB[i].release()); pPOCDec[i].reset(src.pPOCDec[i].release()); MaxLongTermFrameIdx[i] = src.MaxLongTermFrameIdx[i]; } maxDecFrameBuffering = src.maxDecFrameBuffering; maxNumReorderFrames = src.maxNumReorderFrames; return *this; } ViewItem::~ViewItem() { Close(); } // ViewItem::ViewItem(void) Status ViewItem::Init(uint32_t view_id) { // release the object before initialization Close(); try { for (uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { // allocate DPB and POC counter pDPB[i].reset(new H264DBPList()); pPOCDec[i].reset(new POCDecoder()); } } catch(...) { return UMC_ERR_ALLOC; } // save the ID viewId = view_id; localFrameTime = 0; pCurFrame = 0; return UMC_OK; } // Status ViewItem::Init(uint32_t view_id) void ViewItem::Close(void) { // Reset the parameters before close Reset(); for (int32_t i = MAX_NUM_LAYERS - 1; i >= 0; i--) { if (pDPB[i].get()) { pDPB[i].reset(); } if (pPOCDec[i].get()) { pPOCDec[i].reset(); } MaxLongTermFrameIdx[i] = 0; } viewId = (uint32_t)INVALID_VIEW_ID; maxDecFrameBuffering = 1; } // void ViewItem::Close(void) void ViewItem::Reset(void) { for (int32_t i = MAX_NUM_LAYERS - 1; i >= 0; i--) { if (pDPB[i].get()) { pDPB[i]->Reset(); } if (pPOCDec[i].get()) { pPOCDec[i]->Reset(); } } pCurFrame = 0; localFrameTime = 0; m_isDisplayable = true; } // void ViewItem::Reset(void) void ViewItem::SetDPBSize(H264SeqParamSet *pSps, uint8_t & level_idc) { // calculate the new DPB size value maxDecFrameBuffering = CalculateDPBSize(level_idc ? level_idc : pSps->level_idc, pSps->frame_width_in_mbs * 16, pSps->frame_height_in_mbs * 16, pSps->num_ref_frames); maxDecFrameBuffering = pSps->vui.max_dec_frame_buffering ? pSps->vui.max_dec_frame_buffering : maxDecFrameBuffering; if (pSps->vui.max_dec_frame_buffering > maxDecFrameBuffering) pSps->vui.max_dec_frame_buffering = (uint8_t)maxDecFrameBuffering; // provide the new value to the DPBList for (uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { if (pDPB[i].get()) { pDPB[i]->SetDPBSize(maxDecFrameBuffering); } } if (pSps->vui.bitstream_restriction_flag) { maxNumReorderFrames = pSps->vui.num_reorder_frames; } else { // Regarding H264 Specification - E.2.1 VUI parameters semantics : // When the max_num_reorder_frames syntax element is not present, // the value of max_num_reorder_frames value shall be inferred as follows: if ((1 == pSps->constraint_set3_flag) && (H264VideoDecoderParams::H264_PROFILE_CAVLC444_INTRA == pSps->profile_idc || H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH == pSps->profile_idc || H264VideoDecoderParams::H264_PROFILE_HIGH == pSps->profile_idc || H264VideoDecoderParams::H264_PROFILE_HIGH10 == pSps->profile_idc || H264VideoDecoderParams::H264_PROFILE_HIGH422 == pSps->profile_idc || H264VideoDecoderParams::H264_PROFILE_HIGH444_PRED == pSps->profile_idc) ) { maxNumReorderFrames = 0; } else { maxNumReorderFrames = maxDecFrameBuffering; } } } // void ViewItem::SetDPBSize(const H264SeqParamSet *pSps) /****************************************************************************************************/ // TaskSupplier /****************************************************************************************************/ TaskSupplier::TaskSupplier() : AU_Splitter(&m_ObjHeap) , m_pSegmentDecoder(0) , m_iThreadNum(0) , m_local_delta_frame_time(0) , m_use_external_framerate(false) , m_pLastSlice(0) , m_pLastDisplayed(0) , m_pMemoryAllocator(0) , m_pFrameAllocator(0) , m_WaitForIDR(false) , m_DPBSizeEx(0) , m_frameOrder(0) , m_pTaskBroker(0) , m_UIDFrameCounter(0) , m_sei_messages(0) , m_isInitialized(false) , m_ignoreLevelConstrain(false) { } TaskSupplier::~TaskSupplier() { Close(); } Status TaskSupplier::Init(VideoDecoderParams *init) { if (NULL == init) return UMC_ERR_NULL_PTR; Close(); m_DPBSizeEx = 0; m_initializationParams = *init; int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); DPBOutput::Reset(m_iThreadNum != 1); AU_Splitter::Init(); Status umcRes = SVC_Extension::Init(); if (UMC_OK != umcRes) { return umcRes; } switch (m_initializationParams.info.profile) // after MVC_Extension::Init() { case 0: m_decodingMode = UNKNOWN_DECODING_MODE; break; case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: m_decodingMode = MVC_DECODING_MODE; break; default: m_decodingMode = AVC_DECODING_MODE; break; } // create slice decoder(s) m_pSegmentDecoder = new H264SegmentDecoderBase *[m_iThreadNum]; if (NULL == m_pSegmentDecoder) return UMC_ERR_ALLOC; memset(m_pSegmentDecoder, 0, sizeof(H264SegmentDecoderBase *) * m_iThreadNum); CreateTaskBroker(); m_pTaskBroker->Init(m_iThreadNum); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { if (UMC_OK != m_pSegmentDecoder[i]->Init(i)) return UMC_ERR_INIT; } m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } m_DPBSizeEx = m_iThreadNum; m_isInitialized = true; m_ignoreLevelConstrain = ((H264VideoDecoderParams *)init)->m_ignore_level_constrain; return UMC_OK; } Status TaskSupplier::PreInit(VideoDecoderParams *init) { if (m_isInitialized) return UMC_OK; if (NULL == init) return UMC_ERR_NULL_PTR; Close(); m_DPBSizeEx = 0; SVC_Extension::Init(); int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); AU_Splitter::Init(); DPBOutput::Reset(m_iThreadNum != 1); m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } m_DPBSizeEx = m_iThreadNum; m_ignoreLevelConstrain = ((H264VideoDecoderParams *)init)->m_ignore_level_constrain; return UMC_OK; } void TaskSupplier::Close() { if (m_pTaskBroker) { m_pTaskBroker->Release(); } // from reset { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { for (H264DecoderFrame *pFrame = iter->GetDPBList(0)->head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } } } if (m_pSegmentDecoder) { for (uint32_t i = 0; i < m_iThreadNum; i += 1) { delete m_pSegmentDecoder[i]; m_pSegmentDecoder[i] = 0; } } SVC_Extension::Close(); AU_Splitter::Close(); DPBOutput::Reset(m_iThreadNum != 1); DecReferencePictureMarking::Reset(); ErrorStatus::Reset(); if (m_pLastSlice) { m_pLastSlice->Release(); m_pLastSlice->DecrementReference(); m_pLastSlice = 0; } m_accessUnit.Release(); m_Headers.Reset(false); Skipping::Reset(); m_ObjHeap.Release(); m_frameOrder = 0; m_WaitForIDR = true; m_pLastDisplayed = 0; delete m_sei_messages; m_sei_messages = 0; // from reset delete[] m_pSegmentDecoder; m_pSegmentDecoder = 0; delete m_pTaskBroker; m_pTaskBroker = 0; m_iThreadNum = 0; m_DPBSizeEx = 1; m_isInitialized = false; } // void TaskSupplier::Close() void TaskSupplier::Reset() { if (m_pTaskBroker) m_pTaskBroker->Reset(); { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { for (H264DecoderFrame *pFrame = iter->GetDPBList(0)->head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } } } if (m_sei_messages) m_sei_messages->Reset(); SVC_Extension::Reset(); AU_Splitter::Reset(); DPBOutput::Reset(m_iThreadNum != 1); DecReferencePictureMarking::Reset(); m_accessUnit.Release(); ErrorStatus::Reset(); switch (m_initializationParams.info.profile) // after MVC_Extension::Init() { case 0: m_decodingMode = UNKNOWN_DECODING_MODE; break; case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: m_decodingMode = MVC_DECODING_MODE; break; default: m_decodingMode = AVC_DECODING_MODE; break; } if (m_pLastSlice) { m_pLastSlice->Release(); m_pLastSlice->DecrementReference(); m_pLastSlice = 0; } m_Headers.Reset(true); Skipping::Reset(); m_ObjHeap.Release(); m_frameOrder = 0; m_WaitForIDR = true; m_pLastDisplayed = 0; if (m_pTaskBroker) m_pTaskBroker->Init(m_iThreadNum); } void TaskSupplier::AfterErrorRestore() { if (m_pTaskBroker) m_pTaskBroker->Reset(); { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { for (H264DecoderFrame *pFrame = iter->GetDPBList(0)->head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } } } if (m_sei_messages) m_sei_messages->Reset(); SVC_Extension::Reset(); AU_Splitter::Reset(); DPBOutput::Reset(m_iThreadNum != 1); DecReferencePictureMarking::Reset(); m_accessUnit.Release(); ErrorStatus::Reset(); switch (m_initializationParams.info.profile) // after MVC_Extension::Init() { case 0: m_decodingMode = UNKNOWN_DECODING_MODE; break; case H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH: case H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH: m_decodingMode = MVC_DECODING_MODE; break; default: m_decodingMode = AVC_DECODING_MODE; break; } if (m_pLastSlice) { m_pLastSlice->Release(); m_pLastSlice->DecrementReference(); m_pLastSlice = 0; } m_Headers.Reset(true); Skipping::Reset(); m_ObjHeap.Release(); m_WaitForIDR = true; m_pLastDisplayed = 0; if (m_pTaskBroker) m_pTaskBroker->Init(m_iThreadNum); } Status TaskSupplier::GetInfo(VideoDecoderParams *lpInfo) { H264SeqParamSet *sps = m_Headers.m_SeqParams.GetCurrentHeader(); if (!sps) { return UMC_ERR_NOT_ENOUGH_DATA; } const H264PicParamSet *pps = m_Headers.m_PicParams.GetCurrentHeader(); lpInfo->info.clip_info.height = sps->frame_height_in_mbs * 16 - SubHeightC[sps->chroma_format_idc]*(2 - sps->frame_mbs_only_flag) * (sps->frame_cropping_rect_top_offset + sps->frame_cropping_rect_bottom_offset); lpInfo->info.clip_info.width = sps->frame_width_in_mbs * 16 - SubWidthC[sps->chroma_format_idc] * (sps->frame_cropping_rect_left_offset + sps->frame_cropping_rect_right_offset); if (0.0 < m_local_delta_frame_time) { lpInfo->info.framerate = 1.0 / m_local_delta_frame_time; } else { lpInfo->info.framerate = 0; } lpInfo->info.stream_type = H264_VIDEO; lpInfo->profile = sps->profile_idc; lpInfo->level = sps->level_idc; lpInfo->numThreads = m_iThreadNum; lpInfo->info.color_format = GetUMCColorFormat(sps->chroma_format_idc); lpInfo->info.profile = sps->profile_idc; lpInfo->info.level = sps->level_idc; if (sps->vui.aspect_ratio_idc == 255) { lpInfo->info.aspect_ratio_width = sps->vui.sar_width; lpInfo->info.aspect_ratio_height = sps->vui.sar_height; } uint32_t multiplier = 1 << (6 + sps->vui.bit_rate_scale); lpInfo->info.bitrate = sps->vui.bit_rate_value[0] * multiplier; if (sps->frame_mbs_only_flag) lpInfo->info.interlace_type = PROGRESSIVE; else { if (0 <= sps->offset_for_top_to_bottom_field) lpInfo->info.interlace_type = INTERLEAVED_TOP_FIELD_FIRST; else lpInfo->info.interlace_type = INTERLEAVED_BOTTOM_FIELD_FIRST; } H264VideoDecoderParams *lpH264Info = DynamicCast (lpInfo); if (lpH264Info) { // calculate the new DPB size value lpH264Info->m_DPBSize = CalculateDPBSize(sps->level_idc, sps->frame_width_in_mbs * 16, sps->frame_height_in_mbs * 16, sps->num_ref_frames) + m_DPBSizeEx; mfxSize sz; sz.width = sps->frame_width_in_mbs * 16; sz.height = sps->frame_height_in_mbs * 16; lpH264Info->m_fullSize = sz; if (pps) { lpH264Info->m_entropy_coding_type = pps->entropy_coding_mode; } lpH264Info->m_cropArea.top = (int16_t)(SubHeightC[sps->chroma_format_idc] * sps->frame_cropping_rect_top_offset * (2 - sps->frame_mbs_only_flag)); lpH264Info->m_cropArea.bottom = (int16_t)(SubHeightC[sps->chroma_format_idc] * sps->frame_cropping_rect_bottom_offset * (2 - sps->frame_mbs_only_flag)); lpH264Info->m_cropArea.left = (int16_t)(SubWidthC[sps->chroma_format_idc] * sps->frame_cropping_rect_left_offset); lpH264Info->m_cropArea.right = (int16_t)(SubWidthC[sps->chroma_format_idc] * sps->frame_cropping_rect_right_offset); } return UMC_OK; } Status TaskSupplier::DecodeSEI(NalUnit *nalUnit) { H264HeadersBitstream bitStream; try { H264MemoryPiece mem; mem.SetData(nalUnit); H264MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem, DEFAULT_NU_HEADER_TAIL_VALUE); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NAL_Unit_Type nal_unit_type; uint32_t nal_ref_idc; bitStream.GetNALUnitType(nal_unit_type, nal_ref_idc); do { H264SEIPayLoad m_SEIPayLoads; bitStream.ParseSEI(m_Headers, &m_SEIPayLoads); DEBUG_PRINT((VM_STRING("debug headers SEI - %d\n"), m_SEIPayLoads.payLoadType)); if (m_SEIPayLoads.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { m_UserData = m_SEIPayLoads; } else { m_Headers.m_SEIParams.AddHeader(&m_SEIPayLoads); } } while (bitStream.More_RBSP_Data()); } catch(...) { // nothing to do just catch it } return UMC_OK; } Status TaskSupplier::DecodeHeaders(NalUnit *nalUnit) { ViewItem *view = GetViewCount() ? &GetViewByNumber(BASE_VIEW) : 0; Status umcRes = UMC_OK; H264HeadersBitstream bitStream; try { H264MemoryPiece mem; mem.SetData(nalUnit); H264MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NAL_Unit_Type nal_unit_type; uint32_t nal_ref_idc; bitStream.GetNALUnitType(nal_unit_type, nal_ref_idc); switch(nal_unit_type) { // sequence parameter set case NAL_UT_SPS: { H264SeqParamSet sps; sps.seq_parameter_set_id = MAX_NUM_SEQ_PARAM_SETS; umcRes = bitStream.GetSequenceParamSet(&sps, m_ignoreLevelConstrain); if (umcRes != UMC_OK) { H264SeqParamSet * old_sps = m_Headers.m_SeqParams.GetHeader(sps.seq_parameter_set_id); if (old_sps) old_sps->errorFlags = 1; return UMC_ERR_INVALID_STREAM; } uint8_t newDPBsize = (uint8_t)CalculateDPBSize(sps.level_idc, sps.frame_width_in_mbs * 16, sps.frame_height_in_mbs * 16, sps.num_ref_frames); bool isNeedClean = sps.vui.max_dec_frame_buffering == 0; sps.vui.max_dec_frame_buffering = sps.vui.max_dec_frame_buffering ? sps.vui.max_dec_frame_buffering : newDPBsize; if (sps.vui.max_dec_frame_buffering > newDPBsize) sps.vui.max_dec_frame_buffering = newDPBsize; if (sps.num_ref_frames > newDPBsize) sps.num_ref_frames = newDPBsize; const H264SeqParamSet * old_sps = m_Headers.m_SeqParams.GetCurrentHeader(); bool newResolution = false; if (IsNeedSPSInvalidate(old_sps, &sps)) { newResolution = true; } if (isNeedClean) sps.vui.max_dec_frame_buffering = 0; DEBUG_PRINT((VM_STRING("debug headers SPS - %d, num_ref_frames - %d \n"), sps.seq_parameter_set_id, sps.num_ref_frames)); H264SeqParamSet * temp = m_Headers.m_SeqParams.GetHeader(sps.seq_parameter_set_id); m_Headers.m_SeqParams.AddHeader(&sps); // Validate the incoming bitstream's image dimensions. temp = m_Headers.m_SeqParams.GetHeader(sps.seq_parameter_set_id); if (!temp) { return UMC_ERR_NULL_PTR; } if (view) { uint8_t newDPBsizeL = (uint8_t)CalculateDPBSize(m_level_idc ? m_level_idc : temp->level_idc, sps.frame_width_in_mbs * 16, sps.frame_height_in_mbs * 16, sps.num_ref_frames); temp->vui.max_dec_frame_buffering = temp->vui.max_dec_frame_buffering ? temp->vui.max_dec_frame_buffering : newDPBsizeL; if (temp->vui.max_dec_frame_buffering > newDPBsizeL) temp->vui.max_dec_frame_buffering = newDPBsizeL; } m_pNALSplitter->SetSuggestedSize(CalculateSuggestedSize(&sps)); if (!temp->vui.timing_info_present_flag || m_use_external_framerate) { temp->vui.num_units_in_tick = 90000; temp->vui.time_scale = (uint32_t)(2*90000 / m_local_delta_frame_time); } m_local_delta_frame_time = 1 / ((0.5 * temp->vui.time_scale) / temp->vui.num_units_in_tick); ErrorStatus::isSPSError = 0; if (newResolution) return UMC_NTF_NEW_RESOLUTION; } break; case NAL_UT_SPS_EX: { H264SeqParamSetExtension sps_ex; umcRes = bitStream.GetSequenceParamSetExtension(&sps_ex); if (umcRes != UMC_OK) return UMC_ERR_INVALID_STREAM; m_Headers.m_SeqExParams.AddHeader(&sps_ex); } break; // picture parameter set case NAL_UT_PPS: { H264PicParamSet pps; // set illegal id pps.pic_parameter_set_id = MAX_NUM_PIC_PARAM_SETS; // Get id umcRes = bitStream.GetPictureParamSetPart1(&pps); if (UMC_OK != umcRes) { H264PicParamSet * old_pps = m_Headers.m_PicParams.GetHeader(pps.pic_parameter_set_id); if (old_pps) old_pps->errorFlags = 1; return UMC_ERR_INVALID_STREAM; } H264SeqParamSet *refSps = m_Headers.m_SeqParams.GetHeader(pps.seq_parameter_set_id); uint32_t prevActivePPS = m_Headers.m_PicParams.GetCurrentID(); if (!refSps || refSps->seq_parameter_set_id >= MAX_NUM_SEQ_PARAM_SETS) { refSps = m_Headers.m_SeqParamsMvcExt.GetHeader(pps.seq_parameter_set_id); if (!refSps || refSps->seq_parameter_set_id >= MAX_NUM_SEQ_PARAM_SETS) { refSps = m_Headers.m_SeqParamsSvcExt.GetHeader(pps.seq_parameter_set_id); if (!refSps || refSps->seq_parameter_set_id >= MAX_NUM_SEQ_PARAM_SETS) return UMC_ERR_INVALID_STREAM; } } // Get rest of pic param set umcRes = bitStream.GetPictureParamSetPart2(&pps, refSps); if (UMC_OK != umcRes) { H264PicParamSet * old_pps = m_Headers.m_PicParams.GetHeader(pps.pic_parameter_set_id); if (old_pps) old_pps->errorFlags = 1; return UMC_ERR_INVALID_STREAM; } DEBUG_PRINT((VM_STRING("debug headers PPS - %d - SPS - %d\n"), pps.pic_parameter_set_id, pps.seq_parameter_set_id)); m_Headers.m_PicParams.AddHeader(&pps); //m_Headers.m_SeqParams.SetCurrentID(pps.seq_parameter_set_id); // in case of MVC restore previous active PPS if ((H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH == refSps->profile_idc) || (H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH == refSps->profile_idc)) { m_Headers.m_PicParams.SetCurrentID(prevActivePPS); } ErrorStatus::isPPSError = 0; } break; // subset sequence parameter set case NAL_UT_SUBSET_SPS: { if (!IsExtension()) break; H264SeqParamSet sps; umcRes = bitStream.GetSequenceParamSet(&sps); if (UMC_OK != umcRes) { return UMC_ERR_INVALID_STREAM; } m_pNALSplitter->SetSuggestedSize(CalculateSuggestedSize(&sps)); DEBUG_PRINT((VM_STRING("debug headers SUBSET SPS - %d, profile_idc - %d, level_idc - %d, num_ref_frames - %d \n"), sps.seq_parameter_set_id, sps.profile_idc, sps.level_idc, sps.num_ref_frames)); if ((sps.profile_idc == H264VideoDecoderParams::H264_PROFILE_SCALABLE_BASELINE) || (sps.profile_idc == H264VideoDecoderParams::H264_PROFILE_SCALABLE_HIGH)) { H264SeqParamSetSVCExtension spsSvcExt; H264SeqParamSet * sps_temp = &spsSvcExt; *sps_temp = sps; umcRes = bitStream.GetSequenceParamSetSvcExt(&spsSvcExt); if (UMC_OK != umcRes) { return UMC_ERR_INVALID_STREAM; } const H264SeqParamSetSVCExtension * old_sps = m_Headers.m_SeqParamsSvcExt.GetCurrentHeader(); bool newResolution = false; if (old_sps && old_sps->profile_idc != spsSvcExt.profile_idc) { newResolution = true; } m_Headers.m_SeqParamsSvcExt.AddHeader(&spsSvcExt); SVC_Extension::ChooseLevelIdc(&spsSvcExt, sps.level_idc, sps.level_idc); if (view) { view->SetDPBSize(&sps, m_level_idc); } if (newResolution) return UMC_NTF_NEW_RESOLUTION; } // decode additional parameters if ((H264VideoDecoderParams::H264_PROFILE_MULTIVIEW_HIGH == sps.profile_idc) || (H264VideoDecoderParams::H264_PROFILE_STEREO_HIGH == sps.profile_idc)) { H264SeqParamSetMVCExtension spsMvcExt; H264SeqParamSet * sps_temp = &spsMvcExt; *sps_temp = sps; // skip one bit bitStream.Get1Bit(); // decode MVC extension umcRes = bitStream.GetSequenceParamSetMvcExt(&spsMvcExt); if (UMC_OK != umcRes) { return UMC_ERR_INVALID_STREAM; } const H264SeqParamSetMVCExtension * old_sps = m_Headers.m_SeqParamsMvcExt.GetCurrentHeader(); bool newResolution = false; if (old_sps && old_sps->profile_idc != spsMvcExt.profile_idc) { newResolution = true; } DEBUG_PRINT((VM_STRING("debug headers SUBSET SPS MVC ext - %d \n"), sps.seq_parameter_set_id)); m_Headers.m_SeqParamsMvcExt.AddHeader(&spsMvcExt); MVC_Extension::ChooseLevelIdc(&spsMvcExt, sps.level_idc, sps.level_idc); if (view) { view->SetDPBSize(&sps, m_level_idc); } if (newResolution) return UMC_NTF_NEW_RESOLUTION; } } break; // decode a prefix nal unit case NAL_UT_PREFIX: { umcRes = bitStream.GetNalUnitPrefix(&m_Headers.m_nalExtension, nal_ref_idc); if (UMC_OK != umcRes) { m_Headers.m_nalExtension.extension_present = 0; return UMC_ERR_INVALID_STREAM; } } break; default: break; } } catch(const h264_exception & ex) { return ex.GetStatus(); } catch(...) { return UMC_ERR_INVALID_STREAM; } return UMC_OK; } // Status TaskSupplier::DecodeHeaders(MediaDataEx::_MediaDataEx *pSource, H264MemoryPiece * pMem) ////////////////////////////////////////////////////////////////////////////// // ProcessFrameNumGap // // A non-sequential frame_num has been detected. If the sequence parameter // set field gaps_in_frame_num_value_allowed_flag is non-zero then the gap // is OK and "non-existing" frames will be created to correctly fill the // gap. Otherwise the gap is an indication of lost frames and the need to // handle in a reasonable way. ////////////////////////////////////////////////////////////////////////////// Status TaskSupplier::ProcessFrameNumGap(H264Slice *pSlice, int32_t field, int32_t dId, int32_t maxDId) { ViewItem &view = GetView(pSlice->GetSliceHeader()->nal_ext.mvc.view_id); Status umcRes = UMC_OK; const H264SeqParamSet* sps = pSlice->GetSeqParam(); H264SliceHeader *sliceHeader = pSlice->GetSliceHeader(); uint32_t frameNumGap = view.GetPOCDecoder(0)->DetectFrameNumGap(pSlice); if (!frameNumGap) return UMC_OK; if (dId == maxDId) { if (frameNumGap > view.maxDecFrameBuffering) { frameNumGap = view.maxDecFrameBuffering; } } else { if (frameNumGap > sps->num_ref_frames) { frameNumGap = sps->num_ref_frames; } } int32_t uMaxFrameNum = (1<log2_max_frame_num); DEBUG_PRINT((VM_STRING("frame gap - %d\n"), frameNumGap)); // Fill the frame_num gap with non-existing frames. For each missing // frame: // - allocate a frame // - set frame num and pic num // - update FrameNumWrap for all reference frames // - use sliding window frame marking to free oldest reference // - mark the frame as short-term reference // The picture part of the generated frames is unimportant -- it will // not be used for reference. // set to first missing frame. Note that if frame number wrapped during // the gap, the first missing frame_num could be larger than the // current frame_num. If that happened, FrameNumGap will be negative. //assert((int32_t)sliceHeader->frame_num > frameNumGap); int32_t frame_num = sliceHeader->frame_num - frameNumGap; while ((frame_num != sliceHeader->frame_num) && (umcRes == UMC_OK)) { H264DecoderFrame *pFrame; { // allocate a frame // Traverse list for next disposable frame pFrame = GetFreeFrame(pSlice); // Did we find one? if (!pFrame) { return UMC_ERR_NOT_ENOUGH_BUFFER; } pFrame->IncrementReference(); m_UIDFrameCounter++; pFrame->m_UID = m_UIDFrameCounter; } frameNumGap--; if (sps->pic_order_cnt_type != 0) { int32_t tmp1 = sliceHeader->delta_pic_order_cnt[0]; int32_t tmp2 = sliceHeader->delta_pic_order_cnt[1]; sliceHeader->delta_pic_order_cnt[0] = sliceHeader->delta_pic_order_cnt[1] = 0; view.GetPOCDecoder(0)->DecodePictureOrderCount(pSlice, frame_num); sliceHeader->delta_pic_order_cnt[0] = tmp1; sliceHeader->delta_pic_order_cnt[1] = tmp2; } // Set frame num and pic num for the missing frame pFrame->setFrameNum(frame_num); view.GetPOCDecoder(0)->DecodePictureOrderCountFrameGap(pFrame, sliceHeader, frame_num); DEBUG_PRINT((VM_STRING("frame gap - frame_num = %d, poc = %d,%d added\n"), frame_num, pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1])); if (sliceHeader->field_pic_flag == 0) { pFrame->setPicNum(frame_num, 0); } else { pFrame->setPicNum(frame_num*2+1, 0); pFrame->setPicNum(frame_num*2+1, 1); } // Update frameNumWrap and picNum for all decoded frames H264DecoderFrame *pFrm; H264DecoderFrame * pHead = view.GetDPBList(0)->head(); for (pFrm = pHead; pFrm; pFrm = pFrm->future()) { // TBD: modify for fields pFrm->UpdateFrameNumWrap(frame_num, uMaxFrameNum, pFrame->m_PictureStructureForRef+ pFrame->m_bottom_field_flag[field]); } // sliding window ref pic marking // view2 below inicialized exacly as view above. // why we need view2 & may it be defferent from view? ViewItem &view2 = GetView(pSlice->GetSliceHeader()->nal_ext.mvc.view_id); H264DecoderFrame * saveFrame = pFrame; std::swap(pSlice->m_pCurrentFrame, saveFrame); DecReferencePictureMarking::SlideWindow(view2, pSlice, 0); std::swap(pSlice->m_pCurrentFrame, saveFrame); pFrame->SetisShortTermRef(true, 0); pFrame->SetisShortTermRef(true, 1); // next missing frame frame_num++; if (frame_num >= uMaxFrameNum) frame_num = 0; pFrame->SetFrameAsNonExist(); pFrame->DecrementReference(); } // while return UMC_OK; } // ProcessFrameNumGap void TaskSupplier::PostProcessDisplayFrame(H264DecoderFrame *pFrame) { if (!pFrame || pFrame->post_procces_complete) return; ViewItem &view = GetView(pFrame->m_viewId); pFrame->post_procces_complete = true; DEBUG_PRINT((VM_STRING("Outputted POC - %d, busyState - %d, uid - %d, viewId - %d, pppp - %d\n"), pFrame->m_PicOrderCnt[0], pFrame->GetRefCounter(), pFrame->m_UID, pFrame->m_viewId, pppp++)); if (!pFrame->IsFrameExist()) return; pFrame->m_isOriginalPTS = pFrame->m_dFrameTime > -1.0; if (pFrame->m_isOriginalPTS) { view.localFrameTime = pFrame->m_dFrameTime; } else { pFrame->m_dFrameTime = view.localFrameTime; } pFrame->m_frameOrder = m_frameOrder; switch (pFrame->m_displayPictureStruct) { case UMC::DPS_TOP_BOTTOM_TOP: case UMC::DPS_BOTTOM_TOP_BOTTOM: if (m_initializationParams.lFlags & UMC::FLAG_VDEC_TELECINE_PTS) { view.localFrameTime += (m_local_delta_frame_time / 2); } break; case UMC::DPS_FRAME_DOUBLING: case UMC::DPS_FRAME_TRIPLING: case UMC::DPS_TOP: case UMC::DPS_BOTTOM: case UMC::DPS_TOP_BOTTOM: case UMC::DPS_BOTTOM_TOP: case UMC::DPS_FRAME: default: break; } view.localFrameTime += m_local_delta_frame_time; bool wasWrapped = IncreaseCurrentView(); if (wasWrapped) m_frameOrder++; if (view.GetDPBList(0)->GetRecoveryFrameCnt() != -1) view.GetDPBList(0)->SetRecoveryFrameCnt(-1); } H264DecoderFrame *TaskSupplier::GetFrameToDisplayInternal(bool force) { H264DecoderFrame *pFrame = GetAnyFrameToDisplay(force); return pFrame; } H264DecoderFrame *TaskSupplier::GetAnyFrameToDisplay(bool force) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (uint32_t i = 0; iter != iter_end; ++i, ++iter) { ViewItem &view = *iter; if (i != m_currentDisplayView || !view.m_isDisplayable) { if (i == m_currentDisplayView) { IncreaseCurrentView(); } continue; } for (;;) { // show oldest frame // Flag SPS.VUI.max_num_reorder_frames may be presented in bitstream headers // (if SPS.VUI.bitstream_restriction_flag == 1) and may be used to reduce // latency on outputting decoded frames. // // Due to h264 is a legacy codec and flag SPS.VUI.max_num_reorder_frames // is not necessary - there are existed some old encoders and coded videos // where flag max_num_reorder_frames is set to 0 by default, but reordering // actually exists. For this reason Media SDK ignores this flag by default, // because there is a risk to break decoding some old videos. // // Enabling define ENABLE_MAX_NUM_REORDER_FRAMES_OUTPUT allows to reduce latency // (ex: max_num_reorder_frames == 0 -> output frame immediately) uint32_t countNumDisplayable = view.GetDPBList(0)->countNumDisplayable(); if ( countNumDisplayable > view.maxDecFrameBuffering #ifdef ENABLE_MAX_NUM_REORDER_FRAMES_OUTPUT || countNumDisplayable > view.maxNumReorderFrames #endif || force ) { H264DecoderFrame *pTmp = view.GetDPBList(0)->findOldestDisplayable(view.maxDecFrameBuffering); if (pTmp) { int32_t recovery_frame_cnt = view.GetDPBList(0)->GetRecoveryFrameCnt(); // DEBUG !!! need to think about recovery and MVC if (!pTmp->IsFrameExist() || (recovery_frame_cnt != -1 && pTmp->m_FrameNum != recovery_frame_cnt)) { pTmp->SetErrorFlagged(ERROR_FRAME_RECOVERY); } return pTmp; } break; } else { if (DPBOutput::IsUseDelayOutputValue()) { H264DecoderFrame *pTmp = view.GetDPBList(0)->findDisplayableByDPBDelay(); if (pTmp) return pTmp; } break; } } } return 0; } void TaskSupplier::SetMBMap(const H264Slice * , H264DecoderFrame *, LocalResources * ) { } void TaskSupplier::PreventDPBFullness() { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { ViewItem &view = *iter; H264DBPList *pDPB = view.GetDPBList(0); try { for (;;) { // force Display or ... delete long term const H264SeqParamSet* sps = m_Headers.m_SeqParams.GetCurrentHeader(); if (sps) { uint32_t NumShortTermRefs, NumLongTermRefs; // find out how many active reference frames currently in decoded // frames buffer pDPB->countActiveRefs(NumShortTermRefs, NumLongTermRefs); if (NumLongTermRefs == sps->num_ref_frames) { H264DecoderFrame *pFrame = pDPB->findOldestLongTermRef(); if (pFrame) { pFrame->SetisLongTermRef(false, 0); pFrame->SetisLongTermRef(false, 1); pFrame->Reset(); } } if (pDPB->IsDisposableExist()) break; /*while (NumShortTermRefs > 0 && (NumShortTermRefs + NumLongTermRefs >= (int32_t)sps->num_ref_frames)) { H264DecoderFrame * pFrame = view.pDPB->findOldestShortTermRef(); if (!pFrame) break; pFrame->SetisShortTermRef(false, 0); pFrame->SetisShortTermRef(false, 1); NumShortTermRefs--; };*/ if (pDPB->IsDisposableExist()) break; } break; } } catch(...) { } if (!pDPB->IsDisposableExist()) AfterErrorRestore(); } } Status TaskSupplier::CompleteDecodedFrames(H264DecoderFrame ** decoded) { H264DecoderFrame* completed = 0; Status sts = UMC_OK; ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { ViewItem &view = *iter; H264DBPList *pDPB = view.GetDPBList(0); for (;;) //add all ready to decoding { bool isOneToAdd = true; H264DecoderFrame * frameToAdd = 0; for (H264DecoderFrame * frame = pDPB->head(); frame; frame = frame->future()) { int32_t const frm_error = frame->GetError(); //we don't overwrite an error if we already got it if (sts == UMC_OK && frm_error < 0) //if we have ERROR_FRAME_DEVICE_FAILURE bit is set then this error is UMC::Status code sts = static_cast(frm_error); if (frame->IsFrameExist() && !frame->IsDecoded()) { if (!frame->IsDecodingStarted() && frame->IsFullFrame()) { if (frameToAdd) { isOneToAdd = false; if (frameToAdd->m_UID < frame->m_UID) // add first with min UID continue; } frameToAdd = frame; } if (!frame->IsDecodingCompleted()) { continue; } frame->OnDecodingCompleted(); completed = frame; } } if (sts != UMC_OK) break; if (frameToAdd) { if (!m_pTaskBroker->AddFrameToDecoding(frameToAdd)) break; } if (isOneToAdd) break; } } if (decoded) *decoded = completed; return sts; } Status TaskSupplier::AddSource(MediaData * pSource) { H264DecoderFrame* completed = 0; Status umcRes = CompleteDecodedFrames(&completed); if (umcRes != UMC_OK) return pSource || !completed ? umcRes : UMC_OK; umcRes = AddOneFrame(pSource); // construct frame if (UMC_ERR_NOT_ENOUGH_BUFFER == umcRes) { ViewItem &view = GetView(m_currentView); H264DBPList *pDPB = view.GetDPBList(0); // in the following case(s) we can lay on the base view only, // because the buffers are managed synchronously. // frame is being processed. Wait for asynchronous end of operation. if (pDPB->IsDisposableExist()) { return UMC_WRN_INFO_NOT_READY; } // frame is finished, but still referenced. // Wait for asynchronous complete. if (pDPB->IsAlmostDisposableExist()) { return UMC_WRN_INFO_NOT_READY; } // some more hard reasons of frame lacking. if (!m_pTaskBroker->IsEnoughForStartDecoding(true)) { umcRes = CompleteDecodedFrames(&completed); if (umcRes != UMC_OK) return umcRes; else if (completed) return UMC_WRN_INFO_NOT_READY; if (GetFrameToDisplayInternal(true)) return UMC_ERR_NEED_FORCE_OUTPUT; PreventDPBFullness(); return UMC_WRN_INFO_NOT_READY; } } return umcRes; } Status TaskSupplier::ProcessNalUnit(NalUnit *nalUnit, mfxExtDecodeErrorReport * pDecodeErrorReport) { Status umcRes = UMC_OK; switch (nalUnit->GetNalUnitType()) { case NAL_UT_IDR_SLICE: case NAL_UT_SLICE: case NAL_UT_AUXILIARY: case NAL_UT_CODED_SLICE_EXTENSION: { H264Slice * pSlice = DecodeSliceHeader(nalUnit); if (pSlice) { umcRes = AddSlice(pSlice, false); } } break; case NAL_UT_SPS: case NAL_UT_PPS: case NAL_UT_SPS_EX: case NAL_UT_SUBSET_SPS: case NAL_UT_PREFIX: umcRes = DecodeHeaders(nalUnit); if (pDecodeErrorReport && umcRes == UMC_ERR_INVALID_STREAM) SetDecodeErrorTypes(nalUnit->GetNalUnitType(), pDecodeErrorReport); break; case NAL_UT_SEI: umcRes = DecodeSEI(nalUnit); break; case NAL_UT_AUD: m_accessUnit.CompleteLastLayer(); break; case NAL_UT_DPA: //ignore it case NAL_UT_DPB: case NAL_UT_DPC: case NAL_UT_FD: case NAL_UT_UNSPECIFIED: break; case NAL_UT_END_OF_STREAM: case NAL_UT_END_OF_SEQ: { m_accessUnit.CompleteLastLayer(); m_WaitForIDR = true; } break; default: break; }; return umcRes; } Status TaskSupplier::AddOneFrame(MediaData * pSource) { Status umsRes = UMC_OK; if (m_pLastSlice) { Status sts = AddSlice(m_pLastSlice, !pSource); if (sts == UMC_ERR_NOT_ENOUGH_BUFFER || sts == UMC_ERR_ALLOC) { return sts; } if (sts == UMC_OK) return sts; } do { MediaData::AuxInfo* aux = (pSource) ? pSource->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; mfxExtDecodeErrorReport* pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; NalUnit *nalUnit = m_pNALSplitter->GetNalUnits(pSource); if (!nalUnit && pSource) { uint32_t flags = pSource->GetFlags(); if (!(flags & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME)) { assert(!m_pLastSlice); return AddSlice(0, true); } return UMC_ERR_SYNC; } if (!nalUnit) { if (!pSource) return AddSlice(0, true); return UMC_ERR_NOT_ENOUGH_DATA; } if ((NAL_UT_IDR_SLICE != nalUnit->GetNalUnitType()) && (NAL_UT_SLICE != nalUnit->GetNalUnitType())) { // Reset last prefix NAL unit m_Headers.m_nalExtension.extension_present = 0; } switch ((NAL_Unit_Type)nalUnit->GetNalUnitType()) { case NAL_UT_IDR_SLICE: case NAL_UT_SLICE: case NAL_UT_AUXILIARY: case NAL_UT_CODED_SLICE_EXTENSION: { H264Slice * pSlice = DecodeSliceHeader(nalUnit); if (pSlice) { umsRes = AddSlice(pSlice, !pSource); if (umsRes == UMC_ERR_NOT_ENOUGH_BUFFER || umsRes == UMC_OK || umsRes == UMC_ERR_ALLOC) { return umsRes; } } } break; case NAL_UT_SPS: case NAL_UT_PPS: case NAL_UT_SPS_EX: case NAL_UT_SUBSET_SPS: case NAL_UT_PREFIX: umsRes = DecodeHeaders(nalUnit); if (umsRes != UMC_OK) { if (umsRes == UMC_NTF_NEW_RESOLUTION && pSource) { int32_t size = (int32_t)nalUnit->GetDataSize(); pSource->MoveDataPointer(- size - 3); } if (pDecodeErrorReport && umsRes == UMC_ERR_INVALID_STREAM) SetDecodeErrorTypes(nalUnit->GetNalUnitType(), pDecodeErrorReport); return umsRes; } if (nalUnit->GetNalUnitType() == NAL_UT_SPS || nalUnit->GetNalUnitType() == NAL_UT_PPS) { m_accessUnit.CompleteLastLayer(); } break; case NAL_UT_SEI: m_accessUnit.CompleteLastLayer(); DecodeSEI(nalUnit); break; case NAL_UT_AUD: //ignore it m_accessUnit.CompleteLastLayer(); break; case NAL_UT_END_OF_STREAM: case NAL_UT_END_OF_SEQ: { m_accessUnit.CompleteLastLayer(); m_WaitForIDR = true; } break; case NAL_UT_DPA: //ignore it case NAL_UT_DPB: case NAL_UT_DPC: case NAL_UT_FD: default: break; }; } while ((pSource) && (MINIMAL_DATA_SIZE < pSource->GetDataSize())); if (!pSource) { return AddSlice(0, true); } else { uint32_t flags = pSource->GetFlags(); if (!(flags & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME)) { assert(!m_pLastSlice); return AddSlice(0, true); } } return UMC_ERR_NOT_ENOUGH_DATA; } static bool IsFieldOfOneFrame(const H264DecoderFrame *pFrame, const H264Slice * pSlice1, const H264Slice *pSlice2) { if (!pFrame) return false; if (pFrame && pFrame->GetAU(0)->GetStatus() > H264DecoderFrameInfo::STATUS_NOT_FILLED && pFrame->GetAU(1)->GetStatus() > H264DecoderFrameInfo::STATUS_NOT_FILLED) return false; if ((pSlice1->GetSliceHeader()->nal_ref_idc && !pSlice2->GetSliceHeader()->nal_ref_idc) || (!pSlice1->GetSliceHeader()->nal_ref_idc && pSlice2->GetSliceHeader()->nal_ref_idc)) return false; if (pSlice1->GetSliceHeader()->field_pic_flag != pSlice2->GetSliceHeader()->field_pic_flag) return false; if (pSlice1->GetSliceHeader()->frame_num != pSlice2->GetSliceHeader()->frame_num) return false; if (pSlice1->GetSliceHeader()->bottom_field_flag == pSlice2->GetSliceHeader()->bottom_field_flag) return false; return true; } H264Slice * TaskSupplier::CreateSlice() { return m_ObjHeap.AllocateObject(); } H264Slice * TaskSupplier::DecodeSliceHeader(NalUnit *nalUnit) { if ((0 > m_Headers.m_SeqParams.GetCurrentID()) || (0 > m_Headers.m_PicParams.GetCurrentID())) { return 0; } if (m_Headers.m_nalExtension.extension_present) { if (SVC_Extension::IsShouldSkipSlice(&m_Headers.m_nalExtension)) { m_Headers.m_nalExtension.extension_present = 0; return 0; } } H264Slice * pSlice = CreateSlice(); if (!pSlice) { return 0; } pSlice->SetHeap(&m_ObjHeap); pSlice->IncrementReference(); notifier0 memory_leak_preventing_slice(pSlice, &H264Slice::DecrementReference); H264MemoryPiece memCopy; memCopy.SetData(nalUnit); pSlice->m_pSource.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_SLICE_TAIL_SIZE); notifier0 memory_leak_preventing(&pSlice->m_pSource, &H264MemoryPiece::Release); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&pSlice->m_pSource, &memCopy); int32_t pps_pid = pSlice->RetrievePicParamSetNumber(); if (pps_pid == -1) { ErrorStatus::isPPSError = 1; return 0; } H264SEIPayLoad * spl = m_Headers.m_SEIParams.GetHeader(SEI_RECOVERY_POINT_TYPE); if (m_WaitForIDR) { if (pSlice->GetSliceHeader()->slice_type != INTRASLICE && !spl) { return 0; } } pSlice->m_pPicParamSet = m_Headers.m_PicParams.GetHeader(pps_pid); if (!pSlice->m_pPicParamSet) { return 0; } int32_t seq_parameter_set_id = pSlice->m_pPicParamSet->seq_parameter_set_id; if (NAL_UT_CODED_SLICE_EXTENSION == pSlice->GetSliceHeader()->nal_unit_type) { if (pSlice->GetSliceHeader()->nal_ext.svc_extension_flag == 0) { pSlice->m_pSeqParamSetSvcEx = 0; pSlice->m_pSeqParamSet = pSlice->m_pSeqParamSetMvcEx = m_Headers.m_SeqParamsMvcExt.GetHeader(seq_parameter_set_id); if (NULL == pSlice->m_pSeqParamSet) { return 0; } m_Headers.m_SeqParamsMvcExt.SetCurrentID(pSlice->m_pSeqParamSetMvcEx->seq_parameter_set_id); m_Headers.m_PicParams.SetCurrentID(pSlice->m_pPicParamSet->pic_parameter_set_id); } else { pSlice->m_pSeqParamSetMvcEx = 0; pSlice->m_pSeqParamSet = pSlice->m_pSeqParamSetSvcEx = m_Headers.m_SeqParamsSvcExt.GetHeader(seq_parameter_set_id); if (NULL == pSlice->m_pSeqParamSet) { return 0; } m_Headers.m_SeqParamsSvcExt.SetCurrentID(pSlice->m_pSeqParamSetSvcEx->seq_parameter_set_id); m_Headers.m_PicParams.SetCurrentID(pSlice->m_pPicParamSet->pic_parameter_set_id); } } else { pSlice->m_pSeqParamSetSvcEx = m_Headers.m_SeqParamsSvcExt.GetCurrentHeader(); pSlice->m_pSeqParamSetMvcEx = m_Headers.m_SeqParamsMvcExt.GetCurrentHeader(); pSlice->m_pSeqParamSet = m_Headers.m_SeqParams.GetHeader(seq_parameter_set_id); if (!pSlice->m_pSeqParamSet) { ErrorStatus::isSPSError = 0; return 0; } m_Headers.m_SeqParams.SetCurrentID(pSlice->m_pPicParamSet->seq_parameter_set_id); m_Headers.m_PicParams.SetCurrentID(pSlice->m_pPicParamSet->pic_parameter_set_id); } if (pSlice->m_pSeqParamSet->errorFlags) ErrorStatus::isSPSError = 1; if (pSlice->m_pPicParamSet->errorFlags) ErrorStatus::isPPSError = 1; Status sts = InitializePictureParamSet(m_Headers.m_PicParams.GetHeader(pps_pid), pSlice->m_pSeqParamSet, NAL_UT_CODED_SLICE_EXTENSION == pSlice->GetSliceHeader()->nal_unit_type); if (sts != UMC_OK) { return 0; } pSlice->m_pSeqParamSetEx = m_Headers.m_SeqExParams.GetHeader(seq_parameter_set_id); pSlice->m_pCurrentFrame = 0; memory_leak_preventing.ClearNotification(); pSlice->m_dTime = pSlice->m_pSource.GetTime(); if (!pSlice->Reset(&m_Headers.m_nalExtension)) { return 0; } if (IsShouldSkipSlice(pSlice)) return 0; if (!IsExtension()) { memset(&pSlice->GetSliceHeader()->nal_ext, 0, sizeof(H264NalExtension)); } if (spl) { if (m_WaitForIDR) { AllocateAndInitializeView(pSlice); ViewItem &view = GetView(pSlice->GetSliceHeader()->nal_ext.mvc.view_id); uint32_t recoveryFrameNum = (spl->SEI_messages.recovery_point.recovery_frame_cnt + pSlice->GetSliceHeader()->frame_num) % (1 << pSlice->m_pSeqParamSet->log2_max_frame_num); view.GetDPBList(0)->SetRecoveryFrameCnt(recoveryFrameNum); } if ((pSlice->GetSliceHeader()->slice_type != INTRASLICE)) { H264SEIPayLoad * splToRemove = m_Headers.m_SEIParams.GetHeader(SEI_RECOVERY_POINT_TYPE); m_Headers.m_SEIParams.RemoveHeader(splToRemove); } } m_WaitForIDR = false; memory_leak_preventing_slice.ClearNotification(); //DEBUG_PRINT((VM_STRING("debug headers slice - view - %d \n"), pSlice->GetSliceHeader()->nal_ext.mvc.view_id)); return pSlice; } void TaskSupplier::DPBSanitize(H264DecoderFrame * pDPBHead, const H264DecoderFrame * pFrame) { for (H264DecoderFrame *pFrm = pDPBHead; pFrm; pFrm = pFrm->future()) { if ((pFrm != pFrame) && (pFrm->FrameNum() == pFrame->FrameNum()) && pFrm->isShortTermRef()) { pFrm->SetErrorFlagged(ERROR_FRAME_SHORT_TERM_STUCK); AddItemAndRun(pFrm, pFrm, UNSET_REFERENCE | FULL_FRAME | SHORT_TERM); } } } Status TaskSupplier::AddSlice(H264Slice * pSlice, bool force) { if (!m_accessUnit.GetLayersCount() && pSlice) { if (m_sei_messages) m_sei_messages->SetAUID(m_accessUnit.GetAUIndentifier()); } if (!pSlice) { m_accessUnit.AddSlice(0); // full AU } if ((!pSlice || m_accessUnit.IsFullAU() || !m_accessUnit.AddSlice(pSlice)) && m_accessUnit.GetLayersCount()) { m_pLastSlice = pSlice; if (!m_accessUnit.m_isInitialized) { InitializeLayers(&m_accessUnit, 0, 0); size_t layersCount = m_accessUnit.GetLayersCount(); uint32_t maxDId = 0; if (layersCount && m_accessUnit.GetLayer(layersCount - 1)->GetSliceCount()) { maxDId = m_accessUnit.GetLayer(layersCount - 1)->GetSlice(0)->GetSliceHeader()->nal_ext.svc.dependency_id; } for (size_t i = 0; i < layersCount; i++) { SetOfSlices * setOfSlices = m_accessUnit.GetLayer(i); H264Slice * slice = setOfSlices->GetSlice(0); if (slice == nullptr) continue; AllocateAndInitializeView(slice); ViewItem &view = GetView(slice->GetSliceHeader()->nal_ext.mvc.view_id); if (view.pCurFrame && view.pCurFrame->m_PictureStructureForDec < FRM_STRUCTURE) { H264Slice * pFirstFrameSlice = view.pCurFrame->GetAU(0)->GetSlice(0); if (!pFirstFrameSlice || !IsFieldOfOneFrame(view.pCurFrame, pFirstFrameSlice, slice)) { ProcessNonPairedField(view.pCurFrame); OnFullFrame(view.pCurFrame); view.pCurFrame = 0; } } if (view.GetPOCDecoder(0)->DetectFrameNumGap(slice)) { view.pCurFrame = 0; Status umsRes = ProcessFrameNumGap(slice, 0, 0, maxDId); if (umsRes != UMC_OK) return umsRes; } } m_accessUnit.m_isInitialized = true; } size_t layersCount = m_accessUnit.GetLayersCount(); { for (size_t i = 0; i < layersCount; i++) { SetOfSlices * setOfSlices = m_accessUnit.GetLayer(i); H264Slice * slice = setOfSlices->GetSlice(0); if (setOfSlices->m_frame) continue; Status sts = AllocateNewFrame(slice, &setOfSlices->m_frame); if (sts != UMC_OK) return sts; if (!setOfSlices->m_frame) return UMC_ERR_NOT_ENOUGH_BUFFER; setOfSlices->m_frame->m_auIndex = m_accessUnit.GetAUIndentifier(); ApplyPayloadsToFrame(setOfSlices->m_frame, slice, &setOfSlices->m_payloads); if (layersCount == 1) break; return UMC_OK; } } for (size_t i = 0; i < layersCount; i++) { SetOfSlices * setOfSlices = m_accessUnit.GetLayer(i); if (setOfSlices->m_isCompleted) continue; H264Slice * lastSlice = setOfSlices->GetSlice(setOfSlices->GetSliceCount() - 1); FrameType Frame_type = SliceTypeToFrameType(lastSlice->GetSliceHeader()->slice_type); m_currentView = lastSlice->GetSliceHeader()->nal_ext.mvc.view_id; ViewItem &view = GetView(m_currentView); view.pCurFrame = setOfSlices->m_frame; //1)If frame_num has gap in a stream, for a kind of cases that the frame_num has a jump, the frame_num //gap will cause a reference frame to stay in DPB buffer constantly. Need to unmark the reference frame //in DPB buffer when the future frame with the same frame_num is coming. //2)If a stream has a wrong way to calculate the B frame's frame_num, this will cause DPB buffer confusion. //For example: The B frame's frame_num equals to the previous reference frame's frame_num. //For these cases, add an another condition (Frame_type != B_PICTURE) that unmark the reference frame when //decoding the P frame or I frame rather than B frame. if (lastSlice->GetSeqParam()->gaps_in_frame_num_value_allowed_flag != 1 && Frame_type != B_PICTURE) { // Check if DPB has ST frames with frame_num duplicating frame_num of new slice_type // If so, unmark such frames as ST. H264DecoderFrame * pHead = view.GetDPBList(0)->head(); DPBSanitize(pHead, view.pCurFrame); } const H264SliceHeader *sliceHeader = lastSlice->GetSliceHeader(); uint32_t field_index = setOfSlices->m_frame->GetNumberByParity(sliceHeader->bottom_field_flag); if (!setOfSlices->m_frame->GetAU(field_index)->GetSliceCount()) { size_t count = setOfSlices->GetSliceCount(); for (size_t sliceId = 0; sliceId < count; sliceId++) { H264Slice * slice = setOfSlices->GetSlice(sliceId); slice->m_pCurrentFrame = setOfSlices->m_frame; AddSliceToFrame(setOfSlices->m_frame, slice); if (slice->GetSliceHeader()->slice_type != INTRASLICE) { uint32_t NumShortTermRefs, NumLongTermRefs, NumInterViewRefs = 0; view.GetDPBList(0)->countActiveRefs(NumShortTermRefs, NumLongTermRefs); // calculate number of inter-view references if (slice->GetSliceHeader()->nal_ext.mvc.view_id) { NumInterViewRefs = GetInterViewFrameRefs(m_views, slice->GetSliceHeader()->nal_ext.mvc.view_id, setOfSlices->m_frame->m_auIndex, slice->GetSliceHeader()->bottom_field_flag); } if (NumShortTermRefs + NumLongTermRefs + NumInterViewRefs == 0) AddFakeReferenceFrame(slice); } slice->UpdateReferenceList(m_views, 0); } if (count && !setOfSlices->GetSlice(0)->IsSliceGroups()) { H264Slice * slice = setOfSlices->GetSlice(0); if (slice->m_iFirstMB) { m_pSegmentDecoder[0]->RestoreErrorRect(0, slice->m_iFirstMB, slice); } } } Status umcRes; if ((umcRes = CompleteFrame(setOfSlices->m_frame, field_index)) != UMC_OK) { return umcRes; } if (setOfSlices->m_frame->m_PictureStructureForDec < FRM_STRUCTURE && force && !pSlice) { if (ProcessNonPairedField(setOfSlices->m_frame)) { OnFullFrame(setOfSlices->m_frame); view.pCurFrame = 0; } } if (setOfSlices->m_frame->m_PictureStructureForDec >= FRM_STRUCTURE || field_index) { OnFullFrame(setOfSlices->m_frame); view.pCurFrame = 0; } setOfSlices->m_isCompleted = true; } m_accessUnit.Reset(); return layersCount ? UMC_OK : UMC_ERR_NOT_ENOUGH_DATA; } m_pLastSlice = 0; return UMC_ERR_NOT_ENOUGH_DATA; } void TaskSupplier::AddFakeReferenceFrame(H264Slice * ) { } void TaskSupplier::OnFullFrame(H264DecoderFrame * pFrame) { pFrame->SetFullFrame(true); ViewItem &view = GetView(pFrame->m_viewId); if (!view.m_isDisplayable) { pFrame->setWasOutputted(); pFrame->setWasDisplayed(); } if (pFrame->IsSkipped()) return; if (pFrame->m_bIDRFlag && !(pFrame->GetError() & ERROR_FRAME_DPB)) { DecReferencePictureMarking::ResetError(); } if (DecReferencePictureMarking::GetDPBError()) { pFrame->SetErrorFlagged(ERROR_FRAME_DPB); } } Status TaskSupplier::InitializeLayers(AccessUnit *accessUnit, H264DecoderFrame * /*pFrame*/, int32_t /*field*/) { accessUnit->SortforASO(); size_t layersCount = accessUnit->GetLayersCount(); if (!layersCount) return UMC_OK; if ((m_decodingMode == MVC_DECODING_MODE) && layersCount > 1) { H264Slice * sliceExtension = 0; for (size_t i = layersCount - 1; i >= 1; i--) { SetOfSlices * setOfSlices = accessUnit->GetLayer(i); size_t sliceCount = setOfSlices->GetSliceCount(); for (size_t sliceId = 0; sliceId < sliceCount; sliceId++) { H264Slice * slice = setOfSlices->GetSlice(sliceId); if (NAL_UT_CODED_SLICE_EXTENSION == slice->GetSliceHeader()->nal_unit_type) { sliceExtension = slice; break; } } if (sliceExtension) break; } if (sliceExtension) { SetOfSlices * setOfSlices = accessUnit->GetLayer(0); size_t sliceCount = setOfSlices->GetSliceCount(); for (size_t sliceId = 0; sliceId < sliceCount; sliceId++) { H264Slice * slice = setOfSlices->GetSlice(sliceId); if (NAL_UT_CODED_SLICE_EXTENSION != slice->GetSliceHeader()->nal_unit_type) { if (!slice->m_pSeqParamSetMvcEx) slice->SetSeqMVCParam(sliceExtension->m_pSeqParamSetMvcEx); if (!slice->m_pSeqParamSetSvcEx) slice->SetSeqSVCParam(sliceExtension->m_pSeqParamSetSvcEx); } } } } return UMC_OK; } Status TaskSupplier::CompleteFrame(H264DecoderFrame * pFrame, int32_t field) { if (!pFrame) return UMC_OK; H264DecoderFrameInfo * slicesInfo = pFrame->GetAU(field); if (slicesInfo->GetStatus() > H264DecoderFrameInfo::STATUS_NOT_FILLED) return UMC_OK; DEBUG_PRINT((VM_STRING("Complete frame POC - (%d,%d) type - %d, picStruct - %d, field - %d, count - %d, m_uid - %d, IDR - %d, viewId - %d\n"), pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1], pFrame->m_FrameType, pFrame->m_displayPictureStruct, field, pFrame->GetAU(field)->GetSliceCount(), pFrame->m_UID, pFrame->m_bIDRFlag, pFrame->m_viewId)); DBPUpdate(pFrame, field); // skipping algorithm { if (((slicesInfo->IsField() && field) || !slicesInfo->IsField()) && IsShouldSkipFrame(pFrame, field)) { if (slicesInfo->IsField()) { pFrame->GetAU(0)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); pFrame->GetAU(1)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); } else { pFrame->GetAU(0)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); } pFrame->SetisShortTermRef(false, 0); pFrame->SetisShortTermRef(false, 1); pFrame->SetisLongTermRef(false, 0); pFrame->SetisLongTermRef(false, 1); pFrame->SetSkipped(true); pFrame->OnDecodingCompleted(); return UMC_OK; } else { if (IsShouldSkipDeblocking(pFrame, field)) { pFrame->GetAU(field)->SkipDeblocking(); } } } slicesInfo->SetStatus(H264DecoderFrameInfo::STATUS_FILLED); return UMC_OK; } void TaskSupplier::InitFreeFrame(H264DecoderFrame * pFrame, const H264Slice *pSlice) { const H264SeqParamSet *pSeqParam = pSlice->GetSeqParam(); pFrame->m_FrameType = SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type); pFrame->m_dFrameTime = pSlice->m_dTime; pFrame->m_crop_left = SubWidthC[pSeqParam->chroma_format_idc] * pSeqParam->frame_cropping_rect_left_offset; pFrame->m_crop_right = SubWidthC[pSeqParam->chroma_format_idc] * pSeqParam->frame_cropping_rect_right_offset; pFrame->m_crop_top = SubHeightC[pSeqParam->chroma_format_idc] * pSeqParam->frame_cropping_rect_top_offset * (2 - pSeqParam->frame_mbs_only_flag); pFrame->m_crop_bottom = SubHeightC[pSeqParam->chroma_format_idc] * pSeqParam->frame_cropping_rect_bottom_offset * (2 - pSeqParam->frame_mbs_only_flag); pFrame->m_crop_flag = pSeqParam->frame_cropping_flag; pFrame->setFrameNum(pSlice->GetSliceHeader()->frame_num); if (pSlice->GetSliceHeader()->nal_ext.extension_present && 0 == pSlice->GetSliceHeader()->nal_ext.svc_extension_flag) { pFrame->setViewId(pSlice->GetSliceHeader()->nal_ext.mvc.view_id); } pFrame->m_aspect_width = pSeqParam->vui.sar_width; pFrame->m_aspect_height = pSeqParam->vui.sar_height; if (pSlice->GetSliceHeader()->field_pic_flag) { pFrame->m_bottom_field_flag[0] = pSlice->GetSliceHeader()->bottom_field_flag; pFrame->m_bottom_field_flag[1] = !pSlice->GetSliceHeader()->bottom_field_flag; pFrame->m_PictureStructureForRef = pFrame->m_PictureStructureForDec = FLD_STRUCTURE; } else { pFrame->m_bottom_field_flag[0] = 0; pFrame->m_bottom_field_flag[1] = 1; if (pSlice->GetSliceHeader()->MbaffFrameFlag) { pFrame->m_PictureStructureForRef = pFrame->m_PictureStructureForDec = AFRM_STRUCTURE; } else { pFrame->m_PictureStructureForRef = pFrame->m_PictureStructureForDec = FRM_STRUCTURE; } } int32_t iMBCount = pSeqParam->frame_width_in_mbs * pSeqParam->frame_height_in_mbs; pFrame->totalMBs = iMBCount; if (pFrame->m_PictureStructureForDec < FRM_STRUCTURE) pFrame->totalMBs /= 2; int32_t chroma_format_idc = pSeqParam->chroma_format_idc; uint8_t bit_depth_luma = pSeqParam->bit_depth_luma; uint8_t bit_depth_chroma = pSeqParam->bit_depth_chroma; int32_t bit_depth = std::max(bit_depth_luma, bit_depth_chroma); int32_t iMBWidth = pSeqParam->frame_width_in_mbs; int32_t iMBHeight = pSeqParam->frame_height_in_mbs; mfxSize dimensions = {iMBWidth * 16, iMBHeight * 16}; ColorFormat cf = GetUMCColorFormat(chroma_format_idc); VideoDataInfo info; info.Init(dimensions.width, dimensions.height, cf, bit_depth); pFrame->Init(&info); } void TaskSupplier::InitFrameCounter(H264DecoderFrame * pFrame, const H264Slice *pSlice) { const H264SliceHeader *sliceHeader = pSlice->GetSliceHeader(); ViewItem &view = GetView(sliceHeader->nal_ext.mvc.view_id); if (view.GetPOCDecoder(0)->DetectFrameNumGap(pSlice, true)) { H264DBPList* dpb = view.GetDPBList(0); assert(dpb); uint32_t NumShortTerm, NumLongTerm; dpb->countActiveRefs(NumShortTerm, NumLongTerm); if ((NumShortTerm + NumLongTerm > 0)) { // set error flag only we have some references in DPB pFrame->SetErrorFlagged(ERROR_FRAME_REFERENCE_FRAME); // Leaving aside a legal frame_num wrapping cases, when a rapid _decrease_ of frame_num occurs due to frame gaps, // frames marked as short-term prior the gap may get stuck in DPB for a very long sequence (up to '(1 << log2_max_frame_num) - 1'). // Reference lists are generated incorrectly. A potential recovery point can be at next I frame (if GOP is closed). // So let's mark these potentially dangereous ST frames // to remove them later from DPB in UpdateRefPicMarking() (if they're still there) at next I frame or SEI recovery point. for (H264DecoderFrame *pFrm = view.GetDPBList(0)->head(); pFrm; pFrm = pFrm->future()) { if ((pFrm->FrameNum() > sliceHeader->frame_num) && pFrm->isShortTermRef()) { pFrm->SetErrorFlagged(ERROR_FRAME_SHORT_TERM_STUCK); } } } } if (sliceHeader->IdrPicFlag) { view.GetPOCDecoder(0)->Reset(sliceHeader->frame_num); } view.GetPOCDecoder(0)->DecodePictureOrderCount(pSlice, sliceHeader->frame_num); pFrame->m_bIDRFlag = (sliceHeader->IdrPicFlag != 0); const int32_t recoveryFrameNum = view.GetDPBList(0)->GetRecoveryFrameCnt(); pFrame->m_bIFlag = (sliceHeader->slice_type == INTRASLICE) || (recoveryFrameNum != -1 && pFrame->FrameNum() == recoveryFrameNum); if (pFrame->m_bIDRFlag) { view.GetDPBList(0)->IncreaseRefPicListResetCount(pFrame); } pFrame->setFrameNum(sliceHeader->frame_num); uint32_t field_index = pFrame->GetNumberByParity(sliceHeader->bottom_field_flag); if (sliceHeader->field_pic_flag == 0) pFrame->setPicNum(sliceHeader->frame_num, 0); else pFrame->setPicNum(sliceHeader->frame_num*2+1, field_index); view.GetPOCDecoder(0)->DecodePictureOrderCountInitFrame(pFrame, field_index); DEBUG_PRINT((VM_STRING("Init frame POC - %d, %d, field - %d, uid - %d, frame_num - %d, viewId - %d\n"), pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1], field_index, pFrame->m_UID, pFrame->m_FrameNum, pFrame->m_viewId)); pFrame->SetInterViewRef(0 != pSlice->GetSliceHeader()->nal_ext.mvc.inter_view_flag, field_index); pFrame->InitRefPicListResetCount(field_index); } // void TaskSupplier::InitFrameCounter(H264DecoderFrame * pFrame, const H264Slice *pSlice) void TaskSupplier::AddSliceToFrame(H264DecoderFrame *pFrame, H264Slice *pSlice) { const H264SliceHeader *sliceHeader = pSlice->GetSliceHeader(); if (pFrame->m_FrameType < SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type)) pFrame->m_FrameType = SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type); uint32_t field_index = pFrame->GetNumberByParity(sliceHeader->bottom_field_flag); H264DecoderFrameInfo * au_info = pFrame->GetAU(field_index); int32_t iSliceNumber = au_info->GetSliceCount() + 1; if (field_index) { iSliceNumber += pFrame->m_TopSliceCount; } else { pFrame->m_TopSliceCount++; } pFrame->m_iNumberOfSlices++; pSlice->SetSliceNumber(iSliceNumber); pSlice->m_pCurrentFrame = pFrame; au_info->AddSlice(pSlice); } void TaskSupplier::DBPUpdate(H264DecoderFrame * pFrame, int32_t field) { H264DecoderFrameInfo *slicesInfo = pFrame->GetAU(field); uint32_t count = slicesInfo->GetSliceCount(); for (uint32_t i = 0; i < count; i++) { H264Slice * slice = slicesInfo->GetSlice(i); if (!slice->IsReference()) continue; ViewItem &view = GetView(slice->GetSliceHeader()->nal_ext.mvc.view_id); DecReferencePictureMarking::UpdateRefPicMarking(view, pFrame, slice, field); DecReferencePictureMarking::ResetUnusedFrames(view); break; } } H264DecoderFrame * TaskSupplier::FindSurface(FrameMemID id) { AutomaticUMCMutex guard(m_mGuard); ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); for (; iter != iter_end; ++iter) { H264DecoderFrame *pFrame = iter->GetDPBList(0)->head(); for (; pFrame; pFrame = pFrame->future()) { if (pFrame->GetFrameData()->GetFrameMID() == id) return pFrame; } } return 0; } Status TaskSupplier::RunDecoding() { Status umcRes = CompleteDecodedFrames(0); if (umcRes != UMC_OK) return umcRes; ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); H264DecoderFrame *pFrame = 0; for (; iter != iter_end; ++iter) { pFrame = iter->GetDPBList(0)->head(); for (; pFrame; pFrame = pFrame->future()) { if (!pFrame->IsDecodingCompleted()) { break; } } if (pFrame) break; } m_pTaskBroker->Start(); if (!pFrame) return UMC_OK; //DEBUG_PRINT((VM_STRING("Decode POC - %d\n"), pFrame->m_PicOrderCnt[0])); return UMC_OK; } Status TaskSupplier::GetUserData(MediaData * pUD) { if(!pUD) return UMC_ERR_NULL_PTR; if (!m_pLastDisplayed) return UMC_ERR_NOT_ENOUGH_DATA; if (m_pLastDisplayed->m_UserData.user_data.size() && m_pLastDisplayed->m_UserData.payLoadSize && m_pLastDisplayed->m_UserData.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { pUD->SetTime(m_pLastDisplayed->m_dFrameTime); pUD->SetBufferPointer(&m_pLastDisplayed->m_UserData.user_data[0], m_pLastDisplayed->m_UserData.payLoadSize); pUD->SetDataSize(m_pLastDisplayed->m_UserData.payLoadSize); //m_pLastDisplayed->m_UserData.Reset(); return UMC_OK; } return UMC_ERR_NOT_ENOUGH_DATA; } void TaskSupplier::ApplyPayloadsToFrame(H264DecoderFrame * frame, H264Slice *slice, SeiPayloadArray * payloads) { if (!payloads || !frame) return; if (m_sei_messages) { m_sei_messages->SetFrame(frame, frame->m_auIndex); } H264SEIPayLoad * payload = payloads->FindPayload(SEI_PIC_TIMING_TYPE); if (frame->m_displayPictureStruct == DPS_UNKNOWN) { if (payload && slice->GetSeqParam()->vui.pic_struct_present_flag) { frame->m_displayPictureStruct = payload->SEI_messages.pic_timing.pic_struct; } else { if (frame->m_PictureStructureForDec == FLD_STRUCTURE) { frame->m_displayPictureStruct = frame->GetNumberByParity(0) ? DPS_BOTTOM : DPS_TOP; } else { if (frame->PicOrderCnt(0, 1) == frame->PicOrderCnt(1, 1)) { frame->m_displayPictureStruct = DPS_FRAME; } else { frame->m_displayPictureStruct = (frame->PicOrderCnt(0, 1) < frame->PicOrderCnt(1, 1)) ? DPS_TOP_BOTTOM : DPS_BOTTOM_TOP; } } } } frame->m_dpb_output_delay = DPBOutput::GetDPBOutputDelay(payload); if (frame->GetAU(0)->m_isBExist || frame->GetAU(1)->m_isBExist) DPBOutput::GetDPBOutputDelay(0); payload = payloads->FindPayload(SEI_DEC_REF_PIC_MARKING_TYPE); if (payload) { ViewItem &view = GetViewByNumber(BASE_VIEW); DecReferencePictureMarking::CheckSEIRepetition(view, payload); } } Status TaskSupplier::AllocateNewFrame(const H264Slice *slice, H264DecoderFrame **frame) { if (!frame || !slice) { return UMC_ERR_NULL_PTR; } *frame = 0; m_currentView = slice->GetSliceHeader()->nal_ext.mvc.view_id; ViewItem &view = GetView(m_currentView); if (view.pCurFrame && view.pCurFrame->m_PictureStructureForDec < FRM_STRUCTURE) { H264Slice * pFirstFrameSlice = view.pCurFrame->GetAU(0)->GetSlice(0); if (pFirstFrameSlice && IsFieldOfOneFrame(view.pCurFrame, pFirstFrameSlice, slice)) { *frame = view.pCurFrame; InitFrameCounter(*frame, slice); } view.pCurFrame = 0; } if (*frame) return UMC_OK; H264DecoderFrame *pFrame = GetFreeFrame(slice); if (!pFrame) { return UMC_ERR_NOT_ENOUGH_BUFFER; } Status umcRes = AllocateFrameData(pFrame); if (umcRes != UMC_OK) { return umcRes; } *frame = pFrame; if (slice->IsField()) { pFrame->GetAU(1)->SetStatus(H264DecoderFrameInfo::STATUS_NOT_FILLED); } InitFrameCounter(pFrame, slice); return UMC_OK; } // H264DecoderFrame * TaskSupplier::AddFrame(H264Slice *pSlice) } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp000066400000000000000000000762511443134507600322120ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_va_packer.h" #include "umc_h264_task_supplier.h" #include "umc_va_linux.h" #include "umc_va_video_processing.h" #include "mfx_common_int.h" #include "mfx_ext_buffers.h" #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) #include "vaapi_ext_interface.h" #endif #include "mfx_trace.h" #include "mfx_unified_h264d_logging.h" namespace UMC { enum ChoppingStatus { CHOPPING_NONE = 0, CHOPPING_SPLIT_SLICE_DATA = 1, CHOPPING_SPLIT_SLICES = 2, CHOPPING_SKIP_SLICE, }; Packer::Packer(VideoAccelerator * va, TaskSupplier * supplier) : m_va(va) , m_supplier(supplier) { } Packer::~Packer() { } Status Packer::SyncTask(H264DecoderFrame* pFrame, void * error) { return m_va->SyncTask(pFrame->m_index, error); } Status Packer::QueryTaskStatus(int32_t index, void * status, void * error) { return m_va->QueryTaskStatus(index, status, error); } Status Packer::QueryStreamOut(H264DecoderFrame* pFrame) { (void)pFrame; return UMC_OK; } Packer * Packer::CreatePacker(VideoAccelerator * va, TaskSupplier* supplier) { (void)va; (void)supplier; Packer * packer = 0; packer = new PackerVA(va, supplier); return packer; } /****************************************************************************************************/ // VA linux packer implementation /****************************************************************************************************/ PackerVA::PackerVA(VideoAccelerator * va, TaskSupplier * supplier) : Packer(va, supplier) { } Status PackerVA::GetStatusReport(void * pStatusReport, size_t size) { (void)pStatusReport; (void)size; return UMC_OK; } void PackerVA::FillFrame(VAPictureH264 * pic, const H264DecoderFrame *pFrame, int32_t field, int32_t reference, int32_t defaultIndex) { int32_t index = pFrame->m_index; if (index == -1) index = defaultIndex; pic->picture_id = m_va->GetSurfaceID(index); pic->frame_idx = pFrame->isLongTermRef() ? (uint16_t)pFrame->m_LongTermFrameIdx : (uint16_t)pFrame->m_FrameNum; int parityNum0 = pFrame->GetNumberByParity(0); if (parityNum0 >= 0 && parityNum0 < 2) { pic->TopFieldOrderCnt = pFrame->m_PicOrderCnt[parityNum0]; } else { assert(0); } int parityNum1 = pFrame->GetNumberByParity(1); if (parityNum1 >= 0 && parityNum1 < 2) { pic->BottomFieldOrderCnt = pFrame->m_PicOrderCnt[parityNum1]; } else { assert(0); } pic->flags = 0; if (pFrame->m_PictureStructureForDec == 0) { pic->flags |= field ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } if (reference == 1) pic->flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; if (reference == 2) pic->flags |= VA_PICTURE_H264_LONG_TERM_REFERENCE; if (pic->picture_id == VA_INVALID_ID) { pic->frame_idx = 0; pic->TopFieldOrderCnt = 0; pic->BottomFieldOrderCnt = 0; pic->flags = VA_PICTURE_H264_INVALID; } } int32_t PackerVA::FillRefFrame(VAPictureH264 * pic, const H264DecoderFrame *pFrame, ReferenceFlags flags, bool isField, int32_t defaultIndex) { int32_t index = pFrame->m_index; if (index == -1) index = defaultIndex; pic->picture_id = m_va->GetSurfaceID(index); pic->frame_idx = pFrame->isLongTermRef() ? (uint16_t)pFrame->m_LongTermFrameIdx : (uint16_t)pFrame->m_FrameNum; int parityNum0 = pFrame->GetNumberByParity(0); if (parityNum0 >= 0 && parityNum0 < 2) { pic->TopFieldOrderCnt = pFrame->m_PicOrderCnt[parityNum0]; } else { assert(0); } int parityNum1 = pFrame->GetNumberByParity(1); if (parityNum1 >= 0 && parityNum1 < 2) { pic->BottomFieldOrderCnt = pFrame->m_PicOrderCnt[parityNum1]; } else { assert(0); } pic->flags = 0; if (isField) { pic->flags |= flags.field ? VA_PICTURE_H264_BOTTOM_FIELD : VA_PICTURE_H264_TOP_FIELD; } pic->flags |= flags.isShortReference ? VA_PICTURE_H264_SHORT_TERM_REFERENCE : VA_PICTURE_H264_LONG_TERM_REFERENCE; if (pic->picture_id == VA_INVALID_ID) { pic->frame_idx = 0; pic->TopFieldOrderCnt = 0; pic->BottomFieldOrderCnt = 0; pic->flags = VA_PICTURE_H264_INVALID; } return pic->picture_id; } void PackerVA::FillFrameAsInvalid(VAPictureH264 * pic) { pic->picture_id = VA_INVALID_SURFACE; pic->frame_idx = 0; pic->TopFieldOrderCnt = 0; pic->BottomFieldOrderCnt = 0; pic->flags = VA_PICTURE_H264_INVALID; } void PackerVA::PackPicParams(H264DecoderFrameInfo * pSliceInfo, H264Slice * pSlice) { const UMC_H264_DECODER::H264SliceHeader* pSliceHeader = pSlice->GetSliceHeader(); const UMC_H264_DECODER::H264SeqParamSet* pSeqParamSet = pSlice->GetSeqParam(); const UMC_H264_DECODER::H264PicParamSet* pPicParamSet = pSlice->GetPicParam(); const H264DecoderFrame *pCurrentFrame = pSliceInfo->m_pFrame; UMCVACompBuffer *picParamBuf; VAPictureParameterBufferH264* pPicParams_H264 = (VAPictureParameterBufferH264*)m_va->GetCompBuffer(VAPictureParameterBufferType, &picParamBuf, sizeof(VAPictureParameterBufferH264)); if (!pPicParams_H264) throw h264_exception(UMC_ERR_FAILED); memset(pPicParams_H264, 0, sizeof(VAPictureParameterBufferH264)); int32_t reference = pCurrentFrame->isShortTermRef() ? 1 : (pCurrentFrame->isLongTermRef() ? 2 : 0); FillFrame(&(pPicParams_H264->CurrPic), pCurrentFrame, pSliceHeader->bottom_field_flag, reference, 0); pPicParams_H264->CurrPic.flags = 0; if (reference == 1) pPicParams_H264->CurrPic.flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; if (reference == 2) pPicParams_H264->CurrPic.flags |= VA_PICTURE_H264_LONG_TERM_REFERENCE; if (pSliceHeader->field_pic_flag) { if (pSliceHeader->bottom_field_flag) { pPicParams_H264->CurrPic.flags |= VA_PICTURE_H264_BOTTOM_FIELD; pPicParams_H264->CurrPic.TopFieldOrderCnt = 0; } else { pPicParams_H264->CurrPic.flags |= VA_PICTURE_H264_TOP_FIELD; pPicParams_H264->CurrPic.BottomFieldOrderCnt = 0; } } //packing pPicParams_H264->picture_width_in_mbs_minus1 = (unsigned short)(pSeqParamSet->frame_width_in_mbs - 1); pPicParams_H264->picture_height_in_mbs_minus1 = (unsigned short)(pSeqParamSet->frame_height_in_mbs - 1); pPicParams_H264->bit_depth_luma_minus8 = (unsigned char)(pSeqParamSet->bit_depth_luma - 8); pPicParams_H264->bit_depth_chroma_minus8 = (unsigned char)(pSeqParamSet->bit_depth_chroma - 8); pPicParams_H264->num_ref_frames = (unsigned char)pSeqParamSet->num_ref_frames; pPicParams_H264->seq_fields.bits.chroma_format_idc = pSeqParamSet->chroma_format_idc; pPicParams_H264->seq_fields.bits.residual_colour_transform_flag = pSeqParamSet->residual_colour_transform_flag; //pPicParams_H264->seq_fields.bits.gaps_in_frame_num_value_allowed_flag = ??? pPicParams_H264->seq_fields.bits.frame_mbs_only_flag = pSeqParamSet->frame_mbs_only_flag; pPicParams_H264->seq_fields.bits.mb_adaptive_frame_field_flag = pSliceHeader->MbaffFrameFlag; pPicParams_H264->seq_fields.bits.direct_8x8_inference_flag = pSeqParamSet->direct_8x8_inference_flag; pPicParams_H264->seq_fields.bits.MinLumaBiPredSize8x8 = pSeqParamSet->level_idc > 30 ? 1 : 0; pPicParams_H264->seq_fields.bits.log2_max_frame_num_minus4 = (unsigned char)(pSeqParamSet->log2_max_frame_num - 4); pPicParams_H264->seq_fields.bits.pic_order_cnt_type = pSeqParamSet->pic_order_cnt_type; pPicParams_H264->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = (unsigned char)(pSeqParamSet->log2_max_pic_order_cnt_lsb - 4); pPicParams_H264->seq_fields.bits.delta_pic_order_always_zero_flag = pSeqParamSet->delta_pic_order_always_zero_flag; // pPicParams_H264->num_slice_groups_minus1 = (unsigned char)(pPicParamSet->num_slice_groups - 1); // pPicParams_H264->slice_group_map_type = (unsigned char)pPicParamSet->SliceGroupInfo.slice_group_map_type; pPicParams_H264->pic_init_qp_minus26 = (unsigned char)(pPicParamSet->pic_init_qp - 26); pPicParams_H264->pic_init_qs_minus26 = (unsigned char)(pPicParamSet->pic_init_qs - 26); pPicParams_H264->chroma_qp_index_offset = (unsigned char)pPicParamSet->chroma_qp_index_offset[0]; pPicParams_H264->second_chroma_qp_index_offset = (unsigned char)pPicParamSet->chroma_qp_index_offset[1]; pPicParams_H264->pic_fields.bits.entropy_coding_mode_flag = pPicParamSet->entropy_coding_mode; pPicParams_H264->pic_fields.bits.weighted_pred_flag = pPicParamSet->weighted_pred_flag; pPicParams_H264->pic_fields.bits.weighted_bipred_idc = pPicParamSet->weighted_bipred_idc; pPicParams_H264->pic_fields.bits.transform_8x8_mode_flag = pPicParamSet->transform_8x8_mode_flag; pPicParams_H264->pic_fields.bits.field_pic_flag = pSliceHeader->field_pic_flag; pPicParams_H264->pic_fields.bits.constrained_intra_pred_flag = pPicParamSet->constrained_intra_pred_flag; pPicParams_H264->pic_fields.bits.pic_order_present_flag = pPicParamSet->bottom_field_pic_order_in_frame_present_flag; pPicParams_H264->pic_fields.bits.deblocking_filter_control_present_flag = pPicParamSet->deblocking_filter_variables_present_flag; pPicParams_H264->pic_fields.bits.redundant_pic_cnt_present_flag = 0;//pPicParamSet->redundant_pic_cnt_present_flag; pPicParams_H264->pic_fields.bits.reference_pic_flag = pSliceHeader->nal_ref_idc != 0; //!!! pPicParams_H264->frame_num = (unsigned short)pSliceHeader->frame_num; // pPicParams_H264->num_ref_idx_l0_default_active_minus1 = (unsigned char)(pPicParamSet->num_ref_idx_l0_active-1); // pPicParams_H264->num_ref_idx_l1_default_active_minus1 = (unsigned char)(pPicParamSet->num_ref_idx_l1_active-1); //create reference picture list for (int32_t i = 0; i < 16; i++) { FillFrameAsInvalid(&(pPicParams_H264->ReferenceFrames[i])); } int32_t referenceCount = 0; int32_t j = 0; int32_t viewCount = m_supplier->GetViewCount(); for (int32_t i = 0; i < viewCount; i++) { ViewItem & view = m_supplier->GetViewByNumber(i); H264DBPList * pDPBList = view.GetDPBList(0); int32_t dpbSize = pDPBList->GetDPBSize(); int32_t start = j; TRACE_BUFFER_EVENT(MFX_TRACE_API_AVC_DPBPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_DPB_INFO, pDPBList, H264DecodeDpbInfo, DPBINFO_H264D); for (H264DecoderFrame * pFrm = pDPBList->head(); pFrm && (j < dpbSize + start); pFrm = pFrm->future()) { if (j >= 16) { assert(false); throw h264_exception(UMC_ERR_FAILED); } assert(j < dpbSize + start); int32_t defaultIndex = 0; if ((0 == pCurrentFrame->m_index) && !pFrm->IsFrameExist()) { defaultIndex = 1; } int32_t reference = pFrm->isShortTermRef() ? 1 : (pFrm->isLongTermRef() ? 2 : 0); if (!reference && pCurrentFrame != pFrm && (pFrm->isInterViewRef(0) || pFrm->isInterViewRef(1)) && (pFrm->PicOrderCnt(0, 3) == pCurrentFrame->PicOrderCnt(0, 3)) && pFrm->m_viewId < pCurrentFrame->m_viewId) { // interview reference reference = 1; } if (!reference) { continue; } reference = pFrm->isShortTermRef() ? 1 : (pFrm->isLongTermRef() ? 2 : 0); referenceCount ++; int32_t field = pFrm->m_bottom_field_flag[0]; FillFrame(&(pPicParams_H264->ReferenceFrames[j]), pFrm, field, reference, defaultIndex); reference = pFrm->isShortTermRef() ? 1 : (pFrm->isLongTermRef() ? 2 : 0); if ((pFrm == pCurrentFrame) && ((&pCurrentFrame->m_pSlicesInfo) != pSliceInfo)) { FillFrame(&(pPicParams_H264->ReferenceFrames[j]), pFrm, 0, reference, defaultIndex); } j++; } } picParamBuf->SetDataSize(sizeof(VAPictureParameterBufferH264)); TRACE_BUFFER_EVENT(VA_TRACE_API_AVC_PICTUREPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_PICPARAM, pPicParams_H264, H264DecodePicparam, PICTUREPARAM_AVC); } //returns both NAL unit size (in bytes) and bit offset from start to actual slice data inline uint8_t* GetSliceStat(H264Slice* slice, uint32_t* size, uint32_t* offset) { assert(slice); assert(size); H264HeadersBitstream* bs = slice->GetBitStream(); assert(bs); uint8_t* base; //ptr to first byte of start code bs->GetOrg(reinterpret_cast(&base), size); if (offset) { uint8_t* ptr; //ptr to slice data uint32_t position; bs->GetState(reinterpret_cast(&ptr), &position); assert(base != ptr && "slice header should be already parsed here" ); //GetState returns internal offset (bits left) but we need consumed bits position = 31 - position; //bit from start code to slice data position += 8 * (ptr - base); *offset = position; } return base; } void PackerVA::CreateSliceParamBuffer(H264DecoderFrameInfo * pSliceInfo) { int32_t count = pSliceInfo->GetSliceCount(); UMCVACompBuffer *pSliceParamBuf; size_t sizeOfStruct = sizeof(VASliceParameterBufferH264); if (!m_va->IsLongSliceControl()) { sizeOfStruct = sizeof(VASliceParameterBufferBase); } m_va->GetCompBuffer(VASliceParameterBufferType, &pSliceParamBuf, sizeOfStruct*(count)); if (!pSliceParamBuf) throw h264_exception(UMC_ERR_FAILED); pSliceParamBuf->SetNumOfItem(count); } void PackerVA::CreateSliceDataBuffer(H264DecoderFrameInfo * pSliceInfo) { int32_t count = pSliceInfo->GetSliceCount(); uint32_t size = 0; for (int32_t i = 0; i < count; i++) { H264Slice* pSlice = pSliceInfo->GetSlice(i); uint32_t NalUnitSize; GetSliceStat(pSlice, &NalUnitSize, 0); size += NalUnitSize; } uint32_t const AlignedNalUnitSize = mfx::align2_value(size, 128); UMCVACompBuffer* compBuf; m_va->GetCompBuffer(VASliceDataBufferType, &compBuf, AlignedNalUnitSize); if (!compBuf) throw h264_exception(UMC_ERR_FAILED); memset((uint8_t*)compBuf->GetPtr() + size, 0, AlignedNalUnitSize - size); compBuf->SetDataSize(0); } int32_t PackerVA::PackSliceParams(H264Slice *pSlice, int32_t sliceNum, int32_t chopping, int32_t ) { int32_t partial_data = CHOPPING_NONE; H264DecoderFrame *pCurrentFrame = pSlice->GetCurrentFrame(); if (pCurrentFrame == nullptr) throw h264_exception(UMC_ERR_FAILED); const UMC_H264_DECODER::H264SliceHeader *pSliceHeader = pSlice->GetSliceHeader(); VAPictureParameterBufferH264* pPicParams_H264 = (VAPictureParameterBufferH264*)m_va->GetCompBuffer(VAPictureParameterBufferType); if (!pPicParams_H264) throw h264_exception(UMC_ERR_FAILED); UMCVACompBuffer* compBuf; VASliceParameterBufferH264* pSlice_H264 = (VASliceParameterBufferH264*)m_va->GetCompBuffer(VASliceParameterBufferType, &compBuf); if (!pSlice_H264) throw h264_exception(UMC_ERR_FAILED); if (m_va->IsLongSliceControl()) { pSlice_H264 += sliceNum; memset(pSlice_H264, 0, sizeof(VASliceParameterBufferH264)); } else { pSlice_H264 = (VASliceParameterBufferH264*)((VASliceParameterBufferBase*)pSlice_H264 + sliceNum); memset(pSlice_H264, 0, sizeof(VASliceParameterBufferBase)); } uint32_t NalUnitSize, SliceDataOffset; uint8_t* pNalUnit = GetSliceStat(pSlice, &NalUnitSize, &SliceDataOffset); if (SliceDataOffset >= NalUnitSize * 8) //no slice data, skipping return CHOPPING_SKIP_SLICE; H264HeadersBitstream* pBitstream = pSlice->GetBitStream(); if (chopping == CHOPPING_SPLIT_SLICE_DATA) { NalUnitSize = pBitstream->BytesLeft(); pNalUnit += pBitstream->BytesDecoded(); } UMCVACompBuffer* CompBuf; uint8_t *pVAAPI_BitStreamBuffer = (uint8_t*)m_va->GetCompBuffer(VASliceDataBufferType, &CompBuf); if (!pVAAPI_BitStreamBuffer) throw h264_exception(UMC_ERR_FAILED); int32_t AlignedNalUnitSize = NalUnitSize; pSlice_H264->slice_data_flag = chopping == CHOPPING_NONE ? VA_SLICE_DATA_FLAG_ALL : VA_SLICE_DATA_FLAG_END; if (CompBuf->GetBufferSize() - CompBuf->GetDataSize() < AlignedNalUnitSize) { AlignedNalUnitSize = NalUnitSize = CompBuf->GetBufferSize() - CompBuf->GetDataSize(); pBitstream->SetDecodedBytes(pBitstream->BytesDecoded() + NalUnitSize); pSlice_H264->slice_data_flag = chopping == CHOPPING_NONE ? VA_SLICE_DATA_FLAG_BEGIN : VA_SLICE_DATA_FLAG_MIDDLE; partial_data = CHOPPING_SPLIT_SLICE_DATA; } pSlice_H264->slice_data_size = NalUnitSize; pSlice_H264->slice_data_offset = CompBuf->GetDataSize(); CompBuf->SetDataSize(pSlice_H264->slice_data_offset + AlignedNalUnitSize); assert (CompBuf->GetBufferSize() >= pSlice_H264->slice_data_offset + AlignedNalUnitSize); pVAAPI_BitStreamBuffer += pSlice_H264->slice_data_offset; std::copy(pNalUnit, pNalUnit + NalUnitSize, pVAAPI_BitStreamBuffer); memset(pVAAPI_BitStreamBuffer + NalUnitSize, 0, AlignedNalUnitSize - NalUnitSize); if (!m_va->IsLongSliceControl()) return partial_data; pSlice_H264->slice_data_bit_offset = (unsigned short)SliceDataOffset; pSlice_H264->first_mb_in_slice = (unsigned short)(pSlice->GetSliceHeader()->first_mb_in_slice >> pSlice->GetSliceHeader()->MbaffFrameFlag); pSlice_H264->slice_type = (unsigned char)pSliceHeader->slice_type; pSlice_H264->direct_spatial_mv_pred_flag = (unsigned char)pSliceHeader->direct_spatial_mv_pred_flag; pSlice_H264->cabac_init_idc = (unsigned char)(pSliceHeader->cabac_init_idc); pSlice_H264->slice_qp_delta = (char)pSliceHeader->slice_qp_delta; pSlice_H264->disable_deblocking_filter_idc = (unsigned char)pSliceHeader->disable_deblocking_filter_idc; pSlice_H264->luma_log2_weight_denom = (unsigned char)pSliceHeader->luma_log2_weight_denom; pSlice_H264->chroma_log2_weight_denom = (unsigned char)pSliceHeader->chroma_log2_weight_denom; if (pSliceHeader->slice_type == INTRASLICE || pSliceHeader->slice_type == S_INTRASLICE) { pSlice_H264->num_ref_idx_l0_active_minus1 = 0; pSlice_H264->num_ref_idx_l1_active_minus1 = 0; } else if (pSliceHeader->slice_type == PREDSLICE || pSliceHeader->slice_type == S_PREDSLICE) { if (pSliceHeader->num_ref_idx_active_override_flag != 0) { pSlice_H264->num_ref_idx_l0_active_minus1 = (unsigned char)(pSliceHeader->num_ref_idx_l0_active-1); } else { pSlice_H264->num_ref_idx_l0_active_minus1 = (unsigned char)(pSlice->GetPicParam()->num_ref_idx_l0_active - 1); } pSlice_H264->num_ref_idx_l1_active_minus1 = 0; } else // B slice { if (pSliceHeader->num_ref_idx_active_override_flag != 0) { pSlice_H264->num_ref_idx_l0_active_minus1 = (unsigned char)(pSliceHeader->num_ref_idx_l0_active - 1); pSlice_H264->num_ref_idx_l1_active_minus1 = (unsigned char)(pSliceHeader->num_ref_idx_l1_active-1); } else { pSlice_H264->num_ref_idx_l0_active_minus1 = (unsigned char)(pSlice->GetPicParam()->num_ref_idx_l0_active - 1); pSlice_H264->num_ref_idx_l1_active_minus1 = (unsigned char)(pSlice->GetPicParam()->num_ref_idx_l1_active - 1); } } if (pSliceHeader->disable_deblocking_filter_idc != DEBLOCK_FILTER_OFF) { pSlice_H264->slice_alpha_c0_offset_div2 = (char)(pSliceHeader->slice_alpha_c0_offset / 2); pSlice_H264->slice_beta_offset_div2 = (char)(pSliceHeader->slice_beta_offset / 2); } if ((pPicParams_H264->pic_fields.bits.weighted_pred_flag && ((PREDSLICE == pSliceHeader->slice_type) || (S_PREDSLICE == pSliceHeader->slice_type))) || ((pPicParams_H264->pic_fields.bits.weighted_bipred_idc == 1) && (BPREDSLICE == pSliceHeader->slice_type))) { //Weights const UMC_H264_DECODER::PredWeightTable *pPredWeight[2]; pPredWeight[0] = pSlice->GetPredWeigthTable(0); pPredWeight[1] = pSlice->GetPredWeigthTable(1); int32_t i; for(i=0; i < 32; i++) { if (pPredWeight[0][i].luma_weight_flag) { pSlice_H264->luma_weight_l0[i] = pPredWeight[0][i].luma_weight; pSlice_H264->luma_offset_l0[i] = pPredWeight[0][i].luma_offset; } else { pSlice_H264->luma_weight_l0[i] = (uint8_t)pPredWeight[0][i].luma_weight; pSlice_H264->luma_offset_l0[i] = 0; } if (pPredWeight[1][i].luma_weight_flag) { pSlice_H264->luma_weight_l1[i] = pPredWeight[1][i].luma_weight; pSlice_H264->luma_offset_l1[i] = pPredWeight[1][i].luma_offset; } else { pSlice_H264->luma_weight_l1[i] = (uint8_t)pPredWeight[1][i].luma_weight; pSlice_H264->luma_offset_l1[i] = 0; } if (pPredWeight[0][i].chroma_weight_flag) { pSlice_H264->chroma_weight_l0[i][0] = pPredWeight[0][i].chroma_weight[0]; pSlice_H264->chroma_offset_l0[i][0] = pPredWeight[0][i].chroma_offset[0]; pSlice_H264->chroma_weight_l0[i][1] = pPredWeight[0][i].chroma_weight[1]; pSlice_H264->chroma_offset_l0[i][1] = pPredWeight[0][i].chroma_offset[1]; } else { pSlice_H264->chroma_weight_l0[i][0] = (uint8_t)pPredWeight[0][i].chroma_weight[0]; pSlice_H264->chroma_offset_l0[i][0] = 0; pSlice_H264->chroma_weight_l0[i][1] = (uint8_t)pPredWeight[0][i].chroma_weight[1]; pSlice_H264->chroma_offset_l0[i][1] = 0; } if (pPredWeight[1][i].chroma_weight_flag) { pSlice_H264->chroma_weight_l1[i][0] = pPredWeight[1][i].chroma_weight[0]; pSlice_H264->chroma_offset_l1[i][0] = pPredWeight[1][i].chroma_offset[0]; pSlice_H264->chroma_weight_l1[i][1] = pPredWeight[1][i].chroma_weight[1]; pSlice_H264->chroma_offset_l1[i][1] = pPredWeight[1][i].chroma_offset[1]; } else { pSlice_H264->chroma_weight_l1[i][0] = (uint8_t)pPredWeight[1][i].chroma_weight[0]; pSlice_H264->chroma_offset_l1[i][0] = 0; pSlice_H264->chroma_weight_l1[i][1] = (uint8_t)pPredWeight[1][i].chroma_weight[1]; pSlice_H264->chroma_offset_l1[i][1] = 0; } } } int32_t realSliceNum = pSlice->GetSliceNum(); const H264DecoderRefPicList* pH264DecRefPicList0 = pCurrentFrame->GetRefPicList(realSliceNum, 0); const H264DecoderRefPicList* pH264DecRefPicList1 = pCurrentFrame->GetRefPicList(realSliceNum, 1); if (pH264DecRefPicList0 == nullptr || pH264DecRefPicList1 == nullptr) throw h264_exception(UMC_ERR_FAILED); H264DecoderFrame **pRefPicList0 = pH264DecRefPicList0->m_RefPicList; H264DecoderFrame **pRefPicList1 = pH264DecRefPicList1->m_RefPicList; ReferenceFlags *pFields0 = pH264DecRefPicList0->m_Flags; ReferenceFlags *pFields1 = pH264DecRefPicList1->m_Flags; int32_t i; for(i = 0; i < 32; i++) { if (pRefPicList0[i] != NULL && i < pSliceHeader->num_ref_idx_l0_active) { int32_t defaultIndex = ((0 == pCurrentFrame->m_index) && !pRefPicList0[i]->IsFrameExist()) ? 1 : 0; FillRefFrame(&(pSlice_H264->RefPicList0[i]), pRefPicList0[i], pFields0[i], pSliceHeader->field_pic_flag, defaultIndex); if (pSlice_H264->RefPicList0[i].picture_id == pPicParams_H264->CurrPic.picture_id && pRefPicList0[i]->IsFrameExist()) { pSlice_H264->RefPicList0[i].BottomFieldOrderCnt = 0; } } else { FillFrameAsInvalid(&(pSlice_H264->RefPicList0[i])); } if (pRefPicList1[i] != NULL && i < pSliceHeader->num_ref_idx_l1_active) { int32_t defaultIndex = ((0 == pCurrentFrame->m_index) && !pRefPicList1[i]->IsFrameExist()) ? 1 : 0; FillRefFrame(&(pSlice_H264->RefPicList1[i]), pRefPicList1[i], pFields1[i], pSliceHeader->field_pic_flag, defaultIndex); if (pSlice_H264->RefPicList1[i].picture_id == pPicParams_H264->CurrPic.picture_id && pRefPicList1[i]->IsFrameExist()) { pSlice_H264->RefPicList1[i].BottomFieldOrderCnt = 0; } } else { FillFrameAsInvalid(&(pSlice_H264->RefPicList1[i])); } } TRACE_BUFFER_EVENT(VA_TRACE_API_AVC_SLICEPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_SLICEPARAM, pSlice_H264, H264DecodeSliceParam, SLICEPARAM_AVC); return partial_data; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE void PackerVA::PackProcessingInfo(H264DecoderFrameInfo * sliceInfo) { VideoProcessingVA *vpVA = m_va->GetVideoProcessingVA(); if (!vpVA) throw h264_exception(UMC_ERR_FAILED); UMCVACompBuffer *pipelineVABuf; auto* pipelineBuf = reinterpret_cast(m_va->GetCompBuffer(VAProcPipelineParameterBufferType, &pipelineVABuf, sizeof(VAProcPipelineParameterBuffer))); if (!pipelineBuf) throw h264_exception(UMC_ERR_FAILED); pipelineVABuf->SetDataSize(sizeof(VAProcPipelineParameterBuffer)); MFX_INTERNAL_CPY(pipelineBuf, &vpVA->m_pipelineParams, sizeof(VAProcPipelineParameterBuffer)); pipelineBuf->surface = m_va->GetSurfaceID(sliceInfo->m_pFrame->m_index); // should filled in packer pipelineBuf->additional_outputs = (VASurfaceID*)vpVA->GetCurrentOutputSurface(); // To keep output aligned, decode downsampling use this fixed combination of chroma sitting type pipelineBuf->input_color_properties.chroma_sample_location = VA_CHROMA_SITING_HORIZONTAL_LEFT | VA_CHROMA_SITING_VERTICAL_CENTER; } #endif // #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE void PackerVA::PackQmatrix(const UMC_H264_DECODER::H264ScalingPicParams * scaling) { UMCVACompBuffer *quantBuf; auto* pQmatrix_H264 = reinterpret_cast(m_va->GetCompBuffer(VAIQMatrixBufferType, &quantBuf, sizeof(VAIQMatrixBufferH264))); if (!pQmatrix_H264) throw h264_exception(UMC_ERR_FAILED); quantBuf->SetDataSize(sizeof(VAIQMatrixBufferH264)); int32_t j; for(j = 0; j < 6; ++j) { std::copy(std::begin(scaling->ScalingLists4x4[j].ScalingListCoeffs), std::end(scaling->ScalingLists4x4[j].ScalingListCoeffs), std::begin(pQmatrix_H264->ScalingList4x4[j])); } for(j = 0; j < 2; ++j) { std::copy(std::begin(scaling->ScalingLists8x8[j].ScalingListCoeffs), std::end(scaling->ScalingLists8x8[j].ScalingListCoeffs), std::begin(pQmatrix_H264->ScalingList8x8[j])); } TRACE_BUFFER_EVENT(VA_TRACE_API_AVC_QMATRIXARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_QMATRIX, pQmatrix_H264, H264DecodeQmatrixParam, QMATRIX_H264D); } void PackerVA::BeginFrame(H264DecoderFrame* pFrame, int32_t field) { #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) FrameData* fd = pFrame->GetFrameData(); assert(fd); FrameData::FrameAuxInfo* aux; aux = fd->GetAuxInfo(MFX_EXTBUFF_GPU_HANG); if (aux) { assert(aux->type == MFX_EXTBUFF_GPU_HANG); mfxExtIntGPUHang* ht = reinterpret_cast(aux->ptr); assert(ht && "Buffer pointer should be valid here"); if (!ht) throw h264_exception(UMC_ERR_FAILED); //clear trigger to ensure GPU hang fired only once for this frame fd->ClearAuxInfo(aux->type); UMCVACompBuffer* buffer = NULL; m_va->GetCompBuffer(VATriggerCodecHangBufferType, &buffer, sizeof(unsigned int)); if (buffer) { unsigned int* trigger = reinterpret_cast(buffer->GetPtr()); if (!trigger) throw h264_exception(UMC_ERR_FAILED); *trigger = 1; } } #endif // defined (MFX_EXTBUFF_GPU_HANG_ENABLE) } void PackerVA::EndFrame() { } void PackerVA::PackAU(const H264DecoderFrame *pFrame, int32_t isTop) { H264DecoderFrameInfo* sliceInfo = const_cast(pFrame->GetAU(isTop)); uint32_t const count_all = sliceInfo->GetSliceCount(); if (!m_va || !count_all) return; uint32_t first_slice = 0; H264Slice* slice = sliceInfo->GetSlice(first_slice); NAL_Unit_Type const type = slice->GetSliceHeader()->nal_unit_type; UMC_H264_DECODER::H264ScalingPicParams const* scaling = &slice->GetPicParam()->scaling[type == NAL_UT_CODED_SLICE_EXTENSION ? 1 : 0]; PackQmatrix(scaling); int32_t chopping = CHOPPING_NONE; for ( ; first_slice < count_all; ) { PackPicParams(sliceInfo, slice); CreateSliceParamBuffer(sliceInfo); CreateSliceDataBuffer(sliceInfo); uint32_t n = 0, count = 0; for (; n < count_all; ++n) { // put slice header H264Slice *pSlice = sliceInfo->GetSlice(first_slice + n); chopping = PackSliceParams(pSlice, n, chopping, 0 /* ignored */); if (chopping != CHOPPING_SKIP_SLICE) { ++count; if (chopping != CHOPPING_NONE) break; } } first_slice += n; UMCVACompBuffer *sliceParamBuf; m_va->GetCompBuffer(VASliceParameterBufferType, &sliceParamBuf); if (!sliceParamBuf) throw h264_exception(UMC_ERR_FAILED); sliceParamBuf->SetNumOfItem(count); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (m_va->GetVideoProcessingVA()) PackProcessingInfo(sliceInfo); #endif Status sts = m_va->Execute(); if (sts != UMC_OK) throw h264_exception(sts); } } Status PackerVA::QueryStreamOut(H264DecoderFrame* pFrame) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "PackerVA::QueryStreamOut"); return UMC_OK; } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_supplier.cpp000066400000000000000000000315631443134507600326050ustar00rootroot00000000000000// Copyright (c) 2003-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_H264_VIDEO_DECODE) #include "umc_h264_va_supplier.h" #include "umc_h264_frame_list.h" #include "umc_h264_nal_spl.h" #include "umc_h264_bitstream_headers.h" #include "umc_h264_dec_defs_dec.h" #include "umc_h264_segment_decoder_base.h" #include "umc_h264_task_broker.h" #include "umc_structures.h" #include "umc_h264_dec_debug.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_common_int.h" #include "mfx_ext_buffers.h" #include "umc_h264_notify.h" namespace UMC { void LazyCopier::Reset() { m_slices.clear(); } void LazyCopier::Add(H264Slice * slice) { if (!slice) return; m_slices.push_back(slice); } void LazyCopier::Remove(H264Slice * slice) { m_slices.remove(slice); } void LazyCopier::Remove(H264DecoderFrameInfo * info) { if (!info) return; uint32_t count = info->GetSliceCount(); for (uint32_t i = 0; i < count; i++) { H264Slice * slice = info->GetSlice(i); Remove(slice); } } void LazyCopier::CopyAll() { SlicesList::iterator iter = m_slices.begin(); SlicesList::iterator iter_end = m_slices.end(); for (; iter != iter_end; ++iter) { H264Slice * slice = *iter; slice->m_pSource.MoveToInternalBuffer(); // update bs ptr !!! H264HeadersBitstream *pBitstream = slice->GetBitStream(); uint32_t *pbsBase, *pbs; uint32_t size, bitOffset; pBitstream->GetOrg(&pbsBase, &size); pBitstream->GetState(&pbs, &bitOffset); pBitstream->Reset(slice->m_pSource.GetPointer(), bitOffset, (uint32_t)slice->m_pSource.GetDataSize()); pBitstream->SetState((uint32_t*)slice->m_pSource.GetPointer() + (pbs - pbsBase), bitOffset); } m_slices.clear(); } VATaskSupplier::VATaskSupplier() : m_bufferedFrameNumber(0) { } Status VATaskSupplier::Init(VideoDecoderParams *pInit) { SetVideoHardwareAccelerator(pInit->pVideoAccelerator); m_pMemoryAllocator = pInit->lpMemoryAllocator; pInit->numThreads = 1; Status umsRes = TaskSupplier::Init(pInit); if (umsRes != UMC_OK) return umsRes; m_iThreadNum = 1; DXVASupport::Init(); if (m_va) { static_cast(m_pTaskBroker)->DXVAStatusReportingMode(m_va->IsUseStatusReport()); } H264VideoDecoderParams *initH264 = DynamicCast (pInit); m_DPBSizeEx = m_iThreadNum + (initH264 ? initH264->m_bufferedFrames : 0); m_sei_messages = new SEI_Storer(); m_sei_messages->Init(); m_lazyCopier.Reset(); return UMC_OK; } void VATaskSupplier::CreateTaskBroker() { m_pTaskBroker = new TaskBrokerSingleThreadDXVA(this); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { m_pSegmentDecoder[i] = new H264_DXVA_SegmentDecoder(this); } } void VATaskSupplier::SetBufferedFramesNumber(uint32_t buffered) { m_DPBSizeEx += buffered; m_bufferedFrameNumber = buffered; if (buffered) DPBOutput::Reset(true); } H264DecoderFrame * VATaskSupplier::GetFrameToDisplayInternal(bool force) { ViewItem &view = GetViewByNumber(BASE_VIEW); view.maxDecFrameBuffering += m_bufferedFrameNumber; H264DecoderFrame * frame = MFXTaskSupplier::GetFrameToDisplayInternal(force); view.maxDecFrameBuffering -= m_bufferedFrameNumber; return frame; } void VATaskSupplier::Close() { m_lazyCopier.Reset(); MFXTaskSupplier::Close(); } void VATaskSupplier::Reset() { m_lazyCopier.Reset(); if (m_pTaskBroker) m_pTaskBroker->Reset(); MFXTaskSupplier::Reset(); DXVASupport::Reset(); } void VATaskSupplier::AfterErrorRestore() { m_lazyCopier.Reset(); MFXTaskSupplier::AfterErrorRestore(); } Status VATaskSupplier::DecodeHeaders(NalUnit *nalUnit) { Status sts = MFXTaskSupplier::DecodeHeaders(nalUnit); if (sts != UMC_OK && sts != UMC_WRN_REPOSITION_INPROGRESS) return sts; uint32_t nal_unit_type = nalUnit->GetNalUnitType(); if (nal_unit_type == NAL_UT_SPS && m_firstVideoParams.mfx.FrameInfo.PicStruct == MFX_PICSTRUCT_PROGRESSIVE && isMVCProfile(m_firstVideoParams.mfx.CodecProfile) && m_va) { UMC_H264_DECODER::H264SeqParamSet * currSPS = m_Headers.m_SeqParams.GetCurrentHeader(); if (currSPS && !currSPS->frame_mbs_only_flag) { return UMC_NTF_NEW_RESOLUTION; } } return sts; } H264DecoderFrame *VATaskSupplier::GetFreeFrame(const H264Slice * pSlice) { AutomaticUMCMutex guard(m_mGuard); ViewItem &view = GetView(pSlice->GetSliceHeader()->nal_ext.mvc.view_id); H264DecoderFrame *pFrame = 0; if (view.GetDPBList(0)->countAllFrames() >= view.maxDecFrameBuffering + m_DPBSizeEx) pFrame = view.GetDPBList(0)->GetDisposable(); assert(!pFrame || pFrame->GetRefCounter() == 0); // Did we find one? if (NULL == pFrame) { if (view.GetDPBList(0)->countAllFrames() >= view.maxDecFrameBuffering + m_DPBSizeEx) { DEBUG_PRINT((VM_STRING("Fail to find disposable frame\n"))); return 0; } // Didn't find one. Let's try to insert a new one pFrame = new H264DecoderFrame(m_pMemoryAllocator, &m_ObjHeap); if (NULL == pFrame) return 0; view.GetDPBList(0)->append(pFrame); } DEBUG_PRINT((VM_STRING("Cleanup frame POC - %d, %d, field - %d, uid - %d, frame_num - %d, viewId - %d\n"), pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1], pFrame->GetNumberByParity(pSlice->GetSliceHeader()->bottom_field_flag), pFrame->m_UID, pFrame->m_FrameNum, pFrame->m_viewId) ); DecReferencePictureMarking::Remove(pFrame); pFrame->Reset(); InitFreeFrame(pFrame, pSlice); return pFrame; } Status VATaskSupplier::CompleteFrame(H264DecoderFrame * pFrame, int32_t field) { if (!pFrame) return UMC_OK; H264DecoderFrameInfo * slicesInfo = pFrame->GetAU(field); if (slicesInfo->GetStatus() > H264DecoderFrameInfo::STATUS_NOT_FILLED) return UMC_OK; DEBUG_PRINT((VM_STRING("Complete frame POC - (%d,%d) type - %d, picStruct - %d, field - %d, count - %d, m_uid - %d, IDR - %d, viewId - %d\n"), pFrame->m_PicOrderCnt[0], pFrame->m_PicOrderCnt[1], pFrame->m_FrameType, pFrame->m_displayPictureStruct, field, pFrame->GetAU(field)->GetSliceCount(), pFrame->m_UID, pFrame->m_bIDRFlag, pFrame->m_viewId )); // skipping algorithm { if (((slicesInfo->IsField() && field) || !slicesInfo->IsField()) && IsShouldSkipFrame(pFrame, field)) { if (slicesInfo->IsField()) { pFrame->GetAU(0)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); pFrame->GetAU(1)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); } else { pFrame->GetAU(0)->SetStatus(H264DecoderFrameInfo::STATUS_COMPLETED); } pFrame->SetisShortTermRef(false, 0); pFrame->SetisShortTermRef(false, 1); pFrame->SetisLongTermRef(false, 0); pFrame->SetisLongTermRef(false, 1); pFrame->SetSkipped(true); pFrame->OnDecodingCompleted(); return UMC_OK; } else { if (IsShouldSkipDeblocking(pFrame, field)) { pFrame->GetAU(field)->SkipDeblocking(); } } } if (slicesInfo->GetAnySlice()->IsSliceGroups()) { throw h264_exception(UMC_ERR_UNSUPPORTED); } DecodePicture(pFrame, field); DBPUpdate(pFrame, field); m_lazyCopier.Remove(slicesInfo); slicesInfo->SetStatus(H264DecoderFrameInfo::STATUS_FILLED); return UMC_OK; } void VATaskSupplier::InitFrameCounter(H264DecoderFrame * pFrame, const H264Slice *pSlice) { TaskSupplier::InitFrameCounter(pFrame, pSlice); } Status VATaskSupplier::AddSource(MediaData * pSource) { if (!pSource) return MFXTaskSupplier::AddSource(pSource); notifier0 copy_slice_data(&m_lazyCopier, &LazyCopier::CopyAll); return MFXTaskSupplier::AddSource(pSource); } Status VATaskSupplier::AllocateFrameData(H264DecoderFrame * pFrame) { mfxSize dimensions = pFrame->lumaSize(); VideoDataInfo info; info.Init(dimensions.width, dimensions.height, pFrame->GetColorFormat(), pFrame->m_bpp); FrameMemID frmMID; Status sts = m_pFrameAllocator->Alloc(&frmMID, &info, 0); if (sts == UMC_ERR_ALLOC) return UMC_ERR_ALLOC; if (sts != UMC_OK) throw h264_exception(UMC_ERR_ALLOC); FrameData frmData; frmData.Init(&info, frmMID, m_pFrameAllocator); auto frame_source = dynamic_cast(m_pFrameAllocator); if (frame_source) { mfxFrameSurface1* surface = frame_source->GetSurfaceByIndex(frmMID); if (!surface) throw h264_exception(UMC_ERR_ALLOC); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) mfxExtBuffer* extbuf = nullptr; extbuf = GetExtendedBuffer(surface->Data.ExtParam, surface->Data.NumExtParam, MFX_EXTBUFF_GPU_HANG); if (extbuf) frmData.SetAuxInfo(extbuf, extbuf->BufferSz, extbuf->BufferId); #endif } pFrame->allocate(&frmData, &info); pFrame->IncrementReference(); m_UIDFrameCounter++; pFrame->m_UID = m_UIDFrameCounter; pFrame->m_index = frmMID; return UMC_OK; } H264Slice * VATaskSupplier::DecodeSliceHeader(NalUnit *nalUnit) { size_t dataSize = nalUnit->GetDataSize(); nalUnit->SetDataSize(std::min(1024, dataSize)); H264Slice * slice = TaskSupplier::DecodeSliceHeader(nalUnit); nalUnit->SetDataSize(dataSize); if (!slice) return 0; if (nalUnit->IsUsedExternalMem()) { slice->m_pSource.SetData(nalUnit); m_lazyCopier.Add(slice); } else { slice->m_pSource.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); MFX_INTERNAL_CPY(slice->m_pSource.GetPointer(), nalUnit->GetDataPointer(), (uint32_t)nalUnit->GetDataSize()); memset(slice->m_pSource.GetPointer() + nalUnit->GetDataSize(), DEFAULT_NU_TAIL_VALUE, DEFAULT_NU_TAIL_SIZE); slice->m_pSource.SetDataSize(nalUnit->GetDataSize()); slice->m_pSource.SetTime(nalUnit->GetTime()); } uint32_t* pbs; uint32_t bitOffset; slice->GetBitStream()->GetState(&pbs, &bitOffset); size_t bytes = slice->GetBitStream()->BytesDecodedRoundOff(); slice->GetBitStream()->Reset(slice->m_pSource.GetPointer(), bitOffset, (uint32_t)slice->m_pSource.GetDataSize()); slice->GetBitStream()->SetState((uint32_t*)(slice->m_pSource.GetPointer() + bytes), bitOffset); return slice; } // walk over all view's DPB and find an index free index. // i.e. index not used by any frame in any view // returns free index or -1 if no free index found int32_t VATaskSupplier::GetFreeFrameIndex() { for (int32_t i = 0; i < 127; i++) { ViewList::iterator iter = m_views.begin(); ViewList::iterator iter_end = m_views.end(); H264DecoderFrame *pFrm = NULL; // run over the list and try to find the corresponding view for (; iter != iter_end; ++iter) { ViewItem & item = *iter; H264DBPList *pDPBList = item.GetDPBList(); pFrm = pDPBList->head(); // walk over the list while(pFrm != NULL && pFrm->m_index != i) { pFrm = pFrm->future(); } if (pFrm != NULL) { // go next index // no need to check next View break; } } if (pFrm == NULL) { // we wall over each frame in all Views // this index is free return i; } } assert(false); return -1; } } // namespace UMC #endif // MFX_ENABLE_H264_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/000077500000000000000000000000001443134507600253435ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/000077500000000000000000000000001443134507600267665ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/platform/000077500000000000000000000000001443134507600306125ustar00rootroot00000000000000umc_h265_va_packer_common_g12.hpp000066400000000000000000000142741443134507600366400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/platform// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //This file is included from [umc_h265_va_packer_vaapi_g12.hpp] //DO NOT include it into the project manually #ifndef _UMC_VA_H265_PACKER_G12_COMMON_H_ #define _UMC_VA_H265_PACKER_G12_COMMON_H_ namespace UMC_HEVC_DECODER { namespace G12 { template inline void FillPaletteEntries(T const* src, V dst[3][128], size_t count, size_t numComps) { assert(!(count > 128)); assert(!(numComps > 3)); for (size_t i = 0; i < numComps; ++i, src += count) { for (size_t j = 0; j < count; ++j) dst[i][j] = static_cast(*(src + j)); } } inline uint32_t GetEntryPointOffsetStep(H265Slice const* slice, uint32_t tileYIdx) { H265PicParamSet const* pps = slice->GetPicParam(); assert(pps); if (!pps->tiles_enabled_flag || !pps->entropy_coding_sync_enabled_flag) return 1; if (!(tileYIdx < pps->row_height.size())) throw h265_exception(UMC::UMC_ERR_FAILED); return slice->getTileRowHeight(tileYIdx); } inline uint32_t GetEntryPointOffsetNum(H265Slice const* slice) { H265PicParamSet const* pps = slice->GetPicParam(); assert(pps); //H265SliceHeader const* sh = slice->GetSliceHeader(); //assert(sh); uint32_t count = 0; uint32_t tileXIdx = slice->getTileXIdx(); uint32_t tileYIdx = slice->getTileYIdx(); uint32_t step = 0; step = GetEntryPointOffsetStep(slice, tileYIdx); for (uint32_t idx = 1; idx < slice->getTileLocationCount(); idx++) { if (0 == --step) { count++; if (++tileXIdx > (pps->num_tile_columns - 1)) { tileXIdx = 0; tileYIdx++; } step = GetEntryPointOffsetStep(slice, tileYIdx); } } return count; } /* Return number (pair.first) of entry point offsets and the first entry position (pair.second) of the entry point offsets for given slice */ inline std::pair GetEntryPoint(H265Slice const* slice) { assert(slice); auto sh = slice->GetSliceHeader(); assert(sh); if (!sh->num_entry_point_offsets) return std::make_pair( static_cast(0), static_cast(0) ); auto frame = slice->GetCurrentFrame(); assert(frame); auto fi = frame->GetAU(); assert(fi); uint32_t offset = 0; auto const count = fi->GetSliceCount(); for (uint32_t i = 0; i < count; ++i) { auto s = fi->GetSlice(i); if (NULL == s) throw h265_exception(UMC::UMC_ERR_FAILED); if (s == slice) break; offset += GetEntryPointOffsetNum(s);; } return std::make_pair( static_cast(offset), static_cast(GetEntryPointOffsetNum(slice)) ); } template inline void FillSubsets(H265DecoderFrameInfo const* fi, T begin, T end) { assert(fi); uint32_t const count = fi->GetSliceCount(); for (uint32_t i = 0; i < count; ++i) { auto slice = fi->GetSlice(i); if (NULL == slice) throw h265_exception(UMC::UMC_ERR_FAILED); H265PicParamSet const* pps = slice->GetPicParam(); uint32_t tileXIdx = slice->getTileXIdx(); uint32_t tileYIdx = slice->getTileYIdx(); auto step = GetEntryPointOffsetStep(slice, tileYIdx); //'m_tileByteLocation' contains absolute offsets, but we have to pass relative ones just as they are in a bitstream //NOTE: send only entry points for tiles auto position = slice->m_tileByteLocation[0]; for (uint32_t j = step; j < slice->getTileLocationCount(); j += step) { uint32_t const entry = slice->m_tileByteLocation[j]; *begin++ = entry - (position + 1); position = entry; if (begin >= end) //provided buffer for entry points is too small throw h265_exception(UMC::UMC_ERR_FAILED); if (++tileXIdx > (pps->num_tile_columns - 1)) { tileXIdx = 0; tileYIdx++; } step = GetEntryPointOffsetStep(slice, tileYIdx); } } } } //G12 } #endif //_UMC_VA_H265_PACKER_G12_COMMON_H_ umc_h265_va_packer_vaapi_g11.hpp000066400000000000000000000210421443134507600364360ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/platform// Copyright (c) 2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //This file is included from [umc_h265_va_packer_vaapi.cpp] //DO NOT include it into the project manually #ifndef _UMC_VA_H265_PACKER_G11_H_ #define _UMC_VA_H265_PACKER_G11_H_ #include "umc_h265_va_packer_vaapi_g9.hpp" namespace UMC_HEVC_DECODER { template <> struct Type2Buffer : std::integral_constant {}; template <> struct Type2Buffer : std::integral_constant {}; namespace G11 { inline void PackPicHeader(UMC::VideoAccelerator*, H265DecoderFrame const* frame, H265DBPList const* dpb, VAPictureParameterBufferHEVCRext* pp) { assert(frame); (void) dpb; assert(pp); auto si = frame->GetAU(); if (!si) throw h265_exception(UMC::UMC_ERR_FAILED); auto slice = si->GetSlice(0); assert(slice); auto pps = slice->GetPicParam(); assert(pps); auto sps = slice->GetSeqParam(); assert(sps); auto& pic_fields = pp->range_extension_pic_fields.bits; pic_fields.transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled_flag; pic_fields.transform_skip_context_enabled_flag = sps->transform_skip_context_enabled_flag; pic_fields.implicit_rdpcm_enabled_flag = sps->implicit_residual_dpcm_enabled_flag; pic_fields.explicit_rdpcm_enabled_flag = sps->explicit_residual_dpcm_enabled_flag; pic_fields.extended_precision_processing_flag = sps->extended_precision_processing_flag; pic_fields.intra_smoothing_disabled_flag = sps->intra_smoothing_disabled_flag; pic_fields.high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled_flag;; pic_fields.persistent_rice_adaptation_enabled_flag = sps->fast_rice_adaptation_enabled_flag; pic_fields.cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled_flag; pic_fields.cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag; pic_fields.chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag; pp->diff_cu_chroma_qp_offset_depth = (uint8_t)pps->diff_cu_chroma_qp_offset_depth; pp->chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_enabled_flag ? (uint8_t)pps->chroma_qp_offset_list_len - 1 : 0; pp->log2_sao_offset_scale_luma = (uint8_t)pps->log2_sao_offset_scale_luma; pp->log2_sao_offset_scale_chroma = (uint8_t)pps->log2_sao_offset_scale_chroma; pp->log2_max_transform_skip_block_size_minus2 = pps->pps_range_extensions_flag && pps->transform_skip_enabled_flag ? (uint8_t)pps->log2_max_transform_skip_block_size_minus2 : 0; for (uint32_t i = 0; i < pps->chroma_qp_offset_list_len; i++) { pp->cb_qp_offset_list[i] = (int8_t)pps->cb_qp_offset_list[i + 1]; pp->cr_qp_offset_list[i] = (int8_t)pps->cr_qp_offset_list[i + 1]; } } inline void PackSliceHeader(UMC::VideoAccelerator*, H265Slice const* slice, VAPictureParameterBufferHEVC const* pp, VASliceParameterBufferHEVCRext* sp, bool last_slice) { assert(slice); assert(pp); assert(sp); (void) last_slice; (void) pp; auto sh = slice->GetSliceHeader(); assert(sh); for (int l = 0; l < 2; l++) { EnumRefPicList eRefPicList = ( l == 1 ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); for (int32_t iRefIdx = 0; iRefIdx < slice->getNumRefIdx(eRefPicList); iRefIdx++) { wpScalingParam const* wp = sh->pred_weight_table[eRefPicList][iRefIdx]; if (eRefPicList == REF_PIC_LIST_0) { sp->luma_offset_l0[iRefIdx] = (int16_t)wp[0].offset; for(int chroma=0;chroma < 2;chroma++) sp->ChromaOffsetL0[iRefIdx][chroma] = (int16_t)wp[1 + chroma].offset; } else { sp->luma_offset_l1[iRefIdx] = (int16_t)wp[0].offset; for(int chroma=0; chroma < 2; chroma++) sp->ChromaOffsetL1[iRefIdx][chroma] = (int16_t)wp[1 + chroma].offset; } } } auto& slice_ext_flags = sp->slice_ext_flags.bits; slice_ext_flags.cu_chroma_qp_offset_enabled_flag = sh->cu_chroma_qp_offset_enabled_flag; slice_ext_flags.use_integer_mv_flag = (uint8_t)sh->use_integer_mv_flag; sp->slice_act_y_qp_offset = (int8_t)sh->slice_act_y_qp_offset; sp->slice_act_cb_qp_offset = (int8_t)sh->slice_act_cb_qp_offset; sp->slice_act_cr_qp_offset = (int8_t)sh->slice_act_cr_qp_offset; } class PackerVAAPI : public G9::PackerVAAPI { public: PackerVAAPI(UMC::VideoAccelerator* va) : G9::PackerVAAPI::PackerVAAPI(va) {} protected: void CreateSliceParamBuffer(size_t count) override { ! m_va->IsLongSliceControl() || !(m_va->m_Profile & UMC::VA_PROFILE_REXT) ? G9::PackerVAAPI::CreateSliceParamBuffer(count) : CreateParamsBuffer(m_va, count) ; } void PackPicParams(H265DecoderFrame const* frame, TaskSupplier_H265* supplier) override { assert(frame); assert(supplier); if (!(m_va->m_Profile & UMC::VA_PROFILE_REXT)) G9::PackerVAAPI::PackPicParams(frame, supplier); else { H265DBPList const* dpb = supplier->GetDPBList(); if (!dpb) throw h265_exception(UMC::UMC_ERR_FAILED); VAPictureParameterBufferHEVCExtension* pp = 0; PeekParamsBuffer(m_va, &pp); G9::PackPicHeader(m_va, frame, dpb, &pp->base); PackPicHeader(m_va, frame, dpb, &pp->rext); } } VASliceParameterBufferBase* PackSliceParams(H265Slice const* slice, bool last_slice) override { if (!(m_va->m_Profile & UMC::VA_PROFILE_REXT) || ! m_va->IsLongSliceControl()) return G9::PackerVAAPI::PackSliceParams(slice, last_slice); VAPictureParameterBufferHEVC* pp = nullptr; GetParamsBuffer(m_va, &pp); VASliceParameterBufferHEVCExtension* sp = nullptr; PeekParamsBuffer(m_va, &sp); G9::PackerVAAPI::PackSliceParams(reinterpret_cast(sp), slice, last_slice); PackSliceHeader(m_va, slice, pp, &sp->rext, last_slice); return reinterpret_cast(sp); } }; } //G11 } #endif //_UMC_VA_H265_PACKER_G11_H_ umc_h265_va_packer_vaapi_g12.hpp000077500000000000000000000177371443134507600364620ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/platform// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //This file is included from [umc_h265_va_packer_vaapi.cpp] //DO NOT include it into the project manually #ifndef _UMC_VA_H265_PACKER_G12_H_ #define _UMC_VA_H265_PACKER_G12_H_ #include "umc_h265_va_packer_vaapi_g11.hpp" #include "umc_h265_va_packer_common_g12.hpp" namespace UMC_HEVC_DECODER { namespace G12 { inline void PackPicHeader(UMC::VideoAccelerator*, H265DecoderFrame const* frame, H265DBPList const*, VAPictureParameterBufferHEVCScc* pp) { assert(frame); assert(pp); auto si = frame->GetAU(); if (!si) throw h265_exception(UMC::UMC_ERR_FAILED); auto slice = si->GetSlice(0); assert(slice); auto pps = slice->GetPicParam(); assert(pps); auto sps = slice->GetSeqParam(); assert(sps); auto& scc_bits = pp->screen_content_pic_fields.bits; scc_bits.pps_curr_pic_ref_enabled_flag = pps->pps_curr_pic_ref_enabled_flag; scc_bits.palette_mode_enabled_flag = sps->palette_mode_enabled_flag; scc_bits.motion_vector_resolution_control_idc = sps->motion_vector_resolution_control_idc; scc_bits.intra_boundary_filtering_disabled_flag = sps->intra_boundary_filtering_disabled_flag; scc_bits.residual_adaptive_colour_transform_enabled_flag = pps->residual_adaptive_colour_transform_enabled_flag; scc_bits.pps_slice_act_qp_offsets_present_flag = pps->pps_slice_act_qp_offsets_present_flag; pp->palette_max_size = sps->palette_max_size; pp->delta_palette_max_predictor_size = sps->delta_palette_max_predictor_size; pp->pps_act_y_qp_offset_plus5 = static_cast(pps->pps_act_y_qp_offset + 5); pp->pps_act_cb_qp_offset_plus5 = static_cast(pps->pps_act_cb_qp_offset + 5); pp->pps_act_cr_qp_offset_plus3 = static_cast(pps->pps_act_cr_qp_offset + 3); uint32_t const* palette = nullptr; size_t count = 0; uint8_t const numComps = sps->chroma_format_idc ? 3 : 1; if (pps->pps_palette_predictor_initializer_present_flag) { assert(pps->pps_num_palette_predictor_initializer * numComps == pps->m_paletteInitializers.size()); count = pps->pps_num_palette_predictor_initializer; palette = pps->m_paletteInitializers.data(); } else if (sps->sps_palette_predictor_initializer_present_flag) { assert(sps->sps_num_palette_predictor_initializer * numComps == sps->m_paletteInitializers.size()); count = sps->sps_num_palette_predictor_initializer; palette = sps->m_paletteInitializers.data(); } if (palette) { pp->predictor_palette_size = static_cast(count); FillPaletteEntries(palette, pp->predictor_palette_entries, count, numComps); } } class PackerVAAPI : public G11::PackerVAAPI { public: PackerVAAPI(UMC::VideoAccelerator* va) : G11::PackerVAAPI::PackerVAAPI(va) {} protected: void CreateSliceParamBuffer(size_t count) override { if (!m_va->IsLongSliceControl() || !(m_va->m_Profile & UMC::VA_PROFILE_SCC)) G11::PackerVAAPI::CreateSliceParamBuffer(count); else CreateParamsBuffer(m_va, count); } void PackPicParams(H265DecoderFrame const* frame, TaskSupplier_H265* supplier) override { assert(frame); assert(supplier); if (!m_va->IsLongSliceControl() || !(m_va->m_Profile & UMC::VA_PROFILE_SCC)) G11::PackerVAAPI::PackPicParams(frame, supplier); else { H265DBPList const* dpb = supplier->GetDPBList(); if (!dpb) throw h265_exception(UMC::UMC_ERR_FAILED); VAPictureParameterBufferHEVCExtension* pp = 0; PeekParamsBuffer(m_va, &pp); G9::PackPicHeader(m_va, frame, dpb, &pp->base); G11::PackPicHeader(m_va, frame, dpb, &pp->rext); PackPicHeader(m_va, frame, dpb, &pp->scc); } } VASliceParameterBufferBase* PackSliceParams(H265Slice const* slice, bool last_slice) override { VASliceParameterBufferBase* sp_base = nullptr; if (!(m_va->m_Profile & UMC::VA_PROFILE_SCC) || ! m_va->IsLongSliceControl()) sp_base = G11::PackerVAAPI::PackSliceParams(slice, last_slice); else { VAPictureParameterBufferHEVC* pp = nullptr; GetParamsBuffer(m_va, &pp); VASliceParameterBufferHEVCExtension* sp = nullptr; PeekParamsBuffer(m_va, &sp); G9::PackerVAAPI::PackSliceParams(reinterpret_cast(sp), slice, last_slice); //for SCC we need to pack [VASliceParameterBufferHEVCRext] G11::PackSliceHeader(m_va, slice, pp, &sp->rext, last_slice); sp_base = reinterpret_cast(sp); } auto pps = slice->GetPicParam(); assert(pps); VASliceParameterBufferHEVC* sp = reinterpret_cast(sp_base); sp->slice_data_num_emu_prevn_bytes = slice->m_NumEmuPrevnBytesInSliceHdr; if (pps->tiles_enabled_flag) { auto p = GetEntryPoint(slice); sp->num_entry_point_offsets = p.second; sp->entry_offset_to_subset_array = p.first; } if (last_slice && pps->tiles_enabled_flag) PackSubsets(slice->GetCurrentFrame()); return sp_base; } void PackSubsets(H265DecoderFrame const* frame) { assert(frame); size_t const count = 22 * 20; //MaxTileRows * MaxTileCols (see ITU-T H.265 Annex A for details) auto p = PeekBuffer(m_va, VASubsetsParameterBufferType, count * sizeof(uint32_t)); auto begin = reinterpret_cast(p.first); FillSubsets(frame->GetAU(), begin, begin+ count); } }; } //G12 } #endif //_UMC_VA_H265_PACKER_G12_H_ umc_h265_va_packer_vaapi_g9.hpp000066400000000000000000000647631443134507600364060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/platform// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //This file is included from [umc_h265_va_packer_vaapi.cpp] //DO NOT include it into the project manually #ifndef _UMC_VA_H265_PACKER_G9_H_ #define _UMC_VA_H265_PACKER_G9_H_ #include "mfx_unified_h265d_logging.h" namespace UMC_HEVC_DECODER { namespace G9 { template using PicListT = std::integral_constant; inline void PackPicHeader(UMC::VideoAccelerator* va, H265DecoderFrame const* frame, H265DBPList const* dpb, VAPictureParameterBufferHEVC* pp) { H265DecoderFrameInfo const* si = frame->GetAU(); if (!si) throw h265_exception(UMC::UMC_ERR_FAILED); auto slice = si->GetSlice(0); assert(slice); auto sps = slice->GetSeqParam(); assert(sps); auto pps = slice->GetPicParam(); assert(pps); pp->CurrPic.picture_id = va->GetSurfaceID(frame->GetFrameMID()); pp->CurrPic.pic_order_cnt = frame->m_PicOrderCnt; pp->CurrPic.flags = 0; uint32_t numRefPicSetStCurrBefore = 0, numRefPicSetStCurrAfter = 0, numRefPicSetLtCurr = 0, numRefPicSetStCurr = 0; size_t count = 0; for (auto f = dpb->head() ; f && count < sizeof(pp->ReferenceFrames) / sizeof(pp->ReferenceFrames[0]) ; f = f->future()) { int const refType = f->isShortTermRef() ? SHORT_TERM_REFERENCE : (f->isLongTermRef() ? LONG_TERM_REFERENCE : NO_REFERENCE); if (refType == NO_REFERENCE) continue; if (f != frame) { pp->ReferenceFrames[count].pic_order_cnt = f->m_PicOrderCnt; pp->ReferenceFrames[count].picture_id = va->GetSurfaceID(f->GetFrameMID()); pp->ReferenceFrames[count].flags = refType == LONG_TERM_REFERENCE ? VA_PICTURE_HEVC_LONG_TERM_REFERENCE : 0; count++; } } if (pps->pps_curr_pic_ref_enabled_flag) { pp->ReferenceFrames[count].pic_order_cnt = frame->m_PicOrderCnt; pp->ReferenceFrames[count].picture_id = va->GetSurfaceID(frame->GetFrameMID()); pp->ReferenceFrames[count].flags = VA_PICTURE_HEVC_LONG_TERM_REFERENCE; count++; } for (size_t n = count+numRefPicSetStCurr; n < sizeof(pp->ReferenceFrames) / sizeof(pp->ReferenceFrames[0]); n++) { pp->ReferenceFrames[n].picture_id = VA_INVALID_SURFACE; pp->ReferenceFrames[n].flags = VA_PICTURE_HEVC_INVALID; } TRACE_BUFFER_EVENT(VA_TRACE_API_HEVC_DPBPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_DPB_INFO, pp, H265DecodeDpbInfo, DPBINFO_HEVC); ReferencePictureSet *rps = slice->getRPS(); int32_t pocList[3*8] {}; uint32_t index = 0; uint32_t NumberOfPictures = rps->getNumberOfNegativePictures(); for(; index < NumberOfPictures; index++, numRefPicSetStCurrBefore++) { pocList[index] = pp->CurrPic.pic_order_cnt + rps->getDeltaPOC(index); } NumberOfPictures += rps->getNumberOfPositivePictures(); for (; index < NumberOfPictures; index++, numRefPicSetStCurrAfter++) { pocList[index] = pp->CurrPic.pic_order_cnt + rps->getDeltaPOC(index); } NumberOfPictures += rps->getNumberOfLongtermPictures(); for (; index < NumberOfPictures; index++, numRefPicSetLtCurr++) { auto poc = rps->getPOC(index); auto lt = dpb->findLongTermRefPic(frame, poc, sps->log2_max_pic_order_cnt_lsb, !rps->getCheckLTMSBPresent(index)); if (lt) { pocList[index] = lt->PicOrderCnt(); } else { pocList[index] = pp->CurrPic.pic_order_cnt + rps->getDeltaPOC(index); } } for (uint32_t n = 0; n < NumberOfPictures; n++) { if (!rps->getUsed(n)) continue; for (size_t k = 0; k < count; k++) { if(pocList[n] == pp->ReferenceFrames[k].pic_order_cnt) { if(n < numRefPicSetStCurrBefore) pp->ReferenceFrames[k].flags |= VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE; else if(n < numRefPicSetStCurrBefore + numRefPicSetStCurrAfter) pp->ReferenceFrames[k].flags |= VA_PICTURE_HEVC_RPS_ST_CURR_AFTER; else if(n < numRefPicSetStCurrBefore + numRefPicSetStCurrAfter + numRefPicSetLtCurr) { pp->ReferenceFrames[k].flags |= VA_PICTURE_HEVC_RPS_LT_CURR; } } } } auto sh = slice->GetSliceHeader(); assert(sh); pp->pic_width_in_luma_samples = (uint16_t)sps->pic_width_in_luma_samples; pp->pic_height_in_luma_samples = (uint16_t)sps->pic_height_in_luma_samples; auto& pic_fields = pp->pic_fields.bits; pic_fields.chroma_format_idc = sps->chroma_format_idc; pic_fields.separate_colour_plane_flag = sps->separate_colour_plane_flag; pic_fields.pcm_enabled_flag = sps->pcm_enabled_flag; pic_fields.scaling_list_enabled_flag = sps->scaling_list_enabled_flag; pic_fields.transform_skip_enabled_flag = pps->transform_skip_enabled_flag; pic_fields.amp_enabled_flag = sps->amp_enabled_flag; pic_fields.strong_intra_smoothing_enabled_flag = sps->sps_strong_intra_smoothing_enabled_flag; pic_fields.sign_data_hiding_enabled_flag = pps->sign_data_hiding_enabled_flag; pic_fields.constrained_intra_pred_flag = pps->constrained_intra_pred_flag; pic_fields.cu_qp_delta_enabled_flag = pps->cu_qp_delta_enabled_flag; pic_fields.weighted_pred_flag = pps->weighted_pred_flag; pic_fields.weighted_bipred_flag = pps->weighted_bipred_flag; pic_fields.transquant_bypass_enabled_flag = pps->transquant_bypass_enabled_flag; pic_fields.tiles_enabled_flag = pps->tiles_enabled_flag; pic_fields.entropy_coding_sync_enabled_flag = pps->entropy_coding_sync_enabled_flag; pic_fields.pps_loop_filter_across_slices_enabled_flag = pps->pps_loop_filter_across_slices_enabled_flag; pic_fields.loop_filter_across_tiles_enabled_flag = pps->loop_filter_across_tiles_enabled_flag; pic_fields.pcm_loop_filter_disabled_flag = sps->pcm_loop_filter_disabled_flag; pic_fields.NoPicReorderingFlag = sps->sps_max_num_reorder_pics[sh->nuh_temporal_id] == 0 ? 1 : 0; pic_fields.NoBiPredFlag = 0; pp->sps_max_dec_pic_buffering_minus1 = (uint8_t)(sps->sps_max_dec_pic_buffering[sh->nuh_temporal_id] - 1); pp->bit_depth_luma_minus8 = (uint8_t)(sps->bit_depth_luma - 8); pp->bit_depth_chroma_minus8 = (uint8_t)(sps->bit_depth_chroma - 8); pp->pcm_sample_bit_depth_luma_minus1 = (uint8_t)(sps->pcm_sample_bit_depth_luma - 1); pp->pcm_sample_bit_depth_chroma_minus1 = (uint8_t)(sps->pcm_sample_bit_depth_chroma - 1); pp->log2_min_luma_coding_block_size_minus3 = (uint8_t)(sps->log2_min_luma_coding_block_size- 3); pp->log2_diff_max_min_luma_coding_block_size = (uint8_t)(sps->log2_max_luma_coding_block_size - sps->log2_min_luma_coding_block_size); pp->log2_min_transform_block_size_minus2 = (uint8_t)(sps->log2_min_transform_block_size - 2); pp->log2_diff_max_min_transform_block_size = (uint8_t)(sps->log2_max_transform_block_size - sps->log2_min_transform_block_size); pp->log2_min_pcm_luma_coding_block_size_minus3 = (uint8_t)(sps->log2_min_pcm_luma_coding_block_size - 3); pp->log2_diff_max_min_pcm_luma_coding_block_size = (uint8_t)(sps->log2_max_pcm_luma_coding_block_size - sps->log2_min_pcm_luma_coding_block_size); pp->max_transform_hierarchy_depth_intra = (uint8_t)sps->max_transform_hierarchy_depth_intra; pp->max_transform_hierarchy_depth_inter = (uint8_t)sps->max_transform_hierarchy_depth_inter; pp->init_qp_minus26 = pps->init_qp - 26; pp->diff_cu_qp_delta_depth = (uint8_t)pps->diff_cu_qp_delta_depth; pp->pps_cb_qp_offset = (uint8_t)pps->pps_cb_qp_offset; pp->pps_cr_qp_offset = (uint8_t)pps->pps_cr_qp_offset; pp->log2_parallel_merge_level_minus2 = (uint8_t)(pps->log2_parallel_merge_level - 2); if (pps->tiles_enabled_flag) { pp->num_tile_columns_minus1 = std::min(sizeof(pp->column_width_minus1) /sizeof(pp->column_width_minus1[0]), (uint8_t)(pps->num_tile_columns - 1)); pp->num_tile_rows_minus1 = std::min(sizeof(pp->row_height_minus1) /sizeof(pp->row_height_minus1[0]), (uint8_t)(pps->num_tile_rows - 1)); for (uint32_t i = 0; i <= pp->num_tile_columns_minus1; i++) pp->column_width_minus1[i] = (uint16_t)(pps->column_width[i] - 1); for (uint32_t i = 0; i <= pp->num_tile_rows_minus1; i++) pp->row_height_minus1[i] = (uint16_t)(pps->row_height[i] - 1); } auto& slice_parsing_fields = pp->slice_parsing_fields.bits; slice_parsing_fields.lists_modification_present_flag = pps->lists_modification_present_flag; slice_parsing_fields.long_term_ref_pics_present_flag = sps->long_term_ref_pics_present_flag; slice_parsing_fields.sps_temporal_mvp_enabled_flag = sps->sps_temporal_mvp_enabled_flag; slice_parsing_fields.cabac_init_present_flag = pps->cabac_init_present_flag; slice_parsing_fields.output_flag_present_flag = pps->output_flag_present_flag; slice_parsing_fields.dependent_slice_segments_enabled_flag = pps->dependent_slice_segments_enabled_flag; slice_parsing_fields.pps_slice_chroma_qp_offsets_present_flag = pps->pps_slice_chroma_qp_offsets_present_flag; slice_parsing_fields.sample_adaptive_offset_enabled_flag = sps->sample_adaptive_offset_enabled_flag; slice_parsing_fields.deblocking_filter_override_enabled_flag = pps->deblocking_filter_override_enabled_flag; slice_parsing_fields.pps_disable_deblocking_filter_flag = pps->pps_deblocking_filter_disabled_flag; slice_parsing_fields.slice_segment_header_extension_present_flag = pps->slice_segment_header_extension_present_flag; slice_parsing_fields.RapPicFlag = (sh->nal_unit_type >= NAL_UT_CODED_SLICE_BLA_W_LP && sh->nal_unit_type <= NAL_UT_CODED_SLICE_CRA) ? 1 : 0; slice_parsing_fields.IdrPicFlag = sh->IdrPicFlag; slice_parsing_fields.IntraPicFlag = si->IsIntraAU() ? 1 : 0; pp->log2_max_pic_order_cnt_lsb_minus4 = (uint8_t)(sps->log2_max_pic_order_cnt_lsb - 4); pp->num_short_term_ref_pic_sets = (uint8_t)sps->getRPSList()->getNumberOfReferencePictureSets(); pp->num_long_term_ref_pic_sps = (uint8_t)sps->num_long_term_ref_pics_sps; pp->num_ref_idx_l0_default_active_minus1 = (uint8_t)(pps->num_ref_idx_l0_default_active - 1); pp->num_ref_idx_l1_default_active_minus1 = (uint8_t)(pps->num_ref_idx_l1_default_active - 1); pp->pps_beta_offset_div2 = (int8_t)(pps->pps_beta_offset >> 1); pp->pps_tc_offset_div2 = (int8_t)(pps->pps_tc_offset >> 1); pp->num_extra_slice_header_bits = (uint8_t)pps->num_extra_slice_header_bits; pp->st_rps_bits = slice->GetSliceHeader()->wNumBitsForShortTermRPSInSlice; TRACE_BUFFER_EVENT(VA_TRACE_API_HEVC_PICTUREPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_PICPARAM, pp, H265DecodePicparam, PICTUREPARAM_HEVC); } template inline void FillRPL(UMC::VideoAccelerator* va, H265Slice const* slice, VAPictureParameterBufferHEVC const* pp, VASliceParameterBufferHEVC* sp, PicListT) { assert(slice); assert(pp); assert(sp); auto frame = slice->GetCurrentFrame(); assert(frame); auto refPicList = frame->GetRefPicList(slice->GetSliceNum(), ListX); if (!refPicList) throw h265_exception(UMC::UMC_ERR_FAILED); size_t const num_active_ref = slice->getNumRefIdx(ListX); size_t const max_num_ref = std::extentReferenceFrames)>::value; size_t index = 0; for (size_t i = 0; i < num_active_ref; ++i) { auto const& frameInfo = refPicList->m_refPicList[i]; if (!frameInfo.refFrame) break; else { auto id = static_cast(va->GetSurfaceID(frameInfo.refFrame->GetFrameMID())); auto r = std::find_if(pp->ReferenceFrames, pp->ReferenceFrames + max_num_ref, [id](VAPictureHEVC const& p) { return p.picture_id == id; } ); if (r != pp->ReferenceFrames + max_num_ref) { sp->RefPicList[ListX][index] = std::distance(pp->ReferenceFrames, r); ++index; } } } for (size_t i = index; i < max_num_ref; ++i) sp->RefPicList[ListX][i] = 0xff; } inline void PackSliceHeader(UMC::VideoAccelerator*, H265Slice const*, VAPictureParameterBufferHEVC const*, VASliceParameterBufferBase*, bool) { } inline void PackSliceHeader(UMC::VideoAccelerator* va, H265Slice const* slice, VAPictureParameterBufferHEVC const* pp, VASliceParameterBufferHEVC* sp, bool last_slice) { do { if (!slice) break; if (!pp) break; if (!sp) break; auto sh = slice->GetSliceHeader(); if (!sh) break; sp->slice_data_byte_offset = uint32_t(slice->m_BitStream.BytesDecoded() + 3 /* start code */); sp->slice_segment_address = sh->slice_segment_address; auto frame = slice->GetCurrentFrame(); if (!frame) break; FillRPL(va, slice, pp, sp, PicListT{}); FillRPL(va, slice, pp, sp, PicListT{}); auto& LongSliceFlags = sp->LongSliceFlags.fields; LongSliceFlags.LastSliceOfPic = last_slice ? 1 : 0; LongSliceFlags.dependent_slice_segment_flag = sh->dependent_slice_segment_flag; LongSliceFlags.slice_type = sh->slice_type; LongSliceFlags.color_plane_id = sh->colour_plane_id; LongSliceFlags.slice_sao_luma_flag = sh->slice_sao_luma_flag; LongSliceFlags.slice_sao_chroma_flag = sh->slice_sao_chroma_flag; LongSliceFlags.mvd_l1_zero_flag = sh->mvd_l1_zero_flag; LongSliceFlags.cabac_init_flag = sh->cabac_init_flag; LongSliceFlags.slice_temporal_mvp_enabled_flag = sh->slice_temporal_mvp_enabled_flag; LongSliceFlags.slice_deblocking_filter_disabled_flag = sh->slice_deblocking_filter_disabled_flag; LongSliceFlags.collocated_from_l0_flag = sh->collocated_from_l0_flag; LongSliceFlags.slice_loop_filter_across_slices_enabled_flag = sh->slice_loop_filter_across_slices_enabled_flag; auto pps = slice->GetPicParam(); if (!pps) break; sp->collocated_ref_idx = (uint8_t)((sh->slice_type != I_SLICE) ? sh->collocated_ref_idx : -1); sp->num_ref_idx_l0_active_minus1 = (uint8_t)(slice->getNumRefIdx(REF_PIC_LIST_0) - 1); sp->num_ref_idx_l1_active_minus1 = (uint8_t)(slice->getNumRefIdx(REF_PIC_LIST_1) - 1); sp->slice_qp_delta = (int8_t)(sh->SliceQP - pps->init_qp); sp->slice_cb_qp_offset = (int8_t)sh->slice_cb_qp_offset; sp->slice_cr_qp_offset = (int8_t)sh->slice_cr_qp_offset; sp->slice_beta_offset_div2 = (int8_t)(sh->slice_beta_offset >> 1); sp->slice_tc_offset_div2 = (int8_t)(sh->slice_tc_offset >> 1); sp->luma_log2_weight_denom = (uint8_t)sh->luma_log2_weight_denom; sp->delta_chroma_log2_weight_denom = (uint8_t)(sh->chroma_log2_weight_denom - sh->luma_log2_weight_denom); for (int32_t l = 0; l < 2; l++) { EnumRefPicList eRefPicList = ( l == 1 ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); for (int32_t iRefIdx = 0; iRefIdx < slice->getNumRefIdx(eRefPicList); iRefIdx++) { wpScalingParam const* wp = sh->pred_weight_table[eRefPicList][iRefIdx]; if (eRefPicList == REF_PIC_LIST_0) { sp->luma_offset_l0[iRefIdx] = (int8_t)wp[0].offset; sp->delta_luma_weight_l0[iRefIdx] = (int8_t)wp[0].delta_weight; for(int chroma=0;chroma < 2;chroma++) { sp->delta_chroma_weight_l0[iRefIdx][chroma] = (int8_t)wp[1 + chroma].delta_weight; sp->ChromaOffsetL0 [iRefIdx][chroma] = (int8_t)wp[1 + chroma].offset; } } else { sp->luma_offset_l1[iRefIdx] = (int8_t)wp[0].offset; sp->delta_luma_weight_l1[iRefIdx] = (int8_t)wp[0].delta_weight; for(int chroma=0;chroma < 2;chroma++) { sp->delta_chroma_weight_l1[iRefIdx][chroma] = (int8_t)wp[1 + chroma].delta_weight; sp->ChromaOffsetL1 [iRefIdx][chroma] = (int8_t)wp[1 + chroma].offset; } } } } sp->five_minus_max_num_merge_cand = (uint8_t)(5 - sh->max_num_merge_cand); TRACE_BUFFER_EVENT(VA_TRACE_API_HEVC_SLICEPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_SLICEPARAM, sp, H265DecodeSliceparam, SLICEPARAM_HEVC); } while (0); } template inline void SanitizeReferenceFrames(H265Slice const* slice, VASliceParameterBufferHEVC const* sp, VAPictureParameterBufferHEVC* pp, PicListT) { assert(slice); assert(sp); assert(pp); size_t const max_num_ref = std::extentReferenceFrames)>::value; size_t const num_valid_ref = std::distance( sp->RefPicList[ListX], std::find(sp->RefPicList[ListX], sp->RefPicList[ListX] + max_num_ref, 0xff) ); size_t const num_active_ref = slice->getNumRefIdx(ListX); if (num_valid_ref >= num_active_ref) return; for (auto i = num_valid_ref; i < num_active_ref; ++i) { //try to find 'Foll' reference auto r = std::find_if(pp->ReferenceFrames, pp->ReferenceFrames + max_num_ref, [](VAPictureHEVC const& p) { return p.picture_id != VA_INVALID_SURFACE && p.flags == 0; } ); if (r == pp->ReferenceFrames + max_num_ref) //no 'Foll' reference found, can't do anymore break; //make 'Foll' to be 'Before/After' reference r->flags |= ListX == REF_PIC_LIST_0 ? VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : VA_PICTURE_HEVC_RPS_ST_CURR_AFTER; } } class PackerVAAPI : public UMC_HEVC_DECODER::PackerVAAPI { public: PackerVAAPI(UMC::VideoAccelerator* va) : UMC_HEVC_DECODER::PackerVAAPI(va) {} protected: void CreateSliceParamBuffer(size_t count) override { m_va->IsLongSliceControl() ? CreateParamsBuffer(m_va, count) : CreateParamsBuffer(m_va, count) ; } void PackPicParams(H265DecoderFrame const* frame, TaskSupplier_H265* supplier) override { assert(frame); assert(supplier); H265DBPList const* dpb = supplier->GetDPBList(); if (!dpb) throw h265_exception(UMC::UMC_ERR_FAILED); VAPictureParameterBufferHEVC* pp = nullptr; PeekParamsBuffer(m_va, &pp); PackPicHeader(m_va, frame, dpb, pp); } VASliceParameterBufferBase* PackSliceParams(H265Slice const* slice, bool last_slice) override { assert(slice); VASliceParameterBufferBase* sp_base = nullptr; if (!m_va->IsLongSliceControl()) PeekParamsBuffer(m_va, &sp_base); else { VASliceParameterBufferHEVC* sp = nullptr; PeekParamsBuffer(m_va, &sp); sp_base = reinterpret_cast(sp); } PackSliceParams(sp_base, slice, last_slice); return sp_base; } void PackSliceParams(VASliceParameterBufferBase* sp_base, H265Slice const* slice, bool last_slice) override { assert(sp_base); assert(slice); if (m_va->IsLongSliceControl()) { VAPictureParameterBufferHEVC* pp = nullptr; GetParamsBuffer(m_va, &pp); auto sp = reinterpret_cast(sp_base); PackSliceHeader(m_va, slice, pp, sp, last_slice); SanitizeReferenceFrames(slice, sp, pp, PicListT{}); SanitizeReferenceFrames(slice, sp, pp, PicListT{}); } auto bs = slice->GetBitStream(); assert(bs); uint32_t size = 0; uint32_t* ptr = 0; bs->GetOrg(&ptr, &size); auto src = reinterpret_cast(ptr); static uint8_t constexpr start_code[] = { 0, 0, 1 }; uint8_t* dst = nullptr; auto offset = PeekSliceDataBuffer(m_va, &dst, size + sizeof(start_code)); if (!dst) throw h265_exception(UMC::UMC_ERR_FAILED); // auto xxx = dst; // copy slice data to slice data buffer std::copy(start_code, start_code + sizeof(start_code), dst); dst += sizeof(start_code); std::copy(src, src + size, dst); sp_base->slice_data_size = size + sizeof(start_code); sp_base->slice_data_offset = offset; sp_base->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; } }; } //G9 } #endif //_UMC_VA_H265_PACKER_G9_H_ umc_h265_au_splitter.h000066400000000000000000000043321443134507600330250ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_AU_SPLITTER_H #define __UMC_H265_AU_SPLITTER_H #include #include "umc_h265_dec_defs.h" #include "umc_media_data_ex.h" #include "umc_h265_heap.h" #include "umc_h265_headers.h" #include "umc_video_decoder.h" namespace UMC_HEVC_DECODER { class NALUnitSplitter_H265; // NAL unit splitter wrapper class class AU_Splitter_H265 { public: AU_Splitter_H265(); virtual ~AU_Splitter_H265(); void Init(UMC::VideoDecoderParams *init); void Close(); void Reset(); // Wrapper for NAL unit splitter CheckNalUnitType int32_t CheckNalUnitType(UMC::MediaData * pSource); // Wrapper for NAL unit splitter CheckNalUnitType GetNalUnit UMC::MediaDataEx * GetNalUnit(UMC::MediaData * src); // Returns internal NAL unit splitter NALUnitSplitter_H265 * GetNalUnitSplitter(); protected: Heap_Objects m_ObjHeap; Headers m_Headers; protected: std::unique_ptr m_pNALSplitter; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_AU_SPLITTER_H #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_bitstream_headers.h000066400000000000000000000436231443134507600341650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_BITSTREAM_HEADERS_H_ #define __UMC_H265_BITSTREAM_HEADERS_H_ #include "umc_structures.h" #include "umc_h265_dec_defs.h" // Read N bits from 32-bit array #define GetNBits(current_data, offset, nbits, data) \ { \ uint32_t x; \ \ assert((nbits) > 0 && (nbits) <= 32); \ assert(offset >= 0 && offset <= 31); \ \ offset -= (nbits); \ \ if (offset >= 0) \ { \ x = current_data[0] >> (offset + 1); \ } \ else \ { \ offset += 32; \ \ x = current_data[1] >> (offset); \ x >>= 1; \ x += current_data[0] << (31 - offset); \ current_data++; \ } \ \ assert(offset >= 0 && offset <= 31); \ \ (data) = x & bits_data[nbits]; \ } // Return bitstream position pointers N bits back #define UngetNBits(current_data, offset, nbits) \ { \ assert(offset >= 0 && offset <= 31); \ \ offset += (nbits); \ if (offset > 31) \ { \ offset -= 32; \ current_data--; \ } \ \ assert(offset >= 0 && offset <= 31); \ } // Skip N bits in 32-bit array #define SkipNBits(current_data, offset, nbits) \ { \ /* check error(s) */ \ assert((nbits) > 0 && (nbits) <= 32); \ assert(offset >= 0 && offset <= 31); \ /* decrease number of available bits */ \ offset -= (nbits); \ /* normalize bitstream pointer */ \ if (0 > offset) \ { \ offset += 32; \ current_data++; \ } \ /* check error(s) again */ \ assert(offset >= 0 && offset <= 31); \ } // Read 1 bit from 32-bit array #define GetBits1(current_data, offset, data) \ { \ data = ((current_data[0] >> (offset)) & 1); \ offset -= 1; \ if (offset < 0) \ { \ offset = 31; \ current_data += 1; \ } \ } // Align bitstream position to byte boundary #define ippiAlignBSPointerRight(current_data, offset) \ { \ if ((offset & 0x07) != 0x07) \ { \ offset = (offset | 0x07) - 8; \ if (offset == -1) \ { \ offset = 31; \ current_data++; \ } \ } \ } // Read N bits from 32-bit array #define PeakNextBits(current_data, bp, nbits, data) \ { \ uint32_t x; \ \ assert((nbits) > 0 && (nbits) <= 32); \ assert(nbits >= 0 && nbits <= 31); \ \ int32_t offset = bp - (nbits); \ \ if (offset >= 0) \ { \ x = current_data[0] >> (offset + 1); \ } \ else \ { \ offset += 32; \ \ x = current_data[1] >> (offset); \ x >>= 1; \ x += current_data[0] << (31 - offset); \ } \ \ assert(offset >= 0 && offset <= 31); \ \ (data) = x & bits_data[nbits]; \ } namespace UMC_HEVC_DECODER { // Bit masks for fast extraction of bits from bitstream const uint32_t bits_data[33] = { (((uint32_t)0x01 << (0)) - 1), (((uint32_t)0x01 << (1)) - 1), (((uint32_t)0x01 << (2)) - 1), (((uint32_t)0x01 << (3)) - 1), (((uint32_t)0x01 << (4)) - 1), (((uint32_t)0x01 << (5)) - 1), (((uint32_t)0x01 << (6)) - 1), (((uint32_t)0x01 << (7)) - 1), (((uint32_t)0x01 << (8)) - 1), (((uint32_t)0x01 << (9)) - 1), (((uint32_t)0x01 << (10)) - 1), (((uint32_t)0x01 << (11)) - 1), (((uint32_t)0x01 << (12)) - 1), (((uint32_t)0x01 << (13)) - 1), (((uint32_t)0x01 << (14)) - 1), (((uint32_t)0x01 << (15)) - 1), (((uint32_t)0x01 << (16)) - 1), (((uint32_t)0x01 << (17)) - 1), (((uint32_t)0x01 << (18)) - 1), (((uint32_t)0x01 << (19)) - 1), (((uint32_t)0x01 << (20)) - 1), (((uint32_t)0x01 << (21)) - 1), (((uint32_t)0x01 << (22)) - 1), (((uint32_t)0x01 << (23)) - 1), (((uint32_t)0x01 << (24)) - 1), (((uint32_t)0x01 << (25)) - 1), (((uint32_t)0x01 << (26)) - 1), (((uint32_t)0x01 << (27)) - 1), (((uint32_t)0x01 << (28)) - 1), (((uint32_t)0x01 << (29)) - 1), (((uint32_t)0x01 << (30)) - 1), (((uint32_t)0x01 << (31)) - 1), ((uint32_t)0xFFFFFFFF), }; template class HeaderSet; class Headers; // Bitstream low level parsing class class H265BaseBitstream { public: H265BaseBitstream(); H265BaseBitstream(uint8_t * const pb, const uint32_t maxsize); virtual ~H265BaseBitstream(); // Reset the bitstream with new data pointer void Reset(uint8_t * const pb, const uint32_t maxsize); // Reset the bitstream with new data pointer and bit offset void Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize); // Align bitstream position to byte boundary inline void AlignPointerRight(void); // Read N bits from bitstream array inline uint32_t GetBits(uint32_t nbits); // Read N bits from bitstream array template inline uint32_t GetPredefinedBits(); #if defined( __INTEL_COMPILER ) // Optimized function which uses bit manipulation instructions (BMI) inline uint32_t GetBits_BMI(uint32_t nbits); #endif // Read variable length coded unsigned element uint32_t GetVLCElementU(); // Read variable length coded signed element int32_t GetVLCElementS(); // Reads one bit from the buffer. uint8_t Get1Bit(); // Check that position in bitstream didn't move outside the limit bool CheckBSLeft(); // Check whether more data is present bool More_RBSP_Data(); // Returns number of decoded bytes since last reset size_t BytesDecoded() const; // Returns number of decoded bits since last reset size_t BitsDecoded() const; // Returns number of bytes left in bitstream array size_t BytesLeft() const; // Throw exception if left bits not enough to decode void CheckBitsLeft(const uint32_t nbits); // Returns number of bits needed for byte alignment unsigned getNumBitsUntilByteAligned() const; // Align bitstream to byte boundary void readOutTrailingBits(); // Returns bitstream current buffer pointer const uint8_t *GetRawDataPtr() const { return (const uint8_t *)m_pbs + (31 - m_bitOffset)/8; } // Return bitstream array base address and size void GetOrg(uint32_t **pbs, uint32_t *size) const; // Return current bitstream address and bit offset void GetState(uint32_t **pbs, uint32_t *bitOffset); // Set current bitstream address and bit offset void SetState(uint32_t *pbs, uint32_t bitOffset); // Set current decoding position void SetDecodedBytes(size_t); // Set dummy buffer size in bytes void SetTailBsSize(const uint32_t nBytes); size_t GetAllBitsCount() { return m_maxBsSize; } size_t BytesDecodedRoundOff() { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase); } protected: uint32_t *m_pbs; // (uint32_t *) pointer to the current position of the buffer. int32_t m_bitOffset; // (int32_t) the bit position (0 to 31) in the dword pointed by m_pbs. uint32_t *m_pbsBase; // (uint32_t *) pointer to the first byte of the buffer. uint32_t m_maxBsSize; // (uint32_t) maximum buffer size in bytes. uint32_t m_tailBsSize; // (uint32_t) dummy buffer size in bytes at the buffer end. }; class H265ScalingList; class H265VideoParamSet; struct H265SeqParamSet; class H265Slice; // Bitstream headers parsing class class H265HeadersBitstream : public H265BaseBitstream { public: H265HeadersBitstream(); H265HeadersBitstream(uint8_t * const pb, const uint32_t maxsize); // Read and return NAL unit type and NAL storage idc. // Bitstream position is expected to be at the start of a NAL unit. UMC::Status GetNALUnitType(NalUnitType &nal_unit_type, uint32_t &nuh_temporal_id); // Read optional access unit delimiter from bitstream. UMC::Status GetAccessUnitDelimiter(uint32_t &PicCodType); // Parse SEI message int32_t ParseSEI(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl); // Parse remaining of slice header after GetSliceHeaderPart1 void decodeSlice(H265Slice *, const H265SeqParamSet *, const H265PicParamSet *, PocDecoding *); // Parse slice header part which contains PPS ID UMC::Status GetSliceHeaderPart1(H265SliceHeader * sliceHdr); // Parse full slice header UMC::Status GetSliceHeaderFull(H265Slice *, const H265SeqParamSet *, const H265PicParamSet *, PocDecoding *); // Parse scaling list information in SPS or PPS void parseScalingList(H265ScalingList *); // Reserved for future header extensions bool MoreRbspData(); // Part VPS header UMC::Status GetVideoParamSet(H265VideoParamSet *vps); // Parse SPS header UMC::Status GetSequenceParamSet(H265SeqParamSet *sps); // Parse PPS header void GetPictureParamSetPart1(H265PicParamSet *pps); UMC::Status GetPictureParamSetFull(H265PicParamSet *pps, H265SeqParamSet const*); UMC::Status GetWPPTileInfo(H265SliceHeader *hdr, const H265PicParamSet *pps, const H265SeqParamSet *sps); void parseShortTermRefPicSet(const H265SeqParamSet* sps, ReferencePictureSet* pRPS, uint32_t idx); protected: // Parse video usability information block in SPS void parseVUI(H265SeqParamSet *sps); // Parse weighted prediction table in slice header void xParsePredWeightTable(const H265SeqParamSet *sps, H265SliceHeader * sliceHdr); // Parse scaling list data block void xDecodeScalingList(H265ScalingList *scalingList, unsigned sizeId, unsigned listId); // Parse HRD information in VPS or in VUI block of SPS void parseHrdParameters(H265HRD *hrd, uint8_t commonInfPresentFlag, uint32_t vps_max_sub_layers); // Parse profile tier layers header part in VPS or SPS void parsePTL(H265ProfileTierLevel *rpcPTL, int maxNumSubLayersMinus1); // Parse one profile tier layer void parseProfileTier(H265PTL *profileTierLevel); // Decoding SEI message functions int32_t sei_message(const HeaderSet & sps,int32_t current_sps,H265SEIPayLoad *spl); // Parse SEI payload data int32_t sei_payload(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl); // Parse pic timing SEI data int32_t pic_timing(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl); // Parse recovery point SEI data int32_t recovery_point(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl); // Parse mastering display colour volume SEI data int32_t mastering_display_colour_volume(const HeaderSet& sps, int32_t current_sps, H265SEIPayLoad* spl); // Parse content light level info SEI data int32_t content_light_level_info(const HeaderSet& sps, int32_t current_sps, H265SEIPayLoad* spl); // Skip unrecognized SEI message payload int32_t reserved_sei_message(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl); }; // Read N bits from bitstream array inline uint32_t H265BaseBitstream::GetBits(const uint32_t nbits) { uint32_t w, n = nbits; CheckBitsLeft(n); GetNBits(m_pbs, m_bitOffset, n, w); return(w); } // Read N bits from bitstream array template inline uint32_t H265BaseBitstream::GetPredefinedBits() { uint32_t w, n = nbits; CheckBitsLeft(n); GetNBits(m_pbs, m_bitOffset, n, w); return(w); } inline bool DecodeExpGolombOne_H265_1u32s (uint32_t **ppBitStream, int32_t *pBitOffset, int32_t *pDst, int32_t remainingBits, int32_t isSigned) { uint32_t code; uint32_t info = 0; int32_t length = 1; /* for first bit read above*/ uint32_t thisChunksLength = 0; uint32_t sval; /* check error(s) */ /* Fast check for element = 0 */ if ((remainingBits < 1)) { throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } GetNBits((*ppBitStream), (*pBitOffset), 1, code); remainingBits -= 1; if (code) { *pDst = 0; return true; } if ((remainingBits < 8)) { throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } GetNBits((*ppBitStream), (*pBitOffset), 8, code); length += 8; remainingBits -= 8; /* find nonzero byte */ while (code == 0 && 32 > length) { if ((remainingBits < 8)) { throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } GetNBits((*ppBitStream), (*pBitOffset), 8, code); length += 8; remainingBits -= 8; } /* find leading '1' */ while ((code & 0x80) == 0 && 32 > thisChunksLength) { code <<= 1; thisChunksLength++; } length -= 8 - thisChunksLength; UngetNBits((*ppBitStream), (*pBitOffset),8 - (thisChunksLength + 1)); remainingBits += 8 - (thisChunksLength + 1); /* skipping very long codes, let's assume what the code is corrupted */ if (32 <= length || 32 <= thisChunksLength) { uint32_t dwords; length -= (*pBitOffset + 1); dwords = length/32; length -= (32*dwords); *ppBitStream += (dwords + 1); *pBitOffset = 31 - length; *pDst = 0; return false; } /* Get info portion of codeword */ if (length) { if ((remainingBits < length)) { throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } GetNBits((*ppBitStream), (*pBitOffset),length, info); remainingBits -= length; } sval = ((1 << (length)) + (info) - 1); if (isSigned) { if (sval & 1) *pDst = (int32_t) ((sval + 1) >> 1); else *pDst = -((int32_t) (sval >> 1)); } else *pDst = (int32_t) sval; return true; } // Read variable length coded unsigned element inline uint32_t H265BaseBitstream::GetVLCElementU() { int32_t sval = 0; int32_t remainingbits = (int32_t)((m_maxBsSize + m_tailBsSize) * 8) - (int32_t)BitsDecoded(); bool res = DecodeExpGolombOne_H265_1u32s(&m_pbs, &m_bitOffset, &sval, remainingbits, false); if (!res) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); return (uint32_t)sval; } // Read variable length coded signed element inline int32_t H265BaseBitstream::GetVLCElementS() { int32_t sval = 0; int32_t remainingbits = (int32_t)((m_maxBsSize + m_tailBsSize) * 8) - (int32_t)BitsDecoded(); bool res = DecodeExpGolombOne_H265_1u32s(&m_pbs, &m_bitOffset, &sval, remainingbits, true); if (!res) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); return sval; } // Read one bit inline uint8_t H265BaseBitstream::Get1Bit() { uint32_t w; CheckBitsLeft(1); GetBits1(m_pbs, m_bitOffset, w); return (uint8_t)w; } // H265Bitstream::Get1Bit() // Returns number of decoded bytes since last reset inline size_t H265BaseBitstream::BytesDecoded() const { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase) + ((31 - m_bitOffset) >> 3); } // Returns number of decoded bits since last reset inline size_t H265BaseBitstream::BitsDecoded() const { return static_cast((uint8_t*)m_pbs - (uint8_t*)m_pbsBase) * 8 + (31 - m_bitOffset); } // Returns number of bytes left in bitstream array inline size_t H265BaseBitstream::BytesLeft() const { return (int32_t)m_maxBsSize - (int32_t) BytesDecoded(); } // Throw exception if left bits not enough to decode inline void H265BaseBitstream::CheckBitsLeft(const uint32_t nbits) { if((int32_t)m_maxBsSize > 0 && (size_t)m_maxBsSize * 8 > BitsDecoded()) { if ((size_t)m_maxBsSize * 8 - (size_t)BitsDecoded() < nbits) throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } else throw h265_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); } // Returns number of bits needed for byte alignment inline unsigned H265BaseBitstream::getNumBitsUntilByteAligned() const { return ((m_bitOffset + 1) % 8); } // Align bitstream to byte boundary inline void H265BaseBitstream::readOutTrailingBits() { Get1Bit(); //assert(1 == uVal); uint32_t bits = getNumBitsUntilByteAligned(); if (bits) { GetBits(bits); //assert(0 == uVal); } } // Align bitstream position to byte boundary inline void H265BaseBitstream::AlignPointerRight(void) { if ((m_bitOffset & 0x07) != 0x07) { m_bitOffset = (m_bitOffset | 0x07) - 8; if (m_bitOffset == -1) { m_bitOffset = 31; m_pbs++; } } } inline void H265BaseBitstream::SetTailBsSize(const uint32_t nBytes) { m_tailBsSize = nBytes; } } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_BITSTREAM_HEADERS_H_ #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_debug.h000066400000000000000000000034141443134507600316370ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_DEC_DEBUG_H #define __UMC_H265_DEC_DEBUG_H #include "umc_h265_dec_defs.h" //#define ENABLE_TRACE namespace UMC_HEVC_DECODER { #ifdef ENABLE_TRACE class H265DecoderFrame; void Trace(vm_char * format, ...); const vm_char* GetFrameInfoString(H265DecoderFrame * frame); #if defined _DEBUG #define DEBUG_PRINT(x) Trace x static int pppp = 0; #define DEBUG_PRINT1(x) #else #define DEBUG_PRINT(x) #define DEBUG_PRINT1(x) #endif #else #define DEBUG_PRINT(x) #define DEBUG_PRINT1(x) #endif } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_DEC_DEBUG_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_dec_defs.h000066400000000000000000001316521443134507600323130ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_DEC_DEFS_DEC_H__ #define __UMC_H265_DEC_DEFS_DEC_H__ #include #include "umc_structures.h" #include "mfx_utils.h" namespace UMC_HEVC_DECODER { #define H265_FORCEINLINE __attribute__((always_inline)) #define H265_NONLINE __attribute__((noinline)) enum { H265_PROFILE_MAIN = 1, H265_PROFILE_MAIN10 = 2, H265_PROFILE_MAINSP = 3, H265_PROFILE_FREXT = 4, H265_PROFILE_SCC = 9, }; // HEVC level identifiers enum { H265_LEVEL_1 = 10, H265_LEVEL_2 = 20, H265_LEVEL_21 = 21, H265_LEVEL_3 = 30, H265_LEVEL_31 = 31, H265_LEVEL_4 = 40, H265_LEVEL_41 = 41, H265_LEVEL_5 = 50, H265_LEVEL_51 = 51, H265_LEVEL_52 = 52, H265_LEVEL_6 = 60, H265_LEVEL_61 = 61, H265_LEVEL_62 = 62, H265_LEVEL_MAX = 62 }; // Hack to allow somewhat unconformant streams. Should be used only when decoding random ENC streams #define INSTRUMENTED_CABAC 0 enum { AMVP_MAX_NUM_CAND = 2, // max number of final candidates MERGE_MAX_NUM_CAND = 5, MAX_CHROMA_OFFSET_ELEMENTS = 7 }; #define REG_DCT 65535 #define CU_DQP_TU_CMAX 5 //max number bins for truncated unary #define CU_DQP_EG_k 0 //expgolomb order // Plane identifiers enum ComponentPlane { COMPONENT_LUMA = 0, COMPONENT_CHROMA_U, COMPONENT_CHROMA_V, COMPONENT_CHROMA_U1, COMPONENT_CHROMA_V1, COMPONENT_CHROMA = COMPONENT_CHROMA_U }; /// coefficient scanning type used in ACS enum COEFF_SCAN_TYPE { SCAN_DIAG = 0, ///< typical zigzag scan SCAN_HOR, ///< horizontal first scan SCAN_VER ///< vertical first scan }; // coeffs decoding constants enum { SCAN_SET_SIZE = 16, LAST_MINUS_FIRST_SIG_SCAN_THRESHOLD = 3, NUM_CONTEXT_QT_CBF = 5, // number of context models for QT CBF NUM_CONTEXT_SIG_COEFF_GROUP_FLAG = 2, // number of contexts for sig coeff group NUM_CONTEXT_SIG_FLAG_LUMA = 27, // number of contexts for luma sig flag NUM_CONTEX_LAST_COEF_FLAG_XY = 15, // number of contexts for last coefficient position NUM_CONTEXT_ONE_FLAG_LUMA = 16, // number of contexts for greater than 1 flag of luma NUM_CONTEXT_ABS_FLAG_LUMA = 4, // number of contexts for greater than 2 flag of luma NUM_CONTEXT_TRANSFORMSKIP_FLAG = 1, // number of contexts for transform skipping flag LARGER_THAN_ONE_FLAG_NUMBER = 8, // maximum number of largerThan1 flag coded in one chunk COEFF_ABS_LEVEL_REMAIN_BIN_THRESHOLD = 3 // maximum codeword length of coeff_abs_level_remaining reduced to 32. }; // Luma intra modes enum { INTRA_LUMA_PLANAR_IDX = 0, // index for intra planar mode INTRA_LUMA_VER_IDX = 26, // index for intra vertical mode INTRA_LUMA_HOR_IDX = 10, // index for intra hor mode INTRA_LUMA_DC_IDX = 1, // index for intra dc mode INTRA_DM_CHROMA_IDX = 36, // index for chroma from luma mode INTRA_NUM_CHROMA_MODE = 5 // total number of chroma modes }; #define MAX_CPB_CNT 32 ///< Upper bound of (cpb_cnt_minus1 + 1) enum { MAX_TEMPORAL_LAYER = 8, MAX_VPS_NUM_LAYER_SETS = 1024, MAX_NUH_LAYER_ID = 1, // currently max nuh_layer_id value is 1 MAX_CU_DEPTH = 6, MAX_CU_SIZE = (1 << MAX_CU_DEPTH), // maximum allowable size of CU MIN_PU_SIZE = 4, MAX_NUM_PU_IN_ROW = (MAX_CU_SIZE/MIN_PU_SIZE) }; #define SAO_BO_BITS 5 #define LUMA_GROUP_NUM (1 << SAO_BO_BITS) #if defined (__ICL) // remark #981: operands are evaluated in unspecified order #pragma warning(disable: 981) #elif defined ( _MSC_VER ) // warning C4068: unknown pragma // warning C4127: conditional check is constant #pragma warning (disable: 4127 4068) #endif struct H265SeqParamSet; class H265DecoderFrame; class H265DecYUVBufferPadded; class H265CodingUnit; // Display structure modes enum DisplayPictureStruct_H265 { DPS_FRAME_H265 = 0, DPS_TOP_H265, // one field DPS_BOTTOM_H265, // one field DPS_TOP_BOTTOM_H265, DPS_BOTTOM_TOP_H265, DPS_TOP_BOTTOM_TOP_H265, DPS_BOTTOM_TOP_BOTTOM_H265, DPS_FRAME_DOUBLING_H265, DPS_FRAME_TRIPLING_H265, DPS_TOP_BOTTOM_PREV_H265, // 9 - Top field paired with previous bottom field in output order DPS_BOTTOM_TOP_PREV_H265, //10 - Bottom field paired with previous top field in output order DPS_TOP_BOTTOM_NEXT_H265, //11 - Top field paired with next bottom field in output order DPS_BOTTOM_TOP_NEXT_H265, //12 - Bottom field paired with next top field in output order }; typedef uint8_t PlaneY; typedef uint8_t PlaneUV; typedef int16_t Coeffs; typedef Coeffs *CoeffsPtr; typedef PlaneY *PlanePtrY; typedef PlaneUV *PlanePtrUV; // HEVC NAL unit types enum NalUnitType { NAL_UT_CODED_SLICE_TRAIL_N = 0, NAL_UT_CODED_SLICE_TRAIL_R = 1, NAL_UT_CODED_SLICE_TSA_N = 2, NAL_UT_CODED_SLICE_TLA_R = 3, NAL_UT_CODED_SLICE_STSA_N = 4, NAL_UT_CODED_SLICE_STSA_R = 5, NAL_UT_CODED_SLICE_RADL_N = 6, NAL_UT_CODED_SLICE_RADL_R = 7, NAL_UT_CODED_SLICE_RASL_N = 8, NAL_UT_CODED_SLICE_RASL_R = 9, NAL_UT_CODED_SLICE_BLA_W_LP = 16, NAL_UT_CODED_SLICE_BLA_W_RADL = 17, NAL_UT_CODED_SLICE_BLA_N_LP = 18, NAL_UT_CODED_SLICE_IDR_W_RADL = 19, NAL_UT_CODED_SLICE_IDR_N_LP = 20, NAL_UT_CODED_SLICE_CRA = 21, NAL_UT_VPS = 32, NAL_UT_SPS = 33, NAL_UT_PPS = 34, NAL_UT_AU_DELIMITER = 35, NAL_UT_EOS = 36, NAL_UT_EOB = 37, NAL_UT_FILLER_DATA = 38, NAL_UT_SEI = 39, // Prefix SEI NAL_UT_SEI_SUFFIX = 40, // Suffix SEI NAL_UT_INVALID = 64 }; // Slice types enum SliceType { B_SLICE, P_SLICE, I_SLICE }; // Reference list IDs enum EnumRefPicList { REF_PIC_LIST_0 = 0, ///< reference list 0 REF_PIC_LIST_1 = 1 ///< reference list 1 }; // Prediction unit IDs enum EnumPartSize // supported partition shape { PART_SIZE_2Nx2N, ///< symmetric motion partition, 2Nx2N PART_SIZE_2NxN, ///< symmetric motion partition, 2Nx N PART_SIZE_Nx2N, ///< symmetric motion partition, Nx2N PART_SIZE_NxN, ///< symmetric motion partition, Nx N PART_SIZE_2NxnU, ///< asymmetric motion partition, 2Nx( N/2) + 2Nx(3N/2) PART_SIZE_2NxnD, ///< asymmetric motion partition, 2Nx(3N/2) + 2Nx( N/2) PART_SIZE_nLx2N, ///< asymmetric motion partition, ( N/2)x2N + (3N/2)x2N PART_SIZE_nRx2N, ///< asymmetric motion partition, (3N/2)x2N + ( N/2)x2N }; // Supported prediction type enum EnumPredMode { MODE_INTER, ///< inter-prediction mode MODE_INTRA, ///< intra-prediction mode MODE_NONE }; #define SCALING_LIST_NUM 6 ///< list number for quantization matrix #define SCALING_LIST_NUM_32x32 2 ///< list number for quantization matrix 32x32 #define SCALING_LIST_REM_NUM 6 ///< remainder of QP/6 #define SCALING_LIST_START_VALUE 8 ///< start value for dpcm mode #define MAX_MATRIX_COEF_NUM 64 ///< max coefficient number for quantization matrix #define MAX_MATRIX_SIZE_NUM 8 ///< max size number for quantization matrix #define SCALING_LIST_DC 16 ///< default DC value enum ScalingListSize { SCALING_LIST_4x4 = 0, SCALING_LIST_8x8, SCALING_LIST_16x16, SCALING_LIST_32x32, SCALING_LIST_SIZE_NUM }; // Convert one enum to another inline UMC::FrameType SliceTypeToFrameType(SliceType slice_type) { switch(slice_type) { case P_SLICE: return UMC::P_PICTURE; case B_SLICE: return UMC::B_PICTURE; case I_SLICE: return UMC::I_PICTURE; } return UMC::NONE_PICTURE; } // SEI identifiers typedef enum { SEI_BUFFERING_PERIOD_TYPE = 0, SEI_PIC_TIMING_TYPE = 1, SEI_PAN_SCAN_RECT_TYPE = 2, SEI_FILLER_TYPE = 3, SEI_USER_DATA_REGISTERED_TYPE = 4, SEI_USER_DATA_UNREGISTERED_TYPE = 5, SEI_RECOVERY_POINT_TYPE = 6, SEI_SCENE_INFO_TYPE = 9, SEI_PICTURE_SNAPSHOT = 15, SEI_PROGRESSIVE_REF_SEGMENT_START_TYPE = 16, SEI_PROGRESSIVE_REF_SEGMENT_END_TYPE = 17, SEI_FILM_GRAIN_CHARACTERISTICS = 19, SEI_POST_FILTER_HINT = 22, SEI_TONE_MAPPING_INFO = 23, SEI_FRAME_PACKING_ARRANGEMENT = 45, SEI_DISPLAY_ORIENTATION = 47, SEI_STRUCTURE_OF_PICTURES_INFO = 128, SEI_SEI_ACTIVE_PARAMETER_SET = 129, SEI_DECODING_UNIT_INFO = 130, SEI_TEMPORAL_SUB_LAYER_ZERO_INDEX = 131, SEI_SCALABLE_NESTING = 133, SEI_REGION_REFRESH_INFO = 134, SEI_NO_DISPLAY = 135, SEI_TIME_CODE = 136, SEI_MASTERING_DISPLAY_COLOUR_VOLUME = 137, SEI_SEGMENTED_RECT_FRAME_PACKING_ARRANGEMENT = 138, SEI_TEMPORAL_MOTION_CONSTRAINED_TILE_SETS = 139, SEI_CHROMA_RESAMPLING_FILTER_HINT = 140, SEI_KNEE_FUNCTION_INFO = 141, SEI_COLOUR_REMAPPING_INFO = 142, SEI_DEINTERLACED_FIELD_IDENTIFICATION = 143, SEI_CONTENT_LIGHT_LEVEL_INFO = 144, SEI_LAYERS_NOT_PRESENT = 160, SEI_INTER_LAYER_CONSTRAINED_TILE_SETS = 161, SEI_BSP_NESTING = 162, SEI_BSP_INITIAL_ARRIVAL_TIME = 163, SEI_SUB_BITSTREAM_PROPERTY = 164, SEI_ALPHA_CHANNEL_INFO = 165, SEI_OVERLAY_INFO = 166, SEI_TEMPORAL_MV_PREDICTION_CONSTRAINTS = 167, SEI_FRAME_FIELD_INFO = 168, SEI_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO = 176, SEI_DEPTH_REPRESENTATION_INFO = 177, SEI_MULTIVIEW_SCENE_INFO = 178, SEI_MULTIVIEW_ACQUISITION_INFO = 179, SEI_MULTIVIEW_VIEW_POSITION = 180, SEI_RESERVED, SEI_NUM_MESSAGES } SEI_TYPE; #define IS_SKIP_DEBLOCKING_MODE_PERMANENT (m_PermanentTurnOffDeblocking == 2) #define IS_SKIP_DEBLOCKING_MODE_PREVENTIVE (m_PermanentTurnOffDeblocking == 3) enum { MAX_NUM_VPS_PARAM_SETS_H265 = 16, MAX_NUM_SEQ_PARAM_SETS_H265 = 16, MAX_NUM_PIC_PARAM_SETS_H265 = 64, MAX_NUM_REF_PICS = 16, COEFFICIENTS_BUFFER_SIZE_H265 = 16 * 51, MINIMAL_DATA_SIZE_H265 = 4, DEFAULT_NU_TAIL_VALUE = 0xff, DEFAULT_NU_TAIL_SIZE = 8 }; // Memory reference counting base class class RefCounter { public: RefCounter() : m_refCounter(0) { } void IncrementReference() const; void DecrementReference(); void ResetRefCounter() {m_refCounter = 0;} uint32_t GetRefCounter() const {return m_refCounter;} protected: mutable int32_t m_refCounter; virtual ~RefCounter() { } virtual void Free() { } }; // Basic ref counting heap object class class HeapObject : public RefCounter { public: virtual ~HeapObject() {} virtual void Reset() { } virtual void Free(); }; // Scaling list data structure class H265ScalingList { public: H265ScalingList() { m_initialized = false; } ~H265ScalingList() { if (m_initialized) destroy(); } int* getScalingListAddress (unsigned sizeId, unsigned listId) { return m_scalingListCoef[sizeId][listId]; } const int* getScalingListAddress (unsigned sizeId, unsigned listId) const { return m_scalingListCoef[sizeId][listId]; } void setRefMatrixId (unsigned sizeId, unsigned listId, unsigned u) { m_refMatrixId[sizeId][listId] = u; } unsigned getRefMatrixId (unsigned sizeId, unsigned listId) { return m_refMatrixId[sizeId][listId]; } void setScalingListDC (unsigned sizeId, unsigned listId, unsigned u) { m_scalingListDC[sizeId][listId] = u; } // Copy data from predefined scaling matrixes void processRefMatrix(unsigned sizeId, unsigned listId, unsigned refListId); int getScalingListDC (unsigned sizeId, unsigned listId) const { return m_scalingListDC[sizeId][listId]; } // Allocate and initialize scaling list tables void init(); bool is_initialized(void) { return m_initialized; } // Initialize scaling list with default data void initFromDefaultScalingList(void); // Calculated coefficients used for dequantization void calculateDequantCoef(void); // Deallocate scaling list tables void destroy(); int16_t *m_dequantCoef[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][SCALING_LIST_REM_NUM]; private: H265_FORCEINLINE int16_t* getDequantCoeff(uint32_t list, uint32_t qp, uint32_t size) { return m_dequantCoef[size][list][qp]; } // Calculated coefficients used for dequantization in one scaling list matrix __inline void processScalingListDec(int32_t *coeff, int16_t *dequantcoeff, int32_t invQuantScales, uint32_t height, uint32_t width, uint32_t ratio, uint32_t sizuNum, uint32_t dc); // Returns default scaling matrix for specified parameters static const int *getScalingListDefaultAddress(unsigned sizeId, unsigned listId); int m_scalingListDC [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; unsigned m_refMatrixId [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; int m_scalingListCoef [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][MAX_MATRIX_COEF_NUM]; bool m_initialized; }; // One profile, tier, level data structure struct H265PTL { uint32_t profile_space; uint8_t tier_flag; uint32_t profile_idc; uint32_t profile_compatibility_flags; // bitfield, 32 flags uint8_t progressive_source_flag; uint8_t interlaced_source_flag; uint8_t non_packed_constraint_flag; uint8_t frame_only_constraint_flag; uint32_t level_idc; uint8_t max_12bit_constraint_flag; uint8_t max_10bit_constraint_flag; uint8_t max_8bit_constraint_flag; uint8_t max_422chroma_constraint_flag; uint8_t max_420chroma_constraint_flag; uint8_t max_monochrome_constraint_flag; uint8_t intra_constraint_flag; uint8_t one_picture_only_constraint_flag; uint8_t lower_bit_rate_constraint_flag; uint8_t max_14bit_constraint_flag; H265PTL() { memset(this, 0, sizeof(*this)); } }; // Stream profile, tiler, level data structure #define H265_MAX_SUBLAYER_PTL 6 struct H265ProfileTierLevel { H265PTL generalPTL; H265PTL subLayerPTL[H265_MAX_SUBLAYER_PTL]; uint32_t sub_layer_profile_present_flags; // bitfield [0:H265_MAX_SUBLAYER_PTL] uint32_t sub_layer_level_present_flag; // bitfield [0:H265_MAX_SUBLAYER_PTL] H265ProfileTierLevel() : sub_layer_profile_present_flags(0) , sub_layer_level_present_flag(0) { } const H265PTL* GetGeneralPTL() const { return &generalPTL; } const H265PTL* GetSubLayerPTL(int32_t i) const { return &subLayerPTL[i]; } H265PTL* GetGeneralPTL() { return &generalPTL; } H265PTL* GetSubLayerPTL(int32_t i) { return &subLayerPTL[i]; } }; // HRD information data structure struct H265HrdSubLayerInfo { uint8_t fixed_pic_rate_general_flag; uint8_t fixed_pic_rate_within_cvs_flag; uint32_t elemental_duration_in_tc; uint8_t low_delay_hrd_flag; uint32_t cpb_cnt; // sub layer hrd params uint32_t bit_rate_value[MAX_CPB_CNT][2]; uint32_t cpb_size_value[MAX_CPB_CNT][2]; uint32_t cpb_size_du_value[MAX_CPB_CNT][2]; uint32_t bit_rate_du_value[MAX_CPB_CNT][2]; uint8_t cbr_flag[MAX_CPB_CNT][2]; }; // HRD VUI information struct H265HRD { uint8_t nal_hrd_parameters_present_flag; uint8_t vcl_hrd_parameters_present_flag; uint8_t sub_pic_hrd_params_present_flag; // sub_pic_hrd_params_present_flag uint32_t tick_divisor; uint32_t du_cpb_removal_delay_increment_length; uint8_t sub_pic_cpb_params_in_pic_timing_sei_flag; uint32_t dpb_output_delay_du_length; uint32_t bit_rate_scale; uint32_t cpb_size_scale; uint32_t cpb_size_du_scale; uint32_t initial_cpb_removal_delay_length; uint32_t au_cpb_removal_delay_length; uint32_t dpb_output_delay_length; H265HrdSubLayerInfo m_HRD[MAX_TEMPORAL_LAYER]; H265HRD() { ::memset(this, 0, sizeof(*this)); } H265HrdSubLayerInfo * GetHRDSubLayerParam(uint32_t i) { return &m_HRD[i]; } }; // VUI timing information struct H265TimingInfo { uint8_t vps_timing_info_present_flag; uint32_t vps_num_units_in_tick; uint32_t vps_time_scale; uint8_t vps_poc_proportional_to_timing_flag; int32_t vps_num_ticks_poc_diff_one; public: H265TimingInfo() : vps_timing_info_present_flag(false) , vps_num_units_in_tick(1000) , vps_time_scale(30000) , vps_poc_proportional_to_timing_flag(false) , vps_num_ticks_poc_diff_one(0) {} }; /// VPS class class H265VideoParamSet : public HeapObject { public: uint32_t vps_video_parameter_set_id; uint32_t vps_max_layers; uint32_t vps_max_sub_layers; uint8_t vps_temporal_id_nesting_flag; // profile_tier_level H265ProfileTierLevel m_pcPTL; // vpd sub layer ordering info uint32_t vps_max_dec_pic_buffering[MAX_TEMPORAL_LAYER]; uint32_t vps_num_reorder_pics[MAX_TEMPORAL_LAYER]; uint32_t vps_max_latency_increase[MAX_TEMPORAL_LAYER]; uint32_t vps_max_layer_id; uint32_t vps_num_layer_sets; uint8_t layer_id_included_flag[MAX_VPS_NUM_LAYER_SETS][MAX_NUH_LAYER_ID]; // vps timing info H265TimingInfo m_timingInfo; // hrd parameters uint32_t vps_num_hrd_parameters; uint32_t* hrd_layer_set_idx; uint8_t* cprms_present_flag; H265HRD* m_hrdParameters; public: H265VideoParamSet() : HeapObject() , vps_num_hrd_parameters(0) , hrd_layer_set_idx(0) , cprms_present_flag(0) , m_hrdParameters(0) { Reset(); } ~H265VideoParamSet() { } void createHrdParamBuffer() { delete[] m_hrdParameters; m_hrdParameters = new H265HRD[vps_num_hrd_parameters]; delete[] hrd_layer_set_idx; hrd_layer_set_idx = new unsigned[vps_num_hrd_parameters]; delete[] cprms_present_flag; cprms_present_flag = new uint8_t[vps_num_hrd_parameters]; } void Reset() { vps_video_parameter_set_id = 0; vps_max_sub_layers = 0; vps_temporal_id_nesting_flag = false; vps_num_hrd_parameters = 0; delete[] m_hrdParameters; m_hrdParameters = 0; delete[] hrd_layer_set_idx; hrd_layer_set_idx = 0; delete[] cprms_present_flag; cprms_present_flag = 0; for (int i = 0; i < MAX_TEMPORAL_LAYER; i++) { vps_num_reorder_pics[i] = 0; vps_max_dec_pic_buffering[i] = 0; vps_max_latency_increase[i] = 0; } } int32_t GetID() const { return vps_video_parameter_set_id; } H265HRD* getHrdParameters ( unsigned i ) { return &m_hrdParameters[ i ]; } H265ProfileTierLevel* getPTL() { return &m_pcPTL; } H265TimingInfo* getTimingInfo() { return &m_timingInfo; } const H265TimingInfo* getTimingInfo() const { return &m_timingInfo; } }; typedef uint32_t IntraType; // RPS data structure struct ReferencePictureSet { uint8_t inter_ref_pic_set_prediction_flag; uint32_t num_negative_pics; uint32_t num_positive_pics; uint32_t num_pics; uint32_t num_lt_pics; uint32_t num_long_term_pics; uint32_t num_long_term_sps; int32_t m_DeltaPOC[MAX_NUM_REF_PICS]; int32_t m_POC[MAX_NUM_REF_PICS]; uint8_t used_by_curr_pic_flag[MAX_NUM_REF_PICS]; uint8_t delta_poc_msb_present_flag[MAX_NUM_REF_PICS]; uint8_t delta_poc_msb_cycle_lt[MAX_NUM_REF_PICS]; int32_t poc_lbs_lt[MAX_NUM_REF_PICS]; ReferencePictureSet(); void sortDeltaPOC(); void setInterRPSPrediction(bool f) { inter_ref_pic_set_prediction_flag = f; } uint32_t getNumberOfPictures() const { return num_pics; } uint32_t getNumberOfNegativePictures() const { return num_negative_pics; } uint32_t getNumberOfPositivePictures() const { return num_positive_pics; } uint32_t getNumberOfLongtermPictures() const { return num_lt_pics; } void setNumberOfLongtermPictures(uint32_t val) { num_lt_pics = val; } int getDeltaPOC(int index) const { return m_DeltaPOC[index]; } void setDeltaPOC(int index, int val) { m_DeltaPOC[index] = val; } uint8_t getUsed(int index) const { return used_by_curr_pic_flag[index]; } void setPOC(int bufferNum, int POC) { m_POC[bufferNum] = POC; } int getPOC(int index) const { return m_POC[index]; } uint8_t getCheckLTMSBPresent(int32_t bufferNum) const { return delta_poc_msb_present_flag[bufferNum]; } uint32_t getNumberOfUsedPictures() const; }; // Reference picture list data structure struct ReferencePictureSetList { unsigned m_NumberOfReferencePictureSets; ReferencePictureSetList(); void allocate(unsigned NumberOfEntries); ReferencePictureSet* getReferencePictureSet(int index) const { return &referencePictureSet[index]; } unsigned getNumberOfReferencePictureSets() const { return m_NumberOfReferencePictureSets; } private: mutable std::vector referencePictureSet; }; // Reference picture list data structure struct RefPicListModification { uint32_t ref_pic_list_modification_flag_l0; uint32_t ref_pic_list_modification_flag_l1; uint32_t list_entry_l0[MAX_NUM_REF_PICS + 1]; uint32_t list_entry_l1[MAX_NUM_REF_PICS + 1]; }; // Sequence parameter set structure, corresponding to the HEVC bitstream definition. struct H265SeqParamSetBase { // bitstream params int32_t sps_video_parameter_set_id; uint32_t sps_max_sub_layers; uint8_t sps_temporal_id_nesting_flag; H265ProfileTierLevel m_pcPTL; uint8_t sps_seq_parameter_set_id; uint8_t chroma_format_idc; uint8_t separate_colour_plane_flag; uint32_t pic_width_in_luma_samples; uint32_t pic_height_in_luma_samples; // cropping params uint8_t conformance_window_flag; uint32_t conf_win_left_offset; uint32_t conf_win_right_offset; uint32_t conf_win_top_offset; uint32_t conf_win_bottom_offset; uint32_t bit_depth_luma; uint32_t bit_depth_chroma; uint32_t log2_max_pic_order_cnt_lsb; uint8_t sps_sub_layer_ordering_info_present_flag; uint32_t sps_max_dec_pic_buffering[MAX_TEMPORAL_LAYER]; uint32_t sps_max_num_reorder_pics[MAX_TEMPORAL_LAYER]; uint32_t sps_max_latency_increase[MAX_TEMPORAL_LAYER]; uint32_t log2_min_luma_coding_block_size; uint32_t log2_max_luma_coding_block_size; uint32_t log2_min_transform_block_size; uint32_t log2_max_transform_block_size; uint32_t max_transform_hierarchy_depth_inter; uint32_t max_transform_hierarchy_depth_intra; uint8_t scaling_list_enabled_flag; uint8_t sps_scaling_list_data_present_flag; uint8_t amp_enabled_flag; uint8_t sample_adaptive_offset_enabled_flag; uint8_t pcm_enabled_flag; // pcm params uint32_t pcm_sample_bit_depth_luma; uint32_t pcm_sample_bit_depth_chroma; uint32_t log2_min_pcm_luma_coding_block_size; uint32_t log2_max_pcm_luma_coding_block_size; uint8_t pcm_loop_filter_disabled_flag; uint32_t num_short_term_ref_pic_sets; ReferencePictureSetList m_RPSList; uint8_t long_term_ref_pics_present_flag; uint32_t num_long_term_ref_pics_sps; uint32_t lt_ref_pic_poc_lsb_sps[33]; uint8_t used_by_curr_pic_lt_sps_flag[33]; uint8_t sps_temporal_mvp_enabled_flag; uint8_t sps_strong_intra_smoothing_enabled_flag; // vui part uint8_t vui_parameters_present_flag; // Zero indicates default VUI parameters uint8_t aspect_ratio_info_present_flag; uint32_t aspect_ratio_idc; uint32_t sar_width; uint32_t sar_height; uint8_t overscan_info_present_flag; uint8_t overscan_appropriate_flag; uint8_t video_signal_type_present_flag; uint32_t video_format; uint8_t video_full_range_flag; uint8_t colour_description_present_flag; uint32_t colour_primaries; uint32_t transfer_characteristics; uint32_t matrix_coeffs; uint8_t chroma_loc_info_present_flag; uint32_t chroma_sample_loc_type_top_field; uint32_t chroma_sample_loc_type_bottom_field; uint8_t neutral_chroma_indication_flag; uint8_t field_seq_flag; uint8_t frame_field_info_present_flag; uint8_t default_display_window_flag; uint32_t def_disp_win_left_offset; uint32_t def_disp_win_right_offset; uint32_t def_disp_win_top_offset; uint32_t def_disp_win_bottom_offset; uint8_t vui_timing_info_present_flag; H265TimingInfo m_timingInfo; uint8_t vui_hrd_parameters_present_flag; H265HRD m_hrdParameters; uint8_t bitstream_restriction_flag; uint8_t tiles_fixed_structure_flag; uint8_t motion_vectors_over_pic_boundaries_flag; uint8_t restricted_ref_pic_lists_flag; uint32_t min_spatial_segmentation_idc; uint32_t max_bytes_per_pic_denom; uint32_t max_bits_per_min_cu_denom; uint32_t log2_max_mv_length_horizontal; uint32_t log2_max_mv_length_vertical; // sps extension uint8_t sps_range_extension_flag; uint8_t sps_scc_extension_flag; //range extention uint8_t transform_skip_rotation_enabled_flag; uint8_t transform_skip_context_enabled_flag; uint8_t implicit_residual_dpcm_enabled_flag; uint8_t explicit_residual_dpcm_enabled_flag; uint8_t extended_precision_processing_flag; uint8_t intra_smoothing_disabled_flag; uint8_t high_precision_offsets_enabled_flag; uint8_t fast_rice_adaptation_enabled_flag; uint8_t cabac_bypass_alignment_enabled_flag; //scc extention uint8_t sps_curr_pic_ref_enabled_flag; uint8_t palette_mode_enabled_flag; uint32_t palette_max_size; uint32_t delta_palette_max_predictor_size; uint8_t sps_palette_predictor_initializer_present_flag; uint32_t sps_num_palette_predictor_initializer; uint32_t motion_vector_resolution_control_idc; uint8_t intra_boundary_filtering_disabled_flag; /////////////////////////////////////////////////////// // calculated params // These fields are calculated from values above. They are not written to the bitstream /////////////////////////////////////////////////////// uint32_t MaxCUSize; uint32_t MaxCUDepth; uint32_t MinCUSize; int32_t AddCUDepth; uint32_t WidthInCU; uint32_t HeightInCU; uint32_t NumPartitionsInCU, NumPartitionsInCUSize, NumPartitionsInFrameWidth; uint32_t m_maxTrSize; int32_t m_AMPAcc[MAX_CU_DEPTH]; //AMP Accuracy int m_QPBDOffsetY; int m_QPBDOffsetC; uint32_t ChromaArrayType; uint32_t chromaShiftW; uint32_t chromaShiftH; uint32_t need16bitOutput; void Reset() { H265SeqParamSetBase sps = {}; *this = sps; } }; // H265SeqParamSetBase // Sequence parameter set structure, corresponding to the HEVC bitstream definition. struct H265SeqParamSet : public HeapObject, public H265SeqParamSetBase { H265ScalingList m_scalingList; std::vector m_paletteInitializers; bool m_changed; H265SeqParamSet() : HeapObject() , H265SeqParamSetBase() { Reset(); } ~H265SeqParamSet() {} int32_t GetID() const { return sps_seq_parameter_set_id; } virtual void Reset() { H265SeqParamSetBase::Reset(); m_RPSList.m_NumberOfReferencePictureSets = 0; m_paletteInitializers.clear(); sps_video_parameter_set_id = MAX_NUM_VPS_PARAM_SETS_H265; sps_seq_parameter_set_id = MAX_NUM_SEQ_PARAM_SETS_H265; // set some parameters by default video_format = 5; // unspecified video_full_range_flag = 0; colour_primaries = 2; // unspecified transfer_characteristics = 2; // unspecified matrix_coeffs = 2; // unspecified conformance_window_flag = 0; conf_win_left_offset = 0; conf_win_right_offset = 0; conf_win_top_offset = 0; conf_win_bottom_offset = 0; m_scalingList.destroy(); m_changed = false; } int SubWidthC() const { static int32_t subWidth[] = {1, 2, 2, 1}; assert (chroma_format_idc >= 0 && chroma_format_idc <= 4); return subWidth[chroma_format_idc]; } int SubHeightC() const { static int32_t subHeight[] = {1, 2, 1, 1}; assert (chroma_format_idc >= 0 && chroma_format_idc <= 4); return subHeight[chroma_format_idc]; } int getQpBDOffsetY() const { return m_QPBDOffsetY; } void setQpBDOffsetY(int val) { m_QPBDOffsetY = val; } int getQpBDOffsetC() const { return m_QPBDOffsetC; } void setQpBDOffsetC(int val) { m_QPBDOffsetC = val; } void createRPSList(int32_t numRPS) { m_RPSList.allocate(numRPS); } H265ScalingList* getScalingList() { return &m_scalingList; } H265ScalingList* getScalingList() const { return const_cast(&m_scalingList); } ReferencePictureSetList *getRPSList() { return &m_RPSList; } const ReferencePictureSetList *getRPSList() const { return &m_RPSList; } H265ProfileTierLevel* getPTL() { return &m_pcPTL; } const H265ProfileTierLevel* getPTL() const { return &m_pcPTL; } H265HRD* getHrdParameters () { return &m_hrdParameters; } const H265TimingInfo* getTimingInfo() const { return &m_timingInfo; } H265TimingInfo* getTimingInfo() { return &m_timingInfo; } }; // H265SeqParamSet // Tiles description struct TileInfo { int32_t firstCUAddr; int32_t endCUAddr; int32_t width; }; // Picture parameter set structure, corresponding to the HEVC bitstream definition. struct H265PicParamSetBase { uint32_t pps_pic_parameter_set_id; uint32_t pps_seq_parameter_set_id; uint8_t dependent_slice_segments_enabled_flag; uint8_t output_flag_present_flag; uint32_t num_extra_slice_header_bits; uint8_t sign_data_hiding_enabled_flag; uint8_t cabac_init_present_flag; uint32_t num_ref_idx_l0_default_active; uint32_t num_ref_idx_l1_default_active; int8_t init_qp; // default QP for I,P,B slices uint8_t constrained_intra_pred_flag; uint8_t transform_skip_enabled_flag; uint8_t cu_qp_delta_enabled_flag; uint32_t diff_cu_qp_delta_depth; int32_t pps_cb_qp_offset; int32_t pps_cr_qp_offset; uint8_t pps_slice_chroma_qp_offsets_present_flag; uint8_t weighted_pred_flag; // Nonzero indicates weighted prediction applied to P and SP slices uint8_t weighted_bipred_flag; // 0: no weighted prediction in B slices, 1: explicit weighted prediction uint8_t transquant_bypass_enabled_flag; uint8_t tiles_enabled_flag; uint8_t entropy_coding_sync_enabled_flag; // presence of wavefronts flag // tiles info uint32_t num_tile_columns; uint32_t num_tile_rows; uint32_t uniform_spacing_flag; std::vector column_width; std::vector row_height; uint8_t loop_filter_across_tiles_enabled_flag; uint8_t pps_loop_filter_across_slices_enabled_flag; uint8_t deblocking_filter_control_present_flag; uint8_t deblocking_filter_override_enabled_flag; uint8_t pps_deblocking_filter_disabled_flag; int32_t pps_beta_offset; int32_t pps_tc_offset; uint8_t pps_scaling_list_data_present_flag; uint8_t lists_modification_present_flag; uint32_t log2_parallel_merge_level; uint8_t slice_segment_header_extension_present_flag; // pps extension uint8_t pps_range_extensions_flag; uint8_t pps_scc_extension_flag; // pps range extension uint32_t log2_max_transform_skip_block_size_minus2; uint8_t cross_component_prediction_enabled_flag; uint8_t chroma_qp_offset_list_enabled_flag; uint32_t diff_cu_chroma_qp_offset_depth; uint32_t chroma_qp_offset_list_len; int32_t cb_qp_offset_list[MAX_CHROMA_OFFSET_ELEMENTS]; int32_t cr_qp_offset_list[MAX_CHROMA_OFFSET_ELEMENTS]; uint32_t log2_sao_offset_scale_luma; uint32_t log2_sao_offset_scale_chroma; // scc extension uint8_t pps_curr_pic_ref_enabled_flag; uint8_t residual_adaptive_colour_transform_enabled_flag; uint8_t pps_slice_act_qp_offsets_present_flag; int32_t pps_act_y_qp_offset; int32_t pps_act_cb_qp_offset; int32_t pps_act_cr_qp_offset; uint8_t pps_palette_predictor_initializer_present_flag; uint32_t pps_num_palette_predictor_initializer; uint8_t monochrome_palette_flag; uint32_t luma_bit_depth_entry; uint32_t chroma_bit_depth_entry; /////////////////////////////////////////////////////// // calculated params // These fields are calculated from values above. They are not written to the bitstream /////////////////////////////////////////////////////// uint32_t getColumnWidth(uint32_t columnIdx) { return column_width[columnIdx]; } uint32_t getRowHeight(uint32_t rowIdx) { return row_height[rowIdx]; } std::vector m_CtbAddrRStoTS; std::vector m_CtbAddrTStoRS; std::vector m_TileIdx; void Reset() { H265PicParamSetBase pps = {}; *this = pps; } }; // H265PicParamSetBase // Picture parameter set structure, corresponding to the H.264 bitstream definition. struct H265PicParamSet : public HeapObject, public H265PicParamSetBase { H265ScalingList m_scalingList; std::vector tilesInfo; std::vector m_paletteInitializers; bool m_changed; H265PicParamSet() : H265PicParamSetBase() { Reset(); } void Reset() { column_width.clear(); row_height.clear(); m_CtbAddrRStoTS.clear(); m_CtbAddrTStoRS.clear(); m_TileIdx.clear(); H265PicParamSetBase::Reset(); tilesInfo.clear(); m_paletteInitializers.clear(); m_scalingList.destroy(); pps_pic_parameter_set_id = MAX_NUM_PIC_PARAM_SETS_H265; pps_seq_parameter_set_id = MAX_NUM_SEQ_PARAM_SETS_H265; loop_filter_across_tiles_enabled_flag = true; pps_loop_filter_across_slices_enabled_flag = true; m_changed = false; } ~H265PicParamSet() { } int32_t GetID() const { return pps_pic_parameter_set_id; } uint32_t getNumTiles() const { return num_tile_rows*num_tile_columns; } H265ScalingList* getScalingList() { return &m_scalingList; } H265ScalingList* getScalingList() const { return const_cast(&m_scalingList); } }; // H265PicParamSet // Explicit weighted prediction parameters parsed in slice header, // or Implicit weighted prediction parameters (8 bits depth values). typedef struct { uint8_t present_flag; uint32_t log2_weight_denom; int32_t weight; int32_t offset; int32_t delta_weight; // for HW decoder } wpScalingParam; #define DEFAULT_MAX_ENETRY_POINT_NUM 512 #define DEFAULT_MAX_PREVENTION_BYTES 300 #define DEAFULT_MAX_SLICE_HEADER_SIZE 512 // Slice header structure, corresponding to the HEVC bitstream definition. struct H265SliceHeader { // from nal unit header NalUnitType nal_unit_type; uint32_t nuh_temporal_id; // slice spec members int32_t first_slice_segment_in_pic_flag; uint8_t no_output_of_prior_pics_flag; // nonzero: remove previously decoded pictures from decoded picture buffer uint16_t slice_pic_parameter_set_id; uint8_t dependent_slice_segment_flag; uint32_t slice_segment_address; SliceType slice_type; uint8_t pic_output_flag; uint32_t colour_plane_id; // if separate_colour_plane_flag = = 1 only int32_t slice_pic_order_cnt_lsb; // picture order count (mod MaxPicOrderCntLsb) uint8_t short_term_ref_pic_set_sps_flag; uint8_t slice_temporal_mvp_enabled_flag; uint8_t slice_sao_luma_flag; uint8_t slice_sao_chroma_flag; uint8_t num_ref_idx_active_override_flag; int32_t num_ref_idx_l0_active; int32_t num_ref_idx_l1_active; uint8_t mvd_l1_zero_flag; uint8_t cabac_init_flag; uint32_t collocated_from_l0_flag; uint32_t collocated_ref_idx; // pred_weight params uint32_t luma_log2_weight_denom; uint32_t chroma_log2_weight_denom; wpScalingParam pred_weight_table[2][MAX_NUM_REF_PICS][3]; // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V] int32_t max_num_merge_cand; uint8_t use_integer_mv_flag; int32_t slice_qp_delta; // to calculate default slice QP int32_t slice_cb_qp_offset; int32_t slice_cr_qp_offset; int32_t slice_act_y_qp_offset; int32_t slice_act_cb_qp_offset; int32_t slice_act_cr_qp_offset; uint8_t cu_chroma_qp_offset_enabled_flag; uint8_t deblocking_filter_override_flag; uint8_t slice_deblocking_filter_disabled_flag; int32_t slice_beta_offset; int32_t slice_tc_offset; uint8_t slice_loop_filter_across_slices_enabled_flag; uint32_t num_entry_point_offsets; /////////////////////////////////////////////////////// // calculated params // These fields are calculated from values above. They are not written to the bitstream /////////////////////////////////////////////////////// uint32_t m_HeaderBitstreamOffset; //h265 elements of slice header ---------------------------------------------------------------------------------------------------------------- const H265SeqParamSet* m_SeqParamSet; const H265PicParamSet* m_PicParamSet; uint32_t m_sliceSegmentCurStartCUAddr; uint32_t m_sliceSegmentCurEndCUAddr; int32_t SliceQP; int32_t SliceCurStartCUAddr; bool m_CheckLDC; int32_t m_numRefIdx[3]; // for multiple reference of current slice. IT SEEMS BE SAME AS num_ref_idx_l0_active, l1, lc ReferencePictureSet m_rps; RefPicListModification m_RefPicListModification; int32_t m_poc; uint32_t m_numPicStCurr0; uint32_t m_numPicStCurr1; uint32_t m_numPicLtCurr; int32_t m_RpsPOCCurrList0[MAX_NUM_REF_PICS + 1]; int32_t m_RefPOCList[2][MAX_NUM_REF_PICS + 1]; // flag equal 1 means that the slice belong to IDR or anchor access unit uint32_t IdrPicFlag; int32_t wNumBitsForShortTermRPSInSlice; // used in h/w decoder }; // H265SliceHeader // SEI data storage struct H265SEIPayLoadBase { SEI_TYPE payLoadType; uint32_t payLoadSize; union SEIMessages { struct PicTiming { DisplayPictureStruct_H265 pic_struct; uint32_t pic_dpb_output_delay; } pic_timing; struct RecoveryPoint { int32_t recovery_poc_cnt; uint8_t exact_match_flag; uint8_t broken_link_flag; }recovery_point; struct MasteringDisplay { uint16_t display_primaries[3][2]; uint16_t white_point[2]; uint32_t max_luminance; uint32_t min_luminance; }mastering_display; struct ContentLightLevelInfo { uint16_t max_content_light_level; uint16_t max_pic_average_light_level; }content_light_level_info; }SEI_messages; void Reset() { memset(this, 0, sizeof(H265SEIPayLoadBase)); payLoadType = SEI_RESERVED; payLoadSize = 0; } }; // SEI heap object struct H265SEIPayLoad : public HeapObject, public H265SEIPayLoadBase { std::vector user_data; // for UserDataRegistered or UserDataUnRegistered H265SEIPayLoad() : H265SEIPayLoadBase() { } virtual void Reset() { H265SEIPayLoadBase::Reset(); user_data.clear(); } int32_t GetID() const { return payLoadType; } }; // POC container class PocDecoding { public: int32_t prevPocPicOrderCntLsb; int32_t prevPicOrderCntMsb; PocDecoding() : prevPocPicOrderCntLsb(0) , prevPicOrderCntMsb(0) { } void Reset() { prevPocPicOrderCntLsb = 0; prevPicOrderCntMsb = 0; } }; // Error exception class h265_exception { public: h265_exception(int32_t status = -1) : m_Status(status) { } virtual ~h265_exception() { } int32_t GetStatus() const { return m_Status; } private: int32_t m_Status; }; // Allocate an array or throw exception template inline T * h265_new_array_throw(int32_t size) { T * t = new T[size]; if (!t) throw h265_exception(UMC::UMC_ERR_ALLOC); return t; } enum { CHROMA_FORMAT_400 = 0, CHROMA_FORMAT_420 = 1, CHROMA_FORMAT_422 = 2, CHROMA_FORMAT_444 = 3 }; // Color format constants conversion inline UMC::ColorFormat GetUMCColorFormat_H265(int32_t color_format) { UMC::ColorFormat format; switch(color_format) { case CHROMA_FORMAT_400: format = UMC::GRAY; break; case CHROMA_FORMAT_422: format = UMC::YUV422; break; case CHROMA_FORMAT_444: format = UMC::YUV444; break; case CHROMA_FORMAT_420: default: format = UMC::YUV420; break; } return format; } // Color format constants conversion inline int32_t GetH265ColorFormat(UMC::ColorFormat color_format) { int32_t format; switch(color_format) { case UMC::GRAY: case UMC::GRAYA: format = CHROMA_FORMAT_400; break; case UMC::YUV422A: case UMC::YUV422: format = CHROMA_FORMAT_422; break; case UMC::YUV444: case UMC::YUV444A: format = CHROMA_FORMAT_444; break; case UMC::YUV420: case UMC::YUV420A: case UMC::NV12: case UMC::YV12: default: format = CHROMA_FORMAT_420; break; } return format; } // Calculate maximum allowed bitstream NAL unit size based on picture resolution inline size_t CalculateSuggestedSize(const H265SeqParamSet * sps) { size_t base_size = sps->pic_width_in_luma_samples * sps->pic_height_in_luma_samples; size_t size = 0; switch (sps->chroma_format_idc) { case 0: // YUV400 size = base_size; break; case 1: // YUV420 size = (base_size * 3) / 2; break; case 2: // YUV422 size = base_size + base_size; break; case 3: // YUV444 size = base_size + base_size + base_size; break; }; return 2*size; } } // end namespace UMC_HEVC_DECODER #endif // H265_GLOBAL_ROM_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_frame.h000066400000000000000000000230141443134507600316410ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_FRAME_H__ #define __UMC_H265_FRAME_H__ #include #include "umc_h265_yuv.h" #include "umc_h265_notify.h" #include "umc_h265_heap.h" namespace UMC_HEVC_DECODER { class H265Slice; class H265DecoderFrameInfo; class H265CodingUnit; // Struct containing list 0 and list 1 reference picture lists for one slice. // Length is plus 1 to provide for null termination. class H265DecoderRefPicList { public: struct ReferenceInformation // flags use for reference frames of slice { H265DecoderFrame * refFrame; bool isLongReference; }; ReferenceInformation *m_refPicList; H265DecoderRefPicList() { memset(m_refPicList1, 0, sizeof(m_refPicList1)); m_refPicList = &(m_refPicList1[1]); m_refPicList1[0].refFrame = 0; m_refPicList1[0].isLongReference = 0; } void Reset() { memset(&m_refPicList1, 0, sizeof(m_refPicList1)); } H265DecoderRefPicList (const H265DecoderRefPicList& copy) { m_refPicList = &(m_refPicList1[1]); MFX_INTERNAL_CPY(&m_refPicList1, ©.m_refPicList1, sizeof(m_refPicList1)); } H265DecoderRefPicList& operator=(const H265DecoderRefPicList & copy) { MFX_INTERNAL_CPY(&m_refPicList1, ©.m_refPicList1, sizeof(m_refPicList1)); return *this; } private: ReferenceInformation m_refPicList1[MAX_NUM_REF_PICS + 3]; }; // HEVC decoder frame class class H265DecoderFrame : public H265DecYUVBufferPadded, public RefCounter { public: int32_t m_PicOrderCnt; // Display order picture count mod MAX_PIC_ORDER_CNT. int32_t m_frameOrder; int32_t m_ErrorType; bool prepared; H265DecoderFrameInfo * GetAU() const { return m_pSlicesInfo; } H265DecoderFrame *m_pPreviousFrame; H265DecoderFrame *m_pFutureFrame; H265SEIPayLoad m_UserData; H265SEIPayLoad m_mastering_display; H265SEIPayLoad m_content_light_level_info; double m_dFrameTime; bool m_isOriginalPTS; DisplayPictureStruct_H265 m_DisplayPictureStruct_H265; // For type 1 calculation of m_PicOrderCnt. m_FrameNum is needed to // be used as previous frame num. bool post_procces_complete; int32_t m_index; int32_t m_UID; UMC::FrameType m_FrameType; UMC::MemID m_MemID; int32_t m_RefPicListResetCount; int32_t m_crop_left; int32_t m_crop_right; int32_t m_crop_top; int32_t m_crop_bottom; int32_t m_crop_flag; int32_t m_aspect_width; int32_t m_aspect_height; bool m_pic_output; bool m_isShortTermRef; bool m_isLongTermRef; bool m_isUsedAsReference; // Returns whether frame has all slices found bool IsFullFrame() const; // Set frame flag denoting that all slices for it were found void SetFullFrame(bool isFull); struct { uint8_t isFull : 1; uint8_t isDecoded : 1; uint8_t isDecodingStarted : 1; uint8_t isDecodingCompleted : 1; } m_Flags; uint8_t m_isDisplayable; uint8_t m_wasDisplayed; uint8_t m_wasOutputted; int32_t m_maxUIDWhenWasDisplayed; typedef std::list ReferenceList; ReferenceList m_references; // Add target frame to the list of reference frames void AddReferenceFrame(H265DecoderFrame * frm); // Clear all references to other frames void FreeReferenceFrames(); // Reinitialize frame structure before reusing frame void Reset(); // Clean up data after decoding is done void FreeResources(); // Accelerator for getting 'surface Index' FrameMID inline int32_t GetFrameMID() const { return m_frameData.GetFrameMID(); } public: // Delete unneeded references and set flags after decoding is done void OnDecodingCompleted(); // Free resources if possible virtual void Free(); // Returns whether frame has been decoded bool IsDecoded() const; H265DecoderFrame(UMC::MemoryAllocator *pMemoryAllocator, Heap_Objects * pObjHeap); virtual ~H265DecoderFrame(); // The following methods provide access to the HEVC Decoder's doubly // linked list of H265DecoderFrames. Note that m_pPreviousFrame can // be non-NULL even for an I frame. H265DecoderFrame *future() const { return m_pFutureFrame; } void setPrevious(H265DecoderFrame *pPrev) { m_pPreviousFrame = pPrev; } void setFuture(H265DecoderFrame *pFut) { m_pFutureFrame = pFut; } bool isDisplayable() const { return m_isDisplayable != 0; } void SetisDisplayable(bool isDisplayable) { m_isDisplayable = isDisplayable ? 1 : 0; } bool IsDecodingStarted() const { return m_Flags.isDecodingStarted != 0;} void StartDecoding() { m_Flags.isDecodingStarted = 1;} bool IsDecodingCompleted() const { return m_Flags.isDecodingCompleted != 0;} // Flag frame as completely decoded void CompleteDecoding(); // Check reference frames for error status and flag this frame if error is found void UpdateErrorWithRefFrameStatus(); bool wasDisplayed() const { return m_wasDisplayed != 0; } void setWasDisplayed() { m_wasDisplayed = 1; } bool wasOutputted() const { return m_wasOutputted != 0; } void setWasOutputted(); // Flag frame after it was output bool isDisposable() const { return (!m_isShortTermRef && !m_isLongTermRef && ((m_wasOutputted != 0 && m_wasDisplayed != 0) || (m_isDisplayable == 0)) && !GetRefCounter()); } bool isShortTermRef() const { return m_isShortTermRef; } // Mark frame as short term reference frame void SetisShortTermRef(bool isRef); int32_t PicOrderCnt() const { return m_PicOrderCnt; } void setPicOrderCnt(int32_t PicOrderCnt) { m_PicOrderCnt = PicOrderCnt; } bool isLongTermRef() const { return m_isLongTermRef; } // Mark frame as long term reference frame void SetisLongTermRef(bool isRef); void IncreaseRefPicListResetCount() { m_RefPicListResetCount++; } void InitRefPicListResetCount() { m_RefPicListResetCount = 0; } int32_t RefPicListResetCount() const { return m_RefPicListResetCount; } // GetRefPicList // Returns pointer to start of specified ref pic list. H265_FORCEINLINE const H265DecoderRefPicList* GetRefPicList(int32_t sliceNumber, int32_t list) const { assert(list <= REF_PIC_LIST_1 && list >= 0); if (sliceNumber >= (int32_t)m_refPicList.size()) { return 0; } return &m_refPicList[sliceNumber].m_refPicList[list]; } int32_t GetError() const { return m_ErrorType; } void SetError(int32_t errorType) { m_ErrorType = errorType; } void SetErrorFlagged(int32_t errorType) { m_ErrorType |= errorType; } void AddSlice(H265Slice * pSlice); protected: H265DecoderFrameInfo * m_pSlicesInfo; // Declare memory management tools UMC::MemoryAllocator *m_pMemoryAllocator; // should be removed because it duplicated in base class Heap_Objects * m_pObjHeap; struct H265DecoderRefPicListPair { public: H265DecoderRefPicList m_refPicList[2]; }; // ML: OPT: std::vector<> results with relatively slow access code std::vector m_refPicList; class FakeFrameInitializer { public: FakeFrameInitializer(); }; static FakeFrameInitializer g_FakeFrameInitializer; bool CheckReferenceFrameError(); }; // Returns if frame is not needed by decoder inline bool isAlmostDisposable(H265DecoderFrame * pTmp) { return (!pTmp->m_isShortTermRef && !pTmp->m_isLongTermRef && ((pTmp->m_wasOutputted != 0) || (pTmp->m_isDisplayable == 0)) && !pTmp->GetRefCounter()); } // Returns if frame is not needed by decoder inline bool isInDisplayngStage(H265DecoderFrame * pTmp) { return (pTmp->m_isDisplayable && pTmp->m_wasOutputted && !pTmp->m_wasDisplayed); } } // end namespace UMC_HEVC_DECODER #endif // __UMC_H265_FRAME_H__ #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_frame_info.h000066400000000000000000000136151443134507600326620ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_FRAME_INFO_H #define __UMC_H265_FRAME_INFO_H #include #include "umc_h265_frame.h" #include "umc_h265_slice_decoding.h" namespace UMC_HEVC_DECODER { class H265DecoderFrame; // Collection of slices that constitute one decoder frame class H265DecoderFrameInfo { public: enum FillnessStatus { STATUS_NONE, STATUS_NOT_FILLED, STATUS_FILLED, STATUS_COMPLETED, STATUS_STARTED }; H265DecoderFrameInfo(H265DecoderFrame * pFrame) : m_pFrame(pFrame) , m_prepared(0) , m_sps(0) , m_SliceCount(0) { Reset(); } virtual ~H265DecoderFrameInfo() { } H265Slice *GetAnySlice() const { H265Slice* slice = GetSlice(0); if (!slice) throw h265_exception(UMC::UMC_ERR_FAILED); return slice; } const H265SeqParamSet *GetSeqParam() const { return m_sps; } void AddSlice(H265Slice * pSlice) { m_pSliceQueue.push_back(pSlice); m_SliceCount++; const H265SliceHeader &sliceHeader = *(pSlice->GetSliceHeader()); m_isIntraAU = m_isIntraAU && (sliceHeader.slice_type == I_SLICE); m_IsIDR = sliceHeader.IdrPicFlag != 0; m_frameBeforeIDR = 0; m_hasDependentSliceSegments = m_hasDependentSliceSegments || sliceHeader.dependent_slice_segment_flag; m_isNeedDeblocking = m_isNeedDeblocking || (!sliceHeader.slice_deblocking_filter_disabled_flag); m_isNeedSAO = m_isNeedSAO || (sliceHeader.slice_sao_luma_flag || sliceHeader.slice_sao_chroma_flag); m_hasTiles = pSlice->GetPicParam()->getNumTiles() > 1; m_WA_different_disable_deblocking = m_WA_different_disable_deblocking || (sliceHeader.slice_deblocking_filter_disabled_flag != m_pSliceQueue[0]->GetSliceHeader()->slice_deblocking_filter_disabled_flag); if (!m_sps) { m_sps = (H265SeqParamSet *)pSlice->GetSeqParam(); m_sps->IncrementReference(); } } uint32_t GetSliceCount() const { return m_SliceCount; } H265Slice* GetSlice(int32_t num) const { if (num < 0 || num >= m_SliceCount) return 0; return m_pSliceQueue[num]; } H265Slice* GetSliceByNumber(int32_t num) const { size_t count = m_pSliceQueue.size(); for (uint32_t i = 0; i < count; i++) { if (m_pSliceQueue[i]->GetSliceNum() == num) return m_pSliceQueue[i]; } return 0; } int32_t GetPositionByNumber(int32_t num) const { size_t count = m_pSliceQueue.size(); for (uint32_t i = 0; i < count; i++) { if (m_pSliceQueue[i]->GetSliceNum() == num) return i; } return -1; } void Reset(); void SetStatus(FillnessStatus status) { m_Status = status; } FillnessStatus GetStatus () const { return m_Status; } void Free(); void RemoveSlice(int32_t num); bool IsNeedDeblocking() const { return m_isNeedDeblocking; } bool IsNeedSAO() const { return m_isNeedSAO; } bool IsCompleted() const; bool IsIntraAU() const { return m_isIntraAU; } bool IsReference() const { return m_pFrame->m_isUsedAsReference; } bool HasDependentSliceSegments() const { return m_hasDependentSliceSegments; } bool IsNeedWorkAroundForDeblocking() const { return m_WA_different_disable_deblocking; } // Initialize tiles and slices threading information void FillTileInfo(); // reorder slices and set maxCUAddr void EliminateASO(); // Remove corrupted slices void EliminateErrors(); H265DecoderFrameInfo * GetNextAU() const {return m_nextAU;} H265DecoderFrameInfo * GetPrevAU() const {return m_prevAU;} H265DecoderFrameInfo * GetRefAU() const {return m_refAU;} void SetNextAU(H265DecoderFrameInfo *au) {m_nextAU = au;} void SetPrevAU(H265DecoderFrameInfo *au) {m_prevAU = au;} void SetRefAU(H265DecoderFrameInfo *au) {m_refAU = au;} bool m_hasTiles; H265DecoderFrame * m_pFrame; int32_t m_prepared; bool m_IsIDR; uint32_t m_frameBeforeIDR; private: FillnessStatus m_Status; H265SeqParamSet * m_sps; std::vector m_pSliceQueue; int32_t m_SliceCount; bool m_isNeedDeblocking; bool m_isNeedSAO; bool m_isIntraAU; bool m_hasDependentSliceSegments; bool m_WA_different_disable_deblocking; H265DecoderFrameInfo *m_nextAU; H265DecoderFrameInfo *m_prevAU; H265DecoderFrameInfo *m_refAU; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_FRAME_INFO_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_frame_list.h000066400000000000000000000107441443134507600327020ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_FRAME_LIST_H__ #define __UMC_H265_FRAME_LIST_H__ #include "umc_h265_frame.h" namespace UMC_HEVC_DECODER { class H265DecoderFrameList { public: // Default constructor H265DecoderFrameList(void); // Destructor virtual ~H265DecoderFrameList(void); H265DecoderFrame *head() { return m_pHead; } H265DecoderFrame *tail() { return m_pTail; } const H265DecoderFrame *head() const { return m_pHead; } const H265DecoderFrame *tail() const { return m_pTail; } bool isEmpty() { return !m_pHead; } void append(H265DecoderFrame *pFrame); // Append the given frame to our tail int32_t GetFreeIndex() { for(int32_t i = 0; i < 128; i++) { H265DecoderFrame *pFrm; for (pFrm = head(); pFrm && pFrm->m_index != i; pFrm = pFrm->future()) {} if(pFrm == NULL) { return i; } } assert(false); return -1; }; protected: // Release object void Release(void); H265DecoderFrame *m_pHead; // (H265DecoderFrame *) pointer to first frame in list H265DecoderFrame *m_pTail; // (H265DecoderFrame *) pointer to last frame in list }; class H265DBPList : public H265DecoderFrameList { public: H265DBPList(); // Searches DPB for a reusable frame with biggest POC H265DecoderFrame * GetOldestDisposable(); // Returns whether DPB contains frames which may be reused bool IsDisposableExist(); // Returns whether DPB contains frames which may be reused after asynchronous decoding finishes bool IsAlmostDisposableExist(); // Returns first reusable frame in DPB H265DecoderFrame *GetDisposable(void); // Marks all frames as not used as reference frames. void removeAllRef(); // Increase ref pic list reset count except for one frame void IncreaseRefPicListResetCount(H265DecoderFrame *excludeFrame); // Searches DPB for a short term reference frame with specified POC H265DecoderFrame *findShortRefPic(int32_t picPOC); // Searches DPB for a long term reference frame with specified POC H265DecoderFrame *findLongTermRefPic(const H265DecoderFrame *excludeFrame, int32_t picPOC, uint32_t bitsForPOC, bool isUseMask) const; // Returns the number of frames in DPB uint32_t countAllFrames(); // Return number of active short and long term reference frames. void countActiveRefs(uint32_t &numShortTerm, uint32_t &numLongTerm); // Search through the list for the oldest displayable frame. H265DecoderFrame *findOldestDisplayable(int32_t dbpSize); void calculateInfoForDisplay(uint32_t &countDisplayable, uint32_t &countDPBFullness, int32_t &maxUID); // Try to find a frame closest to specified for error recovery H265DecoderFrame * FindClosest(H265DecoderFrame * pFrame); int32_t GetDPBSize() const { return m_dpbSize; } void SetDPBSize(int32_t dpbSize) { m_dpbSize = dpbSize; } // Reset the buffer and reset every single frame of it void Reset(void); // Debug print void DebugPrint(); // Debug print void printDPB(); protected: int32_t m_dpbSize; }; } // end namespace UMC_HEVC_DECODER #endif // __UMC_H265_FRAME_LIST_H__ #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_headers.h000066400000000000000000000115141443134507600321640ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_HEADERS_H #define __UMC_H265_HEADERS_H #include "umc_h265_dec_defs.h" #include "umc_media_data_ex.h" #include "umc_h265_heap.h" namespace UMC_HEVC_DECODER { // Headers container class template class HeaderSet { public: HeaderSet(Heap_Objects *pObjHeap) : m_Header() ,m_pObjHeap(pObjHeap) , m_currentID(-1) { } virtual ~HeaderSet() { Reset(false); } T * AddHeader(T* hdr) { uint32_t id = hdr->GetID(); if (id >= m_Header.size()) { m_Header.resize(id + 1); } m_currentID = id; if (m_Header[id]) { m_Header[id]->DecrementReference(); } T * header = m_pObjHeap->AllocateObject(); *header = *hdr; //ref. counter may not be 0 here since it can be copied from given [hdr] object header->ResetRefCounter(); header->IncrementReference(); m_Header[id] = header; return header; } T * GetHeader(int32_t id) { if ((uint32_t)id >= m_Header.size()) { return 0; } return m_Header[id]; } const T * GetHeader(int32_t id) const { if ((uint32_t)id >= m_Header.size()) { return 0; } return m_Header[id]; } void RemoveHeader(void * hdr) { T * tmp = (T *)hdr; if (!tmp) { assert(false); return; } uint32_t id = tmp->GetID(); if (id >= m_Header.size()) { assert(false); return; } if (!m_Header[id]) { assert(false); return; } assert(m_Header[id] == hdr); m_Header[id]->DecrementReference(); m_Header[id] = 0; } void Reset(bool isPartialReset = false) { if (!isPartialReset) { for (uint32_t i = 0; i < m_Header.size(); i++) { m_pObjHeap->FreeObject(m_Header[i]); } m_Header.clear(); m_currentID = -1; } } void SetCurrentID(int32_t id) { if (GetHeader(id)) m_currentID = id; } int32_t GetCurrentID() const { return m_currentID; } T * GetCurrentHeader() { if (m_currentID == -1) return 0; return GetHeader(m_currentID); } const T * GetCurrentHeader() const { if (m_currentID == -1) return 0; return GetHeader(m_currentID); } private: std::vector m_Header; Heap_Objects *m_pObjHeap; int32_t m_currentID; }; /****************************************************************************************************/ // Headers stuff /****************************************************************************************************/ class Headers { public: Headers(Heap_Objects *pObjHeap) : m_VideoParams(pObjHeap) , m_SeqParams(pObjHeap) , m_PicParams(pObjHeap) , m_SEIParams(pObjHeap) { } void Reset(bool isPartialReset = false) { m_SeqParams.Reset(isPartialReset); m_PicParams.Reset(isPartialReset); m_SEIParams.Reset(isPartialReset); m_VideoParams.Reset(isPartialReset); } HeaderSet m_VideoParams; HeaderSet m_SeqParams; HeaderSet m_PicParams; HeaderSet m_SEIParams; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_HEADERS_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_heap.h000066400000000000000000000227751443134507600315010ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_HEAP_H #define __UMC_H265_HEAP_H #include #include "umc_mutex.h" #include "umc_h265_dec_defs.h" #include "umc_media_data.h" namespace UMC_HEVC_DECODER { // Allocate several arrays inside of one memory buffer uint8_t * CumulativeArraysAllocation(int n, int align, ...); // Free memory allocated by CumulativeArraysAllocation void CumulativeFree(uint8_t * ptr); //*********************************************************************************************/ // Memory buffer container class //*********************************************************************************************/ class MemoryPiece { public: // Default constructor MemoryPiece() { Reset(); } // Destructor ~MemoryPiece() { Release(); } void Release() { if (m_pSourceBuffer) delete[] m_pSourceBuffer; Reset(); } void SetData(UMC::MediaData *out) { Release(); m_pDataPointer = (uint8_t*)out->GetDataPointer(); m_nDataSize = out->GetDataSize(); m_pts = out->GetTime(); } // Allocate memory piece bool Allocate(size_t nSize) { Release(); // allocate little more m_pSourceBuffer = h265_new_array_throw((int32_t)nSize); m_pDataPointer = m_pSourceBuffer; m_nSourceSize = nSize; return true; } // Obtain data pointer uint8_t *GetPointer(){return m_pDataPointer;} size_t GetSize() const {return m_nSourceSize;} size_t GetDataSize() const {return m_nDataSize;} void SetDataSize(size_t dataSize) {m_nDataSize = dataSize;} double GetTime() const {return m_pts;} void SetTime(double pts) {m_pts = pts;} protected: uint8_t *m_pSourceBuffer; // (uint8_t *) pointer to source memory uint8_t *m_pDataPointer; // (uint8_t *) pointer to source memory size_t m_nSourceSize; // (size_t) allocated memory size size_t m_nDataSize; // (size_t) data memory size double m_pts; void Reset() { m_pts = 0; m_pSourceBuffer = 0; m_pDataPointer = 0; m_nSourceSize = 0; m_nDataSize = 0; } }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Item class ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class Heap_Objects; class Item { public: Item(Heap_Objects * heap, void * ptr, size_t size, bool isTyped = false) : m_pNext(0) , m_Ptr(ptr) , m_Size(size) , m_isTyped(isTyped) , m_heap(heap) { } ~Item() { } Item* m_pNext; void * m_Ptr; size_t m_Size; bool m_isTyped; Heap_Objects * m_heap; static Item * Allocate(Heap_Objects * heap, size_t size, bool isTyped = false) { uint8_t * ppp = new uint8_t[size + sizeof(Item)]; if (!ppp) throw h265_exception(UMC::UMC_ERR_ALLOC); Item * item = new (ppp) Item(heap, 0, size, isTyped); item->m_Ptr = (uint8_t*)ppp + sizeof(Item); return item; } static void Free(Item *item) { if (item->m_isTyped) { HeapObject * obj = reinterpret_cast(item->m_Ptr); obj->~HeapObject(); } item->~Item(); delete[] (uint8_t*)item; } }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Collection of heap objects ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class Heap_Objects { public: Heap_Objects() : m_pFirstFree(0) { } virtual ~Heap_Objects() { Release(); } Item * GetItemForAllocation(size_t size, bool typed = false) { UMC::AutomaticUMCMutex guard(m_mGuard); if (!m_pFirstFree) { return 0; } if (m_pFirstFree->m_Size == size && m_pFirstFree->m_isTyped == typed) { Item * ptr = m_pFirstFree; m_pFirstFree = m_pFirstFree->m_pNext; assert(ptr->m_Size == size); return ptr; } Item * temp = m_pFirstFree; while (temp->m_pNext) { if (temp->m_pNext->m_Size == size && temp->m_pNext->m_isTyped == typed) { Item * ptr = temp->m_pNext; temp->m_pNext = temp->m_pNext->m_pNext; return ptr; } temp = temp->m_pNext; } return 0; } void* Allocate(size_t size, bool isTyped = false) { Item * item = GetItemForAllocation(size); if (!item) { item = Item::Allocate(this, size, isTyped); } return item->m_Ptr; } template T* Allocate(size_t size = sizeof(T), bool isTyped = false) { return (T*)Allocate(size, isTyped); } template T* AllocateObject() { Item * item = GetItemForAllocation(sizeof(T), true); if (!item) { void * ptr = Allocate(sizeof(T), true); return new(ptr) T(); } return (T*)(item->m_Ptr); } void FreeObject(void * obj, bool force = false) { Free(obj, force); } void Free(void * obj, bool force = false) { if (!obj) return; UMC::AutomaticUMCMutex guard(m_mGuard); Item * item = (Item *) ((uint8_t*)obj - sizeof(Item)); // check Item * temp = m_pFirstFree; while (temp) { if (temp == item) //was removed yet return; temp = temp->m_pNext; } if (force) { Item::Free(item); return; } else { if (item->m_isTyped) { HeapObject * object = reinterpret_cast(item->m_Ptr); object->Reset(); } } item->m_pNext = m_pFirstFree; m_pFirstFree = item; } void Release() { UMC::AutomaticUMCMutex guard(m_mGuard); while (m_pFirstFree) { Item *pTemp = m_pFirstFree->m_pNext; Item::Free(m_pFirstFree); m_pFirstFree = pTemp; } } private: Item * m_pFirstFree; UMC::Mutex m_mGuard; }; //*********************************************************************************************/ // Memory buffer for storing decoded coefficients //*********************************************************************************************/ class CoeffsBuffer : public HeapObject { public: // Default constructor CoeffsBuffer(void); // Destructor virtual ~CoeffsBuffer(void); // Initialize buffer UMC::Status Init(int32_t numberOfItems, int32_t sizeOfItem); bool IsInputAvailable() const; // Lock input buffer uint8_t* LockInputBuffer(); // Unlock input buffer bool UnLockInputBuffer(size_t size); bool IsOutputAvailable() const; // Lock output buffer bool LockOutputBuffer(uint8_t *& pointer, size_t &size); // Unlock output buffer bool UnLockOutputBuffer(); // Release object void Close(void); // Reset object virtual void Reset(void); virtual void Free(); protected: uint8_t *m_pbAllocatedBuffer; // (uint8_t *) pointer to allocated unaligned buffer size_t m_lAllocatedBufferSize; // (int32_t) size of allocated buffer uint8_t *m_pbBuffer; // (uint8_t *) pointer to allocated buffer size_t m_lBufferSize; // (int32_t) size of using buffer uint8_t *m_pbFree; // (uint8_t *) pointer to free space size_t m_lFreeSize; // (int32_t) size of free space size_t m_lItemSize; // (int32_t) size of output data portion struct BufferInfo { uint8_t * m_pPointer; size_t m_Size; BufferInfo *m_pNext; }; BufferInfo *m_pBuffers; // (Buffer *) queue of filled sample info }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_HEAP_H #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_mfx_supplier.h000066400000000000000000000076151443134507600332160ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_MFX_SUPPLIER_H #define __UMC_H265_MFX_SUPPLIER_H #include "umc_h265_task_supplier.h" #include "umc_media_data_ex.h" #include "umc_h265_task_broker.h" #include "mfxvideo++int.h" class VideoDECODEH265; namespace UMC_HEVC_DECODER { // Container for raw header binary data class RawHeader_H265 { public: RawHeader_H265(); void Reset(); int32_t GetID() const; size_t GetSize() const; uint8_t * GetPointer(); void Resize(int32_t id, size_t newSize); protected: typedef std::vector BufferType; BufferType m_buffer; int32_t m_id; }; // Container for raw SPS and PPS stream headers class RawHeaders_H265 { public: void Reset(); RawHeader_H265 * GetVPS(); RawHeader_H265 * GetSPS(); RawHeader_H265 * GetPPS(); protected: RawHeader_H265 m_vps; RawHeader_H265 m_sps; RawHeader_H265 m_pps; }; /****************************************************************************************************/ // Task supplier which implements MediaSDK decoding API /****************************************************************************************************/ class MFXTaskSupplier_H265 : public TaskSupplier_H265, public RawHeaders_H265 { friend class ::VideoDECODEH265; public: MFXTaskSupplier_H265(); virtual ~MFXTaskSupplier_H265(); // Initialize task supplier virtual UMC::Status Init(UMC::VideoDecoderParams *pInit); using TaskSupplier_H265::Reset; // Check whether all slices for the frame were found virtual void CompleteFrame(H265DecoderFrame * pFrame); // Check whether specified frame has been decoded, and if it was, // whether there is some decoding work left to be done bool CheckDecoding(bool should_additional_check, H265DecoderFrame * decoded); // Set initial video params from application void SetVideoParams(mfxVideoParam * par); // Initialize mfxVideoParam structure based on decoded bitstream header values UMC::Status FillVideoParam(mfxVideoParam *par, bool full); protected: // Decode SEI nal unit virtual UMC::Status DecodeSEI(UMC::MediaDataEx *nalUnit); // Do something in case reference frame is missing virtual void AddFakeReferenceFrame(H265Slice * pSlice); // Decode headers nal unit virtual UMC::Status DecodeHeaders(UMC::MediaDataEx *nalUnit); // Perform decoding task for thread number threadNumber mfxStatus RunThread(mfxU32 threadNumber); mfxVideoParam m_firstVideoParams; private: MFXTaskSupplier_H265 & operator = (MFXTaskSupplier_H265 &) { return *this; } // MFXTaskSupplier_H265 & operator = (MFXTaskSupplier_H265 &) }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_MFX_SUPPLIER_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_mfx_utils.h000066400000000000000000000045261443134507600325700ustar00rootroot00000000000000// Copyright (c) 2017-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_MFX_UTILS_H #define __UMC_H265_MFX_UTILS_H namespace UMC_HEVC_DECODER { // MFX utility API functions namespace MFX_Utility { // Initialize mfxVideoParam structure based on decoded bitstream header values UMC::Status FillVideoParam(const H265VideoParamSet * vps, const H265SeqParamSet * seq, mfxVideoParam *par, bool full); // Returns implementation platform eMFXPlatform GetPlatform_H265(VideoCORE * core, mfxVideoParam * par); // Find bitstream header NAL units, parse them and fill application parameters structure UMC::Status DecodeHeader(TaskSupplier_H265 * supplier, UMC::VideoDecoderParams* params, mfxBitstream *bs, mfxVideoParam *out); // MediaSDK DECODE_Query API function mfxStatus Query_H265(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type); // Validate input parameters bool CheckVideoParam_H265(mfxVideoParam *in, eMFXHWType type); bool IsBugSurfacePoolApplicable(mfxVideoParam * par); // Check HW capabilities bool IsNeedPartialAcceleration_H265(mfxVideoParam * par, eMFXHWType type); }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_MFX_UTILS_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_nal_spl.h000066400000000000000000000104521443134507600322010ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_NAL_SPL_H #define __UMC_H265_NAL_SPL_H #include #include "umc_h265_dec_defs.h" #include "umc_media_data_ex.h" #include "umc_h265_heap.h" namespace UMC_HEVC_DECODER { // Big endian to little endian converter class class SwapperBase { public: virtual ~SwapperBase() {} virtual void SwapMemory(uint8_t *pDestination, size_t &nDstSize, uint8_t *pSource, size_t nSrcSize, std::vector *pRemovedOffsets) = 0; virtual void SwapMemory(MemoryPiece * pMemDst, MemoryPiece * pMemSrc, std::vector *pRemovedOffsets) = 0; }; // NAL unit start code search class class StartCodeIteratorBase { public: StartCodeIteratorBase() : m_pSource(0) , m_nSourceSize(0) , m_pSourceBase(0) , m_nSourceBaseSize(0) , m_suggestedSize(10 * 1024) // Actual size is calculated in CalculateSuggestedSize { } virtual ~StartCodeIteratorBase() { } virtual int32_t Init(UMC::MediaData * pSource) { m_pSourceBase = m_pSource = (uint8_t *) pSource->GetDataPointer(); m_nSourceBaseSize = m_nSourceSize = pSource->GetDataSize(); return 0; } int32_t GetCurrentOffset() { return (int32_t)(m_pSource - m_pSourceBase); } // Set maximum NAL unit size virtual void SetSuggestedSize(size_t size) { if (size > m_suggestedSize) m_suggestedSize = size; } // Returns first NAL unit ID in memory buffer virtual int32_t CheckNalUnitType(UMC::MediaData * pSource) = 0; // Set bitstream pointer to start code address virtual int32_t MoveToStartCode(UMC::MediaData * pSource) = 0; // Set destination bitstream pointer and size to NAL unit virtual int32_t GetNALUnit(UMC::MediaData * pSource, UMC::MediaData * pDst) = 0; virtual void Reset() = 0; protected: uint8_t * m_pSource; size_t m_nSourceSize; uint8_t * m_pSourceBase; size_t m_nSourceBaseSize; size_t m_suggestedSize; }; // NAL unit splitter utility class class NALUnitSplitter_H265 { public: NALUnitSplitter_H265(); virtual ~NALUnitSplitter_H265(); // Initialize splitter with default values virtual void Init(); // Free resources virtual void Release(); // Returns first NAL unit ID in memory buffer virtual int32_t CheckNalUnitType(UMC::MediaData * pSource); // Set bitstream pointer to start code address virtual int32_t MoveToStartCode(UMC::MediaData * pSource); // Set destination bitstream pointer and size to NAL unit virtual UMC::MediaDataEx * GetNalUnits(UMC::MediaData * in); // Reset state virtual void Reset(); // Set maximum NAL unit size virtual void SetSuggestedSize(size_t size) { if (!m_pStartCodeIter) return; m_pStartCodeIter->SetSuggestedSize(size); } SwapperBase * GetSwapper() { return m_pSwapper; } protected: SwapperBase * m_pSwapper; StartCodeIteratorBase * m_pStartCodeIter; UMC::MediaDataEx m_MediaData; UMC::MediaDataEx::_MediaDataEx m_MediaDataEx; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_NAL_SPL_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_notify.h000066400000000000000000000047131443134507600320640ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_NOTIFY_H265 #define __UMC_NOTIFY_H265 #include namespace UMC_HEVC_DECODER { // Abstract notification class class notifier_base { public: notifier_base() : next_(0) , m_isNeedNotification(true) { } virtual ~notifier_base() {} virtual void Notify() = 0; void ClearNotification() { m_isNeedNotification = false; } notifier_base * next_; protected: bool m_isNeedNotification; }; // Destructor callback class template class notifier0 : public notifier_base { public: typedef void (Object::*Function)(); notifier0(Function function) : function_(function) { Reset(0); } notifier0(Object* object, Function function) : function_(function) { Reset(object); } ~notifier0() { Notify(); } void Reset(Object* object) { object_ = object; m_isNeedNotification = !!object_; } // Call callback function void Notify() { if (m_isNeedNotification) { m_isNeedNotification = false; (object_->*function_)(); } } private: Object* object_; Function function_; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_NOTIFY_H265 #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_segment_decoder_base.h000066400000000000000000000041071443134507600346130ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_SEGMENT_DECODER_BASE_H #define __UMC_H265_SEGMENT_DECODER_BASE_H #include "umc_h265_dec_defs.h" namespace UMC_HEVC_DECODER { class H265Task; class TaskBroker_H265; class H265SegmentDecoderBase { public: H265SegmentDecoderBase(TaskBroker_H265 * pTaskBroker) : m_iNumber(0) , m_pTaskBroker(pTaskBroker) { } virtual ~H265SegmentDecoderBase() { } virtual UMC::Status Init(int32_t iNumber) { m_iNumber = iNumber; return UMC::UMC_OK; } // Decode slice's segment virtual UMC::Status ProcessSegment(void) = 0; virtual void RestoreErrorRect(H265Task *) { } protected: int32_t m_iNumber; // (int32_t) ordinal number of decoder TaskBroker_H265 * m_pTaskBroker; }; } // namespace UMC_HEVC_DECODER #endif /* __UMC_H265_SEGMENT_DECODER_BASE_H */ #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_segment_decoder_dxva.h000066400000000000000000000137461443134507600346540ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_SEGMENT_DECODER_DXVA_H #define __UMC_H265_SEGMENT_DECODER_DXVA_H #include "umc_va_base.h" #include #include "umc_h265_segment_decoder_base.h" #include "umc_h265_task_broker.h" #include "umc_h265_va_packer.h" #include "umc_h265_frame_info.h" #include #define UMC_VA_MAX_FRAME_BUFFER 32 //max number of uncompressed buffers #define SECOND_IN_US 1000000 namespace UMC_HEVC_DECODER { class TaskSupplier_H265; class H265_DXVA_SegmentDecoderCommon : public H265SegmentDecoderBase { public: H265_DXVA_SegmentDecoderCommon(TaskSupplier_H265 * pTaskSupplier); UMC::VideoAccelerator *m_va; void SetVideoAccelerator(UMC::VideoAccelerator *va); protected: TaskSupplier_H265 * m_pTaskSupplier; private: H265_DXVA_SegmentDecoderCommon & operator = (H265_DXVA_SegmentDecoderCommon &) { return *this; } }; class H265_DXVA_SegmentDecoder : public H265_DXVA_SegmentDecoderCommon { public: H265_DXVA_SegmentDecoder(TaskSupplier_H265 * pTaskSupplier); ~H265_DXVA_SegmentDecoder(); // Initialize object virtual UMC::Status Init(int32_t iNumber); void PackAllHeaders(H265DecoderFrame * pFrame); virtual UMC::Status ProcessSegment(void); int32_t m_CurrentSliceID; Packer * GetPacker() { return m_Packer.get();} protected: std::unique_ptr m_Packer; private: H265_DXVA_SegmentDecoder & operator = (H265_DXVA_SegmentDecoder &) { return *this; } }; /****************************************************************************************************/ // DXVASupport class implementation /****************************************************************************************************/ template class DXVASupport { public: DXVASupport() : m_va(0) , m_Base(0) { } ~DXVASupport() { } void Init() { m_Base = (BaseClass*)(this); if (!m_va) return; } void StartDecodingFrame(H265DecoderFrame * pFrame) { UMC::Status sts = 0; if (!m_va) return; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H265 decode DDISubmitTask begin"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(++FrameIndex, pFrame->GetFrameMID())); sts = m_va->BeginFrame(pFrame->GetFrameMID(), 0); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, pFrame->GetFrameMID(), sts)); if (sts != UMC::UMC_OK) throw h265_exception(sts); H265_DXVA_SegmentDecoder * dxva_sd = (H265_DXVA_SegmentDecoder*)(m_Base->m_pSegmentDecoder[0]); assert(dxva_sd); for (uint32_t i = 0; i < m_Base->m_iThreadNum; i++) { ((H265_DXVA_SegmentDecoder *)m_Base->m_pSegmentDecoder[i])->SetVideoAccelerator(m_va); } dxva_sd->PackAllHeaders(pFrame); } void EndDecodingFrame() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "H265 decode DDISubmitTask end"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_START, TR_KEY_DDI_API, make_event_data(FrameIndex, m_va)); if (!m_va) return; UMC::Status sts = m_va->EndFrame(); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_ENDFRAME_TASK, EVENT_TYPE_END, TR_KEY_DDI_API, make_event_data(FrameIndex, sts)); if (sts != UMC::UMC_OK) throw h265_exception(sts); } void SetVideoHardwareAccelerator(UMC::VideoAccelerator * va) { if (va) m_va = (UMC::VideoAccelerator*)va; } protected: UMC::VideoAccelerator *m_va; BaseClass * m_Base; }; class TaskBrokerSingleThreadDXVA : public TaskBroker_H265 { public: TaskBrokerSingleThreadDXVA(TaskSupplier_H265 * pTaskSupplier); virtual bool PrepareFrame(H265DecoderFrame * pFrame); // Get next working task virtual bool GetNextTaskInternal(H265Task *pTask); virtual void Start(); virtual void Reset(); protected: virtual void AwakeThreads(); class ReportItem { public: uint32_t m_index; uint32_t m_field; uint8_t m_status; ReportItem(uint32_t index, uint32_t field, uint8_t status) : m_index(index) , m_field(field) , m_status(status) { } bool operator == (const ReportItem & item) { return (item.m_index == m_index) && (item.m_field == m_field); } bool operator != (const ReportItem & item) { return (item.m_index != m_index) || (item.m_field != m_field); } }; typedef std::vector Report; Report m_reports; mfx::ResettableTimerMs timer; }; } // namespace UMC_HEVC_DECODER #endif /* __UMC_H265_SEGMENT_DECODER_DXVA_H */ #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_slice_decoding.h000066400000000000000000000204071443134507600334260ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_SLICE_DECODING_H #define __UMC_H265_SLICE_DECODING_H #include #include "umc_h265_dec_defs.h" #include "umc_h265_bitstream_headers.h" #include "umc_h265_heap.h" namespace UMC_HEVC_DECODER { class H265DecoderFrame; class H265DBPList; class DecodingContext; // Asynchronous task IDs enum { DEC_PROCESS_ID, REC_PROCESS_ID, DEB_PROCESS_ID, SAO_PROCESS_ID, LAST_PROCESS_ID }; // Task completeness information structure struct CUProcessInfo { int32_t firstCU; int32_t maxCU; int32_t m_curCUToProcess[LAST_PROCESS_ID]; int32_t m_processInProgress[LAST_PROCESS_ID]; bool m_isCompleted; int32_t m_width; void Initialize(int32_t firstCUAddr, int32_t width) { for (int32_t task = 0; task < LAST_PROCESS_ID; task++) { m_curCUToProcess[task] = firstCUAddr; m_processInProgress[task] = 0; } firstCU = firstCUAddr; m_width = width; m_isCompleted = false; } }; // Slice descriptor class class H265Slice : public HeapObject { public: // Default constructor H265Slice(); // Destructor virtual ~H265Slice(void); // Decode slice header and initializ slice structure with parsed values virtual bool Reset(PocDecoding * pocDecoding); // Set current slice number void SetSliceNumber(int32_t iSliceNumber); // Initialize CABAC context depending on slice type void InitializeContexts(); // Parse beginning of slice header to get PPS ID virtual int32_t RetrievePicParamSetNumber(); // // method(s) to obtain slice specific information // // Obtain pointer to slice header const H265SliceHeader *GetSliceHeader() const {return &m_SliceHeader;} H265SliceHeader *GetSliceHeader() {return &m_SliceHeader;} int32_t GetFirstMB() const {return m_iFirstMB;} // Obtain current picture parameter set const H265PicParamSet *GetPicParam() const {return m_pPicParamSet;} void SetPicParam(const H265PicParamSet * pps) { m_pPicParamSet = pps; if (m_pPicParamSet) m_pPicParamSet->IncrementReference(); } // Obtain current sequence parameter set const H265SeqParamSet *GetSeqParam(void) const {return m_pSeqParamSet;} void SetSeqParam(const H265SeqParamSet * sps) { m_pSeqParamSet = sps; if (m_pSeqParamSet) m_pSeqParamSet->IncrementReference(); } // Obtain current destination frame H265DecoderFrame *GetCurrentFrame(void) const {return m_pCurrentFrame;} void SetCurrentFrame(H265DecoderFrame * pFrame){m_pCurrentFrame = pFrame;} // Obtain slice number int32_t GetSliceNum(void) const {return m_iNumber;} // Obtain maximum of macroblock int32_t GetMaxMB(void) const {return m_iMaxMB;} void SetMaxMB(int32_t x) {m_iMaxMB = x;} // Build reference lists from slice reference pic set. HEVC spec 8.3.2 virtual UMC::Status UpdateReferenceList(H265DBPList *dpb, H265DecoderFrame* curr_ref); bool IsError() const {return m_bError;} bool GetRapPicFlag() const; public: MemoryPiece m_source; // (MemoryPiece *) pointer to owning memory piece public: // DEBUG !!!! should remove dependence // Initialize slice structure to default values virtual void Reset(); // Release resources virtual void Release(); // Decoder slice header and calculate POC virtual bool DecodeSliceHeader(PocDecoding * pocDecoding); H265SliceHeader m_SliceHeader; // (H265SliceHeader) slice header H265HeadersBitstream m_BitStream; // (H265Bitstream) slice bit stream // Obtain bit stream object H265HeadersBitstream* GetBitStream() { return &m_BitStream; } H265HeadersBitstream const* GetBitStream() const { return &m_BitStream; } protected: const H265PicParamSet* m_pPicParamSet; // (H265PicParamSet *) pointer to array of picture parameters sets const H265SeqParamSet* m_pSeqParamSet; // (H265SeqParamSet *) pointer to array of sequence parameters sets public: H265DecoderFrame *m_pCurrentFrame; // (H265DecoderFrame *) pointer to destination frame int32_t m_NumEmuPrevnBytesInSliceHdr; // (int32_t) number of emulation prevention bytes in slice head int32_t m_iNumber; // (int32_t) current slice number int32_t m_iFirstMB; // (int32_t) first MB number in slice int32_t m_iMaxMB; // (int32_t) last unavailable MB number in slice CUProcessInfo processInfo; bool m_bError; // (bool) there is an error in decoding // memory management tools DecodingContext *m_context; public: ReferencePictureSet* getRPS() { return &m_SliceHeader.m_rps; } const ReferencePictureSet* getRPS() const { return &GetSliceHeader()->m_rps; } int getNumRefIdx(EnumRefPicList e) const { return m_SliceHeader.m_numRefIdx[e]; } // Returns number of used references in RPS int getNumRpsCurrTempList() const; int32_t m_tileCount; uint32_t *m_tileByteLocation; uint32_t getTileLocationCount() const { return m_tileCount; } void allocateTileLocation(int32_t val) { if (m_tileCount < val) delete[] m_tileByteLocation; m_tileCount = val; m_tileByteLocation = new uint32_t[val]; } void setRefPOCListSliceHeader(); // For dependent slice copy data from another slice void CopyFromBaseSlice(const H265Slice * slice); uint32_t getTileColumnWidth(uint32_t col) const; uint32_t getTileRowHeight(uint32_t row) const; uint32_t getTileXIdx() const; uint32_t getTileYIdx() const; }; // Check whether two slices are from the same picture. HEVC spec 7.4.2.4.5 inline bool IsPictureTheSame(H265Slice *pSliceOne, H265Slice *pSliceTwo) { if (!pSliceOne) return true; const H265SliceHeader *pOne = pSliceOne->GetSliceHeader(); const H265SliceHeader *pTwo = pSliceTwo->GetSliceHeader(); if (pOne->first_slice_segment_in_pic_flag == 1 && pOne->first_slice_segment_in_pic_flag == pTwo->first_slice_segment_in_pic_flag) return false; if (pOne->slice_pic_parameter_set_id != pTwo->slice_pic_parameter_set_id) return false; if (pOne->m_poc != pTwo->m_poc) return false; return true; } // bool IsPictureTheSame(H265SliceHeader *pOne, H265SliceHeader *pTwo) // Returns true if slice is sublayer non-reference inline bool IsSubLayerNonReference(int32_t nal_unit_type) { switch (nal_unit_type) { case NAL_UT_CODED_SLICE_RADL_N: case NAL_UT_CODED_SLICE_RASL_N: case NAL_UT_CODED_SLICE_STSA_N: case NAL_UT_CODED_SLICE_TSA_N: case NAL_UT_CODED_SLICE_TRAIL_N: //also need to add RSV_VCL_N10, RSV_VCL_N12, or RSV_VCL_N14, return true; } return false; } // bool IsSubLayerNonReference(int32_t nal_unit_type) } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_SLICE_DECODING_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_tables.h000066400000000000000000000047021443134507600320240ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_DEC_TABLES_H__ #define __UMC_H265_DEC_TABLES_H__ #include "umc_h265_dec_defs.h" namespace UMC_HEVC_DECODER { // Scaling list initialization scan lookup table extern const uint16_t g_sigLastScanCG32x32[64]; // Scaling list initialization scan lookup table extern const uint16_t ScanTableDiag4x4[16]; // Default scaling list 8x8 for intra prediction extern const int32_t g_quantIntraDefault8x8[64]; // Default scaling list 8x8 for inter prediction extern const int32_t g_quantInterDefault8x8[64]; // Default scaling list 4x4 extern const int32_t g_quantTSDefault4x4[16]; // Scaling list table sizes static const uint32_t g_scalingListSize [4] = {16, 64, 256, 1024}; // Number of possible scaling lists of different sizes static const uint32_t g_scalingListNum[SCALING_LIST_SIZE_NUM]={6, 6, 6, 2}; // Sample aspect ratios by aspect_ratio_idc index. HEVC spec E.3.1 const uint16_t SAspectRatio[17][2] = { { 0, 0}, { 1, 1}, {12, 11}, {10, 11}, {16, 11}, {40, 33}, { 24, 11}, {20, 11}, {32, 11}, {80, 33}, {18, 11}, {15, 11}, {64, 33}, {160, 99}, {4, 3}, {3, 2}, {2, 1} }; // Inverse QP scale lookup table extern const uint16_t g_invQuantScales[6]; // IQ(QP%6) } // namespace UMC_HEVC_DECODER #endif //__UMC_H265_DEC_TABLES_H__ #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_task_broker.h000066400000000000000000000075601443134507600330060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_TASK_BROKER_H #define __UMC_H265_TASK_BROKER_H #include #include #include "umc_h265_dec_defs.h" #include "umc_h265_heap.h" #include "umc_h265_segment_decoder_base.h" namespace UMC_HEVC_DECODER { class H265DecoderFrameInfo; class H265DecoderFrameList; class H265Slice; class TaskSupplier_H265; class DecodingContext; struct TileThreadingInfo; class H265Task; // Decoder task scheduler class class TaskBroker_H265 { public: TaskBroker_H265(TaskSupplier_H265 * pTaskSupplier); // Initialize task broker with threads number virtual bool Init(int32_t iConsumerNumber); virtual ~TaskBroker_H265(); // Add frame to decoding queue virtual bool AddFrameToDecoding(H265DecoderFrame * pFrame); // Returns whether enough bitstream data is evailable to start an asynchronous task virtual bool IsEnoughForStartDecoding(bool force); // Returns whether there is some work available for specified frame bool IsExistTasks(H265DecoderFrame * frame); // Tries to find a new task for asynchronous processing virtual bool GetNextTask(H265Task *pTask); // Reset to default values, stop all activity virtual void Reset(); // Release resources virtual void Release(); // Calculate frame state after a task has been finished virtual void AddPerformedTask(H265Task *pTask); // Wakes up working threads to start working on new tasks virtual void Start(); // Check whether frame is prepared virtual bool PrepareFrame(H265DecoderFrame * pFrame); // Lock synchronization mutex void Lock(); // Unlock synchronization mutex void Unlock(); TaskSupplier_H265 * m_pTaskSupplier; protected: // Returns number of access units available in the list but not processed yet int32_t GetNumberOfTasks(void); // Returns whether frame decoding is finished bool IsFrameCompleted(H265DecoderFrame * pFrame) const; virtual bool GetNextTaskInternal(H265Task *) { return false; } // Try to find an access unit which to decode next void InitAUs(); // Find an access unit which has all slices found H265DecoderFrameInfo * FindAU(); void SwitchCurrentAU(); // Finish frame decoding virtual void CompleteFrame(H265DecoderFrame * frame); // Remove access unit from the linked list of frames void RemoveAU(H265DecoderFrameInfo * toRemove); int32_t m_iConsumerNumber; H265DecoderFrameInfo * m_FirstAU; bool m_IsShouldQuit; typedef std::list FrameQueue; FrameQueue m_decodingQueue; FrameQueue m_completedQueue; UMC::Mutex m_mGuard; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_TASK_BROKER_H #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_task_supplier.h000066400000000000000000000344161443134507600333650ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_TASK_SUPPLIER_H #define __UMC_H265_TASK_SUPPLIER_H #include #include #include "umc_h265_dec_defs.h" #include "umc_media_data_ex.h" #include "umc_h265_heap.h" #include "umc_h265_frame_info.h" #include "umc_h265_frame_list.h" #include "umc_h265_headers.h" #include "umc_frame_allocator.h" #include "umc_h265_au_splitter.h" #include "umc_h265_segment_decoder_base.h" #include "umc_va_base.h" namespace UMC_HEVC_DECODER { class TaskBroker_H265; class H265DBPList; class H265DecoderFrame; class H265Slice; class MediaData; class BaseCodecParams; class H265SegmentDecoderMultiThreaded; class TaskBrokerSingleThreadDXVA; class MemoryAllocator; enum { BASE_VIEW = 0, INVALID_VIEW_ID = -1 }; /****************************************************************************************************/ // Skipping_H265 class routine /****************************************************************************************************/ class Skipping_H265 { public: Skipping_H265(); virtual ~Skipping_H265(); // Disable deblocking filter to increase performance void PermanentDisableDeblocking(bool disable); // Check if deblocking should be skipped bool IsShouldSkipDeblocking(H265DecoderFrame * pFrame); // Check if frame should be skipped to decrease decoding delays bool IsShouldSkipFrame(H265DecoderFrame * pFrame); // Set decoding skip frame mode virtual mfxStatus ChangeVideoDecodingSpeed(int32_t& num); void Reset(); struct SkipInfo { bool isDeblockingTurnedOff; int32_t numberOfSkippedFrames; }; // Get current skip mode state SkipInfo GetSkipInfo() const; private: int32_t m_VideoDecodingSpeed; int32_t m_SkipCycle; int32_t m_ModSkipCycle; int32_t m_PermanentTurnOffDeblocking; int32_t m_NumberOfSkippedFrames; }; /****************************************************************************************************/ // TaskSupplier_H265 /****************************************************************************************************/ class SEI_Storer_H265 { public: struct SEI_Message { H265DecoderFrame * frame; size_t size; size_t offset; uint8_t* data; int32_t nal_type; double timestamp; SEI_TYPE type; int32_t isUsed; SEI_Message() { clear(); } bool empty() const { return !isUsed; } void clear() { frame = NULL; data = NULL; size = offset = 0; nal_type = NAL_UT_INVALID; timestamp = 0; type = SEI_RESERVED; isUsed = 0; } }; SEI_Storer_H265(); virtual ~SEI_Storer_H265(); // Initialize SEI storage void Init(); // Deallocate SEI storage void Close(); // Reset SEI storage void Reset(); // Set timestamp for stored SEI messages void SetTimestamp(H265DecoderFrame * frame); // Put a new SEI message to the storage SEI_Message* AddMessage(UMC::MediaDataEx *nalUnit, SEI_TYPE type); // Retrieve a stored SEI message which was not retrieved before const SEI_Message * GetPayloadMessage(); // Set SEI frame for stored SEI messages void SetFrame(H265DecoderFrame * frame); private: enum { MAX_BUFFERED_SIZE = 16 * 1024, // 16 kb START_ELEMENTS = 10, MAX_ELEMENTS = 128 }; std::vector m_data; std::vector m_payloads; size_t m_offset; int32_t m_lastUsed; //std::list<> ; }; /****************************************************************************************************/ // ViewItem_H265 class routine /****************************************************************************************************/ struct ViewItem_H265 { // Default constructor ViewItem_H265(void); // Copy constructor ViewItem_H265(const ViewItem_H265 &src); ~ViewItem_H265(); // Initialize the view, allocate resources UMC::Status Init(); // Close the view and release all resources void Close(void); // Reset the view and reset all resource void Reset(void); // Reset the size of DPB for particular view item void SetDPBSize(H265SeqParamSet *pSps, uint32_t & level_idc); // Pointer to the view's DPB mutable std::unique_ptr pDPB; // Size of DPB capacity in frames uint32_t dpbSize; // Maximum number frames used semultaneously uint32_t sps_max_dec_pic_buffering; uint32_t sps_max_num_reorder_pics; // Pointer to the frame being processed H265DecoderFrame *pCurFrame; double localFrameTime; }; /****************************************************************************************************/ // MVC extension class routine /****************************************************************************************************/ class MVC_Extension { public: MVC_Extension(); virtual ~MVC_Extension(); UMC::Status Init(); virtual void Close(); virtual void Reset(); ViewItem_H265 *GetView(); protected: uint32_t m_temporal_id; uint32_t m_priority_id; uint32_t HighestTid; uint32_t m_level_idc; ViewItem_H265 m_view; }; /****************************************************************************************************/ // DecReferencePictureMarking_H265 /****************************************************************************************************/ class DecReferencePictureMarking_H265 { public: DecReferencePictureMarking_H265(); // Update DPB contents marking frames for reuse UMC::Status UpdateRefPicMarking(ViewItem_H265 &view, const H265Slice * pSlice); void ResetUnusedFrames(ViewItem_H265 &view); void Reset(); uint32_t GetDPBError() const; protected: uint32_t m_isDPBErrorFound; int32_t m_frameCount; void ResetError(); }; /****************************************************************************************************/ // Prepare data for asychronous processing /****************************************************************************************************/ class TaskSupplier_H265 : public Skipping_H265, public AU_Splitter_H265, public MVC_Extension, public DecReferencePictureMarking_H265 { friend class TaskBroker_H265; friend class TaskBrokerSingleThreadDXVA; public: uint32_t m_SliceIdxInTaskSupplier; //for h265 sliceidx cursliceidx m_sliceidx m_currsliceidx m_inumber TaskSupplier_H265(); virtual ~TaskSupplier_H265(); // Initialize task supplier and creak task broker virtual UMC::Status Init(UMC::VideoDecoderParams *pInit); // create broker and segment decoders virtual void CreateTaskBroker() = 0; // Initialize what is necessary to decode bitstream header before the main part is initialized virtual UMC::Status PreInit(UMC::VideoDecoderParams *pInit); // Reset to default state virtual void Reset(); // Release allocated resources virtual void Close(); // Fill up current bitstream information UMC::Status GetInfo(UMC::VideoDecoderParams *lpInfo); // Add a new bitstream data buffer to decoding virtual UMC::Status AddSource(UMC::MediaData *pSource); // Chose appropriate processing action for specified NAL unit UMC::Status ProcessNalUnit(UMC::MediaDataEx *nalUnit); void SetMemoryAllocator(UMC::MemoryAllocator *pMemoryAllocator) { m_pMemoryAllocator = pMemoryAllocator; } void SetFrameAllocator(UMC::FrameAllocator *pFrameAllocator) { m_pFrameAllocator = pFrameAllocator; } // Find a next frame ready to be output from decoder virtual H265DecoderFrame *GetFrameToDisplayInternal(bool force); // Retrieve decoded SEI data with SEI_USER_DATA_REGISTERED_TYPE type UMC::Status GetUserData(UMC::MediaData *pUD); bool IsShouldSuspendDisplay(); H265DBPList *GetDPBList() { ViewItem_H265 *pView = GetView(); if (NULL == pView) { return NULL; } return pView->pDPB.get(); } TaskBroker_H265 * GetTaskBroker() { return m_pTaskBroker; } // Start asynchronous decoding virtual UMC::Status RunDecoding(); // Find a decoder frame instance with specified surface ID virtual H265DecoderFrame * FindSurface(UMC::FrameMemID id); // Set frame display time void PostProcessDisplayFrame(H265DecoderFrame *pFrame); // Attempt to recover after something unexpectedly went wrong virtual void AfterErrorRestore(); SEI_Storer_H265 * GetSEIStorer() const { return m_sei_messages;} Headers * GetHeaders() { return &m_Headers;} inline const H265SeqParamSet *GetCurrentSequence(void) const { return m_Headers.m_SeqParams.GetCurrentHeader(); } // Decode slice header start, set slice links to SPS and PPS and correct tile offsets table if needed virtual H265Slice * DecodeSliceHeader(UMC::MediaDataEx *nalUnit); Heap_Objects * GetObjHeap() { return &m_ObjHeap; } protected: // Include a new slice into a set of frame slices void AddSliceToFrame(H265DecoderFrame *pFrame, H265Slice *pSlice); // Initialize scaling list data if needed void ActivateHeaders(H265SeqParamSet *sps, H265PicParamSet *pps); // Check whether this slice should be skipped because of random access conditions. HEVC spec 3.111 bool IsSkipForCRAorBLA(const H265Slice *pSlice); // Calculate NoRaslOutputFlag flag for specified slice void CheckCRAOrBLA(const H265Slice *pSlice); // Try to find a reusable frame or allocate a new one and initialize it with slice parameters virtual H265DecoderFrame *AllocateNewFrame(const H265Slice *pSlice); // Initialize just allocated frame with slice parameters virtual UMC::Status InitFreeFrame(H265DecoderFrame *pFrame, const H265Slice *pSlice); // Initialize frame's counter and corresponding parameters virtual void InitFrameCounter(H265DecoderFrame *pFrame, const H265Slice *pSlice); // Add a new slice to frame UMC::Status AddSlice(H265Slice * pSlice, bool force); // Check whether all slices for the frame were found virtual void CompleteFrame(H265DecoderFrame * pFrame); // Mark frame as full with slices virtual void OnFullFrame(H265DecoderFrame * pFrame); // Update DPB contents marking frames for reuse void DPBUpdate(const H265Slice * slice); // Not implemented virtual H265DecoderFrame* AddSelfReferenceFrame(H265Slice*); // Find NAL units in new bitstream buffer and process them virtual UMC::Status AddOneFrame(UMC::MediaData * pSource); // Allocate frame internals virtual UMC::Status AllocateFrameData(H265DecoderFrame * pFrame, mfxSize dimensions, const H265SeqParamSet* pSeqParamSet, const H265PicParamSet *pPicParamSet); // Decode a bitstream header NAL unit virtual UMC::Status DecodeHeaders(UMC::MediaDataEx *nalUnit); // Decode SEI NAL unit virtual UMC::Status DecodeSEI(UMC::MediaDataEx *nalUnit); // Search DPB for a frame which may be reused virtual H265DecoderFrame *GetFreeFrame(); // If a frame has all slices found, add it to asynchronous decode queue UMC::Status CompleteDecodedFrames(H265DecoderFrame ** decoded); // Try to reset in case DPB has overflown void PreventDPBFullness(); H265SegmentDecoderBase **m_pSegmentDecoder; uint32_t m_iThreadNum; int32_t m_maxUIDWhenWasDisplayed; double m_local_delta_frame_time; bool m_use_external_framerate; bool m_decodedOrder; bool m_checkCRAInsideResetProcess; bool m_bFirstSliceInSequence; bool m_bFirstSliceInBitstream; H265Slice * m_pLastSlice; H265DecoderFrame *m_pLastDisplayed; UMC::MemoryAllocator *m_pMemoryAllocator; UMC::FrameAllocator *m_pFrameAllocator; // Keep track of which parameter set is in use. bool m_WaitForIDR; bool m_prevSliceBroken; int32_t m_RA_POC; uint8_t NoRaslOutputFlag; NalUnitType m_IRAPType; uint32_t m_DPBSizeEx; int32_t m_frameOrder; TaskBroker_H265 * m_pTaskBroker; UMC::VideoDecoderParams m_initializationParams; int32_t m_UIDFrameCounter; H265SEIPayLoad m_UserData; SEI_Storer_H265 *m_sei_messages; PocDecoding m_pocDecoding; bool m_isInitialized; UMC::Mutex m_mGuard; private: // Decode video parameters set NAL unit UMC::Status xDecodeVPS(H265HeadersBitstream *); // Decode sequence parameters set NAL unit UMC::Status xDecodeSPS(H265HeadersBitstream *); // Decode picture parameters set NAL unit UMC::Status xDecodePPS(H265HeadersBitstream *); TaskSupplier_H265 & operator = (TaskSupplier_H265 &) { return *this; } // TaskSupplier_H265 & operator = (TaskSupplier_H265 &) }; // Calculate maximum DPB size based on level and resolution extern int32_t CalculateDPBSize(uint32_t profile_idc, uint32_t &level_idc, int32_t width, int32_t height, uint32_t num_ref_frames); } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_TASK_SUPPLIER_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_va_packer.h000066400000000000000000000164571443134507600325170ustar00rootroot00000000000000// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_VA_PACKER_H #define __UMC_H265_VA_PACKER_H #include "umc_va_base.h" #include #include "umc_h265_tables.h" #include namespace UMC_HEVC_DECODER { enum { NO_REFERENCE = 0, SHORT_TERM_REFERENCE = 1, LONG_TERM_REFERENCE = 2, INTERVIEW_TERM_REFERENCE = 3 }; extern int const s_quantTSDefault4x4[16]; extern int const s_quantIntraDefault8x8[64]; extern int const s_quantInterDefault8x8[64]; extern uint16_t const* SL_tab_up_right[]; inline int const* getDefaultScalingList(unsigned sizeId, unsigned listId) { const int *src = 0; switch (sizeId) { case SCALING_LIST_4x4: src = (int*)g_quantTSDefault4x4; break; case SCALING_LIST_8x8: src = (listId < 3) ? s_quantIntraDefault8x8 : s_quantInterDefault8x8; break; case SCALING_LIST_16x16: src = (listId < 3) ? s_quantIntraDefault8x8 : s_quantInterDefault8x8; break; case SCALING_LIST_32x32: src = (listId < 1) ? s_quantIntraDefault8x8 : s_quantInterDefault8x8; break; default: assert(0); src = NULL; break; } return src; } template inline void initQMatrix(const H265ScalingList *scalingList, int sizeId, unsigned char qm[6][COUNT], bool force_upright_scan = false) { /* n*m listId -------------------- Intra Y 0 Intra Cb 1 Intra Cr 2 Inter Y 3 Inter Cb 4 Inter Cr 5 */ uint16_t const* scan = 0; if (force_upright_scan) scan = SL_tab_up_right[sizeId]; for (int n = 0; n < 6; n++) { const int *src = scalingList->getScalingListAddress(sizeId, n); for (int i = 0; i < COUNT; i++) // coef. { int const idx = scan ? scan[i] : i; qm[n][i] = (unsigned char)src[idx]; } } } template inline void initQMatrix(const H265ScalingList *scalingList, int sizeId, unsigned char qm[3][2][COUNT]) { for(int comp=0 ; comp <= 2 ; comp++) // Y Cb Cr { for(int n=0; n <= 1;n++) { int listId = comp + 3*n; const int *src = scalingList->getScalingListAddress(sizeId, listId); for(int i=0;i < COUNT;i++) // coef. qm[comp][n][i] = (unsigned char)src[i]; } } } inline void initQMatrix(const H265ScalingList *scalingList, int sizeId, unsigned char qm[2][64], bool force_upright_scan = false) { /* n m listId -------------------- Intra Y 0 Inter Y 1 */ uint16_t const* scan = 0; if (force_upright_scan) scan = SL_tab_up_right[sizeId]; for(int n=0;n < 2;n++) // Intra, Inter { const int *src = scalingList->getScalingListAddress(sizeId, n); for (int i = 0; i < 64; i++) // coef. { int const idx = scan ? scan[i] : i; qm[n][i] = (unsigned char)src[idx]; } } } class H265DecoderFrame; class H265DecoderFrameInfo; class H265Slice; class TaskSupplier_H265; class Packer { public: Packer(UMC::VideoAccelerator * va); virtual ~Packer(); virtual UMC::Status GetStatusReport(void * pStatusReport, size_t size) = 0; virtual UMC::Status SyncTask(int32_t index, void * error) = 0; virtual bool IsGPUSyncEventEnable() = 0; virtual void BeginFrame(H265DecoderFrame*) = 0; virtual void EndFrame() = 0; virtual void PackAU(H265DecoderFrame const*, TaskSupplier_H265*) = 0; virtual void PackPicParams(H265DecoderFrame const*, TaskSupplier_H265*) = 0; virtual void PackQmatrix(const H265Slice *pSlice) = 0; static Packer * CreatePacker(UMC::VideoAccelerator * va); virtual bool PackSliceParams(H265Slice const* slice, size_t, bool last_slice) = 0; protected: UMC::VideoAccelerator *m_va; }; /* Helper struct to map given type [T] to certain [UMCVACompBuffer::type] */ template struct Type2Buffer; template inline UMC::UMCVACompBuffer* GetParamsBuffer(UMC::VideoAccelerator* va, T** pb) { assert(va); assert(pb); UMC::UMCVACompBuffer* buffer = nullptr; *pb = reinterpret_cast(va->GetCompBuffer(Type2Buffer::value, &buffer, sizeof(T))); return buffer; } /* Creates [count] of parameter buffers for given type [T] */ template inline void CreateParamsBuffer(UMC::VideoAccelerator* va, size_t count) { assert(va); UMC::UMCVACompBuffer* buffer = nullptr; va->GetCompBuffer(Type2Buffer::value, &buffer, sizeof(T) * count); if (!buffer) throw h265_exception(UMC::UMC_ERR_FAILED); } /* Request next (offseted by used data size) buffer for given [type], returns pointer to buffer data and its offset */ inline std::pair PeekBuffer(UMC::VideoAccelerator* va, int32_t type, size_t size, uint32_t data_alignment = 0) { assert(va); UMC::UMCVACompBuffer* buffer = nullptr; void* ptr = va->GetCompBuffer(type, &buffer, (int32_t)size); if (!buffer) throw h265_exception(UMC::UMC_ERR_FAILED); size_t const b_size = buffer->GetBufferSize(); size_t offset = buffer->GetDataSize(); offset = data_alignment ? data_alignment*((offset+data_alignment-1)/data_alignment) : offset; if (size + offset > b_size) throw h265_exception(UMC::UMC_ERR_FAILED); buffer->SetDataSize(int32_t(size + offset)); ptr = reinterpret_cast(ptr) + offset; return std::make_pair(ptr, offset); } /* Request next (see [PeekBuffer]) buffer for given type [T] */ template inline void PeekParamsBuffer(UMC::VideoAccelerator* va, T** pb, uint32_t data_alignment = 0) { auto p = PeekBuffer(va, Type2Buffer::value, sizeof(T), data_alignment); if (!p.first) throw h265_exception(UMC::UMC_ERR_FAILED); *pb = reinterpret_cast(p.first); **pb = {}; } } // namespace UMC_HEVC_DECODER #endif /* __UMC_H265_VA_PACKER_H */ #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_va_packer_dxva.h000066400000000000000000000026301443134507600334460ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_VA_PACKER_DXVA_H #define __UMC_H265_VA_PACKER_DXVA_H #include "umc_h265_va_packer.h" #ifndef UMC_RESTRICTED_CODE_VA #endif // UMC_RESTRICTED_CODE_VA #endif /* __UMC_H265_VA_PACKER_DXVA_H */ #endif // MFX_ENABLE_H265_VIDEO_DECODEumc_h265_va_packer_vaapi.h000066400000000000000000000120401443134507600336000ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_VA_PACKER_VAAPI_H #define __UMC_H265_VA_PACKER_VAAPI_H #include "umc_h265_va_packer.h" #ifndef UMC_RESTRICTED_CODE_VA #include "umc_h265_task_supplier.h" namespace UMC_HEVC_DECODER { inline int LengthInMinCb(int length, int cbsize) { return length/(1 << cbsize); } class PackerVAAPI : public Packer { public: PackerVAAPI(UMC::VideoAccelerator* va) : Packer(va) {} UMC::Status GetStatusReport(void*, size_t) override { return UMC::UMC_OK; } UMC::Status SyncTask(int32_t index, void* error) override { return m_va->SyncTask(index, error); } bool IsGPUSyncEventEnable() override { return false; } void BeginFrame(H265DecoderFrame*) override; void EndFrame() override { /* Nothing to do */} void PackAU(H265DecoderFrame const*, TaskSupplier_H265*) override; bool PackSliceParams(H265Slice const* slice, size_t, bool last_slice) override { return PackSliceParams(slice, last_slice) ? true : false; } void PackProcessingInfo(H265DecoderFrameInfo * sliceInfo); protected: virtual VASliceParameterBufferBase* PackSliceParams(H265Slice const*, bool last_slice) = 0; virtual void CreateSliceParamBuffer(size_t count) = 0; virtual void PackSliceParams(VASliceParameterBufferBase* sp_base, H265Slice const* slice, bool last_slice) = 0; private: void PackQmatrix(H265Slice const*) override; }; template <> struct Type2Buffer : std::integral_constant {}; template <> struct Type2Buffer : std::integral_constant {}; template <> struct Type2Buffer : std::integral_constant {}; template <> struct Type2Buffer : std::integral_constant {}; /* Request next (see [PeekBuffer]) buffer for slice data */ inline size_t PeekSliceDataBuffer(UMC::VideoAccelerator* va, uint8_t** data, size_t size) { assert(data); auto p = PeekBuffer(va, VASliceDataBufferType, size); if (!p.first) throw h265_exception(UMC::UMC_ERR_FAILED); *data = reinterpret_cast(p.first); return p.second; } inline void CreateSliceDataBuffer(UMC::VideoAccelerator* va, H265DecoderFrameInfo const* si) { assert(va); assert(si); auto const count = si->GetSliceCount(); size_t total = 0; for (size_t i = 0; i < count; i++) { H265Slice const* slice = si->GetSlice(i); if (!slice) throw h265_exception(UMC::UMC_ERR_FAILED); auto bs = slice->GetBitStream(); assert(bs); uint32_t size = 0; uint32_t* ptr = 0; bs->GetOrg(&ptr, &size); total += size + 3; } UMC::UMCVACompBuffer* buffer = nullptr; auto ptr = reinterpret_cast(va->GetCompBuffer(VASliceDataBufferType, &buffer, total)); if (!ptr) throw h265_exception(UMC::UMC_ERR_FAILED); buffer->SetDataSize(0); } /*inline size_t GetSliceDataBuffer(UMC::VideoAccelerator* va, char** data, size_t size) { assert(data); auto p = GetSliceBuffer(va, VASliceDataBufferType, size); if (!p.first) throw h265_exception(UMC::UMC_ERR_FAILED); *data = reinterpret_cast(p.first); return p.second; }*/ }; // namespace UMC_HEVC_DECODER #include "platform/umc_h265_va_packer_vaapi_g12.hpp" #endif // UMC_RESTRICTED_CODE_VA #endif // __UMC_H265_VA_PACKER_VAAPI_H #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_va_supplier.h000066400000000000000000000071161443134507600330260ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_VA_SUPPLIER_H #define __UMC_H265_VA_SUPPLIER_H #include "umc_h265_mfx_supplier.h" #include "umc_h265_segment_decoder_dxva.h" namespace UMC_HEVC_DECODER { class MFXVideoDECODEH265; /****************************************************************************************************/ // TaskSupplier_H265 /****************************************************************************************************/ class VATaskSupplier : public MFXTaskSupplier_H265 , public DXVASupport { friend class TaskBroker_H265; friend class DXVASupport; friend class VideoDECODEH265; public: VATaskSupplier(); virtual UMC::Status Init(UMC::VideoDecoderParams *pInit); virtual void Reset(); virtual void CreateTaskBroker(); mfxStatus ChangeVideoDecodingSpeed(int32_t& num); void SetBufferedFramesNumber(uint32_t buffered); protected: virtual UMC::Status AllocateFrameData(H265DecoderFrame * pFrame, mfxSize dimensions, const H265SeqParamSet* pSeqParamSet, const H265PicParamSet *pPicParamSet); virtual void InitFrameCounter(H265DecoderFrame * pFrame, const H265Slice *pSlice); virtual void CompleteFrame(H265DecoderFrame * pFrame); virtual H265Slice * DecodeSliceHeader(UMC::MediaDataEx *nalUnit); virtual H265DecoderFrame *GetFrameToDisplayInternal(bool force); uint32_t m_bufferedFrameNumber; private: VATaskSupplier & operator = (VATaskSupplier &) { return *this; } }; // this template class added to apply big surface pool workaround depends on platform // because platform check can't be added inside VATaskSupplier template class VATaskSupplierBigSurfacePool: public BaseClass { public: VATaskSupplierBigSurfacePool() {}; virtual ~VATaskSupplierBigSurfacePool() {}; protected: virtual UMC::Status AllocateFrameData(H265DecoderFrame * pFrame, mfxSize dimensions, const H265SeqParamSet* pSeqParamSet, const H265PicParamSet * pps) { UMC::Status ret = BaseClass::AllocateFrameData(pFrame, dimensions, pSeqParamSet, pps); if (ret == UMC::UMC_OK) { ViewItem_H265 *pView = BaseClass::GetView(); H265DBPList *pDPB = pView->pDPB.get(); pFrame->m_index = pDPB->GetFreeIndex(); } return ret; } }; }// namespace UMC_HEVC_DECODER #endif // __UMC_H265_VA_SUPPLIER_H #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/include/umc_h265_yuv.h000066400000000000000000000070031443134507600313720ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef __UMC_H265_DEC_DEFS_YUV_H__ #define __UMC_H265_DEC_DEFS_YUV_H__ #include "umc_h265_dec_defs.h" #include "umc_video_decoder.h" #include "umc_frame_data.h" namespace UMC_HEVC_DECODER { // YUV frame buffer class class H265DecYUVBufferPadded { public: int32_t m_chroma_format; // standard value chroma_format_idc PlanePtrY m_pYPlane; PlanePtrUV m_pUVPlane; // for NV12 support PlanePtrUV m_pUPlane; PlanePtrUV m_pVPlane; H265DecYUVBufferPadded(); H265DecYUVBufferPadded(UMC::MemoryAllocator *pMemoryAllocator); virtual ~H265DecYUVBufferPadded(); // Initialize variables to default values void Init(const UMC::VideoDataInfo *info); // Allocate YUV frame buffer planes and initialize pointers to it. // Used to contain decoded frames. void allocate(const UMC::FrameData * frameData, const UMC::VideoDataInfo *info); // Allocate memory and initialize frame plane pointers and pitches. // Used for temporary picture buffers, e.g. residuals. void createPredictionBuffer(const H265SeqParamSet * sps); // Deallocate planes memory void destroy(); // Deallocate all memory void deallocate(); const mfxSize& lumaSize() const { return m_lumaSize; } const mfxSize& chromaSize() const { return m_chromaSize; } uint32_t pitch_luma() const { return m_pitch_luma; } uint32_t pitch_chroma() const { return m_pitch_chroma; } // Returns pointer to FrameData instance UMC::FrameData * GetFrameData(); const UMC::FrameData * GetFrameData() const; // Returns color formap of allocated frame UMC::ColorFormat GetColorFormat() const; protected: UMC::MemoryAllocator *m_pMemoryAllocator; // (MemoryAllocator *) pointer to memory allocator UMC::MemID m_midAllocatedBuffer; // (MemID) mem id for allocated buffer // m_pAllocatedBuffer contains the pointer returned when // we allocated space for the data. uint8_t *m_pAllocatedBuffer; mfxSize m_lumaSize; mfxSize m_chromaSize; int32_t m_pitch_luma; int32_t m_pitch_chroma; UMC::FrameData m_frameData; UMC::ColorFormat m_color_format; }; } // namespace UMC_HEVC_DECODER #endif // __UMC_H265_DEC_DEFS_YUV_H__ #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/000077500000000000000000000000001443134507600261325ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_au_splitter.cpp000066400000000000000000000050171443134507600326040ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include #include "umc_h265_au_splitter.h" #include "umc_h265_nal_spl.h" #if defined(MFX_ENABLE_PXP) #include "mfx_pxp_h265_nal_spl.h" #endif namespace UMC_HEVC_DECODER { AU_Splitter_H265::AU_Splitter_H265() : m_Headers(&m_ObjHeap) { } AU_Splitter_H265::~AU_Splitter_H265() { Close(); } void AU_Splitter_H265::Init(UMC::VideoDecoderParams *) { Close(); #if defined(MFX_ENABLE_PXP) m_pNALSplitter.reset(new PXPNALUnitSplitter_H265()); #else m_pNALSplitter.reset(new NALUnitSplitter_H265()); #endif m_pNALSplitter->Init(); } void AU_Splitter_H265::Close() { m_pNALSplitter.reset(0); m_Headers.Reset(false); m_ObjHeap.Release(); } void AU_Splitter_H265::Reset() { if (m_pNALSplitter.get()) m_pNALSplitter->Reset(); m_Headers.Reset(false); m_ObjHeap.Release(); } // Wrapper for NAL unit splitter CheckNalUnitType int32_t AU_Splitter_H265::CheckNalUnitType(UMC::MediaData * src) { return m_pNALSplitter->CheckNalUnitType(src); } // Wrapper for NAL unit splitter CheckNalUnitType GetNalUnit UMC::MediaDataEx * AU_Splitter_H265::GetNalUnit(UMC::MediaData * src) { return m_pNALSplitter->GetNalUnits(src); } // Returns internal NAL unit splitter NALUnitSplitter_H265 * AU_Splitter_H265::GetNalUnitSplitter() { return m_pNALSplitter.get(); } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_bitstream_headers.cpp000077500000000000000000002517561443134507600336770ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_bitstream_headers.h" #include "umc_h265_slice_decoding.h" #include "umc_h265_headers.h" #include "umc_h265_tables.h" namespace UMC_HEVC_DECODER { H265BaseBitstream::H265BaseBitstream() { Reset(0, 0); } H265BaseBitstream::H265BaseBitstream(uint8_t * const pb, const uint32_t maxsize) { Reset(pb, maxsize); } H265BaseBitstream::~H265BaseBitstream() { } // Reset the bitstream with new data pointer void H265BaseBitstream::Reset(uint8_t * const pb, const uint32_t maxsize) { m_pbs = (uint32_t*)pb; m_pbsBase = (uint32_t*)pb; m_bitOffset = 31; m_maxBsSize = maxsize; m_tailBsSize = 0; } // void Reset(uint8_t * const pb, const uint32_t maxsize) // Reset the bitstream with new data pointer and bit offset void H265BaseBitstream::Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize) { m_pbs = (uint32_t*)pb; m_pbsBase = (uint32_t*)pb; m_bitOffset = offset; m_maxBsSize = maxsize; m_tailBsSize = 0; } // void Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize) // Return bitstream array base address and size void H265BaseBitstream::GetOrg(uint32_t **pbs, uint32_t *size) const { *pbs = m_pbsBase; *size = m_maxBsSize; } // Set current decoding position void H265BaseBitstream::SetDecodedBytes(size_t nBytes) { m_pbs = m_pbsBase + (nBytes / 4); m_bitOffset = 31 - ((int32_t) ((nBytes % sizeof(uint32_t)) * 8)); } // Return current bitstream address and bit offset void H265BaseBitstream::GetState(uint32_t** pbs,uint32_t* bitOffset) { *pbs = m_pbs; *bitOffset = m_bitOffset; } // Set current bitstream address and bit offset void H265BaseBitstream::SetState(uint32_t* pbs, uint32_t bitOffset) { m_pbs = pbs; m_bitOffset = bitOffset; } // Check that position in bitstream didn't move outside the limit bool H265BaseBitstream::CheckBSLeft() { size_t bitsDecoded = BitsDecoded(); return (bitsDecoded > m_maxBsSize*8); } // Check whether more data is present bool H265BaseBitstream::More_RBSP_Data() { int32_t code, tmp; uint32_t* ptr_state = m_pbs; int32_t bit_state = m_bitOffset; assert(m_bitOffset >= 0 && m_bitOffset <= 31); int32_t remaining_bytes = (int32_t)BytesLeft(); if (remaining_bytes <= 0) return false; // get top bit, it can be "rbsp stop" bit CheckBitsLeft(1); GetNBits(m_pbs, m_bitOffset, 1, code); // get remain bits, which is less then byte tmp = (m_bitOffset + 1) % 8; if(tmp) { CheckBitsLeft(tmp); GetNBits(m_pbs, m_bitOffset, tmp, code); if ((code << (8 - tmp)) & 0x7f) // most sig bit could be rbsp stop bit { m_pbs = ptr_state; m_bitOffset = bit_state; // there are more data return true; } } remaining_bytes = (int32_t)BytesLeft(); // run through remain bytes while (0 < remaining_bytes) { CheckBitsLeft(8); GetNBits(m_pbs, m_bitOffset, 8, code); if (code) { m_pbs = ptr_state; m_bitOffset = bit_state; // there are more data return true; } remaining_bytes -= 1; } return false; } H265HeadersBitstream::H265HeadersBitstream() : H265BaseBitstream() { } H265HeadersBitstream::H265HeadersBitstream(uint8_t * const pb, const uint32_t maxsize) : H265BaseBitstream(pb, maxsize) { } // Parse HRD information in VPS or in VUI block of SPS void H265HeadersBitstream::parseHrdParameters(H265HRD *hrd, uint8_t cprms_present_flag, uint32_t vps_max_sub_layers) { hrd->initial_cpb_removal_delay_length = 23 + 1; hrd->au_cpb_removal_delay_length = 23 + 1; hrd->dpb_output_delay_length = 23 + 1; if (cprms_present_flag) { hrd->nal_hrd_parameters_present_flag = Get1Bit(); hrd->vcl_hrd_parameters_present_flag = Get1Bit(); if (hrd->nal_hrd_parameters_present_flag || hrd->vcl_hrd_parameters_present_flag) { hrd->sub_pic_hrd_params_present_flag = Get1Bit(); if (hrd->sub_pic_hrd_params_present_flag) { hrd->tick_divisor = GetBits(8) + 2; hrd->du_cpb_removal_delay_increment_length = GetBits(5) + 1; hrd->sub_pic_cpb_params_in_pic_timing_sei_flag = Get1Bit(); hrd->dpb_output_delay_du_length = GetBits(5) + 1; } hrd->bit_rate_scale = GetBits(4); hrd->cpb_size_scale = GetBits(4); if (hrd->sub_pic_cpb_params_in_pic_timing_sei_flag) { hrd->cpb_size_du_scale = GetBits(4); } hrd->initial_cpb_removal_delay_length = GetBits(5) + 1; hrd->au_cpb_removal_delay_length = GetBits(5) + 1; hrd->dpb_output_delay_length = GetBits(5) + 1; } } for (uint32_t i = 0; i < vps_max_sub_layers; i++) { H265HrdSubLayerInfo * hrdSubLayerInfo = hrd->GetHRDSubLayerParam(i); hrdSubLayerInfo->fixed_pic_rate_general_flag = Get1Bit(); if (!hrdSubLayerInfo->fixed_pic_rate_general_flag) { hrdSubLayerInfo->fixed_pic_rate_within_cvs_flag = Get1Bit(); } else { hrdSubLayerInfo->fixed_pic_rate_within_cvs_flag = 1; } // Infered to be 0 when not present hrdSubLayerInfo->low_delay_hrd_flag = 0; hrdSubLayerInfo->cpb_cnt = 1; if (hrdSubLayerInfo->fixed_pic_rate_within_cvs_flag) { hrdSubLayerInfo->elemental_duration_in_tc = GetVLCElementU() + 1; } else { hrdSubLayerInfo->low_delay_hrd_flag = Get1Bit(); } if (!hrdSubLayerInfo->low_delay_hrd_flag) { hrdSubLayerInfo->cpb_cnt = GetVLCElementU() + 1; if (hrdSubLayerInfo->cpb_cnt > 32) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } for (uint32_t nalOrVcl = 0; nalOrVcl < 2; nalOrVcl++) { if((nalOrVcl == 0 && hrd->nal_hrd_parameters_present_flag) || (nalOrVcl == 1 && hrd->vcl_hrd_parameters_present_flag)) { for (uint32_t j = 0 ; j < hrdSubLayerInfo->cpb_cnt; j++) { hrdSubLayerInfo->bit_rate_value[j][nalOrVcl] = GetVLCElementU() + 1; hrdSubLayerInfo->cpb_size_value[j][nalOrVcl] = GetVLCElementU() + 1; if (hrd->sub_pic_hrd_params_present_flag) { hrdSubLayerInfo->bit_rate_du_value[j][nalOrVcl] = GetVLCElementU() + 1; hrdSubLayerInfo->cpb_size_du_value[j][nalOrVcl] = GetVLCElementU() + 1; } hrdSubLayerInfo->cbr_flag[j][nalOrVcl] = Get1Bit(); } } } } } // Part VPS header UMC::Status H265HeadersBitstream::GetVideoParamSet(H265VideoParamSet *pcVPS) { if (!pcVPS) throw h265_exception(UMC::UMC_ERR_NULL_PTR); UMC::Status ps = UMC::UMC_OK; pcVPS->vps_video_parameter_set_id = GetBits(4); int32_t vps_reserved_three_2bits = GetBits(2); assert(vps_reserved_three_2bits == 3); if (vps_reserved_three_2bits != 3) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcVPS->vps_max_layers = GetBits(6) + 1; // vps_max_layers_minus1 uint32_t vps_max_sub_layers_minus1 = GetBits(3); if (vps_max_sub_layers_minus1 > 6) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcVPS->vps_max_sub_layers = vps_max_sub_layers_minus1 + 1; pcVPS->vps_temporal_id_nesting_flag = Get1Bit(); if (pcVPS->vps_max_sub_layers == 1 && !pcVPS->vps_temporal_id_nesting_flag) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t vps_reserved_ffff_16bits = GetBits(16); assert(vps_reserved_ffff_16bits == 0xffff); if (vps_reserved_ffff_16bits != 0xffff) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); parsePTL(pcVPS->getPTL(), pcVPS->vps_max_sub_layers - 1); uint32_t vps_sub_layer_ordering_info_present_flag = Get1Bit();; for(uint32_t i = 0; i < pcVPS->vps_max_sub_layers; i++) { pcVPS->vps_max_dec_pic_buffering[i] = GetVLCElementU() + 1; if (pcVPS->vps_max_dec_pic_buffering[i] > 16) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcVPS->vps_num_reorder_pics[i] = GetVLCElementU(); if (pcVPS->vps_num_reorder_pics[i] > pcVPS->vps_max_dec_pic_buffering[i]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcVPS->vps_max_latency_increase[i] = GetVLCElementU() - 1; if (!vps_sub_layer_ordering_info_present_flag) { for (i++; i < pcVPS->vps_max_sub_layers; i++) { pcVPS->vps_max_dec_pic_buffering[i] = pcVPS->vps_max_dec_pic_buffering[0]; pcVPS->vps_num_reorder_pics[i] = pcVPS->vps_num_reorder_pics[0]; pcVPS->vps_max_latency_increase[i] = pcVPS->vps_max_latency_increase[0]; } break; } if (i > 0) { if (pcVPS->vps_max_dec_pic_buffering[i] < pcVPS->vps_max_dec_pic_buffering[i - 1] || pcVPS->vps_num_reorder_pics[i] < pcVPS->vps_num_reorder_pics[i - 1]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } pcVPS->vps_max_layer_id = GetBits(6); if (pcVPS->vps_max_layer_id >= MAX_NUH_LAYER_ID) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcVPS->vps_num_layer_sets = GetVLCElementU() + 1; if (pcVPS->vps_num_layer_sets > MAX_VPS_NUM_LAYER_SETS) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for (uint32_t opsIdx = 1; opsIdx < pcVPS->vps_num_layer_sets; opsIdx++) { for (uint32_t i = 0; i <= pcVPS->vps_max_layer_id; i++) // Operation point set { pcVPS->layer_id_included_flag[opsIdx][i] = Get1Bit(); } } H265TimingInfo *timingInfo = pcVPS->getTimingInfo(); timingInfo->vps_timing_info_present_flag = Get1Bit(); if (timingInfo->vps_timing_info_present_flag) { timingInfo->vps_num_units_in_tick = GetBits(32); timingInfo->vps_time_scale = GetBits(32); timingInfo->vps_poc_proportional_to_timing_flag = Get1Bit(); if (timingInfo->vps_poc_proportional_to_timing_flag) { timingInfo->vps_num_ticks_poc_diff_one = GetVLCElementU() + 1; } pcVPS->vps_num_hrd_parameters = GetVLCElementU(); if (pcVPS->vps_num_hrd_parameters > MAX_VPS_NUM_LAYER_SETS) // MAX_VPS_NUM_LAYER_SETS also equals 1024 throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcVPS->vps_num_hrd_parameters > 0) { pcVPS->createHrdParamBuffer(); pcVPS->cprms_present_flag[0] = 1; for (uint32_t i = 0; i < pcVPS->vps_num_hrd_parameters; i++) { pcVPS->hrd_layer_set_idx[i] = GetVLCElementU(); if (i > 0) { pcVPS->cprms_present_flag[i] = Get1Bit(); } parseHrdParameters(pcVPS->getHrdParameters(i), pcVPS->cprms_present_flag[i], pcVPS->vps_max_sub_layers); } } } uint8_t vps_extension_flag = Get1Bit(); if (vps_extension_flag) { while (MoreRbspData()) { Get1Bit(); // vps_extension_data_flag } } return ps; } // Parse scaling list data block void H265HeadersBitstream::xDecodeScalingList(H265ScalingList *scalingList, unsigned sizeId, unsigned listId) { assert(scalingList); int32_t i,coefNum = std::min(MAX_MATRIX_COEF_NUM,(int32_t)g_scalingListSize[sizeId]); int32_t nextCoef = SCALING_LIST_START_VALUE; const uint16_t *scan = (sizeId == 0) ? ScanTableDiag4x4 : g_sigLastScanCG32x32; int32_t *dst = scalingList->getScalingListAddress(sizeId, listId); if( sizeId > SCALING_LIST_8x8 ) { int32_t scaling_list_dc_coef_minus8 = GetVLCElementS(); if (scaling_list_dc_coef_minus8 < -7 || scaling_list_dc_coef_minus8 > 247) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); scalingList->setScalingListDC(sizeId, listId, scaling_list_dc_coef_minus8 + 8); nextCoef = scalingList->getScalingListDC(sizeId,listId); } for(i = 0; i < coefNum; i++) { int32_t scaling_list_delta_coef = GetVLCElementS(); if (scaling_list_delta_coef < -128 || scaling_list_delta_coef > 127) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); nextCoef = (nextCoef + scaling_list_delta_coef + 256 ) % 256; dst[scan[i]] = nextCoef; } } // Parse scaling list information in SPS or PPS void H265HeadersBitstream::parseScalingList(H265ScalingList *scalingList) { if (!scalingList) throw h265_exception(UMC::UMC_ERR_NULL_PTR); //for each size for(uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { for(uint32_t listId = 0; listId < g_scalingListNum[sizeId]; listId++) { uint8_t scaling_list_pred_mode_flag = Get1Bit(); if(!scaling_list_pred_mode_flag) //Copy Mode { uint32_t scaling_list_pred_matrix_id_delta = GetVLCElementU(); if (scaling_list_pred_matrix_id_delta > listId) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); scalingList->setRefMatrixId (sizeId, listId, listId-scaling_list_pred_matrix_id_delta); if (sizeId > SCALING_LIST_8x8) { scalingList->setScalingListDC(sizeId,listId,((listId == scalingList->getRefMatrixId (sizeId,listId))? 16 :scalingList->getScalingListDC(sizeId, scalingList->getRefMatrixId (sizeId,listId)))); } scalingList->processRefMatrix( sizeId, listId, scalingList->getRefMatrixId (sizeId,listId)); } else //DPCM Mode { xDecodeScalingList(scalingList, sizeId, listId); } } } } // Parse profile tier layers header part in VPS or SPS void H265HeadersBitstream::parsePTL(H265ProfileTierLevel *rpcPTL, int32_t maxNumSubLayersMinus1 ) { assert(rpcPTL); parseProfileTier(rpcPTL->GetGeneralPTL()); int32_t level_idc = GetBits(8); level_idc = ((level_idc*10) / 30); rpcPTL->GetGeneralPTL()->level_idc = level_idc; for(int32_t i = 0; i < maxNumSubLayersMinus1; i++) { if (Get1Bit()) rpcPTL->sub_layer_profile_present_flags |= 1 << i; if (Get1Bit()) rpcPTL->sub_layer_level_present_flag |= 1 << i; } if (maxNumSubLayersMinus1 > 0) { for (int32_t i = maxNumSubLayersMinus1; i < 8; i++) { uint32_t reserved_zero_2bits = GetBits(2); if (reserved_zero_2bits) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } for(int32_t i = 0; i < maxNumSubLayersMinus1; i++) { if (rpcPTL->sub_layer_profile_present_flags & (1 << i)) { parseProfileTier(rpcPTL->GetSubLayerPTL(i)); } if (rpcPTL->sub_layer_level_present_flag & (1 << i)) { level_idc = GetBits(8); level_idc = ((level_idc*10) / 30); rpcPTL->GetSubLayerPTL(i)->level_idc = level_idc; } } } // Parse one profile tier layer void H265HeadersBitstream::parseProfileTier(H265PTL *profileTierLevel) { assert(profileTierLevel); profileTierLevel->profile_space = GetBits(2); if (profileTierLevel->profile_space) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); profileTierLevel->tier_flag = Get1Bit(); profileTierLevel->profile_idc = GetBits(5); for(int32_t j = 0; j < 32; j++) { if (Get1Bit()) profileTierLevel->profile_compatibility_flags |= 1 << j; } if (!profileTierLevel->profile_idc) { profileTierLevel->profile_idc = H265_PROFILE_MAIN; for(int32_t j = 1; j < 32; j++) { if (profileTierLevel->profile_compatibility_flags & (1 << j)) { profileTierLevel->profile_idc = j; break; } } } if (profileTierLevel->profile_idc > H265_PROFILE_FREXT && profileTierLevel->profile_idc != H265_PROFILE_SCC) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); profileTierLevel->progressive_source_flag = Get1Bit(); profileTierLevel->interlaced_source_flag = Get1Bit(); profileTierLevel->non_packed_constraint_flag = Get1Bit(); profileTierLevel->frame_only_constraint_flag = Get1Bit(); uint8_t reserved_zero_bits_num = 44; //incl. general_inbld_flag if (profileTierLevel->profile_idc == H265_PROFILE_FREXT || (profileTierLevel->profile_compatibility_flags & (1 << 4)) || profileTierLevel->profile_idc == H265_PROFILE_SCC || (profileTierLevel->profile_compatibility_flags & (1 << 9))) { profileTierLevel->max_12bit_constraint_flag = Get1Bit(); profileTierLevel->max_10bit_constraint_flag = Get1Bit(); profileTierLevel->max_8bit_constraint_flag = Get1Bit(); profileTierLevel->max_422chroma_constraint_flag = Get1Bit(); profileTierLevel->max_420chroma_constraint_flag = Get1Bit(); profileTierLevel->max_monochrome_constraint_flag = Get1Bit(); profileTierLevel->intra_constraint_flag = Get1Bit(); profileTierLevel->one_picture_only_constraint_flag = Get1Bit(); profileTierLevel->lower_bit_rate_constraint_flag = Get1Bit(); if (profileTierLevel->profile_idc == H265_PROFILE_SCC || (profileTierLevel->profile_compatibility_flags & (1 << 9))) { profileTierLevel->max_14bit_constraint_flag = Get1Bit(); reserved_zero_bits_num = 34; } else reserved_zero_bits_num = 35; } uint32_t reserved_zero_bits; while (reserved_zero_bits_num > 32) { reserved_zero_bits = GetBits(32); reserved_zero_bits_num -= 32; //if (reserved_zero_bits) // throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } if (reserved_zero_bits_num) reserved_zero_bits = GetBits(reserved_zero_bits_num); std::ignore = reserved_zero_bits; } // Parse SPS header UMC::Status H265HeadersBitstream::GetSequenceParamSet(H265SeqParamSet *pcSPS) { if (!pcSPS) throw h265_exception(UMC::UMC_ERR_NULL_PTR); pcSPS->sps_video_parameter_set_id = GetBits(4); pcSPS->sps_max_sub_layers = GetBits(3) + 1; if (pcSPS->sps_max_sub_layers > 7) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_temporal_id_nesting_flag = Get1Bit(); if (pcSPS->sps_max_sub_layers == 1) { // sps_temporal_id_nesting_flag must be 1 when sps_max_sub_layers_minus1 is 0 if (pcSPS->sps_temporal_id_nesting_flag != 1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } parsePTL(pcSPS->getPTL(), pcSPS->sps_max_sub_layers - 1); pcSPS->sps_seq_parameter_set_id = (uint8_t)GetVLCElementU(); if (pcSPS->sps_seq_parameter_set_id > 15) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->chroma_format_idc = (uint8_t)GetVLCElementU(); if (pcSPS->chroma_format_idc > 3) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcSPS->chroma_format_idc == 3) { pcSPS->separate_colour_plane_flag = Get1Bit(); } pcSPS->ChromaArrayType = pcSPS->separate_colour_plane_flag ? 0 : pcSPS->chroma_format_idc; pcSPS->chromaShiftW = 1; pcSPS->chromaShiftH = pcSPS->ChromaArrayType == CHROMA_FORMAT_422 ? 0 : 1; pcSPS->pic_width_in_luma_samples = GetVLCElementU(); pcSPS->pic_height_in_luma_samples = GetVLCElementU(); pcSPS->conformance_window_flag = Get1Bit(); if (pcSPS->conformance_window_flag) { pcSPS->conf_win_left_offset = GetVLCElementU()*pcSPS->SubWidthC(); pcSPS->conf_win_right_offset = GetVLCElementU()*pcSPS->SubWidthC(); pcSPS->conf_win_top_offset = GetVLCElementU()*pcSPS->SubHeightC(); pcSPS->conf_win_bottom_offset = GetVLCElementU()*pcSPS->SubHeightC(); if (pcSPS->conf_win_left_offset + pcSPS->conf_win_right_offset >= pcSPS->pic_width_in_luma_samples) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcSPS->conf_win_top_offset + pcSPS->conf_win_bottom_offset >= pcSPS->pic_height_in_luma_samples) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } pcSPS->bit_depth_luma = GetVLCElementU() + 8; if (pcSPS->bit_depth_luma > 14) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->setQpBDOffsetY(6*(pcSPS->bit_depth_luma - 8)); pcSPS->bit_depth_chroma = GetVLCElementU() + 8; if (pcSPS->bit_depth_chroma > 14) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->setQpBDOffsetC(6*(pcSPS->bit_depth_chroma - 8)); if ((pcSPS->bit_depth_luma > 8 || pcSPS->bit_depth_chroma > 8) && pcSPS->m_pcPTL.GetGeneralPTL()->profile_idc < H265_PROFILE_MAIN10) pcSPS->m_pcPTL.GetGeneralPTL()->profile_idc = H265_PROFILE_MAIN10; if (pcSPS->m_pcPTL.GetGeneralPTL()->profile_idc == H265_PROFILE_MAIN10 || pcSPS->bit_depth_luma > 8 || pcSPS->bit_depth_chroma > 8) pcSPS->need16bitOutput = 1; pcSPS->log2_max_pic_order_cnt_lsb = 4 + GetVLCElementU(); if (pcSPS->log2_max_pic_order_cnt_lsb > 16) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_sub_layer_ordering_info_present_flag = Get1Bit(); for (uint32_t i = 0; i < pcSPS->sps_max_sub_layers; i++) { pcSPS->sps_max_dec_pic_buffering[i] = GetVLCElementU() + 1; if (pcSPS->sps_max_dec_pic_buffering[i] > 16) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_max_num_reorder_pics[i] = GetVLCElementU(); if (pcSPS->sps_max_num_reorder_pics[i] > pcSPS->sps_max_dec_pic_buffering[i]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_max_latency_increase[i] = GetVLCElementU() - 1; if (!pcSPS->sps_sub_layer_ordering_info_present_flag) { for (i++; i <= pcSPS->sps_max_sub_layers-1; i++) { pcSPS->sps_max_dec_pic_buffering[i] = pcSPS->sps_max_dec_pic_buffering[0]; pcSPS->sps_max_num_reorder_pics[i] = pcSPS->sps_max_num_reorder_pics[0]; pcSPS->sps_max_latency_increase[i] = pcSPS->sps_max_latency_increase[0]; } break; } if (i > 0) { if (pcSPS->sps_max_dec_pic_buffering[i] < pcSPS->sps_max_dec_pic_buffering[i - 1] || pcSPS->sps_max_num_reorder_pics[i] < pcSPS->sps_max_num_reorder_pics[i - 1]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } uint32_t const log2_min_luma_coding_block_size_minus3 = GetVLCElementU(); if (log2_min_luma_coding_block_size_minus3 > 3) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->log2_min_luma_coding_block_size = log2_min_luma_coding_block_size_minus3 + 3; uint32_t MinCbLog2SizeY = pcSPS->log2_min_luma_coding_block_size; uint32_t MinCbSizeY = 1 << pcSPS->log2_min_luma_coding_block_size; if ((pcSPS->pic_width_in_luma_samples % MinCbSizeY) || (pcSPS->pic_height_in_luma_samples % MinCbSizeY)) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t log2_diff_max_min_coding_block_size = GetVLCElementU(); if (log2_diff_max_min_coding_block_size > 3) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->log2_max_luma_coding_block_size = log2_diff_max_min_coding_block_size + pcSPS->log2_min_luma_coding_block_size; //CtbLog2SizeY = (log2_min_luma_coding_block_size_minus3 + 3) + log2_diff_max_min_luma_coding_block_size //7.3.2.2 eq. 7-10, 7-11 //CtbLog2SizeY derived according to active SPSs for the base layer shall be in the range of 4 to 6, inclusive. (A.2, main, main10, mainsp, rext profiles) if (pcSPS->log2_max_luma_coding_block_size < 4 || pcSPS->log2_max_luma_coding_block_size > 6) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->MaxCUSize = 1 << pcSPS->log2_max_luma_coding_block_size; pcSPS->log2_min_transform_block_size = GetVLCElementU() + 2; if (pcSPS->log2_min_transform_block_size >= MinCbLog2SizeY) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t log2_diff_max_min_transform_block_size = GetVLCElementU(); pcSPS->log2_max_transform_block_size = log2_diff_max_min_transform_block_size + pcSPS->log2_min_transform_block_size; pcSPS->m_maxTrSize = 1 << pcSPS->log2_max_transform_block_size; uint32_t CtbLog2SizeY = pcSPS->log2_max_luma_coding_block_size; if (pcSPS->log2_max_transform_block_size > std::min(5u, CtbLog2SizeY)) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->max_transform_hierarchy_depth_inter = GetVLCElementU(); pcSPS->max_transform_hierarchy_depth_intra = GetVLCElementU(); if (pcSPS->max_transform_hierarchy_depth_inter > CtbLog2SizeY - pcSPS->log2_min_transform_block_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcSPS->max_transform_hierarchy_depth_intra > CtbLog2SizeY - pcSPS->log2_min_transform_block_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t addCUDepth = 0; while((pcSPS->MaxCUSize >> log2_diff_max_min_coding_block_size) > (uint32_t)( 1 << ( pcSPS->log2_min_transform_block_size + addCUDepth))) { addCUDepth++; } pcSPS->AddCUDepth = addCUDepth; pcSPS->MaxCUDepth = log2_diff_max_min_coding_block_size + addCUDepth; pcSPS->MinCUSize = pcSPS->MaxCUSize >> pcSPS->MaxCUDepth; // BB: these parameters may be removed completly and replaced by the fixed values pcSPS->scaling_list_enabled_flag = Get1Bit(); if(pcSPS->scaling_list_enabled_flag) { pcSPS->sps_scaling_list_data_present_flag = Get1Bit(); if(pcSPS->sps_scaling_list_data_present_flag) { parseScalingList( pcSPS->getScalingList() ); } } pcSPS->amp_enabled_flag = Get1Bit(); pcSPS->sample_adaptive_offset_enabled_flag = Get1Bit(); pcSPS->pcm_enabled_flag = Get1Bit(); if(pcSPS->pcm_enabled_flag) { pcSPS->pcm_sample_bit_depth_luma = GetBits(4) + 1; pcSPS->pcm_sample_bit_depth_chroma = GetBits(4) + 1; if (pcSPS->pcm_sample_bit_depth_luma > pcSPS->bit_depth_luma || pcSPS->pcm_sample_bit_depth_chroma > pcSPS->bit_depth_chroma) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->log2_min_pcm_luma_coding_block_size = GetVLCElementU() + 3; if (pcSPS->log2_min_pcm_luma_coding_block_size < std::min(MinCbLog2SizeY, 5u) || pcSPS->log2_min_pcm_luma_coding_block_size > std::min(CtbLog2SizeY, 5u)) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->log2_max_pcm_luma_coding_block_size = GetVLCElementU() + pcSPS->log2_min_pcm_luma_coding_block_size; if (pcSPS->log2_max_pcm_luma_coding_block_size > std::min(CtbLog2SizeY, 5u)) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->pcm_loop_filter_disabled_flag = Get1Bit(); } pcSPS->num_short_term_ref_pic_sets = GetVLCElementU(); if (pcSPS->num_short_term_ref_pic_sets > 64) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->createRPSList(pcSPS->num_short_term_ref_pic_sets); ReferencePictureSetList* rpsList = pcSPS->getRPSList(); ReferencePictureSet* rps; for(uint32_t i = 0; i < rpsList->getNumberOfReferencePictureSets(); i++) { rps = rpsList->getReferencePictureSet(i); parseShortTermRefPicSet(pcSPS, rps, i); if (((uint32_t)rps->getNumberOfNegativePictures() > pcSPS->sps_max_dec_pic_buffering[pcSPS->sps_max_sub_layers - 1]) || ((uint32_t)rps->getNumberOfPositivePictures() > pcSPS->sps_max_dec_pic_buffering[pcSPS->sps_max_sub_layers - 1] - (uint32_t)rps->getNumberOfNegativePictures())) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } pcSPS->long_term_ref_pics_present_flag = Get1Bit(); if (pcSPS->long_term_ref_pics_present_flag) { pcSPS->num_long_term_ref_pics_sps = GetVLCElementU(); if (pcSPS->num_long_term_ref_pics_sps > 32) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for (uint32_t k = 0; k < pcSPS->num_long_term_ref_pics_sps; k++) { pcSPS->lt_ref_pic_poc_lsb_sps[k] = GetBits(pcSPS->log2_max_pic_order_cnt_lsb); pcSPS->used_by_curr_pic_lt_sps_flag[k] = Get1Bit(); } } pcSPS->sps_temporal_mvp_enabled_flag = Get1Bit(); pcSPS->sps_strong_intra_smoothing_enabled_flag = Get1Bit(); pcSPS->vui_parameters_present_flag = Get1Bit(); if (pcSPS->vui_parameters_present_flag) { parseVUI(pcSPS); } uint8_t sps_extension_present_flag = Get1Bit(); if (sps_extension_present_flag) { pcSPS->sps_range_extension_flag = Get1Bit(); GetBits(2); //skip sps_extension_2bits pcSPS->sps_scc_extension_flag = Get1Bit(); uint32_t sps_extension_4bits = GetBits(4); bool skip_extension_bits = !!sps_extension_4bits; if (pcSPS->sps_range_extension_flag) { pcSPS->transform_skip_rotation_enabled_flag = Get1Bit(); pcSPS->transform_skip_context_enabled_flag = Get1Bit(); pcSPS->implicit_residual_dpcm_enabled_flag = Get1Bit(); pcSPS->explicit_residual_dpcm_enabled_flag = Get1Bit(); pcSPS->extended_precision_processing_flag = Get1Bit(); pcSPS->intra_smoothing_disabled_flag = Get1Bit(); pcSPS->high_precision_offsets_enabled_flag = Get1Bit(); pcSPS->fast_rice_adaptation_enabled_flag = Get1Bit(); pcSPS->cabac_bypass_alignment_enabled_flag = Get1Bit(); } if (pcSPS->sps_scc_extension_flag) { if (pcSPS->getPTL()->GetGeneralPTL()->profile_idc != H265_PROFILE_SCC) skip_extension_bits = true; else { pcSPS->sps_curr_pic_ref_enabled_flag = Get1Bit(); pcSPS->palette_mode_enabled_flag = Get1Bit(); if (pcSPS->palette_mode_enabled_flag) { pcSPS->palette_max_size = GetVLCElementU(); if (pcSPS->palette_max_size > 64) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->delta_palette_max_predictor_size = GetVLCElementU(); if (!pcSPS->palette_max_size && pcSPS->delta_palette_max_predictor_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcSPS->delta_palette_max_predictor_size > 128 - pcSPS->palette_max_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_palette_predictor_initializer_present_flag = Get1Bit(); if (!pcSPS->palette_max_size && pcSPS->sps_palette_predictor_initializer_present_flag) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcSPS->sps_palette_predictor_initializer_present_flag) { uint32_t const PaletteMaxPredictorSize = pcSPS->palette_max_size + pcSPS->delta_palette_max_predictor_size; assert(PaletteMaxPredictorSize > 0); uint32_t const sps_num_palette_predictor_initializer_minus1 = GetVLCElementU(); if (sps_num_palette_predictor_initializer_minus1 > PaletteMaxPredictorSize - 1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->sps_num_palette_predictor_initializer = sps_num_palette_predictor_initializer_minus1 + 1; uint8_t const numComps = pcSPS->chroma_format_idc ? 3 : 1; pcSPS->m_paletteInitializers.resize(pcSPS->sps_num_palette_predictor_initializer * numComps); for (uint8_t i = 0; i < numComps; ++i) for (uint32_t j = 0; j < pcSPS->sps_num_palette_predictor_initializer; ++j) { uint32_t const num_bits = i == 0 ? pcSPS->bit_depth_luma : pcSPS->bit_depth_chroma; pcSPS->m_paletteInitializers[i * pcSPS->sps_num_palette_predictor_initializer + j] = GetBits(num_bits); } } } pcSPS->motion_vector_resolution_control_idc = GetBits(2); if (pcSPS->motion_vector_resolution_control_idc == 3) //value of 3 for motion_vector_resolution_control_idc is reserved for future use by spec. throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcSPS->intra_boundary_filtering_disabled_flag = Get1Bit(); } } if (skip_extension_bits) { while (MoreRbspData()) { Get1Bit(); //skip sps_extension_data_flag } } } return UMC::UMC_OK; } // GetSequenceParamSet // Parse video usability information block in SPS void H265HeadersBitstream::parseVUI(H265SeqParamSet *pSPS) { assert(pSPS); pSPS->aspect_ratio_info_present_flag = Get1Bit(); if (pSPS->aspect_ratio_info_present_flag) { pSPS->aspect_ratio_idc = GetBits(8); if (pSPS->aspect_ratio_idc == 255) { pSPS->sar_width = GetBits(16); pSPS->sar_height = GetBits(16); } else { if (!pSPS->aspect_ratio_idc || pSPS->aspect_ratio_idc >= sizeof(SAspectRatio)/sizeof(SAspectRatio[0])) { pSPS->aspect_ratio_idc = 0; pSPS->aspect_ratio_info_present_flag = 0; } else { pSPS->sar_width = SAspectRatio[pSPS->aspect_ratio_idc][0]; pSPS->sar_height = SAspectRatio[pSPS->aspect_ratio_idc][1]; } } } pSPS->overscan_info_present_flag = Get1Bit(); if (pSPS->overscan_info_present_flag) { pSPS->overscan_appropriate_flag = Get1Bit(); } pSPS->video_signal_type_present_flag = Get1Bit(); if (pSPS->video_signal_type_present_flag) { pSPS->video_format = GetBits(3); pSPS->video_full_range_flag = Get1Bit(); pSPS->colour_description_present_flag = Get1Bit(); if (pSPS->colour_description_present_flag) { pSPS->colour_primaries = GetBits(8); pSPS->transfer_characteristics = GetBits(8); pSPS->matrix_coeffs = GetBits(8); } } pSPS->chroma_loc_info_present_flag = Get1Bit(); if (pSPS->chroma_loc_info_present_flag) { pSPS->chroma_sample_loc_type_top_field = GetVLCElementU(); pSPS->chroma_sample_loc_type_bottom_field = GetVLCElementU(); } pSPS->neutral_chroma_indication_flag = Get1Bit(); pSPS->field_seq_flag = Get1Bit(); pSPS->frame_field_info_present_flag = Get1Bit(); pSPS->default_display_window_flag = Get1Bit(); if (pSPS->default_display_window_flag) { pSPS->def_disp_win_left_offset = GetVLCElementU()*pSPS->SubWidthC(); pSPS->def_disp_win_right_offset = GetVLCElementU()*pSPS->SubWidthC(); pSPS->def_disp_win_top_offset = GetVLCElementU()*pSPS->SubHeightC(); pSPS->def_disp_win_bottom_offset = GetVLCElementU()*pSPS->SubHeightC(); if (pSPS->def_disp_win_left_offset + pSPS->def_disp_win_right_offset >= pSPS->pic_width_in_luma_samples) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pSPS->def_disp_win_top_offset + pSPS->def_disp_win_bottom_offset >= pSPS->pic_height_in_luma_samples) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } H265TimingInfo *timingInfo = pSPS->getTimingInfo(); timingInfo->vps_timing_info_present_flag = Get1Bit(); if (timingInfo->vps_timing_info_present_flag) { timingInfo->vps_num_units_in_tick = GetBits(32); timingInfo->vps_time_scale = GetBits(32); timingInfo->vps_poc_proportional_to_timing_flag = Get1Bit(); if (timingInfo->vps_poc_proportional_to_timing_flag) { timingInfo->vps_num_ticks_poc_diff_one = GetVLCElementU() + 1; } pSPS->vui_hrd_parameters_present_flag = Get1Bit(); if (pSPS->vui_hrd_parameters_present_flag) { parseHrdParameters( pSPS->getHrdParameters(), 1, pSPS->sps_max_sub_layers); } } pSPS->bitstream_restriction_flag = Get1Bit(); if (pSPS->bitstream_restriction_flag) { pSPS->tiles_fixed_structure_flag = Get1Bit(); pSPS->motion_vectors_over_pic_boundaries_flag = Get1Bit(); pSPS->restricted_ref_pic_lists_flag = Get1Bit(); pSPS->min_spatial_segmentation_idc = GetVLCElementU(); pSPS->max_bytes_per_pic_denom = GetVLCElementU(); pSPS->max_bits_per_min_cu_denom = GetVLCElementU(); pSPS->log2_max_mv_length_horizontal = GetVLCElementU(); pSPS->log2_max_mv_length_vertical = GetVLCElementU(); } } // Reserved for future header extensions bool H265HeadersBitstream::MoreRbspData() { return false; } // Parse PPS header void H265HeadersBitstream::GetPictureParamSetPart1(H265PicParamSet *pcPPS) { if (!pcPPS) throw h265_exception(UMC::UMC_ERR_NULL_PTR); pcPPS->pps_pic_parameter_set_id = GetVLCElementU(); if (pcPPS->pps_pic_parameter_set_id > 63) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_seq_parameter_set_id = GetVLCElementU(); if (pcPPS->pps_seq_parameter_set_id > 15) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } UMC::Status H265HeadersBitstream::GetPictureParamSetFull(H265PicParamSet *pcPPS, H265SeqParamSet const* pcSPS) { if (!pcPPS) throw h265_exception(UMC::UMC_ERR_NULL_PTR); if (!pcSPS) throw h265_exception(UMC::UMC_ERR_NULL_PTR); pcPPS->dependent_slice_segments_enabled_flag = Get1Bit(); pcPPS->output_flag_present_flag = Get1Bit(); pcPPS->num_extra_slice_header_bits = GetBits(3); pcPPS->sign_data_hiding_enabled_flag = Get1Bit(); pcPPS->cabac_init_present_flag = Get1Bit(); pcPPS->num_ref_idx_l0_default_active = GetVLCElementU() + 1; if (pcPPS->num_ref_idx_l0_default_active > 15) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->num_ref_idx_l1_default_active = GetVLCElementU() + 1; if (pcPPS->num_ref_idx_l1_default_active > 15) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->init_qp = (int8_t)(GetVLCElementS() + 26); pcPPS->constrained_intra_pred_flag = Get1Bit(); pcPPS->transform_skip_enabled_flag = Get1Bit(); pcPPS->cu_qp_delta_enabled_flag = Get1Bit(); if( pcPPS->cu_qp_delta_enabled_flag ) { pcPPS->diff_cu_qp_delta_depth = GetVLCElementU(); } else { pcPPS->diff_cu_qp_delta_depth = 0; } pcPPS->pps_cb_qp_offset = GetVLCElementS(); if (pcPPS->pps_cb_qp_offset < -12 || pcPPS->pps_cb_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_cr_qp_offset = GetVLCElementS(); if (pcPPS->pps_cr_qp_offset < -12 || pcPPS->pps_cr_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_slice_chroma_qp_offsets_present_flag = Get1Bit(); pcPPS->weighted_pred_flag = Get1Bit(); pcPPS->weighted_bipred_flag = Get1Bit(); pcPPS->transquant_bypass_enabled_flag = Get1Bit(); pcPPS->tiles_enabled_flag = Get1Bit(); pcPPS->entropy_coding_sync_enabled_flag = Get1Bit(); if (pcPPS->tiles_enabled_flag) { pcPPS->num_tile_columns = GetVLCElementU() + 1; pcPPS->num_tile_rows = GetVLCElementU() + 1; if (pcPPS->num_tile_columns == 1 && pcPPS->num_tile_rows == 1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->uniform_spacing_flag = Get1Bit(); if (!pcPPS->uniform_spacing_flag) { pcPPS->column_width.resize(pcPPS->num_tile_columns); for (uint32_t i=0; i < pcPPS->num_tile_columns - 1; i++) { pcPPS->column_width[i] = GetVLCElementU() + 1; } pcPPS->row_height.resize(pcPPS->num_tile_rows); for (uint32_t i=0; i < pcPPS->num_tile_rows - 1; i++) { pcPPS->row_height[i] = GetVLCElementU() + 1; } } if (pcPPS->num_tile_columns - 1 != 0 || pcPPS->num_tile_rows - 1 != 0) { pcPPS->loop_filter_across_tiles_enabled_flag = Get1Bit(); } } else { pcPPS->num_tile_columns = 1; pcPPS->num_tile_rows = 1; } pcPPS->pps_loop_filter_across_slices_enabled_flag = Get1Bit(); pcPPS->deblocking_filter_control_present_flag = Get1Bit(); if (pcPPS->deblocking_filter_control_present_flag) { pcPPS->deblocking_filter_override_enabled_flag = Get1Bit(); pcPPS->pps_deblocking_filter_disabled_flag = Get1Bit(); if (!pcPPS->pps_deblocking_filter_disabled_flag) { pcPPS->pps_beta_offset = GetVLCElementS() << 1; pcPPS->pps_tc_offset = GetVLCElementS() << 1; if (pcPPS->pps_beta_offset < -12 || pcPPS->pps_beta_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcPPS->pps_tc_offset < -12 || pcPPS->pps_tc_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } pcPPS->pps_scaling_list_data_present_flag = Get1Bit(); if(pcPPS->pps_scaling_list_data_present_flag) { parseScalingList( pcPPS->getScalingList() ); } pcPPS->lists_modification_present_flag = Get1Bit(); pcPPS->log2_parallel_merge_level = GetVLCElementU() + 2; pcPPS->slice_segment_header_extension_present_flag = Get1Bit(); uint8_t pps_extension_present_flag = Get1Bit(); if (pps_extension_present_flag) { pcPPS->pps_range_extensions_flag = Get1Bit(); GetBits(2); //skip pps_extension_2bits pcPPS->pps_scc_extension_flag = Get1Bit(); uint32_t pps_extension_4bits = GetBits(4); bool skip_extension_bits = !!pps_extension_4bits; if (pcPPS->pps_range_extensions_flag) { if (pcPPS->transform_skip_enabled_flag) { pcPPS->log2_max_transform_skip_block_size_minus2 = GetVLCElementU(); } pcPPS->cross_component_prediction_enabled_flag = Get1Bit(); pcPPS->chroma_qp_offset_list_enabled_flag = Get1Bit(); if (pcPPS->chroma_qp_offset_list_enabled_flag) { pcPPS->diff_cu_chroma_qp_offset_depth = GetVLCElementU(); pcPPS->chroma_qp_offset_list_len = GetVLCElementU() + 1; if (pcPPS->chroma_qp_offset_list_len > 6) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for (uint32_t i = 0; i < pcPPS->chroma_qp_offset_list_len; i++) { pcPPS->cb_qp_offset_list[i + 1] = GetVLCElementS(); pcPPS->cr_qp_offset_list[i + 1] = GetVLCElementS(); if (pcPPS->cb_qp_offset_list[i + 1] < -12 || pcPPS->cb_qp_offset_list[i + 1] > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcPPS->cr_qp_offset_list[i + 1] < -12 || pcPPS->cr_qp_offset_list[i + 1] > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } pcPPS->log2_sao_offset_scale_luma = GetVLCElementU(); pcPPS->log2_sao_offset_scale_chroma = GetVLCElementU(); } if (pcPPS->pps_scc_extension_flag) { if (pcSPS->getPTL()->GetGeneralPTL()->profile_idc != H265_PROFILE_SCC) skip_extension_bits = true; else { pcPPS->pps_curr_pic_ref_enabled_flag = Get1Bit(); pcPPS->residual_adaptive_colour_transform_enabled_flag = Get1Bit(); if (pcPPS->residual_adaptive_colour_transform_enabled_flag) { pcPPS->pps_slice_act_qp_offsets_present_flag = Get1Bit(); int32_t const pps_act_y_qp_offset_plus5 = GetVLCElementS(); if (pps_act_y_qp_offset_plus5 < -7 || pps_act_y_qp_offset_plus5 > 17) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_act_y_qp_offset = pps_act_y_qp_offset_plus5 - 5; int32_t const pps_act_cb_qp_offset_plus5 = GetVLCElementS(); if (pps_act_cb_qp_offset_plus5 < -7 || pps_act_cb_qp_offset_plus5 > 17) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_act_cb_qp_offset = pps_act_cb_qp_offset_plus5 - 5; int32_t const pps_act_cr_qp_offset_plus3 = GetVLCElementS(); if (pps_act_cr_qp_offset_plus3 < -9 || pps_act_cr_qp_offset_plus3 > 15) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_act_cr_qp_offset = pps_act_cr_qp_offset_plus3 - 3; } pcPPS->pps_palette_predictor_initializer_present_flag = Get1Bit(); if (pcPPS->pps_palette_predictor_initializer_present_flag) { if (pcSPS->palette_max_size == 0 || !pcSPS->palette_mode_enabled_flag) //pps_palette_predictor_initializer_present_flag shall be equal to 0 when either palette_max_size is equal to 0 or palette_mode_enabled_flag is equal to 0 throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->pps_num_palette_predictor_initializer = GetVLCElementU(); if (pcPPS->pps_num_palette_predictor_initializer > 128) //accord. to spec. pps_num_palette_predictor_initializer can't exceed PaletteMaxPredictorSize //that's checked at [supplayer :: xDecodePPS] throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pcPPS->pps_num_palette_predictor_initializer) { pcPPS->monochrome_palette_flag = Get1Bit(); uint32_t const luma_bit_depth_entry_minus8 = GetVLCElementU(); if (luma_bit_depth_entry_minus8 > 6) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->luma_bit_depth_entry = luma_bit_depth_entry_minus8 + 8; if (!pcPPS->monochrome_palette_flag) { uint32_t const chroma_bit_depth_entry_minus8 = GetVLCElementU(); if (chroma_bit_depth_entry_minus8 > 6) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pcPPS->chroma_bit_depth_entry = chroma_bit_depth_entry_minus8 + 8; } uint8_t const numComps = pcPPS->monochrome_palette_flag ? 1 : 3; pcPPS->m_paletteInitializers.resize(pcPPS->pps_num_palette_predictor_initializer * numComps); for (uint8_t i = 0; i < numComps; ++i) for (uint32_t j = 0; j < pcPPS->pps_num_palette_predictor_initializer; ++j) { uint32_t const num_bits = i == 0 ? pcPPS->luma_bit_depth_entry : pcPPS->chroma_bit_depth_entry; pcPPS->m_paletteInitializers[i * pcPPS->pps_num_palette_predictor_initializer + j] = GetBits(num_bits); } } } } } if (skip_extension_bits) { while (MoreRbspData()) { Get1Bit(); //skip pps_extension_data_flag } } } return UMC::UMC_OK; } // H265HeadersBitstream::GetPictureParamSetFull // Parse weighted prediction table in slice header void H265HeadersBitstream::xParsePredWeightTable(const H265SeqParamSet *sps, H265SliceHeader * sliceHdr) { assert(sps); assert(sliceHdr); wpScalingParam* wp; SliceType eSliceType = sliceHdr->slice_type; int32_t iNbRef = (eSliceType == B_SLICE ) ? (2) : (1); int32_t iPresent = 0; sliceHdr->luma_log2_weight_denom = GetVLCElementU(); // used in HW decoder if (sliceHdr->luma_log2_weight_denom > 7) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (sps->ChromaArrayType) { int32_t delta_chroma_log2_weight_denom = GetVLCElementS(); if (delta_chroma_log2_weight_denom + (int32_t)sliceHdr->luma_log2_weight_denom < 0) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->chroma_log2_weight_denom = (uint32_t)(delta_chroma_log2_weight_denom + sliceHdr->luma_log2_weight_denom); } else sliceHdr->chroma_log2_weight_denom = 0; if (sliceHdr->chroma_log2_weight_denom > 7) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for (int32_t iNumRef = 0; iNumRef < iNbRef; iNumRef++ ) { unsigned uTotalSignalledWeightFlags = 0; EnumRefPicList eRefPicList = ( iNumRef ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); for (int32_t iRefIdx = 0; iRefIdx < sliceHdr->m_numRefIdx[eRefPicList]; iRefIdx++ ) { wp = sliceHdr->pred_weight_table[eRefPicList][iRefIdx]; wp[0].log2_weight_denom = sliceHdr->luma_log2_weight_denom; wp[1].log2_weight_denom = sliceHdr->chroma_log2_weight_denom; wp[2].log2_weight_denom = sliceHdr->chroma_log2_weight_denom; if (sliceHdr->m_RefPOCList[eRefPicList][iRefIdx] == sliceHdr->m_poc) { iPresent = 0; } else { iPresent = Get1Bit(); } wp[0].present_flag = (iPresent == 1); // luma_weight_lX_flag uTotalSignalledWeightFlags += wp[0].present_flag; } if (sps->ChromaArrayType) { for (int32_t iRefIdx=0 ; iRefIdx < sliceHdr->m_numRefIdx[eRefPicList] ; iRefIdx++ ) { wp = sliceHdr->pred_weight_table[eRefPicList][iRefIdx]; if (sliceHdr->m_RefPOCList[eRefPicList][iRefIdx] == sliceHdr->m_poc) { iPresent = 0; } else { iPresent = Get1Bit(); } wp[1].present_flag = wp[2].present_flag = (iPresent == 1); // chroma_weight_lX_flag uTotalSignalledWeightFlags += 2*wp[1].present_flag; } } for (int32_t iRefIdx=0 ; iRefIdx < sliceHdr->m_numRefIdx[eRefPicList]; iRefIdx++ ) { wp = sliceHdr->pred_weight_table[eRefPicList][iRefIdx]; if ( wp[0].present_flag ) { wp[0].delta_weight = GetVLCElementS(); // se(v): delta_luma_weight_l0[i] if (wp[0].delta_weight < -128 || wp[0].delta_weight > 127) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); wp[0].weight = (wp[0].delta_weight + (1<ChromaArrayType) { if (wp[1].present_flag) { for (int32_t j = 1; j < 3; j++) { wp[j].delta_weight = GetVLCElementS(); // se(v): chroma_weight_l0[i][j] if (wp[j].delta_weight < -128 || wp[j].delta_weight > 127) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); wp[j].weight = (wp[j].delta_weight + (1<high_precision_offsets_enabled_flag ? (1 << sps->bit_depth_chroma) / 2 : 128; int32_t const pred = ( range - ( ( range * wp[j].weight) >> (wp[j].log2_weight_denom) ) ); wp[j].offset = mfx::clamp(delta_chroma_offset_lX + pred, -range, range - 1); } } else { for (int32_t j = 1; j < 3; j++) { wp[j].weight = (1 << wp[j].log2_weight_denom); wp[j].offset = 0; } } } } for (int32_t iRefIdx = sliceHdr->m_numRefIdx[eRefPicList]; iRefIdx < MAX_NUM_REF_PICS; iRefIdx++) { wp = sliceHdr->pred_weight_table[eRefPicList][iRefIdx]; wp[0].present_flag = false; wp[1].present_flag = false; wp[2].present_flag = false; } if (uTotalSignalledWeightFlags > 24) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } // Parse slice header part which contains PPS ID UMC::Status H265HeadersBitstream::GetSliceHeaderPart1(H265SliceHeader * sliceHdr) { if (!sliceHdr) throw h265_exception(UMC::UMC_ERR_NULL_PTR); sliceHdr->IdrPicFlag = (sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_IDR_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_IDR_N_LP) ? 1 : 0; sliceHdr->first_slice_segment_in_pic_flag = Get1Bit(); if ( sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_IDR_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_IDR_N_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_CRA ) { sliceHdr->no_output_of_prior_pics_flag = Get1Bit(); } sliceHdr->slice_pic_parameter_set_id = (uint16_t)GetVLCElementU(); if (sliceHdr->slice_pic_parameter_set_id > 63) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); return UMC::UMC_OK; } // Parse remaining of slice header after GetSliceHeaderPart1 void H265HeadersBitstream::decodeSlice(H265Slice *pSlice, const H265SeqParamSet *sps, const H265PicParamSet *pps, PocDecoding *pocDecoding) { if (!pSlice || !pps || !sps) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); H265SliceHeader * sliceHdr = pSlice->GetSliceHeader(); sliceHdr->collocated_from_l0_flag = 1; if (pps->dependent_slice_segments_enabled_flag && !sliceHdr->first_slice_segment_in_pic_flag) { sliceHdr->dependent_slice_segment_flag = Get1Bit(); } else { sliceHdr->dependent_slice_segment_flag = 0; } uint32_t numCTUs = ((sps->pic_width_in_luma_samples + sps->MaxCUSize-1)/sps->MaxCUSize)*((sps->pic_height_in_luma_samples + sps->MaxCUSize-1)/sps->MaxCUSize); int32_t maxParts = 1<<(sps->MaxCUDepth<<1); uint32_t bitsSliceSegmentAddress = 0; while (numCTUs > uint32_t(1<first_slice_segment_in_pic_flag) { sliceHdr->slice_segment_address = GetBits(bitsSliceSegmentAddress); if (sliceHdr->slice_segment_address >= numCTUs) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } //set uiCode to equal slice start address (or dependent slice start address) int32_t startCuAddress = maxParts*sliceHdr->slice_segment_address; sliceHdr->m_sliceSegmentCurStartCUAddr = startCuAddress; sliceHdr->m_sliceSegmentCurEndCUAddr = (numCTUs - 1) *maxParts; // DO NOT REMOVE THIS LINE !!!!!!!!!!!!!!!!!!!!!!!!!! if (!sliceHdr->dependent_slice_segment_flag) { sliceHdr->SliceCurStartCUAddr = startCuAddress; } if (!sliceHdr->dependent_slice_segment_flag) { for (uint32_t i = 0; i < pps->num_extra_slice_header_bits; i++) { Get1Bit(); //slice_reserved_undetermined_flag } sliceHdr->slice_type = (SliceType)GetVLCElementU(); if (sliceHdr->slice_type > I_SLICE || sliceHdr->slice_type < B_SLICE) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } if(!sliceHdr->dependent_slice_segment_flag) { if (pps->output_flag_present_flag) { sliceHdr->pic_output_flag = Get1Bit(); } else { sliceHdr->pic_output_flag = 1; } if (sps->separate_colour_plane_flag == 1) { sliceHdr->colour_plane_id = GetBits(2); } if (sliceHdr->IdrPicFlag) { sliceHdr->slice_pic_order_cnt_lsb = 0; sliceHdr->m_poc = 0; ReferencePictureSet* rps = pSlice->getRPS(); rps->num_negative_pics = 0; rps->num_positive_pics = 0; rps->setNumberOfLongtermPictures(0); rps->num_pics = 0; } else { sliceHdr->slice_pic_order_cnt_lsb = GetBits(sps->log2_max_pic_order_cnt_lsb); int32_t PicOrderCntMsb; int32_t slice_pic_order_cnt_lsb = sliceHdr->slice_pic_order_cnt_lsb; int32_t MaxPicOrderCntLsb = 1 << sps->log2_max_pic_order_cnt_lsb; int32_t prevPicOrderCntLsb = pocDecoding->prevPocPicOrderCntLsb; int32_t prevPicOrderCntMsb = pocDecoding->prevPicOrderCntMsb; if ((slice_pic_order_cnt_lsb < prevPicOrderCntLsb) && ((prevPicOrderCntLsb - slice_pic_order_cnt_lsb) >= (MaxPicOrderCntLsb / 2))) { PicOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb; } else if ((slice_pic_order_cnt_lsb > prevPicOrderCntLsb) && ((slice_pic_order_cnt_lsb - prevPicOrderCntLsb) > (MaxPicOrderCntLsb / 2))) { PicOrderCntMsb = prevPicOrderCntMsb - MaxPicOrderCntLsb; } else { PicOrderCntMsb = prevPicOrderCntMsb; } if (sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP) { // For BLA picture types, POCmsb is set to 0. PicOrderCntMsb = 0; } sliceHdr->m_poc = PicOrderCntMsb + slice_pic_order_cnt_lsb; sliceHdr->short_term_ref_pic_set_sps_flag = Get1Bit(); if (!sliceHdr->short_term_ref_pic_set_sps_flag) // short term ref pic is signalled { size_t bitsDecoded = BitsDecoded(); ReferencePictureSet* rps = pSlice->getRPS(); parseShortTermRefPicSet(sps, rps, sps->getRPSList()->getNumberOfReferencePictureSets()); if (((uint32_t)rps->getNumberOfNegativePictures() > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1]) || ((uint32_t)rps->getNumberOfPositivePictures() > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1] - (uint32_t)rps->getNumberOfNegativePictures())) { pSlice->m_bError = true; if (sliceHdr->slice_type != I_SLICE) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); rps->num_negative_pics = 0; rps->num_positive_pics = 0; rps->num_pics = 0; } sliceHdr->wNumBitsForShortTermRPSInSlice = (int32_t)(BitsDecoded() - bitsDecoded); } else // reference to ST ref pic set in PPS { int32_t numBits = 0; while ((uint32_t)(1 << numBits) < sps->getRPSList()->getNumberOfReferencePictureSets()) numBits++; sliceHdr->wNumBitsForShortTermRPSInSlice = 0; uint32_t short_term_ref_pic_set_idx = numBits > 0 ? GetBits(numBits) : 0; if (short_term_ref_pic_set_idx >= sps->getRPSList()->getNumberOfReferencePictureSets()) { pSlice->m_bError = true; if (sliceHdr->slice_type != I_SLICE) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } else { *pSlice->getRPS() = *sps->getRPSList()->getReferencePictureSet(short_term_ref_pic_set_idx); } } if (sps->long_term_ref_pics_present_flag) { ReferencePictureSet* rps = pSlice->getRPS(); int32_t offset = rps->getNumberOfNegativePictures()+rps->getNumberOfPositivePictures(); if (sps->num_long_term_ref_pics_sps > 0) { rps->num_long_term_sps = GetVLCElementU(); if (rps->num_long_term_sps > sps->num_long_term_ref_pics_sps) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); rps->setNumberOfLongtermPictures(rps->num_long_term_sps); } rps->num_long_term_pics = GetVLCElementU(); if (rps->num_long_term_pics > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); rps->setNumberOfLongtermPictures(rps->num_long_term_sps + rps->num_long_term_pics); if (offset + rps->num_long_term_sps + rps->num_long_term_pics > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for(uint32_t j = offset, k = 0; k < rps->num_long_term_sps + rps->num_long_term_pics; j++, k++) { int32_t pocLsbLt; if (k < rps->num_long_term_sps) { uint32_t lt_idx_sps = 0; if (sps->num_long_term_ref_pics_sps > 1) { uint32_t bitsForLtrpInSPS = 0; while (sps->num_long_term_ref_pics_sps > (uint32_t)(1 << bitsForLtrpInSPS)) bitsForLtrpInSPS++; lt_idx_sps = GetBits(bitsForLtrpInSPS); } pocLsbLt = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps]; rps->used_by_curr_pic_flag[j] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps]; } else { uint32_t poc_lsb_lt = GetBits(sps->log2_max_pic_order_cnt_lsb); pocLsbLt = poc_lsb_lt; rps->used_by_curr_pic_flag[j] = Get1Bit(); } rps->poc_lbs_lt[j] = pocLsbLt; rps->delta_poc_msb_present_flag[j] = Get1Bit(); if (rps->delta_poc_msb_present_flag[j]) { rps->delta_poc_msb_cycle_lt[j] = (uint8_t)GetVLCElementU(); } } offset += rps->getNumberOfLongtermPictures(); rps->num_pics = offset; } if ( sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP ) { ReferencePictureSet* rps = pSlice->getRPS(); rps->num_negative_pics = 0; rps->num_positive_pics = 0; rps->setNumberOfLongtermPictures(0); rps->num_pics = 0; } if (sps->sps_temporal_mvp_enabled_flag) { sliceHdr->slice_temporal_mvp_enabled_flag = Get1Bit(); } } if (sps->sample_adaptive_offset_enabled_flag) { sliceHdr->slice_sao_luma_flag = Get1Bit(); if (sps->ChromaArrayType) sliceHdr->slice_sao_chroma_flag = Get1Bit(); } if (sliceHdr->slice_type != I_SLICE) { uint8_t num_ref_idx_active_override_flag = Get1Bit(); if (num_ref_idx_active_override_flag) { uint32_t const num_ref_idx_l0_default_active_minus1 = GetVLCElementU(); if (num_ref_idx_l0_default_active_minus1 > 14) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->m_numRefIdx[REF_PIC_LIST_0] = num_ref_idx_l0_default_active_minus1 + 1; if (sliceHdr->slice_type == B_SLICE) { uint32_t const num_ref_idx_l1_default_active_minus1 = GetVLCElementU(); if (num_ref_idx_l1_default_active_minus1 > 14) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->m_numRefIdx[REF_PIC_LIST_1] = num_ref_idx_l1_default_active_minus1 + 1; } } else { sliceHdr->m_numRefIdx[REF_PIC_LIST_0] = pps->num_ref_idx_l0_default_active; if (sliceHdr->slice_type == B_SLICE) { sliceHdr->m_numRefIdx[REF_PIC_LIST_1] = pps->num_ref_idx_l1_default_active; } } } RefPicListModification* refPicListModification = &sliceHdr->m_RefPicListModification; if(sliceHdr->slice_type != I_SLICE) { if (!pps->lists_modification_present_flag || pSlice->getNumRpsCurrTempList() <= 1 ) { refPicListModification->ref_pic_list_modification_flag_l0 = 0; } else { refPicListModification->ref_pic_list_modification_flag_l0 = Get1Bit(); } if(refPicListModification->ref_pic_list_modification_flag_l0) { int32_t i = 0; int32_t numRpsCurrTempList0 = pSlice->getNumRpsCurrTempList(); if ( numRpsCurrTempList0 > 1 ) { int32_t length = 1; numRpsCurrTempList0 --; while ( numRpsCurrTempList0 >>= 1) { length ++; } for (i = 0; i < pSlice->getNumRefIdx(REF_PIC_LIST_0); i ++) { refPicListModification->list_entry_l0[i] = GetBits(length); } } else { for (i = 0; i < pSlice->getNumRefIdx(REF_PIC_LIST_0); i ++) { refPicListModification->list_entry_l0[i] = 0; } } } } else { refPicListModification->ref_pic_list_modification_flag_l0 = 0; } if (sliceHdr->slice_type == B_SLICE) { if( !pps->lists_modification_present_flag || pSlice->getNumRpsCurrTempList() <= 1 ) { refPicListModification->ref_pic_list_modification_flag_l1 = 0; } else { refPicListModification->ref_pic_list_modification_flag_l1 = Get1Bit(); } if(refPicListModification->ref_pic_list_modification_flag_l1) { int32_t i = 0; int32_t numRpsCurrTempList1 = pSlice->getNumRpsCurrTempList(); if ( numRpsCurrTempList1 > 1 ) { int32_t length = 1; numRpsCurrTempList1 --; while ( numRpsCurrTempList1 >>= 1) { length ++; } for (i = 0; i < pSlice->getNumRefIdx(REF_PIC_LIST_1); i ++) { refPicListModification->list_entry_l1[i] = GetBits(length); } } else { for (i = 0; i < pSlice->getNumRefIdx(REF_PIC_LIST_1); i ++) { refPicListModification->list_entry_l1[i] = 0; } } } } else { refPicListModification->ref_pic_list_modification_flag_l1 = 0; } // RefPicList sanity check { ReferencePictureSet const* rps = pSlice->getRPS(); assert(rps); uint32_t numPicTotalCurr = rps->getNumberOfUsedPictures(); if (pps->pps_curr_pic_ref_enabled_flag) numPicTotalCurr++; //7.4.7.2 value of list_entry_l0/list_entry_l1[ i ] shall be in the range of 0 to NumPicTotalCurr - 1, inclusive for (int32_t idx = 0; idx < pSlice->getNumRefIdx(REF_PIC_LIST_0); idx++) { if (refPicListModification->list_entry_l0[idx] >= numPicTotalCurr) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } for (int32_t idx = 0; idx < pSlice->getNumRefIdx(REF_PIC_LIST_1); idx++) { if (refPicListModification->list_entry_l1[idx] >= numPicTotalCurr) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } if (sliceHdr->slice_type == B_SLICE) { sliceHdr->mvd_l1_zero_flag = Get1Bit(); } sliceHdr->cabac_init_flag = false; // default if(pps->cabac_init_present_flag && sliceHdr->slice_type != I_SLICE) { sliceHdr->cabac_init_flag = Get1Bit(); } if (sliceHdr->slice_temporal_mvp_enabled_flag) { if ( sliceHdr->slice_type == B_SLICE ) { sliceHdr->collocated_from_l0_flag = Get1Bit(); } else { sliceHdr->collocated_from_l0_flag = 1; } if (sliceHdr->slice_type != I_SLICE && ((sliceHdr->collocated_from_l0_flag==1 && pSlice->getNumRefIdx(REF_PIC_LIST_0)>1)|| (sliceHdr->collocated_from_l0_flag ==0 && pSlice->getNumRefIdx(REF_PIC_LIST_1)>1))) { sliceHdr->collocated_ref_idx = GetVLCElementU(); if (sliceHdr->collocated_ref_idx >= (uint32_t)sliceHdr->m_numRefIdx[sliceHdr->collocated_from_l0_flag ? REF_PIC_LIST_0 : REF_PIC_LIST_1]) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } else { sliceHdr->collocated_ref_idx = 0; } } if (sliceHdr->slice_type != I_SLICE) { pSlice->setRefPOCListSliceHeader(); } if ((pps->weighted_pred_flag && sliceHdr->slice_type == P_SLICE) || (pps->weighted_bipred_flag && sliceHdr->slice_type == B_SLICE)) { xParsePredWeightTable(sps, sliceHdr); } if (sliceHdr->slice_type != I_SLICE) { sliceHdr->max_num_merge_cand = MERGE_MAX_NUM_CAND - GetVLCElementU(); if (sliceHdr->max_num_merge_cand < 1 || sliceHdr->max_num_merge_cand > 5) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->use_integer_mv_flag = sps->motion_vector_resolution_control_idc == 2 ? Get1Bit() : static_cast(sps->motion_vector_resolution_control_idc); } sliceHdr->SliceQP = pps->init_qp + GetVLCElementS(); if (sliceHdr->SliceQP < -sps->getQpBDOffsetY() || sliceHdr->SliceQP > 51) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps->pps_slice_chroma_qp_offsets_present_flag) { sliceHdr->slice_cb_qp_offset = GetVLCElementS(); if (sliceHdr->slice_cb_qp_offset < -12 || sliceHdr->slice_cb_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps->pps_cb_qp_offset + sliceHdr->slice_cb_qp_offset < -12 || pps->pps_cb_qp_offset + sliceHdr->slice_cb_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->slice_cr_qp_offset = GetVLCElementS(); if (sliceHdr->slice_cr_qp_offset < -12 || sliceHdr->slice_cr_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps->pps_cr_qp_offset + sliceHdr->slice_cr_qp_offset < -12 || pps->pps_cr_qp_offset + sliceHdr->slice_cr_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } if (pps->pps_slice_act_qp_offsets_present_flag) { sliceHdr->slice_act_y_qp_offset = GetVLCElementS(); if (sliceHdr->slice_act_y_qp_offset < -12 || sliceHdr->slice_act_y_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); int32_t const act_y_qp_offset = pps->pps_act_y_qp_offset + sliceHdr->slice_act_y_qp_offset; if (act_y_qp_offset < -12 || act_y_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->slice_act_cb_qp_offset = GetVLCElementS(); if (sliceHdr->slice_act_cb_qp_offset < -12 || sliceHdr->slice_act_cb_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); int32_t const act_cb_qp_offset = pps->pps_act_cb_qp_offset + sliceHdr->slice_act_cb_qp_offset; if (act_cb_qp_offset < -12 || act_cb_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr->slice_act_cr_qp_offset = GetVLCElementS(); if (sliceHdr->slice_act_cr_qp_offset < -12 || sliceHdr->slice_act_cr_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); int32_t const act_cr_qp_offset = pps->pps_act_cr_qp_offset + sliceHdr->slice_act_cr_qp_offset; if (act_cr_qp_offset < -12 || act_cr_qp_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } if (pps->chroma_qp_offset_list_enabled_flag) { sliceHdr->cu_chroma_qp_offset_enabled_flag = Get1Bit(); } if (pps->deblocking_filter_control_present_flag) { if (pps->deblocking_filter_override_enabled_flag) { sliceHdr->deblocking_filter_override_flag = Get1Bit(); } else { sliceHdr->deblocking_filter_override_flag = 0; } if (sliceHdr->deblocking_filter_override_flag) { sliceHdr->slice_deblocking_filter_disabled_flag = Get1Bit(); if(!sliceHdr->slice_deblocking_filter_disabled_flag) { sliceHdr->slice_beta_offset = GetVLCElementS() << 1; sliceHdr->slice_tc_offset = GetVLCElementS() << 1; if (sliceHdr->slice_beta_offset < -12 || sliceHdr->slice_beta_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (sliceHdr->slice_tc_offset < -12 || sliceHdr->slice_tc_offset > 12) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } } else { sliceHdr->slice_deblocking_filter_disabled_flag = pps->pps_deblocking_filter_disabled_flag; sliceHdr->slice_beta_offset = pps->pps_beta_offset; sliceHdr->slice_tc_offset = pps->pps_tc_offset; } } else { sliceHdr->slice_deblocking_filter_disabled_flag = 0; sliceHdr->slice_beta_offset = 0; sliceHdr->slice_tc_offset = 0; } bool isSAOEnabled = sliceHdr->slice_sao_luma_flag || sliceHdr->slice_sao_chroma_flag; bool isDBFEnabled = !sliceHdr->slice_deblocking_filter_disabled_flag; if (pps->pps_loop_filter_across_slices_enabled_flag && ( isSAOEnabled || isDBFEnabled )) { sliceHdr->slice_loop_filter_across_slices_enabled_flag = Get1Bit(); } else { sliceHdr->slice_loop_filter_across_slices_enabled_flag = pps->pps_loop_filter_across_slices_enabled_flag; } } if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) { sliceHdr->num_entry_point_offsets = GetVLCElementU(); uint32_t PicHeightInCtbsY = sps->HeightInCU; if (!pps->tiles_enabled_flag && pps->entropy_coding_sync_enabled_flag && sliceHdr->num_entry_point_offsets > PicHeightInCtbsY) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps->tiles_enabled_flag && !pps->entropy_coding_sync_enabled_flag && sliceHdr->num_entry_point_offsets > pps->num_tile_columns*pps->num_tile_rows) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps->tiles_enabled_flag && pps->entropy_coding_sync_enabled_flag && sliceHdr->num_entry_point_offsets > pps->num_tile_columns*PicHeightInCtbsY) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t offsetLenMinus1 = 0; if (sliceHdr->num_entry_point_offsets > 0) { offsetLenMinus1 = GetVLCElementU(); if (offsetLenMinus1 > 31) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } std::vector entryPointOffsets(sliceHdr->num_entry_point_offsets); for (uint32_t idx = 0; idx < sliceHdr->num_entry_point_offsets; idx++) { entryPointOffsets[idx] = GetBits(offsetLenMinus1 + 1) + 1; } pSlice->allocateTileLocation(sliceHdr->num_entry_point_offsets + 1); unsigned prevPos = 0; pSlice->m_tileByteLocation[0] = 0; for (uint32_t idx = 1; idx < pSlice->getTileLocationCount(); idx++) { pSlice->m_tileByteLocation[idx] = prevPos + entryPointOffsets[idx - 1]; prevPos += entryPointOffsets[idx - 1]; } } else { sliceHdr->num_entry_point_offsets = 0; pSlice->allocateTileLocation(1); pSlice->m_tileByteLocation[0] = 0; } if(pps->slice_segment_header_extension_present_flag) { uint32_t slice_header_extension_length = GetVLCElementU(); if (slice_header_extension_length > 256) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); for (uint32_t i = 0; i < slice_header_extension_length; i++) { GetBits(8); // slice_header_extension_data_byte } } readOutTrailingBits(); } // Parse full slice header UMC::Status H265HeadersBitstream::GetSliceHeaderFull(H265Slice *rpcSlice, const H265SeqParamSet *sps, const H265PicParamSet *pps, PocDecoding *pocDecoding) { if (!rpcSlice) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); UMC::Status sts = GetSliceHeaderPart1(rpcSlice->GetSliceHeader()); if (UMC::UMC_OK != sts) return sts; decodeSlice(rpcSlice, sps, pps, pocDecoding); if (CheckBSLeft()) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); return UMC::UMC_OK; } // Read and return NAL unit type and NAL storage idc. // Bitstream position is expected to be at the start of a NAL unit. UMC::Status H265HeadersBitstream::GetNALUnitType(NalUnitType &nal_unit_type, uint32_t &nuh_temporal_id) { uint32_t forbidden_zero_bit = Get1Bit(); if (forbidden_zero_bit) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); nal_unit_type = (NalUnitType)GetBits(6); uint32_t nuh_layer_id = GetBits(6); if (nuh_layer_id) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t const nuh_temporal_id_plus1 = GetBits(3); if (!nuh_temporal_id_plus1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); nuh_temporal_id = nuh_temporal_id_plus1 - 1; if (nuh_temporal_id) { assert( nal_unit_type != NAL_UT_CODED_SLICE_BLA_W_LP && nal_unit_type != NAL_UT_CODED_SLICE_BLA_W_RADL && nal_unit_type != NAL_UT_CODED_SLICE_BLA_N_LP && nal_unit_type != NAL_UT_CODED_SLICE_IDR_W_RADL && nal_unit_type != NAL_UT_CODED_SLICE_IDR_N_LP && nal_unit_type != NAL_UT_CODED_SLICE_CRA && nal_unit_type != NAL_UT_VPS && nal_unit_type != NAL_UT_SPS && nal_unit_type != NAL_UT_EOS && nal_unit_type != NAL_UT_EOB ); } else { assert( nal_unit_type != NAL_UT_CODED_SLICE_TLA_R && nal_unit_type != NAL_UT_CODED_SLICE_TSA_N && nal_unit_type != NAL_UT_CODED_SLICE_STSA_R && nal_unit_type != NAL_UT_CODED_SLICE_STSA_N ); } return UMC::UMC_OK; } // Read optional access unit delimiter from bitstream. UMC::Status H265HeadersBitstream::GetAccessUnitDelimiter(uint32_t &PicCodType) { PicCodType = GetBits(3); return UMC::UMC_OK; } // GetAccessUnitDelimiter // Parse RPS part in SPS or slice header void H265HeadersBitstream::parseShortTermRefPicSet(const H265SeqParamSet* sps, ReferencePictureSet* rps, uint32_t idx) { if (!sps || !rps) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (idx > 0) { rps->inter_ref_pic_set_prediction_flag = Get1Bit(); } else rps->inter_ref_pic_set_prediction_flag = 0; if (rps->inter_ref_pic_set_prediction_flag) { uint32_t delta_idx_minus1 = 0; if (idx == sps->getRPSList()->getNumberOfReferencePictureSets()) { delta_idx_minus1 = GetVLCElementU(); } if (delta_idx_minus1 > idx - 1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t rIdx = idx - 1 - delta_idx_minus1; if (rIdx > idx - 1) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); ReferencePictureSet* rpsRef = const_cast(sps)->getRPSList()->getReferencePictureSet(rIdx); uint32_t k = 0, k0 = 0, k1 = 0; uint32_t delta_rps_sign = Get1Bit(); uint32_t abs_delta_rps_minus1 = GetVLCElementU(); int32_t deltaRPS = (1 - 2 * delta_rps_sign) * (abs_delta_rps_minus1 + 1); uint32_t num_pics = rpsRef->getNumberOfPictures(); for(uint32_t j = 0 ;j <= num_pics; j++) { uint32_t used_by_curr_pic_flag = Get1Bit(); int32_t refIdc = used_by_curr_pic_flag; if (refIdc == 0) { uint32_t use_delta_flag = Get1Bit(); refIdc = use_delta_flag << 1; } if (refIdc == 1 || refIdc == 2) { int32_t deltaPOC = deltaRPS + ((j < rpsRef->getNumberOfPictures())? rpsRef->getDeltaPOC(j) : 0); rps->setDeltaPOC(k, deltaPOC); rps->used_by_curr_pic_flag[k] = refIdc == 1; if (deltaPOC < 0) { k0++; } else { k1++; } k++; } } rps->num_pics = k; rps->num_negative_pics = k0; rps->num_positive_pics = k1; rps->sortDeltaPOC(); } else { rps->num_negative_pics = GetVLCElementU(); rps->num_positive_pics = GetVLCElementU(); if (rps->num_negative_pics >= MAX_NUM_REF_PICS || rps->num_positive_pics >= MAX_NUM_REF_PICS || (rps->num_positive_pics + rps->num_negative_pics) >= MAX_NUM_REF_PICS) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); int32_t prev = 0; int32_t poc; for(uint32_t j=0 ; j < rps->getNumberOfNegativePictures(); j++) { uint32_t delta_poc_s0_minus1 = GetVLCElementU(); poc = prev - delta_poc_s0_minus1 - 1; prev = poc; rps->setDeltaPOC(j,poc); rps->used_by_curr_pic_flag[j] = Get1Bit(); } prev = 0; for(uint32_t j=rps->getNumberOfNegativePictures(); j < rps->getNumberOfNegativePictures()+rps->getNumberOfPositivePictures(); j++) { uint32_t delta_poc_s1_minus1 = GetVLCElementU(); poc = prev + delta_poc_s1_minus1 + 1; prev = poc; rps->setDeltaPOC(j,poc); rps->used_by_curr_pic_flag[j] = Get1Bit(); } rps->num_pics = rps->getNumberOfNegativePictures()+rps->getNumberOfPositivePictures(); } } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_debug.cpp000066400000000000000000000036571443134507600313470ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_debug.h" #include #if defined(_MSC_VER) #include #endif #ifdef ENABLE_TRACE #include "umc_h265_frame.h" #endif namespace UMC_HEVC_DECODER { #ifdef ENABLE_TRACE // Debug output void Trace(vm_char * format, ...) { va_list(arglist); va_start(arglist, format); vm_char cStr[256]; vm_string_vsprintf(cStr, format, arglist); //OutputDebugString(cStr); vm_string_printf(VM_STRING("%s"), cStr); //fflush(stdout); } const vm_char* GetFrameInfoString(H265DecoderFrame * frame) { static vm_char str[256]; vm_string_sprintf(str, VM_STRING("POC - %d, uid - %d"), frame->m_PicOrderCnt, frame->m_UID); return str; } #endif // ENABLE_TRACE } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_frame.cpp000066400000000000000000000202071443134507600313410ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include #include "umc_h265_frame.h" #include "umc_h265_task_supplier.h" #include "umc_h265_debug.h" namespace UMC_HEVC_DECODER { H265DecoderFrame::H265DecoderFrame(UMC::MemoryAllocator *pMemoryAllocator, Heap_Objects * pObjHeap) : H265DecYUVBufferPadded(pMemoryAllocator) , m_ErrorType(0) , m_pPreviousFrame(nullptr) , m_pFutureFrame(nullptr) , m_dFrameTime(-1.0) , m_isOriginalPTS(false) , post_procces_complete(false) , m_index(-1) , m_UID(-1) , m_pSlicesInfo(nullptr) , m_pObjHeap(pObjHeap) { m_isShortTermRef = false; m_isLongTermRef = false; m_RefPicListResetCount = 0; m_PicOrderCnt = 0; // set memory managment tools m_pMemoryAllocator = pMemoryAllocator; ResetRefCounter(); m_pSlicesInfo = new H265DecoderFrameInfo(this); m_Flags.isFull = 0; m_Flags.isDecoded = 0; m_Flags.isDecodingStarted = 0; m_Flags.isDecodingCompleted = 0; m_isDisplayable = 0; m_wasOutputted = 0; m_wasDisplayed = 0; m_maxUIDWhenWasDisplayed = 0; m_crop_flag = 0; m_crop_left = 0; m_crop_top = 0; m_crop_bottom = 0; m_pic_output = 0; m_FrameType = UMC::NONE_PICTURE; m_aspect_width = 0; m_MemID = 0; m_aspect_height = 0; m_isUsedAsReference = 0; m_crop_right = 0; m_DisplayPictureStruct_H265 = DPS_FRAME_H265; m_frameOrder = 0; prepared = false; } H265DecoderFrame::~H265DecoderFrame() { if (m_pSlicesInfo) { delete m_pSlicesInfo; m_pSlicesInfo = 0; } // Just to be safe. m_pPreviousFrame = 0; m_pFutureFrame = 0; Reset(); deallocate(); } // Add target frame to the list of reference frames void H265DecoderFrame::AddReferenceFrame(H265DecoderFrame * frm) { if (!frm || frm == this) return; if (std::find(m_references.begin(), m_references.end(), frm) != m_references.end()) return; frm->IncrementReference(); m_references.push_back(frm); } // Clear all references to other frames void H265DecoderFrame::FreeReferenceFrames() { ReferenceList::iterator iter = m_references.begin(); ReferenceList::iterator end_iter = m_references.end(); for (; iter != end_iter; ++iter) { RefCounter *reference = *iter; reference->DecrementReference(); } m_references.clear(); } // Reinitialize frame structure before reusing frame void H265DecoderFrame::Reset() { if (m_pSlicesInfo) m_pSlicesInfo->Reset(); ResetRefCounter(); m_isShortTermRef = false; m_isLongTermRef = false; post_procces_complete = false; m_RefPicListResetCount = 0; m_PicOrderCnt = 0; m_Flags.isFull = 0; m_Flags.isDecoded = 0; m_Flags.isDecodingStarted = 0; m_Flags.isDecodingCompleted = 0; m_isDisplayable = 0; m_wasOutputted = 0; m_wasDisplayed = 0; m_pic_output = true; m_maxUIDWhenWasDisplayed = 0; m_dFrameTime = -1; m_isOriginalPTS = false; m_isUsedAsReference = false; m_UserData.Reset(); m_ErrorType = 0; m_UID = -1; m_index = -1; m_MemID = MID_INVALID; prepared = false; FreeReferenceFrames(); deallocate(); m_refPicList.clear(); } // Returns whether frame has all slices found bool H265DecoderFrame::IsFullFrame() const { return (m_Flags.isFull == 1); } // Set frame flag denoting that all slices for it were found void H265DecoderFrame::SetFullFrame(bool isFull) { m_Flags.isFull = (uint8_t) (isFull ? 1 : 0); } // Returns whether frame has been decoded bool H265DecoderFrame::IsDecoded() const { return m_Flags.isDecoded == 1; } // Clean up data after decoding is done void H265DecoderFrame::FreeResources() { FreeReferenceFrames(); if (m_pSlicesInfo && IsDecoded()) m_pSlicesInfo->Free(); } // Flag frame as completely decoded void H265DecoderFrame::CompleteDecoding() { m_Flags.isDecodingCompleted = 1; UpdateErrorWithRefFrameStatus(); } // Check reference frames for error status and flag this frame if error is found void H265DecoderFrame::UpdateErrorWithRefFrameStatus() { if (CheckReferenceFrameError()) { SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); } } // Delete unneeded references and set flags after decoding is done void H265DecoderFrame::OnDecodingCompleted() { UpdateErrorWithRefFrameStatus(); m_Flags.isDecoded = 1; DEBUG_PRINT1((VM_STRING("On decoding complete decrement for POC %d, reference = %d\n"), m_PicOrderCnt, m_refCounter)); DecrementReference(); FreeResources(); } // Mark frame as short term reference frame void H265DecoderFrame::SetisShortTermRef(bool isRef) { if (isRef) { if (!isShortTermRef() && !isLongTermRef()) IncrementReference(); m_isShortTermRef = true; } else { bool wasRef = isShortTermRef() != 0; m_isShortTermRef = false; if (wasRef && !isShortTermRef() && !isLongTermRef()) { DecrementReference(); DEBUG_PRINT1((VM_STRING("On was short term ref decrement for POC %d, reference = %d\n"), m_PicOrderCnt, m_refCounter)); } } } // Mark frame as long term reference frame void H265DecoderFrame::SetisLongTermRef(bool isRef) { if (isRef) { if (!isShortTermRef() && !isLongTermRef()) IncrementReference(); m_isLongTermRef = true; } else { bool wasRef = isLongTermRef() != 0; m_isLongTermRef = false; if (wasRef && !isShortTermRef() && !isLongTermRef()) { DEBUG_PRINT1((VM_STRING("On was long term reft decrement for POC %d, reference = %d\n"), m_PicOrderCnt, m_refCounter)); DecrementReference(); } } } // Flag frame after it was output void H265DecoderFrame::setWasOutputted() { m_wasOutputted = 1; } // Free resources if possible void H265DecoderFrame::Free() { if (wasDisplayed() && wasOutputted()) Reset(); } void H265DecoderFrame::AddSlice(H265Slice * pSlice) { int32_t iSliceNumber = m_pSlicesInfo->GetSliceCount() + 1; pSlice->SetSliceNumber(iSliceNumber); pSlice->m_pCurrentFrame = this; m_pSlicesInfo->AddSlice(pSlice); m_refPicList.resize(pSlice->GetSliceNum() + 1); } bool H265DecoderFrame::CheckReferenceFrameError() { uint32_t checkedErrorMask = UMC::ERROR_FRAME_MINOR | UMC::ERROR_FRAME_MAJOR | UMC::ERROR_FRAME_REFERENCE_FRAME; for (size_t i = 0; i < m_refPicList.size(); i ++) { H265DecoderRefPicList* list = &m_refPicList[i].m_refPicList[REF_PIC_LIST_0]; for (size_t k = 0; list->m_refPicList[k].refFrame; k++) { if (list->m_refPicList[k].refFrame->GetError() & checkedErrorMask) return true; } list = &m_refPicList[i].m_refPicList[REF_PIC_LIST_1]; for (size_t k = 0; list->m_refPicList[k].refFrame; k++) { if (list->m_refPicList[k].refFrame->GetError() & checkedErrorMask) return true; } } return false; } } // end namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_frame_info.cpp000066400000000000000000000144021443134507600323540ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_frame_info.h" namespace UMC_HEVC_DECODER { bool H265DecoderFrameInfo::IsCompleted() const { if (GetStatus() == H265DecoderFrameInfo::STATUS_COMPLETED) return true; return false; } void H265DecoderFrameInfo::Reset() { Free(); m_hasTiles = false; m_isNeedDeblocking = false; m_isNeedSAO = false; m_isIntraAU = true; m_hasDependentSliceSegments = false; m_WA_different_disable_deblocking = false; m_nextAU = 0; m_prevAU = 0; m_refAU = 0; m_Status = STATUS_NONE; m_prepared = 0; m_IsIDR = false; if (m_sps) { m_sps->DecrementReference(); m_sps = 0; } } void H265DecoderFrameInfo::Free() { size_t count = m_pSliceQueue.size(); for (size_t i = 0; i < count; i ++) { H265Slice * pCurSlice = m_pSliceQueue[i]; pCurSlice->Release(); pCurSlice->DecrementReference(); } m_SliceCount = 0; m_pSliceQueue.clear(); m_prepared = 0; } void H265DecoderFrameInfo::RemoveSlice(int32_t num) { H265Slice * pCurSlice = GetSlice(num); if (!pCurSlice) // nothing to do return; for (int32_t i = num; i < m_SliceCount - 1; i++) { m_pSliceQueue[i] = m_pSliceQueue[i + 1]; } m_SliceCount--; m_pSliceQueue[m_SliceCount] = pCurSlice; } // Function works with a list of slices sorted by slice_segment_address void H265DecoderFrameInfo::EliminateErrors() { if (!GetSlice(0)) return; // Remove dependent slices without a corresponding independent slice for (uint32_t sliceId = 0; sliceId < GetSliceCount(); sliceId++) { H265Slice * slice = GetSlice(sliceId); if (slice->GetSliceHeader()->dependent_slice_segment_flag) { RemoveSlice(sliceId); sliceId = uint32_t(-1); continue; } else break; } { // HEVC 7.4.7.1 General slice segment header semantics H265Slice *baseSlice = GetSlice(0); // after the for() loop above ,the first slice is treated as 'base' slice bool bIndepSliceMissing = false; for (uint32_t sliceId = 1; sliceId < GetSliceCount(); sliceId++) { H265SliceHeader *sliceHeader = GetSlice(sliceId)->GetSliceHeader(); if (!sliceHeader->dependent_slice_segment_flag) bIndepSliceMissing = false; bool specViolation = sliceHeader->slice_temporal_mvp_enabled_flag != baseSlice->GetSliceHeader()->slice_temporal_mvp_enabled_flag; bool bRemoveDependent = bIndepSliceMissing && sliceHeader->dependent_slice_segment_flag; if (specViolation || bRemoveDependent) { RemoveSlice(sliceId); sliceId--; if (false == bIndepSliceMissing) bIndepSliceMissing = !sliceHeader->dependent_slice_segment_flag; } } } // Remove slices with duplicated slice_segment_address syntax for (uint32_t sliceId = 0; sliceId < GetSliceCount(); sliceId++) { H265Slice * slice = m_pSliceQueue[sliceId]; H265Slice * nextSlice = GetSlice(sliceId + 1); if (!nextSlice) break; if (slice->GetFirstMB() == slice->GetMaxMB()) { uint32_t sliceIdToRemove; // Heuristic logic: if (slice->GetSliceHeader()->dependent_slice_segment_flag && !nextSlice->GetSliceHeader()->dependent_slice_segment_flag) { // dependent slices are prone to errors sliceIdToRemove = sliceId; } else { // among two independent or dependent slices, prefer to keep the first slice sliceIdToRemove = sliceId + 1; } RemoveSlice(sliceIdToRemove); sliceId = uint32_t(-1); continue; } } } void H265DecoderFrameInfo::EliminateASO() { static int32_t MAX_MB_NUMBER = 0x7fffffff; if (!GetSlice(0)) return; uint32_t count = m_SliceCount; for (uint32_t sliceId = 0; sliceId < count; sliceId++) { H265Slice * curSlice = m_pSliceQueue[sliceId]; int32_t minFirst = MAX_MB_NUMBER; uint32_t minSlice = 0; for (uint32_t j = sliceId; j < count; j++) { H265Slice * slice = m_pSliceQueue[j]; if (slice->GetFirstMB() < curSlice->GetFirstMB() && minFirst > slice->GetFirstMB()) { minFirst = slice->GetFirstMB(); minSlice = j; } } if (minFirst != MAX_MB_NUMBER) { H265Slice * temp = m_pSliceQueue[sliceId]; m_pSliceQueue[sliceId] = m_pSliceQueue[minSlice]; m_pSliceQueue[minSlice] = temp; } } for (uint32_t sliceId = 0; sliceId < count; sliceId++) { H265Slice * slice = m_pSliceQueue[sliceId]; H265Slice * nextSlice = GetSlice(sliceId + 1); if (!nextSlice) break; slice->SetMaxMB(nextSlice->GetFirstMB()); } } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_frame_list.cpp000066400000000000000000000345371443134507600324070ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_frame_list.h" #include "umc_h265_debug.h" #include "umc_h265_task_supplier.h" namespace UMC_HEVC_DECODER { H265DecoderFrameList::H265DecoderFrameList(void) { m_pHead = NULL; m_pTail = NULL; } // H265DecoderFrameList::H265DecoderFrameList(void) H265DecoderFrameList::~H265DecoderFrameList(void) { Release(); } // H265DecoderFrameList::~H265DecoderFrameList(void) // Destroy frame list void H265DecoderFrameList::Release(void) { while (m_pHead) { H265DecoderFrame *pNext = m_pHead->future(); delete m_pHead; m_pHead = pNext; } m_pHead = NULL; m_pTail = NULL; } // void H265DecoderFrameList::Release(void) // Appends a new decoded frame buffer to the "end" of the linked list void H265DecoderFrameList::append(H265DecoderFrame *pFrame) { // Error check if (!pFrame) { // Sent in a NULL frame return; } // Has a list been constructed - is their a head? if (!m_pHead) { // Must be the first frame appended // Set the head to the current m_pHead = pFrame; m_pHead->setPrevious(0); } if (m_pTail) { // Set the old tail as the previous for the current pFrame->setPrevious(m_pTail); // Set the old tail's future to the current m_pTail->setFuture(pFrame); } else { // Must be the first frame appended // Set the tail to the current m_pTail = pFrame; } // The current is now the new tail m_pTail = pFrame; m_pTail->setFuture(0); // } H265DBPList::H265DBPList() : m_dpbSize(0) { } // Searches DPB for a reusable frame with biggest POC H265DecoderFrame * H265DBPList::GetOldestDisposable(void) { H265DecoderFrame *pOldest = NULL; int32_t SmallestPicOrderCnt = 0x7fffffff; // very large positive int32_t LargestRefPicListResetCount = 0; for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable()) { if (pTmp->RefPicListResetCount() > LargestRefPicListResetCount) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(); LargestRefPicListResetCount = pTmp->RefPicListResetCount(); } else if ((pTmp->PicOrderCnt() < SmallestPicOrderCnt) && (pTmp->RefPicListResetCount() == LargestRefPicListResetCount)) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(); } } } return pOldest; } // H265DecoderFrame *H265DBPList::GetDisposable(void) // Returns whether DPB contains frames which may be reused bool H265DBPList::IsDisposableExist() { for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable()) { return true; } } return false; } // Returns whether DPB contains frames which may be reused after asynchronous decoding finishes bool H265DBPList::IsAlmostDisposableExist() { int32_t count = 0; for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { count++; if (isAlmostDisposable(pTmp)) { return true; } } return count < m_dpbSize; } // Returns first reusable frame in DPB H265DecoderFrame * H265DBPList::GetDisposable(void) { for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable()) { return pTmp; } } // We never found one return NULL; } // H265DecoderFrame *H265DBPList::GetDisposable(void) // Search through the list for the oldest displayable frame. It must be // not disposable, not outputted, and have smallest PicOrderCnt. H265DecoderFrame * H265DBPList::findOldestDisplayable(int32_t /*dbpSize*/ ) { H265DecoderFrame *pCurr = m_pHead; H265DecoderFrame *pOldest = NULL; int32_t SmallestPicOrderCnt = 0x7fffffff; // very large positive int32_t LargestRefPicListResetCount = 0; int32_t uid = 0x7fffffff; int32_t count = 0; while (pCurr) { if (pCurr->isDisplayable() && !pCurr->wasOutputted()) { // corresponding frame if (pCurr->RefPicListResetCount() > LargestRefPicListResetCount) { pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(); LargestRefPicListResetCount = pCurr->RefPicListResetCount(); } else if (pCurr->PicOrderCnt() <= SmallestPicOrderCnt && pCurr->RefPicListResetCount() == LargestRefPicListResetCount) { pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(); } count++; } pCurr = pCurr->future(); } if (!pOldest) return 0; pCurr = m_pHead; while (pCurr) { if (pCurr->isDisplayable() && !pCurr->wasOutputted()) { // corresponding frame if (pCurr->RefPicListResetCount() == LargestRefPicListResetCount && pCurr->PicOrderCnt() == SmallestPicOrderCnt && pCurr->m_UID < uid) { pOldest = pCurr; SmallestPicOrderCnt = pCurr->PicOrderCnt(); LargestRefPicListResetCount = pCurr->RefPicListResetCount(); uid = pCurr->m_UID; } } pCurr = pCurr->future(); } return pOldest; } // findOldestDisplayable // Returns the number of frames in DPB uint32_t H265DBPList::countAllFrames() { H265DecoderFrame *pCurr = head(); uint32_t count = 0; while (pCurr) { count++; pCurr = pCurr->future(); } return count; } void H265DBPList::calculateInfoForDisplay(uint32_t &countDisplayable, uint32_t &countDPBFullness, int32_t &maxUID) { H265DecoderFrame *pCurr = head(); countDisplayable = 0; countDPBFullness = 0; maxUID = 0; int resetCounter = -1; while (pCurr) { if (pCurr->isDisplayable() && !pCurr->wasOutputted()) { countDisplayable++; if (resetCounter == -1) resetCounter = pCurr->RefPicListResetCount(); else { if (resetCounter != pCurr->RefPicListResetCount()) // DPB contain new IDR and frames from prev sequence countDisplayable += 16; } } if (((pCurr->isShortTermRef() || pCurr->isLongTermRef()) && pCurr->IsFullFrame()) || (pCurr->isDisplayable() && !pCurr->wasOutputted())) { countDPBFullness++; if (maxUID < pCurr->m_UID) maxUID = pCurr->m_UID; } pCurr = pCurr->future(); } } // calculateInfoForDisplay // Return number of active short and long term reference frames. void H265DBPList::countActiveRefs(uint32_t &NumShortTerm, uint32_t &NumLongTerm) { H265DecoderFrame *pCurr = m_pHead; NumShortTerm = 0; NumLongTerm = 0; while (pCurr) { if (pCurr->isShortTermRef()) NumShortTerm++; else if (pCurr->isLongTermRef()) NumLongTerm++; pCurr = pCurr->future(); } } // countActiveRefs // Marks all frames as not used as reference frames. void H265DBPList::removeAllRef() { H265DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->isShortTermRef() || pCurr->isLongTermRef()) { pCurr->SetisLongTermRef(false); pCurr->SetisShortTermRef(false); } pCurr = pCurr->future(); } } // removeAllRef // Increase ref pic list reset count except for one frame void H265DBPList::IncreaseRefPicListResetCount(H265DecoderFrame *ExcludeFrame) { H265DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr!=ExcludeFrame) { pCurr->IncreaseRefPicListResetCount(); } pCurr = pCurr->future(); } } // IncreaseRefPicListResetCount // Debug print void H265DBPList::printDPB() { H265DecoderFrame *pCurr = m_pHead; DEBUG_PRINT((VM_STRING("DPB: ("))); while (pCurr) { DEBUG_PRINT((VM_STRING("POC = %d %p (%d)"), pCurr->PicOrderCnt(), (RefCounter *)pCurr, pCurr->GetRefCounter())); pCurr = pCurr->future(); DEBUG_PRINT((VM_STRING(", "))); } DEBUG_PRINT((VM_STRING(")\n"))); } // Searches DPB for a short term reference frame with specified POC H265DecoderFrame *H265DBPList::findShortRefPic(int32_t picPOC) { H265DecoderFrame *pCurr = m_pHead; while (pCurr) { if (pCurr->isShortTermRef() && pCurr->PicOrderCnt() == picPOC) break; pCurr = pCurr->future(); } return pCurr; } // Searches DPB for a long term reference frame with specified POC H265DecoderFrame *H265DBPList::findLongTermRefPic(const H265DecoderFrame *excludeFrame, int32_t picPOC, uint32_t bitsForPOC, bool isUseMask) const { H265DecoderFrame *pCurr = m_pHead; uint32_t POCmask = (1 << bitsForPOC) - 1; if (!isUseMask) POCmask = 0xffffffff; int32_t excludeUID = excludeFrame ? excludeFrame->m_UID : 0x7fffffff; H265DecoderFrame *correctPic = 0; while (pCurr) { if ((pCurr->PicOrderCnt() & POCmask) == (picPOC & POCmask) && pCurr->m_UID < excludeUID) { if (pCurr->isLongTermRef() && (!correctPic || correctPic->m_UID < pCurr->m_UID)) correctPic = pCurr; } pCurr = pCurr->future(); } return correctPic; } // findLongTermRefPic // Try to find a frame closest to specified for error recovery H265DecoderFrame * H265DBPList::FindClosest(H265DecoderFrame * pFrame) { int32_t originalPOC = pFrame->PicOrderCnt(); int32_t originalResetCount = pFrame->RefPicListResetCount(); H265DecoderFrame * pOldest = 0; int32_t SmallestPicOrderCnt = 0; // very large positive int32_t SmallestRefPicListResetCount = 0x7fffffff; for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp == pFrame || !pTmp->IsDecodingCompleted()) continue; if (pTmp->m_chroma_format != pFrame->m_chroma_format || pTmp->lumaSize().width != pFrame->lumaSize().width || pTmp->lumaSize().height != pFrame->lumaSize().height) continue; if (pTmp->RefPicListResetCount() < SmallestRefPicListResetCount) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(); } else if (pTmp->RefPicListResetCount() == SmallestRefPicListResetCount) { if (pTmp->RefPicListResetCount() == originalResetCount) { if (SmallestRefPicListResetCount != originalResetCount) { SmallestPicOrderCnt = 0x7fff; } if (abs(pTmp->PicOrderCnt() - originalPOC) < SmallestPicOrderCnt) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(); } } else { if (pTmp->PicOrderCnt() > SmallestPicOrderCnt) { pOldest = pTmp; SmallestPicOrderCnt = pTmp->PicOrderCnt(); SmallestRefPicListResetCount = pTmp->RefPicListResetCount(); } } } } return pOldest; } // Reset the buffer and reset every single frame of it void H265DBPList::Reset(void) { H265DecoderFrame *pFrame ; for (pFrame = head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } for (pFrame = head(); pFrame; pFrame = pFrame->future()) { pFrame->Reset(); } } // void H265DBPList::Reset(void) // Debug print void H265DBPList::DebugPrint() { #ifdef ENABLE_TRACE Trace(VM_STRING("-==========================================\n")); int32_t curID = -1; H265DecoderFrame * minTmp = 0; for (;;) { for (H265DecoderFrame * pTmp = m_pHead; pTmp; pTmp = pTmp->future()) { if (pTmp->m_UID > curID) { if (minTmp && minTmp->m_UID < pTmp->m_UID) continue; minTmp = pTmp; } } if (!minTmp) break; curID = minTmp->m_UID; H265DecoderFrame * pTmp = minTmp; Trace(VM_STRING("\n\nPTR = %p UID - %d POC - %d - resetcount - %d, frame ID - %d\n"), (RefCounter *)pTmp, pTmp->m_UID, pTmp->m_PicOrderCnt, pTmp->RefPicListResetCount(), pTmp->GetFrameData()->GetFrameMID()); Trace(VM_STRING("Short - %d, Long - %d \n"), pTmp->isShortTermRef(), pTmp->isLongTermRef()); Trace(VM_STRING("Busy - %d, decoded - %d \n"), pTmp->GetRefCounter(), pTmp->IsDecodingCompleted()); Trace(VM_STRING("Disp - %d , wasOutput - %d wasDisplayed - %d, m_maxUIDWhenWasDisplayed - %d\n"), pTmp->isDisplayable(), pTmp->wasOutputted(), pTmp->wasDisplayed(), pTmp->m_maxUIDWhenWasDisplayed); minTmp = 0; } Trace(VM_STRING("-==========================================\n")); //fflush(stdout); #endif } } // end namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_heap.cpp000066400000000000000000000227041443134507600311700ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_structures.h" #include "umc_h265_heap.h" #include "umc_h265_dec_defs.h" #include namespace UMC_HEVC_DECODER { enum { COEFFS_BUFFER_ALIGN_VALUE_H265 = 128 }; CoeffsBuffer::CoeffsBuffer(void) { // reset variables m_pbAllocatedBuffer = 0; m_lAllocatedBufferSize = 0; m_pbBuffer = 0; m_lBufferSize = 0; m_pbFree = 0; m_lFreeSize = 0; m_pBuffers = 0; m_lItemSize = 0; } // CoeffsBuffer::CoeffsBuffer(void) CoeffsBuffer::~CoeffsBuffer(void) { Close(); } // CoeffsBuffer::~CoeffsBuffer(void) void CoeffsBuffer::Close(void) { // delete buffer if (m_pbAllocatedBuffer) delete[] m_pbAllocatedBuffer; // reset variables m_pbAllocatedBuffer = 0; m_lAllocatedBufferSize = 0; m_pbBuffer = 0; m_lBufferSize = 0; m_pbFree = 0; m_lFreeSize = 0; m_pBuffers = 0; } // void CoeffsBuffer::Close(void) UMC::Status CoeffsBuffer::Init(int32_t numberOfItems, int32_t sizeOfItem) { int32_t lMaxSampleSize = sizeOfItem + COEFFS_BUFFER_ALIGN_VALUE_H265 + (int32_t)sizeof(BufferInfo); int32_t lAllocate = lMaxSampleSize * numberOfItems; if ((int32_t)m_lBufferSize != lAllocate) { Close(); // allocate buffer m_pbAllocatedBuffer = h265_new_array_throw(lAllocate + COEFFS_BUFFER_ALIGN_VALUE_H265); m_lBufferSize = lAllocate; m_lAllocatedBufferSize = lAllocate + COEFFS_BUFFER_ALIGN_VALUE_H265; // align buffer m_pbBuffer = UMC::align_pointer (m_pbAllocatedBuffer, COEFFS_BUFFER_ALIGN_VALUE_H265); } m_pBuffers = 0; m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; // save preferred size(s) m_lItemSize = sizeOfItem; return UMC::UMC_OK; } // Status CoeffsBuffer::Init(MediaReceiverParams *init) bool CoeffsBuffer::IsInputAvailable() const { size_t lFreeSize; // check error(s) if (NULL == m_pbFree) return false; // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) { lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; } else { lFreeSize = m_lFreeSize; if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo)) return false; } // check free size if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo)) { // when used data is present, // concatenate dummy bytes to last buffer info if (m_pBuffers) { return (m_lFreeSize - lFreeSize > m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo)); } // when no used data, // simple move pointer(s) else { return (m_lFreeSize == m_lBufferSize); } } return true; } // bool CoeffsBuffer::IsInputAvailable() const uint8_t* CoeffsBuffer::LockInputBuffer() { size_t lFreeSize; // check error(s) if (NULL == m_pbFree) return 0; if (m_pBuffers == 0) { // We could do it, because only one thread could get input buffer m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; } // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) { lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; } else { lFreeSize = m_lFreeSize; if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo)) return 0; } // check free size if (lFreeSize < m_lItemSize + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo)) { // when used data is present, // concatenate dummy bytes to last buffer info if (m_pBuffers) { BufferInfo *pTemp; // find last sample info pTemp = m_pBuffers; while (pTemp->m_pNext) pTemp = pTemp->m_pNext; pTemp->m_Size += lFreeSize; // update variable(s) m_pbFree = m_pbBuffer; m_lFreeSize -= lFreeSize; return LockInputBuffer(); } // when no used data, // simple move pointer(s) else { if (m_lFreeSize == m_lBufferSize) { m_pbFree = m_pbBuffer; return m_pbFree; } return 0; } } return m_pbFree; } // bool CoeffsBuffer::LockInputBuffer(MediaData* in) bool CoeffsBuffer::UnLockInputBuffer(size_t size) { size_t lFreeSize; BufferInfo *pTemp; uint8_t *pb; // check error(s) if (NULL == m_pbFree) return false; // when no data given //if (0 == size) // even for size = 0 we should add buffer // return true; // get free size if (m_pbFree >= m_pbBuffer + (m_lBufferSize - m_lFreeSize)) lFreeSize = m_pbBuffer + m_lBufferSize - m_pbFree; else lFreeSize = m_lFreeSize; // check free size if (lFreeSize < m_lItemSize) return false; // check used data if (size + COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo) > lFreeSize) // DEBUG : should not be !!! { assert(false); return false; } // get new buffer info pb = UMC::align_pointer (m_pbFree + size, COEFFS_BUFFER_ALIGN_VALUE_H265); pTemp = reinterpret_cast (pb); size += COEFFS_BUFFER_ALIGN_VALUE_H265 + sizeof(BufferInfo); // fill buffer info pTemp->m_Size = size; pTemp->m_pPointer = m_pbFree; pTemp->m_pNext = 0; // add sample to end of queue if (m_pBuffers) { BufferInfo *pWork = m_pBuffers; while (pWork->m_pNext) pWork = pWork->m_pNext; pWork->m_pNext = pTemp; } else m_pBuffers = pTemp; // update variable(s) m_pbFree += size; if (m_pbBuffer + m_lBufferSize == m_pbFree) m_pbFree = m_pbBuffer; m_lFreeSize -= size; return true; } // bool CoeffsBuffer::UnLockInputBuffer(size_t size) bool CoeffsBuffer::IsOutputAvailable() const { return (0 != m_pBuffers); } // bool CoeffsBuffer::IsOutputAvailable() const bool CoeffsBuffer::LockOutputBuffer(uint8_t* &pointer, size_t &size) { // check error(s) if (0 == m_pBuffers) return false; // set used pointer pointer = m_pBuffers->m_pPointer; size = m_pBuffers->m_Size; return true; } // bool CoeffsBuffer::LockOutputBuffer(uint8_t* &pointer, size_t &size) bool CoeffsBuffer::UnLockOutputBuffer() { // no filled data is present if (0 == m_pBuffers) return false; // update variable(s) m_lFreeSize += m_pBuffers->m_Size; m_pBuffers = m_pBuffers->m_pNext; return true; } // bool CoeffsBuffer::UnLockOutputBuffer() void CoeffsBuffer::Reset() { // align buffer m_pbBuffer = UMC::align_pointer (m_pbAllocatedBuffer, COEFFS_BUFFER_ALIGN_VALUE_H265); m_pBuffers = 0; m_pbFree = m_pbBuffer; m_lFreeSize = m_lBufferSize; } //void CoeffsBuffer::Reset() void CoeffsBuffer::Free() { HeapObject::Free(); } void HeapObject::Free() { Item * item = (Item *) ((uint8_t*)this - sizeof(Item)); item->m_heap->Free(this); } void RefCounter::IncrementReference() const { m_refCounter++; } void RefCounter::DecrementReference() { m_refCounter--; assert(m_refCounter >= 0); if (!m_refCounter) { Free(); } } // Allocate several arrays inside of one memory buffer uint8_t * CumulativeArraysAllocation(int n, int align, ...) { va_list args; va_start(args, align); int cumulativeSize = 0; for (int i = 0; i < n; i++) { va_arg(args, void *); int currSize = va_arg(args, int); cumulativeSize += currSize; } va_end(args); uint8_t *cumulativePtr = h265_new_array_throw(cumulativeSize + align * n); uint8_t *cumulativePtrSaved = cumulativePtr; va_start(args, align); for (int i = 0; i < n; i++) { void ** ptr = va_arg(args, void **); *ptr = align ? UMC::align_pointer(cumulativePtr, align) : cumulativePtr; int currSize = va_arg(args, int); cumulativePtr = (uint8_t*)*ptr + currSize; } va_end(args); return cumulativePtrSaved; } // Free memory allocated by CumulativeArraysAllocation void CumulativeFree(uint8_t * ptr) { delete[] ptr; } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_mfx_supplier.cpp000066400000000000000000000340161443134507600327670ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_mfx_supplier.h" #include "umc_h265_frame_list.h" #include "umc_h265_nal_spl.h" #include "umc_h265_bitstream_headers.h" #include "umc_h265_dec_defs.h" #include "umc_h265_debug.h" #include "umc_h265_mfx_utils.h" namespace UMC_HEVC_DECODER { //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// RawHeader_H265::RawHeader_H265() { Reset(); } void RawHeader_H265::Reset() { m_id = -1; m_buffer.clear(); } int32_t RawHeader_H265::GetID() const { return m_id; } size_t RawHeader_H265::GetSize() const { return m_buffer.size(); } uint8_t * RawHeader_H265::GetPointer() { return m_buffer.empty() ? nullptr : &m_buffer[0]; } void RawHeader_H265::Resize(int32_t id, size_t newSize) { m_id = id; m_buffer.resize(newSize); } //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// void RawHeaders_H265::Reset() { m_vps.Reset(); m_sps.Reset(); m_pps.Reset(); } RawHeader_H265 * RawHeaders_H265::GetVPS() { return &m_vps; } RawHeader_H265 * RawHeaders_H265::GetSPS() { return &m_sps; } RawHeader_H265 * RawHeaders_H265::GetPPS() { return &m_pps; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////// MFXTaskSupplier_H265::MFXTaskSupplier_H265() : TaskSupplier_H265() { memset(&m_firstVideoParams, 0, sizeof(mfxVideoParam)); } MFXTaskSupplier_H265::~MFXTaskSupplier_H265() { Close(); } // Initialize task supplier UMC::Status MFXTaskSupplier_H265::Init(UMC::VideoDecoderParams *init) { UMC::Status umcRes; if (NULL == init) return UMC::UMC_ERR_NULL_PTR; Close(); m_initializationParams = *init; m_pMemoryAllocator = init->lpMemoryAllocator; m_DPBSizeEx = 0; m_sei_messages = new SEI_Storer_H265(); m_sei_messages->Init(); int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); umcRes = MVC_Extension::Init(); if (UMC::UMC_OK != umcRes) { return umcRes; } AU_Splitter_H265::Init(init); m_pSegmentDecoder = new H265SegmentDecoderBase *[m_iThreadNum]; memset(m_pSegmentDecoder, 0, sizeof(H265SegmentDecoderBase *) * m_iThreadNum); CreateTaskBroker(); m_pTaskBroker->Init(m_iThreadNum); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { if (UMC::UMC_OK != m_pSegmentDecoder[i]->Init(i)) return UMC::UMC_ERR_INIT; } m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } GetView()->dpbSize = 16; m_DPBSizeEx = m_iThreadNum + init->info.bitrate; return UMC::UMC_OK; } // Check whether specified frame has been decoded, and if it was, // whether it is necessary to display some frame bool MFXTaskSupplier_H265::CheckDecoding(bool should_additional_check, H265DecoderFrame * outputFrame) { ViewItem_H265 &view = *GetView(); if (!outputFrame->IsDecodingStarted()) return false; if (outputFrame->IsDecodingCompleted()) { if (!should_additional_check) return true; int32_t maxReadyUID = outputFrame->m_UID; uint32_t inDisplayStage = 0; UMC::AutomaticUMCMutex guard(m_mGuard); for (H265DecoderFrame * pTmp = view.pDPB->head(); pTmp; pTmp = pTmp->future()) { if (pTmp->m_wasOutputted != 0 && pTmp->m_wasDisplayed == 0 && pTmp->m_maxUIDWhenWasDisplayed) { inDisplayStage++; // number of outputted frames at this moment } if ((pTmp->IsDecoded() || pTmp->IsDecodingCompleted()) && maxReadyUID < pTmp->m_UID) maxReadyUID = pTmp->m_UID; } DEBUG_PRINT1((VM_STRING("output frame - %d, notDecoded - %u, count - %u\n"), outputFrame->m_PicOrderCnt, notDecoded, count)); if (inDisplayStage > 1 || m_maxUIDWhenWasDisplayed <= maxReadyUID) { return true; } } return false; } // Perform decoding task for thread number threadNumber mfxStatus MFXTaskSupplier_H265::RunThread(mfxU32 threadNumber) { UMC::Status sts = m_pSegmentDecoder[threadNumber]->ProcessSegment(); if (sts == UMC::UMC_ERR_NOT_ENOUGH_DATA) return MFX_TASK_BUSY; else if(sts == UMC::UMC_ERR_DEVICE_FAILED) MFX_RETURN(MFX_ERR_DEVICE_FAILED) else if (sts == UMC::UMC_ERR_GPU_HANG) MFX_RETURN(MFX_ERR_GPU_HANG); if (sts != UMC::UMC_OK) MFX_RETURN(MFX_ERR_UNDEFINED_BEHAVIOR); return MFX_TASK_WORKING; } // Check whether all slices for the frame were found void MFXTaskSupplier_H265::CompleteFrame(H265DecoderFrame * pFrame) { if (!pFrame) return; H265DecoderFrameInfo * slicesInfo = pFrame->GetAU(); if (slicesInfo->GetStatus() > H265DecoderFrameInfo::STATUS_NOT_FILLED) return; TaskSupplier_H265::CompleteFrame(pFrame); } // Set initial video params from application void MFXTaskSupplier_H265::SetVideoParams(mfxVideoParam * par) { m_firstVideoParams = *par; m_decodedOrder = m_firstVideoParams.mfx.DecodedOrder != 0; } UMC::Status MFXTaskSupplier_H265::FillVideoParam(mfxVideoParam *par, bool full) { const H265VideoParamSet * vps = GetHeaders()->m_VideoParams.GetCurrentHeader(); const H265SeqParamSet * seq = GetHeaders()->m_SeqParams.GetCurrentHeader(); if (!seq) return UMC::UMC_ERR_FAILED; if (MFX_Utility::FillVideoParam(vps, seq, par, full) != UMC::UMC_OK) return UMC::UMC_ERR_FAILED; return UMC::UMC_OK; } // Decode headers nal unit UMC::Status MFXTaskSupplier_H265::DecodeHeaders(UMC::MediaDataEx *nalUnit) { UMC::Status sts = TaskSupplier_H265::DecodeHeaders(nalUnit); if (sts != UMC::UMC_OK) return sts; { static const uint8_t start_code_prefix[] = {0, 0, 0, 1}; // save vps/sps/pps uint32_t nal_unit_type = nalUnit->GetExData()->values[0]; switch(nal_unit_type) { case NAL_UT_VPS: { size_t const prefix_size = sizeof(start_code_prefix); size_t size = nalUnit->GetDataSize(); RawHeader_H265 * hdr = GetVPS(); int32_t id = m_Headers.m_VideoParams.GetCurrentID(); hdr->Resize(id, size + prefix_size); std::copy(start_code_prefix, start_code_prefix + prefix_size, hdr->GetPointer()); std::copy((uint8_t*)nalUnit->GetDataPointer(), (uint8_t*)nalUnit->GetDataPointer() + size, hdr->GetPointer() + prefix_size); } break; case NAL_UT_SPS: case NAL_UT_PPS: { size_t const prefix_size = sizeof(start_code_prefix); size_t size = nalUnit->GetDataSize(); bool isSPS = (nal_unit_type == NAL_UT_SPS); RawHeader_H265 * hdr = isSPS ? GetSPS() : GetPPS(); H265SeqParamSet * currSPS = isSPS ? m_Headers.m_SeqParams.GetCurrentHeader() : nullptr; H265PicParamSet * currPPS = isSPS ? nullptr : m_Headers.m_PicParams.GetCurrentHeader(); int32_t id = isSPS ? m_Headers.m_SeqParams.GetCurrentID() : m_Headers.m_PicParams.GetCurrentID(); if (hdr->GetPointer() != nullptr && hdr->GetID() == id) { bool changed = size + prefix_size != hdr->GetSize() || !!memcmp(hdr->GetPointer() + prefix_size, nalUnit->GetDataPointer(), size); if (isSPS && currSPS != nullptr) currSPS->m_changed = changed; else if(currPPS != nullptr) currPPS->m_changed = changed; } hdr->Resize(id, size + prefix_size); std::copy(start_code_prefix, start_code_prefix + prefix_size, hdr->GetPointer()); std::copy((uint8_t*)nalUnit->GetDataPointer(), (uint8_t*)nalUnit->GetDataPointer() + size, hdr->GetPointer() + prefix_size); } break; } } UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = nalUnit->GetExData(); if ((NalUnitType)pMediaDataEx->values[0] == NAL_UT_SPS && m_firstVideoParams.mfx.FrameInfo.Width) { H265SeqParamSet * currSPS = m_Headers.m_SeqParams.GetCurrentHeader(); if (currSPS) { if (m_firstVideoParams.mfx.FrameInfo.Width < (currSPS->pic_width_in_luma_samples) || m_firstVideoParams.mfx.FrameInfo.Height < (currSPS->pic_height_in_luma_samples) || (currSPS->m_pcPTL.GetGeneralPTL()->level_idc && m_firstVideoParams.mfx.CodecLevel && m_firstVideoParams.mfx.CodecLevel < currSPS->m_pcPTL.GetGeneralPTL()->level_idc)) { return UMC::UMC_NTF_NEW_RESOLUTION; } } return UMC::UMC_WRN_REPOSITION_INPROGRESS; } return UMC::UMC_OK; } // Decode SEI nal unit UMC::Status MFXTaskSupplier_H265::DecodeSEI(UMC::MediaDataEx *nalUnit) { if (m_Headers.m_SeqParams.GetCurrentID() == -1) return UMC::UMC_OK; H265HeadersBitstream bitStream; try { MemoryPiece mem; mem.SetData(nalUnit); //NU reader needs 8 bytes as tail data, allocate another 8 bytes here to avoid out of bound read. MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE * 2); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem, 0); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NalUnitType nal_unit_type; uint32_t temporal_id; bitStream.GetNALUnitType(nal_unit_type, temporal_id); nalUnit->MoveDataPointer(2); // skip[ [NAL unit header = 16 bits] do { H265SEIPayLoad m_SEIPayLoads; size_t decoded1 = bitStream.BytesDecoded(); bitStream.ParseSEI(m_Headers.m_SeqParams, m_Headers.m_SeqParams.GetCurrentID(), &m_SEIPayLoads); if (m_SEIPayLoads.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { m_UserData = m_SEIPayLoads; } else { if (m_SEIPayLoads.payLoadType == SEI_RESERVED) continue; m_Headers.m_SEIParams.AddHeader(&m_SEIPayLoads); } size_t decoded2 = bitStream.BytesDecoded(); // calculate payload size size_t size = decoded2 - decoded1; assert(size == m_SEIPayLoads.payLoadSize + 2 + (m_SEIPayLoads.payLoadSize / 255) + (m_SEIPayLoads.payLoadType / 255)); if (m_sei_messages) { UMC::MediaDataEx nalUnit1; size_t nal_u_size = size; for(uint8_t *ptr = (uint8_t*)nalUnit->GetDataPointer(); ptr < (uint8_t*)nalUnit->GetDataPointer() + nal_u_size; ptr++) if (ptr[0]==0 && ptr[1]==0 && ptr[2]==3) nal_u_size += 1; nalUnit1.SetBufferPointer((uint8_t*)nalUnit->GetDataPointer(), nal_u_size); nalUnit1.SetDataSize(nal_u_size); nalUnit1.SetExData(nalUnit->GetExData()); double start, stop; nalUnit->GetTime(start, stop); nalUnit1.SetTime(start, stop); nalUnit->MoveDataPointer((int32_t)nal_u_size); SEI_Storer_H265::SEI_Message* msg = m_sei_messages->AddMessage(&nalUnit1, m_SEIPayLoads.payLoadType); //frame is bound to SEI prefix payloads w/ the first slice //here we bind SEI suffix payloads if (msg && msg->nal_type == NAL_UT_SEI_SUFFIX) msg->frame = GetView()->pCurFrame; } } while (bitStream.More_RBSP_Data()); } catch(...) { // nothing to do just catch it } return UMC::UMC_OK; } // Do something in case reference frame is missing void MFXTaskSupplier_H265::AddFakeReferenceFrame(H265Slice * ) { } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_mfx_utils.cpp000066400000000000000000001034721443134507600322670ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_dec_defs.h" #include "umc_h265_task_supplier.h" #include "umc_h265_nal_spl.h" #include "mfx_common_decode_int.h" #include "mfxpcp.h" #include #include #include namespace UMC_HEVC_DECODER { namespace MFX_Utility { // Check HW capabilities bool IsNeedPartialAcceleration_H265(mfxVideoParam* par, eMFXHWType type) { if (!par) return false; if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P210 || par->mfx.FrameInfo.FourCC == MFX_FOURCC_NV16) return true; return false; } inline mfxU16 MatchProfile(mfxU32 fourcc) { switch (fourcc) { case MFX_FOURCC_NV12: return MFX_PROFILE_HEVC_MAIN; case MFX_FOURCC_P010: return MFX_PROFILE_HEVC_MAIN10; case MFX_FOURCC_NV16: case MFX_FOURCC_YUY2: case MFX_FOURCC_AYUV: case MFX_FOURCC_Y210: case MFX_FOURCC_Y410: case MFX_FOURCC_P016: case MFX_FOURCC_Y216: case MFX_FOURCC_Y416: return MFX_PROFILE_HEVC_REXT; } return MFX_PROFILE_UNKNOWN; } inline bool CheckGUID(VideoCORE * core, eMFXHWType type, mfxVideoParam const* param) { (void)type; mfxVideoParam vp = *param; mfxU16 profile = vp.mfx.CodecProfile & 0xFF; if (profile == MFX_PROFILE_UNKNOWN) { profile = MatchProfile(vp.mfx.FrameInfo.FourCC); vp.mfx.CodecProfile |= profile; //preserve tier } if (core->IsGuidSupported(DXVA_ModeHEVC_VLD_Main, &vp) != MFX_ERR_NONE) return false; //Linux doesn't check GUID, just [mfxVideoParam] switch (profile) { case MFX_PROFILE_HEVC_MAIN: case MFX_PROFILE_HEVC_REXT: case MFX_PROFILE_HEVC_MAINSP: case MFX_PROFILE_HEVC_MAIN10: case MFX_PROFILE_HEVC_SCC: return true; } return false; } // Returns implementation platform eMFXPlatform GetPlatform_H265(VideoCORE * core, mfxVideoParam * par) { if (!par) return MFX_PLATFORM_SOFTWARE; eMFXPlatform platform = core->GetPlatformType(); eMFXHWType typeHW = MFX_HW_UNKNOWN; typeHW = core->GetHWType(); if (IsNeedPartialAcceleration_H265(par, typeHW) && platform != MFX_PLATFORM_SOFTWARE) { return MFX_PLATFORM_SOFTWARE; } if (platform != MFX_PLATFORM_SOFTWARE && !CheckGUID(core, typeHW, par)) platform = MFX_PLATFORM_SOFTWARE; return platform; } bool IsBugSurfacePoolApplicable(mfxVideoParam * par) { if (par == NULL) return false; return false; } inline mfxU16 QueryMaxProfile(eMFXHWType type) { (void)type; return MFX_PROFILE_HEVC_SCC; } inline bool CheckChromaFormat(mfxU16 profile, mfxU16 format) { assert(profile != MFX_PROFILE_UNKNOWN); assert( !(profile > MFX_PROFILE_HEVC_REXT) || profile == MFX_PROFILE_HEVC_SCC ); if (format > MFX_CHROMAFORMAT_YUV444) return false; struct supported_t { mfxU16 profile; mfxI8 chroma[4]; } static const supported[] = { { MFX_PROFILE_HEVC_MAIN, { -1, MFX_CHROMAFORMAT_YUV420, -1, -1 } }, { MFX_PROFILE_HEVC_MAIN10, { -1, MFX_CHROMAFORMAT_YUV420, -1, -1 } }, { MFX_PROFILE_HEVC_MAINSP, { -1, MFX_CHROMAFORMAT_YUV420, -1, -1 } }, { MFX_PROFILE_HEVC_REXT, { -1, MFX_CHROMAFORMAT_YUV420, MFX_CHROMAFORMAT_YUV422, MFX_CHROMAFORMAT_YUV444 } }, { MFX_PROFILE_HEVC_SCC, { -1, MFX_CHROMAFORMAT_YUV420, -1, MFX_CHROMAFORMAT_YUV444 } }, }; supported_t const *f = supported, *l = f + sizeof(supported) / sizeof(supported[0]); for (; f != l; ++f) if (f->profile == profile) break; return f != l && (*f).chroma[format] != -1; } inline bool CheckBitDepth(mfxU16 profile, mfxU16 bit_depth) { assert(profile != MFX_PROFILE_UNKNOWN); assert( !(profile > MFX_PROFILE_HEVC_REXT) || profile == MFX_PROFILE_HEVC_SCC ); struct minmax_t { mfxU16 profile; mfxU8 lo, hi; } static const minmax[] = { { MFX_PROFILE_HEVC_MAIN, 8, 8 }, { MFX_PROFILE_HEVC_MAIN10, 8, 10 }, { MFX_PROFILE_HEVC_MAINSP, 8, 8 }, { MFX_PROFILE_HEVC_REXT, 8, 12 }, //(12b max for Gen12) { MFX_PROFILE_HEVC_SCC, 8, 10 }, //(10b max for Gen12) }; minmax_t const *f = minmax, *l = f + sizeof(minmax) / sizeof(minmax[0]); for (; f != l; ++f) if (f->profile == profile) break; return f != l && !(bit_depth < f->lo) && !(bit_depth > f->hi) ; } inline mfxU32 CalculateFourcc(mfxU16 codecProfile, mfxFrameInfo const* frameInfo) { //map profile + chroma fmt + bit depth => fcc //Main - [4:2:0], [8] bit //Main10 - [4:2:0], [8, 10] bit //Extent - [4:2:0, 4:2:2, 4:4:4], [8, 10, 12, 16] if (codecProfile > MFX_PROFILE_HEVC_REXT && codecProfile != H265_PROFILE_SCC) return 0; if (!CheckChromaFormat(codecProfile, frameInfo->ChromaFormat)) return 0; if (!CheckBitDepth(codecProfile, frameInfo->BitDepthLuma)) return 0; if (!CheckBitDepth(codecProfile, frameInfo->BitDepthChroma)) return 0; mfxU16 bit_depth = std::max(frameInfo->BitDepthLuma, frameInfo->BitDepthChroma); //map chroma fmt & bit depth onto fourcc (NOTE: we currently don't support bit depth above 10 bit) mfxU32 const map[][4] = { /* 8 bit */ /* 10 bit */ { 0, 0, 0, 0 }, //400 { MFX_FOURCC_NV12, MFX_FOURCC_P010, MFX_FOURCC_P016, 0 }, //420 { MFX_FOURCC_YUY2, MFX_FOURCC_Y210, MFX_FOURCC_Y216, 0 }, //422 { MFX_FOURCC_AYUV, MFX_FOURCC_Y410, MFX_FOURCC_Y416, 0 } //444 }; assert( (frameInfo->ChromaFormat == MFX_CHROMAFORMAT_YUV400 || frameInfo->ChromaFormat == MFX_CHROMAFORMAT_YUV420 || frameInfo->ChromaFormat == MFX_CHROMAFORMAT_YUV422 || frameInfo->ChromaFormat == MFX_CHROMAFORMAT_YUV444) && "Unsupported chroma format, should be validated before" ); //align luma depth up to 2 (8-10-12 ...) bit_depth = (bit_depth + 2 - 1) & ~(2 - 1); assert(!(bit_depth & 1) && "Luma depth should be aligned up to 2"); assert( (bit_depth == 8 || bit_depth == 10 || bit_depth == 12) && "Unsupported bit depth, should be validated before" ); mfxU16 const bit_depth_idx = (bit_depth - 8) / 2; mfxU16 const max_bit_depth_idx = sizeof(map) / sizeof(map[0]); return bit_depth_idx < max_bit_depth_idx ? map[frameInfo->ChromaFormat][bit_depth_idx] : 0; } inline bool CheckFourcc(mfxU32 fourcc, mfxU16 codecProfile, mfxFrameInfo const* frameInfo) { assert(frameInfo); mfxFrameInfo fi = *frameInfo; if (codecProfile == MFX_PROFILE_UNKNOWN) //no profile defined, try to derive it from FOURCC codecProfile = MatchProfile(fourcc); if (!InitBitDepthFields(&fi)) { return false; } return CalculateFourcc(codecProfile, &fi) == fourcc; } // Initialize mfxVideoParam structure based on decoded bitstream header values UMC::Status FillVideoParam(const H265VideoParamSet * vps, const H265SeqParamSet * seq, mfxVideoParam *par, bool full) { par->mfx.CodecId = MFX_CODEC_HEVC; par->mfx.FrameInfo.Width = (mfxU16) (seq->pic_width_in_luma_samples); par->mfx.FrameInfo.Height = (mfxU16) (seq->pic_height_in_luma_samples); par->mfx.FrameInfo.Width = mfx::align2_value(par->mfx.FrameInfo.Width, 16); par->mfx.FrameInfo.Height = mfx::align2_value(par->mfx.FrameInfo.Height, 16); par->mfx.FrameInfo.BitDepthLuma = (mfxU16) (seq->bit_depth_luma); par->mfx.FrameInfo.BitDepthChroma = (mfxU16) (seq->bit_depth_chroma); par->mfx.FrameInfo.Shift = 0; //if (seq->frame_cropping_flag) { par->mfx.FrameInfo.CropX = (mfxU16)(seq->conf_win_left_offset + seq->def_disp_win_left_offset); par->mfx.FrameInfo.CropY = (mfxU16)(seq->conf_win_top_offset + seq->def_disp_win_top_offset); par->mfx.FrameInfo.CropH = (mfxU16)(par->mfx.FrameInfo.Height - (seq->conf_win_top_offset + seq->conf_win_bottom_offset + seq->def_disp_win_top_offset + seq->def_disp_win_bottom_offset)); par->mfx.FrameInfo.CropW = (mfxU16)(par->mfx.FrameInfo.Width - (seq->conf_win_left_offset + seq->conf_win_right_offset + seq->def_disp_win_left_offset + seq->def_disp_win_right_offset)); par->mfx.FrameInfo.CropH -= (mfxU16)(par->mfx.FrameInfo.Height - seq->pic_height_in_luma_samples); par->mfx.FrameInfo.CropW -= (mfxU16)(par->mfx.FrameInfo.Width - seq->pic_width_in_luma_samples); } par->mfx.FrameInfo.PicStruct = static_cast(seq->field_seq_flag ? MFX_PICSTRUCT_FIELD_SINGLE : MFX_PICSTRUCT_PROGRESSIVE); par->mfx.FrameInfo.ChromaFormat = seq->chroma_format_idc; if (seq->aspect_ratio_info_present_flag || full) { par->mfx.FrameInfo.AspectRatioW = (mfxU16)seq->sar_width; par->mfx.FrameInfo.AspectRatioH = (mfxU16)seq->sar_height; } else { par->mfx.FrameInfo.AspectRatioW = 0; par->mfx.FrameInfo.AspectRatioH = 0; } if (vps != nullptr && (vps->getTimingInfo()->vps_timing_info_present_flag || full)) { par->mfx.FrameInfo.FrameRateExtD = vps->getTimingInfo()->vps_num_units_in_tick; par->mfx.FrameInfo.FrameRateExtN = vps->getTimingInfo()->vps_time_scale; } else if (seq->getTimingInfo()->vps_timing_info_present_flag || full) { par->mfx.FrameInfo.FrameRateExtD = seq->getTimingInfo()->vps_num_units_in_tick; par->mfx.FrameInfo.FrameRateExtN = seq->getTimingInfo()->vps_time_scale; } par->mfx.CodecProfile = (mfxU16)seq->m_pcPTL.GetGeneralPTL()->profile_idc; par->mfx.CodecLevel = (mfxU16)seq->m_pcPTL.GetGeneralPTL()->level_idc; par->mfx.CodecLevel |= seq->m_pcPTL.GetGeneralPTL()->tier_flag ? MFX_TIER_HEVC_HIGH : MFX_TIER_HEVC_MAIN; par->mfx.MaxDecFrameBuffering = (mfxU16)seq->sps_max_dec_pic_buffering[0]; // CodecProfile can't be UNKNOWN here (it comes from SPS), that's asserted at CalculateFourcc par->mfx.FrameInfo.FourCC = CalculateFourcc(par->mfx.CodecProfile, &par->mfx.FrameInfo); par->mfx.DecodedOrder = 0; // video signal section mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (videoSignal) { videoSignal->VideoFormat = (mfxU16)seq->video_format; videoSignal->VideoFullRange = (mfxU16)seq->video_full_range_flag; videoSignal->ColourDescriptionPresent = (mfxU16)seq->colour_description_present_flag; videoSignal->ColourPrimaries = (mfxU16)seq->colour_primaries; videoSignal->TransferCharacteristics = (mfxU16)seq->transfer_characteristics; videoSignal->MatrixCoefficients = (mfxU16)seq->matrix_coeffs; } mfxExtHEVCParam * hevcParam = (mfxExtHEVCParam *)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_HEVC_PARAM); if (hevcParam) { hevcParam->PicWidthInLumaSamples = (mfxU16) (seq->pic_width_in_luma_samples); hevcParam->PicHeightInLumaSamples = (mfxU16) (seq->pic_height_in_luma_samples); hevcParam->GeneralConstraintFlags = 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_12bit_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_12BIT : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_10bit_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_10BIT : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_8bit_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_8BIT : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_422chroma_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_422CHROMA : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_420chroma_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_420CHROMA : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->max_monochrome_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_MAX_MONOCHROME : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->intra_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_INTRA : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->one_picture_only_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY : 0; hevcParam->GeneralConstraintFlags |= seq->getPTL()->GetGeneralPTL()->lower_bit_rate_constraint_flag ? (mfxU64) MFX_HEVC_CONSTR_REXT_LOWER_BIT_RATE : 0; } return UMC::UMC_OK; } // Helper class for gathering header NAL units class HeadersAnalyzer { public: HeadersAnalyzer(TaskSupplier_H265 * supplier) : m_isVPSFound(false) , m_isSPSFound(false) , m_isPPSFound(false) , m_supplier(supplier) , m_lastSlice(0) {} virtual ~HeadersAnalyzer() { if (m_lastSlice) m_lastSlice->DecrementReference(); } // Decode a memory buffer looking for header NAL units in it virtual UMC::Status DecodeHeader(UMC::MediaData* params, mfxBitstream *bs, mfxVideoParam *out); // Find headers nal units and parse them virtual UMC::Status ProcessNalUnit(UMC::MediaData * data); // Returns whether necessary headers are found virtual bool IsEnough() const { return m_isSPSFound && m_isPPSFound; } protected: bool m_isVPSFound; bool m_isSPSFound; bool m_isPPSFound; TaskSupplier_H265 * m_supplier; H265Slice * m_lastSlice; }; // Decode a memory buffer looking for header NAL units in it UMC::Status HeadersAnalyzer::DecodeHeader(UMC::MediaData * data, mfxBitstream *bs, mfxVideoParam *) { if (!data) return UMC::UMC_ERR_NULL_PTR; m_lastSlice = 0; H265SeqParamSet* first_sps = 0; notifier0 sps_guard(&H265Slice::DecrementReference); mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; if (extbuf) data->SetAuxInfo(extbuf, extbuf->BufferSz, extbuf->BufferId); UMC::Status umcRes = UMC::UMC_ERR_NOT_ENOUGH_DATA; for ( ; data->GetDataSize() > 3; ) { m_supplier->GetNalUnitSplitter()->MoveToStartCode(data); // move data pointer to start code if (!m_isSPSFound) // move point to first start code { bs->DataOffset = (mfxU32)((mfxU8*)data->GetDataPointer() - (mfxU8*)data->GetBufferPointer()); bs->DataLength = (mfxU32)data->GetDataSize(); } umcRes = ProcessNalUnit(data); if (umcRes == UMC::UMC_ERR_UNSUPPORTED) umcRes = UMC::UMC_OK; if (umcRes != UMC::UMC_OK) break; if (!first_sps && m_isSPSFound) { first_sps = m_supplier->GetHeaders()->m_SeqParams.GetCurrentHeader(); assert(first_sps && "Current SPS should be valid when [m_isSPSFound]"); MFX_CHECK_NULL_PTR1(first_sps); first_sps->IncrementReference(); sps_guard.Reset(first_sps); } if (IsEnough()) break; } if (umcRes == UMC::UMC_ERR_SYNC) // move pointer { bs->DataOffset = (mfxU32)((mfxU8*)data->GetDataPointer() - (mfxU8*)data->GetBufferPointer()); bs->DataLength = (mfxU32)data->GetDataSize(); return UMC::UMC_ERR_NOT_ENOUGH_DATA; } if (umcRes == UMC::UMC_ERR_NOT_ENOUGH_DATA) { bool isEOS = ((data->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_END_OF_STREAM) != 0) || ((data->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) == 0); if (isEOS) { return UMC::UMC_OK; } } if (IsEnough()) { H265SeqParamSet* last_sps = m_supplier->GetHeaders()->m_SeqParams.GetCurrentHeader(); if (first_sps && first_sps != last_sps) m_supplier->GetHeaders()->m_SeqParams.AddHeader(first_sps); return UMC::UMC_OK; } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // Find headers nal units and parse them UMC::Status HeadersAnalyzer::ProcessNalUnit(UMC::MediaData * data) { try { int32_t startCode = m_supplier->GetNalUnitSplitter()->CheckNalUnitType(data); bool needProcess = false; UMC::MediaDataEx *nalUnit = m_supplier->GetNalUnit(data); switch (startCode) { case NAL_UT_CODED_SLICE_TRAIL_R: case NAL_UT_CODED_SLICE_TRAIL_N: case NAL_UT_CODED_SLICE_TLA_R: case NAL_UT_CODED_SLICE_TSA_N: case NAL_UT_CODED_SLICE_STSA_R: case NAL_UT_CODED_SLICE_STSA_N: case NAL_UT_CODED_SLICE_BLA_W_LP: case NAL_UT_CODED_SLICE_BLA_W_RADL: case NAL_UT_CODED_SLICE_BLA_N_LP: case NAL_UT_CODED_SLICE_IDR_W_RADL: case NAL_UT_CODED_SLICE_IDR_N_LP: case NAL_UT_CODED_SLICE_CRA: case NAL_UT_CODED_SLICE_RADL_R: case NAL_UT_CODED_SLICE_RASL_R: { if (IsEnough()) { return UMC::UMC_OK; } else break; // skip nal unit } break; case NAL_UT_VPS: case NAL_UT_SPS: case NAL_UT_PPS: needProcess = true; break; default: break; }; if (!nalUnit) { return UMC::UMC_ERR_NOT_ENOUGH_DATA; } if (needProcess) { try { UMC::Status umcRes = m_supplier->ProcessNalUnit(nalUnit); if (umcRes < UMC::UMC_OK) { return UMC::UMC_OK; } } catch(h265_exception& ex) { if (ex.GetStatus() != UMC::UMC_ERR_UNSUPPORTED) { throw; } } switch (startCode) { case NAL_UT_VPS: m_isVPSFound = true; break; case NAL_UT_SPS: m_isSPSFound = true; break; case NAL_UT_PPS: m_isPPSFound = true; break; default: break; }; return UMC::UMC_OK; } } catch(const h265_exception & ex) { return ex.GetStatus(); } return UMC::UMC_OK; } // Find bitstream header NAL units, parse them and fill application parameters structure UMC::Status DecodeHeader(TaskSupplier_H265 * supplier, UMC::VideoDecoderParams* params, mfxBitstream *bs, mfxVideoParam *out) { UMC::Status umcRes = UMC::UMC_OK; if (!params->m_pData) return UMC::UMC_ERR_NULL_PTR; if (!params->m_pData->GetDataSize()) return UMC::UMC_ERR_NOT_ENOUGH_DATA; umcRes = supplier->PreInit(params); if (umcRes != UMC::UMC_OK) return UMC::UMC_ERR_FAILED; HeadersAnalyzer headersDecoder(supplier); umcRes = headersDecoder.DecodeHeader(params->m_pData, bs, out); if (umcRes != UMC::UMC_OK) return umcRes; return umcRes = supplier->GetInfo(params); } // MediaSDK DECODE_Query API function mfxStatus Query_H265(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out, eMFXHWType type) { MFX_CHECK_NULL_PTR1(out); mfxStatus sts = MFX_ERR_NONE; if (in == out) { mfxVideoParam in1; MFX_INTERNAL_CPY(&in1, in, sizeof(mfxVideoParam)); return MFX_Utility::Query_H265(core, &in1, out, type); } memset(&out->mfx, 0, sizeof(mfxInfoMFX)); if (in) { out->mfx.MaxDecFrameBuffering = in->mfx.MaxDecFrameBuffering; if (in->mfx.CodecId == MFX_CODEC_HEVC) out->mfx.CodecId = in->mfx.CodecId; //use [core :: GetHWType] instead of given argument [type] //because it may be unknown after [GetPlatform_H265] mfxU16 profile = QueryMaxProfile(core->GetHWType()); if (in->mfx.CodecProfile == MFX_PROFILE_HEVC_MAINSP || in->mfx.CodecProfile <= profile) out->mfx.CodecProfile = in->mfx.CodecProfile; else { sts = MFX_ERR_UNSUPPORTED; } if (out->mfx.CodecProfile != MFX_PROFILE_UNKNOWN) profile = out->mfx.CodecProfile; mfxU32 const level = ExtractProfile(in->mfx.CodecLevel); switch (level) { case MFX_LEVEL_UNKNOWN: case MFX_LEVEL_HEVC_1: case MFX_LEVEL_HEVC_2: case MFX_LEVEL_HEVC_21: case MFX_LEVEL_HEVC_3: case MFX_LEVEL_HEVC_31: case MFX_LEVEL_HEVC_4: case MFX_LEVEL_HEVC_41: case MFX_LEVEL_HEVC_5: case MFX_LEVEL_HEVC_51: case MFX_LEVEL_HEVC_52: case MFX_LEVEL_HEVC_6: case MFX_LEVEL_HEVC_61: case MFX_LEVEL_HEVC_62: out->mfx.CodecLevel = in->mfx.CodecLevel; break; default: sts = MFX_ERR_UNSUPPORTED; break; } if (in->mfx.NumThread < 128) { out->mfx.NumThread = in->mfx.NumThread; } else { sts = MFX_ERR_UNSUPPORTED; } out->AsyncDepth = in->AsyncDepth; out->mfx.DecodedOrder = in->mfx.DecodedOrder; if (in->mfx.DecodedOrder > 1) { sts = MFX_ERR_UNSUPPORTED; out->mfx.DecodedOrder = 0; } if (in->mfx.TimeStampCalc) { if (in->mfx.TimeStampCalc == 1) in->mfx.TimeStampCalc = out->mfx.TimeStampCalc; else sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.ExtendedPicStruct) { if (in->mfx.ExtendedPicStruct == 1) in->mfx.ExtendedPicStruct = out->mfx.ExtendedPicStruct; else sts = MFX_STS_TRACE(MFX_ERR_UNSUPPORTED); } if (in->IOPattern) { if ( in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY || in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY ) out->IOPattern = in->IOPattern; else sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV400 || CheckChromaFormat(profile, in->mfx.FrameInfo.ChromaFormat)) out->mfx.FrameInfo.ChromaFormat = in->mfx.FrameInfo.ChromaFormat; else sts = MFX_ERR_UNSUPPORTED; if (in->mfx.FrameInfo.Width % 16 == 0 && in->mfx.FrameInfo.Width <= 16384) out->mfx.FrameInfo.Width = in->mfx.FrameInfo.Width; else { out->mfx.FrameInfo.Width = 0; sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.FrameInfo.Height % 16 == 0 && in->mfx.FrameInfo.Height <= 16384) out->mfx.FrameInfo.Height = in->mfx.FrameInfo.Height; else { out->mfx.FrameInfo.Height = 0; sts = MFX_ERR_UNSUPPORTED; } if ((in->mfx.FrameInfo.Width || in->mfx.FrameInfo.Height) && !(in->mfx.FrameInfo.Width && in->mfx.FrameInfo.Height)) { out->mfx.FrameInfo.Width = 0; out->mfx.FrameInfo.Height = 0; sts = MFX_ERR_UNSUPPORTED; } if (!in->mfx.FrameInfo.Width || ( in->mfx.FrameInfo.CropX <= in->mfx.FrameInfo.Width && in->mfx.FrameInfo.CropY <= in->mfx.FrameInfo.Height && in->mfx.FrameInfo.CropX + in->mfx.FrameInfo.CropW <= in->mfx.FrameInfo.Width && in->mfx.FrameInfo.CropY + in->mfx.FrameInfo.CropH <= in->mfx.FrameInfo.Height)) { out->mfx.FrameInfo.CropX = in->mfx.FrameInfo.CropX; out->mfx.FrameInfo.CropY = in->mfx.FrameInfo.CropY; out->mfx.FrameInfo.CropW = in->mfx.FrameInfo.CropW; out->mfx.FrameInfo.CropH = in->mfx.FrameInfo.CropH; } else { out->mfx.FrameInfo.CropX = 0; out->mfx.FrameInfo.CropY = 0; out->mfx.FrameInfo.CropW = 0; out->mfx.FrameInfo.CropH = 0; sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.FrameRateExtN = in->mfx.FrameInfo.FrameRateExtN; out->mfx.FrameInfo.FrameRateExtD = in->mfx.FrameInfo.FrameRateExtD; if ((in->mfx.FrameInfo.FrameRateExtN || in->mfx.FrameInfo.FrameRateExtD) && !(in->mfx.FrameInfo.FrameRateExtN && in->mfx.FrameInfo.FrameRateExtD)) { out->mfx.FrameInfo.FrameRateExtN = 0; out->mfx.FrameInfo.FrameRateExtD = 0; sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.AspectRatioW = in->mfx.FrameInfo.AspectRatioW; out->mfx.FrameInfo.AspectRatioH = in->mfx.FrameInfo.AspectRatioH; if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) { out->mfx.FrameInfo.AspectRatioW = 0; out->mfx.FrameInfo.AspectRatioH = 0; sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.BitDepthLuma = in->mfx.FrameInfo.BitDepthLuma; if (in->mfx.FrameInfo.BitDepthLuma && !CheckBitDepth(profile, in->mfx.FrameInfo.BitDepthLuma)) { out->mfx.FrameInfo.BitDepthLuma = 0; sts = MFX_ERR_UNSUPPORTED; } out->mfx.FrameInfo.BitDepthChroma = in->mfx.FrameInfo.BitDepthChroma; if (in->mfx.FrameInfo.BitDepthChroma && !CheckBitDepth(profile, in->mfx.FrameInfo.BitDepthChroma)) { out->mfx.FrameInfo.BitDepthChroma = 0; sts = MFX_ERR_UNSUPPORTED; } if (in->mfx.FrameInfo.FourCC) { if(CheckFourcc(in->mfx.FrameInfo.FourCC, profile, &in->mfx.FrameInfo)) out->mfx.FrameInfo.FourCC = in->mfx.FrameInfo.FourCC; else { out->mfx.FrameInfo.FourCC = 0; sts = MFX_ERR_UNSUPPORTED; } } out->mfx.FrameInfo.Shift = in->mfx.FrameInfo.Shift; if (in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416 ) { if (in->mfx.FrameInfo.Shift > 1) { out->mfx.FrameInfo.Shift = 0; sts = MFX_ERR_UNSUPPORTED; } } else { if (in->mfx.FrameInfo.Shift) { out->mfx.FrameInfo.Shift = 0; sts = MFX_ERR_UNSUPPORTED; } } switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_SINGLE: out->mfx.FrameInfo.PicStruct = in->mfx.FrameInfo.PicStruct; break; default: sts = MFX_ERR_UNSUPPORTED; break; } mfxStatus stsExt = CheckDecodersExtendedBuffers(in); if (stsExt < MFX_ERR_NONE) sts = MFX_ERR_UNSUPPORTED; if (in->Protected) { out->Protected = in->Protected; if (type == MFX_HW_UNKNOWN) { sts = MFX_ERR_UNSUPPORTED; out->Protected = 0; } if (!IS_PROTECTION_ANY(in->Protected)) { sts = MFX_ERR_UNSUPPORTED; out->Protected = 0; } if (!(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY)) { out->IOPattern = 0; sts = MFX_ERR_UNSUPPORTED; } } if (GetPlatform_H265(core, out) != core->GetPlatformType() && sts == MFX_ERR_NONE) { assert(GetPlatform_H265(core, out) == MFX_PLATFORM_SOFTWARE); sts = MFX_ERR_UNSUPPORTED; } } else { out->mfx.CodecId = MFX_CODEC_HEVC; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.NumThread = 1; out->mfx.DecodedOrder = 1; out->mfx.SliceGroupsPresent = 1; out->mfx.ExtendedPicStruct = 1; out->AsyncDepth = 1; // mfxFrameInfo out->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; out->mfx.FrameInfo.Width = 16; out->mfx.FrameInfo.Height = 16; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; out->mfx.FrameInfo.BitDepthLuma = 8; out->mfx.FrameInfo.BitDepthChroma = 8; out->mfx.FrameInfo.Shift = 0; out->Protected = 0; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; if (type == MFX_HW_UNKNOWN) { out->IOPattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; } else { out->IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; } } return sts; } // Validate input parameters bool CheckVideoParam_H265(mfxVideoParam *in, eMFXHWType type) { if (!in) return false; if (in->Protected) { if (type == MFX_HW_UNKNOWN || !IS_PROTECTION_ANY(in->Protected)) return false; } if (MFX_CODEC_HEVC != in->mfx.CodecId) return false; // Add check that width is multiple of minimal CU size if (in->mfx.FrameInfo.Width > 16384 /* || (in->mfx.FrameInfo.Width % in->mfx.FrameInfo.reserved[0]) */) return false; // Add check that height is multiple of minimal CU size if (in->mfx.FrameInfo.Height > 16384 /* || (in->mfx.FrameInfo.Height % in->mfx.FrameInfo.reserved[0]) */) return false; if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P010 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_YUY2 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_AYUV && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y410 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P016 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y216 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y416 ) return false; // both zero or not zero if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) return false; if (in->mfx.CodecProfile != MFX_PROFILE_HEVC_MAIN && in->mfx.CodecProfile != MFX_PROFILE_HEVC_MAIN10 && in->mfx.CodecProfile != MFX_PROFILE_HEVC_MAINSP && in->mfx.CodecProfile != MFX_PROFILE_HEVC_REXT && in->mfx.CodecProfile != MFX_PROFILE_HEVC_SCC) return false; //BitDepthLuma & BitDepthChroma is also checked here if (!CheckFourcc(in->mfx.FrameInfo.FourCC, in->mfx.CodecProfile, &in->mfx.FrameInfo)) return false; if (in->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_P016 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y216 || in->mfx.FrameInfo.FourCC == MFX_FOURCC_Y416) { if (in->mfx.FrameInfo.Shift > 1) return false; } else { if (in->mfx.FrameInfo.Shift) return false; } switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: case MFX_PICSTRUCT_FIELD_REPEATED: case MFX_PICSTRUCT_FRAME_DOUBLING: case MFX_PICSTRUCT_FRAME_TRIPLING: case MFX_PICSTRUCT_FIELD_SINGLE: break; default: return false; } if (in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV400 && in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420 && in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV422 && in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV444 ) return false; if ( !(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) ) return false; if ((in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; return true; } } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_nal_spl.cpp000066400000000000000000000434521443134507600317060ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_nal_spl.h" #include "mfx_common.h" // for trace routines namespace UMC_HEVC_DECODER { // NAL unit definitions enum { NAL_UNITTYPE_SHIFT_H265 = 1, NAL_UNITTYPE_BITS_H265 = 0x7e, }; // Change memory region to little endian for reading with 32-bit DWORDs and remove start code emulation prevention byteps void SwapMemoryAndRemovePreventingBytes_H265(void *pDestination, size_t &nDstSize, void *pSource, size_t nSrcSize, std::vector *pRemovedOffsets); // Search bitstream for start code static int32_t FindStartCode(const uint8_t *pb, size_t &nSize) { // there is no data if ((int32_t) nSize < 4) return -1; // find start code while ((4 <= nSize) && ((0 != pb[0]) || (0 != pb[1]) || (1 != pb[2]))) { pb += 1; nSize -= 1; } if (4 <= nSize) return ((pb[0] << 24) | (pb[1] << 16) | (pb[2] << 8) | (pb[3])); return -1; } // int32_t FindStartCode(uint8_t * (&pb), size_t &nSize) // NAL unit splitter class class StartCodeIterator : public StartCodeIteratorBase { public: StartCodeIterator() : m_code(-1) , m_pts(-1) { Reset(); } virtual void Reset() { m_code = -1; m_pts = -1; m_prev.clear(); } // Initialize with bitstream buffer virtual int32_t Init(UMC::MediaData * pSource) { Reset(); StartCodeIteratorBase::Init(pSource); int32_t iCode = UMC_HEVC_DECODER::FindStartCode(m_pSource, m_nSourceSize); return iCode; } // Returns first NAL unit ID in memory buffer virtual int32_t CheckNalUnitType(UMC::MediaData * pSource) { if (!pSource) return -1; uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); int32_t startCodeSize; return FindStartCode(source, size, startCodeSize); } // Set bitstream pointer to start code address virtual int32_t MoveToStartCode(UMC::MediaData * pSource) { if (!pSource) return -1; if (m_code == -1) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); int32_t startCodeSize; int32_t iCodeNext = FindStartCode(source, size, startCodeSize); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); if (iCodeNext != -1) { pSource->MoveDataPointer(-startCodeSize); } return iCodeNext; } // Set destination bitstream pointer and size to NAL unit virtual int32_t GetNALUnit(UMC::MediaData * pSource, UMC::MediaData * pDst) { if (!pSource) return EndOfStream(pDst); int32_t iCode = GetNALUnitInternal(pSource, pDst); if (iCode == -1) { bool endOfStream = pSource && ((pSource->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_END_OF_STREAM) != 0); if (endOfStream) iCode = EndOfStream(pDst); } return iCode; } // Set destination bitstream pointer and size to NAL unit int32_t GetNALUnitInternal(UMC::MediaData * pSource, UMC::MediaData * pDst) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "GetNALUnitInternal"); static const uint8_t startCodePrefix[] = {0, 0, 1}; if (m_code == -1) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); if (!size) return -1; int32_t startCodeSize; int32_t iCodeNext = FindStartCode(source, size, startCodeSize); // Use start code data which is saved from previous call because start code could be split between input buffers from application if (!m_prev.empty()) { if (iCodeNext == -1) { size_t szToAdd = source - (uint8_t *)pSource->GetDataPointer(); size_t szToMove = szToAdd; if (m_prev.size() + szToAdd > m_suggestedSize) { szToAdd = (m_suggestedSize > m_prev.size()) ? m_suggestedSize - m_prev.size() : 0; } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + szToAdd); pSource->MoveDataPointer((int32_t)szToMove); return -1; } source -= startCodeSize; m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), source); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); pDst->SetFlags(UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME); pDst->SetBufferPointer(&(m_prev[3]), m_prev.size() - 3); pDst->SetDataSize(m_prev.size() - 3); pDst->SetTime(m_pts); int32_t code = m_code; m_code = -1; m_pts = -1; return code; } if (iCodeNext == -1) { pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); return -1; } m_pts = pSource->GetTime(); m_code = iCodeNext; // move before start code pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer() - startCodeSize)); int32_t startCodeSize1; iCodeNext = FindStartCode(source, size, startCodeSize1); pSource->MoveDataPointer(startCodeSize); uint32_t flags = pSource->GetFlags(); if (iCodeNext == -1 && !(flags & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_UNIT)) { iCodeNext = 1; startCodeSize1 = 0; source += size; size = 0; MFX_LOG_ERROR("Incomplete bitstream will be sent to driver in completeframe mode \n"); } if (iCodeNext == -1) { if (m_code == NAL_UT_SPS) { pSource->MoveDataPointer(-startCodeSize); // leave start code for SPS return -1; } assert(!m_prev.size()); size_t sz = source - (uint8_t *)pSource->GetDataPointer(); size_t szToMove = sz; if (sz > m_suggestedSize) { sz = m_suggestedSize; } if (!m_prev.size()) { for (uint32_t i = 0; i < sizeof(startCodePrefix) / sizeof(uint8_t); i++) { m_prev.push_back(startCodePrefix[i]); } } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + sz); pSource->MoveDataPointer((int32_t)szToMove); return -1; } // fill size_t nal_size = source - (uint8_t *)pSource->GetDataPointer() - startCodeSize1; pDst->SetBufferPointer((uint8_t*)pSource->GetDataPointer(), nal_size); pDst->SetDataSize(nal_size); pDst->SetFlags(pSource->GetFlags()); pSource->MoveDataPointer((int32_t)nal_size); int32_t code = m_code; m_code = -1; pDst->SetTime(m_pts); m_pts = -1; return code; } // Reset state because stream is finished int32_t EndOfStream(UMC::MediaData * pDst) { if (m_code == -1) { m_prev.clear(); return -1; } if (m_prev.size()) { pDst->SetBufferPointer(&(m_prev[3]), m_prev.size() - 3); pDst->SetDataSize(m_prev.size() - 3); pDst->SetTime(m_pts); int32_t code = m_code; m_code = -1; m_pts = -1; return code; } m_code = -1; return -1; } private: std::vector m_prev; int32_t m_code; double m_pts; // Searches NAL unit start code, places input pointer to it and fills up size paramters // ML: OPT: Replace with MaxL's fast start code search int32_t FindStartCode(uint8_t * (&pb), size_t & size, int32_t & startCodeSize) { uint32_t zeroCount = 0; int32_t i = 0; for (; i < (int32_t)size - 2; ) { if (pb[1]) { pb += 2; i += 2; continue; } zeroCount = 0; if (!pb[0]) zeroCount++; uint32_t j; for (j = 1; j < (uint32_t)size - i; j++) { if (pb[j]) break; } zeroCount = zeroCount ? j: j - 1; pb += j; i += j; if (i >= (int32_t)size) { break; } if (zeroCount >= 2 && pb[0] == 1) { startCodeSize = std::min(zeroCount + 1, 4u); size -= i + 1; pb++; // remove 0x01 symbol if (size >= 1) { return (pb[0] & NAL_UNITTYPE_BITS_H265) >> NAL_UNITTYPE_SHIFT_H265; } else { pb -= startCodeSize; size += startCodeSize; startCodeSize = 0; return -1; } } zeroCount = 0; } if (!zeroCount) { for (uint32_t k = 0; k < size - i; k++, pb++) { if (pb[0]) { zeroCount = 0; continue; } zeroCount++; } } zeroCount = std::min(zeroCount, 3u); pb -= zeroCount; size = zeroCount; startCodeSize = zeroCount; return -1; } }; // Memory big-to-little endian converter implementation class Swapper : public SwapperBase { public: virtual void SwapMemory(uint8_t *pDestination, size_t &nDstSize, uint8_t *pSource, size_t nSrcSize, std::vector *pRemovedOffsets) { SwapMemoryAndRemovePreventingBytes_H265(pDestination, nDstSize, pSource, nSrcSize, pRemovedOffsets); } virtual void SwapMemory(MemoryPiece * pMemDst, MemoryPiece * pMemSrc, std::vector *pRemovedOffsets) { size_t dstSize = pMemSrc->GetDataSize(); SwapMemory(pMemDst->GetPointer(), dstSize, pMemSrc->GetPointer(), pMemSrc->GetDataSize(), pRemovedOffsets); assert(pMemDst->GetSize() >= dstSize); size_t tail_size = std::min(pMemDst->GetSize() - dstSize, DEFAULT_NU_TAIL_SIZE); memset(pMemDst->GetPointer() + dstSize, DEFAULT_NU_TAIL_VALUE, tail_size); pMemDst->SetDataSize(dstSize); pMemDst->SetTime(pMemSrc->GetTime()); } }; NALUnitSplitter_H265::NALUnitSplitter_H265() : m_pSwapper(0) , m_pStartCodeIter(0) { m_MediaData.SetExData(&m_MediaDataEx); } NALUnitSplitter_H265::~NALUnitSplitter_H265() { Release(); } // Initialize splitter with default values void NALUnitSplitter_H265::Init() { Release(); m_pSwapper = new Swapper(); m_pStartCodeIter = new StartCodeIterator(); } // Reset state void NALUnitSplitter_H265::Reset() { if (m_pStartCodeIter) { m_pStartCodeIter->Reset(); } } // Free resources void NALUnitSplitter_H265::Release() { delete m_pSwapper; m_pSwapper = 0; delete m_pStartCodeIter; m_pStartCodeIter = 0; } // Returns first NAL unit ID in memory buffer int32_t NALUnitSplitter_H265::CheckNalUnitType(UMC::MediaData * pSource) { return m_pStartCodeIter->CheckNalUnitType(pSource); // find first start code } // Set bitstream pointer to start code address int32_t NALUnitSplitter_H265::MoveToStartCode(UMC::MediaData * pSource) { return m_pStartCodeIter->MoveToStartCode(pSource); // find first start code } // Set destination bitstream pointer and size to NAL unit UMC::MediaDataEx * NALUnitSplitter_H265::GetNalUnits(UMC::MediaData * pSource) { UMC::MediaDataEx * out = &m_MediaData; UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = &m_MediaDataEx; int32_t iCode = m_pStartCodeIter->GetNALUnit(pSource, out); if (iCode == -1) { pMediaDataEx->count = 0; return 0; } pMediaDataEx->values[0] = iCode; pMediaDataEx->offsets[0] = 0; pMediaDataEx->offsets[1] = (int32_t)out->GetDataSize(); pMediaDataEx->count = 1; pMediaDataEx->index = 0; return out; } // Utility class for writing 32-bit little endian integers class H265DwordPointer_ { public: // Default constructor H265DwordPointer_(void) { m_pDest = NULL; m_iCur = 0; m_nByteNum = 0; } H265DwordPointer_ operator = (void *pDest) { m_pDest = (uint32_t *) pDest; m_nByteNum = 0; m_iCur = 0; return *this; } // Increment operator H265DwordPointer_ &operator ++ (void) { if (4 == ++m_nByteNum) { *m_pDest = m_iCur; m_pDest += 1; m_nByteNum = 0; m_iCur = 0; } else m_iCur <<= 8; return *this; } uint8_t operator = (uint8_t nByte) { m_iCur = (m_iCur & ~0x0ff) | ((uint32_t) nByte); return nByte; } protected: uint32_t *m_pDest; // (uint32_t *) pointer to destination buffer uint32_t m_nByteNum; // (uint32_t) number of current byte in dword uint32_t m_iCur; // (uint32_t) current dword }; // Utility class for reading big endian bitstream class H265SourcePointer_ { public: // Default constructor H265SourcePointer_(void) { m_nZeros = 0; m_pSource = NULL; m_nRemovedBytes = 0; } H265SourcePointer_ &operator = (void *pSource) { m_pSource = (uint8_t *) pSource; m_nZeros = 0; m_nRemovedBytes = 0; return *this; } H265SourcePointer_ &operator ++ (void) { uint8_t bCurByte = m_pSource[0]; if (0 == bCurByte) m_nZeros += 1; else { if ((3 == bCurByte) && (2 <= m_nZeros)) m_nRemovedBytes += 1; m_nZeros = 0; } m_pSource += 1; return *this; } bool IsPrevent(void) { if ((3 == m_pSource[0]) && (2 <= m_nZeros)) return true; else return false; } operator uint8_t (void) { return m_pSource[0]; } uint32_t GetRemovedBytes(void) { return m_nRemovedBytes; } protected: uint8_t *m_pSource; // (uint8_t *) pointer to destination buffer uint32_t m_nZeros; // (uint32_t) number of preceding zeros uint32_t m_nRemovedBytes; // (uint32_t) number of removed bytes }; // Change memory region to little endian for reading with 32-bit DWORDs and remove start code emulation prevention byteps void SwapMemoryAndRemovePreventingBytes_H265(void *pDestination, size_t &nDstSize, void *pSource, size_t nSrcSize, std::vector *pRemovedOffsets) { H265DwordPointer_ pDst; H265SourcePointer_ pSrc; size_t i; // DwordPointer object is swapping written bytes // H265SourcePointer_ removes preventing start-code bytes // reset pointer(s) pSrc = pSource; pDst = pDestination; // first two bytes i = 0; while (i < std::min(size_t(2), nSrcSize)) { pDst = (uint8_t) pSrc; ++pDst; ++pSrc; ++i; } // do swapping if (NULL != pRemovedOffsets) { while (i < (uint32_t) nSrcSize) { if (false == pSrc.IsPrevent()) { pDst = (uint8_t) pSrc; ++pDst; } else pRemovedOffsets->push_back(uint32_t(i)); ++pSrc; ++i; } } else { while (i < (uint32_t) nSrcSize) { if (false == pSrc.IsPrevent()) { pDst = (uint8_t) pSrc; ++pDst; } ++pSrc; ++i; } } // write padding bytes nDstSize = nSrcSize - pSrc.GetRemovedBytes(); while (nDstSize & 3) { pDst = (uint8_t) (0); ++nDstSize; ++pDst; } } // void SwapMemoryAndRemovePreventingBytes_H265(void *pDst, size_t &nDstSize, void *pSrc, size_t nSrcSize, , std::vector *pRemovedOffsets) } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_scaling_list.cpp000066400000000000000000000142261443134507600327260ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_dec_defs.h" #include "umc_h265_bitstream_headers.h" #include "umc_h265_tables.h" namespace UMC_HEVC_DECODER { // Allocate and initialize scaling list tables void H265ScalingList::init() { assert(!m_initialized); for (uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { uint32_t scalingListNum = g_scalingListNum[sizeId]; uint32_t scalingListSize = g_scalingListSize[sizeId]; int16_t* pScalingList = h265_new_array_throw(scalingListNum * scalingListSize * SCALING_LIST_REM_NUM); for (uint32_t listId = 0; listId < scalingListNum; listId++) { for (uint32_t qp = 0; qp < SCALING_LIST_REM_NUM; qp++) { m_dequantCoef[sizeId][listId][qp] = pScalingList + (qp * scalingListSize); } pScalingList += (SCALING_LIST_REM_NUM * scalingListSize); } } //alias list [1] as [3]. for (uint32_t qp = 0; qp < SCALING_LIST_REM_NUM; qp++) { m_dequantCoef[SCALING_LIST_32x32][3][qp] = m_dequantCoef[SCALING_LIST_32x32][1][qp]; } m_initialized = true; } // Deallocate scaling list tables void H265ScalingList::destroy() { if (!m_initialized) return; for (uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { delete [] m_dequantCoef[sizeId][0][0]; m_dequantCoef[sizeId][0][0] = 0; } m_initialized = false; } // Calculated coefficients used for dequantization void H265ScalingList::calculateDequantCoef(void) { assert(m_initialized); static const uint32_t g_scalingListSizeX[4] = { 4, 8, 16, 32 }; for (uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { for (uint32_t listId = 0; listId < g_scalingListNum[sizeId]; listId++) { for (uint32_t qp = 0; qp < SCALING_LIST_REM_NUM; qp++) { uint32_t width = g_scalingListSizeX[sizeId]; uint32_t height = g_scalingListSizeX[sizeId]; uint32_t ratio = g_scalingListSizeX[sizeId] / std::min(MAX_MATRIX_SIZE_NUM, (int32_t)g_scalingListSizeX[sizeId]); int16_t *dequantcoeff; int32_t *coeff = getScalingListAddress(sizeId, listId); dequantcoeff = getDequantCoeff(listId, qp, sizeId); processScalingListDec(coeff, dequantcoeff, g_invQuantScales[qp], height, width, ratio, std::min(MAX_MATRIX_SIZE_NUM, (int32_t)g_scalingListSizeX[sizeId]), getScalingListDC(sizeId, listId)); } } } } // Initialize scaling list with default data void H265ScalingList::initFromDefaultScalingList() { assert (!m_initialized); init(); for (uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { for (uint32_t listId = 0; listId < g_scalingListNum[sizeId]; listId++) { MFX_INTERNAL_CPY(getScalingListAddress(sizeId, listId), getScalingListDefaultAddress(sizeId, listId), sizeof(int32_t) * std::min(MAX_MATRIX_COEF_NUM, (int32_t)g_scalingListSize[sizeId])); setScalingListDC(sizeId, listId, SCALING_LIST_DC); } } calculateDequantCoef(); } // Calculated coefficients used for dequantization in one scaling list matrix void H265ScalingList::processScalingListDec(int32_t *coeff, int16_t *dequantcoeff, int32_t invQuantScales, uint32_t height, uint32_t width, uint32_t ratio, uint32_t sizuNum, uint32_t dc) { for(uint32_t j = 0; j < height; j++) { #ifdef __INTEL_COMPILER #pragma vector always #endif for(uint32_t i = 0; i < width; i++) { dequantcoeff[j * width + i] = (int16_t)(invQuantScales * coeff[sizuNum * (j / ratio) + i / ratio]); } } if(ratio > 1) { dequantcoeff[0] = (int16_t)(invQuantScales * dc); } } // Returns default scaling matrix for specified parameters const int32_t* H265ScalingList::getScalingListDefaultAddress(unsigned sizeId, unsigned listId) { const int32_t *src = 0; switch(sizeId) { case SCALING_LIST_4x4: src = g_quantTSDefault4x4; break; case SCALING_LIST_8x8: src = (listId<3) ? g_quantIntraDefault8x8 : g_quantInterDefault8x8; break; case SCALING_LIST_16x16: src = (listId<3) ? g_quantIntraDefault8x8 : g_quantInterDefault8x8; break; case SCALING_LIST_32x32: src = (listId<1) ? g_quantIntraDefault8x8 : g_quantInterDefault8x8; break; default: assert(0); src = NULL; break; } return src; } // Copy data from predefined scaling matrixes void H265ScalingList::processRefMatrix(unsigned sizeId, unsigned listId , unsigned refListId) { MFX_INTERNAL_CPY(getScalingListAddress(sizeId, listId), ((listId == refListId) ? getScalingListDefaultAddress(sizeId, refListId) : getScalingListAddress(sizeId, refListId)), sizeof(int32_t)*std::min(MAX_MATRIX_COEF_NUM, (int32_t)g_scalingListSize[sizeId])); } } // end namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_segment_decoder_dxva.cpp000066400000000000000000000134671443134507600343530ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include #include "umc_structures.h" #include "umc_h265_segment_decoder_dxva.h" #include "umc_h265_frame_list.h" #include "umc_h265_slice_decoding.h" #include "umc_h265_task_supplier.h" #include "umc_h265_frame_info.h" #include "umc_h265_va_packer.h" #include "mfx_common.h" // for trace routines #include "mfx_unified_h265d_logging.h" namespace UMC_HEVC_DECODER { H265_DXVA_SegmentDecoderCommon::H265_DXVA_SegmentDecoderCommon(TaskSupplier_H265 * pTaskSupplier) : H265SegmentDecoderBase(pTaskSupplier->GetTaskBroker()) , m_va(0) , m_pTaskSupplier(pTaskSupplier) { } void H265_DXVA_SegmentDecoderCommon::SetVideoAccelerator(UMC::VideoAccelerator *va) { assert(va); m_va = (UMC::VideoAccelerator*)va; } H265_DXVA_SegmentDecoder::H265_DXVA_SegmentDecoder(TaskSupplier_H265 * pTaskSupplier) : H265_DXVA_SegmentDecoderCommon(pTaskSupplier) , m_CurrentSliceID(0) { } H265_DXVA_SegmentDecoder::~H265_DXVA_SegmentDecoder() { } UMC::Status H265_DXVA_SegmentDecoder::Init(int32_t iNumber) { return H265SegmentDecoderBase::Init(iNumber); } void H265_DXVA_SegmentDecoder::PackAllHeaders(H265DecoderFrame * pFrame) { if (!m_Packer.get()) { m_Packer.reset(Packer::CreatePacker(m_va)); assert(m_Packer.get()); } m_Packer->BeginFrame(pFrame); m_Packer->PackAU(pFrame, m_pTaskSupplier); m_Packer->EndFrame(); } UMC::Status H265_DXVA_SegmentDecoder::ProcessSegment(void) { try { if (!m_pTaskBroker->GetNextTask(0)) return UMC::UMC_ERR_NOT_ENOUGH_DATA; } catch (h265_exception const& e) { return e.GetStatus(); } return UMC::UMC_OK; } TaskBrokerSingleThreadDXVA::TaskBrokerSingleThreadDXVA(TaskSupplier_H265 * pTaskSupplier) : TaskBroker_H265(pTaskSupplier) { } bool TaskBrokerSingleThreadDXVA::PrepareFrame(H265DecoderFrame * pFrame) { if (!pFrame || pFrame->prepared) { return true; } if (!pFrame->prepared && (pFrame->GetAU()->GetStatus() == H265DecoderFrameInfo::STATUS_FILLED || pFrame->GetAU()->GetStatus() == H265DecoderFrameInfo::STATUS_STARTED)) { pFrame->prepared = true; } return true; } void TaskBrokerSingleThreadDXVA::Reset() { timer.Stop(); TaskBroker_H265::Reset(); m_reports.clear(); } void TaskBrokerSingleThreadDXVA::Start() { UMC::AutomaticUMCMutex guard(m_mGuard); TaskBroker_H265::Start(); m_completedQueue.clear(); } enum { NUMBER_OF_STATUS = 512, }; bool TaskBrokerSingleThreadDXVA::GetNextTaskInternal(H265Task *) { UMC::AutomaticUMCMutex guard(m_mGuard); // check error(s) if (m_IsShouldQuit) { return false; } H265_DXVA_SegmentDecoder * dxva_sd = static_cast(m_pTaskSupplier->m_pSegmentDecoder[0]); if (!dxva_sd->GetPacker()) return false; #if !defined(SYNCHRONIZATION_BY_VA_SYNC_SURFACE) #error unsupported sync. type #else UMC::Status sts = UMC::UMC_OK; VAStatus surfErr = VA_STATUS_SUCCESS; int32_t index; for (H265DecoderFrameInfo * au = m_FirstAU; au; au = au->GetNextAU()) { index = au->m_pFrame->GetFrameMID(); m_mGuard.Unlock(); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Dec vaSyncSurface"); sts = dxva_sd->GetPacker()->SyncTask(index, &surfErr); } m_mGuard.Lock(); //we should complete frame even we got an error //this allows to return the error from [RunDecoding] au->SetStatus(H265DecoderFrameInfo::STATUS_COMPLETED); CompleteFrame(au->m_pFrame); if (sts < UMC::UMC_OK) { if (sts != UMC::UMC_ERR_GPU_HANG) sts = UMC::UMC_ERR_DEVICE_FAILED; au->m_pFrame->SetError(sts); } else if (sts == UMC::UMC_OK) switch (surfErr) { case MFX_CORRUPTION_MAJOR: au->m_pFrame->SetErrorFlagged(UMC::ERROR_FRAME_MAJOR); break; case MFX_CORRUPTION_MINOR: au->m_pFrame->SetErrorFlagged(UMC::ERROR_FRAME_MINOR); break; } if (sts != UMC::UMC_OK) throw h265_exception(sts); TRACE_EVENT(MFX_TRACE_API_HEVC_SYNCINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO, make_event_data(au->m_pFrame->PicOrderCnt(), au->m_pFrame->m_index, (uint32_t)au->m_pFrame->IsDecodingCompleted(), (uint32_t)au->m_pFrame->isDisplayable(), (uint32_t)au->m_pFrame->wasOutputted(), sts)); } SwitchCurrentAU(); #endif return false; } void TaskBrokerSingleThreadDXVA::AwakeThreads() { } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_sei.cpp000066400000000000000000000205531443134507600310330ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_bitstream_headers.h" #include "umc_h265_headers.h" namespace UMC_HEVC_DECODER { // Parse SEI message int32_t H265HeadersBitstream::ParseSEI(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl) { return sei_message(sps,current_sps,spl); } // Parse SEI message int32_t H265HeadersBitstream::sei_message(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl) { uint32_t code; int32_t payloadType = 0; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); while (code == 0xFF) { /* fixed-pattern bit string using 8 bits written equal to 0xFF */ CheckBitsLeft(8); GetNBits(m_pbs, m_bitOffset, 8, code); payloadType += 255; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); } int32_t last_payload_type_byte; //uint32_t integer using 8 bits CheckBitsLeft(8); GetNBits(m_pbs, m_bitOffset, 8, last_payload_type_byte); payloadType += last_payload_type_byte; int32_t payloadSize = 0; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); while( code == 0xFF ) { /* fixed-pattern bit string using 8 bits written equal to 0xFF */ CheckBitsLeft(8); GetNBits(m_pbs, m_bitOffset, 8, code); payloadSize += 255; CheckBitsLeft(8); PeakNextBits(m_pbs, m_bitOffset, 8, code); } int32_t last_payload_size_byte; //uint32_t integer using 8 bits CheckBitsLeft(8); GetNBits(m_pbs, m_bitOffset, 8, last_payload_size_byte); payloadSize += last_payload_size_byte; spl->Reset(); spl->payLoadSize = payloadSize; if (payloadType < 0 || payloadType > SEI_RESERVED) payloadType = SEI_RESERVED; spl->payLoadType = (SEI_TYPE)payloadType; if (spl->payLoadSize > BytesLeft()) { throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } uint32_t * pbs; uint32_t bitOffsetU; int32_t bitOffset; GetState(&pbs, &bitOffsetU); bitOffset = bitOffsetU; int32_t ret = sei_payload(sps, current_sps, spl); for (uint32_t i = 0; i < spl->payLoadSize; i++) { CheckBitsLeft(8); SkipNBits(pbs, bitOffset, 8); } SetState(pbs, bitOffset); return ret; } // Parse SEI payload data int32_t H265HeadersBitstream::sei_payload(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad *spl) { uint32_t payloadType = spl->payLoadType; switch(payloadType) { case SEI_PIC_TIMING_TYPE: return pic_timing(sps,current_sps,spl); case SEI_RECOVERY_POINT_TYPE: return recovery_point(sps,current_sps,spl); case SEI_MASTERING_DISPLAY_COLOUR_VOLUME: return mastering_display_colour_volume(sps, current_sps, spl); case SEI_CONTENT_LIGHT_LEVEL_INFO: return content_light_level_info(sps, current_sps, spl); } return reserved_sei_message(sps,current_sps,spl); } // Parse pic timing SEI data int32_t H265HeadersBitstream::pic_timing(const HeaderSet & sps, int32_t current_sps, H265SEIPayLoad * spl) { const H265SeqParamSet *csps = sps.GetHeader(current_sps); if (!csps) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (csps->frame_field_info_present_flag) { spl->SEI_messages.pic_timing.pic_struct = (DisplayPictureStruct_H265)GetBits(4); GetBits(2); // source_scan_type GetBits(1); // duplicate_flag } if (csps->m_hrdParameters.nal_hrd_parameters_present_flag || csps->m_hrdParameters.vcl_hrd_parameters_present_flag) { GetBits(csps->m_hrdParameters.au_cpb_removal_delay_length); // au_cpb_removal_delay_minus1 spl->SEI_messages.pic_timing.pic_dpb_output_delay = GetBits(csps->m_hrdParameters.dpb_output_delay_length); if (csps->m_hrdParameters.sub_pic_hrd_params_present_flag) { GetBits(csps->m_hrdParameters.dpb_output_delay_du_length); //pic_dpb_output_du_delay } if (csps->m_hrdParameters.sub_pic_hrd_params_present_flag && csps->m_hrdParameters.sub_pic_cpb_params_in_pic_timing_sei_flag) { uint32_t num_decoding_units_minus1 = GetVLCElementU(); if (num_decoding_units_minus1 > csps->WidthInCU * csps->HeightInCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); uint8_t du_common_cpb_removal_delay_flag = (uint8_t)GetBits(1); if (du_common_cpb_removal_delay_flag) { GetBits(csps->m_hrdParameters.du_cpb_removal_delay_increment_length); //du_common_cpb_removal_delay_increment_minus1 } for (uint32_t i = 0; i <= num_decoding_units_minus1; i++) { GetVLCElementU(); // num_nalus_in_du_minus1 if (!du_common_cpb_removal_delay_flag && i < num_decoding_units_minus1) { GetBits(csps->m_hrdParameters.du_cpb_removal_delay_increment_length); // du_cpb_removal_delay_increment_minus1 } } } } AlignPointerRight(); return current_sps; } // Parse recovery point SEI data int32_t H265HeadersBitstream::recovery_point(const HeaderSet & , int32_t current_sps, H265SEIPayLoad *spl) { H265SEIPayLoad::SEIMessages::RecoveryPoint * recPoint = &(spl->SEI_messages.recovery_point); recPoint->recovery_poc_cnt = GetVLCElementS(); recPoint->exact_match_flag = (uint8_t)Get1Bit(); recPoint->broken_link_flag = (uint8_t)Get1Bit(); return current_sps; } // Parse mastering_display_colour_volume int32_t H265HeadersBitstream::mastering_display_colour_volume(const HeaderSet&, int32_t current_sps, H265SEIPayLoad* spl) { H265SEIPayLoad::SEIMessages::MasteringDisplay* masterDisplay = &(spl->SEI_messages.mastering_display); int i = 0; // Mastering primaries for (; i < 3; ++i) { masterDisplay->display_primaries[i][0] = (uint16_t)GetBits(16); masterDisplay->display_primaries[i][1] = (uint16_t)GetBits(16); } // White point(x, y) masterDisplay->white_point[0] = (uint16_t)GetBits(16); masterDisplay->white_point[1] = (uint16_t)GetBits(16); // Max and min luminance of mastering display masterDisplay->max_luminance = (uint32_t)GetBits(32); masterDisplay->min_luminance = (uint32_t)GetBits(32); return current_sps; } // Parse mastering_display_colour_volume int32_t H265HeadersBitstream::content_light_level_info(const HeaderSet&, int32_t current_sps, H265SEIPayLoad* spl) { H265SEIPayLoad::SEIMessages::ContentLightLevelInfo * contentLight = &(spl->SEI_messages.content_light_level_info); // Max and average light levels contentLight->max_content_light_level = (uint16_t)GetBits(16); contentLight->max_pic_average_light_level = (uint16_t)GetBits(16); return current_sps; } // Skip unrecognized SEI message payload int32_t H265HeadersBitstream::reserved_sei_message(const HeaderSet & , int32_t current_sps, H265SEIPayLoad *spl) { for (uint32_t i = 0; i < spl->payLoadSize; i++) { CheckBitsLeft(8); SkipNBits(m_pbs, m_bitOffset, 8); } AlignPointerRight(); return current_sps; } }//namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_slice_decoding.cpp000066400000000000000000001002271443134507600331240ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_slice_decoding.h" #include "umc_h265_heap.h" #include "umc_h265_frame_info.h" #include "umc_h265_frame_list.h" #include #include namespace UMC_HEVC_DECODER { H265Slice::H265Slice() : m_pSeqParamSet(0) , m_context(0) , m_tileByteLocation (0) { Reset(); } // H265Slice::H265Slice() H265Slice::~H265Slice() { Release(); } // H265Slice::~H265Slice(void) // Initialize slice structure to default values void H265Slice::Reset() { m_source.Release(); if (m_pSeqParamSet) { if (m_pSeqParamSet) ((H265SeqParamSet*)m_pSeqParamSet)->DecrementReference(); if (m_pPicParamSet) ((H265PicParamSet*)m_pPicParamSet)->DecrementReference(); m_pSeqParamSet = 0; m_pPicParamSet = 0; } m_pCurrentFrame = 0; m_NumEmuPrevnBytesInSliceHdr = 0; m_SliceHeader.nuh_temporal_id = 0; m_SliceHeader.m_CheckLDC = false; m_SliceHeader.slice_deblocking_filter_disabled_flag = false; m_SliceHeader.num_entry_point_offsets = 0; m_tileCount = 0; delete[] m_tileByteLocation; m_tileByteLocation = 0; } // Release resources void H265Slice::Release() { Reset(); } // void H265Slice::Release(void) // Parse beginning of slice header to get PPS ID int32_t H265Slice::RetrievePicParamSetNumber() { if (!m_source.GetDataSize()) return -1; m_SliceHeader = {}; m_BitStream.Reset((uint8_t *) m_source.GetPointer(), (uint32_t) m_source.GetDataSize()); UMC::Status umcRes = UMC::UMC_OK; try { umcRes = m_BitStream.GetNALUnitType(m_SliceHeader.nal_unit_type, m_SliceHeader.nuh_temporal_id); if (UMC::UMC_OK != umcRes) return false; // decode first part of slice header umcRes = m_BitStream.GetSliceHeaderPart1(&m_SliceHeader); if (UMC::UMC_OK != umcRes) return -1; } catch (...) { return -1; } return m_SliceHeader.slice_pic_parameter_set_id; } // Decode slice header and initializ slice structure with parsed values bool H265Slice::Reset(PocDecoding * pocDecoding) { m_BitStream.Reset((uint8_t *) m_source.GetPointer(), (uint32_t) m_source.GetDataSize()); // decode slice header if (m_source.GetDataSize() && false == DecodeSliceHeader(pocDecoding)) return false; m_SliceHeader.m_HeaderBitstreamOffset = (uint32_t)m_BitStream.BytesDecoded(); m_SliceHeader.m_SeqParamSet = m_pSeqParamSet; m_SliceHeader.m_PicParamSet = m_pPicParamSet; int32_t iMBInFrame = (GetSeqParam()->WidthInCU * GetSeqParam()->HeightInCU); // set slice variables m_iFirstMB = m_SliceHeader.slice_segment_address; m_iFirstMB = m_iFirstMB > iMBInFrame ? iMBInFrame : m_iFirstMB; m_iFirstMB = m_pPicParamSet->m_CtbAddrRStoTS[m_iFirstMB]; m_iMaxMB = iMBInFrame; processInfo.Initialize(m_iFirstMB, GetSeqParam()->WidthInCU); m_bError = false; // frame is not associated yet m_pCurrentFrame = NULL; return true; } // bool H265Slice::Reset(void *pSource, size_t nSourceSize, int32_t iNumber) // Set current slice number void H265Slice::SetSliceNumber(int32_t iSliceNumber) { m_iNumber = iSliceNumber; } // void H265Slice::SetSliceNumber(int32_t iSliceNumber) // Decoder slice header and calculate POC bool H265Slice::DecodeSliceHeader(PocDecoding * pocDecoding) { UMC::Status umcRes = UMC::UMC_OK; // Locals for additional slice data to be read into, the data // was read and saved from the first slice header of the picture, // is not supposed to change within the picture, so can be // discarded when read again here. try { m_SliceHeader = {}; umcRes = m_BitStream.GetNALUnitType(m_SliceHeader.nal_unit_type, m_SliceHeader.nuh_temporal_id); if (UMC::UMC_OK != umcRes) return false; umcRes = m_BitStream.GetSliceHeaderFull(this, m_pSeqParamSet, m_pPicParamSet, pocDecoding); if (!GetSliceHeader()->dependent_slice_segment_flag) { if (!GetSliceHeader()->IdrPicFlag) { const H265SeqParamSet * sps = m_pSeqParamSet; H265SliceHeader * sliceHdr = &m_SliceHeader; if (GetSeqParam()->long_term_ref_pics_present_flag) { ReferencePictureSet *rps = getRPS(); uint32_t offset = rps->getNumberOfNegativePictures()+rps->getNumberOfPositivePictures(); int32_t prevDeltaMSB = 0; int32_t maxPicOrderCntLSB = 1 << sps->log2_max_pic_order_cnt_lsb; int32_t DeltaPocMsbCycleLt = 0; for(uint32_t j = offset, k = 0; k < rps->getNumberOfLongtermPictures(); j++, k++) { int pocLsbLt = rps->poc_lbs_lt[j]; if (rps->delta_poc_msb_present_flag[j]) { bool deltaFlag = false; if( (j == offset) || (j == (offset + rps->num_long_term_sps))) deltaFlag = true; if(deltaFlag) DeltaPocMsbCycleLt = rps->delta_poc_msb_cycle_lt[j]; else DeltaPocMsbCycleLt = rps->delta_poc_msb_cycle_lt[j] + prevDeltaMSB; int32_t pocLTCurr = sliceHdr->m_poc - DeltaPocMsbCycleLt * maxPicOrderCntLSB - sliceHdr->slice_pic_order_cnt_lsb + pocLsbLt; rps->setPOC(j, pocLTCurr); rps->setDeltaPOC(j, - sliceHdr->m_poc + pocLTCurr); } else { rps->setPOC (j, pocLsbLt); rps->setDeltaPOC(j, - sliceHdr->m_poc + pocLsbLt); if (j == offset + rps->num_long_term_sps) DeltaPocMsbCycleLt = 0; } prevDeltaMSB = DeltaPocMsbCycleLt; } offset += rps->getNumberOfLongtermPictures(); rps->num_pics = offset; } if ( sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || sliceHdr->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP ) { ReferencePictureSet *rps = getRPS(); rps->num_negative_pics = 0; rps->num_positive_pics = 0; rps->setNumberOfLongtermPictures(0); rps->num_pics = 0; } if (GetSliceHeader()->nuh_temporal_id == 0 && sliceHdr->nal_unit_type != NAL_UT_CODED_SLICE_RADL_R && sliceHdr->nal_unit_type != NAL_UT_CODED_SLICE_RASL_R && !IsSubLayerNonReference(sliceHdr->nal_unit_type)) { pocDecoding->prevPicOrderCntMsb = sliceHdr->m_poc - sliceHdr->slice_pic_order_cnt_lsb; pocDecoding->prevPocPicOrderCntLsb = sliceHdr->slice_pic_order_cnt_lsb; } } else { if (GetSliceHeader()->nuh_temporal_id == 0) { pocDecoding->prevPicOrderCntMsb = 0; pocDecoding->prevPocPicOrderCntLsb = 0; } } } } catch(...) { if (!m_SliceHeader.dependent_slice_segment_flag) { if (m_SliceHeader.slice_type != I_SLICE) m_bError = true; } return false; } return (UMC::UMC_OK == umcRes); } // bool H265Slice::DecodeSliceHeader(bool bFullInitialization) // Get tile column CTB width uint32_t H265Slice::getTileColumnWidth(uint32_t col) const { uint32_t tileColumnWidth = 0; uint32_t lcuSize = 1 << m_pSeqParamSet->log2_max_luma_coding_block_size; uint32_t widthInLcu = (m_pSeqParamSet->pic_width_in_luma_samples + lcuSize - 1) / lcuSize; if (m_pPicParamSet->uniform_spacing_flag) { tileColumnWidth = ((col + 1) * widthInLcu) / m_pPicParamSet->num_tile_columns - (col * widthInLcu) / m_pPicParamSet->num_tile_columns; } else { if (col == (m_pPicParamSet->num_tile_columns - 1)) { for (uint32_t i = 0; i < (m_pPicParamSet->num_tile_columns - 1); i++) { tileColumnWidth += m_pPicParamSet->column_width[i]; } tileColumnWidth = widthInLcu - tileColumnWidth; } else { tileColumnWidth = m_pPicParamSet->column_width[col]; } } return tileColumnWidth; } // Get tile row CTB height uint32_t H265Slice::getTileRowHeight(uint32_t row) const { uint32_t tileRowHeight = 0; uint32_t lcuSize = 1 << m_pSeqParamSet->log2_max_luma_coding_block_size; uint32_t heightInLcu = (m_pSeqParamSet->pic_height_in_luma_samples + lcuSize - 1) / lcuSize; if (m_pPicParamSet->uniform_spacing_flag) { tileRowHeight = ((row + 1) * heightInLcu) / m_pPicParamSet->num_tile_rows - (row * heightInLcu) / m_pPicParamSet->num_tile_rows; } else { if (row == (m_pPicParamSet->num_tile_rows - 1)) { for (uint32_t i = 0; i < (m_pPicParamSet->num_tile_rows - 1); i++) { tileRowHeight += m_pPicParamSet->row_height[i]; } tileRowHeight = heightInLcu - tileRowHeight; } else { tileRowHeight = m_pPicParamSet->row_height[row]; } } return tileRowHeight; } // Get tile XIdx uint32_t H265Slice::getTileXIdx() const { uint32_t i; uint32_t lcuOffset = 0; uint32_t lcuSize = 1 << m_pSeqParamSet->log2_max_luma_coding_block_size; uint32_t widthInLcu = (m_pSeqParamSet->pic_width_in_luma_samples + lcuSize - 1) / lcuSize; uint32_t lcuColumnOffset = m_SliceHeader.slice_segment_address % widthInLcu; for (i = 0; i < (m_pPicParamSet->num_tile_columns-1); i++) { int tileColumnWidth = getTileColumnWidth(i); if (lcuColumnOffset >= lcuOffset && lcuColumnOffset < lcuOffset + tileColumnWidth) break; lcuOffset += tileColumnWidth; } return i; } // Get tile YIdx uint32_t H265Slice::getTileYIdx() const { uint32_t i; uint32_t lcuOffset = 0; uint32_t lcuSize = 1 << m_pSeqParamSet->log2_max_luma_coding_block_size; uint32_t widthInLcu = (m_pSeqParamSet->pic_width_in_luma_samples + lcuSize - 1) / lcuSize; uint32_t lcuRowOffset = m_SliceHeader.slice_segment_address / widthInLcu; for (i = 0; i < (m_pPicParamSet->num_tile_rows - 1); i++) { int tileRowHeight = getTileRowHeight(i); if (lcuRowOffset >= lcuOffset && lcuRowOffset < lcuOffset + tileRowHeight) break; lcuOffset += tileRowHeight; } return i; } // Returns number of used references in RPS int H265Slice::getNumRpsCurrTempList() const { int numRpsCurrTempList = 0; if (GetSliceHeader()->slice_type != I_SLICE) { const ReferencePictureSet *rps = getRPS(); bool intra_block_copy_flag = (GetPicParam()->pps_curr_pic_ref_enabled_flag != 0); for (uint32_t i=0;i < rps->getNumberOfNegativePictures() + rps->getNumberOfPositivePictures() + rps->getNumberOfLongtermPictures();i++) { if (rps->getUsed(i)) { numRpsCurrTempList++; } } if (intra_block_copy_flag) { numRpsCurrTempList++; } } return numRpsCurrTempList; } void H265Slice::setRefPOCListSliceHeader() { int32_t RefPicPOCSetStCurr0[MAX_NUM_REF_PICS]; int32_t RefPicPOCSetStCurr1[MAX_NUM_REF_PICS]; int32_t RefPicPOCSetLtCurr[MAX_NUM_REF_PICS]; uint32_t NumPicStCurr0 = 0; uint32_t NumPicStCurr1 = 0; uint32_t NumPicLtCurr = 0; uint32_t i; for (i = 0; i < getRPS()->getNumberOfNegativePictures(); i++) { if (getRPS()->getUsed(i)) { RefPicPOCSetStCurr0[NumPicStCurr0] = m_SliceHeader.m_poc + getRPS()->getDeltaPOC(i); NumPicStCurr0++; } } m_SliceHeader.m_numPicStCurr0 = NumPicStCurr0; for (; i < getRPS()->getNumberOfNegativePictures() + getRPS()->getNumberOfPositivePictures(); i++) { if (getRPS()->getUsed(i)) { RefPicPOCSetStCurr1[NumPicStCurr1] = m_SliceHeader.m_poc + getRPS()->getDeltaPOC(i); NumPicStCurr1++; } } m_SliceHeader.m_numPicStCurr1 = NumPicStCurr1; for (i = getRPS()->getNumberOfNegativePictures() + getRPS()->getNumberOfPositivePictures(); i < getRPS()->getNumberOfNegativePictures() + getRPS()->getNumberOfPositivePictures() + getRPS()->getNumberOfLongtermPictures(); i++) { if (getRPS()->getUsed(i)) { RefPicPOCSetLtCurr[NumPicLtCurr] = getRPS()->getPOC(i); NumPicLtCurr++; } } m_SliceHeader.m_numPicLtCurr = NumPicLtCurr; H265PicParamSet const* pps = GetPicParam(); assert(pps); int32_t numPicTotalCurr = NumPicStCurr0 + NumPicStCurr1 + NumPicLtCurr; if (pps->pps_curr_pic_ref_enabled_flag) numPicTotalCurr++; int32_t rpsPOCCurrList1[MAX_NUM_REF_PICS + 1]; int32_t cIdx = 0; int32_t rIdx = 0; for (i = 0; i < NumPicStCurr0; cIdx++, i++) { m_SliceHeader.m_RpsPOCCurrList0[cIdx] = RefPicPOCSetStCurr0[i]; } for (i = 0; i < NumPicStCurr1; cIdx++, i++) { m_SliceHeader.m_RpsPOCCurrList0[cIdx] = RefPicPOCSetStCurr1[i]; } for (i = 0; i < NumPicLtCurr; cIdx++, i++) { m_SliceHeader.m_RpsPOCCurrList0[cIdx] = RefPicPOCSetLtCurr[i]; } if (pps->pps_curr_pic_ref_enabled_flag) m_SliceHeader.m_RpsPOCCurrList0[cIdx++] = m_SliceHeader.m_poc; if (m_SliceHeader.slice_type == B_SLICE) { cIdx = 0; for (i = 0; i < NumPicStCurr1; cIdx++, i++) { rpsPOCCurrList1[cIdx] = RefPicPOCSetStCurr1[i]; } for (i = 0; i < NumPicStCurr0; cIdx++, i++) { rpsPOCCurrList1[cIdx] = RefPicPOCSetStCurr0[i]; } for (i = 0; i < NumPicLtCurr; cIdx++, i++) { rpsPOCCurrList1[cIdx] = RefPicPOCSetLtCurr[i]; } if (pps->pps_curr_pic_ref_enabled_flag) rpsPOCCurrList1[cIdx++] = m_SliceHeader.m_poc; } RefPicListModification &refPicListModification = m_SliceHeader.m_RefPicListModification; for (rIdx = 0; rIdx <= m_SliceHeader.m_numRefIdx[0] - 1; rIdx++) { cIdx = refPicListModification.ref_pic_list_modification_flag_l0 ? refPicListModification.list_entry_l0[rIdx] : rIdx % numPicTotalCurr; m_SliceHeader.m_RefPOCList[0][rIdx] = m_SliceHeader.m_RpsPOCCurrList0[cIdx]; } int32_t const numRpsCurrTempList0 = (std::max)(m_SliceHeader.m_numRefIdx[0], numPicTotalCurr); if (pps->pps_curr_pic_ref_enabled_flag && !refPicListModification.ref_pic_list_modification_flag_l0 && numRpsCurrTempList0 > m_SliceHeader.m_numRefIdx[0]) { m_SliceHeader.m_RefPOCList[0][m_SliceHeader.m_numRefIdx[0] - 1] = m_SliceHeader.m_poc; } if (m_SliceHeader.slice_type == P_SLICE) { m_SliceHeader.m_numRefIdx[1] = 0; } else { for (rIdx = 0; rIdx <= m_SliceHeader.m_numRefIdx[1] - 1; rIdx++) { cIdx = refPicListModification.ref_pic_list_modification_flag_l1 ? refPicListModification.list_entry_l1[rIdx] : rIdx % numPicTotalCurr; m_SliceHeader.m_RefPOCList[1][rIdx] = rpsPOCCurrList1[cIdx]; } } } // For dependent slice copy data from another slice void H265Slice::CopyFromBaseSlice(const H265Slice * s) { if (!s || !m_SliceHeader.dependent_slice_segment_flag) return; assert(s); m_iNumber = s->m_iNumber; const H265SliceHeader * slice = s->GetSliceHeader(); m_SliceHeader.IdrPicFlag = slice->IdrPicFlag; m_SliceHeader.m_poc = slice->m_poc; m_SliceHeader.nal_unit_type = slice->nal_unit_type; m_SliceHeader.SliceQP = slice->SliceQP; m_SliceHeader.slice_deblocking_filter_disabled_flag = slice->slice_deblocking_filter_disabled_flag; m_SliceHeader.deblocking_filter_override_flag = slice->deblocking_filter_override_flag; m_SliceHeader.slice_beta_offset = slice->slice_beta_offset; m_SliceHeader.slice_tc_offset = slice->slice_tc_offset; for (int32_t i = 0; i < 3; i++) { m_SliceHeader.m_numRefIdx[i] = slice->m_numRefIdx[i]; } m_SliceHeader.m_CheckLDC = slice->m_CheckLDC; m_SliceHeader.slice_type = slice->slice_type; m_SliceHeader.slice_qp_delta = slice->slice_qp_delta; m_SliceHeader.slice_cb_qp_offset = slice->slice_cb_qp_offset; m_SliceHeader.slice_cr_qp_offset = slice->slice_cr_qp_offset; m_SliceHeader.slice_act_y_qp_offset = slice->slice_act_y_qp_offset; m_SliceHeader.slice_act_cb_qp_offset = slice->slice_act_cb_qp_offset; m_SliceHeader.slice_act_cr_qp_offset = slice->slice_act_cr_qp_offset; m_SliceHeader.m_rps = slice->m_rps; m_SliceHeader.collocated_from_l0_flag = slice->collocated_from_l0_flag; m_SliceHeader.collocated_ref_idx = slice->collocated_ref_idx; m_SliceHeader.nuh_temporal_id = slice->nuh_temporal_id; for (int32_t e = 0; e < 2; e++) { for (int32_t n = 0; n < MAX_NUM_REF_PICS; n++) { MFX_INTERNAL_CPY(m_SliceHeader.pred_weight_table[e][n], slice->pred_weight_table[e][n], sizeof(wpScalingParam) * 3); } } m_SliceHeader.luma_log2_weight_denom = slice->luma_log2_weight_denom; m_SliceHeader.chroma_log2_weight_denom = slice->chroma_log2_weight_denom; m_SliceHeader.slice_sao_luma_flag = slice->slice_sao_luma_flag; m_SliceHeader.slice_sao_chroma_flag = slice->slice_sao_chroma_flag; m_SliceHeader.cabac_init_flag = slice->cabac_init_flag; m_SliceHeader.mvd_l1_zero_flag = slice->mvd_l1_zero_flag; m_SliceHeader.slice_loop_filter_across_slices_enabled_flag = slice->slice_loop_filter_across_slices_enabled_flag; m_SliceHeader.slice_temporal_mvp_enabled_flag = slice->slice_temporal_mvp_enabled_flag; m_SliceHeader.max_num_merge_cand = slice->max_num_merge_cand; m_SliceHeader.use_integer_mv_flag = slice->use_integer_mv_flag; m_SliceHeader.cu_chroma_qp_offset_enabled_flag = slice->cu_chroma_qp_offset_enabled_flag; // Set the start of real slice, not slice segment m_SliceHeader.SliceCurStartCUAddr = slice->SliceCurStartCUAddr; m_SliceHeader.m_RefPicListModification = slice->m_RefPicListModification; m_SliceHeader.m_numPicStCurr0 = slice->m_numPicStCurr0; m_SliceHeader.m_numPicStCurr1 = slice->m_numPicStCurr1; m_SliceHeader.m_numPicLtCurr = slice->m_numPicLtCurr; for (int32_t i = 0; i < MAX_NUM_REF_PICS + 1; i++) { m_SliceHeader.m_RpsPOCCurrList0[i] = slice->m_RpsPOCCurrList0[i]; } } // Build reference lists from slice reference pic set. HEVC spec 8.3.2 UMC::Status H265Slice::UpdateReferenceList(H265DBPList *pDecoderFrameList, H265DecoderFrame* curr_ref) { UMC::Status ps = UMC::UMC_OK; if (m_pCurrentFrame == nullptr) return UMC::UMC_ERR_FAILED; const H265DecoderRefPicList* pH265DecRefPicList0 = m_pCurrentFrame->GetRefPicList(m_iNumber, 0); const H265DecoderRefPicList* pH265DecRefPicList1 = m_pCurrentFrame->GetRefPicList(m_iNumber, 1); if (pH265DecRefPicList0 == nullptr || pH265DecRefPicList1 == nullptr) return UMC::UMC_ERR_FAILED; H265DecoderRefPicList::ReferenceInformation* pRefPicList0 = pH265DecRefPicList0->m_refPicList; H265DecoderRefPicList::ReferenceInformation* pRefPicList1 = pH265DecRefPicList1->m_refPicList; H265SliceHeader* header = GetSliceHeader(); assert(header); if (header->slice_type == I_SLICE) { for (int32_t number = 0; number < 3; number++) header->m_numRefIdx[number] = 0; return UMC::UMC_OK; } H265DecoderFrame *RefPicSetStCurr0[16] = {}; H265DecoderFrame *RefPicSetStCurr1[16] = {}; H265DecoderFrame *RefPicSetLtCurr[16] = {}; uint32_t NumPicStCurr0 = 0; uint32_t NumPicStCurr1 = 0; uint32_t NumPicLtCurr = 0; uint32_t i; for (i = 0; i < header->m_numPicStCurr0; i++) { int32_t poc = header->m_RpsPOCCurrList0[i]; H265DecoderFrame *pFrm = pDecoderFrameList->findShortRefPic(poc); m_pCurrentFrame->AddReferenceFrame(pFrm); if (pFrm) pFrm->SetisLongTermRef(false); RefPicSetStCurr0[NumPicStCurr0] = pFrm; NumPicStCurr0++; if (!pFrm) { /* Reporting about missed reference */ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); /* And because frame can not be decoded properly set flag "ERROR_FRAME_MAJOR" too*/ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_MAJOR); } // pcRefPic->setCheckLTMSBPresent(false); } for (i = header->m_numPicStCurr0; i < header->m_numPicStCurr0 + header->m_numPicStCurr1; i++) { int32_t poc = header->m_RpsPOCCurrList0[i]; H265DecoderFrame *pFrm = pDecoderFrameList->findShortRefPic(poc); m_pCurrentFrame->AddReferenceFrame(pFrm); if (pFrm) pFrm->SetisLongTermRef(false); RefPicSetStCurr1[NumPicStCurr1] = pFrm; NumPicStCurr1++; if (!pFrm) { /* Reporting about missed reference */ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); /* And because frame can not be decoded properly set flag "ERROR_FRAME_MAJOR" too*/ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_MAJOR); } // pcRefPic->setCheckLTMSBPresent(false); } for (i = getRPS()->getNumberOfNegativePictures() + getRPS()->getNumberOfPositivePictures(); i < getRPS()->getNumberOfNegativePictures() + getRPS()->getNumberOfPositivePictures() + getRPS()->getNumberOfLongtermPictures(); i++) { if (getRPS()->getUsed(i)) { int32_t poc = getRPS()->getPOC(i); H265DecoderFrame *pFrm = pDecoderFrameList->findLongTermRefPic(m_pCurrentFrame, poc, GetSeqParam()->log2_max_pic_order_cnt_lsb, !getRPS()->getCheckLTMSBPresent(i)); if (!pFrm) continue; m_pCurrentFrame->AddReferenceFrame(pFrm); pFrm->SetisLongTermRef(true); RefPicSetLtCurr[NumPicLtCurr] = pFrm; NumPicLtCurr++; if (!pFrm) { /* Reporting about missed reference */ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); /* And because frame can not be decoded properly set flag "ERROR_FRAME_MAJOR" too*/ m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_MAJOR); } } // pFrm->setCheckLTMSBPresent(getRPS()->getCheckLTMSBPresent(i)); } H265PicParamSet const* pps = GetPicParam(); assert(pps); int32_t numPicTotalCurr = NumPicStCurr0 + NumPicStCurr1 + NumPicLtCurr; if (pps->pps_curr_pic_ref_enabled_flag) numPicTotalCurr++; // ref_pic_list_init H265DecoderFrame *refPicListTemp0[MAX_NUM_REF_PICS + 1] = {}; H265DecoderFrame *refPicListTemp1[MAX_NUM_REF_PICS + 1] = {}; if (header->nal_unit_type >= NAL_UT_CODED_SLICE_BLA_W_LP && header->nal_unit_type <= NAL_UT_CODED_SLICE_CRA && numPicTotalCurr != pps->pps_curr_pic_ref_enabled_flag) { //8.3.2: If the current picture is a BLA or CRA picture, the value of NumPicTotalCurr shall be equal to pps_curr_pic_ref_enabled_flag ... m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); return UMC::UMC_OK; } else if (!numPicTotalCurr) { //8.3.2: ... Otherwise, when the current picture contains a P or B slice, the value of NumPicTotalCurr shall not be equal to 0 m_pCurrentFrame->SetErrorFlagged(UMC::ERROR_FRAME_REFERENCE_FRAME); return UMC::UMC_OK; } int32_t cIdx = 0; for (i = 0; i < NumPicStCurr0; cIdx++, i++) { refPicListTemp0[cIdx] = RefPicSetStCurr0[i]; } for (i = 0; i < NumPicStCurr1; cIdx++, i++) { refPicListTemp0[cIdx] = RefPicSetStCurr1[i]; } for (i = 0; i < NumPicLtCurr; cIdx++, i++) { refPicListTemp0[cIdx] = RefPicSetLtCurr[i]; } if (pps->pps_curr_pic_ref_enabled_flag) refPicListTemp0[cIdx++] = curr_ref; if (header->slice_type == B_SLICE) { cIdx = 0; for (i = 0; i < NumPicStCurr1; cIdx++, i++) { refPicListTemp1[cIdx] = RefPicSetStCurr1[i]; } for (i = 0; i < NumPicStCurr0; cIdx++, i++) { refPicListTemp1[cIdx] = RefPicSetStCurr0[i]; } for (i = 0; i < NumPicLtCurr; cIdx++, i++) { refPicListTemp1[cIdx] = RefPicSetLtCurr[i]; } if (pps->pps_curr_pic_ref_enabled_flag) refPicListTemp1[cIdx++] = curr_ref; } RefPicListModification &refPicListModification = header->m_RefPicListModification; for (cIdx = 0; cIdx <= header->m_numRefIdx[0] - 1; cIdx ++) { bool isLong = refPicListModification.ref_pic_list_modification_flag_l0 ? (refPicListModification.list_entry_l0[cIdx] >= (NumPicStCurr0 + NumPicStCurr1)) : ((uint32_t)(cIdx % numPicTotalCurr) >= (NumPicStCurr0 + NumPicStCurr1)); pRefPicList0[cIdx].refFrame = refPicListModification.ref_pic_list_modification_flag_l0 ? refPicListTemp0[refPicListModification.list_entry_l0[cIdx]] : refPicListTemp0[cIdx % numPicTotalCurr]; pRefPicList0[cIdx].isLongReference = isLong; } int32_t const numRpsCurrTempList0 = (std::max)(header->m_numRefIdx[0], numPicTotalCurr); if (pps->pps_curr_pic_ref_enabled_flag && !refPicListModification.ref_pic_list_modification_flag_l0 && numRpsCurrTempList0 > header->m_numRefIdx[0]) { pRefPicList0[header->m_numRefIdx[0] - 1].refFrame = curr_ref; pRefPicList0[header->m_numRefIdx[0] - 1].isLongReference = true; } if (header->slice_type == P_SLICE) { header->m_numRefIdx[1] = 0; } else { for (cIdx = 0; cIdx <= header->m_numRefIdx[1] - 1; cIdx ++) { bool isLong = refPicListModification.ref_pic_list_modification_flag_l1 ? (refPicListModification.list_entry_l1[cIdx] >= (NumPicStCurr0 + NumPicStCurr1)) : ((uint32_t)(cIdx % numPicTotalCurr) >= (NumPicStCurr0 + NumPicStCurr1)); pRefPicList1[cIdx].refFrame = refPicListModification.ref_pic_list_modification_flag_l1 ? refPicListTemp1[refPicListModification.list_entry_l1[cIdx]] : refPicListTemp1[cIdx % numPicTotalCurr]; pRefPicList1[cIdx].isLongReference = isLong; } } if (header->slice_type == B_SLICE && getNumRefIdx(REF_PIC_LIST_1) == 0) { int32_t iNumRefIdx = getNumRefIdx(REF_PIC_LIST_0); header->m_numRefIdx[REF_PIC_LIST_1] = iNumRefIdx; for (int32_t iRefIdx = 0; iRefIdx < iNumRefIdx; iRefIdx++) { pRefPicList1[iRefIdx] = pRefPicList0[iRefIdx]; } } if (header->slice_type != I_SLICE) { bool bLowDelay = true; int32_t currPOC = header->m_poc; H265DecoderFrame *missedReference = 0; for (int32_t k = 0; !missedReference && k < numPicTotalCurr; k++) { missedReference = refPicListTemp0[k]; } for (int32_t k = 0; k < getNumRefIdx(REF_PIC_LIST_0) && bLowDelay; k++) { if (!pRefPicList0[k].refFrame) { pRefPicList0[k].refFrame = missedReference; } } for (int32_t k = 0; k < getNumRefIdx(REF_PIC_LIST_0) && bLowDelay; k++) { if (pRefPicList0[k].refFrame && pRefPicList0[k].refFrame->PicOrderCnt() > currPOC) { bLowDelay = false; } } if (header->slice_type == B_SLICE) { for (int32_t k = 0; k < getNumRefIdx(REF_PIC_LIST_1); k++) { if (!pRefPicList1[k].refFrame) { pRefPicList1[k].refFrame = missedReference; } } for (int32_t k = 0; k < getNumRefIdx(REF_PIC_LIST_1) && bLowDelay; k++) { if (pRefPicList1[k].refFrame && pRefPicList1[k].refFrame->PicOrderCnt() > currPOC) { bLowDelay = false; } } } m_SliceHeader.m_CheckLDC = bLowDelay; } return ps; } // Status H265Slice::UpdateRefPicList(H265DBPList *pDecoderFrameList) bool H265Slice::GetRapPicFlag() const { return GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_IDR_W_RADL || GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_IDR_N_LP || GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP || GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP || GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_CRA; } // RPS data structure constructor ReferencePictureSet::ReferencePictureSet() { ::memset(this, 0, sizeof(*this)); } // Bubble sort RPS by delta POCs placing negative values first, positive values second, increasing POS deltas // Negative values are stored with biggest absolute value first. See HEVC spec 8.3.2. void ReferencePictureSet::sortDeltaPOC() { for (uint32_t j = 1; j < num_pics; j++) { int32_t deltaPOC = m_DeltaPOC[j]; uint8_t Used = used_by_curr_pic_flag[j]; for (int32_t k = j - 1; k >= 0; k--) { int32_t temp = m_DeltaPOC[k]; if (deltaPOC < temp) { m_DeltaPOC[k + 1] = temp; used_by_curr_pic_flag[k + 1] = used_by_curr_pic_flag[k]; m_DeltaPOC[k] = deltaPOC; used_by_curr_pic_flag[k] = Used; } } } int32_t NumNegPics = (int32_t) num_negative_pics; for (int32_t j = 0, k = NumNegPics - 1; j < NumNegPics >> 1; j++, k--) { int32_t deltaPOC = m_DeltaPOC[j]; uint8_t Used = used_by_curr_pic_flag[j]; m_DeltaPOC[j] = m_DeltaPOC[k]; used_by_curr_pic_flag[j] = used_by_curr_pic_flag[k]; m_DeltaPOC[k] = deltaPOC; used_by_curr_pic_flag[k] = Used; } } uint32_t ReferencePictureSet::getNumberOfUsedPictures() const { uint32_t const total = std::accumulate(used_by_curr_pic_flag, used_by_curr_pic_flag + num_pics, 0); return total; } // RPS list data structure constructor ReferencePictureSetList::ReferencePictureSetList() : m_NumberOfReferencePictureSets(0) { } // Allocate RPS list data structure with a new number of RPS void ReferencePictureSetList::allocate(unsigned NumberOfReferencePictureSets) { if (m_NumberOfReferencePictureSets == NumberOfReferencePictureSets) return; m_NumberOfReferencePictureSets = NumberOfReferencePictureSets; referencePictureSet.resize(NumberOfReferencePictureSets); } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_tables.cpp000066400000000000000000000052251443134507600315240ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_tables.h" namespace UMC_HEVC_DECODER { // Scaling list initialization scan lookup table const uint16_t g_sigLastScanCG32x32[64] = { 0, 8, 1, 16, 9, 2, 24, 17, 10, 3, 32, 25, 18, 11, 4, 40, 33, 26, 19, 12, 5, 48, 41, 34, 27, 20, 13, 6, 56, 49, 42, 35, 28, 21, 14, 7, 57, 50, 43, 36, 29, 22, 15, 58, 51, 44, 37, 30, 23, 59, 52, 45, 38, 31, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63 }; // Scaling list initialization scan lookup table const uint16_t ScanTableDiag4x4[16] = { 0, 4, 1, 8, 5, 2, 12, 9, 6, 3, 13, 10, 7, 14, 11, 15 }; // Default scaling list 4x4 const int32_t g_quantTSDefault4x4[16] = { 16,16,16,16, 16,16,16,16, 16,16,16,16, 16,16,16,16 }; // Default scaling list 8x8 for intra prediction const int32_t g_quantIntraDefault8x8[64] = { 16,16,16,16,17,18,21,24, 16,16,16,16,17,19,22,25, 16,16,17,18,20,22,25,29, 16,16,18,21,24,27,31,36, 17,17,20,24,30,35,41,47, 18,19,22,27,35,44,54,65, 21,22,25,31,41,54,70,88, 24,25,29,36,47,65,88,115 }; // Default scaling list 8x8 for inter prediction const int32_t g_quantInterDefault8x8[64] = { 16,16,16,16,17,18,20,24, 16,16,16,17,18,20,24,25, 16,16,17,18,20,24,25,28, 16,17,18,20,24,25,28,33, 17,18,20,24,25,28,33,41, 18,20,24,25,28,33,41,54, 20,24,25,28,33,41,54,71, 24,25,28,33,41,54,71,91 }; // Inverse QP scale lookup table const uint16_t g_invQuantScales[6] = { 40,45,51,57,64,72 }; } // end namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_task_broker.cpp000066400000000000000000000355221443134507600325630ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include #include "umc_h265_task_broker.h" #include "umc_h265_task_supplier.h" #include "umc_h265_frame_list.h" #include "umc_h265_debug.h" //#define ECHO //#define ECHO_DEB #undef DEBUG_PRINT #undef DEBUG_PRINT1 #define DEBUG_PRINT(x) #define DEBUG_PRINT1(x) namespace UMC_HEVC_DECODER { H265Slice* FindSliceByCUAddr(H265DecoderFrameInfo * info, int32_t firstCUToProcess); TileThreadingInfo * FindTileForProcess(H265DecoderFrameInfo * info, int32_t taskID, bool isDecRec = false); #if defined ECHO const vm_char * GetTaskString(H265Task * task) { const vm_char * taskIdStr; switch(task->m_iTaskID) { case TASK_SAO_H265: taskIdStr = VM_STRING("SAO"); break; case TASK_DEB_H265: taskIdStr = VM_STRING("deb"); break; case TASK_DEC_H265: taskIdStr = VM_STRING("dec"); break; case TASK_REC_H265: taskIdStr = VM_STRING("rec"); break; case TASK_DEC_REC_H265: taskIdStr = VM_STRING("dec rec"); break; case TASK_PROCESS_H265: taskIdStr = VM_STRING("slice"); break; default: taskIdStr = VM_STRING("unknown task id"); break; } return taskIdStr; } bool filterPrinting(H265Task * task, H265DecoderFrameInfo* info) { if (task->m_pSlice) { if (task->m_pSlice->GetCurrentFrame()->m_UID != 26) return false; } return true; } inline void PrintTask(H265Task * task) { H265DecoderFrameInfo* info = task->m_pSlicesInfo; if (!filterPrinting(task, info)) return; const vm_char * taskIdStr = GetTaskString(task); #ifndef ECHO_DEB if (task->m_iTaskID == TASK_DEB_H265 || task->m_iTaskID == TASK_SAO_H265) return ; #endif if (info) DEBUG_PRINT((VM_STRING("(thr - %d) (poc - %d) (uid - %d) %s - % 4d to % 4d\n"), task->m_iThreadNumber, info->m_pFrame->m_PicOrderCnt, info->m_pFrame->m_UID, taskIdStr, task->m_iFirstMB, task->m_iFirstMB + task->m_iMBToProcess)); else DEBUG_PRINT((VM_STRING("(thr - %d) %s - % 4d to % 4d\n"), task->m_iThreadNumber, taskIdStr, task->m_iFirstMB, task->m_iFirstMB + task->m_iMBToProcess)); } inline void PrintTaskDone(H265Task * task, H265DecoderFrameInfo* info) { if (!filterPrinting(task, info)) return; const vm_char * taskIdStr = GetTaskString(task); DEBUG_PRINT((VM_STRING("(thr - %d) (poc - %d) (uid - %d) %s done % 4d to % 4d - error - %d\n"), task->m_iThreadNumber, info->m_pFrame->m_PicOrderCnt, info->m_pFrame->m_UID, taskIdStr, task->m_iFirstMB, task->m_iFirstMB + task->m_iMBToProcess, task->m_bError)); } inline void PrintTaskDoneAdditional(H265Task * task, H265DecoderFrameInfo* info) { if (!filterPrinting(task, info)) return; const vm_char * taskIdStr = GetTaskString(task); int32_t readyIndex = DEC_PROCESS_ID; switch(task->m_iTaskID) { case TASK_DEC_H265: readyIndex = DEC_PROCESS_ID; break; case TASK_REC_H265: readyIndex = REC_PROCESS_ID; break; case TASK_DEB_H265: readyIndex = DEB_PROCESS_ID; break; case TASK_SAO_H265: readyIndex = SAO_PROCESS_ID; break; } if (task->m_pSlicesInfo->m_hasTiles) { DEBUG_PRINT((VM_STRING("(%d) (poc - %d) (uid - %d) %s ready %d\n"), task->m_iThreadNumber, info->m_pFrame->m_PicOrderCnt, info->m_pFrame->m_UID, taskIdStr, task->m_pSlicesInfo->m_curCUToProcess[readyIndex])); } else { if (task->m_iTaskID == TASK_SAO_H265) DEBUG_PRINT((VM_STRING("(%d) (poc - %d) (uid - %d) %s ready %d\n"), task->m_iThreadNumber, info->m_pFrame->m_PicOrderCnt, info->m_pFrame->m_UID, taskIdStr, info->m_curCUToProcess[SAO_PROCESS_ID])); else DEBUG_PRINT((VM_STRING("(%d) (poc - %d) (uid - %d) %s ready %d\n"), task->m_iThreadNumber, info->m_pFrame->m_PicOrderCnt, info->m_pFrame->m_UID, taskIdStr, task->m_pSlice->processInfo.m_curCUToProcess[readyIndex])); } } void PrintInfoStatus(H265DecoderFrameInfo * info) { if (!info) return; printf("status - %d\n", info->GetStatus()); for (uint32_t i = 0; i < info->GetSliceCount(); i++) { printf("slice - %u\n", i); H265Slice * pSlice = info->GetSlice(i); printf("POC - %d, \n", info->m_pFrame->m_PicOrderCnt); printf("cur to dec - %d\n", pSlice->processInfo.m_curCUToProcess[DEC_PROCESS_ID]); printf("cur to rec - %d\n", pSlice->processInfo.m_curCUToProcess[REC_PROCESS_ID]); printf("cur to deb - %d\n", pSlice->processInfo.m_curCUToProcess[DEB_PROCESS_ID]); printf("dec, rec, deb vacant - %d, %d, %d\n", pSlice->processInfo.m_processInProgress[DEC_PROCESS_ID], pSlice->processInfo.m_processInProgress[REC_PROCESS_ID], pSlice->processInfo.m_processInProgress[DEB_PROCESS_ID]); fflush(stdout); } } #endif TaskBroker_H265::TaskBroker_H265(TaskSupplier_H265 * pTaskSupplier) : m_pTaskSupplier(pTaskSupplier) , m_iConsumerNumber(0) , m_FirstAU(0) , m_IsShouldQuit(false) { Release(); } TaskBroker_H265::~TaskBroker_H265() { Release(); } // Initialize task broker with threads number bool TaskBroker_H265::Init(int32_t iConsumerNumber) { Release(); // we keep this variable due some optimizations purposes m_iConsumerNumber = iConsumerNumber; m_IsShouldQuit = false; return true; } // Reset to default values, stop all activity void TaskBroker_H265::Reset() { UMC::AutomaticUMCMutex guard(m_mGuard); m_FirstAU = 0; m_IsShouldQuit = true; m_decodingQueue.clear(); m_completedQueue.clear(); } // Release resources void TaskBroker_H265::Release() { Reset(); } // Lock synchronization mutex void TaskBroker_H265::Lock() { m_mGuard.Lock(); } // Uncock synchronization mutex void TaskBroker_H265::Unlock() { m_mGuard.Unlock(); } // Check whether frame is prepared bool TaskBroker_H265::PrepareFrame(H265DecoderFrame * pFrame) { if (!pFrame || pFrame->prepared) { return true; } if (pFrame->prepared) return true; if (pFrame->GetAU()->GetStatus() == H265DecoderFrameInfo::STATUS_FILLED || pFrame->GetAU()->GetStatus() == H265DecoderFrameInfo::STATUS_STARTED) { pFrame->prepared = true; } DEBUG_PRINT((VM_STRING("Prepare frame - %d\n"), pFrame->m_PicOrderCnt)); return true; } // Add frame to decoding queue bool TaskBroker_H265::AddFrameToDecoding(H265DecoderFrame * frame) { if (!frame || frame->IsDecodingStarted() || !IsExistTasks(frame)) return false; UMC::AutomaticUMCMutex guard(m_mGuard); #ifdef VM_DEBUG FrameQueue::iterator iter = m_decodingQueue.begin(); FrameQueue::iterator end_iter = m_decodingQueue.end(); for (; iter != end_iter; ++iter) { if ((*iter) == frame) { assert(false); } } #endif m_decodingQueue.push_back(frame); frame->StartDecoding(); return true; } // Remove access unit from the linked list of frames void TaskBroker_H265::RemoveAU(H265DecoderFrameInfo * toRemove) { H265DecoderFrameInfo * temp = m_FirstAU; if (!temp) return; H265DecoderFrameInfo * reference = 0; for (; temp; temp = temp->GetNextAU()) { if (temp == toRemove) break; if (temp->IsReference()) reference = temp; } if (!temp) return; if (temp->GetPrevAU()) temp->GetPrevAU()->SetNextAU(temp->GetNextAU()); if (temp->GetNextAU()) temp->GetNextAU()->SetPrevAU(temp->GetPrevAU()); H265DecoderFrameInfo * temp1 = temp->GetNextAU(); temp->SetPrevAU(0); temp->SetNextAU(0); if (temp == m_FirstAU) m_FirstAU = temp1; if (temp1) { temp = temp1; for (; temp; temp = temp->GetNextAU()) { if (temp->GetRefAU()) temp->SetRefAU(reference); if (temp->IsReference()) break; } } } // Finish frame decoding void TaskBroker_H265::CompleteFrame(H265DecoderFrame * frame) { if (!frame || m_decodingQueue.empty() || !frame->IsFullFrame()) return; if (!IsFrameCompleted(frame) || frame->IsDecodingCompleted()) return; if (frame == m_decodingQueue.front()) { RemoveAU(frame->GetAU()); m_decodingQueue.pop_front(); } else { RemoveAU(frame->GetAU()); m_decodingQueue.remove(frame); } frame->CompleteDecoding(); } // Update access units list finishing completed frames void TaskBroker_H265::SwitchCurrentAU() { if (!m_FirstAU || !m_FirstAU->IsCompleted()) return; while (m_FirstAU && m_FirstAU->IsCompleted()) { DEBUG_PRINT((VM_STRING("Switch current AU - is_completed %d, poc - %d, m_FirstAU - %X\n"), m_FirstAU->IsCompleted(), m_FirstAU->m_pFrame->m_PicOrderCnt, m_FirstAU)); H265DecoderFrameInfo* completed = m_FirstAU; m_FirstAU = m_FirstAU->GetNextAU(); CompleteFrame(completed->m_pFrame); } InitAUs(); } // Wakes up working threads to start working on new tasks void TaskBroker_H265::Start() { UMC::AutomaticUMCMutex guard(m_mGuard); FrameQueue::iterator iter = m_decodingQueue.begin(); for (; iter != m_decodingQueue.end(); ++iter) { H265DecoderFrame * frame = *iter; if (IsFrameCompleted(frame)) { CompleteFrame(frame); iter = m_decodingQueue.begin(); if (iter == m_decodingQueue.end()) // avoid ++iter operation break; } } InitAUs(); DEBUG_PRINT((VM_STRING("Start\n"))); } // Find an access unit which has all slices found H265DecoderFrameInfo * TaskBroker_H265::FindAU() { FrameQueue::iterator iter = m_decodingQueue.begin(); FrameQueue::iterator end_iter = m_decodingQueue.end(); for (; iter != end_iter; ++iter) { H265DecoderFrame * frame = *iter; H265DecoderFrameInfo *slicesInfo = frame->GetAU(); if (slicesInfo->GetSliceCount()) { if (slicesInfo->GetStatus() == H265DecoderFrameInfo::STATUS_FILLED) return slicesInfo; } } return 0; } // Try to find an access unit which to decode next void TaskBroker_H265::InitAUs() { H265DecoderFrameInfo * pPrev; H265DecoderFrameInfo * refAU; if (!m_FirstAU) { m_FirstAU = FindAU(); if (!m_FirstAU) return; if (!PrepareFrame(m_FirstAU->m_pFrame)) { m_FirstAU = 0; return; } m_FirstAU->SetStatus(H265DecoderFrameInfo::STATUS_STARTED); pPrev = m_FirstAU; m_FirstAU->SetPrevAU(0); m_FirstAU->SetNextAU(0); m_FirstAU->SetRefAU(0); refAU = 0; if (m_FirstAU->IsReference()) { refAU = m_FirstAU; } } else { pPrev = m_FirstAU; refAU = 0; pPrev->SetPrevAU(0); pPrev->SetRefAU(0); if (m_FirstAU->IsReference()) { refAU = pPrev; } while (pPrev->GetNextAU()) { pPrev = pPrev->GetNextAU(); if (!refAU) pPrev->SetRefAU(0); if (pPrev->IsReference()) { refAU = pPrev; } }; } H265DecoderFrameInfo * pTemp = FindAU(); for (; pTemp; ) { if (!PrepareFrame(pTemp->m_pFrame)) { pPrev->SetNextAU(0); break; } pTemp->SetStatus(H265DecoderFrameInfo::STATUS_STARTED); pTemp->SetNextAU(0); pTemp->SetPrevAU(pPrev); pTemp->SetRefAU(refAU); if (pTemp->IsReference()) { refAU = pTemp; } pPrev->SetNextAU(pTemp); pPrev = pTemp; pTemp = FindAU(); } } // Returns whether frame decoding is finished bool TaskBroker_H265::IsFrameCompleted(H265DecoderFrame * pFrame) const { if (!pFrame) return true; H265DecoderFrameInfo::FillnessStatus status = pFrame->GetAU()->GetStatus(); bool ret; switch (status) { case H265DecoderFrameInfo::STATUS_NONE: ret = true; break; case H265DecoderFrameInfo::STATUS_NOT_FILLED: ret = false; break; case H265DecoderFrameInfo::STATUS_COMPLETED: ret = true; break; default: ret = pFrame->GetAU()->IsCompleted(); break; } return ret; } // Tries to find a new task for asynchronous processing bool TaskBroker_H265::GetNextTask(H265Task *pTask) { bool res = GetNextTaskInternal(pTask); #ifdef ECHO if (res) PrintTask(pTask); #endif // ECHO return res; } // bool TaskBroker_H265::GetNextTask(H265Task *pTask) // Calculate frame state after a task has been finished void TaskBroker_H265::AddPerformedTask(H265Task *) { } #define Check_Status(status) ((status == H265DecoderFrameInfo::STATUS_FILLED) || (status == H265DecoderFrameInfo::STATUS_STARTED)) // Returns number of access units available in the list but not processed yet int32_t TaskBroker_H265::GetNumberOfTasks(void) { int32_t au_count = 0; H265DecoderFrameInfo * temp = m_FirstAU; for (; temp ; temp = temp->GetNextAU()) { if (temp->GetStatus() == H265DecoderFrameInfo::STATUS_COMPLETED) continue; au_count += 2; } return au_count; } // Returns whether enough bitstream data is evailable to start an asynchronous task bool TaskBroker_H265::IsEnoughForStartDecoding(bool ) { UMC::AutomaticUMCMutex guard(m_mGuard); InitAUs(); return m_FirstAU != 0; } // Returns whether there is some work available for specified frame bool TaskBroker_H265::IsExistTasks(H265DecoderFrame * frame) { H265DecoderFrameInfo *slicesInfo = frame->GetAU(); return Check_Status(slicesInfo->GetStatus()); } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_task_supplier.cpp000077500000000000000000002440541443134507600330700ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" //#define MFX_ENABLE_H265_VIDEO_DECODE #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "memory" #include // for INT_MIN, INT_MAX on Linux #include #include #include #include "umc_h265_task_supplier.h" #include "umc_h265_frame_list.h" #include "umc_h265_nal_spl.h" #include "umc_h265_bitstream_headers.h" #include "umc_h265_dec_defs.h" #include "umc_h265_task_broker.h" #include "umc_structures.h" #include "umc_frame_data.h" #include "umc_h265_debug.h" #include "mfx_common.h" // for trace routines namespace UMC_HEVC_DECODER { inline void SetDecodeErrorTypes(NalUnitType nalUnit, mfxExtDecodeErrorReport *pDecodeErrorReport) { if (!pDecodeErrorReport) return; switch (nalUnit) { case NAL_UT_SPS: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_SPS; break; case NAL_UT_PPS: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_PPS; break; default: break; }; } const uint32_t levelIndexArray[] = { H265_LEVEL_1, H265_LEVEL_2, H265_LEVEL_21, H265_LEVEL_3, H265_LEVEL_31, H265_LEVEL_4, H265_LEVEL_41, H265_LEVEL_5, H265_LEVEL_51, H265_LEVEL_52, H265_LEVEL_6, H265_LEVEL_61, H265_LEVEL_62 }; /****************************************************************************************************/ // DecReferencePictureMarking_H265 /****************************************************************************************************/ DecReferencePictureMarking_H265::DecReferencePictureMarking_H265() : m_isDPBErrorFound(0) , m_frameCount(0) { } void DecReferencePictureMarking_H265::Reset() { m_frameCount = 0; m_isDPBErrorFound = 0; } void DecReferencePictureMarking_H265::ResetError() { m_isDPBErrorFound = 0; } uint32_t DecReferencePictureMarking_H265::GetDPBError() const { return m_isDPBErrorFound; } // Update DPB contents marking frames for reuse UMC::Status DecReferencePictureMarking_H265::UpdateRefPicMarking(ViewItem_H265 &view, const H265Slice * pSlice) { UMC::Status umcRes = UMC::UMC_OK; m_frameCount++; H265SliceHeader const * sliceHeader = pSlice->GetSliceHeader(); if (sliceHeader->IdrPicFlag) { // mark all reference pictures as unused for (H265DecoderFrame *pCurr = view.pDPB->head(); pCurr; pCurr = pCurr->future()) { pCurr->GetAU()->m_frameBeforeIDR = 1; if (pCurr->isShortTermRef() || pCurr->isLongTermRef()) { pCurr->SetisShortTermRef(false); pCurr->SetisLongTermRef(false); } } } else { const ReferencePictureSet* rps = pSlice->getRPS(); // loop through all pictures in the reference picture buffer for (H265DecoderFrame *pTmp = view.pDPB->head(); pTmp; pTmp = pTmp->future()) { if (pTmp->isDisposable() || (!pTmp->isShortTermRef() && !pTmp->isLongTermRef())) continue; bool isReferenced = false; if (!pTmp->RefPicListResetCount()) { // loop through all pictures in the Reference Picture Set // to see if the picture should be kept as reference picture int32_t i; int32_t count = rps->getNumberOfPositivePictures() + rps->getNumberOfNegativePictures(); for(i = 0; i < count; i++) { if (!pTmp->isLongTermRef() && pTmp->m_PicOrderCnt == pSlice->GetSliceHeader()->m_poc + rps->getDeltaPOC(i)) { isReferenced = true; pTmp->SetisShortTermRef(true); pTmp->SetisLongTermRef(false); pTmp->m_isUsedAsReference = true; } } count = rps->getNumberOfPictures(); for( ; i < count; i++) { if (rps->getCheckLTMSBPresent(i)) { if (pTmp->m_PicOrderCnt == rps->getPOC(i)) { isReferenced = true; pTmp->SetisLongTermRef(true); pTmp->SetisShortTermRef(false); pTmp->m_isUsedAsReference = true; } } else { int const MaxPicOrderCntLsb = 1 << pSlice->GetSeqParam()->log2_max_pic_order_cnt_lsb; if ((pTmp->m_PicOrderCnt & (MaxPicOrderCntLsb - 1)) == (rps->getPOC(i) & (MaxPicOrderCntLsb - 1))) { isReferenced = true; pTmp->SetisLongTermRef(true); pTmp->SetisShortTermRef(false); pTmp->m_isUsedAsReference = true; } } } } // mark the picture as "unused for reference" if it is not in // the Reference Picture Set if(pTmp->m_PicOrderCnt != pSlice->GetSliceHeader()->m_poc && !isReferenced) { pTmp->SetisShortTermRef(false); pTmp->SetisLongTermRef(false); DEBUG_PRINT1((VM_STRING("Dereferencing frame with POC %d, busy = %d\n"), pTmp->m_PicOrderCnt, pTmp->GetRefCounter())); } // WA: To fix incorrect stream having same (as incoming slice) POC in DPB // Mark a older frame having similar POCs within DPBList as unused reference frame if similar mutiple POCs are found // within the DPBList. This is to prevent the DPBList from max out with unused reference frame kept as reference picture. else if(pTmp->m_PicOrderCnt == pSlice->GetSliceHeader()->m_poc && !isReferenced && pTmp->isShortTermRef()) { pTmp->SetisShortTermRef(false); pTmp->SetisLongTermRef(false); DEBUG_PRINT1((VM_STRING("Dereferencing frame with POC %d, busy = %d\n"), pTmp->m_PicOrderCnt, pTmp->GetRefCounter())); } } } // not IDR picture return umcRes; } void DecReferencePictureMarking_H265::ResetUnusedFrames(ViewItem_H265 &view) { for (H265DecoderFrame *pTmp = view.pDPB->head(); pTmp; pTmp = pTmp->future()) { if(!pTmp->isShortTermRef() && !pTmp->isLongTermRef() && pTmp->GetRefCounter() == 0 && pTmp->m_wasOutputted && pTmp->m_wasDisplayed && pTmp->m_isDisplayable) { pTmp->Reset(); } } } // Check if bitstream resolution has changed static bool IsNeedSPSInvalidate(const H265SeqParamSet *old_sps, const H265SeqParamSet *new_sps) { if (!old_sps || !new_sps) return false; //if (new_sps->no_output_of_prior_pics_flag) // return true; if (old_sps->pic_width_in_luma_samples != new_sps->pic_width_in_luma_samples) return true; if (old_sps->pic_height_in_luma_samples != new_sps->pic_height_in_luma_samples) return true; if (old_sps->bit_depth_luma != new_sps->bit_depth_luma) return true; if (old_sps->bit_depth_chroma != new_sps->bit_depth_chroma) return true; if (old_sps->m_pcPTL.GetGeneralPTL()->profile_idc != new_sps->m_pcPTL.GetGeneralPTL()->profile_idc) return true; if (old_sps->chroma_format_idc != new_sps->chroma_format_idc) return true; if (old_sps->sps_max_dec_pic_buffering[0] < new_sps->sps_max_dec_pic_buffering[0]) return true; return false; } /****************************************************************************************************/ // MVC_Extension_H265 class routine /****************************************************************************************************/ MVC_Extension::MVC_Extension() : m_temporal_id(7) , m_priority_id(63) , HighestTid(0) , m_level_idc(0) { Reset(); } MVC_Extension::~MVC_Extension() { Close(); } UMC::Status MVC_Extension::Init() { MVC_Extension::Close(); m_view.pDPB.reset(new H265DBPList()); return UMC::UMC_OK; } void MVC_Extension::Close() { MVC_Extension::Reset(); } void MVC_Extension::Reset() { m_temporal_id = 7; m_priority_id = 63; m_level_idc = 0; HighestTid = 0; m_view.Reset(); } ViewItem_H265 * MVC_Extension::GetView() { return &m_view; } /****************************************************************************************************/ // Skipping_H265 class routine /****************************************************************************************************/ Skipping_H265::Skipping_H265() : m_VideoDecodingSpeed(0) , m_SkipCycle(1) , m_ModSkipCycle(1) , m_PermanentTurnOffDeblocking(0) , m_NumberOfSkippedFrames(0) { } Skipping_H265::~Skipping_H265() { } void Skipping_H265::Reset() { m_VideoDecodingSpeed = 0; m_SkipCycle = 0; m_ModSkipCycle = 0; m_PermanentTurnOffDeblocking = 0; m_NumberOfSkippedFrames = 0; } // Disable deblocking filter to increase performance void Skipping_H265::PermanentDisableDeblocking(bool disable) { m_PermanentTurnOffDeblocking = disable ? 3 : 0; } // Check if deblocking should be skipped bool Skipping_H265::IsShouldSkipDeblocking(H265DecoderFrame *) { return (IS_SKIP_DEBLOCKING_MODE_PREVENTIVE || IS_SKIP_DEBLOCKING_MODE_PERMANENT); } // Check if frame should be skipped to decrease decoding delays bool Skipping_H265::IsShouldSkipFrame(H265DecoderFrame * ) { return false; } // Set decoding skip frame mode mfxStatus Skipping_H265::ChangeVideoDecodingSpeed(int32_t & num) { m_VideoDecodingSpeed += num; if (m_VideoDecodingSpeed < 0) m_VideoDecodingSpeed = 0; if (m_VideoDecodingSpeed > 7) m_VideoDecodingSpeed = 7; num = m_VideoDecodingSpeed; int32_t deblocking_off = m_PermanentTurnOffDeblocking; if (deblocking_off == 3) m_PermanentTurnOffDeblocking = 3; return MFX_ERR_NONE; } // Get current skip mode state Skipping_H265::SkipInfo Skipping_H265::GetSkipInfo() const { SkipInfo info; info.isDeblockingTurnedOff = (m_VideoDecodingSpeed == 5) || (m_VideoDecodingSpeed == 7); info.numberOfSkippedFrames = m_NumberOfSkippedFrames; return info; } /****************************************************************************************************/ // SEI_Storer_H265 /****************************************************************************************************/ SEI_Storer_H265::SEI_Storer_H265() { Reset(); } SEI_Storer_H265::~SEI_Storer_H265() { Close(); } // Initialize SEI storage void SEI_Storer_H265::Init() { Close(); m_data.resize(MAX_BUFFERED_SIZE); m_payloads.resize(START_ELEMENTS); m_offset = 0; m_lastUsed = 2; } // Deallocate SEI storage void SEI_Storer_H265::Close() { Reset(); m_data.clear(); m_payloads.clear(); } // Reset SEI storage void SEI_Storer_H265::Reset() { m_offset = 0; m_lastUsed = 2; for (uint32_t i = 0; i < m_payloads.size(); i++) { m_payloads[i].isUsed = 0; } } // Set SEI frame for stored SEI messages void SEI_Storer_H265::SetFrame(H265DecoderFrame * frame) { assert(frame); for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == 0 && m_payloads[i].isUsed) { m_payloads[i].frame = frame; } } } // Set timestamp for stored SEI messages void SEI_Storer_H265::SetTimestamp(H265DecoderFrame * frame) { assert(frame); double ts = frame->m_dFrameTime; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == frame) { m_payloads[i].timestamp = ts; if (m_payloads[i].isUsed) m_payloads[i].isUsed = m_lastUsed; } } m_lastUsed++; } // Retrieve a stored SEI message which was not retrieved before const SEI_Storer_H265::SEI_Message * SEI_Storer_H265::GetPayloadMessage() { SEI_Storer_H265::SEI_Message * msg = 0; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].isUsed > 1) { if (!msg || msg->isUsed > m_payloads[i].isUsed) { msg = &m_payloads[i]; } } } if (msg) msg->isUsed = 0; return msg; } // Put a new SEI message to the storage SEI_Storer_H265::SEI_Message* SEI_Storer_H265::AddMessage(UMC::MediaDataEx *nalUnit, SEI_TYPE type) { size_t const size = nalUnit->GetDataSize(); if (size > (m_data.size() >> 2)) return 0; if (m_offset + size > m_data.size()) { m_offset = 0; } // clear overwriting messages: for (uint32_t i = 0; i < m_payloads.size(); i++) { if (!m_payloads[i].isUsed) continue; SEI_Message & mmsg = m_payloads[i]; if ((m_offset + size > mmsg.offset) && (m_offset < mmsg.offset + mmsg.size)) { m_payloads[i].isUsed = 0; return 0; } } size_t freeSlot = 0; //move empty (not used) payloads to the end of sequence std::vector::iterator end = std::remove_if(m_payloads.begin(), m_payloads.end(), std::mem_fn(&SEI_Message::empty)); if (end != m_payloads.end()) { //since the state of elements after new logical end is unspecified //we have to clear (mark as not used) them std::for_each(end, m_payloads.end(), std::mem_fn(&SEI_Message::clear)); freeSlot = std::distance(m_payloads.begin(), end); } else { if (m_payloads.size() >= MAX_ELEMENTS) return 0; m_payloads.push_back(SEI_Message()); freeSlot = m_payloads.size() - 1; } m_payloads[freeSlot].frame = 0; m_payloads[freeSlot].offset = m_offset; m_payloads[freeSlot].size = size; m_payloads[freeSlot].data = &m_data[m_offset]; if (nalUnit->GetExData()) m_payloads[freeSlot].nal_type = nalUnit->GetExData()->values[0]; m_payloads[freeSlot].type = type; m_payloads[freeSlot].isUsed = 1; MFX_INTERNAL_CPY(m_payloads[freeSlot].data, (uint8_t*)nalUnit->GetDataPointer(), m_payloads[freeSlot].size); m_offset += size; return &m_payloads[freeSlot]; } ViewItem_H265::ViewItem_H265() { Reset(); } // ViewItem_H265::ViewItem_H265(void) ViewItem_H265::ViewItem_H265(const ViewItem_H265 &src) { Reset(); pDPB.reset(src.pDPB.release()); dpbSize = src.dpbSize; sps_max_dec_pic_buffering = src.sps_max_dec_pic_buffering; sps_max_num_reorder_pics = src.sps_max_num_reorder_pics; } // ViewItem_H265::ViewItem_H265(const ViewItem_H265 &src) ViewItem_H265::~ViewItem_H265() { Close(); } // ViewItem_H265::ViewItem_H265(void) // Initialize the view, allocate resources UMC::Status ViewItem_H265::Init() { // release the object before initialization Close(); try { // allocate DPB and POC counter pDPB.reset(new H265DBPList()); } catch(...) { return UMC::UMC_ERR_ALLOC; } // save the ID localFrameTime = 0; pCurFrame = 0; return UMC::UMC_OK; } // Status ViewItem_H265::Init(uint32_t view_id) // Close the view and release all resources void ViewItem_H265::Close(void) { // Reset the parameters before close Reset(); if (pDPB.get()) { pDPB.reset(); } dpbSize = 0; sps_max_dec_pic_buffering = 1; sps_max_num_reorder_pics = 0; } // void ViewItem_H265::Close(void) // Reset the view and reset all resource void ViewItem_H265::Reset(void) { if (pDPB.get()) { pDPB->Reset(); } pCurFrame = 0; localFrameTime = 0; sps_max_dec_pic_buffering = 1; sps_max_num_reorder_pics = 0; dpbSize = 0; } // void ViewItem_H265::Reset(void) // Reset the size of DPB for particular view item void ViewItem_H265::SetDPBSize(H265SeqParamSet *pSps, uint32_t & level_idc) { uint32_t level = level_idc ? level_idc : pSps->m_pcPTL.GetGeneralPTL()->level_idc; // calculate the new DPB size value // should have correct temporal layer dpbSize = pSps->sps_max_dec_pic_buffering[pSps->sps_max_sub_layers-1]; if (level_idc) { level_idc = level; } else { pSps->m_pcPTL.GetGeneralPTL()->level_idc = level; } // provide the new value to the DPBList if (pDPB.get()) { pDPB->SetDPBSize(dpbSize); } } // void ViewItem_H265::SetDPBSize(const H265SeqParamSet *pSps) /****************************************************************************************************/ // TaskSupplier_H265 /****************************************************************************************************/ TaskSupplier_H265::TaskSupplier_H265() : m_SliceIdxInTaskSupplier(0) , m_pSegmentDecoder(0) , m_iThreadNum(0) , m_maxUIDWhenWasDisplayed(0) , m_local_delta_frame_time(0) , m_use_external_framerate(false) , m_decodedOrder(false) , m_checkCRAInsideResetProcess(false) , m_bFirstSliceInSequence(true) , m_bFirstSliceInBitstream(true) , m_pLastSlice(0) , m_pLastDisplayed(0) , m_pMemoryAllocator(0) , m_pFrameAllocator(0) , m_WaitForIDR(false) , m_prevSliceBroken(false) , m_RA_POC(0) , NoRaslOutputFlag(0) , m_IRAPType(NAL_UT_INVALID) , m_DPBSizeEx(0) , m_frameOrder(0) , m_pTaskBroker(0) , m_UIDFrameCounter(0) , m_sei_messages(0) , m_isInitialized(false) { } TaskSupplier_H265::~TaskSupplier_H265() { Close(); } // Initialize task supplier and creak task broker UMC::Status TaskSupplier_H265::Init(UMC::VideoDecoderParams *init) { if (NULL == init) return UMC::UMC_ERR_NULL_PTR; Close(); m_DPBSizeEx = 0; m_initializationParams = *init; int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); AU_Splitter_H265::Init(init); MVC_Extension::Init(); // create slice decoder(s) m_pSegmentDecoder = new H265SegmentDecoderBase *[m_iThreadNum]; memset(m_pSegmentDecoder, 0, sizeof(H265SegmentDecoderBase *) * m_iThreadNum); CreateTaskBroker(); m_pTaskBroker->Init(m_iThreadNum); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { if (UMC::UMC_OK != m_pSegmentDecoder[i]->Init(i)) return UMC::UMC_ERR_INIT; } m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } m_DPBSizeEx = m_iThreadNum; m_isInitialized = true; return UMC::UMC_OK; } // Initialize what is necessary to decode bitstream header before the main part is initialized UMC::Status TaskSupplier_H265::PreInit(UMC::VideoDecoderParams *init) { if (m_isInitialized) return UMC::UMC_OK; if (NULL == init) return UMC::UMC_ERR_NULL_PTR; Close(); m_DPBSizeEx = 0; MVC_Extension::Init(); int32_t nAllowedThreadNumber = init->numThreads; if(nAllowedThreadNumber < 0) nAllowedThreadNumber = 0; // calculate number of slice decoders. // It should be equal to CPU number m_iThreadNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); AU_Splitter_H265::Init(init); m_local_delta_frame_time = 1.0/30; m_frameOrder = 0; m_use_external_framerate = 0 < init->info.framerate; if (m_use_external_framerate) { m_local_delta_frame_time = 1 / init->info.framerate; } m_DPBSizeEx = m_iThreadNum; return UMC::UMC_OK; } // Release allocated resources void TaskSupplier_H265::Close() { if (m_pTaskBroker) { m_pTaskBroker->Release(); } // from reset if (GetView()->pDPB.get()) { for (H265DecoderFrame *pFrame = GetView()->pDPB->head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } } if (m_pSegmentDecoder) { for (uint32_t i = 0; i < m_iThreadNum; i += 1) { delete m_pSegmentDecoder[i]; m_pSegmentDecoder[i] = 0; } } MVC_Extension::Close(); DecReferencePictureMarking_H265::Reset(); if (m_pLastSlice) { m_pLastSlice->Release(); m_ObjHeap.FreeObject(m_pLastSlice); m_pLastSlice = 0; } AU_Splitter_H265::Close(); Skipping_H265::Reset(); m_pocDecoding.Reset(); m_frameOrder = 0; m_decodedOrder = false; m_checkCRAInsideResetProcess = false; m_WaitForIDR = true; m_prevSliceBroken = false; m_maxUIDWhenWasDisplayed = 0; m_RA_POC = 0; m_IRAPType = NAL_UT_INVALID; NoRaslOutputFlag = 0; m_pLastDisplayed = 0; delete m_sei_messages; m_sei_messages = 0; // from reset delete[] m_pSegmentDecoder; m_pSegmentDecoder = 0; delete m_pTaskBroker; m_pTaskBroker = 0; m_iThreadNum = 0; m_DPBSizeEx = 1; m_isInitialized = false; } // void TaskSupplier_H265::Close() // Reset to default state void TaskSupplier_H265::Reset() { if (m_pTaskBroker) m_pTaskBroker->Reset(); { for (H265DecoderFrame *pFrame = GetView()->pDPB->head(); pFrame; pFrame = pFrame->future()) { pFrame->FreeResources(); } } if (m_sei_messages) m_sei_messages->Reset(); MVC_Extension::Reset(); DecReferencePictureMarking_H265::Reset(); if (m_pLastSlice) { m_pLastSlice->Release(); m_ObjHeap.FreeObject(m_pLastSlice); m_pLastSlice = 0; } Skipping_H265::Reset(); AU_Splitter_H265::Reset(); m_pocDecoding.Reset(); m_frameOrder = 0; m_decodedOrder = false; m_checkCRAInsideResetProcess = false; m_WaitForIDR = true; m_prevSliceBroken = false; m_maxUIDWhenWasDisplayed = 0; m_RA_POC = 0; m_IRAPType = NAL_UT_INVALID; NoRaslOutputFlag = 0; m_pLastDisplayed = 0; if (m_pTaskBroker) m_pTaskBroker->Init(m_iThreadNum); } // Attempt to recover after something unexpectedly went wrong void TaskSupplier_H265::AfterErrorRestore() { if (m_pTaskBroker) m_pTaskBroker->Reset(); GetView()->pDPB->Reset(); MVC_Extension::Reset(); if (m_pLastSlice) { m_pLastSlice->Release(); m_ObjHeap.FreeObject(m_pLastSlice); m_pLastSlice = 0; } Skipping_H265::Reset(); AU_Splitter_H265::Reset(); m_decodedOrder = false; m_checkCRAInsideResetProcess = false; m_WaitForIDR = true; m_prevSliceBroken = false; m_maxUIDWhenWasDisplayed = 0; NoRaslOutputFlag = 0; m_pLastDisplayed = 0; if (m_pTaskBroker) m_pTaskBroker->Init(m_iThreadNum); } // Fill up current bitstream information UMC::Status TaskSupplier_H265::GetInfo(UMC::VideoDecoderParams *lpInfo) { H265SeqParamSet *sps = m_Headers.m_SeqParams.GetCurrentHeader(); if (!sps) { return UMC::UMC_ERR_NOT_ENOUGH_DATA; } lpInfo->info.clip_info.height = sps->pic_height_in_luma_samples - (sps->conf_win_top_offset + sps->conf_win_bottom_offset); lpInfo->info.clip_info.width = sps->pic_width_in_luma_samples - (sps->conf_win_left_offset + sps->conf_win_right_offset); if (0.0 < m_local_delta_frame_time) { lpInfo->info.framerate = 1.0 / m_local_delta_frame_time; } else { lpInfo->info.framerate = 0; } lpInfo->info.stream_type = UMC::HEVC_VIDEO; lpInfo->profile = sps->m_pcPTL.GetGeneralPTL()->profile_idc; lpInfo->level = sps->m_pcPTL.GetGeneralPTL()->level_idc; lpInfo->numThreads = m_iThreadNum; lpInfo->info.color_format = GetUMCColorFormat_H265(sps->chroma_format_idc); lpInfo->info.profile = sps->m_pcPTL.GetGeneralPTL()->profile_idc; lpInfo->info.level = sps->m_pcPTL.GetGeneralPTL()->level_idc; lpInfo->info.aspect_ratio_width = sps->sar_width; lpInfo->info.aspect_ratio_height = sps->sar_height; uint32_t multiplier = 1 << (6 + sps->getHrdParameters()->bit_rate_scale); lpInfo->info.bitrate = (sps->getHrdParameters()->GetHRDSubLayerParam(0)->bit_rate_value[0][0] - 1) * multiplier; lpInfo->info.interlace_type = UMC::PROGRESSIVE; return UMC::UMC_OK; } // Search DPB for a frame which may be reused H265DecoderFrame *TaskSupplier_H265::GetFreeFrame() { UMC::AutomaticUMCMutex guard(m_mGuard); H265DecoderFrame *pFrame = 0; ViewItem_H265 *pView = GetView(); H265DBPList *pDPB = pView->pDPB.get(); // Traverse list for next disposable frame if (pDPB->countAllFrames() >= pView->dpbSize + m_DPBSizeEx) pFrame = pDPB->GetOldestDisposable(); //pDPB->printDPB(); assert(!pFrame || pFrame->GetRefCounter() == 0); // Did we find one? if (NULL == pFrame) { if (pDPB->countAllFrames() >= pView->dpbSize + m_DPBSizeEx) { return 0; } // Didn't find one. Let's try to insert a new one pFrame = new H265DecoderFrame(m_pMemoryAllocator, &m_ObjHeap); if (NULL == pFrame) return 0; pDPB->append(pFrame); } pFrame->Reset(); // Set current as not displayable (yet) and not outputted. Will be // updated to displayable after successful decode. pFrame->IncrementReference(); m_UIDFrameCounter++; pFrame->m_UID = m_UIDFrameCounter; return pFrame; } // Decode SEI NAL unit UMC::Status TaskSupplier_H265::DecodeSEI(UMC::MediaDataEx *nalUnit) { if (m_Headers.m_SeqParams.GetCurrentID() == -1) return UMC::UMC_OK; H265HeadersBitstream bitStream; try { MemoryPiece mem; mem.SetData(nalUnit); //NU reader needs 8 bytes as tail data, allocate another 8 bytes here to avoid out of bound read. MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE * 2); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem, 0); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NalUnitType nal_unit_type; uint32_t temporal_id = 0; bitStream.GetNALUnitType(nal_unit_type, temporal_id); do { H265SEIPayLoad m_SEIPayLoads; /*int32_t target_sps =*/ bitStream.ParseSEI(m_Headers.m_SeqParams, m_Headers.m_SeqParams.GetCurrentID(), &m_SEIPayLoads); if (m_SEIPayLoads.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { m_UserData = m_SEIPayLoads; } else { m_Headers.m_SEIParams.AddHeader(&m_SEIPayLoads); } } while (bitStream.More_RBSP_Data()); } catch(...) { // nothing to do just catch it } return UMC::UMC_OK; } // Decode video parameters set NAL unit UMC::Status TaskSupplier_H265::xDecodeVPS(H265HeadersBitstream *bs) { H265VideoParamSet vps; UMC::Status s = bs->GetVideoParamSet(&vps); if(s == UMC::UMC_OK) m_Headers.m_VideoParams.AddHeader(&vps); return s; } // Decode sequence parameters set NAL unit UMC::Status TaskSupplier_H265::xDecodeSPS(H265HeadersBitstream *bs) { H265SeqParamSet sps; sps.Reset(); UMC::Status s = bs->GetSequenceParamSet(&sps); if(s != UMC::UMC_OK) return s; if (sps.need16bitOutput && sps.m_pcPTL.GetGeneralPTL()->profile_idc == H265_PROFILE_MAIN10 && sps.bit_depth_luma == 8 && sps.bit_depth_chroma == 8 && m_initializationParams.info.color_format == UMC::NV12) sps.need16bitOutput = 0; sps.WidthInCU = (sps.pic_width_in_luma_samples % sps.MaxCUSize) ? sps.pic_width_in_luma_samples / sps.MaxCUSize + 1 : sps.pic_width_in_luma_samples / sps.MaxCUSize; sps.HeightInCU = (sps.pic_height_in_luma_samples % sps.MaxCUSize) ? sps.pic_height_in_luma_samples / sps.MaxCUSize + 1 : sps.pic_height_in_luma_samples / sps.MaxCUSize; sps.NumPartitionsInCUSize = 1 << sps.MaxCUDepth; sps.NumPartitionsInCU = 1 << (sps.MaxCUDepth << 1); sps.NumPartitionsInFrameWidth = sps.WidthInCU * sps.NumPartitionsInCUSize; uint8_t newDPBsize = (uint8_t)CalculateDPBSize(sps.getPTL()->GetGeneralPTL()->profile_idc, sps.getPTL()->GetGeneralPTL()->level_idc, sps.pic_width_in_luma_samples, sps.pic_height_in_luma_samples, sps.sps_max_dec_pic_buffering[HighestTid]); for (uint32_t i = 0; i <= HighestTid; i++) { if (sps.sps_max_dec_pic_buffering[i] > newDPBsize) sps.sps_max_dec_pic_buffering[i] = newDPBsize; } HighestTid = sps.sps_max_sub_layers - 1; if (!sps.getPTL()->GetGeneralPTL()->level_idc && sps.sps_max_dec_pic_buffering[HighestTid]) { uint32_t level_idc = levelIndexArray[0]; for (size_t i = 0; i < sizeof(levelIndexArray)/sizeof(levelIndexArray[0]); i++) { level_idc = levelIndexArray[i]; newDPBsize = (uint8_t)CalculateDPBSize(sps.getPTL()->GetGeneralPTL()->profile_idc, level_idc, sps.pic_width_in_luma_samples, sps.pic_height_in_luma_samples, sps.sps_max_dec_pic_buffering[HighestTid]); if (newDPBsize >= sps.sps_max_dec_pic_buffering[HighestTid]) break; } sps.getPTL()->GetGeneralPTL()->level_idc = level_idc; } sps.sps_max_dec_pic_buffering[0] = sps.sps_max_dec_pic_buffering[HighestTid] ? sps.sps_max_dec_pic_buffering[HighestTid] : newDPBsize; const H265SeqParamSet * old_sps = m_Headers.m_SeqParams.GetCurrentHeader(); bool newResolution = false; if (IsNeedSPSInvalidate(old_sps, &sps)) { newResolution = true; } m_Headers.m_SeqParams.AddHeader(&sps); m_pNALSplitter->SetSuggestedSize(CalculateSuggestedSize(&sps)); if (newResolution) return UMC::UMC_NTF_NEW_RESOLUTION; return UMC::UMC_OK; } // Decode picture parameters set NAL unit UMC::Status TaskSupplier_H265::xDecodePPS(H265HeadersBitstream * bs) { H265PicParamSet pps; pps.Reset(); bs->GetPictureParamSetPart1(&pps); H265SeqParamSet *sps = m_Headers.m_SeqParams.GetHeader(pps.pps_seq_parameter_set_id); if (!sps) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); UMC::Status s = bs->GetPictureParamSetFull(&pps, sps); if(s != UMC::UMC_OK) return s; // additional PPS members checks: int32_t QpBdOffsetY = 6 * (sps->bit_depth_luma - 8); if (pps.init_qp < -QpBdOffsetY || pps.init_qp > 25 + 26) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.cross_component_prediction_enabled_flag && sps->ChromaArrayType != CHROMA_FORMAT_444) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.chroma_qp_offset_list_enabled_flag && sps->ChromaArrayType == CHROMA_FORMAT_400) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.diff_cu_qp_delta_depth > sps->log2_max_luma_coding_block_size - sps->log2_min_luma_coding_block_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.log2_parallel_merge_level > sps->log2_max_luma_coding_block_size) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.log2_sao_offset_scale_luma > sps->bit_depth_luma - 10) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.log2_sao_offset_scale_chroma > sps->bit_depth_chroma - 10) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); //palette sanity checks if (pps.pps_num_palette_predictor_initializer) { unsigned const PaletteMaxPredSize = sps->palette_max_size + sps->delta_palette_max_predictor_size; if (pps.pps_num_palette_predictor_initializer > PaletteMaxPredSize) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.monochrome_palette_flag != (sps->chroma_format_idc == 0)) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.luma_bit_depth_entry != sps->bit_depth_luma) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (!pps.monochrome_palette_flag && pps.chroma_bit_depth_entry != sps->bit_depth_chroma) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } uint32_t WidthInLCU = sps->WidthInCU; uint32_t HeightInLCU = sps->HeightInCU; pps.m_CtbAddrRStoTS.resize(WidthInLCU * HeightInLCU + 1); pps.m_CtbAddrTStoRS.resize(WidthInLCU * HeightInLCU + 1); pps.m_TileIdx.resize(WidthInLCU * HeightInLCU + 1); // Calculate tiles rows and columns coordinates if (pps.tiles_enabled_flag) { uint32_t columns = pps.num_tile_columns; uint32_t rows = pps.num_tile_rows; if (columns > WidthInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (rows > HeightInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); if (pps.uniform_spacing_flag) { uint32_t lastDiv, i; pps.column_width.resize(columns); pps.row_height.resize(rows); lastDiv = 0; for (i = 0; i < columns; i++) { uint32_t tmp = ((i + 1) * WidthInLCU) / columns; pps.column_width[i] = tmp - lastDiv; lastDiv = tmp; } lastDiv = 0; for (i = 0; i < rows; i++) { uint32_t tmp = ((i + 1) * HeightInLCU) / rows; pps.row_height[i] = tmp - lastDiv; lastDiv = tmp; } } else { // Initialize last column/row values, all previous values were parsed from PPS header uint32_t i; uint32_t tmp = 0; for (i = 0; i < pps.num_tile_columns - 1; i++) { uint32_t column = pps.getColumnWidth(i); if (column > WidthInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); tmp += column; } if (tmp >= WidthInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); pps.column_width[pps.num_tile_columns - 1] = WidthInLCU - tmp; tmp = 0; for (i = 0; i < pps.num_tile_rows - 1; i++) { uint32_t row = pps.getRowHeight(i); if (row > HeightInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); tmp += row; } pps.row_height[pps.num_tile_rows - 1] = HeightInLCU - tmp; if (tmp >= HeightInLCU) throw h265_exception(UMC::UMC_ERR_INVALID_STREAM); } uint32_t *colBd = h265_new_array_throw(columns); uint32_t *rowBd = h265_new_array_throw(rows); colBd[0] = 0; for (uint32_t i = 0; i < pps.num_tile_columns - 1; i++) { colBd[i + 1] = colBd[i] + pps.getColumnWidth(i); } rowBd[0] = 0; for (uint32_t i = 0; i < pps.num_tile_rows - 1; i++) { rowBd[i + 1] = rowBd[i] + pps.getRowHeight(i); } uint32_t tbX = 0, tbY = 0; // Initialize CTB index raster to tile and inverse lookup tables for (uint32_t i = 0; i < WidthInLCU * HeightInLCU; i++) { uint32_t tileX = 0, tileY = 0, CtbAddrRStoTS; for (uint32_t j = 0; j < columns; j++) { if (tbX >= colBd[j]) { tileX = j; } } for (uint32_t j = 0; j < rows; j++) { if (tbY >= rowBd[j]) { tileY = j; } } CtbAddrRStoTS = WidthInLCU * rowBd[tileY] + pps.getRowHeight(tileY) * colBd[tileX]; CtbAddrRStoTS += (tbY - rowBd[tileY]) * pps.getColumnWidth(tileX) + tbX - colBd[tileX]; pps.m_CtbAddrRStoTS[i] = CtbAddrRStoTS; pps.m_TileIdx[i] = tileY * columns + tileX; tbX++; if (tbX == WidthInLCU) { tbX = 0; tbY++; } } for (uint32_t i = 0; i < WidthInLCU * HeightInLCU; i++) { uint32_t CtbAddrRStoTS = pps.m_CtbAddrRStoTS[i]; pps.m_CtbAddrTStoRS[CtbAddrRStoTS] = i; } pps.m_CtbAddrRStoTS[WidthInLCU * HeightInLCU] = WidthInLCU * HeightInLCU; pps.m_CtbAddrTStoRS[WidthInLCU * HeightInLCU] = WidthInLCU * HeightInLCU; pps.m_TileIdx[WidthInLCU * HeightInLCU] = WidthInLCU * HeightInLCU; delete[] colBd; delete[] rowBd; } else { for (uint32_t i = 0; i < WidthInLCU * HeightInLCU + 1; i++) { pps.m_CtbAddrTStoRS[i] = i; pps.m_CtbAddrRStoTS[i] = i; } fill(pps.m_TileIdx.begin(), pps.m_TileIdx.end(), 0); } int32_t numberOfTiles = pps.tiles_enabled_flag ? pps.getNumTiles() : 0; pps.tilesInfo.resize(numberOfTiles); if (!numberOfTiles) { pps.tilesInfo.resize(1); pps.tilesInfo[0].firstCUAddr = 0; pps.tilesInfo[0].endCUAddr = WidthInLCU*HeightInLCU; } // Initialize tiles coordinates for (int32_t i = 0; i < numberOfTiles; i++) { int32_t tileY = i / pps.num_tile_columns; int32_t tileX = i % pps.num_tile_columns; int32_t startY = 0; int32_t startX = 0; for (int32_t j = 0; j < tileX; j++) { startX += pps.column_width[j]; } for (int32_t j = 0; j < tileY; j++) { startY += pps.row_height[j]; } pps.tilesInfo[i].endCUAddr = (startY + pps.row_height[tileY] - 1)* WidthInLCU + startX + pps.column_width[tileX] - 1; pps.tilesInfo[i].firstCUAddr = startY * WidthInLCU + startX; pps.tilesInfo[i].width = pps.column_width[tileX]; } m_Headers.m_PicParams.AddHeader(&pps); return s; } // Decode a bitstream header NAL unit UMC::Status TaskSupplier_H265::DecodeHeaders(UMC::MediaDataEx *nalUnit) { //ViewItem_H265 *view = GetView(BASE_VIEW); UMC::Status umcRes = UMC::UMC_OK; H265HeadersBitstream bitStream; try { MemoryPiece mem; mem.SetData(nalUnit); //NU reader needs 8 bytes as tail data, allocate another 8 bytes here to avoid out of bound read. MemoryPiece swappedMem; swappedMem.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE * 2); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&swappedMem, &mem, 0); bitStream.Reset((uint8_t*)swappedMem.GetPointer(), (uint32_t)swappedMem.GetDataSize()); bitStream.SetTailBsSize(DEFAULT_NU_TAIL_SIZE); NalUnitType nal_unit_type; uint32_t temporal_id = 0; bitStream.GetNALUnitType(nal_unit_type, temporal_id); switch(nal_unit_type) { case NAL_UT_VPS: umcRes = xDecodeVPS(&bitStream); break; case NAL_UT_SPS: umcRes = xDecodeSPS(&bitStream); break; case NAL_UT_PPS: umcRes = xDecodePPS(&bitStream); break; default: break; } } catch(const h265_exception & ex) { return ex.GetStatus(); } catch(...) { return UMC::UMC_ERR_INVALID_STREAM; } return umcRes; } // Set frame display time void TaskSupplier_H265::PostProcessDisplayFrame(H265DecoderFrame *pFrame) { if (!pFrame || pFrame->post_procces_complete) return; ViewItem_H265 &view = *GetView(); pFrame->m_isOriginalPTS = pFrame->m_dFrameTime > -1.0; if (pFrame->m_isOriginalPTS) { view.localFrameTime = pFrame->m_dFrameTime; } else { pFrame->m_dFrameTime = view.localFrameTime; } pFrame->m_frameOrder = m_frameOrder; switch (pFrame->m_DisplayPictureStruct_H265) { case DPS_TOP_BOTTOM_TOP_H265: case DPS_BOTTOM_TOP_BOTTOM_H265: if (m_initializationParams.lFlags & UMC::FLAG_VDEC_TELECINE_PTS) { view.localFrameTime += (m_local_delta_frame_time / 2); } break; default: break; } view.localFrameTime += m_local_delta_frame_time; m_frameOrder++; pFrame->post_procces_complete = true; DEBUG_PRINT((VM_STRING("Outputted %s, pppp - %d\n"), GetFrameInfoString(pFrame), pppp++)); m_maxUIDWhenWasDisplayed = std::max(m_maxUIDWhenWasDisplayed, pFrame->m_maxUIDWhenWasDisplayed); } // Find a next frame ready to be output from decoder H265DecoderFrame *TaskSupplier_H265::GetFrameToDisplayInternal(bool force) { ViewItem_H265 &view = *GetView(); if (m_decodedOrder) { return view.pDPB->findOldestDisplayable(view.dpbSize); } for (;;) { // show oldest frame uint32_t countDisplayable = 0; int32_t maxUID = 0; uint32_t countDPBFullness = 0; view.pDPB->calculateInfoForDisplay(countDisplayable, countDPBFullness, maxUID); DEBUG_PRINT1((VM_STRING("GetAnyFrameToDisplay DPB displayable %d, maximum %d, force = %d\n"), countDisplayable, view.maxDecFrameBuffering, force)); if (countDisplayable > view.sps_max_num_reorder_pics || countDPBFullness > view.sps_max_dec_pic_buffering || force) { H265DecoderFrame *pTmp = view.pDPB->findOldestDisplayable(view.dpbSize); if (pTmp) { if (!force && countDisplayable <= pTmp->GetAU()->GetSeqParam()->sps_max_num_reorder_pics[0] && countDPBFullness <= view.sps_max_dec_pic_buffering) return 0; if (!pTmp->m_pic_output) { DEBUG_PRINT((VM_STRING("Outputted skip frame %s\n"), GetFrameInfoString(pTmp))); pTmp->setWasDisplayed(); pTmp->setWasOutputted(); continue; } pTmp->m_maxUIDWhenWasDisplayed = maxUID; return pTmp; } } break; } return 0; } // Try to reset in case DPB has overflown void TaskSupplier_H265::PreventDPBFullness() { AfterErrorRestore(); } // If a frame has all slices found, add it to asynchronous decode queue UMC::Status TaskSupplier_H265::CompleteDecodedFrames(H265DecoderFrame ** decoded) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "TaskSupplier_H265::CompleteDecodedFrames"); H265DecoderFrame* completed = 0; UMC::Status sts = UMC::UMC_OK; ViewItem_H265 &view = *GetView(); for (;;) //add all ready to decoding { bool isOneToAdd = true; H265DecoderFrame * frameToAdd = 0; for (H265DecoderFrame * frame = view.pDPB->head(); frame; frame = frame->future()) { int32_t const frm_error = frame->GetError(); //we don't overwrite an error if we already got it if (sts == UMC::UMC_OK && frm_error < 0) //if we have ERROR_FRAME_DEVICE_FAILURE bit is set then this error is UMC::Status code sts = static_cast(frm_error); if (!frame->IsDecoded()) { if (!frame->IsDecodingStarted() && frame->IsFullFrame()) { if (frameToAdd) { isOneToAdd = false; if (frameToAdd->m_UID < frame->m_UID) // add first with min UID continue; } frameToAdd = frame; } if (!frame->IsDecodingCompleted()) { continue; } DEBUG_PRINT((VM_STRING("Decode %s \n"), GetFrameInfoString(frame))); frame->OnDecodingCompleted(); completed = frame;; } } if (sts != UMC::UMC_OK) break; if (frameToAdd) { if (!m_pTaskBroker->AddFrameToDecoding(frameToAdd)) break; } if (isOneToAdd) break; } if (decoded) *decoded = completed; return sts; } // Add a new bitstream data buffer to decoding UMC::Status TaskSupplier_H265::AddSource(UMC::MediaData * pSource) { H265DecoderFrame* completed = 0; UMC::Status umcRes = CompleteDecodedFrames(&completed); if (umcRes != UMC::UMC_OK) return pSource || !completed ? umcRes : UMC::UMC_OK; if (GetFrameToDisplayInternal(false)) return UMC::UMC_OK; umcRes = AddOneFrame(pSource); // construct frame if (UMC::UMC_ERR_NOT_ENOUGH_BUFFER == umcRes) { ViewItem_H265 &view = *GetView(); int32_t count = 0; for (H265DecoderFrame *pFrame = view.pDPB->head(); pFrame; pFrame = pFrame->future()) { count++; // frame is being processed. Wait for asynchronous end of operation. if (pFrame->isDisposable() || isInDisplayngStage(pFrame) || isAlmostDisposable(pFrame)) { return UMC::UMC_WRN_INFO_NOT_READY; } } if (count < view.pDPB->GetDPBSize()) return UMC::UMC_WRN_INFO_NOT_READY; // some more hard reasons of frame lacking. if (!m_pTaskBroker->IsEnoughForStartDecoding(true)) { umcRes = CompleteDecodedFrames(&completed); if (umcRes != UMC::UMC_OK) return umcRes; else if (completed) return UMC::UMC_WRN_INFO_NOT_READY; if (GetFrameToDisplayInternal(true)) return UMC::UMC_ERR_NEED_FORCE_OUTPUT; PreventDPBFullness(); return UMC::UMC_WRN_INFO_NOT_READY; } } return umcRes; } // Choose appropriate processing action for specified NAL unit UMC::Status TaskSupplier_H265::ProcessNalUnit(UMC::MediaDataEx *nalUnit) { UMC::Status umcRes = UMC::UMC_OK; UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = nalUnit->GetExData(); NalUnitType unitType = (NalUnitType)pMediaDataEx->values[pMediaDataEx->index]; switch(unitType) { case NAL_UT_CODED_SLICE_TRAIL_R: case NAL_UT_CODED_SLICE_TRAIL_N: case NAL_UT_CODED_SLICE_TLA_R: case NAL_UT_CODED_SLICE_TSA_N: case NAL_UT_CODED_SLICE_STSA_R: case NAL_UT_CODED_SLICE_STSA_N: case NAL_UT_CODED_SLICE_BLA_W_LP: case NAL_UT_CODED_SLICE_BLA_W_RADL: case NAL_UT_CODED_SLICE_BLA_N_LP: case NAL_UT_CODED_SLICE_IDR_W_RADL: case NAL_UT_CODED_SLICE_IDR_N_LP: case NAL_UT_CODED_SLICE_CRA: case NAL_UT_CODED_SLICE_RADL_R: case NAL_UT_CODED_SLICE_RASL_R: if (H265Slice * pSlice = DecodeSliceHeader(nalUnit)) umcRes = AddSlice(pSlice, false); break; case NAL_UT_VPS: case NAL_UT_SPS: case NAL_UT_PPS: umcRes = DecodeHeaders(nalUnit); { UMC::MediaData::AuxInfo* aux = (nalUnit) ? nalUnit->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; mfxExtDecodeErrorReport* pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; if (pDecodeErrorReport && umcRes == UMC::UMC_ERR_INVALID_STREAM) SetDecodeErrorTypes(unitType, pDecodeErrorReport); } break; case NAL_UT_SEI: umcRes = DecodeSEI(nalUnit); break; case NAL_UT_AU_DELIMITER: umcRes = AddSlice(0, false); break; default: break; }; return umcRes; } // Find NAL units in new bitstream buffer and process them UMC::Status TaskSupplier_H265::AddOneFrame(UMC::MediaData * pSource) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "TaskSupplier_H265::AddOneFrame"); if (m_pLastSlice) { UMC::Status sts = AddSlice(m_pLastSlice, !pSource); if (sts == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || sts == UMC::UMC_OK) return sts; } if (m_checkCRAInsideResetProcess && !pSource) return UMC::UMC_ERR_FAILED; size_t moveToSpsOffset = m_checkCRAInsideResetProcess ? pSource->GetDataSize() : 0; do { UMC::MediaDataEx *nalUnit = m_pNALSplitter->GetNalUnits(pSource); if (!nalUnit) break; UMC::MediaDataEx::_MediaDataEx* pMediaDataEx = nalUnit->GetExData(); UMC::MediaData::AuxInfo* aux = (pSource) ? pSource->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; mfxExtDecodeErrorReport* pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; for (int32_t i = 0; i < (int32_t)pMediaDataEx->count; i++, pMediaDataEx->index ++) { if (m_checkCRAInsideResetProcess) { switch ((NalUnitType)pMediaDataEx->values[i]) { case NAL_UT_CODED_SLICE_RASL_N: case NAL_UT_CODED_SLICE_RADL_N: case NAL_UT_CODED_SLICE_TRAIL_R: case NAL_UT_CODED_SLICE_TRAIL_N: case NAL_UT_CODED_SLICE_TLA_R: case NAL_UT_CODED_SLICE_TSA_N: case NAL_UT_CODED_SLICE_STSA_R: case NAL_UT_CODED_SLICE_STSA_N: case NAL_UT_CODED_SLICE_BLA_W_LP: case NAL_UT_CODED_SLICE_BLA_W_RADL: case NAL_UT_CODED_SLICE_BLA_N_LP: case NAL_UT_CODED_SLICE_IDR_W_RADL: case NAL_UT_CODED_SLICE_IDR_N_LP: case NAL_UT_CODED_SLICE_CRA: case NAL_UT_CODED_SLICE_RADL_R: case NAL_UT_CODED_SLICE_RASL_R: { H265Slice * pSlice = m_ObjHeap.AllocateObject(); pSlice->IncrementReference(); notifier0 memory_leak_preventing_slice(pSlice, &H265Slice::DecrementReference); nalUnit->SetDataSize(100); // is enough for retrive MemoryPiece memCopy; memCopy.SetData(nalUnit); pSlice->m_source.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); notifier0 memory_leak_preventing(&pSlice->m_source, &MemoryPiece::Release); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&pSlice->m_source, &memCopy, 0); int32_t pps_pid = pSlice->RetrievePicParamSetNumber(); if (pps_pid != -1) CheckCRAOrBLA(pSlice); m_checkCRAInsideResetProcess = false; pSource->MoveDataPointer(int32_t(pSource->GetDataSize() - moveToSpsOffset)); m_pNALSplitter->Reset(); return UMC::UMC_NTF_NEW_RESOLUTION; } break; case NAL_UT_VPS: case NAL_UT_SPS: case NAL_UT_PPS: { UMC::Status sts = DecodeHeaders(nalUnit); if (pDecodeErrorReport && sts == UMC::UMC_ERR_INVALID_STREAM) SetDecodeErrorTypes((NalUnitType)pMediaDataEx->values[i], pDecodeErrorReport); } break; default: break; }; continue; } NalUnitType nut = static_cast(pMediaDataEx->values[i]); switch (nut) { case NAL_UT_CODED_SLICE_RASL_N: case NAL_UT_CODED_SLICE_RADL_N: case NAL_UT_CODED_SLICE_TRAIL_R: case NAL_UT_CODED_SLICE_TRAIL_N: case NAL_UT_CODED_SLICE_TLA_R: case NAL_UT_CODED_SLICE_TSA_N: case NAL_UT_CODED_SLICE_STSA_R: case NAL_UT_CODED_SLICE_STSA_N: case NAL_UT_CODED_SLICE_BLA_W_LP: case NAL_UT_CODED_SLICE_BLA_W_RADL: case NAL_UT_CODED_SLICE_BLA_N_LP: case NAL_UT_CODED_SLICE_IDR_W_RADL: case NAL_UT_CODED_SLICE_IDR_N_LP: case NAL_UT_CODED_SLICE_CRA: case NAL_UT_CODED_SLICE_RADL_R: case NAL_UT_CODED_SLICE_RASL_R: if(H265Slice *pSlice = DecodeSliceHeader(nalUnit)) { UMC::Status sts = AddSlice(pSlice, !pSource); if (sts == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || sts == UMC::UMC_OK) return sts; } break; case NAL_UT_SEI: case NAL_UT_SEI_SUFFIX: DecodeSEI(nalUnit); break; case NAL_UT_VPS: case NAL_UT_SPS: case NAL_UT_PPS: { UMC::Status umsRes = DecodeHeaders(nalUnit); if (umsRes != UMC::UMC_OK) { if (umsRes == UMC::UMC_NTF_NEW_RESOLUTION || (nut == NAL_UT_SPS && umsRes == UMC::UMC_ERR_INVALID_STREAM)) { int32_t nalIndex = pMediaDataEx->index; int32_t size = pMediaDataEx->offsets[nalIndex + 1] - pMediaDataEx->offsets[nalIndex]; m_checkCRAInsideResetProcess = true; if (AddSlice(0, !pSource) == UMC::UMC_OK) { pSource->MoveDataPointer(- size - 3); return UMC::UMC_OK; } moveToSpsOffset = pSource->GetDataSize() + size + 3; continue; } if (pDecodeErrorReport && umsRes == UMC::UMC_ERR_INVALID_STREAM) SetDecodeErrorTypes(nut, pDecodeErrorReport); return umsRes; } } break; case NAL_UT_AU_DELIMITER: if (AddSlice(0, !pSource) == UMC::UMC_OK) return UMC::UMC_OK; break; case NAL_UT_EOS: case NAL_UT_EOB: m_WaitForIDR = true; AddSlice(0, !pSource); m_RA_POC = 0; m_IRAPType = NAL_UT_INVALID; GetView()->pDPB->IncreaseRefPicListResetCount(0); // for flushing DPB NoRaslOutputFlag = 0; m_bFirstSliceInSequence = true; return UMC::UMC_OK; break; default: break; }; } } while ((pSource) && (MINIMAL_DATA_SIZE_H265 < pSource->GetDataSize())); if (pSource && m_checkCRAInsideResetProcess) { pSource->MoveDataPointer(int32_t(pSource->GetDataSize() - moveToSpsOffset)); m_pNALSplitter->Reset(); } if (!pSource) { return AddSlice(0, true); } else { uint32_t flags = pSource->GetFlags(); if (!(flags & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME)) { assert(!m_pLastSlice); return AddSlice(0, true); } } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // Decode slice header start, set slice links to SPS and PPS and correct tile offsets table if needed H265Slice *TaskSupplier_H265::DecodeSliceHeader(UMC::MediaDataEx *nalUnit) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "TaskSupplier_H265::DecodeSliceHeader"); if ((0 > m_Headers.m_SeqParams.GetCurrentID()) || (0 > m_Headers.m_PicParams.GetCurrentID())) { return 0; } H265Slice * pSlice = m_ObjHeap.AllocateObject(); pSlice->IncrementReference(); notifier0 memory_leak_preventing_slice(pSlice, &H265Slice::DecrementReference); MemoryPiece memCopy; memCopy.SetData(nalUnit); pSlice->m_source.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); notifier0 memory_leak_preventing(&pSlice->m_source, &MemoryPiece::Release); std::vector removed_offsets(0); SwapperBase * swapper = m_pNALSplitter->GetSwapper(); swapper->SwapMemory(&pSlice->m_source, &memCopy, &removed_offsets); int32_t pps_pid = pSlice->RetrievePicParamSetNumber(); if (pps_pid == -1) { return 0; } pSlice->SetPicParam(m_Headers.m_PicParams.GetHeader(pps_pid)); H265PicParamSet const* pps = pSlice->GetPicParam(); if (!pps) { return 0; } int32_t seq_parameter_set_id = pps->pps_seq_parameter_set_id; pSlice->SetSeqParam(m_Headers.m_SeqParams.GetHeader(seq_parameter_set_id)); if (!pSlice->GetSeqParam()) { return 0; } // do not need vps //H265VideoParamSet * vps = m_Headers.m_VideoParams.GetHeader(pSlice->GetSeqParam()->sps_video_parameter_set_id); m_Headers.m_SeqParams.SetCurrentID(pps->pps_seq_parameter_set_id); m_Headers.m_PicParams.SetCurrentID(pps->pps_pic_parameter_set_id); // calculate max entrypoints number H265SeqParamSet const* sps = pSlice->GetSeqParam(); if (pps->entropy_coding_sync_enabled_flag) { int NumOfMaxEntryPoints = 0; int PicHeightInCtbsY = sps->HeightInCU; if (pps->tiles_enabled_flag == 0) NumOfMaxEntryPoints = PicHeightInCtbsY; else NumOfMaxEntryPoints = PicHeightInCtbsY * (pps->num_tile_columns); //reallocate memory for slice header if (NumOfMaxEntryPoints > DEFAULT_MAX_ENETRY_POINT_NUM) { //offset_len_minus1[0-31], assume maximum 31[4 bytes] int newsize = 2048 + NumOfMaxEntryPoints * 4 + DEFAULT_NU_TAIL_SIZE; pSlice->m_source.Allocate(newsize); nalUnit->SetDataSize(newsize); //swap buffer again, since buffer is small at first time removed_offsets.clear(); memCopy.SetData(nalUnit); swapper->SwapMemory(&pSlice->m_source, &memCopy, &removed_offsets); } } pSlice->m_pCurrentFrame = NULL; memory_leak_preventing.ClearNotification(); bool ready = pSlice->Reset(&m_pocDecoding); if (!ready) { m_prevSliceBroken = pSlice->IsError(); return 0; } H265SliceHeader * sliceHdr = pSlice->GetSliceHeader(); assert(sliceHdr); if (m_prevSliceBroken && sliceHdr->dependent_slice_segment_flag) { //Prev. slice contains errors. There is no relayable way to infer parameters for dependent slice return 0; } m_prevSliceBroken = false; if (m_WaitForIDR) { if (pps->pps_curr_pic_ref_enabled_flag) { ReferencePictureSet const* rps = pSlice->getRPS(); assert(rps); uint32_t const numPicTotalCurr = rps->getNumberOfUsedPictures(); if (numPicTotalCurr) return 0; } else if (sliceHdr->slice_type != I_SLICE) { return 0; } } ActivateHeaders(const_cast(pSlice->GetSeqParam()), const_cast(pps)); uint32_t currOffset = sliceHdr->m_HeaderBitstreamOffset; uint32_t currOffsetWithEmul = currOffset; uint32_t headersEmuls = 0; for (; headersEmuls < removed_offsets.size(); headersEmuls++) { if (removed_offsets[headersEmuls] < currOffsetWithEmul) currOffsetWithEmul++; else break; } pSlice->m_NumEmuPrevnBytesInSliceHdr = headersEmuls; // Update entry points size_t offsets = removed_offsets.size(); if ((pSlice->GetPicParam()->tiles_enabled_flag || pSlice->GetPicParam()->entropy_coding_sync_enabled_flag) && pSlice->getTileLocationCount() > 0 && offsets > 0) { uint32_t removed_bytes = 0; std::vector::iterator it = removed_offsets.begin(); uint32_t emul_offset = *it; for (uint32_t tile = 0; tile < pSlice->getTileLocationCount(); tile++) { while ((pSlice->m_tileByteLocation[tile] + currOffsetWithEmul >= emul_offset) && removed_bytes < offsets) { removed_bytes++; if (removed_bytes < offsets) { it++; emul_offset = *it; } else break; } // 1st tile start offset is length of slice header, it should not be corrected because it is // not specified in slice header, it is calculated by parsing a modified bitstream instead if (0 == tile) { offsets -= removed_bytes; removed_bytes = 0; } } } for (uint32_t tile = 0; tile < pSlice->getTileLocationCount(); tile++) { pSlice->m_tileByteLocation[tile] = pSlice->m_tileByteLocation[tile] + currOffset; } m_WaitForIDR = false; memory_leak_preventing_slice.ClearNotification(); //for SliceIdx m_SliceIdx m_iNumber pSlice->m_iNumber = m_SliceIdxInTaskSupplier; m_SliceIdxInTaskSupplier++; return pSlice; } // Initialize scaling list data if needed void TaskSupplier_H265::ActivateHeaders(H265SeqParamSet *sps, H265PicParamSet *pps) { for (uint32_t i = 0; i < sps->MaxCUDepth - sps->AddCUDepth; i++) { sps->m_AMPAcc[i] = sps->amp_enabled_flag; } for (uint32_t i = sps->MaxCUDepth - sps->AddCUDepth; i < sps->MaxCUDepth; i++) { sps->m_AMPAcc[i] = 0; } if (sps->scaling_list_enabled_flag) { if (pps->pps_scaling_list_data_present_flag) { if (!pps->getScalingList()->is_initialized()) { pps->getScalingList()->init(); pps->getScalingList()->calculateDequantCoef(); } } else if (sps->sps_scaling_list_data_present_flag) { if (!sps->getScalingList()->is_initialized()) { sps->getScalingList()->init(); sps->getScalingList()->calculateDequantCoef(); } } else { if (!pps->getScalingList()->is_initialized()) { pps->getScalingList()->initFromDefaultScalingList(); } } } } // Calculate NoRaslOutputFlag flag for specified slice void TaskSupplier_H265::CheckCRAOrBLA(const H265Slice *pSlice) { uint8_t no_output_of_prior_pics_flag = pSlice->GetSliceHeader()->no_output_of_prior_pics_flag; if (pSlice->GetRapPicFlag()) { if ((pSlice->GetSliceHeader()->nal_unit_type >= NAL_UT_CODED_SLICE_BLA_W_LP && pSlice->GetSliceHeader()->nal_unit_type <= NAL_UT_CODED_SLICE_IDR_N_LP) || (pSlice->GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_CRA && m_bFirstSliceInSequence)) { NoRaslOutputFlag = true; } if (pSlice->m_SliceHeader.nal_unit_type == NAL_UT_CODED_SLICE_CRA && m_IRAPType != NAL_UT_INVALID) { NoRaslOutputFlag = 0; } if (NoRaslOutputFlag) { m_RA_POC = pSlice->m_SliceHeader.m_poc; } //the inference for NoOutputPriorPicsFlag if (!m_bFirstSliceInBitstream && NoRaslOutputFlag) { if (pSlice->GetSliceHeader()->nal_unit_type == NAL_UT_CODED_SLICE_CRA) { no_output_of_prior_pics_flag = true; } } else { no_output_of_prior_pics_flag = false; } m_IRAPType = pSlice->m_SliceHeader.nal_unit_type; } m_bFirstSliceInSequence = false; m_bFirstSliceInBitstream = false; //Check NoOutputPriorPics if (pSlice->GetRapPicFlag() && no_output_of_prior_pics_flag) { for (H265DecoderFrame *pCurr = GetView()->pDPB->head(); pCurr; pCurr = pCurr->future()) { if (pSlice->m_SliceHeader.nal_unit_type == NAL_UT_CODED_SLICE_IDR_W_RADL || pSlice->m_SliceHeader.nal_unit_type == NAL_UT_CODED_SLICE_IDR_N_LP) { if(!pCurr->wasOutputted()) { pCurr->m_pic_output = false; pCurr->SetisDisplayable(false); } } else { if (!pCurr->GetAU()->m_frameBeforeIDR && !pCurr->wasOutputted()) { pCurr->m_pic_output = false; pCurr->SetisDisplayable(false); } } } } } // Check whether this slice should be skipped because of random access conditions. HEVC spec 3.111 bool TaskSupplier_H265::IsSkipForCRAorBLA(const H265Slice *pSlice) { if (NoRaslOutputFlag) { if (pSlice->m_SliceHeader.m_poc == m_RA_POC) return false; if (pSlice->m_SliceHeader.m_poc < m_RA_POC && (pSlice->m_SliceHeader.nal_unit_type == NAL_UT_CODED_SLICE_RASL_R || pSlice->m_SliceHeader.nal_unit_type == NAL_UT_CODED_SLICE_RASL_N)) { return true; } if (pSlice->m_SliceHeader.nal_unit_type != NAL_UT_CODED_SLICE_RADL_R && pSlice->m_SliceHeader.nal_unit_type != NAL_UT_CODED_SLICE_RADL_N) NoRaslOutputFlag = 0; } return false; } // Add a new slice to frame UMC::Status TaskSupplier_H265::AddSlice(H265Slice * pSlice, bool ) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "TaskSupplier_H265::AddSlice"); m_pLastSlice = 0; if (!pSlice) // complete frame { UMC::Status umcRes = UMC::UMC_ERR_NOT_ENOUGH_DATA; if (NULL == GetView()->pCurFrame) { return umcRes; } CompleteFrame(GetView()->pCurFrame); OnFullFrame(GetView()->pCurFrame); GetView()->pCurFrame = NULL; umcRes = UMC::UMC_OK; return umcRes; } ViewItem_H265 &view = *GetView(); H265DecoderFrame * pFrame = view.pCurFrame; if (pFrame) { H265Slice *firstSlice = pFrame->GetAU()->GetSlice(0); assert(firstSlice); if (pSlice->GetSliceHeader()->dependent_slice_segment_flag) { H265Slice *pLastFrameSlice = pFrame->GetAU()->GetSlice(pFrame->GetAU()->GetSliceCount() - 1); pSlice->CopyFromBaseSlice(pLastFrameSlice); } // Accord. to ITU-T H.265 7.4.2.4 Any SPS/PPS w/ id equal to active one // shall have the same content, unless it follows the last VCL NAL of the coded picture // and precedes the first VCL NAL unit of another coded picture // if the slices belong to different AUs or SPS/PPS was changed, // close the current AU and start new one. const H265SeqParamSet * sps = m_Headers.m_SeqParams.GetHeader(pSlice->GetSeqParam()->GetID()); const H265PicParamSet * pps = m_Headers.m_PicParams.GetHeader(pSlice->GetPicParam()->GetID()); if (!sps || !pps) // undefined behavior return UMC::UMC_ERR_FAILED; bool changed = sps->m_changed || pps->m_changed || !IsPictureTheSame(firstSlice, pSlice); if (changed) { CompleteFrame(view.pCurFrame); OnFullFrame(view.pCurFrame); view.pCurFrame = NULL; m_pLastSlice = pSlice; return UMC::UMC_OK; } } // there is no free frames. // try to allocate a new frame. else { H265SeqParamSet * sps = m_Headers.m_SeqParams.GetHeader(pSlice->GetSeqParam()->GetID()); H265PicParamSet * pps = m_Headers.m_PicParams.GetHeader(pSlice->GetPicParam()->GetID()); if (!sps || !pps) // undefined behavior return UMC::UMC_ERR_FAILED; // clear change flags when get first VCL NAL sps->m_changed = false; pps->m_changed = false; // allocate a new frame, initialize it with slice's parameters. pFrame = AllocateNewFrame(pSlice); if (!pFrame) { view.pCurFrame = NULL; m_pLastSlice = pSlice; return UMC::UMC_ERR_NOT_ENOUGH_BUFFER; } // set the current being processed frame view.pCurFrame = pFrame; } // add the next slice to the initialized frame. pSlice->m_pCurrentFrame = pFrame; AddSliceToFrame(pFrame, pSlice); if (pSlice->m_SliceHeader.slice_type != I_SLICE) { uint32_t NumShortTermRefs = 0, NumLongTermRefs = 0; view.pDPB->countActiveRefs(NumShortTermRefs, NumLongTermRefs); } H265PicParamSet const* pps = pSlice->GetPicParam(); assert(pps); H265DecoderFrame* curr_ref = pps->pps_curr_pic_ref_enabled_flag ? AddSelfReferenceFrame(pSlice) : nullptr; // Set reference list pSlice->UpdateReferenceList(GetView()->pDPB.get(), curr_ref); return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // Not implemented H265DecoderFrame* TaskSupplier_H265::AddSelfReferenceFrame(H265Slice* slice) { assert(slice); return slice->GetCurrentFrame(); } // Mark frame as full with slices void TaskSupplier_H265::OnFullFrame(H265DecoderFrame * pFrame) { pFrame->SetFullFrame(true); if (!pFrame->GetAU()->GetSlice(0)) // seems that it was skipped and slices was dropped return; pFrame->SetisDisplayable(pFrame->GetAU()->GetSlice(0)->GetSliceHeader()->pic_output_flag != 0); if (pFrame->GetAU()->GetSlice(0)->GetSliceHeader()->IdrPicFlag && !(pFrame->GetError() & UMC::ERROR_FRAME_DPB)) { DecReferencePictureMarking_H265::ResetError(); } if (DecReferencePictureMarking_H265::GetDPBError()) { pFrame->SetErrorFlagged(UMC::ERROR_FRAME_DPB); } } // Check whether all slices for the frame were found void TaskSupplier_H265::CompleteFrame(H265DecoderFrame * pFrame) { if (!pFrame) return; H265DecoderFrameInfo * slicesInfo = pFrame->GetAU(); if (slicesInfo->GetStatus() > H265DecoderFrameInfo::STATUS_NOT_FILLED) return; DEBUG_PRINT((VM_STRING("Complete frame POC - (%d) type - %d, count - %d, m_uid - %d, IDR - %d\n"), pFrame->m_PicOrderCnt, pFrame->m_FrameType, slicesInfo->GetSliceCount(), pFrame->m_UID, slicesInfo->GetAnySlice()->GetSliceHeader()->IdrPicFlag)); slicesInfo->EliminateASO(); slicesInfo->EliminateErrors(); // skipping algorithm const H265Slice *slice = slicesInfo->GetSlice(0); if (!slice || IsShouldSkipFrame(pFrame) || IsSkipForCRAorBLA(slice)) { slicesInfo->SetStatus(H265DecoderFrameInfo::STATUS_COMPLETED); pFrame->SetisShortTermRef(false); pFrame->SetisLongTermRef(false); pFrame->OnDecodingCompleted(); pFrame->SetisDisplayable(false); pFrame->m_pic_output = false; DEBUG_PRINT((VM_STRING("Skip frame ForCRAorBLA - %s\n"), GetFrameInfoString(pFrame))); return; } slicesInfo->SetStatus(H265DecoderFrameInfo::STATUS_FILLED); } // Initialize just allocated frame with slice parameters UMC::Status TaskSupplier_H265::InitFreeFrame(H265DecoderFrame * pFrame, const H265Slice *pSlice) { UMC::Status umcRes = UMC::UMC_OK; const H265SeqParamSet *pSeqParam = pSlice->GetSeqParam(); // int32_t iMBCount = pSeqParam->frame_width_in_mbs * pSeqParam->frame_height_in_mbs; //int32_t iCUCount = pSeqParam->WidthInCU * pSeqParam->HeightInCU; //pFrame->m_CodingData->m_NumCUsInFrame = iCUCount; pFrame->m_FrameType = SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type); pFrame->m_dFrameTime = pSlice->m_source.GetTime(); pFrame->m_crop_left = pSeqParam->conf_win_left_offset + pSeqParam->def_disp_win_left_offset; pFrame->m_crop_right = pSeqParam->conf_win_right_offset + pSeqParam->def_disp_win_right_offset; pFrame->m_crop_top = pSeqParam->conf_win_top_offset + pSeqParam->def_disp_win_top_offset; pFrame->m_crop_bottom = pSeqParam->conf_win_bottom_offset + pSeqParam->def_disp_win_bottom_offset; pFrame->m_crop_flag = pSeqParam->conformance_window_flag; pFrame->m_aspect_width = pSeqParam->sar_width; pFrame->m_aspect_height = pSeqParam->sar_height; int32_t chroma_format_idc = pSeqParam->chroma_format_idc; uint8_t bit_depth_luma, bit_depth_chroma; bit_depth_luma = (uint8_t) pSeqParam->bit_depth_luma; bit_depth_chroma = (uint8_t) pSeqParam->bit_depth_chroma; int32_t bit_depth = std::max(bit_depth_luma, bit_depth_chroma); // int32_t iMBWidth = pSeqParam->frame_width_in_mbs; //int32_t iCUWidth = pSeqParam->WidthInCU; // int32_t iMBHeight = pSeqParam->frame_height_in_mbs; //int32_t iCUHeight = pSeqParam->HeightInCU; // mfxSize dimensions = {iMBWidth * 16, iMBHeight * 16}; //mfxSize dimensions = {iCUWidth * pSeqParam->MaxCUWidth, iCUHeight * pSeqParam->MaxCUHeight}; mfxSize dimensions = {static_cast(pSeqParam->pic_width_in_luma_samples), static_cast(pSeqParam->pic_height_in_luma_samples)}; UMC::ColorFormat cf = GetUMCColorFormat_H265(chroma_format_idc); if (cf == UMC::YUV420) // msdk !!! cf = UMC::NV12; UMC::VideoDataInfo info; info.Init(dimensions.width, dimensions.height, cf, bit_depth); pFrame->Init(&info); return umcRes; } // Allocate frame internals UMC::Status TaskSupplier_H265::AllocateFrameData(H265DecoderFrame * pFrame, mfxSize dimensions, const H265SeqParamSet* pSeqParamSet, const H265PicParamSet *pPicParamSet) { UMC::ColorFormat color_format = pFrame->GetColorFormat(); //(ColorFormat) pSeqParamSet->chroma_format_idc; UMC::VideoDataInfo info; int32_t bit_depth = pSeqParamSet->need16bitOutput ? 10 : 8; info.Init(dimensions.width, dimensions.height, color_format, bit_depth); UMC::FrameMemID frmMID; UMC::Status sts = m_pFrameAllocator->Alloc(&frmMID, &info, 0); if (sts != UMC::UMC_OK) { throw h265_exception(UMC::UMC_ERR_ALLOC); } const UMC::FrameData *frmData = m_pFrameAllocator->Lock(frmMID); if (!frmData) throw h265_exception(UMC::UMC_ERR_LOCK); pFrame->allocate(frmData, &info); pFrame->m_index = frmMID; (void)pPicParamSet; return UMC::UMC_OK; } // Try to find a reusable frame or allocate a new one and initialize it with slice parameters H265DecoderFrame * TaskSupplier_H265::AllocateNewFrame(const H265Slice *pSlice) { H265DecoderFrame *pFrame = NULL; if (!pSlice) { return NULL; } ViewItem_H265 &view = *GetView(); view.SetDPBSize(const_cast(pSlice->GetSeqParam()), m_level_idc); view.sps_max_dec_pic_buffering = pSlice->GetSeqParam()->sps_max_dec_pic_buffering[pSlice->GetSliceHeader()->nuh_temporal_id] ? pSlice->GetSeqParam()->sps_max_dec_pic_buffering[pSlice->GetSliceHeader()->nuh_temporal_id] : view.dpbSize; view.sps_max_num_reorder_pics = std::min(pSlice->GetSeqParam()->sps_max_num_reorder_pics[HighestTid], view.sps_max_dec_pic_buffering); DPBUpdate(pSlice); pFrame = GetFreeFrame(); if (NULL == pFrame) { return NULL; } CheckCRAOrBLA(pSlice); pFrame->m_pic_output = pSlice->GetSliceHeader()->pic_output_flag != 0; pFrame->SetisShortTermRef(true); UMC::Status umcRes = InitFreeFrame(pFrame, pSlice); if (umcRes != UMC::UMC_OK) { return 0; } umcRes = AllocateFrameData(pFrame, pFrame->lumaSize(), pSlice->GetSeqParam(), pSlice->GetPicParam()); if (umcRes != UMC::UMC_OK) { return 0; } if (m_UserData.user_data.size()) { pFrame->m_UserData = m_UserData; m_UserData.user_data.clear(); } if (m_sei_messages) { m_sei_messages->SetFrame(pFrame); } H265SEIPayLoad * pic_timing_payload = m_Headers.m_SEIParams.GetHeader(SEI_PIC_TIMING_TYPE); if (pic_timing_payload && pSlice->GetSeqParam()->frame_field_info_present_flag) { pFrame->m_DisplayPictureStruct_H265 = pic_timing_payload->SEI_messages.pic_timing.pic_struct; } else { pFrame->m_DisplayPictureStruct_H265 = DPS_FRAME_H265; } H265SEIPayLoad * mastering_display_payload = m_Headers.m_SEIParams.GetHeader(SEI_MASTERING_DISPLAY_COLOUR_VOLUME); H265SEIPayLoad * content_light_payload = m_Headers.m_SEIParams.GetHeader(SEI_CONTENT_LIGHT_LEVEL_INFO); if (mastering_display_payload) { pFrame->m_mastering_display = *mastering_display_payload; } if (content_light_payload) { pFrame->m_content_light_level_info = *content_light_payload; } InitFrameCounter(pFrame, pSlice); return pFrame; } // H265DecoderFrame * TaskSupplier_H265::AllocateNewFrame(const H265Slice *pSlice) // Initialize frame's counter and corresponding parameters void TaskSupplier_H265::InitFrameCounter(H265DecoderFrame * pFrame, const H265Slice *pSlice) { const H265SliceHeader *sliceHeader = pSlice->GetSliceHeader(); ViewItem_H265 &view = *GetView(); if (sliceHeader->IdrPicFlag || sliceHeader->nal_unit_type == NAL_UT_CODED_SLICE_BLA_N_LP || sliceHeader->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_RADL || sliceHeader->nal_unit_type == NAL_UT_CODED_SLICE_BLA_W_LP) { view.pDPB->IncreaseRefPicListResetCount(pFrame); } pFrame->setPicOrderCnt(sliceHeader->m_poc); DEBUG_PRINT((VM_STRING("Init frame %s\n"), GetFrameInfoString(pFrame))); pFrame->InitRefPicListResetCount(); } // void TaskSupplier_H265::InitFrameCounter(H265DecoderFrame * pFrame, const H265Slice *pSlice) // Include a new slice into a set of frame slices void TaskSupplier_H265::AddSliceToFrame(H265DecoderFrame *pFrame, H265Slice *pSlice) { if (pFrame->m_FrameType < SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type)) pFrame->m_FrameType = SliceTypeToFrameType(pSlice->GetSliceHeader()->slice_type); pFrame->AddSlice(pSlice);; } // Update DPB contents marking frames for reuse void TaskSupplier_H265::DPBUpdate(const H265Slice * slice) { ViewItem_H265 &view = *GetView(); DecReferencePictureMarking_H265::UpdateRefPicMarking(view, slice); DecReferencePictureMarking_H265::ResetUnusedFrames(view); } // Find a decoder frame instance with specified surface ID H265DecoderFrame * TaskSupplier_H265::FindSurface(UMC::FrameMemID id) { UMC::AutomaticUMCMutex guard(m_mGuard); H265DecoderFrame *pFrame = GetView()->pDPB->head(); for (; pFrame; pFrame = pFrame->future()) { if (pFrame->GetFrameData()->GetFrameMID() == id) return pFrame; } return 0; } // Start asynchronous decoding UMC::Status TaskSupplier_H265::RunDecoding() { UMC::Status umcRes = CompleteDecodedFrames(0); if (umcRes != UMC::UMC_OK) return umcRes; H265DecoderFrame *pFrame = GetView()->pDPB->head(); for (; pFrame; pFrame = pFrame->future()) { if (!pFrame->IsDecodingCompleted()) { break; } } m_pTaskBroker->Start(); if (!pFrame) return UMC::UMC_OK; //DEBUG_PRINT((VM_STRING("Decode POC - %d\n"), pFrame->m_PicOrderCnt[0])); return UMC::UMC_OK; } // Retrieve decoded SEI data with SEI_USER_DATA_REGISTERED_TYPE type UMC::Status TaskSupplier_H265::GetUserData(UMC::MediaData * pUD) { if(!pUD) return UMC::UMC_ERR_NULL_PTR; if (!m_pLastDisplayed) return UMC::UMC_ERR_NOT_ENOUGH_DATA; if (m_pLastDisplayed->m_UserData.user_data.size() && m_pLastDisplayed->m_UserData.payLoadSize && m_pLastDisplayed->m_UserData.payLoadType == SEI_USER_DATA_REGISTERED_TYPE) { pUD->SetTime(m_pLastDisplayed->m_dFrameTime); pUD->SetBufferPointer(&m_pLastDisplayed->m_UserData.user_data[0], m_pLastDisplayed->m_UserData.payLoadSize); pUD->SetDataSize(m_pLastDisplayed->m_UserData.payLoadSize); //m_pLastDisplayed->m_UserData.Reset(); return UMC::UMC_OK; } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } bool TaskSupplier_H265::IsShouldSuspendDisplay() { UMC::AutomaticUMCMutex guard(m_mGuard); if (m_iThreadNum <= 1) return true; ViewItem_H265 &view = *GetView(); if (view.pDPB->GetDisposable() || view.pDPB->countAllFrames() < view.dpbSize + m_DPBSizeEx) return false; return true; } // Find an index of specified level uint32_t GetLevelIDCIndex(uint32_t level_idc) { for (uint32_t i = 0; i < sizeof(levelIndexArray)/sizeof(levelIndexArray[0]); i++) { if (levelIndexArray[i] == level_idc) return i; } return sizeof(levelIndexArray)/sizeof(levelIndexArray[0]) - 1; } // Calculate maximum DPB size based on level and resolution int32_t CalculateDPBSize(uint32_t profile_idc, uint32_t &level_idc, int32_t width, int32_t height, uint32_t num_ref_frames) { // can increase level_idc to hold num_ref_frames uint32_t lumaPsArray[] = { 36864, 122880, 245760, 552960, 983040, 2228224, 2228224, 8912896, 8912896, 8912896, 35651584, 35651584, 35651584 }; uint32_t MaxDpbSize = 16; for (;;) { uint32_t index = GetLevelIDCIndex(level_idc); uint32_t MaxLumaPs = lumaPsArray[index]; uint32_t const maxDpbPicBuf = 6;//HW handles second version of current reference (twoVersionsOfCurrDecPicFlag) itself (void)profile_idc; uint32_t PicSizeInSamplesY = width * height; if (PicSizeInSamplesY <= (MaxLumaPs >> 2 )) MaxDpbSize = std::min(4 * maxDpbPicBuf, 16u); else if (PicSizeInSamplesY <= (MaxLumaPs >> 1 )) MaxDpbSize = std::min(2 * maxDpbPicBuf, 16u); else if (PicSizeInSamplesY <= ((3 * MaxLumaPs) >> 2 )) MaxDpbSize = std::min((4 * maxDpbPicBuf) / 3, 16u); else MaxDpbSize = maxDpbPicBuf; if (num_ref_frames <= MaxDpbSize) break; if (index >= sizeof(levelIndexArray)/sizeof(levelIndexArray[0]) - 1) break; level_idc = levelIndexArray[index + 1]; } return MaxDpbSize; } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_va_packer.cpp000066400000000000000000000055061443134507600322070ustar00rootroot00000000000000// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_va_packer.h" #include "umc_va_base.h" #include "umc_h265_tables.h" #include "umc_h265_frame_info.h" #ifdef UMC_VA #include "umc_h265_task_supplier.h" #endif #include "umc_h265_va_packer_vaapi.h" #include "mfx_ext_buffers.h" using namespace UMC; namespace UMC_HEVC_DECODER { int const s_quantTSDefault4x4[16] = { 16,16,16,16, 16,16,16,16, 16,16,16,16, 16,16,16,16 }; int const s_quantIntraDefault8x8[64] = { 16,16,16,16,17,18,21,24, // 10 10 10 10 11 12 15 18 16,16,16,16,17,19,22,25, 16,16,17,18,20,22,25,29, 16,16,18,21,24,27,31,36, 17,17,20,24,30,35,41,47, 18,19,22,27,35,44,54,65, 21,22,25,31,41,54,70,88, 24,25,29,36,47,65,88,115 }; int const s_quantInterDefault8x8[64] = { 16,16,16,16,17,18,20,24, 16,16,16,17,18,20,24,25, 16,16,17,18,20,24,25,28, 16,17,18,20,24,25,28,33, 17,18,20,24,25,28,33,41, 18,20,24,25,28,33,41,54, 20,24,25,28,33,41,54,71, 24,25,28,33,41,54,71,91 }; //the tables used to restore original scan order of scaling lists (req. by drivers since ci-main-49045) uint16_t const* SL_tab_up_right[] = { ScanTableDiag4x4, g_sigLastScanCG32x32, g_sigLastScanCG32x32, g_sigLastScanCG32x32 }; extern Packer * CreatePackerVAAPI(VideoAccelerator*); Packer * Packer::CreatePacker(VideoAccelerator * va) { (void)va; Packer * packer = 0; packer = CreatePackerVAAPI(va); return packer; } Packer::Packer(VideoAccelerator * va) : m_va(va) { } Packer::~Packer() { } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE umc_h265_va_packer_intel.cpp000066400000000000000000000024371443134507600333230ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef UMC_RESTRICTED_CODE_VA #include "umc_va_base.h" #endif // UMC_RESTRICTED_CODE_VA #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_va_packer_ms.cpp000066400000000000000000000024361443134507600327050ustar00rootroot00000000000000// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef UMC_RESTRICTED_CODE_VA #include "umc_va_base.h" #endif // UMC_RESTRICTED_CODE_VA #endif // MFX_ENABLE_H265_VIDEO_DECODEumc_h265_va_packer_vaapi.cpp000066400000000000000000000173571443134507600333170ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src// Copyright (c) 2019-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #ifndef UMC_RESTRICTED_CODE_VA #include "umc_va_base.h" #include "umc_va_linux.h" #include "umc_h265_va_packer_vaapi.h" #include "umc_h265_task_supplier.h" #include "umc_va_video_processing.h" #include #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) #include "mfx_ext_buffers.h" #include "vaapi_ext_interface.h" #endif #include "mfx_unified_h265d_logging.h" namespace UMC_HEVC_DECODER { void PackerVAAPI::BeginFrame(H265DecoderFrame* frame) { #if !defined (MFX_EXTBUFF_GPU_HANG_ENABLE) (void)frame; #else auto fd = frame->GetFrameData(); assert(fd); auto aux = fd->GetAuxInfo(MFX_EXTBUFF_GPU_HANG); if (aux) { assert(aux->type == MFX_EXTBUFF_GPU_HANG); auto ht = reinterpret_cast(aux->ptr); assert(ht && "Buffer pointer should be valid here"); if (!ht) throw h265_exception(UMC::UMC_ERR_FAILED); //clear trigger to ensure GPU hang fired only once for this frame fd->ClearAuxInfo(aux->type); UMC::UMCVACompBuffer* buffer = nullptr; m_va->GetCompBuffer(VATriggerCodecHangBufferType, &buffer, sizeof(unsigned int)); if (buffer) { auto trigger = reinterpret_cast(buffer->GetPtr()); if (!trigger) throw h265_exception(UMC::UMC_ERR_FAILED); *trigger = 1; } } #endif } void PackerVAAPI::PackQmatrix(H265Slice const* slice) { VAIQMatrixBufferHEVC* qmatrix = nullptr; GetParamsBuffer(m_va, &qmatrix); auto pps = slice->GetPicParam(); assert(pps); auto sps = slice->GetSeqParam(); assert(sps); H265ScalingList const* scalingList = nullptr; if (pps->pps_scaling_list_data_present_flag) { scalingList = slice->GetPicParam()->getScalingList(); } else if (sps->sps_scaling_list_data_present_flag) { scalingList = slice->GetSeqParam()->getScalingList(); } else { // build default scaling list in target buffer location static bool doInit = true; static H265ScalingList sl{}; if (doInit) { for(uint32_t sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++) { for(uint32_t listId = 0; listId < g_scalingListNum[sizeId]; listId++) { const int *src = getDefaultScalingList(sizeId, listId); int *dst = sl.getScalingListAddress(sizeId, listId); int count = std::min(MAX_MATRIX_COEF_NUM, (int32_t)g_scalingListSize[sizeId]); ::MFX_INTERNAL_CPY(dst, src, sizeof(int32_t) * count); sl.setScalingListDC(sizeId, listId, SCALING_LIST_DC); } } doInit = false; } scalingList = &sl; } initQMatrix<16>(scalingList, SCALING_LIST_4x4, qmatrix->ScalingList4x4); // 4x4 initQMatrix<64>(scalingList, SCALING_LIST_8x8, qmatrix->ScalingList8x8); // 8x8 initQMatrix<64>(scalingList, SCALING_LIST_16x16, qmatrix->ScalingList16x16); // 16x16 initQMatrix(scalingList, SCALING_LIST_32x32, qmatrix->ScalingList32x32); // 32x32 for (int sizeId = SCALING_LIST_16x16; sizeId <= SCALING_LIST_32x32; sizeId++) { for(unsigned listId = 0; listId < g_scalingListNum[sizeId]; listId++) { if(sizeId == SCALING_LIST_16x16) qmatrix->ScalingListDC16x16[listId] = (uint8_t)scalingList->getScalingListDC(sizeId, listId); else if(sizeId == SCALING_LIST_32x32) qmatrix->ScalingListDC32x32[listId] = (uint8_t)scalingList->getScalingListDC(sizeId, listId); } } TRACE_BUFFER_EVENT(VA_TRACE_API_HEVC_QMATRIXARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_QMATRIX, qmatrix, H265DecodeQmatrixParam, Qmatrix_HEVC); } void PackerVAAPI::PackProcessingInfo(H265DecoderFrameInfo * sliceInfo) { UMC::VideoProcessingVA *vpVA = m_va->GetVideoProcessingVA(); if (!vpVA) throw h265_exception(UMC::UMC_ERR_FAILED); UMC::UMCVACompBuffer *pipelineVABuf; auto* pipelineBuf = reinterpret_cast(m_va->GetCompBuffer(VAProcPipelineParameterBufferType, &pipelineVABuf, sizeof(VAProcPipelineParameterBuffer))); if (!pipelineBuf) throw h265_exception(UMC::UMC_ERR_FAILED); pipelineVABuf->SetDataSize(sizeof(VAProcPipelineParameterBuffer)); MFX_INTERNAL_CPY(pipelineBuf, &vpVA->m_pipelineParams, sizeof(VAProcPipelineParameterBuffer)); pipelineBuf->surface = m_va->GetSurfaceID(sliceInfo->m_pFrame->m_index); // should filled in packer pipelineBuf->additional_outputs = (VASurfaceID*)vpVA->GetCurrentOutputSurface(); // To keep output aligned, decode downsampling use this fixed combination of chroma sitting type pipelineBuf->input_color_properties.chroma_sample_location = VA_CHROMA_SITING_HORIZONTAL_LEFT | VA_CHROMA_SITING_VERTICAL_CENTER; } void PackerVAAPI::PackAU(H265DecoderFrame const* frame, TaskSupplier_H265 * supplier) { auto fi = frame->GetAU(); if (!fi) throw h265_exception(UMC::UMC_ERR_FAILED); auto count = fi->GetSliceCount(); if (!count) return; auto slice = fi->GetSlice(0); if (!slice) return; auto pps = slice->GetPicParam(); auto sps = slice->GetSeqParam(); if (!sps || !pps) throw h265_exception(UMC::UMC_ERR_FAILED); PackPicParams(frame, supplier); if (sps->scaling_list_enabled_flag) { PackQmatrix(slice); } CreateSliceParamBuffer(count); CreateSliceDataBuffer(m_va, fi); for (size_t n = 0; n < count; n++) PackSliceParams(fi->GetSlice(int32_t(n)), n, n == count - 1); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE if (m_va->GetVideoProcessingVA()) PackProcessingInfo(fi); #endif auto s = m_va->Execute(); if (s != UMC::UMC_OK) throw h265_exception(s); } } // namespace UMC_HEVC_DECODER namespace UMC_HEVC_DECODER { Packer* CreatePackerVAAPI(UMC::VideoAccelerator* va) { return new G12::PackerVAAPI(va); } } #endif // UMC_RESTRICTED_CODE_VA #endif //MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_va_supplier.cpp000077500000000000000000000152321443134507600326050ustar00rootroot00000000000000// Copyright (c) 2013-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_bitstream_headers.h" #include "umc_h265_va_supplier.h" #include "umc_h265_frame_list.h" #include "umc_h265_dec_defs.h" #include "umc_h265_task_broker.h" #include "umc_structures.h" #include "umc_h265_debug.h" #include "mfx_umc_alloc_wrapper.h" #include "mfx_common_int.h" #include "mfx_ext_buffers.h" namespace UMC_HEVC_DECODER { VATaskSupplier::VATaskSupplier() : m_bufferedFrameNumber(0) { } UMC::Status VATaskSupplier::Init(UMC::VideoDecoderParams *pInit) { SetVideoHardwareAccelerator(pInit->pVideoAccelerator); m_pMemoryAllocator = pInit->lpMemoryAllocator; pInit->numThreads = 1; UMC::Status umsRes = TaskSupplier_H265::Init(pInit); if (umsRes != UMC::UMC_OK) return umsRes; m_iThreadNum = 1; DXVASupport::Init(); if (m_va) { m_DPBSizeEx = m_iThreadNum + pInit->info.bitrate; } m_sei_messages = new SEI_Storer_H265(); m_sei_messages->Init(); return UMC::UMC_OK; } void VATaskSupplier::CreateTaskBroker() { m_pTaskBroker = new TaskBrokerSingleThreadDXVA(this); for (uint32_t i = 0; i < m_iThreadNum; i += 1) { m_pSegmentDecoder[i] = new H265_DXVA_SegmentDecoder(this); } } mfxStatus VATaskSupplier::ChangeVideoDecodingSpeed(int32_t& /* num */) { MFX_RETURN(MFX_ERR_UNSUPPORTED); } void VATaskSupplier::SetBufferedFramesNumber(uint32_t buffered) { m_DPBSizeEx = 1 + buffered; m_bufferedFrameNumber = buffered; } H265DecoderFrame * VATaskSupplier::GetFrameToDisplayInternal(bool force) { //ViewItem_H265 &view = *GetView(); //view.maxDecFrameBuffering += m_bufferedFrameNumber; H265DecoderFrame * frame = MFXTaskSupplier_H265::GetFrameToDisplayInternal(force); //view.maxDecFrameBuffering -= m_bufferedFrameNumber; return frame; } void VATaskSupplier::Reset() { if (m_pTaskBroker) m_pTaskBroker->Reset(); MFXTaskSupplier_H265::Reset(); } inline bool isFreeFrame(H265DecoderFrame * pTmp) { return (!pTmp->m_isShortTermRef && !pTmp->m_isLongTermRef //((pTmp->m_wasOutputted != 0) || (pTmp->m_Flags.isDisplayable == 0)) && //!pTmp->m_BusyState ); } void VATaskSupplier::CompleteFrame(H265DecoderFrame * pFrame) { if (!pFrame) return; if (pFrame->GetAU()->GetStatus() > H265DecoderFrameInfo::STATUS_NOT_FILLED) return; MFXTaskSupplier_H265::CompleteFrame(pFrame); if (H265DecoderFrameInfo::STATUS_FILLED != pFrame->GetAU()->GetStatus()) return; StartDecodingFrame(pFrame); EndDecodingFrame(); } void VATaskSupplier::InitFrameCounter(H265DecoderFrame * pFrame, const H265Slice *pSlice) { TaskSupplier_H265::InitFrameCounter(pFrame, pSlice); } UMC::Status VATaskSupplier::AllocateFrameData(H265DecoderFrame * pFrame, mfxSize dimensions, const H265SeqParamSet* pSeqParamSet, const H265PicParamSet *) { UMC::ColorFormat chroma_format_idc = pFrame->GetColorFormat(); UMC::VideoDataInfo info; int32_t bit_depth = pSeqParamSet->need16bitOutput ? 10 : 8; info.Init(dimensions.width, dimensions.height, chroma_format_idc, bit_depth); UMC::FrameMemID frmMID; UMC::Status sts = m_pFrameAllocator->Alloc(&frmMID, &info, 0); if (sts == UMC::UMC_ERR_ALLOC) return UMC::UMC_ERR_ALLOC; if (sts != UMC::UMC_OK) { throw h265_exception(UMC::UMC_ERR_ALLOC); } UMC::FrameData frmData; frmData.Init(&info, frmMID, m_pFrameAllocator); auto frame_source = dynamic_cast(m_pFrameAllocator); if (frame_source) { mfxFrameSurface1* surface = frame_source->GetSurfaceByIndex(frmMID); if (!surface) throw h265_exception(UMC::UMC_ERR_ALLOC); #if defined (MFX_EXTBUFF_GPU_HANG_ENABLE) mfxExtBuffer* extbuf = GetExtendedBuffer(surface->Data.ExtParam, surface->Data.NumExtParam, MFX_EXTBUFF_GPU_HANG); if (extbuf) frmData.SetAuxInfo(extbuf, extbuf->BufferSz, extbuf->BufferId); #endif } pFrame->allocate(&frmData, &info); pFrame->m_index = frmMID; return UMC::UMC_OK; } H265Slice * VATaskSupplier::DecodeSliceHeader(UMC::MediaDataEx *nalUnit) { size_t dataSize = nalUnit->GetDataSize(); nalUnit->SetDataSize(std::min( DEFAULT_MAX_ENETRY_POINT_NUM * 4 + DEFAULT_MAX_PREVENTION_BYTES + DEAFULT_MAX_SLICE_HEADER_SIZE, dataSize)); H265Slice * slice = TaskSupplier_H265::DecodeSliceHeader(nalUnit); nalUnit->SetDataSize(dataSize); if (!slice) return 0; if (nalUnit->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) { slice->m_source.Allocate(nalUnit->GetDataSize() + DEFAULT_NU_TAIL_SIZE); MFX_INTERNAL_CPY(slice->m_source.GetPointer(), nalUnit->GetDataPointer(), (uint32_t)nalUnit->GetDataSize()); memset(slice->m_source.GetPointer() + nalUnit->GetDataSize(), DEFAULT_NU_TAIL_VALUE, DEFAULT_NU_TAIL_SIZE); slice->m_source.SetDataSize(nalUnit->GetDataSize()); slice->m_source.SetTime(nalUnit->GetTime()); } else { slice->m_source.SetData(nalUnit); } uint32_t* pbs; uint32_t bitOffset; slice->GetBitStream()->GetState(&pbs, &bitOffset); size_t bytes = slice->GetBitStream()->BytesDecodedRoundOff(); slice->GetBitStream()->Reset(slice->m_source.GetPointer(), bitOffset, (uint32_t)slice->m_source.GetDataSize()); slice->GetBitStream()->SetState((uint32_t*)(slice->m_source.GetPointer() + bytes), bitOffset); return slice; } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/h265_dec/src/umc_h265_yuv.cpp000066400000000000000000000153071443134507600310770ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_H265_VIDEO_DECODE #include "umc_h265_yuv.h" #include "umc_h265_frame.h" #include namespace UMC_HEVC_DECODER { H265DecYUVBufferPadded::H265DecYUVBufferPadded() : m_chroma_format(CHROMA_FORMAT_420) , m_pYPlane(NULL) , m_pUVPlane(NULL) , m_pUPlane(NULL) , m_pVPlane(NULL) , m_pMemoryAllocator(0) , m_midAllocatedBuffer(0) , m_pAllocatedBuffer(0) , m_lumaSize() , m_chromaSize() , m_pitch_luma(0) , m_pitch_chroma(0) , m_color_format(UMC::NV12) { } H265DecYUVBufferPadded::H265DecYUVBufferPadded(UMC::MemoryAllocator *pMemoryAllocator) : m_chroma_format(CHROMA_FORMAT_420) , m_pYPlane(NULL) , m_pUVPlane(NULL) , m_pUPlane(NULL) , m_pVPlane(NULL) , m_pMemoryAllocator(pMemoryAllocator) , m_midAllocatedBuffer(0) , m_pAllocatedBuffer(0) , m_lumaSize() , m_chromaSize() , m_pitch_luma(0) , m_pitch_chroma(0) , m_color_format(UMC::NV12) { } H265DecYUVBufferPadded::~H265DecYUVBufferPadded() { deallocate(); } // Returns pointer to FrameData instance UMC::FrameData * H265DecYUVBufferPadded::GetFrameData() { return &m_frameData; } const UMC::FrameData * H265DecYUVBufferPadded::GetFrameData() const { return &m_frameData; } // Deallocate all memory void H265DecYUVBufferPadded::deallocate() { if (m_frameData.GetFrameMID() != UMC::FRAME_MID_INVALID) { m_frameData.Close(); return; } m_pYPlane = m_pUPlane = m_pVPlane = m_pUVPlane = NULL; m_lumaSize = { 0, 0 }; m_pitch_luma = 0; m_pitch_chroma = 0; } // Initialize variables to default values void H265DecYUVBufferPadded::Init(const UMC::VideoDataInfo *info) { if (info == nullptr) throw h265_exception(UMC::UMC_ERR_NULL_PTR); if (info->GetNumPlanes() == 0) throw h265_exception(UMC::UMC_ERR_NULL_PTR); m_color_format = info->GetColorFormat(); m_chroma_format = GetH265ColorFormat(info->GetColorFormat()); m_lumaSize = info->GetPlaneInfo(0)->m_ippSize; m_pYPlane = 0; m_pUPlane = 0; m_pVPlane = 0; m_pUVPlane = 0; if ((m_chroma_format > 0) && (info->GetNumPlanes() >= 2)) { m_chromaSize = info->GetPlaneInfo(1)->m_ippSize; } else { m_chromaSize = { 0, 0 }; } } // Allocate YUV frame buffer planes and initialize pointers to it. // Used to contain decoded frames. void H265DecYUVBufferPadded::allocate(const UMC::FrameData * frameData, const UMC::VideoDataInfo *info) { if (info == nullptr || frameData == nullptr || info->GetNumPlanes() == 0) { deallocate(); return; } m_frameData = *frameData; if (frameData->GetPlaneMemoryInfo(0)->m_planePtr) m_frameData.m_locked = true; m_color_format = info->GetColorFormat(); m_chroma_format = GetH265ColorFormat(info->GetColorFormat()); m_lumaSize = info->GetPlaneInfo(0)->m_ippSize; m_pitch_luma = (int32_t)m_frameData.GetPlaneMemoryInfo(0)->m_pitch / info->GetPlaneSampleSize(0); m_pYPlane = (PlanePtrY)m_frameData.GetPlaneMemoryInfo(0)->m_planePtr; if ((m_chroma_format > 0 || GetH265ColorFormat(frameData->GetInfo()->GetColorFormat()) > 0) && (info->GetNumPlanes() >= 2)) { if (m_chroma_format == 0) info = frameData->GetInfo(); if (info->GetPlaneInfo(1) == 0) throw h265_exception(UMC::UMC_ERR_NULL_PTR); m_chromaSize = info->GetPlaneInfo(1)->m_ippSize; m_pitch_chroma = (int32_t)m_frameData.GetPlaneMemoryInfo(1)->m_pitch / info->GetPlaneSampleSize(1); if (m_frameData.GetInfo()->GetNumPlanes() == 2) { m_pUVPlane = (PlanePtrUV)m_frameData.GetPlaneMemoryInfo(1)->m_planePtr; m_pUPlane = 0; m_pVPlane = 0; } else { assert(m_frameData.GetInfo()->GetNumPlanes() == 3); m_pUPlane = (PlanePtrUV)m_frameData.GetPlaneMemoryInfo(1)->m_planePtr; m_pVPlane = (PlanePtrUV)m_frameData.GetPlaneMemoryInfo(2)->m_planePtr; m_pUVPlane = 0; } } else { m_chromaSize = { 0, 0 }; m_pitch_chroma = 0; m_pUPlane = 0; m_pVPlane = 0; } } // Returns color formap of allocated frame UMC::ColorFormat H265DecYUVBufferPadded::GetColorFormat() const { return m_color_format; } // Allocate memory and initialize frame plane pointers and pitches. // Used for temporary picture buffers, e.g. residuals. void H265DecYUVBufferPadded::createPredictionBuffer(const H265SeqParamSet * sps) { uint32_t ElementSizeY = sizeof(int16_t); uint32_t ElementSizeUV = sizeof(int16_t); m_lumaSize.width = sps->MaxCUSize; m_lumaSize.height = sps->MaxCUSize; m_chroma_format = sps->ChromaArrayType; m_chromaSize.width = sps->MaxCUSize / sps->SubWidthC(); m_chromaSize.height = sps->MaxCUSize / sps->SubHeightC(); m_pitch_luma = sps->MaxCUSize; m_pitch_chroma = sps->MaxCUSize; size_t allocationSize = (m_lumaSize.height) * m_pitch_luma * ElementSizeY + (m_chromaSize.height) * m_pitch_chroma * ElementSizeUV*2 + 512; m_pAllocatedBuffer = h265_new_array_throw((int32_t)allocationSize); m_pYPlane = UMC::align_pointer(m_pAllocatedBuffer, 64); m_pUVPlane = m_pUPlane = UMC::align_pointer(m_pYPlane + (m_lumaSize.height) * m_pitch_luma * ElementSizeY + 128, 64); m_pVPlane = m_pUPlane + m_chromaSize.height * m_chromaSize.width * ElementSizeUV; } // Deallocate planes memory void H265DecYUVBufferPadded::destroy() { delete [] m_pAllocatedBuffer; m_pAllocatedBuffer = NULL; } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_H265_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/000077500000000000000000000000001443134507600263415ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/CMakeLists.txt000066400000000000000000000012731443134507600311040ustar00rootroot00000000000000add_library(jpeg_common STATIC) target_include_directories(jpeg_common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_sources(jpeg_common PRIVATE include/basestream.h include/basestreamin.h include/basestreamout.h include/bitstreamin.h include/bitstreamout.h include/colorcomp.h include/jpegbase.h include/membuffin.h include/membuffout.h src/bitstreamin.cpp src/bitstreamout.cpp src/colorcomp.cpp src/jpegbase.cpp src/membuffin.cpp src/membuffout.cpp ) target_link_libraries(jpeg_common PUBLIC mfx_static_lib umc_va_hw PRIVATE mfx_sdl_properties ) set_property(TARGET jpeg_common PROPERTY FOLDER "umc") oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/000077500000000000000000000000001443134507600277645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/basestream.h000066400000000000000000000027671443134507600322770ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __BASESTREAM_H__ #define __BASESTREAM_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "jpegbase.h" class CBaseStream { public: CBaseStream(void) {} virtual ~CBaseStream(void) {} virtual JERRCODE Open(vm_char* name) = 0; virtual JERRCODE Close() = 0; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __BASESTREAM_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/basestreamin.h000066400000000000000000000031561443134507600326170ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __BASESTREAMIN_H__ #define __BASESTREAMIN_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegbase.h" #include "basestream.h" class CBaseStreamInput : public CBaseStream { public: CBaseStreamInput(void) {} ~CBaseStreamInput(void) {} virtual JERRCODE Seek(long offset, int origin) = 0; virtual JERRCODE Read(void* buf,uic_size_t len,uic_size_t* cnt) = 0; virtual JERRCODE TellPos(size_t* pos) = 0; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __BASESTREAMIN_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/basestreamout.h000066400000000000000000000030631443134507600330150ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __BASESTREAMOUT_H__ #define __BASESTREAMOUT_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "jpegbase.h" #include "basestream.h" class CBaseStreamOutput : public CBaseStream { public: CBaseStreamOutput(void) {} ~CBaseStreamOutput(void) {} virtual JERRCODE Write(void* buf,uic_size_t len,uic_size_t* cnt) = 0; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __BASESTREAMOUT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/bitstreamin.h000066400000000000000000000047761443134507600324740ustar00rootroot00000000000000// Copyright (c) 2006-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __BITSTREAMIN_H__ #define __BITSTREAMIN_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegbase.h" class CBaseStreamInput; const int DEC_DEFAULT_BUFLEN = 4096; // internal intermediate input buffer class CBitStreamInput { public: CBitStreamInput(void); virtual ~CBitStreamInput(void); CBitStreamInput(const CBitStreamInput&) = delete; void operator=(const CBitStreamInput&) = delete; JERRCODE Attach(CBaseStreamInput* in); JERRCODE Detach(void); JERRCODE Init(int bufSize = DEC_DEFAULT_BUFLEN); JERRCODE FillBuffer(int nMinBytes = 0); uint8_t* GetDataPtr(void) const { return m_pData; } int GetDataLen(void) const { return m_DataLen; } uint8_t* GetCurrPtr(void) const { return m_pData + m_currPos; } int GetCurrPos(void) const { return m_currPos; } void SetCurrPos(int cp) { m_nUsedBytes += (cp - m_currPos); m_currPos = cp; } int GetNumUsedBytes(void) { return m_nUsedBytes; } JERRCODE Seek(long offset, int origin = UIC_SEEK_CUR); JERRCODE CheckByte(int pos, int* byte); JERRCODE ReadByte(int* byte); JERRCODE ReadWord(int* word); JERRCODE ReadDword(int* dword); protected: CBaseStreamInput* m_in; uint8_t* m_pData; int m_DataLen; int m_currPos; int m_nUsedBytes; int m_eod; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __BITSTREAMIN_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/bitstreamout.h000066400000000000000000000044371443134507600326670ustar00rootroot00000000000000// Copyright (c) 2006-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __BITSTREAMOUT_H__ #define __BITSTREAMOUT_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "jpegbase.h" class CBaseStreamOutput; const int ENC_DEFAULT_BUFLEN = 4096; // internal intermediate output buffer class CBitStreamOutput { public: CBitStreamOutput(void); virtual ~CBitStreamOutput(void); JERRCODE Attach(CBaseStreamOutput* out); JERRCODE Detach(void); JERRCODE Init(int bufSize = ENC_DEFAULT_BUFLEN); JERRCODE FlushBuffer(int nMinBytes = 0); JERRCODE FlushBitStream(CBitStreamOutput& bitStream); uint8_t* GetDataPtr(void) const { return m_pData; } int GetDataLen(void) const { return m_DataLen; } int GetCurrPos(void) const { return m_currPos; } void SetCurrPos(int cp) { m_currPos = cp; return; } int NumOfBytes(void) const { return m_nBytesWritten; } JERRCODE WriteByte(int byte); JERRCODE WriteWord(int word); JERRCODE WriteDword(int dword); protected: CBaseStreamOutput* m_out; uint8_t* m_pData; int m_DataLen; int m_currPos; int m_nBytesWritten; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __BITSTREAMOUT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/colorcomp.h000066400000000000000000000063551443134507600321430ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __COLORCOMP_H__ #define __COLORCOMP_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "ippj.h" #include "jpegbase.h" class CJPEGColorComponent { public: int m_id; int m_comp_no; int m_hsampling; int m_vsampling; int m_scan_hsampling; int m_scan_vsampling; int m_h_factor; int m_v_factor; int m_nblocks; int m_q_selector; int m_dc_selector; int m_ac_selector; int m_ac_scan_completed; int m_cc_height; int m_cc_step; int m_cc_bufsize; int m_ss_height; int m_ss_step; int m_ss_bufsize; int m_need_upsampling; int16_t m_lastDC; CMemoryBuffer m_cc_buf; CMemoryBuffer m_ss_buf; CMemoryBuffer m_row1; CMemoryBuffer m_row2; CMemoryBuffer m_lnz_buf; int m_lnz_bufsize; int m_lnz_ds; int16_t* m_curr_row; int16_t* m_prev_row; CJPEGColorComponent(void); virtual ~CJPEGColorComponent(void); JERRCODE CreateBufferCC(int num_threads = 1); JERRCODE DeleteBufferCC(void); JERRCODE CreateBufferSS(int num_threads = 1); JERRCODE DeleteBufferSS(void); JERRCODE CreateBufferLNZ(int num_threads = 1); JERRCODE DeleteBufferLNZ(void); uint8_t* GetCCBufferPtr(int thread_id = 0); // Get the buffer pointer template inline type_t *GetCCBufferPtr(const uint32_t colMCU) const; uint8_t* GetSSBufferPtr(int thread_id = 0); // Get the buffer pointer template inline type_t *GetSSBufferPtr(const uint32_t colMCU) const; uint8_t* GetLNZBufferPtr(int thread_id = 0); }; template inline type_t *CJPEGColorComponent::GetCCBufferPtr (const uint32_t colMCU) const { type_t *ptr = (type_t *) m_cc_buf.m_buffer; return (ptr + colMCU * 8 * m_hsampling); } // type_t *CJPEGColorComponent::GetCCBufferPtr (const uint32_t colMCU) const template inline type_t *CJPEGColorComponent::GetSSBufferPtr(const uint32_t colMCU) const { type_t *ptr = (type_t *) m_ss_buf.m_buffer; return (ptr + colMCU * 8 * m_hsampling); } // type_t *CJPEGColorComponent::GetSSBufferPtr(const uint32_t colMCU) const #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __COLORCOMP_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/jpegbase.h000066400000000000000000000212661443134507600317240ustar00rootroot00000000000000// Copyright (c) 2001-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __JPEGBASE_H__ #define __JPEGBASE_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #ifdef _OPENMP #include #endif #if !defined(MSDK_USE_EXTERNAL_IPP) #include "ippcore.h" #include "ippi.h" #include "ippj.h" #include "ipps.h" #else #include "ipp2mfx.h" #endif #include "vm_strings.h" #define DIB_ALIGN (sizeof(int) - 1) #define DIB_UWIDTH(width,nchannels) \ ((width) * (nchannels)) #define DIB_AWIDTH(width,nchannels) \ ( ((DIB_UWIDTH(width,nchannels) + DIB_ALIGN) & (~DIB_ALIGN)) ) #define DIB_PAD_BYTES(width,nchannels) \ ( DIB_AWIDTH(width,nchannels) - DIB_UWIDTH(width,nchannels) ) #ifdef ENABLE_JPEGD_TRACING #define TRC(msg) \ cout << (msg) #define TRC0(msg) \ cout << (msg) << endl #define TRC1(msg,p1) \ cout << (msg) << (p1) << endl #else #define TRC(msg) #define TRC0(msg) #define TRC1(msg,p1) #endif #ifdef ENABLE_JPEGD_ERROR_LOGGING #define LOG(msg) \ cout << (msg) #define LOG0(msg) \ cout << (msg) << endl #define LOG1(msg,p1) \ cout << (msg) << (p1) << endl #else #define LOG(msg) #define LOG0(msg) #define LOG1(msg,p1) #endif enum { UIC_SEEK_SET, UIC_SEEK_CUR, UIC_SEEK_END }; typedef unsigned int uic_size_t; typedef enum _JPEG_MODE { JPEG_UNKNOWN = 0, JPEG_BASELINE = 1, JPEG_EXTENDED = 2, JPEG_PROGRESSIVE = 3, JPEG_LOSSLESS = 4 } JMODE; typedef enum _JPEG_DCT_SCALE { JD_1_1 = 0, JD_1_2 = 1, JD_1_4 = 2, JD_1_8 = 3 } JDD; typedef enum _JPEG_DATA_ORDER { JD_PIXEL = 0, JD_PLANE = 1 } JDORDER; typedef enum _JPEG_OPERATION { JO_READ_HEADER = 0, JO_READ_DATA = 1 } JOPERATION; typedef enum _JPEG_THREADING_MODE { JT_OLD = 0, JT_RSTI = 1 } JTMODE; typedef enum _JPEG_COLOR { JC_UNKNOWN = 0, JC_GRAY = 1, JC_RGB = 2, JC_BGR = 3, JC_YCBCR = 4, JC_CMYK = 5, JC_YCCK = 6, JC_BGRA = 7, JC_RGBA = 8, JC_IMC3 = 9, JC_NV12 = 10, // Number of available JPEG colors JC_MAX } JCOLOR; typedef enum _JPEG_SAMPLING { JS_444 = 0, JS_422H = 1, JS_422V = 2, JS_420 = 3, JS_411 = 4, JS_OTHER = 5 } JSS; typedef enum _JPEG_MARKER { JM_NONE = 0, JM_SOI = 0xd8, /* start of image */ JM_EOI = 0xd9, /* end of image */ JM_TEM = 0x01, /* For temporary private use in arithmetic coding */ /* start of frame */ JM_SOF0 = 0xc0, /* Nondifferential Huffman-coding Baseline DCT */ JM_SOF1 = 0xc1, /* Nondifferential Huffman-coding Extended sequental DCT */ JM_SOF2 = 0xc2, /* Nondifferential Huffman-coding Progressive DCT */ JM_SOF3 = 0xc3, /* Nondifferential Huffman-coding Lossless (sequental) */ JM_SOF5 = 0xc5, /* Differential Huffman-coding Sequental DCT */ JM_SOF6 = 0xc6, /* Differential Huffman-coding Progressive DCT */ JM_SOF7 = 0xc7, /* Differential Lossless */ JM_SOF9 = 0xc9, /* Nondifferential arithmetic-coding Extended sequental DCT */ JM_SOFA = 0xca, /* Nondifferential arithmetic-coding Progressive DCT */ JM_SOFB = 0xcb, /* Nondifferential arithmetic-coding Lossless (sequental) */ JM_SOFD = 0xcd, /* Differential arithmetic-coding Sequental DCT */ JM_SOFE = 0xce, /* Differential arithmetic-coding Progressive DCT */ JM_SOFF = 0xcf, /* Differential arithmetic-coding Lossless */ JM_SOS = 0xda, /* start of scan */ JM_DQT = 0xdb, /* define quantization table(s) */ JM_DHT = 0xc4, /* define Huffman table(s) */ JM_APP0 = 0xe0, /* APP0 */ JM_APP1 = 0xe1, JM_APP2 = 0xe2, JM_APP3 = 0xe3, JM_APP4 = 0xe4, JM_APP5 = 0xe5, JM_APP6 = 0xe6, JM_APP7 = 0xe7, JM_APP8 = 0xe8, JM_APP9 = 0xe9, JM_APP10 = 0xea, JM_APP11 = 0xeb, JM_APP12 = 0xec, JM_APP13 = 0xed, JM_APP14 = 0xee, /* APP14 */ JM_APP15 = 0xef, JM_RST0 = 0xd0, /* restart with modulo 8 counter 0 */ JM_RST1 = 0xd1, /* restart with modulo 8 counter 1 */ JM_RST2 = 0xd2, /* restart with modulo 8 counter 2 */ JM_RST3 = 0xd3, /* restart with modulo 8 counter 3 */ JM_RST4 = 0xd4, /* restart with modulo 8 counter 4 */ JM_RST5 = 0xd5, /* restart with modulo 8 counter 5 */ JM_RST6 = 0xd6, /* restart with modulo 8 counter 6 */ JM_RST7 = 0xd7, /* restart with modulo 8 counter 7 */ JM_DRI = 0xdd, /* define restart interval */ JM_COM = 0xfe /* comment */ } JMARKER; typedef enum _JPEG_ERROR { JPEG_OK = 0, JPEG_NOT_IMPLEMENTED = -1, JPEG_ERR_INTERNAL = -2, JPEG_ERR_PARAMS = -3, JPEG_ERR_BUFF = -4, JPEG_ERR_FILE = -5, JPEG_ERR_ALLOC = -6, JPEG_ERR_BAD_DATA = -7, JPEG_ERR_SOF_DATA = -8, JPEG_ERR_DQT_DATA = -9, JPEG_ERR_DHT_DATA = -10, JPEG_ERR_SOS_DATA = -11, JPEG_ERR_RST_DATA = -12 } JERRCODE; typedef enum _HTBL_CLASS { DC = 0, AC = 1 } HTBL_CLASS; typedef enum _JPEG_RES_UNITS { JRU_NONE = 0, JRU_DPI = 1, // dot per inch JRU_DPC = 2 // dot per cm } JRESUNITS; typedef struct _image { union { uint8_t* Data8u[4]; int16_t* Data16s[4]; } p; int width; int height; int lineStep[4]; int precision; int nChannels; JCOLOR color; JSS sampling; JDORDER order; } IMAGE; typedef struct _jscan { int scan_no; int jpeg_restart_interval; int min_h_factor; int min_v_factor; uint32_t numxMCU; uint32_t numyMCU; int mcuWidth; int mcuHeight; int xPadding; int yPadding; int ncomps; int first_comp; } JSCAN; const int CPU_CACHE_LINE = 32; const int DCTSIZE = 8; const int DCTSIZE2 = 64; const int MAX_QUANT_TABLES = 4; const int MAX_HUFF_TABLES = 4; const int MAX_COMPS_PER_SCAN = 4; const int MAX_COMPS_PER_FRAME = 255; const int MAX_SCANS_PER_FRAME = 3; const int MAX_HUFF_BITS = 16; const int MAX_HUFF_VALS = 256; const int MAX_BLOCKS_PER_MCU = 10; const int MAX_BYTES_PER_MCU = DCTSIZE2 * sizeof(int16_t) * MAX_BLOCKS_PER_MCU; const int SAFE_NBYTES = 128; extern const uint8_t DefaultLuminanceQuant[64]; extern const uint8_t DefaultChrominanceQuant[64]; extern const uint8_t DefaultLuminanceDCBits[]; extern const uint8_t DefaultLuminanceDCValues[]; extern const uint8_t DefaultChrominanceDCBits[]; extern const uint8_t DefaultChrominanceDCValues[]; extern const uint8_t DefaultLuminanceACBits[]; extern const uint8_t DefaultLuminanceACValues[]; extern const uint8_t DefaultChrominanceACBits[]; extern const uint8_t DefaultChrominanceACValues[]; const vm_char* GetErrorStr(JERRCODE code); int get_num_threads(void); void set_num_threads(int maxThreads); class CMemoryBuffer { public: CMemoryBuffer(void) { m_buffer_size = 0; m_buffer = 0; } virtual ~CMemoryBuffer(void) { Delete(); } CMemoryBuffer(const CMemoryBuffer&) = delete; void operator=(const CMemoryBuffer&) = delete; JERRCODE Allocate(int size); JERRCODE Delete(void); operator uint8_t*() { return m_buffer; } int m_buffer_size; uint8_t* m_buffer; }; enum ChromaType { CHROMA_TYPE_YUV400 = 0, // (grayscale image) CHROMA_TYPE_YUV420 = 1, // Y: h=2 v=2, Cb/Cr: h=1 v=1 CHROMA_TYPE_YUV422H_2Y = 2, // Y: h=2 v=1, Cb/Cr: h=1 v=1 CHROMA_TYPE_YUV444 = 3, // Y: h=1 v=1, Cb/Cr: h=1 v=1 CHROMA_TYPE_YUV411 = 4, // Y: h=4 v=1, Cb/Cr: h=1 v=1 CHROMA_TYPE_YUV422V_2Y = 5, // Y: h=1 v=2, Cb/Cr: h=1 v=1 CHROMA_TYPE_YUV422H_4Y = 6, // Y: h=2 v=1, Cb/Cr: h=1 v=2 CHROMA_TYPE_YUV422V_4Y = 7, // Y: h=1 v=2, Cb/Cr: h=2 v=1 CHROMA_TYPE_RGB = 8, // Y: h=1 v=1, Cb/Cr: h=1 v=1 CHROMA_TYPE_BGR = 9 // Y: h=1 v=1, Cb/Cr: h=1 v=1 }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __JPEGBASE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/membuffin.h000066400000000000000000000035241443134507600321110ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MEMBUFFIN_H__ #define __MEMBUFFIN_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "basestream.h" #include "basestreamin.h" class CMemBuffInput : public CBaseStreamInput { public: CMemBuffInput(void); ~CMemBuffInput(void); JERRCODE Open(const uint8_t* pBuf, size_t buflen); JERRCODE Close(void); JERRCODE Seek(long offset, int origin); JERRCODE Read(void* buf,uic_size_t len,uic_size_t* cnt); JERRCODE TellPos(size_t* pos); size_t NBytesRead(void) { return m_currpos; } private: JERRCODE Open(vm_char* /*name*/) { return JPEG_NOT_IMPLEMENTED; } protected: const uint8_t *m_buf; size_t m_buflen; size_t m_currpos; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __MEMBUFFIN_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/include/membuffout.h000066400000000000000000000035001443134507600323040ustar00rootroot00000000000000// Copyright (c) 2006-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MEMBUFFOUT_H__ #define __MEMBUFFOUT_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include #include "basestream.h" #include "basestreamout.h" class CMemBuffOutput : public CBaseStreamOutput { public: CMemBuffOutput(void); ~CMemBuffOutput(void); JERRCODE Open(uint8_t* pBuf, int buflen); JERRCODE Close(void); JERRCODE Write(void* buf,uic_size_t len,uic_size_t* cnt); size_t GetPosition() { return (size_t)m_currpos; } private: JERRCODE Open(vm_char* /*name*/) { return JPEG_NOT_IMPLEMENTED; } protected: uint8_t* m_buf; int m_buflen; int m_currpos; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE #endif // __MEMBUFFOUT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/000077500000000000000000000000001443134507600271305ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/bitstreamin.cpp000066400000000000000000000115421443134507600321600ustar00rootroot00000000000000// Copyright (c) 2006-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegbase.h" #include "basestream.h" #include "basestreamin.h" #include "bitstreamin.h" CBitStreamInput::CBitStreamInput(void) { m_in = 0; m_pData = 0; m_DataLen = 0; m_currPos = 0; m_nUsedBytes = 0; m_eod = 0; return; } // ctor CBitStreamInput::~CBitStreamInput(void) { Detach(); return; } // dtor JERRCODE CBitStreamInput::Attach(CBaseStreamInput* in) { Detach(); m_in = in; return JPEG_OK; } // CBitStreamInput::Attach() JERRCODE CBitStreamInput::Detach(void) { if(0 != m_pData) { // deallocate internal memory delete[] m_pData; m_pData = 0; } m_in = 0; m_pData = 0; m_DataLen = 0; m_currPos = 0; m_nUsedBytes = 0; m_eod = 0; return JPEG_OK; } // CBitStreamInput::Detach() JERRCODE CBitStreamInput::Init(int bufSize) { m_DataLen = (int)bufSize; if (m_pData) { delete[] m_pData; } m_pData = new uint8_t[m_DataLen]; m_currPos = m_DataLen; // no data yet m_nUsedBytes = 0; return JPEG_OK; } // CBitStreamInput::Init() JERRCODE CBitStreamInput::FillBuffer(int nMinBytes) { int remainder; uic_size_t cnt; remainder = m_DataLen - m_currPos; if(nMinBytes) { if(remainder >= nMinBytes) return JPEG_OK; } if(remainder && !m_eod) { std::copy(m_pData + m_currPos, m_pData + m_DataLen, m_pData); m_currPos = 0; } if(!m_eod) { m_in->Read(m_pData + remainder,m_DataLen - remainder,&cnt); if((int)cnt != m_DataLen - remainder) m_eod = 1; m_currPos = 0; m_DataLen = remainder + cnt; } else { m_eod = 1; } if(m_eod && m_currPos >= m_DataLen) { return JPEG_ERR_BUFF; } return JPEG_OK; } // CBitStreamInput::FillBuffer() JERRCODE CBitStreamInput::Seek(long offset, int origin) { int _offset; JERRCODE jerr; switch(origin) { case UIC_SEEK_CUR: { _offset = m_currPos + offset; if(_offset > 0 && _offset < m_DataLen) { m_currPos = _offset; m_nUsedBytes += offset; } else { m_currPos = m_DataLen; m_nUsedBytes += offset; jerr = m_in->Seek(_offset - m_DataLen,UIC_SEEK_CUR); if(JPEG_OK != jerr) return jerr; jerr = FillBuffer(); if(JPEG_OK != jerr) return jerr; } break; } case UIC_SEEK_SET: case UIC_SEEK_END: default: return JPEG_NOT_IMPLEMENTED; } return JPEG_OK; } // CBitStreamInput::Seek() JERRCODE CBitStreamInput::CheckByte(int pos, int* byte) { JERRCODE jerr; if(m_currPos + pos >= m_DataLen) { jerr = Seek(pos); if(JPEG_OK != jerr) return jerr; *byte = m_pData[0]; } else *byte = m_pData[m_currPos + pos]; return JPEG_OK; } // CBitStreamInput::CheckByte() JERRCODE CBitStreamInput::ReadByte(int* byte) { JERRCODE jerr; if(m_currPos >= m_DataLen) { jerr = FillBuffer(); if(JPEG_OK != jerr) return jerr; } *byte = m_pData[m_currPos]; m_currPos++; m_nUsedBytes++; return JPEG_OK; } // CBitStreamInput::ReadByte() JERRCODE CBitStreamInput::ReadWord(int* word) { int byte0; int byte1; JERRCODE jerr; jerr = ReadByte(&byte0); if(JPEG_OK != jerr) return jerr; jerr = ReadByte(&byte1); if(JPEG_OK != jerr) return jerr; *word = (byte0 << 8) | byte1; return JPEG_OK; } // CBitStreamInput::ReadWord() JERRCODE CBitStreamInput::ReadDword(int* dword) { int word0; int word1; JERRCODE jerr; jerr = ReadWord(&word0); if(JPEG_OK != jerr) return jerr; jerr = ReadWord(&word1); if(JPEG_OK != jerr) return jerr; *dword = (word0 << 16) | word1; return JPEG_OK; } // CBitStreamInput::ReadDword() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/bitstreamout.cpp000066400000000000000000000100711443134507600323550ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "jpegbase.h" #include "basestream.h" #include "basestreamout.h" #include "bitstreamout.h" CBitStreamOutput::CBitStreamOutput(void) { m_out = 0; m_pData = 0; m_DataLen = 0; m_currPos = 0; m_nBytesWritten = 0; return; } // ctor CBitStreamOutput::~CBitStreamOutput(void) { Detach(); return; } // dtor JERRCODE CBitStreamOutput::Attach(CBaseStreamOutput* out) { Detach(); m_out = out; return JPEG_OK; } // CBitStreamOutput::Attach() JERRCODE CBitStreamOutput::Detach(void) { delete[] m_pData; m_out = 0; m_pData = 0; m_DataLen = 0; m_currPos = 0; m_nBytesWritten = 0; return JPEG_OK; } // CBitStreamOutput::Detach() JERRCODE CBitStreamOutput::Init(int bufSize) { m_DataLen = (int)bufSize; delete[] m_pData; m_pData = new uint8_t[m_DataLen]; m_currPos = 0; // no data yet m_nBytesWritten = 0; return JPEG_OK; } // CBitStreamOutput::Init() JERRCODE CBitStreamOutput::FlushBuffer(int nMinBytes) { int remainder; uic_size_t cnt = 0; if(m_currPos > m_DataLen) return JPEG_ERR_BUFF; if(nMinBytes) { remainder = m_DataLen - m_currPos; if(remainder > nMinBytes) return JPEG_OK; } m_out->Write(m_pData,m_currPos,&cnt); if((int)cnt != m_currPos) return JPEG_ERR_FILE; m_nBytesWritten += m_currPos; m_currPos = 0; return JPEG_OK; } // CBitStreamOutput::FlushBuffer() JERRCODE CBitStreamOutput::FlushBitStream(CBitStreamOutput &bitStream) { uint8_t* buf = 0; int currPos = 0; int dataLen = 0; uic_size_t cnt = 0; buf = bitStream.GetDataPtr(); currPos = bitStream.GetCurrPos(); dataLen = bitStream.GetDataLen(); if(currPos > dataLen) return JPEG_ERR_BUFF; m_out->Write(buf,currPos,&cnt); if((int)cnt != currPos) return JPEG_ERR_FILE; m_nBytesWritten += currPos; m_currPos = 0; bitStream.SetCurrPos(0); return JPEG_OK; } // CBitStreamOutput::FlushBitStream() JERRCODE CBitStreamOutput::WriteByte(int byte) { JERRCODE jerr; if(m_currPos >= m_DataLen) { jerr = FlushBuffer(); if(JPEG_OK != jerr) return jerr; } m_pData[m_currPos] = (uint8_t)byte; m_currPos++; return JPEG_OK; } // CBitStreamOutput::WriteByte() JERRCODE CBitStreamOutput::WriteWord(int word) { int byte0; int byte1; JERRCODE jerr; byte0 = word >> 8; byte1 = word & 0x00ff; jerr = WriteByte(byte0); if(JPEG_OK != jerr) return jerr; jerr = WriteByte(byte1); if(JPEG_OK != jerr) return jerr; return JPEG_OK; } // CBitStreamOutput::WriteWord() JERRCODE CBitStreamOutput::WriteDword(int dword) { int word0; int word1; JERRCODE jerr; word0 = dword >> 16; word1 = dword & 0x0000ffff; jerr = WriteWord(word0); if(JPEG_OK != jerr) return jerr; jerr = WriteWord(word1); if(JPEG_OK != jerr) return jerr; return JPEG_OK; } // CBitStreamOutput::WriteDword() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/colorcomp.cpp000066400000000000000000000066561443134507600316460ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #ifndef __COLORCOMP_H__ #include "colorcomp.h" #endif CJPEGColorComponent::CJPEGColorComponent(void) { m_id = 0; m_comp_no = 0; m_hsampling = 0; m_vsampling = 0; m_scan_hsampling = 0; m_scan_vsampling = 0; m_h_factor = 0; m_v_factor = 0; m_nblocks = 0; m_q_selector = 0; m_dc_selector = 0; m_ac_selector = 0; m_lastDC = 0; m_ac_scan_completed = 0; m_cc_height = 0; m_cc_step = 0; m_cc_bufsize = 0; m_ss_height = 0; m_ss_step = 0; m_ss_bufsize = 0; m_curr_row = 0; m_prev_row = 0; m_lnz_bufsize = 0; m_lnz_ds = 0; m_need_upsampling = 0; return; } // ctor CJPEGColorComponent::~CJPEGColorComponent(void) { return; } // dtor; JERRCODE CJPEGColorComponent::CreateBufferCC(int num_threads) { m_cc_bufsize = m_cc_step * m_cc_height; return m_cc_buf.Allocate(m_cc_bufsize * num_threads); } // CJPEGColorComponent::CreateBufferCC() JERRCODE CJPEGColorComponent::DeleteBufferCC(void) { return m_cc_buf.Delete(); } // CJPEGColorComponent::DeleteBufferCC() JERRCODE CJPEGColorComponent::CreateBufferSS(int num_threads) { m_ss_bufsize = m_ss_step * m_ss_height; return m_ss_buf.Allocate(m_ss_bufsize * num_threads); } // CJPEGColorComponent::CreateBufferSS() JERRCODE CJPEGColorComponent::DeleteBufferSS(void) { return m_ss_buf.Delete(); } // CJPEGColorComponent::DeleteBufferSS() uint8_t* CJPEGColorComponent::GetCCBufferPtr(int thread_id) { uint8_t* ptr = m_cc_buf; return &ptr[m_cc_bufsize * thread_id]; } // CJPEGColorComponent::GetCCBufferPtr() uint8_t* CJPEGColorComponent::GetSSBufferPtr(int thread_id) { uint8_t* ptr = m_ss_buf; return &ptr[m_ss_bufsize*thread_id]; } // CJPEGColorComponent::GetCCBufferPtr() JERRCODE CJPEGColorComponent::CreateBufferLNZ(int num_threads) { return m_lnz_buf.Allocate(m_lnz_bufsize * num_threads); } // CJPEGColorComponent::CreateBufferLNZ() JERRCODE CJPEGColorComponent::DeleteBufferLNZ(void) { return m_lnz_buf.Delete(); } // CJPEGColorComponent::DeleteBufferLNZ() uint8_t* CJPEGColorComponent::GetLNZBufferPtr(int thread_id) { uint8_t* ptr = m_lnz_buf; return &ptr[m_lnz_bufsize * thread_id]; } // CJPEGColorComponent::GetLNZBufferPtr() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/jpegbase.cpp000066400000000000000000000157621443134507600314270ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #include "jpegbase.h" // raw quant tables must be in zigzag order const uint8_t DefaultLuminanceQuant[64] = { 16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40, 26, 24, 22, 22, 24, 49, 35, 37, 29, 40, 58, 51, 61, 60, 57, 51, 56, 55, 64, 72, 92, 78, 64, 68, 87, 69, 55, 56, 80, 109, 81, 87, 95, 98, 103, 104, 103, 62, 77, 113, 121, 112, 100, 120, 92, 101, 103, 99 }; // raw quant tables must be in zigzag order const uint8_t DefaultChrominanceQuant[64] = { 17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; const uint8_t DefaultLuminanceDCBits[16] = { 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t DefaultLuminanceDCValues[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b }; const uint8_t DefaultChrominanceDCBits[16] = { 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t DefaultChrominanceDCValues[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b }; const uint8_t DefaultLuminanceACBits[16] = { 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d }; const uint8_t DefaultLuminanceACValues[256] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; const uint8_t DefaultChrominanceACBits[16] = { 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77 }; const uint8_t DefaultChrominanceACValues[256] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; const vm_char* GetErrorStr(JERRCODE code) { const vm_char* str; switch(code) { case JPEG_OK: str = VM_STRING("no error"); break; case JPEG_NOT_IMPLEMENTED: str = VM_STRING("requested feature is not implemented"); break; case JPEG_ERR_INTERNAL: str = VM_STRING("internal error"); break; case JPEG_ERR_PARAMS: str = VM_STRING("wrong parameters"); break; case JPEG_ERR_BUFF: str = VM_STRING("buffer too small"); break; case JPEG_ERR_FILE: str = VM_STRING("file io operation failed"); break; case JPEG_ERR_ALLOC: str = VM_STRING("memory allocation failed"); break; case JPEG_ERR_BAD_DATA: str = VM_STRING("bad segment data"); break; case JPEG_ERR_DHT_DATA: str = VM_STRING("bad huffman table segment"); break; case JPEG_ERR_DQT_DATA: str = VM_STRING("bad quant table segment"); break; case JPEG_ERR_SOS_DATA: str = VM_STRING("bad scan segment"); break; case JPEG_ERR_SOF_DATA: str = VM_STRING("bad frame segment"); break; case JPEG_ERR_RST_DATA: str = VM_STRING("wrong restart marker"); break; default: str = VM_STRING("unknown code"); break; } return str; } // GetErrorStr() int get_num_threads(void) { int maxThreads = 1; #ifdef _OPENMP #ifdef __INTEL_COMPILER kmp_set_blocktime(0); #endif #pragma omp parallel shared(maxThreads) { #pragma omp master { maxThreads = omp_get_num_threads(); } } #endif return maxThreads; } // get_num_threads() void set_num_threads(int maxThreads) { #ifdef _OPENMP omp_set_num_threads(maxThreads); #else (void)maxThreads; #endif return; } // set_num_threads() JERRCODE CMemoryBuffer::Allocate(int size) { Delete(); m_buffer_size = size; m_buffer = new uint8_t[m_buffer_size]; return JPEG_OK; } // CMemoryBuffer::Allocate() JERRCODE CMemoryBuffer::Delete(void) { if(m_buffer) delete[] m_buffer; m_buffer_size = 0; m_buffer = 0; return JPEG_OK; } // CMemoryBuffer::Delete() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/membuffin.cpp000066400000000000000000000051721443134507600316110ustar00rootroot00000000000000// Copyright (c) 2005-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "membuffin.h" CMemBuffInput::CMemBuffInput(void) { m_buf = 0; m_buflen = 0; m_currpos = 0; return; } // ctor CMemBuffInput::~CMemBuffInput(void) { Close(); return; } // dtor JERRCODE CMemBuffInput::Open(const uint8_t *pBuf, size_t buflen) { if(0 == pBuf) return JPEG_ERR_PARAMS; m_buf = pBuf; m_buflen = buflen; m_currpos = 0; return JPEG_OK; } // CMemBuffInput::Open() JERRCODE CMemBuffInput::Close(void) { m_buf = 0; m_buflen = 0; m_currpos = 0; return JPEG_OK; } // CMemBuffInput::Close() JERRCODE CMemBuffInput::Seek(long offset, int origin) { if(m_currpos + offset >= m_buflen || (long)m_currpos + offset < 0) { return JPEG_ERR_BUFF; } switch(origin) { case UIC_SEEK_CUR: m_currpos += offset; break; case UIC_SEEK_SET: m_currpos = offset; break; case UIC_SEEK_END: m_currpos = m_buflen; break; default: return JPEG_NOT_IMPLEMENTED; } return JPEG_OK; } // CMemBuffInput::Seek() JERRCODE CMemBuffInput::Read(void* buf,uic_size_t len,uic_size_t* cnt) { uic_size_t rb = std::min(len, uic_size_t(m_buflen - m_currpos)); MFX_INTERNAL_CPY((uint8_t*)buf, m_buf + m_currpos,rb); m_currpos += rb; *cnt = rb; if(len != rb) return JPEG_ERR_BUFF; return JPEG_OK; } // CMemBuffInput::Read() JERRCODE CMemBuffInput::TellPos(size_t* pos) { *pos = m_currpos; return JPEG_OK; } // CMemBuffInput::TellPos() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_common/src/membuffout.cpp000066400000000000000000000042041443134507600320050ustar00rootroot00000000000000// Copyright (c) 2006-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_CODEC) #ifndef __MEMBUFFOUT_H__ #include "membuffout.h" #endif CMemBuffOutput::CMemBuffOutput(void) { m_buf = 0; m_buflen = 0; m_currpos = 0; return; } // ctor CMemBuffOutput::~CMemBuffOutput(void) { Close(); return; } // dtor JERRCODE CMemBuffOutput::Open(uint8_t* pBuf, int buflen) { if(0 == pBuf) return JPEG_ERR_PARAMS; m_buf = pBuf; m_buflen = buflen; m_currpos = 0; return JPEG_OK; } // CMemBuffOutput::Open() JERRCODE CMemBuffOutput::Close(void) { m_buf = 0; m_buflen = 0; m_currpos = 0; return JPEG_OK; } // CMemBuffOutput::Close() JERRCODE CMemBuffOutput::Write(void* buf,uic_size_t len,uic_size_t* cnt) { uic_size_t wb = std::min(len, uic_size_t(m_buflen - m_currpos)); MFX_INTERNAL_CPY(m_buf + m_currpos,(uint8_t*)buf,wb); m_currpos += wb; *cnt = wb; if(len != wb) return JPEG_ERR_BUFF; return JPEG_OK; } // CMemBuffOutput::Write() #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE || MFX_ENABLE_MJPEG_VIDEO_ENCODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/000077500000000000000000000000001443134507600256045ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/CMakeLists.txt000066400000000000000000000022521443134507600303450ustar00rootroot00000000000000set(common_sources include/dechtbl.h include/decqtbl.h include/jpegdec_base.h include/umc_jpeg_frame_constructor.h include/umc_mjpeg_mfx_decode_base.h src/dechtbl.cpp src/decqtbl.cpp src/jpegdec.cpp src/jpegdec_base.cpp src/mfx_mjpeg_task.cpp src/umc_jpeg_frame_constructor.cpp src/umc_mjpeg_mfx_decode.cpp src/umc_mjpeg_mfx_decode_base.cpp src/umc_mjpeg_mfx_decode_hw.cpp ) add_library(jpeg_dec_hw STATIC) target_include_directories(jpeg_dec_hw PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_sources(jpeg_dec_hw PRIVATE include/umc_mjpeg_mfx_decode_hw.h src/umc_mjpeg_mfx_decode_hw.cpp ${common_sources} ) target_link_libraries(jpeg_dec_hw PUBLIC mfx_static_lib jpeg_common PRIVATE mfx_sdl_properties ) set_property(TARGET jpeg_dec_hw PROPERTY FOLDER "umc") add_library(jpeg_dec_sw STATIC) target_include_directories(jpeg_dec_sw PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_sources(jpeg_dec_sw PRIVATE ${common_sources} ) target_link_libraries(jpeg_dec_sw PUBLIC mfx_static_lib jpeg_common PRIVATE mfx_sdl_properties ) set_property(TARGET jpeg_dec_sw PROPERTY FOLDER "umc") oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/000077500000000000000000000000001443134507600272275ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/dechtbl.h000066400000000000000000000064251443134507600310140ustar00rootroot00000000000000// Copyright (c) 2001-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DECHTBL_H__ #define __DECHTBL_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "ippj.h" #include "jpegbase.h" #if defined(MFX_ENABLE_JPEG_SW_FALLBACK) #if defined(MSDK_USE_EXTERNAL_IPP) #include "ipp2mfx.h" #endif #endif class CJPEGDecoderHuffmanTable { private: #ifdef MFX_ENABLE_JPEG_SW_FALLBACK IppiDecodeHuffmanSpec* m_table; #endif uint8_t m_bits[16]; uint8_t m_vals[256]; bool m_bEmpty; bool m_bValid; public: int m_id; int m_hclass; CJPEGDecoderHuffmanTable(void); virtual ~CJPEGDecoderHuffmanTable(void); CJPEGDecoderHuffmanTable(const CJPEGDecoderHuffmanTable&) = delete; CJPEGDecoderHuffmanTable(CJPEGDecoderHuffmanTable&&) = delete; CJPEGDecoderHuffmanTable& operator=(const CJPEGDecoderHuffmanTable&) = delete; CJPEGDecoderHuffmanTable& operator=(CJPEGDecoderHuffmanTable&&) = delete; JERRCODE Create(void); JERRCODE Destroy(void); JERRCODE Init(int id,int hclass,uint8_t* bits,uint8_t* vals); bool IsEmpty(void) { return m_bEmpty; } bool IsValid(void) { return m_bValid; } void SetInvalid(void) { m_bValid = 0; return; } #ifdef MFX_ENABLE_JPEG_SW_FALLBACK operator IppiDecodeHuffmanSpec*(void) { return m_table; } #endif const uint8_t* GetBits() const { return m_bits; } const uint8_t* GetValues() const { return m_vals; } }; #ifdef MFX_ENABLE_JPEG_SW_FALLBACK class CJPEGDecoderHuffmanState { private: IppiDecodeHuffmanState* m_state; public: CJPEGDecoderHuffmanState(void); virtual ~CJPEGDecoderHuffmanState(void); CJPEGDecoderHuffmanState(const CJPEGDecoderHuffmanState&) = delete; CJPEGDecoderHuffmanState(CJPEGDecoderHuffmanState&&) = delete; CJPEGDecoderHuffmanState& operator=(const CJPEGDecoderHuffmanState&) = delete; CJPEGDecoderHuffmanState& operator=(CJPEGDecoderHuffmanState&&) = delete; JERRCODE Create(void); JERRCODE Destroy(void); JERRCODE Init(void); operator IppiDecodeHuffmanState*(void) { return m_state; } }; #endif #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __DECHTBL_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/decqtbl.h000066400000000000000000000043171443134507600310230ustar00rootroot00000000000000// Copyright (c) 2001-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DECQTBL_H__ #define __DECQTBL_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "ippj.h" #include "jpegbase.h" #if defined(MFX_ENABLE_JPEG_SW_FALLBACK) #if defined(MSDK_USE_EXTERNAL_IPP) #include "ipp2mfx.h" #endif #endif class CJPEGDecoderQuantTable { private: uint8_t m_rbf[DCTSIZE2*sizeof(uint16_t)+(CPU_CACHE_LINE-1)]; #ifdef MFX_ENABLE_JPEG_SW_FALLBACK uint8_t m_qbf[DCTSIZE2*sizeof(float)+(CPU_CACHE_LINE-1)]; uint16_t* m_qnt16u; float* m_qnt32f; #endif public: int m_id; int m_precision; int m_initialized; uint8_t* m_raw8u; uint16_t* m_raw16u; CJPEGDecoderQuantTable(void); virtual ~CJPEGDecoderQuantTable(void); JERRCODE Init(int id,uint8_t raw[DCTSIZE2]); JERRCODE Init(int id,uint16_t raw[DCTSIZE2]); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE ConvertToLowPrecision(void); JERRCODE ConvertToHighPrecision(void); operator uint16_t*() { return m_precision == 0 ? m_qnt16u : 0; } operator float*() { return m_precision == 1 ? m_qnt32f : 0; } #endif }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __DECQTBL_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/jpegdec.h000066400000000000000000000155651443134507600310150ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __JPEGDEC_H__ #define __JPEGDEC_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #ifdef _OPENMP #include "omp.h" #endif #include "jpegdec_base.h" #include "umc_media_data.h" class CBaseStreamInput; class CJPEGDecoder : public CJPEGDecoderBase { public: CJPEGDecoder(void); virtual ~CJPEGDecoder(void); virtual void Reset(void); virtual JERRCODE ReadHeader( int* width, int* height, int* nchannels, JCOLOR* color, JSS* sampling, int* precision); JERRCODE SetDestination( uint8_t* pDst, int dstStep, mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling = JS_444, int dstPrecision = 8, JDD dstDctScale = JD_1_1); JERRCODE SetDestination( int16_t* pDst, int dstStep, mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling = JS_444, int dstPrecision = 16); JERRCODE SetDestination( uint8_t* pDst[4], int dstStep[4], mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling = JS_420, int dstPrecision = 8, JDD dstDctScale = JD_1_1); JERRCODE SetDestination( int16_t* pDst[4], int dstStep[4], mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling = JS_444, int dstPrecision = 16); JERRCODE ReadPictureHeaders(void); // Read the whole image data JERRCODE ReadData(void); // Read only VLC NAL data unit. Don't you mind my using h264 slang ? :) JERRCODE ReadData(uint32_t restartNum, uint32_t restartsToDecode); void SetInColor(JCOLOR color) { m_jpeg_color = color; } void SetDCTType(int dct_type) { m_use_qdct = dct_type; } void Comment(uint8_t** buf, int* size) { *buf = m_jpeg_comment; *size = m_jpeg_comment_size; } JMODE Mode(void) { return m_jpeg_mode; } int IsJPEGCommentDetected(void) { return m_jpeg_comment_detected; } int IsExifAPP1Detected(void) { return m_exif_app1_detected; } uint8_t* GetExifAPP1Data(void) { return m_exif_app1_data; } int GetExifAPP1DataSize(void) { return m_exif_app1_data_size; } int IsAVI1APP0Detected(void) { return m_avi1_app0_detected; } int GetAVI1APP0Polarity(void) { return m_avi1_app0_polarity; } public: int m_jpeg_quality; JDD m_jpeg_dct_scale; int m_dd_factor; int m_use_qdct; // JPEG embedded comments variables int m_jpeg_comment_detected; int m_jpeg_comment_size; uint8_t* m_jpeg_comment; // Exif APP1 related variables int m_exif_app1_detected; int m_exif_app1_data_size; uint8_t* m_exif_app1_data; uint32_t m_numxMCU; uint32_t m_numyMCU; int m_mcuWidth; int m_mcuHeight; int m_ccWidth; int m_ccHeight; int m_xPadding; int m_yPadding; int m_rst_go; // Number of MCU already decoded uint32_t m_mcu_decoded; // Number of MCU remain in the current VLC unit uint32_t m_mcu_to_decode; int m_restarts_to_go; int m_next_restart_num; int m_dc_scan_completed; int m_ac_scans_completed; int m_init_done; int16_t* m_block_buffer; int m_block_buffer_size; int m_num_threads; int m_sof_find; #ifdef __TIMING__ unsigned long long m_clk_dct; unsigned long long m_clk_dct1x1; unsigned long long m_clk_dct2x2; unsigned long long m_clk_dct4x4; unsigned long long m_clk_dct8x8; unsigned long long m_clk_ss; unsigned long long m_clk_cc; unsigned long long m_clk_diff; unsigned long long m_clk_huff; #endif IMAGE m_dst; #ifdef MFX_ENABLE_JPEG_SW_FALLBACK CJPEGDecoderHuffmanState m_state; #endif public: JERRCODE Init(void); virtual JERRCODE Clean(void); JERRCODE ColorConvert(uint32_t rowCMU, uint32_t colMCU, uint32_t maxMCU); JERRCODE UpSampling(uint32_t rowMCU, uint32_t colMCU, uint32_t maxMCU); JERRCODE FindNextImage(); JERRCODE ParseData(); virtual JERRCODE ParseJPEGBitStream(JOPERATION op); JERRCODE ParseAPP1(void); JERRCODE ParseSOF1(void); JERRCODE ParseSOF2(void); JERRCODE ParseSOF3(void); JERRCODE ParseRST(void); JERRCODE ParseCOM(void); JERRCODE DecodeScanBaseline(void); // interleaved / non-interleaved scans JERRCODE DecodeScanBaselineIN(void); // interleaved scan JERRCODE DecodeScanBaselineIN_P(void); // interleaved scan for plane image JERRCODE DecodeScanBaselineNI(void); // non-interleaved scan JERRCODE DecodeScanLosslessIN(void); JERRCODE DecodeScanLosslessNI(void); JERRCODE DecodeScanProgressive(void); JERRCODE ProcessRestart(void); // huffman decode mcu row lossless process JERRCODE DecodeHuffmanMCURowLS(int16_t* pMCUBuf); // huffman decode mcu row baseline process JERRCODE DecodeHuffmanMCURowBL(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); // inverse DCT, de-quantization, level-shift for mcu row JERRCODE ReconstructMCURowBL8x8_NxN(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ReconstructMCURowBL8x8(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ReconstructMCURowBL8x8To4x4(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ReconstructMCURowBL8x8To2x2(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ReconstructMCURowBL8x8To1x1(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ReconstructMCURowEX(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU); JERRCODE ProcessBuffer(int nMCURow, int thread_id = 0); // reconstruct mcu row lossless process JERRCODE ReconstructMCURowLS(int16_t* pMCUBuf, int nMCURow,int thread_id = 0); ChromaType GetChromaType(); }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __JPEGDEC_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/jpegdec_base.h000066400000000000000000000115401443134507600317740ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __JPEGDEC_BASE_H__ #define __JPEGDEC_BASE_H__ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegbase.h" #include "decqtbl.h" #include "dechtbl.h" #include "colorcomp.h" #include "membuffin.h" #include "bitstreamin.h" #include "mfxstructures.h" #include "umc_media_data.h" namespace UMC { class MediaData; }; class CJPEGDecoderBase { public: CJPEGDecoderBase(void); virtual ~CJPEGDecoderBase(void); virtual void Reset(void); JERRCODE SetSource(const uint8_t* pBuf, size_t buflen); JERRCODE Seek(long offset, int origin); virtual JERRCODE ReadHeader( int* width, int* height, int* nchannels, JCOLOR* color, JSS* sampling, int* precision); int GetNumDecodedBytes(void) { return m_BitStreamIn.GetNumUsedBytes(); } int GetSOSLen(void) { return m_sos_len; } uint16_t GetNumQuantTables(void); JERRCODE FillQuantTable(int numTable, uint16_t* pTable); uint16_t GetNumACTables(void); JERRCODE FillACTable(int numTable, uint8_t* pBits, uint8_t* pValues); uint16_t GetNumDCTables(void); JERRCODE FillDCTable(int numTable, uint8_t* pBits, uint8_t* pValues); bool IsInterleavedScan(void); public: int m_jpeg_width; int m_jpeg_height; int m_jpeg_ncomp; int m_jpeg_precision; JSS m_jpeg_sampling; JCOLOR m_jpeg_color; JMODE m_jpeg_mode; // JFIF APP0 related varibales int m_jfif_app0_detected; int m_jfif_app0_major; int m_jfif_app0_minor; int m_jfif_app0_units; int m_jfif_app0_xDensity; int m_jfif_app0_yDensity; int m_jfif_app0_thumb_width; int m_jfif_app0_thumb_height; // JFXX APP0 related variables int m_jfxx_app0_detected; int m_jfxx_thumbnails_type; // AVI1 APP0 related variables int m_avi1_app0_detected; int m_avi1_app0_polarity; int m_avi1_app0_reserved; int m_avi1_app0_field_size; int m_avi1_app0_field_size2; // Adobe APP14 related variables int m_adobe_app14_detected; int m_adobe_app14_version; int m_adobe_app14_flags0; int m_adobe_app14_flags1; int m_adobe_app14_transform; int m_precision; int m_max_hsampling; int m_max_vsampling; // Number of MCU remain in the current VLC unit int m_sos_len; int m_curr_comp_no; int m_num_scans; JSCAN m_scans[MAX_SCANS_PER_FRAME]; JSCAN* m_curr_scan; int m_ss; int m_se; int m_al; int m_ah; JMARKER m_marker; CMemBuffInput m_stream_in; int m_nblock; CBitStreamInput m_BitStreamIn; CJPEGColorComponent m_ccomp[MAX_COMPS_PER_SCAN]; CJPEGDecoderQuantTable m_qntbl[MAX_QUANT_TABLES]; CJPEGDecoderHuffmanTable m_dctbl[MAX_HUFF_TABLES]; CJPEGDecoderHuffmanTable m_actbl[MAX_HUFF_TABLES]; public: virtual JERRCODE Clean(void); JERRCODE FindSOI(); virtual JERRCODE ParseJPEGBitStream(JOPERATION op); JERRCODE ParseSOI(void); JERRCODE ParseEOI(void); JERRCODE ParseAPP0(void); JERRCODE ParseAPP14(void); JERRCODE ParseSOF0(void); JERRCODE ParseDRI(void); JERRCODE ParseSOS(JOPERATION op); JERRCODE ParseDQT(void); JERRCODE ParseDHT(void); JERRCODE NextMarker(JMARKER* marker); JERRCODE SkipMarker(void); JERRCODE DetectSampling(void); void SetDecodeErrorTypes(void); void SetDecodeErrorReportParam(UMC::MediaData *in) { UMC::MediaData::AuxInfo* aux = (in) ? in->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; m_pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; } protected: mfxExtDecodeErrorReport* m_pDecodeErrorReport; }; #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // __JPEGDEC_BASE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include/mfx_mjpeg_task.h000066400000000000000000000115051443134507600324000ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef _MFX_MJPEG_TASK_H_ #define _MFX_MJPEG_TASK_H_ #include "mfx_common.h" #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include class CJpegTaskBuffer { public: // Default construct CJpegTaskBuffer(void); // Destructor ~CJpegTaskBuffer(void); CJpegTaskBuffer(const CJpegTaskBuffer&) = delete; CJpegTaskBuffer(CJpegTaskBuffer&&) = delete; CJpegTaskBuffer& operator=(const CJpegTaskBuffer&) = delete; CJpegTaskBuffer& operator=(CJpegTaskBuffer&&) = delete; // Allocate the buffer mfxStatus Allocate(const size_t size); // Pointer to the buffer mfxU8* pBuf; // Buffer size size_t bufSize; // Data size size_t dataSize; // Size of header data size_t imageHeaderSize; // Array of pieces offsets std::vector pieceOffset; // Array of pieces sizes std::vector pieceSize; // Count of RST markers prior current piece std::vector pieceRSTOffset; // Array of SOS segments (offsets) std::vector scanOffset; // Array of SOS segments (sizes) std::vector scanSize; // Array of tables before SOS (offsets) std::vector scanTablesOffset; // Array of tables before SOS (sizes) std::vector scanTablesSize; // Picture's time stamp double timeStamp; // Number of scans in the image mfxU32 numScans; // Number of independent pieces in the image mfxU32 numPieces; // The field position in interlaced case mfxU32 fieldPos; protected: // Close the object void Close(void); }; // Forward declaration of used classes namespace UMC { class FrameData; class MJPEGVideoDecoderMFX; class MediaDataEx; class VideoDecoderParams; class FrameAllocator; } // namespace UMC class CJpegTask { public: // Default constructor CJpegTask(void); // Destructor ~CJpegTask(void); // Initialize the task object mfxStatus Initialize(UMC::VideoDecoderParams ¶ms, UMC::FrameAllocator *pFrameAllocator, mfxU16 rotation, mfxU16 chromaFormat, mfxU16 colorFormat); // Reset the task, drop all counters void Reset(void); // Add a picture to the task mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, const mfxU32 fieldPos); // Get the number of pictures collected inline mfxU32 NumPicCollected(void) const; // Get the number of pieces collected inline mfxU32 NumPiecesCollected(void) const; // Get the picture's buffer inline const CJpegTaskBuffer &GetPictureBuffer(mfxU32 picNum) const { return *(m_pics[picNum]); } // tasks parameters UMC::FrameData *dst; mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out; // Decoder's array std::unique_ptr m_pMJPEGVideoDecoder; protected: // Close the object, release all resources void Close(void); // Make sure that the buffer is big enough to collect the source mfxStatus CheckBufferSize(const size_t srcSize); // Number of pictures collected mfxU32 m_numPic; // Array with collected pictures std::vector> m_pics; // Number of scan data pieces. This number is used to request the number of // threads. mfxU32 m_numPieces; }; // // Inline members // inline mfxU32 CJpegTask::NumPicCollected(void) const { return m_numPic; } // mfxU32 CJpegTask::NumPicCollected(void) const inline mfxU32 CJpegTask::NumPiecesCollected(void) const { return m_numPieces; } // mfxU32 CJpegTask::NumPiecesCollected(void) const #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif // _MFX_MJPEG_TASK_H_ umc_jpeg_frame_constructor.h000066400000000000000000000050661443134507600347400ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_JPEG_FRAME_CONSTRUCTOR_H #define __UMC_JPEG_FRAME_CONSTRUCTOR_H #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include "umc_media_data_ex.h" namespace UMC { class JpegFrameConstructor { public: JpegFrameConstructor(); virtual ~JpegFrameConstructor(); virtual void Init(); virtual void Reset(); virtual void Close(); virtual MediaDataEx * GetFrame(MediaData * in, uint32_t maxBitstreamSize); int32_t CheckMarker(MediaData * pSource); int32_t GetMarker(MediaData * in, MediaData * pDst); protected: Status AddMarker(uint32_t marker, MediaDataEx::_MediaDataEx* pMediaDataEx, size_t nBufferSize, MediaData *dst); int32_t EndOfStream(MediaData * pDst); int32_t FindMarkerCode(uint8_t * (&source), size_t & size, int32_t & startCodeSize); void ResetForNewFrame(); size_t m_prevLengthOfSegment; std::vector m_prev; std::vector m_frame; MediaDataEx m_mediaData; MediaDataEx::_MediaDataEx m_mediaDataEx; int32_t m_code; // marker code double m_pts; size_t m_suggestedSize; int32_t m_RestartCount; struct JpegFCFlags { uint8_t isSOI : 1; uint8_t isEOI : 1; uint8_t isSOS : 1; }; JpegFCFlags m_flags; }; } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif //__UMC_JPEG_FRAME_CONSTRUCTOR_H umc_mjpeg_mfx_decode.h000066400000000000000000000113521443134507600334460ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_H #define __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_H #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include "ippdefs.h" #include "ippcore.h" #include "umc_structures.h" #include "umc_video_decoder.h" #include "umc_frame_data.h" #include "umc_frame_allocator.h" #include "jpegdec.h" #include "umc_mjpeg_mfx_decode_base.h" #include "umc_jpeg_frame_constructor.h" #include "mfxvideo++int.h" // internal JPEG decoder object forward declaration class CBaseStreamInput; class CJPEGDecoder; class CJpegTask; class CJpegTaskBuffer; namespace UMC { enum { JPEG_MAX_THREADS = 4 }; class MJPEGVideoDecoderMFX : public MJPEGVideoDecoderBaseMFX { public: // Default constructor MJPEGVideoDecoderMFX(void); // Destructor virtual ~MJPEGVideoDecoderMFX(void); // Initialize for subsequent frame decoding. Status Init(BaseCodecParams* init) override; // Reset decoder to initial state Status Reset(void) override; // Close decoding & free all allocated resources Status Close(void) override; virtual FrameData *GetDst(void); // Get next frame virtual Status DecodePicture(const CJpegTask &task, const mfxU32 threadNumber, const mfxU32 callNumber); void SetFrameAllocator(FrameAllocator * frameAllocator) override; Status DecodeHeader(MediaData* in); Status FillVideoParam(mfxVideoParam *par, bool full); Status FillQuantTableExtBuf(mfxExtJPEGQuantTables* quantTables); Status FillHuffmanTableExtBuf(mfxExtJPEGHuffmanTables* huffmanTables); virtual ConvertInfo * GetConvertInfo(); ChromaType GetChromaType(); JCOLOR GetColorType(); // All memory sizes should come in size_t type Status _GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in); // Allocate the destination frame Status AllocateFrame() override; // Close the frame being decoded Status CloseFrame(void); // Do post processing virtual Status PostProcessing(double ptr); // Get the number of decoders allocated inline mfxU32 NumDecodersAllocated(void) const; // Skip extra data at the begiging of stream Status FindStartOfImage(MediaData * in); Status SetRotation(uint16_t rotation); Status SetColorSpace(uint16_t chromaFormat, uint16_t colorFormat); protected: void AdjustFrameSize(mfxSize & size) override; Status DecodePiece(const mfxU32 fieldNum, const mfxU32 restartNum, const mfxU32 restartsToDecode, const mfxU32 threadNum); Status _DecodeHeader(int32_t* nUsedBytes, const uint32_t threadNum); int32_t m_frameNo; VideoData m_internalFrame; bool m_needPostProcessing; uint8_t* m_frame; int32_t m_frameChannels; int32_t m_framePrecision; // JPEG decoders allocated std::vector> m_dec; // Pointer to the last buffer decoded. It is required to check if header was already decoded. const CJpegTaskBuffer *m_pLastPicBuffer[JPEG_MAX_THREADS]; double m_local_frame_time; double m_local_delta_frame_time; std::unique_ptr m_PostProcessing; // (BaseCodec*) pointer to post processing }; inline mfxU32 MJPEGVideoDecoderMFX::NumDecodersAllocated(void) const { return static_cast(m_dec.size()); } // mfxU32 MJPEGVideoDecoderMFX::NumDecodersAllocated(void) const } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif //__UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_H umc_mjpeg_mfx_decode_base.h000066400000000000000000000133001443134507600344330ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_BASE_H #define __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_BASE_H #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include "umc_structures.h" #include "umc_video_decoder.h" #include "umc_media_data_ex.h" #include "umc_frame_data.h" #include "umc_frame_allocator.h" #include "jpegdec_base.h" #include "mfxvideo++int.h" namespace UMC { typedef struct { ChromaType colorFormat; size_t UOffset; size_t VOffset; } ConvertInfo; class MJPEGVideoDecoderBaseMFX { public: // Default constructor MJPEGVideoDecoderBaseMFX(void); // Destructor virtual ~MJPEGVideoDecoderBaseMFX(void); // Initialize for subsequent frame decoding. virtual Status Init(BaseCodecParams* init); // Reset decoder to initial state virtual Status Reset(void); // Close decoding & free all allocated resources virtual Status Close(void); virtual Status GetFrame(UMC::MediaDataEx *, UMC::FrameData** , const mfxU32) { return MFX_ERR_NONE; }; virtual void SetFrameAllocator(FrameAllocator * frameAllocator); Status FillQuantTableExtBuf(mfxExtJPEGQuantTables* quantTables); Status FillHuffmanTableExtBuf(mfxExtJPEGHuffmanTables* huffmanTables); Status DecodeHeader(MediaData* in); Status FillVideoParam(mfxVideoParam *par, bool full); // Skip extra data at the begiging of stream Status FindStartOfImage(MediaData * in); // All memory sizes should come in size_t type Status _GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in); Status SetRotation(uint16_t rotation); protected: std::pair GetColorType(); std::pair GetChromaType(); virtual void AdjustFrameSize(mfxSize & size); // Allocate the destination frame virtual Status AllocateFrame() { return MFX_ERR_NONE; }; bool m_IsInit; bool m_interleaved; bool m_interleavedScan; VideoDecoderParams m_DecoderParams; FrameData m_frameData; JCOLOR m_color; uint16_t m_rotation; mfxSize m_frameDims; int m_frameSampling; // JPEG decoders allocated std::unique_ptr m_decoder; CJPEGDecoderBase * m_decBase; FrameAllocator * m_frameAllocator; }; inline mfxU16 GetMFXChromaFormat(ChromaType type) { mfxU16 chromaFormat = MFX_CHROMAFORMAT_MONOCHROME; switch(type) { case CHROMA_TYPE_YUV400: chromaFormat = MFX_CHROMAFORMAT_MONOCHROME; break; case CHROMA_TYPE_YUV420: chromaFormat = MFX_CHROMAFORMAT_YUV420; break; case CHROMA_TYPE_YUV422H_2Y: chromaFormat = MFX_CHROMAFORMAT_YUV422H; break; case CHROMA_TYPE_YUV444: case CHROMA_TYPE_RGB: chromaFormat = MFX_CHROMAFORMAT_YUV444; break; case CHROMA_TYPE_YUV411: chromaFormat = MFX_CHROMAFORMAT_YUV411; break; case CHROMA_TYPE_YUV422V_2Y: chromaFormat = MFX_CHROMAFORMAT_YUV422V; break; case CHROMA_TYPE_YUV422H_4Y: chromaFormat = MFX_CHROMAFORMAT_YUV422H; break; case CHROMA_TYPE_YUV422V_4Y: chromaFormat = MFX_CHROMAFORMAT_YUV422V; break; default: assert(false); break; }; return chromaFormat; } inline mfxU16 GetMFXColorFormat(JCOLOR color) { mfxU16 colorFormat = MFX_JPEG_COLORFORMAT_UNKNOWN; switch(color) { case JC_UNKNOWN: colorFormat = MFX_JPEG_COLORFORMAT_UNKNOWN; break; case JC_GRAY: colorFormat = MFX_JPEG_COLORFORMAT_YCbCr; break; case JC_YCBCR: colorFormat = MFX_JPEG_COLORFORMAT_YCbCr; break; case JC_RGB: colorFormat = MFX_JPEG_COLORFORMAT_RGB; break; default: assert(false); break; }; return colorFormat; } inline JCOLOR GetUMCColorType(uint16_t chromaFormat, uint16_t colorFormat) { JCOLOR color = JC_UNKNOWN; switch(colorFormat) { case MFX_JPEG_COLORFORMAT_UNKNOWN: color = JC_UNKNOWN; break; case MFX_JPEG_COLORFORMAT_YCbCr: if(chromaFormat == MFX_CHROMAFORMAT_MONOCHROME) { color = JC_GRAY; } else { color = JC_YCBCR; } break; case MFX_JPEG_COLORFORMAT_RGB: color = JC_RGB; break; default: assert(false); break; }; return color; } } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif //__UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_BASE_H umc_mjpeg_mfx_decode_hw.h000066400000000000000000000077551443134507600341600ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/include// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_HW_H #define __UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_HW_H #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "umc_va_base.h" #if defined(UMC_VA) #include "umc_mjpeg_mfx_decode_base.h" #include #include namespace UMC { typedef struct tagJPEG_DECODE_SCAN_PARAMETER { uint16_t NumComponents; uint8_t ComponentSelector[4]; uint8_t DcHuffTblSelector[4]; uint8_t AcHuffTblSelector[4]; uint16_t RestartInterval; uint32_t MCUCount; uint16_t ScanHoriPosition; uint16_t ScanVertPosition; uint32_t DataOffset; uint32_t DataLength; } JPEG_DECODE_SCAN_PARAMETER; typedef struct tagJPEG_DECODE_QUERY_STATUS { uint32_t StatusReportFeedbackNumber; uint8_t bStatus; uint8_t reserved8bits; uint16_t reserved16bits; } JPEG_DECODE_QUERY_STATUS; class MJPEGVideoDecoderMFX_HW : public MJPEGVideoDecoderBaseMFX { public: // Default constructor MJPEGVideoDecoderMFX_HW(void); // Destructor virtual ~MJPEGVideoDecoderMFX_HW(void); // Initialize for subsequent frame decoding. virtual Status Init(BaseCodecParams* init); // Reset decoder to initial state virtual Status Reset(void); // Close decoding & free all allocated resources virtual Status Close(void); // Allocate the destination frame virtual Status AllocateFrame(); // Close the frame being decoded Status CloseFrame(UMC::FrameData** in, const mfxU32 fieldPos); // Get next frame virtual Status GetFrame(UMC::MediaDataEx *pSrcData, UMC::FrameData** out, const mfxU32 fieldPos); virtual ConvertInfo * GetConvertInfo(); uint32_t GetStatusReportNumber() {return m_statusReportFeedbackCounter;} mfxStatus CheckStatusReportNumber(uint32_t statusReportFeedbackNumber, mfxU16* corrupted); void SetFourCC(uint32_t fourCC) {m_fourCC = fourCC;} protected: Status _DecodeField(); Status _DecodeHeader(int32_t* nUsedBytes); virtual Status _DecodeField(MediaDataEx* in); Status PackHeaders(MediaData* src, JPEG_DECODE_SCAN_PARAMETER* obtainedScanParams, uint8_t* buffersForUpdate); Status GetFrameHW(MediaDataEx* in); Status DefaultInitializationHuffmantables(); uint16_t GetNumScans(MediaDataEx* in); uint32_t m_statusReportFeedbackCounter; ConvertInfo m_convertInfo; uint32_t m_fourCC; Mutex m_guard; std::set m_submittedTaskIndex; std::set m_cachedReadyTaskIndex; std::set m_cachedCorruptedTaskIndex; VideoAccelerator * m_va; #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD std::map m_pic_index; #endif }; } // end namespace UMC #endif //#if defined(UMC_VA) #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE #endif //__UMC_MJPEG_VIDEO_DECODER_MFX_DECODE_HW_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/000077500000000000000000000000001443134507600263735ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/dechtbl.cpp000066400000000000000000000107201443134507600305040ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegbase.h" #include "dechtbl.h" #include CJPEGDecoderHuffmanTable::CJPEGDecoderHuffmanTable(void) { m_id = 0; m_hclass = 0; #ifdef MFX_ENABLE_JPEG_SW_FALLBACK m_table = 0; #endif m_bEmpty = 1; m_bValid = 0; memset(m_bits, 0, sizeof(m_bits)); memset(m_vals, 0, sizeof(m_vals)); return; } // ctor CJPEGDecoderHuffmanTable::~CJPEGDecoderHuffmanTable(void) { Destroy(); return; } // dtor JERRCODE CJPEGDecoderHuffmanTable::Create(void) { #ifdef MFX_ENABLE_JPEG_SW_FALLBACK int size; int status; status = mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u(&size); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u() failed - ",status); return JPEG_ERR_INTERNAL; } if(0 != m_table) { free(m_table); m_table = 0; } m_table = (IppiDecodeHuffmanSpec*)malloc(size); if(0 == m_table) { LOG0("IPP Error: malloc() failed"); return JPEG_ERR_ALLOC; } #endif m_bEmpty = 0; m_bValid = 0; return JPEG_OK; } // CJPEGDecoderHuffmanTable::Create() JERRCODE CJPEGDecoderHuffmanTable::Destroy(void) { m_id = 0; m_hclass = 0; memset(m_bits, 0, sizeof(m_bits)); memset(m_vals, 0, sizeof(m_vals)); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK if(0 != m_table) { free(m_table); m_table = 0; } #endif m_bValid = 0; m_bEmpty = 1; return JPEG_OK; } // CJPEGDecoderHuffmanTable::Destroy() JERRCODE CJPEGDecoderHuffmanTable::Init(int id,int hclass,uint8_t* bits,uint8_t* vals) { m_id = id & 0x0f; m_hclass = hclass & 0x0f; MFX_INTERNAL_CPY(m_bits,bits,16); MFX_INTERNAL_CPY(m_vals,vals,256); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK int status = mfxiDecodeHuffmanSpecInit_JPEG_8u(m_bits,m_vals,m_table); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiDecodeHuffmanSpecInit_JPEG_8u() failed - ",status); return JPEG_ERR_DHT_DATA; } #endif m_bValid = 1; m_bEmpty = 0; return JPEG_OK; } // CJPEGDecoderHuffmanTable::Init() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK CJPEGDecoderHuffmanState::CJPEGDecoderHuffmanState(void) { m_state = 0; return; } // ctor CJPEGDecoderHuffmanState::~CJPEGDecoderHuffmanState(void) { Destroy(); return; } // dtor JERRCODE CJPEGDecoderHuffmanState::Create(void) { int size; int status; status = mfxiDecodeHuffmanStateGetBufSize_JPEG_8u(&size); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiDecodeHuffmanStateGetBufSize_JPEG_8u() failed - ",status); return JPEG_ERR_INTERNAL; } if(0 != m_state) { free(m_state); m_state = 0; } m_state = (IppiDecodeHuffmanState*)malloc(size); if(0 == m_state) { LOG0("IPP Error: malloc() failed"); return JPEG_ERR_ALLOC; } return JPEG_OK; } // CJPEGDecoderHuffmanState::Create() JERRCODE CJPEGDecoderHuffmanState::Destroy(void) { if(0 != m_state) { free(m_state); m_state = 0; } return JPEG_OK; } // CJPEGDecoderHuffmanState::Destroy() JERRCODE CJPEGDecoderHuffmanState::Init(void) { int status; status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiDecodeHuffmanStateInit_JPEG_8u() failed - ",status); return JPEG_ERR_INTERNAL; } return JPEG_OK; } // CJPEGDecoderHuffmanState::Init() #endif // #ifdef MFX_ENABLE_JPEG_SW_FALLBACK #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/decqtbl.cpp000066400000000000000000000114251443134507600305200ustar00rootroot00000000000000// Copyright (c) 2001-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "umc_structures.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #include "decqtbl.h" CJPEGDecoderQuantTable::CJPEGDecoderQuantTable(void) { m_id = 0; m_precision = 0; m_initialized = 0; // align for max performance m_raw8u = UMC::align_pointer(m_rbf, CPU_CACHE_LINE); m_raw16u = UMC::align_pointer(m_rbf,CPU_CACHE_LINE); memset(m_rbf, 0, sizeof(m_rbf)); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK m_qnt16u = UMC::align_pointer(m_qbf,CPU_CACHE_LINE); m_qnt32f = UMC::align_pointer(m_qbf,CPU_CACHE_LINE); memset(m_qbf, 0, sizeof(m_qbf)); #endif return; } // ctor CJPEGDecoderQuantTable::~CJPEGDecoderQuantTable(void) { m_id = 0; m_precision = 0; m_initialized = 0; memset(m_rbf, 0, sizeof(m_rbf)); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK memset(m_qbf, 0, sizeof(m_qbf)); #endif return; } // dtor JERRCODE CJPEGDecoderQuantTable::Init(int id,uint8_t raw[64]) { m_id = id & 0x0f; m_precision = 0; // 8-bit precision MFX_INTERNAL_CPY(m_raw8u,raw,DCTSIZE2); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK int status = mfxiQuantInvTableInit_JPEG_8u16u(m_raw8u,m_qnt16u); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiQuantInvTableInit_JPEG_8u16u() failed - ",status); return JPEG_ERR_INTERNAL; } #endif m_initialized = 1; return JPEG_OK; } // CJPEGDecoderQuantTable::Init() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK static int mfxiQuantInvTableInit_JPEG_16u32f( uint16_t* raw, float* qnt) { uint16_t wb[DCTSIZE2]; int status; status = mfxiZigzagInv8x8_16s_C1((int16_t*)raw,(int16_t*)wb); if(ippStsNoErr != status) { return status; } for(int i = 0; i < DCTSIZE2; i++) ((float*)qnt)[i] = (float)((uint16_t*)wb)[i]; return ippStsNoErr; } // mfxiQuantInvTableInit_JPEG_16u32f() #endif JERRCODE CJPEGDecoderQuantTable::Init(int id,uint16_t raw[64]) { m_id = id & 0x0f; m_precision = 1; // 16-bit precision MFX_INTERNAL_CPY((int16_t*)m_raw16u, (int16_t*)raw, DCTSIZE2*sizeof(int16_t)); #ifdef MFX_ENABLE_JPEG_SW_FALLBACK int status = mfxiQuantInvTableInit_JPEG_16u32f(m_raw16u,m_qnt32f); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiQuantInvTableInit_JPEG_16u32f() failed - ",status); return JPEG_ERR_INTERNAL; } #endif m_initialized = 1; return JPEG_OK; } // CJPEGDecoderQuantTable::Init() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoderQuantTable::ConvertToLowPrecision(void) { int status; status = mfxiZigzagInv8x8_16s_C1((int16_t*)m_raw16u,(int16_t*)m_qnt16u); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_precision = 0; // 8-bit precision m_initialized = 1; return JPEG_OK; } // CJPEGDecoderQuantTable::ConvertToLowPrecision() JERRCODE CJPEGDecoderQuantTable::ConvertToHighPrecision(void) { int step; mfxSize roi = { DCTSIZE, DCTSIZE }; uint16_t wb[DCTSIZE2]; int status; step = DCTSIZE * sizeof(int16_t); status = mfxiConvert_8u16u_C1R(m_raw8u,DCTSIZE*sizeof(uint8_t),wb,step,roi); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } status = mfxiCopy_16s_C1R((int16_t*)wb,step,(int16_t*)m_raw16u,step,roi); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } status = mfxiQuantInvTableInit_JPEG_16u32f(m_raw16u,m_qnt32f); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_precision = 1; // 16-bit precision m_initialized = 1; return JPEG_OK; } // CJPEGDecoderQuantTable::ConvertToHighPrecision() #endif #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/jpegdec.cpp000066400000000000000000004044521443134507600305110ustar00rootroot00000000000000// Copyright (c) 2001-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #include #include #include #include #include "jpegbase.h" #include "jpegdec.h" #include #if defined(MSDK_USE_EXTERNAL_IPP) #include "ipp2mfx.h" #endif extern void ConvertFrom_YUV444_To_YV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size); extern void ConvertFrom_YUV422V_To_YV12(uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size); extern void ConvertFrom_YUV422H_4Y_To_NV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size); extern void ConvertFrom_YUV422V_4Y_To_NV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size); #define HUFF_ROW_API // enable new huffman functions, to improve performance #define DCT_QUANT_INV8x8To1x1LS(pMCUBuf, dst, qtbl)\ {\ int val = (((pMCUBuf[0] * qtbl[0]) >> 3) + 128);\ dst[0] = (uint8_t)(val > 255 ? 255 : (val < 0 ? 0 : val));\ } CJPEGDecoder::CJPEGDecoder(void) : m_dst() { Reset(); return; } // ctor CJPEGDecoder::~CJPEGDecoder(void) { Clean(); return; } // dtor void CJPEGDecoder::Reset(void) { m_jpeg_width = 0; m_jpeg_height = 0; m_jpeg_ncomp = 0; m_jpeg_precision = 8; m_jpeg_sampling = JS_OTHER; m_jpeg_color = JC_UNKNOWN; m_jpeg_quality = 100; m_jpeg_mode = JPEG_UNKNOWN; m_jpeg_dct_scale = JD_1_1; m_dd_factor = 1; m_jpeg_comment_detected = 0; m_jpeg_comment = 0; m_jpeg_comment_size = 0; m_jfif_app0_detected = 0; m_jfif_app0_major = 0; m_jfif_app0_minor = 0; m_jfif_app0_units = 0; m_jfif_app0_xDensity = 0; m_jfif_app0_yDensity = 0; m_jfif_app0_thumb_width = 0; m_jfif_app0_thumb_height = 0; m_jfxx_app0_detected = 0; m_jfxx_thumbnails_type = 0; m_avi1_app0_detected = 0; m_avi1_app0_polarity = 0; m_avi1_app0_reserved = 0; m_avi1_app0_field_size = 0; m_avi1_app0_field_size2 = 0; m_exif_app1_detected = 0; m_exif_app1_data_size = 0; m_exif_app1_data = 0; m_adobe_app14_detected = 0; m_adobe_app14_version = 0; m_adobe_app14_flags0 = 0; m_adobe_app14_flags1 = 0; m_adobe_app14_transform = 0; m_precision = 0; m_max_hsampling = 0; m_max_vsampling = 0; m_numxMCU = 0; m_numyMCU = 0; m_mcuWidth = 0; m_mcuHeight = 0; m_ccWidth = 0; m_ccHeight = 0; m_xPadding = 0; m_yPadding = 0; m_rst_go = 0; m_mcu_decoded = 0; m_mcu_to_decode = 0; m_restarts_to_go = 0; m_next_restart_num = 0; m_sos_len = 0; m_curr_comp_no = 0; m_num_scans = 0; for(int i = 0; i < MAX_SCANS_PER_FRAME; i++) { m_scans[i].scan_no = i; m_scans[i].jpeg_restart_interval = 0; m_scans[i].min_h_factor = 0; m_scans[i].min_v_factor = 0; m_scans[i].numxMCU = 0; m_scans[i].numyMCU = 0; m_scans[i].mcuWidth = 0; m_scans[i].mcuHeight = 0; m_scans[i].xPadding = 0; m_scans[i].yPadding = 0; m_scans[i].ncomps = 0; m_scans[i].first_comp = 0; } m_curr_scan = &m_scans[0]; m_ss = 0; m_se = 0; m_al = 0; m_ah = 0; m_dc_scan_completed = 0; m_ac_scans_completed = 0; m_init_done = 0; m_marker = JM_NONE; m_block_buffer = 0; m_block_buffer_size = 0; m_num_threads = 0; m_nblock = 0; m_use_qdct = 0; m_sof_find = 0; #ifdef __TIMING__ m_clk_dct = 0; m_clk_dct1x1 = 0; m_clk_dct2x2 = 0; m_clk_dct4x4 = 0; m_clk_dct8x8 = 0; m_clk_ss = 0; m_clk_cc = 0; m_clk_diff = 0; m_clk_huff = 0; #endif return; } // CJPEGDecoder::Reset(void) #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::Clean(void) { int i; m_jpeg_comment_detected = 0; if(0 != m_jpeg_comment) { free(m_jpeg_comment); m_jpeg_comment = 0; m_jpeg_comment_size = 0; } m_avi1_app0_detected = 0; m_avi1_app0_polarity = 0; m_avi1_app0_reserved = 0; m_avi1_app0_field_size = 0; m_avi1_app0_field_size2 = 0; m_jfif_app0_detected = 0; m_jfxx_app0_detected = 0; m_exif_app1_detected = 0; if(0 != m_exif_app1_data) { free(m_exif_app1_data); m_exif_app1_data = 0; } m_adobe_app14_detected = 0; m_curr_scan->ncomps = 0; m_init_done = 0; for(i = 0; i < MAX_COMPS_PER_SCAN; i++) { if(0 != m_ccomp[i].m_curr_row) { free(m_ccomp[i].m_curr_row); m_ccomp[i].m_curr_row = 0; } if(0 != m_ccomp[i].m_prev_row) { free(m_ccomp[i].m_prev_row); m_ccomp[i].m_prev_row = 0; } } for(i = 0; i < MAX_HUFF_TABLES; i++) { m_dctbl[i].Destroy(); m_actbl[i].Destroy(); } if(0 != m_block_buffer) { free(m_block_buffer); m_block_buffer = 0; } m_block_buffer_size = 0; m_state.Destroy(); return JPEG_OK; } // CJPEGDecoder::Clean() #endif // MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::SetDestination( uint8_t* pDst, int dstStep, mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling, int dstPrecision, JDD dstDctScale) { if(0 == pDst) return JPEG_ERR_PARAMS; if(0 > dstStep) return JPEG_ERR_PARAMS; if(dstChannels <= 0 || dstChannels > 4) return JPEG_ERR_PARAMS; if(dstPrecision <= 0 || dstPrecision != m_jpeg_precision) return JPEG_ERR_PARAMS; m_dst.p.Data8u[0] = pDst; m_dst.lineStep[0] = dstStep; m_dst.width = dstSize.width; m_dst.height = dstSize.height; m_dst.nChannels = dstChannels; m_dst.color = dstColor; m_dst.sampling = dstSampling; m_dst.precision = dstPrecision; m_jpeg_dct_scale = dstDctScale; m_dst.order = JD_PIXEL; return JPEG_OK; } // CJPEGDecoder::SetDestination() JERRCODE CJPEGDecoder::SetDestination( int16_t* pDst, int dstStep, mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling, int dstPrecision) { m_dst.p.Data16s[0] = pDst; m_dst.lineStep[0] = dstStep; m_dst.width = dstSize.width; m_dst.height = dstSize.height; m_dst.nChannels = dstChannels; m_dst.color = dstColor; m_dst.sampling = dstSampling; m_dst.precision = dstPrecision; m_dst.order = JD_PIXEL; return JPEG_OK; } // CJPEGDecoder::SetDestination() JERRCODE CJPEGDecoder::SetDestination( uint8_t* pDst[], int dstStep[], mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling, int dstPrecision, JDD dstDctScale) { m_dst.p.Data8u[0] = pDst[0]; m_dst.p.Data8u[1] = pDst[1]; m_dst.p.Data8u[2] = pDst[2]; m_dst.p.Data8u[3] = pDst[3]; m_dst.lineStep[0] = dstStep[0]; m_dst.lineStep[1] = dstStep[1]; m_dst.lineStep[2] = dstStep[2]; m_dst.lineStep[3] = dstStep[3]; m_dst.order = JD_PLANE; m_dst.width = dstSize.width; m_dst.height = dstSize.height; m_dst.nChannels = dstChannels; m_dst.color = dstColor; m_dst.sampling = dstSampling; m_dst.precision = dstPrecision; m_jpeg_dct_scale = dstDctScale; return JPEG_OK; } // CJPEGDecoder::SetDestination() JERRCODE CJPEGDecoder::SetDestination( int16_t* pDst[], int dstStep[], mfxSize dstSize, int dstChannels, JCOLOR dstColor, JSS dstSampling, int dstPrecision) { m_dst.p.Data16s[0] = pDst[0]; m_dst.p.Data16s[1] = pDst[1]; m_dst.p.Data16s[2] = pDst[2]; m_dst.p.Data16s[3] = pDst[3]; m_dst.lineStep[0] = dstStep[0]; m_dst.lineStep[1] = dstStep[1]; m_dst.lineStep[2] = dstStep[2]; m_dst.lineStep[3] = dstStep[3]; m_dst.order = JD_PLANE; m_dst.width = dstSize.width; m_dst.height = dstSize.height; m_dst.nChannels = dstChannels; m_dst.color = dstColor; m_dst.sampling = dstSampling; m_dst.precision = dstPrecision; return JPEG_OK; } // CJPEGDecoder::SetDestination() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::ProcessRestart(void) { JERRCODE jerr; int status; status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { LOG0("Error: mfxiDecodeHuffmanStateInit_JPEG_8u() failed"); return JPEG_ERR_INTERNAL; } for(int n = 0; n < m_jpeg_ncomp; n++) { m_ccomp[n].m_lastDC = 0; } jerr = ParseRST(); if(JPEG_OK != jerr) { LOG0("Error: ParseRST() failed"); return jerr; } m_rst_go = 1; m_restarts_to_go = m_curr_scan->jpeg_restart_interval; return JPEG_OK; } // CJPEGDecoder::ProcessRestart() #endif // MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::ParseAPP1(void) { int i; int b0, b1, b2, b3, b4; int len; JERRCODE jerr; TRC0("-> APP0"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.CheckByte(0,&b0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(1,&b1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(2,&b2); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(3,&b3); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(4,&b4); if(JPEG_OK != jerr) return jerr; if(b0 == 0x45 && // E b1 == 0x78 && // x b2 == 0x69 && // i b3 == 0x66 && // f b4 == 0) { m_exif_app1_detected = 1; m_exif_app1_data_size = len; jerr = m_BitStreamIn.Seek(6); if(JPEG_OK != jerr) return jerr; len -= 6; if(m_exif_app1_data != 0) { free(m_exif_app1_data); m_exif_app1_data = 0; } m_exif_app1_data = (uint8_t*)malloc(len); if(0 == m_exif_app1_data) return JPEG_ERR_ALLOC; for(i = 0; i < len; i++) { jerr = m_BitStreamIn.ReadByte(&b0); if(JPEG_OK != jerr) return jerr; m_exif_app1_data[i] = (uint8_t)b0; } } else { jerr = m_BitStreamIn.Seek(len); if(JPEG_OK != jerr) return jerr; } m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoder::ParseAPP1() JERRCODE CJPEGDecoder::ParseCOM(void) { int i; int c; int len; JERRCODE jerr; TRC0("-> COM"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; TRC1(" bytes for comment - ",len); m_jpeg_comment_detected = 1; m_jpeg_comment_size = len; if(m_jpeg_comment != 0) { free(m_jpeg_comment); } m_jpeg_comment = (uint8_t*)malloc(len+1); if(0 == m_jpeg_comment) return JPEG_ERR_ALLOC; for(i = 0; i < len; i++) { jerr = m_BitStreamIn.ReadByte(&c); if(JPEG_OK != jerr) return jerr; m_jpeg_comment[i] = (uint8_t)c; } m_jpeg_comment[len] = 0; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoder::ParseCOM() JERRCODE CJPEGDecoder::ParseSOF2(void) { int i; int len; CJPEGColorComponent* curr_comp; JERRCODE jerr; TRC0("-> SOF2"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision); if(JPEG_OK != jerr) return jerr; if(m_jpeg_precision != 8) { return JPEG_NOT_IMPLEMENTED; } jerr = m_BitStreamIn.ReadWord(&m_jpeg_height); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_jpeg_width); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp); if(JPEG_OK != jerr) return jerr; TRC1(" height - ",m_jpeg_height); TRC1(" width - ",m_jpeg_width); TRC1(" nchannels - ",m_jpeg_ncomp); if(m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN) { return JPEG_ERR_SOF_DATA; } len -= 6; if(len != m_jpeg_ncomp * 3) { return JPEG_ERR_SOF_DATA; } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id); if(JPEG_OK != jerr) return jerr; curr_comp->m_comp_no = i; int ss; jerr = m_BitStreamIn.ReadByte(&ss); if(JPEG_OK != jerr) return jerr; curr_comp->m_hsampling = (ss >> 4) & 0x0f; curr_comp->m_vsampling = (ss ) & 0x0f; if(m_jpeg_ncomp == 1) { curr_comp->m_hsampling = 1; curr_comp->m_vsampling = 1; } jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector); if(JPEG_OK != jerr) return jerr; if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0) { return JPEG_ERR_SOF_DATA; } // num of DU block per component curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling; // num of DU blocks per frame m_nblock += curr_comp->m_nblocks; TRC1(" id ",curr_comp->m_id); TRC1(" hsampling - ",curr_comp->m_hsampling); TRC1(" vsampling - ",curr_comp->m_vsampling); TRC1(" qselector - ",curr_comp->m_q_selector); } jerr = DetectSampling(); if(JPEG_OK != jerr) { return jerr; } m_max_hsampling = m_ccomp[0].m_hsampling; m_max_vsampling = m_ccomp[0].m_vsampling; for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; if(m_max_hsampling < curr_comp->m_hsampling) m_max_hsampling = curr_comp->m_hsampling; if(m_max_vsampling < curr_comp->m_vsampling) m_max_vsampling = curr_comp->m_vsampling; } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling; curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling; } m_jpeg_mode = JPEG_PROGRESSIVE; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoder::ParseSOF2() JERRCODE CJPEGDecoder::ParseSOF3(void) { int i; int len; CJPEGColorComponent* curr_comp; JERRCODE jerr; TRC0("-> SOF3"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision); if(JPEG_OK != jerr) return jerr; if(m_jpeg_precision < 2 || m_jpeg_precision > 16) { return JPEG_ERR_SOF_DATA; } jerr = m_BitStreamIn.ReadWord(&m_jpeg_height); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_jpeg_width); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp); if(JPEG_OK != jerr) return jerr; TRC1(" height - ",m_jpeg_height); TRC1(" width - ",m_jpeg_width); TRC1(" nchannels - ",m_jpeg_ncomp); len -= 6; if(len != m_jpeg_ncomp * 3) { // too short frame segment // need to have 3 bytes per component for parameters return JPEG_ERR_SOF_DATA; } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id); if(JPEG_OK != jerr) return jerr; int ss; jerr = m_BitStreamIn.ReadByte(&ss); if(JPEG_OK != jerr) return jerr; curr_comp->m_hsampling = (ss >> 4) & 0x0f; curr_comp->m_vsampling = (ss ) & 0x0f; if(m_jpeg_ncomp == 1) { curr_comp->m_hsampling = 1; curr_comp->m_vsampling = 1; } jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector); if(JPEG_OK != jerr) return jerr; if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0) { return JPEG_ERR_SOF_DATA; } // num of DU block per component curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling; // num of DU blocks per frame m_nblock += curr_comp->m_nblocks; TRC1(" id ",curr_comp->m_id); TRC1(" hsampling - ",curr_comp->m_hsampling); TRC1(" vsampling - ",curr_comp->m_vsampling); TRC1(" qselector - ",curr_comp->m_q_selector); } jerr = DetectSampling(); if(JPEG_OK != jerr) { return jerr; } m_max_hsampling = m_ccomp[0].m_hsampling; m_max_vsampling = m_ccomp[0].m_vsampling; for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; if(m_max_hsampling < curr_comp->m_hsampling) m_max_hsampling = curr_comp->m_hsampling; if(m_max_vsampling < curr_comp->m_vsampling) m_max_vsampling = curr_comp->m_vsampling; } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling; curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling; } m_jpeg_mode = JPEG_LOSSLESS; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoder::ParseSOF3() JERRCODE CJPEGDecoder::ParseRST(void) { JERRCODE jerr; TRC0("-> RST"); if(m_marker == 0xff) { jerr = m_BitStreamIn.Seek(-1); if(JPEG_OK != jerr) return jerr; m_marker = JM_NONE; } if(m_marker == JM_NONE) { jerr = NextMarker(&m_marker); if(JPEG_OK != jerr) { LOG0("Error: NextMarker() failed"); return jerr; } } TRC1("restart interval ",m_next_restart_num); if(m_marker == ((int)JM_RST0 + m_next_restart_num)) { m_marker = JM_NONE; } else { LOG1(" - got marker - ",m_marker); LOG1(" - but expected - ",(int)JM_RST0 + m_next_restart_num); m_marker = JM_NONE; // return JPEG_ERR_RST_DATA; } // Update next-restart state m_next_restart_num = (m_next_restart_num + 1) & 7; return JPEG_OK; } // CJPEGDecoder::ParseRST() JERRCODE CJPEGDecoder::ParseData() { int32_t i; JERRCODE jerr = Init(); if(JPEG_OK != jerr) { return jerr; } switch(m_jpeg_mode) { case JPEG_BASELINE: case JPEG_EXTENDED: { jerr = DecodeScanBaseline(); if(JPEG_OK != jerr) return jerr; } break; case JPEG_PROGRESSIVE: { jerr = DecodeScanProgressive(); m_ac_scans_completed = 0; for(i = 0; i < m_jpeg_ncomp; i++) { m_ac_scans_completed += m_ccomp[i].m_ac_scan_completed; } if(JPEG_OK != jerr || (m_dc_scan_completed != 0 && m_ac_scans_completed == m_jpeg_ncomp)) { int16_t* pMCUBuf; for(i = 0; i < (int) m_numyMCU; i++) { pMCUBuf = m_block_buffer + (i* m_numxMCU * DCTSIZE2* m_nblock); #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif switch (m_jpeg_dct_scale) { case JD_1_1: { jerr = ReconstructMCURowBL8x8(pMCUBuf, 0, m_numxMCU); } break; case JD_1_2: { jerr = ReconstructMCURowBL8x8To4x4(pMCUBuf, 0, m_numxMCU); } break; case JD_1_4: { jerr = ReconstructMCURowBL8x8To2x2(pMCUBuf, 0, m_numxMCU); } break; case JD_1_8: { jerr = ReconstructMCURowBL8x8To1x1(pMCUBuf, 0, m_numxMCU); } break; default: break; } if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif if(JD_PIXEL == m_dst.order) // pixel by pixel order { #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = UpSampling(i, 0, m_numxMCU); if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_ss += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ColorConvert(i, 0, m_numxMCU); if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_cc += c1 - c0; #endif } else // plane order { if(m_jpeg_precision == 8) { jerr = ProcessBuffer(i); if(JPEG_OK != jerr) return jerr; } else return JPEG_NOT_IMPLEMENTED; //not support 16-bit PLANE image } } } } break; case JPEG_LOSSLESS: if(m_curr_scan->ncomps == m_jpeg_ncomp) { jerr = DecodeScanLosslessIN(); if(JPEG_OK != jerr) return jerr; } else { jerr = DecodeScanLosslessNI(); if(JPEG_OK != jerr) return jerr; if(m_ac_scans_completed == m_jpeg_ncomp) { int16_t* pMCUBuf = m_block_buffer; for(i = 0; i < (int) m_numyMCU; i++) { if(m_curr_scan->jpeg_restart_interval && i*m_numxMCU % m_curr_scan->jpeg_restart_interval == 0) m_rst_go = 1; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ReconstructMCURowLS(pMCUBuf, i); if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_diff += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ColorConvert(i, 0, m_numxMCU); if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_cc += c1 - c0; #endif m_rst_go = 0; } // for m_numyMCU } } break; default: jerr = JPEG_ERR_INTERNAL; break; } // m_jpeg_mode if(JPEG_OK != jerr) return jerr; return JPEG_OK; } JERRCODE CJPEGDecoder::FindNextImage() { #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif JERRCODE jerr = JPEG_OK; m_marker = JM_NONE; for(;;) { if(JM_NONE == m_marker) { jerr = NextMarker(&m_marker); if(JPEG_OK != jerr) { return jerr; } } switch(m_marker) { case JM_EOI: jerr = ParseEOI(); goto Exit; case JM_RST0: case JM_RST1: case JM_RST2: case JM_RST3: case JM_RST4: case JM_RST5: case JM_RST6: case JM_RST7: jerr = ParseRST(); if(JPEG_OK != jerr) { return jerr; } break; case JM_SOS: break; default: TRC1("-> Unknown marker ",m_marker); TRC0("..Skipping"); jerr = SkipMarker(); if(JPEG_OK != jerr) return jerr; break; } } Exit: return jerr; } // JERRCODE CJPEGDecoder::FindNextImage() JERRCODE CJPEGDecoder::ParseJPEGBitStream(JOPERATION op) { #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif JERRCODE jerr = JPEG_OK; m_marker = JM_NONE; for(;;) { if(JM_NONE == m_marker) { jerr = NextMarker(&m_marker); if(JPEG_OK != jerr) { return jerr; } } switch(m_marker) { case JM_SOI: jerr = ParseSOI(); if(JPEG_OK != jerr) { return jerr; } break; case JM_APP0: jerr = ParseAPP0(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_APP1: jerr = ParseAPP1(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_APP14: jerr = ParseAPP14(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_COM: jerr = ParseCOM(); if(JPEG_OK != jerr) { return jerr; } break; case JM_DQT: jerr = ParseDQT(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOF0: jerr = ParseSOF0(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOF1: //jerr = ParseSOF1(); //if(JPEG_OK != jerr) //{ // return jerr; //} //break; return JPEG_NOT_IMPLEMENTED; case JM_SOF2: //jerr = ParseSOF2(); //if(JPEG_OK != jerr) //{ // return jerr; //} //break; return JPEG_NOT_IMPLEMENTED; case JM_SOF3: //jerr = ParseSOF3(); //if(JPEG_OK != jerr) //{ // return jerr; //} //break; return JPEG_NOT_IMPLEMENTED; case JM_SOF5: case JM_SOF6: case JM_SOF7: case JM_SOF9: case JM_SOFA: case JM_SOFB: case JM_SOFD: case JM_SOFE: case JM_SOFF: return JPEG_NOT_IMPLEMENTED; case JM_DHT: jerr = ParseDHT(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_DRI: jerr = ParseDRI(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOS: jerr = ParseSOS(op); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } if(JO_READ_HEADER == op) { if(m_BitStreamIn.GetCurrPos() - (m_sos_len + 2) != 0) { jerr = m_BitStreamIn.Seek(-(m_sos_len + 2)); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } } else { m_BitStreamIn.SetCurrPos(0); } // stop here, when we are reading header return JPEG_OK; } if(JO_READ_DATA == op) { jerr = ParseData(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } } break; // actually, it should never happen, because in a single threaded // application RTSm markers go with SOS data. Multithreaded application // don't call this function and process NAL unit by unit separately. /* case JM_RST0: case JM_RST1: case JM_RST2: case JM_RST3: case JM_RST4: case JM_RST5: case JM_RST6: case JM_RST7: jerr = ParseRST(); if(JPEG_OK != jerr) { return jerr; } m_rst_go = 1; m_restarts_to_go = m_curr_scan->jpeg_restart_interval; if(JO_READ_DATA == op) { jerr = ParseData(); if(JPEG_OK != jerr) return jerr; } break;*/ case JM_EOI: jerr = ParseEOI(); goto Exit; default: TRC1("-> Unknown marker ",m_marker); TRC0("..Skipping"); SetDecodeErrorTypes(); jerr = SkipMarker(); if(JPEG_OK != jerr) return jerr; break; } } Exit: return jerr; } // CJPEGDecoder::ParseJPEGBitStream() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::Init(void) { int i; int tr_buf_size = 0; CJPEGColorComponent* curr_comp; JERRCODE jerr; if(m_init_done) return JPEG_OK; m_num_threads = get_num_threads(); // need to add support for images with more than 4 components per frame if(m_dst.precision <= 8) { switch (m_jpeg_dct_scale) { case JD_1_1: default: { m_dd_factor = 1; } break; case JD_1_2: { m_dd_factor = 2; } break; case JD_1_4: { m_dd_factor = 4; } break; case JD_1_8: { m_dd_factor = 8; } break; } } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; switch(m_jpeg_mode) { case JPEG_BASELINE: case JPEG_EXTENDED: { int ds = (m_dst.precision <= 8) ? sizeof(uint8_t) : sizeof(int16_t); int lnz_ds = curr_comp->m_vsampling * curr_comp->m_hsampling; curr_comp->m_lnz_bufsize = lnz_ds * m_numxMCU; curr_comp->m_lnz_ds = lnz_ds; curr_comp->m_cc_height = m_mcuHeight; curr_comp->m_cc_step = m_numxMCU * m_mcuWidth * ds; curr_comp->m_ss_height = curr_comp->m_cc_height / curr_comp->m_v_factor; curr_comp->m_ss_step = curr_comp->m_cc_step / curr_comp->m_h_factor; if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { curr_comp->m_ss_height += 2; // add border lines (top and bottom) } tr_buf_size = m_numxMCU * m_nblock * DCTSIZE2 * sizeof(int16_t) * m_num_threads; break; } // JPEG_BASELINE case JPEG_PROGRESSIVE: { int lnz_ds = curr_comp->m_vsampling * curr_comp->m_hsampling; curr_comp->m_lnz_bufsize = lnz_ds * m_numxMCU; curr_comp->m_lnz_ds = lnz_ds; curr_comp->m_cc_height = m_mcuHeight; curr_comp->m_cc_step = m_numxMCU * m_mcuWidth; curr_comp->m_ss_height = curr_comp->m_cc_height / curr_comp->m_v_factor; curr_comp->m_ss_step = curr_comp->m_cc_step / curr_comp->m_h_factor; if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { curr_comp->m_ss_height += 2; // add border lines (top and bottom) } tr_buf_size = m_numxMCU * m_numyMCU * m_nblock * DCTSIZE2 * sizeof(int16_t); break; } // JPEG_PROGRESSIVE case JPEG_LOSSLESS: { int lnz_ds = curr_comp->m_vsampling * curr_comp->m_hsampling; curr_comp->m_lnz_bufsize = lnz_ds * m_numxMCU; curr_comp->m_lnz_ds = lnz_ds; curr_comp->m_cc_height = m_mcuHeight; curr_comp->m_cc_step = m_numxMCU * m_mcuWidth * sizeof(int16_t); curr_comp->m_ss_height = curr_comp->m_cc_height / curr_comp->m_v_factor; curr_comp->m_ss_step = curr_comp->m_cc_step / curr_comp->m_h_factor; if(m_curr_scan->ncomps == m_jpeg_ncomp) tr_buf_size = m_numxMCU * m_nblock * sizeof(int16_t); else tr_buf_size = m_numxMCU * m_numyMCU * m_nblock * sizeof(int16_t); curr_comp->m_curr_row = (int16_t*)malloc(curr_comp->m_cc_step * sizeof(int16_t)); if(0 == curr_comp->m_curr_row) return JPEG_ERR_ALLOC; curr_comp->m_prev_row = (int16_t*)malloc(curr_comp->m_cc_step * sizeof(int16_t)); if(0 == curr_comp->m_prev_row) return JPEG_ERR_ALLOC; break; } // JPEG_LOSSLESS default: return JPEG_ERR_PARAMS; } // m_jpeg_mode // color convert buffer jerr = curr_comp->CreateBufferCC(m_num_threads); if(JPEG_OK != jerr) return jerr; jerr = curr_comp->CreateBufferSS(m_num_threads); if(JPEG_OK != jerr) return jerr; jerr = curr_comp->CreateBufferLNZ(m_num_threads); if(JPEG_OK != jerr) return jerr; } // m_jpeg_ncomp if(0 == m_block_buffer) { m_block_buffer = (int16_t*)malloc(tr_buf_size); if(0 == m_block_buffer) { return JPEG_ERR_ALLOC; } m_block_buffer_size = tr_buf_size; memset((uint8_t*)m_block_buffer, 0, tr_buf_size); } m_state.Create(); m_init_done = 1; return JPEG_OK; } // CJPEGDecoder::Init() #endif // MFX_ENABLE_JPEG_SW_FALLBACK static uint32_t JPEG_BPP[JC_MAX] = { 1, // JC_UNKNOWN = 0, 1, // JC_GRAY = 1, 3, // JC_RGB = 2, 3, // JC_BGR = 3, 2, // JC_YCBCR = 4, 4, // JC_CMYK = 5, 4, // JC_YCCK = 6, 4, // JC_BGRA = 7, 4, // JC_RGBA = 8, 1, // JC_IMC3 = 9, 1 //JC_NV12 = 10 }; #define iRY 0x00004c8b #define iGY 0x00009646 #define iBY 0x00001d2f #define iRu 0x00002b33 #define iGu 0x000054cd #define iBu 0x00008000 #define iGv 0x00006b2f #define iBv 0x000014d1 JERRCODE CJPEGDecoder::ColorConvert(uint32_t rowMCU, uint32_t colMCU, uint32_t maxMCU) { int cc_h; mfxSize roi; int status; uint32_t bpp; cc_h = m_curr_scan->mcuHeight * m_curr_scan->min_v_factor; if (rowMCU == m_curr_scan->numyMCU - 1) { cc_h -= m_curr_scan->yPadding; } roi.height = (cc_h + m_dd_factor - 1) / m_dd_factor; roi.width = (maxMCU - colMCU) * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; if (maxMCU == m_curr_scan->numxMCU) { roi.width -= m_curr_scan->xPadding; } if(roi.height == 0) return JPEG_OK; if(JC_RGB == m_jpeg_color && (JC_BGRA == m_dst.color || m_jpeg_ncomp != m_curr_scan->ncomps)) { int srcStep; uint8_t* pSrc8u[3]; int dstStep; uint8_t* pDst8u; srcStep = m_ccomp[0].m_cc_step; pSrc8u[0] = m_ccomp[0].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pSrc8u[1] = m_ccomp[1].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pSrc8u[2] = m_ccomp[2].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; dstStep = m_dst.lineStep[0]; bpp = JPEG_BPP[m_dst.color % JC_MAX]; pDst8u = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor * bpp; for(int n = m_curr_scan->first_comp; n < m_curr_scan->first_comp + m_curr_scan->ncomps; n++) { for(int i=0; i (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pSrc8u[1] = m_ccomp[1].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor / 2; pSrc8u[2] = m_ccomp[2].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor / 2; dstStep[0] = m_dst.lineStep[0]; dstStep[1] = m_dst.lineStep[1]; pDst8u[0] = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[0] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pDst8u[1] = m_dst.p.Data8u[1] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[1] / (2 * m_dd_factor) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; for(int n = m_curr_scan->first_comp; n < m_curr_scan->first_comp + m_curr_scan->ncomps; n++) { if(n == 0) { for(int i=0; i> 1; i++) for(int j=0; j < roi.width >> 1; j++) { pDst8u[1][i*dstStep[1] + j * 2 + n - 1] = pSrc8u[n][i*srcStep[n] + j]; } } } } else if(JC_YCBCR == m_jpeg_color && JC_YCBCR == m_dst.color && JS_444 == m_dst.sampling && m_jpeg_ncomp != m_curr_scan->ncomps) { int srcStep[3]; uint8_t* pSrc8u[3]; int dstStep[3]; uint8_t* pDst8u[3]; srcStep[0] = m_ccomp[0].m_cc_step; srcStep[1] = m_ccomp[0].m_cc_step; srcStep[2] = m_ccomp[0].m_cc_step; pSrc8u[0] = m_ccomp[0].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pSrc8u[1] = m_ccomp[1].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pSrc8u[2] = m_ccomp[2].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; dstStep[0] = m_dst.lineStep[0]; dstStep[1] = m_dst.lineStep[1]; dstStep[2] = m_dst.lineStep[2]; pDst8u[0] = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[0] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pDst8u[1] = m_dst.p.Data8u[1] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[1] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pDst8u[2] = m_dst.p.Data8u[2] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[2] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; for(int n = m_curr_scan->first_comp; n < m_curr_scan->first_comp + m_curr_scan->ncomps; n++) { for(int i=0; i (0) + colMCU * m_curr_scan->mcuWidth; dstStep = m_dst.lineStep[0]; bpp = JPEG_BPP[m_dst.color % JC_MAX]; pDst8u = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor * bpp; for(int i=0; i (colMCU); dstStep[0] = m_dst.lineStep[0]; dstStep[1] = m_dst.lineStep[1]; pDst8u[0] = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[0] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pDst8u[1] = m_dst.p.Data8u[1] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[1] / (2 * m_dd_factor) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; for(int i=0; i> 1; i++) for(int j=0; jncomps) { if (JC_RGB == m_jpeg_color && JC_NV12 == m_dst.color) { int srcStep; uint8_t* pSrc8u[3]; int dstStep[2]; uint8_t* pDst8u[2]; int r0,r1,r2,r3, g0,g1,g2,g3, b0,b1,b2,b3; srcStep = m_ccomp[0].m_cc_step; pSrc8u[0] = m_ccomp[0].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; pSrc8u[1] = m_ccomp[1].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; pSrc8u[2] = m_ccomp[2].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; dstStep[0] = m_dst.lineStep[0]; dstStep[1] = m_dst.lineStep[1]; pDst8u[0] = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[0] / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; pDst8u[1] = m_dst.p.Data8u[1] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep[1] / (2 * m_dd_factor) + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor; for(int i=0; i> 1; i++) for(int j=0; j> 1; j++) { r0 = pSrc8u[0][ (i<<1) *srcStep + (j<<1) ]; g0 = pSrc8u[1][ (i<<1) *srcStep + (j<<1) ]; b0 = pSrc8u[2][ (i<<1) *srcStep + (j<<1) ]; r1 = pSrc8u[0][ (i<<1) *srcStep + (j<<1)+1]; g1 = pSrc8u[1][ (i<<1) *srcStep + (j<<1)+1]; b1 = pSrc8u[2][ (i<<1) *srcStep + (j<<1)+1]; r2 = pSrc8u[0][((i<<1)+1)*srcStep + (j<<1) ]; g2 = pSrc8u[1][((i<<1)+1)*srcStep + (j<<1) ]; b2 = pSrc8u[2][((i<<1)+1)*srcStep + (j<<1) ]; r3 = pSrc8u[0][((i<<1)+1)*srcStep + (j<<1)+1]; g3 = pSrc8u[1][((i<<1)+1)*srcStep + (j<<1)+1]; b3 = pSrc8u[2][((i<<1)+1)*srcStep + (j<<1)+1]; pDst8u[0][ (i<<1) *dstStep[0] + (j<<1) ] = (uint8_t)(( iRY*r0 + iGY*g0 + iBY*b0 + 0x008000) >> 16); pDst8u[0][ (i<<1) *dstStep[0] + (j<<1)+1] = (uint8_t)(( iRY*r1 + iGY*g1 + iBY*b1 + 0x008000) >> 16); pDst8u[0][((i<<1)+1)*dstStep[0] + (j<<1) ] = (uint8_t)(( iRY*r2 + iGY*g2 + iBY*b2 + 0x008000) >> 16); pDst8u[0][((i<<1)+1)*dstStep[0] + (j<<1)+1] = (uint8_t)(( iRY*r3 + iGY*g3 + iBY*b3 + 0x008000) >> 16); r0 = r0+r1+r2+r3; g0 = g0+g1+g2+g3; b0 = b0+b1+b2+b3; pDst8u[1][i*dstStep[1] + (j<<1) ] = (uint8_t)((-iRu*r0 - iGu*g0 + iBu*b0 + 0x2000000) >> 18); pDst8u[1][i*dstStep[1] + (j<<1)+1] = (uint8_t)(( iBu*r0 - iGv*g0 - iBv*b0 + 0x2000000) >> 18); } } else if (JC_YCBCR == m_jpeg_color && JC_BGRA == m_dst.color) { int srcStep; const uint8_t* pSrc8u[3]; int dstStep; uint8_t* pDst8u; srcStep = m_ccomp[0].m_cc_step; pSrc8u[0] = m_ccomp[0].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; pSrc8u[1] = m_ccomp[1].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; pSrc8u[2] = m_ccomp[2].GetCCBufferPtr (0) + colMCU * m_curr_scan->mcuWidth; dstStep = m_dst.lineStep[0]; bpp = JPEG_BPP[m_dst.color % JC_MAX]; pDst8u = m_dst.p.Data8u[0] + rowMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor * dstStep / m_dd_factor + colMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor * bpp; status = mfxiYCbCrToBGR_JPEG_8u_P3C4R(pSrc8u, srcStep, pDst8u, dstStep, roi, 0xFF); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiYCbCrToBGR_JPEG_8u_P3C3R() failed - ",status); return JPEG_ERR_INTERNAL; } } } return JPEG_OK; } // JERRCODE CJPEGDecoder::ColorConvert(uint32_t rowCMU, uint32_t colMCU, uint32_t maxMCU) JERRCODE CJPEGDecoder::UpSampling(uint32_t rowMCU, uint32_t colMCU, uint32_t maxMCU) { int i, j, k, n, c; int need_upsampling; CJPEGColorComponent* curr_comp; int status; // if image format is YCbCr and destination format is NV12 need special upsampling (see below) if(JC_YCBCR != m_jpeg_color || JC_NV12 != m_dst.color) { for(k = m_curr_scan->first_comp; k < m_curr_scan->first_comp + m_curr_scan->ncomps; k++) { curr_comp = &m_ccomp[k]; need_upsampling = curr_comp->m_need_upsampling; // sampling 444 // nothing to do for 444 // sampling 422H if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 1 && need_upsampling) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; uint32_t srcWidth, intervalSize, tileSize, pixelToProcess; need_upsampling = 0; srcWidth = (maxMCU - colMCU) * 8 * curr_comp->m_scan_hsampling; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU * curr_comp->m_scan_hsampling; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * curr_comp->m_h_factor; intervalSize = m_curr_scan->jpeg_restart_interval ? m_curr_scan->jpeg_restart_interval * 8 * curr_comp->m_scan_hsampling : srcWidth / m_dd_factor; tileSize = (m_curr_scan->jpeg_restart_interval && !colMCU) ? (m_curr_scan->jpeg_restart_interval - (m_curr_scan->numxMCU * rowMCU) % m_curr_scan->jpeg_restart_interval)* 8 * curr_comp->m_scan_hsampling : intervalSize; for(i = 0; i < m_mcuHeight / m_dd_factor; i++) { j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1(pSrc + j, pixelToProcess , pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } pSrc += srcStep; pDst += dstStep; } } // sampling 422V if(curr_comp->m_h_factor == 1 && curr_comp->m_v_factor == 2 && need_upsampling) { int srcStep; uint8_t* pSrc; uint8_t* pDst; uint32_t srcWidth; need_upsampling = 0; srcWidth = (maxMCU - colMCU) * 8 * curr_comp->m_hsampling; srcStep = curr_comp->m_ss_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU * curr_comp->m_scan_hsampling; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * curr_comp->m_h_factor; for(i = 0; i < (m_mcuHeight >> 1) - 1; i++) { status = mfxsCopy_8u(pSrc,pDst,srcWidth); if(ippStsNoErr != status) { LOG0("Error: mfxs_Copy_8u() failed!"); return JPEG_ERR_INTERNAL; } pDst += srcStep; // dstStep is the same as srcStep for(n = 0; n < (int)srcWidth; n++) pDst[n] = (pSrc[n] + pSrc[srcStep + n]) >> 1; pDst += srcStep; // dstStep is the same as srcStep pSrc += srcStep; } status = mfxsCopy_8u(pSrc,pDst,srcWidth); pDst += srcStep; status = mfxsCopy_8u(pSrc,pDst,srcWidth); } // sampling 420 if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2 && need_upsampling) { int ddShift; int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; uint32_t srcWidth, intervalSize, tileSize, pixelToProcess; need_upsampling = 0; srcWidth = (maxMCU - colMCU) * 8 * curr_comp->m_scan_hsampling; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU * curr_comp->m_scan_hsampling; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * curr_comp->m_h_factor; intervalSize = m_curr_scan->jpeg_restart_interval ? m_curr_scan->jpeg_restart_interval * 8 * curr_comp->m_scan_hsampling : srcWidth / m_dd_factor; tileSize = (m_curr_scan->jpeg_restart_interval && !colMCU) ? (m_curr_scan->jpeg_restart_interval - (m_curr_scan->numxMCU * rowMCU) % m_curr_scan->jpeg_restart_interval)* 8 * curr_comp->m_scan_hsampling : intervalSize; // filling the zero row j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1(pSrc + j, pSrc + j, pixelToProcess, pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } pDst += dstStep; ddShift = (m_dd_factor == 1) ? 1 : (m_dd_factor == 2) ? 2 : (m_dd_factor == 4) ? 3 : 4; for(i = 0; i < (m_mcuHeight >> ddShift) - 1; i++) { // filling odd rows j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1(pSrc + j, pSrc + srcStep + j, pixelToProcess, pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } pDst += dstStep; // filling even rows j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1(pSrc + srcStep + j, pSrc + j, pixelToProcess, pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } pDst += dstStep; pSrc += srcStep; } // filling the last row j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { if (pDst > curr_comp->GetCCBufferPtr(0) + (curr_comp->m_cc_bufsize - 1) * sizeof(uint8_t)) { LOG0("Error: CCBuferPtr out of bound!"); return JPEG_ERR_BUFF; } status = mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1(pSrc + j, pSrc + j, pixelToProcess, pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } } // 420 // sampling 411 if(curr_comp->m_h_factor == 4 && curr_comp->m_v_factor == 1 && need_upsampling) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; uint32_t srcWidth, intervalSize, tileSize, pixelToProcess; need_upsampling = 0; srcWidth = (maxMCU - colMCU) * 8 * curr_comp->m_scan_hsampling; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU * curr_comp->m_scan_hsampling; // set the pointer to temporary buffer std::unique_ptr pTmp( new uint8_t[2 * srcWidth / m_dd_factor] ); // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * curr_comp->m_h_factor; intervalSize = m_curr_scan->jpeg_restart_interval ? m_curr_scan->jpeg_restart_interval * 8 * curr_comp->m_scan_hsampling : srcWidth / m_dd_factor; tileSize = (m_curr_scan->jpeg_restart_interval && !colMCU) ? (m_curr_scan->jpeg_restart_interval - (m_curr_scan->numxMCU * rowMCU) % m_curr_scan->jpeg_restart_interval)* 8 * curr_comp->m_scan_hsampling : intervalSize; for(i = 0; i < m_mcuHeight / m_dd_factor; i++) { j = 0; pixelToProcess = std::min(tileSize, srcWidth / m_dd_factor); while(j < (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1(pSrc + j, pixelToProcess, pTmp.get() + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(intervalSize, srcWidth / m_dd_factor - j); } j = 0; pixelToProcess = std::min(2 * tileSize, 2 * srcWidth / m_dd_factor); while(j < 2 * (int) srcWidth / m_dd_factor) { status = mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1(pTmp.get() + j, pixelToProcess, pDst + j * 2); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1() failed!"); return JPEG_ERR_INTERNAL; } j += pixelToProcess; pixelToProcess = std::min(2 * intervalSize, 2 * srcWidth / m_dd_factor - j); } pSrc += srcStep; pDst += dstStep; } } // 411 // arbitrary sampling if((curr_comp->m_h_factor != 1 || curr_comp->m_v_factor != 1) && need_upsampling) { int srcStep; int dstStep; int v_step; int h_step; int val; uint8_t* pSrc; uint8_t* pDst; uint8_t* p; uint32_t srcWidth; srcWidth = (maxMCU - colMCU) * 8 * curr_comp->m_scan_hsampling; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; h_step = curr_comp->m_h_factor; v_step = curr_comp->m_v_factor; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU * curr_comp->m_scan_hsampling; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * curr_comp->m_h_factor; for(n = 0; n < curr_comp->m_ss_height; n++) { p = pDst; for(i = 0; i < (int) srcWidth; i++) { val = pSrc[i]; for(j = 0; j < h_step; j++) pDst[j] = (uint8_t)val; pDst += h_step; } // for i for(c = 0; c < v_step - 1; c++) { status = mfxsCopy_8u(p,pDst,srcWidth); if(ippStsNoErr != status) { LOG0("Error: mfxs_Copy_8u() failed!"); return JPEG_ERR_INTERNAL; } pDst += dstStep; } //for c pDst = p + dstStep*v_step; pSrc += srcStep; } // for n } // if } // for m_jpeg_ncomp } else { // for all scan components for(k = m_curr_scan->first_comp; k < m_curr_scan->first_comp + m_curr_scan->ncomps; k++) { curr_comp = &m_ccomp[k]; // downsampling for both dimentions if(JS_444 == m_jpeg_sampling && k != 0) { int srcStep; int tmpStep; uint8_t* pSrc; uint8_t* pDst; mfxSize srcRoiSize; mfxSize tmpRoiSize; srcStep = curr_comp->m_cc_step; tmpStep = srcStep; // set the pointer to source buffer pSrc = curr_comp->GetCCBufferPtr (0) + 8 * colMCU; // set the pointer to temporary buffer std::unique_ptr pTmp( new uint8_t[tmpStep * m_curr_scan->mcuHeight / 2] ); // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU / 2; // set ROI of source srcRoiSize.width = (maxMCU - colMCU) * 8; srcRoiSize.height = m_curr_scan->mcuHeight; // set ROI of source tmpRoiSize.width = (maxMCU - colMCU) * 8 / 2; tmpRoiSize.height = m_curr_scan->mcuHeight / 2; status = mfxiSampleDownH2V2_JPEG_8u_C1R(pSrc, srcStep, srcRoiSize, pTmp.get(), tmpStep, tmpRoiSize); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleDownH2V2_JPEG_8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } status = mfxsCopy_8u(pTmp.get(), pDst, tmpStep * m_curr_scan->mcuHeight / 2); if(ippStsNoErr != status) { LOG0("Error: mfxs_Copy_8u() failed!"); return JPEG_ERR_INTERNAL; } } // vertical downsampling if(JS_422H == m_jpeg_sampling && k != 0) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; mfxSize srcRoiSize; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU; // set ROI of source srcRoiSize.width = (maxMCU - colMCU) * 8; srcRoiSize.height = m_curr_scan->mcuHeight; for(n = 0; n < srcRoiSize.height / 2; n++) { status = mfxsCopy_8u(pSrc, pDst, srcRoiSize.width); if(ippStsNoErr != status) { LOG0("Error: mfxs_Copy_8u() failed!"); return JPEG_ERR_INTERNAL; } pSrc += 2 * srcStep; pDst += dstStep; } } //horisontal downsampling if(JS_422V == m_jpeg_sampling && k != 0) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; mfxSize srcRoiSize; mfxSize dstRoiSize; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + m_curr_scan->mcuWidth * colMCU; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + m_curr_scan->mcuWidth * colMCU / 2; // set ROI of source srcRoiSize.width = (maxMCU - colMCU) * m_curr_scan->mcuWidth; srcRoiSize.height = 8; // set ROI of destination dstRoiSize.width = (maxMCU - colMCU) * m_curr_scan->mcuWidth / 2; dstRoiSize.height = 8; status = mfxiSampleDownH2V1_JPEG_8u_C1R(pSrc, srcStep, srcRoiSize, pDst, dstStep, dstRoiSize); if(ippStsNoErr != status) { LOG0("Error: mfxiSampleDownH2V2_JPEG_8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } } // just copy data if(JS_420 == m_jpeg_sampling && k != 0) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; mfxSize srcRoiSize; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU; // set ROI of source srcRoiSize.width = (maxMCU - colMCU) * 8; srcRoiSize.height = 8; for(n = 0; n < srcRoiSize.height; n++) { status = mfxsCopy_8u(pSrc, pDst, srcRoiSize.width); if(ippStsNoErr != status) { LOG0("Error: mfxs_Copy_8u() failed!"); return JPEG_ERR_INTERNAL; } pSrc += srcStep; pDst += dstStep; } } // even colomns from even rows, odd colomns from odd rows if(JS_411 == m_jpeg_sampling && k != 0) { int srcStep; int dstStep; uint8_t* pSrc; uint8_t* pDst; mfxSize srcRoiSize; srcStep = curr_comp->m_ss_step; dstStep = curr_comp->m_cc_step; // set the pointer to source buffer pSrc = curr_comp->GetSSBufferPtr (0) + 8 * colMCU; // set the pointer to destination buffer pDst = curr_comp->GetCCBufferPtr (0) + 8 * colMCU * 2; // set ROI of source srcRoiSize.width = (maxMCU - colMCU) * 8; srcRoiSize.height = m_curr_scan->mcuHeight; for(n = 0; n < srcRoiSize.height / 2; n++) { for(i = 0; i < srcRoiSize.width; i++) { pDst[n*dstStep + 2*i ] = pSrc[2*n*srcStep + i]; pDst[n*dstStep + 2*i+1] = pSrc[2*n*srcStep + srcStep + i]; } } } } } return JPEG_OK; } // JERRCODE CJPEGDecoder::UpSampling(uint32_t rowMCU, uint32_t colMCU, uint32_t maxMCU) JERRCODE CJPEGDecoder::ProcessBuffer(int nMCURow, int thread_id) { int c; int yPadd = 0; int srcStep = 0; int dstStep = 0; int copyHeight = 0; int ssHeight; uint8_t* pSrc8u = 0; uint8_t* pDst8u = 0; uint16_t* pSrc16u = 0; uint16_t* pDst16u = 0; mfxSize roi; int status; CJPEGColorComponent* curr_comp; if(m_jpeg_precision <= 8) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; if(curr_comp->m_v_factor == 1 && curr_comp->m_h_factor == 1) { srcStep = curr_comp->m_cc_step; pSrc8u = curr_comp->GetCCBufferPtr(thread_id); copyHeight = curr_comp->m_ss_height; yPadd = m_yPadding; } if(curr_comp->m_v_factor == 2 && curr_comp->m_h_factor == 2) { srcStep = curr_comp->m_ss_step; pSrc8u = curr_comp->GetSSBufferPtr(thread_id); copyHeight = curr_comp->m_ss_height - 2; yPadd = m_yPadding/2; pSrc8u = pSrc8u + srcStep; // skip upper border line } if(curr_comp->m_v_factor == 1 && curr_comp->m_h_factor == 2) { srcStep = curr_comp->m_ss_step; pSrc8u = curr_comp->GetSSBufferPtr(thread_id); copyHeight = curr_comp->m_ss_height; yPadd = m_yPadding; } ssHeight = copyHeight; if(nMCURow == (int) m_numyMCU - 1) { copyHeight -= yPadd; } roi.width = srcStep / m_dd_factor; roi.height = copyHeight / m_dd_factor; if(roi.height == 0) return JPEG_OK; pDst8u = m_dst.p.Data8u[c] + nMCURow * ssHeight * m_dst.lineStep[c] / m_dd_factor; status = mfxiCopy_8u_C1R(pSrc8u, srcStep, pDst8u, m_dst.lineStep[c], roi); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiCopy_8u_C1R() failed - ",status); return JPEG_ERR_INTERNAL; } } } else // 16-bit(>= 8) planar image with YCBCR color and 444 sampling { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; srcStep = curr_comp->m_cc_step; pSrc16u = (uint16_t*)curr_comp->GetCCBufferPtr(thread_id); copyHeight = m_ccHeight; if(nMCURow == (int) m_numyMCU - 1) { copyHeight = m_mcuHeight - m_yPadding; } roi.width = m_dst.width; roi.height = copyHeight; if(roi.height == 0) return JPEG_OK; dstStep = m_dst.lineStep[c]; pDst16u = (uint16_t*)((uint8_t*)m_dst.p.Data16s[c] + nMCURow * m_mcuHeight * dstStep); status = mfxiCopy_16s_C1R((int16_t*)pSrc16u, srcStep, (int16_t*)pDst16u, dstStep, roi); if(ippStsNoErr != status) { LOG1("IPP Error: mfxiCopy_16s_C1R() failed - ",status); return JPEG_ERR_INTERNAL; } } // for c } return JPEG_OK; } // JERRCODE CJPEGDecoder::ProcessBuffer() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::DecodeHuffmanMCURowBL(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int n, k, l; uint32_t j; int srcLen; int currPos; uint8_t* src; JERRCODE jerr; int status; src = m_BitStreamIn.GetDataPtr(); srcLen = m_BitStreamIn.GetDataLen(); for(j = colMCU; j < maxMCU; j++) { if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } for(n = m_curr_scan->first_comp; n < m_curr_scan->first_comp + m_curr_scan->ncomps; n++) { int16_t* lastDC = &m_ccomp[n].m_lastDC; if (m_ccomp[n].m_dc_selector >= MAX_HUFF_TABLES) { return JPEG_ERR_PARAMS; } if (m_dctbl[m_ccomp[n].m_dc_selector].IsEmpty()) return JPEG_ERR_PARAMS; IppiDecodeHuffmanSpec* dctbl = m_dctbl[m_ccomp[n].m_dc_selector]; IppiDecodeHuffmanSpec* actbl = m_actbl[m_ccomp[n].m_ac_selector]; for(k = 0; k < m_ccomp[n].m_scan_vsampling; k++) { for(l = 0; l < m_ccomp[n].m_scan_hsampling; l++) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffman8x8_JPEG_1u16s_C1( src,srcLen,&currPos,pMCUBuf,lastDC,(int*)&m_marker, dctbl,actbl,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_JPEG_1u16s_C1() failed!"); m_marker = JM_NONE; return JPEG_ERR_INTERNAL; } pMCUBuf += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp m_restarts_to_go--; } // for m_numxMCU return JPEG_OK; } // JERRCODE CJPEGDecoder::DecodeHuffmanMCURowBL(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) JERRCODE CJPEGDecoder::DecodeHuffmanMCURowLS(int16_t* pMCUBuf) { int c; uint8_t* src; int16_t* dst[4]; int srcLen; int currPos; const IppiDecodeHuffmanSpec* dctbl[4]; JERRCODE jerr; int status; for(c = 0; c < m_jpeg_ncomp; c++) { dst[c] = pMCUBuf + c * m_numxMCU; dctbl[c] = m_dctbl[m_ccomp[c].m_dc_selector]; } src = m_BitStreamIn.GetDataPtr(); srcLen = m_BitStreamIn.GetDataLen(); #if defined (HUFF_ROW_API) if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } m_BitStreamIn.FillBuffer(); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4( src,srcLen,&currPos,dst, m_numxMCU, m_jpeg_ncomp, (int*)&m_marker, dctbl,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4() failed!"); return JPEG_ERR_INTERNAL; } m_restarts_to_go -= m_numxMCU; #else int j, h, v; CJPEGColorComponent* curr_comp; for(j = 0; j < m_numxMCU; j++) { if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; for(v = 0; v < curr_comp->m_vsampling; v++) { for(h = 0; h < curr_comp->m_hsampling; h++) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffmanOne_JPEG_1u16s_C1( src,srcLen,&currPos,dst[c],(int*)&m_marker, dctbl[c],m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffmanOne_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } dst[c]++; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp m_restarts_to_go --; } // for m_numxMCU #endif return JPEG_OK; } // CJPEGDecoder::DecodeHuffmanMCURowLS() JERRCODE CJPEGDecoder::ReconstructMCURowBL8x8_NxN(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l, curr_lnz; uint32_t mcu_col; uint8_t* lnz = 0; uint8_t* dst = 0; int dstStep = m_ccWidth; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const int thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; lnz = m_ccomp[c].GetLNZBufferPtr(thread_id); curr_lnz = mcu_col * curr_comp->m_lnz_ds; if (curr_comp->m_q_selector >= MAX_QUANT_TABLES) { return JPEG_ERR_PARAMS; } uint16_t* qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8_NxN() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*8*curr_comp->m_hsampling + k*8*dstStep; } else { dstStep = curr_comp->m_ss_step; dst = curr_comp->GetSSBufferPtr(thread_id) + mcu_col*8*curr_comp->m_hsampling + k*8*dstStep; curr_comp->m_need_upsampling = 1; } // skip border row (when 244 or 411 sampling) if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { dst += dstStep; } for(l = 0; l < curr_comp->m_hsampling; l++) { dst += l*8; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif if(lnz[curr_lnz] == 1) // 1x1 { status = mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); } else if(lnz[curr_lnz] < 5 && pMCUBuf[16] == 0) //2x2 { status = mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); } else if(lnz[curr_lnz] <= 24 //4x4 && pMCUBuf[32] == 0 && pMCUBuf[33] == 0 && pMCUBuf[34] == 0 && pMCUBuf[4] == 0 && pMCUBuf[12] == 0) { status = mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); } else // 8x8 { status = mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); } curr_lnz = curr_lnz + 1; if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8_NxNLS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowBL8x8_NxN() JERRCODE CJPEGDecoder::ReconstructMCURowBL8x8(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l; uint32_t mcu_col; uint8_t* dst = 0; uint8_t* p = 0; int dstStep = m_ccWidth; uint16_t* qtbl; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const uint32_t thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = m_curr_scan->first_comp; c < m_curr_scan->first_comp + m_curr_scan->ncomps; c++) { curr_comp = &m_ccomp[c]; qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8_NxN() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_scan_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*8*curr_comp->m_scan_hsampling + k*8*dstStep; } else { dstStep = curr_comp->m_ss_step; dst = curr_comp->GetSSBufferPtr(thread_id) + mcu_col*8*curr_comp->m_scan_hsampling + k*8*dstStep; curr_comp->m_need_upsampling = 1; } for(l = 0; l < curr_comp->m_scan_hsampling; l++) { p = dst + l*8; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R(pMCUBuf, p, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowBL8x8() JERRCODE CJPEGDecoder::ReconstructMCURowBL8x8To4x4(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l; uint32_t mcu_col; uint8_t* dst = 0; int dstStep = m_ccWidth; uint16_t* qtbl; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const int thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8To4x4() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*4*curr_comp->m_hsampling + k*4*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*4; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2 && m_dst.order == JD_PIXEL) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*8*curr_comp->m_hsampling + k*8*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*8; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { dstStep = curr_comp->m_ss_step; dst = curr_comp->GetSSBufferPtr(thread_id) + mcu_col*4*curr_comp->m_hsampling + k*4*dstStep; curr_comp->m_need_upsampling = 1; // skip border row (when 244 or 411 sampling) if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { dst += dstStep; } for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*4; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowBL8x8To4x4() JERRCODE CJPEGDecoder::ReconstructMCURowBL8x8To2x2(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l; uint32_t mcu_col; uint8_t* dst = 0; int dstStep = m_ccWidth; uint16_t* qtbl; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const int thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8To4x4() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*2*curr_comp->m_hsampling + k*2*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*2; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2 && m_dst.order == JD_PIXEL) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*4*curr_comp->m_hsampling + k*4*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*4; status = mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { dstStep = curr_comp->m_ss_step; dst = curr_comp->GetSSBufferPtr(thread_id) + mcu_col*2*curr_comp->m_hsampling + k*2*dstStep; curr_comp->m_need_upsampling = 1; // skip border row (when 244 or 411 sampling) if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { dst += dstStep; } for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*2; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowBL8x8To2x2() JERRCODE CJPEGDecoder::ReconstructMCURowBL8x8To1x1(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l; uint32_t mcu_col; uint8_t* dst = 0; int dstStep = m_ccWidth; uint16_t* qtbl; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const int thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8To1x1() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*curr_comp->m_hsampling + k*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += (l == 0) ? 0 : 1; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif DCT_QUANT_INV8x8To1x1LS(pMCUBuf, dst, qtbl); #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2 && m_dst.order == JD_PIXEL) { dstStep = curr_comp->m_cc_step; dst = curr_comp->GetCCBufferPtr(thread_id) + mcu_col*2*curr_comp->m_hsampling + k*2*dstStep; for(l = 0; l < curr_comp->m_hsampling; l++) { dst += ((l == 0) ? 0 : 1)*2; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R(pMCUBuf, dst, dstStep, qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } else { dstStep = curr_comp->m_ss_step; dst = curr_comp->GetSSBufferPtr(thread_id) + mcu_col*curr_comp->m_hsampling + k*dstStep; curr_comp->m_need_upsampling = 1; // skip border row (when 244 or 411 sampling) if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { dst += dstStep; } for(l = 0; l < curr_comp->m_hsampling; l++) { dst += (l == 0) ? 0 : 1; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif DCT_QUANT_INV8x8To1x1LS(pMCUBuf, dst, qtbl); #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } // if } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowBL8x8To1x1() JERRCODE CJPEGDecoder::ReconstructMCURowEX(int16_t* pMCUBuf, uint32_t colMCU, uint32_t maxMCU) { int c, k, l; uint32_t mcu_col; uint16_t* dst = 0; int dstStep; float* qtbl; int status; CJPEGColorComponent* curr_comp; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif const int thread_id = 0; for(mcu_col = colMCU; mcu_col < maxMCU; mcu_col++) { for(c = 0; c < m_jpeg_ncomp; c++) { curr_comp = &m_ccomp[c]; qtbl = m_qntbl[curr_comp->m_q_selector]; if(!qtbl) { LOG1("Error: in CJPEGDecoder::ReconstructMCURowBL8x8To1x1() m_qntbl[] is empty for ", curr_comp->m_q_selector); return JPEG_ERR_INTERNAL; } for(k = 0; k < curr_comp->m_vsampling; k++) { if(curr_comp->m_hsampling == m_max_hsampling && curr_comp->m_vsampling == m_max_vsampling) { dstStep = curr_comp->m_cc_step; dst = (uint16_t*)(curr_comp->GetCCBufferPtr(thread_id) + mcu_col*8*curr_comp->m_hsampling*sizeof(int16_t) + k*8*dstStep*sizeof(int16_t)); } else { dstStep = curr_comp->m_ss_step; dst = (uint16_t*)(curr_comp->GetSSBufferPtr(thread_id) + mcu_col*8*curr_comp->m_hsampling*sizeof(int16_t) + k*8*dstStep*sizeof(int16_t)); curr_comp->m_need_upsampling = 1; } // skip border row (when 244 or 411 sampling) if(curr_comp->m_h_factor == 2 && curr_comp->m_v_factor == 2) { dst += dstStep; } for(l = 0; l < curr_comp->m_hsampling; l++) { dst += l*8; #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R( pMCUBuf,dst,dstStep,qtbl); if(ippStsNoErr > status) { LOG0("Error: mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R() failed!"); return JPEG_ERR_INTERNAL; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif pMCUBuf += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } // for m_numxMCU return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowEX() #endif // MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::ReconstructMCURowLS( int16_t* pMCUBuf, int nMCURow, int thread_id) { int n; int dstStep; int16_t* ptr; int16_t* pCurrRow; int16_t* pPrevRow; uint8_t* pDst8u = 0; int16_t* pDst16s = 0; mfxSize roi; int status; CJPEGColorComponent* curr_comp; roi.width = m_dst.width; roi.height = 1; for(n = 0; n < m_jpeg_ncomp; n++) { curr_comp = &m_ccomp[n]; if(m_dst.precision <= 8) { dstStep = curr_comp->m_cc_step; pDst8u = curr_comp->GetCCBufferPtr(thread_id); } else { dstStep = curr_comp->m_cc_step; pDst16s = (int16_t*)curr_comp->GetCCBufferPtr(thread_id); } if(m_jpeg_ncomp == m_curr_scan->ncomps) ptr = pMCUBuf + n*m_numxMCU; else ptr = pMCUBuf + n*m_numxMCU*m_numyMCU + nMCURow*m_numxMCU; pCurrRow = curr_comp->m_curr_row; pPrevRow = curr_comp->m_prev_row; if(0 != nMCURow && 0 == m_rst_go) { status = mfxiReconstructPredRow_JPEG_16s_C1( ptr,pPrevRow,pCurrRow,m_dst.width,m_ss); } else { status = mfxiReconstructPredFirstRow_JPEG_16s_C1( ptr,pCurrRow,m_dst.width,m_jpeg_precision,m_al); } if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } // do point-transform if any status = mfxsLShiftC_16s(pCurrRow,m_al,pPrevRow,m_dst.width); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } if(m_dst.precision <= 8) { status = mfxiAndC_16u_C1IR(0xFF, (uint16_t*)pPrevRow, m_dst.width*sizeof(int16_t),roi); status = mfxiConvert_16u8u_C1R((uint16_t*)pPrevRow,m_dst.width*sizeof(int16_t),pDst8u,dstStep,roi); } else status = mfxsCopy_16s(pPrevRow,pDst16s,m_dst.width); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } curr_comp->m_curr_row = pPrevRow; curr_comp->m_prev_row = pCurrRow; } // for m_jpeg_ncomp m_rst_go = 0; return JPEG_OK; } // CJPEGDecoder::ReconstructMCURowLS() #ifdef MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::DecodeScanBaseline(void) { int status; JERRCODE jerr = JPEG_OK; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } if(0 == m_curr_scan->scan_no) { m_curr_scan->first_comp = 0; } else if(1 == m_curr_scan->scan_no && (2 == m_curr_scan->ncomps || (1 == m_curr_scan->ncomps && 3 == m_num_scans))) { m_curr_scan->first_comp = 1; } else if((1 == m_curr_scan->scan_no && 1 == m_curr_scan->ncomps && 2 == m_num_scans) || 2 == m_curr_scan->scan_no) { m_curr_scan->first_comp = 2; } else { return JPEG_ERR_SOS_DATA; } m_marker = JM_NONE; // workaround for 8-bit qnt tables in 12-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[0].ConvertToHighPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[1].ConvertToHighPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[2].ConvertToHighPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[3].ConvertToHighPrecision(); // workaround for 16-bit qnt tables in 8-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[0].ConvertToLowPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[1].ConvertToLowPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[2].ConvertToLowPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[3].ConvertToLowPrecision(); if(m_dctbl[0].IsEmpty()) { jerr = m_dctbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[0].Init(0,0,(uint8_t*)&DefaultLuminanceDCBits[0],(uint8_t*)&DefaultLuminanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_dctbl[1].IsEmpty()) { jerr = m_dctbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[1].Init(1,0,(uint8_t*)&DefaultChrominanceDCBits[0],(uint8_t*)&DefaultChrominanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[0].IsEmpty()) { jerr = m_actbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[0].Init(0,1,(uint8_t*)&DefaultLuminanceACBits[0],(uint8_t*)&DefaultLuminanceACValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[1].IsEmpty()) { jerr = m_actbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[1].Init(1,1,(uint8_t*)&DefaultChrominanceACBits[0],(uint8_t*)&DefaultChrominanceACValues[0]); if(JPEG_OK != jerr) return jerr; } { int16_t* pMCUBuf; uint32_t rowMCU, colMCU, maxMCU; uint32_t numxMCU = m_curr_scan->numxMCU; uint32_t numyMCU = m_curr_scan->numyMCU; // the pointer to Buffer for a current thread. pMCUBuf = m_block_buffer; // set the iterators rowMCU = 0; colMCU = 0; maxMCU = numxMCU; if (m_curr_scan->jpeg_restart_interval) { if(numxMCU == 0) return JPEG_ERR_PARAMS; rowMCU = m_mcu_decoded / numxMCU; colMCU = m_mcu_decoded % numxMCU; maxMCU = (numxMCU < colMCU + m_mcu_to_decode) ? (numxMCU) : (colMCU + m_mcu_to_decode); } while (rowMCU < numyMCU) { // decode a MCU row #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif if (m_numxMCU * m_nblock * DCTSIZE2 > (uint32_t)m_block_buffer_size) return JPEG_ERR_BUFF; mfxsZero_16s(pMCUBuf, m_numxMCU * m_nblock * DCTSIZE2); jerr = DecodeHuffmanMCURowBL(pMCUBuf, colMCU, maxMCU); if (JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += (c1 - c0); #endif // reconstruct a MCU row #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif if(m_jpeg_precision == 12) jerr = ReconstructMCURowEX(pMCUBuf, colMCU, maxMCU); else { switch (m_jpeg_dct_scale) { default: case JD_1_1: { if(m_use_qdct) jerr = ReconstructMCURowBL8x8_NxN(pMCUBuf, colMCU, maxMCU); else jerr = ReconstructMCURowBL8x8(pMCUBuf, colMCU, maxMCU); } break; case JD_1_2: { jerr = ReconstructMCURowBL8x8To4x4(pMCUBuf, colMCU, maxMCU); } break; case JD_1_4: { jerr = ReconstructMCURowBL8x8To2x2(pMCUBuf, colMCU, maxMCU); } break; case JD_1_8: { jerr = ReconstructMCURowBL8x8To1x1(pMCUBuf, colMCU, maxMCU); } break; } } if (JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = UpSampling(rowMCU, colMCU, maxMCU); if (JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_ss += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ColorConvert(rowMCU, colMCU, maxMCU); if (JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_cc += c1 - c0; #endif // increment interators if (m_curr_scan->jpeg_restart_interval) { m_mcu_decoded += (maxMCU - colMCU); m_mcu_to_decode -= (maxMCU - colMCU); if (0 == m_mcu_to_decode) { return JPEG_OK; } maxMCU = (numxMCU < m_mcu_to_decode) ? (numxMCU) : (m_mcu_to_decode); } else { maxMCU = numxMCU; } rowMCU += 1; colMCU = 0; } } return JPEG_OK; } // CJPEGDecoder::DecodeScanBaseline() JERRCODE CJPEGDecoder::DecodeScanBaselineIN(void) { int status; JERRCODE jerr = JPEG_OK; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; // workaround for 8-bit qnt tables in 12-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[0].ConvertToHighPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[1].ConvertToHighPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[2].ConvertToHighPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[3].ConvertToHighPrecision(); // workaround for 16-bit qnt tables in 8-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[0].ConvertToLowPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[1].ConvertToLowPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[2].ConvertToLowPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[3].ConvertToLowPrecision(); if(m_dctbl[0].IsEmpty()) { jerr = m_dctbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[0].Init(0,0,(uint8_t*)&DefaultLuminanceDCBits[0],(uint8_t*)&DefaultLuminanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_dctbl[1].IsEmpty()) { jerr = m_dctbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[1].Init(1,0,(uint8_t*)&DefaultChrominanceDCBits[0],(uint8_t*)&DefaultChrominanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[0].IsEmpty()) { jerr = m_actbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[0].Init(0,1,(uint8_t*)&DefaultLuminanceACBits[0],(uint8_t*)&DefaultLuminanceACValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[1].IsEmpty()) { jerr = m_actbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[1].Init(1,1,(uint8_t*)&DefaultChrominanceACBits[0],(uint8_t*)&DefaultChrominanceACValues[0]); if(JPEG_OK != jerr) return jerr; } { int16_t* pMCUBuf; uint32_t rowMCU, colMCU, maxMCU; // the pointer to Buffer for a current thread. pMCUBuf = m_block_buffer; // set the iterators rowMCU = 0; colMCU = 0; maxMCU = m_numxMCU; if (m_curr_scan->jpeg_restart_interval) { rowMCU = m_mcu_decoded / m_numxMCU; colMCU = m_mcu_decoded % m_numxMCU; maxMCU = (m_numxMCU < colMCU + m_mcu_to_decode) ? (m_numxMCU) : (colMCU + m_mcu_to_decode); } while (rowMCU < m_numyMCU) { // decode a MCU row #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif mfxsZero_16s(pMCUBuf,m_numxMCU * m_nblock * DCTSIZE2); jerr = DecodeHuffmanMCURowBL(pMCUBuf, colMCU, maxMCU); if (JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += (c1 - c0); #endif // reconstruct a MCU row #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif if(m_jpeg_precision == 12) jerr = ReconstructMCURowEX(pMCUBuf, colMCU, maxMCU); else { switch (m_jpeg_dct_scale) { default: case JD_1_1: { if(m_use_qdct) jerr = ReconstructMCURowBL8x8_NxN(pMCUBuf, colMCU, maxMCU); else jerr = ReconstructMCURowBL8x8(pMCUBuf, colMCU, maxMCU); } break; case JD_1_2: { jerr = ReconstructMCURowBL8x8To4x4(pMCUBuf, colMCU, maxMCU); } break; case JD_1_4: { jerr = ReconstructMCURowBL8x8To2x2(pMCUBuf, colMCU, maxMCU); } break; case JD_1_8: { jerr = ReconstructMCURowBL8x8To1x1(pMCUBuf, colMCU, maxMCU); } break; } } if(JPEG_OK != jerr) continue; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = UpSampling(rowMCU, colMCU, maxMCU); if(JPEG_OK != jerr) continue; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_ss += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ColorConvert(rowMCU, colMCU, maxMCU); if(JPEG_OK != jerr) continue; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_cc += c1 - c0; #endif // increment interators if (m_curr_scan->jpeg_restart_interval) { m_mcu_decoded += (maxMCU - colMCU); m_mcu_to_decode -= (maxMCU - colMCU); if (0 == m_mcu_to_decode) { return JPEG_ERR_BUFF; } maxMCU = (m_numxMCU < m_mcu_to_decode) ? (m_numxMCU) : (m_mcu_to_decode); } else { maxMCU = m_numxMCU; } rowMCU += 1; colMCU = 0; } } return JPEG_OK; } // CJPEGDecoder::DecodeScanBaselineIN() JERRCODE CJPEGDecoder::DecodeScanBaselineIN_P(void) { int status; JERRCODE jerr = JPEG_OK; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; // workaround for 8-bit qnt tables in 12-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[0].ConvertToHighPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[1].ConvertToHighPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[2].ConvertToHighPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 0 && m_jpeg_precision == 12) m_qntbl[3].ConvertToHighPrecision(); // workaround for 16-bit qnt tables in 8-bit scans if(m_qntbl[0].m_initialized && m_qntbl[0].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[0].ConvertToLowPrecision(); if(m_qntbl[1].m_initialized && m_qntbl[1].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[1].ConvertToLowPrecision(); if(m_qntbl[2].m_initialized && m_qntbl[2].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[2].ConvertToLowPrecision(); if(m_qntbl[3].m_initialized && m_qntbl[3].m_precision == 1 && m_jpeg_precision == 8) m_qntbl[3].ConvertToLowPrecision(); if(m_dctbl[0].IsEmpty()) { jerr = m_dctbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[0].Init(0,0,(uint8_t*)&DefaultLuminanceDCBits[0],(uint8_t*)&DefaultLuminanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_dctbl[1].IsEmpty()) { jerr = m_dctbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[1].Init(1,0,(uint8_t*)&DefaultChrominanceDCBits[0],(uint8_t*)&DefaultChrominanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[0].IsEmpty()) { jerr = m_actbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[0].Init(0,1,(uint8_t*)&DefaultLuminanceACBits[0],(uint8_t*)&DefaultLuminanceACValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[1].IsEmpty()) { jerr = m_actbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[1].Init(1,1,(uint8_t*)&DefaultChrominanceACBits[0],(uint8_t*)&DefaultChrominanceACValues[0]); if(JPEG_OK != jerr) return jerr; } #ifdef _OPENMP #pragma omp parallel default(shared) if(m_jpeg_sampling != JS_420) #endif { int i; int idThread = 0; int16_t* pMCUBuf; // the pointer to Buffer for a current thread. #ifdef _OPENMP idThread = omp_get_thread_num(); // the thread id of the calling thread. #endif pMCUBuf = m_block_buffer + idThread * m_numxMCU * m_nblock * DCTSIZE2; i = 0; while(i < (int) m_numyMCU) { #ifdef _OPENMP #pragma omp critical (IPP_JPEG_OMP) #endif { if(i < (int) m_numyMCU) { #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif mfxsZero_16s(pMCUBuf,m_numxMCU * m_nblock * DCTSIZE2); jerr = DecodeHuffmanMCURowBL(pMCUBuf, 0, m_numxMCU); // if(JPEG_OK != jerr) // i = m_numyMCU; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += (c1 - c0); #endif } } if(i < (int) m_numyMCU) { #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif if(m_jpeg_precision == 12) jerr = ReconstructMCURowEX(pMCUBuf, 0, m_numxMCU); else { switch (m_jpeg_dct_scale) { case JD_1_1: { if(m_use_qdct) jerr = ReconstructMCURowBL8x8_NxN(pMCUBuf, 0, m_numxMCU); else jerr = ReconstructMCURowBL8x8(pMCUBuf, 0, m_numxMCU); } break; case JD_1_2: { jerr = ReconstructMCURowBL8x8To4x4(pMCUBuf, 0, m_numxMCU); } break; case JD_1_4: { jerr = ReconstructMCURowBL8x8To2x2(pMCUBuf, 0, m_numxMCU); } break; case JD_1_8: { jerr = ReconstructMCURowBL8x8To1x1(pMCUBuf, 0, m_numxMCU); } break; default: break; } } if(JPEG_OK != jerr) continue; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_dct += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ProcessBuffer(i,idThread); if(JPEG_OK != jerr) continue; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_ss += c1 - c0; #endif } i++; } // for m_numyMCU } // OMP return JPEG_OK; } // CJPEGDecoder::DecodeScanBaselineIN_P() JERRCODE CJPEGDecoder::DecodeScanBaselineNI(void) { int i, j, k, l, c; int srcLen; int currPos; uint8_t* src; int16_t* block; JERRCODE jerr; int status; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif m_ac_scans_completed += m_curr_scan->ncomps; status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; src = m_BitStreamIn.GetDataPtr(); srcLen = m_BitStreamIn.GetDataLen(); if(m_dctbl[0].IsEmpty()) { jerr = m_dctbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[0].Init(0,0,(uint8_t*)&DefaultLuminanceDCBits[0],(uint8_t*)&DefaultLuminanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_dctbl[1].IsEmpty()) { jerr = m_dctbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_dctbl[1].Init(1,0,(uint8_t*)&DefaultChrominanceDCBits[0],(uint8_t*)&DefaultChrominanceDCValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[0].IsEmpty()) { jerr = m_actbl[0].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[0].Init(0,1,(uint8_t*)&DefaultLuminanceACBits[0],(uint8_t*)&DefaultLuminanceACValues[0]); if(JPEG_OK != jerr) return jerr; } if(m_actbl[1].IsEmpty()) { jerr = m_actbl[1].Create(); if(JPEG_OK != jerr) return jerr; jerr = m_actbl[1].Init(1,1,(uint8_t*)&DefaultChrominanceACBits[0],(uint8_t*)&DefaultChrominanceACValues[0]); if(JPEG_OK != jerr) return jerr; } for(i = 0; i < (int) m_numyMCU; i++) { for(k = 0; k < m_ccomp[m_curr_comp_no].m_vsampling; k++) { if(i*m_ccomp[m_curr_comp_no].m_vsampling*8 + k*8 >= m_jpeg_height) break; for(j = 0; j < (int) m_numxMCU; j++) { for(c = 0; c < m_curr_scan->ncomps; c++) { block = m_block_buffer + (DCTSIZE2*m_nblock*(j+(i*m_numxMCU))); // skip any relevant components for(c = 0; c < m_ccomp[m_curr_comp_no].m_comp_no; c++) { block += (DCTSIZE2*m_ccomp[c].m_nblocks); } // Skip over relevant 8x8 blocks from this component. block += (k * DCTSIZE2 * m_ccomp[m_curr_comp_no].m_hsampling); for(l = 0; l < m_ccomp[m_curr_comp_no].m_hsampling; l++) { // Ignore the last column(s) of the image. if(((j*m_ccomp[m_curr_comp_no].m_hsampling*8) + (l*8)) >= m_jpeg_width) break; if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } int16_t* lastDC = &m_ccomp[m_curr_comp_no].m_lastDC; IppiDecodeHuffmanSpec* dctbl = m_dctbl[m_ccomp[m_curr_comp_no].m_dc_selector]; IppiDecodeHuffmanSpec* actbl = m_actbl[m_ccomp[m_curr_comp_no].m_ac_selector]; m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDecodeHuffman8x8_JPEG_1u16s_C1( src,srcLen,&currPos,block,lastDC,(int*)&m_marker, dctbl,actbl,m_state); #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += (c1 - c0); #endif m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } block += DCTSIZE2; m_restarts_to_go --; } // for m_hsampling } // for m_scan_ncomps } // for m_numxMCU } // for m_vsampling } // for m_numyMCU return JPEG_OK; } // CJPEGDecoder::DecodeScanBaselineNI() JERRCODE CJPEGDecoder::DecodeScanProgressive(void) { int i, j, k, n, l, c; int srcLen; int currPos; uint8_t* src; int16_t* block; JERRCODE jerr; int status; status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; src = m_BitStreamIn.GetDataPtr(); srcLen = m_BitStreamIn.GetDataLen(); if(m_ss != 0 && m_se != 0) { // AC scan for(i = 0; i < (int) m_numyMCU; i++) { for(k = 0; k < m_ccomp[m_curr_comp_no].m_vsampling; k++) { if(i*m_ccomp[m_curr_comp_no].m_vsampling*8 + k*8 >= m_jpeg_height) break; for(j = 0; j < (int) m_numxMCU; j++) { block = m_block_buffer + (DCTSIZE2*m_nblock*(j+(i*m_numxMCU))); // skip any relevant components for(c = 0; c < m_ccomp[m_curr_comp_no].m_comp_no; c++) { block += (DCTSIZE2*m_ccomp[c].m_nblocks); } // Skip over relevant 8x8 blocks from this component. block += (k * DCTSIZE2 * m_ccomp[m_curr_comp_no].m_hsampling); for(l = 0; l < m_ccomp[m_curr_comp_no].m_hsampling; l++) { // Ignore the last column(s) of the image. if(((j*m_ccomp[m_curr_comp_no].m_hsampling*8) + (l*8)) >= m_jpeg_width) break; if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } IppiDecodeHuffmanSpec* actbl = m_actbl[m_ccomp[m_curr_comp_no].m_ac_selector]; if(m_ah == 0) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1( src,srcLen,&currPos,block,(int*)&m_marker, m_ss,m_se,m_al,actbl,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } } else { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1( src,srcLen,&currPos,block,(int*)&m_marker, m_ss,m_se,m_al,actbl,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } } block += DCTSIZE2; m_restarts_to_go --; } // for m_hsampling } // for m_numxMCU } // for m_vsampling } // for m_numyMCU if(m_al == 0 && m_se == 63) { m_ccomp[m_curr_comp_no].m_ac_scan_completed = 1; } } else { // DC scan for(i = 0; i < (int) m_numyMCU; i++) { for(j = 0; j < (int) m_numxMCU; j++) { if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } block = m_block_buffer + (DCTSIZE2*m_nblock*(j+(i*m_numxMCU))); if(m_ah == 0) { // first DC scan for(n = 0; n < m_jpeg_ncomp; n++) { int16_t* lastDC = &m_ccomp[n].m_lastDC; IppiDecodeHuffmanSpec* dctbl = m_dctbl[m_ccomp[n].m_dc_selector]; for(k = 0; k < m_ccomp[n].m_vsampling; k++) { for(l = 0; l < m_ccomp[n].m_hsampling; l++) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1( src,srcLen,&currPos,block,lastDC,(int*)&m_marker, m_al,dctbl,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } block += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } else { // refine DC scan for(n = 0; n < m_jpeg_ncomp; n++) { for(k = 0; k < m_ccomp[n].m_vsampling; k++) { for(l = 0; l < m_ccomp[n].m_hsampling; l++) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); status = mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1( src,srcLen,&currPos,block,(int*)&m_marker, m_al,m_state); m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } block += DCTSIZE2; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp } m_restarts_to_go --; } // for m_numxMCU } // for m_numyMCU if(m_al == 0) { m_dc_scan_completed = 1; } } return JPEG_OK; } // CJPEGDecoder::DecodeScanProgressive() JERRCODE CJPEGDecoder::DecodeScanLosslessIN(void) { int i; int16_t* pMCUBuf; JERRCODE jerr; int status; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; m_ac_scans_completed += m_curr_scan->ncomps; pMCUBuf = m_block_buffer; for(i = 0; i < (int) m_numyMCU; i++) { #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = DecodeHuffmanMCURowLS(pMCUBuf); if(JPEG_OK != jerr) { return jerr; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += c1 - c0; #endif #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ReconstructMCURowLS(pMCUBuf, i); if(JPEG_OK != jerr) { return jerr; } #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_diff += c1 - c0; #endif if(m_curr_scan->ncomps == m_jpeg_ncomp) { #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif jerr = ColorConvert(i, 0, m_numxMCU); if(JPEG_OK != jerr) return jerr; #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_cc += c1 - c0; #endif } } // for m_numyMCU return JPEG_OK; } // CJPEGDecoder::DecodeScanLosslessIN() JERRCODE CJPEGDecoder::DecodeScanLosslessNI(void) { int i, j, n, v, h; uint8_t* src; int srcLen; int currPos; int16_t* ptr; int16_t* pMCUBuf; JERRCODE jerr; int status; #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif status = mfxiDecodeHuffmanStateInit_JPEG_8u(m_state); if(ippStsNoErr != status) { return JPEG_ERR_INTERNAL; } m_marker = JM_NONE; m_ac_scans_completed += m_curr_scan->ncomps; pMCUBuf = m_block_buffer + m_curr_comp_no*m_numxMCU*m_numyMCU; src = m_BitStreamIn.GetDataPtr(); srcLen = m_BitStreamIn.GetDataLen(); for(i = 0; i < (int) m_numyMCU; i++) { for(j = 0; j < (int) m_numxMCU; j++) { if(m_curr_scan->jpeg_restart_interval) { if(m_restarts_to_go == 0) { jerr = ProcessRestart(); if(JPEG_OK != jerr) { LOG0("Error: ProcessRestart() failed!"); return jerr; } } } for(n = 0; n < m_curr_scan->ncomps; n++) { CJPEGColorComponent* curr_comp = &m_ccomp[m_curr_comp_no]; IppiDecodeHuffmanSpec* dctbl = m_dctbl[curr_comp->m_dc_selector]; ptr = pMCUBuf + j*m_mcuWidth; for(v = 0; v < curr_comp->m_vsampling; v++) { for(h = 0; h < curr_comp->m_hsampling; h++) { m_BitStreamIn.FillBuffer(SAFE_NBYTES); currPos = m_BitStreamIn.GetCurrPos(); #ifdef __TIMING__ c0 = mfxGetCpuClocks(); #endif status = mfxiDecodeHuffmanOne_JPEG_1u16s_C1( src,srcLen,&currPos,ptr,(int*)&m_marker, dctbl,m_state); #ifdef __TIMING__ c1 = mfxGetCpuClocks(); m_clk_huff += c1 - c0; #endif m_BitStreamIn.SetCurrPos(currPos); if(ippStsNoErr > status) { LOG0("Error: mfxiDecodeHuffmanOne_JPEG_1u16s_C1() failed!"); return JPEG_ERR_INTERNAL; } ptr++; } // for m_hsampling } // for m_vsampling } // for m_jpeg_ncomp m_restarts_to_go --; } // for m_numxMCU pMCUBuf += m_numxMCU; } // for m_numyMCU return JPEG_OK; } // CJPEGDecoder::DecodeScanLosslessNI() #endif // MFX_ENABLE_JPEG_SW_FALLBACK JERRCODE CJPEGDecoder::ReadHeader( int* width, int* height, int* nchannels, JCOLOR* color, JSS* sampling, int* precision) { int du_width; int du_height; JERRCODE jerr; // parse bitstream up to SOS marker jerr = ParseJPEGBitStream(JO_READ_HEADER); if(JPEG_OK != jerr) { LOG0("Error: ParseJPEGBitStream() failed"); return jerr; } if(JPEG_UNKNOWN == m_jpeg_mode) return JPEG_ERR_BAD_DATA; // DU block dimensions (8x8 for DCT based modes and 1x1 for lossless mode) du_width = (JPEG_LOSSLESS == m_jpeg_mode) ? 1 : 8; du_height = (JPEG_LOSSLESS == m_jpeg_mode) ? 1 : 8; // MCU dimensions m_mcuWidth = du_width * std::max(m_max_hsampling,1); m_mcuHeight = du_height * std::max(m_max_vsampling,1); // num of MCUs in whole image m_numxMCU = (m_jpeg_width + (m_mcuWidth - 1)) / m_mcuWidth; m_numyMCU = (m_jpeg_height + (m_mcuHeight - 1)) / m_mcuHeight; // not completed MCUs should be padded m_xPadding = m_numxMCU * m_mcuWidth - m_jpeg_width; m_yPadding = m_numyMCU * m_mcuHeight - m_jpeg_height; // dimensions of internal buffer for color conversion m_ccWidth = m_mcuWidth * m_numxMCU; m_ccHeight = m_mcuHeight; *width = m_jpeg_width; *height = m_jpeg_height; *nchannels = m_jpeg_ncomp; *color = m_jpeg_color; *sampling = m_jpeg_sampling; *precision = m_jpeg_precision; return JPEG_OK; } // CJPEGDecoder::ReadHeader() JERRCODE CJPEGDecoder::ReadData(void) { return ParseJPEGBitStream(JO_READ_DATA); } // CJPEGDecoder::ReadData(void) JERRCODE CJPEGDecoder::ReadData(uint32_t restartNum, uint32_t restartsToDecode) { JERRCODE jerr = JPEG_OK; m_marker = JM_NONE; // find the start of VLC unit jerr = NextMarker(&m_marker); if (JPEG_OK != jerr) { return jerr; } // parse the VLC unit's header switch (m_marker) { case JM_SOS: jerr = ParseSOS(JO_READ_DATA); if (JPEG_OK != jerr) { return jerr; } break; case JM_RST0: case JM_RST1: case JM_RST2: case JM_RST3: case JM_RST4: case JM_RST5: case JM_RST6: case JM_RST7: jerr = ParseRST(); if (JPEG_OK != jerr) { return jerr; } // reset DC predictors if (m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN) { return JPEG_ERR_SOF_DATA; } for (int n = 0; n < m_jpeg_ncomp; n++) { m_ccomp[n].m_lastDC = 0; } break; default: return JPEG_ERR_SOS_DATA; break; } // set the number of MCU to process if(0 == m_curr_scan->scan_no && 0 != m_scans[0].jpeg_restart_interval) { m_mcu_decoded = restartNum * m_scans[0].jpeg_restart_interval; } else if(1 == m_curr_scan->scan_no && 0 != m_scans[0].jpeg_restart_interval && 0 != m_scans[1].jpeg_restart_interval) { m_mcu_decoded = (restartNum - (m_scans[0].numxMCU * m_scans[0].numyMCU + m_scans[0].jpeg_restart_interval - 1) / m_scans[0].jpeg_restart_interval) * m_scans[1].jpeg_restart_interval; } else if(2 == m_curr_scan->scan_no && 0 != m_scans[0].jpeg_restart_interval && 0 != m_scans[1].jpeg_restart_interval && 0 != m_scans[2].jpeg_restart_interval) { m_mcu_decoded = (restartNum - (m_scans[0].numxMCU * m_scans[0].numyMCU + m_scans[0].jpeg_restart_interval - 1) / m_scans[0].jpeg_restart_interval - (m_scans[1].numxMCU * m_scans[1].numyMCU + m_scans[1].jpeg_restart_interval - 1) / m_scans[1].jpeg_restart_interval) * m_scans[2].jpeg_restart_interval; } else { m_mcu_decoded = 0; } m_mcu_to_decode = (m_curr_scan->jpeg_restart_interval) ? (m_curr_scan->jpeg_restart_interval * restartsToDecode) : (m_curr_scan->numxMCU * m_curr_scan->numyMCU); m_restarts_to_go = m_curr_scan->jpeg_restart_interval; // decode VLC unit data jerr = ParseData(); return jerr; } // CJPEGDecoder::ReadData(uint32_t restartNum) JERRCODE CJPEGDecoder::ReadPictureHeaders(void) { return JPEG_OK; } ChromaType CJPEGDecoder::GetChromaType() { /* 0:YUV400 (grayscale image) 1:YUV420 Y: h=2 v=2, Cb/Cr: h=1 v=1 2:YUV422H_2Y Y: h=2 v=1, Cb/Cr: h=1 v=1 3:YUV444 Y: h=1 v=1, Cb/Cr: h=1 v=1 4:YUV411 Y: h=4 v=1, Cb/Cr: h=1 v=1 5:YUV422V_2Y Y: h=1 v=2, Cb/Cr: h=1 v=1 6:YUV422H_4Y Y: h=2 v=1, Cb/Cr: h=1 v=2 7:YUV422V_4Y Y: h=1 v=2, Cb/Cr: h=2 v=1 */ if (m_ccomp[0].m_hsampling == 4) { assert(m_ccomp[0].m_vsampling == 1); return CHROMA_TYPE_YUV411; // YUV411 } if (m_ccomp[0].m_hsampling == 1) // YUV422V_4Y, YUV422V_2Y, YUV444 { if (m_ccomp[0].m_vsampling == 1) // YUV444 { return CHROMA_TYPE_YUV444; } else { assert(m_ccomp[0].m_vsampling == 2); return (m_ccomp[1].m_hsampling == 1) ? CHROMA_TYPE_YUV422V_2Y : CHROMA_TYPE_YUV422V_4Y; // YUV422V_2Y, YUV422V_4Y } } if (m_ccomp[0].m_hsampling == 2) // YUV420, YUV422H_2Y, YUV422H_4Y { if (m_ccomp[0].m_vsampling == 1) { return (m_ccomp[1].m_vsampling == 1) ? CHROMA_TYPE_YUV422H_2Y : CHROMA_TYPE_YUV422H_4Y; // YUV422H_2Y, YUV422H_4Y } else { assert(m_ccomp[0].m_vsampling == 2); return CHROMA_TYPE_YUV420; // YUV420; } } return CHROMA_TYPE_YUV400; } void CopyPlane4To2(uint8_t *pDstUV, int32_t iDstStride, const uint8_t *pSrcU, const uint8_t *pSrcV, int32_t iSrcStride, mfxSize size) { int32_t y, x; for (y = 0; y < size.height / 2; y += 1) { for (x = 0; x < size.width / 2; x += 1) { pDstUV[2*x] = pSrcU[x * 2]; pDstUV[2*x + 1] = pSrcV[x * 2]; } pSrcU += 2*iSrcStride; pSrcV += 2*iSrcStride; pDstUV += iDstStride; } } // void CopyPlane(uint8_t *pDst, void DownSamplingPlane(uint8_t *pSrcU, uint8_t *pSrcV, int32_t iSrcStride, mfxSize size) { int32_t y, x; for (y = 0; y < size.height / 2; y += 1) { for (x = 0; x < size.width / 2; x += 1) { pSrcU[x] = pSrcU[2*x]; pSrcV[x] = pSrcV[2*x]; } pSrcU += iSrcStride; pSrcV += iSrcStride; } } // void CopyPlane(uint8_t *pDst, void CopyPlane(uint8_t *pDst, int32_t iDstStride, const uint8_t *pSrc, int32_t iSrcStride, mfxSize size) { mfxiCopy_8u_C1R(pSrc, iSrcStride, pDst, iDstStride, size); } // void CopyPlane(uint8_t *pDst, void ConvertFrom_YUV444_To_YV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size) { CopyPlane(dst[0], dstPitch, src[0], srcPitch, size); CopyPlane4To2(dst[1], dstPitch, src[1], src[2], srcPitch, size); } void ConvertFrom_YUV422V_To_YV12(uint8_t *src[3], uint32_t srcPitch, uint8_t * [2], uint32_t , mfxSize size) { DownSamplingPlane(src[1], src[2], srcPitch, size); } void ConvertFrom_YUV422H_4Y_To_NV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size) { CopyPlane(dst[0], dstPitch, src[0], srcPitch, size); CopyPlane4To2(dst[1], dstPitch, src[1], src[2], srcPitch, size); } void ConvertFrom_YUV422V_4Y_To_NV12(const uint8_t *src[3], uint32_t srcPitch, uint8_t * dst[2], uint32_t dstPitch, mfxSize size) { CopyPlane(dst[0], dstPitch, src[0], srcPitch, size); CopyPlane4To2(dst[1], dstPitch, src[1], src[2], srcPitch, size); } #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/jpegdec_base.cpp000066400000000000000000001047541443134507600315050ustar00rootroot00000000000000// Copyright (c) 2001-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #include #include #include #include "ippi.h" #include "ippj.h" #include "jpegbase.h" #include "jpegdec_base.h" #include "mfx_trace.h" CJPEGDecoderBase::CJPEGDecoderBase(void) { Reset(); return; } // ctor CJPEGDecoderBase::~CJPEGDecoderBase(void) { Clean(); return; } // dtor void CJPEGDecoderBase::Reset(void) { m_jpeg_width = 0; m_jpeg_height = 0; m_jpeg_ncomp = 0; m_jpeg_precision = 8; m_jpeg_sampling = JS_OTHER; m_jpeg_color = JC_UNKNOWN; m_jpeg_mode = JPEG_UNKNOWN; m_jfif_app0_detected = 0; m_jfif_app0_major = 0; m_jfif_app0_minor = 0; m_jfif_app0_units = 0; m_jfif_app0_xDensity = 0; m_jfif_app0_yDensity = 0; m_jfif_app0_thumb_width = 0; m_jfif_app0_thumb_height = 0; m_jfxx_app0_detected = 0; m_jfxx_thumbnails_type = 0; m_avi1_app0_detected = 0; m_avi1_app0_polarity = 0; m_avi1_app0_reserved = 0; m_avi1_app0_field_size = 0; m_avi1_app0_field_size2 = 0; m_adobe_app14_detected = 0; m_adobe_app14_version = 0; m_adobe_app14_flags0 = 0; m_adobe_app14_flags1 = 0; m_adobe_app14_transform = 0; m_precision = 0; m_max_hsampling = 0; m_max_vsampling = 0; m_sos_len = 0; m_curr_comp_no = 0; m_num_scans = 0; for(int i = 0; i < MAX_SCANS_PER_FRAME; i++) { m_scans[i].scan_no = i; m_scans[i].jpeg_restart_interval = 0; m_scans[i].min_h_factor = 0; m_scans[i].min_v_factor = 0; m_scans[i].numxMCU = 0; m_scans[i].numyMCU = 0; m_scans[i].mcuWidth = 0; m_scans[i].mcuHeight = 0; m_scans[i].xPadding = 0; m_scans[i].yPadding = 0; m_scans[i].ncomps = 0; m_scans[i].first_comp = 0; } m_curr_scan = &m_scans[0]; m_ss = 0; m_se = 0; m_al = 0; m_ah = 0; m_marker = JM_NONE; m_nblock = 0; m_stream_in.Close(); return; } // CJPEGDecoderBase::Reset(void) JERRCODE CJPEGDecoderBase::Clean(void) { int i; m_avi1_app0_detected = 0; m_avi1_app0_polarity = 0; m_avi1_app0_reserved = 0; m_avi1_app0_field_size = 0; m_avi1_app0_field_size2 = 0; m_jfif_app0_detected = 0; m_jfxx_app0_detected = 0; m_adobe_app14_detected = 0; m_curr_scan->ncomps = 0; for(i = 0; i < MAX_COMPS_PER_SCAN; i++) { if(0 != m_ccomp[i].m_curr_row) { free(m_ccomp[i].m_curr_row); m_ccomp[i].m_curr_row = 0; } if(0 != m_ccomp[i].m_prev_row) { free(m_ccomp[i].m_prev_row); m_ccomp[i].m_prev_row = 0; } } for(i = 0; i < MAX_HUFF_TABLES; i++) { m_dctbl[i].Destroy(); m_actbl[i].Destroy(); } return JPEG_OK; } // CJPEGDecoderBase::Clean() #define BS_BUFLEN 16384 JERRCODE CJPEGDecoderBase::SetSource(const uint8_t* pBuf, size_t buflen) { JERRCODE jerr = m_stream_in.Open(pBuf, buflen); if (JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.Attach(&m_stream_in); if(JPEG_OK != jerr) return jerr; return m_BitStreamIn.Init(BS_BUFLEN); } // CJPEGDecoderBase::SetSource() JERRCODE CJPEGDecoderBase::Seek(long offset, int origin) { return m_stream_in.Seek(offset, origin); }// CJPEGDecoderBase::Seek JERRCODE CJPEGDecoderBase::DetectSampling(void) { switch(m_jpeg_ncomp) { case 1: if(m_ccomp[0].m_hsampling == 1 && m_ccomp[0].m_vsampling == 1) { m_jpeg_sampling = JS_444; } else { return JPEG_ERR_BAD_DATA; } break; case 3: if(m_ccomp[0].m_hsampling == 1 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1) { m_jpeg_sampling = JS_444; } else if(m_ccomp[0].m_hsampling == 2 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1) { m_jpeg_sampling = JS_422H; } else if(m_ccomp[0].m_hsampling == 1 && m_ccomp[0].m_vsampling == 2 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1) { m_jpeg_sampling = JS_422V; } else if(m_ccomp[0].m_hsampling == 2 && m_ccomp[0].m_vsampling == 2 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1) { m_jpeg_sampling = JS_420; } else if(m_ccomp[0].m_hsampling == 4 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1) { m_jpeg_sampling = JS_411; } else { m_jpeg_sampling = JS_OTHER; } break; case 4: if(m_ccomp[0].m_hsampling == 1 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1 && m_ccomp[3].m_hsampling == 1 && m_ccomp[3].m_vsampling == 1) { m_jpeg_sampling = JS_444; } else if(m_ccomp[0].m_hsampling == 2 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1 && m_ccomp[3].m_hsampling == 2 && m_ccomp[3].m_vsampling == 1) { m_jpeg_sampling = JS_422H; } else if(m_ccomp[0].m_hsampling == 1 && m_ccomp[0].m_vsampling == 2 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1 && m_ccomp[3].m_hsampling == 1 && m_ccomp[3].m_vsampling == 2) { m_jpeg_sampling = JS_422V; } else if(m_ccomp[0].m_hsampling == 2 && m_ccomp[0].m_vsampling == 2 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1 && m_ccomp[3].m_hsampling == 2 && m_ccomp[3].m_vsampling == 2) { m_jpeg_sampling = JS_420; } else if(m_ccomp[0].m_hsampling == 4 && m_ccomp[0].m_vsampling == 1 && m_ccomp[1].m_hsampling == 1 && m_ccomp[1].m_vsampling == 1 && m_ccomp[2].m_hsampling == 1 && m_ccomp[2].m_vsampling == 1 && m_ccomp[3].m_hsampling == 4 && m_ccomp[3].m_vsampling == 1) { m_jpeg_sampling = JS_411; } else { m_jpeg_sampling = JS_OTHER; } break; } return JPEG_OK; } // CJPEGDecoderBase::DetectSampling() void CJPEGDecoderBase::SetDecodeErrorTypes(void) { if (!m_pDecodeErrorReport) return; #ifdef ONEVPL_EXPERIMENTAL switch (m_marker) { case JM_APP0: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_APP0_MARKER; break; case JM_APP14: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_APP14_MARKER; break; case JM_DQT: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_DQT_MARKER; break; case JM_SOF0: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_SOF0_MARKER; break; case JM_DHT: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_DHT_MARKER; break; case JM_DRI: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_DRI_MARKER; break; case JM_SOS: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_SOS_MARKER; break; default: m_pDecodeErrorReport->ErrorTypes |= MFX_ERROR_JPEG_UNKNOWN_MARKER; break; }; #endif } JERRCODE CJPEGDecoderBase::NextMarker(JMARKER* marker) { int c; int n; JERRCODE jerr; n = 0; for(;;) { jerr = m_BitStreamIn.ReadByte(&c); if(JPEG_OK != jerr) return jerr; if(c != 0xff) { do { n++; jerr = m_BitStreamIn.ReadByte(&c); if(JPEG_OK != jerr) return jerr; } while(c != 0xff); } do { jerr = m_BitStreamIn.ReadByte(&c); if(JPEG_OK != jerr) return jerr; } while(c == 0xff); if(c != 0) { *marker = (JMARKER)c; break; } } if(n != 0) { TRC1(" skip enormous bytes - ",n); } return JPEG_OK; } // CJPEGDecoderBase::NextMarker() JERRCODE CJPEGDecoderBase::SkipMarker(void) { int len; JERRCODE jerr; jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.Seek(len - 2); if(JPEG_OK != jerr) return jerr; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::SkipMarker() JERRCODE CJPEGDecoderBase::ParseSOI(void) { TRC0("-> SOI"); m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseSOI() JERRCODE CJPEGDecoderBase::ParseEOI(void) { TRC0("-> EOI"); m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseEOI() const int APP0_JFIF_LENGTH = 14; const int APP0_JFXX_LENGTH = 6; const int APP0_AVI1_LENGTH = 14; JERRCODE CJPEGDecoderBase::ParseAPP0(void) { int b0, b1, b2, b3, b4; int len; JERRCODE jerr; TRC0("-> APP0"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.CheckByte(0,&b0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(1,&b1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(2,&b2); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(3,&b3); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(4,&b4); if(JPEG_OK != jerr) return jerr; if(len >= APP0_JFIF_LENGTH && b0 == 0x4a && // J b1 == 0x46 && // F b2 == 0x49 && // I b3 == 0x46 && // F b4 == 0) { // we've found JFIF APP0 marker len -= 5; jerr = m_BitStreamIn.Seek(5); if(JPEG_OK != jerr) return jerr; m_jfif_app0_detected = 1; jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_major); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_minor); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_units); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_xDensity); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_yDensity); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_width); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_height); if(JPEG_OK != jerr) return jerr; len -= 9; } jerr = m_BitStreamIn.CheckByte(0,&b0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(1,&b1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(2,&b2); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(3,&b3); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(4,&b4); if(JPEG_OK != jerr) return jerr; if(len >= APP0_JFXX_LENGTH && b0 == 0x4a && // J b1 == 0x46 && // F b2 == 0x58 && // X b3 == 0x58 && // X b4 == 0) { // we've found JFXX APP0 extension marker len -= 5; jerr = m_BitStreamIn.Seek(5); if(JPEG_OK != jerr) return jerr; m_jfxx_app0_detected = 1; jerr = m_BitStreamIn.ReadByte(&m_jfxx_thumbnails_type); if(JPEG_OK != jerr) return jerr; switch(m_jfxx_thumbnails_type) { case 0x10: break; case 0x11: break; case 0x13: break; default: break; } len -= 1; } jerr = m_BitStreamIn.CheckByte(0,&b0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(1,&b1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(2,&b2); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(3,&b3); if(JPEG_OK != jerr) return jerr; if(len >= APP0_AVI1_LENGTH && b0 == 0x41 && // A b1 == 0x56 && // V b2 == 0x49 && // I b3 == 0x31) // 1 { // we've found AVI1 APP0 marker len -= 4; jerr = m_BitStreamIn.Seek(4); if(JPEG_OK != jerr) return jerr; m_avi1_app0_detected = 1; jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_polarity); if(JPEG_OK != jerr) return jerr; len -= 1; if(len == 7) // old MJPEG AVI len -= 7; if(len == 9) // ODML MJPEG AVI { jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_reserved); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size2); if(JPEG_OK != jerr) return jerr; len -= 9; } } jerr = m_BitStreamIn.Seek(len); if(JPEG_OK != jerr) return jerr; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseAPP0() const int APP14_ADOBE_LENGTH = 12; JERRCODE CJPEGDecoderBase::ParseAPP14(void) { int b0, b1, b2, b3, b4; int len; JERRCODE jerr; TRC0("-> APP14"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.CheckByte(0,&b0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(1,&b1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(2,&b2); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(3,&b3); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.CheckByte(4,&b4); if(JPEG_OK != jerr) return jerr; if(len >= APP14_ADOBE_LENGTH && b0 == 0x41 && // A b1 == 0x64 && // d b2 == 0x6f && // o b3 == 0x62 && // b b4 == 0x65) // e { // we've found Adobe APP14 marker len -= 5; jerr = m_BitStreamIn.Seek(5); if(JPEG_OK != jerr) return jerr; m_adobe_app14_detected = 1; jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_version); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags0); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags1); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_adobe_app14_transform); if(JPEG_OK != jerr) return jerr; TRC1(" adobe_app14_version - ",m_adobe_app14_version); TRC1(" adobe_app14_flags0 - ",m_adobe_app14_flags0); TRC1(" adobe_app14_flags1 - ",m_adobe_app14_flags1); TRC1(" adobe_app14_transform - ",m_adobe_app14_transform); len -= 7; } jerr = m_BitStreamIn.Seek(len); if(JPEG_OK != jerr) return jerr; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseAPP14() JERRCODE CJPEGDecoderBase::ParseDQT(void) { int i; int id; int len; JERRCODE jerr; TRC0("-> DQT"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; while(len > 0) { jerr = m_BitStreamIn.ReadByte(&id); if(JPEG_OK != jerr) return jerr; int precision = (id & 0xf0) >> 4; TRC1(" id - ",(id & 0x0f)); TRC1(" precision - ",precision); if((id & 0x0f) >= MAX_QUANT_TABLES) { return JPEG_ERR_DQT_DATA; } int q; uint8_t qnt[DCTSIZE2*sizeof(int16_t)]; uint8_t* pq8 = (uint8_t*) qnt; uint16_t* pq16 = (uint16_t*)qnt; for(i = 0; i < DCTSIZE2; i++) { if(precision) { jerr = m_BitStreamIn.ReadWord(&q); pq16[i] = (uint16_t)q; } else { jerr = m_BitStreamIn.ReadByte(&q); pq8[i] = (uint8_t)q; } if(JPEG_OK != jerr) return jerr; } if(precision == 1) jerr = m_qntbl[id & 0x0f].Init(id,pq16); else jerr = m_qntbl[id & 0x0f].Init(id,pq8); if(JPEG_OK != jerr) { return jerr; } len -= DCTSIZE2 + DCTSIZE2*precision + 1; } if(len != 0) { return JPEG_ERR_DQT_DATA; } m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseDQT() JERRCODE CJPEGDecoderBase::ParseDHT(void) { int i; int len; int index; int count; JERRCODE jerr; TRC0("-> DHT"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; int v; uint8_t bits[MAX_HUFF_BITS]; uint8_t vals[MAX_HUFF_VALS]; memset(bits, 0, sizeof(bits)); memset(vals, 0, sizeof(vals)); while(len > 16) { jerr = m_BitStreamIn.ReadByte(&index); if(JPEG_OK != jerr) return jerr; count = 0; for(i = 0; i < MAX_HUFF_BITS; i++) { jerr = m_BitStreamIn.ReadByte(&v); if(JPEG_OK != jerr) return jerr; bits[i] = (uint8_t)v; count += bits[i]; } len -= 16 + 1; if(count > MAX_HUFF_VALS || count > len) { return JPEG_ERR_DHT_DATA; } for(i = 0; i < count; i++) { jerr = m_BitStreamIn.ReadByte(&v); if(JPEG_OK != jerr) return jerr; vals[i] = (uint8_t)v; } len -= count; if(index >> 4) { // make AC Huffman table if(m_actbl[index & 0x03].IsEmpty()) { jerr = m_actbl[index & 0x03].Create(); if(JPEG_OK != jerr) { LOG0(" Can't create AC huffman table"); return jerr; } } TRC1(" AC Huffman Table - ",index & 0x03); jerr = m_actbl[index & 0x03].Init(index & 0x03,index >> 4,bits,vals); if(JPEG_OK != jerr) { LOG0(" Can't build AC huffman table"); return jerr; } } else { // make DC Huffman table if(m_dctbl[index & 0x03].IsEmpty()) { jerr = m_dctbl[index & 0x03].Create(); if(JPEG_OK != jerr) { LOG0(" Can't create DC huffman table"); return jerr; } } TRC1(" DC Huffman Table - ",index & 0x03); jerr = m_dctbl[index & 0x03].Init(index & 0x03,index >> 4,bits,vals); if(JPEG_OK != jerr) { LOG0(" Can't build DC huffman table"); return jerr; } } } if(len != 0) { return JPEG_ERR_DHT_DATA; } m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseDHT() JERRCODE CJPEGDecoderBase::ParseSOF0(void) { int i; int len; CJPEGColorComponent* curr_comp; JERRCODE jerr; TRC0("-> SOF0"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision); if(JPEG_OK != jerr) return jerr; if(m_jpeg_precision != 8 && m_jpeg_precision != 12) { return JPEG_ERR_SOF_DATA; } jerr = m_BitStreamIn.ReadWord(&m_jpeg_height); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadWord(&m_jpeg_width); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp); if(JPEG_OK != jerr) return jerr; TRC1(" height - ",m_jpeg_height); TRC1(" width - ",m_jpeg_width); TRC1(" nchannels - ",m_jpeg_ncomp); if(m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN) { return JPEG_ERR_SOF_DATA; } len -= 6; if(len != m_jpeg_ncomp * 3) { return JPEG_ERR_SOF_DATA; } for(m_nblock = 0, i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id); if(JPEG_OK != jerr) return jerr; int ss; jerr = m_BitStreamIn.ReadByte(&ss); if(JPEG_OK != jerr) return jerr; curr_comp->m_hsampling = (ss >> 4) & 0x0f; curr_comp->m_vsampling = (ss ) & 0x0f; if(m_jpeg_ncomp == 1) { curr_comp->m_hsampling = 1; curr_comp->m_vsampling = 1; } jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector); if(JPEG_OK != jerr) return jerr; if(curr_comp->m_hsampling <= 0 || curr_comp->m_hsampling > 4 || curr_comp->m_vsampling <= 0 || curr_comp->m_vsampling > 4) { return JPEG_ERR_SOF_DATA; } // num of DU block per component curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling; // num of DU blocks per frame m_nblock += curr_comp->m_nblocks; TRC1(" id ",curr_comp->m_id); TRC1(" hsampling - ",curr_comp->m_hsampling); TRC1(" vsampling - ",curr_comp->m_vsampling); TRC1(" qselector - ",curr_comp->m_q_selector); } jerr = DetectSampling(); if(JPEG_OK != jerr) { return jerr; } m_max_hsampling = m_ccomp[0].m_hsampling; m_max_vsampling = m_ccomp[0].m_vsampling; for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; if(m_max_hsampling < curr_comp->m_hsampling) m_max_hsampling = curr_comp->m_hsampling; if(m_max_vsampling < curr_comp->m_vsampling) m_max_vsampling = curr_comp->m_vsampling; } for(i = 0; i < m_jpeg_ncomp; i++) { curr_comp = &m_ccomp[i]; curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling; curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling; } m_jpeg_mode = JPEG_BASELINE; m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseSOF0() JERRCODE CJPEGDecoderBase::ParseDRI(void) { int len, jpeg_restart_interval; JERRCODE jerr; TRC0("-> DRI"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; len -= 2; if(len != 2) { return JPEG_ERR_RST_DATA; } jerr = m_BitStreamIn.ReadWord(&jpeg_restart_interval); if(JPEG_OK != jerr) return jerr; for (int i = 0; i < MAX_SCANS_PER_FRAME; i++) { m_scans[i].jpeg_restart_interval = jpeg_restart_interval; } TRC1(" restart interval - ", m_curr_scan->jpeg_restart_interval); m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseDRI() JERRCODE CJPEGDecoderBase::ParseSOS(JOPERATION op) { int i,j; int ci; int len; int gcd_found; int hsampling_gcd = 1, vsampling_gcd = 1; int hsamplings[MAX_COMPS_PER_SCAN], vsamplings[MAX_COMPS_PER_SCAN]; int component_ids[MAX_COMPS_PER_SCAN]; int scan_max_hsampling = 1, scan_max_vsampling = 1; int du_width, du_height; int numComps = 0; JERRCODE jerr; TRC0("-> SOS"); jerr = m_BitStreamIn.ReadWord(&len); if(JPEG_OK != jerr) return jerr; // store position to return to in subsequent ReadData call m_sos_len = len; len -= 2; jerr = m_BitStreamIn.ReadByte(&(m_curr_scan->ncomps)); if(JPEG_OK != jerr) return jerr; if(m_curr_scan->ncomps < 1 || m_curr_scan->ncomps > MAX_COMPS_PER_SCAN) { return JPEG_ERR_SOS_DATA; } if(len != ((m_curr_scan->ncomps * 2) + 4)) { return JPEG_ERR_SOS_DATA; } TRC1(" ncomps - ",m_scan_ncomps); for(i = 0; i < m_curr_scan->ncomps; i++) { int id; int huff_sel; jerr = m_BitStreamIn.ReadByte(&id); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&huff_sel); if(JPEG_OK != jerr) return jerr; TRC1(" id - ",id); TRC1(" dc_selector - ",(huff_sel >> 4) & 0x0f); TRC1(" ac_selector - ",(huff_sel ) & 0x0f); for(ci = 0; ci < m_jpeg_ncomp; ci++) { if(id == m_ccomp[ci].m_id) { m_curr_comp_no = ci; m_ccomp[ci].m_comp_no = ci; m_ccomp[ci].m_lastDC = 0; hsamplings[numComps] = m_ccomp[ci].m_hsampling; vsamplings[numComps] = m_ccomp[ci].m_vsampling; component_ids[numComps] = ci; numComps++; goto comp_id_match; } } return JPEG_ERR_SOS_DATA; comp_id_match: m_ccomp[ci].m_dc_selector = (huff_sel >> 4) & 0x0f; if (m_ccomp[ci].m_dc_selector >= MAX_HUFF_TABLES) return JPEG_ERR_SOS_DATA; m_ccomp[ci].m_ac_selector = (huff_sel ) & 0x0f; if (m_ccomp[ci].m_ac_selector >= MAX_HUFF_TABLES) return JPEG_ERR_SOS_DATA; } // find greatest common divisor for sampling factors of components in scan for(i = 2; i < MAX_BLOCKS_PER_MCU; i++) { gcd_found = 1; for(j = 0; j < numComps; j++) if(hsamplings[j] % i != 0) gcd_found = 0; if(gcd_found) hsampling_gcd = i; gcd_found = 1; for(j = 0; j < numComps; j++) if(vsamplings[j] % i != 0) gcd_found = 0; if(gcd_found) vsampling_gcd = i; } m_curr_scan->min_h_factor = MAX_BLOCKS_PER_MCU; m_curr_scan->min_v_factor = MAX_BLOCKS_PER_MCU; // setting MCU parameters for current scan for(i = 0; i < numComps; i++) { m_ccomp[component_ids[i]].m_scan_hsampling = m_ccomp[component_ids[i]].m_hsampling / hsampling_gcd; if(scan_max_hsampling < m_ccomp[component_ids[i]].m_scan_hsampling) scan_max_hsampling = m_ccomp[component_ids[i]].m_scan_hsampling; m_ccomp[component_ids[i]].m_scan_vsampling = m_ccomp[component_ids[i]].m_vsampling / vsampling_gcd; if(scan_max_vsampling < m_ccomp[component_ids[i]].m_scan_vsampling) scan_max_vsampling = m_ccomp[component_ids[i]].m_scan_vsampling; if(m_curr_scan->min_h_factor > m_ccomp[component_ids[i]].m_h_factor) m_curr_scan->min_h_factor = m_ccomp[component_ids[i]].m_h_factor; if(m_curr_scan->min_v_factor > m_ccomp[component_ids[i]].m_v_factor) m_curr_scan->min_v_factor = m_ccomp[component_ids[i]].m_v_factor; } // DU block dimensions (8x8 for DCT based modes and 1x1 for lossless mode) du_width = (JPEG_LOSSLESS == m_jpeg_mode) ? 1 : 8; du_height = (JPEG_LOSSLESS == m_jpeg_mode) ? 1 : 8; // MCU dimensions m_curr_scan->mcuWidth = du_width * std::max(scan_max_hsampling, 1); m_curr_scan->mcuHeight = du_height * std::max(scan_max_vsampling, 1); // num of MCUs in whole scan m_curr_scan->numxMCU = (m_jpeg_width + (m_curr_scan->mcuWidth * m_curr_scan->min_h_factor - 1)) / (m_curr_scan->mcuWidth * m_curr_scan->min_h_factor); m_curr_scan->numyMCU = (m_jpeg_height + (m_curr_scan->mcuHeight * m_curr_scan->min_v_factor - 1)) / (m_curr_scan->mcuHeight * m_curr_scan->min_v_factor); // not completed MCUs should be padded m_curr_scan->xPadding = m_curr_scan->numxMCU * m_curr_scan->mcuWidth * m_curr_scan->min_h_factor - m_jpeg_width; m_curr_scan->yPadding = m_curr_scan->numyMCU * m_curr_scan->mcuHeight * m_curr_scan->min_v_factor - m_jpeg_height; jerr = m_BitStreamIn.ReadByte(&m_ss); if(JPEG_OK != jerr) return jerr; jerr = m_BitStreamIn.ReadByte(&m_se); if(JPEG_OK != jerr) return jerr; int t; jerr = m_BitStreamIn.ReadByte(&t); if(JPEG_OK != jerr) return jerr; m_ah = (t >> 4) & 0x0f; m_al = (t ) & 0x0f; TRC1(" Ss - ",m_ss); TRC1(" Se - ",m_se); TRC1(" Ah - ",m_ah); TRC1(" Al - ",m_al); if(JO_READ_HEADER == op) { // detect JPEG color space if(m_jpeg_color == JC_UNKNOWN) { if(m_jfif_app0_detected) { switch(m_jpeg_ncomp) { case 1: m_jpeg_color = JC_GRAY; break; case 3: m_jpeg_color = JC_YCBCR; break; default: m_jpeg_color = JC_UNKNOWN; break; } } if(m_adobe_app14_detected) { switch(m_adobe_app14_transform) { case 0: switch(m_jpeg_ncomp) { case 1: m_jpeg_color = JC_GRAY; break; case 3: m_jpeg_color = JC_RGB; break; case 4: m_jpeg_color = JC_CMYK; break; default: m_jpeg_color = JC_UNKNOWN; break; } break; case 1: m_jpeg_color = JC_YCBCR; break; case 2: m_jpeg_color = JC_YCCK; break; default: m_jpeg_color = JC_UNKNOWN; break; } } // try to guess what color space is used... if(!m_jfif_app0_detected && !m_adobe_app14_detected) { switch(m_jpeg_ncomp) { case 1: m_jpeg_color = JC_GRAY; break; case 3: m_jpeg_color = (m_jpeg_mode != JPEG_LOSSLESS && m_jpeg_precision == 8) ? JC_YCBCR : JC_UNKNOWN; break; default: m_jpeg_color = JC_UNKNOWN; break; } } } } m_marker = JM_NONE; return JPEG_OK; } // CJPEGDecoderBase::ParseSOS() JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) { #ifdef __TIMING__ unsigned long long c0; unsigned long long c1; #endif JERRCODE jerr = JPEG_OK; m_marker = JM_NONE; for(;;) { if(JM_NONE == m_marker) { jerr = NextMarker(&m_marker); if(JPEG_OK != jerr) { return jerr; } } switch(m_marker) { case JM_SOI: jerr = ParseSOI(); if(JPEG_OK != jerr) { return jerr; } break; case JM_APP0: jerr = ParseAPP0(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_APP14: jerr = ParseAPP14(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_DQT: jerr = ParseDQT(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOF0: jerr = ParseSOF0(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOF1: case JM_SOF2: case JM_SOF3: case JM_SOF5: case JM_SOF6: case JM_SOF7: case JM_SOF9: case JM_SOFA: case JM_SOFB: case JM_SOFD: case JM_SOFE: case JM_SOFF: MFX_LTRACE_MSG(MFX_TRACE_LEVEL_PARAMS, "Error: JPEGd only support Huffman-coding Baseline DCT now."); return JPEG_NOT_IMPLEMENTED; case JM_DHT: jerr = ParseDHT(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_DRI: jerr = ParseDRI(); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } break; case JM_SOS: jerr = ParseSOS(op); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } if (JO_READ_HEADER == op) { if(m_BitStreamIn.GetCurrPos() - (m_sos_len + 2) != 0) { jerr = m_BitStreamIn.Seek(-(m_sos_len + 2)); if(JPEG_OK != jerr) { SetDecodeErrorTypes(); return jerr; } } else { m_BitStreamIn.SetCurrPos(0); } // stop here, when we are reading header return JPEG_OK; } break; case JM_EOI: jerr = ParseEOI(); goto Exit; default: TRC1("-> Unknown marker ",m_marker); TRC0("..Skipping"); SetDecodeErrorTypes(); jerr = SkipMarker(); if(JPEG_OK != jerr) return jerr; break; } } Exit: return jerr; } // CJPEGDecoderBase::ParseJPEGBitStream() JERRCODE CJPEGDecoderBase::FindSOI() { JERRCODE jerr = JPEG_OK; m_marker = JM_NONE; for(;;) { jerr = NextMarker(&m_marker); if(JM_SOI == m_marker) { if(m_BitStreamIn.GetCurrPos() - 2 != 0) { jerr = m_BitStreamIn.Seek(-2); if(JPEG_OK != jerr) return jerr; } else { m_BitStreamIn.SetCurrPos(0); } return JPEG_OK; } if(JPEG_ERR_BUFF == jerr) { return JPEG_OK; } if(JPEG_OK != jerr) { return jerr; } } } // CJPEGDecoderBase::ParseJPEGBitStream() JERRCODE CJPEGDecoderBase::ReadHeader( int* width, int* height, int* nchannels, JCOLOR* color, JSS* sampling, int* precision) { JERRCODE jerr; // parse bitstream up to SOS marker jerr = ParseJPEGBitStream(JO_READ_HEADER); if(JPEG_OK != jerr) { LOG0("Error: ParseJPEGBitStream() failed"); return jerr; } if(JPEG_UNKNOWN == m_jpeg_mode) return JPEG_ERR_BAD_DATA; *width = m_jpeg_width; *height = m_jpeg_height; *nchannels = m_jpeg_ncomp; *color = m_jpeg_color; *sampling = m_jpeg_sampling; *precision = m_jpeg_precision; return JPEG_OK; } // CJPEGDecoderBase::ReadHeader() uint16_t CJPEGDecoderBase::GetNumQuantTables() { uint16_t numTables = 0; for(int i=0; incomps == m_jpeg_ncomp) return true; return false; } #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/mfx_mjpeg_task.cpp000066400000000000000000000221001443134507600320700ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include #include CJpegTaskBuffer::CJpegTaskBuffer(void) { bufSize = 0; dataSize = 0; numPieces = 0; pBuf = NULL; imageHeaderSize = 0; fieldPos = 0; numScans = 0; timeStamp = 0; } // CJpegTaskBuffer::CJpegTaskBuffer(void) CJpegTaskBuffer::~CJpegTaskBuffer(void) { Close(); } // CJpegTaskBuffer::~CJpegTaskBuffer(void) void CJpegTaskBuffer::Close(void) { if(pBuf) { delete[] pBuf; pBuf = NULL; } bufSize = 0; dataSize = 0; numPieces = 0; } // void CJpegTaskBuffer::Close(void) mfxStatus CJpegTaskBuffer::Allocate(const size_t size) { // check if the existing buffer is good enough if (pBuf) { if (bufSize >= size) { return MFX_ERR_NONE; } Close(); } // allocate the new buffer pBuf = new mfxU8[size]; bufSize = size; return MFX_ERR_NONE; } // mfxStatus CJpegTaskBuffer::Allocate(const size_t size) CJpegTask::CJpegTask(void) { m_numPic = 0; m_numPieces = 0; surface_work = NULL; surface_out = NULL; dst = NULL; } // CJpegTask::CJpegTask(void) CJpegTask::~CJpegTask(void) { Close(); } // CJpegTask::~CJpegTask(void) void CJpegTask::Close(void) { // delete all buffers allocated for (auto& pic: m_pics) { pic.reset(nullptr); } m_numPic = 0; m_numPieces = 0; } // void CJpegTask::Close(void) mfxStatus CJpegTask::Initialize(UMC::VideoDecoderParams ¶ms, UMC::FrameAllocator *pFrameAllocator, mfxU16 rotation, mfxU16 chromaFormat, mfxU16 colorFormat) { // close the object before initialization Close(); { UMC::Status umcRes; m_pMJPEGVideoDecoder.reset(new UMC::MJPEGVideoDecoderMFX); m_pMJPEGVideoDecoder->SetFrameAllocator(pFrameAllocator); umcRes = m_pMJPEGVideoDecoder->Init(¶ms); if (umcRes != UMC::UMC_OK) { return ConvertUMCStatusToMfx(umcRes); } m_pMJPEGVideoDecoder->Reset(); switch(rotation) { case MFX_ROTATION_0: umcRes = m_pMJPEGVideoDecoder->SetRotation(0); break; case MFX_ROTATION_90: umcRes = m_pMJPEGVideoDecoder->SetRotation(90); break; case MFX_ROTATION_180: umcRes = m_pMJPEGVideoDecoder->SetRotation(180); break; case MFX_ROTATION_270: umcRes = m_pMJPEGVideoDecoder->SetRotation(270); break; } if (umcRes != UMC::UMC_OK) { return ConvertUMCStatusToMfx(umcRes); } umcRes = m_pMJPEGVideoDecoder->SetColorSpace(chromaFormat, colorFormat); if (umcRes != UMC::UMC_OK) { return ConvertUMCStatusToMfx(umcRes); } } return MFX_ERR_NONE; } // mfxStatus CJpegTask::Initialize(const VideoDecoderParams params, void CJpegTask::Reset(void) { for(mfxU32 i=0; ipieceOffset.clear(); m_pics[i]->pieceSize.clear(); m_pics[i]->pieceRSTOffset.clear(); m_pics[i]->scanOffset.clear(); m_pics[i]->scanSize.clear(); m_pics[i]->scanTablesOffset.clear(); m_pics[i]->scanTablesSize.clear(); } m_numPic = 0; m_numPieces = 0; } // void CJpegTask::Reset(void) mfxStatus CJpegTask::AddPicture(UMC::MediaDataEx *pSrcData, const mfxU32 fieldPos) { const mfxU8* pSrc = static_cast(pSrcData->GetDataPointer()); const size_t srcSize = pSrcData->GetDataSize(); const double timeStamp = pSrcData->GetTime(); const UMC::MediaDataEx::_MediaDataEx *pAuxData = pSrcData->GetExData(); uint32_t i, numPieces, maxNumPieces, numScans, maxNumScans; mfxStatus mfxRes; size_t imageHeaderSize; uint32_t marker; // we strongly need auxilary data if (NULL == pAuxData) { MFX_RETURN(MFX_ERR_NULL_PTR); } // allocate the buffer mfxRes = CheckBufferSize(srcSize); if (MFX_ERR_NONE != mfxRes) { return mfxRes; } // allocates vectors for data offsets and sizes maxNumPieces = pAuxData->count; m_pics[m_numPic]->pieceOffset.resize(maxNumPieces); m_pics[m_numPic]->pieceSize.resize(maxNumPieces); m_pics[m_numPic]->pieceRSTOffset.resize(maxNumPieces); // allocates vectors for scans parameters maxNumScans = MAX_SCANS_PER_FRAME; m_pics[m_numPic]->scanOffset.resize(maxNumScans); m_pics[m_numPic]->scanSize.resize(maxNumScans); m_pics[m_numPic]->scanTablesOffset.resize(maxNumScans); m_pics[m_numPic]->scanTablesSize.resize(maxNumScans); // get the number of pieces collected. SOS piece is supposed to be imageHeaderSize = 0; numPieces = 0; numScans = 0; for (i = 0; i < pAuxData->count; i += 1) { size_t chunkSize; // get chunk size chunkSize = (i + 1 < pAuxData->count) ? (pAuxData->offsets[i + 1] - pAuxData->offsets[i]) : (srcSize - pAuxData->offsets[i]); marker = pAuxData->values[i] & 0xFF; m_pics[m_numPic]->pieceRSTOffset[numPieces] = pAuxData->values[i] >> 8; // some data if (JM_SOS == marker) { // fill the chunks with the current chunk data m_pics[m_numPic]->pieceOffset[numPieces] = pAuxData->offsets[i]; m_pics[m_numPic]->pieceSize[numPieces] = chunkSize; numPieces += 1; // fill scan parameters m_pics[m_numPic]->scanOffset[numScans] = pAuxData->offsets[i]; m_pics[m_numPic]->scanSize[numScans] = chunkSize; numScans += 1; if (numScans >= maxNumScans) { throw UMC::UMC_ERR_INVALID_STREAM; } } else if ((JM_DRI == marker || JM_DQT == marker || JM_DHT == marker) && 0 != numScans) { if(0 == m_pics[m_numPic]->scanTablesOffset[numScans]) { m_pics[m_numPic]->scanTablesOffset[numScans] = pAuxData->offsets[i]; m_pics[m_numPic]->scanTablesSize[numScans] += chunkSize; } else { m_pics[m_numPic]->scanTablesSize[numScans] += chunkSize; } } else if ((JM_RST0 <= marker) && (JM_RST7 >= marker)) { // fill the chunks with the current chunk data m_pics[m_numPic]->pieceOffset[numPieces] = pAuxData->offsets[i]; m_pics[m_numPic]->pieceSize[numPieces] = chunkSize; numPieces += 1; } // some header before the regular JPEG data else if (0 == numPieces) { imageHeaderSize += chunkSize; } } // copy the data if(m_pics[m_numPic]->bufSize < srcSize) MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); std::copy(pSrc, pSrc + srcSize, m_pics[m_numPic]->pBuf); m_pics[m_numPic]->dataSize = srcSize; m_pics[m_numPic]->imageHeaderSize = imageHeaderSize; m_pics[m_numPic]->timeStamp = timeStamp; m_pics[m_numPic]->numScans = numScans; m_pics[m_numPic]->numPieces = numPieces; m_pics[m_numPic]->fieldPos = fieldPos; // increment the number of pictures collected m_numPic += 1; // increment the number of pieces collected m_numPieces += numPieces; return MFX_ERR_NONE; } // mfxStatus CJpegTask::AddPicture(UMC::MediaDataEx *pSrcData, mfxStatus CJpegTask::CheckBufferSize(const size_t srcSize) { // add new entry in the array m_pics.reserve(m_numPic+1); while (m_pics.size() <= m_numPic) { m_pics.emplace_back(new CJpegTaskBuffer()); } return m_pics[m_numPic]->Allocate(srcSize); } // mfxStatus CJpegTask::CheckBufferSize(const size_t srcSize) #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE umc_jpeg_frame_constructor.cpp000066400000000000000000000317201443134507600344330ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "umc_jpeg_frame_constructor.h" #include "jpegdec_base.h" namespace UMC { ////////////////////////////////////////////////////// // ////////////////////////////////////////////////////// JpegFrameConstructor::JpegFrameConstructor() : m_prevLengthOfSegment(0) , m_code(0) , m_pts(-1) , m_suggestedSize(0) { m_mediaData.SetExData(&m_mediaDataEx); Reset(); } JpegFrameConstructor::~JpegFrameConstructor() { } void JpegFrameConstructor::Init() { } void JpegFrameConstructor::Reset() { m_code = 0; m_pts = -1; m_suggestedSize = 0; m_prevLengthOfSegment = 0; m_RestartCount = 0; m_prev.clear(); m_frame.clear(); m_mediaDataEx.count = 0; m_mediaData.Close(); m_flags.isSOI = 0; m_flags.isEOI = 0; m_flags.isSOS = 0; } void JpegFrameConstructor::Close() { Reset(); } int32_t JpegFrameConstructor::FindMarkerCode(uint8_t * (&source), size_t & size, int32_t & startCodeSize) { uint32_t ffCount = 0; if (m_prevLengthOfSegment) { size_t copySize = std::min(m_prevLengthOfSegment, size); m_prevLengthOfSegment -= copySize; source += copySize; size -= copySize; if (m_prevLengthOfSegment) return 0; } for (;;) { uint32_t i = 0; ffCount = 0; for (; i < (uint32_t)size; i++) { if (source[i] == 0xff) { ffCount = 1; i++; break; } } for (; i < (uint32_t)size; i++, ffCount++) { if (source[i] != 0xff) { break; } } source += i; size -= i; if (size <= 0) { break; } if (!source[0]) { ffCount = 0; } else { ffCount = 1; startCodeSize = ffCount + 1; size -= 1; int32_t code = source[0]; source++; return code; } } source -= ffCount; size = ffCount; ffCount = 0; startCodeSize = 0; return 0; } int32_t JpegFrameConstructor::CheckMarker(MediaData * pSource) { if (!pSource) return 0; if (!m_code) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); int32_t startCodeSize; int32_t iCodeNext = FindMarkerCode(source, size, startCodeSize); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); if (iCodeNext) { pSource->MoveDataPointer(-startCodeSize); } return iCodeNext; } int32_t JpegFrameConstructor::GetMarker(MediaData * pSource, MediaData * pDst) { if (!pSource) return EndOfStream(pDst); if (!m_code) m_prev.clear(); uint8_t * source = (uint8_t *)pSource->GetDataPointer(); size_t size = pSource->GetDataSize(); if (!size) return 0; int32_t startCodeSize; int32_t iCodeNext = FindMarkerCode(source, size, startCodeSize); if (m_prev.size()) { if (!iCodeNext) { size_t sz = source - (uint8_t *)pSource->GetDataPointer(); if (m_suggestedSize && m_prev.size() + sz > m_suggestedSize) { m_prev.clear(); sz = std::min(sz, m_suggestedSize); } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + sz); pSource->MoveDataPointer((int32_t)sz); return 0; } source -= startCodeSize; m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), source); pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); pDst->SetBufferPointer(&(m_prev[0]), m_prev.size()); pDst->SetDataSize(m_prev.size()); pDst->SetTime(m_pts); int32_t code = m_code; m_code = 0; m_pts = -1; return code; } if (!iCodeNext) { pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer())); return 0; } m_pts = pSource->GetTime(); m_code = iCodeNext; // move before start code pSource->MoveDataPointer((int32_t)(source - (uint8_t *)pSource->GetDataPointer() - startCodeSize)); uint32_t flags = pSource->GetFlags(); bool wasNextMarkerFound = true; switch(iCodeNext) { case JM_RST0: // standalone markers case JM_RST1: case JM_RST2: case JM_RST3: case JM_RST4: case JM_RST5: case JM_RST6: case JM_RST7: case JM_SOI: case JM_EOI: case JM_TEM: break; default: // marker's segment. { if (size >= 2) { size_t length = (source[0] << 8) | source[1]; m_prevLengthOfSegment = length; wasNextMarkerFound = true; } else { return 0; } } break; } if(m_code != JM_EOI) { int32_t startCodeSize1 = 0; iCodeNext = wasNextMarkerFound ? FindMarkerCode(source, size, startCodeSize1) : 0; //pSource->MoveDataPointer(startCodeSize); if (!iCodeNext && !(flags & MediaData::FLAG_VIDEO_DATA_NOT_FULL_UNIT)) { iCodeNext = 1; startCodeSize1 = 0; } if (!iCodeNext) { assert(!m_prev.size()); size_t sz = source - (uint8_t *)pSource->GetDataPointer(); if (m_suggestedSize && sz > m_suggestedSize) { sz = m_suggestedSize; } m_prev.insert(m_prev.end(), (uint8_t *)pSource->GetDataPointer(), (uint8_t *)pSource->GetDataPointer() + sz); pSource->MoveDataPointer((int32_t)sz); return 0; } // fill size_t nal_size = source - (uint8_t *)pSource->GetDataPointer() - startCodeSize1; pDst->SetBufferPointer((uint8_t*)pSource->GetDataPointer(), nal_size); pDst->SetDataSize(nal_size); pSource->MoveDataPointer((int32_t)nal_size); } else { pSource->MoveDataPointer(2); } int32_t code = m_code; m_code = 0; pDst->SetTime(m_pts); m_pts = -1; return code; } int32_t JpegFrameConstructor::EndOfStream(MediaData * pDst) { if (!m_code) { m_prev.clear(); return 0; } if (m_prev.size()) { pDst->SetBufferPointer(&(m_prev[0]), m_prev.size()); pDst->SetDataSize(m_prev.size()); pDst->SetTime(m_pts); int32_t code = m_code; m_code = 0; m_pts = -1; return code; } m_code = 0; return 0; } Status JpegFrameConstructor::AddMarker(uint32_t marker, MediaDataEx::_MediaDataEx* pMediaDataEx, size_t nBufferSize, MediaData *dst) { if (!dst->GetDataSize()) return UMC_OK; uint32_t element = pMediaDataEx->count; if (element >= pMediaDataEx->limit - 1) return UMC_ERR_FAILED; m_frame.insert(m_frame.end(), (uint8_t*)dst->GetDataPointer(), (uint8_t*)dst->GetDataPointer() + dst->GetDataSize() ); pMediaDataEx->offsets[0] = 0; // process RST marker if((JM_RST0 <= marker) && (JM_RST7 >= marker)) { // add marker to MediaDataEx if((unsigned long long)m_frame.size() > ((unsigned long long)nBufferSize * element) / (pMediaDataEx->limit - 2)) { pMediaDataEx->values[element] = marker | (m_RestartCount << 8); pMediaDataEx->offsets[element + 1] = (uint32_t)m_frame.size(); pMediaDataEx->count++; } // the end of previous interval would be the start of next else { pMediaDataEx->offsets[element] = (uint32_t)m_frame.size(); } m_RestartCount++; } // process SOS marker (add it anyway) else if(JM_SOS == marker) { pMediaDataEx->values[element] = marker | (m_RestartCount << 8); pMediaDataEx->offsets[element + 1] = (uint32_t)m_frame.size(); pMediaDataEx->count++; m_RestartCount++; } else { pMediaDataEx->values[element] = marker | (m_RestartCount << 8); pMediaDataEx->offsets[element + 1] = (uint32_t)m_frame.size(); pMediaDataEx->count++; } return UMC_OK; } void JpegFrameConstructor::ResetForNewFrame() { m_frame.clear(); m_mediaDataEx.count = 0; m_flags.isSOI = 0; m_flags.isEOI = 0; m_flags.isSOS = 0; m_RestartCount = 0; } MediaDataEx * JpegFrameConstructor::GetFrame(MediaData * in, uint32_t maxBitstreamSize) { for (;;) { MediaData dst; uint32_t marker = GetMarker(in, &dst); if (marker == JM_NONE) { if(in == nullptr) break; // frame is not declared as "complete", and next marker is not found if(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) break; // frame is declared as "complete", but it does not contain SOS marker if(!(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) && m_flags.isSOS == 0) break; } switch(marker) { case JM_SOI: if (m_flags.isSOI && m_flags.isSOS && m_frame.size() && !m_flags.isEOI) // EOI wasn't received { m_flags.isEOI = 1; // emulate EOI m_mediaData.SetBufferPointer(&m_frame[0], m_frame.size()); m_mediaData.SetDataSize(m_frame.size()); m_mediaData.SetFlags(in != nullptr ? in->GetFlags() : 0); return &m_mediaData; } m_mediaData.SetTime(in != nullptr ? in->GetTime() : 0); m_frame.clear(); m_mediaDataEx.count = 0; m_flags.isSOI = 1; m_flags.isEOI = 0; m_flags.isSOS = 0; m_RestartCount = 0; break; // JPEG picture data case JM_RST0: case JM_RST1: case JM_RST2: case JM_RST3: case JM_RST4: case JM_RST5: case JM_RST6: case JM_RST7: case JM_SOS: if (m_flags.isSOI) { m_flags.isSOS = 1; } else { continue; } break; case JM_EOI: default: break; } if (AddMarker(marker, &m_mediaDataEx, std::max(in != nullptr ? in->GetBufferSize() : 0, (size_t)maxBitstreamSize), &dst) != UMC_OK) { ResetForNewFrame(); continue; } if (marker == JM_EOI) { if (m_flags.isEOI || !m_frame.size() || !m_flags.isSOS) { ResetForNewFrame(); continue; } m_flags.isEOI = 1; if (m_frame.size()) { m_flags.isEOI = 0; m_flags.isSOS = 0; m_mediaData.SetBufferPointer(&m_frame[0], m_frame.size()); m_mediaData.SetDataSize(m_frame.size()); m_mediaData.SetFlags(in != nullptr ? in->GetFlags() : 0); return &m_mediaData; } } if (marker == JM_NONE && (in == nullptr || !(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME)) && m_flags.isSOS == 1) { if (m_frame.size()) { m_flags.isEOI = 0; m_flags.isSOS = 0; m_mediaData.SetBufferPointer(&m_frame[0], m_frame.size()); m_mediaData.SetDataSize(m_frame.size()); m_mediaData.SetFlags(in != nullptr ? in->GetFlags() : 0); return &m_mediaData; } } } return 0; } } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode.cpp000066400000000000000000001120151443134507600332220ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include #include #include "umc_video_data.h" #include "umc_mjpeg_mfx_decode.h" #include "membuffin.h" #include "jpegdec.h" #include namespace UMC { MJPEGVideoDecoderMFX::MJPEGVideoDecoderMFX(void) { m_IsInit = false; //m_firstFrame = false; //m_firstField = false; m_interleaved = false; m_interleavedScan = false; //m_needCloseFrame = false; m_needPostProcessing = false; m_color = JC_UNKNOWN; m_rotation = 0; m_frameNo = 0; m_frame = nullptr; m_frameSampling = 0; m_frameAllocator = 0; std::fill(std::begin(m_pLastPicBuffer), std::end(m_pLastPicBuffer), nullptr); m_framePrecision = 0; m_frameChannels = 0; m_local_frame_time = 0; m_local_delta_frame_time = 0; } // ctor MJPEGVideoDecoderMFX::~MJPEGVideoDecoderMFX(void) { Close(); } // dtor Status MJPEGVideoDecoderMFX::Init(BaseCodecParams* lpInit) { Status status; uint32_t i, numThreads; VideoDecoderParams* pDecoderParams; pDecoderParams = DynamicCast(lpInit); if(0 == pDecoderParams) return UMC_ERR_NULL_PTR; status = Close(); if(UMC_OK != status) return UMC_ERR_INIT; m_DecoderParams = *pDecoderParams; m_IsInit = true; //m_firstFrame = true; m_interleaved = false; m_interleavedScan = false; m_frameNo = 0; m_frame = 0; m_frameSampling = 0; m_needPostProcessing = false; m_rotation = 0; // allocate the JPEG decoders numThreads = JPEG_MAX_THREADS; if ((m_DecoderParams.numThreads) && (numThreads > (uint32_t) m_DecoderParams.numThreads)) { numThreads = m_DecoderParams.numThreads; } m_dec.resize(numThreads); for (i = 0; i < numThreads; i += 1) { m_dec[i].reset(new CJPEGDecoder()); } m_decBase = m_dec[0].get(); m_local_delta_frame_time = 1.0/30; m_local_frame_time = 0; if (pDecoderParams->info.framerate) { m_local_delta_frame_time = 1 / pDecoderParams->info.framerate; } return UMC_OK; } // MJPEGVideoDecoderMFX::Init() Status MJPEGVideoDecoderMFX::Reset(void) { m_IsInit = true; //m_firstFrame = true; m_frameNo = 0; m_interleaved = false; m_interleavedScan = false; m_needPostProcessing = false; //m_needCloseFrame = false; m_frame = 0; m_frameSampling = 0; m_rotation = 0; m_frameData.Close(); m_internalFrame.Close(); for (auto& dec: m_dec) { dec->Reset(); } m_local_frame_time = 0; std::fill(std::begin(m_pLastPicBuffer), std::end(m_pLastPicBuffer), nullptr); return UMC_OK; } // MJPEGVideoDecoderMFX::Reset() Status MJPEGVideoDecoderMFX::Close(void) { m_IsInit = false; //m_firstFrame = false; //m_firstField = false; m_interleaved = false; m_interleavedScan = false; m_needPostProcessing = false; //m_needCloseFrame = false; m_frameNo = 0; m_frame = 0; m_frameSampling = 0; m_rotation = 0; m_local_frame_time = 0; m_frameData.Close(); m_internalFrame.Close(); for (auto& dec: m_dec) { dec.reset(nullptr); } m_PostProcessing.reset(nullptr); return UMC_OK; } // MJPEGVideoDecoderMFX::Close() void MJPEGVideoDecoderMFX::AdjustFrameSize(mfxSize & size) { size.width = mfx::align2_value(size.width, 16); size.height = mfx::align2_value(size.height, m_interleaved ? 16 : 8); } ChromaType MJPEGVideoDecoderMFX::GetChromaType() { /* 0:YUV400 (grayscale image) Y: h=1 v=1, 1:YUV420 Y: h=2 v=2, Cb/Cr: h=1 v=1 2:YUV422H_2Y Y: h=2 v=1, Cb/Cr: h=1 v=1 3:YUV444 Y: h=1 v=1, Cb/Cr: h=1 v=1 4:YUV411 Y: h=4 v=1, Cb/Cr: h=1 v=1 5:YUV422V_2Y Y: h=1 v=2, Cb/Cr: h=1 v=1 6:YUV422H_4Y Y: h=2 v=2, Cb/Cr: h=1 v=2 7:YUV422V_4Y Y: h=2 v=2, Cb/Cr: h=2 v=1 */ if (m_dec[0]->m_jpeg_ncomp == 1) { return CHROMA_TYPE_YUV400; } ChromaType type = CHROMA_TYPE_YUV400; switch(m_dec[0]->m_ccomp[0].m_hsampling) { case 1: // YUV422V_2Y, YUV444 if (m_dec[0]->m_ccomp[0].m_vsampling == 1) // YUV444 { if (m_dec[0]->m_jpeg_color == JC_YCBCR) type = CHROMA_TYPE_YUV444; else if (m_dec[0]->m_jpeg_color == JC_RGB) type = CHROMA_TYPE_RGB; else assert(false); } else { assert((m_dec[0]->m_ccomp[0].m_vsampling == 2) && (m_dec[0]->m_ccomp[1].m_hsampling == 1)); type = CHROMA_TYPE_YUV422V_2Y; // YUV422V_2Y } break; case 2: // YUV420, YUV422H_2Y, YUV422H_4Y, YUV422V_4Y if (m_dec[0]->m_ccomp[0].m_vsampling == 1) { assert(m_dec[0]->m_ccomp[1].m_vsampling == 1 && m_dec[0]->m_ccomp[1].m_hsampling == 1); type = CHROMA_TYPE_YUV422H_2Y; // YUV422H_2Y } else { assert(m_dec[0]->m_ccomp[0].m_vsampling == 2); if (m_dec[0]->m_ccomp[1].m_hsampling == 1 && m_dec[0]->m_ccomp[1].m_vsampling == 1) type = CHROMA_TYPE_YUV420; // YUV420; else type = (m_dec[0]->m_ccomp[1].m_hsampling == 1) ? CHROMA_TYPE_YUV422H_4Y : CHROMA_TYPE_YUV422V_4Y; // YUV422H_4Y, YUV422V_4Y } break; case 4: // YUV411 assert(m_dec[0]->m_ccomp[0].m_vsampling == 1); type = CHROMA_TYPE_YUV411; break; default: assert(false); break; } return type; } JCOLOR MJPEGVideoDecoderMFX::GetColorType() { JCOLOR color = JC_UNKNOWN; switch(m_dec[0]->m_jpeg_color) { case JC_UNKNOWN: color = JC_UNKNOWN; break; case JC_GRAY: color = JC_GRAY; break; case JC_YCBCR: color = JC_YCBCR; break; case JC_RGB: color = JC_RGB; break; default: assert(false); break; } return color; } Status MJPEGVideoDecoderMFX::FillVideoParam(mfxVideoParam *par, bool /*full*/) { memset(par, 0, sizeof(mfxVideoParam)); par->mfx.CodecId = MFX_CODEC_JPEG; par->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; mfxSize size = m_frameDims; AdjustFrameSize(size); par->mfx.FrameInfo.Width = mfxU16(size.width); par->mfx.FrameInfo.Height = mfxU16(size.height); par->mfx.FrameInfo.CropX = 0; par->mfx.FrameInfo.CropY = 0; par->mfx.FrameInfo.CropH = (mfxU16) (m_frameDims.height); par->mfx.FrameInfo.CropW = (mfxU16) (m_frameDims.width); par->mfx.FrameInfo.CropW = mfx::align2_value(par->mfx.FrameInfo.CropW, 2); par->mfx.FrameInfo.CropH = mfx::align2_value(par->mfx.FrameInfo.CropH, 2); par->mfx.FrameInfo.PicStruct = (mfxU8)(m_interleaved ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_PROGRESSIVE); par->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; par->mfx.FrameInfo.AspectRatioW = 0; par->mfx.FrameInfo.AspectRatioH = 0; par->mfx.FrameInfo.FrameRateExtD = 1; par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.CodecProfile = 1; par->mfx.CodecLevel = 1; par->mfx.JPEGChromaFormat = GetMFXChromaFormat(GetChromaType()); par->mfx.JPEGColorFormat = GetMFXColorFormat(GetColorType()); par->mfx.Rotation = MFX_ROTATION_0; par->mfx.InterleavedDec = (mfxU16)(m_interleavedScan ? MFX_SCANTYPE_INTERLEAVED : MFX_SCANTYPE_NONINTERLEAVED); par->mfx.NumThread = 0; return UMC_OK; } Status MJPEGVideoDecoderMFX::FillQuantTableExtBuf(mfxExtJPEGQuantTables* quantTables) { if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; quantTables->NumTable = m_dec[0]->GetNumQuantTables(); for(int i=0; iNumTable; i++) { m_dec[0]->FillQuantTable(i, quantTables->Qm[i]); } return UMC_OK; } Status MJPEGVideoDecoderMFX::FillHuffmanTableExtBuf(mfxExtJPEGHuffmanTables* huffmanTables) { if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; huffmanTables->NumACTable = m_dec[0]->GetNumACTables(); for(int i=0; iNumACTable; i++) { m_dec[0]->FillACTable(i, huffmanTables->ACTables[i].Bits, huffmanTables->ACTables[i].Values); } huffmanTables->NumDCTable = m_dec[0]->GetNumDCTables(); for(int i=0; iNumDCTable; i++) { m_dec[0]->FillDCTable(i, huffmanTables->DCTables[i].Bits, huffmanTables->DCTables[i].Values); } return UMC_OK; } Status MJPEGVideoDecoderMFX::DecodeHeader(MediaData* in) { if(0 == in) return UMC_ERR_NOT_ENOUGH_DATA; JpegFrameConstructor frameConstructor; frameConstructor.Init(); MediaData dst; for ( ; in->GetDataSize() > 3; ) { int32_t code = frameConstructor.CheckMarker(in); if (!code) { return UMC_ERR_NOT_ENOUGH_DATA; } if (code != JM_SOI) { frameConstructor.GetMarker(in, &dst); } else { break; } } Status sts = _GetFrameInfo((uint8_t*)in->GetDataPointer(), in->GetDataSize(), in); if (sts == UMC_ERR_NOT_ENOUGH_DATA && (!(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) || (in->GetFlags() & MediaData::FLAG_VIDEO_DATA_END_OF_STREAM))) { return UMC_ERR_INVALID_STREAM; } return sts; } Status MJPEGVideoDecoderMFX::AllocateFrame() { mfxSize size; size.height = m_DecoderParams.info.disp_clip_info.height; size.width = m_DecoderParams.info.disp_clip_info.width; VideoDataInfo info; info.Init(size.width, size.height, m_DecoderParams.info.color_format, 8); info.SetPictureStructure(m_interleaved ? VideoDataInfo::PS_FRAME : VideoDataInfo::PS_TOP_FIELD_FIRST); FrameMemID frmMID; Status sts = m_frameAllocator->Alloc(&frmMID, &info, 0); if (sts != UMC_OK) { return UMC_ERR_ALLOC; } const FrameData *frmData = m_frameAllocator->Lock(frmMID); if (!frmData) return UMC_ERR_LOCK; m_frameData = *frmData; if (frmData->GetPlaneMemoryInfo(0)->m_planePtr) m_frameData.m_locked = true; ColorFormat frm = NONE; m_needPostProcessing = false; if((JC_RGB == m_color || JC_GRAY == m_color) && RGB32 == m_DecoderParams.info.color_format) { frm = RGB32; } else if((JC_YCBCR == m_color || JC_GRAY == m_color) && NV12 == m_DecoderParams.info.color_format) { frm = NV12; } // WA to support YUY2 output when HW decoder uses SW fallback else if((JC_YCBCR == m_color || JC_GRAY == m_color) && YUY2 == m_DecoderParams.info.color_format) { frm = NV12; m_needPostProcessing = true; } else if(JC_RGB == m_color && NV12 == m_DecoderParams.info.color_format) { // single scan if(m_dec[0]->m_jpeg_ncomp == m_dec[0]->m_scans[0].ncomps) { frm = NV12; } // multiple scans else { frm = RGB32; m_needPostProcessing = true; } } // WA to support YUY2 output when HW decoder uses SW fallback else if(JC_RGB == m_color && YUY2 == m_DecoderParams.info.color_format) { // single scan if(m_dec[0]->m_jpeg_ncomp == m_dec[0]->m_scans[0].ncomps) { frm = NV12; m_needPostProcessing = true; } // multiple scans else { frm = RGB32; m_needPostProcessing = true; } } else if(JC_YCBCR == m_color && RGB32 == m_DecoderParams.info.color_format) { // single scan if(m_dec[0]->m_jpeg_ncomp == m_dec[0]->m_scans[0].ncomps) { frm = RGB32; } // multiple scans else { frm = YUV444; m_needPostProcessing = true; } } else { return UMC_ERR_UNSUPPORTED; } size = m_frameDims; AdjustFrameSize(size); m_internalFrame.Init(size.width, size.height, frm); if(m_needPostProcessing || m_rotation) { sts = m_internalFrame.Alloc(); if (UMC_OK != sts) return UMC_ERR_ALLOC; } else { if (RGB32 == m_internalFrame.GetColorFormat()) { m_internalFrame.SetPlanePointer(frmData->GetPlaneMemoryInfo(0)->m_planePtr, 0); m_internalFrame.SetPlanePitch(frmData->GetPlaneMemoryInfo(0)->m_pitch, 0); } else if (NV12 == m_internalFrame.GetColorFormat()) { m_internalFrame.SetPlanePointer(frmData->GetPlaneMemoryInfo(0)->m_planePtr, 0); m_internalFrame.SetPlanePitch(frmData->GetPlaneMemoryInfo(0)->m_pitch, 0); m_internalFrame.SetPlanePointer(frmData->GetPlaneMemoryInfo(1)->m_planePtr, 1); m_internalFrame.SetPlanePitch(frmData->GetPlaneMemoryInfo(1)->m_pitch, 1); } } return UMC_OK; } FrameData *MJPEGVideoDecoderMFX::GetDst(void) { return &m_frameData; } // FrameData *MJPEGVideoDecoderMFX::GetDst(void) Status MJPEGVideoDecoderMFX::SetRotation(uint16_t rotation) { m_rotation = rotation; return UMC_OK; } // MJPEGVideoDecoderMFX::SetRotation(uint16_t rotation) Status MJPEGVideoDecoderMFX::SetColorSpace(uint16_t chromaFormat, uint16_t colorFormat) { if(m_dec.empty() || m_dec.size() > JPEG_MAX_THREADS) return UMC_ERR_FAILED; for (auto& dec: m_dec) { dec->m_jpeg_color = GetUMCColorType(chromaFormat, colorFormat); } return UMC_OK; } // MJPEGVideoDecoderMFX::SetRotation(uint16_t rotation) Status MJPEGVideoDecoderMFX::DecodePicture(const CJpegTask &task, const mfxU32 threadNumber, const mfxU32 callNumber) { Status umcRes = UMC_OK; mfxU32 picNum, pieceNum; mfxI32 curr_scan_no; JERRCODE jerr; int i; /* if(0 == out) return UMC_ERR_NULL_PTR; *out = 0;*/ MFX_LTRACE_1(MFX_TRACE_LEVEL_INTERNAL, "MJPEG, frame: ", "%d", m_frameNo); // find appropriate source picture buffer picNum = 0; pieceNum = callNumber; while (task.GetPictureBuffer(picNum).numPieces <= pieceNum) { pieceNum -= task.GetPictureBuffer(picNum).numPieces; picNum += 1; } const CJpegTaskBuffer &picBuffer = task.GetPictureBuffer(picNum); // check if there is a need to decode the header if (m_pLastPicBuffer[threadNumber] != &picBuffer) { int32_t nUsedBytes = 0; // set the source data jerr = m_dec[threadNumber]->SetSource((uint8_t *) picBuffer.pBuf, picBuffer.imageHeaderSize + picBuffer.scanSize[0]); if (JPEG_OK != jerr) return UMC_ERR_FAILED; umcRes = _DecodeHeader(&nUsedBytes, threadNumber); if (UMC_OK != umcRes) { return umcRes; } // save the pointer to the last decoded picture m_pLastPicBuffer[threadNumber] = &picBuffer; m_dec[threadNumber]->m_curr_scan = &m_dec[threadNumber]->m_scans[0]; } // determinate scan number contained current piece if(picBuffer.scanOffset[0] <= picBuffer.pieceOffset[pieceNum] && (picBuffer.pieceOffset[pieceNum] < picBuffer.scanOffset[1] || 0 == picBuffer.scanOffset[1])) { curr_scan_no = 0; } else if(picBuffer.scanOffset[1] <= picBuffer.pieceOffset[pieceNum] && (picBuffer.pieceOffset[pieceNum] < picBuffer.scanOffset[2] || 0 == picBuffer.scanOffset[2])) { curr_scan_no = 1; } else if(picBuffer.scanOffset[2] <= picBuffer.pieceOffset[pieceNum]) { curr_scan_no = 2; } else { return UMC_ERR_FAILED; } // check if there is a need to decode scan header and DRI segment if(m_dec[threadNumber]->m_curr_scan->scan_no != curr_scan_no) { for(i = 1; i <= curr_scan_no; i++) { m_dec[threadNumber]->m_curr_scan = &m_dec[threadNumber]->m_scans[i]; if(picBuffer.scanTablesOffset[i] != 0) { int32_t nUsedBytes = 0; jerr = m_dec[threadNumber]->SetSource((uint8_t *) picBuffer.pBuf + picBuffer.scanTablesOffset[i], picBuffer.scanTablesSize[i] + picBuffer.scanSize[i]); if (JPEG_OK != jerr) return UMC_ERR_FAILED; umcRes = _DecodeHeader(&nUsedBytes, threadNumber); if (UMC_OK != umcRes) { return umcRes; } } } } m_dec[threadNumber]->m_num_scans = picBuffer.numScans; // set the next piece to the decoder jerr = m_dec[threadNumber]->SetSource(picBuffer.pBuf + picBuffer.pieceOffset[pieceNum], picBuffer.pieceSize[pieceNum]); if(JPEG_OK != jerr) return UMC_ERR_FAILED; // decode a next piece from the picture umcRes = DecodePiece(picBuffer.fieldPos, (mfxU32)picBuffer.pieceRSTOffset[pieceNum], (mfxU32)(picBuffer.pieceRSTOffset[pieceNum+1] - picBuffer.pieceRSTOffset[pieceNum]), threadNumber); if (UMC_OK != umcRes) { task.surface_out->Data.Corrupted = 1; return umcRes; } return UMC_OK; } // Status MJPEGVideoDecoderMFX::DecodePicture(const CJpegTask &task, Status MJPEGVideoDecoderMFX::PostProcessing(double pts) { VideoData rotatedFrame; m_frameNo++; if (pts > -1.0) { m_local_frame_time = pts; } m_frameData.SetTime(m_local_frame_time); m_local_frame_time += m_local_delta_frame_time; if(m_rotation) { mfxSize size; uint8_t* pSrc[4]; size_t pSrcPitch[4]; uint8_t* pDst[4]; size_t pDstPitch[4]; Status sts = UMC_OK; size.height = m_DecoderParams.info.disp_clip_info.height; size.width = m_DecoderParams.info.disp_clip_info.width; rotatedFrame.Init(size.width, size.height, m_internalFrame.GetColorFormat()); if(m_needPostProcessing) { sts = rotatedFrame.Alloc(); if (UMC_OK != sts) return UMC_ERR_ALLOC; } else { if (RGB32 == m_internalFrame.GetColorFormat()) { rotatedFrame.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(0)->m_planePtr, 0); rotatedFrame.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(0)->m_pitch, 0); } else if (NV12 == m_internalFrame.GetColorFormat()) { rotatedFrame.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(0)->m_planePtr, 0); rotatedFrame.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(0)->m_pitch, 0); rotatedFrame.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(1)->m_planePtr, 1); rotatedFrame.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(1)->m_pitch, 1); } } switch(m_internalFrame.GetColorFormat()) { case NV12: { pSrc[0] = (uint8_t*)m_internalFrame.GetPlanePointer(0); pSrc[1] = (uint8_t*)m_internalFrame.GetPlanePointer(1); pSrcPitch[0] = m_internalFrame.GetPlanePitch(0); pSrcPitch[1] = m_internalFrame.GetPlanePitch(1); pDst[0] = (uint8_t*)rotatedFrame.GetPlanePointer(0); pDst[1] = (uint8_t*)rotatedFrame.GetPlanePointer(1); pDstPitch[0] = rotatedFrame.GetPlanePitch(0); pDstPitch[1] = rotatedFrame.GetPlanePitch(1); switch(m_rotation) { case 90: for(int32_t i=0; i> 1; i++) for(int32_t j=0; j> 1; j++) { pDst[0][( i<<1 )*pDstPitch[0] + (j<<1) ] = pSrc[0][(m_frameDims.height-1-(j<<1)) * pSrcPitch[0] + (i<<1) ]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1) ] = pSrc[0][(m_frameDims.height-1-(j<<1)) * pSrcPitch[0] + (i<<1)+1]; pDst[0][( i<<1 )*pDstPitch[0] + (j<<1)+1] = pSrc[0][(m_frameDims.height-2-(j<<1)) * pSrcPitch[0] + (i<<1) ]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1)+1] = pSrc[0][(m_frameDims.height-2-(j<<1)) * pSrcPitch[0] + (i<<1)+1]; pDst[1][i*pDstPitch[1] + (j<<1) ] = pSrc[1][((m_frameDims.height>>1)-1-j)*pSrcPitch[1] + (i<<1) ]; pDst[1][i*pDstPitch[1] + (j<<1)+1] = pSrc[1][((m_frameDims.height>>1)-1-j)*pSrcPitch[1] + (i<<1)+1]; } break; case 180: for(int32_t i=0; i> 1; i++) for(int32_t j=0; j> 1; j++) { pDst[0][( i<<1 )*pDstPitch[0] + (j<<1) ] = pSrc[0][(m_frameDims.height-1-(i<<1)) * pSrcPitch[0] + m_frameDims.width-1-(j<<1)]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1) ] = pSrc[0][(m_frameDims.height-2-(i<<1)) * pSrcPitch[0] + m_frameDims.width-1-(j<<1)]; pDst[0][( i<<1 )*pDstPitch[0] + (j<<1)+1] = pSrc[0][(m_frameDims.height-1-(i<<1)) * pSrcPitch[0] + m_frameDims.width-2-(j<<1)]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1)+1] = pSrc[0][(m_frameDims.height-2-(i<<1)) * pSrcPitch[0] + m_frameDims.width-2-(j<<1)]; pDst[1][i*pDstPitch[1] + (j<<1) ] = pSrc[1][((m_frameDims.height>>1)-1-i)*pSrcPitch[1] + m_frameDims.width-2-(j<<1)]; pDst[1][i*pDstPitch[1] + (j<<1)+1] = pSrc[1][((m_frameDims.height>>1)-1-i)*pSrcPitch[1] + m_frameDims.width-1-(j<<1)]; } break; case 270: for(int32_t i=0; i> 1; i++) for(int32_t j=0; j> 1; j++) { pDst[0][( i<<1 )*pDstPitch[0] + (j<<1) ] = pSrc[0][((j<<1) ) * pSrcPitch[0] + m_frameDims.width-1-(i<<1)]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1) ] = pSrc[0][((j<<1) ) * pSrcPitch[0] + m_frameDims.width-2-(i<<1)]; pDst[0][( i<<1 )*pDstPitch[0] + (j<<1)+1] = pSrc[0][((j<<1)+1) * pSrcPitch[0] + m_frameDims.width-1-(i<<1)]; pDst[0][((i<<1)+1)*pDstPitch[0] + (j<<1)+1] = pSrc[0][((j<<1)+1) * pSrcPitch[0] + m_frameDims.width-2-(i<<1)]; pDst[1][i*pDstPitch[1] + (j<<1) ] = pSrc[1][j*pSrcPitch[1] + m_frameDims.width-2-(i<<1)]; pDst[1][i*pDstPitch[1] + (j<<1)+1] = pSrc[1][j*pSrcPitch[1] + m_frameDims.width-1-(i<<1)]; } break; } } break; case RGB32: { pSrc[0] = (uint8_t*)m_internalFrame.GetPlanePointer(0); pSrcPitch[0] = m_internalFrame.GetPlanePitch(0); pDst[0] = (uint8_t*)rotatedFrame.GetPlanePointer(0); pDstPitch[0] = rotatedFrame.GetPlanePitch(0); switch(m_rotation) { case 90: for(int32_t i=0; im_planePtr, 0); out.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(0)->m_pitch, 0); break; case NV12: out.Init(size.width, size.height, NV12, 8); out.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(0)->m_planePtr, 0); out.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(0)->m_pitch, 0); out.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(1)->m_planePtr, 1); out.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(1)->m_pitch, 1); break; case YUY2: out.Init(size.width, size.height, YUY2, 8); out.SetPlanePointer(m_frameData.GetPlaneMemoryInfo(0)->m_planePtr, 0); out.SetPlanePitch(m_frameData.GetPlaneMemoryInfo(0)->m_pitch, 0); break; default: return UMC_ERR_UNSUPPORTED; } m_internalFrame.SetPictureStructure(m_interleaved ? PS_TOP_FIELD_FIRST : PS_FRAME); out.SetPictureStructure(m_internalFrame.GetPictureStructure()); if (!m_PostProcessing) { m_PostProcessing.reset(createVideoProcessing()); } Status status = m_PostProcessing->GetFrame(&m_internalFrame, &out); if(status != UMC_OK) { return status; } } rotatedFrame.Close(); return UMC_OK; } Status MJPEGVideoDecoderMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in) { int32_t nchannels; int32_t precision; JSS sampling; JCOLOR color; JERRCODE jerr; m_dec[0]->SetDecodeErrorReportParam(in); if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; jerr = m_dec[0]->SetSource(pBitStream, nSize); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_dec[0]->ReadHeader( &m_frameDims.width,&m_frameDims.height,&nchannels,&color,&sampling,&precision); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_NOT_IMPLEMENTED == jerr) return UMC_ERR_NOT_IMPLEMENTED; if(JPEG_OK != jerr) return UMC_ERR_FAILED; m_frameSampling = (int) sampling; m_color = color; m_interleavedScan = m_dec[0]->IsInterleavedScan(); // frame is interleaved if clip height is twice more than JPEG frame height if (m_DecoderParams.info.interlace_type != PROGRESSIVE) { m_interleaved = true; m_frameDims.height *= 2; } return UMC_OK; } // MJPEGVideoDecoderMFX::_GetFrameInfo() Status MJPEGVideoDecoderMFX::CloseFrame(void) { m_frameData.Close(); std::fill(std::begin(m_pLastPicBuffer), std::end(m_pLastPicBuffer), nullptr); return UMC_OK; } // Status MJPEGVideoDecoderMFX::CloseFrame(void) Status MJPEGVideoDecoderMFX::_DecodeHeader(int32_t* cnt, const uint32_t threadNum) { JSS sampling; JERRCODE jerr; if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; mfxSize size = {}; jerr = m_dec[threadNum]->ReadHeader( &size.width, &size.height, &m_frameChannels, &m_color, &sampling, &m_framePrecision); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_OK != jerr) return UMC_ERR_FAILED; bool sizeHaveChanged = (m_frameDims.width != size.width || (m_frameDims.height != size.height && m_frameDims.height != (size.height << 1))); if ((m_frameSampling != (int)sampling) || (m_frameDims.width && sizeHaveChanged)) { m_dec[threadNum]->Seek(-m_dec[threadNum]->GetNumDecodedBytes(),UIC_SEEK_CUR); *cnt = 0; return UMC_ERR_NOT_ENOUGH_DATA;//UMC_WRN_INVALID_STREAM; } m_frameSampling = (int)sampling; *cnt = m_dec[threadNum]->GetNumDecodedBytes(); return UMC_OK; } Status MJPEGVideoDecoderMFX::DecodePiece(const mfxU32 fieldNum, const mfxU32 restartNum, const mfxU32 restartsToDecode, const mfxU32 threadNum) { int32_t dstPlaneStep[4]; uint8_t* pDstPlane[4]; int32_t dstStep; uint8_t* pDst; //JSS sampling = (JSS)m_frameSampling; JERRCODE jerr = JPEG_OK; mfxSize dimension = m_frameDims; if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; if (RGB32 == m_internalFrame.GetColorFormat()) { dstStep = (int32_t)m_internalFrame.GetPlanePitch(0); pDst = (uint8_t*)m_internalFrame.GetPlanePointer(0); if (m_interleaved) { if (fieldNum & 1)//!m_firstField) pDst += dstStep; dstStep *= 2; dimension.height /= 2; } jerr = m_dec[threadNum]->SetDestination(pDst, dstStep, dimension, m_frameChannels, JC_BGRA, JS_444); } else if (YUV444 == m_internalFrame.GetColorFormat()) { pDstPlane[0] = (uint8_t*)m_internalFrame.GetPlanePointer(0); pDstPlane[1] = (uint8_t*)m_internalFrame.GetPlanePointer(1); pDstPlane[2] = (uint8_t*)m_internalFrame.GetPlanePointer(2); pDstPlane[3] = 0; dstPlaneStep[0] = (int32_t)m_internalFrame.GetPlanePitch(0); dstPlaneStep[1] = (int32_t)m_internalFrame.GetPlanePitch(1); dstPlaneStep[2] = (int32_t)m_internalFrame.GetPlanePitch(2); dstPlaneStep[3] = 0; if (m_interleaved) { for (int32_t i = 0; i < 3; i++) { if (fieldNum & 1)//!m_firstField) pDstPlane[i] += dstPlaneStep[i]; dstPlaneStep[i] *= 2; } dimension.height /= 2; } jerr = m_dec[threadNum]->SetDestination(pDstPlane, dstPlaneStep, dimension, m_frameChannels, JC_YCBCR, JS_444); } else if (NV12 == m_internalFrame.GetColorFormat()) { pDstPlane[0] = (uint8_t*)m_internalFrame.GetPlanePointer(0); pDstPlane[1] = (uint8_t*)m_internalFrame.GetPlanePointer(1); pDstPlane[2] = 0; pDstPlane[3] = 0; dstPlaneStep[0] = (int32_t)m_internalFrame.GetPlanePitch(0); dstPlaneStep[1] = (int32_t)m_internalFrame.GetPlanePitch(1); dstPlaneStep[2] = 0; dstPlaneStep[3] = 0; if (m_interleaved) { for (int32_t i = 0; i < 3; i++) { if (fieldNum & 1)//!m_firstField) pDstPlane[i] += dstPlaneStep[i]; dstPlaneStep[i] *= 2; } dimension.height /= 2; } jerr = m_dec[threadNum]->SetDestination(pDstPlane, dstPlaneStep, dimension, m_frameChannels, JC_NV12, JS_420); } else { return UMC_ERR_FAILED; } if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_dec[threadNum]->ReadData(restartNum, restartsToDecode); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_OK != jerr) return UMC_ERR_FAILED; return UMC_OK; } // Status MJPEGVideoDecoderMFX::DecodePiece(const mfxU32 fieldNum, void MJPEGVideoDecoderMFX::SetFrameAllocator(FrameAllocator * frameAllocator) { assert(frameAllocator); m_frameAllocator = frameAllocator; } ConvertInfo * MJPEGVideoDecoderMFX::GetConvertInfo() { return 0; } Status MJPEGVideoDecoderMFX::FindStartOfImage(MediaData * in) { JERRCODE jerr; if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; jerr = m_dec[0]->SetSource((uint8_t*)in->GetDataPointer(), in->GetDataSize()); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_dec[0]->FindSOI(); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_OK != jerr) return UMC_ERR_FAILED; in->MoveDataPointer(m_dec[0]->m_BitStreamIn.GetNumUsedBytes()); return UMC_OK; } } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE umc_mjpeg_mfx_decode_base.cpp000066400000000000000000000270411443134507600341410ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "umc_video_data.h" #include "umc_mjpeg_mfx_decode_base.h" #include "membuffin.h" #include "umc_jpeg_frame_constructor.h" #include "mfx_utils.h" namespace UMC { MJPEGVideoDecoderBaseMFX::MJPEGVideoDecoderBaseMFX(void) : m_frameDims() { m_IsInit = false; m_interleaved = false; m_interleavedScan = false; m_rotation = 0; m_frameSampling = 0; m_frameAllocator = 0; m_decBase = 0; m_color = JC_UNKNOWN; } MJPEGVideoDecoderBaseMFX::~MJPEGVideoDecoderBaseMFX(void) { Close(); } Status MJPEGVideoDecoderBaseMFX::Init(BaseCodecParams* lpInit) { VideoDecoderParams* pDecoderParams = DynamicCast(lpInit); if(0 == pDecoderParams) return UMC_ERR_NULL_PTR; Status status = Close(); if(UMC_OK != status) return UMC_ERR_INIT; m_DecoderParams = *pDecoderParams; m_IsInit = true; m_interleaved = false; m_interleavedScan = false; m_frameSampling = 0; m_rotation = 0; m_decoder.reset(new CJPEGDecoderBase()); m_decBase = m_decoder.get(); return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::Reset(void) { m_IsInit = true; m_interleaved = false; m_interleavedScan = false; m_frameSampling = 0; m_rotation = 0; m_frameData.Close(); m_decBase->Reset(); return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::Close(void) { m_IsInit = false; m_interleaved = false; m_interleavedScan = false; m_frameSampling = 0; m_rotation = 0; m_frameData.Close(); m_decBase = 0; return UMC_OK; } void MJPEGVideoDecoderBaseMFX::AdjustFrameSize(mfxSize & size) { size.width = mfx::align2_value(size.width, 16); size.height = mfx::align2_value(size.height, m_interleaved ? 16 : 8); } std::pair MJPEGVideoDecoderBaseMFX::GetChromaType() { /* 0:YUV400 (grayscale image) Y: h=1 v=1, 1:YUV420 Y: h=2 v=2, Cb/Cr: h=1 v=1 2:YUV422H_2Y Y: h=2 v=1, Cb/Cr: h=1 v=1 3:YUV444 Y: h=1 v=1, Cb/Cr: h=1 v=1 4:YUV411 Y: h=4 v=1, Cb/Cr: h=1 v=1 5:YUV422V_2Y Y: h=1 v=2, Cb/Cr: h=1 v=1 6:YUV422H_4Y Y: h=2 v=2, Cb/Cr: h=1 v=2 7:YUV422V_4Y Y: h=2 v=2, Cb/Cr: h=2 v=1 */ if (m_decBase->m_jpeg_ncomp == 1) { return { CHROMA_TYPE_YUV400, UMC_OK }; } ChromaType type = CHROMA_TYPE_YUV400; switch(m_decBase->m_ccomp[0].m_hsampling) { case 1: // YUV422V_2Y, YUV444 if (m_decBase->m_ccomp[0].m_vsampling == 1) // YUV444 { if (m_decBase->m_jpeg_color == JC_YCBCR) type = CHROMA_TYPE_YUV444; else if (m_decBase->m_jpeg_color == JC_RGB) type = CHROMA_TYPE_RGB; else return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } else { if (m_decBase->m_ccomp[0].m_vsampling != 2 || m_decBase->m_ccomp[1].m_hsampling != 1) { return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } type = CHROMA_TYPE_YUV422V_2Y; // YUV422V_2Y } break; case 2: // YUV420, YUV422H_2Y, YUV422H_4Y, YUV422V_4Y if (m_decBase->m_ccomp[0].m_vsampling == 1) { if ( m_decBase->m_ccomp[1].m_vsampling != 1 || m_decBase->m_ccomp[1].m_hsampling != 1) { return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } type = CHROMA_TYPE_YUV422H_2Y; // YUV422H_2Y } else { if (m_decBase->m_ccomp[0].m_vsampling != 2) { return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } if (m_decBase->m_ccomp[1].m_hsampling == 1 && m_decBase->m_ccomp[1].m_vsampling == 1) type = CHROMA_TYPE_YUV420; // YUV420; else type = (m_decBase->m_ccomp[1].m_hsampling == 1) ? CHROMA_TYPE_YUV422H_4Y : CHROMA_TYPE_YUV422V_4Y; // YUV422H_4Y, YUV422V_4Y } break; case 4: // YUV411 if (m_decBase->m_ccomp[0].m_vsampling != 1) { return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } type = CHROMA_TYPE_YUV411; break; default: return { CHROMA_TYPE_YUV400, UMC_ERR_UNSUPPORTED }; } return { type, UMC_OK }; } std::pair MJPEGVideoDecoderBaseMFX::GetColorType() { JCOLOR color = JC_UNKNOWN; switch(m_decBase->m_jpeg_color) { case JC_UNKNOWN: color = JC_UNKNOWN; break; case JC_GRAY: color = JC_GRAY; break; case JC_YCBCR: color = JC_YCBCR; break; case JC_RGB: color = JC_RGB; break; default: return { JC_UNKNOWN, UMC_ERR_UNSUPPORTED }; } return { color, UMC_OK }; } Status MJPEGVideoDecoderBaseMFX::FillVideoParam(mfxVideoParam *par, bool /*full*/) { memset(par, 0, sizeof(mfxVideoParam)); par->mfx.CodecId = MFX_CODEC_JPEG; par->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; mfxSize size = m_frameDims; AdjustFrameSize(size); par->mfx.FrameInfo.Width = mfxU16(size.width); par->mfx.FrameInfo.Height = mfxU16(size.height); par->mfx.FrameInfo.CropX = 0; par->mfx.FrameInfo.CropY = 0; par->mfx.FrameInfo.CropH = (mfxU16) (m_frameDims.height); par->mfx.FrameInfo.CropW = (mfxU16) (m_frameDims.width); par->mfx.FrameInfo.CropW = mfx::align2_value(par->mfx.FrameInfo.CropW, 2); par->mfx.FrameInfo.CropH = mfx::align2_value(par->mfx.FrameInfo.CropH, 2); par->mfx.FrameInfo.PicStruct = (mfxU8)(m_interleaved ? MFX_PICSTRUCT_FIELD_TFF : MFX_PICSTRUCT_PROGRESSIVE); par->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; par->mfx.FrameInfo.AspectRatioW = 0; par->mfx.FrameInfo.AspectRatioH = 0; par->mfx.FrameInfo.FrameRateExtD = 1; par->mfx.FrameInfo.FrameRateExtN = 30; par->mfx.CodecProfile = 1; par->mfx.CodecLevel = 1; std::pair chromaTypeRes = GetChromaType(); if (chromaTypeRes.second != UMC_OK) { return chromaTypeRes.second; } par->mfx.JPEGChromaFormat = GetMFXChromaFormat(chromaTypeRes.first); std::pair colorTypeRes = GetColorType(); if (colorTypeRes.second != UMC_OK) { return colorTypeRes.second; } par->mfx.JPEGColorFormat = GetMFXColorFormat(colorTypeRes.first); par->mfx.Rotation = MFX_ROTATION_0; par->mfx.InterleavedDec = (mfxU16)(m_interleavedScan ? MFX_SCANTYPE_INTERLEAVED : MFX_SCANTYPE_NONINTERLEAVED); par->mfx.NumThread = 0; return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::FillQuantTableExtBuf(mfxExtJPEGQuantTables* quantTables) { if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; quantTables->NumTable = m_decBase->GetNumQuantTables(); for(int i=0; iNumTable; i++) { m_decBase->FillQuantTable(i, quantTables->Qm[i]); } return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::FillHuffmanTableExtBuf(mfxExtJPEGHuffmanTables* huffmanTables) { if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; huffmanTables->NumACTable = m_decBase->GetNumACTables(); for(int i=0; iNumACTable; i++) { m_decBase->FillACTable(i, huffmanTables->ACTables[i].Bits, huffmanTables->ACTables[i].Values); } huffmanTables->NumDCTable = m_decBase->GetNumDCTables(); for(int i=0; iNumDCTable; i++) { m_decBase->FillDCTable(i, huffmanTables->DCTables[i].Bits, huffmanTables->DCTables[i].Values); } return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::DecodeHeader(MediaData* in) { if(0 == in) return UMC_ERR_NOT_ENOUGH_DATA; JpegFrameConstructor frameConstructor; frameConstructor.Init(); MediaData dst; for ( ; in->GetDataSize() > 3; ) { int32_t code = frameConstructor.CheckMarker(in); if (!code) { return UMC_ERR_NOT_ENOUGH_DATA; } if (code != JM_SOI) { frameConstructor.GetMarker(in, &dst); } else { break; } } Status sts = _GetFrameInfo((uint8_t*)in->GetDataPointer(), in->GetDataSize(), in); if (sts == UMC_ERR_NOT_ENOUGH_DATA && (!(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) || (in->GetFlags() & MediaData::FLAG_VIDEO_DATA_END_OF_STREAM))) { return UMC_ERR_INVALID_STREAM; } return sts; } Status MJPEGVideoDecoderBaseMFX::SetRotation(uint16_t rotation) { #ifdef MFX_ENABLE_MJPEG_ROTATE_VPP (void)rotation; m_rotation = 0; #else m_rotation = rotation; #endif return UMC_OK; } Status MJPEGVideoDecoderBaseMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in) { int32_t nchannels; int32_t precision; JSS sampling; JCOLOR color; JERRCODE jerr; m_decBase->SetDecodeErrorReportParam(in); if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; jerr = m_decBase->SetSource(pBitStream, nSize); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->ReadHeader( &m_frameDims.width,&m_frameDims.height,&nchannels,&color,&sampling,&precision); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_NOT_IMPLEMENTED == jerr) return UMC_ERR_NOT_IMPLEMENTED; if(JPEG_OK != jerr) return UMC_ERR_FAILED; m_frameSampling = (int) sampling; m_color = color; m_interleavedScan = m_decBase->IsInterleavedScan(); // frame is interleaved if clip height is twice more than JPEG frame height if (m_DecoderParams.info.interlace_type != PROGRESSIVE) { m_interleaved = true; m_frameDims.height *= 2; } return UMC_OK; } void MJPEGVideoDecoderBaseMFX::SetFrameAllocator(FrameAllocator * frameAllocator) { assert(frameAllocator); m_frameAllocator = frameAllocator; } Status MJPEGVideoDecoderBaseMFX::FindStartOfImage(MediaData * in) { CMemBuffInput source; JERRCODE jerr; if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; jerr = m_decBase->SetSource((uint8_t*)in->GetDataPointer(), in->GetDataSize()); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->FindSOI(); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_OK != jerr) return UMC_ERR_FAILED; in->MoveDataPointer(m_decBase->m_BitStreamIn.GetNumUsedBytes()); return UMC_OK; } } // end namespace UMC #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE umc_mjpeg_mfx_decode_hw.cpp000066400000000000000000000712421443134507600336470ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/jpeg_dec/src// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "umc_mjpeg_mfx_decode_hw.h" #if defined(UMC_VA) #include #include #include namespace UMC { MJPEGVideoDecoderMFX_HW::MJPEGVideoDecoderMFX_HW(void) : m_convertInfo() { m_fourCC = 0; m_statusReportFeedbackCounter = 0; m_va = 0; } // ctor MJPEGVideoDecoderMFX_HW::~MJPEGVideoDecoderMFX_HW(void) { Close(); } // dtor Status MJPEGVideoDecoderMFX_HW::Init(BaseCodecParams* lpInit) { VideoDecoderParams* pDecoderParams = DynamicCast(lpInit); if(0 == pDecoderParams) return UMC_ERR_NULL_PTR; Status status = Close(); if(UMC_OK != status) return UMC_ERR_INIT; m_DecoderParams = *pDecoderParams; m_IsInit = true; m_interleaved = false; m_interleavedScan = false; m_frameSampling = 0; m_statusReportFeedbackCounter = 1; m_fourCC = 0; m_va = pDecoderParams->pVideoAccelerator; m_decoder.reset(new CJPEGDecoderBase()); m_decBase = m_decoder.get(); return UMC_OK; } // MJPEGVideoDecoderMFX_HW::Init() Status MJPEGVideoDecoderMFX_HW::Reset(void) { m_statusReportFeedbackCounter = 1; { AutomaticUMCMutex guard(m_guard); m_cachedReadyTaskIndex.clear(); m_cachedCorruptedTaskIndex.clear(); m_submittedTaskIndex.clear(); #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD if (m_va && m_va->IsGPUSyncEventEnable()) m_pic_index.clear(); #endif } return MJPEGVideoDecoderBaseMFX::Reset(); } // MJPEGVideoDecoderMFX_HW::Reset() Status MJPEGVideoDecoderMFX_HW::Close(void) { { AutomaticUMCMutex guard(m_guard); m_cachedReadyTaskIndex.clear(); m_cachedCorruptedTaskIndex.clear(); m_submittedTaskIndex.clear(); #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD if (m_va && m_va->IsGPUSyncEventEnable()) m_pic_index.clear(); #endif } return MJPEGVideoDecoderBaseMFX::Close(); } // MJPEGVideoDecoderMFX_HW::Close() Status MJPEGVideoDecoderMFX_HW::AllocateFrame() { mfxSize size = m_frameDims; size.height = m_DecoderParams.info.disp_clip_info.height; size.width = m_DecoderParams.info.disp_clip_info.width; VideoDataInfo info; info.Init(size.width, size.height, m_DecoderParams.info.color_format, 8); info.SetPictureStructure(m_interleaved ? VideoDataInfo::PS_FRAME : VideoDataInfo::PS_TOP_FIELD_FIRST); FrameMemID frmMID; Status sts = m_frameAllocator->Alloc(&frmMID, &info, 0); if (sts != UMC_OK) { return UMC_ERR_ALLOC; } m_frameData.Init(&info, frmMID, m_frameAllocator); return UMC_OK; } Status MJPEGVideoDecoderMFX_HW::CloseFrame(UMC::FrameData** in, const mfxU32 fieldPos) { if((*in) != NULL) { (*in)[fieldPos].Close(); } return UMC_OK; } // Status MJPEGVideoDecoderMFX::CloseFrame(void) mfxStatus MJPEGVideoDecoderMFX_HW::CheckStatusReportNumber(uint32_t statusReportFeedbackNumber, mfxU16* corrupted) { UMC::Status sts = UMC_OK; mfxU32 numStructures = 32; mfxU32 numZeroFeedback = 0; JPEG_DECODE_QUERY_STATUS queryStatus[32]; std::set::iterator iteratorReady; std::set::iterator iteratorSubmitted; std::set::iterator iteratorCorrupted; AutomaticUMCMutex guard(m_guard); #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD if (m_va && m_va->IsGPUSyncEventEnable()) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_SCHED, "Dec vaSyncSurface"); auto iteratorPicIndex = m_pic_index.find(statusReportFeedbackNumber); if (m_pic_index.end() != iteratorPicIndex) { UMC::Status waitSts = m_va->SyncTask((int32_t)(iteratorPicIndex->second), NULL); if (waitSts != UMC_OK && waitSts != UMC_ERR_TIMEOUT) MFX_RETURN(MFX_ERR_DEVICE_FAILED); if (waitSts == UMC_OK) m_pic_index.erase(iteratorPicIndex); } } #endif iteratorReady = find(m_cachedReadyTaskIndex.begin(), m_cachedReadyTaskIndex.end(), statusReportFeedbackNumber); iteratorSubmitted = find(m_submittedTaskIndex.begin(), m_submittedTaskIndex.end(), statusReportFeedbackNumber); if (m_cachedReadyTaskIndex.end() == iteratorReady){ for (mfxU32 i = 0; i < numStructures; i += 1){ queryStatus[i].bStatus = 3; } // on Linux ExecuteStatusReportBuffer returns UMC_ERR_UNSUPPORTED so the task pretends as already done // mark tasks as not completed to skip them in the next loop for (mfxU32 i = 0; i < numStructures; i += 1) { queryStatus[i].bStatus = 5; queryStatus[i].StatusReportFeedbackNumber = 0; } // mark the first task as ready if m_submittedTaskIndex is not empty if (m_submittedTaskIndex.end() != iteratorSubmitted) { queryStatus[0].bStatus = 0; queryStatus[0].StatusReportFeedbackNumber = statusReportFeedbackNumber; } if(sts != UMC_OK) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } for (mfxU32 i = 0; i < numStructures; i += 1) { if(queryStatus[i].StatusReportFeedbackNumber==0)numZeroFeedback++; if (0 == queryStatus[i].bStatus || 1 == queryStatus[i].bStatus) { m_cachedReadyTaskIndex.insert(queryStatus[i].StatusReportFeedbackNumber); } else if (2 == queryStatus[i].bStatus) { m_cachedCorruptedTaskIndex.insert(queryStatus[i].StatusReportFeedbackNumber); } else if (3 == queryStatus[i].bStatus) { MFX_RETURN(MFX_ERR_DEVICE_FAILED); } else if (5 == queryStatus[i].bStatus) { numZeroFeedback--; // Operation is not completed; do nothing continue; } } iteratorReady = find(m_cachedReadyTaskIndex.begin(), m_cachedReadyTaskIndex.end(), statusReportFeedbackNumber); { if (m_cachedReadyTaskIndex.end() == iteratorReady) { iteratorCorrupted = find(m_cachedCorruptedTaskIndex.begin(), m_cachedCorruptedTaskIndex.end(), statusReportFeedbackNumber); if(m_cachedCorruptedTaskIndex.end() == iteratorCorrupted) { if(m_submittedTaskIndex.end() != iteratorSubmitted && numZeroFeedback == numStructures ) MFX_RETURN(MFX_ERR_DEVICE_FAILED) else MFX_RETURN(MFX_TASK_BUSY); } m_cachedCorruptedTaskIndex.erase(iteratorCorrupted); *corrupted = 1; m_submittedTaskIndex.erase(iteratorSubmitted); return MFX_TASK_DONE; } m_submittedTaskIndex.erase(iteratorSubmitted); m_cachedReadyTaskIndex.erase(iteratorReady); } }else{ m_submittedTaskIndex.erase(iteratorSubmitted); m_cachedReadyTaskIndex.erase(iteratorReady); } return MFX_TASK_DONE; } Status MJPEGVideoDecoderMFX_HW::_DecodeHeader(int32_t* cnt) { JSS sampling; JERRCODE jerr; if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; mfxSize size = {}; int32_t frameChannels, framePrecision; jerr = m_decBase->ReadHeader( &size.width, &size.height, &frameChannels, &m_color, &sampling, &framePrecision); if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; if(JPEG_OK != jerr) return UMC_ERR_FAILED; bool sizeHaveChanged = (m_frameDims.width != size.width || (m_frameDims.height != size.height && m_frameDims.height != (size.height << 1))); if ((m_frameSampling != (int)sampling) || (m_frameDims.width && sizeHaveChanged)) { m_decBase->Seek(-m_decBase->GetNumDecodedBytes(), UIC_SEEK_CUR); *cnt = 0; return UMC_ERR_NOT_ENOUGH_DATA; } *cnt = m_decBase->GetNumDecodedBytes(); return UMC_OK; } Status MJPEGVideoDecoderMFX_HW::_DecodeField(MediaDataEx* in) { int32_t nUsedBytes = 0; if(JPEG_OK != m_decBase->SetSource((uint8_t*)in->GetDataPointer(), (int32_t)in->GetDataSize())) return UMC_ERR_FAILED; Status status = _DecodeHeader(&nUsedBytes); if (status > 0) { in->MoveDataPointer(nUsedBytes); return UMC_OK; } if(UMC_OK != status) { in->MoveDataPointer(nUsedBytes); return status; } status = GetFrameHW(in); if (status != UMC_OK) { return status; } in->MoveDataPointer(m_decBase->GetNumDecodedBytes()); return status; } // MJPEGVideoDecoderMFX_HW::_DecodeField(MediaDataEx* in) Status MJPEGVideoDecoderMFX_HW::DefaultInitializationHuffmantables() { JERRCODE jerr; if(m_decBase->m_dctbl[0].IsEmpty()) { jerr = m_decBase->m_dctbl[0].Create(); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->m_dctbl[0].Init(0,0,(uint8_t*)&DefaultLuminanceDCBits[0],(uint8_t*)&DefaultLuminanceDCValues[0]); if(JPEG_OK != jerr) return UMC_ERR_FAILED; } if(m_decBase->m_dctbl[1].IsEmpty()) { jerr = m_decBase->m_dctbl[1].Create(); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->m_dctbl[1].Init(1,0,(uint8_t*)&DefaultChrominanceDCBits[0],(uint8_t*)&DefaultChrominanceDCValues[0]); if(JPEG_OK != jerr) return UMC_ERR_FAILED; } if(m_decBase->m_actbl[0].IsEmpty()) { jerr = m_decBase->m_actbl[0].Create(); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->m_actbl[0].Init(0,1,(uint8_t*)&DefaultLuminanceACBits[0],(uint8_t*)&DefaultLuminanceACValues[0]); if(JPEG_OK != jerr) return UMC_ERR_FAILED; } if(m_decBase->m_actbl[1].IsEmpty()) { jerr = m_decBase->m_actbl[1].Create(); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->m_actbl[1].Init(1,1,(uint8_t*)&DefaultChrominanceACBits[0],(uint8_t*)&DefaultChrominanceACValues[0]); if(JPEG_OK != jerr) return UMC_ERR_FAILED; } return UMC_OK; } Status MJPEGVideoDecoderMFX_HW::GetFrameHW(MediaDataEx* in) { #ifdef UMC_VA JERRCODE jerr; uint8_t buffersForUpdate = 0; // Bits: 0 - picParams, 1 - quantTable, 2 - huffmanTables, 3 - bistreamData, 4 - scanParams bool foundSOS = false; uint32_t marker; JPEG_DECODE_SCAN_PARAMETER scanParams; Status sts; const size_t srcSize = in->GetDataSize(); const MediaDataEx::_MediaDataEx *pAuxData = in->GetExData(); // we strongly need auxilary data if (NULL == pAuxData) return UMC_ERR_NULL_PTR; if (!m_va) return UMC_ERR_NOT_INITIALIZED; m_statusReportFeedbackCounter++; if (m_statusReportFeedbackCounter >= UINT_MAX) m_statusReportFeedbackCounter = 1; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "JPEG decode DDISubmitTask"); sts = m_va->BeginFrame(m_frameData.GetFrameMID(), 0); if (sts != UMC_OK) return sts; { AutomaticUMCMutex guard(m_guard); m_submittedTaskIndex.insert(m_statusReportFeedbackCounter); #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD if (m_va->IsGPUSyncEventEnable()) m_pic_index.insert(std::pair(m_statusReportFeedbackCounter, m_frameData.GetFrameMID())); #endif } ///////////////////////////////////////////////////////////////////////////////////////// buffersForUpdate = (1 << 5) - 1; m_decBase->m_num_scans = GetNumScans(in); m_decBase->m_curr_scan = &m_decBase->m_scans[0]; for (uint32_t i = 0; i < pAuxData->count; i += 1) { // get chunk size size_t chunkSize = (i + 1 < pAuxData->count) ? (pAuxData->offsets[i + 1] - pAuxData->offsets[i]) : (srcSize - pAuxData->offsets[i]); marker = pAuxData->values[i] & 0xFF; if(!foundSOS && (JM_SOS != marker)) { continue; } else { foundSOS = true; } // some data if (JM_SOS == marker) { uint32_t nextNotRSTMarkerPos = i+1; while((pAuxData->values[nextNotRSTMarkerPos] & 0xFF) >= JM_RST0 && (pAuxData->values[nextNotRSTMarkerPos] & 0xFF) <= JM_RST7) { nextNotRSTMarkerPos++; } // update chunk size chunkSize = (nextNotRSTMarkerPos < pAuxData->count) ? (pAuxData->offsets[nextNotRSTMarkerPos] - pAuxData->offsets[i]) : (srcSize - pAuxData->offsets[i]); jerr = m_decBase->SetSource((uint8_t*)in->GetDataPointer() + pAuxData->offsets[i] + 2, (int32_t)in->GetDataSize() - pAuxData->offsets[i] - 2); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->ParseSOS(JO_READ_HEADER); if (m_decBase->m_curr_comp_no != m_decBase->m_curr_scan->ncomps-1) return UMC_ERR_INVALID_STREAM; if(JPEG_OK != jerr) { if (JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; else return UMC_ERR_FAILED; } buffersForUpdate |= 1 << 4; scanParams.NumComponents = (uint16_t)m_decBase->m_curr_scan->ncomps; scanParams.RestartInterval = (uint16_t)m_decBase->m_curr_scan->jpeg_restart_interval; scanParams.MCUCount = (uint32_t)(m_decBase->m_curr_scan->numxMCU * m_decBase->m_curr_scan->numyMCU); scanParams.ScanHoriPosition = 0; scanParams.ScanVertPosition = 0; scanParams.DataOffset = (uint32_t)(pAuxData->offsets[i] + m_decBase->GetSOSLen() + 2); // 2 is marker length scanParams.DataLength = (uint32_t)(chunkSize - m_decBase->GetSOSLen() - 2); for(int j = 0; j < m_decBase->m_curr_scan->ncomps; j += 1) { scanParams.ComponentSelector[j] = (uint8_t)m_decBase->m_ccomp[m_decBase->m_curr_comp_no + 1 - m_decBase->m_curr_scan->ncomps + j].m_id; scanParams.DcHuffTblSelector[j] = (uint8_t)m_decBase->m_ccomp[m_decBase->m_curr_comp_no + 1 - m_decBase->m_curr_scan->ncomps + j].m_dc_selector; scanParams.AcHuffTblSelector[j] = (uint8_t)m_decBase->m_ccomp[m_decBase->m_curr_comp_no + 1 - m_decBase->m_curr_scan->ncomps + j].m_ac_selector; } sts = PackHeaders(in, &scanParams, &buffersForUpdate); if (sts != UMC_OK) return sts; if (m_decBase->m_curr_scan->scan_no >= 2) // m_scans has 3 elements only m_decBase->m_curr_scan->scan_no = 0; m_decBase->m_curr_scan = &m_decBase->m_scans[m_decBase->m_curr_scan->scan_no + 1]; } else if (JM_DRI == marker) { jerr = m_decBase->SetSource((uint8_t*)in->GetDataPointer() + pAuxData->offsets[i] + 2, (int32_t)in->GetDataSize() - pAuxData->offsets[i] - 2); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->ParseDRI(); if(JPEG_OK != jerr) { if (JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; else return UMC_ERR_FAILED; } } else if (JM_DQT == marker) { jerr = m_decBase->SetSource((uint8_t*)in->GetDataPointer() + pAuxData->offsets[i] + 2, (int32_t)in->GetDataSize() - pAuxData->offsets[i] - 2); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->ParseDQT(); if(JPEG_OK != jerr) { if (JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; else return UMC_ERR_FAILED; } buffersForUpdate |= 1 << 1; } else if (JM_DHT == marker) { jerr = m_decBase->SetSource((uint8_t*)in->GetDataPointer() + pAuxData->offsets[i] + 2, (int32_t)in->GetDataSize() - pAuxData->offsets[i] - 2); if(JPEG_OK != jerr) return UMC_ERR_FAILED; jerr = m_decBase->ParseDHT(); if(JPEG_OK != jerr) { if (JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; else return UMC_ERR_FAILED; } buffersForUpdate |= 1 << 2; } else if ((JM_RST0 <= marker) && (JM_RST7 >= marker)) { continue; } else if (JM_EOI == marker) { continue; } else { return UMC_ERR_NOT_IMPLEMENTED; } } ///////////////////////////////////////////////////////////////////////////////////////// sts = m_va->Execute(); if (sts != UMC_OK) return sts; sts = m_va->EndFrame(NULL); if (sts != UMC_OK) return sts; #endif return UMC_OK; } #ifdef UMC_VA // Linux/Android version Status MJPEGVideoDecoderMFX_HW::PackHeaders(MediaData* src, JPEG_DECODE_SCAN_PARAMETER* obtainedScanParams, uint8_t* buffersForUpdate) { uint32_t bitstreamTile = 0; ///////////////////////////////////////////////////////////////////////////////////////// if((*buffersForUpdate & 1) != 0) { *buffersForUpdate -= 1; UMCVACompBuffer* compBufPic; VAPictureParameterBufferJPEGBaseline *picParams; picParams = (VAPictureParameterBufferJPEGBaseline*)m_va->GetCompBuffer(VAPictureParameterBufferType, &compBufPic, sizeof(VAPictureParameterBufferJPEGBaseline)); if(!picParams) return UMC_ERR_DEVICE_FAILED; picParams->picture_width = (uint16_t)m_decBase->m_jpeg_width; picParams->picture_height = (uint16_t)m_decBase->m_jpeg_height; picParams->num_components = (uint8_t) m_decBase->m_jpeg_ncomp; if(m_decBase->m_jpeg_color == JC_RGB || m_decBase->m_jpeg_color == JC_RGBA) { picParams->color_space = 1; } else if(m_decBase->m_jpeg_color == JC_BGR || m_decBase->m_jpeg_color == JC_BGRA) { picParams->color_space = 2; } else { picParams->color_space = 0; } switch(m_rotation) { case 0: picParams->rotation = VA_ROTATION_NONE; break; case 90: picParams->rotation = VA_ROTATION_90; break; case 180: picParams->rotation = VA_ROTATION_180; break; case 270: picParams->rotation = VA_ROTATION_270; break; } for (int32_t i = 0; i < m_decBase->m_jpeg_ncomp; i++) { picParams->components[i].component_id = (uint8_t)m_decBase->m_ccomp[i].m_id; picParams->components[i].quantiser_table_selector = (uint8_t)m_decBase->m_ccomp[i].m_q_selector; picParams->components[i].h_sampling_factor = m_decBase->m_ccomp[i].m_hsampling; picParams->components[i].v_sampling_factor = m_decBase->m_ccomp[i].m_vsampling; } compBufPic->SetDataSize(sizeof(VAPictureParameterBufferJPEGBaseline)); } ///////////////////////////////////////////////////////////////////////////////////////// if((*buffersForUpdate & (1 << 1)) != 0) { *buffersForUpdate -= 1 << 1; UMCVACompBuffer* compBufQM; VAIQMatrixBufferJPEGBaseline *qmatrixParams; qmatrixParams = (VAIQMatrixBufferJPEGBaseline*)m_va->GetCompBuffer(VAIQMatrixBufferType, &compBufQM, sizeof(VAIQMatrixBufferJPEGBaseline)); for (int32_t i = 0; i < MAX_QUANT_TABLES; i++) { if (!m_decBase->m_qntbl[i].m_initialized) continue; qmatrixParams->load_quantiser_table[i] = 1; for (int32_t j = 0; j < 64; j++) { qmatrixParams->quantiser_table[i][j] = m_decBase->m_qntbl[i].m_raw8u[j]; } } compBufQM->SetDataSize(sizeof(VAIQMatrixBufferJPEGBaseline)); } ///////////////////////////////////////////////////////////////////////////////////////// if((*buffersForUpdate & (1 << 2)) != 0) { *buffersForUpdate -= 1 << 2; if (DefaultInitializationHuffmantables() != UMC_OK) return UMC_ERR_FAILED; UMCVACompBuffer* compBufHm; VAHuffmanTableBufferJPEGBaseline *huffmanParams; huffmanParams = (VAHuffmanTableBufferJPEGBaseline*)m_va->GetCompBuffer(VAHuffmanTableBufferType, &compBufHm, sizeof(VAHuffmanTableBufferJPEGBaseline)); if(!huffmanParams) return UMC_ERR_DEVICE_FAILED; for (int32_t i = 0; i < 2; i++) { if(m_decBase->m_dctbl[i].IsValid()) { huffmanParams->load_huffman_table[i] = 1; if (std::end(huffmanParams->huffman_table[i].num_dc_codes) - std::begin(huffmanParams->huffman_table[i].num_dc_codes) < 16) return UMC_ERR_NOT_ENOUGH_BUFFER; const uint8_t *bits = m_decBase->m_dctbl[i].GetBits(); std::copy(bits, bits + 16, std::begin(huffmanParams->huffman_table[i].num_dc_codes)); if (std::end(huffmanParams->huffman_table[i].dc_values) - std::begin(huffmanParams->huffman_table[i].dc_values) < 12) return UMC_ERR_NOT_ENOUGH_BUFFER; bits = m_decBase->m_dctbl[i].GetValues(); std::copy(bits, bits + 12, std::begin(huffmanParams->huffman_table[i].dc_values)); } if(m_decBase->m_actbl[i].IsValid()) { huffmanParams->load_huffman_table[i] = 1; if (std::end(huffmanParams->huffman_table[i].num_ac_codes) - std::begin(huffmanParams->huffman_table[i].num_ac_codes) < 16) return UMC_ERR_NOT_ENOUGH_BUFFER; const uint8_t *bits = m_decBase->m_actbl[i].GetBits(); std::copy(bits, bits + 16, std::begin(huffmanParams->huffman_table[i].num_ac_codes)); if (std::end(huffmanParams->huffman_table[i].ac_values) - std::begin(huffmanParams->huffman_table[i].ac_values) < 162) return UMC_ERR_NOT_ENOUGH_BUFFER; bits = m_decBase->m_actbl[i].GetValues(); std::copy(bits, bits + 162, std::begin(huffmanParams->huffman_table[i].ac_values)); } huffmanParams->huffman_table[i].pad[0] = 0; huffmanParams->huffman_table[i].pad[1] = 0; } compBufHm->SetDataSize(sizeof(VAHuffmanTableBufferJPEGBaseline)); } ///////////////////////////////////////////////////////////////////////////////////////// if((*buffersForUpdate & (1 << 3)) != 0) { *buffersForUpdate -= 1 << 3; UMCVACompBuffer* compBufSlice; VASliceParameterBufferJPEGBaseline *sliceParams; sliceParams = (VASliceParameterBufferJPEGBaseline*)m_va->GetCompBuffer(VASliceParameterBufferType, &compBufSlice, sizeof(VASliceParameterBufferJPEGBaseline)); if ( !sliceParams ) MFX_RETURN(MFX_ERR_DEVICE_FAILED); sliceParams->slice_data_size = obtainedScanParams->DataLength; sliceParams->slice_data_offset = 0; sliceParams->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; sliceParams->num_components = obtainedScanParams->NumComponents; sliceParams->restart_interval = obtainedScanParams->RestartInterval; sliceParams->num_mcus = obtainedScanParams->MCUCount; sliceParams->slice_horizontal_position = obtainedScanParams->ScanHoriPosition; sliceParams->slice_vertical_position = obtainedScanParams->ScanVertPosition; for (int32_t i = 0; i < m_decBase->m_jpeg_ncomp; i++) { sliceParams->components[i].component_selector = obtainedScanParams->ComponentSelector[i]; sliceParams->components[i].dc_table_selector = obtainedScanParams->DcHuffTblSelector[i]; sliceParams->components[i].ac_table_selector = obtainedScanParams->AcHuffTblSelector[i]; } compBufSlice->SetDataSize(sizeof(VASliceParameterBufferJPEGBaseline)); } if((*buffersForUpdate & (1 << 4)) != 0) { *buffersForUpdate -= 1 << 4; UMCVACompBuffer* compBufBs; uint8_t *ptr = (uint8_t *)src->GetDataPointer(); uint8_t *bistreamData = (uint8_t *)m_va->GetCompBuffer(VASliceDataBufferType, &compBufBs, obtainedScanParams->DataLength); if(!bistreamData) return UMC_ERR_DEVICE_FAILED; if (obtainedScanParams->DataLength > (uint32_t)compBufBs->GetBufferSize()) return UMC_ERR_INVALID_STREAM; std::copy(ptr + obtainedScanParams->DataOffset, ptr + obtainedScanParams->DataOffset + obtainedScanParams->DataLength, bistreamData); } ///////////////////////////////////////////////////////////////////////////////////////// while(bitstreamTile != 0) { UMCVACompBuffer* compBufBs; uint8_t *bistreamData = (uint8_t *)m_va->GetCompBuffer(VASliceDataBufferType, &compBufBs, bitstreamTile); MFX_INTERNAL_CPY(bistreamData, (uint8_t*)src->GetDataPointer() + obtainedScanParams->DataOffset + obtainedScanParams->DataLength - bitstreamTile, bitstreamTile); bitstreamTile = 0; } return UMC_OK; } #endif // if UMC_VA uint16_t MJPEGVideoDecoderMFX_HW::GetNumScans(MediaDataEx* in) { MediaDataEx::_MediaDataEx *pAuxData = in->GetExData(); uint16_t numScans = 0; for(uint32_t i=0; icount; i++) { if((pAuxData->values[i] & 0xFF) == JM_SOS) { numScans++; } } return numScans; } Status MJPEGVideoDecoderMFX_HW::GetFrame(UMC::MediaDataEx *pSrcData, UMC::FrameData** out, const mfxU32 fieldPos) { Status status = UMC_OK; if(0 == out) { return UMC_ERR_NULL_PTR; } // allocate frame Status sts = AllocateFrame(); if (sts != UMC_OK) { return sts; } if(m_interleaved) { // interleaved frame status = _DecodeField(pSrcData); if (status > 0) { return UMC_OK; } if (UMC_OK != status) { return status; } (*out)[fieldPos].Init(m_frameData.GetInfo(), m_frameData.GetFrameMID(), m_frameAllocator); (*out)[fieldPos].SetTime(pSrcData->GetTime()); m_frameData.Close(); } else { // progressive frame status = _DecodeField(pSrcData); if (status > 0) { return UMC_OK; } if (UMC_OK != status) { return status; } (*out)->Init(m_frameData.GetInfo(), m_frameData.GetFrameMID(), m_frameAllocator); (*out)->SetTime(pSrcData->GetTime()); m_frameData.Close(); } return status; } // MJPEGVideoDecoderMFX_HW::GetFrame() ConvertInfo * MJPEGVideoDecoderMFX_HW::GetConvertInfo() { return &m_convertInfo; } } // end namespace UMC #endif // #if defined(UMC_VA) #endif // MFX_ENABLE_MJPEG_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/000077500000000000000000000000001443134507600256715ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/000077500000000000000000000000001443134507600273145ustar00rootroot00000000000000umc_mpeg2_bitstream.h000066400000000000000000000150211443134507600333350ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE namespace UMC_MPEG2_DECODER { struct MPEG2SequenceHeader; struct MPEG2SequenceExtension; struct MPEG2SequenceDisplayExtension; struct MPEG2PictureHeader; struct MPEG2PictureCodingExtension; struct MPEG2QuantMatrix; class MPEG2Slice; // Bitstream low level parsing class class MPEG2BaseBitstream { public: MPEG2BaseBitstream() { Reset(nullptr, 0); } MPEG2BaseBitstream(uint8_t * pb, uint32_t maxsize) { Reset(pb, maxsize); } virtual ~MPEG2BaseBitstream() { } // Reset the bitstream with new data pointer void Reset(uint8_t * pb, uint32_t maxsize) { Reset(pb, 0, maxsize); } // Reset the bitstream with new data pointer and bit offset void Reset(uint8_t * pb, int32_t offset, uint32_t maxsize) { m_pbs = pb; m_pbsBase = pb; m_bitOffset = offset; m_maxBsSize = maxsize; } // Reads one bit from the buffer. inline uint32_t GetBit() { if (m_pbs >= m_pbsBase + m_maxBsSize) throw mpeg2_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); uint32_t const bit = (*m_pbs >> (7 - m_bitOffset)) & 1; if (++m_bitOffset == 8) { ++m_pbs; m_bitOffset = 0; } return bit; } // Read N bits from bitstream array inline uint32_t GetBits(uint32_t nbits) { uint32_t bits = 0; for (; nbits > 0; --nbits) { bits <<= 1; bits |= GetBit(); } return bits; } // Move bitstream position pointer to N bits forward or backward inline void Seek(int32_t nbits) { int32_t bitsOffset = m_bitOffset + nbits; m_pbs += bitsOffset >> 3; m_bitOffset = bitsOffset & 7; } // Check one bit without shifting byte offset inline uint32_t Check1Bit() const { if (m_pbs >= m_pbsBase + m_maxBsSize) throw mpeg2_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); uint32_t const bit = (*m_pbs >> (7 - m_bitOffset)) & 1; return bit; } // Return a number of bits left inline size_t BitsLeft() const { return static_cast (m_maxBsSize*8 - BitsDecoded()); } // Check that position in bitstream didn't move outside the limit inline bool CheckBSLeft() const { size_t bitsDecoded = BitsDecoded(); return (bitsDecoded > m_maxBsSize*8); } // Returns number of decoded bits since last reset inline size_t BitsDecoded() const { return static_cast(m_pbs - m_pbsBase) * 8 + m_bitOffset; } // Returns number of decoded bytes since last reset inline size_t BytesDecoded() const { return static_cast(m_pbs - m_pbsBase) + (m_bitOffset / 8); } // Returns number of bytes left in bitstream array inline size_t BytesLeft() const { return (int32_t)m_maxBsSize - (int32_t) BytesDecoded(); } // Return bitstream array base address and size void GetOrg(uint8_t * & pbs, uint32_t & size) const { pbs = m_pbsBase; size = m_maxBsSize; } size_t GetAllBitsCount() { return m_maxBsSize; } protected: uint8_t const * m_pbs; // pointer to the current position of the buffer int32_t m_bitOffset; // the bit position (0 to 7) in the char pointed by m_pbs uint8_t* m_pbsBase; // pointer to the first byte of the buffer uint32_t m_maxBsSize; // maximum buffer size in bytes }; // MPEG2 bitstream headers parsing class class MPEG2HeadersBitstream : public MPEG2BaseBitstream { public: MPEG2HeadersBitstream() : MPEG2BaseBitstream() { } MPEG2HeadersBitstream(uint8_t * const pb, const uint32_t maxsize) : MPEG2BaseBitstream(pb, maxsize) { } // Parse sequence header void GetSequenceHeader(MPEG2SequenceHeader&); // Parse sequence extension void GetSequenceExtension(MPEG2SequenceExtension&); // Parse sequence display extension void GetSequenceDisplayExtension(MPEG2SequenceDisplayExtension&); // Parse picture header void GetPictureHeader(MPEG2PictureHeader&); // Parse picture extension void GetPictureExtensionHeader(MPEG2PictureCodingExtension&); // Parse quant matrix extension void GetQuantMatrix(MPEG2QuantMatrix&); // Parse quant matrix extension void GetGroupOfPicturesHeader(MPEG2GroupOfPictures&); // Get macroblock address increment void DecodeMBAddress(MPEG2SliceHeader&); // Parse slice header UMC::Status GetSliceHeader(MPEG2SliceHeader&, const MPEG2SequenceHeader&, const MPEG2SequenceExtension&); // Parse full slice header UMC::Status GetSliceHeaderFull(MPEG2Slice&, const MPEG2SequenceHeader&, const MPEG2SequenceExtension&); }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_decoder.h000066400000000000000000000225771443134507600330450ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include #include #include #include #include "umc_mpeg2_defs.h" #include "umc_mpeg2_frame.h" #include "umc_video_decoder.h" #include "umc_mpeg2_splitter.h" namespace UMC { class FrameAllocator; } namespace UMC_MPEG2_DECODER { class Payload_Storage; class MPEG2HeadersBitstream; /****************************************************************************************************/ // Skipping_MPEG2 class routine /****************************************************************************************************/ class Skipping_MPEG2 { public: virtual ~Skipping_MPEG2() {} // Check if frame should be skipped to decrease decoding delays bool IsShouldSkipFrame(const MPEG2DecoderFrame&); void ChangeVideoDecodingSpeed(int32_t& num); void Reset(); // Get current skip mode state uint32_t GetNumSkipFrames() const { return m_NumberOfSkippedFrames; } private: enum SkipLevel { SKIP_NONE = 0, SKIP_B, SKIP_PB, SKIP_ALL }; int32_t m_SkipLevel = SKIP_NONE; uint32_t m_NumberOfSkippedFrames = 0; }; class MPEG2DecoderParams : public UMC::VideoDecoderParams { DYNAMIC_CAST_DECL(MPEG2DecoderParams, UMC::VideoDecoderParams) public: UMC::FrameAllocator* allocator = nullptr; uint32_t async_depth = 0; }; class MPEG2Decoder : public UMC::VideoDecoder, public Skipping_MPEG2 { public: MPEG2Decoder(); ~MPEG2Decoder() override; public: static UMC::Status DecodeHeader(mfxBitstream&, mfxVideoParam&); /* UMC::BaseCodec interface */ UMC::Status Init(UMC::BaseCodecParams*) override; // Close all codec resources UMC::Status Close(void) override; UMC::Status GetFrame(UMC::MediaData*, UMC::MediaData*) override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } UMC::Status Reset() override; UMC::Status GetInfo(UMC::BaseCodecParams*) override; public: /* UMC::VideoDecoder interface */ UMC::Status ResetSkipCount() override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } UMC::Status SkipVideoFrame(int32_t) override { return UMC::UMC_ERR_NOT_IMPLEMENTED; } uint32_t GetNumOfSkippedFrames() override { return 0; } public: // Find NAL units in new bitstream buffer and process them virtual UMC::Status AddOneFrame(UMC::MediaData * source); // Add a new bitstream data buffer to decoding virtual UMC::Status AddSource(UMC::MediaData * source); // Decode slice header start, set slice links to seq and picture virtual MPEG2Slice * DecodeSliceHeader(const RawUnit & unit); // Add a new slice to picture virtual UMC::Status AddSlice(MPEG2Slice*); // Decode a bitstream header virtual UMC::Status DecodeHeaders(const RawUnit &); // Decode sequence header (and extension) virtual UMC::Status DecodeSeqHeader(const RawUnit &); // Decode picture header (and extension) virtual UMC::Status DecodePicHeader(const RawUnit &); // Decode group of pictures header virtual UMC::Status DecodeGroupHeader(const RawUnit &); // Decode display and matrix extensions virtual UMC::Status DecodeExtension(const RawUnit &); virtual MPEG2DecoderFrame* FindFrameByMemID(UMC::FrameMemID); // Find a next frame ready to be output from decoder virtual MPEG2DecoderFrame* GetFrameToDisplay(); // Check for frame completeness and get decoding errors virtual bool QueryFrames(MPEG2DecoderFrame&) = 0; // Initialize mfxVideoParam structure based on decoded bitstream header values virtual UMC::Status FillVideoParam(mfxVideoParam *par, bool full); // Return raw sequence and sequence extension headers virtual RawHeader_MPEG2 * GetSeqAndSeqExtHdr() { return &m_rawHeaders; } // Return a number of cached frames virtual uint8_t GetNumCachedFrames() const; // Set frame display time virtual void PostProcessDisplayFrame(MPEG2DecoderFrame*); // Set MFX video params virtual void SetVideoParams(const mfxVideoParam&); Payload_Storage * GetPayloadStorage() const { return m_messages.get();} protected: virtual void SetDPBSize(uint32_t); virtual MPEG2DecoderFrame* GetFreeFrame(); virtual MPEG2DecoderFrame* GetFrameBuffer(MPEG2Slice*); // Action on new slice virtual UMC::Status OnNewSlice(const RawUnit & data); // Action on new picture virtual bool OnNewPicture(); // returns true on full frame virtual void EliminateSliceErrors(MPEG2DecoderFrame& frame, uint8_t fieldIndex); virtual UMC::Status CompletePicture(MPEG2DecoderFrame& frame, uint8_t fieldIndex); bool IsFieldOfCurrentFrame() const; // DPB update virtual void UpdateDPB(MPEG2DecoderFrame&, uint8_t); // Allocate frame internals virtual void AllocateFrameData(UMC::VideoDataInfo const&, UMC::FrameMemID, MPEG2DecoderFrame&) = 0; virtual void CompleteDecodedFrames(); // Pass picture to driver virtual UMC::Status Submit(MPEG2DecoderFrame&, uint8_t) = 0; private: // Find a reusable frame initialize it with slice parameters MPEG2DecoderFrame* StartFrame(MPEG2Slice * slice); protected: std::mutex m_guard; UMC::FrameAllocator* m_allocator; uint32_t m_counter; MPEG2DecoderParams m_params; mfxVideoParam m_firstMfxVideoParams; DPBType m_dpb; // storage of decoded frames MPEG2DecoderFrame* m_currFrame; struct Headers { std::shared_ptr seqHdr; std::shared_ptr seqExtHdr; std::shared_ptr displayExtHdr; std::shared_ptr qmatrix; std::shared_ptr group; std::shared_ptr picHdr; std::shared_ptr picExtHdr; }; Headers m_currHeaders; // current active stream headers RawHeader_MPEG2 m_rawHeaders; // raw binary headers uint32_t m_dpbSize; Splitter m_splitter; double m_localDeltaFrameTime; bool m_useExternalFramerate; double m_localFrameTime; std::unique_ptr m_messages; std::unique_ptr m_lastSlice; // slice which could't be processed }; class Payload_Storage { public: struct Message { size_t msg_size = 0; size_t offset = 0; uint8_t * data = nullptr; double timestamp = 0.0; int32_t isUsed = 0; int32_t auID = 0; int32_t inputID = 0; MPEG2DecoderFrame * frame = nullptr; }; Payload_Storage(); ~Payload_Storage(); void Init(); void Close(); void Reset(); void SetTimestamp(MPEG2DecoderFrame * frame); Message* AddMessage(const RawUnit & data, int32_t auIndex); const Message * GetPayloadMessage(); void SetFrame(MPEG2DecoderFrame * frame, int32_t auIndex); void SetAUID(int32_t auIndex); private: enum { MAX_BUFFERED_SIZE = 16 * 1024, // 16 kb START_ELEMENTS = 10, MAX_ELEMENTS = 128 }; std::vector m_data; std::vector m_payloads; size_t m_offset; int32_t m_lastUsed; }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODEumc_mpeg2_decoder_va.h000066400000000000000000000052551443134507600334460ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_decoder.h" namespace UMC_MPEG2_DECODER { class Packer; class MPEG2DecoderVA : public MPEG2Decoder { UMC::VideoAccelerator* m_va; std::unique_ptr m_packer; public: MPEG2DecoderVA(); UMC::Status SetParams(UMC::BaseCodecParams*) override; // Check for frame completeness and get decoding errors bool QueryFrames(MPEG2DecoderFrame&) override; private: void AllocateFrameData(UMC::VideoDataInfo const&, UMC::FrameMemID, MPEG2DecoderFrame&) override; int32_t GetFreeIndex(UMC::FrameMemID) const; // Pass picture to driver UMC::Status Submit(MPEG2DecoderFrame&, uint8_t) override; class ReportItem { public: uint32_t m_index; uint32_t m_field; uint8_t m_status; ReportItem(uint32_t index, uint32_t field, uint8_t status) : m_index(index) , m_field(field) , m_status(status) { } bool operator == (const ReportItem & item) { return (item.m_index == m_index) && (item.m_field == m_field); } bool operator != (const ReportItem & item) { return (item.m_index != m_index) || (item.m_field != m_field); } }; typedef std::vector Report; Report m_reports; }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODEoneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_defs.h000066400000000000000000000222361443134507600323510ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include #include #include #include #include #include "umc_structures.h" namespace UMC_MPEG2_DECODER { class MPEG2DecoderFrame; typedef std::list DPBType; constexpr uint8_t start_code_prefix[] = {0, 0, 1}; constexpr size_t prefix_size = sizeof(start_code_prefix); constexpr uint16_t MFX_PROFILE_MPEG1 = 8; // Just a magic value // Table 6-1 enum MPEG2_UNIT_TYPE { PICTURE_HEADER = 0x00, USER_DATA = 0xb2, SEQUENCE_HEADER = 0xb3, SEQUENCE_ERROR = 0xb4, EXTENSION = 0xb5, SEQUENCE_END = 0xb7, GROUP = 0xb8, }; // Table 6-5 enum { CHROMA_FORMAT_420 = 1, CHROMA_FORMAT_422 = 2, CHROMA_FORMAT_444 = 3 }; // Table 6-12 enum FrameType { MPEG2_I_PICTURE = 1, MPEG2_P_PICTURE = 2, MPEG2_B_PICTURE = 3 }; // Table 6-14 enum { FLD_PICTURE = 1, TOP_FLD_PICTURE = 1, BOTTOM_FLD_PICTURE = 2, FRM_PICTURE = 3, }; enum DisplayPictureStruct { DPS_UNKNOWN = 100, DPS_FRAME = 0, DPS_TOP, // one field DPS_BOTTOM, // one field DPS_TOP_BOTTOM, DPS_BOTTOM_TOP, DPS_TOP_BOTTOM_TOP, DPS_BOTTOM_TOP_BOTTOM, DPS_FRAME_DOUBLING, DPS_FRAME_TRIPLING }; // Table 6-2. Extension_start_code_identifier codes enum MPEG2_UNIT_TYPE_EXT { SEQUENCE_EXTENSION = 1, SEQUENCE_DISPLAY_EXTENSION = 2, QUANT_MATRIX_EXTENSION = 3, COPYRIGHT_EXTENSION = 4, SEQUENCE_SCALABLE_EXTENSION = 5, PICTURE_DISPLAY_EXTENSION = 7, PICTURE_CODING_EXTENSION = 8, PICTURE_SPARTIAL_SCALABLE_EXTENSION = 9, PICTURE_TEMPORAL_SCALABLE_EXTENSION = 10, }; struct MPEG2SequenceHeader { uint32_t horizontal_size_value = 0; uint32_t vertical_size_value = 0; uint32_t aspect_ratio_information = 0; uint32_t frame_rate_code = 0; uint32_t bit_rate_value = 0; uint32_t vbv_buffer_size_value = 0; uint8_t constrained_parameters_flag = 0; uint8_t load_intra_quantiser_matrix = 0; uint8_t intra_quantiser_matrix[64] = {}; uint8_t load_non_intra_quantiser_matrix = 0; uint8_t non_intra_quantiser_matrix[64] = {}; void Reset() { *this = {}; } }; struct MPEG2SequenceExtension { uint8_t profile_and_level_indication = 0; uint8_t progressive_sequence = 0; uint8_t chroma_format = 0; uint8_t horizontal_size_extension = 0; uint8_t vertical_size_extension = 0; uint32_t bit_rate_extension = 0; uint32_t vbv_buffer_size_extension = 0; uint8_t low_delay = 0; uint8_t frame_rate_extension_n = 0; uint8_t frame_rate_extension_d = 0; void Reset() { *this = {}; } }; struct MPEG2SequenceDisplayExtension { uint8_t video_format = 0; uint8_t colour_description = 0; uint8_t colour_primaries = 0; uint8_t transfer_characteristics = 0; uint8_t matrix_coefficients = 0; uint16_t display_horizontal_size = 0; uint16_t display_vertical_size = 0; void Reset() { *this = {}; } }; struct MPEG2QuantMatrix { uint8_t load_intra_quantiser_matrix = 0; uint8_t intra_quantiser_matrix[64] = {}; uint8_t load_non_intra_quantiser_matrix = 0; uint8_t non_intra_quantiser_matrix[64] = {}; uint8_t load_chroma_intra_quantiser_matrix = 0; uint8_t chroma_intra_quantiser_matrix[64] = {}; uint8_t load_chroma_non_intra_quantiser_matrix = 0; uint8_t chroma_non_intra_quantiser_matrix[64] = {}; void Reset() { *this = {}; } }; struct MPEG2GroupOfPictures { uint8_t drop_frame_flag = 0; uint8_t time_code_hours = 0; uint8_t time_code_minutes = 0; uint8_t time_code_seconds = 0; uint8_t time_code_pictures = 0; uint8_t closed_gop = 0; uint8_t broken_link = 0; void Reset() { *this = {}; } }; struct MPEG2PictureCodingExtension { uint8_t f_code[4] = {}; uint8_t intra_dc_precision = 0; uint8_t picture_structure = 0; uint8_t top_field_first = 0; uint8_t frame_pred_frame_dct = 0; uint8_t concealment_motion_vectors = 0; uint8_t q_scale_type = 0; uint8_t intra_vlc_format = 0; uint8_t alternate_scan = 0; uint8_t repeat_first_field = 0; uint8_t chroma_420_type = 0; uint8_t progressive_frame = 0; uint8_t composite_display_flag = 0; uint8_t v_axis = 0; uint8_t field_sequence = 0; uint8_t sub_carrier = 0; uint8_t burst_amplitude = 0; uint8_t sub_carrier_phase = 0; void Reset() { *this = {}; } }; struct MPEG2PictureHeader { uint16_t temporal_reference = 0; uint8_t picture_coding_type = 0; uint16_t vbv_delay = 0; uint8_t full_pel_forward_vector = 0; uint8_t forward_f_code = 0; uint8_t full_pel_backward_vector = 0; uint8_t backward_f_code = 0; void Reset() { *this = {}; } }; struct MPEG2SliceHeader { uint8_t slice_vertical_position = 0; uint8_t slice_vertical_position_extension = 0; uint8_t priority_breakpoint = 0; uint8_t quantiser_scale_code = 0; uint8_t intra_slice_flag = 0; uint8_t intra_slice = 0; // calculated params uint32_t mbOffset = 0; uint32_t macroblockAddressIncrement = 0; uint32_t numberMBsInSlice = 0; // only for DXVA }; enum { NUM_REF_FRAMES = 2, }; // Error exception class mpeg2_exception { public: mpeg2_exception(int32_t status = -1) : m_Status(status) { } virtual ~mpeg2_exception() { } int32_t GetStatus() const { return m_Status; } private: int32_t m_Status; }; // Descriptor of raw MPEG2 elementary unit struct RawUnit { RawUnit() : begin(nullptr), end(nullptr), type(-1), pts(-1) {} RawUnit(uint8_t * b, uint8_t * e, uint8_t t, double ts) : begin(b), end(e), type(t), pts(ts) {} uint8_t * begin; uint8_t * end; int16_t type; double pts; // time stamp }; // Container for raw header binary data class RawHeader_MPEG2 { public: void Reset() { m_buffer.clear(); } size_t GetSize() const { return m_buffer.size(); } uint8_t * GetPointer() { return m_buffer.empty() ? nullptr : m_buffer.data(); } void Resize(size_t newSize) { m_buffer.resize(newSize); } protected: typedef std::vector BufferType; BufferType m_buffer; }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_frame.h000066400000000000000000000223261443134507600325220ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include #include "umc_frame_data.h" #include "mfx_common_decode_int.h" namespace UMC_MPEG2_DECODER { class MPEG2Slice; class MPEG2DecoderFrameInfo { public: MPEG2DecoderFrameInfo(MPEG2DecoderFrame&); ~MPEG2DecoderFrameInfo(); // Reinitialize frame structure before reusing frame void Reset(); // Include a new slice into a set of frame slices void AddSlice(MPEG2Slice* slice); size_t GetSliceCount() const { return slices.size(); } MPEG2Slice* GetSlice(size_t num) const { return num < slices.size() ? slices[num] : nullptr; } bool IsField() const { return isField; } FrameType GetType() const { return frameType; } // Set forward and backward reference frames void UpdateReferences(const DPBType&); // Clear all references to other frames void FreeReferenceFrames(); bool CheckReferenceFrameError(); MPEG2DecoderFrame * GetForwardRefPic() const { return references.forward; } MPEG2DecoderFrame * GetBackwardRefPic() const { return references.backward; } void SetFilled() { isFilled = true; } bool IsFilled () const { return isFilled; } private: MPEG2DecoderFrame& frame; // "Parent" frame bool isField; // Field or frame bool isBottomField; FrameType frameType; bool isFilled; std::vector slices; struct RefFramePair { MPEG2DecoderFrame* forward = nullptr; MPEG2DecoderFrame* backward = nullptr; }; RefFramePair references; }; class MPEG2DecoderFrame : public RefCounter { public: MPEG2DecoderFrame(); ~MPEG2DecoderFrame(); void Reset(); void Allocate(UMC::FrameData const*); bool Empty() const { return !(data->m_locked); } bool IsDecoded() const { return decoded; } UMC::FrameData* GetFrameData() { return data.get(); } UMC::FrameData const* GetFrameData() const { return data.get(); } // Wrapper for getting 'surface Index' FrameMID UMC::FrameMemID GetMemID() const { return data->GetFrameMID(); } int32_t GetError() const { return error; } void SetError(int32_t e) { error = e; } void AddError(int32_t e) { error |= e; } // Returns access unit: frame or field MPEG2DecoderFrameInfo * GetAU(uint8_t field = 0) { return (field) ? &slicesInfoBottom : &slicesInfo; } // Returns access unit: frame or field const MPEG2DecoderFrameInfo * GetAU(uint8_t field = 0) const { return (field) ? &slicesInfoBottom : &slicesInfo; } bool IsDisplayed() const { return displayed; } void SetDisplayed() { displayed = true; } bool IsOutputted() const { return outputted; } void SetOutputted() { outputted = true; } bool DecodingStarted() const { return decodingStarted; } void StartDecoding() { decodingStarted = true; } bool DecodingCompleted() const { return decodingCompleted; } // Flag frame as completely decoded void CompleteDecoding(); // Check reference frames for error status and flag current frame if error is found void UpdateErrorWithRefFrameStatus(); bool CheckReferenceFrameError(); bool IsReadyToBeOutputted() const { return reordered; } void SetReadyToBeOutputted() { reordered = true; } bool IsFullFrame() const { return isFull;} void SetFullFrame(bool IsFull) { this->isFull = IsFull; } // Clear all references to other frames void FreeReferenceFrames(); // Clean up data after decoding is done void FreeResources(); // Sets reference frames void UpdateReferenceList(const DPBType & dpb); // Delete unneeded references and set flags after decoding is done void OnDecodingCompleted(); bool IsRef() const { return isRef; } // Mark frame as a reference frame void SetIsRef(bool ref) { if (ref) { if (!IsRef()) IncrementReference(); isRef = true; } else { bool wasRef = IsRef(); isRef = false; if (wasRef) { DecrementReference(); } } } uint8_t GetNumberByParity(uint8_t parity) const { return bottom_field_flag[1] == parity ? 1 : 0; } // Skip frame API void SetSkipped(bool skipped) { isSkipped = skipped; } bool IsSkipped() const { return isSkipped; } public: uint32_t decOrder; uint32_t displayOrder; FrameType frameType; int8_t currFieldIndex; // 0 means first field (in decoded order) or frame, 1 means 2nd field (in decoded order) uint32_t fieldIndex; //Each slice of the current frame, 0 means first field (in decoded order) or frame, 1 means 2nd field (in decoded order) virtual void Free() { auto fd = GetFrameData(); fd->m_locked = false; Reset(); } int8_t bottom_field_flag[2]; int32_t pictureStructure; DisplayPictureStruct displayPictureStruct; bool isProgressiveSequence; bool isProgressiveFrame; double dFrameTime; bool isOriginalPTS; bool isPostProccesComplete; uint32_t horizontalSize; uint32_t verticalSize; uint32_t aspectWidth; uint32_t aspectHeight; std::shared_ptr group; UMC::FrameMemID m_index; private: std::unique_ptr data; uint16_t locked; bool decodingStarted; bool decodingCompleted; bool reordered; // Can frame already be returned to application or not bool outputted; // set in [application thread] when frame is mapped to respective output mfxFrameSurface bool displayed; // set in [scheduler thread] when frame decoding is finished and // respective mfxFrameSurface prepared for output to application bool decoded; // set in [application thread] to signal that frame is completed and respective reference counter decremented // after it frame still may remain in [MPEG2Decoder::dpb], but only as reference bool isFull; bool isRef; // Is reference frame bool isSkipped; // Is frame skipped int32_t error; // error flags MPEG2DecoderFrameInfo slicesInfo; // Top field or frame MPEG2DecoderFrameInfo slicesInfoBottom; // Bottom field }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_slice.h000066400000000000000000000067361443134507600325360ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_media_data.h" #include "umc_mpeg2_bitstream.h" namespace UMC_MPEG2_DECODER { // Slice descriptor class class MPEG2Slice { public: ~MPEG2Slice(void) { } // Decode slice header and initialize slice structure with parsed values bool Reset(); public: // Decode slice header bool DecodeSliceHeader(); const MPEG2SequenceHeader & GetSeqHeader(void) const { return *m_seqHdr.get(); } void SetSeqHeader(std::shared_ptr & seqHdr) { m_seqHdr = seqHdr; } const MPEG2SequenceExtension & GetSeqExtHeader(void) const { return *m_seqExtHdr.get(); } void SetSeqExtHeader(std::shared_ptr & seqExtHdr) { m_seqExtHdr = seqExtHdr; } const MPEG2PictureHeader & GetPicHeader(void) const { return *m_picHdr.get(); } void SetPicHeader(std::shared_ptr & picHdr) { m_picHdr = picHdr; } const MPEG2PictureCodingExtension & GetPicExtHeader(void) const { return *m_picExtHdr.get(); } void SetPicExtHeader(std::shared_ptr & picExtHdr) { m_picExtHdr = picExtHdr; } const MPEG2QuantMatrix *GetQMatrix(void) const { return m_qm.get(); } void SetQMatrix(std::shared_ptr & qm) { m_qm = qm; } // Slice header const MPEG2SliceHeader & GetSliceHeader() const { return sliceHeader; } MPEG2SliceHeader & GetSliceHeader() { return sliceHeader; } // Obtain bitstream object const MPEG2HeadersBitstream & GetBitStream() const { return m_bitStream; } public: UMC::MediaData source; // slice bitstream data MPEG2SliceHeader sliceHeader; // parsed slice header protected: std::shared_ptr m_seqHdr; std::shared_ptr m_seqExtHdr; std::shared_ptr m_picHdr; std::shared_ptr m_picExtHdr; std::shared_ptr m_qm; // optional MPEG2HeadersBitstream m_bitStream; }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_splitter.h000066400000000000000000000075361443134507600333040ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_defs.h" namespace UMC { class MediaData; } namespace UMC_MPEG2_DECODER { // The purpose of this class is to search syntax elements in provided bistream based on 0x0 0x0 0x1 sequence. class RawHeaderIterator { public: void Reset() { m_source = nullptr; m_cache.resize(0); m_pts = -1; m_needCleanCache = false; } RawUnit & operator *() { return m_nalu; } RawUnit * operator ->() { return &m_nalu; } // Load new data from source and searches for a unit void LoadData(UMC::MediaData*); // Searches for a unit RawHeaderIterator & operator++(); RawHeaderIterator operator++(int) { RawHeaderIterator tmp; ++*this; return tmp; } bool operator ==(RawHeaderIterator const & right) const { return m_nalu.begin == right.m_nalu.begin && m_nalu.end == right.m_nalu.end; } bool operator !=(RawHeaderIterator const & right) const { return !(*this == right); } static uint8_t* FindStartCode(uint8_t * begin, uint8_t * end); private: RawUnit FindUnit(UMC::MediaData* in); // Find unit in provided bitstream. Save bs to cache if needed RawUnit OnEOS(); // Action on end of stream RawUnit FindRawUnit(uint8_t * begin, uint8_t * end); // Find unit by start code RawUnit m_nalu = {}; UMC::MediaData* m_source = nullptr; std::vector m_cache; // Started but not completed unit double m_pts = -1; bool m_needCleanCache = false; }; // This is a wrapper under RawHeaderIterator class. // The additional functionality introduced by the class is to return sequence/sequence extension or picture/picture extension headers in pairs. // This helps to handle corrupted stream where one of the headers is missing. class Splitter { public: void Reset() { m_it.Reset(); m_buff.clear(); m_cleanUpBuffer = false; m_typeExtToFind = 0; } // Main API function RawUnit GetUnits(UMC::MediaData*); private: RawHeaderIterator m_it; // unit iterator std::vector m_buff; // Copy of found sequence or picture header bool m_cleanUpBuffer = false; uint8_t m_typeExtToFind = 0; // Specifies type of extension header which we currently are looking for }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include/umc_mpeg2_utils.h000066400000000000000000000041201443134507600325600ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_defs.h" namespace UMC_MPEG2_DECODER { eMFXPlatform GetPlatform_MPEG2(VideoCORE * core, mfxVideoParam * par); mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); bool CheckVideoParam(mfxVideoParam *in); void GetMfxFrameRate(uint8_t frame_rate_value, mfxU32 & frameRateN, mfxU32 & frameRateD); mfxU8 GetMfxCodecProfile(uint8_t profile); mfxU8 GetMfxCodecLevel(uint8_t level); void CalcAspectRatio(uint32_t dar, uint32_t width, uint32_t height, uint16_t & aspectRatioW, uint16_t & aspectRatioH); namespace MFX_Utility { UMC::Status FillVideoParam(const MPEG2SequenceHeader & seq, const MPEG2SequenceExtension * seqExt, const MPEG2SequenceDisplayExtension * dispExt, mfxVideoParam & par); } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE umc_mpeg2_va_packer.h000066400000000000000000000066511443134507600333070ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/include// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_va_base.h" #include namespace UMC { class MediaData; } namespace UMC_MPEG2_DECODER { class MPEG2DecoderFrameInfo; class MPEG2DecoderFrame; class Packer { public: Packer(UMC::VideoAccelerator * va); virtual ~Packer(); virtual UMC::Status GetStatusReport(void* pStatusReport, size_t size) = 0; virtual UMC::Status SyncTask(MPEG2DecoderFrame*, void * error) = 0; virtual UMC::Status QueryTaskStatus(uint32_t index, void * status, void * error) = 0; virtual void BeginFrame() = 0; virtual void EndFrame() = 0; virtual void PackAU(MPEG2DecoderFrame const&, uint8_t) = 0; static Packer* CreatePacker(UMC::VideoAccelerator * va); protected: virtual void PackPicParams(const MPEG2DecoderFrame&, uint8_t) = 0; virtual void PackQmatrix(const MPEG2DecoderFrameInfo&) = 0; virtual void PackSliceParams(const MPEG2DecoderFrameInfo &) = 0; protected: UMC::VideoAccelerator *m_va; }; class PackerVA : public Packer { public: PackerVA(UMC::VideoAccelerator * va); UMC::Status GetStatusReport(void * /*pStatusReport*/, size_t /*size*/) override { return UMC::UMC_OK; } // Synchronize task UMC::Status SyncTask(MPEG2DecoderFrame* frame, void * error) override { return m_va->SyncTask(frame->GetMemID(), error); } UMC::Status QueryTaskStatus(uint32_t index, void * status, void * error) override { return m_va->QueryTaskStatus(index, status, error); } void BeginFrame() override; void EndFrame() override; // Pack the whole picture void PackAU(MPEG2DecoderFrame const&, uint8_t) override; protected: // Pack picture lice parameters void PackPicParams(const MPEG2DecoderFrame&, uint8_t) override; // Pack matrix parameters void PackQmatrix(const MPEG2DecoderFrameInfo&) override; // Pack slice parameters void PackSliceParams(const MPEG2DecoderFrameInfo &) override; private: void CreateSliceDataBuffer(const MPEG2DecoderFrameInfo&); void CreateSliceParamBuffer(const MPEG2DecoderFrameInfo&); }; } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/000077500000000000000000000000001443134507600264605ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_bitstream.cpp000066400000000000000000000403301443134507600331140ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "mfx_utils.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_defs.h" #include "umc_mpeg2_slice.h" #include "umc_mpeg2_bitstream.h" namespace UMC_MPEG2_DECODER { // Parse sequence header void MPEG2HeadersBitstream::GetSequenceHeader(MPEG2SequenceHeader & seq) { // 6.2.2.1 Sequence header seq.horizontal_size_value = GetBits(12); if (!seq.horizontal_size_value) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); seq.vertical_size_value = GetBits(12); if (!seq.vertical_size_value) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); seq.aspect_ratio_information = GetBits(4); // seq.aspect_ratio_information should be in [1;4] range but ignore this for corrupted streams seq.frame_rate_code = GetBits(4); seq.bit_rate_value = GetBits(18); Seek(1); // marker_bit shall be '1' to prevent emulation of start codes. But ignore this for corrupted streams. seq.vbv_buffer_size_value = GetBits(10); seq.constrained_parameters_flag = (uint8_t)GetBits(1); seq.load_intra_quantiser_matrix = (uint8_t)GetBits(1); if (seq.load_intra_quantiser_matrix) { for (uint32_t i = 0; i < 64; ++i) seq.intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } seq.load_non_intra_quantiser_matrix = (uint8_t)GetBits(1); if (seq.load_non_intra_quantiser_matrix) { for (uint32_t i = 0; i < 64; ++i) seq.non_intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } } // Parse sequence extension void MPEG2HeadersBitstream::GetSequenceExtension(MPEG2SequenceExtension & seqExt) { // 6.2.2.3 Sequence extension seqExt.profile_and_level_indication = (uint8_t)GetBits(8); seqExt.progressive_sequence = (uint8_t)GetBits(1); seqExt.chroma_format = (uint8_t)GetBits(2); if (0 == seqExt.chroma_format) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); seqExt.horizontal_size_extension = (uint8_t)GetBits(2); seqExt.vertical_size_extension = (uint8_t)GetBits(2); seqExt.bit_rate_extension = GetBits(12); Seek(1); // marker_bit shall be '1' to prevent emulation of start codes. But ignore this for corrupted streams. seqExt.vbv_buffer_size_extension = GetBits(8); seqExt.low_delay = (uint8_t)GetBits(1); seqExt.frame_rate_extension_n = (uint8_t)GetBits(2); seqExt.frame_rate_extension_d = (uint8_t)GetBits(5); } // Parse sequence display extension void MPEG2HeadersBitstream::GetSequenceDisplayExtension(MPEG2SequenceDisplayExtension & dispExt) { // 6.2.2.4 Sequence display extension dispExt.video_format = (uint8_t)GetBits(3); dispExt.colour_description = (uint8_t)GetBits(1); if (dispExt.colour_description) { dispExt.colour_primaries = (uint8_t)GetBits(8); dispExt.transfer_characteristics = (uint8_t)GetBits(8); dispExt.matrix_coefficients = (uint8_t)GetBits(8); } dispExt.display_horizontal_size = (uint16_t)GetBits(14); uint8_t marker_bit = (uint8_t)GetBits(1); if (0 == marker_bit) // shall be '1'. This bit prevents emulation of start codes. throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); dispExt.display_vertical_size = (uint16_t)GetBits(14); } // Parse picture header void MPEG2HeadersBitstream::GetPictureHeader(MPEG2PictureHeader & pic) { pic.temporal_reference = (uint16_t)GetBits(10); pic.picture_coding_type = (uint8_t)GetBits(3); if (pic.picture_coding_type > MPEG2_B_PICTURE || pic.picture_coding_type < MPEG2_I_PICTURE) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); pic.vbv_delay = (uint16_t)GetBits(16); if (pic.picture_coding_type == MPEG2_P_PICTURE || pic.picture_coding_type == MPEG2_B_PICTURE) { pic.full_pel_forward_vector = (uint8_t)GetBits(1); pic.forward_f_code = (uint8_t)GetBits(3); } if (pic.picture_coding_type == MPEG2_B_PICTURE) { pic.full_pel_backward_vector = (uint8_t)GetBits(1); pic.backward_f_code = (uint8_t)GetBits(3); } /* while (GetBits(1)) { uint8_t extra_information_picture = GetBits(8); } */ } // Parse picture extension void MPEG2HeadersBitstream::GetPictureExtensionHeader(MPEG2PictureCodingExtension & picExt) { picExt.f_code[0] = (uint8_t)GetBits(4); // forward horizontal picExt.f_code[1] = (uint8_t)GetBits(4); // forward vertical picExt.f_code[2] = (uint8_t)GetBits(4); // backward horizontal picExt.f_code[3] = (uint8_t)GetBits(4); // backward vertical picExt.intra_dc_precision = (uint8_t)GetBits(2); picExt.picture_structure = (uint8_t)GetBits(2); if (picExt.picture_structure == 0) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); picExt.top_field_first = (uint8_t)GetBits(1); picExt.frame_pred_frame_dct = (uint8_t)GetBits(1); picExt.concealment_motion_vectors = (uint8_t)GetBits(1); picExt.q_scale_type = (uint8_t)GetBits(1); picExt.intra_vlc_format = (uint8_t)GetBits(1); picExt.alternate_scan = (uint8_t)GetBits(1); picExt.repeat_first_field = (uint8_t)GetBits(1); picExt.chroma_420_type = (uint8_t)GetBits(1); picExt.progressive_frame = (uint8_t)GetBits(1); picExt.composite_display_flag = (uint8_t)GetBits(1); if (picExt.composite_display_flag) { picExt.v_axis = (uint8_t)GetBits(1); picExt.field_sequence = (uint8_t)GetBits(3); picExt.sub_carrier = (uint8_t)GetBits(1); picExt.burst_amplitude = (uint8_t)GetBits(7); picExt.sub_carrier_phase = (uint8_t)GetBits(8); } } // Parse quant matrix extension void MPEG2HeadersBitstream::GetQuantMatrix(MPEG2QuantMatrix & qm) { qm.load_intra_quantiser_matrix = (uint8_t)GetBits(1); if (qm.load_intra_quantiser_matrix) { for (uint8_t i= 0; i < 64; ++i) { qm.intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } } qm.load_non_intra_quantiser_matrix = (uint8_t)GetBits(1); if (qm.load_non_intra_quantiser_matrix) { for (uint8_t i= 0; i < 64; ++i) { qm.non_intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } } qm.load_chroma_intra_quantiser_matrix = (uint8_t)GetBits(1); if (qm.load_chroma_intra_quantiser_matrix) { for (uint8_t i= 0; i < 64; ++i) { qm.chroma_intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } } qm.load_chroma_non_intra_quantiser_matrix = (uint8_t)GetBits(1); if (qm.load_chroma_non_intra_quantiser_matrix) { for (uint8_t i= 0; i < 64; ++i) { qm.chroma_non_intra_quantiser_matrix[i] = (uint8_t)GetBits(8); } } } // Parse quant matrix extension (Table 6-11) void MPEG2HeadersBitstream::GetGroupOfPicturesHeader(MPEG2GroupOfPictures& g) { g.drop_frame_flag = (uint8_t)GetBits(1); g.time_code_hours = (uint8_t)GetBits(5); if (g.time_code_hours > 23) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); g.time_code_minutes = (uint8_t)GetBits(6); if (g.time_code_minutes > 59) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); Seek(1); // marker_bit g.time_code_seconds = (uint8_t)GetBits(6); if (g.time_code_seconds > 59) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); g.time_code_pictures = (uint8_t)GetBits(6); if (g.time_code_pictures > 59) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); g.closed_gop = (uint8_t)GetBits(1); g.broken_link = (uint8_t)GetBits(1); } // Parse slice header UMC::Status MPEG2HeadersBitstream::GetSliceHeader(MPEG2SliceHeader & sliceHdr, const MPEG2SequenceHeader &seq, const MPEG2SequenceExtension & seqExt) { sliceHdr.slice_vertical_position = (uint8_t)GetBits(8); uint16_t vertical_size = (uint16_t)(seq.vertical_size_value | (seqExt.vertical_size_extension << 14)); if (vertical_size > 2800) { if (sliceHdr.slice_vertical_position > 128) // 6.3.16 throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); sliceHdr.slice_vertical_position_extension = (uint8_t)GetBits(3); } else { if (sliceHdr.slice_vertical_position > 175) // 6.3.16 throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); } sliceHdr.quantiser_scale_code = (uint8_t)GetBits(5); if (!sliceHdr.quantiser_scale_code) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); if (Check1Bit()) { sliceHdr.intra_slice_flag = (uint8_t)GetBits(1); sliceHdr.intra_slice = (uint8_t)GetBits(1); Seek(7); // reserved_bits while (Check1Bit()) { Seek(1); // extra_bit_slice Seek(8); // extra_information_slice } } Seek(1); // extra_bit_slice, shall be 0 return UMC::UMC_OK; } // Parse full slice header UMC::Status MPEG2HeadersBitstream::GetSliceHeaderFull(MPEG2Slice & slice, const MPEG2SequenceHeader & seq, const MPEG2SequenceExtension & seqExt) { UMC::Status sts = GetSliceHeader(slice.GetSliceHeader(), seq, seqExt); if (UMC::UMC_OK != sts) return sts; slice.sliceHeader.mbOffset = (uint32_t)BitsDecoded(); slice.sliceHeader.macroblockAddressIncrement = 1; if (0 == Check1Bit()) { DecodeMBAddress(slice.sliceHeader); } --slice.sliceHeader.macroblockAddressIncrement; if (CheckBSLeft()) throw mpeg2_exception(UMC::UMC_ERR_INVALID_STREAM); uint32_t width_in_MBs = mfx::align2_value(slice.GetSeqHeader().horizontal_size_value, 16) / 16u; uint32_t height_in_MBs = mfx::align2_value(slice.GetSeqHeader().vertical_size_value, 16) / 16u; // invalid slice - skipping it if (slice.sliceHeader.slice_vertical_position > height_in_MBs) throw mpeg2_exception(UMC::UMC_ERR_INVALID_PARAMS); slice.sliceHeader.numberMBsInSlice = width_in_MBs - slice.sliceHeader.macroblockAddressIncrement; return UMC::UMC_OK; } struct VLCEntry { int8_t value; uint8_t length; }; static const VLCEntry MBAddrIncrTabB1_1[16] = { { -2 + 1, 48 - 48 }, { -2 + 1, 67 - 67 }, { 2 + 5, 3 + 2 }, { 2 + 4, 3 + 2 }, { 0 + 5, 1 + 3 }, { 4 + 1, 2 + 2 }, { 3 + 1, 2 + 2 }, { 0 + 4, 3 + 1 }, { 2 + 1, 2 + 1 }, { 0 + 3, 0 + 3 }, { 1 + 2, 2 + 1 }, { 1 + 2, 1 + 2 }, { 0 + 2, 2 + 1 }, { 1 + 1, 2 + 1 }, { 0 + 2, 2 + 1 }, { 0 + 2, 2 + 1 }, }; static const VLCEntry MBAddrIncrTabB1_2[104] = { { 18 + 15, 5 + 6 }, { 18 + 14, 0 + 11 }, { 12 + 19, 7 + 4 }, { 6 + 24, 7 + 4 }, { 4 + 25, 4 + 7 }, { 1 + 27, 0 + 11 }, { 4 + 23, 2 + 9 }, { 15 + 11, 3 + 8 }, { 22 + 3, 1 + 10 }, { 15 + 9, 2 + 9 }, { 4 + 19, 5 + 6 }, { 0 + 22, 7 + 4 }, { 2 + 19, 3 + 7 }, { 2 + 19, 7 + 3 }, { 1 + 19, 0 + 10 }, { 15 + 5, 6 + 4 }, { 11 + 8, 4 + 6 }, { 0 + 19, 7 + 3 }, { 9 + 9, 8 + 2 }, { 10 + 8, 4 + 6 }, { 8 + 9, 7 + 3 }, { 0 + 17, 6 + 4 }, { 5 + 11, 4 + 6 }, { 12 + 4, 3 + 7 }, { 8 + 7, 3 + 5 }, { 2 + 13, 1 + 7 }, { 13 + 2, 2 + 6 }, { 1 + 14, 4 + 4 }, { 0 + 15, 6 + 2 }, { 5 + 10, 5 + 3 }, { 4 + 11, 0 + 8 }, { 6 + 9, 3 + 5 }, { 5 + 9, 4 + 4 }, { 5 + 9, 4 + 4 }, { 12 + 2, 3 + 5 }, { 5 + 9, 2 + 6 }, { 9 + 5, 2 + 6 }, { 1 + 13, 7 + 1 }, { 1 + 13, 3 + 5 }, { 5 + 9, 4 + 4 }, { 0 + 13, 1 + 7 }, { 12 + 1, 5 + 3 }, { 1 + 12, 7 + 1 }, { 2 + 11, 4 + 4 }, { 1 + 12, 6 + 2 }, { 3 + 10, 3 + 5 }, { 6 + 7, 2 + 6 }, { 9 + 4, 6 + 2 }, { 7 + 5, 2 + 6 }, { 11 + 1, 0 + 8 }, { 6 + 6, 5 + 3 }, { 3 + 9, 0 + 8 }, { 4 + 8, 2 + 6 }, { 4 + 8, 7 + 1 }, { 10 + 2, 1 + 7 }, { 4 + 8, 6 + 2 }, { 4 + 7, 2 + 6 }, { 4 + 7, 7 + 1 }, { 9 + 2, 6 + 2 }, { 8 + 3, 0 + 8 }, { 7 + 4, 6 + 2 }, { 5 + 6, 3 + 5 }, { 9 + 2, 3 + 5 }, { 8 + 3, 0 + 8 }, { 3 + 7, 5 + 3 }, { 7 + 3, 4 + 4 }, { 9 + 1, 4 + 4 }, { 8 + 2, 3 + 5 }, { 3 + 7, 5 + 3 }, { 9 + 1, 6 + 2 }, { 7 + 3, 0 + 8 }, { 7 + 3, 2 + 6 }, { 6 + 3, 6 + 1 }, { 3 + 6, 1 + 6 }, { 7 + 2, 6 + 1 }, { 8 + 1, 3 + 4 }, { 4 + 5, 5 + 2 }, { 7 + 2, 1 + 6 }, { 2 + 7, 3 + 4 }, { 7 + 2, 1 + 6 }, { 7 + 2, 0 + 7 }, { 7 + 2, 5 + 2 }, { 8 + 1, 0 + 7 }, { 4 + 5, 3 + 4 }, { 0 + 9, 1 + 6 }, { 0 + 9, 4 + 3 }, { 4 + 5, 2 + 5 }, { 8 + 1, 5 + 2 }, { 5 + 3, 0 + 7 }, { 6 + 2, 1 + 6 }, { 6 + 2, 6 + 1 }, { 4 + 4, 1 + 6 }, { 0 + 8, 6 + 1 }, { 2 + 6, 1 + 6 }, { 2 + 6, 3 + 4 }, { 3 + 5, 6 + 1 }, { 2 + 6, 2 + 5 }, { 3 + 5, 6 + 1 }, { 2 + 6, 6 + 1 }, { 6 + 2, 4 + 3 }, { 3 + 5, 0 + 7 }, { 0 + 8, 0 + 7 }, { 6 + 2, 3 + 4 }, { 3 + 5, 1 + 6 }, }; // Get macroblock address increment void MPEG2HeadersBitstream::DecodeMBAddress(MPEG2SliceHeader & sliceHdr) { uint32_t macroblock_address_increment = 0; uint32_t cc; uint8_t bitsToRead; for (;;) { bitsToRead = (uint8_t)(BitsLeft() <= 11 ? BitsLeft() : 11); cc = GetBits(bitsToRead); if (11 - bitsToRead) // if left bits are less than 11 cc <<= (11 - bitsToRead); Seek(-bitsToRead); if (cc >= 24) break; if (cc != 15) // if not macroblock_stuffing { if (cc != 8) // if not macroblock_escape { sliceHdr.macroblockAddressIncrement = 1; return; } macroblock_address_increment += 33; } Seek(bitsToRead); } if (cc >= 1024) { Seek(1); sliceHdr.macroblockAddressIncrement = macroblock_address_increment + 1; return; } uint32_t cc1; uint32_t length; if (cc >= 128) { cc >>= 6; length = MBAddrIncrTabB1_1[cc].length; cc1 = GetBits(length); sliceHdr.macroblockAddressIncrement = macroblock_address_increment + MBAddrIncrTabB1_1[cc].value; return; } cc -= 24; length = MBAddrIncrTabB1_2[cc].length; cc1 = GetBits(length); sliceHdr.macroblockAddressIncrement = macroblock_address_increment + MBAddrIncrTabB1_2[cc].value; std::ignore = cc1; } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_decoder.cpp000066400000000000000000001267311443134507600325410ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) #include "umc_structures.h" #include "umc_mpeg2_decoder.h" #include "umc_mpeg2_utils.h" #include "umc_mpeg2_slice.h" #include namespace UMC_MPEG2_DECODER { // Find a previous (in decoded order) reference frame MPEG2DecoderFrame* FindLastRefFrame(const MPEG2DecoderFrame & curr, const DPBType & dpb) { DPBType refFrames; std::copy_if(dpb.begin(), dpb.end(), back_inserter(refFrames), [&curr](MPEG2DecoderFrame const * f) { return !f->Empty() && (f != &curr) && f->IsRef(); } ); auto i = std::max_element(std::begin(refFrames), std::end(refFrames), [](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { return f1->decOrder < f2->decOrder; } ); return (i == std::end(refFrames)) ? nullptr : *i; } // Find an unused frame in DPB MPEG2DecoderFrame* FindFreeFrame(const DPBType & dpb) { auto i = std::find_if(std::begin(dpb), std::end(dpb), [](MPEG2DecoderFrame const* frame) { return frame->Empty(); } ); return (i != std::end(dpb)) ? *i : nullptr; } MPEG2Decoder::MPEG2Decoder() : m_allocator(nullptr) , m_counter(0) , m_firstMfxVideoParams() , m_currFrame(nullptr) , m_dpbSize(0) , m_localDeltaFrameTime(0) , m_useExternalFramerate(false) , m_localFrameTime(0) { } MPEG2Decoder::~MPEG2Decoder() { std::for_each(std::begin(m_dpb), std::end(m_dpb), std::default_delete() ); } UMC::Status MPEG2Decoder::Init(UMC::BaseCodecParams* vp) { auto dp = dynamic_cast (vp); MFX_CHECK(dp, UMC::UMC_ERR_INVALID_PARAMS); MFX_CHECK(dp->allocator, UMC::UMC_ERR_INVALID_PARAMS); m_allocator = dp->allocator; m_useExternalFramerate = 0 < dp->info.framerate; m_localDeltaFrameTime = m_useExternalFramerate ? 1 / dp->info.framerate : 1.0/30; m_params = *dp; m_messages.reset(new Payload_Storage); m_messages->Init(); return SetParams(vp); } UMC::Status MPEG2Decoder::Close() { return Reset(); } UMC::Status MPEG2Decoder::Reset() { m_counter = 0; std::for_each(std::begin(m_dpb), std::end(m_dpb), std::default_delete() ); m_dpb.clear(); m_localFrameTime = 0; m_currFrame = nullptr; m_currHeaders.seqHdr.reset(); m_currHeaders.seqExtHdr.reset(); m_currHeaders.displayExtHdr.reset(); m_currHeaders.qmatrix.reset(); m_currHeaders.group.reset(); m_currHeaders.picHdr.reset(); m_currHeaders.picExtHdr.reset(); m_rawHeaders.Reset(); m_splitter.Reset(); if (m_messages) m_messages->Reset(); Skipping_MPEG2::Reset(); m_lastSlice.reset(); return UMC::UMC_OK; } // Set MFX video params void MPEG2Decoder::SetVideoParams(const mfxVideoParam & par) { m_firstMfxVideoParams = par; } UMC::Status MPEG2Decoder::GetInfo(UMC::BaseCodecParams* info) { auto vp = dynamic_cast (info); MFX_CHECK(vp, UMC::UMC_ERR_INVALID_PARAMS); *vp = m_params; return UMC::UMC_OK; } // Fill mfx video params from current seq/seqExt/display headers UMC::Status MPEG2Decoder::FillVideoParam(mfxVideoParam *par, bool /*full*/) { const auto seq = m_currHeaders.seqHdr.get(); MFX_CHECK(seq, UMC::UMC_ERR_FAILED); // mandatory header const auto seqExt = m_currHeaders.seqExtHdr.get(); MFX_CHECK(seqExt, UMC::UMC_ERR_FAILED); // mandatory header const auto dispExt = m_currHeaders.displayExtHdr.get(); // optional if (UMC_MPEG2_DECODER::MFX_Utility::FillVideoParam(*seq, seqExt, dispExt, *par) != UMC::UMC_OK) return UMC::UMC_ERR_FAILED; return UMC::UMC_OK; } // MediaSDK API DecodeHeader UMC::Status MPEG2Decoder::DecodeHeader(mfxBitstream & bs, mfxVideoParam & par) { MFXMediaDataAdapter in(&bs); // The purpose of this is to remove FLAG_VIDEO_DATA_NOT_FULL_FRAME flag // so that we can handle partial unit (i.e. corrupted) in a proper way in.SetFlags(0); std::unique_ptr seq; std::unique_ptr seqExt; std::unique_ptr dispExt; RawHeader_MPEG2 rawHdr; MPEG2HeadersBitstream bitStream; RawHeaderIterator it; for (it.LoadData(&in); it != RawHeaderIterator(); ++it) { RawUnit sequence; RawUnit sequenceExtension; RawUnit sequenceDisplayExtension; if (SEQUENCE_HEADER == it->type) { // seq header already found if (seq) break; // move point to the sequence header size_t headerSize = (it->end - it->begin); bs.DataOffset = (mfxU32)((uint8_t*)in.GetDataPointer() - (uint8_t*)in.GetBufferPointer() - headerSize); bs.DataLength = (mfxU32)(in.GetDataSize() + headerSize); seq.reset(new MPEG2SequenceHeader); seqExt.reset(); dispExt.reset(); try { uint8_t * begin = it->begin + prefix_size + 1; bitStream.Reset(begin, (uint32_t)(it->end - begin)); bitStream.GetSequenceHeader(*seq.get()); } // On corrupted data reset headers catch(const mpeg2_exception&) { seq.reset(); seqExt.reset(); dispExt.reset(); continue; } rawHdr.Resize(it->end - it->begin); std::copy(it->begin, it->end, rawHdr.GetPointer()); } else if (EXTENSION == it->type) { uint8_t ext_type = it->begin[prefix_size + 1] >> 4; if (SEQUENCE_EXTENSION == ext_type) { // seq header already found if (seqExt) break; seqExt.reset(new MPEG2SequenceExtension); try { uint8_t * begin = it->begin + prefix_size + 1; bitStream.Reset(begin, (uint32_t)(it->end - begin)); bitStream.Seek(4); // skip extension type bitStream.GetSequenceExtension(*seqExt.get()); } // On corrupted data reset headers catch(const mpeg2_exception&) { seq.reset(); seqExt.reset(); dispExt.reset(); continue; } size_t oldSize = rawHdr.GetSize(); rawHdr.Resize(oldSize + (it->end - it->begin)); std::copy(it->begin, it->end, rawHdr.GetPointer() + oldSize); } else if (SEQUENCE_DISPLAY_EXTENSION == ext_type) { dispExt.reset(new MPEG2SequenceDisplayExtension); try { uint8_t * begin = it->begin + prefix_size + 1; bitStream.Reset(begin, (uint32_t)(it->end - begin)); bitStream.Seek(4); // skip extension type bitStream.GetSequenceDisplayExtension(*dispExt.get()); } // On errors reset headers catch(const mpeg2_exception&) { seq.reset(); seqExt.reset(); dispExt.reset(); continue; } size_t oldSize = rawHdr.GetSize(); rawHdr.Resize(oldSize + (it->end - it->begin)); std::copy(it->begin, it->end, rawHdr.GetPointer() + oldSize); } } else if (seq) { break; } } // Got data, fill mfx video params if (seq) { UMC_MPEG2_DECODER::MFX_Utility::FillVideoParam(*seq.get(), seqExt.get(), dispExt.get(), par); auto mfxSeq = (mfxExtCodingOptionSPSPPS *)GetExtendedBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_CODING_OPTION_SPSPPS); if (mfxSeq) { if (rawHdr.GetSize()) { if (mfxSeq->SPSBufSize < rawHdr.GetSize()) MFX_RETURN(MFX_ERR_NOT_ENOUGH_BUFFER); mfxSeq->SPSBufSize = (mfxU16)(rawHdr.GetSize()); std::copy(rawHdr.GetPointer(), rawHdr.GetPointer() + mfxSeq->SPSBufSize, mfxSeq->SPSBuffer); } else { mfxSeq->SPSBufSize = 0; } } return UMC::UMC_OK; } // If didn't find headers consume all bs data bs.DataOffset = (mfxU32)((uint8_t*)in.GetDataPointer() - (uint8_t*)in.GetBufferPointer()); bs.DataLength = (mfxU32)in.GetDataSize(); // Request more data return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // Add a new bitstream data buffer to decoding UMC::Status MPEG2Decoder::AddSource(UMC::MediaData * source) { if (GetFrameToDisplay()) return UMC::UMC_OK; return AddOneFrame(source); } // Find units in new bitstream buffer and process them UMC::Status MPEG2Decoder::AddOneFrame(UMC::MediaData * source) { if (m_lastSlice) { UMC::Status sts = AddSlice(m_lastSlice.release()); if (sts == UMC::UMC_ERR_NOT_ENOUGH_BUFFER || sts == UMC::UMC_OK) return sts; } // The main processing loop for (RawUnit unit = m_splitter.GetUnits(source); unit.begin && unit.end; unit = m_splitter.GetUnits(source)) { switch (unit.type) { case SEQUENCE_HEADER: { auto sts = DecodeHeaders(unit); if (sts != UMC::UMC_OK) { if (sts == UMC::UMC_NTF_NEW_RESOLUTION && source) { // Move to the position of sequence header start source->MoveDataPointer((int32_t)- (unit.end - unit.begin)); } return sts; } } break; case PICTURE_HEADER: { auto sts = DecodeHeaders(unit); // 1. Parse new picture header if ((UMC::UMC_OK == sts) && m_currFrame) // 2. Complete current picture { bool isFullFrame = OnNewPicture(); if (isFullFrame) return UMC::UMC_OK; // exit from the loop on full frame } } break; case EXTENSION: case GROUP: DecodeHeaders(unit); break; case USER_DATA: m_messages->AddMessage(unit, -1); break; default: break; }; bool isSlice = (unit.type >= 0x1 && unit.type <= 0xAF); // slice header start codes if (isSlice) { auto sts = OnNewSlice(unit); if (sts == UMC::UMC_ERR_NOT_ENOUGH_BUFFER) // no free frames -> MFX_WRN_DEV_BUSY return sts; } }; auto sts = UMC::UMC_ERR_NOT_ENOUGH_DATA; // The whole bitstream has been consumed. We have to complete current _frame_ if 'complete' flag was set bool isCompleteFrame = source && !(source->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME); if (isCompleteFrame && m_currFrame && (m_currFrame->isProgressiveSequence || m_currFrame->GetAU(0)->IsFilled())) { CompletePicture(*m_currFrame, m_currFrame->currFieldIndex); m_currFrame->SetFullFrame(true); m_currFrame = nullptr; sts = UMC::UMC_OK; // exit on full frame } else if (!source) // EOS handling { AddSlice(nullptr); } return sts; } // Action on new slice UMC::Status MPEG2Decoder::OnNewSlice(const RawUnit & data) { UMC::Status sts = UMC::UMC_ERR_NOT_ENOUGH_DATA; if (auto slice = DecodeSliceHeader(data)) { sts = AddSlice(slice); } return sts; } // Decode slice header start, set slice links to seq and picture MPEG2Slice *MPEG2Decoder::DecodeSliceHeader(const RawUnit & in) { // Check availability of headers if (!m_currHeaders.seqHdr || !m_currHeaders.seqExtHdr || !m_currHeaders.picHdr || !m_currHeaders.picExtHdr ) { return nullptr; } std::unique_ptr slice (new MPEG2Slice); // unique_ptr is to prevent a possible memory leak const size_t size = in.end - in.begin - prefix_size; slice->source.Alloc(size); if (slice->source.GetBufferSize() < size) throw mpeg2_exception(UMC::UMC_ERR_ALLOC); // It can be optimized without memory copy std::copy(in.begin + prefix_size, in.end, (uint8_t*)slice->source.GetDataPointer()); slice->source.SetDataSize(size); slice->source.SetTime(in.pts); slice->SetSeqHeader(m_currHeaders.seqHdr); slice->SetSeqExtHeader(m_currHeaders.seqExtHdr); slice->SetPicHeader(m_currHeaders.picHdr); slice->SetPicExtHeader(m_currHeaders.picExtHdr); slice->SetQMatrix(m_currHeaders.qmatrix); // Skip slice in case of in errors slice header if (!slice->Reset()) { return nullptr; } return slice.release(); } // Add a new slice to picture UMC::Status MPEG2Decoder::AddSlice(MPEG2Slice * slice) { // On EOS if (!slice) { // output all cached frames { std::unique_lock l(m_guard); std::for_each(m_dpb.begin(), m_dpb.end(), [](MPEG2DecoderFrame* frame) { if (!frame->IsReadyToBeOutputted() && frame->DecodingStarted()) frame->SetReadyToBeOutputted(); } ); } if (m_currFrame) { m_currFrame->SetFullFrame(true); CompletePicture(*m_currFrame, m_currFrame->currFieldIndex); m_currFrame->SetReadyToBeOutputted(); // Reordering finished m_currFrame = nullptr; return UMC::UMC_OK; // On full frame } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // There is no current frame. // Try to allocate a new one. if (nullptr == m_currFrame) { // Allocate a new frame, initialize it with slice's parameters. if (nullptr == (m_currFrame = StartFrame(slice))) { m_lastSlice.reset(slice); return UMC::UMC_ERR_NOT_ENOUGH_BUFFER; } } // Frame time stamp m_currFrame->dFrameTime = slice->source.GetTime(); const auto picExt = *m_currHeaders.picExtHdr; m_currFrame->fieldIndex = m_currFrame->GetNumberByParity(picExt.picture_structure == BOTTOM_FLD_PICTURE); MPEG2DecoderFrameInfo & info = *m_currFrame->GetAU((uint8_t)m_currFrame->fieldIndex); // Add the slice to the picture info.AddSlice(slice); if (info.GetSliceCount() == 1) // Set ref frames on the first slice of the picture { std::unique_lock l(m_guard); info.UpdateReferences(m_dpb); } return UMC::UMC_ERR_NOT_ENOUGH_DATA; } // Decode sequence header UMC::Status MPEG2Decoder::DecodeSeqHeader(const RawUnit & data) { auto seqHdr = std::make_shared(); auto seqExtHdr = std::make_shared(); MPEG2HeadersBitstream bitStream(data.begin + prefix_size + 1, (uint32_t)(data.end - data.begin - prefix_size - 1)); // "+ prefix_size + 1" is to skip start code and type try { bitStream.GetSequenceHeader(*seqHdr.get()); uint8_t* seqExtBegin = RawHeaderIterator::FindStartCode(data.begin + prefix_size + bitStream.BytesDecoded(), data.end); MFX_CHECK(seqExtBegin, UMC::UMC_ERR_INVALID_STREAM); bitStream.Reset(seqExtBegin + prefix_size, (uint32_t)(data.end - seqExtBegin)); bitStream.Seek(8 + 4); // skip data and extension types bitStream.GetSequenceExtension(*seqExtHdr.get()); // Save headers m_currHeaders.seqHdr = std::move(seqHdr); m_currHeaders.seqExtHdr = std::move(seqExtHdr); // Reset 'dependent' headers m_currHeaders.displayExtHdr.reset(); m_currHeaders.qmatrix.reset(); m_currHeaders.group.reset(); m_currHeaders.picHdr.reset(); m_currHeaders.picExtHdr.reset(); m_rawHeaders.Resize(data.end - data.begin); std::copy(data.begin, data.end, m_rawHeaders.GetPointer()); } catch(const mpeg2_exception & ex) { return ex.GetStatus(); } catch(...) { return UMC::UMC_ERR_INVALID_STREAM; } const auto currSeq = m_currHeaders.seqHdr.get(); if (currSeq && ((m_firstMfxVideoParams.mfx.FrameInfo.Width < currSeq->horizontal_size_value) || (m_firstMfxVideoParams.mfx.FrameInfo.Height < currSeq->vertical_size_value))) { return UMC::UMC_NTF_NEW_RESOLUTION; } return UMC::UMC_WRN_REPOSITION_INPROGRESS; } // Decode picture header UMC::Status MPEG2Decoder::DecodePicHeader(const RawUnit & data) { auto picHdr = std::make_shared(); auto picExtHdr = std::make_shared(); MPEG2HeadersBitstream bitStream(data.begin + prefix_size + 1, (uint32_t)(data.end - data.begin - prefix_size - 1)); // "+ prefix_size + 1" is to skip start code and type try { bitStream.GetPictureHeader(*picHdr.get()); uint8_t* picExtBegin = RawHeaderIterator::FindStartCode(data.begin + prefix_size + bitStream.BytesDecoded(), data.end); // Find begining of extension MFX_CHECK(picExtBegin, UMC::UMC_ERR_INVALID_STREAM); bitStream.Reset(picExtBegin + prefix_size, (uint32_t)(data.end - picExtBegin)); bitStream.Seek(8 + 4); // skip data and extension types bitStream.GetPictureExtensionHeader(*picExtHdr.get()); // decode extension // Apply new header m_currHeaders.picHdr = std::move(picHdr); m_currHeaders.picExtHdr = std::move(picExtHdr); } catch(const mpeg2_exception & ex) { return ex.GetStatus(); } catch(...) { return UMC::UMC_ERR_INVALID_STREAM; } return UMC::UMC_OK; } // Decode group of pictures header UMC::Status MPEG2Decoder::DecodeGroupHeader(const RawUnit & data) { auto group = std::make_shared(); MPEG2HeadersBitstream bitStream(data.begin + prefix_size + 1, (uint32_t)(data.end - data.begin - prefix_size - 1)); // "+ prefix_size + 1" is to skip start code and type try { bitStream.GetGroupOfPicturesHeader(*group.get()); m_currHeaders.group = std::move(group); } catch(...) { return UMC::UMC_ERR_INVALID_STREAM; } return UMC::UMC_OK; } // Decode display and matrix extensions UMC::Status MPEG2Decoder::DecodeExtension(const RawUnit & data) { MPEG2HeadersBitstream bitStream(data.begin + prefix_size + 1, (uint32_t)(data.end - data.begin - prefix_size - 1)); // "+ prefix_size + 1" is to skip start code and types try { auto type_ext = (MPEG2_UNIT_TYPE_EXT)bitStream.GetBits(4); switch(type_ext) { case SEQUENCE_DISPLAY_EXTENSION: { auto displayExtHdr = std::make_shared(); bitStream.GetSequenceDisplayExtension(*displayExtHdr.get()); m_currHeaders.displayExtHdr = std::move(displayExtHdr); // apply new header } break; case QUANT_MATRIX_EXTENSION: { auto quantMatrix = std::make_shared(); bitStream.GetQuantMatrix(*quantMatrix.get()); m_currHeaders.qmatrix = std::move(quantMatrix); // apply new header } break; default: break; } } catch(const mpeg2_exception & ex) { return ex.GetStatus(); } catch(...) { return UMC::UMC_ERR_INVALID_STREAM; } return UMC::UMC_OK; } // Decode a bitstream header UMC::Status MPEG2Decoder::DecodeHeaders(const RawUnit & data) { UMC::Status sts = UMC::UMC_OK; switch(data.type) { case SEQUENCE_HEADER: sts = DecodeSeqHeader(data); break; case PICTURE_HEADER: sts = DecodePicHeader(data); break; case EXTENSION: sts = DecodeExtension(data); break; case GROUP: sts = DecodeGroupHeader(data); break; default: break; } return sts; } MPEG2DecoderFrame* MPEG2Decoder::GetFrameBuffer(MPEG2Slice * /*slice*/) { CompleteDecodedFrames(); auto frame = GetFreeFrame(); if (!frame) return nullptr; frame->Reset(); frame->IncrementReference(); frame->decOrder = frame->displayOrder = m_counter++; UMC::VideoDataInfo info {}; auto sts = info.Init(m_params.info.clip_info.width, m_params.info.clip_info.height, m_params.info.color_format, 0); if (sts != UMC::UMC_OK) throw mpeg2_exception(sts); UMC::FrameMemID id; sts = m_allocator->Alloc(&id, &info, 0); if (sts != UMC::UMC_OK) throw mpeg2_exception(UMC::UMC_ERR_ALLOC); AllocateFrameData(info, id, *frame); if (frame->m_index < 0) { return NULL; } return frame; } // Initialize just allocated frame with parameters void InitFreeFrame(MPEG2DecoderFrame& frame, const MPEG2SequenceHeader& seq, const MPEG2SequenceExtension& seqExt, const MPEG2PictureHeader& pic, const MPEG2PictureCodingExtension& picExt, const UMC::sVideoStreamInfo& info) { frame.frameType = (FrameType)pic.picture_coding_type; frame.isProgressiveSequence = seqExt.progressive_sequence; frame.isProgressiveFrame = picExt.progressive_frame; if (picExt.picture_structure != FRM_PICTURE) { frame.bottom_field_flag[0] = (picExt.picture_structure == BOTTOM_FLD_PICTURE); frame.bottom_field_flag[1] = !(frame.bottom_field_flag[0]); frame.pictureStructure = FLD_PICTURE; } else { frame.bottom_field_flag[0] = 0; frame.bottom_field_flag[1] = 1; frame.pictureStructure = FRM_PICTURE; } frame.horizontalSize = seq.horizontal_size_value; frame.verticalSize = seq.vertical_size_value; frame.aspectWidth = info.aspect_ratio_width; frame.aspectHeight = info.aspect_ratio_height; // Display picture structure is retrieved according to 6.3.10 { if (seqExt.progressive_sequence == 0) { if (picExt.picture_structure != FRM_PICTURE) { frame.displayPictureStruct = (picExt.picture_structure == TOP_FLD_PICTURE) ? DPS_TOP : DPS_BOTTOM; } else { if (picExt.repeat_first_field == 0) { frame.displayPictureStruct = picExt.top_field_first ? DPS_TOP_BOTTOM : DPS_BOTTOM_TOP; } else { frame.displayPictureStruct = picExt.top_field_first ? DPS_TOP_BOTTOM_TOP : DPS_BOTTOM_TOP_BOTTOM; } } } else { if (picExt.repeat_first_field == 0) { frame.displayPictureStruct = DPS_FRAME; } else // repeat_first_field == 1 { if (picExt.top_field_first == 0) { frame.displayPictureStruct = DPS_FRAME_DOUBLING; } else { frame.displayPictureStruct = DPS_FRAME_TRIPLING; } } } } frame.currFieldIndex = frame.GetNumberByParity(picExt.picture_structure == BOTTOM_FLD_PICTURE); } MPEG2DecoderFrame* MPEG2Decoder::StartFrame(MPEG2Slice * slice) { auto frame = GetFrameBuffer(slice); if (!frame) return nullptr; const auto seq = slice->GetSeqHeader(); const auto seqExt = slice->GetSeqExtHeader(); const auto pic = slice->GetPicHeader(); const auto picExt = slice->GetPicExtHeader(); InitFreeFrame(*frame, seq, seqExt, pic, picExt, m_params.info); frame->group = m_currHeaders.group; if (m_messages) m_messages->SetAUID(frame->currFieldIndex); // 6.1.1.11 - Reordering: // - If a current frame is a B-frame, then output it immediately. // - if a current frame is a I-frame or P-frame, then output previous (in decoded order) I-frame or P-frame. if (frame->frameType == MPEG2_B_PICTURE) { frame->SetReadyToBeOutputted(); std::unique_lock l(m_guard); auto last = FindLastRefFrame(*frame, m_dpb); if (last) { // Here we're building display order in case of reordered frames: frame->displayOrder = last->displayOrder; // 1. Output B frames sooner than their decoded order last->displayOrder = frame->decOrder; // 2. Delay displaying I/P frames accordingly } } else { std::unique_lock l(m_guard); auto last = FindLastRefFrame(*frame, m_dpb); if (last) last->SetReadyToBeOutputted(); } if (m_messages) { m_messages->SetFrame(frame, frame->currFieldIndex); } return frame; } bool MPEG2Decoder::IsFieldOfCurrentFrame() const { const auto firstFrameSlice = m_currFrame->GetAU((uint8_t)m_currFrame->fieldIndex)->GetSlice(0); const auto picHdr = firstFrameSlice->GetPicHeader(); const auto picExtHdr = firstFrameSlice->GetPicExtHeader(); const auto newPicHdr = *m_currHeaders.picHdr.get(); const auto newPicExtHdr = *m_currHeaders.picExtHdr.get(); // this is a workaround (and actually not by spec) to handle invalid streams where an II or IP pair has different temporal_reference if (m_currFrame->frameType != MPEG2_I_PICTURE || m_currFrame->currFieldIndex != 0) { if (picHdr.temporal_reference != newPicHdr.temporal_reference) // 6.3.9 return false; } if (picExtHdr.picture_structure == newPicExtHdr.picture_structure) // the same type fields return false; return true; } bool MPEG2Decoder::OnNewPicture() { // Progressive picture if (FRM_PICTURE == m_currFrame->pictureStructure) { m_currFrame->SetFullFrame(true); CompletePicture(*m_currFrame, m_currFrame->currFieldIndex); m_currFrame = nullptr; return true; // Full frame } const auto newPicExtHdr = *m_currHeaders.picExtHdr.get(); if (IsFieldOfCurrentFrame()) { CompletePicture(*m_currFrame, m_currFrame->currFieldIndex); // complete the first field of the current frame m_currFrame->currFieldIndex = m_currFrame->GetNumberByParity(newPicExtHdr.picture_structure == BOTTOM_FLD_PICTURE); if (m_messages) m_messages->SetAUID(m_currFrame->currFieldIndex); } else { m_currFrame->SetFullFrame(true); CompletePicture(*m_currFrame, m_currFrame->currFieldIndex); // complete current field of interlace frame m_currFrame = nullptr; return true; } return false; } void MPEG2Decoder::EliminateSliceErrors(MPEG2DecoderFrame& frame, uint8_t fieldIndex) { MPEG2DecoderFrameInfo & frameInfo = *frame.GetAU(fieldIndex); size_t sliceCount = frameInfo.GetSliceCount(); for (size_t sliceNum = 0; sliceNum < sliceCount; sliceNum++) { auto slice = frameInfo.GetSlice(sliceNum); auto sliceHeader = slice->GetSliceHeader(); // Slice may cover just a part of a row (not full row), this is indicated by macroblockAddressIncrement // Looping over slices, we heed to check if next slice has macroblockAddressIncrement > 0, // this means that we need to recalculate numberMBsInSlice for previous slice if (sliceNum > 0 && sliceHeader.macroblockAddressIncrement > 0) { auto prevSlice = frameInfo.GetSlice(sliceNum - 1); //take previous auto& prevSliceHeader = prevSlice->GetSliceHeader(); // Check if this parts are located at the same row if (sliceHeader.slice_vertical_position == prevSliceHeader.slice_vertical_position) prevSliceHeader.numberMBsInSlice = sliceHeader.macroblockAddressIncrement - prevSliceHeader.macroblockAddressIncrement; } } return; } UMC::Status MPEG2Decoder::CompletePicture(MPEG2DecoderFrame& frame, uint8_t fieldIndex) { frame.StartDecoding(); MPEG2DecoderFrameInfo & frameInfo = *frame.GetAU(fieldIndex); frameInfo.SetFilled(); UpdateDPB(frame, fieldIndex); // skipping algorithm const MPEG2DecoderFrameInfo & info = *frame.GetAU(fieldIndex); if (((info.IsField() && fieldIndex) || !info.IsField()) && IsShouldSkipFrame(frame)) { frame.SetIsRef(false); frame.SetSkipped(true); frame.OnDecodingCompleted(); return UMC::UMC_OK; } size_t sliceCount = frameInfo.GetSliceCount(); if (sliceCount) { EliminateSliceErrors(frame, fieldIndex); Submit(frame, fieldIndex); } else { if (((info.IsField() && fieldIndex) || !info.IsField())) frame.OnDecodingCompleted(); } return UMC::UMC_OK; } void MPEG2Decoder::UpdateDPB(MPEG2DecoderFrame& frame, uint8_t fieldIndex) { if (frame.frameType == MPEG2_B_PICTURE || fieldIndex) // Update DPB on reference pictures, the first field for field pictures return; auto numRefFrames = std::count_if(m_dpb.begin(), m_dpb.end(), [&frame](MPEG2DecoderFrame const * f) { return (&frame != f) && f->IsRef(); } ); if (NUM_REF_FRAMES == numRefFrames) { auto oldest = std::min_element(std::begin(m_dpb), std::end(m_dpb), [](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { uint32_t const id1 = f1->IsRef() ? f1->decOrder : (std::numeric_limits::max)(); uint32_t const id2 = f2->IsRef() ? f2->decOrder : (std::numeric_limits::max)(); return id1 < id2; } ); if(oldest != std::end(m_dpb)) (*oldest)->SetIsRef(false); // Release the oldest reference frame ... } frame.SetIsRef(true); // ... and increase a ref counter for a current frame } void MPEG2Decoder::SetDPBSize(uint32_t size) { m_dpbSize = size; } void MPEG2Decoder::CompleteDecodedFrames() { std::unique_lock l(m_guard); std::for_each(m_dpb.begin(), m_dpb.end(), [](MPEG2DecoderFrame* frame) { if (frame->IsOutputted() && frame->IsDisplayed() && !frame->IsDecoded()) frame->OnDecodingCompleted(); } ); } MPEG2DecoderFrame* MPEG2Decoder::GetFreeFrame() { std::unique_lock l(m_guard); MPEG2DecoderFrame* frame = (m_dpb.size() >= m_dpbSize) ? FindFreeFrame(m_dpb) : nullptr; // If nothing found if (!frame) { // Can not allocate more if (m_dpb.size() >= m_dpbSize) { return nullptr; } // Didn't find any. Let's create a new one frame = new MPEG2DecoderFrame; // Add to DPB m_dpb.push_back(frame); } return frame; } // Find a next frame ready to be output from decoder MPEG2DecoderFrame* MPEG2Decoder::GetFrameToDisplay() { std::unique_lock l(m_guard); DPBType displayable = m_dpb; displayable.remove_if( [](MPEG2DecoderFrame const * f) { return !f->IsReadyToBeOutputted() || !f->IsFullFrame() || !f->DecodingStarted() || f->IsOutputted() || f->IsDisplayed(); } ); // Oldest frame auto i = std::min_element(std::begin(displayable), std::end(displayable), [](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { return f1->displayOrder < f2->displayOrder; } ); return (i == std::end(displayable)) ? nullptr : *i; } void MPEG2Decoder::PostProcessDisplayFrame(MPEG2DecoderFrame *frame) { if (!frame || frame->isPostProccesComplete) return; frame->isOriginalPTS = frame->dFrameTime > -1.0; if (frame->isOriginalPTS) { m_localFrameTime = frame->dFrameTime; } else { frame->dFrameTime = m_localFrameTime; } switch (frame->displayPictureStruct) { case DPS_TOP_BOTTOM_TOP: case DPS_BOTTOM_TOP_BOTTOM: if (m_params.lFlags & UMC::FLAG_VDEC_TELECINE_PTS) { m_localFrameTime += (m_localDeltaFrameTime / 2); } break; case DPS_FRAME_DOUBLING: if (m_params.lFlags & UMC::FLAG_VDEC_TELECINE_PTS) { m_localFrameTime += m_localDeltaFrameTime; } break; case DPS_FRAME_TRIPLING: if (m_params.lFlags & UMC::FLAG_VDEC_TELECINE_PTS) { m_localFrameTime += (m_localDeltaFrameTime * 2); } break; default: break; } m_localFrameTime += m_localDeltaFrameTime; frame->isPostProccesComplete = true; } template MPEG2DecoderFrame* FindFrame(F pred, const DPBType & dpb) { auto i = std::find_if(std::begin(dpb), std::end(dpb), pred); return i != std::end(dpb) ? (*i) : nullptr; } MPEG2DecoderFrame* MPEG2Decoder::FindFrameByMemID(UMC::FrameMemID id) { std::unique_lock l(m_guard); return FindFrame( [id](MPEG2DecoderFrame const* f) { return f->GetMemID() == id; }, m_dpb ); } uint8_t MPEG2Decoder::GetNumCachedFrames() const { return (uint8_t)std::count_if(m_dpb.begin(), m_dpb.end(), [](MPEG2DecoderFrame const * f) { return (f->DecodingStarted() && !f->IsOutputted()); } ); } /****************************************************************************************************/ // Payload_Storage /****************************************************************************************************/ Payload_Storage::Payload_Storage() { m_offset = 0; Reset(); } Payload_Storage::~Payload_Storage() { Close(); } void Payload_Storage::Init() { Close(); m_data.resize(MAX_BUFFERED_SIZE); m_payloads.resize(START_ELEMENTS); m_offset = 0; m_lastUsed = 2; } void Payload_Storage::Close() { Reset(); m_data.clear(); m_payloads.clear(); } void Payload_Storage::Reset() { m_lastUsed = 2; std::for_each(m_payloads.begin(), m_payloads.end(), [](Message& m) { m.isUsed = 0; } ); } void Payload_Storage::SetFrame(MPEG2DecoderFrame * frame, int32_t auIndex) { for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == 0 && m_payloads[i].isUsed && m_payloads[i].auID == auIndex) { m_payloads[i].frame = frame; } } } void Payload_Storage::SetAUID(int32_t auIndex) { for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].isUsed && m_payloads[i].auID == -1) { m_payloads[i].auID = auIndex; } } } void Payload_Storage::SetTimestamp(MPEG2DecoderFrame * frame) { double ts = frame->dFrameTime; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].frame == frame) { m_payloads[i].timestamp = ts; if (m_payloads[i].isUsed) m_payloads[i].isUsed = m_lastUsed; } } m_lastUsed++; } const Payload_Storage::Message * Payload_Storage::GetPayloadMessage() { Payload_Storage::Message * msg = nullptr; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (m_payloads[i].isUsed > 1) { if (!msg || msg->isUsed > m_payloads[i].isUsed || msg->inputID > m_payloads[i].inputID) { msg = &m_payloads[i]; } } } if (msg) { msg->isUsed = 0; msg->frame = nullptr; msg->auID = 0; msg->inputID = 0; } return msg; } Payload_Storage::Message* Payload_Storage::AddMessage(const RawUnit & data, int32_t auIndex) { size_t sz = data.end - data.begin; if (sz > (m_data.size() >> 2)) return nullptr; if (m_offset + sz > m_data.size()) { m_offset = 0; } // clear overwriting messages: for (uint32_t i = 0; i < m_payloads.size(); i++) { if (!m_payloads[i].isUsed) continue; Message & mmsg = m_payloads[i]; if ((m_offset + sz > mmsg.offset) && (m_offset < mmsg.offset + mmsg.msg_size)) { m_payloads[i].isUsed = 0; return nullptr; } } size_t freeSlot = 0; for (uint32_t i = 0; i < m_payloads.size(); i++) { if (!m_payloads[i].isUsed) { freeSlot = i; break; } } if (m_payloads[freeSlot].isUsed) { if (m_payloads.size() >= MAX_ELEMENTS) return nullptr; m_payloads.emplace_back(Message()); freeSlot = m_payloads.size() - 1; } m_payloads[freeSlot].msg_size = sz; m_payloads[freeSlot].offset = m_offset; m_payloads[freeSlot].timestamp = 0; m_payloads[freeSlot].frame = nullptr; m_payloads[freeSlot].isUsed = 1; m_payloads[freeSlot].inputID = m_lastUsed++; m_payloads[freeSlot].data = m_data.data() + m_offset; m_payloads[freeSlot].auID = auIndex; std::copy(data.begin, data.end, m_data.data() + m_offset); m_offset += sz; return &m_payloads[freeSlot]; } /****************************************************************************************************/ // Skipping_MPEG2 class routine /****************************************************************************************************/ void Skipping_MPEG2::Reset() { m_SkipLevel = SKIP_NONE; m_NumberOfSkippedFrames = 0; } // Check if frame should be skipped to decrease decoding delays bool Skipping_MPEG2::IsShouldSkipFrame(const MPEG2DecoderFrame & frame) { bool isShouldSkip = false; switch (m_SkipLevel) { case SKIP_ALL: isShouldSkip = true; break; case SKIP_B: isShouldSkip = (frame.frameType == MPEG2_B_PICTURE); break; case SKIP_PB: isShouldSkip = (frame.frameType != MPEG2_I_PICTURE); break; default: // SKIP_NONE break; } m_NumberOfSkippedFrames += isShouldSkip; return isShouldSkip; } // Set decoding skip frame mode void Skipping_MPEG2::ChangeVideoDecodingSpeed(int32_t & val) { m_SkipLevel += val; if (m_SkipLevel < SKIP_NONE) m_SkipLevel = SKIP_NONE; if (m_SkipLevel > SKIP_ALL) m_SkipLevel = SKIP_ALL; val = m_SkipLevel; } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_decoder_va.cpp000066400000000000000000000113631443134507600332210ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) #include #include "umc_va_base.h" #include "umc_mpeg2_decoder_va.h" #include "umc_mpeg2_va_packer.h" namespace UMC_MPEG2_DECODER { enum { NUMBER_OF_STATUS = 512, }; MPEG2DecoderVA::MPEG2DecoderVA() : m_va(nullptr) {} UMC::Status MPEG2DecoderVA::SetParams(UMC::BaseCodecParams* info) { auto dp = dynamic_cast(info); MFX_CHECK(dp, UMC::UMC_ERR_INVALID_PARAMS); MFX_CHECK(dp->pVideoAccelerator, UMC::UMC_ERR_NULL_PTR); m_va = dp->pVideoAccelerator; m_packer.reset(Packer::CreatePacker(m_va)); SetDPBSize(m_params.async_depth + NUM_REF_FRAMES); return UMC::UMC_OK; } // Pass picture to driver UMC::Status MPEG2DecoderVA::Submit(MPEG2DecoderFrame& frame, uint8_t fieldIndex) { UMC::Status sts = 0; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "MPEG2 decode DDISubmitTask"); TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_SUBMIT_TASK, EVENT_TYPE_INFO, 0, make_event_data(this)); sts = m_va->BeginFrame(frame.GetMemID()); MFX_CHECK(UMC::UMC_OK == sts, sts); m_packer->PackAU(frame, fieldIndex); sts = m_va->EndFrame(); return sts; } // Is decoding still in process inline bool InProgress(MPEG2DecoderFrame const& frame) { return frame.DecodingStarted() && !frame.DecodingCompleted(); } // Allocate frame internals void MPEG2DecoderVA::AllocateFrameData(UMC::VideoDataInfo const& info, UMC::FrameMemID id, MPEG2DecoderFrame& frame) { UMC::FrameData fd; fd.Init(&info, id, m_allocator); frame.Allocate(&fd); auto fd2 = frame.GetFrameData(); fd2->m_locked = true; frame.m_index = GetFreeIndex(id); } int32_t MPEG2DecoderVA::GetFreeIndex (UMC::FrameMemID id) const { int32_t index = id; return index; } // Check for frame completeness and get decoding errors bool MPEG2DecoderVA::QueryFrames(MPEG2DecoderFrame& frame) { DPBType decode_queue; { std::unique_lock l(m_guard); // form frame queue in decoded order std::for_each(m_dpb.begin(), m_dpb.end(), [&decode_queue, &frame](MPEG2DecoderFrame * f) { if (InProgress(*f) && f->decOrder <= frame.decOrder) // skip frames beyong the current frame (in dec order) decode_queue.push_back(f); } ); } decode_queue.sort([](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { return f1->decOrder < f2->decOrder; }); // iterate through frames submitted to the driver in decoded order for (MPEG2DecoderFrame* frm : decode_queue) { uint16_t surfCorruption = 0; auto sts = m_packer->SyncTask(frm, &surfCorruption); frm->CompleteDecoding(); // complete frame even if there are errors if (sts < UMC::UMC_OK) { if (sts != UMC::UMC_ERR_GPU_HANG) sts = UMC::UMC_ERR_DEVICE_FAILED; frm->SetError(sts); } else { switch (surfCorruption) { case MFX_CORRUPTION_MAJOR: frm->AddError(UMC::ERROR_FRAME_MAJOR); break; case MFX_CORRUPTION_MINOR: frm->AddError(UMC::ERROR_FRAME_MINOR); break; } } } return true; } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_frame.cpp000066400000000000000000000226441443134507600322240ustar00rootroot00000000000000// Copyright (c) 2018-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_defs.h" #include "umc_mpeg2_slice.h" #include "umc_mpeg2_frame.h" #include namespace UMC_MPEG2_DECODER { MPEG2DecoderFrameInfo::MPEG2DecoderFrameInfo(MPEG2DecoderFrame& Frame) : frame(Frame) , isField(false) , isBottomField(false) , frameType((FrameType)0) , isFilled(false) { } MPEG2DecoderFrameInfo::~MPEG2DecoderFrameInfo() { std::for_each(slices.begin(), slices.end(), std::default_delete() ); } void MPEG2DecoderFrameInfo::Reset() { isField = false; isBottomField = false; frameType = (FrameType)0; isFilled = false; std::for_each(slices.begin(), slices.end(), std::default_delete() ); slices.resize(0); FreeReferenceFrames(); } void MPEG2DecoderFrameInfo::AddSlice(MPEG2Slice* slice) { if (0 == slices.size()) // on the first slice { const auto pic = slice->GetPicHeader(); const auto picExt = slice->GetPicExtHeader(); isField = picExt.picture_structure != FRM_PICTURE; isBottomField = (picExt.picture_structure == BOTTOM_FLD_PICTURE); frameType = (FrameType)pic.picture_coding_type; } slices.push_back(slice); } // Set forward and backward reference frames void MPEG2DecoderFrameInfo::UpdateReferences(const DPBType & dpb) { const auto pic = GetSlice(0)->GetPicHeader(); const auto picExt = GetSlice(0)->GetPicExtHeader(); if (MPEG2_I_PICTURE == pic.picture_coding_type) return; // 7.6.3.5 Prediction in P-pictures for IP pair if (FRM_PICTURE != frame.pictureStructure) { uint8_t currFieldIndex = frame.GetNumberByParity(picExt.picture_structure == BOTTOM_FLD_PICTURE); if ((1 == currFieldIndex) && (MPEG2_P_PICTURE == pic.picture_coding_type) && // current picture is P and the 2nd field (MPEG2_I_PICTURE == frame.GetAU(0)->GetSlice(0)->GetPicHeader().picture_coding_type) ) // the first field is I { references.forward = &frame; references.forward->IncrementReference(); return; } } // 7.6.1 Frame/Field prediction DPBType refFrames; std::copy_if(dpb.begin(), dpb.end(), back_inserter(refFrames), [this](MPEG2DecoderFrame const * f) { return (f != &frame) && f->IsRef(); } ); // Find latest ref frame auto iter = std::max_element(std::begin(refFrames), std::end(refFrames), [](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { return f1->decOrder < f2->decOrder; } ); // If no reference frame is found, use 'self' reference. // This is to handle cases without leading I picture auto ref = (iter == std::end(refFrames)) ? &frame : *iter; if (MPEG2_P_PICTURE == pic.picture_coding_type) { references.forward = ref; references.forward->IncrementReference(); } else // MPEG2_B_PICTURE { references.backward = ref; references.backward->IncrementReference(); refFrames.remove(ref); // Find another latest ref frame iter = std::max_element(std::begin(refFrames), std::end(refFrames), [](MPEG2DecoderFrame const* f1, MPEG2DecoderFrame const* f2) { return f1->decOrder < f2->decOrder; } ); // if there is no 'forward' reference then use 'backward' again ref = (iter == std::end(refFrames)) ? references.backward : *iter; references.forward = ref; references.forward->IncrementReference(); } } // Clear all references to other frames void MPEG2DecoderFrameInfo::FreeReferenceFrames() { if (references.forward) references.forward->DecrementReference(); if (references.backward) references.backward->DecrementReference(); references.forward = nullptr; references.backward = nullptr; } bool MPEG2DecoderFrameInfo::CheckReferenceFrameError() { uint32_t checkedErrorMask = UMC::ERROR_FRAME_MINOR | UMC::ERROR_FRAME_MAJOR | UMC::ERROR_FRAME_REFERENCE_FRAME; if (references.forward && references.forward->GetError() & checkedErrorMask) return true; if (references.backward && references.backward->GetError() & checkedErrorMask) return true; return false; } MPEG2DecoderFrame::MPEG2DecoderFrame() : decOrder(0xffffffff) , displayOrder(0xffffffff) , frameType((FrameType)0) , currFieldIndex(-1) , pictureStructure(FRM_PICTURE) , displayPictureStruct(DPS_UNKNOWN) , isProgressiveSequence(false) , isProgressiveFrame(false) , dFrameTime(-1.0) , isOriginalPTS(false) , isPostProccesComplete(false) , horizontalSize(0) , verticalSize(0) , aspectWidth(0) , aspectHeight(0) , data(new UMC::FrameData{}) , locked(0) , decodingStarted(false) , decodingCompleted(false) , reordered(false) , outputted(false) , displayed(false) , decoded(false) , isFull(false) , isRef(false) , isSkipped(false) , error(0) , slicesInfo(*this) , slicesInfoBottom(*this) { Reset(); } MPEG2DecoderFrame::~MPEG2DecoderFrame() { auto fd = GetFrameData(); fd->m_locked = false; } void MPEG2DecoderFrame::Reset() { slicesInfo.Reset(); slicesInfoBottom.Reset(); error = 0; displayed = false; outputted = false; decoded = false; decodingStarted = false; decodingCompleted = false; reordered = false; data->Close(); ResetRefCounter(); FreeReferenceFrames(); decOrder = 0xffffffff; displayOrder = 0xffffffff; frameType = (FrameType)0; isFull = false; isRef = false; isSkipped = false; bottom_field_flag[0] = bottom_field_flag[1] = -1; pictureStructure = FRM_PICTURE; displayPictureStruct = DPS_UNKNOWN; currFieldIndex = -1; isProgressiveSequence = false; isProgressiveFrame = false; dFrameTime = -1.0; isOriginalPTS = false; isPostProccesComplete = false; horizontalSize = 0; verticalSize = 0; aspectWidth = 0; aspectHeight = 0; group.reset(); } void MPEG2DecoderFrame::Allocate(UMC::FrameData const* fd) { if (!fd) throw mpeg2_exception(UMC::UMC_ERR_NULL_PTR); *data = *fd; } // Clean up data after decoding is done void MPEG2DecoderFrame::FreeResources() { FreeReferenceFrames(); if (IsDecoded()) { slicesInfo.Reset(); slicesInfoBottom.Reset(); } } // Clear all references to other frames void MPEG2DecoderFrame::FreeReferenceFrames() { slicesInfo.FreeReferenceFrames(); slicesInfoBottom.FreeReferenceFrames(); } // Flag frame as decoded and set flags after decoding is done void MPEG2DecoderFrame::CompleteDecoding() { UpdateErrorWithRefFrameStatus(); decodingCompleted = true; } // Delete unneeded references and set flags after decoding is done void MPEG2DecoderFrame::OnDecodingCompleted() { UpdateErrorWithRefFrameStatus(); decoded = true; FreeResources(); DecrementReference(); } // Check reference frames for error status and flag current frame if error is found void MPEG2DecoderFrame::UpdateErrorWithRefFrameStatus() { if (slicesInfo.CheckReferenceFrameError() || slicesInfoBottom.CheckReferenceFrameError()) { AddError(UMC::ERROR_FRAME_REFERENCE_FRAME); } } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_slice.cpp000066400000000000000000000036101443134507600322210ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_mpeg2_defs.h" #include "umc_mpeg2_slice.h" namespace UMC_MPEG2_DECODER { // Decode slice header and initialize slice structure with parsed values bool MPEG2Slice::Reset() { m_bitStream.Reset((uint8_t *) source.GetDataPointer(), (uint32_t) source.GetDataSize()); return DecodeSliceHeader(); } // Decoder slice header bool MPEG2Slice::DecodeSliceHeader() { UMC::Status umcRes = UMC::UMC_OK; try { umcRes = m_bitStream.GetSliceHeaderFull(*this, *m_seqHdr.get(), *m_seqExtHdr.get()); } catch(...) { return false; } return (UMC::UMC_OK == umcRes); } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_splitter.cpp000066400000000000000000000217371443134507600330020ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "umc_media_data.h" #include "umc_mpeg2_splitter.h" namespace UMC_MPEG2_DECODER { void RawHeaderIterator::LoadData(UMC::MediaData* source) { m_source = source; m_nalu = RawUnit(); // reset if (!m_source) { m_nalu = OnEOS(); return; } m_nalu = FindUnit(m_source); if ( (-1 == m_nalu.type) && // didn't find complete unit m_cache.size() && // but have beginning of the unit !((m_source->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME)) ) // and complete frame flag is set { m_nalu = OnEOS(); } } RawHeaderIterator & RawHeaderIterator::operator++() { LoadData(m_source); // pass m_source as an argument to re-use LoadData() code in operator++ return *this; } RawUnit RawHeaderIterator::FindUnit(UMC::MediaData* in) { uint8_t* begin = (uint8_t*) in->GetDataPointer(); uint8_t* end = begin + in->GetDataSize(); uint32_t readSize = 0; RawUnit unit; if (m_needCleanCache) { m_cache.clear(); m_needCleanCache = false; m_pts = -1; } // We have a cached (an uncompleted) unit and got new piece of bitstream data if (m_cache.size()) { uint8_t* unitStart = FindStartCode(begin, end); // Check if new data have any start codes if (unitStart) // Start code was found. Need to close the cached unit { readSize = (uint32_t)(unitStart - begin); // Data before found startcode is the end of the cached unit m_cache.insert(m_cache.end(), (uint8_t *)begin, (uint8_t *)begin + readSize); // Load this data to the cached unit unit = { m_cache.data(), m_cache.data() + m_cache.size(), m_cache[prefix_size], m_pts } ; // Construct unit from cached data m_needCleanCache = true; // Need to clean up the cache on next search iteration } else // start code wasn't found { // Load the data excepte last 1 or 2 bytes if they have zero values (Considering [... 0x0 0x0] [0x1 ...]) to the cache uint32_t numZerosAtEnd = (0 == end[-1]) ? 1 + (0 == end[-2]) : 0; readSize = (uint32_t)(end - begin - numZerosAtEnd); m_cache.insert(m_cache.end(), (uint8_t *)begin, (uint8_t *)(end - numZerosAtEnd)); } in->MoveDataPointer(readSize); return unit; } RawUnit tmpUnit = FindRawUnit(begin, end); if (-1 == tmpUnit.type || (!tmpUnit.begin && !tmpUnit.end)) // Nothing found { // Considering [0x0 0x0 0x1] [0x0 ...] // if no enough data to parse, leave data to next slice if(begin >= end - prefix_size) { readSize = 0; } else { readSize = (uint32_t)(end - begin); // Skip all data } } else if (tmpUnit.begin && !tmpUnit.end) // Found only where unit starts { // Consume all data from buffer except last 1 or 2 bytes if they have zero values (considering [... 0x0 0x0] [0x1 ...] sequence). // These two bytes are to prevent start code chopping between two separate FindRawUnit() calls. // An exception from this is 'MFX_BITSTREAM_COMPLETE_FRAME' case. uint32_t numZerosAtEnd = (0 == end[-1]) ? 1 + (0 == end[-2]) : 0; uint32_t numBytesToLeave = !(m_source->GetFlags() & UMC::MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) ? 0 : numZerosAtEnd; readSize = (uint32_t)(end - begin - numBytesToLeave); m_cache.insert(m_cache.end(), tmpUnit.begin, end - numBytesToLeave); // But save to the cache only since start code m_pts = in->GetTime(); } else // found begin and end { readSize = (uint32_t)(tmpUnit.end - begin); // Up to the end of the unit unit = tmpUnit; unit.pts = in->GetTime(); } in->MoveDataPointer(readSize); return unit; } RawUnit RawHeaderIterator::OnEOS() { RawUnit nalu; if (m_needCleanCache) { m_cache.clear(); m_needCleanCache = false; m_pts = -1; } if (m_cache.size()) { nalu = { m_cache.data(), m_cache.data() + m_cache.size(), m_cache[prefix_size], m_pts } ; // Construct unit from cached data m_needCleanCache = true; // Need to clean up the cache on next iteration } return nalu; } // Find start code uint8_t * RawHeaderIterator::FindStartCode(uint8_t * begin, uint8_t * end) { for (; begin <= end - prefix_size; ++begin) { if (begin[0] == 0 && begin[1] == 0 && begin[2] == 1) { return begin; } } return nullptr; } // Find unit start, end and type RawUnit RawHeaderIterator::FindRawUnit(uint8_t * begin, uint8_t * end) { begin = FindStartCode(begin, end - 1); // Find beginning of unit. "- 1" is to obtain type of unit if (nullptr == begin) return RawUnit(); uint8_t type = begin[prefix_size]; uint8_t * next = FindStartCode(begin + prefix_size + 1, end); // Find beginning of another unit return RawUnit(begin, next, type, -1); // "next" can be either nullptr or actuall address } // Main API call RawUnit Splitter::GetUnits(UMC::MediaData* source) { if (m_cleanUpBuffer) { m_buff.clear(); m_cleanUpBuffer = false; } m_it.LoadData(source); // Find new unit // The loop is to handle invalid cases like: seq header, seq header, seq extension. If so, a header without a paired extension header will be skipped. while (true) { bool isHandlePairedHeaders = false; if (m_buff.size() && (m_it != RawHeaderIterator())) { isHandlePairedHeaders = true; } else if (SEQUENCE_HEADER == m_it->type || PICTURE_HEADER == m_it->type) { m_typeExtToFind = (uint8_t)((SEQUENCE_HEADER == m_it->type) ? SEQUENCE_EXTENSION : PICTURE_CODING_EXTENSION); m_buff.clear(); m_buff.insert(m_buff.end(), (uint8_t *)m_it->begin, (uint8_t *)m_it->end); // Put to cache ++m_it; // Look for another unit if (m_it != RawHeaderIterator()) isHandlePairedHeaders = true; } if (isHandlePairedHeaders) { size_t size = m_it->end - m_it->begin; auto type_ext = (MPEG2_UNIT_TYPE_EXT) ((m_it->type == EXTENSION && size >= 5) ? // ">= 5" is due to we need a header extension type which is in the 4th byte (m_it->begin[prefix_size + 1] >> 4) : // begin[prefix_size + 1] >> 4 extracts header extension type 0 ); if (m_typeExtToFind == type_ext) { m_buff.insert(m_buff.end(), (uint8_t *)m_it->begin, (uint8_t *)m_it->end); m_cleanUpBuffer = true; m_typeExtToFind = 0; return { m_buff.data(), m_buff.data() + m_buff.size(), m_buff[prefix_size], -1 }; } else { m_buff.clear(); // drop sequence/picture header without corresponding sequence/picture extension header m_cleanUpBuffer = 0; continue; } } break; } return *m_it; } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_utils.cpp000066400000000000000000000376301443134507600322730ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined MFX_ENABLE_MPEG2_VIDEO_DECODE #include "mfxstructures.h" #include "umc_video_decoder.h" #include "mfx_common_int.h" #include "umc_mpeg2_utils.h" #define CHECK_UNSUPPORTED(EXPR) if (EXPR) return MFX_ERR_UNSUPPORTED; namespace UMC_MPEG2_DECODER { // Check HW capabilities bool IsNeedPartialAcceleration_MPEG2(mfxVideoParam* par) { return (par->mfx.CodecProfile == MFX_PROFILE_MPEG1) ? true : false; } // Returns implementation platform eMFXPlatform GetPlatform_MPEG2(VideoCORE * core, mfxVideoParam * par) { if (!par) return MFX_PLATFORM_SOFTWARE; eMFXPlatform platform = core->GetPlatformType(); if (IsNeedPartialAcceleration_MPEG2(par) && platform != MFX_PLATFORM_SOFTWARE) { return MFX_PLATFORM_SOFTWARE; } if (platform != MFX_PLATFORM_SOFTWARE) { if (MFX_ERR_NONE != core->IsGuidSupported(sDXVA2_ModeMPEG2_VLD, par)) { platform = MFX_PLATFORM_SOFTWARE; } } return platform; } bool IsHWSupported(VideoCORE *core, mfxVideoParam *par) { if ((par->mfx.CodecProfile == MFX_PROFILE_MPEG1 && core->GetPlatformType()== MFX_PLATFORM_HARDWARE)) return false; if (MFX_ERR_NONE != core->IsGuidSupported(sDXVA2_ModeMPEG2_VLD, par)) return false; return true; } mfxStatus CheckFrameInfo(mfxFrameInfo & in, mfxFrameInfo & out) { mfxStatus sts = MFX_ERR_NONE; if (!((in.Width % 16 == 0) && (in.Width <= 4096))) { out.Width = 0; sts = MFX_ERR_UNSUPPORTED; } if (!((in.Height % 16 == 0) && (in.Height <= 4096))) { out.Height = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(in.CropX <= out.Width)) { out.CropX = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(in.CropY <= out.Height)) { out.CropY = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(out.CropX + in.CropW <= out.Width)) { out.CropW = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(out.CropY + in.CropH <= out.Height)) { out.CropH = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(in.PicStruct == MFX_PICSTRUCT_PROGRESSIVE || in.PicStruct == MFX_PICSTRUCT_FIELD_TFF || in.PicStruct == MFX_PICSTRUCT_FIELD_BFF || in.PicStruct == MFX_PICSTRUCT_UNKNOWN)) { out.PicStruct = 0; sts = MFX_ERR_UNSUPPORTED; } if (!(in.ChromaFormat == MFX_CHROMAFORMAT_YUV420 || in.ChromaFormat == 0)) { out.ChromaFormat = 0; sts = MFX_ERR_UNSUPPORTED; } return sts; } // MediaSDK API Query function mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out) { MFX_CHECK_NULL_PTR1(out); mfxStatus res = MFX_ERR_NONE; eMFXHWType type = core->GetHWType(); if (!in) { // configurability mode memset(out, 0, sizeof(*out)); out->mfx.CodecId = MFX_CODEC_MPEG2; out->mfx.FrameInfo.FourCC = 1; out->mfx.FrameInfo.Width = 1; out->mfx.FrameInfo.Height = 1; out->mfx.FrameInfo.CropX = 1; out->mfx.FrameInfo.CropY = 1; out->mfx.FrameInfo.CropW = 1; out->mfx.FrameInfo.CropH = 1; out->mfx.FrameInfo.AspectRatioH = 1; out->mfx.FrameInfo.AspectRatioW = 1; out->mfx.FrameInfo.FrameRateExtN = 1; out->mfx.FrameInfo.FrameRateExtD = 1; out->mfx.FrameInfo.PicStruct = 1; out->mfx.CodecProfile = 1; out->mfx.CodecLevel = 1; out->mfx.ExtendedPicStruct = 1; out->mfx.TimeStampCalc = 1; out->Protected = 0; out->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; out->IOPattern = type == (mfxU16)(MFX_HW_UNKNOWN ? MFX_IOPATTERN_OUT_SYSTEM_MEMORY : MFX_IOPATTERN_OUT_VIDEO_MEMORY); // DECODE's configurables out->mfx.NumThread = 1; out->AsyncDepth = MFX_AUTO_ASYNC_DEPTH_VALUE; } else { // checking mode CHECK_UNSUPPORTED(1 == in->mfx.DecodedOrder); if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12) { out->mfx.FrameInfo.FourCC = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } CHECK_UNSUPPORTED( (in->NumExtParam == 0) != (in->ExtParam == nullptr) ); mfxExtBuffer **pExtBuffer = out->ExtParam; mfxU16 numDistBuf = out->NumExtParam; *out = *in; out->AsyncDepth = in->AsyncDepth == 0 ? MFX_AUTO_ASYNC_DEPTH_VALUE : out->AsyncDepth; out->ExtParam = pExtBuffer; out->NumExtParam = numDistBuf; res = CheckFrameInfo(in->mfx.FrameInfo, out->mfx.FrameInfo); MFX_CHECK_STS(res); out->mfx.CodecId = in->mfx.CodecId != MFX_CODEC_MPEG2 ? 0 : out->mfx.CodecId; if (!(in->mfx.CodecLevel == MFX_LEVEL_MPEG2_LOW || in->mfx.CodecLevel == MFX_LEVEL_MPEG2_MAIN || in->mfx.CodecLevel == MFX_LEVEL_MPEG2_HIGH1440 || in->mfx.CodecLevel == MFX_LEVEL_MPEG2_HIGH || in->mfx.CodecLevel == 0)) { out->mfx.CodecLevel = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (!(in->mfx.CodecProfile == MFX_PROFILE_MPEG2_SIMPLE || in->mfx.CodecProfile == MFX_PROFILE_MPEG2_MAIN || in->mfx.CodecProfile == MFX_PROFILE_MPEG2_HIGH || in->mfx.CodecProfile == MFX_PROFILE_MPEG1 || in->mfx.CodecProfile == 0)) { out->mfx.CodecProfile = 0; MFX_RETURN(MFX_ERR_UNSUPPORTED); } if (in->IOPattern) { if ((in->IOPattern == MFX_IOPATTERN_OUT_SYSTEM_MEMORY) || (in->IOPattern == MFX_IOPATTERN_OUT_VIDEO_MEMORY)) out->IOPattern = in->IOPattern; else MFX_RETURN(MFX_ERR_UNSUPPORTED); } CHECK_UNSUPPORTED(!IsHWSupported(core, in)); } return res; } // Table 6-4 - frame_rate_value void GetMfxFrameRate(uint8_t frame_rate_value, mfxU32 & frameRateN, mfxU32 & frameRateD) { switch (frame_rate_value) { case 0: frameRateN = 30; frameRateD = 1; break; case 1: frameRateN = 24000; frameRateD = 1001; break; case 2: frameRateN = 24; frameRateD = 1; break; case 3: frameRateN = 25; frameRateD = 1; break; case 4: frameRateN = 30000; frameRateD = 1001; break; case 5: frameRateN = 30; frameRateD = 1; break; case 6: frameRateN = 50; frameRateD = 1; break; case 7: frameRateN = 60000; frameRateD = 1001; break; case 8: frameRateN = 60; frameRateD = 1; break; default: frameRateN = 30; frameRateD = 1; } return; } // Table 8-2 - Profile identification mfxU8 GetMfxCodecProfile(uint8_t profile) { switch (profile) { case 5: return MFX_PROFILE_MPEG2_SIMPLE; case 4: return MFX_PROFILE_MPEG2_MAIN; case 1: return MFX_PROFILE_MPEG2_HIGH; default: return MFX_PROFILE_UNKNOWN; } } // Table 8-3 - Level identification mfxU8 GetMfxCodecLevel(uint8_t level) { switch (level) { case 10: return MFX_LEVEL_MPEG2_LOW; case 8: return MFX_LEVEL_MPEG2_MAIN; case 6: return MFX_LEVEL_MPEG2_HIGH1440; case 4: return MFX_LEVEL_MPEG2_HIGH; default: return MFX_LEVEL_UNKNOWN; } } void DARtoPAR(uint32_t width, uint32_t height, uint32_t dar_h, uint32_t dar_v, uint16_t & par_h, uint16_t &par_v) { uint32_t simple_tab[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; uint32_t h = dar_h * height; uint32_t v = dar_v * width; // remove common multipliers while ( ((h|v)&1) == 0 ) { h >>= 1; v >>= 1; } uint32_t denom; for (uint32_t i=0; i < (uint32_t)(sizeof(simple_tab)/sizeof(simple_tab[0])); ++i) { denom = simple_tab[i]; while(h%denom==0 && v%denom==0) { v /= denom; h /= denom; } if (v <= denom || h <= denom) break; } par_h = (uint16_t)h; par_v = (uint16_t)v; } void CalcAspectRatio(uint32_t dar, uint32_t width, uint32_t height, uint16_t & aspectRatioW, uint16_t & aspectRatioH) { if (dar == 2) { DARtoPAR(width, height, 4, 3, aspectRatioW, aspectRatioH); } else if (dar == 3) { DARtoPAR(width, height, 16, 9, aspectRatioW, aspectRatioH); } else if (dar == 4) { DARtoPAR(width, height, 221, 100, aspectRatioW, aspectRatioH); } else // dar == 1 or unknown { aspectRatioW = 1; aspectRatioH = 1; } } // Validate input parameters bool CheckVideoParam(mfxVideoParam *in) { if (!in) return false; if (MFX_CODEC_MPEG2 != in->mfx.CodecId) return false; if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12) return false; // both zero or not zero if ((in->mfx.FrameInfo.AspectRatioW || in->mfx.FrameInfo.AspectRatioH) && !(in->mfx.FrameInfo.AspectRatioW && in->mfx.FrameInfo.AspectRatioH)) return false; if ((MFX_PROFILE_UNKNOWN != in->mfx.CodecProfile) && (MFX_PROFILE_MPEG2_SIMPLE != in->mfx.CodecProfile) && (MFX_PROFILE_MPEG2_MAIN != in->mfx.CodecProfile) && (MFX_PROFILE_MPEG2_HIGH != in->mfx.CodecProfile)) return false; switch (in->mfx.FrameInfo.PicStruct) { case MFX_PICSTRUCT_UNKNOWN: case MFX_PICSTRUCT_PROGRESSIVE: case MFX_PICSTRUCT_FIELD_TFF: case MFX_PICSTRUCT_FIELD_BFF: break; default: return false; } if (in->mfx.FrameInfo.ChromaFormat != MFX_CHROMAFORMAT_YUV420) return false; if ( !(in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && !(in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY) ) return false; if ((in->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (in->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) return false; return true; } // Initialize mfxVideoParam structure based on decoded bitstream header values UMC::Status UMC_MPEG2_DECODER::MFX_Utility::FillVideoParam(const MPEG2SequenceHeader & seq, const MPEG2SequenceExtension * seqExt, const MPEG2SequenceDisplayExtension * dispExt, mfxVideoParam & par) { par.mfx.CodecId = MFX_CODEC_MPEG2; par.mfx.FrameInfo.PicStruct = (mfxU16)(seqExt && seqExt->progressive_sequence ? MFX_PICSTRUCT_PROGRESSIVE : MFX_PICSTRUCT_UNKNOWN); par.mfx.FrameInfo.CropX = 0; par.mfx.FrameInfo.CropY = 0; par.mfx.FrameInfo.CropW = (mfxU16)seq.horizontal_size_value; par.mfx.FrameInfo.CropH = (mfxU16)seq.vertical_size_value; par.mfx.FrameInfo.Width = mfx::align2_value(par.mfx.FrameInfo.CropW, 16); par.mfx.FrameInfo.Height = mfx::align2_value(par.mfx.FrameInfo.CropH, (MFX_PICSTRUCT_PROGRESSIVE == par.mfx.FrameInfo.PicStruct) ? 16 : 32); par.mfx.FrameInfo.BitDepthLuma = 8; par.mfx.FrameInfo.BitDepthChroma = 8; par.mfx.FrameInfo.Shift = 0; if (seqExt) { par.mfx.FrameInfo.ChromaFormat = (mfxU16)(seqExt->chroma_format == CHROMA_FORMAT_420 ? MFX_CHROMAFORMAT_YUV420 : (seqExt->chroma_format == CHROMA_FORMAT_422 ? MFX_CHROMAFORMAT_YUV422 : MFX_CHROMAFORMAT_YUV444)); // Table 8-1 - Meaning of bits in profile_and_level_indication par.mfx.CodecProfile = GetMfxCodecProfile((seqExt->profile_and_level_indication >> 4) & 7); // [6:4] bits par.mfx.CodecLevel = GetMfxCodecLevel(seqExt->profile_and_level_indication & 0xF); // [3:0] bits } else { par.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; par.mfx.CodecProfile = MFX_PROFILE_MPEG1; par.mfx.CodecLevel = MFX_LEVEL_UNKNOWN; } // 6.3.3 uint32_t w = dispExt ? dispExt->display_horizontal_size : seq.horizontal_size_value; uint32_t h = dispExt ? dispExt->display_vertical_size : seq.vertical_size_value; CalcAspectRatio(seq.aspect_ratio_information, w, h, par.mfx.FrameInfo.AspectRatioW, par.mfx.FrameInfo.AspectRatioH); GetMfxFrameRate((uint8_t)seq.frame_rate_code, par.mfx.FrameInfo.FrameRateExtN, par.mfx.FrameInfo.FrameRateExtD); par.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; // video signal section mfxExtVideoSignalInfo * videoSignal = (mfxExtVideoSignalInfo *)GetExtendedBuffer(par.ExtParam, par.NumExtParam, MFX_EXTBUFF_VIDEO_SIGNAL_INFO); if (!videoSignal) return UMC::UMC_OK; if (dispExt) { videoSignal->VideoFormat = (mfxU16)dispExt->video_format; videoSignal->ColourPrimaries = (mfxU16)dispExt->colour_primaries; videoSignal->TransferCharacteristics = (mfxU16)dispExt->transfer_characteristics; videoSignal->MatrixCoefficients = (mfxU16)dispExt->matrix_coefficients; videoSignal->ColourDescriptionPresent = (mfxU16)dispExt->colour_description; } else { // default values videoSignal->VideoFormat = 5; // unspecified video format videoSignal->ColourPrimaries = 1; videoSignal->TransferCharacteristics = 1; videoSignal->MatrixCoefficients = 1; videoSignal->ColourDescriptionPresent = 0; } return UMC::UMC_OK; } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/mpeg2_dec/src/umc_mpeg2_va_packer.cpp000066400000000000000000000323211443134507600330560ustar00rootroot00000000000000// Copyright (c) 2018-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_MPEG2_VIDEO_DECODE) #include "umc_mpeg2_defs.h" #include "umc_mpeg2_slice.h" #include "umc_mpeg2_frame.h" #include "umc_mpeg2_va_packer.h" namespace UMC_MPEG2_DECODER { Packer * Packer::CreatePacker(UMC::VideoAccelerator * va) { return new PackerVA(va); } Packer::Packer(UMC::VideoAccelerator * va) : m_va(va) {} Packer::~Packer() {} /****************************************************************************************************/ // Linux VAAPI packer implementation /****************************************************************************************************/ PackerVA::PackerVA(UMC::VideoAccelerator * va) : Packer(va) {} void PackerVA::BeginFrame() {} void PackerVA::EndFrame() {} // Pack picture void PackerVA::PackAU(MPEG2DecoderFrame const& frame, uint8_t fieldIndex) { const MPEG2DecoderFrameInfo & frameInfo = *frame.GetAU(fieldIndex); size_t sliceCount = frameInfo.GetSliceCount(); if (!sliceCount) return; PackPicParams(frame, fieldIndex); PackQmatrix(frameInfo); CreateSliceDataBuffer(frameInfo); CreateSliceParamBuffer(frameInfo); PackSliceParams(frameInfo); auto s = m_va->Execute(); if(s != UMC::UMC_OK) throw mpeg2_exception(s); } // Pack picture parameters void PackerVA::PackPicParams(const MPEG2DecoderFrame & frame, uint8_t fieldIndex) { const MPEG2DecoderFrameInfo & frameInfo = *frame.GetAU(fieldIndex); const auto slice = frameInfo.GetSlice(0); const auto seq = slice->GetSeqHeader(); const auto pic = slice->GetPicHeader(); const auto picExt = slice->GetPicExtHeader(); UMC::UMCVACompBuffer *picParamBuf; auto picParam = (VAPictureParameterBufferMPEG2*)m_va->GetCompBuffer(VAPictureParameterBufferType, &picParamBuf, sizeof(VAPictureParameterBufferMPEG2)); // Allocate buffer if (!picParam) throw mpeg2_exception(UMC::UMC_ERR_FAILED); picParamBuf->SetDataSize(sizeof(VAPictureParameterBufferMPEG2)); memset(picParam, 0, sizeof(VAPictureParameterBufferMPEG2)); picParam->horizontal_size = seq.horizontal_size_value; picParam->vertical_size = seq.vertical_size_value; const auto refPic0 = frameInfo.GetForwardRefPic(); const auto refPic1 = frameInfo.GetBackwardRefPic(); if (MPEG2_P_PICTURE == pic.picture_coding_type && refPic0) { picParam->forward_reference_picture = (VASurfaceID)m_va->GetSurfaceID(refPic0->GetMemID()); picParam->backward_reference_picture = VA_INVALID_SURFACE; } else if (MPEG2_B_PICTURE == pic.picture_coding_type && refPic0 && refPic1) { picParam->forward_reference_picture = (VASurfaceID)m_va->GetSurfaceID(refPic0->GetMemID()); picParam->backward_reference_picture = (VASurfaceID)m_va->GetSurfaceID(refPic1->GetMemID()); } else { picParam->forward_reference_picture = VA_INVALID_SURFACE; picParam->backward_reference_picture = VA_INVALID_SURFACE; } picParam->picture_coding_type = pic.picture_coding_type; for (uint8_t i = 0; i < 4; ++i) { picParam->f_code |= (picExt.f_code[i] << (12 - 4*i)); } picParam->picture_coding_extension.bits.intra_dc_precision = picExt.intra_dc_precision; picParam->picture_coding_extension.bits.picture_structure = picExt.picture_structure; picParam->picture_coding_extension.bits.top_field_first = picExt.top_field_first; picParam->picture_coding_extension.bits.frame_pred_frame_dct = picExt.frame_pred_frame_dct; picParam->picture_coding_extension.bits.concealment_motion_vectors = picExt.concealment_motion_vectors; picParam->picture_coding_extension.bits.q_scale_type = picExt.q_scale_type; picParam->picture_coding_extension.bits.intra_vlc_format = picExt.intra_vlc_format; picParam->picture_coding_extension.bits.alternate_scan = picExt.alternate_scan; picParam->picture_coding_extension.bits.repeat_first_field = picExt.repeat_first_field; picParam->picture_coding_extension.bits.progressive_frame = picExt.progressive_frame; picParam->picture_coding_extension.bits.is_first_field = !( (picExt.picture_structure != FRM_PICTURE) && (fieldIndex == 1) ) ; } void PackerVA::CreateSliceParamBuffer(const MPEG2DecoderFrameInfo & info) { uint32_t count = info.GetSliceCount(); UMC::UMCVACompBuffer *pSliceParamBuf; size_t sizeOfStruct = m_va->IsLongSliceControl() ? sizeof(VASliceParameterBufferMPEG2) : sizeof(VASliceParameterBufferBase); m_va->GetCompBuffer(VASliceParameterBufferType, &pSliceParamBuf, sizeOfStruct*(count)); // Allocate buffer if (!pSliceParamBuf) throw mpeg2_exception(UMC::UMC_ERR_FAILED); pSliceParamBuf->SetNumOfItem(count); } // Calculate size of slice data and create buffer void PackerVA::CreateSliceDataBuffer(const MPEG2DecoderFrameInfo & info) { uint32_t count = info.GetSliceCount(); uint32_t size = 0; for (uint32_t i = 0; i < count; ++i) { MPEG2Slice* slice = info.GetSlice(i); uint8_t *nalUnit; //ptr to first byte of start code uint32_t nalUnitSize; // size of NAL unit in byte slice->GetBitStream().GetOrg(nalUnit, nalUnitSize); size += nalUnitSize + sizeof(start_code_prefix); } UMC::UMCVACompBuffer* compBuf; m_va->GetCompBuffer(VASliceDataBufferType, &compBuf, size); // Allocate buffer if (!compBuf) throw mpeg2_exception(UMC::UMC_ERR_FAILED); compBuf->SetDataSize(0); } // Pack slice parameters void PackerVA::PackSliceParams(const MPEG2DecoderFrameInfo & frameInfo) { size_t sliceCount = frameInfo.GetSliceCount(); bool longSliceControl = m_va->IsLongSliceControl(); for (uint32_t sliceNum = 0; sliceNum < sliceCount; sliceNum++) { const auto slice = frameInfo.GetSlice(sliceNum); const auto sliceHeader = slice->GetSliceHeader(); const auto pic = slice->GetPicHeader(); UMC::UMCVACompBuffer* compBuf; auto sliceParams = (VASliceParameterBufferMPEG2*)m_va->GetCompBuffer(VASliceParameterBufferType, &compBuf); if (!sliceParams) throw mpeg2_exception(UMC::UMC_ERR_FAILED); if (longSliceControl) { sliceParams += sliceNum; memset(sliceParams, 0, sizeof(VASliceParameterBufferMPEG2)); } else { sliceParams = (VASliceParameterBufferMPEG2*)((VASliceParameterBufferBase*)sliceParams + sliceNum); memset(sliceParams, 0, sizeof(VASliceParameterBufferBase)); } uint8_t * rawDataPtr = nullptr; uint32_t rawDataSize = 0; slice->GetBitStream().GetOrg(rawDataPtr, rawDataSize); sliceParams->slice_data_size = rawDataSize + prefix_size; sliceParams->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; auto sliceDataBuf = (uint8_t*)m_va->GetCompBuffer(VASliceDataBufferType, &compBuf); if (!sliceDataBuf) throw mpeg2_exception(UMC::UMC_ERR_FAILED); sliceParams->slice_data_offset = compBuf->GetDataSize(); sliceDataBuf += sliceParams->slice_data_offset; std::copy(start_code_prefix, start_code_prefix + prefix_size, sliceDataBuf); std::copy(rawDataPtr, rawDataPtr + rawDataSize, sliceDataBuf + prefix_size); compBuf->SetDataSize(sliceParams->slice_data_offset + sliceParams->slice_data_size); if (!longSliceControl) continue; sliceParams->macroblock_offset = sliceHeader.mbOffset + prefix_size * 8; sliceParams->slice_horizontal_position = sliceHeader.macroblockAddressIncrement; sliceParams->slice_vertical_position = sliceHeader.slice_vertical_position - 1; sliceParams->quantiser_scale_code = sliceHeader.quantiser_scale_code; sliceParams->intra_slice_flag = (pic.picture_coding_type == MPEG2_I_PICTURE); } return; } static const uint8_t default_intra_quantizer_matrix[64] = { 8, 16, 16, 19, 16, 19, 22, 22, 22, 22, 22, 22, 26, 24, 26, 27, 27, 27, 26, 26, 26, 26, 27, 27, 27, 29, 29, 29, 34, 34, 34, 29, 29, 29, 27, 27, 29, 29, 32, 32, 34, 34, 37, 38, 37, 35, 35, 34, 35, 38, 38, 40, 40, 40, 48, 48, 46, 46, 56, 56, 58, 69, 69, 83 }; static const uint8_t default_non_intra_quantizer_matrix[64] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; // Pack matrix parameters void PackerVA::PackQmatrix(const MPEG2DecoderFrameInfo & info) { UMC::UMCVACompBuffer *quantBuf; auto qmatrix = (VAIQMatrixBufferMPEG2*)m_va->GetCompBuffer(VAIQMatrixBufferType, &quantBuf, sizeof(VAIQMatrixBufferMPEG2)); // Allocate buffer if (!qmatrix) throw mpeg2_exception(UMC::UMC_ERR_FAILED); quantBuf->SetDataSize(sizeof(VAIQMatrixBufferMPEG2)); const auto slice = info.GetSlice(0); const auto seq = slice->GetSeqHeader(); const auto customQM = slice->GetQMatrix(); // intra_quantizer_matrix qmatrix->load_intra_quantiser_matrix = 1; const uint8_t * intra_quantizer_matrix = customQM && customQM->load_intra_quantiser_matrix ? customQM->intra_quantiser_matrix : (seq.load_intra_quantiser_matrix ? seq.intra_quantiser_matrix : default_intra_quantizer_matrix); std::copy(intra_quantizer_matrix, intra_quantizer_matrix + 64, qmatrix->intra_quantiser_matrix); // chroma_intra_quantiser_matrix qmatrix->load_chroma_intra_quantiser_matrix = 1; const uint8_t * chroma_intra_quantiser_matrix = customQM && customQM->load_chroma_intra_quantiser_matrix ? customQM->chroma_intra_quantiser_matrix : (seq.load_intra_quantiser_matrix ? seq.intra_quantiser_matrix : default_intra_quantizer_matrix); std::copy(chroma_intra_quantiser_matrix, chroma_intra_quantiser_matrix + 64, qmatrix->chroma_intra_quantiser_matrix); // non_intra_quantiser_matrix qmatrix->load_non_intra_quantiser_matrix = 1; const uint8_t * non_intra_quantiser_matrix = customQM && customQM->load_non_intra_quantiser_matrix ? customQM->non_intra_quantiser_matrix : (seq.load_non_intra_quantiser_matrix ? seq.non_intra_quantiser_matrix : default_non_intra_quantizer_matrix); std::copy(non_intra_quantiser_matrix, non_intra_quantiser_matrix + 64, qmatrix->non_intra_quantiser_matrix); // chroma_non_intra_quantiser_matrix qmatrix->load_chroma_non_intra_quantiser_matrix = 1; const uint8_t * chroma_non_intra_quantiser_matrix = customQM && customQM->load_chroma_non_intra_quantiser_matrix ? customQM->chroma_non_intra_quantiser_matrix : (seq.load_non_intra_quantiser_matrix ? seq.non_intra_quantiser_matrix : default_non_intra_quantizer_matrix); std::copy(chroma_non_intra_quantiser_matrix, chroma_non_intra_quantiser_matrix + 64, qmatrix->chroma_non_intra_quantiser_matrix); } } #endif // MFX_ENABLE_MPEG2_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/000077500000000000000000000000001443134507600261055ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/CMakeLists.txt000066400000000000000000000033751443134507600306550ustar00rootroot00000000000000# Copyright (c) 2020 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_library(vc1_common STATIC) set_property(TARGET vc1_common PROPERTY FOLDER "umc") target_sources(vc1_common PRIVATE include/umc_vc1_common.h include/umc_vc1_common_defs.h include/umc_vc1_common_macros_defs.h include/umc_vc1_common_tables.h include/umc_vc1_common_tables_adv.h include/umc_vc1_spl_frame_constr.h include/umc_vc1_spl_tbl.h src/umc_vc1_common.cpp src/umc_vc1_common_tables.cpp src/umc_vc1_common_tables_adv.cpp src/umc_vc1_spl_frame_constr.cpp src/umc_vc1_spl_tbl.cpp ) target_include_directories(vc1_common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_link_libraries(vc1_common PUBLIC vm_plus umc_va_hw) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include/000077500000000000000000000000001443134507600275305ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include/umc_vc1_common.h000066400000000000000000000027151443134507600326130ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_COMMON_H__ #define __UMC_VC1_COMMON_H__ #include "ippdefs.h" namespace UMC { namespace VC1Common { void SwapData (uint8_t *src, uint32_t dataSize); } } #endif //__UMC_VC1_COMMON_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_defs.h000066400000000000000000000470511443134507600335370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_COMMON_DEFS_H__ #define __UMC_VC1_COMMON_DEFS_H__ #include #include "ippi.h" #include "ippvc.h" #include "umc_vc1_common_macros_defs.h" #include "umc_structures.h" #include #define VC1_ENC_RECODING_MAX_NUM 3 #define START_CODE_NUMBER 600 //frame header size in case of SM profiles #define VC1FHSIZE 8 //start code size in case of Advance profile #define VC1SCSIZE 4 typedef enum { VC1_OK = 0, VC1_FAIL = UMC::UMC_ERR_FAILED, VC1_SKIP_FRAME = 2, VC1_NOT_ENOUGH_DATA = UMC::UMC_ERR_NOT_ENOUGH_DATA, VC1_ERR_INVALID_STREAM = UMC::UMC_ERR_INVALID_STREAM, VC1_WRN_INVALID_STREAM = UMC::UMC_ERR_UNSUPPORTED }VC1Status; #define VC1_TO_UMC_CHECK_STS(sts) if (sts != VC1_OK) return sts; // start code (for vc1 format) //see C24.008-VC1-Spec-CD2r1.pdf standard Annex E,E5, p. 431 typedef enum { VC1_EndOfSequence = 0x0A, VC1_Slice = 0x0B, VC1_Field = 0x0C, VC1_FrameHeader = 0x0D, VC1_EntryPointHeader = 0x0E, VC1_SequenceHeader = 0x0F, VC1_SliceLevelUserData = 0x1B, VC1_FieldLevelUserData = 0x1C, VC1_FrameLevelUserData = 0x1D, VC1_EntryPointLevelUserData = 0x1E, VC1_SequenceLevelUserData = 0x1F } VC1StartCode; //frame coding mode enum { VC1_Progressive = 0, VC1_FrameInterlace = 1, VC1_FieldInterlace = 2 }; enum { VC1_I_FRAME = 0, VC1_P_FRAME = 1, VC1_B_FRAME = 2, VC1_BI_FRAME = 3, VC1_SKIPPED_FRAME = 0x4 }; #define VC1_IS_SKIPPED(value) ((value & VC1_SKIPPED_FRAME) == VC1_SKIPPED_FRAME) #define VC1_IS_REFERENCE(value) ((value < VC1_B_FRAME)||VC1_IS_SKIPPED(value)) #define VC1_IS_NOT_PRED(value) ((value == VC1_I_FRAME)||(value == VC1_BI_FRAME)) #define VC1_IS_PRED(value) ((value == VC1_P_FRAME)||(value == VC1_B_FRAME)) #define IS_VC1_USER_DATA(x) (x <= VC1_SequenceLevelUserData && x >= VC1_SliceLevelUserData) #define IS_VC1_DATA_SC(x) (x <= VC1_EntryPointHeader && x >= VC1_Slice) enum { VC1_COND_OVER_FLAG_NONE = 0, //no 8x8 block boundaries are smoothed, //see standart, p163 VC1_COND_OVER_FLAG_ALL = 2, //all 8x8 block boundaries are smoothed, //see standart, p163 VC1_COND_OVER_FLAG_SOME = 3 //some 8x8 block boundaries are smoothed, //see standart, p163 }; #define VC1_MAX_BITPANE_CHUNCKS 7 #define VC1_NUM_OF_BLOCKS 6 #define VC1_NUM_OF_LUMA 4 #define VC1_PIXEL_IN_LUMA 16 #define VC1_PIXEL_IN_CHROMA 8 #define VC1_PIXEL_IN_BLOCK 8 enum { VC1_BLK_INTER8X8 = 0x1, VC1_BLK_INTER8X4 = 0x2, VC1_BLK_INTER4X8 = 0x4, VC1_BLK_INTER4X4 = 0x8, VC1_BLK_INTER = 0xf, VC1_BLK_INTRA_TOP = 0x10, VC1_BLK_INTRA_LEFT = 0x20, VC1_BLK_INTRA = 0x30 }; #define VC1_IS_BLKINTRA(value) (value & 0x30) enum { VC1_MB_INTRA = 0x0, VC1_MB_1MV_INTER = 0x1, VC1_MB_2MV_INTER = 0x2, VC1_MB_4MV_INTER = 0x3, VC1_MB_4MV_FIELD_INTER = 0x4, VC1_MB_DIRECT = 0x0, VC1_MB_FORWARD = 0x8, VC1_MB_BACKWARD = 0x10, VC1_MB_INTERP = 0x18 }; #define VC1_IS_MVFIELD(value) (((value&7) == VC1_MB_2MV_INTER)||((value&7) == VC1_MB_4MV_FIELD_INTER )) #define VC1_GET_MBTYPE(value) (value&7) #define VC1_GET_PREDICT(value) (value&56) #define VC1MBQUANT 2 #define VC1SLICEINPARAL 512 #define VC1FRAMEPARALLELPAIR 2 enum { VC1_MVMODE_HPELBI_1MV = 0, //0000 1 MV Half-pel bilinear VC1_MVMODE_1MV = 1, //1 1 MV VC1_MVMODE_MIXED_MV = 2, //01 Mixed MV VC1_MVMODE_HPEL_1MV = 3, //001 1 MV Half-pel VC1_MVMODE_INTENSCOMP = 4 //0001 Intensity Compensation }; enum { VC1_DQPROFILE_ALL4EDGES = 0, //00 All four Edges VC1_DQPROFILE_DBLEDGES = 1, //01 Double Edges VC1_DQPROFILE_SNGLEDGES = 2, //10 Single Edges VC1_DQPROFILE_ALLMBLKS = 3 //11 All Macroblocks }; enum { VC1_ALTPQUANT_LEFT = 1, VC1_ALTPQUANT_TOP = 2, VC1_ALTPQUANT_RIGTHT = 4, VC1_ALTPQUANT_BOTTOM = 8, VC1_ALTPQUANT_LEFT_TOP = 3, VC1_ALTPQUANT_TOP_RIGTHT = 6, VC1_ALTPQUANT_RIGTHT_BOTTOM = 12, VC1_ALTPQUANT_BOTTOM_LEFT = 9, VC1_ALTPQUANT_EDGES = 15, VC1_ALTPQUANT_ALL = 16, VC1_ALTPQUANT_NO = 0, VC1_ALTPQUANT_MB_LEVEL = 32, VC1_ALTPQUANT_ANY_VALUE = 64 }; enum //profile definitions { VC1_PROFILE_SIMPLE = 0, //disables X8 Intraframe, Loop filter, DQuant, and //Multires while enabling the Fast Transform VC1_PROFILE_MAIN = 1, //The main profile is has all the simple profile //tools plus loop filter, dquant, and multires VC1_PROFILE_RESERVED = 2, VC1_PROFILE_ADVANCED = 3, //The complex profile has X8 Intraframe can use //the normal IDCT transform or the VC1 Inverse Transform VC1_PROFILE_UNKNOWN = 4 }; #define VC1_IS_VALID_PROFILE(profile) ((profile == VC1_PROFILE_RESERVED)||(profile > VC1_PROFILE_ADVANCED)?false:true) enum //bitplane modes definitions { VC1_BITPLANE_RAW_MODE = 0,//Raw 0000 VC1_BITPLANE_NORM2_MODE = 1,//Norm-2 10 VC1_BITPLANE_DIFF2_MODE = 2,//Diff-2 001 VC1_BITPLANE_NORM6_MODE = 3,//Norm-6 11 VC1_BITPLANE_DIFF6_MODE = 4,//Diff-6 0001 VC1_BITPLANE_ROWSKIP_MODE = 5,//Rowskip 010 VC1_BITPLANE_COLSKIP_MODE = 6 //Colskip 011 }; #define VC1_UNDEF_PQUANT 0 #define VC1_MVINTRA (0X7F7F) enum //quantizer deadzone definitions { VC1_QUANTIZER_UNIFORM = 0, VC1_QUANTIZER_NONUNIFORM = 1 }; enum //prediction directions definitions { VC1_ESCAPEMODE3_Conservative = 0, VC1_ESCAPEMODE3_Efficient = 1 }; //for subBlockPattern (numCoef) enum { VC1_SBP_0 = 0x8, VC1_SBP_1 = 0x4, VC1_SBP_2 = 0x2, VC1_SBP_3 = 0x1 }; //interlace frame //field/frame transform enum { VC1_FRAME_TRANSFORM = 0, VC1_FIELD_TRANSFORM = 1, VC1_NO_CBP_TRANSFORM, VC1_NA_TRANSFORM }; enum { VC1_SBP_8X8_BLK = 0, VC1_SBP_8X4_BOTTOM_BLK = 1, VC1_SBP_8X4_TOP_BLK = 2, VC1_SBP_8X4_BOTH_BLK = 3, VC1_SBP_4X8_RIGHT_BLK = 4, VC1_SBP_4X8_LEFT_BLK = 5, VC1_SBP_4X8_BOTH_BLK = 6, VC1_SBP_4X4_BLK = 7, VC1_SBP_8X8_MB = 8, VC1_SBP_8X4_BOTTOM_MB = 9, VC1_SBP_8X4_TOP_MB = 10, VC1_SBP_8X4_BOTH_MB = 11, VC1_SBP_4X8_RIGHT_MB = 12, VC1_SBP_4X8_LEFT_MB = 13, VC1_SBP_4X8_BOTH_MB = 14, VC1_SBP_4X4_MB = 15 }; //for LeftTopRightPositionFlag enum { VC1_COMMON_MB = 0x000, VC1_LEFT_MB = 0xA00, VC1_TOP_LEFT_MB = 0xAC0, VC1_TOP_LEFT_RIGHT = 0xAC5, VC1_LEFT_RIGHT_MB = 0xA05, VC1_TOP_MB = 0x0C0, VC1_TOP_RIGHT_MB = 0x0C5, VC1_RIGHT_MB = 0x005 }; #define VC1_IS_NO_LEFT_MB(value) !(value&0x800) #define VC1_IS_NO_TOP_MB(value) !(value&0x80) #define VC1_IS_NO_RIGHT_MB(value) (!(value&0x01)) //only left #define VC1_IS_LEFT_MB(value) (value&0x800)&&(!(value&0x80)) && (!(value&0x1)) //only top #define VC1_IS_TOP_MB(value)(value&0x80)&&(!(value&0x800))&&(!(value&0x1)) //only right #define VC1_IS_RIGHT_MB(value) (value&0x01)&&(!(value&0x800))&&(!(value&0x80)) //left and top #define VC1_IS_LEFT_TOP_MB(value) (value&0x800)&&(value&0x80)&&(!(value&0x1)) #define VC1_IS_TOP_RIGHT_MB(value) (value&0x80)&&(value&0x1)&&(!(value&0x800)) #define VC1_IS_LEFT_RIGHT_MB(value) (value&0x800)&&(value&0x1)&&(!(value&0x80)) //for IntraFlag enum { VC1_All_INTRA = 0x3F, VC1_BLOCK_0_INTRA = 0x01, VC1_BLOCK_1_INTRA = 0x02, VC1_BLOCK_2_INTRA = 0x04, VC1_BLOCK_3_INTRA = 0x08, VC1_BLOCK_4_INTRA = 0x10, VC1_BLOCKS_0_1_INTRA = 0x03, VC1_BLOCKS_2_3_INTRA = 0x0C, VC1_BLOCKS_0_2_INTRA = 0x05, VC1_BLOCKS_1_3_INTRA = 0x0A }; //for smoothing #define VC1_EDGE_MB(intraflag, value) ((intraflag&value)==value) #define VC1_IS_INTER_MB(value) ((value == 0x00)||(value == 0x01)||(value == 0x02)||(value == 0x04)||(value == 0x08)) //for extended differantial MV range flag(inerlace P picture) enum { VC1_DMVRANGE_NONE = 0, VC1_DMVRANGE_HORIZONTAL_RANGE, VC1_DMVRANGE_VERTICAL_RANGE, VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE }; //intensity comprnsation enum { VC1_INTCOMP_TOP_FIELD = 1, VC1_INTCOMP_BOTTOM_FIELD = 2, VC1_INTCOMP_BOTH_FIELD = 3 }; #define VC1_IS_INT_TOP_FIELD(value) (value & VC1_INTCOMP_TOP_FIELD) #define VC1_IS_INT_BOTTOM_FIELD(value) (value & VC1_INTCOMP_BOTTOM_FIELD) #define VC1_IS_INT_BOTH_FIELD(value) (value & VC1_INTCOMP_BOTH_FIELD) #define VC1_BRACTION_INVALID 0 #define VC1_BRACTION_BI 9 #define VC1_MAX_SLICE_NUM 512 typedef struct { int32_t* pRLTable; const int8_t* pDeltaLevelLast0; const int8_t* pDeltaLevelLast1; const int8_t* pDeltaRunLast0; const int8_t* pDeltaRunLast1; }IppiACDecodeSet_VC1; #define VC1_IS_BITPLANE_RAW_MODE(bitplane) ((bitplane)->m_imode == VC1_BITPLANE_RAW_MODE) #define VC1_IS_U_PRESENT_IN_CBPCY(value) (value & 2) #define VC1_IS_V_PRESENT_IN_CBPCY(value) (value & 1) #define VC1_NEXT_BITS(num_bits, value) VC1NextNBits(pContext->m_bitstream.pBitstream, pContext->m_bitstream.bitOffset, num_bits, value); #define VC1_GET_BITS(num_bits, value) VC1GetNBits(pContext->m_bitstream.pBitstream, pContext->m_bitstream.bitOffset, num_bits, value); typedef struct { uint8_t m_invert; int32_t m_imode; uint8_t* m_databits; }VC1Bitplane; typedef struct { //common field uint32_t PROFILE; //2 //Advanced profile fields uint32_t LEVEL; //3 //common fields uint32_t FRMRTQ_POSTPROC; //3 uint32_t BITRTQ_POSTPROC; //5 uint32_t FRAMERATENR; //8 uint32_t FRAMERATEDR; //4 //Advanced profile fields uint32_t POSTPROCFLAG; //1 uint32_t MAX_CODED_WIDTH; //12 uint32_t MAX_CODED_HEIGHT; //12 int32_t AspectRatioW; int32_t AspectRatioH; uint32_t PULLDOWN; //1 uint32_t INTERLACE; //1 uint32_t TFCNTRFLAG; //1 //Simple/Main profile fields uint32_t LOOPFILTER; //1 uimsbf uint32_t MULTIRES; //1 uimsbf uint32_t FASTUVMC; //1 uimsbf uint32_t EXTENDED_MV; //1 uimsbf uint32_t DQUANT; //2 uimsbf uint32_t VSTRANSFORM; //1 uimsbf uint32_t OVERLAP; //1 uimsbf uint32_t SYNCMARKER; //1 uimsbf uint32_t RANGERED; //1 uimsbf uint32_t MAXBFRAMES; //3 uimsbf uint32_t QUANTIZER; //2 uimsbf //common fields uint32_t FINTERPFLAG; //1 uint32_t HRD_PARAM_FLAG; //1 //HRD PARAMS uint32_t HRD_NUM_LEAKY_BUCKETS; //5 uint16_t widthMB; uint16_t heightMB; uint16_t MaxWidthMB; //maximum MB in row (calculated from MAX_CODED_WIDTH uint16_t MaxHeightMB; //maximum MB in column (calculated from MAX_CODED_HEIGHT //entry point uint32_t BROKEN_LINK; uint32_t CLOSED_ENTRY; uint32_t PANSCAN_FLAG; uint32_t REFDIST_FLAG; uint32_t CODED_WIDTH; uint32_t CODED_HEIGHT; uint32_t EXTENDED_DMV; uint32_t RANGE_MAPY_FLAG; int32_t RANGE_MAPY; uint32_t RANGE_MAPUV_FLAG; int32_t RANGE_MAPUV; uint32_t RNDCTRL; // 1 rounding control bit // video info uint16_t VideoFormat; uint16_t VideoFullRange; uint16_t ColourDescriptionPresent; uint16_t ColourPrimaries; uint16_t TransferCharacteristics; uint16_t MatrixCoefficients; }VC1SequenceLayerHeader; typedef struct { uint8_t k_x; uint8_t k_y; uint16_t r_x; uint16_t r_y; }VC1MVRange; typedef struct { uint16_t scaleopp; uint16_t scalesame1; uint16_t scalesame2; uint16_t scalezone1_x; uint16_t scalezone1_y; uint16_t zone1offset_x; uint16_t zone1offset_y; }VC1PredictScaleValuesPPic; typedef struct { uint16_t scalesame; uint16_t scaleopp1; uint16_t scaleopp2; uint16_t scalezone1_x; uint16_t scalezone1_y; uint16_t zone1offset_x; uint16_t zone1offset_y; }VC1PredictScaleValuesBPic; typedef struct { //common fields uint32_t PTYPE; uint32_t PQINDEX; uint32_t HALFQP; //common fields.Slice parameters uint32_t is_slice; //interlace fields uint8_t TFF; // 1 top field first uint8_t RFF; // repeat field uint8_t PTypeField1; uint8_t PTypeField2; uint8_t CurrField; uint8_t BottomField; //Is current field top or nor uint32_t INTCOMFIELD; //variable size intensity compensation field //range reduce simple/main profile int32_t RANGEREDFRM; //1 //I P B picture. VopDQuant uint32_t m_DQProfile; uint32_t m_DQuantFRM; uint32_t m_DQBILevel; uint32_t m_AltPQuant; uint32_t PQUANT; uint32_t m_PQuant_mode; uint32_t QuantizationType; //0 - uniform, 1 - nonuniform //only for advanced profile uint32_t FCM; // variable size frame coding mode //I BI picture VC1Bitplane ACPRED; // variable size AC Prediction uint32_t CONDOVER; // variable size conditional overlap flag VC1Bitplane OVERFLAGS; // variable size conditional overlap macroblock pattern flags //I BI picture. interlace frame VC1Bitplane FIELDTX; //variable size field transform flag // P B picture uint32_t TTMBF; uint32_t TTFRM; uint32_t TTFRM_ORIG; //for future H/W support needs VC1Bitplane SKIPMB; VC1Bitplane MVTYPEMB; uint32_t MVMODE; // P B picture. Interlace frame uint32_t DMVRANGE; //variable size extended differential MV Range Flag // P B picture. Interlace field int32_t REFDIST; //variable size P Reference Distance //P only. Interlace field uint32_t NUMREF; //1 Number of reference picture uint32_t REFFIELD; //1 Reference field picture indicator //B only uint32_t BFRACTION; uint32_t BFRACTION_index; VC1Bitplane m_DirectMB; int32_t ScaleFactor; // B only. Interlace field VC1Bitplane FORWARDMB; //variable size B Field forward mode //MB bit syntax element uint32_t RNDCTRL; // 1 rounding control bit uint32_t TRANSDCTAB; uint32_t MVMODE2; uint32_t MVTAB; uint32_t CBPTAB; uint32_t MBMODETAB; uint32_t MV2BPTAB; //2 2 mv block pattern table uint32_t MV4BPTAB; //2 4 mv block pattern table uint32_t PQUANTIZER; uint32_t MVRANGE; uint32_t DQSBEdge; // P picture uint32_t LUMSCALE; uint32_t LUMSHIFT; uint32_t LUMSCALE1; uint32_t LUMSHIFT1; uint32_t POSTPROC; uint32_t TRANSACFRM; uint32_t TRANSACFRM2; uint32_t RPTFRM; // 2 repeat frame count uint32_t UVSAMP; uint32_t MV4SWITCH; }VC1PictureLayerHeader; typedef struct { int32_t *m_Bitplane_IMODE; int32_t *m_BitplaneTaledbits; int32_t *BFRACTION; int32_t *REFDIST_TABLE; } VC1VLCTables; typedef struct { uint32_t* pBitstream; int32_t bitOffset; } IppiBitstream; //1.3.3 The decoder dynamically allocates memory for frame //buffers and other structures. Following are the size requirements. //For the frame buffer, the following formula indicates the memory requirement: //frame_memory = {(h + 64) x (w + 64) + [(h / 2 + 32) x (w / 2 + 32)] x 2}bytes struct Frame { Frame():m_bIsExpanded(0), FCM(0), ICFieldMask(0), corrupted(0) { } uint8_t m_bIsExpanded; uint32_t FCM; //1000 - IC for Top First Field //0100 - IC for Bottom First Field //0010 - IC for Top Second Field //0001 - IC for Bottom Second Field uint32_t ICFieldMask; uint16_t corrupted; }; #define VC1MAXFRAMENUM 9*VC1FRAMEPARALLELPAIR + 9 // for <= 8 threads. Change if numThreads > 8 #define VC1NUMREFFRAMES 2 // 2 - reference frames class VC1FrameStorageProxy { public: void Reset(std::deque& frames_storage) { if (frames) frames->clear(); frames = &frames_storage; frames->clear(); } void AdjustToIndex(size_t idx) { if (frames && frames->size() <= idx) frames->resize(idx + 1); } Frame& operator [] (size_t index) { if (!frames) throw std::exception(); return (*frames)[index]; } private: std::deque* frames; }; struct VC1FrameBuffer { VC1FrameStorageProxy m_pFrames; int32_t m_iPrevIndex; int32_t m_iNextIndex; int32_t m_iCurrIndex; int32_t m_iRangeMapIndex; int32_t m_iRangeMapIndexPrev; // for correct va support int32_t m_iDisplayIndex; int32_t m_iToFreeIndex; // for skipping processing int32_t m_iToSkipCoping; // for external index set up int32_t m_iBFrameIndex; Frame operator [] (uint32_t number) { return m_pFrames[number]; }; }; typedef struct { uint32_t start_pos; uint32_t HeightMB; uint32_t is_last_deblock; uint32_t isNeedDbl; }VC1DeblockInfo; struct VC1Context { VC1SequenceLayerHeader m_seqLayerHeader; VC1PictureLayerHeader* m_picLayerHeader; VC1PictureLayerHeader* m_InitPicLayer; VC1VLCTables* m_vlcTbl; VC1FrameBuffer m_frmBuff; IppiBitstream m_bitstream; uint8_t* m_pBufferStart; uint32_t m_FrameSize; //start codes uint32_t* m_Offsets; uint32_t* m_values; VC1Bitplane m_pBitplane; VC1DeblockInfo DeblockInfo; uint32_t RefDist; uint32_t* pRefDist; // Intensity compensation: lookup tables only for P-frames uint8_t m_bIntensityCompensation; uint32_t PrevFCM; uint32_t NextFCM; int32_t bp_round_count; }; #endif //__umc_vc1_common_defs_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_macros_defs.h000066400000000000000000000157271443134507600351100ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_COMMON_MACROS_DEFS_H__ #define __UMC_VC1_COMMON_MACROS_DEFS_H__ #include #include "ippi.h" #include "mfx_utils.h" #define VC1_SIGN(x) ((x<0)?-1:(x>0?1:0)) #define VC1_LUT_SET(value,lut) (lut[value]) namespace UMC { class VC1BitstreamParser { public: template inline static void GetNBits(uint32_t* &pCurrentData, int32_t& offset, uint32_t nbits, T &data) { uint32_t x; offset -= (nbits); if(offset >= 0) { x = pCurrentData[0] >> (offset + 1); } else { offset += 32; x = pCurrentData[1] >> (offset); x >>= 1; x += pCurrentData[0] << (31 - offset); pCurrentData++; } data = T(x & ((0x00000001 << (nbits&0x1F)) - 1)); } template inline static void CheckNBits(uint32_t* pCurrentData, uint32_t offset, uint32_t nbits, T &data) { int32_t bp; uint32_t x; bp = offset - (nbits); if(bp < 0) { bp += 32; x = pCurrentData[1] >> bp; x >>= 1; x += pCurrentData[0] << (31 - bp); } else { x = pCurrentData[0] >> bp; x >>= 1; } data = T(x & ((0x00000001 << (nbits&0x1F)) - 1)); } }; } // from histrorical reasons. Unsafety work with bitstream #define VC1NextNBits( current_data, offset, nbits, data) __VC1NextBits(current_data, offset, nbits, data) #define __VC1GetBits(current_data, offset, nbits, data) \ { \ uint32_t _x; \ \ assert((nbits) >= 0 && (nbits) <= 32); \ assert(offset >= 0 && offset <= 31); \ \ offset -= (nbits); \ \ if(offset >= 0) \ { \ _x = current_data[0] >> (offset + 1); \ } \ else \ { \ offset += 32; \ \ _x = current_data[1] >> (offset); \ _x >>= 1; \ _x += current_data[0] << (31 - offset); \ current_data++; \ } \ \ assert(offset >= 0 && offset <= 31); \ \ (data) = _x & ((0x00000001 << (nbits&0x1F)) - 1); \ } #define VC1CheckDataLen(currLen,nbits) \ { \ currLen-=nbits; \ if(currLen< 0) return MFX_ERR_NOT_INITIALIZED; \ } \ #define VC1GetNBits( current_data, offset, nbits, data) __VC1GetBits(current_data, offset, nbits, data) #define __VC1NextBits(current_data, offset, nbits, data) \ { \ int32_t bp; \ uint32_t x; \ \ assert((nbits) >= 0 && (nbits) <= 32); \ assert(offset >= 0 && offset <= 31); \ \ bp = offset - (nbits); \ \ if(bp < 0) \ { \ bp += 32; \ x = current_data[1] >> bp; \ x >>= 1; \ x += current_data[0] << (31 - bp); \ } \ else \ { \ x = current_data[0] >> bp; \ x >>= 1; \ } \ \ (data) = x & ((0x00000001 << (nbits&0x1F)) - 1); \ } #endif //__VC1_DEC_MACROS_DEFS_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_tables.h000066400000000000000000000054671443134507600340750ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_COMMON_TABLES_H__ #define __UMC_VC1_COMMON_TABLES_H__ #include "ippdefs.h" //VC-1 Table 58: Escape mode 3 level codeword size conservative code-table (used for 1 <= PQUANT <= 7 or if //VOPDQUANT is present) //1 <= PQUANT <= 7 //ESCLVLSZ VLC Level codeword size // 001 1 // 010 2 // 011 3 // 100 4 // 101 5 // 110 6 // 111 7 // 00000 8 // 00001 9 // 00010 10 // 00011 11 //it is not used, because esier get FLC 3 or 5 bits length const extern int32_t VC1_EscapeMode3Conservative_tbl[]; //VC-1 Table 59: Escape mode 3 level codeword size efficient code-table (used for 8 <= PQUANT <= 31 and if //VOPDQUANT is absent) //8 <= PQUANT <= 31 //ESCLVLSZ VLC Level codeword size // 1 2 // 01 3 // 001 4 // 0001 5 // 00001 6 // 000001 7 // 000000 8 //it is not used for while, const extern int32_t VC1_EscapeMode3Efficient_tbl[]; //VC-1 Table 68: IMODE Codetable //CODING MODE CODEWORD //Raw 0000 //Norm-2 10 //Diff-2 001 //Norm-6 11 //Diff-6 0001 //Rowskip 010 //Colskip 011 const extern int32_t VC1_Bitplane_IMODE_tbl[]; //VC-1 Table 81: Code table for 3x2 and 2x3 tiles const extern int32_t VC1_BitplaneTaledbitsTbl[]; //VC-1 7.1.1.14 Table 40 const extern int32_t VC1_BFraction_tbl[]; const extern int32_t VC1_BFraction_indexes[8][9]; #endif //__umc_vc1_common_tables_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_tables_adv.h000066400000000000000000000026611443134507600347200ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_COMMON_TABLES_ADV_H__ #define __UMC_VC1_COMMON_TABLES_ADV_H__ #include "umc_vc1_common_defs.h" //VC-1 Table 107: Refdist table const extern int32_t VC1_FieldRefdistTable[]; #endif //__umc_vc1_common_tables_ADV_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_spl_frame_constr.h000066400000000000000000000060171443134507600346030ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_SPL_FRAME_CONSTR_H__ #define __UMC_VC1_SPL_FRAME_CONSTR_H__ #include "umc_media_data_ex.h" #include "umc_structures.h" namespace UMC { struct VC1FrameConstrInfo { MediaData* in; MediaData* out; MediaDataEx::_MediaDataEx *stCodes; uint32_t splMode; }; class vc1_frame_constructor { public: vc1_frame_constructor(){}; virtual ~vc1_frame_constructor(){}; virtual Status GetNextFrame(VC1FrameConstrInfo& pInfo) = 0; //return 1 frame, 1 header.... virtual Status GetFirstSeqHeader(VC1FrameConstrInfo& pInfo) = 0; virtual Status GetData(VC1FrameConstrInfo& pInfo) = 0; virtual Status ParseVC1SeqHeader (uint8_t *data, uint32_t* bufferSize, VideoStreamInfo* info) = 0; virtual void Reset() = 0; }; class vc1_frame_constructor_rcv: public vc1_frame_constructor { public: vc1_frame_constructor_rcv(); ~vc1_frame_constructor_rcv(); Status GetNextFrame(VC1FrameConstrInfo& Info); Status GetData(VC1FrameConstrInfo& Info); Status GetFirstSeqHeader(VC1FrameConstrInfo& Info); void Reset(); Status ParseVC1SeqHeader (uint8_t *data, uint32_t* bufferSize, VideoStreamInfo* info); }; class vc1_frame_constructor_vc1: public vc1_frame_constructor { public: vc1_frame_constructor_vc1(); ~vc1_frame_constructor_vc1(); Status GetNextFrame(VC1FrameConstrInfo& Info); Status GetData(VC1FrameConstrInfo& Info); Status GetFirstSeqHeader(VC1FrameConstrInfo& Info); void Reset(); Status ParseVC1SeqHeader (uint8_t *data, uint32_t* bufferSize, VideoStreamInfo* info); }; } #endif//__UMC_VC1_SPL_FRAME_CONSTR_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/include/umc_vc1_spl_tbl.h000066400000000000000000000030501443134507600327530ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #ifndef __UMC_VC1_SPL_TBL_H__ #define __UMC_VC1_SPL_TBL_H__ #include "ippdefs.h" typedef struct { uint16_t width; uint16_t height; }AspectRatio; extern AspectRatio AspectRatioTable[16]; extern double FrameRateNumerator[256]; extern double FrameRateDenomerator[16]; extern uint32_t bMax_LevelLimits[4][5]; #endif //__UMC_VC1_SPL_TBL_H__ #endif //MFX_ENABLE_VC1_VIDEO_CODEC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src/000077500000000000000000000000001443134507600266745ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src/umc_vc1_common.cpp000066400000000000000000000036411443134507600323110ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #include "umc_vc1_common.h" namespace UMC { namespace VC1Common { void SwapData(uint8_t *src, uint32_t dataSize) { uint32_t i; uint32_t counter = 0; uint32_t* pDst = (uint32_t*)src; uint32_t iCur = 0; for(i = 0; i < dataSize+4; i++) { if (4 == counter) { counter = 0; *pDst = iCur; pDst++; iCur = 0; } if (0 == counter) iCur = src[i]; iCur <<= 8; iCur |= (uint32_t)src[i]; ++counter; } } } } #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_tables.cpp000066400000000000000000000232051443134507600335620ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #include "umc_vc1_common_tables.h" #include "umc_vc1_common_defs.h" //VC-1 Table 58: Escape mode 3 level codeword size conservative code-table //(used for 1 <= PQUANT <= 7 or if //VOPDQUANT is present) //1 <= PQUANT <= 7 //ESCLVLSZ VLC Level codeword size // 001 1 // 010 2 // 011 3 // 100 4 // 101 5 // 110 6 // 111 7 // 00000 8 // 00001 9 // 00010 10 // 00011 11 //it is not used, because esier get FLC 3 or 5 bits length const extern int32_t VC1_EscapeMode3Conservative_tbl[] = { 5, /* max bits */ 2, /* total subtables */ 3 ,2,/* subtable sizes */ 0, /* 1-bit codes */ 0, /* 2-bit codes */ 7, /* 3-bit codes */ 1,1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 0, /* 4-bit codes */ 4, /* 5-bit codes */ 0,8, 1,9, 2,10, 3,11, -1 }; //VC-1 Table 59: Escape mode 3 level codeword size efficient code-table //(used for 8 <= PQUANT <= 31 and if //VOPDQUANT is absent) //8 <= PQUANT <= 31 //ESCLVLSZ VLC Level codeword size // 1 2 // 01 3 // 001 4 // 0001 5 // 00001 6 // 000001 7 // 000000 8 //it is not used for while, const extern int32_t VC1_EscapeMode3Efficient_tbl[] = { 6, /* max bits */ 2, /* total subtables */ 5 ,1,/* subtable sizes */ 1, /* 1-bit codes */ 1, 2, 1, /* 2-bit codes */ 1, 3, 1, /* 3-bit codes */ 1, 4, 1, /* 4-bit codes */ 1, 5, 1, /* 5-bit codes */ 1, 6, 2, /* 6-bit codes */ 0, 8, 1, 7, -1 }; //VC-1 Table 68: IMODE Codetable //CODING MODE CODEWORD //Raw 0000 //Norm-2 10 //Diff-2 001 //Norm-6 11 //Diff-6 0001 //Rowskip 010 //Colskip 011 const extern int32_t VC1_Bitplane_IMODE_tbl[] = { 4, /* max bits */ 1, /* total subtables */ 4, /* subtable sizes */ 0, /* 1-bit codes */ 2, /* 2-bit codes */ 2, VC1_BITPLANE_NORM2_MODE, 3, VC1_BITPLANE_NORM6_MODE, 3, /* 3-bit codes */ 1, VC1_BITPLANE_DIFF2_MODE, 2, VC1_BITPLANE_ROWSKIP_MODE, 3, VC1_BITPLANE_COLSKIP_MODE, 2, /* 4-bit codes */ 0, VC1_BITPLANE_RAW_MODE, 1, VC1_BITPLANE_DIFF6_MODE, -1 }; //VC-1 Table 81: Code table for 3x2 and 2x3 tiles //VLC / Escape symbol Followed by //k Codeword Codelength Codeword Codelength //0 1 1 //1 2 4 //2 3 4 //4 4 4 //8 5 4 //16 6 4 //32 7 4 //3 0 8 //5 1 8 //6 2 8 //9 3 8 //10 4 8 //12 5 8 //17 6 8 //18 7 8 //20 8 8 //24 9 8 //33 10 8 //34 11 8 //36 12 8 //40 13 8 //48 14 8 //11 2 5 11 5 = (1 << 6)| 11 10 //7 2 5 7 5 = (1 << 6)| 7 10 //13 2 5 13 5 = (1 << 6)| 13 10 //14 2 5 14 5 = (1 << 6)| 14 10 //19 2 5 19 5 = (1 << 6)| 19 10 //21 2 5 21 5 = (1 << 6)| 21 10 //22 2 5 22 5 = (1 << 6)| 22 10 //25 2 5 25 5 = (1 << 6)| 25 10 //26 2 5 26 5 = (1 << 6)| 26 10 //28 2 5 28 5 = (1 << 6)| 28 10 //35 2 5 3 5 = (1 << 6)| 3 10 //37 2 5 5 5 = (1 << 6)| 5 10 //38 2 5 6 5 = (1 << 6)| 6 10 //41 2 5 9 5 = (1 << 6)| 9 10 //42 2 5 10 5 = (1 << 6)| 10 10 //44 2 5 12 5 = (1 << 6)| 12 10 //49 2 5 17 5 = (1 << 6)| 17 10 //50 2 5 18 5 = (1 << 6)| 18 10 //52 2 5 20 5 = (1 << 6)| 20 10 //56 2 5 24 5 = (1 << 6)| 24 10 //63 3 5 1 1 = (3 << 1)| 1 6 //31 3 5 7 4 = (3 << 4)| 7 9 //47 3 5 6 4 = (3 << 4)| 6 9 //55 3 5 5 4 = (3 << 4)| 5 9 //59 3 5 4 4 = (3 << 4)| 4 9 //61 3 5 3 4 = (3 << 4)| 3 9 //62 3 5 2 4 = (3 << 4)| 2 9 //15 3 5 14 8 = (3 << 8)| 14 13 //23 3 5 13 8 = (3 << 8)| 13 13 //27 3 5 12 8 = (3 << 8)| 12 13 //29 3 5 11 8 = (3 << 8)| 11 13 //30 3 5 10 8 = (3 << 8)| 10 13 //39 3 5 9 8 = (3 << 8)| 9 13 //43 3 5 8 8 = (3 << 8)| 8 13 //45 3 5 7 8 = (3 << 8)| 7 13 //46 3 5 6 8 = (3 << 8)| 6 13 //51 3 5 5 8 = (3 << 8)| 5 13 //53 3 5 4 8 = (3 << 8)| 4 13 //54 3 5 3 8 = (3 << 8)| 3 13 //57 3 5 2 8 = (3 << 8)| 2 13 //58 3 5 1 8 = (3 << 8)| 1 13 //60 3 5 0 8 = (3 << 8)| 0 13 const extern int32_t VC1_BitplaneTaledbitsTbl[] = { 13, /* max bits */ 2, /* total subtables */ 6,7,/* subtable sizes */ 1, /* 1-bit codes */ 1, 0 , 0, /* 2-bit codes */ 0, /* 3-bit codes */ 6, /* 4-bit codes */ 2, 1, 3, 2, 4, 4, 5, 8, 6, 16, 7, 32, 0, /* 5-bit codes */ 1, /* 6-bit codes */ (3 << 1)| 1, 63, 0, /* 7-bit codes */ 15, /* 8-bit codes */ 0, 3, 1, 5, 2, 6, 3, 9, 4, 10, 5, 12, 6, 17, 7, 18, 8, 20, 9, 24, 10, 33, 11, 34, 12, 36, 13, 40, 14, 48, 6, /* 9-bit codes */ (3 << 4)| 7, 31, (3 << 4)| 6, 47, (3 << 4)| 5, 55, (3 << 4)| 4, 59, (3 << 4)| 3, 61, (3 << 4)| 2, 62, 20, /* 10-bit codes */ (1 << 6)| 11, 11, (1 << 6)| 7, 7 , (1 << 6)| 13, 13, (1 << 6)| 14, 14, (1 << 6)| 19, 19, (1 << 6)| 21, 21, (1 << 6)| 22, 22, (1 << 6)| 25, 25, (1 << 6)| 26, 26, (1 << 6)| 28, 28, (1 << 6)| 3, 35, (1 << 6)| 5, 37, (1 << 6)| 6, 38, (1 << 6)| 9, 41, (1 << 6)| 10, 42, (1 << 6)| 12, 44, (1 << 6)| 17, 49, (1 << 6)| 18, 50, (1 << 6)| 20, 52, (1 << 6)| 24, 56, 0, /* 11-bit codes */ 0, /* 12-bit codes */ 15, /* 13-bit codes */ (3 << 8)| 14, 15, (3 << 8)| 13, 23, (3 << 8)| 12, 27, (3 << 8)| 11, 29, (3 << 8)| 10, 30, (3 << 8)| 9, 39, (3 << 8)| 8, 43, (3 << 8)| 7, 45, (3 << 8)| 6, 46, (3 << 8)| 5, 51, (3 << 8)| 4, 53, (3 << 8)| 3, 54, (3 << 8)| 2, 57, (3 << 8)| 1, 58, (3 << 8)| 0, 60, -1 }; const extern int32_t VC1_BFraction_tbl[]= { 7, /* max bits */ 2, /* total subtables */ 3,4, /* subtable sizes */ 0, /* 1-bit codes */ 0, /* 2-bit codes */ 7, /* 3-bit codes */ 0x00,1,2, 0x01,1,3, 0x02,2,3, 0x03,1,4, 0x04,3,4, 0x05,1,5, 0x06,2,5, 0, /* 4-bit codes */ 0, /* 5-bit codes */ 0, /* 6-bit codes */ 16, /* 7-bit codes */ 0x70, 3,5, 0x71, 4,5, 0x72, 1,6, 0x73, 5,6, 0x74, 1,7, 0x75, 2,7, 0x76, 3,7, 0x77, 4,7, 0x78, 5,7, 0x79, 6,7, 0x7A, 1,8, 0x7B, 3,8, 0x7C, 5,8, 0x7D, 7,8, 0x7E, VC1_BRACTION_INVALID,VC1_BRACTION_INVALID, 0x7F, VC1_BRACTION_BI, VC1_BRACTION_BI, -1 }; const extern int32_t VC1_BFraction_indexes[8][9] = { /* 21 is an invalid index */ /* 0 1 2 3 4 5 6 7 8*/ /* 0 */ {21, 21, 21, 21, 21, 21, 21, 21, 21}, /* 1 */ {21, 21, 0, 1, 3, 5, 9, 11, 17}, /* 2 */ {21, 21, 21, 2, 21, 6, 21, 12, 21}, /* 3 */ {21, 21, 21, 21, 4, 7, 21, 13, 18}, /* 4 */ {21, 21, 21, 21, 21, 8, 21, 14, 21}, /* 5 */ {21, 21, 21, 21, 21, 21, 10, 15, 19}, /* 6 */ {21, 21, 21, 21, 21, 21, 21, 16, 21}, /* 7 */ {21, 21, 21, 21, 21, 21, 21, 21, 20} }; ////////////////////////////////////////// /////////////////////////////////////////// #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_common_tables_adv.cpp000066400000000000000000000054041443134507600344150ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #include "umc_vc1_common_tables_adv.h" #include "umc_vc1_common_defs.h" //VC-1 Table 107: Refdist table // REFDIST VLC VLC // Size // 0 2 0 // 1 2 1 // 2 2 2 // 3 3 6 // 4 4 14 // 5 5 30 // 6 6 62 // 7 7 126 // 8 8 254 // 9 9 510 // 10 10 1022 // 11 11 2046 // 12 12 4094 // 13 13 8190 // 14 14 16382 // 15 15 32766 // 16 16 65534 const extern int32_t VC1_FieldRefdistTable[] = { 16, /* max bits */ 3, /* total subtables */ 5, 6, 5,/* subtable sizes */ 0, /* 1-bit codes */ 3, /* 2-bit codes */ 0, 0, 1, 1, 2, 2, 1, /* 3-bit codes */ 6,3, 1, /* 4-bit codes */ 14, 4, 1, /* 5-bit codes */ 30, 5, 1, /* 6-bit codes */ 62, 6, 1, /* 7-bit codes */ 126, 7, 1, /* 8-bit codes */ 254, 8, 1, /* 9-bit codes */ 510, 9, 1, /* 10-bit codes */ 1022, 10, 1, /* 11-bit codes */ 2046, 11, 1, /* 12-bit codes */ 4094, 12, 1, /* 13-bit codes */ 8190, 13, 1, /* 14-bit codes */ 16382, 14, 1, /* 15-bit codes */ 32766, 15, 1, /* 16-bit codes */ 65534, 16, -1 /* end of table */ }; #endif //MFX_ENABLE_VC1_VIDEO_CODEC umc_vc1_spl_frame_constr.cpp000066400000000000000000000671371443134507600343140ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #include "umc_vc1_spl_frame_constr.h" #include "umc_vc1_spl_tbl.h" #include "umc_vc1_common_macros_defs.h" #include "umc_vc1_common.h" #include "umc_vc1_common_defs.h" namespace UMC { using namespace VC1Common; vc1_frame_constructor_rcv::vc1_frame_constructor_rcv() { } vc1_frame_constructor_rcv::~vc1_frame_constructor_rcv() { } void vc1_frame_constructor_rcv::Reset() { } Status vc1_frame_constructor_rcv::GetNextFrame(VC1FrameConstrInfo& Info) { UMC::Status umcSts = UMC_ERR_NOT_ENOUGH_DATA; uint32_t frameSize = 0; if((uint32_t)Info.in->GetBufferSize() == 0) { if((uint32_t)Info.out->GetDataSize() == 0) return UMC_ERR_END_OF_STREAM; else return UMC_OK; } if((uint32_t)Info.out->GetDataSize() == 0) { if((uint32_t)Info.in->GetDataSize() < (uint32_t)Info.in->GetBufferSize() - 4) { uint8_t* curr_pos = ((uint8_t*)Info.in->GetBufferPointer()+(uint32_t)Info.in->GetDataSize()); frameSize = ((*(curr_pos+3))<<24) + ((*(curr_pos+2))<<16) + ((*(curr_pos+1))<<8) + *(curr_pos); frameSize &= 0x0fffffff; frameSize += 8; if ((uint32_t)Info.out->GetBufferSize() < frameSize) return UMC_ERR_NOT_ENOUGH_BUFFER; Info.out->SetBufferPointer((uint8_t*)Info.out->GetBufferPointer(),frameSize); } else { uint8_t* buf = (uint8_t*)Info.in->GetBufferPointer(); uint8_t* data = (uint8_t*)Info.in->GetBufferPointer() + (uint32_t)Info.in->GetDataSize(); MFX_INTERNAL_CPY(buf, data, (uint32_t)Info.in->GetBufferSize() - (uint32_t)Info.in->GetDataSize()); Info.in->SetDataSize((uint32_t)Info.in->GetBufferSize() - (uint32_t)Info.in->GetDataSize()); return UMC_ERR_NOT_ENOUGH_DATA; } } umcSts = GetData(Info); Info.stCodes->values[0] = 0x0D010000; Info.stCodes->offsets[0] = 0; return umcSts; } // turn off the "unreferenced formal parameter" warning #ifdef _MSVC_LANG #pragma warning(disable : 4100) #endif Status vc1_frame_constructor_rcv::GetData(VC1FrameConstrInfo& Info) { if ((uint32_t)Info.out->GetBufferSize() < (uint32_t)Info.out->GetDataSize()) return UMC_ERR_NOT_ENOUGH_BUFFER; uint32_t readDataSize = (uint32_t)Info.in->GetDataSize(); uint32_t readBufSize = (uint32_t)Info.in->GetBufferSize(); uint8_t* readBuf = (uint8_t*)Info.in->GetBufferPointer(); uint32_t currFrameSize = (uint32_t)Info.out->GetDataSize(); uint8_t* currFramePos = (uint8_t*)Info.out->GetBufferPointer() + currFrameSize; uint32_t frameSize = (uint32_t)Info.out->GetBufferSize(); if(currFrameSize + readBufSize - readDataSize <= frameSize ) { MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, readBufSize - readDataSize); Info.out->SetDataSize(currFrameSize + readBufSize - readDataSize); Info.in->SetDataSize(0); return UMC_ERR_NOT_ENOUGH_DATA; } else { MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, frameSize - currFrameSize); Info.out->SetDataSize(frameSize); Info.in->SetDataSize(readDataSize + frameSize - currFrameSize); return UMC_OK; } } Status vc1_frame_constructor_rcv::ParseVC1SeqHeader (uint8_t *data, uint32_t* bufferSize, VideoStreamInfo* video_info) { UMC::Status umcSts = UMC_OK; uint32_t tempData; (void) tempData; uint32_t * pbs; int32_t bitOffset = 31; pbs = (uint32_t *)data; *bufferSize = 0; video_info->streamPID = 0; video_info->stream_type = VC1_VIDEO; video_info->stream_subtype = VC1_VIDEO_RCV; video_info->interlace_type = PROGRESSIVE; video_info->framerate = 0; video_info->bitrate = 0; video_info->duration = 0; video_info->color_format = YUV420; //Simple/main profile video_info->aspect_ratio_width = 1; video_info->aspect_ratio_height = 1; //PROFILE VC1GetNBits(pbs, bitOffset, 2, tempData); //Simple/Main profile //LEVEL VC1GetNBits(pbs, bitOffset, 2, tempData); //FRMRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 3, video_info->framerate); //BITRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 5, video_info->bitrate); //LOOPFILTER VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //MULTIRES VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //FASTUVMC VC1GetNBits(pbs, bitOffset, 1, tempData); //EXTENDED_MV VC1GetNBits(pbs, bitOffset, 1, tempData); //DQUANT VC1GetNBits(pbs, bitOffset, 2, tempData); //VSTRANSFORM VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //OVERLAP VC1GetNBits(pbs, bitOffset, 1, tempData); //SYNCMARKER VC1GetNBits(pbs, bitOffset, 1, tempData); //RANGERED VC1GetNBits(pbs, bitOffset, 1, tempData); //MAXBFRAMES VC1GetNBits(pbs, bitOffset, 3, tempData); //QUANTIZER VC1GetNBits(pbs, bitOffset, 2, tempData); //FINTERPFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); //last bit in seq header VC1GetNBits(pbs, bitOffset, 1, tempData); *bufferSize = (video_info->clip_info.height+15 +128)* (video_info->clip_info.width + 15 + 128) + (((video_info->clip_info.height+15)/2 + 64)* ((video_info->clip_info.width +15)/2 + 64))*2; video_info->bitrate = 1024 * video_info->bitrate; return umcSts; } Status vc1_frame_constructor_rcv::GetFirstSeqHeader(VC1FrameConstrInfo& Info) { UMC::Status umcSts = UMC_ERR_NOT_ENOUGH_DATA; uint32_t frameSize = 4; uint8_t* ptemp = (uint8_t*)Info.in->GetBufferPointer() + 4; uint32_t temp_size = ((*(ptemp+3))<<24) + ((*(ptemp+2))<<16) + ((*(ptemp+1))<<8) + *(ptemp); frameSize+= temp_size; frameSize+=12; ptemp = (uint8_t*)Info.in->GetBufferPointer() + frameSize; temp_size = ((*(ptemp+3))<<24) + ((*(ptemp+2))<<16) + ((*(ptemp+1))<<8) + *(ptemp); frameSize+= temp_size; frameSize+=4; Info.out->SetBufferPointer((uint8_t*)Info.out->GetBufferPointer(),frameSize); umcSts = GetData(Info); return umcSts; } /////////////////////////////////////////////////////////////////////////////////////////// vc1_frame_constructor_vc1::vc1_frame_constructor_vc1() { } vc1_frame_constructor_vc1::~vc1_frame_constructor_vc1() { } Status vc1_frame_constructor_vc1::GetNextFrame(VC1FrameConstrInfo& Info) { UMC::Status umcSts = UMC_ERR_NOT_ENOUGH_DATA; umcSts = GetData(Info); return umcSts; } Status vc1_frame_constructor_vc1::GetData(VC1FrameConstrInfo& Info) { uint32_t readDataSize = (uint32_t)Info.in->GetDataSize(); uint32_t readBufSize = (uint32_t)Info.in->GetBufferSize(); uint8_t* readBuf = (uint8_t*)Info.in->GetBufferPointer(); uint8_t* readPos = readBuf + (uint32_t)Info.in->GetDataSize(); uint32_t frameSize = (uint32_t)Info.out->GetDataSize(); uint8_t* currFramePos = (uint8_t*)Info.out->GetBufferPointer() + frameSize; uint32_t frameBufSize = (uint32_t)Info.out->GetBufferSize(); uint8_t* ptr = currFramePos; uint32_t zeroNum = 0; int32_t size = 0; uint32_t a = 0x0000FF00 | (*readPos); uint32_t b = 0xFFFFFFFF; while(readPos < (readBuf + readBufSize)) { if (Info.stCodes->count > 512) return UMC_ERR_INVALID_STREAM; //find sequence of 0x000001 or 0x000003 while(!( b == 0x00000001 || b == 0x00000003 ) &&(++readPos < (readBuf + readBufSize))) { a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; } //check end of read buffer if(readPos < (readBuf + readBufSize - 1)) { if(*readPos == 0x01) { if((*(readPos + 1) == VC1_Slice) || (*(readPos + 1) == VC1_Field) || IS_VC1_USER_DATA(*(readPos + 1))) { readPos+=2; ptr = readPos - 5; if (Info.splMode != 2) { //trim zero bytes while ( (*ptr==0) && (ptr > readBuf) ) ptr--; } //slice or field size size = (uint32_t)(ptr - readBuf - readDataSize+1); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); currFramePos = currFramePos + size; frameSize = frameSize + size; if (Info.splMode == 1) { zeroNum = frameSize - 4*((frameSize)/4); if(zeroNum!=0) zeroNum = 4 - zeroNum; memset(currFramePos, 0, zeroNum); } //set write parameters currFramePos = currFramePos + zeroNum; frameSize = frameSize + zeroNum; Info.stCodes->offsets[Info.stCodes->count] = frameSize; //stCodes->values[stCodes->count] =*(uint32_t*)(readPos - 4); Info.stCodes->values[Info.stCodes->count] = ((*(readPos-1))<<24) + ((*(readPos-2))<<16) + ((*(readPos-3))<<8) + (*(readPos-4)); readDataSize = (uint32_t)(readPos - readBuf - 4); a = 0x00010b00 |(int32_t)(*readPos); b = a & 0x00FFFFFF; zeroNum = 0; Info.stCodes->count++; } else if(Info.stCodes->count != 0) { //end of frame readPos = readPos - 2; ptr = readPos - 1; //trim zero bytes if (Info.splMode != 2) { while ( (*ptr==0) && (ptr > readBuf) ) ptr--; } //slice or field size size = (uint32_t)(ptr - readBuf - readDataSize +1); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); currFramePos = currFramePos + size; frameSize = frameSize + size; memset(currFramePos,0,frameBufSize - frameSize); Info.out->SetDataSize(frameSize); //prepare read buffer size = (uint32_t)(readPos - readBuf - readDataSize); readDataSize = readDataSize + size; Info.in->SetDataSize(readDataSize); return UMC_OK; } else { //beginning of frame readPos++; a = 0x00000100 |(int32_t)(*readPos); b = a & 0x00FFFFFF; //end of sequence if((((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3))) == 0x0A010000) { size = (uint32_t)(readPos- readBuf - readDataSize + 1); MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); Info.out->SetDataSize(frameSize + size); Info.in->SetDataSize(Info.in->GetDataSize() + size); Info.stCodes->offsets[Info.stCodes->count] = (uint32_t)(0); Info.stCodes->values[Info.stCodes->count] = ((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3)); Info.stCodes->count++; zeroNum = 0; size = (uint32_t)(readPos - readBuf - readDataSize - 3); readDataSize = readDataSize + size; return UMC_OK; } Info.stCodes->offsets[Info.stCodes->count] = (uint32_t)(0); Info.stCodes->values[Info.stCodes->count] = ((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3)); Info.stCodes->count++; zeroNum = 0; size = (uint32_t)(readPos - readBuf - readDataSize - 3); readDataSize = readDataSize + size; } } else //if(*readPos == 0x03) { //000003 if((*(readPos + 1) < 0x04) && (Info.splMode == 1)) { size = (uint32_t)(readPos - readBuf - readDataSize); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); frameSize = frameSize + size; currFramePos = currFramePos + size; zeroNum = 0; readPos++; a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; readDataSize = readDataSize + size + 1; } else { readPos++; a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; } } } else //if (readPos >= (readBuf + readBufSize - 1 )) { if(readBufSize > 4) { readPos = readBuf + readBufSize; size = (uint32_t)(readBufSize - readDataSize - 4); if(size >= 0) { if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); Info.out->SetDataSize(frameSize + size); if (Info.splMode != 2) { ptr = readBuf; *ptr = *(readPos - 4); ptr++; *ptr = *(readPos - 3); ptr++; *ptr = *(readPos - 2); ptr++; *ptr = *(readPos - 1); Info.in->SetDataSize(4); } } else { Info.out->SetDataSize(frameSize); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(readBuf, readBuf + readDataSize, readBufSize - readDataSize); Info.in->SetDataSize(readBufSize - readDataSize); } return UMC_ERR_NOT_ENOUGH_DATA; } else { //end of stream size = (uint32_t)(readPos- readBuf - readDataSize); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); Info.out->SetDataSize(frameSize + size); Info.in->SetDataSize(size); return UMC_OK; } } } //field or slice start code if(frameSize + 4 > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; if(readBufSize > readDataSize) { std::copy(readPos - 4, readPos, currFramePos); Info.out->SetDataSize(frameSize + 4); Info.in->SetDataSize(0); return UMC_ERR_NOT_ENOUGH_DATA; } else return UMC_ERR_END_OF_STREAM; } void vc1_frame_constructor_vc1::Reset() { } Status vc1_frame_constructor_vc1::ParseVC1SeqHeader (uint8_t *data, uint32_t* bufferSize, VideoStreamInfo* video_info) { UMC::Status umcSts = UMC_OK; uint32_t tempData; uint32_t tempData1; uint32_t i=0; uint32_t *pbs; int32_t bitOffset = 31; pbs = (uint32_t *)data; *bufferSize = 0; video_info->streamPID = 0; video_info->stream_type = VC1_VIDEO; video_info->stream_subtype = VC1_VIDEO_VC1; video_info->interlace_type = PROGRESSIVE; video_info->framerate = 0.0; video_info->bitrate = 0; video_info->duration = 0; video_info->color_format = YUV420; video_info->clip_info.height = 0; video_info->clip_info.width = 0; //default value for advanced profile //Simple/main profile video_info->aspect_ratio_width = 1; video_info->aspect_ratio_height = 1; //PROFILE VC1GetNBits(pbs, bitOffset, 2, tempData); if(tempData == VC1_PROFILE_ADVANCED) //PROFILE { uint32_t framerate; //LEVEL VC1GetNBits(pbs, bitOffset, 3, tempData); //CHROMAFORMAT VC1GetNBits(pbs, bitOffset, 2,tempData); //FRMRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 3, framerate); //BITRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 5, video_info->bitrate); //for advanced profile if ((framerate == 0) && (video_info->bitrate == 31)) { //Post processing indicators for Frame Rate and Bit Rate are undefined video_info->bitrate = 0; video_info->framerate = 0.0; } else if ((framerate == 0) && (video_info->bitrate == 30)) { video_info->framerate = 2.0; video_info->bitrate = 1952; } else if ((framerate == 1) && (video_info->bitrate == 31)) { video_info->framerate = 6.0; video_info->bitrate = 2016; } else { if (framerate == 7) video_info->framerate = 30.0; else video_info->framerate = (2.0 + (double)framerate*4); if (video_info->bitrate == 31) video_info->bitrate = 2016; else video_info->bitrate = (32 + video_info->bitrate * 64); } //POSTPROCFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); //MAX_CODED_WIDTH VC1GetNBits(pbs, bitOffset, 12, video_info->clip_info.width); video_info->clip_info.width = (video_info->clip_info.width +1)*2; //MAX_CODED_HEIGHT VC1GetNBits(pbs, bitOffset, 12, video_info->clip_info.height); video_info->clip_info.height = (video_info->clip_info.height + 1)*2; //PULLDOWN VC1GetNBits(pbs, bitOffset, 1, tempData); //INTERLACE VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) video_info->interlace_type = INTERLEAVED_TOP_FIELD_FIRST; //TFCNTRFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); //FINTERPFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 2, tempData); //DISPLAY_EXT VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) //DISPLAY_EXT { //DISP_HORIZ_SIZE VC1GetNBits(pbs, bitOffset, 14,tempData); //DISP_VERT_SIZE VC1GetNBits(pbs, bitOffset, 14,tempData); //ASPECT_RATIO_FLAG VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //ASPECT_RATIO_FLAG { //ASPECT_RATIO VC1GetNBits(pbs, bitOffset, 4,tempData); if(tempData == 15) { //ASPECT_HORIZ_SIZE VC1GetNBits(pbs, bitOffset, 8, video_info->aspect_ratio_width); //ASPECT_VERT_SIZE VC1GetNBits(pbs, bitOffset, 8, video_info->aspect_ratio_height); } else { video_info->aspect_ratio_width = AspectRatioTable[tempData].width; video_info->aspect_ratio_height = AspectRatioTable[tempData].height; } } //FRAMERATE_FLAG VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //FRAMERATE_FLAG { //FRAMERATEIND VC1GetNBits(pbs, bitOffset, 1,tempData); if(!tempData) //FRAMERATEIND { //FRAMERATENR VC1GetNBits(pbs, bitOffset, 8,tempData); video_info->framerate = FrameRateNumerator[tempData]; //FRAMERATEDR VC1GetNBits(pbs, bitOffset, 4,tempData); video_info->framerate = video_info->framerate/FrameRateDenomerator[tempData]; } else { //FRAMERATEEXP VC1GetNBits(pbs, bitOffset, 16,tempData); video_info->framerate = (tempData + 1)/32.0; } } //COLOR_FORMAT_FLAG VC1GetNBits(pbs, bitOffset, 1,tempData); if(tempData) //COLOR_FORMAT_FLAG { //COLOR_PRIM VC1GetNBits(pbs, bitOffset, 8,tempData); //TRANSFER_CHAR VC1GetNBits(pbs, bitOffset, 8,tempData); //MATRIX_COEF VC1GetNBits(pbs, bitOffset, 8,tempData); } } ////HRD_PARAM_FLAG VC1GetNBits(pbs, bitOffset, 1, tempData); if(tempData) //HRD_PARAM_FLAG { //HRD_NUM_LEAKY_BUCKETS VC1GetNBits(pbs, bitOffset, 5,tempData1); //BIT_RATE_EXPONENT VC1GetNBits(pbs, bitOffset, 4,tempData); //BUFFER_SIZE_EXPONENT VC1GetNBits(pbs, bitOffset, 4,tempData); //!!!!!! for(i=0; i < tempData1; i++)//HRD_NUM_LEAKY_BUCKETS { //HRD_RATE[i] VC1GetNBits(pbs, bitOffset, 16,tempData); //HRD_BUFFER[i] VC1GetNBits(pbs, bitOffset, 16,tempData); } } } else { //Simple/Main profile //LEVEL VC1GetNBits(pbs, bitOffset, 2, tempData); //FRMRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 3, video_info->framerate); //BITRTQ_POSTPROC VC1GetNBits(pbs, bitOffset, 5, video_info->bitrate); //LOOPFILTER VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //MULTIRES VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //FASTUVMC VC1GetNBits(pbs, bitOffset, 1, tempData); //EXTENDED_MV VC1GetNBits(pbs, bitOffset, 1, tempData); //DQUANT VC1GetNBits(pbs, bitOffset, 2, tempData); //VSTRANSFORM VC1GetNBits(pbs, bitOffset, 1, tempData); //reserved VC1GetNBits(pbs, bitOffset, 1, tempData); //OVERLAP VC1GetNBits(pbs, bitOffset, 1, tempData); //SYNCMARKER VC1GetNBits(pbs, bitOffset, 1, tempData); //RANGERED VC1GetNBits(pbs, bitOffset, 1, tempData); //MAXBFRAMES VC1GetNBits(pbs, bitOffset, 3, tempData); //QUANTIZER VC1GetNBits(pbs, bitOffset, 2, tempData); //FINTERPFLAG VC1GetNBits(pbs, bitOffset, 1, tempData); } *bufferSize = (video_info->clip_info.height + 128)* (video_info->clip_info.width + 128) + ((video_info->clip_info.height/2 + 64)* (video_info->clip_info.width/2 + 64))*2; video_info->bitrate = 1024 * video_info->bitrate; return umcSts; } Status vc1_frame_constructor_vc1::GetFirstSeqHeader(VC1FrameConstrInfo& Info) { UMC::Status umcSts = UMC_ERR_NOT_ENOUGH_DATA; umcSts = GetData(Info); if(umcSts == UMC_OK && Info.stCodes->values[0] != 0x0F010000) { umcSts = UMC_ERR_NOT_ENOUGH_DATA; } return umcSts; } } #endif //MFX_ENABLE_VC1_VIDEO_CODEC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_common/src/umc_vc1_spl_tbl.cpp000066400000000000000000000054561443134507600324660ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_CODEC) #include "umc_vc1_spl_tbl.h" AspectRatio AspectRatioTable[16] = { {0, 0}, {1, 1}, {12, 11}, {10, 11}, {16, 11}, {40, 33}, {24, 11}, {20, 11}, {32, 11}, {80, 33}, {18, 11}, {15, 11}, {64, 33}, {169, 99}, {0, 0} }; double FrameRateNumerator[256] = { 0, 24000.0, 25000.0, 30000.0, 50000.0, 60000.0, 48000.0, 72000.0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; double FrameRateDenomerator[16] = { 0, 1000.0, 1001.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint32_t bMax_LevelLimits[4][5] = { { /* Simple Profile */ 20, /* Low Level */ 77, /* Medium Level */ 0, /* Hight Level */ 0, 0 }, { /* Main Profile */ 306, /* Low Level */ 611, /* Medium Level */ 2442, /* Hight Level */ 0, 0 }, { /* Reserved Profile */ 0,0,0,0,0 }, { /* Advanced Profile */ 250, /*L0 level*/ 1250, /*L1 level*/ 2500, /*L2 level*/ 5500, /*L3 level*/ 16500 } }; #endif //MFX_ENABLE_VC1_VIDEO_CODEC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/000077500000000000000000000000001443134507600253505ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/CMakeLists.txt000066400000000000000000000023611443134507600301120ustar00rootroot00000000000000add_library(vc1_dec STATIC) target_include_directories(vc1_dec PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_sources(vc1_dec PRIVATE src/umc_vc1_dec_bitplane.cpp src/umc_vc1_dec_bpic.cpp src/umc_vc1_dec_bpic_adv.cpp src/umc_vc1_dec_frame_descr.cpp src/umc_vc1_dec_frame_va.cpp src/umc_vc1_dec_ipic.cpp src/umc_vc1_dec_ipic_adv.cpp src/umc_vc1_dec_pic_com.cpp src/umc_vc1_dec_pic_com_adv.cpp src/umc_vc1_dec_ppic.cpp src/umc_vc1_dec_ppic_adv.cpp src/umc_vc1_dec_seq.cpp src/umc_vc1_dec_skipping.cpp src/umc_vc1_dec_task_store.cpp src/umc_vc1_dec_vopdq.cpp src/umc_vc1_huffman.cpp src/umc_vc1_video_decoder.cpp include/umc_vc1_dec_debug.h include/umc_vc1_dec_exception.h include/umc_vc1_dec_frame_descr.h include/umc_vc1_dec_frame_descr_va.h include/umc_vc1_dec_seq.h include/umc_vc1_dec_skipping.h include/umc_vc1_dec_task.h include/umc_vc1_dec_task_store.h include/umc_vc1_dec_va_defs.h include/umc_vc1_huffman.h include/umc_vc1_video_decoder.h ) target_link_libraries(vc1_dec PUBLIC mfx_static_lib color_space_converter vc1_common PRIVATE mfx_sdl_properties ) set_property(TARGET vc1_dec PROPERTY FOLDER "umc") oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/000077500000000000000000000000001443134507600267735ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_dec_debug.h000066400000000000000000000072531443134507600324710ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_DEBUG_H__ #define __UMC_VC1_DEC_DEBUG_H__ #include "umc_vc1_dec_seq.h" #include "vm_types.h" extern const uint32_t VC1_POSITION; // MB, Block positions, skip info extern const uint32_t VC1_CBP; // coded block patern info extern const uint32_t VC1_BITBLANES; // bitplane information extern const uint32_t VC1_QUANT; // transform types decoded info extern const uint32_t VC1_TT; // transform types decoded info extern const uint32_t VC1_MV; // motion vectors info extern const uint32_t VC1_PRED; // predicted blocks extern const uint32_t VC1_COEFFS; // DC, AC coefficiens extern const uint32_t VC1_RESPEL; // pixels befor filtering extern const uint32_t VC1_SMOOTHINT; // smoothing extern const uint32_t VC1_BFRAMES; // B frames log extern const uint32_t VC1_INTENS; // intesity compensation tables extern const uint32_t VC1_MV_BBL; // deblocking extern const uint32_t VC1_MV_FIELD; // motion vectors info for field pic extern const uint32_t VC1_DEBUG; //current debug output extern const uint32_t VC1_FRAME_DEBUG; //on/off frame debug extern const uint32_t VC1_FRAME_MIN; //first frame to debug extern const uint32_t VC1_FRAME_MAX; //last frame to debug extern const uint32_t VC1_TABLES; //VLC tables typedef enum { VC1DebugAlloc, VC1DebugFree, VC1DebugRoutine } VC1DebugWork; class VM_Debug { public: void vm_debug_frame(int32_t _cur_frame, int32_t level, const vm_char *format, ...); void print_bitplane(VC1Bitplane* pBitplane, int32_t width, int32_t height); static VM_Debug& GetInstance(VC1DebugWork typeWork) { static VM_Debug* singleton; switch (typeWork) { case VC1DebugAlloc: singleton = new VM_Debug; break; case VC1DebugRoutine: break; default: break; } return *singleton; } void Release() { delete this; } VM_Debug() { #ifdef VC1_DEBUG_ON Logthread0 = fopen("_Log0.txt","w"); Logthread1 = fopen("_Log1.txt","w"); assert(Logthread0 != NULL); assert(Logthread1 != NULL); #endif }; //only for Win debug ~VM_Debug() { #ifdef VC1_DEBUG_ON fclose(Logthread0); Logthread0 = NULL; fclose(Logthread1); Logthread1 = NULL; #endif }; private: #ifdef VC1_DEBUG_ON FILE* Logthread0; FILE* Logthread1; #endif }; #endif #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_dec_exception.h000066400000000000000000000063741443134507600333250ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_EXCEPTION_H_ #define __UMC_VC1_DEC_EXCEPTION_H_ namespace UMC { namespace VC1Exceptions { typedef enum { vld = 0, internal_pipeline_error = 1, invalid_stream = 2, mem_allocation_er = 3 } exception_type; // we have one class for VC1 exceptions but several types to simplify design typedef enum { max_decoding, // try to decode smart_recon, // diffrent schemes for reconstruction fast_decoding, // need for skip frames in cae of invalid streams fast_err_detect // signal about errors } robust_profile; typedef enum { mbOneLevel, // we change only bad MB mbGroupLevel, // we change MB quant FrameLevel // we change all frame (copy from reference) } SmartLevel; class vc1_exception { public: vc1_exception(exception_type type):m_ExceptType(type) { }; exception_type get_exception_type() { return m_ExceptType; } void set_exception_type(exception_type e_type) { m_ExceptType = e_type; } exception_type m_ExceptType; }; // vc1_except_profiler consist from current profile description class vc1_except_profiler { public: vc1_except_profiler(robust_profile profile, SmartLevel level): m_Profile(profile), m_SmartLevel(level) { } static vc1_except_profiler GetEnvDescript(robust_profile profile = max_decoding, SmartLevel level = mbOneLevel) { static vc1_except_profiler profiler(profile,level); return profiler; } robust_profile m_Profile; SmartLevel m_SmartLevel; }; } } #endif #endif umc_vc1_dec_frame_descr.h000066400000000000000000000151441443134507600335740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_FRAME_DESCR_H_ #define __UMC_VC1_DEC_FRAME_DESCR_H_ #include "vm_types.h" #include "umc_structures.h" #include "umc_vc1_common_defs.h" #include "umc_vc1_dec_seq.h" #include "umc_media_data_ex.h" #include "umc_va_base.h" #include "umc_memory_allocator.h" namespace UMC { class VC1TaskStore; class VC1TaskStoreSW; class VC1FrameDescriptor { friend class VC1TaskStore; friend class VC1TaskStoreSW; public: // Default constructor VC1FrameDescriptor(MemoryAllocator* pMemoryAllocator):m_pContext(NULL), m_ipContextID((MemID)-1), m_ipBufferStartID((MemID)-1), m_iPicHeaderID((MemID)-1), m_iBitplaneID((MemID)-1), m_iFrameCounter(0), m_bIsFieldAbsent(false), m_iSelfID(0), m_bIsReadyToLoad(true), m_iRefFramesDst(0), m_iBFramesDst(0), m_bIsReferenceReady(false), m_bIsReadyToDisplay(false), m_bIsBusy(false), m_bIsReadyToProcess(false), m_bIsSkippedFrame(false), m_pDiffMem(NULL), m_iActiveTasksInFirstField(0), m_pStore(NULL), m_pMemoryAllocator(NULL), m_iDiffMemID((MemID)-1), m_iInernBufferID((MemID)-1), m_iMemContextID((MemID)-1), m_bIsValidFrame(true), m_bIsSpecialBSkipFrame(false) { m_pMemoryAllocator = pMemoryAllocator; } virtual bool Init (uint32_t DescriporID, VC1Context* pContext, VC1TaskStore* pStore, int16_t* pResidBuf); virtual void Release(); void Reset(); virtual Status preProcData(VC1Context* pContext, uint32_t bufferSize, unsigned long long frameCount, bool& skip) = 0; bool isDescriptorValid() { return m_bIsValidFrame; } bool isEmpty() { return m_bIsReadyToLoad; } bool SetNewSHParams(VC1Context* pContext); virtual ~VC1FrameDescriptor() { Release(); } bool isSpecialBSkipFrame() { return m_bIsSpecialBSkipFrame; } // Just I/F needs virtual void PrepareVLDVABuffers(uint32_t* , uint32_t* , uint8_t* , MediaDataEx::_MediaDataEx* ){}; VC1Context* m_pContext; UMC::MemID m_ipContextID; UMC::MemID m_ipBufferStartID; UMC::MemID m_iPicHeaderID; UMC::MemID m_iBitplaneID; unsigned long long m_iFrameCounter; bool m_bIsFieldAbsent; protected: virtual Status SetPictureIndices (uint32_t PTYPE, bool& skip); uint32_t m_iSelfID; bool m_bIsReadyToLoad; int32_t m_iRefFramesDst; int32_t m_iBFramesDst; bool m_bIsReferenceReady; bool m_bIsReadyToDisplay; bool m_bIsBusy; bool m_bIsReadyToProcess; bool m_bIsSkippedFrame; int16_t* m_pDiffMem; int32_t m_iActiveTasksInFirstField; VC1TaskStore* m_pStore; MemoryAllocator* m_pMemoryAllocator; // (MemoryAllocator*) pointer to memory allocator UMC::MemID m_iDiffMemID; // diffrences memory UMC::MemID m_iInernBufferID; // diffrences memory UMC::MemID m_iMemContextID; bool m_bIsValidFrame; // no errors during decoding bool m_bIsSpecialBSkipFrame; }; } #endif //__umc_vc1_dec_frame_descr_H__ #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_dec_frame_descr_va.h000066400000000000000000002037341443134507600342660ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_FRAME_DESCR_VA_H_ #define __UMC_VC1_DEC_FRAME_DESCR_VA_H_ #include "umc_va_base.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_vc1_dec_exception.h" #include "umc_vc1_dec_task_store.h" namespace UMC { class VC1PackerLVA { public: VC1PackerLVA():m_va(NULL), m_pSliceInfo(NULL), m_pPicPtr(NULL), m_bIsPreviousSkip(false) { }; ~VC1PackerLVA(){} static void VC1PackPicParams (VC1Context* pContext, VAPictureParameterBufferVC1* ptr, VideoAccelerator* va); void VC1PackPicParamsForOneSlice(VC1Context* pContext) { VC1PackPicParams(pContext,m_pPicPtr,m_va); if (VC1_IS_REFERENCE(pContext->m_picLayerHeader->PTYPE)) m_bIsPreviousSkip = false; } void VC1PackOneSlice (VC1Context* pContext, SliceParams* slparams, uint32_t SliceBufIndex, uint32_t MBOffset, uint32_t SliceDataSize, uint32_t StartCodeOffset, uint32_t ChoppingType);//compatibility with Windows code void VC1PackWholeSliceSM (VC1Context* pContext, uint32_t MBOffset, uint32_t SliceDataSize); void VC1PackBitStreamForOneSlice (VC1Context* pContext, uint32_t Size); uint32_t VC1PackBitStream (VC1Context* pContext, uint32_t& Size, uint8_t* pOriginalData, uint32_t OriginalSize, uint32_t ByteOffset, uint8_t& Flag_03) { return VC1PackBitStreamAdv(pContext, Size, pOriginalData, OriginalSize, ByteOffset, Flag_03); } uint32_t VC1PackBitStreamAdv (VC1Context* pContext, uint32_t& Size,uint8_t* pOriginalData, uint32_t OriginalDataSize, uint32_t ByteOffset, uint8_t& Flag_03); void VC1PackBitplaneBuffers (VC1Context* pContext); void VC1SetSliceBuffer(){}; void VC1SetSliceParamBuffer(uint32_t* pOffsets, uint32_t* pValues); void VC1SetSliceDataBuffer(int32_t size); void VC1SetBitplaneBuffer(int32_t size); void VC1SetPictureBuffer(); void VC1SetBuffersSize (uint32_t SliceBufIndex); void VC1SetBuffersSize() {}; void SetVideoAccelerator (VideoAccelerator* va) { if (va) m_va = va; }; void MarkFrameAsSkip() {m_bIsPreviousSkip = true;} bool IsPrevFrameIsSkipped() {return m_bIsPreviousSkip;} uint32_t VC1GetPicHeaderSize(uint8_t* pOriginalData, size_t Offset, uint8_t& Flag_03) { uint32_t i = 0; uint32_t numZero = 0; uint8_t* ptr = pOriginalData; for(i = 0; i < Offset; i++) { if(*ptr == 0) numZero++; else numZero = 0; ptr++; if((numZero) == 2 && (*ptr == 0x03)) { if(*(ptr+1) < 4) { ptr++; } numZero = 0; } } if((numZero == 1) && (*ptr == 0) && (*(ptr+1) == 0x03) && (*(ptr+2) < 4)) { Flag_03 = 1; if((*(ptr+2) == 0) && (*(ptr+3) == 0) && (*(ptr+4) == 0x03) && (*(ptr+5) < 4)) Flag_03 = 5; return ((uint32_t)(ptr - pOriginalData) + 1); } else if((*ptr == 0) && (*(ptr+1) == 0) && (*(ptr+2) == 0x03)&& (*(ptr+3) < 4)) { Flag_03 = 2; return (uint32_t)(ptr - pOriginalData); } else if((*(ptr + 1) == 0) && (*(ptr+2) == 0) && (*(ptr+3) == 0x03)&& (*(ptr+4) < 4)&& (*(ptr+5) > 3)) { Flag_03 = 3; return (uint32_t)(ptr - pOriginalData); } else if((*(ptr + 2) == 0) && (*(ptr+3) == 0) && (*(ptr+4) == 0x03)&& (*(ptr+5) < 4)) { Flag_03 = 4; return (uint32_t)(ptr - pOriginalData); } else { Flag_03 = 0; return (uint32_t)(ptr - pOriginalData); } } private: // we sure about our types template static T bit_set(T value, uint32_t offset, uint32_t count, T1 in) { return (T)(value | (((1< class VC1FrameDescriptorVA: public VC1FrameDescriptor { friend class VC1TaskStore; friend class VC1VideoDecoder; public: // Default constructor VC1FrameDescriptorVA(MemoryAllocator* pMemoryAllocator, VideoAccelerator* va):VC1FrameDescriptor(pMemoryAllocator), m_va(va), m_pBitstream(NULL), m_iSliceBufIndex(0), m_iPicBufIndex(0), m_bIsItarativeMode(false), m_pBufferStart(NULL) { } virtual bool Init (uint32_t DescriporID, VC1Context* pContext, VC1TaskStore* pStore, int16_t*) { VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; m_pStore = pStore; m_pPacker.SetVideoAccelerator(m_va); if (m_va->m_Profile == VC1_VLD) { uint32_t buffSize = (seqLayerHeader->heightMB*VC1_PIXEL_IN_LUMA + 128)* (seqLayerHeader->widthMB*VC1_PIXEL_IN_LUMA + 128)+ ((seqLayerHeader->heightMB*VC1_PIXEL_IN_CHROMA + 64)* (seqLayerHeader->widthMB*VC1_PIXEL_IN_CHROMA + 64))*2; if(m_pContext == NULL) { if (m_pMemoryAllocator->Alloc(&m_ipContextID, sizeof(VC1Context), UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext = (VC1Context*)(m_pMemoryAllocator->Lock(m_ipContextID)); if(m_pContext==NULL) { Release(); return false; } } memset(m_pContext, 0, sizeof(VC1Context)); //buf size should be divisible by 4 if(buffSize & 0x00000003) buffSize = (buffSize&0xFFFFFFFC) + 4; if(m_pContext->m_pBufferStart == NULL) { if (m_pMemoryAllocator->Alloc(&m_ipBufferStartID, buffSize*sizeof(uint8_t), UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext->m_pBufferStart = (uint8_t*)(m_pMemoryAllocator->Lock(m_ipBufferStartID)); if(m_pContext->m_pBufferStart==NULL) { Release(); return false; } } memset(m_pContext->m_pBufferStart, 0, buffSize); m_pContext->m_vlcTbl = pContext->m_vlcTbl; m_pContext->pRefDist = &pContext->RefDist; m_pContext->m_frmBuff.m_pFrames = pContext->m_frmBuff.m_pFrames; m_pContext->m_frmBuff.m_iDisplayIndex = -1; m_pContext->m_frmBuff.m_iCurrIndex = -1; m_pContext->m_frmBuff.m_iPrevIndex = -1; m_pContext->m_frmBuff.m_iNextIndex = -1; m_pContext->m_frmBuff.m_iToFreeIndex = -1; m_pContext->m_frmBuff.m_iRangeMapIndex = pContext->m_frmBuff.m_iRangeMapIndex; m_pContext->m_seqLayerHeader = pContext->m_seqLayerHeader; if(m_pContext->m_picLayerHeader == NULL) { if (m_pMemoryAllocator->Alloc(&m_iPicHeaderID, sizeof(VC1PictureLayerHeader)*VC1_MAX_SLICE_NUM, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext->m_picLayerHeader = (VC1PictureLayerHeader*)(m_pMemoryAllocator->Lock(m_iPicHeaderID)); if(m_pContext->m_picLayerHeader==NULL) { Release(); return false; } } m_pContext->m_InitPicLayer = m_pContext->m_picLayerHeader; memset(m_pContext->m_picLayerHeader, 0, sizeof(VC1PictureLayerHeader)*VC1_MAX_SLICE_NUM); //Bitplane pool if(m_pContext->m_pBitplane.m_databits == NULL) { if (m_pMemoryAllocator->Alloc(&m_iBitplaneID, sizeof(uint8_t)*seqLayerHeader->heightMB* seqLayerHeader->widthMB* VC1_MAX_BITPANE_CHUNCKS, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext->m_pBitplane.m_databits = (uint8_t*)(m_pMemoryAllocator->Lock(m_iBitplaneID)); if(m_pContext->m_pBitplane.m_databits==NULL) { Release(); return false; } } memset(m_pContext->m_pBitplane.m_databits, 0,sizeof(uint8_t)*seqLayerHeader->heightMB* seqLayerHeader->widthMB* VC1_MAX_BITPANE_CHUNCKS); m_iSelfID = DescriporID; } return true; } virtual void Release() { if (m_va->m_Profile == VC1_VLD) { if(m_pMemoryAllocator) { if (m_iPicHeaderID != (MemID)-1) { m_pMemoryAllocator->Unlock(m_iPicHeaderID); m_pMemoryAllocator->Free(m_iPicHeaderID); m_iPicHeaderID = (MemID)-1; } m_pContext->m_InitPicLayer = NULL; if (m_iBitplaneID != (MemID)-1) { m_pMemoryAllocator->Unlock(m_iBitplaneID); m_pMemoryAllocator->Free(m_iBitplaneID); m_iBitplaneID = (MemID)-1; } m_pContext->m_pBitplane.m_databits = NULL; if (m_ipBufferStartID != (MemID)-1) { m_pMemoryAllocator->Unlock(m_ipBufferStartID); m_pMemoryAllocator->Free(m_ipBufferStartID); m_ipBufferStartID = (MemID)-1; } m_pContext->m_pBufferStart = NULL; if (m_ipContextID != (MemID)-1) { m_pMemoryAllocator->Unlock(m_ipContextID); m_pMemoryAllocator->Free(m_ipContextID); m_ipContextID = (MemID)-1; } m_pContext = NULL; } } } void VC1PackSlices (uint32_t* pOffsets, uint32_t* pValues, uint8_t* pOriginalData, MediaDataEx::_MediaDataEx* pOrigStCodes) { uint32_t PicHeaderFlag; uint32_t* pPictHeader = m_pContext->m_bitstream.pBitstream; uint32_t temp_value = 0; uint32_t* bitstream; int32_t bitoffset = 31; uint32_t SliceSize = 0; uint32_t* pOriginalOffsets = pOrigStCodes->offsets; uint32_t StartCodeOffset = 0; // need in case of fields uint32_t* pFirstFieldStartCode = m_pContext->m_bitstream.pBitstream; uint32_t Offset; uint32_t RemBytesInSlice = 0; bool isSecondField = false; m_iSliceBufIndex = 0; m_iPicBufIndex = 0; uint32_t MBEndRowOfAlreadyExec = 0; SliceParams slparams; uint8_t Flag_03 = 0; memset(&slparams,0,sizeof(SliceParams)); slparams.MBStartRow = 0; slparams.MBEndRow = m_pContext->m_seqLayerHeader.heightMB; m_pContext->m_picLayerHeader->CurrField = 0; if (VC1_IS_SKIPPED(m_pContext->m_picLayerHeader->PTYPE)) { m_bIsSkippedFrame = true; m_bIsReadyToProcess = false; return; } else { m_bIsSkippedFrame = false; } if (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE) { //skip start codes till Frame Header while ((*pValues)&&(*pValues != 0x0D010000)) { ++pOffsets; ++pValues; } DecodePicHeader(m_pContext); } else { Decode_PictureLayer(m_pContext); } m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); if (m_pContext->m_seqLayerHeader.PROFILE != VC1_PROFILE_ADVANCED) { Offset = (uint32_t) (sizeof(uint32_t)*(m_pContext->m_bitstream.pBitstream - m_pBufferStart)); // offset in words SliceSize = m_pContext->m_FrameSize - VC1FHSIZE; { uint32_t chopType = 1; uint32_t BytesAlreadyExecuted = 0; RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, SliceSize, pOriginalData, 0, false, Flag_03); slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset; if (RemBytesInSlice) { uint32_t ByteFilledInSlice = SliceSize - RemBytesInSlice; MBEndRowOfAlreadyExec = slparams.MBEndRow; // fill slices while (RemBytesInSlice) // we don't have enough buffer - execute it { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, ByteFilledInSlice, StartCodeOffset, chopType); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_va->Execute(); BytesAlreadyExecuted += ByteFilledInSlice; m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); StartCodeOffset = 0; m_iSliceBufIndex = 0; m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, RemBytesInSlice, pOriginalData + BytesAlreadyExecuted, StartCodeOffset, false, Flag_03); ByteFilledInSlice = SliceSize - BytesAlreadyExecuted - RemBytesInSlice; chopType = 3; slparams.m_bitOffset = 0; Offset = 0; } m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize - BytesAlreadyExecuted, StartCodeOffset, 2); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; } else { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize, StartCodeOffset, Flag_03); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); } } return; } if (*(pValues+1) == 0x0B010000) { bitstream = reinterpret_cast(m_pContext->m_pBufferStart + *(pOffsets+1)); VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); //SLICE_ADDR m_pContext->m_picLayerHeader->is_slice = 1; } else if(*(pValues+1) == 0x0C010000) { slparams.MBEndRow = (m_pContext->m_seqLayerHeader.heightMB+1)/2; } slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset; Offset = (uint32_t) (sizeof(uint32_t)*(m_pContext->m_bitstream.pBitstream - pPictHeader)); // offset in bytes if (*(pOffsets+1)) SliceSize = *(pOriginalOffsets+1) - *pOriginalOffsets; else SliceSize = m_pContext->m_FrameSize; { uint32_t chopType = 1; uint32_t BytesAlreadyExecuted = 0; RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, SliceSize, pOriginalData, StartCodeOffset, true, Flag_03); if (RemBytesInSlice) { uint32_t ByteFilledInSlice = SliceSize - RemBytesInSlice; MBEndRowOfAlreadyExec = slparams.MBEndRow; // fill slices while (RemBytesInSlice) // we don't have enough buffer - execute it { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, ByteFilledInSlice, StartCodeOffset, chopType); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); BytesAlreadyExecuted += ByteFilledInSlice; m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); StartCodeOffset = 0; m_iSliceBufIndex = 0; m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, RemBytesInSlice, pOriginalData + BytesAlreadyExecuted, StartCodeOffset, false, Flag_03); ByteFilledInSlice = SliceSize - BytesAlreadyExecuted - RemBytesInSlice; chopType = 3; slparams.m_bitOffset = 0; Offset = 0; } m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize - BytesAlreadyExecuted, StartCodeOffset, 2); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; // we need receive buffers from drv for future processing if (MBEndRowOfAlreadyExec != m_pContext->m_seqLayerHeader.heightMB) { m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); } } else { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize, StartCodeOffset, 0); // let execute in case of fields if (*(pValues+1)== 0x0C010000) { // Execute first slice if (m_va->m_Platform == VA_LINUX) m_pPacker.VC1PackBitplaneBuffers(m_pContext); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex + 1); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; } else { StartCodeOffset += SliceSize - RemBytesInSlice; ++m_iSliceBufIndex; } } } ++pOffsets; ++pValues; ++pOriginalOffsets; while (*pOffsets) { //Fields if (*(pValues) == 0x0C010000) { // Execute first slice if (m_va->m_Platform == VA_LINUX) m_pPacker.VC1PackBitplaneBuffers(m_pContext); m_pContext->m_bitstream.pBitstream = pFirstFieldStartCode; if (UMC_OK != m_va->EndFrame()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); if (UMC_OK != m_va->BeginFrame(m_pContext->m_frmBuff.m_iCurrIndex)) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); if (*(pOffsets+1)) SliceSize = *(pOriginalOffsets+1) - *pOriginalOffsets; else SliceSize = m_pContext->m_FrameSize - *pOriginalOffsets; StartCodeOffset = 0; m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); //m_iSliceBufIndex = 0; //m_iPicBufIndex = 0; isSecondField = true; // set swap bitstream for parsing m_pContext->m_bitstream.pBitstream = reinterpret_cast(m_pContext->m_pBufferStart + *pOffsets); m_pContext->m_bitstream.pBitstream += 1; // skip start code m_pContext->m_bitstream.bitOffset = 31; pPictHeader = m_pContext->m_bitstream.pBitstream; ++m_pContext->m_picLayerHeader; *m_pContext->m_picLayerHeader = *m_pContext->m_InitPicLayer; m_pContext->m_picLayerHeader->BottomField = (uint8_t)m_pContext->m_InitPicLayer->TFF; m_pContext->m_picLayerHeader->PTYPE = m_pContext->m_InitPicLayer->PTypeField2; m_pContext->m_picLayerHeader->CurrField = 1; m_pContext->m_picLayerHeader->is_slice = 0; DecodePicHeader(m_pContext); slparams.MBStartRow = (m_pContext->m_seqLayerHeader.heightMB+1)/2; if (*(pOffsets+1) && *(pValues+1) == 0x0B010000) { bitstream = reinterpret_cast(m_pContext->m_pBufferStart + *(pOffsets+1)); VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); } else slparams.MBEndRow = m_pContext->m_seqLayerHeader.heightMB; m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); ++m_iPicBufIndex; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset; Offset = (uint32_t) (sizeof(uint32_t)*(m_pContext->m_bitstream.pBitstream - pPictHeader)); // offset in bytes slparams.MBStartRow = 0; //we should decode fields steb by steb { uint32_t chopType = 1; uint32_t BytesAlreadyExecuted = 0; RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, SliceSize, pOriginalData + *pOriginalOffsets, StartCodeOffset, false, Flag_03); if (RemBytesInSlice) { uint32_t ByteFilledInSlice = SliceSize - RemBytesInSlice; MBEndRowOfAlreadyExec = slparams.MBEndRow; // fill slices while (RemBytesInSlice) // we don't have enough buffer - execute it { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, ByteFilledInSlice, StartCodeOffset, chopType); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_va->Execute(); BytesAlreadyExecuted += ByteFilledInSlice; m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); StartCodeOffset = 0; m_iSliceBufIndex = 0; m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, RemBytesInSlice, pOriginalData + BytesAlreadyExecuted, StartCodeOffset, false, Flag_03); ByteFilledInSlice = SliceSize - BytesAlreadyExecuted - RemBytesInSlice; chopType = 3; slparams.m_bitOffset = 0; Offset = 0; } m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize - BytesAlreadyExecuted, StartCodeOffset, 2); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; // we need receive buffers from drv for future processing if (MBEndRowOfAlreadyExec != m_pContext->m_seqLayerHeader.heightMB) { m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); } } else { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize, StartCodeOffset, 0); StartCodeOffset += SliceSize - RemBytesInSlice; ++m_iSliceBufIndex; } } ++pOffsets; ++pValues; ++pOriginalOffsets; } //Slices else if (*(pValues) == 0x0B010000) { m_pContext->m_bitstream.pBitstream = reinterpret_cast(m_pContext->m_pBufferStart + *pOffsets); VC1BitstreamParser::GetNBits(m_pContext->m_bitstream.pBitstream,m_pContext->m_bitstream.bitOffset,32, temp_value); m_pContext->m_bitstream.bitOffset = 31; pPictHeader = m_pContext->m_bitstream.pBitstream; VC1BitstreamParser::GetNBits(m_pContext->m_bitstream.pBitstream,m_pContext->m_bitstream.bitOffset,9, slparams.MBStartRow); //SLICE_ADDR VC1BitstreamParser::GetNBits(m_pContext->m_bitstream.pBitstream,m_pContext->m_bitstream.bitOffset,1, PicHeaderFlag); //PIC_HEADER_FLAG if (PicHeaderFlag == 1) //PIC_HEADER_FLAG { ++m_pContext->m_picLayerHeader; if (isSecondField) m_pContext->m_picLayerHeader->CurrField = 1; else m_pContext->m_picLayerHeader->CurrField = 0; DecodePictureHeader_Adv(m_pContext); DecodePicHeader(m_pContext); ++m_iPicBufIndex; } m_pContext->m_picLayerHeader->is_slice = 1; if (*(pOffsets+1) && *(pValues+1) == 0x0B010000) { bitstream = reinterpret_cast(m_pContext->m_pBufferStart + *(pOffsets+1)); VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); } else if(*(pValues+1) == 0x0C010000) slparams.MBEndRow = (m_pContext->m_seqLayerHeader.heightMB+1)/2; else slparams.MBEndRow = m_pContext->m_seqLayerHeader.heightMB; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset; Offset = (uint32_t) (sizeof(uint32_t)*(m_pContext->m_bitstream.pBitstream - pPictHeader)); // offset in words if (isSecondField) slparams.MBStartRow -= (m_pContext->m_seqLayerHeader.heightMB+1)/2; if (*(pOffsets+1)) SliceSize = *(pOriginalOffsets+1) - *pOriginalOffsets; else //SliceSize = m_pContext->m_FrameSize - StartCodeOffset; SliceSize = m_pContext->m_FrameSize - *pOriginalOffsets; { uint32_t chopType = 1; RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, SliceSize, pOriginalData + *pOriginalOffsets, StartCodeOffset, false, Flag_03); if (RemBytesInSlice) { uint32_t ByteFilledInSlice = SliceSize - RemBytesInSlice; MBEndRowOfAlreadyExec = slparams.MBEndRow; uint32_t BytesAlreadyExecuted = 0; // fill slices while (RemBytesInSlice) // we don't have enough buffer - execute it { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, ByteFilledInSlice, StartCodeOffset, chopType); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); BytesAlreadyExecuted += ByteFilledInSlice; m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); StartCodeOffset = 0; m_iSliceBufIndex = 0; m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); RemBytesInSlice = m_pPacker.VC1PackBitStream(m_pContext, RemBytesInSlice, pOriginalData + *pOriginalOffsets + BytesAlreadyExecuted, StartCodeOffset, false, Flag_03); ByteFilledInSlice = SliceSize - BytesAlreadyExecuted - RemBytesInSlice; chopType = 3; slparams.m_bitOffset = 0; Offset = 0; } m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize - BytesAlreadyExecuted, StartCodeOffset, 2); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex+1); m_pPacker.VC1PackPicParamsForOneSlice(m_pContext); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; // we need receive buffers from drv for future processing if (MBEndRowOfAlreadyExec != m_pContext->m_seqLayerHeader.heightMB) { m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); } } else { m_pPacker.VC1PackOneSlice(m_pContext, &slparams, m_iSliceBufIndex, Offset, SliceSize, StartCodeOffset, 0); // let execute in case of fields if (*(pValues+1)== 0x0C010000) { // Execute first slice if (m_va->m_Platform == VA_LINUX) m_pPacker.VC1PackBitplaneBuffers(m_pContext); m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex + 1); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); StartCodeOffset = 0; m_iSliceBufIndex = 0; } else { StartCodeOffset += SliceSize - RemBytesInSlice; ++m_iSliceBufIndex; } } } ++pOffsets; ++pValues; ++pOriginalOffsets; } else { ++pOffsets; ++pValues; ++pOriginalOffsets; } } //need to execute last slice if (MBEndRowOfAlreadyExec != m_pContext->m_seqLayerHeader.heightMB) { m_pPacker.VC1SetBuffersSize(m_iSliceBufIndex); if (m_va->m_Platform == VA_LINUX) m_pPacker.VC1PackBitplaneBuffers(m_pContext); if (UMC_OK != m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); } } virtual void PrepareVLDVABuffers(uint32_t* pOffsets, uint32_t* pValues, uint8_t* pOriginalData, MediaDataEx::_MediaDataEx* pOrigStCodes) { if (VC1_IS_SKIPPED(m_pContext->m_picLayerHeader->PTYPE)) { m_bIsSkippedFrame = true; m_bIsReadyToProcess = false; m_pPacker.MarkFrameAsSkip(); } else { m_pPacker.VC1SetSliceBuffer(); m_pPacker.VC1SetPictureBuffer(); VC1PackSlices(pOffsets,pValues,pOriginalData,pOrigStCodes); } if ((m_iFrameCounter > 1) || (!VC1_IS_REFERENCE(m_pContext->m_picLayerHeader->PTYPE))) { m_pStore->SetFirstBusyDescriptorAsReady(); } } bool IsNeedToExecute() { return !m_bIsItarativeMode; } virtual ~VC1FrameDescriptorVA() { } virtual void SetVideoHardwareAccelerator(VideoAccelerator* va) { if (va) { m_va = va; m_pPacker.SetVideoAccelerator(m_va); } } virtual Status preProcData(VC1Context* pContext, uint32_t bufferSize, unsigned long long frameCount, bool& skip) { Status vc1Sts = UMC_OK; uint32_t Ptype; uint8_t* pbufferStart = pContext->m_pBufferStart; m_iFrameCounter = frameCount; // there is self header before each frame in simple/main profile if (m_pContext->m_seqLayerHeader.PROFILE != VC1_PROFILE_ADVANCED) { bufferSize += VC1FHSIZE; m_pContext->m_FrameSize = bufferSize; } if (m_va->m_Platform == VA_LINUX) { if (m_iFrameCounter == 1) m_pContext->m_frmBuff.m_iCurrIndex = -1; } MFX_INTERNAL_CPY(m_pContext->m_pBufferStart, pbufferStart, (bufferSize & 0xFFFFFFF8) + 8); // (bufferSize & 0xFFFFFFF8) + 8 - skip frames m_pContext->m_bitstream.pBitstream = (uint32_t*)m_pContext->m_pBufferStart; m_pContext->m_bitstream.pBitstream += 1; m_pContext->m_bitstream.bitOffset = 31; m_pContext->m_picLayerHeader = m_pContext->m_InitPicLayer; m_pContext->m_seqLayerHeader = pContext->m_seqLayerHeader; m_bIsSpecialBSkipFrame = false; if (m_pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { m_pBufferStart = m_pContext->m_bitstream.pBitstream; vc1Sts = GetNextPicHeader_Adv(m_pContext); UMC_CHECK_STATUS(vc1Sts); Ptype = m_pContext->m_picLayerHeader->PTYPE|m_pContext->m_picLayerHeader->PTypeField1; { vc1Sts = SetPictureIndices(Ptype,skip); } } else { m_pContext->m_bitstream.pBitstream = (uint32_t*)m_pContext->m_pBufferStart + 2; m_pBufferStart = m_pContext->m_bitstream.pBitstream; vc1Sts = GetNextPicHeader(m_pContext, false); UMC_CHECK_STATUS(vc1Sts); vc1Sts = SetPictureIndices(m_pContext->m_picLayerHeader->PTYPE,skip); UMC_CHECK_STATUS(vc1Sts); } if (m_pStore->IsNeedPostProcFrame(m_pContext->m_picLayerHeader->PTYPE)) m_pContext->DeblockInfo.isNeedDbl = 1; else m_pContext->DeblockInfo.isNeedDbl = 0; m_pContext->m_bIntensityCompensation = 0; return vc1Sts; } protected: VideoAccelerator* m_va; uint8_t* m_pBitstream; uint32_t m_iSliceBufIndex; uint32_t m_iPicBufIndex; bool m_bIsItarativeMode; uint32_t* m_pBufferStart; T m_pPacker; }; template class VC1FrameDescriptorVA_Linux: public VC1FrameDescriptorVA { public: // Default constructor VC1FrameDescriptorVA_Linux(MemoryAllocator* pMemoryAllocator, VideoAccelerator* va):VC1FrameDescriptorVA(pMemoryAllocator, va) { } virtual ~VC1FrameDescriptorVA_Linux(){}; void PrepareVLDVABuffers(uint32_t* pOffsets, uint32_t* pValues, uint8_t* pOriginalData, MediaDataEx::_MediaDataEx* pOrigStCodes) { if (VC1_IS_SKIPPED(this->m_pContext->m_picLayerHeader->PTYPE)) { this->m_bIsSkippedFrame = true; this->m_bIsReadyToProcess = false; this->m_pPacker.MarkFrameAsSkip(); } else { this->m_pPacker.VC1SetPictureBuffer(); this->m_pPacker.VC1SetSliceParamBuffer(pOffsets, pValues); this->m_pPacker.VC1SetSliceDataBuffer(this->m_pContext->m_FrameSize); // 4 - header ? VC1PackSlices(pOffsets,pValues,pOriginalData,pOrigStCodes); } if ((this->m_iFrameCounter > 1) || (!VC1_IS_REFERENCE(this->m_pContext->m_picLayerHeader->PTYPE))) { this->m_pStore->SetFirstBusyDescriptorAsReady(); } } virtual void VC1PackSlices (uint32_t* pOffsets, uint32_t* pValues, uint8_t* pOriginalData, MediaDataEx::_MediaDataEx* pOrigStCodes) { uint32_t PicHeaderFlag; uint32_t* pPictHeader = this->m_pContext->m_bitstream.pBitstream; uint32_t temp_value = 0; uint32_t* bitstream; int32_t bitoffset = 31; uint32_t SliceSize = 0; uint32_t DataSize = 0; uint32_t BitstreamDataSize = 0; // need in case of fields uint32_t* pFirstFieldStartCode = this->m_pContext->m_bitstream.pBitstream; uint32_t Offset = 0; uint32_t PicHeaderSize = 0; uint8_t Flag_03 = 0; //for search 00 00 03 on the end of pic header uint32_t* p_CurOriginalOffsets = pOrigStCodes->offsets; uint32_t* p_NextOriginalOffsets = pOrigStCodes->offsets; uint32_t* p_CurOffsets = pOffsets; uint32_t* p_CurValues = pValues; uint8_t* p_CurOriginalData = pOriginalData; uint32_t* p_NextOffsets = pOffsets; uint32_t* p_NextValues = pValues; bool isSecondField = false; this->m_iSliceBufIndex = 0; this->m_iPicBufIndex = 0; uint32_t MBEndRowOfAlreadyExec = 0; SliceParams slparams; memset(&slparams,0,sizeof(SliceParams)); slparams.MBStartRow = 0; slparams.MBEndRow = this->m_pContext->m_seqLayerHeader.heightMB; this->m_pContext->m_picLayerHeader->CurrField = 0; if (VC1_IS_SKIPPED(this->m_pContext->m_picLayerHeader->PTYPE)) { this->m_bIsSkippedFrame = true; this->m_bIsReadyToProcess = false; return; } else { this->m_bIsSkippedFrame = false; } //skip start codes till Frame Header while ((*p_CurValues)&&(*p_CurValues != 0x0D010000)) { ++p_CurOffsets; ++p_CurValues; ++p_CurOriginalOffsets; } //move next st code data pointers p_NextOffsets = p_CurOffsets + 1; p_NextValues = p_CurValues + 1; p_NextOriginalOffsets = p_CurOriginalOffsets + 1; if (this->m_pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) DecodePicHeader(this->m_pContext); else Decode_PictureLayer(this->m_pContext); if (this->m_pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { PicHeaderSize = (this->m_pPacker.VC1GetPicHeaderSize(p_CurOriginalData + 4, (uint32_t)((size_t)sizeof(uint32_t)*(this->m_pContext->m_bitstream.pBitstream - pPictHeader)), Flag_03)); } else { PicHeaderSize = (uint32_t)((size_t)sizeof(uint32_t)*(this->m_pContext->m_bitstream.pBitstream - pPictHeader)); } this->m_pPacker.VC1PackPicParamsForOneSlice(this->m_pContext); slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = this->m_pContext->m_bitstream.bitOffset; if (VC1_PROFILE_ADVANCED == this->m_pContext->m_seqLayerHeader.PROFILE) Offset = PicHeaderSize + 4; // offset in bytes else Offset = PicHeaderSize; if (*(p_CurOffsets+1) && p_CurOriginalOffsets && (p_CurOriginalOffsets + 1)) SliceSize = *(p_CurOriginalOffsets+1) - *p_CurOriginalOffsets - Offset; else SliceSize = this->m_pContext->m_FrameSize - Offset; //skip user data while(*(p_NextValues) == 0x1B010000 || *(p_NextValues) == 0x1D010000 || *(p_NextValues) == 0x1C010000) { p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } if (*p_NextValues == 0x0B010000) { //slice bitstream = reinterpret_cast(this->m_pContext->m_pBufferStart + *p_NextOffsets); VC1BitstreamParser::GetNBits(bitstream, bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); //SLICE_ADDR this->m_pContext->m_picLayerHeader->is_slice = 1; } else if(*p_NextValues == 0x0C010000) { //field slparams.MBEndRow = (this->m_pContext->m_seqLayerHeader.heightMB+1)/2; } assert(SliceSize<0x0FFFFFFF); { this->m_pPacker.VC1PackBitStream(this->m_pContext, DataSize, p_CurOriginalData + Offset, SliceSize, 0, Flag_03); this->m_pPacker.VC1PackOneSlice(this->m_pContext, &slparams, this->m_iSliceBufIndex, 0, DataSize, 0, 0); // let execute in case of fields if (*p_NextValues== 0x0C010000) { // Execute first slice this->m_pPacker.VC1PackBitplaneBuffers(this->m_pContext); this->m_pPacker.VC1SetBuffersSize(this->m_iSliceBufIndex + 1); if (UMC_OK != this->m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); this->m_iSliceBufIndex = 0; } else { BitstreamDataSize += DataSize; ++this->m_iSliceBufIndex; } } //move current st code data pointers p_CurOffsets = p_NextOffsets; p_CurValues = p_NextValues; p_CurOriginalOffsets = p_NextOriginalOffsets; //move next st code data pointers p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; while (*p_CurOffsets) { //Fields if (*(p_CurValues) == 0x0C010000) { this->m_pContext->m_bitstream.pBitstream = pFirstFieldStartCode; if (UMC_OK != this->m_va->EndFrame()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); this->m_pPacker.VC1SetPictureBuffer(); this->m_pPacker.VC1SetSliceParamBuffer(pOffsets, pValues); this->m_pPacker.VC1SetSliceDataBuffer(this->m_pContext->m_FrameSize); isSecondField = true; // set swap bitstream for parsing this->m_pContext->m_bitstream.pBitstream = reinterpret_cast(this->m_pContext->m_pBufferStart + *p_CurOffsets); this->m_pContext->m_bitstream.pBitstream += 1; // skip start code this->m_pContext->m_bitstream.bitOffset = 31; pPictHeader = this->m_pContext->m_bitstream.pBitstream; PicHeaderSize = 0; BitstreamDataSize = 0; ++this->m_pContext->m_picLayerHeader; *this->m_pContext->m_picLayerHeader = *this->m_pContext->m_InitPicLayer; this->m_pContext->m_picLayerHeader->BottomField = (uint8_t)this->m_pContext->m_InitPicLayer->TFF; this->m_pContext->m_picLayerHeader->PTYPE = this->m_pContext->m_InitPicLayer->PTypeField2; this->m_pContext->m_picLayerHeader->CurrField = 1; this->m_pContext->m_picLayerHeader->is_slice = 0; DecodePicHeader(this->m_pContext); PicHeaderSize = (uint32_t)this->m_pPacker.VC1GetPicHeaderSize(p_CurOriginalData + 4 + *p_CurOriginalOffsets, (uint32_t)((size_t)sizeof(uint32_t)*(this->m_pContext->m_bitstream.pBitstream - pPictHeader)), Flag_03); slparams.MBStartRow = (this->m_pContext->m_seqLayerHeader.heightMB+1)/2; if (*(p_CurOffsets+1)) SliceSize = *(p_CurOriginalOffsets + 1) - *p_CurOriginalOffsets - 4 - PicHeaderSize; else SliceSize = this->m_pContext->m_FrameSize - *p_CurOriginalOffsets - 4 - PicHeaderSize; //skip user data while(*p_NextValues == 0x1B010000 || *p_NextValues == 0x1D010000 || *p_NextValues == 0x1C010000) { p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } if (*p_NextOffsets && *p_NextValues == 0x0B010000) { bitstream = reinterpret_cast(this->m_pContext->m_pBufferStart + *p_NextOffsets); VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); } else slparams.MBEndRow = this->m_pContext->m_seqLayerHeader.heightMB; this->m_pPacker.VC1PackPicParamsForOneSlice(this->m_pContext); ++this->m_iPicBufIndex; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = this->m_pContext->m_bitstream.bitOffset; Offset = PicHeaderSize + 4; // offset in bytes slparams.MBStartRow = 0; //we should decode fields steb by steb { this->m_pPacker.VC1PackBitStream(this->m_pContext, DataSize, pOriginalData + *p_CurOriginalOffsets + Offset,SliceSize, 0, Flag_03); this->m_pPacker.VC1PackOneSlice(this->m_pContext, &slparams, this->m_iSliceBufIndex, 0, DataSize, 0, 0); BitstreamDataSize += DataSize; ++this->m_iSliceBufIndex; } //move current st code data pointers p_CurOffsets = p_NextOffsets; p_CurValues = p_NextValues; p_CurOriginalOffsets = p_NextOriginalOffsets; //move next st code data pointers p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } //Slices else if (*p_CurValues == 0x0B010000) { this->m_pContext->m_bitstream.pBitstream = reinterpret_cast(this->m_pContext->m_pBufferStart + *p_CurOffsets); VC1BitstreamParser::GetNBits(this->m_pContext->m_bitstream.pBitstream,this->m_pContext->m_bitstream.bitOffset,32, temp_value); this->m_pContext->m_bitstream.bitOffset = 31; pPictHeader = this->m_pContext->m_bitstream.pBitstream; PicHeaderSize = 0; VC1BitstreamParser::GetNBits(this->m_pContext->m_bitstream.pBitstream,this->m_pContext->m_bitstream.bitOffset,9, slparams.MBStartRow); //SLICE_ADDR VC1BitstreamParser::GetNBits(this->m_pContext->m_bitstream.pBitstream,this->m_pContext->m_bitstream.bitOffset,1, PicHeaderFlag); //PIC_HEADER_FLAG if (PicHeaderFlag == 1) //PIC_HEADER_FLAG { ++this->m_pContext->m_picLayerHeader; if (isSecondField) this->m_pContext->m_picLayerHeader->CurrField = 1; else this->m_pContext->m_picLayerHeader->CurrField = 0; DecodePictureHeader_Adv(this->m_pContext); DecodePicHeader(this->m_pContext); PicHeaderSize = this->m_pPacker.VC1GetPicHeaderSize(p_CurOriginalData + 4 + *p_CurOriginalOffsets, (uint32_t)((size_t)sizeof(uint32_t)*(this->m_pContext->m_bitstream.pBitstream - pPictHeader)), Flag_03); ++this->m_iPicBufIndex; } this->m_pContext->m_picLayerHeader->is_slice = 1; //skip user data while(*p_NextValues == 0x1B010000 || *p_NextValues == 0x1D010000 || *p_NextValues == 0x1C010000) { p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } if (*p_NextOffsets && *p_NextValues == 0x0B010000) { bitstream = reinterpret_cast(this->m_pContext->m_pBufferStart + *(pOffsets+1)); VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value); bitoffset = 31; VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow); } else if(*p_NextValues == 0x0C010000) slparams.MBEndRow = (this->m_pContext->m_seqLayerHeader.heightMB+1)/2; else slparams.MBEndRow = this->m_pContext->m_seqLayerHeader.heightMB; slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow; slparams.m_bitOffset = this->m_pContext->m_bitstream.bitOffset; Offset = PicHeaderSize + 4; if (isSecondField) slparams.MBStartRow -= (this->m_pContext->m_seqLayerHeader.heightMB+1)/2; if (*(p_CurOffsets+1)) SliceSize = *(p_CurOriginalOffsets+1) - *p_CurOriginalOffsets - Offset; else SliceSize = this->m_pContext->m_FrameSize - *p_CurOriginalOffsets - Offset; { this->m_pPacker.VC1PackBitStream(this->m_pContext, DataSize, p_CurOriginalData + *p_CurOriginalOffsets + Offset, SliceSize, BitstreamDataSize, Flag_03); this->m_pPacker.VC1PackOneSlice(this->m_pContext, &slparams, this->m_iSliceBufIndex, 0, DataSize, BitstreamDataSize, 0); //skip user data while(*p_NextValues == 0x1B010000 || *p_NextValues == 0x1D010000 || *p_NextValues == 0x1C010000) { p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } // let execute in case of fields if (*p_NextValues== 0x0C010000) { // Execute first slice this->m_pPacker.VC1PackBitplaneBuffers(this->m_pContext); this->m_pPacker.VC1SetBuffersSize(this->m_iSliceBufIndex + 1); if (UMC_OK != this->m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); this->m_iSliceBufIndex = 0; } else { BitstreamDataSize += DataSize/*SliceSize - RemBytesInSlice*/; ++this->m_iSliceBufIndex; } } //move current st code data pointers p_CurOffsets = p_NextOffsets; p_CurValues = p_NextValues; p_CurOriginalOffsets = p_NextOriginalOffsets; //move next st code data pointers p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } else { //move current st code data pointers p_CurOffsets = p_NextOffsets; p_CurValues = p_NextValues; p_CurOriginalOffsets = p_NextOriginalOffsets; //move next st code data pointers p_NextOffsets++; p_NextValues++; p_NextOriginalOffsets++; } } //need to execute last slice if (MBEndRowOfAlreadyExec != this->m_pContext->m_seqLayerHeader.heightMB) { this->m_pPacker.VC1PackBitplaneBuffers(this->m_pContext); this->m_pPacker.VC1SetBuffersSize(this->m_iSliceBufIndex); if (UMC_OK != this->m_va->Execute()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); } } }; } // namespace UMC #endif //__UMC_VC1_DEC_FRAME_DESCR_VA_H_ #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_dec_seq.h000066400000000000000000000111201443134507600321570ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_SEQ_H__ #define __UMC_VC1_DEC_SEQ_H__ #include "umc_vc1_common_defs.h" #include "umc_frame_allocator.h" typedef struct { uint16_t MBStartRow; uint16_t MBEndRow; uint16_t MBRowsToDecode; uint32_t* m_pstart; int32_t m_bitOffset; VC1PictureLayerHeader* m_picLayerHeader; VC1VLCTables* m_vlcTbl; bool is_continue; uint32_t slice_settings; bool is_NewInSlice; bool is_LastInSlice; int32_t iPrevDblkStartPos; //need to interlace frames } SliceParams; //sequence layer VC1Status SequenceLayer (VC1Context* pContext); //picture layer //Simple/main VC1Status GetNextPicHeader (VC1Context* pContext, bool isExtHeader); VC1Status DecodePictureHeader (VC1Context* pContext, bool isExtHeader); VC1Status Decode_PictureLayer (VC1Context* pContext); //Advanced VC1Status DecodePictureHeader_Adv (VC1Context* pContext); VC1Status GetNextPicHeader_Adv (VC1Context* pContext); //frame rate calculation void MapFrameRateIntoMfx(uint32_t& ENR,uint32_t& EDR, uint16_t FCode); double MapFrameRateIntoUMC(uint32_t ENR,uint32_t EDR, uint32_t& FCode); //I,P,B headers VC1Status DecodePicHeader (VC1Context* pContext); VC1Status DecodePictHeaderParams_InterlaceFieldPicture_Adv (VC1Context* pContext); // Simple/Main VC1Status DecodePictureLayer_ProgressiveIpicture (VC1Context* pContext); // Advanced VC1Status DecodePictHeaderParams_ProgressiveIpicture_Adv (VC1Context* pContext); VC1Status DecodePictHeaderParams_InterlaceIpicture_Adv (VC1Context* pContext); VC1Status DecodeFieldHeaderParams_InterlaceFieldIpicture_Adv (VC1Context* pContext); VC1Status Decode_InterlaceFieldIpicture_Adv (VC1Context* pContext); // Simple/Main VC1Status DecodePictureLayer_ProgressivePpicture (VC1Context* pContext); // Advanced VC1Status DecodePictHeaderParams_ProgressivePpicture_Adv (VC1Context* pContext); VC1Status DecodePictHeaderParams_InterlacePpicture_Adv (VC1Context* pContext); VC1Status DecodeFieldHeaderParams_InterlaceFieldPpicture_Adv (VC1Context* pContext); VC1Status Decode_InterlaceFieldPpicture_Adv (VC1Context* pContext); // Simple/Main VC1Status DecodePictureLayer_ProgressiveBpicture (VC1Context* pContext); // Advanced VC1Status DecodePictHeaderParams_ProgressiveBpicture_Adv (VC1Context* pContext); VC1Status DecodePictHeaderParams_InterlaceBpicture_Adv (VC1Context* pContext); VC1Status Decode_InterlaceFieldBpicture_Adv (VC1Context* pContext); VC1Status DecodeFieldHeaderParams_InterlaceFieldBpicture_Adv(VC1Context* pContext); VC1Status MVRangeDecode (VC1Context* pContext); VC1Status DMVRangeDecode (VC1Context* pContext); //DeQuantization VC1Status VOPDQuant(VC1Context* pContext); VC1Status CalculatePQuant(VC1Context* pContext); //Bitplane decoding void DecodeBitplane(VC1Context* pContext, VC1Bitplane* pBitplane, int32_t rowMB, int32_t colMB, int32_t offset); VC1Status EntryPointLayer(VC1Context* m_pContext); #endif //__umc_vc1_dec_seq_H__ #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_dec_skipping.h000066400000000000000000000100151443134507600332150ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_SKIPPING_H_ #define __UMC_VC1_DEC_SKIPPING_H_ namespace UMC { namespace VC1Skipping { typedef enum { VC1Routine, VC1PostProcDisable, VC1MaxSpeed } VC1PerfFeatureMode; typedef enum { // routine pipeline Normal = 0, // no post processing on B frames B1, // no post processing and simple Quant + Inv.Transform on B frames B2, // no post processing and simple Quant + Inv.Transform on B frames. Skip every 3-th B3, // no post processing and simple Quant + Inv.Transform on B frames. Skip every 2-th B4, // no post processing and simple Quant + Inv.Transform on B frames. Skip all B frames B5, // all features are disabled for B frames. no post processing on Ref frames Ref1, // all features are disabled for B frames. no post processing and simple Quant + Inv.Transform on Ref frames Ref2, // all features are disabled for all frames. Skip all ref frame, all B frame Ref3 } SkippingMode; // all skipping algorithms is described here class VC1SkipMaster { public: VC1SkipMaster():m_iRefSkipPeriod(0), m_iRefSkipCounter(0), m_iBSkipPeriod(0), m_iBSkipCounter(0), m_RefPerfMode(VC1Routine), m_BPerfMode(VC1Routine), m_SpeedMode(Normal), m_bOnDbl(true) { }; // skipping algorithms can be different for reference and predictive (B/BI) frames // For Ref frames minimum period is 2 // For B minimum period is 1 void SetSkipPeriod(bool ForRefFrames, uint32_t period); void SetPerformMode(bool ForRefFrames, uint32_t perfomMode); bool IsDeblockingOn(); bool ChangeVideoDecodingSpeed(int32_t& speed_shift); bool IsNeedSkipFrame(uint32_t picType); bool IsNeedPostProcFrame(uint32_t picType); bool IsNeedSimlifyReconstruct(uint32_t picType); void Reset(); ~ VC1SkipMaster() { } private: void MoveToNextState(); // Skip parameters for reference frames uint32_t m_iRefSkipPeriod; uint32_t m_iRefSkipCounter; // Skip parameters for predicted frames uint32_t m_iBSkipPeriod; uint32_t m_iBSkipCounter; uint32_t m_RefPerfMode; uint32_t m_BPerfMode; int32_t m_SpeedMode; bool m_bOnDbl; }; } } #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_dec_task.h000066400000000000000000000104171443134507600323410ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_DEC_TASK_H_ #define __UMC_VC1_DEC_TASK_H_ #include "vm_types.h" #include "umc_structures.h" #include "umc_vc1_common_defs.h" #include "umc_vc1_dec_seq.h" namespace UMC { enum SelfUMCStatus { UMC_LAST_FRAME = 10 }; class VC1TaskProcessorUMC; typedef enum { VC1Decode = 1, //VC1Dequant = 2, VC1Reconstruct = 2, VC1MVCalculate = 4, VC1MC = 8, VC1PreparePlane = 16, VC1Deblock = 32, VC1Complete = 64 } VC1TaskTypes; #pragma pack(16) class VC1Task { public: // Default constructor VC1Task(int32_t iThreadNumber,int32_t TaskID):m_pSlice(NULL), m_iThreadNumber(iThreadNumber), m_iTaskID(TaskID), m_eTasktype(VC1Decode), m_pBlock(NULL), m_pPredBlock(NULL), m_pSrcToSwap(NULL), m_uDataSizeToSwap(0), m_isFirstInSecondSlice(false), m_isFieldReady(false), pMulti(NULL) { }; VC1Task(int32_t iThreadNumber):m_pSlice(NULL), m_iThreadNumber(iThreadNumber), m_iTaskID(0), m_eTasktype(VC1Decode), m_pBlock(NULL), m_pPredBlock(NULL), m_pSrcToSwap(NULL), m_uDataSizeToSwap(0), m_isFirstInSecondSlice(false), m_isFieldReady(false), pMulti(NULL) { }; uint32_t IsDecoding (uint32_t _task_settings) {return _task_settings&VC1Decode;} uint32_t IsDeblocking(uint32_t _task_settings) {return _task_settings&VC1Deblock;} void setSliceParams(VC1Context* pContext); SliceParams* m_pSlice; // int32_t m_iThreadNumber; // (int32_t) owning thread number int32_t m_iTaskID; // (int32_t) task identificator VC1TaskTypes m_eTasktype; int16_t* m_pBlock; uint8_t* m_pPredBlock; uint8_t* m_pSrcToSwap; uint32_t m_uDataSizeToSwap; bool m_isFirstInSecondSlice; bool m_isFieldReady; VC1Status (VC1TaskProcessorUMC::*pMulti)(VC1Context* pContext, VC1Task* pTask); }; #pragma pack() } #endif //__umc_vc1_dec_task_H__ #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_dec_task_store.h000066400000000000000000000306711443134507600335020ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_UMC_VC1_DEC_TASK_STORE_H_ #define __UMC_UMC_VC1_DEC_TASK_STORE_H_ #include #include #include #include #include #include "umc_vc1_common_defs.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_vc1_dec_skipping.h" #include "umc_vc1_dec_exception.h" #include "umc_frame_allocator.h" namespace UMC { typedef enum { VC1_HD_STREAM = 0, VC1_MD_STREAM = 1, VC1_SD_STREAM = 2 } VC1_STREAM_DEFINITION; class VC1TSHeap { public: VC1TSHeap(uint8_t* pBuf, int32_t BufSize):m_pBuf(pBuf), m_iRemSize(BufSize) { }; virtual ~VC1TSHeap() { }; template void s_new(T*** pObj, uint32_t size) { int32_t size_T = (int32_t)(sizeof(pObj)*size); if (m_iRemSize - mfx::align2_value(size_T) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { *pObj = new(m_pBuf)T*[size]; m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); } }; template void s_new_one(T** pObj, uint32_t size) { int32_t size_T = (int32_t)(sizeof(T)*size); if (m_iRemSize - mfx::align2_value(size_T) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { *pObj = new(m_pBuf)T[size]; m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); } }; template void s_new(T** pObj, uint32_t size) { int32_t size_T = sizeof(T); if ((m_iRemSize - mfx::align2_value(size_T)*((int32_t)size)) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { for(uint32_t i = 0; i < size; i++) { pObj[i] = new(m_pBuf)(T); m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); } } }; template void s_new(Tbase** pObj, uint32_t size, Arg* pArg) { int32_t size_T = sizeof(T); if ((m_iRemSize - mfx::align2_value(size_T)*((int32_t)size)) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { for(uint32_t i = 0; i < size; i++) { pObj[i] = new(m_pBuf)(T)(pArg); m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); } } }; template void s_new(T** pObj) { int32_t size_T = sizeof(T); if ((m_iRemSize - mfx::align2_value(size_T)) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { *pObj = new(m_pBuf)(T); m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); } } template uint8_t* s_alloc() { uint8_t* pRet; int32_t size_T = sizeof(T); if ((m_iRemSize - mfx::align2_value(size_T)) < 0) throw VC1Exceptions::vc1_exception(VC1Exceptions::mem_allocation_er); else { pRet = m_pBuf; m_pBuf += mfx::align2_value(size_T); m_iRemSize -= mfx::align2_value(size_T); return pRet; } } private: uint8_t* m_pBuf; int32_t m_iRemSize; }; class VC1VideoDecoder; class VC1TaskStore: public VC1Skipping::VC1SkipMaster { public: VC1TaskStore(MemoryAllocator *pMemoryAllocator); virtual ~VC1TaskStore(); private: // Declare private copy constructor to avoid accidental assignment VC1TaskStore(const VC1TaskStore &); VC1TaskStore & operator = (const VC1TaskStore &); public: virtual bool Init(uint32_t iConsumerNumber, uint32_t iMaxFramesInParallel, VC1VideoDecoder* pVC1Decoder); virtual bool Reset(); bool CreateDSQueue(VC1Context* pContext, VideoAccelerator* va); bool SetNewSHParams(VC1Context* pContext); void ResetDSQueue(); bool IsReadyDS() { uint32_t i; std::lock_guard guard(m_mDSGuard); for (i = 0; i < m_iNumFramesProcessing; i++) { if (m_pDescriptorQueue[i]->m_bIsReadyToLoad) return true; } return false; } template void GetReadyDS(Descriptor** pDS) { std::lock_guard guardDS(m_mDSGuard); uint32_t i; for (i = 0; i < m_iNumFramesProcessing; i++) { std::lock_guard guard(*m_pGuardGet[i]); if (m_pDescriptorQueue[i]->m_bIsReadyToLoad) { m_pDescriptorQueue[i]->m_bIsReadyToLoad = false; m_pDescriptorQueue[i]->m_iActiveTasksInFirstField = 0; *pDS = (Descriptor*)m_pDescriptorQueue[i]; ++m_iNumDSActiveinQueue; return; } } *pDS = NULL; } template bool GetPerformedDS(Descriptor** pDS) { uint32_t i; std::lock_guard guardDS(m_mDSGuard); for (i = 0; i < m_iNumFramesProcessing; i++) { std::lock_guard guard(*m_pGuardGet[i]); if (m_pDescriptorQueue[i]->m_bIsReadyToDisplay) { if ((m_lNextFrameCounter == m_pDescriptorQueue[i]->m_iFrameCounter)&& (!m_pDescriptorQueue[i]->m_bIsSkippedFrame)) { m_pDescriptorQueue[i]->m_bIsReadyToDisplay = false; m_pDescriptorQueue[i]->m_bIsReadyToLoad = true; m_pDescriptorQueue[i]->m_bIsBusy = false; --m_iNumDSActiveinQueue; ++m_lNextFrameCounter; *pDS = (Descriptor*)m_pDescriptorQueue[i]; return true; } } } *pDS = NULL; return false; } // need for correct work VideoAcceleration void SetFirstBusyDescriptorAsReady() { uint32_t i; std::lock_guard guardDS(m_mDSGuard); for (i = 0; i < m_iNumFramesProcessing; i++) { std::lock_guard guard(*m_pGuardGet[i]); if ((!m_pDescriptorQueue[i]->m_bIsReadyToDisplay)&& (m_pDescriptorQueue[i]->m_iFrameCounter == m_lNextFrameCounter)) { m_pDescriptorQueue[i]->m_bIsReadyToDisplay = true; m_pDescriptorQueue[i]->m_bIsReferenceReady = true; m_pDescriptorQueue[i]->m_bIsBusy = true; return; } } } void ResetPerformedDS(VC1FrameDescriptor* pDS) { pDS->m_bIsReadyToDisplay = false; pDS->m_bIsReadyToLoad = true; pDS->m_bIsBusy = false; --m_iNumDSActiveinQueue; uint32_t i; for (i = 0; i < m_iNumFramesProcessing; i++) { if (!m_pDescriptorQueue[i]->m_bIsReadyToLoad) ++m_pDescriptorQueue[i]->m_iFrameCounter; } ++m_lNextFrameCounter; } void AddInvalidPerformedDS(VC1FrameDescriptor* pDS) { pDS->m_bIsReadyToProcess = false; pDS->m_bIsReadyToDisplay = true; pDS->m_bIsValidFrame = false; } VC1FrameDescriptor* GetLastDS(); VC1FrameDescriptor* GetFirstDS(); template bool GetReadySkippedDS(Descriptor** pDS) { uint32_t i; std::lock_guard guardDS(m_mDSGuard); for (i = 0; i < m_iNumFramesProcessing; i++) { std::lock_guard guard(*m_pGuardGet[i]); if ((m_pDescriptorQueue[i]->m_bIsReferenceReady)&& (m_pDescriptorQueue[i]->m_bIsSkippedFrame)&& (m_lNextFrameCounter == m_pDescriptorQueue[i]->m_iFrameCounter)) { *pDS = (Descriptor*)m_pDescriptorQueue[i]; m_pDescriptorQueue[i]->m_bIsReadyToDisplay = false; m_pDescriptorQueue[i]->m_bIsReadyToLoad = true; m_pDescriptorQueue[i]->m_bIsSkippedFrame = false; m_pDescriptorQueue[i]->m_bIsBusy = false; --m_iNumDSActiveinQueue; ++m_lNextFrameCounter; return true; } } *pDS = NULL; return false; } // CommonAllocation virtual FrameMemID LockSurface(FrameMemID* mid, bool isSkip = false); virtual void UnLockSurface(FrameMemID memID); FrameMemID GetPrevIndex(void); FrameMemID GetNextIndex(void); FrameMemID GetBFrameIndex(void) ; FrameMemID GetRangeMapIndex(void); void SetCurrIndex(FrameMemID Index); void SetPrevIndex(FrameMemID Index); void SetNextIndex(FrameMemID Index); void SetBFrameIndex(FrameMemID Index); void SetRangeMapIndex(FrameMemID Index); virtual FrameMemID GetIdx(uint32_t Idx); void SeLastFramesMode() {m_bIsLastFramesMode = true;} protected: virtual int32_t LockAndAssocFreeIdx(FrameMemID mid); virtual FrameMemID UnLockIdx(uint32_t Idx); virtual uint32_t CalculateHeapSize(); uint32_t m_iConsumerNumber; VC1FrameDescriptor** m_pDescriptorQueue; uint32_t m_iNumFramesProcessing; uint32_t m_iNumDSActiveinQueue; std::mutex m_mDSGuard; std::vector> m_pGuardGet; VC1VideoDecoder* pMainVC1Decoder; unsigned long long m_lNextFrameCounter; VC1FrameDescriptor* m_pPrefDS; int32_t m_iRangeMapIndex; MemoryAllocator* m_pMemoryAllocator; // (MemoryAllocator*) pointer to memory allocator // for correct VA support // H/W manage index by itself int32_t m_CurrIndex; int32_t m_PrevIndex; int32_t m_NextIndex; int32_t m_BFrameIndex; int32_t m_iICIndex; int32_t m_iICIndexB; UMC::MemID m_iTSHeapID; VC1TSHeap* m_pSHeap; bool m_bIsLastFramesMode; }; } #endif //__umc_umc_vc1_dec_task_store_H__ #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_dec_va_defs.h000066400000000000000000000025051443134507600330050ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef _UMC_VC1_DEC_VA_DEFS_H_ #define _UMC_VC1_DEC_VA_DEFS_H_ #include "umc_va_base.h" #endif //_UMC_VC1_DEC_VA_DEFS_H_ #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include/umc_vc1_huffman.h000066400000000000000000000034321443134507600322070ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_HUFFMAN_H__ #define __UMC_VC1_HUFFMAN_H__ // return value 0 means ok, != 0 - failed. int DecodeHuffmanOne(uint32_t** pBitStream, int* pOffset, int32_t* pDst, const int32_t* pDecodeTable); int DecodeHuffmanPair(uint32_t **pBitStream, int32_t *pBitOffset, const int32_t *pTable, int8_t *pFirst, int16_t *pSecond); int HuffmanTableInitAlloc(const int32_t* pSrcTable, int32_t** ppDstSpec); int HuffmanRunLevelTableInitAlloc(const int32_t* pSrcTable, int32_t** ppDstSpec); void HuffmanTableFree(int32_t *pDecodeTable); #endif // __UMC_VC1_HUFFMAN_H__ #endif // #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) umc_vc1_video_decoder.h000066400000000000000000000165261443134507600333070ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_VIDEO_DECODER_H_ #define __UMC_VC1_VIDEO_DECODER_H_ #include "umc_video_decoder.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_media_data_ex.h" #include "umc_frame_allocator.h" #include "umc_va_base.h" #include "umc_vc1_dec_skipping.h" class MFXVideoDECODEVC1; namespace UMC { class VC1TSHeap; class VC1TaskStoreSW; class VC1VideoDecoder { friend class VC1TaskStore; friend class VC1TaskStoreSW; friend class ::MFXVideoDECODEVC1; public: // Default constructor VC1VideoDecoder(); // Default destructor virtual ~VC1VideoDecoder(); // Initialize for subsequent frame decoding. virtual Status Init(BaseCodecParams *init); // Get next frame virtual Status GetFrame(MediaData* in, MediaData* out); // Close decoding & free all allocated resources virtual Status Close(void); // Reset decoder to initial state virtual Status Reset(void); // Performance tools. Improve speed or quality. // Accelerate Decoder (remove some features like deblocking, smoothing or change InvTransform and Quant) // speed_mode - return current mode // Change Decoding speed Status ChangeVideoDecodingSpeed(int32_t& speed_shift); void SetExtFrameAllocator(FrameAllocator* pFrameAllocator) {m_pExtFrameAllocator = pFrameAllocator;} void SetVideoHardwareAccelerator (VideoAccelerator* va); protected: Status CreateFrameBuffer(uint32_t bufferSize); void GetFrameSize (MediaData* in); void GetPTS (double in_pts); bool GetFPS (VC1Context* pContext); virtual void FreeTables(VC1Context* pContext); virtual bool InitTables(VC1Context* pContext); virtual bool InitAlloc(VC1Context* pContext, uint32_t MaxFrameNum) = 0; virtual bool InitVAEnvironment() = 0; void FreeAlloc(VC1Context* pContext); virtual Status VC1DecodeFrame (MediaData* in, VideoData* out_data); virtual uint32_t CalculateHeapSize() = 0; Status GetStartCodes (uint8_t* pDataPointer, uint32_t DataSize, MediaDataEx* out, uint32_t* readSize); Status SMProfilesProcessing(uint8_t* pBitstream); virtual Status ContextAllocation(uint32_t mbWidth,uint32_t mbHeight); Status StartCodesProcessing(uint8_t* pBStream, uint32_t* pOffsets, uint32_t* pValues, bool IsDataPrepare); Status ParseStreamFromMediaData (); Status ParseStreamFromMediaDataEx (MediaDataEx *in_ex); Status ParseInputBitstream (); Status InitSMProfile (); uint32_t GetCurrentFrameSize() { if (m_dataBuffer) return (uint32_t)m_frameData->GetDataSize(); else return (uint32_t)m_pCurrentIn->GetDataSize(); } Status CheckLevelProfileOnly(VideoDecoderParams *pParam); VideoStreamInfo m_ClipInfo; MemoryAllocator *m_pMemoryAllocator; VC1Context* m_pContext; VC1Context m_pInitContext; uint32_t m_iThreadDecoderNum; // (uint32_t) number of slice decoders uint8_t* m_dataBuffer; //uses for swap data into decoder MediaDataEx* m_frameData; //uses for swap data into decoder MediaDataEx::_MediaDataEx* m_stCodes; uint32_t m_decoderInitFlag; uint32_t m_decoderFlags; UMC::MemID m_iMemContextID; UMC::MemID m_iHeapID; UMC::MemID m_iFrameBufferID; double m_pts; double m_pts_dif; uint32_t m_iMaxFramesInProcessing; unsigned long long m_lFrameCount; bool m_bLastFrameNeedDisplay; VC1TaskStore* m_pStore; VideoAccelerator* m_va; VC1TSHeap* m_pHeap; bool m_bIsReorder; MediaData* m_pCurrentIn; VideoData* m_pCurrentOut; bool m_bIsNeedToFlush; uint32_t m_AllocBuffer; FrameAllocator* m_pExtFrameAllocator; uint32_t m_SurfaceNum; bool m_bIsExternalFR; static const uint32_t NumBufferedFrames = 0; static const uint32_t NumReferenceFrames = 3; virtual UMC::FrameMemID ProcessQueuesForNextFrame(bool& isSkip, mfxU16& Corrupted) = 0; void SetCorrupted(UMC::VC1FrameDescriptor *pCurrDescriptor, mfxU16& Corrupted); bool IsFrameSkipped(); bool IsLastFrameSkipped(); virtual FrameMemID GetDisplayIndex(bool isDecodeOrder, bool isSamePolarSurf); FrameMemID GetLastDisplayIndex(); virtual UMC::Status SetRMSurface(); void UnlockSurfaces(); virtual UMC::FrameMemID GetSkippedIndex(bool isIn = true) = 0; FrameMemID GetFrameOrder(bool isLast, bool isSamePolar, uint32_t & frameOrder); virtual Status RunThread(int /*threadNumber*/) { return UMC_OK; } UMC::VC1FrameDescriptor* m_pDescrToDisplay; mfxU32 m_frameOrder; UMC::FrameMemID m_RMIndexToFree; UMC::FrameMemID m_CurrIndexToFree; std::deque m_FrameStorage; protected: UMC::FrameMemID GetSkippedIndex(UMC::VC1FrameDescriptor *desc, bool isIn); }; } #endif //__UMC_VC1_VIDEO_DECODER_H #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_video_decoder_hw.h000066400000000000000000000156631443134507600340060ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/include// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #ifndef __UMC_VC1_VIDEO_DECODER_HW_H_ #define __UMC_VC1_VIDEO_DECODER_HW_H_ #include "umc_vc1_video_decoder.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_media_data_ex.h" #include "umc_frame_allocator.h" #include "umc_va_base.h" #include "umc_vc1_dec_skipping.h" #include "umc_vc1_dec_task_store.h" class MFXVC1VideoDecoderHW; namespace UMC { class VC1TSHeap; class VC1VideoDecoderHW : public VC1VideoDecoder { friend class VC1TaskStore; public: // Default constructor VC1VideoDecoderHW(); // Default destructor virtual ~VC1VideoDecoderHW(); // Initialize for subsequent frame decoding. virtual Status Init(BaseCodecParams *init); virtual Status Reset(void); // Close decoding & free all allocated resources virtual Status Close(void); void SetVideoHardwareAccelerator (VideoAccelerator* va); protected: virtual bool InitAlloc (VC1Context* pContext, uint32_t MaxFrameNum); virtual Status VC1DecodeFrame (MediaData* in, VideoData* out_data); virtual uint32_t CalculateHeapSize(); virtual bool InitVAEnvironment (); // HW i/f support virtual Status FillAndExecute(MediaData* in); void GetStartCodes_HW(MediaData* in, uint32_t &sShift); MediaDataEx::_MediaDataEx* m_stCodes_VA; template Status VC1DecodeFrame_VLD(MediaData* in, VideoData* out_data) { int32_t SCoffset = 0; Descriptor* pPackDescriptorChild = NULL; bool skip = false; if ((VC1_PROFILE_ADVANCED != m_pContext->m_seqLayerHeader.PROFILE)) // special header (with frame size) in case of .rcv format SCoffset = -VC1FHSIZE; Status umcRes = UMC_ERR_NOT_ENOUGH_DATA; try { // Get FrameDescriptor for Packing Data m_pStore->GetReadyDS(&pPackDescriptorChild); if (NULL == pPackDescriptorChild) throw UMC::VC1Exceptions::vc1_exception(UMC::VC1Exceptions::internal_pipeline_error); pPackDescriptorChild->m_pContext->m_FrameSize = (uint32_t)in->GetDataSize() + SCoffset; umcRes = pPackDescriptorChild->preProcData(m_pContext, (uint32_t)(m_frameData->GetDataSize() + SCoffset), m_lFrameCount, skip); if (UMC_OK != umcRes) { if (UMC_ERR_NOT_ENOUGH_DATA == umcRes) throw UMC::VC1Exceptions::vc1_exception(UMC::VC1Exceptions::invalid_stream); else throw UMC::VC1Exceptions::vc1_exception(UMC::VC1Exceptions::internal_pipeline_error); } } catch (UMC::VC1Exceptions::vc1_exception ex) { if (UMC::VC1Exceptions::invalid_stream == ex.get_exception_type()) { if (UMC::VC1Exceptions::fast_err_detect == UMC::VC1Exceptions::vc1_except_profiler::GetEnvDescript().m_Profile) m_pStore->AddInvalidPerformedDS(pPackDescriptorChild); else if (UMC::VC1Exceptions::fast_decoding == UMC::VC1Exceptions::vc1_except_profiler::GetEnvDescript().m_Profile) m_pStore->ResetPerformedDS(pPackDescriptorChild); else { // Error - let speak about it m_pStore->ResetPerformedDS(pPackDescriptorChild); // need to free surfaces if (!skip) { m_pStore->UnLockSurface(m_pContext->m_frmBuff.m_iCurrIndex); m_pStore->UnLockSurface(m_pContext->m_frmBuff.m_iToSkipCoping); } // for smart decoding we should decode and reconstruct frame according to standard pipeline } return UMC_ERR_NOT_ENOUGH_DATA; } else return UMC_ERR_FAILED; } // if no RM - lets execute if ((!pPackDescriptorChild->m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) && (!pPackDescriptorChild->m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) && (!pPackDescriptorChild->m_pContext->m_seqLayerHeader.RANGERED)) { umcRes = FillAndExecute(in); } // Update round ctrl field of seq header. m_pContext->m_seqLayerHeader.RNDCTRL = pPackDescriptorChild->m_pContext->m_seqLayerHeader.RNDCTRL; m_bLastFrameNeedDisplay = true; switch (pPackDescriptorChild->m_pContext->m_picLayerHeader->PTYPE & VC1_BI_FRAME) { case VC1_I_FRAME: out_data->SetFrameType(I_PICTURE); break; case VC1_P_FRAME: out_data->SetFrameType(P_PICTURE); break; case VC1_B_FRAME: case VC1_BI_FRAME: out_data->SetFrameType(B_PICTURE); break; default://unexpected type assert(0); } if (UMC_OK == umcRes) { if (1 == m_lFrameCount) umcRes = UMC_ERR_NOT_ENOUGH_DATA; } return umcRes; } virtual UMC::FrameMemID ProcessQueuesForNextFrame(bool& isSkip, mfxU16& Corrupted); virtual UMC::Status SetRMSurface(); virtual UMC::FrameMemID GetSkippedIndex(bool isIn = true); }; } #endif //__UMC_VC1_VIDEO_DECODER_HW_H_ #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/000077500000000000000000000000001443134507600261375ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_bitplane.cpp000066400000000000000000000433501443134507600326760ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include #include #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_huffman.h" //4.10 Bitplane Coding //Certain macroblock-specific information can be encoded in one bit per //macroblock. For example, whether or not any information is present for // a macroblock (i.e., whether or not it is skipped) can be signaled with // one bit. In these cases, the status for all macroblocks in a frame can // be coded as a bitplane and transmitted in the frame header. VC1 uses // bitplane coding in three cases to signal information about the macroblocks // in a frame. These are: 1) signaling skipped macroblocks, 2) signaling field // or frame macroblock mode and 3) signaling 1-MV or 4-MV motion vector mode // for each macroblock. This section describes the bitplane coding scheme. //Frame-level bitplane coding is used to encode two-dimensional binary arrays. // The size of each array is rowMB ? colMB, where rowMB and colMB are the //number of macroblock rows and columns respectively. Within the bitstream, // each array is coded as a set of consecutive bits. One of seven modes is // used to encode each array. //The seven modes are enumerated below. //1. Raw mode - coded as one bit per symbol //2. Normal-2 mode - two symbols coded jointly //3. Differential-2 mode - differential coding of bitplane, followed by // coding two residual symbols jointly //4. Normal-6 mode - six symbols coded jointly //5. Differential-6 mode - differential coding of bitplane, followed by // coding six residual symbols jointly //6. Rowskip mode - one bit skip to signal rows with no set bits //7. Columnskip mode - one bit skip to signal columns with no set bits //Section 3.3 shows the syntax elements that make up the bitplane coding scheme. //The follow sections describe how to decode the bitstream and reconstruct the //bitplane. static void InverseDiff(VC1Bitplane* pBitplane, int32_t widthMB, int32_t heightMB,int32_t MaxWidthMB) { int32_t i, j; for(i = 0; i < heightMB; i++) { for(j = 0; j < widthMB; j++) { if((i == 0 && j == 0)) { pBitplane->m_databits[i*MaxWidthMB + j] = pBitplane->m_databits[i*MaxWidthMB + j] ^ pBitplane->m_invert; } else if(j == 0) { pBitplane->m_databits[i*MaxWidthMB + j] = pBitplane->m_databits[i*MaxWidthMB + j] ^pBitplane->m_databits[MaxWidthMB*(i-1)]; } else if(((i>0) && (pBitplane->m_databits[i*MaxWidthMB+j-1] != pBitplane->m_databits[(i-1)*MaxWidthMB+j]))) { pBitplane->m_databits[i*MaxWidthMB + j] = pBitplane->m_databits[i*MaxWidthMB + j] ^ pBitplane->m_invert; } else { pBitplane->m_databits[i*MaxWidthMB + j] = pBitplane->m_databits[i*MaxWidthMB + j] ^ pBitplane->m_databits[i*MaxWidthMB + j - 1]; } } } } static void InverseBitplane(VC1Bitplane* pBitplane, int32_t size) { int32_t i; for(i = 0; i < size; i++) { pBitplane->m_databits[i] = pBitplane->m_databits[i] ^ 1; } } static void Norm2ModeDecode(VC1Context* pContext,VC1Bitplane* pBitplane, int32_t width, int32_t height,int32_t MaxWidthMB) { int32_t i; int32_t j,k; int32_t tmp_databits = 0; if((width*height) & 1) { VC1_GET_BITS(1, tmp_databits); pBitplane->m_databits[0] = (uint8_t)tmp_databits; } j = (width*height) & 1; k = 0; for(i = (width*height) & 1; i < (width*height/2)*2; i+=2) { int32_t tmp; int32_t index = k*MaxWidthMB + j; j++; if(j == width) {j = 0; k++;} int32_t indexNext = k*MaxWidthMB + j; j++; if(j == width) {j = 0; k++;} VC1_GET_BITS(1, tmp); if(tmp == 0) { pBitplane->m_databits[index] = 0; pBitplane->m_databits[indexNext] = 0; } else { VC1_GET_BITS(1, tmp); if(tmp == 1) { pBitplane->m_databits[index] = 1; pBitplane->m_databits[indexNext] = 1; } else { VC1_GET_BITS(1, tmp); if(tmp == 0) { pBitplane->m_databits[index] = 1; pBitplane->m_databits[indexNext] = 0; } else { pBitplane->m_databits[index] = 0; pBitplane->m_databits[indexNext] = 1; } } } } } static void Norm6ModeDecode(VC1Context* pContext, VC1Bitplane* pBitplane, int32_t width, int32_t height,int32_t MaxWidthMB) { int ret; int32_t i, j; int32_t k; int32_t ResidualX = 0; int32_t ResidualY = 0; uint8_t _2x3tiled = (((width%3)!=0)&&((height%3)==0)); if(_2x3tiled) { int32_t sizeW = width/2; int32_t sizeH = height/3; uint8_t *currRowTails = pBitplane->m_databits; for(i = 0; i < sizeH; i++) { //set pointer to start of tail row currRowTails = &pBitplane->m_databits[i*3*MaxWidthMB]; //move tails start if number of MB in row is odd //this column bits will be decoded after currRowTails += width&1; for(j = 0; j < sizeW; j++) { ret = DecodeHuffmanOne( &pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, &k, pContext->m_vlcTbl->m_BitplaneTaledbits ); std::ignore = ret; assert(ret == 0); currRowTails[0] = (uint8_t)(k&1); currRowTails[1] = (uint8_t)((k&2)>>1); currRowTails[MaxWidthMB + 0] = (uint8_t)((k&4)>>2); currRowTails[MaxWidthMB + 1] = (uint8_t)((k&8)>>3); currRowTails[2*MaxWidthMB + 0] = (uint8_t)((k&16)>>4); currRowTails[2*MaxWidthMB + 1] = (uint8_t)((k&32)>>5); currRowTails+=2; } } ResidualX = width & 1; ResidualY = 0; } else //3x2 tiled { int32_t sizeW = width/3; int32_t sizeH = height/2; uint8_t *currRowTails = pBitplane->m_databits; for(i = 0; i < sizeH; i++) { //set pointer to start of tail row currRowTails = &pBitplane->m_databits[i*2*MaxWidthMB]; //move tails start if number of MB in row is odd //this column bits will be decoded after currRowTails += width%3; currRowTails += (height&1)*width; for(j = 0; j < sizeW; j++) { ret = DecodeHuffmanOne( &pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, &k, pContext->m_vlcTbl->m_BitplaneTaledbits ); assert(ret == ippStsNoErr); currRowTails[0] = (uint8_t)(k&1); currRowTails[1] = (uint8_t)((k&2)>>1); currRowTails[2] = ((uint8_t)(k&4)>>2); currRowTails[MaxWidthMB + 0] = (uint8_t)((k&8)>>3); currRowTails[MaxWidthMB + 1] = (uint8_t)((k&16)>>4); currRowTails[MaxWidthMB + 2] = (uint8_t)((k&32)>>5); currRowTails+=3; } } ResidualX = width % 3; ResidualY = height & 1; } //ResidualY 0 or 1 or 2 for(i = 0; i < ResidualX; i++) { int32_t ColSkip; VC1_GET_BITS(1, ColSkip); if(1 == ColSkip) { for(j = 0; j < height; j++) { int32_t Value = 0; VC1_GET_BITS(1, Value); pBitplane->m_databits[i + MaxWidthMB * j] = (uint8_t)Value; } } else { for(j = 0; j < height; j++) { pBitplane->m_databits[i + MaxWidthMB * j] = 0; } } } //ResidualY 0 or 1 for(j = 0; j < ResidualY; j++) { int32_t RowSkip; VC1_GET_BITS(1, RowSkip); if(1 == RowSkip) { for(i = ResidualX; i < width; i++) { int32_t Value = 0; VC1_GET_BITS(1, Value); pBitplane->m_databits[i] = (uint8_t)Value; } } else { for(i = ResidualX; i < width; i++) { pBitplane->m_databits[i] = 0; } } } } void DecodeBitplane(VC1Context* pContext, VC1Bitplane* pBitplane, int32_t width, int32_t height,int32_t offset) { int32_t tmp; int32_t i, j; int ret; int32_t tmp_invert = 0; int32_t tmp_databits = 0; memset(pBitplane, 0, sizeof(VC1Bitplane)); ++pContext->bp_round_count; if (VC1_MAX_BITPANE_CHUNCKS == pContext->bp_round_count) pContext->bp_round_count = 0; uint32_t HeightMB = pContext->m_seqLayerHeader.heightMB; if(pContext->m_seqLayerHeader.INTERLACE) HeightMB = HeightMB + (HeightMB & 1); if (pContext->bp_round_count >= 0) pBitplane->m_databits = pContext->m_pBitplane.m_databits + HeightMB* pContext->m_seqLayerHeader.MaxWidthMB*pContext->bp_round_count + offset; else pBitplane->m_databits = pContext->m_pBitplane.m_databits - HeightMB * pContext->m_seqLayerHeader.MaxWidthMB + offset; //4.10.1 //The INVERT field shown in the syntax diagram of Figure 30 is a one bit //code, which if set indicates that the bitplane has more set bits than //zero bits. Depending on INVERT and the mode, the decoder must invert //the interpreted bitplane to recreate the original. VC1_GET_BITS(1, tmp_invert); pBitplane->m_invert = (uint8_t)tmp_invert; //VC-1 Table 68: IMODE Codetable //CODING MODE CODEWORD //Raw 0000 //Norm-2 10 //Diff-2 001 //Norm-6 11 //Diff-6 0001 //Rowskip 010 //Colskip 011 ret = DecodeHuffmanOne( &pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, &pBitplane->m_imode, pContext->m_vlcTbl->m_Bitplane_IMODE ); std::ignore = ret; assert(ret == 0); #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Bitplane bits: ")); #endif //The DATABITS field shown in the syntax diagram of Figure 28 is an entropy //coded stream of symbols that is based on the coding mode. The seven coding //modes are described in the following sections. switch(pBitplane->m_imode) { case VC1_BITPLANE_RAW_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Raw mode\n")); #endif //nothing to do break; case VC1_BITPLANE_NORM2_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Norm2 mode\n")); #endif //4.10.3.3 Normal-2 mode //If rowMB x colMB is odd, the first symbol is encoded raw. Subsequent //symbols are encoded pairwise, in natural scan order. The binary VLC //table in Table 57 is used to encode symbol pairs. //Table 57: Norm-2/Diff-2 Code Table //SYMBOL 2N SYMBOL 2N + 1 CODEWORD // 0 0 0 // 1 0 100 // 0 1 101 // 1 1 11 Norm2ModeDecode(pContext, pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); if(pBitplane->m_invert) { InverseBitplane(pBitplane, pContext->m_seqLayerHeader.MaxWidthMB*height); } break; case VC1_BITPLANE_DIFF2_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Diff2 mode\n")); #endif //decode differentional bits Norm2ModeDecode(pContext, pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); //restore original InverseDiff(pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); break; case VC1_BITPLANE_NORM6_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Norm6 mode\n")); #endif //In the Norm-6 and Diff-6 modes, the bitplane is encoded in groups of //six pixels. These pixels are grouped into either 2x3 or 3x2 tiles. //The bitplane is tiled maximally using a set of rules, and the remaining //pixels are encoded using a variant of row-skip and column-skip modes. //3x2 "vertical" tiles are used if and only if rowMB is a multiple of 3 //and colMB is not. Else, 2x3 "horizontal" tiles are used Norm6ModeDecode(pContext, pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); if(pBitplane->m_invert) { InverseBitplane(pBitplane, pContext->m_seqLayerHeader.MaxWidthMB*height); } break; case VC1_BITPLANE_DIFF6_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Diff6 mode\n")); #endif //decode differentional bits Norm6ModeDecode(pContext, pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); //restore original InverseDiff(pBitplane, width, height,pContext->m_seqLayerHeader.MaxWidthMB); break; case VC1_BITPLANE_ROWSKIP_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Rowskip mode\n")); #endif //In the row-skip coding mode, all-zero rows are skipped with one bit overhead. //The syntax is as shown in Figure 79. //If the entire row is zero, a zero bit is sent as the ROWSKIP symbol, //and ROWBITS is skipped. If there is a set bit in the row, ROWSKIP //is set to 1, and the entire row is sent raw (ROWBITS). Rows are //scanned from the top to the bottom of the frame. for(i = 0; i < height; i++) { VC1_GET_BITS(1, tmp); if(tmp == 0) { for(j = 0; j < width; j++) pBitplane->m_databits[pContext->m_seqLayerHeader.MaxWidthMB*i + j] = 0; } else { for(j = 0; j < width; j++) { VC1_GET_BITS(1, tmp_databits); pBitplane->m_databits[pContext->m_seqLayerHeader.MaxWidthMB*i + j] = (uint8_t)tmp_databits; } } } if(pBitplane->m_invert) { InverseBitplane(pBitplane, pContext->m_seqLayerHeader.MaxWidthMB*height); } break; case VC1_BITPLANE_COLSKIP_MODE: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BITBLANES, VM_STRING("Collskip mode\n")); #endif //Column-skip is the transpose of row-skip. Columns are scanned from the //left to the right of the frame. for(i = 0; i < width; i++) { VC1_GET_BITS(1, tmp); if(tmp == 0) { for(j = 0; j < height; j++) pBitplane->m_databits[i + j*pContext->m_seqLayerHeader.MaxWidthMB] = 0; } else { for(j = 0; j < height; j++) { VC1_GET_BITS(1, tmp_databits); pBitplane->m_databits[i + j*pContext->m_seqLayerHeader.MaxWidthMB] = (uint8_t)tmp_databits; } } } if(pBitplane->m_invert) { InverseBitplane(pBitplane, pContext->m_seqLayerHeader.MaxWidthMB*height); } break; } #ifdef VC1_DEBUG_ON if (VC1_DEBUG&VC1_BITBLANES) VM_Debug::GetInstance(VC1DebugRoutine).print_bitplane(pBitplane, pContext->m_seqLayerHeader.MaxWidthMB, heightMB); #endif } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_bpic.cpp000066400000000000000000000131271443134507600320140ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" VC1Status DecodePictureLayer_ProgressiveBpicture(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; picLayerHeader->RNDCTRL = seqLayerHeader->RNDCTRL; //3.2.1.7 //PQINDEX is a 5-bit field that signals the quantizer scale index //for the entire frame. It is present in all picture types. If the //implicit quantizer is used (signaled by sequence field //QUANTIZER = 00, see section 3.1.19) then PQINDEX specifies both //the picture quantizer scale (PQUANT) and the quantizer //(3QP or 5QP deadzone) used for the frame. Table 5 shows how //PQINDEX is translated to PQUANT and the quantizer for implicit mode. //If the quantizer is signaled explicitly at the sequence or frame //level (signaled by sequence field QUANTIZER = 01, 10 or 11 see //section 3.1.19) then PQINDEX is translated to the picture quantizer //stepsize PQUANT as indicated by Table 6. VC1_GET_BITS(5, picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX <= 8) { //3.2.1.8 //HALFQP is a 1bit field present in all frame types if QPINDEX //is less than or equal to 8. The HALFQP field allows the picture //quantizer to be expressed in half step increments over the low //PQUANT range. If HALFQP = 1 then the picture quantizer stepsize //is PQUANT + ?. If HALFQP = 0 then the picture quantizer //stepize is PQUANT. Therefore, if the 3QP deadzone quantizer //is used then half stepsizes are possible up to PQUANT = 9 //(i.e., PQUANT = 1, 1.5, 2, 2.5 8.5, 9) and then only integer //stepsizes are allowable above PQUANT = 9. For the 5QP deadzone //quantizer, half stepsizes are possible up to PQUANT = 7 (i.e., //1, 1.5, 2, 2.5 6.5, 7). VC1_GET_BITS(1, picLayerHeader->HALFQP); } if(seqLayerHeader->QUANTIZER == 01) { //3.2.1.9 //PQUANTIZER is a 1 bit field present in all frame types if the //sequence level field QUANTIZER = 01 (see section 3.1.19). //In this case, the quantizer used for the frame is specified by //PQUANTIZER. If PQUANTIZER = 0 then the 5QP deadzone quantizer //is used for the frame. If PQUANTIZER = 1 then the 3QP deadzone //quantizer is used. VC1_GET_BITS(1, picLayerHeader->PQUANTIZER); //PQUANTIZER } CalculatePQuant(pContext); MVRangeDecode(pContext); //VC-1 Table 47: B Picture MVMODE codetable //MVMODE VLC Mode //1 1 MV //0 1 MV Half-pel bilinear VC1_GET_BITS(1, picLayerHeader->MVMODE); picLayerHeader->MVMODE =(picLayerHeader->MVMODE==1)? VC1_MVMODE_1MV:VC1_MVMODE_HPELBI_1MV; //3.2.1.15 //The DIRECTMB field is present only present in B pictures. //The DIRECTMB field uses bitplane coding to indicate the //macroblocks in the B picture that are coded in direct mode. //The DIRECTMB field may also signal that the direct mode is //signaled in raw mode in which case the direct mode is signaled //at the macroblock level (see section 3.2.2.11). Refer to section //4.10 for a description of the bitplane coding method. DecodeBitplane(pContext, &picLayerHeader->m_DirectMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB,seqLayerHeader->heightMB,0); VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB VC1_GET_BITS(2, picLayerHeader->CBPTAB); //CBPTAB vc1Res = VOPDQuant(pContext); if (seqLayerHeader->VSTRANSFORM == 1) { VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else { picLayerHeader->TTFRM = VC1_BLK_INTER; } } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_bpic_adv.cpp000066400000000000000000000274721443134507600326560ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_huffman.h" #include "umc_vc1_common_tables.h" static const uint32_t bc_lut_2[] = {0,1,2,3}; static const uint32_t bc_lut_1[] = {4,0,1,3}; VC1Status DecodePictHeaderParams_ProgressiveBpicture_Adv (VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("B frame type \n")); #endif //extended MV range flag MVRangeDecode(pContext); //motion vector mode VC1_GET_BITS(1, picLayerHeader->MVMODE); picLayerHeader->MVMODE =(picLayerHeader->MVMODE==1)? VC1_MVMODE_1MV:VC1_MVMODE_HPELBI_1MV; //B frame direct mode macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->m_DirectMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //skipped macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //motion vector table VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB //coded block pattern table VC1_GET_BITS(2,picLayerHeader->CBPTAB); //CBPTAB vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM) { //macroblock-level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else { picLayerHeader->TTFRM = VC1_BLK_INTER; } } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } VC1Status DecodePictHeaderParams_InterlaceBpicture_Adv(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; (void) tempValue; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("B frame type \n")); #endif { //B picture fraction int8_t z1; int16_t z2; DecodeHuffmanPair(&pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, pContext->m_vlcTbl->BFRACTION, &z1, &z2); assert (z2 != VC1_BRACTION_INVALID); assert (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED)); if (z2 == VC1_BRACTION_BI) { picLayerHeader->PTYPE = VC1_BI_FRAME; } picLayerHeader->BFRACTION = (z1*2>=z2)?1:0; picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1; if (z1 < 8 && z2 < 9) picLayerHeader->BFRACTION_index = VC1_BFraction_indexes[z1][z2]; } //extended MV range flag MVRangeDecode(pContext); //extended differential MV Range Flag if(seqLayerHeader->EXTENDED_DMV == 1) { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 0 picLayerHeader->DMVRANGE = VC1_DMVRANGE_NONE; } else { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 10 picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_RANGE; } else { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 110 picLayerHeader->DMVRANGE = VC1_DMVRANGE_VERTICAL_RANGE; } else { //binary code 111 picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE; } } } } //intensity compensation VC1_GET_BITS(1, tempValue); //INTCOMP //B frame direct mode macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->m_DirectMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //skipped macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //in B pic MVMODE always VC1_MVMODE_1MV picLayerHeader->MVMODE = VC1_MVMODE_1MV; //motion vector table VC1_GET_BITS(2, picLayerHeader->MBMODETAB); //MBMODETAB //motion vector table VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB //coded block pattern table VC1_GET_BITS(3,picLayerHeader->CBPTAB); //CBPTAB VC1_GET_BITS(2, picLayerHeader->MV2BPTAB); //MV2BPTAB VC1_GET_BITS(2, picLayerHeader->MV4BPTAB) //MV4BPTAB; vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM) { //macroblock-level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else { picLayerHeader->TTFRM = VC1_BLK_INTER; } } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //frame-level transform AC Coding set index VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } VC1Status DecodeFieldHeaderParams_InterlaceFieldBpicture_Adv (VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; (void) tempValue; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("B frame type \n")); #endif picLayerHeader->NUMREF = 1; VC1_GET_BITS(5,picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX<=8) { VC1_GET_BITS(1,picLayerHeader->HALFQP); } else picLayerHeader->HALFQP = 0; if(seqLayerHeader->QUANTIZER == 1) { VC1_GET_BITS(1,picLayerHeader->PQUANTIZER); //PQUANTIZER } CalculatePQuant(pContext); if(seqLayerHeader->POSTPROCFLAG) { //post processing VC1_GET_BITS(2,tempValue); //POSTPROC } //extended MV range flag MVRangeDecode(pContext); //extended differential MV Range Flag DMVRangeDecode(pContext); //motion vector mode if(picLayerHeader->PQUANT > 12) { //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //000 Mixed MV int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_1); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; } else { //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //000 1 MV Half-pel bilinear int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_2); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; } //FORWARDMB if (picLayerHeader->CurrField == 0) DecodeBitplane(pContext, &picLayerHeader->FORWARDMB, seqLayerHeader->widthMB, (seqLayerHeader->heightMB+1)/2,0); else DecodeBitplane(pContext, &picLayerHeader->FORWARDMB, seqLayerHeader->widthMB, (seqLayerHeader->heightMB+1)/2, seqLayerHeader->MaxWidthMB * ((seqLayerHeader->heightMB+1)/2)); //motion vector table VC1_GET_BITS(3, picLayerHeader->MBMODETAB); //MBMODETAB VC1_GET_BITS(3, picLayerHeader->MVTAB); //MVTAB //coded block pattern table VC1_GET_BITS(3, picLayerHeader->CBPTAB); //CBPTAB if(picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) { VC1_GET_BITS(2, picLayerHeader->MV4BPTAB) //MV4BPTAB; } vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM == 1) { //macroblock - level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else picLayerHeader->TTFRM = VC1_BLK_INTER; } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //frame-level transform AC Coding set index VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB picLayerHeader->REFDIST = *pContext->pRefDist; return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_dec_frame_descr.cpp000066400000000000000000000304541443134507600332740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_task_store.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_common.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_vc1_dec_exception.h" #include "mfx_trace.h" using namespace UMC; using namespace UMC::VC1Exceptions; bool VC1FrameDescriptor::Init(uint32_t DescriporID, VC1Context* pContext, VC1TaskStore* pStore, int16_t* pResidBuf) { VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t HeightMB = pContext->m_seqLayerHeader.MaxHeightMB; uint32_t WidthMB = pContext->m_seqLayerHeader.MaxWidthMB; if(seqLayerHeader->INTERLACE) HeightMB = HeightMB + (HeightMB & 1); //in case of field with odd height if (!m_pContext) { uint8_t* ptr = NULL; ptr += mfx::align2_value(sizeof(VC1Context)); ptr += mfx::align2_value(sizeof(VC1PictureLayerHeader)*VC1_MAX_SLICE_NUM); ptr += mfx::align2_value((HeightMB*seqLayerHeader->MaxWidthMB*VC1_MAX_BITPANE_CHUNCKS)); // Need to replace with MFX allocator if (m_pMemoryAllocator->Alloc(&m_iMemContextID, (size_t)ptr, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext = (VC1Context*)(m_pMemoryAllocator->Lock(m_iMemContextID)); memset(m_pContext,0,size_t(ptr)); m_pContext->bp_round_count = -1; ptr = (uint8_t*)m_pContext; ptr += mfx::align2_value(sizeof(VC1Context)); m_pContext->m_picLayerHeader = (VC1PictureLayerHeader*)ptr; m_pContext->m_InitPicLayer = m_pContext->m_picLayerHeader; ptr += mfx::align2_value((sizeof(VC1PictureLayerHeader)*VC1_MAX_SLICE_NUM)); m_pContext->m_pBitplane.m_databits = ptr; } uint32_t buffSize = 2*(HeightMB*VC1_PIXEL_IN_LUMA)*(WidthMB*VC1_PIXEL_IN_LUMA); //buf size should be divisible by 4 if(buffSize & 0x00000003) buffSize = (buffSize&0xFFFFFFFC) + 4; // Need to replace with MFX allocator if (m_pMemoryAllocator->Alloc(&m_iInernBufferID, buffSize, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pContext->m_pBufferStart = (uint8_t*)m_pMemoryAllocator->Lock(m_iInernBufferID); memset(m_pContext->m_pBufferStart, 0, buffSize); // memory for diffs for each FrameDescriptor if (!m_pDiffMem) { if (!pResidBuf) { if(m_pMemoryAllocator->Alloc(&m_iDiffMemID, sizeof(int16_t)*WidthMB*HeightMB*8*8*6, UMC_ALLOC_PERSISTENT, 16) != UMC_OK ) { return false; } m_pDiffMem = (int16_t*)m_pMemoryAllocator->Lock(m_iDiffMemID); } else m_pDiffMem = pResidBuf; } // Pointers to common pContext m_pStore = pStore; m_pContext->m_vlcTbl = pContext->m_vlcTbl; m_pContext->pRefDist = &pContext->RefDist; m_pContext->m_frmBuff.m_pFrames = pContext->m_frmBuff.m_pFrames; m_pContext->m_frmBuff.m_iDisplayIndex = 0; m_pContext->m_frmBuff.m_iCurrIndex = 0; m_pContext->m_frmBuff.m_iPrevIndex = 0; m_pContext->m_frmBuff.m_iNextIndex = 1; m_pContext->m_frmBuff.m_iRangeMapIndex = pContext->m_frmBuff.m_iRangeMapIndex; m_pContext->m_frmBuff.m_iToFreeIndex = -1; m_pContext->m_seqLayerHeader = pContext->m_seqLayerHeader; m_iSelfID = DescriporID; return true; } bool VC1FrameDescriptor::SetNewSHParams(VC1Context* pContext) { m_pContext->m_seqLayerHeader = pContext->m_seqLayerHeader; return true; } void VC1FrameDescriptor::Reset() { m_iFrameCounter = 0; m_iRefFramesDst = 0; m_bIsReadyToLoad = true; m_iSelfID = 0; m_iRefFramesDst = 0; m_iBFramesDst = 0; m_bIsReferenceReady = false; m_bIsReadyToDisplay = false; m_bIsSkippedFrame = false; m_bIsReadyToProcess = false; m_bIsBusy = false; } void VC1FrameDescriptor::Release() { if(m_pMemoryAllocator) { if (static_cast(m_iDiffMemID) != -1) { m_pMemoryAllocator->Unlock(m_iDiffMemID); m_pMemoryAllocator->Free(m_iDiffMemID); m_iDiffMemID = (MemID)-1; } if (static_cast(m_iInernBufferID) != -1) { m_pMemoryAllocator->Unlock(m_iInernBufferID); m_pMemoryAllocator->Free(m_iInernBufferID); m_iInernBufferID = (MemID)-1; } if (static_cast(m_iMemContextID) != -1) { m_pMemoryAllocator->Unlock(m_iMemContextID); m_pMemoryAllocator->Free(m_iMemContextID); m_iMemContextID = (MemID)-1; } } } Status VC1FrameDescriptor::SetPictureIndices(uint32_t PTYPE, bool& skip) { Status vc1Sts = VC1_OK; FrameMemID CheckIdx = 0; switch(PTYPE) { case VC1_I_FRAME: case VC1_P_FRAME: if (m_pStore->IsNeedSkipFrame(PTYPE)) { skip = true; return UMC_ERR_NOT_ENOUGH_DATA; } m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex(); m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex(); if (m_pContext->m_frmBuff.m_iPrevIndex == -1) { CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iPrevIndex); m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iPrevIndex; } else if (m_pContext->m_frmBuff.m_iNextIndex == -1) { CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iNextIndex); m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iNextIndex; } else { m_pContext->m_frmBuff.m_iToFreeIndex = m_pContext->m_frmBuff.m_iPrevIndex; CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iPrevIndex); m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iPrevIndex; m_pContext->m_frmBuff.m_iPrevIndex = m_pContext->m_frmBuff.m_iNextIndex; m_pContext->m_frmBuff.m_iNextIndex = m_pContext->m_frmBuff.m_iCurrIndex; } // for Range mapping get prev index m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetNextIndex(); if (-1 == m_pContext->m_frmBuff.m_iDisplayIndex) m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetPrevIndex(); m_pStore->SetNextIndex(m_pContext->m_frmBuff.m_iNextIndex); m_pStore->SetCurrIndex(m_pContext->m_frmBuff.m_iCurrIndex); m_pStore->SetPrevIndex(m_pContext->m_frmBuff.m_iPrevIndex); m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].corrupted= 0; break; case VC1_B_FRAME: if (m_pStore->IsNeedSkipFrame(PTYPE)) { skip = true; return UMC_ERR_NOT_ENOUGH_DATA; } m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex(); m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex(); m_pContext->m_frmBuff.m_iBFrameIndex = m_pStore->GetBFrameIndex(); CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iBFrameIndex); m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iBFrameIndex; m_pStore->SetCurrIndex(m_pContext->m_frmBuff.m_iCurrIndex); m_pStore->SetBFrameIndex(m_pContext->m_frmBuff.m_iBFrameIndex); // possible situation in case of SKIP frames if (m_pContext->m_frmBuff.m_iNextIndex == -1) { m_pContext->m_frmBuff.m_iNextIndex = m_pContext->m_frmBuff.m_iPrevIndex; m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex; m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].corrupted = ERROR_FRAME_MAJOR; } else { m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex; m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].corrupted= 0; } m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex; break; case VC1_BI_FRAME: if (m_pStore->IsNeedSkipFrame(PTYPE)) { skip = true; return UMC_ERR_NOT_ENOUGH_DATA; } m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex(); m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex(); m_pContext->m_frmBuff.m_iBFrameIndex = m_pStore->GetBFrameIndex(); CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iBFrameIndex); m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iBFrameIndex; m_pStore->SetCurrIndex(m_pContext->m_frmBuff.m_iCurrIndex); m_pStore->SetBFrameIndex(m_pContext->m_frmBuff.m_iBFrameIndex); m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex; m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].corrupted= 0; break; default: break; } if (VC1_IS_SKIPPED(PTYPE)) { m_pContext->m_frmBuff.m_iCurrIndex = m_pContext->m_frmBuff.m_iNextIndex = m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetNextIndex(); if (-1 == m_pContext->m_frmBuff.m_iCurrIndex) m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetPrevIndex(); if (-1 == m_pContext->m_frmBuff.m_iDisplayIndex) m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetPrevIndex(); if (m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG || m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG || m_pContext->m_seqLayerHeader.RANGERED) m_pContext->m_frmBuff.m_iRangeMapIndex = m_pStore->GetRangeMapIndex(); m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex(); CheckIdx = m_pStore->LockSurface(&m_pContext->m_frmBuff.m_iToSkipCoping, true); m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].corrupted = 0; } if (-1 == CheckIdx) return VC1_FAIL; if ((VC1_P_FRAME == PTYPE) || VC1_IS_SKIPPED(PTYPE)) { if (m_pContext->m_frmBuff.m_iPrevIndex == -1) return UMC_ERR_NOT_ENOUGH_DATA; } else if (VC1_B_FRAME == PTYPE) { if ((m_pContext->m_frmBuff.m_iPrevIndex == -1)|| (m_pContext->m_frmBuff.m_iNextIndex == -1)) return UMC_ERR_NOT_ENOUGH_DATA; } m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].FCM = m_pContext->m_picLayerHeader->FCM; m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].ICFieldMask = 0; if (m_pContext->m_frmBuff.m_iPrevIndex > -1) m_pContext->PrevFCM = m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].FCM; else m_pContext->PrevFCM = m_pContext->m_picLayerHeader->FCM; if (m_pContext->m_frmBuff.m_iNextIndex > -1) m_pContext->NextFCM = m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].FCM; else m_pContext->NextFCM = m_pContext->m_picLayerHeader->FCM; return vc1Sts; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_frame_va.cpp000066400000000000000000000653061443134507600326650ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_va_base.h" #include "umc_vc1_dec_frame_descr_va.h" #include "umc_vc1_dec_frame_descr.h" #include "umc_vc1_dec_task_store.h" #include "umc_vc1_common.h" using namespace UMC::VC1Common; #define DXVA2_VC1PICTURE_PARAMS_EXT_BUFFER 21 #define DXVA2_VC1BITPLANE_EXT_BUFFER 22 namespace UMC { using namespace VC1Exceptions; enum { VC1_I_I_FRAME = 0, VC1_I_P_FRAME = 1, VC1_P_I_FRAME = 2, VC1_P_P_FRAME = 3, VC1_B_B_FRAME = 4, VC1_B_BI_FRAME = 5, VC1_BI_B_FRAME = 6, VC1_BI_BI_FRAME = 7 }; void VC1PackerLVA::VC1SetSliceDataBuffer(int32_t size) { UMCVACompBuffer* pCompBuf; uint8_t* ptr = (uint8_t*)m_va->GetCompBuffer(VASliceDataBufferType, &pCompBuf, size); if (!pCompBuf || (pCompBuf->GetBufferSize() < size)) throw vc1_exception(mem_allocation_er); memset(ptr, 0, size); } void VC1PackerLVA::VC1SetBitplaneBuffer(int32_t size) { UMCVACompBuffer* CompBuf; uint8_t* ptr = (uint8_t*)m_va->GetCompBuffer(VABitPlaneBufferType, &CompBuf, size); if (CompBuf->GetBufferSize() < size) throw vc1_exception(mem_allocation_er); memset(ptr, 0, size); } void VC1PackerLVA::VC1SetSliceParamBuffer(uint32_t* pOffsets, uint32_t* pValues) { const uint32_t Slice = 0x0B010000; const uint32_t Field = 0x0C010000; int32_t slice_counter = 1; pOffsets++; pValues++; while (*pOffsets) { if (pValues && (*pValues == Slice || *pValues == Field)) { ++slice_counter; } ++pOffsets; ++pValues; } UMCVACompBuffer* pCompBuf; m_pSliceInfo = (VASliceParameterBufferVC1*)m_va->GetCompBuffer(VASliceParameterBufferType, &pCompBuf, slice_counter * sizeof(VASliceParameterBufferVC1)); if (!pCompBuf || (static_cast(pCompBuf->GetBufferSize()) < slice_counter * sizeof(VASliceParameterBufferVC1))) throw vc1_exception(mem_allocation_er); memset(m_pSliceInfo, 0, slice_counter * sizeof(VASliceParameterBufferVC1)); } void VC1PackerLVA::VC1SetPictureBuffer() { UMCVACompBuffer* pCompBuf; m_pPicPtr = (VAPictureParameterBufferVC1*)m_va->GetCompBuffer(VAPictureParameterBufferType, &pCompBuf,sizeof(VAPictureParameterBufferVC1)); if (!pCompBuf || (static_cast(pCompBuf->GetBufferSize()) < sizeof(VAPictureParameterBufferVC1))) throw vc1_exception(mem_allocation_er); memset(m_pPicPtr, 0, sizeof(VAPictureParameterBufferType)); } //to support multislice mode. Save number of slices value in reserved bits of first slice void VC1PackerLVA::VC1SetBuffersSize(uint32_t SliceBufIndex) { UMCVACompBuffer* CompBuf; m_va->GetCompBuffer(VASliceParameterBufferType,&CompBuf); CompBuf->SetDataSize(SliceBufIndex*sizeof(VASliceParameterBufferVC1)); CompBuf->SetNumOfItem(SliceBufIndex); m_va->GetCompBuffer(VAPictureParameterBufferType,&CompBuf); CompBuf->SetDataSize(sizeof(VAPictureParameterBufferVC1)); } void VC1PackerLVA::VC1PackBitplaneBuffers(VC1Context* pContext) { UMCVACompBuffer* CompBuf; int32_t i; int32_t bitplane_size = 0; int32_t real_bitplane_size = 0; VC1Bitplane* lut_bitplane[3]; VC1Bitplane* check_bitplane = NULL; switch (pContext->m_picLayerHeader->PTYPE) { case VC1_I_FRAME: case VC1_BI_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->FIELDTX; lut_bitplane[1] = &pContext->m_picLayerHeader->ACPRED; lut_bitplane[2] = &pContext->m_picLayerHeader->OVERFLAGS; break; case VC1_P_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->m_DirectMB; lut_bitplane[1] = &pContext->m_picLayerHeader->SKIPMB; lut_bitplane[2] = &pContext->m_picLayerHeader->MVTYPEMB; break; case VC1_B_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->m_DirectMB; lut_bitplane[1] = &pContext->m_picLayerHeader->SKIPMB; lut_bitplane[2] = &pContext->m_picLayerHeader->FORWARDMB; break; default: return; } for (i = 0; i < 3; i++) { if ((!VC1_IS_BITPLANE_RAW_MODE(lut_bitplane[i])) && lut_bitplane[i]->m_databits) check_bitplane = lut_bitplane[i]; } if(check_bitplane) { bitplane_size = ((pContext->m_seqLayerHeader.heightMB+1)/2)*pContext->m_seqLayerHeader.widthMB; real_bitplane_size = pContext->m_seqLayerHeader.heightMB * pContext->m_seqLayerHeader.widthMB; if (pContext->m_picLayerHeader->FCM == VC1_FieldInterlace) bitplane_size /= 2; uint8_t* ptr = (uint8_t*)m_va->GetCompBuffer(VABitPlaneBufferType, &CompBuf, bitplane_size); if (!ptr) throw vc1_exception(mem_allocation_er); memset(ptr, 0, bitplane_size); for (i = 0; i < 3; i++) { if (!lut_bitplane[i]->m_databits) lut_bitplane[i] = check_bitplane; } for (i = 0; i < real_bitplane_size - (real_bitplane_size & 0x1);) { *ptr = (lut_bitplane[0]->m_databits[i] << 4) + (lut_bitplane[1]->m_databits[i] << 5) + (lut_bitplane[2]->m_databits[i] << 6) + lut_bitplane[0]->m_databits[i+1] + (lut_bitplane[1]->m_databits[i+1] << 1) + (lut_bitplane[2]->m_databits[i+1] << 2); i += 2; ++ptr; } // last macroblock case if (real_bitplane_size & 0x1) *ptr = (lut_bitplane[0]->m_databits[i] << 4) + (lut_bitplane[1]->m_databits[i] << 5) + (lut_bitplane[2]->m_databits[i] << 6); CompBuf->SetDataSize(bitplane_size); } } uint32_t VC1PackerLVA::VC1PackBitStreamAdv (VC1Context* pContext, uint32_t& Size, uint8_t* pOriginalData, uint32_t OriginalSize, uint32_t ByteOffset, uint8_t& Flag_03) { UMCVACompBuffer* CompBuf; uint8_t* pBitstream = (uint8_t*)m_va->GetCompBuffer(VASliceDataBufferType, &CompBuf, OriginalSize); uint32_t DrvBufferSize = CompBuf->GetBufferSize(); uint8_t* pEnd = pBitstream + ByteOffset + OriginalSize; Size = OriginalSize; if (DrvBufferSize < (OriginalSize + ByteOffset)) // we don't have enough buffer { throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); } if(Flag_03 == 1) { *(pBitstream + ByteOffset) = 0; MFX_INTERNAL_CPY(pBitstream + ByteOffset + 1, pOriginalData + 1, OriginalSize - 1); Flag_03 = 0; } else if(Flag_03 == 2) { if (pContext->m_bitstream.bitOffset < 24) { MFX_INTERNAL_CPY(pBitstream + ByteOffset, pOriginalData + 1, OriginalSize + 1); pEnd++; *(pBitstream + ByteOffset + 1) = 0; Size--; } else { MFX_INTERNAL_CPY(pBitstream + ByteOffset, pOriginalData, OriginalSize ); } Flag_03 = 0; } else if(Flag_03 == 3) { if(pContext->m_bitstream.bitOffset < 16) { *(pBitstream + ByteOffset) = *pOriginalData; *(pBitstream + ByteOffset + 1) = *(pOriginalData + 1); *(pBitstream + ByteOffset + 2) = *(pOriginalData + 2); *(pBitstream + ByteOffset + 3) = *(pOriginalData + 4); MFX_INTERNAL_CPY(pBitstream + ByteOffset + 4, pOriginalData + 5, OriginalSize - 4); Size--; } else { MFX_INTERNAL_CPY(pBitstream + ByteOffset, pOriginalData, OriginalSize); } Flag_03 = 0; } else if(Flag_03 == 4) { MFX_INTERNAL_CPY(pBitstream + ByteOffset, pOriginalData, OriginalSize); Flag_03 = 0; } else if(Flag_03 == 5) { *(pBitstream + ByteOffset) = 0; *(pBitstream + ByteOffset + 1) = *(pOriginalData + 1); *(pBitstream + ByteOffset + 2) = *(pOriginalData + 2); MFX_INTERNAL_CPY(pBitstream + ByteOffset + 3, pOriginalData + 4, OriginalSize - 4); pEnd--; Size--; Flag_03 = 0; } else { MFX_INTERNAL_CPY(pBitstream + ByteOffset, pOriginalData, OriginalSize); } CompBuf->SetDataSize(ByteOffset + Size); if(*(pEnd-1) == 0x03 && *(pEnd -2) == 0x0 && *(pEnd-3) == 0x0) { *(pEnd-1) = 0; } return 0; } static int ConvertMvModeVC1Mfx2VA(int mv_mode) { switch (mv_mode) { case VC1_MVMODE_HPELBI_1MV: return VAMvMode1MvHalfPelBilinear; case VC1_MVMODE_1MV: return VAMvMode1Mv; case VC1_MVMODE_HPEL_1MV: return VAMvMode1MvHalfPel; case VC1_MVMODE_MIXED_MV: return VAMvModeMixedMv; case VC1_MVMODE_INTENSCOMP: return VAMvModeIntensityCompensation; } return 0; } void VC1PackerLVA::VC1PackPicParams (VC1Context* pContext, VAPictureParameterBufferVC1* ptr, VideoAccelerator* va) { memset(ptr, 0, sizeof(VAPictureParameterBufferVC1)); ptr->forward_reference_picture = VA_INVALID_ID; ptr->backward_reference_picture = VA_INVALID_ID; ptr->inloop_decoded_picture = VA_INVALID_ID; if (pContext->m_seqLayerHeader.RANGE_MAPY_FLAG || pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG || pContext->m_seqLayerHeader.RANGERED) { va->BeginFrame(pContext->m_frmBuff.m_iRangeMapIndex); ptr->inloop_decoded_picture = va->GetSurfaceID(pContext->m_frmBuff.m_iCurrIndex); } else va->BeginFrame(pContext->m_frmBuff.m_iCurrIndex); ptr->sequence_fields.bits.pulldown = pContext->m_seqLayerHeader.PULLDOWN; ptr->sequence_fields.bits.interlace = pContext->m_seqLayerHeader.INTERLACE; ptr->sequence_fields.bits.tfcntrflag = pContext->m_seqLayerHeader.TFCNTRFLAG; ptr->sequence_fields.bits.finterpflag = pContext->m_seqLayerHeader.FINTERPFLAG; ptr->sequence_fields.bits.psf = 0; ptr->sequence_fields.bits.multires = pContext->m_seqLayerHeader.MULTIRES; ptr->sequence_fields.bits.overlap = pContext->m_seqLayerHeader.OVERLAP; ptr->sequence_fields.bits.syncmarker = pContext->m_seqLayerHeader.SYNCMARKER; ptr->sequence_fields.bits.rangered = pContext->m_seqLayerHeader.RANGERED; ptr->sequence_fields.bits.max_b_frames = pContext->m_seqLayerHeader.MAXBFRAMES; ptr->sequence_fields.bits.profile = pContext->m_seqLayerHeader.PROFILE; ptr->coded_width = 2 * (pContext->m_seqLayerHeader.CODED_WIDTH +1); ptr->coded_height = 2 * (pContext->m_seqLayerHeader.CODED_HEIGHT + 1); ptr->entrypoint_fields.bits.broken_link = pContext->m_seqLayerHeader.BROKEN_LINK; ptr->entrypoint_fields.bits.closed_entry = pContext->m_seqLayerHeader.CLOSED_ENTRY; ptr->entrypoint_fields.bits.panscan_flag = pContext->m_seqLayerHeader.PANSCAN_FLAG; ptr->entrypoint_fields.bits.loopfilter = pContext->m_seqLayerHeader.LOOPFILTER; switch(pContext->m_picLayerHeader->CONDOVER) { case 0: ptr->conditional_overlap_flag = 0; break; case 2: ptr->conditional_overlap_flag = 1; break; default: ptr->conditional_overlap_flag = 2; break; } ptr->fast_uvmc_flag = pContext->m_seqLayerHeader.FASTUVMC; ptr->range_mapping_fields.bits.luma_flag = pContext->m_seqLayerHeader.RANGE_MAPY_FLAG; ptr->range_mapping_fields.bits.luma = pContext->m_seqLayerHeader.RANGE_MAPY_FLAG ? pContext->m_seqLayerHeader.RANGE_MAPY : 0; ptr->range_mapping_fields.bits.chroma_flag = pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG; ptr->range_mapping_fields.bits.chroma = pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG ? pContext->m_seqLayerHeader.RANGE_MAPUV : 0; ptr->b_picture_fraction = pContext->m_picLayerHeader->BFRACTION_index; ptr->cbp_table = pContext->m_picLayerHeader->CBPTAB; ptr->mb_mode_table = pContext->m_picLayerHeader->MBMODETAB; ptr->range_reduction_frame = pContext->m_picLayerHeader->RANGEREDFRM; ptr->rounding_control = pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED ? pContext->m_picLayerHeader->RNDCTRL : pContext->m_seqLayerHeader.RNDCTRL; ptr->post_processing = pContext->m_picLayerHeader->POSTPROC; ptr->picture_resolution_index = 0; if (pContext->m_bIntensityCompensation) { if (VC1_FieldInterlace != pContext->m_picLayerHeader->FCM) { ptr->luma_scale = pContext->m_picLayerHeader->LUMSCALE; ptr->luma_shift = pContext->m_picLayerHeader->LUMSHIFT; } else { if (VC1_INTCOMP_BOTH_FIELD == pContext->m_picLayerHeader->INTCOMFIELD) { // top field ptr->luma_scale = pContext->m_picLayerHeader->LUMSCALE; ptr->luma_shift = pContext->m_picLayerHeader->LUMSHIFT; //bottom field ptr->luma_scale2 = pContext->m_picLayerHeader->LUMSCALE1; ptr->luma_shift2 = pContext->m_picLayerHeader->LUMSHIFT1; } else if (VC1_INTCOMP_BOTTOM_FIELD == pContext->m_picLayerHeader->INTCOMFIELD) { // bottom field ptr->luma_scale2 = pContext->m_picLayerHeader->LUMSCALE1; ptr->luma_shift2 = pContext->m_picLayerHeader->LUMSHIFT1; // top field not compensated ptr->luma_scale = 32; } else if (VC1_INTCOMP_TOP_FIELD == pContext->m_picLayerHeader->INTCOMFIELD) { // top field ptr->luma_scale = pContext->m_picLayerHeader->LUMSCALE; ptr->luma_shift = pContext->m_picLayerHeader->LUMSHIFT; // bottom field not compensated ptr->luma_scale2 = 32; } } } else { ptr->luma_scale = 32; ptr->luma_scale2 = 32; } /*picture_fields.bits.picture_type*/ if(pContext->m_picLayerHeader->FCM == VC1_Progressive || pContext->m_picLayerHeader->FCM == VC1_FrameInterlace) ptr->picture_fields.bits.picture_type = pContext->m_picLayerHeader->PTYPE; else { //field picture switch(pContext->m_picLayerHeader->PTypeField1) { case VC1_I_FRAME: if(pContext->m_picLayerHeader->PTypeField2 == VC1_I_FRAME) ptr->picture_fields.bits.picture_type = VC1_I_I_FRAME; else if(pContext->m_picLayerHeader->PTypeField2 == VC1_P_FRAME) ptr->picture_fields.bits.picture_type = VC1_I_P_FRAME; else assert(0); break; case VC1_P_FRAME: if(pContext->m_picLayerHeader->PTypeField2 == VC1_P_FRAME) ptr->picture_fields.bits.picture_type = VC1_P_P_FRAME; else if(pContext->m_picLayerHeader->PTypeField2 == VC1_I_FRAME) ptr->picture_fields.bits.picture_type = VC1_P_I_FRAME; else assert(0); break; case VC1_B_FRAME: if(pContext->m_picLayerHeader->PTypeField2 == VC1_B_FRAME) ptr->picture_fields.bits.picture_type = VC1_B_B_FRAME; else if(pContext->m_picLayerHeader->PTypeField2 == VC1_BI_FRAME) ptr->picture_fields.bits.picture_type = VC1_B_BI_FRAME; else assert(0); break; case VC1_BI_FRAME: if(pContext->m_picLayerHeader->PTypeField2 == VC1_B_FRAME) ptr->picture_fields.bits.picture_type = VC1_BI_B_FRAME; else if(pContext->m_picLayerHeader->PTypeField2 == VC1_BI_FRAME) ptr->picture_fields.bits.picture_type = VC1_BI_BI_FRAME; else assert(0); break; default: assert(0); break; } } ptr->picture_fields.bits.frame_coding_mode = pContext->m_picLayerHeader->FCM; ptr->picture_fields.bits.top_field_first = pContext->m_picLayerHeader->TFF; ptr->picture_fields.bits.is_first_field = ! pContext->m_picLayerHeader->CurrField; ptr->picture_fields.bits.intensity_compensation = pContext->m_bIntensityCompensation; ptr->bitplane_present.value = 0; VC1Bitplane* check_bitplane = 0; VC1Bitplane* lut_bitplane[3]; switch (pContext->m_picLayerHeader->PTYPE) { case VC1_I_FRAME: case VC1_BI_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->FIELDTX; lut_bitplane[1] = &pContext->m_picLayerHeader->ACPRED; lut_bitplane[2] = &pContext->m_picLayerHeader->OVERFLAGS; break; case VC1_P_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->m_DirectMB; lut_bitplane[1] = &pContext->m_picLayerHeader->SKIPMB; lut_bitplane[2] = &pContext->m_picLayerHeader->MVTYPEMB; break; case VC1_B_FRAME: lut_bitplane[0] = &pContext->m_picLayerHeader->m_DirectMB; lut_bitplane[1] = &pContext->m_picLayerHeader->SKIPMB; lut_bitplane[2] = &pContext->m_picLayerHeader->FORWARDMB; break; default: return; } for (uint32_t i = 0; i < 3; i++) { if ((!VC1_IS_BITPLANE_RAW_MODE(lut_bitplane[i])) && lut_bitplane[i]->m_databits) check_bitplane = lut_bitplane[i]; } if (check_bitplane) { ptr->raw_coding.flags.mv_type_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->MVTYPEMB) && pContext->m_picLayerHeader->MVTYPEMB.m_databits ? 1 : 0; ptr->raw_coding.flags.direct_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->m_DirectMB) && pContext->m_picLayerHeader->m_DirectMB.m_databits ? 1 : 0; ptr->raw_coding.flags.skip_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->SKIPMB) && pContext->m_picLayerHeader->SKIPMB.m_databits ? 1 : 0; ptr->raw_coding.flags.field_tx = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->FIELDTX) && pContext->m_picLayerHeader->FIELDTX.m_databits ? 1 : 0; ptr->raw_coding.flags.forward_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->FORWARDMB) && pContext->m_picLayerHeader->FORWARDMB.m_databits ? 1 : 0; ptr->raw_coding.flags.ac_pred = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->ACPRED) && pContext->m_picLayerHeader->ACPRED.m_databits ? 1 : 0; ptr->raw_coding.flags.overflags = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->OVERFLAGS) && pContext->m_picLayerHeader->OVERFLAGS.m_databits ? 1 : 0; ptr->bitplane_present.value = 1; ptr->bitplane_present.flags.bp_mv_type_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->MVTYPEMB) ? 0 : 1; ptr->bitplane_present.flags.bp_direct_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->m_DirectMB) ? 0 : 1; ptr->bitplane_present.flags.bp_skip_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->SKIPMB) ? 0 : 1; ptr->bitplane_present.flags.bp_field_tx = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->FIELDTX) ? 0 : 1; ptr->bitplane_present.flags.bp_forward_mb = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->FORWARDMB) ? 0 : 1; ptr->bitplane_present.flags.bp_ac_pred = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->ACPRED) ? 0 : 1; ptr->bitplane_present.flags.bp_overflags = VC1_IS_BITPLANE_RAW_MODE(&pContext->m_picLayerHeader->OVERFLAGS) ? 0 : 1; } ptr->reference_fields.bits.reference_distance_flag = pContext->m_seqLayerHeader.REFDIST_FLAG; ptr->reference_fields.bits.reference_distance = pContext->m_picLayerHeader->REFDIST; ptr->reference_fields.bits.num_reference_pictures = pContext->m_picLayerHeader->NUMREF; ptr->reference_fields.bits.reference_field_pic_indicator = pContext->m_picLayerHeader->REFFIELD; ptr->mv_fields.bits.mv_mode = (VAMvModeVC1)ConvertMvModeVC1Mfx2VA(pContext->m_picLayerHeader->MVMODE); ptr->mv_fields.bits.mv_mode2 = (VAMvModeVC1)ConvertMvModeVC1Mfx2VA(pContext->m_picLayerHeader->MVMODE2); ptr->mv_fields.bits.mv_table = pContext->m_picLayerHeader->MVTAB; ptr->mv_fields.bits.two_mv_block_pattern_table = pContext->m_picLayerHeader->MV2BPTAB; ptr->mv_fields.bits.four_mv_switch = pContext->m_picLayerHeader->MV4SWITCH; ptr->mv_fields.bits.four_mv_block_pattern_table = pContext->m_picLayerHeader->MV4BPTAB; ptr->mv_fields.bits.extended_mv_flag = pContext->m_seqLayerHeader.EXTENDED_MV; ptr->mv_fields.bits.extended_mv_range = pContext->m_picLayerHeader->MVRANGE; ptr->mv_fields.bits.extended_dmv_flag = pContext->m_seqLayerHeader.EXTENDED_DMV; ptr->mv_fields.bits.extended_dmv_range = pContext->m_picLayerHeader->DMVRANGE; ptr->pic_quantizer_fields.bits.dquant = pContext->m_seqLayerHeader.DQUANT; ptr->pic_quantizer_fields.bits.quantizer = pContext->m_seqLayerHeader.QUANTIZER; ptr->pic_quantizer_fields.bits.half_qp = pContext->m_picLayerHeader->HALFQP; ptr->pic_quantizer_fields.bits.pic_quantizer_scale = pContext->m_picLayerHeader->PQUANT; ptr->pic_quantizer_fields.bits.pic_quantizer_type = !pContext->m_picLayerHeader->QuantizationType; ptr->pic_quantizer_fields.bits.dq_frame = pContext->m_picLayerHeader->m_DQuantFRM; ptr->pic_quantizer_fields.bits.dq_profile = pContext->m_picLayerHeader->m_DQProfile; ptr->pic_quantizer_fields.bits.dq_sb_edge = pContext->m_picLayerHeader->m_DQProfile == VC1_DQPROFILE_SNGLEDGES ? pContext->m_picLayerHeader->DQSBEdge : 0; ptr->pic_quantizer_fields.bits.dq_db_edge = pContext->m_picLayerHeader->m_DQProfile == VC1_DQPROFILE_DBLEDGES ? pContext->m_picLayerHeader->DQSBEdge : 0; ptr->pic_quantizer_fields.bits.dq_binary_level = pContext->m_picLayerHeader->m_DQBILevel; ptr->pic_quantizer_fields.bits.alt_pic_quantizer = pContext->m_picLayerHeader->m_AltPQuant; ptr->transform_fields.bits.variable_sized_transform_flag = pContext->m_seqLayerHeader.VSTRANSFORM; ptr->transform_fields.bits.mb_level_transform_type_flag = pContext->m_picLayerHeader->TTMBF; ptr->transform_fields.bits.frame_level_transform_type = pContext->m_picLayerHeader->TTFRM_ORIG; ptr->transform_fields.bits.transform_ac_codingset_idx1 = pContext->m_picLayerHeader->TRANSACFRM; ptr->transform_fields.bits.transform_ac_codingset_idx2 = pContext->m_picLayerHeader->TRANSACFRM2; ptr->transform_fields.bits.intra_transform_dc_table = pContext->m_picLayerHeader->TRANSDCTAB; if (pContext->m_picLayerHeader->PTYPE == VC1_B_FRAME) { ptr->backward_reference_picture = va->GetSurfaceID(pContext->m_frmBuff.m_iNextIndex); ptr->forward_reference_picture = va->GetSurfaceID(pContext->m_frmBuff.m_iPrevIndex); } else if (pContext->m_picLayerHeader->PTYPE == VC1_P_FRAME) { ptr->forward_reference_picture = va->GetSurfaceID(pContext->m_frmBuff.m_iPrevIndex); } } void VC1PackerLVA::VC1PackOneSlice (VC1Context* pContext, SliceParams* slparams, uint32_t SliceBufIndex, uint32_t MBOffset, uint32_t SliceDataSize, uint32_t StartCodeOffset, uint32_t ChoppingType) //compatibility with Windows code { (void)pContext; (void)ChoppingType; if (SliceBufIndex) ++m_pSliceInfo; m_pSliceInfo->macroblock_offset = ((31-slparams->m_bitOffset) + MBOffset*8); m_pSliceInfo->slice_data_offset = StartCodeOffset; // offset in bytes m_pSliceInfo->slice_vertical_position = slparams->MBStartRow; m_pSliceInfo->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; m_pSliceInfo->slice_data_size = SliceDataSize; } void VC1PackerLVA::VC1PackWholeSliceSM (VC1Context* pContext, uint32_t MBOffset, uint32_t SliceDataSize) { m_pSliceInfo->slice_vertical_position = 0; m_pSliceInfo->slice_data_size = SliceDataSize; m_pSliceInfo->macroblock_offset = ((31-pContext->m_bitstream.bitOffset) + MBOffset*8); m_pSliceInfo->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; m_pSliceInfo->slice_data_offset = 0; } void VC1PackerLVA::VC1PackBitStreamForOneSlice (VC1Context* pContext, uint32_t Size) { UMCVACompBuffer* CompBuf; uint8_t* pSliceData = (uint8_t*)m_va->GetCompBuffer(VASliceDataBufferType,&CompBuf); MFX_INTERNAL_CPY(pSliceData, (uint8_t*)(pContext->m_bitstream.pBitstream - 1), Size+4); CompBuf->SetDataSize(Size+4); SwapData((uint8_t*)pSliceData, Size + 4); } } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_ipic.cpp000066400000000000000000000157031443134507600320250ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include #include "umc_vc1_dec_seq.h" //Simplw/Main profiles I picture VC1Status DecodePictureLayer_ProgressiveIpicture(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; uint32_t tempValue; (void) tempValue; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; seqLayerHeader->RNDCTRL = 1; //4.1.1.1 The BF field is currently undefined //3.2.1.6 BF is a 7-bit field that is only present in I-picture //headers. VC1_GET_BITS(7, tempValue); //BF //PQINDEX is a 5-bit field that signals the quantizer scale index //for the entire frame. It is present in all picture types. If the //implicit quantizer is used (signaled by sequence field //QUANTIZER = 00, see section 3.1.19) then PQINDEX specifies both //the picture quantizer scale (PQUANT) and the quantizer //(3QP or 5QP deadzone) used for the frame. Table 5 shows how //PQINDEX is translated to PQUANT and the quantizer for implicit mode. //If the quantizer is signaled explicitly at the sequence or frame //level (signaled by sequence field QUANTIZER = 01, 10 or 11 see //section 3.1.19) then PQINDEX is translated to the picture quantizer //stepsize PQUANT as indicated by Table 6. VC1_GET_BITS(5, picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX <= 8) { //3.2.1.8 //HALFQP is a 1bit field present in all frame types if QPINDEX //is less than or equal to 8. The HALFQP field allows the picture //quantizer to be expressed in half step increments over the low //PQUANT range. If HALFQP = 1 then the picture quantizer stepsize //is PQUANT + ?. If HALFQP = 0 then the picture quantizer //stepize is PQUANT. Therefore, if the 3QP deadzone quantizer //is used then half stepsizes are possible up to PQUANT = 9 //(i.e., PQUANT = 1, 1.5, 2, 2.5 ... 8.5, 9) and then only integer //stepsizes are allowable above PQUANT = 9. For the 5QP deadzone //quantizer, half stepsizes are possible up to PQUANT = 7 (i.e., //1, 1.5, 2, 2.5 ... 6.5, 7). VC1_GET_BITS(1, picLayerHeader->HALFQP); } if(seqLayerHeader->QUANTIZER == 1) // 01 binary { //3.2.1.9 //PQUANTIZER is a 1 bit field present in all frame types if the //sequence level field QUANTIZER = 01 (see section 3.1.19). //In this case, the quantizer used for the frame is specified by //PQUANTIZER. If PQUANTIZER = 0 then the 5QP deadzone quantizer //is used for the frame. If PQUANTIZER = 1 then the 3QP deadzone //quantizer is used. VC1_GET_BITS(1, picLayerHeader->PQUANTIZER); //PQUANTIZER picLayerHeader->QuantizationType = 1 - picLayerHeader->PQUANTIZER; } CalculatePQuant(pContext); MVRangeDecode(pContext); if(seqLayerHeader->MULTIRES == 1 && picLayerHeader->PTYPE != VC1_BI_FRAME) { //see 4.1.1.5 subclause for pseudo-code how the new frame dimensions //are calculated if a downsampled resolution is indicated //The RESPIC field in I pictures specifies the scaling factor of //the decoded I picture relative to a full resolution frame. //The decoded picture may be full resolution or half the original //resolution in either the horizontal or vertical dimensions or half //resolution in both dimensions. Table 8 shows how the scaling factor //is encoded in the RESPIC field. //The resolution encoded in the I picture RESPIC field also applies //to all subsequent P pictures until the next I picture. //In other words, all P pictures are encoded at the same resolution as //the first I picture. Although the RESPIC field is also present in P //picture headers, it is not used. //3.2.1.11 //The RESPIC field is always present in progressive I and P pictures //if MULTIRES =1 in the sequence layer. This field specifies the scaling //factor of the current frame relative to the full resolution frame. //Table 8 shows the possible values of the RESPIC field. Refer to //section 4.1.1.5 for a description of variable resolution coding. //NOTE: Although the RESPIC field is present in P picture headers, //it is not used. See section 4.1.1.5 for a description. //Table 8: Progressive picture resolution code-table //RESPIC FLC Horizontal Scale Vertical Scale // 00 Full Full // 01 Half Full // 10 Full Half // 11 Half Half VC1_GET_BITS(2, tempValue); //RESPIC } //4.1.1.3 subclause //Table 19 is used to decode the DCTACFRM and DCTACFRM2 fields //Refer to section 4.1.3.4 for a description of AC coefficient decoding. // VLC Coding set index // 0 0 // 10 1 // 11 2 VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); if(picLayerHeader->TRANSACFRM) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM += 1; } VC1_GET_BITS(1, picLayerHeader->TRANSACFRM2); if(picLayerHeader->TRANSACFRM2) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); picLayerHeader->TRANSACFRM2 += 1; } //TRANSDCTAB is a one-bit field that signals which of two Huffman tables //is used to decode the Transform DC coefficients in intra-coded blocks. //If TRANSDCTAB = 0 then the low motion huffman table is used. //If TRANSDCTAB = 1 then the high motion huffman table is used. VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_ipic_adv.cpp000066400000000000000000000212551443134507600326560ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" VC1Status DecodePictHeaderParams_ProgressiveIpicture_Adv(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1, VC1_BFRAMES,VM_STRING("I frame type \n")); #endif //AC Prediction DecodeBitplane(pContext, &picLayerHeader->ACPRED, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); if( (seqLayerHeader->OVERLAP==1) && (picLayerHeader->PQUANT<=8) ) { //conditional overlap flag VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(picLayerHeader->CONDOVER) { VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(!picLayerHeader->CONDOVER) { //10 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_ALL; } else { //11 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_SOME; DecodeBitplane(pContext, &picLayerHeader->OVERFLAGS, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); } } else { //0 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_NONE; } } //frame-level transform AC coding set index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); if(picLayerHeader->TRANSACFRM) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } //frame-level transform AC table-2 index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); if(picLayerHeader->TRANSACFRM2) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); picLayerHeader->TRANSACFRM2++; } //intra transform DC table VC1_GET_BITS(1,picLayerHeader->TRANSDCTAB); //TRANSDCTAB //macroblock quantization vc1Res = VOPDQuant(pContext); return vc1Res; } VC1Status DecodePictHeaderParams_InterlaceIpicture_Adv(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("I frame type \n")); #endif //field transform flag DecodeBitplane(pContext, &picLayerHeader->FIELDTX, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //AC Prediction DecodeBitplane(pContext, &picLayerHeader->ACPRED, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); if( (seqLayerHeader->OVERLAP==1) && (picLayerHeader->PQUANT<=8) ) { //conditional overlap flag VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(picLayerHeader->CONDOVER) { VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(!picLayerHeader->CONDOVER) { //10 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_ALL; } else { //11 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_SOME; //conditional overlap macroblock pattern flags DecodeBitplane(pContext, &picLayerHeader->OVERFLAGS, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); } } else { //0 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_NONE; } } //frame-level transform AC coding set index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); if(picLayerHeader->TRANSACFRM) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } //frame-level transform AC table-2 index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); if(picLayerHeader->TRANSACFRM2) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); picLayerHeader->TRANSACFRM2++; } //intra transform DC table VC1_GET_BITS(1,picLayerHeader->TRANSDCTAB); //TRANSDCTAB //macroblock quantization vc1Res = VOPDQuant(pContext); return vc1Res; } VC1Status DecodeFieldHeaderParams_InterlaceFieldIpicture_Adv(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; (void) tempValue; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("I frame type \n")); #endif VC1_GET_BITS(5,picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX<=8) { VC1_GET_BITS(1,picLayerHeader->HALFQP); } else picLayerHeader->HALFQP = 0; if(seqLayerHeader->QUANTIZER == 1) { VC1_GET_BITS(1,picLayerHeader->PQUANTIZER); //PQUANTIZER } CalculatePQuant(pContext); if(seqLayerHeader->POSTPROCFLAG) { //post processing VC1_GET_BITS(2,tempValue); //POSTPROC } //AC Prediction if (picLayerHeader->CurrField == 0) DecodeBitplane(pContext, &picLayerHeader->ACPRED, seqLayerHeader->widthMB, (seqLayerHeader->heightMB + 1)/2,0); else DecodeBitplane(pContext, &picLayerHeader->ACPRED, seqLayerHeader->widthMB, (seqLayerHeader->heightMB+1)/2, seqLayerHeader->MaxWidthMB * ((seqLayerHeader->heightMB+1)/2)); if( (seqLayerHeader->OVERLAP==1) && (picLayerHeader->PQUANT<=8) ) { //conditional overlap flag VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(picLayerHeader->CONDOVER) { VC1_GET_BITS(1,picLayerHeader->CONDOVER); if(!picLayerHeader->CONDOVER) { //10 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_ALL; } else { //11 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_SOME; //conditional overlap macroblock pattern flags if (picLayerHeader->CurrField == 0) DecodeBitplane(pContext, &picLayerHeader->OVERFLAGS, seqLayerHeader->widthMB, (seqLayerHeader->heightMB + 1)/2,0); else DecodeBitplane(pContext, &picLayerHeader->OVERFLAGS, seqLayerHeader->widthMB, (seqLayerHeader->heightMB + 1)/2, seqLayerHeader->MaxWidthMB*((seqLayerHeader->heightMB + 1)/2)); } } else { //0 picLayerHeader->CONDOVER = VC1_COND_OVER_FLAG_NONE; } } //frame-level transform AC coding set index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); if(picLayerHeader->TRANSACFRM) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } //frame-level transform AC table-2 index VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); if(picLayerHeader->TRANSACFRM2) { VC1_GET_BITS(1,picLayerHeader->TRANSACFRM2); picLayerHeader->TRANSACFRM2++; } //intra transform DC table VC1_GET_BITS(1,picLayerHeader->TRANSDCTAB); //TRANSDCTAB //macroblock quantization vc1Res = VOPDQuant(pContext); return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_pic_com.cpp000066400000000000000000000113731443134507600325110ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include #include "umc_vc1_dec_seq.h" #include "umc_vc1_huffman.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_common_tables.h" VC1Status DecodePictureHeader (VC1Context* pContext, bool isExtHeader) { VC1Status vc1Sts = VC1_OK; uint32_t tempValue; (void) tempValue; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t SkFrameSize = 10; if (isExtHeader) SkFrameSize -= 8; if(seqLayerHeader->FINTERPFLAG == 1) VC1_GET_BITS(1, tempValue); //INTERPFRM VC1_GET_BITS(2, tempValue); //FRMCNT if(seqLayerHeader->RANGERED == 1) { VC1_GET_BITS(1,picLayerHeader->RANGEREDFRM); picLayerHeader->RANGEREDFRM <<= 3; } else picLayerHeader->RANGEREDFRM = 0; if(seqLayerHeader->MAXBFRAMES == 0) { VC1_GET_BITS(1, picLayerHeader->PTYPE);//0 = I, 1 = P } else { VC1_GET_BITS(1, picLayerHeader->PTYPE); //1 = P if(picLayerHeader->PTYPE == 0) { VC1_GET_BITS(1, picLayerHeader->PTYPE); if(picLayerHeader->PTYPE == 0) { picLayerHeader->PTYPE = VC1_B_FRAME; //it can be BI, will be detected in BFRACTION } else { picLayerHeader->PTYPE = VC1_I_FRAME; } } else { picLayerHeader->PTYPE = VC1_P_FRAME; } } if (pContext->m_FrameSize < SkFrameSize) //changed from 2 { picLayerHeader->PTYPE |= VC1_SKIPPED_FRAME; } if(picLayerHeader->PTYPE == VC1_B_FRAME) { int8_t z1; int16_t z2; DecodeHuffmanPair(&pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, pContext->m_vlcTbl->BFRACTION, &z1, &z2); assert (z2 != VC1_BRACTION_INVALID); assert (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED)); if(0 == z2) return VC1_ERR_INVALID_STREAM; if (z2 == VC1_BRACTION_BI) { picLayerHeader->PTYPE = VC1_BI_FRAME; } picLayerHeader->BFRACTION = (z1*2>=z2)?1:0; picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1; if (z1 < 8 && z2 < 9) picLayerHeader->BFRACTION_index = VC1_BFraction_indexes[z1][z2]; } return vc1Sts; } VC1Status Decode_PictureLayer(VC1Context* pContext) { VC1Status vc1Sts = VC1_OK; switch(pContext->m_picLayerHeader->PTYPE) { case VC1_I_FRAME: case VC1_BI_FRAME: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("I frame type \n")); #endif vc1Sts = DecodePictureLayer_ProgressiveIpicture(pContext); break; case VC1_P_FRAME: //only for simple and main profile vc1Sts = DecodePictureLayer_ProgressivePpicture(pContext); break; case VC1_B_FRAME: #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("B frame type \n")); #endif vc1Sts = DecodePictureLayer_ProgressiveBpicture(pContext); break; } if (VC1_IS_SKIPPED(pContext->m_picLayerHeader->PTYPE)) pContext->m_frmBuff.m_iDisplayIndex = pContext->m_frmBuff.m_iCurrIndex; return vc1Sts; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_dec_pic_com_adv.cpp000066400000000000000000000356451443134507600332740ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_huffman.h" #include "umc_vc1_common_tables.h" VC1Status DecodePictureHeader_Adv(VC1Context* pContext) { VC1Status vc1Sts = VC1_OK; uint32_t i = 0; uint32_t tempValue; uint32_t RFF = 0; uint32_t number_of_pan_scan_window; uint32_t RPTFRM = 0; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; picLayerHeader->RFF = 0; if(seqLayerHeader->INTERLACE) { //Frame Coding mode //0 - progressive; 10 - Frame-interlace; 11 - Field-interlace VC1_GET_BITS(1, picLayerHeader->FCM); if(picLayerHeader->FCM) { VC1_GET_BITS(1, picLayerHeader->FCM); if(picLayerHeader->FCM) picLayerHeader->FCM = VC1_FieldInterlace; else picLayerHeader->FCM = VC1_FrameInterlace; } else picLayerHeader->FCM = VC1_Progressive; } if(picLayerHeader->FCM != VC1_FieldInterlace) { //picture type //110 - I picture; 0 - P picture; 10 - B picture; 1110 - BI picture; 1111 - skipped VC1_GET_BITS(1, picLayerHeader->PTYPE); if(picLayerHeader->PTYPE) { VC1_GET_BITS(1, picLayerHeader->PTYPE); if(picLayerHeader->PTYPE) { VC1_GET_BITS(1, picLayerHeader->PTYPE); if(picLayerHeader->PTYPE) { VC1_GET_BITS(1, picLayerHeader->PTYPE); if(picLayerHeader->PTYPE) { //1111 picLayerHeader->PTYPE = VC1_P_FRAME | VC1_SKIPPED_FRAME; } else { //1110 picLayerHeader->PTYPE = VC1_BI_FRAME; } } else { //110 picLayerHeader->PTYPE = VC1_I_FRAME; } } else { //10 picLayerHeader->PTYPE = VC1_B_FRAME; } } else { //0 picLayerHeader->PTYPE = VC1_P_FRAME; } if(!VC1_IS_SKIPPED(picLayerHeader->PTYPE)) { if(seqLayerHeader->TFCNTRFLAG) { //temporal reference frame counter VC1_GET_BITS(8, tempValue); //TFCNTR } } if(seqLayerHeader->PULLDOWN) { if(!(seqLayerHeader->INTERLACE)) { //repeat frame count VC1_GET_BITS(2, RPTFRM); } else { uint32_t tff; //top field first VC1_GET_BITS(1, tff); picLayerHeader->TFF = (uint8_t)tff; //repeat first field VC1_GET_BITS(1, RFF); picLayerHeader->RFF = (uint8_t)RFF; } } if(seqLayerHeader->PANSCAN_FLAG) { //pan scan present flag VC1_GET_BITS(1,tempValue); //PS_PRESENT if(tempValue) //PS_PRESENT { //calculate number ofpan scan window, see standard, p177 if(seqLayerHeader->INTERLACE) { if(seqLayerHeader->PULLDOWN) { number_of_pan_scan_window = 2 + RFF; } else { number_of_pan_scan_window = 2; } } else { if(seqLayerHeader->PULLDOWN) { number_of_pan_scan_window = 1 + RPTFRM; } else { number_of_pan_scan_window = 1; } } //fill in pan scan window struture for (i = 0; i< number_of_pan_scan_window; i++) { //PS_HOFFSET VC1_GET_BITS(18,tempValue); //PS_VOFFSET VC1_GET_BITS(18,tempValue); //PS_WIDTH VC1_GET_BITS(14,tempValue); //PS_HEIGHT VC1_GET_BITS(14,tempValue); } } } if(!VC1_IS_SKIPPED(picLayerHeader->PTYPE)) { //rounding control VC1_GET_BITS(1,picLayerHeader->RNDCTRL); if((seqLayerHeader->INTERLACE) || (picLayerHeader->FCM != VC1_Progressive)) { //UV sampling format VC1_GET_BITS(1,tempValue);//UVSAMP } if(seqLayerHeader->FINTERPFLAG && (picLayerHeader->FCM == VC1_Progressive) ) { //frame interpolation hint VC1_GET_BITS(1,tempValue); } if(picLayerHeader->PTYPE == VC1_B_FRAME && (picLayerHeader->FCM == VC1_Progressive) ) { //B picture fraction int8_t z1; int16_t z2; DecodeHuffmanPair(&pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, pContext->m_vlcTbl->BFRACTION, &z1, &z2); assert (z2 != VC1_BRACTION_INVALID); assert (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED)); if(0 == z2) { return VC1_ERR_INVALID_STREAM; } if (z2 == VC1_BRACTION_BI) { picLayerHeader->PTYPE = VC1_BI_FRAME; } picLayerHeader->BFRACTION = (z1*2>=z2)?1:0; picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1; if (z1 < 8 && z2 < 9) picLayerHeader->BFRACTION_index = VC1_BFraction_indexes[z1][z2]; } //picture quantizer index VC1_GET_BITS(5,picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX<=8) { //half QP step VC1_GET_BITS(1,picLayerHeader->HALFQP); } else picLayerHeader->HALFQP = 0; if(seqLayerHeader->QUANTIZER == 1) { //picture quantizer type VC1_GET_BITS(1,pContext->m_picLayerHeader->PQUANTIZER); //PQUANTIZER } CalculatePQuant(pContext); if(seqLayerHeader->POSTPROCFLAG) { //post processing VC1_GET_BITS(2,tempValue); //POSTPROC } } } else { //FIELD INTERLACE FRAME DecodePictHeaderParams_InterlaceFieldPicture_Adv(pContext); } return vc1Sts; } typedef VC1Status (*DecoderPicHeader)(VC1Context* pContext); static const DecoderPicHeader DecoderPicHeader_table[3][4] = { { (DecoderPicHeader)(DecodePictHeaderParams_ProgressiveIpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_ProgressivePpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_ProgressiveBpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_ProgressiveIpicture_Adv) }, { (DecoderPicHeader)(DecodePictHeaderParams_InterlaceIpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_InterlacePpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_InterlaceBpicture_Adv), (DecoderPicHeader)(DecodePictHeaderParams_InterlaceIpicture_Adv) }, { (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldIpicture_Adv), (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldPpicture_Adv), (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldBpicture_Adv), (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldIpicture_Adv) } }; VC1Status DecodePicHeader(VC1Context* pContext) { VC1Status vc1Sts = VC1_OK; vc1Sts = DecoderPicHeader_table[pContext->m_picLayerHeader->FCM][pContext->m_picLayerHeader->PTYPE](pContext); return vc1Sts; } VC1Status DecodePictHeaderParams_InterlaceFieldPicture_Adv (VC1Context* pContext) { VC1Status vc1Sts = VC1_OK; uint32_t i = 0; uint32_t tempValue; uint32_t RFF = 0; uint32_t number_of_pan_scan_window; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; picLayerHeader->RFF = 0; VC1_GET_BITS(3, tempValue); switch(tempValue) { case 0: //000 - I,I picLayerHeader->PTypeField1 = VC1_I_FRAME; picLayerHeader->PTypeField2 = VC1_I_FRAME; break; case 1: //001 - I,P picLayerHeader->PTypeField1 = VC1_I_FRAME; picLayerHeader->PTypeField2 = VC1_P_FRAME; break; case 2: //010 - P,I picLayerHeader->PTypeField1 = VC1_P_FRAME; picLayerHeader->PTypeField2 = VC1_I_FRAME; break; case 3: //011 - P,P picLayerHeader->PTypeField1 = VC1_P_FRAME; picLayerHeader->PTypeField2 = VC1_P_FRAME; break; case 4: //100 - B,B picLayerHeader->PTypeField1 = VC1_B_FRAME; picLayerHeader->PTypeField2 = VC1_B_FRAME; break; case 5: //101 - B,BI picLayerHeader->PTypeField1 = VC1_B_FRAME; picLayerHeader->PTypeField2 = VC1_BI_FRAME; break; case 6: //110 - BI,B picLayerHeader->PTypeField1 = VC1_BI_FRAME; picLayerHeader->PTypeField2 = VC1_B_FRAME; break; case 7: //111 - BI,BI picLayerHeader->PTypeField1 = VC1_BI_FRAME; picLayerHeader->PTypeField2 = VC1_BI_FRAME; break; default: assert(0); break; } if(seqLayerHeader->TFCNTRFLAG) { //temporal reference frame counter VC1_GET_BITS(8, tempValue); //TFCNTR } if(seqLayerHeader->PULLDOWN) { if(!(seqLayerHeader->INTERLACE)) { //repeat frame count VC1_GET_BITS(2,tempValue);//RPTFRM } else { uint32_t tff; //top field first VC1_GET_BITS(1, tff); picLayerHeader->TFF = (uint8_t)tff; //repeat first field VC1_GET_BITS(1, RFF); picLayerHeader->RFF = (uint8_t)RFF; } } else picLayerHeader->TFF = 1; if(seqLayerHeader->PANSCAN_FLAG) { //pan scan present flag VC1_GET_BITS(1,tempValue); //PS_PRESENT if(tempValue) //PS_PRESENT { //calculate number ofpan scan window, see standard, p177 if(seqLayerHeader->PULLDOWN) { number_of_pan_scan_window = 2 + RFF; } else { number_of_pan_scan_window = 2; } //fill in pan scan window struture for (i = 0; iRNDCTRL); //UV sampling format VC1_GET_BITS(1,tempValue);//UVSAMP if(seqLayerHeader->REFDIST_FLAG == 1 && (picLayerHeader->PTypeField1 < VC1_B_FRAME && picLayerHeader->PTypeField2 < VC1_B_FRAME)) { int32_t ret; ret = DecodeHuffmanOne( &pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, &picLayerHeader->REFDIST, pContext->m_vlcTbl->REFDIST_TABLE); std::ignore = ret; assert(ret == 0); *pContext->pRefDist = picLayerHeader->REFDIST; } else if(seqLayerHeader->REFDIST_FLAG == 0) { *pContext->pRefDist = 0; picLayerHeader->REFDIST = 0; } else { picLayerHeader->REFDIST = 0; } if( (picLayerHeader->PTypeField1 >= VC1_B_FRAME && picLayerHeader->PTypeField2 >= VC1_B_FRAME) ) { //B picture fraction int8_t z1; int16_t z2; DecodeHuffmanPair(&pContext->m_bitstream.pBitstream, &pContext->m_bitstream.bitOffset, pContext->m_vlcTbl->BFRACTION, &z1, &z2); assert (z2 != VC1_BRACTION_INVALID); assert (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED)); if(0 == z2) return VC1_ERR_INVALID_STREAM; picLayerHeader->BFRACTION = (z1*2>=z2)?1:0; picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1; if (z1 < 8 && z2 < 9) picLayerHeader->BFRACTION_index = VC1_BFraction_indexes[z1][z2]; } if(picLayerHeader->CurrField == 0) { picLayerHeader->PTYPE = picLayerHeader->PTypeField1; picLayerHeader->BottomField = (uint8_t)(1 - picLayerHeader->TFF); } else { picLayerHeader->BottomField = (uint8_t)(picLayerHeader->TFF); picLayerHeader->PTYPE = picLayerHeader->PTypeField2; } return vc1Sts; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_ppic.cpp000066400000000000000000000406541443134507600320370ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" static const uint32_t bc_lut_1[] = {2,0,1,3}; static const uint32_t bc_lut_2[] = {0,1,2,3}; static const uint32_t bc_lut_3[] = {2,0,1,3}; static const uint32_t bc_lut_4[] = {0,1,2,3}; VC1Status DecodePictureLayer_ProgressivePpicture(VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; (void) tempValue; seqLayerHeader->RNDCTRL = 1 - seqLayerHeader->RNDCTRL; picLayerHeader->RNDCTRL = seqLayerHeader->RNDCTRL; //PQINDEX is a 5-bit field that signals the quantizer scale index //for the entire frame. It is present in all picture types. If the //implicit quantizer is used (signaled by sequence field //QUANTIZER = 00, see section 3.1.19) then PQINDEX specifies both //the picture quantizer scale (PQUANT) and the quantizer //(3QP or 5QP deadzone) used for the frame. Table 5 shows how //PQINDEX is translated to PQUANT and the quantizer for implicit mode. //If the quantizer is signaled explicitly at the sequence or frame //level (signaled by sequence field QUANTIZER = 01, 10 or 11 see //section 3.1.19) then PQINDEX is translated to the picture quantizer //stepsize PQUANT as indicated by Table 6. VC1_GET_BITS(5, picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX <= 8) { //3.2.1.8 //HALFQP is a 1bit field present in all frame types if QPINDEX //is less than or equal to 8. The HALFQP field allows the picture //quantizer to be expressed in half step increments over the low //PQUANT range. If HALFQP = 1 then the picture quantizer stepsize //is PQUANT + ?. If HALFQP = 0 then the picture quantizer //stepize is PQUANT. Therefore, if the 3QP deadzone quantizer //is used then half stepsizes are possible up to PQUANT = 9 //(i.e., PQUANT = 1, 1.5, 2, 2.5 ... 8.5, 9) and then only integer //stepsizes are allowable above PQUANT = 9. For the 5QP deadzone //quantizer, half stepsizes are possible up to PQUANT = 7 (i.e., //1, 1.5, 2, 2.5 ... 6.5, 7). VC1_GET_BITS(1, picLayerHeader->HALFQP); } if(seqLayerHeader->QUANTIZER == 1) // 01 binary { //3.2.1.9 //PQUANTIZER is a 1 bit field present in all frame types if the //sequence level field QUANTIZER = 01 (see section 3.1.19). //In this case, the quantizer used for the frame is specified by //PQUANTIZER. If PQUANTIZER = 0 then the 5QP deadzone quantizer //is used for the frame. If PQUANTIZER = 1 then the 3QP deadzone //quantizer is used. VC1_GET_BITS(1, picLayerHeader->PQUANTIZER); //PQUANTIZER picLayerHeader->QuantizationType = 1 - picLayerHeader->PQUANTIZER; } CalculatePQuant(pContext); MVRangeDecode(pContext); if(seqLayerHeader->MULTIRES == 1) { //see 4.1.1.5 subclause for pseudo-code how the new frame dimensions //are calculated if a downsampled resolution is indicated //The RESPIC field in I pictures specifies the scaling factor of //the decoded I picture relative to a full resolution frame. //The decoded picture may be full resolution or half the original //resolution in either the horizontal or vertical dimensions or half //resolution in both dimensions. Table 8 shows how the scaling factor //is encoded in the RESPIC field. //The resolution encoded in the I picture RESPIC field also applies //to all subsequent P pictures until the next I picture. //In other words, all P pictures are encoded at the same resolution as //the first I picture. Although the RESPIC field is also present in P //picture headers, it is not used. //3.2.1.11 //The RESPIC field is always present in progressive I and P pictures //if MULTIRES =1 in the sequence layer. This field specifies the scaling //factor of the current frame relative to the full resolution frame. //Table 8 shows the possible values of the RESPIC field. Refer to //section 4.1.1.5 for a description of variable resolution coding. //NOTE: Although the RESPIC field is present in P picture headers, //it is not used. See section 4.1.1.5 for a description. //Table 8: Progressive picture resolution code-table //RESPIC FLC Horizontal Scale Vertical Scale // 00 Full Full // 01 Half Full // 10 Full Half // 11 Half Half VC1_GET_BITS(2,tempValue); //RESPIC } //3.2.1.16 //The MVMODE field is present in P and B picture headers. For P //Pictures, The MVMODE field signals one of four motion vector //coding modes or one intensity compensation mode. Depending on //the value of PQUANT, either Table 10 or Table 11 is used to //decode the MVMODE field. if(picLayerHeader->PQUANT > 12) { //VC-1 Table 45: P Picture Low rate (PQUANT > 12) MVMODE codetable //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //0000 Mixed MV //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1,picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_1); else { if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else { pContext->m_bIntensityCompensation = 1; //PQUANT > 12 picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; //3.2.1.17 //The MVMODE2 field is only present in P pictures and only if the //picture header field MVMODE signals intensity compensation. //Refer to section 4.4.4.3 for a description of motion vector //mode/intensity compensation. Table 10 and Table 11 are used to //decode the MVMODE2 field. //VC-1 Table 48: P Picture Low rate (PQUANT > 12) MVMODE2 codetable //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //000 Mixed MV bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_3); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; //3.2.1.19 //The LUMSCALE field is only present in P pictures and only if //the picture header field MVMODE signals intensity compensation //or INTCOMP = 1. Refer to section 4.4.8 for a description of //intensity compensation. VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //3.2.1.20 //The LUMSHIFT field is only present in P pictures and only if //the picture header field MVMODE signals intensity compensation //or INTCOMP = 1. Refer to section 4.4.8 for a description of //intensity compensation. VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); } picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE; } } else { //VC-1 Table 46: P Picture High rate (PQUANT <= 12) MVMODE codetable //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //0000 1 MV Half-pel bilinear //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_2); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else { pContext->m_bIntensityCompensation = 1; //PQUANT <= 12 picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; //3.2.1.17 //The MVMODE2 field is only present in P pictures and only if the //picture header field MVMODE signals intensity compensation. //Refer to section 4.4.4.3 for a description of motion vector //mode/intensity compensation. Table 10 and Table 11 are used to //decode the MVMODE2 field. //VC-1 Table 49: P Picture High rate (PQUANT <= 12) MVMODE2 codetable //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //000 1 MV Half-pel bilinear bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_4); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; //3.2.1.19 //The LUMSCALE field is only present in P pictures and only if //the picture header field MVMODE signals intensity compensation //or INTCOMP = 1. Refer to section 4.4.8 for a description of //intensity compensation. VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //3.2.1.20 //The LUMSHIFT field is only present in P pictures and only if //the picture header field MVMODE signals intensity compensation //or INTCOMP = 1. Refer to section 4.4.8 for a description of //intensity compensation. VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE; } } if(picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV ) { //3.2.1.21 //The MVTYPE field is present in P pictures if MVMODE or MVMODE2 //indicates that Mixed MV motion vector mode is used. //The MVTYPEMB field uses bitplane coding to signal the motion //vector type (1 or 4 MV) for each macroblock in the frame. //Refer to section 4.10 for a description of the bitplane coding //method. Refer to section 4.4.5.2 for a description of the motion //vector decode process. DecodeBitplane(pContext, &picLayerHeader->MVTYPEMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); } //The SKIPMB field is present only present in P pictures. //The SKIPMB field encodes the skipped macroblocks in P pictures //using a bitplane coding method. Refer to section 4.10 for a //description of the bitplane coding method. DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //The MVTAB field is a 2 bit value present only in P frames. //The MVTAB field indicates which of four Huffman tables are used to //encode the motion vector data. Refer to section 4.4.5.2 for a //description of the motion vector decoding process. //Table 14: MVTAB code-table //FLC Motion Vector Huffman Table //00 Huffman Table 0 //10 Huffman Table 1 //01 Huffman Table 2 //11 Huffman Table 3 //The motion vector Huffman tables are listed in section 5.7. VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB //The CBPTAB field is a 2 bit value present only in P frames. //This field signals the Huffman table used to decode the CBPCY //field (described in section 4.4.5.2) for each coded macroblock in //P-pictures. Refer to section 4.4.4.6 for a description of how the //CBP Huffman table is used in the decoding process. //The CBPCY Huffman tables are listed in sections 5.2 and 5.3. //00 CBP Table 0 //10 CBP Table 1 //01 CBP Table 2 //11 CBP Table 3 VC1_GET_BITS(2,picLayerHeader->CBPTAB); //CBPTAB vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM == 1) { //3.2.1.28 //This field is present only in P-picture headers and only if the //sequence-level field VSTRANSFORM = 1. //If TTMBF = 1 then the TTFRM field is also present in the picture //layer. VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF == 1) { //This field is present in P-picture and B-frame headers if //VSTRANSFORM = 1 and TTMBF = 0. The TTFRM field is decoded //using Transform type select code-table //FLC Transform type //00 8x8 VC1_BLK_INTER8X8 = 0x1 //01 8x4 VC1_BLK_INTER8X4 = 0x2 //10 4x8 VC1_BLK_INTER4X8 = 0x4 //11 4x4 VC1_BLK_INTER4X4 = 0x8 VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else { picLayerHeader->TTFRM = VC1_BLK_INTER; } } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //The same index is used for Y and CbCr blocks //Transform AC coding set index code-table // VLC Coding set index // 0 0 // 10 1 // 11 2 VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); //TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } //TRANSDCTAB is a one-bit field that signals which of two Huffman tables //is used to decode the Transform DC coefficients in intra-coded blocks. //If TRANSDCTAB = 0 then the low motion huffman table is used. //If TRANSDCTAB = 1 then the high motion huffman table is used. VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_ppic_adv.cpp000066400000000000000000000537321443134507600326720ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" static const uint32_t bc_lut_1[] = {4,0,1,3}; static const uint32_t bc_lut_2[] = {0,1,2,3}; static const uint32_t bc_lut_4[] = {0,1,2}; static const uint32_t bc_lut_5[] = {0,0,1}; VC1Status DecodePictHeaderParams_ProgressivePpicture_Adv (VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("P frame type \n")); #endif //extended MV range flag MVRangeDecode(pContext); //motion vector mode if(picLayerHeader->PQUANT > 12) { //VC-1 Table 45: P Picture Low rate (PQUANT > 12) MVMODE codetable //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //0000 Mixed MV //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_1); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else { pContext->m_bIntensityCompensation = 1; picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; //VC-1 Table 48: P Picture Low rate (PQUANT > 12) MVMODE2 codetable //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //000 Mixed MV bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_5); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex].m_bIsExpanded = 0; pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].ICFieldMask = 0xC; pContext->m_picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE; } } else { //VC-1 Table 46: P Picture High rate (PQUANT <= 12) MVMODE codetable //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //0000 1 MV Half-pel bilinear //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_2); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else { pContext->m_bIntensityCompensation = 1; picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; //VC-1 Table 49: P Picture High rate (PQUANT <= 12) MVMODE2 codetable //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //000 1 MV Half-pel bilinear bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_4); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex].m_bIsExpanded = 0; pContext->m_picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE; pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].ICFieldMask = 0xC; } } //motion vector type bitplane if(picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) { DecodeBitplane(pContext, &picLayerHeader->MVTYPEMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); } //skipped macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //motion vector table VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB //coded block pattern table VC1_GET_BITS(2, picLayerHeader->CBPTAB); //CBPTAB vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM) { //macroblock - level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else { //_MAYBE_ see reference decoder - vc1decpic.c vc1DECPIC_UnpackPictureLayerPBAdvanced function picLayerHeader->TTFRM = VC1_BLK_INTER; } } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //frame-level transform AC Coding set index VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } picLayerHeader->TRANSACFRM2 = picLayerHeader->TRANSACFRM; //intra transfrmDC table VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } VC1Status DecodePictHeaderParams_InterlacePpicture_Adv (VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("P frame type \n")); #endif //extended MV range flag MVRangeDecode(pContext); //extended differential MV Range Flag if(seqLayerHeader->EXTENDED_DMV == 1) { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 0 picLayerHeader->DMVRANGE = VC1_DMVRANGE_NONE; } else { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 10 picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_RANGE; } else { VC1_GET_BITS(1, picLayerHeader->DMVRANGE); if(picLayerHeader->DMVRANGE==0) { //binary code 110 picLayerHeader->DMVRANGE = VC1_DMVRANGE_VERTICAL_RANGE; } else { //binary code 111 picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE; } } } } //4 motion vector switch VC1_GET_BITS(1, picLayerHeader->MV4SWITCH); if(picLayerHeader->MV4SWITCH) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else picLayerHeader->MVMODE = VC1_MVMODE_1MV; //intensity compensation VC1_GET_BITS(1, tempValue); //INTCOMP if(tempValue) //INTCOM { pContext->m_bIntensityCompensation = 1; VC1_GET_BITS(6, picLayerHeader->LUMSCALE); VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].ICFieldMask = 0xC; } //skipped macroblock bit syntax element DecodeBitplane(pContext, &picLayerHeader->SKIPMB, seqLayerHeader->widthMB, seqLayerHeader->heightMB,0); //motion vector table VC1_GET_BITS(2, picLayerHeader->MBMODETAB); //MBMODETAB //motion vector table VC1_GET_BITS(2,picLayerHeader->MVTAB); //MVTAB //coded block pattern table VC1_GET_BITS(3,picLayerHeader->CBPTAB); //CBPTAB VC1_GET_BITS(2, picLayerHeader->MV2BPTAB); //MV2BPTAB if(picLayerHeader->MV4SWITCH) { VC1_GET_BITS(2, picLayerHeader->MV4BPTAB) //MV4BPTAB; } vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM == 1) { //macroblock - level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else picLayerHeader->TTFRM = VC1_BLK_INTER; } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //frame-level transform AC Coding set index VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } VC1Status DecodeFieldHeaderParams_InterlaceFieldPpicture_Adv (VC1Context* pContext) { VC1Status vc1Res = VC1_OK; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; uint32_t tempValue; (void) tempValue; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES, VM_STRING("P frame type \n")); #endif VC1_GET_BITS(5,picLayerHeader->PQINDEX); if(picLayerHeader->PQINDEX<=8) { VC1_GET_BITS(1,picLayerHeader->HALFQP); } else picLayerHeader->HALFQP = 0; if(seqLayerHeader->QUANTIZER == 1) { VC1_GET_BITS(1,picLayerHeader->PQUANTIZER); //PQUANTIZER } CalculatePQuant(pContext); if(seqLayerHeader->POSTPROCFLAG) { //post processing VC1_GET_BITS(2,tempValue); //POSTPROC } //NUMREF VC1_GET_BITS(1,picLayerHeader->NUMREF); if(!picLayerHeader->NUMREF) { VC1_GET_BITS(1,picLayerHeader->REFFIELD); } //extended MV range flag MVRangeDecode(pContext); //extended differential MV Range Flag DMVRangeDecode(pContext); picLayerHeader->INTCOMFIELD = 0; pContext->m_bIntensityCompensation = 0; //motion vector mode if(picLayerHeader->PQUANT > 12) { //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //0000 Mixed MV //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_1); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else { pContext->m_bIntensityCompensation = 1; picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; { int32_t index_top = pContext->m_frmBuff.m_iPrevIndex; //pContext->m_bIntensityCompensation = 0; //MVMODE VLC Mode //1 1 MV Half-pel bilinear //01 1 MV //001 1 MV Half-pel //000 Mixed MV bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_5); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; if (picLayerHeader->CurrField) { if (picLayerHeader->BottomField) index_top = pContext->m_frmBuff.m_iCurrIndex; } //INTCOMPFIELD VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD); if(picLayerHeader->INTCOMFIELD == 1) { //1 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTH_FIELD; } else { VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD); if(picLayerHeader->INTCOMFIELD == 1) { //01 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTTOM_FIELD; } else { //00 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_TOP_FIELD; } } if(VC1_IS_INT_TOP_FIELD(picLayerHeader->INTCOMFIELD)) { //top //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); } if(VC1_IS_INT_BOTTOM_FIELD(picLayerHeader->INTCOMFIELD) ) { //bottom in case "both field" // assert(0); //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE1); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT1); } pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].ICFieldMask |= picLayerHeader->INTCOMFIELD << (2 * (1 - picLayerHeader->CurrField)); pContext->m_frmBuff.m_pFrames[index_top].m_bIsExpanded = 0; picLayerHeader->MVMODE2 = picLayerHeader->MVMODE; } } } else { //MVMODE VLC Mode //1 1 MV //01 Mixed MV //001 1 MV Half-pel //0000 1 MV Half-pel bilinear //0001 Intensity Compensation int32_t bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 4)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 4) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_2); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else { pContext->m_bIntensityCompensation = 1; picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP; { bit_count = 1; VC1_GET_BITS(1, picLayerHeader->MVMODE); while((picLayerHeader->MVMODE == 0) && (bit_count < 3)) { VC1_GET_BITS(1, picLayerHeader->MVMODE); bit_count++; } if (bit_count < 3) picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_4); else if(picLayerHeader->MVMODE == 0) picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV; else picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV; //INTCOMPFIELD VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD); if(picLayerHeader->INTCOMFIELD == 1) { //1 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTH_FIELD; } else { VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD); if(picLayerHeader->INTCOMFIELD == 1) { //01 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTTOM_FIELD; } else { //00 picLayerHeader->INTCOMFIELD = VC1_INTCOMP_TOP_FIELD; } } if(VC1_IS_INT_TOP_FIELD(picLayerHeader->INTCOMFIELD)) { //top //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT); } if(VC1_IS_INT_BOTTOM_FIELD(picLayerHeader->INTCOMFIELD) ) { //bottom in case "both field" // assert(0); //Luma scale VC1_GET_BITS(6, picLayerHeader->LUMSCALE1); //Luma shift VC1_GET_BITS(6, picLayerHeader->LUMSHIFT1); } pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].ICFieldMask |= picLayerHeader->INTCOMFIELD << (2*(1 - picLayerHeader->CurrField)); picLayerHeader->MVMODE2 = picLayerHeader->MVMODE; } } } //motion vector table VC1_GET_BITS(3, picLayerHeader->MBMODETAB); //MBMODETAB //motion vector table if(picLayerHeader->NUMREF) { VC1_GET_BITS(3, picLayerHeader->MVTAB); //MVTAB } else { VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB } //coded block pattern table VC1_GET_BITS(3, picLayerHeader->CBPTAB); //CBPTAB if(picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) { VC1_GET_BITS(2, picLayerHeader->MV4BPTAB) //MV4BPTAB; } vc1Res = VOPDQuant(pContext); if(seqLayerHeader->VSTRANSFORM == 1) { //macroblock - level transform type flag VC1_GET_BITS(1, picLayerHeader->TTMBF); if(picLayerHeader->TTMBF) { //frame-level transform type VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG); picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG; } else picLayerHeader->TTFRM = VC1_BLK_INTER; } else { picLayerHeader->TTFRM = VC1_BLK_INTER8X8; } //frame-level transform AC Coding set index VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM if(picLayerHeader->TRANSACFRM == 1) { VC1_GET_BITS(1, picLayerHeader->TRANSACFRM); picLayerHeader->TRANSACFRM++; } VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB return vc1Res; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_seq.cpp000066400000000000000000000420701443134507600316660ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #if defined(__GNUC__) #if defined(__INTEL_COMPILER) #pragma warning (disable:1478) #else #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif #include "ippcore.h" #include "umc_vc1_dec_seq.h" #include "umc_vc1_common_defs.h" #include "umc_vc1_common.h" #include "umc_structures.h" using namespace UMC; using namespace UMC::VC1Common; static const uint32_t FRateExtD_tbl[] = {2,2,6,7,18,22,26}; static const uint32_t FRateExtN_tbl[] = {24,8,12,12,24,24,24}; static void reset_index(VC1Context* pContext) { pContext->m_frmBuff.m_iPrevIndex = -1; pContext->m_frmBuff.m_iNextIndex = -1; } //3.1 Sequence-level Syntax and Semantics, figure 7 VC1Status SequenceLayer(VC1Context* pContext) { uint32_t reserved; (void) reserved; uint32_t i=0; uint32_t tempValue; pContext->m_seqLayerHeader.ColourDescriptionPresent = 0; VC1_GET_BITS(2, pContext->m_seqLayerHeader.PROFILE); if (!VC1_IS_VALID_PROFILE(pContext->m_seqLayerHeader.PROFILE)) return VC1_WRN_INVALID_STREAM; if(pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { VC1_GET_BITS(3, pContext->m_seqLayerHeader.LEVEL); VC1_GET_BITS(2,tempValue); //CHROMAFORMAT } else { //remain bites of profile VC1_GET_BITS(2, pContext->m_seqLayerHeader.LEVEL); } VC1_GET_BITS(3, pContext->m_seqLayerHeader.FRMRTQ_POSTPROC); VC1_GET_BITS(5, pContext->m_seqLayerHeader.BITRTQ_POSTPROC); if(pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { VC1_GET_BITS(1, pContext->m_seqLayerHeader.POSTPROCFLAG); VC1_GET_BITS(12, pContext->m_seqLayerHeader.MAX_CODED_WIDTH); VC1_GET_BITS(12, pContext->m_seqLayerHeader.MAX_CODED_HEIGHT); pContext->m_seqLayerHeader.CODED_HEIGHT = pContext->m_seqLayerHeader.MAX_CODED_HEIGHT; pContext->m_seqLayerHeader.CODED_WIDTH = pContext->m_seqLayerHeader.MAX_CODED_WIDTH; uint32_t width = 0; uint32_t height = 0; width = 2*(pContext->m_seqLayerHeader.CODED_WIDTH+1); height = 2*(pContext->m_seqLayerHeader.CODED_HEIGHT+1); pContext->m_seqLayerHeader.widthMB = (uint16_t)((width+15)/VC1_PIXEL_IN_LUMA); pContext->m_seqLayerHeader.heightMB = (uint16_t)((height+15)/VC1_PIXEL_IN_LUMA); width = 2*(pContext->m_seqLayerHeader.MAX_CODED_WIDTH+1); height = 2*(pContext->m_seqLayerHeader.MAX_CODED_HEIGHT+1); pContext->m_seqLayerHeader.MaxWidthMB = (uint16_t)((width+15)/VC1_PIXEL_IN_LUMA); pContext->m_seqLayerHeader.MaxHeightMB = (uint16_t)((height+15)/VC1_PIXEL_IN_LUMA); VC1_GET_BITS(1, pContext->m_seqLayerHeader.PULLDOWN); VC1_GET_BITS(1, pContext->m_seqLayerHeader.INTERLACE); VC1_GET_BITS(1, pContext->m_seqLayerHeader.TFCNTRFLAG); } else { VC1_GET_BITS(1, pContext->m_seqLayerHeader.LOOPFILTER); VC1_GET_BITS(1, reserved); VC1_GET_BITS(1, pContext->m_seqLayerHeader.MULTIRES); VC1_GET_BITS(1, reserved); VC1_GET_BITS(1, pContext->m_seqLayerHeader.FASTUVMC); VC1_GET_BITS(1, pContext->m_seqLayerHeader.EXTENDED_MV); VC1_GET_BITS(2, pContext->m_seqLayerHeader.DQUANT); VC1_GET_BITS(1, pContext->m_seqLayerHeader.VSTRANSFORM); VC1_GET_BITS(1, reserved); VC1_GET_BITS(1, pContext->m_seqLayerHeader.OVERLAP); VC1_GET_BITS(1, pContext->m_seqLayerHeader.SYNCMARKER); VC1_GET_BITS(1, pContext->m_seqLayerHeader.RANGERED); VC1_GET_BITS(3, pContext->m_seqLayerHeader.MAXBFRAMES); VC1_GET_BITS(2, pContext->m_seqLayerHeader.QUANTIZER); } VC1_GET_BITS(1, pContext->m_seqLayerHeader.FINTERPFLAG); if(pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { VC1_GET_BITS(2, reserved); VC1_GET_BITS(1, tempValue);//DISPLAY_EXT if(tempValue)//DISPLAY_EXT { VC1_GET_BITS(14,tempValue); //DISP_HORIZ_SIZE VC1_GET_BITS(14,tempValue); //DISP_VERT_SIZE VC1_GET_BITS(1,tempValue); //ASPECT_RATIO_FLAG if(tempValue) { VC1_GET_BITS(4,tempValue); //ASPECT_RATIO if(tempValue==15) { VC1_GET_BITS(8, pContext->m_seqLayerHeader.AspectRatioW); //ASPECT_HORIZ_SIZE VC1_GET_BITS(8, pContext->m_seqLayerHeader.AspectRatioH); //ASPECT_VERT_SIZE } else { pContext->m_seqLayerHeader.AspectRatioW = 0; pContext->m_seqLayerHeader.AspectRatioH = 0; } } VC1_GET_BITS(1,tempValue); //FRAMERATE_FLAG if(tempValue) //FRAMERATE_FLAG { VC1_GET_BITS(1,tempValue); //FRAMERATEIND if(!tempValue) //FRAMERATEIND { VC1_GET_BITS(8, pContext->m_seqLayerHeader.FRAMERATENR); //FRAMERATENR VC1_GET_BITS(4,pContext->m_seqLayerHeader.FRAMERATEDR); //FRAMERATEDR } else { VC1_GET_BITS(16,tempValue); //FRAMERATEEXP } } VC1_GET_BITS(1,tempValue); //COLOR_FORMAT_FLAG if(tempValue) //COLOR_FORMAT_FLAG { pContext->m_seqLayerHeader.ColourDescriptionPresent = 1; VC1_GET_BITS(8, tempValue); //COLOR_PRIM pContext->m_seqLayerHeader.ColourPrimaries = (uint16_t)tempValue; VC1_GET_BITS(8, tempValue); //TRANSFER_CHAR pContext->m_seqLayerHeader.TransferCharacteristics = (uint16_t)tempValue; VC1_GET_BITS(8, tempValue); //MATRIX_COEF pContext->m_seqLayerHeader.MatrixCoefficients = (uint16_t)tempValue; } } VC1_GET_BITS(1, pContext->m_seqLayerHeader.HRD_PARAM_FLAG); if(pContext->m_seqLayerHeader.HRD_PARAM_FLAG) { VC1_GET_BITS(5,pContext->m_seqLayerHeader.HRD_NUM_LEAKY_BUCKETS); VC1_GET_BITS(4,tempValue);//BIT_RATE_EXPONENT VC1_GET_BITS(4,tempValue);//BUFFER_SIZE_EXPONENT for(i=0; im_seqLayerHeader.HRD_NUM_LEAKY_BUCKETS; i++) { VC1_GET_BITS(16,tempValue);//HRD_RATE[i] VC1_GET_BITS(16,tempValue);//HRD_BUFFER[i] } } } // need to parse struct_B in case of simple/main profiles if (pContext->m_seqLayerHeader.PROFILE != VC1_PROFILE_ADVANCED) { // last in struct_C VC1_GET_BITS(1, tempValue); // skip struct_A and 0x000000C pContext->m_bitstream.pBitstream += 3; VC1_GET_BITS(3, pContext->m_seqLayerHeader.LEVEL); VC1_GET_BITS(1,tempValue); // CBR1 VC1_GET_BITS(4,tempValue); // RES1 VC1_GET_BITS(12,tempValue); // HRD_BUFFER VC1_GET_BITS(12,tempValue);// HRD_BUFFER VC1_GET_BITS(32,tempValue);// HRD_RATE VC1_GET_BITS(32,tempValue);// FRAME_RATE } return VC1_OK; } VC1Status EntryPointLayer(VC1Context* pContext) { uint32_t i=0; uint32_t tempValue; uint32_t width, height; VC1_GET_BITS(1, pContext->m_seqLayerHeader.BROKEN_LINK); VC1_GET_BITS(1, pContext->m_seqLayerHeader.CLOSED_ENTRY); VC1_GET_BITS(1, pContext->m_seqLayerHeader.PANSCAN_FLAG); VC1_GET_BITS(1, pContext->m_seqLayerHeader.REFDIST_FLAG); VC1_GET_BITS(1, pContext->m_seqLayerHeader.LOOPFILTER); VC1_GET_BITS(1, pContext->m_seqLayerHeader.FASTUVMC); VC1_GET_BITS(1, pContext->m_seqLayerHeader.EXTENDED_MV); VC1_GET_BITS(2, pContext->m_seqLayerHeader.DQUANT); VC1_GET_BITS(1, pContext->m_seqLayerHeader.VSTRANSFORM); VC1_GET_BITS(1, pContext->m_seqLayerHeader.OVERLAP); VC1_GET_BITS(2, pContext->m_seqLayerHeader.QUANTIZER); if (pContext->m_seqLayerHeader.CLOSED_ENTRY) pContext->m_seqLayerHeader.BROKEN_LINK = 0; if (pContext->m_seqLayerHeader.BROKEN_LINK && !pContext->m_seqLayerHeader.CLOSED_ENTRY) reset_index(pContext); if(pContext->m_seqLayerHeader.HRD_PARAM_FLAG == 1) { for(i=0; im_seqLayerHeader.HRD_NUM_LEAKY_BUCKETS;i++) { VC1_GET_BITS(8, tempValue); //m_hrd_buffer_fullness.HRD_FULLNESS[i] } } VC1_GET_BITS(1, tempValue); //CODED_SIZE_FLAG if (tempValue == 1) { VC1_GET_BITS(12, width); VC1_GET_BITS(12, height); if (pContext->m_seqLayerHeader.CODED_WIDTH > pContext->m_seqLayerHeader.MAX_CODED_WIDTH) return VC1_FAIL; if (pContext->m_seqLayerHeader.CODED_HEIGHT > pContext->m_seqLayerHeader.MAX_CODED_HEIGHT) return VC1_FAIL; if (pContext->m_seqLayerHeader.CODED_WIDTH > width) { pContext->m_seqLayerHeader.CLOSED_ENTRY = 1; pContext->m_seqLayerHeader.BROKEN_LINK = 1; } if (pContext->m_seqLayerHeader.CODED_HEIGHT > height) { pContext->m_seqLayerHeader.CLOSED_ENTRY = 1; pContext->m_seqLayerHeader.BROKEN_LINK = 1; } pContext->m_seqLayerHeader.CODED_WIDTH = width; pContext->m_seqLayerHeader.CODED_HEIGHT = height; } else { pContext->m_seqLayerHeader.CODED_WIDTH = pContext->m_seqLayerHeader.MAX_CODED_WIDTH; pContext->m_seqLayerHeader.CODED_HEIGHT = pContext->m_seqLayerHeader.MAX_CODED_HEIGHT; } width = 2*(pContext->m_seqLayerHeader.CODED_WIDTH+1); height = 2*(pContext->m_seqLayerHeader.CODED_HEIGHT+1); pContext->m_seqLayerHeader.widthMB = (uint16_t)((width+15)/VC1_PIXEL_IN_LUMA); pContext->m_seqLayerHeader.heightMB = (uint16_t)((height+15)/VC1_PIXEL_IN_LUMA); if (pContext->m_seqLayerHeader.EXTENDED_MV == 1) { VC1_GET_BITS(1, pContext->m_seqLayerHeader.EXTENDED_DMV); } VC1_GET_BITS(1, pContext->m_seqLayerHeader.RANGE_MAPY_FLAG); //RANGE_MAPY_FLAG if (pContext->m_seqLayerHeader.RANGE_MAPY_FLAG == 1) { VC1_GET_BITS(3,pContext->m_seqLayerHeader.RANGE_MAPY); } else pContext->m_seqLayerHeader.RANGE_MAPY = -1; VC1_GET_BITS(1, pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG); //RANGE_MAPUV_FLAG if (pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG == 1) { VC1_GET_BITS(3,pContext->m_seqLayerHeader.RANGE_MAPUV); } else pContext->m_seqLayerHeader.RANGE_MAPUV = -1; return VC1_OK; } VC1Status GetNextPicHeader_Adv(VC1Context* pContext) { VC1Status vc1Sts = VC1_OK; memset(pContext->m_picLayerHeader, 0, sizeof(VC1PictureLayerHeader)); vc1Sts = DecodePictureHeader_Adv(pContext); return vc1Sts; } VC1Status GetNextPicHeader(VC1Context* pContext, bool isExtHeader) { VC1Status vc1Sts = VC1_OK; memset(pContext->m_picLayerHeader, 0, sizeof(VC1PictureLayerHeader)); vc1Sts = DecodePictureHeader(pContext, isExtHeader); return vc1Sts; } #ifdef _OWN_FUNCTION //range map void _own_ippiRangeMap_VC1_8u_C1R(uint8_t* pSrc, int32_t srcStep, uint8_t* pDst, int32_t dstStep, mfxSize roiSize, int32_t rangeMapParam) { int32_t i=0; int32_t j=0; int32_t temp; for (i = 0; i < roiSize.height; i++) { for (j = 0; j < roiSize.width; j++) { temp = pSrc[i*srcStep+j]; temp = (temp - 128)*(rangeMapParam+9)+4; temp = temp>>3; temp = temp+128; pDst[i*dstStep+j] = mfx::byte_clamp(temp); } } } #endif //frame rate calculation void MapFrameRateIntoMfx(uint32_t& ENR, uint32_t& EDR, uint16_t FCode) { uint32_t FRateExtN; uint32_t FRateExtD; if (ENR && EDR) { switch (ENR) { case 1: ENR = 24 * 1000; break; case 2: ENR = 25 * 1000; break; case 3: ENR = 30 * 1000; break; case 4: ENR = 50 * 1000; break; case 5: ENR = 60 * 1000; break; case 6: ENR = 48 * 1000; break; case 7: ENR = 72 * 1000; break; default: ENR = 24 * 1000; break; } switch (EDR) { case 1: EDR = 1000; break; case 2: EDR = 1001; break; default: EDR = 1000; break; } return; } else { if (FCode > 6) { ENR = 0; EDR = 0; return; } FRateExtN = FRateExtN_tbl[FCode]; FRateExtD = FRateExtD_tbl[FCode]; ENR = FRateExtN; EDR = FRateExtD; return; } } double MapFrameRateIntoUMC(uint32_t ENR,uint32_t EDR, uint32_t& FCode) { double frate; double ENRf; double EDRf; if (FCode > 6) { ENR = 0; EDR = 0; frate = (double)30; return frate; } else FCode = 2 + FCode * 4; if (ENR && EDR) { FCode = 1; switch (ENR) { case 1: ENR = 24 * 1000; break; case 2: ENR = 25 * 1000; break; case 3: ENR = 30 * 1000; break; case 4: ENR = 50 * 1000; break; case 5: ENR = 60 * 1000; break; case 6: ENR = 48 * 1000; break; case 7: ENR = 72 * 1000; break; default: ENR = 24 * 1000; break; } switch (EDR) { case 1: EDR = 1000; break; case 2: EDR = 1001; break; default: EDR = 1000; break; } } else { ENR = 1; EDR = 1; } ENRf = ENR; EDRf = EDR; frate = FCode * ENRf/EDRf; return frate; } VC1Status MVRangeDecode(VC1Context* pContext) { VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; if (pContext->m_seqLayerHeader.EXTENDED_MV == 1) { //MVRANGE; //0 256 128 //10 512 256 //110 2048 512 //111 4096 1024 VC1_GET_BITS(1, picLayerHeader->MVRANGE); if (picLayerHeader->MVRANGE) { VC1_GET_BITS(1, picLayerHeader->MVRANGE); if (picLayerHeader->MVRANGE) { VC1_GET_BITS(1, picLayerHeader->MVRANGE); picLayerHeader->MVRANGE += 1; } picLayerHeader->MVRANGE += 1; } } else { picLayerHeader->MVRANGE = 0; } return VC1_OK; } VC1Status DMVRangeDecode(VC1Context* pContext) { if (pContext->m_seqLayerHeader.EXTENDED_DMV == 1) { VC1_GET_BITS(1, pContext->m_picLayerHeader->DMVRANGE); if (pContext->m_picLayerHeader->DMVRANGE == 0) { //binary code 0 pContext->m_picLayerHeader->DMVRANGE = VC1_DMVRANGE_NONE; } else { VC1_GET_BITS(1, pContext->m_picLayerHeader->DMVRANGE); if (pContext->m_picLayerHeader->DMVRANGE == 0) { //binary code 10 pContext->m_picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_RANGE; } else { VC1_GET_BITS(1, pContext->m_picLayerHeader->DMVRANGE); if (pContext->m_picLayerHeader->DMVRANGE == 0) { //binary code 110 pContext->m_picLayerHeader->DMVRANGE = VC1_DMVRANGE_VERTICAL_RANGE; } else { //binary code 111 pContext->m_picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE; } } } } return VC1_OK; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_skipping.cpp000066400000000000000000000112331443134507600327170ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_skipping.h" #include "umc_vc1_common_defs.h" using namespace UMC::VC1Skipping; void VC1SkipMaster::SetSkipPeriod(bool ForRefFrames, uint32_t period) { if (ForRefFrames) { m_iRefSkipPeriod = period; m_iRefSkipCounter = 0; } else { m_iBSkipPeriod = period; m_iBSkipCounter = 0; } } void VC1SkipMaster::SetPerformMode(bool ForRefFrames, uint32_t perfomMode) { if (perfomMode > VC1MaxSpeed) return; if (ForRefFrames) m_RefPerfMode = perfomMode; else m_BPerfMode = perfomMode; } void VC1SkipMaster::MoveToNextState() { switch(m_SpeedMode) { case B1: m_BPerfMode = VC1PostProcDisable; break; case B2: m_BPerfMode = VC1PostProcDisable; break; case B3: m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,3); break; case B4: m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,2); break; case B5: m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,1); break; case Ref1: m_RefPerfMode = VC1PostProcDisable; m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,1); break; case Ref2: m_RefPerfMode = VC1PostProcDisable; m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,1); break; case Ref3: m_RefPerfMode = VC1PostProcDisable; m_BPerfMode = VC1PostProcDisable; SetSkipPeriod(false,1); SetSkipPeriod(true,4); break; default: break; } } void VC1SkipMaster::Reset() { m_iRefSkipPeriod = 0; m_iRefSkipCounter = 0; m_iBSkipPeriod = 0; m_iBSkipCounter = 0; m_RefPerfMode = VC1Routine; m_BPerfMode = VC1Routine; //m_SpeedMode = Normal; } bool VC1SkipMaster::IsDeblockingOn() { return m_bOnDbl; } bool VC1SkipMaster::ChangeVideoDecodingSpeed(int32_t& speed_shift) { if (speed_shift) { // special dbl disable mode if (0x22 == speed_shift) { m_bOnDbl = false; } else { if (((Ref3 == m_SpeedMode) && (speed_shift > 0))|| ((Normal == m_SpeedMode) && (speed_shift < 0))) return false; Reset(); m_SpeedMode += speed_shift; if (Ref3 < m_SpeedMode) m_SpeedMode = Ref3; else if (Normal > m_SpeedMode) m_SpeedMode = Normal; MoveToNextState(); speed_shift = m_SpeedMode; } } return true; } bool VC1SkipMaster::IsNeedSkipFrame(uint32_t picType) { if (VC1_IS_REFERENCE(picType)) { if ((m_SpeedMode < Ref3)||(VC1_I_FRAME == picType)) return false; return true; } else { if (m_SpeedMode < B3) return false; ++m_iBSkipCounter; if (m_iBSkipCounter == m_iBSkipPeriod) { m_iBSkipCounter = 0; return true; } } return false; } bool VC1SkipMaster::IsNeedPostProcFrame(uint32_t picType) { if (!m_bOnDbl) return false; if (VC1_IS_REFERENCE(picType)) { return (m_RefPerfMode == VC1Routine); } else { return (m_BPerfMode == VC1Routine); } } bool VC1SkipMaster::IsNeedSimlifyReconstruct(uint32_t picType) { if (VC1_IS_REFERENCE(picType)) { return (m_RefPerfMode == VC1MaxSpeed); } else { return (m_BPerfMode == VC1MaxSpeed); } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_task_store.cpp000066400000000000000000000266401443134507600332610ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_task_store.h" #include "umc_vc1_video_decoder.h" #include "umc_frame_data.h" #include "mfx_trace.h" #include "umc_va_base.h" #include "umc_vc1_dec_frame_descr_va.h" namespace UMC { VC1TaskStore::VC1TaskStore(MemoryAllocator *pMemoryAllocator): m_iConsumerNumber(0), m_pDescriptorQueue(nullptr), m_iNumFramesProcessing(0), m_iNumDSActiveinQueue(0), m_mDSGuard(), m_pGuardGet(), pMainVC1Decoder(nullptr), m_lNextFrameCounter(1), m_pPrefDS(nullptr), m_iRangeMapIndex(0), m_pMemoryAllocator(nullptr), m_CurrIndex(-1), m_PrevIndex(-1), m_NextIndex(-1), m_BFrameIndex(-1), m_iICIndex(-1), m_iICIndexB(-1), m_iTSHeapID((MemID)-1), m_pSHeap(0), m_bIsLastFramesMode(false) { m_pMemoryAllocator = pMemoryAllocator; } VC1TaskStore::~VC1TaskStore() { uint32_t i; if(m_pMemoryAllocator) { if (m_pDescriptorQueue) { for (i = 0; i < m_iNumFramesProcessing; i++) m_pDescriptorQueue[i]->Release(); } if (static_cast(m_iTSHeapID) != -1) { m_pMemoryAllocator->Unlock(m_iTSHeapID); m_pMemoryAllocator->Free(m_iTSHeapID); m_iTSHeapID = (MemID)-1; } delete m_pSHeap; m_pSHeap = 0; } } bool VC1TaskStore::Init(uint32_t iConsumerNumber, uint32_t iMaxFramesInParallel, VC1VideoDecoder* pVC1Decoder) { uint32_t i; m_iNumDSActiveinQueue = 0; m_iRangeMapIndex = iMaxFramesInParallel + VC1NUMREFFRAMES -1; pMainVC1Decoder = pVC1Decoder; m_iConsumerNumber = iConsumerNumber; m_iNumFramesProcessing = iMaxFramesInParallel; { // Heap Allocation { uint32_t heapSize = CalculateHeapSize(); if (m_pMemoryAllocator->Alloc(&m_iTSHeapID, heapSize, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; delete m_pSHeap; m_pSHeap = new VC1TSHeap((uint8_t*)m_pMemoryAllocator->Lock(m_iTSHeapID),heapSize); } m_pGuardGet.resize(m_iNumFramesProcessing); for (i = 0; i < m_iNumFramesProcessing; i++) { m_pGuardGet[i].reset(new std::mutex); } } return true; } bool VC1TaskStore::Reset() { uint32_t i = 0; //close m_bIsLastFramesMode = false; ResetDSQueue(); if(m_pMemoryAllocator) { if (m_pDescriptorQueue) { for (i = 0; i < m_iNumFramesProcessing; i++) m_pDescriptorQueue[i]->Release(); } if (static_cast(m_iTSHeapID) != -1) { m_pMemoryAllocator->Unlock(m_iTSHeapID); m_pMemoryAllocator->Free(m_iTSHeapID); m_iTSHeapID = (MemID)-1; } m_iNumDSActiveinQueue = 0; delete m_pSHeap; // Heap Allocation { uint32_t heapSize = CalculateHeapSize(); if (m_pMemoryAllocator->Alloc(&m_iTSHeapID, heapSize, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pSHeap = new VC1TSHeap((uint8_t*)m_pMemoryAllocator->Lock(m_iTSHeapID), heapSize); } { for (i = 0; i < m_iNumFramesProcessing; i++) { m_pGuardGet[i].reset(new std::mutex); } } } SetBFrameIndex(-1); SetCurrIndex(-1); SetRangeMapIndex(-1); SetPrevIndex(-1); SetNextIndex(-1); return true; } uint32_t VC1TaskStore::CalculateHeapSize() { uint32_t Size = mfx::align2_value(sizeof(VC1FrameDescriptor*)*(m_iNumFramesProcessing)); for (uint32_t counter = 0; counter < m_iNumFramesProcessing; counter++) { if (pMainVC1Decoder->m_va) { Size += mfx::align2_value(sizeof(VC1FrameDescriptorVA_Linux)); } else Size += mfx::align2_value(sizeof(VC1FrameDescriptor)); } return Size; } bool VC1TaskStore::CreateDSQueue(VC1Context* pContext, VideoAccelerator* va) { if (!va) return false; m_pSHeap->s_new(&m_pDescriptorQueue,m_iNumFramesProcessing); for (uint32_t i = 0; i < m_iNumFramesProcessing; i++) { uint8_t* pBuf; pBuf = m_pSHeap->s_alloc >(); m_pDescriptorQueue[i] = new(pBuf) VC1FrameDescriptorVA_Linux(m_pMemoryAllocator,va); if (!m_pDescriptorQueue[i]) return false; m_pDescriptorQueue[i]->Init(i, pContext, this, 0); } m_pPrefDS = m_pDescriptorQueue[0]; return true; } bool VC1TaskStore::SetNewSHParams(VC1Context* pContext) { for (uint32_t i = 0; i < m_iNumFramesProcessing; i++) { m_pDescriptorQueue[i]->SetNewSHParams(pContext); } return true; } void VC1TaskStore::ResetDSQueue() { uint32_t i; for (i = 0; i < m_iNumFramesProcessing; i++) m_pDescriptorQueue[i]->Reset(); m_lNextFrameCounter = 1; } VC1FrameDescriptor* VC1TaskStore::GetLastDS() { uint32_t i; VC1FrameDescriptor* pCurrDescriptor = m_pDescriptorQueue[0]; for (i = 0; i < m_iNumFramesProcessing-1; i++) { if (pCurrDescriptor->m_iFrameCounter < m_pDescriptorQueue[i+1]->m_iFrameCounter) pCurrDescriptor = m_pDescriptorQueue[i+1]; } return pCurrDescriptor; } VC1FrameDescriptor* VC1TaskStore::GetFirstDS() { uint32_t i; for (i = 0; i < m_iNumFramesProcessing; i++) { if (m_pDescriptorQueue[i]->m_iFrameCounter == m_lNextFrameCounter) return m_pDescriptorQueue[i]; } return NULL; } FrameMemID VC1TaskStore::LockSurface(FrameMemID* mid, bool isSkip) { // B frames TBD Status sts; int32_t Idx; VideoDataInfo Info; uint32_t h = pMainVC1Decoder->m_pCurrentOut->GetHeight(); uint32_t w = pMainVC1Decoder->m_pCurrentOut->GetWidth(); Info.Init(w, h, YUV420); sts = pMainVC1Decoder->m_pExtFrameAllocator->Alloc(mid, &Info, 0); if (UMC_OK != sts) throw VC1Exceptions::vc1_exception( VC1Exceptions::mem_allocation_er); sts = pMainVC1Decoder->m_pExtFrameAllocator->IncreaseReference(*mid); if (UMC_OK != sts) throw VC1Exceptions::vc1_exception( VC1Exceptions::mem_allocation_er); Idx = LockAndAssocFreeIdx(*mid); if (Idx < 0) return Idx; pMainVC1Decoder->m_pContext->m_frmBuff.m_pFrames.AdjustToIndex(static_cast(Idx)); if (!pMainVC1Decoder->m_va) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); if (!isSkip) { if (pMainVC1Decoder->m_va->m_Platform != VA_LINUX) // on Linux we call BeginFrame() inside VC1PackPicParams() sts = pMainVC1Decoder->m_va->BeginFrame(*mid); if (UMC_OK != sts) return -1; } *mid = Idx; return 0; } void VC1TaskStore::UnLockSurface(int32_t memID) { if (pMainVC1Decoder->m_va && memID > -1) pMainVC1Decoder->m_pExtFrameAllocator->DecreaseReference(memID); } int32_t VC1TaskStore::LockAndAssocFreeIdx(FrameMemID mid) { return mid; } FrameMemID VC1TaskStore::UnLockIdx(uint32_t Idx) { return Idx; } FrameMemID VC1TaskStore::GetIdx(uint32_t Idx) { return Idx; } FrameMemID VC1TaskStore::GetPrevIndex(void) { return m_PrevIndex; } FrameMemID VC1TaskStore::GetNextIndex(void) { return m_NextIndex; } FrameMemID VC1TaskStore::GetBFrameIndex(void) { return m_BFrameIndex; } FrameMemID VC1TaskStore::GetRangeMapIndex(void) { return m_iICIndex; } void VC1TaskStore::SetCurrIndex(FrameMemID Index) { m_CurrIndex = Index; } void VC1TaskStore::SetPrevIndex(FrameMemID Index) { m_PrevIndex = Index; } void VC1TaskStore::SetNextIndex(FrameMemID Index) { m_NextIndex = Index; } void VC1TaskStore::SetBFrameIndex(FrameMemID Index) { m_BFrameIndex = Index; } void VC1TaskStore::SetRangeMapIndex(FrameMemID Index) { m_iICIndex = Index; } }// namespace UMC #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_dec_vopdq.cpp000066400000000000000000000207671443134507600322400ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_debug.h" //Figure 14: Syntax diagram for VOPDQUANT in //(Progressive P, Interlace I and Interlace P) picture header //3.2.1.27 VOPDQUANT Syntax Elements VC1Status VOPDQuant(VC1Context* pContext) { uint32_t tempValue; VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; uint32_t DQUANT = pContext->m_seqLayerHeader.DQUANT; picLayerHeader->m_DQuantFRM = 0; picLayerHeader->DQSBEdge = 0; picLayerHeader->m_DQBILevel = 0; //pContext->m_picLayerHeader->bVopdquantCoded = 1; if(DQUANT == 1) { //The DQUANTFRM field is a 1 bit value that is present only //when DQUANT = 1. If DQUANTFRM = 0 then the current picture //is only quantized with PQUANT. VC1_GET_BITS(1, picLayerHeader->m_DQuantFRM); if(picLayerHeader->m_DQuantFRM == 1) { //The DQPROFILE field is a 2 bits value that is present //only when DQUANT = 1 and DQUANTFRM = 1. It indicates //where we are allowed to change quantization step sizes //within the current picture. //Table 15: Macroblock Quantization Profile (DQPROFILE) Code Table //FLC Location //00 All four Edges //01 Double Edges //10 Single Edges //11 All Macroblocks VC1_GET_BITS(2,picLayerHeader->m_DQProfile); switch (picLayerHeader->m_DQProfile) { case VC1_DQPROFILE_ALL4EDGES: picLayerHeader->m_PQuant_mode = VC1_ALTPQUANT_EDGES; break; case VC1_DQPROFILE_SNGLEDGES: { //uint32_t m_DQSBEdge; //The DQSBEDGE field is a 2 bits value that is present //when DQPROFILE = Single Edge. It indicates which edge //will be quantized with ALTPQUANT. //Table 16: Single Boundary Edge Selection (DQSBEDGE) Code Table //FLC Boundary Edge //00 Left //01 Top //10 Right //11 Bottom VC1_GET_BITS(2, picLayerHeader->DQSBEdge); picLayerHeader->m_PQuant_mode = 1<DQSBEdge; break; } case VC1_DQPROFILE_DBLEDGES: { //uint32_t m_DQDBEdge; //The DQSBEDGE field is a 2 bits value that is present //when DQPROFILE = Double Edge. It indicates which two //edges will be quantized with ALTPQUANT. //Table 17: Double Boundary Edges Selection (DQDBEDGE) Code Table //FLC Boundary Edges //00 Left and Top //01 Top and Right //10 Right and Bottom //11 Bottom and Left VC1_GET_BITS(2, picLayerHeader->DQSBEdge); picLayerHeader->m_PQuant_mode = (picLayerHeader->DQSBEdge>1)?VC1_ALTPQUANT_BOTTOM:VC1_ALTPQUANT_TOP; picLayerHeader->m_PQuant_mode |= ((picLayerHeader->DQSBEdge%3)? VC1_ALTPQUANT_RIGTHT:VC1_ALTPQUANT_LEFT); break; } case VC1_DQPROFILE_ALLMBLKS: { //The DQBILEVEL field is a 1 bit value that is present //when DQPROFILE = All Macroblock. If DQBILEVEL = 1, //then each macroblock in the picture can take one of //two possible values (PQUANT or ALTPQUANT). If //DQBILEVEL = 0, then each macroblock in the picture //can take on any quantization step size. VC1_GET_BITS(1, picLayerHeader->m_DQBILevel); picLayerHeader->m_PQuant_mode = (picLayerHeader->m_DQBILevel)? VC1_ALTPQUANT_MB_LEVEL:VC1_ALTPQUANT_ANY_VALUE; break; } } } else picLayerHeader->m_PQuant_mode=VC1_ALTPQUANT_NO; } else if (DQUANT == 2) { picLayerHeader->m_PQuant_mode = VC1_ALTPQUANT_EDGES; picLayerHeader->m_DQuantFRM = 1; } else picLayerHeader->m_PQuant_mode=VC1_ALTPQUANT_NO; //PQDIFF is a 3 bit field that encodes either the PQUANT //differential or encodes an escape code. //If PQDIFF does not equal 7 then PQDIFF encodes the //differential and the ABSPQ field does not follow in //the bitstream. In this case: // ALTPQUANT = PQUANT + PQDIFF + 1 //If PQDIFF equals 7 then the ABSPQ field follows in //the bitstream and ALTPQUANT is decoded as: // ALTPQUANT = ABSPQ if (picLayerHeader->m_DQuantFRM) { if(DQUANT==2 || !(picLayerHeader->m_DQProfile == VC1_DQPROFILE_ALLMBLKS && picLayerHeader->m_DQBILevel == 0)) { VC1_GET_BITS(3, tempValue); //PQDIFF if(tempValue == 7) // escape { //ABSPQ is present in the bitstream if PQDIFF equals 7. //In this case, ABSPQ directly encodes the value of //ALTPQUANT as described above. VC1_GET_BITS(5, tempValue); //m_ABSPQ picLayerHeader->m_AltPQuant = tempValue; //m_ABSPQ } else { picLayerHeader->m_AltPQuant = picLayerHeader->PQUANT + tempValue + 1; } } } return VC1_OK; } static const uint8_t MapPQIndToQuant_Impl[] = { VC1_UNDEF_PQUANT, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10,11,12,13, 14,15,16,17,18,19,20,21, 22,23,24,25,27,29,31 }; VC1Status CalculatePQuant(VC1Context* pContext) { VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader; VC1SequenceLayerHeader* seqLayerHeader = &pContext->m_seqLayerHeader; picLayerHeader->PQUANT = picLayerHeader->PQINDEX; picLayerHeader->QuantizationType = VC1_QUANTIZER_UNIFORM; if(seqLayerHeader->QUANTIZER == 0) { //If the implicit quantizer is used (signaled by sequence field //QUANTIZER = 00, see section 3.1.19) then PQINDEX specifies both //the picture quantizer scale (PQUANT) and the quantizer (3QP or //5QP deadzone) used for the frame. Table 5 shows how PQINDEX is //translated to PQUANT and the quantizer for implicit mode. if(picLayerHeader->PQINDEX < 9) { picLayerHeader->QuantizationType = VC1_QUANTIZER_UNIFORM; } else { picLayerHeader->QuantizationType = VC1_QUANTIZER_NONUNIFORM; picLayerHeader->PQUANT = MapPQIndToQuant_Impl[picLayerHeader->PQINDEX]; } } else //01 or 10 or 11 binary { //If the quantizer is signaled explicitly at the sequence or frame //level (signaled by sequence field QUANTIZER = 01, 10 or 11 see //section 3.1.19) then PQINDEX is translated to the picture quantizer //stepsize PQUANT as indicated by Table 6. if((seqLayerHeader->QUANTIZER == 2) || ((picLayerHeader->PQUANTIZER == 0) && (seqLayerHeader->QUANTIZER == 1))) { picLayerHeader->QuantizationType = VC1_QUANTIZER_NONUNIFORM; } } return VC1_OK; } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_huffman.cpp000066400000000000000000000252221443134507600317070ustar00rootroot00000000000000// Copyright (c) 2004-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_huffman.h" #include using namespace UMC; #define VLC_FORBIDDEN 0xf0f1 static uint32_t bit_mask[33] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x01f, 0x03f, 0x07f, 0x0ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x01fff, 0x03fff, 0x07fff, 0x0ffff, 0x01ffff, 0x03ffff, 0x07ffff, 0x0fffff, 0x01fffff, 0x03fffff, 0x07fffff, 0x0ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; #define GetNBits(current_data, bit_ptr, nbits, pData,type) \ { \ uint32_t x; \ \ bit_ptr -= nbits; \ \ if (bit_ptr < 0) \ { \ bit_ptr += 32; \ \ x = (current_data)[1] >> (bit_ptr); \ x >>= 1; \ x += (current_data)[0] << (31 - bit_ptr); \ (current_data)++; \ } \ else \ { \ x = (current_data)[0] >> (bit_ptr + 1); \ } \ \ pData = (type)(x & bit_mask[nbits]); \ } #define UngetNBits(current_data, bit_ptr, nbits) \ { \ bit_ptr += nbits; \ if (bit_ptr > 31) \ { \ bit_ptr -= 32; \ (current_data)--; \ } \ } static int32_t HuffmanTableSize(int32_t rl, const int32_t *pSrcTable) { typedef struct { int32_t code; int32_t Nc; } CodeWord; CodeWord *Code; int32_t nWord, SubTblLength, CodeLength, n, i, j, s, index, dstTableSize; const int32_t *src; /* find number of code words */ src = pSrcTable + pSrcTable[1] + 2; for (nWord = 0;;) { if ((n = *src++) < 0) break; src += n*(rl == 0 ? 2 : 3); nWord += n; } /* allocate temporary buffer */ Code = (CodeWord *)malloc(nWord * sizeof(CodeWord)); if (((CodeWord *)0) == Code) return 0; /* find destination table size */ src = pSrcTable + pSrcTable[1] + 2; nWord = 0; dstTableSize = (1 << pSrcTable[2]) + 1; for (CodeLength = 1; ; CodeLength++) { /* process all code which length is CodeLength */ if ((n = *src++) < 0) break; for (i = 0; i < n; i++) { SubTblLength = 0; for (s = 0; s < pSrcTable[1]; s++) {/* for all subtables */ SubTblLength += pSrcTable[2 + s]; if (CodeLength <= SubTblLength) break; /* find already processed code with the same prefix */ index = *src >> (CodeLength - SubTblLength); for (j = 0; j> (Code[j].Nc - SubTblLength)) == index) break; } if (j >= nWord) { /* there is not code words with the same prefix, create new subtable */ dstTableSize += (1 << pSrcTable[2 + s + 1]) + 1; } } /* put word in array */ Code[nWord].code = *src++; Code[nWord++].Nc = CodeLength; src += rl == 0 ? 1 : 2; } } free(Code); return dstTableSize; } static int HuffmanInitAlloc(int32_t rl, const int32_t* pSrcTable, int32_t** ppDstSpec) { int32_t i, k, l, j, commLen = 0; int32_t nCodes, code, szblen, offset, shift, mask, value1, value2 = 0, size; int32_t *szBuff; int32_t *table; if (!pSrcTable || !ppDstSpec) return -1; size = HuffmanTableSize(rl, pSrcTable); if (0 == size) return -1; szblen = pSrcTable[1]; offset = (1 << pSrcTable[2]) + 1; szBuff = (int32_t*)&pSrcTable[2]; table = (int32_t*)malloc(size * sizeof(int32_t)); if (0 == table) return -1; *ppDstSpec = table; for (i = 0; i < size; i++) { table[i] = (VLC_FORBIDDEN << 8) | 1; } table[0] = pSrcTable[2]; for (i = 1, k = 2 + pSrcTable[1]; pSrcTable[k] >= 0; i++) { nCodes = pSrcTable[k++] * (rl == 0 ? 2 : 3); for (nCodes += k; k < nCodes; k += (rl == 0 ? 2 : 3)) { commLen = 0; table = *ppDstSpec; for (l = 0; l < szblen; l++) { commLen += szBuff[l]; if (commLen >= i) { mask = ((1 << (i - commLen + szBuff[l])) - 1); shift = (commLen - i); code = (pSrcTable[k] & mask) << shift; value1 = pSrcTable[k + 1]; if (rl == 1) value2 = pSrcTable[k + 2]; for (j = 0; j < (1 << (commLen - i)); j++) if (rl == 0) table[code + j + 1] = (value1 << 8) | (commLen - i); else table[code + j + 1] = ((int16_t)value2 << 16) | ((uint8_t)value1 << 8) | (commLen - i); break; } else { mask = (1 << szBuff[l]) - 1; shift = (i - commLen); code = (pSrcTable[k] >> shift) & mask; if (table[code + 1] != (long)((VLC_FORBIDDEN << 8) | 1)) { if (((table[code + 1] & 0xff) == 0x80) && (rl == 1 || (table[code + 1] & 0xff00))) { table = (int32_t*)*ppDstSpec + (table[code + 1] >> 8); } } else { table[code + 1] = (offset << 8) | 0x80; table = (*ppDstSpec) + offset; table[0] = szBuff[l + 1]; offset += (1 << szBuff[l + 1]) + 1; } } } } } return 0; } int DecodeHuffmanOne(uint32_t** pBitStream, int* pOffset, int32_t* pDst, const int32_t* pDecodeTable) { uint32_t table_bits, code_len; uint32_t pos; int32_t val; if (!pBitStream || !pOffset || !pDecodeTable || !*pBitStream || !pDst) return -1; table_bits = *pDecodeTable; GetNBits((*pBitStream), (*pOffset), table_bits, pos, uint32_t) val = pDecodeTable[pos + 1]; code_len = val & 0xff; val = val >> 8; while (code_len & 0x80) { table_bits = pDecodeTable[val]; GetNBits((*pBitStream), (*pOffset), table_bits, pos, uint32_t) val = pDecodeTable[pos + val + 1]; code_len = val & 0xff; val = val >> 8; } if (val == VLC_FORBIDDEN) { *pDst = val; return -1; } UngetNBits(*pBitStream, *pOffset, code_len) *pDst = val; return 0; } int DecodeHuffmanPair(uint32_t **pBitStream, int32_t *pBitOffset, const int32_t *pTable, int8_t *pFirst, int16_t *pSecond) { int32_t val; uint32_t table_bits, pos; uint8_t code_len; uint32_t *tmp_pbs = 0; int32_t tmp_offs = 0; /* check error(s) */ if (!pBitStream || !pBitOffset || !pTable || !pFirst || !pSecond || !*pBitStream) return -1; tmp_pbs = *pBitStream; tmp_offs = *pBitOffset; table_bits = *pTable; GetNBits((*pBitStream), (*pBitOffset), table_bits, pos, uint32_t); val = pTable[pos + 1]; code_len = (uint8_t)(val); while (code_len & 0x80) { val = val >> 8; table_bits = pTable[val]; GetNBits((*pBitStream), (*pBitOffset), table_bits, pos, uint32_t); val = pTable[pos + val + 1]; code_len = (uint8_t)(val); } UngetNBits((*pBitStream), (*pBitOffset), code_len); if ((val >> 8) == VLC_FORBIDDEN) { *pBitStream = tmp_pbs; *pBitOffset = tmp_offs; return -1; } *pFirst = (int8_t)((val >> 8) & 0xff); *pSecond = (int16_t)((val >> 16) & 0xffff); return 0; } int HuffmanTableInitAlloc(const int32_t* pSrcTable, int32_t** ppDstSpec) { return HuffmanInitAlloc(0, pSrcTable, ppDstSpec); } int HuffmanRunLevelTableInitAlloc(const int32_t* pSrcTable, int32_t** ppDstSpec) { return HuffmanInitAlloc(1, pSrcTable, ppDstSpec); } void HuffmanTableFree(int32_t *pDecodeTable) { free((void*)pDecodeTable); } #endif // #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src/umc_vc1_video_decoder.cpp000066400000000000000000001476221443134507600330670ustar00rootroot00000000000000// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_video_decoder.h" #include "umc_media_data_ex.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_task_store.h" #include "umc_memory_allocator.h" #include "umc_vc1_common.h" #include "umc_vc1_common_tables.h" #include "umc_vc1_common_tables_adv.h" #include "umc_vc1_common_defs.h" #include "umc_vc1_dec_exception.h" #include "umc_va_base.h" #include "mfx_trace.h" #include #include "umc_vc1_huffman.h" using namespace UMC; using namespace UMC::VC1Common; using namespace UMC::VC1Exceptions; VC1VideoDecoder::VC1VideoDecoder():m_pMemoryAllocator(0), m_pContext(NULL), m_pInitContext(), m_iThreadDecoderNum(0), m_dataBuffer(NULL), m_frameData(NULL), m_stCodes(NULL), m_decoderInitFlag(0), m_decoderFlags(0), m_iMemContextID((MemID)(-1)), m_iHeapID((MemID)(-1)), m_iFrameBufferID((MemID)(-1)), m_pts(0), m_pts_dif(0), m_iMaxFramesInProcessing(0), m_lFrameCount(0), m_bLastFrameNeedDisplay(false), m_pStore(NULL), m_va(0), m_pHeap(NULL), m_bIsReorder(true), m_pCurrentIn(NULL), m_pCurrentOut(NULL), m_bIsNeedToFlush(false), m_AllocBuffer(0), m_pExtFrameAllocator(0), m_SurfaceNum(0), m_bIsExternalFR(false), m_pDescrToDisplay(0), m_frameOrder(0), m_RMIndexToFree(-1), m_CurrIndexToFree(-1) { } VC1VideoDecoder::~VC1VideoDecoder() { Close(); } Status VC1VideoDecoder::Init(BaseCodecParams *pInit) { MediaData *data; Status umcRes = UMC_OK; uint32_t readSize = 0; Close(); VideoDecoderParams *init = DynamicCast(pInit); if(!init) return UMC_ERR_INIT; m_decoderFlags = init->lFlags; data = init->m_pData; m_ClipInfo = init->info; if (m_ClipInfo.framerate != 0.0) m_bIsExternalFR = true; //almost all applications need reorder as default if ((m_decoderFlags & FLAG_VDEC_REORDER) == FLAG_VDEC_REORDER) m_bIsReorder = true; else m_bIsReorder = false; uint32_t mbWidth = init->info.clip_info.width/VC1_PIXEL_IN_LUMA; uint32_t mbHeight= init->info.clip_info.height/VC1_PIXEL_IN_LUMA; m_AllocBuffer = 2*(mbHeight*VC1_PIXEL_IN_LUMA)*(mbWidth*VC1_PIXEL_IN_LUMA); m_SurfaceNum = init->m_SuggestedOutputSize; m_pMemoryAllocator = init->lpMemoryAllocator; // get allowed thread numbers int32_t nAllowedThreadNumber = init->numThreads; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugAlloc); #endif m_iThreadDecoderNum = (0 == nAllowedThreadNumber) ? (std::thread::hardware_concurrency()) : (nAllowedThreadNumber); m_iMaxFramesInProcessing = m_iThreadDecoderNum + NumBufferedFrames; if (UMC_OK != ContextAllocation(mbWidth, mbHeight)) return UMC_ERR_INIT; //Heap allocation { uint32_t heapSize = CalculateHeapSize(); // Need to replace with MFX allocator if (m_pMemoryAllocator->Alloc(&m_iHeapID, heapSize,//100000, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return UMC_ERR_ALLOC; new(m_pHeap) VC1TSHeap((uint8_t*)(m_pMemoryAllocator->Lock(m_iHeapID)),heapSize); } if (UMC_OK != CreateFrameBuffer(m_AllocBuffer)) return UMC_ERR_ALLOC; m_pContext->m_bIntensityCompensation = 0; // profile definition if ((VC1_VIDEO_RCV == init->info.stream_subtype)|| (WMV3_VIDEO == init->info.stream_subtype)) m_pContext->m_seqLayerHeader.PROFILE = VC1_PROFILE_MAIN; else if ((VC1_VIDEO_VC1 == init->info.stream_subtype)|| (WVC1_VIDEO == init->info.stream_subtype)) m_pContext->m_seqLayerHeader.PROFILE = VC1_PROFILE_ADVANCED; else { m_pContext->m_seqLayerHeader.PROFILE = VC1_PROFILE_UNKNOWN; } m_pContext->m_Offsets = m_frameData->GetExData()->offsets; m_pContext->m_values = m_frameData->GetExData()->values; if(data!=NULL && (int32_t*)data->GetDataPointer() != NULL) // seq header is presents { m_pCurrentIn = data; if(m_pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_UNKNOWN) { //assert(0); if((uint32_t)((m_pCurrentIn)&&0xFF) == 0xC5) m_pContext->m_seqLayerHeader.PROFILE = VC1_PROFILE_MAIN; else m_pContext->m_seqLayerHeader.PROFILE = VC1_PROFILE_ADVANCED; } //need to create buffer for swap data if (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE) { umcRes = GetStartCodes((uint8_t*)data->GetDataPointer(), (uint32_t)data->GetDataSize(), m_frameData, &readSize); // parse and copy to self buffer SwapData((uint8_t*)m_frameData->GetDataPointer(), (uint32_t)m_frameData->GetDataSize()); m_pContext->m_pBufferStart = (uint8_t*)m_frameData->GetDataPointer(); umcRes = StartCodesProcessing(m_pContext->m_pBufferStart, m_pContext->m_Offsets, m_pContext->m_values, true); if (UMC_ERR_SYNC != umcRes) umcRes = UMC_OK; m_pCurrentIn->MoveDataPointer(readSize); } else { // simple copy data MFX_INTERNAL_CPY(m_dataBuffer, (uint8_t*)data->GetDataPointer(), (uint32_t)data->GetDataSize()); SwapData((uint8_t*)m_frameData->GetDataPointer(), (uint32_t)(uint32_t)data->GetDataSize()); m_pContext->m_FrameSize = (uint32_t)data->GetDataSize(); } m_pContext->m_bitstream.bitOffset = 31; if (VC1_PROFILE_ADVANCED != m_pContext->m_seqLayerHeader.PROFILE) { umcRes = InitSMProfile(); UMC_CHECK_STATUS(umcRes); readSize = (uint32_t)m_pCurrentIn->GetDataSize(); data->MoveDataPointer(readSize); } if(m_AllocBuffer == 0) { Close(); return UMC_ERR_SYNC; } GetFPS(m_pContext); GetPTS(data->GetTime()); m_decoderInitFlag = 1; } else { //NULL input data, no sequence header // aligned width and height m_pContext->m_seqLayerHeader.MAX_CODED_HEIGHT = init->info.clip_info.height/2 - 1; m_pContext->m_seqLayerHeader.MAX_CODED_WIDTH = init->info.clip_info.width/2 - 1; m_pContext->m_seqLayerHeader.widthMB = (uint16_t)(init->info.clip_info.width/VC1_PIXEL_IN_LUMA); m_pContext->m_seqLayerHeader.heightMB = (uint16_t)(init->info.clip_info.height/VC1_PIXEL_IN_LUMA); m_pContext->m_seqLayerHeader.MaxWidthMB = m_pContext->m_seqLayerHeader.widthMB; m_pContext->m_seqLayerHeader.MaxHeightMB = m_pContext->m_seqLayerHeader.heightMB; if(init->info.interlace_type != UMC::PROGRESSIVE) m_pContext->m_seqLayerHeader.INTERLACE = 1; if(m_AllocBuffer == 0) { Close(); return UMC_ERR_SYNC; } } if (!InitVAEnvironment()) return UMC_ERR_ALLOC; if (!InitAlloc(m_pContext,2*m_iMaxFramesInProcessing)) return UMC_ERR_ALLOC; m_pInitContext = *m_pContext; //internal decoding flags m_lFrameCount = 0; //internal exception initialization vc1_except_profiler::GetEnvDescript(smart_recon, mbGroupLevel); return umcRes; } Status VC1VideoDecoder::InitSMProfile() { int32_t seq_size = 0; uint8_t* seqStart = NULL; uint32_t height; uint32_t width; VC1Status sts = VC1_OK; SwapData(m_pContext->m_pBufferStart, m_pContext->m_FrameSize); seqStart = m_pContext->m_pBufferStart + 4; seq_size = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart); assert(seq_size > 0); assert(seq_size < 100); seqStart = m_pContext->m_pBufferStart + 8 + seq_size; height = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart); seqStart+=4; width = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart); m_pContext->m_seqLayerHeader.widthMB = (uint16_t)((width+15)/VC1_PIXEL_IN_LUMA); m_pContext->m_seqLayerHeader.heightMB = (uint16_t)((height+15)/VC1_PIXEL_IN_LUMA); m_pContext->m_seqLayerHeader.CODED_HEIGHT = m_pContext->m_seqLayerHeader.MAX_CODED_HEIGHT = height/2 - 1; m_pContext->m_seqLayerHeader.CODED_WIDTH = m_pContext->m_seqLayerHeader.MAX_CODED_WIDTH = width/2 - 1; m_pContext->m_seqLayerHeader.MaxWidthMB = (uint16_t)((width+15)/VC1_PIXEL_IN_LUMA); m_pContext->m_seqLayerHeader.MaxHeightMB = (uint16_t)((height+15)/VC1_PIXEL_IN_LUMA); SwapData(m_pContext->m_pBufferStart, m_pContext->m_FrameSize); m_pContext->m_bitstream.pBitstream = (uint32_t*)m_pContext->m_pBufferStart + 2; // skip header m_pContext->m_bitstream.bitOffset = 31; sts = SequenceLayer(m_pContext); VC1_TO_UMC_CHECK_STS(sts); return UMC_OK; } Status VC1VideoDecoder::ContextAllocation(uint32_t mbWidth,uint32_t mbHeight) { // need to extend for threading case if (!m_pContext) { uint8_t* ptr = NULL; ptr += mfx::align2_value(sizeof(VC1Context)); ptr += mfx::align2_value(sizeof(VC1VLCTables)); ptr += mfx::align2_value(sizeof(int16_t)*mbHeight*mbWidth*2*2); ptr += mfx::align2_value(mbHeight*mbWidth); ptr += mfx::align2_value(sizeof(VC1TSHeap)); if(m_stCodes == NULL) { ptr += mfx::align2_value(START_CODE_NUMBER*2*sizeof(uint32_t)+sizeof(MediaDataEx::_MediaDataEx)); } // Need to replace with MFX allocator if (m_pMemoryAllocator->Alloc(&m_iMemContextID, (size_t)ptr, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return UMC_ERR_ALLOC; m_pContext = (VC1Context*)(m_pMemoryAllocator->Lock(m_iMemContextID)); memset(m_pContext,0,(size_t)ptr); ptr = (uint8_t*)m_pContext; ptr += mfx::align2_value(sizeof(VC1Context)); m_pContext->m_vlcTbl = (VC1VLCTables*)ptr; ptr += mfx::align2_value(sizeof(VC1VLCTables)); ptr += mfx::align2_value(sizeof(int16_t)*mbHeight*mbWidth*2*2); ptr += mfx::align2_value(mbHeight*mbWidth); m_pHeap = (VC1TSHeap*)ptr; if(m_stCodes == NULL) { ptr += mfx::align2_value(sizeof(VC1TSHeap)); m_stCodes = (MediaDataEx::_MediaDataEx *)(ptr); memset(reinterpret_cast(m_stCodes), 0, (START_CODE_NUMBER*2*sizeof(int32_t)+sizeof(MediaDataEx::_MediaDataEx))); m_stCodes->count = 0; m_stCodes->index = 0; m_stCodes->bstrm_pos = 0; m_stCodes->offsets = (uint32_t*)((uint8_t*)m_stCodes + sizeof(MediaDataEx::_MediaDataEx)); m_stCodes->values = (uint32_t*)((uint8_t*)m_stCodes->offsets + START_CODE_NUMBER*sizeof( uint32_t)); } } return UMC_OK; } Status VC1VideoDecoder::StartCodesProcessing(uint8_t* pBStream, uint32_t* pOffsets, uint32_t* pValues, bool IsDataPrepare) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VC1VideoDecoder::StartCodesProcessing"); Status umcRes = UMC_OK; uint32_t UnitSize; VC1Status sts = VC1_OK; while ((*pValues != 0x0D010000)&& (*pValues)) { m_pContext->m_bitstream.pBitstream = (uint32_t*)((uint8_t*)m_frameData->GetDataPointer() + *pOffsets) + 1;//skip start code if(*(pOffsets + 1)) UnitSize = *(pOffsets + 1) - *pOffsets; else UnitSize = (uint32_t)(m_pCurrentIn->GetBufferSize() - *pOffsets); if (!IsDataPrepare) { // copy data to self buffer MFX_INTERNAL_CPY(m_dataBuffer, pBStream + *pOffsets, UnitSize); SwapData(m_dataBuffer, mfx::align2_value(UnitSize)); m_pContext->m_bitstream.pBitstream = (uint32_t*)m_dataBuffer + 1; //skip start code } m_pContext->m_bitstream.bitOffset = 31; switch (*pValues) { case 0x0F010000: { VC1Context context; size_t alignment; umcRes = UMC_ERR_NOT_ENOUGH_DATA; context = *m_pContext; sts = SequenceLayer(&context); VC1_TO_UMC_CHECK_STS(sts); GetFPS(&context); alignment = (context.m_seqLayerHeader.INTERLACE)?32:16; if (mfx::align2_value(2*(context.m_seqLayerHeader.MAX_CODED_WIDTH+1)) > mfx::align2_value(2*(m_pInitContext.m_seqLayerHeader.MAX_CODED_WIDTH+1))) return UMC_ERR_INVALID_PARAMS; if (context.m_seqLayerHeader.INTERLACE != m_pInitContext.m_seqLayerHeader.INTERLACE ) return UMC_ERR_INVALID_PARAMS; if (mfx::align2_value(2*(context.m_seqLayerHeader.MAX_CODED_HEIGHT+1),alignment) > mfx::align2_value(2*(m_pInitContext.m_seqLayerHeader.MAX_CODED_HEIGHT+1),alignment)) return UMC_ERR_INVALID_PARAMS; // start codes are applicable for advanced profile only if (context.m_seqLayerHeader.PROFILE != VC1_PROFILE_ADVANCED) return UMC_ERR_INVALID_PARAMS; else if (!m_decoderInitFlag) { *m_pContext = context; m_decoderInitFlag = true; } else { *m_pContext = context; if (mfx::align2_value(2*(context.m_seqLayerHeader.MAX_CODED_WIDTH+1)) != mfx::align2_value(2*(m_pInitContext.m_seqLayerHeader.MAX_CODED_WIDTH+1)) || mfx::align2_value(2*(context.m_seqLayerHeader.MAX_CODED_HEIGHT+1),alignment) != mfx::align2_value(2*(m_pInitContext.m_seqLayerHeader.MAX_CODED_HEIGHT+1),alignment)) { m_pStore->SetNewSHParams(m_pContext); umcRes = UMC_NTF_NEW_RESOLUTION; } } VC1_TO_UMC_CHECK_STS(sts); } break; case 0x0A010000: umcRes = UMC_ERR_NOT_ENOUGH_DATA; break; case 0x0E010000: umcRes = EntryPointLayer(m_pContext); if (UMC_OK != umcRes) return UMC_ERR_INVALID_PARAMS; umcRes = UMC_ERR_NOT_ENOUGH_DATA; break; case 0x0C010000: case 0x1B010000: case 0x1C010000: case 0x1D010000: case 0x1E010000: case 0x1F010000: umcRes = UMC_ERR_NOT_ENOUGH_DATA; break; default: umcRes = UMC_ERR_SYNC; break; } pValues++; pOffsets++; } if (((0x0D010000) == *pValues) && m_decoderInitFlag)// we have frame to decode { UnitSize = (uint32_t)(m_pCurrentIn->GetBufferSize() - *pOffsets); m_pContext->m_pBufferStart = ((uint8_t*)m_frameData->GetDataPointer() + *pOffsets); //skip start code if (!IsDataPrepare) { // copy frame data to self buffer MFX_INTERNAL_CPY(m_dataBuffer, (uint8_t*)m_frameData->GetDataPointer() + *pOffsets, UnitSize); //use own buffer SwapData(m_dataBuffer, mfx::align2_value(UnitSize)); m_pContext->m_pBufferStart = m_dataBuffer; //skip start code } else ++m_lFrameCount; try //work with queue of frame descriptors and process every frame { umcRes = VC1DecodeFrame(m_pCurrentIn,m_pCurrentOut); } catch (vc1_exception ex) { exception_type e_type = ex.get_exception_type(); if ((e_type == internal_pipeline_error)|| (e_type == mem_allocation_er)) return UMC_ERR_FAILED; } } else if (m_decoderInitFlag && (!m_bIsNeedToFlush)) { m_pCurrentIn->MoveDataPointer(m_pContext->m_FrameSize); } else umcRes = UMC_ERR_NOT_ENOUGH_DATA; return umcRes; } Status VC1VideoDecoder::SMProfilesProcessing(uint8_t* pBitstream) { Status umcRes = UMC_OK; m_pContext->m_bitstream.pBitstream = (uint32_t*)pBitstream; m_pContext->m_bitstream.bitOffset = 31; if ((*m_pContext->m_bitstream.pBitstream&0xFF) == 0xC5)// sequence header, exit after process. { VideoDecoderParams params; params.m_pData = m_pCurrentIn; params.lFlags = m_decoderFlags; params.info.stream_type = m_ClipInfo.stream_type; params.info.stream_subtype = m_ClipInfo.stream_subtype; params.numThreads = m_iThreadDecoderNum; params.info.clip_info.width = m_ClipInfo.clip_info.width; params.info.clip_info.height = m_ClipInfo.clip_info.height; params.m_SuggestedOutputSize = m_SurfaceNum; params.lpMemoryAllocator = m_pMemoryAllocator; bool deblocking = (int32_t)m_pStore->IsDeblockingOn(); Close(); umcRes = Init(¶ms); UMC_CHECK_STATUS(umcRes); //need to add code for restoring skip mode! if(!deblocking) { int32_t speed_shift = 0x22; m_pStore->ChangeVideoDecodingSpeed(speed_shift); } return UMC_ERR_NOT_ENOUGH_DATA; } m_pContext->m_pBufferStart = (uint8_t*)pBitstream; ++m_lFrameCount; try //work with queue of frame descriptors and process every frame { umcRes = VC1DecodeFrame(m_pCurrentIn,m_pCurrentOut); } catch (vc1_exception ex) { exception_type e_type = ex.get_exception_type(); if (e_type == internal_pipeline_error) return UMC_ERR_FAILED; } return umcRes; } Status VC1VideoDecoder::ParseStreamFromMediaData() { Status umcRes = UMC_OK; // we have no start codes. Let find them if (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE) { uint32_t readSize; m_frameData->GetExData()->count = 0; memset(m_frameData->GetExData()->offsets, 0,START_CODE_NUMBER*sizeof(int32_t)); memset(m_frameData->GetExData()->values, 0,START_CODE_NUMBER*sizeof(int32_t)); umcRes = GetStartCodes((uint8_t*)m_pCurrentIn->GetDataPointer(), (uint32_t)m_pCurrentIn->GetDataSize(), m_frameData, &readSize); // parse and copy to self buffer SwapData((uint8_t*)m_frameData->GetDataPointer(), (uint32_t)m_frameData->GetDataSize()); m_pContext->m_FrameSize = readSize; umcRes = StartCodesProcessing((uint8_t*)m_frameData->GetDataPointer(), m_frameData->GetExData()->offsets, m_frameData->GetExData()->values, true); } else //Simple/Main profiles pack without Start Codes { // copy data to self buffer MFX_INTERNAL_CPY(m_dataBuffer, (uint8_t*)m_pCurrentIn->GetDataPointer(), (uint32_t)m_pCurrentIn->GetDataSize()); m_pContext->m_FrameSize = (uint32_t)m_pCurrentIn->GetDataSize(); m_frameData->SetDataSize(m_pContext->m_FrameSize); SwapData((uint8_t*)m_frameData->GetDataPointer(), (uint32_t)m_frameData->GetDataSize()); umcRes = SMProfilesProcessing(m_dataBuffer); } return umcRes; } Status VC1VideoDecoder::ParseStreamFromMediaDataEx(MediaDataEx *in_ex) { Status umcRes = UMC_OK; if ((in_ex->GetExData())&& (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE))// we have already start codes from splitter. Advance profile only { m_pContext->m_Offsets = in_ex->GetExData()->offsets; m_pContext->m_values = in_ex->GetExData()->values; MFX_INTERNAL_CPY(m_dataBuffer, (uint8_t*)m_pCurrentIn->GetDataPointer(), (uint32_t)m_pCurrentIn->GetDataSize()); m_pContext->m_FrameSize = (uint32_t)m_pCurrentIn->GetDataSize(); m_frameData->SetDataSize(m_pContext->m_FrameSize); SwapData((uint8_t*)m_frameData->GetDataPointer(), m_pContext->m_FrameSize); umcRes = StartCodesProcessing((uint8_t*)m_frameData->GetDataPointer(), m_pContext->m_Offsets, m_pContext->m_values, true); } else { // we have no start codes. Let find them if (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE) { uint32_t readSize; m_frameData->GetExData()->count = 0; memset(m_frameData->GetExData()->offsets, 0,START_CODE_NUMBER*sizeof(int32_t)); memset(m_frameData->GetExData()->values, 0,START_CODE_NUMBER*sizeof(int32_t)); umcRes = GetStartCodes((uint8_t*)m_pCurrentIn->GetDataPointer(), (uint32_t)m_pCurrentIn->GetDataSize(), m_frameData, &readSize); // parse and copy to self buffer m_pContext->m_FrameSize = readSize; SwapData((uint8_t*)m_frameData->GetDataPointer(), (uint32_t)m_frameData->GetDataSize()); umcRes = StartCodesProcessing((uint8_t*)m_frameData->GetDataPointer(), m_pContext->m_Offsets, m_pContext->m_values, true); } else //Simple/Main profiles pack without Start Codes { // copy data to self buffer MFX_INTERNAL_CPY(m_dataBuffer, (uint8_t*)m_pCurrentIn->GetDataPointer(), (uint32_t)m_pCurrentIn->GetDataSize()); m_pContext->m_FrameSize = (uint32_t)m_pCurrentIn->GetDataSize(); m_frameData->SetDataSize(m_pContext->m_FrameSize); SwapData((uint8_t*)m_frameData->GetDataPointer(), m_pContext->m_FrameSize); umcRes = SMProfilesProcessing(m_dataBuffer); } } return umcRes; } Status VC1VideoDecoder::ParseInputBitstream() { Status umcRes = UMC_OK; MediaDataEx *in_ex = DynamicCast(m_pCurrentIn); if (in_ex) umcRes = ParseStreamFromMediaDataEx(in_ex); else { umcRes = ParseStreamFromMediaData(); } return umcRes; } Status VC1VideoDecoder::GetFrame(MediaData* in, MediaData* out) { Status umcRes = UMC_OK; VideoDecoderParams params; VideoData *out_data = DynamicCast(out); if (NULL == out_data) { return UMC_ERR_NULL_PTR; } if(in!=NULL && (uint32_t)in->GetDataSize() == 0) return UMC_ERR_NOT_ENOUGH_DATA; if(!m_pContext) return UMC_ERR_NOT_INITIALIZED; m_pCurrentIn = in; if (out_data) { m_pCurrentOut = out_data; m_pCurrentOut->SetFrameType(NONE_PICTURE); } if (in == NULL) { // in should be always present return UMC_ERR_FAILED; } else { if (m_AllocBuffer < in->GetDataSize()) return UMC_ERR_NOT_ENOUGH_BUFFER; umcRes = ParseInputBitstream(); if (UMC_OK == umcRes || (UMC_ERR_NOT_ENOUGH_DATA == umcRes && m_pCurrentOut->GetFrameType() != NONE_PICTURE)) { if (out_data) { if(-1.0 == in->GetTime()) { out_data->SetTime(m_pts); GetPTS(in->GetTime()); } else { out_data->SetTime(in->GetTime()); m_pts = in->GetTime(); } } } } return umcRes; } Status VC1VideoDecoder::Close(void) { Status umcRes = UMC_OK; m_AllocBuffer = 0; // reset all values umcRes = Reset(); if (m_pStore) { delete m_pStore; m_pStore = 0; } FreeAlloc(m_pContext); if(m_pMemoryAllocator) { if (static_cast(m_iMemContextID) != -1) { m_pMemoryAllocator->Unlock(m_iMemContextID); m_pMemoryAllocator->Free(m_iMemContextID); m_iMemContextID = (MemID)-1; } if (static_cast(m_iHeapID) != -1) { m_pMemoryAllocator->Unlock(m_iHeapID); m_pMemoryAllocator->Free(m_iHeapID); m_iHeapID = (MemID)-1; } if (static_cast(m_iFrameBufferID) != -1) { m_pMemoryAllocator->Unlock(m_iFrameBufferID); m_pMemoryAllocator->Free(m_iFrameBufferID); m_iFrameBufferID = (MemID)-1; } } m_pContext = NULL; m_dataBuffer = NULL; m_stCodes = NULL; m_frameData = NULL; m_pHeap = NULL; memset(&m_pInitContext,0,sizeof(VC1Context)); m_pMemoryAllocator = 0; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).Release(); #endif m_iThreadDecoderNum = 0; m_decoderInitFlag = 0; m_decoderFlags = 0; return umcRes; } Status VC1VideoDecoder::Reset(void) { Status umcRes = UMC_OK; if(m_pContext==NULL) return UMC_ERR_NOT_INITIALIZED; m_bLastFrameNeedDisplay = false; m_lFrameCount = 0; m_pContext->m_frmBuff.m_iDisplayIndex = -1; m_pContext->m_frmBuff.m_iCurrIndex = -1; m_pContext->m_frmBuff.m_iPrevIndex = -1; m_pContext->m_frmBuff.m_iNextIndex = -1; m_pContext->DeblockInfo.HeightMB = 0; m_pContext->DeblockInfo.start_pos = 0; m_pContext->DeblockInfo.is_last_deblock = 1; m_pts = 0; m_bIsExternalFR = false; return umcRes; } void VC1VideoDecoder::GetPTS(double in_pts) { if(in_pts == -1.0 && m_pts == -1.0) m_pts = 0; else if (in_pts == -1.0) { if(m_ClipInfo.framerate != 0.0) { m_pts = m_pts + 1.0/m_ClipInfo.framerate - m_pts_dif; } else { m_pts = m_pts + 1.0/24.0 - m_pts_dif; } } else { if(m_pts_dif == 0) { if(m_ClipInfo.framerate) m_pts = m_pts + 1.0/m_ClipInfo.framerate - m_pts_dif; else m_pts = m_pts + 1.0/24.0 - m_pts_dif; m_pts_dif = in_pts - m_pts; } else { if(m_ClipInfo.framerate) m_pts = m_pts + 1.0/m_ClipInfo.framerate - m_pts_dif; else m_pts = m_pts + 1.0/24.0 - m_pts_dif; } } } bool VC1VideoDecoder::GetFPS(VC1Context* pContext) { // no need to modify frame rate if it set by application if (m_bIsExternalFR) return false; double prevFPS = m_ClipInfo.framerate; if((m_ClipInfo.stream_subtype == VC1_VIDEO_VC1)||(m_ClipInfo.stream_type == static_cast(WVC1_VIDEO))) { m_ClipInfo.bitrate = pContext->m_seqLayerHeader.BITRTQ_POSTPROC; m_ClipInfo.framerate = pContext->m_seqLayerHeader.FRMRTQ_POSTPROC; //for advanced profile if ((m_ClipInfo.framerate == 0.0) && (m_ClipInfo.bitrate == 31)) { //Post processing indicators for Frame Rate and Bit Rate are undefined m_ClipInfo.bitrate = 0; } else if ((m_ClipInfo.framerate == 0.0) && (m_ClipInfo.bitrate == 30)) { m_ClipInfo.framerate = 2.0; m_ClipInfo.bitrate = 1952; } else if ((m_ClipInfo.framerate == 1.0) && (m_ClipInfo.bitrate == 31)) { m_ClipInfo.framerate = 6.0; m_ClipInfo.bitrate = 2016; } else { if (m_ClipInfo.framerate == 7.0) m_ClipInfo.framerate = 30.0; else m_ClipInfo.framerate = (2.0 + m_ClipInfo.framerate*4); if (m_ClipInfo.bitrate == 31) m_ClipInfo.bitrate = 2016; else m_ClipInfo.bitrate = (32 + m_ClipInfo.bitrate * 64); } } else { m_ClipInfo.bitrate = pContext->m_seqLayerHeader.BITRTQ_POSTPROC; m_ClipInfo.framerate = pContext->m_seqLayerHeader.FRMRTQ_POSTPROC; if (7.0 == m_ClipInfo.framerate) m_ClipInfo.framerate = 30.0; else if (m_ClipInfo.framerate != 0.0) m_ClipInfo.framerate = (2.0 + m_ClipInfo.framerate*4); else m_ClipInfo.framerate = 24.0; } if(m_ClipInfo.framerate < 0.0) m_ClipInfo.framerate = 24.0; m_ClipInfo.framerate = MapFrameRateIntoUMC(pContext->m_seqLayerHeader.FRAMERATENR, pContext->m_seqLayerHeader.FRAMERATEDR, pContext->m_seqLayerHeader.FRMRTQ_POSTPROC); return (prevFPS != m_ClipInfo.framerate); } Status VC1VideoDecoder::CreateFrameBuffer(uint32_t bufferSize) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VC1VideoDecoder::CreateFrameBuffer"); if(m_dataBuffer == NULL) { if (m_pMemoryAllocator->Alloc(&m_iFrameBufferID, bufferSize, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return UMC_ERR_ALLOC; m_dataBuffer = (uint8_t*)(m_pMemoryAllocator->Lock(m_iFrameBufferID)); if(m_dataBuffer==NULL) { Close(); return UMC_ERR_ALLOC; } } memset(m_dataBuffer,0,bufferSize); m_pContext->m_pBufferStart = (uint8_t*)m_dataBuffer; m_pContext->m_bitstream.pBitstream = (uint32_t*)(m_pContext->m_pBufferStart); if(m_frameData == NULL) { m_pHeap->s_new(&m_frameData); } m_frameData->SetBufferPointer(m_dataBuffer, bufferSize); m_frameData->SetDataSize(bufferSize); m_frameData->SetExData(m_stCodes); return UMC_OK; } Status VC1VideoDecoder::GetStartCodes (uint8_t* pDataPointer, uint32_t DataSize, MediaDataEx* out, uint32_t* readSize) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "VC1VideoDecoder::GetStartCodes"); uint8_t* readPos = pDataPointer; uint32_t readBufSize = DataSize; uint8_t* readBuf = pDataPointer; uint8_t* currFramePos = (uint8_t*)out->GetBufferPointer(); uint32_t frameSize = 0; uint32_t frameBufSize = (uint32_t)out->GetBufferSize(); MediaDataEx::_MediaDataEx *stCodes = out->GetExData(); uint32_t size = 0; uint8_t* ptr = NULL; uint32_t readDataSize = 0; uint32_t zeroNum = 0; uint32_t a = 0x0000FF00 | (*readPos); uint32_t b = 0xFFFFFFFF; uint32_t FrameNum = 0; uint32_t shift = 0; bool isWriteSlice = false; memset(stCodes->offsets, 0,START_CODE_NUMBER*sizeof(int32_t)); memset(stCodes->values, 0,START_CODE_NUMBER*sizeof(int32_t)); while(readPos < (readBuf + readBufSize)) { if (stCodes->count > 512) return UMC_ERR_INVALID_STREAM; //find sequence of 0x000001 or 0x000003 while(!( b == 0x00000001 || b == 0x00000003 ) &&(++readPos < (readBuf + readBufSize))) { a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; } // check small bitstream if (stCodes->count == 0 && readBufSize < 4) { return UMC_ERR_NOT_ENOUGH_DATA; } //check end of read buffer if(readPos < (readBuf + readBufSize - 1)) { if(*readPos == 0x01) { if ((IS_VC1_DATA_SC(*(readPos + 1)) || IS_VC1_USER_DATA(*(readPos + 1))) && ( ((stCodes->count > 0 && IS_VC1_DATA_SC(stCodes->values[0] >> 24)) || isWriteSlice))) { isWriteSlice = false; readPos+=2; ptr = readPos - 5; if (stCodes->count) // if not first start code { //trim zero bytes while ( (*ptr==0) && (ptr > readBuf) ) ptr--; } //slice or field size size = (uint32_t)(ptr - readBuf - readDataSize+1); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); currFramePos = currFramePos + size; frameSize = frameSize + size; zeroNum = frameSize - 4*((frameSize)/4); if(zeroNum!=0) zeroNum = 4 - zeroNum; memset(currFramePos, 0, zeroNum); //set write parameters currFramePos = currFramePos + zeroNum; frameSize = frameSize + zeroNum; stCodes->offsets[stCodes->count] = frameSize; stCodes->values[stCodes->count] = ((*(readPos-1))<<24) + ((*(readPos-2))<<16) + ((*(readPos-3))<<8) + (*(readPos-4)); readDataSize = (uint32_t)(readPos - readBuf - 4); a = 0x00010b00 |(int32_t)(*readPos); b = a & 0x00FFFFFF; zeroNum = 0; stCodes->count++; } else { if (stCodes->count && IS_VC1_USER_DATA(stCodes->values[stCodes->count - 1] >> 24)) { if (IS_VC1_DATA_SC(*(readPos + 1))) isWriteSlice = true; else isWriteSlice = false; readPos+=2; a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; readDataSize = (uint32_t)(readPos - readBuf - 4); continue; } else if(FrameNum) { readPos+=2; ptr = readPos - 5; //trim zero bytes if (stCodes->count) // if not first start code { while ( (*ptr==0) && (ptr > readBuf) ) ptr--; } //slice or field size size = (uint32_t)(readPos - readBuf - readDataSize - 4); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); //currFramePos = currFramePos + size; frameSize = frameSize + size; stCodes->offsets[stCodes->count] = frameSize; stCodes->values[stCodes->count] = ((*(readPos-1))<<24) + ((*(readPos-2))<<16) + ((*(readPos-3))<<8) + (*(readPos-4)); stCodes->count++; out->SetDataSize(frameSize + shift); readDataSize = readDataSize + size; *readSize = readDataSize; return UMC_OK; } else { //beginning of frame readPos++; a = 0x00000100 |(int32_t)(*readPos); b = a & 0x00FFFFFF; //end of seguence if((((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3))) == 0x0A010000) { *readSize = 4; stCodes->offsets[stCodes->count] = (uint32_t)(0); stCodes->values[stCodes->count] = ((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3)); stCodes->count++; out->SetDataSize(4); MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, 4); return UMC_OK; } stCodes->offsets[stCodes->count] = (uint32_t)(0); stCodes->values[stCodes->count] = ((*(readPos))<<24) + ((*(readPos-1))<<16) + ((*(readPos-2))<<8) + (*(readPos-3)); stCodes->count++; zeroNum = 0; FrameNum++; } } } else //if(*readPos == 0x03) { //000003 if((*(readPos + 1) < 0x04)) { size = (uint32_t)(readPos - readBuf - readDataSize); if(frameSize + size > frameBufSize) return UMC_ERR_NOT_ENOUGH_BUFFER; MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); frameSize = frameSize + size; currFramePos = currFramePos + size; zeroNum = 0; readPos++; a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; readDataSize = readDataSize + size + 1; } else { readPos++; a = (a<<8)| (int32_t)(*readPos); b = a & 0x00FFFFFF; } } } else { // last portion pf user data if (!IS_VC1_USER_DATA(stCodes->values[stCodes->count - 1] >> 24) || isWriteSlice) { //end of stream size = (uint32_t)(readPos- readBuf - readDataSize); if(frameSize + size > frameBufSize) { return UMC_ERR_NOT_ENOUGH_BUFFER; } MFX_INTERNAL_CPY(currFramePos, readBuf + readDataSize, size); } else { stCodes->values[stCodes->count - 1] = 0; stCodes->offsets[stCodes->count - 1] = 0; } out->SetDataSize(frameSize + size + shift); readDataSize = readDataSize + size; *readSize = readDataSize; return UMC_OK; } } return UMC_OK; } void VC1VideoDecoder::GetFrameSize(MediaData* in) { uint32_t i = 0; uint32_t* offset = m_pContext->m_Offsets; uint32_t* value = m_pContext->m_values; m_pContext->m_FrameSize = (uint32_t)in->GetDataSize(); if(m_pContext->m_seqLayerHeader.PROFILE == VC1_PROFILE_ADVANCED) { value++; i++; while((*value == 0x0B010000)||(*value == 0x0C010000)) { value ++; i++; } if(*value != 0x00000000) { m_pContext->m_FrameSize = offset[i]; } } } Status VC1VideoDecoder::VC1DecodeFrame(MediaData* , VideoData* ) { return UMC_ERR_FAILED; } bool VC1VideoDecoder::InitTables(VC1Context* pContext) { //BITPLANE if (0 != HuffmanTableInitAlloc( VC1_Bitplane_IMODE_tbl, &pContext->m_vlcTbl->m_Bitplane_IMODE)) return false; if (0 != HuffmanTableInitAlloc( VC1_BitplaneTaledbitsTbl, &pContext->m_vlcTbl->m_BitplaneTaledbits)) return false; //BFRACTION if (0 != HuffmanRunLevelTableInitAlloc( VC1_BFraction_tbl, &pContext->m_vlcTbl->BFRACTION)) return false; //REFDIST if (0 != HuffmanTableInitAlloc( VC1_FieldRefdistTable, &pContext->m_vlcTbl->REFDIST_TABLE)) return false; return true; } void VC1VideoDecoder::FreeTables(VC1Context* pContext) { if (pContext->m_vlcTbl->m_Bitplane_IMODE) { HuffmanTableFree(pContext->m_vlcTbl->m_Bitplane_IMODE); pContext->m_vlcTbl->m_Bitplane_IMODE = NULL; } if (pContext->m_vlcTbl->m_BitplaneTaledbits) { HuffmanTableFree(pContext->m_vlcTbl->m_BitplaneTaledbits); pContext->m_vlcTbl->m_BitplaneTaledbits = NULL; } if (pContext->m_vlcTbl->REFDIST_TABLE) { HuffmanTableFree(pContext->m_vlcTbl->REFDIST_TABLE); pContext->m_vlcTbl->REFDIST_TABLE = NULL; } if (pContext->m_vlcTbl->BFRACTION) { HuffmanTableFree(pContext->m_vlcTbl->BFRACTION); pContext->m_vlcTbl->BFRACTION = NULL; } } void VC1VideoDecoder::FreeAlloc(VC1Context* pContext) { if(pContext) { FreeTables(pContext); } } Status VC1VideoDecoder::ChangeVideoDecodingSpeed(int32_t& speed_shift) { if (m_pStore->ChangeVideoDecodingSpeed(speed_shift)) return UMC_OK; else return UMC_ERR_FAILED; } Status VC1VideoDecoder::CheckLevelProfileOnly(VideoDecoderParams *pParam) { uint32_t Profile; // we can init without data. Hence we cannot check profile UMC_CHECK_PTR(pParam->m_pData); uint32_t* pData = (uint32_t*)pParam->m_pData->GetDataPointer(); // we can init without data. Hence we cannot check profile UMC_CHECK_PTR(pData); if ((WVC1_VIDEO == pParam->info.stream_subtype)|| ((VC1_VIDEO_VC1) == pParam->info.stream_subtype)) { //First double word can be start code if (0x0F010000 == *pData) pData += 1; } // May be need to add pParam->profile too. Chech first two bits Profile = ((*pData)&0xC0) >> 6; if (VC1_IS_VALID_PROFILE(Profile)) return UMC_OK; else return UMC_ERR_UNSUPPORTED; } void VC1VideoDecoder::SetCorrupted(UMC::VC1FrameDescriptor *pCurrDescriptor, mfxU16& Corrupted) { Corrupted = 0; if (NULL == pCurrDescriptor) { pCurrDescriptor = m_pStore->GetLastDS(); } mfxU32 Ptype = pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE; if (VC1_IS_PRED(Ptype) || VC1_IS_SKIPPED(Ptype)) { if (pCurrDescriptor->m_pContext->m_frmBuff.m_iPrevIndex > -1) { if (pCurrDescriptor->m_pContext->m_frmBuff.m_pFrames[pCurrDescriptor->m_pContext->m_frmBuff.m_iPrevIndex].corrupted) pCurrDescriptor->m_pContext->m_frmBuff.m_pFrames[pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex].corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; } if (pCurrDescriptor->m_pContext->m_frmBuff.m_iNextIndex > -1) { if (pCurrDescriptor->m_pContext->m_frmBuff.m_pFrames[pCurrDescriptor->m_pContext->m_frmBuff.m_iNextIndex].corrupted) pCurrDescriptor->m_pContext->m_frmBuff.m_pFrames[pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex].corrupted |= MFX_CORRUPTION_REFERENCE_FRAME; } } if (pCurrDescriptor->m_pContext->m_frmBuff.m_iDisplayIndex > -1) { Corrupted = pCurrDescriptor->m_pContext->m_frmBuff.m_pFrames[pCurrDescriptor->m_pContext->m_frmBuff.m_iDisplayIndex].corrupted; } } bool VC1VideoDecoder::IsFrameSkipped() { UMC::VC1FrameDescriptor *pCurrDescriptor = m_pStore->GetFirstDS(); if (pCurrDescriptor) { return (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)); } else return false; } bool VC1VideoDecoder::IsLastFrameSkipped() { UMC::VC1FrameDescriptor *pCurrDescriptor = m_pStore->GetLastDS(); if (pCurrDescriptor) { return (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)); } else return false; } FrameMemID VC1VideoDecoder::GetDisplayIndex(bool isDecodeOrder, bool ) { UMC::VC1FrameDescriptor *pCurrDescriptor = 0; pCurrDescriptor = m_pStore->GetLastDS(); if (!pCurrDescriptor) return -1; if ((m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGERED)) { if (isDecodeOrder) return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); if (VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) { if (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); else return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev); } else return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); } else { return (isDecodeOrder) ? (m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex)) : (m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iDisplayIndex)); } } FrameMemID VC1VideoDecoder::GetLastDisplayIndex() { VC1FrameDescriptor *pCurrDescriptor = NULL; pCurrDescriptor = m_pStore->GetLastDS(); if (m_bLastFrameNeedDisplay) { FrameMemID dispIndex; m_bLastFrameNeedDisplay = false; if ((!VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) || (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE))) dispIndex = pCurrDescriptor->m_pContext->m_frmBuff.m_iNextIndex; else dispIndex = pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex; if ((m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGERED)) { if (!VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev); else return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); } else return m_pStore->GetIdx(dispIndex); } else return -2; } Status VC1VideoDecoder::SetRMSurface() { FrameMemID RMindex = -1; VC1FrameDescriptor *pCurrDescriptor = NULL; pCurrDescriptor = m_pStore->GetLastDS(); m_pStore->LockSurface(&RMindex); if (RMindex < 0) return UMC_ERR_ALLOC; if (VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) { pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev = m_pStore->GetRangeMapIndex(); pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex = RMindex; m_pStore->SetRangeMapIndex(RMindex); } else { pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev = m_pStore->GetRangeMapIndex(); pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex = RMindex; } return UMC_OK; } void VC1VideoDecoder::UnlockSurfaces() { if (m_CurrIndexToFree > -1) m_pStore->UnLockSurface(m_CurrIndexToFree); if (m_RMIndexToFree > -1) m_pStore->UnLockSurface(m_RMIndexToFree); } UMC::FrameMemID VC1VideoDecoder::GetSkippedIndex(UMC::VC1FrameDescriptor *desc, bool isIn) { UMC::VC1FrameDescriptor *pCurrDescriptor = desc; if (!pCurrDescriptor) return -1; if (!VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) return -1; if (isIn) { if ((m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGERED)) return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); else return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iDisplayIndex); } else return m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iToSkipCoping); } FrameMemID VC1VideoDecoder::GetFrameOrder(bool isLast, bool isSamePolar, uint32_t & frameOrder) { UMC::VC1FrameDescriptor *pCurrDescriptor = 0; mfxI32 idx; pCurrDescriptor = m_pStore->GetLastDS(); if (0xFFFFFFFE == m_frameOrder) m_frameOrder = 0; bool rmap = false; if ((m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGERED)) rmap = true; // non last frame if (!isLast) { if (VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_InitPicLayer->PTYPE)) { if (1 == pCurrDescriptor->m_iFrameCounter) { idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex : pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex; // Only if external surfaces m_frameOrder = 0; frameOrder = 0xFFFFFFFF; return m_pStore->GetIdx(idx); } else { idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev : pCurrDescriptor->m_pContext->m_frmBuff.m_iPrevIndex; if (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) { if (isSamePolar) idx = pCurrDescriptor->m_pContext->m_frmBuff.m_iToSkipCoping; else idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex : pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex; //!!!!!!!!!Curr } } } else { idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex : pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex; } } else { if (!VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev : pCurrDescriptor->m_pContext->m_frmBuff.m_iNextIndex; else idx = rmap ? pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex : pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex; } frameOrder = m_frameOrder; m_frameOrder++; return m_pStore->GetIdx(idx); } #endif //MFX_ENABLE_VC1_VIDEO_DECODE umc_vc1_video_decoder_hw.cpp000066400000000000000000000364751443134507600335110ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vc1_dec/src// Copyright (c) 2004-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined (MFX_ENABLE_VC1_VIDEO_DECODE) #include "umc_vc1_video_decoder_hw.h" #include "umc_video_data.h" #include "umc_media_data_ex.h" #include "umc_vc1_dec_debug.h" #include "umc_vc1_dec_seq.h" #include "umc_vc1_dec_task_store.h" #include "umc_memory_allocator.h" #include "umc_vc1_common.h" #include "umc_vc1_common_defs.h" #include "umc_vc1_dec_exception.h" #include "umc_va_base.h" #include "umc_vc1_dec_frame_descr_va.h" using namespace UMC; using namespace UMC::VC1Common; using namespace UMC::VC1Exceptions; VC1VideoDecoderHW::VC1VideoDecoderHW(): m_stCodes_VA(NULL) { } VC1VideoDecoderHW::~VC1VideoDecoderHW() { Close(); } Status VC1VideoDecoderHW::Init(BaseCodecParams *pInit) { VideoDecoderParams *init = DynamicCast(pInit); if (!init) return UMC_ERR_INIT; if (init->pVideoAccelerator) { if ((init->pVideoAccelerator->m_Profile & VA_CODEC) == VA_VC1) m_va = init->pVideoAccelerator; else return UMC_ERR_UNSUPPORTED; } Status umcRes = UMC_OK; umcRes = VC1VideoDecoder::Init(pInit); if (umcRes != UMC_OK) return umcRes; try // memory allocation and Init all env for frames/tasks store - VC1TaskStore object { m_pStore = new(m_pHeap->s_alloc()) VC1TaskStore(m_pMemoryAllocator); if (!m_pStore->Init(m_iThreadDecoderNum, m_iMaxFramesInProcessing, this) ) return UMC_ERR_ALLOC; m_pStore->CreateDSQueue(m_pContext,m_va); } catch(...) { // only allocation errors here Close(); return UMC_ERR_ALLOC; } return umcRes; } Status VC1VideoDecoderHW::Reset(void) { Status umcRes = VC1VideoDecoder::Reset(); if (umcRes != UMC_OK) return umcRes; if (m_pStore) { if (!m_pStore->Reset()) return UMC_ERR_NOT_INITIALIZED; m_pStore->CreateDSQueue(&m_pInitContext, m_va); } return UMC_OK; } bool VC1VideoDecoderHW::InitVAEnvironment() { m_pContext->m_frmBuff.m_pFrames.Reset(m_FrameStorage); SetVideoHardwareAccelerator(m_va); return true; } uint32_t VC1VideoDecoderHW::CalculateHeapSize() { uint32_t Size = 0; Size += mfx::align2_value(sizeof(VC1TaskStore)); if (!m_va) Size += mfx::align2_value(sizeof(Frame)*(2*m_iMaxFramesInProcessing + 2*VC1NUMREFFRAMES)); else Size += mfx::align2_value(sizeof(Frame)*(m_SurfaceNum)); Size += mfx::align2_value(sizeof(MediaDataEx)); return Size; } Status VC1VideoDecoderHW::Close(void) { Status umcRes = UMC_OK; m_AllocBuffer = 0; // reset all values umcRes = Reset(); if (m_pStore) { m_pStore->~VC1TaskStore(); m_pStore = nullptr; } FreeAlloc(m_pContext); if(m_pMemoryAllocator) { if (static_cast(m_iMemContextID) != -1) { m_pMemoryAllocator->Unlock(m_iMemContextID); m_pMemoryAllocator->Free(m_iMemContextID); m_iMemContextID = (MemID)-1; } if (static_cast(m_iHeapID) != -1) { m_pMemoryAllocator->Unlock(m_iHeapID); m_pMemoryAllocator->Free(m_iHeapID); m_iHeapID = (MemID)-1; } if (static_cast(m_iFrameBufferID) != -1) { m_pMemoryAllocator->Unlock(m_iFrameBufferID); m_pMemoryAllocator->Free(m_iFrameBufferID); m_iFrameBufferID = (MemID)-1; } } m_pContext = NULL; m_dataBuffer = NULL; m_stCodes = NULL; m_frameData = NULL; m_pHeap = NULL; memset(&m_pInitContext,0,sizeof(VC1Context)); m_pMemoryAllocator = 0; #ifdef VC1_DEBUG_ON VM_Debug::GetInstance(VC1DebugRoutine).Release(); #endif if (m_stCodes_VA) { free(m_stCodes_VA); m_stCodes_VA = NULL; } m_pStore = NULL; m_pContext = NULL; m_iThreadDecoderNum = 0; m_decoderInitFlag = 0; m_decoderFlags = 0; return umcRes; } void VC1VideoDecoderHW::SetVideoHardwareAccelerator (VideoAccelerator* va) { if (va) m_va = (VideoAccelerator*)va; } bool VC1VideoDecoderHW::InitAlloc(VC1Context* pContext, uint32_t ) { if (!InitTables(pContext)) return false; pContext->m_frmBuff.m_iDisplayIndex = -1; pContext->m_frmBuff.m_iCurrIndex = -1; pContext->m_frmBuff.m_iPrevIndex = -1; pContext->m_frmBuff.m_iNextIndex = -1; pContext->m_frmBuff.m_iBFrameIndex = -1; pContext->m_frmBuff.m_iRangeMapIndex = -1; pContext->m_frmBuff.m_iRangeMapIndexPrev = -1; m_bLastFrameNeedDisplay = true; //for slice, field start code if (m_stCodes_VA == NULL) { m_stCodes_VA = (MediaDataEx::_MediaDataEx *)malloc(START_CODE_NUMBER * 2 * sizeof(int32_t) + sizeof(MediaDataEx::_MediaDataEx)); if (m_stCodes_VA == NULL) return false; memset(reinterpret_cast(m_stCodes_VA), 0, (START_CODE_NUMBER * 2 * sizeof(int32_t) + sizeof(MediaDataEx::_MediaDataEx))); m_stCodes_VA->count = 0; m_stCodes_VA->index = 0; m_stCodes_VA->bstrm_pos = 0; m_stCodes_VA->offsets = (uint32_t*)((uint8_t*)m_stCodes_VA + sizeof(MediaDataEx::_MediaDataEx)); m_stCodes_VA->values = (uint32_t*)((uint8_t*)m_stCodes_VA->offsets + START_CODE_NUMBER * sizeof(uint32_t)); } return true; } void VC1VideoDecoderHW::GetStartCodes_HW(MediaData* in, uint32_t &sShift) { uint8_t* readPos = (uint8_t*)in->GetBufferPointer(); uint32_t readBufSize = (uint32_t)in->GetDataSize(); uint8_t* readBuf = (uint8_t*)in->GetBufferPointer(); uint32_t frameSize = 0; MediaDataEx::_MediaDataEx *stCodes = m_stCodes_VA; stCodes->count = 0; sShift = 0; uint32_t size = 0; uint8_t* ptr = NULL; uint32_t readDataSize = 0; uint32_t a = 0x0000FF00 | (*readPos); uint32_t b = 0xFFFFFFFF; uint32_t FrameNum = 0; memset(stCodes->offsets, 0, START_CODE_NUMBER * sizeof(int32_t)); memset(stCodes->values, 0, START_CODE_NUMBER * sizeof(int32_t)); while (readPos < (readBuf + readBufSize)) { if (stCodes->count > 512) return; //find sequence of 0x000001 or 0x000003 while (!(b == 0x00000001 || b == 0x00000003) && (++readPos < (readBuf + readBufSize))) { a = (a << 8) | (int32_t)(*readPos); b = a & 0x00FFFFFF; } //check end of read buffer if (readPos < (readBuf + readBufSize - 1)) { if (*readPos == 0x01) { if ((*(readPos + 1) == VC1_Slice) || (*(readPos + 1) == VC1_Field) || (*(readPos + 1) == VC1_FrameHeader) || (*(readPos + 1) == VC1_SliceLevelUserData) || (*(readPos + 1) == VC1_FieldLevelUserData) || (*(readPos + 1) == VC1_FrameLevelUserData) ) { readPos += 2; ptr = readPos - 5; size = (uint32_t)(ptr - readBuf - readDataSize + 1); frameSize = frameSize + size; stCodes->offsets[stCodes->count] = frameSize; if (FrameNum) sShift = 1; stCodes->values[stCodes->count] = ((*(readPos - 1)) << 24) + ((*(readPos - 2)) << 16) + ((*(readPos - 3)) << 8) + (*(readPos - 4)); readDataSize = (uint32_t)(readPos - readBuf - 4); a = 0x00010b00 | (int32_t)(*readPos); b = a & 0x00FFFFFF; stCodes->count++; } else { { readPos += 2; ptr = readPos - 5; //trim zero bytes if (stCodes->count) { while ((*ptr == 0) && (ptr > readBuf)) ptr--; } //slice or field size size = (uint32_t)(readPos - readBuf - readDataSize - 4); frameSize = frameSize + size; readDataSize = readDataSize + size; FrameNum++; } } } else //if(*readPos == 0x03) { readPos++; a = (a << 8) | (int32_t)(*readPos); b = a & 0x00FFFFFF; } } else { //end of stream size = (uint32_t)(readPos - readBuf - readDataSize); readDataSize = readDataSize + size; return; } } } Status VC1VideoDecoderHW::FillAndExecute(MediaData* in) { uint32_t stShift = 0; int32_t SCoffset = 0; if ((VC1_PROFILE_ADVANCED != m_pContext->m_seqLayerHeader.PROFILE)) // special header (with frame size) in case of .rcv format SCoffset = -VC1FHSIZE; VC1FrameDescriptor* pPackDescriptorChild = m_pStore->GetLastDS(); pPackDescriptorChild->m_bIsFieldAbsent = false; if ((!VC1_IS_SKIPPED(pPackDescriptorChild->m_pContext->m_picLayerHeader->PTYPE)) && (VC1_PROFILE_ADVANCED == m_pContext->m_seqLayerHeader.PROFILE)) { GetStartCodes_HW(in, stShift); if (stShift) // we begin since start code frame in case of external MS splitter { SCoffset -= *m_stCodes_VA->offsets; pPackDescriptorChild->m_pContext->m_FrameSize -= *m_stCodes_VA->offsets; } } try { pPackDescriptorChild->PrepareVLDVABuffers(m_pContext->m_Offsets, m_pContext->m_values, (uint8_t*)in->GetDataPointer() - SCoffset, m_stCodes_VA + stShift); } catch (vc1_exception ex) { exception_type e_type = ex.get_exception_type(); if (mem_allocation_er == e_type) return UMC_ERR_NOT_ENOUGH_BUFFER; } if (!VC1_IS_SKIPPED(pPackDescriptorChild->m_pContext->m_picLayerHeader->PTYPE)) { if (UMC_OK != m_va->EndFrame()) throw VC1Exceptions::vc1_exception(VC1Exceptions::internal_pipeline_error); } in->MoveDataPointer(pPackDescriptorChild->m_pContext->m_FrameSize); if (pPackDescriptorChild->m_pContext->m_picLayerHeader->FCM == VC1_FieldInterlace && m_stCodes_VA->count < 2) pPackDescriptorChild->m_bIsFieldAbsent = true; if ((VC1_PROFILE_ADVANCED != m_pContext->m_seqLayerHeader.PROFILE)) { m_pContext->m_seqLayerHeader.RNDCTRL = pPackDescriptorChild->m_pContext->m_seqLayerHeader.RNDCTRL; } return UMC_OK; } Status VC1VideoDecoderHW::VC1DecodeFrame(MediaData* in, VideoData* out_data) { (void)in; (void)out_data; if (m_va->m_Profile == VC1_VLD) { return VC1DecodeFrame_VLD >(in, out_data); } return UMC_ERR_FAILED; } FrameMemID VC1VideoDecoderHW::ProcessQueuesForNextFrame(bool& isSkip, mfxU16& Corrupted) { FrameMemID currIndx = -1; UMC::VC1FrameDescriptor *pCurrDescriptor = 0; UMC::VC1FrameDescriptor *pTempDescriptor = 0; m_RMIndexToFree = -1; m_CurrIndexToFree = -1; pCurrDescriptor = m_pStore->GetFirstDS(); // free first descriptor m_pStore->SetFirstBusyDescriptorAsReady(); if (!m_pStore->GetPerformedDS(&pTempDescriptor)) m_pStore->GetReadySkippedDS(&pTempDescriptor); if (pCurrDescriptor) { SetCorrupted(pCurrDescriptor, Corrupted); if (VC1_IS_SKIPPED(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) { isSkip = true; if (!pCurrDescriptor->isDescriptorValid()) { return currIndx; } else { currIndx = m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex); } // Range Map if ((pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG)) { currIndx = m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); } m_pStore->UnLockSurface(pCurrDescriptor->m_pContext->m_frmBuff.m_iToSkipCoping); return currIndx; } else { currIndx = m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iCurrIndex); // We should unlock after LockRect in PrepareOutPut function if ((pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGE_MAPY_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGE_MAPUV_FLAG) || (pCurrDescriptor->m_pContext->m_seqLayerHeader.RANGERED)) { if (!VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) { currIndx = m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); m_RMIndexToFree = pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex; } else { currIndx = m_pStore->GetIdx(pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndex); m_RMIndexToFree = pCurrDescriptor->m_pContext->m_frmBuff.m_iRangeMapIndexPrev; } } // Asynchrony Unlock if (!VC1_IS_REFERENCE(pCurrDescriptor->m_pContext->m_picLayerHeader->PTYPE)) m_CurrIndexToFree = pCurrDescriptor->m_pContext->m_frmBuff.m_iDisplayIndex; else { if (pCurrDescriptor->m_pContext->m_frmBuff.m_iToFreeIndex > -1) m_CurrIndexToFree = pCurrDescriptor->m_pContext->m_frmBuff.m_iToFreeIndex; } } } return currIndx; } Status VC1VideoDecoderHW::SetRMSurface() { Status sts; sts = VC1VideoDecoder::SetRMSurface(); UMC_CHECK_STATUS(sts); FillAndExecute(m_pCurrentIn); return UMC_OK; } UMC::FrameMemID VC1VideoDecoderHW::GetSkippedIndex(bool isIn) { return VC1VideoDecoder::GetSkippedIndex(m_pStore->GetLastDS(), isIn); } #endif //MFX_ENABLE_VC1_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/000077500000000000000000000000001443134507600253755ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/CMakeLists.txt000066400000000000000000000016031443134507600301350ustar00rootroot00000000000000if( NOT MFX_LIB_ONLY ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/umc/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/vm/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../core/vm_plus/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../io/media_buffers/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../api/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../mfx_lib/shared/include ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../io/umc_va/include ) set( sources "" ) file( GLOB_RECURSE srcs "src/*.c" "src/*.cpp" ) list( APPEND sources ${srcs}) set( defs "${API_FLAGS} ${WARNING_FLAGS}" ) make_library( umc_vp9 hw static ) set( defs "" ) endif(0) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/000077500000000000000000000000001443134507600270205ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/umc_vp9_bitstream.h000066400000000000000000000100151443134507600326220ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "umc_vp9_dec_defs.h" #if defined(UMC_ENABLE_VP9_AV1_DECODE) #ifndef __UMC_VP9_BITSTREAM_H_ #define __UMC_VP9_BITSTREAM_H_ namespace UMC_VP9_DECODER { class VP9DecoderFrame; struct Loopfilter; class VP9Bitstream { public: VP9Bitstream(); VP9Bitstream(uint8_t * const pb, const uint32_t maxsize); // Reset the bitstream with new data pointer void Reset(uint8_t * const pb, const uint32_t maxsize); // Reset the bitstream with new data pointer and bit offset void Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize); // Returns number of decoded bytes since last reset size_t BytesDecoded() const { return static_cast(m_pbs - m_pbsBase) + (m_bitOffset / 8); } // Returns number of decoded bits since last reset size_t BitsDecoded() const { return static_cast(m_pbs - m_pbsBase) * 8 + m_bitOffset; } // Returns number of bytes left in bitstream array size_t BytesLeft() const { return (int32_t)m_maxBsSize - (int32_t) BytesDecoded(); } // Return bitstream array base address and size void GetOrg(uint8_t **pbs, uint32_t *size); uint32_t GetBit() { if (m_pbs >= m_pbsBase + m_maxBsSize) throw vp9_exception(UMC::UMC_ERR_NOT_ENOUGH_DATA); uint32_t const bit = (*m_pbs >> (7 - m_bitOffset)) & 1; if (++m_bitOffset == 8) { ++m_pbs; m_bitOffset = 0; } return bit; } uint32_t GetBits(uint32_t nbits); uint32_t GetUe(); int32_t GetSe(); protected: uint8_t* m_pbs; // pointer to the current position of the buffer. int32_t m_bitOffset; // the bit position (0 to 31) in the dword pointed by m_pbs. uint8_t* m_pbsBase; // pointer to the first byte of the buffer. uint32_t m_maxBsSize; // maximum buffer size in bytes. }; inline bool CheckSyncCode(VP9Bitstream* bs) { return bs->GetBits(8) == VP9_SYNC_CODE_0 && bs->GetBits(8) == VP9_SYNC_CODE_1 && bs->GetBits(8) == VP9_SYNC_CODE_2 ; } void GetDisplaySize(VP9Bitstream*, VP9DecoderFrame*); void GetFrameSize(VP9Bitstream*, VP9DecoderFrame*); void GetBitDepthAndColorSpace(VP9Bitstream*, VP9DecoderFrame*); void GetFrameSizeWithRefs(VP9Bitstream*, VP9DecoderFrame*); void SetupLoopFilter(VP9Bitstream *pBs, Loopfilter*); } // namespace UMC_VP9_DECODER #endif // __UMC_VP9_BITSTREAM_H_ #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/umc_vp9_dec_defs.h000066400000000000000000000122211443134507600323650ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined(UMC_ENABLE_VP9_AV1_DECODE) #ifndef __UMC_VP9_DEC_DEFS_DEC_H__ #define __UMC_VP9_DEC_DEFS_DEC_H__ namespace UMC_VP9_DECODER { const uint8_t VP9_SYNC_CODE_0 = 0x49; const uint8_t VP9_SYNC_CODE_1 = 0x83; const uint8_t VP9_SYNC_CODE_2 = 0x42; const uint8_t VP9_FRAME_MARKER = 0x2; typedef enum tagVP9_FRAME_TYPE { KEY_FRAME = 0, INTER_FRAME = 1 } VP9_FRAME_TYPE; typedef enum tagCOLOR_SPACE { UNKNOWN = 0, BT_601 = 1, // YUV BT_709 = 2, // YUV SMPTE_170 = 3, // YUV SMPTE_240 = 4, // YUV RESERVED_1 = 5, RESERVED_2 = 6, SRGB = 7 // RGB } COLOR_SPACE; typedef enum tagMV_REFERENCE_FRAME { NONE = -1, INTRA_FRAME = 0, LAST_FRAME = 1, GOLDEN_FRAME = 2, ALTREF_FRAME = 3, MAX_REF_FRAMES = 4 } MV_REFERENCE_FRAME; typedef enum tagINTERP_FILTER { EIGHTTAP = 0, EIGHTTAP_SMOOTH = 1, EIGHTTAP_SHARP = 2, BILINEAR = 3, SWITCHABLE = 4 } INTERP_FILTER; const uint8_t VP9_MAX_NUM_OF_SEGMENTS = 8; const uint8_t VP9_NUM_OF_SEGMENT_TREE_PROBS = VP9_MAX_NUM_OF_SEGMENTS - 1; const uint8_t VP9_NUM_OF_PREDICTION_PROBS = 3; // Segment level features. typedef enum tagSEG_LVL_FEATURES { SEG_LVL_ALT_Q = 0, // Use alternate Quantizer .... SEG_LVL_ALT_LF = 1, // Use alternate loop filter value... SEG_LVL_REF_FRAME = 2, // Optional Segment reference frame SEG_LVL_SKIP = 3, // Optional Segment (0,0) + skip mode SEG_LVL_MAX = 4 // Number of features supported } SEG_LVL_FEATURES; const uint8_t REFS_PER_FRAME = 3; const uint8_t REF_FRAMES_LOG2 = 3; const uint8_t NUM_REF_FRAMES = 1 << REF_FRAMES_LOG2; const uint8_t FRAME_CONTEXTS_LOG2 = 2; const uint8_t QINDEX_BITS = 8; const uint8_t VP9_MAX_PROB = 255; typedef struct tagSizeOfFrame{ uint32_t width; uint32_t height; } SizeOfFrame; const uint8_t MINQ = 0; const uint8_t MAXQ = 255; const uint16_t QINDEX_RANGE = MAXQ - MINQ + 1; const uint8_t SEGMENT_DELTADATA = 0; const uint8_t SEGMENT_ABSDATA = 1; const uint8_t MAX_REF_LF_DELTAS = 4; const uint8_t MAX_MODE_LF_DELTAS = 2; const uint8_t MAX_LOOP_FILTER = 63; const uint8_t MIN_TILE_WIDTH_B64 = 4; const uint8_t MAX_TILE_WIDTH_B64 = 64; const uint8_t MI_SIZE_LOG2 = 3; const uint8_t MI_BLOCK_SIZE_LOG2 = 6 - MI_SIZE_LOG2; // 64 = 2^6 const uint8_t SEG_FEATURE_DATA_SIGNED[SEG_LVL_MAX] = { 1, 1, 0, 0 }; const uint8_t SEG_FEATURE_DATA_MAX[SEG_LVL_MAX] = { MAXQ, MAX_LOOP_FILTER, 3, 0 }; struct Loopfilter { int32_t filterLevel; int32_t sharpnessLevel; int32_t lastSharpnessLevel; uint8_t modeRefDeltaEnabled; uint8_t modeRefDeltaUpdate; // 0 = Intra, Last, GF, ARF int8_t refDeltas[MAX_REF_LF_DELTAS]; // 0 = ZERO_MV, MV int8_t modeDeltas[MAX_MODE_LF_DELTAS]; }; struct LoopFilterInfo { uint8_t level[VP9_MAX_NUM_OF_SEGMENTS][MAX_REF_FRAMES][MAX_MODE_LF_DELTAS]; }; struct VP9Segmentation { uint8_t enabled; uint8_t updateMap; uint8_t updateData; uint8_t absDelta; uint8_t temporalUpdate; uint8_t treeProbs[VP9_NUM_OF_SEGMENT_TREE_PROBS]; uint8_t predProbs[VP9_NUM_OF_PREDICTION_PROBS]; int32_t featureData[VP9_MAX_NUM_OF_SEGMENTS][SEG_LVL_MAX]; uint32_t featureMask[VP9_MAX_NUM_OF_SEGMENTS]; }; class vp9_exception { public: vp9_exception(int32_t status = -1) : m_Status(status) {} virtual ~vp9_exception() {} int32_t GetStatus() const { return m_Status; } private: int32_t m_Status; }; } // end namespace UMC_VP9_DECODER #endif // __UMC_VP9_DEC_DEFS_DEC_H__ #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/umc_vp9_frame.h000066400000000000000000000056361443134507600317370ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined(UMC_ENABLE_VP9_AV1_DECODE) #ifndef __UMC_VP9_FRAME_H__ #define __UMC_VP9_FRAME_H__ #include "umc_vp9_dec_defs.h" #include "umc_frame_allocator.h" namespace UMC_VP9_DECODER { class VP9DecoderFrame { public: int16_t yDequant[QINDEX_RANGE][8]; int16_t uvDequant[QINDEX_RANGE][8]; COLOR_SPACE color_space; uint32_t width; uint32_t height; uint32_t displayWidth; uint32_t displayHeight; int32_t subsamplingX; int32_t subsamplingY; UMC::FrameMemID currFrame; int32_t activeRefIdx[REFS_PER_FRAME]; UMC::FrameMemID ref_frame_map[NUM_REF_FRAMES]; /* maps fb_idx to reference slot */ SizeOfFrame sizesOfRefFrame[NUM_REF_FRAMES]; VP9_FRAME_TYPE frameType; uint32_t show_existing_frame; uint32_t frame_to_show; uint32_t showFrame; uint32_t lastShowFrame; uint32_t intraOnly; uint32_t allowHighPrecisionMv; uint32_t resetFrameContext; uint8_t refreshFrameFlags; int32_t baseQIndex; int32_t y_dc_delta_q; int32_t uv_dc_delta_q; int32_t uv_ac_delta_q; uint32_t lossless; INTERP_FILTER interpFilter; LoopFilterInfo lf_info; uint32_t refreshFrameContext; uint32_t refFrameSignBias[MAX_REF_FRAMES]; Loopfilter lf; VP9Segmentation segmentation; uint32_t frameContextIdx; uint32_t currentVideoFrame; uint32_t profile; uint32_t bit_depth; uint32_t errorResilientMode; uint32_t frameParallelDecodingMode; uint32_t log2TileColumns; uint32_t log2TileRows; uint32_t frameHeaderLength; // in bytes uint32_t firstPartitionSize; uint32_t frameDataSize; uint32_t frameCountInBS; uint32_t currFrameInBS; bool isDecoded; }; } // end namespace UMC_VP9_DECODER #endif // __UMC_VP9_FRAME_H__ #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/umc_vp9_utils.h000066400000000000000000000077121443134507600320020ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VP9_UTILS_H_ #define __UMC_VP9_UTILS_H_ #include "umc_defs.h" #include "mfxstructures.h" #if defined(UMC_ENABLE_VP9_AV1_DECODE) #include "umc_vp9_dec_defs.h" #define VP9_CHECK_AND_THROW(exp, err) if(!exp) throw UMC_VP9_DECODER::vp9_exception(MFX_ERR_UNKNOWN) namespace UMC_VP9_DECODER { constexpr auto VP9_INVALID_REF_FRAME = -1; class VP9DecoderFrame; inline uint32_t AlignPowerOfTwo(uint32_t value, uint32_t n) { return (((value) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1)); } inline int32_t clamp(int32_t value, int32_t low, int32_t high) { return value < low ? low : (value > high ? high : value); } void SetSegData(VP9Segmentation & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId, int32_t seg_data); inline int32_t GetSegData(VP9Segmentation const& seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { return seg.featureData[segmentId][featureId]; } inline bool IsSegFeatureActive(VP9Segmentation const& seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { return seg.enabled && (seg.featureMask[segmentId] & (1 << featureId)); } inline void EnableSegFeature(VP9Segmentation & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId) { seg.featureMask[segmentId] |= 1 << featureId; } inline uint8_t IsSegFeatureSigned(SEG_LVL_FEATURES featureId) { return SEG_FEATURE_DATA_SIGNED[featureId]; } inline void ClearAllSegFeatures(VP9Segmentation & seg) { memset(&seg.featureData, 0, sizeof(seg.featureData)); memset(&seg.featureMask, 0, sizeof(seg.featureMask)); } inline uint32_t GetMostSignificantBit(uint32_t n) { uint32_t log = 0; uint32_t value = n; for (int8_t i = 4; i >= 0; --i) { const uint32_t shift = (1u << i); const uint32_t x = value >> shift; if (x != 0) { value = x; log += shift; } } return log; } inline uint32_t GetUnsignedBits(uint32_t numValues) { return numValues > 0 ? GetMostSignificantBit(numValues) + 1 : 0; } inline mfxU16 GetMinProfile(mfxU16 depth, mfxU16 format) { return MFX_PROFILE_VP9_0 + (depth > 8) * 2 + (format > MFX_CHROMAFORMAT_YUV420); } int32_t GetQIndex(VP9Segmentation const & seg, uint8_t segmentId, int32_t baseQIndex); void InitDequantizer(VP9DecoderFrame* info); UMC::ColorFormat GetUMCColorFormat_VP9(VP9DecoderFrame const*); void SetupPastIndependence(VP9DecoderFrame & info); void GetTileNBits(const int32_t miCols, int32_t & minLog2TileCols, int32_t & maxLog2TileCols); } //UMC_VP9_DECODER #endif //MFX_ENABLE_VP9_VIDEO_DECODE #endif //__UMC_VP9_UTILS_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/include/umc_vp9_va_packer.h000066400000000000000000000045121443134507600325700ustar00rootroot00000000000000// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #ifdef MFX_ENABLE_VP9_VIDEO_DECODE #ifndef __UMC_VP9_VA_PACKER_H #define __UMC_VP9_VA_PACKER_H #include "umc_va_base.h" #include "va/va_dec_vp9.h" namespace UMC { class MediaData; } namespace UMC_VP9_DECODER { class VP9Bitstream; class VP9DecoderFrame; class Packer { public: Packer(UMC::VideoAccelerator * va); virtual ~Packer(); virtual UMC::Status GetStatusReport(void* pStatusReport, size_t size) = 0; virtual void BeginFrame() = 0; virtual void EndFrame() = 0; virtual void PackAU(VP9Bitstream*, VP9DecoderFrame const*) = 0; static Packer* CreatePacker(UMC::VideoAccelerator * va); protected: UMC::VideoAccelerator *m_va; }; class PackerVA : public Packer { public: PackerVA(UMC::VideoAccelerator * va); UMC::Status GetStatusReport(void * pStatusReport, size_t size); void BeginFrame(); void EndFrame(); void PackAU(VP9Bitstream*, VP9DecoderFrame const*); private: void PackPicParams(VADecPictureParameterBufferVP9*, VP9DecoderFrame const*); void PackSliceParams(VASliceParameterBufferVP9*, VP9DecoderFrame const*); }; } // namespace UMC_HEVC_DECODER #endif /* __UMC_VP9_VA_PACKER_H */ #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/src/000077500000000000000000000000001443134507600261645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/src/umc_vp9_bitstream.cpp000066400000000000000000000131321443134507600323240ustar00rootroot00000000000000// Copyright (c) 2012-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #if defined(UMC_ENABLE_VP9_AV1_DECODE) #include "umc_structures.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_frame.h" namespace UMC_VP9_DECODER { VP9Bitstream::VP9Bitstream() { Reset(0, 0); } VP9Bitstream::VP9Bitstream(uint8_t * const pb, const uint32_t maxsize) { Reset(pb, maxsize); } // Reset the bitstream with new data pointer void VP9Bitstream::Reset(uint8_t * const pb, const uint32_t maxsize) { Reset(pb, 0, maxsize); } // Reset the bitstream with new data pointer and bit offset void VP9Bitstream::Reset(uint8_t * const pb, int32_t offset, const uint32_t maxsize) { m_pbs = pb; m_pbsBase = pb; m_bitOffset = offset; m_maxBsSize = maxsize; } // Return bitstream array base address and size void VP9Bitstream::GetOrg(uint8_t **pbs, uint32_t *size) { *pbs = m_pbsBase; *size = m_maxBsSize; } uint32_t VP9Bitstream::GetBits(uint32_t nbits) { mfxU32 bits = 0; for (; nbits > 0; --nbits) { bits <<= 1; bits |= GetBit(); } return bits; } uint32_t VP9Bitstream::GetUe() { uint32_t zeroes = 0; while (GetBit() == 0) ++zeroes; return zeroes == 0 ? 0 : ((1 << zeroes) | GetBits(zeroes)) - 1; } int32_t VP9Bitstream::GetSe() { int32_t val = GetUe(); uint32_t sign = (val & 1); val = (val + 1) >> 1; return sign ? val : -int32_t(val); } void GetFrameSize(VP9Bitstream* bs, VP9DecoderFrame* frame) { frame->width = bs->GetBits(16) + 1; frame->height = bs->GetBits(16) + 1; GetDisplaySize(bs, frame); } void GetDisplaySize(VP9Bitstream* bs, VP9DecoderFrame* frame) { frame->displayWidth = frame->width; frame->displayHeight = frame->height; if (bs->GetBit()) { frame->displayWidth = bs->GetBits(16) + 1; frame->displayHeight = bs->GetBits(16) + 1; } } void GetBitDepthAndColorSpace(VP9Bitstream* bs, VP9DecoderFrame* frame) { if (frame->profile >= 2) frame->bit_depth = bs->GetBit() ? 12 : 10; else frame->bit_depth = 8; if (frame->frameType != KEY_FRAME && frame->intraOnly && frame->profile == 0) { frame->subsamplingY = frame->subsamplingX = 1; return; } uint32_t const colorspace = bs->GetBits(3); if (colorspace != SRGB) { bs->GetBit(); // 0: [16, 235] (i.e. xvYCC), 1: [0, 255] if (1 == frame->profile || 3 == frame->profile) { frame->subsamplingX = bs->GetBit(); frame->subsamplingY = bs->GetBit(); bs->GetBit(); // reserved bit } else frame->subsamplingY = frame->subsamplingX = 1; } else { if (1 == frame->profile || 3 == frame->profile) { frame->subsamplingX = 0; frame->subsamplingY = 0; bs->GetBit(); // reserved bit } else throw vp9_exception(UMC::UMC_ERR_INVALID_STREAM); } } void GetFrameSizeWithRefs(VP9Bitstream* bs, VP9DecoderFrame* frame) { bool bFound = false; for (uint8_t i = 0; i < REFS_PER_FRAME; ++i) { if (bs->GetBit()) { bFound = true; frame->width = frame->sizesOfRefFrame[frame->activeRefIdx[i]].width; frame->height = frame->sizesOfRefFrame[frame->activeRefIdx[i]].height; break; } } if (!bFound) { frame->width = bs->GetBits(16) + 1; frame->height = bs->GetBits(16) + 1; } GetDisplaySize(bs, frame); } void SetupLoopFilter(VP9Bitstream* bs, Loopfilter* filter) { filter->filterLevel = bs->GetBits(6); filter->sharpnessLevel = bs->GetBits(3); filter->modeRefDeltaUpdate = 0; mfxI8 value = 0; filter->modeRefDeltaEnabled = (uint8_t)bs->GetBit(); if (filter->modeRefDeltaEnabled) { filter->modeRefDeltaUpdate = (uint8_t)bs->GetBit(); if (filter->modeRefDeltaUpdate) { for (uint32_t i = 0; i < MAX_REF_LF_DELTAS; i++) { if (bs->GetBit()) { value = (int8_t)bs->GetBits(6); filter->refDeltas[i] = bs->GetBit() ? -value : value; } } for (uint32_t i = 0; i < MAX_MODE_LF_DELTAS; i++) { if (bs->GetBit()) { value = (int8_t)bs->GetBits(6); filter->modeDeltas[i] = bs->GetBit() ? -value : value; } } } } } } // namespace UMC_VP9_DECODER #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/src/umc_vp9_utils.cpp000066400000000000000000000436571443134507600315110ustar00rootroot00000000000000// Copyright (c) 2012-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #if defined(MFX_ENABLE_VP9_VIDEO_DECODE) #include "umc_structures.h" #include "umc_vp9_utils.h" #include "umc_vp9_frame.h" namespace UMC_VP9_DECODER { static const mfxI16 dc_qlookup_8[QINDEX_RANGE] = { 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 87, 88, 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 125, 127, 129, 131, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 161, 164, 166, 169, 172, 174, 177, 180, 182, 185, 187, 190, 192, 195, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247, 250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292, 296, 300, 304, 309, 313, 317, 322, 326, 330, 335, 340, 344, 349, 354, 359, 364, 369, 374, 379, 384, 389, 395, 400, 406, 411, 417, 423, 429, 435, 441, 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626, 640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336, }; static const mfxI16 dc_qlookup_10[QINDEX_RANGE] = { 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163, 166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241, 244, 248, 251, 255, 259, 262, 266, 269, 273, 276, 280, 283, 287, 290, 293, 297, 300, 304, 307, 310, 314, 317, 321, 324, 327, 331, 334, 337, 343, 350, 356, 362, 369, 375, 381, 387, 394, 400, 406, 412, 418, 424, 430, 436, 442, 448, 454, 460, 466, 472, 478, 484, 490, 499, 507, 516, 525, 533, 542, 550, 559, 567, 576, 584, 592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687, 698, 708, 718, 729, 739, 749, 759, 770, 782, 795, 807, 819, 831, 844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988, 1001, 1015, 1030, 1045, 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170, 1186, 1202, 1218, 1236, 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379, 1398, 1416, 1436, 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102, 3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347, }; static const mfxI16 dc_qlookup_12[QINDEX_RANGE] = { 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 919, 934, 949, 964, 978, 993, 1008, 1022, 1037, 1051, 1065, 1080, 1094, 1108, 1122, 1136, 1151, 1165, 1179, 1192, 1206, 1220, 1234, 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342, 1368, 1393, 1419, 1444, 1469, 1494, 1519, 1544, 1569, 1594, 1618, 1643, 1668, 1692, 1717, 1741, 1765, 1789, 1814, 1838, 1862, 1885, 1909, 1933, 1957, 1992, 2027, 2061, 2096, 2130, 2165, 2199, 2233, 2267, 2300, 2334, 2367, 2400, 2434, 2467, 2499, 2532, 2575, 2618, 2661, 2704, 2746, 2788, 2830, 2872, 2913, 2954, 2995, 3036, 3076, 3127, 3177, 3226, 3275, 3324, 3373, 3421, 3469, 3517, 3565, 3621, 3677, 3733, 3788, 3843, 3897, 3951, 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420, 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942, 5013, 5083, 5153, 5222, 5291, 5367, 5442, 5517, 5591, 5665, 5745, 5825, 5905, 5984, 6063, 6149, 6234, 6319, 6404, 6495, 6587, 6678, 6769, 6867, 6966, 7064, 7163, 7269, 7376, 7483, 7599, 7715, 7832, 7958, 8085, 8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 17575, 18237, 18949, 19718, 20521, 21387, }; static const mfxI16 ac_qlookup_8[QINDEX_RANGE] = { 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347, 353, 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448, 456, 465, 474, 483, 492, 501, 510, 520, 530, 540, 550, 560, 571, 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, 729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828, }; static const mfxI16 ac_qlookup_10[QINDEX_RANGE] = { 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186, 190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280, 284, 289, 293, 297, 302, 306, 311, 315, 319, 324, 328, 332, 337, 341, 345, 349, 354, 358, 362, 367, 371, 375, 379, 384, 388, 392, 396, 401, 409, 417, 425, 433, 441, 449, 458, 466, 474, 482, 490, 498, 506, 514, 523, 531, 539, 547, 555, 563, 571, 579, 588, 596, 604, 616, 628, 640, 652, 664, 676, 688, 700, 713, 725, 737, 749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889, 905, 922, 938, 954, 970, 986, 1002, 1018, 1038, 1058, 1078, 1098, 1118, 1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386, 1411, 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727, 1759, 1791, 1823, 1859, 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159, 2199, 2239, 2283, 2327, 2371, 2415, 2459, 2507, 2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915, 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391, 3455, 3523, 3591, 3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312, }; static const mfxI16 ac_qlookup_12[QINDEX_RANGE] = { 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1246, 1264, 1282, 1299, 1317, 1335, 1352, 1370, 1387, 1405, 1422, 1440, 1457, 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595, 1627, 1660, 1693, 1725, 1758, 1791, 1824, 1856, 1889, 1922, 1954, 1987, 2020, 2052, 2085, 2118, 2150, 2183, 2216, 2248, 2281, 2313, 2346, 2378, 2411, 2459, 2508, 2556, 2605, 2653, 2701, 2750, 2798, 2847, 2895, 2943, 2992, 3040, 3088, 3137, 3185, 3234, 3298, 3362, 3426, 3491, 3555, 3619, 3684, 3748, 3812, 3876, 3941, 4005, 4069, 4149, 4230, 4310, 4390, 4470, 4550, 4631, 4711, 4791, 4871, 4967, 5064, 5160, 5256, 5352, 5448, 5544, 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410, 6522, 6650, 6778, 6906, 7034, 7162, 7290, 7435, 7579, 7723, 7867, 8011, 8155, 8315, 8475, 8635, 8795, 8956, 9132, 9308, 9484, 9660, 9836, 10028, 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661, 11885, 12109, 12333, 12573, 12813, 13053, 13309, 13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662, 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247, }; inline int16_t vp9_dc_quant(int32_t qindex, int32_t delta, uint32_t bit_depth) { switch (bit_depth) { case 8: return dc_qlookup_8[clamp(qindex + delta, 0, MAXQ)]; case 10: return dc_qlookup_10[clamp(qindex + delta, 0, MAXQ)]; case 12: return dc_qlookup_12[clamp(qindex + delta, 0, MAXQ)]; default: assert(0); return -1; } } inline int16_t vp9_ac_quant(int32_t qindex, int32_t delta, uint32_t bit_depth) { switch (bit_depth) { case 8: return ac_qlookup_8[clamp(qindex + delta, 0, MAXQ)]; case 10: return ac_qlookup_10[clamp(qindex + delta, 0, MAXQ)]; case 12: return ac_qlookup_12[clamp(qindex + delta, 0, MAXQ)]; default: assert(0); return -1; } } int32_t GetQIndex(VP9Segmentation const & seg, uint8_t segmentId, int32_t baseQIndex) { if (!IsSegFeatureActive(seg, segmentId, SEG_LVL_ALT_Q)) return baseQIndex; else { const int32_t data = GetSegData(seg, segmentId, UMC_VP9_DECODER::SEG_LVL_ALT_Q); const int32_t segQIdx = (seg.absDelta == SEGMENT_ABSDATA) ? data : // Abs value baseQIndex + data; // Delta value return clamp(segQIdx, 0, MAXQ); } } void InitDequantizer(VP9DecoderFrame* info) { for (mfxU16 q = 0; q < UMC_VP9_DECODER::QINDEX_RANGE; ++q) { info->yDequant[q][0] = vp9_dc_quant(q, info->y_dc_delta_q, info->bit_depth); info->yDequant[q][1] = vp9_ac_quant(q, 0, info->bit_depth); info->uvDequant[q][0] = vp9_dc_quant(q, info->uv_dc_delta_q, info->bit_depth); info->uvDequant[q][1] = vp9_ac_quant(q, info->uv_ac_delta_q, info->bit_depth); } } UMC::ColorFormat GetUMCColorFormat_VP9(VP9DecoderFrame const* info) { if (info->color_space == SRGB) //only 4:4:4 chroma sampling is allowed for SRGB return UMC::RGB24; if (!info->subsamplingX) { assert(info->subsamplingY == 0); //4:4:4 switch (info->bit_depth) { case 8: return UMC::AYUV; case 10: return UMC::Y410; case 12: return UMC::Y416; default: return UMC::NONE; } } else if (info->subsamplingY) { //4:2:0 switch (info->bit_depth) { case 8: return UMC::YUV420; case 10: return UMC::P010; case 12: return UMC::P016; default: return UMC::NONE; } } else { //4:2:2 switch (info->bit_depth) { case 8: return UMC::YUV422; case 10: return UMC::P210; case 12: return UMC::P216; default: return UMC::NONE; } } } void SetSegData(VP9Segmentation & seg, uint8_t segmentId, SEG_LVL_FEATURES featureId, int32_t seg_data) { assert(seg_data <= SEG_FEATURE_DATA_MAX[featureId]); if (seg_data < 0) { assert(SEG_FEATURE_DATA_SIGNED[featureId]); assert(-seg_data <= SEG_FEATURE_DATA_MAX[featureId]); } seg.featureData[segmentId][featureId] = seg_data; } void SetupPastIndependence(UMC_VP9_DECODER::VP9DecoderFrame & info) { // Reset the segment feature data to the default stats: // Features disabled, 0, with delta coding (Default state). ClearAllSegFeatures(info.segmentation); info.segmentation.absDelta = UMC_VP9_DECODER::SEGMENT_DELTADATA; // set_default_lf_deltas() info.lf.modeRefDeltaEnabled = 1; info.lf.modeRefDeltaUpdate = 1; info.lf.refDeltas[INTRA_FRAME] = 1; info.lf.refDeltas[LAST_FRAME] = 0; info.lf.refDeltas[GOLDEN_FRAME] = -1; info.lf.refDeltas[ALTREF_FRAME] = -1; info.lf.modeDeltas[0] = 0; info.lf.modeDeltas[1] = 0; memset(info.refFrameSignBias, 0, sizeof(info.refFrameSignBias)); } void GetTileNBits(const int32_t miCols, int32_t & minLog2TileCols, int32_t & maxLog2TileCols) { const int32_t sbCols = AlignPowerOfTwo(miCols, MI_BLOCK_SIZE_LOG2) >> MI_BLOCK_SIZE_LOG2; int32_t minLog2 = 0, maxLog2 = 0; while ((sbCols >> maxLog2) >= MIN_TILE_WIDTH_B64) ++maxLog2; --maxLog2; if (maxLog2 < 0) maxLog2 = 0; while ((MAX_TILE_WIDTH_B64 << minLog2) < sbCols) ++minLog2; assert(minLog2 <= maxLog2); minLog2TileCols = minLog2; maxLog2TileCols = maxLog2; } } //UMC_VP9_DECODER #endif //__UMC_VP9_UTILS_H_ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/codec/vp9_dec/src/umc_vp9_va_packer.cpp000066400000000000000000000214141443134507600322670ustar00rootroot00000000000000// Copyright (c) 2013-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_vp9_dec_defs.h" #ifdef MFX_ENABLE_VP9_VIDEO_DECODE #include "umc_vp9_va_packer.h" #include "umc_vp9_bitstream.h" #include "umc_vp9_frame.h" #include "umc_vp9_utils.h" #include "umc_va_base.h" #include "mfx_unified_vp9d_logging.h" using namespace UMC; namespace UMC_VP9_DECODER { Packer * Packer::CreatePacker(UMC::VideoAccelerator * va) { (void)va; Packer * packer = 0; packer = new PackerVA(va); return packer; } Packer::Packer(UMC::VideoAccelerator * va) : m_va(va) {} Packer::~Packer() {} /****************************************************************************************************/ // VA linux packer implementation /****************************************************************************************************/ PackerVA::PackerVA(VideoAccelerator * va) : Packer(va) {} Status PackerVA::GetStatusReport(void * , size_t ) { return UMC_OK; } void PackerVA::BeginFrame() { /* nothing to do here*/ } void PackerVA::EndFrame() { /* nothing to do here*/ } void PackerVA::PackAU(VP9Bitstream* bs, VP9DecoderFrame const* info) { if (!bs || !info) throw vp9_exception(MFX_ERR_NULL_PTR); UMC::UMCVACompBuffer* pCompBuf = nullptr; VADecPictureParameterBufferVP9 *picParam = (VADecPictureParameterBufferVP9*)m_va->GetCompBuffer(VAPictureParameterBufferType, &pCompBuf, sizeof(VADecPictureParameterBufferVP9)); if (!picParam) throw vp9_exception(MFX_ERR_MEMORY_ALLOC); memset(picParam, 0, sizeof(VADecPictureParameterBufferVP9)); PackPicParams(picParam, info); pCompBuf = nullptr; VASliceParameterBufferVP9 *sliceParam = (VASliceParameterBufferVP9*)m_va->GetCompBuffer(VASliceParameterBufferType, &pCompBuf, sizeof(VASliceParameterBufferVP9)); if (!sliceParam) throw vp9_exception(MFX_ERR_MEMORY_ALLOC); memset(sliceParam, 0, sizeof(VASliceParameterBufferVP9)); PackSliceParams(sliceParam, info); uint8_t* data; uint32_t length; bs->GetOrg(&data, &length); uint32_t const offset = bs->BytesDecoded(); length -= offset; pCompBuf = nullptr; mfxU8 *bistreamData = (mfxU8*)m_va->GetCompBuffer(VASliceDataBufferType, &pCompBuf, length); if (!bistreamData) throw vp9_exception(MFX_ERR_MEMORY_ALLOC); std::copy(data + offset, data + offset + length, bistreamData); pCompBuf->SetDataSize(length); } void PackerVA::PackPicParams(VADecPictureParameterBufferVP9* picParam, VP9DecoderFrame const* info) { assert(picParam); assert(info); picParam->frame_width = info->width; picParam->frame_height = info->height; if (KEY_FRAME == info->frameType) memset(picParam->reference_frames, VA_INVALID_SURFACE, sizeof(picParam->reference_frames)); else { for (mfxU8 ref = 0; ref < NUM_REF_FRAMES; ++ref) { if (info->ref_frame_map[ref] != VP9_INVALID_REF_FRAME) { picParam->reference_frames[ref] = m_va->GetSurfaceID(info->ref_frame_map[ref]); } else { picParam->reference_frames[ref] = VA_INVALID_SURFACE; } } } picParam->pic_fields.bits.subsampling_x = info->subsamplingX; picParam->pic_fields.bits.subsampling_y = info->subsamplingY; picParam->pic_fields.bits.frame_type = info->frameType; picParam->pic_fields.bits.show_frame = info->showFrame; picParam->pic_fields.bits.error_resilient_mode = info->errorResilientMode; picParam->pic_fields.bits.intra_only = info->intraOnly; picParam->pic_fields.bits.allow_high_precision_mv = info->allowHighPrecisionMv; picParam->pic_fields.bits.mcomp_filter_type = info->interpFilter; picParam->pic_fields.bits.frame_parallel_decoding_mode = info->frameParallelDecodingMode; picParam->pic_fields.bits.reset_frame_context = info->resetFrameContext; picParam->pic_fields.bits.refresh_frame_context = info->refreshFrameContext; picParam->pic_fields.bits.frame_context_idx = info->frameContextIdx; picParam->pic_fields.bits.segmentation_enabled = info->segmentation.enabled; picParam->pic_fields.bits.segmentation_temporal_update = info->segmentation.temporalUpdate; picParam->pic_fields.bits.segmentation_update_map = info->segmentation.updateMap; { picParam->pic_fields.bits.last_ref_frame = info->activeRefIdx[0]; picParam->pic_fields.bits.last_ref_frame_sign_bias = info->refFrameSignBias[LAST_FRAME]; picParam->pic_fields.bits.golden_ref_frame = info->activeRefIdx[1]; picParam->pic_fields.bits.golden_ref_frame_sign_bias = info->refFrameSignBias[GOLDEN_FRAME]; picParam->pic_fields.bits.alt_ref_frame = info->activeRefIdx[2]; picParam->pic_fields.bits.alt_ref_frame_sign_bias = info->refFrameSignBias[ALTREF_FRAME]; } picParam->pic_fields.bits.lossless_flag = info->lossless; picParam->filter_level = info->lf.filterLevel; picParam->sharpness_level = info->lf.sharpnessLevel; picParam->log2_tile_rows = info->log2TileRows; picParam->log2_tile_columns = info->log2TileColumns; picParam->frame_header_length_in_bytes = info->frameHeaderLength; picParam->first_partition_size = info->firstPartitionSize; for (mfxU8 i = 0; i < VP9_NUM_OF_SEGMENT_TREE_PROBS; ++i) picParam->mb_segment_tree_probs[i] = info->segmentation.treeProbs[i]; for (mfxU8 i = 0; i < VP9_NUM_OF_PREDICTION_PROBS; ++i) picParam->segment_pred_probs[i] = info->segmentation.predProbs[i]; picParam->profile = info->profile; // We need to set bit_depth directly to structure VADecPictureParameterBufferVP9 // Calculating to (bit_depth - 8) performs on driver side (to variable BitDepthMinus8) picParam->bit_depth = info->bit_depth; TRACE_BUFFER_EVENT(VA_TRACE_API_VP9_PICTUREPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_PICPARAM, picParam, VP9DecodePicparam, PICTUREPARAM_VP9); } void PackerVA::PackSliceParams(VASliceParameterBufferVP9* sliceParam, VP9DecoderFrame const* info) { assert(sliceParam); assert(info); sliceParam->slice_data_size = info->frameDataSize; sliceParam->slice_data_offset = 0; sliceParam->slice_data_flag = VA_SLICE_DATA_FLAG_ALL; for (mfxU8 segmentId = 0; segmentId < VP9_MAX_NUM_OF_SEGMENTS; ++segmentId) { sliceParam->seg_param[segmentId].segment_flags.fields.segment_reference_enabled = !!(info->segmentation.featureMask[segmentId] & (1 << SEG_LVL_REF_FRAME)); sliceParam->seg_param[segmentId].segment_flags.fields.segment_reference = GetSegData(info->segmentation, segmentId, SEG_LVL_REF_FRAME); sliceParam->seg_param[segmentId].segment_flags.fields.segment_reference_skipped = !!(info->segmentation.featureMask[segmentId] & (1 << SEG_LVL_SKIP)); for (mfxU8 ref = INTRA_FRAME; ref < MAX_REF_FRAMES; ++ref) for (mfxU8 mode = 0; mode < MAX_MODE_LF_DELTAS; ++mode) sliceParam->seg_param[segmentId].filter_level[ref][mode] = info->lf_info.level[segmentId][ref][mode]; const mfxI32 qIndex = GetQIndex(info->segmentation, segmentId, info->baseQIndex); if (qIndex < 0) throw vp9_exception(MFX_ERR_UNDEFINED_BEHAVIOR); sliceParam->seg_param[segmentId].luma_ac_quant_scale = info->yDequant[qIndex][1]; sliceParam->seg_param[segmentId].luma_dc_quant_scale = info->yDequant[qIndex][0]; sliceParam->seg_param[segmentId].chroma_ac_quant_scale = info->uvDequant[qIndex][1]; sliceParam->seg_param[segmentId].chroma_dc_quant_scale = info->uvDequant[qIndex][0]; } TRACE_BUFFER_EVENT(VA_TRACE_API_VP9_SLICEPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_SLICEPARAM, sliceParam, VP9DecodeSegmentParam, SLICEPARAM_VP9); } } // namespace UMC_HEVC_DECODER #endif // MFX_ENABLE_VP9_VIDEO_DECODE oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/000077500000000000000000000000001443134507600237175ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/000077500000000000000000000000001443134507600245035ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/CMakeLists.txt000066400000000000000000000017361443134507600272520ustar00rootroot00000000000000add_library(umc STATIC) set_property(TARGET umc PROPERTY FOLDER "umc") target_sources(umc PRIVATE include/umc_base_codec.h include/umc_base_color_space_converter.h include/umc_defs.h include/umc_dynamic_cast.h include/umc_frame_allocator.h include/umc_frame_data.h include/umc_media_data.h include/umc_memory_allocator.h include/umc_structures.h include/umc_va_base.h include/umc_video_data.h include/umc_video_decoder.h include/umc_video_encoder.h src/umc_base_codec.cpp src/umc_frame_data.cpp src/umc_media_data.cpp src/umc_va_base.cpp src/umc_video_data.cpp src/umc_video_decoder.cpp src/umc_video_encoder.cpp ) target_include_directories(umc PUBLIC include ${MSDK_STUDIO_ROOT}/shared/mfx_logging/include ) target_link_libraries(umc PUBLIC mfx_static_lib vm vm_plus mfx_logging ${IPP_LIBS} PRIVATE mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/000077500000000000000000000000001443134507600261265ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_base_codec.h000066400000000000000000000053431443134507600312170ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_BASE_CODEC_H__ #define __UMC_BASE_CODEC_H__ #include "umc_media_data.h" #include "umc_memory_allocator.h" namespace UMC { class BaseCodecParams { DYNAMIC_CAST_DECL_BASE(BaseCodecParams) public: // Default constructor BaseCodecParams(void); // Destructor virtual ~BaseCodecParams(void){} MediaData *m_pData; MemoryAllocator *lpMemoryAllocator; // (MemoryAllocator *) pointer to memory allocator object uint32_t m_SuggestedInputSize; //max suggested frame size of input stream uint32_t m_SuggestedOutputSize; //max suggested frame size of output stream int32_t numThreads; // maximum number of threads to use int32_t profile; // profile int32_t level; // level }; class BaseCodec { DYNAMIC_CAST_DECL_BASE(BaseCodec) public: // Constructor BaseCodec(void); // Destructor virtual ~BaseCodec(void); // Initialize codec with specified parameter(s) // Has to be called if MemoryAllocator interface is used virtual Status Init(BaseCodecParams *init); // Compress (decompress) next frame virtual Status GetFrame(MediaData *in, MediaData *out) = 0; // Get codec working (initialization) parameter(s) virtual Status GetInfo(BaseCodecParams *info) = 0; // Close all codec resources virtual Status Close(void); // Set codec to initial state virtual Status Reset(void) = 0; protected: MemoryAllocator *m_pMemoryAllocator; // (MemoryAllocator*) pointer to memory allocator bool m_bOwnAllocator; // True when default allocator is used }; } // end namespace UMC #endif /* __UMC_BASE_CODEC_H__ */ umc_base_color_space_converter.h000066400000000000000000000025311443134507600344370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_BASE_COLOR_SPACE_CONVERTER_H__ #define __UMC_BASE_COLOR_SPACE_CONVERTER_H__ #include "umc_base_codec.h" namespace UMC { BaseCodec *createVideoProcessing(); } // end namespace UMC #endif /* __UMC_BASE_COLOR_SPACE_CONVERTER_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_defs.h000066400000000000000000000041731443134507600300710ustar00rootroot00000000000000// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_DEFS_H__ #define __UMC_DEFS_H__ #include "mfx_config.h" #ifdef __cplusplus namespace UMC { }; #endif //__cplusplus #include "ipps.h" #include #ifdef __cplusplus #include #include #define MFX_INTERNAL_CPY(dst, src, size) std::copy((const uint8_t *)(src), (const uint8_t *)(src)+(int)(size), (uint8_t *)(dst)) #else #define MFX_INTERNAL_CPY(dst, src, size) memcpy((uint8_t *)(dst), (const uint8_t *)(src), (int)(size)) #endif //__cplusplus #define MFX_INTERNAL_ZERO(dst, size) memset((uint8_t *)(dst), 0, (int)(size)) #ifndef MFX_ABS #define MFX_ABS( a ) ((a) >= 0 ? (a) : -(a)) #endif #define MFX_MAX_32S ( 2147483647 ) #define MFX_MAXABS_64F ( 1.7976931348623158e+308 ) #define MFX_MAX_32U ( 0xFFFFFFFF ) #define MFX_MAX_64S ( 9223372036854775807LL ) typedef IppiSize mfxSize; #define __STDCALL #define __CDECL #define ALIGN_DECL(X) __attribute__ ((aligned(X))) /******************************************************************************/ #endif // __UMC_DEFS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_dynamic_cast.h000066400000000000000000000102611443134507600316010ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_DYNAMIC_CAST_H__ #define __UMC_DYNAMIC_CAST_H__ #include // for size_t under Linux #include #include "vm_types.h" #include "vm_strings.h" // There are functional for dynamic cast (linear time casting). // Multiple inheritance is no acceptable. // Weak conversion is used to casting objects, // which created in different places & heaps (ex. EXE & DLL). // Declare "dynamic cast" type typedef const char *(*pDynamicCastFunction)(void); // This define must be placed in first line of base class declaration (.H file) #define DYNAMIC_CAST_DECL_BASE(class_name) \ public: \ /* declare function to obtain string with class name */ \ static const char *__GetClassName(void) {return #class_name;} \ /* strong casting - compare function adresses of classes */ \ virtual bool TryStrongCasting(pDynamicCastFunction pCandidateFunction) const \ { \ return (pCandidateFunction == &class_name::__GetClassName); \ } \ /* weak casting - compare names of classes */ \ virtual bool TryWeakCasting(pDynamicCastFunction pCandidateFunction) const \ { \ return (0 == strcmp(#class_name, pCandidateFunction())); \ } // This define must be placed in first line of descendant class declaration (.H file) #define DYNAMIC_CAST_DECL(class_name, parent_class) \ public: \ /* declare function to obtain string with class name */ \ static const char *__GetClassName(void) {return #class_name;} \ /* strong casting - compare function adresses of classes */ \ virtual bool TryStrongCasting(pDynamicCastFunction pCandidateFunction) const override \ { \ if (pCandidateFunction == &class_name::__GetClassName) \ return true; \ return parent_class::TryStrongCasting(pCandidateFunction); \ } \ /* weak casting - compare names of classes */ \ virtual bool TryWeakCasting(pDynamicCastFunction pCandidateFunction) const override \ { \ if (0 == strcmp(#class_name, pCandidateFunction())) \ return true; \ return parent_class::TryWeakCasting(pCandidateFunction); \ } // Function for dynamic cast from one class to another one (forward declaration) template To *DynamicCast(From *pFrom); // Function for dynamic cast from one class to another one (inline implementation) template To *DynamicCast(From *pFrom) { // some compiler complain to compare pointer and zero. // we use real zero pointer instead const zero. void *NullPointer = 0; // we don't need do casting if (NullPointer == pFrom) return reinterpret_cast (NullPointer); // try strong casting if (pFrom->TryStrongCasting(&To::__GetClassName)) return reinterpret_cast (pFrom); // there are no strong conversion, try weak casting if (pFrom->TryWeakCasting(&To::__GetClassName)) return reinterpret_cast (pFrom); // there are no any conversion return reinterpret_cast (NullPointer); } // template lpTo *DynamicCast(From *pFrom) #endif /* __UMC_DYNAMIC_CAST_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_frame_allocator.h000066400000000000000000000060431443134507600323000ustar00rootroot00000000000000// Copyright (c) 2006-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_FRAME_ALLOCATOR_H__ #define __UMC_FRAME_ALLOCATOR_H__ #include "umc_structures.h" #include "umc_dynamic_cast.h" #include "umc_mutex.h" #define FMID_INVALID 0 namespace UMC { class VideoDataInfo; class FrameData; typedef int32_t FrameMemID; enum { FRAME_MID_INVALID = -1 }; /*enum UMC_ALLOC_FLAGS { UMC_ALLOC_PERSISTENT = 0x01, UMC_ALLOC_FUNCLOCAL = 0x02 };*/ class FrameAllocatorParams { DYNAMIC_CAST_DECL_BASE(FrameAllocatorParams) public: FrameAllocatorParams(){} virtual ~FrameAllocatorParams(){} }; class FrameAllocator { DYNAMIC_CAST_DECL_BASE(FrameAllocator) public: FrameAllocator(void){} virtual ~FrameAllocator(void){} // Initiates object virtual Status Init(FrameAllocatorParams *) { return UMC_OK;} // Closes object and releases all allocated memory virtual Status Close() = 0; virtual Status Reset() = 0; // Allocates or reserves physical memory and returns unique ID // Sets lock counter to 0 virtual Status Alloc(FrameMemID *pNewMemID, const VideoDataInfo * info, uint32_t Flags) = 0; virtual Status GetFrameHandle(UMC::FrameMemID MID, void * handle) = 0; // Lock() provides pointer from ID. If data is not in memory (swapped) // prepares (restores) it. Increases lock counter virtual const FrameData* Lock(FrameMemID MID) = 0; // Unlock() decreases lock counter virtual Status Unlock(FrameMemID MID) = 0; // Notifies that the data won't be used anymore. Memory can be freed. virtual Status IncreaseReference(FrameMemID MID) = 0; // Notifies that the data won't be used anymore. Memory can be freed. virtual Status DecreaseReference(FrameMemID MID) = 0; protected: Mutex m_guard; private: // Declare private copy constructor to avoid accidental assignment FrameAllocator(const FrameAllocator &); FrameAllocator & operator = (const FrameAllocator &); }; } //namespace UMC #endif //__UMC_FRAME_ALLOCATOR_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_frame_data.h000066400000000000000000000246371443134507600312420ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_FRAME_DATA_H__ #define __UMC_FRAME_DATA_H__ #include "umc_defs.h" #include "umc_structures.h" #include "umc_dynamic_cast.h" #include "umc_frame_allocator.h" #include /* USAGE MODEL: I. Initialization of VideoData parameters. It has to be done after construction or after Close. A. Simplest case. No additional planes, planes have equal bitdepth. 1. Set required alignment for data with SetAlignment. Default is the sample size. 2. Init(w,h,ColorFormat[,bitdepth]). Default bitdepth is derived from format. B. Advanced case 1. Init(w,h,nplanes[,bitdepth]) and SetAlignment if required before or after. 2. Modify bitdepth or sample size for planes where necessary 3. Call SetColorFormat. It is the only moment to call this method. This stage fill all internal information about planes, including pitches. After this no more changes to parameters shall be introduced. Function GetMappingSize can be called now to determine required quantity of memory for all planes taking into account current alignment. All other Get methods except of GetPlanePointer are possible to use. II. Link to memory. These operations assign all plane pointers. After that MediaData::GetDataPointer will return aligned beginning of the first plane, MediaData::GetDataSize will return value equal to MappingSize, MediaData::GetBufferPointer can differ from DataPointer due to aligning Two ways: A. Allocation using Alloc. BufferSize will be MappingSize + alignment. B. Call SetBufferPointer(bufsize). After that BufferSize will be bufsize. Method ReleaseImage cancels this operations (unlink from memory). These methods only work with continuously located planes. III. Operations which don't change plane parameters, like SetFrameType, can be used at any moment. Operations SetPlanePointer and SetPlanePitch allow working with separate planes or without specified ColorFormat but have to be used with care. Functions like GetMappingSize and GetPlaneInfo can provide incorrect results. Note: parent class methods GetDataPointer, MoveDataPointer operator= shouldn't be used. */ namespace UMC { class VideoDataInfo { DYNAMIC_CAST_DECL_BASE(VideoDataInfo) public: enum PictureStructure { PS_TOP_FIELD = 1, PS_BOTTOM_FIELD = 2, PS_FRAME = PS_TOP_FIELD | PS_BOTTOM_FIELD, PS_TOP_FIELD_FIRST = PS_FRAME | 4, PS_BOTTOM_FIELD_FIRST = PS_FRAME | 8 }; // DEBUG : to use types at umc_structure.h struct PlaneInfo { mfxSize m_ippSize; // width and height of the plane int32_t m_iSampleSize; // sample size (in bytes) int32_t m_iSamples; // number of samples per plane element int32_t m_iBitDepth; // number of significant bits per sample (should be <= 8*m_iSampleSize) int32_t m_iWidthScale; // Horizontal downsampling factor int32_t m_iHeightScale; // Vertical downsampling factor }; VideoDataInfo(void); virtual ~VideoDataInfo(void); // Initialize. Only remembers image characteristics for future. virtual Status Init(int32_t iWidth, int32_t iHeight, ColorFormat cFormat, int32_t iBitDepth = 8); void Close(); inline int32_t GetPlaneBitDepth(uint32_t iPlaneNumber) const; Status SetPlaneSampleSize(int32_t iSampleSize, uint32_t iPlaneNumber); inline uint32_t GetPlaneSampleSize(uint32_t iPlaneNumber) const; inline ColorFormat GetColorFormat() const; inline Status SetAspectRatio(int32_t iHorzAspect, int32_t iVertAspect); inline Status GetAspectRatio(int32_t *piHorzAspect, int32_t *piVertAspect) const; inline Status SetPictureStructure(PictureStructure picStructure); inline PictureStructure GetPictureStructure() const; inline uint32_t GetNumPlanes() const; inline uint32_t GetWidth() const; inline uint32_t GetHeight() const; size_t GetSize() const; const PlaneInfo* GetPlaneInfo(uint32_t iPlaneNumber) const; void SetPadding(); void GetPadding() const; protected: enum { NUM_PLANES = 4 }; PlaneInfo m_pPlaneData[NUM_PLANES]; // pointer to allocated planes info uint32_t m_iPlanes; // number of initialized planes mfxSize m_ippSize; // dimension of the image ColorFormat m_ColorFormat; // color format of image PictureStructure m_picStructure; // variants: progressive frame, top first, bottom first, only top, only bottom int32_t m_iHorzAspect; // aspect ratio: pixel width/height proportion int32_t m_iVertAspect; // default 1,1 - square pixels // Set color format and planes' information Status SetColorFormat(ColorFormat cFormat); Status Init(int32_t iWidth, int32_t iHeight, int32_t iPlanes, int32_t iBitDepth); }; inline int32_t VideoDataInfo::GetPlaneBitDepth(uint32_t iPlaneNumber) const { // check error(s) if (NUM_PLANES <= iPlaneNumber) return 0; return m_pPlaneData[iPlaneNumber].m_iBitDepth; } inline uint32_t VideoDataInfo::GetPlaneSampleSize(uint32_t iPlaneNumber) const { // check error(s) if (NUM_PLANES <= iPlaneNumber) return 0; return m_pPlaneData[iPlaneNumber].m_iSampleSize; } inline ColorFormat VideoDataInfo::GetColorFormat(void) const { return m_ColorFormat; } inline Status VideoDataInfo::SetAspectRatio(int32_t iHorzAspect, int32_t iVertAspect) { if ((1 > iHorzAspect) || (1 > iVertAspect)) return UMC_ERR_INVALID_STREAM; m_iHorzAspect = iHorzAspect; m_iVertAspect = iVertAspect; return UMC_OK; } inline Status VideoDataInfo::GetAspectRatio(int32_t *piHorzAspect, int32_t *piVertAspect) const { if ((NULL == piHorzAspect) || (NULL == piVertAspect)) return UMC_ERR_NULL_PTR; *piHorzAspect = m_iHorzAspect; *piVertAspect = m_iVertAspect; return UMC_OK; } inline Status VideoDataInfo::SetPictureStructure(PictureStructure picStructure) { if ((PS_TOP_FIELD != picStructure) && (PS_BOTTOM_FIELD != picStructure) && (PS_FRAME != picStructure) && (PS_TOP_FIELD_FIRST != picStructure) && (PS_BOTTOM_FIELD_FIRST != picStructure)) return UMC_ERR_INVALID_STREAM; m_picStructure = picStructure; return UMC_OK; } inline VideoDataInfo::PictureStructure VideoDataInfo::GetPictureStructure() const { return m_picStructure; } inline uint32_t VideoDataInfo::GetNumPlanes() const { return m_iPlanes; } inline uint32_t VideoDataInfo::GetWidth() const { return m_ippSize.width; } inline uint32_t VideoDataInfo::GetHeight() const { return m_ippSize.height; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Time //////////////////////////////////////////////////////////////////////////////////////////////////////////////// class FrameTime { public: FrameTime(); virtual ~FrameTime() {} virtual void Reset(); // return time stamp of media data virtual double GetTime(void) const { return m_pts_start; } // return time stamp of media data, start and end virtual Status GetTime(double& start, double& end) const; // Set time stamp of media data block; virtual Status SetTime(double start, double end = 0); private: double m_pts_start; // (double) start media PTS double m_pts_end; // (double) finish media PTS }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FrameData //////////////////////////////////////////////////////////////////////////////////////////////////////////////// class FrameData : public FrameTime { public: struct PlaneMemoryInfo { uint8_t* m_planePtr; size_t m_pitch; }; struct FrameAuxInfo { void* ptr; size_t size; int type; bool operator==(FrameAuxInfo const& i) const { return type == i.type; } }; FrameData(); FrameData(const FrameData & fd); virtual ~FrameData(); const VideoDataInfo * GetInfo() const; const PlaneMemoryInfo * GetPlaneMemoryInfo(uint32_t plane) const; void Init(const VideoDataInfo * info, FrameMemID memID = FRAME_MID_INVALID, FrameAllocator * frameAlloc = 0); void Close(); FrameMemID GetFrameMID() const; FrameMemID Release(); void SetPlanePointer(uint8_t* planePtr, uint32_t plane, size_t pitch); void SetAuxInfo(void* ptr, size_t size, int type); void ClearAuxInfo(int type); FrameAuxInfo* GetAuxInfo(int type) { return const_cast(const_cast(this)->GetAuxInfo(type)) ; } FrameAuxInfo const* GetAuxInfo(int type) const; FrameData& operator=(const FrameData& ); bool m_locked; protected: enum { NUM_PLANES = 4 }; VideoDataInfo m_Info; FrameMemID m_FrameMID; FrameAllocator* m_FrameAlloc; PlaneMemoryInfo m_PlaneInfo[NUM_PLANES]; std::list m_AuxInfo; }; } // namespace UMC #endif // __UMC_FRAME_DATA_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_media_data.h000066400000000000000000000130401443134507600312110ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MEDIA_DATA_H__ #define __UMC_MEDIA_DATA_H__ #include "umc_structures.h" #include "umc_dynamic_cast.h" #include namespace UMC { class MediaData { DYNAMIC_CAST_DECL_BASE(MediaData) public: enum MediaDataFlags { FLAG_VIDEO_DATA_NOT_FULL_FRAME = 1, FLAG_VIDEO_DATA_NOT_FULL_UNIT = 2, FLAG_VIDEO_DATA_END_OF_STREAM = 4 }; struct AuxInfo { void* ptr; size_t size; int type; bool operator==(AuxInfo const& i) const { return type == i.type; } }; // Default constructor MediaData(size_t length = 0); // Copy constructor MediaData(const MediaData &another); // Destructor virtual ~MediaData(); // Release object virtual Status Close(void); // Allocate buffer virtual Status Alloc(size_t length); // Get an address of the beginning of the buffer. // This pointer could not be equal to the beginning of valid data. virtual void* GetBufferPointer(void) const { return m_pBufferPointer; } // Get an address of the beginning of valid data. // This pointer could not be equal to the beginning of the buffer. virtual void* GetDataPointer(void) { return m_pDataPointer; } // Return size of the buffer virtual size_t GetBufferSize(void) const { return m_nBufferSize; } // Return size of valid data in the buffer virtual size_t GetDataSize(void) const { return m_nDataSize; } // Set the pointer to a buffer allocated by an user. // The bytes variable defines the size of the buffer. // Size of valid data is set to zero virtual Status SetBufferPointer(uint8_t* ptr, size_t bytes); // Set size of valid data in the buffer. // Valid data is supposed to be placed from the beginning of the buffer. virtual Status SetDataSize(size_t bytes); // Move data pointer inside and decrease or increase data size virtual Status MoveDataPointer(int32_t bytes); // return time stamp of media data virtual double GetTime(void) const { return m_pts_start; } // return time stamp of media data, start and end virtual Status GetTime(double& start, double& end) const; // Set time stamp of media data block; virtual Status SetTime(double start, double end = 0); void SetAuxInfo(void* ptr, size_t size, int type); void ClearAuxInfo(int type); AuxInfo* GetAuxInfo(int type) { return const_cast(const_cast(this)->GetAuxInfo(type)) ; } AuxInfo const* GetAuxInfo(int type) const; // Set frame type inline Status SetFrameType(FrameType ft); // Get frame type inline FrameType GetFrameType(void) const; // Set Invalid state inline void SetInvalid(int32_t isInvalid) { m_isInvalid = isInvalid; } // Get Invalid state inline int32_t GetInvalid(void) const { return m_isInvalid; } // Set data pointer to beginning of buffer and data size to zero virtual Status Reset(); MediaData& operator=(const MediaData&); // Move data to another MediaData virtual Status MoveDataTo(MediaData* dst); inline void SetFlags(uint32_t flags); inline uint32_t GetFlags() const; protected: double m_pts_start; // (double) start media PTS double m_pts_end; // (double) finish media PTS size_t m_nBufferSize; // (size_t) size of buffer size_t m_nDataSize; // (size_t) quantity of data in buffer uint8_t* m_pBufferPointer; uint8_t* m_pDataPointer; FrameType m_frameType; // type of the frame int32_t m_isInvalid; // data is invalid when set uint32_t m_flags; // Actually this variable should has type bool. // But some compilers generate poor executable code. // On count of this, we use type uint32_t. uint32_t m_bMemoryAllocated; // (uint32_t) is memory owned by object std::list m_AuxInfo; }; inline Status MediaData::SetFrameType(FrameType ft) { // check error(s) if ((ft < NONE_PICTURE) || (ft > D_PICTURE)) return UMC_ERR_INVALID_STREAM; m_frameType = ft; return UMC_OK; } // VideoData::SetFrameType() inline FrameType MediaData::GetFrameType(void) const { return m_frameType; } // VideoData::GetFrameType() inline void MediaData::SetFlags(uint32_t flags) { m_flags = flags; } inline uint32_t MediaData::GetFlags() const { return m_flags; } } // namespace UMC #endif /* __UMC_MEDIA_DATA_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_media_data_ex.h000066400000000000000000000046551443134507600317210ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MEDIA_DATA_EX_H__ #define __UMC_MEDIA_DATA_EX_H__ #include "umc_media_data.h" namespace UMC { class MediaDataEx : public MediaData { DYNAMIC_CAST_DECL(MediaDataEx, MediaData) public: class _MediaDataEx{ public: uint32_t count; uint32_t index; unsigned long long bstrm_pos; uint32_t *offsets; uint32_t *values; uint32_t limit; _MediaDataEx() { count = 0; index = 0; bstrm_pos = 0; limit = 2000; offsets = (uint32_t*)malloc(sizeof(uint32_t)*limit); values = (uint32_t*)malloc(sizeof(uint32_t)*limit); } virtual ~_MediaDataEx() { if(offsets) { free(offsets); offsets = 0; } if(values) { free(values); values = 0; } limit = 0; } }; // Default constructor MediaDataEx() { m_exData = NULL; }; // Destructor virtual ~MediaDataEx(){}; _MediaDataEx* GetExData() { return m_exData; }; void SetExData(_MediaDataEx* pDataEx) { m_exData = pDataEx; }; protected: _MediaDataEx *m_exData; }; } #endif //__UMC_MEDIA_DATA_EX_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_memory_allocator.h000066400000000000000000000055441443134507600325230ustar00rootroot00000000000000// Copyright (c) 2006-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MEMORY_ALLOCATOR_H__ #define __UMC_MEMORY_ALLOCATOR_H__ #include "umc_defs.h" #include "umc_structures.h" #include "umc_dynamic_cast.h" #include "umc_mutex.h" #define MID_INVALID 0 namespace UMC { typedef size_t MemID; enum UMC_ALLOC_FLAGS { UMC_ALLOC_PERSISTENT = 0x01, UMC_ALLOC_FUNCLOCAL = 0x02 }; class MemoryAllocatorParams { DYNAMIC_CAST_DECL_BASE(MemoryAllocatorParams) public: MemoryAllocatorParams(){} virtual ~MemoryAllocatorParams(){} }; class MemoryAllocator { DYNAMIC_CAST_DECL_BASE(MemoryAllocator) public: MemoryAllocator(void){} virtual ~MemoryAllocator(void){} // Initiates object virtual Status Init(MemoryAllocatorParams *) { return UMC_OK;} // Closes object and releases all allocated memory virtual Status Close() = 0; // Allocates or reserves physical memory and returns unique ID // Sets lock counter to 0 virtual Status Alloc(MemID *pNewMemID, size_t Size, uint32_t Flags, uint32_t Align = 16) = 0; // Lock() provides pointer from ID. If data is not in memory (swapped) // prepares (restores) it. Increases lock counter virtual void* Lock(MemID MID) = 0; // Unlock() decreases lock counter virtual Status Unlock(MemID MID) = 0; // Notifies that the data won't be used anymore. Memory can be freed. virtual Status Free(MemID MID) = 0; // Immediately deallocates memory regardless of whether it is in use (locked) or no virtual Status DeallocateMem(MemID MID) = 0; protected: Mutex m_guard; private: // Declare private copy constructor to avoid accidental assignment MemoryAllocator(const MemoryAllocator &); MemoryAllocator & operator = (const MemoryAllocator &); }; } //namespace UMC #endif //__UMC_MEMORY_ALLOCATOR_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_structures.h000066400000000000000000000705051443134507600313750ustar00rootroot00000000000000// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_STRUCTURES_H__ #define __UMC_STRUCTURES_H__ #include #include #ifdef _MSVC_LANG #pragma warning(push) #pragma warning(disable:26812) #endif #define BSWAP16(x) \ (uint16_t) ((x) >> 8 | (x) << 8) #define BSWAP32(x) \ (uint32_t)(((x) << 24) + \ (((x)&0xff00) << 8) + \ (((x) >> 8)&0xff00) + \ ((uint32_t)(x) >> 24)) #define BSWAP64(x) \ (unsigned long long)(((x) << 56) + \ (((x)&0xff00) << 40) + \ (((x)&0xff0000) << 24) + \ (((x)&0xff000000) << 8) + \ (((x) >> 8)&0xff000000) + \ (((x) >> 24)&0xff0000) + \ (((x) >> 40)&0xff00) + \ ((x) >> 56)) #ifdef _BIG_ENDIAN_ # define BIG_ENDIAN_SWAP16(x) BSWAP16(x) # define BIG_ENDIAN_SWAP32(x) BSWAP32(x) # define BIG_ENDIAN_SWAP64(x) BSWAP64(x) # define LITTLE_ENDIAN_SWAP16(x) (x) # define LITTLE_ENDIAN_SWAP32(x) (x) # define LITTLE_ENDIAN_SWAP64(x) (x) #else /* _BIG_ENDIAN_ */ # define BIG_ENDIAN_SWAP16(x) (x) # define BIG_ENDIAN_SWAP32(x) (x) # define BIG_ENDIAN_SWAP64(x) (x) # define LITTLE_ENDIAN_SWAP16(x) BSWAP16(x) # define LITTLE_ENDIAN_SWAP32(x) BSWAP32(x) # define LITTLE_ENDIAN_SWAP64(x) BSWAP64(x) #endif /* _BIG_ENDIAN_ */ /* macro to create FOURCC */ #ifndef DO_FOURCC #define DO_FOURCC(ch0, ch1, ch2, ch3) \ ( (uint32_t)(uint8_t)(ch0) | ( (uint32_t)(uint8_t)(ch1) << 8 ) | \ ( (uint32_t)(uint8_t)(ch2) << 16 ) | ( (uint32_t)(uint8_t)(ch3) << 24 ) ) #endif /* DO_FOURCC */ /***************************************************************************/ #define UMC_CHECK_STATUS(umcRes) { \ if (umcRes != UMC_OK) { \ return umcRes; \ } \ } #define UMC_CHECK(EXPRESSION, ERR_CODE) { \ if (!(EXPRESSION)) { \ return ERR_CODE; \ } \ } #define UMC_CHECK_PTR(PTR) \ UMC_CHECK(PTR != NULL, UMC_ERR_NULL_PTR) #define UMC_CALL(FUNC) { \ Status _umcRes; \ _umcRes = FUNC; \ if (_umcRes == UMC_OK) { \ } else { \ } \ UMC_CHECK_STATUS(_umcRes); \ } #define UMC_NEW(PTR, TYPE) { \ UMC_DELETE(PTR); \ PTR = new TYPE; \ UMC_CHECK(PTR != NULL, UMC_ERR_ALLOC); \ } #define UMC_NEW_ARR(PTR, TYPE, NUM) { \ UMC_DELETE_ARR(PTR); \ PTR = new TYPE[NUM]; \ UMC_CHECK(PTR != NULL, UMC_ERR_ALLOC); \ } #define UMC_DELETE(PTR) { \ if (PTR) { \ delete PTR; \ PTR = NULL; \ } \ } #define UMC_DELETE_ARR(PTR) { \ if (PTR) { \ delete[] PTR; \ PTR = NULL; \ } \ } #define UMC_ARRAY_SIZE(ARR) (sizeof(ARR)/sizeof(ARR[0])) #define UMC_SET_ZERO(VAR) memset(&(VAR), 0, sizeof(VAR)) /***************************************************************************/ #ifdef __cplusplus namespace UMC { enum SystemStreamType { UNDEF_STREAM = 0x00000000, //unsupported stream type AVI_STREAM = 0x00000001, //AVI RIFF MP4_ATOM_STREAM = 0x00000010, //ISO/IEC 14496-14 stream ASF_STREAM = 0x00000100, //ASF stream H26x_PURE_VIDEO_STREAM = 0x00100000, H261_PURE_VIDEO_STREAM = H26x_PURE_VIDEO_STREAM|0x00010000, H263_PURE_VIDEO_STREAM = H26x_PURE_VIDEO_STREAM|0x00020000, H264_PURE_VIDEO_STREAM = H26x_PURE_VIDEO_STREAM|0x00040000, MPEGx_SYSTEM_STREAM = 0x00001000, //MPEG 1,2 - like system MPEG1_SYSTEM_STREAM = MPEGx_SYSTEM_STREAM|0x00000100,//MPEG 1 system MPEG2_SYSTEM_STREAM = MPEGx_SYSTEM_STREAM|0x00000200,//MPEG 2 system MPEG4_SYSTEM_STREAM = MPEGx_SYSTEM_STREAM|0x00000400,//MPEG 4 system MPEGx_PURE_VIDEO_STREAM = MPEGx_SYSTEM_STREAM|0x00000010,//MPEG 1,2 - like pure video data MPEGx_PURE_AUDIO_STREAM = MPEGx_SYSTEM_STREAM|0x00000020,//MPEG 1,2 - like pure audio data MPEGx_PES_PACKETS_STREAM= MPEGx_SYSTEM_STREAM|0x00000040,//MPEG 1,2 - like pes packets system MPEGx_PROGRAMM_STREAM = MPEGx_SYSTEM_STREAM|0x00000080,//MPEG 1,2 - like program system MPEGx_TRANSPORT_STREAM = MPEGx_SYSTEM_STREAM|0x000000c0,//MPEG 1,2 - like transport system MPEG1_PURE_VIDEO_STREAM = MPEG1_SYSTEM_STREAM|MPEGx_PURE_VIDEO_STREAM, //MPEG1 pure video stream MPEG1_PURE_AUDIO_STREAM = MPEG1_SYSTEM_STREAM|MPEGx_PURE_AUDIO_STREAM, //MPEG1 pure video stream MPEG1_PES_PACKETS_STREAM= MPEG1_SYSTEM_STREAM|MPEGx_PES_PACKETS_STREAM,//MPEG1 pes packets stream MPEG1_PROGRAMM_STREAM = MPEG1_SYSTEM_STREAM|MPEGx_PROGRAMM_STREAM, //MPEG1 program stream MPEG2_PURE_VIDEO_STREAM = MPEG2_SYSTEM_STREAM|MPEGx_PURE_VIDEO_STREAM,//MPEG2 pure video stream MPEG2_PURE_AUDIO_STREAM = MPEG2_SYSTEM_STREAM|MPEGx_PURE_AUDIO_STREAM,//MPEG2 pure audio stream MPEG2_PES_PACKETS_STREAM= MPEG2_SYSTEM_STREAM|MPEGx_PES_PACKETS_STREAM,//MPEG2 pes packets stream MPEG2_PROGRAMM_STREAM = MPEG2_SYSTEM_STREAM|MPEGx_PROGRAMM_STREAM, //MPEG2 program stream MPEG2_TRANSPORT_STREAM = MPEG2_SYSTEM_STREAM|MPEGx_TRANSPORT_STREAM, //MPEG2 transport stream MPEG2_TRANSPORT_STREAM_TTS = MPEG2_SYSTEM_STREAM|MPEGx_TRANSPORT_STREAM | 1, //MPEG2 transport stream with valid packet time stamps MPEG2_TRANSPORT_STREAM_TTS0 = MPEG2_SYSTEM_STREAM|MPEGx_TRANSPORT_STREAM | 2, //MPEG2 transport stream with zero packet time stamps MPEG4_PURE_VIDEO_STREAM = MPEG4_SYSTEM_STREAM|MPEGx_PURE_VIDEO_STREAM,//MPEG4 pure video stream WEB_CAM_STREAM = 0x00100000, ADIF_STREAM = 0x00200000, ADTS_STREAM = 0x00400000, STILL_IMAGE = 0x00800000, VC1_PURE_VIDEO_STREAM = 0x01000000, WAVE_STREAM = 0x02000000, AVS_PURE_VIDEO_STREAM = 0x04000000, FLV_STREAM = 0x08000000, IVF_STREAM = 0x10000000, MJPEG_PURE_VIDEO_STREAM = 0x20000000, WEBM_STREAM = 0x40000000 }; enum AudioStreamType { UNDEF_AUDIO = 0x00000000, PCM_AUDIO = 0x00000001, LPCM_AUDIO = 0x00000002, AC3_AUDIO = 0x00000004, ALAW_AUDIO = 0x00000006, MULAW_AUDIO = 0x00000007, TWINVQ_AUDIO = 0x00000008, DTS_AUDIO = 0x00000016, MPEG1_AUDIO = 0x00000100, MPEG2_AUDIO = 0x00000200, MPEG_AUDIO_LAYER1 = 0x00000010, MPEG_AUDIO_LAYER2 = 0x00000020, MPEG_AUDIO_LAYER3 = 0x00000040, MP1L1_AUDIO = MPEG1_AUDIO|MPEG_AUDIO_LAYER1, MP1L2_AUDIO = MPEG1_AUDIO|MPEG_AUDIO_LAYER2, MP1L3_AUDIO = MPEG1_AUDIO|MPEG_AUDIO_LAYER3, MP2L1_AUDIO = MPEG2_AUDIO|MPEG_AUDIO_LAYER1, MP2L2_AUDIO = MPEG2_AUDIO|MPEG_AUDIO_LAYER2, MP2L3_AUDIO = MPEG2_AUDIO|MPEG_AUDIO_LAYER3, VORBIS_AUDIO = 0x00000400, AAC_AUDIO = 0x00000800, AAC_FMT_UNDEF = 0x00000000, /// Undefined stream format, the decoder have to identify by bitstream AAC_FMT_RAW = 0x00000001, /// Raw input stream format, the first frame keeps init information AAC_FMT_EX_GA = 0x00000010, /// GASpecificConfig header within the first frame. AAC_MPEG4_STREAM = AAC_AUDIO | AAC_FMT_RAW | AAC_FMT_EX_GA, AMR_NB_AUDIO = 0x00000777, //narrow band amr AMR_WB_AUDIO = 0x00000778, //wide band amr WMA_AUDIO = 0x00001000 // WMA, WMA Pro, WMA Losless }; enum TrickModesType { UMC_TRICK_MODES_NO = 0x00000000, UMC_TRICK_MODES_FORWARD = 0x00000001, UMC_TRICK_MODES_FAST = 0x00000002, UMC_TRICK_MODES_FASTER = 0x00000004, UMC_TRICK_MODES_SLOW = 0x00000020, UMC_TRICK_MODES_SLOWER = 0x00000040, UMC_TRICK_MODES_REVERSE = 0x00000200, UMC_TRICK_MODES_FFW_FAST = UMC_TRICK_MODES_FAST | UMC_TRICK_MODES_FORWARD, UMC_TRICK_MODES_FFW_FASTER = UMC_TRICK_MODES_FASTER | UMC_TRICK_MODES_FORWARD, UMC_TRICK_MODES_SFW_SLOW = UMC_TRICK_MODES_SLOW | UMC_TRICK_MODES_FORWARD, UMC_TRICK_MODES_SFW_SLOWER = UMC_TRICK_MODES_SLOWER | UMC_TRICK_MODES_FORWARD, UMC_TRICK_MODES_FR_FAST = UMC_TRICK_MODES_FAST | UMC_TRICK_MODES_REVERSE, UMC_TRICK_MODES_FR_FASTER = UMC_TRICK_MODES_FASTER | UMC_TRICK_MODES_REVERSE, UMC_TRICK_MODES_SR_SLOW = UMC_TRICK_MODES_SLOW | UMC_TRICK_MODES_REVERSE, UMC_TRICK_MODES_SR_SLOWER = UMC_TRICK_MODES_SLOWER | UMC_TRICK_MODES_REVERSE }; enum AudioStreamSubType { UNDEF_AUDIO_SUBTYPE = 0x00000000, AAC_LC_PROFILE = 0x00000001, AAC_LTP_PROFILE = 0x00000002, AAC_MAIN_PROFILE = 0x00000004, AAC_SSR_PROFILE = 0x00000008, AAC_HE_PROFILE = 0x00000010, AAC_ALS_PROFILE = 0x00000020 }; enum VideoStreamType { UNDEF_VIDEO = 0x00000000, UNCOMPRESSED_VIDEO = 0x00000001, MPEG1_VIDEO = 0x00000011, MPEG2_VIDEO = 0x00000012, MPEG4_VIDEO = 0x00000014, H261_VIDEO = 0x00000120, H263_VIDEO = 0x00000140, H264_VIDEO = 0x00000180, DIGITAL_VIDEO_SD = 0x00001200, DIGITAL_VIDEO_50 = 0x00001400, DIGITAL_VIDEO_HD = 0x00001800, DIGITAL_VIDEO_SL = 0x00002000, WMV_VIDEO = 0x00010000, MJPEG_VIDEO = 0x00020000, YV12_VIDEO = 0x00040000, VC1_VIDEO = 0x00050000, AVS_VIDEO = 0x00060000, VP8_VIDEO = 0x00070000, VP9_VIDEO = 0x00080000, HEVC_VIDEO = 0x00100000, AV1_VIDEO = 0x00200000 }; enum VideoRenderType { DEF_VIDEO_RENDER = 0, DX_VIDEO_RENDER, BLT_VIDEO_RENDER, GDI_VIDEO_RENDER, GX_VIDEO_RENDER, SDL_VIDEO_RENDER, FB_VIDEO_RENDER, NULL_VIDEO_RENDER, FW_VIDEO_RENDER, MTWREG_VIDEO_RENDER, OVL2_VIDEO_RENDER, DXWCE_VIDEO_RENDER, AGL_VIDEO_RENDER, NO_VIDEO_RENDER, // no render D3D_VIDEO_RENDER }; enum AudioRenderType { DEF_AUDIO_RENDER = 0, DSOUND_AUDIO_RENDER, WINMM_AUDIO_RENDER, ALSA_AUDIO_RENDER, OSS_AUDIO_RENDER, NULL_AUDIO_RENDER, FW_AUDIO_RENDER, COREAUDIO_RENDER, SDL_AUDIO_RENDER }; enum VideoStreamSubType { UNDEF_VIDEO_SUBTYPE = 0x00000000, MPEG4_VIDEO_DIVX5 = 0x00000001, MPEG4_VIDEO_QTIME = 0x00000002, DIGITAL_VIDEO_TYPE_1 = 3, DIGITAL_VIDEO_TYPE_2, MPEG4_VIDEO_DIVX3, MPEG4_VIDEO_DIVX4, MPEG4_VIDEO_XVID, AVC1_VIDEO, H263_VIDEO_SORENSON, VC1_VIDEO_RCV = 0x00110000, VC1_VIDEO_VC1 = 0x00120000, WVC1_VIDEO, WMV3_VIDEO }; enum ColorFormat { NONE = -1, YV12 = 0, // Planar Y, V, U (4:2:0) (note V,U order!) NV12 , // Planar Y, merged U->V (4:2:0) NV16 , // Planar Y, merged U->V (4:2:2) IMC3 , // Planar Y, V, U (4:2:0) (pitchY = pitchU=pitchV) YUY2 , // Composite Y->U->Y->V (4:2:2) UYVY , // Composite U->Y->V->Y (4:2:2) YUV411 , // Planar Y, U, V (4:1:1) YUV420 , // Planar Y, U, V (4:2:0) YUV422 , // Planar Y, U, V (4:2:2) YUV444 , // Planar Y, U, V (4:4:4) AYUV , // Packed A, Y, U, V (4:4:4:4) 8 bit YUV_VC1 , // Planar Y, U, V (4:2:0), VC1 codec specific Y411 , // Composite Y, U, V (4:1:1) Y41P , // Composite Y, U, V (4:1:1) RGB32 , // Composite B->G->R->A RGB24 , // Composite B->G->R RGB565 , // Composite B->G->R, 5 bit per B & R, 6 bit per G RGB555 , // Composite B->G->R->A, 5 bit per component, 1 bit per A RGB444 , // Composite B->G->R->A, 4 bit per component GRAY , // Luminance component only. YUV420A , // Planar Y, U, V, Alpha YUV422A , // Planar Y, U, V, Alpha YUV444A , // Planar Y, U, V, Alpha YVU9 , // Planar Y, U, V GRAYA , // Luminance with Alpha P010 , // Planar YUV 4:2:0 10 bit P016 , // Planar YUV 4:2:0 16 bit P210 , // Planar YUV 4:2:2 10 bit P216 , // Planar YUV 4:2:2 16 bit Y210 , // Packed YUV 4:2:2 10-bit. Y216 , // Packed YUV 4:2:2 16-bit. Y410 , // Packed YUV 4:4:4 10-bit. Y416 , // Packed YUV 4:4:4 16-bit. }; enum FrameType { NONE_PICTURE = 0, I_PICTURE = 1, P_PICTURE = 2, B_PICTURE = 3, D_PICTURE = 4, VIDEO_FRAME = 0x7, AUDIO_FRAME = 0x8 }; enum InterlaceType { PROGRESSIVE = 0, //FIELD_PICTURE = 1, INTERLEAVED_TOP_FIELD_FIRST = 2, INTERLEAVED_BOTTOM_FIELD_FIRST = 3 }; enum // decoding flags { //receiving this flag decoder must output decompressed data //in proper display order, otherwise it will output decompressed data //in decoding order, application is responsible to reorder frames to //before displaying FLAG_VDEC_REORDER = 0x00000004, //next flag describes endian related properties of input data //when set, means that coded data should be accessed by 4-reading operations //for little-endian systems it means that each 4 bytes are swapped //i.e [0]<->[3], [1]<->[2] //for big-endian systems swapping is not required FLAG_VDEC_4BYTE_ACCESS = 0x00000100, ////traditional, not UMC specific behavior ////original byte order, headers before data, return bytes consumed //FLAG_VDEC_COMPATIBLE = 0x00001000, ////external memory is used for frame decoding FLAG_VDEC_EXTERNAL_SURFACE_USE = 0x00002000, // adjust time stamp to 29.97fps on 24fps progressively encoded sequences // if telecining attributes are available in the bitstream FLAG_VDEC_TELECINE_PTS = 0x01000000 }; enum // encoding flags { // The encoder should reorder the incoming frames in the encoding order itself. FLAG_VENC_REORDER = 0x00000004 }; enum // video renderer flags { //render initialized with this flag will render decompressed data from decoder //in proper display order //see FLAG_VDEC_REORDER flag as pair for this FLAG_VREN_REORDER = 0x00000001, FLAG_VREN_CONVERT = 0x00000002, FLAG_VREN_USECOLORKEY = 0x00000004 }; enum AudioChannelConfig { CHANNEL_FRONT_LEFT = 0x1, CHANNEL_FRONT_RIGHT = 0x2, CHANNEL_FRONT_CENTER = 0x4, CHANNEL_LOW_FREQUENCY = 0x8, CHANNEL_BACK_LEFT = 0x10, CHANNEL_BACK_RIGHT = 0x20, CHANNEL_FRONT_LEFT_OF_CENTER = 0x40, CHANNEL_FRONT_RIGHT_OF_CENTER = 0x80, CHANNEL_BACK_CENTER = 0x100, CHANNEL_SIDE_LEFT = 0x200, CHANNEL_SIDE_RIGHT = 0x400, CHANNEL_TOP_CENTER = 0x800, CHANNEL_TOP_FRONT_LEFT = 0x1000, CHANNEL_TOP_FRONT_CENTER = 0x2000, CHANNEL_TOP_FRONT_RIGHT = 0x4000, CHANNEL_TOP_BACK_LEFT = 0x8000, CHANNEL_TOP_BACK_CENTER = 0x10000, CHANNEL_TOP_BACK_RIGHT = 0x20000, CHANNEL_RESERVED = 0x80000000 }; enum // audio renderer flags { FLAG_AREN_VOID = 0x00000001 }; enum // splitter flags { //invalid value UNDEF_SPLITTER = 0x00000000, //audio splitting required in any present in stream AUDIO_SPLITTER = 0x00000001, //video splitting required in any present in stream VIDEO_SPLITTER = 0x00000002, //example if setup VIDEO_SPLITTER && !set AUDIO_SPLITTER, splitter will ignore //any audio elementary stream, only video data request will be valid //audio and video splitting required if any present in stream AV_SPLITTER = AUDIO_SPLITTER|VIDEO_SPLITTER, //main video header (sequence header) is required to return from Init //splitter function, application is responsible to pass it to decoder //as a regular video data for properly decoding consequent data FLAG_VSPL_VIDEO_HEADER_REQ = 0x00000010, //the first video frame is required to return from Init //splitter function, application is responsible to pass it to decoder //as a regular video data for properly decoding consequent data. //The first frame will follow main video header. This flag expands //splitter behavior for FLAG_VSPL_VIDEO_HEADER_REQ case FLAG_VSPL_VIDEO_FRAME_REQ = 0x00000020, FLAG_VSPL_AUDIO_INFO_REQ = 0x00000040, FLAG_VSPL_VIDEO_INFO_REQ = 0x00000080, //next flag describes endian related properties of input data //when set, means that coded data should be accessed by 4-reading operations //for little-endian systems it means that each 4 bytes are swapped //i.e [0]<->[3], [1]<->[2] //for big-endian systems swapping is not required FLAG_VSPL_4BYTE_ACCESS = 0x00000100, ////traditional, not UMC specific behavior ////original byte order, headers before data, return bytes consumed //FLAG_VSPL_COMPATIBLE = 0x00001000, //some splitters may have a behavior to run internal //to prohibit asynchronous splitting use this flag FLAG_VSPL_NO_INTERNAL_THREAD= 0x00002000, // if reposition is not supported FLAG_SPL_REPOSITION_DISABLED= 0x00004000 }; enum // values to select video or audio output channels { SELECT_ANY_VIDEO_PID = 0x00000000, //ask for one of available video streams SELECT_ANY_AUDIO_PID = 0x00000000, //ask for one of available audio streams SELECT_ALL_AUDIO_PIDS = 0xffffffff, //ask for all of available audio streams SELECT_ALL_VIDEO_PIDS = 0xffffffff //ask for all of available video streams }; enum { SINGLE_CLIENT = 0, // Connection oriented with single client per server MULTIPLE_CLIENTS, // Connection oriented with multiple clients per server BROADCAST // Connection less mode }; enum { MAXIMUM_PATH = 1024 }; struct StreamInfo { }; typedef struct sAudioStreamInfo : public StreamInfo { sAudioStreamInfo() : channels(0), sample_frequency(0), bitrate(0), bitPerSample(0), duration(0.0), stream_type(UNDEF_AUDIO) , stream_subtype(UNDEF_AUDIO_SUBTYPE), iProfile(0), iLevel(0), channel_mask(0), streamPID(0), is_protected(false), header(0) { } int32_t channels; // (int32_t) number of audio channels int32_t sample_frequency; // (int32_t) sample rate in Hz uint32_t bitrate; // (uint32_t) bitstream in bps uint32_t bitPerSample; // (uint32_t) 0 if compressed double duration; // (double) duration of the stream AudioStreamType stream_type; // (AudioStreamType) general type of stream AudioStreamSubType stream_subtype; // (AudioStreamSubType) minor type of stream int32_t iProfile; // profile int32_t iLevel; // level uint32_t channel_mask; // (uint32_t) channel mask uint32_t streamPID; // (uint32_t) unique ID bool is_protected; // audio is encrypted uint32_t header; // (uint32_t) can carry audio header (4-bytes) } AudioStreamInfo; typedef struct sClipInfo { int32_t width; // (int32_t) width of media int32_t height; // (int32_t) height of media } ClipInfo; typedef struct sVideoStreamInfo : public StreamInfo { sVideoStreamInfo() : color_format(YV12), bitrate(0), aspect_ratio_width(0), aspect_ratio_height(0), framerate(0.0) , duration(0.0), interlace_type(PROGRESSIVE), stream_type(UNDEF_VIDEO) , stream_subtype(UNDEF_VIDEO_SUBTYPE), streamPID(0), profile(0), level(0) { clip_info.width = 0; clip_info.height = 0; disp_clip_info.width = 0; disp_clip_info.height = 0; } ClipInfo clip_info; // (ClipInfo) size of video stream ClipInfo disp_clip_info; ColorFormat color_format; // (ColorFormat) color format of uncompressed video uint32_t bitrate; // (uint32_t) bitrate of video int32_t aspect_ratio_width; // (int32_t) pixel aspect ratio int32_t aspect_ratio_height; // (int32_t) pixel aspect ratio double framerate; // (double) frame rate of video double duration; // (double) duration of media stream InterlaceType interlace_type; // (InterlaceType) interlaced info VideoStreamType stream_type; // (VideoStreamType) video stream type VideoStreamSubType stream_subtype; // (VideoStreamSubType) video stream type uint32_t streamPID; // (uint32_t) unique ID int32_t profile; // (int32_t) profile int32_t level; // (int32_t) level } VideoStreamInfo; typedef struct sSystemStreamInfo { double muxrate; // (double) stream bitrate SystemStreamType stream_type; // (SystemStreamType) stream type } SystemStreamInfo; struct sRECT { sRECT(): left(0), top(0), right(0), bottom(0) {} int16_t left; int16_t top; int16_t right; int16_t bottom; inline void SwapBigEndian() { left = BIG_ENDIAN_SWAP16(left); top = BIG_ENDIAN_SWAP16(top); right = BIG_ENDIAN_SWAP16(right); bottom = BIG_ENDIAN_SWAP16(bottom); } }; enum eUMC_Status { UMC_OK = VM_OK, //0, // no error UMC_ERR_FAILED = VM_OPERATION_FAILED, //-999, UMC_ERR_NOT_INITIALIZED = VM_NOT_INITIALIZED, //-998, UMC_ERR_TIMEOUT = VM_TIMEOUT, //-987, UMC_ERR_NOT_ENOUGH_DATA = VM_NOT_ENOUGH_DATA, //-996, // not enough input data UMC_ERR_NULL_PTR = VM_NULL_PTR, // null pointer in input parameters UMC_ERR_INIT =-899, // failed to initialize codec UMC_ERR_SYNC =-897, // can't find sync word in buffer UMC_ERR_NOT_ENOUGH_BUFFER =-896, // not enough buffer to put output data UMC_ERR_END_OF_STREAM =-895, UMC_ERR_OPEN_FAILED =-894, // failed to open file/device UMC_ERR_ALLOC =-883, // failed to allocate memory UMC_ERR_LOCK =-882, // failed to lock memory UMC_ERR_INVALID_STREAM =-881, UMC_ERR_UNSUPPORTED =-879, UMC_ERR_NOT_IMPLEMENTED =-878, UMC_ERR_INVALID_PARAMS =-876, UMC_ERR_NEED_FORCE_OUTPUT =-875, UMC_ERR_GPU_HANG =-874, UMC_WRN_INVALID_STREAM = 1, UMC_WRN_REPOSITION_INPROGRESS = 2, UMC_WRN_INFO_NOT_READY = 3, UMC_NTF_NEW_RESOLUTION = 7 }; typedef int32_t Status; #ifdef __cplusplus extern "C" { #endif const vm_char* GetErrString(Status ErrCode); const vm_char* GetStreamTypeString(SystemStreamType Code); const vm_char* GetFormatTypeString(ColorFormat Code); const vm_char* GetAudioTypeString(AudioStreamType Code); const vm_char* GetVideoTypeString(VideoStreamType Code); const vm_char* GetVideoRenderTypeString(VideoRenderType Code); const vm_char* GetAudioRenderTypeString(AudioRenderType Code); #ifdef __cplusplus } // extern "C" #endif enum { DEFAULT_ALIGN_VALUE = 16 }; enum { ERROR_FRAME_MINOR = 0x00000001, ERROR_FRAME_MAJOR = 0x00000002, ERROR_FRAME_REFERENCE_FRAME = 0x00000004, ERROR_FRAME_DPB = 0x00000008, ERROR_FRAME_RECOVERY = 0x00000010, // major artifacts at recovery point ERROR_FRAME_TOP_FIELD_ABSENT = 0x00000020, ERROR_FRAME_BOTTOM_FIELD_ABSENT = 0x00000040, ERROR_FRAME_SHORT_TERM_STUCK = 0x00000100, // used to mark ST which potentially can get stuck in DPB due to frame gaps ERROR_FRAME_DEVICE_FAILURE = 0x80000000 // if this bit is set, this means the error is [UMC::Status] code }; // template to align a pointer template inline T align_pointer(void *pv, size_t lAlignValue = DEFAULT_ALIGN_VALUE) { // some compilers complain to conversion to/from // pointer types from/to integral types. return (T) ((((uint8_t *) pv - (uint8_t *) 0) + (lAlignValue - 1)) & ~(lAlignValue - 1)); } // template to get minimum value template inline value_t get_min(value_t value, min_t another) { return ((value < (value_t) another) ? (value) : (another)); } // template to get maximum value template inline value_t get_max(value_t value, max_t another) { return ((value > (value_t) another) ? (value) : (another)); } #ifndef DISALLOW_COPY_AND_ASSIGN #define DISALLOW_COPY_AND_ASSIGN(className) \ className(const className&); \ void operator=(const className&) #endif } // namespace UMC #endif /* __cplusplus */ #ifdef _MSVC_LANG #pragma warning(pop) #endif #endif /* __UMC_STRUCTURES_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_va_base.h000066400000000000000000000327401443134507600305510ustar00rootroot00000000000000// Copyright (c) 2006-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VA_BASE_H__ #define __UMC_VA_BASE_H__ #include #include "mfx_common.h" #include "mfxstructures-int.h" #ifdef __cplusplus #include "umc_structures.h" #include "umc_dynamic_cast.h" #ifdef _MSVC_LANG #pragma warning(disable : 4201) #pragma warning(disable : 26812) #endif #include #include #include #include #include #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) #include #endif #ifndef UNREFERENCED_PARAMETER #define UNREFERENCED_PARAMETER(p) (void) (p); #endif namespace UMC { #define VA_COMBINATIONS(CODEC) \ CODEC##_VLD = VA_##CODEC | VA_VLD enum VideoAccelerationProfile { UNKNOWN = 0, // Codecs VA_CODEC = 0x00ff, VA_MPEG2 = 0x0001, VA_H264 = 0x0003, VA_VC1 = 0x0004, VA_JPEG = 0x0005, VA_VP8 = 0x0006, VA_H265 = 0x0007, VA_VP9 = 0x0008, #if defined(MFX_ENABLE_AV1_VIDEO_CODEC) VA_AV1 = 0x0009, #endif // Entry points VA_ENTRY_POINT = 0xfff00, VA_VLD = 0x00400, VA_PROFILE = 0xff000, VA_PROFILE_MVC = 0x04000, VA_PROFILE_MVC_MV = 0x05000, VA_PROFILE_MVC_STEREO = 0x06000, VA_PROFILE_MVC_STEREO_PROG = 0x07000, VA_PROFILE_422 = 0x0a000, VA_PROFILE_444 = 0x0b000, VA_PROFILE_10 = 0x10000, VA_PROFILE_REXT = 0x20000, VA_PROFILE_12 = 0x40000, VA_PROFILE_SCC = 0x80000, // configurations VA_CONFIGURATION = 0x0ff00000, VA_LONG_SLICE_MODE = 0x00100000, VA_SHORT_SLICE_MODE = 0x00200000, VA_ANY_SLICE_MODE = 0x00300000, MPEG2_VLD = VA_MPEG2 | VA_VLD, H264_VLD = VA_H264 | VA_VLD, H265_VLD = VA_H265 | VA_VLD, VC1_VLD = VA_VC1 | VA_VLD, JPEG_VLD = VA_JPEG | VA_VLD, VP8_VLD = VA_VP8 | VA_VLD, HEVC_VLD = VA_H265 | VA_VLD, VP9_VLD = VA_VP9 | VA_VLD, #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) AV1_VLD = VA_AV1 | VA_VLD, AV1_10_VLD = VA_AV1 | VA_VLD | VA_PROFILE_10, #endif H265_VLD_REXT = VA_H265 | VA_VLD | VA_PROFILE_REXT, H265_10_VLD_REXT = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_10, H265_10_VLD = VA_H265 | VA_VLD | VA_PROFILE_10, H265_VLD_422 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_422, H265_VLD_444 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_444, H265_10_VLD_422 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_10 | VA_PROFILE_422, H265_10_VLD_444 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_10 | VA_PROFILE_444, H265_12_VLD_420 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_12, H265_12_VLD_422 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_12 | VA_PROFILE_422, H265_12_VLD_444 = VA_H265 | VA_VLD | VA_PROFILE_REXT | VA_PROFILE_12 | VA_PROFILE_444, H265_VLD_SCC = VA_H265 | VA_VLD | VA_PROFILE_SCC, H265_VLD_444_SCC = VA_H265 | VA_VLD | VA_PROFILE_SCC | VA_PROFILE_444, H265_10_VLD_SCC = VA_H265 | VA_VLD | VA_PROFILE_SCC | VA_PROFILE_10, H265_10_VLD_444_SCC = VA_H265 | VA_VLD | VA_PROFILE_SCC | VA_PROFILE_10 | VA_PROFILE_444, VP9_10_VLD = VA_VP9 | VA_VLD | VA_PROFILE_10, VP9_VLD_422 = VA_VP9 | VA_VLD | VA_PROFILE_422, VP9_VLD_444 = VA_VP9 | VA_VLD | VA_PROFILE_444, VP9_10_VLD_422 = VA_VP9 | VA_VLD | VA_PROFILE_10 | VA_PROFILE_422, VP9_10_VLD_444 = VA_VP9 | VA_VLD | VA_PROFILE_10 | VA_PROFILE_444, VP9_12_VLD_420 = VA_VP9 | VA_VLD | VA_PROFILE_12, VP9_12_VLD_444 = VA_VP9 | VA_VLD | VA_PROFILE_12 | VA_PROFILE_444, }; #define MAX_BUFFER_TYPES 32 enum VideoAccelerationPlatform { VA_UNKNOWN_PLATFORM = 0, VA_PLATFORM = 0x0f0000, VA_DXVA2 = 0x020000, VA_LINUX = 0x030000, }; class UMCVACompBuffer; class ProtectedVA; class VideoProcessingVA; #if defined(MFX_ENABLE_PXP) class PXPVA; #endif // MFX_ENABLE_PXP enum eUMC_VA_Status { UMC_ERR_DEVICE_FAILED = -2000, UMC_ERR_DEVICE_LOST = -2001, UMC_ERR_FRAME_LOCKED = -2002 }; /////////////////////////////////////////////////////////////////////////////////// class FrameAllocator; class VideoAcceleratorParams { DYNAMIC_CAST_DECL_BASE(VideoAcceleratorParams); public: VideoAcceleratorParams() : m_pVideoStreamInfo(nullptr) , m_iNumberSurfaces(0) , m_protectedVA(0) , m_needVideoProcessingVA(false) , m_allocator(nullptr) , m_surf(nullptr) #if defined(MFX_ENABLE_PXP) , m_pPXPCtxHdl(nullptr) #endif // MFX_ENABLE_PXP {} virtual ~VideoAcceleratorParams(){} VideoStreamInfo *m_pVideoStreamInfo; int32_t m_iNumberSurfaces; int32_t m_protectedVA; bool m_needVideoProcessingVA; FrameAllocator *m_allocator; // if extended surfaces exist void* *m_surf; #if defined(MFX_ENABLE_PXP) mfxHDL m_pPXPCtxHdl; #endif // MFX_ENABLE_PXP }; class VideoAccelerator { DYNAMIC_CAST_DECL_BASE(VideoAccelerator); public: VideoAccelerator() : m_Profile(UNKNOWN), m_Platform(VA_UNKNOWN_PLATFORM), m_HWPlatform(MFX_HW_UNKNOWN), m_HWDeviceID(0), #if defined(MFX_ENABLE_PROTECT) m_protectedVA(nullptr), #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE m_videoProcessingVA(0), #endif m_allocator(0), m_bShortSlice(false), m_bH264MVCSupport(false), m_isUseStatuReport(true), m_H265ScalingListScanOrder(1) { } virtual ~VideoAccelerator() { Close(); } virtual Status Init(VideoAcceleratorParams* pInfo) = 0; // Initilize and allocate all resources virtual Status Close(); virtual Status Reset(); virtual Status BeginFrame (int32_t index) = 0; // Begin decoding for specified index // Begin decoding for specified index, keep in mind fieldId to sync correctly on task in next SyncTask call. // By default just calls BeginFrame(index). must be overridden by child class virtual Status BeginFrame(int32_t index, uint32_t fieldId ) { // by default just calls BeginFrame(index) (void)fieldId; return BeginFrame(index); } virtual void* GetCompBuffer(int32_t buffer_type, UMCVACompBuffer** buf = NULL, int32_t size = -1, int32_t index = -1) = 0; // request buffer virtual Status Execute () = 0; // execute decoding virtual Status ExecuteExtensionBuffer(void * buffer) = 0; virtual Status ExecuteStatusReportBuffer(void * buffer, int32_t size) = 0; virtual Status SyncTask(int32_t index, void * error = NULL) = 0; virtual Status QueryTaskStatus(int32_t index, void * status, void * error) = 0; virtual Status ReleaseBuffer(int32_t type) = 0; // release buffer virtual Status EndFrame (void * handle = 0) = 0; // end frame virtual Status UnwrapBuffer(mfxMemId /*bufferId*/) { return MFX_ERR_NONE; }; virtual bool IsIntelCustomGUID() const = 0; virtual int32_t GetSurfaceID(int32_t idx) const { return idx; } #if defined(MFX_ENABLE_PROTECT) virtual ProtectedVA * GetProtectedVA() { return m_protectedVA.get(); } #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE virtual VideoProcessingVA * GetVideoProcessingVA() {return m_videoProcessingVA;} #endif virtual bool IsGPUSyncEventEnable() const { #ifdef MFX_ENABLE_HW_BLOCKING_TASK_SYNC_DECODE VideoAccelerationProfile codec = (VideoAccelerationProfile)(m_Profile & VA_CODEC); bool isEnabled = false; switch (codec) { case VA_MPEG2: #if defined (MFX_ENABLE_HW_BLOCKING_TASK_SYNC_MPEG2D) isEnabled = true; #endif break; case VA_H264: #if defined (MFX_ENABLE_HW_BLOCKING_TASK_SYNC_H264D) isEnabled = true; #endif break; case VA_VC1: #if defined (MFX_ENABLE_HW_BLOCKING_TASK_SYNC_VC1D) isEnabled = true; #endif break; case VA_JPEG: #if defined (MFX_ENABLE_HW_BLOCKING_TASK_SYNC_JPEGD) isEnabled = true; #endif break; case VA_VP8: #if defined (MFX_ENABLE_HW_BLOCKING_TASK_SYNC_VP8D) isEnabled = true; #endif break; case VA_H265: #if defined(MFX_ENABLE_HW_BLOCKING_TASK_SYNC_H265D) isEnabled = true; #endif break; case VA_VP9: #if defined(MFX_ENABLE_HW_BLOCKING_TASK_SYNC_VP9D) isEnabled = true; #endif break; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case VA_AV1: #if defined(MFX_ENABLE_HW_BLOCKING_TASK_SYNC_AV1D) isEnabled = true; #endif break; #endif default: break; } return isEnabled; #else return false; #endif } bool IsLongSliceControl() const { return (!m_bShortSlice); }; bool IsMVCSupport() const {return m_bH264MVCSupport; }; bool IsUseStatusReport() const { return m_isUseStatuReport; } void SetStatusReportUsing(bool isUseStatuReport) { m_isUseStatuReport = isUseStatuReport; } int32_t ScalingListScanOrder() const { return m_H265ScalingListScanOrder; } virtual void GetVideoDecoder(void **handle) = 0; /* Contains private data for the [ExecuteExtension] method */ struct ExtensionData { std::pair input; //Pointer & size (in bytes) to private input data passed to the driver. std::pair output; //Pointer & size (in bytes) to private output data reveived from the driver. std::vector resources; //Array of resource pointers passed to the driver }; /* Executes an extended operation on the current frame. */ virtual Status ExecuteExtension(int function, ExtensionData const&) = 0; VideoAccelerationProfile m_Profile; // entry point VideoAccelerationPlatform m_Platform; // DXVA, LinuxVA, etc eMFXHWType m_HWPlatform; mfxU16 m_HWDeviceID; protected: #if defined(MFX_ENABLE_PROTECT) std::shared_ptr m_protectedVA; #endif #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE VideoProcessingVA * m_videoProcessingVA; #endif FrameAllocator * m_allocator; bool m_bShortSlice; bool m_bH264MVCSupport; bool m_isUseStatuReport; int32_t m_H265ScalingListScanOrder; //0 - up-right, 1 - raster . Default is 1 (raster). }; /////////////////////////////////////////////////////////////////////////////////// class UMCVACompBuffer //: public MediaData { public: UMCVACompBuffer() { type = -1; BufferSize = 0; DataSize = 0; ptr = NULL; PVPState = NULL; FirstMb = -1; NumOfMB = -1; FirstSlice = -1; memset(PVPStateBuf, 0, sizeof(PVPStateBuf)); } virtual ~UMCVACompBuffer(){} // Set virtual Status SetBufferPointer(uint8_t *_ptr, size_t bytes) { ptr = _ptr; BufferSize = (int32_t)bytes; return UMC_OK; } virtual void SetDataSize(int32_t size); virtual void SetNumOfItem(int32_t num); virtual Status SetPVPState(void *buf, uint32_t size); // Get int32_t GetType() const { return type; } void* GetPtr() const { return ptr; } int32_t GetBufferSize() const { return BufferSize; } int32_t GetDataSize() const { return DataSize; } void* GetPVPStatePtr()const { return PVPState; } int32_t GetPVPStateSize()const { return (NULL == PVPState ? 0 : sizeof(PVPStateBuf)); } // public fields int32_t FirstMb; int32_t NumOfMB; int32_t FirstSlice; int32_t type; protected: uint8_t PVPStateBuf[16]; void* ptr; void* PVPState; int32_t BufferSize; int32_t DataSize; }; } // namespace UMC #endif // __cplusplus #ifdef _MSVC_LANG #pragma warning(default : 4201) #endif #endif // __UMC_VA_BASE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_video_data.h000066400000000000000000000305041443134507600312440ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VIDEO_DATA_H__ #define __UMC_VIDEO_DATA_H__ #include "umc_defs.h" #include "umc_structures.h" #include "umc_media_data.h" /* USAGE MODEL: I. Initialization of VideoData parameters. It has to be done after construction or after Close. A. Simplest case. No additional planes, planes have equal bitdepth. 1. Set required alignment for data with SetAlignment. Default is the sample size. 2. Init(w,h,ColorFormat[,bitdepth]). Default bitdepth is derived from format. B. Advanced case 1. Init(w,h,nplanes[,bitdepth]) and SetAlignment if required before or after. 2. Modify bitdepth or sample size for planes where necessary 3. Call SetColorFormat. It is the only moment to call this method. This stage fill all internal information about planes, including pitches. After this no more changes to parameters shall be introduced. Function GetMappingSize can be called now to determine required quantity of memory for all planes taking into account current alignment. All other Get methods except of GetPlanePointer are possible to use. II. Link to memory. These operations assign all plane pointers. After that MediaData::GetDataPointer will return aligned beginning of the first plane, MediaData::GetDataSize will return value equal to MappingSize, MediaData::GetBufferPointer can differ from DataPointer due to aligning Two ways: A. Allocation using Alloc. BufferSize will be MappingSize + alignment. B. Call SetBufferPointer(bufsize). After that BufferSize will be bufsize. Method ReleaseImage cancels this operations (unlink from memory). These methods only work with continuously located planes. III. Operations which don't change plane parameters, like SetFrameType, can be used at any moment. Operations SetPlanePointer and SetPlanePitch allow working with separate planes or without specified ColorFormat but have to be used with care. Functions like GetMappingSize and GetPlaneInfo can provide incorrect results. Note: parent class methods GetDataPointer, MoveDataPointer operator= shouldn't be used. */ namespace UMC { enum PictureStructure { PS_TOP_FIELD = 1, PS_BOTTOM_FIELD = 2, PS_FRAME = PS_TOP_FIELD | PS_BOTTOM_FIELD, PS_TOP_FIELD_FIRST = PS_FRAME | 4, PS_BOTTOM_FIELD_FIRST = PS_FRAME | 8 }; struct LVASurface { int32_t index; void* data; }; // converts display aspect ratio to pixel AR // or vise versa with exchanged width and height Status DARtoPAR(int32_t width, int32_t height, int32_t dar_h, int32_t dar_v, int32_t *par_h, int32_t *par_v); class VideoData : public MediaData { DYNAMIC_CAST_DECL(VideoData, MediaData) public: struct PlaneInfo { uint8_t* m_pPlane; // pointer to plane data mfxSize m_ippSize; // width and height of the plane int32_t m_iSampleSize; // sample size (in bytes) int32_t m_iSamples; // number of samples per plane element int32_t m_iBitDepth; // number of significant bits per sample (should be <= 8*m_iSampleSize) size_t m_nPitch; // plane pitch (should be >= width*m_iSamples*m_iSampleSize) size_t m_nOffset; // Offset from the beginning of aligned memory block size_t m_nMemSize; // size of occupied memory (pitch*height) int32_t m_iWidthDiv; // Horizontal downsampling factor int32_t m_iHeightDiv; // Vertical downsampling factor }; // Default constructor VideoData(void); // Destructor virtual ~VideoData(void); // operator= VideoData & operator = (const VideoData &par); // Initialize. Only remembers image characteristics for future. virtual Status Init(int32_t iWidth, int32_t iHeight, ColorFormat cFormat, int32_t iBitDepth = 0); // Initialize. Only remembers image characteristics for future. // Should be followed by SetColorFormat virtual Status Init(int32_t iWidth, int32_t iHeight, int32_t iPlanes, int32_t iBitDepth = 8); // Allocate buffer for video data and initialize it. virtual Status Alloc(size_t requredSize = 0) override; // Reset all plane pointers, release memory if allocated by Alloc virtual Status ReleaseImage(void); // Release video data and all internal memory. Inherited. virtual Status Close(void) override; // Set buffer pointer, assign all pointers. Inherited. // VideoData parameters must have been prepared virtual Status SetBufferPointer(uint8_t *pbBuffer, size_t nSize) override; // Set common Alignment Status SetAlignment(int32_t iAlignment); // Get Alignment inline int32_t GetAlignment(void) const; // Set plane destination pointer Status SetPlanePointer(void *pDest, int32_t iPlaneNumber); // Get plane destination pointer inline void *GetPlanePointer(int32_t iPlaneNumber); // Set image dimensions Status SetImageSize(int32_t width, int32_t height); // Set plane pitch Status SetPlanePitch(size_t nPitch, int32_t iPlaneNumber); // Get plane pitch inline size_t GetPlanePitch(int32_t iPlaneNumber) const; // Set plane bitdepth Status SetPlaneBitDepth(int32_t iBitDepth, int32_t iPlaneNumber); // Get plane bitdepth inline int32_t GetPlaneBitDepth(int32_t iPlaneNumber) const; // Set plane sample size Status SetPlaneSampleSize(int32_t iSampleSize, int32_t iPlaneNumber); // Get plane sample size inline int32_t GetPlaneSampleSize(int32_t iPlaneNumber) const; // Set color format and planes' information Status SetColorFormat(ColorFormat cFormat); // Get color format inline ColorFormat GetColorFormat(void) const; // Set aspect Ratio inline Status SetAspectRatio(int32_t iHorzAspect, int32_t iVertAspect); // Get aspect Ratio inline Status GetAspectRatio(int32_t *piHorzAspect, int32_t *piVertAspect) const; // Set picture structure inline Status SetPictureStructure(PictureStructure picStructure); // Get picture structure inline PictureStructure GetPictureStructure(void) const; // Convert to other picture structure Status ConvertPictureStructure(PictureStructure newPicStructure); inline int32_t GetNumPlanes(void) const; inline int32_t GetWidth(void) const; inline int32_t GetHeight(void) const; // fills PlaneInfo structure Status GetPlaneInfo(PlaneInfo* pInfo, int32_t iPlaneNumber); // Returns the needed size of a buffer for mapping. virtual size_t GetMappingSize() const; // links plane pointers to surface using provided pitch // all pitches and plane info are updated according to current // color format. // Works only with FourCC formats, which define planes location, // like YV12 or NV12. virtual Status SetSurface(void* ptr, size_t nPitch); // Calculate pitch from mapping size virtual size_t GetPitchFromMappingSize(size_t mappingSize) const; // Crop virtual Status Crop(UMC::sRECT CropArea); protected: PlaneInfo* m_pPlaneData; // pointer to allocated planes info int32_t m_iPlanes; // number of planes mfxSize m_ippSize; // dimension of the image ColorFormat m_ColorFormat; // color format of image PictureStructure m_picStructure; // variants: progressive frame, top first, bottom first, only top, only bottom int32_t m_iHorzAspect; // aspect ratio: pixel width/height proportion int32_t m_iVertAspect; // default 1,1 - square pixels int32_t m_iAlignment; // default 1 uint8_t* m_pbAllocated; // pointer to allocated image buffer private: // Declare private copy constructor to avoid accidental assignment VideoData(const VideoData &); }; // Get Alignment inline int32_t VideoData::GetAlignment(void) const { return m_iAlignment; } // int32_t VideoData::GetAlignment(void) inline void* VideoData::GetPlanePointer(int32_t iPlaneNumber) { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return NULL; return m_pPlaneData[iPlaneNumber].m_pPlane; } // void *VideoData::GetPlanePointer(int32_t iPlaneNumber) inline int32_t VideoData::GetPlaneBitDepth(int32_t iPlaneNumber) const { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return 0; return m_pPlaneData[iPlaneNumber].m_iBitDepth; } // int32_t VideoData::GetPlaneBitDepth(int32_t iPlaneNumber) inline int32_t VideoData::GetPlaneSampleSize(int32_t iPlaneNumber) const { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return 0; return m_pPlaneData[iPlaneNumber].m_iSampleSize; } // int32_t VideoData::GetPlaneSampleSize(int32_t iPlaneNumber) inline size_t VideoData::GetPlanePitch(int32_t iPlaneNumber) const { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return 0; return m_pPlaneData[iPlaneNumber].m_nPitch; } // size_t VideoData::GetPlanePitch(int32_t iPlaneNumber) inline ColorFormat VideoData::GetColorFormat(void) const { return m_ColorFormat; } // ColorFormat VideoData::GetColorFormat(void) inline Status VideoData::SetAspectRatio(int32_t iHorzAspect, int32_t iVertAspect) { if ((1 > iHorzAspect) || (1 > iVertAspect)) return UMC_ERR_INVALID_STREAM; m_iHorzAspect = iHorzAspect; m_iVertAspect = iVertAspect; return UMC_OK; } // Status VideoData::SetAspectRatio(int32_t iHorzAspect, int32_t iVertAspect) inline Status VideoData::GetAspectRatio(int32_t *piHorzAspect, int32_t *piVertAspect) const { if ((NULL == piHorzAspect) || (NULL == piVertAspect)) return UMC_ERR_NULL_PTR; *piHorzAspect = m_iHorzAspect; *piVertAspect = m_iVertAspect; return UMC_OK; } // Status VideoData::GetAspectRatio(int32_t *piHorzAspect, int32_t *piVertAspect) inline Status VideoData::SetPictureStructure(PictureStructure picStructure) { if ((PS_TOP_FIELD != picStructure) && (PS_BOTTOM_FIELD != picStructure) && (PS_FRAME != picStructure) && (PS_TOP_FIELD_FIRST != picStructure) && (PS_BOTTOM_FIELD_FIRST != picStructure)) return UMC_ERR_INVALID_STREAM; m_picStructure = picStructure; return UMC_OK; } // Status VideoData::SetPictureStructure(PictureStructure picStructure) inline PictureStructure VideoData::GetPictureStructure(void) const { return m_picStructure; } // PictureStructure VideoData::GetPictureStructure(void) inline int32_t VideoData::GetNumPlanes(void) const { return m_iPlanes; } // int32_t VideoData::GetNumPlanes(void) inline int32_t VideoData::GetWidth(void) const { return m_ippSize.width; } // int32_t VideoData::GetWidth(void) inline int32_t VideoData::GetHeight(void) const { return m_ippSize.height; } // int32_t VideoData::GetHeight(void) } // namespace UMC #endif // __UMC_VIDEO_DATA_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_video_decoder.h000066400000000000000000000067351443134507600317510ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VIDEO_DECODER_H__ #define __UMC_VIDEO_DECODER_H__ #include "umc_structures.h" #include "umc_video_data.h" #include "umc_base_codec.h" #include "umc_base_color_space_converter.h" namespace UMC { class VideoAccelerator; class VideoDecoderParams : public BaseCodecParams { DYNAMIC_CAST_DECL(VideoDecoderParams, BaseCodecParams) public: // Default constructor VideoDecoderParams(); // Destructor virtual ~VideoDecoderParams(); VideoStreamInfo info; // (VideoStreamInfo) compressed video info uint32_t lFlags; // (uint32_t) decoding flag(s) BaseCodec *pPostProcessing; // (BaseCodec*) pointer to post processing VideoAccelerator *pVideoAccelerator; // pointer to video accelerator }; /******************************************************************************/ class VideoDecoder : public BaseCodec { DYNAMIC_CAST_DECL(VideoDecoder, BaseCodec) public: VideoDecoder(void) : m_PostProcessing(NULL), m_allocatedPostProcessing(NULL) {} // Destructor virtual ~VideoDecoder(void); // BaseCodec methods // Get codec working (initialization) parameter(s) virtual Status GetInfo(BaseCodecParams *info) override; // Set new working parameter(s) virtual Status SetParams(BaseCodecParams *params); // Additional methods // Reset skip frame counter virtual Status ResetSkipCount() = 0; // Increment skip frame counter virtual Status SkipVideoFrame(int32_t) = 0; // Get skip frame counter statistic virtual uint32_t GetNumOfSkippedFrames() = 0; // returns closed capture data virtual Status GetUserData(MediaData* /*pCC*/) { return UMC_ERR_NOT_IMPLEMENTED; } protected: VideoStreamInfo m_ClipInfo; // (VideoStreamInfo) clip info BaseCodec *m_PostProcessing; // (BaseCodec*) pointer to post processing BaseCodec *m_allocatedPostProcessing; // (BaseCodec*) pointer to default post processing allocated by decoder private: // Declare private copy constructor to avoid accidental assignment VideoDecoder(const VideoDecoder &); VideoDecoder & operator = (const VideoDecoder &); }; } // end namespace UMC #endif // __UMC_VIDEO_DECODER_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/include/umc_video_encoder.h000066400000000000000000000053531443134507600317560ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VIDEO_ENCODER_H__ #define __UMC_VIDEO_ENCODER_H__ #include "umc_base_codec.h" namespace UMC { class VideoEncoderParams : public BaseCodecParams { DYNAMIC_CAST_DECL(VideoEncoderParams, BaseCodecParams) public: // Constructor VideoEncoderParams() : numEncodedFrames(0), qualityMeasure(51) { info.clip_info.width = 0; info.clip_info.height = 0; info.color_format = YUV420; info.bitrate = 0; info.aspect_ratio_width = 1; info.aspect_ratio_height = 1; info.framerate = 30; info.duration = 0; info.interlace_type = PROGRESSIVE; info.stream_type = UNDEF_VIDEO; info.stream_subtype = UNDEF_VIDEO_SUBTYPE; info.streamPID = 0; } // Destructor virtual ~VideoEncoderParams(void){} // Read parameter from file virtual Status ReadParamFile(const vm_char * /*ParFileName*/) { return UMC_ERR_NOT_IMPLEMENTED; } VideoStreamInfo info; // (VideoStreamInfo) compressed video info int32_t numEncodedFrames; // (int32_t) number of encoded frames // additional controls int32_t qualityMeasure; // per cent, represent quantization precision }; /******************************************************************************/ class VideoEncoder : public BaseCodec { DYNAMIC_CAST_DECL(VideoEncoder, BaseCodec) public: // Destructor virtual ~VideoEncoder() {}; }; /******************************************************************************/ } // end namespace UMC #endif /* __UMC_VIDEO_ENCODER_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/000077500000000000000000000000001443134507600252725ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_base_codec.cpp000066400000000000000000000036021443134507600307120ustar00rootroot00000000000000// Copyright (c) 2007-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_base_codec.h" using namespace UMC; // Default constructor BaseCodecParams::BaseCodecParams(void) { m_SuggestedOutputSize = 0; m_SuggestedInputSize = 0; lpMemoryAllocator = 0; numThreads = 0; m_pData=NULL; profile = 0; level = 0; } // Constructor BaseCodec::BaseCodec(void) { m_pMemoryAllocator = 0; m_bOwnAllocator = false; } // Destructor BaseCodec::~BaseCodec(void) { BaseCodec::Close(); } // Initialize codec with specified parameter(s) // Has to be called if MemoryAllocator interface is used Status BaseCodec::Init(BaseCodecParams *init) { if (init == 0) return UMC_ERR_NULL_PTR; m_pMemoryAllocator = init->lpMemoryAllocator; return UMC_OK; } // Close all codec resources Status BaseCodec::Close(void) { return UMC_OK; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_frame_data.cpp000066400000000000000000000310271443134507600307300ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "umc_frame_data.h" #include namespace UMC { // Number of planes in format description table. // Number of planes in image can be greater. In this case additional // planes should be supported by the user with functions SetPlanePointer, // SetPlanePitch. enum { MAX_PLANE_NUMBER = 4 }; struct PlaneFormatInfo { int32_t m_iWidthScale; // Horizontal downsampling factor int32_t m_iHeightScale; // Vertical downsampling factor int32_t m_iChannels; // Number of merged channels in the plane }; // Color format description structure struct ColorFormatInfo { ColorFormat m_cFormat; uint32_t m_iPlanes; // Number of planes int32_t m_iMinBitDepth; // Minimum bitdepth PlaneFormatInfo m_PlaneFormatInfo[MAX_PLANE_NUMBER]; }; // Color format description table static const ColorFormatInfo FormatInfo[] = { {YV12, 3, 8, {{0, 0, 1}, {1, 1, 1}, {1, 1, 1}}}, {NV12, 2, 8, {{0, 0, 1}, {1, 1, 2}, }}, {NV16, 2, 8, {{0, 0, 1}, {1, 0, 2}, }}, {IMC3, 3, 8, {{0, 0, 1}, {1, 1, 1}, {1, 1, 1}}}, {YUY2, 1, 8, {{2, 1, 4}, }}, {UYVY, 1, 8, {{2, 1, 4}, }}, {YUV411, 3, 8, {{1, 1, 1}, {4, 1, 1}, {4, 1, 1}}}, {YUV420, 3, 8, {{0, 0, 1}, {1, 1, 1}, {1, 1, 1}}}, {YUV422, 3, 8, {{0, 0, 1}, {1, 0, 1}, {1, 0, 1}}}, {YUV444, 3, 8, {{0, 0, 1}, {0, 0, 1}, {0, 0, 1}}}, {YUV_VC1, 3, 8, {{1, 1, 1}, {2, 2, 1}, {2, 2, 1}}}, {Y411, 1, 8, {{4, 1, 6}}}, {Y41P, 1, 8, {{8, 1, 12}}}, {RGB32, 1, 8, {{1, 1, 4}}}, {AYUV, 1, 8, {{0, 0, 4}}}, {RGB24, 1, 8, {{1, 1, 3}}}, {RGB565, 1, 16, {{1, 1, 1}}}, {RGB555, 1, 16, {{1, 1, 1}}}, {RGB444, 1, 16, {{1, 1, 1}}}, {GRAY, 1, 8, {{0, 0, 1}}}, {GRAYA, 2, 8, {{0, 0, 1}, {0, 0, 1}}}, {YUV420A, 4, 8, {{0, 0, 1}, {1, 1, 1}, {1, 1, 1}, {0, 0, 1}}}, {YUV422A, 4, 8, {{0, 0, 1}, {1, 0, 1}, {1, 0, 1}, {0, 0, 1}}}, {YUV444A, 4, 8, {{0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}}}, {YVU9, 3, 8, {{1, 1, 1}, {4, 4, 1}, {4, 4, 1}}}, {P010, 3, 10, {{0, 0, 1}, {1, 1, 2}, }}, {P016, 3, 16, {{0, 0, 1}, {1, 1, 2}, }}, {P210, 3, 10, {{0, 0, 1}, {1, 0, 2}, }}, {P216, 3, 16, {{0, 0, 1}, {1, 0, 2}, }}, {Y210, 1, 10, {{2, 1, 4}, }}, {Y216, 1, 16, {{2, 1, 4}, }}, {Y410, 1, 10, {{0, 0, 1}, }}, {Y416, 1, 16, {{0, 0, 1}, }} }; // Number of entries in the FormatInfo table static const int32_t iNumberOfFormats = sizeof(FormatInfo) / sizeof(FormatInfo[0]); // returns pointer to color format description table for cFormat // or NULL if cFormat is not described (unknown color format). static const ColorFormatInfo *GetColorFormatInfo(ColorFormat cFormat) { const ColorFormatInfo *pReturn = NULL; int32_t i; // find required format for (i = 0; i < iNumberOfFormats; i += 1) { if (FormatInfo[i].m_cFormat == cFormat) { pReturn = FormatInfo + i; break; } } return pReturn; } // ColorFormatInfo *GetColorFormatInfo(ColorFormat cFormat) // Initialization to undefined image type VideoDataInfo::VideoDataInfo(void) { Close(); memset(m_pPlaneData, 0, sizeof(m_pPlaneData)); } // VideoDataInfo::VideoDataInfo(void) VideoDataInfo::~VideoDataInfo() { } // VideoDataInfo::~VideoDataInfo(void) void VideoDataInfo::Close() { m_iPlanes = 0; m_ippSize.width = 0; m_ippSize.height = 0; m_ColorFormat = NONE; m_picStructure = PS_FRAME; // set square pixel m_iHorzAspect = m_iVertAspect = 1; } // Initializes image dimensions and bitdepth. // Has to be followed by SetColorFormat call. // Planes' information is initialized to invalid values Status VideoDataInfo::Init(int32_t iWidth, int32_t iHeight, int32_t iPlanes, int32_t iBitDepth) { int32_t i; if ((0 >= iWidth) || (0 >= iHeight) || (0 >= iPlanes) || (8 > iBitDepth)) return UMC_ERR_INVALID_PARAMS; for (i = 0; i < iPlanes; i++) { m_pPlaneData[i].m_iSamples = 1; m_pPlaneData[i].m_iSampleSize = (iBitDepth+7)>>3; m_pPlaneData[i].m_iBitDepth = iBitDepth; // can't assign dimension to unknown planes m_pPlaneData[i].m_ippSize.width = 0; m_pPlaneData[i].m_ippSize.height = 0; } m_iPlanes = iPlanes; m_ippSize.width = iWidth; m_ippSize.height = iHeight; return UMC_OK; } // Status VideoDataInfo::Init(int32_t iWidth, // Completely sets image information, without allocation or linking to // image memory. Status VideoDataInfo::Init(int32_t iWidth, int32_t iHeight, ColorFormat cFormat, int32_t iBitDepth) { Status umcRes; const ColorFormatInfo* pFormat; pFormat = GetColorFormatInfo(cFormat); if(NULL == pFormat) return UMC_ERR_INVALID_PARAMS; // allocate planes if(iBitDepth == 0) iBitDepth = pFormat->m_iMinBitDepth; umcRes = Init(iWidth, iHeight, pFormat->m_iPlanes, iBitDepth); if (UMC_OK != umcRes) return umcRes; // set color format and // correct width & height for planes umcRes = SetColorFormat(cFormat); if (UMC_OK != umcRes) return umcRes; return UMC_OK; } // Status VideoDataInfo::Init(int32_t iWidth, // Sets or change Color format information for image, only when it has // specified size, number of planes and bitdepth. Number of planes in cFormat must // be not greater than specified in image. Status VideoDataInfo::SetColorFormat(ColorFormat cFormat) { const ColorFormatInfo *pFormat; // check error(s) pFormat = GetColorFormatInfo(cFormat); if (NULL == pFormat) return UMC_ERR_INVALID_STREAM; if (m_iPlanes < pFormat->m_iPlanes) return UMC_ERR_INVALID_STREAM; m_ColorFormat = cFormat; // set correct width & height to planes for (uint32_t i = 0; i < m_iPlanes; i += 1) { if (i < pFormat->m_iPlanes) { m_pPlaneData[i].m_iWidthScale = pFormat->m_PlaneFormatInfo[i].m_iWidthScale; m_pPlaneData[i].m_iHeightScale = pFormat->m_PlaneFormatInfo[i].m_iHeightScale; m_pPlaneData[i].m_iSamples = pFormat->m_PlaneFormatInfo[i].m_iChannels; } else { m_pPlaneData[i].m_iWidthScale = 0; m_pPlaneData[i].m_iHeightScale = 0; m_pPlaneData[i].m_iSamples = 1; } m_pPlaneData[i].m_ippSize.width = m_ippSize.width >> m_pPlaneData[i].m_iWidthScale; m_pPlaneData[i].m_ippSize.height = m_ippSize.height >> m_pPlaneData[i].m_iHeightScale; } return UMC_OK; } // Status VideoDataInfo::SetColorFormat(ColorFormat cFormat) // Set sample size for specified plane, usually additional or when bitdepth differs // for main planes Status VideoDataInfo::SetPlaneSampleSize(int32_t iSampleSize, uint32_t iPlaneNumber) { // check error(s) if (m_iPlanes <= iPlaneNumber) return UMC_ERR_FAILED; m_pPlaneData[iPlaneNumber].m_iSampleSize = iSampleSize; if(iSampleSize*8 < m_pPlaneData[iPlaneNumber].m_iBitDepth) m_pPlaneData[iPlaneNumber].m_iBitDepth = iSampleSize*8; return UMC_OK; } const VideoDataInfo::PlaneInfo* VideoDataInfo::GetPlaneInfo(uint32_t plane) const { // check error(s) if (m_iPlanes <= plane) return 0; return &m_pPlaneData[plane]; } size_t VideoDataInfo::GetSize() const { size_t sz = 0; for (uint32_t i = 0; i < m_iPlanes; i++) { sz += m_pPlaneData[i].m_ippSize.width * m_pPlaneData[i].m_ippSize.height * m_pPlaneData[i].m_iSampleSize * m_pPlaneData[i].m_iSamples; } return sz; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Time //////////////////////////////////////////////////////////////////////////////////////////////////////////////// FrameTime::FrameTime() { Reset(); } void FrameTime::Reset() { m_pts_start = -1; m_pts_end = -1; } Status FrameTime::GetTime(double& start, double& end) const { start = m_pts_start; end = m_pts_end; return UMC_OK; } Status FrameTime::SetTime(double start, double end) { m_pts_start = start; m_pts_end = end; return UMC_OK; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// FrameData::FrameData() : m_locked(false) , m_FrameMID(FRAME_MID_INVALID) , m_FrameAlloc(0) {} FrameData::FrameData(const FrameData & fd) : m_locked(false) , m_Info(fd.m_Info) , m_FrameMID(fd.m_FrameMID) , m_FrameAlloc(fd.m_FrameAlloc) , m_AuxInfo(fd.m_AuxInfo) { MFX_INTERNAL_CPY(m_PlaneInfo, fd.m_PlaneInfo, sizeof(m_PlaneInfo)); if (m_FrameAlloc) { m_FrameAlloc->IncreaseReference(m_FrameMID); } } FrameData::~FrameData() { Close(); } FrameData& FrameData::operator=(const FrameData& fd) { // check for assignment for self if (this == &fd) { return *this; } Close(); m_FrameAlloc = fd.m_FrameAlloc; m_FrameMID = fd.m_FrameMID; m_Info = fd.m_Info; MFX_INTERNAL_CPY(m_PlaneInfo, fd.m_PlaneInfo, sizeof(m_PlaneInfo)); m_locked = false;// fd.m_locked; if (m_FrameAlloc) { m_FrameAlloc->IncreaseReference(m_FrameMID); } m_AuxInfo = fd.m_AuxInfo; return *this; } const VideoDataInfo * FrameData::GetInfo() const { return &m_Info; } FrameMemID FrameData::GetFrameMID() const { return m_FrameMID; } FrameMemID FrameData::Release() { FrameTime::Reset(); FrameMemID mid = m_FrameMID; m_locked = false; m_FrameMID = FRAME_MID_INVALID; m_FrameAlloc = 0; m_Info.Close(); return mid; } void FrameData::Init(const VideoDataInfo * info, FrameMemID memID, FrameAllocator * frameAlloc) { Close(); m_Info = *info; m_FrameMID = memID; m_FrameAlloc = frameAlloc; if (m_FrameAlloc && m_FrameMID != FRAME_MID_INVALID) m_FrameAlloc->IncreaseReference(m_FrameMID); } void FrameData::Close() { FrameTime::Reset(); if (m_FrameAlloc && m_FrameMID != FRAME_MID_INVALID) { if (m_locked) { m_FrameAlloc->Unlock(m_FrameMID); } m_locked = false; m_FrameAlloc->DecreaseReference(m_FrameMID); m_FrameMID = FRAME_MID_INVALID; m_FrameAlloc = 0; } memset(m_PlaneInfo, 0, sizeof(m_PlaneInfo)); m_Info.Close(); m_AuxInfo.clear(); } const FrameData::PlaneMemoryInfo * FrameData::GetPlaneMemoryInfo(uint32_t plane) const { if (plane >= m_Info.GetNumPlanes()) return 0; return &(m_PlaneInfo[plane]); } void FrameData::SetPlanePointer(uint8_t* planePtr, uint32_t plane, size_t pitch) { if (plane >= m_Info.GetNumPlanes()) return; m_PlaneInfo[plane].m_planePtr = planePtr; m_PlaneInfo[plane].m_pitch = pitch; } void FrameData::SetAuxInfo(void* ptr, size_t size, int type) { FrameAuxInfo* aux = GetAuxInfo(type); if (!aux) { m_AuxInfo.push_back(FrameAuxInfo()); aux = &m_AuxInfo.back(); } aux->ptr = ptr; aux->size = size; aux->type = type; } void FrameData::ClearAuxInfo(int type) { FrameAuxInfo aux = { 0, 0, type }; m_AuxInfo.remove(aux); } FrameData::FrameAuxInfo const* FrameData::GetAuxInfo(int type) const { FrameAuxInfo aux = { 0, 0, type }; std::list::const_iterator i = std::find(m_AuxInfo.begin(), m_AuxInfo.end(), aux); return i != m_AuxInfo.end() ? &(*i) : 0; } } // end namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_media_data.cpp000066400000000000000000000163101443134507600307130ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_media_data.h" #include "umc_defs.h" #include namespace UMC { MediaData::MediaData(size_t length) { m_pBufferPointer = NULL; m_pDataPointer = NULL; m_nBufferSize = 0; m_nDataSize = 0; m_pts_start = -1; m_pts_end = 0; m_frameType = NONE_PICTURE; m_isInvalid = 0; m_bMemoryAllocated = 0; m_flags = 0; if (length) { m_pBufferPointer = new uint8_t[length]; m_pDataPointer = m_pBufferPointer; m_nBufferSize = length; m_bMemoryAllocated = 1; } } // MediaData::MediaData(size_t length) : MediaData::MediaData(const MediaData &another) : m_AuxInfo(another.m_AuxInfo) { m_pBufferPointer = NULL; m_pDataPointer = NULL; m_nBufferSize = 0; m_nDataSize = 0; m_pts_start = -1; m_pts_end = 0; m_frameType = NONE_PICTURE; m_isInvalid = 0; m_bMemoryAllocated = 0; m_flags = 0; operator = (another); } // MediaData::MediaData(const MediaData &another) MediaData::~MediaData() { Close(); } // MediaData::~MediaData() Status MediaData::Alloc(size_t length) { Close(); if (length) { m_pBufferPointer = new uint8_t[length]; m_pDataPointer = m_pBufferPointer; m_nBufferSize = length; m_bMemoryAllocated = 1; } return UMC_OK; } Status MediaData::Close(void) { if (m_bMemoryAllocated) { if (m_pBufferPointer) delete[] m_pBufferPointer; } m_pBufferPointer = NULL; m_pDataPointer = NULL; m_nBufferSize = 0; m_nDataSize = 0; m_frameType = NONE_PICTURE; m_bMemoryAllocated = 0; m_AuxInfo.clear(); return UMC_OK; } // Status MediaData::Close(void) Status MediaData::SetDataSize(size_t bytes) { if (!m_pBufferPointer) return UMC_ERR_NULL_PTR; if (bytes > (m_nBufferSize - (m_pDataPointer - m_pBufferPointer))) return UMC_ERR_FAILED; m_nDataSize = bytes; return UMC_OK; } // Status MediaData::SetDataSize(size_t bytes) // Set the pointer to a buffer allocated by the user // bytes define the size of buffer // size of data is equal to buffer size after this call Status MediaData::SetBufferPointer(uint8_t *ptr, size_t size) { // release object MediaData::Close(); // set new value(s) m_pBufferPointer = ptr; m_pDataPointer = ptr; m_nBufferSize = size; m_nDataSize = 0; return UMC_OK; } // Status MediaData::SetBufferPointer(uint8_t *ptr, size_t size) void MediaData::SetAuxInfo(void* ptr, size_t size, int type) { AuxInfo* aux = GetAuxInfo(type); if (!aux) { m_AuxInfo.push_back(AuxInfo()); aux = &m_AuxInfo.back(); } aux->ptr = ptr; aux->size = size; aux->type = type; } // void MediaData::SetAuxInfo(void* ptr, size_t size, int type) void MediaData::ClearAuxInfo(int type) { AuxInfo aux = { 0, 0, type }; m_AuxInfo.remove(aux); } // void MediaData::ClearAuxInfo(int type) MediaData::AuxInfo const* MediaData::GetAuxInfo(int type) const { AuxInfo aux = { 0, 0, type }; std::list::const_iterator i = std::find(m_AuxInfo.begin(), m_AuxInfo.end(), aux); return i != m_AuxInfo.end() ? &(*i) : 0; } // MediaData::AuxInfo const* MediaData::GetAuxInfo(int type) const Status MediaData::SetTime(double start, double end) { // if (start < 0 && start != -1.0) // return UMC_ERR_FAILED; m_pts_start = start; m_pts_end = end; return UMC_OK; } // Status MediaData::SetTime(double start, double end) Status MediaData::GetTime(double& start, double& end) const { start = m_pts_start; end = m_pts_end; return UMC_OK; } // Status MediaData::GetTime(double& start, double& end) Status MediaData::MoveDataPointer(int32_t bytes) { if (bytes >= 0 && m_nDataSize >= (size_t)bytes) { m_pDataPointer += bytes; m_nDataSize -= bytes; return UMC_OK; } else if (bytes < 0 && (size_t)(m_pDataPointer - m_pBufferPointer) >= (size_t)(-bytes)) { m_pDataPointer += bytes; m_nDataSize -= bytes; return UMC_OK; } return UMC_ERR_FAILED; } // Status MediaData::MovePointer(int32_t bytes) Status MediaData::Reset() { m_pDataPointer = m_pBufferPointer; m_nDataSize = 0; m_pts_start = -1.0; m_pts_end = -1.0; m_frameType = NONE_PICTURE; m_isInvalid = 0; return UMC_OK; } MediaData& MediaData::operator = (const MediaData& src) { // check for assignment for self if (this == &src) { return *this; } MediaData::Close(); m_pts_start = src.m_pts_start; m_pts_end = src.m_pts_end; m_nBufferSize = src.m_nBufferSize; m_nDataSize = src.m_nDataSize; m_frameType = src.m_frameType; m_isInvalid = src.m_isInvalid; m_pDataPointer = src.m_pDataPointer; m_pBufferPointer = src.m_pBufferPointer; m_bMemoryAllocated = 0; m_flags = src.m_flags; return *this; } // MediaData& MediaData::operator = (const MediaData& src) Status MediaData::MoveDataTo(MediaData* dst) { MediaData *src; uint8_t *pDataEnd; uint8_t *pBufferEnd; size_t size; // check error(s) if (NULL == m_pDataPointer) { return UMC_ERR_NOT_INITIALIZED; } if ((NULL == dst) || (NULL == dst->m_pDataPointer)) { return UMC_ERR_NULL_PTR; } // get parameters src = this; pDataEnd = dst->m_pDataPointer + dst->m_nDataSize; pBufferEnd = dst->m_pBufferPointer + dst->m_nBufferSize; size = std::min(src->m_nDataSize, pBufferEnd - pDataEnd); if (size) { std::copy(src->m_pDataPointer, src->m_pDataPointer + size, pDataEnd); } dst->m_nDataSize += size; src->MoveDataPointer((int32_t)size); dst->m_pts_start = src->m_pts_start; dst->m_pts_end = src->m_pts_end; dst->m_frameType = src->m_frameType; dst->m_isInvalid = src->m_isInvalid; return UMC_OK; } // MediaData::MoveDataTo(MediaData& src) } // namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_va_base.cpp000066400000000000000000000034761443134507600302540ustar00rootroot00000000000000// Copyright (c) 2006-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_defs.h" #include "umc_va_base.h" using namespace UMC; Status VideoAccelerator::Close(void) { m_allocator = 0; return UMC_OK; } Status VideoAccelerator::Reset(void) { m_allocator = 0; return UMC_OK; } void UMCVACompBuffer::SetDataSize(int32_t size) { DataSize = size; assert(DataSize <= BufferSize); } void UMCVACompBuffer::SetNumOfItem(int32_t ) { } Status UMCVACompBuffer::SetPVPState(void *buf, uint32_t size) { if (16 < size) return UMC_ERR_ALLOC; if (NULL != buf) { if (0 == size) return UMC_ERR_ALLOC; PVPState = PVPStateBuf; MFX_INTERNAL_CPY(PVPState, buf, size); } else PVPState = NULL; return UMC_OK; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_video_data.cpp000066400000000000000000000525031443134507600307460ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_video_data.h" #include "mfx_utils.h" namespace UMC { // Number of planes in format description table. // Number of planes in image can be greater. In this case additional // planes should be supported by the user with functions SetPlanePointer, // SetPlanePitch. enum { MAX_PLANE_NUMBER = 4 }; struct PlaneFormatInfoVideo { int32_t m_iWidthDiv; // Horizontal downsampling factor int32_t m_iHeightDiv; // Vertical downsampling factor int32_t m_iChannels; // Number of merged channels in the plane int32_t m_iAlignMult; // Alignment value multiplier }; // Color format description structure struct ColorFormatInfoVideo { ColorFormat m_cFormat; int32_t m_iPlanes; // Number of planes int32_t m_iMinBitDepth; // Minimum bitdepth int32_t m_iMinAlign; // Minimal required alignment in bytes PlaneFormatInfoVideo m_PlaneFormatInfo[MAX_PLANE_NUMBER]; }; // Color format description table static const ColorFormatInfoVideo FormatInfo[] = { {YV12, 3, 8, 1, {{1, 1, 1, 2}, {2, 2, 1, 1}, {2, 2, 1, 1}}}, {NV12, 2, 8, 2, {{1, 1, 1, 1}, {1, 2, 1, 1}, }}, {YUY2, 1, 8, 2, {{2, 1, 4, 1}, }}, {UYVY, 1, 8, 2, {{2, 1, 4, 1}, }}, {YUV411, 3, 8, 1, {{1, 1, 1, 1}, {4, 1, 1, 1}, {4, 1, 1, 1}}}, {YUV420, 3, 8, 1, {{1, 1, 1, 1}, {2, 2, 1, 1}, {2, 2, 1, 1}}}, {YUV422, 3, 8, 1, {{1, 1, 1, 1}, {2, 1, 1, 1}, {2, 1, 1, 1}}}, {YUV444, 3, 8, 1, {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}}, {YUV_VC1, 3, 8, 1, {{1, 1, 1, 1}, {2, 2, 1, 1}, {2, 2, 1, 1}}}, {Y411, 1, 8, 2, {{4, 1, 6, 1}}}, {Y41P, 1, 8, 2, {{8, 1, 12, 1}}}, {RGB32, 1, 8, 1, {{1, 1, 4, 1}}}, {RGB24, 1, 8, 4, {{1, 1, 3, 1}}}, {RGB565, 1, 16, 2, {{1, 1, 1, 1}}}, {RGB555, 1, 16, 2, {{1, 1, 1, 1}}}, {RGB444, 1, 16, 2, {{1, 1, 1, 1}}}, {GRAY, 1, 8, 1, {{1, 1, 1, 1}}}, {GRAYA, 2, 8, 1, {{1, 1, 1, 1}, {1, 1, 1, 1}}}, {YUV420A, 4, 8, 1, {{1, 1, 1, 1}, {2, 2, 1, 1}, {2, 2, 1, 1}, {1, 1, 1, 1}}}, {YUV422A, 4, 8, 1, {{1, 1, 1, 1}, {2, 1, 1, 1}, {2, 1, 1, 1}, {1, 1, 1, 1}}}, {YUV444A, 4, 8, 1, {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}}, {YVU9, 3, 8, 1, {{1, 1, 1, 1}, {4, 4, 1, 1}, {4, 4, 1, 1}}} }; // Number of entries in the FormatInfo table static const int32_t iNumberOfFormats = sizeof(FormatInfo) / sizeof(FormatInfo[0]); // returns pointer to color format description table for cFormat // or NULL if cFormat is not described (unknown color format). static const ColorFormatInfoVideo *GetColorFormatInfo(ColorFormat cFormat) { const ColorFormatInfoVideo *pReturn = NULL; int32_t i; // find required format for (i = 0; i < iNumberOfFormats; i += 1) { if (FormatInfo[i].m_cFormat == cFormat) { pReturn = FormatInfo + i; break; } } return pReturn; } // ColorFormatInfoVideo *GetColorFormatInfo(ColorFormat cFormat) // Initialization to undefined image type VideoData::VideoData(void) { m_iAlignment = 1; m_pPlaneData = NULL; m_iPlanes = 0; m_ippSize.width = 0; m_ippSize.height = 0; m_ColorFormat = NONE; m_picStructure = PS_FRAME; // set square pixel m_iHorzAspect = m_iVertAspect = 1; m_pbAllocated = NULL; } // VideoData::VideoData(void) VideoData::~VideoData(void) { Close(); } // VideoData::~VideoData(void) // Release all possessed memory Status VideoData::Close(void) { if (m_pPlaneData) delete [] m_pPlaneData; m_pPlaneData = NULL; m_iPlanes = 0; return ReleaseImage(); } // Status VideoData::Close(void) // Release image memory if it was owned Status VideoData::ReleaseImage(void) { int32_t i; for (i = 0; i < m_iPlanes; i++) m_pPlaneData[i].m_pPlane = NULL; if (m_pbAllocated) delete [] m_pbAllocated; m_pbAllocated = NULL; return MediaData::Close(); } // Status VideoData::ReleaseImage(void) // Initializes image dimensions and bitdepth. // Has to be followed by SetColorFormat call. // Planes' information is initialized to invalid values Status VideoData::Init(int32_t iWidth, int32_t iHeight, int32_t iPlanes, int32_t iBitDepth) { int32_t i; // check error(s) if ((0 >= iWidth) || (0 >= iHeight) || (0 >= iPlanes) || (8 > iBitDepth)) return UMC_ERR_INVALID_STREAM; // release object before initialization Close(); // allocate plane info m_pPlaneData = new PlaneInfo[iPlanes]; // fill plane info for (i = 0; i < iPlanes; i++) { m_pPlaneData[i].m_iSamples = 1; m_pPlaneData[i].m_iSampleSize = (iBitDepth+7)>>3; m_pPlaneData[i].m_iBitDepth = iBitDepth; m_pPlaneData[i].m_pPlane = NULL; m_pPlaneData[i].m_nMemSize = 0; // we can't set pitch without align value m_pPlaneData[i].m_nPitch = 0; m_pPlaneData[i].m_nOffset = 0; // can't assign dimension to unknown planes m_pPlaneData[i].m_ippSize.width = 0; m_pPlaneData[i].m_ippSize.height = 0; } m_iPlanes = iPlanes; m_ippSize.width = iWidth; m_ippSize.height = iHeight; return UMC_OK; } // Status VideoData::Init(int32_t iWidth, // Completely sets image information, without allocation or linking to // image memory. Status VideoData::Init(int32_t iWidth, int32_t iHeight, ColorFormat cFormat, int32_t iBitDepth) { Status umcRes; const ColorFormatInfoVideo* pFormat; pFormat = GetColorFormatInfo(cFormat); if(NULL == pFormat) return UMC_ERR_INVALID_STREAM; // allocate planes if(iBitDepth == 0) iBitDepth = pFormat->m_iMinBitDepth; umcRes = Init(iWidth, iHeight, pFormat->m_iPlanes, iBitDepth); if (UMC_OK != umcRes) return umcRes; // set color format and // correct width & height for planes umcRes = SetColorFormat(cFormat); if (UMC_OK != umcRes) return umcRes; return UMC_OK; } // Status VideoData::Init(int32_t iWidth, // Sets or change Color format information for image, only when it has // specified size, number of planes and bitdepth. Number of planes in cFormat must // be not greater than specified in image. Status VideoData::SetColorFormat(ColorFormat cFormat) { int32_t i; const ColorFormatInfoVideo *pFormat; // check error(s) pFormat = GetColorFormatInfo(cFormat); if (NULL == pFormat) return UMC_ERR_INVALID_STREAM; if (m_iPlanes < pFormat->m_iPlanes) return UMC_ERR_INVALID_STREAM; m_ColorFormat = cFormat; m_pPlaneData[0].m_nOffset = 0; // set correct width & height to planes for (i = 0; i < m_iPlanes; i += 1) { int32_t align, bpp; if(i>0) { m_pPlaneData[i].m_nOffset = m_pPlaneData[i-1].m_nOffset + m_pPlaneData[i-1].m_nMemSize; } if (i < pFormat->m_iPlanes) { m_pPlaneData[i].m_iWidthDiv = pFormat->m_PlaneFormatInfo[i].m_iWidthDiv; m_pPlaneData[i].m_iHeightDiv = pFormat->m_PlaneFormatInfo[i].m_iHeightDiv; m_pPlaneData[i].m_iSamples = pFormat->m_PlaneFormatInfo[i].m_iChannels; } else { m_pPlaneData[i].m_iWidthDiv = 1; m_pPlaneData[i].m_iHeightDiv = 1; m_pPlaneData[i].m_iSamples = 1; } if (m_pPlaneData[i].m_iWidthDiv != 1) { int sz = m_pPlaneData[i].m_iWidthDiv; m_pPlaneData[i].m_ippSize.width = (m_ippSize.width + sz - 1) / sz; } else { m_pPlaneData[i].m_ippSize.width = m_ippSize.width; } if (m_pPlaneData[i].m_iHeightDiv != 1) { int sz = m_pPlaneData[i].m_iHeightDiv; m_pPlaneData[i].m_ippSize.height = (m_ippSize.height + sz - 1) / sz; } else { m_pPlaneData[i].m_ippSize.height = m_ippSize.height; } bpp = m_pPlaneData[i].m_iSampleSize * m_pPlaneData[i].m_iSamples; align = std::max(m_iAlignment, bpp); if (i < pFormat->m_iPlanes) { // sometimes dimension of image may be not aligned to native size align = std::max(align, pFormat->m_iMinAlign); align *= pFormat->m_PlaneFormatInfo[i].m_iAlignMult; } m_pPlaneData[i].m_nPitch = mfx::align2_value(m_pPlaneData[i].m_ippSize.width * bpp, align); m_pPlaneData[i].m_nMemSize = m_pPlaneData[i].m_nPitch * m_pPlaneData[i].m_ippSize.height; } // special case, can't be completely covered by format table //if(cFormat == YV12) { // V than U // size_t tmp = m_pPlaneData[1].m_nOffset; // m_pPlaneData[1].m_nOffset = m_pPlaneData[2].m_nOffset; // m_pPlaneData[2].m_nOffset = tmp; //} // for complexer cases, such as IMC2 or IMC4, need more manual changes here return UMC_OK; } // Status VideoData::SetColorFormat(ColorFormat cFormat) // Set common Alignment Status VideoData::SetAlignment(int32_t iAlignment) { // check alignment int32_t i; if(iAlignment <= 0) return UMC_ERR_INVALID_STREAM; for (i = 1; i < (1 << 16); i <<= 1) { if (i & iAlignment) { m_iAlignment = i; break; // stop at last nonzero bit } } if (i != iAlignment) return UMC_WRN_INVALID_STREAM; return UMC_OK; } // Allocates memory according to existing information in VideoData and given alignment // If image memory was already allocated it is released. // return UMC_OK on success, UMC_ERR_INVALID_STREAM if image is improperly described Status VideoData::Alloc(size_t requiredSize) { (void)requiredSize; size_t nSize; // Release previous buffer ReleaseImage(); // get size of buffer to allocate nSize = GetMappingSize(); if (0 == nSize) return UMC_ERR_INVALID_STREAM; // allocate buffer m_pbAllocated = new uint8_t[nSize + m_iAlignment - 1]; // set pointer to image return SetBufferPointer(m_pbAllocated, nSize); } // Status VideoData::Alloc() // Links to provided image memory // Image must be described before Status VideoData::SetBufferPointer(uint8_t *pbBuffer, size_t nSize) { int32_t i; size_t mapsize; uint8_t *ptr = align_pointer(pbBuffer, m_iAlignment); // check error(s) if (NULL == m_pPlaneData) { SetDataSize(0); return UMC_ERR_FAILED; } mapsize = GetMappingSize(); if (nSize < mapsize) { SetDataSize(0); return UMC_ERR_NOT_ENOUGH_BUFFER; } // set new plane pointers if (m_pPlaneData) { uint8_t *tmp = ptr; for(i=0; i iPlaneNumber) || (NULL == m_pPlaneData)) return UMC_ERR_FAILED; m_pPlaneData[iPlaneNumber].m_pPlane = (uint8_t *) pDest; return UMC_OK; } // Status VideoData::SetPlanePointer(void *pDest, int32_t iPlaneNumber) Status VideoData::SetImageSize(int32_t width, int32_t height) { // check error(s) if (NULL == m_pPlaneData) return UMC_ERR_FAILED; m_ippSize.width = width; m_ippSize.height = height; return UMC_OK; } // Set pitch for specified plane. Should be used for additional planes, // or when image layout is different. Status VideoData::SetPlanePitch(size_t nPitch, int32_t iPlaneNumber) { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return UMC_ERR_FAILED; m_pPlaneData[iPlaneNumber].m_nPitch = nPitch; m_pPlaneData[iPlaneNumber].m_nMemSize = nPitch * m_pPlaneData[iPlaneNumber].m_ippSize.height; return UMC_OK; } // Status VideoData::SetPlanePitch(size_t nPitch, int32_t iPlaneNumber) // Set bitdepth for specified plane, usually additional or when bitdepth differs // for main planes Status VideoData::SetPlaneBitDepth(int32_t iBitDepth, int32_t iPlaneNumber) { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return UMC_ERR_FAILED; m_pPlaneData[iPlaneNumber].m_iBitDepth = iBitDepth; if(m_pPlaneData[iPlaneNumber].m_iSampleSize*8 < iBitDepth) m_pPlaneData[iPlaneNumber].m_iSampleSize = (iBitDepth+7)>>3; return UMC_OK; } // Status VideoData::SetPlaneBitDepth(int32_t iBitDepth, int32_t iPlaneNumber) // Set sample size for specified plane, usually additional or when bitdepth differs // for main planes Status VideoData::SetPlaneSampleSize(int32_t iSampleSize, int32_t iPlaneNumber) { // check error(s) if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return UMC_ERR_FAILED; m_pPlaneData[iPlaneNumber].m_iSampleSize = iSampleSize; if(iSampleSize*8 < m_pPlaneData[iPlaneNumber].m_iBitDepth) m_pPlaneData[iPlaneNumber].m_iBitDepth = iSampleSize*8; return UMC_OK; } // Status VideoData::SetPlaneSampleSize(int32_t iSampleSize, int32_t iPlaneNumber) // Links plane pointers to surface using provided pitch. // All pitches and plane info are updated according to current // color format. // Supposes no gaps between planes. Status VideoData::SetSurface(void* ptr, size_t nPitch) { // check error(s) UMC_CHECK(ptr, UMC_ERR_NULL_PTR); UMC_CHECK(m_pPlaneData, UMC_ERR_NOT_INITIALIZED); if(nPitch == 0) // use current nPitch = m_pPlaneData[0].m_nPitch; m_pPlaneData[0].m_nOffset = 0; size_t size = 0; for (int i = 0; i < m_iPlanes; i++) { m_pPlaneData[i].m_nPitch = nPitch; if (i > 0) { m_pPlaneData[i].m_nPitch *= m_pPlaneData[i].m_iSamples*m_pPlaneData[0].m_iWidthDiv; m_pPlaneData[i].m_nPitch /= m_pPlaneData[i].m_iWidthDiv*m_pPlaneData[0].m_iSamples; m_pPlaneData[i].m_nOffset = m_pPlaneData[i - 1].m_nOffset + m_pPlaneData[i - 1].m_nMemSize; } m_pPlaneData[i].m_pPlane = (uint8_t*)ptr + m_pPlaneData[i].m_nOffset; m_pPlaneData[i].m_nMemSize = m_pPlaneData[i].m_nPitch * m_pPlaneData[i].m_ippSize.height; size += m_pPlaneData[i].m_nMemSize; } MediaData::SetBufferPointer((uint8_t*)ptr, size); return MediaData::SetDataSize(size); } #define PITCH_PREC 8 // Calculate pitch from mapping size size_t VideoData::GetPitchFromMappingSize(size_t mappingSize) const { size_t size = 0; int i; // check error(s) UMC_CHECK(m_pPlaneData, 0); // calculate mapping size for pitch equal to (1 << PITCH_PREC) size = m_pPlaneData[0].m_ippSize.height << PITCH_PREC; for (i = 1; i < m_iPlanes; i++) { size_t plane_size = m_pPlaneData[i].m_ippSize.height << PITCH_PREC; plane_size *= m_pPlaneData[i].m_iSamples*m_pPlaneData[0].m_iWidthDiv; plane_size /= m_pPlaneData[i].m_iWidthDiv*m_pPlaneData[0].m_iSamples; size += plane_size; } UMC_CHECK(size, 0); // calulate real pitch return ((mappingSize << PITCH_PREC)/size); } Status VideoData::ConvertPictureStructure(PictureStructure newPicStructure) { PictureStructure curr = (PictureStructure)(m_picStructure & PS_FRAME); int k; if (curr == PS_FRAME && newPicStructure == PS_TOP_FIELD) { m_ippSize.height >>= 1; for (k = 0; k < m_iPlanes; k++) { m_pPlaneData[k].m_ippSize.height >>= 1; m_pPlaneData[k].m_nPitch <<= 1; } curr = PS_TOP_FIELD; } if (curr == PS_TOP_FIELD && newPicStructure == PS_BOTTOM_FIELD) { for (k = 0; k < m_iPlanes; k++) { m_pPlaneData[k].m_pPlane += (m_pPlaneData[k].m_nPitch >> 1); } curr = PS_BOTTOM_FIELD; } if (curr == PS_BOTTOM_FIELD && (newPicStructure == PS_TOP_FIELD || newPicStructure == PS_FRAME)) { for (k = 0; k < m_iPlanes; k++) { m_pPlaneData[k].m_pPlane -= (m_pPlaneData[k].m_nPitch >> 1); } curr = PS_TOP_FIELD; } if (curr == PS_TOP_FIELD && newPicStructure == PS_FRAME) { m_ippSize.height <<= 1; for (k = 0; k < m_iPlanes; k++) { m_pPlaneData[k].m_ippSize.height <<= 1; m_pPlaneData[k].m_nPitch >>= 1; } curr = PS_FRAME; } return SetPictureStructure(curr /*| (m_picStructure &~ PS_FRAME)*/); } // fills PlaneInfo structure Status VideoData::GetPlaneInfo(PlaneInfo* pInfo, int32_t iPlaneNumber) { // check error(s) if (NULL == pInfo) return UMC_ERR_NULL_PTR; if ((m_iPlanes <= iPlaneNumber) || (0 > iPlaneNumber) || (NULL == m_pPlaneData)) return UMC_ERR_FAILED; *pInfo = m_pPlaneData[iPlaneNumber]; return UMC_OK; } // Status VideoData::GetPlaneInfo(PlaneInfo* pInfo, int32_t iPlaneNumber) // converts display aspect ratio to pixel AR // or vise versa with exchanged width and height Status DARtoPAR(int32_t width, int32_t height, int32_t dar_h, int32_t dar_v, int32_t *par_h, int32_t *par_v) { // (width*par_h) / (height*par_v) == dar_h/dar_v => // par_h / par_v == dar_h * height / (dar_v * width) int32_t simple_tab[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; int32_t denom; size_t i; // suppose no overflow of 32s int32_t h = dar_h * height; int32_t v = dar_v * width; // remove common multipliers while( ((h|v)&1) == 0 ) { h>>=1; v>>=1; } for(i=0;i 0, UMC_ERR_INVALID_PARAMS); UMC_CHECK(h > 0, UMC_ERR_INVALID_PARAMS); UMC_CHECK(left >= 0, UMC_ERR_INVALID_PARAMS); UMC_CHECK(top >= 0, UMC_ERR_INVALID_PARAMS); UMC_CHECK(right <= m_ippSize.width, UMC_ERR_INVALID_PARAMS); UMC_CHECK(bottom <= m_ippSize.height, UMC_ERR_INVALID_PARAMS); for (k = 0; k < m_iPlanes; k++) { int wDiv = (m_pPlaneData[k].m_ippSize.width) ? m_ippSize.width/m_pPlaneData[k].m_ippSize.width : 1; int hDiv = (m_pPlaneData[k].m_ippSize.height) ? m_ippSize.height/m_pPlaneData[k].m_ippSize.height : 1; m_pPlaneData[k].m_pPlane += (top / hDiv) * m_pPlaneData[k].m_nPitch + (left / wDiv) * m_pPlaneData[k].m_iSamples * m_pPlaneData[k].m_iSampleSize; m_pPlaneData[k].m_ippSize.width = w / wDiv; m_pPlaneData[k].m_ippSize.height = h / hDiv; } m_ippSize.width = w; m_ippSize.height = h; return UMC_OK; } VideoData & VideoData::operator = (const VideoData &par) { // check assignment for self if (this == &par) { return *this; } PlaneInfo *PlaneData = m_pPlaneData; if(m_iPlanes < par.m_iPlanes) { Close(); PlaneData = new PlaneInfo[par.m_iPlanes]; } else { ReleaseImage(); } MediaData::operator=(par); std::copy(par.m_pPlaneData, par.m_pPlaneData + par.m_iPlanes, PlaneData); m_iPlanes = par.m_iPlanes; m_ippSize = par.m_ippSize; m_ColorFormat = par.m_ColorFormat; m_picStructure = par.m_picStructure; m_iHorzAspect = par.m_iHorzAspect; m_iVertAspect = par.m_iVertAspect; m_iAlignment = par.m_iAlignment; m_pPlaneData = PlaneData; m_pbAllocated = NULL; return *this; } } // end namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_video_decoder.cpp000066400000000000000000000046371443134507600314470ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_video_decoder.h" namespace UMC { VideoDecoderParams::VideoDecoderParams(void) { m_pData = NULL; memset(reinterpret_cast(&info), 0, sizeof(sVideoStreamInfo)); lFlags = 0; pPostProcessing = NULL; lpMemoryAllocator = NULL; pVideoAccelerator = NULL; } // VideoDecoderParams::VideoDecoderParams(void) VideoDecoderParams::~VideoDecoderParams(void) { } // VideoDecoderParams::~VideoDecoderParams(void) VideoDecoder::~VideoDecoder(void) { if (m_allocatedPostProcessing) { delete m_allocatedPostProcessing; m_allocatedPostProcessing = NULL; } } // VideoDecoder::~VideoDecoder(void) Status VideoDecoder::GetInfo(BaseCodecParams *info) { Status umcRes = UMC_OK; VideoDecoderParams *pParams = DynamicCast (info); if (NULL == pParams) return UMC_ERR_NULL_PTR; pParams->info = m_ClipInfo; return umcRes; } // Status VideoDecoder::GetInfo(BaseCodecParams *info) Status VideoDecoder::SetParams(BaseCodecParams* params) { Status umcRes = UMC_OK; VideoDecoderParams *pParams = DynamicCast(params); if (NULL == pParams) return UMC_ERR_NULL_PTR; m_ClipInfo = pParams->info; return umcRes; } // Status VideoDecoder::SetParams(BaseCodecParams* params) } // end namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/umc/src/umc_video_encoder.cpp000066400000000000000000000022001443134507600314410ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_video_encoder.h" oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/000077500000000000000000000000001443134507600243415ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/CMakeLists.txt000066400000000000000000000011331443134507600270770ustar00rootroot00000000000000add_library(vm STATIC) set_property(TARGET vm PROPERTY FOLDER "umc") target_sources(vm PRIVATE include/sys/vm_types_linux32.h include/vm_event.h include/vm_interlocked.h include/vm_semaphore.h include/vm_strings.h include/vm_types.h src/vm_event_linux32.c src/vm_interlocked_unix.c src/vm_semaphore_linux32.c src/vm_strings_unix.c ) target_include_directories(vm PUBLIC include ) target_link_libraries(vm PUBLIC umc mfx_static_lib ${IPP_LIBS} PRIVATE mfx_sdl_properties ${CMAKE_DL_LIBS} ) include(sources_ext.cmake OPTIONAL) oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/000077500000000000000000000000001443134507600257645ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/sys/000077500000000000000000000000001443134507600266025ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/sys/vm_types_linux32.h000066400000000000000000000032031443134507600322030ustar00rootroot00000000000000// Copyright (c) 2003-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* vm_event.h */ typedef struct vm_event { pthread_cond_t cond; pthread_mutex_t mutex; int32_t manual; int32_t state; } vm_event; /* vm_semaphore.h */ typedef struct vm_semaphore { pthread_cond_t cond; pthread_mutex_t mutex; int32_t count; int32_t max_count; } vm_semaphore; #ifdef __cplusplus } #endif /* __cplusplus */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/vm_event.h000066400000000000000000000042601443134507600277620ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VM_EVENT_H__ #define __VM_EVENT_H__ #include "vm_types.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Invalidate an event */ void vm_event_set_invalid(vm_event *event); /* Verify if an event is valid */ int32_t vm_event_is_valid(vm_event *event); /* Init an event. Event is created unset. return 1 if success */ vm_status vm_event_init(vm_event *event, int32_t manual, int32_t state); vm_status vm_event_named_init(vm_event *event, int32_t manual, int32_t state, const char *pcName); /* Set the event to either HIGH (>0) or LOW (0) state */ vm_status vm_event_signal(vm_event *event); vm_status vm_event_reset(vm_event *event); /* Pulse the event 0 -> 1 -> 0 */ vm_status vm_event_pulse(vm_event *event); /* Wait for event to be high with blocking */ vm_status vm_event_wait(vm_event *event); /* Wait for event to be high without blocking, return 1 if signaled */ vm_status vm_event_timed_wait(vm_event *event, uint32_t msec); /* Destroy the event */ void vm_event_destroy(vm_event *event); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __VM_EVENT_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/vm_interlocked.h000066400000000000000000000040231443134507600311410ustar00rootroot00000000000000// Copyright (c) 2009-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VM_INTERLOCKED_H__ #define __VM_INTERLOCKED_H__ #include "vm_types.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Thread-safe 16-bit variable incrementing */ uint16_t vm_interlocked_inc16(volatile uint16_t *pVariable); /* Thread-safe 16-bit variable decrementing */ uint16_t vm_interlocked_dec16(volatile uint16_t *pVariable); /* Thread-safe 32-bit variable incrementing */ uint32_t vm_interlocked_inc32(volatile uint32_t *pVariable); /* Thread-safe 32-bit variable decrementing */ uint32_t vm_interlocked_dec32(volatile uint32_t *pVariable); /* Thread-safe 32-bit variable comparing and storing */ uint32_t vm_interlocked_cas32(volatile uint32_t *pVariable, uint32_t with, uint32_t cmp); /* Thread-safe 32-bit variable exchange */ uint32_t vm_interlocked_xchg32(volatile uint32_t *pVariable, uint32_t val); #ifdef __cplusplus } // extern "C" #endif /* __cplusplus */ #endif /* #ifndef __VM_INTERLOCKED_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/vm_semaphore.h000066400000000000000000000044441443134507600306300ustar00rootroot00000000000000// Copyright (c) 2003-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VM_SEMAPHORE_H__ #define __VM_SEMAPHORE_H__ #include "vm_types.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Invalidate a semaphore */ void vm_semaphore_set_invalid(vm_semaphore *sem); /* Verify if a semaphore is valid */ int32_t vm_semaphore_is_valid(vm_semaphore *sem); /* Init a semaphore with value, return VM_OK if successful */ vm_status vm_semaphore_init(vm_semaphore *sem, int32_t init_count); vm_status vm_semaphore_init_max(vm_semaphore *sem, int32_t init_count, int32_t max_count); /* Decrease the semaphore value with blocking. */ vm_status vm_semaphore_timedwait(vm_semaphore *sem, uint32_t msec); /* Decrease the semaphore value with blocking. */ vm_status vm_semaphore_wait(vm_semaphore *sem); /* Decrease the semaphore value without blocking, return VM_OK if success */ vm_status vm_semaphore_try_wait(vm_semaphore *sem); /* Increase the semaphore value */ vm_status vm_semaphore_post(vm_semaphore *sem); /* Increase the semaphore value */ vm_status vm_semaphore_post_many(vm_semaphore *sem, int32_t post_count); /* Destroy a semaphore */ void vm_semaphore_destroy(vm_semaphore *sem); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __VM_SEMAPHORE_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/vm_strings.h000066400000000000000000000044431443134507600303350ustar00rootroot00000000000000// Copyright (c) 2003-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VM_STRINGS_H__ #define __VM_STRINGS_H__ #include #include "ippdefs.h" # include # include # include # include # include # include # include typedef char vm_char; #define VM_STRING(x) x #define vm_string_printf printf #define vm_string_sprintf sprintf #define vm_string_snprintf snprintf #define vm_string_vsprintf vsprintf #define vm_string_vsnprintf vsnprintf #define vm_string_strcat strcat #define vm_string_strcpy strcpy #define vm_string_strncpy strncpy #define vm_string_strlen strlen #define vm_string_strcmp strcmp #define vm_string_strncmp strncmp #define vm_string_stricmp strcmp #define vm_string_atol atol #define vm_string_atoi atoi #define vm_string_strtod strtod #define vm_string_strtol strtol #define vm_string_sscanf sscanf #define vm_string_vsscanf vsscanf #define vm_string_strchr strchr typedef DIR* vm_findptr; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int32_t vm_string_vprintf(const vm_char *format, va_list argptr); #ifdef __cplusplus } #endif /* __cplusplus */ typedef int error_t; #endif /* __VM_STRINGS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/include/vm_types.h000066400000000000000000000040011443134507600277760ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __VM_TYPES_H__ #define __VM_TYPES_H__ #include #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #include #include #if defined(__GNUC__) #pragma GCC diagnostic pop #endif # include "sys/vm_types_linux32.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef enum e_vm_Status { VM_OK = 0, /* no error */ VM_OPERATION_FAILED =-999, VM_NOT_INITIALIZED =-998, VM_TIMEOUT =-987, VM_NOT_ENOUGH_DATA =-996, /* not enough input data */ VM_NULL_PTR =-995, VM_SO_CANT_LOAD =-994, VM_SO_INVALID_HANDLE =-993, VM_SO_CANT_GET_ADDR =-992 } vm_status; #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __VM_TYPES_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/src/000077500000000000000000000000001443134507600251305ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/src/vm_event_linux32.c000066400000000000000000000235171443134507600305130ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include "vm_event.h" static void vm_event_set_invalid_internal(vm_event *event) { memset(event, 0, sizeof(vm_event)); event->state = -1; } /* Invalidate an event */ void vm_event_set_invalid(vm_event *event) { /* check error(s) */ if (NULL == event) return; vm_event_set_invalid_internal(event); } /* void vm_event_set_invalid(vm_event *event) */ /* Verify if an event is valid */ int32_t vm_event_is_valid(vm_event *event) { /* check error(s) */ if (NULL == event) return 0; return event->state >= 0; } /* int32_t vm_event_is_valid(vm_event *event) */ /* Init an event. Event is created unset. return 1 if success */ vm_status vm_event_init(vm_event *event, int32_t manual, int32_t state) { pthread_condattr_t cond_attr; int res = 0; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; event->manual = manual; event->state = state ? 1 : 0; res = pthread_condattr_init(&cond_attr); if (!res) { pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC); res = pthread_cond_init(&event->cond, &cond_attr); if (!res) { res = pthread_mutex_init(&event->mutex, 0); if (res) { int cres = pthread_cond_destroy(&event->cond); assert(!cres); // we experienced undefined behavior (void)cres; vm_event_set_invalid_internal(event); } } pthread_condattr_destroy(&cond_attr); } return (res)? VM_OPERATION_FAILED: VM_OK; } /* vm_status vm_event_init(vm_event *event, int32_t manual, int32_t state) */ vm_status vm_event_named_init(vm_event * event, int32_t manual, int32_t state, const char * pcName) { (void)event; (void)manual; (void)state; (void)pcName; /* linux version of named events is not supported by now */ return VM_OPERATION_FAILED; } /* vm_status vm_event_named_init(vm_event *event, */ /* Set the event to either HIGH (1) or LOW (0) state */ vm_status vm_event_signal(vm_event *event) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; if (0 <= event->state) { res = pthread_mutex_lock(&event->mutex); if (!res) { umc_status = VM_OK; if (0 == event->state) { event->state = 1; if (event->manual) { res = pthread_cond_broadcast(&event->cond); if (res) { umc_status = VM_OPERATION_FAILED; } } else { res = pthread_cond_signal(&event->cond); if (res) { umc_status = VM_OPERATION_FAILED; } } } if (0 != pthread_mutex_unlock(&event->mutex)) { umc_status = VM_OPERATION_FAILED; } } else { umc_status = VM_OPERATION_FAILED; } } return umc_status; } /* vm_status vm_event_signal(vm_event *event) */ vm_status vm_event_reset(vm_event *event) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; if (0 <= event->state) { res = pthread_mutex_lock(&event->mutex); if (!res) { umc_status = VM_OK; if (1 == event->state) event->state = 0; if (0 != pthread_mutex_unlock(&event->mutex)) { umc_status = VM_OPERATION_FAILED; } } else { umc_status = VM_OPERATION_FAILED; } } return umc_status; } /* vm_status vm_event_reset(vm_event *event) */ /* Pulse the event 0 -> 1 -> 0 */ vm_status vm_event_pulse(vm_event *event) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; if (0 <= event->state) { res = pthread_mutex_lock(&event->mutex); if (!res) { umc_status = VM_OK; if (event->manual) { res = pthread_cond_broadcast(&event->cond); if (res) { umc_status = VM_OPERATION_FAILED; } } else { res = pthread_cond_signal(&event->cond); if (res) { umc_status = VM_OPERATION_FAILED; } } event->state = 0; if (0 != pthread_mutex_unlock(&event->mutex)) { umc_status = VM_OPERATION_FAILED; } } else { umc_status = VM_OPERATION_FAILED; } } return umc_status; } /* vm_status vm_event_pulse(vm_event *event) */ /* Wait for event to be high with blocking */ vm_status vm_event_wait(vm_event *event) { vm_status umc_status = VM_NOT_INITIALIZED; int res; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; if (0 <= event->state) { res = pthread_mutex_lock(&event->mutex); if (!res) { umc_status = VM_OK; if (!event->state) { while (!res && !event->state) { res = pthread_cond_wait(&event->cond,&event->mutex); } if (res) { umc_status = VM_OPERATION_FAILED; } } if (!event->manual) event->state = 0; if (0 != pthread_mutex_unlock(&event->mutex)) { umc_status = VM_OPERATION_FAILED; } } else { umc_status = VM_OPERATION_FAILED; } } return umc_status; } /* vm_status vm_event_wait(vm_event *event) */ /* Wait for event to be high without blocking, return 1 if successful */ vm_status vm_event_timed_wait(vm_event *event, uint32_t msec) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0; /* check error(s) */ if (NULL == event) return VM_NULL_PTR; if (0 <= event->state) { res = pthread_mutex_lock(&event->mutex); if (!res) { if (0 == event->state) { if (0 == msec) { umc_status = VM_TIMEOUT; } else { struct timespec tspec; int32_t i_res; unsigned long long nano_sec; clock_gettime(CLOCK_MONOTONIC, &tspec); // NOTE: nano_sec _should_ be unsigned long long, not uint32_t to avoid overflow nano_sec = 1000000 * msec + tspec.tv_nsec; tspec.tv_sec += (uint32_t)(nano_sec / 1000000000); tspec.tv_nsec = (uint32_t)(nano_sec % 1000000000); i_res = 0; while (!i_res && !event->state) { i_res = pthread_cond_timedwait(&event->cond, &event->mutex, &tspec); } if (0 == i_res) umc_status = VM_OK; else if (ETIMEDOUT == i_res) umc_status = VM_TIMEOUT; else umc_status = VM_OPERATION_FAILED; } } else umc_status = VM_OK; if (!event->manual) event->state = 0; } else { umc_status = VM_OPERATION_FAILED; } if(pthread_mutex_unlock(&event->mutex)) { umc_status = VM_OPERATION_FAILED; } } return umc_status; } /* vm_status vm_event_timed_wait(vm_event *event, uint32_t msec) */ /* Destory the event */ void vm_event_destroy(vm_event *event) { /* check error(s) */ if (NULL == event) return; if (event->state >= 0) { int res = pthread_cond_destroy(&event->cond); (void) res; assert(!res); // we experienced undefined behavior res = pthread_mutex_destroy(&event->mutex); assert(!res); // we experienced undefined behavior vm_event_set_invalid_internal(event); } } /* void vm_event_destroy(vm_event *event) */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/src/vm_interlocked_unix.c000066400000000000000000000064441443134507600313540ustar00rootroot00000000000000// Copyright (c) 2010-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include static uint16_t vm_interlocked_add16(volatile uint16_t *pVariable, uint16_t value_to_add) { asm volatile ("lock; xaddw %0,%1" : "=r" (value_to_add), "=m" (*pVariable) : "0" (value_to_add), "m" (*pVariable) : "memory", "cc"); return value_to_add; } static uint32_t vm_interlocked_add32(volatile uint32_t *pVariable, uint32_t value_to_add) { asm volatile ("lock; xaddl %0,%1" : "=r" (value_to_add), "=m" (*pVariable) : "0" (value_to_add), "m" (*pVariable) : "memory", "cc"); return value_to_add; } uint16_t vm_interlocked_inc16(volatile uint16_t *pVariable) { return vm_interlocked_add16(pVariable, 1) + 1; } /* uint16_t vm_interlocked_inc16(uint16_t *pVariable) */ uint16_t vm_interlocked_dec16(volatile uint16_t *pVariable) { return vm_interlocked_add16(pVariable, (uint16_t)-1) - 1; } /* uint16_t vm_interlocked_dec16(uint16_t *pVariable) */ uint32_t vm_interlocked_inc32(volatile uint32_t *pVariable) { return vm_interlocked_add32(pVariable, 1) + 1; } /* uint32_t vm_interlocked_inc32(uint32_t *pVariable) */ uint32_t vm_interlocked_dec32(volatile uint32_t *pVariable) { return vm_interlocked_add32(pVariable, (uint32_t)-1) - 1; } /* uint32_t vm_interlocked_dec32(uint32_t *pVariable) */ uint32_t vm_interlocked_cas32(volatile uint32_t *pVariable, uint32_t value_to_exchange, uint32_t value_to_compare) { uint32_t previous_value; asm volatile ("lock; cmpxchgl %1,%2" : "=a" (previous_value) : "r" (value_to_exchange), "m" (*pVariable), "0" (value_to_compare) : "memory", "cc"); return previous_value; } /* uint32_t vm_interlocked_cas32(volatile uint32_t *pVariable, uint32_t value_to_exchange, uint32_t value_to_compare) */ uint32_t vm_interlocked_xchg32(volatile uint32_t *pVariable, uint32_t value) { uint32_t previous_value = value; asm volatile ("lock; xchgl %0,%1" : "=r" (previous_value), "+m" (*pVariable) : "0" (previous_value)); return previous_value; } /* uint32_t vm_interlocked_xchg32(volatile uint32_t *pVariable, uint32_t value); */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/src/vm_semaphore_linux32.c000066400000000000000000000222751443134507600313550ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #include #include "vm_semaphore.h" static void vm_semaphore_set_invalid_internal(vm_semaphore *sem) { memset(sem, 0, sizeof(vm_semaphore)); sem->count = -1; } /* Invalidate a semaphore */ void vm_semaphore_set_invalid(vm_semaphore *sem) { /* check error(s) */ if (NULL == sem) return; vm_semaphore_set_invalid_internal(sem); } /* void vm_semaphore_set_invalid(vm_semaphore *sem) */ /* Verify if a semaphore is valid */ int32_t vm_semaphore_is_valid(vm_semaphore *sem) { /* check error(s) */ if (NULL == sem) return 0; return (-1 < sem->count); } /* int32_t vm_semaphore_is_valid(vm_semaphore *sem) */ /* Init a semaphore with value */ vm_status vm_semaphore_init(vm_semaphore *sem, int32_t init_count) { pthread_condattr_t cond_attr; int res = 0; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; sem->count = init_count; sem->max_count = 1; res = pthread_condattr_init(&cond_attr); if (!res) { res = pthread_cond_init(&sem->cond, &cond_attr); if (!res) { res = pthread_mutex_init(&sem->mutex, 0); if (res) { int cres = pthread_cond_destroy(&sem->cond); assert(!cres); // we experienced undefined behavior (void)cres; vm_semaphore_set_invalid_internal(sem); } } pthread_condattr_destroy(&cond_attr); } return (res)? VM_OPERATION_FAILED: VM_OK; } /* vm_status vm_semaphore_init(vm_semaphore *sem, int32_t init_count) */ vm_status vm_semaphore_init_max(vm_semaphore *sem, int32_t init_count, int32_t max_count) { int res = 0; pthread_condattr_t cond_attr; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; sem->count = init_count; sem->max_count = max_count; res = pthread_condattr_init(&cond_attr); if (!res) { pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC); res = pthread_cond_init(&sem->cond, &cond_attr); if (!res) { res = pthread_mutex_init(&sem->mutex, 0); if (res) { int cres = pthread_cond_destroy(&sem->cond); assert(!cres); // we experienced undefined behavior (void)cres; vm_semaphore_set_invalid_internal(sem); } } pthread_condattr_destroy(&cond_attr); } return (res)? VM_OPERATION_FAILED: VM_OK; } /* vm_status vm_semaphore_init_max(vm_semaphore *sem, int32_t init_count, int32_t max_count) */ /* Decrease the semaphore value with blocking. */ vm_status vm_semaphore_timedwait(vm_semaphore *sem, uint32_t msec) { vm_status umc_status = VM_NOT_INITIALIZED; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; if (0 <= sem->count) { umc_status = VM_OK; int32_t i_res = 0; i_res = pthread_mutex_lock(&sem->mutex); if (!i_res) { if (0 == sem->count) { struct timespec tspec; unsigned long long nano_sec; clock_gettime(CLOCK_MONOTONIC, &tspec); nano_sec = 1000000 * msec + tspec.tv_nsec; tspec.tv_sec += (uint32_t)(nano_sec / 1000000000); tspec.tv_nsec = (uint32_t)(nano_sec % 1000000000); i_res = 0; while (!i_res && !sem->count) { i_res = pthread_cond_timedwait(&sem->cond, &sem->mutex, &tspec); } if (ETIMEDOUT == i_res) umc_status = VM_TIMEOUT; else if (0 != i_res) umc_status = VM_OPERATION_FAILED; } if (VM_OK == umc_status) sem->count--; if (pthread_mutex_unlock(&sem->mutex)) { if (VM_OK == umc_status) umc_status = VM_OPERATION_FAILED; } } else umc_status = VM_OPERATION_FAILED; } return umc_status; } /* vm_status vm_semaphore_timedwait(vm_semaphore *sem, uint32_t msec) */ /* Decrease the semaphore value with blocking. */ vm_status vm_semaphore_wait(vm_semaphore *sem) { vm_status umc_status = VM_NOT_INITIALIZED; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; if (0 <= sem->count) { umc_status = VM_OK; if (0 == pthread_mutex_lock(&sem->mutex)) { while (0 == sem->count && umc_status == VM_OK) if (0 != pthread_cond_wait(&sem->cond, &sem->mutex)) umc_status = VM_OPERATION_FAILED; if (VM_OK == umc_status) sem->count--; if (pthread_mutex_unlock(&sem->mutex)) umc_status = VM_OPERATION_FAILED; } else umc_status = VM_OPERATION_FAILED; } return umc_status; } /* vm_status vm_semaphore_wait(vm_semaphore *sem) */ /* Decrease the semaphore value without blocking, return 1 if success */ vm_status vm_semaphore_try_wait(vm_semaphore *sem) { vm_status umc_status = VM_NOT_INITIALIZED; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; if (0 <= sem->count) { if (0 == pthread_mutex_lock(&sem->mutex)) { if (0 == sem->count) umc_status = VM_TIMEOUT; else { sem->count--; umc_status = VM_OK; } if (pthread_mutex_unlock(&sem->mutex)) { if (VM_OK == umc_status) umc_status = VM_OPERATION_FAILED; } } else umc_status = VM_OPERATION_FAILED; } return umc_status; } /* vm_status vm_semaphore_try_wait(vm_semaphore *sem) */ /* Increase the semaphore value */ vm_status vm_semaphore_post(vm_semaphore *sem) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; if (0 <= sem->count) { if (0 == pthread_mutex_lock(&sem->mutex)) { sem->count++; res = pthread_cond_signal(&sem->cond); umc_status = (res)? VM_OPERATION_FAILED: VM_OK; if (pthread_mutex_unlock(&sem->mutex)) { umc_status = VM_OPERATION_FAILED; } } else umc_status = VM_OPERATION_FAILED; } return umc_status; } /* vm_status vm_semaphore_post(vm_semaphore *sem) */ /* Increase the semaphore value */ vm_status vm_semaphore_post_many(vm_semaphore *sem, int32_t post_count) { vm_status umc_status = VM_NOT_INITIALIZED; int res = 0, sts = 0; /* check error(s) */ if (NULL == sem) return VM_NULL_PTR; if (post_count > sem->max_count) return VM_OPERATION_FAILED; if (0 <= sem->count) { int32_t i; for (i = 0; i < post_count; i++) { res = pthread_mutex_lock(&sem->mutex); if (0 == res) { sem->count++; sts = pthread_cond_signal(&sem->cond); if (!res) res = sts; sts = pthread_mutex_unlock(&sem->mutex); if (!res) res = sts; } if(res) { break; } } umc_status = (res)? VM_OPERATION_FAILED: VM_OK; } return umc_status; } /* vm_status vm_semaphore_post_many(vm_semaphore *sem, int32_t post_count) */ /* Destory a semaphore */ void vm_semaphore_destroy(vm_semaphore *sem) { /* check error(s) */ if (NULL == sem) return; if (0 <= sem->count) { int res = pthread_cond_destroy(&sem->cond); (void) res; assert(!res); // we experienced undefined behavior res = pthread_mutex_destroy(&sem->mutex); assert(!res); // we experienced undefined behavior vm_semaphore_set_invalid_internal(sem); } } /* void vm_semaphore_destroy(vm_semaphore *sem) */ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm/src/vm_strings_unix.c000066400000000000000000000025101443134507600305300ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "vm_strings.h" int32_t vm_string_vprintf(const vm_char *format, va_list argptr) { int32_t sts = 0; va_list copy; va_copy(copy, argptr); sts = vprintf(format, copy); va_end(argptr); return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/000077500000000000000000000000001443134507600254045ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/CMakeLists.txt000066400000000000000000000011061443134507600301420ustar00rootroot00000000000000add_library(vm_plus STATIC) set_property(TARGET vm_plus PROPERTY FOLDER "umc") target_sources(vm_plus PRIVATE include/sys/mfx_vm++_pthread_unix.h include/umc_event.h include/umc_mutex.h include/umc_semaphore.h include/mfx_vm++_pthread.h src/mfx_vm++_pthread.cpp src/mfx_vm++_pthread_unix.cpp src/umc_event.cpp src/umc_semaphore.cpp ) target_include_directories(vm_plus PUBLIC include ) target_link_libraries(vm_plus PUBLIC vm umc mfx_static_lib PRIVATE mfx_sdl_properties ) include(sources_ext.cmake OPTIONAL)oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/000077500000000000000000000000001443134507600270275ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/mfx_vm++_pthread.h000066400000000000000000000050021443134507600323260ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_VMPLUSPLUS_PTHREAD_H__ #define __MFX_VMPLUSPLUS_PTHREAD_H__ #include "mfxdefs.h" #include /* Getting platform-specific definitions. */ #include "sys/mfx_vm++_pthread_unix.h" /*------------------------------------------------------------------------------*/ class MfxMutex { public: MfxMutex(void); virtual ~MfxMutex(void); mfxStatus Lock(void); mfxStatus Unlock(void); bool TryLock(void); private: // variables MfxMutexHandle m_handle; private: // functions MfxMutex(const MfxMutex&); MfxMutex& operator=(const MfxMutex&); }; /*------------------------------------------------------------------------------*/ class MfxAutoMutex { public: MfxAutoMutex(MfxMutex& mutex); virtual ~MfxAutoMutex(void); mfxStatus Lock(void); mfxStatus Unlock(void); private: // variables MfxMutex& m_rMutex; bool m_bLocked; private: // functions MfxAutoMutex(const MfxAutoMutex&); MfxAutoMutex& operator=(const MfxAutoMutex&); // The following overloading 'new' operators prohibit // creating the object on the heap which is inefficient from // performance/memory point of view void* operator new(size_t); void* operator new(size_t, void*); void* operator new[](size_t); void* operator new[](size_t, void*); }; /*------------------------------------------------------------------------------*/ #endif //__MFX_VMPLUSPLUS_PTHREAD_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/sys/000077500000000000000000000000001443134507600276455ustar00rootroot00000000000000mfx_vm++_pthread_unix.h000066400000000000000000000024621443134507600341370ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/sys// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __MFX_VMPLUSPLUS_PTHREAD_UNIX_H__ #define __MFX_VMPLUSPLUS_PTHREAD_UNIX_H__ #include struct MfxMutexHandle { pthread_mutex_t m_mutex; }; #endif //__MFX_VMPLUSPLUS_PTHREAD_UNIX_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/umc_event.h000066400000000000000000000046331443134507600311730ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_EVENT_H__ #define __UMC_EVENT_H__ #include "vm_event.h" #include "umc_structures.h" namespace UMC { class Event { public: // Default constructor Event(void); // Destructor virtual ~Event(void); // Initialize event Status Init(int32_t iManual, int32_t iState); // Set event to signaled state Status Set(void); // Set event to non-signaled state Status Reset(void); // Pulse event (should not be used) Status Pulse(void); // Wait until event is signaled Status Wait(uint32_t msec); // Infinitely wait until event is signaled Status Wait(void); protected: vm_event m_handle; // (vm_event) handle to system event }; inline Status Event::Set(void) { return vm_event_signal(&m_handle); } // Status Event::Set(void) inline Status Event::Reset(void) { return vm_event_reset(&m_handle); } // Status Event::Reset(void) inline Status Event::Pulse(void) { return vm_event_pulse(&m_handle); } // Status Event::Pulse(void) inline Status Event::Wait(uint32_t msec) { return vm_event_timed_wait(&m_handle, msec); } // Status Event::Wait(uint32_t msec) inline Status Event::Wait(void) { return vm_event_wait(&m_handle); } // Status Event::Wait(void) } // namespace UMC #endif // __UMC_EVENT_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/umc_mutex.h000066400000000000000000000042671443134507600312170ustar00rootroot00000000000000// Copyright (c) 2003-2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_MUTEX_H__ #define __UMC_MUTEX_H__ #include "mfx_vm++_pthread.h" #include "umc_structures.h" namespace UMC { class Mutex : public MfxMutex { public: Mutex(void): MfxMutex() {} // Try to get ownership of mutex inline Status TryLock(void) { return (MfxMutex::TryLock())? UMC_OK: UMC_ERR_TIMEOUT; } private: // functions Mutex(const Mutex&); Mutex& operator=(const Mutex&); }; class AutomaticUMCMutex : public MfxAutoMutex { public: // Constructor AutomaticUMCMutex(UMC::Mutex &mutex) : MfxAutoMutex(mutex) { } private: // functions // Preventing copy constructor and operator= AutomaticUMCMutex(const AutomaticUMCMutex&); AutomaticUMCMutex& operator=(const AutomaticUMCMutex&); // The following overloading 'new' operators prohibit // creating the object on the heap which is inefficient from // performance/memory point of view void* operator new(size_t); void* operator new(size_t, void*); void* operator new[](size_t); void* operator new[](size_t, void*); }; } // namespace UMC #endif // __UMC_MUTEX_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/include/umc_semaphore.h000066400000000000000000000051621443134507600320330ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_SEMAPHORE_H__ #define __UMC_SEMAPHORE_H__ #include "vm_semaphore.h" #include "umc_structures.h" namespace UMC { class Semaphore { public: // Default constructor Semaphore(void); // Destructor virtual ~Semaphore(void); // Initialize semaphore Status Init(int32_t iInitCount); Status Init(int32_t iInitCount, int32_t iMaxCount); // Check semaphore state bool IsValid(void); // Try to obtain semaphore Status TryWait(void); // Wait until semaphore is signaled Status Wait(uint32_t msec); // Infinitely wait until semaphore is signaled Status Wait(void); // Set semaphore to signaled state Status Signal(uint32_t count = 1); protected: vm_semaphore m_handle; // (vm_semaphore) handle to system semaphore }; inline bool Semaphore::IsValid(void) { return vm_semaphore_is_valid(&m_handle) ? true : false; } // bool Semaphore::IsValid(void) inline Status Semaphore::TryWait(void) { return vm_semaphore_try_wait(&m_handle); } // Status Semaphore::TryWait(void) inline Status Semaphore::Wait(uint32_t msec) { return vm_semaphore_timedwait(&m_handle, msec); } // Status Semaphore::Wait(uint32_t msec) inline Status Semaphore::Wait(void) { return vm_semaphore_wait(&m_handle); } // Status Semaphore::Wait(void) inline Status Semaphore::Signal(uint32_t count) { return vm_semaphore_post_many(&m_handle, count); } // Status Semaphore::Signal(uint32_t count) } // namespace UMC #endif // __UMC_SEMAPHORE_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/src/000077500000000000000000000000001443134507600261735ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/src/mfx_vm++_pthread.cpp000066400000000000000000000035021443134507600320300ustar00rootroot00000000000000// Copyright (c) 2012-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "mfx_vm++_pthread.h" MfxAutoMutex::MfxAutoMutex(MfxMutex& mutex): m_rMutex(mutex), m_bLocked(false) { if (MFX_ERR_NONE != Lock()) throw std::bad_alloc(); } MfxAutoMutex::~MfxAutoMutex(void) { Unlock(); } mfxStatus MfxAutoMutex::Lock(void) { mfxStatus sts = MFX_ERR_NONE; if (!m_bLocked) { if (!m_rMutex.TryLock()) { /* add time measurement here to estimate how long you sleep on mutex... */ sts = m_rMutex.Lock(); } m_bLocked = true; } return sts; } mfxStatus MfxAutoMutex::Unlock(void) { mfxStatus sts = MFX_ERR_NONE; if (m_bLocked) { sts = m_rMutex.Unlock(); m_bLocked = false; } return sts; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/src/mfx_vm++_pthread_unix.cpp000066400000000000000000000043051443134507600330750ustar00rootroot00000000000000// Copyright (c) 2012-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if !defined _GNU_SOURCE # define _GNU_SOURCE /* may need on some OS to support PTHREAD_MUTEX_RECURSIVE */ #endif #include "mfx_vm++_pthread.h" #include struct _MfxMutexHandle { pthread_mutex_t m_mutex; }; MfxMutex::MfxMutex(void) { int res = 0; pthread_mutexattr_t mutex_attr; res = pthread_mutexattr_init(&mutex_attr); if (!res) { res = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); if (!res) res = pthread_mutex_init(&m_handle.m_mutex, &mutex_attr); pthread_mutexattr_destroy(&mutex_attr); } if (res) throw std::bad_alloc(); } MfxMutex::~MfxMutex(void) { int res = pthread_mutex_destroy(&m_handle.m_mutex); assert(!res); // we experienced undefined behavior (void)res; } mfxStatus MfxMutex::Lock(void) { return (pthread_mutex_lock(&m_handle.m_mutex))? MFX_ERR_UNKNOWN: MFX_ERR_NONE; } mfxStatus MfxMutex::Unlock(void) { return (pthread_mutex_unlock(&m_handle.m_mutex))? MFX_ERR_UNKNOWN: MFX_ERR_NONE; } bool MfxMutex::TryLock(void) { return (pthread_mutex_trylock(&m_handle.m_mutex))? false: true; } oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/src/umc_event.cpp000066400000000000000000000034311443134507600306650ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_event.h" namespace UMC { Event::Event(void) { vm_event_set_invalid(&m_handle); } // Event::Event(void) Event::~Event(void) { if (vm_event_is_valid(&m_handle)) { vm_event_signal(&m_handle); vm_event_destroy(&m_handle); } } // Event::~Event(void) Status Event::Init(int32_t iManual, int32_t iState) { Status umcRes = UMC_OK; if (vm_event_is_valid(&m_handle)) { umcRes = vm_event_signal(&m_handle); vm_event_destroy(&m_handle); } if (UMC_OK == umcRes) umcRes = vm_event_init(&m_handle, iManual, iState); return umcRes; } // Status Event::Init(int32_t iManual, int32_t iState) } // namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/core/vm_plus/src/umc_semaphore.cpp000066400000000000000000000040661443134507600315340ustar00rootroot00000000000000// Copyright (c) 2003-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_semaphore.h" namespace UMC { Semaphore::Semaphore(void) { vm_semaphore_set_invalid(&m_handle); } // Semaphore::Semaphore(void) Semaphore::~Semaphore(void) { if (vm_semaphore_is_valid(&m_handle)) { vm_semaphore_post(&m_handle); vm_semaphore_destroy(&m_handle); } } // Semaphore::~Semaphore(void) Status Semaphore::Init(int32_t iInitCount) { if (vm_semaphore_is_valid(&m_handle)) { vm_semaphore_post(&m_handle); vm_semaphore_destroy(&m_handle); } return vm_semaphore_init(&m_handle, iInitCount); } // Status Semaphore::Init(int32_t iInitCount) Status Semaphore::Init(int32_t iInitCount, int32_t iMaxCount) { if (vm_semaphore_is_valid(&m_handle)) { vm_semaphore_post(&m_handle); vm_semaphore_destroy(&m_handle); } return vm_semaphore_init_max(&m_handle, iInitCount, iMaxCount); } // Status Semaphore::Init(int32_t iInitCount, int32_t iMaxCount) } // namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/000077500000000000000000000000001443134507600233765ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/000077500000000000000000000000001443134507600246505ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/include/000077500000000000000000000000001443134507600262735ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/include/umc_va.h000066400000000000000000000022761443134507600277250ustar00rootroot00000000000000// Copyright (c) 2006-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VA_H__ #define __UMC_VA_H__ #include "umc_va_base.h" #endif // __UMC_VA_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/include/umc_va_linux.h000066400000000000000000000127721443134507600311460ustar00rootroot00000000000000// Copyright (c) 2006-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VA_LINUX_H__ #define __UMC_VA_LINUX_H__ #include "umc_va_base.h" #include #include namespace UMC { #define UMC_VA_LINUX_INDEX_UNDEF -1 #define UMC_VA_LINUX_ATTRIB_SIZE 4 /* VACompBuffer --------------------------------------------------------------*/ class VACompBuffer : public UMCVACompBuffer { public: // constructor VACompBuffer(void); // destructor virtual ~VACompBuffer(void); // UMCVACompBuffer methods virtual void SetNumOfItem(int32_t num) { m_NumOfItem = num; }; // VACompBuffer methods virtual Status SetBufferInfo (int32_t _type, int32_t _id, int32_t _index = -1); virtual Status SetDestroyStatus(bool _destroy); virtual int32_t GetIndex(void) { return m_index; } virtual int32_t GetID(void) { return m_id; } virtual int32_t GetNumOfItem(void){ return m_NumOfItem; } virtual bool NeedDestroy(void) { return m_bDestroy; } protected: int32_t m_NumOfItem; //number of items in buffer int32_t m_index; int32_t m_id; bool m_bDestroy; }; /* LinuxVideoAcceleratorParams -----------------------------------------------*/ class LinuxVideoAcceleratorParams : public VideoAcceleratorParams { DYNAMIC_CAST_DECL(LinuxVideoAcceleratorParams, VideoAcceleratorParams); public: LinuxVideoAcceleratorParams(void) { m_Display = NULL; m_bComputeVAFncsInfo = false; m_pConfigId = NULL; m_pContext = NULL; m_pKeepVAState = NULL; m_CreateFlags = VA_PROGRESSIVE; } VADisplay m_Display; bool m_bComputeVAFncsInfo; VAConfigID* m_pConfigId; VAContextID* m_pContext; bool* m_pKeepVAState; int m_CreateFlags; }; /* LinuxVideoAccelerator -----------------------------------------------------*/ enum lvaFrameState { lvaBeforeBegin = 0, lvaBeforeEnd = 1, lvaNeedUnmap = 2 }; class LinuxVideoAccelerator : public VideoAccelerator { DYNAMIC_CAST_DECL(LinuxVideoAccelerator, VideoAccelerator); public: // constructor LinuxVideoAccelerator (void); // destructor virtual ~LinuxVideoAccelerator(void); // VideoAccelerator methods Status Init (VideoAcceleratorParams* pInfo) override; Status Close () override; Status BeginFrame (int32_t FrameBufIndex) override; // gets buffer from cache if it exists or HW otherwise, buffers will be released in EndFrame void* GetCompBuffer(int32_t buffer_type, UMCVACompBuffer **buf, int32_t size, int32_t index) override; Status Execute (void) override; Status ExecuteExtensionBuffer(void*) override { return UMC_ERR_UNSUPPORTED; } Status ExecuteStatusReportBuffer(void*, int32_t /*size*/) override { return UMC_ERR_UNSUPPORTED; } Status SyncTask(int32_t index, void * error = NULL) override; Status QueryTaskStatus(int32_t index, void * status, void * error) override; Status ReleaseBuffer(int32_t /*type*/) override { return UMC_OK; }; Status EndFrame (void*) override; bool IsIntelCustomGUID() const override { return false; } int32_t GetSurfaceID (int32_t idx) const override; void GetVideoDecoder(void** /*handle*/) override {}; Status ExecuteExtension(int, ExtensionData const&) override { return UMC_ERR_UNSUPPORTED; } protected: // VideoAcceleratorExt methods virtual Status AllocCompBuffers(void); virtual VACompBuffer* GetCompBufferHW(int32_t type, int32_t size, int32_t index = -1); // LinuxVideoAccelerator methods uint16_t GetDecodingError(); void SetTraceStrings(uint32_t umc_codec); virtual Status SetAttributes(VAProfile va_profile, LinuxVideoAcceleratorParams* pParams, VAConfigAttrib *attribute, int32_t *attribsNumber); protected: VADisplay m_dpy; VAConfigID* m_pConfigId; VAContextID* m_pContext; bool* m_pKeepVAState; lvaFrameState m_FrameState; uint32_t m_uiCompBuffersNum; uint32_t m_uiCompBuffersUsed; std::mutex m_SyncMutex; VACompBuffer** m_pCompBuffers; const char * m_sDecodeTraceStart; const char * m_sDecodeTraceEnd; GUID m_guidDecoder; private: std::set m_associatedIds; }; }; // namespace UMC #ifdef __cplusplus extern "C" { #endif // __cplusplus extern UMC::Status va_to_umc_res(VAStatus va_res); #ifdef __cplusplus } #endif // __cplusplus #endif // #ifndef __UMC_VA_LINUX_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/include/umc_va_protected.h000066400000000000000000000034201443134507600317660ustar00rootroot00000000000000// Copyright (c) 2006-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VA_PROTECTED_H #define __UMC_VA_PROTECTED_H #pragma once #include "mfx_common.h" #if defined(MFX_ENABLE_PROTECT) namespace UMC { enum ProtectionType { PROTECTION_TYPE_PXP, PROTECTION_TYPE_PAVP }; class ProtectedVA { public: ProtectedVA(mfxU16 p = 0) : m_bs(nullptr) { (void)p; }; virtual mfxBitstream* GetBitstream() { return m_bs; } virtual void SetBitstream(mfxBitstream* bs) { m_bs = bs; } mfxU32 GetType() { #if defined(MFX_ENABLE_PXP) return PROTECTION_TYPE_PXP; #else return PROTECTION_TYPE_PAVP; #endif } protected: mfxBitstream *m_bs; }; } #endif // MFX_ENABLE_PROTECT #endif //__UMC_VA_PROTECTED_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/include/umc_va_video_processing.h000066400000000000000000000035561443134507600333510ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __UMC_VA_VIDEO_PROCESSING_H #define __UMC_VA_VIDEO_PROCESSING_H #include "umc_va_base.h" #include "mfxstructures.h" namespace UMC { class VideoProcessingVA { public: VideoProcessingVA(); virtual ~VideoProcessingVA(); #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE virtual Status Init(mfxVideoParam * vpParams, mfxExtDecVideoProcessing * videoProcessing); virtual void SetOutputSurface(mfxHDL surfHDL); mfxHDL GetCurrentOutputSurface() const; VAProcPipelineParameterBuffer m_pipelineParams; protected: VARectangle m_surf_region; VARectangle m_output_surf_region; VASurfaceID output_surface_array[1]; mfxHDL m_currentOutputSurface; #endif // #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE }; } #endif // __UMC_VA_VIDEO_PROCESSING_H oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/src/000077500000000000000000000000001443134507600254375ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp000066400000000000000000001057521443134507600306460ustar00rootroot00000000000000// Copyright (c) 2006-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include "umc_defs.h" #include "umc_va_linux.h" #include "umc_va_video_processing.h" #include "mfx_trace.h" #include "umc_frame_allocator.h" #include "mfxstructures.h" #define UMC_VA_NUM_OF_COMP_BUFFERS 8 #define UMC_VA_DECODE_STREAM_OUT_ENABLE 2 UMC::Status va_to_umc_res(VAStatus va_res) { UMC::Status umcRes = UMC::UMC_OK; switch (va_res) { case VA_STATUS_SUCCESS: umcRes = UMC::UMC_OK; break; case VA_STATUS_ERROR_ALLOCATION_FAILED: umcRes = UMC::UMC_ERR_ALLOC; break; case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED: case VA_STATUS_ERROR_UNSUPPORTED_PROFILE: case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT: case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT: case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED: case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED: umcRes = UMC::UMC_ERR_UNSUPPORTED; break; case VA_STATUS_ERROR_INVALID_DISPLAY: case VA_STATUS_ERROR_INVALID_CONFIG: case VA_STATUS_ERROR_INVALID_CONTEXT: case VA_STATUS_ERROR_INVALID_SURFACE: case VA_STATUS_ERROR_INVALID_BUFFER: case VA_STATUS_ERROR_INVALID_IMAGE: case VA_STATUS_ERROR_INVALID_SUBPICTURE: umcRes = UMC::UMC_ERR_INVALID_PARAMS; break; case VA_STATUS_ERROR_INVALID_PARAMETER: umcRes = UMC::UMC_ERR_INVALID_PARAMS; break; case VA_STATUS_ERROR_DECODING_ERROR: umcRes = UMC::UMC_ERR_DEVICE_FAILED; break; case VA_STATUS_ERROR_HW_BUSY: umcRes = UMC::UMC_ERR_GPU_HANG; break; default: umcRes = UMC::UMC_ERR_FAILED; break; } return umcRes; } VAEntrypoint umc_to_va_entrypoint(uint32_t umc_entrypoint) { VAEntrypoint va_entrypoint = (VAEntrypoint)-1; switch (umc_entrypoint) { case UMC::VA_VLD: case UMC::VA_VLD | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_10: case UMC::VA_VLD | UMC::VA_PROFILE_10 | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_REXT: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_422: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10 | UMC::VA_PROFILE_422: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10 | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_12: case UMC::VA_VLD | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_422: case UMC::VA_VLD | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_SCC: case UMC::VA_VLD | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_10: case UMC::VA_VLD | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_444: case UMC::VA_VLD | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_444 | UMC::VA_PROFILE_10: va_entrypoint = VAEntrypointVLD; break; default: va_entrypoint = (VAEntrypoint)-1; break; } return va_entrypoint; } // profile priorities for codecs uint32_t g_Profiles[] = { UMC::MPEG2_VLD, UMC::H264_VLD, UMC::H265_VLD, UMC::VC1_VLD, UMC::VP8_VLD, UMC::VP9_VLD, UMC::JPEG_VLD, #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) UMC::AV1_VLD, #endif }; // va profile priorities for different codecs VAProfile g_Mpeg2Profiles[] = { VAProfileMPEG2Main, VAProfileMPEG2Simple }; VAProfile g_H264Profiles[] = { VAProfileH264High, VAProfileH264Main, VAProfileH264ConstrainedBaseline }; VAProfile g_H265Profiles[] = { VAProfileHEVCMain //VAProfileHEVCMain444, }; VAProfile g_H26510BitsProfiles[] = { VAProfileHEVCMain10 //VAProfileHEVCMain422_10, //VAProfileHEVCMain444_10, }; VAProfile g_VC1Profiles[] = { VAProfileVC1Advanced, VAProfileVC1Main, VAProfileVC1Simple }; VAProfile g_VP8Profiles[] = { VAProfileVP8Version0_3 }; VAProfile g_VP9Profiles[] = { VAProfileVP9Profile1, // chroma subsampling: 4:2:0, 4:2:2, 4:4:4 VAProfileVP9Profile0 // chroma subsampling: 4:2:0 }; VAProfile g_VP910BitsProfiles[] = { VAProfileVP9Profile3, // chroma subsampling: 4:2:0, 4:2:2, 4:4:4 VAProfileVP9Profile2 // chroma subsampling: 4:2:0 }; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) VAProfile g_AV1Profiles[] = { VAProfileAV1Profile0 }; VAProfile g_AV110BitsPProfiles[] = { VAProfileAV1Profile0 }; #endif VAProfile g_JPEGProfiles[] = { VAProfileJPEGBaseline }; VAProfile get_next_va_profile(uint32_t umc_codec, uint32_t profile) { VAProfile va_profile = (VAProfile)-1; switch (umc_codec) { case UMC::VA_MPEG2: if (profile < UMC_ARRAY_SIZE(g_Mpeg2Profiles)) va_profile = g_Mpeg2Profiles[profile]; break; case UMC::VA_H264: if (profile < UMC_ARRAY_SIZE(g_H264Profiles)) va_profile = g_H264Profiles[profile]; break; case UMC::VA_H265: if (profile < UMC_ARRAY_SIZE(g_H265Profiles)) va_profile = g_H265Profiles[profile]; break; case UMC::VA_H265| UMC::VA_PROFILE_422 | UMC::VA_PROFILE_REXT: if (profile < 1) va_profile = VAProfileHEVCMain422_10; break; case UMC::VA_H265| UMC::VA_PROFILE_444 | UMC::VA_PROFILE_REXT: if (profile < 1) va_profile = VAProfileHEVCMain444; break; case UMC::VA_H265 | UMC::VA_PROFILE_10: if (profile < UMC_ARRAY_SIZE(g_H26510BitsProfiles)) va_profile = g_H26510BitsProfiles[profile]; break; case UMC::VA_H265 | UMC::VA_PROFILE_REXT: case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10: case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10 | UMC::VA_PROFILE_422: if (profile < 1) va_profile = VAProfileHEVCMain422_10; break; case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10 | UMC::VA_PROFILE_444: if (profile < 1) va_profile = VAProfileHEVCMain444_10; break; case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12: case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_422: if (profile < 1) va_profile = VAProfileHEVCMain422_12; break; case UMC::VA_H265 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_444: if (profile < 1) va_profile = VAProfileHEVCMain444_12; break; case UMC::VA_H265 | UMC::VA_PROFILE_SCC: if (profile < 1) va_profile = VAProfileHEVCSccMain; break; case UMC::VA_H265 | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_10: if (profile < 1) va_profile = VAProfileHEVCSccMain10; break; case UMC::VA_H265 | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_444: if (profile < 1) va_profile = VAProfileHEVCSccMain444; case UMC::VA_H265 | UMC::VA_PROFILE_SCC | UMC::VA_PROFILE_444 | UMC::VA_PROFILE_10: if (profile < 1) va_profile = VAProfileHEVCSccMain444_10; break; case UMC::VA_VC1: if (profile < UMC_ARRAY_SIZE(g_VC1Profiles)) va_profile = g_VC1Profiles[profile]; break; case UMC::VA_VP8: if (profile < UMC_ARRAY_SIZE(g_VP8Profiles)) va_profile = g_VP8Profiles[profile]; break; case UMC::VA_VP9: case UMC::VA_VP9 | UMC::VA_PROFILE_444: if (profile < UMC_ARRAY_SIZE(g_VP9Profiles)) va_profile = g_VP9Profiles[profile]; break; case UMC::VA_VP9 | UMC::VA_PROFILE_10: case UMC::VA_VP9 | UMC::VA_PROFILE_444 | UMC::VA_PROFILE_10: if (profile < UMC_ARRAY_SIZE(g_VP910BitsProfiles)) va_profile = g_VP910BitsProfiles[profile]; break; case UMC::VA_VP9 | UMC::VA_PROFILE_12: case UMC::VA_VP9 | UMC::VA_PROFILE_12 | UMC::VA_PROFILE_444: if (profile < UMC_ARRAY_SIZE(g_VP910BitsProfiles)) va_profile = g_VP910BitsProfiles[profile]; break; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case UMC::VA_AV1: if (profile < UMC_ARRAY_SIZE(g_AV1Profiles)) va_profile = g_AV1Profiles[profile]; break; case UMC::VA_AV1 | UMC::VA_PROFILE_10: if (profile < UMC_ARRAY_SIZE(g_AV110BitsPProfiles)) va_profile = g_AV110BitsPProfiles[profile]; break; #endif case UMC::VA_JPEG: if (profile < UMC_ARRAY_SIZE(g_JPEGProfiles)) va_profile = g_JPEGProfiles[profile]; break; default: va_profile = (VAProfile)-1; break; } return va_profile; } namespace UMC { VACompBuffer::VACompBuffer(void) { m_NumOfItem = 0; m_index = -1; m_id = -1; m_bDestroy = false; } VACompBuffer::~VACompBuffer(void) { } Status VACompBuffer::SetBufferInfo(int32_t _type, int32_t _id, int32_t _index) { type = _type; m_id = _id; m_index = _index; return UMC_OK; } Status VACompBuffer::SetDestroyStatus(bool _destroy) { UNREFERENCED_PARAMETER(_destroy); m_bDestroy = true; return UMC_OK; } LinuxVideoAccelerator::LinuxVideoAccelerator(void) : m_sDecodeTraceStart("") , m_sDecodeTraceEnd("") { m_dpy = NULL; m_pContext = NULL; m_pConfigId = NULL; m_pKeepVAState = NULL; m_FrameState = lvaBeforeBegin; m_pCompBuffers = NULL; m_uiCompBuffersNum = 0; m_uiCompBuffersUsed = 0; #if defined(ANDROID) m_isUseStatuReport = false; #else m_isUseStatuReport = true; #endif m_bH264MVCSupport = false; memset(&m_guidDecoder, 0 , sizeof(GUID)); } LinuxVideoAccelerator::~LinuxVideoAccelerator(void) { Close(); } Status LinuxVideoAccelerator::Init(VideoAcceleratorParams* pInfo) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "LinuxVideoAccelerator::Init"); Status umcRes = UMC_OK; VAStatus va_res = VA_STATUS_SUCCESS; VAConfigAttrib va_attributes[UMC_VA_LINUX_ATTRIB_SIZE]; LinuxVideoAcceleratorParams* pParams = DynamicCast(pInfo); int32_t width = 0, height = 0; bool needRecreateContext = false; // checking errors in input parameters if ((UMC_OK == umcRes) && (NULL == pParams)) umcRes = UMC_ERR_NULL_PTR; if ((UMC_OK == umcRes) && (NULL == pParams->m_pVideoStreamInfo)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (NULL == pParams->m_Display)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (NULL == pParams->m_pConfigId)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (NULL == pParams->m_pContext)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (NULL == pParams->m_pKeepVAState)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (NULL == pParams->m_allocator)) umcRes = UMC_ERR_INVALID_PARAMS; if ((UMC_OK == umcRes) && (pParams->m_iNumberSurfaces < 0)) umcRes = UMC_ERR_INVALID_PARAMS; // filling input parameters if (UMC_OK == umcRes) { m_dpy = pParams->m_Display; m_pKeepVAState = pParams->m_pKeepVAState; width = pParams->m_pVideoStreamInfo->clip_info.width; height = pParams->m_pVideoStreamInfo->clip_info.height; m_allocator = pParams->m_allocator; m_FrameState = lvaBeforeBegin; // profile or stream type should be set if (UNKNOWN == (m_Profile & VA_CODEC)) { umcRes = UMC_ERR_INVALID_PARAMS; } } if ((UMC_OK == umcRes) && (UNKNOWN == m_Profile)) umcRes = UMC_ERR_INVALID_PARAMS; SetTraceStrings(m_Profile & VA_CODEC); // display initialization if (UMC_OK == umcRes) { int32_t i,j; int va_max_num_profiles = vaMaxNumProfiles (m_dpy); int va_max_num_entrypoints = vaMaxNumEntrypoints(m_dpy); int va_num_profiles = 0; int va_num_entrypoints = 0; VAProfile* va_profiles = NULL; VAEntrypoint* va_entrypoints = NULL; VAProfile va_profile = (VAProfile)-1; VAEntrypoint va_entrypoint = (VAEntrypoint)-1; if (UMC_OK == umcRes) { if ((va_max_num_profiles <= 0) || (va_max_num_entrypoints <= 0)) umcRes = UMC_ERR_FAILED; } if (UMC_OK == umcRes) { va_profiles = new VAProfile[va_max_num_profiles]; va_entrypoints = new VAEntrypoint[va_max_num_entrypoints]; PERF_UTILITY_AUTO("vaQueryConfigProfiles", PERF_LEVEL_DDI); va_res = vaQueryConfigProfiles(m_dpy, va_profiles, &va_num_profiles); umcRes = va_to_umc_res(va_res); } if (UMC_OK == umcRes) { // checking support of some profile for (i = 0; (va_profile = get_next_va_profile(m_Profile & (VA_PROFILE | VA_CODEC), i)) != -1; ++i) { for (j = 0; j < va_num_profiles; ++j) { if (va_profile == va_profiles[j]) break; } if (j < va_num_profiles) { break; } else { va_profile = (VAProfile)-1; continue; } } if (va_profile < 0) umcRes = UMC_ERR_FAILED; if ((m_Profile & VA_CODEC) == UMC::VA_VC1) { if ((VC1_VIDEO_RCV == pInfo->m_pVideoStreamInfo->stream_subtype) || (WMV3_VIDEO == pInfo->m_pVideoStreamInfo->stream_subtype)) va_profile = VAProfileVC1Main; else va_profile = VAProfileVC1Advanced; } } if (UMC_OK == umcRes) { PERF_UTILITY_AUTO("vaQueryConfigEntrypoints", PERF_LEVEL_DDI); va_res = vaQueryConfigEntrypoints(m_dpy, va_profile, va_entrypoints, &va_num_entrypoints); umcRes = va_to_umc_res(va_res); } if (UMC_OK == umcRes) { uint32_t k = 0, profile = UNKNOWN; for (k = 0; k < UMC_ARRAY_SIZE(g_Profiles); ++k) { if (!(m_Profile & VA_ENTRY_POINT)) { // entrypoint is not specified, we may chose if (m_Profile != (g_Profiles[k] & VA_CODEC)) continue; profile = g_Profiles[k]; } else { // codec and entrypoint are specified, we just need to check validity profile = m_Profile; } va_entrypoint = umc_to_va_entrypoint(profile & VA_ENTRY_POINT); for (i = 0; i < va_num_entrypoints; ++i) if (va_entrypoint == va_entrypoints[i]) break; if (i < va_num_entrypoints) break; else { va_entrypoint = (VAEntrypoint)-1; if (m_Profile == profile) break; else continue; } } m_Profile = (UMC::VideoAccelerationProfile)profile; if (va_entrypoint == (VAEntrypoint)-1) umcRes = UMC_ERR_FAILED; } if (UMC_OK == umcRes) { int nattr = 0; // Assuming finding VLD, find out the format for the render target va_attributes[nattr++].type = VAConfigAttribRTFormat; va_attributes[nattr].type = VAConfigAttribDecSliceMode; va_attributes[nattr].value = VA_DEC_SLICE_MODE_NORMAL; nattr++; va_attributes[nattr++].type = VAConfigAttribDecProcessing; va_attributes[nattr++].type = VAConfigAttribEncryption; PERF_UTILITY_AUTO("vaGetConfigAttributes", PERF_LEVEL_DDI); va_res = vaGetConfigAttributes(m_dpy, va_profile, va_entrypoint, va_attributes, nattr); umcRes = va_to_umc_res(va_res); } int32_t attribsNumber = 2; if (UMC_OK == umcRes) { umcRes = SetAttributes(va_profile, pParams, va_attributes, &attribsNumber); } if (UMC_OK == umcRes) { m_pConfigId = pParams->m_pConfigId; if (*m_pConfigId == VA_INVALID_ID) { PERF_UTILITY_AUTO("vaCreateConfig", PERF_LEVEL_DDI); va_res = vaCreateConfig(m_dpy, va_profile, va_entrypoint, va_attributes, attribsNumber, m_pConfigId); umcRes = va_to_umc_res(va_res); needRecreateContext = true; } } delete[] va_profiles; delete[] va_entrypoints; } // creating context if (UMC_OK == umcRes) { m_pContext = pParams->m_pContext; if ((*m_pContext != VA_INVALID_ID) && needRecreateContext) { vaDestroyContext(m_dpy, *m_pContext); *m_pContext = VA_INVALID_ID; } if (*m_pContext == VA_INVALID_ID) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaCreateContext"); assert(!pParams->m_surf && "render targets tied to the context shoul be NULL"); PERF_UTILITY_AUTO("vaCreateContext", PERF_LEVEL_DDI); va_res = vaCreateContext(m_dpy, *m_pConfigId, width, height, pParams->m_CreateFlags, NULL, 0, m_pContext); umcRes = va_to_umc_res(va_res); } } return umcRes; } Status LinuxVideoAccelerator::SetAttributes(VAProfile va_profile, LinuxVideoAcceleratorParams* pParams, VAConfigAttrib *attribute, int32_t *attribsNumber) { MFX_CHECK(pParams != nullptr, UMC_ERR_INVALID_PARAMS); MFX_CHECK(attribute != nullptr, UMC_ERR_INVALID_PARAMS); MFX_CHECK(attribsNumber != nullptr, UMC_ERR_INVALID_PARAMS); attribute[1].value = VA_DEC_SLICE_MODE_NORMAL; if (pParams->m_needVideoProcessingVA) { if (attribute[2].value == VA_DEC_PROCESSING) { #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE m_videoProcessingVA = new VideoProcessingVA(); #endif (*attribsNumber)++; } // VA_DEC_PROCESSING_NONE returned, but for VAProfileJPEGBaseline // current driver doesn't report VAConfigAttribDecProcessing status correctly: // decoding and CSC to ARGB in SFC mode works despite VA_DEC_PROCESSING_NONE. // Do not create m_videoProcessingVA in this case, because it's not used during jpeg decode. else if (va_profile == VAProfileJPEGBaseline) { (*attribsNumber)++; } else { return UMC_ERR_FAILED; } } return UMC_OK; } Status LinuxVideoAccelerator::Close(void) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "LinuxVideoAccelerator::Close"); if (NULL != m_pCompBuffers) { for (uint32_t i = 0; i < m_uiCompBuffersUsed; ++i) { if (m_pCompBuffers[i]->NeedDestroy() && (NULL != m_dpy)) { VABufferID id = m_pCompBuffers[i]->GetID(); mfxStatus sts = CheckAndDestroyVAbuffer(m_dpy, id); std::ignore = MFX_STS_TRACE(sts); } UMC_DELETE(m_pCompBuffers[i]); } delete[] m_pCompBuffers; m_pCompBuffers = nullptr; } if (NULL != m_dpy) { if ((m_pContext && (*m_pContext != VA_INVALID_ID)) && !(m_pKeepVAState && *m_pKeepVAState)) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaDestroyContext"); PERF_UTILITY_AUTO("vaDestroyContext", PERF_LEVEL_DDI); VAStatus vaSts = vaDestroyContext(m_dpy, *m_pContext); std::ignore = MFX_STS_TRACE(vaSts); *m_pContext = VA_INVALID_ID; } if ((m_pConfigId && (*m_pConfigId != VA_INVALID_ID)) && !(m_pKeepVAState && *m_pKeepVAState)) { PERF_UTILITY_AUTO("vaDestroyConfig", PERF_LEVEL_DDI); VAStatus vaSts = vaDestroyConfig(m_dpy, *m_pConfigId); std::ignore = MFX_STS_TRACE(vaSts); *m_pConfigId = VA_INVALID_ID; } m_dpy = NULL; } #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE delete m_videoProcessingVA; m_videoProcessingVA = 0; #endif m_FrameState = lvaBeforeBegin; m_uiCompBuffersNum = 0; m_uiCompBuffersUsed = 0; m_associatedIds.clear(); return VideoAccelerator::Close(); } Status LinuxVideoAccelerator::BeginFrame(int32_t FrameBufIndex) { Status umcRes = UMC_OK; MFX_CHECK(FrameBufIndex >= 0, UMC_ERR_INVALID_PARAMS); VASurfaceID *surface; Status sts = m_allocator->GetFrameHandle(FrameBufIndex, &surface); MFX_CHECK(sts == UMC_OK, sts); if (lvaBeforeBegin == m_FrameState) { { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaBeginPicture"); MFX_LTRACE_2(MFX_TRACE_LEVEL_EXTCALL, m_sDecodeTraceStart, "%d|%d", *m_pContext, 0); PERF_UTILITY_AUTO("vaBeginPicture", PERF_LEVEL_DDI); VAStatus va_res = vaBeginPicture(m_dpy, *m_pContext, *surface); umcRes = va_to_umc_res(va_res); } if (UMC_OK == umcRes) { m_FrameState = lvaBeforeEnd; m_associatedIds.insert(*surface); } } return umcRes; } Status LinuxVideoAccelerator::AllocCompBuffers(void) { Status umcRes = UMC_OK; if ((UMC_OK == umcRes) && (m_uiCompBuffersUsed >= m_uiCompBuffersNum)) { if (NULL == m_pCompBuffers) { m_uiCompBuffersNum = UMC_VA_NUM_OF_COMP_BUFFERS; m_pCompBuffers = new VACompBuffer*[m_uiCompBuffersNum]; } else { uint32_t uiNewCompBuffersNum = 0; VACompBuffer** pNewCompBuffers = NULL; uiNewCompBuffersNum = m_uiCompBuffersNum + UMC_VA_NUM_OF_COMP_BUFFERS; pNewCompBuffers = new VACompBuffer*[uiNewCompBuffersNum]; MFX_INTERNAL_CPY((uint8_t*)pNewCompBuffers, (const uint8_t*)m_pCompBuffers, m_uiCompBuffersNum*sizeof(VACompBuffer*)); delete[] m_pCompBuffers; m_uiCompBuffersNum = uiNewCompBuffersNum; m_pCompBuffers = pNewCompBuffers; } } return umcRes; } void* LinuxVideoAccelerator::GetCompBuffer(int32_t buffer_type, UMCVACompBuffer **buf, int32_t size, int32_t index) { uint32_t i; VACompBuffer* pCompBuf = NULL; void* pBufferPointer = NULL; if (NULL != buf) *buf = NULL; std::lock_guard guard(m_SyncMutex); for (i = 0; i < m_uiCompBuffersUsed; ++i) { pCompBuf = m_pCompBuffers[i]; if ((pCompBuf->GetType() == buffer_type) && (pCompBuf->GetIndex() == index)) break; } if (i >= m_uiCompBuffersUsed) { AllocCompBuffers(); pCompBuf = GetCompBufferHW(buffer_type, size, index); if (NULL != pCompBuf) { m_pCompBuffers[m_uiCompBuffersUsed] = pCompBuf; ++m_uiCompBuffersUsed; } } if (NULL != pCompBuf) { if (NULL != buf) *buf = pCompBuf; pBufferPointer = pCompBuf->GetPtr(); } return pBufferPointer; } VACompBuffer* LinuxVideoAccelerator::GetCompBufferHW(int32_t type, int32_t size, int32_t index) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "GetCompBufferHW"); VAStatus va_res = VA_STATUS_SUCCESS; VABufferID id; uint8_t* buffer = NULL; uint32_t buffer_size = 0; VACompBuffer* pCompBuffer = NULL; if (VA_STATUS_SUCCESS == va_res) { VABufferType va_type = (VABufferType)type; unsigned int va_size = 0; unsigned int va_num_elements = 0; if (VASliceParameterBufferType == va_type) { switch (m_Profile & VA_CODEC) { case UMC::VA_MPEG2: va_size = sizeof(VASliceParameterBufferMPEG2); va_num_elements = size/sizeof(VASliceParameterBufferMPEG2); break; case UMC::VA_H264: if (m_bShortSlice) { va_size = sizeof(VASliceParameterBufferBase); va_num_elements = size/sizeof(VASliceParameterBufferBase); } else { va_size = sizeof(VASliceParameterBufferH264); va_num_elements = size/sizeof(VASliceParameterBufferH264); } break; case UMC::VA_VC1: va_size = sizeof(VASliceParameterBufferVC1); va_num_elements = size/sizeof(VASliceParameterBufferVC1); break; case UMC::VA_VP8: va_size = sizeof(VASliceParameterBufferVP8); va_num_elements = size/sizeof(VASliceParameterBufferVP8); break; case UMC::VA_JPEG: va_size = sizeof(VASliceParameterBufferJPEGBaseline); va_num_elements = size/sizeof(VASliceParameterBufferJPEGBaseline); break; case UMC::VA_VP9: va_size = sizeof(VASliceParameterBufferVP9); va_num_elements = size/sizeof(VASliceParameterBufferVP9); break; case UMC::VA_H265: case UMC::VA_H265 | UMC::VA_PROFILE_10: va_size = sizeof(VASliceParameterBufferHEVC); va_num_elements = size/sizeof(VASliceParameterBufferHEVC); if ((m_Profile & VA_PROFILE_REXT) || (m_Profile & VA_PROFILE_SCC)) { va_size = sizeof(VASliceParameterBufferHEVCExtension); va_num_elements = size/sizeof(VASliceParameterBufferHEVCExtension); } break; #if defined(MFX_ENABLE_AV1_VIDEO_DECODE) case UMC::VA_AV1: va_size = sizeof(VASliceParameterBufferAV1); va_num_elements = size/sizeof(VASliceParameterBufferAV1); break; #endif default: va_size = 0; va_num_elements = 0; break; } } else { va_size = size; va_num_elements = 1; } buffer_size = va_size * va_num_elements; PERF_UTILITY_AUTO("vaCreateBuffer", PERF_LEVEL_DDI); va_res = vaCreateBuffer(m_dpy, *m_pContext, va_type, va_size, va_num_elements, NULL, &id); } if (VA_STATUS_SUCCESS == va_res) { va_res = vaMapBuffer(m_dpy, id, (void**)&buffer); } if (VA_STATUS_SUCCESS == va_res) { pCompBuffer = new VACompBuffer(); pCompBuffer->SetBufferPointer(buffer, buffer_size); pCompBuffer->SetDataSize(0); pCompBuffer->SetBufferInfo(type, id, index); pCompBuffer->SetDestroyStatus(true); } return pCompBuffer; } Status LinuxVideoAccelerator::Execute() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "Execute"); Status umcRes = UMC_OK; VAStatus va_res = VA_STATUS_SUCCESS; VAStatus va_sts = VA_STATUS_SUCCESS; VABufferID id; uint32_t i; VACompBuffer* pCompBuf = NULL; std::lock_guard guard(m_SyncMutex); if (UMC_OK == umcRes) { for (i = 0; i < m_uiCompBuffersUsed; i++) { pCompBuf = m_pCompBuffers[i]; id = pCompBuf->GetID(); if (!m_bShortSlice) { if (pCompBuf->GetType() == VASliceParameterBufferType) { PERF_UTILITY_AUTO("vaBufferSetNumElements", PERF_LEVEL_DDI); va_sts = vaBufferSetNumElements(m_dpy, id, pCompBuf->GetNumOfItem()); if (VA_STATUS_SUCCESS == va_res) va_res = va_sts; } } { PERF_UTILITY_AUTO("vaUnmapBuffer", PERF_LEVEL_DDI); va_sts = vaUnmapBuffer(m_dpy, id); } if (VA_STATUS_SUCCESS == va_res) va_res = va_sts; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaRenderPicture"); PERF_UTILITY_AUTO("vaRenderPicture", PERF_LEVEL_DDI); va_sts = vaRenderPicture(m_dpy, *m_pContext, &id, 1); if (VA_STATUS_SUCCESS == va_res) va_res = va_sts; } } } if (UMC_OK == umcRes) { umcRes = va_to_umc_res(va_res); } return umcRes; } Status LinuxVideoAccelerator::EndFrame(void*) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_INTERNAL, "EndFrame"); VAStatus va_res = VA_STATUS_SUCCESS; std::lock_guard guard(m_SyncMutex); { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaEndPicture"); PERF_UTILITY_AUTO("vaEndPicture", PERF_LEVEL_DDI); va_res = vaEndPicture(m_dpy, *m_pContext); MFX_LTRACE_2(MFX_TRACE_LEVEL_EXTCALL, m_sDecodeTraceEnd, "%d|%d", *m_pContext, 0); } std::ignore = MFX_STS_TRACE(va_res); Status stsRet = va_to_umc_res(va_res); m_FrameState = lvaBeforeBegin; for (uint32_t i = 0; i < m_uiCompBuffersUsed; ++i) { if (m_pCompBuffers[i]->NeedDestroy()) { VABufferID id = m_pCompBuffers[i]->GetID(); mfxStatus sts = CheckAndDestroyVAbuffer(m_dpy, id); std::ignore = MFX_STS_TRACE(sts); if (sts != MFX_ERR_NONE) stsRet = UMC_ERR_FAILED; } UMC_DELETE(m_pCompBuffers[i]); } m_uiCompBuffersUsed = 0; return stsRet; } int32_t LinuxVideoAccelerator::GetSurfaceID(int32_t idx) const { VASurfaceID *surface; Status sts = UMC_OK; try { sts = m_allocator->GetFrameHandle(idx, &surface); } catch (std::exception&) { return VA_INVALID_SURFACE; } if (sts != UMC_OK) return VA_INVALID_SURFACE; return *surface; } uint16_t LinuxVideoAccelerator::GetDecodingError() { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "GetDecodingError"); uint16_t error = 0; #ifndef ANDROID // NOTE: at the moment there is no such support for Android, so no need to execute... VAStatus va_sts; for(VASurfaceID surface : m_associatedIds) { VASurfaceDecodeMBErrors* pVaDecErr = NULL; { PERF_UTILITY_AUTO("vaQuerySurfaceError", PERF_LEVEL_DDI); va_sts = vaQuerySurfaceError(m_dpy, surface, VA_STATUS_ERROR_DECODING_ERROR, (void**)&pVaDecErr); } if (VA_STATUS_SUCCESS == va_sts) { if (NULL != pVaDecErr) { for (int i = 0; pVaDecErr[i].status != -1; ++i) { error = MFX_CORRUPTION_MAJOR; } } else { error = MFX_CORRUPTION_MAJOR; } } } #endif return error; } void LinuxVideoAccelerator::SetTraceStrings(uint32_t umc_codec) { switch (umc_codec) { case UMC::VA_MPEG2: m_sDecodeTraceStart = "A|DECODE|MPEG2|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|MPEG2|PACKET_END|"; break; case UMC::VA_H264: m_sDecodeTraceStart = "A|DECODE|H264|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|H264|PACKET_END|"; break; case UMC::VA_H265: m_sDecodeTraceStart = "A|DECODE|H265|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|H265|PACKET_END|"; break; case UMC::VA_VC1: m_sDecodeTraceStart = "A|DECODE|VC1|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|VC1|PACKET_END|"; break; case UMC::VA_VP8: m_sDecodeTraceStart = "A|DECODE|VP8|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|VP8|PACKET_END|"; break; case UMC::VA_VP9: m_sDecodeTraceStart = "A|DECODE|VP9|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|VP9|PACKET_END|"; break; case UMC::VA_JPEG: m_sDecodeTraceStart = "A|DECODE|JPEG|PACKET_START|"; m_sDecodeTraceEnd = "A|DECODE|JPEG|PACKET_END|"; break; default: m_sDecodeTraceStart = ""; m_sDecodeTraceEnd = ""; break; } } Status LinuxVideoAccelerator::QueryTaskStatus(int32_t FrameBufIndex, void * status, void * error) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "QueryTaskStatus"); if (FrameBufIndex < 0) return UMC_ERR_INVALID_PARAMS; VASurfaceID *surface; Status sts = m_allocator->GetFrameHandle(FrameBufIndex, &surface); if (sts != UMC_OK) return sts; VASurfaceStatus surface_status; VAStatus va_status; VAStatus va_sts; { PERF_UTILITY_AUTO("vaQuerySurfaceStatus", PERF_LEVEL_DDI); va_status = vaQuerySurfaceStatus(m_dpy, *surface, &surface_status); } if ((VA_STATUS_SUCCESS == va_status) && (VASurfaceReady == surface_status)) { { PERF_UTILITY_AUTO("vaSyncSurface", PERF_LEVEL_DDI); // handle decoding errors va_sts = vaSyncSurface(m_dpy, *surface); } if (error) { switch (va_sts) { case VA_STATUS_ERROR_DECODING_ERROR: *(uint16_t*)error = GetDecodingError(); break; case VA_STATUS_ERROR_HW_BUSY: va_status = VA_STATUS_ERROR_HW_BUSY; break; } } } if (NULL != status) { *(VASurfaceStatus*)status = surface_status; // done or not } Status umcRes = va_to_umc_res(va_status); // OK or not return umcRes; } Status LinuxVideoAccelerator::SyncTask(int32_t FrameBufIndex, void *surfCorruption) { Status umcRes = 0; MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "Decode DDIWaitTaskSync"); if (FrameBufIndex < 0) return UMC_ERR_INVALID_PARAMS; VASurfaceID *surface; umcRes = m_allocator->GetFrameHandle(FrameBufIndex, &surface); if (umcRes != UMC_OK) return umcRes; VAStatus va_sts = VA_STATUS_SUCCESS; { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_EXTCALL, "vaSyncSurface"); PERF_UTILITY_AUTO("vaSyncSurface", PERF_LEVEL_DDI); va_sts = vaSyncSurface(m_dpy, *surface); } TRACE_EVENT(MFX_TRACE_HOTSPOT_DDI_WAIT_TASK_SYNC, EVENT_TYPE_INFO, 0, make_event_data(FrameBufIndex, 0, va_sts)); if (VA_STATUS_ERROR_DECODING_ERROR == va_sts) { if (surfCorruption) *(uint16_t*)surfCorruption = GetDecodingError(); return UMC_OK; } if (VA_STATUS_ERROR_OPERATION_FAILED == va_sts) { if (surfCorruption) *(uint16_t*)surfCorruption = MFX_CORRUPTION_MAJOR; return UMC_OK; } umcRes = va_to_umc_res(va_sts); return umcRes; } }; // namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/_studio/shared/umc/io/umc_va/src/umc_va_video_processing.cpp000066400000000000000000000062201443134507600330370ustar00rootroot00000000000000// Copyright (c) 2014-2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "umc_va_video_processing.h" namespace UMC { VideoProcessingVA::VideoProcessingVA() : m_pipelineParams() , m_surf_region() , m_output_surf_region() , m_currentOutputSurface() { } VideoProcessingVA::~VideoProcessingVA() { } void VideoProcessingVA::SetOutputSurface(mfxHDL surfHDL) { m_currentOutputSurface = surfHDL; } mfxHDL VideoProcessingVA::GetCurrentOutputSurface() const { return m_currentOutputSurface; } Status VideoProcessingVA::Init(mfxVideoParam * vpParams, mfxExtDecVideoProcessing * videoProcessing) { (void)vpParams; VAProcPipelineParameterBuffer *pipelineBuf = &m_pipelineParams; pipelineBuf->surface = 0; // should filled in packer m_surf_region.x = videoProcessing->In.CropX; m_surf_region.y = videoProcessing->In.CropY; m_surf_region.width = videoProcessing->In.CropW; m_surf_region.height = videoProcessing->In.CropH; pipelineBuf->surface_region = &m_surf_region; pipelineBuf->surface_color_standard = VAProcColorStandardBT601; m_output_surf_region.x = videoProcessing->Out.CropX; m_output_surf_region.y = videoProcessing->Out.CropY; m_output_surf_region.width = videoProcessing->Out.CropW; m_output_surf_region.height = videoProcessing->Out.CropH; pipelineBuf->output_region = &m_output_surf_region; pipelineBuf->output_background_color = 0; pipelineBuf->output_color_standard = VAProcColorStandardBT601; pipelineBuf->pipeline_flags = 0; pipelineBuf->filter_flags = 0; pipelineBuf->filters = 0; pipelineBuf->num_filters = 0; pipelineBuf->forward_references = 0; pipelineBuf->num_forward_references = 0; pipelineBuf->backward_references = 0; pipelineBuf->num_backward_references = 0; output_surface_array[0] = 0; pipelineBuf->rotation_state = VA_ROTATION_NONE; pipelineBuf->blend_state = 0; pipelineBuf->mirror_state = 0; pipelineBuf->additional_outputs = output_surface_array; pipelineBuf->num_additional_outputs = 1; pipelineBuf->input_surface_flag = 0; return UMC_OK; } } // namespace UMC oneVPL-intel-gpu-intel-onevpl-23.2.3/api/000077500000000000000000000000001443134507600200405ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/api/mediasdk_structures/000077500000000000000000000000001443134507600241245ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/api/mediasdk_structures/ts_ext_buffers_decl.h000066400000000000000000000214441443134507600303130ustar00rootroot00000000000000// Copyright (c) 2018-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #if defined(__MFXSTRUCTURES_H__) EXTBUF(mfxExtCodingOption , MFX_EXTBUFF_CODING_OPTION ) EXTBUF(mfxExtCodingOptionSPSPPS , MFX_EXTBUFF_CODING_OPTION_SPSPPS ) EXTBUF(mfxExtCodingOptionVPS , MFX_EXTBUFF_CODING_OPTION_VPS ) EXTBUF(mfxExtVPPDoNotUse , MFX_EXTBUFF_VPP_DONOTUSE ) EXTBUF(mfxExtVppAuxData , MFX_EXTBUFF_VPP_AUXDATA ) EXTBUF(mfxExtVPPDenoise , MFX_EXTBUFF_VPP_DENOISE ) EXTBUF(mfxExtVPPProcAmp , MFX_EXTBUFF_VPP_PROCAMP ) EXTBUF(mfxExtVPPDetail , MFX_EXTBUFF_VPP_DETAIL ) EXTBUF(mfxExtVideoSignalInfo , MFX_EXTBUFF_VIDEO_SIGNAL_INFO ) EXTBUF(mfxExtVPPDoUse , MFX_EXTBUFF_VPP_DOUSE ) EXTBUF(mfxExtAVCRefListCtrl , MFX_EXTBUFF_AVC_REFLIST_CTRL ) EXTBUF(mfxExtVPPFrameRateConversion , MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION ) EXTBUF(mfxExtPictureTimingSEI , MFX_EXTBUFF_PICTURE_TIMING_SEI ) EXTBUF(mfxExtAvcTemporalLayers , MFX_EXTBUFF_AVC_TEMPORAL_LAYERS ) EXTBUF(mfxExtTemporalLayers , MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS ) EXTBUF(mfxExtCodingOption2 , MFX_EXTBUFF_CODING_OPTION2 ) EXTBUF(mfxExtVPPImageStab , MFX_EXTBUFF_VPP_IMAGE_STABILIZATION ) EXTBUF(mfxExtEncoderCapability , MFX_EXTBUFF_ENCODER_CAPABILITY ) EXTBUF(mfxExtEncoderResetOption , MFX_EXTBUFF_ENCODER_RESET_OPTION ) EXTBUF(mfxExtAVCEncodedFrameInfo , MFX_EXTBUFF_ENCODED_FRAME_INFO ) EXTBUF(mfxExtVPPComposite , MFX_EXTBUFF_VPP_COMPOSITE ) EXTBUF(mfxExtVPPVideoSignalInfo , MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO ) EXTBUF(mfxExtEncoderROI , MFX_EXTBUFF_ENCODER_ROI ) EXTBUF(mfxExtVPPDeinterlacing , MFX_EXTBUFF_VPP_DEINTERLACING ) EXTBUF(mfxExtVP8CodingOption , MFX_EXTBUFF_VP8_CODING_OPTION ) EXTBUF(mfxExtVPPFieldProcessing , MFX_EXTBUFF_VPP_FIELD_PROCESSING ) EXTBUF(mfxExtContentLightLevelInfo , MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO ) EXTBUF(mfxExtMasteringDisplayColourVolume, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME ) EXTBUF(mfxExtVppMctf , MFX_EXTBUFF_VPP_MCTF ) EXTBUF(mfxExtColorConversion , MFX_EXTBUFF_VPP_COLOR_CONVERSION ) EXTBUF(mfxExtAVCRefLists , MFX_EXTBUFF_AVC_REFLISTS ) EXTBUF(mfxExtCodingOption3 , MFX_EXTBUFF_CODING_OPTION3 ) EXTBUF(mfxExtMBQP , MFX_EXTBUFF_MBQP ) EXTBUF(mfxExtMBForceIntra , MFX_EXTBUFF_MB_FORCE_INTRA ) EXTBUF(mfxExtChromaLocInfo , MFX_EXTBUFF_CHROMA_LOC_INFO ) EXTBUF(mfxExtDecodedFrameInfo , MFX_EXTBUFF_DECODED_FRAME_INFO ) EXTBUF(mfxExtDecodeErrorReport , MFX_EXTBUFF_DECODE_ERROR_REPORT ) EXTBUF(mfxExtVPPRotation , MFX_EXTBUFF_VPP_ROTATION) EXTBUF(mfxExtVPPMirroring , MFX_EXTBUFF_VPP_MIRRORING) EXTBUF(mfxExtMVCSeqDesc , MFX_EXTBUFF_MVC_SEQ_DESC) EXTBUF(mfxExtMBDisableSkipMap , MFX_EXTBUFF_MB_DISABLE_SKIP_MAP) EXTBUF(mfxExtDirtyRect , MFX_EXTBUFF_DIRTY_RECTANGLES ) EXTBUF(mfxExtMoveRect , MFX_EXTBUFF_MOVING_RECTANGLES ) EXTBUF(mfxExtVP9Segmentation , MFX_EXTBUFF_VP9_SEGMENTATION ) EXTBUF(mfxExtVP9TemporalLayers , MFX_EXTBUFF_VP9_TEMPORAL_LAYERS ) EXTBUF(mfxExtVP9Param , MFX_EXTBUFF_VP9_PARAM ) EXTBUF(mfxExtHEVCParam , MFX_EXTBUFF_HEVC_PARAM ) EXTBUF(mfxExtHEVCTiles , MFX_EXTBUFF_HEVC_TILES ) EXTBUF(mfxExtPredWeightTable , MFX_EXTBUFF_PRED_WEIGHT_TABLE ) EXTBUF(mfxExtEncodedUnitsInfo , MFX_EXTBUFF_ENCODED_UNITS_INFO ) EXTBUF(mfxExtPartialBitstreamParam , MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM ) EXTBUF(mfxExtEncoderIPCMArea , MFX_EXTBUFF_ENCODER_IPCM_AREA ) EXTBUF(mfxExtInsertHeaders , MFX_EXTBUFF_INSERT_HEADERS ) EXTBUF(mfxExtAV1BitstreamParam , MFX_EXTBUFF_AV1_BITSTREAM_PARAM) EXTBUF(mfxExtAV1ResolutionParam , MFX_EXTBUFF_AV1_RESOLUTION_PARAM) EXTBUF(mfxExtAV1TileParam , MFX_EXTBUFF_AV1_TILE_PARAM) EXTBUF(mfxExtAV1Segmentation , MFX_EXTBUFF_AV1_SEGMENTATION) EXTBUF(mfxExtVPPPercEncPrefilter , MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER) #endif //defined(__MFXSTRUCTURES_H__) #if defined(__MFXAV1_H__) EXTBUF(mfxExtAV1AuxData , MFX_EXTBUFF_AV1_AUXDATA) #endif #if defined(__MFXCAMERA_H__) // Camera EXTBUF(mfxExtCamTotalColorControl , MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL ) EXTBUF(mfxExtCamCscYuvRgb , MFX_EXTBUF_CAM_CSC_YUV_RGB ) EXTBUF(mfxExtCamGammaCorrection , MFX_EXTBUF_CAM_GAMMA_CORRECTION ) EXTBUF(mfxExtCamWhiteBalance , MFX_EXTBUF_CAM_WHITE_BALANCE ) EXTBUF(mfxExtCamHotPixelRemoval , MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL ) EXTBUF(mfxExtCamBlackLevelCorrection , MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION ) EXTBUF(mfxExtCamVignetteCorrection , MFX_EXTBUF_CAM_VIGNETTE_CORRECTION ) EXTBUF(mfxExtCamBayerDenoise , MFX_EXTBUF_CAM_BAYER_DENOISE ) EXTBUF(mfxExtCamColorCorrection3x3 , MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3 ) EXTBUF(mfxExtCamPadding , MFX_EXTBUF_CAM_PADDING ) EXTBUF(mfxExtCamPipeControl , MFX_EXTBUF_CAM_PIPECONTROL ) EXTBUF(mfxExtCamFwdGamma , MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION) EXTBUF(mfxExtCam3DLut , MFX_EXTBUF_CAM_3DLUT ) // end of Camera #endif //__MFXCAMERA_H__ #if defined(__MFXCOMMON_H__) // Threading API EXTBUF(mfxExtThreadsParam , MFX_EXTBUFF_THREADS_PARAM) #endif //defined(__MFXCOMMON_H__) #if defined(__MFXBRC_H__) EXTBUF(mfxExtBRC, MFX_EXTBUFF_BRC) #endif // defined(__MFXBRC_H__) #if defined(__MFXPAVP_H__) EXTBUF(mfxExtCencParam , MFX_EXTBUFF_CENC_PARAM ) #endif // defined(__MFXPAVP_H__) #if defined(__MFXSCD_H__) EXTBUF(mfxExtSCD, MFX_EXTBUFF_SCD) #endif // defined(__MFXSCD_H__) #ifdef __MFXWIDI_H__ EXTBUF(mfxExtAVCEncoderWiDiUsage , MFX_EXTBUFF_ENCODER_WIDI_USAGE ) #endif //#ifdef #ifdef __MFXLA_H__ EXTBUF(mfxExtLAControl , MFX_EXTBUFF_LOOKAHEAD_CTRL ) EXTBUF(mfxExtLAFrameStatistics , MFX_EXTBUFF_LOOKAHEAD_STAT ) #endif //__MFXLA_H__ #if defined(__MFX_EXT_BUFFERS_H__) EXTBUF(mfxExtCodingOptionDDI , MFX_EXTBUFF_DDI ) #if defined(MFX_ENABLE_ENCTOOLS_LPLA) EXTBUF(mfxExtLplaParam , MFX_EXTBUFF_LP_LOOKAHEAD ) EXTBUF(mfxExtLpLaStatus , MFX_EXTBUFF_LPLA_STATUS ) #endif EXTBUF(mfxExtHyperModeParam , MFX_EXTBUFF_HYPER_MODE_PARAM ) #if defined(MFX_ENABLE_ENCTOOLS) EXTBUF(mfxExtEncToolsConfig , MFX_EXTBUFF_ENCTOOLS_CONFIG ) #endif #endif // defined(__MFX_EXT_BUFFERS_H__) #if defined (__MFX_SURFACE_POOL_H__) EXTBUF(mfxExtAllocationHints, MFX_EXTBUFF_ALLOCATION_HINTS) #endif #ifdef MFX_ENABLE_ENCODE_STATS #include "mfxencodestats.h" EXTBUF(mfxExtEncodeStatsOutput, MFX_EXTBUFF_ENCODESTATS) #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/mediasdk_structures/ts_struct_decl.h000066400000000000000000000720461443134507600273270ustar00rootroot00000000000000// Copyright (c) 2008-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. STRUCT(mfxI16Pair, FIELD_T(mfxI16, x) FIELD_T(mfxI16, y) ) STRUCT(mfxHDLPair, FIELD_T(mfxHDL, first ) FIELD_T(mfxHDL, second) ) STRUCT(mfxExtBuffer, FIELD_T(mfx4CC, BufferId) FIELD_T(mfxU32, BufferSz) ) STRUCT(mfxVersion, FIELD_T(mfxU16, Minor ) FIELD_T(mfxU16, Major ) FIELD_T(mfxU32, Version) ) STRUCT(mfxStructVersion, FIELD_T(mfxU8, Minor) FIELD_T(mfxU8, Major) FIELD_T(mfxU16, Version) ) STRUCT(mfxBitstream, FIELD_T(mfxEncryptedData*, EncryptedData ) FIELD_T(mfxExtBuffer ** , ExtParam ) FIELD_T(mfxU16 , NumExtParam ) FIELD_T(mfxI64 , DecodeTimeStamp) FIELD_T(mfxU64 , TimeStamp ) FIELD_T(mfxU8* , Data ) FIELD_T(mfxU32 , DataOffset ) FIELD_T(mfxU32 , DataLength ) FIELD_T(mfxU32 , MaxLength ) FIELD_T(mfxU16 , PicStruct ) FIELD_T(mfxU16 , FrameType ) FIELD_T(mfxU16 , DataFlag ) ) STRUCT(mfxFrameId, FIELD_T(mfxU16, TemporalId ) FIELD_T(mfxU16, PriorityId ) FIELD_T(mfxU16, DependencyId) FIELD_T(mfxU16, QualityId ) FIELD_T(mfxU16, ViewId ) ) STRUCT(mfxFrameInfo, FIELD_S(mfxFrameId, FrameId) FIELD_T(mfxU16, BitDepthLuma ) FIELD_T(mfxU16, BitDepthChroma) FIELD_T(mfxU16, Shift ) FIELD_T(mfx4CC, FourCC ) FIELD_T(mfxU16, Width ) FIELD_T(mfxU16, Height ) FIELD_T(mfxU16, CropX ) FIELD_T(mfxU16, CropY ) FIELD_T(mfxU16, CropW ) FIELD_T(mfxU16, CropH ) FIELD_T(mfxU32, FrameRateExtN ) FIELD_T(mfxU32, FrameRateExtD ) FIELD_T(mfxU16, AspectRatioW ) FIELD_T(mfxU16, AspectRatioH ) FIELD_T(mfxU16, PicStruct ) FIELD_T(mfxU16, ChromaFormat ) ) STRUCT(mfxFrameData, FIELD_T(mfxExtBuffer**, ExtParam ) FIELD_T(mfxU16 , NumExtParam ) FIELD_T(mfxU16 , PitchHigh ) FIELD_T(mfxU64 , TimeStamp ) FIELD_T(mfxU32 , FrameOrder ) FIELD_T(mfxU16 , Locked ) FIELD_T(mfxU16 , Pitch ) FIELD_T(mfxU16 , PitchLow ) FIELD_T(mfxU8 * , Y ) FIELD_T(mfxU16* , Y16 ) FIELD_T(mfxU8 * , R ) FIELD_T(mfxU8 * , UV ) FIELD_T(mfxU8 * , VU ) FIELD_T(mfxU8 * , CbCr ) FIELD_T(mfxU8 * , CrCb ) FIELD_T(mfxU8 * , Cb ) FIELD_T(mfxU8 * , U ) FIELD_T(mfxU16* , U16 ) FIELD_T(mfxU8 * , G ) FIELD_T(mfxU8 * , Cr ) FIELD_T(mfxU8 * , V ) FIELD_T(mfxU16* , V16 ) FIELD_T(mfxU8 * , B ) FIELD_T(mfxU8 * , A ) FIELD_T(mfxMemId, MemId ) FIELD_T(mfxU16 , Corrupted ) FIELD_T(mfxU16 , DataFlag ) ) STRUCT(mfxFrameSurface1, FIELD_S(mfxFrameInfo, Info) FIELD_S(mfxFrameData, Data) ) STRUCT(mfxInfoMFX, FIELD_T(mfxU16, LowPower ) FIELD_T(mfxU16, BRCParamMultiplier) FIELD_S(mfxFrameInfo, FrameInfo ) FIELD_T(mfx4CC, CodecId ) FIELD_T(mfxU16, CodecProfile ) FIELD_T(mfxU16, CodecLevel ) FIELD_T(mfxU16, NumThread ) FIELD_T(mfxU16, TargetUsage ) FIELD_T(mfxU16, GopPicSize ) FIELD_T(mfxU16, GopRefDist ) FIELD_T(mfxU16, GopOptFlag ) FIELD_T(mfxU16, IdrInterval ) FIELD_T(mfxU16, RateControlMethod ) FIELD_T(mfxU16, InitialDelayInKB ) FIELD_T(mfxU16, QPI ) FIELD_T(mfxU16, Accuracy ) FIELD_T(mfxU16, BufferSizeInKB ) FIELD_T(mfxU16, TargetKbps ) FIELD_T(mfxU16, QPP ) FIELD_T(mfxU16, ICQQuality ) FIELD_T(mfxU16, MaxKbps ) FIELD_T(mfxU16, QPB ) FIELD_T(mfxU16, Convergence ) FIELD_T(mfxU16, NumSlice ) FIELD_T(mfxU16, NumRefFrame ) FIELD_T(mfxU16, EncodedOrder ) FIELD_T(mfxU16, DecodedOrder ) FIELD_T(mfxU16, ExtendedPicStruct ) FIELD_T(mfxU16, TimeStampCalc ) FIELD_T(mfxU16, SliceGroupsPresent) FIELD_T(mfxU16, MaxDecFrameBuffering ) FIELD_T(mfxU16, EnableReallocRequest) FIELD_T(mfxU16, FilmGrain ) FIELD_T(mfxU16, JPEGChromaFormat ) FIELD_T(mfxU16, Rotation ) FIELD_T(mfxU16, JPEGColorFormat ) FIELD_T(mfxU16, InterleavedDec ) FIELD_T(mfxU16, Interleaved ) FIELD_T(mfxU16, Quality ) FIELD_T(mfxU16, RestartInterval ) ) STRUCT(mfxInfoVPP, FIELD_S(mfxFrameInfo, In) FIELD_S(mfxFrameInfo, Out) ) STRUCT(mfxVideoParam, FIELD_S(mfxInfoMFX, mfx) FIELD_S(mfxInfoVPP, vpp) FIELD_T(mfxU16 , AsyncDepth ) FIELD_T(mfxU16 , Protected ) FIELD_T(mfxU16 , IOPattern ) FIELD_T(mfxExtBuffer**, ExtParam ) FIELD_T(mfxU16 , NumExtParam ) ) STRUCT(mfxExtCodingOption, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU16 , reserved1 ) FIELD_T(mfxU16 , RateDistortionOpt ) FIELD_T(mfxU16 , MECostType ) FIELD_T(mfxU16 , MESearchType ) FIELD_S(mfxI16Pair , MVSearchWindow ) FIELD_T(mfxU16 , EndOfSequence ) FIELD_T(mfxU16 , FramePicture ) FIELD_T(mfxU16 , CAVLC ) FIELD_T(mfxU16 , RecoveryPointSEI ) FIELD_T(mfxU16 , ViewOutput ) FIELD_T(mfxU16 , NalHrdConformance ) FIELD_T(mfxU16 , SingleSeiNalUnit ) FIELD_T(mfxU16 , VuiVclHrdParameters ) FIELD_T(mfxU16 , RefPicListReordering ) FIELD_T(mfxU16 , ResetRefList ) FIELD_T(mfxU16 , RefPicMarkRep ) FIELD_T(mfxU16 , FieldOutput ) FIELD_T(mfxU16 , IntraPredBlockSize ) FIELD_T(mfxU16 , InterPredBlockSize ) FIELD_T(mfxU16 , MVPrecision ) FIELD_T(mfxU16 , MaxDecFrameBuffering ) FIELD_T(mfxU16 , AUDelimiter ) FIELD_T(mfxU16 , EndOfStream ) FIELD_T(mfxU16 , PicTimingSEI ) FIELD_T(mfxU16 , VuiNalHrdParameters ) ) STRUCT(mfxExtCodingOption2, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU16 , IntRefType ) FIELD_T(mfxU16 , IntRefCycleSize ) FIELD_T(mfxI16 , IntRefQPDelta ) FIELD_T(mfxU32 , MaxFrameSize ) FIELD_T(mfxU32 , MaxSliceSize ) FIELD_T(mfxU16 , BitrateLimit ) FIELD_T(mfxU16 , MBBRC ) FIELD_T(mfxU16 , ExtBRC ) FIELD_T(mfxU16 , LookAheadDepth ) FIELD_T(mfxU16 , Trellis ) FIELD_T(mfxU16 , RepeatPPS ) FIELD_T(mfxU16 , BRefType ) FIELD_T(mfxU16 , AdaptiveI ) FIELD_T(mfxU16 , AdaptiveB ) FIELD_T(mfxU16 , LookAheadDS ) FIELD_T(mfxU16 , NumMbPerSlice ) FIELD_T(mfxU16 , SkipFrame ) FIELD_T(mfxU8 , MinQPI ) FIELD_T(mfxU8 , MaxQPI ) FIELD_T(mfxU8 , MinQPP ) FIELD_T(mfxU8 , MaxQPP ) FIELD_T(mfxU8 , MinQPB ) FIELD_T(mfxU8 , MaxQPB ) FIELD_T(mfxU16 , FixedFrameRate ) FIELD_T(mfxU16 , DisableDeblockingIdc ) FIELD_T(mfxU16 , DisableVUI ) FIELD_T(mfxU16 , BufferingPeriodSEI) FIELD_T(mfxU16 , EnableMAD ) FIELD_T(mfxU16 , UseRawRef ) ) STRUCT(mfxExtVPPDoNotUse, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32 , NumAlg) FIELD_T(mfxU32*, AlgList) ) STRUCT(mfxExtVPPDenoise, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, DenoiseFactor) ) STRUCT(mfxExtVPPDetail, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, DetailFactor) ) STRUCT(mfxExtVPPProcAmp, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxF64, Brightness ) FIELD_T(mfxF64, Contrast ) FIELD_T(mfxF64, Hue ) FIELD_T(mfxF64, Saturation ) ) STRUCT(mfxEncodeStat, FIELD_T(mfxU32, NumFrame ) FIELD_T(mfxU64, NumBit ) FIELD_T(mfxU32, NumCachedFrame ) ) STRUCT(mfxDecodeStat, FIELD_T(mfxU32, NumFrame ) FIELD_T(mfxU32, NumSkippedFrame ) FIELD_T(mfxU32, NumError ) FIELD_T(mfxU32, NumCachedFrame ) ) STRUCT(mfxVPPStat, FIELD_T(mfxU32, NumFrame ) FIELD_T(mfxU32, NumCachedFrame ) ) STRUCT(mfxExtVppAuxData, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, PicStruct ) FIELD_T(mfxU16, SceneChangeRate ) FIELD_T(mfxU16, RepeatedFrame ) ) STRUCT(mfxPayload, FIELD_T(mfxU8*, Data ) FIELD_T(mfxU32, NumBit ) FIELD_T(mfxU16, Type ) FIELD_T(mfxU16, BufSize ) ) STRUCT(mfxEncodeCtrl, FIELD_S(mfxExtBuffer , Header ) FIELD_T(mfxU16 , MfxNalUnitType) FIELD_T(mfxU16 , SkipFrame ) FIELD_T(mfxU16 , QP ) FIELD_T(mfxU16 , FrameType ) FIELD_T(mfxU16 , NumExtParam) FIELD_T(mfxU16 , NumPayload ) FIELD_T(mfxExtBuffer**, ExtParam ) FIELD_T(mfxPayload** , Payload ) ) STRUCT(mfxFrameAllocRequest, FIELD_S(mfxFrameInfo, Info) FIELD_T(mfxU16, Type ) FIELD_T(mfxU16, NumFrameMin ) FIELD_T(mfxU16, NumFrameSuggested ) ) STRUCT(mfxFrameAllocResponse, FIELD_T(mfxMemId*, mids ) FIELD_T(mfxU16 , NumFrameActual ) ) STRUCT(mfxExtCodingOptionSPSPPS, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU8* , SPSBuffer ) FIELD_T(mfxU8* , PPSBuffer ) FIELD_T(mfxU16 , SPSBufSize) FIELD_T(mfxU16 , PPSBufSize) FIELD_T(mfxU16 , SPSId ) FIELD_T(mfxU16 , PPSId ) ) STRUCT(mfxExtVideoSignalInfo, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU16, VideoFormat ) FIELD_T(mfxU16, VideoFullRange ) FIELD_T(mfxU16, ColourDescriptionPresent) FIELD_T(mfxU16, ColourPrimaries ) FIELD_T(mfxU16, TransferCharacteristics ) FIELD_T(mfxU16, MatrixCoefficients ) ) STRUCT(mfxExtVPPDoUse, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32 , NumAlg) FIELD_T(mfxU32*, AlgList) ) STRUCT(mfxExtOpaqueSurfaceAlloc_InOut, FIELD_T(mfxFrameSurface1 ** , Surfaces ) FIELD_T(mfxU16 , Type ) FIELD_T(mfxU16 , NumSurface) ) STRUCT(mfxExtOpaqueSurfaceAlloc, FIELD_S(mfxExtBuffer, Header) FIELD_S(mfxExtOpaqueSurfaceAlloc_InOut, In) FIELD_S(mfxExtOpaqueSurfaceAlloc_InOut, Out) ) STRUCT(mfxExtAVCRefListCtrl_Entry, FIELD_T(mfxU32, FrameOrder ) FIELD_T(mfxU16, PicStruct ) FIELD_T(mfxU16, ViewId ) FIELD_T(mfxU16, LongTermIdx ) ) STRUCT(mfxExtAVCRefListCtrl, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, NumRefIdxL0Active) FIELD_T(mfxU16, NumRefIdxL1Active) FIELD_S(mfxExtAVCRefListCtrl_Entry, PreferredRefList) FIELD_S(mfxExtAVCRefListCtrl_Entry, RejectedRefList ) FIELD_S(mfxExtAVCRefListCtrl_Entry, LongTermRefList ) FIELD_T(mfxU16, ApplyLongTermIdx ) ) STRUCT(mfxExtVPPFrameRateConversion, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, Algorithm) ) STRUCT(mfxExtVPPImageStab, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, Mode) ) STRUCT(mfxExtPictureTimingSEI_TimeStamp, FIELD_T(mfxU16, ClockTimestampFlag) FIELD_T(mfxU16, CtType ) FIELD_T(mfxU16, NuitFieldBasedFlag) FIELD_T(mfxU16, CountingType ) FIELD_T(mfxU16, FullTimestampFlag ) FIELD_T(mfxU16, DiscontinuityFlag ) FIELD_T(mfxU16, CntDroppedFlag ) FIELD_T(mfxU16, NFrames ) FIELD_T(mfxU16, SecondsFlag ) FIELD_T(mfxU16, MinutesFlag ) FIELD_T(mfxU16, HoursFlag ) FIELD_T(mfxU16, SecondsValue ) FIELD_T(mfxU16, MinutesValue ) FIELD_T(mfxU16, HoursValue ) FIELD_T(mfxU32, TimeOffset ) ) STRUCT(mfxExtPictureTimingSEI, FIELD_S(mfxExtBuffer, Header) FIELD_S(mfxExtPictureTimingSEI_TimeStamp, TimeStamp) ) STRUCT(mfxExtAvcTemporalLayers_Layer, FIELD_T(mfxU16, Scale) ) STRUCT(mfxExtAvcTemporalLayers, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, BaseLayerPID) FIELD_S(mfxExtAvcTemporalLayers_Layer, Layer) ) STRUCT(mfxTemporalLayer, FIELD_T(mfxU16, FrameRateScale) FIELD_T(mfxU32, InitialDelayInKB) FIELD_T(mfxU32, BufferSizeInKB) FIELD_T(mfxU32, TargetKbps) FIELD_T(mfxU32, MaxKbps) ) STRUCT(mfxExtTemporalLayers, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, NumLayers) FIELD_T(mfxU16, BaseLayerPID) FIELD_T(mfxTemporalLayer*, Layers) ) STRUCT(mfxExtEncoderCapability, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32, MBPerSec) ) STRUCT(mfxExtEncoderResetOption, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, StartNewSequence) ) STRUCT(mfxExtAVCEncodedFrameInfo_RefList, FIELD_T(mfxU32, FrameOrder ) FIELD_T(mfxU16, PicStruct ) FIELD_T(mfxU16, LongTermIdx ) ) STRUCT(mfxExtAVCEncodedFrameInfo, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32, FrameOrder ) FIELD_T(mfxU16, PicStruct ) FIELD_T(mfxU16, LongTermIdx ) FIELD_T(mfxU32, MAD ) FIELD_T(mfxU16, BRCPanicMode) FIELD_T(mfxU16, QP ) FIELD_T(mfxU32, SecondFieldOffset ) FIELD_S(mfxExtAVCEncodedFrameInfo_RefList, UsedRefListL0) FIELD_S(mfxExtAVCEncodedFrameInfo_RefList, UsedRefListL1) ) STRUCT(mfxVPPCompInputStream, FIELD_T(mfxU32, DstX ) FIELD_T(mfxU32, DstY ) FIELD_T(mfxU32, DstW ) FIELD_T(mfxU32, DstH ) FIELD_T(mfxU16, LumaKeyEnable ) FIELD_T(mfxU16, LumaKeyMin ) FIELD_T(mfxU16, LumaKeyMax ) FIELD_T(mfxU16, GlobalAlphaEnable) FIELD_T(mfxU16, GlobalAlpha ) FIELD_T(mfxU16, PixelAlphaEnable ) FIELD_T(mfxU16, TileId ) ) STRUCT(mfxExtVPPComposite, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, Y) FIELD_T(mfxU16, U) FIELD_T(mfxU16, V) FIELD_T(mfxU16, R) FIELD_T(mfxU16, G) FIELD_T(mfxU16, B) FIELD_T(mfxU16, NumTiles) FIELD_T(mfxU16, NumInputStream) FIELD_T(mfxVPPCompInputStream*, InputStream) ) STRUCT(mfxExtColorConversion, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, ChromaSiting) ) STRUCT(mfxExtVPPVideoSignalInfo_InOut, FIELD_T(mfxU16, TransferMatrix ) FIELD_T(mfxU16, NominalRange ) ) STRUCT(mfxExtVPPVideoSignalInfo, FIELD_S(mfxExtBuffer, Header) FIELD_S(mfxExtVPPVideoSignalInfo_InOut, In ) FIELD_S(mfxExtVPPVideoSignalInfo_InOut, Out) ) STRUCT(mfxExtEncoderROI_Entry, FIELD_T(mfxU32, Left ) FIELD_T(mfxU32, Top ) FIELD_T(mfxU32, Right ) FIELD_T(mfxU32, Bottom ) FIELD_T(mfxI16, Priority) ) STRUCT(mfxExtEncoderROI, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxI16, NumROI) FIELD_T(mfxU16, ROIMode) FIELD_S(mfxExtEncoderROI_Entry, ROI) ) STRUCT(mfxExtVPPDeinterlacing, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, Mode) FIELD_T(mfxU16, TelecinePattern) FIELD_T(mfxU16, TelecineLocation) ) STRUCT(mfxExtVP8CodingOption, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, Version) FIELD_T(mfxU16, EnableMultipleSegments) FIELD_T(mfxU16, LoopFilterType) ) STRUCT(mfxExtAVCRefLists_mfxRefPic, FIELD_T(mfxU32, FrameOrder) FIELD_T(mfxU16, PicStruct ) ) STRUCT(mfxExtAVCRefLists, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU16 , NumRefIdxL0Active) FIELD_T(mfxU16 , NumRefIdxL1Active) FIELD_S(mfxExtAVCRefLists_mfxRefPic, RefPicList0) FIELD_S(mfxExtAVCRefLists_mfxRefPic, RefPicList1) ) STRUCT(mfxExtCodingOption3, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, NumSliceI) FIELD_T(mfxU16, NumSliceP) FIELD_T(mfxU16, NumSliceB) FIELD_T(mfxU16, WinBRCMaxAvgKbps) FIELD_T(mfxU16, WinBRCSize) FIELD_T(mfxU16, QVBRQuality) FIELD_T(mfxU16, EnableMBQP) FIELD_T(mfxU16, IntRefCycleDist) FIELD_T(mfxU16, DirectBiasAdjustment) FIELD_T(mfxU16, GlobalMotionBiasAdjustment)/* tri-state option */ FIELD_T(mfxU16, MVCostScalingFactor) FIELD_T(mfxU16, MBDisableSkipMap)/* tri-state option */ FIELD_T(mfxU16, WeightedPred) FIELD_T(mfxU16, WeightedBiPred) FIELD_T(mfxU16, AspectRatioInfoPresent) /* tri-state option */ FIELD_T(mfxU16, OverscanInfoPresent) /* tri-state option */ FIELD_T(mfxU16, OverscanAppropriate) /* tri-state option */ FIELD_T(mfxU16, TimingInfoPresent) /* tri-state option */ FIELD_T(mfxU16, BitstreamRestriction) /* tri-state option */ FIELD_T(mfxU16, LowDelayHrd) /* tri-state option */ FIELD_T(mfxU16, MotionVectorsOverPicBoundaries) /* tri-state option */ FIELD_T(mfxU16, ScenarioInfo) FIELD_T(mfxU16, ContentInfo) FIELD_T(mfxU16, PRefType) FIELD_T(mfxU16, FadeDetection) /* tri-state option */ FIELD_T(mfxU16, GPB) FIELD_T(mfxU32, MaxFrameSizeI) FIELD_T(mfxU32, MaxFrameSizeP) FIELD_T(mfxU16, EnableQPOffset) FIELD_T(mfxI16, QPOffset) FIELD_T(mfxU16, NumRefActiveP) FIELD_T(mfxU16, NumRefActiveBL0) FIELD_T(mfxU16, NumRefActiveBL1) FIELD_T(mfxU16, TransformSkip) FIELD_T(mfxU16, TargetChromaFormatPlus1) FIELD_T(mfxU16, TargetBitDepthLuma) FIELD_T(mfxU16, TargetBitDepthChroma) FIELD_T(mfxU16, BRCPanicMode) FIELD_T(mfxU16, LowDelayBRC) FIELD_T(mfxU16, EnableMBForceIntra) FIELD_T(mfxU16, AdaptiveMaxFrameSize) FIELD_T(mfxU16, RepartitionCheckEnable) /* tri-state option */ FIELD_T(mfxU16, EncodedUnitsInfo) FIELD_T(mfxU16, EnableNalUnitType) FIELD_T(mfxU16, ExtBrcAdaptiveLTR) ) STRUCT(mfxQPandMode, FIELD_T(mfxU8, QP) FIELD_T(mfxU16, Mode) ) STRUCT(mfxExtMBQP, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32 , NumQPAlloc) FIELD_T(mfxU8* , QP) ) STRUCT(mfxExtInsertHeaders, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, SPS) FIELD_T(mfxU16, PPS) ) STRUCT(mfxExtEncoderIPCMArea_area, FIELD_T(mfxU32, Left ) FIELD_T(mfxU32, Top ) FIELD_T(mfxU32, Right ) FIELD_T(mfxU32, Bottom ) ) STRUCT(mfxExtEncoderIPCMArea, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , NumArea) FIELD_T(mfxExtEncoderIPCMArea_area*, Areas) ) STRUCT(mfxExtChromaLocInfo, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , ChromaLocInfoPresentFlag) FIELD_T(mfxU16 , ChromaSampleLocTypeTopField) FIELD_T(mfxU16 , ChromaSampleLocTypeBottomField) ) STRUCT(mfxExtDecodedFrameInfo, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , FrameType) ) STRUCT(mfxExtDecodeErrorReport, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32 , ErrorTypes) ) STRUCT(mfxInitParam, FIELD_T(mfxIMPL, Implementation) FIELD_S(mfxVersion, Version) FIELD_T(mfxU16, ExternalThreads) FIELD_T(mfxExtBuffer**, ExtParam) FIELD_T(mfxU16, NumExtParam) FIELD_T(mfxU16, GPUCopy) ) STRUCT(mfxExtThreadsParam, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU16 , NumThread ) FIELD_T(mfxI32 , SchedulingType) FIELD_T(mfxI32 , Priority ) ) STRUCT(mfxExtVPPFieldProcessing, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , Mode) FIELD_T(mfxU16 , InField) FIELD_T(mfxU16 , OutField) ) STRUCT(mfxExtVPPRotation, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , Angle) ) STRUCT(mfxExtVPPMirroring, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , Type) ) STRUCT(mfxExtDirtyRect_Entry, FIELD_T(mfxU32, Left ) FIELD_T(mfxU32, Top ) FIELD_T(mfxU32, Right ) FIELD_T(mfxU32, Bottom ) ) STRUCT(mfxExtDirtyRect, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxI16, NumRect) FIELD_S(mfxExtDirtyRect_Entry, Rect ) ) STRUCT(mfxExtMoveRect_Entry, FIELD_T(mfxU32, DestLeft ) FIELD_T(mfxU32, DestTop ) FIELD_T(mfxU32, DestRight ) FIELD_T(mfxU32, DestBottom) FIELD_T(mfxU32, SourceLeft) FIELD_T(mfxU32, SourceTop ) ) STRUCT(mfxExtMoveRect, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxI16, NumRect) FIELD_S(mfxExtMoveRect_Entry, Rect ) ) STRUCT(mfxExtMVCSeqDesc, FIELD_S(mfxExtBuffer , Header ) FIELD_T(mfxU32 , NumView ) FIELD_T(mfxU32 , NumViewAlloc ) //FIELD_S(mfxMVCViewDependency* , View ) FIELD_T(mfxU32 , NumViewId ) FIELD_T(mfxU32 , NumViewIdAlloc) //FIELD_S(mfxU16* , ViewId ) FIELD_T(mfxU32 , NumOP ) FIELD_T(mfxU32 , NumOPAlloc ) //FIELD_S(mfxMVCOperationPoint* , OP ) FIELD_T(mfxU16 , NumRefsTotal ) ) STRUCT(mfxExtMBDisableSkipMap, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU32 , MapSize) ) STRUCT(mfxExtCodingOptionVPS, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU8* , VPSBuffer ) FIELD_T(mfxU16 , VPSBufSize) FIELD_T(mfxU16 , VPSId) ) STRUCT(mfxExtHEVCParam, FIELD_S(mfxExtBuffer , Header ) FIELD_T(mfxU16 , PicWidthInLumaSamples ) FIELD_T(mfxU16 , PicHeightInLumaSamples) FIELD_T(mfxU64 , GeneralConstraintFlags) FIELD_T(mfxU16 , SampleAdaptiveOffset) FIELD_T(mfxU16 , LCUSize) ) STRUCT(mfxExtHEVCTiles, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, NumTileRows) FIELD_T(mfxU16, NumTileColumns) ) STRUCT(mfxExtHEVCRegion, FIELD_S(mfxExtBuffer, Header ) FIELD_T(mfxU32 , RegionId) FIELD_T(mfxU16 , RegionType) FIELD_T(mfxU16 , RegionEncoding) ) STRUCT(mfxVP9SegmentParam, FIELD_T(mfxU16, FeatureEnabled) FIELD_T(mfxI16, QIndexDelta) FIELD_T(mfxI16, LoopFilterLevelDelta) FIELD_T(mfxU16, ReferenceFrame) ) STRUCT(mfxExtVP9Segmentation, FIELD_S(mfxExtBuffer , Header) FIELD_T(mfxU16 , NumSegments) FIELD_S(mfxVP9SegmentParam, Segment) FIELD_T(mfxU16 , SegmentIdBlockSize) FIELD_T(mfxU32 , NumSegmentIdAlloc) FIELD_T(mfxU8* , SegmentId) ) STRUCT(mfxVP9TemporalLayer, FIELD_T(mfxU16, FrameRateScale) FIELD_T(mfxU16, TargetKbps) ) STRUCT(mfxExtVP9TemporalLayers, FIELD_S(mfxExtBuffer , Header) FIELD_S(mfxVP9TemporalLayer , Layer) ) STRUCT(mfxExtVP9Param, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , FrameWidth) FIELD_T(mfxU16 , FrameHeight) FIELD_T(mfxU16 , WriteIVFHeaders) FIELD_T(mfxI16 , QIndexDeltaLumaDC) FIELD_T(mfxI16 , QIndexDeltaChromaAC) FIELD_T(mfxI16 , QIndexDeltaChromaDC) FIELD_T(mfxU16 , NumTileRows) FIELD_T(mfxU16 , NumTileColumns) ) STRUCT(mfxExtMBForceIntra, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32, MapSize) FIELD_T(mfxU8*, Map) ) STRUCT(mfxExtMasteringDisplayColourVolume, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , InsertPayloadToggle) FIELD_T(mfxU16 , DisplayPrimariesX) FIELD_T(mfxU16 , DisplayPrimariesY) FIELD_T(mfxU16 , WhitePointX) FIELD_T(mfxU16 , WhitePointY) FIELD_T(mfxU32 , MaxDisplayMasteringLuminance) FIELD_T(mfxU32 , MinDisplayMasteringLuminance) ) STRUCT(mfxExtContentLightLevelInfo, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16 , InsertPayloadToggle) FIELD_T(mfxU16 , MaxContentLightLevel) FIELD_T(mfxU16 , MaxPicAverageLightLevel) ) STRUCT(mfxExtPredWeightTable, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, LumaLog2WeightDenom) FIELD_T(mfxU16, ChromaLog2WeightDenom) FIELD_T(mfxU16, LumaWeightFlag) FIELD_T(mfxU16, ChromaWeightFlag) FIELD_T(mfxI16, Weights) ) #if defined(__MFXBRC_H__) STRUCT(mfxExtBRC, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxHDL , pthis) FIELD_T(mfxHDL , Init) FIELD_T(mfxHDL , Reset) FIELD_T(mfxHDL , Close) FIELD_T(mfxHDL , GetFrameCtrl) FIELD_T(mfxHDL , Update) ) STRUCT(mfxBRCFrameParam, FIELD_T(mfxU16 , SceneChange) FIELD_T(mfxU16 , LongTerm) FIELD_T(mfxU32 , FrameCmplx) FIELD_T(mfxU32 , EncodedOrder) FIELD_T(mfxU32 , DisplayOrder) FIELD_T(mfxU32 , CodedFrameSize) FIELD_T(mfxU16 , FrameType) FIELD_T(mfxU16 , PyramidLayer) FIELD_T(mfxU16 , NumRecode) FIELD_T(mfxU16 , NumExtParam) FIELD_T(mfxExtBuffer**, ExtParam) ) STRUCT(mfxBRCFrameCtrl, FIELD_T(mfxI32 , QpY) FIELD_T(mfxU32 , InitialCpbRemovalDelay) FIELD_T(mfxU32 , InitialCpbRemovalOffset) FIELD_T(mfxU32 , reserved1) FIELD_T(mfxU32 , MaxFrameSize) FIELD_T(mfxU8 , DeltaQP) FIELD_T(mfxU16 , MaxNumRepak) FIELD_T(mfxU16 , NumExtParam) FIELD_T(mfxExtBuffer**, ExtParam) ) STRUCT(mfxBRCFrameStatus, FIELD_T(mfxU32, MinFrameSize) FIELD_T(mfxU16, BRCStatus) FIELD_T(mfxU16, reserved) FIELD_T(mfxHDL, reserved1) ) #endif // defined(__MFXBRC_H__) STRUCT(mfxEncodedUnitInfo, FIELD_T(mfxU16, Type) FIELD_T(mfxU32, Offset) FIELD_T(mfxU32, Size) ) STRUCT(mfxExtEncodedUnitsInfo, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxEncodedUnitInfo*, UnitInfo) FIELD_T(mfxU16, NumUnitsAlloc) FIELD_T(mfxU16, NumUnitsEncoded) ) #if defined(__MFXPAVP_H__) STRUCT(mfxExtCencParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32 , StatusReportIndex) ) #endif // defined(__MFXPAVP_H__) #if defined(__MFXSCD_H__) STRUCT(mfxExtSCD, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, SceneType) ) #endif // defined(__MFXSCD_H__) STRUCT(mfxExtVppMctf, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, FilterStrength) ) STRUCT(mfxAV1FilmGrainPoint, FIELD_T(mfxU8, Value) FIELD_T(mfxU8, Scaling) ) STRUCT(mfxExtAV1FilmGrainParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, FilmGrainFlags) FIELD_T(mfxU16, GrainSeed) FIELD_T(mfxU8, RefIdx) FIELD_T(mfxI8, NumYPoints) FIELD_T(mfxI8, NumCbPoints) FIELD_T(mfxI8, NumCrPoints) FIELD_S(mfxAV1FilmGrainPoint, PointY) FIELD_S(mfxAV1FilmGrainPoint, PointCb) FIELD_S(mfxAV1FilmGrainPoint, PointCr) FIELD_T(mfxI8, GrainScalingMinus8) FIELD_T(mfxU8, ArCoeffLag) FIELD_T(mfxU8, ArCoeffsYPlus128) FIELD_T(mfxU8, ArCoeffsCbPlus128) FIELD_T(mfxU8, ArCoeffsCrPlus128) FIELD_T(mfxU8, ArCoeffShiftMinus6) FIELD_T(mfxU8, GrainScaleShift) FIELD_T(mfxU8, CbMult) FIELD_T(mfxU8, CbLumaMult) FIELD_T(mfxU16, CbOffset) FIELD_T(mfxU8, CrMult) FIELD_T(mfxU8, CrLumaMult) FIELD_T(mfxU16, CrOffset) ) STRUCT(mfxExtAV1BitstreamParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, WriteIVFHeaders) ) STRUCT(mfxExtAV1ResolutionParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32, FrameWidth) FIELD_T(mfxU32, FrameHeight) ) STRUCT(mfxExtAV1TileParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, NumTileRows) FIELD_T(mfxU16, NumTileColumns) FIELD_T(mfxU16, NumTileGroups) ) STRUCT(mfxAV1SegmentParam, FIELD_T(mfxU16, FeatureEnabled) FIELD_T(mfxU16, AltQIndex) ) STRUCT(mfxExtAV1Segmentation, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU8, NumSegments) FIELD_S(mfxAV1SegmentParam, Segment) FIELD_T(mfxU16, SegmentIdBlockSize) FIELD_T(mfxU32, NumSegmentIdAlloc) FIELD_T(mfxU8*, SegmentIds) ) STRUCT(mfxExtPartialBitstreamParam, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU32, BlockSize) FIELD_T(mfxU16, Granularity) FIELD_T(mfxU16, reserved) ) STRUCT(mfxExtVPPPercEncPrefilter, FIELD_S(mfxExtBuffer, Header) FIELD_T(mfxU16, reserved) ) #if defined(MFX_ENABLE_ENCTOOLS) STRUCT(mfxExtEncToolsConfig, FIELD_S(mfxExtBuffer, Header) FIELD_S(mfxStructVersion, Version) FIELD_T(mfxU16, AdaptiveI) FIELD_T(mfxU16, AdaptiveB) FIELD_T(mfxU16, AdaptiveRefP) FIELD_T(mfxU16, AdaptiveRefB) FIELD_T(mfxU16, SceneChange) FIELD_T(mfxU16, AdaptiveLTR) FIELD_T(mfxU16, AdaptivePyramidQuantP) FIELD_T(mfxU16, AdaptivePyramidQuantB) FIELD_T(mfxU16, AdaptiveQuantMatrices) FIELD_T(mfxU16, BRCBufferHints) FIELD_T(mfxU16, BRC) FIELD_T(mfxU16, reserved) /* Fixed size array */ ) #endif #ifdef MFX_ENABLE_ENCODE_STATS STRUCT(mfxExtEncodeStatsOutput, FIELD_S(mfxExtBuffer, Header) ) #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/mediasdk_structures/ts_typedef.h000066400000000000000000000045561443134507600264550ustar00rootroot00000000000000// Copyright (c) 2017-2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #define TYPEDEF_MEMBER(base, member, name) \ struct name : std::decay::type {}; TYPEDEF_MEMBER(mfxExtOpaqueSurfaceAlloc, In, mfxExtOpaqueSurfaceAlloc_InOut) TYPEDEF_MEMBER(mfxExtAVCRefListCtrl, PreferredRefList[0], mfxExtAVCRefListCtrl_Entry) TYPEDEF_MEMBER(mfxExtPictureTimingSEI, TimeStamp[0], mfxExtPictureTimingSEI_TimeStamp) TYPEDEF_MEMBER(mfxExtAvcTemporalLayers, Layer[0], mfxExtAvcTemporalLayers_Layer) TYPEDEF_MEMBER(mfxExtAVCEncodedFrameInfo, UsedRefListL0[0], mfxExtAVCEncodedFrameInfo_RefList) #if _MSC_VER<1914 TYPEDEF_MEMBER(mfxExtVPPVideoSignalInfo, In, mfxExtVPPVideoSignalInfo_InOut) #else typedef struct { mfxU16 TransferMatrix; mfxU16 NominalRange; mfxU16 reserved2[6]; } mfxExtVPPVideoSignalInfo_InOut; #endif TYPEDEF_MEMBER(mfxExtEncoderROI, ROI[0], mfxExtEncoderROI_Entry) TYPEDEF_MEMBER(mfxExtDirtyRect, Rect[0], mfxExtDirtyRect_Entry) TYPEDEF_MEMBER(mfxExtMoveRect, Rect[0], mfxExtMoveRect_Entry) typedef union { mfxU32 n; char c[4]; } mfx4CC; typedef mfxExtAVCRefLists::mfxRefPic mfxExtAVCRefLists_mfxRefPic; typedef mfxExtEncoderIPCMArea::area mfxExtEncoderIPCMArea_area; oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/000077500000000000000000000000001443134507600206415ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfx.h000066400000000000000000000012521443134507600216040ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFX_H__ #define __MFX_H__ #include "mfxdefs.h" #include "mfxcommon.h" #include "mfxstructures.h" #include "mfxdispatcher.h" #include "mfximplcaps.h" #include "mfxsession.h" #include "mfxvideo.h" #include "mfxadapter.h" #include "mfxbrc.h" #include "mfxmvc.h" #include "mfxpcp.h" #include "mfxvp8.h" #include "mfxjpeg.h" #include "mfxsurfacepool.h" #ifdef ONEVPL_EXPERIMENTAL #include "mfxencodestats.h" #endif #endif /* __MFXDEFS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxadapter.h000066400000000000000000000100041443134507600231400ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #include "mfxdefs.h" #ifndef __MFXADAPTER_H__ #define __MFXADAPTER_H__ #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif /*! @brief Returns a list of adapters that are suitable to handle workload @p input_info. The list is sorted in priority order, with iGPU given the highest precedence. This rule may change in the future. If the @p input_info pointer is NULL, the list of all available adapters will be returned. @param[in] input_info Pointer to workload description. See mfxComponentInfo description for details. @param[out] adapters Pointer to output description of all suitable adapters for input workload. See mfxAdaptersInfo description for details. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR @p input_info or adapters pointer is NULL. \n MFX_ERR_NOT_FOUND No suitable adapters found. \n MFX_WRN_OUT_OF_RANGE Not enough memory to report back entire list of adapters. In this case as many adapters as possible will be returned. @since This function is available since API version 1.31. @deprecated Deprecated in API version 2.9. Use MFXEnumImplementations and MFXSetConfigFilterProperty to query adapter capabilities and to select a suitable adapter for the input workload. Use MFX_DEPRECATED_OFF macro to turn off the deprecation message visualization. */ MFX_DEPRECATED mfxStatus MFX_CDECL MFXQueryAdapters(mfxComponentInfo* input_info, mfxAdaptersInfo* adapters); /*! @brief Returns list of adapters that are suitable to decode the input bitstream. The list is sorted in priority order, with iGPU given the highest precedence. This rule may change in the future. This function is a simplification of MFXQueryAdapters, because bitstream is a description of the workload itself. @param[in] bitstream Pointer to bitstream with input data. @param[in] codec_id Codec ID to determine the type of codec for the input bitstream. @param[out] adapters Pointer to the output list of adapters. Memory should be allocated by user. See mfxAdaptersInfo description for details. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR bitstream or @p adapters pointer is NULL. \n MFX_ERR_NOT_FOUND No suitable adapters found. \n MFX_WRN_OUT_OF_RANGE Not enough memory to report back entire list of adapters. In this case as many adapters as possible will be returned. @since This function is available since API version 1.31. @deprecated Deprecated in API version 2.9. Use MFXEnumImplementations and MFXSetConfigFilterProperty to query adapter capabilities and to select a suitable adapter for the input workload. Use MFX_DEPRECATED_OFF macro to turn off the deprecation message visualization. */ MFX_DEPRECATED mfxStatus MFX_CDECL MFXQueryAdaptersDecode(mfxBitstream* bitstream, mfxU32 codec_id, mfxAdaptersInfo* adapters); /*! @brief Returns the number of detected graphics adapters. It can be used before calling MFXQueryAdapters to determine the size of input data that the user will need to allocate. @param[out] num_adapters Pointer for the output number of detected graphics adapters. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR num_adapters pointer is NULL. @since This function is available since API version 1.31. @deprecated Deprecated in API version 2.9. Use MFXEnumImplementations and MFXSetConfigFilterProperty to query adapter capabilities and to select a suitable adapter for the input workload. Use MFX_DEPRECATED_OFF macro to turn off the deprecation message visualization. */ MFX_DEPRECATED mfxStatus MFX_CDECL MFXQueryAdaptersNumber(mfxU32* num_adapters); #ifdef __cplusplus } // extern "C" #endif #endif // __MFXADAPTER_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxbrc.h000066400000000000000000000224221443134507600222750ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXBRC_H__ #define __MFXBRC_H__ #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! See the mfxExtBRC structure for details. */ enum { MFX_EXTBUFF_BRC = MFX_MAKEFOURCC('E','B','R','C') }; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes frame parameters required for external BRC functions. */ typedef struct { mfxU32 reserved[23]; mfxU16 SceneChange; /*!< Frame belongs to a new scene if non zero. */ mfxU16 LongTerm; /*!< Frame is a Long Term Reference frame if non zero. */ mfxU32 FrameCmplx; /*!< Frame Complexity Frame spatial complexity if non zero. Zero if complexity is not available. */ mfxU32 EncodedOrder; /*!< The frame number in a sequence of reordered frames starting from encoder Init. */ mfxU32 DisplayOrder; /*!< The frame number in a sequence of frames in display order starting from last IDR. */ mfxU32 CodedFrameSize; /*!< Size of the frame in bytes after encoding. */ mfxU16 FrameType; /*!< Frame type. See FrameType enumerator for possible values. */ mfxU16 PyramidLayer; /*!< B-pyramid or P-pyramid layer that the frame belongs to. */ mfxU16 NumRecode; /*!< Number of recodings performed for this frame. */ mfxU16 NumExtParam; /*!< Reserved for future use. */ mfxExtBuffer** ExtParam;/*!< Reserved for future use. */ } mfxBRCFrameParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies controls for next frame encoding provided by external BRC functions. */ typedef struct { mfxI32 QpY; /*!< Frame-level Luma QP. */ mfxU32 InitialCpbRemovalDelay; /*!< See initial_cpb_removal_delay in codec standard. Ignored if no HRD control: mfxExtCodingOption::VuiNalHrdParameters = MFX_CODINGOPTION_OFF. Calculated by encoder if initial_cpb_removal_delay==0 && initial_cpb_removal_offset == 0 && HRD control is switched on. */ mfxU32 InitialCpbRemovalOffset; /*!< See initial_cpb_removal_offset in codec standard. Ignored if no HRD control: mfxExtCodingOption::VuiNalHrdParameters = MFX_CODINGOPTION_OFF. Calculated by encoder if initial_cpb_removal_delay==0 && initial_cpb_removal_offset == 0 && HRD control is switched on. */ mfxU32 reserved1[7]; mfxU32 MaxFrameSize; /*!< Max frame size in bytes. Option for repack feature. Driver calls PAK until current frame size is less than or equal to MaxFrameSize, or number of repacking for this frame is equal to MaxNumRePak. Repack is available if there is driver support, MaxFrameSize !=0, and MaxNumRePak != 0. Ignored if MaxNumRePak == 0. */ mfxU8 DeltaQP[8]; /*!< Option for repack feature. Ignored if MaxNumRePak == 0 or MaxNumRePak==0. If current frame size > MaxFrameSize and/or number of repacking (nRepack) for this frame <= MaxNumRePak, PAK is called with QP = mfxBRCFrameCtrl::QpY + Sum(DeltaQP[i]), where i = [0,nRepack]. Non zero DeltaQP[nRepack] are ignored if nRepack > MaxNumRePak. If repacking feature is on ( MaxFrameSize & MaxNumRePak are not zero), it is calculated by the encoder. */ mfxU16 MaxNumRepak; /*!< Number of possible repacks in driver if current frame size > MaxFrameSize. Ignored if MaxFrameSize==0. See MaxFrameSize description. Possible values are in the range of 0 to 8. */ mfxU16 NumExtParam; /*!< Reserved for future use. */ mfxExtBuffer** ExtParam; /*!< Reserved for future use. */ } mfxBRCFrameCtrl; MFX_PACK_END() /*! The BRCStatus enumerator itemizes instructions to the encoder by mfxExtBrc::Update. */ enum { MFX_BRC_OK = 0, /*!< CodedFrameSize is acceptable, no further recoding/padding/skip required, proceed to next frame. */ MFX_BRC_BIG_FRAME = 1, /*!< Coded frame is too big, recoding required. */ MFX_BRC_SMALL_FRAME = 2, /*!< Coded frame is too small, recoding required. */ MFX_BRC_PANIC_BIG_FRAME = 3, /*!< Coded frame is too big, no further recoding possible - skip frame. */ MFX_BRC_PANIC_SMALL_FRAME = 4 /*!< Coded frame is too small, no further recoding possible - required padding to mfxBRCFrameStatus::MinFrameSize. */ }; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies instructions for the encoder provided by external BRC after each frame encoding. See the BRCStatus enumerator for details. */ typedef struct { mfxU32 MinFrameSize; /*!< Size in bytes, coded frame must be padded to when Status = MFX_BRC_PANIC_SMALL_FRAME. */ mfxU16 BRCStatus; /*!< BRC status. See the BRCStatus enumerator for possible values. */ mfxU16 reserved[25]; mfxHDL reserved1; } mfxBRCFrameStatus; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Contains a set of callbacks to perform external bitrate control. Can be attached to the mfxVideoParam structure during encoder initialization. Set the mfxExtCodingOption2::ExtBRC option to ON to make the encoder use the external BRC instead of the native one. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_BRC. */ mfxU32 reserved[14]; mfxHDL pthis; /*!< Pointer to the BRC object. */ /*! @brief Initializes the BRC session according to parameters from input mfxVideoParam and attached structures. It does not modify the input mfxVideoParam and attached structures. Invoked during MFXVideoENCODE_Init. @param[in] pthis Pointer to the BRC object. @param[in] par Pointer to the mfxVideoParam structure that was used for the encoder initialization. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNSUPPORTED The function detected unsupported video parameters. */ mfxStatus (MFX_CDECL *Init) (mfxHDL pthis, mfxVideoParam* par); /*! @brief Resets BRC session according to new parameters. It does not modify the input mfxVideoParam and attached structures. Invoked during MFXVideoENCODE_Reset. @param[in] pthis Pointer to the BRC object. @param[in] par Pointer to the mfxVideoParam structure that was used for the encoder initialization. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNSUPPORTED The function detected unsupported video parameters. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that the video parameters provided by the application are incompatible with initialization parameters. Reset requires additional memory allocation and cannot be executed. */ mfxStatus (MFX_CDECL *Reset) (mfxHDL pthis, mfxVideoParam* par); /*! @brief Deallocates any internal resources acquired in Init for this BRC session. Invoked during MFXVideoENCODE_Close. @param[in] pthis Pointer to the BRC object. @return MFX_ERR_NONE The function completed successfully. */ mfxStatus (MFX_CDECL *Close) (mfxHDL pthis); /*! @brief Returns controls (@p ctrl) to encode next frame based on info from input mfxBRCFrameParam structure (@p par) and internal BRC state. Invoked asynchronously before each frame encoding or recoding. @param[in] pthis Pointer to the BRC object. @param[in] par Pointer to the mfxVideoParam structure that was used for the encoder initialization. @param[out] ctrl Pointer to the output mfxBRCFrameCtrl structure. @return MFX_ERR_NONE The function completed successfully. */ mfxStatus (MFX_CDECL* GetFrameCtrl) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl); /*! @brief Updates internal BRC state and returns status to instruct encoder whether it should recode the previous frame, skip the previous frame, do padding, or proceed to next frame based on info from input mfxBRCFrameParam and mfxBRCFrameCtrl structures. Invoked asynchronously after each frame encoding or recoding. @param[in] pthis Pointer to the BRC object. @param[in] par Pointer to the mfxVideoParam structure that was used for the encoder initialization. @param[in] ctrl Pointer to the output mfxBRCFrameCtrl structure. @param[in] status Pointer to the output mfxBRCFrameStatus structure. @return MFX_ERR_NONE The function completed successfully. */ mfxStatus (MFX_CDECL* Update) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status); mfxHDL reserved1[10]; } mfxExtBRC; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif /* __cplusplus */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxcamera.h000066400000000000000000000405101443134507600227550ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXCAMERA_H__ #define __MFXCAMERA_H__ #include "mfxcommon.h" #ifdef ONEVPL_EXPERIMENTAL #if !defined(__GNUC__) #pragma warning(disable : 4201) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! The ExtendedBufferID enumerator itemizes and defines identifiers (BufferId) for extended buffers in camera processing. The application should attach these extended buffers to the mfxVideoParam structure to configure camera processing through VideoVPP functions. And Implementation capabilities of camera processing features can be delivered by the function MFXQueryImplsDescription via VPP configuration mfxVPPDescription. */ enum { /*! This extended buffer is mandatory for camera raw acclerator initialization. See the mfxExtCamPipeControl structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_PIPECONTROL = MFX_MAKEFOURCC('C', 'P', 'P', 'C'), /*! This extended buffer defines control parameters for the Camera White Balance filter algorithm. See mfxExtCamWhiteBalance structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_WHITE_BALANCE = MFX_MAKEFOURCC('C', 'W', 'B', 'L'), /*! This extended buffer defines control parameters for the Camera Hot Pixel Removal filter algorithm. See mfxExtCamHotPixelRemoval structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL = MFX_MAKEFOURCC('C', 'H', 'P', 'R'), /*! This extended buffer defines control parameters for the Camera Black Level Correction filter algorithm. See mfxExtCamBlackLevelCorrection structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION = MFX_MAKEFOURCC('C', 'B', 'L', 'C'), /*! This extended buffer defines control parameters for the Camera Vignette Correction filter algorithm. See mfxCamVignetteCorrectionParam structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_VIGNETTE_CORRECTION = MFX_MAKEFOURCC('C', 'V', 'G', 'T'), /*! This extended buffer defines control parameters for the Camera Bayer Denoise filter algorithm. See mfxExtCamBayerDenoise structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_BAYER_DENOISE = MFX_MAKEFOURCC('C', 'D', 'N', 'S'), /*! This extended buffer defines control parameters for the Camera Color Correction filter algorithm. See mfxExtCamColorCorrection3x3 structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3 = MFX_MAKEFOURCC('C', 'C', '3', '3'), /*! This extended buffer defines control parameters for the Camera Padding. See mfxExtCamPadding structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_PADDING = MFX_MAKEFOURCC('C', 'P', 'A', 'D'), /*! This extended buffer defines control parameters for the Camera Forward Gamma Correction filter algorithm. See mfxExtCamFwdGamma structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION = MFX_MAKEFOURCC('C', 'F', 'G', 'C'), /*! This extended buffer defines control parameters for the Camera Lens Geometry Distortion and Chroma Aberration Correction filter algorithm. See mfxExtCamLensGeomDistCorrection structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION = MFX_MAKEFOURCC('C', 'L', 'G', 'D'), /*! This extended buffer defines control parameters for the Camera 3DLUT filter algorithm. See mfxExtCam3DLut structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_3DLUT = MFX_MAKEFOURCC('C', 'L', 'U', 'T'), /*! This extended buffer defines control parameters for the Camera Total Color Control algorithm. See mfxExtCamTotalColorControl structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL = MFX_MAKEFOURCC('C', 'T', 'C', 'C'), /*! This extended buffer defines control parameters for the Camera YUV to RGB conversion algorithm. See mfxExtCamCscYuvRgb structure for details. The application should attach this extended buffer to the mfxVideoParam structure to configure camera processing initialization. */ MFX_EXTBUF_CAM_CSC_YUV_RGB = MFX_MAKEFOURCC('C', 'C', 'Y', 'R') }; /*! A enumeration that defines white balance mode. */ typedef enum { MFX_CAM_WHITE_BALANCE_MANUAL = 0x0001, /*!< White balance manual mode.*/ MFX_CAM_WHITE_BALANCE_AUTO = 0x0002 /*!< White balance auto mode.*/ } mfxCamWhiteBalanceMode; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera White Balance filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_WHITE_BALANCE. */ mfxU32 Mode; /*!< Specifies one of White Balance operation modes defined in enumeration mfxCamWhiteBalanceMode. */ mfxF64 R; /*!< White Balance Red correction..*/ mfxF64 G0; /*!< White Balance Green Top correction..*/ mfxF64 B; /*!< White Balance Blue correction.*/ mfxF64 G1; /*!< White Balance Green Bottom correction..*/ mfxU32 reserved[8]; /*!< Reserved for future extension.*/ } mfxExtCamWhiteBalance; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera Total Color Control filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL. */ mfxU16 R; /*!< Red element.*/ mfxU16 G; /*!< Green element.*/ mfxU16 B; /*!< Blue element.*/ mfxU16 C; /*!< Cyan element.*/ mfxU16 M; /*!< Magenta element.*/ mfxU16 Y; /*!< Yellow element.*/ mfxU16 reserved[6]; /*!< Reserved for future extension.*/ } mfxExtCamTotalColorControl; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera YUV to RGB format conversion. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_CSC_YUV_RGB. */ mfxF32 PreOffset [3]; /*!< Specifies offset for conversion from full range RGB input to limited range YUV for input color coordinate.*/ mfxF32 Matrix[3] [3]; /*!< Specifies conversion matrix with CSC coefficients.*/ mfxF32 PostOffset [3]; /*!< Specifies offset for conversion from full range RGB input to limited range YUV for output color coordinate.*/ mfxU16 reserved[30]; /*!< Reserved for future extension.*/ } mfxExtCamCscYuvRgb; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera Hot Pixel Removal filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL. */ mfxU16 PixelThresholdDifference; /*!< Threshold for Hot Pixel difference. */ mfxU16 PixelCountThreshold; /*!< Count pixel detection.*/ mfxU16 reserved[32]; /*!< Reserved for future extension.*/ } mfxExtCamHotPixelRemoval; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { /*! A hint structure that configures Camera black level correction. */ mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION. */ mfxU16 R; /*!< Black Level Red correction.*/ mfxU16 G0; /*!< Black Level Green Top correction.*/ mfxU16 B; /*!< Black Level Blue correction.*/ mfxU16 G1; /*!< Black Level Green Bottom correction.*/ mfxU32 reserved[4]; /*!< Reserved for future extension.*/ } mfxExtCamBlackLevelCorrection; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A structure that defines Camera Vignette Correction Element. */ typedef struct { mfxU8 integer; /*!< Integer part of correction element.*/ mfxU8 mantissa; /*!< Fractional part of correction element.*/ mfxU8 reserved[6]; /*!< Reserved for future extension.*/ } mfxCamVignetteCorrectionElement; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A structure that defines Camera Vignette Correction Parameters. */ typedef struct { mfxCamVignetteCorrectionElement R; /*!< Red correction element.*/ mfxCamVignetteCorrectionElement G0; /*!< Green top correction element.*/ mfxCamVignetteCorrectionElement B; /*!< Blue Correction element.*/ mfxCamVignetteCorrectionElement G1; /*!< Green bottom correction element.*/ mfxU32 reserved[4]; /*!< Reserved for future extension.*/ } mfxCamVignetteCorrectionParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! A hint structure that configures Camera Vignette Correction filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_VIGNETTE_CORRECTION. */ mfxU32 Width; /*!< Width of Correction Map 2D buffer in mfxCamVignetteCorrectionParam elements. */ mfxU32 Height; /*!< Height of Correction Map 2D buffer in mfxCamVignetteCorrectionParam elements. */ mfxU32 Pitch; /*!< Pitch of Correction Map 2D buffer in mfxCamVignetteCorrectionParam elements. */ mfxU32 reserved[7]; /*!< Reserved for future extension.*/ union { mfxCamVignetteCorrectionParam* CorrectionMap; /*!< 2D buffer of mfxCamVignetteCorrectionParam elements.*/ mfxU64 reserved1; /*!< Reserved for alignment on 32bit and 64bit.*/ }; } mfxExtCamVignetteCorrection; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera Bayer denoise filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_BAYER_DENOISE. */ mfxU16 Threshold; /*!< Level of denoise, legal values: [0:63].*/ mfxU16 reserved[27]; /*!< Reserved for future extension.*/ } mfxExtCamBayerDenoise; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! A hint structure that configures Camera Color correction filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3. */ mfxF32 CCM [3] [3]; /*!< 3x3 dimension matrix providing RGB Color Correction coefficients.*/ mfxU32 reserved[32]; /*!< Reserved for future extension.*/ } mfxExtCamColorCorrection3x3; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera Padding. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_PADDING. */ mfxU16 Top; /*!< Specify number of padded columns respectively. Currently only 8 pixels supported for all dimensions..*/ mfxU16 Bottom; /*!< Specify number of padded columns respectively. Currently only 8 pixels supported for all dimensions..*/ mfxU16 Left; /*!< Specify number of padded rows respectively. Currently only 8 pixels supported for all dimensions..*/ mfxU16 Right; /*!< Specify number of padded rows respectively. Currently only 8 pixels supported for all dimensions..*/ mfxU32 reserved[4]; /*!< Reserved for future extension.*/ } mfxExtCamPadding; MFX_PACK_END() /*! A enumeration that defines Bayer mode. */ typedef enum { /*! Pixel Representation BG GR. */ MFX_CAM_BAYER_BGGR = 0x0000, /*! Pixel Representation RG GB. */ MFX_CAM_BAYER_RGGB = 0x0001, /*! Pixel Representation GB RG. */ MFX_CAM_BAYER_GBRG = 0x0002, /*! Pixel Representation GR BG. */ MFX_CAM_BAYER_GRBG = 0x0003 } mfxCamBayerFormat; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures camera pipe control. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_PIPECONTROL. */ mfxU16 RawFormat; /*!< Specifies one of the four Bayer patterns defined in mfxCamBayerFormat enumeration.*/ mfxU16 reserved1; /*!< Reserved for future extension.*/ mfxU32 reserved[5]; /*!< Reserved for future extension.*/ } mfxExtCamPipeControl; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A structure that specifies forward gamma segment. */ typedef struct { mfxU16 Pixel; /*!< Pixel value.*/ mfxU16 Red; /*!< Corrected Red value.*/ mfxU16 Green; /*!< Corrected Green value.*/ mfxU16 Blue; /*!< Corrected Blue value.*/ } mfxCamFwdGammaSegment; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! A hint structure that configures Camera Forward Gamma Correction filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION. */ mfxU16 reserved[19]; /*!< Reserved for future extension.*/ mfxU16 NumSegments; /*!< Number of Gamma segments.*/ union { mfxCamFwdGammaSegment* Segment; /*!< Pointer to Gamma segments array.*/ mfxU64 reserved1; /*!< Reserved for future extension.*/ }; } mfxExtCamFwdGamma; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures Camera Lens Geometry Distortion and Chroma Aberration Correction filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION. */ mfxF32 a[3]; /*!< Polynomial coefficients a for R/G/B*/ mfxF32 b[3]; /*!< Polynomial coefficients b for R/G/B*/ mfxF32 c[3]; /*!< Polynomial coefficients c for R/G/B*/ mfxF32 d[3]; /*!< Polynomial coefficients d for R/G/B*/ mfxU16 reserved[36]; /*!< Reserved for future extension.*/ } mfxExtCamLensGeomDistCorrection; MFX_PACK_END() /*! A enumeration that defines 3DLUT size. */ enum { MFX_CAM_3DLUT17_SIZE = (17 * 17 * 17), /*!< 17^3 LUT size*/ MFX_CAM_3DLUT33_SIZE = (33 * 33 * 33), /*!< 33^3 LUT size*/ MFX_CAM_3DLUT65_SIZE = (65 * 65 * 65) /*!< 65^3 LUT size*/ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A structure that defines 3DLUT entry. */ typedef struct { mfxU16 R; /*!< R channel*/ mfxU16 G; /*!< G channel*/ mfxU16 B; /*!< B channel*/ mfxU16 Reserved; /*!< Reserved for future extension.*/ } mfxCam3DLutEntry; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! A hint structure that configures Camera 3DLUT filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUF_CAM_3DLUT. */ mfxU16 reserved[10]; /*!< Reserved for future extension.*/ mfxU32 Size; /*!< LUT size, defined in MFX_CAM_3DLUT17/33/65_SIZE enumeration.*/ union { mfxCam3DLutEntry* Table; /*!< Pointer to mfxCam3DLutEntry, size of each dimension depends on LUT size, e.g. LUT[17][17][17] for 17x17x17 look up table.*/ mfxU64 reserved1; /*!< Reserved for future extension.*/ }; } mfxExtCam3DLut; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif #endif // ONEVPL_EXPERIMENTAL #endif // __MFXCAMERA_H__oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxcommon.h000066400000000000000000001147341443134507600230270ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXCOMMON_H__ #define __MFXCOMMON_H__ #include "mfxdefs.h" #if !defined (__GNUC__) #pragma warning(disable: 4201) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) /* Extended Configuration Header Structure */ MFX_PACK_BEGIN_USUAL_STRUCT() /*! The common header definition for external buffers and video processing hints. */ typedef struct { mfxU32 BufferId; /*!< Identifier of the buffer content. See the ExtendedBufferID enumerator for a complete list of extended buffers. */ mfxU32 BufferSz; /*!< Size of the buffer. */ } mfxExtBuffer; MFX_PACK_END() #ifdef ONEVPL_EXPERIMENTAL #define MFX_REFINTERFACE_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure represents reference counted interface structure. The memory is allocated and released by the implementation. */ typedef struct mfxRefInterface { mfxHDL Context; /*!< The context of the container interface. User should not touch (change, set, null) this pointer. */ mfxStructVersion Version; /*!< The version of the structure. */ /*! @brief Increments the internal reference counter of the container. The container is not destroyed until the container is released using the mfxRefInterface::Release function. mfxRefInterface::AddRef should be used each time a new link to the container is created (for example, copy structure) for proper management. @param[in] ref_interface Valid interface. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *AddRef)(struct mfxRefInterface* ref_interface); /*! @brief Decrements the internal reference counter of the container. mfxRefInterface::Release should be called after using the mfxRefInterface::AddRef function to add a container or when allocation logic requires it. @param[in] ref_interface Valid interface. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of container is zero before call. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Release)(struct mfxRefInterface* ref_interface); /*! @brief Returns current reference counter of mfxRefInterface structure. @param[in] ref_interface Valid interface. @param[out] counter Sets counter to the current reference counter value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface or counter is NULL. \n MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxRefInterface* ref_interface, mfxU32* counter); mfxHDL reserved[4]; }mfxRefInterface; MFX_PACK_END() #endif /* Library initialization and deinitialization */ /*! This enumerator itemizes implementation types. The implementation type is a bit OR'ed value of the base type and any decorative flags. @note This enumerator is for legacy dispatcher compatibility only. The new dispatcher does not use it. */ typedef mfxI32 mfxIMPL; /*! The application can use the macro MFX_IMPL_BASETYPE(x) to obtain the base implementation type. */ #define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) enum { MFX_IMPL_AUTO = 0x0000, /*!< Auto Selection/In or Not Supported/Out. */ MFX_IMPL_SOFTWARE = 0x0001, /*!< Pure software implementation. */ MFX_IMPL_HARDWARE = 0x0002, /*!< Hardware accelerated implementation (default device). */ MFX_IMPL_AUTO_ANY = 0x0003, /*!< Auto selection of any hardware/software implementation. */ MFX_IMPL_HARDWARE_ANY = 0x0004, /*!< Auto selection of any hardware implementation. */ MFX_IMPL_HARDWARE2 = 0x0005, /*!< Hardware accelerated implementation (2nd device). */ MFX_IMPL_HARDWARE3 = 0x0006, /*!< Hardware accelerated implementation (3rd device). */ MFX_IMPL_HARDWARE4 = 0x0007, /*!< Hardware accelerated implementation (4th device). */ MFX_IMPL_RUNTIME = 0x0008, /*!< This value cannot be used for session initialization. It may be returned by the MFXQueryIMPL function to show that the session has been initialized in run-time mode. */ MFX_IMPL_VIA_ANY = 0x0100, /*!< Hardware acceleration can go through any supported OS infrastructure. This is the default value. The default value is used by the legacy Intel(r) Media SDK if none of the MFX_IMPL_VIA_xxx flags are specified by the application. */ MFX_IMPL_VIA_D3D9 = 0x0200, /*!< Hardware acceleration goes through the Microsoft* Direct3D* 9 infrastructure. */ MFX_IMPL_VIA_D3D11 = 0x0300, /*!< Hardware acceleration goes through the Microsoft* Direct3D* 11 infrastructure. */ MFX_IMPL_VIA_VAAPI = 0x0400, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure. */ MFX_IMPL_VIA_HDDLUNITE = 0x0500, /*!< Hardware acceleration goes through the HDDL* Unite*. */ MFX_IMPL_UNSUPPORTED = 0x0000 /*!< One of the MFXQueryIMPL returns. */ }; /* Version Info */ MFX_PACK_BEGIN_USUAL_STRUCT() /*! The mfxVersion union describes the version of the implementation.*/ typedef union { /*! @brief Structure with Major and Minor fields. */ /*! @struct Anonymous */ struct { /*! @{ @name Major and Minor fields Anonymous structure with Major and Minor fields. */ mfxU16 Minor; /*!< Minor number of the implementation. */ mfxU16 Major; /*!< Major number of the implementation. */ /*! @} */ }; mfxU32 Version; /*!< Implementation version number. */ } mfxVersion; MFX_PACK_END() /*! The mfxPriority enumerator describes the session priority. */ typedef enum { MFX_PRIORITY_LOW = 0, /*!< Low priority: the session operation halts when high priority tasks are executing and more than 75% of the CPU is being used for normal priority tasks.*/ MFX_PRIORITY_NORMAL = 1, /*!< Normal priority: the session operation is halted if there are high priority tasks.*/ MFX_PRIORITY_HIGH = 2 /*!< High priority: the session operation blocks other lower priority session operations.*/ } mfxPriority; typedef struct _mfxEncryptedData mfxEncryptedData; MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Defines the buffer that holds compressed video data. */ typedef struct { /*! @internal :unnamed(union) @endinternal */ union { struct { mfxEncryptedData* EncryptedData; /*!< Reserved and must be zero. */ mfxExtBuffer **ExtParam; /*!< Array of extended buffers for additional bitstream configuration. See the ExtendedBufferID enumerator for a complete list of extended buffers. */ mfxU16 NumExtParam; /*!< The number of extended buffers attached to this structure. */ mfxU32 CodecId; /*!< Specifies the codec format identifier in the FourCC code. See the CodecFormatFourCC enumerator for details. This optional parameter is required for the simplified decode initialization. */ }; mfxU32 reserved[6]; }; /*! Decode time stamp of the compressed bitstream in units of 90KHz. A value of MFX_TIMESTAMP_UNKNOWN indicates that there is no time stamp. This value is calculated by the encoder from the presentation time stamp provided by the application in the mfxFrameSurface1 structure and from the frame rate provided by the application during the encoder initialization. */ mfxI64 DecodeTimeStamp; mfxU64 TimeStamp; /*!< Time stamp of the compressed bitstream in units of 90KHz. A value of MFX_TIMESTAMP_UNKNOWN indicates that there is no time stamp. */ mfxU8* Data; /*!< Bitstream buffer pointer, 32-bytes aligned. */ mfxU32 DataOffset; /*!< Next reading or writing position in the bitstream buffer. */ mfxU32 DataLength; /*!< Size of the actual bitstream data in bytes. */ mfxU32 MaxLength; /*!< Allocated bitstream buffer size in bytes. */ mfxU16 PicStruct; /*!< Type of the picture in the bitstream. Output parameter. */ mfxU16 FrameType; /*!< Frame type of the picture in the bitstream. Output parameter. */ mfxU16 DataFlag; /*!< Indicates additional bitstream properties. See the BitstreamDataFlag enumerator for details. */ mfxU16 reserved2; /*!< Reserved for future use. */ } mfxBitstream; MFX_PACK_END() /*! Synchronization point object handle. */ typedef struct _mfxSyncPoint *mfxSyncPoint; /*! The GPUCopy enumerator controls usage of GPU accelerated copying between video and system memory in the legacy Intel(r) Media SDK components. */ enum { MFX_GPUCOPY_DEFAULT = 0, /*!< Use default mode for the legacy Intel(r) Media SDK implementation. */ MFX_GPUCOPY_ON = 1, /*!< The hint to enable GPU accelerated copying when it is supported by the library. If the library doesn't support GPU accelerated copy the operation will be made by CPU. */ MFX_GPUCOPY_OFF = 2, /*!< Disable GPU accelerated copying. */ #ifdef ONEVPL_EXPERIMENTAL MFX_GPUCOPY_SAFE = 3 /*!< The hint to disable buffer caching for GPU accelerated copying. Actual when GPU accelerated copying is supported by the library. */ #endif }; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies advanced initialization parameters. A zero value in any of the fields indicates that the corresponding field is not explicitly specified. */ typedef struct { mfxIMPL Implementation; /*!< Enumerator that indicates the desired legacy Intel(r) Media SDK implementation. */ mfxVersion Version; /*!< Structure which specifies minimum library version or zero, if not specified. */ mfxU16 ExternalThreads; /*!< Desired threading mode. Value 0 means internal threading, 1 - external. */ /*! @internal :unnamed(union) @endinternal */ union { struct { mfxExtBuffer **ExtParam; /*!< Points to an array of pointers to the extra configuration structures; see the ExtendedBufferID enumerator for a list of extended configurations. */ mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to this structure. */ }; mfxU16 reserved2[5]; }; mfxU16 GPUCopy; /*!< Enables or disables GPU accelerated copying between video and system memory in legacy Intel(r) Media SDK components. See the GPUCopy enumerator for a list of valid values. */ mfxU16 reserved[21]; } mfxInitParam; MFX_PACK_END() enum { MFX_EXTBUFF_THREADS_PARAM = MFX_MAKEFOURCC('T','H','D','P') /*!< mfxExtThreadsParam buffer ID. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies options for threads created by this session. Attached to the mfxInitParam structure during legacy Intel(r) Media SDK session initialization or to mfxInitializationParam by the dispatcher in MFXCreateSession function. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_THREADS_PARAM. */ mfxU16 NumThread; /*!< The number of threads. */ mfxI32 SchedulingType; /*!< Scheduling policy for all threads.*/ mfxI32 Priority; /*!< Priority for all threads. */ mfxU16 reserved[55]; /*!< Reserved for future use. */ } mfxExtThreadsParam; MFX_PACK_END() /*! Deprecated. */ enum { MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_UNKNOWN) = 0, /*!< Unknown platform. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_SANDYBRIDGE) = 1, /*!< Intel(r) microarchitecture code name Sandy Bridge. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_IVYBRIDGE) = 2, /*!< Intel(r) microarchitecture code name Ivy Bridge. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_HASWELL) = 3, /*!< Code name Haswell. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_BAYTRAIL) = 4, /*!< Code name Bay Trail. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_BROADWELL) = 5, /*!< Intel(r) microarchitecture code name Broadwell. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_CHERRYTRAIL) = 6, /*!< Code name Cherry Trail. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_SKYLAKE) = 7, /*!< Intel(r) microarchitecture code name Skylake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_APOLLOLAKE) = 8, /*!< Code name Apollo Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_KABYLAKE) = 9, /*!< Code name Kaby Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_GEMINILAKE) = 10, /*!< Code name Gemini Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_COFFEELAKE) = 11, /*!< Code name Coffee Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_CANNONLAKE) = 20, /*!< Code name Cannon Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ICELAKE) = 30, /*!< Code name Ice Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_JASPERLAKE) = 32, /*!< Code name Jasper Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ELKHARTLAKE) = 33, /*!< Code name Elkhart Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_TIGERLAKE) = 40, /*!< Code name Tiger Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ROCKETLAKE) = 42, /*!< Code name Rocket Lake. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ALDERLAKE_S) = 43, /*!< Code name Alder Lake S. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ALDERLAKE_P) = 44, /*!< Code name Alder Lake P. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ARCTICSOUND_P) = 45, MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_XEHP_SDV) = 45, /*!< Code name XeHP SDV. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_DG2) = 46, /*!< Code name DG2. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ATS_M) = 46, /*!< Code name ATS-M, same media functionality as DG2. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_ALDERLAKE_N) = 55, /*!< Code name Alder Lake N. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_PLATFORM_KEEMBAY) = 50, /*!< Code name Keem Bay. */ }; /*! The mfxMediaAdapterType enumerator itemizes types of graphics adapters. */ typedef enum { MFX_MEDIA_UNKNOWN = 0xffff, /*!< Unknown type. */ MFX_MEDIA_INTEGRATED = 0, /*!< Integrated graphics adapter. */ MFX_MEDIA_DISCRETE = 1 /*!< Discrete graphics adapter. */ } mfxMediaAdapterType; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Contains information about hardware platform for the Legacy mode. */ typedef struct { MFX_DEPRECATED mfxU16 CodeName; /*!< Deprecated. */ mfxU16 DeviceId; /*!< Unique identifier of graphics device. */ mfxU16 MediaAdapterType; /*!< Description of graphics adapter type. See the mfxMediaAdapterType enumerator for a list of possible values. */ mfxU16 reserved[13]; /*!< Reserved for future use. */ } mfxPlatform; MFX_PACK_END() /* The mfxResourceType enumerator specifies types of different native data frames and buffers. */ typedef enum { MFX_RESOURCE_SYSTEM_SURFACE = 1, /*!< System memory. */ MFX_RESOURCE_VA_SURFACE_PTR = 2, /*!< Pointer to VA surface index. */ MFX_RESOURCE_VA_SURFACE = MFX_RESOURCE_VA_SURFACE_PTR, /*!< Pointer to VA surface index. */ MFX_RESOURCE_VA_BUFFER_PTR = 3, /*!< Pointer to VA buffer index. */ MFX_RESOURCE_VA_BUFFER = MFX_RESOURCE_VA_BUFFER_PTR, /*!< Pointer to VA buffer index. */ MFX_RESOURCE_DX9_SURFACE = 4, /*!< IDirect3DSurface9. */ MFX_RESOURCE_DX11_TEXTURE = 5, /*!< ID3D11Texture2D. */ MFX_RESOURCE_DX12_RESOURCE = 6, /*!< ID3D12Resource. */ MFX_RESOURCE_DMA_RESOURCE = 7, /*!< DMA resource. */ MFX_RESOURCE_HDDLUNITE_REMOTE_MEMORY = 8, /*!< HDDL Unite Remote memory handle. */ } mfxResourceType; /*! Maximum allowed length of the implementation name. */ #define MFX_IMPL_NAME_LEN 32 /*! Maximum allowed length of the implementation name. */ #define MFX_STRFIELD_LEN 128 #define MFX_DECODERDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The mfxDecoderDescription structure represents the description of a decoder. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumCodecs; /*!< Number of supported decoders. */ /*! This structure represents the decoder description. */ struct decoder { mfxU32 CodecID; /*!< Decoder ID in FourCC format. */ mfxU16 reserved[8]; /*!< Reserved for future use. */ mfxU16 MaxcodecLevel; /*!< Maximum supported codec level. See the CodecProfile enumerator for possible values. */ mfxU16 NumProfiles; /*!< Number of supported profiles. */ /*! This structure represents the codec profile description. */ struct decprofile { mfxU32 Profile; /*!< Profile ID. See the CodecProfile enumerator for possible values.*/ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumMemTypes; /*!< Number of supported memory types. */ /*! This structure represents the underlying details of the memory type. */ struct decmemdesc { mfxResourceType MemHandleType; /*!< Memory handle type. */ mfxRange32U Width; /*!< Range of supported image widths. */ mfxRange32U Height; /*!< Range of supported image heights. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumColorFormats; /*!< Number of supported output color formats. */ mfxU32* ColorFormats; /*!< Pointer to the array of supported output color formats (in FOURCC). */ } * MemDesc; /*!< Pointer to the array of memory types. */ } * Profiles; /*!< Pointer to the array of profiles supported by the codec. */ } * Codecs; /*!< Pointer to the array of decoders. */ } mfxDecoderDescription; MFX_PACK_END() #define MFX_ENCODERDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents an encoder description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumCodecs; /*!< Number of supported encoders. */ /*! This structure represents encoder description. */ struct encoder { mfxU32 CodecID; /*!< Encoder ID in FourCC format. */ mfxU16 MaxcodecLevel; /*!< Maximum supported codec level. See the CodecProfile enumerator for possible values. */ mfxU16 BiDirectionalPrediction; /*!< Indicates B-frames support. */ #ifdef ONEVPL_EXPERIMENTAL mfxU16 ReportedStats; /*!< Indicates what type of statistics can be reported: block/slice/tile/frame. */ mfxU16 reserved[6]; /*!< Reserved for future use. */ #else mfxU16 reserved[7]; /*!< Reserved for future use. */ #endif mfxU16 NumProfiles; /*!< Number of supported profiles. */ /*! This structure represents the codec profile description. */ struct encprofile { mfxU32 Profile; /*!< Profile ID. See the CodecProfile enumerator for possible values.*/ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumMemTypes; /*!< Number of supported memory types. */ /*! This structure represents the underlying details of the memory type. */ struct encmemdesc { mfxResourceType MemHandleType; /*!< Memory handle type. */ mfxRange32U Width; /*!< Range of supported image widths. */ mfxRange32U Height; /*!< Range of supported image heights. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumColorFormats; /*!< Number of supported input color formats. */ mfxU32* ColorFormats; /*!< Pointer to the array of supported input color formats (in FOURCC). */ } * MemDesc; /*!< Pointer to the array of memory types. */ } * Profiles; /*!< Pointer to the array of profiles supported by the codec. */ } * Codecs; /*!< Pointer to the array of encoders. */ } mfxEncoderDescription; MFX_PACK_END() #define MFX_VPPDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents VPP description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumFilters; /*!< Number of supported VPP filters. */ /*! This structure represents the VPP filters description. */ struct filter { mfxU32 FilterFourCC; /*!< Filter ID in FourCC format. */ mfxU16 MaxDelayInFrames; /*!< Introduced output delay in frames. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumMemTypes; /*!< Number of supported memory types. */ /*! This structure represents the underlying details of the memory type. */ struct memdesc { mfxResourceType MemHandleType; /*!< Memory handle type. */ mfxRange32U Width; /*!< Range of supported image widths. */ mfxRange32U Height; /*!< Range of supported image heights. */ mfxU16 reserved[7]; /*!< Reserved for future use. */ mfxU16 NumInFormats; /*!< Number of supported input color formats. */ /*! This structure represents the input color format description. */ struct format { mfxU32 InFormat; /*!< Input color in FourCC format. */ mfxU16 reserved[5]; /*!< Reserved for future use. */ mfxU16 NumOutFormat; /*!< Number of supported output color formats. */ mfxU32* OutFormats; /*!< Pointer to the array of supported output color formats (in FOURCC). */ } * Formats; /*!< Pointer to the array of supported formats. */ } * MemDesc; /*!< Pointer to the array of memory types. */ } * Filters; /*!< Pointer to the array of supported filters. */ } mfxVPPDescription; MFX_PACK_END() /*! The current version of mfxDeviceDescription structure. */ #define MFX_DEVICEDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 1) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents device description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[6]; /*!< reserved for future use. */ mfxU16 MediaAdapterType; /*!< Graphics adapter type. See the mfxMediaAdapterType enumerator for a list of possible values. */ mfxChar DeviceID[MFX_STRFIELD_LEN]; /*!< Null terminated string with device ID. */ mfxU16 NumSubDevices; /*!< Number of available uniform sub-devices. Pure software implementation can report 0. */ /*! This structure represents sub-device description. */ struct subdevices { mfxU32 Index; /*!< Index of the sub-device, started from 0 and increased by 1.*/ mfxChar SubDeviceID[MFX_STRFIELD_LEN]; /*!< Null terminated string with unique sub-device ID, mapped to the system ID. */ mfxU32 reserved[7]; /*!< reserved for future use. */ } * SubDevices; /*!< Pointer to the array of available sub-devices. */ } mfxDeviceDescription; MFX_PACK_END() /*! This enum itemizes implementation type. */ typedef enum { MFX_IMPL_TYPE_SOFTWARE = 0x0001, /*!< Pure Software Implementation. */ MFX_IMPL_TYPE_HARDWARE = 0x0002, /*!< Hardware Accelerated Implementation. */ } mfxImplType; /*! This enum itemizes hardware acceleration stack to use. */ typedef enum { MFX_ACCEL_MODE_NA = 0, /*!< Hardware acceleration is not applicable. */ MFX_ACCEL_MODE_VIA_D3D9 = 0x0200, /*!< Hardware acceleration goes through the Microsoft* Direct3D9* infrastructure. */ MFX_ACCEL_MODE_VIA_D3D11 = 0x0300, /*!< Hardware acceleration goes through the Microsoft* Direct3D11* infrastructure. */ MFX_ACCEL_MODE_VIA_VAAPI = 0x0400, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure. */ MFX_ACCEL_MODE_VIA_VAAPI_DRM_RENDER_NODE = MFX_ACCEL_MODE_VIA_VAAPI, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with DRM RENDER MODE as default acceleration access point. */ MFX_ACCEL_MODE_VIA_VAAPI_DRM_MODESET = 0x0401, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with DRM MODESET as default acceleration access point. */ MFX_ACCEL_MODE_VIA_VAAPI_GLX = 0x0402, /*! Hardware acceleration goes through the Linux* VA-API infrastructure with OpenGL Extension to the X Window System as default acceleration access point. */ MFX_ACCEL_MODE_VIA_VAAPI_X11 = 0x0403, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with X11 as default acceleration access point. */ MFX_ACCEL_MODE_VIA_VAAPI_WAYLAND = 0x0404, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with Wayland as default acceleration access point. */ MFX_ACCEL_MODE_VIA_HDDLUNITE = 0x0500, /*!< Hardware acceleration goes through the HDDL* Unite*. */ } mfxAccelerationMode; #define MFX_ACCELERATIONMODESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents acceleration modes description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[2]; /*!< reserved for future use. */ mfxU16 NumAccelerationModes; /*!< Number of supported acceleration modes. */ mfxAccelerationMode* Mode; /*!< Pointer to the array of supported acceleration modes. */ } mfxAccelerationModeDescription; MFX_PACK_END() /*! Specifies the surface pool allocation policies. */ typedef enum { /*! Recommends to limit max pool size by sum of requested surfaces asked by components. */ MFX_ALLOCATION_OPTIMAL = 0, /*! Dynamic allocation with no limit. */ MFX_ALLOCATION_UNLIMITED = 1, /*! Max pool size is limited by NumberToPreAllocate + DeltaToAllocateOnTheFly. */ MFX_ALLOCATION_LIMITED = 2, } mfxPoolAllocationPolicy; /*! The current version of mfxPoolPolicyDescription structure. */ #define MFX_POOLPOLICYDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents pool policy description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 reserved[2]; /*!< reserved for future use. */ mfxU16 NumPoolPolicies; /*!< Number of supported pool policies. */ mfxPoolAllocationPolicy* Policy; /*!< Pointer to the array of supported pool policies. */ } mfxPoolPolicyDescription; MFX_PACK_END() /*! The current version of mfxImplDescription structure. */ #define MFX_IMPLDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 2) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents the implementation description. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxImplType Impl; /*!< Impl type: software/hardware. */ mfxAccelerationMode AccelerationMode; /*!< Default Hardware acceleration stack to use. OS dependent parameter. Use VA for Linux* and DX* for Windows*. */ mfxVersion ApiVersion; /*!< Supported API version. */ mfxChar ImplName[MFX_IMPL_NAME_LEN]; /*!< Null-terminated string with implementation name given by vendor. */ mfxChar License[MFX_STRFIELD_LEN]; /*!< Null-terminated string with comma-separated list of license names of the implementation. */ mfxChar Keywords[MFX_STRFIELD_LEN]; /*!< Null-terminated string with comma-separated list of keywords specific to this implementation that dispatcher can search for. */ mfxU32 VendorID; /*!< Standard vendor ID 0x8086 - Intel. */ mfxU32 VendorImplID; /*!< Vendor specific number with given implementation ID. */ mfxDeviceDescription Dev; /*!< Supported device. */ mfxDecoderDescription Dec; /*!< Decoder configuration. */ mfxEncoderDescription Enc; /*!< Encoder configuration. */ mfxVPPDescription VPP; /*!< VPP configuration. */ union { mfxAccelerationModeDescription AccelerationModeDescription; /*!< Supported acceleration modes. */ mfxU32 reserved3[4]; }; mfxPoolPolicyDescription PoolPolicies; /*!< Supported surface pool polices. */ mfxU32 reserved[8]; /*!< Reserved for future use. */ mfxU32 NumExtParam; /*!< Number of extension buffers. Reserved for future use. Must be 0. */ union { mfxExtBuffer **ExtParam; /*!< Array of extension buffers. */ mfxU64 Reserved2; /*!< Reserved for future use. */ } ExtParams; /*!< Extension buffers. Reserved for future. */ } mfxImplDescription; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This structure represents the list of names of implemented functions. */ typedef struct { mfxU16 NumFunctions; /*!< Number of function names in the FunctionsName array. */ mfxChar** FunctionsName; /*!< Array of the null-terminated strings. Each string contains name of the implemented function. */ } mfxImplementedFunctions; MFX_PACK_END() #ifdef ONEVPL_EXPERIMENTAL #define MFX_EXTENDEDDEVICEID_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies various physical device properties for device matching and identification outside of oneVPL. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxU16 VendorID; /*!< PCI vendor ID. */ mfxU16 DeviceID; /*!< PCI device ID. */ mfxU32 PCIDomain; /*!< PCI bus domain. Equals to '0' if OS doesn't support it or has sequential numbering of buses across domains. */ mfxU32 PCIBus; /*!< The number of the bus that the physical device is located on. */ mfxU32 PCIDevice; /*!< The index of the physical device on the bus. */ mfxU32 PCIFunction; /*!< The function number of the device on the physical device. */ mfxU8 DeviceLUID[8]; /*!< LUID of DXGI adapter. */ mfxU32 LUIDDeviceNodeMask; /*!< Bitfield identifying the node within a linked device adapter corresponding to the device. */ mfxU32 LUIDValid; /*!< Boolean value that will be 1 if DeviceLUID contains a valid LUID and LUIDDeviceNodeMask contains a valid node mask, and 0 if they do not. */ mfxU32 DRMRenderNodeNum; /*!< Number of the DRM render node from the path /dev/dri/RenderD\. Value equals to 0 means that this field doesn't contain valid DRM Render Node number.*/ mfxU32 DRMPrimaryNodeNum; /*!< Number of the DRM primary node from the path /dev/dri/card\. Value equals to 0x7FFFFFFF means that this field doesn't contain valid DRM Primary Node number.*/ mfxU16 RevisionID; /*!< PCI revision ID. The value contains microarchitecture version. */ mfxU8 reserved1[18]; /*!< Reserved for future use. */ mfxChar DeviceName[MFX_STRFIELD_LEN]; /*!< Null-terminated string in utf-8 with the name of the device. */ } mfxExtendedDeviceId; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Cross domain structure to define device UUID. It is defined here to check backward compatibility.*/ typedef struct { mfxU16 vendor_id; /*!< PCI vendor ID. Same as mfxExtendedDeviceId::VendorID. */ mfxU16 device_id; /*!< PCI device ID. Same as mfxExtendedDeviceId::DeviceID. */ mfxU16 revision_id; /*!< PCI revision ID. Same as mfxExtendedDeviceId::RevisionID. */ mfxU16 pci_domain; /*!< PCI bus domain. Same as mfxExtendedDeviceId::PCIDomain. */ mfxU8 pci_bus; /*!< The number of the bus that the physical device is located on. Same as mfxExtendedDeviceId::PCIBus. */ mfxU8 pci_dev; /*!< The index of the physical device on the bus. Same as mfxExtendedDeviceId::PCIDevice. */ mfxU8 pci_func; /*!< The function number of the device on the physical device. Same as mfxExtendedDeviceId::PCIFunction. */ mfxU8 reserved[4]; /*!< Reserved for future use. */ mfxU8 sub_device_id; /*!< SubDevice ID.*/ } extDeviceUUID; MFX_PACK_END() #endif /* The mfxImplCapsDeliveryFormat enumerator specifies delivery format of the implementation capability. */ typedef enum { MFX_IMPLCAPS_IMPLDESCSTRUCTURE = 1, /*!< Deliver capabilities as mfxImplDescription structure. */ MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS = 2, /*!< Deliver capabilities as mfxImplementedFunctions structure. */ MFX_IMPLCAPS_IMPLPATH = 3, /*!< Deliver pointer to the null-terminated string with the path to the implementation. String is delivered in a form of buffer of mfxChar type. */ #ifdef ONEVPL_EXPERIMENTAL MFX_IMPLCAPS_DEVICE_ID_EXTENDED = 4 /*!< Deliver extended device ID information as mfxExtendedDeviceId structure.*/ #endif } mfxImplCapsDeliveryFormat; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies initialization parameters for API version starting from 2.0. */ typedef struct { mfxAccelerationMode AccelerationMode; /*!< Hardware acceleration stack to use. OS dependent parameter. Use VA for Linux*, DX* for Windows* or HDDL. */ #ifdef ONEVPL_EXPERIMENTAL mfxU16 DeviceCopy; /*!< Enables or disables device's accelerated copying between device and host. See the GPUCopy enumerator for a list of valid values. This parameter is the equivalent of mfxInitParam::GPUCopy. */ mfxU16 reserved[2]; /*!< Reserved for future use. */ #else mfxU16 reserved[3]; /*!< Reserved for future use. */ #endif mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to this structure. */ mfxExtBuffer **ExtParam; /*!< Points to an array of pointers to the extra configuration structures; see the ExtendedBufferID enumerator for a list of extended configurations. */ mfxU32 VendorImplID; /*!< Vendor specific number with given implementation ID. Represents the same field from mfxImplDescription. */ mfxU32 reserved2[3]; /*!< Reserved for future use. */ } mfxInitializationParam; MFX_PACK_END() #ifdef __cplusplus } #endif /* __cplusplus */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxdefs.h000066400000000000000000000374141443134507600224570ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXDEFS_H__ #define __MFXDEFS_H__ #define MFX_VERSION_MAJOR 2 #define MFX_VERSION_MINOR 9 // MFX_VERSION - version of API that 'assumed' by build may be provided externally // if it omitted then latest stable API derived from Major.Minor is assumed #if !defined(MFX_VERSION) #define MFX_VERSION (MFX_VERSION_MAJOR * 1000 + MFX_VERSION_MINOR) #else #undef MFX_VERSION_MAJOR #define MFX_VERSION_MAJOR ((MFX_VERSION) / 1000) #undef MFX_VERSION_MINOR #define MFX_VERSION_MINOR ((MFX_VERSION) % 1000) #endif /*! The corresponding version of the Intel(r) Media SDK legacy API that is used as a basis for the current API. */ #define MFX_LEGACY_VERSION 1035 #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* In preprocessor syntax # symbol has stringize meaning, so to expand some macro to preprocessor pragma we need to use special compiler dependent construction */ #if defined(_MSC_VER) #define MFX_PRAGMA_IMPL(x) __pragma(x) #else #define MFX_PRAGMA_IMPL(x) _Pragma(#x) #endif #define MFX_PACK_BEGIN_X(x) MFX_PRAGMA_IMPL(pack(push, x)) #define MFX_PACK_END() MFX_PRAGMA_IMPL(pack(pop)) /* The general rule for alignment is following: - structures with pointers have 4/8 bytes alignment on 32/64 bit systems - structures with fields of type mfxU64/mfxF64 (unsigned long long / double) have alignment 8 bytes on 64 bit and 32 bit Windows, on Linux alignment is 4 bytes - all the rest structures are 4 bytes aligned - there are several exceptions: some structs which had 4-byte alignment were extended with pointer / long type fields; such structs have 4-byte alignment to keep binary compatibility with previously release API */ #define MFX_PACK_BEGIN_USUAL_STRUCT() MFX_PACK_BEGIN_X(4) /* 64-bit LP64 data model */ #if defined(_WIN64) || defined(__LP64__) #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(8) #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) /* 32-bit ILP32 data model Windows* (Intel(r) architecture) */ #elif defined(_WIN32) || defined(_M_IX86) && !defined(__linux__) #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) /* 32-bit ILP32 data model Linux* */ #elif defined(__ILP32__) || defined(__arm__) #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(4) #else #error Unknown packing #endif #ifdef _WIN32 #define MFX_CDECL __cdecl #define MFX_STDCALL __stdcall #else #define MFX_CDECL #define MFX_STDCALL #endif /* _WIN32 */ #define MFX_INFINITE 0xFFFFFFFF #ifndef MFX_DEPRECATED_OFF #if defined(__cplusplus) && __cplusplus >= 201402L #define MFX_DEPRECATED [[deprecated]] #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg [[deprecated]] #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #elif defined(__clang__) #define MFX_DEPRECATED __attribute__((deprecated)) #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #elif defined(__INTEL_COMPILER) #if (defined(_WIN32) || defined(_WIN64)) #define MFX_DEPRECATED __declspec(deprecated) #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) __pragma(deprecated(arg)) #elif defined(__linux__) #define MFX_DEPRECATED __attribute__((deprecated)) #if defined(__cplusplus) #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) #else #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg #endif #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #endif #elif defined(_MSC_VER) && _MSC_VER > 1200 // VS 6 doesn't support deprecation #define MFX_DEPRECATED __declspec(deprecated) #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) __pragma(deprecated(arg)) #elif defined(__GNUC__) #define MFX_DEPRECATED __attribute__((deprecated)) #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #else #define MFX_DEPRECATED #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #endif #else #define MFX_DEPRECATED #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) #endif typedef unsigned char mfxU8; /*!< Unsigned integer, 8 bit type. */ typedef char mfxI8; /*!< Signed integer, 8 bit type. */ typedef short mfxI16; /*!< Signed integer, 16 bit type. */ typedef unsigned short mfxU16; /*!< Unsigned integer, 16 bit type. */ typedef unsigned int mfxU32; /*!< Unsigned integer, 32 bit type. */ typedef int mfxI32; /*!< Signed integer, 32 bit type. */ #if defined( _WIN32 ) || defined ( _WIN64 ) typedef unsigned long mfxUL32; /*!< Unsigned integer, 32 bit type. */ typedef long mfxL32; /*!< Signed integer, 32 bit type. */ #else typedef unsigned int mfxUL32; /*!< Unsigned integer, 32 bit type. */ typedef int mfxL32; /*!< Signed integer, 32 bit type. */ #endif typedef float mfxF32; /*!< Single-precision floating point, 32 bit type. */ typedef double mfxF64; /*!< Double-precision floating point, 64 bit type. */ typedef unsigned long long mfxU64; /*!< Unsigned integer, 64 bit type. */ typedef long long mfxI64; /*!< Signed integer, 64 bit type. */ typedef void* mfxHDL; /*!< Handle type. */ typedef mfxHDL mfxMemId; /*!< Memory ID type. */ typedef void* mfxThreadTask; /*!< Thread task type. */ typedef char mfxChar; /*!< UTF-8 byte. */ #ifdef ONEVPL_EXPERIMENTAL typedef unsigned short mfxFP16; /*!< Half precision floating point, 16 bit type. */ #endif /* MFX structures version info */ MFX_PACK_BEGIN_USUAL_STRUCT() /*! Introduce the field Version for any structure. Assumed that any structure changes are backward binary compatible. mfxStructVersion starts from {1,0} for any new API structures. If mfxStructVersion is added to the existent legacy structure (replacing reserved fields) it starts from {1, 1}. */ typedef union { /*! Structure with Major and Minor fields. */ /*! @struct Anonymous */ struct { /*! @{ @name Major and Minor fields Anonymous structure with Major and Minor fields. Minor number is incremented when reserved fields are used. Major number is incremented when the size of structure is increased. */ mfxU8 Minor; /*!< Minor number of the correspondent structure. */ mfxU8 Major; /*!< Major number of the correspondent structure. */ /*! @} */ }; mfxU16 Version; /*!< Structure version number. */ } mfxStructVersion; MFX_PACK_END() #define MFX_STRUCT_VERSION(MAJOR, MINOR) (256*(MAJOR) + (MINOR)) #define MFX_VARIANT_VERSION MFX_STRUCT_VERSION(1, 0) /*! The mfxDataType enumerates data type for mfxDataType. */ typedef enum { MFX_DATA_TYPE_UNSET = 0, /*!< Undefined type. */ MFX_DATA_TYPE_U8, /*!< 8-bit unsigned integer. */ MFX_DATA_TYPE_I8, /*!< 8-bit signed integer. */ MFX_DATA_TYPE_U16, /*!< 16-bit unsigned integer. */ MFX_DATA_TYPE_I16, /*!< 16-bit signed integer. */ MFX_DATA_TYPE_U32, /*!< 32-bit unsigned integer. */ MFX_DATA_TYPE_I32, /*!< 32-bit signed integer. */ MFX_DATA_TYPE_U64, /*!< 64-bit unsigned integer. */ MFX_DATA_TYPE_I64, /*!< 64-bit signed integer. */ MFX_DATA_TYPE_F32, /*!< 32-bit single precision floating point. */ MFX_DATA_TYPE_F64, /*!< 64-bit double precision floating point. */ MFX_DATA_TYPE_PTR, /*!< Generic type pointer. */ #ifdef ONEVPL_EXPERIMENTAL MFX_DATA_TYPE_FP16, /*!< 16-bit half precision floating point. */ #endif }mfxDataType; /*! The mfxVariantType enumerator data types for mfxVariantType. */ typedef enum { MFX_VARIANT_TYPE_UNSET = MFX_DATA_TYPE_UNSET, /*!< Undefined type. */ MFX_VARIANT_TYPE_U8 = MFX_DATA_TYPE_U8, /*!< 8-bit unsigned integer. */ MFX_VARIANT_TYPE_I8 = MFX_DATA_TYPE_I8, /*!< 8-bit signed integer. */ MFX_VARIANT_TYPE_U16 = MFX_DATA_TYPE_U16, /*!< 16-bit unsigned integer. */ MFX_VARIANT_TYPE_I16 = MFX_DATA_TYPE_I16, /*!< 16-bit signed integer. */ MFX_VARIANT_TYPE_U32 = MFX_DATA_TYPE_U32, /*!< 32-bit unsigned integer. */ MFX_VARIANT_TYPE_I32 = MFX_DATA_TYPE_I32, /*!< 32-bit signed integer. */ MFX_VARIANT_TYPE_U64 = MFX_DATA_TYPE_U64, /*!< 64-bit unsigned integer. */ MFX_VARIANT_TYPE_I64 = MFX_DATA_TYPE_I64, /*!< 64-bit signed integer. */ MFX_VARIANT_TYPE_F32 = MFX_DATA_TYPE_F32, /*!< 32-bit single precision floating point. */ MFX_VARIANT_TYPE_F64 = MFX_DATA_TYPE_F64, /*!< 64-bit double precision floating point. */ MFX_VARIANT_TYPE_PTR = MFX_DATA_TYPE_PTR, /*!< Generic type pointer. */ #ifdef ONEVPL_EXPERIMENTAL MFX_VARIANT_TYPE_FP16 = MFX_DATA_TYPE_FP16, /*!< 16-bit half precision floating point. */ #endif } mfxVariantType; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The mfxVariantType enumerator data types for mfxVariant type. */ typedef struct { mfxStructVersion Version; /*!< Version of the structure. */ mfxVariantType Type; /*!< Value type. */ /*! Value data holder. */ union data { mfxU8 U8; /*!< mfxU8 data. */ mfxI8 I8; /*!< mfxI8 data. */ mfxU16 U16; /*!< mfxU16 data. */ mfxI16 I16; /*!< mfxI16 data. */ mfxU32 U32; /*!< mfxU32 data. */ mfxI32 I32; /*!< mfxI32 data. */ mfxU64 U64; /*!< mfxU64 data. */ mfxI64 I64; /*!< mfxI64 data. */ mfxF32 F32; /*!< mfxF32 data. */ mfxF64 F64; /*!< mfxF64 data. */ #ifdef ONEVPL_EXPERIMENTAL mfxFP16 FP16; /*!< mfxFP16 data. */ #endif mfxHDL Ptr; /*!< Pointer. When this points to a string the string must be null terminated. */ } Data; /*!< Value data member. */ } mfxVariant; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Represents a range of unsigned values. */ typedef struct { mfxU32 Min; /*!< Minimal value of the range. */ mfxU32 Max; /*!< Maximal value of the range. */ mfxU32 Step; /*!< Value increment. */ } mfxRange32U; MFX_PACK_END() /*! Represents a pair of numbers of type mfxI16. */ typedef struct { mfxI16 x; /*!< First number. */ mfxI16 y; /*!< Second number. */ } mfxI16Pair; /*! Represents pair of handles of type mfxHDL. */ typedef struct { mfxHDL first; /*!< First handle. */ mfxHDL second; /*!< Second handle. */ } mfxHDLPair; /*********************************************************************************\ Error message \*********************************************************************************/ /*! @enum mfxStatus Itemizes status codes returned by API functions. */ typedef enum { /* no error */ MFX_ERR_NONE = 0, /*!< No error. */ /* reserved for unexpected errors */ MFX_ERR_UNKNOWN = -1, /*!< Unknown error. */ /* error codes <0 */ MFX_ERR_NULL_PTR = -2, /*!< Null pointer. */ MFX_ERR_UNSUPPORTED = -3, /*!< Unsupported feature. */ MFX_ERR_MEMORY_ALLOC = -4, /*!< Failed to allocate memory. */ MFX_ERR_NOT_ENOUGH_BUFFER = -5, /*!< Insufficient buffer at input/output. */ MFX_ERR_INVALID_HANDLE = -6, /*!< Invalid handle. */ MFX_ERR_LOCK_MEMORY = -7, /*!< Failed to lock the memory block. */ MFX_ERR_NOT_INITIALIZED = -8, /*!< Member function called before initialization. */ MFX_ERR_NOT_FOUND = -9, /*!< The specified object is not found. */ MFX_ERR_MORE_DATA = -10, /*!< Expect more data at input. */ MFX_ERR_MORE_SURFACE = -11, /*!< Expect more surface at output. */ MFX_ERR_ABORTED = -12, /*!< Operation aborted. */ MFX_ERR_DEVICE_LOST = -13, /*!< Lose the hardware acceleration device. */ MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /*!< Incompatible video parameters. */ MFX_ERR_INVALID_VIDEO_PARAM = -15, /*!< Invalid video parameters. */ MFX_ERR_UNDEFINED_BEHAVIOR = -16, /*!< Undefined behavior. */ MFX_ERR_DEVICE_FAILED = -17, /*!< Device operation failure. */ MFX_ERR_MORE_BITSTREAM = -18, /*!< Expect more bitstream buffers at output. */ MFX_ERR_GPU_HANG = -21, /*!< Device operation failure caused by GPU hang. */ MFX_ERR_REALLOC_SURFACE = -22, /*!< Bigger output surface required. */ MFX_ERR_RESOURCE_MAPPED = -23, /*!< Write access is already acquired and user requested another write access, or read access with MFX_MEMORY_NO_WAIT flag. */ MFX_ERR_NOT_IMPLEMENTED = -24, /*!< Feature or function not implemented. */ /* warnings >0 */ MFX_WRN_IN_EXECUTION = 1, /*!< The previous asynchronous operation is in execution. */ MFX_WRN_DEVICE_BUSY = 2, /*!< The hardware acceleration device is busy. */ MFX_WRN_VIDEO_PARAM_CHANGED = 3, /*!< The video parameters are changed during decoding. */ MFX_WRN_PARTIAL_ACCELERATION = 4, /*!< Software acceleration is used. */ MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /*!< Incompatible video parameters. */ MFX_WRN_VALUE_NOT_CHANGED = 6, /*!< The value is saturated based on its valid range. */ MFX_WRN_OUT_OF_RANGE = 7, /*!< The value is out of valid range. */ MFX_WRN_FILTER_SKIPPED = 10, /*!< One of requested filters has been skipped. */ /* low-delay partial output */ MFX_ERR_NONE_PARTIAL_OUTPUT = 12, /*!< Frame is not ready, but bitstream contains partial output. */ MFX_WRN_ALLOC_TIMEOUT_EXPIRED = 13, /*!< Timeout expired for internal frame allocation. */ /* threading statuses */ MFX_TASK_DONE = MFX_ERR_NONE, /*!< Task has been completed. */ MFX_TASK_WORKING = 8, /*!< There is some more work to do. */ MFX_TASK_BUSY = 9, /*!< Task is waiting for resources. */ /* plug-in statuses */ MFX_ERR_MORE_DATA_SUBMIT_TASK = -10000, /*!< Return MFX_ERR_MORE_DATA but submit internal asynchronous task. */ } mfxStatus; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Represents Globally Unique Identifier (GUID) with memory layout compliant to RFC 4122. See https://www.rfc-editor.org/info/rfc4122 for details. */ typedef struct { mfxU8 Data[16]; /*!< Array to keep GUID. */ } mfxGUID; MFX_PACK_END() // Application #if defined(MFX_DISPATCHER_EXPOSED_PREFIX) #include "mfxdispatcherprefixedfunctions.h" #endif // MFX_DISPATCHER_EXPOSED_PREFIX #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __MFXDEFS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxdispatcher.h000066400000000000000000000267501443134507600236650ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXDISPATCHER_H__ #define __MFXDISPATCHER_H__ #include "mfxdefs.h" #include "mfxcommon.h" #include "mfxsession.h" #ifdef __cplusplus extern "C" { #endif /*! Loader handle. */ typedef struct _mfxLoader *mfxLoader; /*! Config handle. */ typedef struct _mfxConfig *mfxConfig; /*! @brief Creates the loader. @return Loader Loader handle or NULL if failed. @since This function is available since API version 2.0. */ mfxLoader MFX_CDECL MFXLoad(void); /*! @brief Destroys the dispatcher. @param[in] loader Loader handle. @since This function is available since API version 2.0. */ void MFX_CDECL MFXUnload(mfxLoader loader); /*! @brief Creates dispatcher configuration. @details Creates the dispatcher internal configuration, which is used to filter out available implementations. This configuration is used to walk through selected implementations to gather more details and select the appropriate implementation to load. The loader object remembers all created mfxConfig objects and destroys them during the mfxUnload function call. Multiple configurations per single mfxLoader object are possible. Usage example: @code mfxLoader loader = MFXLoad(); mfxConfig cfg = MFXCreateConfig(loader); MFXCreateSession(loader,0,&session); @endcode @param[in] loader Loader handle. @return Config handle or NULL pointer is failed. @since This function is available since API version 2.0. */ mfxConfig MFX_CDECL MFXCreateConfig(mfxLoader loader); /*! @brief Adds additional filter properties (any fields of the mfxImplDescription structure) to the configuration of the loader object. One mfxConfig properties can hold only single filter property. @note Each new call with the same parameter name will overwrite the previously set value. This may invalidate other properties. @note Each new call with another parameter name will delete the previous property and create a new property based on new name's value. @param[in] config Config handle. @param[in] name Name of the parameter (see mfxImplDescription structure and example). @param[in] value Value of the parameter. @return MFX_ERR_NONE The function completed successfully. MFX_ERR_NULL_PTR If config is NULL. \n MFX_ERR_NULL_PTR If name is NULL. \n MFX_ERR_NOT_FOUND If name contains unknown parameter name. MFX_ERR_UNSUPPORTED If value data type does not equal the parameter with provided name. @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXSetConfigFilterProperty(mfxConfig config, const mfxU8* name, mfxVariant value); /*! @brief Iterates over filtered out implementations to gather their details. This function allocates memory to store a structure or string corresponding to the type specified by format. For example, if format is set to MFX_IMPLCAPS_IMPLDESCSTRUCTURE, then idesc will return a pointer to a structure of type mfxImplDescription. Use the MFXDispReleaseImplDescription function to free memory allocated to this structure or string. @param[in] loader Loader handle. @param[in] i Index of the implementation. @param[in] format Format in which capabilities need to be delivered. See the mfxImplCapsDeliveryFormat enumerator for more details. @param[out] idesc Pointer to the structure or string corresponding to the requested format. @return MFX_ERR_NONE The function completed successfully. The idesc contains valid information.\n MFX_ERR_NULL_PTR If loader is NULL. \n MFX_ERR_NULL_PTR If idesc is NULL. \n MFX_ERR_NOT_FOUND Provided index is out of possible range. \n MFX_ERR_UNSUPPORTED If requested format is not supported. @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXEnumImplementations(mfxLoader loader, mfxU32 i, mfxImplCapsDeliveryFormat format, mfxHDL* idesc); /*! @brief Loads and initializes the implementation. @code mfxLoader loader = MFXLoad(); int i=0; while(1) { mfxImplDescription *idesc; MFXEnumImplementations(loader, i, MFX_IMPLCAPS_IMPLDESCSTRUCTURE, (mfxHDL*)&idesc); if(is_good(idesc)) { MFXCreateSession(loader, i,&session); // ... MFXDispReleaseImplDescription(loader, idesc); } else { MFXDispReleaseImplDescription(loader, idesc); break; } } @endcode @param[in] loader Loader handle. @param[in] i Index of the implementation. @param[out] session Pointer to the session handle. @return MFX_ERR_NONE The function completed successfully. The session contains a pointer to the session handle.\n MFX_ERR_NULL_PTR If loader is NULL. \n MFX_ERR_NULL_PTR If session is NULL. \n MFX_ERR_NOT_FOUND Provided index is out of possible range. @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXCreateSession(mfxLoader loader, mfxU32 i, mfxSession* session); /*! @brief Destroys handle allocated by the MFXEnumImplementations function. @param[in] loader Loader handle. @param[in] hdl Handle to destroy. Can be equal to NULL. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR If loader is NULL. \n MFX_ERR_INVALID_HANDLE Provided hdl handle is not associated with this loader. @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXDispReleaseImplDescription(mfxLoader loader, mfxHDL hdl); #ifdef ONEVPL_EXPERIMENTAL /*! @brief Macro help to return UUID in the common oneAPI format. @param[in] devinfo Handle to mfxExtendedDeviceId. @param[in] sub_device_id SubDevice number. Can be obtained from mfxDeviceDescription::SubDevices::Index. Set to zero if no SubDevices. @param[out] uuid Pointer to UUID. */ #define MFX_UUID_COMPUTE_DEVICE_ID(devinfo, sub_device_id, uuid) \ { \ extDeviceUUID t_uuid = { 0 }; \ extDeviceUUID* shared_uuid = (extDeviceUUID*)uuid; \ t_uuid.vendor_id = devinfo->VendorID; \ t_uuid.device_id = devinfo->DeviceID; \ t_uuid.revision_id = devinfo->RevisionID; \ t_uuid.pci_domain = devinfo->PCIDomain; \ t_uuid.pci_bus = (mfxU8)devinfo->PCIBus; \ t_uuid.pci_dev = (mfxU8)devinfo->PCIDevice; \ t_uuid.pci_func = (mfxU8)devinfo->PCIFunction; \ t_uuid.sub_device_id = (mfxU8)sub_device_id; \ *shared_uuid = t_uuid; \ } #endif /* Helper macro definitions to add config filter properties. */ /*! Adds single property of mfxU32 type. @param[in] loader Valid mfxLoader object @param[in] name Property name string @param[in] value Property value */ #define MFX_ADD_PROPERTY_U32(loader, name, value) \ { \ mfxVariant impl_value; \ mfxConfig cfg = MFXCreateConfig(loader); \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_U32; \ impl_value.Data.U32 = value; \ MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ } /*! Adds single property of mfxU16 type. @param[in] loader Valid mfxLoader object @param[in] name Property name string @param[in] value Property value */ #define MFX_ADD_PROPERTY_U16(loader, name, value) \ { \ mfxVariant impl_value = { 0 }; \ mfxConfig cfg = MFXCreateConfig(loader); \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_U16; \ impl_value.Data.U16 = value; \ MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ } /*! Adds single property of pointer type. @param[in] loader Valid mfxLoader object @param[in] name Property name string @param[in] value Property value */ #define MFX_ADD_PROPERTY_PTR(loader, name, value) \ { \ mfxVariant impl_value = { 0 }; \ mfxConfig cfg = MFXCreateConfig(loader); \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_PTR; \ impl_value.Data.Ptr = (mfxHDL)value; \ MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ } /*! Update existing property of mfxU32 type. @param[in] loader Valid mfxLoader object @param[in] config Valid mfxConfig object @param[in] name Property name string @param[in] value Property value */ #define MFX_UPDATE_PROPERTY_U32(loader, config, name, value) \ { \ mfxVariant impl_value; \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_U32; \ impl_value.Data.U32 = value; \ MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ } /*! Update existing property of mfxU16 type. @param[in] loader Valid mfxLoader object @param[in] config Valid mfxConfig object @param[in] name Property name string @param[in] value Property value */ #define MFX_UPDATE_PROPERTY_U16(loader, config, name, value) \ { \ mfxVariant impl_value; \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_U16; \ impl_value.Data.U16 = value; \ MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ } /*! Update existing property of pointer type. @param[in] loader Valid mfxLoader object @param[in] config Valid mfxConfig object @param[in] name Property name string @param[in] value Property value */ #define MFX_UPDATE_PROPERTY_PTR(loader, config, name, value) \ { \ mfxVariant impl_value; \ impl_value.Version.Version = MFX_VARIANT_VERSION; \ impl_value.Type = MFX_VARIANT_TYPE_PTR; \ impl_value.Data.Ptr = (mfxHDL)value; \ MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ } #ifdef __cplusplus } #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxdispatcherprefixedfunctions.h000066400000000000000000000164761443134507600273510ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ #define __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ // API 1.0 functions #define MFXInit disp_MFXInit #define MFXClose disp_MFXClose #define MFXQueryIMPL disp_MFXQueryIMPL #define MFXQueryVersion disp_MFXQueryVersion #define MFXJoinSession disp_MFXJoinSession #define MFXDisjoinSession disp_MFXDisjoinSession #define MFXCloneSession disp_MFXCloneSession #define MFXSetPriority disp_MFXSetPriority #define MFXGetPriority disp_MFXGetPriority #define MFXVideoCORE_SetFrameAllocator disp_MFXVideoCORE_SetFrameAllocator #define MFXVideoCORE_SetHandle disp_MFXVideoCORE_SetHandle #define MFXVideoCORE_GetHandle disp_MFXVideoCORE_GetHandle #define MFXVideoCORE_SyncOperation disp_MFXVideoCORE_SyncOperation #define MFXVideoENCODE_Query disp_MFXVideoENCODE_Query #define MFXVideoENCODE_QueryIOSurf disp_MFXVideoENCODE_QueryIOSurf #define MFXVideoENCODE_Init disp_MFXVideoENCODE_Init #define MFXVideoENCODE_Reset disp_MFXVideoENCODE_Reset #define MFXVideoENCODE_Close disp_MFXVideoENCODE_Close #define MFXVideoENCODE_GetVideoParam disp_MFXVideoENCODE_GetVideoParam #define MFXVideoENCODE_GetEncodeStat disp_MFXVideoENCODE_GetEncodeStat #define MFXVideoENCODE_EncodeFrameAsync disp_MFXVideoENCODE_EncodeFrameAsync #define MFXVideoDECODE_Query disp_MFXVideoDECODE_Query #define MFXVideoDECODE_DecodeHeader disp_MFXVideoDECODE_DecodeHeader #define MFXVideoDECODE_QueryIOSurf disp_MFXVideoDECODE_QueryIOSurf #define MFXVideoDECODE_Init disp_MFXVideoDECODE_Init #define MFXVideoDECODE_Reset disp_MFXVideoDECODE_Reset #define MFXVideoDECODE_Close disp_MFXVideoDECODE_Close #define MFXVideoDECODE_GetVideoParam disp_MFXVideoDECODE_GetVideoParam #define MFXVideoDECODE_GetDecodeStat disp_MFXVideoDECODE_GetDecodeStat #define MFXVideoDECODE_SetSkipMode disp_MFXVideoDECODE_SetSkipMode #define MFXVideoDECODE_GetPayload disp_MFXVideoDECODE_GetPayload #define MFXVideoDECODE_DecodeFrameAsync disp_MFXVideoDECODE_DecodeFrameAsync #define MFXVideoVPP_Query disp_MFXVideoVPP_Query #define MFXVideoVPP_QueryIOSurf disp_MFXVideoVPP_QueryIOSurf #define MFXVideoVPP_Init disp_MFXVideoVPP_Init #define MFXVideoVPP_Reset disp_MFXVideoVPP_Reset #define MFXVideoVPP_Close disp_MFXVideoVPP_Close #define MFXVideoVPP_GetVideoParam disp_MFXVideoVPP_GetVideoParam #define MFXVideoVPP_GetVPPStat disp_MFXVideoVPP_GetVPPStat #define MFXVideoVPP_RunFrameVPPAsync disp_MFXVideoVPP_RunFrameVPPAsync // API 1.1 functions #define MFXVideoUSER_Register disp_MFXVideoUSER_Register #define MFXVideoUSER_Unregister disp_MFXVideoUSER_Unregister #define MFXVideoUSER_ProcessFrameAsync disp_MFXVideoUSER_ProcessFrameAsync // API 1.10 functions #define MFXVideoENC_Query disp_MFXVideoENC_Query #define MFXVideoENC_QueryIOSurf disp_MFXVideoENC_QueryIOSurf #define MFXVideoENC_Init disp_MFXVideoENC_Init #define MFXVideoENC_Reset disp_MFXVideoENC_Reset #define MFXVideoENC_Close disp_MFXVideoENC_Close #define MFXVideoENC_ProcessFrameAsync disp_MFXVideoENC_ProcessFrameAsync #define MFXVideoVPP_RunFrameVPPAsyncEx disp_MFXVideoVPP_RunFrameVPPAsyncEx #define MFXVideoUSER_Load disp_MFXVideoUSER_Load #define MFXVideoUSER_UnLoad disp_MFXVideoUSER_UnLoad // API 1.11 functions #define MFXVideoPAK_Query disp_MFXVideoPAK_Query #define MFXVideoPAK_QueryIOSurf disp_MFXVideoPAK_QueryIOSurf #define MFXVideoPAK_Init disp_MFXVideoPAK_Init #define MFXVideoPAK_Reset disp_MFXVideoPAK_Reset #define MFXVideoPAK_Close disp_MFXVideoPAK_Close #define MFXVideoPAK_ProcessFrameAsync disp_MFXVideoPAK_ProcessFrameAsync // API 1.13 functions #define MFXVideoUSER_LoadByPath disp_MFXVideoUSER_LoadByPath // API 1.14 functions #define MFXInitEx disp_MFXInitEx // Audio library functions // API 1.8 functions #define MFXAudioCORE_SyncOperation disp_MFXAudioCORE_SyncOperation #define MFXAudioENCODE_Query disp_MFXAudioENCODE_Query #define MFXAudioENCODE_QueryIOSize disp_MFXAudioENCODE_QueryIOSize #define MFXAudioENCODE_Init disp_MFXAudioENCODE_Init #define MFXAudioENCODE_Reset disp_MFXAudioENCODE_Reset #define MFXAudioENCODE_Close disp_MFXAudioENCODE_Close #define MFXAudioENCODE_GetAudioParam disp_MFXAudioENCODE_GetAudioParam #define MFXAudioENCODE_EncodeFrameAsync disp_MFXAudioENCODE_EncodeFrameAsync #define MFXAudioDECODE_Query disp_MFXAudioDECODE_Query #define MFXAudioDECODE_DecodeHeader disp_MFXAudioDECODE_DecodeHeader #define MFXAudioDECODE_Init disp_MFXAudioDECODE_Init #define MFXAudioDECODE_Reset disp_MFXAudioDECODE_Reset #define MFXAudioDECODE_Close disp_MFXAudioDECODE_Close #define MFXAudioDECODE_QueryIOSize disp_MFXAudioDECODE_QueryIOSize #define MFXAudioDECODE_GetAudioParam disp_MFXAudioDECODE_GetAudioParam #define MFXAudioDECODE_DecodeFrameAsync disp_MFXAudioDECODE_DecodeFrameAsync // API 1.9 functions #define MFXAudioUSER_Register disp_MFXAudioUSER_Register #define MFXAudioUSER_Unregister disp_MFXAudioUSER_Unregister #define MFXAudioUSER_ProcessFrameAsync disp_MFXAudioUSER_ProcessFrameAsync #define MFXAudioUSER_Load disp_MFXAudioUSER_Load #define MFXAudioUSER_UnLoad disp_MFXAudioUSER_UnLoad // API 1.19 functions #define MFXVideoENC_GetVideoParam disp_MFXVideoENC_GetVideoParam #define MFXVideoPAK_GetVideoParam disp_MFXVideoPAK_GetVideoParam #define MFXVideoCORE_QueryPlatform disp_MFXVideoCORE_QueryPlatform #define MFXVideoUSER_GetPlugin disp_MFXVideoUSER_GetPlugin // API 2.0 functions #define MFXMemory_GetSurfaceForVPP disp_MFXMemory_GetSurfaceForVPP #define MFXMemory_GetSurfaceForEncode disp_MFXMemory_GetSurfaceForEncode #define MFXMemory_GetSurfaceForDecode disp_MFXMemory_GetSurfaceForDecode #define MFXQueryImplsDescription disp_MFXQueryImplsDescription #define MFXReleaseImplDescription disp_MFXReleaseImplDescription #define MFXInitialize disp_MFXInitialize // API 2.1 functions #define MFXMemory_GetSurfaceForVPPOut disp_MFXMemory_GetSurfaceForVPPOut #define MFXVideoDECODE_VPP_Init disp_MFXVideoDECODE_VPP_Init #define MFXVideoDECODE_VPP_DecodeFrameAsync disp_MFXVideoDECODE_VPP_DecodeFrameAsync #define MFXVideoDECODE_VPP_Reset disp_MFXVideoDECODE_VPP_Reset #define MFXVideoDECODE_VPP_GetChannelParam disp_MFXVideoDECODE_VPP_GetChannelParam #define MFXVideoDECODE_VPP_Close disp_MFXVideoDECODE_VPP_Close #define MFXVideoVPP_ProcessFrameAsync disp_MFXVideoVPP_ProcessFrameAsync #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxencodestats.h000066400000000000000000000413751443134507600240530ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifdef ONEVPL_EXPERIMENTAL #ifndef __MFXENCODESTATS_H__ #define __MFXENCODESTATS_H__ #include "mfxcommon.h" #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*!< The enum to specify memory layout for statistics. */ typedef enum { MFX_ENCODESTATS_MEMORY_LAYOUT_DEFAULT = 0, /*!< The default memory layout for statistics. */ } mfxEncodeBlkStatsMemLayout; /*!< The enum to specify mode to gather statistics. */ typedef enum { MFX_ENCODESTATS_MODE_DEFAULT = 0, /*!< Encode mode is selected by the implementation. */ MFX_ENCODESTATS_MODE_ENCODE = 1, /*!< Full encode mode. */ } mfxEncodeStatsMode; /*!< Flags to specify what statistics will be reported by the implementation. */ enum { MFX_ENCODESTATS_LEVEL_BLK = 0x1, /*!< Block level statistics. */ MFX_ENCODESTATS_LEVEL_SLICE = 0x2, /*!< Slice level statistics. */ MFX_ENCODESTATS_LEVEL_TILE = 0x4, /*!< Tile level statistics. */ MFX_ENCODESTATS_LEVEL_FRAME = 0x8, /*!< Frame level statistics. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*!< Specifies H.265 CTU header. */ typedef struct { union { struct { mfxU32 CUcountminus1 : 6; /*!< Number of CU per CTU. */ mfxU32 MaxDepth : 2; /*!< Max quad-tree depth of CU in CTU. */ mfxU32 reserved : 24; } bitfields0; mfxU32 dword0; }; mfxU16 CurrXAddr; /*!< Horizontal address of CTU. */ mfxU16 CurrYAddr; /*!< Vertical address of CTU. */ mfxU32 reserved1; } mfxCTUHeader; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*!< Specifies H.265 CU info. */ typedef struct { union { struct { mfxU32 CU_Size : 2; /*!< indicates the CU size of the current CU. 0: 8x8 1: 16x16 2: 32x32 3: 64x64 */ mfxU32 CU_pred_mode : 1; /*!< indicates the prediction mode for the current CU. 0: intra 1: inter */ /*! indicates the PU partition mode for the current CU. 0: 2Nx2N 1: 2NxN (inter) 2: Nx2N (inter) 3: NXN (intra only, CU Size=8x8 only. Luma Intra Mode indicates the intra prediction mode for 4x4_0. The additional prediction modes are overloaded on 4x4_1, 4x4_2, 4x4_3 below) 4: 2NxnT (inter only) 5: 2NxnB (inter only) 6: nLx2N (inter only) 7: nRx2N (inter only). */ mfxU32 CU_part_mode : 3; mfxU32 InterPred_IDC_MV0 : 2; /*!< indicates the prediction direction for PU0 of the current CU. 0: L0 1: L1 2: Bi 3: reserved */ mfxU32 InterPred_IDC_MV1 : 2; /*!< indicates the prediction direction for PU1 of the current CU. 0: L0 1: L1 2: Bi 3: reserved */ /*! Final explicit Luma Intra Mode 4x4_0 for NxN. Valid values 0..34 Note: CU_part_mode==NxN. */ mfxU32 LumaIntraMode : 6; /*! indicates the final explicit Luma Intra Mode for the CU. 0: DM (use Luma mode, from block 0 if NxN) 1: reserved 2: Planar 3: Vertical 4: Horizontal 5: DC */ mfxU32 ChromaIntraMode : 3; mfxU32 reserved : 13; } bitfields0; mfxU32 dword0; }; union { struct { /*! Final explicit Luma Intra Mode 4x4_1. Valid values 0..34 Note: CU_part_mode==NxN. */ mfxU32 LumaIntraMode4x4_1 : 6; /*! Final explicit Luma Intra Mode 4x4_2. Valid values 0..34 Note: CU_part_mode==NxN. */ mfxU32 LumaIntraMode4x4_2 : 6; /*! Final explicit Luma Intra Mode 4x4_3. Valid values 0..34 Note: CU_part_mode==NxN. */ mfxU32 LumaIntraMode4x4_3 : 6; mfxU32 reserved1 : 14; } bitfields1; mfxU32 dword1; }; mfxI8 QP; // signed QP value mfxU8 reserved2[3]; /*! distortion measure, approximation to SAD. Will deviate significantly (pre, post reconstruction) and due to variation in algorithm. */ mfxU32 SAD; /*! These parameters indicate motion vectors that are associated with the PU0/PU1 winners range [-2048.00..2047.75]. L0/PU0 - MV[0][0] L0/PU1 - MV[0][1] L1/PU0 - MV[1][0] L1/PU1 - MV[1][1] */ mfxI16Pair MV[2][2]; union { struct { /*! This parameter indicates the reference index associated with the MV X/Y that is populated in the L0_MV0.X and L0_MV0.Y fields. */ mfxU32 L0_MV0_RefID : 4; /*! This parameter indicates the reference index associated with the MV X/Y that is populated in the L0_MV1.X and L0_MV1.Y fields. */ mfxU32 L0_MV1_RefID : 4; /*! This parameter indicates the reference index associated with the MV X/Y that is populated in the L1_MV0.X and L1_MV0.Y fields. */ mfxU32 L1_MV0_RefID : 4; /*! This parameter indicates the reference index associated with the MV X/Y that is populated in the L1_MV1.X and L1_MV1.Y fields. */ mfxU32 L1_MV1_RefID : 4; mfxU32 reserved3 : 16; } bitfields8; mfxU32 dword8; }; mfxU32 reserved4[10]; /*< should be minimized! */ } mfxCUInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*!< Specifies H.265 CTU. */ typedef struct { mfxCTUHeader CtuHeader; /*!< H.265 CTU header. */ mfxCUInfo CuInfo[64]; /*!< Array of CU. */ mfxU32 reserved; } mfxCTUInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure describes H.264 stats per MB. */ typedef struct { union { struct { /*! Together with @p IntraMbFlag this parameter specifies macroblock type according to the ISO\*\/IEC\* 14496-10 with the following difference - it stores either intra or inter values according to @p IntraMbFlag, but not intra after inter. Values for P-slices are mapped to B-slice values. For example P_16x8 is coded with B_FWD_16x8 value. */ mfxU32 MBType : 5; /*! This field specifies inter macroblock mode and is ignored for intra MB. It is derived from @p MbType and has next values: @li 0 - 16x16 mode @li 1 - 16x8 mode @li 2 - 8x16 mode @li 3 - 8x8 mode */ mfxU32 InterMBMode : 2; /*! This field specifies intra macroblock mode and is ignored for inter MB. It is derived from @p MbType and has next values: @li 0 - 16x16 mode @li 1 - 8x8 mode @li 2 - 4x4 mode @li 3 - PCM */ mfxU32 IntraMBMode : 2; /*! This flag specifies intra/inter MB type and has next values: 0 - Inter prediction MB type 1 - Intra prediction MB type */ mfxU32 IntraMBFlag : 1; /*! This field specifies subblock shapes for the current MB. Each block is described by 2 bits starting from lower bits for block 0. @li 0 - 8x8 @li 1 - 8x4 @li 2 - 4x8 @li 3 - 4x4 */ mfxU32 SubMBShapes : 8; /*! This field specifies prediction modes for the current MB partition blocks. Each block is described by 2 bits starting from lower bits for block 0. @li 0 - Pred_L0 @li 1 - Pred_L1 @li 2 - BiPred @li 3 - reserved Only one prediction value for partition is reported, the rest values are set to zero. For example: @li 16x16 Pred_L1 - 0x01 (only 2 lower bits are used) @li 16x8 Pred_L1 / BiPred - 0x09 (1001b) @li 8x16 BiPred / BiPred - 0x0a (1010b) For P MBs this value is always zero. */ mfxU32 SubMBShapeMode : 8; /*! This value specifies chroma intra prediction mode. @li 0 - DC @li 1 - Horizontal @li 2 - Vertical @li 3 - Plane */ mfxU32 ChromaIntraPredMode : 2; mfxU32 reserved : 4; } bitfields0; mfxU32 dword0; } ; /*! Distortion measure, approximation to SAD. Deviate significantly (pre, post reconstruction) and due to variation in algorithm. */ mfxU32 SAD; mfxI8 Qp; /*!< MB QP. */ mfxU8 reserved1[3]; /*! These values specify luma intra prediction modes for current MB. Each element of the array corresponds to 8x8 block and each holds prediction modes for four 4x4 subblocks. Four bits per mode, lowest bits for left top subblock. All 16 prediction modes are always specified. For 8x8 case, block prediction mode is populated to all subblocks of the 8x8 block. For 16x16 case - to all subblocks of the MB. Prediction directions for 4x4 and 8x8 blocks: @li 0 - Vertical @li 1 - Horizontal @li 2 - DC @li 3 - Diagonal Down Left @li 4 - Diagonal Down Right @li 5 - Vertical Right @li 6 - Horizontal Down @li 7 - Vertical Left @li 8 - Horizontal Up Prediction directions for 16x16 blocks: @li 0 - Vertical @li 1 - Horizontal @li 2 - DC @li 3 - Plane */ mfxU16 LumaIntraMode[4]; mfxU32 reserved2; } mfxMBInfo; MFX_PACK_END() /*! The enum specifies block size. */ typedef enum { MFX_BLOCK_4X4 = 0, /*!< 4x4 block size. */ MFX_BLOCK_16X16 = 1, /*!< 16x16 block size. */ } mfxBlockSize; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure describes H.264 and H.265 stats per MB or CTUs. */ typedef struct { union { mfxU32 NumMB; /*!< Number of MBs per frame for H.264. */ mfxU32 NumCTU; /*!< number of CTUs per frame for H.265. */ }; union { mfxCTUInfo *HEVCCTUArray; /*!< Array of CTU statistics. */ mfxMBInfo *AVCMBArray; /*!< Array of MB statistics. */ }; mfxU32 reserved[8]; } mfxEncodeBlkStats; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! The structure describes H.264/H.265 frame/slice/tile level statistics. */ typedef struct { mfxF32 PSNRLuma; /*!< PSNR for LUMA samples. */ mfxF32 PSNRCb; /*!< PSNR for Chroma (Cb) samples. */ mfxF32 PSNRCr; /*!< PSNR for Chroma (Cr) samples. */ /*! distortion measure, approximation to SAD. Will deviate significantly (pre, post reconstruction) and due to variation in algorithm. */ mfxU64 SADLuma; mfxF32 Qp; /*< average frame QP, may have fractional part in case of MBQP. */ union { mfxU32 NumMB; /*!< Number of MBs per frame for H.264. */ mfxU32 NumCTU; /*!< number of CTUs per frame for H.265. */ }; mfxBlockSize BlockSize; /*! For H.264 it is always 16x16 corresponding to MB size. In H.265 it's normalized to 4x4, so for each CU we calculate number of 4x4 which belongs to the block. */ mfxU32 NumIntraBlock; /*! Number of intra blocks in the frame. The size of block is defined by BlockSize. For H.265 it can be more than number of intra CU. */ mfxU32 NumInterBlock; /*! Number of inter blocks in the frame. The size of block is defined by BlockSize. For H.265 it can be more than number of inter CU. */ mfxU32 NumSkippedBlock; /*! Number of skipped blocks in the frame. The size of block is defined by BlockSize. For H.265 it can be more than number of skipped CU. */ mfxU32 reserved[8]; } mfxEncodeHighLevelStats; MFX_PACK_END() /*! Alias for the structure to describe H.264 and H.265 frame level stats. */ typedef mfxEncodeHighLevelStats mfxEncodeFrameStats; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure describes H.264 and H.265 stats per Slice or Tile. */ typedef struct { mfxU32 NumElements; /*!< Number of Slices or Tiles per frame for H.264/H.265. */ mfxEncodeHighLevelStats *HighLevelStatsArray; /*!< Array of CTU statistics. */ mfxU32 reserved[8]; } mfxEncodeSliceStats; MFX_PACK_END() /*! Alias for the structure to describe H.264 and H.265 tile level stats. */ typedef mfxEncodeSliceStats mfxEncodeTileStats; #define MFX_ENCODESTATSCONTAINER_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure represents reference counted container for output after encoding operation which includes statistics and synchronization primitive for compressed bitstream. The memory is allocated and released by the library. */ typedef struct mfxEncodeStatsContainer { mfxStructVersion Version; /*!< The version of the structure. */ mfxRefInterface RefInterface; /*! < Reference counting interface. */ /*! @brief Guarantees readiness of the statistics after a function completes. Instead of MFXVideoCORE_SyncOperation which leads to the synchronization of all output objects, users may directly call the mfxEncodeStatsContainer::SynchronizeStatistics function to get output statistics. @param[in] ref_interface Valid interface. @param[out] wait Wait time in milliseconds. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface is NULL. \n MFX_ERR_INVALID_HANDLE If any of container is not valid object . \n MFX_WRN_IN_EXECUTION If the given timeout is expired and the container is not ready. \n MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *SynchronizeStatistics)(mfxRefInterface* ref_interface, mfxU32 wait); /*! @brief Guarantees readiness of associated compressed bitstream after a function completes. Instead of MFXVideoCORE_SyncOperation which leads to the synchronization of all output objects, users may directly call the mfxEncodeStatsContainer::SynchronizeStatistics function to get output bitstream. @param[in] ref_interface Valid interface. @param[out] wait Wait time in milliseconds. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface is NULL. \n MFX_ERR_INVALID_HANDLE If any of container is not valid object . \n MFX_WRN_IN_EXECUTION If the given timeout is expired and the container is not ready. \n MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *SynchronizeBitstream)(mfxRefInterface* ref_interface, mfxU32 wait); mfxHDL reserved[4]; mfxU32 reserved1[2]; mfxU32 DisplayOrder; /*< To which frame number statistics belong. */ mfxEncodeBlkStatsMemLayout MemLayout; /*< Memory layout for statistics. */ mfxEncodeBlkStats *EncodeBlkStats; /*< Block level statistics. */ mfxEncodeSliceStats *EncodeSliceStats; /*< Slice level statistics. */ mfxEncodeTileStats *EncodeTileStats; /*< Tile level statistics. */ mfxEncodeFrameStats *EncodeFrameStats; /*< Frame level statistics. */ mfxU32 reserved2[8]; }mfxEncodeStatsContainer; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The extension buffer which should be attached by application for mfxBitstream buffer before encode operation. As result the encoder will allocate memory for statistics and fill appropriate structures. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODESTATS_BLK. */ mfxU16 EncodeStatsFlags; /*! What statistics is required: block/slice/tile/frame level or any combinations. In case of slice or tile output statistics for one slice or tile will be available only.*/ mfxEncodeStatsMode Mode; /*!< What encoding mode should be used to gather statistics. */ mfxEncodeStatsContainer *EncodeStatsContainer; /*!< encode output, filled by the implementation. */ mfxU32 reserved[8]; } mfxExtEncodeStatsOutput; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxencodextensions.h000066400000000000000000000003461443134507600247400ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfximplcaps.h000066400000000000000000000030661443134507600233420ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #include "mfxdefs.h" #ifndef __MFXIMPLCAPS_H__ #define __MFXIMPLCAPS_H__ #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif /*! @brief Delivers implementation capabilities in the requested format according to the format value. @param[in] format Format in which capabilities must be delivered. See mfxImplCapsDeliveryFormat for more details. @param[out] num_impls Number of the implementations. @return Array of handles to the capability report or NULL in case of unsupported format or NULL num_impls pointer. Length of array is equal to num_impls. @since This function is available since API version 2.0. */ mfxHDL* MFX_CDECL MFXQueryImplsDescription(mfxImplCapsDeliveryFormat format, mfxU32* num_impls); /*! @brief Destroys the handle allocated by the MFXQueryImplsDescription function. Implementation must remember which handles are released. Once the last handle is released, this function must release memory allocated for the array of handles. @param[in] hdl Handle to destroy. Can be equal to NULL. @return MFX_ERR_NONE The function completed successfully. @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXReleaseImplDescription(mfxHDL hdl); #ifdef __cplusplus } // extern "C" #endif #endif // __MFXIMPLCAPS_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxjpeg.h000066400000000000000000000125761443134507600224650ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFX_JPEG_H__ #define __MFX_JPEG_H__ #include "mfxdefs.h" #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* CodecId */ enum { MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') /*!< JPEG codec */ }; /* CodecProfile, CodecLevel */ enum { MFX_PROFILE_JPEG_BASELINE = 1 /*!< Baseline JPEG profile. */ }; /*! The Rotation enumerator itemizes the JPEG rotation options. */ enum { MFX_ROTATION_0 = 0, /*!< No rotation. */ MFX_ROTATION_90 = 1, /*!< 90 degree rotation. */ MFX_ROTATION_180 = 2, /*!< 180 degree rotation. */ MFX_ROTATION_270 = 3 /*!< 270 degree rotation. */ }; enum { MFX_EXTBUFF_JPEG_QT = MFX_MAKEFOURCC('J','P','G','Q'), /*!< This extended buffer defines quantization tables for JPEG encoder. */ MFX_EXTBUFF_JPEG_HUFFMAN = MFX_MAKEFOURCC('J','P','G','H') /*!< This extended buffer defines Huffman tables for JPEG encoder. */ }; /*! The JPEGColorFormat enumerator itemizes the JPEG color format options. */ enum { MFX_JPEG_COLORFORMAT_UNKNOWN = 0, /*! Unknown color format. The decoder tries to determine color format from available in bitstream information. If such information is not present, then MFX_JPEG_COLORFORMAT_YCbCr color format is assumed. */ MFX_JPEG_COLORFORMAT_YCbCr = 1, /*! Bitstream contains Y, Cb and Cr components. */ MFX_JPEG_COLORFORMAT_RGB = 2 /*! Bitstream contains R, G and B components. */ }; /*! The JPEGScanType enumerator itemizes the JPEG scan types. */ enum { MFX_SCANTYPE_UNKNOWN = 0, /*!< Unknown scan type. */ MFX_SCANTYPE_INTERLEAVED = 1, /*!< Interleaved scan. */ MFX_SCANTYPE_NONINTERLEAVED = 2 /*!< Non-interleaved scan. */ }; enum { MFX_CHROMAFORMAT_JPEG_SAMPLING = 6 /*!< Color sampling specified via mfxInfoMFX::SamplingFactorH and SamplingFactorV. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies quantization tables. The application may specify up to 4 quantization tables. The encoder assigns an ID to each table. That ID is equal to the table index in the Qm array. Table "0" is used for encoding of the Y component, table "1" for the U component, and table "2" for the V component. The application may specify fewer tables than the number of components in the image. If two tables are specified, then table "1" is used for both U and V components. If only one table is specified then it is used for all components in the image. The following table illustrates this behavior. @internal +------------------+---------+------+---+ | Table ID | 0 | 1 | 2 | +------------------+---------+------+---+ | Number of tables | | | | +==================+=========+======+===+ | 0 | Y, U, V | | | +------------------+---------+------+---+ | 1 | Y | U, V | | +------------------+---------+------+---+ | 2 | Y | U | V | +------------------+---------+------+---+ @endinternal */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_JPEG_QT. */ mfxU16 reserved[7]; mfxU16 NumTable; /*!< Number of quantization tables defined in Qm array. */ mfxU16 Qm[4][64]; /*!< Quantization table values. */ } mfxExtJPEGQuantTables; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies Huffman tables. The application may specify up to 2 quantization table pairs for baseline process. The encoder assigns an ID to each table. That ID is equal to the table index in the DCTables and ACTables arrays. Table "0" is used for encoding of the Y component and table "1" is used for encoding of the U and V component. The application may specify only one table, in which case the table will be used for all components in the image. The following table illustrates this behavior. @internal +------------------+---------+------+ | Table ID | 0 | 1 | +------------------+---------+------+ | Number of tables | | | +==================+=========+======+ | 0 | Y, U, V | | +------------------+---------+------+ | 1 | Y | U, V | +------------------+---------+------+ @endinternal */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_JPEG_HUFFMAN. */ mfxU16 reserved[2]; mfxU16 NumDCTable; /*!< Number of DC quantization table in DCTables array. */ mfxU16 NumACTable; /*!< Number of AC quantization table in ACTables array. */ struct { mfxU8 Bits[16]; /*!< Number of codes for each code length. */ mfxU8 Values[12]; /*!< List of the 8-bit symbol values. */ } DCTables[4]; /*!< Array of DC tables. */ struct { mfxU8 Bits[16]; /*!< Number of codes for each code length. */ mfxU8 Values[162]; /*!< Array of AC tables. */ } ACTables[4]; /*!< List of the 8-bit symbol values. */ } mfxExtJPEGHuffmanTables; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif /* __cplusplus */ #endif // __MFX_JPEG_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxmvc.h000066400000000000000000000115451443134507600223200ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXMVC_H__ #define __MFXMVC_H__ #include "mfxdefs.h" #ifdef __cplusplus extern "C" { #endif /* CodecProfile, CodecLevel */ enum { /* MVC profiles */ MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, /*!< Multi-view high profile. */ MFX_PROFILE_AVC_STEREO_HIGH =128 /*!< Stereo high profile. */ }; /* Extended Buffer Ids */ enum { MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), /*!< This extended buffer describes the MVC stream information of view dependencies, view identifiers, and operation points. See the ITU*-T H.264 specification chapter H.7.3.2.1.4 for details. */ MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') /*!< This extended buffer defines target views at the decoder output.*/ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Describes MVC view dependencies. */ typedef struct { mfxU16 ViewId; /*!< View identifier of this dependency structure. */ mfxU16 NumAnchorRefsL0; /*!< Number of view components for inter-view prediction in the initial reference picture list RefPicList0 for anchor view components. */ mfxU16 NumAnchorRefsL1; /*!< Number of view components for inter-view prediction in the initial reference picture list RefPicList1 for anchor view components. */ mfxU16 AnchorRefL0[16]; /*!Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *AddRef)(mfxFrameSurface1* surface); /*! @brief Decrements the internal reference counter of the surface. mfxFrameSurfaceInterface::Release should be called after using the mfxFrameSurfaceInterface::AddRef function to add a surface or when allocation logic requires it. For example, call mfxFrameSurfaceInterface::Release to release a surface obtained with the GetSurfaceForXXX function. @param[in] surface Valid surface. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of surface is zero before call. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Release)(mfxFrameSurface1* surface); /*! @brief Returns current reference counter of mfxFrameSurface1 structure. @param[in] surface Valid surface. @param[out] counter Sets counter to the current reference counter value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface or counter is NULL. \n MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetRefCounter)(mfxFrameSurface1* surface, mfxU32* counter); /*! @brief Sets pointers of surface->Info.Data to actual pixel data, providing read-write access. In case of video memory, the surface with data in video memory becomes mapped to system memory. An application can map a surface for read access with any value of mfxFrameSurface1::Data::Locked, but can map a surface for write access only when mfxFrameSurface1::Data::Locked equals to 0. Note: A surface allows shared read access, but exclusive write access. Consider the following cases: @li Map with Write or Read|Write flags. A request during active another read or write access returns MFX_ERR_LOCK_MEMORY error immediately, without waiting. MFX_MAP_NOWAIT does not impact behavior. This type of request does not lead to any implicit synchronizations. @li Map with Read flag. A request during active write access will wait for resource to become free, or exits immediately with error if MFX_MAP_NOWAIT flag was set. This request may lead to the implicit synchronization (with same logic as Synchronize call) waiting for surface to become ready to use (all dependencies should be resolved and upstream components finished writing to this surface). It is guaranteed that read access will be acquired right after synchronization without allowing another thread to acquire this surface for writing. If MFX_MAP_NOWAIT was set and the surface is not ready yet (for example the surface has unresolved data dependencies or active processing), the read access request exits immediately with error. Read-write access with MFX_MAP_READ_WRITE provides exclusive simultaneous reading and writing access. @note Bitwise copying of mfxFrameSurface1 object between map / unmap calls may result in having dangling data pointers in copies. @param[in] surface Valid surface. @param[out] flags Specify mapping mode. @param[out] surface->Info.Data Pointers set to actual pixel data. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n MFX_ERR_UNSUPPORTED If flags are invalid. \n MFX_ERR_LOCK_MEMORY If user wants to map the surface for write and surface->Data.Locked does not equal to 0. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Map)(mfxFrameSurface1* surface, mfxU32 flags); /*! @brief Invalidates pointers of surface->Info.Data and sets them to NULL. In case of video memory, the underlying texture becomes unmapped after last reader or writer unmap. @param[in] surface Valid surface. @param[out] surface->Info.Data Pointers set to NULL. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n MFX_ERR_UNSUPPORTED If surface is already unmapped. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Unmap)(mfxFrameSurface1* surface); /*! @brief Returns a native resource's handle and type. The handle is returned *as-is*, meaning that the reference counter of base resources is not incremented. The native resource is not detached from surface and the library still owns the resource. User must not destroy the native resource or assume that the resource will be alive after mfxFrameSurfaceInterface::Release. @param[in] surface Valid surface. @param[out] resource Pointer is set to the native handle of the resource. @param[out] resource_type Type of native resource. See mfxResourceType enumeration). @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If any of surface, resource or resource_type is NULL. \n MFX_ERR_INVALID_HANDLE If any of surface, resource or resource_type is not valid object (no native resource was allocated). \n MFX_ERR_UNSUPPORTED If surface is in system memory. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetNativeHandle)(mfxFrameSurface1* surface, mfxHDL* resource, mfxResourceType* resource_type); /*! @brief Returns a device abstraction that was used to create that resource. The handle is returned *as-is*, meaning that the reference counter for the device abstraction is not incremented. The native resource is not detached from the surface and the library still has a reference to the resource. User must not destroy the device or assume that the device will be alive after mfxFrameSurfaceInterface::Release. @param[in] surface Valid surface. @param[out] device_handle Pointer is set to the device which created the resource @param[out] device_type Type of device (see mfxHandleType enumeration). @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If any of surface, device_handle or device_type is NULL. \n MFX_ERR_INVALID_HANDLE If any of surface, resource or resource_type is not valid object (no native resource was allocated). \n MFX_ERR_UNSUPPORTED If surface is in system memory. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetDeviceHandle)(mfxFrameSurface1* surface, mfxHDL* device_handle, mfxHandleType* device_type); /*! @brief Guarantees readiness of both the data (pixels) and any frame's meta information (for example corruption flags) after a function completes. Instead of MFXVideoCORE_SyncOperation, users may directly call the mfxFrameSurfaceInterface::Synchronize function after the corresponding Decode or VPP function calls (MFXVideoDECODE_DecodeFrameAsync or MFXVideoVPP_RunFrameVPPAsync). The prerequisites to call the functions are: @li The main processing functions return MFX_ERR_NONE. @li A valid mfxFrameSurface1 object. @param[in] surface Valid surface. @param[out] wait Wait time in milliseconds. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If any of surface is not valid object . \n MFX_WRN_IN_EXECUTION If the given timeout is expired and the surface is not ready. \n MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Synchronize)(mfxFrameSurface1* surface, mfxU32 wait); /*! @brief The library calls the function after complete of associated video operation notifying the application that frame surface is ready. @attention This is callback function and intended to be called by the library only. @note The library calls this callback only when this surface is used as the output surface. It is expected that the function is low-intrusive designed otherwise it may impact performance. @param[in] sts The status of completed operation. */ void (MFX_CDECL *OnComplete)(mfxStatus sts); /*! @brief Returns an interface defined by the GUID. If the returned interface is a reference counted object the caller should release the obtained interface to avoid memory leaks. @param[in] surface Valid surface. @param[in] guid GUID of the requested interface. @param[out] iface Interface. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If interface or surface is NULL. \n MFX_ERR_UNSUPPORTED If requested interface is not supported. \n MFX_ERR_NOT_IMPLEMENTED If requested interface is not implemented. \n MFX_ERR_NOT_INITIALIZED If requested interface is not available (not created or already deleted). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *QueryInterface)(mfxFrameSurface1* surface, mfxGUID guid, mfxHDL* iface); mfxHDL reserved2[2]; } mfxFrameSurfaceInterface; MFX_PACK_END() /*! The TimeStampCalc enumerator itemizes time-stamp calculation methods. */ enum { /*! The time stamp calculation is based on the input frame rate if time stamp is not explicitly specified. */ MFX_TIMESTAMPCALC_UNKNOWN = 0, /*! Adjust time stamp to 29.97fps on 24fps progressively encoded sequences if telecine attributes are available in the bitstream and time stamp is not explicitly specified. The input frame rate must be specified. */ MFX_TIMESTAMPCALC_TELECINE = 1, }; /* Transcoding Info */ MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies configurations for decoding, encoding, and transcoding processes. A zero value in any of these fields indicates that the field is not explicitly specified. */ typedef struct { mfxU32 reserved[7]; /*!< Reserved for future use. */ /*! Hint to enable low power consumption mode for encoders. See the CodingOptionValue enumerator for values of this option. Use the Query API function to check if this feature is supported. */ mfxU16 LowPower; /*! Specifies a multiplier for bitrate control parameters. Affects the following variables: InitialDelayInKB, BufferSizeInKB, TargetKbps, MaxKbps. If this value is not equal to zero, the encoder calculates BRC parameters as ``value * BRCParamMultiplier``. */ mfxU16 BRCParamMultiplier; mfxFrameInfo FrameInfo; /*!< mfxFrameInfo structure that specifies frame parameters. */ mfxU32 CodecId; /*!< Specifies the codec format identifier in the FourCC code; see the CodecFormatFourCC enumerator for details. This is a mandated input parameter for the QueryIOSurf and Init API functions. */ mfxU16 CodecProfile; /*!< Specifies the codec profile; see the CodecProfile enumerator for details. Specify the codec profile explicitly or the API functions will determine the correct profile from other sources, such as resolution and bitrate. */ mfxU16 CodecLevel; /*!< Codec level; see the CodecLevel enumerator for details. Specify the codec level explicitly or the functions will determine the correct level from other sources, such as resolution and bitrate. */ mfxU16 NumThread; union { struct { /* Encoding Options */ mfxU16 TargetUsage; /*!< Target usage model that guides the encoding process; see the TargetUsage enumerator for details. */ /*! Number of pictures within the current GOP (Group of Pictures); if GopPicSize = 0, then the GOP size is unspecified. If GopPicSize = 1, only I-frames are used. The following pseudo-code that shows how the library uses this parameter: @code mfxU16 get_gop_sequence (...) { pos=display_frame_order; if (pos == 0) return MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_REF; If (GopPicSize == 1) // Only I-frames return MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; if (GopPicSize == 0) frameInGOP = pos; //Unlimited GOP else frameInGOP = pos%GopPicSize; if (frameInGOP == 0) return MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; if (GopRefDist == 1 || GopRefDist == 0) // Only I,P frames return MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; frameInPattern = (frameInGOP-1)%GopRefDist; if (frameInPattern == GopRefDist - 1) return MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; return MFX_FRAMETYPE_B; } @endcode */ mfxU16 GopPicSize; /*! Distance between I- or P (or GPB) - key frames; if it is zero, the GOP structure is unspecified. Note: If GopRefDist = 1, there are no regular B-frames used (only P or GPB); if mfxExtCodingOption3::GPB is ON, GPB frames (B without backward references) are used instead of P. */ mfxU16 GopRefDist; /*! ORs of the GopOptFlag enumerator indicate the additional flags for the GOP specification. */ mfxU16 GopOptFlag; /*! For H.264, specifies IDR-frame interval in terms of I-frames. For example: @li If IdrInterval = 0, then every I-frame is an IDR-frame. @li If IdrInterval = 1, then every other I-frame is an IDR-frame. For HEVC, if IdrInterval = 0, then only first I-frame is an IDR-frame. For example: @li If IdrInterval = 1, then every I-frame is an IDR-frame. @li If IdrInterval = 2, then every other I-frame is an IDR-frame. For MPEG2, IdrInterval defines sequence header interval in terms of I-frames. For example: @li If IdrInterval = 0 (default), then the sequence header is inserted once at the beginning of the stream. @li If IdrInterval = N, then the sequence header is inserted before every Nth I-frame. If GopPicSize or GopRefDist is zero, IdrInterval is undefined. */ mfxU16 IdrInterval; mfxU16 RateControlMethod; /*! Rate control method; see the RateControlMethod enumerator for details. */ union { /*! Initial size of the Video Buffering Verifier (VBV) buffer. @note In this context, KB is 1000 bytes and Kbps is 1000 bps. */ mfxU16 InitialDelayInKB; /*! Quantization Parameter (QP) for I-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPI might be clipped to supported QPI range. @note In the HEVC design, a further adjustment to QPs can occur based on bit depth. Adjusted QPI value = QPI - (6 * (BitDepthLuma - 8)) for BitDepthLuma in the range [8,14]. For HEVC_MAIN10, we minus (6*(10-8)=12) on our side and continue. @note Default QPI value is implementation dependent and subject to change without additional notice in this document. */ mfxU16 QPI; mfxU16 Accuracy; /*!< Specifies accuracy range in the unit of tenth of percent. */ }; mfxU16 BufferSizeInKB; /*!< Represents the maximum possible size of any compressed frames. */ union { /*! Constant bitrate TargetKbps. Used to estimate the targeted frame size by dividing the frame rate by the bitrate. */ mfxU16 TargetKbps; /*! Quantization Parameter (QP) for P-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPP might be clipped to supported QPI range. @note In the HEVC design, a further adjustment to QPs can occur based on bit depth. Adjusted QPP value = QPP - (6 * (BitDepthLuma - 8)) for BitDepthLuma in the range [8,14]. For HEVC_MAIN10, we minus (6*(10-8)=12) on our side and continue. @note Default QPP value is implementation dependent and subject to change without additional notice in this document. */ mfxU16 QPP; mfxU16 ICQQuality; /*!< Used by the Intelligent Constant Quality (ICQ) bitrate control algorithm. Values are in the 1 to 51 range, where 1 corresponds the best quality. */ }; union { /*! The maximum bitrate at which the encoded data enters the Video Buffering Verifier (VBV) buffer. */ mfxU16 MaxKbps; /*! Quantization Parameter (QP) for B-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPI might be clipped to supported QPB range. @note In the HEVC design, a further adjustment to QPs can occur based on bit depth. Adjusted QPB value = QPB - (6 * (BitDepthLuma - 8)) for BitDepthLuma in the range [8,14]. For HEVC_MAIN10, we minus (6*(10-8)=12) on our side and continue. @note Default QPB value is implementation dependent and subject to change without additional notice in this document. */ mfxU16 QPB; mfxU16 Convergence; /*!< Convergence period in the unit of 100 frames. */ }; /*! Number of slices in each video frame. Each slice contains one or more macro-block rows. If NumSlice equals zero, the encoder may choose any slice partitioning allowed by the codec standard. See also mfxExtCodingOption2::NumMbPerSlice. */ mfxU16 NumSlice; /*! Max number of all available reference frames (for AVC/HEVC, NumRefFrame defines DPB size). If NumRefFrame = 0, this parameter is not specified. See also NumRefActiveP, NumRefActiveBL0, and NumRefActiveBL1 in the mfxExtCodingOption3 structure, which set a number of active references. */ mfxU16 NumRefFrame; /*! If not zero, specifies that ENCODE takes the input surfaces in the encoded order and uses explicit frame type control. The application must still provide GopRefDist and mfxExtCodingOption2::BRefType so the library can pack headers and build reference lists correctly. */ mfxU16 EncodedOrder; }; struct { /* Decoding Options */ /*! For AVC and HEVC, used to instruct the decoder to return output frames in the decoded order. Must be zero for all other decoders. When enabled, correctness of mfxFrameData::TimeStamp and FrameOrder for output surface is not guaranteed, the application should ignore them. */ mfxU16 DecodedOrder; /*! Instructs DECODE to output extended picture structure values for additional display attributes. See the PicStruct description for details. */ mfxU16 ExtendedPicStruct; /*! Time stamp calculation method. See the TimeStampCalc description for details. */ mfxU16 TimeStampCalc; /*! Nonzero value indicates that slice groups are present in the bitstream. Used only by AVC decoder. */ mfxU16 SliceGroupsPresent; /*! Nonzero value specifies the maximum required size of the decoded picture buffer in frames for AVC and HEVC decoders. */ mfxU16 MaxDecFrameBuffering; /*! For decoders supporting dynamic resolution change (VP9), set this option to ON to allow MFXVideoDECODE_DecodeFrameAsync return MFX_ERR_REALLOC_SURFACE. See the CodingOptionValue enumerator for values of this option. Use the Query API function to check if this feature is supported. */ mfxU16 EnableReallocRequest; /*! Special parameter for AV1 decoder. Indicates presence/absence of film grain parameters in bitstream. Also controls decoding behavior for streams with film grain parameters. MFXVideoDECODE_DecodeHeader returns nonzero FilmGrain for streams with film grain parameters and zero for streams w/o them. Decoding with film grain requires additional output surfaces. If FilmGrain` is non-zero then MFXVideoDECODE_QueryIOSurf will request more surfaces in case of external allocated video memory at decoder output. FilmGrain is passed to MFXVideoDECODE_Init function to control decoding operation for AV1 streams with film grain parameters. If FilmGrain is nonzero decoding of each frame require two output surfaces (one for reconstructed frame and one for output frame with film grain applied). The decoder returns MFX_ERR_MORE_SURFACE from MFXVideoDECODE_DecodeFrameAsync if it has insufficient output surfaces to decode frame. Application can forcibly disable the feature passing zero value of `FilmGrain` to `MFXVideoDECODE_Init`. In this case the decoder will output reconstructed frames w/o film grain applied. Application can retrieve film grain parameters for a frame by attaching extended buffer mfxExtAV1FilmGrainParam to mfxFrameSurface1. If stream has no film grain parameters `FilmGrain` passed to `MFXVideoDECODE_Init` is ignored by the decoder. */ mfxU16 FilmGrain; /*! If not zero, it forces SDK to attempt to decode bitstream even if a decoder may not support all features associated with given CodecLevel. Decoder may produce visual artifacts. Only AVC decoder supports this field. */ mfxU16 IgnoreLevelConstrain; /*! This flag is used to disable output of main decoding channel. When it's ON SkipOutput = MFX_CODINGOPTION_ON decoder outputs only video processed channels. For pure decode this flag should be always disabled. */ mfxU16 SkipOutput; mfxU16 reserved2[4]; }; struct { /* JPEG Decoding Options */ /*! Specify the chroma sampling format that has been used to encode a JPEG picture. See the ChromaFormat enumerator for details. */ mfxU16 JPEGChromaFormat; /*! Rotation option of the output JPEG picture. See the Rotation enumerator for details. */ mfxU16 Rotation; /*! Specify the color format that has been used to encode a JPEG picture. See the JPEGColorFormat enumerator for details. */ mfxU16 JPEGColorFormat; /*! Specify JPEG scan type for decoder. See the JPEGScanType enumerator for details. */ mfxU16 InterleavedDec; mfxU8 SamplingFactorH[4]; /*!< Horizontal sampling factor. */ mfxU8 SamplingFactorV[4]; /*!< Vertical sampling factor. */ mfxU16 reserved3[5]; }; struct { /* JPEG Encoding Options */ /*! Specify interleaved or non-interleaved scans. If it is equal to MFX_SCANTYPE_INTERLEAVED then the image is encoded as interleaved, all components are encoded in one scan. See the JPEG Scan Type enumerator for details. */ mfxU16 Interleaved; /*! Specifies the image quality if the application does not specified quantization table. The value is from 1 to 100 inclusive. "100" is the best quality. */ mfxU16 Quality; /*! Specifies the number of MCU in the restart interval. "0" means no restart interval. */ mfxU16 RestartInterval; mfxU16 reserved5[10]; }; }; } mfxInfoMFX; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies configurations for video processing. A zero value in any of the fields indicates that the corresponding field is not explicitly specified. */ typedef struct { mfxU32 reserved[8]; mfxFrameInfo In; /*!< Input format for video processing. */ mfxFrameInfo Out; /*!< Output format for video processing. */ } mfxInfoVPP; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Configuration parameters for encoding, decoding, transcoding, and video processing. */ typedef struct { /*! Unique component ID that will be passed by the library to mfxFrameAllocRequest. Useful in pipelines where several components of the same type share the same allocator. */ mfxU32 AllocId; mfxU32 reserved[2]; mfxU16 reserved3; /*! Specifies how many asynchronous operations an application performs before the application explicitly synchronizes the result. If zero, the value is not specified. */ mfxU16 AsyncDepth; union { mfxInfoMFX mfx; /*!< Configurations related to encoding, decoding, and transcoding. See the definition of the mfxInfoMFX structure for details. */ mfxInfoVPP vpp; /*!< Configurations related to video processing. See the definition of the mfxInfoVPP structure for details. */ }; /*! Specifies the content protection mechanism. See the Protected enumerator for a list of supported protection schemes. */ mfxU16 Protected; /*! Input and output memory access types for functions. See the enumerator IOPattern for details. The Query API functions return the natively supported IOPattern if the Query input argument is NULL. This parameter is a mandated input for QueryIOSurf and Init API functions. The output pattern must be specified for DECODE. The input pattern must be specified for ENCODE. Both input and output pattern must be specified for VPP. */ mfxU16 IOPattern; mfxExtBuffer** ExtParam; /*!< The number of extra configuration structures attached to this structure. */ mfxU16 NumExtParam; /*!< Points to an array of pointers to the extra configuration structures. See the ExtendedBufferID enumerator for a list of extended configurations. The list of extended buffers should not contain duplicated entries, such as entries of the same type. If the mfxVideoParam structure is used to query library capability, then the list of extended buffers attached to the input and output mfxVideoParam structure should be equal, that is, it should contain the same number of extended buffers of the same type. */ mfxU16 reserved2; } mfxVideoParam; MFX_PACK_END() /*! The IOPattern enumerator itemizes memory access patterns for API functions. Use bit-ORed values to specify an input access pattern and an output access pattern. */ enum { MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, /*!< Input to functions is a video memory surface. */ MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, /*!< Input to functions is a linear buffer directly in system memory or in system memory through an external allocator. */ MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, /*!< Output to functions is a video memory surface. */ MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20 /*!< Output to functions is a linear buffer directly in system memory or in system memory through an external allocator. */ }; /*! The CodecFormatFourCC enumerator itemizes codecs in the FourCC format. */ enum { MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), /*!< AVC, H.264, or MPEG-4, part 10 codec. */ MFX_CODEC_HEVC =MFX_MAKEFOURCC('H','E','V','C'), /*!< HEVC codec. */ MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), /*!< MPEG-2 codec. */ MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' '), /*!< VC-1 codec. */ MFX_CODEC_CAPTURE =MFX_MAKEFOURCC('C','A','P','T'), /*!< */ MFX_CODEC_VP9 =MFX_MAKEFOURCC('V','P','9',' '), /*!< VP9 codec. */ MFX_CODEC_AV1 =MFX_MAKEFOURCC('A','V','1',' ') /*!< AV1 codec. */ }; /*! The CodecProfile enumerator itemizes codec profiles for all codecs. CodecLevel */ enum { MFX_PROFILE_UNKNOWN =0, /*!< Unspecified profile. */ MFX_LEVEL_UNKNOWN =0, /*!< Unspecified level. */ /*! @{ */ /* Combined with H.264 profile these flags impose additional constrains. See H.264 specification for the list of constrains. */ MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), /*! @} */ /*! @{ */ /* H.264 Profiles. */ MFX_PROFILE_AVC_BASELINE =66, MFX_PROFILE_AVC_MAIN =77, MFX_PROFILE_AVC_EXTENDED =88, MFX_PROFILE_AVC_HIGH =100, MFX_PROFILE_AVC_HIGH10 =110, MFX_PROFILE_AVC_HIGH_422 =122, MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + MFX_PROFILE_AVC_CONSTRAINT_SET5, MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, /*! @} */ /*! @{ */ /* H.264 level 1-1.3 */ MFX_LEVEL_AVC_1 =10, MFX_LEVEL_AVC_1b =9, MFX_LEVEL_AVC_11 =11, MFX_LEVEL_AVC_12 =12, MFX_LEVEL_AVC_13 =13, /*! @} */ /*! @{ */ /* H.264 level 2-2.2 */ MFX_LEVEL_AVC_2 =20, MFX_LEVEL_AVC_21 =21, MFX_LEVEL_AVC_22 =22, /*! @} */ /*! @{ */ /* H.264 level 3-3.2 */ MFX_LEVEL_AVC_3 =30, MFX_LEVEL_AVC_31 =31, MFX_LEVEL_AVC_32 =32, /*! @} */ /*! @{ */ /* H.264 level 4-4.2 */ MFX_LEVEL_AVC_4 =40, MFX_LEVEL_AVC_41 =41, MFX_LEVEL_AVC_42 =42, /*! @} */ /*! @{ */ /* H.264 level 5-5.2 */ MFX_LEVEL_AVC_5 =50, MFX_LEVEL_AVC_51 =51, MFX_LEVEL_AVC_52 =52, /*! @} */ /*! @{ */ /* H.264 level 6-6.2 */ MFX_LEVEL_AVC_6 =60, MFX_LEVEL_AVC_61 =61, MFX_LEVEL_AVC_62 =62, /*! @} */ /*! @{ */ /* MPEG2 Profiles. */ MFX_PROFILE_MPEG2_SIMPLE =0x50, MFX_PROFILE_MPEG2_MAIN =0x40, MFX_PROFILE_MPEG2_HIGH =0x10, /*! @} */ /*! @{ */ /* MPEG2 Levels. */ MFX_LEVEL_MPEG2_LOW =0xA, MFX_LEVEL_MPEG2_MAIN =0x8, MFX_LEVEL_MPEG2_HIGH =0x4, MFX_LEVEL_MPEG2_HIGH1440 =0x6, /*! @} */ /*! @{ */ /* VC-1 Profiles. */ MFX_PROFILE_VC1_SIMPLE =(0+1), MFX_PROFILE_VC1_MAIN =(4+1), MFX_PROFILE_VC1_ADVANCED =(12+1), /*! @} */ /*! @{ */ /* VC-1 Level Low (simple & main profiles) */ MFX_LEVEL_VC1_LOW =(0+1), MFX_LEVEL_VC1_MEDIAN =(2+1), MFX_LEVEL_VC1_HIGH =(4+1), /*! @} */ /*! @{ */ /* VC-1 advanced profile levels */ MFX_LEVEL_VC1_0 =(0x00+1), MFX_LEVEL_VC1_1 =(0x01+1), MFX_LEVEL_VC1_2 =(0x02+1), MFX_LEVEL_VC1_3 =(0x03+1), MFX_LEVEL_VC1_4 =(0x04+1), /*! @} */ /*! @{ */ /* HEVC profiles */ MFX_PROFILE_HEVC_MAIN =1, MFX_PROFILE_HEVC_MAIN10 =2, MFX_PROFILE_HEVC_MAINSP =3, MFX_PROFILE_HEVC_REXT =4, MFX_PROFILE_HEVC_SCC =9, /*! @} */ /*! @{ */ /* HEVC levels */ MFX_LEVEL_HEVC_1 = 10, MFX_LEVEL_HEVC_2 = 20, MFX_LEVEL_HEVC_21 = 21, MFX_LEVEL_HEVC_3 = 30, MFX_LEVEL_HEVC_31 = 31, MFX_LEVEL_HEVC_4 = 40, MFX_LEVEL_HEVC_41 = 41, MFX_LEVEL_HEVC_5 = 50, MFX_LEVEL_HEVC_51 = 51, MFX_LEVEL_HEVC_52 = 52, MFX_LEVEL_HEVC_6 = 60, MFX_LEVEL_HEVC_61 = 61, MFX_LEVEL_HEVC_62 = 62, /*! @} */ /*! @{ */ /* HEVC tiers */ MFX_TIER_HEVC_MAIN = 0, MFX_TIER_HEVC_HIGH = 0x100, /*! @} */ /*! @{ */ /* VP9 Profiles */ MFX_PROFILE_VP9_0 = 1, MFX_PROFILE_VP9_1 = 2, MFX_PROFILE_VP9_2 = 3, MFX_PROFILE_VP9_3 = 4, /*! @} */ /*! @{ */ /* AV1 Profiles */ MFX_PROFILE_AV1_MAIN = 1, MFX_PROFILE_AV1_HIGH = 2, MFX_PROFILE_AV1_PRO = 3, /*! @} */ /*! @{ */ /* AV1 Levels */ MFX_LEVEL_AV1_2 = 20, MFX_LEVEL_AV1_21 = 21, MFX_LEVEL_AV1_22 = 22, MFX_LEVEL_AV1_23 = 23, MFX_LEVEL_AV1_3 = 30, MFX_LEVEL_AV1_31 = 31, MFX_LEVEL_AV1_32 = 32, MFX_LEVEL_AV1_33 = 33, MFX_LEVEL_AV1_4 = 40, MFX_LEVEL_AV1_41 = 41, MFX_LEVEL_AV1_42 = 42, MFX_LEVEL_AV1_43 = 43, MFX_LEVEL_AV1_5 = 50, MFX_LEVEL_AV1_51 = 51, MFX_LEVEL_AV1_52 = 52, MFX_LEVEL_AV1_53 = 53, MFX_LEVEL_AV1_6 = 60, MFX_LEVEL_AV1_61 = 61, MFX_LEVEL_AV1_62 = 62, MFX_LEVEL_AV1_63 = 63, MFX_LEVEL_AV1_7 = 70, MFX_LEVEL_AV1_71 = 71, MFX_LEVEL_AV1_72 = 72, MFX_LEVEL_AV1_73 = 73, /*! @} */ }; /*! The GopOptFlag enumerator itemizes special properties in the GOP (Group of Pictures) sequence. */ enum { /*! The encoder generates closed GOP if this flag is set. Frames in this GOP do not use frames in previous GOP as reference. The encoder generates open GOP if this flag is not set. In this GOP frames prior to the first frame of GOP in display order may use frames from previous GOP as reference. Frames subsequent to the first frame of GOP in display order do not use frames from previous GOP as reference. The AVC encoder ignores this flag if IdrInterval in mfxInfoMFX structure is set to 0, i.e. if every GOP starts from IDR frame. In this case, GOP is encoded as closed. This flag does not affect long-term reference frames. */ MFX_GOP_CLOSED =1, /*! The encoder must strictly follow the given GOP structure as defined by parameter GopPicSize, GopRefDist etc in the mfxVideoParam structure. Otherwise, the encoder can adapt the GOP structure for better efficiency, whose range is constrained by parameter GopPicSize and GopRefDist etc. See also description of AdaptiveI and AdaptiveB fields in the mfxExtCodingOption2 structure. */ MFX_GOP_STRICT =2 }; /*! The TargetUsage enumerator itemizes a range of numbers from MFX_TARGETUSAGE_1, best quality, to MFX_TARGETUSAGE_7, best speed. It indicates trade-offs between quality and speed. The application can use any number in the range. The actual number of supported target usages depends on implementation. If specified target usage is not supported, the encoder will use the closest supported value. */ enum { MFX_TARGETUSAGE_1 =1, /*!< Best quality */ MFX_TARGETUSAGE_2 =2, MFX_TARGETUSAGE_3 =3, MFX_TARGETUSAGE_4 =4, /*!< Balanced quality and speed. */ MFX_TARGETUSAGE_5 =5, MFX_TARGETUSAGE_6 =6, MFX_TARGETUSAGE_7 =7, /*!< Best speed */ MFX_TARGETUSAGE_UNKNOWN =0, /*!< Unspecified target usage. */ MFX_TARGETUSAGE_BEST_QUALITY =MFX_TARGETUSAGE_1, /*!< Best quality. */ MFX_TARGETUSAGE_BALANCED =MFX_TARGETUSAGE_4, /*!< Balanced quality and speed. */ MFX_TARGETUSAGE_BEST_SPEED =MFX_TARGETUSAGE_7 /*!< Best speed. */ }; /*! The RateControlMethod enumerator itemizes bitrate control methods. */ enum { MFX_RATECONTROL_CBR =1, /*!< Use the constant bitrate control algorithm. */ MFX_RATECONTROL_VBR =2, /*!< Use the variable bitrate control algorithm. */ MFX_RATECONTROL_CQP =3, /*!< Use the constant quantization parameter algorithm. */ MFX_RATECONTROL_AVBR =4, /*!< Use the average variable bitrate control algorithm. */ MFX_RATECONTROL_RESERVED1 =5, MFX_RATECONTROL_RESERVED2 =6, MFX_RATECONTROL_RESERVED3 =100, MFX_RATECONTROL_RESERVED4 =7, /*! Use the VBR algorithm with look ahead. It is a special bitrate control mode in the AVC encoder that has been designed to improve encoding quality. It works by performing extensive analysis of several dozen frames before the actual encoding and as a side effect significantly increases encoding delay and memory consumption. The only available rate control parameter in this mode is mfxInfoMFX::TargetKbps. Two other parameters, MaxKbps and InitialDelayInKB, are ignored. To control LA depth the application can use mfxExtCodingOption2::LookAheadDepth parameter. This method is not HRD compliant. */ MFX_RATECONTROL_LA =8, /*! Use the Intelligent Constant Quality algorithm. This algorithm improves subjective video quality of encoded stream. Depending on content, it may or may not decrease objective video quality. Only one control parameter is used - quality factor, specified by mfxInfoMFX::ICQQuality. */ MFX_RATECONTROL_ICQ =9, /*! Use the Video Conferencing Mode algorithm. This algorithm is similar to the VBR and uses the same set of parameters mfxInfoMFX::InitialDelayInKB, TargetKbpsandMaxKbps. It is tuned for IPPP GOP pattern and streams with strong temporal correlation between frames. It produces better objective and subjective video quality in these conditions than other bitrate control algorithms. It does not support interlaced content, B-frames and produced stream is not HRD compliant. */ MFX_RATECONTROL_VCM =10, /*! Use Intelligent Constant Quality algorithm with look ahead. Quality factor is specified by mfxInfoMFX::ICQQuality. To control LA depth the application can use mfxExtCodingOption2::LookAheadDepth parameter. This method is not HRD compliant. */ MFX_RATECONTROL_LA_ICQ =11, /*! MFX_RATECONTROL_LA_EXT has been removed */ /*! Use HRD compliant look ahead rate control algorithm. */ MFX_RATECONTROL_LA_HRD =13, /*! Use the variable bitrate control algorithm with constant quality. This algorithm trying to achieve the target subjective quality with the minimum number of bits, while the bitrate constraint and HRD compliance are satisfied. It uses the same set of parameters as VBR and quality factor specified by mfxExtCodingOption3::QVBRQuality. */ MFX_RATECONTROL_QVBR =14, }; /*! The TrellisControl enumerator is used to control trellis quantization in AVC encoder. The application can turn it on or off for any combination of I-, P- and B-frames by combining different enumerator values. For example, MFX_TRELLIS_I | MFX_TRELLIS_B turns it on for I- and B-frames. @note Due to performance reason on some target usages trellis quantization is always turned off and this control is ignored by the encoder. */ enum { MFX_TRELLIS_UNKNOWN =0, /*!< Default value, it is up to the encoder to turn trellis quantization on or off. */ MFX_TRELLIS_OFF =0x01, /*!< Turn trellis quantization off for all frame types. */ MFX_TRELLIS_I =0x02, /*!< Turn trellis quantization on for I-frames. */ MFX_TRELLIS_P =0x04, /*!< Turn trellis quantization on for P-frames. */ MFX_TRELLIS_B =0x08 /*!< Turn trellis quantization on for B-frames. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies additional options for encoding. The application can attach this extended buffer to the mfxVideoParam structure to configure initialization. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION. */ mfxU16 reserved1; mfxU16 RateDistortionOpt; /*!< Set this flag if rate distortion optimization is needed. See the CodingOptionValue enumerator for values of this option. */ mfxU16 MECostType; /*!< Motion estimation cost type. This value is reserved and must be zero. */ mfxU16 MESearchType; /*!< Motion estimation search algorithm. This value is reserved and must be zero. */ mfxI16Pair MVSearchWindow; /*!< Rectangular size of the search window for motion estimation. This parameter is reserved and must be (0, 0). */ MFX_DEPRECATED mfxU16 EndOfSequence; /* Deprecated */ mfxU16 FramePicture; /*!< Set this flag to encode interlaced fields as interlaced frames. This flag does not affect progressive input frames. See the CodingOptionValue enumerator for values of this option. */ mfxU16 CAVLC; /*!< If set, CAVLC is used; if unset, CABAC is used for encoding. See the CodingOptionValue enumerator for values of this option. */ mfxU16 reserved2[2]; /*! Set this flag to insert the recovery point SEI message at the beginning of every intra refresh cycle. See the description of IntRefType in mfxExtCodingOption2 structure for details on how to enable and configure intra refresh. If intra refresh is not enabled then this flag is ignored. See the CodingOptionValue enumerator for values of this option. */ mfxU16 RecoveryPointSEI; /*! Set this flag to instruct the MVC encoder to output each view in separate bitstream buffer. See the CodingOptionValue enumerator for values of this option and the Multi-View Video Coding section for more details about usage of this flag. */ mfxU16 ViewOutput; /*! If this option is turned ON, then AVC encoder produces an HRD conformant bitstream. If it is turned OFF, then the AVC encoder may (but not necessarily) violate HRD conformance. That is, this option can force the encoder to produce an HRD conformant stream, but cannot force it to produce a non-conformant stream. See the CodingOptionValue enumerator for values of this option. */ mfxU16 NalHrdConformance; /*! If set, encoder puts all SEI messages in the singe NAL unit. It includes messages provided by application and created by encoder. It is a three-states option. See CodingOptionValue enumerator for values of this option. The three states are: @li UNKNOWN Put each SEI in its own NAL unit. @li ON Put all SEI messages in the same NAL unit. @li OFF The same as unknown. */ mfxU16 SingleSeiNalUnit; /*! If set and VBR rate control method is used, then VCL HRD parameters are written in bitstream with values identical to the values of the NAL HRD parameters. See the CodingOptionValue enumerator for values of this option. */ mfxU16 VuiVclHrdParameters; mfxU16 RefPicListReordering; /*!< Set this flag to activate reference picture list reordering. This value is reserved and must be zero. */ mfxU16 ResetRefList; /*!< Set this flag to reset the reference list to non-IDR I-frames of a GOP sequence. See the CodingOptionValue enumerator for values of this option. */ /*! Set this flag to write the reference picture marking repetition SEI message into the output bitstream. See the CodingOptionValue enumerator for values of this option. */ mfxU16 RefPicMarkRep; /*! Set this flag to instruct the AVC encoder to output bitstreams immediately after the encoder encodes a field, in the field-encoding mode. See the CodingOptionValue enumerator for values of this option. */ mfxU16 FieldOutput; mfxU16 IntraPredBlockSize; /*!< Minimum block size of intra-prediction. This value is reserved and must be zero. */ mfxU16 InterPredBlockSize; /*!< Minimum block size of inter-prediction. This value is reserved and must be zero. */ mfxU16 MVPrecision; /*!< Specify the motion estimation precision. This parameter is reserved and must be zero. */ mfxU16 MaxDecFrameBuffering; /*!< Specifies the maximum number of frames buffered in a DPB. A value of zero means unspecified. */ mfxU16 AUDelimiter; /*!< Set this flag to insert the Access Unit Delimiter NAL. See the CodingOptionValue enumerator for values of this option. */ MFX_DEPRECATED mfxU16 EndOfStream; /* Deprecated */ /*! Set this flag to insert the picture timing SEI with pic_struct syntax element. See sub-clauses D.1.2 and D.2.2 of the ISO/IEC 14496-10 specification for the definition of this syntax element. See the CodingOptionValue enumerator for values of this option. The default value is ON. */ mfxU16 PicTimingSEI; mfxU16 VuiNalHrdParameters; /*!< Set this flag to insert NAL HRD parameters in the VUI header. See the CodingOptionValue enumerator for values of this option. */ } mfxExtCodingOption; MFX_PACK_END() /*! The BRefControl enumerator is used to control usage of B-frames as reference in AVC encoder. */ enum { MFX_B_REF_UNKNOWN = 0, /*!< Default value, it is up to the encoder to use B-frames as reference. */ MFX_B_REF_OFF = 1, /*!< Do not use B-frames as reference. */ MFX_B_REF_PYRAMID = 2 /*!< Arrange B-frames in so-called "B pyramid" reference structure. */ }; /*! The LookAheadDownSampling enumerator is used to control down sampling in look ahead bitrate control mode in AVC encoder. */ enum { MFX_LOOKAHEAD_DS_UNKNOWN = 0, /*!< Default value, it is up to the encoder what down sampling value to use. */ MFX_LOOKAHEAD_DS_OFF = 1, /*!< Do not use down sampling, perform estimation on original size frames. This is the slowest setting that produces the best quality. */ MFX_LOOKAHEAD_DS_2x = 2, /*!< Down sample frames two times before estimation. */ MFX_LOOKAHEAD_DS_4x = 3 /*!< Down sample frames four times before estimation. This option may significantly degrade quality. */ }; /*! The BPSEIControl enumerator is used to control insertion of buffering period SEI in the encoded bitstream. */ enum { MFX_BPSEI_DEFAULT = 0x00, /*!< encoder decides when to insert BP SEI. */ MFX_BPSEI_IFRAME = 0x01 /*!< BP SEI should be inserted with every I-frame */ }; /*! The SkipFrame enumerator is used to define usage of mfxEncodeCtrl::SkipFrame parameter. */ enum { MFX_SKIPFRAME_NO_SKIP = 0, /*!< Frame skipping is disabled, mfxEncodeCtrl::SkipFrame is ignored. */ MFX_SKIPFRAME_INSERT_DUMMY = 1, /*!< Skipping is allowed, when mfxEncodeCtrl::SkipFrame is set encoder inserts into bitstream frame where all macroblocks are encoded as skipped. Only non-reference P- and B-frames can be skipped. If GopRefDist = 1 and mfxEncodeCtrl::SkipFrame is set for reference P-frame, it will be encoded as non-reference. */ MFX_SKIPFRAME_INSERT_NOTHING = 2, /*!< Similar to MFX_SKIPFRAME_INSERT_DUMMY, but when mfxEncodeCtrl::SkipFrame is set encoder inserts nothing into bitstream. */ MFX_SKIPFRAME_BRC_ONLY = 3, /*!< mfxEncodeCtrl::SkipFrame indicates number of missed frames before the current frame. Affects only BRC, current frame will be encoded as usual. */ }; /*! The IntraRefreshTypes enumerator itemizes types of intra refresh. */ enum { MFX_REFRESH_NO = 0, /*!< Encode without refresh. */ MFX_REFRESH_VERTICAL = 1, /*!< Vertical refresh, by column of MBs. */ MFX_REFRESH_HORIZONTAL = 2, /*!< Horizontal refresh, by rows of MBs. */ MFX_REFRESH_SLICE = 3 /*!< Horizontal refresh by slices without overlapping. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used with the mfxExtCodingOption structure to specify additional options for encoding. The application can attach this extended buffer to the mfxVideoParam structure to configure initialization and to the mfxEncodeCtrl during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION2. */ /*! Specifies intra refresh type. See the IntraRefreshTypes. The major goal of intra refresh is improvement of error resilience without significant impact on encoded bitstream size caused by I-frames. The encoder achieves this by encoding part of each frame in the refresh cycle using intra MBs. This parameter is valid during initialization and runtime. When used with temporal scalability, intra refresh applied only to base layer. MFX_REFRESH_NO No refresh. MFX_REFRESH_VERTICAL Vertical refresh, by column of MBs. MFX_REFRESH_HORIZONTAL Horizontal refresh, by rows of MBs. MFX_REFRESH_SLICE Horizontal refresh by slices without overlapping. MFX_REFRESH_SLICE Library ignores IntRefCycleSize (size of refresh cycle equals number slices). */ mfxU16 IntRefType; /*! Specifies number of pictures within refresh cycle starting from 2. 0 and 1 are invalid values. This parameter is valid only during initialization. */ mfxU16 IntRefCycleSize; /*! Specifies QP difference for inserted intra MBs. Signed values are in the -51 to 51 range. This parameter is valid during initialization and runtime. */ mfxI16 IntRefQPDelta; /*! Specify maximum encoded frame size in byte. This parameter is used in VBR based bitrate control modes and ignored in others. The encoder tries to keep frame size below specified limit but minor overshoots are possible to preserve visual quality. This parameter is valid during initialization and runtime. It is recommended to set MaxFrameSize to 5x-10x target frame size ((TargetKbps*1000)/(8* FrameRateExtN/FrameRateExtD)) for I-frames and 2x-4x target frame size for P- and B-frames. */ mfxU32 MaxFrameSize; /*! Specify maximum slice size in bytes. If this parameter is specified other controls over number of slices are ignored. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU32 MaxSliceSize; /*! Modifies bitrate to be in the range imposed by the encoder. The default value is ON, that is, bitrate is limited. Setting this flag to OFF may lead to violation of HRD conformance.Specifying bitrate below the encoder range might significantly affect quality. If set to ON, this option takes effect in non CQP modes: if TargetKbps is not in the range imposed by the encoder, it will be changed to be in the range. This parameter is valid only during initialization. Flag works with MFX_CODEC_AVC only, it is ignored with other codecs. See the CodingOptionValue enumerator for values of this option. @deprecated Deprecated in API version 2.9 */ MFX_DEPRECATED mfxU16 BitrateLimit; /* Deprecated */ /*! Setting this flag enables macroblock level bitrate control that generally improves subjective visual quality. Enabling this flag may have negative impact on performance and objective visual quality metric. See the CodingOptionValue enumerator for values of this option. The default value depends on target usage settings. */ mfxU16 MBBRC; /*! Set this option to ON to enable external BRC. See the CodingOptionValue enumerator for values of this option. Use the Query API function to check if this feature is supported. */ mfxU16 ExtBRC; /*! Specifies the depth of the look ahead rate control algorithm. The depth value is the number of frames that the encoder analyzes before encoding. Values are in the 10 to 100 range, inclusive. To instruct the encoder to use the default value the application should zero this field. */ mfxU16 LookAheadDepth; /*! Used to control trellis quantization in AVC encoder. See TrellisControl enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 Trellis; /*! Controls picture parameter set repetition in AVC encoder. Set this flag to ON to repeat PPS with each frame. See the CodingOptionValue enumerator for values of this option. The default value is ON. This parameter is valid only during initialization. */ mfxU16 RepeatPPS; /*! Controls usage of B-frames as reference. See BRefControl enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 BRefType; /*! Controls insertion of I-frames by the encoder. Set this flag to ON to allow changing of frame type from P and B to I. This option is ignored if GopOptFlag in mfxInfoMFX structure is equal to MFX_GOP_STRICT. See the CodingOptionValue enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 AdaptiveI; /*! Controls changing of frame type from B to P. Set this flag to ON enable changing of frame type from B to P. This option is ignored if GopOptFlag in mfxInfoMFX structure is equal to MFX_GOP_STRICT. See the CodingOptionValue enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 AdaptiveB; /*! Controls down sampling in look ahead bitrate control mode. See LookAheadDownSampling enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 LookAheadDS; /*! Specifies suggested slice size in number of macroblocks. The library can adjust this number based on platform capability. If this option is specified, that is, if it is not equal to zero, the library ignores mfxInfoMFX::NumSlice parameter. */ mfxU16 NumMbPerSlice; /*! Enables usage of mfxEncodeCtrl::SkipFrame parameter. See the SkipFrame enumerator for values of this option. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 SkipFrame; mfxU8 MinQPI; /*!< Minimum allowed QP value for I-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU8 MaxQPI; /*!< Maximum allowed QP value for I-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU8 MinQPP; /*!< Minimum allowed QP value for P-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU8 MaxQPP; /*!< Maximum allowed QP value for P-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU8 MinQPB; /*!< Minimum allowed QP value for B-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU8 MaxQPB; /*!< Maximum allowed QP value for B-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ /*! Sets fixed_frame_rate_flag in VUI. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 FixedFrameRate; /*! Disables deblocking. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 DisableDeblockingIdc; /*! Completely disables VUI in the output bitstream. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 DisableVUI; /*! Controls insertion of buffering period SEI in the encoded bitstream. It should be one of the following values: MFX_BPSEI_DEFAULT Encoder decides when to insert BP SEI, MFX_BPSEI_IFRAME BP SEI should be inserted with every I-frame. */ mfxU16 BufferingPeriodSEI; /*! Set this flag to ON to enable per-frame reporting of Mean Absolute Difference. This parameter is valid only during initialization. */ mfxU16 EnableMAD; /*! Set this flag to ON to use raw frames for reference instead of reconstructed frames. This parameter is valid during initialization and runtime (only if was turned ON during initialization). @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 UseRawRef; } mfxExtCodingOption2; MFX_PACK_END() /*! The WeightedPred enumerator itemizes weighted prediction modes. */ enum { MFX_WEIGHTED_PRED_UNKNOWN = 0, /*!< Allow encoder to decide. */ MFX_WEIGHTED_PRED_DEFAULT = 1, /*!< Use default weighted prediction. */ MFX_WEIGHTED_PRED_EXPLICIT = 2, /*!< Use explicit weighted prediction. */ MFX_WEIGHTED_PRED_IMPLICIT = 3 /*!< Use implicit weighted prediction (for B-frames only). */ }; /*! The ScenarioInfo enumerator itemizes scenarios for the encoding session. */ enum { MFX_SCENARIO_UNKNOWN = 0, MFX_SCENARIO_DISPLAY_REMOTING = 1, MFX_SCENARIO_VIDEO_CONFERENCE = 2, MFX_SCENARIO_ARCHIVE = 3, MFX_SCENARIO_LIVE_STREAMING = 4, MFX_SCENARIO_CAMERA_CAPTURE = 5, MFX_SCENARIO_VIDEO_SURVEILLANCE = 6, MFX_SCENARIO_GAME_STREAMING = 7, MFX_SCENARIO_REMOTE_GAMING = 8 }; /*! The ContentInfo enumerator itemizes content types for the encoding session. */ enum { MFX_CONTENT_UNKNOWN = 0, MFX_CONTENT_FULL_SCREEN_VIDEO = 1, MFX_CONTENT_NON_VIDEO_SCREEN = 2, #ifdef ONEVPL_EXPERIMENTAL MFX_CONTENT_NOISY_VIDEO = 3 #endif }; /*! The PRefType enumerator itemizes models of reference list construction and DPB management when GopRefDist=1. */ enum { MFX_P_REF_DEFAULT = 0, /*!< Allow encoder to decide. */ MFX_P_REF_SIMPLE = 1, /*!< Regular sliding window used for DPB removal process. */ MFX_P_REF_PYRAMID = 2 /*!< Let N be the max reference list's size. Encoder treats each N's frame as a 'strong' reference and the others as 'weak' references. The encoder uses a 'weak' reference only for prediction of the next frame and removes it from DPB immediately after use. 'Strong' references are removed from DPB by a sliding window. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used with mfxExtCodingOption and mfxExtCodingOption2 structures to specify additional options for encoding. The application can attach this extended buffer to the mfxVideoParam structure to configure initialization and to the mfxEncodeCtrl during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION3. */ mfxU16 NumSliceI; /*!< The number of slices for I-frames. @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ mfxU16 NumSliceP; /*!< The number of slices for P-frames. @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ mfxU16 NumSliceB; /*!< The number of slices for B-frames. @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ /*! When rate control method is MFX_RATECONTROL_VBR, MFX_RATECONTROL_LA, MFX_RATECONTROL_LA_HRD, or MFX_RATECONTROL_QVBR this parameter specifies the maximum bitrate averaged over a sliding window specified by WinBRCSize. For MFX_RATECONTROL_CBR this parameter is ignored and equals TargetKbps. */ mfxU16 WinBRCMaxAvgKbps; /*! When rate control method is MFX_RATECONTROL_CBR, MFX_RATECONTROL_VBR, MFX_RATECONTROL_LA, MFX_RATECONTROL_LA_HRD, or MFX_RATECONTROL_QVBR this parameter specifies sliding window size in frames. Set this parameter to zero to disable sliding window. */ mfxU16 WinBRCSize; /*! When rate control method is MFX_RATECONTROL_QVBR, this parameter specifies quality factor. Values are in the 1 to 51 range, where 1 corresponds to the best quality. */ mfxU16 QVBRQuality; /*! Set this flag to ON to enable per-macroblock QP control. Rate control method must be MFX_RATECONTROL_CQP. See the CodingOptionValue enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 EnableMBQP; /*! Distance between the beginnings of the intra-refresh cycles in frames. Zero means no distance between cycles. */ mfxU16 IntRefCycleDist; /*! Set this flag to ON to enable the ENC mode decision algorithm to bias to fewer B Direct/Skip types. Applies only to B-frames, all other frames will ignore this setting. See the CodingOptionValue enumerator for values of this option. */ mfxU16 DirectBiasAdjustment; /*! Enables global motion bias. See the CodingOptionValue enumerator for values of this option. */ mfxU16 GlobalMotionBiasAdjustment; /*! Values are: @li 0: Set MV cost to be 0. @li 1: Scale MV cost to be 1/2 of the default value. @li 2: Scale MV cost to be 1/4 of the default value. @li 3: Scale MV cost to be 1/8 of the default value. */ mfxU16 MVCostScalingFactor; /*! Set this flag to ON to enable usage of mfxExtMBDisableSkipMap. See the CodingOptionValue enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 MBDisableSkipMap; mfxU16 WeightedPred; /*!< Weighted prediction mode. See the WeightedPred enumerator for values of these options. */ mfxU16 WeightedBiPred; /*!< Weighted prediction mode. See the WeightedPred enumerator for values of these options. */ /*! Instructs encoder whether aspect ratio info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. */ mfxU16 AspectRatioInfoPresent; /*! Instructs encoder whether overscan info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. */ mfxU16 OverscanInfoPresent; /*! ON indicates that the cropped decoded pictures output are suitable for display using overscan. OFF indicates that the cropped decoded pictures output contain visually important information in the entire region out to the edges of the cropping rectangle of the picture. See the CodingOptionValue enumerator for values of this option. */ mfxU16 OverscanAppropriate; /*! Instructs encoder whether frame rate info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. */ mfxU16 TimingInfoPresent; /*! Instructs encoder whether bitstream restriction info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. */ mfxU16 BitstreamRestriction; /*! Corresponds to AVC syntax element low_delay_hrd_flag (VUI). See the CodingOptionValue enumerator for values of this option. */ mfxU16 LowDelayHrd; /*! When set to OFF, no sample outside the picture boundaries and no sample at a fractional sample position for which the sample value is derived using one or more samples outside the picture boundaries is used for inter prediction of any sample. When set to ON, one or more samples outside picture boundaries may be used in inter prediction. See the CodingOptionValue enumerator for values of this option. */ mfxU16 MotionVectorsOverPicBoundaries; mfxU16 reserved1[2]; mfxU16 ScenarioInfo; /*!< Provides a hint to encoder about the scenario for the encoding session. See the ScenarioInfo enumerator for values of this option. */ mfxU16 ContentInfo; /*!< Provides a hint to encoder about the content for the encoding session. See the ContentInfo enumerator for values of this option. */ mfxU16 PRefType; /*!< When GopRefDist=1, specifies the model of reference list construction and DPB management. See the PRefType enumerator for values of this option. */ /*! Instructs encoder whether internal fade detection algorithm should be used for calculation of weigh/offset values for pred_weight_table unless application provided mfxExtPredWeightTable for this frame. See the CodingOptionValue enumerator for values of this option. */ mfxU16 FadeDetection; mfxU16 reserved2[2]; /*! Set this flag to OFF to make HEVC encoder use regular P-frames instead of GPB. See the CodingOptionValue enumerator for values of this option. */ mfxU16 GPB; /*! Same as mfxExtCodingOption2::MaxFrameSize but affects only I-frames. MaxFrameSizeI must be set if MaxFrameSizeP is set. If MaxFrameSizeI is not specified or greater than spec limitation, spec limitation will be applied to the sizes of I-frames. */ mfxU32 MaxFrameSizeI; /*! Same as mfxExtCodingOption2::MaxFrameSize but affects only P/B-frames. If MaxFrameSizeP equals 0, the library sets MaxFrameSizeP equal to MaxFrameSizeI. If MaxFrameSizeP is not specified or greater than spec limitation, spec limitation will be applied to the sizes of P/B-frames. */ mfxU32 MaxFrameSizeP; mfxU32 reserved3[3]; /*! Enables QPOffset control. See the CodingOptionValue enumerator for values of this option. */ mfxU16 EnableQPOffset; /*! Specifies QP offset per pyramid layer when EnableQPOffset is set to ON and RateControlMethod is CQP. For B-pyramid, B-frame QP = QPB + QPOffset[layer]. For P-pyramid, P-frame QP = QPP + QPOffset[layer]. */ mfxI16 QPOffset[8]; /* FrameQP = QPX + QPOffset[pyramid_layer]; QPX = QPB for B-pyramid, QPP for P-pyramid */ mfxU16 NumRefActiveP[8]; /*!< Max number of active references for P-frames. Array index is pyramid layer. */ mfxU16 NumRefActiveBL0[8]; /*!< Max number of active references for B-frames in reference picture list 0. Array index is pyramid layer. */ mfxU16 NumRefActiveBL1[8]; /*!< Max number of active references for B-frames in reference picture list 1. Array index is pyramid layer. */ mfxU16 reserved6; /*! For HEVC if this option is turned ON, the transform_skip_enabled_flag will be set to 1 in PPS. OFF specifies that transform_skip_enabled_flag will be set to 0. */ mfxU16 TransformSkip; /*! Minus 1 specifies target encoding chroma format (see ChromaFormatIdc enumerator). May differ from the source format. TargetChromaFormatPlus1 = 0 specifies the default target chroma format which is equal to source (mfxVideoParam::mfx::FrameInfo::ChromaFormat + 1), except RGB4 source format. In case of RGB4 source format default target , chroma format is 4:2:0 (instead of 4:4:4) for the purpose of backward compatibility. */ mfxU16 TargetChromaFormatPlus1; /*! Target encoding bit-depth for luma samples. May differ from source bit-depth. 0 specifies a default target bit-depth that is equal to source (mfxVideoParam::mfx::FrameInfo::BitDepthLuma). */ mfxU16 TargetBitDepthLuma; /*! Target encoding bit-depth for chroma samples. May differ from source bit-depth. 0 specifies a default target bit-depth that is equal to source (mfxVideoParam::mfx::FrameInfo::BitDepthChroma). */ mfxU16 TargetBitDepthChroma; mfxU16 BRCPanicMode; /*!< Controls panic mode in AVC and MPEG2 encoders. */ /*! When rate control method is MFX_RATECONTROL_VBR, MFX_RATECONTROL_QVBR or MFX_RATECONTROL_VCM this parameter specifies frame size tolerance. Set this parameter to MFX_CODINGOPTION_ON to allow strictly obey average frame size set by MaxKbps, for example cases when MaxFrameSize == (MaxKbps*1000)/(8* FrameRateExtN/FrameRateExtD). Also MaxFrameSizeI and MaxFrameSizeP can be set separately. */ mfxU16 LowDelayBRC; /*! Set this flag to ON to enable usage of mfxExtMBForceIntra for AVC encoder. See the CodingOptionValue enumerator for values of this option. This parameter is valid only during initialization. */ mfxU16 EnableMBForceIntra; /*! If this flag is set to ON, BRC may decide a larger P- or B-frame size than what MaxFrameSizeP dictates when the scene change is detected. It may benefit the video quality. AdaptiveMaxFrameSize feature is not supported with LowPower ON or if the value of MaxFrameSizeP = 0. */ mfxU16 AdaptiveMaxFrameSize; /*! Controls AVC encoder attempts to predict from small partitions. Default value allows encoder to choose preferred mode. MFX_CODINGOPTION_ON forces encoder to favor quality and MFX_CODINGOPTION_OFF forces encoder to favor performance. */ mfxU16 RepartitionCheckEnable; mfxU16 reserved5[3]; mfxU16 EncodedUnitsInfo; /*!< Set this flag to ON to make encoded units info available in mfxExtEncodedUnitsInfo. */ /*! If this flag is set to ON, the HEVC encoder uses the NAL unit type provided by the application in the mfxEncodeCtrl::MfxNalUnitType field. This parameter is valid only during initialization. @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ mfxU16 EnableNalUnitType; union { MFX_DEPRECATED mfxU16 ExtBrcAdaptiveLTR; /* Deprecated */ /*! If this flag is set to ON, encoder will mark, modify, or remove LTR frames based on encoding parameters and content properties. Turn OFF to prevent Adaptive marking of Long Term Reference Frames. */ mfxU16 AdaptiveLTR; }; /*! If this flag is set to ON, encoder adaptively selects one of implementation-defined quantization matrices for each frame. Non-default quantization matrices aim to improve subjective visual quality under certain conditions. Their number and definitions are API implementation specific. If this flag is set to OFF, default quantization matrix is used for all frames. This parameter is valid only during initialization. */ mfxU16 AdaptiveCQM; /*! If this flag is set to ON, encoder adaptively selects list of reference frames to improve encoding quality. Enabling of the flag can increase computation complexity and introduce additional delay. If this flag is set to OFF, regular reference frames are used for encoding. */ mfxU16 AdaptiveRef; #ifdef ONEVPL_EXPERIMENTAL /*! The tri-state option specifies hint for the library to execute encoding tools processing on CPU. It may give better encoding quality, but leads to higher CPU utilization. The library can ignore MFX_CODINGOPTION_ON if processing on CPU is not supported. */ mfxU16 CPUEncToolsProcessing; mfxU16 reserved[160]; #else mfxU16 reserved[161]; #endif } mfxExtCodingOption3; MFX_PACK_END() /*! IntraPredBlockSize/InterPredBlockSize specifies the minimum block size of inter-prediction. */ enum { MFX_BLOCKSIZE_UNKNOWN = 0, /*!< Unspecified. */ MFX_BLOCKSIZE_MIN_16X16 = 1, /*!< 16x16 minimum block size. */ MFX_BLOCKSIZE_MIN_8X8 = 2, /*!< 8x8 minimum block size. May be 16x16 or 8x8. */ MFX_BLOCKSIZE_MIN_4X4 = 3 /*!< 4x4 minimum block size. May be 16x16, 8x8, or 4x4. */ }; /*! The MVPrecision enumerator specifies the motion estimation precision. */ enum { MFX_MVPRECISION_UNKNOWN = 0, MFX_MVPRECISION_INTEGER = (1 << 0), MFX_MVPRECISION_HALFPEL = (1 << 1), MFX_MVPRECISION_QUARTERPEL = (1 << 2) }; /*! The CodingOptionValue enumerator defines a three-state coding option setting. */ enum { MFX_CODINGOPTION_UNKNOWN =0, /*!< Unspecified. */ MFX_CODINGOPTION_ON =0x10, /*!< Coding option set. */ MFX_CODINGOPTION_OFF =0x20, /*!< Coding option not set. */ MFX_CODINGOPTION_ADAPTIVE =0x30 /*!< Reserved. */ }; /*! The BitstreamDataFlag enumerator uses bit-ORed values to itemize additional information about the bitstream buffer. */ enum { MFX_BITSTREAM_NO_FLAG = 0x0000, /*!< The bitstream doesn't contain any flags. */ /*! The bitstream buffer contains a complete frame or complementary field pair of data for the bitstream. For decoding, this means that the decoder can proceed with this buffer without waiting for the start of the next frame, which effectively reduces decoding latency. If this flag is set, but the bitstream buffer contains incomplete frame or pair of field, then decoder will produce corrupted output. */ MFX_BITSTREAM_COMPLETE_FRAME = 0x0001, /*! The bitstream buffer contains the end of the stream. For decoding, this means that the application does not have any additional bitstream data to send to decoder. */ MFX_BITSTREAM_EOS = 0x0002 }; /*! The ExtendedBufferID enumerator itemizes and defines identifiers (BufferId) for extended buffers or video processing algorithm identifiers. */ enum { /*! This extended buffer defines additional encoding controls. See the mfxExtCodingOption structure for details. The application can attach this buffer to the structure for encoding initialization. */ MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), /*! This extended buffer defines sequence header and picture header for encoders and decoders. See the mfxExtCodingOptionSPSPPS structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization, and for obtaining raw headers from the decoders and encoders. */ MFX_EXTBUFF_CODING_OPTION_SPSPPS = MFX_MAKEFOURCC('C','O','S','P'), /*! This extended buffer defines a list of VPP algorithms that applications should not use. See the mfxExtVPPDoNotUse structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. */ MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), /*! This extended buffer defines auxiliary information at the VPP output. See the mfxExtVppAuxData structure for details. The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding control. */ MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), /*! The extended buffer defines control parameters for the VPP denoise filter algorithm. See the mfxExtVPPDenoise2 structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. */ MFX_EXTBUFF_VPP_DENOISE2 = MFX_MAKEFOURCC('D','N','I','2'), MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_VPP_DENOISE) = MFX_MAKEFOURCC('D','N','I','S'), /*!< Deprecated in 2.2 API version.*/ MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), /*!< Reserved for future use. */ MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_VPP_SCENE_CHANGE) = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, /* Deprecated. */ /*! The extended buffer defines control parameters for the VPP ProcAmp filter algorithm. See the mfxExtVPPProcAmp structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization or to the mfxFrameData structure in the mfxFrameSurface1 structure of output surface for per-frame processing configuration. */ MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), /*! The extended buffer defines control parameters for the VPP detail filter algorithm. See the mfxExtVPPDetail structure for details. The application can attach this buffer to the structure for video processing initialization. */ MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), /*! This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization, and for retrieving such information from the decoders. If video signal info changes per frame, the application can attach this buffer to the mfxFrameData structure for video processing. */ MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), /*! This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this buffer to the mfxVideoParam structure for the input of video processing if the input video signal information changes in sequence base. */ MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN = MFX_MAKEFOURCC('V','S','I','I'), /*! This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this buffer to the mfxVideoParam structure for the output of video processing if the output video signal information changes in sequence base. */ MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT = MFX_MAKEFOURCC('V','S','I','O'), /*! This extended buffer defines a list of VPP algorithms that applications should use. See the mfxExtVPPDoUse structure for details. The application can attach this buffer to the structure for video processing initialization. */ MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), /*! This extended buffer defines additional encoding controls for reference list. See the mfxExtAVCRefListCtrl structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), /*! This extended buffer defines control parameters for the VPP frame rate conversion algorithm. See the mfxExtVPPFrameRateConversion structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. */ MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), /*! This extended buffer configures the H.264 picture timing SEI message. See the mfxExtPictureTimingSEI structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization, or the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), /*! This extended buffer configures the structure of temporal layers inside the encoded H.264 bitstream. See the mfxExtAvcTemporalLayers structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. */ MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L'), /*! This extended buffer defines additional encoding controls. See the mfxExtCodingOption2 structure for details. The application can attach this buffer to the structure for encoding initialization. */ MFX_EXTBUFF_CODING_OPTION2 = MFX_MAKEFOURCC('C','D','O','2'), /*! This extended buffer defines control parameters for the VPP image stabilization filter algorithm. See the mfxExtVPPImageStab structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. */ MFX_EXTBUFF_VPP_IMAGE_STABILIZATION = MFX_MAKEFOURCC('I','S','T','B'), /*! This extended buffer is used to retrieve encoder capability. See the mfxExtEncoderCapability structure for details. The application can attach this buffer to the mfxVideoParam structure before calling MFXVideoENCODE_Query function. */ MFX_EXTBUFF_ENCODER_CAPABILITY = MFX_MAKEFOURCC('E','N','C','P'), /*! This extended buffer is used to control encoder reset behavior and also to query possible encoder reset outcome. See the mfxExtEncoderResetOption structure for details. The application can attach this buffer to the mfxVideoParam structure before calling MFXVideoENCODE_Query or MFXVideoENCODE_Reset functions. */ MFX_EXTBUFF_ENCODER_RESET_OPTION = MFX_MAKEFOURCC('E','N','R','O'), /*! This extended buffer is used by the encoder to report additional information about encoded picture. See the mfxExtAVCEncodedFrameInfo structure for details. The application can attach this buffer to the mfxBitstream structure before calling MFXVideoENCODE_EncodeFrameAsync function. */ MFX_EXTBUFF_ENCODED_FRAME_INFO = MFX_MAKEFOURCC('E','N','F','I'), /*! This extended buffer is used to control composition of several input surfaces in the one output. In this mode, the VPP skips any other filters. The VPP returns error if any mandatory filter is specified and filter skipped warning for optional filter. The only supported filters are deinterlacing and interlaced scaling. */ MFX_EXTBUFF_VPP_COMPOSITE = MFX_MAKEFOURCC('V','C','M','P'), /*! This extended buffer is used to control transfer matrix and nominal range of YUV frames. The application should provide it during initialization. */ MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','V','S','I'), /*! This extended buffer is used by the application to specify different Region Of Interests during encoding. The application should provide it at initialization or at runtime. */ MFX_EXTBUFF_ENCODER_ROI = MFX_MAKEFOURCC('E','R','O','I'), /*! This extended buffer is used by the application to specify different deinterlacing algorithms. */ MFX_EXTBUFF_VPP_DEINTERLACING = MFX_MAKEFOURCC('V','P','D','I'), /*! This extended buffer specifies reference lists for the encoder. */ MFX_EXTBUFF_AVC_REFLISTS = MFX_MAKEFOURCC('R','L','T','S'), /*! See the mfxExtDecVideoProcessing structure for details. */ MFX_EXTBUFF_DEC_VIDEO_PROCESSING = MFX_MAKEFOURCC('D','E','C','V'), /*! The extended buffer defines control parameters for the VPP field-processing algorithm. See the mfxExtVPPFieldProcessing structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization or to the mfxFrameData structure during runtime. */ MFX_EXTBUFF_VPP_FIELD_PROCESSING = MFX_MAKEFOURCC('F','P','R','O'), /*! This extended buffer defines additional encoding controls. See the mfxExtCodingOption3 structure for details. The application can attach this buffer to the structure for encoding initialization. */ MFX_EXTBUFF_CODING_OPTION3 = MFX_MAKEFOURCC('C','D','O','3'), /*! This extended buffer defines chroma samples location information. See the mfxExtChromaLocInfo structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. */ MFX_EXTBUFF_CHROMA_LOC_INFO = MFX_MAKEFOURCC('C','L','I','N'), /*! This extended buffer defines per-macroblock QP. See the mfxExtMBQP structure for details. The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_MBQP = MFX_MAKEFOURCC('M','B','Q','P'), /*! This extended buffer defines per-macroblock force intra flag. See the mfxExtMBForceIntra structure for details. The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_MB_FORCE_INTRA = MFX_MAKEFOURCC('M','B','F','I'), /*! This extended buffer defines additional encoding controls for HEVC tiles. See the mfxExtHEVCTiles structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. */ MFX_EXTBUFF_HEVC_TILES = MFX_MAKEFOURCC('2','6','5','T'), /*! This extended buffer defines macroblock map for current frame which forces specified macroblocks to be non skip. See the mfxExtMBDisableSkipMap structure for details. The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_MB_DISABLE_SKIP_MAP = MFX_MAKEFOURCC('M','D','S','M'), /*! See the mfxExtHEVCParam structure for details. */ MFX_EXTBUFF_HEVC_PARAM = MFX_MAKEFOURCC('2','6','5','P'), /*! This extended buffer is used by decoders to report additional information about decoded frame. See the mfxExtDecodedFrameInfo structure for more details. */ MFX_EXTBUFF_DECODED_FRAME_INFO = MFX_MAKEFOURCC('D','E','F','I'), /*! See the mfxExtTimeCode structure for more details. */ MFX_EXTBUFF_TIME_CODE = MFX_MAKEFOURCC('T','M','C','D'), /*! This extended buffer specifies the region to encode. The application can attach this buffer to the mfxVideoParam structure during HEVC encoder initialization. */ MFX_EXTBUFF_HEVC_REGION = MFX_MAKEFOURCC('2','6','5','R'), /*! See the mfxExtPredWeightTable structure for details. */ MFX_EXTBUFF_PRED_WEIGHT_TABLE = MFX_MAKEFOURCC('E','P','W','T'), /*! See the mfxExtDirtyRect structure for details. */ MFX_EXTBUFF_DIRTY_RECTANGLES = MFX_MAKEFOURCC('D','R','O','I'), /*! See the mfxExtMoveRect structure for details. */ MFX_EXTBUFF_MOVING_RECTANGLES = MFX_MAKEFOURCC('M','R','O','I'), /*! See the mfxExtCodingOptionVPS structure for details. */ MFX_EXTBUFF_CODING_OPTION_VPS = MFX_MAKEFOURCC('C','O','V','P'), /*! See the mfxExtVPPRotation structure for details. */ MFX_EXTBUFF_VPP_ROTATION = MFX_MAKEFOURCC('R','O','T',' '), /*! See the mfxExtEncodedSlicesInfo structure for details. */ MFX_EXTBUFF_ENCODED_SLICES_INFO = MFX_MAKEFOURCC('E','N','S','I'), /*! See the mfxExtVPPScaling structure for details. */ MFX_EXTBUFF_VPP_SCALING = MFX_MAKEFOURCC('V','S','C','L'), /*! This extended buffer defines additional encoding controls for reference list. See the mfxExtAVCRefListCtrl structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_HEVC_REFLIST_CTRL = MFX_EXTBUFF_AVC_REFLIST_CTRL, /*! This extended buffer specifies reference lists for the encoder. */ MFX_EXTBUFF_HEVC_REFLISTS = MFX_EXTBUFF_AVC_REFLISTS, /*! This extended buffer configures the structure of temporal layers inside the encoded H.264 bitstream. See the mfxExtAvcTemporalLayers structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. */ MFX_EXTBUFF_HEVC_TEMPORAL_LAYERS = MFX_EXTBUFF_AVC_TEMPORAL_LAYERS, /*! See the mfxExtVPPMirroring structure for details. */ MFX_EXTBUFF_VPP_MIRRORING = MFX_MAKEFOURCC('M','I','R','R'), /*! See the mfxExtMVOverPicBoundaries structure for details. */ MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES = MFX_MAKEFOURCC('M','V','P','B'), /*! See the mfxExtVPPColorFill structure for details. */ MFX_EXTBUFF_VPP_COLORFILL = MFX_MAKEFOURCC('V','C','L','F'), /*! This extended buffer is used by decoders to report error information before frames get decoded. See the mfxExtDecodeErrorReport structure for more details. */ MFX_EXTBUFF_DECODE_ERROR_REPORT = MFX_MAKEFOURCC('D', 'E', 'R', 'R'), /*! See the mfxExtColorConversion structure for details. */ MFX_EXTBUFF_VPP_COLOR_CONVERSION = MFX_MAKEFOURCC('V', 'C', 'S', 'C'), /*! This extended buffer configures HDR SEI message. See the mfxExtContentLightLevelInfo structure for details. */ MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO = MFX_MAKEFOURCC('L', 'L', 'I', 'S'), /*! This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. If color volume changes per frame, the application can attach this buffer to the mfxFrameData structure for video processing. */ MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME = MFX_MAKEFOURCC('D', 'C', 'V', 'S'), /*! This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. The application can attach this buffer to the mfxVideoParam structure for the input of video processing if the mastering display color volume changes per sequence. In this case, this buffer should be together with MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO to indicate the light level and mastering color volume of the input of video processing. If color Volume changes per frame instead of per sequence, the application can attach MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME to mfxFrameData for frame based processing. */ MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN = MFX_MAKEFOURCC('D', 'C', 'V', 'I'), /*! This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. The application can attach this buffer to the mfxVideoParam structure for the output of video processing if the mastering display color volume changes per sequence. If color volume changes per frame instead of per sequence, the application can attach the buffer with MFX_EXTBUFF_MASTERING_ DISPLAY_COLOUR_VOLUME to mfxFrameData for frame based processing. */ MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT = MFX_MAKEFOURCC('D', 'C', 'V', 'O'), /*! See the mfxExtEncodedUnitsInfo structure for details. */ MFX_EXTBUFF_ENCODED_UNITS_INFO = MFX_MAKEFOURCC('E', 'N', 'U', 'I'), /*! This video processing algorithm identifier is used to enable MCTF via mfxExtVPPDoUse and together with mfxExtVppMctf */ MFX_EXTBUFF_VPP_MCTF = MFX_MAKEFOURCC('M', 'C', 'T', 'F'), /*! Extends mfxVideoParam structure with VP9 segmentation parameters. See the mfxExtVP9Segmentation structure for details. */ MFX_EXTBUFF_VP9_SEGMENTATION = MFX_MAKEFOURCC('9', 'S', 'E', 'G'), /*! Extends mfxVideoParam structure with parameters for VP9 temporal scalability. See the mfxExtVP9TemporalLayers structure for details. */ MFX_EXTBUFF_VP9_TEMPORAL_LAYERS = MFX_MAKEFOURCC('9', 'T', 'M', 'L'), /*! Extends mfxVideoParam structure with VP9-specific parameters. See the mfxExtVP9Param structure for details. */ MFX_EXTBUFF_VP9_PARAM = MFX_MAKEFOURCC('9', 'P', 'A', 'R'), /*! See the mfxExtAVCRoundingOffset structure for details. */ MFX_EXTBUFF_AVC_ROUNDING_OFFSET = MFX_MAKEFOURCC('R','N','D','O'), /*! See the mfxExtPartialBitstreamParam structure for details. */ MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM = MFX_MAKEFOURCC('P','B','O','P'), /*! See the mfxExtEncoderIPCMArea structure for details. */ MFX_EXTBUFF_ENCODER_IPCM_AREA = MFX_MAKEFOURCC('P', 'C', 'M', 'R'), /*! See the mfxExtInsertHeaders structure for details. */ MFX_EXTBUFF_INSERT_HEADERS = MFX_MAKEFOURCC('S', 'P', 'R', 'E'), /*! See the mfxExtDeviceAffinityMask structure for details. */ MFX_EXTBUFF_DEVICE_AFFINITY_MASK = MFX_MAKEFOURCC('D', 'A', 'F', 'M'), /*! See the mfxExtInCrops structure for details. */ MFX_EXTBUFF_CROPS = MFX_MAKEFOURCC('C', 'R', 'O', 'P'), /*! See the mfxExtAV1BitstreamParam structure for more details. */ MFX_EXTBUFF_AV1_BITSTREAM_PARAM = MFX_MAKEFOURCC('A', '1', 'B', 'S'), /*! See the mfxExtAV1ResolutionParam structure for more details. */ MFX_EXTBUFF_AV1_RESOLUTION_PARAM = MFX_MAKEFOURCC('A', '1', 'R', 'S'), /*! See the mfxExtAV1TileParam structure for more details. */ MFX_EXTBUFF_AV1_TILE_PARAM = MFX_MAKEFOURCC('A', '1', 'T', 'L'), /*! See the mfxExtAV1Segmentation structure for more details. */ MFX_EXTBUFF_AV1_SEGMENTATION = MFX_MAKEFOURCC('1', 'S', 'E', 'G'), /*! See the mfxExtAV1FilmGrainParam structure for more details. */ MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM = MFX_MAKEFOURCC('A','1','F','G'), /*! See the mfxExtHyperModeParam structure for more details. */ MFX_EXTBUFF_HYPER_MODE_PARAM = MFX_MAKEFOURCC('H', 'Y', 'P', 'M'), /*! See the mfxExtTemporalLayers structure for more details. */ MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS = MFX_MAKEFOURCC('U', 'T', 'M', 'P'), /*! This extended buffer defines additional encoding controls for reference list. See the mfxExtRefListCtrl structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or the mfxEncodeCtrl structure for per-frame encoding configuration. */ MFX_EXTBUFF_UNIVERSAL_REFLIST_CTRL = MFX_EXTBUFF_AVC_REFLIST_CTRL, #ifdef ONEVPL_EXPERIMENTAL /*! See the mfxExtEncodeStats structure for details. */ MFX_EXTBUFF_ENCODESTATS = MFX_MAKEFOURCC('E','N','S','B'), #endif /*! See the mfxExtVPP3DLut structure for more details. */ MFX_EXTBUFF_VPP_3DLUT = MFX_MAKEFOURCC('T','D','L','T'), /*! See the mfxExtAllocationHints structure for more details. */ MFX_EXTBUFF_ALLOCATION_HINTS = MFX_MAKEFOURCC('A','L','C','H'), #ifdef ONEVPL_EXPERIMENTAL /*! See the mfxExtSyncSubmission structure for more details. */ MFX_EXTBUFF_SYNCSUBMISSION = MFX_MAKEFOURCC('S','Y','N','C'), /*! See the mfxExtVPPPercEncPrefilter structure for details. */ MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER = MFX_MAKEFOURCC('V','P','E','F'), /*! See the mfxExtTuneEncodeQuality structure for details. */ MFX_EXTBUFF_TUNE_ENCODE_QUALITY = MFX_MAKEFOURCC('T','U','N','E'), #endif }; /* VPP Conf: Do not use certain algorithms */ MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Tells the VPP not to use certain filters in pipeline. See "Configurable VPP filters" table for complete list of configurable filters. The user can attach this structure to the mfxVideoParam structure when initializing video processing. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DONOTUSE. */ mfxU32 NumAlg; /*!< Number of filters (algorithms) not to use */ mfxU32* AlgList; /*!< Pointer to a list of filters (algorithms) not to use */ } mfxExtVPPDoNotUse; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures the VPP denoise filter algorithm. @deprecated Deprecated in API version 2.5. Use mfxExtVPPDenoise2 instead. */ MFX_DEPRECATED typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DENOISE. */ mfxU16 DenoiseFactor; /*!< Indicates the level of noise to remove. Value range of 0 to 100 (inclusive). */ } mfxExtVPPDenoise; MFX_PACK_END() /*! The mfxDenoiseMode enumerator specifies the mode of denoise. */ typedef enum { MFX_DENOISE_MODE_DEFAULT = 0, /*!< Default denoise mode. The library selects the most appropriate denoise mode. */ MFX_DENOISE_MODE_VENDOR = 1000, /*!< The enumeration to separate common denoise mode above and vendor specific. */ MFX_DENOISE_MODE_INTEL_HVS_AUTO_BDRATE = MFX_DENOISE_MODE_VENDOR + 1, /*!< Indicates auto BD rate improvement in pre-processing before video encoding, ignore Strength.*/ MFX_DENOISE_MODE_INTEL_HVS_AUTO_SUBJECTIVE = MFX_DENOISE_MODE_VENDOR + 2, /*!< Indicates auto subjective quality improvement in pre-processing before video encoding, ignore Strength.*/ MFX_DENOISE_MODE_INTEL_HVS_AUTO_ADJUST = MFX_DENOISE_MODE_VENDOR + 3, /*!< Indicates auto adjust subjective quality in post-processing (after decoding) for video playback, ignore Strength.*/ MFX_DENOISE_MODE_INTEL_HVS_PRE_MANUAL = MFX_DENOISE_MODE_VENDOR + 4, /*!< Indicates manual mode for pre-processing before video encoding, allow to adjust the denoise strength manually.*/ MFX_DENOISE_MODE_INTEL_HVS_POST_MANUAL = MFX_DENOISE_MODE_VENDOR + 5, /*!< Indicates manual mode for post-processing for video playback, allow to adjust the denoise strength manually.*/ } mfxDenoiseMode; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures the VPP denoise filter algorithm. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DENOISE2. */ mfxDenoiseMode Mode; /*!< Indicates the mode of denoise. mfxDenoiseMode enumerator. */ mfxU16 Strength; /*!< Denoise strength in manual mode. Value of 0-100 (inclusive) indicates the strength of denoise. The strength of denoise controls degree of possible changes of pixel values; the bigger the strength the larger the change is. */ mfxU16 reserved[15]; } mfxExtVPPDenoise2; MFX_PACK_END() /*! The mfx3DLutChannelMapping enumerator specifies the channel mapping of 3DLUT. */ typedef enum { MFX_3DLUT_CHANNEL_MAPPING_DEFAULT = 0, /*!< Default 3DLUT channel mapping. The library selects the most appropriate 3DLUT channel mapping. */ MFX_3DLUT_CHANNEL_MAPPING_RGB_RGB = 1, /*!< 3DLUT RGB channels map to RGB channels. */ MFX_3DLUT_CHANNEL_MAPPING_YUV_RGB = 2, /*!< 3DLUT YUV channels map to RGB channels. */ MFX_3DLUT_CHANNEL_MAPPING_VUY_RGB = 3, /*!< 3DLUT VUY channels map to RGB channels. */ } mfx3DLutChannelMapping; /*! The mfx3DLutMemoryLayout enumerator specifies the memory layout of 3DLUT. */ typedef enum { MFX_3DLUT_MEMORY_LAYOUT_DEFAULT = 0, /*!< Default 3DLUT memory layout. The library selects the most appropriate 3DLUT memory layout.*/ MFX_3DLUT_MEMORY_LAYOUT_VENDOR = 0x1000, /*!< The enumeration to separate default above and vendor specific.*/ /*! Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. 3DLUT size is 17(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. 3DLUT contains 17x17x32 entries with holes that are not filled. Take RGB as example, the nodes RxGx17 to RxGx31 are not filled, are "don't care" bits, and not accessed for the 17x17x17 nodes. */ MFX_3DLUT_MEMORY_LAYOUT_INTEL_17LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 1, /*! Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. 3DLUT size is 33(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. 3DLUT contains 33x33x64 entries with holes that are not filled. Take RGB as example, the nodes RxGx33 to RxGx63 are not filled, are "don't care" bits, and not accessed for the 33x33x33 nodes. */ MFX_3DLUT_MEMORY_LAYOUT_INTEL_33LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 2, /*! Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. 3DLUT size is 65(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. 3DLUT contains 65x65x128 entries with holes that are not filled. Take RGB as example, the nodes RxGx65 to RxGx127 are not filled, are "don't care" bits, and not accessed for the 65x65x65 nodes. */ MFX_3DLUT_MEMORY_LAYOUT_INTEL_65LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 3, } mfx3DLutMemoryLayout; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! A hint structure that configures the data channel. */ typedef struct { mfxDataType DataType; /*!< Data type, mfxDataType enumerator.*/ mfxU32 Size; /*!< Size of Look up table, the number of elements per dimension.*/ union { mfxU8* Data; /*!< The pointer to 3DLUT data, 8 bit unsigned integer.*/ mfxU16* Data16; /*!< The pointer to 3DLUT data, 16 bit unsigned integer.*/ }; mfxU32 reserved[4]; /*!< Reserved for future extension.*/ } mfxChannel; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures 3DLUT system buffer. */ typedef struct { mfxChannel Channel[3]; /*!< 3 Channels, can be RGB or YUV, mfxChannel structure.*/ mfxU32 reserved[8]; /*!< Reserved for future extension.*/ } mfx3DLutSystemBuffer; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures 3DLUT video buffer. */ typedef struct { mfxDataType DataType; /*!< Data type, mfxDataType enumerator.*/ mfx3DLutMemoryLayout MemLayout; /*!< Indicates 3DLUT memory layout. mfx3DLutMemoryLayout enumerator.*/ mfxMemId MemId; /*!< Memory ID for holding the lookup table data. One MemID is dedicated for one instance of VPP.*/ mfxU32 reserved[8]; /*!< Reserved for future extension.*/ } mfx3DLutVideoBuffer; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures 3DLUT filter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_3DLUT..*/ mfx3DLutChannelMapping ChannelMapping; /*!< Indicates 3DLUT channel mapping. mfx3DLutChannelMapping enumerator.*/ mfxResourceType BufferType; /*!< Indicates 3DLUT buffer type. mfxResourceType enumerator, can be system memory, VA surface, DX11 texture/buffer etc.*/ union { mfx3DLutSystemBuffer SystemBuffer; /*!< The 3DLUT system buffer. mfx3DLutSystemBuffer structure describes the details of the buffer.*/ mfx3DLutVideoBuffer VideoBuffer; /*!< The 3DLUT video buffer. mfx3DLutVideoBuffer describes the details of 3DLUT video buffer.*/ }; mfxU32 reserved[4]; /*!< Reserved for future extension.*/ } mfxExtVPP3DLut; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures the VPP detail/edge enhancement filter algorithm. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DETAIL. */ mfxU16 DetailFactor; /*!< Indicates the level of details to be enhanced. Value range of 0 to 100 (inclusive). */ } mfxExtVPPDetail; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! A hint structure that configures the VPP ProcAmp filter algorithm. The structure parameters will be clipped to their corresponding range and rounded by their corresponding increment. @note There are no default values for fields in this structure, all settings must be explicitly specified every time this buffer is submitted for processing. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_PROCAMP. */ mfxF64 Brightness; /*!< The brightness parameter is in the range of -100.0F to 100.0F, in increments of 0.1F. Setting this field to 0.0F will disable brightness adjustment. */ mfxF64 Contrast; /*!< The contrast parameter in the range of 0.0F to 10.0F, in increments of 0.01F, is used for manual contrast adjustment. Setting this field to 1.0F will disable contrast adjustment. If the parameter is negative, contrast will be adjusted automatically. */ mfxF64 Hue; /*!< The hue parameter is in the range of -180F to 180F, in increments of 0.1F. Setting this field to 0.0F will disable hue adjustment. */ mfxF64 Saturation; /*!< The saturation parameter is in the range of 0.0F to 10.0F, in increments of 0.01F. Setting this field to 1.0F will disable saturation adjustment. */ } mfxExtVPPProcAmp; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Returns statistics collected during encoding. */ typedef struct { mfxU32 reserved[16]; mfxU32 NumFrame; /*!< Number of encoded frames. */ mfxU64 NumBit; /*!< Number of bits for all encoded frames. */ mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ } mfxEncodeStat; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Returns statistics collected during decoding. */ typedef struct { mfxU32 reserved[16]; mfxU32 NumFrame; /*!< Number of total decoded frames. */ mfxU32 NumSkippedFrame; /*!< Number of skipped frames. */ mfxU32 NumError; /*!< Number of errors recovered. */ mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ } mfxDecodeStat; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Returns statistics collected during video processing. */ typedef struct { mfxU32 reserved[16]; mfxU32 NumFrame; /*!< Total number of frames processed. */ mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ } mfxVPPStat; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Returns auxiliary data generated by the video processing pipeline. The encoding process may use the auxiliary data by attaching this structure to the mfxEncodeCtrl structure. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_AUXDATA. */ union{ struct{ MFX_DEPRECATED mfxU32 SpatialComplexity; /* Deprecated */ MFX_DEPRECATED mfxU32 TemporalComplexity; /* Deprecated */ }; struct{ /*! Detected picture structure - top field first, bottom field first, progressive or unknown if video processor cannot detect picture structure. See the PicStruct enumerator for definition of these values. */ mfxU16 PicStruct; mfxU16 reserved[3]; }; }; MFX_DEPRECATED mfxU16 SceneChangeRate; /* Deprecated */ mfxU16 RepeatedFrame; /*!< The flag signalizes that the frame is identical to the previous one. */ } mfxExtVppAuxData; MFX_PACK_END() /*! The PayloadCtrlFlags enumerator itemizes additional payload properties. */ enum { MFX_PAYLOAD_CTRL_SUFFIX = 0x00000001 /*!< Insert this payload into HEVC Suffix SEI NAL-unit. */ }; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes user data payload in MPEG-2 or SEI message payload in H.264. For encoding, these payloads can be inserted into the bitstream. The payload buffer must contain a valid formatted payload. For H.264, this is the sei_message() as specified in the section 7.3.2.3.1 'Supplemental enhancement information message syntax' of the ISO/IEC 14496-10 specification. For MPEG-2, this is the section 6.2.2.2.2 'User data' of the ISO/IEC 13818-2 specification, excluding the user data start_code. For decoding, these payloads can be retrieved as the decoder parses the bitstream and caches them in an internal buffer. @internal +-----------+-------------------------------------------+ | **Codec** | **Supported Types** | +===========+===========================================+ | MPEG2 | 0x01B2 //User Data | +-----------+-------------------------------------------+ | AVC | 02 //pan_scan_rect | | | 03 //filler_payload | | | 04 //user_data_registered_itu_t_t35 | | | 05 //user_data_unregistered | | | 06 //recovery_point | | | 09 //scene_info | | | 13 //full_frame_freeze | | | 14 //full_frame_freeze_release | | | 15 //full_frame_snapshot | | | 16 //progressive_refinement_segment_start | | | 17 //progressive_refinement_segment_end | | | 19 //film_grain_characteristics | | | 20 //deblocking_filter_display_preference | | | 21 //stereo_video_info | | | 45 //frame_packing_arrangement | +-----------+-------------------------------------------+ | HEVC | All | +-----------+-------------------------------------------+ @endinternal */ typedef struct { mfxU32 CtrlFlags; /*!< Additional payload properties. See the PayloadCtrlFlags enumerator for details. */ mfxU32 reserved[3]; mfxU8 *Data; /*!< Pointer to the actual payload data buffer. */ mfxU32 NumBit; /*!< Number of bits in the payload data */ mfxU16 Type; /*!< MPEG-2 user data start code or H.264 SEI message type. */ mfxU16 BufSize; /*!< Payload buffer size in bytes. */ } mfxPayload; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Contains parameters for per-frame based encoding control. */ typedef struct { mfxExtBuffer Header; /*!< This extension buffer doesn't have assigned buffer ID. Ignored. */ mfxU32 reserved[4]; mfxU16 reserved1; /*! Type of NAL unit that contains encoding frame. All supported values are defined by MfxNalUnitType enumerator. Other values defined in ITU-T H.265 specification are not supported. The encoder uses this field only if application sets mfxExtCodingOption3::EnableNalUnitType option to ON during encoder initialization. @note Only encoded order is supported. If application specifies this value in display order or uses value inappropriate for current frame or invalid value, then the encoder silently ignores it. */ mfxU16 MfxNalUnitType; mfxU16 SkipFrame; /*!< Indicates that current frame should be skipped or the number of missed frames before the current frame. See mfxExtCodingOption2::SkipFrame for details. */ mfxU16 QP; /*!< If nonzero, this value overwrites the global QP value for the current frame in the constant QP mode. */ /*! Encoding frame type. See the FrameType enumerator for details. If the encoder works in the encoded order, the application must specify the frame type. If the encoder works in the display order, only key frames are enforceable. */ mfxU16 FrameType; mfxU16 NumExtParam; /*!< Number of extra control buffers. */ mfxU16 NumPayload; /*!< Number of payload records to insert into the bitstream. */ mfxU16 reserved2; /*! Pointer to an array of pointers to external buffers that provide additional information or control to the encoder for this frame or field pair. A typical use is to pass the VPP auxiliary data generated by the video processing pipeline to the encoder. See the ExtendedBufferID for the list of extended buffers. */ mfxExtBuffer **ExtParam; /*! Pointer to an array of pointers to user data (MPEG-2) or SEI messages (H.264) for insertion into the bitstream. For field pictures, odd payloads are associated with the first field and even payloads are associated with the second field. See the mfxPayload structure for payload definitions. */ mfxPayload **Payload; } mfxEncodeCtrl; MFX_PACK_END() /*! The ExtMemBufferType enumerator specifies the buffer type. It is a bit-ORed value of the following. */ enum { MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 /*!< Memory page for persistent use. */ }; /* Frame Memory Types */ #define MFX_MEMTYPE_BASE(x) (0x90ff & (x)) /*! The ExtMemFrameType enumerator specifies the memory type of frame. It is a bit-ORed value of the following. \verbatim embed:rst For information on working with video memory surfaces, see the :ref:`Working with Hardware Acceleration section`. \endverbatim */ enum { MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, /*!< Frames are in video memory and belong to video decoder render targets. */ MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, /*!< Frames are in video memory and belong to video processor render targets. */ MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, /*!< Frames are in video memory and belong to video decoder render targets. */ MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET,/*!< Frames are in video memory and belong to video processor render targets. */ MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, /*!< The frames are in system memory. */ MFX_MEMTYPE_RESERVED1 =0x0080, /*!< */ MFX_MEMTYPE_FROM_ENCODE = 0x0100, /*!< Allocation request comes from an ENCODE function */ MFX_MEMTYPE_FROM_DECODE = 0x0200, /*!< Allocation request comes from a DECODE function */ MFX_MEMTYPE_FROM_VPPIN = 0x0400, /*!< Allocation request comes from a VPP function for input frame allocation */ MFX_MEMTYPE_FROM_VPPOUT = 0x0800, /*!< Allocation request comes from a VPP function for output frame allocation */ MFX_MEMTYPE_FROM_ENC = 0x2000, /*!< Allocation request comes from an ENC function */ MFX_MEMTYPE_FROM_PAK = 0x4000, /* Reserved */ MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, /*!< Allocation request for internal frames */ MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, /*!< Allocation request for I/O frames */ MFX_MEMTYPE_EXPORT_FRAME = 0x0008, /*!< Application requests frame handle export to some associated object. For Linux frame handle can be considered to be exported to DRM Prime FD, DRM FLink or DRM FrameBuffer Handle. Specifics of export types and export procedure depends on external frame allocator implementation */ MFX_MEMTYPE_SHARED_RESOURCE = MFX_MEMTYPE_EXPORT_FRAME, /*!< For DX11 allocation use shared resource bind flag. */ MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET = 0x1000 /*!< Frames are in video memory and belong to video encoder render targets. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Describes multiple frame allocations when initializing encoders, decoders, and video preprocessors. A range specifies the number of video frames. Applications are free to allocate additional frames. In all cases, the minimum number of frames must be at least NumFrameMin or the called API function will return an error. */ typedef struct { union { mfxU32 AllocId; /*!< Unique (within the session) ID of component requested the allocation. */ mfxU32 reserved[1]; }; mfxU32 reserved3[3]; mfxFrameInfo Info; /*!< Describes the properties of allocated frames. */ mfxU16 Type; /*!< Allocated memory type. See the ExtMemFrameType enumerator for details. */ mfxU16 NumFrameMin; /*!< Minimum number of allocated frames. */ mfxU16 NumFrameSuggested; /*!< Suggested number of allocated frames. */ mfxU16 reserved2; } mfxFrameAllocRequest; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes the response to multiple frame allocations. The calling API function returns the number of video frames actually allocated and pointers to their memory IDs. */ typedef struct { mfxU32 AllocId; /*!< Unique (within the session) ID of component requested the allocation. */ mfxU32 reserved[3]; mfxMemId *mids; /*!< Pointer to the array of the returned memory IDs. The application allocates or frees this array. */ mfxU16 NumFrameActual; /*!< Number of frames actually allocated. */ mfxU16 reserved2; } mfxFrameAllocResponse; MFX_PACK_END() /*! The FrameType enumerator itemizes frame types. Use bit-ORed values to specify all that apply. */ enum { MFX_FRAMETYPE_UNKNOWN =0x0000, /*!< Frame type is unspecified. */ MFX_FRAMETYPE_I =0x0001, /*!< This frame or the first field is encoded as an I-frame/field. */ MFX_FRAMETYPE_P =0x0002, /*!< This frame or the first field is encoded as an P-frame/field. */ MFX_FRAMETYPE_B =0x0004, /*!< This frame or the first field is encoded as an B-frame/field. */ MFX_FRAMETYPE_S =0x0008, /*!< This frame or the first field is either an SI- or SP-frame/field. */ MFX_FRAMETYPE_REF =0x0040, /*!< This frame or the first field is encoded as a reference. */ MFX_FRAMETYPE_IDR =0x0080, /*!< This frame or the first field is encoded as an IDR. */ MFX_FRAMETYPE_xI =0x0100, /*!< The second field is encoded as an I-field. */ MFX_FRAMETYPE_xP =0x0200, /*!< The second field is encoded as an P-field. */ MFX_FRAMETYPE_xB =0x0400, /*!< The second field is encoded as an S-field. */ MFX_FRAMETYPE_xS =0x0800, /*!< The second field is an SI- or SP-field. */ MFX_FRAMETYPE_xREF =0x4000, /*!< The second field is encoded as a reference. */ MFX_FRAMETYPE_xIDR =0x8000 /*!< The second field is encoded as an IDR. */ }; /*! The MfxNalUnitType enumerator specifies NAL unit types supported by the HEVC encoder. */ enum { MFX_HEVC_NALU_TYPE_UNKNOWN = 0, /*!< The encoder will decide what NAL unit type to use. */ MFX_HEVC_NALU_TYPE_TRAIL_N = ( 0+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_TRAIL_R = ( 1+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_RADL_N = ( 6+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_RADL_R = ( 7+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_RASL_N = ( 8+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_RASL_R = ( 9+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_IDR_W_RADL = (19+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_IDR_N_LP = (20+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ MFX_HEVC_NALU_TYPE_CRA_NUT = (21+1) /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ }; /*! The mfxSkipMode enumerator describes the decoder skip-mode options. */ typedef enum { MFX_SKIPMODE_NOSKIP=0, /*! Do not skip any frames. */ MFX_SKIPMODE_MORE=1, /*! Skip more frames. */ MFX_SKIPMODE_LESS=2 /*! Skip less frames. */ } mfxSkipMode; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Attach this structure as part of the extended buffers to configure the encoder during MFXVideoENCODE_Init. The sequence or picture parameters specified by this structure overwrite any parameters specified by the structure or any other attached extended buffers attached. For H.264, SPSBuffer and PPSBuffer must point to valid bitstreams that contain the sequence parameter set and picture parameter set, respectively. For MPEG-2, SPSBuffer must point to valid bitstreams that contain the sequence header followed by any sequence header extension. The PPSBuffer pointer is ignored. The encoder imports parameters from these buffers. If the encoder does not support the specified parameters, the encoder does not initialize and returns the status code MFX_ERR_INCOMPATIBLE_VIDEO_PARAM. Check with the MFXVideoENCODE_Query function for the support of this multiple segment encoding feature. If this feature is not supported, the query returns MFX_ERR_UNSUPPORTED. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION_SPSPPS. */ mfxU8 *SPSBuffer; /*!< Pointer to a valid bitstream that contains the SPS (sequence parameter set for H.264 or sequence header followed by any sequence header extension for MPEG-2) buffer. Can be NULL to skip specifying the SPS. */ mfxU8 *PPSBuffer; /*!< Pointer to a valid bitstream that contains the PPS (picture parameter set for H.264 or picture header followed by any picture header extension for MPEG-2) buffer. Can be NULL to skip specifying the PPS. */ mfxU16 SPSBufSize; /*!< Size of the SPS in bytes. */ mfxU16 PPSBufSize; /*!< Size of the PPS in bytes. */ mfxU16 SPSId; /*!< SPS identifier. The value is reserved and must be zero. */ mfxU16 PPSId; /*!< PPS identifier. The value is reserved and must be zero. */ } mfxExtCodingOptionSPSPPS; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Attach this structure as part of the extended buffers to configure the encoder during MFXVideoENCODE_Init. The sequence or picture parameters specified by this structure overwrite any parameters specified by the structure or any other attached extended buffers attached. If the encoder does not support the specified parameters, the encoder does not initialize and returns the status code MFX_ERR_INCOMPATIBLE_VIDEO_PARAM. Check with the MFXVideoENCODE_Query function for the support of this multiple segment encoding feature. If this feature is not supported, the query returns MFX_ERR_UNSUPPORTED. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION_VPS. */ union { mfxU8 *VPSBuffer; /*!< Pointer to a valid bitstream that contains the VPS (video parameter set for HEVC) buffer. */ mfxU64 reserved1; }; mfxU16 VPSBufSize; /*!< Size of the VPS in bytes. */ mfxU16 VPSId; /*!< VPS identifier; the value is reserved and must be zero. */ mfxU16 reserved[6]; } mfxExtCodingOptionVPS; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Defines the video signal information. For H.264, see Annex E of the ISO/IEC 14496-10 specification for the definition of these parameters. For MPEG-2, see section 6.3.6 of the ITU* H.262 specification for the definition of these parameters. The field VideoFullRange is ignored. For VC-1, see section 6.1.14.5 of the SMPTE* 421M specification. The fields VideoFormat and VideoFullRange are ignored. @note If ColourDescriptionPresent is zero, the color description information (including ColourPrimaries, TransferCharacteristics, and MatrixCoefficients) does not present in the bitstream. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VIDEO_SIGNAL_INFO. */ mfxU16 VideoFormat; mfxU16 VideoFullRange; mfxU16 ColourDescriptionPresent; mfxU16 ColourPrimaries; mfxU16 TransferCharacteristics; mfxU16 MatrixCoefficients; } mfxExtVideoSignalInfo; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Tells the VPP to include certain filters in the pipeline. Each filter may be included in the pipeline in one of two different ways: @li Adding a filter ID to this structure. In this method, the default filter parameters are used. @li Attaching a filter configuration structure directly to the mfxVideoParam structure. In this method, adding filter ID to the mfxExtVPPDoUse structure is optional. See Table "Configurable VPP filters" for complete list of configurable filters, their IDs, and configuration structures. The user can attach this structure to the mfxVideoParam structure when initializing video processing. @note MFX_EXTBUFF_VPP_COMPOSITE cannot be enabled using mfxExtVPPDoUse because default parameters are undefined for this filter. The application must attach the appropriate filter configuration structure directly to the mfxVideoParam structure to enable it. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DOUSE. */ mfxU32 NumAlg; /*!< Number of filters (algorithms) to use */ mfxU32 *AlgList; /*!< Pointer to a list of filters (algorithms) to use */ } mfxExtVPPDoUse; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures reference frame options for the H.264 encoder. \verbatim embed:rst See the :ref:`Reference List Selection ` and :ref:`Long Term Reference Frame ` sections for more details. \endverbatim @note Not all implementations of the encoder support LongTermIdx and ApplyLongTermIdx fields in this structure. The application must use query mode 1 to determine if such functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE and these fields were set to one, then the functionality is supported. If the function fails or sets fields to zero, then the functionality is not supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_REFLIST_CTRL. */ mfxU16 NumRefIdxL0Active; /*!< Specify the number of reference frames in the active reference list L0. This number should be less or equal to the NumRefFrame parameter from encoding initialization. */ mfxU16 NumRefIdxL1Active; /*!< Specify the number of reference frames in the active reference list L1. This number should be less or equal to the NumRefFrame parameter from encoding initialization. */ struct { /*! @{ @name Reference Lists The following structure members are used by the reference lists contained in the parent structure. */ mfxU32 FrameOrder; /*!< Together FrameOrder and PicStruct fields are used to identify reference picture. Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark unused entry. */ mfxU16 PicStruct; /*!< Together FrameOrder and PicStruct fields are used to identify reference picture. Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark unused entry. */ mfxU16 ViewId; /*!< Reserved and must be zero. */ mfxU16 LongTermIdx; /*!< Index that should be used by the encoder to mark long-term reference frame. */ mfxU16 reserved[3]; /*!< Reserved */ /*! @} */ } PreferredRefList[32], /*!< Reference list that specifies the list of frames that should be used to predict the current frame. */ RejectedRefList[16], /*!< Reference list that specifies the list of frames that should not be used for prediction. */ LongTermRefList[16]; /*!< Reference list that specifies the list of frames that should be marked as long-term reference frame. */ mfxU16 ApplyLongTermIdx;/*!< If it is equal to zero, the encoder assigns long-term index according to internal algorithm. If it is equal to one, the encoder uses LongTermIdx value as long-term index. */ mfxU16 reserved[15]; } mfxExtAVCRefListCtrl; MFX_PACK_END() /*! The FrcAlgm enumerator itemizes frame rate conversion algorithms. See description of mfxExtVPPFrameRateConversion structure for more details. */ enum { MFX_FRCALGM_PRESERVE_TIMESTAMP = 0x0001, /*!< Frame dropping/repetition based frame rate conversion algorithm with preserved original time stamps. Any inserted frames will carry MFX_TIMESTAMP_UNKNOWN. */ MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 0x0002, /*!< Frame dropping/repetition based frame rate conversion algorithm with distributed time stamps. The algorithm distributes output time stamps evenly according to the output frame rate. */ MFX_FRCALGM_FRAME_INTERPOLATION = 0x0004 /*!< Frame rate conversion algorithm based on frame interpolation. This flag may be combined with MFX_FRCALGM_PRESERVE_TIMESTAMP or MFX_FRCALGM_DISTRIBUTED_TIMESTAMP flags. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP frame rate conversion filter. The user can attach this structure to the mfxVideoParam structure when initializing, resetting, or querying capability of video processing. On some platforms the advanced frame rate conversion algorithm (the algorithm based on frame interpolation) is not supported. To query its support, the application should add the MFX_FRCALGM_FRAME_INTERPOLATION flag to the Algorithm value in the mfxExtVPPFrameRateConversion structure, attach it to the structure, and call the MFXVideoVPP_Query function. If the filter is supported, the function returns a MFX_ERR_NONE status and copies the content of the input structure to the output structure. If an advanced filter is not supported, then a simple filter will be used and the function returns MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, copies content of the input structure to the output structure, and corrects the Algorithm value. If advanced FRC algorithm is not supported, both MFXVideoVPP_Init and MFXVideoVPP_Reset functions return the MFX_WRN_INCOMPATIBLE_VIDEO_PARAM status. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION. */ mfxU16 Algorithm; /*!< See the FrcAlgm enumerator for a list of frame rate conversion algorithms. */ mfxU16 reserved; mfxU32 reserved2[15]; } mfxExtVPPFrameRateConversion; MFX_PACK_END() /*! The ImageStabMode enumerator itemizes image stabilization modes. See description of mfxExtVPPImageStab structure for more details. */ enum { MFX_IMAGESTAB_MODE_UPSCALE = 0x0001, /*!< Upscale mode. */ MFX_IMAGESTAB_MODE_BOXING = 0x0002 /*!< Boxing mode. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that configures the VPP image stabilization filter. On some platforms this filter is not supported. To query its support, the application should use the same approach that it uses to configure VPP filters: adding the filter ID to the mfxExtVPPDoUse structure or by attaching the mfxExtVPPImageStab structure directly to the mfxVideoParam structure and calling the MFXVideoVPP_Query function. If this filter is supported, the function returns a MFX_ERR_NONE status and copies the content of the input structure to the output structure. If the filter is not supported, the function returns MFX_WRN_FILTER_SKIPPED, removes the filter from the mfxExtVPPDoUse structure, and zeroes the mfxExtVPPImageStab structure. If the image stabilization filter is not supported, both MFXVideoVPP_Init and MFXVideoVPP_Reset functions return a MFX_WRN_FILTER_SKIPPED status. The application can retrieve the list of active filters by attaching the mfxExtVPPDoUse structure to the mfxVideoParam structure and calling the MFXVideoVPP_GetVideoParam function. The application must allocate enough memory for the filter list. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_IMAGE_STABILIZATION. */ mfxU16 Mode; /*!< Image stabilization mode. See ImageStabMode enumerator for values. */ mfxU16 reserved[11]; } mfxExtVPPImageStab; MFX_PACK_END() /*! The InsertHDRPayload enumerator itemizes HDR payloads insertion rules in the encoder, and indicates if there is valid HDR SEI message in the clip in the decoder. */ enum { MFX_PAYLOAD_OFF = 0, /*!< Do not insert payload when encoding; Clip does not have valid HDE SEI when decoding. */ MFX_PAYLOAD_IDR = 1 /*!< Insert payload on IDR frames when encoding; Clip has valid HDE SEI when decoding. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Handle the HDR SEI message. During encoding: If the application attaches this structure to the mfxEncodeCtrl structure at runtime, the encoder inserts the HDR SEI message for the current frame and ignores InsertPayloadToggle. If the application attaches this structure to the mfxVideoParam structure during initialization or reset, the encoder inserts the HDR SEI message based on InsertPayloadToggle. During video processing: If the application attaches this structure for video processing, InsertPayloadToggle will be ignored. And DisplayPrimariesX[3], DisplayPrimariesY[3] specify the color primaries where 0,1,2 specifies Red, Green, Blue respectively. During decoding: If the application attaches this structure to the mfxFrameSurface1 structure at runtime which will seed to the MFXVideoDECODE_DecodeFrameAsync() as surface_work parameter, the decoder will parse the HDR SEI message if the bitstream include HDR SEI message per frame. The parsed HDR SEI will be attached to the ExtendBuffer of surface_out parameter of MFXVideoDECODE_DecodeFrameAsync() with flag `InsertPayloadToggle` to indicate if there is valid HDR SEI message in the clip. `InsertPayloadToggle` will be set to `MFX_PAYLOAD_IDR` if oneVPL gets valid HDR SEI, otherwise it will be set to `MFX_PAYLOAD_OFF`. This function is support for HEVC only now. Encoding or Decoding, Field semantics are defined in ITU-T* H.265 Annex D, AV1 6.7.4 Metadata OBU semantics. Video processing, `DisplayPrimariesX[3]` and `WhitePointX` are in increments of 0.00002, in the range of [5, 37000]. `DisplayPrimariesY[3]` and `WhitePointY` are in increments of 0.00002, in the range of [5, 42000]. `MaxDisplayMasteringLuminance` is in units of 1 candela per square meter. `MinDisplayMasteringLuminance` is in units of 0.0001 candela per square meter. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME. */ mfxU16 reserved[15]; mfxU16 InsertPayloadToggle; /*!< InsertHDRPayload enumerator value. */ mfxU16 DisplayPrimariesX[3]; /*!< Color primaries for a video source. Consist of RGB x coordinates and define how to convert colors from RGB color space to CIE XYZ color space. */ mfxU16 DisplayPrimariesY[3]; /*!< Color primaries for a video source. Consists of RGB y coordinates and defines how to convert colors from RGB color space to CIE XYZ color space.*/ mfxU16 WhitePointX; /*!< White point X coordinate. */ mfxU16 WhitePointY; /*!< White point Y coordinate. */ mfxU32 MaxDisplayMasteringLuminance; /*!< Specify maximum luminance of the display on which the content was authored.*/ mfxU32 MinDisplayMasteringLuminance; /*!< Specify minimum luminance of the display on which the content was authored. */ } mfxExtMasteringDisplayColourVolume; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Handle the HDR SEI message. During encoding: If the application attaches this structure to the mfxEncodeCtrl structure at runtime, the encoder inserts the HDR SEI message for the current frame and ignores InsertPayloadToggle. If the application attaches this structure to the mfxVideoParam structure during initialization or reset, the encoder inserts the HDR SEI message based on InsertPayloadToggle. During video processing: If the application attaches this structure for video processing, InsertPayloadToggle will be ignored. During decoding: If the application attaches this structure to the mfxFrameSurface1 structure at runtime which will seed to the MFXVideoDECODE_DecodeFrameAsync() as surface_work parameter, the decoder will parse the HDR SEI message if the bitstream include HDR SEI message per frame. The parsed HDR SEI will be attached to the ExtendBuffer of surface_out parameter of MFXVideoDECODE_DecodeFrameAsync() with flag `InsertPayloadToggle` to indicate if there is valid HDR SEI message in the clip. `InsertPayloadToggle` will be set to `MFX_PAYLOAD_IDR` if oneVPL gets valid HDR SEI, otherwise it will be set to `MFX_PAYLOAD_OFF`. This function is support for HEVC only now. Field semantics are defined in ITU-T* H.265 Annex D, AV1 6.7.3 Metadata high dynamic range content light level semantics. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to EXTBUFF_CONTENT_LIGHT_LEVEL_INFO. */ mfxU16 reserved[9]; mfxU16 InsertPayloadToggle; /*!< InsertHDRPayload enumerator value. */ mfxU16 MaxContentLightLevel; /*!< Maximum luminance level of the content. Field range is 1 to 65535. */ mfxU16 MaxPicAverageLightLevel; /*!< Maximum average per-frame luminance level of the content. Field range is 1 to 65535. */ } mfxExtContentLightLevelInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the H.264 picture timing SEI message. The encoder ignores it if HRD information in the stream is absent and the PicTimingSEI option in the mfxExtCodingOption structure is turned off. See mfxExtCodingOption for details. If the application attaches this structure to the mfxVideoParam structure during initialization, the encoder inserts the picture timing SEI message based on provided template in every access unit of coded bitstream. If application attaches this structure to the mfxEncodeCtrl structure at runtime, the encoder inserts the picture timing SEI message based on provided template in access unit that represents current frame. These parameters define the picture timing information. An invalid value of 0xFFFF indicates that application does not set the value and encoder must calculate it. See Annex D of the ISO*\/IEC* 14496-10 specification for the definition of these parameters. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PICTURE_TIMING_SEI. */ mfxU32 reserved[14]; struct { mfxU16 ClockTimestampFlag; mfxU16 CtType; mfxU16 NuitFieldBasedFlag; mfxU16 CountingType; mfxU16 FullTimestampFlag; mfxU16 DiscontinuityFlag; mfxU16 CntDroppedFlag; mfxU16 NFrames; mfxU16 SecondsFlag; mfxU16 MinutesFlag; mfxU16 HoursFlag; mfxU16 SecondsValue; mfxU16 MinutesValue; mfxU16 HoursValue; mfxU32 TimeOffset; } TimeStamp[3]; } mfxExtPictureTimingSEI; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the H.264 temporal layers hierarchy. If the application attaches it to the mfxVideoParam structure during initialization, the encoder generates the temporal layers and inserts the prefix NAL unit before each slice to indicate the temporal and priority IDs of the layer. This structure can be used with the display-order encoding mode only. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_TEMPORAL_LAYERS. */ mfxU32 reserved1[4]; mfxU16 reserved2; mfxU16 BaseLayerPID; /*!< The priority ID of the base layer. The encoder increases the ID for each temporal layer and writes to the prefix NAL unit. */ struct { mfxU16 Scale; /*!< The ratio between the frame rates of the current temporal layer and the base layer. */ mfxU16 reserved[3]; }Layer[8]; } mfxExtAvcTemporalLayers; /*!< The array of temporal layers; Use Scale=0 to specify absent layers. */ MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used to retrieve encoder capability. See the description of mode 4 of the MFXVideoENCODE_Query function for details on how to use this structure. @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE then the functionality is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_CAPABILITY. */ mfxU32 MBPerSec; /*!< Specify the maximum processing rate in macro blocks per second. */ mfxU16 reserved[58]; } mfxExtEncoderCapability; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used to control the encoder behavior during reset. By using this structure, the application instructs the encoder to start a new coded sequence after reset or to continue encoding of the current sequence. This structure is also used in mode 3 of the MFXVideoENCODE_Query function to check for reset outcome before actual reset. The application should set StartNewSequence to the required behavior and call the query function. If the query fails (see status codes below), then reset is not possible in current encoder state. If the application sets StartNewSequence to MFX_CODINGOPTION_UNKNOWN, then the query function replaces the coding option with the actual reset type: MFX_CODINGOPTION_ON if the encoder will begin a new sequence after reset or MFX_CODINGOPTION_OFF if the encoder will continue the current sequence. Using this structure may cause one of the following status codes from the MFXVideoENCODE_Reset and MFXVideoENCODE_Queryfunctions: @li MFX_ERR_INVALID_VIDEO_PARAM If a reset is not possible. For example, the application sets StartNewSequence to off and requests resolution change. @li MFX_ERR_INCOMPATIBLE_VIDEO_PARAM If the application requests change that leads to memory allocation. For example, the application sets StartNewSequence to on and requests resolution change to greater than the initialization value. @li MFX_ERR_NONE If reset is possible. The following limited list of parameters can be changed without starting a new coded sequence: @li The bitrate parameters, TargetKbps and MaxKbps, in the mfxInfoMFX structure. @li The number of slices, NumSlice, in the mfxInfoMFX structure. Number of slices should be equal to or less than the number of slices during initialization. @li The number of temporal layers in the mfxExtAvcTemporalLayers structure. Reset should be called immediately before encoding of frame from base layer and number of reference frames should be large enough for the new temporal layers structure. @li The quantization parameters, QPI, QPP and QPB, in the mfxInfoMFX structure. The application should retrieve all cached frames before calling reset. When the Query API function checks for reset outcome, it expects that this requirement be satisfied. If it is not true and there are some cached frames inside the encoder, then the query result may differ from the reset result, because the encoder may insert an IDR frame to produce valid coded sequence. \verbatim embed:rst See the :ref:`Configuration Change ` section for more information. \endverbatim @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE, then the functionality is supported. \verbatim embed:rst See the :ref:`Streaming and Video Conferencing Features ` section for more information. \endverbatim */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_RESET_OPTION. */ /*! Instructs encoder to start new sequence after reset. Use one of the CodingOptionValue options: @li MFX_CODINGOPTION_ON The encoder completely reset internal state and begins new coded sequence after reset, including insertion of IDR frame, sequence, and picture headers. @li MFX_CODINGOPTION_OFF The encoder continues encoding of current coded sequence after reset, without insertion of IDR frame. @li MFX_CODINGOPTION_UNKNOWN Depending on the current encoder state and changes in configuration parameters, the encoder may or may not start new coded sequence. This value is also used to query reset outcome. */ mfxU16 StartNewSequence; mfxU16 reserved[11]; } mfxExtEncoderResetOption; MFX_PACK_END() /*! The LongTermIdx specifies long term index of picture control. */ enum { MFX_LONGTERM_IDX_NO_IDX = 0xFFFF /*!< Long term index of picture is undefined. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the encoder to report additional information about the encoded picture. The application can attach this buffer to the mfxBitstream structure before calling MFXVideoENCODE_EncodeFrameAsync function. For interlaced content the encoder requires two such structures. They correspond to fields in encoded order. @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE then the functionality is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_FRAME_INFO. */ mfxU32 FrameOrder; /*!< Frame order of encoded picture. */ mfxU16 PicStruct; /*!< Picture structure of encoded picture. */ mfxU16 LongTermIdx; /*!< Long term index of encoded picture if applicable. */ mfxU32 MAD; /*!< Mean Absolute Difference between original pixels of the frame and motion compensated (for inter macroblocks) or spatially predicted (for intra macroblocks) pixels. Only luma component, Y plane, is used in calculation. */ mfxU16 BRCPanicMode; /*!< Bitrate control was not able to allocate enough bits for this frame. Frame quality may be unacceptably low. */ mfxU16 QP; /*!< Luma QP. */ mfxU32 SecondFieldOffset; /*!< Offset to second field. Second field starts at mfxBitstream::Data + mfxBitstream::DataOffset + mfxExtAVCEncodedFrameInfo::SecondFieldOffset. */ mfxU16 reserved[2]; struct { /*! @{ @name Reference Lists The following structure members are used by the reference lists contained in the parent structure. */ mfxU32 FrameOrder; /*!< Frame order of reference picture. */ mfxU16 PicStruct; /*!< Picture structure of reference picture. */ mfxU16 LongTermIdx; /*!< Long term index of reference picture if applicable. */ mfxU16 reserved[4]; /*! @} */ } UsedRefListL0[32], /*!< Reference list that has been used to encode picture. */ UsedRefListL1[32]; /*!< Reference list that has been used to encode picture. */ } mfxExtAVCEncodedFrameInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used to specify input stream details for composition of several input surfaces in the one output. */ typedef struct mfxVPPCompInputStream { mfxU32 DstX; /*!< X coordinate of location of input stream in output surface. */ mfxU32 DstY; /*!< Y coordinate of location of input stream in output surface. */ mfxU32 DstW; /*!< Width of of location of input stream in output surface.*/ mfxU32 DstH; /*!< Height of of location of input stream in output surface.*/ mfxU16 LumaKeyEnable; /*!< Non-zero value enables luma keying for the input stream. Luma keying is used to mark some of the areas of the frame with specified luma values as transparent. It may, for example, be used for closed captioning. */ mfxU16 LumaKeyMin; /*!< Minimum value of luma key, inclusive. Pixels whose luma values fit in this range are rendered transparent. */ mfxU16 LumaKeyMax; /*!< Maximum value of luma key, inclusive. Pixels whose luma values fit in this range are rendered transparent. */ mfxU16 GlobalAlphaEnable; /*!< Non-zero value enables global alpha blending for this input stream. */ mfxU16 GlobalAlpha; /*!< Alpha value for this stream. Should be in the range of 0 to 255, where 0 is transparent and 255 is opaque. */ mfxU16 PixelAlphaEnable; /*!< Non-zero value enables per pixel alpha blending for this input stream. The stream should have RGB color format. */ mfxU16 TileId; /*!< Specify the tile this video stream is assigned to. Should be in the range of 0 to NumTiles. Valid only if NumTiles > 0. */ mfxU16 reserved2[17]; } mfxVPPCompInputStream; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Used to control composition of several input surfaces in one output. In this mode, the VPP skips any other filters. The VPP returns an error if any mandatory filter is specified and returns the filter skipped warning if an optional filter is specified. The only supported filters are deinterlacing and interlaced scaling. The only supported combinations of input and output color formats are: - RGB to RGB, - NV12 to NV12, - RGB and NV12 to NV12, for per the pixel alpha blending use case. The VPP returns MFX_ERR_MORE_DATA for additional input until an output is ready. When the output is ready, the VPP returns MFX_ERR_NONE. The application must process the output frame after synchronization. The composition process is controlled by: - mfxFrameInfo::CropXYWH in the input surface defines the location of the picture in the input frame. - InputStream[i].DstXYWH defines the location of the cropped input picture in the output frame. - mfxFrameInfo::CropXYWH in the output surface defines the actual part of the output frame. All pixels in the output frame outside this region will be filled by the specified color. If the application uses the composition process on video streams with different frame sizes, the application should provide maximum frame size in the mfxVideoParam structure during the initialization, reset, or query operations. If the application uses the composition process, the MFXVideoVPP_QueryIOSurf function returns the cumulative number of input surfaces, that is, the number required to process all input video streams. The function sets the frame size in the mfxFrameAllocRequest equal to the size provided by the application in the mfxVideoParam structure. The composition process supports all types of surfaces. All input surfaces should have the same type and color format, except for the per pixel alpha blending case, where it is allowable to mix NV12 and RGB surfaces. There are three different blending use cases: - Luma keying. All input surfaces should have the NV12 color format specified during VPP initialization. Part of each surface, including the first one, may be rendered transparent by using LumaKeyEnable, LumaKeyMin, and LumaKeyMax values. - Global alpha blending. All input surfaces should have the same color format, NV12 or RGB, specified during VPP initialization. Each input surface, including the first one, can be blended with underlying surfaces by using GlobalAlphaEnable and GlobalAlpha values. - Per-pixel alpha blending. It is allowed to mix NV12 and RGB input surfaces. Each RGB input surface, including the first one, can be blended with underlying surfaces by using PixelAlphaEnable value. It is not allowed to mix different blending use cases in the same function call. In the special case where the destination region of the output surface defined by output crops is fully covered with destination sub-regions of the surfaces, the fast compositing mode can be enabled. The main use case for this mode is a video-wall scenario with a fixed destination surface partition into sub-regions of potentially different size. In order to trigger this mode, the application must cluster input surfaces into tiles, defining at least one tile by setting the NumTiles field to be greater than 0, and assigning surfaces to the corresponding tiles by setting the TileId field to the value within the 0 to NumTiles range per input surface. Tiles should also satisfy the following additional constraints: - Each tile should not have more than 8 surfaces assigned to it. - Tile bounding boxes, as defined by the enclosing rectangles of a union of a surfaces assigned to this tile, should not intersect. Background color may be changed dynamically through Reset. There is no default value. YUV black is (0;128;128) or (16;128;128) depending on the sample range. The library uses a YUV or RGB triple depending on output color format. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COMPOSITE. */ /* background color*/ union { mfxU16 Y; /*!< Y value of the background color. */ mfxU16 R; /*!< R value of the background color. */ }; union { mfxU16 U; /*!< U value of the background color. */ mfxU16 G; /*!< G value of the background color. */ }; union { mfxU16 V; /*!< V value of the background color. */ mfxU16 B; /*!< B value of the background color. */ }; mfxU16 NumTiles; /*!< Number of input surface clusters grouped together to enable fast compositing. May be changed dynamically at runtime through Reset. */ mfxU16 reserved1[23]; mfxU16 NumInputStream; /*!< Number of input surfaces to compose one output. May be changed dynamically at runtime through Reset. Number of surfaces can be decreased or increased, but should not exceed the number specified during initialization. Query mode 2 should be used to find the maximum supported number. */ mfxVPPCompInputStream *InputStream; /*!< An array of mfxVPPCompInputStream structures that describe composition of input video streams. It should consist of exactly NumInputStream elements. */ } mfxExtVPPComposite; MFX_PACK_END() /*! The TransferMatrix enumerator itemizes color transfer matrices. */ enum { MFX_TRANSFERMATRIX_UNKNOWN = 0, /*!< Transfer matrix is not specified */ MFX_TRANSFERMATRIX_BT709 = 1, /*!< Transfer matrix from ITU-R BT.709 standard. */ MFX_TRANSFERMATRIX_BT601 = 2 /*!< Transfer matrix from ITU-R BT.601 standard. */ }; /* The NominalRange enumerator itemizes pixel's value nominal range. */ enum { MFX_NOMINALRANGE_UNKNOWN = 0, /*!< Range is not defined. */ MFX_NOMINALRANGE_0_255 = 1, /*!< Range is from 0 to 255. */ MFX_NOMINALRANGE_16_235 = 2 /*!< Range is from 16 to 235. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used to control transfer matrix and nominal range of YUV frames. The application should provide this during initialization. Supported for multiple conversions, for example YUV to YUV, YUV to RGB, and RGB to YUV. @note This structure is used by VPP only and is not compatible with mfxExtVideoSignalInfo. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO. */ mfxU16 reserved1[4]; union { struct { // Init struct { mfxU16 TransferMatrix; /*!< Transfer matrix. */ mfxU16 NominalRange; /*!< Nominal range. */ mfxU16 reserved2[6]; } In, Out; }; struct { // Runtime< mfxU16 TransferMatrix; /*!< Transfer matrix. */ mfxU16 NominalRange; /*!< Nominal range. */ mfxU16 reserved3[14]; }; }; } mfxExtVPPVideoSignalInfo; MFX_PACK_END() /*! The ROImode enumerator itemizes QP adjustment mode for ROIs. */ enum { MFX_ROI_MODE_PRIORITY = 0, /*!< Priority mode. */ MFX_ROI_MODE_QP_DELTA = 1, /*!< QP mode */ MFX_ROI_MODE_QP_VALUE = 2 /*!< Absolute QP */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the application to specify different Region Of Interests during encoding. It may be used at initialization or at runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_ROI. */ mfxU16 NumROI; /*!< Number of ROI descriptions in array. The Query API function mode 2 returns maximum supported value (set it to 256 and query will update it to maximum supported value). */ mfxU16 ROIMode; /*!< QP adjustment mode for ROIs. Defines if Priority or DeltaQP is used during encoding. */ mfxU16 reserved1[10]; struct { /*! @{ @name ROI location rectangle The ROI rectangle definition uses end-point exclusive notation. In other words, the pixel with (Right, Bottom) coordinates lies immediately outside of the ROI. Left, Top, Right, Bottom should be aligned by codec-specific block boundaries (should be dividable by 16 for AVC, or by 32 for HEVC). Every ROI with unaligned coordinates will be expanded by the library to minimal-area block-aligned ROI, enclosing the original one. For example (5, 5, 15, 31) ROI will be expanded to (0, 0, 16, 32) for AVC encoder, or to (0, 0, 32, 32) for HEVC. */ mfxU32 Left; /*!< Left ROI's coordinate. */ mfxU32 Top; /*!< Top ROI's coordinate. */ mfxU32 Right; /*!< Right ROI's coordinate. */ mfxU32 Bottom; /*!< Bottom ROI's coordinate. */ union { /*! Priority of ROI. Used if ROIMode = MFX_ROI_MODE_PRIORITY.This is an absolute value in the range of -3 to 3, which will be added to the MB QP. Priority is deprecated mode and is used only for backward compatibility. Bigger value produces better quality. */ mfxI16 Priority; /*! Delta QP of ROI. Used if ROIMode = MFX_ROI_MODE_QP_DELTA. This is an absolute value in the range of -51 to 51, which will be added to the MB QP. Lesser value produces better quality. */ mfxI16 DeltaQP; }; mfxU16 reserved2[7]; /*! @} */ } ROI[256]; /*!< Array of ROIs. Different ROI may overlap each other. If macroblock belongs to several ROI, Priority from ROI with lowest index is used. */ } mfxExtEncoderROI; MFX_PACK_END() /*! The DeinterlacingMode enumerator itemizes VPP deinterlacing modes. */ enum { MFX_DEINTERLACING_BOB = 1, /*!< BOB deinterlacing mode. */ MFX_DEINTERLACING_ADVANCED = 2, /*!< Advanced deinterlacing mode. */ MFX_DEINTERLACING_AUTO_DOUBLE = 3, /*!< Auto mode with deinterlacing double frame rate output. */ MFX_DEINTERLACING_AUTO_SINGLE = 4, /*!< Auto mode with deinterlacing single frame rate output. */ MFX_DEINTERLACING_FULL_FR_OUT = 5, /*!< Deinterlace only mode with full frame rate output. */ MFX_DEINTERLACING_HALF_FR_OUT = 6, /*!< Deinterlace only Mode with half frame rate output. */ MFX_DEINTERLACING_24FPS_OUT = 7, /*!< 24 fps fixed output mode. */ MFX_DEINTERLACING_FIXED_TELECINE_PATTERN = 8, /*!< Fixed telecine pattern removal mode. */ MFX_DEINTERLACING_30FPS_OUT = 9, /*!< 30 fps fixed output mode. */ MFX_DEINTERLACING_DETECT_INTERLACE = 10, /*!< Only interlace detection. */ MFX_DEINTERLACING_ADVANCED_NOREF = 11, /*!< Advanced deinterlacing mode without using of reference frames. */ MFX_DEINTERLACING_ADVANCED_SCD = 12, /*!< Advanced deinterlacing mode with scene change detection. */ MFX_DEINTERLACING_FIELD_WEAVING = 13 /*!< Field weaving. */ }; /*! The TelecinePattern enumerator itemizes telecine patterns. */ enum { MFX_TELECINE_PATTERN_32 = 0, /*!< 3:2 telecine. */ MFX_TELECINE_PATTERN_2332 = 1, /*!< 2:3:3:2 telecine. */ MFX_TELECINE_PATTERN_FRAME_REPEAT = 2, /*!< One frame repeat telecine. */ MFX_TELECINE_PATTERN_41 = 3, /*!< 4:1 telecine. */ MFX_TELECINE_POSITION_PROVIDED = 4 /*!< User must provide position inside a sequence of 5 frames where the artifacts start. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the application to specify different deinterlacing algorithms. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DEINTERLACING. */ mfxU16 Mode; /*!< Deinterlacing algorithm. See the DeinterlacingMode enumerator for details. */ mfxU16 TelecinePattern; /*!< Specifies telecine pattern when Mode = MFX_DEINTERLACING_FIXED_TELECINE_PATTERN. See the TelecinePattern enumerator for details.*/ mfxU16 TelecineLocation; /*!< Specifies position inside a sequence of 5 frames where the artifacts start when TelecinePattern = MFX_TELECINE_POSITION_PROVIDED*/ mfxU16 reserved[9]; /*!< Reserved for future use. */ } mfxExtVPPDeinterlacing; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies reference lists for the encoder. It may be used together with the mfxExtAVCRefListCtrl structure to create customized reference lists. If both structures are used together, then the encoder takes reference lists from the mfxExtAVCRefLists structure and modifies them according to the mfxExtAVCRefListCtrl instructions. In case of interlaced coding, the first mfxExtAVCRefLists structure affects TOP field and the second - BOTTOM field. @note Not all implementations of the encoder support this structure. The application must use the Query API function to determine if it is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_REFLISTS. */ mfxU16 NumRefIdxL0Active; /*!< Specify the number of reference frames in the active reference list L0. This number should be less than or equal to the NumRefFrame parameter from encoding initialization. */ mfxU16 NumRefIdxL1Active; /*!< Specify the number of reference frames in the active reference list L1. This number should be less than or equal to the NumRefFrame parameter from encoding initialization. */ mfxU16 reserved[2]; /*! Used by the reference lists contained in the parent structure. Together these fields are used to identify reference picture. */ struct mfxRefPic{ mfxU32 FrameOrder; /*!< Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark unused entry. */ mfxU16 PicStruct; /*!< Use PicStruct = MFX_PICSTRUCT_FIELD_TFF for TOP field, PicStruct = MFX_PICSTRUCT_FIELD_BFF for BOTTOM field. */ mfxU16 reserved[5]; } RefPicList0[32], /*!< Specify L0 reference list. */ RefPicList1[32]; /*!< Specify L1 reference list. */ }mfxExtAVCRefLists; MFX_PACK_END() /*! The VPPFieldProcessingMode enumerator is used to control VPP field processing algorithm. */ enum { MFX_VPP_COPY_FRAME =0x01, /*!< Copy the whole frame. */ MFX_VPP_COPY_FIELD =0x02, /*!< Copy only one field. */ MFX_VPP_SWAP_FIELDS =0x03 /*!< Swap top and bottom fields. */ }; /*! The PicType enumerator itemizes picture type. */ enum { MFX_PICTYPE_UNKNOWN =0x00, /*!< Picture type is unknown. */ MFX_PICTYPE_FRAME =0x01, /*!< Picture is a frame. */ MFX_PICTYPE_TOPFIELD =0x02, /*!< Picture is a top field. */ MFX_PICTYPE_BOTTOMFIELD =0x04 /*!< Picture is a bottom field. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP field processing algorithm. The application can attach this extended buffer to the mfxVideoParam structure to configure initialization and/or to the mfxFrameData during runtime. Runtime configuration has priority over initialization configuration. If the field processing algorithm was activated via the mfxExtVPPDoUse structure and the mfxExtVPPFieldProcessing extended buffer was not provided during initialization, this buffer must be attached to the mfxFrameData structure of each input surface. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_FIELD_PROCESSING. */ mfxU16 Mode; /*!< Specifies the mode of the field processing algorithm. See the VPPFieldProcessingMode enumerator for values of this option. */ mfxU16 InField; /*!< When Mode is MFX_VPP_COPY_FIELD, specifies input field. See the PicType enumerator for values of this parameter. */ mfxU16 OutField; /*!< When Mode is MFX_VPP_COPY_FIELD, specifies output field. See the PicType enumerator for values of this parameter. */ mfxU16 reserved[25]; } mfxExtVPPFieldProcessing; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! If attached to the mfxVideoParam structure during the Init stage, this buffer will instruct the decoder to resize output frames via the fixed function resize engine (if supported by hardware), utilizing direct pipe connection and bypassing intermediate memory operations. The main benefits of this mode of pipeline operation are offloading resize operation to a dedicated engine, thus reducing power consumption and memory traffic. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DEC_VIDEO_PROCESSING. */ /*! Input surface description. */ struct mfxIn{ mfxU16 CropX; /*!< X coordinate of region of interest of the input surface. */ mfxU16 CropY; /*!< Y coordinate of region of interest of the input surface. */ mfxU16 CropW; /*!< Width coordinate of region of interest of the input surface. */ mfxU16 CropH; /*!< Height coordinate of region of interest of the input surface. */ mfxU16 reserved[12]; }In; /*!< Input surface description. */ /*! Output surface description. */ struct mfxOut{ mfxU32 FourCC; /*!< FourCC of output surface Note: Should be MFX_FOURCC_NV12. */ mfxU16 ChromaFormat; /*!< Chroma Format of output surface. @note Should be MFX_CHROMAFORMAT_YUV420 */ mfxU16 reserved1; mfxU16 Width; /*!< Width of output surface. */ mfxU16 Height; /*!< Height of output surface. */ mfxU16 CropX; /*!< X coordinate of region of interest of the output surface. */ mfxU16 CropY; /*!< Y coordinate of region of interest of the output surface. */ mfxU16 CropW; /*!< Width coordinate of region of interest of the output surface. */ mfxU16 CropH; /*!< Height coordinate of region of interest of the output surface. */ mfxU16 reserved[22]; }Out; /*!< Output surface description. */ mfxU16 reserved[13]; } mfxExtDecVideoProcessing; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Members of this structure define the location of chroma samples information. See Annex E of the ISO*\/IEC* 14496-10 specification for the definition of these parameters. @note Not all implementations of the encoder support this structure. The application must use the Query API function to determine if it is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CHROMA_LOC_INFO. */ mfxU16 ChromaLocInfoPresentFlag; mfxU16 ChromaSampleLocTypeTopField; mfxU16 ChromaSampleLocTypeBottomField; mfxU16 reserved[9]; } mfxExtChromaLocInfo; MFX_PACK_END() /*! The MBQPMode enumerator itemizes QP update modes. */ enum { MFX_MBQP_MODE_QP_VALUE = 0, /*!< QP array contains QP values. */ MFX_MBQP_MODE_QP_DELTA = 1, /*!< QP array contains deltas for QP. */ MFX_MBQP_MODE_QP_ADAPTIVE = 2 /*!< QP array contains deltas for QP or absolute QP values. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies per-MB or per-CU mode and QP or DeltaQP value depending on the mode type. */ typedef struct{ union { /*! QP for MB or CU. Valid when Mode = MFX_MBQP_MODE_QP_VALUE. For AVC, the valid range is 1 to 51. For HEVC, the valid range is 1 to 51. The application's provided QP values should be valid, otherwise invalid QP values may cause undefined behavior. MBQP map should be aligned for 16x16 block size. The align rule is: (width +15 /16) && (height +15 /16). For MPEG2, the valid range is 1 to 112. QP corresponds to quantizer_scale of the ISO*\/IEC* 13818-2 specification. */ mfxU8 QP; /*! Per-macroblock QP delta. Valid when Mode = MFX_MBQP_MODE_QP_DELTA. */ mfxI8 DeltaQP; }; mfxU16 Mode; /*!< Defines QP update mode. Can be equal to MFX_MBQP_MODE_QP_VALUE or MFX_MBQP_MODE_QP_DELTA. */ } mfxQPandMode; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Specifies per-macroblock QP for current frame if mfxExtCodingOption3::EnableMBQP was turned ON during encoder initialization. The application can attach this extended buffer to the mfxEncodeCtrl structure during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MBQP. */ #ifdef ONEVPL_EXPERIMENTAL mfxU32 reserved[9]; mfxU32 Pitch; /*!< Distance in bytes between the start of two consecutive rows in the QP array. */ #else mfxU32 reserved[10]; #endif mfxU16 Mode; /*!< Defines QP update mode. See MBQPMode enumerator for more details. */ mfxU16 BlockSize; /*!< QP block size, valid for HEVC only during Init and Runtime. */ mfxU32 NumQPAlloc; /*!< Size of allocated by application QP or DeltaQP array. */ union { /*! Pointer to a list of per-macroblock QP in raster scan order. In case of interlaced encoding the first half of QP array affects the top field and the second half of QP array affects the bottom field. Valid when Mode = MFX_MBQP_MODE_QP_VALUE. For AVC, the valid range is 1 to 51. For HEVC, the valid range is 1 to 51. Application's provided QP values should be valid. Otherwise invalid QP values may cause undefined behavior. MBQP map should be aligned for 16x16 block size. The alignment rule is (width +15 /16) && (height +15 /16). For MPEG2, QP corresponds to quantizer_scale of the ISO*\/IEC* 13818-2 specification and has a valid range of 1 to 112. */ mfxU8 *QP; mfxI8 *DeltaQP; /*!< Pointer to a list of per-macroblock QP deltas in raster scan order. For block i: QP[i] = BrcQP[i] + DeltaQP[i]. Valid when Mode = MFX_MBQP_MODE_QP_DELTA. */ mfxQPandMode *QPmode; /*!< Block-granularity modes when MFX_MBQP_MODE_QP_ADAPTIVE is set. */ mfxU64 reserved2; }; } mfxExtMBQP; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Runtime ctrl buffer for SPS/PPS insertion with current encoding frame. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_INSERT_HEADERS. */ mfxU16 SPS; /*!< Tri-state option to insert SPS. */ mfxU16 PPS; /*!< Tri-state option to insert PPS. */ mfxU16 reserved[8]; } mfxExtInsertHeaders; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies rectangle areas for IPCM coding mode. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_IPCM_AREA. */ mfxU16 reserve1[10]; mfxU16 NumArea; /*! Number of areas */ struct area { mfxU32 Left; /*!< Left area coordinate. */ mfxU32 Top; /*!< Top area coordinate. */ mfxU32 Right; /*!< Right area coordinate. */ mfxU32 Bottom; /*!< Bottom area coordinate. */ mfxU16 reserved2[8]; } * Areas; /*!< Array of areas. */ } mfxExtEncoderIPCMArea; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Specifies macroblock map for current frame which forces specified macroblocks to be encoded as intra if mfxExtCodingOption3::EnableMBForceIntra was turned ON during encoder initialization. The application can attach this extended buffer to the mfxEncodeCtrl structure during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MB_FORCE_INTRA. */ mfxU32 reserved[11]; mfxU32 MapSize; /*!< Macroblock map size. */ union { mfxU8 *Map; /*!< Pointer to a list of force intra macroblock flags in raster scan order. Each flag is one byte in map. Set flag to 1 to force corresponding macroblock to be encoded as intra. In case of interlaced encoding, the first half of map affects top field and the second half of map affects the bottom field. */ mfxU64 reserved2; }; } mfxExtMBForceIntra; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures tiles options for the HEVC encoder. The application can attach this extended buffer to the mfxVideoParam structure to configure initialization. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_TILES. */ mfxU16 NumTileRows; /*!< Number of tile rows. */ mfxU16 NumTileColumns; /*!< Number of tile columns. */ mfxU16 reserved[74]; }mfxExtHEVCTiles; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Specifies macroblock map for current frame which forces specified macroblocks to be non-skip if mfxExtCodingOption3::MBDisableSkipMap was turned ON during encoder initialization. The application can attach this extended buffer to the mfxEncodeCtrl structure during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MB_DISABLE_SKIP_MAP. */ mfxU32 reserved[11]; mfxU32 MapSize; /*!< Macroblock map size. */ union { mfxU8 *Map; /*!< Pointer to a list of non-skip macroblock flags in raster scan order. Each flag is one byte in map. Set flag to 1 to force corresponding macroblock to be non-skip. In case of interlaced encoding, the first half of map affects the top field and the second half of map affects the bottom field. */ mfxU64 reserved2; }; } mfxExtMBDisableSkipMap; MFX_PACK_END() /*! The GeneralConstraintFlags enumerator uses bit-ORed values to itemize HEVC bitstream indications for specific profiles. Each value indicates for format range extensions profiles. To specify HEVC Main 10 Still Picture profile applications have to set mfxInfoMFX::CodecProfile == MFX_PROFILE_HEVC_MAIN10 and mfxExtHEVCParam::GeneralConstraintFlags == MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY. */ enum { /* REXT Profile constraint flags*/ MFX_HEVC_CONSTR_REXT_MAX_12BIT = (1 << 0), MFX_HEVC_CONSTR_REXT_MAX_10BIT = (1 << 1), MFX_HEVC_CONSTR_REXT_MAX_8BIT = (1 << 2), MFX_HEVC_CONSTR_REXT_MAX_422CHROMA = (1 << 3), MFX_HEVC_CONSTR_REXT_MAX_420CHROMA = (1 << 4), MFX_HEVC_CONSTR_REXT_MAX_MONOCHROME = (1 << 5), MFX_HEVC_CONSTR_REXT_INTRA = (1 << 6), MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY = (1 << 7), MFX_HEVC_CONSTR_REXT_LOWER_BIT_RATE = (1 << 8) }; /*! The SampleAdaptiveOffset enumerator uses bit-ORed values to itemize corresponding HEVC encoding feature. */ enum { MFX_SAO_UNKNOWN = 0x00, /*!< Use default value for platform/TargetUsage. */ MFX_SAO_DISABLE = 0x01, /*!< Disable SAO. If set during Init leads to SPS sample_adaptive_offset_enabled_flag = 0. If set during Runtime, leads to to slice_sao_luma_flag = 0 and slice_sao_chroma_flag = 0 for current frame. */ MFX_SAO_ENABLE_LUMA = 0x02, /*!< Enable SAO for luma (slice_sao_luma_flag = 1). */ MFX_SAO_ENABLE_CHROMA = 0x04 /*!< Enable SAO for chroma (slice_sao_chroma_flag = 1). */ }; /* This struct has 4-byte alignment for binary compatibility with previously released versions of API */ MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_PARAM. */ mfxU16 PicWidthInLumaSamples; /*!< Specifies the width of each coded picture in units of luma samples. */ mfxU16 PicHeightInLumaSamples; /*!< Specifies the height of each coded picture in units of luma samples. */ mfxU64 GeneralConstraintFlags; /*!< Additional flags to specify exact profile and constraints. See the GeneralConstraintFlags enumerator for values of this field. */ mfxU16 SampleAdaptiveOffset; /*!< Controls SampleAdaptiveOffset encoding feature. See the SampleAdaptiveOffset enumerator for supported values (bit-ORed). Valid during encoder Init and Runtime. */ mfxU16 LCUSize; /*!< Specifies largest coding unit size (max luma coding block). Valid during encoder Init. */ mfxU16 reserved[116]; } mfxExtHEVCParam; MFX_PACK_END() /*! The ErrorTypes enumerator uses bit-ORed values to itemize bitstream error types. */ enum { MFX_ERROR_NO = 0, /*!< No error in bitstream. */ MFX_ERROR_PPS = (1 << 0), /*!< Invalid/corrupted PPS. */ MFX_ERROR_SPS = (1 << 1), /*!< Invalid/corrupted SPS. */ MFX_ERROR_SLICEHEADER = (1 << 2), /*!< Invalid/corrupted slice header. */ MFX_ERROR_SLICEDATA = (1 << 3), /*!< Invalid/corrupted slice data. */ MFX_ERROR_FRAME_GAP = (1 << 4), /*!< Missed frames. */ MFX_ERROR_JPEG_APP0_MARKER = (1 << 5), /*!< Invalid/corrupted APP0 marker. */ MFX_ERROR_JPEG_APP1_MARKER = (1 << 6), /*!< Invalid/corrupted APP1 marker. */ MFX_ERROR_JPEG_APP2_MARKER = (1 << 7), /*!< Invalid/corrupted APP2 marker. */ MFX_ERROR_JPEG_APP3_MARKER = (1 << 8), /*!< Invalid/corrupted APP3 marker. */ MFX_ERROR_JPEG_APP4_MARKER = (1 << 9), /*!< Invalid/corrupted APP4 marker. */ MFX_ERROR_JPEG_APP5_MARKER = (1 << 10), /*!< Invalid/corrupted APP5 marker. */ MFX_ERROR_JPEG_APP6_MARKER = (1 << 11), /*!< Invalid/corrupted APP6 marker. */ MFX_ERROR_JPEG_APP7_MARKER = (1 << 12), /*!< Invalid/corrupted APP7 marker. */ MFX_ERROR_JPEG_APP8_MARKER = (1 << 13), /*!< Invalid/corrupted APP8 marker. */ MFX_ERROR_JPEG_APP9_MARKER = (1 << 14), /*!< Invalid/corrupted APP9 marker. */ MFX_ERROR_JPEG_APP10_MARKER = (1 << 15), /*!< Invalid/corrupted APP10 marker. */ MFX_ERROR_JPEG_APP11_MARKER = (1 << 16), /*!< Invalid/corrupted APP11 marker. */ MFX_ERROR_JPEG_APP12_MARKER = (1 << 17), /*!< Invalid/corrupted APP12 marker. */ MFX_ERROR_JPEG_APP13_MARKER = (1 << 18), /*!< Invalid/corrupted APP13 marker. */ MFX_ERROR_JPEG_APP14_MARKER = (1 << 19), /*!< Invalid/corrupted APP14 marker. */ MFX_ERROR_JPEG_DQT_MARKER = (1 << 20), /*!< Invalid/corrupted DQT marker. */ MFX_ERROR_JPEG_SOF0_MARKER = (1 << 21), /*!< Invalid/corrupted SOF0 marker. */ MFX_ERROR_JPEG_DHT_MARKER = (1 << 22), /*!< Invalid/corrupted DHT marker. */ MFX_ERROR_JPEG_DRI_MARKER = (1 << 23), /*!< Invalid/corrupted DRI marker. */ MFX_ERROR_JPEG_SOS_MARKER = (1 << 24), /*!< Invalid/corrupted SOS marker. */ MFX_ERROR_JPEG_UNKNOWN_MARKER = (1 << 25), /*!< Unknown Marker. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the decoders to report bitstream error information right after DecodeHeader or DecodeFrameAsync. The application can attach this extended buffer to the mfxBitstream structure at runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DECODE_ERROR_REPORT. */ mfxU32 ErrorTypes; /*!< Bitstream error types (bit-ORed values). See ErrorTypes enumerator for the list of types. */ mfxU16 reserved[10]; } mfxExtDecodeErrorReport; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the decoders to report additional information about a decoded frame. The application can attach this extended buffer to the mfxFrameSurface1::mfxFrameData structure at runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DECODED_FRAME_INFO. */ mfxU16 FrameType; /*!< Frame type. See FrameType enumerator for the list of types. */ mfxU16 reserved[59]; } mfxExtDecodedFrameInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the library to pass MPEG 2 specific timing information. See ISO/IEC 13818-2 and ITU-T H.262, MPEG-2 Part 2 for the definition of these parameters. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_TIME_CODE. */ mfxU16 DropFrameFlag; /*!< Indicated dropped frame. */ mfxU16 TimeCodeHours; /*!< Hours. */ mfxU16 TimeCodeMinutes; /*!< Minutes. */ mfxU16 TimeCodeSeconds; /*!< Seconds. */ mfxU16 TimeCodePictures; /*!< Pictures. */ mfxU16 reserved[7]; } mfxExtTimeCode; MFX_PACK_END() /*! The HEVCRegionType enumerator itemizes type of HEVC region. */ enum { MFX_HEVC_REGION_SLICE = 0 /*!< Slice type. */ }; /*! The HEVCRegionEncoding enumerator itemizes HEVC region's encoding. */ enum { MFX_HEVC_REGION_ENCODING_ON = 0, MFX_HEVC_REGION_ENCODING_OFF = 1 }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Attached to the mfxVideoParam structure during HEVC encoder initialization. Specifies the region to encode. @note Not all implementations of the encoder support this structure. The application must use the Query API function to determine if it is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_REGION. */ mfxU32 RegionId; /*!< ID of region. */ mfxU16 RegionType; /*!< Type of region. See HEVCRegionType enumerator for the list of types. */ mfxU16 RegionEncoding; /*!< Set to MFX_HEVC_REGION_ENCODING_ON to encode only specified region. */ mfxU16 reserved[24]; } mfxExtHEVCRegion; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies weighted prediction table for current frame when all of the following conditions are met: @li mfxExtCodingOption3::WeightedPred was set to explicit during encoder Init or Reset . @li The current frame is P-frame or mfxExtCodingOption3::WeightedBiPred was set to explicit during encoder Init or Reset. @li The current frame is B-frame and is attached to the mfxEncodeCtrl structure. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PRED_WEIGHT_TABLE. */ mfxU16 LumaLog2WeightDenom; /*!< Base 2 logarithm of the denominator for all luma weighting factors. Value must be in the range of 0 to 7, inclusive. */ mfxU16 ChromaLog2WeightDenom; /*!< Base 2 logarithm of the denominator for all chroma weighting factors. Value must be in the range of 0 to 7, inclusive. */ mfxU16 LumaWeightFlag[2][32]; /*!< LumaWeightFlag[L][R] equal to 1 specifies that the weighting factors for the luma component are specified for R's entry of RefPicList L. */ mfxU16 ChromaWeightFlag[2][32]; /*!< ChromaWeightFlag[L][R] equal to 1 specifies that the weighting factors for the chroma component are specified for R's entry of RefPicList L. */ mfxI16 Weights[2][32][3][2]; /*!< The values of the weights and offsets used in the encoding processing. The value of Weights[i][j][k][m] is interpreted as: i refers to reference picture list 0 or 1; j refers to reference list entry 0-31; k refers to data for the luma component when it is 0, the Cb chroma component when it is 1 and the Cr chroma component when it is 2; m refers to weight when it is 0 and offset when it is 1 */ mfxU16 reserved[58]; } mfxExtPredWeightTable; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by encoders to set rounding offset parameters for quantization. It is per-frame based encoding control, and can be attached to some frames and skipped for others. When the extension buffer is set the application can attach it to the mfxEncodeCtrl during runtime. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_ROUNDING_OFFSET. */ mfxU16 EnableRoundingIntra; /*!< Enable rounding offset for intra blocks. See the CodingOptionValue enumerator for values of this option. */ mfxU16 RoundingOffsetIntra; /*!< Intra rounding offset. Value must be in the range of 0 to 7, inclusive. */ mfxU16 EnableRoundingInter; /*!< Enable rounding offset for inter blocks. See the CodingOptionValue enumerator for values of this option. */ mfxU16 RoundingOffsetInter; /*!< Inter rounding offset. Value must be in the range of 0 to 7, inclusive. */ mfxU16 reserved[24]; } mfxExtAVCRoundingOffset; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the application to specify dirty regions within a frame during encoding. It may be used at initialization or at runtime. Dirty rectangle definition is using end-point exclusive notation. In other words, the pixel with (Right, Bottom) coordinates lies immediately outside of the dirty rectangle. Left, Top, Right, Bottom should be aligned by codec-specific block boundaries (should be dividable by 16 for AVC, or by block size (8, 16, 32 or 64, depends on platform) for HEVC). Every dirty rectangle with unaligned coordinates will be expanded to a minimal-area block-aligned dirty rectangle, enclosing the original one. For example, a (5, 5, 15, 31) dirty rectangle will be expanded to (0, 0, 16, 32) for AVC encoder, or to (0, 0, 32, 32) for HEVC, if block size is 32. Dirty rectangle (0, 0, 0, 0) is a valid dirty rectangle and means that the frame is not changed. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DIRTY_RECTANGLES. */ mfxU16 NumRect; /*!< Number of dirty rectangles. */ mfxU16 reserved1[11]; struct { /*! @{ @name Dirty rectangle coordinates The following structure members are used by the Rect array contained in the parent structure. */ mfxU32 Left; /*!< Dirty region left coordinate. */ mfxU32 Top; /*!< Dirty region top coordinate. */ mfxU32 Right; /*!< Dirty region right coordinate. */ mfxU32 Bottom; /*!< Dirty region bottom coordinate. */ mfxU16 reserved2[8]; /*! @} */ } Rect[256]; /*!< Array of dirty rectangles. */ } mfxExtDirtyRect; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by the application to specify moving regions within a frame during encoding. Destination rectangle location should be aligned to MB boundaries (should be dividable by 16). If not, the encoder truncates it to MB boundaries, for example, both 17 and 31 will be truncated to 16. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MOVING_RECTANGLE. */ mfxU16 NumRect; /*!< Number of moving rectangles. */ mfxU16 reserved1[11]; struct { /*! @{ @name Destination and source rectangle location The following structure members are used by the Rect array contained in the parent structure. */ mfxU32 DestLeft; /*!< Destination rectangle location. */ mfxU32 DestTop; /*!< Destination rectangle location. */ mfxU32 DestRight; /*!< Destination rectangle location. */ mfxU32 DestBottom; /*!< Destination rectangle location. */ mfxU32 SourceLeft; /*!< Source rectangle location. */ mfxU32 SourceTop; /*!< Source rectangle location. */ mfxU16 reserved2[4]; /*! @} */ } Rect[256]; /*!< Array of moving rectangles. */ } mfxExtMoveRect; MFX_PACK_END() /*! The Angle enumerator itemizes valid rotation angles. */ enum { MFX_ANGLE_0 = 0, /*!< 0 degrees. */ MFX_ANGLE_90 = 90, /*!< 90 degrees. */ MFX_ANGLE_180 = 180, /*!< 180 degrees. */ MFX_ANGLE_270 = 270 /*!< 270 degrees. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP Rotation filter algorithm. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_ROTATION. */ mfxU16 Angle; /*!< Rotation angle. See Angle enumerator for supported values. */ mfxU16 reserved[11]; } mfxExtVPPRotation; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! Used by the encoder to report additional information about encoded slices. The application can attach this buffer to the mfxBitstream structure before calling the MFXVideoENCODE_EncodeFrameAsync function. @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE, then the functionality is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_SLICES_INFO. */ mfxU16 SliceSizeOverflow; /*!< When mfxExtCodingOption2::MaxSliceSize is used, indicates the requested slice size was not met for one or more generated slices. */ mfxU16 NumSliceNonCopliant; /*!< When mfxExtCodingOption2::MaxSliceSize is used, indicates the number of generated slices exceeds specification limits. */ mfxU16 NumEncodedSlice; /*!< Number of encoded slices. */ mfxU16 NumSliceSizeAlloc; /*!< SliceSize array allocation size. Must be specified by application. */ union { mfxU16 *SliceSize; /*!< Slice size in bytes. Array must be allocated by application. */ mfxU64 reserved1; }; mfxU16 reserved[20]; } mfxExtEncodedSlicesInfo; MFX_PACK_END() /*! The ScalingMode enumerator itemizes variants of scaling filter implementation. */ enum { MFX_SCALING_MODE_DEFAULT = 0, /*!< Default scaling mode. The library selects the most appropriate scaling method. */ MFX_SCALING_MODE_LOWPOWER = 1, /*!< Low power scaling mode which is applicable for library implementations. The exact scaling algorithm is defined by the library. */ MFX_SCALING_MODE_QUALITY = 2, /*!< The best quality scaling mode. */ MFX_SCALING_MODE_VENDOR = 1000, /*!< The enumeration to separate common scaling controls above and vendor specific. */ MFX_SCALING_MODE_INTEL_GEN_COMPUTE = MFX_SCALING_MODE_VENDOR + 1, /*! The mode to run scaling operation on Execution Units (EUs). */ MFX_SCALING_MODE_INTEL_GEN_VDBOX = MFX_SCALING_MODE_VENDOR + 2, /*! The special optimization mode where scaling operation running on SFC (Scaler & Format Converter) is coupled with VDBOX (also known as Multi-Format Codec fixed-function engine). This mode is applicable for DECODE_VPP domain functions. */ MFX_SCALING_MODE_INTEL_GEN_VEBOX = MFX_SCALING_MODE_VENDOR + 3 /*! The special optimization mode where scaling operation running on SFC is coupled with VEBOX (HW video processing pipe). */ }; /*! The InterpolationMode enumerator specifies type of interpolation method used by VPP scaling filter. */ enum { MFX_INTERPOLATION_DEFAULT = 0, /*!< Default interpolation mode for scaling. Library selects the most appropriate scaling method. */ MFX_INTERPOLATION_NEAREST_NEIGHBOR = 1, /*!< Nearest neighbor interpolation method. */ MFX_INTERPOLATION_BILINEAR = 2, /*!< Bilinear interpolation method. */ MFX_INTERPOLATION_ADVANCED = 3 /*!< Advanced interpolation method is defined by each implementation and usually gives best quality. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP Scaling filter algorithm. Not all combinations of ScalingMode and InterpolationMethod are supported in the library. The application must use the Query API function to determine if a combination is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_SCALING. */ mfxU16 ScalingMode; /*!< Scaling mode. See ScalingMode for values. */ mfxU16 InterpolationMethod; /*!< Interpolation mode for scaling algorithm. See InterpolationMode for values. */ mfxU16 reserved[10]; } mfxExtVPPScaling; MFX_PACK_END() typedef mfxExtAVCRefListCtrl mfxExtHEVCRefListCtrl; typedef mfxExtAVCRefLists mfxExtHEVCRefLists; typedef mfxExtAvcTemporalLayers mfxExtHEVCTemporalLayers; typedef mfxExtAVCRefListCtrl mfxExtRefListCtrl; /* The MirroringType enumerator itemizes mirroring types. */ enum { MFX_MIRRORING_DISABLED = 0, MFX_MIRRORING_HORIZONTAL = 1, MFX_MIRRORING_VERTICAL = 2 }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP Mirroring filter algorithm. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_MIRRORING. */ mfxU16 Type; /*!< Mirroring type. See MirroringType for values. */ mfxU16 reserved[11]; } mfxExtVPPMirroring; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Instructs encoder to use or not use samples over specified picture border for inter prediction. Attached to the mfxVideoParam structure. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES. */ mfxU16 StickTop; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. See the CodingOptionValue enumerator for values of this option. */ mfxU16 StickBottom; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. See the CodingOptionValue enumerator for values of this option. */ mfxU16 StickLeft; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. See the CodingOptionValue enumerator for values of this option. */ mfxU16 StickRight; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. See the CodingOptionValue enumerator for values of this option. */ mfxU16 reserved[8]; } mfxExtMVOverPicBoundaries; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Configures the VPP ColorFill filter algorithm. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COLORFILL. */ mfxU16 Enable; /*!< Set to ON makes VPP fill the area between Width/Height and Crop borders. See the CodingOptionValue enumerator for values of this option. */ mfxU16 reserved[11]; } mfxExtVPPColorFill; MFX_PACK_END() /*! The ChromaSiting enumerator defines chroma location. Use bit-OR'ed values to specify the desired location. */ enum { MFX_CHROMA_SITING_UNKNOWN = 0x0000, /*!< Unspecified. */ MFX_CHROMA_SITING_VERTICAL_TOP = 0x0001, /*!< Chroma samples are co-sited vertically on the top with the luma samples. */ MFX_CHROMA_SITING_VERTICAL_CENTER = 0x0002, /*!< Chroma samples are not co-sited vertically with the luma samples. */ MFX_CHROMA_SITING_VERTICAL_BOTTOM = 0x0004, /*!< Chroma samples are co-sited vertically on the bottom with the luma samples. */ MFX_CHROMA_SITING_HORIZONTAL_LEFT = 0x0010, /*!< Chroma samples are co-sited horizontally on the left with the luma samples. */ MFX_CHROMA_SITING_HORIZONTAL_CENTER = 0x0020 /*!< Chroma samples are not co-sited horizontally with the luma samples. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! A hint structure that tunes the VPP Color Conversion algorithm when attached to the mfxVideoParam structure during VPP Init. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COLOR_CONVERSION. */ mfxU16 ChromaSiting; /*!< See ChromaSiting enumerator for details. */ mfxU16 reserved[27]; } mfxExtColorConversion; MFX_PACK_END() /*! The VP9ReferenceFrame enumerator itemizes reference frame type by mfxVP9SegmentParam::ReferenceFrame parameter. */ enum { MFX_VP9_REF_INTRA = 0, /*!< Intra. */ MFX_VP9_REF_LAST = 1, /*!< Last. */ MFX_VP9_REF_GOLDEN = 2, /*!< Golden. */ MFX_VP9_REF_ALTREF = 3 /*!< Alternative reference. */ }; /*! The SegmentIdBlockSize enumerator indicates the block size represented by each segment_id in segmentation map. These values are used with the mfxExtVP9Segmentation::SegmentIdBlockSize parameter. */ enum { MFX_VP9_SEGMENT_ID_BLOCK_SIZE_UNKNOWN = 0, /*!< Unspecified block size. */ MFX_VP9_SEGMENT_ID_BLOCK_SIZE_8x8 = 8, /*!< 8x8 block size. */ MFX_VP9_SEGMENT_ID_BLOCK_SIZE_16x16 = 16, /*!< 16x16 block size. */ MFX_VP9_SEGMENT_ID_BLOCK_SIZE_32x32 = 32, /*!< 32x32 block size. */ MFX_VP9_SEGMENT_ID_BLOCK_SIZE_64x64 = 64, /*!< 64x64 block size. */ }; /*! The SegmentFeature enumerator indicates features enabled for the segment. These values are used with the mfxVP9SegmentParam::FeatureEnabled parameter. */ enum { MFX_VP9_SEGMENT_FEATURE_QINDEX = 0x0001, /*!< Quantization index delta. */ MFX_VP9_SEGMENT_FEATURE_LOOP_FILTER = 0x0002, /*!< Loop filter level delta. */ MFX_VP9_SEGMENT_FEATURE_REFERENCE = 0x0004, /*!< Reference frame. */ MFX_VP9_SEGMENT_FEATURE_SKIP = 0x0008 /*!< Skip. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Contains features and parameters for the segment. */ typedef struct { mfxU16 FeatureEnabled; /*!< Indicates which features are enabled for the segment. See the SegmentFeature enumerator for values for this option. Values from the enumerator can be bit-OR'ed. Support of a particular feature depends on underlying hardware platform. Application can check which features are supported by calling Query. */ mfxI16 QIndexDelta; /*!< Quantization index delta for the segment. Ignored if MFX_VP9_SEGMENT_FEATURE_QINDEX isn't set in FeatureEnabled. Valid range for this parameter is [-255, 255]. If QIndexDelta is out of this range, it will be ignored. If QIndexDelta is within valid range, but sum of base quantization index and QIndexDelta is out of [0, 255], QIndexDelta will be clamped. */ mfxI16 LoopFilterLevelDelta; /*!< Loop filter level delta for the segment. Ignored if MFX_VP9_SEGMENT_FEATURE_LOOP_FILTER is not set in FeatureEnabled. Valid range for this parameter is [-63, 63]. If LoopFilterLevelDelta is out of this range, it will be ignored. If LoopFilterLevelDelta is within valid range, but sum of base loop filter level and LoopFilterLevelDelta is out of [0, 63], LoopFilterLevelDelta will be clamped. */ mfxU16 ReferenceFrame; /*!< Reference frame for the segment. See VP9ReferenceFrame enumerator for values for this option. Ignored if MFX_VP9_SEGMENT_FEATURE_REFERENCE isn't set in FeatureEnabled. */ mfxU16 reserved[12]; } mfxVP9SegmentParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! In the VP9 encoder it is possible to divide a frame into up to 8 segments and apply particular features (like delta for quantization index or for loop filter level) on a per-segment basis. "Uncompressed header" of every frame indicates if segmentation is enabled for the current frame, and (if segmentation enabled) contains full information about features applied to every segment. Every "Mode info block" of a coded frame has segment_id in the range of 0 to 7. To enable Segmentation, the mfxExtVP9Segmentation structure with correct settings should be passed to the encoder. It can be attached to the mfxVideoParam structure during initialization or the MFXVideoENCODE_Reset call (static configuration). If the mfxExtVP9Segmentation buffer isn't attached during initialization, segmentation is disabled for static configuration. If the buffer isn't attached for the Reset call, the encoder continues to use static configuration for segmentation which was the default before this Reset call. If the mfxExtVP9Segmentation buffer with NumSegments=0 is provided during initialization or Reset call, segmentation becomes disabled for static configuration. The buffer can be attached to the mfxEncodeCtrl structure during runtime (dynamic configuration). Dynamic configuration is applied to the current frame only. After encoding of the current frame, the encoder will switch to the next dynamic configuration or to static configuration if dynamic configuration is not provided for next frame). The SegmentIdBlockSize, NumSegmentIdAlloc, and SegmentId parameters represent a segmentation map. Here, the segmentation map is an array of segment_ids (one byte per segment_id) for blocks of size NxN in raster scan order. The size NxN is specified by the application and is constant for the whole frame. If mfxExtVP9Segmentation is attached during initialization and/or during runtime, all three parameters should be set to proper values that do not conflict with each other and with NumSegments. If any of the parameters are not set or any conflict or error in these parameters is detected by the library, the segmentation map will be discarded. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_SEGMENTATION. */ mfxU16 NumSegments; /*!< Number of segments for frame. Value 0 means that segmentation is disabled. Sending 0 for a particular frame will disable segmentation for this frame only. Sending 0 to the Reset API function will disable segmentation permanently. Segmentation can be enabled again by a subsequent Reset call. */ mfxVP9SegmentParam Segment[8]; /*!< Array of mfxVP9SegmentParam structures containing features and parameters for every segment. Entries with indexes bigger than NumSegments-1 are ignored. See the mfxVP9SegmentParam structure for definitions of segment features and their parameters. */ mfxU16 SegmentIdBlockSize; /*!< Size of block (NxN) for segmentation map. See SegmentIdBlockSize enumerator for values for this option. An encoded block that is bigger than SegmentIdBlockSize uses segment_id taken from it's top-left sub-block from the segmentation map. The application can check if a particular block size is supported by calling Query. */ mfxU32 NumSegmentIdAlloc; /*!< Size of buffer allocated for segmentation map (in bytes). Application must assure that NumSegmentIdAlloc is large enough to cover frame resolution with blocks of size SegmentIdBlockSize. Otherwise the segmentation map will be discarded. */ union { mfxU8 *SegmentId; /*!< Pointer to the segmentation map buffer which holds the array of segment_ids in raster scan order. The application is responsible for allocation and release of this memory. The buffer pointed to by SegmentId, provided during initialization or Reset call should be considered in use until another SegmentId is provided via Reset call (if any), or until MFXVideoENCODE_Close is called. The buffer pointed to by SegmentId provided with mfxEncodeCtrl should be considered in use while the input surface is locked by the library. Every segment_id in the map should be in the range of 0 to NumSegments-1. If some segment_id is out of valid range, the segmentation map cannot be applied. If the mfxExtVP9Segmentation buffer is attached to the mfxEncodeCtrl structure in runtime, SegmentId can be zero. In this case, the segmentation map from static configuration will be used. */ mfxU64 reserved1; }; mfxU16 reserved[52]; } mfxExtVP9Segmentation; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Specifies temporal layer. */ typedef struct { mfxU16 FrameRateScale; /*!< The ratio between the frame rates of the current temporal layer and the base layer. The library treats a particular temporal layer as "defined" if it has FrameRateScale > 0. If the base layer is defined, it must have FrameRateScale = 1. FrameRateScale of each subsequent layer (if defined) must be a multiple of and greater than the FrameRateScale value of previous layer. */ mfxU16 TargetKbps; /*!< Target bitrate for the current temporal layer. Ignored if RateControlMethod is CQP. If RateControlMethod is not CQP, the application must provide TargetKbps for every defined temporal layer. TargetKbps of each subsequent layer (if defined) must be greater than the TargetKbps value of the previous layer. */ mfxU16 reserved[14]; } mfxVP9TemporalLayer; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! API allows the encoding of VP9 bitstreams that contain several subset bitstreams that differ in frame rates, also called "temporal layers". When decoding, each temporal layer can be extracted from the coded stream and decoded separately. The mfxExtVP9TemporalLayers structure configures the temporal layers for the VP9 encoder. It can be attached to the mfxVideoParam structure during initialization or the MFXVideoENCODE_Reset call. If the mfxExtVP9TemporalLayers buffer isn't attached during initialization, temporal scalability is disabled. If the buffer isn't attached for the Reset call, the encoder continues to use the temporal scalability configuration that was defined before the Reset call. In the API, temporal layers are ordered by their frame rates in ascending order. Temporal layer 0 (having the lowest frame rate) is called the base layer. Each subsequent temporal layer includes all previous layers. The temporal scalability feature requires a minimum number of allocated reference frames (controlled by the NumRefFrame parameter). If the NumRefFrame value set by the application isn't enough to build the reference structure for the requested number of temporal layers, the library corrects the NumRefFrame value. The temporal layer structure is reset (re-started) after key-frames. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_TEMPORAL_LAYERS. */ /*! The array of temporal layers. Layer[0] specifies the base layer. The library reads layers from the array when they are defined (FrameRateScale > 0). All layers starting from first layer with FrameRateScale = 0 are ignored. The last layer that is not ignored is considered the "highest layer". The frame rate of the highest layer is specified in the mfxVideoParam structure. Frame rates of lower layers are calculated using their FrameRateScale. TargetKbps of the highest layer should be equal to the TargetKbps value specified in the mfxVideoParam structure. If it is not true, TargetKbps of highest temporal layers has priority. If there are no defined layers in the Layer array, the temporal scalability feature is disabled. For example, to disable temporal scalability in runtime, the application should pass mfxExtVP9TemporalLayers buffer to Reset with all FrameRateScales set to 0. */ mfxVP9TemporalLayer Layer[8]; mfxU16 reserved[60]; } mfxExtVP9TemporalLayers; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Structure attached to the mfxVideoParam structure. Extends the mfxVideoParam structure with VP9-specific parameters. Used by both decoder and encoder. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_PARAM. */ mfxU16 FrameWidth; /*!< Width of the coded frame in pixels. */ mfxU16 FrameHeight; /*!< Height of the coded frame in pixels. */ mfxU16 WriteIVFHeaders; /*!< Set this option to ON to make the encoder insert IVF container headers to the output stream. The NumFrame field of the IVF sequence header will be zero. It is the responsibility of the application to update the NumFrame field with the correct value. See the CodingOptionValue enumerator for values of this option. */ mfxI16 reserved1[6]; mfxI16 QIndexDeltaLumaDC; /*!< Specifies an offset for a particular quantization parameter. */ mfxI16 QIndexDeltaChromaAC; /*!< Specifies an offset for a particular quantization parameter. */ mfxI16 QIndexDeltaChromaDC; /*!< Specifies an offset for a particular quantization parameter. */ /*! Number of tile rows. Should be power of two. The maximum number of tile rows is 4, per the VP9 specification. In addition, the maximum supported number of tile rows may depend on the underlying library implementation. Use the Query API function to check if a particular pair of values (NumTileRows, NumTileColumns) is supported. In VP9, tile rows have dependencies and cannot be encoded or decoded in parallel. Therefore, tile rows are always encoded by the library in serial mode (one-by-one). */ mfxU16 NumTileRows; /*! Number of tile columns. Should be power of two. Restricted with maximum and minimum tile width in luma pixels, as defined in the VP9 specification (4096 and 256 respectively). In addition, the maximum supported number of tile columns may depend on the underlying library implementation. Use the Query API function to check if a particular pair of values (NumTileRows, NumTileColumns) is supported. In VP9, tile columns do not have dependencies and can be encoded/decoded in parallel. Therefore, tile columns can be encoded by the library in both parallel and serial modes. Parallel mode is automatically utilized by the library when NumTileColumns exceeds 1 and does not exceed the number of tile coding engines on the platform. In other cases, serial mode is used. Parallel mode is capable of encoding more than 1 tile row (within limitations provided by VP9 specification and particular platform). Serial mode supports only tile grids 1xN and Nx1. */ mfxU16 NumTileColumns; mfxU16 reserved[110]; } mfxExtVP9Param; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used to report encoded unit information. */ typedef struct { mfxU16 Type; /*!< Codec-dependent coding unit type (NALU type for AVC/HEVC, start_code for MPEG2 etc). */ mfxU16 reserved1; mfxU32 Offset; /*!< Offset relative to the associated mfxBitstream::DataOffset. */ mfxU32 Size; /*!< Unit size, including delimiter. */ mfxU32 reserved[5]; } mfxEncodedUnitInfo; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_L_TYPE() /*! If mfxExtCodingOption3::EncodedUnitsInfo was set to MFX_CODINGOPTION_ON during encoder initialization, the mfxExtEncodedUnitsInfo structure is attached to the mfxBitstream structure during encoding. It is used to report information about coding units in the resulting bitstream. The number of filled items in UnitInfo is min(NumUnitsEncoded, NumUnitsAlloc). For counting a minimal amount of encoded units you can use the following algorithm: @code nSEI = amountOfApplicationDefinedSEI; if (CodingOption3.NumSlice[IPB] != 0 || mfxVideoParam.mfx.NumSlice != 0) ExpectedAmount = 10 + nSEI + Max(CodingOption3.NumSlice[IPB], mfxVideoParam.mfx.NumSlice); else if (CodingOption2.NumMBPerSlice != 0) ExpectedAmount = 10 + nSEI + (FrameWidth * FrameHeight) / (256 * CodingOption2.NumMBPerSlice); else if (CodingOption2.MaxSliceSize != 0) ExpectedAmount = 10 + nSEI + Round(MaxBitrate / (FrameRate*CodingOption2.MaxSliceSize)); else ExpectedAmount = 10 + nSEI; if (mfxFrameInfo.PictStruct != MFX_PICSTRUCT_PROGRESSIVE) ExpectedAmount = ExpectedAmount * 2; if (temporalScaleabilityEnabled) ExpectedAmount = ExpectedAmount * 2; @endcode @note Only supported by the AVC encoder. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_UNITS_INFO. */ union { mfxEncodedUnitInfo *UnitInfo; /*!< Pointer to an array of mfxEncodedUnitsInfo structures whose size is equal to or greater than NumUnitsAlloc. */ mfxU64 reserved1; }; mfxU16 NumUnitsAlloc; /*!< UnitInfo array size. */ mfxU16 NumUnitsEncoded; /*!< Output field. Number of coding units to report. If NumUnitsEncoded is greater than NumUnitsAlloc, the UnitInfo array will contain information only for the first NumUnitsAlloc units. User may consider reallocating the UnitInfo array to avoid this for subsequent frames. */ mfxU16 reserved[22]; } mfxExtEncodedUnitsInfo; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Provides setup for the Motion-Compensated Temporal Filter (MCTF) during the VPP initialization and for control parameters at runtime. By default, MCTF is off. An application may enable it by adding MFX_EXTBUFF_VPP_MCTF to the mfxExtVPPDoUse buffer or by attaching mfxExtVppMctf to the mfxVideoParam structure during initialization or reset. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_MCTF. */ mfxU16 FilterStrength; /*!< Value in range of 0 to 20 (inclusive) to indicate the filter strength of MCTF. The strength of the MCTF process controls the degree of possible change of pixel values eligible for MCTF - the greater the strength value, the larger the change. It is a dimensionless quantity - values in the range of 1 to 20 inclusively imply strength; value 0 stands for AUTO mode and is valid during initialization or reset only If an invalid value is given, it is fixed to the default value of 0. If the field value is in the range of 1 to 20 inclusive, MCTF operates in fixed-strength mode with the given strength of MCTF process. At runtime, values of 0 and greater than 20 are ignored. */ mfxU16 reserved[27]; } mfxExtVppMctf; MFX_PACK_END() /*! Describes type of workload passed to MFXQueryAdapters. */ typedef enum { MFX_COMPONENT_ENCODE = 1, /*!< Encode workload. */ MFX_COMPONENT_DECODE = 2, /*!< Decode workload. */ MFX_COMPONENT_VPP = 3 /*!< VPP workload. */ } mfxComponentType; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Contains workload description, which is accepted by MFXQueryAdapters function. */ typedef struct { mfxComponentType Type; /*!< Type of workload: Encode, Decode, VPP. See mfxComponentType enumerator for values. */ mfxVideoParam Requirements; /*!< Detailed description of workload. See mfxVideoParam for details. */ mfxU16 reserved[4]; } mfxComponentInfo; MFX_PACK_END() /* Adapter description */ MFX_PACK_BEGIN_USUAL_STRUCT() /*! Contains a description of the graphics adapter for the Legacy mode. */ typedef struct { mfxPlatform Platform; /*!< Platform type description. See mfxPlatform for details. */ mfxU32 Number; /*!< Value which uniquely characterizes media adapter. On Windows* this number can be used for initialization through DXVA interface (see example). */ mfxU16 reserved[14]; } mfxAdapterInfo; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Contains description of all graphics adapters available on the current system. */ typedef struct { mfxAdapterInfo * Adapters; /*!< Pointer to array of mfxAdapterInfo structs allocated by user. */ mfxU32 NumAlloc; /*!< Length of Adapters array. */ mfxU32 NumActual; /*!< Number of Adapters entries filled by MFXQueryAdapters. */ mfxU16 reserved[4]; } mfxAdaptersInfo; MFX_PACK_END() /*! The PartialBitstreamOutput enumerator indicates flags of partial bitstream output type. */ enum { MFX_PARTIAL_BITSTREAM_NONE = 0, /*!< Do not use partial output */ MFX_PARTIAL_BITSTREAM_SLICE = 1, /*!< Partial bitstream output will be aligned to slice granularity */ MFX_PARTIAL_BITSTREAM_BLOCK = 2, /*!< Partial bitstream output will be aligned to user-defined block size granularity */ MFX_PARTIAL_BITSTREAM_ANY = 3 /*!< Partial bitstream output will be return any coded data available at the end of SyncOperation timeout */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Used by an encoder to output parts of the bitstream as soon as they are ready. The application can attach this extended buffer to the mfxVideoParam structure at initialization. If this option is turned ON (Granularity != MFX_PARTIAL_BITSTREAM_NONE), then the encoder can output bitstream by part based on the required granularity. This parameter is valid only during initialization and reset. Absence of this buffer means default or previously configured bitstream output behavior. @note Not all codecs and implementations support this feature. Use the Query API function to check if this feature is supported. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM. */ mfxU32 BlockSize; /*!< Output block granularity for PartialBitstreamGranularity. Valid only for MFX_PARTIAL_BITSTREAM_BLOCK. */ mfxU16 Granularity; /*!< Granularity of the partial bitstream: slice/block/any, all types of granularity state in PartialBitstreamOutput enum. */ mfxU16 reserved[8]; } mfxExtPartialBitstreamParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The mfxExtDeviceAffinityMask structure is used by the application to specify affinity mask for the device with given device ID. See mfxDeviceDescription for the device ID definition and sub device indexes. If the implementation manages CPU threads for some purpose, the user can set the CPU thread affinity mask by using this structure with DeviceID set to "CPU". */ typedef struct { /*! Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DEVICE_AFFINITY_MASK. */ mfxExtBuffer Header; /*! Null terminated string with device ID. In case of CPU affinity mask it must be equal to "CPU". */ mfxChar DeviceID[MFX_STRFIELD_LEN]; /*! Number of sub devices or threads in case of CPU in the mask. */ mfxU32 NumSubDevices; /*! Mask array. Every bit represents sub-device (or thread for CPU). "1" means execution is allowed. "0" means that execution is prohibited on this sub-device (or thread). Length of the array is equal to the: "NumSubDevices / 8" and rounded to the closest (from the right) integer. Bits order within each entry of the mask array is LSB: bit 0 holds data for sub device with index 0 and bit 8 for sub device with index 8. Index of sub device is defined by the mfxDeviceDescription structure. */ mfxU8 *Mask; mfxU32 reserved[4]; /*! Reserved for future use. */ } mfxExtDeviceAffinityMask; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure is used by AV1 encoder with more parameter control to encode frame. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_BITSTREAM_PARAM. */ mfxU16 WriteIVFHeaders; /*!< Tri-state option to control IVF headers insertion, default is ON. Writing IVF headers is enabled in the encoder when mfxExtAV1BitstreamParam is attached and its value is ON or zero. Writing IVF headers is disabled by default in the encoder when mfxExtAV1BitstreamParam is not attached. */ mfxU16 reserved[31]; } mfxExtAV1BitstreamParam; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure is used by AV1 encoder with more parameter control to encode frame. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_RESOLUTION_PARAM. */ mfxU32 FrameWidth; /*!< Width of the coded frame in pixels, default value is from mfxFrameInfo. */ mfxU32 FrameHeight; /*!< Height of the coded frame in pixels, default value is from mfxFrameInfo. */ mfxU32 reserved[6]; } mfxExtAV1ResolutionParam; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure is used by AV1 encoder with more parameter control to encode frame. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_TILE_PARAM. */ mfxU16 NumTileRows; /*!< Number of tile rows, default value is 1. */ mfxU16 NumTileColumns; /*!< Number of tile columns, default value is 1. */ mfxU16 NumTileGroups; /*!< Number of tile groups, it will be ignored if the tile groups num is invalid, default value is 1. */ mfxU16 reserved[5]; } mfxExtAV1TileParam; MFX_PACK_END() /*! The AV1 SegmentIdBlockSize enumerator indicates the block size represented by each segment_id in segmentation map. These values are used with the mfxExtAV1Segmentation::SegmentIdBlockSize parameter. */ typedef enum { MFX_AV1_SEGMENT_ID_BLOCK_SIZE_UNSPECIFIED = 0, /*!< Unspecified block size. */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_4x4 = 4, /*!< block size 4x4 */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_8x8 = 8, /*!< block size 8x8 */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_16x16 = 16, /*!< block size 16x16 */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_32x32 = 32, /*!< block size 32x32 */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_64x64 = 64, /*!< block size 64x64 */ MFX_AV1_SEGMENT_ID_BLOCK_SIZE_128x128 = 128 /*!< block size 128x128 */ } mfxAV1SegmentIdBlockSize; /*! The AV1 SegmentFeature enumerator indicates features enabled for the segment. These values are used with the mfxAV1SegmentParam::FeatureEnabled parameter. */ enum { MFX_AV1_SEGMENT_FEATURE_ALT_QINDEX = 0x0001, /*!< use alternate Quantizer. */ MFX_AV1_SEGMENT_FEATURE_ALT_LF_Y_VERT = 0x0002, /*!< use alternate loop filter value on y plane vertical. */ MFX_AV1_SEGMENT_FEATURE_ALT_LF_Y_HORZ = 0x0004, /*!< use alternate loop filter value on y plane horizontal. */ MFX_AV1_SEGMENT_FEATURE_ALT_LF_U = 0x0008, /*!< use alternate loop filter value on u plane. */ MFX_AV1_SEGMENT_FEATURE_ALT_LF_V = 0x0010, /*!< use alternate loop filter value on v plane. */ MFX_AV1_SEGMENT_FEATURE_REFERENCE = 0x0020, /*!< use segment reference frame. */ MFX_AV1_SEGMENT_FEATURE_SKIP = 0x0040, /*!< use segment (0,0) + skip mode. */ MFX_AV1_SEGMENT_FEATURE_GLOBALMV = 0x0080 /*!< use global motion vector. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Contains features and parameters for the segment. */ typedef struct { mfxU16 FeatureEnabled; /*!< Indicates which features are enabled for the segment. See the AV1 SegmentFeature enumerator for values for this option. Values from the enumerator can be bit-OR'ed. Support of a particular feature depends on underlying hardware platform. Application can check which features are supported by calling Query. */ mfxI16 AltQIndex; /*!< Quantization index delta for the segment. Ignored if MFX_AV1_SEGMENT_FEATURE_ALT_QINDEX isn't set in FeatureEnabled. Valid range for this parameter is [-255, 255]. If AltQIndex is out of this range, it will be ignored. If AltQIndex is within valid range, but sum of base quantization index and AltQIndex is out of [0, 255], AltQIndex will be clamped. */ mfxU16 reserved[30]; } mfxAV1SegmentParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! In the AV1 encoder it is possible to divide a frame into up to 8 segments and apply particular features (like delta for quantization index or for loop filter level) on a per-segment basis. "Uncompressed header" of every frame indicates if segmentation is enabled for the current frame, and (if segmentation enabled) contains full information about features applied to every segment. Every "Mode info block" of a coded frame has segment_id in the range of 0 to 7. To enable Segmentation, the mfxExtAV1Segmentation structure with correct settings should be passed to the encoder. It can be attached to the mfxVideoParam structure during initialization or the MFXVideoENCODE_Reset call (static configuration). If the mfxExtAV1Segmentation buffer isn't attached during initialization, segmentation is disabled for static configuration. If the buffer isn't attached for the Reset call, the encoder continues to use static configuration for segmentation which was the default before this Reset call. If the mfxExtAV1Segmentation buffer with NumSegments=0 is provided during initialization or Reset call, segmentation becomes disabled for static configuration. The buffer can be attached to the mfxEncodeCtrl structure during runtime (dynamic configuration). Dynamic configuration is applied to the current frame only. After encoding of the current frame, the encoder will switch to the next dynamic configuration or to static configuration if dynamic configuration is not provided for next frame). The SegmentIdBlockSize, NumSegmentIdAlloc, and SegmentId parameters represent a segmentation map. Here, the segmentation map is an array of segment_ids (one byte per segment_id) for blocks of size NxN in raster scan order. The size NxN is specified by the application and is constant for the whole frame. If mfxExtAV1Segmentation is attached during initialization and/or during runtime, all three parameters should be set to proper values that do not conflict with each other and with NumSegments. If any of the parameters are not set or any conflict or error in these parameters is detected by the library, the segmentation map will be discarded. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_SEGMENTATION. */ mfxU8 NumSegments; /*!< Number of segments for frame. Value 0 means that segmentation is disabled. Sending 0 for a particular frame will disable segmentation for this frame only. Sending 0 to the Reset API function will disable segmentation permanently. Segmentation can be enabled again by a subsequent Reset call. */ mfxU8 reserved1[3]; mfxAV1SegmentParam Segment[8]; /*!< Array of mfxAV1SegmentParam structures containing features and parameters for every segment. Entries with indexes bigger than NumSegments-1 are ignored. See the mfxAV1SegmentParam structure for definitions of segment features and their parameters. */ mfxU16 SegmentIdBlockSize;/*!< Size of block (NxN) for segmentation map. See AV1 SegmentIdBlockSize enumerator for values for this option. An encoded block that is bigger than AV1 SegmentIdBlockSize uses segment_id taken from it's top-left sub-block from the segmentation map. The application can check if a particular block size is supported by calling Query. */ mfxU16 reserved2; mfxU32 NumSegmentIdAlloc; /*!< Size of buffer allocated for segmentation map (in bytes). Application must assure that NumSegmentIdAlloc is large enough to cover frame resolution with blocks of size SegmentIdBlockSize. Otherwise the segmentation map will be discarded. */ mfxU8 * SegmentIds; /*!< Pointer to the segmentation map buffer which holds the array of segment_ids in raster scan order. The application is responsible for allocation and release of this memory. The buffer pointed to by SegmentId, provided during initialization or Reset call should be considered in use until another SegmentId is provided via Reset call (if any), or until MFXVideoENCODE_Close is called. The buffer pointed to by SegmentId provided with mfxEncodeCtrl should be considered in use while the input surface is locked by the library. Every segment_id in the map should be in the range of 0 to NumSegments-1. If some segment_id is out of valid range, the segmentation map cannot be applied. If the mfxExtAV1Segmentation buffer is attached to the mfxEncodeCtrl structure in runtime, SegmentId can be zero. In this case, the segmentation map from static configuration will be used. */ mfxU16 reserved[36]; } mfxExtAV1Segmentation; MFX_PACK_END() /*! The FilmGrainFlags enumerator itemizes flags in AV1 film grain parameters. The flags are equivalent to respective syntax elements from film_grain_params() section of uncompressed header. */ enum { MFX_FILM_GRAIN_NO = 0, /*!< Film grain isn't added to this frame. */ MFX_FILM_GRAIN_APPLY = (1 << 0), /*!< Film grain is added to this frame. */ MFX_FILM_GRAIN_UPDATE = (1 << 1), /*!< New set of film grain parameters is sent for this frame. */ MFX_FILM_GRAIN_CHROMA_SCALING_FROM_LUMA = (1 << 2), /*!< Chroma scaling is inferred from luma scaling. */ MFX_FILM_GRAIN_OVERLAP = (1 << 3), /*!< Overlap between film grain blocks is applied. */ MFX_FILM_GRAIN_CLIP_TO_RESTRICTED_RANGE = (1 << 4) /*!< Clipping to the restricted (studio) range is applied after adding the film grain. */ }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Defines film grain point. */ typedef struct { mfxU8 Value; /*!< The x coordinate for the i-th point of the piece-wise linear scaling function for luma/Cb/Cr component. */ mfxU8 Scaling; /*!< The scaling (output) value for the i-th point of the piecewise linear scaling function for luma/Cb/Cr component. */ } mfxAV1FilmGrainPoint; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure is used by AV-1 decoder to report film grain parameters for decoded frame. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM. */ mfxU16 FilmGrainFlags; /*!< Bit map with bit-ORed flags from FilmGrainFlags enum. */ mfxU16 GrainSeed; /*!< Starting value for pseudo-random numbers used during film grain synthesis. */ mfxU8 RefIdx; /*!< Indicate which reference frame contains the film grain parameters to be used for this frame. */ mfxU8 NumYPoints; /*!< The number of points for the piece-wise linear scaling function of the luma component. */ mfxU8 NumCbPoints; /*!< The number of points for the piece-wise linear scaling function of the Cb component. */ mfxU8 NumCrPoints; /*!< The number of points for the piece-wise linear scaling function of the Cr component.*/ mfxAV1FilmGrainPoint PointY[14]; /*!< The array of points for luma component. */ mfxAV1FilmGrainPoint PointCb[10]; /*!< The array of points for Cb component. */ mfxAV1FilmGrainPoint PointCr[10]; /*!< The array of points for Cr component. */ mfxU8 GrainScalingMinus8; /*!< The shift - 8 applied to the values of the chroma component. The grain_scaling_minus_8 can take values of 0..3 and determines the range and quantization step of the standard deviation of film grain.*/ mfxU8 ArCoeffLag; /*!< The number of auto-regressive coefficients for luma and chroma.*/ mfxU8 ArCoeffsYPlus128[24]; /*!< Auto-regressive coefficients used for the Y plane. */ mfxU8 ArCoeffsCbPlus128[25]; /*!< Auto-regressive coefficients used for the Cb plane. */ mfxU8 ArCoeffsCrPlus128[25]; /*!< The number of points for the piece-wise linear scaling function of the Cr component.*/ mfxU8 ArCoeffShiftMinus6; /*!< The range of the auto-regressive coefficients. Values of 0, 1, 2, and 3 correspond to the ranges for auto-regressive coefficients of [-2, 2), [-1, 1), [-0.5, 0.5) and [-0.25, 0.25) respectively.*/ mfxU8 GrainScaleShift; /*!< Downscaling factor of the grain synthesis process for the Gaussian random numbers .*/ mfxU8 CbMult; /*!< The multiplier for the Cb component used in derivation of the input index to the Cb component scaling function.*/ mfxU8 CbLumaMult; /*!< The multiplier for the average luma component used in derivation of the input index to the Cb component scaling function. */ mfxU16 CbOffset; /*!< The offset used in derivation of the input index to the Cb component scaling function.*/ mfxU8 CrMult; /*!< The multiplier for the Cr component used in derivation of the input index to the Cr component scaling function.*/ mfxU8 CrLumaMult; /*!< The multiplier for the average luma component used in derivation of the input index to the Cr component scaling function.*/ mfxU16 CrOffset; /*!< The offset used in derivation of the input index to the Cr component scaling function.*/ mfxU16 reserved[43]; } mfxExtAV1FilmGrainParam; MFX_PACK_END() #define MFX_SURFACEARRAY_VERSION MFX_STRUCT_VERSION(1, 0) MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure is reference counted object to return array of surfaces allocated and processed by the library. */ typedef struct mfxSurfaceArray { mfxHDL Context; /*!< The context of the memory interface. User should not touch (change, set, null) this pointer. */ mfxStructVersion Version; /*!< The version of the structure. */ mfxU16 reserved[3]; /*! @brief Increments the internal reference counter of the surface. The surface is not destroyed until the surface is released using the mfxSurfaceArray::Release function. mfxSurfaceArray::AddRef should be used each time a new link to the surface is created (for example, copy structure) for proper surface management. @param[in] surface Valid mfxSurfaceArray. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *AddRef)(struct mfxSurfaceArray* surface_array); /*! @brief Decrements the internal reference counter of the surface. mfxSurfaceArray::Release should be called after using the mfxSurfaceArray::AddRef function to add a surface or when allocation logic requires it. @param[in] surface_array Valid mfxSurfaceArray. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of surface is zero before call. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Release)(struct mfxSurfaceArray* surface_array); /*! @brief Returns current reference counter of mfxSurfaceArray structure. @param[in] surface Valid surface_array. @param[out] counter Sets counter to the current reference counter value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If surface or counter is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxSurfaceArray* surface_array, mfxU32* counter); mfxFrameSurface1** Surfaces; /*!< The array of pointers to mfxFrameSurface1. mfxFrameSurface1 surfaces are allocated by the same agent who allocates mfxSurfaceArray. */ mfxU32 NumSurfaces; /*! 0. If the base layer is defined, it must have FrameRateScale = 1. FrameRateScale of each subsequent layer (if defined) must be a multiple of and greater than the FrameRateScale value of previous layer. */ mfxU16 reserved[3]; /*!< Reserved for future use. */ union { /*!< Type of bitrate controls is currently the same across all temporal layers and inherits from common parameters. */ struct { mfxU32 InitialDelayInKB;/*!< Initial size of the Video Buffering Verifier (VBV) buffer for the current temporal layer. @note In this context, KB is 1000 bytes and Kbps is 1000 bps. */ mfxU32 BufferSizeInKB; /*!< Represents the maximum possible size of any compressed frames for the current temporal layer. */ mfxU32 TargetKbps; /*!< Target bitrate for the current temporal layer. If RateControlMethod is not CQP, the application can provide TargetKbps for every defined temporal layer. If TargetKbps per temporal layer is not set then encoder doesn't apply any special bitrate limitations for the layer. */ mfxU32 MaxKbps; /*!< The maximum bitrate at which the encoded data enters the Video Buffering Verifier (VBV) buffer for the current temporal layer. */ mfxU32 reserved1[16]; /*!< Reserved for future use. */ }; struct { mfxI32 QPI; /*!< Quantization Parameter (QP) for I-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPI might be clipped to supported QPI range. @note Default QPI value is implementation dependent and subject to change without additional notice in this document. */ mfxI32 QPP; /*!< Quantization Parameter (QP) for P-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPP might be clipped to supported QPI range. @note Default QPP value is implementation dependent and subject to change without additional notice in this document. */ mfxI32 QPB; /*!< Quantization Parameter (QP) for B-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. Non-zero QPI might be clipped to supported QPB range. @note Default QPB value is implementation dependent and subject to change without additional notice in this document. */ }; }; mfxU16 reserved2[4]; /*!< Reserved for future use. */ } mfxTemporalLayer; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure is used for universal temporal layers description. */ typedef struct { mfxExtBuffer Header; /*! Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS. */ mfxU16 NumLayers; /*!< The number of temporal layers. */ mfxU16 BaseLayerPID; /*!< The priority ID of the base layer. The encoder increases the ID for each temporal layer and writes to the prefix NAL unit for AVC and HEVC. */ mfxU16 reserved[2]; /*!< Reserved for future use. */ mfxTemporalLayer *Layers; /*!< The array of temporal layers. */ mfxU16 reserved1[8]; /*!< Reserved for future use. */ } mfxExtTemporalLayers; MFX_PACK_END() #ifdef ONEVPL_EXPERIMENTAL MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure is used to get a synchronization object which signalizes about submission of a task to GPU. */ typedef struct { mfxExtBuffer Header; /*! Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_SYNCSUBMISSION. */ mfxSyncPoint *SubmissionSyncPoint; /*!< SyncPoint object to get a moment of a submission task to GPU. */ mfxU32 reserved1[8]; /*!< Reserved for future use. */ } mfxExtSyncSubmission; MFX_PACK_END() #endif #ifdef ONEVPL_EXPERIMENTAL MFX_PACK_BEGIN_USUAL_STRUCT() /*! The structure is used to configure perceptual encoding prefilter in VPP. */ typedef struct { mfxExtBuffer Header; /*! Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_PERC_ENC_PREFILTER. */ mfxU16 reserved[252]; } mfxExtVPPPercEncPrefilter; MFX_PACK_END() #endif #ifdef ONEVPL_EXPERIMENTAL /*! The TuneQuality enumerator specifies tuning option for encode. Multiple tuning options can be combined using bit mask. */ enum { MFX_ENCODE_TUNE_DEFAULT = 0, /*!< The balanced option to keep quality balanced across all metrics. */ MFX_ENCODE_TUNE_PSNR = 0x1, /*!< The encoder optimizes quality according to Peak Signal-to-Noise Ratio (PSNR) metric. */ MFX_ENCODE_TUNE_SSIM = 0x2, /*!< The encoder optimizes quality according to Structural Similarity Index Measure (SSIM) metric. */ MFX_ENCODE_TUNE_MS_SSIM = 0x4, /*!< The encoder optimizes quality according to Multi-Scale Structural Similarity Index Measure (MS-SSIM) metric. */ MFX_ENCODE_TUNE_VMAF = 0x8, /*!< The encoder optimizes quality according to Video Multi-Method Assessment Fusion (VMAF) metric. */ MFX_ENCODE_TUNE_PERCEPTUAL = 0x10, /*!< The encoder makes perceptual quality optimization. */ }; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! The structure specifies type of quality optimization used by the encoder. The buffer can also be attached for VPP functions to make correspondent pre-filtering. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_TUNE_ENCODE_QUALITY. */ mfxU32 TuneQuality; /*!< The control to specify type of encode quality metric(s) to optimize; See correspondent enum. */ mfxExtBuffer** ExtParam; /*!< Points to an array of pointers to the extra configuration structures; see the ExtendedBufferID enumerator for a list of extended configurations. */ mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to the structure. */ mfxU16 reserved[11]; } mfxExtTuneEncodeQuality; MFX_PACK_END() #endif #ifdef ONEVPL_EXPERIMENTAL /* The mfxAutoSelectImplType enumerator specifies the method for automatically selecting an implementation. */ typedef enum { MFX_AUTO_SELECT_IMPL_TYPE_UNKNOWN = 0, /*!< Unspecified automatic implementation selection. */ MFX_AUTO_SELECT_IMPL_TYPE_DEVICE_HANDLE = 1, /*!< Select implementation corresponding to device handle. */ } mfxAutoSelectImplType; MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies that an implementation should be selected which matches the device handle provided by the application. */ typedef struct { mfxAutoSelectImplType AutoSelectImplType; /*!< Must be set to MFX_AUTO_SELECT_IMPL_TYPE_DEVICE_HANDLE. */ mfxAccelerationMode AccelMode; /*!< Hardware acceleration mode of provided device handle. */ mfxHandleType DeviceHandleType; /*!< Type of provided device handle. */ mfxHDL DeviceHandle; /*!< System handle to hardware device. */ mfxU16 reserved[8]; /*!< Reserved for future use. */ } mfxAutoSelectImplDeviceHandle; MFX_PACK_END() #endif #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxsurfacepool.h000066400000000000000000000211721443134507600240520ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFX_SURFACE_POOL_H__ #define __MFX_SURFACE_POOL_H__ #include "mfxstructures.h" /*! GUID to obtain mfxSurfacePoolInterface. */ static const mfxGUID MFX_GUID_SURFACE_POOL = {{0x35, 0x24, 0xf3, 0xda, 0x96, 0x4e, 0x47, 0xf1, 0xaf, 0xb4, 0xec, 0xb1, 0x15, 0x08, 0x06, 0xb1}}; //*! Specifies type of pool for VPP component. */ typedef enum { MFX_VPP_POOL_IN = 0, /*!< Input pool. */ MFX_VPP_POOL_OUT = 1 /*!< Output pool. */ } mfxVPPPoolType; MFX_PACK_BEGIN_USUAL_STRUCT() /*! The extension buffer specifies surface pool management policy. Absence of the attached buffer means MFX_ALLOCATION_UNLIMITED policy: each call of GetSurfaceForXXX leads to surface allocation. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ALLOCATION_HINTS. */ mfxPoolAllocationPolicy AllocationPolicy; /*!< Allocation policy. */ /*! How many surfaces to allocate during Init. It's applicable for any polices set by mfxPoolAllocationPolicy::AllocationPolicy even if the requested number exceeds recommended size of the pool. */ mfxU32 NumberToPreAllocate; /*! DeltaToAllocateOnTheFly specifies how many surfaces are allocated in addition to NumberToPreAllocate in MFX_ALLOCATION_LIMITED mode. Maximum number of allocated frames will be NumberToPreAllocate + DeltaToAllocateOnTheFly. */ mfxU32 DeltaToAllocateOnTheFly; union { mfxVPPPoolType VPPPoolType; /*!< Defines what VPP pool is targeted - input or output. Ignored for other components. */ mfxU32 reserved; }; mfxU32 Wait; /*!< Time in milliseconds for GetSurfaceForXXX() and DecodeFrameAsync functions to wait until surface will be available. */ mfxU32 reserved1[4]; /*!< Reserved for future use */ } mfxExtAllocationHints; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Specifies the surface pool interface. */ typedef struct mfxSurfacePoolInterface { mfxHDL Context; /*!< The context of the surface pool interface. User should not touch (change, set, null) this pointer. */ /*! @brief Increments the internal reference counter of the mfxSurfacePoolInterface. The mfxSurfacePoolInterface is not destroyed until the mfxSurfacePoolInterface is destroyed with mfxSurfacePoolInterface::Release function. mfxSurfacePoolInterface::AddRef should be used each time a new link to the mfxSurfacePoolInterface is created for proper management. @param[in] pool Valid pool. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *AddRef)(struct mfxSurfacePoolInterface *pool); /*! @brief Decrements the internal reference counter of the mfxSurfacePoolInterface. mfxSurfacePoolInterface::Release should be called after using the mfxSurfacePoolInterface::AddRef function to add a mfxSurfacePoolInterface or when allocation logic requires it. For example, call mfxSurfacePoolInterface::Release to release a mfxSurfacePoolInterface obtained with the mfxFrameSurfaceInterface::QueryInterface function. @param[in] pool Valid pool. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of mfxSurfacePoolInterface is zero before call. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *Release)(struct mfxSurfacePoolInterface *pool); /*! @brief Returns current reference counter of mfxSurfacePoolInterface structure. @param[in] pool Valid pool. @param[out] counter Sets counter to the current reference counter value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool or counter is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxSurfacePoolInterface *pool, mfxU32* counter); /*! @brief The function should be called by oneVPL components or application to specify how many surfaces it will use concurrently. Internally, oneVPL allocates surfaces in the shared pool according to the component's policy set by mfxPoolAllocationPolicy. The exact moment of surfaces allocation is defined by the component and generally independent from that call. @param[in] pool Valid pool. @param[in] num_surfaces The number of surfaces required by the component. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM If pool has MFX_ALLOCATION_UNLIMITED or MFX_ALLOCATION_LIMITED policy. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *SetNumSurfaces)(struct mfxSurfacePoolInterface *pool, mfxU32 num_surfaces); /*! @brief The function should be called by oneVPL components when component is closed or reset and doesn't need to use pool more. It helps to manage memory accordingly and release redundant memory. Important to specify the same number of surfaces which is requested during SetNumSurfaces call, otherwise it may lead to the pipeline stalls. @param[in] pool Valid pool. @param[in] num_surfaces The number of surfaces used by the component. @return MFX_ERR_NONE If no error. \n MFX_WRN_OUT_OF_RANGE If num_surfaces doesn't equal to num_surfaces requested during SetNumSurfaces call. \n MFX_ERR_NULL_PTR If pool is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM If pool has MFX_ALLOCATION_UNLIMITED or MFX_ALLOCATION_LIMITED policy. \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *RevokeSurfaces)(struct mfxSurfacePoolInterface *pool, mfxU32 num_surfaces); /*! @brief Returns current allocation policy. @param[in] pool Valid pool. @param[out] policy Sets policy to the current allocation policy value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool or policy is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetAllocationPolicy)(struct mfxSurfacePoolInterface *pool, mfxPoolAllocationPolicy *policy); /*! @brief Returns maximum pool size. In case of mfxPoolAllocationPolicy::MFX_ALLOCATION_UNLIMITED policy 0xFFFFFFFF will be returned. @param[in] pool Valid pool. @param[out] size Sets size to the maximum pool size value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool or size is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetMaximumPoolSize)(struct mfxSurfacePoolInterface *pool, mfxU32 *size); /*! @brief Returns current pool size. @param[in] pool Valid pool. @param[out] size Sets size to the current pool size value. @return MFX_ERR_NONE If no error. \n MFX_ERR_NULL_PTR If pool or size is NULL. \n MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n MFX_ERR_UNKNOWN Any internal error. */ mfxStatus (MFX_CDECL *GetCurrentPoolSize)(struct mfxSurfacePoolInterface *pool, mfxU32 *size); mfxHDL reserved[4]; /*!< Reserved for future use. */ } mfxSurfacePoolInterface; MFX_PACK_END() #endif /* __MFX_SURFACE_POOL_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxvideo++.h000066400000000000000000000517061443134507600227720ustar00rootroot00000000000000/*########################################################################### # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ###########################################################################*/ #ifndef __MFXVIDEOPLUSPLUS_H #define __MFXVIDEOPLUSPLUS_H #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD #include "vpl/mfx.h" #define MFX_IMPL_ACCELMODE(x) (0xff00 & (x)) #else #include "mfxvideo.h" #endif class MFXVideoSessionBase { public: virtual ~MFXVideoSessionBase() {} virtual mfxStatus Init(mfxIMPL impl, mfxVersion* ver) = 0; virtual mfxStatus InitEx(mfxInitParam par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxStatus QueryIMPL(mfxIMPL* impl) = 0; virtual mfxStatus QueryVersion(mfxVersion* version) = 0; virtual mfxStatus JoinSession(mfxSession child_session) = 0; virtual mfxStatus DisjoinSession() = 0; virtual mfxStatus CloneSession(mfxSession* clone) = 0; virtual mfxStatus SetPriority(mfxPriority priority) = 0; virtual mfxStatus GetPriority(mfxPriority* priority) = 0; virtual mfxStatus SetFrameAllocator(mfxFrameAllocator* allocator) = 0; virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) = 0; virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL* hdl) = 0; virtual mfxStatus QueryPlatform(mfxPlatform* platform) = 0; virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) = 0; virtual mfxStatus GetSurfaceForEncode(mfxFrameSurface1** output_surf) = 0; virtual mfxStatus GetSurfaceForDecode(mfxFrameSurface1** output_surf) = 0; virtual mfxStatus GetSurfaceForVPP(mfxFrameSurface1** output_surf) = 0; virtual mfxStatus GetSurfaceForVPPOut(mfxFrameSurface1** output_surf) = 0; virtual operator mfxSession(void) = 0; }; class MFXVideoENCODEBase { public: virtual ~MFXVideoENCODEBase() {} virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest* request) = 0; virtual mfxStatus Init(mfxVideoParam* par) = 0; virtual mfxStatus Reset(mfxVideoParam* par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; virtual mfxStatus GetEncodeStat(mfxEncodeStat* stat) = 0; virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl* ctrl, mfxFrameSurface1* surface, mfxBitstream* bs, mfxSyncPoint* syncp) = 0; virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) = 0; }; class MFXVideoDECODEBase { public: virtual ~MFXVideoDECODEBase() {} virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; virtual mfxStatus DecodeHeader(mfxBitstream* bs, mfxVideoParam* par) = 0; virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest* request) = 0; virtual mfxStatus Init(mfxVideoParam* par) = 0; virtual mfxStatus Reset(mfxVideoParam* par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; virtual mfxStatus GetDecodeStat(mfxDecodeStat* stat) = 0; virtual mfxStatus GetPayload(mfxU64* ts, mfxPayload* payload) = 0; virtual mfxStatus SetSkipMode(mfxSkipMode mode) = 0; virtual mfxStatus DecodeFrameAsync(mfxBitstream* bs, mfxFrameSurface1* surface_work, mfxFrameSurface1** surface_out, mfxSyncPoint* syncp) = 0; virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) = 0; }; class MFXVideoVPPBase { public: virtual ~MFXVideoVPPBase() {} virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest request[2]) = 0; virtual mfxStatus Init(mfxVideoParam* par) = 0; virtual mfxStatus Reset(mfxVideoParam* par) = 0; virtual mfxStatus Close(void) = 0; virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; virtual mfxStatus GetVPPStat(mfxVPPStat* stat) = 0; virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1* in, mfxFrameSurface1* out, mfxExtVppAuxData* aux, mfxSyncPoint* syncp) = 0; virtual mfxStatus GetSurfaceIn(mfxFrameSurface1** output_surf) = 0; virtual mfxStatus GetSurfaceOut(mfxFrameSurface1** output_surf) = 0; virtual mfxStatus ProcessFrameAsync(mfxFrameSurface1* in, mfxFrameSurface1** out) = 0; }; class MFXVideoSession : public MFXVideoSessionBase { public: MFXVideoSession(void) { m_session = (mfxSession)0; #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD m_loader = (mfxLoader)0; #endif } virtual ~MFXVideoSession(void) { Close(); } virtual mfxStatus Init(mfxIMPL impl, mfxVersion *ver) override { #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD mfxInitParam par = {}; par.Implementation = impl; par.Version = *ver; return InitSession(par); #else return MFXInit(impl, ver, &m_session); #endif } virtual mfxStatus InitEx(mfxInitParam par) override { #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD return InitSession(par); #else return MFXInitEx(par, &m_session); #endif } virtual mfxStatus Close(void) override { #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD if (m_session) { mfxStatus mfxRes; mfxRes = MFXClose(m_session); m_session = (mfxSession)0; if (m_loader) { MFXUnload(m_loader); m_loader = (mfxLoader)0; } return mfxRes; } else { return MFX_ERR_NONE; } #else mfxStatus mfxRes; mfxRes = MFXClose(m_session); m_session = (mfxSession)0; return mfxRes; #endif } virtual mfxStatus QueryIMPL(mfxIMPL *impl) override { return MFXQueryIMPL(m_session, impl); } virtual mfxStatus QueryVersion(mfxVersion *version) override { return MFXQueryVersion(m_session, version); } virtual mfxStatus JoinSession(mfxSession child_session) override { return MFXJoinSession(m_session, child_session); } virtual mfxStatus DisjoinSession() override { return MFXDisjoinSession(m_session); } virtual mfxStatus CloneSession(mfxSession *clone) override { return MFXCloneSession(m_session, clone); } virtual mfxStatus SetPriority(mfxPriority priority) override { return MFXSetPriority(m_session, priority); } virtual mfxStatus GetPriority(mfxPriority *priority) override { return MFXGetPriority(m_session, priority); } virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) override { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) override { return MFXVideoCORE_SetHandle(m_session, type, hdl); } virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) override { return MFXVideoCORE_GetHandle(m_session, type, hdl); } virtual mfxStatus QueryPlatform(mfxPlatform *platform) override { return MFXVideoCORE_QueryPlatform(m_session, platform); } virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) override { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } virtual mfxStatus GetSurfaceForEncode(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForEncode(m_session, output_surf); } virtual mfxStatus GetSurfaceForDecode(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForDecode(m_session, output_surf); } virtual mfxStatus GetSurfaceForVPP (mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForVPP (m_session, output_surf); } virtual mfxStatus GetSurfaceForVPPOut(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForVPPOut(m_session, output_surf); } virtual operator mfxSession(void) override { return m_session; } protected: mfxSession m_session; // (mfxSession) handle to the owning session #ifdef MFXVIDEO_CPP_ENABLE_MFXLOAD mfxLoader m_loader; inline void InitVariant(mfxVariant *var, mfxU32 data) { var->Version.Version = (mfxU16)MFX_VARIANT_VERSION; var->Type = MFX_VARIANT_TYPE_U32; var->Data.U32 = data; } inline void InitVariant(mfxVariant *var, mfxU16 data) { var->Version.Version = (mfxU16)MFX_VARIANT_VERSION; var->Type = MFX_VARIANT_TYPE_U16; var->Data.U16 = data; } inline void InitVariant(mfxVariant *var, mfxHDL data) { var->Version.Version = (mfxU16)MFX_VARIANT_VERSION; var->Type = MFX_VARIANT_TYPE_PTR; var->Data.Ptr = data; } template mfxStatus CreateConfig(varDataType data, const char *propertyName) { mfxConfig cfg = MFXCreateConfig(m_loader); if (cfg == nullptr) return MFX_ERR_NULL_PTR; mfxVariant variant; InitVariant(&variant, data); return MFXSetConfigFilterProperty(cfg, (mfxU8 *)propertyName, variant); } mfxStatus InitSession(mfxInitParam par) { // already initialized if (m_session) return MFX_ERR_NONE; m_loader = MFXLoad(); if (!m_loader) return MFX_ERR_NOT_FOUND; mfxStatus mfxRes = MFX_ERR_NONE; mfxU32 implBaseType = MFX_IMPL_BASETYPE(par.Implementation); // select implementation type switch (implBaseType) { case MFX_IMPL_AUTO: case MFX_IMPL_AUTO_ANY: break; case MFX_IMPL_SOFTWARE: mfxRes = CreateConfig(MFX_IMPL_TYPE_SOFTWARE, "mfxImplDescription.Impl"); break; case MFX_IMPL_HARDWARE: case MFX_IMPL_HARDWARE_ANY: case MFX_IMPL_HARDWARE2: case MFX_IMPL_HARDWARE3: case MFX_IMPL_HARDWARE4: mfxRes = CreateConfig(MFX_IMPL_TYPE_HARDWARE, "mfxImplDescription.Impl"); break; default: mfxRes = MFX_ERR_UNSUPPORTED; break; } if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; // select adapter index (if specified) // see notes below about how VendorImplID is interpreted for each acceleration mode switch (implBaseType) { case MFX_IMPL_HARDWARE: mfxRes = CreateConfig(0, "mfxImplDescription.VendorImplID"); break; case MFX_IMPL_HARDWARE2: mfxRes = CreateConfig(1, "mfxImplDescription.VendorImplID"); break; case MFX_IMPL_HARDWARE3: mfxRes = CreateConfig(2, "mfxImplDescription.VendorImplID"); break; case MFX_IMPL_HARDWARE4: mfxRes = CreateConfig(3, "mfxImplDescription.VendorImplID"); break; } if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; mfxU32 implAccelMode = MFX_IMPL_ACCELMODE(par.Implementation); if (implAccelMode == MFX_IMPL_VIA_D3D9) { // D3D9 - because VendorImplID corresponds to DXGI adapter index (DX11 enumeration), // this may not map directly to D3D9 index in multi-adapter/multi-monitor configurations mfxRes = CreateConfig(MFX_ACCEL_MODE_VIA_D3D9, "mfxImplDescription.AccelerationMode"); } else if (implAccelMode == MFX_IMPL_VIA_D3D11) { // D3D11 - VendorImplID corresponds to DXGI adapter index mfxRes = CreateConfig(MFX_ACCEL_MODE_VIA_D3D11, "mfxImplDescription.AccelerationMode"); } else if (implAccelMode == MFX_IMPL_VIA_VAAPI) { // VAAPI - in general MFXInitEx treats any HARDWAREn the same way (relies on application to pass // correct VADisplay via SetHandle), but 2.x RT only reports actual number of adapters mfxRes = CreateConfig(MFX_ACCEL_MODE_VIA_VAAPI, "mfxImplDescription.AccelerationMode"); } if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; // set required API level mfxRes = CreateConfig(par.Version.Version, "mfxImplDescription.ApiVersion.Version"); if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; // set GPUCopy parameter if (par.GPUCopy) { mfxRes = CreateConfig(par.GPUCopy, "DeviceCopy"); if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; } // ExternalThreads was deprecated in API 2.x along with MFXDoWork() if (par.ExternalThreads) { return MFX_ERR_UNSUPPORTED; } // pass extBufs if (par.NumExtParam) { for (mfxU32 idx = 0; idx < par.NumExtParam; idx++) { mfxRes = CreateConfig(par.ExtParam[idx], "ExtBuffer"); if (MFX_ERR_NONE != mfxRes) return MFX_ERR_UNSUPPORTED; } } // create session with highest priority implementation remaining after filters mfxRes = MFXCreateSession(m_loader, 0, &m_session); return mfxRes; } #endif private: MFXVideoSession(const MFXVideoSession &); void operator=(MFXVideoSession &); }; class MFXVideoENCODE : public MFXVideoENCODEBase { public: explicit MFXVideoENCODE(mfxSession session) { m_session = session; } virtual ~MFXVideoENCODE(void) { Close(); } virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { return MFXVideoENCODE_Query(m_session, in, out); } virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) override { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } virtual mfxStatus Init(mfxVideoParam *par) override { return MFXVideoENCODE_Init(m_session, par); } virtual mfxStatus Reset(mfxVideoParam *par) override { return MFXVideoENCODE_Reset(m_session, par); } virtual mfxStatus Close(void) override { return MFXVideoENCODE_Close(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { return MFXVideoENCODE_GetVideoParam(m_session, par); } virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) override { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) override { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForEncode(m_session, output_surf); } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; class MFXVideoDECODE : public MFXVideoDECODEBase { public: explicit MFXVideoDECODE(mfxSession session) { m_session = session; } virtual ~MFXVideoDECODE(void) { Close(); } virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { return MFXVideoDECODE_Query(m_session, in, out); } virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) override { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) override { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } virtual mfxStatus Init(mfxVideoParam *par) override { return MFXVideoDECODE_Init(m_session, par); } virtual mfxStatus Reset(mfxVideoParam *par) override { return MFXVideoDECODE_Reset(m_session, par); } virtual mfxStatus Close(void) override { return MFXVideoDECODE_Close(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { return MFXVideoDECODE_GetVideoParam(m_session, par); } virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override { return MFXVideoDECODE_GetPayload(m_session, ts, payload); } virtual mfxStatus SetSkipMode(mfxSkipMode mode) override { return MFXVideoDECODE_SetSkipMode(m_session, mode); } virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) override { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForDecode(m_session, output_surf); } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; class MFXVideoVPP : public MFXVideoVPPBase { public: explicit MFXVideoVPP(mfxSession session) { m_session = session; } virtual ~MFXVideoVPP(void) { Close(); } virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { return MFXVideoVPP_Query(m_session, in, out); } virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) override { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } virtual mfxStatus Init(mfxVideoParam *par) override { return MFXVideoVPP_Init(m_session, par); } virtual mfxStatus Reset(mfxVideoParam *par) override { return MFXVideoVPP_Reset(m_session, par); } virtual mfxStatus Close(void) override { return MFXVideoVPP_Close(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { return MFXVideoVPP_GetVideoParam(m_session, par); } virtual mfxStatus GetVPPStat(mfxVPPStat *stat) override { return MFXVideoVPP_GetVPPStat(m_session, stat); } virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) override { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } virtual mfxStatus GetSurfaceIn(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForVPP(m_session, output_surf); } virtual mfxStatus GetSurfaceOut(mfxFrameSurface1** output_surf) override { return MFXMemory_GetSurfaceForVPPOut(m_session, output_surf); } virtual mfxStatus ProcessFrameAsync(mfxFrameSurface1 *in, mfxFrameSurface1 **out) override { return MFXVideoVPP_ProcessFrameAsync(m_session, in, out); } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; class MFXVideoDECODE_VPP { public: explicit MFXVideoDECODE_VPP(mfxSession session) { m_session = session; } virtual ~MFXVideoDECODE_VPP(void) { Close(); } virtual mfxStatus Init(mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { return MFXVideoDECODE_VPP_Init(m_session, decode_par, vpp_par_array, num_channel_par); } virtual mfxStatus Reset(mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { return MFXVideoDECODE_VPP_Reset(m_session, decode_par, vpp_par_array, num_channel_par); } virtual mfxStatus GetChannelParam(mfxVideoChannelParam *par, mfxU32 channel_id) { return MFXVideoDECODE_VPP_GetChannelParam(m_session, par, channel_id); } virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray **surf_array_out) { return MFXVideoDECODE_VPP_DecodeFrameAsync(m_session, bs, skip_channels, num_skip_channels, surf_array_out); } virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_VPP_DecodeHeader(m_session, bs, par); } virtual mfxStatus Close(void) { return MFXVideoDECODE_VPP_Close(m_session); } virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_VPP_GetVideoParam(m_session, par); } virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_VPP_GetDecodeStat(m_session, stat); } virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) { return MFXVideoDECODE_VPP_GetPayload(m_session, ts, payload); } virtual mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_VPP_SetSkipMode(m_session, mode); } protected: mfxSession m_session; // (mfxSession) handle to the owning session }; #endif //__MFXVIDEOPLUSPLUS_H oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxvideo.h000066400000000000000000001657351443134507600226540ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXVIDEO_H__ #define __MFXVIDEO_H__ #include "mfxsession.h" #include "mfxstructures.h" #ifdef __cplusplus extern "C" { #endif MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes the API callback functions Alloc, Lock, Unlock, GetHDL, and Free that the implementation might use for allocating internal frames. Applications that operate on OS-specific video surfaces must implement these API callback functions. Using the default allocator implies that frame data passes in or out of functions through pointers, as opposed to using memory IDs. Behavior is undefined when using an incompletely defined external allocator. \verbatim embed:rst See the :ref:`Memory Allocation and External Allocators section ` for additional information. \endverbatim */ typedef struct { mfxU32 reserved[4]; mfxHDL pthis; /*!< Pointer to the allocator object. */ /*! @brief Allocates surface frames. For decoders, MFXVideoDECODE_Init calls Alloc only once. That call includes all frame allocation requests. For encoders, MFXVideoENCODE_Init calls Alloc twice: once for the input surfaces and again for the internal reconstructed surfaces. If two library components must share DirectX* surfaces, this function should pass the pre-allocated surface chain to the library instead of allocating new DirectX surfaces. \verbatim embed:rst See the :ref:`Surface Pool Allocation section ` for additional information. \endverbatim @param[in] pthis Pointer to the allocator object. @param[in] request Pointer to the mfxFrameAllocRequest structure that specifies the type and number of required frames. @param[out] response Pointer to the mfxFrameAllocResponse structure that retrieves frames actually allocated. @return MFX_ERR_NONE The function successfully allocated the memory block. \n MFX_ERR_MEMORY_ALLOC The function failed to allocate the video frames. \n MFX_ERR_UNSUPPORTED The function does not support allocating the specified type of memory. */ mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); /*! @brief Locks a frame and returns its pointer. @param[in] pthis Pointer to the allocator object. @param[in] mid Memory block ID. @param[out] ptr Pointer to the returned frame structure. @return MFX_ERR_NONE The function successfully locked the memory block. \n MFX_ERR_LOCK_MEMORY This function failed to lock the frame. */ mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); /*! @brief Unlocks a frame and invalidates the specified frame structure. @param[in] pthis Pointer to the allocator object. @param[in] mid Memory block ID. @param[out] ptr Pointer to the frame structure. This pointer can be NULL. @return MFX_ERR_NONE The function successfully locked the memory block. */ mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); /*! @brief Returns the OS-specific handle associated with a video frame. If the handle is a COM interface, the reference counter must increase. The library will release the interface afterward. @param[in] pthis Pointer to the allocator object. @param[in] mid Memory block ID. @param[out] handle Pointer to the returned OS-specific handle. @return MFX_ERR_NONE The function successfully returned the OS-specific handle. \n MFX_ERR_UNSUPPORTED The function does not support obtaining OS-specific handle.. */ mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); /*! @brief De-allocates all allocated frames. @param[in] pthis Pointer to the allocator object. @param[in] response Pointer to the mfxFrameAllocResponse structure returned by the Alloc function. @return MFX_ERR_NONE The function successfully de-allocated the memory block. */ mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); } mfxFrameAllocator; MFX_PACK_END() /*! @brief Sets the external allocator callback structure for frame allocation. If the allocator argument is NULL, the library uses the default allocator, which allocates frames from system memory or hardware devices. The behavior of the API is undefined if it uses this function while the previous allocator is in use. A general guideline is to set the allocator immediately after initializing the session. @param[in] session Session handle. @param[in] allocator Pointer to the mfxFrameAllocator structure @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); /*! @brief Sets any essential system handle that the library might use. If the specified system handle is a COM interface, the reference counter of the COM interface will increase. The counter will decrease when the session closes. @param[in] session Session handle. @param[in] type Handle type @param[in] hdl Handle to be set @returns MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNDEFINED_BEHAVIOR The same handle is redefined. For example, the function has been called twice with the same handle type or an internal handle has been created before this function call. MFX_ERR_DEVICE_FAILED The SDK cannot initialize using the handle. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); /*! @brief Obtains system handles previously set by the MFXVideoCORE_SetHandle function. If the handler is a COM interface, the reference counter of the interface increases. The calling application must release the COM interface. @param[in] session Session handle. @param[in] type Handle type @param[in] hdl Pointer to the handle to be set @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNDEFINED_BEHAVIOR Specified handle type not found. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); /*! @brief Returns information about current hardware platform in the Legacy mode. @param[in] session Session handle. @param[out] platform Pointer to the mfxPlatform structure @return MFX_ERR_NONE The function completed successfully. @since This function is available since API version 1.19. */ mfxStatus MFX_CDECL MFXVideoCORE_QueryPlatform(mfxSession session, mfxPlatform* platform); /*! @brief Initiates execution of an asynchronous function not already started and returns the status code after the specified asynchronous operation completes. If wait is zero, the function returns immediately @param[in] session Session handle. @param[in] syncp Sync point @param[in] wait wait time in milliseconds @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NONE_PARTIAL_OUTPUT The function completed successfully, bitstream contains a portion of the encoded frame according to required granularity. \n MFX_WRN_IN_EXECUTION The specified asynchronous function is in execution. \n MFX_ERR_ABORTED The specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); /* MFXMemory */ /*! @brief Returns surface which can be used as input for VPP. VPP should be initialized before this call. Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. @param[in] session Session handle. @param[out] surface Pointer is set to valid mfxFrameSurface1 object. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR If double-pointer to the @p surface is NULL. \n MFX_ERR_INVALID_HANDLE If @p session was not initialized. \n MFX_ERR_NOT_INITIALIZED If VPP was not initialized (allocator needs to know surface size from somewhere). \n MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXMemory_GetSurfaceForVPP(mfxSession session, mfxFrameSurface1** surface); /*! @brief Returns surface which can be used as output of VPP. VPP should be initialized before this call. Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. @param[in] session Session handle. @param[out] surface Pointer is set to valid mfxFrameSurface1 object. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR If double-pointer to the @p surface is NULL. \n MFX_ERR_INVALID_HANDLE If @p session was not initialized. \n MFX_ERR_NOT_INITIALIZED If VPP was not initialized (allocator needs to know surface size from somewhere). \n MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXMemory_GetSurfaceForVPPOut(mfxSession session, mfxFrameSurface1** surface); /*! Alias for MFXMemory_GetSurfaceForVPP function. */ #define MFXMemory_GetSurfaceForVPPIn MFXMemory_GetSurfaceForVPP /*! @brief Returns a surface which can be used as input for the encoder. Encoder should be initialized before this call. Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. @param[in] session Session handle. @param[out] surface Pointer is set to valid mfxFrameSurface1 object. @return MFX_ERR_NONE The function completed successfully.\n MFX_ERR_NULL_PTR If surface is NULL.\n MFX_ERR_INVALID_HANDLE If session was not initialized.\n MFX_ERR_NOT_INITIALIZED If the encoder was not initialized (allocator needs to know surface size from somewhere).\n MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXMemory_GetSurfaceForEncode(mfxSession session, mfxFrameSurface1** surface); /*! @brief Returns a surface which can be used as output of the decoder. Decoder should be initialized before this call. Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0.' @note This function was added to simplify transition from legacy surface management to the proposed internal allocation approach. Previously, the user allocated surfaces for the working pool and fed them to the decoder using DecodeFrameAsync calls. With MFXMemory_GetSurfaceForDecode it is possible to change the existing pipeline by just changing the source of work surfaces. Newly developed applications should prefer direct usage of DecodeFrameAsync with internal allocation. @param[in] session Session handle. @param[out] surface Pointer is set to valid mfxFrameSurface1 object. @return MFX_ERR_NONE The function completed successfully.\n MFX_ERR_NULL_PTR If surface is NULL.\n MFX_ERR_INVALID_HANDLE If session was not initialized.\n MFX_ERR_NOT_INITIALIZED If the decoder was not initialized (allocator needs to know surface size from somewhere).\n MFX_ERR_MEMORY_ALLOC Other internal allocation error. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). @since This function is available since API version 2.0. */ mfxStatus MFX_CDECL MFXMemory_GetSurfaceForDecode(mfxSession session, mfxFrameSurface1** surface); /* VideoENCODE */ /*! @brief Works in either of four modes: @li If the @p in parameter is zero, the function returns the class configurability in the output structure. The application must set to zero the fields it wants to check for support. If the field is supported, function sets non-zero value to this field, otherwise it would be ignored. It indicates that the SDK implementation can configure the field with Init. @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values in the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeroes the fields. This feature can verify whether the implementation supports certain profiles, levels or bitrates. @li If the @p in parameter is non-zero and mfxExtEncoderResetOption structure is attached to it, the function queries for the outcome of the MFXVideoENCODE_Reset function and returns it in the mfxExtEncoderResetOption structure attached to out. The query function succeeds if a reset is possible and returns an error otherwise. Unlike other modes that are independent of the encoder state, this one checks if reset is possible in the present encoder state. This mode also requires a completely defined mfxVideoParam structure, unlike other modes that support partially defined configurations. See mfxExtEncoderResetOption description for more details. @li If the @p in parameter is non-zero and mfxExtEncoderCapability structure is attached to it, the function returns encoder capability in the mfxExtEncoderCapability structure attached to out. It is recommended to fill in the mfxVideoParam structure and set the hardware acceleration device handle before calling the function in this mode. The application can call this function before or after it initializes the encoder. The ``CodecId`` field of the output structure is a mandated field (to be filled by the application) to identify the coding standard. @param[in] session Session handle. @param[in] in Pointer to the mfxVideoParam structure as input. @param[out] out Pointer to the mfxVideoParam structure as output. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNSUPPORTED The function failed to identify a specific implementation for the required features. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The encoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); /*! @brief Returns minimum and suggested numbers of the input frame surfaces required for encoding initialization and their type. Init will call the external allocator for the required frames with the same set of numbers. This function does not validate I/O parameters except those used in calculating the number of input surfaces. The use of this function is recommended. \verbatim embed:rst For more information, see the :ref:`Working with Hardware Acceleration section`. \endverbatim @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure as input. @param[in] request Pointer to the mfxFrameAllocRequest structure as output. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The encoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); /*! @brief Allocates memory and prepares tables and necessary structures for encoding. This function also does extensive validation to ensure if the configuration, as specified in the input parameters, is supported. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The encoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close; @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); /*! @brief Stops the current encoding operation and restores internal structures or parameters for a new encoding operation, possibly with new parameters. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. Reset requires additional memory allocation and cannot be executed. The application should close the component and then reinitialize it. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); /*! @brief Terminates the current encoding operation and de-allocates any internal tables or structures. @param[in] session Session handle. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); /*! @brief Retrieves current working parameters to the specified output structure. If extended buffers are to be returned, the application must allocate those extended buffers and attach them as part of the output structure. The application can retrieve a copy of the bitstream header by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. @param[in] session Session handle. @param[in] par Pointer to the corresponding parameter structure. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); /*! @brief Obtains statistics collected during encoding. @param[in] session Session handle. @param[in] stat Pointer to the mfxEncodeStat structure. @return MFX_ERR_NONE The function completed successfully. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); /*! @brief Takes a single input frame in either encoded or display order and generates its output bitstream. In the case of encoded ordering, the mfxEncodeCtrl structure must specify the explicit frame type. In the case of display ordering, this function handles frame order shuffling according to the GOP structure parameters specified during initialization. Since encoding may process frames differently from the input order, not every call of the function generates output and the function returns MFX_ERR_MORE_DATA. If the encoder needs to cache the frame, the function locks the frame. The application should not alter the frame until the encoder unlocks the frame. If there is output (with return status MFX_ERR_NONE), the return is a frame's worth of bitstream. It is the calling application's responsibility to ensure that there is sufficient space in the output buffer. The value ``BufferSizeInKB`` in the mfxVideoParam structure at encoding initialization specifies the maximum possible size for any compressed frames. This value can also be obtained from the MFXVideoENCODE_GetVideoParam function after encoding initialization. To mark the end of the encoding sequence, call this function with a NULL surface pointer. Repeat the call to drain any remaining internally cached bitstreams (one frame at a time) until MFX_ERR_MORE_DATA is returned. This function is asynchronous. @param[in] session Session handle. @param[in] ctrl Pointer to the mfxEncodeCtrl structure for per-frame encoding control; this parameter is optional (it can be NULL) if the encoder works in the display order mode. @param[in] surface Pointer to the frame surface structure. @param[out] bs Pointer to the output bitstream. @param[out] syncp Pointer to the returned sync point associated with this operation. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NOT_ENOUGH_BUFFER The bitstream buffer size is insufficient. \n MFX_ERR_MORE_DATA The function requires more data to generate any output. \n MFX_ERR_DEVICE_LOST Hardware device was lost. \verbatim embed:rst See the :ref:`Working with Microsoft* DirectX* Applications section` for further information. \endverbatim \n MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM Inconsistent parameters detected not conforming to Configuration Parameter Constraints. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); /*! @brief Works in one of two modes: @li If the @p in parameter is zero, the function returns the class configurability in the output structure. A non-zero value in each field of the output structure indicates that the field is configurable by the implementation with the MFXVideoDECODE_Init function. @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values to the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeros the fields. This feature can verify whether the implementation supports certain profiles, levels, or bitrates. The application can call this function before or after it initializes the decoder. The ``CodecId`` field of the output structure is a mandated field (to be filled by the application) to identify the coding standard. @param[in] session Session handle. @param[in] in Pointer to the mfxVideoParam structure as input. @param[out] out Pointer to the mfxVideoParam structure as output. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNSUPPORTED The function failed to identify a specific implementation for the required features. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The decoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); /*! @brief Parses the input bitstream and fills the mfxVideoParam structure with appropriate values, such as resolution and frame rate, for the Init API function. The application can then pass the resulting structure to the MFXVideoDECODE_Init function for decoder initialization. An application can call this API function at any time before or after decoder initialization. If the library finds a sequence header in the bitstream, the function moves the bitstream pointer to the first bit of the sequence header. Otherwise, the function moves the bitstream pointer close to the end of the bitstream buffer but leaves enough data in the buffer to avoid possible loss of start code. The ``CodecId`` field of the mfxVideoParam structure is a mandated field (to be filled by the application) to identify the coding standard. The application can retrieve a copy of the bitstream header, by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. @param[in] session Session handle. @param[in] bs Pointer to the bitstream. @param[in] par Pointer to the mfxVideoParam structure. @return - MFX_ERR_NONE The function successfully filled the structure. It does not mean that the stream can be decoded by the library. The application should call MFXVideoDECODE_Query function to check if decoding of the stream is supported. \n - MFX_ERR_MORE_DATA The function requires more bitstream data. \n - MFX_ERR_UNSUPPORTED ``CodecId`` field of the mfxVideoParam structure indicates some unsupported codec. \n - MFX_ERR_INVALID_HANDLE Session is not initialized. \n - MFX_ERR_NULL_PTR @p bs or @p par pointer is NULL. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); /*! @brief Returns minimum and suggested numbers of the output frame surfaces required for decoding initialization and their type. Init will call the external allocator for the required frames with the same set of numbers. The use of this function is recommended. \verbatim embed:rst For more information, see the :ref:`Working with Hardware Acceleration section`. \endverbatim The ``CodecId`` field of the mfxVideoParam structure is a mandated field (to be filled by the application) to identify the coding standard. This function does not validate I/O parameters except those used in calculating the number of output surfaces. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure as input. @param[in] request Pointer to the mfxFrameAllocRequest structure as output. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The encoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); /*! @brief Allocates memory and prepares tables and necessary structures for encoding. This function also does extensive validation to ensure if the configuration, as specified in the input parameters, is supported. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The encoding may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); /*! @brief Stops the current decoding operation and restores internal structures or parameters for a new decoding operation. Reset serves two purposes: @li It recovers the decoder from errors. @li It restarts decoding from a new position The function resets the old sequence header (sequence parameter set in H.264, or sequence header in MPEG-2 and VC-1). The decoder will expect a new sequence header before it decodes the next frame and will skip any bitstream before encountering the new sequence header. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. Reset requires additional memory allocation and cannot be executed. The application should close the component and then reinitialize it. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); /*! @brief Terminates the current decoding operation and de-allocates any internal tables or structures. @param[in] session Session handle. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); /*! @brief Retrieves current working parameters to the specified output structure. If extended buffers are to be returned, the application must allocate those extended buffers and attach them as part of the output structure. The application can retrieve a copy of the bitstream header, by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. @param[in] session Session handle. @param[in] par Pointer to the corresponding parameter structure. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); /*! @brief Obtains statistics collected during decoding. @param[in] session Session handle. @param[in] stat Pointer to the mfxDecodeStat structure. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); /*! @brief Sets the decoder skip mode. The application may use this API function to increase decoding performance by sacrificing output quality. Increasing the skip level first results in skipping of some decoding operations like deblocking and then leads to frame skipping; first B, then P. Particular details are platform dependent. @param[in] session Session handle. @param[in] mode Decoder skip mode. See the mfxSkipMode enumerator for details. @return MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding \n MFX_WRN_VALUE_NOT_CHANGED The skip mode is not affected as the maximum or minimum skip range is reached. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); /*! @brief Extracts user data (MPEG-2) or SEI (H.264) messages from the bitstream. Internally, the decoder implementation stores encountered user data or SEI messages. The application may call this API function multiple times to retrieve the user data or SEI messages, one at a time. If there is no payload available, the function returns with payload->NumBit=0. @param[in] session Session handle. @param[in] ts Pointer to the user data time stamp in units of 90 KHz; divide ts by 90,000 (90 KHz) to obtain the time in seconds; the time stamp matches the payload with a specific decoded frame. @param[in] payload Pointer to the mfxPayload structure; the payload contains user data in MPEG-2 or SEI messages in H.264. @return MFX_ERR_NONE The function completed successfully and the output buffer is ready for decoding. \n MFX_ERR_NOT_ENOUGH_BUFFER The payload buffer size is insufficient. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); /*! @brief Decodes the input bitstream to a single output frame. The @p surface_work parameter provides a working frame buffer for the decoder. The application should allocate the working frame buffer, which stores decoded frames. If the function requires caching frames after decoding, it locks the frames and the application must provide a new frame buffer in the next call. If, and only if, the function returns MFX_ERR_NONE, the pointer @p surface_out points to the output frame in the display order. If there are no further frames, the function will reset the pointer to zero and return the appropriate status code. Before decoding the first frame, a sequence header (sequence parameter set in H.264 or sequence header in MPEG-2 and VC-1) must be present. The function skips any bitstreams before it encounters the new sequence header. The input bitstream @p bs can be of any size. If there are not enough bits to decode a frame, the function returns MFX_ERR_MORE_DATA, and consumes all input bits except if a partial start code or sequence header is at the end of the buffer. In this case, the function leaves the last few bytes in the bitstream buffer. If there is more incoming bitstream, the application should append the incoming bitstream to the bitstream buffer. Otherwise, the application should ignore the remaining bytes in the bitstream buffer and apply the end of stream procedure described below. The application must set @p bs to NULL to signal end of stream. The application may need to call this API function several times to drain any internally cached frames until the function returns MFX_ERR_MORE_DATA. If more than one frame is in the bitstream buffer, the function decodes until the buffer is consumed. The decoding process can be interrupted for events such as if the decoder needs additional working buffers, is readying a frame for retrieval, or encountering a new header. In these cases, the function returns appropriate status code and moves the bitstream pointer to the remaining data. The decoder may return MFX_ERR_NONE without taking any data from the input bitstream buffer. If the application appends additional data to the bitstream buffer, it is possible that the bitstream buffer may contain more than one frame. It is recommended that the application invoke the function repeatedly until the function returns MFX_ERR_MORE_DATA, before appending any more data to the bitstream buffer. Starting from API 2.0 it is possible to pass NULL instead of surface_work. In such case runtime will allocate output frames internally. This function is asynchronous. @param[in] session Session handle. @param[in] bs Pointer to the input bitstream. @param[in] surface_work Pointer to the working frame buffer for the decoder. @param[out] surface_out Pointer to the output frame in the display order. @param[out] syncp Pointer to the sync point associated with this operation. @return MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding. \n MFX_ERR_MORE_DATA The function requires more bitstream at input before decoding can proceed. \n MFX_ERR_MORE_SURFACE The function requires more frame surface at output before decoding can proceed. \n MFX_ERR_DEVICE_LOST Hardware device was lost. \verbatim embed:rst See the :ref:`Working with Microsoft* DirectX* Applications section` for further information. \endverbatim \n MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n MFX_WRN_VIDEO_PARAM_CHANGED The decoder detected a new sequence header in the bitstream. Video parameters may have changed. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The decoder detected incompatible video parameters in the bitstream and failed to follow them. \n MFX_ERR_REALLOC_SURFACE Bigger surface_work required. May be returned only if mfxInfoMFX::EnableReallocRequest was set to ON during initialization. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED Timeout expired for internal output frame allocation (if set with mfxExtAllocationHints and NULL passed as surface_work). Repeat the call in a few milliseconds or re-initialize decoder with higher surface limit. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); /* VideoVPP */ /*! @brief Works in one of two modes: @li If the @p in pointer is zero, the function returns the class configurability in the output structure. A non-zero value in a field indicates that the implementation can configure it with Init. @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values to the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeroes the fields. The application can call this function before or after it initializes the preprocessor. @param[in] session Session handle. @param[in] in Pointer to the mfxVideoParam structure as input. @param[out] out Pointer to the mfxVideoParam structure as output. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_UNSUPPORTED The implementation does not support the specified configuration. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The video processing may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); /*! @brief Returns minimum and suggested numbers of the input frame surfaces required for video processing initialization and their type. The parameter ``request[0]`` refers to the input requirements; ``request[1]`` refers to output requirements. Init will call the external allocator for the required frames with the same set of numbers. This function does not validate I/O parameters except those used in calculating the number of input surfaces. The use of this function is recommended. \verbatim embed:rst For more information, see the :ref:`Working with Hardware Acceleration section`. \endverbatim @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure as input. @param[in] request Pointer to the mfxFrameAllocRequest structure; use ``request[0]`` for input requirements and ``request[1]`` for output requirements for video processing. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The video processing may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); /*! @brief Allocates memory and prepares tables and necessary structures for video processing. This function also does extensive validation to ensure if the configuration, as specified in the input parameters, is supported. @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. The video processing may be partially accelerated. Only hardware implementations may return this status code. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close. \n MFX_WRN_FILTER_SKIPPED The VPP skipped one or more filters requested by the application. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); /*! @brief Stops the current video processing operation and restores internal structures or parameters for a new operation @param[in] session Session handle. @param[in] par Pointer to the mfxVideoParam structure. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. Reset requires additional memory allocation and cannot be executed. The application should close the component and then reinitialize it. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); /*! @brief Terminates the current video processing operation and de-allocates any internal tables or structures. @param[in] session Session handle. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); /*! @brief Retrieves current working parameters to the specified output structure. If extended buffers are to be returned, the application must allocate those extended buffers and attach them as part of the output structure. @param[in] session Session handle. @param[in] par Pointer to the corresponding parameter structure. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); /*! @brief Obtains statistics collected during video processing. @param[in] session Session handle. @param[in] stat Pointer to the mfxVPPStat structure. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); /*! @brief Processes a single input frame to a single output frame. Retrieval of the auxiliary data is optional; the encoding process may use it. The video processing process may not generate an instant output given an input. \verbatim embed:rst See the :ref:`Video Processing Procedures section` for details on how to correctly send input and retrieve output. \endverbatim At the end of the stream, call this function with the input argument ``in=NULL`` to retrieve any remaining frames, until the function returns MFX_ERR_MORE_DATA. This function is asynchronous. @param[in] session Session handle. @param[in] in Pointer to the input video surface structure. @param[out] out Pointer to the output video surface structure. @param[in] aux Optional pointer to the auxiliary data structure. @param[out] syncp Pointer to the output sync point. @return MFX_ERR_NONE The output frame is ready after synchronization. \n MFX_ERR_MORE_DATA Need more input frames before VPP can produce an output. \n MFX_ERR_MORE_SURFACE The output frame is ready after synchronization. Need more surfaces at output for additional output frames available. \n MFX_ERR_DEVICE_LOST Hardware device was lost. \verbatim embed:rst See the :ref:`Working with Microsoft* DirectX* Applications section` for further information. \endverbatim \n MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. @since This function is available since API version 1.0. */ mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); /*! @brief The function processes a single input frame to a single output frame with internal allocation of output frame. At the end of the stream, call this function with the input argument ``in=NULL`` to retrieve any remaining frames, until the function returns MFX_ERR_MORE_DATA. This function is asynchronous. @param[in] session Session handle. @param[in] in Pointer to the input video surface structure. @param[out] out Pointer to the output video surface structure which is reference counted object allocated by the library. @return MFX_ERR_NONE The output frame is ready after synchronization. \n MFX_ERR_MORE_DATA Need more input frames before VPP can produce an output. \n MFX_ERR_MEMORY_ALLOC The function failed to allocate output video frame. \n MFX_ERR_DEVICE_LOST Hardware device was lost. \verbatim embed:rst See the :ref:`Working with Microsoft* DirectX* Applications section` for further information. \endverbatim \n MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n MFX_WRN_ALLOC_TIMEOUT_EXPIRED Timeout expired for internal output frame allocation (if set with mfxExtAllocationHints). Repeat the call in a few milliseconds or reinitialize VPP with higher surface limit. @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoVPP_ProcessFrameAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 **out); /*! @brief Initialize the SDK in (decode + vpp) mode. The logic of this function is similar to MFXVideoDECODE_Init, but application has to provide array of pointers to mfxVideoChannelParam and num_channel_param - number of channels. Application is responsible for memory allocation for mfxVideoChannelParam parameters and for each channel it should specify channel IDs: mfxVideoChannelParam::mfxFrameInfo::ChannelId. ChannelId should be unique value within one session. ChannelID equals to the 0 is reserved for the original decoded frame. The application can attach mfxExtInCrops to mfxVideoChannelParam::ExtParam to annotate input video frame if it wants to enable letterboxing operation. @param[in] session SDK session handle. @param[in] decode_par Pointer to the mfxVideoParam structure which contains initialization parameters for decoder. @param[in] vpp_par_array Array of pointers to `mfxVideoChannelParam`structures. Each mfxVideoChannelParam contains initialization parameters for each VPP channel. @param[in] num_vpp_par Size of array of pointers to mfxVideoChannelParam structures. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them resulted in incompatibility. Incompatibility not resolved. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n MFX_ERR_UNDEFINED_BEHAVIOR The component is already initialized. \n MFX_WRN_FILTER_SKIPPED The VPP skipped one or more filters requested by the application. @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Init(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_vpp_par); /*! @brief This function is similar to MFXVideoDECODE_DecodeFrameAsync and inherits all bitstream processing logic. As output, it allocates and returns @p surf_array_out array of processed surfaces according to the chain of filters specified by application in MFXVideoDECODE_VPP_Init, including original decoded frames. In the @p surf_array_out, the original decoded frames are returned through surfaces with mfxFrameInfo::ChannelId == 0, followed by each of the subsequent frame surfaces for each of the requested mfxVideoChannelParam entries provided to the MFXVideoCECODE_VPP_Init function. At maximum, the number of frame surfaces return is 1 + the value of @p num_vpp_par to the MFXVideoDECODE_VPP_Init function, but the application must be prepared to the case when some particular filters are not ready to output surfaces, so the length of @p surf_array_out will be less. Application should use mfxFrameInfo::ChannelId parameter to match output surface against configured filter. An application must synchronize each output surface from the @p surf_array_out surface array independently. @param[in] session SDK session handle. @param[in] bs Pointer to the input bitstream. @param[in] skip_channels Pointer to the array of `ChannelId`s which specifies channels with skip output frames. Memory for the array is allocated by application. @param[in] num_skip_channels Number of channels addressed by skip_channels. @param[out] surf_array_out The address of a pointer to the structure with frame surfaces. @return MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding. \n MFX_ERR_MORE_DATA The function requires more bitstream at input before decoding can proceed. \n MFX_ERR_MORE_SURFACE The function requires more frame surface at output before decoding can proceed. \n MFX_ERR_DEVICE_LOST Hardware device was lost. \verbatim embed:rst See the :ref:`Working with Microsoft* DirectX* Applications section` for further information. \endverbatim \n MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n MFX_WRN_VIDEO_PARAM_CHANGED The decoder detected a new sequence header in the bitstream. Video parameters may have changed. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The decoder detected incompatible video parameters in the bitstream and failed to follow them. \n MFX_ERR_NULL_PTR num_skip_channels doesn't equal to 0 when skip_channels is NULL. @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoDECODE_VPP_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray **surf_array_out); /*! @brief This function is similar to MFXVideoDECODE_Reset and stops the current decoding and vpp operation, and restores internal structures or parameters for a new decoding plus vpp operation. It resets the state of the decoder and/or all initialized vpp channels. Applications have to care about draining of buffered frames for decode and all vpp channels before call this function. The application can attach mfxExtInCrops to mfxVideoChannelParam::ExtParam to annotate input video frame if it wants to enable letterboxing operation. @param[in] session Session handle. @param[in] decode_par Pointer to the `mfxVideoParam` structure which contains new initialization parameters for decoder. Might be NULL if application wants to Reset only VPP channels. @param[in] vpp_par_array Array of pointers to mfxVideoChannelParam structures. Each mfxVideoChannelParam contains new initialization parameters for each VPP channel. @param[in] num_vpp_par Size of array of pointers to mfxVideoChannelParam structures. @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. Reset requires additional memory allocation and cannot be executed. The application should close the component and then reinitialize it. \n MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. MFX_ERR_NULL_PTR Both pointers decode_par and vpp_par_array` equal to zero. @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Reset(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_vpp_par); /*! @brief Returns actual VPP parameters for selected channel which should be specified by application through mfxVideoChannelParam::mfxFrameInfo::ChannelId. @param[in] session Session handle. @param[in] par Pointer to the `mfxVideoChannelParam` structure which allocated by application @param[in] channel_id specifies the requested channel's info @return MFX_ERR_NONE The function completed successfully. \n MFX_ERR_NULL_PTR par pointer is NULL. \n MFX_ERR_NOT_FOUND the library is not able to find VPP channel with such channel_id. @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoDECODE_VPP_GetChannelParam(mfxSession session, mfxVideoChannelParam *par, mfxU32 channel_id); /*! @brief This function is similar to MFXVideoDECODE_Close. It terminates the current decoding and vpp operation and de-allocates any internal tables or structures. @param[in] session Session handle. @return MFX_ERR_NONE The function completed successfully. \n @since This function is available since API version 2.1. */ mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Close(mfxSession session); /*! Alias for MFXVideoDECODE_DecodeHeader function. */ #define MFXVideoDECODE_VPP_DecodeHeader MFXVideoDECODE_DecodeHeader /*! Alias for MFXVideoDECODE_GetVideoParam function. */ #define MFXVideoDECODE_VPP_GetVideoParam MFXVideoDECODE_GetVideoParam /*! Alias for MFXVideoDECODE_GetDecodeStat function. */ #define MFXVideoDECODE_VPP_GetDecodeStat MFXVideoDECODE_GetDecodeStat /*! Alias for MFXVideoDECODE_SetSkipMode function. */ #define MFXVideoDECODE_VPP_SetSkipMode MFXVideoDECODE_SetSkipMode /*! Alias for MFXVideoDECODE_GetPayload function. */ #define MFXVideoDECODE_VPP_GetPayload MFXVideoDECODE_GetPayload #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/mfxvp8.h000066400000000000000000000056511443134507600222510ustar00rootroot00000000000000/*############################################################################ # Copyright Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXVP8_H__ #define __MFXVP8_H__ #include "mfxdefs.h" #ifdef __cplusplus extern "C" { #endif enum { MFX_CODEC_VP8 = MFX_MAKEFOURCC('V','P','8',' '), }; /* VP8 CodecProfile*/ enum { MFX_PROFILE_VP8_0 = 0+1, MFX_PROFILE_VP8_1 = 1+1, MFX_PROFILE_VP8_2 = 2+1, MFX_PROFILE_VP8_3 = 3+1, }; /* Extended Buffer Ids */ enum { /*! This extended buffer describes VP8 encoder configuration parameters. See the mfxExtVP8CodingOption structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. */ MFX_EXTBUFF_VP8_CODING_OPTION = MFX_MAKEFOURCC('V','P','8','E'), }; MFX_PACK_BEGIN_USUAL_STRUCT() /*! Describes VP8 coding options. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP8_CODING_OPTION. */ mfxU16 Version; /*!< Determines the bitstream version. Corresponds to the same VP8 syntax element in frame_tag. */ mfxU16 EnableMultipleSegments; /*!< Set this option to ON to enable segmentation. This is tri-state option. See the CodingOptionValue enumerator for values of this option. */ mfxU16 LoopFilterType; /*!< Select the type of filter (normal or simple). Corresponds to VP8 syntax element filter_type. */ mfxU16 LoopFilterLevel[4]; /*!< Controls the filter strength. Corresponds to VP8 syntax element loop_filter_level. */ mfxU16 SharpnessLevel; /*!< Controls the filter sensitivity. Corresponds to VP8 syntax element sharpness_level. */ mfxU16 NumTokenPartitions; /*!< Specifies number of token partitions in the coded frame. */ mfxI16 LoopFilterRefTypeDelta[4]; /*!< Loop filter level delta for reference type (intra, last, golden, altref). */ mfxI16 LoopFilterMbModeDelta[4]; /*!< Loop filter level delta for MB modes. */ mfxI16 SegmentQPDelta[4]; /*!< QP delta for segment. */ mfxI16 CoeffTypeQPDelta[5]; /*!< QP delta for coefficient type (YDC, Y2AC, Y2DC, UVAC, UVDC). */ mfxU16 WriteIVFHeaders; /*!< Set this option to ON to enable insertion of IVF container headers into bitstream. This is tri-state option. See the CodingOptionValue enumerator for values of this option */ mfxU32 NumFramesForIVFHeader; /*!< Specifies number of frames for IVF header when WriteIVFHeaders is ON. */ mfxU16 reserved[223]; } mfxExtVP8CodingOption; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/000077500000000000000000000000001443134507600223135ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/mfxav1.h000066400000000000000000000117741443134507600237000ustar00rootroot00000000000000/******************************************************************************* *\ Copyright (C) 2021-2022 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfxav1.h *******************************************************************************/ #if !defined(__MFXAV1_H__) #define __MFXAV1_H__ #include "mfxdefs.h" #include "mfxstructures.h" #if defined(__cplusplus) extern "C" { #endif /* Extended Buffer Ids */ enum { MFX_EXTBUFF_AV1_AUXDATA = MFX_MAKEFOURCC('1', 'A', 'U', 'X'), }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxU8 StillPictureMode; /* tri-state option */ mfxU8 UseAnnexB; /* tri-state option */ mfxU8 PackOBUFrame; /* tri-state option */ mfxU8 InsertTemporalDelimiter; /* tri-state option */ mfxU8 EnableCdef; /* tri-state option */ mfxU8 EnableRestoration; /* tri-state option */ mfxU8 EnableLoopFilter; /* tri-state option */ mfxU8 LoopFilterSharpness; /* 0..8, 0 = default, map to bitstream: [1..8] => [0..7] */ mfxU8 EnableSuperres; /* tri-state option */ mfxU8 SuperresScaleDenominator; /* 9..16, 0 = default */ mfxU8 SegmentationMode; /* see enum AV1SegmentMode*/ mfxU8 InterpFilter; /* see enum AV1InterpolationMode */ mfxU8 DisableCdfUpdate; /* tri-state option */ mfxU8 DisableFrameEndUpdateCdf; /* tri-state option */ mfxU8 UniformTileSpacing; /* tri-state option */ mfxU8 ContextUpdateTileIdPlus1; /* Minus 1 specifies context_update_tile_id */ mfxU16 SwitchInterval; /* interval, 0 - disabled */ mfxU16 NumTilesPerTileGroup[256]; mfxU16 TileWidthInSB[128]; mfxU16 TileHeightInSB[128]; struct { mfxU8 CdefDampingMinus3; /* 0..3 */ mfxU8 CdefBits; /* 0..3 */ mfxU8 CdefYStrengths[8]; /* 0..63 */ mfxU8 CdefUVStrengths[8]; /* 0..63 */ mfxU8 reserved[14]; } Cdef; struct { mfxU8 LFLevelYVert; /* 0..63 */ mfxU8 LFLevelYHorz; /* 0..63 */ mfxU8 LFLevelU; /* 0..63 */ mfxU8 LFLevelV; /* 0..63 */ mfxU8 ModeRefDeltaEnabled; /* 0, 1 */ mfxU8 ModeRefDeltaUpdate; /* 0, 1 */ mfxI8 RefDeltas[8]; /* -63..63 */ mfxI8 ModeDeltas[2]; /* -63..63 */ mfxU8 reserved[16]; } LoopFilter; struct { mfxI8 YDcDeltaQ; /* -63..63 */ mfxI8 UDcDeltaQ; /* -63..63 */ mfxI8 VDcDeltaQ; /* -63..63 */ mfxI8 UAcDeltaQ; /* -63..63 */ mfxI8 VAcDeltaQ; /* -63..63 */ mfxU8 MinBaseQIndex; mfxU8 MaxBaseQIndex; mfxU8 reserved[25]; } QP; mfxU8 ErrorResilientMode; /* tri-state option */ mfxU8 EnableOrderHint; /* tri-state option */ mfxU8 OrderHintBits; /* 0..8, 0 = default */ mfxU8 DisplayFormatSwizzle; /* 0, 1 */ mfxU16 Palette; /* tri-state option */ mfxU16 IBC; /* tri-state option */ mfxU16 SegmentTemporalUpdate; /* tri-state option */ mfxU8 reserved[52]; } mfxExtAV1AuxData; MFX_PACK_END() /* AV1InterpolationMode */ enum { MFX_AV1_INTERP_DEFAULT = 0, MFX_AV1_INTERP_EIGHTTAP = 1, MFX_AV1_INTERP_EIGHTTAP_SMOOTH = 2, MFX_AV1_INTERP_EIGHTTAP_SHARP = 3, MFX_AV1_INTERP_BILINEAR = 4, MFX_AV1_INTERP_SWITCHABLE = 5 }; #if defined(__cplusplus) } // extern "C" #endif #endif //!defined(__MFXAV1_H__) oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/mfxdeprecated.h000066400000000000000000000114411443134507600253000ustar00rootroot00000000000000/*############################################################################ # Copyright (C) 2020 Intel Corporation # # SPDX-License-Identifier: MIT ############################################################################*/ #ifndef __MFXDEPRECATED_H__ #define __MFXDEPRECATED_H__ #include "mfxcommon.h" #include "mfxsession.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ enum { MFX_ERR_INCOMPATIBLE_AUDIO_PARAM = -19, /* incompatible audio parameters */ MFX_ERR_INVALID_AUDIO_PARAM = -20, /* invalid audio parameters */ MFX_WRN_INCOMPATIBLE_AUDIO_PARAM = 11, /* incompatible audio parameters */ }; mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsyncEx(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxU32 reserved[4]; mfxHDL pthis; mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); } mfxBufferAllocator; MFX_PACK_END() mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); /* IOPattern */ enum { MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 }; enum { MFX_MEMTYPE_OPAQUE_FRAME = 0x0004 }; /* Extended Buffer Ids */ enum { MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S') }; MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxExtBuffer Header; mfxU32 reserved1[2]; struct { mfxFrameSurface1 **Surfaces; mfxU32 reserved2[5]; mfxU16 Type; mfxU16 NumSurface; } In, Out; } mfxExtOpaqueSurfaceAlloc; MFX_PACK_END() mfxStatus MFX_CDECL MFXDoWork(mfxSession session); mfxStatus MFX_CDECL MFXVideoENC_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); mfxStatus MFX_CDECL MFXVideoENC_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); mfxStatus MFX_CDECL MFXVideoENC_Init(mfxSession session, mfxVideoParam *par); mfxStatus MFX_CDECL MFXVideoENC_Reset(mfxSession session, mfxVideoParam *par); mfxStatus MFX_CDECL MFXVideoENC_Close(mfxSession session); typedef struct _mfxENCInput{ mfxU8 reserved; } mfxENCInput; typedef struct _mfxENCOutput{ mfxU8 reserved; } mfxENCOutput; mfxStatus MFX_CDECL MFXVideoENC_ProcessFrameAsync(mfxSession session, mfxENCInput *in, mfxENCOutput *out, mfxSyncPoint *syncp); mfxStatus MFX_CDECL MFXVideoENC_GetVideoParam(mfxSession session, mfxVideoParam *par); MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxU8 reserved; } mfxPAKInput; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct { mfxU8 reserved; } mfxPAKOutput; MFX_PACK_END() mfxStatus MFX_CDECL MFXVideoPAK_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); mfxStatus MFX_CDECL MFXVideoPAK_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); mfxStatus MFX_CDECL MFXVideoPAK_Init(mfxSession session, mfxVideoParam *par); mfxStatus MFX_CDECL MFXVideoPAK_Reset(mfxSession session, mfxVideoParam *par); mfxStatus MFX_CDECL MFXVideoPAK_Close(mfxSession session); mfxStatus MFX_CDECL MFXVideoPAK_ProcessFrameAsync(mfxSession session, mfxPAKInput *in, mfxPAKOutput *out, mfxSyncPoint *syncp); mfxStatus MFX_CDECL MFXVideoPAK_GetVideoParam(mfxSession session, mfxVideoParam *par); enum { /*! This extended buffer allow to specify multi-frame submission parameters. */ MFX_EXTBUFF_MULTI_FRAME_PARAM = MFX_MAKEFOURCC('M', 'F', 'R', 'P'), /*! This extended buffer allow to manage multi-frame submission in runtime. */ MFX_EXTBUFF_MULTI_FRAME_CONTROL = MFX_MAKEFOURCC('M', 'F', 'R', 'C'), }; /* Multi-Frame Mode */ enum { MFX_MF_DEFAULT = 0, MFX_MF_DISABLED = 1, MFX_MF_AUTO = 2, MFX_MF_MANUAL = 3 }; /* Multi-Frame Initialization parameters */ MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxU16 MFMode; mfxU16 MaxNumFrames; mfxU16 reserved[58]; } mfxExtMultiFrameParam; MFX_PACK_END() /* Multi-Frame Run-time controls */ MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxU32 Timeout; /* timeout in millisecond */ mfxU16 Flush; /* Flush internal frame buffer, e.g. submit all collected frames. */ mfxU16 reserved[57]; } mfxExtMultiFrameControl; MFX_PACK_END() /* RateControlMethod */ enum { MFX_RATECONTROL_LA_EXT =12, MFX_RATECONTROL_VME =15, }; #ifdef __cplusplus } #endif /* __cplusplus */ #endif //__MFXDEPRECATED_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/mfxenctools.h000066400000000000000000000052171443134507600250320ustar00rootroot00000000000000/******************************************************************************* *\ Copyright (C) 2019-2020 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfxenctools.h *******************************************************************************/ #ifndef __MFXENCTOOLS_H__ #define __MFXENCTOOLS_H__ #include "mfxvideo++.h" #include "mfxbrc.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Extended Buffer Ids */ enum { MFX_EXTBUFF_ENCTOOLS_CONFIG = MFX_MAKEFOURCC('E', 'T', 'C', 'F'), }; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxExtBuffer Header; mfxStructVersion Version; mfxU16 AdaptiveI; mfxU16 AdaptiveB; mfxU16 AdaptiveRefP; mfxU16 AdaptiveRefB; mfxU16 SceneChange; mfxU16 AdaptiveLTR; mfxU16 AdaptivePyramidQuantP; mfxU16 AdaptivePyramidQuantB; mfxU16 AdaptiveQuantMatrices; mfxU16 AdaptiveMBQP; mfxU16 BRCBufferHints; mfxU16 BRC; mfxU16 SaliencyMapHint; mfxU16 reserved[19]; } mfxExtEncToolsConfig; MFX_PACK_END() #define MFX_ENCTOOLS_CONFIG_VERSION MFX_STRUCT_VERSION(1, 0) #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/mfxplugin.h000066400000000000000000000242651443134507600245060ustar00rootroot00000000000000/******************************************************************************* *\ Copyright (C) 2007-2019 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfxplugin.h *******************************************************************************/ #ifndef __MFXPLUGIN_H__ #define __MFXPLUGIN_H__ #include "mfxvideo.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct { mfxU8 Data[16]; } mfxPluginUID; MFX_PACK_END() static const mfxPluginUID MFX_PLUGINID_HEVCD_SW = {{0x15, 0xdd, 0x93, 0x68, 0x25, 0xad, 0x47, 0x5e, 0xa3, 0x4e, 0x35, 0xf3, 0xf5, 0x42, 0x17, 0xa6}}; static const mfxPluginUID MFX_PLUGINID_HEVCD_HW = {{0x33, 0xa6, 0x1c, 0x0b, 0x4c, 0x27, 0x45, 0x4c, 0xa8, 0xd8, 0x5d, 0xde, 0x75, 0x7c, 0x6f, 0x8e}}; static const mfxPluginUID MFX_PLUGINID_HEVCE_SW = {{0x2f, 0xca, 0x99, 0x74, 0x9f, 0xdb, 0x49, 0xae, 0xb1, 0x21, 0xa5, 0xb6, 0x3e, 0xf5, 0x68, 0xf7}}; static const mfxPluginUID MFX_PLUGINID_HEVCE_GACC = {{0xe5, 0x40, 0x0a, 0x06, 0xc7, 0x4d, 0x41, 0xf5, 0xb1, 0x2d, 0x43, 0x0b, 0xba, 0xa2, 0x3d, 0x0b}}; static const mfxPluginUID MFX_PLUGINID_HEVCE_DP_GACC = {{0x2b, 0xad, 0x6f, 0x9d, 0x77, 0x54, 0x41, 0x2d, 0xbf, 0x63, 0x03, 0xed, 0x4b, 0xb5, 0x09, 0x68}}; static const mfxPluginUID MFX_PLUGINID_HEVCE_HW = {{0x6f, 0xad, 0xc7, 0x91, 0xa0, 0xc2, 0xeb, 0x47, 0x9a, 0xb6, 0xdc, 0xd5, 0xea, 0x9d, 0xa3, 0x47}}; static const mfxPluginUID MFX_PLUGINID_VP8D_HW = {{0xf6, 0x22, 0x39, 0x4d, 0x8d, 0x87, 0x45, 0x2f, 0x87, 0x8c, 0x51, 0xf2, 0xfc, 0x9b, 0x41, 0x31}}; static const mfxPluginUID MFX_PLUGINID_VP8E_HW = {{0xbf, 0xfc, 0x51, 0x8c, 0xde, 0x13, 0x4d, 0xf9, 0x8a, 0x96, 0xf4, 0xcf, 0x81, 0x6c, 0x0f, 0xac}}; static const mfxPluginUID MFX_PLUGINID_VP9E_HW = {{0xce, 0x44, 0xef, 0x6f, 0x1a, 0x6d, 0x22, 0x46, 0xb4, 0x12, 0xbb, 0x38, 0xd6, 0xe4, 0x51, 0x82}}; static const mfxPluginUID MFX_PLUGINID_VP9D_HW = {{0xa9, 0x22, 0x39, 0x4d, 0x8d, 0x87, 0x45, 0x2f, 0x87, 0x8c, 0x51, 0xf2, 0xfc, 0x9b, 0x41, 0x31}}; static const mfxPluginUID MFX_PLUGINID_CAMERA_HW = {{0x54, 0x54, 0x26, 0x16, 0x24, 0x33, 0x41, 0xe6, 0x93, 0xae, 0x89, 0x99, 0x42, 0xce, 0x73, 0x55}}; static const mfxPluginUID MFX_PLUGINID_CAPTURE_HW = {{0x22, 0xd6, 0x2c, 0x07, 0xe6, 0x72, 0x40, 0x8f, 0xbb, 0x4c, 0xc2, 0x0e, 0xd7, 0xa0, 0x53, 0xe4}}; static const mfxPluginUID MFX_PLUGINID_ITELECINE_HW = {{0xe7, 0x44, 0x75, 0x3a, 0xcd, 0x74, 0x40, 0x2e, 0x89, 0xa2, 0xee, 0x06, 0x35, 0x49, 0x61, 0x79}}; static const mfxPluginUID MFX_PLUGINID_H264LA_HW = {{0x58, 0x8f, 0x11, 0x85, 0xd4, 0x7b, 0x42, 0x96, 0x8d, 0xea, 0x37, 0x7b, 0xb5, 0xd0, 0xdc, 0xb4}}; static const mfxPluginUID MFX_PLUGINID_AACD = {{0xe9, 0x34, 0x67, 0x25, 0xac, 0x2f, 0x4c, 0x93, 0xaa, 0x58, 0x5c, 0x11, 0xc7, 0x08, 0x7c, 0xf4}}; static const mfxPluginUID MFX_PLUGINID_AACE = {{0xb2, 0xa2, 0xa0, 0x5a, 0x4e, 0xac, 0x46, 0xbf, 0xa9, 0xde, 0x7e, 0x80, 0xc9, 0x8d, 0x2e, 0x18}}; static const mfxPluginUID MFX_PLUGINID_HEVCE_FEI_HW = {{0x87, 0xe0, 0xe8, 0x02, 0x07, 0x37, 0x52, 0x40, 0x85, 0x25, 0x15, 0xcf, 0x4a, 0x5e, 0xdd, 0xe6}}; static const mfxPluginUID MFX_PLUGINID_HEVC_FEI_ENCODE = {{0x54, 0x18, 0xa7, 0x06, 0x66, 0xf9, 0x4d, 0x5c, 0xb4, 0xf7, 0xb1, 0xca, 0xee, 0x86, 0x33, 0x9b}}; typedef enum { MFX_PLUGINTYPE_VIDEO_GENERAL = 0, MFX_PLUGINTYPE_VIDEO_DECODE = 1, MFX_PLUGINTYPE_VIDEO_ENCODE = 2, MFX_PLUGINTYPE_VIDEO_VPP = 3, MFX_PLUGINTYPE_VIDEO_ENC = 4, MFX_PLUGINTYPE_AUDIO_DECODE = 5, MFX_PLUGINTYPE_AUDIO_ENCODE = 6 } mfxPluginType; typedef enum { MFX_THREADPOLICY_SERIAL = 0, MFX_THREADPOLICY_PARALLEL = 1 } mfxThreadPolicy; MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct mfxPluginParam { mfxU32 reserved[6]; mfxU16 reserved1; mfxU16 PluginVersion; mfxVersion APIVersion; mfxPluginUID PluginUID; mfxU32 Type; mfxU32 CodecId; mfxThreadPolicy ThreadPolicy; mfxU32 MaxThreadNum; } mfxPluginParam; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() typedef struct mfxCoreParam{ mfxU32 reserved[13]; mfxIMPL Impl; mfxVersion Version; mfxU32 NumWorkingThread; } mfxCoreParam; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct mfxCoreInterface { mfxHDL pthis; mfxHDL reserved1[2]; mfxFrameAllocator FrameAllocator; mfxBufferAllocator reserved3; mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); mfxStatus (MFX_CDECL *CreateAccelerationDevice)(mfxHDL pthis, mfxHandleType type, mfxHDL *handle); mfxStatus (MFX_CDECL *GetFrameHandle) (mfxHDL pthis, mfxFrameData *fd, mfxHDL *handle); mfxStatus (MFX_CDECL *QueryPlatform) (mfxHDL pthis, mfxPlatform *platform); mfxHDL reserved4[1]; } mfxCoreInterface; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /* video codec plugin extension */ typedef struct _mfxENCInput mfxENCInput; typedef struct _mfxENCOutput mfxENCOutput; typedef struct mfxVideoCodecPlugin{ mfxStatus (MFX_CDECL *Query)(mfxHDL pthis, mfxVideoParam *in, mfxVideoParam *out); mfxStatus (MFX_CDECL *QueryIOSurf)(mfxHDL pthis, mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out); mfxStatus (MFX_CDECL *Init)(mfxHDL pthis, mfxVideoParam *par); mfxStatus (MFX_CDECL *Reset)(mfxHDL pthis, mfxVideoParam *par); mfxStatus (MFX_CDECL *Close)(mfxHDL pthis); mfxStatus (MFX_CDECL *GetVideoParam)(mfxHDL pthis, mfxVideoParam *par); mfxStatus (MFX_CDECL *EncodeFrameSubmit)(mfxHDL pthis, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task); mfxStatus (MFX_CDECL *DecodeHeader)(mfxHDL pthis, mfxBitstream *bs, mfxVideoParam *par); mfxStatus (MFX_CDECL *GetPayload)(mfxHDL pthis, mfxU64 *ts, mfxPayload *payload); mfxStatus (MFX_CDECL *DecodeFrameSubmit)(mfxHDL pthis, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task); mfxStatus (MFX_CDECL *VPPFrameSubmit)(mfxHDL pthis, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxThreadTask *task); mfxStatus (MFX_CDECL *VPPFrameSubmitEx)(mfxHDL pthis, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task); mfxStatus (MFX_CDECL *ENCFrameSubmit)(mfxHDL pthis, mfxENCInput *in, mfxENCOutput *out, mfxThreadTask *task); mfxHDL reserved1[3]; mfxU32 reserved2[8]; } mfxVideoCodecPlugin; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() typedef struct mfxPlugin{ mfxHDL pthis; mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); mfxVideoCodecPlugin *Video; mfxHDL reserved[8]; } mfxPlugin; MFX_PACK_END() mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); mfxStatus MFX_CDECL MFXVideoUSER_GetPlugin(mfxSession session, mfxU32 type, mfxPlugin *par); mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); mfxStatus MFX_CDECL MFXVideoUSER_Load(mfxSession session, const mfxPluginUID *uid, mfxU32 version); mfxStatus MFX_CDECL MFXVideoUSER_LoadByPath(mfxSession session, const mfxPluginUID *uid, mfxU32 version, const mfxChar *path, mfxU32 len); mfxStatus MFX_CDECL MFXVideoUSER_UnLoad(mfxSession session, const mfxPluginUID *uid); #ifdef __cplusplus } // extern "C" #endif /* __cplusplus */ #endif /* __MFXPLUGIN_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/api/vpl/private/mfxpxp.h000066400000000000000000000224301443134507600240070ustar00rootroot00000000000000/******************************************************************************* Copyright (C) 2021 Intel Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. File Name: mfxpxp.h *******************************************************************************/ #ifndef __MFX_PXP_H__ #define __MFX_PXP_H__ #include "mfxdefs.h" #include "mfxcommon.h" #ifdef __cplusplus extern "C" { #endif MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes secure decode configuration. */ typedef struct { mfxHDL pxpAttributesHdl; /*!< Pointer to VAConfigAttrib. */ mfxU32 ContextId; /*!< context id of decoder. */ mfxU8 reserved[56]; /*!< Reserved for future use. */ } *mfxSecureDecodeConfigHDL, mfxSecureDecodeConfig; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Describes secure encode configuration. */ typedef struct { mfxU32 pxpFlag; /*!< flag to create secure encode context. */ mfxU32 ContextId; /*!< context id of encoder. */ mfxU8 reserved[24]; /*!< Reserved for future use. */ } *mfxSecureEncodeConfigHDL, mfxSecureEncodeConfig; MFX_PACK_END() MFX_PACK_BEGIN_USUAL_STRUCT() /*! Describes secure vpp configuration. */ typedef struct { mfxU32 ContextId; /*!< context id of VPP. */ mfxU8 reserved[28]; /*!< Reserved for future use. */ } *mfxSecureVPPConfigHDL, mfxSecureVPPConfig; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This is a table to map pxp parameter associacted with decode input. PXP parameter point to VAEncryptionParameters on linux. pMfxBitstream is the key to search pPXPParams {pMfxBitstream | pPXPParams} */ typedef struct { mfxBitstream *pMfxBitstream; /*!< Pointer to input bitstream buffer. */ mfxHDL pPXPParams; /*!< Pointer to PXP parameters. */ mfxU8 reserved[24]; /*!< Reserved for future use. */ } *mfxDecodeParamMapHDL, mfxDecodeParamMap; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! This is a table to map pxp parameter associacted with encode input/output. PXP parameter point to VAEncryptionParameters on linux. {bitstream_ptr | pxp_param_ptr | pOutput | outputSize} */ typedef struct { mfxBitstream *pMfxBitstream; /*!< Pointer to output bitstream buffer. */ mfxHDL pPXPParams; /*!< Pointer to PXP parameters */ mfxHDL pOutput; /*!< Pointer to encode output meta data. */ mfxU32 outputSize; /*!< size of encode output meta data. */ mfxU8 reserved[16]; /*!< Reserved for future use. */ } *mfxEncodeParamMapHDL, mfxEncodeParamMap; MFX_PACK_END() MFX_PACK_BEGIN_STRUCT_W_PTR() /*! Describes pxp parameter of a frame. Simple usage example on linux: 1. Initialize oneVPL library and Create an oneVPL session. mfxLoader loader = MFXLoad(); mfxConfig cfg = MFXCreateConfig(loader); mfxVariant ImplValue; ImplValue.Type = MFX_VARIANT_TYPE_U32; ImplValue.Data.U32 = MFX_IMPL_TYPE_HARDWARE; MFXSetConfigFilterProperty(cfg,"mfxImplDescription.Impl",ImplValue); MFXCreateSession(loader,0,&session); 2. Create PXP session and do authentication va_dpy = vaGetDisplayDRM(m_fd);1. vaStatus = vaInitialize(va_dpy, &major_version, &minor_version); mfxHDL pxpSessionHdl; VAConfigID config_id; vaStatus = vaCreatedProtectedSession(va_dpy, config_id, &pxpSessionHdl); 3. Create mfxPXPCtx and set handle to VPL mfxPXPCtx pxp_ctx_hdl; pxp_ctx_hdl.pxpSessionHdl = pxpSessionHdl; MfxStatus = MFXCORE_SetHandle(mfx_session, MFX_HANDLE_CP_CONTEXT, (mfxHDL)&pxp_ctx_hdl); 4. Set structure mfxSecureDecodeConfig and Initialize decoder //set pxp_ctx_hdl.secureDecodeCfg reference describe of mfxSecureDecodeConfig mfxStatus = MFXVideoDECODE_Init(mfx_session, &init_param); 5. Set structure mfxSecureEncodeConfig and Initialize encoder //set pxp_ctx_hdl.secureEncodeCfg reference describe of mfxSecureEncodeConfig mfxStatus = MFXVideoENCODE_Init(mfx_session, &init_param); 7. Set structure mfxSecureVPPConfig and Initialize VPP //set pxp_ctx_hdl.secureVPPCfg reference describe of mfxSecureVPPConfig mfxStatus = MFXVideoVPP_Init(mfx_session, &init_param); 8. Attach PXP session and context vaStatus = vaAttachProtectedSession(va_dpy, pxpSessionHdl, pxp_ctx_hdl.secureDecodeCfg.ContextId); vaStatus = vaAttachProtectedSession(va_dpy, pxpSessionHdl, pxp_ctx_hdl.secureEncodeCfg.ContextId); vaStatus = vaAttachProtectedSession(va_dpy, pxpSessionHdl, pxp_ctx_hdl.secureVPPCfg.ContextId); 9. Decode frames mfxBitstrem bs_0; mfxFrameSurface1 *surface_work; mfxFrameSurface1 *surface_out_0; mfxHDL pPXPParams_0; mfxSyncPoint syncpD; //set pxp_ctx_hdl.decodeParamMapHdl reference describe of mfxDecodeParamMapHDL //pxp_ctx_hdl.decodeParamMapHdl = {&bs_0, &surface_out_0, &pPXPParams_0} mfxStatus = MFXVideoDECODE_DecodeFrameAsync(mfx_session, &bs_0, surface_work, &surface_out_0, &syncpD); mfxBitstrem bs_1; mfxFrameSurface1 *surface_out_1; mfxHDL pPXPParams_1; //set pxp_ctx_hdl.decodeParamMapHdl reference describe of mfxDecodeParamMapHDL //pxp_ctx_hdl.decodeParamMapHdl = {&bs_0, &surface_out_0, &pPXPParams_0}, {&bs_1, &surface_out_1, &pPXPParams_1} mfxStatus = MFXVideoDECODE_DecodeFrameAsync(mfx_session, &bs_1, surface_work, &surface_out_1, &syncpD); MFXVideoCORE_SyncOperation(mfx_session, syncpD, INFINITE); //Pop up unused pxp_ctx_hdl.decodeParamMapHdl 10.VPP mfxFrameSurface1 *surface_out_0; mfxFrameSurface1 *surface_vpp_out_0; mfxSyncPoint syncpP; mfxStatus = MFXVideoVPP_RunFrameVPPAsync(mfx_session, surface_out_0, surface_vpp_out_0, NULL, &syncpP); MFXVideoCORE_SyncOperation(mfx_session, syncpP, INFINITE); 11.Encode frames mfxBitstrem bs_out_0; mfxHDL pPXPParams_enc_0; mfxHDL PXPCounter_0; mfxSyncPoint syncpE; //pxp_ctx_hdl.encodeParamMapHdl = {surface_vpp_out_0, &bs_out_0, &pPXPParams_enc_0, PXPCounter_0} mfxStatus = MFXVideoENCODE_EncodeFrameAsync(mfx_session, NULL, surface_vpp_out_0, &bs_out_0, &syncpE); MFXVideoCORE_SyncOperation(mfx_session, syncpE, INFINITE); //Pop up unused pxp_ctx_hdl.encodeParamMapHdl 12.Detach contexts vaDetachProtectedSession(va_dpy, pxp_ctx_hdl.secureDecodeCfg.ContextId); vaDetachProtectedSession(va_dpy, pxp_ctx_hdl.secureEncodeCfg.ContextId); vaDetachProtectedSession(va_dpy, pxp_ctx_hdl.secureVPPCfg.ContextId); 13.Destroy PXP session and terninate VA display vaDestroyProtectedSession(pxpSessionHdl); vaTerminate(va_dpy); 14. release VPL session MFXVideoENCODE_Close(mfx_session); MFXUnload(mfx_loader); */ typedef struct { mfxHDL pxpSessionHdl; /*!< The handle of PXP Session. */ mfxSecureDecodeConfig secureDecodeCfg; /*!< Pointer to mfxSecureDecodeConfig structure. */ mfxSecureEncodeConfig secureEncodeCfg; /*!< Pointer to mfxSecureEncodeConfig structure. */ mfxSecureVPPConfig secureVPPCfg; /*!< Pointer to mfxSecureVPPConfig structure. */ mfxDecodeParamMapHDL decodeParamMapHdl; /*!< Pointer to mfxDecodeParamMapHDL structure. */ mfxU32 decodeParamMapCnt; /*!< The count of PXP parameters. */ mfxEncodeParamMapHDL encodeParamMapHdl; /*!< Pointer to mfxEncodeParamMapHDL structure. */ mfxU32 encodeParamMapCnt; /*!< The count of PXP parameters. */ mfxU8 reserved[12]; /*!< Reserved for future use. */ } mfxPXPCtx, *mfxPXPCtxHDL; MFX_PACK_END() #ifdef __cplusplus } // extern "C" #endif #endif //__MFX_PXP_H__ oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/000077500000000000000000000000001443134507600207155ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/BuildOptions.cmake000066400000000000000000000130761443134507600243410ustar00rootroot00000000000000# Copyright (c) 2017-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. message( STATUS "Global Configuration of Targets" ) include(CMakeDependentOption) option( MFX_ENABLE_EXT "Build with extensions?" ON ) cmake_dependent_option( MFX_ENABLE_KERNELS "Enable media kernels?" ON "MFX_ENABLE_EXT" OFF ) option( MFX_ENABLE_JPEG_SW_FALLBACK "Enabled software fallback for JPEG ?" ON ) option( ENABLE_OPENCL "Build targets dependent on OpenCL?" ON ) # -DENABLE_ALL will enable all the dependencies and features unless user did not # explicitly switched some of them OFF, i.e. configuring in the following way # is possible: # cmake -DENABLE_ALL=ON -DENABLE_TEXTLOG=OFF # and it will configure all targets except samples. # # TODO: As of now ENABLE_ALL is not fully implemented, it will not affect all # of the ENABLE_* options. Those options it don't affect are placed above # ENABLE_ALL definition and require some rework and/or pending CI adoption. # option( ENABLE_ALL "Enable all dependencies and features?" OFF ) option( ENABLE_ITT "Build targets with ITT instrumentation support (requires VTune)?" ${ENABLE_ALL} ) option( ENABLE_TEXTLOG "Enable textlog tracing?" ${ENABLE_ALL}) option( ENABLE_STAT "Enable stat tracing?" ${ENABLE_ALL}) # -DBUILD_ALL will enable all the build targets unless user did not explicitly # switched some targets OFF, i.e. configuring in the following way is possible: # cmake -DBUILD_ALL=ON -DBUILD_SAMPLES=OFF # and it will configure all targets except samples. option( BUILD_ALL "Build all the targets?" OFF ) option( BUILD_RUNTIME "Build mediasdk runtime (library, plugins, etc.)?" ON ) cmake_dependent_option( BUILD_TOOLS "Build tools?" ON "BUILD_ALL" OFF) option(BUILD_TESTS "Build tests?" ${BUILD_ALL}) option(USE_SYSTEM_GTEST "Use system installed gtest?" OFF) option(BUILD_MOCK_TESTS "Build all mocks' self tests?" ${BUILD_TESTS} ) option(BUILD_TUTORIALS "Build tutorials?" ${BUILD_ALL}) cmake_dependent_option( BUILD_KERNELS "Rebuild kernels (shaders)?" OFF "MFX_ENABLE_KERNELS" OFF) if (BUILD_KERNELS) find_program(CMC cmc) if(NOT CMC) message(FATAL_ERROR "Failed to find cm compiler") endif() find_program(GENX_IR GenX_IR) if(NOT GENX_IR) message(FATAL_ERROR "Failed to find GenX_IR compiler (part of IGC)") endif() endif() option( MFX_ENABLE_AV1_VIDEO_DECODE "Enabled AV1 decoder?" ON) option( MFX_ENABLE_VP8_VIDEO_DECODE "Enabled VP8 decoder?" ON) option( MFX_ENABLE_VP9_VIDEO_DECODE "Enabled VP9 decoder?" ON) option( MFX_ENABLE_H264_VIDEO_DECODE "Enabled AVC decoder?" ON) option( MFX_ENABLE_H265_VIDEO_DECODE "Enabled HEVC decoder?" ON) option( MFX_ENABLE_MPEG2_VIDEO_DECODE "Enabled MPEG2 decoder?" ON) option( MFX_ENABLE_MJPEG_VIDEO_DECODE "Enabled MJPEG decoder?" ON) option( MFX_ENABLE_MJPEG_VIDEO_ENCODE "Enabled MJPEG encoder?" ON) option( MFX_ENABLE_VC1_VIDEO_DECODE "Enabled VC1 decoder?" ON) option( MFX_ENABLE_H264_VIDEO_ENCODE "Enable H.264 (AVC) encoder?" ON) option( MFX_ENABLE_H265_VIDEO_ENCODE "Enable H.265 (HEVC) encoder?" ON) option( MFX_ENABLE_AV1_VIDEO_ENCODE "Enable AV1 encoder?" ON) option( MFX_ENABLE_VP9_VIDEO_ENCODE "Enable VP9 encoder?" ON) option( MFX_ENABLE_VPP "Enabled Video Processing?" ON) option( MFX_ENABLE_PXP "Enabled Video protection?" OFF) cmake_dependent_option( MFX_ENABLE_MPEG2_VIDEO_ENCODE "Enabled MPEG2 encoder?" ON "MFX_ENABLE_EXT" OFF) cmake_dependent_option( MFX_ENABLE_ASC "Enable ASC support?" ON "MFX_ENABLE_KERNELS" OFF) cmake_dependent_option( MFX_ENABLE_MCTF "Build with MCTF support?" ON "MFX_ENABLE_ASC;MFX_ENABLE_KERNELS;MFX_ENABLE_VPP" OFF) cmake_dependent_option( MFX_ENABLE_ENCODE_MCTF "Build encoders with MCTF support?" ON "MFX_ENABLE_ASC;MFX_ENABLE_KERNELS" OFF) option( MFX_ENABLE_ENCTOOLS "Enable encoding tools?" ON) cmake_dependent_option( MFX_ENABLE_AENC "Enabled AENC extension?" OFF "MFX_ENABLE_ENCTOOLS" OFF) option( MFX_ENABLE_MVC_VIDEO_ENCODE "Enable MVC encoder?" OFF) # Now we will include config file which may overwrite default values of the # options and options which user provided in a command line. # It is critically important to include config file _after_ definition of # all options. Otherwise rewrite of options in a config file will not take # effect! if (DEFINED MFX_CONFIG_FILE) # Include user provided cmake config file of the format: # set( VARIABLE VALUE ) message ( "Loading user-supplied config file ${MFX_CONFIG_FILE}" ) include(${MFX_CONFIG_FILE}) else() message ( "Loading VPL profile" ) include(${BUILDER_ROOT}/profiles/onevpl.cmake) endif() configure_file(mfx_features.h.in ${MSDK_CMAKE_BINARY_ROOT}/mfx_features.h) oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindFunctions.cmake000066400000000000000000000113361443134507600244740ustar00rootroot00000000000000# Copyright (c) 2012-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set( CMAKE_LIB_DIR ${CMAKE_BINARY_DIR}/__lib ) set( CMAKE_BIN_DIR ${CMAKE_BINARY_DIR}/__bin ) set_property( GLOBAL PROPERTY PROP_PLUGINS_CFG "" ) set_property( GLOBAL PROPERTY PROP_PLUGINS_EVAL_CFG "" ) # ..................................................... function( collect_oses ) if( CMAKE_SYSTEM_NAME MATCHES Windows ) set( Windows true PARENT_SCOPE ) set( NotLinux true PARENT_SCOPE ) set( NotDarwin true PARENT_SCOPE ) elseif( CMAKE_SYSTEM_NAME MATCHES Linux ) set( Linux true PARENT_SCOPE ) set( NotDarwin true PARENT_SCOPE ) set( NotWindows true PARENT_SCOPE ) elseif( CMAKE_SYSTEM_NAME MATCHES Darwin ) set( Darwin true PARENT_SCOPE ) set( NotLinux true PARENT_SCOPE ) set( NotWindows true PARENT_SCOPE ) endif() endfunction() # ..................................................... function( append what where ) set(${ARGV1} "${ARGV0} ${${ARGV1}}" PARENT_SCOPE) endfunction() # ..................................................... function( create_build ) file( GLOB_RECURSE components "${CMAKE_SOURCE_DIR}/*/CMakeLists.txt" ) foreach( component ${components} ) get_filename_component( path ${component} PATH ) if(NOT path MATCHES ".*/deprecated/.*") message(STATUS "Adding subdir: ${path}") add_subdirectory( ${path} ) endif() endforeach() endfunction() # ..................................................... # Usage: # create_build_outside_tree(current_repo|) # - current_repo|: the alias of the folder for which the built components will be placed # function( create_build_outside_tree current_repo) set(component "${CMAKE_SOURCE_DIR}/${current_repo}/CMakeLists.txt") if(EXISTS ${component}) add_subdirectory(${CMAKE_SOURCE_DIR}/${current_repo} ./${current_repo}) message(STATUS "Adding subdir: ${CMAKE_SOURCE_DIR}/${current_repo} ./${current_repo}") endif() endfunction() # ..................................................... function( git_describe git_commit ) execute_process( COMMAND git rev-parse --short HEAD OUTPUT_VARIABLE git_commit OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" ) if( NOT ${git_commit} MATCHES "^$" ) set( git_commit "${git_commit}" PARENT_SCOPE ) endif() endfunction() function(disable_werror) foreach(var CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO) string(REPLACE "-Werror" "" ${var} "${${var}}") endforeach() string(REPLACE " -Werror" "" TMP_C_DEBUG "${CMAKE_C_FLAGS_DEBUG}") string(REPLACE " -Werror" "" TMP_CXX_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") string(REPLACE " -Werror" "" TMP_C_RELEASE "${CMAKE_C_FLAGS_RELEASE}") string(REPLACE " -Werror" "" TMP_CXX_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_DEBUG "${TMP_C_DEBUG}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS_DEBUG "${TMP_CXX_DEBUG}" PARENT_SCOPE) set(CMAKE_C_FLAGS_RELEASE "${TMP_C_RELEASE}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS_RELEASE "${TMP_CXX_RELEASE}" PARENT_SCOPE) endfunction() macro (PushOption) foreach(arg IN ITEMS ${ARGN}) if (NOT DEFINED ${arg}) continue() endif() get_property(_save_help_${arg} CACHE ${arg} PROPERTY HELPSTRING) set(_save_value_${arg} ${${arg}}) endforeach() endmacro () macro (PopOption) foreach(arg IN ITEMS ${ARGN}) if (NOT DEFINED ${arg}) continue() endif() if (DEFINED _save_help_${arg}) set(${arg} ${_save_value_${arg}} CACHE BOOL ${_save_help_${arg}} FORCE) else() set(${arg} ${_save_value_${arg}}) endif() endforeach() endmacro ()oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindGTest.cmake000077500000000000000000000041071443134507600235530ustar00rootroot00000000000000# Copyright (c) 2014-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. find_path( GTEST_INCLUDE gtest/gtest.h PATHS "$ENV{GTEST_INCLUDE_PATH}" "/usr/local/include" ) find_library( GTEST_LIBRARY gtest PATHS "$ENV{GTEST_LIBRARY_PATH}" "/usr/local/lib" ) find_library( GTEST_MAIN_LIBRARY gtest_main PATHS "$ENV{GTEST_LIBRARY_PATH}" "/usr/local/lib" ) if(NOT GTEST_INCLUDE MATCHES NOTFOUND) if(NOT GTEST_LIBRARY MATCHES NOTFOUND AND NOT GTEST_MAIN_LIBRARY MATCHES NOTFOUND) set( GTEST_FOUND TRUE ) get_filename_component(GTEST_LIB_DIR ${GTEST_LIBRARY} PATH) get_filename_component(GTEST_MAIN_LIB_DIR ${GTEST_MAIN_LIBRARY} PATH) include_directories( "${GTEST_INCLUDE}" ) link_directories( "${GTEST_LIB_DIR}" "${GTEST_MAIN_LIB_DIR}" ) endif() endif() if(NOT DEFINED GTEST_FOUND) message( STATUS "Google tests libraries and headers were not found! Build GTest and install to /usr/local." ) else () message( STATUS "Google tests libraries were found in ${GTEST_LIB_DIR}" ) message( STATUS "Google tests headers were found in ${GTEST_INCLUDE}" ) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindGlobals.cmake000066400000000000000000000232551443134507600241120ustar00rootroot00000000000000# Copyright (c) 2012-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set_property( GLOBAL PROPERTY USE_FOLDERS ON ) # the following options should disable rpath in both build and install cases set( CMAKE_INSTALL_RPATH "" ) set( CMAKE_BUILD_WITH_INSTALL_RPATH TRUE ) set( CMAKE_SKIP_BUILD_RPATH TRUE ) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 11) set(CMAKE_POSITION_INDEPENDENT_CODE ON) collect_oses() add_library(mfx_common_properties INTERFACE) target_link_libraries(mfx_common_properties INTERFACE ${MFX_API_TARGET} ) target_compile_definitions(mfx_common_properties INTERFACE $<$>:NDEBUG> ) target_compile_definitions(mfx_common_properties INTERFACE $<$:MFX_ENABLE_LOG_UTILITY> ) if( Linux ) # If user did not override CMAKE_INSTALL_PREFIX, then set the default prefix # to /opt/intel/mediasdk instead of cmake's default if( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT ) set( CMAKE_INSTALL_PREFIX /opt/intel/mediasdk CACHE PATH "Install Path Prefix" FORCE ) endif() include( GNUInstallDirs ) target_compile_definitions(mfx_common_properties INTERFACE __USE_LARGEFILE64 _FILE_OFFSET_BITS=64 LINUX LINUX32 $<$:LINUX64> ) execute_process( COMMAND echo COMMAND cut -f 1 -d. COMMAND date "+.%-y.%-m.%-d" OUTPUT_VARIABLE cur_date OUTPUT_STRIP_TRAILING_WHITESPACE ) string( SUBSTRING ${MEDIA_VERSION_STR} 0 1 ver ) set( git_commit "" ) git_describe( git_commit ) target_compile_definitions(mfx_common_properties INTERFACE MSDK_BUILD=\"$ENV{BUILD_NUMBER}\" ) if (CMAKE_C_COMPILER_ID MATCHES Intel) set(no_warnings "-Wno-deprecated -Wno-unknown-pragmas -Wno-unused -wd2304") else() set(no_warnings "-Wno-deprecated-declarations -Wno-unknown-pragmas -Wno-unused") endif() # set(c_warnings "-Wall -Wformat -Wformat-security") # set(cxx_warnings "${c_warnings} -Wnon-virtual-dtor") # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -fPIC ${c_warnings} ${no_warnings}") # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -fPIC ${cxx_warnings} ${no_warnings}") # append("-fPIE -pie" CMAKE_EXE_LINKER_FLAGS) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BIN_DIR}/${CMAKE_BUILD_TYPE}) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BIN_DIR}/${CMAKE_BUILD_TYPE}) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_LIB_DIR}/${CMAKE_BUILD_TYPE}) elseif( Windows ) if( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT ) set( CMAKE_INSTALL_PREFIX "C:/Program Files/mediasdk/" CACHE PATH "Install Path Prefix" FORCE ) endif() set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BIN_DIR}/${CMAKE_BUILD_TYPE}) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BIN_DIR}/${CMAKE_BUILD_TYPE}) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_LIB_DIR}/${CMAKE_BUILD_TYPE}) foreach(config_type ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${config_type} config_type_capital) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${config_type_capital} ${CMAKE_BIN_DIR}/${config_type}) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config_type_capital} ${CMAKE_BIN_DIR}/${config_type}) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${config_type_capital} ${CMAKE_LIB_DIR}/${config_type}) endforeach() target_compile_definitions(mfx_common_properties INTERFACE MFX_DX9ON11 MFX_D3D11_ENABLED UNICODE _UNICODE NOMINMAX ) target_compile_options(mfx_common_properties INTERFACE $<$,$>:/Qspectre> $<$:/EHa> /guard:cf /fp:precise /Zc:wchar_t /Zc:inline /Zc:forScope /Gm- /Zi /GS /Gy ) target_link_options(mfx_common_properties INTERFACE /guard:cf ) endif( ) if( NOT DEFINED MFX_APPS_DIR) set( MFX_APPS_DIR ${CMAKE_INSTALL_FULL_DATADIR}/mfx ) endif() set( MFX_SAMPLES_INSTALL_BIN_DIR ${MFX_APPS_DIR}/samples ) set( MFX_SAMPLES_INSTALL_LIB_DIR ${MFX_APPS_DIR}/samples ) set( MFX_TOOLS_INSTALL_BIN_DIR ${MFX_APPS_DIR}/tools ) set( MFX_TOOLS_INSTALL_LIB_DIR ${MFX_APPS_DIR}/tools ) if( NOT DEFINED MFX_PLUGINS_DIR ) set( MFX_PLUGINS_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/mfx ) endif( ) if( NOT DEFINED MFX_PLUGINS_CONF_DIR ) set( MFX_PLUGINS_CONF_DIR ${CMAKE_INSTALL_FULL_DATADIR}/mfx ) endif( ) if( NOT DEFINED MFX_MODULES_DIR ) set( MFX_MODULES_DIR ${CMAKE_INSTALL_FULL_LIBDIR} ) endif( ) message( STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" ) # Some font definitions: colors, bold text, etc. if(NOT Windows) string(ASCII 27 Esc) set(EndColor "${Esc}[m") set(BoldColor "${Esc}[1m") set(Red "${Esc}[31m") set(BoldRed "${Esc}[1;31m") set(Green "${Esc}[32m") set(BoldGreen "${Esc}[1;32m") endif() # Usage: report_targets( "Description for the following targets:" [targets] ) # Note: targets list is optional function(report_targets description ) message("") message("${ARGV0}") foreach(target ${ARGV1}) message(" ${target}") endforeach() message("") endfunction() # Permits to accumulate strings in some variable for the delayed output function(report_add_target var target) set(${ARGV0} ${${ARGV0}} ${ARGV1} CACHE INTERNAL "" FORCE) endfunction() # Defined OS name and version and build info and build commit if( Linux ) execute_process( COMMAND lsb_release -i OUTPUT_VARIABLE OUTPUT ERROR_VARIABLE ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT ERROR) string(REPLACE "Distributor ID: " "" MFX_LINUX_NAME "${OUTPUT}") if(NOT "${OUTPUT}" STREQUAL "${MFX_LINUX_NAME}") set(MFX_SYSTEM "${MFX_LINUX_NAME}") endif() endif() execute_process( COMMAND getconf GNU_LIBC_VERSION OUTPUT_VARIABLE OUTPUT ERROR_VARIABLE ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT ERROR AND Linux) set(MFX_GLIBC ${OUTPUT}) endif() elseif( Windows ) set(MFX_SYSTEM "Windows") endif() if( API_USE_LATEST ) set(API_VER_MODIF "${API_VERSION}+") else() set(API_VER_MODIF "${API_VERSION}") endif() if( MFX_SYSTEM ) set( BUILD_INFO "${MFX_SYSTEM} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) else() set( BUILD_INFO "${CMAKE_SYSTEM} ${CMAKE_SYSTEM_VERSION} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) endif() if(Linux AND MFX_GLIBC) set( BUILD_INFO "${BUILD_INFO} | ${MFX_GLIBC}") endif() git_describe( git_commit ) target_compile_definitions(mfx_common_properties INTERFACE ${API_FLAGS} ${WARNING_FLAGS} MFX_BUILD_INFO=\"${BUILD_INFO}\" MFX_API_VERSION=\"${API_VER_MODIF}\" MFX_GIT_COMMIT=\"${git_commit}\" MEDIA_VERSION_STR=\"${MEDIA_VERSION_STR}\" ONEVPL_EXPERIMENTAL ) if(NOT CMAKE_SYSTEM_NAME MATCHES Windows) target_compile_options(mfx_common_properties INTERFACE $<$: -static-intel -Wno-deprecated -Wno-unknown-pragmas -Wno-unused > $<$>: -Wno-deprecated-declarations -Wno-unknown-pragmas -Wno-unused > ) endif() target_compile_definitions(mfx_common_properties INTERFACE $<$:MFX_TRACE_ENABLE_TEXTLOG> $<$:MFX_TRACE_ENABLE_STAT> $<$:MFX_TRACE_ENABLE_ITT> ) target_compile_definitions(mfx_common_properties INTERFACE SYNCHRONIZATION_BY_VA_SYNC_SURFACE ) target_include_directories(mfx_common_properties INTERFACE ${CMAKE_CURRENT_BINARY_DIR} ) add_library(mfx_require_ssse3_properties INTERFACE) if (CMAKE_C_COMPILER_ID MATCHES Intel) target_compile_options(mfx_require_ssse3_properties INTERFACE $<$: /arch:ssse3> $<$: -xssse3> ) else() target_compile_options(mfx_require_ssse3_properties INTERFACE # on Windows MSVC AVX includes SSSE3 $<$: /arch:AVX> $<$: -mssse3> ) endif() add_library(mfx_require_sse4_properties INTERFACE) if (CMAKE_C_COMPILER_ID MATCHES Intel) target_compile_options(mfx_require_sse4_properties INTERFACE $<$: /arch:sse4.2> $<$: -xsse4.2> ) else() target_compile_options(mfx_require_sse4_properties INTERFACE # on Windows MSVC SSE4.2 supported by default $<$: -msse4.2> ) endif() add_library(mfx_require_avx2_properties INTERFACE) if (CMAKE_C_COMPILER_ID MATCHES Intel) target_compile_options(mfx_require_avx2_properties INTERFACE $<$: /QxCORE-AVX2> $<$: -xCORE-AVX2> ) else() target_compile_options(mfx_require_avx2_properties INTERFACE $<$: /arch:AVX2> $<$: -mavx2> ) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindITT.cmake000066400000000000000000000055741443134507600231730ustar00rootroot00000000000000# Copyright (c) 2017-2019 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if( ENABLE_ITT ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set( arch "64" ) else() set( arch "32" ) endif() # VTune is a source of ITT library if( NOT CMAKE_VTUNE_HOME ) set( CMAKE_VTUNE_HOME /opt/intel/vtune_amplifier ) endif() find_path( ITT_INCLUDE_DIRS ittnotify.h PATHS ${CMAKE_ITT_HOME} ${CMAKE_VTUNE_HOME} PATH_SUFFIXES include ) # Unfortunately SEAPI and VTune uses different names for itt library: # * SEAPI uses libittnotify${arch}.a # * VTune uses libittnotify.a # We are trying to check both giving preference to SEAPI name. find_path( ITT_LIBRARY_DIRS libittnotify${arch}.a PATHS ${CMAKE_ITT_HOME} ${CMAKE_VTUNE_HOME} PATH_SUFFIXES lib64 ) if( NOT ITT_LIBRARY_DIRS MATCHES NOTFOUND ) set( ITT_LIBRARIES "ittnotify${arch}" ) else() find_path( ITT_LIBRARY_DIRS libittnotify.a PATHS ${CMAKE_ITT_HOME} ${CMAKE_VTUNE_HOME} PATH_SUFFIXES lib64 ) if( NOT ITT_LIBRARY_PATH MATCHES NOTFOUND ) set( ITT_LIBRARIES "ittnotify" ) endif() endif() if(NOT ITT_INCLUDE_DIRS MATCHES NOTFOUND AND NOT ITT_LIBRARY_DIRS MATCHES NOTFOUND) set( ITT_FOUND TRUE ) endif() if (ITT_FOUND) message( STATUS "itt header is in ${ITT_INCLUDE_DIRS}" ) message( STATUS "itt lib is in ${ITT_LIBRARY_DIRS}" ) message( STATUS "itt lib name is ${ITT_LIBRARIES}" ) add_library(itt STATIC IMPORTED) set_target_properties(itt PROPERTIES IMPORTED_LOCATION "${ITT_LIBRARY_DIRS}/${ITT_LIBRARIES}") target_include_directories(itt INTERFACE ${ITT_INCLUDE_DIRS}) target_link_libraries(itt INTERFACE ${ITT_LIBRARY_DIRS}/${ITT_LIBRARIES}) target_compile_definitions(itt INTERFACE MFX_TRACE_ENABLE_ITT) else() message( FATAL_ERROR "Failed to find ITT library" ) endif() endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindInternals.cmake000066400000000000000000000112241443134507600244570ustar00rootroot00000000000000# Copyright (c) 2012-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if(NOT DEFINED BUILDER_ROOT) set( BUILDER_ROOT ${CMAKE_HOME_DIRECTORY}/builder ) endif() get_filename_component( MSDK_BUILD_ROOT_MINUS_ONE "${BUILDER_ROOT}/.." ABSOLUTE ) set( MSDK_STUDIO_ROOT ${MSDK_BUILD_ROOT_MINUS_ONE}/_studio ) set( MSDK_TSUITE_ROOT ${MSDK_BUILD_ROOT_MINUS_ONE}/_testsuite ) set( MSDK_LIB_ROOT ${MSDK_STUDIO_ROOT}/mfx_lib ) set( MSDK_UMC_ROOT ${MSDK_STUDIO_ROOT}/shared/umc ) set( MSDK_SAMPLES_ROOT ${MSDK_BUILD_ROOT_MINUS_ONE}/samples ) set( MSDK_TOOLS_ROOT ${MSDK_BUILD_ROOT_MINUS_ONE}/tools ) set( MSDK_BUILDER_ROOT ${BUILDER_ROOT} ) set( MSDK_CMAKE_BINARY_ROOT ${CMAKE_CURRENT_BINARY_DIR} ) #================================================ add_library(mfx_static_lib INTERFACE) target_include_directories(mfx_static_lib INTERFACE ${MFX_API_HOME}/include ${MSDK_STUDIO_ROOT}/shared/include ${MSDK_LIB_ROOT}/shared/include ) target_compile_definitions(mfx_static_lib INTERFACE ${API_FLAGS} MFX_DEPRECATED_OFF ${WARNING_FLAGS} ) target_link_libraries(mfx_static_lib INTERFACE mfx_common_properties $<$:va> #fixme: break down to real dependencies ) target_link_libraries(mfx_static_lib INTERFACE ipp ) #================================================ add_library(mfx_shared_lib INTERFACE) target_link_options(mfx_shared_lib INTERFACE # $<$:/NODEFAULTLIB:libcmtd.lib> $<$,$>:/NODEFAULTLIB:libcpmt.lib> $<$: /DEBUG /PDB:$>/$_full.pdb /PDBSTRIPPED:$>/$.pdb > ) target_link_options(mfx_shared_lib INTERFACE $<$:LINKER:--no-undefined,-z,relro,-z,now,-z,noexecstack> ) target_link_libraries(mfx_shared_lib INTERFACE $<$: dxva2.lib D3D11.lib DXGI.lib d3d9.lib > mfx_common_properties ${CMAKE_DL_LIBS} ) target_compile_definitions(mfx_shared_lib INTERFACE ${API_FLAGS} ) add_library(mfx_sdl_properties INTERFACE) target_compile_options(mfx_sdl_properties INTERFACE $<$: /WX /W4 /sdl /wd5105 # macro expands to defined(smth) /wd4061 # not all enum members listed in case, but default found /wd4710 # no inline for inline function /wd4668 # replacing undefined macro with 0 /wd4201 # unnamed unions in headers /wd4711 # inlining of non-marked function > ) #================================================ add_library(mfx_plugin_properties INTERFACE) target_link_options(mfx_plugin_properties INTERFACE $<$: LINKER:/DEF:${MSDK_STUDIO_ROOT}/mfx_lib/plugin/libmfxsw_plugin.def> $<$: LINKER:--version-script=${MSDK_STUDIO_ROOT}/mfx_lib/plugin/libmfxsw_plugin.map> ) target_link_libraries(mfx_plugin_properties INTERFACE umc_va_hw Threads::Threads ${CMAKE_DL_LIBS} ) #================================================ add_library(mfx_va_properties INTERFACE) # va stands for video acceleration target_link_options(mfx_va_properties INTERFACE $<$:LINKER:--no-undefined,-z,relro,-z,now,-z,noexecstack> ) target_link_libraries(mfx_va_properties INTERFACE $<$:va> Threads::Threads ${CMAKE_DL_LIBS} ) target_compile_definitions(mfx_va_properties INTERFACE MFX_VA $<$: LIBVA_SUPPORT LIBVA_DRM_SUPPORT > ) oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindMDF.cmake000066400000000000000000000047401443134507600231330ustar00rootroot00000000000000# Copyright (c) 2017-2019 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if (CMAKE_SIZEOF_VOID_P EQUAL 8) set( mdf_arch x64 ) set( mdf_lib_suffix 64 ) else() set( mdf_arch x86) set( mdf_lib_suffix 86 ) endif() set( mdf_root $ENV{MFX_MDF_PATH} ) if( NOT EXISTS ${mdf_root} ) if( Windows ) message( STATUS "!!! There is no MFX_MDF_PATH, looking into $ENV{MEDIASDK_ROOT}/cmrt" ) set( mdf_root $ENV{MEDIASDK_ROOT}/cmrt ) else() message( STATUS "!!! There is no MFX_MDF_PATH, looking into $ENV{MEDIASDK_ROOT}/tools/linuxem64t/mdf" ) set( mdf_root $ENV{MEDIASDK_ROOT}/tools/linuxem64t/mdf ) endif() endif() find_path( CMRT_INCLUDE cm_rt.h PATHS ${mdf_root}/runtime/include ) find_path( CMDF_INCLUDE cm_def.h PATHS ${mdf_root}/compiler/include ${mdf_root}/compiler/include/cm ) if(NOT CMRT_INCLUDE MATCHES NOTFOUND AND NOT CMDF_INCLUDE MATCHES NOTFOUND) set( MDF_FOUND TRUE ) add_library(MDF::cmrt STATIC IMPORTED) set_target_properties(MDF::cmrt PROPERTIES IMPORTED_LOCATION "${ipp_root}/lib/ippcoremt.lib") target_include_directories(MDF::cmrt INTERFACE ${mdf_root}/runtime/include ${mdf_root}/compiler/include/cm ) target_link_libraries(MDF::cmrt INTERFACE ${mdf_root}/runtime/lib/${mdf_arch} ) endif() if(NOT DEFINED MDF_FOUND) message( FATAL_ERROR "Intel(R) MDF was not found (required)! Set/check MFX_MDF_PATH environment variable!" ) else () message( STATUS "Intel(R) MDF was found in ${mdf_root}" ) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindMFX.cmake000066400000000000000000000064261443134507600231620ustar00rootroot00000000000000# Copyright (c) 2020 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if( Linux ) set( os_arch "lin" ) elseif( Darwin ) set( os_arch "darwin" ) elseif( Windows ) set( os_arch "win" ) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) set( os_arch "${os_arch}_x64" ) else() set( os_arch "${os_arch}_ia32" ) endif() set( MFX_API_HOME ${MFX_API_HOME}/vpl) unset( MFX_INCLUDE CACHE ) find_path( MFX_INCLUDE NAMES mfxdefs.h PATHS "${MFX_API_HOME}" PATH_SUFFIXES include NO_CMAKE_FIND_ROOT_PATH ) include (${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) find_package_handle_standard_args(MFX REQUIRED_VARS MFX_INCLUDE) set( MFX_API_HOME ${MFX_INCLUDE} ) if (NOT MFX_FOUND) message( FATAL_ERROR "Unknown API = ${API}") endif() function( get_mfx_version mfx_version_major mfx_version_minor ) file(STRINGS ${MFX_API_HOME}/mfxdefs.h major REGEX "#define MFX_VERSION_MAJOR" LIMIT_COUNT 1) if(major STREQUAL "") # old style version file(STRINGS ${MFX_API_HOME}/mfxvideo.h major REGEX "#define MFX_VERSION_MAJOR") endif() file(STRINGS ${MFX_API_HOME}/mfxdefs.h minor REGEX "#define MFX_VERSION_MINOR" LIMIT_COUNT 1) if(minor STREQUAL "") # old style version file(STRINGS ${MFX_API_HOME}/mfxvideo.h minor REGEX "#define MFX_VERSION_MINOR") endif() string(REPLACE "#define MFX_VERSION_MAJOR " "" major ${major}) string(REPLACE "#define MFX_VERSION_MINOR " "" minor ${minor}) set(${mfx_version_major} ${major} PARENT_SCOPE) set(${mfx_version_minor} ${minor} PARENT_SCOPE) endfunction() # Potential source of confusion here. MFX_VERSION should contain API version i.e. 1025 for API 1.25, # Product version stored in MEDIA_VERSION_STR get_mfx_version(major_vers minor_vers) set( API_VERSION "${major_vers}.${minor_vers}") set( MFX_VERSION_MAJOR ${major_vers}) set( MFX_VERSION_MINOR ${minor_vers}) set( API_USE_LATEST TRUE ) set( API_FLAGS -DMFX_VERSION_USE_LATEST ) add_library( onevpl-api INTERFACE ) target_include_directories(onevpl-api INTERFACE ${MFX_API_HOME} ${MFX_API_HOME}/../mediasdk_structures ${MFX_API_HOME}/private ) target_compile_definitions(onevpl-api INTERFACE MFX_ONEVPL ) add_library( onevpl::api ALIAS onevpl-api ) set (MFX_API_TARGET onevpl::api) message(STATUS "Enabling API ${major_vers}.${minor_vers} feature set with flags ${API_FLAGS}") oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindOpenCL.cmake000066400000000000000000000035541443134507600236470ustar00rootroot00000000000000# Copyright (c) 2014-2020 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. find_path( OPENCL_INCLUDE CL/opencl.h PATHS /usr/include /opt/intel/opencl/include) find_library( OPENCL_LIBRARY libOpenCL.so PATHS /usr/lib /opt/intel/opencl/) set( OCL_LIBS "" ) if ( NOT OPENCL_INCLUDE MATCHES NOTFOUND ) if ( NOT OPENCL_LIBRARY MATCHES NOTFOUND ) if ( EXISTS /etc/OpenCL/vendors/intel.icd ) set ( OPENCL_FOUND TRUE ) get_filename_component( OPENCL_LIBRARY_PATH ${OPENCL_LIBRARY} PATH ) list( APPEND OPENCL_LIBS OpenCL ) endif() endif() endif() if ( NOT DEFINED OPENCL_FOUND ) message( STATUS "Intel OpenCL SDK was not found (optional). The following will not be built: rotate_opencl plugin.") else () message( STATUS "Intel OpenCL SDK was found here: ${OPENCL_LIBRARY_PATH} and ${OPENCL_INCLUDE}" ) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindPackages.cmake000066400000000000000000000032571443134507600242450ustar00rootroot00000000000000## Copyright(C) 2012-2020 Intel Corporation. All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if( Linux ) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) endif() find_package(Threads REQUIRED) if( Linux ) find_package(PkgConfig REQUIRED) # required: pkg_check_modules(PKG_LIBVA REQUIRED libva>=1.9 IMPORTED_TARGET) pkg_check_modules(PKG_LIBDRM REQUIRED libdrm>=2.4 IMPORTED_TARGET) pkg_check_modules(PKG_LIBVA_DRM REQUIRED libva-drm>=1.9 IMPORTED_TARGET) add_library(va INTERFACE) target_link_libraries(va INTERFACE PkgConfig::PKG_LIBVA PkgConfig::PKG_LIBDRM PkgConfig::PKG_LIBVA_DRM ) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindTrace.cmake000066400000000000000000000025601443134507600235610ustar00rootroot00000000000000# Copyright (c) 2015-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if(__TRACE) message( STATUS "Enabled tracing: ${__TRACE}" ) endif() # ITT instrumentation is enabled by default to make VTune working out of the box set(__ITT TRUE) include (${BUILDER_ROOT}/FindVTune.cmake) if(__TRACE MATCHES all) set(ENABLE_TEXTLOG ON) set(ENABLE_STAT ON) endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/FindVTune.cmake000066400000000000000000000045371443134507600235720ustar00rootroot00000000000000# Copyright (c) 2015-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. if(__ITT OR ENABLE_ITT) if( Linux ) if( CMAKE_VTUNE_HOME ) set( VTUNE_HOME ${CMAKE_VTUNE_HOME} ) elseif( DEFINED ENV{CMAKE_VTUNE_HOME} ) set( VTUNE_HOME $ENV{CMAKE_VTUNE_HOME} ) else() set( VTUNE_HOME /opt/intel/vtune_amplifier_xe ) endif() if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) set( arch "64" ) elseif() set( arch "32" ) endif() find_path( VTUNE_INCLUDE ittnotify.h PATHS ${VTUNE_HOME}/include ) find_library( VTUNE_LIBRARY libittnotify.a PATHS ${VTUNE_HOME}/lib${arch}/ ) if( NOT VTUNE_INCLUDE MATCHES NOTFOUND ) if( NOT VTUNE_LIBRARY MATCHES NOTFOUND ) set( VTUNE_FOUND TRUE ) message( STATUS "ITT was found here ${VTUNE_HOME}" ) get_filename_component( VTUNE_LIBRARY_PATH ${VTUNE_LIBRARY} PATH ) include_directories( ${VTUNE_INCLUDE} ) link_directories( ${VTUNE_LIBRARY_PATH} ) append( "-DMFX_TRACE_ENABLE_ITT" CMAKE_C_FLAGS ) append( "-DMFX_TRACE_ENABLE_ITT" CMAKE_CXX_FLAGS ) set( ITT_CFLAGS "-I${VTUNE_INCLUDE} -DITT_SUPPORT" ) set( ITT_LIBRARY_DIRS "${VTUNE_LIBRARY_PATH}" ) set( ITT_LIBRARIES "ittnotify" ) endif() endif() else() message( STATUS "MFX tracing is supported only for linux!" ) endif() endif() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/MfxConfig.cmake000066400000000000000000000000651443134507600236000ustar00rootroot00000000000000include("${CMAKE_CURRENT_LIST_DIR}/MfxTargets.cmake")oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/profiles/000077500000000000000000000000001443134507600225405ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/profiles/onevpl.cmake000066400000000000000000000031211443134507600250420ustar00rootroot00000000000000# Copyright (c) 2018-2019 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set(CMAKE_VERBOSE_MAKEFILE ON) function( make_runtime_name variant name ) if( CMAKE_SYSTEM_NAME MATCHES Windows) set(prefix "lib") else() set(prefix "") endif() set (runtime_name ${prefix}mfx ) if( CMAKE_SYSTEM_NAME MATCHES Windows ) if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) set( runtime_name ${runtime_name}64 ) else() set( runtime_name ${runtime_name}32 ) endif() endif() set (runtime_name ${runtime_name}-gen) set( ${name} ${runtime_name} PARENT_SCOPE) endfunction() oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/profiles/open_source.cmake000066400000000000000000000021431443134507600260630ustar00rootroot00000000000000# Copyright (c) 2020 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set( MFX_ENABLE_AENC OFF )oneVPL-intel-gpu-intel-onevpl-23.2.3/builder/profiles/readme.md000066400000000000000000000013651443134507600243240ustar00rootroot00000000000000# Profiles Profiles are intended to be a collection of build options grouped together to facilitate special usages. ## Fastboot Profile file fastboot.cmake facilitate building of stripped version of Media SDK tailored to embedded usages cmake -DMFX_CONFIG_FILE=../builder/profiles/fastboot.cmake Library name changed to mfxhw64/32-fastboot. All components disabled to dial down binary size and thus facilitate load time on an ultra-lowpower devices. Olny AVC, HEVC, VP9 and MPEG-2 Decoders left enabled in the library. Unlike regular Media SDK fastboot variant not detected by dispatcher and usually directly linked by application, which should implement minimal subset of dispatcher funcionality. I.e. pass non-default values to the MFXInit() call.oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/000077500000000000000000000000001443134507600207275ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/aenc/000077500000000000000000000000001443134507600216355ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/aenc/libaenc.a000066400000000000000000153231241443134507600234070ustar00rootroot00000000000000! / 0 0 0 0 14140 ` 888888888888888888888888888888888888888888888888888888888888888888888888888888tttttttttttttttttttttttttttttt 0(3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX4LX_ZN4aenc14moving_averageEiii_ZN4aenc8quant_scEi_ZN4aenc14quant_contrastEi_ZN4aenc9quant_tscEi_ZN4aenc8quant_mvEi_ZN4aenc13ExternalFrameD2Ev_ZN4aenc13ExternalFrameD1Ev_ZN4aenc13ExternalFramecv9AEncFrameEv_ZTIN4aenc5ErrorE_ZN4aenc13ExternalFrame5printEv_ZN4aenc4AEnc4InitE9AEncParam_ZN4aenc4AEnc5CloseEvAEncCloseDW.ref.__gxx_personality_v0DW.ref._ZTIN4aenc5ErrorE_ZN4aenc13InternalFrameD2Ev_ZN4aenc13InternalFrameD1Ev_ZN4aenc4AEnc6RunScdEPKhiRNS_13InternalFrameE_ZN4aenc4AEnc12SaveAltrStatERNS_13InternalFrameE_ZN4aenc4AEnc12SaveArefStatERNS_13InternalFrameE_ZN4aenc4AEnc11SaveApqStatERNS_13InternalFrameE_ZN4aenc4AEnc8SaveStatERNS_13InternalFrameE_ZN4aenc4AEnc20GetMiniGopSizeCommonEv_ZN4aenc4AEnc18GetMiniGopSizeAGOPEv_ZN4aenc4AEnc19MakeMiniGopDecisionERj_ZN4aenc4AEnc17SaveFrameTypeInfoERNS_13InternalFrameE_ZN4aenc4AEnc15ComputeStatAltrERNS_13InternalFrameE_ZN4aenc4AEnc15ComputeStatArefERNS_13InternalFrameE_ZN4aenc4AEnc17FindInternalFrameEj_ZN4aenc4AEnc17FindExternalFrameEj_ZN4aenc4AEnc11UpdateFrameEjjjAEncUpdateFrame_ZN4aenc4AEnc16GetIntraDecisionEjAEncGetIntraDecision_ZN4aenc4AEnc17GetPersistenceMapEjPhAEncGetPersistenceMap_ZN4aenc4AEnc10GetLastPQpEvAEncGetLastPQp_ZN4aenc4AEnc10APQPredictEjjjjjjAEncAPQSelect_ZN4aenc4AEnc14ComputeStatApqERNS_13InternalFrameE_ZN4aenc4AEnc11ComputeStatERNS_13InternalFrameE_ZN4aenc4AEnc11AdjustQpLtrERNS_13InternalFrameE_ZN4aenc4AEnc12AdjustQpArefERNS_13InternalFrameE_ZN4aenc4AEnc11AdjustQpApqERNS_13InternalFrameE_ZN4aenc4AEnc12AdjustQpAgopERNS_13InternalFrameE_ZN4aenc4AEnc8AdjustQpERNS_13InternalFrameE_ZN4aenc4AEnc12MarkFrameAsIERNS_13InternalFrameE_ZN4aenc4AEnc14MarkFrameAsIDRERNS_13InternalFrameE_ZN4aenc4AEnc18MakeIFrameDecisionERNS_13InternalFrameE_ZN4aenc4AEnc14MarkFrameAsLTRERNS_13InternalFrameE_ZN4aenc4AEnc16MakeArefDecisionERNS_13InternalFrameE_ZN4aenc4AEnc18MarkFrameInMiniGOPERNS_13InternalFrameEjj_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED2Ev_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED1Ev_ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED2Ev_ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED1EvAEncInit_ZNSt6vectorIjSaIjEEaSERKS1__ZN4aenc13InternalFramecvNS_13ExternalFrameEEv_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EE16_M_push_back_auxIJRKS1_EEEvDpOT__ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT__ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EE_ZN4aenc4AEnc18MakeDbpDecisionRefERNS_13InternalFrameE_ZNSt6vectorIjSaIjEE17_M_realloc_insertIJRKjEEEvN9__gnu_cxx17__normal_iteratorIPjS1_EEDpOT__ZNSt6vectorIjSaIjEE9push_backERKj_ZN4aenc4AEnc16MakeAltrDecisionERNS_13InternalFrameE_ZN4aenc4AEnc20MakeAltrArefDecisionERNS_13InternalFrameE_ZN4aenc4AEnc14OutputDecisionEP9AEncFrame_ZN4aenc4AEnc19MakeDbpDecisionArefERNS_13InternalFrameE_ZN4aenc4AEnc18MakeDbpDecisionLtrERNS_13InternalFrameE_ZN4aenc4AEnc15MakeDbpDecisionERNS_13InternalFrameE_ZN4aenc4AEnc16BuildRefListArefERNS_13InternalFrameE_ZN4aenc4AEnc15BuildRefListLtrERNS_13InternalFrameE_ZN4aenc4AEnc12BuildRefListERNS_13InternalFrameE_ZN4aenc4AEnc12ProcessFrameEjPKhiP9AEncFrameAEncProcessFrame_ZTSN4aenc5ErrorE_ZN4aenc11AGOPSelect1Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect2Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect3Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect4Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect5Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect6Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect7Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect8Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect9Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectAEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectBEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectCEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectDEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectEEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectFEjjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect10Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect11Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect12Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect13Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect14Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect15Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect16Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect17Ejjjijjijjsjjjiijjjjsjjj_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT__ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_DW.ref.__gxx_personality_v0_ZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjss_ZN4aenc11AGOPSelect1Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect2Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect3Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect4Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect5Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect6Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect7Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect8Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect9Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectAEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectBEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectCEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectDEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectEEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectFEjjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect10Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect11Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect12Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect13Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect14Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect15Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect16Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect17Ejjjijjjjsjjjiijjjjsjjj_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT__ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_DW.ref.__gxx_personality_v0_ZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjss_ZN4aenc9APQSelectEjjjjjj_ZN4aenc9SCDetect1Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect2Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect3Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect4Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect5Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect6Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect7Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect8Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect9Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetectAEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectBEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectCEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectDEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectEEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectFEjjjjjijjijjjjjjjijji_ZN4aenc10SCDetect10Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect11Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect12Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect13Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect14Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect15Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetectRFEijjjjjijjijjjjjijjjjh_ZN4aenc12GainOffset_CEPPhS1_ttts_ZN4aenc14RsCsCalc_4x4_CEPhiiiPtS1__ZN4aenc16RsCsCalc_bound_CEPtS0_S0_PjS1_S1_ii_ZN4aenc15RsCsCalc_diff_CEPtS0_S0_S0_iiPjS1__ZN4aenc20ImageDiffHistogram_CEPhS0_jjjPiPxS2__ZN4aenc25ME_SAD_8x8_Block_Search_CEPhS0_iiiPtPiS2__ZN4aenc17RsCsCalc_4x4_SSE4EPhiiiPtS1__ZN4aenc28ME_SAD_8x8_Block_Search_SSE4EPhS0_iiiPtPiS2__ZN4aenc18Calc_RaCa_pic_SSE4EPhiiiRd_ZN4aenc15Calc_RaCa_pic_CEPhiiiRd_ZN4aenc23ImageDiffHistogram_SSE4EPhS0_jjjPiPxS2__ZN4aenc23RsCsCalc_4x4_NoBlkShiftEPhiiiPtS1__ZN4aenc9imageInitEPNS_18ASCYUV_layer_storeE_ZN4aenc9nullifierEPNS_12ASCimageDataE_ZN4aenc14ImDetails_InitEPNS_16ASCImage_detailsE_ZN4aenc10ASCTSCstatC2Ev_ZN4aenc10ASCTSCstatC1Ev_ZN4aenc15ASCTSCstat_InitEPPNS_10ASCTSCstatEDW.ref.__gxx_personality_v0_ZN4aenc12ASCimageDataC2Ev_ZN4aenc12ASCimageDataC1Ev_ZN4aenc12ASCimageDataD2Ev_ZN4aenc12ASCimageDataD1Ev_ZN4aenc12ASCimageDataaSERKS0__ZN4aenc12ASCimageData9InitFrameEv_ZN4aenc3ASCC2Ev_ZN4aenc3ASCC1Ev_ZN4aenc3ASC17Setup_EnvironmentEv_ZN4aenc3ASC11Params_InitEv_ZN4aenc3ASC15VidSample_AllocEv_ZN4aenc3ASC17VidSample_disposeEv_ZN4aenc3ASC15VidRead_disposeEv_ZN4aenc3ASC10InitStructEv_ZN4aenc3ASC12VidRead_InitEv_ZN4aenc3ASC14VidSample_InitEv_ZN4aenc3ASC21SetUltraFastDetectionEv_ZN4aenc3ASC21SubSampleASC_ImageProEPhiiiNS_9ASCLayersEj_ZN4aenc3ASC8SetWidthEi_ZN4aenc3ASC9SetHeightEi_ZN4aenc3ASC8SetPitchEi_ZN4aenc3ASC12SetNextFieldEv_ZN4aenc3ASC13SetDimensionsEiii_ZN4aenc3ASC16SetInterlaceModeENS_6ASCFTSE_ZN4aenc3ASC21SubSampleASC_ImageIntEPhiiiNS_9ASCLayersEj_ZN4aenc3ASC4InitEiiijbj_ZN4aenc3ASC16IsASCinitializedEv_ZN4aenc3ASC15AssignResourcesEhPh_ZN4aenc3ASC15SetControlLevelEh_ZN4aenc3ASC10SetGoPSizeEj_ZN4aenc3ASC12ResetGoPSizeEv_ZN4aenc3ASC5CloseEv_ZN4aenc3ASC15SubSample_PointEPhjjjS1_jjjRs_ZN4aenc3ASC8RsCsCalcEv_ZN4aenc14Hint_LTR_op_onEjj_ZN4aenc3ASC10ShotDetectERNS_12ASCimageDataES2_RNS_16ASCImage_detailsEPNS_10ASCTSCstatES6_h_ZN4aenc11TableLookUpEjPjj_ZN4aenc20CorrectionForGoPSizeEPNS_19ASCextended_storageEj_ZN4aenc3ASC12CompareStatsEhh_ZN4aenc3ASC16FrameRepeatCheckEv_ZN4aenc3ASC16ML_SelectGoPSizeEv_ZN4aenc3ASC15GetFrameGopSizeEv_ZN4aenc3ASC12Put_LTR_HintEv_ZN4aenc3ASC13calc_RaCa_picEPhiiiRd_ZN4aenc3ASC25Get_asc_subsampling_widthEv_ZN4aenc3ASC26Get_asc_subsampling_heightEv_ZN4aenc3ASC25Get_starting_frame_numberEv_ZN4aenc3ASC16Get_frame_numberEv_ZN4aenc3ASC23Get_frame_shot_DecisionEv_ZN4aenc3ASC23Get_Repeated_Frame_FlagEv_ZN4aenc3ASC29Get_scene_transition_DecisionEv_ZN4aenc3ASC12Get_frame_SCEv_ZN4aenc3ASC13Get_frame_TSCEv_ZN4aenc3ASC13Get_frame_MV0Ev_ZN4aenc3ASC16Get_frame_MVSizeEv_ZN4aenc3ASC18Get_frame_ContrastEv_ZN4aenc3ASC27Get_frame_RecentHighMvCountEv_ZN4aenc3ASC17Get_frame_mcTCorrEv_ZN4aenc3ASC21Get_frame_mcTCorr_APQEv_ZN4aenc3ASC17Get_frame_ltrMCFDEv_ZN4aenc3ASC23Get_frame_last_in_sceneEv_ZN4aenc3ASC36Get_GoPcorrected_frame_shot_DecisionEv_ZN4aenc3ASC28Get_frame_Spatial_complexityEv_ZN4aenc3ASC29Get_frame_Temporal_complexityEv_ZN4aenc3ASC35Get_frame_SpatioTemporal_complexityEv_ZN4aenc3ASC16Get_PDist_adviceEv_ZN4aenc3ASC14Get_LTR_adviceEv_ZN4aenc3ASC24Get_RepeatedFrame_adviceEv_ZN4aenc3ASC18get_PersistenceMapEPhb_ZN4aenc3ASC25CorrectScdMiniGopDecisionEv_ZN4aenc3ASC26Check_last_frame_processedEj_ZN4aenc3ASC26Reset_last_frame_processedEv_ZN4aenc14bufferRotationEPvS0__ZN4aenc3ASC21GeneralBufferRotationEv_ZN4aenc3ASC19Get_Last_frame_DataEv_ZN4aenc3ASC15GetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc3ASC15SetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc7DistIntENS_14ASCcoordinatesE_ZN4aenc16ME_SAD_8x8_BlockEPhS0_jj_ZN4aenc12MVcalcSAD8x8ENS_14ASCcoordinatesEPhS1_PNS_16ASCImage_detailsEPtPi_ZN4aenc19SearchLimitsCalcSqrEssPsS0_S0_S0_PNS_16ASCImage_detailsEiNS_14ASCcoordinatesEPNS_24ASCVideo_characteristicsE_ZN4aenc16SearchLimitsCalcEssPsS0_S0_S0_PNS_16ASCImage_detailsEiNS_14ASCcoordinatesEPNS_24ASCVideo_characteristicsE_ZN4aenc16ME_VAR_8x8_BlockEPhS0_S0_ssjjRiS1_S1__ZN4aenc12MVcalcVar8x8ENS_14ASCcoordinatesEPhS1_ssRiS2_S2_PNS_16ASCImage_detailsE_ZN4aenc9ME_simpleEPNS_19ASCextended_storageEiPNS_16ASCImage_detailsEPNS_12ASCimageDataES5_bPNS_24ASCVideo_characteristicsEPFvPhS8_iiiPtPiSA_E_ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNKSt7__cxx114listISt4pairIibESaIS2_EE13_M_resize_posERm_ZNSt7__cxx114listISt4pairIibESaIS2_EE17_M_default_appendEm_ZN4aenc3ASC17Continue_LTR_ModeEtt_ZN4aenc3ASC15get_LTR_op_hintERNS_11ASC_LTR_DECE_ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS2_ERS1__ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKjjEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT__ZN4aenc3ASC14MotionAnalysisEPNS_14ASCvideoBufferES2_PjPtS3_S3_S3_S3_NS_9ASCLayersEPf_ZN4aenc3ASC21DetectShotChangeFrameEb_ZN4aenc3ASC16AscFrameAnalysisEv_ZN4aenc3ASC8RunFrameEPhjb_ZN4aenc3ASC19PutFrameProgressiveEPhib_ZN4aenc3ASC12RunFrame_LTREv// 96 ` av1_asc_agop_tree.cpp.o/ hevc_asc_agop_tree.cpp.o/ hevc_asc_apq_tree.cpp.o/ av1_asc_tree.cpp.o/ aenc.cpp.o/ 0 0 0 644 81024 ` ELF>,@@@? !"$%'()*+,-./014567H1s0HH)HHHHH~tHiҀHA99A9s|HEKH :A9vhHAAHyHHH)HHi :ID;CvmIHIL)Hi :K;kHH)Hi :HIҋ|A9rD9Aw E9~[D]A\A]A^A_IHAHHjHt1n>f}Anff.I1s0ATUHH8H+@SHHPH0HIHH)HHTH(H)HIHH9v[1]A\f.HH+ HHLHx6u4y(tHHAA9DGD#[]A\1J LH(I1s0H8H+@HL)HPH+0IHHIHTHt2F(AAAut@HLI>LHxHH+hL)HLH+HIHIHTHtL9t džIrHF(ATUSFHH~&=O)ȍPHȉLH8E1HLLLffv҃Foofvffvfffofsffofsff~tC[]A\Cƅ[]A\F(ƇvzF 1HLJ@SL8H(HLH+@LPH0IHH1s0HI)MHII)LINLMMIMb9 :L@tL9-9@tL`L9tO9`HH9ItP90L :L9uLBHBA;0trL@HPA90teLBHBA;0tXHPH@H :IuI1s0II)I)IIJ|MIIt^It(ItB1[fDLI9º[HD90tH :H9u!HBH;0tHB90t190tH :H9uHGH%ff.SLHxHhLH+LHIHH>HI)MHII)LINLMMIMb9LL9-9LL9tO9H H9ItP90LL9uLBHBA;0trL@HPA90teLBHBA;0tXHPH@HIuI>II)I)IIJ|MIIt^It(ItB1[fDLI9º[HD90tHH9u!HBH;0tHB90t190tHH9uHGH%ff.ATIUSHtWx(@ht6[]A\HH)H@tH`H :u;A$A$[]A\fLHtx@huDI$I$H1s0HH)HHHHcHiҀH.; :t1;@tt1;`t1HH9);uH9 HH :H@tH`;tH :;tH :ff.HtHHfHfATAUHHHt%P(t1H]A\DHH1HtۋRfD1HtHHHfHJHH9vH H9offo ftDo DBofDtfz o,ftfDj0o<ftfr@oLftfbPo\ftfR`ftDolffAtDJpfE80ffAsfE80ff80fsfAf80fAfD80fsff80f80fAfsff80fsff80foff80f80ffsff80f80ffsff80fsff80ff80fffofsffofsffofsffDD1E1D fAHH=uDff.f1HtHHHfD1HtHHHf։DEDL$fD1HtUHHEPZYHfAVAUATUHSHLcLcLcHHEVCteAV1 t]HKDmHHHPKdHPIHBpH[HHH]A\A]A^KTmHHHHBKdHPHIBp롐fATIUHHu%u*u5H]A\ftLHtHLH]A\f.~(tF~ttZ+ )uFPtuF$tF,LJfD~(t6~t~F,uƋFPtuF$tҐff.HdH%(HD$1F(veFv}F$D$F,EF$G‹~btt1҃fDV,DHD$dH3%(Ht;F,f.4u fDF$F,Dt3ug1҃ƒWB41҃ƒV,)ftF(Pv#VuwF$tw tt.DvF,F,ÐF,fDF,ATIUHHF,u^uDu*tu HtfDH}hHtH}PHtH}8HtI :T$LLLLLLLLLLLLLLLHl$PLHIIHH9uT$PT$TPT$UPT$VPT$XPT$\P T$`PT$dPT$hPT$lPT$pP T$tP$o\$xX($P8$PIHHLH)HL$ HHTIxHL$H||I+hHHHH9m IXI`LH)HHH)HtID$T$PIT$TPT$UPT$VPT$XPT$\P T$`PT$dPT$hPT$lPT$pP T$tP$od$x`($P8$PHH{hHtH{PHtH{8HtH :I9ufH :I9uAWAVAUATUHSH(HG LwHLo0Lg8HD$HG(H_LxHD$M9vNIHzpHtHT$HT$HzXHtHT$HT$Hz@H@IM9wL9t$?H;\$t3`D3pJ3P3V#\af,kpvu| & 8     < Y  /m P pL  ":   ": , 3 7 !0L X sx      0 !6 (  0 !4I [ k "B "B    B j    $ I  z    @47Yh.3Z0 @ 6 j00SvB- Zp - "-" 3"-B#c}0#-`#=$v %%cO &'h(( (@)w) **N"qG"qv"9"9-<"!F@0H"$A"' *")@1 "+b:"-%];P>Q>`E -pJ dO_Os`PPQ2@Q_zi,!/aenc.cpp_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc18MakeDbpDecisionLtrERS3_EUlSC_E_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc16MakeAltrDecisionERS3_EUlSC_E1_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc16MakeAltrDecisionERS3_EUlSC_E_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc16BuildRefListArefERS3_EUlSC_E_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc15BuildRefListLtrERS3_EUlSC_E_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN4aenc13InternalFrameESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predIZNS2_4AEnc19MakeDbpDecisionArefERS3_EUlSC_E_EEET_SF_SF_T0_St26random_access_iterator_tag.isra.0_ZN4aenc13ExternalFramecv9AEncFrameEv.cold_ZN4aenc4AEnc4InitE9AEncParam.coldAEncClose.cold_ZN4aenc4AEnc20GetMiniGopSizeCommonEv.coldAEncUpdateFrame.coldAEncGetIntraDecision.coldAEncGetPersistenceMap.coldAEncGetLastPQp.coldAEncAPQSelect.cold_ZN4aencL14APQ_Lookup_AVCE_ZN4aencL15APQ_Lookup_HEVCE_ZN4aenc4AEnc18MarkFrameInMiniGOPERNS_13InternalFrameEjj.coldAEncInit.cold_ZN4aenc13InternalFramecvNS_13ExternalFrameEEv.cold_ZN4aenc4AEnc18MakeDbpDecisionRefERNS_13InternalFrameE.cold_ZN4aenc4AEnc14OutputDecisionEP9AEncFrame.cold_ZN4aenc4AEnc19MakeDbpDecisionArefERNS_13InternalFrameE.cold_ZN4aenc4AEnc18MakeDbpDecisionLtrERNS_13InternalFrameE.cold_ZN4aenc4AEnc12ProcessFrameEjPKhiP9AEncFrame.coldAEncProcessFrame.cold.LC5.LC6.LC8.LC10.LC7.LC14.LC9.LC11.LC13.LC15.LC16.LC12.LC17.LC27.LC30.LC34.LC40.LC35.LC36.LC37.LC38.LC39.LC41.LC44.LC48.LC2.LC1.LC3.LC0.LC19.LC18.LC23.LC22.LC21.LC20.LC43.LC42.LC49_ZN4aenc13ExternalFrameD5Ev_ZN4aenc13InternalFrameD5Ev_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED5Ev_ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED5Ev_ZN4aenc14moving_averageEiii_ZN4aenc8quant_scEi_ZN4aenc14quant_contrastEi_ZN4aenc9quant_tscEi_ZN4aenc8quant_mvEi_ZN4aenc13ExternalFrameD2Ev_GLOBAL_OFFSET_TABLE__ZdlPv_ZN4aenc13ExternalFrameD1Ev_ZN4aenc13ExternalFramecv9AEncFrameEvmemcpy__cxa_allocate_exception__cxa_throw_ZN4aenc13ExternalFrame5printEv__printf_chk_ZN4aenc4AEnc4InitE9AEncParam_ZN4aenc3ASC4InitEiiijbj_ZN4aenc4AEnc5CloseEv_ZN4aenc3ASC5CloseEvAEncCloseDW.ref.__gxx_personality_v0_ZN4aenc12ASCimageDataD1Ev_ZdlPvmDW.ref._ZTIN4aenc5ErrorE__cxa_begin_catch__cxa_end_catch_ZN4aenc13InternalFrameD2Ev_ZN4aenc13InternalFrameD1Ev_ZN4aenc4AEnc6RunScdEPKhiRNS_13InternalFrameE_ZN4aenc3ASC19PutFrameProgressiveEPhib_ZN4aenc3ASC15GetFrameGopSizeEv_ZN4aenc3ASC25CorrectScdMiniGopDecisionEv_ZN4aenc3ASC23Get_frame_shot_DecisionEv_ZN4aenc3ASC23Get_Repeated_Frame_FlagEv_ZN4aenc3ASC29Get_frame_Temporal_complexityEv_ZN4aenc3ASC12Get_frame_SCEv_ZN4aenc3ASC15GetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc3ASC18get_PersistenceMapEPhb_ZN4aenc4AEnc12SaveAltrStatERNS_13InternalFrameE_ZN4aenc3ASC13Get_frame_MV0Ev_ZN4aenc3ASC27Get_frame_RecentHighMvCountEv_ZN4aenc3ASC15get_LTR_op_hintERNS_11ASC_LTR_DECE__stack_chk_fail_ZN4aenc4AEnc12SaveArefStatERNS_13InternalFrameE_ZN4aenc3ASC17Get_frame_mcTCorrEv_ZN4aenc4AEnc11SaveApqStatERNS_13InternalFrameE_ZN4aenc3ASC28Get_frame_Spatial_complexityEv_ZN4aenc3ASC16Get_frame_MVSizeEv_ZN4aenc3ASC18Get_frame_ContrastEv_ZN4aenc3ASC35Get_frame_SpatioTemporal_complexityEv_ZN4aenc4AEnc8SaveStatERNS_13InternalFrameE_ZN4aenc4AEnc20GetMiniGopSizeCommonEv_Znwmmemmove_ZSt17__throw_bad_allocv_Unwind_Resume_ZN4aenc4AEnc18GetMiniGopSizeAGOPEv_ZN4aenc4AEnc19MakeMiniGopDecisionERj_ZN4aenc4AEnc17SaveFrameTypeInfoERNS_13InternalFrameE_ZN4aenc4AEnc15ComputeStatAltrERNS_13InternalFrameE_ZN4aenc3ASC15SetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc3ASC12RunFrame_LTREv_ZN4aenc3ASC29Get_scene_transition_DecisionEv_ZN4aenc4AEnc15ComputeStatArefERNS_13InternalFrameE_ZN4aenc4AEnc17FindInternalFrameEj_ZN4aenc4AEnc17FindExternalFrameEj_ZN4aenc4AEnc11UpdateFrameEjjjAEncUpdateFrame_ZN4aenc4AEnc16GetIntraDecisionEjAEncGetIntraDecision_ZN4aenc4AEnc17GetPersistenceMapEjPhAEncGetPersistenceMap_ZN4aenc4AEnc10GetLastPQpEvAEncGetLastPQp_ZN4aenc4AEnc10APQPredictEjjjjjj_ZN4aenc9APQSelectEjjjjjjAEncAPQSelect_ZN4aenc4AEnc14ComputeStatApqERNS_13InternalFrameE_ZN4aenc4AEnc11ComputeStatERNS_13InternalFrameE_ZN4aenc4AEnc11AdjustQpLtrERNS_13InternalFrameE_ZN4aenc4AEnc12AdjustQpArefERNS_13InternalFrameE_ZN4aenc4AEnc11AdjustQpApqERNS_13InternalFrameE_ZN4aenc4AEnc12AdjustQpAgopERNS_13InternalFrameE_ZN4aenc4AEnc8AdjustQpERNS_13InternalFrameE_ZN4aenc4AEnc12MarkFrameAsIERNS_13InternalFrameE_ZN4aenc4AEnc14MarkFrameAsIDRERNS_13InternalFrameE_ZN4aenc4AEnc18MakeIFrameDecisionERNS_13InternalFrameE_ZN4aenc4AEnc14MarkFrameAsLTRERNS_13InternalFrameE_ZN4aenc4AEnc16MakeArefDecisionERNS_13InternalFrameE_ZN4aenc4AEnc18MarkFrameInMiniGOPERNS_13InternalFrameEjj_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED2Ev_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED1Ev_ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED2Ev_ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED1EvAEncInit_ZN4aenc3ASCC1Ev__cxa_rethrow_ZNSt6vectorIjSaIjEEaSERKS1__ZN4aenc13InternalFramecvNS_13ExternalFrameEEv_ZNSt5dequeIN4aenc13InternalFrameESaIS1_EE16_M_push_back_auxIJRKS1_EEEvDpOT__ZSt20__throw_length_errorPKc_ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT__ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EE_ZN4aenc12ASCimageDataaSERKS0__ZN4aenc4AEnc18MakeDbpDecisionRefERNS_13InternalFrameE_ZNSt6vectorIjSaIjEE17_M_realloc_insertIJRKjEEEvN9__gnu_cxx17__normal_iteratorIPjS1_EEDpOT__ZNSt6vectorIjSaIjEE9push_backERKj_ZN4aenc4AEnc16MakeAltrDecisionERNS_13InternalFrameE_ZN4aenc4AEnc20MakeAltrArefDecisionERNS_13InternalFrameE_ZN4aenc4AEnc14OutputDecisionEP9AEncFrame_ZN4aenc4AEnc19MakeDbpDecisionArefERNS_13InternalFrameE_ZN4aenc4AEnc18MakeDbpDecisionLtrERNS_13InternalFrameE_ZN4aenc4AEnc15MakeDbpDecisionERNS_13InternalFrameE_ZN4aenc4AEnc16BuildRefListArefERNS_13InternalFrameE_ZN4aenc4AEnc15BuildRefListLtrERNS_13InternalFrameE_ZN4aenc4AEnc12BuildRefListERNS_13InternalFrameE_ZN4aenc4AEnc12ProcessFrameEjPKhiP9AEncFrame_ZN4aenc12ASCimageDataC1Ev_ZN4aenc10ASCTSCstatC1EvAEncProcessFrame_ZTSN4aenc5ErrorE_ZTVN10__cxxabiv117__class_type_infoE{{ {89:;<=>? @A'B.CBD`yOwxxxxxx]xkx}xxxxx x xX xi x  x x x & x4 xF xi x x x x x x xJ xX xf x  x x x  = H V a l     ;Qc WNH{xx!xxxxE" W   F""H##q#q#q#r#t#u#s5$1$1$$'w((()*G*H+I+J$+KF+Lh+M+N7,O,O,%-B---f.../E1S1a12I3334O44&5{[7778a8889{X;];b;g;l;y===>?2@@@!A`A*Bx9BxHBxBCzWCxiCx{Cx(D{DxDxDxDx"E'E,E1EEbFFFGhGG?H{9JCJHJMJJrKKK,LxLLOM{IOSOXO]OOOQvRRRRRS5TTTUSURV{W)X7XxEXxSXxoXzXXXXXXXZ [[[]]x]x^x^x^```x`xaxa.ckcccLdde{gh9hMhxhh(i-i4iP9iFiKiPiUiZi_ii!FkkI $&'  n +7  " #&#Y#%(M)q)+!+/F// 00)0801:x;;B;,;P<=>=EfIEUEvIYJeJOiOuOOOPP-Qkiwii ii^iiyikix x/x| *}Q!~+|2*}>RF~P|W*}cSk~u||*}T~|*}U~|*}V~|*}W~ |*}X$~.|5*}AYI~S|Z*}fZn~sxx| *}[!~+|2*}>\F~[xx x8GTxafzxxxxy,x:xBPx^xfnyvxxxxxxxx 2xDxVx^iyyxx ""J#/n/ii,p0H x,x;xTbxpxxxxx x'x6xhx&x4xBxxRxjxxxxxxxxHxxxxdxq{x7BON{xPxx$x)5=D+h{{[ixwxx_ {  x x xJ x* N ]S X ]  x x  x    x:x~xxx*xrx{F]K!} 4H \Ppp $K`0ir,L t @0!0Q@ DX009\[pyt p  "  )8"L"Ulu#0#4`#@$t %% &'( ( (( )< )d  *x *  ,  - L  J   d @0m     # ( %1  x & 1 d7 T "] l ( ) ;0P>d>mj`E gpJHOHO`PP@QPW|i.symtab.strtab.shstrtab.rela.text.data.bss.rela.text._ZN4aenc13ExternalFrameD2Ev.rodata.str1.8.rodata.str1.1.rela.text.unlikely.rela.gcc_except_table.rela.text._ZN4aenc13InternalFrameD2Ev.rela.text._ZNSt5dequeIN4aenc13InternalFrameESaIS1_EED2Ev.rela.text._ZNSt5dequeIN4aenc13ExternalFrameESaIS1_EED2Ev.rela.text._ZNSt6vectorIjSaIjEEaSERKS1_.rodata._ZNSt5dequeIN4aenc13InternalFrameESaIS1_EE16_M_push_back_auxIJRKS1_EEEvDpOT_.str1.8.rela.text._ZNSt5dequeIN4aenc13InternalFrameESaIS1_EE16_M_push_back_auxIJRKS1_EEEvDpOT_.rodata._ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT_.str1.1.rela.text._ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT_.rela.text._ZNSt6vectorIN4aenc13InternalFrameESaIS1_EE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EE.rela.text._ZNSt6vectorIjSaIjEE17_M_realloc_insertIJRKjEEEvN9__gnu_cxx17__normal_iteratorIPjS1_EEDpOT_.rela.text._ZNSt6vectorIjSaIjEE9push_backERKj.rodata._ZTSN4aenc5ErrorE.rela.data.rel.ro._ZTIN4aenc5ErrorE.rodata.rodata.cst16.rela.data.rel.local.DW.ref._ZTIN4aenc5ErrorE.rela.data.rel.local.DW.ref.__gxx_personality_v0.comment.note.GNU-stack.note.gnu.property.rela.eh_frame.group @ =^ L =_ X =` d =a p = | =  =  =  =  = =  =}  =  = i@ h"=&j,j6j:1@H=X20kg2k{ mv@x =r@H=vB@`=0wq@(=y9@P=A{F<@(=!d28}0p}A@p=$2Ѓ @@='%@ @@=)b@=+`%@=-=8@0=0\p d0wr@=4@=60, @@` =;8>q @h'/0 0 0 0 644 595656 ` ELF>H @@&%   zf9~uf9Dttt1H71fHH1S|$8DT$(D\$x$|$X4w`|$pQ$f ' |$`v|$hsw T$t[D|$hl Y|$p+  fAWg|$hP|$ v |$8w[f. |$hIfAONfA>$|$0\?|$`.D$@^#|$8.|$8@H|$8DE1|$ [D@@|$h;wa|$@|$-|$ fAY$>|$P~ |$04[f|$0Al|$@ $4sjwaB[f.|$@ |$0]|$hY |$`B|$@%fA/S"|$|$8=a4|$A|$A|$XA[D|$0|$@ |$0a|$ y|$`?!M[f.|$hu!Yb W $iTqw |$P[$ fAQ v|$@[@ D$~n |$0i V|$p/)$6fA`!Ѓ|$h_„t [$o2C|$0{"[Ã|$@L  |$@t|$h '1|$ u$t)[Ð|$0g9 l|$`$F|$H%[Ð$g$QL @ |$`'|$j[Ð|$hbvi|$h|$B DL$ Ev |$0[[Ã$5 }y|$00'|$@'[D|$`v|$@[|$p+5~ |$X<6>|$` [fAb |$h{QD\$H[ENfD|$0*$K=|$h#)[Df.|$`2|$X9 |$@X|$@v VE[Dm|$h  P[v [fA[|$X: ${W &|$ <|$8[Ѓ|$0sA V|$0mw|$8A[ffA^!|$X7u|$Hƒ|$h'|$83|$p,[ffA_O |$`A |$p.v[ƒ|$X|$`[f.DD$8EE5|$` w[D|$X7ƒ$5*|$p+v [|$8} AS.w|$X8[@$|$p'$vh|$`wK _[D$@|$`hb(g[f|$0Re|$@V|$`M|$0HfA`|+$I;|$` vy[Ð|$`F|$hfd1|$P[A> |$h|$| p |$8|$@ [@$7v [f^ |$0g\$H$5&fA^2$88v|$hD[@$N&8|$8 $\61fAV[D w|$h>[@< |$`Od[Ð|$X9sfAX|$X.v$n[fD w|$@ I[Ð|$@ LfAPN|$0?' [$b$W<A|$`[|$p#f |$p E|$p ƒ|$X![wC["fAI[$[f.|$X3  |$P|$P'|$0`|$X1T3|$@I3[@,hW|$X;fAU<|$@[@fAK,|$pC[@|$0V|$`|$X |$`n[D [Á$ |$h,fA[|w|$`d[@[ø[ø[Á|$`[Ã|$p>R   fAA{,1|$`5[fD|$h|$0w[A]|$^k1$[Ã|$@  |$hR@K$m!,|$0\v[9 F  [Ã|$0v|$`|$p'BfA]|$.z w |$P[|$X9 |$hz: [Ápw|$`#$[Ã$[ |$l|$|$ha(Z[D|$`9$8|$` r[Ã|$0a=|$p3|$@ v %H[f$9 |$h$ƒ|$03$Q $[øA  |$p=vP[Ã|$X8  [Ã|$h<$i[Á $|$P H|$X]:53|$04*|$8):|$87v|$ [D$}'|$`s w|$8[D|$p3 *A Q+ E+[|$hX\|M|$h =|$p-w *[Á$ |$8 [Ã$-$3fA\w|$h8[Ã$eC|$8$F|$b+|$X@L4y-|$8 -[|$h8P |$@ FfAK6$j`' [Ã|$0>2 [Ã|$@[Ã|$p+|$`"v$k[Ã|$p[A 4|$X6 u w[fAT 1|$[Ã$g=|$@ ,|$0U[Á0 |$8%|$p.0[fT$H)|$@w|$`&[Ã|$0S |$h|$pl[ø[Ág/[Áw$l6[Ã|$@Aw [ø[ø[Ã|$H[OÃ$= |$`|$@ [Á[Ã|$X|$` t|$Py[Ã|$p3 y&[Á[ h$n[à ƒ|$'|$H'[Ã|$@[Á|$E|$X9$[1 Ã|$p3A |$0[Ã8sfA^v|$X7P[Á|$`q6$1|$[Á w|$ [Á|$`nv[Á|$`lu |$8|$jE&$7&|$`v|$@ x[Áfv[[Á  fA_|$0j)Z4A4A\8$>8 [f.|$0h  PA [Ã$Z} fA`fAX+|$X:w|$`k[ [Ã|$P|$ [Ã$z$a  G|$hn< [CfA^|$`[Á|$`m<v$Z[Áw[Ã$X |$g6[Á w|$2?[Ã|$pg |$X-/[Áw|$8Y[Á|$`zw|$8[Ã|$0To|$h |$P23E[Ã|$h,gAA[Ã|$[Ã|$@  b [Ás]w|$8'[øA |$@|$`[Á$|$8|$`4 |$P%([f|$`Q|$X'Fƒ|$0Y$ #[fAO [ODT$@E/[Ã|$h*X[ø[ø[Á%wfAX[fA_N B |$hz    T|$p/ „t 3[Ã|$p.1$K[Ã|$X7fAXr[Ã|$X7*tfAM|$p/[ЃÃ|$0Q |$h'`fA^7$5r.|$%|$[OÐ|$h+1 Dv [ø[1|$@[Ã$'fAc} 5q [Á|$8[1[Ã|$H` |$X5q[Ã$_  $W\% C.|$` [Á|$$q|$P* [ЃÃ; fAZ '%fAP%[Ã|$$Ow s[Á?[Ã|$p4 [EÃ|$8  z4|$@[ÁO |$`|$@|$0F[Ã|$8[à Y|$8(R/%fAY)[Ѓ|$X8|$8*&1|$[ÁL[1b[Ã|$X6 |$0[Ã|$P |$@[Ã|$8$$a[Ã|$Pƒ|$ &[Á|$n$S'[Ã|$p( A[Á] K[Á~[ЃÃ|$X6|$p3|$0]|$  * [ЃÃ|$0w1$nefAM_[fA\|$p$|$`tv Aw[A [øQ1 [Ã$t, u|$h=[Á|$`|$`}|$2s![[Ã|$@#"|$`$[Ã$M|$@ [Ã|$H|$X%|$[ÁJ |$0l&y5[Ã|$X"^ = m|$p(b[Ã|$hX[ $n |$hN'O=f|$`Xv|$8[ffAW\ |$@ v b[Ã|$04[Ã$LW$Jm|$8|$X9'|$0Gv[D|$0R |$X9[Ã|$Pg |$8 [à  |$p4#2 [à [Ã|$8|$@[Ã|$X2|$p&"fAZX|$`[Ã|$P|$0o t |$@|$`|[A#j{|$@$$_[f.|$`~[DËL$8_$Nv ;I[Á|$E |$p0 |$@[Ã|$h-wfAU[Ã|$X7fAX!|$`k[Ã|$@ #lfAE|$`X[fAQ|$`'[Á  |$X7|$0W[ø[ø[ø[ø[Á|$`  $&|$ L|$hKfAF'fA_m'1[Ð|$8% |$h|$`|$0 [ø[Á v|$`[ø[Á $t|$@[Á'vL[ø[Á|$`oE |$@ [Ã|$h3[Á|$`9 |$%Q$P!|$p A" v|$0s[Á [Ã|$@v[Á5[fA=4 e&[Ã|$8 [ø[Á[fAV ?A 5|$@ v|$p4 [Ã|$X= |$8[ø[à +fAN7!|$`4 [Á|$Pt|$X vfAO~[Ã$o; /|$p/2|$`nƒ|$0pT" H"[Ã] o ƒ|$h{O C[Ã|$@=q,[Á|$`?|$0?|$X=[ЃÃ$S|$KfAU+[Ã|$X]D$X[WÃ|$0} [ÃAyƒ$ [Ã|$p/QfAYF[Áu [Á]+]n[ÁSd|$p7Y[Á|$`DA [Á[Ã|$@ |$@[Ã|$X.|$[Áv|$0@[ÁI|$@: |$X9|$hu# [Ã|$0m[Á|$ |$X:  "G $c [Ã|$hK3 |$X.B$][Ã$3 E[Á fAL $ [ÁRv|$H[Ã|$0bz|$ fAU|$P[à : [Á|$`|$@[Ã|$8 X [ [Ã|$8>#[ЃÃ|$hV$qH|$@|$H! |$XB[Á|$`|$}Iy[Ã$ofAU|$hI|$X/ƒ|$P|$`5~[Ã$ƒ|${? [fAPt|$p;[Ã$Qv|$8[Ásv|$8[Ã$aR" 1|$@ [DÁ|$ |$X5 |$@[Ã|$0&3|$h,|$`\[fAV|$X5|$`]YfARN[Ã|$ w[ÁA-fAJdX[Ã$5[Á2 |$B[A |$p7|$`|$8[Á|$` ) [Ã$M$W[ø[Á[Át [Ã|$hz |$p,[Ã|$@[Á|$84 |$8?vfA(K[Ã|$@vfAd-[Ã|$@S |$8H [Ã$\ [Ã|$@|$`e|$p&^|$`[Ã|$8( [Ã; |$8 [Ã|$h>r vr_|$p-T[ø[fAaH $s$V{|$P_ [Ãf [Ã|$X5> |$%vl[Ã|$8r |$8 [ø[ø[Ã|$@  [Á[Ã|$XM[ø[Á|$`"VQ|$F5[fA\fA`9 X [Á|$[Á&[Á [fAX|$@$[Ã|$0yK|$h  |$P^~ `[ÁV [Ã|$0;fAS fAK~4[Ã|$8|$h= |$@|$X,y$k[fAVI$f ƒ$tt[Ã|$hG$B fA\~|$PQ[Á |$X<fAc|$8afAY3M |$8,A[Á|$`[Ã$ |$@[fAZH ${@$k  vfAZY[Ã|$0M[Ã|$X|$`|$8V[Ã|$@ [A  $|$@}@[fAP|$p|$ ?v|$p,[Á|$` [Ã|$p1[Á|$` 1  [Áƒ$d;|[Ã$x| |$@[Á[A *?|$@ ar|$7ƒ$t|$0TE[Ã|$p /|$hs[Á[Ã|$8 @ v|$X9[Á|$` [fA*S|$iy|$~|$0[Á[Á1|$@ |$Oh|$@][fA\|$`1|$8[Á[Ã|$8SEƒ|$u|$p2 [ÁN |$p) |$P !v|$hQ[Á, [Ã|$0] |$@ [Á|$`fATK|$0b@[Á[ø[1|$P[DÃ|$h/=$ [ø[Á0 [ø[Á|$` [ø[ø[Ã$K[Ãs |$X-h D$`[-}Á [ÁXL[ø[Ã|$hwvn [Ã|$hGqe[ÁU |$R$kD v|$0l[ø[ø[Ã|$9[ø[Áq u|$@ [ø[ø[Ã|$p/sD$h[*ø[ø[ø[Á|$`  [ø[Ã|$@|$p3 yfAF|$XA[ø[Á|$` |$H [ø[ø[Á|$`: Y  |$P[ÁG  |$8 [ø[Ã|$@ [ÁD  t[Ã$Iwڼ[ø[Á]h |$hjv7[Á[Ã|$X6|$0U [ø[ø[ø[Ã$fA\o|$8K[ø[ø[ø[ø[Ã|$@ma[Ã|$X<$d[ÃV|$h4NfAMv|$[ø[ø[ø[Á* |$@[ø[ø[ø[Ã|$p3[ø[Á[Å[ø[ø[ËD$8[8Á|$`# |$hQ [ø[A  |$`  |$@ [ø[ø[ø[Ám)$%fAN[ø[ø[Ã$jA|$H|$`' , [ø[Á|$`=[ЃÁ [ø[A[fAH|$`g[ЃÃ|$X: |$8{c |$h  k[Á [ø[Ã|$p4[Ã$t([Á 1[D@Áf[ø[ø[Ã$|$0.|$p) [Ã$l[A4[ø[Ã|$H  |$8 [Á~ v|$0w<[Á ^|$p-|$0_& |$X5 |$0R[ø[ø[ø[ø[ø[ø[Á 8$T[Ã|$ |$X;[ø[ø[ø[ø[fAR |$P  |$X7 |$8 [Á= ƒ|$0kt|$P[Ã|$P[Ã|$@v|$` [ø[ø[ø[ø[ø[ø[Ã|$8fA1[Á$E[Á|$` [ø[ø[Á |$`1[Ã|$HE|$X)1|$P[Dø[ø[ø[Ã|$@w [ø[ø[ø[ø[Ã|$0HfA][ø[ø[ø[ø[Ã|$P[Oø[ø[ø[ø[Aƒ|$p,#[ø[Á[Ã|$p1[ø[Ã|$@t|$X[ø[Á|$`[ø[Ã|$ |$`[ø[ÁE[ø[ø[Á|$`[ø[ø[ø[ø[ø[ø[ø[ø[Á[Á|$`mfAX[Á|$`K[Á/z[ø[ø[ø[ø[ø[ø[ø[Ã|$8l[Ѓø[ø[ø[1fAS[ÁV [ø[ø[ø[ø[ø[ø[ø[Ã|$0[|$0VA|$HfA[[Á H [ø[ø[Á|$`]$$O[Ã$|$`[ø[Á[ø[Á |$X:[ø[ø[ø[ø[ø[ø[ø[Ã[ø[Ã|$8g1|$P#[Dø[Ã$RvA[ø[ø[ø[ø[Á`|$p$[ø[ø[ÁC|$07|$p+,fAY8|$|$L[ø[ø[ø[Á>[ÁB|$@7[ø[ø[ø[ø[ø[ø[A; w.|$p5$X[ø[ø[Á PH[ø[Ã|$8vI[1$6[D@ø[ø[ø[ø[ø[ø[Á|$`N6 #|$P|$P [ø[ø[Ã|$@bOF[ø[Ã|$p"z v/[ø[Á|$`}[ЃfA2|$h1|$Pb[D@ø[ø[ø[ø[fAU$5fAW|$PS[ø[ø[ø[ø[ø[ø[Á|$8w(pw[ø[ø[ø[Ã[ø[ø[ø[ø[ø[fAY~>[ø[Ã|$ wC|$09w/fA[$3[ø[Ã|$p1[Ã[Ã|$X88$6=[ø[ø[ø[ø[Ã|$@[Ѓø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á [Ã|$0vz[ø[ø[1fAO[D@Á[ø[ø[ø[ø[Ã|$X:[ø[ø[ø[ø[Ã$[wC [ø[ø[ø[Ã|$p31|$@ [ø[ø[ø[ø[ø[ø[ø[Á' [ø[ø[Á [ø[ø[Á[ø[Á|$` [ø[ø[ø[ø[ø[Ã|$@vv|$8[ø[A|$h.wz|$h wB,fܪv|$`5v[ø[Ã|$8+|$|$[ø[Ã$>w vS[Áw3v+[Ã$0w(|$`qv[ø[ø[Áp2w<|$@w5[Á^v4|$[Ák[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ff.USD\$0DT$p$$fA^AIwqE|$h vO|$hn$e v4|$hPv nw[]=Ay|$8s. |$H|$@|$H'f[';DT$PE:f.|$@wyfAaN% 9|$x" V|$h %|$h|$8<f.|$`*wyAZ|$@$k |$`$QA;|$ 3%|$(0$"yAQ j|$ R &|$|$X|$86* f.AxF|$8$cz |$8HW  |$(|$@|$x-o|$`3($< Aw|$x?AS$i1$< qw fZY$fe |$8R;$H(|$hM|$ ? |$6 |$H@d|$`Iu$fg|$xt|$`4!;X|$hv B8f|$x5&|$8if|$ w|$ A"r |$8fAHA fA-l$JY$~37|$@7|$h+D|$ 5|$`9*|$hcf^e|$X,W"$GI"*DD|$x+|$h'w$O8V|$hAU|$xJ3w|$(gd|$(f.~w|$DfAN|$8z fV oAQ!$y4g|$x$u;1|$H=|$PJ |fAh$|$ @|$ -|$@ |$(E|$x/4$7f.acD|$x/EAZg |$h#|$@F|$8[fA_v $6DA~AfJ |$8U|$`5g$$A/@$iv |$8nyof|$hG Gt$ ;R…B6fDAzN fH|$`8uDL$@EDj |$h  |$H!1P |$8o9 w|$HKA|$x3|$8N|$ ?(|$Hv|$x.|$h$Df]0$4|$@|$8FfDgA|$@ $%$^<|$ '-|$85. |$x( fAa zfD$]|$x/ |$`5#|$@')2|$@ {D|$8n|$8kR|$ Au6#D|$` = |$hK|$`_ DCD|$(Aw$f\fDq$Kq |$`1q|$ |$8JApfAZA|$`? |$`wA\E|$`vL$LB@|$x |$@#|$HfD|$8ifDBv|$T$X$K|$h{k|$8z D$XP  K7 w$t5+|$8X |$h |$( |$(D|$`8vf_fD|$Hƒ|$8vAs) A|$h|!fAQALb |$`;_A!|$@#2/2=fA  !|$@|$h|$x |$XN|$x'v|$H mc % |$x fAB$q%fA5,|$X;|$9<|$I|$@<dK|$@:w|$`A|$8v|$|$8 $u#|$`8:'|$h x1 =|$x'?K|$@w|$H 7-$l A||$h|$x|$hw |$8kfDww|$`;|$x6\ A |$h#|$h2Ah3AJ$fD6 |$ kO$oC6|$ ]8fA/,|$( vfA\$|$x8|$`> |$H  J@|$h5B$%fa=|$P(!At„tW|$`5|$x |$@v |$@ |$(L~|$hv |$i_:A,gC|$x9.$$Y?|$HQv|$x+|$h4|$8u|$hzw|$hwi|$ WFE$A]|$h|$8\|$h |$x/v$:j`A" fAY |$Hv$6#$a fA\|$x0|$h=4fAX24@|$H |$HA?  p |$8Q/;8A F|$ B |$@.|$X9|$ $|,|$@ Af[|$h  5 Ay|$@!|$hD /(xf dA|$X= !Ay„t$p/%A= |$``w|$H|$@  o |$h|$h ~A8 D$E_fS"<%?"$."2|$XI |$H *|$h|$D|$8o@ $Ti$N%vVW|$h vC<2 |$H1~!fT,|$h,|$`7@|$PNfDA Ac |$x'x|$`4t|$h dC$H=.A )$ 1|$$M  A P |$x3R$W 8%$6.|$`3!|$h$ w.$i.g~ RI|$Hv E-#ƒ|$`5\ A|$H|$`$wf[A2|$HgZ*|$X$Y2C2|$hF"52)|$@  X FfV|$hF;'|$`6 d  A@Xe|$ z ЃHY$@g|$HN&|$X&f|$x/p R !Ё !Az„tAx )h |$ho|$X $$5(f]88IYk |$ j`F$XA fD .1|$h$|$h:$ $h < |$84q|$H/ V|$x'KE;|$h k!* |$h s|$HAh-|$@ |$hfU ${c |$!fAet|$xZP|$8D |$8>|$h#$C|$h uv|$84|$`>AX|$@6# fAX|$`4+|$H +mS  |$H |$hS$l.*|$X-|$Hƒ|$P:: |$@o|$8ev|$8q3fRn|$8` u%:8|$ &|$Hv|$(|$@w|$x"D1|$h|$@Ew% AZAey fN w|$h&?5DD$xEt|$XD$h}w|$H $e|$H+D$ -~"wpf |$@LA  |$X $ q |$`v$ofA^)|$`:t|$@|$Hw|$X?ndZ|$x  Aq- |$84 A_Sv|$x!4C |$hw |$8UAy|$H | [( A A|$x:2|$8b |$x*~|$X}& |$8U|$hf\fK |$@ 6vfAHtj Z|$hp=E$=$1ЃAa|$`5A*c|$@Q_At|$8QfX   $o""|$h" "8$'` |$hnfU|$86 |$@"|$('|$hqv|$H|$8} |$`;"{!)yf[fAI|$hl |$x;G|$X|$H'$7|$`;$RW k|$X`|$h |$8Oc|$`11" =ƒ|$PX|$h<Q K".fAM|$8M|$H[!!|$8sЃ|$hv |$8m$aK$fAY]11|$x-1|$x!m1]|$ |$8{}$v L|$h7 $|$`/m |$h$ |$`8|$`6v|$@|$`.j A|$HA  AQ|$@" B$${:|$ bv D:\ v i |$h [ |$`9w|$`RAR [ B$,$Q$x$A2t1 ~fAQ~|$8Ze[|$H  |$8yd |$hV $ { A q|$8JGAvA|$`5R m . $~q J|$x*|$8x%AK$|$`)-D>A2 5 |$`/$gD |$hA fAWT|$H .x|$hD  Am efAUwG|$hAA|$x8 As ; 7 ApwAiy |$@[|$x!I?b,|$8|$h 2 |$x#+|$@&l%|$`0'|$81vg$V|$h 1fA\x|$  |$hU|$`.|$h|$ 'A:|$h $L|$`.! |$ht |$|$ $k |$ ; (ojv|$h TJ|$ $c'|$8\l fAYrX |$xA q |$`O |$`ni|$@S}|$HL A- f[ E;|$H$;( |$h  |$h~ |$h vj$> |$`5nW%1f\$ku |$fA@oe|$8 AI |$H Ѓ/ |$`P ƒ|$ 7fAM|$@|$`m0'|$hA|$h``$rG13A@ 8|$x,7|$h$ |$h4vfG1 |$H= v|$`6v|$ HrhU$f:v|$x"/%AADE A|$x: 0 Ѓ|$XN|$`:AZ|$H 7%|$8nvA kafX |$8O9|$`< |${/"N|$`: |$H fALNfASa 8 8$8*tj|$H f\0|$@w4*A= $.|$8x|$x5w |$hY 8fF vfQlbH  <Ayv 3)|$V|$@A|$P6$svfAW|$Hdv|$` |$ fA^eRH>4*|$H#fX0 |$h |$@0fY={q1|$@_UK|$`5TV!^!AA |$`4)fAYH xnd  |$P` I = |$H|$h_  |$H|$ 8j s|$H|$(|$XrAu LT $GrZ N%|$`A9y -fAGN  X ǿfZH  < 駿([ |$hwm= |$hLNAw0&|$@ |$hz  fQa|$8=V|$`8+KЃȾfA4 & 骾頾|$x3Y |$ j j" v|$`:f\uv|$h A7- j$v|$$O'X ƒ|$8Kt|$HȽ龽|$h!驽|$8U Aa鍽D'Wnd7Q|$hC!/-|$8J |$hC$lۼ|$8av|$@ļ麼j gASfAEH醼|$Htj`1|$XFJ@|$h+!fAZ A 1fAZDC |$@ ~|$x.]|$8k|$h|$ v|$XyffZ|$`61|$ X 7 "|$@v|$`%|$@ A+t|$ ˺"鮺餺隺鐺醺|r b|$H)A>|$H%,"|$H|$HƒT|$FعιĹ* Ai |$ 7|$XD|$@A|r|$H n|$x$Y|$NG=[|$8W |$x5wP$Tw" w|$H ָ|$hv|$@ 鲸|$hS [ 酸|$hp|$ [Q|$8KAo|$`;H$Jx ۷>&|$X鱷駷靷|$`-&|$8|$P^T|$X]s9|$x(.|$h! fAGNAѶǶ|$x%fAQ 鞶 wR|$`3釶|$85voe[QG~|$@ i  |$x1f\A|$h<|$@鼵A+cfAXG 4|$8O)鉵:lb|$x7|$h" fAR8|$hf$*%|$h8|$8:C޴fW|$h Ѓ鶴鬴$  |rh^TJ@$8|$h |$`3$ҳȳ龳鴳骳頳閳|$Nuk|$h|$hH> .$|$8x$S|$x-wR۲ѲfAQA${7|$H,駲靲铲鉲yoe[QS>$b|$`XM|$PB|$ t k v|$X#鯱A  鏱C<#&dZ|$hv F<2|$@AA/|$@  1|$|$`9 |$`7|$hM|$x*鞰锰銰逰|$@ nd|$ #   a4*N دί A鴯骯頯$f(|$@逯A |`VL|$H j|$x2/׮ͮî鹮鯮|$`:n |$@c 鏮酮{AjA  |$x1|$ b Ѓ|$@ |$H  )|$Xl|$@|$`8fMέĭ麭鰭  鑭|$@\ Aw Bv|$PdZ|$X"[|$H(|$h l$UT|$ <A 2׬|$@^H|$ xv|$h霬钬鈬~kAfP|$x2A!AwR|$HuK($7wU(A5t7|$hw-<w|$|ݫӫɫ鿫鵫|$`8w41D@靫fI23鄫z$(e|$x0w\|$hWI|$}m|$hZwc.$AwS|$h8v+\w#.w9|$}2ߪժ˪鷪魪飪陪鏪酪{|$x%|$@ wvwg$lw"'v|$`,B8 w)Aw#v 1fA[D|$hYvHv6 黩ASwF w)$x阩鎩鄩$}oe[QG=3|$h  ЃШƨA v"|$8pv鞨锨銨逨vlb1|$PLf] Av|$H 0&H w6  tC$cv9|$`.wXAw@g w.AEv$lw鹧鯧饧雧|$@鉧|$h'tj`A OE|$x-w0w$Ww"o ݦʦ鶦v閦錦邦xn|$8o wZ|$HIw.$|$x.vd|$P~S|$hU|$x,w- v%|$hݥͥå鹥鯥饥雥|$@w2|$h|$h?w& b O|${ .|$x$t'|ƒ|$Ht w|$|r|c|$HwR|$HuA|$`w0f1~ 1|$鬤颤阤鎤鄤zpf\RH>4* w|$~ߣգˣ1fAO鵣髣顣|$h wR釣$;|$8H|$h |$hT w0|$8xЃEA|$&|$`%v v آ΢Ģ麢鰢馢霢钢|$`mwZf7JfA~C|$`v2|$`t!fA#~|$@TYOE;1A#f]~Aܡҡȡ龡|$h5 驡韡镡f\'9|rh^TJ@6,":|$8Qv|$h)wנ͠à鹠鯠|$ w01|$ D镠鋠xnSDT$@D\$(\$xAww|$hk,|$8 a|$0$B $bv#$- [f|$`Ow^|$8+ OfAR|$p. $:vT$8[fD?|$]3fA[X ^fZxA [f.|$p|$0fj|$H|$ 6[@|$X,|$hL fA|#|$X/$&|$pg/|$p9|$8<K<fAfF|$8-KdM|$X[G|$`=$|$p |$hm$3A Ѓ|$p |$`D$X[Ã|$h$A * t6 "p$Bs'1|$8[|$h<,$+ |$`/ |$h$nAk'A:$p:[T|$`SDD$ E |$X|$`v$h[DC|$0ha A$[- =@fAI Q|$0] |$hJj$FA$|$ b*$ }3|$0@>|$p5E9Q$2Q[f$c|$X:|$` $w |$ho |$`Tw$l/[@$ w|$8+|"`|$p |$XpfA>$[D$6m$$T  |$N-|$X2|$`A-6$(6[f|$p"|$0S1 j|$`-$|$`s vfA_[D|$p1m|$hH$?p$iA w|$`N[$X[fDA$c $hD|$p-9|$`A[$7$  $ |$`#!1|$`d[fgASAj|$p/o1|$8 [@A[f|$0Iv|$p3%[f$2|$pw|$`S[Ð|$`MJf^ $v$W[D|$h>%|$h $1sfAY[N$ [|$h*|$ $[D|$0l-$|$PO$Z[fD|$p<$[-=f.f\F|$X9u |$X2G[A[f$|$`[fU|$`B! [|$p1MfA_$l|$`[D a$|$X3)!$[$:J|$P $F,|$`[fD|$P f] 1A[DfDD$P|$8 v [Ð|$hw $ƒ|$pBuAx[D[Ã|$p&$ [Ãq |$ho,|$p%K"  [ø ;' |$0ZcA[Df`n |$p0|$X7ph[Ã|$h$u A[ffA^L$O& 1fA\[|$`& n |$X4A|$8f[|$02-s['fD|$p7Y|$h|$X=[fA P|$8~|$0a,|$8sc$ [Dw|$81[fD|$`ƒ|$u$[$x$fe$rƒ|$p.[D$`[-t@$fAMA2A|$p0 *|$`[Ѓ@$k$ $[- f.|$X1A$K[f$I[fD$#~|$h{|$P[OÁ[Ã|$h/ |$X:$sN$Y).|$hv;|$L44[@|$hz |$`Kv$!|$X1+$o+[$~ z|$p5$,|$0(,|$`5;fI~$1[fD|$` 5 $FI|$ [fAU |$hN |$p4I!fT*|$X,v|$0z[$^[Á  u|$`SA[Á[A jfAY |$0a|$`!|$h?ƒ|$8 t|$[Ã$&T|$`"|$z|$8!$fPƒ|$t|$p.[@w|$p+g[Ã|$8wH[Ã|$0Z |$#$ [Ã|$h  fZ|$`A0$^$VD$`[-0Ã|$X$A[Ã|$p $ $v$d9[Ã|$p"|$`[A[Ã|$0\ AfAZ|$p2 [Ã|$  $SwA [Ã|$h| |$0E{fe{$2h$|$H*|$8ƒ|$XK2C2[ffAL$ 6 |$pA+ [ÁL*A|$PZ(v$L[Ð|$h?$}_fAP. $G[|$p3[Á|$`"v|$0A#[Á$WD $Lb@[fT6A v:[Ã|$p(|$ [øi $*z[ÁP |$X6|$0\@|$`[ЃfDA [1A[Ã|$P $wA[@|$`&w|$P[Ã|$p5$$|$0[Ã$Rb$0L$1v |$X94[Á$o[Á$N$ $H[ø[ø[ø[ø[Á|$` v [ËD$8|$XA|$#fAa)$"($[fD|$- |$8[EÃ|$p3 $ $yv O [Á$ |$`|$X6[fZ $v|$hc[f]$$= 8$|$` )A)[fD,|$p*$0w[Ã|$0wfQ[Ã|$8X [Ã|$8 $E|$` $|$o"|$h."[Á$ |$h'k|$p* |$8 [fW$j$g][Ã|$0p|$`$[ $[Ã|$8[Á|$`7^ f^#|$X:T)|$` [Ð|$X;( $[Ã|$8h|$p%v[@|$hs [à v[Á$[øA A [Á$Hh v$O[Ã|$0W8|$8#w|$X_![fAP$ƒ|$t[Ã|$X/$[AE = [Á$ [Ã|$p=|$Xu|$8e$O1[fV5|$0 |$8 [Á$t[Á)[ Ã|$hr[Ã|$ fb Ѓ$`u|$h}[Ã|$8B fW |$0rz[Ã|$\'|$h  $$j#:v|$p7[f|$0_AX f`f]|$p3,A<|$`v$P[@|$`fb|$X>|$T$9[Ã|$hy$tv$5[Ã|$05#|$p" [Ã|$h\[Á|$|$v$M[Ã|$Xm|$XYfAC$|$[@A!X $[1[Á$a[Ã$*l|$o<[1f_[ø[1[Ã|$p, [ø[ÁLv|$` [Á[Á |$Pƒ|$p38A.[Ã|$0W|$p&($N%[NÁw |$`[Ã|$X<[Ë$- wA [øfR\$t$&[Ã|$X|$hH)1|$8[D@à [øOA@|$`[øc$[Ã$g fT|$uA[Ã|$hUv|$p/[Ã|$03A $$[øf]z|$`w d[ø L|$`%\|$wA([Á|$`RQ$'$|$p.|$X:[ËD$8tA[øj$[Á|$`&"1[Ã|$X2bw |$HO[Ã|$>v 0[Á$[Af_|$X8$E$|$P$[Á$ |$`A$'[ø|$}$[Am $Iw$>[Ã|$0J A}1f][Ã|$X6Q  $5|$p4H%A>%[Á|$`6fAZV y v$5[D$EA[ø[f\ |$p.fAQ?|$p&4[Á$%Av [Á$3$|$P|$`Wr[fAOU |$8<AE|$p2 1fU[D@$/|$0g |$h7T$?X$3*1|$8[D@f.|$p.b v$[Ã[fZf|$TA![Ã|$p/|$X7v|$H[Ã|$X5x |$`|$`%Y"|$p/`[ffJF|$`1[Ã$iv [Á|$[øEx[D\$HE |$Xv[Ã|$H||$0<[Á|$`[ø w|$`[d|$H} Q[Á1[Ã|$8[ø[Á|$h[ËD$8[ Ã|$8 [ÁPv|$ [ø[ø[Ã|$hn1[ø[Á$[Á<|$8 1[ÁG[Ã|$PM$1[Á|$`w`~ [Á|$`6+ # [à  |$0i|$0j[Ã1|$H[D@A[Ã|$0p Ё  Ѓ|$h{~ r[Ã$k|$8 aX[Áz-A [Ã|$X0 A|$0e[Á$|$`d" |$|$`}[Ã$ Wƒ|$0tt/z[Ã[Ã|$|$`[Ã|$X4|$p[Ã|$0o! fAJ!|$`[f\[A [Á|$` |$$|$p|$`)f] q[Á|$`kkb[ÁG$|$X fA` Ёu|$`n[Á$|$h} [Á;|$0%>|$h9v[Ã|$X:|$8#v|$*{[à | fe_|$ $D[A|$h.$m[Ã|$hh $ [Á|$`$ |$H$[-  Á$A/|$X5fSR[Ã|$h" [à  $fAU[Ã|$p0e|$`[Á|$0|$p' |$P+~[Ã|$X9 |$X1|$`:[Á|$` A 7|$`$fK *!A[à |$p4 $[Ã|$89OfYh$'[Ã$X$H$muf^[Á|$` |$hyH$$Hu$[A  1fAZ[Ã|$p#|$8" l|$a[Ã|$p+d AZ [f[|$p*|$[A v[1[Dø[fZ  [ø[Ã|$P $5 [A` |$`[Ã|$h#; |$8 |$hDƒ|$pu*[Ã$&v|$hK [Ã|$  |$` [Ã|$X8Ffa3$o%[Ã[Aw [Ã|$[NfQ~$A b[Á|$`Q 6$[ЃfAS| fAOA u${ [Ã|$h/ |$`fAS1 $L[Ã|$0Os |$X5|$P'|$`|$ [Á[Ál  |$`|$p $[Á$W[fA[ $$v$t[Ã|$P(|$`I+v|$h~[Ã|$8&w|$@|Qz[A[EÁv$l B[Ã|$P $[[A_ $[ø[Á|$t$+ v|$[Ë$[rÁ|$n |$`D|$P[Á[BÃ|$P\ $$M|$`v |$0~[à |$0~[ø[Ã|$X9[Ã|$8N v|$`m[fZA [Á|$0|$hr AV[Ã|$06JfA\ |$` v|$p2 [Ã|$X8^ [Ã|$X>|$|$8b[ЃÁ|$`Md A [Á|$` $s$|$0j!fA0„.A$[Ã|$0][Eø[Á[ЃÁ$m[Ã|$h|$P1A[Ã$w)[à 5 $tU |$p,\ [Ã|$0> |$X; ~|$S[Ã|$h^TA |$8"$|$p!A |$`[Á [fA]X L[Ã|$p3|$X9A |$0a(/ v|$0N~[A |$|$`a n[fW  $H [Ã|$b$W[fA]|$h[ø[ø[ø[ø[Á$  l[Ã[Ã}$l[Ã$W#|$X+[Ã|$05 v|$[Á$w$]L t!N[ø[ø[ø[Ã$[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á|$`y [ø[Á|$` )|$8[ø[Ã|$0.Z |$P] 3 |$[Ã|$hq |$h{f~|$X[ø[ø[ø[Á$7[Ãv|$ [ø[Á|$8Z|$pEv [ø[Ávf[[ø[Ã$ |$`=! fAD [Ã|$Xv|$0[à [ø[ø[ø[ø[ø[ø[ø[Á  |$`[ø[Áj[ø[Ã|$Q[ø[1|$8[fA\ |$8v 9[ø[Ã$ |$ fA\1|$8[ø[Ã|$p/5|$ fA[At$]Y[Ã|$X,4A[ø[Ã|$8[ø[A[Ã$%t |$8x[ø[Á -|$hm"[Á [Á|$`} |$0G A|$` $AI|$`[A[Ã[ø[Á$Z q [ø[ø[Ã$oA[à v|$  [ÁV[ø[ø[ø[Á$||$0Sν[Ã|$p5]|$HK$=[Á$Ad$fAA[Ã|$0o }|$0Rv|$`:[ø[ÃA [Á$#|$p%|$`9[ø[Áw $M [ø[Á$l|$`[Ãtp[Ã|$n[ø[Ã|$0XA[Á|$Q [Á|$`[J =fY |$p.v|$ۻ[Ã|$p5$[-=Á$1[DfAU$h[ø[Ã|$0Iv4|$$4t|$` 7[ø[ø[ø[ø[ø[ø[ø[Ã|$p"[à w7|$8A!|$ [Á[Ã|$P7C |$041 |$p> |$8   [ø[ø[ø[ø[ø[A[ø[ø[Á[Áw0 1A[ø[ø[ø[Á|$`$v[à [ø[Ã|$p6 Ah $t[ø[Ã|$A [ø[ø[Á$[ÁZ|$[Ã|$V [Nø[ø[ø[ø[ø[ø[Ã|$hw v$|[Á$O [Ã${2|$P[ø[A[Ã|$p;[1[D@Ã|$0Uw,A u l[ø[Á [ËD$`[->ø[ø[ø[ø[ÁY w7 [PÃ|$X<{ 1|$P[D@Ã|$0kn $" [Ã|$p4|$PG' |$`  [Ã|$X= |$0I $vA [Ã|$X>w$9v޶[Ã|$0{[ø[A[Ã$w[Á+|$8[Ã$\|$R |$h [fY|$8([ø[ø[ø[à  fY $[ø[Á$]^|$0\LD$`[-+:Á|$ f\ |$8  |$`k N [ø[Ã|$X |$h\$[Awr|$`wh[Áj[ø[Á$[Ã|$X7f[$[Ѓø[Ã$u# |$p7 [ø[Á$w*$$[ø[Ã|$$2 |$8  $?[ø[Á  v [Á |$`<[ø[ø[ø[ø[Ã|$5 " |$H [ø[ø[ø[ø[ø[Ã$u[Ã|$0Z[Ã|$X,[[Ã|$p4 1$k(A |$P |$X:{|$h$p[ø[Ã$Y |$hBs |$PR $U[Ã|$8[1|$[D@ø[ø[ø[ø[ø[ø[ø[ø[Á|$`!|$|$8[Á$[ø[ø[ø[Á$W|$hEAv$~ر[ø[ø[Á$ [A JfAX8|$8 |$h$  fAY[Ã|$hN$weP[Ã$[ø[ø[ø[ø[ø[ø[ø[Á|$[Ã$u7 ƒ$vt|$`v[ø[ø[Á [ø[ø[ø[ø[ø[ø[ø[A |$|$`[ø[ø[à wS$[-=zA w{$wR|$8t6|*4w$v[ø[ø[ø[Á$ [Á$w$|$`[Á|$`][ø[Á$. [1[ø[ø[ø[ø[ø[Ã$sw0|$w$v[ø[ø[ø[fV~"$Dv Ӯ[ø[ø[Á|$`NfA`u|$p0w[ø[ø[ø[ø[Ã|$X3[ø[Á|$`vI[ЃÁ[ø[Ã|$p3t# w[Á [ø[ø[ø[Á|$`|$hFwh|$8wC|$P'$[- ø[ø[Á$[Ã|$P||$p,[1 [Ã$Ã|$P4 |$`jtfAMfA321|$0$ /  |$XfA] |$X|$(|i|$`Z$4$;DfAV $kx|$(I|$0Ã|$(g$* $ v |$`.Ã|$(~ |$8~|$h3$me%$ fAB" |$Ã|$Á$1v|$0#Ã$XA8Ã|$*$T+|$`n$3w |$P1Ã$k$Q`|$(BvfAIlf$9|$hO$GÁ$|$`#|$0 h"$3|$`3|$(jf|$(JZ 1Ã|$(D|$x|$x|$P9Á|$X7$$V$v A?Á |$0 |$P7Ã|$8u$_Ã|$P6|$P0Ã|$8 EkcÁÃ|$h> $icAW$c$i+|$X&|$8 Ѓ|$(O Ѓ|$`u |$h-5|$+Ã$X |$0|$X $v|$P9Á|$Xd' Ã|$h/$ w|$`zK|$(X|$(MøÁ$Á|$X$tÁ$QvÁ$@# $xƒtAøË$-D|$X]6Ã|$P5 |$h)Á|$X[ $!1|$øÃ|$x\cÃ|$`Z|$XUh$Wø7k|$P"$vtf.fAVW82'Ãy A)1$}Ã$u|$K|$`G|$`.(|$j5|$8u |$x9@$t $O$-=Ã|$08\ j|$0fA^E)$ Ð$$s|$x%o|$0EÃ|$`< |$%)|$h1 )t#1|$P;f$O |$0|$P9I$LH.$ % ;ƒ|$0V8|$XH8@fAR9|$@I#|$8Ã|$0D$`y|$X9 Á0  |$P:fA^!|$(bfAY +$*Ã|$P9|$Xl %$Ã|$P!|$hÃ|$h6Á|$0|$h |$8D$0@Ët$xøfAL|$XÁ$v! |$H øt Mv$L71$Ã$L |$0 9!|$XME$f)fAKJ1A|$8Q|$ rfAW~$hufAO|$`{TC$-|$hw${Áx  |$H $ Ã|$hEJ $S%|$X|$Xs)$Á$  |$h. Á|$ J|$`|$H*8/# ffAb1|$XDÃ$2Á|$X`=$Ã|$(o  D$0ƒt$C øÃwfA^k$Á`  $f Ã$iy|$P5vT$0ø|$`uÁ|$X !Ã||$X. Ã|$P:q|$8fø|$8ƒ|$`GfAWÃ|$`ƒ|$h  $4|$Xv&øÃ|$8 AÃ|$0Áqv$Ã|$(\ fA]|$8|$Á|$X<Ã|$P1BfAS71|$8D@Á$0 A3 M$] Ã:|$0O|$8"Ã|$(5 ø9$ Á|$X|$XJÃ|$P= A%|$(UwfÃ|$X1|$H0D@Á$Á g f A A $ d 8!$- WÁ$tÁ|$XÁ$ |$`|$(CHÃ|$h5 |$`(|$X|$u$5!Ã$# |$;fAS)|$`|$8f.|$`PA1|$@1fA_øfA=r $!Ã|$0  $nZ ЃfAYA6Á$z0 |$X$3 fA\$|$XWÁ$v fA\w|$(A$ %|$X~/%@ S|$0 = |$P1> 1fAAÃ$\4!AÃø|$h;$~[ø_ fAME$ fAN"|$8øøÁ B |$"4 øÃ|$0Ã|$(wDD$0E |$X3ƒ|$P5t|$(iÃ|$HNÁ|$XÃ|$`cà |$0u Ã|$(e |$h09|$P4u|$h)(|$Xe.|$0AufA\D c |$0øÃ$9øÃ|$H øÃ|$P9ÃR $5D |$XÁ$ |$87t Ã|$h, |$ƒ|$0&u$&DL$0E |$8 øÁ|$X|$Xu |$`x|$(pÃ|$`w |$h G|$0<%%|$@%Á|$XløøøøøøøÃ|$0  $$:Á|$XKÁ$oÁ$Á$52$4Ã|$(hk v|$(SÃ|$8|$0]|$8v+|$(E|$PeÃ|$P A4 Ã|$8-fA@"|$X/AfA[$pl$ Á|$(9vÃ|$P<uX$7Ã|$P4fA/|$a|$X ()Ãa$tS$utfA[Ã|$`h|$|$8 ЃÃ|$8 fAM |$H${Ã$7U|$hJ$fAZ$"Ã|$(s$"fAO fAS|$P6Á|$fAXÃ|$0  |$(iÃ|$0; |$h1YA$P&|$0ЃÁ$ |$0 $øÃ$Tx7|$X JɺNA|$P7Ã|$h3$1,EÃ|$h4fAY|$84&$|$XЃÃ$|$(t|$EÃ|$P@{|$h9AAv$}Ã|$0  $L w"A  à w|$(fÃ|$XkO$6 Á|$`Q$|$P0|$h,N|$0$%|$`;%$6%Ã)nƒ|$Tu Ã|$F|$(BbL!|$P3vqfA]|$P;$|$`kV~|$TÃ|$P8A  Ã|$H ~|$X à  fAS |$({$K v,Ã|$= ƒ|$0u${Á$8KA )  w|$8MøøøøÁ|$X$jÃ|$0DÃ|$P) $kvfAbABÃ|$`? $$Á$ Ã$| $ $jE"A'"A" "$h!K!Ã|$P9$|$( Ã|$`_j øÃ|$0$v|$xÁøÁ t|$(o w$ fÁ Á|$X3 |$P9|$`|oiV|$X? øøÃ|$P;4 $U6 |$(U$ |$jÁI |$`!fAQj|$`#øÁaÃ|$`/ fA[|$@?fA_   øÃ|$(D |$X|)|$|$8Ã|$8Á|$X ${|$h*$iЃÁ$Ã|$8ЃfAZ|$P=fAS|$XÁ$Á$F |$8fAJ A0fAV! Ã|$h2 Ã|$@ƒ|$8t zÁ|$He|$0ZÃ|$@J $ -|$$T$pÃ$}$ЃfASymÁv|$2Ã|$h.|$vÁ|$X v|$@ifA,  $ZÃ|$`?m )$|$P;v$Á 5|$XH'Ã|$h$|$(w|$h Á,|$$+|$X |$8fA]!Ё$„t$d Ã|$P=& |$8;$ *$ Á1|$@Á$ Á|$Xx v$eÃ|$Hp $ Ã|$-H < ÃЃÃ|$(l@$ Ã|$`fA7z qÁ|$XÃ|$P<|$` $o|$XøøÃ|$`P|$(E|$8Ã|$|$X.APÃ|$(f|$(a5fAY*øÁ $R|$`@øà A fAY7|$(?v|$h3vÃ|$ |$`<* NÃ|$P*2|$89b |$X+Á$. |$X> |$H Á$v|$(oÁ|$XVÁ =$ ,Á|$XG fAQ|$0 Á$t|$bÁ|$Xc WÃ|$(JÃ|$uÃ|$(s_|$XyeøøÃ|$8\$ K+|$`sÃ|$Pd|${|$0|$0=v|$ afA\|$x$m $øÁ)Á$1|$h5DøøÅ |$X= $K, øøøÃ$tG |$0Ã$=v|$X jøøfA8< $. à + |$X,øÃ|$P2_ $1`|$Á|$XA $ $oÃ$er U |$Xj|$(Z|$8 $/|$0 $øÁ$%V |$8ЃøÅ|$0|$0fAT |$8xfAPm ?øøÃ$y $IÃ$Z|$8 Ã|$h1Ã|$8$  $A|$X t)øøøÁ  Á$g : |$YÃ|$` øøA8Á|$.Ã|$HfAXgRøÃ|$`/B |$P;1 |$& |$XZ$ uÃÃ$"v?øøÁ|$X $} |$h-fAHfAP|$`5|$ øøÃ$r! |$0 øÁ|$XøÁ|$X Á7 |$@, Ã|$8øøÃ|$h= $v|$Xq,øøÃ$L7à |$H øøÃ|$I |$xj|$8  |$XAQfAJFÃ$R |$P= fAUÃ|$P3B i|$0øÁ$U  $/ u$_ `A +$- 0A  AøøøøøÃ|$P<9 |$h. 1|$HDÃ$V|$hÃ$wv|$xøÃ|$|$X øøÃ|$(/ |$P&w.=fAVJ $N |$P;&Ã|$P5%|$` |$0Á|$X a øÃ|$8øøÁ D$X-iøøà ƒ|$P6tMøÁ|$XQøÁ$fAVƒ|$$ø1|$HÃ|$0ƒ|$P6)  |$8 Ã|$(Qy$1E $a4 |$XpøøÁ$'$6v øÁ$nøøøøÃ|$`' n  øÃ|$- $q øfAScCQAA|$Xj 3Ã|$h(fcÁ|$X|$8øÁ$; AøøøøøøÃ|$(q |$(EwнÃv|$h1Á$øøøÁ$o A_ |$XQ Á${ øÃ|$s $v$R Ã|$P:øøøøøøøÁ|$0 $_|$P7= |$@2 |$`& |$H||$NwÃ|$`J $w{HÃ|$(Iv)%|$0V |$HK øøÃ|$` RøøøøÃ$W1|$0:D@Á|$X1|$D@øÃ|$0fAW AøÃ|$0 |$h! |$Pk Ã$%wEøøøøøøøÃ|$8 øÃ|$0 | $v@ |$(q) |$0 1øøøÃ|$8 øfAI,|$(Z|$  |$HøÃ|$8 øÁ$|$P<øøøøøøøøÃ|$h&Ã`Á0Á7~ cÁ|$X|$0 |$h0|$XÃøÃ|$`CwøÁÁ$VD:2|$XÁLuc$i RøÁ$Ã|$XøÃ$g |$(r SÃ|$P5øÃЃÃ|$vfAKøøøøøøÃ|$`<|$h%NfA[/|$(.øøÁ$øÃ|$ | m|$XЃÁ$ øÃ|$P4à w9|$`|$0$rv|$P4Ã|$xÁ|$v uÁ$ЃÃ|$8EøÃ|$Hr|$P5~|$0Å. |$P.øÁ$|$(VøÁO$nfA]1|$Ã|$h&v$4AøøÃ|$0 Á|$X. øÃ|$0w|$PwMTøøøÁ$øøøøÃ|$|]|$P5wP$cøÃ|$h#vn$BwF|$|$}|$DøøÃ|$@~2|$8 Ãv+|$X wøøøøøøøÃÁ$ w) v!|$Xwv øøøøøøøøøÃ|$0øÁ$Ã|$h6øøøøøÁ$IÃ|$(:w!w|$`*u øøÁ$"øÃNÃ|$0 w|$cøÃ|$8 ÃøøøøÁ$øøøøøøfANƒ$%t$øøøøøøøøøøøÃ|$h#øÃ|$`IwA$v.|$@ u$tʱøÃ|$P8wX[wB$w/|$P)w($BøÃ|$8øÃ|$PÁ|$X</A %øøÃ|$(7øøøøøøøøøøøøøøøÁ|$v øøøfAZ~@|$`?w9-w#|$X 1øÃ|$0øøøøøøøøøÁ wD$X-"=øÃ$YøøÃ|$`w|$8t|$h0øøøÁ|$X4 wH$v5!w'$Á$iЃøøÃ|$`QfAZ|$0w~$>øøøøøÃ|$0|$8v#$xÁøÁøøÃ$5vwøøÃwEøøÃ|$xt!$vRøÁE|$X|$h|$`=w\ øÁ|$XøÃ$4t |$Xv|$@ʭøÃ|$P)ƒ|$xt<$w/øÁ$vfA\tøøøøÃ|$w9$6v&wøøøøøøff.|$8D\$ DT$pwS|$0`|$`mA|$(dPD$0 |$h|$8wp|$0]|$Xe'fAU|$8 $2$|$X @$S|$`~fAT$ |$(~d|$h6F|$0 y)fA^3$n_C:P|$=GA Ð$|$`c|$P |$X{ $u_ffA9#fA<|$0Z2|$<S=|$0S@|$hM|$Xw$$`|$H |$X f|$`Ue|$h*|$D  |$P,ƒtA@|$05|$(  |$h1fAR|$L;-|$(q5fA:=<|$X K|$6Hq H$XD|$`>fAY>|$`GA"A v-$#|$0v |$(w ø|$Hڸ}|$P|$HO^$iv fA[~$fAbL|$Pc|$X|$h |$hD$`|$X'||$` $${""$|$DfAT|$|$(1|$0v|$X%x6<#R|$X fAc $|$$K|$`~|$8t |$$}$Gx $(|$XJ„t#e$o$D$X-=f.|$(y$i $]|$8D|$P55|$`O@ |$h,@$L|$0|$h2fASkv |$X|$`N?*|$)|$h $!|$h +1fA:D|$(fAP7 |$P=v|$h9fD|$h.v |$w|$h |$X|$P $>|$HN@|$`x|$(H |$t$2fD|$(\|$`f |$`G@A|$Xg |$b|$(H|$Pay1|$P @$8$-:=Kw|$0#fDp$T|$`WDU|$8D|$(v|$XR@|$H" |$P|$y$ $DD$@Ef|$0$(|$@(|$(iA|$u|$`ij|$P9d$ |$h/++ v|$X  a|$h/z|$HӸjT$~$ Q@|$`|$P?$m@|$`|$n?|$8Ð|$`- |$({0fAT|$`_&|$h%$T.|$8 |$h.Q|$`p$f$$T|$P4 f.|$` |$@[|$X 1$|$`yfAI|$`Sf$+ G|$(]? 8|$P4#|$8(+|$0P8|$h#;$ZvfAX,|$8l|$01|$8DDfAT|$@_ *fA,|$%|$h$V5@@|$(6e$&4 #|$`4!(fAK2$|$l&|$h  |$P|$Xf$fAT$<øÁf j|$h]|$8#X#Á|$X6 |$`c$Sz"|$(5|$h+-G|$|$(NÁ|$0 Ã|$xÃ$p |$P+E$- =Ã|$8|$$|$`s#Q"|$`yF"ø|$X,'e Yj|$X%RÁ$B Á|$X |$`s Ã|$8 7fAYY|$P0% (|$X!/|$0 f$ |$XfAT|$h0[|$(!+vfAPl|$h |$h  9=|$('|$xD|$P5|$h4v |$P;øfANg |$8Ã|$h  |$X  Ã|$P9ƒ|$`At|$h0Ã|$(l |$X{øAY|$8 Ã|$h2UA|$XB |$&$ Ѓ|$`SZ$G |$(?|$`@-#$Ã|$8$Ã|$(Cx6O Ã|$h#PA~ $^ $$$G Ã|$(m|$ |$`J|$(k-|$(5,'|$0i@|$0 v|$f.$|$X Ã|$h5$+1 |$`/.%1|$D@f $f$\)|$P*$f|$P:$D$xtfA^Ã|$`|$8t fALÃ|$xÃ|$P$gTtDL$hEt |$P3Ã|$`0~|$P ;%|$8X|$0MÁ|$(gvAfASzfAA|$0ÃÃ|$H$ |$X vAfÁ$Ã|$8fA^1|$0k`w|$XG  Ã|$8Ã|$`}1fA<DfA`D$ $Ã|$8o$^øfA[ |$`ET|$XYPfAC |$(m!|$@$hfA[H Ã|$0& |$Y|$(Fv Ã|$`< |$0|$X>Á|$X5 $=&I|$`r-fA]~|$XU =1|$8Ã|$h(|$XuAA" |$P6S|$W$`+ 4|$h/4fATE$$$Ã|$8 cD|$h<Ã|$(uY |$(n$d!|$8Y!Ã$a |$eA\m's4|$094k7fAY7Á]Á gË$- =Á|$Xj $|$0&$\ЃÁL |$h(G|$(4(|$X=).$6fA]$}Ã|$Pt|$X|$(bÁ? 1|$`RzfA\$a)|$(tb2$[|$h'9|$X$Á$ |$X$Á|$XÁ$ 1fAOD@Á g$H|$xAÃ|$(k$S|$8~)fAe3|$Px5|$Xcv|$Hm øÃ|$P Av|$øÃ|$P3v|$ ZÃ|$P*Á|$/ v|$0 #Á|$X.øÃ $ |$P6Ã|$8 Á|$XA]|$XøfAE9 |$`z. $Ã|$HNøÃ|$P5 |$|$`GI$ЃÁÃ|$08|$hWÃ$u |$(fw$Á$#Av|$X$uÃ|$8Ã|$8  |$$1fAWDfA_ |$h%A |$P4 oÃ|$(y8 |$`"\3|$`G(Ã|$h- |$P7g$\Q"|$P.-|$0 'fAO'|$`4|$(P|$(S fAU|$8fA\4#|$(-|$8,-fAE!-f.|$R|$0 Ã|$(I W-$J[%|$XTÃ|$-1$Ã|$(rÃ|$ |$Xm|$Ã$M 1fAKÁ$ |$|$0 G Ã|$x|$`fB J,fA+?,|$X2v |$P6@|$h/; V|$XT$-2 à ^|$H|$0 ȃ „x$NjÁ|$X Ã|$- |$Ã|$h)$ fAS- 1|$D@Á$& fAR0$9Ã$>A |$HfAbu|$A|$0z$nÁ$$|$XÁ$ fAB!|$83p!d!ø_|$h-Ã|$0-2fAOG|$`a$W$#$%%|$(f1D$X- =w$Ã` AÁFÁ$fA` |$(&/!A 1|$@DÁ|$X:^|$XU|$8 lЃA$øÃ|$8|$0(3 |$0|$8ЃÃ|$`>|$0  $|$`9)!d!fAV/|$mwøÃ|$h3>|$(+v|$X/øø  v |$h6Á9A $9&|$P:tÃ|$h[ERÃ|$xøA\|$P*Lv|$H6fA]NøÁxøAÃ|$@|$0&fA?M|$0vÁ|$X|$h(Ã|$P/N |$hÃ|$h*l fA` MøÃ$O.AfA[p"$JÃ|$0$j v Ã|$H|$0Ã$IQ$ Ã|$(rfAY|$`O-"|$XGÁ|$X: |$0iÃ$r] $fO|$(Ap%|$-S%$( Á] fAQA#fAR#Ã|$0Ay } Ã|$h2Ã|$0 $#~|$P.Á|$XÃ|$h +$k|$(2|$%v|$XÁ|$X} $iÃ|$8Á|$X K|$P4k$|$`KÁ$ |$8 3|$h04|$(fA? ÃmÃ|$h fAA|$PO|$!||$P<Ã$V |$X/|$P4|$`bÃ$[ƒ|$0 AÃ|$8Ã$+j 1fAYÃ|$`Oi |$X[ |$8 8$Ã|$P: $ ƒ|$8 t|$X^Á$=_|$( [ÁX  , k|$0fA^$`|A fAT|$HK&|$H:&|$@>#$oÃ|$(Yv|$P9|$(8>|$(1|$`%# Ã|$h|$!Ё$ „~rD v|$`reÃ|$8N |$(F|$8ÃfALs|$(\|$0 &$ÁÃ|$8  $<øÁ|$XT-A fA] Ã|$` fAXk$w|$P1RÁ$ |$H|Ã|$0 ~|$H~ |$Xp Ã|$(t{|$P^|$hSà |$`c Ã|$`KÃ|$P<O$E= |$X o|$7^|$h7S1|$P<Ã|$8S|$8Ã|$P9$r!Ѓ|$(o„tY øøfA^$ |$P7Ã|$(<XAl|$`=|$8$X_fA?TÃ|$h'à |$h:Á$Q  |$06 |$h/Ã|$8 à e$ 6Ã|$hv|$PøøÁøøøÃ|$0%v|$hEbÁ$ A |$P1Ã|$h $+{1fA#DøøøÁcøøÁ$i $Ã$&|$Xe |$`HÃ|$Ph0|$|$jÃ|$`f $1{/ Ã|$P8fAY|$XtÃ|$`9fA^|$`1|$8Ã|$(x$ ÁM Ã|$(%r|$0ghAÃ|$0 ЃÃ|$xmfALMAW|$XKC! 1${  ÁvfAKà |$8v+ à Á$ = u Á$E |$8 Ã|$h' V|$X fA^5 $D|$8$:Á$C# |$P8fAY$|$`NFv$.Ãz  Á$Á|$X'Á|$iAe |$Xv|$X fA] $JI|$H>Á|$XY |$`hN Ã)fA]1|$({Áv|$XÁ$ =$ Ã|$85${Ã|$(SÃ|$(V|$hFT|$ƒ|$(V<0Á$ $Á fAP< |$P;Ã$rOD$X-=5|$h!*AEÁ|$X |$H  |$`-|$`Ã|$D ÁVÃ|$h*fA\*|$X |$8|$P/|$$ ÁÃ|$8vfA^yÃ|$0 |$|$@Ã|$$/Á$ JB|$8 $ Á$øøÃ|$8Q|$P.FÃ|$`w Á$ |$xfAH|$P8F|$X8v|$ 8fAQ$%fAQÃ|$h $lD$øÁøÁ$ Ã|$P-|$X,ÁEÃ|$ :øÃ|$(|$81|$HÃ|$8  |$8 Ã|$øÃ|$`o  ÁcÃ|$P26 |$h$+ Ã$UfA? c øfAONøÁ|$O Á$g |$0øøÁ|$X v$LÃ$N+w%v|$h/Ã|$  øøøøøøøÃ|$h*ƒ|$0 |$`@ Ã|$8 |$8" |$P2Ã|$8 øøÃ|$0] |$`% |$hF |$fA/|$ Á|$Xf$ øÃ|$0 øfA3NøøÁ$øøøÃ$|$PY 1|$øÃ|$P3ƒt|$(XÃ|$(4|$h%|$`KøÃ|$0øøÃ|$8"|$` A   øøÁ|$X4& |$8qA  1$bDÁ|$X`Á$gÃ|$('h{v|$xÃ$zO .  n J|$h'|$h6Á$z T|$$C|$P)e$- høÃ|$8 Ã$J0fAW2$IÁ: |$XH  |$X Ã|$PT$W|$HfA=øøøøÁ$Á  1|$Á |$0. fAL |$øøøfA\ $ øÁ|$X%|$`z |$P:$P $n$q|$h/|$X$- Ã|$8øøøøøøÁXv|$øÁ$, fA\b A Ã|$P>b |$P:: $n Bv$M øÃ| |$(\` $SfA\HÃ|$` $Áp|$P*eÁ Á|$XøfAO fAA |$h+Á$H|$(1øøÃ|$NÃ|$`P*|$X|$P. |$H Lv$X,Á$ $I ÁCÃ$1|$`: |$(T|$X,` T A |$0 |$0vAÁ|$X?|$8 |$`I |$H $Ã$ øøøÁ_fADTÃ|$(JøÃ|$PLZ+Ë$-=oøfA]|$Fwz|$8ЃøÃ })v$øøøøøøøøøøøøøÁ$o øÃ|$`Gv|$X ػÃ|$P54 % |$Xv|$Á|$XMfAb4 $øøÃ|$P%o |$xvADøÃ|$0 øøøÁ$øøøøøø1|$8Ã|$8 wAv|$Á$ øøøøÃ|$0øA p [ ^ |$ S fAO(i Ã|$0AÃÁ|$z $ ЃÁ4 |$`L Ã|$   løøÃ|$h fAN  Á$ |$ $Áøøøøà  $}  L øøøÃ|$h.Ã|$8 |$` |$ |$0<øøøøÁ>6 $%Ã|$8 |$X$w'øøøøøÃ|$(_|$([|$H|$|$h4øøøøøÁ|$"v$eøÁwøøøfAXeøøÃ|$h%ƒ$ofAXøÃ|$Fw Ã|$(X\fAZK$LÁ|$X øÃ|$(} |$(Z; $F |$`>1fASD@Á|$øøøøÃ$|$(Ã|$PuøøÁ$JÃ|$8 ($Á|$X[$ |$h/A|$Xu$p |$xà G$øÃøÃ|$8øøøøÁ ÁFv |$ øøøøøøøÃ|$`8v|$XøÁ$AfAM~LuøøøøøÁ$DøøÁ$ A$Á|$Xp1fAZÃ|$0@øøøø1fAMfAYA $Ã|$P/|$høøøÃ$5w($2|$XøÃ|$(7Ã|$(P1Ã|$P4S/øÁ$ w*fA_AfA]~$Ãøøø1fA^Ã|$bwK$ЃøøøøÃ$KøøøÁ|$Xe|$h1($Á$7øøøøøøøøøøøøøøøøÃ|$>y|$XЃøÃ|$P7w+$?ËD$X-L=Ã|$0w(|$~! v|$XoøøøøøÃ$M$# wj|$Xw;fAUu4à wA w6$v#|$w|$(]v øøøø1 D@ÁSv|$X 9øÁ$zøøøøøøÁ$`|$xøøøÃ|$`>øøÁ|$X øøøøøÁ|$H>|k|$P<Á|$XÁ w$|$XOvÁ$nøÁ$w|$H øøøøøøøÁwv|$xĮA v|$X1øøÅt$1qøøÃ|$P1øøøøøøøøøøøøøøøøøøøÃøøøøfA`~$oøøà v*|$XUw$øøøÁ|$w}$iwm|$8 tf$ wE$vv2v'$y w v øøøøÁ$ øAøÃ$Sƒ|$(Ou+$w1|$@øøÐAT UASD$l$8$D$AA|$Ht8A$JwD$_w5Aw*|$hvh|$x~vAv[]A\|$H|$x]|$p \|$@O B|$pJ{A fD|$p|$xkAA |$(fc!|$ '|$hF4`;|$0Bf2\|$xL- wc|$P$y$p$Qy A A|$Pt|$x>A |$@r Kn|$P%|$(n^+A2<~|$P|$0uA|$@W- f^|$p<f^|$h7w|$PD|$xf>jf^fO$%;|$Pv|$p&|$p |$h $fa |$([|$@O|$HA)$$f.|$x.f] $|$@M"fRj. >|$P =|$H9 f|$xYv 1 A# k$|$P$\|$pH|$H(u$f> |$@oDd$0ED|$H=,f$5A5<A|$ o|$ps$ $5!A|$@\|$pL<|$h5! |$`D|$( zfDc|$pW1|$@sf |$(-A+%A4F$B(2w$|$@f%AS|$pS|$` ~Axw xi_|$@v5Yv$5+fU|$  |$x$&fr DD$HE=A+A}yD$(aA]D$h|$P$A|$0U|$xW|$pD\|$P  {|$@Znf.$PEt |$h@6f|$(# A fSYAQvi|$xx|$@1( Aw|$p}e[ 4|$H $M(@|$p |$P A|$h/|$(L|$h7vAA|$H|$PfD|$P AG VA|$H:fD$!~|$x0A,AA fM|$(G@$mfX,|$h9O#|$({-|$`~A4\RfDA4S |$P $|$ ||$xB f|$X A $iAw |$h7|$pD|$h%A+v tjfD|$xyfPZ |$@Aw|$xG+!D|$@ $DA |$@j@ƃ$@t f.|$h9 qzfD|$xR~|$@W |$@<|$pJ!($5Av fDDƒ|$h|$p@|$ |$pBo|$h|$@2!Ѓ„|$p c|$h L$"#+A @$\ f.|$H DA.$OfDf]4A02A&`@ !f\*q y|$P #$N>|$h<)-:::|$p L4L@|$@k3|$@5|$x#C~A 1AxA<d|$( RA/$<|$@31|$p ! Af" _0|$@v$:a$%5|$xT5|$p5f.|$ *|$xdA j-|$HQh)|$H?w|$P9/AV fM $|$pE fY|$h9]|$xA20 @Q |$P $p1A3_A wH>fT/$oR |$H(v A% |$@Baf<&M|$@s} $io |$p,/j |$( vAta|$PA2D$Gw,"|$(L$H |$p TA(|$xzA.h A ƒ|$`t|$pY$Ny|$HS fQf@A:IDi|$h9fE~|$PEuA fE|$@S A<AY'|$Xw|$@feu#|$P(|$xG(kZD\$ E |$p7Av|$PAv;|$@f|$pY'$O1|$` |$pv$mcƒ|$P |$p2$DA |$($Jw|$p|$@Of_|$x{AMv|$xsA|$pPw|$xbu|$h&TA{=$=?A.|$H Ay $wf`q|$@tL|$p9h(|$0](@|$ }A}|$@>A/|$xzl|$p*}K|$(%9|$h8A1|$H2+$Ua! ,|$h5,|$Pƒ|$H u Ac K<DA |$@$|$Hw |$ K{Aq |$p|$HQ|$pA,4lvf`|$@F 9|$p! (|$H(fU |$p |$p|}|$p`h|$p] |$xPZ ]|$x<'|$@O-|$P-|$`- f|$Pfo|$Pv|$ |$X wDL$XErh|$h2 |$P 7|$Hv :0A|$pA$Iw|$x fR-|$h4G"|$PA D$P|$h]…|$ a|$@Kt A4B|$@k#|$P ~f^~|$@h A |$pN AU|$HJ|$P:|$p#v|$`1|$ Dl|$p WAZ J|$p.{ |$p]$w$  v|$Xw|$pL!|$Pt|$0~-` |$PbAv$KA|$@k/ T |$h6cA$X!A2*|$h48@A6v |$PA$}'|$X@$|$`~)u)|A |$x|$h+JIA;Xw|$@oA A|$@ \$h ` w |$`f.Ap4 A? J@|$p6$l|$h)|$@kv|$xwA] w|$xq|$x%|$p LA~ ? |$xu9Al GA6!|$x$A5$}vfS|$P |$P] $]"|$@f|$pƒ|$HOj'|$h=_'|$h<A|$HV0|$P |$ k1DZA#e g#=|$h@Ap!|$hR$$IU|$ |$@8|$pA|$@hK A="|$(|$Ht$aT$Pu$KA|$p(2,|$P"$ fT |$p |$H|$([? |$@\f.v|$x6|$xDA |$HP |$pm'$[A./ /A&A1 A|$x$A$DA-$~ |$P A2.,|$h;+/ ƒ$x/A /5|$P j |$h7|$@jfZ#d2|$XY2 v|$h.$@$H#|$HQ|$XAt~f\|$p1#vA@6|$HB |$( |$`$Av,|$H+I $t|$(kvAD|$@ynfbNA0{|$p}555)5|$H fD|$pC |$p 4|$@H)|$H|$Pf[|$(t |$p%bXB|$xswf[," ${ A) |$p]|$x  fS)-X A UAau|$pS$v@A7+v |$X _ |$@ZA'$:P$f.|$p |$xR|$p4Av$zp|$p Az fY $|$H$%|$@J$S A% f^|$@~MA|$HA 2|$P+|$X+|$`+$7+|$h:+W+EA3$w%A v|$xzA23 wAW|$`RA|$@sAuAd|$h? |$Hn $Az+0A,|$xNfV|$  |$H A A|$@{A7' |$ 'K AP}$\M *A nI>  |$@o|$`B|$($XA |$` |$h<|$(| $]|$ A4|$PvxA y fP#A |$P B|$(0|$@i|$H>|$ A |$@&ApL|$x:j%|$H!U%|$p\1 |$@J|$h0F|$H|$h% U|$P |$p 2 A  |$xaf\,$O|$h74|$H |$` A;R(|$h(G(|$H$ $ $b|$h:`|$H u|$0C!|$P !|$X&|$P|$P fC|$h@|$x# 1fo|$X |$H |$H@ |$x1f#D@|$@k|$P' ofJ|$@y fAA U!$;#|$h#|$PЃAv|$`|$(-o$9f]Aƒ|$ A |$h2ZPF|$P4A)5A A|$P,? A4|$@|$P;A||$p7 A}k |$py$gAS|$xsA$[ 1D@"#A.|$(|$X$|$(}|$p< |$x9;{A gA2 rAA / vA 3)|$hz|$xvA6 A!]Ak ƒ$ |$HN ~A}vf_f\|$H#$R 0|$P  |$@a |$hAv  AAJ|$Pf_'|$(A}Au>&|$@%3&t|$Hb'|$@4v|$x<B8$N $$I9 F- |$P @|$x)|$xfYu|$(v|$x}|$@a|$`$Zk|$P WMA'e|$h/1AG|$x ~ $Xa(1fDD@|$@c J $Zb%|$@T8%|$P AN |$@u |$HAW M|$H  |$x/2|$@e|$PЃA$^ AQ |$P  vAD~fUA,f |$pUADY v|$xw,"|$H  1fUD|$@f fU A |$H ? fZ 1|$ D$"$$\'A i_UK/?Aw [* |$ ug|$PR|$HD|$Hqf5fLA|$H $A!{!ndv|$($LB8.f]A"eA  '|$@|$PA.|$h8|$ y|$ j|$p2\f\81f8D&fO1 v|$`ܸ$Y|$x|$X$|$pXAf\~A }s`$9ZAY +Am v$1)|/|$p |$@n|$H|$h1q v${fIAxndZ|$x9|$(m  cAA + |$@sv|$H wdk|$@2F< ) |$HG޿|$X|$H龿fPƒ|$@z A3 铿u|$Puk|$(UAIf`N3fUN|$p |$h& A{ S |$H |$p |$ U4頾 X  A(z$8e[. A /%< fM_$Ѓ A fN ǽ齽鳽f\X$[锽|$@< |$p fZ A TfZ|$@r|$pPA &|$p4$l|$P|$` |$P ȼ龼鴼$Uƒi$][郼AZ| |$PdZ|$h7H|$H6A0$Fy:|$HݻӻA;L$:v钻鈻~t aAMC|$@xOA $A$|$@BܺA0.|$p<|$P 鲺|$pU|$pa醺|$PvAmcYO <2(|$p"w. v)1fWܹ|$p 鸹|$x{馹$D$PofP|$(H!A„t<2(wQ|$HANٸϸŸ黸AtfTfN釸}Ai|$HЃXND|$x]|$h<$A0|$P A $&|$h5!A„K|$H@|$h9B|$HA|$p<3鈷A+E A ^TA.|$H|$ $AZ ߶$fI|$P 鸶鮶餶 (|$`Du|$p}+vlYO<2$f]F|$H>1(|$`}7$Iv-е|$pvfH魵飵|$@w4fS l A vEoeA= Q|$@Qv|$h/:0&1|$P ޴ԴʴA} v@馴w"|$Pv | |$Pa|$(Ww t A7m$߳$`$V A>  f[ |$h:F 鎳|e|$H"w^A6|$P7fQ-J@|$P .$A |$p$Wϲ|$h*|$p1$顲A|$p   |$phA|$x@$'hA1^.$ 1 A|$pr  $1鷱魱A |$(!鑱釱}sf[ A n |$H $ <|$pk: |$(  |$PfXfV |$P}鰰|$pw(H } |$P鈰~$W] |$(}[QA. |$H |$H3!|$ |$x|$hAA-黯|$h 驯A Ѓ閯錯邯|$h.$ A' |$@3!Ё|$p „t@6fYA7ƒ|$ Ak|$@O=  |$pjA6Ů黮$q P$tB$xvAIwmAAArRHA   |$p@ |$@awf\|$@gW|$`|A(ɭ鿭鵭|$H飭陭鏭酭{qA |$h3A) ?5+! 1|$`ڬЬƬ鼬|$x,鞬锬|$pwZ|$H vI|$H t8w&AvaYND:0&|$Pw8 v&A ޫ|$pɫ鿫|$xv5|$xv$|$pv|$x鍫郫yoe[QG=3|$P uEAAjݪӪɪAwfT鰪馪霪钪鈪~tj`VL|$`||$H5+|$PwI1f_A"v|$@8wnw7$.۩A)wbA"w3'鹩$|$@4险|$P釩}sfK=fJ~-Aƒ|$ u|$x!D:0A2vAZ_v'$1v|$pߨը˨鷨魨飨陨鏨酨{ h^TJ7AЃ$$~w9|$` ~2A K $' |$(|$h1|$`!A&„t|$Pw 鲤騤|$h3w]|$p wI|$p) w5zp|$h3u|$Pw XND$8|$ |$P!Ѓ|$H„t{|$h7wtݣAw|$x>wã鹣鯣饣難鑣釣}si_UKA7-#|$pw&wߢբˢ 鱢駢面|$p鈢~v|$h6i_U|$h/w>4|$Pv$D|$p3A)̡֡¡鸡w1fD雡A釡D\$ DT$pfA^|$`Rw0|$(u$nD|$|$`m|$H. |$06|$XR D|$0|$8Z$1OM$d $|$|$hq|$`\wy  |$P* |$`AE|$Xv |$PKD$|$0…t|$|$X $E|$h|$(u|$Xt|$h4e|$XW|$X $ |$P<h|$8X$a$x(o(f.$ |$8 <|$(]|$X; y$7$}&fA[^.| 8|$0.Y8|$P;Z9fAS?O|$0D$|$`~$ |$0R|$(G|$h+%|$0 |$X$H`Wf$_r|$0|$`n $|$@|$P 'fD$l|$(5$ |$`5$ * G  $ $3|$X*%fD$a|$XS3 |$(T$ |$`~$T e$O\$|$H |$(C|$X/O |$(T w|$Xwfxw(|$XvD$X-.@Ð|$7p |$8|$-jfAYM$>~$5fDv|$X$f.A6|$8 $ $fD $|$ |$`z5|$%$L |$X A|$fAaj S$gA|$0|$h1g1$vDY|$`~E A; f$[|$h* $  |$C|$X|$P G|$(f|$(F|$hZ|$`7 |$8|$h1$-=øffAQ`|$0' |$`'E|$h1gfA]\fD|$0@|$(X |$h! < $ |$h(Ð|$0|$`>|$(Z|$8$)fA>)f$-=AfD|$(P+|$h* |$x$MmfAQOfD|$`|$0E|$X$b?"$dC.fA];|$0 <=jE|$h5DfD$t|$8$R #|$P|$0 fD|$`z'l $Z ~|$(o|$`qo D$#@$k$$v$dfD|$(s1|$DfD|$,|$(| |$XpÐ|$P4$"8 |$@$P|$(YE|$X1:$_ ZD@|$`EX|$X4E; $l„t $fD|$0 fA_ |$h)|$(-fDL$|$h  Ёu$mfAaAFvøÁ$|$`z3|$XXY d|$H$|$8u|$`xÐ$]|$8AvT$0Ã|$0I|$h1C$WÃ$2Tu|$hpÃJfAad|$X v|$`c0f.fAv|$P 1|$0TÃ|$01,fAT .$?#'|$X Ѓ" $&A|$P *fAG*fAT2$\h3=D|$X6$U$1fA^Ã|$0,fAOÃ$i|$`y ANfANCÃ|$8  1|$(_ø v|$(c Ã|$`2|$ AfASJfAD.|$8|$P.fAP(|$X$f$|$8|$(\ vfASÁ|$X[Á$… $q Ã|$8ƒ|$u+Ã|$(@|$Xu] Á|$h$zk|$h/`z7 |$Xuy,  ]$|$x t|$X\fD$hv|$(i3ø|$P5$fAf|$8 fAb$|$X |$`Yf.$-:øÁ$|$HÁ|$XÃ$A0|$x$yøøÁ$3|$`| 1$4Á$Á$$5v EÃ|$P)Ã|$(ML AÃ$9@ T|$w4 4Ã|$h*|$8J|$XR<Á|$Xv |$(Ã|$P5 $$ Ã|$h.u|$X'oÃ|$(P |$Xg$JÁ$Á$=ƒ|$`op$ _Á`fA*Á$H|$P$q$fA[$v|$`_`Á $|$8ffAbÃ|$P( |$hÁ|$XJ^DD$0ESbm$Ã$T< $9hv|$` Ã|$`+ |$h/B$+|$X!|$Xlv|$Ã|$0Ã|$h5AM 1ÁÁnr|$X9 $cÃ|$0@ $n e=Ã$|1|$(a|$0 |$%|$`K v|$P3f.Ai |$P6^ Á$j|$0 $> r|$ fDD$(jw;[Ã|$(RJ$HÃ|$@|$XfAXA |$0Á|$0|$0Á<øÃ$lv øÃ|$8øUqøÁ2#øÃ|$h/E |$P:|$8!Ѓ$q!Ё|$X!ЃfA`u |$8$Ã|$h3v$øÃ|$X|$8 Ã|$`'o |$` l*|$8$1t@Á9 A!|$X |$8 `Ã|$h, fAW$@)$Q%|$P?F%f|$h, |$(r|$X7ƒ|$8#A #|$X- w |$x ÁfA_  !fAS.!|$X!|$(J2@$|$`Qzw |$gÃ|$ |$0 =|$(6v -Á4ÁÁ$Ã|$M |$X|$h*|$Xf\|$`(!fA_8,,|$+y+f|$X Ã|$8T$&CøÃ|$`t|$H$-)|$`|Á$ fA[ |$h.;|$H&|$X&&&Ð|$`l;|$(^fA[3$[$ D|$(k $\  Ã$6^ |$0n|$|$`FfA^D|$9à |$h0 K$|$x|$P;|$8 ЃÁ$ioÃv|$h65øfAOK1ÁT $Á|$(Q|$(S# |$X fA\W|$(XJ$|$0 0$|$XR'|$(9D|$(M & |$8H|$ƒ|$B|$Xrf|$(|$P;|$hY$HA1EÃ|$`|$P4d|$8Ã|$8øfANfÁ|$X$` $[fAZ~f|$|$`Ue. øøøÃ$lvÃfAT;|$0n1|$DÁ|$(øøøÃ|$@K1D@Á|$Xv#Á$|$(„t$A $3  |$`z$  Á3 øÃ |$XЃøÃ|$$-$ 1|$H Ã$L|$X7 |$P9ƒ|$0$JÃ|$h'|$P,|$0 A Ã|$8 fAW Á M |$H|$Ã|$h.A Á|$XÃ|$H!$P |$8Ã|$(d |$V|$(XD$X-= Ã|$`8% |$h0$ЃÁ1fAVDÁ|$XAfASS$X vVfA_$xOfALo|$`V|$0)Á$Jà 1DÁNvfA]Ã|$7ƒu$ à $H|$Xh-A1|$HfAA AÃ|$(B<|$`%s|$P>Ѓà P$Ã|$8 fA]|$Xt$ A |$CÃ|$` |$PEfAHЃÃ|$0tA`Ã|$( |$xЃÁ|$ fAZ= |$x=|$XS1Ã|$(&[  $j |$`Cxl|$@($(ø1|$@Á|$X4Á$A8 Á$),|$(h$'eÃ|$P4|$X7Á$"|$X øøÁ~ $ xøøÃ|$h.v|$`oøøÃ|$hv|$0FÃ|$Pv|$(i)øÁ|$XfAL~|$ÁE øÃ|$(om $ 2|$(fB $$ Á$Ã|$xI fA  Á|$(l5|$XøÃ|$8$vÁ|$XfÁ |$8 t Ë$-=Á$$|v|$8Ã|$h4~Á-?$o+|$P7|$XÃ$~$) Ã|$8%L fAPøÁ$>v|$8 fA]fAVvÁ$ fAO L$Z8fAZ'$y |$P.Ã|$] |$0 _øÃ|$P3Q|$(V|$(R3$fARr 1DÃ|$P/ $& øÃq1fAID@ÁÃ|$H|$$'vfAYÃ|$8k |$h6Á$nfA]aD|$Xe(|$`=>|$P:$fA[|$(4|$P2 |$8Á |$0 Ã|$0$f$t$Á|$X4Ã$j.|$P2_|$XkfA\R|$(i$fÁ 1fAD@Ë$|$8ЃøÃ$K ЃÃ|$0:Á`Ã|$8 Ã$d|$h6<|$8  fA~|$8Ãz|$X Ã|$h3|$0$v Á$ Án9n|$h4|$Sv$4Á$$z+|$8Ã|$(^|$8  fAK2 $& \øøÃ|$(Á|$X|$x$|$XRøfA[u;FÃ|$P:øøøøøøÃ|$wnÃ|$5øøøøøÁ |$Xt |$8 øøfA[] |$P9 |$|>aÃ$yj|$C|$h&|$ЃÃ$z$ $ Á,|$8'$ƒ|$Hu|$`Ã|$0 |$(vA Á9Á$ Ã|$PA |$( $|$ w|$`!øÃ|$h)3eÁ|$X\ Á|$XmÁ&ÁK Ã$= |$P3 |$0$|Áo v|$0WrÃ|$P2e|$(\v$DÁT1D@Á$ Á|$XL|$h28fAP |$@|$`%wÁ$ øÃ|$OC |$h.|$8 j|$0Ã|$8wWøÃ|$` |$h'B|$0øÁ$K {|$``F|$XøÃ|$0/i vøÁÃ|$H |$@OÃ$gÁ|$X  $ |$8J$q*Ã|$0j|$-_fAH~$SÁ$ |$0 |$X$t|$H}$|Ã|$0øÃ|$P. UøøÃ|$P70  fA[|$(U|$8Á|$Xp y|$h4Ã|$|øÃ|$H, |$ |$x 1fA8Á$ o fA[ |$8 Ã|fAY;A ЃÁ$!à ЃÃ|$` |$hA?|$&$dЃÁ  Á|$(øøÃ|$`9 |$H |$P7j|$Ã$nwK|$(oÃ|$huL|$(&|$0|$0^Á$ЃÃ|$8*|$PZ|$1|$@Ã|$`*wW|$(JV$HT$0øøÃ|$8 /AøÁ$~øøÃ|$`+fA4D$PY|$XøÁ|$s|$8fAE|$8fAS|$0a|$ V|$` )0|$X5|$Ã|$0w7|$P1fA]|$Xw/ÁÃ|$(4}|$r|$h0G|$XÃ$J0$6v|$8øà w tÁ3 xøfA>|$8$à Á$LøøøÃ|$8 v$øÃ|$h<8øøÃ|$H)|$`MøøÃ|$`Gw?|$x|$XÁ|$XøøøÁ$ ÁAøøÃ|$0Ѓà w$c v$! Ã$[v|$HkøøÁ|$Xw|$xvAÁ$ r W A Ã$i Ã|$ $5s |$HU IfAS|$XøøÁÃ|$2w$XøAøà w7|$X 1 DÁ$8wXhÁ|$5 $iЃÁ$ |$` ÁrP $ 9 |$P6( v$7øÃ|$|$t |$('Ã|$h6 fA\ $ v|$h1nøøøøÁ$SJ $X6 $KÃ|$x|$XLÃ|$h2w=|$X m$ w|$0 fAYe" KfA[|$*|$8øÃ|$(@$4`|$X oQ|$X øÁ øÁÅ~|$8Ã|$`GøA .$l fA\b|$0$$ B|$`C1fAXIAj|$8 u JWÁ|$8|$0ƒ|$Ht ÁXF|$0øøøÃ|$8Á3Á$wfASt|$`#Ã$%fAQpP$M9-øøÁ0v$$Ã|$09 *|$8øøøøøÃ|$P9w9|$HÁ|$XЃøøÁ|$XD1|$øÁ$\fA_B Ã|$H-|$*=|$0>|$8 3øÃ$4øÁЃøøøøøÃ|$P4vfA\ÃøÁ$|$X øÁ$ |$H}9 Ã|$`G|$~z$]wj vb1|$HID@Á2 w|$0w øøøøøÃÃ|$([øøÁ$r øøÃ|$8w&|$h2w$w øøøøøÃ|$0 Ã$\w_ wWøÁ?øøÃ|$`wN|$h2w4|$(vw' øøøøøfAW~.1Ã|$8wF|$h&w$4 øÃ$Wv`|$`wLv>3 Aw&|$X/w$Løø1 D@øøÁ$nøøøÁ$`w|$0 øøÁ|$Xaøøøø1|$@øÁ øøÁ$ waøÁwy|$`:we|$0 Ã$qwøøÃ|$(Sv%|$0t|$h5wv øøøA Á|$P.$> øøAøÁøÃ|$0à wR|$HE|$w'w|$H|øøøÁ$@ øÁЃøøøøAøÁ$8v|$8øÁ|$X v7|$P8w*ƒ|$h-t|$0w øøøøøøÃ|$xv$>Ã|$h.wZA wN|$P/vGv<$\w,$w|$H|øøøøøøÁøøøÃ|$H Ã|$8|$P/$Ã|$P2w6w(|$w!Áw'$NwøÃ|$0øfAZ@$vv$ Áw2|$|+øøøÁ w v øøøøÃ$CøÃg$p|$(iwh|$P6w>|$0v1fAV~$$bÁ$ ЃøøÃ|$h6wq|$([wU|$h2w(u ЃÃ|$0 v-fA\OÃ|$(Vv$ w øøÃ}|$Xw øøÃ$tw v|$A wG|$8w: w#$vfASTÁøÃ|$8wfAX øøÃw-|$h3v&Ã$ow"|$0 v-øøÃ$q|$h9øøøøøøøøøÃ|$8 øÃøÁ øøøÃ|$PSÃ|$`vX$w.|$0Á|$01fADD@fA&|$0޴øøøøfA:|$|$0|$}~|$PøøøøøfANE|$`"w $NøøÁv|$0#øÃ|$0=w8|$Pw+|$0:w|$PuÁ|$0øøÃ|$`wM|$0HÃ$wIfA&OÃ|$hw;|$0Qw.D$8u3|$0Lw,Ã|$`"v%|$P"wøøøøøøøøÁ Áv|$X\"øøøfAO$|$0+Ã|$H|ʲøÁw|$P=v øøÃtøøøÁ$`vC|$P3w61|$HÁÃ|$~|$8øøøff.USDT$p\$0$D$AR$w2Rn[]ÐA AN|$H A |$hI 7A $l |$(t+|$@3Q8|$F8yD|$x#wa=D$ AkA AUD#AwW|$HAj|$h r `v|$8^fDA|$(k |$8XAAp|$h$|$@|.A[=|$h*fD|$@]Axs$f |$x!oDT$E||$8\|$82w|$XA|$hAnv vl$C|$ -w$5|$@A|$h |$@v |$hn$BA5fbAXd|$hfNF$]|$x/0|$@|$`7|$ $f]$-|$x+E8W}D$VVX|$H AX|$ N6XfA6f%|$@ 1|$h @|$8x5DD$(E7|$h H |$8;ff.AM|$x;=/|$ Af A|$h>v |$Xf.QTA/|$`< fKF|$hd|$@A ||$x |$P|$HH@|$8{|$H] |$8>)$1|$/fD$$K |$  1 DA- |$xAAW|$x%$u |$`++AfD|$H $Q bAb,w AA|$PQ A5|$H}fGV$\|$h| / ;|$@|$  |$x- 8AmfRD(ASf |$@7|$H v ffDA7x@&|$h A|$H |$8i6"A5#.|$8]6ARD|$`C|$xWoMfvLMf^-MfUMfN|$@fDf`$J|$ |$`:|$x69 AI|$H"|$ r,+|$x0EffT_A} A# u8|$H)`8@$~|$ %vfD$ |$@!* fC  |$x3a&At .s.JfD$.|$H w |$h(f|$8sUD|$82|$ -3C %o|$x2|$h#Fg v|$@[QD|$x}|$8.$nw A@|$8g|$hzA|$h|$X0A fD^ t$@$KrfD|$ha|$ |$8H|$,A, @$E yw |$`0|$ f^ |$8X|$H wAoD|$8U-|$@ |$`:~.rf[Ao]S|$8<|$`%.w fbfD|$x6|$@j$V|$Pf^!A„*AB *DD$@uA|$hvAoe|$x-wf]OEA PfU|$@ 1A Aw|$8|$@. Aw|$P|$hCfT^ n|$@|$h/$pr|$H5$P")v|$h%  |$x |$@J>|$`3|$`: |$@|$`8wA?f.6k~ w AVL$m5 |$x!* Av|$XA|8 |$ |$h-B |$h fD$J  Av|$`=|$h=v lb|$h?M|$`|$hD  |$8g |$x- |$8=f\|$ A6A~%|$@=Rf?$'|$h  8fV7|$7sAgƒ|$Xt|$x.I?G 1|$8D$8j ƒ|$`5|$HT$@AfX|$ ,$|$ p|$8OAfS|$ zo|$`:_|$`.FA$LgfXA |$x4_+$GvAfD|$hX|$@ |$8  A#f<u$8g |$(\ AK|$@LvAr5+S|vA@O|$@$U v|$ >Av|$8Sw1|$DdZA-o|$8Fd|$xx${$A6w|$h |$8`f[cA1A$fW~Af$[ |$h|$@$A+|$H 028ID|$8w|$ܸ* $O A|$mf_8!fM'|$x2 |$@p|$h\9|$h fL |$xx|$Hf|$h 1AsD$.|$8~|$@ ЃA!Ё„t |$)|$Hf^|$h A!AD/AV|$8O/Aph|$x=w|$8yQGA#8|$@Cw |$`4&$& 1A|$x& Bw|$ z|$x |$ ƒ|$tA,|$H   A |$8d|$x2;%|$H |*|$hO*|$H)D|$x*AZ  f^ |$x!) AsW va $[ Ah|$8g|$@E"fYT|$hX"|$@(/|$`=u A3P9fD|$H|$߸f^A;A 1|$X_|$HOAvf\7-|$@AA.|$`:|$H A|$xb%|$(B%|$h|l|$82ƒ|$ %tAI?A |$ A|$84!|$hy!ADA|$x/ApPA!  )i f^||$h |$hvfaI?fZA7 vA $f]|$Xp%|$@D$h||$Hv |$h!|$h5Ab|$8_TJ|$8V ANN AQ  fT|$H |$8acbA|$hZ $WA |$`9$9l|$  |$8g A2 -|$h1fTN  |$@ v |$hA%7|$`9|$8[ fU~A $yA ;'|$Hv|$PB8A'fS X/A|$8[ fNW|$hFw$ |$hm w A S $j|$`*|$X ~|w|$`+$Q|$`8.fNA( |$HAƒ|$h|$x0w |$x+?|$x!$<&|$h$ A+|$x/ A f |$H1D@$t} |$`7:A|$hF |$PVfFNfAqTAl|$H pf\f|$HfAhvU $_ |$8\. (AWA|$`w$er |$`kW|$8NGAP3v|$`7Ax |$`9kAu|$`9s$p|$`v$sAA"v Arh$O3d'<$5ƒ|$x+t  ^f]A:v 4 |$h A=v |$`DL$xEt |$`yo|$@ ] |$x)f$$]$A $A |$h NA(C AOw#|$h$Ys |$H|$ ' |$`6f]|$(R|$8[ l>l$|$x)B$|$`1-|$hvf]!Ѓ|$x&„-AD-L$@ |$x*|$@!|$`7|$@!f]!Ad A3D$`.Vf. |$@  A!AAK|$`(A 4 $o!AI!Avf_|$h |$x1L|$`<3! %/R/|$X'/A[/A E|$ j |$H |$h?$X+ +|$x5 A#v|$@|$x7|$h"-AAz |$h v|$@kaA |$HEA 1|$H&#|$H6:f |$h0X |$@  AN |$`6r |$H q1fb|$`3\A$g|$H fU H8%|$`6ƒ$C$2A $ |$8H|$(A}{$' l A>b MfRN7|$8yc fV1f^D+A|$h'A. A $i $p|$HG }1 AD`A- |$@" 8|$x/3A^g$l=o+A b+AVb |$H|$hJA A$~|$Xi|$h'[7A|$x/9|$8o  ƒ|$P|$X$' '|$8p9($q!(A7(|$ $,(A1vf_|$@v|$x(qgAz $qA vAA0 fYx |$`8v|$|$h_ |$`1fa8)|$H#)|$ J);4)|$X))R|$h % |$AAOЃ  w 1 D@|$ht A |$HfQ?AA9|$H  A4 qAv4WM  A.  *|$8z |$`)AA|$  |$XNA0 A |$`; u|$j|$8y=1|$XDg|$8o|$`;J|$`8I fZ" S|$hE|$  |$H |$8I A 2 |$`7A>&|$H3&$k |$@ |$x(fZNlA+$\A& v|$ $|$  fUA %q1A6A,|$*H $|$@=  |$`7 |$H I : Ѓ+fD |$H|$8K|$h)$|$`8vA|$`: 1|$XD|$hA|$ 3nX|$`;f[78 +81|$P&A] E $s|$`1/%|$hpu|$ #A ATfF |$H6|$h D$H |$8k |$h %|$@%C` $fXfTM|$x)AC|$h%kv$%AfX-  ovfU[Q v|$X=<2r`|$H BAA&A wA*v$-[QAm=3)|$'|$h|$@$~ue|$H 2fZ$|$X|$hS|$@A'A#l1AvfU|$ -|$8[| |$`8~  |$$b}_|$h8|$x3c!A  $3^|$`5|$|$h |$x+|$hX A{$A|$`( y?5: fQX|$C|$hZ 5|$8T $5 |$@ @ A |$H |$`; A^ S|$x |$`' 3)fK4 A(f^|$H vfX|$@w0fVfVt|$8V ~ `VAB$f !v|$8ofU|$8l|$8vA2 r Av|$`: $TafT A 7-#fR |$X2|$@ Ѓ$N|$hQS8|$8?  AIi$[$>A |$ '|$@$Av|$`>A ЃǿAi 鳿fP|$h鑿釿}.fkA . w|$h KA|$8VTA>vA |$hD$8?|$@ |$H |$ xL-|$XAo |$x4AA|$x4tAu $pOEn9$! "|$ 8޽Խ|$8M.|$HA 骽 Ѓ雽鑽釽}sA3tNKA7|$H %|$H)$KG t |$H 2龼鴼1fZD@颼|$@ v|$h~|$x4wJfRDg]|$x/w3A7|$H 7-#A-Oƒ|$X tV A|$`=ͻû鹻鯻饻電鑻釻}_AEAT\R@ ?AECf[ AN Ӻf]N$m霺> h|$8GB$;$|$HAB|$@|$hs v|$=3)|$ CA|$x!AN v|$H |$Hй|$@ 龹|$ |$h A! 鑹釹}A@|$ B"|$H S8 vfQ<2(fP  |$ AAw,|$86W|$Hv|$86鰸|$h|$l|$@ƒ|$@ JA@k$JfTA<2(5AA $u3|$`;(鹷鯷$Zw4|$ w{q|$NZPFA,wFA,|$@ 1|$ ݶӶAL¶鸶|$Hw|$hw |$H钶$j}|$H /A|$x1FXG=3|$ $%A|$Hص|$(v |$X r鯵|$h 隵鐵醵|AvAdZP|$hq |$H0n  |$h b w|$x1̴ִ|$H D |$`0Ѓ鰴|$  |$X||$P~t i|$@^SI?5+! Ay|$`/ AƳ$Ѓ鴳顳|$HЃ鐳|$@ ~t|$hSƒ|$ $u|$x-MC9|$H,fJ|$x|$@$R|$xf( 1f#Ӳ|$85J A鷲魲A3t dh fST .H t|@$%[ AM |$@ЃCA/Av1|$`|$h Av0f$~ |$@:vf-ɱ鿱鵱髱|$8|$@wt|$}||$@Nz|$Hw~$vt_$|$|$h"1fD@f61ff;~Q|$`cӰf:~l$vX|$@XvGA騰鞰锰銰EukaWA5rA[A$$wp|$@a|$@wQ|$H|$h6wp$/vf$|$8[Ѓï鹯I驯|$@($!醯|rf^A|$X~zvhA*wOAA!u0Aw'!EݮfK1|$x.v |$ vfL鰮馮|$x.wLA鎮|$`6|$ wb|$h#gAS|$h!w%w$%.$v&|$@AحAwNw(Ax鳭驭韭|$@%1|$D@遭Zw]f\D|$@w3|$|"|$x,vMC9/p|$8*Ѓ |$8bw ݬ ʬ|$ w"| v|$8w鞬锬~f]|$ cY|$`6vl?A|w4w"|$P~ |$@w)|$`5vܫҫȫ龫鴫A'ƒ|$`:u|$@w鍫郫yoAGw]|$X 3A |$ht|$8f9/A6 v|$8f |$@ ܪҪȪf[N鲪騪鞪$w鉪ukaWMC9/%Av|$X |$8vAةΩ|$~?u;鹩$w1|$8頩|$Hw11fQ鈩~|(A/h|$PNQ|$@?5+!|$hn weAv\$t |$8wf7ƨ鼨鲨騨鞨w%|$ $v鈨~tjWAv@6,"|$@>vE1f3Afƒ|$@u|$x*̧֧鹧鯧饧雧鑧釧}si_Uv>A @|$XvdkfAOu$~ |$`1s DfA_|$h6$SE $Of|$%fAW fANO|$`5fAL |$(yc`1|$HDf|$8?|$x+D|$XJ|$8@B|$X|$ b fø@$N|$(@@|$hs$]$G$#z$v E |$HofDfA^  Ã|$`-X$$|$8}|$xfAK$Ð|$X<fD|$8  7|$8 !|$)/1fA'DÁ$X |$`zH T$0|$`tFV+$ E+$C|$0HY v H|$8 i$ |$(l$|$0$$IU w |$fD|$(tf|$`=$@|$`<|$ $NfAL$.f|$(C$zÐA&|$|$(v f.|$`b|$8t@|$X|$(5@|$O|$(N( |$Xf|$8f$@f$Zc|$`9&$B$@Ã|$`|#|$([|$(2 |$hvA|$Xbd|$$EC|$P2v|$X:)Ã$r($E"Ã|$(j8|$XøÃ |$ÁAÁ  |$P5|$0u|$xL"ЃÃ$] |$`J+ _$7'fAZ/$|$`%N|$P?tÃ|$`! Ã|$fAZ{: |$h"/ Ã|$h'D$|$`k1S)|$Xh)|$h)fAO~|$0!@$ |$(r|$h81Ãa |$`L1fAYÃ|$P6d|$` I|$0Ã|$8  X|$h%Á|$X=Ã$z||$`{S|$`>$v @$#$8|$X/*fA8#|$8# |$(b|$`gL%$B-F.$Y$fA] $P"|$X-$Ã$J\$ 1|$0DÃ|$`-t|$P0Ãv|$h(Ã|$8 m|$`>|$eJ $V9 Fv$v#øfAc |$P? |$`y|$P&$-4ËD$X-.Á|$(|$(|!H|$8 |&v$`Y@|$0:  øÃ|$`a |$0 $$%Ã|$h9$` A1Á[øÁ|$Gv$h|Á)|$XÃ|$84 $Ze|$h4|$P/Ãq|$x|$h!…u$Ã|$hd 1A~ Ã|$h#,VË$h |$Xt$ffAaG|$X\ |$,$/,@|$8 |$XcÃ|$P5N$=Á|$ $ |$X6AÁ ]$Qm!|$hYb!|$@"|$ø>0|$8 fAc! |$(hAÃ|$(h |$Xj xЃfAKOÃ|$Hx$Ã$$vfA^|$0 #v|$(o=|$`U%fA`|$@'|$X |$h2 A |$(/$2|$P3v |$h0Áx $b|$$W&|$h3|$(U!Ѓ$U„9)$i ()f|$(y |$d|$(W|$P!4"|$Ho`-|$` |$X |$8øA  v$Á|$Xv|$P/Ã|$0@ |$8 \fA]fAX-'|$h7Ã|$`AN|$P9|$0OFøÃ|$8b |$h6W Ã|$ fA`fA^$'i$*,$X|$X ,$^,f|$8|$X@v$+øn$^ $fAN# |$8qfAD|$X |$(jR f.R|$8 fAUÃ|$ j9Á~ fA^{|$P1|$P9„t$øÁ|$Xh à  fAa@ fA\Ã|$0|$h/A Á|$HFY|$A(Á|$X36 "|$Xu|$P9„|$`}|$XA|$h0ËL$ $?Á|$( |$P<Ã|$8w |$* |$0 Ã|$8ÁcøøÁ8  U>|$P*Ã|$ fA@|$01ЃÃ |$H u$qÃ$Hƒ|$h$1øfA`n|$(|^|$w$tIÃ$S5'|$(Ov|$X&fAY |$H |$xÁ|$XsÃ|$h-ƒ$iD$n3A h |$`s$`r#|$X@v" v ^Ã|$P7S |$(8${&|$X T%K%f |$hIt$eÃ$5|$@$7w|$X Ã|$h#|$h+s$ Á$Ã|$`/Ã|$ |$h |$%|$8%GÃ|$0:fAiA  $M$WÁ$v$llÃ|$`]|$h.$7Ã|$-&Ã|$,OøÁ$% $R$/|$`&$<Ã|$`8|$P9fARi|$h4_& Ã|$P7 $|$8MÃ|$(|$H|$XR pfAW"|$P9"|$(}"|$X{D|$(y|$`yD$PPѸ fAYpÃ|$(kJ|$8 vJÁ$ Á$|$0 1$- Ã|$(I fA]+AÃ|$PEA v AI e|$~fAT`Ã|$tb|$X^$Mà |$  |$0Á$m0 K 1$ÁÁøøøÃ|$P:Á$fAK|$$? E69|$0ƒ$~T!H!Ã|$ $Ã|$H |$XI$1fANc |$?ÃU $D A|$`cÃ|$h%Q|$P:A|$X |$-D$X-|$f.A |$h'Ã|$`EwÁ|$($ |$P9à Ã$wYR|$Á Ã|$P-J >|$h%L v$køøÃ$ra |$8K?|$h&4Á|$XY> MÃ$m   $# |$0Áy fA[Ã||$XMÃ|$Hu|$jÁ|$X|$Á$ЃÃ|$(6w$pÁ|$(fAW|$yfA\K $G|$(Lw$w9Ã|$P7 |$8+|$xD$X-=xÁ|$z|$P9 $Á|$X|$(BÃ$| $ $|$Xv$xMà |$X~VÁ Ã|$8Á|$Xz|$`F $V Á|$XGøÁ$|$H fAU|$f1|$@ÃTÃ|$P$NÃC Ã|$x $  A ;$ $SЃÁ$V|$P5ƒ|$8u$HÁ$ |$XZÃ|$0 à |$h$R$g $ZÃ|$HzøÁ$ Á Z |$h3O Á$ Á$ Ã|$>|$x|$HW|$XZu |$0Eà + |$X> Á4wA1Á|$4 $p AÃ|$8|$XfA@fA* fA3t [Á  |$h! øÁ|$Xk  fAO øÁ $ v =Ã|$P7 |$X |$(W %|$P7%fAT%|$HfAN Ѓ u|$X5JÃ|$h*v|$$Ã|$(7Á$  |$ øøøà øÃ|$8 E$}|$XЃÃ|$0J|$P Á|$XW&k|$W|$P:LøøÍ$vw øÃ|$A|$xY $|$8Ã$I1|$8D@AÃ|$0|$`. |$@|$HOÃ|$h;|$P4 fA]|$P/fAaI|$XN|$XTAw|$X~øøfAX|$8y UøÁ|$(Ã|$01ЃøfAE à A |$h1fAR!$ !1|$8 Á Ã|$@ HÃ|$N hA^Á$GN |$PBfA\ Á $)|$0*|$XXÁ$,$V0fALfA,~Ã|$(qj fA`~|$- $pA $n}|$Xc|$`zXÁ|$0Á$~q|$(S|$@|$8K|$P8à B A  D$`ЃÁ$n|$OÁÁ|$8Ã|$h)1|$@D@Ã|$PC%|$8à $ Á|$XÃ|$0 $Å|$X Ѓ< „  Á|$X  $ Á|$, |$X0'vEøÁ$Ã$JfAZ |$X Á$v|$0Á$3|$X%|$XF%wÃ|$H|$X  |$`Gv|$P8DøfAZ |$lAD$8 $z |$XYL}k|$h6`Ã|$08|$(y vyyÃv$^XÁ$Á|$XøøA fAQøà ЃøøøÃ|$P,øÃ|$0]Ѓø1fAZD@Á3 w |$HøøÃ|$8$i?$  øøøøÃ|$h!|$h$øÁøÁ$t øøøøøøøøÁÃ|$`}øøÃ2øøøøøøÁ c $XÁ$[ 1|$AøøøøøÃ|$0|$`L $w|$X:Ã|$@ Ã$Sr Á|$X|$xÁ Ã|$P5M v|$0 1Á$ $øÁvAøÃ|$h5Ã|$(T  |$`J?ЃÃ|$h-$W$6AÃ|$(tÃ|$P8$$vøøÃ|$@OAj$[ Á$\|$XЃAF|$P7($Ã|$(s|$(Qv|$`|$h,2Ã|$| BÁ,Q$|$XwЃøÁ$Á øøøøøÁr|$0 |$`/o Av|$HøÁ$-ƒ|$t|$XcøøÁe$ |$0qÃ|$%Ã|$P5Ã|$0G|$XÃ|$$;Ã|$H+$Z|$`C øøøøøÃ|$0 M$G?Ã|$`V$t Á$ E+ A |$0ÃOøÃ|$0øøøÁ[$ wÃ|$0$h  Ã|$P2G|$8ÁL;øøÁ|$X $øøÃ|$h4 |$P9} |$8  A øÃ|$8 |$0Ã|$z $\tAzÃ|$PV $ |$8 fA/ |$P. øøøøøøøøfAY|$8Ã|$8Ã|$`JwC|$h2Ã|$`xøÃ|$y.v&øøÃ|$0øøøøÁ^ y|$`ph|$XBT B|$P+7 =øøøøøøÃÁ|$XXfA^|$AÁ$w&|$0)1|$H'øÁ$ 2|$(Y'$YøÁøøøÃ|$h3fAEÃ$b%A6|$X G|$h6DÃ$_9|$(ZøøÃ|$8øÁ$øÁÃ$ZÁ$ÁÁ  |$[ fAT) $à w>fA]_ |$`OT |$0% |$~|$0Á fA^OøÁq'Ã2 |$(\' $vqÃ|$89 $y |$h- 1fAZøøøÃ|$8w;$w.|$($tøøøøÃZfA]!?fAX#|$0 1øøøøfAC|$x Ѓ|$ |$8 øÁЃÃ|$`$wv7 |$xøøøÁ#øøøøøøøÁ$A |$`T |$0v$øÃ$h |$8  Ã|$0 w4M $øøøøÁ ƒ|$`<t$ ÁfAYOøÃ$RA  $  AЃÁ|$X @ƃ@tÁ$ fAS øÃ|$@|$0$ |$0fA9efAUI|$h*$ |$`øøøøÃ |$h/g  9|$`,H < |$P7DÃF øfA_ }fAVl$V^|$@~$\fAX~-v"Ã|$OøøÃ|$HOøÁ|$XaÁnøøøøøÁ|$X wY$wF|$|?øøøÁ$ wc$ wP|$wIøfA[|$P7!Ѓ|$Hu$øøøøøøÃ|$8w|$H} øøAøÁÃ|$`fAuM|$PwFøÁ|$H|*|$`w|$~|$0DƶøøøøÃ|$xЃøÃ|$h|$$øÁ|$XÃ$%wn$Ew6$$v#fAQ~$+øÃ|$h*|$Xs1fARD@Á$~ w |$h*&  |$`N$røEu|$(wÃ|$`øÁ|$0-øÃ|$P5w9$w&|$0wAw|$8v øøøÁ$Sw|$h(wøøøøøøøÃ|$|)v|$xt< ЃøøøÁ|$Xqƒ|$h4u|$jw øøÃ|$P>fA[ wJ|$@~Cà |$P.wo|$X_vY|$0 w9|$@~!mw|$ øøà DÁ$ v øøÃ|$HfAN |$(`v, Ã|$`w"|$8wøøÁ|$([|$`-$V) vs|$xwf|$jv_Á|$wI|$X- w+$nw|$w øøÁ$ øøøøøÁ|$XRv|$0 qÃ$kÃ|$P7w ÁøÁ|$X-|$x |$0 $ w? v7Ã|$`?wGfAV~:|$@3w |$h2w|$0w øøÃ|$0øÁp v|$`TuøøøøøøøøøøøÃ|$8v|$XøÃ|$`7|$ Ã|$0$Ã|$`)iI|$h8|$0|$|$h4|$H}h|$H} 1|$øÁÃ|$(3w |$0!v|$X<1Ë$-=Ã|$`wÁ|$X fAJ@w8Ã|$(2wE$'w$ 1|$D@øÃ|$H*fAM~#fAZ~|$8 uøøÁ$ÁwZpÃ|$P>|$8wi|$xuG|$H:|$`:w-|$X\v#$Yv øøøøÃ|$(2w;$Ã|$xv&|$8EAøÁøøøøÃ|$P%Á|$X8v~øøøøøÁ|$XÃ|$P1$-hløÁ w|$h3Á|$Xb øÁ|$0fw1øøÃ|$`|$ A |$X;$G![NA|$@ $g$ ?|$p[fC!|$X1,|$p<7fA*7|$8AfY$x-$Mj-[Ã|$p;$g|$X4W|$v A[f$SR|$` |$8_ |$@$W|$0H|$0I"|$`5 $:+|$X7v$/[fDo|$0|$8[f.fAA(|$X"[df.|$`[fD$[|$a$$n $fAJS$=!$[ЃfT$8g$ [f.$|$p1 |$p$$$l@!|$ 6$1A[fD$X AzK A|$`|$@v|$`r [f.G|$X $ [@|$p|$@w|$XC&[|$0w|$`.|$`d*'\,|$X>,[fDD$`[-!pf.|$0qƒ|$8us[@$w$" $|I |$p8|$X/#$l[|$8v|$;[@$w|$`[fD|$e|$@[fD|$ $S $|$p[Ð|$`$O[@|$@fAY [D|$`E f^8 |$0K|$X9o!$w[f.$q$] A|m$3,|$p7L$[<|$; fN ; v|$0s[$~ D$8 [fD|$X$v|$`S[fD|$Ce|$8|$`  u|$n2[fAN|$@3 $1$2[fGw|$z[ÐA%fAO [D|$@|$0su|$p/U$d"|$`Y+A[l|$@ fY-|$X2*$W*[A$$tv|$@[|$@ |$` z|$`w d[DT$X1[Ã$5|$`w$[@A![1t[Ãz A# [Á$_ |$P$5 [Á$ |$@Y$F$+ A,(|$p!([Ã$z $ \$Hƒ|$P#" "[Ã[øWfAV $[Ã$j fh1[fV{ |$0O[Á|$|$X7Z fM$i'`'[f$~|$0r&|$p1AX$$|$`l'|$P '[Ð|$8mfAWf\$ x%fW^/$2|$82[D|$8 $j$>|$H|$`[' '[f.$CfO~ [Ã|$8 $R~|$0H[Á|$`SAƒ|$@$ [Á|$0[DD$@EPv |$P[Ã|$0`f[ $\v|$8[[Á$= [Ë$|$X3@|$p/$p Ё  [A}|$0@ |$p){%|$0p%|$02ƒ|$ u$[f|$ ^|$0Gy $?<|$0,+'|$8p3}<|$?<AK>$[f.$w|$[Ã|$p4|$X;]A h|$0,% %f]4|$X22[Á$-|$`+[ø[Ã|$@#[Ã|$0TAsTL$8C|$0JvL+[ø[Ã|$p1$|$PA U$$f(|$9<|$p.[Ð$^ P$;" s[ЃÁ$  |$p$At$J[Ã|$p)[Á9%$c|$0}X|$0k|$@+[Ã$fAC|$`"|$p3P2 [Ã|$X:$ } [Á|$`AAb|$`[Á$(ƒA@[Á$w |$p(M|$`R[à  fX|$t|$@$A [Á|$`|$p|$p z|$@w$b[Á$[Ã$i |$`n%$[øA$yA#[à  8qfA`f!|$![Á|$`Bw|$8{[Ã|$Pu fA9Y1 [Ã$O1f\[ÁF |$  &|$p%Vƒ|$p t$[A9 fA] |$8 $C [fA]Uq[Ã$ |$`[Ã|$p1|$8f $$tv|$X:[à ( f|$0[fT + [Ã|$@ wA[ÁR|$0P$Aw$Ll[Á |$`~[ÁcfANZ/ |$8 $evfAN[Ã|$p+$ w|$p [Ã|$89|$`( c [Á$|$fAn[fO $!w|$p(Q[Ã|$0]N fAI/|$P|$@[ÃG $WfAY~|$8 [fAP $[Ã|$ A[Á$v[ø[Ã|$0J< $Gy|$p.[ø[Á$[Ã|$0M |$8&fXA$w|$` [fD$,1[Á|$0|$!70[Ã|$8u $9&|$8;[ЃÁ$ <A-$[- -Á$p  |$X-|$8$v|$@[Á v|$ [1$ [Ã$r|$0o ƒ|$0ot Q[fA[fOfAXP ; $|$X8|$p&[Ã|$0K[Ã|$X N $|$X|$8!|$[N@$$|A~|$HgFv |$0OT[Ã|$pbw$*3[Á$~ fUR$%M#A@5-A5 |$`[f w|$P[fA_$[A-[Á|$0AOCN$[Á?[Á / |$X>|$p9$d%|$@!A[|$`"|$`g8|$0p1#|$X-%ev|$b[fD$aifAM$<w|$p3B[Á$<V$9[Á|$ $@A [Ã|$p!|$[Ã$rH |$XA<$A[Ã$[Á$nq1|$H[D@fA_] |$80.$"!$f[fAR|$XT{fJA'$v$#[D|$@[Ã$lEv |$H[Ã|$@ |$Xf[Ã|$8I$6[Ã$ $ [Ã|$8[Ã|$p/|$`|$` [A-|$$ [Á$a |$p+yAv$be[AH Al|$X-|$M|$p#B[f.AG|$`)|$8[Ã|$0r L|$`1[Ã|$ |$8 1f][DÃ|$X@ |$`$z[Ã}c[Ã|$@  |$pv|$`7[Ã6[ø[Á|$`# 1fU[Ã|$@[Á$q[ø[Ã|$8|$$_|$`[fAX~A[v[Á$ fA^y$tkAT[øAx([A~[f\ƒ|$  |$X9 |$P$& |$p2 [fAZ |$0$z!fS< |$)|$0)))[DX[Á|$U $v[Ã[ЃÃ|$X9[Á$ [Á&|$8$w[Ã|$0m A 5|$`|$p)@'"[à A'|$` w$[Á$X[Á$[1|$@ [Á$t$![Á|$8 fY Ѓ|$p4 ЁLu$[Á$q $[à ƒ|$8[Á|$|$0 [Á$< f^2 [Ã|$X2 |$|$0^$V$RP$$"8$/$[fLE|$M[NÁ[fVAv[Á[ÃC|$X3[A i |$@ AB3$z [Ã|$ AvA[A [Ã|$X? $n[Á$5 [Ã|$Xb[|$PA:$tA[Ã|$p'- D|$p9[ÃfAU~|$P[Á|$Pv|$X2m[fAV= $&|$ "|$`5!|$8#!$w|$p*[Á$4 |$@;[Ã$m |$`0[Ã|$p0$v|$9[Ã$fA|$@a1f [DÁ|$`c|$ $i[Á0 5 v|$X5[Ã|$8|$8o $zv|$H[Ã|$`|$0j] t [Á|$` [Ã$T#-|$0N|$p*ƒ|$X9t k"[Á42 $GU$7G[Ã$]S $[ЃAv|$8[Á$[ÃvR [Ã|$@#r $d [Á|$$|$`(|$ vfZb$hQ[Ã||$p4[Ã|$X9  [Á$ F|$`H[ø[Ã|$8 [Á|$` [Ã$P z [|$8[1fAZ[ø[Á|$`[à |$@ $u|$`Wg[Á|$` pfA\e$v|$0J[ø[Á$4 [Á$[A[ø[ø[ø[ø[Á} |$P1$  [ø[ø[Ã|$X4[Á$ [ЃÁ[Ã|$@[Á$[Ár|$`W|$X2v|$06[à [Á|$ |$@[Ã|$p' $^w|$[Á$}[A 4[Ã$8[Ã|$8 |$p.|$@ $f[ø[Á w$:x[Ah |$p!] [AJ |$0 |$0hN$o)|$8 J|$0n[ÁY v$R [AG|$XW[ЃA[AN! D$0[&ø[Ã|$0.AC|$XqfN^[Ã|$@|$0j[ø[ø[Á |$`l [Ã$F[f]|$0Z AGZ |$8 9$v[Á$X[fAD fHk z|$Ho[Á[ÁX nfZ{|$p33A{[AxG |$` |$`ed $e0'[Á|$0$Mi|$8[Ã|$@@[Á|$`2$j{ |$`sA $ v|$8 Q[ø[Á[Á$[ÁR|$@[ø[Á$$J~[Ã|$@vf`[Ã|$p%[ø[à [ø[f`d |$-I |$0p$ t|$`>[ø[Ã|$8 |$` |$0t $t8|$p1-[ø[Ã$,[ø[fAYfUQ $K @ [A[ЃÁ$[ø[f+~|$8=^[Á: v|$0<[Ã|$@[ø[ø[ø[Ã$^fAW( $ [ø[Ã|$ |$8C[ø[ø[Á$ [ЃA$Z. $[ø[Á[Ã|$X6^ |$`, |$8AAt|$`[ø[ø[ø[ø[Ã|$0dd K|$p0c|$P/Q [Á|$`,|$8 ![Ã|$X3 fW$ [ø[Á$M [Ã|$X8t A!/|$H$,|$8[A $5 |$ $3u4s|$`I e[ø[ø[ø[Ã$< |$Xv1 [ø[Ã$^ |$p$|$8v# +[Á$][1fAR[ø[ø[ø[AAg fAZJ A [ø[ø[ø[Á$Hw[Ã|$XC" fA[ $[Ã|$0\|$p1z[Ã$R |$@ [ø[ø[ø[ø[ø[ø[ø[ø[Á[ø[A s$^$' M[A0$b|$`[1|$@ [ø[ø[AS|$p%f^$[Ã|$0N$ |$`[ø[Á+D$pPȸfAQ A [ø[ø[A$- A[ø[Ã$jfVT[ÃfA#|$8[ø[ø[ø[ø[Ã|$H|$@[ЃÃ[ø[ø[ø[Á$[ø[ÃoA^S [ÁN[Á$\ [fQN|$P3|$8[ø[A fAY|$0Vz |$X4h |$X7)f[$ [Ã|$X9|$0v[Á$v|$[Ã|$0ow/w#$nw[Á|$`<[ø[ø[Ã|$X-[ø[ø[ø[ø[Á|$8[1|$H[D@1|$H[D@Ã$%1|$X6 fAT [Ã|$p fAW'|$8T |$` F [ø[Ã[Ã|$y |$b |$X9 O [Á$wtD |$`([ø[ø[Aw+[Ã|$@wX|$8p |$`   [Á$   $; [Á$6 |$P,H[Ã[ø[ø[ø[ø[Á [ø[Ã|$@v|$p.>[Á$Y[Á [ø[ø[Á$ fA?~|$p2ܼ[ø[ø[ø[Ã|$F[ø[ø[ø[Áv |$P $X[Ã|$0tw.|$X Aj[Á$z [Ã[ø[ø[ø[ø[ÁR 1 [ø[ø[ø[ø[ø[ËD$8[Mø[ø[Ã|$8*[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á$M [ø[ø[ø[AI NvfAZ[Ã|$8|$p' $ fANƒ$3t |$i [à 5: |$@ [Ã|$X._f\[ø[ø[ø[Ã|$X' |$` |$P |$@  [Á|$` A |$`  A7 [A,wPfAJ^ |$ g |$X:2 + $>vA"[Á$ |$`Q 1|$H[D@ø[ø[Ã|$0O |$`<{ f[ø[ø[ø[Á|$` H[ø[ø[Ã|$p7|$c |$PJ 1|$[Á|- $ [AM $ [ø[Ã|$@[Á|$`M/|$0q[Ã|$p[Á$ |$@P |$$,t - [ø[ø[ø[Á [Ã$q[AM$w|$`xJ[ø[Á|$`9 |$`W[Á|$` [Á T|$X0$ `$[ø[Ã|$X(fA\v|$p![Á|$` [ø[ø[ø[ø[Ã$vp|$8Z$[Á|$`|$p($2$.|$`[Ã|$X9vf\ʵ[à F [A:w> w2|$H$ w|$p5v[ø[ø[ø[ø[Á$Y vT|$0TvM|$X8[Ã$ wW|$p4w9|$`lw(|$8v[ø[ø[ø[ø[Á w:|$0s[fA+~IZ w*|$`w~[ø[ø[ø[fAL [ø[ø[ÁX[ø[ø[Á$[ø[ø[ø[Ã|$08wr|$`=wa|$00wSwN[ø[ø[Ã$Swv$MwH [ø[ø[ø[ø[ø[ø[ø[ø[Á$[v|$8[Ã|$0kw4|$|&|$@ v0 vfAXT[ø[A |$@p$BO [ø[ø[ø[Ã|$0qw[ø[ø[ø[Ã|$8vT[ø[ø[Ã|$X7wQ|$8w6$ w"$w[ø[ø[ø[Ã|$0gw0 [Á$p w=|$0\w!|$X;[Á|$`w[Ã|$X9w|$8w[ø[ø[ø[ø[ø[Á$ [ø[Á [ø[ø[fAI|$8![ø[Á[ø[ø[Á|$`@ w6Ow$[ø[Ã|$p4[ø[ø[ø[ø[ø[ÁW w&$Yw|$X:v[ø[ø[ø[ø[Át[ø[fAL|$0q|$`|$0s|[ø[Ã|$X<ƒ|$PtAZ[ø[ø[ø[ø[ø[ø[ø[Á|$` wd|$8vVfAX2Aw$v[ø[Á[Á$wK5[ø[Ã|$p+|$`u u$[Ë$[-ø[ø[ø[ø[ø[ø[Ã|$03v7A?v*fA\#[fAW*|$@w|$}[ø[ø[ø[Á$ [ø[ø[ø[ø[ø[Ã|$v$|$@ v [Ѓø[ø[ø[ø[ø[ø[ø[ø[ø[Á$[ø[ø[ø[ø[ø[Á|$` w#|$8 w|$P [ø[ø[fASS$KwF[Ã|$8"v[Á|$`F[ø[ø[ø[ø[ø[ø[ø[ø[A[ø[ø[ø[ø[Ãw|$p[ø[Ã|$p[ø[ø[Á$[Ãw |$`>vfQЬ[ø[ø[Ã|$8v$[ø[Ã|$@$=[A&w/|$`v|$P}|$@@[ø[Ã|$*Ev$w[ø[ø[ø[ø[Ã|$86w'Aw!|$@v|$`̫[ø[ø[ø[USDT$p\$0$D$AXEuSAvB|$hn$WAbv&|$hJu A(w[]Á|$hAAn$- AoA A|$`>-*|$`.|$xe=|$`vLf$H|$x/Ѓ_f|$x#wi|$h|$8A"|$hB |$HFfNfA|$(L|$H|$@|$h" $Z|$h v|$x$}sfDA fL 0|$`/|$82y$|A v @AA $[C$X AU!|$ r!|$x,{`)|$88`@$E$  A$Av Ahf.D|$8C|$8?A>6 4AfA!|$ 8-A8]$|$hn-|$hm|$H  |$8b |$`ADs#|$6C8A0|$x7|$@Z7A/zL|$@A@@A]F|$8qCA@ w|$POE|$x4$S/|$`:|$h& |$Xqv|$h%f|$8rACWP |$hU1|$hf|$H|$`4A+w|$x)B8$U2AqAfD|$@1A$rfD_$5 wA;@|$HE$(mA<A $iv|$8k<2D$lf.AA%As |$hg fY,A'|$8U8A 8|$8|$8g}|$h9h$j|$`?G4#fDf\V|$h  |$h |$@$|$$|$8//rv|$@1|$hGA  A !|$Gƒ|$8q(Aw(|$8 fW1|$hl!ff]M fZ~$Gf.|$8}r|$x/ |$`8A|$`/N($q;f_1ACK7|$H @7*D|$@ w |$x#|$8i|$X_|$XNf].Af.|$@H9 |$@ w|$x#rh A |$x2|$`97|$`;'1x$v|$ D A0|$h CA<+|$h+Fƒ|$@c7|$`=X7n]|$x5 |$HGf.|$hO(fGAA+f`cAj|$XrA+  D|$x|$1A v |$xf\|$H|$87|$`31|$x)D|$@$7AAg]v |$`%fD$m|$`/mAzA |$h~ !1fafff^BL$@ot$I* |$`;|$@|$`-[W |$h7AA w |$H|$ 9|$ |$`7.Al Y|$ I|$x1| v|$8D&f^j|$x0|$`;fR! ff]$xfXfD $ 9|$H2@R |$u|$PaW$$;"|$@+P|$x5$A#t |$x-|$h |$x)|$h|$h%l|$h%|$8${.$hI )A )@|$ |$h2J fQ$}$$ADfIC|$P$ A*eUR|$X|f`<2 |$x*fR?|$H|$h2|$X~|$87A~|$@$W f; $w|$h ƒ|$8lyI|$H7|$@C'1|$H1|$X'|$hI_|$hDD$xEfb$v`|$8t#|$@t|rDHZL$y7 fcA |$8Ea 1|$X|$@ |$8Q$f^Aa|$ &|$x(4|$h vVWM|$H'4$J|$hD Av|$h $s fL|$Hw|$ #A}7$XfO |$@|$@ |$8AVvfPPF|$x/4* w$SA-A} |$hv|$8Af\<|$ B} ' |$x)= A5|$h cP|$xQ Av|$H ,"fQ $x$p|$@$*|$XV#*|$*1|$PD$[^|$H |$@y|$ v |$@dZfV &A|$x1-fQ!$ 3f+&;|$`;A!51|$fA >fS$JfZ|$@1|$~|$P|fX|$`/[1|$D@H|$x*$r*A|$Hv f^ A\|$x2fW |$hL0A4Ak4fA; f]~|$`<j`|$8yP$iG qvA(|$`= f` $|$xw A;fZA? f6|$PvAVdZD|$HJ|$h<7T$P&Az  @|$8k5S $nAw|$Xz|$8{A x \1fPDJl7|$x#9ƒ|$`1tq|$` f]1|$htAR|$H8$}AD |$x<|$HA%Z0$-$r 6fAR|$h w|$ ( * |$8cf[|$H!|$`6a0*fY|$@h(|$X|$P'8v|$`@KA@6$m($T |$ |$8M|$hxs$|$h0f$gz fcf[~f_b v|$@ ]SI 6Az f` Ѓ|$8n!|$8r|$`8'A &|$huD|$@-A |$H|$@ofY|k,w ZP|$xc|$h2A6  |$`8|$`:fS Av|$x5|$@|$8w fKA}v Aka|$8PQA?|$h&,w AbAzvfSA|$hE |$@A|$U0|$ 7u|$@|$@vAB8A! _A|$*$!|$hu@A6{$k |$H|$|$8\U ?Ѓy@F 9$Uk!|$`9`!@|$h-1|$@9#… Z 1fVA=f@$(Auw|$@]S|$h[ |$8`Q|$8\fZNA'|$8lS|$x/AyA0A |$`( Ѓ|$`,„r"A e"|$X|$h%D$`WwfDOE<fX2% A=A_!A|$h_&v $KfQ A' A fx|$ƒ$tu|$hNDfK |$H$A#v|$`6 A $_Q|$`5& A) |$ |$8d O|$8O! |$@f0Ap0Z0XA !|$`%0|$@'|$hA,{$)AAA,Q1|$@w fK|$H A%A A H A<$lb|$8|$@'E|$h: $$N|$ A$S> An1 |$ .|$H|$A w |$`9D$H{q|$H A |$x% |$h19AI  |$@ 0 $]|$x)w)|$@X)|$XN|$@ N v|$|$h>|$@@ A|$hsƒ$p|$x/D$h-->A|$he pfTPA>|$@|$hƒ|$XtA|$85 |$@A v$4 n|$@nA!fV!|$H !.|$hHAm6|$X5|$x$g fW i|$hfY-AAlyd 61fOD[|$@ ] A?   A{|$H\fO~AQ |$ B |$|$`2|$x8  v$xxndZ|$`:y |$h$a K |$h = |$@,` |$h|$8p|$8K|$x*w|$`69|$8+TJA^$A4 |$H )  Az|$hX!1|$`9vndZP1'$|$hAl$vfVt|$@|$D|$x=IRH|$`5 |$hN|$XA<A _ fO |$ A fFA7|$P, |$hj|$x_ |$xfJA 3|$H(|$X A G|$@FO a|$@vfW|$(A-awAvlbX|$h#&D|$x)|$@|$x)`|$@w$$$m|$x"|$@ |$XGm|$hVA A| Axnd|$8kRH>|$8H,|$H|$`5v v|$X|$hZ|$h |$8~G$9AA|$hs cYO|$@A.0AhA U|$x41A $;yA1}|$hT A|$h$?$xA>|$HBAA%F|$Hg|$P\|$`;$sAl v|$`;A A |$@h|$M|$@Rw|$PF<  A $ |$h\f_ $VfY|$x|$8%|$@+Ѓ|$x83A -|$8nAl$N  fUAv |$8P)A& |$hD |$hAA|$h |$X|#|$ vfZ$j%A2eAvAMC|$ht|$ \|$@ wb|$H ƒ|$P\$dNݿӿɿ鿿鵿髿$p|$hXAAtA`VARz|$x)$-A$־̾|$`5麾|$h 饾|$ ;$1酾|$@A/|$h|$hƒ$A- Ѓ߽ս˽A魽飽|$ho$鎽鄽A*Ѓqg|$h)$%E|$hsfSi |$XN|$`-|$h|$H~ 餼隼鐼A?@1*ƒ|$Hu|$x-RH|$h3)|$h(5$LJֻ̻|$@麻E 駻靻铻鉻|$@ fY |$h Az Rf`9|$H  r] |$ w |$P}s޺ wDȺ龺鴺骺$Wl $Qw|$hukaW|$@: A8A  |$H/ R ƒ |$`: ٹϹ|$ [^|$8a'A4|$h&闹|$`7|$HDuk|$hd$YfwЃ=E($A~ |$h=w׸|$@|$h鷸 |$hV |$x5a |$`8- |$h F i_AvC|$ jw4|$@b"|$@|$(ݭӭɭ|$H鷭魭飭陭A 酭f^ƒ|$x-t6fY~0fV uAF<2(|$@  $t-Aw$|$}|$@+魬飬陬鏬酬{Aw9|$@w2שͩé鹩|$@ vA閩|$x v8|Avl$WMC9/%ߨը˨鷨魨飨R Ѓ鑨釨}si_|$hC ЃKA7-fY|$hE3$`%|$`9|$RAէ˧鷧魧飧陧鏧酧{q0 ^TJf]V$0vBD$h-t!f\:$1ڦЦA A  wi 鞦$Ww v uwY$uwE v3|$X}"}HB5+!|$@|$H9|$h ƥ|$85wl$0w%|$H闥A Ѓ鄥JA? fY$4wWAwNG|$x'f^N|$x!w|$`:ݤ|$hwQ|$x/wJ¤A 鮤|$@w9T w'$ow1|$HD邤xndZ|$h" wIA<|$h w[|$xvT!|$`0vMAƒ|$`2tAw ףͣãfDSDT$hD\$(\$xAXfEA|$@ <|$0g|$X . [|$p\kfAe&|$Xd0f:|$:$w |$Xw[fD|$`n$|$` |$@n[f|$@|$`|$0Q$][|$0Ys|$` |$HU|$P&$.w T$81[f|$`$V@$c f]$Kz|$p,"|$@ [f. fA_|$0x |$|$ |$X9&$k v|$p6?[Á$/Af- |$` [f|$@$f|$pl |$`w$8!|$X',$5|$`5[f.$[$A$+ $`|$@|$`/"|$1|$@1[$ '|$0A>] |$`y/ih|$0#fF#_$]v L[D$|$8$v|$`[D$$$"|$ $[-=f|$@d|$8$' C|$X6[@$W|$p"Al |$8z$  $[De |$@D$`[-.fV$~R|$@m|$0ifQ#|$@S/$BE/[Ã|$0O|$p* A g|$`1'[D$vA A-M<[D ƒ|$p+?|$p.4[D$l[fDA$ $w/[Á|$Pb[fAtn\$ O $w|$X[DA|$p( |$8#$?[v|$ p[ÐAnY|$` wfAX?[à |$`|$`{$_[f1fA[D@Á[Ã~|$X9fAF$Vv fU[fDA f]~ fAY_$$ &$I3fAG3|$@!2@|$E|$PD|$8[|$`# f^ AfAW# fT[N<|$8[DfT |$`  A |$8#|$X@#v|$` E[fD|$ |$`We|$p0 $v<(A/|$p=A= +B$[A$.~ $g|$8 [AzDD$8EAka|$0rQ|$0p|$X-6$ ,A2$v|$@[A $v|$`[f.$I1|$H[@|$Ec|$0[DD|$X$w|$0s6DT$8E#|$`1w |$p[|$`$_l|$$w |$P[fD  |$0 [fA?h1[Áo|$8 |$ |$`p q&$Mc&[D|$`&ƒ$P:.[[Ã|$p"fc$$X$[-NfD[Ã|$@"[fFR$p[Á$t$$ 8|$X0_! V![Af|$8 |$@ t$R[øA|$8Qt$@|$Xv$i[Ã|$p0 |$0Jh"$_,|$@ [$nA6\|$0z |$`. |$`w |$p3[|$0oC&|$@ v|$`bw[Á$o ƒ|$@t|$@F[AfAA%fW$ w |$p3[@|$X/|$p&B |$@W [fP+|$0j|$@ |$@[Á|$c1A[ËD$8~ $i|$0S+|$`'$ |$p.u$[fD1|$@[Á|$` W |$L $T[Á$A $1ƒP$ ?[Á$[Ã|$X4[$(|$X-$^#U#[Ã|$0U[ÃT$8|$p/3|$ (|$P{!|$`|"-|$P- v$o[$|$W|$0v |$8B[Ã$~ |$`[Á|$`$v fE$[Á fA_f^Ao]#1|$H[|$p2|$X8,  "xv)_..[DA|1|$8{ |$02|$p|$`[Á|$`"A5k|$8 $|$j.fAY.A).[[Á[øfAT$ [fAP |$8Qs@|$@|$8.#A*#2fAHAt E;[f3fAL([Ã|$X) A8|$|$ A9u$![Ã` fANn|$pUA $h |$`[Ã|$0Z fV~|$0N[fA5|$@#[à rfAL:|$8[Ã|$@ fA8  Ѓ|$@o |$8_d [Ã|$X2$k|$p(^|$y![[2O|$`|$@w|$[ÁFAv$[à m|$8L$H1|$@ [DÃ$M~|$@|$p7vfAPa[Ã|$8JA0v$ 3[Á|$|$0 |$X2|$X=|$`0[Á$S |$`;[fRB0 [Ã|$0afZ|$`A!|$X:w.fS2|$ 2|$P[NfD|$p2|$p"<|$`[ø[Á$ [Á  $vAp & [A ([Á|$` [Ã|$0\* |$i %fZ|%|$p4$|$` $[@[%Á -[Ã|$[*$N|$H$  v$5[Á|$0[Ã$q[Ã|$H}f_>[Á A  $ $B V"$* E"[D$[Ã|$p, $M N[Ã|$ f`u DL$HE$wm[Ã]$^j |$PAdv0[Á([D\$@E[Ã|$8$[fV|$8fA@|$X6|$8# #[D[ø[fAb~|$p N[fAZ3 fAX|$@ t [Á|$9 |$X3 h [Ã|$pp1|$[ø[ø[Ã$&[Ã|$p/|$@ 1|$H[Ã|$p? U[Ã|$p( |$85|$@[Ã|$0}w$M [øfAY|$p,+A [Á  Av|$p2[Ã$m $$ v ~[Á$ |$` [fA; /|$`[$[fZ $|$0m$[à fAX|$05|$8|$p3T/|$ |$8„t$ [$m |$P!|$`1"P A,[ |$` [fZy |$8A fAQD&|$8[@|$0Y[Ã|$X:7 |$|$` ~fAJs[fA]$AC[Áwv|$J[Ã|$0m|$8!Ё$„zAp$tK$Y:[Ãn[1fW[Ã|$8[ÁkAA'fAJ(t($|$p&$|$`[fD$BAK |$ R|$@[D <$`H|$X=]~fTt|$@[ø-|$q[Á$ Aƒ|$0OS$B[f[|$0sS[ÁY  $ [Áv|$`[Á$P  |$p[Á$;8|$X5-[Ã$| $ |$@ |$[Ã$G |$X8[Ã|$[1|$[DÃ$^[øA[øAp|$0J$K|$` [AF |$P; [Á#o$w[Ã|$8|$$t|$i[Ã|$0yF$k J} |$x4%|$8 )%[|$H fA_z |$@[Á$ $hA[ЃÃ$MA[Á|$`@$$0[à wfN4[ø[ø[Ã|$p%[Á$v|$p&[ø[Ã|$XD|$8[Á|$` v |$0U[ø[à |$@ |$`7f]|[D$E|$p [Ã$o4A@$i[Ã|$0t [fAXK|$ @t[ø[ø[øh Ax5 |$X;[Ã|$8M # [Á|$`& v |$0&$];$1[D@Á|$`%|$P||$@ [Á$ $,|$84#$[Áyv[Á|$' |$`#[Ã|$8[øTw   [ø'|$X: A%|$p`W[Ã|$@. r[Á=|$@%[Ã|$8[Ã|$@[Ã|$8[fU^ $ [Ã|$8 v|$PMG[Ág [Á$||$@[fU$)|$0Q |$8[Ã|$@ |$p%f],z ,[D$[-aÃ|$w|$8w$&_[fP[NÁ|$`6[Á|$` fAT$U1f\[Ã|$-Q|$`O|$8|$X;DA f\~|$[ø[Á$Zz|$0OA [Ã|$H||$J[à $>[Ã$1[Á|$`w |$8|$` [Aq*![Ã|$0Jf |$|$`[Á~ t$[Á|$` $vƒ|$0ktArK[Á|$`[Ã|$X5E |$`2/7 Ev [Ã|$X9[Á|$`j|$`[ø[Á |$@[ø[Á [|$X< |$`[Ѓ1[Ã|$p9|$`7|$8 $$[Ã|$X9q$7|$,[Ã|$p5[ø[Ã|$p*/|$0i[Á|$`[Ág[ø[Ã|$Pe|$vfAZh[Á|$`c [fAa~Ab-[ø[Á$M [Á+[Ã|$p3I |$0Zx$WafAZV[fM@ $%|$0[ø[fAD |$8&[ø[Ã||$][Ã|$@ w AE[Á$X|$% |$0j;|$`: -[Á|$`2 [Á$v|$p$[Ã|$pF[fA2 |$@-[Ã|$8'uj[Á[fAS&|$`|$X9fALt|$8.[Á$$4[Ã$= [Á$;$^$G|$p|$0=|$A2[Ã|$0@l|$X/}|$[fAD [Ã$QJ |$? A;K |$0W|$p,[Ã|$0R6|$`[Á# [ø[Ã$& |$`[fAP |$8$[ø[Ã$vvF[A% |$8e |$@[Á|$`-0|$`J|$0v/fA[$|$8[Ã$p|$@[ø[Ã$g $A|$8[A   [Á|$`uƒ|$$  [Ã|$8|$0Q~ [Ã|$X= [fAW~][Ã$z[Ã$vV|$X2K|$`}l [Ã|$0|[Ã|$p/ v$ 0[Ã|$X[Á$6 v [ø[ø[ø[Ã$K<$/ |$`n  [ø[A [Ã|$p0v[Ã$[ |$8  [ArP 3= |$@+ $k [fAU~$z[Á$[ |$p3K ($s|$0Pu% [ø[ø[ÁR v$X[Á|$`L$ ;[Á6[Á3[ø[ø[Á c  [Ã|$b|$@W[ø[Á$LPf]|$8AD$P[ø[Ã) [Á$[ÁR [f\$5A-HA7|$X;A%[Á $I[ЃÁu[Ã|$@[ø[ø[Ã|$-A$\[Ã$lA [Á|$`v I[ø[ø[Ã|$@ |$0[AK|$05@[Á$F [ø[AH $c AB[Á|$`[Á|$p1U[fU|$X;|$`|$Xs|$XY|$8@[Á$ fAM $|$X3p|$e[Á$KL $a$A#|$[ø[Ã|$@|$`$4[Ã|$p5 |$0[Á[ø[ø[Á|$`[Ã|$X1|$p5[Ã|$p3[Ã|$X7[Ã|$8H |$p*+ [Á $[Ã|$p+ L|$A[Á|$` |$X/$X[ËD$Pb$[v |$X-[Á|$`|$X5fV8 (|$`[ø[Ã|$X<e fAN[ø[Ã|$`[ O[Ã$S|$`{$P[ø[ø[ø[Á|$`V[ø[Á|$`|$8[Á|$|$X9[ø[ø[Á|$` |$- [Á|$`~ [Á$[Á [1|$p#[ø[ø[Á|$`[ø[ø[ø[ø[Á8|$8[Ã|$X7^ 1$R[DÃ[Ã|$X_[Ã|$8 [ø[fAPM$R[ø[ø[ø[Á [ø[Ã|$p+G [Ã|$0:|$s|$H[Nø[ø[ø[Ã[ø[ø[Á|$`[ø[ø[ø[ø[ø[ø[ø[ø[ø[fAU$[ø[Ã$9MA, $ u$ [ø[ø[1|$@ [ø[1[Dø[ø[ø[Ã|$ $[Ã|$pw|$XbwA"d[Ã|$@ $ $%  [ø[Á$ $$ [ø[ø[Ã|$8w$|$|$[Ã|$p.v[ø[Ã|$p*" f_3|$` x $zw @[Ã$e[ø[ø[ø[ø[ø[ø[ø[ø[Á|$`*M$^?[ø[Á[Á|$`wF|$H|$P!Ѓ|$p#!Ё|$`„  [ø[Ã|$X' |$P  [Á$f |$@ A) $Jo fPe [ø[ø[Ã|$8 $p} |$0[H |$`" $ [ø[Á$[ø[Ã|$P}$E[ø[Ã|$X9ƒ|$p1t$A[Ã$| fX |$0o |$rv[ø[ø[ø[Ã|$  AV |$8 V [Ã|$8 I [ЃËD$`[-&=fAQPA3vJA9+ |$8[ø[Ã|$> $ [ø[ø[A/  |$@ |$07 |$`  |$8w |$@n [ø[Ábvf9[Ã|$p. , fASz $b $[Ã|$8)X|$M$ |$8ƒ|$X7v oj [ø[ø[1fA[[Ã|$8v|$X;w[ø[ø[Á$[ø[ø[Á$[ø[Á [f]>|$X0[Á$$V[Á$L|$>[Á[Ã|$ w?|$8v8[Ã$>OfP$[ø[ø[Á;n|$\|$@#J$[ø[ø[Á[Ã|$8V|$@$|$fA#|$8@u[fA8$;|$H|$Iط[Á[Å[ø[ø[ø[ø[ø[Á|$`[Á|$`[Ã$-jZ|$8H<[Ã|$8Q :`[ø[Á$[ЃÁ|$p |$8$ A7 $5$|$` $4[Ã|$X/w$Z[Á-|$X1i$kX[Ã|$0Z[à |$p+[ø[ø[Á$ |$`[ø[ø[ø[ø[Á[fT$ $ [Á|$`V[Ã|$p&O$7|$00%1 |$8$[ø[ø[Áw0[ø[Á|$` v|$@[Ã|$p+[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á|$`$ vh|$H}0w([Ã|$H|iAFv\|$~E[ø[ø[ø[ø[ø[ø[ø[ø[Á[ø[ø[ø[ø[ø[ø[ø[ø[à [Ã|$0wu|$X#w]fA~O|$X[Ã|$@[ø[ø[ø[ø[ø[ø[ø[ø[Aw[Aø[Á|$8A [ø[ø[Ã|$8>[Á_wcfA$~U|$|0[fS%|$P1|$8[D@ø[ø[Á[ø[Á$#w}r[Ã|$@ [fT9fADƒ|$X:u w[Ã|$p[ø[Ã|$8 w/$tw%[ø[Ã|$8v[ø[ø[ø[ø[ø[Ã|$rvm wa|$~Z|$`[Ã|$pwfA/^[ø[ø[Á|$8w |$8[ø[ø[ø[ø[Ã|$P+|$!Ё|$`„tA%w[ø[ø[ø[ø[ø[ø[ø[1fAL[DÃ|$P}-|$`v#[Ár w$ w[ø[ø[ø[Áw)[ø[ø[ø[ø[f[|$`R [Ã|$p"v!Aw[Ã|$@[Eø[ø[ø[Á[ø[ø[ø[Á|$`[Á$[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[A vCfZ1$2 [ø[ø[ø[ø[à [Ѓø[ø[ø[Ã|$p2w\ [ø[fAYtL|$8v>|$p5w7[ø[ø[Ã|$p-wA?w[ø[ø[ø[ø[ø[ø[Á|$` w![ø[ø[ø[Ãw>|$`)[Á$wl|$`Lw6$[[Ã|$p(va$WwW [Ã|$H||$@v|$0z[ø[fV#|$@w|$X:v[ø[ø[à |$A,$[ЃAF[ø[ø[ø[ø[ø[Ã$-v<t"|$`lv[Á$_[ø[ø[Á$;[Á$[ÃwAw/|$@[Á|$w+|$0gw|$0X[ø[A [A[fDSDT$hD\$(\$xAS|$Xw,|$`o|$8 $[ÐA%$D|$@ i |$`|$ mfN$|$p)A6D$8PӸ ~|$~|$Hg[|$pwyA7|$0yXt$I |$`r`|$p|$@ &|$@[DwkAo8|$`  |$p,G|$0sD|$0M&&|$ &$I[Á|$`$I|$` ^|$8;vl#[Ax|$ C|$` $# g|$`O $Ac %bv$[Ð|$`n$|$+oDD$@E\e K$„t|$`"[fDA+r|$0 |$X1$|$Pd.|$X=Y.|$X7|$0Q6$- [f|$pQ|$`S>|$'A|$P1%(%[Ð|$@|$`Q1W$pA [$|$8'|$0w |$P[ofWDL$HE,A$E[|$`|$p4|$`( $|$AfXJ|$`<D$|$8|$jw[Ð[Ã|$p?lfAP $ T|$@ M$ [$g|$`$3 $"|$`_F|$0T$fAS0fT*>C$=H|$X wJ|$8A[7\$8{$|$`[fAP|$0z |$@ |$X-,f1|$`[Ð|$`<$w|$X3[A]E |$X' ![f|$|$ Ax[@$|$@G [f.fAD[N@|$`\[fD|$0K|$8=A \ |$X;$k fZ c)|$8[DfAF |$0sd I$\A$|$P5:$45A [|$8gfAS[O|$8|$p2[|$@ u$[fA|$8[ffAI!|$`4[u[A5fV|$86$3w$[f$g $$L [@|$0hWT$8*|$0^f]$LV'1|$P[DÐ|$X8|$p2 |$0\A $1j,fWe5|$@ @[@|$8=|$05 |$@ [f.AfA.|$`[f w|$X4|$RR$i!A=1|$`m1[Ð|$X5MAv |$X50[@|$0W%DD$8E |$0L|$X8|$@[f.$]|$X|$`|$[D$.{[fD|$0tUA`[Ð|$86|$0k|$pfAZ'!$3![D[$Q3|$`&$[fTfAHi|$p9^'wAn[f.[$8$W$ADT$H[EN|$`'|$0RfA|vAT[|$@[Ã|$H|$x[øA>b$CO|$p5?Fv fR-[fS |$XB$34|$X;6 :|$` [@|$  ]fAO 0|$0\F,$[D$i fAY|$`(|$`K [ÁTw "[Ã|$8 f]|$0$/ +A+[ø$ [A}[fX$$j|$e($T(|$@ p+ [fD|$ $tv|$`[Ã|$X7|$0e|$`LAE#|$X5P;- -[f|$0K<A $0|$@[Ã|$8|$@ P$/|$p0!Ax+|$0o[fD|$@$ƒ${u[A|$p1Q|$8&D$06*$6*$ v|$ q[D|$8$I& |$p/L|$8u#A4$14$6|$p-6[A| T \w$n[@5[fA>[ÁXd[Ã|$X $$fcW[A|$8[Áa[Ã|$$1[Á$[ø[Ã[Áj [ø[Á$w |$8 [ø5<k*]$%v  ;[DL$8E!|$@|$OR|$p&Uw|$`[Ð$c [A_O$P$@wfAU[Ã|$XvAr|$`t_|$XO$[-Kø[Ã|$q $2$*[Ã|$  $$ #|$`L 8 -|$0-[fDi  fAQ\'|$@&|$`|3|$8q3[f.|$p*H|$8rA$|$@$[Ã|$H|[à |$`$48|$@ [A|$` |$p0|$ %%$Zn7|$@[f$[Ã|$8 $s"$i%[Ã|$p2 |$|$@|$`[Ã|$8fZ|$p2. [Á$|$pL$ |$0F…u|$`h[øSw$l=[Ã>$5ƒ|$06t$R [Ã|$X8$M f_$v|$0[Á$|$0\fZE!R[Ã|$@ fAY|$`|$Z)bvfS[@$$[Ã|$@ 0|$p1@|$XV'$\b1|$@ W1[|$0v|$p. [Á|$`|$8|$]n 1[Á$ $Hm|$@[Á$$=|$p4$?$|$ q1$=1|$p/s8|$D8|$05[fD1|$`[Ã$lx|$||$p-F[Ã|$0Z|$`N"$[QÁ[Ã|$%$[Á_v|$H[øfa E v|$Hs[Ã|$X|$ |$p J[Eu`-[Ã|$p |$` JJ[Á$][A1|$P[Á|$`2|$`L7[ø[f` $[Á [Á$7~[ø[1$[Á$3[ø[Ã|$0^ƒ$Fs[Ã|$X"f\%-rAh[à e|$p/A$h [Ã|$p+V$y /$VAb[Ã|$0J$`#|$`H ]|$@R[Ã$tf$j:'$J '[ø[Ã$&u |$8g1fR[DÁ  1|$P[fS$Q [fAUM fAK|$8&!|$`D&--[fD|$X; \v|$[Ã|$8*$ $_r$|$P.|$@.[|$@r>a. [Ã|$p1[AV1 $[fW,|$`\ p,fR)A([$B+Ai|$j[Á|$[fAYS|$H1|$[D@fA*)|$@|$p9L!}+ *[Ã|$p(%|$@d V#A}L#[Ã$x |$X4ƒ|$0qq$`$s[Áƒ|$Xtv[Ã|$05 |$8|$`w|$`wbV[Á]8$0|$[øfL|$0$u |$@[Á$$T$ "$![Ã$V1 [Á$|$0j|$|$0IfANu$0?-[Ã|$X4yAsf]~$ [Á$[Ã|$8 f`6|$` $[Ã|$PfVIfAE%|$`R%[Á$ $>A&-'y-[$h |$XNc|$0Y$|$`fc$-|$@[ЃD$/fBN$[Ã|$8 fY)|$pW|$X4$($(|$`[øf]|$p&v|$`a[Á"vA[Ã|$0y|$`[Á|$`vA|y[Á$X ( k  |$p/|$`^|$$ Ѓ|$0q„hAz^ #$ [f.[ø|$8[Ã|$8|$X7[øf_[ø[ø[øAm [Ã$gJAV$3/$w |$8[øA|$`0|$`v [A |$`[Ã|$0M#JfA^?v|$@[fA]|$X;Aq$$_|$`&,A$|$X9$[D[ø[Ao |$p%d|$8%_%[Ác !|$p,|$8)$[Á$  |$8$[Ã|$X=~$b!!!|$@![Ã$|$X;yA%_[Á$}A|$@ |$p2|$8)!A 8 -|$8-[A t$l7[Ã|$[ЃÃ|$8 k |$p4$t t6[à |$p%[Ã|$p2 fZ|$`= 4$[Á|$`^4 A |$`[Ã$Jv$ ?[Á|$0)E|$@$|$@[Á|$`@[Ã|$@[Á|$`[Ã|$@[Áv$ [Ã|$P}|$8 $[Ã|$P[f_$y[Á|$[Ãk$3$$/[Ã|$0jx|$p%vA*[fAC. |$[fS|$8[Ã|$X8|$8[Ã|$|$vV [Ã$ N&|$@[Ã|$p3|$@XfAO$o[ø[Á[à  |$0Mo!$ [Á$$H fAN> s|$@#$m_#|$X:v /[A3@[Á$h[fY|$8 |$P $o7!$D$v|$0.[A 1f\[Ã|$8 |$@ [Ã|$X6v fWS [Áƒ$L  [f[C|$`[f_|$P$ [Ã|$0A $o |$0D[As |$X% $}[fAJ $-A |$`''$)l $[-4Ã|$p. $ [Å|$H [Á[Á v|$0k[Á;|$?[Ã$ [ø[A3[Á|$`9 v [Ã|$@vAU[fAT I|$0>G|$@ [EÃ|$X|$p ƒ|$Pt|$X![Á$ |$  |$0?[Ã|$8q> tk[ø[Ã|$PE $S7 AfA\D v|$Pݸ[Ã|$[ AufA][Á$V 7|$0Y1|$P[Á|$`n4|$Pm [$Ã|$0uv |$@G[ø[ø[ø[Ã|$p,fA[$2|$`g Z#$I#[Ã|$X@%$$,$$|$P$[ÁPQ[Á$ [f^< |$HC$2%[Á[Ã$E?|$@[ø[fA\)|$0X$[Á|$`J[Ã|$0@ [Á$vm[Ã|$D} |$` o [à A&$$[-Ã$&P|$  |$X:!q!|$X0vfV[Á$[A $-=wA[Á_|$1|$H[DÃ|$8*| |$p u[Á|$`0x $lA |$`[Ã$Y3 |$X2|$`[f.% $|$|$p[Á|$` $U $[ø[AH |$`[Ã|$8 |$@  $[Á$[Ã$Wv|$8 [Á|$`[Ã|$8 A* [Ã|$0p $G [Á$[Ã$Jv +[A $z|$p3[ø[Á$ [Áv |$@[Á$U[Ã0fAX$4[Á$  |$@ m|$XQANl wf]A[Á\- $ [Á$c$FU$^ P|$0b+|$X/w! [ø[à [Á w|$`[ø[à |$`  [Ã|$8d fS |$Xa|$0[ø[Á|$`R[fb|$ r $[Ã$Le][Á$ 0 |$@ [Á|$`* |$` $b [Á O$>[ø[Ã|$8 ,L [ø[à [ø[Á|$`v|$8[Ã|$0CvA/[ø[Á$5 v|$PU[Á$*$t$e[Ã|$X,<$[A |$0Y[Á[ø[Á1 `X[ø[ø[Á|$`&E. |$X8 [ø[ø[ø[ø[ø[Ã$r[ø[Ã|$0N'|$8[ø[A[Ѓø[ø[ø[ø[f[ |$8 [ø[ø[Ã|$@[Ѓø[ø[Á I @ [ø[ø[ø[ø[ø[ø[Ã$q |$[ø[ø[ø[ø[ø[Ã|$8* |$P~A'1[ø[ø[ø[Ã|$84|$X>N$ =[ø[ø[ø[ø[ø[Ã$ 1|$P5[Á L [Á$[ø[Ã|$P& f^ |$ $vb|$P ~|$[ø[Ã$DA<t\[ø[fAZ $Uo$[Á|$`K[Á|$` [Ã|$@O $A[ø[Ã|$8 $4 1|$P[D@Ã$}  j$U[Ã|$81f\[DÃ|$6 $ƒ|$8t[Á?$ U |$X.J [Á$[ЃÁ$VfA[tA([ø[ø[A[An[ø[Ã5[1|$[Ã|$0W1$U[Ã|$8uf[$ [ø[Á$X |$8[Á$a [ø[Áh[ø[Á|$`|$$[ø[ø[ø[ø[Á[ø[ø[Ã|$@"t|$`[ø[ø[A"[Á$fAY[Nà |$@ [ø[ø[ø[ø[Ã|$8 w$@[ø[ø[ø[Á$[Ã$B[A8|$@[Ã$Q[ø[Á$<3[Ã|$X3h |$` [Á [fb $< AU$5|$Hs|$@a|$HV[ø[Ã|$P[ø[Ã|$0b |$p4$c[Á|$nA*4 AD?  |$@  $ [ø[Ã\ $[ø[Ë$[-=bø[ø[ø[Á[Ã|$0B[ø[Á[ø[ø[Á|$V|$X-K$U |$!A „S AI [Ã|$H[ø[Ãw;$5F$.fAW#[ø[Ã|$/[ø[ø[A:v$v[ø[ø[1|$[D@ø[ø[Ã|$pw0k$S|$` >$||$X.[ø[Ã|$p+|$8 |$@{[ø[Á$:1|$[Dø[ø[ø[ø[ø[Ã|$X/|$`j|$`- [Ávƒ|$X2u|$`+ [ø[ø[ø[Ã|$@| 8[Ã|$8 |$X-u [ø[Á$c[Á$vw(A5 |$p(v|$8[Á*|$0%[Ë$[-)ø[ø[Ã|$8[Ѓø[ø[ø[ø[à $Z[ø[ø[ø[ø[Ã|$[Ã|$0%w!|$p|$8[ø[Ã|$X[ËD$`[- Á t|$`+f[ø[Á|$`|$`,[Á[ø[ø[ø[ø[Ã|$P}1E [Á$ [Á|$`1O $[ø[ø[ø[ø[Ã|$8w$_D$`[- 2ø[Ã|$@[ø[ø[ø[ø[ø[à =[ø[ø[1|$_[Á|$` |$`vfQó[ø[fAN |$8 [Ã$[ø[Á[ø[A1>|$X2A[Ã|$8w)fA\|$p*vfAN[Ã|$ |$p0zw |$@[ø[Á< &fa[Ń|$Pu|$X7[ø[ø[ø[ø[ø[ø[ø[ø[ÁK[Ã|$8v|$`h[Ã$wcf8f2k1|$[ø[Á|$|$p||$X±[Ã|$XTƒ$tA [ø[ø[ø[ø[Ã$+(|$8Fv|$@M[ø[Á$ J|$P?[ø[ø[ø[ø[Ã$R+|$`[Ã|$]m [ø[ø[Ã|$p4wN|$fAZ f^) |$@ fAZu [Á|$` |$@ [Ã|$X5$[|$0V$R|$`[Ã|$~;[Á|$`/[Ã|$p-u$[Ã|$@ [ø[ø[Á|$`r 1|$H[ø[ø[Ã|$8w|$`w[ø[ø[Ã|$Xf[fQ$$6v|$@ [A=w'$[-8ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[f]|$@ $s[fN~|$8U[ø[Á$/w,[fU[ø[ø[ø[ø[ø[ø[Ã|$8:wM|$XP!ÁGAj|$0  |$h_Ð`Ð|$(R|$(z|$(uZ |$`z 2$l|$8@|$Axt |$`"U|$%fA^~|$XG2fDL$0E|$(l|$(jD|$|$! $T0|$`,W|$0v"fAaƒ|$P3u|$(*@1W|$X |$0Ã|$P$_|$Xƒ|$P YTD$Á$` |$(U|$h&! %|$P(%$L1|$`? |$XL |$(KN $1fAED@Ð|$`6|$X-@|$X% v |$hv$DfA^ |$(jm$*Z|$`nNfAZ"uÐ|$` |$tfAN$|$8$$!$1|$8|$8L |$`x |$(G$F|$@!+$ƒ|$H**f.|$(EEfA^ |$4 ($;fAOÐV|$X fDu$^$F D"|$XS|$h $#|$ƒ|$PuT$hÁ$w' $|$8M|$0 f$@|$h5$ $)Ã|$P9f|$(a| $[{=fAW|$h"(v|$0Ð|$ @|$`c|$XP|$(]|$8+|$h,i$ |$X fA`|$(MD$|$h&||$Hj|$(rf|$;$XR|$`KB1Df|$8|$X' |$( $fA\$P|$x26$26|$X% 6f.$@Á|$;Ã|$P4.$.Á$ t$LAv$lÁ$pÁ|$X*|$|$("(.øp|$`\f Ã$||$`/|$(k|$XfA+|$H(/l0fAE::f$ |$`{|$h7|$X J&B&@A  |$P4$Á)$v|$09Á|$(a!$Ã|$( t_|$X>|$(lL%3$|$8 Ã|$޸|$C$o&!|$`|!Á$., |$h! Á |$XP 1|$XÃ|$0|$h1 ƒ|$`*t|$`&Á$G $m |$b|$(W$t$?2f.|$2|$h $à $vxfAb AøÃ|$|$0 ø#|$h/ƒ|$(ov j}$ J|$P8?1|$0Ã$qÃ|$0U$H |$P6Ã|$|$|$8Ã|$`{ DT$xE $Pxv$_øøøÃ|$c |$P2,|$8w|$XyÃ|$(>v|$8 AÃ|$H|$A$vfAKø%8 $Wj$ЃÁ$)|$P:|$Ho|$`Á$Ã|$`>|$X8X AbV|$8 |$h6Ã|$h  |$XÃ$_Fb|$0  ('|$ 9|$ƒ|$P3tDfA]. |$X Ã|$(o |$0 |$([ W KÃ|$P< fAO|$0|$P.y# D$WP|$`F@|$h0t |$XÁ$ G$ Ã|$(J[|$P9W|$h-|$H vw@|$P+ |$P$P1|$HID@Ã$XCfA\}|$01$VfAT|$(;|$8Á|$Xw |$`mm AÃ|$(5|$h3|$X% |$8Ã|$`\|$XTlÃ|$8*vv|$h,qà |$h2 $AÁ |$S |$X v$/Ã$qÃ|$h#Q |$Pv fA[Á$4Á"|$X\vL$0zÃ|$h/y X G|$h-|$$c|$(qX$ $ov @ $6ÅÃ|$`T1$Ã$|$(t| k|$X|$P6qAƒ$t!ʃ|$ ʃ|$(Nu <Á$ øøøÃ|$PÃ|$0$=|$HLÁ|$Xv|$P,Ã|$0Ã|$8 |$0:Ã$&Y |$0C$&Q|$`A4fAR-1fAQD@fD< Ã|$0 fA^|$(2$Ã|$P9ø$Á$$? v |$P6kÁÃ|$P6l|$X1|$8 Ã|$PA$92 fAU|$XD\$xE |$(5Ã|$`|$  |$h $} Á|$X<$ |$`m>$$'$|$XÁ|$( $ r Árj$m$=ƒ|$0 t$øÃ|$(S1|$h+(J|$V $ÐA|$h)|$H|$P+$$f$1Af. An|$8$qu$/|$h,/|$8|$8fA^x$ Á|$|$01fA\DÃ|$`zh$$ I |$XbfAY|$(\|$7 "$"Á$cN|$hø$m|$0|$`fATNfAC|$0øfAFU Ã|$(=9|$@ |$`C|$8 7Á$$|$x: |$X[ÁWøøfA]|$XF Ã|$P84J|$(Q@|$` +1|$XtøËt$$m Ё$u|$h fA` $E   |$(r|$XHKV ?øÃ|$8à |$`UÁ$Ã|$`pO|$h)v -<øÃ|$H |$X%Á$øà DÁ fATOÁ |$`Sv $k n|$h/cÁ$^$@O$8|$X 4$)Á$k|$X $%|$2#$z% v|$Ã|$0*Á Á$BЃÁ$ |$8|$(s!|$[%%$fAJ|$H!t|$(aQfA y%A%$am%$2w!Á $`Á$ |$X AvnÃ|$8vSÃ|$v|$(|$`Ov0Áv|$(5Á Ë$-=ÁuÃ|$h'2 fA_|$8 &!|$0 b)A|$XB)$-=+)|$P*(w(ÁÃ|$P8 $ Ã|$h6$f|$Xl!iÁ$ b$5 $o QfA\FÁ|$X Ã$r|$X |$X]Ã|$h(+|$P.Ã|$P|$h |$8,|$0:+$9Ã$4|$XF8|$Áy|$P5|$(\Ã|$x= fAZ!\fAJÃ$F|$`/Ã|$h3$|$8øøøøÃ$k t øøÃ|$(| |$8)|$s$`vzÃ|$`q|$0$Á$UÃ|$P7"|$(Á$b$ v|$h/Á$^A|$0Ã|$8øÁføÁ$ øøà Ã|$(S Á|$X p|$HeÃ|$P- |$hU|$`8wfAYÃ|$h,3 fAU(|$|]fA^8Ã$j|$HB|$Xw! døøÁs |$H$~Á|$X>$-=!|$8Á$[~ ЃÁ `Á$ÁGÃ|$` |$0 |$0W$Á|$XLc  |$XQ6%L Ã|$(pw $pi v v|$-Á$J $-øÁ$iÃ.|$0fAJ |$8|$a|$xÁÃÃ/ $Ã|$H  |$X|$x "|$8ЃÃ|$8> |$XÃ$\d Mv|$0Ã|$P8Y|$8 Ás - |$ |$`Z Ã|$`Ik|$X_ |$h3|$P0q%|$0`%$Ã|$P+ƒ|$u$øÃ|$0fЃÃ|$(h fA; $ Ã|$`;|$h3|$b |$0  Á$62$`|$8Á.|$h.fAQ}!|$86!|$0ƒ|$P#u|$h+Ã$yC|$0 Ã|$0$z G|$h5|$XiY $kЃøfA\ U | $TÁÁ$UÃ|$0>|$X  |$@AøøÁ$vøÃ|$8ÁQÃ|$0DÁ$0øøøÃ|$H|$(C|$`k3øøøÁ Á$=øÃ$D Ã|$Pv|$Ã$køÃ|$P3|$@]|$X v3fAWA(!GøøøÃ|$xw$T6|$`-"$|$XR$ Á! t|$P7ifA]0 |$8|$XCy|$P6 |$h'$J A øfA?3 |$(> fAT|$%Ã|$h3fAV1 U % 1|$@Ã$4 yøÁ -|$X5øøfAA øøøÁ$tv|$XzøøÃ|$(4 |$(,|$X Ã|$0B|$`MÁ $Ág Ã|$0%|$0vfA\YøÃ|$0|$x- |$hv|$H fA\ $pm|$0$|$h0|$X9O$uøøøÃ|$h2GA |$P:O 4nÃ|$/Ã|$@_|$H TÁCg|$XRøøÃ|$@ MøøÁ|$X5 "øÃ|$8|$(M|$8 $AhfAV~|$8 oÃ|$(H|$h /T$Ã|$8ffAE[|$@}1|$Ã|$`LOÃ|$0 |$P: $}øøøøÃÁ|$X!|$X$+|$h&AÁ #Á|$XoÁ$<v  Ã|$0 $vN øÃ|$` XfAM1|$8Ã6 $  |$XÁP øøÁ$ |$h' pg|$XÁ|$X*=A3øÁ|$Xpn|$P4KfA\]T : øøøÃ|$P3 |$h6 |$Xq |$@ øÁ|$X4 $i  fAV |$8 |$Xv|$@øøÃ|$ ? |$X7øÃ|$0 w$jøÃ|$(vj|$8Y$øøøÃ$Av|$8uøÁ$oD $< $1  $Áe 8 |$0 ' |$h) #Á$|5 |$h-* øøøÃ|$h'|$P0vÃ|$0@U$l |$0Z A  Á|$XLw+fAY |$P)w|$Xj AÁ$ |$X øÃ$hw3A   |$H øøÁ$G |$}|$@mÃ|$$iv$8<Ã|$(+w:fAXOÃ|$P5$G|$h3Ã|$H|$eøøÃ|$h$  ${ øÃ|$@=|$(2|$@ $aÃ|$P6* |$0v A9 Ã|$P8|$x$ øÃ|$H fAT|$0øøÃ$7 $ Á|$X b At$]pÃ|$0|$`:1Á |$X5 øøøfA&|$0Á$ |$Xv|$HfAC|$`}|$0$|$@fA*|$0iÃ$|$8Ã|$(&'V|$(&WE|$0fALn1fALDÁ | øÃ|$|$ƒ|$ fAPøfAZ|$X fA]Á%|$P9$t øøøÁ w1fAVøÃ|$(^%|$X|$(jøøøøøøøÁ|$XÁ|$X |$XnvAfAT|$HOøøøøÃ$.8UÃ|$H .|$`JÃ|$h&|$ fAQ  $lv|$,Ã|$PPj|$8Y$zHÃTC øøøøøøøÁLs afAWVøÁ Ã$Ã$vÃ|$0|$8 Ãf øøøÃ|$0  |$0o |$X#Ã|$`>øÃ|$H|$P9p |$0oI øÃ|$@ƒ|$P:$øÃ|$`w>|$`fABfA|$||$`Ã$wc|$091|$DfA^K|$øfAUl r|$P:øøøøøøA Ã|$h1w øøÃøøøÃ|$P8ƒ|$@t|$`2w øøøøÁÁ|$Xw>|$0w|$h3v^à wN$]w#A Ã|$P1wMPÃ$dw  Ã|$(Vv|$h-A w|$H} ͻøøøÁ|$XЃÁ$=v|$h øøøÁ$ uÁ|$X6|$XøÃ$Nw|$8 ЃøøÃ|$|$h0wMfAM#|$Xnw|$0w øøÁ|$X,w}fAVb(fAFfAD~Á`vnÁÃ|$`5vD$xu øøÁ$v|$xøøøfAI~|$h2Á$ øøøÃ|$(vøøøøøøøøÃ|$VÁ$øøøÁ øøøøøøøøøÃ|$(JøøA|$0/ Ã$møøøøøøÁ$ЃfAW8$w%|$XvøÁøøÁ$K |$0|$(s|$`,fAV~s|$0t[|$h*vNfA[u6 w1Ã|$0$it øøÁ$øÃ|$0 w|$jà A Á w%1|$@D@Á w0|$h.Ã|$XwP: Ã$_|$|$(VfA[< øøÁT$N Ã|$0g1|$Á Ã|$8wK|$h5w&$C v|$X IÃ|$8w&+øÁ|$`y|$PPfA=+Aw|$8øÁ|$XÁwj|$|]|$8tI|$(|w<|$H2 w'|$ ~ Á$w øøø1D@øøøà wa|$Xw@, øfAVU|$fAFu8|$(}w1Ã$tw|$(hvÁ!ЃøøÃ|$8# |$H,|$Ãv|$0Á øøøAw|$Xv øøøÁx ЃøøøÁ$ w&}!øÃ|$}|$(5ø1|$D@øøÁ|$XvfATøøøÃ|$`Fv2|$Xw(Ã|$H}'$.vZw øøøÃ|$0øøÁ$$k|$(xøøÁw-$!v|$8v|$`øÁ$o$wztvÁ|$XTw'$w|$RøøøÃ|$xu|$(øøøøøøøÁxø1fAXøøøøÁ$xw!|$h)vÁ$øÃ|$P9øÁÁ$>v|$0 vfA\WøøÅt fAE$'øøÃ$søøøÁxv=v/|$P:w(øÃw)|$XøøøøÁ|$`,øÃ|$h3w w XÃ|$H|$8Ã$|$(øÃ|$h9øÁ$v,$v|$`=w9֯øøøÃ|$8 Ã|$H|U$KAA f\$6uAA;v DA1?|$h$b fZ$\|$8Tk#|$pVF-|$x 9=A]f|$x!FA\ AZ A2 A4%|$x A;|$hv |$H|$x>|$8i|$8Q|$  |$h&„t |$Xe[fS|$H|$`7 T|$8\|$8f|$8Awy|$(N|$85S |$`6|$HfD|$`8A |$h@,}fAcfQa |$x*v|$HF<|$H Ak Au|$pL|$p2A>>($fYV$ fR |$8y|$8\ ,$;@4 JA U|$8S|$h |$x>$u$K@|$h82fL|$h6:|$`' faV|$hH_|$h:|$8tff\ADfG-*|$Xy9A.D|$h"D|$ /|$x-| |$8}|$h[i|$`6f.|$x2fDfO^ a|$HQV@|$h0+|$pQ|$x.c AfVs|$xE|$8l~fA m AZifAXff|$x%H$`|$)AE$|$hAY A A D|$pz|$`:yA[ l|$x% RfD|$H-|$p)' |$p $b f|$`;fJADEw|$H5 |$x@fL ~k$PLA 8@yAA&Ff]A %|$8O. 6?|$h v|$`:A;|$({|$8"|$xZ]#ANu|$xAwIDfP $j|$`-wA fW A ffL|$8z|$`1@f^|$h[$Xf^|$prv Ayo|$hA$3Y|$x=$$11Df\ |$84|$8Dkw @s|$H|$h#fD|$P |$`6vAcYD$5|$8.fU,|$h|$p`|$p^D|$ v |$x5 A|$H'f+ w |$pl[|$H IDw|$H+$2w f\ ffM &  |$ DD$Eu|$hfD$|$8{A8fI7A&.A@$b?$7W|$pz|$`J|$2-|$hY$-D$H|$`5|$ xo@f^O{v|$XD\RH|$H6#A |$h,|$X ~$A|$h|$`9v A|$8Wf^1|$D|$8+d|$`#R|$`8B|$H 0AX |$8nb!$l2|$8j*A9fD|$ |RM|$H|$(4 AK$`|$H n$[A.&j:ZЃ<AY"j|$h@  |$ C|$h+|$8X4f\\|$x}-|$pK},K>|$hN|$hoq$Z|$H|$8HI#|$pLw|$h*3)D|$8I|$`9|$pq|$X AAR |$p8e|$`9jK ,AOv @. |$pq|$`2|$h ~%AtK|$8F|$x4G|$p[A"$|$hk)AP,$T <AD|$pTF|$hwЃ|$X |$H AA ~|$`60|$8dk|$x.A8 X*A+ ;Ar;,&f|$HAaf+ 9 -f_$r |$`!ƒ|$Ht|$h|$h`xA f|$h wNDAj;fP%$/D$pP|$ (8AD$hAY|$x6Nz bw|$Hy$@f$N$o|$`00|$x0 |$pp|$HAA $8|$x/% $Uwf_A A w|$XoeTfb |$X?|$p{y|$X N"A $ (|$pR0/|$ v|$x)cwndARRA$bG|$(!$i v$IE{|$hfVO|$ |$hz|$`<A["- vff_8 $/UA= |$h |$PM$Av|$8$F'ƒ|$xAB vA |$`/-|$ #|$hL%0|$h;|$Hv|$h vl|$hLwAKA0|$hg'$[ |$h: h A 'fSv |$8d |$p-fYA 8|$hMfA 7&$O|$p,A,!|$x-`|$p##An0|$x 03|$x5  |$`8C*$cE?|$h} A|$`7|$X< |$x+1 ww|$H |$8$j |$H |$hL* $|cAP $H|$8I9  $2B|$x07f vAr Az/|$8A$|$`@ |$h *A,fVR|$}uk|$x4w|$`=TJ 7&|$HL |$H Av|$8k|$x$|$}AK|$8o x|$h %"A {w|$h xnf.|$ V $r|$p |$H0AZ!$wAA< A.1|$XAfJ~|$`|$hu|$hr |$X„t QG4|$ A |$X}|$8~ |$`#r|$ %-A"&A&}A wcYOA@|$Hu|$hC+!nA $D|$Hƒ|$hu|$pA |$x!)|$H)A){fN f;|$Xr,)FA v|$ * |$|$8w|$hvA  A|$X 5"A(D$ -FЃfAuDD$xEfcu UKf]<|$pA,1O F cWAe A$ƒ|$H|$`5fJ$Z|$`f$l !A8A)1fL|$H A|$'|$<$$m.$fD  - |$P$|$hDv|$p(ND|$H 2|$`:w|$h |$phn $n$ #f8|$HD|$x-s |$h |$h,S'AYI|$P |$8 |$H|$`; |$8AS1D[ |$p:|$h A x$9tfUO|$`BDMv|$hb:0|$ At|$8P1f<|$8(|$xD(A -|$p1A|$X&Ax|$ Aj|$(ZA  |$hl8|$h |$`89| - |$h  OA\mmv|$XAH |$ hV|$8SvfMw|$`<g|$P&Av<|$`  |$8s #A ff[$ L$P1$j|$h 7g$T|$pAAfe|$ A |$~4|$8vA!"  Av$[|$xA|$`7|$x%|$pHt|$ F|$pQw$8OE1'$J |$`:A@/4A/|$hA|$p-t|$8`gv fY|r|$ `V|$8z6|$h~6A)|$h9E!.v|$81|$|$h0'|$hLAB$ $Uum|$ 9 |$(|$h  |$`3O $4)|$H|$hE|$ j|$`. |$p9$ AA;DA|$x4ƒ|$I xoA|$P|$hQ%Ag%31fWA $tAAeA9 A |$X'N|$Ht|$Hjj|$h0,U*|$8Wk $||$x*ARA$x|$HJ|$hJ!v|$p)|$pF{|$h|$p:E|$h7m|$p,T|$hFJ$35Am$n|$h*{AM v ЃA |$ |$hD|$`=A|$pH|$pfX $K|AbA?|$ B"#$%|$H |$x4|$ |$HZ|$h0# |$x-:Avf]~taA |$h d6|$h!$q f`A2 |$`8) z)A w|$hf[A Auk$t mW A 1|$8i|$h  A|$X^+AQ+E $a:A AR {f_LeR|$h =[|$8t$wAK|$XO|$P 1|$XD|$`P AC |$X $kDoe|$X |$h%E/ 4 $& !# _ $Q0 |$HvAADʃ|$Xu$gj- $ m1|$XW$h |$H!|$~ )|$x2 |$P|$`9'A|$H AfLw|$p+$ |$x7 A ArA1D@WM|$ l #f\A A$*|$X|$h |$8 A =$m &AV&|$8Rx vAaW|$hKw <2|$x2 |$8RЃ   D$H!|$8Vwf[&r |$H|$ptAyvrh|$H VA ,|$X~4*|$`7H$Pm|$h}A|$p(uA "|$h!A!A $zB A [ fViA v })A|$XA[|$81|$h%fR A$| AZ A  A $r|$hjA\ AAhA5A( v $Y|$H <|$"|$ho|$ V |$h8A uiO|$hvf[6, fU|$PA A  |$`,|$)|$hs|$h] ANr|$ V |$8KAN  <aWDAX[|$xP%Ad? |$x34 |$ps?? $m1 |$x/B/A"u|$h `VvA?5+A\IЃAeA,  |$hv A$2 |$h&  1f_D@W$IG 6,"i4׿f]|$8QA鮿|$h陿鏿酿rAB^TJ|$p"UA|$hfNOfW[-u|$h|$ vAʾ|$8[fV|$hB$UA{qr O"RHZ|$X [|$PFA <|$89|$ ,A\|$Hʽ鶽|$8y|$`BN$>2A~|$h |$8P|$H SIA)A+A  $vw1f\D߼ռA m|$8M7 骼頼閼錼|$x0 $xЃm|$p-|$8<|A Q|$ AK1D@$|$h|$`: |$  |$ +$t|$Hf^鴻AB|$8|$H  |$h6mc|$HA GAky|$hA  eЃAA A ҺȺ龺鴺骺|$|$pT銺|$`4x|$Hv|$8^TAX @6A2 A  ٹ|$hĹ麹|$pJ |$(v鍹郹|$hndZPF |$ Lv|$h |$x/n|$8ef[|$8U_ N$Ƹ|$x1|$(c|$8atAX鋸A|$`0oe|$ m$|$x#|$8+$Hf\u|$`̷ַ·鸷鮷餷3s酷B v|$ De|$hw9A $A=v,"$X|$h|$hAY 鿶AnЃ鬶颶阶鎶鄶$oe[|$HDI |$X_|$x)Al|$l ϵŵ黵鱵駵靵|$(wD 郵y f\R|$x5V|$XAJ (A  |$H۴fZ AMv|$h髴f\@A fN |$P A- oe$ DA S$t|$8r |$x f<ڳгƳ鼳鲳Aw鎳鄳$`|$`6w^TJ@61$y |$h|$x"  |$h |$h 鱲f]eAQ$z A{qg]SI|$h/4[$C|$x+(ܱұAw%v|$h 駱`锱Aw1f]D@yo|$hIZPF<,|$pw!@ vA 9ݰA ̰°AR |$pc 鑰$~ fU oeAATJZ |$8L|$h tA|$hJѯǯ齯鳯驯韯A<C|$`郯$&|$x.Az3 A|$hut|$x*7-f2 D$H|$hZ AY$)$7fZA|鮮餮|$hwo|$xA ~Awv|$Pa $|$`4 5+AA|$x&A |$h٭A  鶭AR $ A |$x   n~ RA$Sp 'A  |$Hy |$h|$ A |$`鵬|$p>v A$ T 銬逬vlL |$h ! AA7-|$D|$`./|$`@AXA-|$P}'ʫ鶫鬫A $zAw v|$H{qg]|$H $t 1fYD@2fS/ |$p<A d |$ [4  AЃA'w5 v-ǪY鷪餪險vA~tj`|$H wa|$`9G=3|$p,wGAf+~|$H|$(|$`;鼩鲩|$`*v!|$|Av|$`7t銩逩vlbX E;Aw$. AvfXW|$}A/Ũ黨Af|$ht |$H/鍨部yoe[QG=|$HЃ,"|$X|NfO-|$x2vw|$h1 w|$ ~ͧç鹧鯧w]|$hw?A鉧hvArh^AJ7-|$`4w8|$x,w1W AڦЦAvAb鶦鬦颦阦鎦鄦z|$8rƒ$rtAwPF<2( AwV|$8w=AKv-Awf%~ѥǥ齥鳥|$H顥闥鍥|$x4t%hv$OkaWMC1fXD@1'A |$ t|$hݤӤ>齤|$hv阤1fQD醤A vZA wTA c|$XBOLB8|$h #ޣԣʣAc$|$p)Aq|$H 酣{qg]SI$4* |$xR|$`A|$xע͢|$`0v~1fZD@鴢|$X}!vA 錢|m|$8QwV|$ $wEEw3|$hw)]$GH>4*A w6|$8'|$x w_|$}-1|$9Dԡ|$8'vE.齡鳡驡|$`+w$Z钡鈡~$%fIAANE;1|$8Y2  ڠР|$ 龠鴠骠頠閠錠邠xnA;Z|$hMEA4Av(~Aw fTuwן͟|$8Wv=$lw3$Ѓ騟$tw|$h7鉟uAv|$`0\Rf!$1<2(f)x|$`wgtQ|$pwJ$5w"AtAFȞ龞鴞骞$v|$H鎞鄞ATUSD$DT$xDd$8A+$$AWwB$|$P|$Hk[]A\$ |$P L`|$h 0 9[|$H$p|$@&#|$p"v$sifD|$h2|$pM9|$p~A A|$p|$h%|$h#|$@v$RD|$p w^$4Ag A Kb|$Pw "OEf|$p)f`c |$P|$@IA,tf\f|$p$$$v |$(j`D >|$pJw (JfP|$(-A/H |$H<|$@6zA2'$ v|$h8D|$@$A |$@TfWzA.|$P '|$@)PBA"^&,|$H*8AK8|$HkQ$SQ|$p;Q%Q0fA|$@< fAS$5|$pf.|$@|$@ |$@P A,I$"*fAW1|$pKAKA>|$H|$h8 |$p;A8fZ|$ % fl|$`^f]zKr |$P Lf|$P1fDA1A"@fA\|$p w|$0fAzA3Az{ $A1_KV$~ N]v`PF$fS/ |$@|$h1!/)D$ L |$h.G$6A9s |$ h f|$@} $+G|$p*r#|$H 9|$h;v|$0 bA)$@fDA9$vfAUN_w$mD:$Tb 1|$P D |$@|$(fTj|$X |$@R|$ \ )$(|$H4@|$Hi|$p OM|$@gG-'@|$(Av` fAb|$P|$h w v|$@sfD1f`]|$PR5S$ vwoeUKI|$Hw|$h5( |$Hv o|$p7[1fwf^ |$h&|$P $/M/|$p?/{U|$pJ|$p |$@K_$|$h9@/t@8J Ё888@|$pV$zDb v|$p|$h96 XV|$H(A%|$@IifD|$h5S t tB8*AA|$PwA|$@Wf^$ .|$@j2-'|$@wf\ *fHsMA|$( $ |$p |$01|$ fAUfT|$P!9!1|$ D@A gw|$HeA2|$PA!$%A/ Se JU$"fSA/|$pfD|$@g|$H |$p A/|$h,$n$X |$hB$w |$`|$($R|$@|$Pw|$h4DD$PEA m1fA@|$( i|$H$H|$p5A  $E|$h: 1D$Dz|$p"g$ v CND:$*|$( |$H AL|$p|$H fAV2 5|$H $f A6+|$PCA/2A3--@D +| $ AH//(2A/ |$h-|$@r|$@` ~AiYA0ƒ\+|$@\+'@N ]|$(|$({|$po|$( ,S'A%|$`_|$`ƒ|$Pt$ bXNf_8|$H fUX|$@p%yAVV|$p |$($vAv|$@t4 A3Z% E Pv|$@`|$(MO :|$@ m A<fAW)$1v|$pvf$t |$ "$b|$0|$p  |$p|$0"!19A9|$h8f>|$p1v f|$p]'A,5|$h|$`|$P$[$v Ioef$|$P@1|$H$.|$Pj AY |$H01fAof_j|$p5b|$h'A-"*DwA#|$h;p$Z|$HQ V A|$p$$9)PvfV|$pi|$p'$A8A } A-|$pv[A.F $/AIA+?"1|$` |$h+c `&|$p/A5 |$plk|$@:/|$h7N1$->=|$gfAN I%A%$5 A{|$HA/"O!$!$5$|$h3 Wl*n$z|$P$Z>J3 A'I $w|$h2|$@v} |$H3|$ "|$p C|$hAЃ$M |$@kJA4 A |$  $( tgrAЃXA |$ K|$  |$pk$ f3]3AA WfA`L $fYmЃ$.G |$hBЃzA\b |$XR$M\:$ |$Pq$v|$HW $`D$-X=Vl|$pЃ|$P}|$@a!|$p ]J|$`p!Ё „ |$h: fAT\ |$ |$(|$H|$p $7E|$ D"Aea ryA*. Ѓ|$h3/|$@9$f]XEA1|$H&$5|$(c$0i |$H 1|$`j '|$@e$|$p  $Q|$@R3$|$HT 1v+$|$HЃ|$p2r |$p fMfI)L]|$XR+!fAa} AufA\ |$p/ fZA5/'A/'|$h<z.fAO~fW*fTg A$C|$PfAL#|$pg $6|$`$|$@l\ P|$H b|$` |$HfZY |$p zJAw |$`l|$H!p!g! A0r |$ Av|$H|$(%|$P$|$pJ A}$9$_$$$AT$0$|$`$*|$P&b|$H4|$pQ!1|$HD$UA ) AO Ca |$Pm|$pXA,1fA]8|$PvAH"N |$p$ *A*$ K%|$p3% v|$@o$  An|$HuЃTA:fAT|$p |$P|$H $A A) |$P$`vz $|$p( |$`$fA\F<$mrA/!ЃI un|$h< At  $:$ rw|$pZP. ^$ M, |$`$ ƒqm,|$p}_,$ 3 $ :] |$p|$(+ЃA5e r|$pV|$`f^|$h7'fZ\#|$(#l"|$@V"|$P$ A2A|$@GVA1LEufA;Av|$0|$@M]|$pK$Q v$SOE;1'|$@D$@s:|$p',|$H |$H$l}$rh^+|$P v|$H ;1' E $RH |$`: $jwA g|$ R|$@|$H|$ 1'$F|$@7|$P|$pp |$`[|$H  |$p |$@WAb $-' *h|$@; W $?,f]|$pfAX|$h)ЃsvA#A2 |$pd A%$ |$pnfV`$Jmc(v |$0HA4|$@5|$Hzf^ fAY~|$HA@A wAfS |$PY|$p\|$(lbXN|$P|$`N/%AW|$ $T|$HAe Ap |$Pv$woH |$h8QGA* |$H $V oKj##|$H ƒ|$` $xA|h $ W|$H%IfZ,AA(AfY , (A3t#v|$([|$h2|$p A4ndZ9GA8G/;)|$P%|$` |$P |$Pam O|$`||$p,&tjfAQWA &|$ U 7-n A%O$ЃA9Ѓ|$@? $$O |$H v|rh^T: |$p 3 |$0wP|$(v$eiA w|$p}si_|$@hD$p-t=G9/%$m W|$`B$2ƒGt${q|$h27 SI?AQpQ' $mwD|$h.@fU,AU $43A )[JH>|$@'"$w AwP /|$p4wIf6fA\v|$@M|$h7 8  $ A9Q $F-|$p(|$@x    |$P  t w|$@@|$@6WfA\ A4~$O|$p.B|$  $ vA!|$pb |$P  |$H |$@v : w$\Ŀ麿$ fAL 闿|$pv|rh^$F<2|$@M $v|$(  $߾վ˾鷾魾飾陾鏾|$h9wd|$(g]SI$ A{$ActIv|$p if[JfAT5"|$@:1|$ 鐽A<f0bf&b A&N |$HQ(A F|$@[1|$P Y $ A|$@\_|$(%鑼釼}|$p% y\fAFy$ ^0 -W |$pR A( $ |$p鷻魻CAЃ锻1|$`(~A.|$h6 fR|$h8J|$H0~,$N ٺ|$X| ĺ麺fAMI霺钺|$p+}si_UKA2 $F )|$p~|$PvAݹӹɹ鹹鯹霹鉹ukaAL D1'$|$H+.A-fA[ɸK$騸|$@O$ Ё|$pa#=$,e|$p3f|$X[B8.$|$h>w}|$@t$|$pҷȷ龷|$P鬷陷醷|$Pw*$g|$h?U*v9|$Hv(|$(w2( AwfA[twM1Ķ麶f\~ffA]uG|$pf w=鋶2w!$vlbXNDv$) |$h'w@$صεĵ|$p<q 頵閵錵yoe|$pw"$/C9/% 1|$`D@ ޴Դʴ|$H鸴鮴餴隴|$Hw+w&鄴w6|$@hwlh^|$pCI?5+! |$H|$@7w|$Hwϳų黳|$Pv)R餳fAV|$P鋳遳ANdZPF<2$$wHA w'$8 vfAWֲw'[黲鱲駲靲AA|$0A$vs|$pP wM|$@0w"$IYO|$ ƒ|$Hu6A'w0+|$h2w)|$p $-ٱ|$HwDA"v4w"|$ |颱阱鎱2~t<wIAw"/w|$pcNDvA(-#|$H pw!A?w%wA/wް԰ʰ鶰鬰颰阰$= wHfAT7lw2ukaWMC|$p .$|$h|$H<|$HDA|$H=ЯƯ鼯v;?w61|$P D@霯w2$w|$P uyoe$sPFfA~8|$h-#Av 1|$ $$uB|$HwĮ麮$%wfAP~霮钮鈮~tj`VLBA0ƒ|$(t|$Hw fL)$A1|$H0wFͭí鹭鯭饭雭鑭釭|$prh|$h-w$W NA =A d[  ] n|$p`۬f^ A|$H wC|$Hv2馬|$p鑬釬} |$(f] }|$H$@0S |$p wH w |$h4vA&$|$Hҫȫ|$@dwS|$HwB$w"|$pw鋫Z xn$4 wA2RH>}|$P' $ ABf[ %֪̪A+Au!$u w飪陪鏪酪{ n|$pwmA2v]$h F<2|$pw1|$`D@ |$@p$ ѩǩ齩鳩驩韩镩鋩適w|$He@wR$1w04C91|$ #w%A&v|$p8ۨ1|$` ŨA=$馨霨部y W|$@gfAWAwk|$h>wTA1w1f\D@2( w |$HvfU )|$h:wD$ʧ w_|$pIvKf\1$w$雧w$遧wmcUЃT|$@| |$P   |$(1 DA-wP w;|$pv'$ v|$ ڦЦc $N M$ A-% |$H  |$ a$TJ@VA B |$H/|$H2|$hm|$ }.f?|$Hw̥¥鸥|$ |:|$Hdw!|$HBv|$h鉥|$Howm1fA>D@ZP|$ d+|$h^7|$Pu|$hI|$Hפͤä鹤Jwi1f=頤$鈤~t|$(v6|$pw"$H>4*$w%Q v |$`|$Hʣ|$p3$|$pb|$@x鎣s  o|$H w2|$HƒTu$ @6 |$H !Ѓ|$ „t $t w~A7wx~' آ΢|$h8t+|$ ƒ|$Hu $G w0霢w($t逢vlb$v9fAI(>|$p) w" vfAU|$psw= Ρġ1|$ D@鱡ff.SDT$h\$(D\$xAXwg|$XT|$`o|$`(x$[f|$@K$|$0^$Y|$p+}$wD$Eb&|$p11|$X([$A|$@fAW|$p6Y |$8 [fDA|$@ |$0gfAYm $|$89F|$@-|$0'[ fAW|$H}|$`d[Ð G$t|$05=|$8|$ !|$8w[Á|$`hAx|$p" |$0$p$[A|$0]3$8* |$p5gAb:|$0"4*+fX4|$0`4E|$8 [[Ð$ _A$f?|$@-fL-Ak3|$H`3[f.|$@ }c|$ 1$[$o|$VAZ |$`L|$@  $|$8%fI(fADw [$j$S4$ |$`~$mfA[#$ #Av$O8[D|$8vt$p[Ð|$09|$`|$8w [@|$8n|$@[fDfPV$ ${T+|$p5z(|$@ 8|$X?2$ [D|$@u|$0[|$`\[fDA [f.|$` A(|$p$|h[ $< |$p1v|$PZ[$ |$0UUf]I$K))|$@[|$`w [f$Q |$p*N|$#A0*1[fDf\v $@|$`[f[f|$p"|$@|$p@w f~[D|$X|$` |$@A||$8-)fa1|$`B$ƒ|$A$2A[@|$X4|$0m[fD|$0Zv|$`L"[$vZ |$p&? $k!5$/|$0i_:V: C:|$8:[@fAT |$` D $msA |$` [Ѓ;& $ t v fA^ [|$0g|$-|$p1|$X:@$h-|$8-[Ð|$`|$p([fD|$`8|$c|$@yAE[f$|)Tu$g|$Pj|$8|$[fD|$8fI# $W|$@% Ѓ|$X;„8:,$w=u[f|$0U|$`fXAD!|$0M/|$82;|$p6K0|$8J>$[f|$`$q |$X6 |$8*|$p/Y2fA]=|$8=$ C|$X,CfY@@[fZ~[fD|$0i4$lU|$`/T$8 w |$p6[f|$p$|$X8.|$`Aw[f$nG|$p0fA\+$Guv$J_[@|$@v?[@$H8$6d'|$X8Tv |$04[D|$@[A{(D$E[Ã|$p*F |$@|$p#  ,|$X],[@EL |$`N1|$@ [1|$@[DÁ$. $v|$`0 &[fAH|$0X|$`[A |$X-|$8[Á|$`'U|$P |$X9[Ã|$0ZO"$2A&I!|$0K[A6 f\'|$`v |$X/[Ã|$0EfAF 8 |$` [øfL`|$P/ |$ $7v|$P*[A%y fAT&$:|$0K-.$9|3|$X:8|$@.vfAO[øA$ [Ã|$l$S V [fA\3|$0v$[$ #$ [|$`[Ã$j} . v|$`Q[Á$?fAW5!|$V*![Á$9 fAZ. <1A[Á$|$X8fMw#|$X4[@|$PV [A |$`$fF~[Á-vfAY[Ã$G $Uw|$^[A + |$`w$v0[1|$@[D@Ã|$p |$07$[Ã|$X9 Aqv f^[ø[Ã|$0I [Á$ z[fO $|M|$P =$y![Ã|$0yk Az9|$p/ 2,$i ,$l, [$S $t|$P>+$L&|$`V}&[fA\T |$p7Q|$PA|$8 #[Á$xwAp[Á$e P$b|$X9[Ã|$X4 fH[Á ƒ|$p/ $ $vh[fYa |$H[NÃ|$@ fE"|$P"[f\/ |$8!f\![ÁT|$0_$A?u[Ã|$p1IfU$$|$8 #|$[/|$&|$`" &[AO |$P%|$)|$8 )[f$K |$fQ"$%[fD$\|$8[Ã$ $U$|$@'%|$pG)fD)fA)+:|$82x8fA$Y8AH8|$f38$[fD [Ã|$X4< "|$p$#$ [Ã|$8*F $XHA[fA[G |$!|$@||$`#w$[|$8: $[A[Ã|$p.[ $kx|$` %$F%$&|$"&[|$@|$X;[fW|$0m|$8)A$ |$X& |$0(1[D@f.|$@$ 3[Ã|$@6 |$0C+ A:{$N$u|$`2QS[A & |$X6U |$`fA[A [Ã$z[Á|$0v|$@[à $[Á|$`&[fA_ |$0If^t$@|[Á$Hw|$X:X[Á$ [Ã|$0 |$8[ø $[Á5  $2N|$0/AC(|$@8([D|$8u|$p*[Á$z[ø[ø[ø[Ã|$8$ fAU 6*$# [Ѓø[Ã$JI=[Á|$` +[Á|$`>*ƒ|$X9)$[Á [Ã$^ $XD$q[Ã$6 |$Y|$X4%1|$[DÃ$G$|$8w ![à A $Q[Ã|$  $ |$X:8ƒ|$X82"|$@ '"[A%  |$0J$2&[Ã|$8[Ã|$0~ z[f]k |$`g$L [AfAYA|$8&$ww3g3|$@ \3|$A3A 03$E3[|$`x & $ 1 [à  |$|$0 "$0 "[Ã+$9$[Á wD$E[Á vfAU[Á|$` $[ÁRfW$u [Ã|$0j1$i[Ã|$8pw |$X![ø[øAi|$0]f^$][Á$S w |$p([ËL$8a 1fA\[Ã$9[Á$AAOp1|$8[DÁb [Á$;[A& |$0:[Ã|$p+$Q[Ãv|$p2[Á%` $AJ [øfVD|$p3 |$0zfAU $AA[Ã|$8v|$X6[fA^|$P[NÁ|$`_[Ã|$8 [1|$8[øfA\vwf_[Á  |$8|$-C|$03[ffAU |$p4fA]A&|$`w fA[[[Á [Ã|$0f+ x e|$0U[Á$}7 |$@ [fC|$@w|$` .[Ã|$0 |$`I$8[øA%fE|$`>3 fA[$[Ár[A q  |$8K |$O!|$`"A![Á|$`#[AF [Ã|$@ |$8O[Ã$W $v|$p+[Ã|$ $g|$X3|$0pD$`[- =ø[Á$j [Á|$`t] |$pfA?y[fD1|$8[Á$[[Á$f $lX AtA~!$ m![Ë$[Iø[Ã|$0P $|$p6 [ø[Ã$Gl |$0+AJ |$0&s |$8K$1|$[fC~|$X9[Á|$[Ã$yv$h[Á$=)fA\[Ã$bAQ|$`z|$`Jb&$[Á|$8[Ã|$H |$p5Q$ [Ág!$[Ã$v[Ã|$@|$@$ |$X>[ЃÁ.[Ã|$8 [A |$ [Á)p $b [Ã|$X $6|$8[Ë$[-Ã|$0p |$P$ Ё$ &$f [Á$k w |$8|$@/#fA\ [Ã$ov[Ã|$0]A|$8e|$X4SJ[Á [fS[NAC ɸ[NÃ|$H1|$p*[A|$`[ADwAA[Ã|$XXj 1A[DÁ|$`\A[Ã$5 [Á$[Ã|$0a|$` $\}[Á [Á$8|$8 A8Qf[G[Á$  fL}|$@f$jX[fW|$`7u$ [Á|$2$ v|$`/[Á$EA L$f[Ã|$p,w Y[Á[Á|$`[à [ЃÃ|$]/ $4  fA]  vfA^[Ã$H[Á|$`1$ $"|$p2[Ã|$8 [Á$r$ [Ã|$0L&$JX|$8EM[Á|$`D [Ã[A |$p&$^$[Ã|$-  [ÁM A C [Ã|$X` |$`| [ø[1|$[fAV|$p2f@V$[Á|$` # [Ãv[Á|$` [Á[ø[Ã|$8…t [Á$&[Á[ø[Á [b1|$@ [Á|$`|$@ $al$Y`V v|$8[Ãv$[Á  [ø[fA`w |$P` [A)*|$ Ci$[ø[Á$K ? [AfA[|$|$8 w fO[Ã|$0t|$pz|$Xo[Ã|$X/ $6 5$ƒ|$8 $[ø[Á|$8nD A fF[Ã|$ A[Ã|$ L|$p&A,|$` [ø[Ã|$p#|$8 |$p!$Z [à c fAX$t$b[Áu|$p/c|$P:f '[Ár[[Ã|$P][Áf[Á [Ã|$  A< [Á[fY|$@[Ã|$0l[Ã|$p% [Ã|$jv0[Ã$ A'*|$[Á[$[Ã|$0c|$@[Á|$[fO |$X> |$8 D 38 [ø[ø[fA\C fX |$0V [Ã|$@>A[Á|$`F o[Á|$`w[Ãj|$0& A;fAG[NÃ|$-fA]A[[Á$ [à [ø[Á v|$[à [ÁvA [Ã$C[ø[Á$@[Á|$`vA@[Á|$`[Ã|$@.[ø[Ã$ |$XP[Á$u fY6 |$@ fA]4$  [Á$s[ЃÃ|$P A [ø[fAYƒ|$fu|$@ [ø[ø[Ã|$0jS |$p [ø[ø[ø[ø[ø[A[ø[ø[Ã|$8|$AGA$[-. Ã|$8IJ$p5|$`7'[ø[Ã|$$/$v|$@ [f[$A[ø[Á$ [ø[ø[Á|$`[Ѓø[à ( |$`4 $fAZ|$X:[Á$g[ø[Á[ø[ø[ø[Á([à |$ |$8 [ø[ø[Á$2 A|$@xKl[ø[f_$T[ø[ø[ø[ø[ø[ø[ø[Ã|$0([ÁD[ø[ø[ø[ø[ø[Ár $)|$,|$ |$p+|$00|$08AwH[Ã$Y[à |$`? A>M|$` [fAaW|$ |$X5|$p1$ |$`[Ã|$0o Y  |$X8[ø[ø[Á[ø[ø[ø[Ã|$@ [Á|$` A[Á[Ã|$X0 |$8[Ãt AI[ø[ø[ø[ø[ø[A;J fS $w|$`A[ø[Ã$tR |$[KfT:u[Mø[Á |$@ [ø[ø[ø[ø[ø[ø[ø[Á$n C[Ã|$[ø[ø[Á$|$`[ÁJ $c[Á|$`[ø[Ã||$X [ø[ø[ø[ø[ø[ø[Ã$[ø[ø[Ã|$p!|$`[ø[Ã|$8xo|$8|$[Nà [ø[Á|$0$ktAj[ø[A|$`|$8vA ݾ[ø[ø[ø[Áv|$p)[ø[Á[ø[ø[ø[Á$?|$@$GfLA3|$`w$[ø[ø[Ã|$@t|$y[Ã|$$- S$qE$q] J$ 9[ø[ø[A$|$p |$X[Ã$|w@ ƒ|$p&[ø[ø[Á[ø[ø[ø[fALw|$X:\AKfAJ@[Ã|$0b$ [ø[Ã|$ fAV[ø[ø[ø[ø[ø[ø[Ã|$P Z1|$P[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á$ w|$`iv[ø[ø[ø[Á-  A [Áv |[ø[ø[ø[ø[ø[ÁL H |$X)6 [ø[Á|$`Vv|$[Ã$[w'$w|$`IǺ[Á$[A/r AS |$8 [ø[Á[ø[Á|$`/4$Q. |$ |$X+w|$0-,[Ã|$s |$8[Ã[Ã$Ow˹[ø[Á|$` #A [ø[ø[ø[ø[A w [ø[ø[Ã|$@J|$H5$$[fN|$@ |$8[ø[fR$[ø[AR|$|$07$2;$5#A|$`[ø[ø[ø[ø[ø[ø[A|$`$[1|$p[ø[ø[ø[ø[ø[Ã|$0@[Á f`|$`ƒ$qv$ e[ø[Á[ø[Ã$A$[ø[Á[ø[ø[ø[Ã$fwG$  $K |$H |$[Á|$`|$`| [Áw[ø[ø[Ã|$f$N|$8zA?[Á|$`WALM|$@vA$[ø[ø[ø[ø[ø[Ã|$p<[Á A xfA[|$8[A- [ø[Ã|$p%$[fA[|$8 |$p0t$[Ã|$0%fU|$H$w[A |$p5|$@|$0}[ø[ø[Á|$`[Ãw3 $vfX[ø[Ã|$p+wA|$X8w* [à wT[Á[Á|$`w}[Á|$` wR|$p5w=|$8 [ЃÁ|$`L[Ãw4 w%[Ã|$0k[Ѓø[ø[Á|$w;|$`w1[Á$u[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$8v_wW[ø[A w)$w|$@u[ø[ø[ø[1fAZ[ø[Ã|$8)[Á|$`vfAZt[ø[ø[f[A=ƒ|$X1th|$`v^[ø[ø[Ã|$p[Ã$9$vB$&w|$` [ø[Ã|$8vq$][ø[ø[Ã|$8v)|$P u $w[ø[ø[Á [ø[ø[Á$ v|$p36[ø[ø[ø[ø[ø[ø[ø[ø[Ã$Vw [ø[1|$X7[DÃ$xwHw#f[|$8[ø[ø[Ã|$@ vA {[ø[ø[ø[Á$[ø[Ã|$ [Ã[ø[ø[ø[ø[ø[ø[ø[ÁY [Ѓø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Ãv$> [ø[ø[ø[ø[ø[Ã$U[Á$[Á[ø[ø[ø[Ã[ø[ø[ø[Á|$` |$` [ø[ø[ø[Ã|$H[Nø[Á$[ø[fM~$|$H[Ã|$pu|$@[ø[Ã|$8tU$vD|$p)v6|$`w%fRv$ [ø[ø[ø[Á[Á$ [ËD$[ø[ø[Ã|$8w21[Á|$`v|$P{[ABw)1[Dø[Á$ [Á$[ø[ø[Áy-$[Ã|$8vl|$8=fD|$H"'|$8a$ f|$(|$p\ $h$5'$B %;D6~ 86fD|$x+A|$pK*$6{7"Ѓ:$ @|$ v$ fD$ fD|$8]$D$ufee[@MAt&9(AP'|$x7w |$`5AAtZ$  |$pSz%$Uv0 H$"9|$8NAAEfD|$H/"fC$ Au |$pz8( |$ [Cb#$ЃfL { |$pA$v uk$Lf1ƒi"'<'/$R \ v|$|$X!$1A |$8l $J1H$,  |$8rA`|$pL#|$8lC|$X3$ $ v fW a|$(ƒ$1t  |$(|$X;ƒP3$?3p$j!$ w|$H E;A ' H  %$oDfb~$fSp$|$p{m|$p_]|$8lMf_>$v (|$X8N f`vA|$H vfA]D|$8T) ƒ|$p>tMC$g |$pus|$8F|$x92N$<+${ |$8CA:"|$x+i-|$`7wA|DfA^$ 6!?|$` !$m|$H&wA1a|$p( |$ ~"$B)0|$H  |$pI|$8UM#].$BLF|$8z@$} $piA|$ b $\&|$x$s |$H|$H;|$8e|$ $W(|$8:iE$JmBf]~|$`J@f uAM|$x5W|$`:|$P$ + +|$pw$$ppfRN|$`6R$QD$$O!1f\TfA_ |$px9|$8Px-f]-$|$ j$oI%$PfU|$x2\ !.|$H X)Av$lz$j2|$H#AЃ?$U'|$poO |$x,A0 Q5|$H w|$X |$HfAZ4 A$$ w |1 iAYWF$p1Av s V w |$HfAX 1|$82|$`0o|$`,|$`[(|$H$AF|$H s|$Hc$ *|$H *=*|$H] |$`=A/:3|$"3@$.  |$x6( $|$x3@f[1 [LAj$v$;1  |$`9n|$8]"'|$(/ /|$8[E($(|$x$8$=Eu|JT$H[fAlk|$8ƒ'''|$ E |$` Q$f`$$s(|$8t@A$hƒ|$x$Em$vASNDA  fTh|$"8$|$p@$ fAV$!$Wy|$x$$ VBw$8.$|$`:~ $ X'fL6k9|$H 9D  $[$$dK $\fWZAp0|$ X0|$ƒ|$Hu3)fW |$x.|$ .$|$8UA*aЃ|$x/ A&X|$p{T+M H+$ :.=|$Xƒ$puAKAf.fC $|$ (|$H2$N 2Af.|$H |$`lA; A G|$ '4B|$x)t$H[Qf.|$X# $ 0AW+|$`54|$8X@$&vAE$E |$pAf[ |$`!v$|$`0 { &$(|$H  ](G Q(2"p$|$x#fA_)|"-$5|$8bw|$x#$ w|$XB1l  fAZ|$x8 )|$ b- ,DfAT0 d^$P|$`6^;U%L%A $L $ |$x!7)|$pSY|$x? |$`$^3A!|$p[|$Hv i|$pcw$ 1f]A $Lo|$ Bo v ^TA@|$p#XAv$:z $v|$XԸ$g$c A |$pm |$8qxfAW0|$8M/%$-A?fA$;|$p!fA+,|$8.E<1|$TfDA5: $v w'AR |$x2B$sA8fS*fAX (fDNK@1A 3 $S $v|$$ v|$`;1fAadf_e|$:/|$`-%/svndDA  $ #|$H6&$g |$pY ЃD$ ƒ*$2$X$` |$`:|$x.0X%1D@D:0fAVƒ|$`1u$e |$ |fAQ#fAO/A$v|$p6D$|$HX$G$-oVlE|$P~$-#Au^ {C%fTAY1|$`;i+|$p8$A A $f,${7|$H $os@|$P $LB|$H 0|$ Pv$ |$`; # $f`A'g |$ Y |$x/ |$x&;"Atj$fAG-4! |$ $I|$`.A[k O|$pzh$ofAatf`fAEfA.\S1fLDO$ g%|$x  $ t h|$I$#Ac.A~.$Qf-|$H|$8Qk|$H})$ Y=F|$x5dfQ${ ,|$H+$ h6|$x1|$XA |$H $ _$ 5: |$x)y$  fAZ M$` |$x32|$p($AG$|$p  $ fa|$pM$5B"A $ ev$cJ@|$8fA v$Rf_F|$`7;A|$ >u|$`*|$`0 |$x)|$Xc)|$(X)|$x%}AZrhAT$Q( |$ x{|$H %|$ 7}, ( $j ' (|$H '$ |$H% ]1|$XifAUƒ|$ BuG=A  Ѓ!|$x!fA_u$E$|>  |$H#((|$x |$P$-B NmaO?$d v|$("$_ fA]5Wv|$$ $  |$pq $fS0#|$`:%#\A t As(|$P(0$6vAPAOA|$H+$|$8&#S$# v|$pxvA T$ v!$ !|$`#-|$`5v#$k A vA |$p8)-$vfSe fA[NmfS$w |$`7t$F-#|$pR !$|$p7'*$)&|$`7&|$8q $P8%$$$2(|$8K(k$9|$`<$:|$ph $|$P  AT|$8sv |$He t"|$pL_"|$x.$f_Au%9Ѓw|$8> AX5 |$HvA3)|$Xn XfA]M|$H $$h|$#%|$x-B$2=$9LB|$pwZ$ , u$k 2v$A$d |$|$XA v|$P|$H)|$8'v$F<,|$x) 0|$x!$f~$|$8|$pAw|$`Qt$ fA^C'|$pr|$puuZP$N|$ptf_AY$JwE$  Ab|$`NI $ |$x &fI&A 5 ox=*AsЃl|$  |$$ @Q- Ѓ|$`8 $` %|$8j${ |$HG7 |$`:|$x,|$8nwXWM|$X|i5+!|$ |$8K$ЃfA[p Nƿ|$`.騿|$H N|$ 3H|$X |$p$QA||$p>D$"|$XN f\|$H|$p=|$x$n e Ax 4$$#$鯾AA}v ~$f1DU|$8[|$`%5$|$H  $eb+ ޽|$ ɽ鿽鵽髽|$X$g $|$H#_$/4$v|$x[7-c|$pE$&$|$x+"$&"ƼA |$`6駼靼|$p<9lbX E|$8|3A|fA\I|$X|$`<$|$ A "|$H"  餻$|$ O#|$x#g]S|$H o|$(AaAfAL Bߺ$Ǻ$/|$X$$8|$`:|$x0wAE;% $% $}v۹ѹ$.lfA^a颹A鎹鄹$]$fMNOE;1A |$p?8$jAfAQ$v|$p;ո˸鷸A!fLu選AAf\AH$p- $!fG $ kA,۷Aʷ$$A駷fAV1 $k釷}$ $ЃU|$XN>$ |$Hv |$ |$ ڶжg齶$  陶鏶酶{q$ЃB$;@|$`3|$`.$G ε|$8t\|$ ]h|$x5/$镵 邵|$p |$P`w$%TJ= |$p"o|$`u=l |$(|$pv $H˴A1鷴魴%靴 vA }si_fAWi A7'|$HQ$"|$HЃݳ$ \L $ u|$`&闳鍳|$`be{f*ƒ|$`Tpf;fF<2|$8cW|$8X ײͲn麲鰲馲|$H 锲|$`/w|r|$x)/ e |$XF<2A $v$N|$` |$HЃ鯱饱A} $io xnd$O|$H=-AA0 )Ѱǰ$t|$ i|$x2陰|$x-  |$pf)ƒ|$pQ|$HL$4$| |$x& |$pOs|$X||$x#A? ѯǯ齯鳯驯A A |$pq }$ƒ A  J@|$H%)+|$`5|$p/v$>֮$e wfS~鹮鯮饮f33  fI~tj`VfAa!$|$A$ |$`=ڭǭ齭fY~ |$x#颭|$pXAƒ|$XAi_|$8vwFB$ 'f['$|$H{ )$CЬ|$ w,|$PD;vfQ隬$v$zpf$~ v A} $S'$|$(3$ثΫī A=vfW陫鏫$`k1XG   բ|$Hâ鹢鯢|$8qf` Ё u|$`:ƒ?qg|$8|$8xA|$`9,|$p>1fKD$ fI&|$p$餡隡$Rw|$88v ЃgfH$23A|$8`|$ Ёu$\٠Ϡ1D龠|$P$雠鑠~:wv|$H dZPF<2$;v7w%$Wv}'̟Ÿ鸟騟鞟锟銟vzA?wqWw_uZb$v|$`1E;1'$̞֞ž鸞鮞餞隞鐞醞|rh^TfAW;A w(v$&|$|"|$Hvߝ՝˝|$8Kv$R靝铝 郝yoe$&wAcKA7-z|$`$eO$Z|$ wB Ѓǜ齜$RvfY關Z 鄜$vp$`JAw:w($ v }ޛԛʛ鶛鬛颛阛鎛鄛zpf\RH>4*  ښ$/š}ZwK$"頚閚錚邚$MmcYOE;1 vMGw;™鸙鮙餙隙鐙醙|rh^TJ$w1|$X D*  |$pE$=јǘ齘鳘驘韘镘鋘遘wmcff.USDT$p\$0$D$AX(|$`wqA |$hvA|$`|$xe |$x K|$ifB~ |$x XN|$ho|$H  |$8i|$HZ$TA|*,A2|$@(K@|$hDP|$GA:T|$`_@|$Hwy|$h;$|$8[A2Ap$Rf`7"Awf`)Aw_|$ |$`4Yf\ |$Xj+|$8F AKAIQ |$8Uao|$8PlAXf.|$`2=|$hS$|$ $tAf`DL$XENf.|$hn$|$h|$xBDT$H|$hJEt|$hukD$CafO |$h,2|$@w fW!fA|$8i f\>5eAwwDAAfT V m|$h|$8H$|$h SD|$@|$h |$PL $[ |$H @$SR fWo|$hfD|$`AAv|$DA A>|$8 4A|A&$x2]f.[]|$xr@fL^$i |$x&|$`9w|$H $gj@|$8k|$( |$85m|$hW&$1wf_ Dfn|$xr@,|$@ AAfD|$h^ $?DA|$xiAv WM$^3A 5|$H*D$ -@ $ ffY~v|$P@|$hp$jf/vA[g]E$]2 fDfD|$8~$] |$8X4Av 7@fY$KM|$x*EsD$v|$H  A$8f.$$f^|$h%f^AE%|$@ƒ.f^-|$X4A v|$`9|$H $~:AA JA>'$l|$XA# AyfENfM$|$ t[A|$x'|$H'm fR BA|$8g#AS f$S"Apjv fZAX $ZAbAD$kD|$P?AwAFC9m*$A1`|$ -Uf\|$85Aw fD|$@$v|$X]yo|$H\fD|$(…tAn6,fD|$8E|$@2|$8 A$| fT1|$ yf]%|$8}A2|$x3ƒ$yuA{ukD|$`7V|$h#A|$x5` |$HtfVj|$`8 AG|$@tv$|$`61Aw|$x6|$`8 |$@D$be$W$G5 A5D|$hg|$hx$R#w,|$x., $A  |$h" fOz1$T |$8KAX|$h CfS; |$@'|$hd;|$`- AbAqA$KAc8A#$H#|$h|$8W|$8Pv|$@ ]SDAV; A V#$1wAm A A:f^|$ a^ A{|$hl|$? A/ƒ|$x EA5bQA=v <2@1fMD |$`9Az$lA~ $qw |$ |$h'|$h^ vA zp|$h Av$E;|$`A|$H]!A~4A*A;|$x;|$X BAxƒBAjB|$x&-X r9\R|$hI3|$x)1|$x8\|$x0$f]` |$h|$x& (|$8g#A@|$@m f^+A &A/$A.|$H FAH|$h|$$su|$`*6AY %|$x1%fA T$ A[|$HB A}|$xSJ$>w |$xQ]SD} ;$X|$x1L1|$@ AfcN |$x. |$x+$%|$X-w-$H|$h[HANwf|$8Fw|$x?KAA//|$x1< f]A9!A :0$k.|$ jv |$X  |$ 8:*A0k|$@ uA1$>S|$ A|$hV f]|$`8]|$ h%L5|$H75A-5A |$`9v|$X$l A1  A. smbAu|$XA>fV|$8R$Sf_NAYDA O$sO|$@ t)AVf.|$8OA>1f=jA|$@MW<|$   |$@ 0= |$8vf] |$@v|$P|$x"|$8~A~|$ ylfY AN>|$8m |$ |$h)d!|$H |$H'"A"fDE |$hAA |$x/M AN3|$X93|$h+3A|$h, |$F|$x7;|$h+A3wA|$8x$~|$Xθ+$` f\$]]|$x2M|$`:w>4$$V Ah |$h}&A\$$1$/A  |$h|$8mvukf;\1AH$W5|$@w|$hF fa |$`1|$Hv|$X|$ |$hB  $UAA|$@9A$T%|$8X/ Hf.|$x*w$L$oAD k[|$8`,AvA?|$`1?|$ ?|$h?|$@?dƒ|$x4\?P?q|$`1`|$@ UA'I 6|$x3  D $%$W3A@|$`6jA |$xFv |$`7~ |$@/A "}|$H A^|$ bN${ $x vDD$@E- |$E Ap$$7$l |$x(|$@. v si$L A|$9|$@)AK ? A f\7 |$x3(|$`0;fD|$8|$Xv4 9 |$hY|$@(|$8m(fU(f|$`:q vf]D: ' fV2|$H|$x2!Ѓ|$H„A"AAL|$`*A |$@fV Acv$ |$H]|$` $|$x7& |$c&N$AAS{AinvA@ $OkAA9A $@M |$ U |$h{|$ fM|$8t -A< v8. . |$8REfP]' A|$ .|$hY|$8a"|$`<ufM`vA|ryAQ|$h` |$X|$h 73|$X%%|$8Gn $5[|$@!|$x+!|$h.|$(-^T|$hƒ|$Xu |$`(|$h;cy|$@dA$ A|$hw$Av$A $#AfX*|$@ /A*fQ*9 "|$h#v  |$8^hA |$x34$|$hAA $|$x.R$&19%|$@wfO f+|$X$+$$fJv$!|$h A|$h~: 1 fXb |$H |$h?A+D|$@|$ b3 |$@A# e|$8p A{ FA*3|$@}|$8s  v f^fR $?fBI|$@5|$8|$h$a$ef^t|$`%OE|$H" |$hv "|$h+ |$@6 |$P+ |$h!|$XA$A5ƒ|$H \ |$hcN i|$  |$ L|$ %:$A|M |$x%"k O-A |$`/'|$hu'A`a'|$hI'$l $ AA|$h@|$`. Ѓ|$@„?|$H4QG$o|$X|$8r|$x/Y|$X|2 |$`2|$`$v|$X|$ |$hh$|$`:X|$ |$h+1 D@QAO =|$8YEfau AM$ |$h^A l|$x-|$8VfU |$`AF|$huf."A&#|$`#%fu|$h `' M1|$7|$` ARA1|$H AAK|$x& |$@|$h  |$@Ss|$Xƒ|$x7;*A .*G|$@&|$hoAf |$X]|$hBAE|$cA|$(f`5 |$XCfV9|$x v|$X\R|$H@A. $s|$x3|Ar |$HfY fQ t$|$H  As!|$`/$OI6A)]J|$@DЃ9|$8b@|$8QH fXA$ Ѓ|$`# |$hq |$h|t|$HfE+ AqAЃu|$ Rw|$h\ [Q|$`@]$iZi|$H ^|$h$}gA|$X|A|$h". Af\QAD|A!  VA$AE |$ 7 '$NfN A v|$@ $YA  $f $j|$`.y yA. e[|$h>Ff^A|$XG)|$H A$|$hfS|$`9OAB]SI: 6,A|$H$R|$hARv|$Hyoe[|$@I?5+AE |$8X$UAHvA|$`3 |$H $AЃfV fH]$~cY|$@$v3)A1$v|$`b #f] |$@=|$`=|$`?Az $DWMC9/%|$`;$kA |$PAI|$2 vAyoe|$` F |$8tH|$  A$:1f^DO vAEfP;|$x4|$Xy|$hs|$@Dh`ЃH8|$h ACBƒ|$`#A|$`8Z|$hBAnAr|$ H$ |$hj`1LB|$ %$|$h |$H|$N|$@|$ ? |$hsA )$|$8(|$@U'|$@Rƒ|$xt|$OEu$@J|$`>|$ A9|$hAK UMv|$P yo$$zA iA R|$XG'c |$H E`BЃp |$HfO |$XW|$h.||$@ hA sM {1|$H EdvVAЃ*|$8t|$h  $[w&Aw ЃW   fY|$h~tj`MA-A' |$@|$`< |$xA A|$H ЃA"|$H.]SI?|$x2!|$@wFA |$`%Կ|$`0|$PfWb|$`5|$hh=|$8V2AyAeAIXE;1~ AGv$$U/|$8Mܾ>A4鿾AxC  A( |$hAzp>fA|$@7QGA6|$8U& A $ fW E |$x7 1fTDݽӽɽ鿽A^A |$h鐽醽|r|$x)w|$h:VL1|$X3fU  Z ؼμfNj fQA $) |$hW  鋼遼wmcYfQzA> |$`lG |$x< &$|w0A Av$. ٻЃʻo 鷻魻飻陻鏻  Ai r$_R|$hk:1C9fX,A  v|$XT $_|$ $[|$@*|$8s|$`8阺鎺Ak *|$l|$`8 w|$`2LB8|$@ / Av  |$HA|$ չe ¹y鵹髹项闹鍹郹$|$8_]SI?|$h@! |$|$ A#At|$@v1f_鶸|$ |$( A $& |$`6 |$h M\|$x,T$AA A%|$H|$(1fX̷·鸷|$@|$$ |$`8s|$87w;AA|$@w|$h ;1A A)A|$h޶AAPƶ鼶鲶|$x0Av$uk_RH>4*  A<rǵ|$8Ew^f\|$h|$x2||$`9$7v|$HlbOf/f&|$`"|$xu|$g |$H$A 鶴fV!|$P~ wAA酴{A v|$@bXND:0&Au v|$H۳|$Hɳ鿳鵳髳顳闳鍳郳y|$8 w?dZP1|$hcD:0&|$8wIfM~9|$h]w%$kv'ݲӲɲ鿲|$x9魲 v|$鋲遲|$|J|$P|9$fw|$hWM :0&|$X3$fW~ɱ鿱鵱髱ADw#D$h-.鉱ukaWM|$@w|7-#|$@ fVx$`wRAwY|$x,tHfQ~8v&"|$x-u٨ϨŨ$5td|$X|S|$h&w?Aw"|$x4A%kaWMPwR2(tIAw6B#w-|$P&ڧЧ|$@龧鴧骧頧閧|$@wJw8AIw2wmcYOE|$|$XN#Awd|$8}wS wN|$|=|$8Sv,Aw wצͦæ鹦鯦饦雦鑦|$H|$}+AZAЃaWM|$hA+! |$X@|$@ w$|$xv$Sǥ齥$_騥|$8[!A „t8AIw2wm~6|$x5w OE Ѓ3) |$@ ѤǤ齤鳤驤韤镤鋤|$hvS|$8D\$(\$xD$|$@wX|$htE|$XA|$`n$|$`vD$`-.[fAn|$ ;Z|$0?g|$h"~A[fDA |$h) A AfAO A /|$0,'fA;0fA.9|$`K[f|$h|$[ЃÐ$iy|$0Q|$@A[D|$0R|$`|$hzw $q|$X9A p|$J(2A[|$h>wI$<cA fA\|$p#%1fAP[D?f_Z [D|$hvvA[DfANeA<[@AU|$ht[EDA>$lbv|$`;[D_|$0~ |$`/[|$8fAP |$X5|$X'6"|$0r1|$H[D@@|$hJ|$X* U|$pFA[@|$p>|$@v|$ [@|$X8A[|$he$O| |$p-Ar[$r 3[|$X8Ef\Y |$PA [AivfAS[|$0f}A A[|$0s|$p1 |$`k|$P1|$`l [f\EfANi7|$hP$w |$p58[D$7|$@w |$H[@A u |$` |$X9*A*_2A'FFAE[|$phAV|$0|$X#1 [tw$[fD $P|$0j *|$@3A[fD|$@ |$`@ Acs$A"t|$`Y;F[|$X:%[D|$X;? |$0[w|$hz[@ |$p(9|$` 1C[f|$h[$+ $p|$` fA`RfA[ |$8@[DfAE~.[ffA^$Kp |$-w[fDAp|$XH|$h $|$@:|$#6|$86[@$l|$`T/XA|$`*[DfAG|$8w[fDf`|$X7O 1[D|$X7[f$efA;|$h9[$i|$8 vA s[DD$8E|$` [Ã|$0\|$@  |$` |$P(1Ah[fDD$8|$X3~ |$p"/fA['|$X [fD|$h|$`0&ADh|$X:X|$@[@A[$g|$p/~|$`up|$`AwD$E[@$b|$hC|$}q[Á|$0|$0R-|$`|-[Á[ø,fAJbA [AÁK[Ã|$@  A|$@A& /;|$8[f.fR|$`+[Á|$`3\|$@[fAV A |$`}%|$PA |$[NÃ$O |$`%[Ã< |$vfA[[Ã|$p7|$8F|$X0[f` |$hx6v$sN[fA^$ |$@ |$8!2,A[A` $k$L|$0;fAo6|$8r6[f.|$0K|$[A |$h""|$07[fDD$X[/Ã|$p6w|$0]rf[v|$hg [f|$X0 |$0r?|$8d[A@[Ã|$@|$hb |$Oz|$ eAw |$8 Q[fD|$ h +A [Ã|$8qAh[AwE[Á$wA[A} |$p4 fU;$$1[AdfA\TA[A A |$hOV+|$@ K+[Ã|$@ w|$8[Ã|$05|$hb.|$p"Zr-S-|$@[Ã|$H6 $~|$X9n|${AL*|$0*[Ã|$hfV |$0jY!|$@,|$@B2|$8)[DfV>|$h ;$[Á|$`) |$X 7|$0[Ã|$X2A |$04=$6i.A[D|$X9AA: [A[A Ã|$@v|$X7[ø[Á|$0A[Á|$`wfAR[ÁwAd[Ãw|$@ H[Ë$C |$h[1fAJ[D@Ã|$p$U|$pK Ar/|$8u|$@[f|$p1$7Am40[Á|$`w ^[Á.|$0G|$@[Eà %|$` [Ã|$p[ø|$`|[Ã|$p2J$oA{p0|$@e0|$P00[fD|$h"[AD |$P[Nø  fAG|$aAA[à v|$p+[Ã|$h/|$X0[Ã|$@'{|$`[Av|$X1P[Ã$r\ fNf|$8)r|$h8A1[Ð|$X7fAM'A|[fAGM|$XK[Á[à A|$@[Ã|$hO4 z)A[Ã|$0vL|$X6|$`[A6A |$@=&A@ )|$X6)[fAS|$0k#|$`s#[1|$H[Ã|$X4|$@[Ã|$h%fAVKAw[Ã|$X@SAzAo [Ã|$p7!$E$Jk'|$p351|$[A|Af[|$1A[Á|$`v|$0Ii[A|$`t|$06[Á|$`J$v[Ã|$XS ƒ|$t|$p[Á [Á|$0|$@[Ã$+0AUyv#G0fLh&_&[fD|$p43A\vfAP[øAA@v|$0V[Á|$`|$Xv|$8[Ae $&,%1[Ã|$p2 |$`[fAR= |$@ v|$`6[ÁDv [Ã|$@fAZAyv [Ã[ÁY[Á|$` |$9[Ã|$0j[ø[ø[fc |$P}k[Ã|$@v|$X80[Á| [Ã$J0 |$@ A&[Ã|$P„A0[Á[Ã|$p+|$@ w|$[1|$[Á[Ã|$X?H|$`T A'|$ .!d,|$@[Ѓf.|$0[Ã|$p1|$ [Ã|$@!A&s$b[Ã|$X% |$pq |$H||$hG~[Á[Á|$`DT$|$H [øfAI$hAf_$|$X:-|$ u|$0P[f|$hp $p$ $[Ã|$ ^$JMfA\!#|$0&L+[Ѓf.A*$t[fA`" |$#|$`[1|$@ [Á4A[AQ $|$`0^*|$0v[øDj|$p:vAT[A[øA0|$`v[Ã|$2 fAOƒ|$X:u[Ã|$X:|$@#$iN|$p,;)|$-|$8V-1[D|$p3ƒ|$0byw m[Ã|$0=" |$`[fAT|$p1]#|$h ,|$p3t[|$05[Ã|$0{[EfAajAc[øfA<|$ifU  (|$`("[Ã|$hk>A[Ã|$@"1A[Ã|$ha & |$86AJu$|$`q <p,|$@/|$hH/[f.D\$EA$sUgw |$X7O[@|$H4v |$h8$[ø6  |$X9?|$` vfA\[à  |$X3q '[f|$0{|$X9 |$0`[Ã|$8# |$HvO[A |$p.f|$`[Ã|$p|$ |$`[Á  |$8[øfA^|$`t$L[øfAK|$P|$`wFf[<[Ã|$0b A".A3"|$0`|$`*$Mu*v|$8 [fAR|$8[Á|$`12|$X45|$ 1f^[D@ÁWvA!m[Ã|$Xk|$8=L|$8:|$X[Ã|$p#[øA[fT $|Q|$|$@[Ã|$X7[DÁ#|$X4[A 7 $?) |$0[fNN -[Á|$`NA(|$p[Ã$qKA u$n[1 [Á[Á -[Ã|$X7c|$0_fAQ Ae &f]%|$8 % v|$h;[1[Á|$` $o $pu|$`[fAO |$0k0  |$`")|$8)f[Ã|$$v! w d[øfAbM|$P}|$`8[Ã|$0U0 |$@ v|$` [Ã|$@v [Á[A|$hA>P|$@E[A $7$5[Á |$8<$U[Ã$v A pf^A|$0m|$%|$X)%[Ã|$p)o[Ã$ |$h&$#|$8)#[Ã$c A8^3|$9[Ã|$0J $0|$h7A#[Ã|$p0 |$0A[Ã|$  |$hSfAF-$|$`5v[fA[3|$(|$@v|$0h[Ã|$0%fAU[AL  fAI`|$0kv|$X/`[fW${b[Ã|$p,fAR|$0S(vA [Ã|$p- |$` ~|$p"8q@ e[fAQ|$@|$~|$X[Ã|$h1|$X3|$@|$p<A [AW[A[ЃÃ|$p& |$h A[ЃÃ$ic 1|$[Ã|$X0$%|$P |$@ [Ã$d NA[A |$ |$X5vAa0[Ã|$[NÃ* A[ø[Ã? f_[Á|$`A A6|$([Á[Á|$` |$8- 1|$8[DÃG |$`[Ã|$8 0v [Apv|$8[Ã|$0J f^D$`[-A Ã|$8[Á|$`|$@$[Ã|$8  1|$[Av|$0JY[Ã|$hH[A#|$8[Á# AS|$`Xt!Ab[Á| $k [Ã|$0S A $M[A[Á|$`$v|$8g[Ã|$X) |$`v|$;[Á ! ||$H[Ã$|$V3 [Ã|$p v|$0h[AAA|$`U $K[Á|$`a[ø[Ã|$8 v|$` A-|$u[Á [Ã|$  |$XJ|$0<[Ã$^[ø[Ã$ ` |$H}A[ø[Á|$`|$P:[Ã|$h } [Á [ÁD<A3w|$`U'G[Ã|$p.S |$`[ЃÃ$'[A[A4 |$h|$Ay|$`0|$P%b [Ã|$pJfA[?[Ã|$|$q$[ÁI[ø[ø[A=  E$*|$8/4|$p[ø[Ã|$XD1[D@Ã$q |$h$W8[NfAp $%|$0[AQ[Ã|$8>[A |$`{|$@A[Ã|$p- |$p)$r[1fd[Ã& AN[Ã[ЃÁzvA[Ã|$@ > |$p A[Ã|$0n[Ã|$h|$@tE[ø[Ã|$02f\|$X0[Á|$`B|$h^$`0 w|$X=|$`t|$`[Ã|$Pu|$`|$X[Ã|$h|v8F[fAL [\Ã|$H|$` [Ã|$ |$[NÁ|[7Á |$h\kv$5[Ã|$PHS[ЃfZi|$X-W|$`|$8|$@ w9[Á$T[ÁH[~ø[Ã|$X< fSK[ø[Áp[Á vA [Ã|$P|$`{ r [Á |$p+ ACw|$` ?[Á|$`@ AfAW[ÁO[Á[A[Á0[Ã|$Pƒ|$h,u fQ[Ã|$|$`$&[ÁZ[à 1f][Ã|$@ fAQY |$ |$@$u[Á|$`Rv|$h#[Ã$&c|$@[à v |$X6|$p'vfAT[ø[ø[ÁI [Á |$p2|$X0 [ø[ø[Á%[Á|$) A[Ѓø[Á cfQY[Ã|$0F +[1[Dø[ø[ø[Á[fSA v|$X<|[Ã|$hU Aƒ|$7 |$`) [fX[NÃ|$H|$P[NÁ|$`[Ã|$8|$X:p|$P S|$@[Á|$`fA\u|$hx[Á [Ѓø[Ã$[ЃÁ|$`W|$8b |$H|A%&[Ã|$X:[ø[ø[ø[ø[Á|$`[à [ЃÁ[Ã|$PM|$8 z^AZ[ø[ø[A[ÁA[Á[ø[ø[Áv |$'[Ã|$0k |$`A [fAM|$`|$A[ø[Ã|$pA~[Á|$` |$fADH ,|$0r!k [ø[Ã|$h> |$8!w|$`i[1fAP[Ã|$>[Ã$o|$`[ø[Ã|$8[A[AMAyA4[ø[ø[ø[ø[ø[Á|$`||$P[Ã$m|$p4' [Ã|$0i  [ø[ø[ø[ø[A[A[A]ø[Ã|$XG|$8_$z$|$8[ø[ø[Å A[Á|$`v|$hQ,[ø[Ã|$X[AOA[ø[Ã|$X |$8[ø[Ã|$[Nø[ø[AA [Ã|$X'|$@ |$`v$M[ø[Á`|$0*Aj AI[Ã$U[Ã|$hE[ø[ø[ø[ø[ø[Á|$`>u|$p.fOYA1|$[D@ø[Ã|$8 v|$`##h[ø[ø[ø[ø[Ã|$0P> . |$@# [Ã|$8[A |$8  [ø[Ã|$p&F [Ã|$[NÃA[ø[Ã|$@[Á[ЃÁ|$ [Ã2|$`[ø[ø[ø[ø[ø[ø[Ã$|$8[Á|$` [Ã|$p8~|$@[ø[ø[Ã|$@[Á [Ã$Oaf^W$H7|$@ A# [ø[Ã|$p;f\|$hF 6 |$`n[ø[ø[Á[dø[ø[ø[Ã|$h  T[Á [Á|$`#v[ø[ø[Ã|$8[Ã|$s [ø[ø[ø[Ã$[ø[ø[ø[ø[ø[ø[f^ fA] [Ã$O  j |$L [Á4[Ã|$}A [Ѓø[Ã$[ø[ø[Ã|$h)1[D@Á[Ѓø[Á[ø[ø[ø[ø[ø[ø[A[A |$$|$`|$0d[ø[ø[Ã|$HW|$P+ |$@ [Ѓø[ø[Ã|$X[ø[Ã$u vA0&[ø[Ã|$0oV A5 AS [Ã|$P5[ø[Á. |$`[1A [Dø[Ã|$@wA A [Av|$p3e[ø[fY$][ø[Ã|$@u|$![A   |$`[ËD$hƒ|$Xio|$8a[Ã|$@|$0bA|$P[ø[ø[ø[A[Á#[ø[ø[ø[ø[Á [ø[ø[ø[ø[ø[Álw%|$ 1|$[ø[Á|$` Af[&AA[ø[Án[ø[ø[Á|$[Ã$x&Ap [Ã|$A [A[Ã|$88w0$av|$`x[Á*v|$`Ѯ[ø[ø[Á5Av[ø[Á$[ø[ø[ø[ø[ø[Ã$BwA4[Ã[ø[Ã$[ø[ø[Ã|$0ULf]5|$h@|$8[Aiƒ|$p0t|$ [ø[Á| w?|$p/|$`rn|$h8 u ASd[Ã$V$  |$`[A |$s [ø[ø[ø[ø[A[ø[ÃZfT2|$||$8[Ã|$@[ø[ø[A[ø[Ã$[Á P|$PE[ø[ø[ø[Ã[Ã|$X5[Ѓø[ø[ø[A  v|$`[ø[ø[ø[ÃfY [Á|$X9[ø[ø[ø[ø[ø[ø[Á[Ã|$X:wD [ø[Á|$`Sw|$0mw[ø[ø[ø[ø[ø[ø[ø[Ã|$X3[ø[A[ø[ø[Ã|$hv|$t[ø[ø[ø[ø[ø[ø[ø[ø[ø[1[D@ËD$`[-&ø[ø[ø[ø[ø[Áwb[ø[ø[Ã|$@[à [ø[Á|$0w;|$`Xƒ|$@t(w[A[ø[ø[Ã|$@ w[ø[ø[ø[ø[ø[Ã|$8 v-|$@[Á w|$8[ø[ø[Ã|$@[Áv|$@ [Ã|$@ [ø[ø[ø[ø[ø[ø[ø[ø[1|$P;[Dà vA? [ø[ø[Ã|$0Ov $[ø[ø[ø[Ã|$p2[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[A[Aw8|$8w!|$p+v|$` c[Á[AS |$|$0'uz|$8wR|$Dw?[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á)vA[ø[ø[fSDT$hD\$(\$xARw7$!$1|$H[D|$p!wy|$`k|$0u|$0[b$X |$@w|$HS|$8w*Alm*[D|$`Pj|$@wAk-|$`  BAv|$0HU |$7w$ [DG |$@ a$ |$0a |$p1`$~A$o(|$0%4|$`@R]D|$`[DmJ[fD A|$  |$0j9$6|$8$|$@A9ƒ|$%0$ 0$- ;|$`q;[fAx|$Xk$t=$* $x|$8'v$[fD$|$p5$a |$  |$`f`||$X8q|$H%L$|$`d3f`Z3|$87A].7[A.5|$`W |$0fX|$0{G,A :5|$@ GA[ÐA|$`G8fA`u bAp!HC,|$:[$A |$p2|$8* |$@[@|$p?fAI |$Aw|$`y<[D|$0f|$0A||$@/|$8v|$pƒ!*![$K|$0|$@|$8!Ё#„A`[Ã$g|$`wfAb$3[A>$ fA.|$P([NfDAy|$`! |$0yYA[f$?|$`H |$8<|$`[@|$BY|$0V$S[|$|$`@ |$X|$0.|$1|$0[f.$q"|$`n$571fP[Ã|$p%|$0u[f.$yB|$`@$$@[$|$7\|$X;'$" [@|$8p5v|$0C[vDT$E#[|$`7AT|$p1[|$0SfAID |$p5|$[$i|$`(|$`%$(~([fD|$p, 1$ [f|$X% |$p |$8Az$~ w[f.A|$8; |$[OfA^|$0Kf^T-$v6[fD|$@[|$0$y |$@|$H|$@)+|$0fƒd0|$`V0[$U([fDL$8EB$Uw|$`?[fAR|$p- $1|$[D@Ð|$  f]j[f.{ [f$C|$p,[fT6$I w[$B|$- A4|$03($[[fA^u P|$P!|$'$[DfAB-1$H[Ã|$X4[A[Ã$E Al7+!|$@-$-[ad A^|$@w |$p[øA|$0X($ [Ã|$X7L |$`[Ã|$X7v|$0xz[Á[Ã|$8S[Á|$$fA^7|$0el|$0\7(|$-*-H[Ã|$8E |$X6F|$p=w|$0[ffAcƒ$tt|$X[Á|$`S|$@[ÅfA=[Ã$X8 $V'a |$p-v |$P[Ã$GvfAZN[Á$M,$w|$8[Á|$0 |$X5|$@|$`j+[$W;1$ [Á|$`|$8|$X8|$X#+|$0,)Adƒ1|$p-1|$` 99[DfO\N|$8&fAItAb[f|$8VFAw|$P`0[Á|$`:S A%\|$X,$[Á:[ø|$0|Az |$p/|$8 $ ƒ|$$($ ($ 2|$0q>DAz11$q[Ã|$XH* |$pE[|$8 A [D|$8$ZO[Á$( |$`awA %$Je$$G[Á|$`!f|$0 |$X0[fAO,AH|$8 |$0vz(|$9|$0^9[@|$X;|$`$3ƒ$F|$p |$`]%v$5o[|$p.YA+ |$v4[Á_|$p$ $" ! 0|$0k0[DA{6[Á |$`t|$Xv6[Á$!v |$Hb[ø[à |$  $*|$@[Ã|$8[1|$[DÃ|$p(  |$`[Ã$X|$(|$@ $|$`),$ ,[fD|$p[Ã|$8[Ãd j|$`[Ac [Ã|$|$`H|$0b|$"$'w fS[|$0}[øA$vpr_|$`[Ã|$p)L[Á$Bf]$7[Ã$g $F[ø|$@kfAJ|$X.H'8'|$0f)1|$[Ð|$X9 ]Aw AqM[Ã|$8 |$@+|$@ v |$ [à $j4|$X9& [ø|$@ ^|$` P|$@w|$8;[Á( 9 |$`zCrvASm[Ã|$0S[Á|$D[E5 |$0  vfAb[Á$A$_vfA?[f$ |$@v fT[Á$Sv|$X5^[Ã|$ gI|$8l&|$`[.|$p)a.$19$ [@|$@f $bfA:Y$#!|$8=)/|$X5|$8;[f|$@ƒ$e]t$8Q[Ã$VH$lw |$@0[A"8 '1fA;[ø1|$[fAJ 1 [Ã$i:E f]$Z [A7AvAG|$@[Ã|$p- |$8'fAW%T[fD|$0h[ËT$8f]$ [Ã|$X:|$8$O$1.R[ffAP|$8Dz$"|$ 3/1|$@ [@#w$,[ø$[Ã|$8 fS 1[Á$[Á*[Á$xv|$0`~[ø[ø[Ã|$p&Y|$` [ËD$@[ø[Ã|$p27 |$0o Ё|$`u |$p/ $ov [A[ø[Á|$`=[Ã|$0{3 $S|$p4A?'# W+fAY5Aƒ|$85|$X95[|$X(!|$ [Ã|$@w[Ã|$0I $I[ÁEfAB0|$|$p3[fAH |$ |$XE[Á$s$AI%$Z&|$0i+e [$e$ |$`K[Ã|$8fA^t|$@[Á|$`!0|$`/[fP$e b[Á$sw([Á$[Ã|$@A1|$8v|$X5[Ã|$@|$`'3f[|$`c&|#|$g#T#A3w|$`&g[|$ʸ[NÁ[A$ A<$[- =Á$[Ã|$p! Yj [Á$$}|$0i[Ã|$0ItDD$HEg$Jw=[Á|$`| 5$[Á$|$8 5|$`r'|$0[fZ|$` AfW|$ ЃufAI[f|$i|$8 U[Á|$`5v!3[Á|$A.|$@ ,  [Ã|$@[Áv|$X,[ø$[fA\|$X:kDf1|$p0&[ÁfAT9|g|$}*[f.$J|$8'[ø$]$|$X4[øMfE|$8X[øfA<h|$8 A[Ã|$p/v|$0y8[Ã|$@+!$[Ã$OB$ [Ã|$p5 |$`   [øfW$i{ |$p0[ø[Ã|$H |$  |$@#D$8[XÃ|$p?|$p'ƒ|$X3 $  |$`[Ã|$0)[Ã|$8$C!A!!f\![Ð|$8ƒ|$0v$l$tv O[Á|$P!|$pUn$vA [Áu [Bø[Á%[ø[fA`|$0o ЁY  $ T|$`G- vAzs[ø[Ã|$X8 |$P|$@[ø[ø[ø[Á]|$`=[ЃÁ$ [Á|$`*8|$p8vA[Á|$``\|$`/3|$@fAP(_, F, [ЃÃ|$X8 |$C$ $k +k [ø[ø[Á$i|$0Kt[Á$|$p [ËD$8[Ã|$ $[Ã|$H$ w k[Ã|$8F w$[Ã[Ã|$p5|$P|$^[A fAc~[Ã|$X x[Á$4 |$0G[Ã$+W |$p.|$XVA:v|$+[ÁV n v|$.[Á$4 w ( [à  f[t|$0TK|$8"ƒ|$X7'i'[A*IAfAB|$@ $[-=Á$:  |$8$[;#AR1#[à v[Ã$Jv|$@[Á|$`L   $S[ÁI|$`+ $|$`+[Á|$8`s$ |$` [Ã|$+[Ã$h_$~e|$8![Á|$`b|$@ |$`K]$ |$[AE|$@ | fAO $5v)H[Á$G|$p|$X'$Q[Ã|$p'[Ã$HA $[-nÃ|$p3cfAEX&l[Á|$`|$[Á[Á$3v|$PG[Ã|$p[Ã[Á |$8C$O 2v|$X8[Ã$y[Ѓø[ø[Ã|$po[Ã|$H6 |$0f[1|$P'[Ã|$@ Y$6 [Á$ n fWs |$E fACL1fN[D@Ád[ø[ø[ø[Ã|$@![fw |$8&t [ø[ø[Á [ø[Á[ø[ø[Á$jfD [Ã$}[ЃÃ|$XB[Á|$` ;[Á[Ã|$X. |$`k [Ѓ1[Á|$`1[fS |$fAL|$@[Ã|$PF U1fAK[Ã|$@$|$`m[Á$;|$NAd$[Á|$8_|$8"r|$`g[fU|$`v[fWX$c*|$p- t|$`[Ã[Ã|$|$X<$' |$p3o|$0'w$>[Ã$H $#f[+|$@[Ã$o $ |$`;[A, A $Y[Á$l[Á< |$`-# [Ã$2= fb~$[Ã|$0[ |$t$Y[Ã$lv|$8[fAV |$`F |$`[ø[A |$p|$Xq>|$8As$[ø[Ã|$8$- +|$P[Ã|$X3[Á$  |$@|$8=|$X5[ 8|$0 |$H[ø[fU |$` *K $X= [ø[Ã|$P|$@[Á$1tAS $mE [Á fafAV|$8[ÃO$t$[ÁS [Ã|$@"[Ã|$0\6 fAM $MF[ЃÃ|$p[Á$`P$'*Av0 [A5$L  [Ã$A[Ã1 v|$`\[Á|$`[1|$@ [Á$=[A=S1|$P[DfA?, fV"@w[ø[Ã|$P[$[- =Ã[ø[Ã|$p0 [Ã|$0J $o |$0R [ø[ø[Á$  $[-ø[AKo[ø[ø[ø[Á+   [ø[ø[à R 6 |$` [ø[ø[ø[ø[ø[ø[ø[Á|$8[Ã|$8 |$` .|$@|$`[ø[fAZ |$`F[ø[Ã|$0H$[ø[Ã|$@fA:[Ã[ø[ø[ø[ø[Ã|$ 3 $[ø[ø[ø[ø[Ã$U>|$`pƒ |$p0[ø[Ã|$N $  [Á|$`v$c [Ã$ku[ø[fVx A|$n|$8|$` cAR W|$`II[ø[ø[ø[ø[Ã|$0?A$fAQ|$8[Á |$01[ø[Á] [fAQu$[XËD$`[-q0=1ø[Ã$u[Án[à $[ø[ø[ø[ø[ø[ø[Á$B lAf[u O [fAQ|$@[ø[ø[ø[Ã$S$xT |$H"$Ww[ø[à |$0N $ [fA^|$|$p/[Ã|$@ e |$P[Nø[Ã|$0U $Q[Á|$`3 $_ $ $ [fZj|$0Z|$X< [ÁH |$8[Á$u^|$p1A4|$X;_|$`[ø[Ã|$8$*  G [1f^[DÁ[ø[Á |$p([Á: [ø[A w|$` [fV$w|$P[Ã|$@|$p51|$`[ø[Ã$s[ø[ø[ø[Å|$H[NÃ|$0Cv|$H[ø[ø[Á0[ø[ø[ø[ø[fAL%|$P~fAZ[Á$vAud[ø[Á$ |$@ [Á[Á$ [ø[ø[ø[Ã|$P`|$$S|$P|$X6|$`@[ø[ø[ø[ø[Ã|$X7v|$`o[ø[Á$x [ø[ø[Á- [ø[Ã|$0Pw; /$O!|$P|$`[Ã|$X3vA Ϻ[Ã|$8ƒ|$@ t$,[ÃA;p|$` [$v5L[ø[ø[ø[ø[ø[ø[Á$#Q5|$#$M [ø[Á$n|$8[ø[ø[Á$ w|$`w[ø[ø[Ã|$H[NÃ|$ wqA5z f] A [ø[ø[AwR$ y |$8 g $[ø[Ã|$X3d |$%[Ã|$0V [Ã|$0R[ø[ø[Á$l[Ѓø[ø[Á'[ø[à [Ã|$8$> |$X, |$ |$@[1[fA\  fAG $r  |$` [ø[ø[fAi |$p > fARp |$`(b [Á  $6[ø[ø[Ad[ø[ø[ø[ø[Á$X|$PM[Á$y [Ã|$PE1|$H[D@ø[ø[fY |$  |$`| p [Ã|$p).$4a|$X::$-$[ø[ø[ø[ø[Ã|$w*[ø[Ã|$8,[ø[Á|$`'I |$P7 UN fY #[ø[ø[Ã|$U|$ $1|$~[Dø[Á[Á$S[Ѓø[Ã|$|$`H|$8[A[ÁY[Ã> |$, |$X9! [ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[1fA\[Á[Á|$8|$8]]|$ƒ|$8Dt|$8@[ø[ø[ø[ø[ø[ø[Ã|$p6u$:[Á$P[Ã|$8t$zN[ø[Á$|$X.||$@[ÃV|$K[Áe [ø[Ã$t|$p#[ø[ø[ø[ø[Á|$`Y}[ø[A3v t[Ë$[-z=ø[ø[Á^ wB|$8wf v[Ã$R[Ã|$8 A4voAw>$L w v$[[Á|$`z[Ãw;|$0Tv-|$8v&$Uv|$0Yw[ø[ø[ø[Á$P wB$z[Ãv|$8v|[ø[ø[ø[Á [ø[ÁE|$ |$Pt[Ã|$p"|$` wlA8v_w3|$` [fZ|$8 vr[Á$}v|$X/Q[ø[Ã|$X2w|$` [ø[Ã|$P1[ø[ø[ø[1f][D@Ã[ø[Ã|$08|$05wt!weAv_[ø[ø[Ã|$X^v|$[Ã|fA7Ac[ø[ø[Ã|$X3v!|$8 [Á|$`[ø[Ã$2wgv[ø[ø[ø[Á|$`[ø[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$0a$$t7A4w1|$ v#v[ø[ø[ø[ø[Ã|$87v>fF~1|$8av#Av|$@[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$[f^$=[Á[ø[ø[ø[ø[Á w,$D [Ã|$8#w[ø[Á$v|$H,fAS[Nø[ø[ø[Ã$[ø[Á$w|$P[ø[ø[ø[ø[ø[ø[Ë$[-Ã|$8w<$9[ø[ø[ø[Á|$`$[Ã|$@ w|$H~s-[ø[Á|$`mv|$8[ÁvfAR[ø[Á|$` wlv`T$c[ø[ø[Á$ wH w1$[ø[ø[ø[ø[Ã|$X7[Ã|$8%[Ã|$X1v4$6ƒ|$@uw[ø[ø[ø[ø[Á|$`[ø[ø[ø[Ã$\wp [XÃ[ø[Á$E[Ѓø[ø[ø[Ã|$0Rw+$[ø[Á|$[Ã|$[Nø[ø[Ã|$[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á[ø[ø[Á$ wl[ø[ø[ø[ø[Ã|$pt!|$` v|$-Q[ø[ø[ø[Á/ [ø[ø[ø[ø[ø[Áe [ø[fSDT$h\$(D\$xAZwg$2xQ|$`_|$`J$(t w[f|$@wY<|$0$[)$ t$HQ1fAc[Ð|$`SA|$ $G?[ND$  |$|$0] |$@J$|$@Q!fS~!|$8)|$X@1|$0%6$pCfAPT[|$8[fD$DfAPf|$ $6 |$X7G$,$6|$01w|$8[@|$p"m|$`S|$0E $ $$[|$@ |$`P|$`|$/AbY |$Pm)|$8b) v$[Ð|$`([fD|$@A$ |$0ZCY[Ð|$8 fVrf]|Mw ApV[fA\A$i ~$#L)|$` [fD$- |$p=Ay J$w|$p*[D|$0S=fATT$|$X6[|$`t |$P||$0[ÐA &|$`;[ ,|$@Ag|$8[ø {fA\b|$XAR1|$p&[|$i|$X [f.|$`F1fAD[D@f$^r$XyAk |$p&[|$p1|$[f.|$` [fD|$0$ U$sd |$XA*f7)$[fD1|$`[fD|$@u|$[f.|$`R|$$y + |$X5 [Ã|$p4T|$` |$X7ƒ$nf^u[fAMAn $[-=f|$`7|$`  Ak[D|$`2AzAa}|$0rm$ |$0X &|$0V*$[fA[y|$8wAb [A>O $1 w|$X;[fD|$@$|$0y} w~[DfS|$X: |$`\1|$[DÃ|$p2 |$`bw$N|$08[fI|$0e fACe$%[f|$X:U|$@O |$0$[fD|$8]|$p2H |$0x2|$@ |$`oT"|$@,$s[Ð$%ƒ|$X0$[D|$X:[f|$w$[@$?|$P~ |$@[@$za$[A- |$8$-$w |$X9[ÐAa[f|$XM|$@6 $TDg[Ã|$p,q|$X9[Ã|$`[Á[Á|$`]\|$X-9$\< wf^[Ð- $!m|$p1|$H$|$`[D|$`[ACZ|$0iY $Q$Vv AAh[fAV$~9fKA>$]v|$`7[|$X4[Ã|$@1[Á$[Á|$`zfAZ |$8 [Ã$g  q [ÁKwAM[1|$>[Á|$$|$@|$0e|$p5] |$8 4b [fD$|$`1 |$ |$@ |$ !2$ 2|$~$0d[ÐfAT,  [Ã|$[6 v[Ák[Ã|$X:fAQ |$p*|$0fBv$U[@|$`5$v f[Ar!|$`m[Ã$6|$`3[Á$P v |$@ [Á|$`|$8w [Ã|$XB|$8G |$ƒ!'![Ã~|$p kL$G$|$0Y!Ё|$` „t$"[ø[Ã|$8] |$pw!APQ!|$((D$[|$d $j[Ã|$X8$ {< |$`E{0$&/ /[ $v|$0K[Á|$`Ao 1fZ[Á[lÁ$/Avt[Ag;$ |$8 [Á_$[Ã|$8 $|$8 [Ã$Rw$[Á$E[Ã|$p)q|$8|$X [øfU|$` n |$`w [Ã|$0wh|$X6X|$[Ã|$8$S w[AH$a|$` XfJ&'%[f.fAX$|$8[Ã|$XA$k +$%|$P||$`{?[@|$8 e$o [Ã|$0J1$&A3w"$4.|$8/=|$`_=|$`I[@$+A~$[Ã|$8|$`9 [Á|$0|$`[Ã|$@ |$`* $$ju$x[fD|$p/|$X)v |$0Tv[Ã|$p'[øf>Q|$X4; 1fE[Á|$`_!|$8$JW|$pv |$@[Á$=|$@ $ [A![Ã|$8H|$@|$ [1[Ã|$0][Á$,v|$0D,[ø[Ã$1|$[Á|$`#$kvA[Ã|$8 x|$X&~[Ã$SAt|$@|$8w|$0IF[ F $m[Á$  | fA_fS&$z&AfAWu$99[|$0P b|$0<|$83,fQB+|$PP:|$p-[fCf] |$8} |$@t[fASP |$@|$X3Q#A @# [Á[Afb |$@ |$0m[Á|$`u $z  |$`a|$0o|$P„t$ <[At |$`" tfA]ioM$G?[Á/ $y [øfA^|$`[Ã|$pOwfY[Á[1$[Á$[Ã|$@"xv *[Ã|$X5[Ã${$]|$p& v|$X3[f| j[Á|$]~$Vz$Y[ø[Aƒ|$X uAzJ[Á$v|$H&[Á v|$ [Á$ |$`|$@ [ÁL $[Á$|$0SwF[Á$ _ A6|$` $|$X60|$p)[@|$`?w|$X;[Ã|$8|$X9! AA%|$H%|$8c%fAM54$9/|$PD'/|$`"v |$8~[|$` |$X|$?|$8f[ Ѓ|$0„!|$@![Ã|$X=v~ [Ã|$xƒ|$0Pu[Á@ A|~$Y fAa{ |$8a#[f.|$P^|$0XNTw |$X;;[Á- |$@|$8[Ã|$p7$cfAR[Á$w|$0i[Ã$$WkAA[Å|$8$I|$0'[Ã|$p/21[øa|$`$5$|$p.[f][Nø[Ã$3 v|$`0[Ã|$0vv|$k[ø[ø[Á$H[Á 2 A[Ã|$@0[ø|$@H $w ƒ|$ $ [Á<[Á0l |$@!$h!;[Á$p[Á [Ãh|$0gvA[Ã$a1 |$`fAYk1G"$6"[f[fC> fAV|$@ $. [ЃÃ|$05|$` .u$|$p)l*|$p#*|$X4**v|$0-[Á` |$p,I$|$@ [Ã$nfA` Ё|$`A|$X: 1 |$X8[Ã|$0IO|$` Ax- A[Ã|$X3$ |$0T|$@ [Ã|$@2fQfC|$8,[Ã$W{[Ã|$p/0|$8= [fZ#|$|$0bL'$[Áh|$0 |$X' $8  1[Á$K|$`.|$p,|$[Ã$M |$`&  $ [Á$? fU3 $D|$0fz'A*\ )$d)[Á$|$8_[Ã|$X7vfA^[ÁAv [Á$o |$0s&|$P[Ã|$[Ã|$0nnd[$PJ|$@ |$0b[Ã|$0a![ЃÁ[Ã|$@O|$X|$8ƒ|$$s[ø[ø[ø[ø[Áh[Ã|$0l |$p8[Ã|$P@A[Á|$`Z |$8`_ |$p!|$86'|$Xb'[Á|$` A[Á[Áu$v|$H[ø[1|$p [Á|$`_ $%|$p)t[Ã|$0^ [Ã|$0M |$B( rAZ|$@[Á$+ AJ [Á|$` $>[ø[A  f93 v|$`z[à $7[Á5 |$X8a|$ |$8[Ã|$@[A[Á$u |$0i|$ ''A[fCb |$0}|$09%[fA^ *|$p2fX |$p-7$[Á |$p7|$@[Ãd[Á|$`  |$P~|$H[AM$$|$`T [fV $a $ [Á0 < $[Ã[Ae$p [BÃ|$ fA^o [Á[Z |$X7A8|$8"!Ѓ|$„F=[Á$vA t[Ã|$X: |$p&t[Ál[Ѓø[AX ƒ|$8u$[Ã|$@ P [Ã$X fAX $T [Ã|$[Á$M v$[Ã|$8:fX |$m#ƒ|$8(M#$.<#[Á("v|$X3[ø[ÁV[Á[Á|$`vf][Ã|$[ø[ÃU$i6|$` [ЃÁ|$` [ЃÃ|$ $vfARF[Á|$`2d$jV[Ã$|$`9$$_ m|$0~b[ø[Ã$D" $=[fY||$X6ƒ|$u$|h[Ãfd3|$8[Ã|$8&[ЃÁc] ƒ|$X9tA[ø[A=fN |$@#$i#7"[ø[Áx [ø[Ã$W[Á?[ø[Á$%F[ø[Á$[Á|$` $ v|$0k[à " AF|$XS;[ø[ø[ø[Ã$q Ax [Ã|$8{"|$`n M [Ã|$0V |$Bv|$8,[A@= |$0'$$f[t |$X8[Ã|$@q h [ø[fY |$p4 fW$|$8v$Bp[Á$r [A 0 $$ [A |$@ g 2$[ø[Ã$  [Ãj|$ AK$|$8t|$@[Á|$`w[Ã|$X/ # fAWw [Á[Ã$nv![ø[Ã|$8RM|$`[Á$[ЃÁ[ø[ø[ø[Á$i[Á|$Ps$h$[_[ÁU[Á|$`x |$0v|$@ -[Á[Á|$`v($|$p0|$X6ƒ|$@tfAN[ø[ø[Á$[Á|[ø[Ã|$B |$p4I[ЃÁ$ |$0 Eu A>[Á A% 4  [Á  AS  [Ã$~W [Ã|$X3\ $% k|$8 [Á|$` [Á2 |$`v faV|$D$3[ø[ø[ø[ø[Ã$x[Ѓø[ø[Á$_ A/ $k|$X-|$p$ $k[Ã$+z$$[Ã|$@ $[ø[Ã|$P fA\ |$` [Á$A:v [1|$p3[DÃ|$8#|$[ø[AH|$p- |$@ v|$H[ø[fAP|$@[EfA[ |$X;[DÁ|$`  $Kr [Á|$`Kf 5 $2 $ [ø[Ã|$@![Á|$`|$p4v|$8 [Ã|$@|$0mAN|$X/|$0tA6A|$8x$c|$D$`[-k=cø[Á$`[ЃÁ|$` [ø[ø[ø[ø[Ã|$X8v|$8v$T[Ã|$@}|$@ [Ã|$X8|$pt|$X.b VNC|$|$|$`[ø[ø[fAb$}|$8[Ã|$H_[Ã$8r[6Ã|$8[Á$[ø[ø[ø[Ã|$8$[Ã|$p"$1X|$p'?A. |$XvfA][Á|$` |$` v|$[ø[ø[ø[ø[ø[Ã|$[ø[Å |$8 |$8[Á|$`w9|$@A$s$A w|$`[fAT$s  [ø[ø[ø[Á$|$`t[ø[Ã|$@H|$8[Á |$p.[Á |$`9|$X(.[A Z$i[ø[Ã$d A $ |$` [ø[ø[ø[ø[1[D@ø[Á$   1|$[Dø[ø[ø[ø[Ã|$X%%  |$8  [Aml[ø[ø[ø[ø[Á  D$`[-]A[ø[Ã|$X $w |$Xe |$< |$0[Ã|$p/w)|$8!" |$H||$j[Ã|$8\y[ø[Á$[ø[Ã$uw|$`![ø[Á$n [ø[ø[Á|$`wH|$X8?|$`[ÁW |$0t[Ã[Ã|$] [ø[A5ƒ|$8 Av[AE|$8 UA< x|$|$`[ø[ø[ø[ø[ø[Á}[ЃÁ|$`|$7 [Á[Ѓø[ø[ø[ø[ø[ø[Á|$0[Ѓø[fA[;[Á|$8 u  As [AB|$`<|$8w|$Ⱥ[Ã|$Xs[Ã$XfA`$|$L1|$[Ã|$0j1|$`V[ø[ÁIvA @[Ã[ø[ø[ø[Á|$`c|$` [Á$[ø[Ã|$8[ø[ø[ø[ø[ø[Áv$[Ã$l|$P6 [Á|$` w?|$0fF[Ã|$X: A&|$X8[ÃfA][ø[fAXS|$Hm$w|$`[A[Á#[Yø[Á|$`|$` |$`[ЃÁYAH|$ f\ƒ|$X9t|$`[Á$[ø[Ã|$X$A[ø[AS|$@ v|$8[ø[ø[Ã$WA[ø[Ã|$8w\|$}NfR~:w$[ø[Ã|$p$v|$`[ø[ø[ø[fA^$ |$X)[ø[Ã|$X:w7|$@ w)$v[Ã|$X:w"1fY[ø[Á [Ã$\w=A [ø[ø[Ã$vw,[ø[Á$O[Á$[Ã|$V[Ã|$X9|$ Ё$u|$@ w[ø[ø[ø[ø[Ã|$@fAWu"$_w[ø[ø[ø[Ã$Z$wkw<$[A"wA|$0Vw3$Uw [ø[Á|$`e[ø[ø[Ã|$X5v.$[TÃ|$X;w [ø[Á|$`[ø[ø[Ã|$8[v|$XL[ø[ø[Ã$|$p [ø[ø[Á[Ã|$8w-|$0$[Ã|$X8w7|$P|)$w|$8w[ø[ø[ø[Á[ЃÃ|$[Nø[ø[ø[ø[ø[ø[ø[Ã|$8S[ø[ø[ø[ø[ø[ø[ø[ø[ø[à vA[à [ø[Ã[Á|$8[ø[Ã|$p"[Ã|$~3v$|$$v$[ø[ø[ø[A[ø[ø[ÁvfA_1[ø[Á$[à t |$`e[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$02w$un|$p/|$8[A8$/[Áh[ø[Á[ø[ø[ø[Aw.Rwv|$`>[ø[Á|$`[fAO/|$`w1[D@ø[Á_[ø[ø[ø[Á${[ø[ø[ø[ø[Ã|$8[ø[ø[ø[Ã|$8!w`|$@ w:$n[ø[ÁA[ø[à vi tI t/ [Ã|$pw>w[ø[ø[ø[Á|$`[ø[ø[ø[ø[ø[ø[ø[ø[Á$wfV[Á|$`[ø[ø[ø[ø[ø[ø[Áw|$}[ø[ø[Á4[ø[ø[Ã|$X6v>$ow*fAV~#[ø[ø[ø[ø[ø[ø[ø[Ã|$8w|$r[ø[Á|$` [Á|$` v-|$@[fA[5|$X6w} [wø[fPA[A2[Á$v[Á$vL[Ã[ø[ø[Á$v$$Iv|$[ø[ø[ø[ø[Á$owA|[Å|$@v|$p"Z[ø[Ã$hv1|$8 w*|$ A=t|$[ø[Ã|$0|[ø[ø[ø[ø[ø[ø[AGw4A9v'|$`w$[ø[Ã$www[ø[ff.DT$ D\$pfA^|$0wX|$8|$X?|$h,|$(5< |$P8q$D|$X|$` 6fA]; |$h6X|$0U|$(X |$0 2|$`;|$8v|$XÐ|$0|$h4z|$`z|$`k$X # |$h"X$7'|$X&E0|$(-6Y@|$P:N@fD|$Xn|$8_$f|$h |$(Kl|$P |$h |$h|$0KfD|$(lE|$(5|$y|$`H |$0 v|$HW@*<$*  |$8 fD ?|$`[|$(c\ |$h/.$G-|$P!>`j>$4OGAN$$7fAC$i  w9|$h,%((Df|$`\w|$`Fv|$(vwށ v1|$HD|$Xnw$PxT$Pt|$0ƒkfAe`@|$8 }|$X|$fAT fAO'|$0l*|$ 7|$P;nD|$P"K|$P W|$hV|$0<VfA+Vf.|$hK$, ƒ|$h  |$X!Ѓ|$PA|$X3fD |$Z+|$(K|$(y|$8p|$h3#|$8f|$`Su$}g|$X |$(X-|$x1@$e|$|$ |$8$7|$Xw |$(yfAY}$& |$(J$tC+8v$9fD|$(|5A |$`|$ |$8$ |$h3fAEwA Y $u|$(X$ Á|$X 8$-i1|$DÃ; $@ pÁ$3vCÁ|$X V$P fAc  à 8O|$X6|$8B$6$|$X5v|$|$(Yf|$`I|$P,:9)|$X.&0fA\8$-%=fAT+ |$0 !$z*|$*@fAR|$P.AÃ2|$P7$&fAc#|$h#k|$(l|$(j|$?$ik(Ap*d*fA:NÃ|$(:fAS|$0AÃ|$h%N1$mÃ|$0*|$(Y|$wЃøÃ|$h3a|$X0v$FÃ|$xÁA|$h2y|$P9.$8:*(/$/|$0ƒ|$(bt|$xøÃ $Q|$h6FøÃ|$] fA_z|$X#|$@#à |$(}|$P:_%|$-|$8 Ѓ$„t>|$0i>fAZg |$X|$h,&K91|$0ffAN} If|$XÁ$kv|$:Ã|$ $&$fA_W/$Á$# | |$0|$h-|$03/ Á|$"AÁ D v|$@SÁ|$X 1|$jfA] |$P8o 0|$(S,;|$Xh@5 @A fA9|$0|$XÁ$ DD$0Ei|$\%|$P=;|$h+$|$` $|$@|$5Ã|$hƒ|$P*$  ! Ã$ }v$ndÃ|$8 N Á  $Ly $-=6AÃ|$8 |$P7|$0 ( #|$X7f.|$P +|$(uÃ|$3Á|$X |$0  Ã|$`1= |$8 ("$pЃÃ$s |$h3 |$8 $|$`/$|$+$6|$8v|$h$${V{$u Ã1|$HÃ|$(T|$`K= |$P.z)|$`?95|$X@|$h+Á$9|$8  fA;!|$@}A f|$(mz|$(Dr$R_|$P,|$$|$`sS u |$(k)fDøÃ|$@ |$Hٸ|$v$Ã|$J fA3$Ow|$8Ã|$2 |$( '|$`1|$ DÃf$G t|$0@øÁ|$XY"z |$`f|$(køAw|$(4Ã$N "1|$XwøÁ2 |$ $G4&|$0u`Á |$X3||$`x"|$(n"Ã$6øÁ|$Xa |$N|$P:1*øÃ|$`"X|$0Mø]fAV |$J4$IÁ$ @2$DL$xEÃ|$,|$X %|$H%||$`OÃ|$8$Ã$Y A $n,"$ 7#$ Ã|$0Á|$XNÃ$P0 |$X('$U%$$/|$h6Z6|$`"fA_|$X $1Á$ 1|$0 D|$0Á$ |$X |$x@.o v$Á$kfAP$""$Ã$R Á$|$ƒ|$PAÃ|$BZ $Á  |$(TB|$8 '|$@NÁ9Ã<|$h> v|$RÁÁjÁ$ $t /*w >$-øfAYB|$8 à |$X|$(I#|$X/|$P3/|$(04|$8 fD|$`hj $afA]g$N+|$j,|$:3|$h!P3$93|$0 .3|$`dMfA[fAD|$0`|$Xf,|$H /|$`]/ƒ|$u|$0f$ |$@Ã|$h/ |$P:@$W%$ l|$Xƒ$qe2 Y2Ã|$@-A${+v|$Ã$m|$`N$ |$XHA>|$X'j'|$`;wÃ|$8!?|$HfAQ[ |$h8P |$(c*|$h;'$&Ã$~$[2$|$h2R-_($lø1|$HÁ Á|$z |$P7 Ã|$`o |$xÃ$w6 $dÃ|$0$ Á|$(A m A|$(O*H)fAL)Ã|$0|Ã$TøÃ|$gI @ øÁV*Á|$X&0$ Aw|$X&øÃ|$(k$øÁ$ $ Ã|$0Ã|$0Ã|$(MM fA^$1 |$%Ã$Ã|$h* |$8|$XøÁ$ v|$X~  Ã|$h/ƒ|$H $  Ёf |$(o v|$P8Ã$i $-7 =Ã$ fA8 $|$0#|$`/fA~|$.D$X- = Á|$X9øøÁ7HÃ|$0ÃÃÃ|$0  Q|$P9Fà $z' Ã|$`2$:fAY~|$X 8A |$XCt|$X2fAM |$(k fA@(|$XBÃ|$(2iR$o R$s+fA\(A+b,$Q,Ã|$k $F|$`.C)$AÃ$&}|$X $ Ã$a $\ A&fAT&Ã|$(a? #$ (|$HA($(ÁJvfA^PÃ|$0k|$8fA^`$$$k%|$X^%Ã|$(S |$ A"$GM)fAX+|$P5+Á$ Ë$-)ÃNÃ|$$pu|$HBÃ$YÃ|$P0|$h%%|$XÁ|$X:Y|$h"|$"1|$8Á$y|$XÃ|$h+ Á|$Xà ; fAV$m! fA_~ '$KÁ|$X2|$0!$|$(Q|$8Á$3 fAP $A $ÁÃ|$(oY p ƒ$rT|$`z|#$ 7"$ ƒ$rt .Ã|$8Ã|$Pyg$IfA_ |$(sx$u $2 Ã|$`@Ã|$H |$Á|$X9 |$(?fA[_)|$h/T)Ã|$(<1fAVD@Áv$Ã|$`)C |$XÁ|$XЃÁ$mfA`$.vÁ$|$Xd $v Ã|$8m |$h'|$XÁ|$z$  |$h/øøÃ|$`!|$}Ã$WÃ|$8#\|$8ÃøÃ|$h9   s Ã|$H}$FÁ|$øÁv|$Ã|$8E |$8fAWF|$8;|$XøÁ$Ov|$h.Ã|$h/Ã|$ |$0"|$h+$ƒ|$xuLÃ4 |$`uo ##Á |$(KÁ Ã~Á;øÁ # A&v$øÃ|$0]ЃøøÃ$\  |$0øÁ  Ѓ|$`{ Ѓ|$h0ƒ|$H!ʄ> 2ÁF 7 |$P<$PJ$AfAXt8øÁ|$X$|$(røøÃ|$`p($$W1øøøÁ$Ã|$xlÁÃ$m|$8!|$0`!$ Á|$XZ|$X $  Á|$Ao$ya Á$.|$X Ã|$H|$8 vAÁ1 Ã|$h-vÁ|$XЃfAY|$(P v0 Ã|$P8M|$h-a1 Á$. 0|$"Ã|$`+fA<6fAX|$X fAR|$(døÃ|$|$`A$&&|$P5H|$8øÃ|$8v|$`#ofAQ?$uv|$AÃ|$h Z|$0|$(m„t Ã|$@Vu |$`ufAJw$Sc$ok _Ã|$h4 $|$x|$8A  ÁLA |$8Ã|$h. Ã|$0V $LÃ|$8|$XFÁ|$XÃ|$|$8$XÁ|$X)AÃ|$h+|$X|$|$HNÃÃ|$h1Ã$QÃ|$P@A v øfA]  à v |Ã|$81fAWDÃ$N$Ã$@7 |$X%|$` |$w8+1|$HD@ÃÃ|$x|$`tà |$h6$ Ã|$P/0|$0Ã|$8 wÁ$t|$P:RÁ|$XFAøÃ$< |$8øÃ|$(T|$HÃ|$(;E$41|$`N&øÃ.$Uv$vÃ|$0 øÃ|$`Q fAXJ$@ |$P.$|Ã|$(W $KfA\Á$OøøÃ|$8  TøÃ|$(øÁ${ $^  |$ @AøøÁ|$X|$0l$v|$0 fA_|$Á |$bT$ Á|$Xy|$h2$%w$Ã|$(T|$`fÃ|$0lfAP$Ã|$8DÃ|$!|$(6 |$P:à øøøÁVv|$Xi Ã|$0|$hv|$XÁbcøÃøøÁ$ vq6øÁ$w|$XÁ|$wN|$X% |$h, $^ 1|$HÁ øøøfA[O |$H $Ã|$e 4oøøøøÃ|$bD$Á$ !Ё !Ѓ|$(r„|$XSÃ|$0|$h0L|$8 D5$$øÁ$w |$P'< $UøøøøÃЃ1|$@øøøA G fAL|$@|$8Ã|$0øËD$0:w fAOÃ|$NøÃ|$0 |$h2i $Á|$Xw<  øøÁ$#w øøÃm |$|$XÃ|$HaD|$P<Ã|$`7 A  |$8Á$  |$ |$H|$$: !Ё „|$`#ÃvAø1|$HODÁ$ Á$$vt|$8Ã|$|$0 AfAQÁ$ Á$ |$8 øÃ|$0vS9Á $@øøøøfASI |$XwػÁ$1 Á|$X #Á|$X |$0|$X Ã|$P% ÁøA   fAX  Ã|$P4 m fACb Ã|$8ƒu|$`xκÃ|$0n |$h.G |$X#ÃfA,|$x|$PRw iøÃ|$0I |$P-$|fv|$Ã$Nx fASNøà + |$X øà  $)Q|$`+Ã|$8 X$'A5øÁ|$(W |$XC 7 AAÃ|$HNÃ$H}$-=[Ã$Iv|$P:ϸÃ|$8  $S2 |$(XJ 1|$8 Ã|$h  fAUi $l[ Ã|$(iÁ|$Xf mÁ$ЃfAU$ Á|$XZÃ|$0uAvøøøøøøøøøÃ|$h5fAPÁ|$X $c fA?!$$vfAP!øÃ|$PA(|$."Ã|$HA|$`=0+8|$h,øøÃ|$`%1$$4|$P0ЃøÃ|$P3fAW |$h,|$0Á}|$0l|$X X|$0MøøøøøÁ|$XGÃ|$$5 |$h%  AÁ$QÁ|$XÃ$0Z øøøøøøÁ|$XL ] $cI |$Xl ; Ã|$8 A H |$ƒ|$-6 |$X!( Ã|$P;Ã$&[}Ã|$`  fA) $Ã|$NøøøøøÁ@  fA^ Á|$ 1fAYD@Ã|$P2 fA[ Á$øÁ3ÁÃ$< ^ÁЃøøøøøøÃ|$XMÁ$ øÃ$X $U |$X# øø1fA^DÁ F |$xAøøÁo øøÁ Á~ |$8ЃøøøAøÃ$4w/|$`By1|$øÁ|$XQÃ$/øøøA øøøøøøøøøÁ3Á$&Ã|$0d|$`2YøøøÁ$øøøÃ|$`xÁ|$h5Á|$XvfA_հøøøøÃ|$0g|$`6VøÃøøøøÁw)|$XQ Á$/ v|$({1ø1fA`ø1|$HÁ$øøøøà |$$jøÃv$øøøÃ|$]HfAK$@Ã$tH+ øøøÁ$ øøøøøÃ|$8Ã|$(n|$|$0 U |$8 Ã|$P7øøøøøøøÃ|$8|$h/Á$$øøøÃ|$H||$P0fAS~|$0έÁ|$Xwr|$(&Áv|$0Ã|$h:w||$`F $ c|$@ Ã|$h.$t{|$Xg|$HNÃ|$`.|$X'Ã|$+øøøÃ|$0Ã|$`+w*|$([$R|$P:Ã|$h+wK øÅ` øÁ|$w2|$0 w$I øÁ|$XøøÁ$rЃà ƒ$tg$& wZÁ$ w"|$8w v|$0t7øÁ|$X ø1|$øøøøøÃ|$0øÁwfAQøøøøÃ}1|$@øøøøøøøÃ$|øøøøøÁ$øøøøøøøøÁ$ÃøøÁ4ÁøøøøøøøøøøøøøÁ$w|$h&v Ã|$(2vg|$P-tZ|$P5w=|$(3t"|$8Á$Á$Áw|$8 øøÃ|$0 Aw|$`w øøøøøøÃ|$h'w#$w|$(2ѨøøøøøÁEøøøøøøøøøøøøfAQ~$4øøøøøøÁw9|$h/w2øøøÃ|$}|$PDøøøÃ|$8w?|$X5w&Av wøøøÁøøÁ$øÃ|$`+>|$-|$(Y"$'|$ƒ|$0|$`$/øøøøøøøøøÃ|$8øøøøøÃ|$@|0fAK~#|$H}$JøøÃ|$P8v|$H~|$0'øøøÁ$w7fAN~*|$(-v#$v|$(HʥøÃ|$8v$øUHAWAVAUEATAH 3SfHnH8H DUhD]PDuHDD}xEdH%(HE1HARDU fH:"ASARPDž8HDž@HHHPHDžX)pE`PPE8PE0PE(PEPEpAPERUPE@QMXPH0VDWDHH@f&HĐHHuHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu)HHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9lf;F bEhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuifHHRHtf;B vHRHuH9<f;F 2EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu9fHHRHtf;B vHRHuH9 f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9tf;F jEhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuqfHHRHtf;B vHRHuH9Df;F :EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuAfHHRHtf;B vHRHuH9f;F  EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9| f;F r EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9 f;F  EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuy fHHRHtf;B vHRHuH9L f;F B EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9 f;F  EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuI fHHRHtf;B vHRHuH9 f;F  EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9 f;F z EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9 f;F  EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHu fHHRHtf;B vHRHuH9T f;F J EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHuQfHHRHtf;B vHRHuH9$f;F EhHfF"EEDDPEPPE PPE`PPE8PE0PE(PEPPPEpPPE@PMXUP PH0HH@f&HĐHHufHHRHtf;B vHRHuH9f;F HHfF"HEIHpHt!LeH`Lfop)MHELeE1EHEHEHEHEI9tRIw LLIH9uHEH]Dh HtHsLHH[HuHEHtH}HHpHtH`HH@H0Ht IHsLHH[HuHEdH3%(HeD[A\A]A^A_]ÐH&H(H(H0L%HHHH5H&H(H(H0L%HHHHH&H(H(H0L%HHHH]H&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHH%H&H(H(H0L%HHHHH&H(H(H0L%HHHHUH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHMH&H(H(H0L%HHHHH&H(H(H0L%HHHH}H&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHEH&H(H(H0L%HHHHH&H(H(H0L%HHHHuH&H(H(H0L%HHHH H&H(H(H0L%HHHHH&H(H(H0L%HHHH=HHHHt7UHSHHHsHHH[HuH[]AWAVIAUIATUSH(HHKHIED(1fE"fDm L9MEv fE9srLsM9t(LHL$HL$fD;h ,HxLHL9tLHHC(HH[]A\A]A^A_@v_L9c MLHL$HL$fD;h I|$9IĿfM@/fA9MHHL[]A\A]A^A_DH{(t HC fD;h w>L{MuIGHtIAW fA9rIG1@I1fDLcMu0DID$HIAT$ fA9rID$1IM9LHL$HL$LP IfA9IM1bEt$ 1fE9@]ML9{LHL$MHL$P If.L@tYLcMumDID$Ht!IAT$ fA9rID$1fL@/L9c L'fM L IHt7UHSHHHsHHH[HuH[]AUIATUHSH(H_(dH%(HD$1HLd$ HSHt8HAEH}D$C D$ Ht$LHUuHSHuI܄uXC H}D$AED$t^HT$Ht$HU1҄HEIEIHD$dH3%(u4H(L[]A\A]H_ E1HH;]0tHIHAVAUATIUSH(HdH%(HD$1HHA$Hu E IIHtLs HtALLHHC@HHL$dH3 %(uUH[]A\A]A^fL9tE H{D$B $t+HHt$HS@HL1HHHH+AHEHHHEHt LLH0HHpHtH`HHH@HHEHt LLH0HHwILMoLLR&9)9*8, 9g*ZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E_GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0GNUzRx 0-@DWE} F ] K  L ^ J U K  I M S g I C E  I W I ~ B S M f J X H G I B F ` H | L C M J N B F l L h H M K ~ J U K @ H m K z F p H s E H H b N n B m S S M ] C s E E K [ E ^ J y G ^ B t L @ P P H \ D t D ] S [ E { M k M r N G I C E F A F A F A U I V O l A t G L D d I b I i I a A v N t I y R D A J A c I ] I  F z F | D E A W I w I Z H @ I R I F I n A R I s A _ G d I A K { A d I F A G I a A v A F A F A K D b I G I m A [ I a I p A F I a O ^ I C A @ G ^ A ^ A R A \ A ` S o I D D G I Q I B O T I c A _ A e I ^ A ] I ^ A ` A q I Z I F I R I j A h I | R A A Y D Z I W I X I X I ^ A q A [ K b I C H J E } A F A H G v I I I I G b I } I M H q A g A G I Y D ] I v A F I o K j G G I I G Y I Z I m I j A n I P I S F S H x H w A u A E I Z G n A n I ] I j I \ I j I h A m C u A F I M F _ I Q I d I D I \ A v I F A v S Z L h A _ I ] A _ F h I T I ] I F A F A F A F A N H j I F A a A F A c I \ A F A T I F I P A G I ^ A G I R I F I F A G I ~ A Q I F A i I w A R A @ A [ F _ H k I Y O R I ~ A \ A G I _ I ] A _ I G I Q I Q I ^ A K A F I A I _ I U I o I j A r A [ A _ A ^ I R H A I l A P A m A ] A ` A j A b H k I k I u A ^ A h I I I U I v A U I c I F A G I G I Q I F I k A ] A \ A U I m I O I O I @ A F A P A P I i A Q I F A F A R F G I F I F A ` I ] I I I G I G F n I t A G I t A u I H A B A T I ^ I m A E A F I _ I F I j I K A U I F I ` A n A ] I G I o A h A G F i A I I v A G I | A a K G I s A @ A S I ] I l A G I F A H H ` I F A G I F A U I F A F A I I Y Q h I ^ A F A ^ A ] A C A F A F A F I F A ^ I F A F A P O F A F A F A ` A F A ~ A F A _ A F A F A k A ] A F A F F j A a A F A j A G I Z I F A F A F A b I F A F A F A F A ] A _ A I A F A F A F A R I F A F A F A F I F A G I O I F A F A E O _ A F A g F F A F A F A l I F A F A E A F A I H G I F A E I T H h I G I F A F I a A Q H G I F A F A y A I I Q I F A h A ^ A s I F A F A F A F A F A F A a F h A F A F A F A F A ~ A k A h A ` A F A F A F A F A F A F A ] I ` A I I F A F A ` A ^ H F A F A F A N I F A F A F A F A \ A F A F A F A F A P D F A F A F A F A i A F A G F F I F A ] A F A I I F A T I F A G I F A F A I I F A F A F A F A F A F A F A F A G F _ A I I S I F A F A F A F A F A F A F A F H F A F A F A H G G I F A F A F A F A F A F A F A | A ^ A F A F A b A W I F A G F F A ] A F A F A F A F A F A F A F A D I F A S H F A _ A F A F A F A F A R I F A F A V I F A F A F A G I ] A F A F A F A F A F A F A q A F A F A Z A F A ^ A K H F A F A F A F A F A F A w I F A F A f A F A g A F A I H ^ H F A F A F A F A v I F A F A F A F A F A F A \ A F A F A F A D I F A F A F A F A F A N I F A ^ I F A F I D I u I F A F A F A F A F H F A F A F A F A F A F A F A F A F A F A F A F A G I ^ A F A F A H H G I F A F A F A F A F I F A F A F A F A Q I F A F A F A S K F A F A F A F A F A F A F A G I F A F A G I F A F A G I F A I I F A F A F A F A F A e A F A R A F A p A F A i A V A [ I F A F A X A N I G I F A F A F A F A F A F A F A F A F A F A F A F$(`EA AH 49XE C Y O E S s M  Q  O b N  D Z F i W  C c E R N  C b F T D I O L L w I u K E K ] C n B J F y G L L b N I O S ] g I E K X P l D r N w Q I O j N n B z F G I W I w I j N w A ^ R f R N R \ L B N a G | D L D S U D L d \ ^ R I O l D G I c E L D q G e I V D U I p I G I X A [ E [ A ^ A j I Q Q q I  A Y I E I s A m A z J o A N B  Q F I ` A q A g A Q I f I w N E I G G w E ` A } I G A L I ] I F A F A F A F A a A Y O [ D K A e I m A J G u A \ A W I F A x A m I L I F I A J W I { E R I Y A L I b I ~ A m A v A W I X A L I O G ^ I L I G O F I D A g I S J k E s I q A Z I F I B A @ E S I F K L I ` I G K F A F G R I F A a A G I w A u D U I F I f A k A l H D I f I ] I y A ] A ^ I k A { A ~ I ] A ] I ] G i A ^ A L I A A k I m I p A \ G } A  A a A F A q A k A A A r O N R o A D I ] I h A B R S I ^ A I I U I h A ] A I I } A G I F I F A I I E O F I ^ A F A F A Y G F A L I ] A G I T I i A \ A q A Q H E I } A h A Q I f A  I w A D I ` I ] I t A N I ` A ] A O A c F u A h A { A ^ I W I a Q w I R I i I T I t A _ I E F ` I ^ I P A A I R G s A [ A y A F H F A X A F A c I S I ~ A ` A _ A i A D I X A P D b A Z H u A A A A I G I } I L I  A k A l A O D d A W I V I F A H A H O n F G L N A f A F A F I l A Q I j I B A R I _ H S I T A P D F A G H L I ] K U I G I p A \ A G I ] A I A j I b I T I f A F I F A D I F A T F Y A F A F A F A F A X F D I ` A T I i A @ A F A F A F A U I F A F A F A F A F A F A F A F A F A I I F A m A F A t I r A F A F A F A L I [ A F A h A F A ] A F A m A ] A D I F A F A F A F A F A F A F A U I F A G F F A ^ I F A H G i I F A u K F A @ A P I F A F I F A E I i A F A ] A G I H I E I D I F A d I F A F A S I m A G I F A F A F A l A j A s A t A F A N I e I F A j I F A Z I Y A O I F A P F U F D A S S W H T I F A z A F A F A F A F A F A F A F A F I k A G I J A F A F A F A F A F A E I F A F A G I X K F A F A F A W I D I F A x A F A P I F A F A L I ] A Y D F A F A F A F A F A F A e A L I k A F A E I F I E H k A F A G I E Q F A F A F A F A X L S H W I j A x A e A F I F A E I R I U I h I P I F A F A F A _ I F A a Q x I F A k I V A G I F A X I a H F A _ A F A g I F A _ I F A h A U I F A F A F A F A h A F A F A F A F A F A I I F I R I V A F A m F F F H H F A F A F A F A F A F A F A F A _ I L I F A F A F A ~ A F A F A L I H A _ I I I F A F A F A F A F A F A F A I I r A F A F A G I F A F A F A F A F A F A F A ^ I F A F A M S w A F A F A F A L I V I I I F A L I F K F A F A F A F A F A d A F A F A F A g A F A F A d A F A F A F A F A F I F A Q H G I F A R A G I F A F A F A k Q F A F A L I ] A F K V A F I O I F A F A F A F A ` A F A @ A U A F A F A F A G I F A G I I I F A F A G K F A F A F A F A F A F A F A Z A E A F A e A F A L I @ A c A F A F A F A F A F A F A F A F A I H F A S G F A L I F A F A F A F A [ A F A F A F A F A F A H H F A F A F A F A F A F A F A F A F A F A U A F A n A F A F A t A F A F A F A F A F A I I Z A F A F A G I E I F A F A F"X"oW,#=_FDE  ABH @#S$T#\EAG AB |#X#TEt G ` H m K  J W I  L ^ R c E { E z N _ A M C  G e S j V I O L L O Q ] S a O U K c M h H Y G E [ k E O Q c E a G Q O ~ B c M b N U K X P D D q G q G L D w I ^ B j N P P L D @ H z F G I s E E I I G p I v I \ A ] A D I h I l G P I C J ^ B Z F U K k A d I J A I I l A A D G I U I R A d C m S c A S I p I F A F I D A F A [ J l H @ A F I | I C I j I a I x A e I n I L A L I m I n I C A ` A d G U K X A l I c I W I E A i A Q I \ A B A U I N A n A ] I m A j A l I t A W I P I a A F A _ I F A L I K G _ G t I k H m Q J A ^ A N G J A H A F I B H Z A ` A R R ^ A c A E I u I G I @ Q Y G | A ] I a I Q I w A I I ^ H m I M F W I l A i I j I Z I F I b I a I @ A { K ^ I ] I b H b I Y A k A P I F A U K F I L I F A x A \ A o I V I E I [ A h F G I Z I D H R I X I k A K A y A L I L I H K q A K A Z I t A c I a A ` A Z D G I d A G I O I k I f A Z I W I L I  A h A f A l A l A W I W I n A p H e I j A v A C A I I H A q A Z H \ A L I \ A _ A H A [ A [ I Z I F A F I I I i I H G F A I I E A | A F A L I L I E I F A F A F A F A n A F A F A F I L H G I F I L I C A P I T I n A L I Q I I I x A F A d A [ A B I d A P H E I O O F A n I Q I F A F A U I I F T A L I r A G I r I F A b I F I Z A F A G I L I R I F A f I e A F I F A D F F A H A F A C A F A I I F A n A E H L I F A \ A a A F I F A F A F A r A F A Q I F A F A L H d I F A G I E A F A F A F A F A q I _ A a I F A L I B A h A F A F A F A _ A F A H A L I H K F A F A F A Z I F A F A F A d A b I \ A _ A F A F A F A F A F A F A F A F A G I F A o A a I H G F A F A k I n I F A x A F A F A X I F A _ I h A F A F A F A F A Q H D I F A F A F A L I F A Z I G I L I [ I F A L I Q I c A \ A I I F A F A F I F A F A F A F A I I H H H H j A q A F A D I h I _ I F A F A Z A o A f I o A D I F A F A F A F A G I F A ] A L I G I F A F A n A F A F A F A F I F A F A F A c I W I L I D I F A F A F A F A R K F A F A F A F A F A E O F A F A F I F A F A F A F A F A F A F A F A F A L I F A F A F A h A S A i A d I F A F A F A A A v A U A g H F A F A ` I F A F A F A ^ I F A F A i G X I a A F A O I k A ] A H A F A F A F A G I I I p A F A W I I I t I F A } A I I F A F A F A F A j I ~ I \ A P I g A F A F A F A F A Z I v A F A F A F A F A N I c A F A F A F A N I F A F A G I F A F A L I F A F A F A c A F A F A [ I F A F A F A F A F A F A F A F A c A s A F A m I F A F A F A N I F A F A F A N I F A F A n A F A F A F A K I Z I I I T A F A F A F A F A F A L I F A G I F A F A M I F A G I F A F A ^ I F A Q A F A F A F A F A F A _ A F A F A F A F A G I F A u A F A i A F A F A F A F A F A F A F A j I F A G I T I F A s A H Q F A F A F A F A F A F A Z A [ A F A F A F A c A F A F A F A F A F A U H F A F A F A F A F A F A F A F A F A L I F A F A F A F A F A ^ A F A F A Z A ^ A I I F A F A F A F A F A F A F A F A E I F A F A F A F A K I F A F I F A F A L I d A F A F A ` A F A k A m A F A b A F A F A F A F A m A F A F A F$4\EAx AA 4TE G n R  C m S o A n R  K L L t D  F B F d \ { M b N \ T W A | L r N j F I O  A U K B F l L ^ B o A n R H H G I A G  L | L R N Y G o I o I  H m K Y O Z N ` H Y G ` H W I R F p H G I I W F A F I S I | A u A P A B P ` H w A p A B E t I p I f G n G H G e I D A L I I A F I p H | A W I u I s R J N y I R D F A G I \ I q C ^ I W A H I g A Q I Z I | A v P J A n A m H v A m A J I _ I Q I ] J h I F A L I z Q Q I U I K E G O S I e A I I I I \ A Q F L I c I x A | A G I Z I W I H F [ A F A ] A t A n I [ G F A F A I I c K R I a I ` A ` I h A { A c I e I o I e H x P R I p M F I z A ` I a A W A P I G K F I J O } K { I Z I  A \ A X I a A b A n A ~ A T I F I H H I I V I A A [ A U I x A U I \ I y H U I c I Z A F A F A F I c A F A Q I i A F A r A W I } A W I i I F A F A a I R I y H k A } I \ A W I F I d I x I c I R I F I F I F I V F f A G I W I l I s P E Q i A O D I I n G U A F A w I ] A R I I I b I Z I _ I X I z A I I u A F I W I F A R I F A i H F K { A m A O I F A Q I I I G I F A t A U I \ A F A L I G I x A ^ I F A Q I F A [ A W A { A I I c A F I Q I ^ A G I L A Z I U O b I _ I R I  A T I G I F A U A F A a A [ I T A T I F A B A Z F m A ] I R I ^ A I I n I F I o A F I _ A F A F A F A s A F A E I [ A ` I x A ` A Q A F A F A a A e A S I G I F A F A S I \ A F A @ J F A P I L I P I | I X H G I F I F A F A i A _ I \ A F A F A q A U I F A v A I I ^ L  I F A A A F A n I T I G I F A F A I I \ A F I R I ] I a I e A b I p A u I F A h A F A ^ I h I F A F A F A ` A F A _ A T I F A F A _ A U I L I G L H K F A F A U I F A F A F A F A R I b H D I F I F I F A T I F A F A F A G I F A R I f D F A F A F A D I F A F A I I F A F A F A F A F A F A F A F A F A S I F A L A F A F A H K F A F H F A F A F A T I c A } I F A k I F A F A j A ^ A F A C A I I F A F A F A F A F A F A F A F A b A F A G I H A F A \ A G A F A F A ~ I F A L I F A P F F A p A A A F A F A F A r A R H E S ] I F A b A F A F A R A F A ] A  I Q A F A F A H K T A F A F A L I F A F A L I F A G I \ I e A b A G I T A p A F A F A f I F A F A G I M A | A G I W A F A F A F A F A F A I I I I t A g I F A L H b I c A w A F I f A F A F A e A F A F A F A F A G I g I I I [ A F A F A O I F A P I F I F A F A F A F A F A F A F A F A F A _ A X I F A F A F A F A F A F A F A F A G I F A F A F A F A F A F A F A F A D I [ I F I F A F A F A F A F A F A F A F A J G F A S I F A F A F I Z O U H F A F A G I F A T I F I h A F I F A W A F A N I F A F A F A F A F A \ I ] A F A F A S I F A F A F A F A q A F A F A F A F A F A F A F A H H W A [ A F A F A F A L I F A F A F A F A j A S A P D F A F A F A G L F A F A F A I I L I F A F A F A F A F A F A F A F A F A F A F A X I F A F A F A F A D H F A F A F A N I F A [ A F A F A S A F A F A F A F A F A F A a A F A F A F A N I c I X I d A F A Z A F A F A j H E I F A F A F A F A F A p A L I F A F A L I L I Q I W I F A E I EE,YEI B  D r N g I P H  B q G  R ^ B x P H H w Q  B G I L L  Q o Q H H  A e K [ M e S P H I O Z N X P d L T L W I U K T L L L N J s M G I S M m S ^ R N B s E u S z F i O ^ J B F G Q h P } K D L B N G I R I ` A J A L M B N | I \ A Q A Z I E I \ O q A T J i I G O  A j F l D K E G I R I S I m I S I G I W I L I F A D I G I F A W I G A U B L I { A E Q F A o I [ G M K q A [ A p I G R L I n I r F d I J A j A | A l A m I L E ` I O H Z I j K e I s O K G k A j L G I n I ^ A v A h A \ A ` I L I R K m I F A V I S O ] I F A N G L I F A m A q A ` I  A { A  A F A ` H T K V I A G i A F H c I F I Q I G D i A I I g H N A } A @ I l A D A l I y I A I Y G O A w A L I z A t A S D K M k I S I j A ] A Y I _ A r S F A W I \ A V I F A F A V I L A z A S I @ A  F F A F A r A n I e I v A A A o A m A F H | A [ I o I a I f A h I I I F I I I F I d A b I c A V I I I o I g A T F P F Q I ` I k A x A F A G F u I m A Q I L I W A Q G Q I \ I k A S I a I s A j I S Q c I f I G F ^ A R I U I F A E I a A \ A r D u A b I c A F A L A f A p K ` O X A F A F A F A I A J A S I L I y I G I T I F A b I ` A O I d A _ A [ Q X A L I r A _ H ] I O A b I i I h I F A _ I b I L I ` A I I [ A n A U I ^ A i A F A L I Y A L I ] I N A ` A Y A F A D I \ A F A ] A f I F A I I m F U I W I s A c A F A ] A F A D I F A ` A \ A F A f A M A k A P I G I F A Z A F A F A k A F A F A F A F A F A I I F A Q I F A E H F A F A F A F A P I F A F A F H F A F A [ A F A F A F A F A F A F A ` I F A F A F A F A F A g A F A F A F A y A F A F A F A F A F A V K S I L I F A K A F A m A F A h I I I I I ^ I F A a H l I R H E A p A L H o A F A F A E I Q I F A P I H G V K a I F A W I L I F A G I F A e I F A F A F A F A G I F A F A n A F A F A E I a D [ I F A F A F A F A c A F A F A F A L I I I P I I I F A ` A T I G I \ A F A R I F A b I E F F A R I F A H S F A F A F A G I F I F A G I F A F A P A R I F A x A F A F I F A F A _ A F A F A H H F A F A b A F A s A F A Y H F A F A F A F A F A n I i A F A F A F A R I ] I F A L I t A ] A H N F A F A F H F A F A F A F A R I F A F A F A F A F I X I F A F I E Q ` A F A W I G I F A F A F A F A Z I L I Z I F A F A F A F A a Q F A F F F A F A F A F A F A P I F A F A K K m A F A Q I I I F A G I F A Z I o A r A F A \ A g A F A F A F A F A F A F A F A F A P I _ A f K F A t A l A F A F A F A F A k A F A b A F A F A F A F A W I R I F A F A T A T I { I g A I I W I F F F A F A V G F A F A W A F A F A F I i A N Q F A F A F A F A F A F A F A F A F A F A r A \ A F A a A M I F A F A F A F A F A F A S I O F I I F A G I F A F A F A F A w A F A F A F A F A F A F A N I i A F A F A F A F A F A F A ^ A Z F L I c A F A L I F A F A F A F I F A F A F A F A F A F A Q I F A F A F A F A F A F A F A F A F A I I F A F A H G F A F A | A F A F A F A p I _ A E I G I F A F A F A F A F A I I F A F A H A F A F A F A e I Z H F I ` A F A F A o A F A \ A F A L H F A F A F I F A F A F A F A F A F A F I F A F A F A F A S I a I F A F A F A F A F A F A S I F A F A G H F A L F F A F A F A F A F A F A a A F A F A LW:U$WbEA AJ ,W^FAA l ABI WUEx C  N Q O d L v B _ A \ L p P F B  K r N  H  F ^ B K E Q O b N T L I O E S x P @ H O Q m C C M u K F J r F  E Q O ` H { E } K G I N B Y O E C Q O m C e K  D Q O N J n R S E [ E b F F I g I D E b G H H } R g I [ I d I z M @ A { I K A v A g I m I A I W I o A v A @ G u M R I h A ^ A q A m A H H b I C A F A O I X I B I R Q O A x I b A h I a I K A f D o A e A z A a I F J y O W I  O D I N I s I G I W I E I Z H h A U R c I S A s I I I ` A U I I I w A c A L I Q I ] I B F h A X L F A F A F A k H F A ^ I I I r A G I h I l H i A U I Q A D A F I [ I p I x H c I H A c F d A ^ A W I m A T I i A F A m I o A T K I I t H S I L I P I Y I [ A  A \ A ] A [ D I I F I K G m A q K P H D I G I ] I n A j A ~ A J A G I @ A I I N I h A } A J S F A X I t O H G L I L A H O F A k I F A A G \ A I I b A b A L I I I n I X I ^ A \ H G I F I P I ` A _ I H Q M A B I i A z A G I O D W D \ G S I [ A [ H S I R O L I m A G I v A z A r A t A s I ^ A P I I I D H E A I I v I R I f I j A I F D I z A ] A \ A _ A F A H K u I U F \ A I F G I F A h A L I G I F A G O H G S A a A S I F A ] I m I F A l A w A g A Q A F A i F d A  A F A x A k I } A G O ^ F G I G O [ A G F [ A [ I ^ F ^ A u A X I Q I ` A r A F A F A f A P I U I I I w D g F L I D F F A ^ A D I ] A I I F A L I _ A I I O I F A T I F I L H [ A F A j A F A F A ] I F A F A F A F A F A E I F A F A h Q m A F A n A O I F A L I F A F A I H F A O A L I F A G I F A F A F A G I e A F A F A x A F A S I F A F A F A F A F A F A F A F I G I F A F A F A F A F A q A I I j I F I ] I F A F A G I F A F A F A F I S I G F Q I N I F A F A F A F A F A n I F A j O F A ^ I F A F A F A F A F A F A F A X F F I F A F A Z I ` A U I F A [ A F A F A F A F A F A F A I I F A F A T I F A o D D I F A z A F A t A F A F A F A ^ A F A G I F A F A F A _ A F A F A ] A V A F A F A i I { A F A F A G I F A F A F A q A W I F A \ A F A F A F A F A F A F A S K F A F A F A F A F A F A F A F A F A ] A F A F A F A Z I [ A F A F A F A F A F A ^ O F A l A p A L I Z I F A G I F A D A Z I [ A a A F A ^ A F A F A F A F A J I F A F A p A [ I F A R I F A [ I F A F A F A F A F A F A o A H K F A F A F A F A F A F I K A F A G I F A Z I F A G I F A F A F A P A n A G I F A F A l I v A F A F A F A F A F A F I r A N I F A W I m I w A q A F A F A I F p A F A R I \ A G I f A W H I I T I F H F A F A Z A L I F A F A F A F A F A F A F A F A F A F A F A F A F A F A F A U A F A ` A F A F A F A H K F A F I W A F A F A y A F A F A F I q I F A S I F A F A o A F A F A G I F A F A c A F A F A F A F A F A F A F A F A Q I F A H H ^ I F A F A \ A F A F A F A L I F A F I D I F A F A F A F A F A F A F A G H F A F A F A F A F A F A F A F A F A F A F A F A Q I F A F A F A F A F A I I L I G I F A F A F A D I F A F A F A W I F A F A F A P D F A L I F A S A M I F A F A F A F A F A G I L I E J F A F A M K ` A K H F A L I L I F A F A g A k A F A F A F A F A G I F A F A G I F A F A G I S I F A H H N H F A F A F A F H M I F A F A F A F A D$tihEAr AG $ixaEA AH iYEx C y O  R \ D | D n J z F  G  A H P z F C M o I z N p P @ P Z N B F S M _ I j N ` P D L C M k E X P l L h P h P _ I ` P z N b F k E l L W Q a G A O d D R N T L [ E p P b F ^ J y G S E r N Q O ` P F R d L o A W I Q O A O S M H P c E w A y A G I a M G I M S d I Y I Z D W I f A a I v A r I U K y O Q O ~ J p I Q O X G j I X I ] A e A x F b I D A ] A { I Z A J K a I n I L K b I H M ] A F A [ I l A ` A [ A q A H H P C j I a A g D c I e I Z I \ G F I ] D F I g A Q I Y I _ A s J g I Q I G I \ I h I d I C A s A H K Q I ^ I i I K J D I l A r A a A { A G I Y I L G s A q A k A r G ] I k A \ A E A D I G I T I F I F A F A _ O ] A G I j I c A G I m A H K G I C R O I Q I n A s A G I t I k C w A v R l I _ I H G T I o I m A E I X I v A K P j A T I O I F I F I h I F I X I Z G e K S E f A E A p K a I i A a I d I R I l I F A j D e A w H ` A r A W I V I l I P D ] A d I Q I n A { A F G G I S I m I F K  A  I u A k A k A Z A G I q A a I ` I I A R I v I m I i I Q I N A s A \ A u A _ F ~ A  A s A t I ] I H H ^ H V G u A k I w A P D Q I F A e A y A G I a H R I g A _ A Z Q F I m A S K _ A F F j A x I c A ^ I E I ` A k A g A c I ] A n I I I F A l I G I \ I I I F A m A F A _ A Z A G I n A T H I I H I P I \ A b I G I F A F A ~ I F A Q H u D _ I H I R I z I j A G K Q I D H ` A [ I F I m A F A h A c A k I ^ A R O T F ^ D G O u A R H I A U I G L F A \ I F A G I ` A j A y A l A G I G I H I G I d A m A G F P G x I ` A T I q A F A F A G I i I F A F A G I V H F A \ A [ I E H F A F A F A G I f A v A O D ` D I I g I y A G H F A I H D A F I F A F A F A F A I I M H G F s I F A F A H F G I G I F A F A Y A a I z A F A ^ A  I F A v A H K F I W I F A F I H P U I F A F A F A F A F A _ A ` I Z A F A F A F A F A H I H M F A F A F A F A M I ` A F A F I ] A F A Q I F A P D F A F A f A y A F A l I I I F I F A F A F A F A F A u H F A ` A F A F A F A F A e A F I ^ A F A R I P D Y A F A F I G H I F R I F A F A F A F A F A F A O I U I Q I F A F A F I S O D A F A r I F A F A G O F A F A F A [ I G I ^ A F A F A F I O I F A F A F A I I F A F A F A F A F A F A [ A o I G I O H F A I F F A F A Q H G H F A G F F A F A F A F A F A F A H I E A F A F A \ H F A F A F I F A n A F A ] I N I F A U I G H F A Y I _ A F A O I F A ] A _ I q A t A F A F A F A H I G F F A F A F A F A G I F A F A F A F A F A [ K F A m I F A G I F A F A I I V I S I H I v A a A F A F A l A F A L I F A F A F A F A F A b A D I F A I F F A F A f I l A F A F A ` I _ I F A F A F A F A E I F A p A F I F A F A T I F A I I ] A F A F A F A D I F H F A F A F A t A F A F A F A Z I R I F A F A F A F A F A F A G I N I F A W A F A F A F A F A F A F A F A F I F A H I F A F A ] A F A F A F A F A F A F A F A F A F A F H E Q F A F A F A F A F A O I F A F A F I D I F A o A E I F A F A N I F A F A F A F A F A M I N I F A F A F I N I F I F A F A F A F A F A F A F A F A H H M I F A F A ^ A F A F A F A F I F A F A F A F A F A F A F A F A F A F A F A F A F A H I p A G I x A F A F A F A F A F A F A F A F A F A ` A F A Ft{^WEE F z F r F  N ^ R  C q G  D ^ J T L C M b F h H W A x P v J m K s M x P G Q y G ] S h P K M l D \ D n R o Q Y G g I U K e K I G T L l D U K @ H o I m S U K T L h P | L G I B N V G F I E I F H s A f I T I ] A G I W I A I v J m A ` I Y A J A e I t A y P a G z F M C o A l I G L  I r N n I @ I g I S E  H s A N F Q I D A ^ A F A p I F I H H q I Z G F I F I ^ I \ A V H F I | I R I l I h I K H r A s A f I D A w A F I Z I w A I J m A c A a M N R m A q A ^ G Y K Q G p I i I } O F I l I y K I O d A ] I [ K L I G I c A F A F A Y I E O F A b A E I F A I I m D V I [ A T I k I \ I O P C I w A n A b I a A L I w A s H P D [ A \ S L I g I h I s I _ I A I S J b I a A u A F I ^ A Z I  A A K ] I r F z I ` I ] A Y I Z I t A c I F A f O Y A F I K B P A { A G O F A G I F A k A F A \ F F A F A F A U H U F v A K H K I F A F A b A W I E O W I n A o F D I k A q A R I c I X A j A c A H A t S I A \ A ` A t A w A  A F I k F L A A A | I F I V Q i I _ A G I c A Z A D I O A I H F A F A F F Q I H K n A G H S I F A F A F A F I d A F A F A G I F A G I F A F A b I I H F I U I G I T H F K I I f I \ G e I r I j A S I A A D I U A o I s A b F U I ` A p A _ I ` A b I F A U A F A q A F F c A F A x A F A Q I o A g I o A P I R I k H F I | A j A U I j A I I H K c A R H } A F A S S D I F A R I j A F A F A e Q F A Q I F A F A F A [ A F A F A ^ I F A F A F A F A F A F A F A I I x A F A T I F A W I F A \ A D I F A F A F A F A W I F A F A F A F A x A F A b A f A ^ I F A b A F A F A F A F A m I ] A F A G I S O E S F A I I G F U I F A F A F A F A F A F A u A n A F A F A F A M A F A k A p A [ D F A ` I A A r A R I B I F A w A G H G O F A R I S I F A _ A m I _ I F A I I F A F A F A X D ] A F A F A G I F A F A F A F A h A b A F A k A G I L I F A F A F A J A F A F A F A F A ` A F A L I F A F A G I F A A A \ A p A Q A F A F A F A F A F A F A K A F A b A F A F A f A F A F A P D k A F A F A n I F A Q I R I F I F A F A L H F A F A G I F A D I g I F G D A F A F A A A c A F A F A E I F A F A F A F A b A L I S H F A F A u A S I F A F A F A F A N I F A F F F A v I F A F A o H F A P I L H F A _ F E I G I e A F A F A F A F A F A F A F A F A F A F A F A F A F A F A H K G I C A F A F A F A F A F A F A l A L I k A F A b I Z A G I F A T I F A F A F A F A R I F A Z A H S F A F A k A U I B A I I j A F A F A F A Y I W A F A F A F A G I F A r I l I X I c A F A P I F A L K F A F A F A G H D I F A f A F A F A ` A a A F A F A M I I I F A X A F A F A F A I I F A F A F A F A F A F A F A F A F A s I F A F A F A F A ` I F A F A F A F A F A F A F A F A F A F A F A F I M F G I F A F A F A F A T I N I F A m D F A F A F A I F F A Z A F A F A F A F A F A F A H Q S I F A F A F A I I e A F A ` A ^ A F A ` I F A F A a I F A F A F A F A F I F I l A F A F A F A F A I F F A F A F A Q I D I F A L H F A F A F A S I F A I F P D F A F A F I F A F A F A F A F A F A F A F A F A F A F A G I F A F A T I F A F A F A F A g A F A F A F A G I F A F A F A F A F A G I FXEx C T L  I  P I O  E ` P  B I O x P | D a O R F ` H n B d L g I B N ] S V J x P S U I O i O K M ] K w I D D s U j N g Q g I y G r F p H ~ R n R y O N J r F F R c E k E _ I ^ B E K k I e A R I G I I B B N I I H A a D R I F I L I d I c I ] A H G \ O n B ^ I g A G I d E t A \ I W I ^ A l A I A h A F A L L W I g I k A d K G L p A a I c A b I f A L I m I f I d I o A w S l I ^ E k A _ M | I e I \ I Y G t A F I a K ] A q F E I g A F K F I c A F A V K m A w A F A G A F A o I w I I D R I m H E K O A o I G I p A ] A C A d I Y I \ A G I N G L I g A F I E C P I w I F A h A c A ^ A e I X I t A C M ` A  D \ A ^ A k A M S w A h A u I c A n I g I V K T A O D F A o A ] A F A F A L I Q I F I Q A G I x I U I G I t A S C F A A H  A n I Y A  A m I e F U I ] I { I z I s I q I a A Z F ] A \ A w I F I D A R H G I E A F A F A F A F A P I Q I P I J I S I G I o A F A H K k I R I o I b F ` I F A r A l A B A F I E I u I d I C I ] I D F k A r I x A X I D I _ L ] I O A b A ] I G H F A s A R I e I F I i A P A ^ A F A G I G I _ A R I F A ` H I H i A b A X A F A W I z A n I F H v A F A | A F A S I F A I I G I F A X I F A X I q A d A F A F A F A ^ A k A h A P A Z A F A H A L I b I j I F A ] A I A I I h A G I a A F A T I L H G F F A F A F A L I t I P I n A G I T A F A F A L I G F F A ] H | A j A ] F R F B A I I F A F A F A F A F A I H F A F A S A k A W I F A l A n A H H T I F A r A F A [ D [ D e A t L F A F I C A s S F A L H I I F A F A F A F A t A Q I ] I F A F A b I R I U L F I L I F A F A F A W I K A n A F A F A F A F A F A F I F A _ F B A l F F A F A F A e A F A Q I R I k A S I F A r I F A F A F A F A F H F A b H F A F A F A F A h A Q I F A F A F A F A Q Q E I F A u F o A O I F A L I F A S I F A X I F A F A ^ I ] A D I R I F A g A  I F A F A F A F A F A G H ` I P H F A F A F A F A F A F A I H F A R I j A u A F I l K T I F A ] A D I F A F A F A W I L I F A F I F A F A F A F A F A d A ` I \ I [ I Z A F A | A E I G O F A q H V A d I F A P I F A g A F A F A _ I F A e I F A P I F A F A F A y A F A a A N G F A G F O I F A F A Q I F A L I L I F I q A F A F A F A F A g A F A F A F A o I ^ I F A I I F A F A O O N I F A I I F A F A ] A F A F A T I F A F A G I l A F A c A F A I I E I h O Z A ] H O Q F A F A ] K D I F A a A F A F A U H ` A F A F A f I h A F A F A F A G H P D F A F A F A F A F A F A F A F I F A F A F A F A F A F A F A F A F A Z A D I F A D I I I F A F I r A F A F A F A E I F A F A ^ A F A L I N I F A F A F A F A F A F A F A F A b I ^ A G I F A G I F A F A F A l A F A I I W H F A G I F A F A F A L I F A F A F A F A F I F A F A F A W I F A Q I F A V I V I F A F A F A Z A F A F A F A F A F A F A M I F A [ I F A F A I F T A \ A F A T A F A F A S I F A F I o A [ K T A F A F A F A I I F A F A F A F A F A F A F A F A b A I I F A F A F A F A F A F A U A F A F A G I F A F A a A F A F A F A F A F A F A F A ] A F A I I P F U L F A K I E I L I T I D I F A F A p A F A F A F A F A b A a A F A z A F A F I F A F A F A F A F A F A r A F A X A F@^(̞AJDG aAAH` FBE E(A0A8LP 8D0A(B BBBE m 8D0A(B BBBF (\AJDG aAAH8FEA D(DP (D ABBA zPLRx D$FBB D(A0L@s 0A(A BBBJ <lEC FEP.. B ,zPLRx  4   -7  |BB !PW>pW(`l9XXhoW=_$PSRs\X(T|\ T8@.,Yfp:Ub>^U hOZxa~@Y ^WmX @^:" A" 0"A" , = " !     + #Z av1_asc_agop_tree.cpp_ZNSt17_Function_handlerIFbSt4pairIttES1_EZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjssEUlS1_S1_E_E9_M_invokeERKSt9_Any_dataOS1_S9__ZNSt14_Function_base13_Base_managerIZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES3_E_E10_M_managerERSt9_Any_dataRKS6_St18_Manager_operation_ZTIZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E__ZStL19piecewise_construct_ZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjss.cold_ZTSZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E__ZN4aenc11AGOPSelect1Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect2Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect3Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect4Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect5Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect6Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect7Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect8Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect9Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectAEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectBEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectCEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectDEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectEEjjjijjijjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectFEjjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect10Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect11Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect12Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect13Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect14Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect15Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect16Ejjjijjijjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect17Ejjjijjijjsjjjiijjjjsjjj_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_GLOBAL_OFFSET_TABLE__ZdlPv_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT__Znwm_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS__ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZSt25__throw_bad_function_callv__stack_chk_fail_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_DW.ref.__gxx_personality_v0__cxa_begin_catch__cxa_rethrow__cxa_end_catch_Unwind_Resume_ZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjss_ZTVN10__cxxabiv117__class_type_infoEC$ %!&"'#a($A)%!*&+'+(,)-*.+a/,A0-!1.2/20314253a64A75!869C9>.9?:9997999>::>:>M:::>:::>::;>%;:^;>m;:;>;:;>;:6<>E<:~<><:<><:=>=:V=>e=:=>=:=>=:.>>=>:v>>>:>>>:?>?:N?>]?:?>?:?>?:&@>5@:B@BN@Z@hf@07)9!;h<=>-9<a<?)9<AB,;B@i=9BAE9F GH`7hH?9KI 4 HPpW"#h#D#PX#s##(4|4E@.WpWW>WxiiZi@x{ mО `  ӟD  0#9{D.symtab.strtab.shstrtab.rela.text.data.bss.rela.text._ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E.rela.text._ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT_.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1_.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_.gcc_except_table._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_.rela.text.unlikely.gcc_except_table.rela.data.rel.ro.rodata.rela.data.rel.local.DW.ref.__gxx_personality_v0.comment.note.GNU-stack.note.gnu.property.rela.eh_frame.groupX@ #7XL #:XX #?Xd #@Xp#CX #D j@@#&@,@6AA1@p 0# PA @ # }`DAx@H 0#D@x H#nEi@ #F F@ `#G&G@( 0#HC HH@X #0PH,&|H6H NHI@p x#!P $  p  _/25 0 0 0 644 2499600 ` ELF>&@@&%   zf9~uf9Dttt1H71fHH1ATUSl$hDd$0D$C$AÁ !w )|$x |$pr fAb|$xQ1>UN|$8X$.<|$p-[fABQA|$H []A\f.|$@ lL|$`/ E |$ B2Qwv|$pnAYQHlO4fA_@Rd|$8^|v|$`;@e Ly3|$x |$8>!|$x7|$pUS|$Hq|$84j3nvH]SfeG|$`)L$ P'$q EH|$xI`c|$@@\ pW fAV|$H%|$@Ad _x1 fD|$x =9 3|$p~v  ffAC|$@2|$8ad fMwg |$`)|$x+Uv}y|$`1M|$'6|$p8!3@N|$`-k< l|$8U|$`4t |$8ha|$x).B|$H f|$pX |$H z|$`'a|$@Q 5q9fAX |$ r'@fA`EW Q/|$py5g`|$(|$@ /$F$ y|$8"fA?*|$8K|$x-1abL|$xfGt5fDA|$8 |$8M <|$8Ed |$Ps1fASD^ fA`i|$@jfAG$L+sfAb89|$HD|$x'219|$@1Di|$xifAU|$ |$`3|$8Vg5|$ m@+ 1|$p3hfAYM7AZEr{f|$pV'|$HfD O3 |$p|$80|$x!0.@l UfAa%jD|$x<E|$ 5|$@%יD|$`7x t|$8<&|$x.|$@|$`|$pu |$x,'$'i|$@6Iq Kf.|$p|e$;|$H|$@-|$p|$x_#@|$H =|$`,|$8.+|$p2FfAWf bd_fD|$8[ |$8D|$ 4D$@w Z7$5rf$|$8.a'|$@3&H y|$@yd|$H=|$ ) .CfA\#Cw|$8t|$H  f$w# fAU#<|$x/Y|$x'v$!fD |$8Z{r??fD|$Pu|$`($ f.|$8cZ =)df.$vfAPfT|$` h7WwE;f.$ fA]T$- #8fAUOWyko5fX|$p9 |$8q|$ 2=+/KZ|$`:/w|$ _A\f|$p[U$|$xGq8|$@{H{h|$xg@ 1L@|"$[|$`1@?,  |$H|$x%2cZ|$@wJ|$ x fA_2$+  v|$p:wfD"|$`GfD $|$XP&|$@$@|$8\A|$@w AQ |$8J$fAV)|$H >J|$xeu|$x|$`<<u@ W |$X~|$p[B8_! 7|$x*:fAXHfARS)r|$`*v |$H|$`'yfAKkPXfA\B|$H|$`53i  f|$P |$@ fAc!Ёn „n?b?@$d' fA]"o|$8/#>|$p#zZ|$`^<;f.|$`|$H"|$x9%|$pUvv@w^|$8h fA[~vkfA_<O<D^6-|$@>SC|$p1tk|$`F6p|$@ IGD|$`,9|$x u 1||$@-|$x&2P|$@n{2Aa;e 00|$x' |$`; |$`6"RS$W!C y|$@fAS&AT|$x4ZA |$x1G;D|"0WCB|$8pua |$x|x U7<A 6|$@d/fA\w d l|$H6J'|$p4e<|$@ z|$`1%w.Dh Aw|$`($0 1 |$x/|$8X|$`0[L|$x'h N{HB{JfDt$ &G1w|$pX# |$`,|$H|$x<0TE'T@|$p8|$x.,|$82Z9r}o|$ 8ā#$Kf.|$@T!4$Q@)  CfA\ /Q V?{}|$p < |$8db %/|$ M|$H^O+f.Q*=?|$@o|$xw@gA|$xr_N;-EfAZ  ofA_NNLX|$@|$H|$XdlrdVD$@PA.|$x,,fAS@A3gfA'DqM4|$@B|$p! f|$x*|$`8fA[ wA ZI>;|$H)Wv SO $|$x ;|$pkO|$8.&$|$pa]v$tlbfAV(|$XC|$x.JfA\7 j,1|$`fAZE+ q q|$Hq|$XA!raST\4W&G,I|$x I| |$` $` |$P, |$H!!|$p0C2$La m@|$phHSK)r|$@, |$PO|$ #6-|$x4Z`|$HP$Hf.|$pS1|$H$|$@}-$(|$`F|$HЃI|$@4W"|$x32fAPUOv|$x.\|$@x?|$`e1fAeAF%|$`>*cJEXbƒ|$p|t'f\6 w>e$.yHb$D|$H|$x%fA_$A v |$p6fDfA]u|$`:.jt\|$@,26|$ B!!|$@2eW{u$E3|$8b(DO#|$pwY t$^|$x$BA)e*ɣ{+|$Hw$ ]fAS'/$%l|$`+l$ЃDC!|$p4|$@Tb|$8KA;' LA"fA^(|$HQ t|$p $(TLW|$x6W|$PA$b A AfD :fAX\`|$X|$@|$ppVCdVT|$pL 6|$8|A|$@>Mc5F|tv |$@,@|$x$mE?B=@j|$x 1|$p~%w|$pzUKf.|$psƒ|$`0t`|$`%|$`(  1$h_fA`ǎ|$HJ|$`A>fA`tvrh:N?$;dvN%|$p8(fAD<BO4w 1AyA /fA]I|$ lf|$Hqk!^F1.9|$pd[@|$x||$p O R|$80fAZ.K|$8wqЃ!D|$HF1 \fAF|fAK0I|$pn1|$x+!"1I|$Hp|$@0|$`5]Gu|$pv\vfA^5p$QF|$pvOev A=3!  |$P}fAb(|$x$1iA'i!wA`V|$pM||$ Y"|$8L!.|$8MHfDA fA^#|$8T"JFx|$@TeH|$HfDfA`3|$x:[|$pKAcf|$8<CX |$`%#C Ѓ|$HnE )M<<l1$Z FkJA7fA9<|$pnn5//fA_GG v$v$$  |$pU*$$,VS|$8H@l|$x$cRfD#> |$pf-|$Hs|$prc|$@L$P1A$|$ps |$HfA\ |$x77|$`*]>$$ [|$@|$@!Z$ta|$@@|$H|$@$  $ >P $V 5|$pW\?l|$`;ղ|$ ((r(|$@g(P;*1|$xA@|$pzCSwz|$@|$8iX|$@}9q97|$pTV~8|$8Tt|$8V&|$ vH u!fAd"U|9c:|$`aeR!?<< k0C|$`aK? f${W!|$8P`@|$Hq|$@ˤMG|$H@z+,|$ J|$pys|$`,;aARc7|$x9v_|$X x|$ D|$p\K|$HI|$@IH7#|$x> 1fAQh?|1ui|$`)K5 Fw#B8A% { A3@]|$` |$p884Ѓ|$@ w{Ma>N$m8$v"|$x0uFA |$`*A *$ G|$@ z|$`9@W  Q=$c|$x+Dh!|$p|B|$`"{ ~$g"|$HfA`t|$@|$xMWfA\K|$`C7%|$`-|$Hfl4u4  S|$xRk8]|$Hw ALB$~!"9I$qpD*xfANʿn|$(KU|$ |Zڊ|$@@JMJ|$xJ{J|$x%JfL |$H)$ 5>.|$x( B):3RA|$pcA骾f|$8Kb~|$`:|$`j4<X|$ 6!|$@6|$`'@fk |$xt |$xfD|$`ӽA  鶽|$8V|$pC|$@|$HL W kf.3-!TIfA8Q%$|"EN  JI*=dl$%|$8=|$@H}|$x  鲝M$o |$H|$xx|$x vMcY|$`5} >Ѓ6|$H%:lR|$@Ė!$fAZ!$'nt zfAOz鳜|$8co$|$8NMfA:!<i+$kT$ i+!$[]mfAUh |$x, |$HݛC龛Mep6 d6铛0#|$ mW|$P-2AM\6|$`'fAVO|$p$kiI|$x(0)КdfAW|:fA? s阚f鈚$elJ$H4|$x=4$.P v|$x5+|$pO  E=A 2y |$8D\$ |$x)$O|$8@fAb|$HYMfYG fATI|$XJȔ$:w< ${^|$XA$I J-2鵘|$H #|$`"Z|$pjfA\x) j|$ |$x!J|$8P|$XV.|$P47e4fAZ&|$H |$p{ ɗQ|$HI隗|$H<1A_$1|$poV|$pr&|Psu|$xu|$@M|$8U| fAT3t Җb|$@CX$vfA^闖A-$|$8PX|$x.l|$pl'|$8MQ|$ /C|$x+f#M[\XvfAT/A//|$Hԕ0fA\IUN fAU|$`=.|$x5.$y.|$ .|$pe|$X <|$`4&|$pvfA`8._$B%|$8RF|$@FJ$q ,fA_,黔fAR^77x 锔|$x'"fAJGk|$HM 0|$p1N$2 &fAU+ F$dB|$XzfAK;|$p)S[ )Ѓ锓ƒ|$x '++i5w|$xQGAv |$PA,fAO$|$@=<}1<Zv$M|$pK%|$8QIFZZ鬒%7y鍒$2I%8PIB  %vB8$wfA=>/|$`5+|$Pߑ|$`&|$x A)|$@A霑鉑|$xBAD_$(A@[ /|$piv 0V ӐG$ $|$ }U|$ Kv|$p}fAK7|$@ `|$pKP%A&OfAR\XI|$P^ P ?&*BVW(鰏N#|$pHӜ]JYCz|$x$wbX JO|$H:0P"|$p]K|$`':vfAX%E/$-)|$Hʎ[7R6*{|$x{锎|$`= W3G|$@ b'$';1'|$H+|$@m8Em΍fA`O鷍魍|$`sT5醍}%U^rwE;|$H u|$8h|$8R@j@$- =Ќƌ|$`7&|$x%|A|w 铌p(|$x*f|$@_$mn|$xH$zP|$x6VPh} =d|$`&#DvAߋՋˋ|$Hmʗ4钋鈋~|$`<x$|$xa|$(vI?A t(fA[R|$H^P{ v|$x(֊''鴊G1镊|$`).|$ppg8cq1G/|$pS,n|$x,n|$@ UEH&&܉y0fAQdo|$`>l|$Xƒ|$@l錉 .|$`8c|$ cFW|$p{5- Xl|$x1C t #,NsuЃ h2j ii鯈h韈< ,yq|$pO[q|$@Pq X$@fA\>(|$`6ZAZ|$pb3|$8jh|$x6h|$Xg чA Z%|$8P`|$@]|$`8|$H  u1e`|$8y%|$@9Oo|$pvq.$|$x95 i|$H |$`7 1Q\mˆfA7U,|$8?dd|$`\_|$x53'cwZd|$H.|$x,}fA],a|$X ,>3Z.~|$p+#~$?/|$Hυ|$@$)|$@kn馅OF2|$HefAMvez|$p'` v|$x"WM|$@)YfAX#/|$@:w|$x+[|$`5[8bd$0A|$x @/|$@ [k|$H/|$(r酄fA[e1|$@do|$x>efAQT<F-w^|$X4/K|$8,|$x,,o|$  {fA[{у|$x!,|$H鴃fA_"|$`鎃n|$`C0yn\fA]iN|$x,U-t!fAY/|$H|,Ar,|$p-4d|$p=E{|$x:|$HѰ|$HA鄂|$@'=f|$p0Vlzd?5|$H#h) Ѓ|$H#|$p vfAQ݁ӁT\ 鷁 /fASy|$`8dq|$@醁WЃw|$x:-ЃZH!mW|$`.[/v~$|$`=5,|$@y_ y |$x$x b V鿀|$8Ub)|$x9颀Ѓ鐀wt|$x:3;|$@t?$2"XQ|$HW|$X Aq\ e$|$8:^k|$HIkB0k.'k$-,ƒ|$(I|$@>fD$$ A*|$x5O4$ 4f̓~I44~|$@?Pr|$ptG$Wi~|$`vAS~I~fAN0fA*so|$H#v~~D~|$8L<|$x2 4|$ 8q N q}|$xs|$H}fA\O,$sc}|$H/|$8ZF}|$pd4|$@)}|$825|$ps'||$ 2l|$P4|M'<Avw|| 7|$@|$Xj|$x2d| 9]ЃI||$HB$1 {|$`0K|$H0fAT{Ѓ{{!|$8`L|$pL,'}M{{|$81|$H{|$`7|$X9,b{X{c/ z/`A%`$ X A {Q.Uz$ 6AnmS|$`5|$`.|$HЃzvz|$ O3MXzg?|$@}Ls}|$88&zz|$HW<ugЃyfA\34|$ *p!p|$Hyv|$x3yy|$8P<yvoyey|$`0(7k|$ppޞ6y}[|$x2.|$PJ|$HxxAr/^ x|$`6(|$pQkfAak|$x>|$HxV~x kxD)wt|$H :|$pR9xfADtJ|$XO{|$@qHx|$`:|$H vmww|$`0E3|$8GAЃw[EcI`|$ `; }w|$pzBq,q #qSw @wE11 !w|$p2gk|$@_v|$Hv|$x 5D ƒ|$x{ ov9vfAT<,>$>gv|$x T|$`S$-0(vfAV;L|$Hu|$8>1|$Xu|$XS6ufAQ+|$ ƒ|$@ u|$8Euzu +E==Ru$Xwu|$ 9u|$8o`$u ttt8u6Ѓtt )|$`<bsfA_qAt|$`_#fAh;{ |$HYtOt|$8E1|$H8mfAZ A OvttsfAK||$x|s@|$HsX 3$a<|$@s$_oP$Ts-1|$x&1Kc|$@ cssfAa,|$(El9l|$Hr'_`Awrrr|$H 97 |$x-Ml0`r|$`3wgBrfA`0|$ 2.;|$x2~$Y OqAvGqq|$8 |$@qfAY!|$x:q|$p-/n:|$`LЃ_qfA[s|$H/6q  |$`*DO q.'m81|$`p|$`Fp|$x%^*|$X {$R|$@ p\ vpEm(?r\Ep$ +!p|$`6p%pRDgRo]!|$`1wAoo i|$`,,fA]8 oP?#3l2|$H*7W v|$8MUoKofAO1|$@".ooo>MvAnn,C AnnnUcBnnЃ~n|$Hln|$xR|$HR$`Ѓ?n(,nGJ|$x v4 nnm|$x8'Pmmm|$8OmAm v$ mvmlmYm Fm? 3m-m'v|$@v|$`9v^v|$Xvl!Sw]vllRC|$X|$@yt$bhXhNh$Hy8c8AY8h hh`ggg|$@gg|$8CAQ|$HP|$pNУfA^|$`2Q95k4^gTg|$p~S|$`S4g# !g) gfЃfaD_v|$pffQ|$8wffffxfnfdfASfIf?f5f+f!fffA`n|$@c~|$H`$w|$pu1D@e b$aA|$H@8teO_e|$HMeCe9e/e|$@ 0$ 0E/|$@"FfAh14Z|$`,v|$XdddFva dddd$#|$`nd|$8,fAd.V#|$ 'fA_gD$@7. d|$H_YЃcAQv|$HccrЃccc v|$x,}cscic|$`=OKcЃ9c/cr@|$H^Rbbb|$pa[@bbbAB;|$x-$;b|$`*6|$pb0|$x%sb;fZbgO4o  4A ah(b4Aw|$@ baa$ 7fAbOaax:AkfA`7;aA66Yz6]aSa|$@0MfA`9-a?2|$`)#`v|$H```18|$x1`|$8?=|$x 4=``v`l`b`O`|$@!=`|$H 2|$ O4cMA)|$ B _&76A_)1)|$p_|$H5x_w_m_/y/|$@[/q|._F)__1|$P^|$H ^|$`1.sP3|$pg(^|$@U3Ax^fAU@3|$83w5U^K^Pk/$o *^|$X5|$ 5|$@*]]|$H]A]*/|$ 5]]@Au|$`w]m]|$Xr//L]B]8]hƒu0] ]]\|$@EQk  Ѓ|$p|u\\\A\\LGE|$`%L$|$@|$`)Q\?/?v|$H!\\$FB .fAbB%^  [u>$4v\[{[q[a[W[AF[ 48|$H Ѓ[:|$@:Z|$HZ|$ <_0_Z|$xZZ|$8_>|$pZ|$8FuZkZ|$p'89|$@.9|$p$:|$x# N Z0(<$g<E;YYfA]A AkYfA_?$>A$`vMuYkYaYWY|$`3B>fA\Y3|$`1[#Y|$ps5|$x&ƒ|$HuXX|$H OvXXXXA>AXX 8<V fX|$H > u>EX$kwZ'XX|$H  XXW7fAa7$. $ |$H <W|$pQC|$x63C \WRWw?W|$@ 15$WfABO|$p N|$x,%|$pVV@T;fAI;1|$H V|$@5 vJЃ|VrV1^V|$@6@V|$8q1$1V1A D@V|$pv$ UUB v|$pUUUAt|$p 5tUvU|$pIg0zXUfAb{7A_7 …zr=qrU=v~UT|$p0MMT Z4IQ4TA : oz T|$@!5|$HmTf6fA\6|$HGT=T3T)TTT3`SSJfAJJSZS$1|$p 0S|$x6qp]v |$`?^STS ASfAL4*q$S$8..\$$RA lRfA\\,|$x,>,R|$H'J|$ x$<OR$?R5R|$pD:|$`54|$X(LRAp+|$`8A ~LvQQxW QQ| Q|Q lQA IAv2?Q5Q|$pT#Q|$x+T|$(|$H|$8'^AJ#P|$H{WoWW|$`2 7v viPPY5CvP|$x#|$pFaMPCP9P|$x&BLvP PPO" O7R=d <=0=OOO1fAaO|OrOA#K$SOv:O0O|$@3OOfAVJ|$`8v|$ %NN$D MKfA]KfAL |$x8|$H VfATKfN SNINfANzS+NN|$pL v|$XMM9~|$`8sMfAEiMMM L;|$`-A;KM|$pb:bM|$X;(t;ME`>DTfAbvLLL|$@ Cfv:LLLL~LtLGF:>XLNLsI|$`6 vfAPLL|$Xg9" ЃK|$HJfARH|$@ uK,JJK|$p0W$~WhW|$HbK|$8P1ADEKfA^|$@K$paA\J|$H4LJJfAGJ|$pbJ|$HevO|$HDJ|$ppAAZJ|$p%S|$H=JfA^D7Jh J 6w fAaIII ЃII|$8?Y|$X I v|$x!IzIpIv]ISIfAc|$`*I I|$x"|$@ =r H|$X}?HH|$(5|$pT|$`!a6>\%FnH[HHHDy|$x1#H-|$XOH.;G|$8sG|$@  N|$x3HAӰ7v|$HGG tGfANAS|$x6WG#JvA4G*G|$pLfAUJ|$@+k|$HFfA7v|$8/kF X6|$`:5n|$@n F|$pYt qFgF @fA[@ vA9F/FlV|$x*FNE|$`zH|$@^FRFEEE;;KvEEE9oEm2|$H> HE|$@6E|$`9'E|$H E|$H˧D|$P}DD$OfANwO|$`?O<D|$pn3|$`<J31|$XD`D UE|$HJE9D|$x"71D; |$8EN vfA\CCfAJR C|$`5  A v|$HCC|$@0TxCnCE3/OCp?C5C x>AfAZTL Bnz2Q|$@B|$ ;"AO|$`6 BEFB|$`)J|$p5)^BTBJB@B-B#B v |$@ AA|$p> iAA R"W|$xWA CCxAhA^AE|$Hmyv|$x./A%A|$H"J.$ @@=6D@|$`"/$$-@9G|$@t@}?|$H|$x6~<@M|$PI3@8@?EfA_PE|$p ?Q%???|$H/ /y?QgP1W?M?C? )?fA`]$@g|$Xg v|$`/>>|$H>>fA_GE/ |$ w>>|$p$/?p>]>|$XN>B$|$H(/>|$8b|$8Rw|$H>:w==C?|$X>.=fA6J0I=|$x02aD2|$ ?d=Q=$L|$8HUDU=|$@R7D$`=w v <<*w&Jp8888,88vq 8}8s8i8_8|$HM8C898/8%8Ww<$ iPv|$x677|$@z77\|$`8k|$x(77fAaw|$p,|$`>k|$P&27kAΥ|$xCp 6|$@wb|$ D |$HSץ6vMfARF6|$xE6: y6o6e68 {I{|$`-=6$$6:|$H/|$piߐ |$8Ex|$@Ѓ5e$Ѓ55m|$XPb n5v|$8LV5L5B5fAV|$HŅ|$@g@55De|$puh84|$xW;T|$@|$(ƒ|$`29{4fAL$5HfASƒ(|$@|$H  4w)M33A<$C~3?|$@VfA`|$pq33|$xn3fAWxJ83O#3Ѓ332|$x2|$`8|$HfAZ$E΂|$ 2fA`22v2c2fAa|$x-,fAaތ|$@Ɍ|$`3v|$pl2 2m1v$$11|$ %||$`15w111|$@v|$`<vvdv|$p{vI1?1)uu&   1Fv|$ 000700fA=00u0k0a0$|=030y|$p^YfAVO0//|$ w'/// /|$  Ҧb n/d/AQEB/8/|$`v //$ wO/eH... .|$pq.|$`4w:Qw5.|$8ow.Cg.]. J.:.|$P($ .-Bw$------vfA\-z-wg-jW-|$x3wAfA_ ʝA-b-|$p]T7Ѓ,r),e|$xƒIu|$pw,,|$@6PJ,@,6,vF,,A{|$`@ˣ|$p!|$8` Ѓ|$p ݣѣ++++|$x3$iO+|$P|$XO-+|$8M|$pg @ |$@**|$@|$Xߣ~ӣ*fAb|$H͜@*{*0|$H|$pO*Р $** '`7Ѓ)fAak^}k)) _|$X_) Y|$pC8 z)p)f)aܞM)s|$8aH|$`73$ž((% jj(|$piw6|$X(T(?|(u m(c(Y(I(T6(|$@c$ @$ƒ|$X" Ѓ'|$x+'v''' '5 t'$ S'I'?'Ɯ#'7 wFXVΜW œ&xٜ|$H&|$8jR$eRzR nR|$H JR&M (\ \h&:U& B&8&A'&&& &bD[|$x9[%$SD$H%%%|$x5w=lR%|$`.RA k%fA9R|$pRE%fAagAAg%g%%AQfA^Q$$$$ iQ|$@!ƒu fA_VQ$|$@(Ѓ$Ro$|$`*P.vfAaL$B$|$p>T|$@T6\| $|$8UC |$pw]fAWbT##fAFM M|$`>cMA >|$`/>\%$DwQ$O=|$H i> fA`g]|$p3vjE;1'w |$`9< <1|$HD@w!|$8Cv|$ zp|$`.^|$p.;|$p ;|$@;|$x2;v|$`A$1]1A|$H ]]oe|$ KG|$@)TfAUTT:b]w'|$@t$ }dHgq J|$`?G{G A7-#\}] \$ |$H +PfANM\"\v|$x3yo|$pw5t[A[fA\~=3[\ w(OjQ:v|$H|$`5Q7vK$ |$@Cw_w|$@3{qja_|$X SUsS4$Q |$pc|$X~ |$ *_GfA`JG >G!G^GxfAb+F|$`#FPFR3|$x:~Q$fQ2  VP$+Pv|$H|$pe!wg]Ew9B|$@ R|$x+mR>S$d#SqwmFQ|$`0Q|$@ rQ|$`,]Q|?QQ|$xQfA`[U|$ FU]M?:D|$pADAD$DqD D? MA M$Ѓ fAfAH4|$`1"|$@ "! AOUX$L|$@ Í|$H  $=3)|$@ws|$`B׌|$HW9i|$x7Ȍ1 |$ r G|$Hxn,  |$HP^  4|$@{|$`;y{|$H |$@8|$pt8"w(X*|$Hvxn$|$HKS8A*)fAZh|$H[n|$(fAWc Ҝ|$x3|$8 Arw4l.v$ @6).ƒ|$x%u| U\ ~3|$Xo3/ 'w=$v u |$`!1|$PT J |$`8|$H - $ |$x 2 |$@s|$8@sfAVxsYs|$H |$x%cDO Wo p|$HQ |$`+@  |$`)  fAZ|$`%k B|$@-|$xv9      _v<o e [ @JE ; |$`CnfA]k|$Pʔ |$@|$`98mc  ~;mmL0v|$8i  |$H|$`Kw Y~|$H G = |$XN e|$`:V|$ 2_ "        { q g |$`j|$p<5D$xj|$Hj, )!|$H!R H|$x+w|$ D-n4!nЃ$w%hOSc@62v|$P!fAU|$HvЃSЃt}|$(ZfAa7|$x"|$`.5>,v( sfA\esuEs|$x"s|$HE1}|$8?|$(A=J :0&|$H D|$ )$qu@" !dAvzcP c1fAT.|$x %|$8y`|$pw'|$X}$1fAToc~tj`AOE1fA_D2|$`5 vfA^|$H|$@ $ |$8Tӏ  ЃrARbה$wv"|$@ޞ|$ m|$@Z|$@O @|$@5$|$HN|$p&8|$`=|$`7v|$  w|$@v1A }$ JAGfAZ- 0@ v+.$ @fAa|$X|$H!Dt |$p9id|$`:h^ Nd.5A|$Hc uhI|$@c|$`7VR |$x3$/  Aj|$HNvAe |$Xr|$p]Q]S3$jAW!|$H0 |$x'|$H1AD|$x/|$8zE|$P|$Hyo fAA|$@( mfA`~~2("|$`5"|$p)#|$xH"|$`7Q|$`9wpfAY}|$x8fA |$pH`(d|$`,d+-fAa-|$HDw1||$p"xw&Dx A l$ G |$x,=2|$pi' AЃ  kefOv|$8j7|$`7" \fAY_|$`8~|$81}|$`$)fA07 0|*||$X" ||$`- v |$H]|$`Av$ oo$_W&}( <)OfAFWewR|$x8݉jĉ|$`/|$8^|$x.A}}a}fA2}}"}j,W=78|$p|$ xfAYufA9uu|$Huzz |$`%wHgfAS7WA-W|$HW-nЃpAvuYOE;Kwpq W!WGW|$pSEWx $  VUMU|$HUVf|$PvHhtA& |$pu`|$`}`>LfAdaiafA_FaM(aKaU}|$@Y^|$`6VVEYYfA[~EЃlYVYAYZ;?V|$HVtw$H]w]VX|$@DvX<2(|$@ hLfA1Y,XJ|$ $|$@9ZЃrKbw5HYXfA[6X|$x,wfAZ/%\fAX[p \Ѓ|$8|$Hz J|$x*|$@] $CW|$@WfAHu|$H u1D|$8@ |$x 1|$`?FoS=oAv|$`8wAi_g Iv|$@"1'|$8R|$@d1|$X6|$pv0s|$x!s|$`4r|$pw? |$X # |$@ |$8EeAs|$ 8I?|$H -|$xcO|$HuT?AZ ;fAFO|$H |$pCj[Q>4|$H> |$p>|$pZAA|$@]|$H|m]|$8IHZP|$`7Z 2(|$x/wr$x  |$H|$p(WQ|$H/k&|$pPwzpf|$p.Qwm$wVlv|$H |$HЃAw-|$x+v#vw}|$@\|$HwNw!|$p>v|$x6,|$`/wx|$Htg$vZ|$p4vrnvcvQCfA[&w{qgrTJ@6,|$@iuUw,|$@|$P~)z|$X|1|$`9w HvscYOEvD/%|$p |$`/|$Hw|$(w{:|$H7\RHjw|$H vn|$p9wTAwD|$`Aw=|$xBw"|$X}w w=fAQNut"|$@IvXND`%/CGvxnA]J@6,|$Xƒ|$@*t~wv|$@h|$p=A !|$x;wb|$x4wDwq}|$8]vKe[fAO3Dw3+!z|$ rw4|$p8vfA\|$pwVfAK~E|$H|$Hw@|$8Bw&|$@vl[YO@?5+!|$x.:|$H wYD@zIfA`aAw>|$@u"Au1fA`|$`5ЃtvK]SIw/|$@w(0=w-|$H ww|$ 8[wxw7|$ $w0wPw5|$H wЃu1|$XcPFWh^TA7$|$8ZCJKfAEn|$`=K8A|$x8fA7Vwe$N wEfAC~4Tw|$`BZPx=3 |5 wRZ7Aw.|$H=|$ }~He!O|$Hw9}0&w2ew*Aw7|$x4wsd|$x1w&|$H{ h^T|$@s0&K|$x3wBA|$8CfAB|$8=;cv&3w|$@Lw!|$@wfA[~ta|$HO7w:7}W|$X}5Qv#DD$@5wW wR|$8_wt|$X#c$wYuJfA[,AwwfANOh^T$ w-4fA\&EhaHwV$vLJ w'$v|$p xnCwBmS|$@vh|$@wN wP|$@vi6v"nv|$x$ v|$p|$X|-|$x8v& W /{qgZPwfAT~7-#|$`9w2 fAV,~w w+AwfANv_oe[QG=Jw%|$`;w9$vnЃwmcYfAYCnw;_ 7-# ^ {7 A fAa |$H  # fA^  QGw. vw(|$H wt|$`-vmcv3fA^"|$X ~{qgT$hwA`4|$H wRAwB$w5w>JwH)w#vfAbs0|$x/wU|$p4T_|$8]|$x&|$Hw.|$@w'~=|$`9w|$pyv,|$H|$`0w|$@OxO|$x|$@ 4vQ$w1|$H  |$8UvG>w-|$HswP w2AD~|$@lEVzP=|$8fANHA|$`/|$x$|$pML|$H7|$8ZЃ|$ 0l|$H]|$@2wFw$|$x v$7-wK$vB$w/wɺOv$w6XNmw4w%|$x82|$@]w!|$`4v"|$Hv |$XOl@vrqg|$Hv)|$H EI|$H7- vAvi|$`BwL|$x)v;fAN"|$x2wf1fAY|$`Gv7w2zpf\RHy5|$ w3|$`=w"|v|$HЃ|$`7w".v|$pJw?EuJ$u0h^K;1|$X}Ѓwl|$`|$x5v-|$H w2ЃF<2(v 9v |$x"wfADտ˿鷿$t4}%|$@ 閿郿yo&v|$@WM6:|$x"v% |$x9|$Hvؾξľ麾鰾馾霾钾鈾~'k|$pgETJ@6Av|$@  <|$x|$pq|$@ .wD|$H髽|$@w}|$xwT$5w4w"5wyf\I|$pVwd1'|$Hw2w 5vF7|$@,Ǽ齼|$`1髼顼 wA w/Av)遼w|$x.w1t-bX|$pTv|$@?5+!|$HwP|0w-qʻfAY鰻馻8閻w|$xu}siwy|$@OfAX0|$@ Dt"Aw v1޺ԺwBC鹺驺v|$x'銺逺vlbX|$xwd9>|$89|$x%fA]q|$ w?-v-w|$x vٹϹ|$p '|$@|$x#餹|$85$X$v|$8+Aw;|$@ w4UwFfAN/v+!1|$pBw<|$`,w"|$p4v׸ĸAvn韸$$ƒ|$ t-$w#q|$@w8wXND:0$6w;|$xwHfA_~7|$@wq޷4˷|$Hw/E駷靷>Ѓ鋷|$@ $k$w$Qw4wAw 30|$@*L|$H'gA߶:w4$w鷶魶飶|$pwNfA["|$x1v}s@v?%v:6v+\N.w$6,"*|$`9fA]|$@|$@ w8Ƶw}pvTV页w1v|$@z|$@!v`VLB83w|$`*w} w"|$`/wߴմ|$8Gtc|$`0v\驴bw"|$@vv|$Hg]S<$0fA`Et{|$Hw?|$x)ƒ|$ t!:w|$H|$H~h|$p1fA\D鮳餳|$@v|fAYk%郳A2|$8E |$`B|$`3wTfA_&1fAW+!|$H|$@Av{|$pvt|$x.wZnv>|$`9w-黲|$H w'o顲闲鍲郲pf8SI|$8Hw?/|$8Bwg|$@tV|$pv2$#w%;w3ޱ˱鷱$|$8Fw=|$XOfA_K|$`.v:v+AY$A7-fA`}|$X~l|$x)w>|$P|7Pv%|$`/ڰǰ齰鳰驰|$p7$醰|$p;vndZv"v|$x.=3)Y v|$H ޯԯʯ麯AfA`=A$waHgfAV@v.|$@+v>4* |$@E|$(twwV|$8Cw<$qw|$pY鶮飮鐮|$X}Ѓwmv|$8>UK1|$`,wffAZ~1t!w*fAbw|$xwpխEwPn麭vv`饭雭鑭釭}si_UK\ :w |$ -'c>&wY|$@wHw6|$X~%w鼬g马韬镬鋬|$pbw}fAaP|$`k4 |$`) A} |$@h |$`)] -|$`(wF|$`.|$(|$X~}ԫʫA AwKNwC鮫$w"|$X|ukaWMWd"m|$ Cfw<$qv/Ҫ$wg|$@v|$HЃ魪飪|$8Dw(4tw9t^|$@t9ЃE;1'wN|$Hw7vw C|$@שǩA鶩馩|$HwS vA|$@w0} j`VL|$ 71|$H !_w4w"|$x,uި@˨|$`7Aw[|$H wA頨4鐨醨|r4_|$H|$p>w{WfAW~^!ZDG|$pE&|$X |$HvTܧҧȧJw[;w7w%|$@w饧雧鑧釧fATIw:hAvj|$8wM~5A7#vAw wۦ1fAWŦ黦fAU3|$p.|$x.a釦|$x'wO|$`2u><w6g]|$xw^wD];1fA]~e$w? Ѓ|$`-w6ޥ|$H v&wť黥鱥駥$v"|$Hvxnd|$xw*P|$@w H=3|$`.!GfAbU|$x|$`.v:VҤwXw!fAbO髤顤w Sv-|rfAa<|$@w#|$`0UKA1AD@/|$p6|$`'A$$|$8D<龣w)$gv韣|$H 鍣郣+w1hEw-w|$xwJ@6,"m8=%ڢТƢ鼢驢w8dƒ|$x,tFw}si_lwbFwHw6|$Hw%|$@.1QЃ|$@u;|$xv*_ԡʡA齡鳡A((酡{qg] wT B8w|$`(w ڠРƠ鼠鲠騠鞠锠銠wmcY|$@.G=Tv"|$@wD̟֟鹟|$H队! w:|$x,w"|$X~qgAV|$@ D:|$ ƒ|$8yu&pwߞ>vǞ齞鳞驞韞镞鋞1AzyЃk|$@V* w"vfAM6,"yw|֝|$`=w-w|$@v鶝鬝额1|$X鐝AЃ遝|$@o1|$H ]SI?5Vw`<wNvF$ wfЃڜМ鱜|$8Yybc$Hk?v|$@wN|$x'w/!At8MC9qw#!$ w"v|$`9ߛ՛˛A鬛颛阛鎛鄛zp|# wRH>wv$w;'fA\~5|$H w$v|$ Кƚ鼚鲚騚鞚锚銚$tSxmAw";v|$HOE~-#|$pS<q h|$X6]ؙΙv'鼙"w|$H 颙阙$$oeRHJ#w1fAT<|$x(w5SKvTd՘|$plwY$u8w锘銘 w}1|$@ `wA|$XOA5vY|$`9w<w-|$`7vOw w|$@wٗϗŗT鲗騗AwD4鏗酗{h^VKA7-#v 4ӖÖ|$@鮖|$X}o^wLoƒ|$Xt-|$`魎Vw|$X锎銎逎vlbk~I?$NB~ ލԍgAw)|$`9w"|$xv'钍鈍~t|$`*wG;]|$@|$xVwM|$@v<w4&|$`/w||$@wSC+Wt#v͌Ì鹌|$xw闌鍌郌|$`.DfAa|$`,vqw17M?w;$$wA؋ŋ|$pv>$w7|$`4钋鈋w3m|$pmw3w!|$`/uM\=3)/ve؊ˊ鷊魊飊* v|$x/遊wmH|$puOE;1$u- w|$x4vgwA ~܉҉ȉ龉鴉?v& 鑉釉}si_U w|$x,v?5+AwPv |$ vS$w< v4黈鱈|$8hw-e鑈釈}$}|$HDU$ =** fAX:|$Hև̇|$H麇鰇|$x)wV!vNЃ鏇jwk$vT|$`w7fAb&Ѓ]SI? )|$x'w ! vچІ|$H鲆騆鞆锆銆逆ve[Qg>4!|$HwY|$8\wv|$Hv!Av˅鷅Iw韅镅鋅遅wm|$pVK|$@D:G*XwUBw|$`AINv~̈́MwewS|$xt4.v/AuowmcYOE;1'v |$@v5|$@u$|$ [wكjƃ鼃 + 頃*|$H.pf\|$ MC|$pw[|$P|J"Vw|$x'ׂ|$HtfA`~2鴂骂|9lЃ閂錂vvl|$ ZPF<|$8awA|$@ #A|$x:oց́A鴁骁|$@ 2w#wOxnMwAAv1|$`9w*$ƒAuwg/%w4Sv"|$X}gfA`OҀȀBw|$xwPv,顀|$`,w1|$P鈀~|$Hl|$phwG|$Hv6|$@wFD:|$`8(L$|$@ww.vwmc1P|$H|$8K|$@wSZ |$X"|$X|;~Jw3 w+~|$x:w.$ww~~~~|$@2v|A uv|$@v~$h w<$w(zv$ A~7~-~?vnl~~}}|$H}|$84w87}}}}}Y|$`:nX|$@9q}g}]}S}I}rЃ:}0} }} }}hv$|||$Hv"|||$8uv6Av& w!|$@+v|$x3||{|q|g|]|S|AC|Y3|)||w9|{Jw3w!8u{|$`,{{{w:1|$X{|$pwZAwJv.`v{ w[{Q{G{={d*{{{Ѓz|$x4zfABx`e1zfA`+wUfA1.|$@+tArzhzv8RzHz$?$wd"wR|$@w9u"|$X}yyy|$H yyЃyAv*@v"|$`9wyyzy|$pwyfA_a|$`FЃ[yQyfAU|$`E7y-y#y}E y|$@Ѓxw3w!|$8ivxgxxDxxxx\|$`>vxlxbxXxNxDx:x0x>w>x^wwIw>6v9w|$pTvOw=$Fw%wwwww}wswiwvSwIw?w5w+w!wfA($|$X wvvv1D@vvAw+w!v|$XOvvvv}v|$@}cvPvFvs3v)vvvt>Aw&|$Huuu|$Hu|$@DA0Glu uƒt ju`uVuLuL9u/u%uuuutettttttt$v5.tv|$`<tut v|$@ ]tStCtfA];|$Ht|$  |$H|$@ fASCv ssfAXI|$x9w8w0s$v5Qwsms|$@ [sQsGs|$x7wwHw[o wl5+l!l|$xwzwhkwF|$X}-:ƒ|$Ptkk|$xkkkk$wVwGhk|$@V|$prA|$`14k*k|$`9wF|$`1v5v#vEjjjjAv9|$`4v($v&jjjj|$pUw#@vAkjaj$3Ijm|$8<X3uS|$@tLjj|$@3wd|$ w<v*|$X};wiiii|$Xi<1 / |$xliw"|$xwLiBiw% 'i|$@ i|$Hw/$& w"|$P}fhhhh vfA_hhhh"|$pw@+ehw„t Ch9h$ w(>w$ hh$0 wK$ v4w,$' u|$` wDggv<$b v/$ w|grghg^gTgJg@g/-g#ggvfffff]f1|$X fff}fmfcfENfDf|$pfJ|$p6$@f|$ *w-/w|$@ЃeeeeeeAfANuN|$`;wGwee$> w75whe^e$NIe?e5e e>w.`dv5Ndkw6w1fA_dd|$Hddd|$H pdfd\dRdHd>d+d|$@v|$Hwd dc6wX|$pbvGv5HcfA_~ccccc|$`9|$xv1|$@w*fcwNw$FcAcpmd`0|$0!fAQ2 |$0 f:~$U|$p+3<2O|$XJov |$ |$0B|$0aO|$0M  -xH|$@ U|$X)B~|$X% C|$0M|$h||$X+8[$A><@fD$ |$0.$)|$p6A A D|$p  7A7.v|$h~WMDAp.|$X)" AVDA |$0E6%fA\8 eiA |$0h|$p)$,jf.fA\U |$@A|+_vA#f+A1|$h3)fAWD|$8'VfB1zA)ܦf*ENzg|$0@"Bf|$0d=fA[:A s'|$p(|$X0IA>|$0(d|$X=`v|$P1Ll@A $-5DAY|$0;Q|$@ fAUfA`0|$X+'|$X!|$@|JA-rJ f|$@fA_P|$X+.q~^fD|$0c fA_l7|$0:hY|$hDf|$e,f_fW Ga|$p2D|$0_fI|$ j| |$h?bf|$H vAY>4@A$d$:fA]Q$B }|$@џAAA?D$ )Q |$p|$X,4A?\ czA5ĜIЃNfDA> |$ 9${ [Fl|$p1|$Q^ w @c fI'.|$8K|$=f( vf2zpg,A}% 1fTR|$}|$Hf |$@])@KCA?\A_|$84G|$@ fDA |$0J2fAXa9fFM|$p.}u|$X6|$8fDfA] D|$X |$X|$hf|$h|$0fAb~ |$8BfD|$pA|AQ:|$84L@|$h A P" "=|$0! |$~:/ GJ|$0jVsAB|$8|$p1 (1|$PfDfAa |$h!%s_ApIfY|$p"d)AIIF |$X+"A |$hU|$X*&|$8|$X' 1H|$p&_AkOVfD|$8 fbq)$f f.|$h$c|$XHA_<fASYvAfD|$0W 3|$0?NW|$@vO\@A#At&A]B|$8-}Nv|$X5  $|$@.|$8f|$0tby|$X o3|$ho/}? jf.|$0BM D|$X#$A&/ $[[_fDAY.$w:|$ht0XjBk$5|$0A|$Pce~v |$8ka|$8y1B|$80(RAL|$pA*eD|$h|Y|$X"4A  Z w R |$pv|$X yo|$0mAfA_0 GP|$p7x /AdFAFvFuN@Ab$|$8+|$X>Dv|$@tAzsif|$0P|$X' A(<v|$X%#fOV|$@ ]) |$8bfL.|$X<|$h U fDy$]N, x eyKlw A)9/Pe#1|$0E|$ 98DL$E|=$UZfc+|$8fA^|$p1|$06|$@Af|$@f1$ N2;1A|$0 |$p-C |$@ jAR00EfA_]i|$p*|$0:bq|$@0qPfIA m#GASb|$hDu |$H7Q|$8 "Q|$P\\N A%fAaO$ǁ fD|$8k|$0Yc4 wXxf[AS)VUEXAP|$@;"A>@|$p_:@|$0L(#|$8!g=|$XDAfYJ|$X)|$h(krf|$@+K|$@ 9A'qAD fAb'wA|$X |$X&2 |$p6VOBĕv |$8]S|$X1 A/6|$p5)7|$@  WN  D$_ |$X!% |$p0|$|$P-|$@ |$|$h|$hC7fAT:TO >fDA |$0jS |$8O;|$p$nf.|$X,|$p!-AN9$ &A`!AQKfARxg9If$ |$p.44|$p- ?,6A "6|$8|$hg:Ad^؎~se _IL;ARA|$X'b?{AS$UABU1`O|$p uA|$8$$su&{BA|$@9f|$0fBM|$p. e>*|$p@|$h9k lf|$P w AD|$X.EfAW$-|$p7yK|$@uh|$P |$hy5|$X#.|$0[K|$ppN fAL}A.T|$pTC|$X#|$0/[|$XKA:|t AGb|$X(1fbR|$Vq|$8XL 1|$8f %=1Rn\nm|$h;|$X?RA v+!|$83|$ Itv?A#\$Ht|$@ ~|$p!~ 8AL[|-|$P"0A!fAC,zAWA]|$@?I$X vAz$9|$8 DA$jXUD"vR7-|$p*|$0G <|$ v^|$h#Ax0A Ű0< v|$@NZ-} -aAA//bA=|$p?|$pfV!!fD wAMfA^c |$8 jE|$@|$p3n 1fIXPR||$84@|$X8 k $lbAQ}7A/S|$ Rx|$p1$$  $ $|$pkm|$X'll|$P Ѓ|$X u @|$p)!bbA_|$X$|$ &fA`,uqI|$hA q?fACAE|$@ ЃfA#H4r :g|$hLIAFA0n|$@ =D s 9fATR|$|$@|$p;{|$@fG#|$@7|$P;)Q|$p5R|$@ 8o{1fAZDAA| @Z|$@ fWƒ|$8|$8 ݩf)|$8A|$p+ifA]rVf|$@MD|$@w|$hT1'A<A1|$X)bu~Meff:$&$c {AAXqA$o$cW |$@ 9ACf:RI|$p1hfATO|$0Y`2AG\|$X-z|$05D|$hLA|$V':SA.AS&|$p$|$X8UЃ+AAV3|$86?Y|$h$V AEyAD@^|$PB=||$f2+|$@l|$H5kQ v|$p>4@c ASvAL$@jAEiG  |$X(1fA`~X|$@voA I|$X,yOPE|$p[datAjD|$8#|${4|$P*U1|$HD.V|$p*|$8`|$0.e|$X|$0&|$hX~fDAI4|$Hz3fKvADB8 %|$08 w dAV<$<1Vf3~|$X;S$2la?|$|$0W* WAN[|AHAAA 1:fDV|$@|$8,q|$@ a^NfA`yA4$};}|$032|$p70 __ fP5A |$hu0&M|$het|$8$fAb|$@80"0@|$X1 |$p(7|$hM{|$p"{ACd|$@ t$-|$X&Av $|$8*)|$hk|$ha|QC2fX#MAf|$X7<6A\$1O+7k*|:k|$@[ K]8$ |$@vAw|$ |$p lAC6h v|$X6vl|$8 0|$007|$XPI~|$X99/Mv|$8 A|$P|$@ z|$hz( A<w}~A8;ŵH7'fJ|$X8;A|$X5w |$0]$; ]s|$8 |$@@|$hwA& $|$p 7$ ځ΁AO*|$p).Mǹ|$8|$hFA3Da'Dt|$X5d|$Q_>$&|$hu$A7E9AnV$1|$@1 Af8|$8A|$h*kT;|$8 v|$p2G=DA *|$0x$C|$@[e|$SA2$ ~2|$X@i2w|$X9$%A'"I|$0-{|$hW{Av[Q|$hO@|$P9QW|$h[FW|$8|$X5ƒ|$p/rr  &|$0n<|$p(t|$8 ޻fAV1A=-k>OrAPr$ v|$P /fQ-E|$X~ؽA|$@ h(fA`;G|$X'|b ||$h<|$hy}f|$8eVv; @6|$0N&A>}8 ƒu|$hA#D\$pE 5A f,,fA^$v) G|$@zf8|$p6n Qrv|$@!8.$M |$|$8ȿDD$HE01b駿fC&AJ錿|$0E7<|$p]$ LO@\6 u*FJu"|$hp .T|$@#TӾ|$8%"|$@YJY駾\ ~$V[JcA2ÕffD*O|$p2/|$PӺO-4* |$p|$h5,OAv|$hԽʽA%|$8鮽f 銽Ad{|$htkX|$8H1A7|$@' 3vAtYf`Oȼ|$|$h8E|$@LA铼 fATg;p i- M1=1|$p+$P$HFfA`c|$8Y|$p;|$@.2|$X7fT[|$0W[鉻ffA] z MMV|$8fQu2(. |$X#7%7wӺɺ|$X:|$8S|$p?S鞺鋺$; !#$" ^"Zc|$@K|$pAtZ$L|$8(LyЃ|$8$fA[8fG8g|$@ٹf8L$|$hJ|$X*?^A2Ň|$@醹fD{#9_f]VN/N  /|$H4|$X8MG|$h) uL|$hG>|$@O^M|$P;Al=A vG 酸b|$H1|$8!`Ap(|:f.f=|$h sOw fdXE|$8f{y|$h8|$8 1|$0D1Aq1e1锷@|$8V-APR$-=L|$p4(=A3|q$w-fD|$X3E|$0F<|$XZAAٔv|$H魶D|$h.|$P>%z|$01 |$p!k>N1|$@ <y vA|$X1|$@j|$8 v鷵Aj(|$@q|$Xqp_|$X;O=y(|$@X}Wv|$p4 |$0]|$htFq|$ &|$8ڡ鹴f|$p|$8) I Iv|$z'A4|$0VR|$p8T|$J vA,"fLwfA]Ap*ӳfAY$0f?Z) q|$X9钳fA\A#|$HHA*An H|$H=4@A|$X|$X<|$@O$G1fAODʲf>|$Hu>驲O 3wWЃs*<3]|$h}]:$ |$Fh|$8 v  |$0;|$PzͱAq|$8'c+zoq n鐱$$o%|$PH$E|$p5|$@v |$p#|$@ |$8L"v|$0bٰ$i |$飰5A@v |$84w|$X' ,?  ?HA\eiD|$0I#A[|$PDASAE\P@=ϯw $ 鱯|$0= |$X2E|$p:|$pd}BA"Q|$h7Mz7zfA],z%DfAGw g$P A>gQ|$p \QŮ|$8_鑮A:逮|$hnu-R!wf;;1A7|$Xlc|$@Ó|$@ ٭|$h4$鹭w 鍭zA:k|$05[|$X0$A?A[0|$h|$@ fY\|$8MO|$PEE鹬AW騬AB:!eAu|$pm""AAa$؝|$X*͝7 %|$@ Y|$8r߫$!|$N„t |$@鰫馫1|$@锫鄫z|K"_ [1|$@I?|$h^E"f]LGA|$0FE|$p|$X)?|$8?l w AEʪ鶪|$@Ѓ锪 鄪$ sr `!fAZB|$pb|EED(YEA`}D|$8%|$8F%AwG̩֩V@_|$@Ѓ鯩fZZFQF 鉩|$p+$;YF|$hA!q|$p#pAG|$8,1($8^|$X7"fTEfAWEI龨|$ C&AJb|$P͈|$8 錨fA]&AjV|$H%E/]J$~(A'(|$X0"A/v$S fd\Ae:Ч$A$  陧&$+[|$8$7fDT$O&|$pTuA%|$X:$f8H$ Ai'|$p9fb\]bɦ+T|$@鮦dv鋦6|$X)eQa+I{B+|$0ZDFw|$hZAP|$JS)A{إ鰥PA鐥|$X5Y|$@LgA-|$PWAta|$0Y5\5A=fZ= |$p2Nä|$p)(|$X-Q|$hMe鏤S 6%|$X7=|$Pd$ƒ|$H  `V|$POt/8|$p-"^{FfZ5f 4)w|$nw˝Av+|$0f~ 驝A"-AG|$X%PA+vЃdQf[)Aa;/|$p6!GKA^;|$@t6wh6ڜ|$p6|$he6$鴜A_ #}BAGBa遜|$@ cA,..Alv6,|$@g'^|$hB)|$$ƒ|$P -fA`-Û &|$hVHA\˂IE@z|$:|$h=x/|$X/W:+ C|$@%%fD[A/|$8fPN|$c͚|$8; j|$X=j阚 9G||$Tƒ|$@ L|$p(LO 9&|$p',Q|$X:PM |$P' /|$8/e g7|$8\7Ǚ|$83F|$@A頙AWn(@|$p:v|$@g] -|$8-w|$0vH b/|$ ǒL*k@*騒|$PsKAG_K递|$P.?% _%|$pj|$X c0|$hu/feQA $$$fA_4<.$)ƒ|$X(uK魑|$@雑鈑>* ir"AvOLz'fWp'/|$PA }*$|$X)q$A.ll ΐA齐骐v|$P鈐A=% hAW/X8$AOv |$hGP%AQu2Xя|$P5#qAqB鑏量$|~$fA`~|$8_UBw H#Add%|$pY%|$@Ay;"|$IF|$8#fA\jo$ 鯎霎|$p+(A\wAAi|$O*t|$06zv|$p 2(1DA & |$p,g|$p( uV 鳍|$p")A;|$8;ƒ|$X-ڥ|$h~ϥe|$N(fA^AU|$ha U$|$X4(|$0K &qɋf`mm|$8ʌ|$h IH|$@ 駌|$X&镌E]e% #j[K[$5$""ݻѻ&]A]y]PʋYЃ黋fAa$fa:v|$P鄋fA<D|$8/Dd|$X%^$C[Z[|$P:T$+ GhS($|$X&$CVA@/z YeA@Oelj$ U|$8P!|$X>E!n鐉醉]s~[T|$h'fALW|$8w^d#|$p8`/ AfY ҈O齈 餈|$pQY|$p&>|$X6fW$ƒ|$X3tT SIA Y ,|$0U,fAY}\MW`AwTzT|$@҇*y-A Wd|$X4+d|$X2|$X"锇,TfA^(|$@Sa}$H%`k,|$h(0|$p6A`|$Y$4|$8!)$UĆ|$h  /|$0m;` /`鏆fJ,,|$PapU|$8E* Z_ 1AA3%|$h<-f:)Y$ Y|$8Hw 齅|$hb_7|$o|$8ofA^ |$@ |y ifCNC=?F|$4A|$8E'$\A.\+|$@ AC|$8.$ ̈́1麄yl6|$8hAFvA3|$@ У|$p3$0|$h|$@ 1|$H'|$3C ^d|$X?2Sv|$p6AFB|$hc|$X%XEf_霃$c,fASzWA}%W|$8K%[|$p-z|$@ >|$hX$|$PZ|$X!^A.Azz0|$0dn|$p1zy$  fTxb閂 B|$0,bЃpi$]$NJ2$v|$h|$0~ 8sfA]݁ 1faY|$XHK| v霁鉁hh xfSxWM:Agb9|$@!.|$0Sk$ -fR#] Ā0txt鐀A&0vc;AF6A 7$! kc|$X7|$89E/ft1fYD@LX&* &~fA`@` M <|$H}" )|$"?j_w|$p~~5;$v?|$p:{|$p~|$X1~|$8/A\/ |$h@n1|$H&]~|$8)FfA]FA~i!~3( pT TfY$*A    |$X4  }Ax}|$X6!Ѓ|$@un}d}</u`{<}|$XJ$m|$hv|$8qfAPp|$8Dƒud||[|$m|$hxmmm|$pbm|Al8p8v|$J|$X9B X|$8Mq /$z||$& |fA_8Z_|$0*[m|$@|$@{A4E(|$X,b${WvfO{{|$PP)|$p()W{AVs4|$8 so|$h ho"{|$X5 7v|$p zz_f_O5z ,zfM%% zAzYt cz5vAOzEz|$HPp%AT z  zA9)yA<6|$htYty Q$yBg3|$8/y|$h1-. n\yfA]A|$p"NfAXN+y|$h S3y xASx(v|$@xx1|$@lfAQ~|$8Bxx|$hJjAHsjjx|$@)+ LxA6*)xUHJ|$hf)RwXЃw|$p91AorfwASA<|$0J?|${|$0Df]E|$8k^/w@b=ƒ|$p67a+avv|$P "|$HUv|$X5Jf 82|$0Dm mv?Q#u|$paA1|$hGv|$0>,[[|$8i[fW<&5u|$p0A|$hAufA_R|$hM|$p1A"Awtuju|$X7/P|$X"| ЃBu^\|$p;$uAV)A W|$hs|$X3Sv|$0Ott6Ѓt|$hoff, fttAV 6wt|$8fA\ƒ|$X9M+M>t4t|$hN+zC t|$X=Mj sA_AX?f[j1|$Hs {*|$86|$X*v6t ~stsfA^#.|$8F8l|$p5l|$8|$p8s %s sAD4/A1rA!|$p5X!|$X9v|$0zrr|$0Lr|$8,Sr|$X9|$ A'jrE|$8xA6G/9r|$8 3-Aar|$8/ 2q|$@!P,WqS q|$h})|$X;LcA7x6|$hwqwq|$h~/a$OTAD2q(q"Ap|$hI%/$2$-=pWB$?p p|$h |$X. AC4A5Mp|$Xu#Ei#,p|$he(A2mAvVpoO|$@oAJo|$@o%|$X(Nvyfbo|$pZ|$X%O>\o_AE|$8-4oAAP: o,* ^unA2n v|$nncn|$0%FMcn|$8|$8Fn@e|$8"e'nn{@Aq@mmmL;V=|$X'v|$8mmmm~m!cmYm|$X!0|$X j$B 3m$!fAbS6$6B6,v$gll|$@l OM l+Nl1}lA;zA$ iAXlNl|$@ ]4]*] ] v6]\\ \$.$fA\1|$h\|$8vZ\\f=6$Œf5ʍG\=\3\|$h+|$ho+ \$7<[|$p2)A]($T|$0Lv[[[[|$0Oo[iEEfAbXC|$8 '$$[(A_vZZ$ 2A1|$P 1v|$8ZZZzZ^gZ|$@|${MZfU,|$8Ѓ2Z(Z$Zfbt1 X1|$pfAb|$pYYAZYYY0fAU~0|$p8 2& ( N $ 5Y"YY|$M%#XX1A$1XX|$h)(%Xj1XA,|$XD+1f.cX1 SX|$hg6|$0M5D$@P(XI XfA_'cfYF$!W|$p1V1W <6A{26W**}*jW|$XB%2$1"5W+W|$h1t XzWVAj/0lvAVVV$V|$X)x/V$a1D1$K|$0qDV.\Aw$VV|$P \A9UU|$@UAfA]1|$h7 1UUA9 ]|$hzZdNd|$0.lz mU|$@  ! OUEU|$p.z[fA`O#UUU T|$h{ƒ|$0XtTTAV<vTTT|$p {>|$Xu _TOTAFmV}$JEXtt$ TAC ?|$@S|$p %a|$p ]SS$H|$8SS|$8>:|$05TVS$@|$X+@A)S|$00J4|$@f^R G ЃR|$@\IF RR|$8Ժ RRXv|$pvRlRfLT|$h|$p* 9R$%7|$hB R|$h Q|$Pz:QvQQQQQj vfA[rQhQ|$X/VQf_4fA`!|$X ABw|$pYfZ`|$8PJHA=P$uPPP|$0TfYjP|P|$8jP`P|$@ NPDP1D@3PARx$-7= PHOAS WWO O|$X:NOfGOOO}OsOiO_OK~g1f\ 2  vfA^ OOAP<8A5v NN|$NA:AN|$@ HD NAOA=YO|$@ 6e|$8 eHSN1f_BN18fAZ7A`VEN|$h@A GA t MMM MM2|$81A`8$Z k|$8Dk$:R`6M $WfHVd  ML|$pAؿ̿LLoL|$8:|$p,8|$h6uf^vLLBL|$@o9N)|$8L LAlW9T^KyPQDQK|$@K|$p/g37KXƒ|$h|t _KUKKKvI$VIuKvH0 )0$|$X.|$0VJJ$MAJ4`}+`JJJvJlJbJXJNJ|$PJJJ3|$0K|$HJI|$pB@O I|$0R=Ib|8+8Jf\6T*{IqIgI]ISI|$H A87Iy AcN |$@I |$0]P \ H|$hooc|$@88HA=z4A6HfASS|$@uHkH>OB|$@MH|$hLNC2HA5)PHbOfR!vGG|$X6[*WG|$8L=|$h.= +AafD GfA\:oA_&oA~dOGA5>G4G*G GGf;$A|$8=AFFF|$@F$6W;|$8uFAv9A8B9f7mkF|$8bR|$X>X$d(XX.F@=6|$X<6@bgErDwEE3?A$EEE|$@'R|$@$ rEhE_\>P>FE|$8FJ J l|$hl ED >pDDAKD $AQC$uCDvDlDfA\S|$P*A$&|$@3DE1|$P4DD|$X3|$8=CCsCC%CC|$8{8|${nCfJ>QC|$@@3C)C$G>|$8 >|$pDBzMA?B2Aa1$s |$p|$8B|$X6UE|$8tBjBA1>A1?B$QKAIGA( B|$h<|$@ i|$8Ե|$PA|$0WF|$8FfA\j|$hYi7i|$X8iA|$@c8S|$@MAЃ;A$>|$0vAA|$@v@@|$X3^EE @E|$h@@|$@@@|$p([#|$8z@p@|$8gC|$8LC|$PUЃ=@A1fN@|$hc?vA=???fAH(fMB$w??Tw?m?>Z?P?4?] ҏASȏ?fA?3>>\ >>>AS|$h >|$@v|$h->>}>|$PFŋ$R K>A>7>->AF|$09|$ w IA-|$X%Ǝ|$hVnfA_=f_m ve=~=|$h_*|$hAk90=&=fA`x|$@v =<|$0i:4:|$h( ::9Mv|$P99|$p<|$h w|$X=&yx Ѓ99'~9A:w6Aw|$p3,wvfAVL9B91|$IofAL>|$@)|$p49AJz|$8LzA?y|$@yyyL888|$h/|$@ |$XGA"x|$X@c|$8XF8|$8/|x8$j|$h U|$@ 77%|$8 7z Ѓ7}75-3 $C:P7AY?7Aw|$8"w 77 7:v6fLs266|$@ ^wHwЃ66}6|$hpvA6g6]6|$X+w.yv|$P26(6Hv$  66y|$@oy56vK55|$vAuu 55vl$[]5 wfE5k)5w5#5441A4N iuNu$ 4$lW`|$@3` _|$h_]i^]^X4 kAc k84.4|$@ $Ѓ 4433fYe2333xxf|$p%mf33|$@#fAZi3_3U3K3A373|$X=h|$@ ff3A7|$8 PbA|$HO2|$8mfOfA`A2|$^|$h^S_$r2Af2|$p3' v|$@ 02&2|$8<|$ |$p(1|$8f!1AAE$)n|$p'E1|$@ |$XJ+|$XEK1|$p|$XA8$11=10A c500U0|$@ 0b|$8b0fAab$bj0|$p9bAbb|$hb40|$XDЃ#00fKb|b:/|$p4S ///|$@//AZWa&Aa5a wod/Z/|$@H/>/AD__ Ѓ/A@\_|$89_A.|$0<bAb|$@ Ѓ.OV....Ew6$Z j.`.V.L.$9./.A@v|$@ .-A----|$@w/t --; -x-n-d-;Q-|$8$(r|$8O|$F|$)|$@s,,, ,|$@wD|$$l|$@W,u,|$8]T,ЃB,/$p1|$Pz, ,Aw@|$X?W|$P WfA[Wqv|$8++fAYЃ++$wE|+r+$c dW NWADWA+|$8v$ $++ +Ax***aVKB*`AW|$@W*|*r*h*^*AFlA*7*-*$n|$8*1|$|$P"|$p0S@7Ѓ)))|$hKv|$p,fWfQJWf)fA]*AM vfZ:)0)AD).  |$X+ ( (6(((((#(YYCY|$08V|$06](S(I(Ѓ7(-(#(A<0a|$8 af7a'Vi$*'w'AN'|$8y'fAJ^'T'J'@'6','"'' 2RAURA &LT&K'&|$8&&wJWLs&i&QvfUR&H&|$8dT|$0bT|$@ T|$p0&|$8\_%%%A*WA W V|$hV|$8V%A3%%ARt%j%t|$X%D%:%0%&%Au%|$hkw aV$$|$p4 P1|$HD@$$A`qZA]w$$x$n$|$@w$Q$G$=$]$Az]xd]AZ]#$!]|${\##|$p'ovAK##A^wo#e#|$0gƴJ#|$p5wOfADŲks#Al|$0] "]"|$h>w_|$8|$P$|$p;:vwA]"{"Of"As|$hL|$0[|$p%ޣ|$8)"A],S8SAW S!|$8!fbR!|$hofA`LfZeL|$h@BL!uRiRd!Z!nJ!7!|$X8wi$O $K$G mKf>YKK|$@ K -v|$H  |$p,AQkAEv  AZw\'Mc wE|$Pڣ|$Hϣ2  |$p7#:$ :^9[@4$5*|$X{qg]v$?5+|$hXܳAȳ|$P|fb|$8wi|$hwfA`|$p+ɳfS`Txnd |$X'y:,L v (E9|$X=L ݎ vJy$2ySy1fW[|$p/# >2i1 wY|$P;|$hOܵQ 6|$p*|$@ oYAOAwAˀWAD ؘ "|$0qDA6+;G+|$p""A|$h`|$X6ر=RЃ~|$@ D|$hiD|$@DTDD|$0nD|$hJMAAA!С|$p*Ѓ |$h5)t|$X+|$Py|$X,ylbXND:|$%$|$8Ai|$@*|$p-ɞ|$0ZߟAHAEy|$8n~tj`ǝ|pV]xv,"|$h2ڠfAN|$0%MfAEB& |$wM$ Ah>d|$Px>FA!A l|$X;O$ $ u|$hlXd|$8fU+|$0)e|$ ^f_SI?5+!|$P|$w(Av"$|$8ҝ|$p0|$p/yoqAHЃG|$8|$@^;|$h^A<|$p|$0Ab|$X:qAV|$hTt$ cAAO|$hD|$@ >AI|$X6vq|$0Z|$hl|$8|$8"Ɛfa|$p'f]3|$8|$h|$єEZ|$h*@|$PO)|$0@|$p |$hG|$p8|$@J|$8|$0XfA_|$X%A@jjЃm|$p/[|$@I?q[ƒ$5E,|$@|$@t|$8 - |5 irIT$zfaz#|$X,w_ |$XMu|$p'J|$X,4|$@|$@  .|$X5 .AHy|$8[Wv>4Aw*f_WAu|$P q|$@ ,,ԇ|$@v|$0E|$X"|$@ |$8,gf\vC9** |$h x`fJ* u w *~*l w!|$@vfA_xE |~fQ^~$C~>4* |$p#w|$8w$0w wAvJ v|$8|$0Pʁf[Vp|$@j7A)V7CkaWj|$8j3|$8%7|$0?5Z  |$0Ojj|$j |$X3 ?|$8߁Ӂ |$p7p o$'o|$8!oF |$0<xp\bpC XoBo|$p 7o |$h [%|$0KF%"  }w?A90p{ |$hOw>&apЃ A;v|$Xo e |$h{u$ju|$X+{+ ! |$8/o|$@ o    }  |$@ |$8}|$8w Bo} m c *CwG = |$8ve(    Aa  p p |$@)   |$8 |$@}`  Ѓ} j |$p8|$X2*AU*9*|$h5*!#kЃ *`zJz  Aav8     fA`AAyY yt j ` V A`=o|$h@(ofMo $ ` e AY~fAZ~A|$X23Oyoe[Aw|$@w|$0gw|$@ Ѓ*ASjq|$@1w|$0S[sAGstr|$7wfA]x{|$X$m{|$8)X{ЃAkrAap|$h$|$8R}r rAar&|$0iw) q|$@|$P}1A:qfS&q|$p(qA q|$h8sq|$@ v|$8OE;|$HO$,Av$_AMw@{n|$nlb$ЃP1D?|$0P1?ww$w {AD{|$htt{f^`{T{fZAD'Ѓ { zg|$8A5H|$hq=|$X)) |$@I]E*|$8l|$p+lPFl$`f93n|$@m$9m|$@mfAPm|$p4km_m$T m|$-mf\wm^m(Am|(i(|$hwT+A i |$@ cP|$8\$Q -#|$/[l+|$8 A ac3 >.c|$8tQ[QfAap|$pQc;(v|$hZ AQ;|$@& a_5AN]wZA]l Ѓw|$8e|$hwAOE;1!> 9AM|$pA-Ѓ=|$p-n|$hV0|$PXA3vA7|$hYZ|$@-$Lw6|$X-fa|$04*  |$hov#wfA]c|$0M|$X<|$Py|$EwW|$w)|$h*Hw[Ѓ1|$8 tA w9 A v1$w'$|$X@fA[O =A_|$h |$PD$$Hf/w9|$hv [v Ѓ w0|!vA\ |$8vfAZxAg~g2 vU G  AV|$h7 |$X=?$w<'|$\w=|$h w, v  nd vKDЃJ|$@w< 0ZfAP/|$8 wLfAZ2Ajw"|$h1 1fG{|$8w,afP)H1|$P2|$8|$h|A0$ |$@vw|$PfC f@ww|$0[dZP:0 |$@ Av_|$p=wc|$8vRw@ |$h w@ ~t|$@b|$X;w}AwmfA\ftN w?$w(v$6] _|$8}siw9ABPF<2($wtvj|$X.w,vAwzpAJ_UK8%& u|$8 wAvA]v|$@ Dw|$p&wa|$8wPYv4NDfAXAw-#|$Hwv|$h[wLzu/3 w'o|$@ ƒ|$PtAaWfV~$w?|$8 -#$vw7c|$P}3w$|$8|$8 v$X^Av E;1'2wj-AXwg|$8w21|$0KD@w4|$t#'AKqA]ApA J7|$X4wUw"$Au|$hX|$p#vhvV$- Azw*|$X>w#w~tj`VL9/Ѓ|$8wM w;$kwA|$h1fU|$@1D@|$P}.ZlUw&CQ>i+fAX!=A |$h w*AD|$BwR|$PK"w9fA]u2dZPF<2(|$@vS|$@$|$X(wG|$H~/BwJ vAef % 77-# |$@||$8 aND|$P}&|$X*+!|$0]D|$8|$X.En~.v&cPF<2w#]v5w6vf_|$8"o|r|$X4`|$X5MfAb)|$pw^AwU0l|$@Qp |$p%w[|$X3w-f_fAa~M|$X6vFABv6$v7|$@w&w}si$#B|$Xv|$8+!|$pv10w)|$@v,v|$X?w'w"fAa~yo|$htw"|$X(vPF<2|$X?w"|$@w[ A#${ƒ|$8t"|$0Tv1D@dA.v4|g]1fAYKA7-#|$X7A/wgf`:|$ <A>|$@wi|$POkw*Aw$|$8wmcPa=|$p,|$hF$ [ACƒ|$@tw $vr$bv[wSLwA?wsi_UKAfP5At%|$h9v$ |$PO|$8|fA_~dZ|$P `0 Ѓ=|$@-|$8|$8wbf\I|$X*w8w0A>[JC-wAN1|$fA_tNw"w|$p>4[vP$v9w1 Af`|$X6Dv"v|$H}|$8vuA\fA[6w$|$p)ww,vA>w! v|$@ZAhv|$@|$p7Ar& hrw.|$8vF<2(A0w.-v%|$@ؿſ$ Ѓ鳿驿響长鋿避w|$@e[Q|$@v# w;1'|$X,wJ|$8w9|$@v2f]fA_l ־̾|$0=k$U颾c|$0Cwp|$X.v,|$@v|$0Mw2\R|$h8wi$ w> A;w&|$p%1ֽAw$鵽A\|$0[wuvcFwQ$ vD}s8`VDC9/<|$h}0$9 |$hM߼ռ|$pv*黼鱼駼靼|$p wZACwAf}|$hwbcYO|$8w-MC3)dѳ|$p%|$8 z饳雳鑳釳}fAaEARdABw#wLAO;1AHvVw;cղ˲鷲魲飲d 鐲|$hM|$0=qfA`OE<$r~||$@ vkЃ/vJ*w/vr ֱ̱|$p&wyGvg|$8wG$v0閱錱,yow3fA\,VL$:4* f^q1fP |$X(w|fAckAv|$8߰|$X$zE]Q驰|$pwB|$8鐰醰|$p.w1`|$hB$v<|$h%w"v|$@ ?{GԯNAwH|$h'w#<騯阯WЃzj`VLB8.jfA[`wQ$,vD9ޮ|$8|$@^9魮飮|$X6fAb|$p+*|$8)awBA2w"|$8w;1|$pw?fA*wh|$PWw2|$POv&bЭ 齭鳭驭A|$@wO|$hHЃ{q|$bX$w)|$X7w"=t%A |$h|$pA4Ĭ麬鰬馬|$hFw3|$@v"|$8wfvlbRJ:$Tw!A7w5 $we|$h;wT|$8w&-Ϋ|$@w$駫靫铫鉫|$P|}|$8ƒ|$0/u_f_Y^TJ@tKvwCƒt&wԪv|$8鲪vGv5鏪v|$X0wmcY|$p(uA7-$|$85fA[ivw|$0$v3|$0*v"|$pvZ鵩髩顩|$X0wt|$p,vc|$8%wR1m|$hvAWM|$pwtEte7.$|$8w|$X3wE,ܨҨ|$8 vF|$X0v5|$X9w$8骨A 陨鏨酨{AAvibXNwIЃ4fb|$p#wd$w-A=v?fA`H*鿧|$hcL|$8w-Ѓ鞧|$hf>逧$Ѓlbf_h|$X.w4|$0Ew#|?5+!Iw]|$X9wFAt"$-$w+|$0Ew$̦鼦鲦騦|$@閦|$pw{w\w@D$hRhSU|$pw|$X(?5+|$X/w(A<Ѓf]%wDߥե˥|$hwf|$p1vUwP镥鋥遥w|$H~1|$@ ^T1|$Py?|$t"|$X-w |$h $ޤD$P4w|$X1w 鷤Ѓ韤fc"|$0Sv}wg]S@|$P wL|$8w; |$@w v|$hţ黣鱣駣靣铣s w"v|$X0siVLB8.$|$p!w~=|$8 w1ۢѢ w鹢鯢|$p.面vz|$82vbXND:|$X.wv |l wZ|$X=wSv7^w%Avա|$0á鹡鯡饡wpAv`|$wz 逡vlvU$L|$p9:0$rЃ$٠|$w鷠魠$f wEu75w/銠1faD@xe[|$8K|$pw73v%$ w$! faMd<Xߟ՟˟|$h(w+|$@D魟食陟w"v|$Pyoe[Q|$hBwE:w3Av*/wIޞԞʞ鶞|$8AatDw鑞釞}sAwb ZAXwSA|$@ wW wOAv?Av/9w'  ٝϝŝ黝鱝fAQA|$p2Awr$wUAЃЋƋ鼋鲋|$hvz|kw6鋋 {hR…uE;1>wjIa|$p6w~|$P|mfM]鶊O顊|$8 wc|$%vR逊vlb|$PA|$hu0A78$|$p+w.߉|$p4wY|$H}3|$wd$vPЃ鞉|$8,w-DOj`VI?5|"|$X3vD$8Pv ԈʈfN|wa$w*p针AEwAC{qA^w|$8[Q>|$hF|$@AAwv|$@ wZvAfA`"|$P}A>v|$0@Շˇ$`鬇Av|$p8錇邇xXe[QG=3) tOۆ-w:|$p#w|$@齆鳆|$0>w+h陆A7w%|$8 遆n$w!vAMC9/%wV|$X7wE0w=|$p&w A&|$@Ӆ6齅鳅驅tIAow9|$@w!?Ѓ鉅|$@w|$8 Ѓf\R|$8w-|$X5vw2( |$8w[rwI|$0o)لτń鲄騄tk鉄 wAw" v|$xdZA\vA C9/WRI׃U|$@鼃$t$钃鈃|$pwc$*i|$X)$8A;wqfAb1$!(|$X9|$@w(A7D$8tւ9|$hi$|$p-!鞂F|$hw1$AMABwVw9Gv'|$hP,twtA6A $$wx鴁|$hbw 隁鐁w!A=wqg$OE;AGwXPvFD$8u+kw#|$0Gwv݀fb2|$@w+ƀЃ鴀1饀雀鑀釀}jj`VL9/%Avw6wEAO|$@v%~~ЃlbXA7|$X)w]wB-,"A?~~wZ.~A:w#vb~~v*w~}wq~g~]~AQw{f^~k[w<6~|$@ w6 w$|$8v ~~}v}}}A_fa}fAbj|$@w0v!A{vq}w}m}|$8fX~qhv=|$p"w,:}lw%A~!}} }|$X=kA^||A3v3|$8v"Aw||$hg||||||v|l|b|wUG|=|3||$p9w7||$X2v@$u{{|$8vw{{{{{{{AIu|$0Gi{_{|$Xv;|$hYw"v|$9{/{|$@ {{AUw8wAwizzЃz|$h9w)1DzAJw"ЃzszwK|$hhw1bv"v|$X'iz_zUzBz8z.z$z|$hZwn|$X7wI|$p|$8t-qЃywqyyw;AKw&yy|$p yyyywc^yTyJy@y6y,y"yyy|$8ЃxxxxA@w xxxxxwЃzxfcGNx|$8,w(|$8 })xxx xЃwwww|$h_wtAtd|$P}?ww|$pv/vzw~wtwjw`wEu!|$hsvfAaDw:w0w&wAwDzw<wACw6|$0>v|$w6vv-vw!fKvvv4wOfA`nv|$H|'AE]vJv@v|$@wܸ/v|$p$w:vvvuuuuuA5Auw"|$p0vxuuufImAwwT|$8wCw;duZuPu1|$PD=u3u)uuAat"|$hqvttw|$p2tt$ЃtFw=w%|$X?Ѓttt xt|$p3|$0;xOtACA9wx|$8w8|$p&tAvE|$h7w>wAJtsv>sss-$wmwHAvBCsw1Hqs"^sTsAsw_$wHw,!w$s|$@wQrrrrr|$0Nw-ƒ|$@urr|$@v6 r|$@wkww5AFwA>brXrADrt rr|$8#fTetY|$@ wHw@qq|$h}tmqqq|$p.w3qADw|$8.pqfqSq|$8@AqA0qqq qpppp A p|$0X7ppppp}pspipVpfA[|$p99p/p%pA wE$w8pYv01Do$ooo$ w8AwOooBoqogo@AO6$Bo8o|$p2w?|$X/w8[v&; o_ nnnv/ n$w|$hnnnnnmn ЃOnEn;n1n nn|$8 vJ` m A\|$p01|$@mm|$X:w mmANwvpm|$h|$h4Aw|>mAfv5 %m v'  mmllAw7|$p5w llll|$w:fSƒ|$h>t|$p.|$0RklalWlAQ .l$l$|$@ƒ|$8Tkf]M$w6Aew0k|$X:vO|$p2w6|$h?w%|$X>vkkk~k|$8lkbkXkNkDk1k'kk kfa jjj|$X/w\vMj j|$X?wIAAt-|$p3w&wjmj|$0;[jQjGj=jAvbwZ%j$< v"v|$X#jiiAAv|$wiiiiiif]|$p1sAoFЃ]iSiIiAywf|$p-wF|$H}H"iiFv|$Pih|$P~51fZD@hw?Aw,BЃh|$H|DhhAwEv6f\&oh\hRhHh)hAvjfA`uchO|$@ggAwU|$X,w7w0gg|$X+g}-w%gwkgagWgMghwz2g(ggv& Ѓgffffffffff|$03w8ffxfnfdfAD;f1f'fAw,h fAUweee|$8v<|$@t+Ѓe eee|$hB|$0mvu$/ v^|$85wB|$hVe|$h2w"v|$P7e-e#eOeed$ wA|$@!w*fA_uwdddGdddd}.|$h vtoded[dxwHv6<8d.d|$X5w&|$Ed dd|$8v|$@ccccccc|$8wrv`|$pv;c~c|$v+|$0Nv ]cScIc?c5c|$0S|$X+|$p,vx|$p1vgwQ|$@w@|$0Kw9bb|$XJЃbbbbALbbbAG|$8?|$@ wXA[bQb|$@w}A we$ wGfAƒ|$Hu*|$XGw#bw%|$8,waaaa|$@aaw%ЃaUaa|aw8w&|$@fA^tw-FavrABw\ u`k`a`|$p(@`6`,`o``|$@Ѓ`w9AEw1__AOv,n_ __|$8__z_p_3w7$ЃQ_|$hUwIw7|$0Pv01_$vJ|$X"w9w1 __A;w5v& w^^^^kv|$p9^^1D@^^^|$0%wffQ/wIw!W^M^C^4v"|$X+w&^^^d1|$p+]]w]]]]]]tj|$@vYj]`]V]9v#|$p.w@]1|$@.]$]]]USDT$`\$(l$xD$A 0& A|$p |$hr A |$X/I!fb'AIF|$0oA|$pf^ AQw|$X|$0lA$G:A|$8AH#f`8V|$Pv1|$P`|$hn|$db|$0hg|$p&,|$2AR;$ |$8]SANr|$hG|$@ xoA|wW ?AUfa25VP|$0VU@Aa$AB+  |$0>="|$putA/ AVe|$@QAu3 La[fXqAf_L|$@  |$X-|$hl8,|$8@A/e|$h}|$8v|f|$8$|$0 |$8fƒ|$p)t~DAf_|$p)/AE|$XA4,A^ v A AY|$X. |$p2-|$0AA[|$8)yn vf\@|$0L|$h}j |$X+sXFA>XA=GfD|$@ eAc[ Ab 2#AWz=|$X3.c|$p$tA@ vf\A0e|$h%8"A? e|$p+AB|$8 v|$@ PFD|$0w |$|$hq |$8:|$h|$X,jAhAZf\fN|$0)fJ1ALA/kr|$0"vq A1~|$h3.#|$p&=fZX|$X4uAefP3$Ѓ[]@fQ AvAUf6σ fC fA~|$11@A cAIw|$pMCff] A% |$p |$h~+A7EF1|$hK AV|$0df?A|$0>e|$p8w|$@ɢ vDAqnASqJffF f*(  / A ,AEY/ffW. A  |$0U"|$p,{5|$X)w|$h;iAR[f.|$0yUT$pI1'fD|$X=|$P|$0@VA%Ds|$X3f`Aw [f]|$@A m|$X6]1AI$|$0.Aav|$PiKA&_KA#K|$84A w |$8D'fD$\/f\Ag|$h(;G|$Xf.f|$8Ѓ=@A'A|$0hA |$@FA|$0|$p!p|$8 #GD|$8 G+$BvA $ /g@T $ #AQ0|$0B]a|$pJVA&A" Al A($( vA"(DA) A:!|$h~Jt"|$p-] |$p$x |$0t_;K$o ՄfV˄fD|$8  \A7V5ME|$@b|$P~'@|$HU|$X(A1|$8 Q) |$0H&A|$p2=C@l`A}@ V%f^-|$@ Kf.6 $AKi@Aw|$8 fD|$8f\1# fD z|$hvM(vAx3`|$@NDAW G0|$0?$J%q|$@R |$pX|$h`ACfDAn Aj#|$@0 HfV$ $r|$X;g`|$@ |$0c? <@Uf`}|$8W|$@f.|$@f_PAvf]|$0e $BA w6f]X|$Vq0 m|$0Z|$XE[|$@d|$X7VdA dcA) $G |$p57# B|$H|$hcxf^OfDAAJfX&(|$0(Pf;s|$p,ݥ|$0'1|$X|$8feO,|$ tf|$X* AKA?;+ N|$h`~A3|$@ fDA< #|$@ qA"At$ %B#a|$@D|$fa|$Yu)|$p"Ffaօ|$8+|$XV $|$PA[|$X.ƒ|$h8u Ab}@A #|$hIA`I6DA[ A@A1A|$8 fR0|$1EAcm$|[ Df\.A(|$P|Z|$81Z|$@J|$pr$m)AE>l`A!EfD |$8|$ AFd"A?f]^f^†|$hKAf7|$8uyvpf\r|$hS.|$8D( 3  f\HA Ai|$hMfI/ALbA$o$fAR$M|$@I'|$h;AX_A6A.v|$8P4|$x 915_|$8?"AyG|$hlZeAfvA8AB0,A|$8w AR|$pCA6fbA;A p|$0>!|$8.A=1fSD;AS#AA4AR|$87w|$XwfD|$p2fT}0C<APKh$@!|$8 D |$ |$@A|$h ZfR۞|$p5f^kf$Sf5{A({ |$hX "fZ!:|$@ ] fA|$p?Aw A`/fU;fUt_A'A A?a*fJHA-v |$8  A)AAd$W1AP ({A{rT `w f_QGf^A#|$0|H h|$P|$@|$Pn @D$8 !X |$hAB?*A;<A{!yA)^|$pzY|$0!A5|$hu wAa|$Xs.vLAiL|$@ Q.|$P|C.A|y Ax|$p,81AyP|$XBEr|$ |A&(|$@"A|$X e/|$p|$X5AA@!~|$H-Af0A@O ƒ|$hw00]f[jw @6AAUIf|$Xxq|$@ `v|$8|$h>%>1f_vA#AxA%e[|$p*EDfY"Q FR  nfRZ|$X4*Af!|$HyLl v|$8&A~%DA q|$h5qk|$0o|$h*?M Awmf]1A1 @|$h|$5H$ e|$8|$8 |$@fD|$8$^7A/ bA'A |$@m@ X1Avj|$@|$@*f|$@_fU6|$0|f /|$@$f|$0R!$-!fG|$p0[GA6L& |$h`Aq2|$@KoAݤ]f^A ?|$p":rh|$01>A|$h.|$pL4fDAt#|$@ 6|$p;k|$8k Q|$pBAUld |$hl" ЃpAZA F|$p.#"D$E%E|$8-j @AL- A5J?|$p9fDA?Ak2f9]FgqAcf|$X) 1JCf\h|$ha;d|$hZd@$ RF.{CzaA <v[|$p5fNA fUiv|$hOE@+|$0RX9A/L|$X&fb$s S|$hHD|$XI%1|$pr q5gTv|$X1u@e!AJ|$@ rK|$8 !|$h 4|$@ $+ 0A W|$pD|$@B@|$@|$0{7/fONA_yq|A}A|$PrAI|$hg1'|$|$X.[&|$@|gHno1 vA|$h|$ha/|$p/H|$0s|$XQXLv |$8qE@AR |$p ",faPAWA^c"1|$hI|$p,4A9Dq^~|$03|$X7ͷ|$@vL|$0$aLA A3pAƒ|$p 2_|$X'_.Oƒ|$p>j Ay\$PSŃ w A|$X,ƒ|$@ u>Aw|$X=wA |$@v RHfQf2|$@JAD|$h"EAl}X |$p-Ac|$83A7|$@rA|$h?M4ATB|$p|$X.3f|$X2AEU"AvE|$8|$p3|$po` fD|$p0|-A2 A<oAd]f_;$J;q 1|$@|$P A& 0ƒ|$p>$j>|$0Aik&9|$X!\A(A|$P6 xfe1|$@S|$P8|$h{-@*:|$p @|$hVx$w7|$P^|$@Ѓ|$@|$8A|$pt|$p bO1V<A; |$PDA|$0>v|$h}v$-|$h|>Avg]|$X/_|$XB|$8GA A|BAW J`IHHfD|$X"& F|$0@F$m|$0#']LA. f|$hd|$8 R|$8HAFAF|$PNAƒ|$8 .)|$hI#)fy;]fd1]|$pLAMv|$8uAH+6AI |$p؃=;&|$XM|$XBfd{At7|$X_A&$uA%fD$|$X? h v|$@|$@_/|$8#t} ZfXi)=A% 6|$0#$[vAA |$0F|$H@D$XPǸ}j1Z|$0Pu/fPG Gy|$XAAr|$HVPOO|$H(ZDA y&|$0U>fa|v|$X9X vA|$8^&Ai*? ]oC|$]v|$@ C9A56  w |$4 r)|$p2FAv|$8 @EQ bAoЃat$ P|$P1AThAv|$8:fDA|$X1-|$8nA|$hiwAD\$E|$00H2$o)%AZ|$8Rs ;$Y =rv$@ASR|$0+;A$}}P|$8t|$X!|$F%|$X<7|$8 }AadAO$faJ|$H^ /AY#|$hy6$ oA.iAD|$H|$0;N.;Zf_A q-WA wWS|$p5C0|$@i|$@E?+gAJ+55fDD$E$-EA 1|$X M2|$@A0x}gAaV|$0R*f=;|$@ #|$X fFX6Azh(j^Z|$Xf& wA$ |f_+|$8`|$@fj|AS|$8pivA @1$Z A#2|$8 ƒbt |$8$|$003fSnA mW|$8 5 `$C 5|$XB>?2w A4 A3|$hkbAR$@fTY,A L,$v|$h[A[w> O(AJ|$PhhABu11+AMAD/y|$p.Q|$hK@|$p1v|$PFʿ A1A锿A@ "A R5g|$0v|$p)MA;0 1%|$r6A4;?|$0]AT1A&|$P&&|$8p骾f$ vA-{|$@ $A\|$X3K%|$p(B6|$hM}f[V||$X/tuAf hA +w|$hYMf]| f\!AN yS陽|$p.b|$h9:>|$\f[w[f.|$h=$A6|$X0EЃA |$p#|$h>"|$GE$ 鳼|$8 \A3鈼|$X1x6w$ _U$Wf`E|$8YA|$@AV|$H|$8w|$@ ѻǻ|$>$$8-=|$8#l$,BBp|$p |$@[/A!sAЃ9A~)) vA&ܺ|$8p$8 o$~霺P  YA2vAoe|$0"|$X"S\|$0MJ.A 6|$X:P|$0{mfL|$@[L vfbֹDAkAA 駹A&|$0@x1| v|$p)dZ|$0rJ 9 &|$8 AN!|$p2E$-";ҸALw.鱸A頸A逸f[q w |$P^T|$hh# 8|$Pp  OAjN A  |$0FR7_xA+̷$?|$01|$X-m|$8zAAP$Kwe[f.G9$w A["|$@4A4$5 J|$X:jP|$hA|$84|$@ Q|$PIA/O4 郶Aq^fU |$p.|8|$p#ƒ$u!|$p049|$p fhXԵf^ŵ|$8$|$8髵|$hn|$X) WU< lbA\!AE$Jk$iXA!$bJAFXJ|$@|$0ayB }S|$8#駴AvAs酴|$hs `$HAo4T!f]|$p@|$0&OA1ڳdz|$X=?|$@?駳AA9w A+x|$89|$0kGfXG$jv|$p=;1P#AA |$@E6/*/fO>|$p9f/u>頲閲|$X9JCAJf_nOfDA5$m5 1o ۱$Y|$@ƒ|$p dZd閱A`A5rA=1aRIA$ F|$@F|$0P'! $ٰA7/,|$X<$,EA$E駰靰|$X1?B3 3B YAYfA )f2G|$0Z@Az j # f`*fF,F {Ag¯鸯W|$MC|$p|$hQPA9AAdWMC %|$0`UAAw>#|$X&N|$h<2y]v$ѮǮ|$0Jy& Ѓ骮|$p&n*Ѓ鍮AV$A2eA1 e$D&zK|$Xv|$h(.$T A1vA>$D$8Pۭ|$8A}B }鰭AY ?m ?鍭|$X-%o|$@%|$p/b|$p'|$߀A$|$0^ [&|$ J|$X}ڬA ЃǬ$L-靬A4_%K w|$p:PA29|$@ D|$X'A|$POA1AЃ$G*|$phAf|$h`k2A駫|$8J^vAxAyZXA]'|$p-&|$p)WI(|$PE$f>VA81V|$85m iǪA 鶪F/E|$8HDH|$@{ SAAALA[f=7 Z=,AZ3 e|$8;gA g|$@r0fYR0A ۩|$p33$P|$0K鵩$p,uUAA逩|$0,sQ|$@ F? ?$6 |$8S2 fQ*A}GA(|$0n,|$8"s]|$p${| 鳨|$@ 顨0鎨|$89A9oA/ c|$p+DU$\Q, |$P|$@ A%|$@|$hvb"̧֧A``|$8<<钧|$逧A:|$P:.Iw$D:|$p!(|$hP|$X,PAL$_|5$WAvƦ鼦|$0E|$h(T _|$P}h{f`$dEAuT|$h/|$8b0\|$X:#AA"#>Avy ޥ$!'|$$cAnc阥A ` { (|$hEvOI|$@,SO|$PK3KX|$ +$B+|$L@A?@ä|$0`c)AhV|$8A6郤]v|$8ka-AA{:|$@$:ASЃAP |$X%w P) L|$8v|$X鶣$D |$PO鎣AiZ)AAAch]A V @$ A.ld AC"A)[Aޢ|$@ ̢¢|$8:|$hdP|$X9}AY5{|$p.0A|$X3[AXA cL|$0S5 u l .*OA Dgh 9Aɡ|$@A0:D$n ),AaA#|$X%v|$pZPC=fV,-  |$8`&AbX)A|$H&A&Ƞ9)|$hˠ6|$p>+鐠|$X !|$p8Aj E|$8 c$$6  7|$0h7A |$x -N|$@ ڃу鼟(|$@ 9|$0/SdA,dfX|$X<,e|$h?7|$P,z/f\^$^$#9A;-A7~P|$Pƒ$t AОA5W(|$p+鴞$PY!APCJfaw|$hQ8fS$A ${$wo$N|$@fLAe v|$0[!|$@w|$p2P|$8P|$@v|$p3ߝ՝|$84鷝A|$@"T=F|$8鄝AH%|$P >|$h]hA3h|$X2hQ [ AN ,|$83fW3 |$X-Q$W,|$p 7$Μ6黜fM|$%AfUL$rA,AY If[Auo|$@ K|$0`|$p0$|$h2vޛA# A=Û 4A 飛u3Ѓ鈛 [|$0XFfWyA> LAfSvfUbAK ЃACC6 vA ٚ5)|$8(?^$顚$ 鉚vADbAQW|$X59+Wl.|$P=1$0|$03MAu ڙ$c"A`2A$^^+H釙|$X;NA@\wACQ|$p8Q1A1|$p*c)!AU :x|$p! x Ø|$p5#AJSS$8|$h#鄘|$h\jL|$8'$D9 JG.|$X |$@ |$p9 |$@!5v —鸗|$X/T#fY\R 鐗A5 |i_U|$uC|$8:%A5d++X+|$8 A2ߖv|$p$ǖ齖vA2霖|$X g$|$@*3A}u D`A #1f^DDA"Ѓ% ƒ8 ~8|$0((|$8D|$@ AA tf^騕鞕%;邕B(As5(_M>@|$hd%|$c#|$04wAX$9&AlAA*|$@鸔鮔fX++|$0\鉔|$@s$fF~|$@h^T$ |$h~(fbVV|$ ī ߉|$Xv͉|$hz;A  wA_m镉|$X,"(AT1|$0AD@j|$0m=A|B|$@ 0 ,Az+AC8|$~hgrh&܈A ȈfIP3|$bnApa霈Al%$Y|$X3ƒ|$80A#U|$@Cf`O-|$@,|$h<J[fQ,A-[|$p2[؇|$8*$$ .O|$X>)Ѓ韇|$@ 2.N{xeF)|$V>4A?*2AA|$hurAAD|$^؆ &PfLP鯆饆|$h]|$0'u |$@yo*|$80*N|$p)A)|$ƢADAB%-|$@-Ut UA&f[%VAkأ|$@靅AT65misOf`iOvATZPAl1( []fc|$8CAi,|$0I vAP Մ|$h0|$Pi頄閄A;|$hxƒ|$p.gAG!gZ|$00ApCA.1:|$p@A/+&|$hv&|$0=xAIكpXZ|$X4vE鮃餃|$@钃|$p()$ vlb|$pt?<2$5f2mA&mfJL|$8Xׂ|$h*0l|$X9lAA 5镂A釂AT2'NfZ`|$X0|$@vJ@|$X'. ƒ|$8tA|$@;فAZ!|$0TO$XN|$@ 顁}A郁|$8 fSHsMAA\3 |$@~A*/f]/~$S|$0i6$|$@ ~~|$pc~81A%i|$Xoz!~|$hj>Az>|$@ZARI+,fZO}A W,|$X;O]An]$X }|$p  Ѓp}|$8.:9|$@YAЃJ}$ AJFAc,M|$hQA1J|$@?|$hO*3||$@|f\3$jd|$8g|$@ g|$p?||||$p-/|$p&g|$X=T||$hiP4fS]$3'|R%A |f^p+fb$ Ѓ{/@|$8hf^A|$0w|$|$XM{ {Pz{,g{|$@ U{E3As|$hj=|Av{Eu{zA7 |$X$SzA#2z /8A$ v|$Pz|zclzzSzIzA|$P*zz 0|$8aAN5t|$8 yA|$X%B1|$p y$C3 tAtVay|$p)&3`cASc3y|$h~A'9|$X&9A9x|$h'v|$hz^{|$h7S|$p|$ |$@A/x|$8%f^jA{ o PxA: @A2x|$8 e^xAAwJtw `>Aw|$h /|$Pee|$0U‰APwf_|$pEA=!f`MwA9wAs @^A{w|$8 Mv|$8;A8^ACvGfYRAvAO2A9d|$@d.ov vf[XvNvO 'A B4|$h0p|$N|$8 |$@ uAu|$H1l$f l|$hD|$@9u|$@|$8%7A!A:Zu|$0h/Rn0V3uAu$9h vttA t /fZ/t|$@/(|$@Ut$l 6e e$ RRYtv;|$8 /t|$-$t}ttssAs$ssAs AJ|$ ARvAXsNsApp|$Hp~psAs$ rrr|$@vf`rr1r|$8r|$h;= UrArA`w 4r*r;r|$X+p$tA8qqqAtA j|$hi|$h[ ~|$@~A7|$^oq _qA|#|$p4UAC0^dAsNfXDqq|$8)pwApp$BA;|$8;p|$P dS|pncp|$@(XUHpAZAY|$H|$8 po o oi/bo|$p?%|$p3 LoAKso$ |$0DhACoAU2o|$X__on|$p/E4f[~Ann1|$HnA(nnnnn,GcnSnIn|$Pln|$@ #p ƒ uDnnmfLG`|$@t|$8mm7\mmmm~mtmjmA33>m4m*m mm mm|$X < AVlllA.l|$h |$0B u|$0/ll|$01EE|$p9!Wl@l|$8l|$p2;[$݃A|$hC l$N>A>k$3A0kkkk|$0K7qz7Rk0okek vAwKkAk|$hgU|$-|$p) kkA9jjM\KAj|$H._$_jjjxjhj^jTjA9dfR~|$.j$jjA j|$hKAK|$X9K|$82wK|$@!Rii|$8XwA$fL|$8YiAgJi16i,i"iiiihWhT|$ k|$81|$X71D@hhh1|$HyhO fhf]T(AE@( 'A'2h$du'|$hx&A|$02l|$@w}ggg|$hH&|$8ggggR'|$@ Ѓ}gfF~|$8Agg]g A>&AGЃ7g-g 'A& gA-fT-|$hvf0ffIЃf|$P'fRW'f]|$0\f}fAC!,$ ,ANNf'A'Ә|$8zAmeeAG++A9A*ee|$P)3vAeeweme|$p.%|$0%Ao3c,e|$8WeeAC'M'AXLdAddf^$A`A dd|$@rdA6A'6|$h6A[9d<=fP2=d|$@kc Xf9X)cA48p cAH=$xrcA$ycf-,\c$Dc:c0cEh:AA.?:|$@"|AwbbfF4|$0j1|$h*Sf!TAbbA<|$hAfb1|$0iPb|$hdH4ffքfMgf|$@ b=$-]aAaA aaaa|$X4*ASňAfvraha|$P1|$h*1HaAd4a$c*A%$ a|$8`A H5Am4|$@``A$`` -- ʆhj`|$@f.|$@P`|$p<A_ (```@ `|$800__l6L__Aq**_|$@;7y_f_[5A7|$X7|$8|$px|$@x`|$X5U_fS6|$X;m6|$0wAIwA ^$@1|$p7~fE~~AO^|$@(AVvAS\^R^L(Ѓ4^|$P-^q^]]Ar]]|$p#&`&fiC&|$0p]]]z]A8|$X$5|$h~wJ]@]|$hD\2 ]]|$8tx'ƒ|$8uw\|$p./+|$8+A +\A\|$@.A\\|$hy2AMA _\ ЃP\F\<\|$P~&j \\|$p#.|$@.|$X*+A{|$pp{Av[[ [[[$ K/|$@v[fb&|$8v|$p)U[K[44#[A[|$P**4 Z Z$w.ZZ|$hu 0A |$0P$MZZ "|$H"9Z/Z%ZAuZ|$PO5ƒ|$8 3|$X23AW YAICT Y|$X>/fV/ZYvYlYbYW.|$h<.;Y|$P. f@ AsYA( XX* |$@wXXXAe>XALA~uXkXA?ƒ|$p]?|$@ R? 6-*XfXYA> XXWW|$p496A Wp ЃW|$8WfNUMAx+M|$0=QA<= AYW|$@fa:WAE:A7;:|$P:|$hq" |$P}|$X(VVVV VV|$p$u>WV1A/sViV_V OVEV;V|$p)F$^F1f]D V|$8TvUUU|$X43 v|$@UU|$0dNeN|$hAY|$8:nU|$8 \UAx}BAծ5U|$h3XUAIA;UAQmATT9f_9Ar|$@ST 9f^>=v|$hN`TVT|$0]lY|$8XAo]#TTVv|$HTSfY9A~9+SSS|$@SS|$@O|$8DA  ` aS|$X+/'CS|$p'JAv,SS S$O3J|$@ ƒ|$xuA@RRR|$0D|$p-D 5A^ ;|$@ v{RqRgRf`J{I|$X:BR.|$X: RA{PAQQQQWQA5[;|$@P;QQ|$p#QA.QvQlQvVQLQA=5DA.Q|$j|$p15DAh|$@J|Pw6D$hPPAv |$8PP|$@7ePP|PiP_P LPQA3bQ|$X#^|$pwAPPrOAUOAOr,Ai$ء|$HO|$@}OAR&A|$p@sd|$p Nd$ 9O|$P]OOOA$X |$@M }$E}|$X}fi}Nt6|$8ЃN"v|$X6NN:|$pkN|$8YNON#MAN$#O|$X,Κ |$X3'UMfaP2|$22T%|$@]MA_1ЃpMfMARMHMA{tH|$01?HAMA1$P|$pMLL|$@8f9084 ¥ARL|$@'-|$-|$p/-LC (gL]L|$h#. -|$8 kA*^UH ?LL|$8vKK|$8JA J, JA |$PK?|$8|Kgvf$eK[K|$X2=1@K|$p .K$KKKKJA*|$H||$p$JJJA6|$P6[6J|$hP>fC>|$8(}>AkJ|$80A-|$$S@Ac1D$X<J|$hg<@|$ha $IANƒ|$8tIIfOIIIIf_sI|$X8CCACz BIA%&|$8|$hI2I|$8J5AĢf`A6|$@aH|$@HH|$p%0A0/wH|$h@JYHAEEH4At$|$hkAv HHG GA(*66G*1|$@0|$X9|$h/F|$@wAXGyGoGeG[GQGAG7G-G|$0F6AZ6faD^A ^AP]:]FFFFFF FЃF5AC fbOA |$06$u|$X ,Fv$F F,A],A|$@E|$X2.|$hZst|$P}AEE|$ AKeE[EQEGEA 3E5ATAFS$4 SysA=osDDAW/ FDDDD|$hgj3|$p3A`VAVfDA&$*&fD.+D!DDfY |$v |$@rC>C|$0Jz191EaLC|$w}= v|$\CRC ?Cfb*DfN@$K CBABy B wQ1q$ !Ё„(qACqB}B|$8pA q8p$ƒ tA48B.Bp|$@pBAA wO; AAAAAAA|$8[o&oZ xA|$@o|$p{o-ooLABA 2A sm A A|$8@@$@y@@|$82n|$@n n|$8mx@n@d@Z@P@F@<@$H|$8@@@????|$X9χ|$@ć?Af[?|$8 $ V M[?x$>|$8pAJppA3t|$p!t3nAf>AP'|$hbvk$$;fYۅ|$h;ƅA|$@ =|$p7=rn|$h9]n=|$ tA<r|$X)r=ovA9[=Q=$w4AnfbOnE==|$8l|$hvl8*+8!8A%w6|$X+n|$@YA v|$8l77fNA.|$h!|$8bȟq{QA{qQ7777v7c7fc@Q *Q$87.7$6W|$h%ƒ|$Ht AC66Ai#|$@6|$0|$@6|$8ק A1i6V6AB6#/6|$8|$ho6655fQ A AYO 5AA55Q5fS|$8g5A< |$8$P|$RPAo^P Ѓ%55Ap5fbJ$ Jf`|$X"D4444+ Wg 4~4t4˥|$8P4 =4A)444HU|$p)3U'U3EuLAwRRAXR1fW333|$hUAU|$PuUh3$TAT|$PTTT#3A]w=$hsY CYA[v|$0[22 2A2f_O2AWU|$X7SQQl2|$8wvAtgXA^xX^X|$X8X|$pA.2$2XHv|$0Y211|$hUWU|$h vu111Vh1NN|$8Ed1|$p*"AH1$QW+&1X1|$0pfSf|$@"0$u"A%wf\00|$@0000 }0gWa0W0a D0:0|$X2,S 0 0AWE/AoL/|$p0LApLiЃ/////AMfbL|$huK|$ K|$h`w|$8I/?/A+/|$h[MEM*/....L .A=...|$p0w3A.Ng.AsV.|$@D.|$8 LA L|$@Ѓ.|$HP -|$0'w)|$XOA.wC--"P|$p$---A\--|$@q-^-A;LA-7-|$8%--Awn$GA|$8@U,|$hTGAGAG,A9$!|$@,H3d,2\QAG,=,8 G , H|$8G|$X4 HAk+ G|$0RGf_G|$9+$w2A5+ G|$8Gy+fUN|$X9Nf@JbG+=+ON|$X3w%++q+A#w3VJ** *|$H~f7***|$H},$-v=2wAEv*l*AQ|$P+% vA=*3*AXyDl)D|$8 DECAC)h$)|$@DAtD|$h%iD)|$@vA)u)k)AVO: f`|$8 |$X66  |$8)Am$HfO&|$p(Ѓ(((|$p4_A1fU((AFA d(xQ(2vfW.($(|$8(|$8Ab.''L7$AZKAu'A'|$8@|$h o'_'~KE8b7'w!Au ''5&&&&&$|$hIo|$p8N|$ 920&&}&An|$p8R&@12&fbC& &|$hg%% vAX%%w$$v|$8$%%APޑ};y%|$p,va%W% cAAA %%fPRA4$wi|$0Eǖ|$|$p#|$hlN|$8$AJAȒf_r$v|$pZ$P$F$3$|$X'!$|$0<(6|$X: 65|$8/####$ #|$Pƒ|$j|$8)##AA*\#fOur_rA2#|$0v ## #|$pA"|$P_|$X&f]u AC""fR|$@""|$P9A\9yf"|$p- H"$ !|$p2 fM"Gƒ|$X=ts !!A(ת$ɪ!!A* J6$/6s!i!AwP|$8||$0OYj3AvA+!!|$8ؤ$m|$@b  AQv$v |$8 fR, },} s i |$@|$.ve= |$X5"  A Vf|$8A6ԛ|$@AfL$ja|$p:w|$p2}s|$@VLЃYAGO$G+!|$0~A8L.C.Aw@6 |$X<|$81AAR ӥA ɥgT$AI/w-A4٣|$8ƒ|$@AHv ,|$8 fYEfU AXEV|$p1vfGndArfSrC9|$X-|$Px1A|$htڜ1f[|$pw7A|$X-gv A{Aef&6Az"AAWMC|$h!wA-#A w2|$p"1AA)AAF/tj|$PAQG=3)|$p,|$@v|$X<|$p4$]AF|$@w4AA(|$h$APA1ЃUAGՓh 8|$@ A A&L|$@:|$X>|$P}s|$h fYBfOȞ5+)|$8"$eA|$p6|$X:>|$8tAi~AAw|$X \RHAAA<0&A w8Amszm$lm|$X9mA |$X=d|$p7dd|$@ml3l|$8 pf_hp|$8X|$> :|$8||$0k|A|Ax{|$p#w0|$hS Ѓ|$@ |$XEAvA}|$8L Aqg]S|$@jk5+!$AtW|$8|$A" ]r !v|$8|$8wn|$c|$X;c ccc/%|$p w8 A6 c$;AAPF|$8mb$Zkb|$n$nA[ `|$h  AG=|$hw)(; AefVb|$h3w"v|$X8X|$p cA-Ѓ$|$hewF]S_x04fThAOTR A|i|$h`Vi0i3|$0.k|$htkAk$ |AA1|$ w1NDATAlAKn|$h*lU|$p7"ЃA-$ |$/xn|$h d$|$8E$#|$X>##"|$X ^8^AYf]71|$@ 6|$h (f^J|$0Z]|$p=?fQƒt AP|$@bA`wb|$8Ѓ|$@a1|$PA+$zӣA|$@ 1fUD \c\~tj`VL|$p$t$A`$|$pA AP{|$8|$ ##vA<|$hkh#AJQ#|$HF# v|$p6#A"1M! qfWg$[Ak|$0g|$h8A9  A   |$@     x $ wq|$H$M C 9 |$h$v/!    A d Az7|$p6   |$@Ay sƝ|$k|$P2Y f1!|$X=|$X6u|$h- A      |$8        fXv|$8kɺOc Y A< $ Ŗ|$PC  N|$@9f6/ |$H1|$X :A#AsNAR7vALy o AO Aw7Apf\J|$X2wA"  |$p.;$ A $Ѓ |w!N A(  |$8vAb z p |$@F0A|#B |$h>fBIz   fH Akp |$hEfFmv|$yoe|$@u|$@H|$X?lAY_&Av|$ vfT|$@Aw!AvgY|$@EcYOE;|$Pf*f|$8|$XE|$8zh$ Ph|$hh|$XYeALe|$p|$p$g|$0rgAGiAQw=dd$Eufa0&gxЃ |$@f]^A6s^AcA^f]u|$@`v xS h|$X'ajdJ@i1A D vA>|$0B%]]]A5$wG|$p$Ifa~$bX v|$p@6|$0O[|$0I}[|$0Fh[d_[O|$X/O |$8 vAywN|$|$p)\A?2|$@e|$hgvA|-#|$0FZ|$8#ZA|$hAB AACAWA! Y|$@cA@ A  A9 ,AwOQ Z|$8|$0J|$h9|$@|$X-N$ |$pw)|$POu|$8c|$Hƒ|$p,t>4* |$pA|$08=N|$8(NAN$t f[fa|$@ Aѐf`AqrAvhVAg([|$[4$%є|$h_M|$P}MAD!Ѓ|$hs„Ayrhf]ORH 5 A}  Aa|$@ |$0JJ $ fbƒ|$X!uA7{|$p A AE R|$@]A|$8&(ABxA2 $|$P|$@$ |$hnA{p|$  A5T|$8wOЃ>4f7J |$@/A|$81 |$X/A$|$8|$p:1$Α|$@ |$X65|$PAV1f3DD|$@&|$h" fTA|$@ ڌ|$X7|$8A<|$h~|$X-fah|$8$ATA 7|$X0ӑA |$@"A$ ArwD|$hSzf]G|$p92)-Ѓfa|$8wdAw:|$P!vAx`VЃDAw?|0u f[~(A|$0vwIAv6w$|$@wtAwbw8|$hCw|$0wu Ae5RA$-|$ADw$wAIAPAC|$8A|$p|$p'~t|$0bU|$@@/K|$X=H|$h$A8u1Aw(A*Abƒ|$p!t|$hvw|$X-weuwVlA w"v|$8|rw4k WMf^|$@w6,"1D@Aaw'fX#Av|$p+$w9v'A wsi_U|$Xv&|$0TwEt|$0Q2(AwCf$AAfV|$hcAp|$XEwgAw>fa~.|$p#w'|$hTv$Y6,"|$p$w-w|$@uv$OAAwAu|$X9ƒ|$p#t3|$h@w,PFA;w|$p.$A@Ѓ v|$hw]|$8w3$RwWWAawjh|$8w|$@ h^TA vfY<2(AN f7~X|$P}.|$p6wAA|$X9vHAv?v.|$H~vlb|$0;va|$8wPf]~JD|$X-A^|$X|$0fGAav|$p$}A~vFAw%[1|$HIA3A[1'A|$p&|$X3wIE_|$@|$@Eu<|$X@w"fatAv~cw$uG=3Au.ZwA=w!Av[|$X:w.$|$P}&wA{qgWMC9/%A-v=A?v7Aw%|$hhwA|$p (A E:uAvf1|$ ] vV BAFwqAwO$M v8|$X%v'@  |$P}"ww(&,wjAw9swm|$@ w,=wAvND:A&=wAv A |$X7wxEwKA6|$X/w |$@vA:|$8|$@ ЃkAWMw>A4wAF+!|$X(w,|$w>|$X4f7~:|$X8ƒ|$8 tw|$hv8$Av+YwEt_UKA 1'tj|$0\wJ|$0Rw9Zv*u|$wf\/|$8wwu|$8wsi_UKA7-#AkA$\wR$v;|$@w4AIwAЃ|$pЃwAKtjAOYOE;1fT,Iw- |$fQ7`$ w3|$@ v"AVЃ|$8 |$p3w$fY~i_UKA|$@/%p $1fYATw-PA4|$@zh^TJ@6A"Aw'$G w!AEvsw,Aw#m|$@wpvTJ@2|$h=wA<w1AD@$wa|$pwPEuK|$8w'} dZPfMO:0&|$h;v#4ЃA/|$hU|$hcwfA@vV|$8wOnw f\|$PPF3)faEAA8w}|$@|$PnwV|$@w1Aaw(t v-fGVLB8%v$ $av[f\U|$X*xAw0$-=SI?A .|$p9wMA9 w"AA|$@v, AAw|$8,vnwv_wAwyoe[H>4*|$h*lnYA@AlvA|$8 uAk UA'fLH|$p3v7v/!V|$@ wEЃ=3|$hwk|$0bw>jЃ 'v@|$h%f^u#|$XXw|$84w"ЃZv|$PvlY|$X4w6ABw&w:0&Ax|$p v2|$8AhtA}|f1wLw"gv|$pFPF|$P|.$|$@1AAv|VW|$8w4uw"` v|$X rh^TJv+|$hxw+! Et#|$XwA8|$hAyAEA>|$h+R;}#A|$P|Avuw|$X1v$ AU/AAPALB8|$@wAPANw,w'C|$H~&fW~$ |$0Gwh^TAof$ 4|$1HA#Av@@w8fUVwD|$0/w-|$p5ww|$ vVAw6A/v&A1w$\RH|$@ D1' fPOfXwA|$pvv|$Nuka%HA4*AwZA-vG|$p7w@1fSAu|$p&|$wa|$8w7w%A7va|$ OE|$X-vA,"Aw$AviAMw;|$@v*fSO>|$8 yoe$hwWAvGG w5|$P}.9|$hv|$E A_wF|$w<A|$@w}si_A ND:0|$8 |$@ vAAw7w/|$8t<|$@v+Av|$8wvlbX$w5+$,wBAGw2w*AGwZ|$pwC|$X!^|$pwqAwT|$X0wC|$h{w(AWMCAt/%AA|d|$X$tA|$X3w;w,AGvw}si_U?AA5+AzwtfV)A|$H~%A:AAf_eAx|$@ v|$X0wQo\|$0B|$pwmw[|$pw$+Aw!A9vI|$8VweAvRBw@$v3AEPyoe|$p$w:A?v4NA7w?A/u/v$w]AwJ|$8 AawO|$pv>AZw&|$X2Ѓ{fQ|$h&wvAf]t5w-:|$P}:v+AJvA AHn$nw7$|$8wmAE}|$X%w3|$hrv"AwA4WMC|$pw<|$0=v5+|$HfTt"wvOA$&V|$p f`~@$2wA^TA8w$|$@<|$@* A4|$p*wj|$w2f["v|$X3|$8 @tw |$p.wAqgNT|$8 ?A;|$X5n|$@wu|$8w,|$X5AuA9|$hZw!wA4|$v9GABvGu8wpff\OPF<2(f]~:|$hAw)A A9w&|$@|$@ w$Av|$wyvj|$h:wO|$0w; QA v3|$p)w,AA#) |$hOv:|$8u |$H|A:RA|$X$Snw^Eu$AlvJ@f\|$p%r|$HQ0: |$82A9wl|$8 w<w"$X|$0-A3 A|$@ AG|$P}NfZ~&(gAwQG|$Po|$@Ѓ/|$ $DfSj|$0AwY$vO|$H4|$X8v#Aw|$0E(|$8wwwemc|$p$ Aeuv .8f`uEfv3j=|$@wN@Ѓ|$08w{/wI|$@v8|$0/wdZAF<|$8fX|$@AtI|$8A=/|$0;w@|$h wA w3Kf`u|$@}AA1|$HTAU@AwR|$X6w7$u#Av|$8A$x}(f\!|$@ |$@ }fS5|$8w$A6w`VLBA*.fYf=$wrf@,|$p)wl|$h#޿|$8w/ f^~|$X2鲿騿鞿|$0'v%鄿|$@ rh^1K> |$8|$hA'wi|$p,wN$v7|$@v&u A4־̾¾A鮾|$8As|$X2<00u|$@A|$0Dh|$ A/A<TAwNADAwaAEwQ|$p2wp|$X?wi |$$u Aqw:铽鉽Av'mcYOE;1$w"v|$H |$@|$8ϼЃ齼|$8A$w\|$@醼|$8|$0;|$h=F<|$P~$|$8v`f`~P|$@|$p.w-ACw'|$pv$(ѻǻ齻鳻驻韻镻邻|$8 &d|$8 F 3)[ Ѓܺ$飺険Aq鈺ACAwKA/w|$p ]S|$X&|$p4*|$8$m|$Hƒ|$8u\A9wV޹|$X1kAzN'A`|$8 钹鈹|$@vzb$fa|$p&|$ x|$P>(d|$8w!?vA4ӸɸA:鸸|$X/v/Cv閸錸邸xh|$p|$8?5|$|$@ ӷɷ鿷fa!|$v|$8阷<||$p+|$._$e& A|$XA)Aw1|$Xtw |$@ vfY$Ew'R϶Ŷ黶鱶駶|$8Au/yoAA YF<2(vܵD$8PǵA9whA8魵 隵銵z|$08w7AwAYOL<|$$vS|$h8wyf`KA6w$vA@ԴʴfV驴AvF|$8v5$:遴fbVAvF|$@w?dZPFAw/|$X+Ѓ/%A|$p|$@߳ճ˳$v4qw,颳|$@鐳#逳vlAVXNA:0&A AAղ|$@ ò鹲鯲|$ wfb防鎲鄲A]w)Av$_UKA|$8/%fYY|$X/vH|$0w!vfPڱбƱ鳱驱韱镱 酱|$@si_|$h v]KwB|$@ЃBw~,A,|$X3wvݰAAai$E陰A|$8 |$pwO|$X-w)A2t |$XhJfbDv2|$XEw++|$hXwO|$X#w'W |$@ wckw.|$8 կAwJ鹯$tw`f^>|$@v-錯邯rhAw-1|$PD@L|$@w2(A)( |$06A2wjw0֮|$p w*A:v鹮鯮饮|$8v|$h鄮Lqg_TA|$8/AvDm حέĭAw/|$8驭w;A]v+|$8錭>v\|$X8wUsifY$ASw7v%|$8vA(A.I A|$8f_EЬ|$h*w |$h"vfW马韬$uSf_t3v!vA pf\|$8vF8BAEv#|$XMvA#|$p1w6A٫|$8*|$H}5鴫A_v-w|$0xv钫鈫~tj`VLA^AOA)|$w9|$hv!f[~|$8Ѓު|$@w#Ajv|$X8鴪A頪閪醪| ЃmcYO1f:D@= wAT v"ܩҩk鿩$v8U颩>wT釩}Adw'|$p&w dvZPF<2$>vPA@w&|$X4 v0v$uը˨鷨魨飨wb|$p/wHAz部|$X=|$@|$p7AUwALAЃ9|$H |$p5 Aj |$@u |$X9 )Χħ鱧駧靧|$8 wcw鄧zpf\RHA4*  fc;|$p"w*v"AvA9զ˦A魦飦陦鏦|$8w,wALvpf\|$X-Lv`vN)wA$ w$A0vڥХ AvAB鞥i鎥$A:k|$8FXAG|$hw=fZ-Av! KAfѤA|$X9wG|$hw#|$@飤A 鏤|$X2w>Aev.rw72AuTJ|$hQvo3)|$@w3Bw!|$0TvUۣѣ|$0D|$@A:鞣|$8QAs|$0QA8gAww|$X,vfEta1D@A$w2|$XBw!|$X,v|$hz ALݢv#AEv鼢鲢騢fU;鏢|$8w>|$X@w-|$hv&gf`DQG=*w%|$X6v|$vWAFvGw.#ΡAfv|$p<鳡驡韡镡ACwCzw(Asi_A+ЃLf_~zAЃ3|$85|$0]mAqw8Aw̠ |$@鰠Aw |v釠9hAw($$ w*A7AwVA Ѓ|$p2| AZwA|$8؟|$p"vCA&AbЃ驟v鎟鄟zp]Abw2Av"ApvA@9/%A|$X5|$ž$v|$@雞邞|$p0|$8B|$P}.mЃS$Pw4Eu/7$Ww,vL2 Aw44Ɲw |$X-驝|$8w<|$X=w"v|$Pyf\aI|$X1A*wAAJw|$X5wf$E ɜfaAhfY]|$8wE镜|$h:v$Aw{Afj`AO|$h)'|$@&|$0wlw/Aw|$@ |$P$ t`鰛v鐛醛si_Aw!$\vB8.$ޚAw"|$X;v鶚|$8v+]ƒ|$@uA 鄚zp|$8vA ZPF<2( |$%vK ASw<|$X5ٙAGv|$hCÙ鹙鯙A钙鈙 w)|$@w"oA wwWMC9/%A |$8w]|$8w6|$p'v%(w鳘D領閘|$P}Azvv5Ѓ\Av.|$XTv9/%A*ؗv_×鶗鬗颗dw9$v%|$@ w邗xndZP@;-|$pwI A:w.|$@ݖ|$@˖1鸖鮖餖|$@镖鋖遖wdZ~ G84* vAA8 ȕ^A髕h阕鎕vA>tj|$;|$Hf\1|$HD@7-|$X-t:|$X%v)v!|$8EٔAw:v(A$A鳔飔陔鏔|$8 }  a|$hy  i:0&A9|$h/|$@ ד͓麓|$@ wiA!wP|w>AEwEt|$X:}[g]J|$8wG|$8w63Ѓ*|$|$@ Aߒ|$ǒ齒|$@w|$Xw饒雒鑒釒|$8wA|$8n|$8Ѓ]SI?$Zd|$X1$A3ܑ$wQAk龑鴑骑頑w5AgwA~tAucЃQwfJ<2(|$8w/_wA{vސԐʐ=wv|$h/飐A鏐酐AJw4Ѓmc5vK|$@<2|$Dw5v#ANvV 1AՏ|$p+w!gvAS魏A;w;$t'|$p.v$ vlAGwJf[~DVAMv ARv|$p8:0&|$@wA7ӎɎ鿎鵎髎顎闎$uka|$p>v3+w.KAmw|$8'A |$hRf`CBAƒ|$)B鵍|$X-|$p%鉍|$8|$@TJ@6Ayv;|$P*Av!ABv|$0Mv! vfRʌ鶌鬌颌阌鎌鄌|$X5v.Aw|$p7wcYOE2|$P|$8 |$X?|$Hvs$wi|$88vXAA-؋΋ċ鱋|$P&Uw阋鎋鄋zp]S|$P#l5fbAA* fa.|$0BAApwZ龊|$hwkAevXAwcw[铊AdvR:wAt!`VLB8.$$9$G|$hLwm|$p/ʉ|$p>|$hGA |$@Vt|$8  "o\RH>4|$p%wD|$XD|$0Ct]$t8AEw2v$ˈ鷈w>s霈|$X)voA{w%AF{qgAt(v$C9&$vDqAVv]}vK|$H~#|$hmЇƇ鼇vA雇鑇采Awka2KA 7-#$wkv vۆц$wAH髆集鑆釆Avl|$hZfFƒ|$p3t,|$0Nw%6,Ad|$p6w%|$@ƒ|$p$u|$hwDžЃ鵅髅|$h-际鏅w(Fw :lbXA9w0v!A9u6," w+w&ЃބAVv|$@wDŽ齄鳄|$p+vE|$p5w#Av|$P還|$h w(A?g]S$w{a#A?v&wփ̃|$p5|$8 !Ё„t-Av$隃|$p/w逃vlbX|6w.AvA' |$hwDA;w'AuЃՂ˂|$X/w06骂wv銂适v~X|$ wGw'SI?|$@ v?A$|$0UwDAwA|$X9w;w)|$@ v"ρv.鷁魁A6霁钁鈁~tj`)MCfP/A |$wz wU|$p8w6AUw&?v܀ҀȀ龀fNb|$@馀$Mwd鉀|$X98 w 4V$(E 5|$hG#4 !Ѓ|$X„tMA wDf]~4AKv!|$hut|$p A}wUAwEw@v$uJ |$8t+v&|$p9@6,"A|$h|$8~|$8|$p8~AUwrA wDA w1A v!|$@v|$p3~~~~|$Pc|$XBw.A v%Z~|$H?~5~$ ~~y~wb|$@wQ1}|$@} ,} }}w!Avz}p}|"v|$p5S}I}Ѓ:}0}fR} }|||||||z |$wY$w"$~|t|$v$fT|J|AfLpx$||!Av|{{|$8vgANw;Aw+|$X5v${{{{|$p4wQ|$X,vJ|$8u9|$X:v2}{$w@Lw'U{K{A{AN0{A{|$@w;Akw"|$X=wzz(z|$8w)|$hЃzf|$@zz|$pMЃzApw?v-|$8wXwez[zQzGzh.z$zzzyyyyw|$0Iyyyyy6 yAwBAVw<nydyAqPyFy|$@w-At' }wswiw_wLwBw/w%wwAw|$@vvvACw5AЃvAwH|$8 w(Ov(vAv5wvw<|$P}UvKv wfX3v)vv|$8wL|$X6v;w3u|$p4wbA"vOw@$w6uuv|$p uuuuAuf*iu_u1OufG0A5uAw>sv/ARu|$p#w5Aw"Atttt1|$Ptttttttvptft\tRtHt>tAaAfK|sssA[w7$$ s|$@ wqw9s$B vAss|$X9V|$PA|$p1wB1|$@ Tsf]>|$8|$X5w1 (s|$%w|$@ssAzAkfF$DrAbvwAGwdWrAAzrprfrAwANrDr:r0r&rA^v>|$8w7 rw9|$P}(Aqqqqq|$8wfTqqqqAmrqhqUqfWIlwA klalAJPlFl<3lu ll llkkkkkkk|$@kkkkkxknkw'ARk?k5k+k!k|$X.w6|$X(w%1k|$8jjjj|$0cwij|$@ fb|$p.wUjAAAx`jAv*w"Ej|$X6wAq-j#jj$Ѓi|$hv.iAsiiiii|$@iAHi|$hx|$p!wFA?w|$8YiOi|$X+…tsAWwj+i|$8tAAv8i|$8v;< hhhhhhfDUS\$`D\$(DT$x$  " wq%|$p  |$8 $nBM )|$0.w|$0N []|$8=|$0ljA |$0YU |$X/|$p2(7|$0@^|$8v =|$X$(* i|$hnwy|$dh |$p%/|$0>|$8 O:6C:` hly; T$p>!|$p64|$hM|$ j|$X+֌v.]SDe|$Xd A6$  Pj5|$p!=O|$m$"a %|$hqfAW<A  F=($8fAHkS<*|$8v|$hD:@|$p U|$H$ (A|$0#K"j|$8 fAD|$8*|$@!pf.|$0L=p,|$X)! 8} fD|$@ |$hF*Ad$fA?99|$@U$܊  1|$HD|$0"d|$0r|$p."|$X5@vqMCD R|$h#';fAVMo fDfA`|$0W$e!|$0>FAJl_|$@$,,|$XI|$0!-/I1 |$h0j+fAY?|$8)MZ)fABwfAS\|$p.fD|$|$0M )|$@ R=|$X!lRw \|$8Y |$0 |$8A#:/Ab|$hb D8GL$@|$p2-1f 7|$8)|$X7@GgoW  {H$a=c cfDfA> |$p"|$X$|$@ U |$X+b |$0. |$8d5W|$@D}l|$@ Z@U'fAaG(|$p<&AfAauAfA[H+v|$X'f|$|$0}$|$8.fAa.Y"r@fA_|$@Gv.$fD ]9 |$h(E`,_fA<OfD"8>rJPgfA]|$p|$8|$PLB|$Xq%|$h}$0 |$@f|$0@"f|$p  AS*1{D$| AtE|$X$E$!1|$H?! fD|$0h\|$p*0 BFffAS U!1-|$@ fD|$@mfA_W@wfA]3)dtj?X|$8zfAn |$0HfAV1fAIG|$pr|$012|$X=]|$8![Ѓ}|$x= fAa"fAUP9Aw$.$fD|$hf$|$8#:T TqJ|$ ?|$p*|$@sЃfA[ |$0|$@:AQ$ %nfAO |$P hWJ (i |$ ]$w fAc^ |$hA-OD|$8 $w|$0rf\fDK fA[:'$' |$p!|$X,+?J j96|$8&jmamL|$X=|$P$Vj@b =$ ?w fA\Uf fA]C"|$0Z4A~O|$XEL|$0L|$P|$@ |$D|fD|$XU|$hn[|$@<%*;|$p;7*|$8w |$h! DfA\ KfD <|$0Y! (A  v |$X4@|$0q nA|$8A1|$0ZP|$09kA|$p0o& v|$PظfDA Q m|$X'(|$hX p&*f.|$X b@B D|$X#F#&0 `E|$pA$jA+w_|$p!A ,|$h:M|$p12P--yBfAQY|$p/?|$hP4F|S)w fDES|$8$|$p1yUfAMw|$h+ >$w |$8|r@_)3Q@]`|$8͍%zHЃD|$X-|$0h*A8|$85|$p,7;|$T[&fD% s|$X6c|$X7=!Yv$ :0|$8 $NT"1$|$0F 7|$@fAWXAH|$@ >Gƒ|$p:<:I|$p|$t(E 8 |$p o$-1 [+KB>Aw |$r|$X/vG`V|$h||$X);(|$0r& 1|$XKj|$0N&$S 4D0=9j$> ;fDx|$0ZN(|$@ B$; e\H 5fAEi $  :1fAYO "'t1|$hKLEf|$0DufAI $(AQC|$0RY`9D|$p%9 fD|$0E |$X 96R"eq|$@ DO HCr9_yNfAL'|$@5<$=k|$@}}fAIH lt kfANkD|$X !40cGfAWp$[$![GW|$p&|%:8fAXh|$8 1 -v|$8 |$h)'|$h dPym8|fD F_L;Z*+  ,|$024hzv|$P|$0Z |$8fA@-|$8 oaAPI!]8ړ|$p!vm |$|$p!$ ƒ|$pu[|$0A|$8|$Xn21|$X"cR|$0;BV0)b`61|$h1VANAAWdf$;m.|$P$?'|$L;/|$0{GQ$#hq QA; bJ  v D|$@ R|$X78|$p(_f|$88,|$@~,osAv aW|$hw|$X#A|$0[.|$p&lv |$ho fw|$X|$P| I|$0||$hpR+|$pKfA_>Eo+X|$0-,)Z|$pO|$8. }A$le|$X>.|$h?.R,~|$p|$   _fL;( : $l.Nnit]0|$h1|$h~q`ZM`3|$XAC/|$8^|$p% x|$X |$hWTAVU V|$hiH|$ ^IfA` N|$8m$f|$@^DNƒ^|$X5}|$h[G=_/|$Xv|$P |$X6T/L_F]%v.|$@fA`OE |$8{hhfSvL3C|$0>i7|$hJI|$hff.|$@ 91kD3;|$@bhc|$hp |$@fD|$@ 5h|$XBLfAUJv|$@) %|$hw)Av,fA-|$p&U&$1fAd |$hT$|$IQ8vC`4|$Xd|$X4fD|$@m4fA]M 5  ت$1|$hVE|$p=E9LWfA[|$AJut$@c3$v\|$pV:*@|$@p|$8-A%2U1|$8YWr<rU|$hmD|$p1hx|$X'@@1F|$8|$X5+|$hM@|$P5>u v|$Pܸ|$0;, MmP@<<Į yVf|$P|$85$;A,xA|$8|$@ |$8X>EO>|$@ i vi2a )J_1L|$p7c) R_$A_|$tcgݶv fD|$8a |$X 7NS. d3|$8$DfAz|$hHB{A[{|$@;D  w|$X*fAH6kifA[1i@|$@U V|$@ 6|$0MfAYl|$@[fAT3e N$N 2@D I!|$@|$X6|$X$9|$_ki6$|$߱|$8Ov |$h& |$p++;U'0fAY|$@$,7|$XB2@|$0F |$p:C A |$X*|$H}  wzvdZfAG|$@=|$p" $'|$@fAcW#|$ L#|$hyL fA[~$|$p,3|$heXfA`fAZ|$h:|YE2Al>*PFC$X |$hKfAXkWUW|$8@_|$4 yv  ƒ|$0}~YA(tYQ|$X7pfAO6!#QF-|$X&SG|$XS|$hf|$V|$P8|$0vz%$s0$<0 SjV] >|$hZF|$8|$0QD|$@ D|$8VGlDd|$0m:A$  4 v|$Hxn;]J|$p?|$X'C< cv|$@@1VT8Foe|$8ZZeQe|$h%&fA_|$@ Fx9b@$ |$8;|$0D)9 D w|$X9|$0ƒ8A8$|$p(|$P|$@fAP m$U< L\;|$hyEB  v \zx8: Y'X= 8D_fA`R^)H0k4&DCGe$ |$hcz$qA0Y|$p'&A^*ܚA] :|$@/of1S Bw![1 O1Aرv |$8^|$h,Ij|$PGTu-)fA]|$0e$P|$8 $|$0[@Ij|$@fDN|$8,eB|$0`oAo|$X;&777|$ 72$2$|$A nfAV0f.|$X@v|$p5rX 8GrA$N|$X1+cR=RwA|$P|DF}|$X7i;D|$ /N4WfA_|$@FZ#flR} rSUV|$8A |$PzK~|$80 OR@1fAZD@/B;xI\o1|$@AfD|$0u"Q|$p-yQ|$X1;$|$p1E|$@_- B; |$@& ЃVfA<F|$p.|$PO|$@$EЃ|$8`!7]c |$Pϸ 1$  ,'|$0JDpaARA1|$, $2?|$p1&fAd CofAbԪ7r7 F.   f.7 8dcЃV|$8FAw-|$@nk|$h4v  |$@޿]ο_wq 髿I阿|$X$KfA^17?b|$8ͰfA\|$@NfA^Nf4|$@ 4|$h96'|$89Z|$8 оq " 鴾$SS(GtYYx|$8h)|$h;M|$@|$2$0 |$0j*|$I|$X7ifA],J E|$8龽$b XFKDn w"$ Hj|$p5\PU|$@3|$p/n&:|$P zA|$80u_|$h2|$@2мf.2v|$8%餼gA 銼 ||$h -|$8"SBVC$&1|$p&#$ V#fANNE Y|$0,|$0'LۻD=e4髻l銻|$h$$*X|$@S|$p/SN;|$X:|$@ 4G+G  m#S0|$@#vfA\Ժʺ麺|$@v{阺|$p+醺|$X|$8J&d|$0)IUEB|$p/#8 ;2 W  fAbO 9ufAX<v|$@驹 D|$@酹|$h ud|$@R|$%To+JJ|$c|$hXI|$p,I$I|$0?I|$0B fA_8鱸fAN|$h{RfAWwQ|$HNufA;fA#5ЃW|$p$|$X7.|$@b %|$8 Kq I$t|$H|$@ Է|$pEPjG|q|$8Ѓ隷@9 F<|$X,p4Z@UK|$8@|$h{0  JD $Cƒ|$X%t>޶Զ^QvA零q$"0<|$|$0`^[|$p8[|$8)C|$0z\ +h|$@  @ a|$8.iKu|$8 p鼵|$8fA]<|$]h vxffAX~2|$htg|$02Ҟ;5+1c.7?9Gm ;m. δcH鲴A Y0 $ExA|$p==|$PVm9|$@ 34rm&u|$Xƒ|$pt|$pܳfDy C  |$p4<%$'鞳wA}j|$p4Z|$X2!_[0 |1fALݲ|$h.#9HfACU Ѓ馲|$X@|$@>|$8D遲|$8,;|$8 vo^T|$83A$|$X%[Ӝ|$8|$H-|$Hѱr鸱fAW =銱:zAivPFdKA>$ >u[rٰIɰk鶰?钰=v|$p zp|$0+|$XADAtX|$PO7-yw"H үi"hCG魯|$p"\镯邯o|$p ۩BDC|$8 >>%A!fAa\$[9|$X ®|$8!|$XD˖AV1|$P錮2v|$8tj;v QGw9 .\|$p T|$@v  oͭí|$8fAd\!v$郭pA3MM|$hnMEM2A(|$8).Z|$@ XwC|$X "@$@ЬO ~#|$XC[L|$hZ,$X L銬:co \$.0|$ I]'"$|$X7f/|$p;Y_|$hЃӫ| f魫飫c|$@|$X1| ihr5. M'U0SS -;-X1ު|$p2O |$p!K*go8鬪J|$X= >|$8 >v^lbA Q|$p,/aGy)|$8,0|$hE {ͩG鬩orN釩@B|$8AfpBwdBG%ATV|$hw_|$@ |$h*|$hPA6mT#m|$8 |$8R{|$@G{鑨^ |$0`Dc|$h~,|$p)JJB|$ 6fAZ@|$@  $ fA\8JRf|$8Nv%ѧǧ$ v/ 韧fAa*X|$h}dETfAL |$I|$X9/ ЃFD|$p!H[vAMv|$@ ΦĦ3鴦$s2J;|$p*l邦|$hK A 9 - v|$8ka|81|$P?|$X,&i !|$0l|$8&d?|$p*o|$0g|$X2K$̞|$h{F#鮞|$p5|RIA錞|$h%|$@ s c$L |$hYN |$G|$8{ (ЃffA]ZT|$@|$X5l|$hd!MfAa|$p|$@םf{fAO]|$86|$@@*7|$p(|$X*E|$h3|,5|$8 l|$Xw$Ȝ龜|$8Q P, 锜fAY:CIfANC_|$p4:|$X;+$1~YMA|$h[|$X0F|$8c|$T*'܈|$Ĉv|$86闛d&v1|$Pi$!$V$H}K5}[ 01|$8 Ls|$0Po7 +}|$pOt<3饚|$0D|$0q?|$p:|$^GfAM |$!fAB1v0&A'|$X:3|$ ԝ|$@|$p3{Y |$8j=|$X-2铙|$mX|$@Luu ^T=|$ w * MOZ5,fAV-qL|$@鼘Al|$@L|$XE:|$h|$h19|$h~9|$p i9%S9|$H$  C"2|$p1U&|$Zrr |$p4|$@0 j{^{鷗|$p'!$72+2酗A v|$0j`jR|$d(|$8f|$X.fW |$0l K|$8 ̌ v|$8ܖ|$hvS Ė麖|$@{V5|$8Ui|$Ph|$8Tr% %P|$h7"p6|$8'Y! A|$X3|$@ ƀ.ەѕ$f7%.@fAI@韕 鏕酕Kc in fANu|$h D:A~!$5 a$A W9|$80Y_9i龔|$@ 鬔颔@$A~.XAwqgT|$pM6,"fAbAGDY|$h#$|$@Ѓѓ%vfAa飓C|$X+,$ t|$p $P|$hPv]E;|$@ ) |$X@5|$h |$o|$@ ϒŒ Ѓ鳒飒|$p($u(<z|$8$|$Xk:i0wND4$"|$p7D. qz!Gבđvc|$8v$鑑$fA_tVgP M^:$M:mcJdc%|$8#'H:$wfAbS%|$X$f$ f$pY H$:郐Fs|$p(|$Xt|$X(s-z'$C$|$006|$@Jd/q *Տ' ^2]|$8Q|$X.$ƒ|$pu lXho6%d-%I|$hh$6ɍVcj!|$p C:|$H! PЎ|$0A'|$X*>|$pp p 鐎1|$Hz0v aWD|$pƒ|$@Vt{Jt%XKyB'|$@|$hz|$8ύ\7|$p(x7鮍|$p |$@wfAWw郍Ѓq^ ~fAYu|$0`v  |$p$ fA]&J|$X v ތA͌|$@o鯌|$0i$ LZN`T|$X8i$N|$p"v$VLЃ=|$P1|$0OUYo|$8- xP|$Lc . X[E! 龋|$8v霋|$hI:Sv|$@yofACE3|$8[fA#[|$&}|$@1/.~PI}v|$X8fA\,|$0{yMHȊ$ n1D養]v 鄊|$X5PfS. @6|$8 &TGy2 Nug"Aw|$8؉Ή黉\fAb\ \|$8 \郉|$hh!|$@ !:U|$X/1F|$@-?aJ|$X0 [-4Ѓ1*|$p*LG|$@6 |$p(vF靈Eg +|$@yAuB[Q$*Rmh'|$Pox.WfA^|$p,N|$h}(2M|$@驇韇A4{ zfA^)|$heE}QA|$8 H#}S|$pLbKY|$X%:|$8 ]nQnD顆r)fA`f;fAqfA\e0 CPEvD:|$P|$PsAƒxt |$@ ,iU|$p(UUÅЃ鴅$ K%v|$@xA)|$8UilU|$XU6|$X#vA |$@4,N|$pWfAaE݄ӄ{C)|$8 Dj 鬄{VoV銄fAYT\">f|$p82ABf 6f|$+Ѓ1q$4fA[|$@ӃTr$@ 钃v yo|$X.d0fA^]|$@t$( <2|$h.T|$PZMTM5|$0M.|$se:7X|$0$?V阂KЃ鉂|$X77ЃlfA_WB;q8$o  ~U|$0Pv ہ|$@5|$8ti|$hsi$h陁fA]-|$0Je|$p2f|$X:oE2s|$0]R|$pU[|$hwS|$0R$E|$p$|$HO驀fAa1 鋀fA[\q7g|$0j8|$p0M  Ѓ|$0guf/%Ad1mfACmC=fA`cNA@|$Xv= |$hV!/|$p!\j*$S ЃK|$p90|$8{/|$hp/E||~G1;sd~|$hAS+fAW[c~:YR y~|$0}],[~_R?~Ѓ0~|$X(=u'uu|$@|$8k HЃ}|$X7]|$X!J2)[ |$@R}|$h7|$@}d ЃY}l|$X(zX{X&} -fA_-}fAZ-fAD,d||$BM2|$0d}pqp||$h|$XB|3z||$hqr|$P_|Rr(F||$X1!2|$0Ic||$h}--|$P$vL{{fA9fAWiP&{TЃ{w{{{~*A)ZR{|$p"3|$0\A[|$X>Gz|$z|$72|$h\[hD$PЃzA z|$X020|$8a|$X*zz|$@ B|$p'AQz+ pOЃ3z=.fAgaaz|$8,y|$hlA=yHvyyyyv]yuy|$h_'YfAff fAM' A\ |$@ -y|$\ H|$X<RAR|$8 x|$h+ ЃxX4=Gv|$8xxfA]Cxpx" D{$;Sxe eƒ|$Xtx x$wfAa&|$@^:v|$pww*|$p^,mЃwbfA]Qk|$hvKLwBwc 1&wVb+B|$@ )vD0|$h+BTvwvfA[2%|$h@cfAXpW|$0iA$~5_vFLvfA`OEPvv$u|$p5ƒq#e#u\3u|$p1|$ |$8Hjt|$oЃtr d v$ _tUt>1|$H3tgI =$'  ssss|$d s&s&E|$HfA;E[EhsUsmT\@0s|$ {sЃsfA\ƒ|$@   rr@ L|$bLЃr|$p&k|$X/k7k1DmrA\r$qn$@PV DV,r*rfA]`Tlqq 1q eQ qb,|$hPW,qqG acvA_qUq|$@Cq9q|$hk Xq((p|$p8fA78c0 |$X<% pU pppvp|$@fpSp|$8t$6p,p$7L(Lo o|$8+$+oo|$X+ |$hu:|$H =oPRi|$hMo;x : 07g o^9*fAW.*nn$)|$p&eJJn|$hnn|$p8 ]A|$h\{$M Dn:n|$8fA`OJh|$8y'O|$8N|$hfA_{ogggggg|$@gg|$@.CAOZ\+wgmg]gJg@g$^cg|$p$ffff fEt$ffffsfcfhv|$XKfAf7fz$fff$|;|$8H:|$e|$P40|$@ ee|$8?$>fA]Ќ|$hEŌdeZePeFeZ.Z8/e5f||$X.|Y|$X)r.|$@Y|$8Y>- |,Y~AoqY|$@SYIY?Y|$8<$)|$@fAQSHYX|$p"-ЃXX|$h*X{|$X@(fA] $1|$PD@X|$@(o(eXATX- xb|$X6(|$@X |$@ЃXWWWW|$8p7Eg7W|$HM WfA_8WvW$C |4|$a4GW|$hy:|$8:A$m|$@bWVV|$@ v|$0PVV$ sUZUV VVuV#H|$@H$ЃJV@V6VTEA5 VV|$PA4Q1U$5n5|$X"L U|$p"=Eyf|$8[pUfU\URUHUIP UH|$8UTTT$BuOCTTX|$X<XTQ&E|$@Dv;nTdT QT*LL$ A  T|$8_A|$p/)AfAU|$h5Nv|$@SS|$8S|$@S|$X"vSSV _8|$XT8rS|$pkM˭[vADS:Sx'SJS SSwhRR|$0Pn5GKR R/%EgR]RSRfA\44IG R|$XCQQ vA QQQ|$p<J|$X4JQ|$XKwQ|Q iQBVQLQpv|$87Q-Q&QYfAc|$hrsUP|$8>=}<ABe$YfARYAA5vUPP|$0Q1adPfAb  'F1P@vPP,v|$@OOOOO|$hMGMOOOOOc oO|$0+vWOMOCOA|$@%OT5|$hWZnON|$p-|$h-DNfARBEfAT"E!N|$8 C`C$CjNEfAB|$X2y9N|$8'NN+ OfAZ>=|$8ot|$@M=5*|$07*jЃM|$X6A/ƒ|$@H1<M mMcMYMXFMfA]>|$0eGG|$8<fAAS<sG|$8aG<TG|$0WMC>p??|$8%AGF|$8(AFfA5K|$X4^KFa FAFxFnF@""V|$hBDwk<#||$hz{$i ^BTBWz v|$X63B)BB|$X(zMzAKxAA|$p%|$@AA|$@yyA|$@ xA|$h;fASAIA$ o(ACo|$p#o|$Po|$@o@@|$@ "ttt@@|$H3x  x|$@@|$@w{o|$X>|$ Ѓ|$0Y@x|$@5x;@(@v|$8@@|$h,]m Gm???Xq|$@eq|$pGq$?|$haqpp|$Xp^?T?|$hT+tH6?,?m|$hmE-s|$8v$>>|$PO> w Nv>>>fpmXdmt>$ SrЃQ>G>|$8 Sr|$p,5r\r r>>|$X6 m l|$@ll=$X Gn$m|$pm$ m|$p+mn=|$h,|$0k~pT6=?q|$pp|$Pp$ p<<n n$n<|$X,mm|$h)_m {<|$8wS|$0>kJЃZ<i|$8k!<2j|$p4jfA\i|$ i|$0;i|$h/zi|$8#eii\i; ;;;;;$#|$8b;X;N;1>;w A v|$X5 ;;90k|$X4Ѓ::fAb|$p6:$~o_uoToXo1:|$pl|$8,j|$piSLgv|$hKS:I:}6:}j|$8ljVj|$X1KjЃ99jfA^|jsj|$@999|$@w8S9|$0>wI|$8nm9|$@mAv|$0BL9B9{j|$p ^j|$X.9}|$h\}|$8*8|$@80 '8|$X2w6|$p)u|$p`Aw|$ 88$BJa8W8M8fAb/86w[d[|$0Y[^[177|$p4w@|$8!LX 7v|$@77|x|el|q7fA]ű"S7{/77A`L`|$@a3 a76|$p0/@e6|$X6 A׀|$@ (|$0Z|$8cYfA`EYfA_$y _6L6|$@\k|$p.Gkmk 6|$0@65|$p"kAvk|$8 SkfA['kk55 55Gp|$p8ppT5|$0uD@\Ѓ+5 5$r|$@r}4|$p.w.Brfv|$844|$X4rA{rr^r;~4q|$pBqfAMO4E4;414p|$0^np :p|$09po|$h;o|$p0o3|$@33|$p3Gmt mm$k3$ m/v A373-30m@m|$@{|$222|$8#222|$pz|$8z22fAIz s2|$0wX|$p/R|$8&L2|$0KwRG{{~o{c{2|$8@{{1EsmsfA_s|$0Mls1|R$1z1 wN|$@l1|$XNw"|$8uM1C1 01|$@S1|$X9xO0$uD|$hRtfAZss|$X1w!00fA\<t0j0|$@X0N0D0:0|$p!ssv0|$8sw0|$@ Ё`u s/pV`///////w/m/1D\/YCy|$X<.yy)/+wY|$X?\qhIq|$p/>q+q"q.7wN$vs.As|$@esAQsEs.|$X!.|$hQfA\UuU|$X.jUЃB.>/.%..:|$PL|$8'poIo|$@ Ѓ----$OP|$@ P|$8?O$-y|$8g-;T-J-@-6-|$@yr$n^r|$02rr,,,,,,,,p,,,:t$s$Bs|$X+s|$p!;,(,L Ѓ,fA;l+|$X6o no Xo8 +TS+{+h+^+T+|$8Y6+|$X9|$@+|$@U+|$p2|$*M*nfAbnX**C**}*s*|$X nM^M*C*9*/*w?w2u9* fAHw|$hv8fAZ|$@'S=A|$p6|i_Ow9$y J|$p%(fA[|$8|$h?ԃ|$X4|$>|$@|$OiЃwzp|$8wVL|$Pq|$p)E*B wЃA|$pל|$p!ɒ`|$p0bXmfAGcm|$X<4m|$p:m|$p: ~$~|$X@o~ ~A wCH0|$ oe[QGvfA\/%ƒ|$h_td|$8s|$hBvқ|$X(|$h"q7fVLAsD*|$huwE <|$p,|$XC*|$0a $-(|$hw&#@}K~n\O|$ lfANl$-zl|$@el|$0*)$$r%)fAai|$p'D|$0E."4ЃZPF<2(Fw?|$@ ك|$p&B| ,wgЃW|$h+|$p,$ |$00|$@vbX6fAQЃ/A) |$hvAF0|$0+H|$p(|$X!c|$hEEt|$8v >(|$0DfA`u|$hrxkc|$@w=kfA2Zt|$8o3)}YfAW<P:1|$8|$p(ЃvMf|$@ TJ@ 'N1|$P $ + 7ڇD$-i fAd* |$@Ԫ|$h`7$|$p'|$@<,fAOƒ|$8a|$0ga$vi|$@1A–|$P|$X"@z vbaq]|$hGЃCҚ|$p |$8#|$p/vE|$P-~ $S|$@>$-lT|$@ =9$h? iAh|$X0diINi9|$8ߋӋfAaȋ|$83|$pvfAW}s`V,F|$ wF|$XʊA݊ъVw&T  +Ѓ  $wK|$X5)fA-v u b O |$p'_ 4 * R֖ fA^[_ |$H{xfA`Jx|$8"x$w_|$X8_ wM| r h |$u2.v-?L B / %   u^^|$P^   |$p&ƁfAUPL  Ek|$hgk!j |$8hL |$@= 3 Aɨ  )  |$h/w'   $+K  A |$@{ q |$X1|$@ЃU & \< 2 ! |$X0||$hthX  t     X  $~ t L\A8\|$H-\I ]7- I]|$X/\o 'fA9|$@B[/#|$8TxHx`VC9/A |$H|$5||$8!w t*WfAVҥ|$0haK|$0^wA|$X7 |$@Fv|$PRH$o]A []n  fAK~UЃ]fA_Op"Wp|$8ĥRm X)v|$8C9/1|$@ 6LfA]XAfAM |$XrT*we|$@}s|$@a|$X*LU E%"|$hj* PJX|$)X|$pm|$0ObSw8SyS*4 ƒ|$p)t|$@ d OE= W1|$HDfAY|$8 g|$8f|$Pf|$8 f|$@ nf|$8 cf|$hq|$0Pl$>ZlGQlUK+8fA^WTu|$8 |$@eVYV|$8Aƒ.me~$,pXp$Brp|$82("w7P^$Q *XK!X&N$ $blbXAЃH|$@6fAUN|$8#/kN kEjfAZk:$ i|$8i|$X@w7 hkJ kv|$h~t$VOA7 $SЃ oA <|$p6|$hrv|$@ I ` XD|$X'hU|$hGwl|$8 GO|$8O|$@O|$h@OO$DO&O~6a|$X a|$p a$a^a2|$0[.N|$p6 N|$PMx  %M|$0WL|$@ L$wMDm 1|$p|$0; |$ |$pk $S ;7 |$07ƒ|$p" |$hA  1|$HK A u<l|$8vv[\tXj|$Xo|$p+U`6`_<2|$h2|$p!R9@8QE|$0<|$@Ѓ fAT|$8_I ЃZ|$h(i?|$h8"$PQ fA`N|$@2{^$<`^i T^ >^A 4^|$p3wM|$@|$8E~ A jfAYAPZ  QO "kAv*S^|$8u|$p-|$@?^|$X9^|$8vsi_|$w1|$PDB8 %0v! vA|$@w/IR w5 w# ~i kaAwWH wPo v>A'Qvw 8 vKyoew9v|$@v |$8r |$X4* |$X0|$hCw~|$p%wevSnEN){q|$@_|$pwXG04|$p)w{|$8vCw(Ѓ1|$PfAV~ v-|$h<|$8 ƒ2e|$p wwLB8|$|$@|$hyw=|$8wIw7|$p'v&$w|$p$O9|$0H.fAZKsq|$X-|$@Awp|$8vi9|$hsG|$@"|$p'FfA]fA`<A|$p!|$8wz|$@ws}fA`u;3w6g]|$X9v%v;1'IwwK|$p#w"C|$8 fA[/v|$8w6|$X7v/_p|$hh^TA7-#5wBF|$X-w=w/|$p- |$P-Ow5woeRq|$0?1fA_|$@0Ѓ $ws|$X0wHfA\.wv$ w]u|$H|"|$p"wY`VtCwM(w3w!Awr $fAbY|$@wHAvBfAakt]fA_D3v5Bw&Fvzpf\|$XBJ@1|$8D-1D@fAbafA`$|$ |$07wA waz`F+|$8 Ng[|$~d|$0=fA[|$Ѓ=3)6,|$8fA`|$p(JGA*$wa|$pw8|$pt'$ v|$8lbX0v9|$@w(6,O B|$wE|$hA|$p&:8vQ|$@w@.|$@w'lbX|$06wg2|$X'wk>w_fA\N $w*/w|$8w|$@ w"v|$hmcP|$v!|$8 w|$ 2(w$ |$hTvp>wkw0|$P|$@v3tNw+A~.n[fA[~=3v.|$P}T5+! fA^)fA`=fA` Et@|$8B$ubdv/ew+;wxwI?5fAZO|$8w-|$ ww|$@Ѓ|$hTwI|$X>w8fA\!vAuw9}Z|$P|f4w4At$|$p*v4C!~v@|$X3v/Bv |$@ w|$@$w7w%|$@w|$@|$XEt|$|1|$X9wj$wM|$hw3v$|$p9w$+\fAG||$wH }jA wE|$8v4|$P -|$X>vw=3)A|$P~v:yew,|$XBw|$@w n$vu|$@wALB|$ew?fA?~.,ƒt# |$h |$p2|$X;wb wJ0B|$X-wp|$pviPp|$p5vXND$w'h$ w|$@w,\drh^TJ@5-fAS\|$8||$@y|$X.|$h>|$@w}|$8wl_w]mwN|$p'vG\|$P|,Bv=3) 1fATJv|$@w|$0Z|$ |$hvuvT$bw2|$hIv+JtbcYO$vC|$@ 3Kv"v|$X2  |$hd|$8Iw:1|$@|$8 wF|$8w5fAb.w4dZ|$@w"nCЃ1|$hwSwA=$V,|$P}8w&$wA~t|$@ D]MЃNaw%|$8w8.$|$p;fA]t?$vLnw5$w%$teU|$8C|$8v/vX! Ww] w|$8vAw |iZP@|$2wY|$X9vHawzFw1|$0Vw*$@w^$>wW|$p-w@|$@v/|$p*? ||$8&|$X,:|$X:E;1';w^0wOI |$@ 9+MY)fAV6cw1|$8t4|$X4v#mw}si_UK ,$|$hfAZ^$xie|$p3-|$X5RЃ|$p,tAAv1|$8 v Av|$@si_UK 25w:,v+$w-tA|$wf|$%w\|$X>w.1fA:DvlbX|$X>w"fA\~9/w|$hxw6|$P}% w ЃxndZNJ@|$08w'|$ptwO*|$X3w|$8w:|$@&|$8[w(:~|$0Z7i}VLB8.$A w&[.Ѓ}v#:|$hj?t0|$haw)S4*|v4|$@u|$X11fABDQ   ^r_U9A/$:v|$1AD@vlb@O?5+!|$hv(w |$8v9w|$X/w"|$hywfAaAvkwY|$X;vR$[vT|$8w/>v?$ w2|$@ |$P@|$h6z fA]|$X8|$p9bX|$8wG|$hw-At1'j A,|$pev%ɿ|$@ 鷿魿w#v邿w?g|$@ wIAƒ|$Hu,w$;|$@w'! |$82޾Ծľ鱾駾|$8w:w%|$0z鉾5vf\Rw|$0av5+!|$8 A|$p4$r޽νĽ麽骽頽/鍽Ѓ{$v|$X+^T|$hvdv|$@8.$|$8|$hw/wkܼҼ¼|$h"v|$8!顼闼鍼郼|$@qg]SI?,"ڻлƻM鳻驻v(鎻Eu2yo_bXNЃ<2" w-w|$X8vںкƺ鼺鲺V韺VfAa7K5|$8*[$v>Dw/|$p|$X. Ѓ|$u|$03wIfAcfAW4wAHwЃ޹Թv鷹|$H$=|$ tx$Mƒ|$8uTwL_U|$@w';1' E1D@v̸¸w9$w|$@雸鑸選wdZP =w#|$8u$|$p)fAB|$@۷ȷ|$@wX鮷E陷鏷酷Pt1wAvi]YOE;|$@vh^wc%`w3|$@ w"v|$p0|$p w̶¶鸶鮶fA^~G|$h[w@閶ƒ|$8u|$h!v tj`VLB8.$|$@ e|$8PuDڵеƵfAU0=|p锵o2cu|$8fAY|$0b|$8H|$X:wkw4qv"|$H} |$0bt!vAشδ@wI髴阴鎴 x|$8Ax|$XCQfAC|$hvaww+$)v鶳鬳颳!wY~Ai|$88.$fAW|$p1!Ѓ|$8 „tAw'v"ֲwAv龲鴲骲頲|$h$}gR}wB|$8w;diw"v|$@ G=3)|$8jw+\w=w ٱƱ#;(;雱|$Xw 遱w  , ,U|$p,P$P)1AA/w_|$8w5|$p1w|$@аư|$X<鴰w[Ew1A鑰vBKws|$vo[QG=3v|$X@ w/A w 1fAAݯӯɯ鿯w颯阯Dw`[vX6{0k=VC3) /$ wxw\ɮ|$pwF鯮饮|$@Muw~tj|c|$X%wbwwyA|$pw.)v |$X( |$X$ܭҭ|$pv"|$X!w5驭韭$' v|$hixn|$@\v|$X-D:0&|$@w"|$8wx ߬լˬO鶬1fA_頬閬錬邬$w;~`V|$X3uIw=3)h ƒ|$XCtYwQޫ|$hA7鼫fAFMw*|$Xow($|$ w&|$8 ٪Ϫ|$X.齪鳪驪韪镪鋪|$X8yoe|$XSI?5+A|$@ |$8!wܩҩȩ鵩髩 阩|$@GG|$H6w1n|$0_we@w/ v G=3|$h+w`|$0Qv;|$@v4+ w-|$@v|$@רͨèAt% 骨|$8#阨|$X5wU~~|$h0fAMk|$hw=v+fAMDF<2(T|$ |M|$p;w<SߧQfAQ|$8(鹧鯧|$@<|$h(1A4|r`b|$X8v1Ht"v|$@>4*  |$8 wC|$w vaӦɦ w$|$X>w鰦 靦铦鉦fAT$rh^KAwv|$8ve|$X3wE|$@w4fA^OͥåHw82鮥餥隥鐥醥|6wYdfA]|$0N|$P w/|$p;w(Bwh|$p.w1|$H|$p8~2|$@|$Xw6ѝ|$@vB3w'鯝饝雝~鈝~4kaWMC|$w#v#|$8w7|$X8w31|$PۜȜ鵜髜阜鎜鄜zpf\R?|$h=|$h0|$p'vF1EwWw.|$8vܛқțfA]<駛锛銛逛 w! viЃWMCfA^I|$p(wR|$hYw`@wN|$8w=w5Pw#vȚ龚鴚骚頚閚|$HOoeR?$;w fA9Av/vVę麙鰙香 铙 ƒ|$8u wlbXNufAN(|$@AEu0}ʘ鷘魘wt)A}siAw/+PF|$p4|$hf$fAQAl`4vE=w"=v|$p%ΗėfA`tQ~C)馗霗$] wFvA逗vl\I?," |$@ߖ$ʖ鶖 Ѓ餖隖鐖|$p(~t$\RH>4vXwuOt]|$8|$H~:$9 ֕v|$p鴕骕闕鍕|$hw7yv%$ wcYO}7-|$2wv|$hy递vAw#vXND:0|$X61$w11fAdD@|$@~|$H=鴑fAbN|$@ 雑GwWfAb@$ w$a_ Ob?5+! wZ|$p3wS|$0CkҐfAY*|$p$ww鵐髐顐|$X/w&|$het|$u&t$-eIXNDv|$0U,"2$tCw4Aw$wʏ|$鸏鮏餏随鐏|$@ ~} k|$@Y|$X-wK-v<|$p7v+|$8'w/%|$XBR|$h6|$h  |$0YwU|$%w'鹎鯎饎|$p2w`<vN|$@w*|$XAu#~fAQ|$@e[cH>|$0B> |$]vA`EB܍AfAP|$07/|$p'骍Dw{$遍$uw4$v^TJ@|$P|(SvYwG|$p-w|$8|$XEw8v&|$@nj齌鳌驌韌|$8鍌 w}|$Hw[|$h!w.Au|$0SVL4fA=Ѓ&w,< |$8v$|$8'Ѓ֋|$PO鿋wNw7e韋镋|$@wGP{|$p-ifA</v G=3 w(v$ՊEtx|$X-vg8vX&鱊|$v' 锊銊逊vlbXND:0&w؉ʼn黉[ 騉鞉锉|$@ 邉oe[~`vNAv6|$X2wRv.$|$1ЃfA^%|$XDfA^_|$X1$=鬈|$@ w~醈l|$ O!1 fAQ=FA2$!w|$pهƇ|$p%9|$hJ+鑇|$8wLw:w5si|$@vW|$h3w0GH> +rv چІw|$p)u鷆魆飆陆|$Hz$ mcfAUOLB#vAv * |$p2܅҅鿅鵅髅顅|$h:v7邅fA]ug w^TJ@-#/w^Eu70v(v${߄v|$hPDŽ齄鳄驄韄fAY~hZwY|$pwR還|$8k|$hkw{dwM$w6fA_%|$X/Ѓ:0&$ v6DwAσŃ|$X3v*鮃|$hAwp锃銃1fAYtj`MC9w'! $Tт|$@wQw?fA[~8鱂顂闂鍂郂y*SZPFv-#1|$p  ȃ|$Pu6wÁ|$@鱁$|$pt邁xnv.cw)Z|$p+w?Hw;1|$0w2w*|$X,Eπŀ|$X5wevS$wZJ陀|$hOwK|$XEv:.w2mcYOE;|$>w1Eu"|$@v@ C w'# |$@ m|$@ [v)6I?|$@ -#w^n~fA` |$h4|$X)we~|$8wA|$H|:~zw`vA~~}~s~Aw&"Z~G~fAX|$h|$X@Kv|$wrv<w4~|$@w-"}&}}|$p?}}}Ww0^v}fAZ&\}I}|$8w&|$X>0}&}}A0fA3%$EЃ|Lw|$@ |||$p!A|||vAv|l||$@vF T|J|@|-|7|[w:|<{1|$p-{{ {{{{|$@11 }{s{$w3|$@w"|$8wOJ{@{6{?#{{|$8vF:Iu&wzzzzzz|$@ fAM wS|$p/w+|$POgz]zSz  fAB 2z(z|$P}W|$p1vF~7wyyGЃyyy~w$wP|$X=w?Bw$ yyyOsyiyfA>~+[Oywd7y-yyyy w0At*x|$X@w:|$p8w|$X2xx,1|$PD@xfA:|$@xx|$@{xqxgx]xSxw ?x5x+x!xx xxwww|$0|$P|$P}Cww|$P~a_wIfA^~.w/w}gw]wSw"@w|$8|$p*ws$v\wJ|$@wfAPOv|$p.v`|$@wOvvvPvAvvvvvuv|$8cvwAwKvAv7v-v#vv vuQufAK2Aw"vuuu|$h w^qwVuuvfA`oueuUuKuAu7u-u|$0Bw=|$P|,Auw0ttrtt|$@$t|$8fA%|$0FwB t1fA\xt vZbtXtR|$p:ws$#wNfA^=.|$8w$ttItss$3 s|3|$hv"|$X9wsssssvsw>|$hv- w%UsKs1A:s0s&s|$PA trAw2jrwAov/w*rv5rrrCrw|$0Vvrrvrlr$fAY|$@ 2rv*#r] rrqfASL|$h3w2AqI2$qqqq|$p(w@$w3pqwNw-|$@wwGq=q3q|$X3w|$8qq|$w"v|$Hppp|$8$IufAPpppppxpnp|$p"wL|$X)w3MpAtUw:|$8 -p|$83p|$@w4|$ po1fAcovЃoiЃo|$X@w3|$@w,o$oo{oho^o=w $Co6o,ow:w2ow>Ow,wnnnn|$8vW|$X/n$w[wSn|$8$we|$0DwOv=%qn@wRv@QnGn=n Ѓ.n$nn|$h~nmmwDAw4(m|$8wLqw4|$8mm|$HAfAF~:m m;w/Uw`mVmLmtv|$X9vx|$8&+m!m|$Xv#w1vAmlll|$X0w!|$HOllA l^Y|$@Nl|$p2vGMylwy wj$wFwЃEl;lDv|$8F#ll|$P|;Llk|$p4w.cvЃkkkkfA_#>wUkk|$hfw |$PY6|$xQ$yq|$`IfAeA/$=  PT6|$P QfbsA J$X$A > Qf.fWA1|$P6 |$@d-'|$@I6 ^fAW} A/%fD$ zF $ dfb*F$ 4fAD|$P$yAh|$@L}Ap* $'#*ARA v A_fDAA` |$x8)AZ7A\1@fA_A |$@huA L2$)>2:@ -fD|$@ZWv |$x%B"A7fA`\|$P|$(BX|$P fQ>LfA`|$P * (|$@/#|$0]$IA=|$(pAGܔ$ЃfD|$@!fAT |$@f;$+k0AJAk!hG$&@|$(|$@Ao|$@G'Z BN|$`q!f.K fAa |$@!IAIAA7 A|$x~/A$cu$) |$x-L)+|$HEfDLA2|$x4m fAWo2.UOt} AW$ji$D$P<1 f.A+ AUfA`)+7$ Y|$Pf;@|$@@"ff\AD4 '1|$P @|$x|$/|$PAAOA, A|$Hh UfDA$-fAX |$@;;|$@-NfDfA`uAf[!$@1@tDArq5$A4 dDAZ^|$@;& AA$AV.$f|$Hu|$xA #A&D$Pt|$x@:~8 A_u<AW Ѓ~|$Hg|$XW1# DD|$xf$(|$H-ePfAaNЃA|$@JfAX_@|$@(Rf?{AS6f$Zt fA\#E]AYB|$@OcApAΏ|$H  FlfZlA Af_w:|$(>DN|$xf[~$Y AGfZ 29f|$xFw oSIfAtfAa$6 \|$($|$`؃fD0U|$@|$H @YDfadeDl$ ?#fP^/|$PRA e EfDA |$@J|$HA3  @A! $: fD|$`|AG~|$H|$0 P$C8 H8|$H |$x%$6w|$H|$P.AnvAAAZs[`ffR |$HAWv9A8\G`jfA]ϩKK|$H@ A$D31AfA[- v|$xN|$HfQ AY@ z@|$P GL$X6H|$Hr V v|$PAAh*wfeD|$xoF|$PD#'9%EpBAc@AK@|$@YF1|$@A)|$@;M|$Hl|$P|$xs2aAHA 0|$P  @ BAd5'|$x/ W|$PVYfABx A ;#)#A&( $[ [A"A_|$x)|$Hf)8A 6y$# 8'$ I$4NX (|$HfA[X&|$xLFAe$!z!&"1$A! A%$+I }AAa!D$P!NAAy39AA[ ~m4|$H*8?AhA|$PD|$PvA}$|$H 'A2 GA{ e $vAb$-AV-6,|$H? "f|$(8׍f_dAAB"3bfD|$@Q!1|$P y|$@t|$Hy^ PA[A|$xmZ|$P$? Az8|$P|$P :a7 f..% 6f! *f lfA]AR6D$. A At)A Ap"$A` o|$@E!|$xFA|$x_bvfAKVLD A6&|$@n$M ă$$ >n |$@xj($6RQ|$XkfW~ A7(.R|$HR~k pfA^/A@|$Pi|$P-fD|$@A+)$;Ad|$H D AgP Av*|$x|>$2vdA Ѓ}fD |$H2A7@A6O #|$@4'|$@|$XAm4|$HXWAv|$HDAm|$@;]AS}'G$tQ#|$0|$@FxA5|$PV{0j|$x.?AA?$"Uf^A<fD|$H=|$`W3x[$ D$XAsvAt)|$x?5fK($.f@#l|$H .A |$@8AF1|$x9 Av)A+A%bAP$ 8$|$H61fAaƒ6.A.#fA^+ JH|$H-f |$`f|$@i|$x,$+]K|$@;o$fOA|$H ifD$3A w|$PZ AB"fAb~5|$xT`\AfA-|$`AB%)A(}ifAjU(A{=|$@[+5 |$X A* }A|$xw#,A[L$|A{xM@l{`1M|$@ 1|$PWw A|$H+|$xtƒ/tf\|$H+AjtOAgO|$xol|$HNw YO|$H  $H$Apft|$Pf.$f\9>$@NAlxa lK $ I|$x^c|$xh %$B/h$$7 |$x($%1 |$xzAZfAS!f9Q5|$xu Nu$3zA7$5+;+AEIffA]"G|$(R1a|$@Vܰ|$x3 $4f.$?AB A1#|$H0jj vf[i_Aw$3F<$6" |$P1D  AAj<|$(mf8rAu|$xf.A(fA]v yoAr%;0fTR$BA-fDDA`@ |$xa"( RMT$XFMAmAj0*1|$@lu%$!ifX6E|$PMA>av AX,":A |$@FAqkfAWDAZA$|$xg4UA$NfT:@k@8u(A6h(Ae+A3A-EAE AhY A:|$H1 A |$H|$xH AU3$>NAA3$ ARQK|$P A$ w}v$.\R$Ay'Au^ALv ]|$x|D$|$Hp,_#_$4 { w1Akf$%= 6:|$H6`|$xI BAN1w  @Arx |$@NƒhWshAV $ |$@X??fW.c4J< [@fA[Ap2|$P -|$Hw|$@jJ6 ^|$@Jt|$Pf.Af$ 4|$xPJ|$x/ɑ|$P|$Xf- |$Xn$=V( CAC|$x; 4NAwfD|$@j |$xC4fA^AM @$$$t$ BA"v Ag]fD21`[AuЃA|$HAlADAfA\eh|$@RAFJ AAV$?$lC|$P$9 %F|$HT A0v]A|$PX+$.PY||$@*"fA[|w|$(PP|$@oT'T|$x\^Ae|$@Ulw^ f$_b|$@^A.Tb fXa|$P aAz 6AlV t|$`;ɛ|$(r TDE|$xE5AQo@A7AiI8|$xp[A/1fd$b$ :|$`.|` fA]Z|$P{:DifVA#|$H 7pA ngA8=0VA?pAIJ1 A4n;$3eAfnA5dJ$|$@3'|$@8|$@5|$xn:|$HU=A  } |$@P|$@;;A |$`!~|$xm8nc|$`vf]A7 u#|$H&A/RfNg_̼fD$991 |$@B;/|$PV|$x.G_|$Hz$#A[Ar $_`f^_`|$P  0|$@?"AR  vA ]ƒ$ |>[p> -|$P7^.^}AS( ]1M|$@D;D$H$$  wA|$P,|$@R*N|$PjD|$@=)#A$ !Ѓ$JA|$H\A\CfAJ,,A$ $2|$xTX3$T|$xg`|$HD|$H6($ v|$H|$`{$$ GA ]|$x(|$Px$U$JNAfDA1' p}24Y$ B,fIA;r|$xMfAY|$xf@Ox$ $Q#f[Bx}|$@fm}>+|$(kB>|$@Ym|$PmA$!$,A)A$($r2r(1y|$@80=$HЃ9AxG*$!HA  fAY&'$/';b y|$xL|$(A $DNv|$(z|$H'A?gSƒ$+H|$xH(A+  |$@<ƒ$%]f]龿 髿 !|$(YA|$`xAAW$ vQf.A#AF:A<yAPL<w|$P |$`-AmEW 黾|$P! Y_|$xNP鉾A^x$VfA`9|$Hi|$PM,<$.f]AfD$v|$P۽f@:|$P'Hi O|$P>i 陽fAI~)A9yh|$P$+|$XVfA_fAn w f\4*E|$HnA6O!fw;zμ, |$xU@:atA9J|$Hozi VvAB8$ (w 1AH%(IAM麻AgfA]Z:APm$O}fD|$H'A[Ad >|$(x$A=>|$P |$P Dl$HE$CF$u`o=WmA鶺$+1>|$H|A"zg/}j?|$@KA=|$`l E$#|$(BAZWF$+F:zAE~|$P\|$(H$A=At$T|$H |$@N $#zK|$P fDԸA¸鯸hg#7'@|$@mof9vA lb2O 8|$HK($ |$@D#A1|$H ѷ龷|$x;mfA^f|$P Nv|$H{R AIt9fN†WKA7AD$ WAǼAg'A ˶0鸶ABA;@!vA5;|$@5;v|$xscYfA 4k &|$`|$& $Y<µ|$xL#Aw)$ P+鉵!$ 3;AЃ\Ac" fA]GA G0fXOAq2/$;%2$ӴAjĴ)S 頴|$x}A3 ;b$ M|$H[(_5AwA|$xЬfAA?顬 鎬} jHW DA4 4$A6"A1²j g$g߫A b!+C$A MfG$Ab=$f`$Az$|$PTAL$#Bq28|$H4W|$`)W 1AA (|$@Gf|$xNA+馪|$PD鈪|$Pm 5<AocV|$x2=A?|$@D>#A:l|$H|A0!}1fcA6{"|$P(Qd|$xCw鴩|$PЃ飩#鐩 v$xn|$x'{#$#j|$H0:~A|40|$H|$(V&NfY$)A|$xQ|$(pQf:O鲨7$|$P(Q$wv|$PVfZ ;$V) @$y^!$k|$H!nn DbA:e9I s|$H ҧfA[ 7'i|$x6$<&$7U|$P @y|$H'f(|$P\J|$P @A@.A P` 2:AtL|$HZ}A_4$Z |$x>fMfA\fARlmA;闦03$6X ,oo\ UfAK z.A_,A|$XFr>$J$ J$&EJA*鬥|$@x=,%\|$H 醥AR&&|N|$xAϡ$|[<$4<Aid<A87fA]9|$P|$H7A|$`5%K Ѓäbv|$H顤|$H5Z Ѓ釤A>SAcP ]AD=V$+?%/6v$/ |$H$3 GAYAPxqA1fb鹣Ѓ駣U-$LC|$xV$dA-A2FAPUY&fAb$fKRA!qfFgT ЃAעXǢf]CZA離A"_fZ|$P]|$xX;%$ #DfYZ'\E{|$H*P.A+fAUdJ|$@#xrxݡ|$xH0A龡|$(!6|$0>|$H閡|$Pg'AKX|$H cAMD$+Cb|$Pn,|$@8Ax$IA0l|$x]*5?A|$x鵠|$P馠$M@v|$`Vzpf4-A[Qi@|$P '|$@3[r|$(B1fA8龟AV|$@N~NA#vfZ鄟Ap$*|$HB|$@?ƒ|$Pu$-#fA`HAAU$!&|$`Z3 Z|$PO鬞A阞|$H X&AkY s|$x";BA1K {[$./2\HvA_26V2|$@p|$(/˝A{$ ?A|$P"|$H*@A@|$P@pfAQT%5Y ƒ|$` A /|$HE*A6|$@=$%S|$@$pϜ鼜f?t閜|$Ht[,Ѓ|(|$xz5JR$ VA /2wϧ; AJUfA`|$PsAdU|$H!+|$(b+頛Ai)A C|$H&Xy(yA[gr$ U@A &f`;|$H|dE  1|$XAq|$(xW|$@\E|$H 鮚 xMfADd(IuEM*EM|$@[)|$P 'k$At^ |$P!|$XTz ٙ|$(h|$Hm;AU]$AJ:A8 釙$=%|$H8 }SE|AB v|$`r'|$`S/7ABtQט͘AM5fC5 \u 靘|$(l|$@}V+@7k |$PvAI?$5 |$`T9AGjl fA[ f;6|$HBAvfALǗ齗fA`z |$@)=R|$H)fLe|$HAgAjC&J|$@kAlY|$H  |$H!$7dKfAYxnAfY~|$H ҖȖf[OfK2'|$H#͊|$PЃ阖|$@a =fQsALfA 5>vfO9/$XAD ATnT3ԕAx&l&鴕|$x_c!fAhdfK0DgsyAwwmOZA> A< vA}%>$|$P !$/N`ٔsƔAo=R|$@C|$P v郔H H.X|$x'A2w:V4Av$Av ؓfT gvA魓A1|$P+ +A# 鄓A,p($$(IAT1)|$x;) AjL$; ڒВAc)%A?|$H{A!{隒A'-v$uk|$P#fM<Af95 *1'$Ae]6\](Ge‘V鯑A@c'|$H铑鉑|$P%AOA`f]J"#4|$H;R$D$'|$P$#W v AڐА$|$XAw 9 雐+4(|$Hz.A,. K%98G$-0AP0|$P 02+AZ,ԏA$7u$A |$xLAtAO|$(VDkA>AX* O*>+>|$`=RdJ@ ߎEƎA2$|$@ vA~Amj"|$x5ZZAn rZ|$HgZ(E $8"AEA9Ev|$XˍAwG9P$ sfdՈAu/ndAJ(A(D2%++|$xy+AMxAA8)|$@:V(v|$H͌ÌP$SO|$@`k|$HfAaAr|$Pl|$x%APAxUx6f?(|$x#|$x1fAf$nы$Vk魋飋$H邋xn|$P#As+gA1|$P.$Aƒ|$P$|$@Aj#A@uAFÊ鹊AEj% eA<ƒ|$x~ p|$@aRAYW:|$PA RzR+A%$Fw v|$PQ4 E4׉A\ +'AEr QfA]Q韉AEk$f^KA1|$Pl8|$` 8A-UA=|$x$ABz|$Pˉf v$HkHARaH鵈|$P#S$27<l逈EqfAa7fTq$vABF4Qr|$@IBr|$H )CEц*龆fI[,fAJsgA逆A?|$P [C-?A0CAdBvl*$-]N|$`qJ ʅ*|$Pp_Y|$H ~Y钅fI*FAen|$@0nfASuXNA :|$H(|$(7{?|$xU~v2vA|$P ?^ ńA wl|$x'CA霄|$x-fAZː nAM<$u|$@KDu.;u5|$(,$'|$H I|$XG|$`aЃ|$(Vă|$P鲃|$PDADfAWkEk0 1c|$(RA09|$HpA)A$$|$xr*A4dT|$@ST|$H˂4C$"kAP頂v|$xl~A-+|$H&YS|$xqE;Ђ|$H b&%L&3uO|$@M  ́fA`FfZFA#FA隁 2 ~ }@jAFjUK1fZD@9A3+0U$4U=U $<|$HgfAW΀ĀAgAE靀A 鉀AtIb|$P4bfT*b`|$x'DA~h1fXD@6&)1fV ADA_pEDSEM A,Z|$x\+ Ѓ:ЃAHt"gTfLKAKKAK Ѓ~|$H@A~6R~AfA^L|$XO~|$@F8=$ Of#hfA8DAE |$@<L |$P ;~|$Pp'fLPF M ~r}|$H |$x v}}A vA}|$H2}$ c} |$(   fA] o Ѓ}E A`{|$H||$`u j ]p | |fAQ A|A!z|1|$`Dd|fA`%/AJ.D1 |$H)"||$(-A|$ 6|$@-ny{f="A'vfW{{%A{Q{\9|$HӈX{T_.IDAiF$,$x$Az|$Xzz|$P4fDjrwAHzz Ѓz  8fP|$xlAx A. fA^~|$HFzAy|$@kwyA|!AI !y$`|$H /$/AJ dy|$@9/d|$xPvF5y+yq9|$xpcAtAPA:~|$@2~ ( A+htfA[~|PtFt|$P"A|CA1iztfT$|$P@A%sAJ!AYvessfASs!|$H@N|$xs$-|$P ȃ|$xMk k`sAOmC.C$A$s1ADsfAR', r|$x AbJfA`WJr]rA:#|$P#c<|$`Ojr|$(C|$P TA Af3r|$@`>$$ 9$S wYqqJ}A.fA[OAgm[@{mAXm|$HFm$1%mAm )i$rill+AZA|$PlA5ll|$HolAuW`RlA) |$HOn|$@Q|$@Jlk$&)5JaA2 $kAkkA?A3P2$?3ƽA6Pk=k=,|$@P 1kA/c\cA>jA8qAqjjXr*|$@:|$H2gAjAtI!Ae43$2vA(LjBjAa5%jjj|$P&Ѓi$jiAi+eii|$xg|$x_6vA|iri$.X#' /m|$`$m:iA&i|$x|Adƒ't hhhh|$`|hh|$0o\hA{h|$PihE|$PE-{E?h5h|$PHA!G|$HqG|$H'h|$PsAv|$HgggfWt;dt|$HЫAvggg|$x}mgcgYgOgEg|$@;[1*g gA<gfZ$Z|$Pff;5ffA< vAVtfjffAYCAKfAf|$@S |$XM1|$H76|$@BfA<#eee$1 >9|ee*e|$(\G|*ievSeIe4VQH*e%e eeddfae$ |$xD&|$H3A41D@dAp_W_OwdA fd\dATv|$`FdcAk_$n^f%|$P)c$Q R|$@EuAe~v bbbb$5%pA\`|$@X*]='`bVbLbv|$04b*b bb bbfAVi j^aaa|$`^D^|$XaaAVp|$@OZaATo' 4aAvAaa$,b$rm|$HvA``A*q5q*p$(p$+;/|`r`|$`VAy|$PH`>`|$PR A2w``Anj1___$ o@o$_AGnfAZK A?7 ! A`_|$HN_D_7_e$_m|$H2UlE_$]w^^fJKcAK^^|$@Wv ^^^ Re|$P w ]^S^.eA@+A |$(p!^ASRA5R$]|$P0RA]]=v$8]]$ * Ё5 $0e]QA) QA|$x* !]fb9nA }n\'\f<c|$H*A\\APAsP*Z ~\|$H l\$T\ A|$@H-\#\$ C/|$( Ay[8A[[|$x3S$)3Au3tu[Aq<fA]o<AfUafA[*|$P&[[|$HЃ [|$H.$X Z|$@N)fAV)$Y%gA2=t ZZ|$PZ3dAYZ|$P*AlA.b-Z|$@U*A9*|$xvAYY$90|$H S Y|$@-,|$@*ƒ|$Xu MY|$(i3 ^Y$8|$@]8q|$@Mmq.%Y XX)Q4|$HXfA]d1|$PXA(XX|$(q>|$`6AwЃsXiXA++1X[XAX1|$`DW|$H::U2zAW E4f`~|$x{WWvA#WvWlWAXWNWDWA,.Ap.|$H .A&= W$%V|$P(Au(bVf=8;|$H%pVVA}V|$Pi1|$@vi|$H^RVBV8V(VV$/3%RU|$`|$HAKUA\U$/PO UfA] 6|$P5fA]y|$`d|$P A ;UAh9OU$ U|$H A8AH2ACS&$(A3|$H:l|$PT* T~TtTaTAPTAxm'|$P '$4׈$7  TSAS|$PSS|$@>O SSfX ,AzS$*)AXvAKSAS0Ѓ&SSƒt|$HRR|$HwRRЃR*|$x5F*WR$>5pR&ЃRR BR|$P 0RR|$(*f0A O0fLE0QVЃQQ$3QQQ$-0wAq~QtQdQ$)A"j1O+OAk|$H(ANAvN$IU3NA$=NN,#AR|NrN|$xJ JTNJNAk[*N NN NA?|$xF4MV|$xkNV|$PA'MMA MAyMAN\AC1|$P $#vA >M4ME!M|$x0@A$͞ALA%$A|$HAUAƗfR|$x%A}AmL$K$+A,ĝЃ2L|$@gofA[~ALLAq|$@(|$P$ ƒ|$@EtKKKKKEOT $I$DKfLA|$x1At vfJ KKABIfA`uIA*Aؤ*JJJJA.BAzJA iJA XJAjJAY|$P&J|$HAWf\T4A_II IA-7A6I+33Au u+tt^I!Cƒ|$Pt A7 )IAEfA^@H|$`FfA]DH$H|$HFJ$)J|$P H|$(86[w$^HTHJHfA^E9|$x97A<v$!HH|$PGY^:EG|$HQA@Q:|$P% GL@$#q@|$@.u8lcG|$(MA|$X  !GG GG$~3,>3|$P33F$1QAFA{|$PAA FЃzFpFfF|$PTFA=fA\=2F(F1|$XF F EV|$HWUmE|$xa.A:EEE$ EA yEoE|$(EQpQ(KEAED|$`79+9 95v|$x&CCfXC|$@HB$+C$t|$x|~CtCO|$xP f`LCAf3}/C6*|$xTk*fAa|$P" |$xOBABB|$@O7[fA^f\u|$xUB|BoB|$(ZBAV7OAUtf^$BBfA]O$k{D$H]AAR)ADR]A ͹AA {1AEAAzAAvAlAbA*($ v|$PA!>fAJ*y>i>7V>L>B>@>$pA`\A>D-=AD)$)|$@@qX|$@5PX$S|$X==|$Hvy=o=W"S=A76=Ok =|$PY%1f_<<A Ѓ99w9A?W9 A=Ό.9$9AS0A8AHw;A[$K 88zƒ|$@ZفA^ρ${8q8|$P1|$P D@S8|$(A18$ *5wE 88$A{AA47777A=&A7v$o7e7R7H7>747 ƒ|$x9t 776|$HFw0fAb|$x766$6666|$Pw?j6|$P mڀ|$` π>6>v1(666 6W55|$@D/ Ѓ5$5$Jq5}5AlAADՅɅAP|$xx AŅ5AAfT}ɺN4444 44444{4+xA!a4W4A"vA?454|$(%fA^4 433$3A}33 @}|$xSwpfY%}|$`| 3|3r3h3^3T31fA^>3$/A` 33222 |$|22222|$PA)v-q2g2]2$:zA zfA<yAyK2AGzA0mztA%w/A+U]1fAQA|$@(7/5'/8w|$P//Aa|$P .{G F .1fA^..AT|$xPaaaAa[.$A֧AV ..|$H31Ђ-,hA h|$P@h|$xh$9h|$xh1-$82|$Px|$xh-|$`G-=-3-)-$Z !q$-,$;v A,,,$" __,|$P,,,feOo,|$PЃ^,$x=,$(,,, ,$w8|$xMnAmm++|$Pn|$Hn|$H Jnf[ n++v+|$Hu.1u)`+^SeA+7+-+#+3 ++**A*Ѓ*|$x$|$`d|$@^zd$9bd|$XWdqv*A[f`]biH* 5*|$Hw:|$x(\|$P\|$`|$))x )],_AG _$))O)AOa aA_ad)Z)J)@)-)#)))|$X~ w(((AwD jZA$3$ u((A1(;xh(^(|$HbbA a0(&(G( (fA^%sw$''AaAa'$?TavfI''Aw.|Ѓr'h'ЃV'AB'A_\|$P\QЃ'|$(\Aq$7~V$cVAVA|V|$HzVfAaeV$0WV&|$XAVv$~&t& wE|$Hء|$`áOC& '&d &AiW$c W$%A[8U|$HvA%%Ax%dS|$P%Os%1w:$^aAZO%|$HLa=4%AA|$PE% %i $$$$$|$@H$a|$Pa$$A\w- |$Hv|$(o$e$$-R|$HE$|$xLAXƢA|$P$AmƒC>`A1`$`$0_|$P_AT_#|$xf3S@@M4r#h#A T#J#@#6#|$@oA`|$PdAP|$xaE"G" ""w#fA`A""|$HAЃ{"$0bA} b!P"A5_6_A7)"|$PЃ "fA^A#/fATtR$5!!!f98|$(!?n_X_ O_X!$5^|$x^|$x1^A !A~m fJ $33 ?9A +9|$P  9 |$HӞf`A~ |$@P$ƒ|$Ph\e6 AQ%  |$Pq|$@;R@s@|$PvA^eA'twA1|$P bAi K ?6$/|$x`#|$($u|$H^$-^7]4~]$VAZ$x |$HfA\$lcJ@6,|$@jwXAdc|$Pݤ$.AҤ|$HXfHԜA ݦ$5Ŧ|$PkaQG$yf!eA xAn$1w|$H |$@TŢ)|$@Aox1NYyI6,"7v|$x) |$X@" AM|$@OAGA ƒ|$Ht |$@P3U|$HЃD:|$PA0|$H<|$xc'%fA^ #  fb|$P!Ѓ„22ZA2t2Ѓ2AGw'" CfA2fT2|$X 3!28X|$@ifAV(BA A|$x AA AA$S+@+$ c;?8;$ Z;AA55$ +|$HJƒD**Up*A=C*|$H~31|$xq$Ѓ|$PЃA|**Azpf|$x\*AE*9*8.$A*$2$2wf|$(2e-|$H-|$(%( - wfTwm|$Pi*:V*A -$8:A&,vAp ') Az *)4)$L(A&|$H7(P+(z|$Hh^, ?|$xwv|$P &A;  'A6,$,A9,q-,,fA\,A++A+w|$P:?AX:/fA^o/Ѓ&|$P#|$(/A>/A1/$4/AJ#|$@J,#AH#fb #|$`V%v|$X]S|$( d<$ 0|$($A $$8vA$$*RoA;:|1|$`D@iwOA7|$x7B7$7A 6A.w&A|$P !!D$H $A|$`}}A-w(v$YO0!|$H"w1'$<A`;|$`;  A|$xCG9A9$x  Dm l fA\2$A3 Awj$(iA7AVpRZfZF|$H;AvD  A@$nЃ )̠$LЃ x n $)Li ЃN > 4 * $ v   |$P     1f]  A AZAS| |$P j A |$HBe|$P e$,2 Agk g|$H{gJg]$Ѓ A9  !O$@> E ~|$H}s $j$.~cE ; |$Hw!  $&$%LA AA   ~v|$x    wE|$H |$x$XAC 9 |$P |$xMsfA_kA8ii|$H*x|$(kk1h|$Hh1hhyoe[yAay;|$H" |$P {7zz^|$Hw" v|$xh$w7vƒ|$XǪA5g]J^A * |$H |$+||$@/w[|$x|f?ƒ|$Pu A|fA`{A||$x||$Hw{A6w|$( A7-||$@8|%v}A$V c|$xZcA\cA<Hc|$x-c|$H"|$xw"faA|$`ycAVR ?5s%}|$|AP}|$`}AAw Ѓmcx7x||$P<2|$PwwM>rw|$x ]wUwH|$P0|$x3|$(*d|$H$;@wfLw$0w|$P WM|$@;f|$H*f$4 1 +wCЃ|$P_acAgbA fA`|$HyA($Us) a#$ aAa|$HSv|$(w!A9w?|$HXAyAU\|$@;Z\A5\|$xs\|$@3[t.$ $|$xkEA ۔:v$0A M_|$xB_A"_AX$2|$(V”|$xזK$7}_$o_%AYm|$P@|$P+|$Hf^|$(8 `FAUzpf\R|$`y|$@6dA?v|$P &AA=A|$x*3A Ģf8A5zAƒ$0|$x'A%vAfAN~:$4w Av|$`۸ wmcYOAas>fI4|$(G$SwvAWvf$)wOЃ$$: wTfF~DndZ|$Pt!A v<2fA]tNwIA w@|$Pv9Ѓ$.w'B $= fA^$1[AA/A\-wT|$PA/ AfXs|$Hv4Ѓ|$Pw/}v|$Hwy|$x\wh|$xVw54v0wm|$Hw)Euf^QG=\w$%AKj|A8|$`~D,w3A7w#~wA5siA;0|$XOH>A?x$[ |$(wifA]=A9w$vAv|$`|S$-=A/fXK8w-DvA~tjA8vBQ0w]|$`|LAbw9AwA0"$(Av wEA/wB|$xDw%|$HB q$ $6 wX|$x?w@69/Afv|$H A|$` |$Huo+v]|$xpw3w!vf\z|$Hw<|$xsw+V$*A7A&A=  wlfAN,w |$(%$1|$`|$@Y|$@R$vpAKwG v5T lb$ J@|$`eZwH$3w>|$`xoWfC~G}0 |$x.|$H-w!$} vlbXN|$xt|$@5wJw1v"ov|$xq A/|$(w8A8v(Au AG|$Pt"fYATwOAv<1ifV~A QG=3= A_w5fB|$HU |$PtgU wKf</|$H~AK|$Hw4:w/xAdAKSI?$~wRAv?AtЃrGvA A-w5|$@$w!,vA.si$wn6L|$xv|$(|$PK$'A;|$X~?f\&$vA6$"wBf_#AZv|$PxAv._|$`~AD:8w$wA8j*$\wm|$xMw\$#wR|$P|$xQw/vgyoe[QAJ_|$xXADwq$%w]-vNEu50w-|$@>w|$Hv|$xmyoeRH>wuwZf8 AZ|$x|$(wAw<Ae vD|$PuASv wmAwU|$`|NAv;A v(AI :AP&}A|$PfGk.vY$>wEw3=v.|$@YwbAwR|$XOw2|$(cYFA42($v+Ѓ|$H:v<w*|$Pv#A}v'Aw1^ j$.wA[LB v|$(2'|$PwZBvA*w|$xwq$9wAAkUK5/%$v-w$ЃAvJ}$*$w&$-qtAwUfAKTJ$2 uAK#AwP$v+ ADwN|$PN w>Aiw5|$Pt.|$@Gv'1|$`D@zpf|$@.|$@/|$`2AXwAT $b w4Aw!Du AvZ|$P„t zpfKMhW$wK|$x'v:Av'<' AЃ$ AwOwG;AvW$v.Lw|$P pf\$w_Ѓ=3!$8v|$PAЃf_$$u|$P$#wAJ$Yj`VLB8.$|$@%wN5w/|$X|AAvA $~w)vh wE7wka$L|$HwZ$ wP1'|$X/ A wY$v|$P+|$`8 w&Aw A/DAH$wIAw@S|$P tz|$xswOA ww=Aw-A:w'kaND:'vA`&|$H+wuAG|$@eW|$PvwgwXAAwR$ kX_E;1' |$(v`|$HwOv&At |$`}Ѓ|$(0w$z|$x,5A,|$P  Epw9Aw3$ wWAw9ƒ$*uAATw0k~A`mcYOEwU-|$`|$(/wn2|$`f[~Jjw8|$( w17K|$xQ n鷿魿|$xIw2|$`ƒ$,t~tA`ATv'CD:0&A[wOfZ7AWЃ Aw|$(ww|$PѾǾv!At鞾锾Ow waW|$@]wXAZvRfA`t3 3Aw|$P$:$ ƽw|$P餽隽鐽$Q|$Pwxw6]A6wMA4w=|$Pt#6: ' A!wYjԼA2w|龼$|$(wt$K鎼Av,+uA8f\RAwHw9v12Aa ݻfA\:$Iw#A#v|$P馻霻|$H&鍻郻ANAQ1|$`8DM$u Atv -#|$Hw |$Pvf@w!vAݺӺɺ鿺鵺髺[$5jA,w9Aw~O|$Hw3ASRA2vAp:0O|$($-|$Hw5h$1w/wƹ鼹鲹|$Hv4|$Hƒ|$Pu$^wmAwu|$X~/w'N$/w\71'|$@=wnA(w9kv'e޸ԸAwb wPAu*w"騸fU|$H'鐸醸9sizVLAPwAA2tF|$Pw+AU:AEݷAw鷷|$x(霷Aw!vA?|r$v?fb#|$PwAF<&ANw4svAAضζĶ麶鰶|$P Y uAukaWMC0&$wlYfƒ$(uI$*w?ٵAw"AvA鮵餵隵 yoe|$H!SI?w16$AeA@w~vyݴ|$xwr1|$`ĴAw6Tv$Av鏴酴|$H w4Au.ndAwfA]~J@6|]`wC$1|$` ЃfX!Ё„t |$P lЃԳʳf_f|$@aw"|$`}A鑳Apw$1 wAqgT2|$x$ Ѓ)Azwz|$xwSfA\,vDv\Ӳɲ|$x'w4Aw!ABv驲|$P Ѓ防鎲Aw%1D@tj`|$H AE?5+|$H+w51A7v4|$Pȱ龱wH馱霱钱鈱vAIqg]J@6#AݰӰɰ鿰Av(9wu饰雰鑰釰}|$Hue[$vEAv?w-Cv(1A,vwwe fAK'Aƒ$u|$X;ѯ9龯鴯骯頯閯|$xw鄯zpADwVWMC tVw?Av,Yw$2|$H9|$H!Ѓ׮ͮîAIAA v 键A逮vlbXN;1' fA] ߭խ­鸭e饭雭鋭遭|$@?|$xyv}UKA|$xw|fA]O5w8w& |$P zwEA`w5|$X~$A龬u髬顬闬釬}s|$`}d Y w1ƒ|$PtA;-#$0w"AA$ثzЃ麫鰫Aw8锫銫|$PxndZAKF<2|$@Kw:A w wAYv;AتA?w[w=fJ~-|$H,vv鮪餪險鐪Av- w|$`}1AwZPA ?fA[MF(|$xw^$*wJAw051|$`թA鷩(|$xbw`$1|$Hw>|$Pv7~fAa)EQGw  ) $MwA.ܨҨȨO鳨驨v?A"鍨ACwA$w"$bX1ADF|$X|.$Aw% vاΧfKuA鞧锧銧逧vA#wQAYAVw($ww5+|$H|$wAOߦզ˦v5A騦|$@6w.w|$(釦}sAbXNfA]t-Awf]~.$|$xpw#Aiw|$Pܥҥ3w8鷥w'|$xlv <钥鈥~AvfR~A cYOE;|$x A;$vew]A<$wG$w 鴤骤|$PwjfdO鍤|$Pw:A7v*w"4v|$xt`VLi9/%$w<w*1|$@<D*v,+w$ߣգ"ţ黣$.w8AwE铣鉣0yoewgf\aM$w@-|$H w:w2 آA$ v|$(-鞢Av|$@F~tAv;|$Hw!|$xUv|$PPF3)|$@CwAu|$P`ڡ|$PwKAw.麡v4 韡|$XO鈡~taWM5w:9v(f_~"wv|$`"f^4|$x\w#ASv$-ޠԠʠ鶠鬠AU雠鑠AI}si_U|$Pw;1'fA]$w-A+b)۟џǟ齟鳟驟Alw'鍟郟yo3A0vx|$x=vgw_>$2&A=|$(wy4vjf\Z|$x;wI|$x w8|$Pw'rߞ՞˞鷞魞飞$lv|$H ||$PwPAEw@fA_t&At$LB/%Atv}^l7w/*ƒ-uAڝНA鼝驝A7<鏝|$H  cq:s A3_ 0|$PC|$H$Hfa|$HA~|$x5wzBwk$Lw3|$x.wAv 麜#駜A@$7|rhfRAAvJEuE10|$Pwmv$ٛϛfatR$!w>|$Hv7鮛餛w9|$xJv2鋛遛wmcY|$@,,AvJ#v;A/#|$(wT|$H w7Aw'AvޚuXfA`uQȚADw%$+v-靚wA6遚wmc;x$$u:fAa$t$|$x0<2|$P;A$=ə|$H  AF$)|$(|$Pwn$Fwae wYAЃJA"A|$x+f_g|$x(w`|$xw|$Pwޘw2A7w"$@鸘鮘餘vvuV$逘v6|$(vp$v\|$`~KBAw&|$P AؗΗ|$@A鼗鲗N铗Avyo$)fA`td|$`L$v8:w A7D.$|$PЃ|$@Cw/Aۖ|$Pw'A9魖隖$|$Hv{$w)h$9w9|$H&LfA[~4|$`-|$xvww%$&wU|$PЃA6ԕ1|$`龕|$(v4|$@0騕鞕wv'郕Aoe|$@FAA/wU$!w8w)j%1|$`&A$$Am6騔|$@9_$%>A $%\f`|$x[GA$!wZfa6Av#fA`~A2w6AHw&E֓Ó鹓鯓0vz闓鍓郓yAHwyQY>$|$P_w=Ѓ7ؒfAb$|$XVq钒AEw!vAukXNACv<5fA`Wf\0AwP wM|$Hw<w4בAwf|$@=w<|$Hw'AJЃ魑飑陑A;鋑'ƒ|$Hu,|$Pw%hNw%MC|$H4*wAA4v$A4ܐҐw A*v|$x魐靐铐|$@7w"|$HwatjlЃXND:|$PvB|$Pw+|$H|$Hw,|$xiԏʏAcwY|$PwH骏頏|$@wzfA]`f?BAukALvQG$7 /3 |$H.v_LAvMɎAw_|$(wE$v'陎鏎酎AqA]ЃaWMwh$&u^1'|$`xAwYwJ|$X9A u|$@5wݍӍɍ鿍鵍f[dN霍'w8A5v(%w|$Psi_UK|$Hwwz|$Hƒ|$Pt\wTAƒ|$@du%|$@owόŌ黌鱌駌靌铌鉌ukAZ|$X~_EtPg;|$`#|$H1vA|$Hv ߋՋˋ鷋|$P w&xv鞋锋銋逋$*wKAHw|$PЃ_UAi|$x?wFAv=L+|$@O9AЃfP~(Av"Gv|$H 鲊騊AL闊AwAAЃ{A|$(tWMA9&vvEA-w%A#|$Hvyىωʼn黉鱉顉闉QwT|$`|$P !Ё$„t&vYAE;AwjAw:Aw'$w|$x,|$P wA|$(%w0A.wSȈ龈鴈骈H闈A,vCw"A$Andw|$(%vKA7-#Avۇч' 黇|$H$w APv|$`߸锇銇逇AFw&awA[QG=|$P%+!A3oAeAӆ鶆鬆^陆鏆酆{q1^Mw6|$Pw/E;v  w.AͅÅAKvA顅fMAPw?|$xwЃxnA8ЃR>$*0|$P|$H0|$H $Axń黄鱄駄靄铄鉄 vlbXNAw@Cw$|$Hv$2&A$zBA_8$ Aȃ龃鴃|$P |$xwYAHwA`鎃鄃$+v'$t$0]SIwXAIwCwv*|&|$@Xv |$H$vh|$@^waAEw'鿂鵂髂$f\ ЁuA4wwmcYOEALwA0&4w]$wA|$PɁ|$@aAtA_隁$鈁~tjWM:0Av*Ѓ Apـ$鸀|$P馀需A-wDAdw49v%$1wmcYOE|$P 3A^O|$H"3|$@[|$`|$( APA=9|$(|$xWM-|$HAAv8cA vu|$Pvd|$H+wq|$Xj>4^!ƒ|$P t;A1w2~~~~~~~~~Ab~3fAboAw\|$xwK-w+Z~>w$AZwB~1fX1~'~~~|$@wЃ~$/w|$}w7Auv't}}}}$+wr|$(Azu.;w)|}|$Hw,Aw2w]}S}I}Aw(A,}"}}AS}Ѓ||A |A ||J|$x*v3H|'Aj|`|+w<|$Hw$A$v7|-|A~|||$Hw*1|$`{{{vA{{{|$xvA0{{{AЃy{o{e{l R{Aq>{F%{vLA1wF {$w9fAW~2zAw&|$P zzzzwqAw?1fAXzfA^|$HizAFvJ|$@>w0vAI=z3z)zz z$%wt8wbvFAv3yAlv.|$Pw'yyyyyyAmyA\yRyHy>y4y*y yyAxxV$0>AZxfN|$P!Ѓ Ѓ0u.|$x7w'~xw,lwfI~axWxMxCx0x1|$Xxxxv_Aw!|$`||$H!ww$v!fOowwwwwwqwgw]wSwIwAv,-w|$PwJ ww wwvvvvvvv vvvvvuv)E`v$ w)fIO=vr*vvv'vvuuu6we u$w v:uu1fAPu{ЃuuAj|$xLwo|$@dt^1:u|$@_W |$(A $8ttt1fAStttttb|$@Rztpt|$`v}%mSt|$PAt-vA *t t|$H w! w t1fAasss|$(s$u72v%s|$P ssszs|$@yw8|$X}'AwYsOsEs;s- (s1|$Pss|$H)w1|$XDrrd rrA|$(Ar$4wI w7v% w ALv|$HcrYrOrEr8 v /r%rrrrqqqqq$u$Awqqqqq{qqqgq]qSqIq?q5q+qAZqqq|$`}Cw'apppApfAyApp{pqpw'9YpOpEp(2ppp p|$HA=oooo|$H&ooo|$H;ƒuJ|$PwCvno|$PvAUoKoAo7o-o$AuKwCon$wZfU0$'w$Ѓnnnf]KAw2w#1|$XD@nnwndnAGwBKniw; 0n&nnnnA_@AmAD A$ommm|$HvL~v:a mmw7rmhm^mTmJm@mu.Aw$'w"mmmAv$fUƒ|$Xt|$PwlllAw,At_wlllllfA`~cvQw?;w:alWlMlCl1A=D@1l'lll lk|$P Ѓk$9m]kfAblALAkAw\$1Ѓk$:AwofO_|$HwN|$X|4A?BkfM|$P,k"kkkjAv1Akw!fAXfATjjj|$`}lj;AjAvtAavGiv5Qj|$PwB$5w(AX,j"jjjii|$Pw3w!}A2iiiiiAwlAwTiAsiii ViAЃCi|$P1i|$(A$iiA;whh|$X|'A<whhhhNhah]zhph|$Pw&A:UhAGA=Ch9h/h%hhhATw($+tgAgg g|$`|?uggv|$x7gwgmgcg Sg|$(%w[|$Pw,A=4gfAZgfAZ|$PWЃfA $7$w|$H.wVAwCw1|$x v*fw/ff|frf|$@IwZfPf|p|$(Ѓ7f|$Hwi"fBwIfee$eee|$X|$x Neeeeve'w@ ^e$+wWVvEADw$dЃ1eЃeAv3kw+ed|$Hu!dddd|$Pw9Av&Wwdddd{dwEu|$HadWdAЃDdA(9f`/|$H  A@cA\wA|$Hw"|$Pcc$c4a.#aAwH w|$Ha`v8Av%A`Ѓ``````ACw;|$H w!|$xhv|$`^`T`A`|$PviAm&`|$x/w``__|$(*w,Aw?v___$l_g__u_|$Hc_Y_AwOv=$wA}-_#_$__^^|$@"AJ^|$@O^^^ v |$HvA8x^n^d^;w&|$@LM^C^9^|$xwE$^^XЃ^]]$(]]]AwC]$"w|$Hu>w,$v{]Of]\]AA>fAa.w1"]|$H]6\\Aw#w\\\\\\\\\x\n\|$HwTf_DGN\;\1\'\\\$4|A#o[Am[[[[wqv_$"wAA[[|$Px[n[d[AP[F[<[2[|$Pw6[[AwfZZ_ZZAvFZvL|$Pw7V$v>$2v'UUUUUUUUfUFG w>zUAvBw:bU|$P PUFU("D$$U|$@qA:$tF|$8!2 A0E|$p1L+fY8G|$`1zTf@v~Av|$`.RHD|$8AQ 2|$H A,A<7|$`2d f dAF|$8x ,f]%GADA8^ |$p~3AafDfUN A ||$`0AWDAv f@ |$8AK|$x,70|$`@dIl|$p1%@tArjA'-Mw|$`8PFZdL$H WD|$8cE|$x(|$8UA[|$@~A |$p}AYw|$x.lR|f|$@AjA*6>f[>|$H;Av,Af|$8@"A'vf[fAZ}GAC1|$Hff\A Av|$@3VLf|$H U|$`,A.o|$p3>vWyAA mVfD|$X$o 16 @$A $ >*|$8[B$c& >|$H |$pDf`n |$XD%C f|$py|$`& AfDA |$@3|$`vqg@|$P5wA>4""A?Q|$`,F$f^ |$p|$p AAnT4qVW|$x5AGa|$@|$ "$:AC3|$pv|6|$xf.|$pa& $#&|$xE0jQ|$8rzAgA_TVff] |$8f|$HH)AI|$H 7@|$p A A&4*|$8sE|$8h ]>0AT|$H |$x' A  @^|$pVfY9fD|$ x?A!f^h2AW\|$p0A fD|$8qu |$x,|$`0/|$pd$ fAAHfV-|$HN|$x |$PҪ|$`>2D$ [ $U;!5|$XAmC=f.|$x--t%|$x!n/AqOAvfVuf|$x2AU|$8@`6|$H,b|$@!b|$88-AtOf\} t @$g|$H  u |$H#=|$H%A-?5|$8cKqp|$8] AC|$`|$@|$`|$8 A |$H $ |$`+) A|$`35Af#PF A3|$X7[A|$p{|$`|$x ЃAB.A |$x%A& y|$`#[[A2vWMf.A/AC("A|$@#1|$HfYB|$ s#7fRXAAq[1fED@DAx "L eA+VAs#AK/<A>^A4I|$HffKAA(|$x7G$|$xRA6AE|$p|=|$`vpf|$x|$HY0|$`\R|$p/t|$H9:|$@fD|$`6|$`<gA|18AA.VIA|f\|$pSX6fWg^oЃM|$(|$8G4"A^;|$H^|$@|$`'A;`|$@ 8etf](AfCp|$pMA +5|$x=Rv|$8E2|$p|$X|$HHDA(o (J$vA?$A2!Af[81Au;AASn AtAB7AU|$@fb`v|$x 3)fD . A|$@V"|$xA|$`|$`,|$83(Af5<|$@9n|$p)_${A"LfA |$H$AA< ASŸ1A|$@QAq b&f[1AA|$p53|$x/[O$bm|$@" U O@|$x ;1(A|$8\/ACvEA>ۂ|$H|$`*AD$!|$8|$`|1|$XD@}AH W|$p1GW 6=f.%|$@H|$8c3|$`+T|$8R||$H v|$@@|$@fRAN|$8|$8_y|$x6|$X`j|$@|$x:w":7ArA|$`=|$@v D|$p]|$x% 4A|$`2@|$p|]|$` A =R% dA8g-|$pys>$ +^֢ƒ|$@A>ACӃ4>fD|$@12|$p#&A|$HfQfX}B}ACb|$p( |$x,'A56rs|$xR|$8.A|$`>A+DAAvfUfI` A*e,|$p&>J|$@ )h|$`,s  |$p i|$8_4f]7@|$8;i  q|$@v 6 |$x0 w|$p2At ATw|$x|$pz 1|$H rA`MA5>ANA.1As|$8IA  O/fZM|$ RGvf_|$`CfWƒ|$@˺AafDAB|$pzN-ZQ sSA[ Ѓ)fD|$X w AD|$ 1A|$8Dzq/|$@/ w|$`)A_r|$@t|$HJAQOv$r"1'@DAU *b 5AAh|$Xƒ|$ Q|$p[A|$@54tvA8z$53|$@e7fObA|$pNF vfAAWA]nIe |$pUB$|$x?=<Ayg'AM+|$@ QPAJA\"|$@AXAu( A*|$x +A*A,|$`5|$pm|$HqwAxdwW%|$8Q7A4X|$p^ǥAhHA<|$`!AG<<A:1A0pAB"T$ rAycP( =|$`>fSB|$@|$` |$p>|$p|$pnTA 1|$@&5i&$6AoAb A4SfYKF KAs l l|$ (>|$@2A'pOA_߃A\nPD|$p 7dgAAw~ANl|$H Z1faE|$pU|$ FP@AjA!l|$8U]|$@9A|$x%KAKKV KAJ"6|$8:Y|$@v|$ >fNX1|$H _@D|$pC5$qe|$HYv A9IA_ADC1|$p4&A ug|$8ck*|$  S"X|$H&|$@EAY;fFOKDA7AT|$X ~AfD|$p )Ar:'vA }s'q9A.Q|$phyA&/|$p:If|$`DF|$xD*L%ARB%|$x%|$`6u*|$p4d|$ ENAFyAOv rhDA"|$8fIA>@A7GR|$pL|$pfv  f.AS~|$p|v3|$8xf]6f7 UfO^|$H F|$HfD=n6|$H S|$pW1|$XKAb(6|$Ho|$P[oQ v|$xQ8A2Aff9anA|$Hn]|$x1vAfDjA&AX_AL|$Xd|$x?Ak?|$XAF"$tAcx|$pn3m|$(|$8A|$H  A:AzW Ï|$8xf]ƒ|$pV sV4|$8` |$pzAVf^5Ar|$8p$08|$pZAr|$@-|$X @D$ |$x#|$pgT|$`|$8& |$pXjHA1|$(A]w |$`(W 4AvQG  |$@ 3|$8Va|$pKuo D|$H$B|$8OoBU @ A9|$`6 fO|$x' |$HnA& cf]N%|$HOAS|$p\AHf]|$Pƒ|$pFA|$H1|$p|$8gA@>A+*|$x& U|$`CAr$|$xh A+b|$@Ѓ/@AbA|$@ BA{p|$`8pp.o|$@ @Al|$80(AUg|$x?tfSAx@|$x1m@A!A|$XO*M|$H6|$@%BAx|$`>0$  @|$H|$` d(|$HAXAA h3Tf|$pfQ-SAe4|$xD$@u|$X|$x5|$`>;|$P]f_ƒ|$8zf\A@|$pi9|$(Ag|$`%u}!|$`!u\f1CJ0Ay&1 1A9Amof\9|$pz|$HЃ|$@y|1 iA_|$p|$H B "A9&s vf\A|$`%ƒ|$x  /uAAAwzA8,<^|$p_|$`*J<+|$X A>T>|$@> fDAoA|:Xe|$@WAb}|$xDtSv|$x*@vAo|$8P|$8;;|$xAD A|$x|$Hs{A5„\A OAQtA,|$H 1AbDA2f]t$` si|$8d'=(|$x& |$H,fAA{  fY^>|$@Bl}|$Pa}A= D|$8R/? z>h|$`1|$pGvyowAq[Q|$x#B&$S|$@S AO#AI=X1XAs:*|$H vA|$8[C+AC`|$`6`A|$H(|$XN|$`Q|$`K?$ $M |$x$r $D|$8RD&OAFiA+ʬβA,$%, YA YU D 6|$`>&* ,AcA|$XM|$`>|$xV|$@XAV |$@:$Ar|$HXTQfeB|$x/ADXAw UrQA$yֿAv$+ Ѓ鲿fLM-AH$}d$ u A QAS6Aj|$@^AA $A ݾ|$x6; ZT$LT驾eA'BAXaB|A eT|$P-AF 5|$ $|$ CAwr|$HA|$pNmR|$@Sv½X)驽|$H闽|$@x<CqwdA$<f`v|$HA\|$HhDa f|$x eAAWL*)ʼA*$髼 bAf|$@TA j|$p|$`>u5|$x,mi6|$8($e 7|$`9ug|$PΛ|$`)\S|$p)|$8DB|$`+`A˥|$xh$闻@.At{iv Awi_wI?A+AH_*AR* |$H .+AѺp|$`3#:f[|$@r}|$8_o 釺@u|$ bAO73fBN|$x1|$HDeA'@=7M$#Axֹ|$xGJ XA髹|$H Az逹A ofP* \7l_ 0y 1fD!"A6.|$ .x|$@eHP|A+ϸ|$@A4v|$@阸$ fd>$ACfb4|$HF t$LBfIZy cAc?qfDMAL Dyp|$x*]|$@R$,R*  R鋷^r|$x*]&1|$X QA=fN"|$8_&^|$@!1A|$x- yW TAeA@5"AeA 遶fDAg|$87/(@L0wЃ5#AJ1|$( |$x&ABTA;7AG[`黵|$8G|$8=QDAp|$p6~1f[D{GAFS$;|$@%Dd$HEJ|$xraAЃ|$`%AԴ|$8(fWXQ|$@'|$8_S鍴f.AfbZI|$@9A%AAFLF|$8<B|x!E|$pg:As黳K騳! )9AuusAY&AUApFk3$| |$ r-|$@i|$`7V|$X~|$x#vAֲACك鿲|$x#J/|$pMx$myfD|$8Lc|$@q$ E|$`M|$xm CA/  AA|$ D_A3±|$x AuOA陱1|$@P釱1As( |$8j(i LA5A/2% |$P} |$@0Aϰ鼰|$`-#Ѓ鑰" '*A*n$3!|$pIZEA`6 3 !oA_ .ѯ|$x uA[飯AK/|$@釯AFxgT|$ "f^Ta|$pSBJA ~$|$ DGmfXm  ҮȮ|$xA%s雮Ad釮Av hjA_Y|$8Fv |$x53)f|$@|$8AY"|$X5I|$`!X|$` έx黭%騭釭}l ^ZJ|$H#AHAv D$|$@}AQ$ Q̬֬|$@"=L|$(ޱ%|$xAJpD|$HYC|$`CXL|$H ML#AD Z21fhA p|$xqA ̻$Ab$f`"A){`yM|$ EE)|$phdA A5ЃAW1 o|$@,©f`鰪P@闪$5|$@$DhA.A#BЃUv|$x=3A# 2%hfKox@A8|$pg_|$`*|$x+A8鲩|$`68|$@v 鈩A(=Aj,eHU|$`%nPm#+faJ=|$@|$@/GF$|$H G|$pM7]AG-]鹨f|$@-?$ƒ|$8!t u$<-|$ z[$A%4A>#;AW=|$H:fWAp|$H  |$p2fZOƧ鳧v铧|$p|.|$(vpfSABBfSA|$X~|$@%~<  A'AOo|$@)|$8O|$H AK|$`:驦 Y*|$pRv~ kA+AJEvA7-|$`4_o>|$p[d>A('A$|$ MAAM 黥 J2AP|IA[}ƒ|$PL:o @:l$ ,AEcA#=|$XWmXAl9>|$HcrL Wr fB!|$`?`f|$p |$x+RM鳤"$ cAA|$@zA 0 ]$Ex|$@ |$`+d2|$@CA2|$` =AԣAOg"|$H~W|$@pW駣fZN|$X59$6~ qAj8|$@8k vA B8|$p7%Ai|$@i A>8&|$@SA1ܢ̢|$(D9A0B|$`!a|$(A0tE遢|$@@c|$ ,|$@d|$x1AsRp"A>G|$X^A[ M|$`nۡ|$p1|$`:b _$GA=隡|$pc;AJr|$p(v|$`8[QA,!A/,e|$x !e|$prCYvA+ -A!C|$HܠA yb鿠|$`O|$@t Af鈠A|$x23OfJ1V#|$8}SAqAA` , Ag@AKwuA-vfYϟş|$`&G$x15AdZ|$@ OA?~|$p#A!DAzAHAv .$fYA A|$`-a|$pikfbkAxŞ|$p=fMA l 鐞A%|$Hv,ka$[(|$p*AA]Ar-AIAJyAЃAP &|$H@|$@iA5AZQ.5.|$`4*.閝|$H鄝j]AV] ^|$@(|$8-\8 - >A r|$H|$H?Ѓfa;P$~~~顜|$pf郜 d|$@T)>:A)|$H)$ A$AA ƒ|$X t@鰛Z A}A'7}鄛f=%Ae|Xo]8^H|$ rv|$`;1'|$@9A9 AK8|$x1) Ě|$8Y3AE$ E|$xFzA||$ /|$8Jt6|$X#w|$8Hw|$`+,,A>(A:R$A$TAE0A2A[鑙#CAy~EtArdZAa|$HV;f]K,|$H!?TfZ$ |$x,1|$HA=$ј|$H鯘 /|$H/鎘|$x9|$H`<|$@p_$ );|$p4  |$p5)jf^jf`AIP$$W $|$X 饗|$`AEA*A܏A pY|$H"|$pR<|$Xe]%3!A.VAV|$@4AX$CA7dtA0>tCsA,鸖!JA阖|$H|$ r?A|nA"ANA=|$x.3|$`Mf] |$pLz0AߕAncr6|$x3ifbifY|$H AAv Aw|$x$f#\AfOf$Aw>|$H)A k|$8`=;|$HxAp|$x3e1fRܔ|$p-%\$W W餔|$`0`@|$@:K@{AEjA |$H K|$`/|$ E|$Hv|$@|$p  Ad<% O֓A= 鰓Av|$H 鍓f]AIS|$@M8hA:yffI|$H tA8>4$$A\A |$8>:1|$H Df`YA#yA$n|$`4鑒|$@u@|$('|$`|$X[|$XB|$H ;AR'fH|$pAN*|$`AABΑ黑AY|$phCO< ˌ|$p[ ||$H jAR4f]4L9|$x3A tA G A(A ܐfa*鿐鵐8U閐|$@*AQ>e ЃlbA*|$@F=$,|$(+u <A<|$@At%鴏Ao v鐏$"&|$85o|$x}f`mzA%/$c:A~&A'%cAk*~*|$@7|$X> ĎA@'fdX8A5gd閎AM;AAƒ|$x;A;^|$H P-|$8HE-m| )|$ L &|$paG ƒ|$`(tA֍AōA7'AO(阍?配|$x5h"|$p5/|$`0gAI&f$0 v|$@v|$p!A} (E().A.鼌76$Y6|$x?6銌|$po(~h5YZ$Y|$pIAq>5>1|$X Aa<|$H <A|$phAXv$靋 銋逋jv|$xh^|$8J'(A>m|$(|$8J|$pn&|$P|$H|$8W*AvA݊ӊ|$p*$+C+鲊I)A)||$8=*_|$84vf`oe[Q|$x|$@cPfaYP'|$8r&|$` z<e%PۉAYaAvJ鱉 鞉$))$uA$$_ |$`'` -#|$pYA:Z$Ru|$@.|$HoYňA鱈|$pX7$u^ 遈|$8(M7|$@ jAWjAJ$21|$X]*|$Pu |$H |$H8$j|$p9w%χŇf`B0|$` 0A^Oqm采faL8$taG WP4|$ jbAchAi!$F|$@E$WE$Q ߆Aˆ|$@MG 顆AG鐆;A2; 9^TA@f`x/wf\|$x- Ѓ|$@ „ADjօAO6A_|$ ~_A靅|$ >W3i vAsE5|$`4_AAt|$H<2fU e d|$x*d 9Ay\PՄ|$`"{4|$(b|$pj\_P_鞄A銄1fIj|$x a|$@aAfP|$HE0A/|$`;c|$@ A 2e^$ 7|$H-鿃\/A#b|$H Db|$8[ A4|[f@|$x1^f\{?$TAXuAjMfRMuju|$H M4 c~A Y~s ruAYC5|$pS855k1@uAE,uA:|$`8!wAwu|$x+K,|$p^y@ Av|$pEtt|$X|$H(Ft|$`7Apt|$p v[tQtA ЃAt|$XKf`|$`5WK|$x2 , ƒ AD sAZ Zs1f`sAA@1SAysAes$ $c |$`>;fZppAuj jAjAKrpAC*|$pjpXA|$p5fTAAAA*A:o$"6~|$@$|$Xo`+|$Ho|$PQ'vm|$HDyo D|$HwvUoKoAoA$oo|$@DNAA6n$n An$.Mv|$H nn|$xicnYnA4(A rfJt'A $An|$`06a t m (|$@rAYm|$p\S3|$@\$A mAp.8_|$P _TmAv=:m0m|$H j|$x-ljXm$= /(ALЃljЃlJf_|$XJ$ |$x(i$j XlAqk(AbTe|$H Sl|$x  )fY=b|$8|$H Al|$8#$viЃk%k|$X+Uf[IAGIAD= '|$p){k$t|$@akWkA k A <A vA kkzjAkTZjjjjAAAAjjxjAagj]jGJj@jA3|$`*L:$T|$`#AIii|$pZfb_V|$`2RAiV$ƒ|$x.u Ai}i$JEfACƃ OiA+>D|$pgCi|$pv|$HihA0-h|$Hch|$x<4A%4PhA%%$s/fb|$HWhMhCh|$@ 1`%`"hA&h|$@dЃgYAg$4b|$8~bAgg|$xgf6CqgAw ZgPgAN{|$@C{%gAR0,$vANfffQ pF|$x@Jz|$ |fD}Am}%&f$q]f|$@Kf+ A$&fA=mw|$p}$"x|$`me|$p}}beA'vAeeG eeeueAe/A ; ; oAb5e+e|$H $7Af6EtreddDddA dt dd|$@t|$ *ydodedƒ|$`+tADd:dA5K|$x^?dAOcASG|$pLG$MAcA5cAC|$8CA}b|$`?dcAJAFAe@cA$,c.LfZ2K|$pAgЃbb$c >\EvA8bbbbbb|$@Ѓqbgb]bAl9_f+b!bb|$ j|$phjaaaa w |$H aaEv$maaaAmSja`af>Y|$8AY|$x+|$@U~At!aa aa`A=vi``|$@jSAW84Axv|$8I``$vvl`x`AB`j|$@jA>AA;`|$H)`g|$`&gAt_AS 3A2__v$____!_R2,k_a_W_|$8P3|$@42|$x)w)__H2fN fJ~^^Av2E߇Al҇^^$-|$po-A9Avrn^d^AP^F^<^AAx( |$x;Adv|$@%]]|$H ]fV5fP3|$H vA; ]] ]Ay96f[5sn]}^]ADf`t>]4]|$`d/Aa]]|$p>2A*2|$p'|$`:|$`2w|$@\\f@5VL\\A5AЃh\^\A,A=\3\)\A\LT4AA=[A [[|$`*<*0[A+Ѓ[|$`6vAu[k[A v|$x8R[H[|$`;]E1D,[DA[[GZfGR,|$HA@wZZV,Z|$x,|$`G.){ZqZgZAIiF8y AZ|$HAvZZ|$8`AA] @| YY|$H"F6F ߤ|$pԤYAcA|$H)Y|$@2F|$HFAAAԜ1;7YQ$YAvfZ YYX|$Py/W  XAG/z/M|$pzƒ|$H+AtXAu|$x)^XTXJX|$ *?|$x4>AXX XWCfS9?A (AvWWWW|$ AjwA3 jyW5 9s AxAWABv|$((WW\ W|$HVA8v$VVA AVVVVVVyVoV|$POXV'HVimlACclVq5|$@ UU 2|$8L1Af$ UUUt@Ag@sU|$p|$x v/JU|$xu|$p~%UUU|$x?|$pkTTTTA4 ASAT|$x6b2f]vAwAaTWTAZCT9T/T|$8J4|$py4 SSSx1|$HS|$8l6-A>SAf$j|$@ j|$x$ifaAjA*j|$ j4S*S S|$`9S52AhRARRR|$`B9A88A%ttRAH/3AB|$HYR|$X06 ;Rf\77A7RRQ3QA=ARQ|$ -1f[Q|$p~;A*A;|$@;AopybQA$NQA=Q3Q)Q|$@*4B4AQ|$8_9a//"|$8_u PP|$HL9|$`-M$d <A0r|$xYr1|$XmPcPYPOPA+*Ѓ'P|$H5qA?O|$x02ЃOl:7Oxf7A+OAb2tO)|$@ fay{|$XA$U{I{;O1OE)AO|$x0O|$ D|$@NNNfTiJAS%J  f[#AN tNA@AB|$x|$pb|$@)N|$8?If_I|$p= |$@f_OMMATAM`MMf]CA7jjdjAIjLMBM$ W|$H 9|$p4M&v|$86LLL LLL|$PQKLfQ ]fX]nLdLTLAL7LAGgA"LA0|$8BqevKKKAfM||$8^AbKKfI]F|$@?FdKf^g9|$xFHKA@ YA|$88KA% K|$@ KcAf|$xwOJJ|$xLZA ZfPA>A[ЃJJWuJ|$x,LAL}MJ :J0J [f:Z0J|$8b:|$`2AAIx|$p|$`8/  vI|$p@|$H|IA:@|$x!ĭ|$ BA7 |$8/|$x3|$`;*I IfRsfD!fCAA !Av% HH|$x-f|$@H|$pWCft%-|$@|$HL|$x,#gvEUHKH;H (HHAG nG|$HЃGAN|$HGUFGG|$XOGG1|$@DrGA~{E|$x&HE|$X A;G|$x(G|$`/F|$ ~%a|$XaGf[ZAYA'F|$`Gv|$@ FFF|$`5AW{FzF|$x!|$ ;J|$XJOFEF|$x"SXA'L|$H F|$`< |$pAg E|$ s?EEA;=A|`p`EAu|$`0EvE|$pSN$M|$pG|$@AI|$ v"EI|$`9^IA}  DDA/E\DAPmDD|$`0ƒ|$Xu|DrDAg=YDAEDAE|$@afEDDA0CA(<CA5C CC99|$pD|$p}|$XA=қ|$`,ۛg%|$x>jA|$x$=JANA>AAk5$Z5|$HAAk@A=A?=@$x8J[A[fP[|$Hv[@u@k@|$HY@O@E@fb&6 6%@@@@|$`%?A"?A ???A? s?f]O|$`:JA_ AfZO4?a!??|$x9A9>f\\EfM1E >|$pSLAT%Lf^! >|$8H2$)|$x'Y>O>|$H.|$xC|$@ '>>A- =fbsN|$`5<Av=== ==AZwV=v=7A7$7E=|$H 3=|$8jLĖ$=fb6|$8rp6י$.X|$x wA< >|$8 U|$@T Td:rJE:|$`+j)AZTvfa::f`;fI SS|$p^SW999AQ=9AS)|$8L)A=Uw |$POj9`9V9|$HKAO|$@fIl4Ѓ9 9|$X H$~H8|$@CfYL8$AЃ8|$ AA;Ad8AP8|$HMApd(8|$x,&As 8|$x-DAGDAbAf]7777 8>$]s7A%}%f]_C797/7A== 776A wGw6|$x0Ow66Ao6|$`6wAf\}m6$wO1fWR6A#>6A66ACЃ6Rƒ|$pp/T#5|$pAwA55A{|$H KA|$`=o5e5AjAo G53A'5 5 5$M|$H441f`D@44|$@$f@ueAcfV4u4k4|$ |$`'N B4w/4%4A43$|$xfa$3333333w3m3c3$$Ѓ23(3A3@wbrp22$ @|$X522$ |$x Ao}2$Ѓ]2S2n|$x)|$@ v|$p1%22$ 2fD'A| A<11AoA11|$`7111$  ]1A3KW?=1|$xN|$`0Y|$p{t D=0A]ZZ$ZAWZ0|$8Tw7|$pwAQdsv|$@00Ar~O|$`1&G|$HP0fSg|$XR|$@QI|$H 0//A=wA5//ap///}/s/i/_/|$`.w?|$p(_|$x_|$H_AcwE#//|$8@\`?2`A5.|$x#1fMD@.fbG$R.|$8qW|$HfWw.w|$pw^.T.J. :W 'W|$H&.A;^A^-|$`=Wt--|$pjwBwA--Q--|$pkA:g-|$XOP-|$P >3,-"----|$x0SA,1,M T TA TAPT$TT,o,e,$M,:,|$ 3 S ,AMЃ,|$@w0$ƒ|$ juf]++A SAiSf_?SA(S|$HSALSRRg+|$HA>h|$p<@+6+Aw"v|$ k++|$H#*f\JS*|$`-|$p'ֺfaƒ|$p[|$P**$'t|$Pim*c*fG*ѻD$@(6*$|$H *fY$xb|$ T)|$8d)|$H|$x{))AFw;|$xt)|$@"|$H T)*))$A)AS ((($7 |$x<Ѓ((A ں κx(n(A@vAxV(L(A;(1('((( (|$ ҼA''|$`:0A'fUd'A,|$x|'r'|$('ЃR'AAY1'!'|$`Po&~o&Aw7|$@ Aշ|$pw&&|$H&1&fb6Uv$l&b&X&|$ A|$`'v$C #&&&A%%%A8 RAOQ]%#R%mX%no%fVoAX%N%D%:%f]QAQ|$HQf_Q%$AF\XAEXTJ"$A?w A$$$A$$x$AeX$N$D$:$0$A+|$@ `A $#|$`2x`|$@c`|$XN` v|$`3##|$8@n`$ ]` G`A =`~#|$x*RR|$`4wU#K#W8#!|$HO#$"$5"""fl|$Hl"|$`"fIl|$84{"w,$nlAQ"G"A?^AЃ*"|$`?}l ""|$Pgq 6!!!AsbfZbb|$`:k|$x%k!!Av |$@CAW!YAsXXA&!!|$@f !Aa$UTAPT      |$x5 |$H f|$x1p f \ |$H J |$XO3 )   AVEO|$`-0OO$- NtN|$@ N|$HN|$x1NAKK5K'PFAK|$x KKA.K |$HLAKACKdKA|$pub$L |$@2ƒ|$`BS|$8[HukaWM7:0A<w\|$p&džE|$`BA,Au %|$`&o\$A7-#$uT|$ _fWl_A;wA|$X|$`; |$HA v|$PX$gAg6 #|$ps^|$HA|^w1ƒ|$`/uA|$@R^|$x6wy|$8j<"<D$pf|$`VwWZ d^|$ j< <$<1|$P}  Ѓ%^A^|$@]A?]|$H <<0<AjAw" v|$x aW|$p`'NA`N|$x!@1 $ aaANHaAD(aA7 aAK;?;t6MfvAOE;|$x9\U|$X >U\fV|$`)AjZYA&Y|$`7oLApXLf?OT|$p}A2(aa|$p}D|$H#|$x17AAY|$@Y:+Z|$HYA_lYVYMYi:Y|$x,/Y{hATf`ZKYAeЃ1'|$pcOOAB߃4|$8ff_\|$H v6Ai_6|$x(5A5|$@ANb$=bWMC|$X~A* |$H  |$@Av|$H AwW|$H wmc wf]WMf?zA[zA z}z f]]w@|$@EQf2Q|$H0U|$Hvf2|$ 8IUOvlbA   `A_|$@Oo_Af#|$ ^|$x/^8?^A Ѓ|$ RHA #H|$`9HAhH6 |$x"W W$qWkA>J|$HJALw?5|$p/J|$HJIII]|$p6VAp"V$F Fws}u|$HcYAh^|$xF^|$p1^A)$^|$HR|$pv|$Hx|$ ԄALDŽ_*V*dQ|$H AjA: k|$`< |$pwK |$p"lJ A |$`5MAC|$H. fTX f|$@w_uЃDABv|$x+! vA] |$HЃ|$@sA s|$`<s}sAЃ1D|$p>,mx$ $|$H 'fT% ?A8tWAwNA Abܖx AA+ufbە ŕfPpf\RHAnABd|$pUv|$x|$H wP]{^|$p<^|$x&ƒ|$`4uAI   |$ppf n d Z wv|$HmAgm|$8Jm|$`>m|$`)+A^+AbamATWm |$`2wPAG A9mf;mmm $JYAg6Y|$@{s i _ U |$ +fV*A, " |$`CTj|$x*j fWJ >   |$x/$u|$x)^|$`5]x{Aon{AW{f]M{J |$@w|$x,w|$8?w|$puuvA[u|$pa*v|$x&v A[uA}u|$`3zSuA |$pojj|$@jj|$xA b V K A v|$@ )     '1D@ A fQz~AU~|$H |$HA}tA^|$xASdA|$`Fw7$K|$`%wXfbb\I?0|$H!|$xv f`$%`|$@K_{ v |l)YOE;1'Dp|$@ p$"|$x<pAtvfK|$8oJ v|$`>`V|$@ wJ$JoA`to$?v|$H|$x:ur|$X r ?|$@PAQOt|$`.|$xssfI!Ѓ|$H„OAO:$fMLA|$ u uA)>v z  s|$`@s|$@ u |$x"r_UKAS|$H DAAb ۄfWOAAR$: onAbnqg|$`*'XtX|$@Aat|$xVt Jtfb|$x Ё6uAlAJV$*1f_i A/A1f<D@|Ak|$poSAmf`RF6,"ЃAqE|$`,aN@Hf]EAv-|$HAIeC|$@ C|$`8lfKlAIA>L|$xLA2LBEB|$8DwvA|$H TCN>CA`CЃf[F|$XFlF|$HЃfaƒ|$pit |$pORBi_UAw_AA0A#k;AvAAj]A APk|$@EAn|$H/kFPAf[t* fY;VAPj|$@A98AAFfaF&FA;tF|$x$G|$p+zGVA\Gn|$@nA;NA#A|$ 4wsT|$ {w*fLRm|$PAN|$8ZM|$`0M vfSqglA`mAVv =3Ѓ! |$xjAEjAMjWMf]+MMA M|$`CmgAVgfZ8gAh^HAA|$ IKf'Iw|$@ |$@EЃ|$p{|$ VJ|$XII|$@[IZEI|$`)IvlY|$HG=31|$P! r|$  1 |$8ue|$ e|$Xe zpwq|$8?G}|$85dfA+AAT}N |o A9}fR/}0O|$prf_uA v|$XAqg]SI$ 1S|$XCAE@}|$H A^AyfM|$H }q}|$HwMf]eP|$x=PAnPA$P|$@v|$8K3)AA#O A#|$p}A_|$HC#AQA |$x qAFlAz|$89EAHw8,"fA\|$HG|$89AVzAc|$HX ACr$e NAw|$x6A$|$Hw# vA`AAaw9EuAXv,|$`7w%JwlbXND:0&As' f^"|$x7vU|$@v(v$1|$@jAYA.v J@$vf^)|$X EtBA|$`>u,w|$86fa#|$`&vs|$`5aWMAAw<4*|$@vBwB A>w.|$HvuAvcAw3|$8ww|$HzAЃgAv2Arv"$@6,"|$p_|$@|$P|$@!Ѓ|$p`„t|$@}sf`O]|$`,|$HAwjACtZ|$`wIwA|;|$`*w*QBw/dPT|$X}d$wM0&A,wfP|$8^wj|$x'wP|$P}?w7 APwq|$pvjcYO<\vvAow]|$x#wLAv9Av&7w|$`(w@w'~tAc|$(wxA=w_$Ѓ?5AwaAvQfdK (ЃO1x|w?|$H w$vASIA`5+! |$HwJ v;v~|$`*Ѓwm|$H[QG|$`,w -#fU6$?A`t|$@ A w"|$pvAZw#fR~0pf\P4|$P:A$|$8jwefU>w,fЃAgw=|$@wAf:w{|$`8vT|$`@w/|$8_v$wRH>SvA\* |$8Qw$|$`6w@A=w7t w%|$@wwmcY|$HvAV>4*$T $0 J$ w zAWv |$xf`u&w{q|$8+wA|$Hw0fG*S|$HvfP=3)AA,UfXCAA>wfYd$ wC|$@ w*|$x/v/|$ #}FlAAFwv|$@ve76Aw6A v#Av|$85 A|$x5|$8.w1|$`:6pAdwYYFf[i|$`1vXAwE~A"f`A|$xv1A|$pAw f`OxnfaAJSvAF9/%|$@t21w6Aw_tAXyoq|$xfEwk$uFAw)f]~#|$PЃxw6AdЃAw$]vЃvlA6v< w-|$ LB|$`4Ѓ1' w$AYwv|$x@|$pr4_Ѓ|$`%|$` cЃcAdOAz|$@tASD|$H|$`-wSЃw8|$x+AЃrA^|$@L}&|$@ 5+!|$8WAf|$ |$x|$@`+f]Ao|$xv\|$Hw0Apv A{v|$`'dZP|$pA+!|$H |$X|3$w)$Uwvt:Aw'AyoeR|$@5 t.$|$x/#1$w2D|$`/v3|$Hw,$}mcApRH>4*Af_#wRA|$ ABwo$vX wFw4Aow+fatI{qg|$`OAFwIl7$wsf]T|<|$x$v+=ww}-AQAAw5:|$ v}|fauX$wK|$xw:w2PF<2(ЃAwx|$@ |$x4wmAYOEG2Aw+|$x%wA}w|$`4$|$POf\/ACww^TJw=|$P}61Av7Aw'|$pwFfW0A|$HwE$yAw;|$x3w*1|$XDf|$x#w$~OE;A+vfV |$Hw2A $ARw:|$x!v3f`h|$X}0 w$tyoe|$Xh$tT w6|$8Mw%|$X~4A 1|$X   1|$P|$Hw>|$@Zv|$x>|r_U|$HC9/%D|$XA|$@?v:|$`(f[i}wWA $+A |$p8wuP w7|$@ w&1f]D@=3)|$Hw%\ v|$ w{ |$x1A  fS|$8wq|bwZ|$X}"$ei_~#A v|$@B8.$AXwPhw>A |$`1w9 A w=0 w[|$@vJ;1|$H~&v|$ cYOEAv|$`5,"fB4|$Pl|$@|$P|$H ;AJ$w|$@~Ѓ7|$ %ApA2Agwf|$Hw@|$`EA7ӳAEwT w0- w|$ v驳音镳|$@ vv cYOE|$@5w$@+! OЃA|$ xA\Ѓ鹲lwd@鞲锲|1fQ~!vA9rh^AMCA\/fB~|$@Av9|$Hw2|$XܺOAw|$@Kͱñ鹱Aw2|$xv!|$Hv|$@鋱遱|$Hw&g8TJ@-AlfVuEfb?faAwV|$X}8wӰɰ鶰~k1|$PD@韰A鋰遰|$Hvr$v^wYafc-AGxw#|$`,w.|$8HfY!|$x|$8=ׯA?w$Anv 魯飯A@w$AYvyo|$@wAAvpTJ@6,|$pwg~uJAwAf`A:vZ|$X}2AVȮ龮A骮Aw/w\鉮uAwC|$H u<[Aw3t.C|$X}'E)0x A߭|$H鷭|$P~Mc锭AgCtZAwE$w.Aw|$xw*  |$H w ۬ȬA;wD鯬|$8Zwjf]K|$x8w:AI-w$|$X~'kaW|$Hv)w!>w|$@'f_|$H AtfЃܫ|$8TVЃ鳫A|w%AM霫A|鈫|$@ :^wAJw/|$x6v(@v3A3 Ѓ"|$`Fߪժ˪AWv+w#鰪|$xww闪鍪郪yoe A0 wXrwFk5|$@$w}A |$pv:|$X#||$8dթ˩A鷩魩飩险鏩酩|$xA1|$HX|$HwXwF|$@"w5|$P~$w)|$`A |$`=w;f^+|$POը˨鷨va韨A4w>Aw5醨|$x&w8noe[QGA;* A5u:"w2w-|$@vwȧ龧鴧Xw锧銧逧vlbXAwffCN|$`:w4w"$u"AЃ|$HwBΦAm齦鳦驦韦镦邦xn[$C$ wX|$pvGK|$Xj|H|$p5w7|$P~&Vwޥԥʥ鶥A_w7A韥|$@ ^w1qy|$HB[|$x,I?|$p'-#\w6 v$AۤGˤ鸤鮤餤隤|$x8w%|$HvAxndZxw:AXw'[6,"f`c|$X}"|$HvܣңAw2f`"|$x"u|餣隣fQ$xndZAcw'AA-$ ANw{$vsܢQɢ鿢鵢髢|$@un锢銢|$HwAPwsi_wW|$pYwF|$8u56|$8DwS |$X}w^<2(bv.AvAeޛԛʛ 鷛魛飛陛|$H 銛逛vlbXw5C9/%fV|$x5AS |$Hۚ|$X|^鷚魚飚陚鏚|$@ fIAW 0AV|$x3A7-#|$@ w |$H|$8U{$ `|$`7wB$髙 AwmAwQ|$H~|$X-"A vA_U1|$P?X , |$PA w0 v(AMw=A w|$`9ߘ՘wH麘Aw" v|$p鏘酘{qg]AYw8A w%|$pv=3)$vMEt>|$Hw% v$G|$@ ϗŗ黗fY5|$`8v$AS隗銗逗|$@v$i_U_B8.|$xw+$Av Ӗɖ 鶖鬖颖阖鎖鄖|$8wc|$8]wJAv7AwAvf\C9|$H '|$`3 |$H:A0A |$H|$`D•鸕陕|$xf^A!d QAw7v/wA;w%f`Av(AДƔ鼔|$X<|$ !ЃA0uy|$pEAw{1f]PA\w.|$pTv-#|$pCvef^~UA;vLAv3*ԓʓ鷓魓飓|$X}A逓|$ IZA8&|$`6A>@AwvAw=Av|$`;AwTzЃ|$x$wt|$prwZw@|$pSw/Ē|$x*鲒騒鞒|$x錒y|$H|$x&AL9|$pPA0we|$xwT|$@wM|$x'f]Kw\|$86w*1|$X髑顑闑|$@ap8AlA;Awg$Mw3Eu|$H 8.E|$89AЃ|$x|$x#w2|$`1v!}A鱐駐|$`6wdAvAAv.dЃu|$`9cYAfw,$t"v鵏髏顏闏鍏$RAH>|$pFcYAwv5+!AAA;wSwAA-w.A/tA4vЎƎ鼎鲎騎Tw&$vf^zwXAkw vSIA^9A1f^|$@wj@|2|$Hv!vAԍʍ8vw$ 頍A鏍A?v>|$P|$Aw,h^fKA7-ARw*|$`2v#|$Hww֌̌ŒATv7w/验|$x8wU|$X}+|$`7v 酌{q|$X ~:w(1NA:0&wJ|$x7w9Aw& vʋ鶋鬋颋阋鎋鄋zD gu4WO$v+v:Ѓ.$f]AA:v݊ӊɊ鶊鬊Au!w闊1f]D酊{qg]S|$HAA-#Z $AwJ|$@wC͉ÉG鰉馉|$H锉銉选vlbXAv:|$ w3>4 w!$1v A|$HψAC|$ :fM6AWf8A酈wn$wQf\AAfMu"AL wb v|$HtF9/% |$ |$X|!+vA<Շˇ$!A 鐇 vA wmcYOE;1'?A?fb|$`8چ wAĆ麆|$P.|$`D顆|$@鏆酆{qg|$pw5|$`'wCF<|$x%Ѓ+!fPGAwAN|$`$w1ޅAʅ|$@w|$`2韅镅}'}siHA)$B /%|$`3wSAFvC|$8|$H |$XֺOՄ˄|$ w5Av"|$`9vh附鏄|$H t?$L w2|$`6w!|$H t|$ &]SI?5+|$`Aރԃʃ鶃鬃颃阃|$ z|$ |$pRA@wY9|$@A,w||$x|$`wKA!w'{|$P˂|$HAh鬂A8|$x,|$( AI|$ ,|$@VEA|$pw^f[7A(wAfWcv1ہ|$HwK|$XO齁鳁AE靁铁鉁fXc|$x'w$]vA!* |$xvQ|$8@w@w1A5v!A;vU܀ҀȀ龀|$`-v|$p_靀h|遀wA|$@uM|$`4wwAj~`~V~AVw.=~A,~"~H~|$xwwwV1f_}f`&A6A|$PO}|$pFvB|$pf}|$8=$w"$d}Z}|$pwP|$x(w'$v|$`>/}%}xv|$H  }}|$`-w2|$`'v!vAg|||$w:1fVD@|fV|$x,w^v1||$`8w2|$@wue|[||$HЃJ|@||$`3w>c&||$pDwkwL|$p'w3|$`?w"1D@{1D{{|$H{|$ w/{Aw{{|$p]wMQq{$wlf\Ajv/|$@/D{:{'{{Av8$w|$@zz;ЃzzzzwJ$vzzA6w9A3w)AOlz|$`8ZzPzAwG|$Hw&Av$3yy|$`,wJMyy|$p6w{f`aA6w-|$@ ЃyAUv-%~yA w|$X~dyZyPyAx4x*x x  xxAi f`Aw|$H|$`|$pzv}|$Xl|$p}veA@wU|$ wNfa2|$`(~wAv|$Xhw^w "Hw>w4w*w ww`w.ƒ|$8FuAGvv|$H AA|$8?wRAw0 vvv wE|$Hw>rvAu$Aw RvHv>v4v|$H|$8P$ wu wcA wZum w4v" v|$8auuuA uuu|urua wj|$X}Y|$pvRRu|$@w|$8Uw:u0u&uu|$H uu|$X#|$x0|$P|$8Ctt|$`2ttAXwtAv=Aw!vf]QtGt4t*tw"|$p$wAh ttsss ssAw-|$HvN/Ѓsss1|$@spsfs\sAdv?AEs;s1s's>s s|$`rrrrr|$@r|$H rr2Ѓrr$w$A/vD_rUrKr|$`*9r/rfLa` r|$8DAu|$pMw q}vqqq|$@D|$x09q=q|$`Aw+wuwqmqcqv5|$@.w$A vDq:q0q&qq|$H q|$pbwSAw2|$X|!}vA5pppv*pppiv/vypopep[pQpMw+A:2p(pp wKw9|$X~2oooooovko|$HoooovoloboXoNo|$Hj|$88wAfS$C!jj jA1teAif]Dv?|$@ w!wAii|&|$xNiii^i~itiji|$`%LiBi8i.iAiii|$8^wxAwI=hA!h|$@weyvSAwJhAw$3hhf[%Axphfh\hRhHh|$P|$X} 0h&hh' hgg|$(ggg|$Hg|$@w3A`v#gggygogeg[gQgA@g6gAawAt gg gA[v"$u fffw~fffffffrfD$H[fQf|$@A0Amf|$`6fv,ejwAzeeAwi|$HwbeeeeeЃuekeaeWeMew,2eAw*ne|$Hw$A vd|$8RЃddfa$ddvE|$XOddddud<bd|$@w'AwHdAz4d*d|$8_w`KwEAdAwi|$`(vX wPAxw0)cccAw7|$@w0cc"wAycoc_cUcKcAcAv|$`0(ccff.USD\$`l$(DT$x$A,(S A|$p t|$8 f] |$p|$X\3A|$h&OA@T$@t |$XT|r|$8|$0lZ|$X/|$ #A g6|$S[s3|$X&v|$P|$hj|$dZY|$X,|$p$ I|$hM/JA_|$8LfYYXfDAqwg  UfAa~x &y>f_dAeo$.Ai A&|$pE v|$XuA fV A k|$X10]8# |$p % $ |$P07D$X^4@fAG=hd$q|$p$-yAo|$0hTA ,J|$0ho fA`YANf[Ar1 fDqM |$h}j$/;"1|$@R|$@ U|$h|$@3#^= ]|$8EǛA_ |$@$y5% I4|$0|$0m'AG$DS[v|$8 ^Tf|$0|$0N R |$:|$@ ^AUi A|$09fA`|$@  |$X,|$0- #|$8q;NSs|$@wD|$0!vq+fA`|$0()$8DD$R|$ ~|$hq|$@|$X([]fAQ|$0v|$h-w΃|$p4wƒ|$@볐WW$k,(|$0>2D$@#OQbZ &z*A%01 $f|$@fD7fbs|$@,f/f^ fDfAW[|$X6 ;|$pYVQfA[|$0|$@!f=>,AfA]5A S@"P 7Gf.f^|$h; $ U$|$0.$@|$p= |$0cB F@2|$8NA$ A |$0B|$8o|$05AaefL$@W7DtwKH_@ 1I@D|$Pw1|$ $m TZ%@|$mUk tЃ[f$ A  |$hwV=ekf$3f9 tA |$8fA_m A+  +f.|$p0|$0\&|$X0]6|$0MTz|$h8@<CA &|$8|$p-I|$X)od;$%fAUO@ |$0|$8AAf_|$Pf|$X:qA ЃU|$hc{ $||$pD5|$8tOAkr|$p8!|$83|$X vf.AhJ`fAX6|$@0S|$p ~|$X<\|$0:|$X-n1fAS;f|$XH |$8|$hp |$p@v AofD|$p/ cI/$  n@|$h!A "&],*V@& |$X1-C!|$@D/|$X l1uv$9 7|$8+|$@ARPbfA]EbqgD|$X,e|$p*>A, v _|$0q |$8 D|$hx=A mB}ecfA]8;f [$J eA5PRf`|$pu A=$ |$ |$8yQV=|$@|$ f_+|$@ D|$8 A7 ^@|$X(|$X ?A.@A   |$p ?}" >6\|$@O|$p-ZA<[#|$hw|$83:a|$0>6$Y 9|$h0fI}A%|$7B|$X9bˋ|$8 GDJ |$hAjA |$h;"(fEJ|$0?%s2S|$8,JfF|$hn@|$pt?fAUYfA\<$~2=$ uw |$X6bXA~] :A:~ v|$P A)d. |$h|$p f|$h|$p+4>S|$0.u|$h8~|$p#A$U7UU5uA?=A 2=|$8iH,fY@Af{|$hT`$$Q 7F|$@|$X(b $~93d|$@TA9|$8|$0d6|$0HT|$PHMy1|$HD|$X(3|$X  lAm"fA_{A|$" ׂgD|$0O|$h|1'Ad|$p$ |$0|$X)".AJ8<|$h)`fAV@K z AC$'|$hy=$y %lAfb|$h[|$p% AYAЃ@|$0+|$X(DA u %|$X0V|$p)@|$X61g|$@w:OE|$8|$P*O |$p |$Xv d|$@|$h| HVhfA_ n[|$p1AiAUpA#|$p/]L:ykAF|$0&y|$h+vA-#Q B4AT9x|$05)$$ "|$pC|$p5A?!qR$R|$p p@fD|$p3@|$p/vA |$h#,|$]Q9y{|$P5A&kfAQ'|$hXB1 Y>^$I(A&  w|$0IeA $z4AAs|$8 fB%K$i,AuD$ GvǨЃD|$0#0|$@-|$X.1lA_|$X#$B|$@^M;?SEAf <1A|$X|$0>.43L.w|$X4p|$8{ $]z$$v PFAG+/|$p*KAGXo|$XW@|$8/O cm|$@vS|$8.s|$X$sc |$PX @;w9`MM=|$p2CUW1CQ|$X$w>yr [~ |$X>$1A5 _ vkfDAN kA @q$|$8ƒ uKA7DM)|$X+ECAA/v?|$X8k t$ faz`$~ m1A \ B|$@K|$@ufHu\ |$X5$ |$hN|$@A fAP? Z*}fv@fA]|Ae 9l[|$hq|$p/v|$@,"A:B~$|$0R27Z|$hl-Am{Y/KZ|$p6Z|$X oAo|$p:'$* (6|$8xQ|$@ ?q.|$8&)AFAAffr$ UrAA$\9AO; u+`+qlkAS Q|$pv73)|$@T A |$X AF9Lv&c##LC|$hbUF|$0.0|$hdefAYء|$8 [f1? !& |$0K|$p|$X6rC|$Pf|$Nqq|$8 b|$@tfDD|$pw|$X-{q |# RIA:|$htE|$H~A V|$X7 GDfbpd1$|$@ |$hH^A2|$pB^A؉$.|$@fA^XAЃ(fDfP|$X2#*|$P$*|$0f * jv|$@|$X:|$  ;SXT$ j̸S$ #1|$@/AI|$0jX*|$X |hd|$0_dAԵf@DDvAWfD|$E|$87$_Aal'|$8^@/A? vA(TG!|$p$UB-|$0rW |$p?Y AfAP|$X6GzjDA]D|$p G ЃOA>E"`AZAG#|$X7<#_v|$0e$ +LfA^N$P LA6v|$HH>@|$0{9|$@ ^ A_sf|$0yhfA |$X%A1|$hPW|$F1A% OwK4|$pzj#T|$h*I9AD |$pNw |$@|$p Q |$h^$ |$8%fH\$|$X |$hR|$0e+Ѓ`|$h{c20|$@|$0t |$hq2E])E$Zg|$X5Og|$8 e#|$X/h|${h|$8Aw|$0fi_T|$hF@Ab)fAbAghfO$ 6 fAB|$X{"  |$8 |$p1l v fA]\RmD8 vAJ#O1 e |$0|$8 T|$X^Ad qD|$8V1|$@ D|$hd8|$p+FZA"ƒ|$@J>A|$8A|$@&@v AtA`A;f[;?$|$@K=A w $I; =;|$8 |$-| fLq4Y? Ѓ[|$ 7-<|$0&`A(|$ =N|$p %$ e|$p;-|$p<d_'|$0C31u|$0yh^fAG}|$@?|$XA0$J|$p3>Mv|$p#|$@"K1|$p,BSASf4|$Pj_ `z|$8oaP@|$p&`.|$0{A[|$X.|$XF@/AQ?G1zf|$@|$XA$v |$Xnd|$0K G ( A%tf^${C($~*NfA_|$88|$h|$8|$X8w$df|$P| J@fA^0|$8P 1A' |$p |$h|1|$ v|$Z$ fA_8A =|$p7}; i[$pGY6q4ԡE$fD|$0~1ACA A3 Ov\ |$X|$0'FtcPA<|$@*A&R /|$X%$At>|$p$>:$v|$h?| "fPB|$X0|$hhAO]$.]|$@Ѓ!P*A w fAI)A$DvlA9|$hjvtQn[fa/V@fO*)$SuRA|$0U'|$@*BAYx|$@|$@ |$8'A ƒ|$81t|$X+R"ZI j|$p|$p?|$8*BE7%|$hfTE A*|$p2P%;C|$@!|$X#AA2X21{A)VFKW$Eqt*f=|$p*DaYJAy!|$@TAAڃ$ \$ fD|$p/"|$x9|$p(H_i|$Pe ЃMq |$8sR|$@$71fAID^NBj$ ҎfATy;0MA@fAd|$X7A. vA]mc|$hfAI.1n:[$|$H|$0Kz:|$POAPCO vfB|$0vA=6|$X1/sA Ѓz|$h||$p UI Q|$P^O7K!&A W|$@ #GЃkA9fLs~v-|$XD  fd}5|$8b_A|$h7I|$8 *y+|$0D A*AAwA|$p|$J+|$0sMA ^h A D|$0;v=|ZG|$@0T|$/mA^z&;|$0`|$h_OA ϿDA9 駿|$XF|$89)AWK$K|$@|$X.|$p $;f|$07AHU|$X#Ak!|$X(%DAHǾ|$0O|$8b{y w|$h}鏾$7<A% ^D q|$@6R[wW|$hq@W1D DAƒ|$8$vAݽӽ.j+麽A WK|$p3iWxzAF:Ax?7r! M|$0G3|$0B#i|$@ |$X+fD1}骼C AoN|$@ 1|$@ D@v1|$PW|$p9p|$XC9$S|$H|$hfD|$p"|$h *.Aq]|$X>лfIATf|$X;f 鞻8 |$X&A|$X$voe$[|$8%:|$X5bX A!VB*9ٺA Ǻ|$X5A 飺AGAtlbO|$p$V |$X6+f]ߨAv|$8 f.fA fEBfAHOιaD|$X-SA G |$@錹fMhr 0fA_tC9;|$@W( *|$0-!A|$@ո|$0B#}# Nw$6=w闸1C鄸 qP fA\A|$OvE;8(A 1 |$82G|$@ XA"ARMCA pQЃŷ v饷H"鉷yv si|$XY|$8G|$@TmC O|$H5  f.|$@0w|$01۶ѶfM!|$X@Bvf<零鑶 LfYuLAC _AuB|$80wAkF|$Xc|$hIKvC|$88ǵDAc鮵餵AS1|$@oAE@+" KA0v A.4*W AbJfcb|$p|$h))p )A)麴A J|$8aL|$pVL}AAgET|$XgfAEkHЃ,|$XD|$V,"fA]1g8z|$@ } |$p%سfDA4 鲳$ :k|$p-|$P׸rfMc$SfbYC0 A% ֲ|$8{$qX|$8 ܑ|$X?Ǒ_陲AA遲R|$X.M;;U|$0,|$hp}$o7|$P:$|$PXYA$6A,|$P^<fAaDA E%vAɱ鿱|$8%1A韱a|$@ 鄱|$@m;|$8b;d|$a7)e|$X ط|$8 Ѓ5fA[==|$8|$X)v|$P fAb:AA@ 齰|$8J韰J8郰|$8!f2o e|$p0'|$XER<*#P$Av0v$ |$d#p AK$A|$@ A麯|$@.fA^ew1fV醯FjE7:dZ\D"z|$8C|$XyC"|$haX0|$@iMOA=1A|$8 fSAr鎮|$h4. Ijg|$hZ7#|$X!Yyf@O/fA[ !|$>S1|$PA|$h_zA0ܭɭ *ct:|$@ 陭Ac ,|$@ QABn9nv|$h^VLAHB|$pB|$hWVd[9|$X9 9A=|$0q=|$0qt|$p٬Ϭ|$&齬|$p4*|$0bAz$fQƒ|$X5tAg]  bR'/|$@,KfA`uA|$h$1$rF|$HG|$@Ѓ̫AQ鬫AYADA釫ZtA $|J|$Por> ,$B  G&??ڪ]|$0Ig4fXF|$p'q|$@ƒ|$8uA~|$he$fdsAVG|$X/=rA'rAL-A4)xxRAnR9A!PY$F  d Ѓ鬩UqI|$@]x|$X#z|$p.v bXAo[%=zA.dTAE|$0WnR|$0hdACa=hAI>Ѓ魨 隨1fa酨$3"|$h@˔AЃV|$p"2RAN9m1|$0`'&$T B|$gt|$h}Lt|$@X' v|$X"鶧fA\bA^|$@.%${}"|$hr"[AG|$8%a|$84AH n(#|$8%E|$p/x|$X5w.U<+ 6<$ Ѓ鴦A#E@|$8 ]k$ k|$8|$@e T|$HT;|$p-<|$hz|$@#A |$8A n A#H|$p+H$u|$Hu陥Ap酥|$8msAA t %"kIA\$9|$018|$8,s<r|$X2$ЃuAeAˤ|$0&'|$X NN1fAj韤2|$@酤%Y9|$X#>91fZ\f?|$@B4A&s|$pj|Yj( أa鹣K)f^fA]JUU酣A!x'fh Bg3Abq b6t Y\ ?|$p6? :OR,|$@[ʢ$ 鲢A(oPAA遢A1|$p31Am ;|$x;GA3A1+=A=  |$@|$PnJޅ$fM8|$0e88|$@+"頡 a`~xfA_|$hV|$@|$8 |$0R$AfE$'U Ak|$@#3x\VA! Ap?Ov|$H馠|$@((z(M|$@MtA2`^!vG>4|$@WXv&5$|$X֟A 6|$@5$5食fA[$zJ$/h|$@Z|$huv&' ^A5$-A31|$P@D@!ASKȔ ՞|$|$87|$hA |$HO鍞|$8E}rAY9%Al ?|$hkt|$X;(|$@,f\,|$h|$0fCaN ֝rAO|$X$mA$…~Aqn O )A ET TEt^|$p3^fa|$p^A*|$p"/|$8$ =1?E霜$8 鄜fZ>W.AJ.[|$2G|$@ |$8e|$00,ٶ=|$0I* |$X7$; lAkΛh黛_l PM9 |$p|$hqƒ|$@u |$hyi|$p5k|$SS[%t pM|$8GЃ֚wÚP+|$X+颚"1酚^n"|$@HK|${w|$8QGfX%|$@ EW+$|$@Fq>q|$@ЃfSSfAYSdS|$8IM|$hv>M頙|$h}#&sD<$zv<h^|$@*u*6tT-t+ƒ|$p tfAS$ ʘ|$06E!j鬘陘N4}SbBA ]S|$P %A4 ['A `|$@_c cA3 c|$X;5|$ ƒ|$p0t鰗N頗|$8H|$X%/BYA]4|$8b|$POK$ "soj|$&A|$X%Yb+^|$p^龖|$8[#vA鏖fAa$|$@g;StZUfbuR{15v|$p%|$8m|$89$ƕA!|$8餕Sa鎕 /|$8)|$0x4b|$8aa|$X8F|$@4+|$X A#)|$HAAAA$jєǔ|$X4鵔颔阔鎔f/&t|$p$<D|$hpŊA_EV5+A ~'|$X. A|$8w|$X*|$p(Y|$hc|$8!1AD馓Ay|醓||$8 j|$hN)|$p+A7  +h|$03)$A[E"|$8xؒAFĒfV"fAUbt|$@青|$@> l\ I *L|$H sE$< TAf8Kxȑ鵑Uv$鐑1f`{$ I|$hkaR|OJfbƒ|$8A  |$p,AAk$c vܐҐA5_ 鵐RlFJpR|$|$@A4 v|$@I|$h3rLO&$6v|$hl$Vd|$pAKdA4d(dďAR$` 颏|$ I|$hhS- 9|$@k1:g_ FA2Ad0|$@'A"0Ѓm2j|$p&X黎鱎|$@p?V d?鐎|$@~|$X9{41fXb|$XJP/|$0sf|$h_A|$X5 A3|$p+%Ѓ|$X'4A-|$8$=|$h^=%WAAl|$X+/7A`AOb133|$0$4|$\1A8,]|$8v=j =Œ22飌|$@R{A!={4A3[fA^0|$80g|$8b|$h/v$|$hc`|$X+|$XZAfAgzA齋|$h:,fOO5镋6|$vKtj|$0K, LA{|$H>|$p;%/3W 5#fE"{|$h̊AP*QhQHfJAž遊$uV12y$ =|$p.4"$ ƒ|$PuAf\$AUAU,$P d|$@ ƒ|$Oa`yf%|$X2\Eb\4|$p=w\,"fNFA|$p!DAqz|$0KoшfNa AZ鳈A1|$@ 锈|$h$$kvh^:fA]ym 71|$P!0AfSH$A Z L vfJʇA_#O 頇|$k)]B]|$8_|$0)p W|$0F5A_|$X#`{8L;|$h{|$h|u 4xA|$h`sV|$8UVf[tW铆|$h~;;r|$huD|$X>|$hB|$p |$X$|$8)|$@ЃN|$0zN|$p"NA|#UbApv|$X)鰅|$X6#A\|$|醅0'A/i6* M =|$h1foo|$X(|$p5 |$X6Ag|$8 ݄|$x11A D@齄ww6 顄<|$0JLiAArl6A (p|$8fA^L |$0L f8?kAA1܃|$@ "ZЃ鶃|$X@Nu|$X3=|$@T 邃|$8RA|$0MIm*mAvNF<)|$X8Ml ZOЂ|$h:&|$8 nX|$X3H|$@ 锂$$h =A=`|$h\)9|$7|$X7;|$pq'4fIAx|$0rnPl"P$QwAiÁ鹁% wW$GfW̴fL´v 0$s{0RAލ|$h wA/%|$pf@, |$0}j)|$p'ڀ6cI龀L |$8飀)|$X)~m; |+=fA\@lfBPlY H|$/:?$ i|$P ?.fT$H A|$X> JAM$cjNfP~A|$X49h1|$0"D@Z:J|$83,|$X/|$p5|$X2ƒ|$h$=~$9|$P mA1fE~A~.~|$h*f`Kv~l~l@*|$Pe|$p0ad$#~|$@Ѓ~j;|$X4%d/iA}$ -|$hpF|$Ar$y2}:fA^Á|$h@h|$8|$p1|$@}7}|$h< 1`|$|$@|$0l*|$p3K|$|;=G`|$XL`"fAh||$p*}|*v8t|\8|$8`{T{J|fJn:|$0?l8l |$8:AIA|m%|$hU{hfahaAlv|$@{{&A&{, +|$0qAqAL'|$X1KЃE{E"6}ic$ {|$p,T^KzWzA Cz7zz:5@z|$h1by|$@x5bzA.Nz$| %9 A z|$P4|$p+k|$@y $f\#}|$?yA.A7yR#|$@yy|$pPe|$@my lA lMyw#Av?-y#y 0|$cfAU|$X2A6vxA;|$@x|$0oR8jI8xAkg Kg sx; LKL ЃLxƒQ%|$hG%|$@xx|$p%J|$0qUA*QA~w|$XwA38w0||$XAu |$X$!zwfAY%|$PCA A v|$p15w+w!wAJfwv ЃvvvAPV|$HV|$hK|$0K|$X&ƒ|$@u fADlv \v|$p[>v3~&|$pl|$p{ vvfb&!AOJ Jƒ|$Pt |$X)mu|$ZIu|$8(,#Aou:QXPu|$ s,A#Y|$h<|$@Aztw-Aj-t|$P#7|$p:7 t v|$X&ttfA^$($&d$ƒ|$8t AUJt tA t*t|$@tM3sssfZ:|$8:sAtt|$UƁ|$@vAssxsAt tZtXsKEsAB1s|$p1$   r$ |$h!J|$ Y r[ Ae r|$h! vjorer$+>rWW}r |$p4AvD|$hskDq /Aqq$ |$@qv|$h_uqkqf; ЃOqfA@ S|$X5JP\ (q|$8#qq$D<4<AlpAop|$X=|$X#OppsC|$0eCvpFKC`pYMp|$@I|$8HR'pfbQ|$H G|$@ vAoooo|$8 I|$p(H|$X3AbooA0 ~|$hsto|$X(do|$8v„t ABo8o$^ffc0|$8pv|$hUnnnnnn|$HzAnnn|$@OA GY v|$p=_nUnH|$@G/n%nnn|$p O|$8@v$mmm?sJA|$8AvfAcmmAdЃem[mQmApf8p|$@(m|$8nfA_s lVybObA`qAOAE|$@HЃlvA+l|lrl|$8vA\lRlHl|$8hfP6$6lllkf\x7sl7kk|$p k7|$@`7kkU kfAX1?; ЃykfA]97A:$P N=k3ks#kkA  jjj[ =eId;|$p" jjfAXrAJ|$h-cjYjFj|$X#4j-j|$HjJv|$PjiDviiiiiiii$,s|$X,!s| mici|$0/mev|$hg@i6i,i1-|$h$ }|$ jfAb>Av4hh|$8#5Ah|$@ 5A}|$Pq};hphfh 5A 5Fh|$1h'h|$8XhA -t|$h||$0`|}|$@|gg 1$a0|$8z|$@ z$ vg|$p!ƒ|$8d-A%W- v|$hj9g/g|$h0|$P}gHf|$hv1 vAffffAQ0Ba0|$@I||$ffuoffA],|$PZ |$P8f.f$fA>.-rfeeeeeeee91GADO1%ae`1@Aw8e.eAuv$eedddd v|$X"ddf8,$R,|$8| ||$h|Hnd[dQd|$h@Ѓ@d6d|$@8|$p%|$8d|$1cA@kAkccc cApcc|$@5|$85|$p/=Pciv|$X68c.c$c|$@ z|$%g+|$hQwcvabb|$p6(P(fAa z|$8y\|$hzvbb|$@79Q|$@%Jo|$ u|$h;v|$X5b+b!bbfA`H:|$ |$h|AZ|$@a>|$0UAԔa$'|$@l|$p8'A J|$8?`aVaLafA^6|$h6|$8D|$va afAW8S`$;` `2A,>`|$p4:Ax:e`[`fQXAqbVЃ0`&`|$8L/9/u-/_|$hD0w;|$hC|$@_ '|$@ktA_|$8#j(is_i_U/|$hgD|$X"9@_6_AI<$<fRfAM:^&|$@rs^fAbO^( ,fAd,q^%v&^^T^[8|$0+^|$@644 ^|$p6I7|$hЬ1|$P]]]|$8 ]]|$p,5|$h`k5A*ǡ|$8f\A֠ʠC]fT<8&]\:|$@]|$h?2TЃ\Ak;A\; \|$ 8|$XAX5\|$08.$G.fUQfA[v|$@ 5\+\!\*|$8|$PN[H>A|$;|$X9;[|$p8e2|$X8Ki[|$@[|$@A)Ѓd[Q[G[$q8&[A[|$hY}|$)AjՎ~Z ZZA ZA; ZZ|$X99|$@ w(|$PkA,ЃMZw7eYYkA.ZZYAY6|$hB6|$8 3YP 4|$8A߬A ¬@ ~Y|$0dЃ^Y$5|$8Ѓ9YHh;f]j|$p$ |$X@ YXA7AX|$@.AXfL+;A X|$83AElXbXfAP|$@M 9X|$@ fAaQ|$88Q|$8 fLtWWYfZFYWWWWA ;*:YW|$p.TAT/*|$8 WLW#DVO|$X.VO] x V|$0PVV|$XV|$X4BOgV|$h\[A?[EV 2 xAxVVV,^fOAdU$<?|$%>gURV vAUUDAyeU[UA]|$8lmUU%D|$XCCvfATTTT wATTAT|$p\D@CDAuTfAXr;P=;wڮAmA TA 2^AeA HHS]fT]S?|$h/wH|$8wSSH\5\kSaSWS|$@`>|$X;:SAI|$p|$PptppR#EA~|$X)sR|$p RRR*vvRA`S|$h5S b&BR|$pDv$gRRRAQ) QQ6@ QQ$`L$LQiE|$hdQ|$X.P$ IGO$|)QQ|$X95l|$p, l PP$*|$X3vEPP|$p"bKfAHMKrPAL|$hK|$X8|$01kIvfAWJJJUE|$XF|$@|$8 tAc7fGOJ}J$  |$@ eAkAMk@JA#5=fAY_;|$@sfLFAv|$8 II$\;$AfLhI$T$N$I|$hEީ|$p6E|$|$@|$h'k_,IMII|$p4-A qI|$h1y v9HH8UW|$X/HALAvL|$@ H$V1|$@D@aHƒ|$p6t ;H1H|$X5|$P# |$p(G$,|$`|$@AЃGGG> yGoG `|$p7K|$P%@$ zh|$huv|$X<(GG|$p- |$@G|$X fV=]fSggAF$P8aFA WF|$h 3 f \w\|$8#\fA_\|$@d|$X<d4F*F FF|$p7Q}E6APEAk^ E|$0g0/fA`E|$p.V7|$XG;7gETEJE@E6E,E|$8EЃE$D|$pDDKnP|$8|$X1L1AD@DDD|$8=*ЃDvD=\2$ UDC_|$X)_" 1D|$X3H-A-ADfNOC|$h'A&CCyY'ƒ|$@+|$0x C|$htd@A?S |$p,OCECA{B$4B|$@( |$8 C|$p)|$0]Q)|$hx|$0Q^$EgB|$X FA*fA6OsBOLBBB|$8>|$@%BfWI|$p7|$@]QTA=vrAA|$8.BI|$8 D;AAƒ|$X:JyJ/dAZA|$p(RG.|$@>AEjW|$87W|$X'tY>FK[J[AZAZZK2Zk> AQ8`$_|$hЃ3> w:|$8X|$hxXA vA==A{X|$X6PX=Ad===|$p"=F=|$0Gd^AC^|$X/U=K=|$06h-=|$===|$p*[A<,PЃ28|$X7|$@8 88fAYLE7A7fZdO|$@OO7A Aw|$X87}7s7i7_7U7AZw[JK|$8T?K+7fAaQJ|$p s3Ѓ/////Ah//////w/m/|$8\|Xv$ G/=/Au|$8]r`AAЃ/.|$0N(X1fAY.A|$p4\fS.>XA".4bbk.AafNx|$PAC;.|$0?|$h5.]}fA]}}----6Gr-w:[r;rsrЃ|-r-fAatZsDs|$8*'s|$p$xr|$@crZr--|$p2wkq,|$p=r,|$0VwY?gfT|tA2t,lt|$8s|$0ay,|$8AZ,P,F,|$8Cg|$pf|$04f$vA ,+++++++++++$WAm^+T+J+|$80Ij@j,+Dv |$p&}A}}Ag}&**AV****|$XQƒ|$p3kVAr^Vq* SuL*|$hw$$0*&*]$]$U]L)AM|$@O)|$0api|$@Hipi|$8  g))fD} 1}|$h &}}|$p0}G)=)|$0Lw|$p"pww)|$X:kA Ѓ((((((A{|$X8{{{(~(! AЃb(X(fAWYYv$&((fAahl|$P4k|$p )k|$8ƒ3IrATA@pp`'M'C'Aa4vs)'|$pfAcz Q[|$@F[&&fAZu" u&&&|$hA&AO|$@~OEkO f&\&R&H&>&4&*& &ALw|$@&%%|$8?<%dA {dAd %%y|$P,xfA`x|$@xЃV%A'wdf<(mCm*%|$X3l$uЃ%$1f_$|$XGs|$@r0O$|$8Bw+l|$@l$$pr$h$^$A&lA2l4l|$@l|$@!$|$0wG|$p$cttAtjnt##WWA###}#s#|$@rrD$X4 E# 2#|$X2|$P|$  #"$A'r1""fbW<"x"|$p+OZOfJ O|$pNAN|$@NAN6"1"1|$8"M$L|$h`[L$!f@ym|$PWm|$p.m/!|$X=u|$H}!s!R jAjE!|$@ *UC-!%Is!AC|$PC   1fS |$P}Ov   A3LD$X=w8z p ] |$@ T? fA\shs!  |$p* UT1f`D@fA`r|$X0vfSsn|PB|$hfBfUBK$fpK$$_T|$hTT|$@ jr$\rfAWgG|$X>MG|$PyGAeG$ww|$X3j`M|$@ ;1|$8h\g|$@ gfYg$ kA7fA_,hMh|$Ph|$Hq)v|$8wOD q|$@TfAZq|$8;q|$Pq AAw  $ ЃL|$8^sMc$ f(Au1z1'AvkfA_|A{{|$8m|$8 |$X?{|$p6{$xmc|$X"vKA7 z$  f6-|$@t|$@v|$p7 s|$@ r$ wA}si_U|$@CfA[irfFUr .ru|$f|$8Df:>ft|$httA#|$8:Aƒ|$0at=kav/xvAav!|$@ {s|$8 ZsAwCofA\܂ĀfFAA3s1fSA0$vi_|$@fbV Ah]_ $7 u|$h uyu[uEu$7u|$hd+fSA-A܂|$0_|$h.$-k vbI?fc|$ho fU nA u`K|$X2]|$8Of 1fv |$h~SIA|Ѓ6#$wNOʞA$N|$O8~5 "~A ~|$fE՞Aqg]ALbLB0$af^:fQ|$HAAl|$hfJxu$n{l|$h@N$ 3|$hw|$@9/%|$@wvAwm |$0A$Q$fTtQn|$@w6|$pU$t|$hO;1ɅAfUтȂ|$P A$ .|$0.#fbqAd|$py|$P?|$P D:A}vMA wG$T |$p"2|$pAPfŁ,A#pAi\a KZPF<2|$@vfX@q|$p/f|$@AvfDWA/z|$X<\zC3Fj $fA\*|$8w|$8 v|$@$<fA`|$pی|$X"}sfAK?|$8>h?|$@-|$@v|$X3v|$POfAL|$@ Ē|$X9A  u. ifVg]SA$?/A>fA[O 18Ab f-:   |$  O  |$p^&=|$h T J @ |$8mo% D$hgw    B'{|$8z  zz|$@z$ |$X4wAks i $K Q A Aƒ|$8uAu |$8A fAau_uA'su Az|$8 dzXz |$@Aut| |$8I|$p4|$h^H > xD%  MAu   $BA@||$p5   ]\x|$8/} $Ր,ghAE2: y'  |$8a͖ Ė A fA\E |$hYh A$  |$@  1 A ^U|$p|$X.ƒ|$pt |$hw5F #w A+$ AAv0AAt)|$h$v|$X2ov|$X=Qv:1v|$X4&vPЃz~g]S|$8uj>6|$X-!|$h~w<|$htLm|$hrmEl|$0>!84fë|$8l|$p6lA{$< ;|$h0vfA[d >4 !|$@u 7PAiw|$hbAf]ۅ|$p6>}~|$:.]SI|$hTwN |$X+|$@^ ƒ|$8u A8A jf\jRSk$|$0NA&v$ |$@ VLB8.$|$Hƒ|$@fgiAi |$A |$h wMsiA)XI|$0B |$P|$h وAy C (A|$p |$@kAkfAY d0fcusfAaot|$8sAsfWs$vszjsAa$ڑAЃZc cAc|$@|$8a aA Za h^|$8#LBfEer1%d~|$p3}9Q~}|$P}Av|$h{$|$p;mf>uAO c |$X/3}  fAa4|$8)$ҍ|$8ǍAA\Sw[uka W|$0W=3)Am|$h mew(|$8mm|$h d|$8 cdcGc9A M|i_UKAO,|$@vfA |$@ wAA|$X)$T}|$}~Xh~$%~|$X'}A!~Ѓ>wF|$h|fQ|{|$8|A|A{|$X/{[}}|$p  ,gs g |$p!w&9zX_UEc|$Pc|$@E* AI|$81|$X-sC|$8VfA`:AZyo|$p(a@a HA4!b|$8wEA.|$X/wx|$Pc|$ Á|$hxAefa!|$p d[9Skc|$P:AwfHP|$@|$0;EA3 zpf\Tw"&v|$%?5 ` wQA |$@N`|$89`AZa kY|$8D 1$n||$p YOE;A'$A|$HM^.^$E` |$@S|^nA>nAnUwB|$h,_O-A_|$@_ F 0AG[AK :[fb9ACSYfAZ-YfIc||$0OvAndfVJ|$X7um|$8jm:znfLm|$Hm|$p6mAfAZ4:}A|$8$$ A AAwrh^|$hӂ|$@A4|$0ZwwA|g|$@q5N|$8)AAUAiAw6f`I36f^~$4*gXA+ A9XFY X|$X*X |A kAN1 ;A9y|$p%$y{A w3|$`j|$0c|$X7#V$ U|$@V$D wdtj`XIXA|$b|$0j7je!jj|$0[I|$HI:fA]wAJX mwsOI)ЃxAiXA*vH I$6vA'!|$8wAzv#w~tj|$h^wnwGCw8w0;z(wBw3|$pARwXw-EA>v|$heD3x|$pB,N|$pw34Av@~2|$8 wM}'|$X5wK|$pw+w@u|$o|$p wQw0Ayv?5+fAaBA|$hiwFfAb.ƒAtJA|$hj|$p/AvGKw85wwvr|$h5wJA\RSw\Af\u=&w5&bwA4@oЃ$E w|$P~|$@w#|$8w+ Ѓi_UKAv+|$p6*fLZ|$0Tv{fWk|$X5{q=w'VLBЃ0w;Jw@w.AA 2 |$p#R|$@f_`v4bf`5|$ wA8A7&'|$@v"vfAbM|$@w@|$8w/|$81|$@DvlwNAw6?w$f\I?5+|$p4f]5|$p(v$AE='B|$X/w'rh^,vAD:|$X3v/vfZavOU6 A ƒ|$@]QvfAbg]fAb|$h;wTAwAf\< AOuAw |$8i|$X3wy|$08w>|$X0f_ ЃuAcw#f^~t|$hKЃcY|$p+v$QB8.$A|$X4w0f^O}AwA vfLbXA D:"v6Aw&`w v# TwhevVwptz$tI|]SIw'1fA\D1'A  wc|$8w:$ DwW*|$X9v||$@ vkA|$X4w5#wuk[Aw&|$0;@6,|$XBc$w2|$X'w!Avƒ|$X7ta|rh^TA(@6,fN*Atqo |$0>|$p7 EZ|$h_8Ed Ayw|wjv3|$@p|$pw8|$8t OEAx1A |$hak|$h/w:$Ov#fR$|$8||$XxnAZ/v/Avw:0&fA` |$PfWE|$X0v4wU?wC|$@v<>|$8t|AwNwFwKfAb~:$uw-|$X w/wWMC9/l|$05|$p|$@$w7|$X1wAЃvfAb9ukaYЃOЃ@6,"wAnAw }1n|$@w8r|$0Owz~^|$P}MM|$pv)|$P|"|$8u' $nwH|$8;w7|$@w&w|$P|2|$p"|$X+w-AowHaWMw:`w*$ƒFtwd|$X*vmfbW$9Av" v|$pG|$p4w?fA\~.|$@ wbXNDw,/Ѓ|$@ v|$X9}$vi`VfA`$zxAn,6w'$vfA]|$X@>|$p w1|$X8wb|$08w4fA[~|$8|$8vg|$@ wOAv?]|$8ƒ|$p.u<;1'A |$X1w9v'Asw;Awv|$X; ww7v[fO.>w8v|$RH>|$0=ƒ|$8tAw |$p|$p$fwGA"|$X.vow _wWMЃ;1Fw%AnЃyAvP|$PI˺|$hvq|$htO|$@ w4w"$錺邺xA dAv4@w,I|$X2v1'|$86 |$X5wh=wBw0$w ǹ齹鳹|$8 钹fAatR$OvEw iv[`VfX+mw0Ѓ9/%w$lvAAFw%|$@ Ѹ龸Akwz韸镸w@Av:}A v vaWMCA/% w|$@$xwF|$@ηAD鸷鮷餷隷鐷醷|w.A`|$h9w;F|$Xv5|$07w$|$@v t5|$@ w$Vڶжƶ鼶_A韶|$X*d2@$i|$p$WGw&1'Aw,fW~-6|$X0w۵ѵ|$P|$o|霵钵AcwOw8Aw h^|$@L|$8:6iGKA]XЃ $ w9A wUf^4IôywA_颴w5u釴w|$8oe[||$8D:Z'Ae ׳|$0?w~|$h{wm$w/w AtD$8闳鍳8w"Pv|$hrpf\RHAAR0uBAwu|$X+uZAwQ9ݲHEȲ龲f`Aw驲韲镲:w@}sM`Avw12D|$hbw0AhwA&|$X4 At Aw ٱ|$X9DZ 鷱|$X2wC|$0Gw2閱|$pwJv8wmovfZYOE|$8wk|$hvZ|$0]vI|$@ wBAhzݰӰ|$h鵰|$X:飰陰醰asi_|$pwR$@Eu~hvl Aw>|$8YЃ|$@ ƒtٯ|$XCǯ齯鳯驯Av}Avwjw,f|$8mcfM~twbwH|$X/v7|$p/v&w-#|$0W߮A6v0Ʈ$w驮韮fAX~n{wGAA v|$@i_L|$0cv/v*  fX&̭߭­鸭鮭AЃ鞭锭銭/wG$j$u;v3nE;|$@ tw%!̬֬ 鹬鯬饬 钬鈬~tj`VLB8 Ѓ&gvAHw;7|$p# NAvfw^魫AЃ靫铫 |$hw]Rw9Av&|$@cYOEfA__AvOwG&|$X5v"v|$hߪժ˪AJt|$@ 騪$ wk|$0vtswoAvz$wO|$XݢӢɢv驢韢镢e@|$@ |$hwHAUw5HZ8|$p5&fA\a|$0Gw_vMf$} ΡAw\|$8vK|$8?鬡颡Aiw\醡sifAX7Aw.O|$h =|$XD+!|$hw8|$@ wA ؠΠ|$h9wq|$H}Q$騠E阠鎠鄠Oo|$@w"|$06VLFA= 2(ZvfA_|$p6w1|$@D؟Ο|$p8v*w%鸟A駟靟铟鉟vG|$H}6j`fX'G=3) v8|$8ݞӞAw& 鷞魞|$P"||$H鉞uka|$X1w4A3FfH1|$@&|$@w^|$0Sw.ƒ|$0KtARArS鱝|$hZwCA鋝|$0`ws=wDv2g6v|$X4OE;AwIw-wfA`uA|$.ל͜Üi鳜|$8v&w障鐜醜|0v|$p!g]D$pPHAv2APt |$@ ݛAVɛAw.A鯛,w3|$@ 镛$w6v'wtO_UKA7-|$@wV"  A w|$X7ښК4 齚鳚驚閚錚邚xnd vAJ@6fUa |$8v@|$@w/fI~|$@t4ٙϙ|$0?w|$p鮙餙隙鐙|$hwe*Ѓzpf\RAwB|$@t;8.$fJ~ vט͘Ø{wQ騘鞘锘銘AЃwmcYO<2(|$0Qw?|$0Hw.|$@vؗŗ黗|$p;|$@wv|$8w?鏗酗|$X8w9 v'u cA OE|$p/3|$h6w鼖鲖騖$铖鉖ukaAMC9|$@'A |$wHA |$@ (|$8wnHw4|$hv-鳕w/AvЃ鐕醕||$@1^T|$@wHKw1fA[D@5+`ƒ|$Ht|$p7w-ޔf]fW~hvVAwM頔閔|$p#wPewH}|$hwKv91fV]SI?5+u|$8 Ѓ|$@v:v˓鷓魓|$X6f\$z|$8wbXAwNw5|$pv$fAb)A|$X1v[awTLvEAew<ǒ齒A:驒韒镒鋒遒wmZPF3|$0HwA|$X4vs ؑΑR黑鱑|$@w}闑鍑A |$@wvAAWXND:|$hav&|$08ƒ|$pt&wP |$!w2ܐGw$ ǐ齐鳐驐韐镐Gv0}wA qg]SK@6,"ݏӏɏ鿏鵏髏1D酏AЃrA6w\|$@w vPLB|$$MAЃ |$8wJMtA4|$h@wL@Ǝ鼎|$hAwj|$X7wHfAb.|$hv鍎郎yf|$p"v1AHKAvA.$uf`}A)A܍v3$v|$@鵍髍額闍L鄍yQz6V\|$8wwC9/%w#Auw{!wH|$XvAAqw.$W APtw駌靌铌鉌APA/gAvMC9|$8'Ѓf^t"$ϋŋ鲋}0Av鑋釋}si_UKA7- AwYvG w% wՊ3 Š鸊鮊m雊鑊释A w ndZP|$8xwX};1$|$p*w|$04wډЉƉ|$p'v4fN$vA镉鋉遉wg]SIA5+!u f]8jv؃w|$X1҈Ȉ|$8鶈鬈颈阈|$8t*~?wwg]SI?5+! w&5/؇·(黇|$09Awuwc?v^鐇|$8/v9av'{ndZPF<2(|$p2w8|)n'1|$PD߆̆†鸆|$8w|$X0闆w#;w逆vlbXƒ|$hkub|$ptM$D$8Pø,rw0Aiw>ׅͅÅ鹅鯅|$@靅铅鉅Cv-taWMC9/%wP|$ w7w%|$p v߄Մ|$X%Ä鹄A w|$pv韄镄鋄遄wmA=YO$ E+!AwIv77fA[~x$vP܃҃sw?Av6鷃Gw;o韃镃鋃遃w|$8wi`VJC9/%|$hv$|vACȂ龂鴂|$8 w钂|$@ 适vl7|$8;B8.$|$p,wY$v9A=wA|$@ Ё}A 麁鰁|$p'wOAvJ隁鐁醁Av:||m|AY|O|E|;|1|'|||w2|$@{ wHw6AC w-{|$p3wCA`w0 {{{{{{{|$X:v?a{|$X=O{|$8Iv5{+{!{$ {zzzzzzzzzz|$p0w"v|$}zszE`zVzCz9z|$0Hw!|$@v|$8zz|$hKyOy|$pyAЃy? :|$pyyyyyyoyey|$p9wK|$0Tw"Iv|$H?y5yfAXGA Ayf>C|$@#xxxxx"v v xxxxxCw9lxAw1$rvFxvA `vv|$hv|$hLw1|$@ ! uAuuAu v|$p'uuuu|$X$w)lu|$@ZuPufYZ|$p&w9A2u(uuu u|$@ w:t|$vX|$p-w6|$p'v%wtttZwtt}tfA`~$`tVtAwVAwC-v;2t(t|$p'wQ|$h7v@Hw(Atssssss wHƒ|$8t,f[&s ЃsvslsfY. OsEs;s1s'sss s|$hHrrfa3rrDw vDrr|$X(rr|$@wrmrcr$ uw6r,r"rrrr|$X4vAqqqCw>w/ q|$@ qqqq|$PL|$X=v;(w3dq|$X2AA;q1q'qAwЃ qqppp|$0WF|$|$0UHfA`fS*w|$X1wH|$Cw7Ov%^p|$@LpBp8pA|$h AwZA2vG|$p4w,&o'w|$0RЃooooAy|$XEdAPA|$8oA |$8.AwrwL|$@w+w#Fo|$0JwЃ-o#oo|$Lw!$wnnn#IwnAnnAuQ|$@t7|$@v&|$0Iw|$p6wnunknXnNnDn:n|$Hn|$@Lmf*cm|$X<|$8A|$m1m|$8#wNAw-w|$0nw^mTmJmf?ZiЃ2m$|$]|$p@Rv@TlfME|$X;w4$wllll|$p4*Ѓ|lrlAvt}+TlAw]OЃi4i*i ii$w=|$@w,|$8Vv|$@whhhhv|$PhhfM(Yw vhh|h ih_h5Lh0wf]|$0 61|$@ f0 ?|$X 6%vYOf.D$A/ A:|$@ 2 |$hkz$k%A1_BAhI1|$X;BD |$h~Yu3PA >Aw q|$X q|$ha $s$|$8:Hfa @ | A`3 w|$X(~tf_8OP|$H" vV,"D|$0q] nZ|$8E:|$h5`|$@f\|$@fD1'@|$8 )}vA_U|$X|$8|$hm/|$0_C $V g"%1|$PD|$p-x|$X* |$0u,v[fW`} v$@f\W|$XE/|$0Y\V~|$hZ|$B2NA)|$p0X|$8 a_ A|$0I+fY.AW|$h5i|$p5uiA AfA_,|$>?L|$XAQA; v E* |$p2E S6|$0AD|$8`l|$X$ڭ @2D|$0I |$P{.8AK|$h|$@ gf 7 |$!|$X1:^qBA,A|$8&Z$f] wlA$TC{0|$0E|$X 4|$0:sMA_$wa|$XVfD $OAR51|$8m|$0`]fAbOFfA^*|$p.~|$p#1fQ AfACox|$XAnAu|$0hlA]CLA w |$p$8.f|$0` /6|$xXAFTvAf.fY|$f B$|$p:|$h=|$X+b/)@|$~0)|$P 7|$0^W|$ ARNt|$@AFi|$XDhY:tA~`||$Pu%\<] |$XAD|$hzlD$ /|$0[N@ O{A_ Ѓ,|$8|$pqA2v OEMWU#2p`)- |$P +|$8S8y8UKAA3|r*:kwf|$8# > ^fAJ:$ A= N F)` @]+$<v|$X,A+T$@EW|$pA:lA[W J|$0ƒ|$8KfA?fA:|$8:A |$8|$X-> A'$;~+g|$~A\u AZPAw6,R Q<|$o|$8-t|$p(q|$XPkfD|$hY$y EA DA9zV |$X,4|$07xVA QA=)1A6|$Pw $|$h 9Ec|$@|$p9gv$D|$8(|$@Ѓf.A(s|$pw |$h{aWI5+|$8 w * B |$H.|$P|$Pt$ |$h~!2M0|$hLg|$0GA%3fA1=UvfAOu=|$@siAhA@Ub(|$hX)|$8 |$hSwDf`K#|$X8|$pf^5AwSAC |$p1"|$WJAMJfAC%|$0vA x|$8C|$h>ll\R|$h~zFnF7v|$P|$(m&$y$F$tfAb|$Htf^(3fA0Am|$hZfAN(fHMIA{ +Q-*7Ia|$hfyA1!@|$@|$X0 |$p3G.Nf]xAvv|$@xnf|$|$p*A ;*fAHc%Aw |$0f|$h>AhjS|$XB|$h|$hPWA+AUw$|$0TPI9I|$P A|$PwAfAPYAof.1 f^.  fAbKfOOA|$h2}ym|$p%|$X4.|$hPz|$HIf Ѓ/f.|$Xe"|$ha|$hgF |$p0PO$yAiufDA, |$0j&|$hq\I$p~e|$@A9AOf.|$X $$.|$pNi$i|$0|$8]!v3A[ff.fa*|$X7UAgf$G |$hWD|$X:? v|$hW!  w |$H fAY |$X=AtB|$8DhA|$hq~lf\fA@Y*|$X1@_$z|$8Ӻ$`A_ 3 8 llL  f\3|$p+OAt|$X0*A} ||$XBc|$h(|$p+>*|$0?L\fAYLA|$@   |$hU|$p?+AR>o=M>A$A|$@tvfA[h^b v$v7-|$p $m A?B$ (yA=y$tD|$@U|$hw-|$0LJ|$0EA @6/IA@A |$0A~(fV+AC|$0x|$p3سAd A @fV@ D|$X5P|$82|$@t d|$H d;K!|$PfAb$ s| $A4|$86O|$0i|$PSA _|$8*i@$)7fAG-|$8X|$X<i1D"DGv  1S |$h:Av|$8 ds|$p6eqe$NO:ZgG 4|$H)|$P} |$8$ 3aQg7AYڅЃ|$0)fAX:|$XB^A-vvlfG6EMH:|$8XA ~9|$8jZ AYƒ|$pt 11{M9r=|$X,{1yhwOEAV g=AXuafAa|$PeO DfwAO|$0Iy]eEuOlrD(+1T|$XGm|$ |$X28|$p-.+A^0Ѓ|$p9+|$h5*M|$8'|$:|$X?0YX uf]?$dII~NF  |$8*A * v|$X5 ,'fAZ6A|$pA%a-Q|N ~t1XP"+|$hM2~A c|$p*c"5w4Bk4|$p3=9W]aAfATe|$@/|$z/fD%AIfA+~|$@w@rfA&\fA=E|$05|$p8A fSvl>!AAXp^7Tvb|$X(51|$Pi|$X&>"|$h~KWC|$@1Y1|$0"N11 ADH 8H|$8|$H |$X6A |$X31|$p,1W|$8 bA'ЃC5f`0|$p6lAƒ|$PѬŬ]|$p-1|$h(YD$P.(w |$0;(@|$0zfAb$#AMfAcw|$X+v~"sfAd\EK{fbնA{JAeJJfDfC;.A#;| iy*xMA9|$88&&;?r8>|$P=f.|$8%%|$p<S$S鷿|$0*饿Wv!n;mlk|$h_|$8S?  S6A@|$P @|$X2"` A־AG|$@ `A`A頾鍾t+$>EiYZpIw|$8$1'fV=)A>|$@YA8:%c9麽|$p|$X kX 鈽wAvnd|$0fTeF|$Hg9A\QA $< v[|$h|$@ۼf^|$X;v )l |$P;陼|$0tA*m n|$PA'#LP@|$@fATf|$pOG{E~|$8 u3j|$@jλ|$X&c4Atk|$8?nfTz遻@E|$@b|$h@R|$X9+|$PBTAxtX 4 fD|$Ph[&|$8JAVÊ׺A,|$XL0OXM1D騺$|$@-AWyf|$X#|$pl&=|$HO9w|$@v|$0R .|$0Q[1|$ `$+PBK鱹@|$X.#|$0nHfA^h hvL:;7ZrfXq\;fDfAWL6|$0Bӹp|$p2|$hlڸL$88$黸|$X*|$0IlN|$8p|$p!/1|$8a@|$XM/)A$(UFU}A IyT|$X$>o2o޷ U) 鶷fAU fW`1|$@AcPy|$$wMXNf|$@Sn'7d7dЃAA ܶɶ|$@鷶 |$@鉶|$0oqA]f\JA .UE 3A FE|$Hs|$X0sAQ$2|$8BI/|$@ e|$@eAq駵fd#65AOs~pxL|$80m$JAfchA6  +A|$X9 |$8|$p6 5|$hBj|$@к|$8+PA靴;N3J?a3G|$htf^ |$0' >+|$p|$X7t|$8f|$8 fA\Y60Aо|$@ž鿳Au4fALG4s|$0pz$ O<|$XE V|$0OU|$8$ $.& |$p3$vA|$@ P=F&X 鸲|$X1FB^锲D||$0qq[8|$hTE7}|$hI9B!@|$0a>,|$@#|XfAZi#NA鴱AsIA銱AA;C2C`|$0'|$XGGZ.AA |$ n"D$6$AnO|$8Hf^2'|$81鷰fD$閰Am $B|$hVO|$X8 W =+$3 A ƒ|$X'($Ae{e鼯$餯鑯#AB.e1 R$@L<7L%A/ v|$8C|$8$ |$Xlٮ-ɮ|$X!w駮X郮Iu gTJf\H|$@ J J"$Q |$8yAwZ׭|$@ŭAA\A闭$z"|$h|$0FZ|$0AD @ Hu ƒ|$pM M fAa|$8D" FA $κ陬@a|$0XdF|$p% cf`+|$@\r;G#|$0=RA|$&ق|$8wA|$8ܫɫ1|$@鳫|$*A^Y|$X?錫A"\j|$ht|$X<-A)=$ =8AXwq fAITf_>|$0:q|$hQ #$Rf`X|$.AD~O 鄪#> Z^v|$8WM|$Xj)f/w|$pX $hZ$Y|$ E|$@鿩|$@ IQ|$h_vA鑩1L}D(|$X65S$iĐ|$hw|$8 |$X.|$phAQ|$@Ѓ|$p o|$8"O!aA7|$8oǨo&|$8%UA|$p+鋨|$@y0 uAQG$-=/(|$p6P^A~\J|$p1- :_A է]D|$p+D騧A /\ H$goq|$X$Qq" ]|$84;|$h;0GL ( M,fTgq C<|$028<ަAʦE鷦fA_!Mk 鐦h0$ l5|$0e^A$dЃ($-5|$h#V\|$pK\|$0%^AP|$h›$w7鲥fX`*|$p+閥$X&|$h:E3ЃkAW|$@1A)[ /$B|$8AFwNSllf\|$+|$@ w)鳤|$X>h5faX|$h o$k ^fAQ-|$@eA,|$hiIfA\rH/|$@J|$P?>v|$hj|$hG]|$p)7$^ }X鱣A@A?鐣 (?A/vA lb|$8 S3Wf_W7f`~#$cbO fAS(Wkb$ƢfA[O鯢A9|$X18鐢 )W|$p*\9JiAh/FA*A6F|$@6,|$p*%|$8bA p$f`AAfG$|$0PȡF(A>CE饡1D锡33u|$hh#@r|$0tr|$0[5E fav+AtP A W1|$0w1Lj|$hgƠ)鳠|$0gЃ颠BW;N|$v7,ЃgO3|$@ D3F|$h-|$@ZAV Z|$X@'^ HC|$@m;vAПƟ|$p)|$hq:A:|$pof|$8woyI*3}T$ _#|$8^|$@A? '|$0aA|$|$h$|$p4PAĞ|$"rX|$p >|$P|$XL;6|$X86b|$hx0$?C?#AK kBvA0|$@|$pA'٨ 鶝|$0b*|$L^|$hAg{|$h,<{S:3A>-3jD[|$p6F+f^P._,s gAR!zO|$@[$ ԜA(Ay"魜kPA: O$鄜|$h}-'P]:|$H:3F XAK|$8A*JXvBۛ|$P|fAaě麛|$X7)fAR|$h* ~}|$!AwQfY+|$ vA;9/$ 'c_|$8  pGAr7ЃҚA3[3鵚|$@~v|$0Q鈚HdZ/^mT )|$hP$S-A: %fAZO K<|$XT_$^Aƒ|$hhu A駙A閙$41 lF_fAb0 z]9 3$ xY|$0TIAV2A$AGY ØA|`\Av|$P1鍘+B"%X<h`|$X0^,W|$0o$ <|$0Y|$@|$p" |$0(EfAIo|$XDPv|$@(ԗʗ|$X!j|$PO霗fAaN|$ KA lAN|$X#SA(B$,pA|$p*#RۖQ7%Wr鶖 5ALR|$p/R鋖|$@ X|$8Lv|$Prf\|$0#2|$XDAt12fAMܘ|OAD |$@!ЃAAӕm&|$X=nR< A韕A|$X0 GCw|$p+"#LNP I|$hRRf[|$P|$ |$8 vA |$0Pm|$07G麔 駔|$@Ѓ閔|$p*sAVf[dQ #3W 2|$h- zI$\!vv|$Po|$#|$X?FO鸓|$8 fVQ|$@ ƒ|$8 lQtF|$@ Q |$0z|$hewfAYbV $fb4|$8H`eHvA鲒A- 4 钒vFY|$hvNhAJ$(fY>PA AA"|$8lAЃ|$@ 5ϑő黑M%|$0W@8 s1|$P酑A$hb|$X7zL1H 5[q,|$p|$hsێv|$X fAU\%|$X0vѐǐ齐AA)颐阐Y酐AXN%fA[/PO`T "A 4+ I|$PI|$p+&P%Oߏ|$@ЃΏ|$P"]00駏|$p0&4鉏|$8( -|$X9,AK_|$8+ &AJA0Aw|$@ |$p 8^|$@ |$XAA|$8#A齎|$8#|$X/|$8u/钎? XAv3YgCAgJv 7|$0p<fAad |$8|$@b,D$8-/܍Z)( i|$0d vA 配{|$XtA :$4n|$0A4A3)|$XCP|$@Ѓ | $)|$@A|$8Ѓ龌%|$8lb|$h>9W3|$X4AQt A(Q|$$|$84A" QЃ5-3UA8Ft(^ ŋ|$X8S)ph 雋Av Av~A/$ q/E-|$P:-??,|$@,>|$p!> |$X*S-G-A#- XϊŊ|$pf$fA`JA雊$ ~#AvAe|$@o=:9d~A.Aƒ|$@fv|$@9t鹉fa&>|$X!=锉=~$ 2AsA6v@6N5T|$@#JD$0PA #Gʈ//|$@o隈T1}OSA$z|$8oG|$0N,Kf\ut|$hqjtEA  |$h#6|$@|$Pn5Mb5̇D鿇f\ 2|$X2"dET鎇fU+K$ ( sWA1|$@1|$8A`b"|$X:fT7|$ۆ|$p$4|$8$lAFl鑆A3v zp|$X%~/9tM|$@A|$X-'7|$p9A w |$pA. ۅfAiqAeA7c骅$BC|$8(Oy|OB3w^WM=C-|$ 1J|$@|$0CJ̄|$IA|$h饄(J醄j%J$1IAvL;Aw \)8;|$HwAlAT ԃAH~鱃T鞃M)$GJF'JfAb|$hoUo.|$8![y|$8`*|$0}[ag ^ Ղ|$p3AAM|$H՗|$@ʗ|$p3D釂.|$0:YA_|$PH|$p9(Aa1|$@){1|$P]\fa{fA[\,|$8<Y|$@!_c>q2飁|$@fG鈁~k&[,w!LB|$ /|$p e|$8ZhX.|$@U$SUA@IUҀ|$p+7H|9|b[ 門Ѓ鄀A/G`H_|$@ЃQ>|$PO'$@NW7N|$h]<OA;:  1fAL,1D@q v|$0LrhAD|$8#uBK ~W~183"|$PO|$X*Of^O|$hu~<|$X05fAY|$8~|$h;j?t|$07|$XFT~!B:$ 0~&~ 3$A#|$X'U]}|$8IP"|$@FAfH}|$@ }|$0`xAgTQ|$h}SIY|$pC}Z>:*}|$@}A C@A |fAKK|$p+1G bF |fAX-`P|$8S|$P|$@ ||$p<} h|$?4|$8 z$|$8, v|$8||{$ =|$@?k6k{$v|$@{{|$XJ|$X;A J3Gv|$X R{H{$8A&{|$|$XGH @ zTv|$zzgzzfY,fA<ez|$@|$p3>Atrh^zA9ЃBz$wn'zz z_8|$hdjfA`||$X8@yf[OyAyZ23~|$0Gv|$H _yA1 Gv|$p,1y'yy0$a|$X=t|$p-̠$uxx|$p0xf`|$XEx|$@x x|$8DsxafA4wAA$ wd7x-x$xA x|$*R|$hZ BfA^A|$8w|$ww-^CwAw8pwAI~i=$0$$,Vwf]Q*FfA/FЃvvfA[7|$X/8R|$P^|$X-w<vv|$8:|$|  |$p,"v|$PLvBv|$X4#>|$hj:voA|B|$8BuAu|$XG69QKnAeu|$pNAu|$8p{cu'AvCu !c 'uL#A^RA R|$hv: *ttEMfbGG$=$ vtAuh v$NtDtA0t5|$pEp0\|$8=Ѓs|$@ #T$|$ Ѓ|$8 Ё u AmsAsosc$|$@"1VjWsR7 >sl."s|5|$p%vf[sr|$X: 54dfAZ! rrЃr|$P:|$h [EjrbZrA %|$0j`]A2|$8A  rA,fANIx|$xq|$@a|$Pqq|$h,fZ^] hT Ѓhq|$p8-|$X4QkR?q$y5|$hmoA[AqfAN'upv |$X-sp|$X<pAЃpA p2fA_+|$7|$X4`p|$X1+ Dg|$P9g4p|$0q A $G pA $$o}-|$8*ro} vfA^ooB}#fAVO]|$8 '] |$8Ay@oAHF o$w>#8\|$hw\|$p|$05Yn$utnnFm$T5mxn)m|$pmWnA30|$@8n.nfA]8|$h'9XmA~|$8sAzmm6|$@mm5<|$@<|$0d$amAuJm@m$ $T;|$X; mml|$X1] vAsll|$X,v ll$wllolblM2=l3l|$X"!Ѓ|$0„SA\Skkkk|$X,P1$qf|$@ kk?k|$8 [ |$Hqdk|$Ok fffALu|$0?nm;|$pf|$p0CvfAb vA9 x|$Px[;/TfAZ|$8AAtZ8tf|$hzstA- ƒ$%|$p1eAsAs ee|$@vE|$h7e|$PQ|$0];A{;AvNeDe:ev|$h}"eeeddAddD^ddI|$0RI ؙ dzdpdfd\dRd|$8gЃ)ddd d|$@[|$8[A|$X3|$P|$cA$TA_c c|crc|$8 `cMc|$@&|$p.TA $|$P8Oc ccbbb bbb|$pb|$0aS g|$X=qbgb {TKbAb$2|$@ K|$0RUP#2QdA+5A)w fA_aaa}T|$@'Ѓaaaoaya|$p-e;W^|$8A"|$h~v4,a"aaafaZ1|$0LZ$$*``A]2AS2|$X9ª|$8q`|$0X3[tOG`+A'`3 ``+A!2|$X5|$p|$8|__AAA_A{_q_A.v|$X,X_N_|$0D2^2 '___ _6Ѓ^A#(|$X^^D)|$h0f]:Ѓ^S)GA~^t^A_A.|$8 L^|$8  E|$DAD|$@|$8^^|$@0|$p&/y]]]+A]],]|$@,Af]9nv|$hB]8].]@D,hvA]]A +|$8 vf_\\Aq\1fED@\$Y-:-c|$@Ѓq\fATX%S\|$8N%5E%-\#\AI\A[[A"JvA[[[|$X/ $ [fA`((w|$PW[M[$P #[|$Hƒ|$h{t; ZZZfAb'|$8AvZ|$h%< Z(v ZZxZnZdZ|$@RZHZ|$0v *Z|$8!   Z|$@:DAh7Y|$ho70K+0Y|$0X <O VOA,u|$8DFЃyY|$p.~0|$h8TPYFYAV0o0|$0A)PY XXX|$X;8BAA|$8AX$XfA\ uXkXaXWX|$X*n-GT--xm'XA%,}M XW$f5$ 5v$WWAЃW$WW|$0AAA~t4 YW1|$PmGW=W|$8<|$p*|$X*RVVA3f^AzV$VfAO>fSI>y([fPuA>V4V|$hN9AVV;f[;|$8\2 UfAB2|$X4]2$ghUw.t|$@ UB?bUXU|$@6|$868U.U$Uf^o4U$8|$ RAUTA-5TT|$X5@0|$p4A |$@1qTgT|$@UT&,|$PAޯ|$p>wATT|$0e:Af)@ SE :)u v|$p6SS]<$9XS|$@ vAiS_S]'|$8u Ae8S$2|$81|$0X|$pݨVwRR|$@5Rf_W|$XGARA>A 4R~RtRjR|$p 06 $@R|$p_Ay$R|$X/-|$0;1bA Q<|$8<xQI AQ|$p A/A/.vQA(A[QQQ|$8?Q /QX%ACEQ PP|$p67$x7PЃPP|$@R|$8P|$X,AdP.|$hd.FP$P0.bxHHHHHH|$0Z&Qp$pzHP|$hsPPMHpvfI6H,H"HH|$0T<|$847|$ GA>fAUAЃG]GG|$h~7\ uGkG|$h_?Ro|$p0$GGGF|$p.K9FK|$hKFA O|$p6|$ F|$h*u7K 7|$p4{fUg|$@4ЃCF9F`A|$h.!FF FF|$@ E|$X7E|$8<|$p5;d/|$h$E|$8 F|$h?EAd|$h0PaAT9A%fANTEJE|$0J;fAO;|$8ƒ4uAEE|$88Q~Q|$p(DDD|$P11D|$0QDЃDAWF C fDA!F$ AuA.D$D|$@5FDCCCC CCCC|$p.6`|$@U{CqCv=[CQCA7 1C;CA=v~CBB|$@ 7A<A lZ|$8v|$p"BB$:<B|$hpE|$@ vfAQdBZBPB|$8$>B4B|$vBBB$ M\ЃAf\IYGAfATu|$@ sЃAfAXDj jAjiA|$XWA|$0avf\AA7ADi|AHA v|$0A@@AZDZ1DA6djAo6j|$@vfAKa|$Pj'p@|$@ ^@WHA>@$>Ѓ>|$PG|$X>>|$8 9fAYV>s>i>|$8(K>,+|$H+/v!>>y>|$h\*==|$080|$0f/|$p"|$XB=C=e$ E:e|$p!eeA:<=|$0]|$h H=|$ %<!:A3AvAd< |$X >;|$0j|$8;A,|$X!~;;;;|$hv|$@p;f;|$88fUiS>;4;Me6|$8 ;; :|$X,${ :36:f`M6|$X(:$~::z:>wkH b:X:N:$3G6A 06:  :S AЃ9Ap99 99A|$@99x9n9]^9T9D$X=9A`)9 tA99A^8C8|$00,,/pP|$8 8|$p1w/7q8g8fS"A v|$@ ;818A߶i8 8|$0n7|$8A޶7wa A7|$8 Dz$J AE7|$hE2|$0 |$@7f]8|$866666,66AA1{6v6l6|$h'vT6J6|$hG|$hЃ"66|$X5 Ѓ5wY|$h|_9$55fASըn55Az|$h]e|$@ZH5Ck|$h\No !55|$X/wF$DkYNA4A kA4|$p5A|$PuT44AM|$X<b4 ѬA!o -4$ w5|$84$N :|$X3|$pv|333Ai 333{3q3g3W3M3C3|$@ D,3"33Au~8H~|$062|$o~|$hZ~A 2x uA22|$X"-vfY --,,A8Ĥ|$8|$pS7@4,},,>w;fA^{V{h,^,T,Ao7,]פ,faA+A|$p+oA ++1D@+|$p+++Ra c+6\ D 2+A|$X-B|$P&**A*A|$hQY|$8 W|$X8VUV*mv|$p,*{*q*$w4|$p+zj5\j w=*3*A-`A `A*39W|$0/)))VfA]x$] k|$@))|$8mlMlq)g)ApWvA@)6)|$X6WfZA) )((|$X#o|$h-oAo|$@o|$@vA (($ z(w?Ad(|$p ؄FI(AЃ6({#(Nm|$ec|$@#'|$h@σfAXu'|$@w7f`Awe''|$hA|$@#s'i'AGeAd*҂A&'AR&~bA&|$8 xdAUddNd|$8Cd&&|$h|$XJA&y&o&${.{U{bvfAS1&'&/|$8a}|$hb}6fA]~|$06%5}AA[|}|$X2q}%|$h@_B_|$X-[7i%_%U%K%|$@ 0`|$X7%`+%|$h{%|$06ȍ9Ѓ$|$8TT|$P|$@ !Ё „kTA8^T$ $ AYAze$ q|$HOB$|$X&Ѓ1$|$H!$|$8 v $#|$|$P }c|$cAJ#|$X/ AMO|$pO|$8OA#ARw(c|$Pd7F$ w(Aw@7 T|$h}rT|$ƒ|$@t |$h{gU  6_Oif[|$8S+ScS|$0,D|$0Qk|$0;ok$j|$0;j/]K|$8p5|$ Wf]VWVAVzV$jfatjAgj|$p'BjA^TA{C9/%|$p(w6|$X:9AЃ$|$0ffAZ\|$d[;v|$X2fA`O~|$X:1|$PD` M|$p/ At hv|$P|$8}AR |$@ |$pc_AY_j`|$ `yƒ|$X$uA1'A 6NЃIz|$@ hACIAv A7J IIf`IHAS7AGaGЃ}si_UKA7|$p-HH|$@w|$8 |$X*pI1ZIRIA?|$p({fAZfAAX|$p 8faޮȮ$|$8-D|$p,DfY~A|$8wj,CGCfAYƒV'CAC|$P+BwJ{|$@ HHaZH>9H|$J|$@JfYJA)HSACfYCDAw'EA[E|$@}$_|$8`AVMC|$8Aws!a|$8Ǭs4]ˬ|$8=yz|$8Ѓi VLB8.|$h$'~RxAw]^dW;|$0:k$K$kݘ|$0XA >z|$8$e? ?5+f[A}'A|$@Ѓ ՛|$X6 A|$Pn/[Q0|$P|$ u$|$hzAAfAD  Eʙ@}si_,L|$h9J|$h#/|$p/w#A v|$8As  wo|$t}A|$8 w!= vfQ }$qgA}J$[ }|$B}$|$X8\ f`!"[:A|$0|$b v|$p0|$hAvZkaW|$@ЃF<2|$P)~|$wDEnf\K|$8|$@vA|$p%w(|$X4yoA:HAQG|$XV5O |$p v|$8FAwS'u|$X"<|$p '$|$8w\uA`  ywA+!^$ A uk w7|$0jv0R|$X7w)u,"|$8w |$*|$@ * vi|$X.icYpZ|$hnO/A&$Ѓ|$h\V?"g|$X8|$Am$$?b K BE;1',1{$ j$  Ѓ|$h|uAmA,|$X*|$p( |$hA$u|$8cxkgl|$PaMC9$*(fA`A,|$homϐA"N|$p"|$X'D$ ]t]E;|$h w!|$@ vfAF$U]|$p !fAb1|$0*|$X"!&CZf`,|$hqp|$X5Q|$PݘANC9|$X<| U|$h1|$@d }fAOh$MA 9fAP.|$8|$h y|$j6O9%<%|$hYk%U%rЃg|$8Tmc|$8d|$X1YCA /%O|$p$A vow"|$8(v|$8DeWeYexAƒt|$@TJe!A-$lAS$ $TJA|$hlfI|$hxAv|$X8>4|$0DX|$8%|$htЃ1|$P0|$0Efar A dfAQ|$8 ЁcdAYdЃpAVMCAA"fO4V AA3{|$@i_UK|$h*w5j|$p3U|$X7v|$8 |$p|$X.|$8E$Q ތ|$@AhLh^|$@wK|$pD8$ $[$[1\|$8 &\A(Z$ Ѓ|$puAj`|$PAA$^ZA;Z$K|$8?$ t |$8$ |$8 |$8_|$p58.|$p8[ fAW< f\ K CAv|$_~N`EAH {qA`|$0l|$@@|$8w|$8BA $ !|$@|$X=|$0lYZDwA|$pCVmA w-. KA7 n|$X=c R |$X1 Ѓ|$p, ЃLu |$huN$MB OfbdOA MOACOA NAN@|$8;|$hGf`NfAWN|$X<N1fA:|$@SSfAU v|$X8 ƒYAl \|$hvAf_A\fA~|$p+wB|$8MAvAZ]RUO|$@ N|$hNw|$@e|$X(wa|$@tjƒbAWvy-f`$w3|$@wAAwi~t|$P}EZv$<2(Yw8- |$8=v1!AG xndZP=3A A'|$p9  |$p3vq|$X9w,JfShwY|$X=uRAv+Ow |$@lbXND|$wALЃ+AE   T v1|$p&D wA|$0Vw'$"v|$p*x eAwLBv|$X.* w^|$8w11fAXD@A$@w{^wWAWA|$X<W|$P}RwJgZwm|$@ w\AivVK|$X3v;w"$'A  $$|$XE$}sifAK!zvfZKA|$p4wHw9:"fATAwf|$81|$@ Ay$ v0r1fADDwmcY F<|$X,w$AwA$ |r_U|$H|ML>+ d |$8|$ho$=w9RЃ!wO|$8w,|$@wfA]+wC|$POeA|$P|v|$hBw.A{9|$X'w,zwl|$X5v[|$8 A|$H|$8Ѓ|$X*Awyvq|$X*!A„tA{w aWM$C5+zM|$X4Bc|$8$|$hh|$hOw:|$p|$@wO|$t>~|$@wH$w+0bXAG.7-$f`u AYf`M|$hhwL|$X-v;5v,AwwAF|$p;hfA]9|$@w2PF$wA(A|$@s|$pw/v9|$X(w7wy$-wKk$wv$|$@LЃ:0AwW|$8wF|$h\w?|$pwx$wZAw4$c|$@fAb |$8A{|$wWfAbt+ƒ|$h`t BW|$8|$hXw672|$hF$d8|$!|$X=|$p)wu|$X!w1fA_D$&r|$@$BAwm=we^|$0=;|$0:|$8wH.A|$H|$8":s$|$p05|$09AwEAw'w-w8AЃ_fZtUA wE|$X!v*|$h;:|$03vA"w\A|$p*!|$8 +Ewd|$8 w-faAwf_6w=1fAO\wYhwGCw+81|$X3v|$85wAHAAMfA|$v[|$p!w,AKt |$pS1wH$w1q+fA\AAAvCTw(|$X+7v.|$@u'1|$@D@|$8vCw|rh9whfbR|$X9w7Aw|$0;;17ЃA |$h-fA`f_a|$p$vPTw4|$@ }n~v|$h*f\AHAI|$pЃ-#Aw(AA|$p'w"|$0*w|$@wI62vO$v@|$pv/Fw $ yoe[QG$v|$8w,"faUu=|$@w? v|$Pwm$U|$P_Ѓ8.|$p.|$ wVfACEw=$AtN.w?|$0)w. zAA_UK|$00fAQ+ wmcYOE|$@ 3)|$X:wY|$@vH|$hDw7fAat Avz v&AvYOE;1|$8FA[9|$ w Avv $` w-Asw$APvvl~A TJ@;0&nЃ % v8|$@ Awipfjƒ|$p2u;=3)u ЃA|$0EAwz|$P}Cw;fA^>|$X+t- w|$hLvzp|$8^K/%w.A |$X/w'* A~$|$8=wNAw>|$X9v7bAvnv\AwS{q|$8Rw$wA1PFA2(Aw?1|$PD@4v|$X@|$p,vc$@w|$@ yo\RHAUv,"|$huw|$@xn[QG=3q#AA4w6|$0v"v|$h9|$X0wD{Rh|$@VLBfAbA#Ow1|$8DAwMA|$8Aw\|$hwD|$8w%AЃ|$8w`zAi|$h|$8wmAwGw5#w#|$p7v-|$89Aw"|$X3vA9wnЃA|$-Pz|$X7w^wIw7|$p/w&[L9/%fAP{|$X9v_|$XA\$ Aw|$@ |$X2v 0wqg]SI? /%vA@A|$@|$XAA||$X.v;Av(Ov$&wm{w"|$@ vPF<2Aƒ|$8u|$0 |$8+|$X#|fAbGt/A^wK vXNDu 1.$~5|$8 w>Aqw%|$@`$wwwxAv3|$X&w"v|$PPF<2(A?w" v|$hg|$8|$h\lHAuKwC|$hZ|$8wyAwH|$X5w+|$0QvwmTW|$X,ƒu n/fAX-Aw7|$@w0AwA|$h9w f^O|$P}Uv|$p0{qA]STwA3:0&#u*|$8dw#vA |$hw#|$8C|$0RЃ|$@ Aw!K vArhU+Ew;1|$PD |$p+|$X=|$Xw 釽w|$h9v_U|$p+v|$@>4|$pwA|$k%vn|$@wgv8ͼ|$01v;Aw1f?騼鞼鋼遼wAg|$h vMC9/%A1 wq5w@v1yv"|$hLvѻǻ齻鳻|$X:wsAw`$wIBwD釻|$pv)Aw$vAaWMC9&fY ?fb|$XD|$8|$H|v鴺骺1閺錺邺oe[QA@A"|$p9f`|$0>|$X.|$hAƒ|$8u`|$PY鸹"w4|$X7w#fA[A醹|1fA_D@i_@w<7Jt;1|$8D@2( |$@$Q ̸ָ¸鸸鮸餸隸AN醸|$p)wVfA`Et:w2[AbM|$hw/Aw&3)|$@ |$8T IiF|$@|$ Jw8|$h=w~颷Ѓ鐷$5wAawooeAvrfbY$>>|$8|$p|$pAk|$h*fA\m|$X=|$wQ|$X5w5Aw"[w靶銶逶|$X8w`\ka|$@ O|$pw95w5$v+|$POڵl͵|$@ |$0^|$8}饵雵鈵w:Ar w8|$p,v'|$@u IK<2v*" شδĴ麴vA閴逴vAfALB#\w"|$@v^߳ճ|$p%óA鯳饳雳鑳釳vlbXNDA$0AKv2A |$X.wfA|$PlAl鿲|$0J|$0F)|$@'wi$wMwm|$p1vpA w[|$8vJ|$8&v9Aw03|$p&!A   Ѓ|$h|$0WefAG1f頱|$0FK|$P}}Aw;Atw=w.fAK~MC9/AAAG <ݰӰɰ鿰v-A飰|$@ wЃ銰逰v&vA_Ut B8.$5wz TfZ~*|$p.wEuݯӯɯ鿯|$@ w3iw!$9v陯鏯酯{qA]|J|$H~9w1?$wN|$P'$w*|$H|1ͮîwA韮錮E|$X5w~$g|$X0w/Av|$p+E;1|$@w" v|$0[AcwڭB9$!|$p2A阭鎭fAPB|$@e|$h $ wMw;~6-$voAwS|$0ev8w0Avg۬ѬǬV鴬|$X;wY vJ|$@閬$ ~|$0dwIDh^T{A.$$wD|$@A|$@w|$PQ|$87w7ӫ|$8wM$w6M鯫霫U鉫u efA><fA\'A<Ѓ)|$@wQwI|$hjA|$8wPAv.|$hLv(ѩǩ齩w.A顩|$p"w,p釩w/|$X1w(nXvAZPF|$8b|$p.$6|$@ $vAmڤФƤ鼤v,AAT韤镤鋤遤w|$01w$`VL|$X2v(4* Eƒ7u:Aw1|$8w'֣̣£I鯣饣F镣鋣遣wwO|$Ew5ANW|$@uN|$0CvG6 #$*wAS1fAVآ΢Ģ麢鰢d面|$@w|$@ 鄢zw|A^TJЃ8.A Ѓ  wyfXX|$0OvGfAB~6|$8wA 餡隡A鉡u|$p.Z|$p/<9H|$h)A |$@w?|$X9v8DwGw5Et&Bw!|$0FE齠鳠驠韠|$p0t遠AhffAN3A<fABVftvwwvvf\ WfA8y|$8vhA vXvF|$0Xv5|$H$Au麟鰟馟霟钟鈟~tjAxYfAJ~A7-$IUA_H|$P8|$p6v'|$@t$鲞騞fAE8鎞 wc|Tw( iZw#2 QAA -#|$0`wMAvD 11|$Pٝϝŝ黝|$P}J|$8vC|$PO閝錝w.A w|$@uj`VL|$8|$hwP|$0^w)Alw  |$0Hw1 A(w`U|$@ ؜Aǜ齜Af]y障|$@?wX|$8@w"$w_tjfA0t|$8`E;1|$p-v>Aw.|$X(vAw ؛ΛN龛A(骛 闛鍛郛yoe[A$oAv#Av|$p#~|$h՚˚wS3鳚1fAU顚闚|$P}-B}s c|$84Qw;$u'/AvfA\P|$@t?w-|$H|&ЃΙę麙鰙香霙|$@w"4v|$X-}si_UKAA3) wCw4Aw!Au$ʘ鶘 飘陘鏘酘{Ow8|$vA[Qk>Mv8|$h'$Av |$@w7$ v wǗ|$@Ѓ鶗鬗颗阗AI鄗zv9ATaAw&|$0?F<2"f\u0AwؖΖĖ鱖駖$A$邖x|$8f\|$X8vD:|$X8wYAw>1D@|$X'wJm Ѓ|$@ڕ|$@ȕ龕GF 韕镕|$p7wI{q ^T|$hw5 w A v|$p=2(|$84wKABߔD$P-Ɣ|$p+鴔顔AwO|$8v>邔x|$X9v8|$8\v',WMC9/%|$@ |$8 v|$p1ؓΓ黓鱓駓|$0钓鈓~tj`$v|$@C9/%vݒӒɒ<鶒ARwAv/wA9v銒递vl|$P|$0EO|$@ $6fSM [|$@vБƑ鼑鬑频PwEW銑逑wL$w8Av(XOC9/|$8"|$p(|$p/w@w.|$@wI鸐鮐餐|$8钐$v3w.pAvЃUKA7|$X7|$@A\w0$ v#|$X4f_~; < w6 wAՎˎH鸎1|$@D饎雎鑎|$8邎xnd"TJ@6A"A|$@ԍʍ鶍|$8鍍郍Ev-AXwAwbXND|$@w1|$hBw*|$8w v  ی|$0GɌgvA騌A锌w[|$0JtJPwmcuv$KE;1m AwwBGw:LwP|$P|?|$8v(|$p5w^f[>|$X|$X'O+vGwB}|$P}R$Tw.|$X8vOE;|$PO$$ wX|$P ~Q~T~~fAM~3|$@ w|$8~~V~~|$0wO|~r~|$0w4U~AD~G4~|$h ws|$P TG~ ~}}|$@wAN}$ }1|$@ }|$8E} w-Tv({}|$8w+ww]}S}I}?}5}+}!}f>- }||||||$X;|||$0^w2$ƒ|$8 u |{|ANv8|$X9w' X|A D|:|0|&|fARg ||{{{{{|$05{ {A|$@]{3r{|$@`{|$@N{D{:{|$0D$ w{7{{|$p3|$@ TzAy zA A z$wIfARu*rw"szv. [zQz1f_@z6zA%zQw1 zAs yy1C%y6yyy|$@yyy|$@ t nydyZyPyFy|$p/w|$@v*y ym|$p0 w[AxAwVxxwG|$pwAxxALvAxx|$p)wh@wCaxWxA wq w_AvY Ѓ1x|$@w6|$@w%wxwwww|$p4w;3wwwwwAwwvwlw|$@ vcAvSЃMw1|$P`;w(ww|$@ wwvv%v|$8vAwXUvvOv|$@wAAAWrvhv=v-|$pw&7Iv6v,v"vvvvuu|$@u|$@ uuuu|$@wT1|$Puu|$8uu$]uSuA?u5u+u!uu uuttttttt|$X6tttt|$p'v$$vtltbtXtNtDtv2?v#\$tBt ttssssA|$8swq|$X-w0~w!AwosxsnswBv|$pQsGs1|$pD@4sDAwt|$8uDsrrrr=|$X1wt|$8vcw[rw+ALv"|$pvr{rqrA\]rSrIr?r,r|$02w6rrAw<^q|$@tUAwwLAw:fAb~3qv^tF$w&|$X.qqqvqcq|$X*wT|$P|C|$hlCq9q/qqqq=cFBpppf]:|$@ pVwx|$X8v+gpUwwpmp|$hKw"`v|$@NpDp1p|$8w#Awp po$ wYooAwS|$P~Loo1oAoxonodo'wQ|$X3wJKovOAv?o-o|$8,w>o oonnnA$ wzw_EwJЃnjwnn1|$@ D@unenRnHn|$8M*n nn nw$:mA mme *wBwmmA1|$P m|$X(vEnmdmfLk ЃLmfAW>A|w"Nw|$@ $mmmA%l|$P}~|$@vm|$h,$l$*wwvrl|$pw>|$8xlnlX v|$PYVlLl86lV)lll llk kkkkAwfSkkkkk{kqkgk]k|$8 AA wh|$p.w5A wskkЃk|$@tB$v+ w&jjjjj$5v v jyjojej[jQjGj=j3jAvjjjAiiiiiAii|$Y?fAG*|$@.iyioiei>$Vt.|$hxw'w-eev3Ayeoe:wWeMe$5eA!eeADw'AddAlddddddddAmdAw<w mvVId?dAs+d|$8 $& w{cc]|$8qЃcc|$@w(|$0Yv!c|$X9v ccccAncdcZcPcAЃ@c6c,c$wA ccbb$wxvpb]$Euu$xv^wVbAwhb^b|$pAv~|$@8b.b|$X4ybAxv1Aw!AwFaaaaaaAt7fAb aaG{a$%gF^QaGa=a wA aa aafAUA |$X4w;e `|$X8wnAv^wL)`|$P-" v|$hV`` r`h`^`K`A 7` vJ|$P}9w w'  ``____fDUS\$`D\$(l$xD$, D |$p |$hk $  |$0.e%A%TCA*f|$83¯AÒ|$8[]|$8 |$0lz|$X/ |$ D AQ0|$8qFA3v  vf|$hnwy|$d~|$0h|$p&8 <|$(!AQ3|$8 ;AGbUAy Dl @|$p=|. h!|$p(]6A:|$hl*|$P|fDAa$- |$0Bj|$8AA&C5|$85|$<A>M|$04lfAXA|$0dP $k|$X0v1|$h9 F|$0:"Qi|$&n|$p U9 =fbr(1?t$@uA DfC|$8)|$0W|$@t|$0L=Aq;AW|$h}2 n[DA6 |$0a)A$_m0 a@Af_|$p)A|$X?42Ag$~gAu|$h-!A&9$ O|$@>qAiAf`AW $T"+A?_5L$@H:i$א$AA0A+v|$0!/ A2'f\+|$X/DTfA@Վ|$X&A.fAK|$X lЃ|$|$0|$0q|$8">*AGB|$p/`_|$X>O|$P. fb |$8y|$0 An v!A8|$0*|$@KI|$8,HD<|$8 A>",  fA@|$0kxA|$p,[.|$X@F;|$8#j~A! fD|$@ M |$X-A/&|$8L8KTA|z|$@DA<A%,|$@,off`AfA[ 4fDAW } |$4!|$0OL=$ "\|$X f1'@e *|$@ ?|$8m|$h}u $!71|$@,fD/L+ AG O,|$8fDAZ CG+1t DfA^-|$pj|$8|$0,|@D$@K|$Xҩ|$8ѯ5|$X|$PE fD < |$X5 fDA|$p!$7|$X7D1b@|$8 v]?ABHP|$XtEwA DfYp $D $: A<|$X K|$8of.|$H |$X[&*A@Ad1|$hFf_ #A9Ai Gz ҏfAOAXAz$zN މ|$@|$@ &> 4H|$8.$}|$Xb$#A\ |$0rM2A$'+ |$X+\#AM7A?]Q rA9h|$@!oA2OU $I!+|$0Q0AA}P|$X*oA2x J vD|$p5 |$0A$,1 f.|$X|$ %|$p8.(|$peAVtAC9$N1d|$0_A . fA_|$P/|$@  DA|$0H fX'A(S|$X1|2|$1A(R@0 A@|$X?Ahxb\xfb؝7̝D) |$p"H|$h~KAf.|$8MAtQ-@ e|$PظN= *@|$p'UAk]AGM)< D|$h` $nb8Ao'T|$8l|$p2'|$0`^&|$0;S|$X,i|$8|$@1f\]|$00|$8'|$x0O|$@  tAY$ G2ofDAq fW}|$0^04?Gp|$0Wd|$p6|$X>VA8V|$@N f]]|$XE4AZkEALE_b|$8^fAZ^fDAh c |$@(:a A?A =AUR fA`># A4|$p0!/ $ OAsW-|$p#QBЃ|$X+nAW-B|$hb|$h#l9(Apf[[8|$H 1 v|$8A?GK#M vfAS9|$@"g1TAC.|$hP|$X*o|$0TEmrvfcfA}* 2|$8qJg T[fZ |$hK׍|$p0n{fAUAll%?Aw|$X;w|$8uA#fD$1 1|$@A  |$X-A3A'|$h$$$RA%Ww) QA6y4|$8? w |$8|$H|$p …}=2 V @A\wA*+!j ~4|$hl4|$X'{v |$PfD|$X<A&1$ƒ|$8 Pf]xPkAla |$h*0%9AjZfA[||$> |$0|$0.|$02|$p ƒ|$X(euf\[uv|$hU@ rAP!(>o1AEX |$ 1D$ 6$XRfAc {|$8f^3|$hS3fD|$p1Aj1A 1$ A%|$P_pLA u5Ay X|$hyƒ|$8fAh[A[|$p32AVf^Q- v|$8|$P.s|$hy|$X3|$0tM pf.VE|$X(.AGA|$8|$p!Al +|$@ A8/faLMMzA5CzqdAv ND|$hP|$L54*cA|$8fAb|$8   $e$u5AMD|$0V|$@E=  $AA2fA]x?$zYAz|$@  @4v fa|$p-v|$X9j`|$0e4fnЃc c w |$88 |$hhf`BfLa|$X tw |$0#3|$@AKrbJAzn 6w _]f\{|$0xAkZ ZfA?$|$p4OfS~A@$A1<|$p,g|$X1F#Q=/ $S!|$XA1I|$H*$*$dSEt B8f|$@$|$h!|$@8&|$X!@ |$p|$hc2|$X#[6pA^5I'A;A?Ѓ-|$@Af*|$p/d ufS)|$7^|$8,Aù|$p%Y|$X6@|$hIufaXeЉf^|$@ 0f.DD$@E|$8 |$pCAj8|$pkgk|$p4!1fA@D|$@o!0*3|$@]:$t^3|$hvR`nAT3|$@dU|$@D|$p.h|$X7/AL`|$X%yjY fD|$PVAwIf[`|$8xe|$XU|$ E4%v |$X!?[#|$X7P#|$0e%fAOB|$@|$8#W$m AP?Yw |$@fD|$p8 Anc)|$XXfYKv|$8,<2@D $v$fV|$8:+|$03yR|$hd|$8n|$PP0n|$Pnfv|$@^TfAD|$h6|$@"A$ ifA7|A v |$p1O|$hUX&|$p=ZbAOL|$ $9A79|$p#7vJ@f.A|wG_|$@*$5 Q|$X1|$pAc|$8,>fY9|$8f. fAG4$=.\Yry? b@$ H-o 1|$0'|$8mA |$04 ;mc|$PbcA}  |$h~|$0N&|$02D|$8uK7hffRL|$XI ; jЃ vAZ|$hVf`LAWF>|$X|$0)-(|$p$D1A$']A75>7Ab@ "eVf_4H|$@ |$0`. )|$\@|$hA{|$hG|$@ fD$ ^wfAQtjJ vAPFA\w/%$8AI-vA5|$p5|$@ q$n|$0Re*A7Q|$h`|$X$v`V|$p+D fE%T|$0-$ lACf|$X3Aa|$@ v|$P|$X1|$X;|$8zOg|$4$w0G]1d# |$XB 8+l]fZ^d|$8-|$pfWt 4f|$hn|$8|$0!u `qg|$p-$ FfA_~`.$A|$X&s6|$@)) SwL}s`|$8|4Awouf,6|$p &7M-8s.[$ee|$0p .=uAL-ABZG |$h$C  C At|$p7|$@Ih =hAvA?%fAd0B|$09b|$he)|$ ޞw|$p&@]A/v|$X+QGA`~%2 ;|$h}`AH^f|$0Y&|$pr|$P PUv9@|$8U|$h! Su|$@Af. #~ Ns0 Hv7A^(: fS$I/:xxƒ|$8eOfSEX&|$8|$@wl;A)HARa|$hQAI^6|$@X|$85O|$@  |$8U$Y)|$XqA~G i|$P_T|$0i|$H|$@ (f|$p,D'7f[].Гw)<Aƒ|$p!R%$XA%v|$X,g]o:%/Ѓ?AB%A;4t}tDx^$AKYEdo$.|$hRAl|$hW|$p+]k$x ߿aof)'|$hG!yAS|$X4\fAX A!(EyF|$hV|$h-ai$^AЃ|$p4pw].A eRGt$@t1'1  Q!>`|OfAaj$AfAZ,|$@ |$8 (|$X*1|$p2Oxj|$L|$8ZBi_|$@  *@|$H}$|$PH|$8q|$p.fFCv¿鸿%X陿|$8釿fA:w|$p!*|$@{N|$$|$p|$h\9|$X+v s!|$85a &P P |$X8vAʾ 魾|$0&1fAczA"LVonAy*A*8Ar.XA}Iv|$X738fN8ֽ"l7<fA&\|$*Ȓ'$銽@|$h v(hUp|$XGI|$How #f_*,|$@R~ DC˼1鸼wAu闼0T)|$@I)|$p/pf]f\N ;(|$$|$0o|$XX^O|$X:qOAgeɻ|$8f]? `]a + v|$hiw|$8 B?T6"L|$8 %$,"Al9SfA?$rEܺY#AF6|$X2e|$X0飺DE |$hf<|$8 x$&|$@Xf^# G$G'|$8 ;|$2r_ ,. z|$8C -1. D@鶹1AS饹A76ż|$@ha\PK8A2'f\j 2S|$0|$p#h. ո|$hu|$@@L鯸|$0'sV$AaNhj!WfAI$.HA|$p5t|$8j|$P A|/|$@  ݷ|$hB|$XDjF|$p%-W飷AQ A0-. q|$hQfn|$0q\|$h~L=$w 0,"|$PAfAL$AC |$@&L&鱶W@|$0M0<~mZG 61 # |$0Q |$8(-|$@|$hMص|$8ȵA |$@骵AGU1=QuufA;jujA&ho'|$h+f|$87|$pAZ|$0^QVrIAthI !A!$"&|$X\H鬴A vAb遴|$p A;Y vA`B8='1|$Hf^|$P3|$8_a|$8| ˳D'.AJ2F `A$r~_釳|$p/|$X!/|$p^A AwD|$p=8fT|$p5W7A||$8xh1fAMcEUϲ|$P"ACL|$C|$@隲ADk+fa SSC|$hSD|$0=@|$X /D|$X-JOJA(JY|$8Nڱ@̱ 鹱|$8 NBAlA;9AesOv|$X&lb@|$@ L1@9/|$8|$0>h f]y$Bް|$X00|$@AU鰰馰A鉰M{wVL$-?  |$p t0ׯͯA{1 髯顯Az9U|$X=Uh|$X|$@O|$0@kD|$8)A|$X 0Abw|Ӯɮ|$PAxXF$N铮f]|$P[!|$X7g|$D)8)C|$81Av"v qCfZQC|$pnAnn齭鳭|$@顭# %|$@j|$X<|$8B|$H~|$X6QG|$0`-$|$h}JgIB|$@|$f<&j$j|$p |$HAA靬|$0[j 邬. 2#|$@a|$hAQ J|$@D"|$@J~D$8+|$p%2M<B9MeM$9|$X;>A$|$h1=|$p6}Ѓ钫a!v:9f`09V|$H 8 ]" K|$@||$03]|4 3|$hA}#A$b_AX<|$p#KAGA{|$XVi|$@'T4 K _EN=B=$|$h=|YEa"|$X<0f|$P|$P Ʃ鳩 A7|$@ 7醩|$ho!|$h\XЃ^f]'|$h.e|$Xqu0Es%$t<|$p;|$0n |$8&II|$@_|$kAFuf[~|$X.隨A5$KA:QnEnb.ЃP'+|$0i/W )A@|$@ |$X3tAܧJ N|$hn:|$8c:鰧|$0*,钧(A2aCfAOOe|$h&K 0 ( 27vS|$@ [fA[P|$0$>KŦfA^1_BA(Q1AX郦h3 fXZ|$p9[$w?|$X6|$85} $|$8o|$\3|$0Ro$|$8E?>e>fAGZ>`>A| ^]Ѓ錥AD>:A1qA~1fACZJ/L|$@ F $).@|$riD$8l` e|$h9A`_|$X4魤AUM/铤fT+RfA>h Va )|$p4d  $f^A$+AZۣd&pEF|$p5Ѓ鲣fAV(f^Q_ρ|$p6ā||$0.|$@ =VA8v|$P@6Ѓ$ |$BUR|$8A=A30A,|$0)wQ铢Ad,1fWt[KUU/|$X@/4|$8$|$h>|$5Of\~|$8>v||$0Tf\龡|$8 A~vTƒ|$hT"@zA |$H|$8PMeC. v 2(@ |$8 Ur |$pxNA{m~߸Ǡ鴠|$8y韠$|$hx9||$X|f_s$K A|$80: l2|$X'{>~  |$p!@`|$@_|$P4|$X*ʟ鷟8K(AYHL ׃  $v qA)A\ ( c@ Ѓ2|$0KOAd6y v|$@55 5Ǟ|$h7$|$X4骞[闞|$p* vDAPj|$p0u:ANvKA4|$X3L"1f^DAU#|$X(?YW2Н|$@tO 馝|$@ v針qT<h|$04$ 4'6$F3|$p++3|$8S|$ fAYltל=5|$X>\o|$P4|$p.r|$@ B錜i/_pOAxcfa~e heЃ27 |$0H%fAa'7||$X,|=|$hdJF[C鹛|$8#$鞛|$8錛|$0GA=>|$8 nVn|P=*AF/|$8 /r~|$0$ Ϛ|$0GV|$X#U|$@U 雚鈚|$@v6T|$hpV|$hAE1A49$ / Ѓ ]v|$8CH&fAeƒ|$p ??ʙ|$0鵙颙|$@ S|$8 酙|$h_j,!4 Kj|$8'6AUA 5|$8|$8*#$=AwטAgƘF8vq靘$"|$X$;xn|$0>SfAb5(EJ|$0};|$X!j|$XjjvV#E1Dė|$p|$0[B|$0LIe|$0I/|$@$w|$p+e |$hSI|$8`wfatT?5|$@!W0/' DMI $&"AS9|$hOo|$8-f]#|$8ԟ|$@ɟ鞖V'|$8amJ: :hA[ZK|$0F z-|$X1G@|$@|$@Cڕ|$hh?|$8G%M?B髕8A7S4|$8fAOt|$p'\RAED$|$8(_ A#$Eyf͔麔A.#$阔|$8"Sz.jA1I vrG=AK!  $z%AAIfAa~$Γē麓|$p;+J+陓|$HEj~w+|$h'`Qt f\q"7-AOm$9 N QU’=$飒鐒6*A!_eSegT6 "GQ|$0Tvfa&7 B,vڑAB&$,spfAbhp鞑|$h~錑$tA0'+W D|$p'|$0;|$8x$p<& ސ;&|$h"z/Ik|$8v:韐$釐zB#~y|$p%E2UUl zPAWOKO|$8'ɏA鸏|$h%$|$86w|$@ w|$8.|$h ݼ|$8fA^~^T|$hL6+lvA; R|$X="g3qk|$@.A饎A锎|$@Ѓ郎E|$@ u|$P(AUS9?-?1|$XCI*vA>|$@>fA9EH|$hyq|$@ &&鱍鞍|$pCumЃxfAR!H|$hq|$0F1u|$@EAPF @A|$P f>|$ %$ A} D|$@ȌAxE|$8v韌|$@*G~ ASA9A|$P|$p1X5Ѓ#|$hdE|$X6zNfA`C|$p!{A!ANv$΋ċ|$HA| 馋FAF醋|$8vnd  |$X->AT 0hDQw wЃC$?|$0@p龊_ 0A|$@%A靊A ~k 逊|$X6#pAٍ~v|$@PF<fA]<(AfW0A&/{{|$Hp{scȉ|$8Hvt|$8t韉|$p9'G|$0lef[ȌAZN b|$8 ? D&Y{|$8|$@ ~|$hiX@|$@RxfAb?1)pψ|$8Gf]l0 |$0P|$hEgS 鈈|$p6)fAW`AH|$h>|$X=<|gu >3q|$@!q|$H?u1Ƈ|$PC|$h(w陇|$@采t|$X+ytmtZ@A`9sA!s|$8 >cO;fAX; A<D|$jJ鴆|$0Z&|$p/c|$X6$wgxn|$X=-B9D:* v"|$06ƒ|$p(u|$@ d|d > 駅Bv鄅|$X|E6{7Qf\j+|$p8O+ ) |$p'vA ۄ|$h//AkM|$8 E鯄|$X!k/|$p*M hU7 qA@/|$PPL|$8J|$hgw2(|$X!m/|$@NAi.+M'bO|$@ 6v|$0a鶃v\3*w 鎃$v si|$hw QG\S8AX!A_9|$8q|$0]$AM3AIBɂM|$hmyMAeMf`|鎂rpw Au AdM]|$p/.f]FG XJA$ v|$X(|$p) `j ƒ|$P= 1骁|$0%C= 銁|$8 $g|$8UfAI/>|$@z|$p8h|$X/ |$0H'|$Q||||$8|$p$ ALw Wa |$HV |$HA t5 錀A-G|$8f`zA; |$hrHfAH6,Aa;D|$h]!|$X.- z3 |$@0?dx|$h1xA[oAt1|$@ D@v'A|$hMe|$pZ6ZNA|$X=-!)`|$07b|$X+,b|$8M|$hlM|$PAM|$PM~|$~>|$@AfAN1{j {PAhPPz|$X-'na?|$0F@fb|$hb#|$pv{z{z>k|Yz7A_|$81zz&|$X7CAFs@|$h!ӎ:|$p,v|$@ yyfAT*A[|$ |$X0fAMOhyAR=1=Hy$ |$hy,YfAbM|$huy|$}$ M|$X/Lxu2'Ar@|$p*@|$8/xAE9|$8%9|$@cx|$X-%Kx|$hOAD Q|$X&%j|$@ xfLЃx|$0;6|$@Ar|$p-\ (wfALf`ufAYuwA\|$8w|$@jw`w|$0^|$H||$X/>w4w |$8  |$Hw ~|$X)}~vfA?fA]|$8|$p'/vvv$vwvATFfA_ bCv|$X-q,%v|$@# vA{DuA6]T|$hHT{T1u$|$@C|$p'`KuAJ}u|$H?i _u 4WO|$@ )u Ѓu|$8RA_&S|$pV$>|$8tc XK|$8KAEt$ st$|$8St|$p7?u|$X7*u*tt f|$8w ss|$8Zs|$8wxs|$@s|$@v sysfs|$p$Z|$XAe$0e5s|$p.w$ ss$2cA@CCr|$|$@rv rvVHЃrr{rhr$Pr|$X!vf_:r0r&r|$p;S&r|$*|$p+h|$h0qqq(Y|$8t qqqUoq|$h~k%f`f6 ARh  (qf`$"|$p%vaqA_ pA+* *pA?VHA:p }p|$hV|$p):mTpJp' IY$8Y#pp l0+o|$0]^$- =ofAC|$@ Eoo|$@N]1fhsoioAhAvh jh?o7J/0|$@0oAK/n Ѓnn|$@T1|$Hn n|$p FTvfAbnynA |$p%$ 1n'n|$hf n|$8fAbLA9vmmv|$X&mmm|$86|$@hh|$PhAtWmMmCm9mA)v|$X,vmmEmllllAY lfX'6|$86lllulelA^|$^FlAZ_ 'l!?w|$@lk:kkqAqfAbkkk|$pXZ|$@=Z|$X)NkDk:k-~-|$0Y- k|$8j|$h<|$X*u jjj|$@fr|$8?rj|$]%1|$8tAEe|$X8P|$03Bj/j|$X%|$X>fAYwiiii|$8p!]fA`OA6;i$(|$hts|$p"J|$@Si|$hXCdA> dc|$P@|$@i ihhh$a0hhzh|$@hh|$p vYphfh\h|$Hf>h>hfhhggggg|$X `|$8 gggggg|$p4e:Q fg\g|$*=e|$hT*g#CS1gff_>|$@ u>|$h!Ԑ|$p8TTffo@|$@wfmf]fA][6AP6f,ff[f6qpfeveeeA9S e9$e9AHxe4$^4؅$7e|$@%ee|$8* edddJ<'d;|$@g;e|$X$(|$pxqd|$8 )4AUd<Bd$ 33d$ d|$h4Rc|$hMH3|$X;|$@ c?c11AS3E+w$^cTcJc|$@8c.c|$X:Lk@k cc|$0:T|$X=5߀|$ȎfO?v|$@bb|$X*5$4|$X(1|$PqbjT|$XSb|$p>;AOv4b*b|$PR=|$p%b<RU|$0$ۣfAEУa'T|$X'TaaЃafWc6|$0})6Aq |$00|$p#qMa$}6|$pӋ|$8ja|$h*<|$p;;|$8ef\O`$3 .X|$p4$6|$hRwp`f`$1 R3|$p(4`n!`|$X7g< `=C_A____A_0|$hg0faA n_AB]_S_|$p8A_?A 7 '^fAPO^^^l^|$/>fA[n,Aѕ$٢fAQ΢p^*A@E^|$83^5 ^fA_O ^|$p,m7zm]|$h[=|$@ 5oЃ]#]8I?f_T8~]$00|$h.X]A>$A }fA\rЃ ]$3|$@\<AH\\fAIƒ|$@AA.\fAaJ0$ ?fA_|$pA<c\|$Ho2 6\|$hB=AD|$@!\1[[ vfU[[[A[[|$h%/S/|$ y|$XGyA>A5R[|$8@[A[B7ܝ|$@ѝ[[vZ _Ap  s$Z|$X:AXZxZ$l r[L\[ S[z?Z5Z+Z vAPZ Z,YYYYY Y|$@ cY;YYuuY|$h7#Z$ZAAuA^/Y%YAM)bfAabXXAX|$pXnX XVgXX Y|$MY ^ |$p}$|$P7X X`A{`A|$0}W|$8Y [v|$pWW$wYfA_UY|8uWkW$WALWG6W W WW|$X3P q1 VV|$hzV|$P  gR[VVP|$8a|$0pbVT|$X%TAV7V-VVfAPEALAUUUU|$0,aBU|$09|$Ha|$8u UU|$@I yjjXVULU9U|$h!f] w U|$@ At|$HTT$ TTA/v|$8 T{To6PT|$hP1 fA]l|$Xsl|$X=hlTT|$0?|$p2n|$X>n{nXv7SS|$p9 SA:xfAVf|$hnf?ff[+f|$@HSAZsu"S|$pSS$ ]RRAJA/R|$8@l R$ {R|$p56|$h[|$p4ЃTR|$h[ \|$8\REEA*|$pDQ AQQQfA@ƒ|$@ u,QQA|$h<cAc|$8cfAZcfAT~|$@ 3Q)QQ!Ѓ Qf]P|$@P|$X%f\|$X#\P$@.D|$X9#D(D8vLPuPkPcXPNP C( /P%P P|$Pm`O|$p7 A#`$`OfA[{|$P}1tOjOv$OOEOG5O+OOOONfA[UIU8U$#<A(|$0,NN N|$p)vSЃsNiN|SN|$hA84N*N T|$0WM$|$8=VAQ*|$p/|$Pƒ|$P%|$8MMQP$= QMGM=M3M M|$hdM|$X5KKAAYf]$/V|$X0KLE" LAMA|$X3w|$X0^LTL|$h9|$89AeLfbA|$@K$=v$wKK KK|$88v|$X2K~KtKjKAЃZK|$Xv|$PCK9K/K%KK|$hQSPwJJAC0<|$X6;A)A7A5|$h{(JdJpRA fR~F|$PuFLJ|$p,/?fV>[ E < Jfa Em|$p5VIII|$?|$P?|$HOIOIxI$f3|$@8ЃJI|$h7A .I$I|$0aGI CMA9M)HH|$@K8H<|$8 |$X7|$hpƒ|$X%8,PH|$pA-Ѓ5H+H!H >|$@>HG&>|$0>E|$@%$<G|$8<fAEOmvAGvGBAA|$p2|$8$ |$8 H$ 7G|$h#2<$;K } FFFY22FA55$m fFT?4?K;F$n @|$hyAKzA/V$$ %$ WFeƒ|$X!fbE|$5r5tEjE8?)|$0ZLEfY  SE E8a-U-Dg DDDDDDDDD~DtDd.r |$@A-@D6D#D|$hN1FA-D|$pQC|$8.|$X)|.Ah.\.C|$p83 3$30CC|$P|$8tA2ZCPC|$8<AAC|$8.f[)'eB|$b)*vBBM<|$PB<BBBB mBa>kЃRBHBAf-$8 s-y|$XCdAZAחtA|$0J1|$8,eeAEAA|$p3}DA  <t -A #tA=f`=An GA=AA%|$0:!v A@@A9f]нǽ@|$Ps9|$PO@AC|$XA@@|$p/|$@L|$p&LA>Pv|$0;F@<@6=k0@@ @?; (?fA:U???< ?|$8Bez?p?wS|$@ vLW?|$piL4LA,L$qK? ??>A#Ѓ>>>bMA<NM^>|$8TbAYvc>~>t>|$hWЃc>L vAY@>6>mwr|$0VM|$0SL L =a|$hafABa|$X8aa =|$p/==|$8:w;JM|$ 5MA+Mh=^=fP LK9=/=%====<8|$@e|$X>e8 8fAYt_k_77X S*ST 7A1Rw|$77|$p {7|$8|$ ^7T7 A7Jw4B|$@BZv 77ABB B6666AJJJ|$0GJD6w6|$X8.^|$8]AAE]]56AnVAA WVNX55qAfADCA|$h h?|$8bv)5555 "P7 o5$M|$X+ЃP5F5<525(5'P|$=PxP4444 K|$0RJ|$hJJ~4ZUA]U|$0R>]|$hzU,E4|$HdL|$@(444AKS Kv|$0z33=3fA^$u AYL3Ad']AA<)<L|$8ЃU3$vS:303WJ|$p.BJA32|$0<7L|$p!L$KK|$X@K2f_?I|$X5IA?HHHl2|$@Z2 li;2|$0M|$p.2rEr11a1|$h"wx-R1Eu,AJ6^v|$0At1j16^^B1/1%11110Q,Q #Q|$p.g|$ f|$8rflЃ((|$X B_UN^|$X((x(n(fUV9N(|$0L|$@,V|$h9XV|$p&(|$hLq|$heqRqAmHq'''$__W_'|'|$p)$b^'|$0] 4'*'|$0Sn$|$0Kk|$p%k&$w,|$8C2vfb&&fA^C&~&|$8vf&\&R&|$0Kw78&.&[^|$8&Aoƒ|$@u|$hz%%w.|$0OfA_u|$X%% gAg%$"p%c%Y%Jhg=%APA(%%|$8aofAEZ$|$X7$$|$0z |$X0$$$$J|$85EM|$H$E:$$R|$3sR|$8DhRUR|$@##|$X2YRfA_NR|$@ #}|$X}#|$PL##Qo#wD|$8 {fnVfA^ƒ|$X0t|$8-###|$X5ZdZ|$8 ZCZ"$ wfAPe"|$p$(eAie|$he|$hvR"y"o"|$@4PfWuM"C"|$h 'Q|$8P1P|$X>PPPA!A]!|$p/w}!!UXb!!!{!|$p\hu]!hJ!@!6!bA8aaa |$pj$dj?j|$8j |$@  d  gAgAR| 9Z |$p>jfA3ej|$@2 (     AuZfA]QZ|$PfAaA |$@C\ w50ytjw+QG=3A˗ |$@ |$@vAA  |$8EGxndZP=|$@ w/|$p3fAHuBH |$h;w/|$0wb$SAM@6#P$ \ U      |$8 m c Y O E ; kv  T  |$@A$}{|$8    w m w!$vAQN D 1 |$hDyfAEdfA!F|$@1 }s- w"|$hpwx  A|  $h d |$p,l@ =vfAX  T  AG|$X8#|$p       | ||$@m|V a|A[8|A = 3 ) f^}As|mЃ |$X?|$h|  ,! AtnzfA5zz |$p0|$@C{|$8,d D$@P F < |fUk|Ax-|W v$fR|$P$tx=x$"xAAxfAcwfaw|$8 w|$@:0W vF|$h|A>||$8g b |$hQS=ZoP|$p(~~0 AZhoe[o|$8Mfn|$@[n2Q |$p/)|$8 7|$0jY v|$8|$p1 {|$X6+|$8  RH5${r|$X'm |$0? fA_-|$8.$1|$H$w8zz|$@hA`W |$8z$V{|$p1K{  $ wo|$X=TB#5րkA="KP}t8t|$@#t|$p7||$@tA |$hUQ|AY fADv|$8w|$h7p|$h#o)zBAzk|$8kk|$8w!vAfA` A z@t+, rUKA|$p2to|$8Ro |$Pg|$8 |$0DāA>QvA=\|ywkyKy|$@6yADLB8.|$p-6 $ jA]i$i|$0]AKwFi|$X2iЃl|$pZG wqfARO+$ |$@|$@v |$p"|$hzwAAcƒ|$X3@$ /I?|$PO( |$pjfAajA9j|$X!tjhj|$8w"$U {q|$hWjqS|$pC |$hVj!|$0WwFfA:j mj kqj'$!1|$8,si|$0.w&$wA#F<|$8kAmkA>jt|$09w|$0G6AA,AD|$@Ammtf[9t|$@ DvcYF|$X5$/#$ZV|$@ėfAO|$X0Rr7s|$X-"ss`$AH>AdAAY~|$h ~|$P~ w,q1v|$p|$X0w6|$%y|$hIy| ZP|$p4ɕ11! "j|$@A?ԖLv|$X+7}|$8!~t|$p- AX|$hb-$=k/Qvfa!Ѓ|$H[|f[}}|$@ {}fAVp}jw{F<L AA:w:|$@|$XAqA wH|$P} R|$8Ck7cYw>4*wJ|$p!v9w!A=wD|$p+ww|$0>w<v*|$ w#WwnfAY~]|$h;wV|$@Z|$@v3AHw#%w4*  wcAwSvAv/Jvqv= A+v;pf\RH>4* |$P!vAw@A#|$X3vT|$h3w5w&v{qg]$E;A=w|$X2#|$8 |$X4$fws|$@w:|$hM$#t$fAZ~!A:v_wmc|$@ wrEwPCw> w6w$Aw  |$8wGf/|$hv|$p yoe1|$PDRH}5|$wq|$p+v+fw# |$hkw|$0:$? e$M AuA$ w"|$8w||$h_j`PFA6wK|$p1w:w2'fAK+|$POA8vf|$8Pv$f`u&LwukDXNwEAqw-|$@Ѓ/NvA|$PO|$@ vp|$@fAO~MfA_5|$X3v$|$p(vv|$h*Ѓe[|$hv9 w <2|$8Lw1 At80wtЃ|$@w2C=GfP~4 w%wjWMC9/%w fAVuACwW|$07wP|$pw,|$8v|$07wxw#v"i_|$0-|$@EAzv|$p-/%wAavfAZd|$P}D|$@|$p*wyfauiwaAv,ANw&tBa1|$POE|$@3)$Uw,w)AAw&|$@Aw!|$@v|$X*1fAZo|$ wV|$hƒdt:qw5G|$@we0&|$0hS|$P a|$X@wP|$X9w]|$p7w8dAmw[AvK|$@ w:w2?5+! wDwAQwH|$@ v7|$p/wY|$@w g]S@6," w& Ѓ|$0lw|$H|At<7pfAw6|$8 v%ЃG4* fA_o\$[_$gwR|$X=|$h]A|$p)Atx|$pv*s~\R|$09|$@vz|$hQw`$` vt=wl'~tj`VF|$p/4*Ah7|$8$|$pv<v4|$X7fAY/v |$pw4n|$p&wC|$@w,MfA^~,hw$4$5|$@ %dvAF$p$b|$Iw|f^ds(|$-w6$u"F v|$h_|$8 'vf`|rh|$X;w, NAv/ 5Av $+we |$0?.A;A9|$@ws|$X5wlWv]|$p"wVuHAaAv'w"|$H~>4*  |$p)wA= |:|$X=w#w4z|$0Dww v UKw?fA`&|$h)ƒ|$puwC|$8A=Ѓ|$8w|$@wrWA@Ѓw dZ|$hH>|$8w@3w.|$X8u'N }$vAFfAap ]|$8wG5|$@X|$0\*|$8waw$|$@S|$@ A0|$8tW|$hRwFw> $um|$@wTAw;$w$AIw|$8|$h($a]J$1weD$@ Ѓ'AUw?w-AJv'$w|$8|$0fwXw8vv)|$H|"|$hvwyof_UKA1'fAE~Vw/|$8) vfAMA}$b|$8fAMFw%$v|WMAw94|$p0C=w1|$P*|$X8|$HfS3$ft|$8v|$0Tw.w|$@v:h^TJ@6,|$8vfAW~|$0[|$8w}|$p'w>|$8w(w$|$X)h|$@V"C9/%Rv*|$@w"|$X1w||$hp |$hQ$ awzYyw#Qv[Q>$&Aw6|$8w%w$ wg|$p#w:w|$htvdA@v^|$0DvMfA]ufA_lbXND:$B"AJww7w%$wiƒ|$8 ^ |$@   |$X5,|$@qVw4$w |$P}ASAwMw;Amw5|$@v$~w|$X9|rh^TJ@6|$8w;|$v* w"Mv|$X1A6V|$h6w+$u!AqvAu{qgAFw"|$8uI?5+& |$p~0 |$X=t*;}siVLB|$hZw-(|$8v%|$@ \vXuka$:v|$0ED:0$k w4|$P~  |rw%|$@ XzE;|$X(wsxw4~/|$8w_A|w8fAXAefAaP|$p/vo|$@|$ wVA[v2ewe$mwXlbXNwj|$p1wPAw,} UvF$Gw1wmcA"v9|wA+G=|$h^ww$|$p%6|$X!wj|$hQw vw1vu\ $|$0-w_|$hEw@|$X6w!A$wB8$  $ |$8A7w||$X:wk:vcwQ|$8w)|IdAv{|$X:i_|$8A|$02 ',|$wu|$05w9Et*|$0-ƒ|$8t fb|$0,w<w!A-wm|$8 w[|$X*w3w!$+w@6,AwMv;@ |$h?;[A}VwMfAUA*AEnXv|$8#VLB2Dw.|$@v|$@wA8Mvbvl5PF|$h'|$8,wK|$8w!Aw wD|$h#w*fA@OA6wv9wWEXw|$hE~A)w`h^|$H"AwG|$085+$ w |$@Am7Ѓ|$p.|$0bw f`2|$8&w!vAf_UKAw!|$@w|$p+! 4w&SЃ|$pwS|$8u>v,@g|$P},ЃND4$-  |$p<Y/4R|$0Ow@ w1|$XAw v }si_|$hfAEK$ %|$0L|$p/wMw!vAd~$ tAi|$8w|$@ j`)MCwE (|$@ wA= H1|$@    fA:A"v/|$8Ѓ|$P~IA w9|$XwA$cv*/%|$p2l|$8 vmwh4w"|$@v|$h D|$8|$XBuk|$XE|$wr|$8wZ|$0@wI|$8w8w zAF?w|$8}sADw2ZwB|$8w);1|$0H%|$@wS|$@vBfci|$pw@v.¿鸿AB駿靿vfAW{=h^TJ@$+!|$8A_t |$PܾҾȾ龾|$htvofAYh靾AvE 鄾 v>1|$Ppf\RH>4*|$hv$ zw^vV۽ѽK v:6 鬽 陽鏽酽{|$8vU|$@vD|$hw,o=ND:A ) 1f`fATG|$8|$p2w]AwJAMw4鬼wqw_|$vX鋼AЃ{q$vbQG=3) wv|$X'߻ջ)%鿻鬻颻J|$X9 'wI|$0YtfAZA +J=B -#$&A@|$X,wIA|$htfAa]O|$0Fv>|$8v$|$hU鮺|$p霺+鉺u|$8$.w}RJXw:$w#vAGfAb͹|$P~$髹项闹鍹郹Dv"v|$0WcYO$w'2( A|$hk|$pw|$havnbvfwT$w=~/%w'r[_UKA7-#|$p&7|$H|$X0|$0A|$hRfA_3շAAwF$v/A?w)鲷v 铷鉷|$X*wM|$8u6h^fA\u\wTE&5v(|$pv!vAD1pѶq龶鴶骶頶fAR5醶|uwNAwHg]SA-w8w&|$@3)1|$PD@;ߵ|$H(|$P !Av6鰵馵wD鋵遵wm~ZP=3|$@$vAC vٴR̴hЃ鮴ACO鏴|$X5} j|$8w9v'H>4* H A_w6|$p-u%Ѓѳdz|$0nA|$8A鞳w]|$H~>Ѓ}|$P}U$ wH$Qw29w71fA`D@!|$8w.A;v1Ѓ|$X6w$Ʋ鼲A髲顲A[鐲醲|rfA=T|$HA9|$X?|$p8z$ _|$hJV>|$h Aw1 ͱ3w;fAK|$0h鬱颱|$p.wB|$@Ѓ銱|$@|$p/uw=Y|$8$v@}#P/woAavi/pwN|$@w)v$Ӱ|$rwHX鹰鯰饰雰~,w$鄰wЃj`VA6k|$82C$vwgD$@ $L3AAwy|$p-wS|$hwBͯ|$8ƒ|$8u鞯锯AvA4u6w*$\U|$]C|$h)$$ |$XG$m|$@ANwMw;|$8&v*$ v%鋮遮wmKv5RH$0&v)|$X;vA׭ͭí鹭鯭|$@v-$ w 鑭1fAI{qg]SE?wj2|$0xuevl $ج1fAbD@Ŭ黬|$@马>閬|$P}<`||$p)wA|$h w0w(rS$>4*  |$8v>fAa$|$@|$@ Ы齫鳫隫wE1|$Hm|$0@w8v0|$8ЃMv|$X68.$$wS$|$@Ȫ:鵪髪fAP'u鑪釪}|$@ kaW|$HO@6,"fAN|$wduU٩ϩũ|$X7v\髩顩闩鍩$X uka|$8]OEAw2|$H|!&%A@ ЃvѨǨ鴨骨頨f_w鋨遨wmcYOE;1K  |$@ [ާ|$@wAKvfa§鸧鮧1fA_D@雧鑧釧}s|$h wT$w=|$8w!fAJt|$P!>4Ѓ"|$0Zw2|$h8w!|$@ Eߦզ|$P}ES黦qv$p 铦鉦|$hwT|$pBsfAV\AC[WHv|$@.$$Lإ|$P|L$c鹥|$X=wA|$X:w0阥酥{qc v [QA wj|$X,vYu v=|$p$w,%|$0Wv)$ |$P:S|$X-w:1|$HD@鶤Aw=|$X9w,除Ѓ釤}s`wCw1Uw)>||$h$) 5UA^AOA7v2c ƣfI-ADv駣靣铣|$hkfUWfAS$H|$0WAO2|$X3v||$hw/A tK$Lʢ/ w鯢饢離鑢1D逢vA|$0_ZP|$X9wA06$wV|$p/w1{ v|$A_w"$̡֡¡鸡鮡餡隡鐡%}|$ZAbFfA<;|$8&|$P\8 v|$0`  A |$X?|$@  ͠|$0H|$@D髠|$p8 |$0_wa wO|$w;w)|$p.v"Xv|$@TJ@6,|$Pw|$h4v\|$@w; ƒ|$p0!ƒ|$hTt|$8tBٟ|$X>w! 鿟鵟髟顟闟A`w/|$X6w(速|$h2w!|$@DbXwJ=A  uNwFAw5|$@tAMޞԞA[w ts 雞B 鈞~ v9 v'O [QG=3)}-|$w@$ wk'wYw/|$@w[fX~*w"顝A6vP1|$p;鉝u|$0Yv-A]w'^ KA7-|$X6|$@AiwsASwc|$X8w"v|$@͜ÜD鮜?Ѓ霜钜|$p逜vrc|$h7wHI?5|$p/w;>|$ wM|$X8w3|$X6vA ݛӛ鶛鬛陛|$*w\AwB$v+fRAf\RH|$h%6|$@;fWzf\p|$h wOAw?|$Iv8Κ|$X? ufX頚閚|$@w4I|w#n'[QGw(At"/wAw $ۙљǙ|$p#ƒ|$8tKEwC顙|$@ƒ|$8 ƒ|$purh^K|$weA:w?|$8,AOvk |$h"wIw7Aߘwq|$PS|$05w$鹘鯘饘|$p6wu|$pvGwIvA}w<|$@f|$@wIЃPF<)|$P|$X+! חf`v{鲗|$8w:|$h%Ѓ |$h=w6v'0ז͖ÖAw6|$X,v/w雖鑖釖}si_UK|$8 |$8"j |$p)v ٕϕŕ黕鱕|$pv|$hl鐕醕wgn|$@wCv4w"|$89v7B8.$ Y|$p wOw6|$8u/鶔|$P uAw鑔釔}|$hpf wh|$X'wNAMfA\~3 /|$P} |$@ ؓ|$X$ƒ$tw鯓饓雓鑓~tj|$@ wkPF<2|$8 A)AFwܒuɒ 鹒鯒1fAe陒 w%|$H}递vlb|$@S|$07A(|$X0|$8 UّvCw;‘AXw\|$p9wKfAT~D|$@ w3Aw鑑金itj`Azv0G=*  dw$ݐA5̐|$@麐|$P|/$v"|$P~鄐zpf\RA=|$8 'fA\v |$8we|$p,wN|$pw*1|$8Dۏ|$83w#Eď鱏駏b闏鍏A7|$8Qn2|$P VAw7w/Wv֋̋‹鸋鮋雋鑋釋|$P}>w6Le[|$@wwB8.|$H|<w-A/w'؊v~M齊鳊驊|$0Vv|$8鈊~ w;f\RH> $9"|$@ wQ1|$P~|$X<҉ȉfA\(鮉E陉鏉酉|$ usa ux|$X'wq$6 w(w$/ Fvp|$Xv_l$` u:w2ֈ̈ˆ鸈鮈餈隈鐈醈||$pv%wcPF|$p6w |$8 vAO)|$8 Ѓ~;* v>Kw#A χ|$@齇骇頇鍇郇ygv;+^TJ@6,"|$@wD|$h^v= 1|$P=}׆͆w&"鲆韆A鎆鄆zpf|$XF8wzf]j|$8wOANw%v|$%A ƒ|$@t|$X|$P -Aƒ|$0t|$@L~B~8~.~$~~~A7}|$hzw4|$X,v#w3}}}}$w>#}HwOfAC~>|$;w7|$0f}AwmD}:}wv|$@} }Av|$@ ||fS*w"|$|||+ ||$0>wGv8w0o|A>|$I`A2I|?|| |f`YwJow8|$p$w'|$8w v{{{{{"U{{{{q{g{|$p!v vJ{@{6{,{"{{{{z|$h|$p6w7A w1z$ wH|$8wzzv.|$w$1|$Hwz|$X:ez[zQzGz=z*zLzzy w$fSyyyyAJyyy|$8 y|$@vx|$8vg|$p)w?/u"wYyFy  x|$h4|$0GAJw> v9w|$PFY|$8)w?|$8w.AGw1wwww w|$X=w`fV uB|$8w;Vw$-!wAw9w/w%ww wvf8~5 w#v/vvvvvvOvv|vrv|$p$w [vQv|$X|$@#pQSpp?o]v ooooooo}osoA0, E |$X/=o,Ѓ.o$ooofA\w|$h.wNw<}-|$H}&nnnn|$X5wnnfA`ƒ|$X5u|$p"nndnZnGn=n3nw.wwwn nnmm$v|$X'mmm|$@ ts|$X?m|$X;fAPlAw\|$@vUymR|$L&|$8)w}|$p$wL~AmP.m$m|$8 mmAwIkkkk|$@wA7kkv~ kkfAM1A5v!9vATgk]kSk|$@w6v$|$P}*k kk kkkjj$M jQwNjjjj/|$p3vjlj|$@Ѓ[jQj$wI$v2fb,'j|$0%wjji$wt|$hvi/|$8 wxiii|$8w;$Fw$|$hSwzigi]ifau7Bw/Ei;iv ii i|$P}=whh$3 hh w, hD $AhwhmhchYhOhEh;h1h'hvLav:fAb ggggg}ggg|$@ w Y vgxg|$P*ƒ$ub PgFg$Wu5|$0yw.gg|v|$@ffffffff|$Xv!|$hkv|$p!fffAMpfff3v$|$8Lf1|$h$:f0fv f f^|$X%wze$aeeeeeeeIepe|$@^ewAaA De:e0eAAe|$X7v2Uv ASvfA]dddddw\od|$@w{wigd|$@w>}/+vndddZdPdA?d5d|$P|Add ddccAJcc1D@cARcccc|c ic_c$Jc{7c-c#cAЃc wrAvXD$8b~!|$hw|$X0bb$wwbbb|$pw#A1ub|$0%cbfvRwJIb?bVwAv'bbb bafUS\$`l$(DT$xD$,1 |$p .|$8 f]Q|$p|$8%|$X\h:|$hg*Z |$@޴1ffV A= |$ |$hV5|$0[" 9$'T|$*kv|$@|$hn|$dzAh`|$p E |$@ +|$82<|$0cABt|$ѷA3MAbfDswX A< M!fAa!80Ae$ *|$p"\ S>A[vj= ӚZQ }dv xfTA 5|$X1(|$@ N|$X/rfAWr v|$H fD|$p }|$H.5_05>c|$X4|$0g|$X.|$poB|$@OfA`M4|$h39Aw |$h;(fA Ar|$p.#w|$X5|$0[e|$X0 |$p,fZ"=|$0B%c|$8AAo|$X.|$@ O|$0L|$h}$-l1|$@|$@ EAc/|$p(DAT`CfA\Eb |$X6)|$8 f.A |$h':0A5A}UQfA`ld|$X5|$8|$0GAT-4|$p(_b y||$0~8wfA`AW$e&|$0?:0U$Au|$8A9 |$p/t DfD|$0"wqfASV Af8|$p,I1dK|$XDtl|$pl\yff.2TfA`|$h*6!|$0pCBQfAN|$X1=|$X/[]Ð |$0fDw<v:fD$4'M+n|$8^AGO<5L$@WDAB|$p[4#v6|$hrcD|$hJ|$@ |$$=|$p+Z|$8||$@dfAEE |$hA.ffA_e|$p% A|$@fDfAFY |$0-w$f|$0M5~ |$XCu -AJwUKA8Ag$ |$0.$#*|$p1AC fDDL$ EFb |$@ |$X* |$0.4)|$86/A|d{q+AfAS |$0N a'|$hVZAAFIAB'|$8ABE]~h@(|$@H|$h~,$z+ D$ n@|$8  y|$X92|$@R|$hr&_|$P|$h 5 v|$@lbfDAAUfa5 `$ bfA`|$PA fA]'AY*;|$@X~|$XEfAZ!$a|$hZ.|$@ $ mA1[|$X&|$X 7|$X:o\|$X9f|$0h|$p)a |$p#<@:1|$8f.|$8= |$0;&w|${qD|$he$!|$p 0|$p a|$X'Aw f.A|$0HA fAV)fHY|$X5PlA7/|$h,|$pA|$84rfD|$X|$@&|$p9(|$hwC6,$|$p7">|$X?#f$rA@͐ AA u'Ak' ufAk& TAD$ O |$hy06Aec|$p3$p|$X?" c1|$@H |$X L7AwVoeffACL|$8|$0cM&|$p"9A|$X1}c@|$@|$X0`|$@(A_Pql|$8 Ѓ@|$0d= fA[&$A=@|$p1@4h@|$p, |$X&Aur<$#.AbDfA^|$x<|$8F|$0M |$p|$hiA8p |$h A&)+H@A5^Ak|$|$_w8 A;|$p 9#A: \|$p.v|$hYyo[AJ |$0V8&C CfASƀC@|$0?Ew|$@ |$0AC,1|$8UZAY |$8-/|$XFt"\|$h'%|$X)|$hg|$8 fAZQ'9 z|$huZv |$p1^A'|$0;||$@c$=|$[ +fA[1  g'ACj&1A<A_(A;,V|$03iAh@A G A>K?:|$Hx;|$83|$&$A9@ƃ|$h|@u |$h~cu|$X,AH6A?u<5 OoA9D|$@A4OH@] w"|$0p|$@4AP$ ef3|$0,r  ggf. "*|$hxbO$ p|$@ȒAG\|$X9 AA4|$ 7a)]@|$X6.A!|$X$WN5 `-|$0OPA9Ne|$8ff.|$0>$P 0|$X .t/AquALAYA3 1|$p;0v |$X(H AD!gy|$Xi|$XZ6w J@@|$0 |$h |$0d%|$pFI}=]X O A6 A>w|$hv}s|$0A<|$X0BA*DA +S>A{|$p2 |$X-) 8Y|$hY fD|$8 AH Q =|$X/^|$8jrfDA |$hT/|$X%Z7/Ѓ:A+|$h#2fA_2|$hV|$XC @|$@A,v|$p|$pn[31A>|$p36,|$8@|$X8w$w f$AN/jSO|$ptA?f\|$hRj,f v|$HND |$|$PAw|$X`xWx@|$hPifI"|$X4=$!uZAw|$p8|$hr|$H|$@|$SAQp$S/A<0S|$8Mxv|$p{$$kun"|$Xa:A||$8 S+A DPfY:P >Z|$P"EAw;xt]  A3U|$hvAgwD\$@E|$v_fA\/NvAaW|$h<'N w6,A2 A|$8v |$07B<aw|$p u|$X*_ #A5 pfX4S v$WH>f\! ?A C |$80|$X;O|$hw  AWA]v|$X0n|$8!K JT*AmCA @@|$0vifQ7p |$@z |$8A |$@ |$X,2$4ADZ|$X*qqTA$W,T$PAQ`=gA|$@sA$a YEGA}u\s|$8|s_|$p6CS5f_&|$h0+A] k2pxAHfxo1 w'|$h:A9\tdǸn|$p/(%|$8S$BLfA_cq|$X; E|$P: |$0(]!|$p.fXa|$h9DA'|$h6G=|$@n|$8 4Ѓ~f0$|$X<`1M|$h(=fA_g)$|$p …!!A[t |$@{v|$8|$X!w|$P*A|$P$)fAaG|$@|$8 5p1wApi#c+|$8hY|$h,.< 2fDWALAT!|$p9i z|$0`fbO &fKg4_ ''|$@wy\R|$h%%)|$P K|$p4q|$ˬA|f.|$0}WA&'A|$hI|$htz]w |$Pg]|$p8 .9Hw svfATf|$X8zf`=|$0lQa$ |$h."Aj v|$p|$h~q|$0D8A2cxA_|$h+fA\(0A'jh?Y4 |$0Q -AFfTA4zt,[f$@fP{|$08)|$p7a+|$X8fQ1 |$8 A 0|$X5ya|$PTOAj'|$hrV$ZAd|$QE|$hdk-|$0Q-f_L7At6j |$@% ]9v/|$h DAfat|$Xx|$B1 |$p#i0AokG|$8x$K+, |$hc>OIA]||$@Bƒ|$@u fAb'@+]^)fAaa ,$ATR|$h|$zNf DT$HE0iA |$Xw |$p;|$@"D$8AY"|$X=[|$PuJ|$@DD1Dp$lA 7fAMIM|$@,D |$h{ fAb}AP A:.$y y|$8ބYk|$8 vf`rh@|$0Ljv|$pA7|$hHAT/P|$p> |$p##u]fVa]if`|$0"T$AAxmA8fAYGz|$XAdA$<$R=A_b {|$0Sʫ|$@G!$c@|$p)|$X4P$|$hV|$8̆|$8DAm[0f^!Ѓ$„= 1Q|$@6|$X(|$h2|$8tSG<AADA>A:w|$@|$p)fet;9j|$8.j}j|$X,Z|$p'FCC '$LWw|$XAA|$@tE fA^|$0nJzxx fAYΉ|$p8fAR$Ic|$hD|$X?/$"@A.A+ɿA)髿|$p3i$6-=Sv c|$XS|$p u7-|$p7|$8 K$ uA5׼|$@ |$80$v鲾fD|$@  QfAVP|$80W|$p/mAf#` Py=AB=$`A`|$@rDAil |$p/E|$h:}|$xί 馽f.|$X#'|$8$OUB`|$0%$!|$h>|$8:q$pu!|$8~-AS|$0VwAOƼf.v|$X?颼AD$8Pqw |$PpfAs|$PEPS2|$ho"v|$Aa |$X-m ;M|$@髻$ |$0 B|$XGfAW\n|$p($S|$p#<|$@ (A\ |$X(MM$#AT|$@ɺ鿺|$XAta MU|$X  TE 逺|$@nA |$@F|$0sX;|$hk+ j% ;[|$X80[|$ |$0?|$p3Ok$u|$@j鴹|$8HR|$R鏹 |i|$X3|$8";|$Eff5|$8K |$pnJs Ax|$h9|$8)e~ ЃȸA@$c }u|$8ru$ |$P|ta|$pAj 5|$ f++|$$35s8Fw6ܷҷ|$X鴷|$87 ;|$Va |$ = ЃiD1QA? ,A |$8#FC1|$H|$@z|$8NAʶ|$@鸶1fPD馶ARK鉶|$X!Av|$8^T|$P%!$U gW|$p6JAis$# vfAX@|$X%v[Եʵ|$h1!fWq[AIfE鎵}v f5kaJ"M8r|$@LS.|$p! "f@J|$8 vմ˴T鸴鮴餴AR$釴"|$XN|$P+oA|$HOD)AZXz"ӳ|$@鷳!|$@!|$81ƒ$?u 3r1<_lL|$88:A C+CojYfA^! AղK^ 鶲r"/A>J鍲|$=Lbi?IfJ|$@P|$p&J|$@ v|$p' D|$8DVv|$hNڱб|$\7A|+i騱|$p10|$8_fAY 8hWU  6AMo|$h,fA[F A SfN3|$@԰$0ˠ|$PʙA#A闰AUIIn|$@ h0A A v|$0nC9|$p)9|$hp|$8=`=|$p1;|$@߯fE/|$0L\|$8"AE 韯|$8K6|$Pd>vEc|$8.7|$h};n|$0KA8|$p-fAb$ AA+;h׮Lv |$PĮ麮l a 雮$[AOl@vfAQkafZ&LA&xGlG7fAY5|$84\$Ȅ|$@VJݭ|$0d9|$g|$p~1|$@t|$H锭E"=fA]=v 6/|$X?ANvY <2 .v $ |$hc|&|$pҬ|$@|$@%"A4FA,0!Av|$Pvl[V|$0C.A4ߵ1D@06v|$X<|$8&$P|$05F|$hu;|$p鷫AC{A"鑫K7;KF|$ht|$0cmAZ |$X,,$aD|$hX?|$X9v$|$8.,@6U|$X?UAUU|U闪-> uAfB<L$uE!|$X#)\ЃA(X<|$p*mAN3|$8W3$9<3|$@3|$@顩|$h_|$X!.\trlA<:|$XCBA|$ ^s|$@: 6& O|$8O m|$p+8[|$h1p|$5p|$@Ay$Ao$鳨|$H7A~vx|$0H(E|$hT|$88 %$nfAg^|$0%?|$p;m-|$@ȧ8|$~8餧AP)Aq[fA[Ƨ|$@ |$h.vYAJi( v|$H:0fAb|$09LfAb||$X9:|$8W`_k J_ 黦AIm;fA_P|$8(h 1|$h:|$8% N|$X+1fcb|$hwЃ(k B,x}ZApZ|$h/5IAuf^tArT6|$X9隥*eRkv|`VC|$h"%%bW={v =$ =|$X5#飤AA%!$2{/A?„t AH>A-(T|$8T U 7|$P7|$"|$POO龣 陣AoAb5fZcAfA^afVƒ|$p+tA^I?f`!ʼnt AIޏ A/c$|$3:xp|$p,Epfa;!韢|$p1A!Z|$8"wSoeAy+|$XfAaj}A|>}|$P@|$X0fAT#d|$X&lЃ סAn麡|$h30~||$8鑡Sr<|$0?SfA\  y. |$E $2 2W&WAMϠAB%'"Zw閠醠|$h`)dh|$X)2J74 v|$X9|$hsmM[ZM|$X38 A͟|$@4X@ L@食f\*[|$p,hir/|$@ W|$8o|$p5;b vA  n!fA`.N|$@fA\m$齞|$P#1<閞|$@I|$p4E~9AafAWC!('.W|$p lwAx&AFfAd|$H餝|$hf 醝Ay|$0@`|$p0|$H.;?fAY AW,RBw|$p$%w|$p*"W Vv͜Ü|$h,騜|$0釜 f# Ё@O4OQ|$@vAK;1$FOA'+%v|$Hߛ՛|$Hw 鷛$ N|$ps.鈛|$X=bl|$pwA[Q|$@0fB}02|$hvaG4 ƒ|$pt |$@ƒ|$0d62&*2ɚ 鶚A#@|$X"@鏚f3'|$8mЃt|$0n|$8$B|$p*4AЃ+wڗE/|$p'/AIfc靗4r/|$@ g/|i|$X.WA* fALN1|$P-|$H)S TԖAT鷖!Ѓ饖v邖AI,?|$@fBSe=||$P2(AD@Ɲ TЃfAd"A4 /;鳕頕$鈕fA`+|$8q+|$X%@qA/Y5F|$8$A* $Q6,$4-|$X:4|$hn4鸔饔镔|$@ %* z|$8 h|$8 $=7AZU|$@]|$hb8{|$X89|$'AKi?i1f]D@ē|$8#:|$hzA9iA{|$@NNT D|$p*@@fW@] Q)|$X+)|$@鸒s*$b*鑒fAaMsiq9CJ|$p#8A''[w AߑfF& ЃÑA66飑p&p8|$p"-v f|$03&|$8̄V|$@2|$H1  m'|$h<fEmVE|$@vqҐȐ|$@鶐Y 飐|$8C |$8 fA_ Ayt|$Pnt|$p B)6)2A_(}   ߏ|$8#Mv|$X)馏|$p/&|$H||$@z /#|$p,UE|$|$0I :UhE|$@A<|$7yn |$8|$@骎|$8D|$HAQAO6AA" s v$4*Dw  |$81A6`V` A/|$ 馍|$p70|$pzAL63|$h"w_ ЃS|$@5"Al|$@wAiv1|$@`$)3n|$@>|$0If`|頌f^ FpT|$8{|$hb6$Б|$X?<f=(|$84$Ѓ0|$X<|$hd$D|$XW|$8v{v3|$hq3A| |$p0A;|$Pw|$@@|$p,}$}|$P1|$86 #|$h 5|$@  ͘|$P |ъ( 4Alu4鱊$"M鐊 2Atv|$8e[ ,A*L2LY*D`fUe`MmAW3 Ѓۉ ȉ|$p%2vAK霉$|$p0Qƒ|$XQACQSA=B 2,|$0ZAvAI91+A{||$p |$HY|'|$@bwY|ׅs˅7||$hu8|$X#|$u|$8{fA^C(|$8{kA8fT!Ѓ|$ho„{k = ?A}|$X7p|$p3$$  Q0~ C{|$h|0AY'{|$p"4  {|$hgz|$8'z|$8r|$0Drz|$h4$5wAwzmz DXzfU.ATc_v +z!z6f`Oz|$@1ME|$ЃyAN'Do|$T  y|$X%:|$@  >|$h2sk|$@hy.-Iy3As4B;GAyh vyxAS$xSAAxfA] '|$@_|$p#fxAH6R>A,kA*|$@fTq[fA`*x3!|$ha xAg 4|$hD|$0`B|$5$w|$p  wfH1%Ah5f;lw|$X68$;|$0@|$@ٹfAb:w|$X,0 u=k v v.nv4$U],v4|$84qvj S1$?D Dv1v|$8AF|$@yF|$8|$c|$X/H8A$P!uA$X|$p:bV|$0ofAZb|$X?MA`u>uD$P:'uA=/c& u|$@ ]2|$p%0l$^AmJAd9Ѓt|$@t A|$8t|$h+fA^DDbt|$8"A-Dt:t|$2|$P29tA* R|$@Rs0$ sh s nAK|$@s|$0R+|$ 9:|$@PAH[s [&$=s ;!s|$8DbfWI|$HHPrrv|$hrr|$0ph|$8hzr |$~D|$@dr|$X1 |$@o6 >r|$@C4|$Pfbq+q|$p!@ |$01O|$hksq|$8")*A6<o|$ ܭA;nA pK$7nn fAZ:X|$X=hn1 Un|$85&|$hP ^|$pwf!nn|$X7n|$X(Zg?g|$8enЃmm|$05)$m|$X4mm|$8$ _mUm+EmSoAR(m$m m|$X+lllllOl|$Pss|$X8sA>$|$X: _lUlBl|$P|*l ll llkkk|$@kk[ kkkkkAQDAikAHP1|$PDCk|$X%1k'kk kf7A3.7A&j1jjjjjmj#,|$@^A@ej[j1f:0AXc|$X?)jH/|$8 jjAUzE|$8r2Efqi|$pOb|$8b?|$ptif0OA4 1|$@D@c|$ B|$8Bc|$p93Ag3{c|$H$ЃPc$k>R,c"c|$0(z$i5Tbb|$?|$p!>f_bbxbvA^bTbu;b1b'bbbAaaaA/aaaaaT]<|$h! &}_a$ 1|$7|$h5v|$@,a"a <|$p0<a|$`0|$h?0|$8v```7|$hN`fA^63|$0s݁|$XZҁ$+|$@ jB;`Az7 ``|$@Ѓ`SA}S___A=h7AG@72}A}|$hv_$98a_W_M_R:_W2|$X#!2$  $^^^^|$hp/``l|$p'?o|$h`o|$ wo|$pbo o$%oE^2^(^^|$0v1Asl1]?|$85|$hpk]AV_AJ]]Ah?o?AXe?x]n]d]|$hZ Z8]v ]] ]]Ab~5?\|$0>.A=F" :\\ <;u|$8w\ a5 X\1 ?\|$p0-\ \>A\ 1=|$p0}Y[|$@D[.l/vA5[[[v[fKv+AyAY[|$p&W>[4[Av [[A00,ZZ|$@+|$h +ZyZ<;0|$hg0|$p.)||$H||$X*{`{NZDZ:Z0Z|$@-9f<s)Aqy"[y OyYYAH<YYYYAYY$5(|$(|$@ȊfMQn|$p1|$X%>|$p>P|$@|$@9 cPfA]k<|$p:/<A\u[m|$p7PxKOOfAM 9=O|$p#vf OOI9fYOOAx8AmO ZOA]9$8Ѓ-Oq O|$0e8N|$fa]V]=w|$X7NNNNNNN|$|$PȺOfN\NRN2 t< 9N/N NЃNMoMMM|$XEMJ|$PJfA_ܻ|$8&$ƽAhcl]M|$pU|$8sUA'MMCfw ZMLLLLA}M&L|$ 0L|LfRMkM-SL DVfTI|$p%ˬ|$*v$LLK|$X3KKK|$hQ0|$p'30|$@V|$X$KKK|$8UJd kK|$@ YKOKnJ|$@IHaKZ 0|$8 J /AfJ|$8 TJAN7JJ;?$?JJ|$X!J|$0CBG|$Pù|$P Ѷ|$h2fAT|$80v|$wF%JJJ|$h(R|$Ad*|$0N IIR$IAKIAIvICR|$p4bQ|$8MIAp GG|$p7G?|$@G|$p-$;(DGzGpGA >|D2}}|$X&}*G GG G|$h8K #|$8 Z}$}fA]| |J v|$P9FFA8F{vF= y WFA0 N?v(FFFHAW HE|$@ A[E|$8|$@ЃE|$> Ak  sE|$X UEn|$@:E|$8(AWE|$p+1DA?6|AC| |DDDDDvDAVgD TD AD7Dfa$Db C CCm CCC|$8#XJЃCAiH A_, =*fC\CvAEC;C(CCC CvA|BBAU:|$p Ѓ|$hqukBBfZ==AG|$hA";KBA4;|$@;D$8{,B|$X";|$0'BAAA2AA|$8 4|$hA4|$@ AAM5f\=1AID@pAfA^88f:7HAf_քAAAI A:$ \|$p2$M |$PO?$'|$X%|$X%ʊw|$pi@_@U7n@@f:A@1@|$@V2$g|$h9?|$X6 ?v[??AB3|$@3A[ E|$h:S?||$0Agv$??$Po:A90M|$0}B |$hbVfAWV|$@V xVA|nV>Bp>|$p"8|$P|$@ Au7>->|$87ARv" >>(7A7==A_L e2$=Ap|$P=  v|$hj]=S=|$8}7J7 |$8y$ԉ|$h=|$Pg|$8w6B5, +5!55 5AH4|||$p|}||$0?|A||44|$Hz y4p4cq|$h]Eq/qA4%q94 >O$Noe43 {A 33|$p{v33A?|$8NA4Mf3|$@T3J3x:3A_Aoxx~ lx|$X5ax22Ѓ2rm|$Hm2?y|$p9yA\]xA2z2|$X6qf\pR2H2>242*2 2A 2|$@ 1|$811c U|$h;Ue1|$pvfa~|$811A`Es1i1$ ]|$F1fA\C$*PAzPw|$P 10|$XIAi00F0Ѓ0|$X;o|$8ZQ NfJ:'d`0V0A|$p7Ǭ|$@C;$0G 0b|$@///AW///////1$xh/^/|$X;L/B/8/AdX/|$P)|$X*1[.w4..|$.A3fk.a.W.fAWn 9.fA` J|$p I|$@I|$hsI,Y--|$8Ȩ|$p)-1D@-fA[OZ^9ZfA\.Z-0t-j-`-V-AfU)-5- --|$p .M|$hbM|$pM,|$h}, Lu,|$@ ,|$@EAl,^A|$PO?,5,AJ]Ѓ,,Aa>K|$@3K+A|$8F(|$p)ҥ|$X4hR|$h5G+ w%$wc+Y+zM|$@>+Q|$/tQ|$00"QPA,P|P* f91V|$*|$0***Ѓ{*]A^*A4 A*Ѓ/*ƒAK#9|$@ .)))|$8wWg$g)|$hFkjfAYkA{)|$04&j|$8jfJi|$hdiA?)|$p,hAAh$i|$0#i)A,b\fCN\( 6iF i|$hZhQhIhh( y(|$p/[(Q(|$8< fA[%((|$8Acq&'|$ fGu5fAS~.Efv|$8 '''Ѓ'y'AnSMЃ]'{$D'$  XX' '|$0\ADؚ|$8&1MG&&&&&AI|$X%q&$V4vJ&@&$hZ|$heE|$X8$v|$hJ%%|$X:%f|$xC|$8/% v|$p*%%/Ev|$h|p%f%\%R%?%A_.%fU|$p7%%%$1v|$@$$wAt$$|$8xE|$@!w|$8Y}$fAC4|$@f2|$80|$8%v|$p4;$1$'$AUy|$h\Ak|$hTV&C|$p(w#z#z#|$p u##{#q#$w(w#U#'wAh<#2#g#|$O|$h:"|$ha""$]g^"E9"$|$8ڠ|$@Q"G" |$hPOfA`h|$8!!$vSd~SkSA!{'|$@!!|!r!h!^!fAWl|$X2NЃ6!ADAzک!fAY|$85|$p3oA [      |$PAS=R$F ,R[ Q fAa??|$@+ !  |$h|$p5=||$p>DTC|$p&CC|$pCmg$:A: <|$X<L KfAZK|$X:KK6>1|$03u5ň|$@fZM<'<|$@ <|$h<g]SAJIfAatI^I|$8SIAEHwA7|$h|$h |J|$J|$X;/p|$@8|$98G3fAUw7  PP|$@P|$PTP|$8 |$@III A|$N|$hN|$8*lN SNA\C|$XG|$P6|$8 v~ ЃAw $yfY}(\$r DAK>'^3A)$ O tA#yЃg !K$ Ѓ4|$X9wv|$8F|$@Ѓ|$8xLr6|$@ !F|$h fA[Y$|$@dZP$;A7y|$0) |$8 v_-|$8Ѓ$fAbޭ7r!k}ۭ1ŭU=|$8pfAL1|$P`A'wf A^|$X2"ItafA\O>A5! |$@(Ѓ}"|$@v |$8I٦D$XP߸ n8AXTJ@1fAa*}fV|$@fYƢ|$8AwUAh|$0>'|$p#ϤI 9ߢ|$hfA=Ѓ|$p6wI|$h4RAO_|$8 A[ +|$h؝|$8(+|$p=++AN*|$8*|$8 *A*|$Pp*|$X<$}EfX|$P|$hwrfa|$8m`|$p<Ҟ|$p*-YhvK~t|$p(!AR٤|$@Ĥ5+|$Hӫ|$8|$pp|$X7fAYN|$@ ƒ8|$8+|$D{q|$ t$IQE|$p#$7|$0fAdA|$0N ޛ|$07ƒ$t 5|$0@A>R|$8*J@6 &%|$X9AGYA@sAG_|$pw(|$@ A:|$PզA/˦fS|$P9 Al)Xf[X$ЃA{$VACB6|$09{|$@ ||$PyfAYxy]Jrv|$82($]A] ]$T!y]fAPd]Ax x|$p%wQ|$@ZxAbv |$p/yoAVw%|$XWD|$p-l|$Pl$ |$@  AawfAVwow|$0^ y0  WGpWt.g ] S wy: 0 |$@X$H XX[ o]|$8Z]A0]J G      wAn d |$0(k|$hk|$0/vkjk- )^^       O|$hd^XX%ax j[\ A I ;l|$8 0l(  w1d``O  $X[ |$XH%|$@   Aj`Ob bO E ; |$@{5 m   |$p_SIS.Y/ |$X9w:Y Y  A  l |$8R WATWvfJ7 - |$0[w:|$p-_Rn |$|$h;t|$X8wMf^TX|$0[~XhX|$X)]XFvfP}sAbyV3cV(J@0&|$@w.|$XEWw  Aw|$p-Sf_PQPuAE|$8 V|$X.dSA7PS8(|$XP|$X#OO|$8Ov |$pO$ *Ѓ@VV|$X'VzvWg]SI?,"|$P:|AA$RAZRfA`zZ|$VZZfASXLXf>~XA#[XEX%9XY|$d|$8O|$HmZ-($[A[|$@ \wj|$@ |$0_Zi|$@ Z9pfSI?A."fLyq|$h9dqKqVЃ$4kc|$p#|$@`9q$ <2$YA=tr|$h$ Ac6 |$p+ q$ЃAs|$hr|$Prj`|$h|$@aA9/%9 Aj/ |$hCr|$hA |$pH|$8B>~}|$8i_|$8\|$X3D=3)w|$@w7tv[QG=|$@7$L|$X0p$rwCfQ~3'v!f\~>4* v'6v7A.v'vlbwL$- >4$q w-|$p uw|$hw#dvwv'!|rAw-w%ZwS?5Ѓ#A2w A|$X1f$NzBAE|$hmw_|$@w($wws/W|*E|$X%vwL|$h[v;w3|$pvn.wfwT~vLwtvx_e|$|$hvH@ -fAV~H|$p3ƒ|$@u*v"'v|$hw!|vA;f\RH>4!ww|$hw]|$00vL|$X|$@w7X#w\|$0Gw<$* v%|$@ w+! Aw;tA AwA|(}  |$X9 AHwr|$@ wLA?w4|$X+t#qwYOE|$X73s : A}w&wAjwfS;1AYwYTw4olb|$8wUeHfAca|$wPfw9s( v$|$h+}scYOE;1 !v|$hBw,C|$@v%ww0A;~~i_L|$0>W|$X,wA|$8v*8|$8w?Pv3t%|$8|$h_|$8f_SBvAVqAw|wRE|$@C90fat w|$@vZ|$0H|$hy|$0BfAbi|$8wX$-w|$Ppf\|$hfJ|$X)wm|$p1|$8uj|$@|$8"|$hhwf|$8w>|$ v-|$pw|wvf`sifbd|$X1vS v_A7-)w:Ѓ nЃ$w?v0}|$X8kaWMC9/%AR|$8wZdvh|$l|$8XЃ wl?w5~$w|$@e|$@w}wB|$p8w;|$X9w|$86,wVA vP 6wAav,w$Avv|$Pnlb|$|$h_|$PAyw4$}v |$8w3 v!|$p.v|$X?|$wIz=bXN>&v0j#1|$@ $ ƒ|$;twxnN[QG=|$8w'#$|$ |$8|$@wq|$8t.ADA3v?|$8 u.A v(sAt,$UKA7fO~lAkwA v< |$@vC1A |$p3wZ|$8x|$@fANkAU|$0IA 0|$X2|AH'ofA^|$@|$hv^$w3$ovЃ vfC|$8 |$p64 d v=|$@ v,%BAQw')$ < AQv! vAa|$0_wK|$hw:v(  OkaWv|$<2|$8 c|$PfAWt-A_w'|$8>|$@1|$P |$@|$8AvuAv_l vM f[SI6,"|$8w` $w| |$@|$0Iwa|$h2`v*|$X1v#1 vyoe R|$H~2|$P|!q vA -#w`|$0LwY  |$hvv<Ѓ~>fE.fAV~O|$X?vQv?qgH v|$8 OE;11wZAw9v'v9} |$X8w=|$hw,w e[QGB |$X%ABw vFfO~6|$8w%|$X:wukav3v!)ЃB|$@3) w&|$pƒ|$h?t/wB wAvu|$@wA?w&$vfMJ@-fAWu&w|$8fA_uvw¿鸿鮿p 雿 鈿ru|$h6wL|$p-uE]J%wRfQ.vTw"|$@ w6$w)fX-w|$h^vѾǾ齾w~A=wVA6鞾锾wv|$hawo~|$8wr$w[|$HTY|$hFƒuAw7-#ݽӽɽ|$P&|$8鰽馽霽 鉽ukaND:0& v!$ wмfbp|$pwF鰼w!$< v鑼釼}vdZPF|$8|$@ v}$wifA]~-}齸4w頸閸|$@ 鄸|$@w& wkaWMC9/%߷շ˷|$XI鹷鯷$N|$0>N$ƒ|$8NN_|$8P|$@ Ѓ?,"ܶ|$0qw-xw|$0Nw鼶鲶騶|$h閶錶|$@v@Aev0|$PtdYOE;1' |$pH!ƒuA1εĵ麵$ $6 wb|$p$/ t>w6dAVLB8.$@ $B uw״ʹô鹴馴|$@w=w|$h#酴{qw#1D@b|$X?PF<|$P/|$|$hkwسγijw<鯳vfA`鍳郳wBAEh^fbu w4FKA7-#A3vm w[|$p-wT wAHͯï+鰯馯霯钯鈯~|$X:|$p1wz*wY|$@ wHƒ$t&w*  A=w./ wήĮ麮fW wP键遮fK"|$@ wcY|$@ |$8|$P"A5w6|$8 wЃܭҭ$wMZw3|$P~"=鞭锭銭|$@x|$vx `VL9kЃ* Av9|$0Z%|$8|$MwjAGw!|$8:w|$X7飬ATw"|$8vF{w4`|$p6w7|$P1|$PD?5"p|$L|$XKw ~֫ë|$XB|$@wK鞫YAQbf\~)ALFw#|. wAA v;ߪժ˪Av2w#魪1靪铪|$hw3A|w#|$p(wmcYwO|$@ ?|$X6A@#v3|$8$w-|$@w wשͩ麩鰩馩|$@ v,錩Acvsi_|$pIw|$8H>|$@ l fA^$ww|$8#wVݨ$w"|$hv`鮨館:锨=vRwJz|$X@wW|$P}Fw>ZAw!|$HO:0&Ѓ |$X5w:|$8v3Aw#fR~ҧW鿧鵧髧顧闧鍧|$0^|$hUxfa'ZZ|$X2w`4|$w,|$X-v"|$@  v%$t.Ħ麦鰦|$@ h钦鈦Bwuw]|$@ wLwDAw4|$8w-Fwf-#A|$X6wz|$p$w7AwvfA[¥鸥|$@馥|$@w"|$P~|}j`|$/f |$h>|$X:A?Ѓ|$8w[|$XvT|$0It:|$X4w vͤä鰤B靤铤w逤vl6Y|$8w|$=$ 7|$X7 |$p*fZ|$p!wP1|$X+NwT|$X3wM֣Aw}kwS鵣|$w/v铣鉣uw7mv%PwS@6,"|$h9wN$u:Ѓwu|$8w^|$pv5|$X:͢â|$w|$@骢頢$ 鈢x|$p&w4Iv"fA]~~QG=|$h`w!|$X6w|$@ڡUvġ麡鰡馡霡钡鈡~v~wvdZPF<2AdЃ"|$@w-AMw' }wjv͠à鹠驠韠9w,fAb%$wRuka,|$8wl|$X*v[|L.|$@v' w}|$0Aş黟鱟m鞟dw"v|$h)~tj9Ad$|$0[wwfAH~ffFNw<|$P~+$Ѓ |$hҞȞ鵞fA[AwX|$p8ADfAV$RttA>wnIfAX~S|$X;wB~(A5A,vp|$8wJ|$hw9|$X:v2۝ѝǝ|$Bw\tW騝鞝|$h |$0Ewj|$8wEzv3|$P}*ЃdZJ@|$X61|$PD@"A[wl|$XIfAP~88v$ AՐ|$8$8馐霐钐鈐~|$8Mw!dZGEu1'ЃڏǏ齏|$p4we|$X9wNY霏錏A$vpAIwIAaArЃQ|$8vxv'Aw!)fA]~f~<w ЎƎ鼎鲎騎+镎鋎過wmcYO#<2( |$hw" v|$@׍ č F髍阍鎍鄍zpf\|$8LM|$@.>4-!|$8 A݌Ew>A1t%|$X4齌验闌|$@酌|$p,w|$h-wmcYOE;1'|$2 |$p% fa  AD֋̋Ax\j锋|$X-wF|$p*w&ƒ|$Pt |$X4`|$@wMЃG|$p2|$P}}wd|$X7wD w2t#Au AXv̊Š鸊|$X9w:|$@w)|$P~"陊w0 遊wdZJ@6,"|$0Owq|$@tREw@$w6|$hJw%|$X8w։̉‰waG骉8w&|$Hƒ|$8twM|$ w@Y\!viC9/b v|$8 D$h}LɈ鿈鵈饈雈鑈釈DwACwNfA[.|$X4vPFw,Av&鞅|$p0錅邅xn|$X)vVLB8.$[$- ̈́Ä鹄鯄饄镄還grh|$H~NDww , |$hFwAuS$t?X w-Av'҃ȃ鵃髃顃闃鄃zgvND:0&|$p*A |$@wq}LAt)ۂw|$@ Ѓł黂騂|$XDw-w|$P}鈂~tjW|$@vO= '|$H|H$w|$0SfA`5|$p+wAN؁΁ 黁鱁駁靁铁鉁1|$PiZw>Qq|$@w5Tw##V A,|$X fA[L|$p'#|$@wWA%wGw龀|$p(fAb|waw&|$8-銀退v|$07w"|$pwWMC 0|$wP|$@w?vBA%v<|$X8w+|$P}$|$@ w|$HO|$8wDA'v4mw"|$X2vHpf\R$v5+1|$X!D@|$84|$09f^$tXSЃ~.~~~|$H}~z~ƒ|$X3A6M~|$PaK,~`JfZ@~|$@tq$w,|$@}ZЃ}}$/A6A}A3He}|$03A$-i=2}(}}$.AEK|$|$p&|$X7wH|$8 wA|,|$8wJAv$||||$p|$X)w2tW|Cht8|A<|$0DK|$8||$h%M/{A{|$8vq$wQ|$p5v-w%{w{{Ht{a{W{wE|$P}&$-1,{"{ew#A@v {zzzzfbc|$P~<|$0z+zzzvgwUy|$8fW|$p)!Ѓ|$hB„yyyy~ytyjy`yAZOy s4s*s ssv:|$P})fw!rfR%A*rrrA2rvrrwc$j…tB|$@ v;$Gv$wNr|$@qf7f$~h$qq|$h|$X:wrwKAFw6w$|$X4vzmqcqYq|$hJq+qASt|$8qphwAAwpppAFw=ppAppz|$HOwpfX{wl|$pw[6Rp |$8|$p+|$@ A?p ppo|$p'|$X;ooooooo|$0H|$p1cowj|$@ wP|$p,v?v7)o|$P~$oonn|$X6w-#nEw*Ѓnn|$p(nnnznxgn$MwU|$@Hn|$X5H|$0SOdw8nA:mmAXm|1|$X0v AmvfA]mmmm w_A w#|$vACjm`mfAV% v|$>m4m*m mm|$P|Cw1|$@l|$0[wS|$h2wB|$@ w;llll;llb$Jqlgl]lSlIl6lf0lDr|$@A5tkk|$pBw[hk|$8v|fAR~k|$@wQ|$0:t@|$X5w/Ok|$0`pkfk\kRk<?k5k|$p#kkkЃj jjjjjjjzj|$0)Pjw"yv|$H0j&jwH|$h8v7A2w viiAiiiiiiii~itiji`iVi^w|$@ ?i5il"i|$@ i|$X*|$p#wywg$u]hh|$X4$thhhhh|$8sh|$8{oRhHh>h4h*h hh h|$Xw+gf[~3Cw+g|$pv|$8gggg|$p3w< g|$hv pgfg\gw;Ag7g-g#gggfffffffffffO|$p1ff|$X6wIfA`/v A*v|$8YfOfEf42f1D@!ff w,$. eeeyveefUSD\$`l$(DT$x$A,(B A|$p |$hci $ 8 |$0/$"$|$ph>AW|$0|$83)|$8 []f|$8 |$0l"|$X/ Z  wfAbE7IjQAo|$h s ||$hj|$djl|$p&6V-$]|$hO0fA_VOf^OgŁ|$@Y|$8A#A|wo /U6 fa40|$8@8^a3xAW@eO$A|$8!AfA~s '|$0U4|$X1A|$p5&'fAT?ZA f|$p E8 ]|$h~ Aw8.fAD|$8+$|$881<Lp~|$X+O#|$p9UUN|$@ |$@: |$hKo|$0,|$0d_Kf:7Cf|$@C#A$'fAa6|$8 ƀ+|$0"2q1fA[ fBC|$X7mg|$p1yvf@9/@|$|$0Lg|$6+|$0B<|$@=v r D l|$8a[|$8|$h'0AvrMl]f$ fb|$:F |$(|$0R"9BdU$v|$8ffU|$|$X1x"#?|$@ }f@DD$@E\NfA`|$8w$ f|$0qU|$0I\ 7$s A]vAD |$8QAk|$@ e|$X'R /H|$8 ;ATAԎuA4f[A` |$X4 hfDc|$p+)A d0|$X7cfATtUf.|$h|$6<|$@I'ADf]|$p|$X\|$01<|$h) ^D$@|$ eA U!|$8G w@|$X|$P A F |$PADAJfAX$.|$0(MAx|$8p@t )|$X ;DALw~tfTLTl$8u$6,|$H|$XA,df.A f_A7|$pOqfD|$8kl #AAB O@|$0( g|$p6D1D|$hcU$|$8=1A|TA0 z|$hT@$ /) R%fL@tfD$&T$@EA4f$, E"|$p79,|$hR|$X>|$X8|$QA=  f|$0d%|$X(i)C|$p*n]SJ|$]3=|$8|$2I Q7A PAx_ |$p-e|$p$J$p=:$p%: vfAXndfA |$ >]-|$h~)9 fD$iA|$8 3|$0 G|$X!A|$hye &|$8(|$p|:ƒ|$hsbA[bO@fA[ |$@|$82%i fD|$8IfJWF*|$X6EF|$P1|$@&fD|$@|$0a 5AIi|$X-Mfb |$p2l!$M3|$0AG|$8w>fA^-rI |rt$ AA{4# #KAz|$Xn|$8AAIcD$8HDƒ$!$6t |$h}x^1%@tAKƒ|$Pt|$X|$X |$8Nfe.k|$X3OAv$w0&$ Ac W$fA^=]A|$@Sv F|$XC1|$8:O8St |$p1zBA!|$8>?$AU  A {^An^|$h"A|$h /fAYFyOAafD_Kf\|$hP5fA]PX v|$H fDfAY'|$0/d?|$Tf|$htb|$p0?O|$h|$0#fl|$h|$0@d3K|$p0rAˈAfDA)fb|ƒ|$p&WW$1 }4|$p)|$0@Cg 0|$hr.|$0c RfA])^  N'OЃCa$ 3|$XG|$pv0f$=2|$0ROfFx|$3M D|$h -|$0d_3fA^mPw c\R|$05w|$8+!Am|$X*9OV|$P C5f.fZ. He)A$"YAYtATSA$"$fA]IB |$@|$X=|$PD|$hv0|$0zxfDf;Aq1|$p,CAnj|$XT&|$@ЃS|$p+;|$h_f[`|$@`|$h$ ALA>/|$hI|$X* gS7A2:A |$hFaS3{EzAoDT$8E1u$lT90Y|$X(CA0A4IxA0ٚ ͚tf,A=,AB+:|$0d_A՜|$@!fD|$P |$0@b AfU#?Atv$a A>|$hX1Af]9R|$X'k|$0>5O;1t$8tfA_.$9{AAs|$p2i|$p.A|$0YfAY$AmRfG.4|$jfAW~FA<|$hAPfAZ~AA>,fA^TQ$s|$p#v|$0WMf|$@ " - v|$0f |$X7wk A yGw~AyA|$h |$@ v|$X,yo|$X1_$ (|$h>I|$@ Au fAB|$87s>IE% -AP"Ѓ}|$8J,0|$hnKjA /|$@$3A|$0j6.|$X |{f>/i?FA_|$8$yAS/A&zЃ}# vZg]|$8"?|$0e4$A~X A7!|$0ƒ|$8 Kgo?g|$XA)uA*|$p%|$X64|$hL"fYAj|$X0TG@A4|$X)$fA_2$e|$8D|$0h!A Dt;SO1Ac@JAЃrABT|$8B$Ѓ5W'AAbEЃ|$p |$Xt|$hPAw2|$0W0QAQg4fA`-$.,|$X"fP !1Ql5|$0FjP7~A|$X3A 7 inw |$p'9A Yw|$h* r4|$X?Q|$p-|$hl'+|$8|$X)7A0Ff_ԣʲAoz3 Z|$h5Om  vV= W|$pGA! '|$h|$@ |$hcfA`i8fA<S$ |$@ Ѓ$Ii'Av5|$p lƒ|$X.tF<|$h.C.  Z2@A Ak A|$X3#A:A5  |$p3O3-H|$X3l_@A l2tVfA_A AMu|$hw]„1|$@ 5/b. |$87|$O[f\KAK [|$8  x $wfq|$H3c $|$p A9*l$cqD|$02Af"#$ySA,i|$8[fAUAt TfA= 91:&D fAa fAR=Jv$e|$p |$PWv>Aq^Av|$P)E;|$@))m|$X7g|$p8.D "D|$XAN$y|$E|$8ۏ|$0g|$@\|$hOn$o v MCAv1]fA[$A?w|$8dAv[AV|$pL61D|$hPaAkUDL$8Et G=31|$X$!$ AH.fd@I|$8{Df]tAuf.QtJ@-| fA[ A|4|$X1] M f/l(A ?ƒ uA=)|$X47;$|$p6?|$@ v|$0+A7@|$_$|$8VACxmfAUJ|$p,fA_$tAM*|$p"A|$p9|$@ M|$hޅAAXDA$|$0RdXa$-R =|$0:ƒ|$PAf[&9|$X0tA \$8$ vA&|$X)$|$8q|$P[SAe!t 3A|$hkRK~AIjf\3|$p$33|$hZ3|$P$,A7 >k g*mA)|$0J;vAN5QA"@%AfH!5|$@|$0'#UB7c?|$X#A3|$pS|$@Hd|$h=e|$X2weQG@|$0R34|$@1oALzvAK|$p, E|$*z$||$h>JAA^AQx D$p2Ѓagv$7 C9 b-|$hR-t sfQYAo1 DAq|$p%DN̿(  Ov|$h!阿|$X f>|$pvAj` T AGw"%fWm)|$h]G{v|$0Nf.|$pv(3c[VA餾(%fA_4L|$hz{1|$8i$SAzA3G $T%!P>|$@o}|$81M |$@ƽx y1RwUArCB}AlAAA KЃC 9>A v|$8 |$XCڼ|$8ʼ鷼|$)LUrXA醼 |$@ *U \|$@Jz"1$ '|$hb C|$p U`.|$0&|$pM?ǀDػDŻ|$8v A鐻$zAAh|$PBA|$0.A0w) m-f^O޺|$p>A4dAS驺|$p1   tzp_|$P<Y+>0|$8&fQ;|$8^|$h^߹ι|$P<1N騹|$X(z[/vvl[ H|$@6|$D$E }o|$@{|$p fDAٸ|$@& 黸|$p2$&S@* vA ~|$X(|$h .|$@!PJD$%y >f3$ A @ vݷӷl'|$hw.+|$p YI 顷|$p4|$X1%f_OpA"|$X_[H"I.s#|$%|$h:/|$p+ZЃ ڶ!fA`;|$0FϒRA霶|$p |$X=&4|$Oa_|$h<"|$0w=NfAKÐ|$X2 |$ A2fN&^*+f5鷵@A 鎵GS^|$h1[n[A!+|$P+@|$8vt.$$E E|$03' cYô|$X8 v阴|$8ub V$>D0|$p  jA7 ̆|L|$>ҳ$|$@Aa酳A|$X4(*RS|$pO$9|$pv|$X"|$8 a ,|$HlfWAc ܲ ȲqA餲i?A遲 |$@AVA }6|$0> |$8PK|$P[|$@[|$P[f` fT&4A~wAQgwA|$H韱@w|$0v_U|$Hke+A@!1}E|$8 i6J|$X"|$8 fW) Rqŧ|$hAC 铰9{|$8WFA JF]AsH,fa\Q|$@vA$A|" Q+nPA(Ѓ˯[|$8k魯|$p&"|$p bC|$X8WCA]DH ldwVL&>|$X##A$|$0>V!|$XDAٮA JCXLU|$0O||$@$AjiP1 =|$pA!.|$0>AJAí+韭|$p>|r|$P TAvT7$B!A4v M|$8A@AAP?齬 骬A閬=z|$8  Aƒ0t|$XLKA|$h( fI FBA>|$06oЃ@1A׫ͫ 齫- B'$VfLxf>?$w|$0ev(fYգ O|$p7S'|$ ƒ|$P4{({B/'A L|EϪAk黪A3dL|$@B|$X2B鎪A }fG!3J|$8QxfAKFxfAP$xA8L% !zfAVhAv|$p6|$0)$A+T|$@%A1©5P vA镩fA_x%ATA\~T|$X,c|$8v PF|$0B%:$F c|$h8M/|$hNuu5WUlJͨ^ 麨|$X1]|$X E?P=鋨|$pw>|$8l>qe$70$_g{n|$p<n(A S  |$0R~+|$@q|$@ gA&sA ϧY鰧 &'$ Hh1|$X0遧|$h%^|$h;^A^T|$h_,7|$p,3YAAx#S A6X, v`ݦ|$8;31A齦A>(|$@B钦|$X;:$:l n+AX4 @|$P}VAv|$@Z#|$@ ^V|$81إ|$X:Aѥ|$85$eW!|$pAA鍥AT2IpfA_|$81EG=AQM&,1fc|$@K|$X:Atɤk鶤A'$YS酤Pb#|$@JQA YpHl|$hY/ A1|$H|$X>-|$8'eӣ '|$8\>2|$pE1|$h |$@鋣j|$hJ|$X-v|$X|$hPA9|$8.A|$PA1|$PAv|$p.ݢt2-Af_|$0@Z Ѓ魢|$h*l-B}A邢|$p'n:|$0=>c|$B$|$XU Ѓ|$@u|$0EMA:[9Xj|$8:jT鿡[Z|$hv|$H镡 +|i VAЃC$Aƒ|$X%t>A4AyfA_QAEAƠ|$p2P@$y隠|$X.55y|$p3,^|$0cj|$Plb|$8%|$h $$#A?A #i v|$p5Ÿ鸟A3 w3队0SZsfT|$@ Z|$@O:<F:<|$0SvZ|$0 o6*|$8%F z|$PQh.A)48y4|$8<4Ѓ髞f@V鑞x)]Tfa|A`[H$wA,"A1|$@{1A k[|$hV`[j8:J|$P鲝|$X 5 A??||$@:|$p.&?|$@TbF,O8;A #|$p9A|$0Uu\|$X3v|$A$x#dWA"&A8f關A郜 w|$X'kaAO|$hn$w|$@÷|$X:9|$0;|$X88Ŷ|$hl|$0lAfAXw 鳛|$8"}ZT錛~&fAYU `|$8_N fA[hA:fSh1AfA[&'&OA0fAXh|$YÚ 4A4飚z 鐚|$hc#|$8s|$@6sC|$p yAs|$X'n4AM4$54An(4|$p|$ ƒu A4P/Ǚ66/6|$X<*x|$h \v這pA>QPA !cY|$X.dY|$pъv6k!|$@*$-A3 Q$|$0TT/ 閘|$X6鄘AmK KfUc|$X)K`FA'' >$ }> $@X)|$h6I Ѓȗ_鵗|$X@f8}@|$8?$r|$@ 郗|$@ **f7A:&=|$X81^7|$8#7cfS!_\ՖAfb6O|$X'+Ov$鋖a{|$ PZf[JiJ|$p.||$8@JDЃ|$p;' |$X0$ME$5*|$@|$hAv|$X.鮕|$X2#$4 鋕|$pC#NLAЃd|$h=AXH|$0DO|$8+|$@|$p'3*|$hL*ߔ|$p+|$P 骔|$8AA?N|$hYA7dAA|@[fbA|$02A9A9|$8 nSnJ̓|$p*|$h\*|$p .uЃ霓钓A Nv$Cg]A :( 1( 4|$X3# |$0V"Arb` |$p"U |$HΒ|$@vJ鰒B;:AFkX.|$X"vmcf_65F|$X6y[SA-A~|$!ЃAڑ% 龑%频61fbD@鄑Adu)|$@j)b$7Jf^fA\L$@$$zfzL%/w|$@ېv|$@Ð鹐X$ c9 鑐Q'G|$8J^*j$A>|$0T1 |$8 % JA"OfeʏA"%|$8%騏A5GAft3~|$XK$EV|$Xu&uL!$E4|$@'{GKCAv||$X0َ|$hY!fA^.d|$L-a|$X(Ao P$Y„t$aW|$X*9fW#|$@ Jx|$8((A#|$pP ` 鯍$$fA`Aq$-{wN J|$pƒ|$X" ƒ|$@uA;1Ag Ddn T7AG7|$H$|$ŌAv|$hI饌雌鑌w$E ukAKWADA0  #|$2l*/|$p΋$ $AA~|$Xo餋fA\ &|$8Dy|$@ƒ;t|$X)WM|$XJ32|$8 i|$8fD}Hf;da1`EӪ|$p4w|$PϊŊ|$hb鳊$4b$~##|$X #f]rP1|$PD=Am'1.0i|$0,iF1|$X>|$8AfAa@|$@PA}A[A|$hb|$h-鏉酉|$@^0|$p<@0|$8 Lc+ " EA7$|$p7dfa#d|$@d|$hl$AAf܈{Ɉ|$X2 ,|$h*'\$D\I郈[ d|$P1A]EQWG00|(fP(fK|$0}[v|$8-ڇЇAe/x[|$@g震AlcX1s]OU|$p5-A 6|$n[}[|$~fAZO|$0v1 }fS|$hp,AVLV錆|$h($0|$8 W|$p,HW|$X2|$p(FЃ7%-A}Af}AY}܅|$p7ʅJ鷅Cf>雅:K lWI zAaw |$Xf\+AkT|$hv1'|$8 .fAY]|$8 ]|$X>"+.ZT̄„fKN(!\附.|$p2}o&$P||$p";1|$0P;/A|AU ރ$  4|$X/k鯃t{A.$.邃6$|$pLRWv|$8SI|$p9-|${|$P {A{ATfA[ƒt{ ӂɂAX3 鬂|$0b9A l 鄂 s `|$@6DB|$h_=\rL|$@A>0|$@hҁF鶁!9A* dLQ|$pFy$?> O |$P$G~|$0GCk 7$[.|$htih|$0U^h|$PhAm׀|$p!u?[鼀|$8J@|$X* MAAA鈀~fL $F3@bЃE|$@ z<|$p&bcc$|$ 6fA^,v|$8u|$h|$@ 1|$n|$HU:|$X.G$ G|$@IdN@dM|$0|>|$hCF|$0gF$]~F ~|$8~8v|$ho~~|$p*87|$X7b$6 Ѓ~|$P'}ANr~+S~M/}+~f866$b|$p8f}I{}A/WrfD: }|$@j 3A2 {}E8|$8ja|$XI}9,'QAÙ|$8}|$h]Ѓ|:AT||$p(-A`yA TpA7|$Px,I|fA]0|$H.|$0UDU|fA\jw|$@l E At|${`E5fA]l_|$@e$ {|$ro1|$hk$p A|$85TA@|$0=?Ѓb{|$8HD{xW/{|$@N@JM>Mz|$0LA[AAZ|$X&$G1 Ѓzb8|$0UX<AAAj az|$0I1+AssTv!z|$Xz$d DdyAo.~f\}|$p* AUyAB'Zsfbv|$p#v|$oyey[0Ac_>|$hU|$@|$h@ALw*xx|$p4$m|$X$5*l&qAxP9|$X5>fAb>~x_x Lx$c b|$0abx|$@*Awww|$X wu8Ah8w|$p+*wA $P^ |$X0aw|$hCw|$X27H9w|$X*/|$h)gTbgA0vAv|$h"|$hvAf?Ѓv|$X=ve4 c|$X,c|$@ Qvu;|$@6v#v|$8-|$hAj|$p.iAZ$u|$@!|$hFZ[|$X9Ru $z vA7vgu|$hc,cFu&6u|$@#_uAuhsqtK|$@tfA^ /$k`kt['A'ct (m(Dt|_ =o|$0~|$@t$7c-c|$hA>f_W|$HAs A4b$S v _bb|$p8N@|$@AKbb{bqbgb]b|$X P|$8EP|$8A|sAV|$X: bAaAa|$h\a v$aa|$PYNAON1DafI'_jaaKaAa7aMc|$hƒ|$@~Aq`|$8w``fTb|$bAhE|$@`A`Au`b` O`|$PiO8`/eecA`|$h.A |$X4u  _8-|$8 @|$h5t____|$@Ѓp_|$p'^_T_J_@_--|$0,^fAUt|$8 ^^^M?~A?q+?A*?^^|$8^|$p?-Ѓs^i^gv|$p T^J^@^fAW8|$8#^-$; 7A4x7]]A$ ;O y;Aw]]]A0|$@ـ<̀k]a]x/|$hO|$p'I|@,]]A[8|$hE)8|$P$ AXA\u\|$p,3|$0JF3;}|$pAj\$-y \N\D\|$8 2|$PAE\T[|$X15|$8|$p'A3[fAg0"}0<[[}[s[i[|$@/|$p&v|$X7G[=[}-|$p5|$@Ԅ< [[ZZ|$h/|$h(.|$p9_Aw|$X<ZZZ|$hd,z|$X.q,|$@eZRZr;|$R9fA]EA|$PZX)AS7)AYYYY$ )v|$HYYYYAnY}*_c~$Ѓ9Y/YY  Y19|$p18|$83X7|$0i+ XXA+XxpX|$h=3 |$@;X1X'X|$0Q0AAWAN@nfWA9 E|$0G6b WA -|$X5|$@ˁv_WUWKWAWA<-W#WWW|$0.i.AVV=5@V|$0E/v|$h~VVA"/.AVgV]V}'_'8V.V|$XLAt A;.V*ƒ|$p uNUU|$8&ЃUfA\-UU|$h NbtUfIMA>M$HUfA]Lc $U|$@L UTTT$A LA]L ThP0|$@TfO9p|$w|$@iT_TUT$=T|$h1:|$>9|$H}m|$@hm|$89]m$Y|m|$@qmS|$PxZbZ$kwAqSSSSS|$pnDP;D|$X,hEUIGSAOlP\'SAЃS|$X9dEA$ -v?RR|$p!N:Rz R|$X=M|$p*A1ZR;W|$p!WCw$(RR$u;QQQQ|$@Qf[WWQ~|$8QQZAlZA`3cA)cOQfA]W$mR|$0]rA =R Tv|$8 PP|$X#p@|$0<AEPPP|$X9,;F;|$hnn|_PA_>P +P|$p5PPO|$0Z`So jAl YOOOAOLX m|$0zdI ddO O HO|$@ O$%O|$X0B|$8NfET|$p,|$@ vDNNa7 7$$y:|$h~/|NAE%|$8]NSN|$/o7l5NC]AAPAN N|$8>J|$049>|$@|$p3M|$hU$U ID$X6M|$hOV;_I_|$@dM|$0]L2AQiAH1i 2MAH;|$h9;vFMLL@:>LfOLL$3vALL|$8+TfSjЃdL$2|$@h|$@ifZA%LL|$@|$@KKfKKKKKAKKA$4|$@d3|$X1Y3\KA@$@ ?|$P2?KK K|$0FN|$09NZARA,_|$h0!_|$@vCJJJ }JAP:|$P}XJNJ$}R|$0TQ$jAv>vIA<|$X,AU;?W6IA5bL I68|$0*iAh R <A|$X'f^Ej/I7=1|$0"IH|$X4n A~HHHH|$P3$Egz f|$hfHqHvAWHMHCH9HC&HAH<0AGGG|$@,-GG|$8+TGG~G|$h2A52|$8e|$PdO>G|$X8,G"G|$XFO|$p}NAVsN|$psA\fTRF1|$HDF|$@F|$0pE$==f;W|$P UW|$0`WWSFAc0|$p4j.F$FFFF|$8" |$hfP3E|$X=$|$X.EjB|$P5B:uEAvtaEWEMECE 0E$|$-l|$wf`wH DDDA&9DDDfAal|$@DT6|$@6A#SDAu |$8="D` @|$H@Dfa6|$P6AqvACCCG&fAa&&|$0in|$X90|$8$ |$@w$3nCdCA7|$8\EC }7|$o7!CA7|$v7C|$@YABB|$8/'$Sv$BBBB|$8(4OhB^B|$HD K 4BfP~ABB|$@ vAAAA5 ЃA|$?o?|$p=)|$p W6AAAX AwЃWAA"q17A 'A|$P$AA1|$HD@ @6^"|$@ )"|$p)d@@fKi L=w|$0Q2wd@ |$@ ЃJ@|$h.|$d~N~|$XEC~@@ |$h~1HD@??AM M|$p&B) ???|$p3A|$@qAXU?K?q Y ,?$Jvn?E>1f\D>A>Aa9A>cwP}>Ap|$X$p|$PpP>@>6>Zw|$8 >>|$8q^q|$@NqEq=== =Av|$P==$ w%|$>AoJq=g=mT=J=@=Ao|$X:v$= ==JvA <<<<<|$@zGZ:P:F:|$pw=,:AmwF|$X*dyrQy[:|$@ JyA =y9|$0#y|$hQy ;yyf9999z9p9 tpQ9A9|$p"sXAv|$h}99A8|$XAm-vA18fA]Oq1|$H88888$q Fno8|$8o|$hcoF8<8|$Xƒ|$p!pp8A6t|$08tFth7|$@r|$@77777x7fA]Oa7|$fHoq|$p6qA7oAo6|$Pwq\qA'6fVr|$h&rfBq|$@ qvq cq|$@Nqyp6f6S6I6?6Ae+66%j|$iAj|$ ifYDi|$XD555|$X+5xrk j5|$@AnyO5$0 YoA`^n55|$p$ ,ku4Dr.rd4 mƒ|$@ ^mAQm4$j|$X$j^4|$8L4AXЃ64Aq|$X!p 4A%|$hjujAd8jG%j|$h]j3|$p p|$X(p3A"p|$0*pt3A qfAap|$@p|$pakUk03|$p$w|3|$h3A\U|$hk022lCl|$@D2|$hRkApj2$p2T ]2S2f9pYY%2|$@ D22|$XwjA]{T1|$HTTAT|$8[TE:T|$X21|$8Ѓ1|$@ X1wA]1S1~VfQ\V|$hhV.V1|$p48Q|$81 b[A001|$@D00AQ 00A00|$P|$@SUS0|$hp3U0 U|$0DU|$@Tf`T3w 00//A/P-T$Tƒ|$hjuAY//AOLz/p/8|$@O|$8RR|$XBSA#/U|$X4mUST|$8T$>T|$0UTATE.AcR$ RRA|Ry.Ae.qdM|$]]Ar\O...ACM|$@ --M--AU6U--w-m- M|$X;MF- 6-,-T$ T|$X2T,,|$hy`|$hNY|$PA,,,,fNCAK|K|$@^,|$p%KC,|$@KfTK, ,A VVV+S+.ZAZ|$@Z++++w/U|$@ ^+T+J+|$X:TA.+$+A7T|$0(ƒ|$XTtT**AS|$8jS2WSAy@S|$@5S**|$X,U|$p8$UAeUG N*|$HT 0*$;T*|$8fIr))))A))S|$@S)$b)A_)U)HVA#V3 V|$8V)=gTm|$h BfAV>Th( (( +(fAV\($ @T|$8!TfUSWG(AU8U]U;GU|$@ #4#faA#9#""xԽ|$HA o"|$0>|$P)|$X?2m"c" ЃQ"|$8=Av|$8-"#"w,|$X?³2 vfC!!|$X:mfAVXdBw9!Qm!!Aob7Gq!g!%T!J!@!3!|$8||$@7ATǰ'  |$B= A^  )  |$p+<AcCh|$8 \ U Q|$X:FA]1 '  |$hJ |$X>үAů|$@w_L|$p/A zf3dDQGA[A|$h A|$p|$02ͲAu9ЃٟAŸAm|$0@>$% fzAI--|$8,9, KwAqfAbb|$p!w|$0G$LC`vj8p|$p3wxAX|$@w"|$8w9/n$P|$@,"|$@Ѓ|$p%$$ AA' e6" O6A;6@ VL|$HO5+! K|$X83At|$@a43fA\3|$83AA33|$30 v|$HD:|$8qO6<6 3|$P2 |$0,32|$p1w|$HيÊЃ|$@wmE6A6MC9/w |$p%|$0[w)A $6T A5|$XɆAA # 5fY5U|$X,7-Aw5 |$@Aw5f\|$hɅ5A4Ѓ~A(4 4XE5pw!Av> ?AUv e|$P}M|$X,faUB$vbXN|$p4|$X: 4.|$he$g|$p9CA/ &cw1p"Ay f\RH>4$3 $ 331fHD|$@wf|$X<3|$8jЃ |$P}SA7|$Pt!|$h3vVL|$X'iA]R$ %=ЃA% #hEAm|$p$zuz|$pwB<ًF|$p($XN|$hNMq0|$p6' |$PęAyDy|$@|$p,|$H ̕ sA_|$hs|$0S|$XЏ|$X4   } `|$pU Ѓ|$891eR|$p$ZfA`= fAd=q*qqYO |$h|>q|$hmH|$pAIyfaAf`\|$h]Ӕ>p8pp|$P}QV:|$0?;Y$ W$7[|$@"[$[  |$h / |$XB}$ 9fA[|$=ALt|$X1iA 7$vvl\PM|$@D6c|$ uc   |$8f|$hrf/|$@ |$0G c:Ѓ|$8 >|$ )S @|x|$X3x"    O AY fP4 $'L$-u Ac=|$0EY AE ; 1 |$0*" A   X9 |$@   fbڑ{  !|$0   |$p Ѓf \ R c$chcO Lg |$X% J     |$@   x n P F < 2  |$X*ƒ|$@ u  |$0Pw;fAb$VƒKu A |$h*$vA  #h|$X5gf_g|$0Zfcf$f|$8^f$ fAX  fAU\$m\|$@bT2Ѓ $3s~dAd|$8d|$pcAc|$X19d[ Af> y+ A[ 1D fA_+g|$0jA`|$@$t|$8y|$h!w XNA=3)1|$@  AЃ|$@ Aw4ЃBЃN yoA=[wo|$P/"|$p49wjЃ|$m tFfA\mAnm<m|$@ 9YA  P|$@O:fb-9LqAw~|$09~|$X+}|$8}}|$p}|$hhA${c PFAoZo o|$P|$8 fA[u|$@ D|$@5o|$X,t|$HV|$hwxnA |$P}A$ ?fa E E|$h |$P0A&fN/{|$8zzUABvF| t ]SAu  ,"I1fAa$[|$@ZfAQA Ab bbtf]v|$X<4*|$0>)|A||$X,d{|$07@{U$|$p$|$8wv|$0=_|$pt0YtA|$Pt$t4yt[|$p.MfA\M|$04hM|$0)5Mk |$@fAW#|$@߈A|1|$@ yOZ|$0TZ|$8 KfY7|$hx,Eu$e[Q1f=<2(V fAR:TvЃ|$p"vA$|$8SAS}$߆|$hvԆ;KZH|$X.0$T |$p2|$8f$}7A#u ƒ|$X<A |$0SSAH$Hk$"f  f >|$@A`|$p |$0eQ|$@ AI_ SS|$X;Ww-|$p(1QX v|$hk`VAb B@1d|$Pd|$@ R|$p3Q|$hhm]Z]tw|$8cP|$PFP0PHA eD tjfb BfA`A$.{?A9?|$h8 ?|$8|$hOme|$8)d|$0L|$8P|$hP|$@P[vA)|$8 # vKf\AK:b,"\$x wE|$PrP|$ht2P|$pOwA`|$8dk|$X0E+|$@rfAaC1|$p"QN|$X8N0fAZN|$p;NJN$qN|$X4A A $M|$@|$X,vAqg]Sf] An8. |$hvfRA@EC|$H0C$CA |$8U|$@A |$h AV B |$8GT 1g]|$8JJIJ6|$@$|$@|$p4BAЃ+:A:r M:E:F |$p. _<|$8kG|$p!`GMG AGXNDA MAM$|$PWA1D^fAY|$0WAAlL|$H|$@ yAH|$P[HH"E|$P0Lf:~#|$0@SN0@NfQ,NAN5|$p5u8|$88$qNH"N|$X/MM\$TRE 2E|$8*-f:7A |$8Mh H6X6|$@wXUA)7AzpfAKgvUA w.Bv)I|$p"v, wAw*  $Av~fLV|$p1wEA t5$e |$vM|$XBw<|$p2w5pff>9(v'E;1'K X B|$X?7'OA||$X9 ZhASvVAYvCv1|$X"v 1' Aw|$0fR~H|$p*wA _J w ukaWMC|$pwcAe"%|$03vW|$Hw^6wFEu/|$p3ЃAЃ|$p+wN%~wZAwQf\,w!|$8 wC>3)|$8|$8wj|$@Cw;ww6|$8w|$@vmVIw6A|vFSv7|$X7w&A^|$@LB8.Eu7|$@wA|$@wNAvEgw6|$8)v%|$p-wf7n^*ND:0&|$@ |$H| m |$p)VEЃ|$hv0Aw vMuBh;J |$At\fA`~8A$|$8 w |$P|$X+w=x|$XwD$8w-|$POxnD$wUE|$hav1A:vA! |$pw1|$XE|$X,v/+$uw7w.yoA^TJ|$8AwBw3|$8w"v|$@ A1|$8|$0-weA(qg|$p+3A3fA`|$X3|$h?wM|$ |$w>wCAt3G f]Ow$$t|$0FsiA6ЃVfA^|$%w@)|$p1A waAw%|$X7|$P %Awv w:Gw"|$@vNubfXMfA[~w0fAXЃs}?}0VA[ЃC9/%Ѓ|$@ |$@*|$X;yoeA%$}|$81|$P}4|$hawNDv?f6$|$8'|$@|$8|$P~UTAv ?wl}|$p7k|$@J|$@8.$A!|$|$@A wfqwT$Gw=|$H,AJv#|$8wArw' dZ$v!|$PO6,"A$vAw-fA[~wAvndZPF<2(|$pv7Lw/O|$hmw;  va|$huvZwmcY|$@G|$X0w;d-#|$XD|$0CA# |$h4w{$wX Qv"$fh^TJA D4*|$8 /A p|$0M;!N(!|$p/!A|$0EwL|$8v;Aw2cYOE;1|$p9 |$@$%$A|$p4w|$s|$hwlAwI|$X3w/AvЃMC9&$va3 fYOWwOAw8AwT}E|$8w>1D@4w7Ѓka1w,jF-#A w4vAAvukw~yS|$P}{$wd/|$X.|$@ v|$0=D$8|$8tA|$8IwIwmcY|$p#w/|$X6vA7-#gfRwx|$8 vg$ |$hPwofAaO||$XAj`VL|$8A$|$X0$Ag|$0nwrfZIw7Iw2}si_|$.jA S$2y {w=w|$X5w-|$p$vw!|u~afA^+~wxndw rvI?5K%$g fA[ ЃRu#w|$p0w-|$p5wJAtfI1tAwqg]SI?w'AЃ$|$0f`IAfc@|$@w/fcu1w-~tj`|$pw>w,\>|$hwE|$@ %fS~LZvDw55Aw7|$pw&ww59w#vxndZG45$|$hjA |$8AuAw+ zD a$LB8.A$|$8 At PvM|$@vFv4w/||$0uAv||$@wuWMCA/|$hx2 |$pAvtvDv=|$hsw,|$8v|$@w$- mAv|$8TJ|$@8|$8&Qv.!AvЃ^|$8|$h|$@ |$p3w5>NAwDfT4,WvA AwswSwgx|$09vZwR_Af|$hY|$X)vo|$8w6Zw'! v tv'ABwɺO{A*A|$X5wSf[,|$X(|$p'u5+Mw.$i+vy|$p"w v\R|$hwk|$p,wR|$@w-z-$Qw$kA|$@fA^z麿鰿馿 $ wG|$Aq|$@SI|$@wz|$p,wi|$hWw:Aw'AUv$' ܾҾȾfUO鲾fZA阾鎾|$X0v?$u"|$p,we[H>4*|$X+v-hw%wAZv|$hv>AwA Ľ麽|$p6w 4 K靽铽鉽1fQjv6 w$fAZ~I6,"JA|$0<$|$h4vEw=ɼ"wlf[K$w,fA^~|$p*w閼錼邼|$8 pAw&|$hBUAA1|$ ofA`Ev:$2w-1|$HD@AwZ|$8w5w-$V6ЃAv|$@ӹɹ鿹|$ |$pAQw3t鍹A4wH=wЃmc$@vfAaF<|$X.2|$@|$pwd|$uSwK|$P ȃu Aw ͸ø鹸鯸fAb~)w!閸|$@Euk|$p%$7|$8C(|$0Awh|$8wIASw/h|$@طAǷ]wD>鯷ow"|$@v$酷{|$@woaW%w6AX;|$p%v#h޶v$R鶶AAw{鍶f`~tj`f9|$8ЃF<@w9Aw&v ʵ鶵鬵颵Ah|$@}si1|$@D@Vw+~&?5|$@#|$P|$howy |$0@w57w&˴鸴鮴|$@|$X@A|鄴|$h{vV vD v2|$0Av!SvAB OE;1'Ѓ$twܳҳ$Q|$0J9馳?|$@A^|$p!?wH _|$@ wq?wQ$w?$wAM* A |$h0w;A}fL~v|$X5w+1A|$h1uM"馲w(w$#vlbXAw;A%;AA'w(w3Ա$wa|$p,wP1fUD鮱|$X?Al|$P8|$X6=pf|$p.tz|$hAw[|$hw"AvAm9/w -w$ A!vDɰ鿰w_|$H~8|$@ wA阰鎰u{|$8w?|$@ v.w&[Av*1|$H?5+! jw7Ѓ|$0nwx|$P}_Aw-AdѯAv+ 鸯nvv頯閯錯|$@zp|$X9w'VLw@|$w/-#|$@ A֮AfX~x~vf|a|$7v3w+问|$X1w.w|$8'vlbOE;1|$PyfA\O xw5fN~%)$٭ϭA黭鱭f鞭|$8%錭邭x|$P^wO>VL|$H|lfLJ:v8r' jw1wv٬Wɬ鿬鯬饬雬S 鈬~tj|$X>XAG=v|$0H/%d ۫ѫ}龫鴫骫頫閫錫邫xAfA^P|$hdt$vAr/%A|$h9|$p8ws|$@wU1|$@ 麪鰪馪|$@v|$8(酪{|$p4w0fdfA`t, ЃND1c |$@wOD$8#A=vL7w:$t0ȩ鵩颩阩鎩鄩z|$8vI$ w2|$X@v+U|$@vfA[>4*  f_~!AvSۨѨǨ:wZVw?骨{w鏨酨{wwA e[|$X8I?5Bw|$0B$٧ϧŧ黧|$h|$X:$u^EtO|$v;yoe[QG=$AawuL v<1|$hw5A)w" vLզ˦D鱦鞦 鎦|$ |$Bw8鬤|$X-kfAcO遤w1sD@f\RH|$@ v$.$|$X-|$@٣|$8w7|$hXv5饣難pv郣yo^ARw4gw%fbƒYt AC) Awk|$8vQw9$v"|$8vܢҢȢ鵢颢vYA郢|$0G|$@fiY|$0Jw1f_A7A$|$@wC|$8v<|$8&wmwW|$p w)Axv|$@ϡš黡|$h"we|$X;w^|$p*vMwE锡|$8 Ѓ郡|$H|R|$8kjAVYOEw4AЃ*Aw4w" Ѓ٠AƠ鳠驠-Ѓ闠|$X6vA|$@w($vka$ЃOE;1'A|$8Hw9|$8Ѓޟԟʟ}頟閟|$pw'|rhApw~I?5+|$XwZ|$hU1|$HD|$X+|$X!|$hLA՞˞|$p|$hqrw-w(鞞fE,3wg逞vl|$hh|$ ff`98 |$p8|$8|$p$fA_RA|$@v~wc|$P|R|$@wAw21fWD@鯝Aw 鏝酝{q5^TJ@;Ѓ.$w|$@A}fbO|$p&|$pw35w$Aw驜韜fK6^A,( -ƒ|$8|$X:A,|$X6w:f\"AvA|$8Aƒ-u Aw Ǜ齛|$@髛fA`A錛EpAAw|$@DvIAv6^ |$8vA|$h9|$p+w_AwB|$pwA鹚鯚fA\ƒ|$8t%w錚邚xAw/|$@ ]|$pwQw8|$@Ѓ@&|$P\A|$P|$pߙ~ivWRw1|$pv*麙Av.w|$@隙鐙醙|rh^TA1fU,"o ֘Aw4v"AwA 馘霘Av:w|$p*yow|$X:wYOE;1|$hDs|$p;$kf<[A vK$|v7Aw ϗŗAM鴗骗頗fA^q|$@ v`|[zp|$H|$hfA^~7Xv2`2(MjЃ$>w$|$h*v$ߖՖ|$0bwLv:鳖$D錖邖x$c|$8N|$@ ?5fV~of_6|$8w%Aw|$@|$@v"Aw|$0Gԕʕ鶕鬕颕阕鎕鄕zwaYwDv5TEVv@6,|$p3w2|$P|+ƒ]t|$hRwߔՔA w!A vV體ADF 0|$H%}siV|$pO|$@w{.|$w=|$@w  Aw,Av#|$X2vwѓǓ齓鳓|$0/Eu|$8w 鐓ƒ|$05t=3v8lbX]H>4*|$@w|$hPvG?w=Zw|$pےђ|$hzw:$鸒|$X%u A,w鐒|$ ~tAЃaWMC w3w!|$hv"jAw.+ƒ|$p$uAA鬑Ѓ隑鐑醑|$p'wAndQG=3$w?xw |$@ tA |$@w@fA^$w-$麐|$hwtA0颐|$p1vAwl]vd逐|$@vf\R?fL~':&jgԏʏ|$pRw=|$X=駏$vEv6xw$|$X=w|i_UKA7-#$!w|$p,w'ߎՎˎ9 + "鬎Av4 $w yoeA w|$@J@|$X.v}A% wj|$@vc|$X2w5> |$hNw%wЍƍ鼍鲍騍鞍锍銍wmcY$ w'|$@v$/%-AwZfL(A^،|$8wg鬌fA[~/|$p+w|$8t 逌vl|$X-w;UKA:vA  |$@AAfA_E̋|$8騋|$@fAbx|$8QA$WЃNAvLЃ3Ѓ!Aj|$X݊|$P|B|$p|$X/wDAwAσŃDƒt|$P} 餃鑃|$@|$H'UK*8.|$8 wUA{w-fYƒ|$p+t|$@|$p/҂|$p,|$p鮂餂隂鐂醂$nd|$hIRH5+AW|$'vvAkفρ1鿁Ae髁|$p-A醁|A.DV|$07wS|$hw"fZA0&l$Q|$h_|$8A'wIAɀ&|$X1wh4vOw/v销銀退wAve[Q|$hPw.|$h"wH0&gA|$p 8Av*8 ~tjAfVL|$@: 'fa|$X6|$P|$wpZwh~A~~~Hw"v|$0;~~|$@|~r~h~wY|$p4w?D$8Pظ D~A0~|$8v,|$8%~~}}}}D$AO}}w-ƒ|$puAa}W}M}1fbD@;}$nwV|$8vE} }}AN||||$hO||$@||Eu$r||u|v;Z|P|F|<|2|(||| |A0{{{{|$hzw2v vD{{{I3AS&p{f{g4$E{;{1{'{{{{1fZzzzzz|$X5t*|$hw#z|$8v|$p@zzzpz|$8^zTzJz@z6z,zD$@zzzyyyyyy1|$@vyA~u[AwRy$why^yTyJy@y6y,y$yyx|$83vYx$Mwi|$HwPfR@;xxxxx|x1fGD@jxKwTxJx|$0w4|$@w# v xx xXwww|$@wwwfAY$w v~|$8 wB|$0`w1v"|$X7v swiw_wUw|$X<|$0RlVO  ww|$0[|$@wJA, w7$v vPvvvvAw!|$8vfAYvvA]fAW/|$@|$X7 OvAz wW w vuu|$?uuu|$p8w?$v($-+=&gu]uSuIu|$w-^w|$X8w&uuu v|$8tt ttAt|$h A:  h tAwy~tttjt`tVtLtBtAwA v2|$wUwAt tts|$P}5AKs|$p1w6|$8!w%s|$X3ss|$h4wL|$8Tw*fA<ƒXtrshs|$@v'AMsh:s0s&ss sAЃr7w-|$8rrr|$p;wP|$@rrr$w' wrmrcr$HA% wa|$8 V$rrrrfA`#Av|$p(qqq|$X'wE;w+|$HOqqq$q|$8"?|$8A|$p$=w?|$pt&A~ƒ|$8 t oq|$X/q$>t"w|$Pppppp|$@wKpppvplpbp|$HJA=@p6p,p"p|$h*w"|$@ poIo^f|$0RvF w4Av+o|OALw'oowoOv.Aw|$8uXoNoDo:o0o&owA  oo n|$0eЃnf~m|$hwD|$8#w'nnn|$0Fv; w6nAw0APv'lnbnXnNnDn:n0nu nn n:vAamm|$*wv|$P}Q|mmmAv|$hCmmm|$X=wDv2-kmfI~?Xw71fTHm>mew&mm mEt?|$X4w ll w ll|$@lllllwl1fUbl|$X)w% HleЃ6l1D%ll|$@Ѓ l |$8|$p_wE$w8k|$8wY:w@f[~0|$@v)vAwkkk}kA(ikAwt|$@vcAv]|$8 w{6k,k"k=wb kAjj$w=w+FЃjj|$XjjfAaEjjA\v"$vTcjYjOjEjD$@P0j|$8w\FЃjAifA^Ki,wVD$hB i|$X5iiw(Aii{ie\iRiHi|$8wxvi5)i|$hw/A}vЃihhfAatX|$wAAw#xЃhhhw3fa~-hhhwhmhch|$8 fA[Sw-fOƒ|$h^t|$8)hh|$X0v|$01hg|$X4vEEuv|$BggA^Angg|$B|$X7wM$ow6$w"|$p(vG^gTgJg@g./gv gg gg?wNwfffffffAw0fffxfnfdf|$05w2AFIfA5f+fA8fAIv=feeeeeeeeANv|$X'eezeArie_eUeKeAe7e-e#eeeeddwx|$8 vg|$@wNw6w$8vAddddЃrdhdUdKdAd7d-d#d|$X=dAGcccccccccAwZ|$p1wS^c|$8 wlcbcXcNcDc:c|$h5(c4c|$X-vq wbbbsbbbbff.@SD\$X\$ DT$pA  A'|$h L|$0f]|$hL$9;$1rT|$`)*t|$8$Wf8M[|$`hwyAG|$(Y+ |$h%$*(|$P,G1|$(?7E wThA[A|[ ? $UfA`|$P+$|$h M|$8|$0[@|$0 |$(lb|$P/W $Y9A/$ A|$8 rVk [f|$h }|$@ E2fb#|$H$}LAT|$HI[fAC=|$0*|$x|$8![fDfA[A|$(u $|$(l\*|$h2<|$P/GVfATwuAM$K E[D|$(e$|$(B |$0|$,|$H1J$&#J$2|LAqoL$>Kl[f$ |$0 $A]$$C5.[D|$P4U$t |$h$|$`s|$(t v AB[$f!Ao 2HAlg|$h-2 |$8[fD<f? |$(s|$h/*A m9|$(1&\$-:[ЃfA`$W;fx$> 6$Y|$8$$$7|$h)3w|$`)mm[Ð|$(!fAT $f:_|$h,/AkH|$PDdAHp|$8e$Ė[|$("|$(M|$P# |$h$Z|$`VJ|$HV= v)[$p$Ml |$`||$8.!33$=[$$BEc,$)$F$ [D$9B|$`~$;1[Ð|$H A[@A V |$P2 f]I,:Cygpg[@| AF |$`ƒ=C1C[DfA\ |$8A t3$[$2&|$`3 fA\?A^[|$`|$%AR|$8[Ð|$( $m%A /0_J|$h+PyA[f.AS |$(Uf|$Pd/   v$C[A|$(MA8(|$0.1fANM [f.|$u$h |$`{a#|$P7 [fD|$>E|$P(b |$(0|$9[@|$8 |$0$`A A9 *[fA`|$8  f[1A[|$(xDT$hE1[|$`S[ffA]5A }/|$(]O|$0Ox|$HΞ|$0|$h5APnfPFn[~A|$`{m*wf]b[@AfAX] |$8 3\$x[|$6wA[D$|$(I fLO2|$h"[|$P0AK {[@|$u$ $o;|$0%EA q|$H|$H 8 [@$? |$`|t|$P5$}S |$h@[ $t|$0.$hE|$8A"[Ð|$h$|$03;|$h[D|$` A  $&*+[f.$  A J |$`x 4$dB$iT fA- |$0[Á|$(w#|$0<,cAfa^fR~$; [fC A"fb~[D|$()1Aw |$8 [D|$P+  oA[f.|$h5!$r0|$8[f.|$x|$0[[D|$`D]|$P4JA^[ 1%[A f_!|$h4c|$:<AK]B]Au ) 0[f|$P|$0ufe|$[fD|$0AH"A5 [Ð$-|$0A67mAo Y|$P8m$x[ЃD$!|$0ƒ|$8u [f$Rb |$h.; %|$(JK|$0~o iAA[|$h-|$(G , R[f.$o|$(hT|$`r(A [AU  fA]mt3|$h7>|$0k|$`%|$8 |$H[fD1fA][f$ $tg"|$(\;Y|$8[D|$h+$m$2 :$%AzA/sz[Á$[A [fA[{[ÁA+fHP1|$H~[Á&|$8\+XL|$0s[$  A  1A[Ã@|$`V#/|$8 UAU1$[Ã|$h0> |$8 w: Y[Á-|$`jvf%[ø $ w fR[Ã|$`_A2|$0?@$VTaA  [@A5f]{[Ã|$P8[Av AH[A3u|$(Td";fAY'gA|$@$3N|$H4|$P<h|$Oh7[f.|$8%fAZ'O|$(/d$,|$P7Ay!|$@.SA!S[fA! |$h] $p89V|$HV[|$(E|$38D$UA;w|$P)fa}A:b!'[|$(Rw-$7Cz k|$``ATt$  |$PL$.^cRc[f [Á2[f^ $}0A[Ã|$(A+ |$P@J|$`'qa|$hb|$8o|$0 @|$P)ƒ|$`NAN[f|$($#[|$P<3A^fXc|$P*vA[fD|$`cJAJ$$aA|$hUZ$[$;<A*$$IAc$H[Ã|$0$S[Á^1 [Ã$]6 # [Ã|$h8 $C.)?APP|$xU5|$hv|$P)[øAA[ÁC|$0)|$(Jr4C=\|$`~ʋ|$I[D|$h3wf`$d/|$`MT|$`+O|$8 [fDfI |$%A[?7|$(XkaS||$h-A-|$h# TT[[Ã|$(>q |$8,|$`GApS|$P0[fR- D [Ã|$`z |$%A/| [Ã|$(? $=$vA[Ã|$P/|$(Id|$8 [Á[ !|$8 7|$HSA[$ As&$k$>|$P!Ofb OA v$[f.|$PA9/1[Ã|$h|$P!1fAW[Ã|$P; |$xw _[ÁQ U|$8'$[Á [fAZJ|$o' :f-m m[fDAt$bZ8Ab[Á$A[A [øY|$`|$07 ,N2A [Ã|$P$[Á$$ )[Ã|$h($G+P[Ã|$(ZA[ÍIPb$^FJRF[øAE!fO,+|$8fG [Ã|$`~Ov|$h[øZ$W,   JA[IABf 6[fD$AS61|$@[A8|$`{5$V c[A%|$(.ӯAg[@|$`h|$P#vA[Ã$|$0~E|$8[ËL$H 'A=v|$8/B[øa*[Ã|$8$fAY;4d, \w vfAR[fA&n+D$xJ|$h'l [fD$U%A[Ã(](1 [Ã|$0G $[Ã|$P*$Zx.'[Ã|$h&vA [Ã$_[ÁJ b|$h$[B> [Á$|$P84|$h4zSy![Á [Ã|$`Oe!Ax4AP|$(NI$L$#p|$8 [f|$(k!|$8%+S^ R[f pAA[A |$8 l*|$h#QŽA [f.|$P'A/„tA[Af[t|$8[Ã|$h}Av|$P,[1[Ã|$0R=|$PATq|$8$P0[f|$`e|$h+$PhIAC=w U[Ãf[A7|$h$ MAv u[A[øu|$@} b[Ã|$([|$`w@|$h6@c$LJ|$? r[ЃÐ$"|$h5|$`hV|$P2bԔ$+K [f.|$Hw [Ã|$`?|$84|$H=]$AŒ|$%[D|$`[A[Ofar 9|$h#A|v|$`uv([@![Ã< (|$8[AC[=rÃ$W|$x[Ã$Kp|$0?|$0BA[Á5[Ejj$m[|$(q,f=H5j[|$(Y}$9|$8[f|$P( A_7gH|$8yfA`|$P$![f|$8k|$H[OÁ$m Av9|$P4X|$h&k$[D|$8wy[A"h"IWA|$`YfA$Sf$PR"@!|$0[fD|$h$ |$H~ k [Ã|$h0-k[Ã|$8 x|$`p[øA Z[Á$q |$(`)|$`}AAOr"|$h[@g$.|$8K|$h,A,|$P1|$h 9$nu9[@|$(TC|$h%[Ác*|$8=|$H;f8\$@v [@|$`B|$0[Ã|$(>|$8w$4[A$Fn/|$(<YeAuc1$F[|$(2|$08_|$`_|$P8YgfA]A :2[fD|$`9A=$Hc|$Hu{[Ѓ|$h|$h[Á|$($ A4[Á (|$`Rd?qA|$0h|$831[D$|$8[Á  A2A\A[Á|$(6wAv[ÃfN2fAR)G|$(e|$`$|$8#|$08[f.|$h A$[ÁD[Ã$]3A"eɆ[Ã|$P8AA[øAe|$(|$(p=; [Ak$.D*$mP|$hYACq<[^|$P#^[Ã|$0  [Á 1[fA]N P$-AF__[A[=Ág[ËT$^ |$0[ÃA [Ã|$x |$0'4|$0 X|$P_&l[v|$P07[Ã|$8A6|$0"Z$"[Á|$0x[A^5|$hvi [15[Ã|$H'1[Ã|$P-|$(S3|$HjXA;u |$H[fD[ø[Á [ø4E[Ã|$`|/ A\Asv|$h*[Á0[f=@)|$` ;A[øA]& [øfO>|$`B3[Ã|$0-0$:9{f7V[f[/|$0rH1|$@[D@Ã|$`}1{[Ã|$8kC|$(JrĩA JfX%|$`&$7 &|$`[@|$P)[Á+$@VO$8Lp|$0[Á$fAa!Ё#„tW[A%fA`;|$H$[>Ã|$0|$h #u|$`|J[f\/|$0 [ÁE(|$(XLf;d|$0>ޝ|$`[@|$`v>$|$0[fN-fA@W|$P7V|$8c|$0=fJx|$x[D$@T$x!Ѓ|$P'„Uƒ|$`?U[Ã$D\ [Á[Ã|$8 H$3a|$xě [@A(Ai[Á$kAF|$`qz$TT|$(M|$`K*|$8 t |$h/b $AQ|$`C6|$P/vj[fNw|$-=$M[Ãhw v$j[ø;u vA [[Ã|$H;$D|$HsAh_[Ã|$h6[Ã|$8"[Ã|$Q/|$8L2|$`}R|$0$8E|$`z4[D|$h/*|$(rT|$`fUA[Ã$['A[ÁC[A  $|$P+[Ã$B#$<E$Y|$xÐɺ[O@$!|$P?+[1[Á|$(F|$(6jla$T|$` fZd|$8 RA>[f.A d"g$S|$h,[fC(fAFE q$1~AH[@$zA^4C [ÁDw|$hD[Ã|$`|$(z7r$gˏ$wA[f.|$xo|$h8X:[Ã|$(K|$07|$(,|$P/AT[[Ðv$I[A[Ã|$(a"|$P-oWA 3L|$8"b[@AH!nO [*Ác|$?0|$`\i[øA|$h;) w |$(ma[fA`$|$#X$UdIAnA[Ã|$`}|$`azeT[Á,K!A[Ã|$uA[Á[Ã$3r|$b|$`R3' K|$8[Ã|$`/|$h22Ar*WT|$8 LT[Ã|$0!"AB[[Ã$Ss v$7[Ã$.$+[ø |$`2%|$`^} 3 [øfA[B|$`T'|$8 v '[1D[Á$[OÁ>$g|$hFA\[Ѓøv|$0[Ã|$0|$8<A-v$wV[Ã|$(XR|$Pv$'[Ã|$P1|$`N7$D#p$;q [|$h!ǺA1[Ã|$(>wm [Ã|$(| 1|$81[Ã|$(D|$`C2[Á3|$(JBs[Ã$I#|$P[Á vAڹ[A  |$6<|$Hp v|$P5[f.$ |$`]@|$P<c$TcQ[Á/![Ã$Qt|$8 [Aq}$Y[Ã|$0Ը[ÁfZoW$$[Ã|$hA:|$8[AOO*$Lw[Á|$[Ap  |$0{BEk|$PE|$P9w|$Hl|$8 JK v|$8Ƿ[f|$8$A_fzL[Art s>|$8 [ЃA |$P7$ $[Ã|$hJfZ/$of [Ð  |$(lJ|$P>rJAuk|$(}[Ѓ= |$`vA[ÁaIfKWI[Á>|$8 t>[Ã|$h0,b^T [Ã|$(e:|$(Y c|$`2H [øg صAP[Ã|$(]faf2#RA,|$h }|$|$A|$0 $BfA`$[[Á$ )[Ã|$H4$*a|$Px[fD>AV||$h):|$P+JA [Á[ø[øA,A[øAA~![Ë$nJ:>:[A"|$hp?AA [Á$L$@…ui g[Ã|$8f] Ѓ|$`ru|$-ƒ|$`zC[Ã|$(A|$P2?A([Áw$o[Á [Ã$XmA:A3 [Á[ø[Ã|$8g [øA]$|Gd [à v|$8"[øI Ac [Ã|$P9v|$ѱ[Á[AAf<|$x[Ã+[ø[Ã|$0 we[ÁBƒ $ [Á w$[Án|$`'w$[Ã$coA<|$h/RKfWss[fD|$l>$h`|$8 <|$H2A d[@[Á.AE.l|$`|E |$P[Ã|$h2ʯ [ÁS[1A[A [Ã|$8 AV[ø[Ágv|$P>M[Ãw)|$h!ɔ:BA]n|$xRn[Á$ [Ã$:[Ã|$hӮ$R-|$`R[Ã|$`*@A@B|$0jy|$0)`yv|$`m[fAb@fAX@ [AN&[Á [A & )[Ã[Ã|$8I$|$P/*M [Á`0)v$G[A*#A[fVy&|$xO$ | [Ã|$h&"|$(< [ÃkOXO$ZZ|_[fMƒ|$O?St3S[A03AAs[fA[3|$(HWx|$8[Ã|$(I%|$0d|$(={hFh$|$h uA[fA_9 P"^vfAY*vA|$`[A [ЃÃ|$`y:A:[Ã[Ã|$8([Á$[fA`LP$|$`4fA>AlN$nv[Á$ F[Ã|$#(|$h/\A"r|$0qA[Á $$RtAl d[à 1$UW v|$x+[Á%8+Add[Ã$r*>|$P7>|$Z [ЃÁi[Á K$|$0QpƏ|$HW n[AW,BATA[=Ã|$(]|$P/a|$(MN|$P=Ey|$0w$IFv$?è[A|:|$i:$~|$8![Ã|$(lQ%|$0%Q|$8 ;$_|$P>|$xƒ|$8 A[Ã|$H#|$xߔ$$[Ã|$`! |$0&YA) $u[Ã|$03$sA6|$0;l|$DlAMwUf^D|$P*2$n$[Ã|$h"$p>Q$$X$[[Á|$8Hnt\|$($][A# |$8b|$P4bAÀtv|$h8[Ã|$8 uM[OfAbpA8W|$`{[Ã|$`%OP|$8=P}[Ã$@D|$0 yty[Ã|$h 26$<6$9|$(5Ӊ$[Ã|$O|$hj0|$8|$h [A% F;|$8$[Ã|$`ICA [Ã|$(@$$=[Ã$-5*|$P[Ã$1AZqA8|$0 oAvu[Ã|$8#|$P4V V|$HT~A~A~[Á$ |$`^=|$0p|$H|$`9vA[Ã|$('4|$P07e|$8[Ã|$?U},U$,UfAa!U[Ã|$hH|$85|$h%5|$P3eB [Á$#fAWMDA[ÁK2[Ã|$h Z$NZ[A;.Y/.$;g[A ~(|$8=H|$8[Á^[Á""Y:|$0 bfF_[Á4[Á[Á'|$9Ra$'a[Ã|$0fA\DA+[Ã|$P/D$I}D|$8 kD|$H `D[fAS $AIf9|$8 $0[AX %[A AyJ|$`t{[AF[à  "$?X|$(1X[Á[fXY#(4fA`c[ЃÁ *|$h"*|$8 R|$h-R[A:e"|$8)R R[Áv |$hG[Á [f\y3$a3|$0T/+iAyj[ЃÁ|$(5$|$hB3|$PI#_A^[Ã|$`g%1$E1[Ã|$P5|$0GAv$ES[AUl#$4W|$8 A/[Ã|$8K![Ã|$8:8|$08(8Ai\[ЃÃ$W |$h5[Ã|$P%LA[A[Ã|$0Tv$$h[Aa[ЃÃ|$(F |$`e-:|$(,Al|$P"k|$`GAtJ[Ã|$(:B$3'|$8V>V[ÃJ [Ã$P|$8(:gA t$u[Ã|$P6LF$g$!6[Ã|$0|$(ZL|$P:a$V=][Ã|$(Y d vH|$8 [DÃ|$h% |$`bD|$@a|$P=E|$h0A6[Ã|$H*&[Ã|$8 [A% v|$- [Ã|$(8|$8[ø[1[Ã|$P#|$8[Ã|$`m: bADz:|$(\[Ã|$P)?#r$^X[Ã|$PjA$|$hhF[ЃÁ#;[Á$q7Ay]7|$0[Ã|$h $|$hA[ËD$0[-=Ák[A %%6 [<A IfYx[ЃÁ[Ã$j |$(d">3Z$VZ[Á;[Ã|$h%>L|$`[vA[A \ =|$(q=[Ã|$05JA[A [Ã" !>|$`O[A/4|$84A A3[Á$N [ø[Ã|$0!6A+D|$P=|$Ha % iU [Á$ X 6$F6[Ã|$8 [Ã|$(M$ t$&[A[Á<ƒ|$0t |$H4[fW $|$`4iec[AUDAar Ur[ø[ø[1fA[[DÃ|$@$|$_|$P5D`|$@61[ÁZG$^G[ÁwvA[fA_2%T|$0 \yAfT@O[fAZ&|$(;|$HxϚ[Ã$xR[A{$|$0t[ø[1fAd[ø[A &|$0'|$P4S|$`X|$h-˦At [Ã|$0 A |$P:[Ã|$P+!|$8 pa|$P$[ø[ø[ø[A.|$h{.[Ã|$`2|$H*8fAWE|$0 C[A5 . g|$8=jfAXm|$n ^$vA[Át>@|$P3@a[à 0|$8 [Ã|$`t-fA_g|$0ܼ|$8ļ-[fAa2AdY#r[ÁH.fAM:Z$AN[fA^74|$-[A6|$x51fAb[D@Áz 11f][Ã|$P5.|$Hdc|$P-c|$8vȍ[Ã|$He+[Ã$r+[Ã|$0'._A_[ЃÃ|$P*K[ Ã|$**|$8[ЃÃ|$h,V-|$ $4]|$h6AZVN[Á [A[1[Ã|$P?2A!lA v|$0p[A[ )A .[Ã|$0݂ ʂfX[Á"[Ã|$Pl-|$(a-|$`gv$΋[Ã|$(/|$0cA7W$cjJ[Ã$p0AT2$`|$A|$0%$|$`IvAw[AW(|$`wpe|$0d$Kdn  Y|$h[ÁfXօ[fA['|$@'b|$8 [A![Ã|$0v|$8 \[Ã|$h.Y|$x[ЃÃ|$(~g|$8fh[Ã|$P",[Ã|$8*$j|$(^DU|$0$U v|$H[Ã|$0v$e [A. .[ø[Á$V2 g|$ [Ã|$871o|$h3no1[DÃ|$H;|$0|$P7A v׈[Ã|$0;$vW{|$h(ZJ[Á5=6o-o[Ã|$H8nAmfAYm[A<|$8[Á f;A*lkAI'[Ã.|$01[Á %*|$0bZAx[ЃÁ$'v$N[Ã|$0eQA[Á|$_1 [Á|$[Ã|$0!'fAaVAV|$h#wA[Ã|$Ht|$0ƒ|$Hl[A+A[A[=Á+A+[A[Ã|$h!>|$P8B|$0"[OÃ|$`{.At|$`ȖAfAYϖA[fASm-A[Ã=Et|$h#[Ã|$P=4|$`~ƒ|$P(tA0 p[Á|$Hszk[ЃÃ|$8$.=e|$H eAe|$`f[Árx[ЃÁ;Ec|$xe9e[Ãp$^8p[ÁX6bAjfb|$`|[Ã4fA`D|$h0D|$h[Ã|$P[Ã|$P-Aa$rt[Á|$(2|$Bp$@ p|$h/ƒ$3u|$`dS[Ã|$88$?AF|$`a0[Á[Ã$>*|$(3h|$8 i;A$[Á [Ã|$`[Á$':~$x~F[Á0.kI|$88IAw[Ã$33|$h.Gf:Ahځ[Ã$|$h<LG\CG[Ã|$89|$0j|$(1=|$h32[ø[Ád|$P'[$K|$H;|$PNAQ$/C[Ã$|$0 9m~[Á$}|$0 =V|$0VI|$h6Y9A̤1fN[Ã|$0-|$8 [fR;fAE)$fx|$@ v|$)[Ãk*[ARn6[Ã$/k$P/AfARfNu>`v|$0 [A}/Avm[Áh-Ay|$8[Ã|$0<&Q|$8"fQ[Ã|$8[AX9$'[Á;/bm[Á$kA[Ã|$H9WC|$x|$(wN}[Ã|$88fAX;aA!T[A fA[Ã|$h+J7y;:[Á|$(BAv:1fU[à h$ [Ã$Pc|$80@$J?A |$|$01|$8[D@Ã|$(9l|$D(|$`9jA[Á[fY3c [A [Ã|$0(fXlfAW[OÃ|$`|$HH;KAwo|[ÁA[Á$Z|$(m8/A [Ã|$0$$F[$[[A'$7P*$3#|$]tv|$h3{[A}*1f@[DÃ|$h|$P/[Ã|$05A[{[|$TsU[Á$a,$[Ã|$8i%|$(@;A?/|$PA[A[Á [Ã|$`$H4|$0 %X Xv$DOz[Á1 v 7z[Em5|$0[y[A[Á$4*|$PB9$Y*[Ã|$H//[AC[ø[Á] #|$`u$ zO [Ã$VGAAYv|$hy[A(v|$8x[Á$tA=h 1h[f.0-$Bg[Ã2A5$G[ЃÁ I;IfA\I[Ã$3!A[Ås>ƒ$>uAvw[Ã|$h-1[ø[Ã|$8v|$0w[Ã'|$`WY9fA`v|$[Ã|$0Z|$h;@A[Ã|$h(=Ay=m=[Á >(Z'|$0<_A "[Ã|$P;[ÃR4[Ã$^>|$`j $$[Ã|$0xxAx[fAP1$uV|$8|$8[ÁeO:[f`Hm6d|$8%|$P%[Ã|$h-"A?$`M[Ã|$`G,A[A$t [Ã|$xAAT4[Ã|$*|$8 Aq?$Bc?[Ã$D1[Á Po|$`sEo[Ã|$P&'D D$0ufAbq[ø[A [Ã|$8 [Ã|$H_'[ø[ø[Ã|$0m!Af[Á$ [A[ø[Á[Ã|$0[ø[Áv$ p[Ã$a#"A_>[ø[Á [Ã?[ø[ø[1[DÃ$I/$:o/$d A|$(.W}AJ}y}2[ø[Á$ ?~ ~A~[ø[ø[ø[ø[ø[Ã|$h{]#]|$h|$`\|$8|$`Gw[Ã|$PA |$8C|$`|$8f2 |[Á?A$v|$P3n[ÁH<AfAaӢ|$@|$ A[Á[Ã|$P.$Dˏ|$0 [ø[ø[ø[AF;$uv|$`sm[1fH[A` |$8 ]8b v$@m[ø[Ã|$(uB5A[Ã|$0$A`f`)A[ø[ø[Á [Ã$R[Ã$l[ø[ÁT$IyT[fS WA4 [Ã|$8l[|$`ka[[ø[Á [ËD$8ƒ|$0/u u[AmaA[1|$H?[DÃ|$(@+|$8||$H[ø[Ã|$h75*|$`**[ø[Á%[Ã|$8k|$0-$5-[ø[Ã$4jL$O;L|$H |$P91|$@[ø[Ã-lv|$8j[ø[ÃH|$h'7t$5v|$Hj[Ã$j|$0`jAr|$0_r$3Jr>rfh-rr|$P+r[ø[Á |$(u M j[ø[Á+ '|$Pƒ|$`~M& A&[ø[ø[ø[Ã$:M[ø[ø[Á$^+ fUx|$P, [ÁO  [ÁF.A .Z;s2s[A+CA[ÁvAh[ø[A0[Ã|$8A|$P0LA}$9$.[Á[ø[ø[ø[Ã|$06qw$h[fP>[ЃÁ[ÁX[Ã|$h[Ã|$0{/[ø[Á&[Ã|$`Y[A+y[ø[Ã|$h3-AkvfA[>g[Ã|$x.*f8)|$P,Ir|$85w|$h"#w|$0S4w|$@Uv vAf[Ã|$P=+AV[Ã|$0)+Ar[ø[Ã|$hT(0(|$`h s|$0r$.rr [Ã|$8.[ø[ø[Ã,e[4Á ~)u) [Á$+$Q[ø[ø[Ã|$`7$[W|$`)pn[A :A[Á u<|$j<[Ã|$P=:$At8 [Ã|$0 (w|$8 d[Ã|$8-$Rf)A{$ {|$H~ ~|$h1~~$Iv~[Áy|$8[Ã|$`-[ø[Ã|$x|($n(AH pp[A:|$(Of:A$;$>yA [Ã$[Ae E?|$0D|$`>o v$dRc[Á ƒ|$h$;|$P70[Aj ,|$P/,$\[Ã|$0 [Ã|$P: =Ah<$<[Ã|$`z:{ [fA`1v|$0yb[Á[A[Ã|$h]8ApA[A[Ã|$8[fG\8|$0TY[Ã|$81![AU[ø[ø[ø[Ã|$`$7|$0v[Ã$]XE$ $W[ø[Ã|$85AHp5|$H$Av[Ã|$8,A d,|$H}|$8kEtA `[ø[Ã|$@v,|$8d,|$h$Y,$YG} ;` [Ã|$8 5A4|$`Gݓ ʓA[A[ø[ø[Ã|$8 )YA^Xf^[Á_[A .f]g$WY[ÃY[Ã|$P%1A;[Ã$a[5([Ã|$P89W$H+W[Án[Ã$; +)fA`|$`rݔ|$x][Ã|$8,A M,[Ã|$HV* [Ѓø[ø[ø[à +|$` A A m|$x[Ã|$h#a]fAa8A[Á8$8|$`QfAaA*[ø[Ã|$`[ø[ø[Ã|$(VJC|$`C0C|$H4|$[ø[Ãq[Á$d1fAC0[Á$~R1Av|$0 \[A[ø[Á V|$@V[Ã|$P&[ø[Á$5[A(vfb\[Ã|$x/Av6T\[A [A[=ø[ø[AZ[fA`(|$P)j(!A[fA]-TVT  |$(iƒ|$H|$0[Ãa,fVx|$P6%x\x|$h-/yy|$8yAy[A E%|$P*%|$`o^||$0[ø[Ã$C4f^w-A 4A, A |={[ø[ø[Ã|$8OiO$XO[fAG&R|$H R][Ã|$0UM|$(c[Ã|$0[ÁK[ø[fN[Ã|$8 [Á$$P|$h0vP$}[ЃÃ|$`9[A [ø[Ã|$0 |$8l[Ã$?*@|$P%@A߷$[ø[Ã|$8 [6[ø[ø[ø[Ã|$8B@|$0R[Ã$sPL|$(IL|$0m|$h%Ay[=ø[A[AT[Ã|$H=|$8wA"5X[ø[Á [Ã$Vt>[ЃÃ|$(l[IRAz[=#Ѓø[Áv$W[Ã|$8!F6  A|j$|^j v|$0 RW[Ã$RE[Á[Ã|$P*A|$8$Mw[AG[ø[Ã|$(GG$?G[Ã|$0?|$h'[ø[ÁD] [ЃÃ$GM|$HM|$P*[Á ;M[ø[à A/[ø[fPMD :D 1D[Ã|$h)V|$03fV|$H[ø[Ã|$x  [ЃÃ4|$4A,ɺ[OfA^T  [ø[ø[1[ø[ø[Ã|$077A|$P:[Ã|$xD [Ѓø[Ã|$`<D$#DA[fQA%DAO[ø[ø[ÃRD|$0!GDҠ$Z[A" [ø[ø[Ã|$P!v$6S[Áz[Ã$D|$HfNt|$P7wS[Ã|$8vXS[Ã|$P(CQA[ø[Ã||$P8S[A>[ø[Ã$/[Á+ j6 |$P@[ø[ÁR[fAb 6|$x|$h8ݘ|$8sR|$0AvA TR[Ã|$hM7$O7$A[Ã|$h02|$P)P[ø[ø[Ã|$8:$ U[L[[ø[ø[Ã|$8[Ã|$8[Ã|$`X3|$|$0H|$P=vFQ[ø[Ã|$xX3|$PG5|$h,1%[Ã$:D[Az:>$P,>[Ã|$0G$ |$`,G|$8[ÃU^fA_~7gP[Ã%2 1A|$8)d|$`Fv P[Ã|$` [Ã|$@|$0eAd[Á[Ã|$8'[Ã$ma[Ã|$x|$8[Ã|$8>fA[q>|$0;[Ã|$P6[ø[ø[ø[ø[Ã|$mfAW7|$`v|$HN[ø[AZ =A=A =vAN[ø[fY=$[Ã|$8F.?,A[Ã|$`2j$W1 [ø[à Z8|$h28AA |$` |$8[ÁMfAX%$)Hg|$8 [A/4|$0:+[ЃÃ|$ | |$P!q [#ø[f[pM|$P:IM|$P7+o[Ã|$`7HA H|$8[Áv v|$h:L[ø[ø[fR1[Á$GA TG|$(NQfAb Q|$0 Q[A M?A<,?[ø[fUJ|$h-8|$8[ЃÁ/$[Ã\7<7C[Ã|$h=[ø[ø[Av K[Ã|$`<K|$8KA$s [fOi8+[Ã|$P+ IAH|$`[HA[Ã|$h2ե|$|$`$y[Ã|$8 [Ã|$0#L[Ã$F<|$`!<A[ø[ø[ø[ø[ø[Á#5$L|$`vAVץA[ø[A[Ã|$`7A% s|$`[ø[ø[Á[A`M2$@02`[Ã|$8k[ø[ø[Á$ƒ|$(N!ƒAau|$8,I[ÁZ [aÃ|$8)A[Au6F|$@ЄAф|$@A[ø[Ál &|$8[Á [Ã|$hD$,[ЃÁ1|$`g1 [Ã|$P"E|$`?y_[ÃC$Oƒ$lu G[Ã|$8[Ã$]BBI۫fA^|$`pfM_L[Ã|$h,=|$xb=A}ϱ|$8sAr_OA;fA][Ã|$0[ø[Ã|$8 '|$`'a|$h2)Ad[Ã$: C|$h!CfAZ6[Ã$| P[Ã$dIC.C|$fF|$P8A[ø[ø[ø[A+l&1A[Ã|$0$ HfAWG|$`A [Á|$|$h4[Ã|$h.Z8|$8 1|$H6[ø[ø[f]??A[Ã|$`%Ay![Ã|$(cG|$*}G|$P8|$8[ЃÍWŸRDU{[Á$G|$(.(|$`99N[ø[ÃVw7$&V$uV=[ø[ø[Ã$%NU$UAW[Ã|$P,}U|$8w|$HC[Á|$H WfYX [ø[ÁS [ø[ø[Á[Á$5[f\H$e [Ã|$H 0TfQTT[Á} [Ѓø[A UA [fQ[Á[ø[ø[ø[ø[ø[Ã|$PAU1[Ets|$8wl$V|$(V[ø[ÃwU$EQUA9U|$8'U[ø[ø[Á$a w|$8v|$hA[Ã|$8U$XU[ø[Á$([Ã|$8 T|$h+7UAv$CA[Á$ S[Ã|$8Z|$P4oZTZf[ø[AQQ[ø[ø[ATHQ|$P,=Q[ø[ø[Ã$ƒ|$`Mt F%S[ø[Ã|$0?S$pRA&[A[ø[A L[ЃÁ$ vA?[ø[ø[Ã|$7APE)P[KfB~|$8?[A[Ã|$8 [ЃANY[Ѓø[ø[ÁyTo[ø[Ã|$P=w# BX{6X[ø[Ã|$h5K|$K[ø[ø[Á [Á[Ã$lJg[Á)[ø[ø[ø[Ã$DJ[ø[Á T|$P7SA S$TS VA[Ã$QSS [ø[ø[ø[A%V|$(NAt|$Hƒ|$P/H[Á|$` W[ø[AWLf=LfAWcI5WI[Ã|$`-]]|$(G][Ãw%$AG[ø[Ã|$H}<[ø[Áu[ø[ø[à [FfYQFA=F01F[Á\[Á$Ii[ø[ø[ø[Ã|$P7QP|$0%[ø[ø[ø[ø[ø[Ã|$`fMQ$O}R|$P7OR|$8R[Ã|$8v;;[ø[fNAG|$P@[ø[Ã|$h" ED$SD[Ã|$0JU|$h#8UAU[Ã|$P9tIIPI|$(Q5I|$`NI[ø[ø[Aw Av|$8H:[Á[fUF([[ø[ø[ø[Á$v|$h 9[ø[ø[Ã|$`2F[ø[ø[ø[ÃFvf`w9[AJF[Áv$b 59[Ã|$P<A(HpOA\O1f;[DÃ|$0EA  E[fA[G[ø[f<D|$8&D[Ã[ÁF$FfAKiF|$0TF[à [ø[Ã|$P5f\&Y|$0R|$8RRR[ÁvfA^7[Ã|$(T|$h.OA[Ã$SR|$8qR S9RAO[fA\M|$h;M|$8M[A M{M[ø[Ã|$H}r6[Ã|$$OA[AQ QAdQ[AU|$`@nUABU/UA[Ѓø[fO0ccc[fA[ }[Lø[Ã|$PFUA v|$`i5[Ã|$8b|$`oRb$L[AW|$P;VA9[à  A[|$8 lvlAyq[e[[ø[Á[ø[Ã|$` Tf<T|$0?T[Ã|$(*U|$HT|$8T|$0T|$xU U[Á$[A T|$0 [Ã$[FTfTø[Ã|$8iAvAK3[Á Jh(hfZgg$i[Á$h|$H`h|$Hܺ[Oø[Ã$DOAnvO|$hkO[Á 3i$]i i [ø[ø[ø[ø[Ã|$h5wC [Ѓø[Ã|$h(wZ|$(4[Á [ø[Á ]UAhv $2[ø[1fAZ[A\f|$xJfAC[Ã|$8 wv|$h%1[Ál[Ã|$H [OÁ [Ã$#O|[Á[ø[Ã|$h;S|$kS|$@ƒ|$8+jAwj[Á)l$7l[Ã|$h$fO [ø[ÃU[fATO[ø[ø[ø[ø[Ã|$P6O|$0O$d}O%qO[Ã|$P;w>]][Ál [Ѓø[Á%[ø[Ã|$0vAf\jS$:SfA^SAY[ЃA[Ã|$(?=]|$h[ÁbZOZ [ø[A5 , [ÃL|$8[f7-c|$0  cA[ø[ø[Aw)|$`Wc`[ø[ø[A4S|$h7S$8lS|$8[Ã|$0}a`|$8V`|$FD`|$P,nJv|$@G.[Ahh|$8ph ]h|$@Rh[Ã|$`&wA|$8#J I$I!v -[ÁUwA-[ø[A [ø[Ã|$`"X|$0m[1|$@[1|$H[Dø[fA[iA6U|$8C|$P6&|$`1ncb[Ã|$w.fAb$vf^,[A[fXg[-[|$0>[Z|$8 Z[à [à 0|$`ƒ|$h+u Aد[ø[Ã|$(M [fAb,T|$`NS|$0S-S+R|$P3[A [Ã_|$h1[fGAf1|$8[DÁ$^[ø[Á6[Ã|$8_|$(N[ *|$8$yfAVA[ApO|$P@TOfO-OO|$8N=[Á[ø[Á f|$8 e[ÃU|$ڏ|$P6ȏ|$0$1EfA`[ø[ø[ø[ø[ø[ÁQ[Ã|$0a|$aA[Ã|$zL|$8K+[Ã|$8[Ã|$(YbfHzbAib[Ã|$8 R|$(TaAER[Ã|$vr|$(s֨|$`_A$R^bfAbLb|$8[øA&fAZA[Ã|$0%NAM|$8[AbA[As2|$8ʎ$>[Ã|$0[ËD$`{wt 5&[A[Ã|$(B^A^$^|$hp^Aw%[A|$0a|$P@.a|$8#a[ø[ATP[Ã|$(+[Á[Ã|$0A\g4\|$h)\[ø[ø[fA`$J$>4$[ЃÃ|$h05]|$`##]Af]|$0\'[fAW|$8 _|$`u_$n_A2!_2[Ã|$x $1 |$h3!Ѓ$c„f|$P<[fASO[ø[Ã|$h2[ø[Ã$g`I|$4IAI|$8gZAZv|$u#[ÁPO_L[Ѓø[A GN 4N+N[Á7^[Ã|$(<^$^([ÁT]X[Á$|^c^AR^|$h"w"[Ã|$h(h^ [ø[Á4[AqwA$lqfOqASqAv|$h' "[Ã|$8Ĝ|$0|[ø[ø[Ã|$xw$w[ø[ø[A/w [ø[A q [A[ø[Á[Á|$ $`+|$``|$0܉8 ɉE[ø[ÃA$} ǞA71|$H[D@Áѝz|$P!u AJ[ø[ø[f]2|$8 [ø[ø[ø[ø[ø[E}[Á$r[ø[ø[Ã|$P,ww[fA[DtA 3t|$8(t[fVtYt|$Hs.[ЃÁ[Ã|$H [Oø[ø[fAR [Ã|$0+[Ã|$P6v$Q[ø[Ã~[Ã|$2w6|$h2=t|$0t|$H}A[Ã$ZfA@[ø[Ãp$owAk9[ø[Ã|$8[Ã|$H|$[Áv e[ø[Á[Ã|$8[Ã|$hwB$=d|$(2Wd[ø[ø[ø[Á[ø[Ã|$0 [ЃÃ$3Cdn[Ã|$P<J|7|.|[ø[A[ø[Ã$4w$2w[A[à ov[Ã|$HvVv[ø[ø[Ã|$ ƒ|$P:u|$8u[Ã$LAu9|$h5w2A[A[Á[ø[ø[A*u|$hu|$(-u|$xt[ø[Á_!AwU![ø[Á9|$`&kgk$?[à [ø[Ã|$8[Ã|$H Fv|$P4@[Áj[Ã|$H  ^  [ø[Ã|$P(A;[Ã|$0 [ø[ø[Ã|$Pwdfa^[Ã$o$OZ^AM^[Ã|$`pwFA[Ã$.|$((!Ѓ|$`c„t|$8&[Á$ }rA[ø[Ã|$P<c|$(Sb|$Hb|$2b|$0(b[Á|$0wDf8q[OÁ[Áw+[Ã|$P4q![A[1|$H[DA"qfXq5pAp[ÁMp[ø[ø[Ã$?mQ|$8[A)] [Áiv|$8x[ø[Ã$ZwvA:I[Ã|$8[Ã|$0(BU6U[ø[Ã|$`0fP|$0$5|$8|$0?[ø[ø[ø[ø[ø[Ã|$0 [ÁP[A2l|$`J{lA[Ã$M|$h-j|$(>j|$0i|$P,l|$`:_lfA]Gl|$8[à (l[ø[Á#iA+ifAaiA[Ѓø[Ã|$0i$5]]h|$`kvR[ÁgvA1[Ã|$0?a$<a$pwA<j[Ã|$8R|$P,]A[ø[ø[ø[à R[ø[Ã|$x0eA eA [A5[ø[ø[ø[ø[ø[Ár[Ã|$PdZd[ÁdA [Ã$\[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á[Ã$J^|$h1^|$@r^|$8[Ã|$8 \A\[Ã|$P0$C[Ã|$@A [ø[ø[ø[Ã|$h3^{[Á[à ]|$8] [Á[Ã|$h[ø[Ae [ø[ø[A[A[z[Ã|$0)[ø[ø[ø[ø[ø[Á [Ã|$P+[Áw|$hw|$hww$ vfai[Anw,|$`{$Bv|$P)4[Át[Ã|$(^wAvw cw|$h%Xw[ø[Ã|$hA-vE [Ã|$(P|$`_g|$VAVV$[LÃ$YA܂|$8 [A[ø[Á|$Hww[Ã|$h', P[ø[AnI|$P,FI$ZIA[[fJ/|$h?[ø[Ã$3*|[ø[Ã|$8N0NfM$gM$5yM$WOM|$P6=Mf_M|$h&[Ã$Kw(~|$(Gvl [Ãg$mD|$`L$[Ã$v0|$0 w&[Ã|$8oT>[ø[ø[fc&|$8 !TfAc~  [Ã|$P"|$x[ø[AV|$(SVVAV[Ã$>O|$0N$-O$:sNq[Á$V+3 [A[ø[Ã|$([ø[Ã|$ht3[ЃÃA5I|$P5kIA FI|$h3J|$P5J$[ЃAg[ø[ø[Ã|$8 [Ef< |$@ |$P9T $(? |$x[ø[Ã|$P=[ø[ø[A4A [ÁA  [ø[Ã|$8[Ã$X%{A9z|$8 f_[Á[Ã|$`$TA,xNLA=L$M[ø[Ã|$xsk|$(ek=k[ø[Ã|$`IH[Ã|$(cw3AH|$h6eH|$8 v|$h l[Á z$xY|$8 6 2|$`6'[Amf]GG[ÁE$~Ev[Ã|$(y|$(zyAOy$zzy|$`Moy[A[Ã|$05D|$HCAu[Ѓø[Ã$E[ø[ø[Á$[ÁUJ$D/J$6[ЃÃ$R|$hF|$0Aj [Ã|$P<v[Á[Ã$"y[ø[Ã|$0i[A |$8 $` |$hq $9N [Ã|$x[ø[fV0t|$h3tns1|$@[D@Ã|$`.uf|$((g|$(f|$PB#hhg[ø[Ã|$h0[ø[ø[Á${|{[ЃArfAZ[OÃ|$02[Á[ø[Ã|$hqhq$cA4 > v|$`'[Á[ø[ø[AwU[Á$ ?[Ã|$H?.?[Ãf?[Ѓø[Ã|$]w+AS[Ã|$P1?|$x[Ã|$`'@|$` @|$8[Ã|$`VwRV[Ã|$h-?|$0?|$8ƒ|$8 ?A?[Ã|$8 $b  [Ã|$P,[Á [Ã|$8[Á$$x|$P1x|$8 x[ЃÁw|$8[ø[Ã|$`z{[ø[ø[ø[A[A$*[Ã|$w|$vAgvf\GvA*b][ø[ø[f[tA[Ã$][Ã|$@b|$PAb|$0#bb[à b6vAh[Ã|$8[Ã|$P'b[Ѓø[ø[ø[ø[Ã|$h0`'z|$P.z|$HA[Ã|$P)._A^fd^ yv$<[Á]|$`pwA!x|$8w|$`myy[Au[ÁN[ø[ø[ø[A[ø[ø[ø[à |$0$|$P/fR[Á$+ xCA6z$ %z[Á[Aƒ|$(]Mx|$(_Bx[Ã|$`w6$/v$wS[Ã|$Hxf*x]xfAV5x[ЃÁu|$`~^u&;u|$(D)uAwhp[Ã|$dxSQxA[Ãxx [ÁJ w!wfAU[ø[ø[ø[ø[A[ø[ø[ø[Aw5|$0 w$|$8 v[Á+[Ѓø[ø[A[ø[Ã|$0wG|$` w.fW~!Aw;[ø[Åt8|$Bw1[Áw7w+|$P?w$At[ø[ø[ø[fV3|$`w,Aw|$0=w[ø[ø[ø[ø[Ã|$0[ЃÁ [Ã|$(7$ |$0*ƒ$4tGAiv>[Ã$z|$(B|$h,w9|$hw[ø[Ãw?|$0w,|$8[Ã|$8 w7[Ã|$8 [Ãt'3[Ã|$0 v1|$8 [D@ø[ø[fAW|$(Z|$H|sf`X|$h9w-1|$H%[Áw,|$0wUw[Á[Ѓø[Ã|$8[ЃÃwX[ø[ø[Ã|$`$w(fU~vA[ø[ø[ø[ø[Ãw>$`w#$AwAsr[A'[A*|$$T[ø[ø[Aw?wA[ø[Ã|$`rw&wAv[ø[ø[ø[ø[ø[ø[ø[Ã|$`wL$wD[Ã|$h)|$x|$&wBw&A[ww[ø[ø[ËD$0[' Ã|$7w!$Yw|$P+[ÁvXAwH|$h>vA[fM~&w|$h7v|$P6[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Áq[ø[Ã|$09|$P[ø[ø[ø[Ã|$0v%$U[Ã|$`\[ø[ø[Ã|$8w|$P6w[Ã|$h5[Ѓø[ø[ø[Ã|$8w~$wO$Jt>w/Aw[ø[Ã|$P#[ø[ø[Ã|$h|$P,w<[Ã|$h!|$@AvmV[ø[ø[ø[ø[ø[ø[Á1[vAw2|$H|$|$H~w[ø[ø[ø[ø[Ãw Av|$0B[Á[Ã|$h%|$P-[ø[ø[ø[ø[ø[AA[ø[Ã|$H@|$@~Aj[ø[ø[Ã|$8w&[Á[Á[ø[A[ø[Aw831|$@[ø[ø[Ã|$(G[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á$ vF|$hw[ ø[fAb3w$w|$Pw[ø[ø[ø[AI$ u|$H3[Ã$}w!A[Á$[ø[ø[Ã|$@~}|$PBvo[ЃÃwLA[Ã|$(ew0wAv|$8[A[ø[Ã|$x[ø[ø[Á[Á[ÁNv,Z[Á$gw|$0[ø[Ã|$0wF$B[f69v*A [ø[ø[ø[ø[ø[ÁPA[Ѓø[Ã|$Hv8w3[à wC|$8 v5$,v$w|$H}[ø[ø[ø[ø[Á*[Ã|$ht!A v[Ã@[A[ø[fAW-AU[Áv7[ø[ø[ø[ø[ø[Ã|$P8[ø[ø[ø[ø[ø[Ã|[ø[ø[ø[ø[Áe[ø[ø[ø[ø[A}w6|$P9v/[Ã$"wAfA][ø[ø[Ã|$P'vm[ø[ø[ø[Á [ø[Aw&sw[ø[ø[Ã|$hw]|$`nwOAw.[ø[AwA[ø[A[ø[Aw;$=[Ã|$`hwg|$Pv`5[ø[ø[Á[fA[t|$H||$8 k[Á[ø[ø[ø[ø[ø[Á[Ã|$8[Á[Ã|$`-wz|$P1[ø[ø[1fW[Ã|$8wA4[ø[Á[Ã$"[ø[ø[à [Ã|$(&vAw[ø[ø[ø[Ã|$P,vCA[ЃÃ|$w:fAU~,A9w#[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Áv.|$h)v P[Á[ø[ø[Ã|$wIAw|$P5[ø[Ã|$0v@$X w,fA^~%|$0[Á*w.|$P7v'[ø[AvO[ø[ø[ÁY[kø[A[Áv{|$@~VAtI[[ø[A w$[C ø[ø[ø[ø[Ã|$8 v|$HظO[ø[Á"[ЃÁ%[Á v|$8  [ø[ø[ø[ø[Á |$8 [Ã$;*[ø[ø[ø[ø[ø[Á>[ø[Ãw;fT[ø[Ãv*Pw"A[A[ø[Ã|$8wR wMw8$0[fD([Á[ø[ø[Ã~@fAZ2|$h1w+[ø[Ã|$H}C|$xv5/w-[ø[Ãwj$2wF[ø[Ã|$PA|$0!wc|$H |$0 [Á |$8w{[ÁwWfA]uP[Ã|$0wk|$h>[ø[ø[fK~&|$8[Á[ø[ø[ø[ø[Á[1[Á[ø[ø[Ã|$Hr|$(Hw[|$H[OÁ w! [AG[Á [ø[ø[Á1[Ã$B[ø[ø[Ã|$0[Á[ЃÃ~`AvP[Ã|$@~[ø[Á\wPAvG[ø[ø[Ãw|$P"w[ø[ø[ø[ø[A[ø[Ãtw|$PFwi|$@}C[Ã|$8 vC[ø[ø[ø[ø[Ã$Kv_[ø[Ã$0 [ø[ø[ø[ø[ø[Á$w~AwbU[Áw&$wAi[Aw_AwOA wI|$PA[Ah[=?Á wZ$|[ø[ø[AvC[Áw%|$H~[Ã|$P1wu[ø[Á[ø[ø[Ã|$xw|$8w |$P8wA#[Ã|$H}'Aw[f;A"[ø[A|$h5|$8 w?|$xt8[ø[Ã|$`~wVew0Av#wQ[ø[ø[ø[Ã|$`Fw|$P.][Á[ø[Ã|$0[ø[ø[ø[ø[ø[ø[Á$,[ø[ø[ø[Ã|$(Pw0w/$L[ø[Ã|$0-v&w[ø[Á>[ø[ø[Ã|$H /A~vA[ø[ø[ø[Ã|$0[Ã|$8 v|$`[ø[ø[AYfAbe|$8[ø[Ã|$h7[Ã|$8w'v[Ã|$0wA[ø[A[ø[ø[ø[ø[Ã|$0[Á[ø[ø[à v[Ã|$[ø[ø[A*wd|$0 [Ã|$0"v(Av|$8vU[ø[ø[ø[A[ÃwNAw0w!vA0H[ø[Á+v/[Áw%|$8w[ø[ø[à wtvl[Á[ÁM [ø[A [Áj [Ã|$8[ø[ø[ø[ø[Á|$h[$7vOv@[1[D@Ã|$8pA[ø[ø[ø[Ã|$0vB`v3|$0w%w[Ã|$P8[ø[ø[ø[ø[ø[A]w>$K[ЃA^[Ã|$8 w"|$0[Á[Ã[ø[fA[$[ø[Ã[ø[Ã|$0wDw$9[ø[Aw!$@v[ø[ø[Ã$@[ø[Ãw[Ã|$`[Á[ЃAvfM?[Á% [ø[A wM|$xu6AwX[Ã|$P;w[$i[ø[Á[Aw8|$h5[Ã$Ew&[Ã|$8 [ø[ø[A wa$ew:Aw|$h9[ø[Ã|$h0w#|$0v|$x[Ѓø[ø[Ã|$8[Áv|$P0[Áwly[Ã|$0 =$AwG)[Ã$I[Á[ARw~D$L[Á^[A[ A[Á$?|$0|$ |$H}\[Ã$E($:$A[Áƒ|$`wu Acv[ø[Ã|$(3[Ã|$`i$I$<[fb~'[Á[ø[ø[ø[ø[Ã|$8w%$wj[ø[Ã|$[ø[ø[ø[Ã|$hv"$IvJV[ø[ø[Ã|$(fvpAvjA'[Ã|$`&fS[Ã|$0 w8|,fP[ø[Ã|$8 [ø[fA\!$bv|$H[At)[Áw[ø[ÁIv|$89[ø[Ã|$8v@[Ã$I[ø[Áq [ø[ø[ø[ø[ø[à $S|$8|$0D|$`wt$7wWAw[Ã|$P6w,^[Ã|$P.A[ø[Á[ø[ø[ø[ø[Ã$_wv[Ã|$8 [ø[Á$ w[Á[Á v|$hz[Am w.AL ƒ|$Ht? C[Ã|$y[ø[ø[Ã|$h8 w}$4tl> wSAwF|$h3w/1|$8[ø[Á$@[Á[ø[A [ø[Ã|$h6ww[ø[ø[ø[ø[ø[Ã^[ø[A[ø[ø[Á2[Á3wG$[A[Á,wl|$H~=|$8 w/t[Ã|$xtZ[ø[ÁCAu$}w[ø[ø[ø[Ã$@A[AAwk[Ã|$`OfA`|$ H&$3|$0-w][fa~,|$8w[ø[ø[ø[ø[fA^,[ø[Ã|$P6w-$.v|$(?vA[ø[Ã|$(?w At$>[ø[ø[Ã|$e|$(BHfQ |$(9{[Ãw%A[ËD$h[-Ã$:w`[Ã|$h'[[Ã|$0wB$Ew1Aw!|$x[Ã$D[ø[ø[ÁlfaXwV|$P.wO[Ã|$HA|$h[Ã|$P&v2|$8w$AwAw[ø[ø[ø[ø[ø[ø[Ã|$Fw($[f[OÃ|$Pƒ|$P$tF|$`}w?[ø[Ã|$x[ø[Av $H[ø[ø[ø[ø[ø[Ã|$8 [Ã|$`QwS|$h!vEAa[ø[ø[Ã|$H|ʾ[ø[ø[ø[AOvfb[ø[Ã_v|$h.v[ø[ø[Ã|$P=wN|$P/w%|$`fbu |$0[Ã$IA[Ã|$(aƒ|$0A[Ã|$(ZAf\A2[ЃÃ|$0w$ v[ø[ø[Aƒ$JtI|$0$u/|$P'w!$wn[ø[ø[ø[Ã$Gv*w|$P5w[A [Ѓø[ø[Ã|$0wuwQv$A[ЃÃ|$0w[ø[Aw|$P2wbA[Ãw;Aw+|$8u$[Ã|$8wf|$h(vXwP[ø[Á$[ЃÁw|$8 v[A[ø[ø[Á[ø[ø[A[Áw*K[fU"vw[ø[ø[A[ø[Ã|$h"w |$P4wAB[A[ø[ø[Ã|$0w|$0[ø[fA]6kw[ø[ø[Á[A[ø[ø[ø[A[Á$ [Aw:|$h&w[ø[ø[Á$[Ã|$PBwhv\$wHAv;w3[Ã|$h0[1fAa[ø[ø[ø[ø[ø[Á[ø[ø[Ã|$@~E[ø[øzAwfJuw[ø[ø[Ã|$ [Áw4|$P=v&w[Á[ø[ø[Ã|$8[ø[ø[ø[ø[Aw%[Ã|$hv/A$[øA|$8[ø[f]~(A[Ã|$`VwA"[Ѓø[Ã[OAvw[ø[ø[ø[ø[ø[Ãw*[1fAh[ø[Ã|$H [ø[ø[EtI[Ã|$u9|$0[Ã|$0wq|$P/wR|$`.w4|$P([Ѓø[Ã|$0v>[Ã|$`Sv/@[ABv|$0 [ø[ø[ø[ø[ø[ø[ø[Á$w$[ø[Á[ø[Ã|$`Yvkh[Ã|$h2|$(6|f>k[ø[ÁwYA`w$|$P2ww[ø[ø[Ã|$8 |$h!wb$wNf[Ã|$`-v3Aw&$NvA[ø[ø[ø[Ã|$0wX|$0w>|$`Gv0|$PAw"|$(7v[Ã|$@[Lø[ø[Ã|$8 uw[ø[ø[Ã|$`{w0v!* vA  [ø[ø[ø[fAO,[fAT$8[ø[Ã|$[ø[Áw~$wjwT|$8 vM[AIv|$x][Ã$Aƒ|$P-uw[ø[ø[ø[Á|$`6V[fa|$P.w[ø[ø[Ã|$h#w&|$0[Ã|$0t1[ÁvA,[ø[Á$2w"~=w[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$0|$8[A|$|$h6wkJ[f>f$vt{Awr[fD~>[ÁWv|$xuRc[ø[ø[Á)[ÁO[ø[ø[Á0[AvhA[fY|$()wbAm[ø[ø[ø[ÁwA[ø[ø[ø[ø[ø[Ã|$0wawO|$8w3Aow*[Ã|$h#v*|$0w$<[ø[ø[ø[Ã[Á;[Ã$D|$`{v|$w'1A[D@Ã|$(>w!A[Á[Ã|$hAWA[ø[ø[ø[ø[f\'AA[Ã|$x [ø[A|$P=[ø[ABiA$B|$@~$ [Ã|$0w#[Ã|$8vS|$0[Ã|$8 w6fA^tcv|$Oz[Á[ø[ø[Ã|$h2w+A0[f[CAw%A[Ã|$P9wEz[Aw3|$0[Á$! w)[ø[Ã$J[Áwd|$H}V|$@AfA_:|$h.[ø[ø[ø[Áw|$8w[ø[ø[ø[Ã[ø[ø[A^w[ø[ÁKwU$jvK[A][ø[Á$vȭ[ø[ø[ø[ø[ø[ø[Ã$7wi0wZwK|$P3wD[Aw$|$0v$x@[ø[ø[ø[Ã|$8$:w|q[Ã|$`MwS|$8 w<|$8v'|$P?[Ã$,vA=[ø[ø[Á[Ãv2[ø[f[/Aw|$0[ø[Á[ø[ø[ø[ø[ø[ø[AvI|$8 [ËD$0[ Á$w'$gww[ø[ø[Ám[ø[Á$ |$(7$Cv}|$8wYkvJ[ø[Ã|$Tw Av|$0J[Ã|$8 [ø[Ã|$H~+Av [ø[ø[ø[ø[A w|$x[ø[Á, [Ã|$0v-v!$@v[ø[ø[ø[Ã|$0v|$h,y[Ã|$H}|$8[[Aw1|$h= v [ø[ø[ø[Aw%$ wA[ø[Á^[Á [ø[Aw[ø[ø[ø[Ã${[A[Á'|$(.J[Aw |$0vA[Ã||$0[Ã|$`w%$w ƨ[Á[ÁIAOw=|$P.w|$8[ø[AA.[=Á$ wq|$`B[A[Ã$4][Ã|$P0f\|$8[Ã|$P7wvAwp[ÃwS$% w?|$hv1f^[ø[Ã|$H[Oø[ø[A[ø[ø[Á#[ø[A[Ã|$`g|$[Ã|$0w٦[ø[ø[Á[Ã|$H$4|$8v.[Ã$3w2|$hw[ø[Ã|$H[OÃ|$@$l |$0 wrw[|$`5vMEu7$=w&Aw[Ã|$8[ø[ø[A;[ø[Ã|$P>[Ã|$8wvL[Á[ø[A"w[A[ø[Á!w$A[1|$H[Á[ø[Ã|$[ÁewGAXw/|$0t!A%wܤ[ø[Ã|$8[Av8|$8w$H[Ѓø[Aw [Åu|$P+[1|$8[D@A7[ø[Ã|$H}9[Av1|$`sw*A[ø[ø[ø[ø[ø[Avv tգ[ø[ø[ø[A|$0:[Ã|$0[ø[Ã|$H}G$dw[Oø[Anv{4[f_YuAP[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[Ã|$0v|$H[ø[ø[AwAw[ø[ø[à w%$w@[ø[Av6|$8w|$H}j [Á[Ã|$0 A[Áw8|$(@w!A]v:[Á[Ã|$hp[Á[ø[ø[ø[Á[ø[ø[ø[A[Á[ Ѓø[ø[Ã|$(J[Ã|$8w;1fM[D@Ã|$h.wavR|$0w=|$hw'[ЃÁw&[Ã|$`7[ø[ø[ø[Ã$zw-Av AWv|$(MQ[ø[Á$]v[ø[ø[ø[ø[Ã$=.A |$x|$`A|$`rwsv_2[Áw#|$hw|$`ew[ø[ø[Á$vm$8v\ [Ã|$P[ø[Ã|$ht|$P&[Áy[Áv[ø[ø[ø[Ã|$P[Ã|$w.o[Ã|$v/|$hw[ø[A[Á[Ã|$0w6[ÁwPfW3Aw#$d[A[ø[Ã|$`vCj[ÁwiAwL|$0%w8|$h=w*Aw|$h6v[Ã|$0 [ø[ø[Á~[à w qv[A[ø[ÁNw2$w%$wc[ø[Á[ø[Áƒ|$Ht%|$` w[ø[Á[ø[ø[ø[f:~3|$H%v*[Ѓø[ø[ø[ø[ø[fAX[OÁv|$0|[ø[Ã|$[ø[Ã|$(cw [ø[Ã|$8 2)[ø[ø[ø[ø[Ã[f[A$R|$h,vCB[Ã$WwEA w5Av%Av|$0w[ø[ø[ø[ø[Á$X w,fA^[ø[ø[ø[ÁPwF[3ø[ø[ø[Ã|$w%|$H}[ø[ø[Ái[Á:[[Ã|$`JmfA_B$4[ø[Á$wq|$`|wc$/w4A[Ã|$PBw=|$`v/v H[1|$H[D@ø[ø[ø[ø[Ã|$`RfA^/[Ã|$@|`|$(#wFAw'[Á$w[ø[Ã|$P5[Ã1fa[Á=[ø[ø[ÁwJ[ø[Áw[ø[Ã|$8[ø[Ã|$0 wj$wV|$P;wA$9v0Hv([ÁVw[ø[ø[ø[ø[Ã|$h!$6|$h%fL[OÃ|$8 ƒ|$`A wx[fY[Ã|$ht|$Ht[ø[A[ø[ø[ø[ø[ø[Ã|$P,A v:fA_A[Ã|$8 [Ákw|$xt[ø[ø[ø[ø[ø[ø[ø[ø[ø[Á$ w!&vA[fZ[Oø[ø[ø[ø[Á<v|$(4[ø[ø[ø[Ã|$xv|$`-a[fA_Aw[ø[ø[Ã$GwXAww;v,[ø[ø[ø[ø[ø[fAa$[AF[Ã|$8[ø[ø[ø[fZ|$`9Aq[ø[fUK|$P,v=w#[ø[Ã|$P2[Ã$C[ø[Ã|$H  |$8|$0)wy[Ã|$0[ÁwM|$(Gw?x[;Ã|$`FvA[Ã|$h)[ø[A[ø[ø[ø[Ã|$P2[Ã|$[ø[ø[ø[A/v#fM~[Ѓø[ø[ø[Ã$K|$(v*A;wUv[ø[ø[ø[ø[Ã|$`wA[5ø[Á$w&[ø[ø[ø[ÁDv[fA\u w[ø[ø[Ã|$h-[ø[Ã|$h(w+|$`bwv[ø[Ã|$8[ø[Ã|$hwtADv)|$8[Ã$XvAwv[ø[Á$[Awz|$`wP|$`A[Ã|$`[ø[fAat?fY$AwAw[ø[ø[fa~0w([ÁvA-W[ø[ø[ø[fa~[ø[Ãw|$0v|$x[Á{[ø[ø[ø[ø[Á w|$(awAƄ[ø[Ã|$`v[ø[Ã|$`9wLA2w#@[fA\6|$0;[ø[ø[Á$[ø[Ã|$8[ø[Ã|$h,w/$sv[ø[ø[ø[Ã|$8wzAhwj|$8wv[f#9Av,D$0H|$P:v [ø[ø[ø[Ãv|$8V[ø[ø[ø[ø[ø[ø[ø[ø[ø[ø[ÃAut$b ߂[Ã|$P![f@|$0V [ø[Ã$?[Ã|$h;$Lw;|$8ws [Á [Ã|$0wi[Ã$PA[DA+[ø[ø[Á}wA[ø[ÁG wA|$8w:[ÁD wPwK[ÁP[Ã|$8[ø[Ã|$`w%A w|$h4v[ø[ø[Ã|$0" [ø[ø[Á[ø[Á [ø[ø[fAW9[Á$w6$V v"w[1|$H [ø[ø[ø[ø[ø[ø[Ã|$0v4Aw.u|$0 w[ø[ø[ø[ø[ø[ø[ø[Á- [ø[ø[Ã|$0|$xucA vO [Ã$QA  [Ã|$8v[ø[ø[Ã$8v=|$0v/Aww|$H [A[ø[ø[ø[ø[A |$0 |$0u|$(S[ø[ø[ø[Ãv,?[fW$vA[ø[ø[Ã|$h0v$D^Al|$8A[fAb$w_|$(w6|$P7wA[ø[Áw|$0[Ã|$8[Á[Ã|$8v"|$0[Ã|$P5wj[Ѓø[Ã$vA[ø[ø[ÁwR|$(SvK[ø[A w#$SvA R}[Á w w[ø[ø[ø[A[Ã|$P2w$ [ø[ø[Ã$)[ø[ø[Ã|$(*wF|$@~+|$P3[ø[ø[ø[ø[ËD$`[A[ø[ø[Ã|$`w9$Ev([A:[ø[ø[Ã|$` wx|$[ÁxvE|$8w/AQw|$(9v{[ø[Ã|$h[ø[ø[ø[ø[Ã[fUSD\$`l$(DT$x$AS A?|$p |$hcA f] |$p&|$X\A|$01j|$h&/|$@Y|$8,v v[]fD|$8 %|$0l*|$X._Y|$*A_*f]DN vvA[w~|$hn|$dh|$p&V |$@ o|$8.IAf_fA_N@AlF ?y DL$pE>|$@3|$X O&uAfuFAPfe|$XdA>$!J P5|$0BER|$X(t|$04x l …u$`fAhk fTu|$h =|$0]^-A _ Nj ;@|$p %|$h~ t}72Awf.fAC|$8) | fDMm|$X+|$p#Kv|$X+>4D|$@  |$hK* A`d&f?F|$0ASfAXy|$! ƒ|$81A ЃL |$X5Ah3|$h-:"L<mXfA`W|$S h,|$0>CD$8X!$T*@" 1|$h1G"fAW?fC!U|$h|Ah|$Q S |$4@3$i W DfA`I |$8l<0|$p$n= [@|$HM $TA"$+F1|$@ Uf`|$X+^ |$@6AE|Ak@|$8|$0AJ&f`A,"|$0oH |$X36$ S @A   Ax$ |$A $|$XC2vA,"$ O|$0/ $v&$|$pDAT|$0ڀ|$83|$8 |$@|$0: |$0-!|$0*>O^F5%fD|$@ }|$X*|$0.#;C|$0_|$ fDfAR|$0,f6D|$h| ^|$@`ALDfA_E fd7A H4|$p&V|$8yAA|$@!fDfA\1w|$ha$|$84AtItD$XPŸ%$'|$X,|$0W8?K(|$h`g|$AE fq;|$8(-Wk]8%If|$p7|$X$|$X!jw k|$wfA[|$@.$$jW A|$04ImfDWfA]|$h\0Z|$p0MSP|$@ |$P|$X/f|$0$|$X:6$a xY}f|$@fA_(vfA]mc@ `fa2A1|$09drƒ|$X'tJ A\  |$0Y|$X/)|$Xdt|$8fvf^_ Yfs|$@<DC"@fA\B|$0|$@;|$8!OE|$xk|$@ R |$H<Ay8Av$iufDAE |$0IsfAY5|$@M|$p&j|$hc6|$@t$m5m|$0h|$X0$ /Af.AK|$ D|$p'@$@ `f|$p-a|$p"p3$%" |$0d |$X(|$p$ 'A fD|$X|$8n|$hn/|$pF|$0h |$p(AA1 [OHA |$p--fA_,ONNfD/A@|$X>|$h~w@A t |$X>A*j/ ||$X3q\af.A1|$88B $ |$X#4;#|$p7cY^#|$h)|4|$0z@fA`ui|$@ AlDAg U|$8 7A8PA ]f|$8\$. A|$8fV-|$0zvMfA]cif|$ #|$0GZ"A=|$@[^|$0A|$X&|$pjRЃ f7A$AUfA\̤`fA_ۃfD~W6AH x|$h"Q7V$>SA&@ :AY|$p |$Xx Ѓ$ Ѓ7|$X0fD|$p.$o3AFM+$"A"J91&|$X)n|$0-A,TD$hP!]ԈA5DG a$1|$0|$0so  A5L|$8 sx -Ѓ^W @zu>|$hij>\$8WA|$p>|$p266EV |$L 3J$a:|$8 ~|$hdSAd?|$0Q37H|$heǜ|$8A|$ i|$  A# Aƒ|$X g [ fDA*UDzC|$hvW1Gh|$XT fIA.|$2v>A~_f#ܡ|$X@خ|$X8"fD|$0L +|$0; ; zA> $%fEu|$0p;1 fAYV2A9|$@]|$X8@|$h |$p.&9:|$0+y^|$p%Ď|$h[|$8E|$XH E'55[|$0K|$XAH4|$8Unz|$X)f. Ae |$0a 3AUfPe{|$8( 0iYi|$0L |$02j .{@HqAI APs?|$@  SGSYwvA |$hO.f^O$  |$0qr#A C|$0Y[oA |$@޻qf.AvMC|$g Av|$X2C |$p"|$8w|$X  |$p7!fAXfRb|$p2"AAf]`^ V A<"9 2 ) A5fNmz~z@ |$h:AJIfRv|$@|$-fAYc3|$X?I$)}Ak 8f`|$0U.|$0z]  %|$p(Df^|$p$A|$Pdw *z|$pjWAbEi7fO! A|$h1{|$hyA'TTDf[SA f.|$hPD|$S(HA|$0O4fAb |$8-fDfA^OA |$p5|$8$5hA|$0|$0nH%AENfN|$PK$t |$@y |$8@e@jI@1fJ**|$p+-$CA IAm|$p7 $1uBV|$hV|$@ RA| {|$pk$I…t@C9A |$0=<|$Xc$0hJ>$A$|$8m\gN|$hqw ;1fAXy|$; j A$|$p(2vA|$8|$XJ-v |$@ukn|$8vALB vf]+!$B A @ ^d|$0z#u& kƒ|$H&A' &|$|$X,1yzw|$0bXAP $>AXdfa Q|$p;|$p-i!>AMcooAg~|$X]@vv|$@~t|$p35\|$8\H|$@)|$0=ń` fA\f@ %S1|$8|$0S7]|$p.0|$X2T|$p%9}|$@Av]S@fR,fAUK|$;$vd|$X3h$ |$p AE=|$8/|$X@egYg|$0D"|$hMfP|$p:7|$8#OAO|$HOANU v|$8*f|$0c2WC|$p@fAY|$8DAEAp ]|$0e GL|oA[\2fLfb |$@$Ѓ|$0M.|$%Qcq|$pݜ|$0/$AD=AujAYAE|$0&0fc|$8[|$@j|$8-LMfa9h|$hxŒ|$hi4 o7$ $[|$8$bfAY566ZMAM7=0|$XAOhA{  X|$8ye.KD1f\|$hc!fA^eK|$8Bu|$X9o|$h%m |$H+d|$p?w|$@^TDU' 3|$X1 |$0/ZcTV|$@ |$0e|$|$8-y @fF- Ѓ|$0H=/ftA\c!PcN$WA*vD&$I/'H b*|$8; ȿ鵿|$X5|$@fV$ UVn|$X!#|$8 {-[=|$X40|$@0$Z=P1P{A2|$h&ξ|$hFw鯾1霾D$8tS|@li*!fAYYL < QArA wA{ f.A޽6 ˽|$8K)A鯽A'|$8b@|$2ad|$0V$ * Ѓ^)A\~Z!#|$PU A|i |$8  "ڼ9?|$pHA_Ѓ韼A$&- v |$XcYA w|$p%@6r!AHE|$X$|$hA41A޻|$0MCKX|$hKXc"霻D|$hL*A Ѓy|$C#$J|$0v|$h:#'|$8$>V7]9|$hD ѺA鱺|$X#鍺W|$8o|$h=\|$8 n|$p:Z; :n|$h^*A/$UfAa|$@A[|$8  f` w|$X颹 fd;Do|$8¯Ao|$@R|$@RRRfA[/.j|$p.* NA  |$̸A1|$@ 騸. |$8?fA\ AX Ѓ^$aA=F6C`o |$0'fAZ@\ B$ ߷s vT鷷|$w|$p"铷m3 a|$p2M|$@orL[Y&|$h AV %8$j|$@i|$pNAp|$0?fGK$|$hXD|$X5D鍶fD|$X4V#|$@ .fAXOZ|$8O7Ct|$8t"A< $` |$H Ѓ=oѵfõZ 鰵i靵 U!fAXsuX vA i$&ƒ|$Pt 8|$@z:4X'|$p0 |$X-5Hp e? 麴: 雴|$p8<kl^fAQRfA\Q Q Q4D|$8A/ɺOfAS m|$0]ݳͳ|$h%,A鴳$|$85AU {|$h~ v|$X+SFA 2qA \oЃ e ' 4io|$8鷲|$8|$@隲|$0D#OAOlAwRHA_D iw_M$RyGziM}Ar}DZ|$0M  C+|$8鞱A鍱$3e#|$aW|$X"$|$hrbF ^"|$@$sZ=}vdްzs#9'H鶰|$@t_閰f !A)}PtPa|$PNbP'A48"|$8N|$X!Av4vEޯԯTïfA] 飯2vf_酯fW $ YHA j|$p AvA7$bAA8VcޮԮ|$X)v$ 魮|$X.|$h'~EAz|$hr|$8]SI|$8x;NO N|$hnO $ -#E pZ|$8eZ麭駭$QQaFAwbX=J|$X% *AwB)$A$jAjAav|$@Ȭ龬|$X  V飬M"H|$p';΍|$8L7`f1A DEA6 AL$ϲ|$X+A $q fA;I$ ƫ鳫|$X="AEfA_ ѷfAQƷr1A[QWeA&4|$XE v|$8@(|$p0YvA٪Ϫ鼪|$8vAo陪$ )WT lEV|$,Q%|$@\1 D,|$@:dbA4$$7YfAJZ|$p<0 ͩ|$0d"AR|$X0sGJ|$81|$HD@郩|$X4&|$p'W |$hL|$@ ` $4MA A|$X, %D$0b|$p9ܨB1#A鿨鵨|$p j'|$0eSYS鉨|$@ cC ]_A  $ P$ВAҍ C&|$8ɐ" nhfA\{,fX lO鹧|$0q駧|$p0Mh=|$@=~|$8SV$|$8a(|$8afW$W1|$8|$P5|$@\|$f|$h7ɛ_7 fR$ 鴦|$hh!AojA鈦o*$I|$p2oz|$X=*z$R(|$h |$@*A|$h]5|$X#3c=}|$8 f]\$f KA龥|$8%|*A!9Cf1 9yS C|$h,Cl|$0flA C|$@ C fAS J:A/y5|$@o]A b]ʤArT$;% 除|$0lG5|$8$\|$p/|$0IfN~|$p*ND|$874V)|$@ fRV<$E<|$h|$0UR|$8I~|$@+~A鰣B4|$0;Y"(w|$Xh3|$p-|$X^|$8 Drr0cA|$8 Ѓ$„ZZߢ  / G|$@yG鲢fZ"PI 镢|$0|2$1 DAbm|$PlWЃHfa%AS|$h% |$@,Q|$8 Avǡ齡|$X2y10 W|$HjЃ逡Al|$hOC|$0P?9|$p0DAW#']C|$hV#|$Le|$8/|$@ kܠ|$8ʠ|$XA"-|$X魠|$0xw|$0pxxA&|$h{^|$X/|$0`Gc|$X/Ao^fZ3C|$X'}|$p9A'֟)%ST]̗Pg&D$XPظLw |$0J速|$@%|$89[|$P"כ$ɛЃ3A \S~FSЃ$ƒ|$h\*A * ͞A(|$h=(Av$鉞|$0@0|$8\]A-̣fA^[ H3Ja|$@ 5afAV;7  +A|$hv$ٝ dA%bJ 鳝i頝A,?A^g|$0S)|$8UA|$@A9Z)=|$@|$p> vL~&fÜ|$pvm阜AЃ||$X#' ^|$pD$J|$pkv|$8 |$h]fЃ |$8"E$Ab vfAaЛƛJm7A.j~A閛|$p&;;uMHAZL|$@ ? I|$@I |$X'|$0WWW||$@AϚ0鳚x]AB铚$3h|$h=p|$8#R=A<5*|$XB|$8 ^A+v|$X.^ \9AZO9ΙA AyS|$0W|$@#f`;|$8;f^ƒu|$@i_|AFA[M|$hafAX-|$`AA|$@ $|$p>>$CgfS%gz%雘fYdAdq|$P6|$8v ND$-s(L7A/7|$@ЃfASL@f>} |$X8ŗI'ƒ@uA鐗|$X,+|$@ Seg|$X-{J6e|$p0v2(AcZ6A$6tЖ_5""{鯖Az 雖 鈖A!|$h`d 2iAiquvu>|$p'|$ +A\Ѓ|$@|$h/|$@b3ArœAXg)颕ACA鄕fb AUf4fX3fQ$ 1 'fA`)fAQMWxmA sfKS;tjEh 鰔|$8PfA[ƒ|$0ZuAu|$pO%wH|$8AT?A|$0|HpZf8Zr  "|$8RA,]$ ȓ(U|$00b,b'郓|$X2<2b$/ |$h=$ sAW s&|$@X%}5R|$p6z|$0?\|$XBG71A|$@ N$/dyd鄒|$X5=|$hvdZ'vAC9|$X0sU$J |$@.QfAV |$04v|$p'鮑|$@J|$8鑑A'A'fX^Ѓ^eKA,,.)|$Pw32AA3$ +fZ. 騐A F@鈐bx)(\|$HU'|$X6?G9@#A8w- k-|$@g0& fn ƏE鶏|$8&fA^~A鋏1T DwAcAhЃPA< )? \8($]R|$htJ1̎鼎|$pOAbAkyA鎎{qg|$p)$ Ie'|$p1VCAAcwT|$0GlTv$p ؍΍fA\_'  A 頍A#Ae l|$0kkk_BS|$pQ+I ?|$p-AR$ fU2,$Ѓʌ|$8"$E=$9-,-A%|$Po^6|$X%pA<6|$X*169nCJ'$ |$p *A|$0$ދ|$hw+ATA)|$0D((fA_|$@uu|$pS(|$X2_g|$0hfYpk:|$@X+|$P|XAƒ|$HJ*J|$@;dҊA鷊A\e|$X:'|$hykxk0*vAh^AMfAW*AmW%|$p%|$X[l|$X+8ns`jFAv‰=|$@ <A M|$8j 鉉W-|$XD]/vAG^T|$hv#|$8PY:A" $f]$u-!ֈ̈ˆA[$r,鑈A}j|$8ƒ|$XG'|$p<'$~R|$hssR$fW~f|$p4|$8܇|$H/8`pAnR髇$7Qv* uA 6lX$G0f\Ni|$p6B|$g9|$p'݋A |$p%0|$0^|Ѓ鯆|$X40$&^逆g mAiY|$0R2 `|$830`]$i $  Ѕ|$p53 鵅q颅Aa鎅BE|$p s|$p)0_]FL|$p2|$X:`$f]T.|$Ag  $'1Aj&hvAi靄JvA|$Hv.:hX  1 0|$8_|$p9bA3A Ѓ|$X5a\|$8L\鵃$1/|$%[$|$X*{faVA(5|$X'c vAd?5$HAh W |$@ тfA\0ՑAF馂|$@锂|$P^b|$0=/.Av|$p&bXxЃF,L|$h L,|$0qh|$8AuU+|$X.w|$@ہс|$@6A|VwP[A陁A )A(|$A`3YAw J@|$X". s+pd|$8 3Y0|$@|$PW ـA#0鼀fAW,$ JcyaY.İAka|$X1<|$p9vAQ=3A|$hs)A=Yb|$@NbAaA (Aa|$@ E|$||$p*|$ &cZblfX.|$@ P$ E,|$8nd|$@ E|$8|$X72${8vA ~5vA~~$~~v~ CY|$p' Ѓ|$X6]|$hfR~|$h@!t|$pJ{?T`A}|$s$6J%P/}$}z}A[N:T}665}bP|$h1.!}fA^>!AUJ|$@ F23*||$01'l||$hxl5|$a5||$X6o=|$hjeAU| .$A'||$0UB!|$PcA%RA,O{fA\|<vfB|$p5|$@{{5u5|$@:tA g{]{A viF{<{|$E-{{|$@9f5%r'vAzz|$@PA|$X.XA|$8z|$0zA\htZ|$P}[zQz|$0x9|$hgxfachGAz GAyyyAx-|$X3Fv$ vFyyu0|$ B|$h#B$ Bpy|$h:-.f\n|$p1(|$P2y|$.AMtAt Ѓx|$@ 4|$8&xfTJ|$8$xfAU0AWA$Ax|$0iARfAVGVx|$8:fVh|$hEifAY$ |$X4Aw|$XHi/|$8 ^/wAF|$X=FAF v|$p2ww|$X69#|$@ ҈}|$8 AU|v>w4wD$8~=#wvfN<|$h ЃvA-8|$pA/|$X#E>|$X#3v|$X'r!@!D$-c1Wv|$0r'faˀ|$ho|$8 ]A5|$0l|$pvu%u$?|$p`C I'T$c|$X0|$8AYxu|$hfu$ Y|$8FJ JA Ѓ0u&uA|$G|$8Ѓt|$X,B|$0<G|$h]CD |$0St|AttwRtwt|$X4$\YtA @t|$X37|$HBAC?ttAs|$X CfA<C|$8+Cs v ssssA qC|$r _sfI2c!_fI4|$A|$p. sr+rA2r|$pBir|$p,.Ao>fT_|$h6$RfAY.OrA>rP 2-fO:||$0hK||$p6.| q7|$8o]1fPDq$ qfAC'|$p1:'We|$hvcq}q|$X65$?;A<|$@!|$p+qFq|$h3|$8ƒ^Au^pE)uAp|$@; p -fA^5xpnp|$(%c|$8lj9p|$h2T6|$p.1a|$8"}Ap X0AN0o|$@34fAZ,gfSf< Ao|$@s9|$@ 8|$ht|$$ooeofAZbGo$5$,oAoA{ |$p  ennA9%An1|$p \\$vnfA[+|$po8|$$1YBnAoQn_Ѓn|$S1 ^$/s|$p*$lwm|$8%1$/AxZm|$0U^2|$hWwC;w|$@ |$p) |$8 Fm$ $fAZ8m$A RoAl2qA& ql$E%8j3|$hti3|$p|$h\l|$0.|$@i|$Y|$0g|$@JlASq5lAv$ ll|$8eC/|$XF8/X'kLoDA+|$@kB*|$8*+ pYA- cYtkAvXR]kA# @kfAW=#3|$X9s3|$8 kfAb3j|$@j vAjjOjjA |$p0<ARAk \j IjIQ|$8)Q "j|$X3<APV;ii ii|$8w|$pii|$81|$P1iie B|$X=tBai|$XAwWAv'1WWA'@] W;|$X6r;Ag|$hD|$X+Õ$Bd7W|$hY9ƒ|$p,99-9W|$@V}8V vAVV vAU VVVVfU1fYDmVcVYVOV|$8-|$0u?-m&VVVVU|$X@U|$hBU|$f .; AU=$=AU|$X"ƒ(0A0WUMUS :U0UA+v|$zU UUT#T7|$@|$p*w|$X;lTAh.fAV;.$1AQsTf`TZAiLT$}~A7g Q@HT  >|$mL<|$p7|$p4ߗS|$PG<|$@S|$0{9|$X1SS+rS_SUS|$p9CS9SAI8AA$ A>RA:|$h:Aݗ|$@җRRRRR|RDa$aMFRfY 5,R|$@#RfW 5Q|$@Qf QQ|$0|$pR03QQQ|$@4fA\ j bQA::CQ0Q|$@Q$L p8|$h-AfA]z|$8 ^ v PP|$@P|$p7;|$8:P|$8rP0_PUPKPAP|$h?l;|$8=z i PO|$@KA KOAO|$X,\M$JWO0 v|$PsOiOA ROHO|$0OfAbO{|$z7ypyxNeC|$0^vANN|$@N$PrNtN{`$P B`|$@:Ѓ@N?A #N|$0htSkS1|$PM9$C 9b|$hNMA#M$f`|$p-ƒ|$X4``|$@cMYMo F|$8EfA`'$]MM,ML*.QOLLAGL|$8I|$h&L'F|$@FjKv|$HiL_LUL[$b[fT#|$H|$X=L|$p2IMGKKKK|$8\|$pP\|$0NKKCAnKLBJƒTgvg8K|$8C7KKA ; ;JJJ|$0TUD IDJ|$XFJJ[>qJ|$p:FfAY$W |$p98J= JJ @|$8 I|$h[qLH8$vv.ЃIAv>dЃIfAU>|$@ƒ|$p,t|$8ZIPIFI|$PM>A v $II|$hGj>$Y>A{3>H(PAP1|$PHxHH}HsHiH|$05A~JH@H|$X9|$t|$X6|$@  HHG$ ::|$8 |$p1إ|$@{RGfA_"A|$P{׼$ rGhG33v|$HGG=G3G4mAqE^?RFFfbk6|$hc26|$@|$X#:waFFF|$86r|$HA!|$@|$8AjFFPQV$FFFEEEE$*NfAQͥإD$@  $"ѥEE|$@D|$p5XEfOBEEH|$pfb~ME EEo9 KDfAXW/ WD|$0]NANvADD DsDkcDA;ЃPD}001Dy1fafp D1;|$X7z;|$h6`|$M`:`|$8%`A`C  |$8%͵.~CtCjC`CUQ|$8ECO9|$@$aAa  CS@|$8@GB|$POB|$pCF1BX7A:AH7<7mBcBYBfA` JfA[&|$p|$h\"B|$E$j $ Az|C7AA|$H4A3AAPA!At R`AVAA.vfAZ=A3A.A:F:c<Zc Dc @,|$%@|$0> I4HAL|$hd.|$HR|$8Gv@l@b@fSK@A@|$@/@|$8S @@ @|$899|$8u ?|$8 W:)+:|$h???|$ uvN|$@MAW?$LЃ@?|$h_-|$8DĽ4?|$X<LAL|$@ >P3C|$0J d|$p(E^Awa>>E.PGPAPr>|$8?fX?+a|$%aA`|$8`BAAЃ>|$p1+AHk?k=f\4A=OfA^V|$X8\f:A ! Ѓn:|$@  P:F:N6:fAW'+Ai:Q&%&|$@  99$7E|$p&99|$ 9999m9c9Y9A ЃI9?9,9|$p3w6|$@ 9|$8w/Aw8{Ѓ8$B888|$hm-!=8P?)9_8|$} -?|$@*$8|$0Hn|$p3|$h77777|$p.7,n7d7A|$HA87LA7$6|$h<6666666|$h|$8,6A AAV6|$8<,6"66665A5[5555|$@"($tAg5]5S5Aw$-45*5 55A ԪA(|$R|$hWyAv~44|$@|$8 4|$h\A4tei4_4U4ЃC4|$X@14 !4|$0;$. KfA[Ŧ533|$D|$@ E3fA[:A΢|$@Avf?3}3|$@|$ܥ$ΥJ3|$p# fXܠ|$X1Ǡ3 3|$|$0OJ Z221|$P22222~{q2|$@wx$iA(jAji'222 2A1$Pi|$@;i111A.1A1`w1]g1]1J1|$g|$p gKw 1A10000iVi0Axdk$kЃ0w0Ac0|$X,|$p,xif]ƒ|$  00 00//|$@A(i i/|$)/b/ v|$X7}/s/||$@^/T/J/|$0Mw3|$p2Yh$wN//|$8|$@ |$p)} ..|$@,h6..$"|$P}.|$@fZu t.j.g|$@gA{g<.2.3h|$PgAg/---A------|$8; vz-p-f-\-|$@J-$5-+-!-- -|$p̛˛,A ,,2\pFfb<,|$X,|$8^c,$`|$p3n, .,|$P!|$@ΔvA++|$X'|$@.+ +A ]|$XB]Iv$ ++|$80$ |$8"4V|$@E+A`4+X ^|$H ^A ] +*|$8W*|$X*fA`ƒ|$h}I*|$PD|$8*|$XfiޕAi*Y*O*|$P+1D@** *|$@|$8|$@af2Mk)|$hA}|$@Ѓ))fIA )1|$@w)d)|$X>$ A)7)|$hTuA )))(f[kAkfXkk|$8k(f}Ѓ(R0~Ѓv(A6k|$h:+k|$p6k&k4(|$@9k v|$p0(('k|$p$''A '''Gw1ajA<'x'n'^'T'|$@6'|$p3Pl$ƒ|$XC(ll&&&&$w$A&D& 3rAr|$p"q|$@q|$82sPc&v|$p:K&A&|$@wHf#n|$X9 &$n|$@ w @%%Agq|$hp|$h%|$H qApm%%I %$=|$8Om |$8rAs|$@sA#  A~!s|$0JrIrr|$hvrfA`qKv|$@|$@vY~t Ar|$8qD$awH|$88s|$@-s$Fv UDbm .b c|$8sc$bAb|$X1.ex`tA Nn:4}! A |$@A'.r|$p|$@ $~l|$hslcYMH=3Aw/Ct60t|$X$~AN~|$p*c:c$o+}sAjV|$hFZ|$*Z|$%Z ZAZAFl|$08kALL@L|$0F=|$@ L }A0XjAvPYOE;AƒC`` |$0^w,AaV|$@vXA|$0U|$8fZKA+]$8AW0AWf,p:AH&P|$8SA|-pfA^&SpA V$6W|$X'|$ '$'AX'A |$X- X%|$P ~|$8z7l%|$8\|$8 B|$hg( *|$@|$h=<Aw^b|$X)M|$h|$~Am|$8CNvA`V|$p.}|$h.|}-AZfXFA|$P |$p/ō9vrA9Ѓ|$@ŃukaW|$p#A5|$8 !A|$hjmfb@|$@+|$pw${|$@vfZvlA+@AA"}|$XSA|]{M{+|$@|$p4|$86o|$PH"v|$8wPF*Ѓ(A:9fQA|$P*Ձ$ |rh|$0Ww,|$tA?5|$8|$X4|$8؅|$@ ͅWdD|$@`wKfa|$XЃ}sAB_A}R?|$Xd0|$0Z|$h*|$@ w|$p|$j$ |$h$ „t A|$03|$@v$DWMAw"|$P},"p |$X>Ѓ|$p-w.$vf<|$@*$APp@ `|$8@N|$8Y|$p'bY|$hf;Y|$X2&Y|$8+L+A+ |$X?3*y *$*)Uqw8|$rfAa]v|$hDA *|$8)|$8!A!|$hM!!PBWh3i|$@ 'lYAdЃI|$P+fXA Ѓ|$O„p dAwUR|$@ 1|$h A|$8*u*|$X*{WAywa|$hgACA/|$p6%|$X4$|$@$E$ #$v#l |$H|$X*O |$h z"k"A"|$8ЃFc$H|$8Ѓ A$|$h$ $|$p4$$ |$X+ yЃf_!|$@v|$8yo$(%$|%|$8%|$8a$A )|$p3w4|$zb|$X?WAl~A|$XA8L~$*#|$8#1ADPmU$/|$8$T\T` |$hV|fAafbQ|$X$v^=D U $U͖A ND:]$w/|$H|$X?v|$fAXw9|$8W|$X5]xSAC|$p,1AЃEJ|$8?$AA|$@ LW|$X9WWAW|$@ Xq ^:f_)$* |$p|$8|$X+EC|$p.$4A* >|$X=ޘf7Ԙ< ȘwAcYD  AH3 i2I|$@T Ѓ|$8$|$p.IPf]OO|$@O|$@ rOA0[Ow|$0MGA |$8{A7A< OtMfZ`M |$0_|$8"|$0Qz|$8 VaI$uyv|$8A\ v|$X/F<|$8|$0QG $ |$hV|$8|$Pu AF AA~ N vP mcL_|$p%@A>|$hk} fAcb VAv$f|$@ VAV/|$8^~v|$8|$@AK|$PK|$0BJ|$@JLu |$py l|$0gyAMCA #A$L^y|$@6AyЃKndZ|$X2|$8|$8$Dx<x~xAL[FAi>F|$@wW|$8.A ZfOPDv|$h_e[fA/b@f(As%m|$PUN3fAaa (L$AB|$8-A yr ] f\|$0CAd|$hF|$@  |$0aъfAV|$fOƉ  AJJ vfP{qA= w6> UK|$P~[Ѓ2(3 |$8wLw:|$X3v~|$h]wm|$8w6|$p)|$hFv/wAZxndZPF<|$hw9Aw"9|$@ AC$A]fA]:|$@ lb|$8t,|$pw|$8wC9/AE9$vH$zЃAf`OfAat+vw|$8|$p"yo$v,|$@SA_w|$h_v9/%Aw& D\A|$8u-w%v|$P}$vAcYsF<|$P~ ANvb )wF|$X'v?|$p(wb|$u;$u'rh^T|$hQwi|$X%w&|$p4A w"av|$X*|$8|$X6|$p$AfAZq|$@E|$X.v5hAv&wPF<2(AfY $M1fP|$Hw/0|$pw"$>aWf`ZAvJ|$8 w/f]|$h(w|)A@v/|$8w(Av6$u"|$8wg]SI1Awj$wM|$@ $OwAA1fZD@v0fA`O{q@ЃbXNAw' 2(h|$X:wT|$@%vCƒ4t'Aw|$h|J;aA=vU|$X4I|$X)|$p*w`1w:w"$a7:w-v|$h}w$@*A $7wO.w%"a|$XO|$0CfA`B*fAbAfAbtmD$pH|$hd,@w-AЃzpf\|$@w#E2(f;~Aj|$8wd% wI w!fA]~|$rAvfAZ zw }c|$pЃRH>4A=LNww|$X8wp[vu$ v^;|$h#At|$@ ukaWMC0&AwMA Bf[1|$8 |$wB[w%ЃAw-gw(/w 1fAYi_|$@ fAU"|$8 .AA~AzAvAoAjwa|$X'|$hwv |$X#|$@„tABAmc MC9/%wAv|$wA|$X/w'-|$hIwqrh^|$2v/8v vW<2(A|$X:wvЃ$wgtcAvwmAkv6]w'LB8.$|$@_5R|$H|$%|$P|$XtqAwk$|N% vF|$P}|$@w AL wm|$@v|$hVLB8Uwf]wS|$8wLA.|$@w |$X#A{|$@ vAbXNA}:A w&[!|$8A6Fw6A9A+vEf`&lm|$0FwwTJ@6|$Xvi|$0Yw=|$8$v,$ w;|$@v*|$@vyw|$0_}|$@ЃlbXN|$@w$|$X,5|$8#fA_u[ |$@w;|$p|$hEwo|$p>w^|w$uA|ƒ|$hu Aw |r_UKA7|$hHv# 12DA}wfA|$XCw:|$pv3|$X:$etf^wmc|$X/w.EL|$X4w+w9||$8vVw=|$p w,|$@w|$X/vND:0A|$X-v$ALv7wU|$p"w"|$pv|$AMAw|$8|$p%A|$8B8.A]P 1f^A|$@pfW\hƒ|$@u|$X8F<|$X-AC |$hg$| w\$w4wA1D@C|$X0A{qg]f]"|$X:v;?5l w2%Aw $wX|$8w$vAqg`|$|$P~mЃ:|$8w3|$8w"|$pv |$@ wr|$0KwOf2"hw|$8|$8!wW#!ЃXw#|$@ vAi_|$P}.fEIv* fOW|$hCwFA w6$u"|$8v|$h9w!Avw?Ѓz&wTZw>fa~.v|$8)MC9/Aa|$hXv^QwO$fAXt|$X1|$p)wQlb|$01wAAuG|$P}zEwr.$|$A'wn|$8 wM|$8|$p(!Ѓ|$X2„t%|$hbwAv1AI{q$ v^|$X9vM|$P}3AMB-u|$8 -#ApЃp |$p"w-|$@uw{qg9H|$8A&|$0Lw_fAS~N|$p3w5ƒ|$Pt$|$X;A(wrfA\RfAO'$t|$h^|$8w$$E|$8 3w`AA*vuwmnsvfGfb~Aq{q|$h5v|$@ZPfA`W9/w:Et5A|$HO|$hwG|$0#v6w |$X6vAUAZ|v6v'AwndZPF<2(ƒ|$@$t;vAz A w;Ay w(Rv$9|$@Agƒ$uiwa[=w!A$w?5+!)Aw"v|$p" w8Av/r>w'A vWMC9|$8>w/zwAv %|$pQOtЃ$IAuAA"|$@vuAvo|$X8w^AvUX|$fAQfJJD$@ƒ|$p9t'A w |$p9AO A XwsAU 鱿駿ƒ|$X=fARA|$X;ƒ uw woR$Vv9|$0 A 1fLپϾž|$@ƒ|$Pt&w韾镾鋾遾Ap|$@^vAG=3)$w1A$w׽}gw_鶽O顽(鑽_ƒ|$@u|$hvkaW G=3)|$@ ܼҼȼ龼|$8鬼颼阼|$p.te|$03wBfV~2w*rE v \RHw,Ao,fJ%bЃٻD|$h{wxwGA@v4|$hpv#ALv|$hv鎻鄻zAw$[QAh=AN)|$hRTtAXۺf<|$hu'A5vA v 顺闺鍺fA^t}$uwf|$hwFAt6Aw# vTJ@6,|$@w6|$8 |$p1w&  ܹAcȹ龹鴹fAb!|$0Dv|$@錹|$pz|$hz/AVOE|$8w|$p.$|$8Aw|$8۸ѸǸ齸鳸+馸霸钸鈸 u1|$H_Aow @6,"Iw5Av%f|$p-޷˷ 鸷鮷A隷A醷Acv5j`VLB|$wZ~,wfh |$84wwAwP|$X7w-|$p/w%Ƕ|$@鵶髶$w$|$8u鍶zpw<$PAwE w3 ,|$p1tMw;|$8w4  wV|$X8w7AX صAw>fR8鿵fJ2|$@駵Gw.|$@Ѓ鑵釵 t|$8/YЃG|$@w|$v/%W w! w*|$0jwTvѴǴ齴鳴驴韴镴|$8wB{q7Ajw#oL2{MC8 |$Pn- "w>4v/|$8wAMȰ龰鴰骰fA`t92v*鈰~tj|$82|$0?|$pAC5+Cv.wfA]AϯůEw~w_~:Av'A闯/鄯zAvcY|$X|$p'w$|$8|$p"4WϮ$ fRb镮SwC v1$v' h^TJ@E-|$8̭֭­鸭饭Av6|$@v/vzpf\RH>4*  |$8|$ tX|$X:w9|$8ƒ$t|$Hƒ|$8駬|$hw1A鏬Aw@wKЃoe}|$hyPFvI0&$v|$@w֫ w"l v|$p0鯫 vA鎫鄫zp ]SI?5|$@wT|$8uCAt=|$X5'6|$p#AڪЪ|$8 |$p|$hj|$8vpv^AjwU鍪@w3$vA}i_U,B8.GA`v-@۩ѩǩ齩鳩V|$p5w;锩銩逩vl wJwXH>4A |$0Ww|$wh7vY|$0PwR|$8vAA w. v&ިЃ̨¨鸨鮨館|$h!钨鈨A< wv w*|$@h|xP|$Xw{ewvZ鹦$顦nv<|$p't"|$h{uzp]SI6,"|$X3A|$8 wDw$Av鳥Q|$@阥7vA~t|$h@AtA*LB|$pvC* |$0\vi|$p"vX&|$8 p|$X1eΤĤ麤鰤馤霤|$hw]}邤|$8wiA$tF|$@v?D$8$ovAvh|$8wW$w-Aգ|$@w|$@鼣鲣韣镣鋣Av|$p-si_UKA7-#fAYuw EtVʢ鶢鬢颢钢鈢~t`wC|$pv<|$0^w"|$h~v7I?,"8v||$OwY|$@ϡr$qfA]n鈡AwlbXN>$ &fTOޠ|$X;i 鰠Ahw,N鎠{rhU|$8C9/|$X9|$X1v;|$p&tkAwRwg|$p"v`麟鰟馟VwD鋟遟ndZPFAwJ$ w=&+w8f|$hDwAA6|$@tKAw+ƞ|$@w2fAK+鮞|$@w$Av闞鍞郞yoe[QG$2 ٝA/wfAb鶝fbt\8靝A錝邝xAw?Aw3ЃTJ|$X(w@j0J|$howk|$ vZwBA|$P Et2ܜҜ鿜鵜Fw65w.1fc铜=vAzpf\RH>41f f2O |$h;eЃ֛A|$h.v/鲛AЃ閛錛邛$v4Av$fQ~bXND|$p9wJ1|$H'|$8v)|$0C\ٚϚŚ黚$馚A|$8wwA~|$@F*|$h_Ao/A||$h-fA] u|$@t1fE~!hvfM™鸙鮙餙\v 錙CusbAww$wT|$p==]-A~l|$X7v[L v30v%Aۘјǘ齘鳘|$P|2A雘fA[F|$p6w5A?w,z|$8wB|$8w1$w'XN;1|$0IvJR|$p1Az̗֗—鸗騗鞗|$H|%銗逗Ar|$@TJ@-|$@w|$X?v |$X>wDߖՖA>fJf|$hwE6Av#|$8vA銖逖vA*w3|$H,\fAY/X v :0&|$X7w$vAX|$0MߕTWÕ鹕鯕饕u!9铕AukaWMCf\" v|$X-%wdAwT|$w:AV ϔ鼔鲔騔鞔锔$ukaW|$X?E;|$P~SA9wJ$w4$wד͓鴓骓|$8 阓鎓1D}si_U|$p?w6Aw Ѓ3)AA^A $wo|$8w^A˒鷒|$p0w镒A遒wmcY|$PA@6Jw\|$p)w=w#Av|$h3 |$hV>wH"Ցv#fA[~Ak骑頑Aw,ƒ|$6u|$h1ukX|$X8v%|$p.vA6," ܐҐȐ龐鴐骐預$鋐|$@ you\|$8*w# vF<2(vw02v!Av.1|$HڏMw&|$p"Ï鹏鯏饏f?#A |$b|$P}dHi|$hwv OE|$mS|$H|T|$@|$Cw|$@f57>w%1|$@D֎ЃĎ麎AD馎1|$H锎|$h邎x|$P}9w'VLB8_|$X>A~$$|$X?f<Wč麍|$8 wU|$EwDAv1|$pv 醍|rh^|$X/A?5|$hMv>|$@w-Rw|$8ut11|$Pˌvw鰌馌霌钌鈌~tav'F<2( F Ћ$v;g鳋驋韋镋鋋,@|$X>mcY|$hkG=x1AL5t|$@vW $Њ齊鳊驊韊镊鋊f5tj|$@*wGSI?5fX&  A@Ήĉ麉fYc|$H|3w$A w阉鎉鄉zAqw$[QG=3|$8!|$p4*  |$X7v:v(A߇Շˇ鷇l f\Ah 遇|$01fAvOE;1|$  AkӆɆ鿆T?飆陆A}k|$0lw7|$p#w&A*wizVLf^A|$p!|$$$|$wQ|$8wJ|$8w9$Uw,黅wKfZ5iw&Ѓ际鏅酅{sk|$0hf]yYV=A0&|$hS|$@w`|$8AZ|$X:w\\v~|$p*wa|$p$wzwr骄|$X2wkA鏄~usAbfZOLB8A<$$=wX|$0]AZAwA|$X2v0|$@ w)鿃|$h[wqSwKc頃閃|$Pƒ|$X8t|$X4rhAueQG=3|$h.w8|$@v'|$X=؂΂Ă麂鰂馂|$0KwI$v<|$p6v+|$@ w$z|$0Iw' `VLB8.$ w&pA)wdw\ց́A $ v$鎁鄁zpf\R|$p,iwr|$h;wIAw9A0$ |$@ wMAow:bv2̀ÀWw7Av'f饀雀鑀釀}|$pwAbX|$P7sw%|$@ v8.$fA`DAAc|$X4wR|$pw98|$p|$@ n|$X\|$X5A7$~Et/|$8wAy~~~~~~~~~~|$ vI|$hiw1f~\~$wA=~3~Ѓ!~$~v:}}}|$h5wCv4|$8 w#A I}}}}, v3A y}o}Yw%Z}P}F}<}2}fWO}}Iv|||$@wP|$Xw#@Ѓ|||AuAw|||z|$h|$4wC|$@v2lU|]wdAwE$ 3|)|fA_AwtSwo||$8vT1|$PD@{|$@v0fZ |$88vA{{{{{{{|$X8wl_wUkwC|$8w<h{|$@ w!|$H}|$@J{@{6{,{|$8 {fAX~G|$@w6|$X>v/ zЃzzzzzzAuwH|$8v7zAw@|$0gw(A|gz]zSzABzrv8|*z zz zzyyyaw2 yv|$Pyy|$X9yyyzypyfy\yRyHy>y4y*y yy|$PM}'xxx|$X0v|$@ xxxx|$awjfaQv?w-fAY&wx|$X#ex[xQxGx4xwR~x|$8wk|$@ wF$v/vwwwwAwPfU:7ЃwfS Au|$hw.vwfw\wRwHw>wbw%|$p$w%wwwwAvvEv|$hNwvvvfZ|$X'$vyv9 fv\v|$@w%ADv:v0v|$8wUAw?TvvtJeuu uuu|$8eЃuuu|uruhu^uTuJu M1u'u5u"v'tttt5v$vAhttt|$8v8|$@ u'Et"Hv|$X4tvtltbt|$0AwR|$PA|$hv 1|$P7t-tAw<|$@ v5t t|$8@v.|$8fv5ssssOsst|$8wssswsmsAwsANwNfa>v6|$8;s vA!ss sw;A|r|$H|ywSCvXVrfAatv|;r$=w8Brr{rqrgr]rw#Avv|$8?r5r|$8 w rrrqqqA$wO|$84w8$w!vAqqq q~qtqA |$p! RqHq8q.q|$87|$peA#-|$X9fTbp|$f|$09|$p)|$8|$X!w<pAwF$w%Ahp1D@WpACp w@-p#pAXwPp$uv|$8ooAo|$8o|$h#|$h|$P|$@ do|$ |$h\/oA6|$h2wE|$p!w.|$8Ѓnnn16n|$X3w'ƒ|$Pt&wnnnfA_$un$)$wF'En|$X*|$|$p$|$8nn|$h&vR$wE$m$wUf`.|$P~AwmmmfA`t|$hmzm|$pЃim_m'LmBm7K5Ѓm|$hCfA_|$h wR>w9l|$pAAlAl$lw}Avj|$XEwO1D@YlEu!|$@w|$p=l3lAw=vlllkAkkkkkAkk|$0Cwe|$p#wK|$ |k|$u"+ek|$@Sk|$hfAk.k$%s k|$X9jj|$ho|$PUj|$8t_fA]1$t jjj|$X3wt{w/$ebj|$@v_Kj;jw|$@w"jjjЃiii$$>if_|$@|$p.$|$8wu|$X0vdAv4t0AViASv3Avn7i-i iiifA_`A#vM$w@hf[&hhhhhDA|$X<fXfAw v8Ih?h|$X/v/|$h(AtAh hg|$h1w6AYw#ƒ|$02t|$p#wggggAw@aw.8g|$p'w=Et.$Ѓogeg1|$HSgIg?gAwIv:Og|$8 fA`H|$@fffffLffAZfffRO|@|$05v/vafWfMfCf9f/f@ffA ee0efZ.eD|$@|$8w=$-e|$H|DfAa$feAlUeAvo aAf|$0MNda|$8w'JaA6a,a|$X?w+A v"a v `````$wV wG|$8qu(A2vv|$h ``|`r`_`|$HO`|$h=`Aw@&`` `Av8|$p0w1_x|$hC___|$1Ѓ_HJA3'_z_p_|$@v|$@ W_M_C_9_f`P)Ѓ$__$uiw_^^^^^w8v&|$@ ^^^^|$8w?|$8y^o^e^|$0;V^L^$1D*^A7 ^^]Aƒ8u$Aw]]]]]]]1A{]q]g]]]J]|$@ wF|$8v?2]:v#|$8?wA_]]\\\\USDT$`\$(l$xD$A  A'|$p 4|$8 $ ABE+A)@A}NA %|$hnAAhA-|$h.`JA\AnC~|$0ofDAgB Ay9 DD$pEP|$0>!|$@@4|$hLAk~A6tA.v AYRA |$X0]|$p2PAD!A]<fZS$OfZ|$@f@|$p !|$H@\A%&A@6|$8V|$HPAsfDAg|$X/{|$pAA[\)$ALDA Anu fVzAJ"|$8BAeOWAeA]RAv|$ Ae|$XAp$ AP3|$p!P|$n$[3 AP8|$hp8Af`AWd $+L#A?5`Z$,A"\|$8tfAM|$h|+ AI!A>Y)|$pqAw \R|$0!< A0vf[6(|$X0=fL\$t|$X)@|$8Ap Ac\1|$M1@A~f` $ ^|$@M/|$@2Af_|$p)|$0|$7Cv |$ZfD|$X2|$0Lr|$h6+.A@?H|$X-h.bvX|$@  jAs*v'AwH|$p0Uf^K[]|$p+Q|$8%|$X6;|$X/&Z|$X,v wDAAUfa8C$bV|$8 KA|$p&M8Al"|$0>|$8/IAX|$PfBA fU. A |$p.7|$0VB|$X.U m|$pAKD$@5&|$844f.A8 fbmfP'1\$8 ,A,ffN|$0f;A#*|$p0eD|$X6tfA%b|$0MA8 |$XC2|$8)f_)1A@fCV|$8C |$h|eAA9|$X3fAg^ |$X)|$p`YA_w|$hpC9|$@ |$X-8 A-(f9|$pD|$~d4EK@|$0|$h |$@|$p*<3|$8\_}dwH|$X4bfbvA>4f.|$0h |$p(A0 XnA=fAAwAffBAYtA)|$DU1 BfX $ !Aw%:fWJAQq|$0R@|$p4?fQfV6;$PA3f|$0q-|$!|$8-A:VAot|$8ǰ|$h+ 0fD|$@f_#)A@A z|$@I|$p%5|$8^[|$X1f] |$0A#&|$XCu@Ai|$8YA|$p :A AHfX6|$0(VAdADm|$ !AS 0A<Yl|$0;|$h.A pAkAcWDf\f |$0Am?|$@b?|$0 |$0@A%D|$hc$|$8O3WAgrAS KA-? ,f1@|$X} |$8Rfe|$hrf|$0x # A4-|$X7M|$X$Buf|$hShfD|$8e |$0;|$@7>A*>|$8ƒ|$P t $B/ D${ om X|$X (uADz* ^@$? ,f|$0s |$8 |$h?3|$0UG|$X?̈́|$p5„f[6AP,|$X:h@|$0N}|$p+AWH#A<M?A ^@ Af_3'D$vf\fA$*fa5w|$X6fDAB A |$p)"A&y h|$pYA$x|$p ? 2|$P/~T$8 vA|$h[|$p*#7|$0.K8a|$p|$0!DA|$ YAGA< ASŸ(11A |$0#A( DAfZg|$A4O v|$03f|$XA|if\:|$p9:|$0VQZ|$B|$XDLfX~|$> |$8A6|$X0X6AK6|$p-x 0fTZOA>x|$@fB|$@!|$8k|$PO|$X,9|$h~4A7hf.|$XUfcƒ:|:|$h^q|$hM$ |$h~ zv|$pA#|$X,@A?rxA:\A1*$v|$0i&A 1, A|$0E|$X!e|$0<SJA%>qbfV|$p8KWD|$ 7.AB|$8#bAfDfW|$0j3t  A'I*|$hxB$x HqeAD2|$hg1|$p"1UAE@;i '|$p+? Apb)|$h1<|A |DV f^.A|$k7 Aum/A'a:|$XAi|$8Pf^OAA52AN$ n2AQAЃDM AfL|$PP$Z D&}AoyoDWfI\A%|$2B|$p*-k|$8 []D |$8F2A |$G$4|$h|3/A/kAff]|$p/:|$@Ɠ  ƒ|$0RuO fD|$8-M|$h |$0d7> |$89 |$PAJ|$hYWA`|$XDGa|$X,E3|$0U|$0|A#fA" |$p9%|$0RE$W|$0}ʛAWD |$0CQ(|$8 |$X<Q*A>A(dA9 G|$0d |$X+;"f\L;AnQeVDAH Al)U|9AzE|$hufD|$0ZAAd v|$00|$0kVAIA\|$@-|$X%.FKAC9KT AY,|$p"?KRvAk2A2,AAvzAAk1^XADAL|$P*A0 fPSAƒ|$hx. .|$p|$hs1Ah&1sAD $A?ZA1HA:wn 1'|$hB'9 2A WAI |$@fZ|$@Ae|$@ e|$0R| fBA^ cAtt$8GGAuV|$@na|$p&+|$@cO|$8wA@/DA0 : fJ$|$8mA` |$p18 |$h|$AvA&|$p9=|$@\I|$p$m(A?K$"$[A=D8|$p ?|$X |$P5?AfAZiA0A?LBb8|$0RI1A7YA.UAB$F |$h]A~:f\bAVH|$p(|$h& A5fD|$X&+$A2=faiP|$@v j9|$h`|$0U/|$PI1f["|$hfKJ$ uA 1fXD$i|$&fWaFATn|$Pf]{A|$P|$X:DoD$Hfc!ʃ|$p HAYH|$hv|$@$@("|$p75|$X>M|$@|$X8|$5AtAj,|$hqaL*AfI|$h8Rf\RXƒ|$8tAZ'|$8|$h{^|$X3A d|$XA, v|$8H>@|$0w|$@#* |$p07|$00F]|$X=w|$0-A :|$p+MG $7 v|$02aWAEA`A!|$@6!|$h9 o  A4A`$s|$|$P} ( ~`:A.W|$hfUfZ|$8$Ot fD|$h!U >|$bL|$@ |$h<|$X;ACAvA7|$hw fXAdA ~ f]K|$hT;6(|$@\H|$h)' S|$hUf`2A}ܲA |$X=Y |$@@|$@|$pxfLn!AF$#tF7&|$8Q|$XRf9  <#bA|$0o f 7$?|$pO?Ai|$8v |$0TJ$ 6|$p$CArwCfYAL$|$8dAcAЃ|$@|$8A:tOsbO|$P=A5>" A0|$8A]'Aw8A\ |$h@<|$8 SAf_l|$X<tf.@ AJ2AUrA|$0z|$P#+mAmAM D|$hl_f`*|$8KX||$0Sο|$8|$X  |$@ q e $m|$0UA^8fa|$X-I9$;9AvA|$hQA)|$0YdNA%Ufd=|$0U|$p$h0|$X*?0XЃD|$h   (|$@&bA I?$5f|$0X|$0S<1|$Pg|$|$@  AA<|$X,4q+q1o\fVqD|$H4|$X0`A~h$Z$ |$8faI;$ 8;1A|$8 |$X^lpgT A1|$P/%A= |$X%1!AAwJfIAIA|$[|$88<|$]mhf_l|$pw~ j`fD}A8>p1AE|$@|$@`AQ5|$p$A= )>fad|$p0~|$0PS ƒt ]Sf|$X:8|$ 6<|$bfA"|$8f^|$@+|$8 |$8 |$P} @f^"AKAVx|$P|$@0 cfmUB|$HJB9,A#~?eAACb5|$@W5|$h4|$822|$X;3I|$8|$p?C$AexA< [s` 6|$X?mA ur )AV&|$p6>|$8?sAJv|$8 |$@ A |$@fa| ; GArAG5$A>CAbm|$h:|$h+d|$HY&@i  |$8y1|$X6AyQtAf + CTh h$  m|$X4$>{d|$@({\|$PUm\"AV#A OUhxf[T|$8wA|$h ')|$HZ$Ѓ|$X="($ 0DA%|$Po.Q&A/\|$p'R0, Ѓ|$07.afTvZ$f\ |$@BA| !|$@AfAUWAtC|$X'-|$08rOAf3#|$@}]|$@*fW*TA^bc|$8;3AMJA8%$wD _AId$|$F|$p8l ,zAZAAArg|$@|$X(ƒ|$@ t ׹Ac|$X=,Av |$Pvl YfR)\vAW/%A*2|$p *|$0[FYfXq|$H|$8|$pM8|$00x|$0 |$hLo|$0ZA|$XA|$8 j|$Xjv|$h=Amf%|$0F_9|$p9a|$@ |$h1A|$@ A|$8En|$0I?ha|$p4Q|$X2,Am&|$@A0$|$p/|$8,m`fW`|=.4.FA` |$p2$|$p&M|$hDz|$X-dA2yfBo?D|$@ #$ $U&|$8&O$pA,AnPf[DA@f>sZAa Aw xn v|$p.VL|$pE:c|$8w fS&fLLA( A3A7?w|$@ |$0s|$8nA{IgE#A?N3A4Ct!b|$X;|$8TuA}Ju$.|$hc0|$piA TA,00D$X)A-|$@U$x Q6|$hhd|$XAB|$0:KAzo|$@<|$h|w\f\ Ae_A NA5gAE//M &M`|$hC{j|$HkjA&D"} |$+fS[6|$h$}A Ѓ鱿|$h`"f^#E|$8W\f[fRN>|$p;9>|$8 .>]A2uT,iT/fQAS& AD|$X=#.|$X(fG ֠ ƾ@|$haA\ 3f]m鍾$'|$p/+{ b1X|$h&|$PY!e|$8 KA&efD1 |$0g|$h n$ KA鷽|$p\&J P&AvO |vkA^\AK$K1fA "['  AA "ټ$N~ WWAyM|$p)M锼|$p.O Oj|$0C>||$@k&@|$hA |$@$@ 1Jf\O; A Ļf.A馻AAx%% i BALfbD |$8 4|$0K#k|$hv~A@|$@wA|$0[v ҺȺ`vIf 髺|$2*|$p.?`|$@ |$@fW|$h-|$X=LfA|$p2|$X;)lACk|$X)`f|$0[x!B ȹ$N|$钹鈹udQ$# ;v|$X&#|$8J!$b@WAO 鹸驸$ 逸|$0m|$88G'|$X]>T$V|$@|$8c!  |$h<C| 鶷飷S鐷A&@$ J^ _^f`cHAtM|$X  Ad@|$hIL A   ¶鸶 騶AL#|$8  H|$h]f^<Av/ aWD|$X4@fc1|$X8BAk] |$p$ƒt|$@̵ֵA鸵|$0M$F|$X;FAUx|$0]|$01G|$p/OGf\! lGAv|$XEf>#|$X3ƒ$u δ|$0A#|$X*HvA@间Sv|$8uv|$X ]SAt"|$@ɥw Ѓ,"|$8"AF" tAaR AXIA |$hrv|$p&骳g|$@錳|$X;z|$X0XAAGAAD A% !|$hQ|$@E)UA @|$X@Hõ$ 餲|$P)&f@ xEE|$hsAWEZ|$8 F|$hF|$hb) .&|$hL|$8T$ǒA AVvR ̱ 3T|$8H?|$@隱_釱|$X.$|$X)YA T %Auh|$@ |$@$|$8`+AA%|$0zQ f`lf]|$* w |$Hƒ|$8LAB ?鄰$$|$pRA]Y#fb.BAL7|$8(|$Ph> $%A=sRЯ$AAQ驯A 6$6MAQ{fD|$p*$Z[GA8 v|$X.$A 3 cjJAۮ$ >|$hc>鬮Akk: ֕|$8Ѓ邮AP65|$X5K Z|$PZ-|$HBjARA1v|$p*|$H2$ff[|$X)AE鮭 3|$08g|$06|$8O|$pD`A(|$0`E|$h}x4vA A,A8{1߬@v$ 鷬|$8 @4 陬 醬A: :f|$@A9>f_=V|$@9D0D$N* l|$X&W& ۫|$p"(A鼫Aa 霫f_'|$X9UA^ŴfYz$ eArNO9}%AtAA"$9aA|Dv$AIv|$8鵪$C +|$錪{(Av|$8g]|$p2|$0PdcA_A&|$0l&|$8%X|$@ 1AcY#|$8^|$@ |$p)oPƩ|$h%?11髩A0x%AFx$2A%oA}[|$PODiA|$p=^?A||$8|A v$H b$ v|$X>鷨$o 4z4铨|$8$s_|$hw?nA85n|$p"EvA;=3|$0Pp'|$p/$B|$hjBz|$0MxfT*Ѓߧ|$8`ħ 1AcG|$8f铧|$8#FAQ{|$p4v|$@ [Q|$X ?|$h- %|$@A|$8(DwAwA-1A  )A֦Ʀ|$8zAQHA U||$ _|$0B1vAh^3=A@j8$) fA?0dfOw՗1fID@'fQcBϥAg|$p1lA^A 霥AЃ錥fF(o@Af|$p4"AP|$8v|$0*  fX-&AdcA|$p" |$@äAzRA^|M鐤A7|$0Q~J$ |$p0q|$X6~&<2|$X1'fQW|$0(|$h֞|$8"fUUzAVzAO 馣A0 0醣A*Ak|$p!@vASI?h "|$8GAoAf[A;fDAAGA΢|$P#|$8nf 饢|$8MA1$caAwk|$8AiafYO@|$0M;'|$x;|$p $|$hdW$A}UJr|$@Ѓ¡|$ i|$h}W$-鐡@8 8ɦA)aAeP|$h|+A'?|$X#  fgA2!A„ AB |$p A$Ơ|$8a|$@靠6A6|$hEY$AqXf^|$p#<|$p):|$@(P<AR+A&B dA̟|$@fR]\AAv|$8!釟|$p+ )AO39fR4q|$ pA:L,A3[>|$pddd$f c|$h0|$p|A_oϞA*)|$@Z|$p+e|$8@A鐞Ar//w^|$0Y ${W|$8|$@`A?AAc0|$XP0$w f%|$p1JAH鳝|$hf#|$@X|$p~|$8EAfYfACv|$hPF)|$)"A%[AЃA8'|$8y5AkiPߵ|$X,Ե鳜A%?fV]|$8i|$8b7AJ4|$p H|$p#$- -|$8 + |$;"ǛfMGAW.AiM.韛v|$p3}|$h4u"AUP|$p%|$05 ЁS 9|$PA9% 9|$h(.|$8~!|$hqj6<ښКƚ[鳚A5 韚 錚|$pzAH(A<mAGw_kCfaO-c'ov|$ v|$Xڙ|$h Nt.= 鳙 )Agv$'鄙A)w$A e[f]) 4v|$80&A@'A,unAnAA D`D|$p)D鳘(A6Ѓ闘鍘|$ ,tE mc|$hv%ADw >4A:\'K|$p1'|$ H$~$4|$@ 飗陗fL4|$p:)$oC'&PF$K.AFJ#AXA4|$@ʬIAIܖ|$h'fL|$8 ^ 驖|$@闖G鄖zp|$hW)|$p:iApvfX9/|$h||Ark 1f`fV<<A|<|$PzA鰕A5霕A$ 4|$@4g|$0#ƒ|$8(|$p (AZv|$ha+!A (($m hA˃|$8ڔ'|$X$@k$/kA>sA HD<酔ru>Ah>_ _=AJ&|$@JvfGtAi  v$`*ؓ|$X5ƓfA+ v|$8隓鐓  |$@vA[ _UlB$P%|$Pg\|$p2v|$X:A@( |$X:(AI#CA=|$8fTt|$0=霒A J*|$X@|$hC|$p{|$X(Uw?|$84B|$h&f:j|$L|$0<|$pG#fW/ߑՑAaz 鮑|$pȎfaN|$8金|$@x|$>l)|$p(A |$H ǝw(%$ V#A+5Ahd͐A[Qj>j 顐fG 8uj|$Pgj X5Am$4и|$@A Af7|$@vAlӏɏ&0A,o闏fP}8A=r|$p,qAWde8AQ@A|$hN*.Job$Irn|$X/W7|$8 -p|$P"pێ|$0IQ/|$@KfAY饎f\4Al{|$83falXiA'L|$41|$HLi<S1|$HY.AbeA0|$hAsdA|$X2ڳčA_E|$0SNf:& |$X@ $ DA `|$p+NANAЃ5|$hPqjA F|$8I4$,cA tfV` T鷌|$p%[j 陌|$h\^H|$8ku|$@ Ce$`-|$X7q|$hh|$h |$@ Ar2$ƒt 鲋A d|$X6td 銋z*AwArPA=Ѓ8! %|$XA+|$XvAA3cARv|$@Ԋʊ +K|$0d KAiR閊A:KA|$h_CRA(Q|$h7|$X  fPAtA(6,,1|$P [ f|$@n0|$h}o$b7lj|$@IC;|$pO~A,|$0$}$0,|$h(e< NAgHRAY'$]A92Aca|$@fR*|$0xiAec|$X0A(AЃ驈fZ(j|$X20UW$ p|$@B#fYlK8|$8@A>|$pEO^Ѓ& vf^͇Ç|$XE%4|$xrAurB 鍇|$hs6^sts|$pE|$@ LA5$}$#{ b:|$8W:|$HR<|$hywA ކԆXA6|$X5r|$8 xY鎆A#|$8WA]$E|$0>:L|$PVp.CAOCAGy|$h_Uy$ H1Am>1 v|$@Å鹅'驅閅fa\>|$@A>Am$0Os|$@ \f`$|$X)|$8$Gc|$$IAA<D$X3Ą1|$pD@鱄|$8 " 铄OBwAWAx|$P4)ADJfbM$' |$h}tAh݃Ӄ|$@ >A?R9髃AC|$@jw1k|$h<f^b|$XM#A<|$8vA2 Vv|$8΂ĂA8AfyAayAM7A6xA1|$X4Ed|$8 ЃN$*|$0w|$@ ut $݁AɁ|$8 鷁z v|$p镁|$p"@|$8f`AMX|$0>.Av|$p84*Aa|$8rLAS|$8ArwA*€鸀AA]5LIA$ \Al|$@?N$ 9|$hfA AAa+|$XAAAG2f0T|$@v0|$h!|$hGGM|$p L|$ OA65f >1fQ$|$@S|$hO(A ~|$X0=A$r|$@$~|$pA<MA/LA~P3v~~|$h33A5KhIhAF|$hl&gg ~$ o|$@o1}P}|$X.*|$0te MHAS@H}fV;;u}|$82/|$0cNx|$8 A|$@|$hI }Akl9f<Հ|$h G||$X|$FM|$hEA9d|AL,|$@t|$@ |$8!xowG|A8| "|AwA ||$86|$p ??l{ 8-A@|$X5{@fZS|$X*{ q m{|$('L{AS'ck|$@ k{ANAzcv|$0Ozz"ƒ|$X $$z8DA@yzAs4fa;|$;|$0T|$h3Z|$0I7A zA%g(bbfaƒ|$*|$hhy$y` yЃy|$@*+IC|$PA*CBy|$p5/A>|$h>AZ|$xf\vE `E|$8UEx|$h4@fFB|$8Fx|$8vAx|xix|$@ c|$P?%@xA{h'Ai2dflwAu|$@wfF5ww|$@"}Aw|$XC65|$@z |$Hcw|$0aTw$q2|$X0qsA|$p.,fU~h|$@*]vv|$X5'|$8Ba|$@v|$@ f|$@  Ѓ|$p$ ЁuAXyvovfLAQIA8wA1@v6v|$8|$PdA0 v|$p9vuA@CAu|$0F2mj :g|$8/gu$Ѓun|Ar|$X'B$4wQuGuA=Z*A*$u|$X'u.A 8|$XB|$@ƒ|$8#˫|$X+tfXB0t$ iuAFAaZfBF|$@;Ut|$X82 7tA#tt?A|s|$P+=A =s|$h5j|$X/ss$C|$8 C+ kC- usksSbTs Ds:sp's|$p18b|$8,AЃrrrfM*NrrAT r|$h~# mrABSr |$P%<A u|$@f>|Ahv rqq|$)S|$@SqA$qq|$8qqAwpAv`p|$8Tq|$p%86$4q|$p?6A 1v|$p9 qqpf]_r.SrЃpf=0|$p9Y|$Ypp|$8p,fOxAHept$t2|$0]2Ѓ#p|$0eA La|$@weooo#/AgiD$@o|$p,oTo|$p.??W fo\oA3 |$X'jf^A &oov|$p%onnnnnnn$_c8f@$[n |$P8f\|$8RnA d|$@;|$X6|$@ !fY„t; nnmA~m"84mAmfKOmAm|$8 K|$@KAJfm\mRm|$8fNEAJYF|$PB m mZAYl3 lAe Illv|$Pllplfl\lRlAE|$8E|$@ۍ ō$|$8lk|$X" kkk|$p1jvk|$jq|$@ k|$h&$d\|$8EPRkAd`f_~ 1k'kk1|$HkA`w|$8w |s^jj5 b +b|$p1\Z v|$hrjj[ƒ|$0;uA ZjPj \Az\|$@o\%j A=|$P)Ai|$p ii|$HOii|$@ KTEvA-|iri|$8nAnGi=i3i)iii1|$PD@i Fe0e|$p3%eDh$M h|$8kk!A4u$GZf_@tABOhEham|$ w Xmh|$p1sn h|$@ЃggAggg|$hf2Ai{|$0twSg3 4|$@ hgA+WgxFg|$@4gVD8AOgfQJ8|$p;f|$X-@0|$pA9|$@.fffHy3AqzAew~ff|$0Q4Akfw|$@SfIf?f|$8 Z8f^P8|$@ 28 fe$. e 2|$@e|$@ vAeeeeJ|$h ~H | v|$8BTeJe@eEA#eeeddf63#dAS3AII3d|$X/Q3023^dA 1|$h}yAFxUd,T3K36dA[P$P|$p dc$ =2|$8yAHyccQ cc ccuc|$X3G-|$p.Xc|$2:cfV+|$X<|$8g2|$@ cb|$Pv-% bb|$8%4|$hN4bb^b/|$p/|Ab{A Ub'^1|$p,S1 vAR'bb|$8v|$@baa*fZ*QAd=aafX`-a aaaA;Cha^aTaAbP.4a*a aa a|$@;A`A=7$ ``D$84|$p4` @$ ?A)d`Z`|$0X5f442` a4A)Ѓ`|$p=AoAH%}Ѓ_ASɃw |$H__|$X%_|$p$<|$H<C__|$0UiCATPALnAH(C@_6_;#_;fX;A=^AE?A ?$ |$@Ѓ^A@|$h3|$X6֑|$@ w^R9|$hs=9A09C^A B?(?|$8[^|$p;A&]$z7]]*MLA]] p]wЃ^]$9A<]|$p4AV8|$hHK8 ]Ay0A_w\\2Aac2$.|$8 \|$hv|$@ \\;A;b\|$4<A3ƒ|$@>A_4,\"\$g A|$0/|$X A[[AP[=7A|j[|$05|$X5|$pi|$8Tm.[$[|$X$8fdo8AɐA+$AoZZ|$@!>|$P}> Z|$@S>vZ|$X"2Av TZJZf\2|$82A/_|$X:JZYAt>fQ>$yY7YvAYYA8A8gY]YSY@|$@ @2Y(YYY4 Y*ЃX|$p%5$J5|$h5|$P4A'XAM2X|$@1RqX|$@wVX5Aw56X,Xfg:::|$X;z|$@W|$P9A w9|$P$AW$ ==WAW|$X.P; } fW|$@TWJW :W0WA:WA6Aq6fYy|$p,yAVAUV V|$X6_v|$h:VyV7<NV>V|$X4}=|$@!Vwr  VVUUf\Q|$8 Q|$1|$PDUfV?$ cA;U{UqUA ZAPU|$@v|$X9U/U%U|$8 FEf`5||$@TTTT$O_HЃTATT|$PQD$h8,bT|$0faA2A fX|$p, Ё&0$SSSSAfDDS|$X,7HAEH|$8S v }SsSiSA >|$p6= >S4SfW>fAOSfOY|$@VAQVR0 TR [fR RAZ&BzRpRf_BA[ s@z vAF6R,Ry\k|$8Зf^Ѫ|$pAB(Q$H|$h3|$@ ЃQ8F Q|$pG|$h$A|$p5_|$p3=|$/Q|$XvA8QQA?D|$p$DfbA)ЃPA>AG<|$0]z|$p*|$8p|$8  A־AI̢vANPDPKMfBM|$Y <A|$p9RALLL|$p1QA|$8ЃL|$@vA"iL_L|$8; Q|$PPfLݣ|$@$LLKK =f[1|$hں|$@źKKA vKKKyK|$X(Sg|$X#MK|$p* 4f\O,K|$@K|$hw3|$p ~3|$hSJJA>|$rq>|$8AJJfMT|$@ mT~  gJ|$@OS|$VDSAB R (J v|$0YJ JJIDF|$8IAwMII|$pAR(AIA*hI|$X;|$p*KIAIAF#Rg|$8.g|$XRHA0N  A$H$ vfYHHHA AoHAH  |$X6|$p+A .d|$8c|$@HA|$@nA|$p83dAcƒ|$X=cAlc cG|$p9>|$@ GA%^GTGJG@G0G&GI|$8rIETTATF< F|$pG.|$h.|$8*f$|$X,|$@A {fF|$p $ FFAJ|$h1J1A0D@FAN0?E$9bq9cT9|$0,Aq*eEf_Ay `|$@ _sE|$0^AAvwEE;EAQPAPE|$P>ABD|$80>A,pW$vWcWA(;W|$PODAEA10&fD|$hW-|$PB-Ae0DALeLDAaDA:F|$XEA~vf]CC|$p4G|$p"G|$0ֲʲC$ EAEï|$8"AzZC|$@ |7|$8.81C'CC **AX|$ K BBBB|$p#?ABABAk|BAG*E'YBAEB;B(B|$p(=<$l=UAR U|$X=A|$X8 87fZWAA|$@ !C|$p0v|$hAApAAWCACOAEA|$8 ;|$p+|$hqA|$h3q;A&5;Aսf4$SA6@@1AD@e?6 66|$hG|$@c@P@A?@|$X6=Ar=@A @? 4|$X74A3??Ap ?q5AQ??|$0[vY|$p8o?A wQX?N?D?:?|$8 RYA}ƒ|$8$1YA$YAX|>fWAv|$@vA-vAG >>>>>g>|$8 ATx|$hXx|$p#w|$hFIu5=u>|$@v|$p>==A Y|$iЃ=A<ƒ|$8 YvA5Ov=|$@w5AW|$ Wl=b=A;yuyB=f]v|$hv|$p:vYufXu=|$@uuAT~ufatu8fdf`V|$hqUT$?|$0;7AX776C7A77$ Am7|$p'O7E7AV|$@ VAqVZ7|$8 1T6|$0i^|$TLNf^rNfQO66|$HO6A7GL|$h2L|$X$'LU6K6A676-6#6|$p=RfZATR R59|$0u?MA%M|$@55$ IfY 5}5= L|$hL\5R51|$H<5Avj"55wM$OqJA nIAG2Iv|$44|$8KK4|$8,QfaN|$hro4|$hsw&|$0\V4L4B4AJ|$@J 4|$X"L L|$p L333|$0jv|$PHAu H H|$0bPIU :I 3}3s3AX/$V3|$X>bI|$@ 93/3|$8K|$XKK3A 222AxG|$p*yGmG222A 2vEu2k2AI]2 NfLNn:2lwd|$pJA?JA<I|$07I1|$p,KVK1AЃ11|$pImIA^cI1A{u1k1X1N1D11A /1A(JAJJ100000|$h5wA|$X< MAoLfRE|$0cwk00Acq0|$p _0|$@ DDD0:0'000 0/$7GA*G/||$X"////////|$8%jAJk|$0/ktj|$p"jA4+/|$@F$ /|$p6C C .AFEAE......ADD_.AIE@E4.|$h=$xB$B--A.Ѓ---ALiADiAh|$p%mA|$8 %A$Cw ic-|$0Tw8A1^w|$@Iw7- $-fROn-$A.N_,,,,A|$X4'^UA,y, A!TAiTC,AMAxMA9Ѓ,_+A\7O|$0XO^MA++A++^%+AVwVs+i+_+U+|$P ~|$b;+1+|$|$X7++VQ MQ*EQwHAyQVQ|$8***|$X'QA6vA;p*f*AR*3w,|$@lPf`u(**|$8d|$HdA\Av5)))fa AB)|$8M|$8{M|$h-))y)|$@pOZOAcMO|$@\|$H||$P3)))|$0Z \|$@[|$@ƒ[N[( f]R|$@Qƒ|$p8QfQQ(fa]TNz(|$@wa|$0B9N|$KN5N|$8*N<(AO((|$KI!'''*R|$8#RfO R'|$@ T|$PT|$8 v|$@ '~'|$X8 \A^A#]#='3')'''|$H1|$P D&A]UTU&|$hEd dATd&&AqH|$@vH&p y&o&e&|$HK G&=& -&|$p,E& &A%A`A`}`|$p1h`|$@S` %J|$8JA%|$X0kU*j%A4C A"7WA(T|$8:%A&%%%|$pI |$X4L|$p$|$H-F$$$$$$$A|$r$AAba|$X.I$t 6$yG|$81G$|$X3O 1A#####|$p$TACTAPT|$p#T{#U|$vEW#M#A?@G|$hQ.#G9G vA #""A~+EAEZ""""A KqK"|$X+ƒ|$8cSAVSQ"G"k|$@)"""Ap"!!A!!A!A!|$8D^|$puz{!q!|$X ?^|$hiQA^6 ;!Aw$Av !!|$@ vAk    NC|$0K*C|$P ~fa  C|$HC x Ad B|$p3VA9 |$p1HA wH|$@GHA; ABwdAOC|$X>JA2JxJ|$P} |$X3Q$"tQA]Q|$8 `|$8)J|$h"J/ A1fbAAZu?|$@M?|$8!AI|$8\NAEN9Nwm ZP|$@>4*AA^|$8 GfFFZGACf<_GfKGAG|$@ ƒ|$X:F/FF,V|$pK||$Pƒ|$pCt EAUNNANLNA?N|$0R|l{|$XAg]|$8 RALpRgR5+f[~|$0J |$@AUAKKKh^|$@ ЃMfA0v  J~I|$0D L|$hnK`w$fCyA :AR:~NAHf\|$8!A@7|$X&P{P|$8PE|$0XEApDABDD|$@Ѓ|$H9<vA |$@wmc|$p9GA GЃ9/'f_xAW|$p/aEatv|$hVp|$8Ib$.b$NaA_aaa|$HOA=|$8 ADac|$8<8cv|$0t||$l \l$$1l (l"AC|$hbfb)Ada|$@wh|$8މˉA,^|$8#:#Eq#h[#1|$8  |$p ō+f#|$XBAX0qA>pqARq3|$@v|$0f\RH75+!|$@Ab|$p(`|$8A{ЃfX% mEAAJhAGLA/^|$h\Ap`A|$pB|$p|$@|$p2|$0bȦ_|$X7v;Ajf^ݫzZ|$h1|$@1AGɫ$|$pf^Qk A=|$8Atrh^TJ@6#AoX|$8|$@@|$p&{'Ѓ|$8wo$|$pUʣ|$Xc|$X*ƒ|$pEu ! w fX~|$p+Aw |$0n|$@z(i iAhAh|$@gTAXAi  ˡAA` z|$@ew YAQA@h4h|$@э> A A[At|$X'yoA  hAg|$PDh :0|$0qЃ |$X$}{|$X?XfQv|$p7Auk|$|A_|S|2fZvAwЃf\|$8 S|SN      A=* AF% $}|$pׂA:=|$h~|$X% ۅ  |$X9  |$P1I$ |$@  $- A  A-q g ] S A-0|$@!4 |$H{|$0C܅|$@ A|$h"ڃAA ܃|$8r |$:RA5Ѓ x |$X8v0` V AA|$8 {An A  AW|$8B  |$p.wC|$h4|$X3|$@AvfR  Av|$p4h ^ T J @ 6 ,  |$0I|$>,|$p*|$8 |$H >|$p":h|$8qqm  l vn d Z P Al< 1|$H*   Y1D@|$8 fQ u|$8|$~.P|$p:Pxq$ƒ|$hz: |$X,/ A owfbew|$X3wA $$OOdA1f4|$8IZ|$h*Z|$ ZA_ef9UAFQHdBAgg|$p!RgFg X|$X6]XAQ|$Xƒ|$8GA GA{fZfbfZ|$pi=3)fX|$X?xA$Y|$@ DA0|$0)%NfE:|$p-/|$X=V|$8UfQ0 |$@x|$@b$IRAHU|$8 w/%|$O|$X2)U  U|$p'_f\ƒ|$_|$p_A]]A{Av|$pbXND|$X>|U|$8c'[J|$hFJ, Ѓ*cAc|$@tcf_EAw|$hQ_A7_A _|$X7w_^|$h +hc|$X3 l|$8b $ TAS/=|$8]wKAt|$X-xn|$p(|$X=!Ё„to|$8vh|$X8j|$hfj(Abkw jfaiAi|$X7jj|$8%w@|$8 \w^|$p@vW||$@\A"\\A<\,K\1D8.A\fZƒ|$@ t A5^|$X*]|$@ A3^}"j|$p ]]]A[]6|$%Cof^8A mA^|$@|$8!Ѓ|$hl„ElA8l|$@|$X94 # bABl l 6A "o|$0Qo|$0A-p$o$W |$X.v |$@yoA tD:0|$h/jjAi|$if^~hi|$8 DAk|$8*YOEAE/Q|$8QAO|$Ѓ|$lfYl|$Pl$wl(A|$X.)IAaHHj`AOAЃ?5+!&kv|$p fU|$X"w|Ѓj`Vf;~AP>4|$h.|$X/s?A $W;|$@+; nd|$@=P|$p'J}G,1AC$KsSA$r /=#=$}$rhN|$8MYF}siA)U<fY</|$hRwA|$8=|$@2=<|$hLv7AOB:$':: :MMfIF|$@EAL`|$82<<D9/ADG>|$0D<>|$L.|$2EP.P P |$Ag T$KQA Q|$X3P$P $P 5A5|$P><$ |$X4A' 54|$h@44gV9-9|$89#$m6fW6|$pA;7|$8f7|$pQ7|$h~F7A;|$p;Ao]Y|$X;"AM:$4|$@wM|$hXwDAR3|$44AA{b:|$H:bAv66EfaM3n[4|$hT3$|$@ AAv|$X*w-|$0Yw@ wgAAQt&1|$@, wmA Yf`-A?& A<v#wyv|$PظaWMC9/%|$hA A@w^vO|$@w!Avx|$X>w2|$@t!ABwUSI?,f]A_A f@W|$0ffZ|$0C<|$X8w2Aw)|$P5A|w3w+ePv-AGwD:0&Av#}AT|$p4A|$[A|$@U|$X<$$$|$X%eA g$6AR%|$2v-fNAP|$0SwwAfJ~|$p>vAAHv,Y\C9/|$8w>AgvwIAUw@[wBA{1g]SI?|$pw1Aw$7A|$@|$8%|$8 |$8RwxA.jw"f\~AJ@-$u4a|$@w$fJ~Aev|$pwE|$@w&wkaWMC9/%wA |$p8wVw? ƒ|$hDu,fY&Ѓ|$P}A'wtj`VLB8.$vF|$v5~w#Awzv|$hwA[QvA:0& Ѓ .)AiЃW1C0&A|$h{fa~svn|$@wWAwD|$09v3|$8w"|$pwzpw|$0?wWMC9/%AEw(v$kA z|$t|$@ {qgA~w'ND:|$Hƒ|$X.u |$POA}wAwwZAwAv|$~tf]k|$p$wRTAYЃD$w||$hwk$v@A|$8$w'A^w!|$POAZ|$8wMN w;|$@w$u E`VANvO|$@>f^ƒ$u Aw  A v|$p1|$0UvK w9|$X=w2vlbXND:wTvEw*E$v!AUvh^TJfI0Ag vA u ( f^A wv|$Pk~oA?w3Azv<|$@wAЃ$wmA$w<|$huw+O=<2(|$X%ww|$p)wf$owC-w'A-vjA.wSxnfKK$Ew-|$@IA98.AO |$82wJAw7Af~CAv0|$8w&|$@f)d|$HOk|$0t$t}|$p:wv|$p3wefLfCDA|$X9|$ AJAЃA^A<rh^T A1Af_$bfMO|$@|$X&E!A?„tCw |$@w. wvl wAcSIvS1|$@D@.v|$p. A|$p%mw+{vcYOAwx8.$`  fT5A~6C |$8u|$p-$&|$h[fY]S$vW~|$h]v7.|$h.wqAQAR=|$PF |$p5~Aj`VABA}X EB wA|$P:AA-v$|$@ |$hT||$0;wAfT(A[QG4|$0=wzA$wqzvfN|$0Iv6s*|$8wA$ |$X7wb$Kw?I|$XE|$8 w}y$w71YAwO?5|$0\#A0EA.w0AAMwmf=; A,>|$p5|$p6|$X:wa|$H|2M`w.|$hvA7-A5|$P *|$@ DAv+|$@w$|rh^TfbA|$hyw0AGtA! ANwAH|$XGwm|$8wJw'|$8&;w!AwA f~%n|$XT\RH>Aovw#d |$8/Y CF AB |$p |$ha fbv ukA6v5|$X,w$|wI1ADD@7-#vEAvQ|$hFv@|$0Mw/Av|$X9||$P|8|$0Jw1|$HD[QA=3) Ae$ vukaWMC9/%C AeA|$8vLAwC$w_|$X:wC|$P,ww lbXH1f[3|$PJ w1|$8Bw'|$hw=Av|$85w|$@woA~_U|$0Hv^|$0Qw)AB6|$P}IA. |$@ЃAfT|$pfbu%Aw|$X'siJVL9&ww.A /|$0njmcYOE;1'|$0>w4|$@w#A!v|$X#C|$0N8$$wr wc|$8 v?Av,\ y w(A`VL 9/% AAOv>AWw$w1AsAwAlbXND:01|$8A |$h6wYAw0|$p$:teAa|$8|$pFЃwmAw]QGv6,fU' w(Gƒ|$8 u Azwf](AazA_sЃOE;1'Aw,|$@w|$H~ f^g|$h9wH|$8w1|$X1D@Ϸ|$X/w^|$p vM鮷|$p&|$83wA?vo|$@wh|$X0w?AtjABvSI|$P~1'A,|$h,!ݶ|$X=˶|$wLA0v4* -Au|$0\wq|$X4$$  ArwO|$X0w_ղ˲A AKu|$@ t頲閲録邲xnfT wfA fPO?2 *$|$@A |$@vK$v7 ձ|$h3AHw'鱱駱靱|$@w3bw! vA~wmcAv[|$hw2|$@DA wi|$p1wX $AvA  fZAKwgz ߰հ|$0Ww#|$vA 髰AgwV|$p2vE鋰 rV w%A`YOE;1AA uw'A*vگЯƯ鼯w;AZw(阯1A郯yoeA |$Hu |$=` /A_w7$~|$X7wۮѮǮ齮A[ ;頮閮|$@wHA=v|$0Kwh( wV$ w6GAv|$h.$|$h w< w"F v|$p2٭|$ĭ麭A,馭霭钭邭xndZA>FA|$p56 |$h]|$@ f]|$p/wjAwLAWw4|$hv#A\v|$X4騬鞬|$8錬OwudAw,w?C9/|$8u& Ѓ |$X5Aw]|$hɣf\~_$ wHA<v?&w-A7w'镣鋣xndZAw-~(<|$H آAǢ齢鳢驢a関錢邢(|$h|pUAЃB|$@AvP|$8w#|$X&wA|$8&ƒ|$@ tXwPޡԡʡA鶡%w id阡鎡鄡|$X|$pwlw]wE|$X?w4|$pv#Ahv|$@}siYOAiA|$p-#|$hPwpAJwXAw%|$@?L"|$Hf\O龝|$@鬝d!|$p邝xLw\|$hkwK|$X8wDA7w'|$8v$|?5|$@wTf]N|$hMw!vA/|$8ڜМj齜A@wGA飜$v3|$X5w,|$@mcY|$zASwiAaw,|$X3f]uA<A/A"w$vEGܛ|$8|$p&AdwB骛f`tqABva|$X5wZwHA;{v"|$P}[QG=3AP*|$p% f_2|$HOܚdw&C;鮚A邚wD|$@w3>`$ w;@6EtA"|$@AzԙA|$p,A>wbA3vRfY4$Nw銙這vw=^T|$hRw=w"A4Az#:|$8vA:oACwFAw v饘A0~$鈘AtA-q|$P|6M$|$0V*  |$@|$X1wQ$fVq|$0]|$8w`A驗|$8<tyfX=XЃ]%J@6,A@|$X'|$X$vE~ |$X(vf_Ֆ˖|$@wA|$ w' 骖頖閖e郖yoeA@|$8AAw3AAvDAv1A?w+A1wFݕӕ|$p-w#Av|$p!驕閕錕vkq|$H|$hWH|$8tm<w|$f^|$8ACwAbՔ˔~6Aw0鶔AKw4$ v鐔醔|rh^T|$&B2(w6} A{ړw9v!A鶓鬓陓|$Aw[|$psi_Lv|$p)4*vB|$h2v1$v$|$@|$@ ֒̒|$8!Ѓ黒A駒|$@wS鍒郒y v|$p0aWMC9&|$p*vG}/ߑ1fKD@͑;麑鰑馑霑|m|$@v\Aw+ twv1\AJwiH>4* ^ސԐʐAw鱐駐|$07w?A:u9鐐 逐A v * aWMC|$8fX~|$8w\A>Ѓ|$X8w!fb~%|$8v$Ϗ1D@龏鴏f],|$8 w|$P閏錏邏9A=bX$ |$8 w6A+,$m AV mfNP|$8,ӎ|$p1A$ 风|$X;w= Ѓ鍎|$8wbAwF w7Aw_UAA7I$$S vA!|$@v/|$0Gw(ݍ$ ō黍鱍駍r锍|$h[v|$@\AA'8|$8-3)|$p!tߌ̌|$X+v&w鳌驌韌镌鋌遌AJmcYOv|$P:0hAAzw6Av#/wA{ԋʋf^|$8$@w||$8w7Aw$Awh^T|$0Ww!fM6,fYOA,w'A`wA8ЊƊ鼊鲊騊鞊锊銊|$X$xndZPF76|$8$ , |$h%w59v#ۉщlj|$@ Ѓ鶉AXwyAwiwW|$p)vFAw+A_xndaЃRH>4*  Av5w0ARw^|$X0w6fat`Ĉ麈 駈|$@ w3|$@w醈|1mZPF<2( |$@w\|$-wKwZ|$X4wivWwE|$pB鼇鲇騇鞇$鉇ufYA|$p9I|$X'ƒ|$Pt r!fb$|$hnކԆ1|$H†fNO鬆领阆鎆鄆|$@w#|$X>vAdZPF$$AY|$6wq|$8"w`,w#|$hUvA.ԅʅAwK|$8wDw2饅雅v'郅yoeAOv,fP~0wG=3)|$p)w>|$@ЃAt3|$h%w,|$@w|$0Iʄ魄飄$Kvm郄|$8w]Ah|$hlwv$wQƒ$t/Aw&)|$p" |$@w$A;؃Ń黃鱃駃|$h 镃鋃fK3 uAHv'\RH>Aw~|$0:w`$v5AEA`w-AQwۂтv&1|$P麂A馂铂鉂rhUK$8.$ L|$h|7o+|$8݁ ʁA~wKAhƒ|$X"u+Amt銁送vvA1_UK|$89/%f]-A^ |$p.w2?ЃvFw4iҀ|$8 v.v&1|$P鱀駀靀铀|$h!w,|$@nA7T<A7|$h.wG|$8w6j |$X-w3|$0EA>w3A v|$p'A$w1|$8 lAw yMCf^A3(&wA$6 Ѓ~|$Uw~~~~AHu#w~A~~z~AfcAEvz~wrB~8~.~w$1A~r~|$P~}}}AZvE}}w1|$8 w |$hww|$X3}{}q}Aw"|$ux xxwwww1Awwww$tuACwywow|$8ЃRw ?w8,w"www|$h8wS|$X$vBAw&$vfbvvvvAw]Av$R|$h0#vAj_|$0(w1Nv|$X/}w:|$pw3*vfWr|$8[gAvuwNw4@u|$0Bw|$8uu$u|$h Avuw;AvAWuMu|$@v=u3uf_BAw/|$p)vAt utttAtttAt.|$@ wAwtttAЃ|tAB htLXt|$P|$P0|$84t|$0%Ptts|$8B|$p(AvV|$p.wEAu?s wssNss|$P|#ƒ|$@t|$p,w]sSsIsw.s$ss|$Xw/A?ЃsAw`r|$07|$0,Awtf[Pw>|$pv-|$hwkwrrryror|$h w+A(w|$PQrGr=rqv|$X"%rr|$:$f^3|$pqfaF|$8w&Aq|$@qf].AЃq|$8w-Aq|$08u7|$@gqAw0wABq8q.q$q|$pwz|$ vi|$pA3$R|$X5v2AIw)pf[$ppp$vIvwApzpw^|$@ wDA7w,A%v|$XAMpCp9p|$8 'pspApoooAq|$X1A2'of\!|$P||$X&ooA wlooA5wVoLo|$PAo|$p 1ow |$8oof]t/w vnnnnA w)fKOnm nAvrAwiAN_n|$hgwU fnw Av|$8KnAn.n$nnCAu2_w*m|$@w-|$0iv|$X mmmmmmmЃzm|$X:w!$-^wA]w@RmAcvN$v7|$P}&Ѓ&mmmmll}!Awvll|$P`$ vI|$8wBlAw|$Ows$- w\|$@ ЃqlglTlf\A:l0l&llll|$HOkkkkkkAwRAw9w'kk{kqk ^k JfY6|$p70kAkk kk|$8*|$8 w7|$X6v&wjjjj4w6|$0Hv%|$h* tAFw>jzj|$@hj|$@ vA1PjFjiAYvAAiAvPAw,Av|$p>wimici[|$@ Ei|$h$iiwpAh|$0Lw0|$h6wiv|$0GhhhAv3hAhxh|$8)wOA w.AvA QhGh=hw8"hhhhggggggAv%A gggggAwUw8|$@w'^gTgJg@gAw,|$@(gf\'Ag fv f]u|$@fff|$P}fffAJwЃf~f$$|$X>;f|$@wcwQ|$hdvJf|$8w($ee|$@ ЃeeAXw\vMv;eeeeeyeoeee[e|$8v$AwDe:e0e&eAw=1f`e|$pswWd|$X1v|$8 ddЃdddfb$NbdwgvX|$@w:dv+vЃ:d$u)|$8ddrdcc$wO|$hv>f`8|$p;cAcЃcc|$p5wAvwcmcccfUSDT$`\$(l$xD$A A|$p ||$hs$|$0.Ah*A%<|$0yX|$83A i|$8^|$8|$0lj|$X/AZ%AK.$ H|$@vU w|$@ND|$hnwy|$dvAhD|$p&Y  |$2|$0R@" |$8OmAOArwg7 AU f`t|$X+`+|$p s|$X%M1UfAe|$XA$  APK5|$X1EPAIqfaA27$|$@fDAS /fU= A |$p+0AX?|$h;f\IrAAv -#|$0)|$0qBA>fNS*f9A-_A0|$@s|$0'wifW|$0# |$0A/AwwAALq|$HR2 AE|$X)faW<|$8#hXA.p[]f.f\V|$@A"ADw1T|$|$X#ANv|$p`V|$X1E |$8^ |$pA7/!LA#A1D|$hK-As Adf?>7|$0>xM|$ |$8@ D |$89 AhDd|$X3Gf`c1  f.f`vA0$&|$X>@ f]tAA|$XyfD|$0Ue |$p/fU|$X6!<O[|$8(-f.|$0H?fD|$0yL$ps 1fD/A |$0>|$8-AL,EPo@|$0@w9"S wf[<2|$HAV? 'f]M!|$p/E<|$BT|$h^cu|$X?AzAfA|$:AksA}bgJ95&|$XM|$X#|$8$;AiK |$0ZA)A)$= AfDAh|$@|$P;|$p.gPfWw|$@@|$8Af'5 Jf\A 1A |$p-|$X(Ap<$$ f.|$0h|$p%zAAc w|$X7xDA hfVZAW&f_9@A4$!r w E|$R47$W|$8w|$@ Av|$p#A%DDafD|$0dN |$X,|$0=(4N'@|$H$"A|$H@F|$0* |$p!A[ 1nA |$0I|$hd9|$ ^A~c|$@?|$@D$T|$8$! }-fVyD|$hf@ AVK!E'AyPA3h${A,#|$X<S|$p e|$H|$h.!Aav " |$@E|$0<=$f]$$c wA$4'|$X*AJE,A?-B mA9|$@A6Q$l|$8lv |$@% AO.9|$0a~M|$X0Mh|$@ ABA |$p-#A& q|$X#]aA3IfD9AC("c|$8|$p1kA Ai{:g |$p39*|$hYK|$HwfHRA\%lfY|$0~'>AG ,|$Xz AB<|$p37<f]|$0A';$XAfD|$0?$ rf[;A ƒ|$0=t, D:|$X/E++ lHfW"j|$8dy N $7|$0>.|$8W|$p_|$PEg $ 'i|$0=}|$@'|$h0OApNhA6faDC|$PgAz:|$p(As f.|$XaZ |$84$A_~f_QZfw AQG@fZV DF(|$8N=fY ~AY|$@ f.|$8|$p"A9OuIifD|$h m 2Aw(Bf\s|$8C|$8 ɾvA @6A:|$ ^/$A9 |$h$OA6|$h8YAZNlSAoc|$p*9AY|$8~faEA|$@$A |$8-3A\|$p2|$0@4|$hE-XAL}|$@ƒ|$8t|fA v APfC(bA[If8D$@wp|$0`fbO|$h'  A|>f`=cƒ|$@ |$83@AJ C_~|$hpT~Ef|$X:%|$87,1|$p$t>.AEFb|$p 6A&% |$h~AA+AfB$|$p.M|$X6a/YfDEA?A1YA7Yh|$hSA *f`4| +|At=V` f]" $AT=fKi|$X8ʅ|$h|$8O$>4z&fDfWA7?/w|$8D  |$h# F|$8vf_Z\)uKAXD|$0A9$df8-afD|$h |$@s`D%X|$8[(|$0mf[c"A6gAAU|$@^ ABf\|$hR#fW|$H$E#w |$X9z A |$0a-AKAw|$8fDm1AYfN- |$h<|$Pi0fYT|$@!zA]|$@fDA |$0! Ss1|$XC|$h |$0dW'NQ N< g|$h}#?D$SMAzvA|$hw|$X#|$0[$/T$H |$p@|$hxP | AHpfARA_A3 |$0J3;|$0GAFt|$Pĸ Acw|$X;BA]nf_yn$A\4A'9V|$X"AYۦAqA#$  A8B4A84 t$8uf]-0/HAGu q|$P$f}f.s ƒ|$p>Ay|$8>|$8mA/|$@ƒfKA|$P|$p&*|$X3J|$hR| vAw |$8 @ w|$h~6A9XAL6A0 !( A|$@fU@|$0VA1Ak W w|$Hf\f]OF|$p+#|$PesA s |$0t|$@ A]v |$H|$X5!AA Ѓ 8|$hT<H]|$X:~$ XfXA|$@B ,|$@ 80 tAFtAA^Nl>|$h`|$XC; f`?|$p(W|$X9|$@A uf#A>}My"|$p+1|$h&:N|$*i |$p0R|$X vA XA{fb{AK?|$@|$p2-5nA 3A!O|$h|$P |4+fDA1A#$AA%AA|$0:|$p8#{ k3 M!|$h|OA3@|$PePAЃ"E |$8 <|u|$p3quA|$8TDEv |$hp$A~c pAJЃ_|$X'; |$p<;\P|$hh[|$pA@|$$7E`rq|$hZ$c|$@f$<$P(|$0XT1 z|$@TA$ A!$v|$ AN1fO]AAfSqA>%Ax  AD=fblc|$h~|$p,=A/ݴA-?<|$huv|$p.$fa|$hQ>HALvf]DAOA|$0j(|$hgWIJ|$sA>fLEA*NA7|$p vA |$8 A|$pD|$huqfeq< fZ1|$X=~_|$p:j afD1 H15|$p*|$hO5A8yjAf|$0l|$0[)A?nQ|$@ @ fD|$0L7/9|$@ Gnf`|$h+4fTX|$8*|$0?Af$PAZ AA vpAvA|$0|$hu4|$X,WLnR|$0=|$phl|$@>lAz0|$p/f.|$p/$`8fV"$fJA;D$8AC03|$X&|$h~7WeDL$8EqOB4A\#|$@nfAu0v|$p4 |$@|$8w$|$p1G6SoA03&f=[|$p0fN |$@ [A]|$8B$A|$0;AS`$T$@xA|$8 o7Yv |$p1PFOo'|$0\Ae;MF_?|$P~ |$hzA??|$p?|$8t|$h|AusAGd|$h>."AG|$X,w$/%AON A$f:K|$p(:77^$'iy|$@O|$8v:@ACq|$X+_~A9DAv|$p+!  |$8"E|$X1EA6*GA6 =A^if`R s`|$XL9v#'$AXBXtAPbcq|$8|$p<=01F|$0rgy $}Y|$8KYA "|$p-`D$4A >?Ѓ,u4Ak4f`&=$*ae|$@|$hd#*@|$@Ѓfa))A N|$pAyKAWu|$0R|$07|$hg [  AfD|$0g.|$82A@FA/|$hNOA*x|$@xDA>)$ +Ac|$8v|rAXL-$G1|$HDD|$X..AA|$8$\$A AZ 1|$p-#fVQ|$X?[fOAZeAe{ |$X*wA OEf$ R=|$h|G=Am|$6+1w f]AgI4A%%WA |$8w$ A vA bAaS|$htu +C9|$h!%#i_DD$HE<1|$8ACց|$@  mm|$0q|$hNi|$8"Tg|$@Z_|$h4 g_dS$ vA37-AG%.A .  fR4$T>|$P\A|$H3A~1$ f|$p|$06|$h]> |$@k$[|$@|$X;(|$@|$p8 |$7|$8f|$P$ r1|$HD@[AGu6AvI(A@oM|$p(dMAU˻|$0|$8[.|$X7 `A `|$X-|$p1tcYA|$8?F|$Pc^A?%|$htfafHf\qAMlAG˲|$X3A>{AN^0FbAG T|$0ЃABA;=w|$p X|$huM3ЃAfDA'3 vf5|$0gfVx|$@ vA|$0r~fT<|$8[|$POAw tjAf${<|$X8f?zL Ѓ(f |$o3$O|$X9Ё |$8|$X;Bv$頿|$p9$|$X7_B|$hIry|$P AW@|$w|$hA3|$0r"AA*A|$X. |$@`|$0TxA齾骾AfX:X`郾$p Z|$@H18 C|$0\AvfSAAAAȽf\z6+ -+AX镽|$ #U-|$0BU$O|$8A`.rW.;"11 Ag|$@*.|$XU'M 魼AB:z|$X+qЃw d|$h|$p<B u|$8xg.P"|$h=8|$pP@|$XyA |$h7A_1B--#$R =AYfkfH= 'AWϹ@0鸹|$p7-AK2-|$@eiAxDA~N!|$0mD|$HtAt6X-6|$h{!AdAUk |$@# f_!|$@t|$0btA`W鴸 顸U}AW ARbO|$@=|$p-|$@; |$@$UC|$hOB[|$h 鸷D|$XJ<J钷|$p9=|$8AAj#V|$8TDfL'"|$hH r |$0lA AA_*|$p*齶|$h~A "|$@鎶A IHAhufCg|$8|$Pѡš5f |$X:!A:wD|$@|$ߵ|$h]A J|$P8J鲵騵 A8\/A\y|$X)wA`VLAH"$xA@ZpA $|$@t   Aύ齴|$p!#|$h{$A$g|$8] A UffC |$X$[|$0N,|$@  o|$0*!|$pImNA}|$@ |$8鲳b,E|$hp!EU遳|$8c$IW$o8WOE|$@ =$"!A~;8_A _pβA =_颲|$X 鐲|$0-sjAp\j|$@ f|$X6 bA>|$8S D" ; Ѓ A9I|$ IԱ$$鼱AW+f[QA_I{|$8鉱|$0z:.A.q|fZg|`|$8 v|$@I?$B$IH-$  Xo ԰@A @A6 骰 -|$hR|$@z|$87zv|$8/AL՘|$@ɠ|$ A:A0A" V|$V5 |$0F>)|$X0PQ|$p'AMǨ|$hk鼯|$8| |$I铯|$@*~w]|$8A}}A? A\ F*.|$hpD|$8ɃfR$2AGѮ 龮鴮H阮A*xZ|$p YvAPFA<$AWA]WfW35A|$p>IC|$@ĭA5|$p/^vA鋭$j|$p.>Aq^|$h0P$ wa,"fZU|$8B : zR$ |$0N|$0E|$@A4|$8"(骬DB\|$p2醬f\6A#E|$8EOOf:1fE9\(|$0,|$0XLfVA|$X6!-c\|$8G|$@ |$p+|$h?AJYA铫逫|$8e$|$@ TT$2 IAc3$cEt uyA0h|$p4:|$@hA-'8$|$X7! U|$p:UA cA Y~AH)|$X,M@|$hAfZ4A75fN?A.A |$h{,AP3 +[ǩ|$0+|$07yL$ A|$-ANr|$p4Aƒ|$PtC95v|$8!fTp=|$P|$X=mA|$8@Ѩ|$p*vA鮨f[?F|$p%D 醨Y$|$ha+FAtAFt K$#/%R|$@||$p0|A |$0TAbc 5|$PQ$_ yA y魧|$pIwdvA'鄧K ]UAvUK|$X5-bƒ|$Pt -.ASUT|$h)|$@JAئ|$0;An鹦$4> A?|$X84~An2|$ `2Y|$p!|$@ 鶡|$@"C阡 酡=|$pM1$/==f\SA.|$@|$P-|$8>A5A?A.)|$p"S|$@РA2 +|$X+ 騠|$XC?|$@A$vAxnA}%|$0[RAM9|$X?$HH  AUA9 2A H+ wAlN ڐL |$8 釟h=|$@J|$0|$hb|$X3 b|$-'|$hJA3JAp+xZ$ƞ|$@Ѓ鵞|$@Y|$8阞Aj{a/A^|$0;GA|$p~|$X-AmE! |$|$@ |$88<|$@ȝAL*3A3閝$\'fIO|$hR] v|$8E;A'|$0!dXA7A7|$p8לAsЃǜ|$h|$8)骜關A ZwAR% Cv|$pF +|$@0{(A7;|$X,]Ao1A'cAΘ1fYD@鼘|$03d(9 钘A*|$hag}|$8 }A^ACAdh{SAnSGA"W|$8M/N|$H}|$@֗(A6لAƒtA2铗|$XJ(u%#AgUXB$0 &|$p"D|$P. $g $6`|$X;ږfaE"?rfN5r 骖AM*Rq!R鍖郖|$p$m:kY|$P#|$8t|$H t+$)"$UA+|$p'n|$X68|$8 ƒ|$0nn鬕ABM@|$hrAa+AT+fc|$X1SAz 7F -|$HO#A# |$p6M)|$p/͔fah"` 駔|$@$RADR鈔|$8 KY ^fKЃ<|$89)vA, AЃ|$X%=7A<07AP1B 鲓$)|$0KA6gnEpf|$0MY)A@\e|$h/?Y )|$0b~|$X;v|$8|$Pƒ|$pl Ò(|$@<fY`q|$8Em钏|$P6A\p$o_A:;A{b5H9Asa AD8A`|$0<$@A=|$@齎|$8e!5|$h$c$闎A;郎|$84$ d|$P ƒ|$X0u`B8|9fa]<|$pF3p$p֍T5a9 aX 髍A<`A9|$0=配|$P7AMh_|$PB|$p7-G|$8%@w@&|$X)1|$p ffAHf|$8·A@$ŌO)鬌颌fS41b|$HbO bn25RAH|$heofY|$h \A*|$83|$Xn|$8llЋAId dAv陋|$p/_3 Ѓ|$8I59 A\\t \F|$8Nk(AyG$Xl$|$h)VՊˊ|$1|$@z]A] ޹遊Ay5|$@ k|$X1_|$p"TLA|$PBO!Az5YD$*f>SA ЃA 鰉<3Z锉$fEfXM|$p2jRAc1E-|$0%:w$|$P*O܈$X_|$X<Q1 魈$gKE$p}l$ \|$XD$ULff:#|$P1fWm1A$ЃApJv|$pȇ龇5g2$wr|$p6z醇fJ-3ы@v|$PLB$/c/fO`IANAs1|$HD@ۆfN@>ds1f:鰆|$0eh'|$hTOU|$$UAw|$X vlA tfRI?A.A\w|$XZ&-O|$p3O ۅ'|$X<PAEWR|$hlMAAs yoe$>^l|$p; _LAvf@ Aw-yp|$8!E|$hEfU 鿄AI |$8sA附|$h-w"f[K8LA=d|$7Gf^{|$@DAc$AS1|$@ׇAn |$z@kԃ<AtBhB鞃A|%ASIA*I|$h43fV|$@v$ND"$7v|$8M"|$0cLAh܂G"|$0?v|$p/鯂锂|$8j8,l|$p7A^AVqA{p|$8p2|$0T S|$%|$8YsA_AZ|$0S-vAAn|$p/Q |$p7AW=K=P A"|$@FXM^ K|$PXiI vAf)A q?|$h U{|$hkok~$(ZI%~|$80%|$h~fZ|$8 #|$@|~-|$X9r|$hc|$0&S|$X6>s(A~ VA}8|$X0A$p|$pЃ}'}];kc>cDy}$ !|$pl2?}A+}$e2zYqf[Oq|A|kAЃ|A\-|$PjjAG]|A5|$p9lA Z|AF||$8$9|$p,A gmQ|$8F|AV2|$PiA{|$8<R vAr{{|$p0ƒ|$@t{{ v|$@ i{_{o+|$P }vA.{fS'4|$hxp$+|$X6W|$@Ѓz|$X1:Am]<g1zAN[-|$hA|$X2 uz|$h\|fXVzLz|$pA}~<.z|$h*Ʉz|$07.qbAEyA)GcGy|$p;1|$88rqA{$v|$8ayWy|$3|$8D^|$@vm&yy|$h"3|$@vfNxx$lq7|$Pw xf[)Ayl)|$p7xx%Ax|$p.6APk^(ЃXxA 6|$hl`\ *\|$0MOfae|$@H7xA7(ifL&|$@%ЃwAHwywwAIu|$P01fAw|$@$A|sw|$hn6Uw|$@ & 7w|$8))fKqA') wAx^,>k|$83kv|$h?z(|$0fv~v|$*,D$0kAgv|$8+%$bvA vAiJv@vA;7|$H7LЃvvA7/$sb|$0'ZAo5)ufN4.|$@\k^ uu$$@VASuMTAT,TA2uuu uuAЃt|$X-9A9tfJt|$p&x|$hP|$h v|$@tt|$HD|$p!jD ^D_t|$p/Z0zDtA|$SAFHVEts|$@0A/ s|$I|$X:I$#s|$8/h1fdus$ ƒ|$X1"k|$p(kBsAX.s|$0GT v|$hNss$TfSTf6TTrA|fbD|$X(rAwr|$p#MMAsMOrA Aw|$H/r%r|$h~q~AЃqn qAEALCA?F'vAqq,0{f^z=|$8At9|$h2.Iq vfb2q(q$iM.$-`=pAQA,$Ft|$8ppp|$@YA6$`)|$hz`pMpfYR |$p)G H %pA:M*$)gA2A%@#oA@h/4Vt;oA?A9w |$8ooopoA\o "|$@ >o1D$|$hOnno|$U|$. nADn|$8%nnB !1|$p5)h sninGЃWnv|$X(?n5n|$0i63nhmAmANWoW6mmmm|$8# $f^UA|$8!Tm& AmAwo domvmll|$@*f]^||$p,AQlAtllAe0 t|$8llblXlK :$9AA9$2A^Jfb- t kk5ofMy|$p6d XkkkEH%|$8ApAEz=k-k#k|$@Ѓkk|$p&sjjI/|$P>/j|$0z|$Hjjyjojej RjHj>j4j*j j|$@ D<j$Cf`C|$X>ؔ|$8Ah|$@%|$p2i|$0NHfaH|$hO$ATݫABƒ|$0@AAi|$0aPAUXRAvA i iwh|$p%e|$hle|$0*eANA*ЃhxЃhhAYAYyh"p]hShf?)h vf(2h(hA% h hhgg|$0DofPhAA.Ggg|$hZ^f`]|$8vglgfROVgLgBg8gfa[b[Ұ|$h|$|$8sAT=Ѓff$MY"YAa=T*Ae\|$p";zfpfff\fRfA>f4f\!f|$w!u$ |$8WeeOA>XA?efb[|$p0[ARtaXue|$@ceSeIe|$p} Ѓfc„A ef[X$ UAF$dBXS|$dANf\N$J߰AN˰pd|$@N$RN$sg ] $d|$HR|$8)ccccc|$0VQ|$2Q f`|ccf$(Auv|$@aRsAGwQcGcAJO(A4I|$p )AA/4|$X$ w rMb|$pCU|$P(Uf1!|$h9ubbybobeb[bQbGb %*+b!bb< )A_&|$p A]|$0Mv|$h|aapaaaD$@PaA6|$P!!AZaA,A-Fv$(aa/z```|$X8*ev|$p``A9+ `|$@ )|$p/.A'!H vEP`F`|$@ 1'$ 'Af 'A ` _ _A]__ )A)_|$h8+$+ v|$p5n_d_Z_|$h#(%|$X3=_A;)|$0u-(E_fO+f8 Ѓ^ ^<|$p#|$hY^^^^]^fO})c^Y^O^E^*|$p*[^|$hnv|$@]]|$0e)Ah(|$hP8 "|$P] (|$@ ]|$@n]d]A@5wa5|$PqA/]|$8g'|$X>L'AB|$X,@CЃ\\A"\|$8D93|$p.3\\A@A \An\A71fc1|$ 4|$hA*;L/!\\ \ 1|$p%A[|$X+:|$X(VA7( [A [[k1$ 1d[|$87R[H[fY4+[AAg_[|$h0|$8,fTўZ2A2OԖ ˖Zc Z|$h{fAGqfkZaZAZ::;Z|$p-|$8Z|$0.,AEp,K; |$hx|$8nAY|$@.$.YY .|$j.iY_YA0x0|$X=X|$@AyY$63A?3$X2 Z6 D6fQ:6X,A},v|$p2XX|$@vX|$hS';XXNXA5Ѓ/XA`.|$0WX X [$r[W,(W|$h`8AdW1fIWA;8yWoW9 \WRWHW|$@ Ѓ7WAP-|$p-ƒ|$pu|$h{VVX-$s$R|$X-= 1VaЃV|VrVhVЃVV|$hj0|$8|$hT+V<2# V|$H6't UU|$X v$UUAu6|$X@5|$h*ך$c|$@ N|$h l|$@UUKUAs:UfK^5|$P%S5|$(UTTA(|$XvpTTTT T|$84TAQzA*gT]TST|$ ATA 1|$@ TTA-|$X SA WSSfQ<6|$8416S|$X:0fX/Aw|$@wAwfSA"WISfRf/ALw|$-uw|$8SAS|$8"|$p$A0Rt A" 5"R|$8v|$@ RRyRY ]RhJR7R-R1RRRA\$\|$p28|$X5|$hAEQfZ$V QQ4 uQkQ XQfY89Ax9fSZ|$X:|$8Zƒ|$X6yP|$8r[2[A_|$p$APA v|$PPPAVQ|$hSQ|$8hP|$8VPvA\ IlKP|$0ePAſ|$@ |$eA8|$OCA KKJJA.JJ$PJ|$P ?dJA>v {JqJgJf_4|$8CAd|$8OAuAJ|$0I|$p-D|$8 iAki|$@ cRcArcIA9IIAI|$@6|IiIAЃJI@IAev)IIIAЃI|$D`J$HfCJHAM6AvHH$ ZEAoHvf_XHNHt5|$@5$t5HHHGGG|$8cAlcV@AwG+ƒ|$p**zG t|$X+WGMGCG9G|$p#*|$8*pG FFZFAZ7C FAgF -$A F|$X;vFlF|$@v$*OFEF$Z:B|$0AB|$8F FA*fZOEN,=E$+*$vA EE|$XF*AcvAwEmEcEAUE|$PY*fT*A~*ўAǞE E|$0 <;|$@ vhdDDDDDDNe 8eA vDlDf_|$X*PDFDA2D|$@ D|$8DDCWCCCCAJJA,C1|$pD@CAO|$@aCA+ЃQCA.=C|$X5+C!CCAƒ|$@#\|$X=\A&A AAADAAoA$f[™$ @A6A|$X2wA AA A A@@|$8@|$@ ^Ay8m8@|$X-l8&@q@|$hu^~^AЃG@ v|$Pи/@%@Ajf_u|$p-j|$@v?|$09fY^t|$@ @tA?K ?$==|$0MЫA|$8&]?$|$w{A+s$s!?|$p*?>>>fajt>f6~A>>$f ~s >5u{h>NU>ts1D@8>((>fMrA rAp>AwG|$X6r|$@ Br|$@ -rAJv$=====$Os|$p'sAs_=$s^s;=1='===Ab|$8<<<<<<<<<y0afRya0 00/|$8///fbj|$X/j|$8j|$@//|$X=q|$@ qƒ|$@SAQS4/*/|$X.n|$pyn@l .|$hxNtAY7t|$@,t.|$P~...AJ)_.|$X"w\d\,X\X.|$p A?ofcO-.#..A!.:-fP/|$P W-|$8 Ѓ-|$8%n|$0MnA-ASfTS|$8^|$p1^|$X5s^\&B-8-a\-|$@  dc&c|$c,,,,,A?v Af,,,1f]v,4ZR|$hUORU,fZozo|$8-,,|$8jf<jA++|$XBwWA72WV|$!+|$pFQ3j+|$P[|$0x[S v|$Pz_+U+|$h A9+/+%++++>f|$@ fAO**f_xm[mQ*$*$|*A~_**L*B*AOAIO!**fUo7 ))))))))|$IJf|$@v)))})s)i){ЃZ)|$hF"fbff4)AU)|$p"%h~h|$8"h|$0Eggu(fUFX+X$(|$X4v ((|$w1AXA~w`](S(kfkff((g|$@fw(''A=0dc|$X-cNc'wAAFc|$htc|$=c|$8v|$0Dz'p'AF=W*W|$hHW|$h0V4'|$7w]Ѓ''AЃ&&&&&&|$hЃ&A?&&A#W$OMu&k&|$hR3v|$8 K&A&A7f<O|$@OfROA &|$FR|$X@uR%$wO|$0baR|$h3R|$0]|$p+QR%u%|$XDQ vAQ]%S%I%?%|$pO|$8OBO|$@O|$X3O$|$hE\|$0aw\fR\|$@ ;\$$$vA$$~$f`s|$ |$X+|$hzoASrvA32$($|$p0|!pA@|$@#|$p##AI|$p'V|$@ #|$X6A2{#|$ ‡ dAEG|$h-#|$88#|$P}Z|$p)A"|$pG|$@GA[GHG|$X>"l|$8 ""|"e`"$H"|$854Q*" "APSf]S|$hlS%ZS!|$p#w|$!!AX|$8X|$hzXX!|$p+u|$hlZ!P!AHޗ˗ !!uw   |$X8Pv  c1|$p*  .OZz p A8X|$0,X|$@L |$Pb$aa|$VaA'a|$X;a$Eq|$@VB 8Ѓ|$@)bA bj`MA4 |$@1'A~ƒ}DfSsD$S `b~`l`A_`.M~|$@|$8(DDW$Pp=3}3|$p;C|$8OC_|$0Zaa$KcA >cA_Q |$8yojku|$P`uND:*A[A |$X5E$fZޜ|$p<“A:ЃewmcYO|$X.~u t|$p7Ju7 f_0A KAASƒ|$p$1fWD|$8  u|$ptAh^|$XatfLD?5|$8AEԓ |$0UA EA.t|$X3v{gtA ]t|$P qgnT|$0)9%0|$03w;AD$5A*ךA|$2n|$XEm|$8Amm1fbD@|$X(Azpfbi/w|$@QGO/|$@)|$8fw=|$|$@ou|$pB|$@|$0F`A$+Ai  u|$vlAts|$8sAs@6Ae6|$ A|l$s|$X.Ys|$@DsA17sfD.$-|$@|$8p|$X>,dAZcA܀ɀfY|$   -A-$-AB&|$h{&Aw&A m&vv|$Pyoe[Q>|$0RY1fb"A?fV~DdA vf`^a|$P8$8;A#*|$@K|$0y:dЃA v$Aߔ|$X"h\zpf\AkAk2Acwy|$p c|$08_cAvA|$w6A A|Qc$ |$8cY|$8 k|$p2jAjA j|$hjq%-AA|$8|$X/,|$@v|$8 qgAPG|$2 ƒ|$X2|$huAF`O |$@`|$p!`|$Pk`A6v|$ha `A`oeA*TJ@|$p5~R?\Jw+v|$hPA_d$cA:cZ-|$04w2}"^A,faN,?4|$pf_lc |$p#;|$hN|$X2|$8Ay$bi;iA~ $iAA):o'HAKAjāAH A~AIcA7cic|$p$^c|$8 J|$@ b7 v|$P#'$a|$X9 |$@&YAYA"uY *vA8    |$8SaAt |$HM|$pW A`f*`|$H`.   Av  AZ  |$CX~  i|$@TA7!AZ P AYWAiW]v&  avA@  |$X.IЃ  &   fTf] | A|$pn$7f]A:Ѓ< |$h|$8tuaA  |$hS$$   AIGS |$X(2|$8k} Rj+|$X*v|$8Q G = 3  |$p **|$X'  |$0Z AYm*a* A@*|$pwZ  A *AxW-AP$-fb-,|$X.,,  |$8`v|$X3-*|$X*3)A*+1f]D|$8+$ < If2?|$@]SI?5+A`&J&A=&(Ab" v|$hA&&&|$h`& %'\AS|$hXa"|$|$h|$8 AsA"A@"|$X6;"|$h"!Aw|$pM"o1AED@]|$@KY||$09N$ |$8%w(|$@%8|$X&n A|$@ |$PzA@ &A Af|$0dv|$h9B8|$X:`q|$@>qA_A |$8A<q|$8$0$|$8 kqfYPo|$X2,o|$X/AZv|$@#gt$us|$hEGA#,ARw wGЃ}$j |$@TJ@fVHq&|$8i|$0V^$5w7f`$O1|$H|$p)A- AN[1fLbX$$ Avnn|$p(O|$]|$h>|$XI/|$p!AD$m A|$@ymAv|$@bXA`|$Pu 0&|$XClfVƒ|$@u|$p/|$8l|$Pl1|$8D@f]I|$p0|$XHG ApEA bX h|$X@h7f\chAA3Ti|$X1?i|$p"4i|$8iA hAWwR@h|$8gAgOЃpAcg|$@ Ng v|$P@6} |$p&2AT|$Xuw|$8%vAqA_wSAbv)vv|$h4vAv|$@ mAv|$8vND 7|$P|$^gAg$ZgAgg |$/ A 1|$PD@~tjf55 T|$@B. /A#v|$vj%v|$0?v1|$P2D|$8<|$p.ASθACAHfM>|$p+|$8`r|$@KrfVfa+rArB8.O|$Py|$Hy y$ fRX|$@9zef_feADe|$0LxxAqfb< $ |$@ЃALq|$X: onl|$0Gw+|$XAo|$P|A7]SEvw Ѓ8|$X4z|$h9lAJt|$hwt|$0Gw#Apv|$h A2?APxA(f|$8YOf^`n$m|$8uf\ f[OAeu|$hv|$8k|$hsk|$X4o$toho`K f|$@efIJh|$8 e !$|$8|$PO$4t|$ht$w@Avq|$pwY|$8RdA>Z|$P;%|$hv|$X3|$0?|$8JA $4|$8'|$p.|$P|$@WofUAc|$h,cAkc\<T|$X8  Ѓ|$hkuA |$@Dooo;A;AA?bAx|$pASeЃN|$p'<21A d$k|$x|$P(x|$HNxA7x|$h),xAe|$p7^eCeV[l7lA'lG|$@A$XA~m|$hpwA~w|$@dAubXN}0|$X,7-AA:|$pA|$X0$t|$ u fat}Avjwb|$8w=A>v-w%{Aw0w(`VAB8.|$@v|$8 Aw|$P}fTQbwHAo~`|$P|OAw6Ad~|$lYF< ,AvEAAuJA wAAЃ|$X6t1Aw|$8wrh^rK8.$wBA]w(2 v$A |$0_H2|$@'v|$hDz1fQe[ovU|$X(vNv<$-0 (A2w|$X0AwF|$p#w|$H}Ѓs|$pwAZPFx3)AJwlA$wA|$p/v,@w$Ak|$8*w*|$RA w(|$8E:fE3h!|$p3wM|$8w#|$@ |$@Ѓ|$8wAAvMFAjw>v6AZwefM'kwmc|$XEw'|$X&ƒ|$@u A&wK5+$|$hEw{wG|$8w)A,vBw,|$H}|$8 wA4AA6f]A\1fMG)A |$X; |$h8Ѓ|$87w7Alw'|$p7w tW|$w8t r|$8-wE|$8w4|$H~#M3:0&1fTA|$8&|$8QA"ЃfO$A v j`$v$Av9/% w-|$P}& |$@A)vnA:wUA$A|$8wuSoe|$06v*Aw!K w_v4* A<AA2(AFw#A@w$|rh|$@vZw0Av w=3):v|$p|$p-|$XAE$?Av{wstA|$@wFw>h|$8`v7FN|$v'h4*  |$p|$8t,A_AKv|$X$|$8 Apf\RH|$0~;$ |$hcVvAfb4Av$AAw7|$X w&wyoe[MH>4|$h_wt|$p.wLAv<[w4|$0AwVuO|$hlwS1AfUZ ||$@ j|$@vSI?5ARt|$X2f\$J|$X!~BUw:oAtw\AQwLAw9nw?5A! |$@|$hYv4ALwS|$X.w+Eu|$8vALwAbwk|$p wRЃXND:|$wC$#|$@fa2|$h'w, wAxvA!Ѓf^A;AЃwmcYOE;1', $<|$0Avf.|$8vx|$81fCD@LBAw|$8*  A  |$X=|$@|$8|$p5AIAEЃxn vATJ@-#|$XA|$@w1|$0(D@v'xndZ|$hgwA4A7-AE}Ѓ|$X3D|$@Z!Ѓz|$p(v;Av5|$8w$A`wVLB8.7dw9(w'AwvA xn|v|$81YOE|$8v$A*w||$X)w:|$hpAK|$p!|$XC|$@Au|$0>wV$xA:|$@A:v|$@"wH|$X.wA$w(1|$@|$p,|$p AvqA}s$ [AA<|$@w6* A0w|$@ w+AHv"v|$p!|$hxwRMw3|$8u?w-|$p&w&z|$p=h^TA?7-#ALv ƒBu|$8wp$TAi|$X;w||$@vkf]CAeOAu|$8+9/|$X;|$0\wfaG$4A{Ѓ|$hw;w)ALv$Xzpf\I6,"$|v1f3Aw%|$8#v|$hAAvxAOvh|$P~Wv1h|$85w+|$XavJ@6,"|$hfV3)|$@ tfRfL|$@vlbOE$vE$v1Azw(|$p2wV|$p%w$1|$h(kvrAHv7kw/tB|$h w# $?w*dZ|$8w"|$h5v=;1 ANkw5|$@|$8v0w$u}si_|$@w%swF3)ADw7|$X(w&L n ЃA'Ѓ|$8N|$p(~tA=`VL|$@ w6|$X>3)|$8wE$v(A||$@w$A |$X9|$vV w;|$X;w#A)v|$p0h^AxM0:D$u'Aw  |$HOw~Awbtj wl$uXwwAvf^tAAvu {q^T|$p-w*w|$8w7-#1f\AEwf|$8 |$XCwOAAAHwA$ 1|$H|Hi_UKA7-AwKAЃfa!AuAM|$X+v!$uw|$p$A>|$X-A?wl|$8uG|$hsw,)w$G|$X(w-#fa~,ADujww%A|$8ЃAЃ"'zpf\A|$8 =3 vAFwA7AukaWMC9/d|$pw1AXAwmw.鿿|$wvA餿隿鐿|$p:tm|$X,|$H|d|$X8v2w*B|$8w- w|$h}v"f^QA |$hHҾAj鷾|$@饾雾鑾?~tj`VLB8.$Aw;Anw$|$@ ֽ|$@ Ľ麽鰽A韽镽鋽yЃy}< dAPAwI|$ 8|$w#|$P ~A |$@wF|$Xv5A?v%|$hqwȼ龼鴼骼頼 鍼郼A)Ѓp]S|$X,v|$@ w;1' |$P0f\|$PA8|$X:˻1f\麻|$@t%$v鎻|$H~~ЃukawK|$8-w:1Af=|$0Av%AɺOߺAw#ú鳺驺韺镺鋺遺wmZvw7w%|$p2w9/%$lAKAAAԹ|$hfW f[~u^wm駹|$p9? ?|$@?d?|$8K@V@$ D:AQw_|$p*M$,vg1Ƹw1|$X3v V顸闸鍸E1AKD@rhA`wLw3AЃJw_|$hIvNA*A{O?A>$L鲷騷鞷|$X)v;~Aw-|$8tw\RH>AwkfIG}8v&fU~1Alv wʶ Ѓ黶鱶駶靶$1 wf:w|$8wWA.vGAv`|$@w-AЃG|$8wI-#|$0,w?|$X$Ѓ:vA6ݵӵA8wqAwPA w!vfb靵AA2wA\w6|$h4\Avw?|$X2wAX8.|$X4w,A#w#vAݴӴAw-|$0Qv&鹴|$w|$0g靴铴A v&2Ѓ{qg]S:ЃDw,"|$P}0(γE 黳鱳駳靳铳A w7 w% v$6g]S|$0[w`! 9|$p8w3|$8v"pv|$H |$@v$ϲŲAVvc$wVAaw=|$X;w$|$@ v$遲|$@o> \R|$0VwJA 7-#|$p1wA}vAdܬҬȬ$- =骬頬閬錬邬xnJvVVAwNfQ~>Ѓ5v|$p( |$X1wa|$@ܫҫvAm鱫|$@ w#闫鍫郫|$@ t6|$8 w%|$p/wAZPF<tA#|$ЃG|$@$|$p+w?AªfUiAPwJ|$h)w/$闪ww逪vl|$p5v:w2S+w>w,vV+! $_ w*$JtRw֩é鹩|$p%wDA顩|$h;Af^t<$n|$0Fw_|$P|N|$X1w+ЃGAw%.|$8|$H}6,|$X7vw˨鷨A飨陨鏨酨{q$wEfw3|$H~,K|$8.vB5w')Ajwf.̧֧|$0-麧|$p!|$@隧鐧AXwJ|$8 w"Ai vfVka|$hfHO@|$X8w6A w#|$@vA.  At|$h> ЦƦ鼦 鬦颦阦|$hmw'Av~Aj`VLB8.$ wA v |$8 w:A ƒ|$8tAwȥ龥鴥顥闥w)$wApf\A~vB8%|$p%|$09|$h9ˤ鷤魤飤除鏤|$P|Z|$p7vIwAof\|$|$02wGvm8.$|$@uvY wG$bv:ޣԣʣHЃ鸣鮣餣隣鐣醣|A1$(?Ap5|$@w;|$XEw Aw|$X>A֢â|$h$M$vfJA?錢邢fR"|$p1w"dZfW~A7-|$8|$p-wAAv1"A/wA[ݡӡfX(|$p9A镡|$8 |$@ AkAEd|$8 wZ$w5l$zt|$8"|$8w6A|$hMc|$@w3۠PA-F黠髠顠鎠b~AwqAwVf\Ft.|$Puf[@6I#AЃ|$8wEAZv5|$@wA؟Οz黟鱟$%v/w'钟<ukf_-|$@v wLB8AUwH|$8v7|$X)w'A|$X?ΞĞfcjAw>|$@w%A>非铞鉞|$X)w$u>A3w+A5w%Tv:9/|$8w |$@|$Xڝ|$pwYf_A5A|$8w8ABw(v#z4w?|$0Bv8aWA6v2$&vA3) |$@w%AߜwCǜ|$@鵜髜顜關A@{izpf\wvCf[|$8?5A:v $uRAٛwkvY|$8 vH$w>鮛雛|$X2w|$PzpfARH>+A#A  w@+w&ޚ˚|$8鹚$ f|$8?|$h|A|$p(Ac|$X8N|$hk$|$P}~$|$@|$8A |$p1|$0R| wswn鹙$8 wfY铙鉙t_A3uA|$@w:UKA|$X-/%|$P}:$ؘ|$@Ƙ|$@v"|$@vm靘铘A!w"|$@ {bh^Aw.iB,w#A?w'@ |$@ԗʗAv%A鰗馗霗钗鈗~w/$:oAQGw!|$@ v|$h?(A2v?fa~/AvsٖϖŖ黖ADn|$h{R|$H3|$X/(醖|r_9LB8.A(|$hw%A Av|$HؕΕ1|$8D黕鱕|$h`vA閕錕邕|$p8wE h^TAAC|$p( %fV>1|$PD$wY|$X6wHfX"A*הAƔEt馔霔|$@ wUvC|$@{$Iv|$p^TJ@|$851'AA|$p2v ͓Ó鹓鯓饓|$h?wG|$@w-w|$h'v~tj$WMCA0&wN|$p5wG A7wK|$H}:w2ڒВƒ鼒A>fa"|$pƒ|$8EzpAH|$8q|$@wJ|$X5B wp|$8 w4$ZwA_ v - d^ NAID AE|$h7$v<錑|$0Lw6AGv&A w cYO$wN|$p5v=w+|$@w$"fF~J w; ϐ$Aw{A&餐隐鐐醐At9fT3Av#Av|$@[QG=A^ )A|$h $|$P;Q|$0Sw8|$@u'$v Ï鹏鯏|$@靏fU=Ag郏1A8D@q|$hbw#A?vZG=v!%1 D |$8ڎf]AYw71|$PD@鷎Af_`铎A:v8|$ tf]uzrhUKAw]|$8wE|$X.w |$8tA6jvA>AۍэǍ齍鳍驍5|$P |$p5Apf{ S @6,Atw<|$0ewL$w5w#=׌͌Ì|$8 ArA"鑌里A|$h$h$wY|$0PwA$@w*$t v* AA׋͋ËFv|$P顋闋鍋郋|$8|$h|$X9L|$8w/J2(|$@Ayw!wA:|$Xw3fYŊ黊|髊|$h)wov|$X 酊{Of VLB8.$ANaUA Ӊɉ$fwA]w鬉颉阉鎉鄉zpf\I|$hZw^A_vK  A ڈЈƈ鼈鲈騈|$8w#|$8 针鈈~|$X;A\RH|$@w3|$v,0f^&lЃ܇҇ȇ|$@$Ѓ鷇魇飇陇鏇酇{qg]SI?5$q$'AЃfEƆ鼆鲆\wE$w8铆|$pCwEt7w%|$hsvoe[QG=AS,AY|$XA*|$hwU|$0Zw31D|$@v0ʅ-v,饅Apw0錅邅xn|$@\AYvQ$ w:76|$X>`pw7 ք|$@v'鼄鲄騄鞄w%|$pv~|$p{qg|$XAw~|$0:wbAE;|$@w"v|$h*Av1^w)uw$g؃΃$ Ѓ鷃魃A陃$遃Appf|$X8wvAvc|$h_wJAPw16,A=|$p ߂Ղ˂|$8 鹂鯂t{4{fM|$P!A-„tFAw=zA9|$0Nf^Azz|$p5w!|$@w|$hNzzAevevV|$@ v*rzAXwA?[zQzAv&w6z,z"zzAv/|$@w$vyyyyAXwEaw3yAVw?|$@w.5 yyA.}ysyAG,GyfO~YwG&yv"|$Pyxxxxx|6|$8w/x|$@x9xxv[fJ~K|$X4v:$XwAL\xRx|$p2@x6x,x"xxx|$p3w\|$X;w9|$AuwwwwAAw{wA2wfNuww]nwdwZwPww$|$p-w7w1|$PD@$ww|$X5w|$@wv|$8Avs|$@ vE|$X6vwhAwDA0w4$ivgv]vSvIv|$00w3w$"Ѓ+v|$h6vvvuf`uwKAv8|$8t'tuuuuuv|$X*uu\mucuYuOuEu;u1u$w.gwЃ uut? w3|$p!v"v|$Pttttttt|$-v|$p0|trt1|$P\tRtw6|$H}/C$xW$Ar|$0.|$p# qfD|$0MAp A9 ,A.A_LfD|$0!fQAf8A5|$p,K$jAA:D|$8AAl.)|$8$fkAo$!fD|$0Z|$X0*|$p2AD]/|$8jH|$X+l|$hFl |$X4%AAt|$p$ (|$X'J|$hsJ|$hsmA\|$@ |$hKA|$0d)f?k8AHY|$0>|$8TAv|$h5|$0 Alf_-F|$DU|$h3XA$ |$0]A|$8 TfAv=f]|$hv'|$X7wA_j0`[]fAU fa|$X,fWp;|$Xe;|$pdww 3q|$8A0R|$0@"-f|$0c5f[ A &|$8;I|$p)0I|$0?8KA@|$h}U |$@|$hvZ,|$@@|$@ %|$X, |$0.#<|$0X|$ A4ff] |$p$ ,|$X\:2|$-i1$A9Vfa$|$@tIf/H-A9 |$hb0fbvB8DfD.|$88 +A2f[&fCn4|$X1HZ|$#AkAcD |$pwA~tfAcAIf\8A [Mp|$8G|$8A |$X5+u D@ArPI ABw.|$p3Zv$p"H|$0IF|$0zE|$X%)fD|$P!AM $1A@|$8u|$0;|$8> @A@$_! .f^VA9G|$0PrAj|$X._A[ AC)|$0;$f[|$X5%1|$82|$3|$X"AAfD|$0km A)|$X+,AgL|$^AJ $f|$0I1 A#DA  |$hS0f\-A[fB.A*;AvAzf]d QfD|$H vAV)@|$H- |$X|$8)AdY|$h`a $||$pD6K|$8}x3@Ѓ_@|$0qv |$8 |$h]>0D$1d|$8s@f^V |$A4AbWA@v lARu|$X1o1|$p4QX|$@u|$hQ$ v|$p.LB*1I@|$p AV |$@y |$p-|$p$H|$h\7vXArnfQNvA(E |$P<A94B 2A ${ Wk|$X5|$h}EA kAHA |$0hhA q?~Uf.A |$0IfX0|$0(Bf;n|$p.|$X@A9 |$0HCA:  >A[fZfZA|$8f.$Aum|$8 /AF|$X6A'1f_D@f.|$X? |$X6fmALa|$8f.AB A |$p%A*jA2[$a|$hzEA|$X,3|$8" V:|$6WA?>|$pA/|$X)U! fDA=f`#|$@rA*wA^]SA3|$0`|$p.G5|$8 0RAp=AH |$0R5A75G|$0.|b|$@D}A_`%AQEA?A;*~|$8 |$hZAJ|$pAw)A_:|$pX|$@wARf|$8GH4AB|$X$|$@f|"|$hvw fcv c ZG|$07|$h%!|$hK:AlAH|$0%}|$h|$8)@|$X&$z|$p:AF\|$p % A$}[1GfZ"S.|$8C|$hWjA |$8|$hV $ |$h-C(|$0FD|$@p$k |$0|vndf|$8% fS7*A;Av@|$X.|$p#7D$E1V|$P6 |$@5|$8 1A mfXA2OAwA:"S$L|$hrz]A| f|$X1EA/+1|$hM1D$cHA%qAf.|$h~AQp|$0}!|$p _LA =AD "A2|$@$|$8 |$p:0f>|$P<EY9YAx|$8xsAJ|$h;380'8@A-.|$h"HA"f]U<|$@\fDf`) ?+|$8 EA4g|$@fD|$8 A{ Am<|$@jAQ AQAA4A0T|$8tA<|$pw |$p3Q @9.AEtP |$h|% |$X%AA !* NwA7ЃdfcA AE5 0E fvAP|$@j |$0K0$xn0w${f[p!A;<|$p-|$@kAE\|$ V/4D$JT$Qxfc|$8A?!f_r|$p"]|$hRsSpDf_<( fI An&Ar=|$h4jY$NJf@ڿfr\66f2~A*-#A f\U|$hR%)|$0e|$0|$86)cpD|$XD|$0F A4yh$ PAeA27&DAT|$hxF|$p L,A[K|$XAPy? - \AG1mvT$@TJ|$0L|$p/1A|$X%K-|$X{ |$hO,$$ EMfYs|$@ Dkh1A TC%*vA ANO/,ƒ|$ptA?A8AAc|$Xf9HA#fT|$p1˲|$8w AMC|$h|+f`,2A$V{ Tv|$p|$XBTvA\gTAN AX5f[b|$X=!At|$8Fyv$ |$@A6|$p1`|$hfLA9D$f]/|$@WA` -|$p,i$AO 2 h|$h~.|$X1CVAl&@AA}9|$h$`fa|$p,|$Pq$NfDzA2h|$p(0|$HA0|$0NjA:):|$  'f`*5LAt|$h}AvfDAWA#>A|AXq|$8&Mq_|$0mA.,|$ kdfYA|$HN _|$8I|$p8JA|$X.!L |$@Ѓ/|$X46|$@ |$hU(A8A UAo|$0N|$p"|$PAA$|$X>k*$Kzq|$hvh D|$h1|$8!E14AX$7 T|$0I 8f^fP  #|$@t1:Q|$X>˵|$0XJ|$@ D|$8 !|$p#%4|$X48[# |$X8AAϋe|$0e9lA G "|$h7|$0"|$p+(E|$@eA|$pfXuQ$Ѓ|$hUAK8|$p<MgxALf[)A(|$ (D|$LS|$0e[8Zcf.A:Av${|$%u"|$PYqH14Am"ArA&1|$0j|$@ |$p"|$X3w|$@A|$V" wgf8|$@0QA-AA,^ fDA( Al|$hG-|$@AwAP|$@T|$0Q)|$8RA xf]Q ~|$PfL 8DA#|$XJ |$P?|$@?|$h|$@s8|$0US|$8 {AN{|$@i|$8feM0|$@B$'AA|$0;AR'$CrmA9fbLA|$0A=?AQ?A?I$vA-#|$6|$85|$X(7Mf` |$p@|$X(|$h)|$8LG(}A D|$h<$ 5AY ЃXA F|$p Ad.A|$X+m/$$l6Cg|$0v^d|$0k|$8`:<A FAAFL%|$X/Yj$ eAMش$2 A:|$X$!|$@[|$8[fT|$@|$hcfQ &|$p.dq "[i;AxAc"AwA/%f.f_6K A^A AW$RTx5od|$p"TfE)A9|$0NA?6 [f^vh|$X*,|$X1f.AX|$X;|$/J$-=ż z\$8tCaWD|$04|$8fA(|$pvA1|$@|WA9&<AYf^1W  |$X:m|$8)=RfwAO8.|$0PE|$0;:mA A\*qAWƒ|$Ht A~DA$|$P#YfD $l ~Am \A H15A~ AqЃR|$8'|$uSc*i|$@HfD|$XB)fFN|$X;bA!׊NlA7>+Aƒ|$@tA"<2Ay+AW|$8$V|$@a,Ay|$@ fOH|$X?G$IE=EAD<,|$0'MaA M|$h=+$EdϖA|Ѓ@A\R+ :9|$h cfW  |$p.Q&|$X0}9AHDr$l GqfD|$p$td|$X=S1A?xAx"|$0g.NAyf9A fw |$h>fZ/Am]|$8Y|$@4$P$XIf`ڀ|$83| |$@ Aex Ax |$@f`>6|$0P|$hNn/ }QAc|$hvcAb|$h|b%|$X4Aoz W|$X>/T|$hT~|$h>|$8OA|$8#W/Ave3Ĭf](\|$-jAb,|$@Aj<|$h \]A3c5  A.|$X,S|$@$vAqg TJ17A8|$X7<|$XtfdeA A'Ѓ1A fH D>|$8<̿v|$p6zAh1|$PR|$p4)A )/|$8wA-|$p?$LLB"|$p)6Am|$X ef>x;x|$}"$E h3  eA'7|$h,.|$@!|$@5|$p!FAwdHKmf|$8$ .3|$8bB |$8vD\$HE)A3.|$8UAFf`0|$p+0$ AwA|$0j$9XFdЃ|$0$BAufWwjaXQfD|$||$@ Ѓ |$p3#A/ $eAQ3|$@mAA|$p/'4|$XD^|$hC>F}|$@vB`A~ NS;AIk"9J$"J |$XH|$p Rt|$PkA./"齾fA|$p,K4|$X/`|$<鉾4AQo o|$0U?|$X$ZA9|$8c"tAЃ|$X:k!|$8F|$0Lw1A&D@ٽ|$XDǽs vA|馽|$0!A!A/ of?+ADx^AXG;smEAMkA:hRA:A$AмZA鰼頼鍼AG !A^ o|$#|$@a(;`PA=LA52 4 |$X7A>4-Aֻ|$@vA rlf_w 餻|$X&2A 鈻|$X!vAvUbX|$hc- fbO0|$0APfBPafQm|$hLfYKfM|$@A魺f|$X) E#JABA;6!uEy 7@|$p)|$X?-A^|$p&^|$hA޸A ߹@1AǹAW$5 qA|$hwNf|W|$0:nBA SAXI;A_&A~Ѓ|$0AWA^w |$@ݸ|$@A!^HmA8$}鈸D|$X!eA?T|$pvA;1$nLATL|$0>_!|$XEڷ|$0\AD$[V;阷D$|$8tAlbXAFv|$X%.$ A!AdG&l|$08(AD|$9驶韶錶y|$@i^v|$PQQG 4AFLk|$X#GAv|$fXrAƵ鼵fbN韵c l鉵A\wdWENEEAw(sgA AOִ ô 骴1`间s|$0A#|$X(7IA@Ql @6,r |$X. |$h^J|$0l$w̭AXyƒu A'(鹳fD 飳|$@>AD > =xA AZL|$@ :fZo"|$@GAA!1|$8 D޲A "|$@S|$pLHrA雲( Axe1|$@S|$h fKBA_nAe#fRP|$@< R|$X6|$X?{ v|$8Aʱ|$@u陱|$@y%AweznAi%|$8  R|$p6RK8A*|$hh(AUAwbA|$p %|$@N|$8~Að|$h1@'fVe$c|$8 Ѓ錰A?{x 'A W|$8#AQAG|$P|$Pf_NAIl(|$p!LR'oC0A H{fW)?|$9?|$87?|$|$P Ѓ$u A c$?&|$h:a Ѓ5N A |$X/AAQٮƮ|$8+%|$hR|$@|v|A(=|$8} jd48|$h[)8@|$X34OA+!A.|$0F$[ r|$p. Ёf u |$hrí|$X8AW駭|$83S|$p7w}As$|$X?a|$8&v|$@ND$7|$ac|$X>|$HN$"6$q!ͬAw|$@ 魬|$@4 h|$p#ؕ遬A P[|$8IE|$HE;A3%A0bV$'|$0/ ?A)1fbD@|$h[O!-yf_KA鷫#A|-I|$pAЃ鉫|$@vtjA 66M1fP8Ae1|$00,[ A? 7AC7Ac(8ҙA5lAl|$]l骪|$@阪|$0_.zAy)d|$8NgA5ɇ3A8A5=P1P_AWgC6|$8FAE龩|$82|$@ZU阩fb,|$X.1\|$@e|$h%WSW;AE|$h&MAa|$8.A1QA1Af\$RK|$@fP陨A 酨A!"%AegA~w MC$|$h2|$@%V|$Xz$'A tQAp A^t鷧E'阧|$0=  z|$X9m4 a4|$8A DA7AZM$5$ \|$@4fXddܦk ɦAU鵦f[ $|$@ ߕ \ l|$@W <AM<|$PhSs 0|$ CY|$h~5AXA,z|$@o|$0!|$X7vaA|$p8$AvwA|$8A!Aj 郥f[+^AeY1|$X8GfM-A 2`$D W|$@ vA#|$X;ݤ|$p"|$v鰤(|$PvP1fR釤AkX( uM|$@ ƒ|$X?t|$QD:f^M|$X:H$+HfaCAwu 7鸣V$Am|$0W<銣|$P;|$@v g]9A= `AD:L'|$h$ aUgArЃf_ZAe0A̢|$8$A{ TA|A院s醢|$hK'|$p,f1D@_$W '$Z|$@&|$X2fYN?fXiƒ|$8 5#)#ȡfTN鲡|$8x|$ IA|$850c|$hc3I|$PLN2|$h=$|$X)HL$+|$pA|$XIOO>ȠAE{|$0=L|$p&Ќ|$H|$hF0s|$pMARKfC4)$_' A:$ |$0`cT$0!8|$p,-鷟<0|$h!V|$X6Vf9fAOABjSNL|$8t?AGA2f<72#A=%QG$2 G>4|$@)4A4鸞|$@ j U$/]|$X6fT A\|ArY|$h kE$j/|$X<.|$h%}LЃ|$0wAMm|$p-O, ̝ANv|$p 鬝K s|$@鎝EmQA]t "|$84H1|$8C$.a|$heD|$pAĠ|$0&A|$@ٜƜ鶜WA陜|$X>釜|$p+AEMEoAU|$8CA/$ #C|$p3?  ۛ/˛黛ABʕfbzwAw$x%l%^GfA"|$@%.Ѓ& |$p $ /|$X*/齚'|$p;|$X$CcA銚D$8(sA%APU|$@ ).|$X7v5+AM$ #n|$h| '|$HEAk|$pǙAA$I駙静A+|$0n=|$h+Fhu:hgv|$8OEA3'Q$ v%#|$ #|$0[Rl ƒ|$p4 齘%A O闘-x= I@AL?@X|$@#(A[A vA[+!AHg-|$P\-'v |$83ܗ|$@ 'A'齗|$XO '|$Pm0a0鑗AUz!tA=O!WM|$@uAx &  & t Ѓ|$X|$8'|$X$ˋ鷖|$hxu|$H閖$&AAVAЃ`"|$80g3|$XI*|$p1&&|$hTEA ԕA#|$2N{p|$8AF|$hi}"oB|$h^G H$|$8-|   GU|$0#7 AlŔ|$@7|$X7|$8ߗ鑔|$h $ A XD$8A7-|$H};  $ &|$Lg|$H̓AEw |$hl鱓s&A闓鍓1A|A+ J%A2^ K%A_[Z|$p#Ac|$8|$@fZ(|$ptϒ|$8 v A鱒|$8  I鐒|$hu((rw_|$h-+|$p=+?f\(USfY~)fV")|$RAe|$X5GЃϑ|$@ >$Q >頑fU%|$@uA w|$Xe[A'|$(~A2 |$PN-|$@NA+N|$HNԐ Aq*fRg* 隐fa%faNz|$ph|$@VL9Aa'#fY7]|$%E\$\|AnXA 0wAR鸏$2 X G$ƒ|$8"A] J 31|$Pm(+.A\ []]|$|$@(2$3"]|$]A|鶎Ѓ餎<鑎|$0f/|$g|$h0g=  $" F|$05Y.|$ ~YA( |$P |$pfb $ |$X 0 A#  |$X($D 鈍AnUAWZUd|$p8.AW|$pw|$X*0|$8fQ+|$@ TAU6]|$PT鿌$J,u[fbn $*C A~g2$7SU:A)A|$@, Ѓ$ ͋|$0>..Av|$h^韋fJ&邋A[N]|$P6]AvA[RH aA +AsЃ|$h*n*AYAhيƊ|$0a@| # vA?鉊IQjЃX|$0X()9Y|$p3S$|$h($Ƨ$^A$ɉ+=fTƅAA阉0fa/x|$XZAM_tW|$hiW/fM'f&X|$0;>Qf[{ ЈA}{|$2{ 饈|$h9+fdA?^|$07A|$XAjA6Y9%|$%6b `|$8 |$p3S|$p04>U|$h1)|$8_AVχ$f_0\ Ss鞇|$Pc- [|$X4kQ|$@mfKJ|$0K!|$8C|$0a/$sAZ|$h~}96eAvfbņ黆AK镆A^Y .gA3g$A|$X;@|$ D|$pYEA%  RqAEqۅ{˅|$p1Q9$@9A |$X+A wAcD$8&=MA-A/|$03|$h{|$8{fY~|$p1Ax3${|$X:龄|$pH|$hM|$8銄DN.|$0fs|$p!As|$@ VL|$h7[>t" = `y`AEu|$8vAă麃|$X-A9 霃|$8,:|$Pf0$gAXV|$hQ;fa`|$X4`|$p_Ay:`1EӇAɇ|$@Ђ$}AW+ 韂A~6|$p$q$nnANnA1v$MC|$0N.f\:e|$0G~Aw|$@6с|$X 鿁鵁|$@/ 8|$h~AvyoA6aD|$hDAyD-A 7|$@Ad.|$p0vAQA9 TE 鲀|$87|$PFW`v|$8z$ЃfA)R|$8)EuA0&$H6A _mAf])|$P<|$HWB|$p3 A^|$hwj{ |$p4Df^´AI\3,6|$86|$@~ ~*Ax^weA6ƒ|$0ltY ~~ Ws Ax~|$@f~|$X%dAd" ;~MD~|$85f`eA)e|}|$@}|$p4|$|}[$9Z!o|$P+os}AP,M|$h_v~|$*|$8|$h[okv}}ZA|AD,A$q$x q|$0R=Aسfct||=$<fW<D|fWg%|$p\%%|D/%~}f]A־${A_#( O_Ah-_A3|$X>{|$0l{A&f2 ~rb{AjCf[U?Af?Ap0{|$*/|$p1Zi|$0&yif8AlAz(AutzA~~"AlvR[Egz|$PaNkz|$p4a|$@8|$XGr8|$8==|$0FD$p&ЃzY"A<=uA>)uAXt|$X%vAyym yA"*i|$p5iy!|$p#t|$PeÃA8y" %yAA`k5x )|$Hx|$8AxAj r |$0UnA d Xx|$@|$PE6|$p#gx|$@FxAX 3AL|T|$h$A A x|$$Ax|$~\fV\ACw|$p+bAKu7A97A2|$8A|$@fwSw|$@ Aw(] %w{*A"sv|$X'd( vx vA.Av|$p=}$A]$|$Hnf"ZnvA|$HE9AH;94v !vv v((uu u u|$@<|$08]u<Ak<Ѓuyu|$8)guCb Nu1fF=u|$p#$PArAf9QAtt t|$01N|$@ttfZtxt|$p Zt|$@@jc4c*c|$X;7A7A AHbA:-|$ha2-Au|$h0fPAEb|$p+-|$@ Z|$P}Abwb$i<|$@TbA=|$@ 0Ab|$p|$F b$waa|$@;NaafTi-|$p"3-Aa|$X*{5 a}a|$0L(A3(ApAGaAO.{|$XL%afO9|$@9$HAЃ````|$XP7$1|$XE`v A`z`|$03|$X) Q`|$8k*3`|$8`|$p44A__#___|$8vA__|$X+A$^~AQ~j_|$p2vAcT_J_@_|$p8(A(X_ __^A ^^^^^|$X'v|$P^^|$@ 5A5 r^AL5|$X4F$\ 3^9|$X ^|$X5a]A0.Ad.!x|$8wAAЃ]|$%6]|$X-3|$H|$hl|$@a]|$@T${F]|$0p* (]fOA ]DAxЃ\\|$8\\\Aw.dy |Ar\Aw\f`~/r/W\A/|$X14A1\71fb 1AO \Ao($wzf6yz|$@ [[|$8+[l[|$h.A-A0{[ApЃh[^[vAG[=[Ѓ.[$[|$X5-A7-|$Pv|$p%u|$01Z$)3AZA \AdA}Zf`=A4 ZA nZ|$8|$8Ҁ|$8u |$p:Z0Z|$H||$p,ZZ|$X%//ЃYYYY|$H82/2Yf][.YYvY|$@$LXY|$@FAlF|$2Ѓ#Y|$p#Gd|$h{2c|$hjcXXA@@X|$X9N MA8MXf@-7n|$0@iX_X|$X;*96M|$X46XK#XX vf\XWAF|$@iiiDW|$p.D|$X>WAxWnWn[W HW vA .W$WWWWV|$0P8|$84VV|$8"{VfJPP PsVfI=|$@WVAW? :V0V|$hTD}wA VVfKaA|$@vAjUU|$XU@EӚ|$01TivAUUwUmU?|$@ Q4Q|$X;?QA QAE|$X;JE|$h, |$p1|$8 ҰP)S|$p1]PAT/A/E$NPAЃ;P1PA` PAt P1AO R<AE2<j O|$@oQAbQOO. &M|$hM uOkOAH@ ЃOOEO;O|$pF0|$(a|$h vNNfVN|$p"AϐANAVvNN$b3 x|$H|$@|$p)AB8N$GAyN NA'55ML8|$0aA8|$@ vA7 MMAJv|$@MMA,,pMA\MRM$ ).M$MM$22$2LL|$@$N|$hB{Nf_LLAv|$X5yLoLeL[LA=H|$X (H|$hiWAv|$X$"LLL<K06|$XFbbK|$p%|$8KK |$@ K|$hi-B|$@fbi$cv?K5K|$p(0|$h.o0A>$ JJ|$X9(''JJA`v |$XJJAJAi=ڳ|$8ϳnJ v|$@VJLJ) :2RS|$hkSJAaJA/7fP6vAII$- (s (III|$X)|$kyU|$8 JOIEI|$X3I|$p@!I|$P}y IH 49A^H|$8 vAHHH|$X4|2w|$8HH F|$0`Č|$@SHIH?H|$p;/$HA[7|$87AVA qA vA 6AR"|$h AGG|$0O%%IG]A?_fDf]AΘA!A8GA-CEA#GAFƒ|$h} ,,!FF|$ $#F|$@<&$|$P  KFA2E.F|$hs6/A.AN3EEAH|$hgjAEE|$p$$|$8$$^ #A|$pkEaE|$FAp3Ef;!|$h^ EE|$X2-5AA 5A4DA9DDA D|$0^z5$s K5|$-Ųz_D|$XyMD|$X /D|$)|$@D|$p61|$X3|$8 uЃCC|$@CA_ACAbw/|$0W@$w|$pqCgCAGC=C3Cp$bCCB|$pDrrArBA<zAz$]zA[ZzA2v|$p2BxB$ `BVBLBBB|$p-,z|$8y|$$yyBB t|$X=AA|$P'~AAAA${u|$hOQuEt|$8wAkt XANA|$@s|$psA8s2AAQw8|srAw|$@@@|$@@dy?@@$(u$_v|$8q@g@$VyuA_E@;@Aww|$hdw|$@ @Bo|$p%oAoo??:??|$@?|?1fGt?j?`?|$8w*AFoA_v|$@9?/?poA 0o|$ƒ|$8ufP>>|$hlw+A>Aw#|$H}>Ѓ>>>>|$@nfYnh>A=vQ>G>A=c_Aq_$O_k>==wW t$tA@s*s|$pv|$8==|$X(w{=q=Ѓ_=1DN=|$p6lAzƒ|$hml! l= =[Avf]:9AA99fcn1|$P99ApABp99A;p|$p#}pqp\9|$@]|$X-]|$@49*9 99 9988|$p6Y|$@uY8A{Z|$p:Z|$hZZA|8r8|$0JWA}W}M8w?ARANA0888|$h3KU|$8 @U777Ay7|$8Qe$6efvAJ77}7$e7[7G vAD7:707&777wdABcdG6Awb|$8bASSc|$0B,c|$@b|$h461A D@6o~6|$X8S1_6$$;6]AK\A6|$865A5|$X4|$0]^|$@5f`Xc|$hpCc|$pZaA6FaP:ahj5w[AG.|$hSRA=f^`|$X7` Adz5|$p)Q|$8Q|$pP|$8PD444$ 44|$;A!ײX4A^ |$X(XXAgvX4|$@4AaDR|$h~R3ASRARRfZR3A%wd3AywX|$h*%|$82R|$@ЃX3|$8R1|$H73b'3|$@Ѓ3|$h2 AIy[A'Ѓ222|$X:ƒuA8 22222 |$8w2|$@ .1f#DZ2P2wX 72-2#2Ab|$X9}UIf=?1|$@8Y]11 11|$8|$p+g±A<v1|$0@BM|$8%MfYM|$hLAL71-1ð|$8|$@10|$8TABS0|$pZAWXZ|$83ZAZ|$8}Av|$X-00A|$0}vA[0Q0f\iASwMAh5J|$0< JfT J$IAKI|$ //[4|$0T$: /////|$61J|$@b/$v:|$X|$@_X|$XBw|$@ (//ABg/|$0HwW$'|WACWAW WAw|$p..A TfbSTA+TAQT|$X. T`.V. v|$p>.4.*. .A<Adu-fWVAu|$8 ----IABI-|$P "|$H}y-o- f:H|$X7HE-|$0=HfXmH-fJ2FAT|$@,,|$p2Q|$0<Q*Q|$03QfCFA,,A2BF$w 'F|$hx0FAEf^E|$@A,7,-,AU,dQ[Q,AM++9lO|$hIaO+E|$p/ SA"S++p+f+?S+I+?+|$p!w[A3NAN|$@+|$8NN*A*|$X+*fa*A>M|$8vf_**|$X*(OAOp*|$h7OD$@PP*|$ptO4hO/**|$PLAv))A7NANA)AJЃ)$Pf\uPiP)})s)`)V)*Of^O9)S@PA)E/AA|$8xvf[(($((A8d((|$ u|$8a($$/(A,|$h|$H|$P|$X+}'A '''|$X2(AЃ' 'u'gb'|$8"vAC'9'$fZAbAnzbT&Ah&&f`4 &|$hʜ|$p'&Ej|$p9U|$P[&|$p3w ASG&=&V*& && &AO|$X2(fN}rQgr%|$pͥ|$X.¥%|$@Ѓ%Aۛt%j%Arwd$|A f[AWAi%Ay|$h2n%AAGͮ|$@ $|$0G|$pQ|$8$|$p!qAq|$@}qdqq|$8G$g[($AwMAHp|$ =p#|$0Zyf\|$p8##|$X-##Afw!|$hv|$P)##1D{#q#|$@ _#L#B#Aw#AJv|$0X ##AЃ#""A^oAGoA3o/o$rr"""}"s"A,_"AgOs-?"5"+"vA3" "As9!ar|$pLr@r|*r|$8rAr!!!|$8A1.t1|$PZ!AxЃG!=!|$04r|$PrA?qNvA9 !       |$8j$ej Ar|$X/gkAkj?n|$@E ; 9Adw0# w(|$hmHfJjAjfbo|$hPnAnnfb`o|$8Bo|$X$m.wMfXNOA Qm$*|$0Zf^N|$8 Agf1gfMfq|$@Hh|$XA"hA+A7xh^|$@'L|$8&;A{pAAZЃ |$p+Ѓ|$X!yAAvuwDA o|$HFf,)fAev|$X$u|$8co|$8Goƒ|$p1\oPo |$@vKw6|$X7x|$X0xulu|$(wAv$rvADvRAhw2fTvA].$|$X/tfX|uA+tA>At|$p2t |$A>vAK9$A:$4 |$h|AqA.zq|$X$/q|$ppA|$p)wN$]jq rqAhq1|$PD|$@ A\v$D }si_UKA7|$8#t|$@Ѓ|$89AYk$kfbƒhkA^kA A+q qktABw7|$8p|$Pp_vAA7f]lfP(lA! j|$8A!f\Z"$o?"v!o|$H"" !|$@IA8.$A|$8lfalAN vA$ɊEo|$h$|$078|$X-ufc+|$X__ND1ARV|$@UA9U[UB"A0AlA]-l;T_AWJ_|$hwFF-fM--|$8 -{|$@i|$X8B&|$B&|$h0&AE,$Z+fTy|$0e*-|$8-AAtfU Iu|$@ |$6'|$0Y'f[ZZ(RfWuAA7-|$8 )Ae)|$h,I)|$P4)|$X2)AG(r|$hq(A(|$X }(Afp(fX<$VNY8Y|$8-Y^TA A<2({  ADXoAvA AЃ|A(S%=%|$p-fE%%9/fXƒtAA ||$@x|A*K| _OAROA |$0P4|$p06A2AB8|$X.&|$@ Of_N|$8 |$p:tXD$X |$@A9|$0,r}sЃa  |$8& :'|$@ N|$PNI |$@ uv5|AvA _||$0W4||$}1|$8:A ]A ~|$0a|$p:|$h$3 Ѓfa~~Asw)$>wAOE2|$8 }fK|$8W;} |$p3~fR~|$P%~$(ASzDg]|$hY||$h3| 4*Az:y|$@y|$8 y |$p-w|$@w|$8w  fRoAoo { |$@]||$p49|AQ G = |$h vl A         |$ƒ$Ah|$@.6hv |$8smuni? v|$p5; 1 fbqfapAep|$P/p|$8 |$hR|$@ BkA3l|$@slk|$@k  6r#rfGr q|$p7qc |$p;{h1 vB 8  v'A]h+      kW|$p8sA txq|$q  A1v  { q fO~z] S |$p|$X |$8AiAi    ` +f|$H f A^ &|$8jApkFkjq|$@iq|$X<opVp$oF Ar5 |$XCwM|$pTzAo@zA fV1A|$8&z|$@|$*{|$XEqv$mc$KAFdA -#|$hFhA|hAM|$0Me|e3:en(f|$@e1D@AOwG cY|$Py|$p3y|$8y.$#x|$p7b bj v|$8'N|$p5MM% Abx AW|$B T|$H?AD@fOMAx%AOjfd AI|$X|$0w/AjЃ|$@AL|$pHv bX|$p-:0" v|$8j |$8'AfcA|$@ Av$ |$81|$8P<2( |$@Y@|$X@|$|$h |$8CfTD|$p.AoD$8"OE;tvf`$  ?|$X2v|$8"<Au A9mc|$@ "|$h S<AЃ=AA |$X7=|$P=|$Pm=d=|$8|$8w|$ |$0@E|$8Ѓzpf$|$P;  +M;A w|$PA Aw(AGA|$8&@Av??$?=?GQG=|$p(_fVMBAf(~fAlw]|$@6B|$p+B|$p-4B$BAfOA|$0$GfXeG_UKw@|$@=f=|$0HQ=Aw A @AЃ|$pOA$z4AANAAZAq zp|$8<A=QGAf6,A(@@|$X@}Eue|$X+w|$0J$-z=@A@||$@i|$8wTJ@6|$P??|$8>?A?|$@ ?A16v|$p  |$XC @ @|$8@|$H?fZ7AR7KEM?A?,"fb|$p&X$wn|$p)98|$X-8A8|$8$8ASv|$PYOAk>U>#A[p8||$X;$)AcJfL>A = =A = Uf^4,4|$8V00E|$8 ALAt A!~5|$hPwA|$X9w+|$HN{h^TJ@-#~AvPAv=w51fJ|$X5w'AwDHAt|$8 w|$8wwfL`Av( t#fR.|$Pf\dAfO8|$XAnv8AYfWAundQ|$02D:0|$hevLw |$P NA^|$p5AU|$hWfW<A(|$8 AA$ 2|$XJwGAaANw\iwC$t/vKAL|$p0|$X=w{ЃA=f^0|$p8o|$HQAЃ2(fY]wNAiw>$v'AawA8w%|$pw~tj`EwoAYwV=A8wt1'|$P}AwfL;|$@|$0HwA|$Dw0|$hw)wDA]w4|$XHw-|$X6w0|$hf\AvHA&vA^0&j D A wu~_fS-A/Aw5c|$8w|$@ si_UAED:A@)Av^$ wGAwA1|$H|$hw8|$X2w'}wQwIf$ ND:1|$PD@' |$X7ƒuAufF+1|$Hf;/fWkEu)|$@ЃwWAWvQlATwUAwEAw<MCA/%Ѓ|$P}A3v/w'u$vA lbXN3;1|$P)fY~AvnU f^|$@At"w|$p$wvAwR|$P|Ao|$0CvCUKA7|$P;$v.|$w',vAAwA |$hv#A{|$h5i_AFw|$@I?|$8)fR~AFvA$EuA|$XJw]AwBAv/|$8Lv(AS|$89vl|$@w|$hUKA7-#AzM$Y5faN|$0R>fZW|$@v|$8vav|$8yoAaw_w?Av,AwrЃC9/%A,vKAw*qЃ fW:$v9w+|$8wfA$ f\u A\ZP|$p?w"|$@w1'|$@t!vA\A|$p*wXALw2|$8 w!AIw~t$v5T|$hw/vAЃ2(kA[A(A w|$@ЃA&wrAwH|$H}A|$p%w:|$@Jv:|$h5wmcVLB8AwG$v|$0D|$P|pw@~<A=v@|$ v/vCAtwmcYOE21|$0> |$ptJAvA|$pw&w|$@ t|$p|rhAw>Aw+|$hXw$E5+! A?|$8Hw|$P|$X%w%|$0@Ѓ|$8w,fa~&Av$rh^T wFA\ v=9AwV w,AQAT v|$h}|$Aw'A9zpf|$pv#Aw|$8 F<2(AMwJ|$w.|$p)v$I~tjv6R|$@ w&|$89/%|$@wLfS$ vA|$P/ w|$htvA[wm|$X+~ t|$hywG=3#$uI|$@wB|$@Ѓ 1AWD@wXЃoAEt$SI|$hzw|A>w5)v|$8|$hnwj|$@vY|$H|R$w;f_~5|$hav$wЃfaA~$|$@wI|$8v8ЃA|$p%wOw@A!=v|$0GfS~C|$X2|$hIh|$@CD$pcfWYAw;w3C9f^41fXAw,I|$w&|$XAAARAE`wbA#vR|$X:wKAw%x|$X7fSIAwkA&wH*|$X9v'A$ov.|$X?w+ewvAv|$X.yoe[Q|$p*A0|$hqS|$X)ƒ|$hfueww |$8w$|$ v|$@|$hATA |$X)wNA8w>fd8xw:f\I?5AAЃ|$X)v,|$8[z|$pDAqv^ND:0&|$*|$X6fX~qA%v|$8AEw?w-Aw{qfA|$XA|$@ws|$0RwS>$ v,A@w&N!w`|$88vYf~@|$p7v9$t%v|$h w@|$@v/1i|$@ w4A4NDD$@%Ѓ.|$0Q7$A|$h~2|$8|$0:|$P|$X7w5A'v"#v|$p,vlbXN|$p&v3A86,$ A_AvtA%wFfV6 w$Aw?wmcf`uAKAf]~A,"fL||$X9wk)AU|$0:w"|$H|&f[lAJbA5F$8b vELB|$8 Ѓ1'$ fA^}Aw]^T$C|$@!Ѕ„tA5v A@w?f]~9A|$@wAvyoe|$X6w#E;1' AwNwm|$@ AKA7-|$P8|$H}'A |$hQwSvDubXNDA|$07wrA?AwAA|$X>$|$@vU|$8w7A;wsiɸNU|$@D>4* |$X<v/|$8 A}$wjAwa]A@LA|$ tk|$8 w?$<ƒ|$@u|$@uA|$0;1D@|$8$-u$Dz|$pL|$hFNAv3:0&|$8vB*v3c Av|$X1 0A: xn[QG=3 vN|$hJAw|$8{q$tl|$0YwSA;Lf[|$p56,|$p&w>w,AUw& |$8A|$P}9$w&|$|ukX$v"|$p%v3)|$pA1ASDzЃ$v=dЃ{|$8ZwA`V$u|$X6RV'|$PV|$@ w,w$A-=dտ˿AVwi|$0!Ѓ|$h`„t@Aw7铿|$hu|$@Af\|$@A1'|$h |$8|$0T|$X=$Mоƾ鼾鲾騾鞾|$p/錾|$3zpf|$8^wAwf^J@A,|$@?|$@*1|$pܽҽȽ龽鴽骽頽閽錽邽xndAv7|$X6wD:AMЃ' ׼|$h@鹼鯼饼雼L鈼 uka1|$PKAv|$p2( AwX}S|ٻϻAAvAa魻飻陻|$8wMv;wA8|$POE;1'|$p/A-vJAw#aݺӺ|$0J@鵺髺顺AGw@Aw-afUuAdlbXAg|$h3Awcw@Aw0|$@ u)1fHw&Թ鱹駹|$8v |$8 vA逹vlAX:w9Aw&$u3$!|$wX$vN߸|$@v!vAc鷸魸|$@雸鑸釸fZX|$X-tGw5|$P}.aNA=3)AGwgA:vW A$w,|$0qƷ鼷驷|$8 A AX逷vlAa[AvC|$X*w(A7-#A|$%w6AIA@wc|$0.vRAw-u(ȶ$\wA;骶頶|$@鎶鄶Tq|$@ t4A"V|$hv=Aw6,$v AfZ~UAQߵw4|$Xŵv|$@飵陵鏵酵{t|$8 g]|$w/A]w|$pv;1'|$X(f\AfT|$8|$X3Aδ|$8wX|$w8w&w!A^v$醴||$p2w:Jw2c|$h!wU|$p1vD|$ w;1f`|$X9|$hgA`wE޳Գʳ鶳鬳颳阳鎳鄳zpff]NfJ/w?5+A v ۲|$0wJ$ v3鱲|$Hw|A5w'鑲釲}fQ~?Aw#|$X3vALUK8.A8$ vc$dwLɱ鿱|$8魱q隱鐱醱|A?|$PNX|$p"w%u |$hQ,Ai|$8|$@|$@ݰ|$X$w/ð|$0ww8$駰fbA~w7鄰D$8HA`HM :0&|$H~̯֯¯鸯f/I|$8*w8雯鑯釯}siA|$8|$@ |$p0wpA1n! AЃܮҮ8鼮鲮AЃ韮A[邮xndf]B$# tAv0&v|$Uh ڭЭƭ鼭|$p,w)AAwA7錭|$@vtj`VAwBA.$|$83p|$d[J wM|$8;wA;v.|$P=~ 门鍨部yoefO3fG~#A v|$8@6,|$p4|$@AZ vR ݧӧw0ATw鲧騧鞧$s醧||$^TA7Aw"|$@t A/wP`w8|$p.w!vA,æ鹦 驦 陦wS$>||$ w\$|$p f^u/|$h|w(Af^~[tLz#f^c|$8vR|$p!w9A1֥̥|$hE麥鰥ww"v|$@醥|$8 tjA2\|$uP$@A^w!Awt#A{|$Pr|$X=wT|$p@֤̤¤ wiA wc魤飤,v,|$@1錤|$@wrh^TJ@6A"|$@AUw|$@|$@A wN|$8w)$黣鱣駣AAK鉣 vz|$0awsA\wI$'v2ALv"|$@v I?5+H vA  ݢӢɢ鿢鵢|$p(v)鞢f_酢{Nh^$w/ƒ|$pu|$hw,"|$@Aw!|$X.v|$p-ߡ|$@vAɡ鿡$#|$PEt9R鑡|$0,wX|$h$w<|$@w+f^~|$@we[QGEuO2|$w(v$ Av٠ϠŠA%髠顠|$8 v6|$p7w造v|$@dZAtv"|$[w9/%|$8wEAw<|$hwIAw9A7w&vϟş黟鱟駟$w vzYv|$p,bXN|$8|$P$jvA.ޞԞʞ|$H~1鰞|$p!w3|$hOw钞鈞|$pv|$hcAu|$@C|$@1|$PD@%|$p%A|$p!AAZ̝֝lw|$p"v饝雝A |$pwru:v($v]SIAF |$@w|Atwi)AvC w4|$@u-ҜBwr|$X6wOA鯜饜雜鑜A9vAAtAmw. X1fXG=3)|$h>v5}dٛAwn|$h[v4|$@鮛|$ w/|$hswA錛邛xAM|$@Y`F|$@AA|$8$wUAw9|$hYv(AGw"v|$X%ؚΚĚp鱚|$pw09闚w8AkAkz|$P~fbdZFGAv5|$v.1|$@D$|$8wAP wLAw<"ޙԙAw<w-|$p&w&鵙髙|$@ 陙鏙Cuka ND:0|$A]9٘ϘŘAf鱘f`tFA@v6A^鑘|$p#vY|$X3w(Aoe[|$X6wA|$hnv0Av1' |$X6w"|$@v|$@ȗ龗Aw,A顗|$hdw|$@w鉗uAv_U|$P}.A=3_ $ w9|$wAFAVЖ0齖鳖驖韖A鎖|$XSw-w|$P}ndZPF|$X:wV|$82vEAR$|$8wd|$@wS|w7|$p8w0w$v͕Õ鹕鯕AA鎕~t|$8w<$u"AXvAOKA 1' A<wBAaݔӔɔ鿔鵔體 w!P vfX邔x,_A:RUAGt|$pM* vHw6fL0 |$X6wa|$0Cw6}' ړГƓ|$@v|$P~颓fYp|$0LwA w#A v|$@ wm wO|$@vHTA wY|$w51fR,1|$@  |$@w9 |$p6fCu4Aw+̒|$@w. v|$@髒顒闒鍒fZ_fW6|$w" v|$@_UK|$vA 2(|$p6wA  Aw/ԑʑM鷑魑 靑|$P)~1{q|$X4w%W|$@Exw4|$0Sv-,  w&|$@ېѐǐ$qvyAMvfP鞐锐銐y vA| pf|$p5w(AKA7A E A $Vڏw v鲏騏= 镏鋏AwAc|$0v9|$h;wAA7A#~A َώ|$h'wMw#鰎頎w$J{A|$@ YO|$X,w"w|$H0&|$84Av$Av  |$pv,Av#|$@vAG魈飈|$*$|$wb|$p:wCf fbuA@6$\$A9,w>|$8w7ׇAwa|$hwPA=w+|$@v骇頇閇|$X7wMAEvG|$8wm|$0CAw+|$@wAvB8.|$P|$@,|$/wJAw/v|$8ۄ|$@|$hwnEwM*w;1|$@D馄霄钄鈄~t|$P|@w8[|GAYv7$u#w7-#|$hރA4w/$ƒ|$h"t驃fK!|$P|$@ 邃AjwLfY/wXNDwB|$h -|$X=A9w9AEvP|$@ tI|:Aׂ|$8vQw8|$08w' 鱂駂靂铂Awu|$@ v$SXNw|$P|V$j v?A!wf9 A#w%AҁA6龁!wP馁|$8v锁銁送A?wA.f\|$JJ@6$+ v1ƒ|$puAKA-Ѐ|$@龀w|$pw饀雀鑀A|退vAbXND|$p#v,*  |$8 v,$~vF|$X:w@Aw-|$@v&|$0YwmcAO|$8w$|$@v$.$|$p wBAJwo~A)w4Ag~|$@$~LЃ~~|$8~}~A i~_~U~|$H|#A w|$hr5~+~!~~AOw~}|$p'O|$hF|$X8QA83f_A%A}w}m}c}|$hwSA.H}|$h|$@ +}$L} }_||$8v)|$hv"v|$P |||||Av|$H||Ak|$a|$@.AWAx.||$04wf\A,|||$X=Ѓ{AyfARfTf_A Ѓ{wTAw.Aw|$h0vp{f{\{$Sw]?{|$@ NA7|$h#|$h|$p-wC$nz|$8weEuV|$00vEA8v5jЃz|$X/vAlzzzzzf_<|$P"|$@wpazWzUDz4z|$X4w)aziw|$X:vzyyy|$8ve|Mw>yvfbyyyyzypyfy\yA Hy|$8A60#y|$05|$p wxA/wU|$hLw-AwxxxA$wxxvR|CAw:x|$@xf`G|$X.w-|$p"Ѓix_xЃMxAЃ:xAw\!x|$X#1|$@DxwA*v:|$8 v)$ww|$X3www|$h>w6w|$X1wU$v+|$@rw|$hDva|$@YwAtS|$X.vL9w|$vowgA8wP|$pw' wwvv|$8vvAvvvvvvAv wvmv|$8v(ARvHv>v4v*vAvЃ vA_APAuuu|$8wHAv5Aw%}u|$8uwumuQuGuAev\wT/uAv:fb!vAL uuttt|$hht|$@tttttArthtUtKtAt7t-t#tt|$@ t$qw_|$p0w+ɸNs|$p9v)Aw#sAvVsssf`A|$hw7|$p2w0cs|$X=wJ|$8w,|H=s3s)sfUAssvXAvOArTwB!rrvrrrrr|$8wR|$hw"|$X/wzZrPrA,'r|$h1ADAwl|$p%wSqA|$@AD|$8q|$XBqv|$0=q{q|$p)w4:aq|$@ wBf](A@qA,qAqqq pp|$h|$8;|$X<ppppppA pp]pAV6|$0>AwF0w>*p|$8|$hSwnw.|$@v}oooAcv(w |$X3vf]ooo|$hro6Ѓzo|$X$A|$8,QTA/Do|$h@AoAB$w^|$8w;|$heƒ|$ptAwnnnw7An5v7|$hlwAynon|$X3]nSn|$p!wJ9n|$X)wNZw<$[v/Ajwvwnmmm|$hjw5Aw[v mmmfbC|$hxƒ|$X.u%|$@w}msmim_m|$h}w^ACDBm8m.mABwf|$p!wOAw+Aqmll0wFAЃllwXevFl|$8 w"|$pu}lslil_lUlKlAl7lo'l$ilwS|$8wLkk|$X4wo|$hHwDfa,Awwkkk|$8 k|$8Avimk|$8w4At$,wNk|$X#|$p.|$h&7@Y6s.e|$XA$ Y 5|$@ vPfAbq$P xG1$ opcfgfAX |$ |$0YC|$p/ fAW>\MT$Ո |$p %)X =fAbq$<&e|$@f|$0[}|$X/y$h#|$p-w RHffA_ubr"!|$X6 6 'f.Z|$X1, |$p,|$09#$O|$@w|$8u|$0M}|$h|>1|$p1|$p v#fAYA  { |$p+jA|$X<P|$hgqv|$PG@IX|$h%$<|$PN|$@߅v|$p(-#D|$8|$0k'AvDfA`|$@ b|$X,V."|$h38|$0|$pgfA[$lE-`f.|$0!vY2M 1fA\P |$X.7|$pQV|$h@y&[]fAR |$0v߃8fA6.|$0W$s+|$0?=L$80Z%t0|$XT9A$g |$ n v @|$8@$v7 |$0 Mf$S|$0.!$pC|$p[ 9|$hA/fA?7|$hV|$@ fAD|$88rQ fE{an% lA4 K /Ao,Ef:$ fA^|$@f4|$0h|$p*$&t*s{DU'fA_fA\u,?5|$0@-"'vfA[f.m7|$X)!_F|$pF:|$X3|$0NZ@|$@ifA_+F!|$0G A+#|$p( <acvD!X$ ) |$8 |fD|$8Z$)@ -|$@ w Do( C^*`D<ЃDfAQA'fAT%CWAF4|$8&]&)yƒ|$@u|$Hv\D|$h &A#ƒ|$p u|$h}mcD|$0q |$p-|$X09|$h W|$0<݇f|$hd$T|$pE).Y|$8ۀ3|$8" <qA|$8fAs (U|$0l|$p,5|$0H"-|$h7\|$0-\E =|$P1b fA^ A S/6|$p5|$P @0 8|$X %3wWRHf|$p|$0YbAAp|$p!|$84|$8k||$S*MfA8|$@k:.i|$V9b$8f|$X>|$8|$hs|$pc=T$H1$)$ V|$X-..|$8T5 CoL|$h`|$8Ti}lfD|$  $sE$@"#ƒ|$h|ufDfA]/|$@|$X5.1@ @g<Dt5|$H%|$8+wN NDfD|$p] Y$g v Al JfAX2fAH9P|$X5k' |$s1`f.|$0B |$X'(2$=|$p^[ fD#|$h~1|$pwPu:|$p|$@~|$0El|$ 9D${=$Q!_fAcfA^|$p1(|$@V fD$ju51'>|$Xybf|$X7|$hXsT~/  A|$@ $v|$HRH|$H|$8  vfA`|$X5X|$0c,|$@8|$p8JvfA_|$X2Sg2$uF|$p2.^|$@ I,TR|$@ ,fKfANR 1 |$0;S)\H1LW]v5nkA $|$X3s=|$pt zA %$g m)1A |$8  |$83(fA_fX|$0m |v cY ,fA]N|$@o_$|$PtfAXohgh|$p9p|$P|@D$@]|$X> ! |$0zN$y|$Hy_fy T9|$X#61|$@  q2|$X(K|$8v|$h@DO/ F%%e|$@I7 r _|$h |$p. |$06JpCe#4g$fx61 |$0Y J w|$p|$8)|$@K|$p$|$8bl|$Wl`|$0fA_A!|$0,= g|$0|؛n}vfAW5|$0N2$- R :L%|$hyI$ cі|$hFaEJP?7P1$x |$0|$XB0h2QKA(|$X- ||$@|$hMfAI|$p-:$^kK|$0+6)-|$8A|$p& fAB41|$@|$p2fAP.fA]T|$8fAN,A$fv|$p_$t <t%-#D$n+|$@!AGLdrf|$X*D|$PifAa^fAb~ LffA_|$p+=]1|$PPf.t(]m7yU GD|$X?|$h"~|$|$@/fA]OAtfAa~ si|$hy|$X3-[9N|$8sKzsE gE|$P wD|$XA|$0]>)x/|$p+gK$-q|$ {Of|$p%(ƒ|$hx/t/|$X/|$hq/|$p:&$|$8O|$pu|$@ w|$h|fDh{oN ;!+o  |$pKa2L_|$pJ`/fAZU/fAKfA&GAM.M|$8~Ѓ@f.fAXO$|$0|$pL,KHN1m&:AP|$h'u|$p$*oAƒ|$Ps4|$@h4] C *|$h<)1u? $TC|$X-j|$@  1|$@D1 |$0kA EgxY an|$8|$8%ve/EVA |$p)?f % |$@|$hH.|$h[k|$X7fAhGZ|$pv1ЃfD2^qU ^4x[20pJ'|$0IQF 8|$0>!c|$hfz@|$p6!8 fAXY0|$PEuW|$p!wAww|$8i_;=}5|$0(T,Ճvf.|$hUy yW1|$p=>\|Pw|$ML>:L|$X(f.<L$[IyI] 8fALYI9|$8 [pb|$Gf|$0h6|$p&,1fA_$ "<&F9/|$04p$|$@9Q37 K|$h`Hy|$0/ޢҢ|$X#v f. |$hB8fAGO|$8){|$p8A|$85"l|$@ /f_|$82|$X*( 4NATl|$@Il|$83 D|$@>v|$ |$XOu1aO js<|$ChfA@wnE@( z %A(|$hbI|${fAV % $M[\\ffD|$0E6&AK M <|$B!?FfAZ4F |$hl|$ >fA`Duk|$hG$&pfA%e|$@e|$8QЃ@|$L |$8<$ V$ gʐg3D|$h3f8|$hQz||$P|$X-t $.r|$p93|$p)4[D |$8 |$@+vMCD|$8E2&|$@9 P/w KhD|$8g|$hAA(|$h_|$ht$G B8fG%1A|$8 |$P+|$P7|$hi|$X:i&|$@b1*?I|$@ e|$X" vqg v|$@(RH|$X.)Zv$$|$h$&R||$X)a$m0fD|$h|$P||$@oefABfAJt7|$0|$X0vZ |$hD372^ΎP|$@DJ v |$HU< P&|$p"Au$b G=|$X" |$h|'$v|$p |$X vK L|$p,RfAa:(?W}o`t|$X;9|$@v7-g $|$@ wHw}|$|$p6_|$8?Aw|$@&|$p |$h|$09?)aD7wA3A1lbXNA?,Qva fAL>v fAd|$0T- ${Nk73H'He[fA^{!AaF_|$@ ,1A,|$h |$8E1G+.V?|$@ $X8nj9Aa*|$8NC|$PC8f%4A$fA_M 2|$@;|$8ރ\fAa)hLI |$h$v|$P0Aƒ|$@ DD$TfA`>|$8cl2 FFDfAT|$p5?ALmA |$X3j$TP 3|$@ Y-#|$X4=|$p.mD< \%|$@ ,|$PyWE|$X%$ *$SfAUc|$@T\V/|$X0P pS6 DFf-=yPznm|$06x|$8BBfD&;|$8jX:Y|$03XfA[E,n:|$X_|$p./|$8 |$@ %|$p*ET>|$g|$X8C|$8 8D|$@[|$p%Avi_Q|$hXt6؍fA]^Gw |$X3n"|$4I|$p"׀|$8" |$X/+AEZZ _$Utp It\(%|$8<|$?n|$XB""@+|$PPE1|$h"%|$]?o1fA\n|$0`:|$ fAVOfA^#r|$p/ݪ\fDdH51|$P|$p-|$8>-A|$0~!\Mu*q|$hw|$@v|$8fD x W$|$hQ>$N tfAY`|$X::006|$8w%A6|$8%|$81fAZD@|$8$/|$0uu|$:{O~Sp|$p/ %$ |$hW9R1g1|$X%$Ct> W$tsi$)|$p7/q|$X|$p0|$@6|?$g $D$pP |$P+U|$0.^lR0+|$X($ weƒ|$ht [Fe(|$0\?fASo$ofAbߪ@*o,.RvA$" /E|$8Ѓ||$*R/|$ X|$0J&GFPFE|$@f.|$p3$^'>$!fAJo\^hf '$v|$Hoe$3O)l|$X!l"M |$P'X|$p(|$X6?fAY~o|$h")|$8|$ЃfD|$P}W ~t:$DX|$X2 :CfAdCrfAbC$6ܣ=fؿ|$h6w|$@鷿|$hA|$htA-UQ&\fDH|$@OKjCK'0nfA`OO|$HtO S>|$|$@ K ߞ髾$v0 3|$8Ck$z,A"UBf ;x6uIz|$@KfAcu5f|$@2ؽXʽ $|$@M頽E]邽70OAۅ2HfAQJJ0&$|$h|`%c vHֶ|$8vi 鴶?|$P)DC銶wm$sMC8C[} '|$8wS|$8u8K|$:*Kǵ|$p/#t鋵$ uTbA?|$[[&fAE |$Xn~|$86%@A+}|$8  }Ѓ鬴|$8H|$X?鏴酴{ h^-v|$X<:0) v!"rfAZI|$pw[鮳雳 E|$pIo>_f>fA`OCD4w |$8 D)|$X4AO߲"&2yh|$X hv露|$@ Wt~fA9(|$OR[ I* T||$@|$8 Q Qݱ&$R |$0@e bwZn$j"fAKU$HA $= =|$@6vH װ|$@p0$m}kAY|$8G(uЃ锰V[y >A\4b|$hT+|$X \|$pS)|$Xw1fAd4%v $]2)|$hHrr|r|$hw)fAa)鋯Co=|$hYI|$0EEuQ7-|$0zw9 v|$X) |$h.vJHAx|$@v|$8鵮2|$0`'c|$h~(|$ho)m|$@bY|$0 "Tv |$84Z$ZI&cfAZȩ 3E{3խO&|$X,~a U @銭|$X1$1Pi+``u0|$X5]e|$h|$8, o fAQ~ +&W̬ *_ v|$h阬|$hAI5}6V$uifAWMi I|$hq2|$pVa9L.$ W3fAYDw(ī麫|$8|$p>T|$@vHv35 YE$< 'A#|$hIL*|$8EfAP>fA\>|$i[3|$ 鰪EM" *7|$h~|$p x0xv|$XRH|$8s'w'Y@Aqe^{e$2#|$h;ȩ|$8);魩$)6e  e}|$L(|$X4ZE|$@ P=g!V ]1A |$84!|$h7&|$Z|$8&ͨNO|$01AfAJ+酨$ $|$h@fa$eeJv8|$hqDAHx0E{E|$PhfA`(|$@@Zh鲧$hL|$0d|$8A AfA[Z..<(w iU|$8.P|$p:$|$p0S=A 3ZZ/|$X6W^|$@麦fAeA|$ 1鑦=遦|$HOj|$@4|$p"4J|$8989iЃ!|$h"@|$8HץI|$8-鹥1 驥O^fAb&|$8|$hr}|$0IrfAbu|$@QG|$@:6|$0$5CM|$@rM|$hi |$h/cD_Aum 鬤|$@Q0:|$P%:逤|$@)|$8lWfA0'wH9/AI,fANL|c|$8 c|$0.4|$p34|$84ۣ|$8|$@G|$X<||$@ |霣$j鄣,|$8g|$PY|$@ |$8 E|$X?!,Tia$na+ [ )|$8 K1k k|$8gk|$h[%`Po|$@锢Ayf|$@%&!!HvfA%:0)|$7ST  w|$8ODh vfAZ鲡)~)|$8P  Ϟ$ }UXЃNfAM#!T$fAU# N|$8ZĎE4|РfAa#Hj fAZN鉠\p|$X%a|$XEw$;1O`;|$p+dR:1D? Dh|$@x@:&鴟|$p3>Aƒ|$@ygys$Z,$4 |$8< $ J$ v$ l,fA_,$2 ͞|$p>E|$h_Mw$Ѓ锞1fAV~|$0WqJ 8|$8|$hX6|$hR1v|$h? A0{0 ٝAYfA`*|$@&|$@駝A3&|$0NF|$p.֒fA\i|$@>Xe+,|$@RfA^fARA |$X5  |$08($u ܜ1|$PƜd"|$0JL|$hlb|$@*fA\|$8 |$0e06$B Of$|$X2 (|$p%!|$ [4A?e (|$@(ԛ$ |$0OM|$p2ԃ|$@鏛$&|$u6&V T$|$@ XY|$Pf&Hef|$@|$p! |$ƒ|$8u ߚ՚(š1|$h\D@鯚|$X6$Gs7fAYQsfA4Fs{GЃl \EtfAZG=$ Bf+SZ+P%|$hY0a7aievJ鱙|$0d韙錙 y k)_)W|$@;;6A v|$hefAB/%|$8y|$PA=%i٘p(齘鳘$)N钘$@ Ѓo\|$p59Aj4[u%o\ .|$hq.|$8k*' S0|$X-J8魗@k um0`|$@.|$@CfAZ%!|$h- Al*fAbO* " ʖ麖b%|$X2̉SL銖JJh$!Kv A7|$0$|$LAU|$X'|$@ 2ו|$0@D"D$hP|$X&cr7鐕 }ZM$Y> v|$0qA7|$80e A&Zd|$X-|$8nGb~|$@ ۔є^&|$@ 鶔|$p6uS 43u uA $kaWiq'oQn]GIM|$0A%|$uCufAUS|$00齓 )钓鈓|$hx,)jW|#EX?vA+!`)$H{ ^{|$@ܒҒ6]Wv%馒|$p锒|$h8$6Z 6DЃn|$@P'|$@.y oSKv|$@4*|$p-';IR|$8};|$h~ӑ5 Nv|$hv饑^ 钑|$p b&Au qxnw |$X;[Q|$P4!|$0542$ |$0F(raefAb e|$8ͳ|$h]³|$p u g 鯐|$8gnm|$@e_逐|$@4e[]|$h,h_|$hKOAD.fADkS|$p5W|$hWW |$8*wrߏ|$8/ ď|$0f#*|$X%W鞏fASM+/W|$p0Vi|$X1 cЃL|$X@5;`|$X9r\0*-$  o Že鯎|$p1 ]鈎|$0d2|$0rj_kOAa|$p"a0c-fAAjVfAWp53uY܍Y̍`鹍]4|$h^|$@鐍|$8Af2,1|$@K$t#2A`YCzЃ|$8F*|$p%vٌ8l齌|$-62he(he|$H;V|$p#KqfAA$F(w&wD]4fAS,|$h =]|$X8hg: 61 fW|$8Xkm|$@ $w!Ѓg„^ 鞋A2鄋>x|$X*a|$8X|$XyF$1fA`\|$08D|$04 ,;ފ /6bXv|$@駊1APf遊|$ o8\|$p1,Dix} 5|$X01fAI1|$P|$@Ѓ|$p&'$ v|$0{ωʼn=']Ѓ骉A陉-[_X|$0;|$8  <4|$0cX%|$@z\|$h$\|$@|$j|$X>߈^X'|$@2V鸈fAX$L$-鎈$Fp0|$Ho _$DD<fA_D '+*|$@|$2/|$8o|$Hׇ]ćS/騇(;|$pwx}|$h3[AMfAYH>y +|$83=*= |$8C |$8B>|$@l|$p+z |$8 o |$p$鴆|$X领/ +h醆Pv$nd6J|$8I|$h}[ZL|$pK|$hY|$ |$pvqy}ƒ|$8 u鳅|$X* |$8 cIEPIEt<w~g$MI$I|$X%q|$HfA v$ A0Nuwfڄq*; ;fg頄|$8uE=|$PuAp 0}1l|$@F v -#?^ |$0U9 v|$p.׃ Y$p'>B'鞃|$hkb9逃hm40fAbƒ|$Xt@6|$X"5t>/vfAhfAWfA ffAXg ʂ;鷂A7|$@u|$8錂f vvl@ 3{EA|$h1|$8sfAPI fAW0fA8*|$83݇-ɋЁ0 |$8馁\;8g銁|$8:A=l|$X9+|$at|$h5+|$ 7|$X&?fAN2̀}6魀|$X$M0|$p B0E3x{!o1\<CEw |$p;2(|$pzJ|$H|$h&ЃHJ$0|JfJ |$hI|$@fA_I|$0!|$0ďޏ>]D1|$XBo|$ho|$p1$@~fAb.|$8 `|$hTzU~|$X9}_|$P^|$0^ a~?,|$nF~|$R9 ]A `|$@~ ~A2S;|$h;|$@֔@Ζ|$8 }fAO-Ah$ t}a}|$P|$8$_a5|$8u|$p(}}|$0a }E&fAfk||$@5|$8+efA<e|$@,I 6 v |$h  Vz|A<6|$@6|$85ЃT|1|$8 zy !|fA\9{|$p"+|$X(Ajo|$@{fA^0 {xA|$hlA$gfA`Of{DG{|$8v2{({A{ 0D|$h@%Dz$p1 <$z|$f* z|$0G4|$8z$|$8 `Ap*CЃRzAaC~r)zfAWF# o  y]|$hKB|$0Bm$  v|$8yyy|$X?A$|$ehjh|$h|$p9B|$0RF|$p)1Gy|$X/R< >Ox|$0VY!|$0Ly|$8ly>yv>xxxt{xOfx Sx&R {(x$%2'$W eaAv ww|$@ (|$X1$q$$ $wvw}wjw# 0AuDw|$p+ w$5 #l wWvv|$X:`u` vv|$8vvfA2S|$@~v$ |$P6G" *G|$|$X-*v d0 _Qai|$h G|$0Iu|$X:=#Su_ uAu|$00A^~|$pau|$X6F1$ uq@^O'u|$X1lfAO~|$tt|$@t|$h} ';>|$8t$ ЃtG=~tttv^tTt1]`,t   tt|$8sss$WJЃss6B$:s|$hs|$Xns|$p n> PsFs|$8O4sis s$@|$roorr|$@r|$X-|$Xv~rtr|$@ br|$@RrO}6r|$p,Ef1|$HD@r@rq$W)dnEsnqq>qqqtuq]!d=\Vp|$@Bqo y|$@'q|$hWE1a1|$@ 2pbv}pp$pMpG'-|$p|$ !Ѓ|$X5„]pJp@p$i|$p>i|$8 p;poooooƒ|$h|t oo vyxono|$8 \o|$@8|$p}|$hZ{o?|$84onn1fA@nnX nnnnnnnbP|$hWP^n=_FnfA_J|$8]>@{fAZfmcH|$@mm|$;fAYy;ehO|$X8Ajm`m|$8$G|$XHG|$PAmq|$htqlG|$@Gl|$@*Z|$pYll|$0\l REvlll\lRl|$8ZAZ llmЃlk|$@Z W WkMFKkk|$p VzVVok!|$0*P|$X$qB%k|$8k|$Qkj|$hVb|$p&b?8djjjjAjsojej[jQj|$X'f|$pe|$0Be&j|$8*V|$X5V3 V|$X,*iu_|$XAj_iiCk iGN|$h uNЃdiZiGi=i`-i|$pm3!vfAevi|$p!v|$X*hh=,,5hh S, h,|$X7vzhphfh/2uX>h,s.}v|$p&hh.N|$@g|$@ggg|$8z,fAYI,|$8t|$hLw|$8gugK1\gX$=a,gg1fAWD@gffhfAX1X|$0PԠ|$8ģ|$8f|$X+Ѓf1zf|$h[(|$P(|$0Sv|$PƸMfCf9f|$XJ ЁuieZ..e E?fAV'|$p/ eefA]//|$Hr|$>trZFe$, ,fAS+"1|$Pe d^ dddm*d6jC d`)|$0_+|$@ƒ|$PGt ZdPdFd|$2n+$M+d|$8*dfALOccc|$p<t4fASfA[Ձ|$X;c|$X; 053fACߗv|$p'[cQc|$p!3|$X13 (c|$X0>v9|$hb~9|$p"b v bbB}bbbfA\ƒr/|$h%|/Tb$ #2|$0Ѓ2bN%bba|$X/BfA\2B|$h1ֲ a|$nB6OB1|$X#aH/Y ~aNka|$X=B|$0[|$X9 ٳг+aa|$^:/|$8+vA````|$@C6X6$ nv|$8 ``|`|$h~<A0a<|$P$Zxl:Ѓ*`fA`5|$p,k5fAW-|$8џn_fA^=|$@ v=|$P_0fADr0v{_q_|$h#9|$8 ЃU_|$X*0:_0_|$h;1At|$@_^|$@^|$0G=60|$@^ 2 ^1^^|$8 ;8fU^B^A&1|$0Y0= `+ ^AE=hsg]|$@d|$X9]]fA94ymV]]9q]g]|$@U]$ .Ak.|$86 ]]M3|$p"|$p33IґƑ\|$p(3p\\\o(c(e\[\$E2A &2|$p7:2 %\\ ';y ;[[V 4*VЃ[[|$@d5fAVK5[Cv[|$X683|$hT2fA`|$@ЃD[|$@k9,&[|$hn[.62|$PwwZ)vZZM4TZZL %6 |Z|$hWOaT^Z|$0&ƒ|$h:e7Y70ZZ24Y|$p5fAXO5oY|$X5|$@Y@ZYY|$P$|$XJ$|$PՙwcZYPY|$801|$p.$'tYXX|$p:85|$@/X@|$0S@|$X>?|$b|$X4X|$8$Mu$|$@eXЃSXIX?X5XfA^(?X X vrWW$Y W[fATOWWWWW|$p4m?fW,= =DW|$0=HZ?|$@ #W|$Ph<v0VVf ]VVV|$8+>|$p,=|$hfA^ U՜|$@ʜKVfA[ƒ$[D|$8PDV|$8@@|$hG@VU|$0*<|$ |$8 UzUUUou8z{U8fA^{FTUA EA9U] ( W T|$X<kO  TBGwTTTT|$0n76^|$X)|$@ -uA$>޶ tO|$0Z|$h \ Z BOmL|$PEfARH,ؚO|$0SGfAZ$N4N|$0/$C|$H}cNN$&;7^UJNfAYD#5|$X4*NNAWfA ЃM|$p1DA fM M$M|$XC]U]P$`ARM|$@@M|$8kMA|$h0^Dv0D$X-mL|$hOO$;J$C!sLfAU 1|$X51ScGMLCL|$p$A$ L$[y| K|$hnVP$N|$PsKKXƒ|$h{t KKKwK$p K|$hhJÐ|$X/4K|$P~|$X+KKH S aA J|$8HJP$ OЃJ|$p*|$X;GE$ |$h^J|$X*ЃMJ|$XA;J1J$!JJ J$ 18 ЃII I|$@IIIII:$1|$@ЃbI|$@ PI|$@>I-IHFcI|$hz%c|$Pb|$-bbA`fAH$HBbAH5ba|$8aH'uHv $EYH_IH|$h'6|$p4H H|$8u3 i3G|$0 A|$7A4|$8ЭG|$p%Mn'=G`E,^bTGJGsSO|$h J$)|$@|$8GY8$. FfAb7rv^FF|$0V%8F(FHE|$@tF DUFG BF|$8q9|$@%F|$n?|$h?|$@fAPA E|$p2DEE|$hQxEYN|$p'NE|$0^1AbfE\E|$p 4>E|$p hM  EEED|$@{Cx6DD$HYH|$@D|$h8zF zDpDfD\DfA;_==>D|$hf#DD@vCCEfA_!QC|$@w!|$8wC`C|C]zWCMCCC9C/C%CC|$X$zV1|$HB3YYBBV|$@V$B|$p1 XAX{BqB|$p#wT|$X63[sYS@B0Y|$p!Y@B\|$8p\Q\sAA!V A |$@]|$]ЃA|$P]|$0-]ZAJA|$ ],AfAG{]|$8p]A$W@AWg@|$P^|$p2S@|$P-O|@fAYT|$0zƒt :*UI@uTTfA=~TuT@@?VV??|$hcwZB?|$8|$0>[PX|$@X|$h@X|$8Xl?Q4[$[|$8Z|$X.ZZ#?TfS[Ѓ?|$83yUe>> >>7i1|$PD>> l>w vN>D>|$hbTfA`D">> =AMfA =|$X6^vA==|$bUN,N Ny=|$8w7 ݷPv|$=R=H=8=|$0_NfAasNfA^5N|$@ NNM<|$0uLfA^mC<<w(@w~<~<|$pW|$0?L^<|$Vw'D<:<0<[040*0 0 6$//|$8Ѓ/ sdJ`dhd//d d/|$ WM*MR/fA[!M|$h, M?,/"/whm /.|$@.|$0).$b ..~..Iw. lJL.`w6|$hZn|$@ 4nv..|$@GMA-=c]cc-L% |$ $RA[---u-D$PbubO-|$0b$ ~bfAHKb -|$0ow2|$p<!h$v v|$X=,,'n|$,,,fA<ifATIAIA I g,|$lU,K,|$pf|$@v(,,|$p)g|$8gA+++lk_U_$ v_T^++u+$ j|$X6j$d aji5+++!++|$X`NcN$(:N$*$ c|$@ b|$@2*fA[O**|$8+RZ=a*|$@l|$h7ll|$odl|$PO*$*)|$@ H1A)v$))lF|$8$)})|$8Ѓz)p)|$p%w'$~ v|$heL)B)2)()|$@)aF FfAWF(((^U((( (|$0O__|$pj_ev|$8=(3(eie(|$@*JAJ'''$ |$8 afAHg'A''|$ |$XK^'DTE?'5'Z=eD''r'&&|$XJwG|$8.Tee|$@e&|$X'Ge1&|$8n Dw& vqm&c&|$0%Q&AC&9&/&%&|$hb\B\[|$%1fAT%%Ѓ%|$h:aSDq% x%:ED|$hFDD|$8O=%Kw1d|d|$0Gd%%$^$D^T^$$ qS$|$@ $qY"^Yt$j$`$8aD$:$0$uF|$XC`F~$L#vfAD c$#|$hv|$@ ##AE#AQcs#P|$0cЃV#L#}E|$8rE+#|$X6b|$h'ob|$8PbDb"M""|$p7|$p0"|$P \u|$@""}"|$p8MQ7Qe.QS"|$hN7N|$N!"JFF|$@ D!!!!!O+OsO!RmRfANZStЃa!-E?!,!|$@ vA! !|$v|$8   -t w7|$@  fABR ^p +@+|$pN+F |$8%A* :  |$@ Ѓ|$X";p$/p|$@nq|$0_Yq9qЃfA[p eRH|$p4|$0joA! fA_nFeo@YoKn nfA]n]Oo$7oCop9]SX ~n|$hBsn2$?bn|$p'=d$eЃ|$8&mAtm(CmfA`|$p5isc|$8~vy6, wA$S|$8v|$hg-A ƒuLmc2ЃQ AWfA[- #v gfv^DA1mcZPF$wwؐ|$X8|$8څ*|$|$h|$0R|$%Ms|$X<5|$8 $tB8.$|$p,w5%1fAB|$83\|$hm|$PX4ipAf,vd$^@er|$p!eYA4*$(v|$P '1D|$X7ٚ|$@Ě2fA bxy|$hccyWy'  |$X=r Xv|$h}mN|$X%|QAvYO(]Ѓ7wM$|$84ŏ!Ѓ|$P|$XC|$p8]{\fAR\\{ )8pj|$8ejjAwK:1fAPD@IfAa$q+$$,|$8|$@$`u|$h9u|$p/u|$X9lux1W^Ƙ$N-#|$8ahF <& GZ|$hiZy|$hagvQG$ lnVu |$hD$[|$[[EZ|$ Z$[|$h[fA][arr2_|$P|$8G Wzzmv|$X3-#|$@ ~~| ~U~Iƒ|$8u|$h!|$8J |$X<pjpD$X,PpfA`EpdZAy|$p%>4!A A o|$h|$8 )|$8B|$pBflbXNDfATy$ FAz Par|$p<Lr9r#rJ|$p:v`|$X)U|$8w-|$8ZIv|${lb|$8|[|$@E;1wH$c|$p#c1|$HD@c#|$p&Z|$*Z$ vcfA]acދ$-}s|$hˋ|$@ "J|$pD~fAaE($gXQX|$@ FXR?{bob$_b|$@TbcY8oYCM.q|$|$@ cЃ |$p9wV|$h%     |$0E  SЃx n A` V L B |$i6$ A "|$pHAЃ fAa|$hj<|$0F   |$X+   |$8z Ѓh |$@iGfAX%u`1X! zwt|$pLwab  |$@,|$p%|$@v |$@ vv~ |$P1AЃc |$0Ga|$09caMX|$X! X|$hQW|$@W7WA  8vA  |$8t A    1Ar h ^ T z|$@ o3 4!9w    |$X3ss DwfA\  fAZv fACsRXR|$q^ T J |$0+ Af " fA82 $A Ø|$H|$hcM|$X?.|$P|$8JEA\|$p6\|$8^e[ON|$@|$q+ЃBs |$X/f|$hzf|$p fmf$v |$Hqf^Tz|$pB\|$p*$$|$0[|$h^Oc fAC$qA {$cXwYfA`<  ( F|$@w?`$$wQ|$0Mdz|$0K|$0wz|$Pz|$8Oz!jP ND:fA]cxc|$0Yc$`ccC|$@J|$@[y|$0Xxuk|$XvSI?M ,|$X.xfAO xx|$@pAp?|$X_$p|$hM{pz|$0WhNXEA OfAB#$l|$X8n|$8 |$@v|$8 |$@#|$@N$-i VZw|$p,eHU U` :wIla$aG a |$`nUv$|$8  XQsvlbU|$@G|$huA t|$P}P|$X.|$0" _|$8' |JI|$U}|$87|$d|$|$@vkckfAZXk|$X-v|$pD\fA`pfAY6e4vlbX< `_|$0E_|$P!_X`.`|$@#`|$8H$HHfAKH{|$8 |$hWwJ ҃1fA[i v$KA$v|$@$w wU|$8_nAЃ@F|$X&1I\hh[[P|$X.vA2|$p4y\ Zv[|$8`?|$ko|$8m1A|$@ ܄)h|$8BfAUOw|$p;aH|$X?CH1fAAD@ND1' |$p,gA gOƒBtAiluh^KA|$h%{f, of f|$8f|$X*|$XG|$8|$@ Ѓ~~LƄeT|$0Ir$v|$p|$0Cch Jh$:h|$Hg|$=|$@wZ BfAR$f v|$0>vl|$pCfAWI$[,"|$X9w1|$0ƒ|$8 t|$P|$8=fA\=Pl=A |$hӉ|$XL|$@fANf|$%, 0&H_e|$@ A wl;|$@Ѓ=|$F=fA[+=|$@=|$hU =||$8fjfXw=Ѓ>4|$X'v;$|$p7w[AwAAt1|$X<|$hw,$k ufAC8fw)SI6,Ѓw"gvfATwrv`|$X+w~W|$X%vW$v@w8y|$P}P_UKAfAb>Gw&P"Gtw!$T v}1|$@ D@j`VLB1|$HD@/vuLP8wZ|$P|52v#vh^TNЃ6|$0:4|$p.xl$|$hNw11fA`~w&rr|$0wv1$VЃD:0&|$01w;}w(1|$@|$8|$P}S;|$P}msi|$H|$hwwfA^fz4$Aw-9kt|$@7wj|$hFwQw5NAwww|$@eD$hUND:ev m|$X+y|$p7wZ\|$0Rw3|$hFw"O vfA]6,"|$@ X|$hE|$0V|$8Ѓ|$p]?]vmaw=|$8w#w=H>+|$p5wW|Hv/w* w"$r|$8$|$p(wk|$@wQw?Et0|$pvQv|$X1yoe[Q >|$0M,"v[|$@ vT5Ѓ_w'~fAZg|$p"w|$@vl|$07v3|$8w"|$p6vnF<2(AtN@|$8w&|$8w{wa|$@$vJ|$X9ƒFu.w&c|$X+QG=3)?|$8<|$X$|$@|$X$„t ƒ|$puFwuwH|$pwAq|$8w}fA];|$h+w*fAa~Eu:0&w)|$pv"v|$X%$|$8w9A~tjNZPF<2( |$8wA6v/w< >wRw/AЃO}b|$h {H,|$8|$XD!~)WЃ|$8wFfAO~_wDƒ|$Pu%wvl$mTJ@6,G A!$7]fy|$@w>|$Xv7 w%|$XvwmcYOw;w3/|$8w6EAt|$hvw|$XL}fAZ|$T6 w^|$8wM w>A w8$|$@ KfABi|$p5v|$@w;Q |$8w-|$@v&~|$8lbXN|$h~v6,vD n|$8wj|$8 w vdkaW9ƒ|$X5|$88w"}e|$8> w%|$hCuxn|$hv-^WyD:0&*vPnЃ|$8+w&ukaAw# K 8.$_ fA_wS|$8|$@ z|$X8Z|$hD|$8 wDT5aw{wU$ w5Jw!1fA_qЃcЃv wT|$@w Eu]S$&$vw|$8Ѓ$D$8w&|$@|$8 w'R dw6|$hw0fw!fAcOaWM:0&)J{|$@w-Sw|$@v|rh^wBv=Gv!Av( |$8*w%$v$Ѓ|$P}+fAR~Wuk|$0c3qL9/w  &,?u|$06wbw?w-M=3)w8|$hRwo|$p(w^vF|$@v"|$hav|$09|$hlAq|$hr |$0;A|$p&ls|$P n$vZwUKT|$X7 |$p.wI|$P|8{w&"Ѓ|$8|$@v{|$h\wBFw#ЃkAZ|$p%w#@J0|$X/v wm|$p,vf|$p,|$|$@lw3|$hPwS|$@s$ ?A+|$h=D.w<|$XEv5w-<|$h/wX|$@|$p.|$PfAW0|$@w)[Zw4v|$8<2Sƒ|$X7tfAY2Aw,v|$P|$p!wU|$@ wDw|$01|$X0v`PF|$pv-|$X1wЃЃ|$@ w>|$w|$8wY|$P}|$@ ui_UKAAwZ* $wfAXIw&|$@vlv$8 ND|$82( fAWOfA`0fAXXtvlbXN|$p+ 2 A& |$P}q|$hw` w; Ѓ|$8:w+$6 vlb ƒ|$8C|$p6.$A  |$X3vk$]w;w 4w}Xv|$8w|$0ItjAwc|$P\SI?fA9~# v w3fA`~"|$P~|$p(wn$wW1vrlbXvJ=3)Aw'c"[|$PO$wM|$H|0vfAR|$H|d$0wMa|$P.wxw\w;Vw&|$@ '+|$8w[w$w7|$X2w|$8v\vAe[w@mw.|$@w'4* AwA vc|$X;wL$]v+1w#fAV~w}smcYfALtIAw'9/%|$8w(O ` w:|$0[|$P~wmcYO|$p$E8.$?wR9w;=wV^vQ|$8w-|$p8vw|$X1f\RHv4-|$P$|$X6w |$@ w"fAc~JvcAvOE|$X9wEfA[~>-|$p4$<ufAZtv_|$2v*$mv5XND:0&|$8O]Nwxv~t|$0^S YOEfA`:|$8|$hV!1vM߿|$h9w v%¿鸿饿雿鑿釿}sywhPw7ЃWfAasvv|$82TvUwCZv>|$X!w%|$@|$@ؾξľ麾wv馾霾钾<vN|$@wG!v5w-iSw/v'%F<2(1fAaD@ }|$X8|$P}f нƽ鼽|$P\vW|$Hw5|$@v.釽}|$POcYOE1fAO/|$p&w6C|$X9fAUu7w/|$hwBfAM!fA8Oͼüvw9Ѓ驼wJw8fA^1|$8 v Av|$@ukaW8G= * h  tDw2Cϻ|$w&|$X5鶻鬻颻|$p2Aƒ2|$P_Mv;Av+ A v$ ) | w 1|$8Ӻɺ鶺鬺颺鏺酺{nk|$p;w<|$X4t" v|$PE;(Nw/wݹӹfA'~-鹹w1|$@韹镹鋹遹,wWf P|$8@w 1,"6uo|$uh|$p(w9|$8)w|$p&vEѸǸ鴸|$X3w!|$0Cw4閸錸邸|$@w@v.u)w?YOE;|$8 )|$8|$hQw,->շ|$8t;|$p-w"v|$p 饷|$@铷鉷w8Aw"na|$p&O?5"$ t$ζĶ麶鰶|$8|$8|$P 酶 w&ymlWaGfA^,|$hEw|$X6w( صεĵ麵鰵馵 w_fAO#v~t  fAG|$@?8%u5|$0[w.|$h(w'-|$8۴Aw*fAGO龴髴$閴|$8 w3|A v|$@f\|$8|$@<2( `w|$0Dس|$X2vNw?|$hv.vЃ髳顳闳鍳郳yew$|$@w`MC3)$|$0,|$ua|$8 |$p$r|$l|$X*|$8wQ6wIY饲|$8$u`|$8v<|$H~oe|$vAMC0M|$@!Ѓ|$h<„t,Ow$|$0%w۱yȱ$w7iv%9w w鎱鄱Aw8$(f|PF3SA?|$X!w<|$hwYw.|$8:vJݰӰɰvZvH 馰 |$X2 |$00 qg]S$ wLfAN;|$P}4.$|$hw-ݯӯɯ鿯鵯髯+w%fA^u钯鈯~tjOUK|$h.H|$8)$ |$X4wC|$hZw+w^wƮ鼮鲮|$hdЃ顮fA`A酮{$ww\RH>+!|$@ w|$8v-~|$8;7-  w&uݨkʨ$v風S|$X1|$p+|$8uNwF^fAb|$X*w{fAaA$u-Jw|$@v"fAc[E=}ѧ$|$pfAb^wL|$pwC|$X.w&֦8æ|$@w=Bw8魦|$wEw3>v$v|$8uka|$P}Ɂ$OB8.$|$8 wffA`@w1Ew"|$8u֥=wl|$X.wDZ鷥A|$p,wY$whA醥|$hYewYM$t^KwV1?v$8ۤ1D@ʤ|$wC鰤馤uCw'fA_ 逤|$w?wj`VfA]4v"|$06v/%>A|$h9|$@ƣw0B騣鞣鎣|$hkwervSuvAgbTJ@6,"i}|$p=wע|$8w9v'+鵢髢顢闢$邢.v.|$8wcYOE|$@3)w\fAU7ЃvCN١|$ u3$w&黡|$X6驡韡镡鋡遡wmcPF<w|$X'v#w6|$8v%v$۠ѠǠ齠$\wkAw@fAE' 鐠醠||$@j|$w7v%E|$3)|$hv<Aw6|$hw%6Ѓҟ/ 鿟鵟fAO..锟銟速|$8-vhHi w0vA PFw7Ѓ,w'  w9|$8w2ڞОƞ鼞鲞騞鞞锞|$($je%O|$@GfAU|$   $w]|$8wFcv4|$w v ϝŝ黝鱝顝 鎝鄝zp$<w9|$PAt\ w>4*|$h$ wsI wa|$p1wZ A w ڜМ|$@ |$p3鳜驜韜镜|$h|$RD|$@wm|$8w w[QAw"|$8v3)fAW1fAZD $RE?3ۛgwqBw黛鱛|$lw>|$p;w'|$P|$|lb|$8;fA`te tV=w3sv!$ Ѓw0rٚϚ鼚鲚騚$?v郚y9i_fA`Jw/|$p ƒ|$X1t+!WDw^|$hbwDߙ|$p5wa|$07w0.龙髙顙|$hwzOv;w3wFwQ|$8Dw6|$hwND|$8#2|$8Ѓ ؘΘĘ|$@鲘騘|$hHwT<w醘||$X8fAXuWMAwd4|$0O|$X8wqAwNfA]~=2w+Hwvٗϗŗ黗鱗鞗|$X34A GjfA[.|$P}xI?5|$X9!|$p3wd$|$P# wǖ齖$z饖雖~|$8 }si_UKA7- ؕΕAЃ龕鴕骕|$X;阕鎕鄕]w-AwcYOE;1'$|$@q~ ٔϔŔ黔鱔駔靔铔郔yoe[QG=3)|$p)$z |$@ vJvBfA\"~ v|$8“鸓s w1D@韓镓h x mAwv RHv|$H0&|$XBݒA̒AvHO鱒|$hwlwO|@|$8w/dvz~tj`Viv8>|$@ fA]tfA^|$P}#ˑ7黑鱑顑A (xntwJ|$@w9|$X v2At"Zv|$:0&|$p4 7|$8"$o(鷐餐Vw1錐邐t*|$@kw/ SOv<w-w%4nw'qcwϏŏ黏y|$p*锏fA_4|$hcv#v+mcY8w+|$0=v$@|$h|v &|$h w3ZwAw؎uwB|$PO鹎鯎|$X,wI$u(\鎎$v#ww_UK8$ wy|wQw'vfAa܍ҍ|$X?wH|$p8v7w/鲍$ v,$ 鍍郍yoeR&D :' l|$@aՌ2  6魌v18v|$@w~tj|$8MeLBLw&}* [5Ѓ|$H|"|$h"wŋ黋鱋|$@v3鏋|$p$} j`VL|$@wD|$X,w +!$w5|aڊЊ|$@k鸊饊v9|$8us 醊|Og]Gw*B v3|$@+|$p(v|$0L |$Xv+$nw؉Ήĉ麉鰉|$p6v4A 阉鎉w|$P}uka{Q w:A;|$@)|$0xE׈͈Èw!|$p9D餈隈?釈}si_UKA 7fAYD|$p fAHn|$h wMu0Nw+鼇|$@骇|$X'雇鑇v)DЃwA w|$p9w`VLBwN# Ѓ Ѓ؆ΆĆ麆鰆馆w醆|rh^TJ@6&v"|$8tޅvS齅骅項閅Y郅yoe*R.?v$|$X,iv|$H߄Մ˄|$X鹄Ѓ駄靄$}酄|$hUw:Qw#PiI"V|$p*D:|$hP~uw ЃσŃ黃鱃駃靃铃逃vlbX|$XDw Nvt;1!{vX4 dw]w8fA^~'AĂ麂鰂馂$S w1~醂|$8u*w%ЃhUKA7-#|$wdwD,|$X@v%wځЁv鵁髁顁闁A |$p1 oe[QG=v}$@wB|$X8w"|$X/w Jwk$ wY|$X,w>|$H~鸀鮀vw销銀退vf\fA[OEL5+!v2|$0V At$bjЃ0wL|$@w3Av#wUЃqA|$8 wkwJXF<2iE|$@vRtwJ~wyw^~fAY~~Aw]_w@w.|$8w'~u~k~a~nw5I~w.|$h*v'~~~~}}}}}}}v'|$@ w Tw}}}w|$hvh}^}T}J}@}6}Ѓ$}}}}||||||||$|||$0X||$@ v||$p?tAR|H|>|4|*| |BwPw>Ww@{{|$8wFw>{{w@kw.|$0Cv3{{{{|$8tswD|$@e{[{fAYq={3{|$p#w7v%w {zzztv& zzzz$azznzdzZzA|$8 ƒ|$Htfwyyyoy|$h=O -ЃRyHy>yO$bfAa1|$X&y|$HGx$1{ |$hx  EH 1fA[xv@ w1|$P~ |$@ tAtxjx`xVxLx|$h#f1x$w;.w#vxww/|$00vyw|$06wL$v5|$X?www}wsw`wVwLwBw8w.w|$@wz<w w|$@w+fA_$v|$8vvvv|/w'vv5Rwvvsviv|$hrƒ$tDw6:vwL|$X+v;fA^~*AuBvvuuu|$@uwRAw3v$ u|$@Ѓuu|$X4w2zu|$07w4.w[uQu|$p+?u\A]|$X+Ott|$@ w9$tfAS~|$X0tt|$X6ƒ$t#txtnt^t$9vv|$h[w5.tw4|$hnw#k tss|$X3wAsss$Ww.=tt3ss$w=|$@w6osfAa/Us|$@Cs9s/s%sss$us|$p-vb4r|$hrr|$P|$8drrrfAU25v#nlrYrOr|$8 wfA`uPw/2r|$w2$w|$hw rrqqqqq% vfAaqq|$8u!n vAqxq~ v-]qAMqCq9q/q|$X9w' q qqppfAI1Gv"}v|$hppp*v0\pp}pspip:wEKp|$P|Lw:|$v&p3 ppo|$p3vW~0oFoov|$0Roooo w'koaoWoMoCowF$-v oovnnn|$p8vwnnn.n|$04A~\nv0[gn]n*Jn@n6n|$88w%| :wn nn|$@mmw0|$p2w)mv!$d wmmm|$hwmvmlmSwuw#- vFml V|$[$lwoAwJ v8xl rlhl^lTl# wS|$8uB|$hyu;4l}o$wX|$@w> w,Aw&lk|$Xkk kk$S |$0B |$X+ > Yk|$h}vB|$@w(1A6k #kkk|$p.$nt| wjjjjjw&j= j|$0_|$@ Ё^ u\7 wTSj v^ :j0j$v|$pj jifUSD\$`DT$(l$x$A  wpAS|$p X|$hj Y.Ah{)%B|$0b ;|$8[]Ð|$8 Ml|$X/ ZA6$_ w|$@ OAjAD|$hnA*|$pW!|$0S# n?AZ9Ŝ|$8WO5f[Aq|$@M|$p&#F"|$hk"Asw_ =|$0< |$ l3T*|$pT|$huBfDe|$X\ A$ !Q8|$p!T|$hwq0lfAbaA"1AН|$@vfA/sfAWHAUfX.|$8I|$p+[)|A8|$8 ۤ  |$p I?fAb+F|$XDfC|$@0wMp6|$X)|$p' ;*_g|$X)g |$hYE&|$@B)FH|$p8f  |$@|$X4|$0tA Xko|$H_T$XH @@D|$0\!AOf`W A8'$uA|$hxX|$ T6A|$hRk9|$p"88;:|$hK6|$@6fA\|$0!fQ|$0Ah^2|$p(MofA%Ff%OD|$0O|$X9e+|$hVI 4J|$@0e|$h/A_d \|$8Q|$0|$h-|$h"NA N9'f`fAP1|$8Hwg5,ND$8R771f[:$|$X.3fA@YO|$Hr@R DD$@E Wf` A A#K M:|$@h@f\~|$@s A@|$X601"fD|$p)jfAXy%|$0L3|$h5`|$Hc1A|$ AA4~f|$X3|$8$$t$ R2]0@ !_&A>$|$@ t&B.|$8pA|$p!6iD|$h}A!1|$@.fA|$@ {|$X*6 |$0.:|$p$^M|$ Oq%7Afw YvE|$0@="f.|$0Tt|$0J$vH>f|$X |$8:$|$hm|$p'Fv cA o|$H4fAcQ|$X7őAA|$@ |$p+<|$h M|$X9_u|$p6|$8s$$ Ѓ|$hS fDfA^W f.w$ >$=@A|$0J(fY6|$0(L$Z|$X`>fo%f\o+|$p/VC|$d_|$X8~Ѓf|$0|#|$X8of|$|$0`-f[G|$X<vGfU(K 6f.|$hc$ T|$82AW z$U@|$p8|$85|$002O|$h'vfDC|$@8p@|$ A($|$P|^<2fDA|$0Zw#|$X-8|$@pDp|$H T$XANDzD|$8Uwf_ 3(|$0m(f\BAak |$p,Og %|$hE`a|$@ !Ѓ$„3afX)a|$8A7$A0 1A@|$X6Rm|$8Ax fARm4A(_f_Zb$$ fALD|$e |$X>A,|$X3v|$@ @|$0%Aw|$0Q$f[.>fTZπ|$8!C-|$8  f_O 3|$X 1$uuf|$hyA!V9|$X6z.gB $ "A9|$8\5"^#|$0RL>>$P ]|$@w |$hfDt$@p|$@|$h6|$0jUCfOydj O|$0@Q$ +fARA |$PW{w |$hDA|$h_#|$0<|$X>A %f`$|$8 |$XM,ABOv|$8F<$Xp(|A faAv$|$X8*S|$p6S_<|$p-2|$h8?GJiAAi;?|$0R(7H ^|$hfWA@$N  D,.# ƒ|$@R,|$XG,@|$0|$0tf\7LfAbI3 O|$0YP"AA|$p$D J:fa]Tj|$8B (8zfAOR|$Pq|$H<v$d;1D|$X1G |$8#Zv|$P|$@ v|$h$fQ!AnNe {$'|$X+,,AMbV#{?:69` |$h- $! nFAwA[fDQ&?!5A 8U{f9]p|$p eTA    kAk AaAw '<At|$hxt|$8J u|$Xf.fAI4A+|$B:|$p.He|$h8|$8 ~G8@72t7|$@ |$8vf`fD|$0h A (|$0E|$ \0D$.7$ZVfAc ||$8'?ifA^RAu|$X(|$p3 |$w|$@ |$p2'|$8 #|$p(C|$@ 1A \yƒ|$8&Y0 &$, @,tA "t|$h^,v|$hN|$ m$ |$X< DfA^ha|$0O|$X6bfD$Av|$8V2(|$XHD|$XE|$X~|$hDP|$@ +1tu%% {B|$@3hAidff.|$p5s|$0_ B|$@|$ht v u|$X7@K2%|$X1 |$8 A qP ^QA)A>|$h}Ws,$|$hpy1D@1t nAIC1|$qfZ|$}( $3B eA/Ѓ^f|$0Z ;|$hzIL$ +[wND vA^c Ѓ@ |$0q$ b-|$@GfA54s|$p/JmAT|$pD|$@2|$8AQ2b|$p#bn$v@QVeAwi D1|$@'. .|$@w|$cY|$h/fY<|$0z1V|$P n|$CfA_|$XF+ |$0pf]8fVV`n D$RO1kf O<|$0vb8fW` _|$0aU|$/|$hQAQfD;A4VAЃf[2g|$88fABw8|$p2*Y|$XD|$PyDA&|$p4AkH$6|$p<+|$p4AInk|$X/}fACIhzVw$e[DA92|$0e"n |$h A&$,|$X>uT|$hq~AF@[A+9(BfD--Ax|$X'~^^r^8|$X= h +|$0#~&$-F|$X>kAliDv|$h|LB|$p/|$8E E K~ o"fA]!0|$8QxA|;&X|$@;yA~uo&|$p$&|$@F8w|$@ |$84,A%nA}|$H}VI?_(L;Ak$@|$X/5@d@A\iDAR?l ,f[|$8*A|$@|$h1A7fANЃe - Ww|$hyi'|$8Z|$h$#fU+|$8Ip'EX |$hg>>|$8 |$p%|$X4*|$hLfA[e|$X1 |$EvCt|$P_k JfD0vfAd/%|$h* |$0Lv -|$hj$|$ >f`GfGAq|$@#f9hhKG|$hZG .{YA:K(v Af.~|$@=A1A1vAg4$H|$p08$ ST|$ho(v|$XBf|$X $.|$ h|$h af\|$@fDA:=wl$8f!AGF|$8 6|$h?&DL$HE)N $$|$p/] 00bj 8j|$X,|$fYƒU|$8*1fAUUf|$pfA]1|$hSCAv|$8fD v|$@ V h@|$hvw |$X |$0@|$X<rA`1 M|$hM A?3:IA o|$0N|$8;I|$pK2|$07wAf|$h |$@>7AvA|$  #l|$p=:  :.9|$0mr AM .v 4Lb=|$p'AATvA|$@w AT|$p)fA]|$Hƒ|$8==Cw |$X(sw>|$X P|$@!A!!|$h1fA]A.A |$81A2|$X%|$8R|$p$ 1AEA$@ |$8|fA]$S w$( |$0k%vA OCA;|$pR A`6A 6|$XIu t Tg<|$p&;A ;;PB vAqg$-1A.B|$X)3|$h= fAC|$h(kzʓ`fDfAO$ 8|$X8GY|$h rAfAJ{c|$X5kЃfAA`f^u Aq?5|$H|$8 A|$8hf^:5|$XA:]wiAtAMM|$0H2fA[Wvc1|$X7QW >$^A7fAUZ`|$p:s4AAv|$0|$X7#|$h?V|$p0~- ~fY|$X3AAMBQw,"A6 Y8fAa_|$p/u|$hrL|$PAQ f$|$X:|$p-|$8ofLk^X|$PvA;Anv$$|$@ 1L$@$eKAF|$@ e)|$X5Q2 |$@|*|$8H|$huz 'cD)@A v+AV VB)|$0;NAu$[$ЃDfaw$N4[oe{|$p'd|$X<11F1<6|$@&UL2r |$0e+$" A$m$K|DA9 1|$@+AztF|$0zAI|$p:+|$X=;qb|$|$X7vA K|$P8|$8#yP|$pnPAvA|$0l"A$ >b|$lW|$X {An<f5YuvfAa1'$%A>`N Ѓ|$H ޿>w'A1|$X:馿|$8A邿|$0#fAK)HfW'~|$h{ }iqi|$8 -1|$@|$p-,($  k|$8Cپ|$h~ɾBv A韾1錾|$hz%vAM`V|$p-2lYX|$X1ZA0@|$pGR|$pq[^|$8{Ah|$p]|$@ Ѓ鱽DA|$@ƒ|$P ?>tA`cAQ|$@)fADZ^A-|$hA(H|$8~A #Av ڼм@|$P|$p!D|$H|阼uy|$p gf\J $;P|$8 P|$0XD |$PxA fsj - P|$X<hU̻|$f[6须 WfAc<d/r+ axS @$c$VU=|$@xf_|$8($>RvҺȺ@fT$ jtR钺$|$8rvA XN|$8~)|$X0.L#|$hGe!|$p>=fAXlt|$PkѹD|$0 q w7|$8`i7頹$ |$@ }d|$0[27|$X8(z|$@ f[Jy6f. A|$hV4B$ <|$XC'AK:ܸ|$@ ̸Aw |$p3鱸|$0D5|$h/$T `|$p)3|$X'AG>AKv|$89/ ƒ|$pfZ$}/|$88Fk:k׷|$p2|$@ ?fAFywh|$X:;|$p- vA}sf^|$X3vALB1A.v|$p3+s'fAK5S|$@*S̶fbfLO鬶|$p!=$C5KA pfN| =U2JAo8C"t|$h5zfAW~|$@|$pBv E馵|$X!faO<=9wArh|$hb|$1|$m + M|$0IyMfA(a|$he&-|$p ^&|$XyA鮴f颴fA5KfJ;2|$8h{|$8]E1A|$h=g|$p-=;n|$PV=& Sӳ|$0J+oyA{鏳$C T2|$PY|$@UfF$ I<1|$HD*|$PA d޲|$p8|$8F1fAP~Y z W 雲J| _A_A=_E_X*=@|$X5A!m0|$X)nB6&_Ѓz w$αıA:v{頱A g%An|$X$.&MAM3v!7-$1 $@$63d|$X9 (CA鿰`w |$hy锰AD+y] P`fA\E`RA :|$88Ag|$p"$RKAZ|$p {Zį|$@ 骯ZAK2ssOeAX$PH,!|$@0AA-. . /n|$0OfB|$2=]  t Ȯ@麮/A鄮|$0T|$PAfY k|$h=C7]=|$h!*[|$p9O|$hƒ|$X0t 7B ֭AŭS鲭\鎭|$p(~ AtPFj|$8+B|$b|$Hef.լ|$X?ev A鮬fAF'|$HJZHwyo|$0DNAPfA?&b<A%|$p!|$@1l!1A0ϫ|$hI.G DA, D$b铫|$(A?K_|$p-`|$hwa!|$8C fZG|$8)|$H $;{ |$p4Ip|$7ĪA4A|$DC$tt t$A Ѓ|$0`V^7A 1D"|$pY+|$8"A B$xA "$鏩邩x|$@ 7$TMAeS|$@"|$0&Z|$@tAA9 9v|$Pר$ & UhvA XA閨|$hZ"|$0.||$|j|$8%|$0KZuPDn|$@'$ !?Q|$XlV$P Eۧ|$@p ARm鳧u&|$@阧|$PúO遧q|$hA"jWYG=*|$Pz &$$y|$p7DO ڦ$:lB|$@ |$8隦 銦|$X4vrh|$@8JaEfAX^A^ZK|$@A #Ѓ̥APc%AF騥|$*|$p)g Ѓ}bmA|$@QieS|$0_SADƒZuAT|$h{lфAĄǤ|$p f,ATAa铤|$X5vAH|$0_#o|$@n?R4!|$X,7$fa([A |$@vA ѣ|$X<@# * 駣U锣|$h9.|$@Ѓlh/|$X8`|$8|$p5;A% A|$8 (b8G$S^|$p.SA6黢 'Ab|$@関|$hVK$|$XABr{r{A B0|$8YAA0|$pn=}  ֡(麡?E%JdAj+鈡fAD,|$p8\AU|$8e9fa[93|$0L5!U wG|$8`A@A./f^[/ ڠZ|$0XSz|$@B|$X2~n0隠A鉠|$@A@h|$8KЃW|$h#CG0|$hjNry8fAaߟAL)|$PvY|$@ Ѓ鶟\HAE锟|$X.%$ FCm|$8JAfAb$"EA4E'C|$hIfA_n4Pm|$ $:|$h"9|$p]mI$駞|$X.@|$H@tAtq|$XuL|$p L|$hE=|$P'=|$@#oAfAEQA |$@($<@E$ؒ齝)ARA7v|$X,鄝l ,|$@ fA D>|$89>>$?|$h9C5Ѓ`'|$@|$ \_I_|$0!R_.Ü|$XDBfa+|$X*|B|$@e|$h<~逜8mp 5AA4M|$X.fR|$@l0% vA$V 9A9|$ Ǜ|$p-)A^ǔ陛|$hWO|$8vvlfV|$h.|$8ЃGfO[|$0l=1Z|$|$@ A|$8"uٚϚ|$8 (|$h{]|$0KAA|$P|$he֫Anf Y|$X5|$P"[?|$X5dA' |$XX|$0i& [|$p/y_APvfAL騙b^,AQ,酙$h#.n$P|$8 %|$pmR|$hWiFfAO'T|$hfAM{>_>>A麘|$p0Ѓ領|$07$-Td#Ѓn-^=F3W* {}TЃfZ0 As |$X<T|$P|$@&A &|$X00Ac G=$9=Ѓ鋗QV79TϜ7~|$X%s7s $A$|$0SmV|$pіfAbNo.A|M.ЖfADX}B驖.|$$.|$@"\@ w%%V|$X(~,D|$@#"|$hs'|$P6#|$PYxN|$@# 6(*fv|$@ Õ鹕馕|$X5 % 鈕7 u|$h"|$p,I|$0-JM|$p$(Ar(|$P((mADA"&|$XK>Ĕ6L,騔$)|$6|$X<|$8GcYAQ-22|$h߆lw|$8 A*|$P $|$p,sAsq A 鿓|$X:!ue钓|$8k< tMA(OXP#Az$ZuG5Ѓ|$p'EfX΄w ΒA@FfAT~A鞒00JoeR8?5|$@ƒ<t ƒ|$% ʃ8u |$hcݑӑ#AV|$HV騑d"A zn|$8iwA H#fAII@m[:|(h$&F|$8JfAZfV|$@ vϐŐ|$p '|$ 限鏐#|Jc|$@ Q$Q$$-S="|$@|$p`.]uA3ۏяAÏ鳏|$h$"{D$~$[  mg %|$@ODE0D^+$|$0b$`4|$hlu lfP S A 餎 ƒ|$pu0 ~tf] '|$X< 3L|$0>-fAaxl|$P7|$8 .$EN ݍAA鸍i v|$8閍A %|$8]T9nA&$(v|$X.D:(*|$htp|$Hzp|$:&|$paA R1b1fA`0題Aw u邌|$P'$|$h<J1|$X.ZA  %|$Xi$aa+Ar%|$0On4|$@ _, Ab|$8TK醋|$p*|$0;|$8,|$ha|$X3vB8|$h)fAJ$AM|$8jЃ$qAۊr鼊$'#zAz鋊x1d.Q>iB'An>{A| Q|$h-l$ &AKω|$XA$|$@LeA+e|$@ eA鍉Ayf" E$dA8d$"A6fD|$h4Bb|$0?b7v$ӈfAL0A 0O髈fAbE鍈A5s]a5|$0rZ|$8$\ !|$@:f:wk&|$X?4$ć|$p6;6|$X$bfAddA]AX*||$82A` My^2Aev|$Pθ|$X+1|$XeX7\$N &\ۆ|$p7$7|$P,h|$@_|$p3n|$-׶AR鐆0fA0d$icAYO|$@,1McAW6_jK|$834AJʅ|$hec3A_韅A E鉅1 j|$0pdil\fYEFi 6|$84fAOyg$A0x|$@x|$5|$0hffAJ\|$@ Ѓ饄AM|$pD'$uMA*ƒ)K)E1f]D@3|$8 4|$z{ $2OXfAU|$PO鴃|$P+霃A/|$0ZxYAgA4$cd9= vAAJ#5XT'A-8܂|$p0m%|$0鿂 *f^U陂|$X5/|$h!b$ vgAR|$@2ЃA7A -|$H|$@ ` |$@*$Z$?ZAm|$8 |$PxA v$邁A#z|$8 yfAPf|$X>KA  vK+!fU'0A-Av|$X*v$9\Av|$X9鷀 餀|$p o>G醀!iAdi_|$hXJAO!$-0.|$8 AA |:z||$@|$0Z46AffAx-A|$hbA- u%EJ$TJ|$0& |$0@|$8w!|$p&9A68~|$h"|$8,fATw|$0u}w|x~~AvA~~w~|$8 LAuu@~|$p.O ~~|$X-[!|$8 gG}$. Yo}|$0s8^f|$h'ffAJ|$0UAj^q}0|$X?}A1>{|$X->}+}|$h<|pAp5|$q;wCk-kj_j|B|A||$X=?|$@|$p,@ l|$ 65|$@wAe6|,|M YLXDa \D!   {|$X+J{f_=8A{|$ 3|$0:o|$0FYM[{N{fXW;A8`A ? {fAGO{ApApЃz|$hD<3wAsw0z|$@A 4zfAIdA 7$Uz 8._|$XCPe|$p9|$h.A|$8 yyAfxAx|$0RDy$|5|$h%u8a|$@ y_|$he4|$@AvLyByA4yC0AmEDr|$p=wA(xx|$XE0"$mlAAuxxD$@x}x|$X/|$X+`xVxC$8a8ah"x|$XB+A }zA`z|$X<v2ww|$X4Y.w|$ {9{A wA%xwAo6|$XDj Pwa@w:|$@d|$X3:A wO5vv 0Az8iW|$p9AvAvvAwv$؀ YvA--6vfA\|$8A v|$p yXsy$vuuf[Ry?5u|$h.OuA"/ s|$_u|$0Bf|$p45|$Pf_  |$0IӍ|$@uq'{'A#tAt|$0Iat*|$wA+ttc{ct$y0fYzj|$@ v A t|$8t= s|$hdQ/|$@GT$ Ĩ|$hXAXO8wzsxs|$@*fAXmAQs|$p)x6M7-]`|$htk8AAr-f_t|$0w\|$8_}$ l|$8ЃrrA|$@v|$p@}rsr$D"++A|v$Cr9r|$8f]ArA]A]|$X ]q..q|$84q|$p&q|$XB-|$0sWm|$X;0m1|$Hxq|$p2g|$0XЃ\q[.Fq@|$89$P 9|$hQ$pAx|$pDY:1A |$@ $fAYt *psApp v|$P.UpKpApA<H<|$h A p5 JkA o|$8BoA]Co|$8fZo$D foAKL|$X&@L;o|$X:)o o oo|$X3 fAQSA~Sn|$p0n|$hvPn$8P~n|$XA|$8QPf[c|$8; Cn|$@ P:P%n$T iKfA1*J|$@mEu|$p-mm ƒ|$puVmmm l]ym|$PCu *n?!nRmA>m4m /|$8[$([m|$@l|$0LHh llfmfAYfCf7fllyl$ *|$b^$ sFf^ffA <w Tf|$0` |$@ wfmf?|$8,$ ,D5f?%fff|$@ЃfeA?Uz?Aw$_fe$:|$@ >$e|eAF9|$p!#99t)eee|$X#e|$@ d|$hlaB,NB|$hA1BfUȻAdddXddAld|$8:AsЃNdDd[ au\AD\dd"Tf_Tc|$@vccccc|$P*)FcfS|$8S$AA*Df|$03Q|$p k&cA c? azab|$@pW|$8$u|$h0bb$ 3L.b}bsbfAP* EQAQbGb=b|$@ +bf\i|$8ba|$p-a aaA` f|$@a|$@k|$8kAua>Y|$8 A|$h fA`~|$X. aa a``|$0Ki|$p'"hAlCà w |$X)B`ƒ|$HuA``|$8IhUh|$8XkU`K`|$8<`|$hTN4 XX`AX_ lfAAl_|$PWAWrWA? A_vA_z_p_|$p'N)|$Pƒ|$8g [7_D$hP̸"_! __^Au^^|$X1-A|$h6^A^A -|$@nn^$ V^*&7^-^ f|$(^|$@,|$X@ |$p3&|$@ A ]|$m&.A]Y] !'fAM'Qd]AS]I]A6L)]A6$fA\#|$0_<|$p5AfAKA\\|$0K$$|$P|$p1sp\&Q\|$0m'|$p '(\( \A*$[|$PA[} >** [A &|$h5n&|$X3["|$8u|$@o[e[R[6 ?[,["[<6|$8A."Zƒ|$p25+ )+ZZJ'ZA@ tz kZaZWZA:Z 'ZAH(D$82ЃZYfA[&&AYC($"h"YAM)AYwYmYcY+vAIY?Y|$p,3$U$` $$[ |X:ƒ|$p6t XXX'|$X':'_X|$$(|$hoX|$98 8EX)2X|$8 * ƒ|$X<t|$8XW|$@16A5|$8WW|$@6jW ЃWW|$8+fWw:b*Aو|$X5 |$8Ţ WWV|$0h9AHV|$@7V1fh$)V|$8-A(-AǠ$|$8 K9A/$ΡfAWV|$p*AprUvAUU|$8)2,1|$p,|$@ чU|$h'\6 fU\URUBU$ =9|$@ 0A;Uz5)|$pJ=FTTTfbc8$;L /T$ C3A.yT|$8Z0|$0e\T=JA?T,T|$X94;)8 BAwSSSS39S|$X@,3gvSSo22RFA 2Aǖ?SA}(As(S0SAFJ|$8RN%RfbOR|$@RRRRRZ3fAN\R6k&|$@v=;R1R|$X"R|$8) RR{QQAAyQ$`%$QRAv|$X"Q~QnQA]QSQ|$@AQ-fa-|$@Q8/@ATP|$P'.|$@ ЃPA"6|$@PP|$PO|$XCE+HzmP|$X=o1fAAtAP|$PM0Q P PA#G`O 0|$8 0~/O|$8)m4|$0QOX!O|$X5|#FA~~$l~A}A|$XAhv|$X"OO|$83AЃN$&ANN$/|$8+ - NAE|$h'DAWNMNsf AY $NNNfA=pDc+fA3OM$6DDM|$X0% ; ^$MwMmMcMkT8{v|$hq?M5Me"MM|$8 7AZLLfAZ$?AL|$@m5|$Xb5LLGLwLmLpM<tEL;L|$p$N1fALL|$0C8|$8F KfA]"Df|$X7fKRkR|$@ 3Z|$8YAZ|$@_Z|$0m@Z|$X6#Z5>MKH=A'K|$|K K|$hl#C$eA v|$hlJJ|$X)O|$8J|$@vJJJyJoJ ?$ ??J5JfZ+|$hЃJ|$86:f\|$p#|$X(˸f II1IAvVBIfA[A c{IqIb Cf]CQI|$hM)|$@,Aא7ːI$_<9ƒ|$8tHHH$ <@<HHHyH|$8gH$ <FHA2H<|$h;A$d |$X?GGBVS|$N-S|$0+GG|$h\9|$X49|$@  fAVWGAI7G|$@ %GA9|$hvAGF|$]vFFFrFFFG&N N|$8_ yFoFeF[FQF|$X/J|$8I (F|$pP.  FFEEB;|$h$ ʼvfA?EEA 8|$8EAw6A6|$p#^|$@ ЃNE|$@ 9.v fat'E|$8/|$hOE҈|$@ЃDDRDT OOD|$@D|$*+|$P+?~|$8_Df[~,0R,18D|$p?> 7ЃD|$p4mEOCC8CAC|$p)7AC9~CA@D|$X$w EaCWC|$PO@C a*!C:<~AfCBvfPBBA& B|$p-(f[fJ׶BwB]3AA8>BA,*B|$X RNeB7|$pvAAA{>A`H A|$80/xAeA|$p"wALABA8A '|$X8,'A)vfY A@\h'` @$LB$e$-4@Wv$@z@p@$%&&O@|$@=@|$P O&@@@@%|$0`? ?|$h70fASZ|$@ ?|$0S ;|$00?y? d, ]?$H?|$@6?$tg+fK fY|$8 >A ;|$H>$ ^v fZ>>>|$8-;Q>|$P6+A[$ [|$X?ZAZ9>|$0P;|$86i;A7, vN>== E=Tk;A<;|$PP :|$hQ/===z="[aR[=$A9=I*|$p"*|$02FZY< K+ Vh|$Hh<*|$h2|*{XPXfAS[t[AZ|$8o<|$X7wu|$8 w\` Ne|$X7 e1( v|$@((fAE)|$p/A''|$H/x'MU |$@'AA'|$h)A |$@e'['fa^ A[|$8[A["'S v|$X/uN&&|$h7vx|$@axA{0`A&Aw!Aw&&|$h=W|$X.p&f&N S&|$X*w+|$0Y  vV+&!&gt&;`r%`|$hy|`Wp`%|$X7c|$@b|$8b|$8`ANo%*_% w, G%[UvAЃ+%A fwQ  %|$$|$I$$A Lv|$@ Av +v|$8 v$Av|$H$$w$m$;^Q$fY] ]|$8G]$-L$ $tfA5 tA##A#fN|$hu|$p,uf;{u# UU* uP#|$@A#ssiЃ###A&u[u"|$hQs|$Pr"d ""|$8""{"q"g"fA.zAD=" *" R-  "fWЃ!!2x|$Xx|$h~!!!!A!fYey|$8)y|$p&;yPZ!G!=!_-!#!f`|$8P~V2pV" |$,?A~r Aw1fAD OfXN{ |$XWw.|$p6b A$\FЃF A 2 ( |$P   W$ 7T|$p3`|$p!Aj|$8w-P\wCXE6AOAqaOA$zЃiL|$L|$h+jwAZVw|$8$$OOYOAMBM|$8 M|$pRRv8|$@|$X>AAIN|$p4N A|v'|$@v f\O]SI.w!|$hVv|$X1-#m O=,$ Ku|$>%ub uet$ t vf\RA>- |$@ԏfASɏA |$@<ƒO_|$pD_|$@sN`|$X3NAaDLA%L|$8-L Ѓ|$@|$HVu NK$4| i_|$8w G=3|$p:|$X*|$8 ӍA1(|$p+|$PXWAT1fA\w8|$8& {[hATJ:0&|$PA At| |$hx~|$X4~Fp~]~=]|$p~|$X#vA<2A  |$p&~$  9 VA t|$@mcYOEA1'1 awzAm|$X2|$p~$~^~|$8|~Kv|$Xe|OW|$WA$7|$@|$@ vo|$h"ѡЃfAEAJj?&n {fbׂ|$8A}|$X6^!A &A |$8{{A`|$P5|$X,{{kaW|$p$vv6|$8|$P/y8 f`v|$h_u|$X<|$:A8fAGO 90|$p/.0}fY=wQw T|$@v|$XBvv,|$H>$ gF/C|$7dt7|$p >|$0/T7|$hA-'-|$P~-~|$@ lbOE;0|$800AV|$0G|$0=|$8-L|$8( =ATdZfATOjAv/%AM 2* v d$B\ Ku|$h$T|$ 3|$03|$8ښ|$+~1|$H$fAY|$k|$8AA' A<A=jA6V F< )E(A;'$Ѓ|${ %|$hY$|$p'%fAau!Ғ$QyA'|$p+'+QG=3|$8 A  |$P      |$X7 $ |$pB,A0 V f`6|$@w|$pl$  A\vg   Aw% |$@  fAJl  ḀåAx n d v$= 3 |$X/!|$@ O $ |$0C_  |$@Ţ|$0    o9Ѓx |$X v> |$8Œ|$X*yfA\n|$8]IЃ v|$X"  |$h%|$p;O  Lz$ M { q g ] S I ? |$X7o|$0Jnv|$@   c  a  |$@    |$@ |$X1vfAYl b 'O E ; 1 |$8 m|$m vA w/z+ Ѓ|$@vvl|$X+|$P|$@""5A1fA]|$X; " Bv|$8+|$hStci_UK|$Y9|$hAہGAAA|$88|$@|$0cA|$p)v|$X6}si_UK|$h$jƒ|$8uA $ -fA[O$}͔|$X6 Aow>|$XRiA`|$@ A7@|$HЃ#$wBJؘGvAN{|$8fA`zEz|$@A|$p9$ZA}|$@>A$w6|$hƒ|$8!tA m|$@}8 Ѓ Dw=|$X|$X/0 yo$WMCA/$-wG$*ƌ$%ƒ|$8tA|$8%AA|$P|Z pf\f]Ad Uފ&|$h|$8 |$hk AHA 0|$X>ayfA[jaWM:0&|$0|$X8AAЃ|$p9OK|$@!|$h2˗_|$80w.̘|$8vIG1A$|$H|$0>fAAg$a|$@m|$yYyy|$@ ;1$ 1|$p!|$X-|$p+be\neA AvfA`mc9P|$X= 2|$8azCNz|$0J9zE0zi|$@ЃfTuu ||$P$]MEE]|$X3:]/%|$@]$]|$Pa]A\$|$@ \AC\|$X1s\`\AS\xnA6v WM[[.F |$8bk[Av|$@|$hIwo"fwA|$Pts|$@ v|$p&lb1fA\Lt|$p".|$8;wL|$@f_1fAWAKn|$@cA"sjWA|$@ 6!P$O|$hBr6|$0luƒ|$8 u A[rfAbw*~%v|$PfADM{ :{1A||$gfA>6A w&XЃH>4*wf5ЃR|$p'wpf\~`yZw6|$0NDvAfw2f]~,ywA vaWMw;5fV6Av&A:wB A,|$p4S|$@ *$yA\07fQ|$@ЃoA&F|$h4AK wVBfAD#Av|$X;|$05w(|$X7fUOVvOAjfAL>|$8zArwkfL[AcwRXNAw|$8v4*|$p|$@|$ ~Aw:o?\AHA4!|$8w`fZ/Bw\|$9|$h|$X5C;A?|$X5A fQ|$8 \|$p1Ѓ?$wuv|$hTAsvQAw3w!A}w$|$p2|$ |$@|$8fAW^|$23AB|$0|$P}2ew vL|$P:9w"$v< nwY|$p/w@A`w$vAndQ|$@?,$Ѓ |$|$8 +|$8AA|$@wcleAsvZz=Dƒ|$@ufATfA`wvE|$hdAwbAwGt5|$p3w|$8|$h(~t|$X3bJv At G=3|$8wYAtI|$X.w. Aw|$@KwAwa|$p+wP|$X6wI^Ѓpf|$p2w=$J@fAQ~e|$0\v^\"$ w |$"vAAv/vA`Ѓ|rh^TJ@|$pw(pv|$P4|$hwJE|$X:wm~NAw;G|$@ADw1|$@g|$p2w5w[H>N+AfA8|$8/6AKAxndZPF<2( |$hbw_|$P~3|$8t"|$@v-@NA'wI|$X3Q|$H<AAd$1v|$@G=3/ |$p*u/fw* w/|$0w|$@ ww4|$w1\Ax|$@v:w2mcYOE;$ p|$X)[|$0. |$X"$ fa|$P~2|$X.AP|$P|E|$X"t>|$p Ѓ|$X!„tAsi_|$ $  Ёu|$X#u3)1AD@ |$PA_$C $|$H=|$8f^F|$8'|$8|$hGAj|$v{|$@wIAAw':|$8wGGw?AvJAw7|$0Hv&Qwzpf\Re?Aw|$X,w&fA_!|$p.w|$X4|$Nw'|$hAw$Az$) iB`<f]u|$X7w@A w$A:wI5-"/A=A\A|$8|$0Owo|$04wCfAJ2|$hew!AvYF<2(AwB$3 w!|$PݺOAi1fAM|$X4w@|$p,w/rt|$p-w`|$@wFAUK8vM?Agu,w' 1 A|$@ 4]vT|$8v4Atw!|A si_}wc|$X2w\F<)|$8|$h@vEFw!fA`O|$X2v^4$fADA w|$@lVL|$0?V|$8 |$@f`|$Pj[va.EA$` fA_Av[|$X4w*|$@vw|$HfAVq$cw;|$0/v*;w|$H}A7-#|$X-w.|$p$ |$8fAZ |$p#$x|$0Dws:|$@v$ABwuk$ t'Aw=AP)4|$@ AwbEuCw1|$X7v |$@w|$@ AvVA|$hxwY$ vBAw9mwvRH>4* |$0;w|$p"wnfAYS|$%wB|$pw1AA5|$0C$ h|$p!c$|$pAx<*|$8 wmAw"|$06wzOAIwy|$pvh|$@v=Aw;Av5wHrh^|$X1L|$h,w.s2|$@w,A@AwwwEAv5Iv&Atw|$p'wkAwA~'qg]C1GAxwgA1wT|$8#@vZv(ЃBwEA|$X3w.D@O|$@|rh[1H>4AAwG|$X,w.vaЃ|$8CwV vN|$@w4w"|$@vsi$%v2@= 1fAX! vAY|$8t1|$@v f`D|$p5w4|$fQbw<|$p+v5kfAE$[uI|$@'wB@6,"|$X-wA |$0wAMЃvlbXfA^b|$hpvQ|$Xv@A1A\|$@w |$X |$@|$v=|$X"w6{w$Au|$ uMxnd=wH$3GfA[Y|$X7w@|$8Fw/@w*=v|$8=w |$@ w|$O:vlA_UKA7-#tЃ|$P}!Av;|$@ wRSwCA0w'A\q[ ^ KA|$PO* w:|$8 t|$X.v|$~A,$waw|$hvG4w0ЃY|$hNw\CwM|$@;$)|$|$@BA|$p6|$p&wF|$@w'A _L ve14|$X+A w~EwXA1|$H|$@|$X5fAT~`Lw&|$8w!uA pf\RH>|$8,mfA]u|$X0w  $l w>w,MЃp||$@jfA\J$v:0$ |$@ |$pUv}|$P|v$nv#|$pvA$ }si_OE;|$@wP|$Xw*7v|$P @@>4|$X8wt|$p#wS|$hWw|$X+v fa|$ AvbvP|$X1w?|$pv8fA^i_UKAfA`A,"bwmXwC|$h!rw]|$8!vVA4|$H~4$mw\ukw|$8SI?A #|$@7Kvc|$hjw?]w!|$@v|$p,+ w$|$hhv ~tW|$0Qw{|$p/$ wPA/8|$p&&|$8vo|$@] A?w;|$@|$8v  sɺO_UKAhw`*A|$@ FwyANvpAЃ|$X%v"[vD$8Aw5cwAw|$@\RH>4|$H~. |$-v|$p. |$p%v ~C |H|$X=A)|$@y)fAw3|$8 v,P|$X2wF8.$fL$|$X0|$HfJDfA2,~qg]AL|$PyAw[AtKow98t'S |$X:w,|$p.w%wUAwp|$87w_|$@r|$8AH2|$P<|$X-th%Nv|$8wf2w,*wjAwxfAbgAA|$ S@|$p'|$hkA|$@5+A,A2w07wuw]ۿ|$8f|$X4[$A4A\'鑿~4Lf\R|$8&|$X0 $$$I|$@!:Ǿ齾鳾MoA(P~tj`VLB|$p$voA Tw+A1|$X&wͽý鹽鯽饽雽fbO酽{qFa>TA|$@/EwS|$@ vB$ AwR|$8wA|$hw'׼ͼg麼鰼9Q鋼w|$81wrh^fAS~ D:0&A|$X0w0fT~ :v&ۻѻ|$X9ƒ|$uA须闻qg^|$8F[QG|$X.|$0dAwt$ $ w.|$Hƒ|$8t|$@ֺ̺fA] 髺顺闺fA[9wh|$X0vWba$/v#|$pwA;1'U|$p$w&vӹ|$8鵹|$0gA閹錹$'v:AwcYAE;1'AEwGAf^2O׸͸}麸a駸|$h}wv 1Z酸|$p- !dZP|$hf$|$p'$wg|$X3wAv/vAKw׷ZwM|$pw^雫|$pvjfAN~YfbC|$P2A w,p|$04wy|$@wBAWND4* t"AvA1AD@ު|$04wl|$@wR|$pv-Aw'鹪3w,AvSw霪钪鈪~k|$h$|$8 o|$X0|$08/|$p.$wqw3|$X)w,|$@w/|$XvAܩҩȩ|$X,wH|$h8v7A馩霩fAO>Ѓ郩y|$P}/Av|$@WMC&'بΨ|$P/ wA驨|$@vz 鏨酨{qg)wZAwTOfYttw\Ѓ2(Aw1|$P"Dէ§鸧H饧wK銧wT$Yw=|$H~6AwhRH8.$|$0PvD|$@ $nw9wϦŦAP鱦駦|$hMfA]1=M$Lw~|$p'wwI|$h_wCw!fA]~|$@#w?|$@|$X0wAܥҥ|$8A鳥|$8 ip鉥|$hw|$8 vnwiAFvMT|$hF|$pN$k_  fAS|$8)I1fAGDѤf_}$4vf$u$餤隤鐤Au($w(lbXNfA`8fAV|$@ &|$8/w|$@Ѓ|$hA!|$@ǣ齣AwD|$0>wЃ難鑣|$X$wM|$8!ww(6v$|$w$o܏ҏfA[e|$8鹏|$@fAQJA透vf|$p1QBt#Av|$p"$#v|$0NwU$ǎ|$X;w"v|$8鞎锎銎|$X4Ak=fAHA C|$0Gv%m w*g  Cvs|$@wJAu: w(AߍAˍ鷍|$8܋ҋȋwMIw;;w,v鞋锋銋逋v|$86[AG=3~O fA^"|$P}$  AwA NJ齊骊頊閊* 郊|$8w-QkЃYO|$hJw>v6v-#A v ؉Ήĉ|$@AAwnA%v[w3|$p>錉邉|$8 w&hUE;5(|$hBvAw ֈ̈ˆ鸈|$h8wO|$pv>|$h-w-|$pww銈逈vlbvVAF<2|$P}\w6v'|$@t|$Hهχ鿇Af鮇餇|$X5w9 銇|$0WwlUwU|$X0w&> d:Q|$p)AwOA)ЃAvqA|$8w [vцdžA鳆|$p,wOP w=A v4鑆釆|$P$Z|$p3w9|$@g]AvWswE}@@|$hv%A &|$X5 $-4=X΅ą麅鰅馅霅鉅Aqg]SI|$8wA.$SOwv1̈́|$@w8-w1AD鬄预A鎄鄄z|$p w1=c1vVwA|$8 w($w4*|$@AڃЃƃ|$@ 鴃v陃鏃酃AwARЃi_|$P1 w"v|$h;1'ЃDw"$Ѓ܂҂Ȃ龂鴂骂i闂A郂f]F|$p7*Ah fAM|$P|$p/AfAF~~|$8wmAvd Aw=pw"|$X$wف{Ɓ鼁鲁騁鞁锁遁|$8v"v|$8bXND|$8Ѓ3|$p#A$|$8XՀˀfAY|$8NwkAw7Av!vA鉀hy|$h|$84wKsw4|$@w#K8.|$@AwA|$v0|$0TwOw|$@Aw0w(|$0Pw8AwAV|$hv-jxAw>tw&Qv [QG4$Av/v~~~fAOD|$X;w"fAOu~~|$hwjA~R6we[a~Aw5]w#RwA~1-~#~A~Au|$p4v}}}Iw$|$@ }|$@}yvV}}}AEw\fAXKfZ# Ѓd}Z}P}Rv|$@8}.}$}G43}k|$p3||$8Dw+<|A?w|$01||A||r|5w8fAZ~1Y||$@ w>|$0\w-|$8v|$8 2|(||||$XH|{{{{|$pvk|$@ wQfAat2D$X-ww{{{|$8v.A_{{h{^{T{J{|$X#ww0{ow~|$@{|$h  |$X7|$@AzAw~wN|$pwGzfAXnwv~z|$X)wAЃdzZz|$@wY7wGOwBw<|$8y|$8yl=y|$8wt|$h`w2|$@v!AvCyyoyeyA{|$hmw|$X/wWvEAt5w-*yfA`AyyxxfAa|$X0xxAxExx xxxG=kxaxfO~6Hx|$p(v0vA%xxxxwww|$XHw[w|$p"wwwwIw|$hƒ=|$8 |$P||Atv|$X3wy~RwHwA4wwJAw|$hvCv;vvvvvvAvvvVwEAw<vAsviv_vUvKvAv7v-vB vev* vAvAuuuuw\|$vK|$P}:dnAmntZnPnFnkAfAXmTЃnnmm]|$p&mnmm$ wq$v]wUwmw%|$X>]m!Jm@m6m,m"mm|$0Xw#vl1llllAWЃl$u4|$X7v#wllwlmlclYlAEl5lEuk|$0QwP1fAWl l`|$hww|$@vfdwakkv*\ЃkwAKwkkkkk|$8vHOw-ЃgkYkIkHv|$@w3k)kkk k|$0Eti|$@wXAwOw6$lwv|$8jjj1D@jjj~Dqj^jTjJj@j6j,jA?w@|$0Tjj|$p/wG$w3iwJ|$8v9|$@w2ii|$@w8D$X2ii|$@EzipiA\iRi$8v#|$X&vAg,i"iiiihhhhhhhhhhh|$X-v|$@w~hthjh`hVh$y>h<+hFvtAwd6 hAWw5wMw8gggggg|$p;w+Utvggvglgbg|$p5PgFg\|$<\Aw0Aw}\s\i\_\,O\E\;\w61f\"\Ѓ\AЃ[|$@A0h\[[[;[[|$pwy[x[|$0Yth|$X6wC|$P}<Y[$/*u?$w2'[[[ [ZZZZZ$w2|$8w!vA ZZZ^ƒ|$@tCAw:sZiZ_ZUZ|$0OCZ9Z/ZNZZ$ YYYYYY|$@YYAY|$@Y|$P|$0D|$8Aw||$pwG|$H6]v.?Y5Y|$hgw0YYYX|$X'wlAX?X|$hawXXX|$hWv/HXwAoXeX[XQXGX$/X%XX|$8w3|$@v"v|$FWWWfAY`AWfAVAwoA Ww@|$@ v/|$0w|$8vzWpWfW\WAЃIWm9W|$p)ƒ|$X+u|$h$W W|$hqfAbtVV$w[vI|$8w|$P|VV|$hivAV~VtV-v|$X.\VRVHV>V4V*V V|$hg|$@UU_UUUUUUUU~UtUjU`UVULU9U/UAZvfbU UUAT:U Sl$hD\$0D$D$33 wS|$x |$pj $ |$8. h#A%9|$8mA Lj|$@|$@MAl|$`/A ~m); M_|$pgAff.|$plAAXhAd|$8m+fA_Ea c|$ ( |$ >"fA[,v$ h @dAyB |$x6|$8> |$H4|$`w|$`)O$` O$) CDAe|$`#Ae$ r!p6|$H QfAbq|$`;AfA_%$A |$Hf$ An |$x/fAU,|$`5H&TA)ݐ/|$x -) $ |$pD)$|$XfAD-Ad|$H ~A{` |$8u+,=|$`5K"@ 4fA`)|$H vfA^0c 7|$`(wv DAMv|$p} G|$Hv)A>cpf|$8 |$pSNA |$H<|$8d]fAJ*|$p X  O Dx|$x+e|$@)|$`=fA`Akt 5 g|$ A5 |$8o/|$8I^4P _|$H؈|$X{֭|$`3|$x,$r fDfA`eAW $m"|$8?+4\$@YrA*{D|$8!vy A1|$p-|$x#c8fA[7l|$x t&A[]A\DfAS |$8vfA;D$P1|$x0*GwA8jA|$@z@|$H }|$`)|$8.a$|$@ >|$(c? fAa*|$82=CAT|$@ |$8@"f.|$@=|$8 A 9CD$pCD|$`3%|$@ $zD$(?A]A@f|$H 3Ab$ yfA_5|$x%AA@$U g|$8Z|$H)AI#@A\$ [D  A;|$H+ GFA3[fA-fA76:8z|$Pr vAV@$ 21=$ qJ|$`6<}x^|$xM  |$`]?AL]|$@hq$xA1|$pfARAXWf|$8h|$`7|$x%N2 v@@|$pSfD|$H 3"|$x'WA Uq :@|$8Q  ( -4E f|$x-m AWU|$8@p>|$@t[fA\|$8|$x* lfD|$8~- |$H'|$p{w8.|$HfA[$Aq|$@}&|$p<3AP2EA8EO|$x3fD!|$ :s `f|$pb}$As21Po|$@wAeDoA8""&,FLR֤$|$@v|$x-0xAv|$@7.|$x O|$X~$F AA8AFfDA fAa$|$X2|$H fD $7|$`xr@A!|$8IfAX7A(zFfA;"g|$`4|$8-fA3$A()$|$@|$(*$ $C@fA] A|$8kXf.|$` |$@fAe/|$x|$( DAfAMAt}$|$ O@{D|$P$Agpf]1J@|$@16 (f.AB |$`# $A& [_@A^AC("}l1 Y|$x0|$ w& 3)|$@9~v|$XWAj'|$X߸|$p.Y &$rG1|$P{ <%fA]KS$ 3|$8W|$X|$X] |$`8 D|$@-|$H|$ &( JfAJ }fAZʱL v|$8qj`fA\"|$`;,fA\?|$ph|$x?|$HAF$Y DfA]%|$8|$838bWfD% `!|$H#A#B|$@)i ЃZ@,CAj>fA],|$x-C s@ |$@<fAS8XDA[A0F|$8JqpA(w>`|$8&E;|$`7o|$`,to|$ 3D|$8|$`.::|$H|$H|$p+$7FAS'o |$@@uE|$8oZ|$  $[#|$xBƒ|$ t(  Dw /A4 ,; ^c$L|$x5 @|$x2$ e|$@UA K|$`*@|$@~ "@fA]% |$8/%>A v 5fA]|$pd$v+rA#eVUw |$X.2Az5|$`>Y|$xA|$`)1 R!l $;Nvw |$(v|$8F97D$ Y|$@$iA9Zh:@!0&|$p B|$8DkAAk|$`)s|$pX|$H fF?|$`& |$xK$ [dfDA fx#|$@ HD|$p(]|$`F|$`(~|$PDLAvfAVA|$H|$8 fA^*?|$@V Ѓf.AoZ|$x|$H W|$8@$ 6fAVe01D|$p AkA<A\|$HGD|$x O|$X$F w$1[ 'R GASO/AA|0P|$@t|$xwfD|$8d |$`+-|$x'C|$`&A==|$X{||$`)(Ak5v$HMCfAErH|$`6Y|$x9|$XvA}u!>|$pkVӒ@|$p7|$H+fAXj6|\|$x@$9A$ w|$X  |$x .fA_ LfD |$8K |$ps/AiAGq1K|$pz|$`#+ $A[O t|$x|^|$` |$8*^1|$@*AQt,`VA#15|$x{|$`"C{] |$89fA]Hk|$xϝ f|$` >AArxA|$x.|$pg7A&Xv |$`+"|$pXz7f |$8+AzJ|$@ lYv |$x1fw $*fAZ~>YAAAS}|$HĨA0))|$p4)Hf.|$8f%|$`"I|$@xA^1AD@DAWA]+|$`-R*AV M|$XM$C&o$aM|$`)s=|$HXfA`A|$@f.AD A qq|$x*v)u+Ak+?v|$xH> -%  AA=A|$p|J?$pd ܟV v|$@|fD$|$p_…+D$(+|$@J|$`@v|$@5v|$8N=AALv |$pzoA2,|$pNWY%|$H /|$xvA i_A\N|$H 0A<h'A;AЃ|$Hw "!|$8i/|$` xjAaj|$p$&|$x1%ca)@f1fAYD@+AsfAQ-|$8W{R|$pv tD|$@xJ9|$ \S@ |$HW8|$@@ vAY\R@A *|$`$4!|$` |$pa|$pEF|$8W2J]|$89|$p01|$85%4$@s!|$p-*=A^`|$HDwH|$8ylH$!A c.|$@sk|AZ@?fAaP*f fpwAX|$pHH5 v  vAfA]|$P$|$H fA[l|$`C;&j|$ L|$@4$5 l$d eA^;|$x'k]|$H2fAA1 A_fAbO|$8x |$Hv2|$H 1|$X$ 41AocD|$`7j"3Ap|$ #|$pVwp|$`5O`AD?fA`bfAWfA^ifD|$H |$@,6-MABfv|$HD|$8A!|$8YEF: AAXOw$ud dfA\ =|$`E|A4 g|$ OfA6|$x4( @fAL\|$p|$H>$Bd՘Mf.|$pJ5"UA9Ѓ^|$x>LfAH|$HR,AH) thfARih |$XAI!|$pLC|$`4Ao$&|$` BAfAX 1$ lfAT|$8c,F MoA-& |$HfD7 6|$@ |$`-$  fAbƒ|$@t;1{|$Hv|$@dZM$1Y8oA@|$`Y7oA>fAGAA1|$p |$xut$PlbAv |$Hv|$p|A7|$8]fAMU?|$X-A?eЃ@zA8i<W<|$x, :|$`D|$HЃ|$`-fAdX=|$@f{NfAbPW?|$8PH|$8;=Ac.zwz fA_|$` |$@|$x vSfAZ#|$ )T[H[|$p~ F@-f vAA-|$ %VIL fAZ"GfAL}|$HA f&|$xB|$pXugY |$x&EI|$`6| 'fAZZ,AOg A1|$XAFs(|$HI|$x+fAZF+JA|$x-s|$H[A=hf.ArTuC|$8l1|$x"Aa-I$ h|$H  w |$P|$`v|$x$ {hAVC|$@O3}|$@|$H Ag#Av Aw A<T+A'd y|$x7-= "|$`D$)A8ZZ &Ag|$@T|$H jlo|$H|$p$t)|$ lU|$H( U%|$p''fAL-Dw$ S\e|$(u;A).|$8 A&1|$HЃ|$`$fA\fA@D|$`/Pz@z |$pf.`oS|$x0w#$D+>j yg|$`l$Hu WA|$x3|$H|$xYfAWHIm||$`lAK-|$pOIR|$x<r\r9 <fA^9mV fAa0A1|$`!p]x|$8&9,$_g|$pҺAA wYO|$8cAZ5E }Hr|$x9-"#fDv  1D A Aed6fA\jA5&hf$|F3|$8`$ H}d|$p}O|$x%EU|$@ `A6nRA3ɱ|$89f$H )Mn|$x 2/dfD|$p>A\6m ƒ|$@t|$8]$ vT]SDD "A+ H|$83|$XʺO AM|$x zB_$Iv*|$ 6|$@~>|$`)f|$ $ o|$X%|$P@$@|$@0|$H 1D AB|$8;D2!AcǍfAc|$85v|$ps¿鸿f.|$@鋿 wAtjl|$`(8|$XE;1$  |$`SP ^|$8u^ C^AƢ鮾A Ѓ镾E 邾A.eiTC1 0|$`.|$XW>A)VG|$`:8|$XYlfAYȳ|$@!v鏽fA\SA}R2|$`IЃ\1lID$H AK 4Sn\3|$@T |$`:7|$x??v'v|$@׼ffAN!|$`/A=A[h$J|$x>||$@(Ѓ鄼fD|$`.R3 WF$(/FzF1 fAO |$ K9$6 |$x2|$`4ֺ|$ ےO ϒ騻f.1AC鍻||$H%|$POZ|$X \d 0$`f$s :fA`mU|$@|$H |$@   鮺[ fAY/m|$@.I1|$`^DsD|$P"'' Jz v|$`-* f A|$`5 aʹ|$8>!1|$p^r 镹|$XfAV%dfA[64|$pgA}EA^6 fDfA[A_-9 1θ1黸鱸|$(铸2郸T$(r 1|$`&u1H$$-W=A\%2D$V$Ky2`˷D|$pS|$ eD 靷|$@鋷|$ $ AB&`|$HN /!Aj{F|$HmQvmfAb\!AD>D1,q 1|$PζADA1鳶驶gO鍶$fAI W q^TAFw 7A |$H I|$p*IH)f.Et|$HеƵ鼵|$ 骵$Y#$|$`&MuAGuk|$@r%DK|$x*Ar*T)S$D$ ݴfAWʹ|$@_0|$`2J Ѓ饴|$x6!|$p$D|$8k U|$@JR$5$A>v$%1 fA\! MAeLJvfA[騳fAWfAOH|$H ZqwAh G|$HMCR"G?T|$x |$xЃ)"A2ٲA/# Y鶲鬲颲fAS&fAQ|$HAScaA&A=N -|$H#BfA^B$}y|$PyfAMQ$ϱFv|$P魱Aj%|$8OV|$x,醱|$@",AUQh|$H /fA6$Cf'P|$`$p|$pA2|$ g#$NTA?~|$pk~魰|$x#ƒM M遰|$ \$cfA[)$U|$x1ԍ)S|$@ |$pn1*dA$?$黯jv|$x3陯O鄯 )A9؀UЃ\;AJ;?Ѓ0|$H Y&OO|$H|$XVB |$H#B|$x*ʮ|$pd#|$82jO|$@7d!|$H<|$@<|$pJd2 X2ifA]\!AXNAKb|$p.$ vfAZ|$@:|$8'6A!e|$x)龭|$p'!$Z 雭g^|$H}|$8rd|$p3d-T|$xJSWfAFC$ZA|$H5|$@bAfANX|$@* ֬|$@4A(髬 [)|$@?鐬|$H0A4`|$xA+fAa$o A0h|$xO$|$`##$Y|$PCī|$xLV0f頫AP%|$x/~OarAx+/|$8r|$8p+W$TĜh.ux 8fA^8X&A'ڪAAX|$pXX魪|$`8Y鏪$Xi|$p9 OA5ЃcA[v LB|$pXs3|$`!CbA>|$p[Au|$8M(|$@>4Dq(D龩@ HP 2PZ銩 w|$P7?fAEh|$H$>fA=C,|$p 1E|$p V|$HY7IAXS7|$`'+z|$p]|$8f 鐨fA_*AJZeA?vN dZG|$`*$AKD|$p`$pBp|$@ %wfAVW. MYA,|$X|$H y)Ae)|$pvP)D)鄧|$8I)|$Hg%+W HfANƒ(|$p5($ƒ|$@&u  k|$H|$(2z9|$8)8|$x|$H3@Ѓ鞦e鎦H L$Ѓn|sI$E|$x$DzW|$pA=|$H E|$Hv鶥AP.|$H|[$pTq^ #-|$X;|?$v|$@Ju |$pr `D6|$@*6 Τ|$`9%|$H%YT%AH阤fAT"AzgW AOb|$H%BDA@G|$PY5|$XYG&$r9|$ 4MvAۣѣA^-|$@'cO驣|$8g'UQ`|$pWn|$H\$[ AK\1|$HЃ |$x3$E|$8Lm|$@ 6ޢfA6L â|$xu ZO馢N *^|$p|$@AYEb|$HfR $1;|$@ 1/Ad'/|$pYV|0ڡ`D0|$H 90鹡$ w'|$8_W$>>|$pS_|$HTYFAUI|$p %I 1|$@t $ALS$ ɠ|$H<&|$p7`|$H _镠T T m$sU|$@2|$`.E|$pK |fAY|$pz|$p#v|$H |$ 8fA_hP9 Ÿ N-ATD-颟L c$B we xn V$=},|$`'?|$H( _|$8.4|$@4 p!X|$HAW> 龞Mv鞞svfAW|a%K|$pJU|$HCJA)-|$ xߎ|$H Ԏ fAVf%AO8s՝-fACY- 鮝|$8@NG_ ;|$8P |$H _# NfA^N2uH$ PMAsƍy$ o|$XF|$@P`|$@6`鞜AD|$`.REƒ|$@u6f\|Y8G1|$H70@Ab$*A$yFA<3A31fAV鸛I 霛$.|$p6.fA;M|$@ v|$`2UK(!|$@V(! Aƒ|$HUN|$`4JN|$x?NA`ܞ|$pnЃ镚A/& xADQ$ Vo|$`%DfAXL' 7R$ƒ|$pvEA#ՙQt餙|$8?e$abzJjeWvA(@6 :@}9fAa|$@^$|$p-w,A˜鯘A*A*錘|$X4@+7bfAZ87th0$$$V6|$`:kf/. /—"P`y :`' 鎗$%|$@-@A|$8cAi# #7|$`<% -#AL>A/h|$x&|$@v ؖA=$w 鰖$E!0fAVY|$`3v|$p8qg|$H ЃV%Q7$5%k r( AP|$@ PՕ|$X6FA|$8so,|$H魕 锕 違n|$x,'C'M\Av\'q]'$1Ay(|$x ƒ|$pyA>鿔|$p)|$x'M閔J郔&UBoAq^o$z 8:|$Hz\|$x'|$pv vAߓՓ|$H"T%-8|$`Dhw$|$H鐓醓|$`4Eo|$x'vNDs  (|$@}ACb|$H  T)$ |$H? 3鬒Aw_*|$@/΋zd|$8^YmfAaV)$-: Gw@6^z!Aa;q|$@r|$HlAV$ += {Z|$H$w|$@%鉑3vA;v_UC"|$`/_|$pXBTXP|$PO|$@%vfAQ QU|$x6e`o\ (u fA] $t|$Pmc | sv|$p`9/$)&|$H |$x&#_ ' '̏|$x2x,vAW頏)Af|) {(|$phWd!IJ3|$H3|$p)Lh|$pEg|$x|$(|$@vŎ黎Ѓ鬎]0Az\|$x#鄎$w.A8r|$pur|$x$+$*$5jAS% 1v>鴍n1b1钍|$p91|$`3q|$x?=qxO|$ Z+/ ZAI|$p8j^@|$P5$e|$HdWd ʌ)|$pP!VAN|$8#|$H 錌Av5gf`PAfAL_1\|$`@\|$x7|$pXv|$`.6*|$x1+*ԋsk2A麋Ak驋 v|$`:釋|$pV/TZ] &H4R|$x)_ 'A )|$H a|$HJW1fAcD@|$HwA4ˊ鷊|$ RR3\p$鋊|$x=#zdATd|$X|$P1fA_E|$ 0+|$`6,[|$@_|$`1JAAAI[1|$x&XTX|$H Y$1A鯉|$8)vD鐉A vyo ("kAN_=*|$`|$XAP|$X$Ѓ݈Aẗ|$ X7+|$@k飈d鄈|$ {)SZ|$H*Z|$`3^ fAHh I *|$p#.|$Hf|$xvfAFfAZ#AGv|$@ ҇ȇfA].WfAVA^A7^醇A$|$H j|$xS-|$`)|$@ BL^P6^$ %^|$pk|$ nkk܆A8.|$`,W鴆顆|$8G)醆A;'i$0$ `[̟|$ ]fAY *'|$HWfAMWυs v鯅S|$`(SS yf|$`4$(|$pSihA=Ѓ7|$@ FF,:|$pۇ|$H P r4|$HȀ 齄|$H髄A>wfAX;wAc. 77D|$H7Dv|$ |$x_DfA]7cfAY2vfAM˃|$`31Z 飃4v|$`9u|$pK%3$ q|$HG|$`;:)A^>dR>,Am:5fAUO߂$,|$@l {zЃ騂|$x+w 醂A.|$`Nr||$H|$x0B#|$`".|$x'c|$xdn v|$xׁ́9 5fA]i$i ufAY|$`4A!cMAAn2|$@h28$<|$ Yl|$HPAp50|$p>|fAae|$pfA[|$`:cD隀$q:|$p;|$xHƒ|$pBS58|$p|$ O,|$x/y4|$`=|$p)vaw|$H  3|$8?D|$H9w|$H*.1u|$@uC-#|$x-z5AH2k|$p6hk|$H|$H~fAG~~~|:~r l0|$H ~|$x1: `~|$@4K~A~|$p?FE~|$@Avt}}P4|$`7wg } g7t }b 3$k3|$x2Jp D}Ѓ5}A!}|$x7B|$H']A|$@|A :$z:z,vЃ||* |A(|$pn|$x2lcAn|$H=|'|vfA^|{fAX0 {$ k.|$ }c|$pp0c$x w({{ lp|$XOc{|$`wN{D{1{^06A,{|$x6nAn|$@nz|$`@J4|$pi+iA{ |$8|$pFK|$H 7$&zA :!ez[fAb[dwf;z1z|$`5s[AT_[$Q[z`y|$p%5Evyy|$H ƒd dy2y|$ 3A|||$ f|$xǀ|$88xrAh"ywy|$x-7,+PxЃxA)2&|$pYYx|$@^1ARx|$XAOڇ|$X)|$H UxA!AFx|$H/xh|$x6$> v|$@xwfAK|gw|$`)~|$x'~w0w$"6yAS,yh|$`+t8>w4w|$p\Q"|$ 7ah9 w3|$`8zy|$Xyv|$HvE.|H|Cv|nvA0c!1Pvo.>|AN|AGF|$`#O}9}#}${ }|$8=|u|$8z!*|$XU|k5uu+|$ L|$8WϼM[u|$H  64u|$p"uA  u%t|$x'8|$X\=<|$x%v? tt|$@ -|$`7A;;t|$HntvAZtPtA1vG9t/tAvttw|$`ss|$HsyR|$xER|$@0RAJ&Rsss|$X. fs\sRs$%|$x XX s|$8>po0dorrn|$`>nrr|$pP>3|$`43 rAw!|$H|rrrhr^r|$x9" S|$H%5r"rr$l|$x 3A1wqqqvd(q wAqq|$H _bqAEfsZsBq$o *qWqqpA,A7p$O#7ppAaV|$ -V$Vv|$Xrphpb|$@t 6p,p"p|$`5i6C6|$x?o|$x 3X+2$voo|$@B2oa (;|$P;h do8Eo;o|$pw7Ao o|$p8|$H5A,nwnn|$x+Y fA<c6nnvn|$8UnKnAn|$@<|$`!!nn nn$_HH|$@Hmm9mmmmAK<|$8Ga|$x(fAak|$@Dm:mA5fEm m|$`) K^ Jl|$X ll^Dll|$X_pSpol\lXLl =6l,l|$ V2fqAe ƒ|$pYtfkkkZ|$H xZk|$`5L`kkrk3ehfAa.h|$pmA5fA`ɵ+kAM',,,j($%t |$ %j|$`/'k(AIa(j|$x'>A >|$@׊ejfAHdU|$x%DyC?j5j+j!jj jArU iA p spAIiv3iii|$Xa i6av$ZiPifAU,\S2i|$XN$+N ih|$ )|$`7)x| hh|$`90Wh&}hshII|$xI|$@MhCh  M@'hhh2V&VgggAiGeGA;g|$`=|$Pv; v|$`8ygogeg 1AS0|$x/ |$Xd &gq)$ g|$H AfA.2.$ffAAfu/|$8FM/|$@?fAbA%A*Cf9f/f|$`=(|$HfPee|$@'v|$Pee|$@eee|$`g)Ax_e|$@a//AX$eA=>dd|$`:A8AdA+F A|$pQv|$`-dddAD~d|$p#+ |$8]A $D$HЃ+dfAR)ARZjccfAYfAZW-yAc|$Hc|$@+lc\YcOc|$H'hA$c|$x$cb&*fAa*q ܛBbb|$x1+|$x,/~A bvb$}4$|$`2fAaEb 2b(bfA_;76Haa|$Pd9|$x;,9|$p=|$p  $aaaaa|$H?:|$pDA0 UaKa|$@ =|$H=+a!a|$`=ANt``|$ _=A?v|$@ ``|$`$*=``tC|$p{Eq`D@R`H`>`4`*` ``|$P|___A01H1+_Aa6A[A m|$H_>r_|$xHT_J_A7_1|$@ }|$x0}|$85}9{$^fA2Al2|$H^T^^$^|$`.*|$Hx*Aw=Q^3A^9 <|$8^< ^^$%%16k],A, ]|$H}*^*ƒt]] Ѓx]S9|$`88zfA]y7]l1A 1|$8c}u} \\+|$p/*A\\C \A9\AE?|$@?|$x) |$`|$@ݿ|$XI6*:\0\&\|$@&6a[A4AeY[AA ('|%|][|$ P01fAVD@g[%33I[?[%3|$H 33[|$pI&0Z+AQZ|$ $($'|$`7C}|$88}A$Q~|$H.~A2Z &P|$@ Om|$X{JZfAY&&~{|$@c{ ZZ|$Hy)5YY|$8FT1ЃYƒ|$p{9t-tY~YtYjY`Y|$(6A'68Y/x *|$`'vvYYA;t ?)XX''|$HAAXAT.^-jX WXMXCX0X  XAG2o+2VWk,HWW|$H W|$H-A-fAXp|$pZpMqAqY+qTZW|$p*3$7 1A(uAu|$x7{. W|$HVVV>AЃVvI|$@ЃV|$HWAHA V tVjV|$x7PFVN|$H N|$@ $VUUUA%E|$@ A% AwUUU|$p*EkE|$@vTUJU@U6U|$p3vUUFUgF[FTTAT|$@|$x'܄ATVPeTzT|$XB$]TST>|$8V>A.1T'T=v$  TS|$8Sy@FfA%FfSS|$x#RA Q|$8SS{SqS|$`9V VSLS 9S|$8j5|$PK5|$8Y|$Hڶ*ζRR33ARAt3A^M$RR {Re23|$ ;ƒ|$`7tJR@R|$ >fA\RRAЃRQ QQQ QQHA|$8{ |$H Q`Gd cQ$HBQH|$ _H$o|$Hn|$X4+PPPP|$8]7AP7|$xվ$|$8L7iP_POPEPI L$L|$pW͙OOO&v|$`>OOAxLlLLOAMG:% mO ZOa[G ;OO(OOO OONN|$x(|$8m~~ vNNNNNN|$pR|$`:<fAMƒ|$8a$u 0N@IA<6I N  $9~|$pMMTЃM1fAVD@M|$p |$`84|$HoMeM|$`%{;|$pUwsBM8M-6 6|$X sjMLL$:LfA]85LLLA ~LtLjL|$8rQAxyQ|$HA{-LA"4yLfAF B|$x7|$@AfA^u|$H  |$x1-K G F FKA=: t{|$p~6|$X>>TJ$0fAZW N%J5D$H w|$8@II|$XNII$g m |$@ IIAP3fA?Y3|$H|$HlI}5 ƒ|$x6t =I3I IfAEƒ|$@;;O%Aw|$HHHH;$ HHHxH$ BDTH[ AHAB0N%v HH|$`C.I|$x}AfARrAG|$xNG|$x1uE|$ AE|$@_|$XWU|$xG|$`6oG|$p3<o<|$@$A3GhE|$x-EG|$@Jߜ_ FFFFF|$@Fv|$8RFF D$uDbFXFs 4|$Hv|$8z5F+FF|$8Z9|$HVE;E|$@EEE Rv|$@EEAHEA>B|$x(}T|$H+R|$ R|$8,Q|$`0Q/E%EEE|$@CF|$X7fFD|$XlCDD+S DApIj{DfA[9|$x% RD?DAa%D$w|$8[DCEC|$x=2C@EO CCfA`$ <{ &{|$H {=CLE!CDyD fK AatR BBBB|$@'E|$p0lfAXafA\ѕ |$H fAR|$p1E[BKBAB7B-BfA|$@qBfA\CAA|$pry|$@Aw {AAay|$`Ly|$XAyyy|$pnx|$ptx|$`wUAKAAAA5-rqA0qA.Awb|$xp|$89up|$PLpo|$83@@.@|$x1up|$ >Qp|$@@z@p@cxpW@M@C@9@|$xFp|$Hbp|$8a@@? ??$??w|$@?? ?$ x?n?d?Z?$xR vAr5?+?9 ???>>>>w0|$`4>>>>1|$P>!x|$x*xw|$pcwV>|$`6w/|$Xg1>1D@ >B>> ==aЃ=|$Pfw==$|wFzf|$8Wj|$@mgAWe= R=g;g'=A jf|$x.If|$`%4f<|$xfA><<|$8Oe$ *|$`9v|$H <<{yA4fAcZ<p|$Hp6 6AiA0w6p^62$`WD46#fA^ |$8Yv|$x55|$H 2_t|$`3|$x3zfAZosp5|$pv2{fA` {z$#z|$pz$zz75wA5|$`A|$`6|$8(e4|$p=w|$Xlwww4A}zz|$8Uz|$x1uzAM|4\R `4$ u 74-4#44 4 3pU$33|$H3|$xE33|$pTT|$ =Tk3AW3XD3Aea U$33b U|$X|$p ,|$p P|$@Q|$ P|$`8TZ,fA`ʹ|$`w-Az,|$H0h,^,AZ^|$x|$@!Ѓ|$pj„t%,,$,$|+A<+Ѓ+S AJ|$@ [+++|+1|$Pf+Nv|$@/Q+G+|$H,+"+AKJ|$` J J * ;J$ JA J|$x5J|$`.Jt vAc**|$@r*h*PC|$Hv|$`=E*;*1*^ *|$`EG|$X[C)AE)|$@9 Ѓ))|$`)|$`>w, v9y)o)1|$HY)O) |$@ pO]OfA[@O) )1fAAD((((((-($IA5$({(A!C|$X C[S(@(6(,("((((''N''A:3|$H|$`!ڳ'|$@M{vfAbk'a'vH'>'0oN2 YN MN'&|$(rD|$`C]D|$puBAE#~&&w!|$@v|$ &&|$`-w&fARͨ|$HfANn|$@Ƭ,&&sJjJ%%A%%%C%|$8T5|$ '?n%d%Q%G%A:6%,%@wFA`A|$`.E%|$H.JJ|$H$|$8g@|$(@|$x*)@|$@?|$H??|$x?o?c?w$]A[$A A|$x ]A3$)$A<A $|$XfK|$@ QKQEK###Ay#I##}#|$8N=|$x\= T#J#@#-zIA &#U<|$`!<#|$x|$x"|$p=|$@=AW"fA^<|$H<"$A;fAc?=s h"X|B@"fA2<|$`H<v|$x=""!!!|$X;A%:Ѓ!!!!!@!u!D1vP!F!N|$@ A  w)))  |$Ho $ |$@*|$pGA|$H  $ |$@զA|$@vD\$ur*|$`)QG=3)|$ $ЃADwe$ wX|$H1IDwm|$p_w.|$HT|$xB8%$C1fAdD@΀la|$`5"|$X]Tn*kXvAA7-|$p*w>|$p AKw D1UwR|$pvw$xwR|$p0A?NfAZO7|$HAHx|$@ e|$H |$8~ }|m| mcYA0& +$e0|$pGl|$Xcl|$`;NlxW|$H|$Hy^{|$X{A.Xz1fAaDD|$Hw!A/w<&|$`={|$@_{|$@  $-_{|$P6{|$x&ww}$&lm Ѓ[|$P3|$p(|$p5'$y$zyfAW:yfA^%yArAa0F|$@$T|$@|$x!~|$`4}}A9v|$xRH|$x)|$p{}|$@ }|$ph }|$@>} U}|$pIJ}|$@wK|$ 5}{ A&j}A*V}J}xfAV|$ 7|$HMgOAP3|$ TЃA|$8utAw W{wZ|$pAvSfAIhA:h|$H h|$pLyh|$`?Bh,UKA:0B ʂ |$H_$G1$ րA fA]|$HAXA}|$P|$H`V$^_Ѓ6,|$ [AuvA fAc fA^|$PFHv|$X#|$Hqg]SI?gAU%|$x.=|$ x|$@|$`5|$`8w[ 3rAJr|$@q q )r|$`7rzAXʅ |$X$~$6w>|$x3p|$@p|$Hp|$x"A |$H # |$`Bh$-hA.h|$@h|$ h|$pNIi|$@ +i|$Po|$@oXfASOA|$XL\|$`+Eu _|$`7(" uCs`|$x4v|$@LB8.$|$H|$HTeAgf|$`0|$@fAZ3|$ w|$@lys$-rbWw:AwmfA`m|$@k |$@|$P|$@݇ чfARkA Ѓl1fA[DvfAXl|$xBlMC9Y|$p_Y|$H |$pB|$x1}|$@_A7KAAɍ }|$X Of\;w*SЃBwM*$$|$`(|$HL fA@%  |$H}|w m c Y O E ; $#  |$`3w0   |$@|$@ |$x* A |$pl|$p][$C|$Hv W M \ Q g (   A$gЃ AJwJAF|$piCE0fAa   ?d|$H vw m K wDXG`A`L$(;+ !   ,BЃ |$HFA23 I   |$H | fAHC~|$x/.~ S I ? |$@ $HAЀ*    [  ~r~ C|$p ~|$@-~Ov ARw9|$ bZy|$@$W~bG 7 |$8]{A {fAY{0 AGz|$XHO|$ ||$`<|$pBxxVy|$`$ƒu VLB8|$p&|$`&.؇" v|$p|fAS7y|$`|$XH|$8g3|$@|$p~X|$H iX$[XGw7A X|$x3W|$@$v|$@ x|$`,xOmx!uVUMUwm$W\vA\r|W10ATS|$X=vA$v[ALK|$H dCKBfAG-2 y v|$pC]SI?~ ,"|$`7@|$x&L |$HA Q 1AP|$ W $ |$@,Ѓq|$@Fb1h |$H ] A|$x)/%Q|$`  ƒ|$xt|$x!vcARM mM aM7-|$x4|$xv|$py A:+_|$pD@L$qA[|$H |$@|$XAwACSt|$@hfA[]KA:A wGfAY |$x4|$`@AH}|$8Nv L ?tL |rh|$ v)|$pSvA+B8A&`\P\v$RA|$pz!d|$HЃtw@|$x.|$HwSI|$x*I1RfAP\|$@\)  |$@ |$@Ѓ +I|$ T|$@|$HЃA |$x' |$@ RADcAA S|$pv$^[K[#|$@T|$p |$x"Zƒ|$X:t|$H g]UG A7-5$5Y|$x.Y|$pQYAfY]YzXO^|$@Z}Z=* RmRH E)|$@AY|$ Y{ K pf|$HvsND:0&qxM|$HNMAO:MfA[j|$x,w'OwA3EE$-P wm;{ DfAWjNTNHN(AI Ani|$XPArP2~QThQ _QsfA^CiC)gC[C:=WAzuHARRB{ }gj|$pXN|$@w0|$xvABe!}|$pf|$`*fA^,cwA@vsi_$|$@|$XfA`wv|$Hwo|$`!$ @v|$XuAAƒ|$ uQG^4*  |$H|$xw|$@vzpfSI 3Vw!9|$pw>w,|$Hw%w$CfA`uvlb|$`8wL|$pIw3|$Hw"v|$x75+!|$@AsfAT|$x1wIpЃ|$x8wNKw<-|$X}@wndZPFDЃ4 w,|$@wC|$H |$8Zw4A$w wlbA<QAw48w3Kw!|$`8v|$@$Nw"v|$@xnl[QG$ /%AEwfr |$HA=t"|$pkwA;A/v% wzpf\RH>$) $) w>|$@w-5w%|$@Ѓ$ v:Au;we[QG=3)|$@w">w|$xAAw|$xv,ASw|$`8#$8 wl|$x(ƒ|$p9tnfA\Y|$ 2t=|$H t6v|$X}N^TJ|$H,Abv~!wvG|$x*/v;|$ *v8|$H v'&|$H qgA&|$@ |$X.|$`B|$HvD|$`6w3w+|$x*wO|$@w'LAdw5 v- fAXn$ A}wp|$@mZv/$wAl7-#|$x,fA`t4v"(v|$p $|$p|$x-1D@av|$`4w[|$x$w3fA]"fAR~\(fA^E|$@v4|$ ;wGfAZ'w$|$ w|$pOF|$p/w1c&2ЃEA4fA[@wF|$x(w5ADw%5vmwDS|$8@v{|$x0wtv?~we[|$p*vJA7|$@%A |$8)|$P|-|$HAf|$`0w%nЃ\w) EB8.v? |$HvA@|$pFwG|$Hw6ABw'vw*ndZPF<2( |$8Kw$ЃAU?|$xfAaO|$pwPAKv@$v|$H nd|$8Mw'J@61fA`$wAuv $w\AJw6|$@|$8H Ѓ|$Hua`v$zfAb6$hWM#Ѓ8.Av5|$x/v$`$Ѓ|$pw"|$@wf$a A?w8A;w($w0VLB8.$$  |$HwG|$`hw6Aw&w !qg]JAm9wxЃ$|$H|$@w.|$Hw-zpfVL|$x+|$8j Ё u|$pL|$X|$P |$pAa|$HwDw5Jw&|$p~tj`VLB8 w" vfA[Acv|$x/|$ w6$w"Iv|$Hoe[wq|$x8wX|$@w"vw|$x+-#AwfAI|$HfAO|$pq|$ B |$@Aw5w#Aevpa]SI|$8ZwTw&r '|$pn v|f |$x0wO v= w"|$Hv % ^ { Xe$MC9& v|$X!} qs[)l Zc $ w!$y Ѓoe|$pSI7wBv3|$xv"'v|$@  |$HvL|$X;fA`~*A]v$GN|$8[wU|$Hw9fAZOz|$H vFbXOCv9w1v"v|$X|$HA |$`Cw`|$xw7rv($B>ukfAZ8v&I6,|$p]|$85}uA6v Qtj`^ Att$vj|$Hw0v+.|$X .|$`=v ( wi|$`+w/w~$wUwP w6|$@ w%YwKF 8.|$HD$H: yoevAND:AC|$p_Sf |$xn|$@P1 kA@w~w!vAPu$|$px|$X}vASvf; U3 v" v|$x  !|$ppw!AOv |$XfA^u$_/wn$w-_|$HwfAUv`Hwj-ABw? |$x.wAA|$x< 1fA_ |rhUKfAbfA`|$@ wOAw3;wSfAG9AK|$@t |$x/w0|$@ w)qv+wwmcYOE|$`@fAN|$Xw}[|$x9vJ$A V|w"v|$p*h^1N Ѓ<|$x5w5k v#  |$H 1fAK2ƒ|$8-@%4|$x);A|$pJ~NhOE|$@w-w%,<v1fAAD|$@(|$@w<|$Hw#qGt|$pb|$`</|$x!wXAvR4sfAV^1|$H  A>v"vfAFP|$ -A1wL|$@|$89|$x+wOv=$>w&pT]SIfAV|$X}0|$x0w)|$8Dw2w AЃ|$@w"v|$x)|$ wH}|$8C|$@ww_|$pw,EA.vkl,|$8=tfA^_=Swpw9A=w 1fAN|$86|$`9w3fA],|$x*wR]wf\$wL~w,A6vw/%ABv-dw%A6v$AfAU[fAS|$x+w}v4Ѓb|$x%w8w7@6#|$XADw`JMvfAL|$x/w`|$p7wA|$@wt1fA^|$`5wa?fAX~)|$@ Ѓv$^TJD$pH3|$p(wF$u$A2w2|$p7wQw7$pv|$85|$`4|$@Ewm|$@wUKA5wk|$x8wZw7|$pv0(A-v4$wfAU%AFp|$`'uAw$^TJ@6,"|$@v?w-Rv%w'gv|$H~t|$X}zZAw$fA]~$:0|$X-"v|$H }s|$`4aW|$@w=$v09|$@ w)|$pRw"$h |$Hwmƒ$uNowFfAbAD|$x{J@|$p3ww'#|$pD|$@|$ wr|$Hva|$XZ|$xv9Aw3|$xw"$U|$86$S|$84w`$uD|$`7w)w!)wbw|$H )qЃfAbfA`y|$89|$pm|$`!A|$H,!sJw0X|$`Aw !;1'|$`&wu|$pEw/A6vNw$|$H ЃvfA^A@$A9wkvYwQZP|$x"i|$8.M|$x |$HwR|$X}W|$Hw>wj|$P|cfA\~\D$H |$H |$xwBA8w)$rh^K|$pCfA`A8|$@[fA[F:|$`2|$HLwD|$`)wC|$pww!|$POvJv^[-H$0&|$@w|$x~v:ؿ|$pBwqfA\`|$X}|$`8鱿駿fA`S@H|$x&Ѓj`/|$H9|$x'$kwJ|$`w0Av`MwF Ѓ޾1|$XD@˾|$X~n|$x!wU骾|$`.阾6wBA|$`,"Ѓw>|$@v-Oعhw;鶹|$pv.|$X}镹鋹遹|$@ o\R$vw v3)#v|$H vaٸϸ鿸鵸髸顸闸|$@8yo\ww,w%|$@8ЃfA_7|$@=w&}!Av鷷魷|$H 雷鑷釷|$@%w"|$x#wh^TJ7-#w<|$X ~5 |$`3w8&߶ն˶|$@ v|$`=骶頶w"銶逶vlbXND:$ w/|$X ~(A̵ֵ|$@v 鵵髵页v$|rwWM|$pg$-|$89L|$x|$pdwswa1D@$ |$@ww|$@wMA.w=$nw&|$x4锴銴逴vl|$H  A:wJwBI%A0j|$X fATA4Գ"wk|$8=wJfAT9w|$8:vE闳|$`9酳{vL|$H aWD 1'w.|$H ƒ|$8.t|$Hwc|$@wKAw(w#ò|$pv|$@骲頲鍲A|i_UB8A4*|$`1v<w!vAITݫӫɫ|$Hw4A鱫駫fA%%|$ 6鎫} {|$ QE]|$x3% Ѓ@6|$@:w_AZЃ|$x2w!vA;w3|$@v" wЪƪ鼪鲪騪鞪锪銪fAMA rhUK|$`*Ѓ:0&Wة|$HƩ|$`7AJ|$8>|$@ A:|$x&wr|$`0wL|$p?M#:'dw!$v֨|$H5u||$`7tu鰨|$`3wl鍨w&Jwi_|$xw8E;1WfA^~uwmE|$8B|$X}|$pqƒ|$`.u_[$w;$w阧鎧A@};j`M|$psw[w@|$@,|$ AEئ|$p?wbASvR|$H 鹦|$x*6|$ ,p|$HyovHAMv8:NDw')A>wN|$X|=|$X#v鵥颥阥AMwW|$x#w6xwnv\U|$`:vV;1'A- |$Ps`ؤΤRSI鯤|$H靤铤w6xz_U|$8YwR};15w-A\w'$vmߣգO魣飣陣鏣酣{|$@$w($6 vVL9|$8t'|$`BwޢԢʢ鶢鬢颢阢鎢鄢zpf\Aw0C9&AY١ϡšnwALw魡飡陡|$`4w"v|$@zpf\A=2|$xw"vfA\3)7|$PwB|$pw!fA]|$HfA]JȠ|$x"|$H Ѓu鑠|$@vyoA8w?|$pw&bO]<|$@* Av/vbן͟ß|$`|$@$vGmw?鎟鄟|$HvBw0$tDwYOE;w|$x#|$p4vAZwڞО|$pa|$X駞$鏞酞$w0|$@Ѓgv|$`4RHЃ*fAbA EuL-v:|$`/w#QvlݝӝÝ鹝w+Aw|$`v隝鐝醝lЃtj`Aw3fA_~"|$x,w 8.$|$`3ל͜Üwe騜鞜fAAO釜|$X|$`+woe[QG=3)fAZH|$@ ЃBڛvy2鼛驛韛镛鋛wJpf\RA;wu9/% ݚӚv]靚銚通R  aAE+8.$ |$x$ wk wPAw= w"v|$@ڙЙ齙鳙頙 v }s `|$H ND:0|$@1|$PD@AVwUt=$v"$ИƘA 鵘题鏘酘APЃi_AZw4|$@ J|$@|$x'w0%|$@|$H|$H wHATw8$w+ڗ|$X}|$H ×鹗鯗v&w阗鎗鄗zpKvWMv62Av$Ѓ|$pږ|$`-鳖w-雖|$X}e遖w(1LBA|$H  |$H OЕ|$p* 馕|$pvww($v} yo; w A`vfAVQGA y(!|$@vfA\  |$ $wv|$`;w3|$x9w" v|$@ 顔闔fAR~t ƒ|$x6uU|$@wN @[fAY$|$X|C 0&fAY"v|$8^ ֓̓“鸓鮓AH|$@vI 銓$ $w)|$@Z w wzC |$`;(|$`?wD$|$`8wWAMwG w/4 Ӓɒz Ѓ鷒餒隒fAOZ|$p 遒wm|$`4vz wrwWC9i v(|$Hv!; vAJ yTϑfA`D|$`.w&|$@鯑饑雑},[w$鄑|$pwj`6w"v|$@@6,'vR AIЃېѐǐ齐C骐預閐錐邐x|$x)v\|$@`_AAv:fA[#ww9/ |$x,w2|$XO!|$HE܏ҏ|$p|$x9wK顏xv遏 wKpi|$X|xw]|$x2ƒ$u2w*1w"$Ў|$@U馎 铎郎yofAO?WMC9vfAb!|$PO|$`; ߍ|$`=͍ 麍鰍馍|$@ N 鈍 u|$HtF$v2/Q|$@w|$`;vn|$Hwg2(vfAJywLAgwF Ռˌ|$ w-A`w騌鞌锌Mv|$H|rR_UKT8.A|$H wkoADvOA8w|$ M֋|$pBwo鼋鲋lw-|$@wgw鑋釋}13 j`M|$Hw/v+! |$X|$ $|$@!J鰊AAU|$x2wK|$H鄊A@$Ѓ^K8$uANv͉ÉEuFkw4w,餉隉w-[邉xewuJ@% -#Az2$xvyv鼈AtwL|$8hv;Aow" vfAV釈Wtj`VLB|$@v|$p+! vNw<|$(w5·qw&|$p~飇陇鏇|$xƒ|$` efAV|$@H$|$x+w!|$x/v|$`@|$X†鸆鮆餆隆鐆|$8^wm5w.|$x-o|$X|$pЃS|$HwUЃ:|$X|$`7 y|$ օAwOwG|$`;w!Av項|$Hv,ABww遅wmcЃQG|$`*v92(fA]|$(tAvVA:w2|$p#(لw-fA]uw黄鱄駄I闄鄄ABwD|$pSw!|$pIv|$P`V|$`+wK~w/Z:MvfA`%D$@|$xwRփ|$@vw|$HwN鵃髃fAbthA8wbz|$pw/wXNDAvA,"ނ˂鷂g餂隂鐂}fA\~*efw|$@LB|$`-.AA|$x#wOAv?nw-鷁駁靁铁|$x2A A{u|$p g]J@6w9ADfAauw ׀̀|$@Ѓ鹀鯀饀雀|$@ zpf\RATwL|$@w8A w22( |$8m|$@|$pw'|rh-w1AwJ@A/|$pv=$Dw'p~~~~r~|$@ w7U~~|$x.w%1}~|$Hk~ [~AxJ~@~6~,~"~~~~}}}}};|$@}A Ѓ}|$`#u}AZ(X}N}|$H <}1fAaD@)}}} }-wm||AGw$w||$H|| |||/}|a j|AY|O|$}6||$HЃ%||||{{{ACw{{{|$x-w=Nw+ww{{{x{!e{[{AJ{@{fAT$){{{N+z )AOWzzAhE$fASnzzvzlzYzFzvCAy7y-y#yvA v< yyx|$8OwV|$POxD$@xfA?ew1xv;|$(t!|$H{x|$HixVxLx|$x2w&#2xx$ xxwwwwXwwwЃwwAPwq|$`@w` Ѓyw|$x1w9$<w"|$x-wMwCw9w|$HЃ(ww|$@wv|$P~Gv5v|$X|$@wCvv|$x3|$p%1fA3D@}vfA^|$HfAZV$|vB|$x6w%w,|$`w%rr1D@rrrrrzЃwr|$p,ww|$H wfVrLr|$X5` wNAvH-r#rfA@Kw9|$@Xv2rqqqqqA[ |$@; quqkq|$`+wF QqfAa|$@wx wM|$p?w7Ѓq$tqp|$xpYvppvAv:pfAdh|$@vW|$Hw8wpupbpEJp@p6pAC$G$vWEoA+|$x |$`(u|$ ,wDAo|$(viAwK$|v4A9wo}oA>lobofA_0A/Jo|$`(w5o+o|$x|$pxn/Ѓn|$ tg|$`3wE=w*fAUƒ|$8'u nnw }nsnin_nUnqw1|$xv  3n)nn|$@m|$HM|$`,|$HmfA`n$ w?|$pummvXAEmm|$ vim_mUmADm:m0mЃ!m|$H mmA\wAll|$`,lvoL wZ@wRlAhw0w!|$`4w|$@lulkl"ЃYlOlElAW:(llwlkA>w7|$pZw&wkkkk|$piw#vkkw(v lk#VkLkBkfAO'(kkk|$xƒ|$`;j|$Hj$v+Hw#vjjjfw@$xjXw0$]jJj@j6j|$X|ufA`LA/w4w"v|$8-jii|$`@i v|$xiii1Ai$/wa|$HwF|$xui$PwZ|$HvS|$ ЃAiA?-i|$@|$8A|$xwA4hhA8wK|$xv:fA`)|$`Bw"|$`(wghhhhA=!A}h|$Hv+6w#dhA0w*KhAh|$p/<Ph|vWg|$Hj$OfA_D|$pOZg|$`.ngg&w9Av3hgwGv5|$p!w|$H?g5g|$@#gg|$`0v8|$p@w'fffff|$@f$wtA[wO|$`,w>fACw|$p]vqfgf]fSfwR|$p wAAfv;4f*f|$@wQ|$x!w@Vw%Afeeee|$`?e|$@4$eeweme|$Hw' SeIe?e,e"e$uA^v/wdMЃdddЃdUSD\$`DT$(l$x$A7G A/|$p |$8Y fA\|$p:|$8*|$X]J@|$XFh1fAKfA\[]|$8|$0lB|$X/|$p A$Y v|$hm9W f.|$ho|$d|$0h|$X,f_5)|$@ RB|$0C~s|$@$Aƒ4zƒ|$8jDAjH yZ DD$pE|$0> |$p7|$04jTAy|$X'>4e?$A  $b#|$P|EDAC V |$p.fU[#|$X7ON|$@Y|$8yJD|$@ Mf_ |$p @Q8{!fAbC|$pj5ffD|$82A  fDL|$h} >|$XvAoe|$@ |$hJA|$0d0fA? <|$0>g|$% |$8A|$8|$p$Y A|$0hA[ gP9zDL4 |$h-3'H|$0n|$@ {|$p-$+ |$PO@|$0qfW |$0^']|$8O|$0W=^8|$@|$0!|$0r|$X|$X|$XQ|$h4|$ ;T$@t |$0(f|$"|$0n|$0I !|$P@|$@#W |$@ D: |$8|$0A|$X9!Ё%„)|$h/ :1 'f|$X*%|$0.|$ /"x ffAWA  |$X0|$0VHAA  f4 1|$h1&fYA|$8)/bfAB$|A#fD 1L@t [A): |$0~^ |$hx'Af.nG |$X)l$1*VPZ+?*.0Acf$/ /$M-|$pnCmAq$y@V$( XJ$1a?NfA6$u fAf- WCM|$@ *Gu3|$X RfA] fDc?\k AK SG|$p&V|$8EA|$XT ,G[GO- fDf`A f^s |$X'CDZ @Ah@|$8 $$WH^I@|$p-|$p$J|$h\Bl|$pm.A DA|$H&.|$@-v fAXf.|$p5m$B|$X)[|$@ H|$p |$8h|$phI" vA9f.f].|$0(|$8E6A [ f|$@_f3f_Y|$X1\A  A(fA_?%Ai~ w$D|$p2&f4fAb d$K  H|$X+Z|$8f.A[ fA^XAvD|$ f[|$@<|$X: Ab|$hMA<pAIS|$P|fA!|$@ uf_>XAUHQ:(cWk @fADfA#$1|$@"|$8j |$ 2 $G|$hkp$"$$+|$X]aMAKfYaA/*AzhlF|$8"fWG$u!>|$0=I|$ ֍A|$0-Aq@|$0vAD 3A SAƒ|$pXAz K|$@ Ak70A2S[{|$@a|$p0f$G|$p63!)PXFBhA ƒ|$P|$p6D|$0: EAmv |$hUA 3 &02@$  $-|$@ 'e K|$p||$@7f|$8%H1# @B Ah#|$8A>If>΍a%ffWF%ApfA\`|$hR0$fAWJ|$H:Mw$DfAY|$@3'|$8 |$hE8|$Y[pR.|$hq18]|$8#n|$p%PfA^1AN%|$p3LfAT)|$p>b|$8 ӊu $[|$8AWMf|$pBf|$hfA;a.PKDD$81BDA8AR C|$p,C|$0|$h)9!|$XM?|$0FAvfDSA+:|$@afAK^|$H|$hk>f|$@|$06|$XC \|$X@+fAQfA*Yd0\$!.|$@ w|$Pfa|$X,8AwQ`VEK |$X :fAaPR|$0;fAP|$8 A6|$0g! A~yAH DL$@1Ex|$p0ƒ|$X8 AD |$0eB;$2# v|$p3|$0@!$:.A XTAv L$8 1; fAI $L;$T?qv [Q@fZ;|$s0 Aq&A fA_#A V^$E^>"|$P?y|$P=HOF9|$H.^fSiA=<<A\|$8sfbfAROfD|$hCWA/|$0]%BAPz|$hvAT $u;$ |$p0`|$8;ЃL!|$0}\'  A  |$p-\A<0c<d|$8|$X';|$p&|$8A |$8wAj`r|$hV(AI$ gAvfA[f|$0ZA M$"jM|$p`|$h~UdJc#>|$h~Ari4|$0|$hyfAIA"|$X4G|$8"diGf$|$hi|$8BHAihEk|$@F|$8!5)A:AS*A|$p( *%|$X9K|$Pz D$h [ :/ ?g1Am |$h& |$8>y+ ]a|$@|$hU|$X8>A(|$p6|$X(  6wAoeT|$0;1S1AcQ31 tiv|$p!wZ|$pL4rLjA]5A|$8ƒ|$@ ~~US1|$XCv/7-#|$X>C$&|$@ Q|$PcAl|$hq%Av |$X3|$0X/AA.vig] `0AOAHvAu fA^|$P0|$@:1U5AdW|$8t}A A{ |$X0fa&ADT$E:0A@#d|$~)@N|$8)`A|$07^8D|$0y2 S|$hDt|$0^܉A} Y|$P3A9wc  AU Ykv$+ @6Cك+#,A }f]+!|$h  l!|TL_d;|$p)At6 Qv|$09/|$p"fATAFAg|$X>vD0!|$8g[r {AI Go8.fA[XA Ft32']*28<@Z vAiT*A|$X8!Ѓ:4|$X/4APxAJff`(AUEU>A-?' ,?|$h`d|$X AfA_[/p|$8$|$pAB|$pz|$@uAffAD:A6\|T?"|$h8|$@ (|$8f\{ {:A C$3qfZo|$@|$X7EuA@ Ar1Aa|$@ F|$X6#AF|$0A3 afAO|$@jjƒ|$H].fUS.fD+$$C|$p/ƒ|$@xA&w\&$|$X=A|$FM6$S|$@  |$:Xfb|$p4K|$@Ajt@|$h&|$0ct@|$8*U|$p1||$r/ cfD|$0m]f^6AI|$8Jy 1b  |$@)p1 W]LLN |#|$XAV=_|$0V$@|$X&*O|$h}O$ev|$@fY|$|$@1|$@ AKTB|$ewAЃhA$8|$X'[*%{}f|$0XeA7|$2/Z|$@H a<|$X[j||$@ȯ|$@ЃfDvt$@lbQ"(AHOG|$8pƒ|$0e|$P~8p |$hf$ E 1|$@|$0T |$p2|$p||$@0s|$X'{|$HAt |$hwscfD|$hPA*A$_f|$0|$0N8|$p:Ѓ$L [ |$02^|$8tiMmAz$_w AcY@|$0xf]<|$0aXcA|$X/; @|$8 |$h>fATUA vND|$hM|$he2{N}e lMFTFkЃI@ PNA3%W\a|$8|$pK|$p`|$X fD_w|$pAwAz|$p^AOfc~8.Ar |$@!|$-w Q|$h/G|$PThs]@|$@&hk9LNAL afAGƒuA G=|$ht} AvU jU |$Pȸp B$ Ѓ|$X8) |$@fAQ |$hdMH+L2f|$HA$ v|$84*AT $|$hW$$|$8e% k|$@kA|$X"_-|$p-Նf`d|$p)DAwAi_ (  8 71p w|$X  A p|$8=#  A\AtE 1fA`|$P=A|$@tAUK8|$8}D!|$0w|$X.|$0?|$8bA-Av|$@ |$01W|$X<M?|$8u|$h,~jx|$p9?|$h^a|$p|$@.fA A wQI |$HA-]C|$@f`u2fA9<D$HCAHAtlA61$|$8|$X!fA1t= v|$8|$0s%AُA% W|$p5G@ ^>|$X>b   w |$@ fDfAAP.|$0P W|$p|$p.fA9;|$P'|$@vs@f]2 PfASƒSuA=hD|$X80|$hT4t|$X$]]%&kf9(|$hI]|$Be˕|$X)<_$f|$hw0|$8Ѓb$CW.Ad|$8*|$u||$p6`|$0yAX S =  j(& beh|$PJ%za|$h<Aa]ƒ|$X1wG|$X*7|$P8 A :A#1|$0jT|$hr$e!|$7A|$@ A|$X dAe'#AtMT֌A[4]|$@vA `+faTy|$8|$p0D .u )_A1U$ |$p$vf[.$|$8(UI|$hA |$X^n(V4AY鷿vwA閿fwAQ|r$C 1|$X1ރf_ރ$ (|$@L%|$XAT]H][|$X4Q|$p)‰|$@fA[ջJ! 4!A'!雾fD$ANo|$@(V|$8$|$X6=C|$p3|$P 0w @A -|$86bA `6~q'|$@鳽fD,隽|$0N-fA4j|$8+XfA;}z'[fD|$8'_0=AЃ+_/u |$8ݼ >%|$8RfAVJ޲/.4% f[逼|$@$^ 6A|$p2|$8?$|$X;(|$0z$zQ|$8 |$h as$vbֻ|$|$p |$h{3钻1|$@逻A %ACA'}f_AL|$HD +$ =fANg|$p4*|$)Af鸺|$0]|$@ L|$P|$I|Aƒ|$@Y\z,j-b|$@{A{p'|$03`M|$0)Kƒ|$X7uAعιf|$pO$鏹A}|$X/m\v AXN& ? / !1| |$p(n.Zø1w 鰸1c靸|$p4'$K gv|$hcTJD|$ k$A;j|$hFC|$p|$X,f1|$81A `@|$hQU@驷Ag=|$p)v|$hYyo|$09_fAS,1|$HDA|$X |$0#wA |$P=AS~|$@ |$P0p̶'A65G|$psf]|$8wxB%<FAs<|$h||$X.ƒ|$p t|$X 1A&A/Եw鴵|$8Q|$88w 釵A^u|$@ cD P|$0$R`W|$@fm$-H< S J̴A$fupSf\i|$8zD|$@A^vAlC9|$p0 }BwL  Aw|$hJ=|$h=pֳ WfAK<|$Pm`|$p1(`A阳1 酳#=<|$@a$ c1i=.|$@Af`NMC!#|$@W|$8.Wk"W黲l韲|$p4|$X@V):QXhWF>|$h%>80vfA]A ^ ϱn#|$X1!@fALu|$0Qu阱fw |$p!tjMA&w|$@E;A|$p#/|$8foF|$07sAְ|$Xİ|$p- fA]O颰L遰 n|$Y|$0pg u8O-$%[ Aޯ|$h| |$0M4|$X%n2ڨ7 |$8閯|$0C |$hf]|$8FVafY {y|$@ SAH|$X;$|$H $% *R# Ӯ$> |$p5GA4飮DvA邮|$8*|$h!_,fAIU N|$p,>&r" !|$@m|$1\$>T$X Ѓ! „5I5驭A |$X;n" ƒ|$@ u |$p1]\eA ZfAM:,fVA|$8U] (t# %A$" HA!G\|$h:x^+頬AX}s|$ "r(|$RA |$8Wf^|$@#6|$8 @AUw A-@ w|$pƫ鼫|$$' fAa;A)=|$X)(${$v|$hk^T|$@wN8.j `1A Ѫ|$@鿪|$0P$|$8TFudA鏪|$8 n&`|$X#U%AA|$@$|$@ u>|$8ީ|$XG$|$h9G kA髩l A鉩Azv|$p+bX|$h;!Ѓ;$WdfAIAl V|$0#6J|Ѩ$v Al風|$8 |$@逨|$jB,\ jO >f|$@#A s $|$hLMg|$8ܧ|$@ŧ1鲧^!M@A@ƃ|$P@uqvcNNAA9=I FAf|$@fA AQզ˦A#D$PSw闦Y 鄦Aj "$_fG&"$ޚ^+A |$@|$PC֥Ať|$hw2n7 w|$p阥/Sr|$PwfaZ|$X2Q|$p$<r ?A 9e HA|$ AZ4I%d<|$hVApv%鵤AC6/$,`銤A69Q` v|$@\Rp2ek|$p|$@ |$X?|$hH8`fWأ|$8-.vA驣Pz2|$X7+pAK|$P2v|$p9bXN|$0P;|$8M %Av|$@ /A \fA\\ע|$8TƒuA]驢|$X5r9 鋢AP|$8 ]AfAL=|$L1fAWG|$X"w /%8g3j[A ϩ$n17|$X4nA!魡A9A鏡qE5 sfAWEAE|$8^' @Ek=Aa=hhY)1fARfA_$'OYA<黠fL(|$hc|$0+|$p.造.~6+gAv|$PθQGq0|$X&{n|$P<|$h9wA<|$h<ş|$X@iJ SJ vA銟a ]qfAaOZ|$Pt3A A+$ 9A$$1Оv|$X;鱞A$|$pL|$0f[& Aƒ3G|$8.*)|$X,+|$hMST|$@A|$h5ݝ͝ ,|$0_bp馝;7|$hA7|]$%|$0X8foT|$P|$X< -|$8 v3$SDA :|$X>:М|$X4A~ODtCD颜AUAZBj ЃnA4Z|$X8+|$H;\|$8 ul &|$p3>0ffD,|$Va|$hN|$8頛|$80b|$X<bt|$X-<|$ha9v|$P,wp|$X6vfAZ<2|$0q-|$0cC$7yXB|$X%R8|$hSuI ƚA$/|$p D钚$5|$p9|$PzY[ 7|$87:|$hU$qABq|$X> AYSfAQgLљ$Mv飙|$0|$X3I:sAmU% E|$hTfA6qIqz|$&*|$p-A$JA^δF=鸘|$Xfh|$0#cl鈘T|$0Jm|$XV[fA;ƒ|$@K=Ak>=,|$p%DUxDfa|$8 A|$PA!Ё!Ѓ|$p„t|$hf骗A閗vPv|$h:!<[|$X0]H 9zЃ,cA|$@fA9aAa$}|$h˥|$PA7 隖kR,3$UH|$X2v#v|$pZPfAZ-|$XBE[@!fACC&|$hOX|$XEd|$@ 2|$0"P|$8-ؕ|$0P|$hcW2鲕P|$X)E 鈕s uA N$Z CKfZA|$8uFAlAl!Ѓ/ .=$NZ$5<Z݇|$X҇鞔O,A~wAdZ$2|$h9 h1$F|$@<}|$X:9|$h=|$0]AϓAkC;J$ Ut|$p%"tfAN$} %s;$ ]G|$hm<3# |$p*CFe7|$h{7ؒ|$X9 f_?fAW@9饒|$p0EA!8|$P jAO]V!|$X'b|$8JAlJ#3fAE|$0xM|$8;8|$@A|$X:5|$p,t|$8 v 鲑 %A钑A~ kfAUF  ,|$p1Ѐ~ *|$0lA6e 6 F ݐfARQZB0B鹐|$0kuD|$hPjw]=|$0[fAWzf_ްVЃ;$\dP0UA . y|$p2|$p:|$p0ADAƏ|$h|{|$/A^\8|$X,A!ЁW!Ѓ|$p „{AndfAJ]'|$PMg;(O|$<P Aq%|$X'JAD$t#饎V |mS|$0zbSAmfAcQOU|$p4||$@8ZSfA`RR|$p* -]|$8>_|$p̍鹍[.RO雍 v|$8 y|$X+QA/QQAZ6S8|$po|$v|$X.fY Ag?^?|$0});|$8:Œ&(b~|$8~阌U"|$@@|$p&tfA@}t3[|$pA.?QA@ Ѓ$|$0XvfAS|$H$ |$X8!Ё„t|$P馋A.8|$H-]{|$0!Y|$ppYR L6O! |$@ƒu A8:$- '?|$p鰊$A鐊|$hS\$ vA ndmd3vv|$h C9vfAV!|$0`8$|$?$#AƉ|$8,++饉@%|$8n1'AZ|$8%u Y|$8EG) .v|$8v y1;l,|$@Ѓj"|$hZ6DA|$@霈[錈y$*?AW|$@E|$ l~*ma($z|$@V|$8<|$0A%*|$@ȇ鵇 'A v|$8 錇CmfA3# i} CA'uzz^+J|$X(wЃ݆A5 '齆骆順*鍆郆tp+An *MA s#A WD2 vfAU AI$|$0m#IAtYwiÁlv |$0Q=ŅA鱅fA/5c\銅N &v|$8f\ Ev=31|$HAyr|$@w<:n<A%^AЃńAЃ鲄A ( oAo$&|$0J`yAˤ|$@O/Y'c n|$@]|$X;ҼfAFO|$h*'fAJo|$8:&o|$@p|$@ 頃$XDjODvA) VLBA(AQ vA&Q vA ؂΂$;@ATv闂A<k'|$p(xAA|$X2|$@ЃYO|$hB_$A/SfWfA0Pv fAR)fAHS &)Jˁ|$8#a)Ad鯁|$p'w)$T)|郁yg/|$8/X$$3|$p*af[ sz '|$X:TAE|$h0& ڀRN4|$@_|$X= _|$8&驀|$8U+|$@v$w|$8eA|$0EBv,"|$0gP7|$8i J8v\|$e±|$X4)|$@W* a|$p+R?RnfAY;,N|$@HfT/|$h /|$8 ƒ|$p6 A<k1|$XCƒ|$h~|$X,6fAUd|$85)~|$p/M+A b~O~ 9c&#c$~|$@v|$8" ~~f^4n }|$0;,AKa|$p"6a*a}5}|$@v|$8}v}$; ^}f_|$41)}f]5|$hG }$?Tnf[O|f`>*|$p;X|$X1XX|$@ ||$4|$Pka)_as||$0$r`P_`L|k9||$0,|$hgZ|$p'Z|$X5A|$p%${|$h'$O|$8yO|$h v{{|$X>cZm{(|$@UW|$p6G{|$h')A+{|$P,A vbAx{|$h6|$@v|$X=zzA3D zvz[3$z-XATz$d VfA8V.z|$8C-Ck ky y9Sq ЃyA?yd/ljS/yb=A}1~kyAsNyy2| vAyyty|$0Z2Gx|$hYF<Ai|$X1$`vxx|$p7A:0j|$XEx|$01|$8fx|$@EOx|$8@f\i-x#x|$HA@@w]L$wwAЃw|$H9H oA  ow|$@2A8gw]w|$86@+ 6wAgj|$hRjAEjwAnF vAvvvv|$P. <|$8j$i|$XAqkv$?A3q l 1v-B5Bv v|$8 7$ _u|$0Dufb|$h~|$@A"uu|$@ uXjjrugAhRuf4|$HA nqnuL u1Dt|$0D|$8nEA~H|$h0bfAP6 At|$h $W|$pV|$0?Vv7Jt@tAC t|$@t|$j $GwC9ss|$0F; ̈́|$8bAЃsSD-v|$h8|srshs Us--|$p2kjR^Ѓs vsr$ !]Ar|$82rA/$_ƒ$ElA8lor-~Zr*Gr7-|$8Ѓ-rfAP>|$8t|$0hsB|$h(w\qq|$p*6|$h<v|$X9vN|$8|$|q|$@1A Hfq;$lfATlk|$@ #q= Ѓq|$8T|A p|$8g<|$P{5v3pp6S!wieAp_w A{kpap|$0zd|$he0fXRr|$@ /pA +1G"1pW ;|$XoJ2|$@oA)-|$8WwAooA,w|$8ozo|$X ho,|$Xi7Ao|$X5'5w oofAK4At|$p5_n$ v|$0>vnAn|$0_r|$0NI|$0?bIA5A_ Av|$8MnCn 1vAO nn|$80o5nnmf$mB:>m$YAz|$p,i SfA`1AXm|$PP n$m1f\+mA`!VfA`âlAv +|$@ l|$@6|$8"$l|$8mfAZVz|$0HE|$%^|$X-`l ;Al|$8KJ&|$H?&!lAj0A`0lSk k8t'k/k|$8 tA kk0|$8ofZk' Gk46qkAkK)|$h1r|$@ (|$@jfA6 8 f|$@jfAROj|$80gkv$hj^jfAZ:6 ` v|$XB/j%j|$0;duA;ji$5AFx|$h}fAbt ii vAsii|$(AlA \i$/%Av|$h6i,iAZNv Bv i hA3WhOL|$@ bfAZ6|$pwhh|$8hp$p(p|$p&pe"ChA|$p5AhgAg|$X1/A(`fbZ`$hAf|$@mgc1|$PObge$ v2g(gQ|$X-|$h<7fAJC7|$8.7|$@#7fBf|$@ЃfW|$0CtSN>R|$8(vffAX|$@YfA5.J%hAЃQc|$8 *A5c+c1|$HcrЃc|$0X,!|$h[U[fAJOb|$8v b|$!# Ѓb|$HxU^ lUnbdbdQb&dfXvAcA: bbWƒ|$8;VVaasaaM0AH%_S|$H|$X0v5raha^a|$H+_*@a|$X:|$hm„t  aa.fAI:`Ao|$8`d!2RApq`A`A%|$@k`fAR'|$X4Z|$@Z|$X#;,`&`av fAXIT|$@ JASЃ_$|RH_A)AVf_|$p~_"vfATf_\_R_G_C4_|$pW$A_|$@ 7A ^^^|$@ ^|$0Zk2fAL*2AA^4 /AZ/d^|$802Aa2|$h(:A_fAe ^{^]]];]]] ]1]]|$p)Lf`F|$@ͦT]fZ7]|$p5M8K ]|$Xƒf%>e>\$Ѓ\AC|$p4YCfAJ\4F|$@p\f\|$  H\fABzA$<_A|$HTA\ \ [|$P@A@a[[1[[[[[ r rrj[`[V[AyqApp)[[$ [[ZZ|$8`$`1wAZZ|$p4aWa|$hWY|$X-A A|$8uOZ|$p(DZ|$-:b|$@/b5bI Z|$@\A\YYYYAYA2YY|$8H1$51E/|$p2/|$8,e|$@>|$0?4|$8F|$X+;.Y$YA(^YXKo.AXXA/*|$@$*AA[X)|$h)A iX_X(OX1?X|$hl-X#XYX XAw5WWJ'Av|$X:WW|$p()|$8 c)A(A|$hVqWE -oLIW?W|$hZC C|$8' WVVz-o-|$@/fA\|$@ VA .fAX.!v|$X6tVjV`V6 OV?V5V+V!V|$hZ0|$pv|$@UUA(_1|$@ Uf\*|$0)<]3UAeUUazU ' [UQUGU$&-|$0\*C<|$p6p$KЃTA)f]r'|$0|$H|$XC|$X7|$pA6{owT|$H$A$w|$@GT=TfAdG6|$X6Aa$f|$XSS|$h@!,Aq|$HS*A*S-S qS ^STS ( 8S(S|$CS SSRf[2|$p2AeR|$@RAR RRRRASnR|$@=A\|$0?DR|$8&3|$p23|$X;3RRfAZNQQ|$05+A+ QQQ 0.'.Q|$ho[nnQdQZQ|$p-4G49Q|$hNs8|$8QQQPA-|$@PfA^AP vAPPw P$nP|$b9fV8fA'|$@X'|$hK%P|$hAR1  AOOO|$HOO,|$8,|$0_ƒ|$p4t}OOvfACqOgO]O|$@,A|$|$8}OMAONIQA NNA[NxNAh9|$@r.kN|$@YN=A;fAVW%N|$8P7|$p+7|$X=fARٿ|$8MMfT<|$@Œh= MM..|$@.ZM|$p*&fV2M|$hb6)מLaPL|$p42ALA&o l|$8aL$LfY*|$8wAcLYL|$@:|$0a$ZABC  L|$hZ3fAa|3|$X6xfAaK|$0Jv |$8KKЃKKfAZ3|$8Ku8 uYOKEK;K3|$p|3|$h`ـ|$hFK|$@ (`(|$0GvL|$X-T|$h98|$PU7J|$H6A6|$81|$P sJiJ1|$PIPJ|$8v|$Pܸ9J/J|$hL.CJ JJ|$0WI vAIII9O%7Ryf`HyA>is |~I3|$@ TIA<ЃAI7IfI(A# ƒ|$p9t IH|$-6|$@98Hf`ƒ|$Pu|$p'HH1 ~HtHA>If[|A||$@xWv|$p9-H#HHHA.TG|$hRK.|$0*.|$0k~zWjy|$X.pxA,Yx:GAM,|$X7,$ uuaGWGA ~0:G|$h4 G|$X2 GS3FFFFFfb^I|$p7u|$@ twF/>$= =cFPFc =F|$8->/F\|$X=\fA81EExM$TAM$TEAUNAxNfAb"AosEWVfAVPUOE|$PDN|$@ N$:|$X6Ef_::|$8`c#vDD$ 0:.9|$XwDDnDAQZDA8:DA&DDI?|$pƒ|$ht9CC$E|$@ЃC|$8TAC|$FYAЃC~C$4 iCA;UCY?~ @@@J@@|$@7fQ$ 1|$HI@?@|$X<YvA @@ @|$0l9B|$PB|$8h???|$p[???|$@;c |$HK?A?7?-?#?/ƒuA?>>$k OA2>>A0D>+F>x>n>fASH$ K~?>5>AH>n5|$p7ߤ|$0O|$@ Q|$8AdvA==|$8=|$h#v|$X)===$|=fA=,10|$p;^A?^fS6_|$X@_u|$p4j==[:.fAN- <<\|$h+\|$p)J^|$p&VA7~7t7|$PrFWFƒ|$p1t:707 O.7 7|$056A66|$H@fA*ԕ|$p=O9"666z6|$@(Au R6H6>6<e1W6fA`~A65|$8]L5t2|$ $Z|$h$ $55$,|$pPvn5d5AS5|$@A575AU2|$@555A@4 =D24|$@..4$Arg? [?4wg4$ O4:9:evA #44A2|33$h2A7|$p< 3A*333|$8[>g3j-$F.3|$p3.$m.|$X)fAV2.|$h?.2A|$0n}Artr$ 2A@#> /A`2 M2A-32|$H"|$P||$XM22|$X51 11|$hh|$Pj|$8UfA_J1|$h5Do1e1[1Q1fAZSqw61#1|$@p|$0ip1wJAp0|$X/0AT0000x0n0|$0y0pkpD0:0 00fA"|$@//|$8GfAAW//////A7|$p;?t/fA^`|$ $/|$X2$Ѓ'/A# 5/|...|$X&A;v6.....x.CAM|$tAG.=.+ *.|$X$  .A@fAU{|$hB-|$8H$|$p`|$X'- !-$r b-|$8J_h|$@;'-|$pwM;V|$81fa|$X1,QHA,fA`|$p$!|$hVA|$X3,?|$hZZ,Aw=,3,),,c|$XK|$hW!v|$@++d|$8 J$!A+|$8w6A)|$h'|$P||$8_y+o+fD|$X$Y+O+E+;+1+|$p(+|$@  ++A5%w%******K |$@$x|*wWf*\*|$p$7|$heJ}faIe,*$ f]μ_A |$Pڼ|$HżA)fTq|$h1|$h|$p'!|$p$ Av|$@s)i)|$X,|$X:Amy<)|$@BifЃ) )|$p'|$X+~WfAcAfAc |$X"t )̲(Aw(u(k(a(W(M(|$hsAAwH@''p'fAR% '|$@z|$hvzA'|$p+CaTЃt'j'`'|$8H|$p0s.'$''p|$ ƒfXZ&&<&&A&D$pPڸ&Ѓn&|$8z|$XCzN&D&:&0& < &fAY8o$n|$X8%fAA$%%AwLARS|$@,Sf] gAfXte%[%LHu9%/%%%%|$hhQ|$X'dQfAREQAQAP|$@ $|$h9R^A d $$$$ 1|$pD@h$Aw3.|$X*HP|$P~A96$,$"$$$$#Au#|$X%uA ve###JufAW5ufA\u|$8uo#e#|$@ |$h|X|$p!X$ ,####"$]\s|$@v|$84v|$@v$s"""Ae""xw4zvak|$P|ES"I"A5"AV^|$p$-^ "|$8WkA}kk|$hkAHk]!!!!A!|$X;YX|$8!8XX|$ X|$8Q!k|$P~0!&!EJ  !HP |$Xw  hA%wh|$phAh Tw_A ]|$X8l]Q]YZ Aƒ|$zy]|$@n]+ |$pB01 $ 5eQe$h[$[hf[,{;x[ b[Sf\ [|$@Z|$05v|$8' |$0H?`A`_\d *`A>`A5|$l|$h=a|$0Sa qa|$X@_$_1Zwz2d^G fAa$|$@W]VfAYV1wfAa3a a1|$P^A|$ VAtV/A,Na|$p.Ca |$05O_|$X?_$^^ |$pP5V|$8 V|$hBV|$@pf\RCf_92( |$8w+!|$hiAB·|$@A|$8;f^C|$hZAAv|$@@Wv$dZG$}fA%fA]|$8$BY|$8Y"XAg|$hs]|$8LX|$X&[|$X.Z|$X*'[fATM [Q=|$X6a$`Ab|$L B|$DAzHEW|$@:WYO|$0J]1J!|$h5Z*|$p2|f^s|$X9|$h0VYvfAZ|r|$rb]A)Gw"YvfAU* vf_ T1YAYE|$8A T`k^p^|$P `AAyoXX|$HXBA1AGT\|$h!7\$\\6`fF`|$09 9|$pj |r_}k@fb" vfAC"6 Ѓ|$0:q?9q0q$oAYoAq\q|$88Xwzp|$8^A w(|$P*:0|$XADB|$@7 |$0Zw#$tf\  m|$0[m m   { q g ] S |$03[|$@P3 )    A |$p*wWA#    [n.|$0?c.   1|$Pn |$H. A O E |$h[ xndQG=3) |$@jHЃ|$0?Uwf_2wJ wk|$e$ffAb~f|$8 gAgfAbg|$p'cg|$P}$>4|$8^|$8ƒ9|$0Nw6|$8@eAƒ|$@t-f8P^PA!rh^TJ@6wAOw|$X:wAnw#bww*A}v1fA\A[bAb|$X6bRdb|$pЃzp$s|$8sD|$8VVu|$pku6Nu|$@H |$p}W|$p"'X|$02qW|$hQEo|$p0otevTwe ^TsA70 Lw 6w -w e|$X-t|$8|$p w:mvivArvAx?[8[|$ OWAGZ4* 2r|$hkrv|r|$puEufatA.zthv|$8C |$Pv|$p;pj|$8v|$;v|$X:KtoD T{|$hzƒ|$pSA SLB|$hv;L !$fAG.l|$0M@l|$0A+l|$05`lAK|$@ [MoЃn|$8$$RARmLB32($A&UT|$8  |$8 jt TtmZ$"# w9/Agg|$p2gAЃ|$8wLAt[t[w[`P[AF[~AVssf^r|$8wf\VLB8|$p*DVV|$0Y|$X7w3|$X.}k! qk|$@ |$@QQKwH|$04 g|$8ff|$pAyyk|$8jfAJjGVfAFVAtVkV Ѓf[_gfASJg |$XBwA|$@$vxn|$hg$!N|$hw;|$@g|$|g; v|$8  fRC D -  |$Pi|$0ti|$0}uh_hfAaTh|$p%S3US|$hf@S|$8+S-W|$p.E|$p8bA$/;A@L *LABL$p Qh|$h:Fh5 Aud vfA[TJdЃ,|$pN $6 |$X>|$X P|$p%P AmfPZPKw#|$8wAoe|$p6R|$8RA;|$P A |$0e5Q|$X*Q|$X7v|$V|$h=fAECPICf|$8R|$X3QfD$X! w ]SG|$p$wAwI E 4A=Wwf|$@ tD$w-|$X:uNPF<|$8wAG!(|$%wX|$p*w-A0fVGSA>wMA9w:w20xfAV%|$8 w`VLB2w* |$8wivWAAw+;wWw|$@ ?~tf[1[|$X$w+Iww=3)#$|$p-SЃfAW~< w|$X8wj|$8w5?w9ND4AI}EAwnAwG|$8w&|$@%X9|$@$A  CAv8t|$0A7 uv4Z$wA9/|$@w5 Eu|$p"faJ|$@|$XAv1|$hw.|$@v^TJ|$@vw|$@w])D|$pЃ|$p(w?Av0Akw'AD|$@vOBwGw|$pwnGwN|$pt4$wD:0w4|$hLwXfA]6|$@vA5v-Pw|$8 (wX%g]|$H}#C3)Y AfAa~"|$X/vM|$p8f|$wS|$hOw-|$h4ww_UKB|$X-w.|$@, AwI|$p#v8v&LAFvhzpA\|$X=0P5|$0=$w1=Ѓ AAЃ|$p(:v#|$p'w|$@ |$8vw~tj`Vq&|$@ \&|$hDG&H;&+!fAQ~;w,F|$Xw&|$@^wqAwU|$0ZwDw2w 1fAH|rh^TAb'fT|$@ ƒ|$8|$8w"|$@w|$X@w`$vAfA?Aw|$h {}),ff[~'MA9/%AwAv+$bvA|$$|$HD|$0@tqAw1Ab?wA |$pw.w&AvGf^Lvd|$@wSv7(Sƒ|$hduwukaWM|$h.|$p.|$h+wnv\A $1v4vA-|$8|$hI||$@q|$hMV|$@ 7'^;w-F3)bw|$@ X1fA[D|$w/A]|$X5v=AAwfw,Hv|$hnw!tA;qg]Sw|$XwB3Uv.A w|$p4v阻鎻鄻zp|$P 6v' QG=3)|$P}4Ew&owںкv鳺AwO w=}8铺AvAyoe[Q|$v-7|$@ w|$hwW|$X1wFչ˹$鶹鬹颹阹|$H|2|$8 v!f^si_mLA|$-|$hz~|$p) |$H|Rv@|$hTw/$u%$wCθĸ麸鰸BvA{錸邸|$@Au|$p"_UAD:'A  ׷ArЃ·|$pw^DwB飷陷wnAv^vVCЃtEu5w-]A8v|$X)D:0&G4 K( A>wSw<w*fWOѶA齶鳶|$0N顶闶鍶郶yfZfAvV|$X6[QfAX$wwAwN   $Swa1|$P)ܵ~62w.ŵA鴵m页闵鍵f_Y|$*w@1|$PD@mw|$0BwTJ@Ѓ.|:|$XI|$8,!Ё „t۴|$8|$h|$8&|$p/wL頴Tw'酴Aqg|$@t)|$X?w"v|$PA7-#|$@vf] |$8ӳ|$pA6f`Aw f]|$P鏳|$u"wfAApfw{fAQ`|$8vO|$@wHA`w+|$8w$#|$hwARЃ AaײͲ麲|$0Zv?|$X@v.wЃ钲鈲~tj`|$0ew;Av+|$pD<2(AZA2|$@ w9f\Oڱwi|$X:wBA鷱|$8A鉱}I|$p+vBAiAwF|$@w5A?w,Ov;1'Hv|$HfAW|$8Ѱǰ鷰Aw|$@锰i|$X3j|$0rwHfAV70w7 A7|$@%A  |$p2ԯ$qw|$H~鶯鬯颯阯鎯v7}v%A,AcYOE2fb|$0|$@zЃ|$@v=|$X1wASw/w鹮鯮饮雮鑮釮}s`VLB8|$wI:Auaw$ w\fAC'鷭魭|$X;|$p5wq$iv.]w)|$X6w,EwfX~`VLfAV~4*AukڬЬƬ鼬鲬A 鞬1鋬Az7w5Ѓc|$P~5Ow-J@f\'|$A߫ի˫L黫|$hgA4霫:|$h'W|$86j|$@w6QwOw|$0HI?|$hR-AUv!Av|$8w<|$P~۪ѪfAa+|$0[w$鹪|$8v!韪镪鋪遪|$8wF|$8h|$V5v-|$hw&4E!A www"|$P~ȩ龩A骩革"A}A逩vl|$@wZRH 5+A0|$@uy v|$hnߨG|$hbAvrfAb;$u1|$PD@鞨锨A7逨lw<|$YtA-wPF<2(A ٧|$h~Af_tJAw7|$pw&w霧钧鈧~tAw;6_v$AvD:0& At.A|$pw%wզ|$@æ|$8w0ƒ|$hZt錦|$p3w7w%fAXlbXN >4*|$@t$ #wVwD֥̥ 鹥鯥饥|$8铥${q_Y[_H>4|$p6wIfAN8w&l |$p:ҤȤ龤鴤骤|$8wT w4A w$Av~tj|$w9fAX2OE;1'vUA0vB|$H}1ABv(ޣAʣ鶣鬣颣阣Ѓ醣|rh^TwD1?$|$0_wrIvmAw)A Aw%}Ѓ|$XJƒ$t9|$p?w2鸢鮢餢隢鐢醢|rh^TJwD|$8v"|$X4v\yv5|$X/w%6v >ӡɡ鿡$4w3o韡AwB|$@w$:Ak|$POT|$8%6|$@.|$X, AAڠǠ齠 vA霠钠uka|$@vLB8A$A ޟԟʟ|$X-v|$p韟錟邟xn^fA_BEt3|$@v"1|$@D@87Ѓ)At|$@w#Av|$h$Ȟ龞Aw8|$0F飞LwE|$p2v>fA+}swS/wVL|$p8v#Av|$@,"ݝӝ& vk|$@鹝鯝 霝钝鈝~tj`VT=3) ' v|$8X2J|$8|$@麜fA2~L頜Et>=鈜w7w%|$X2vg]SI?5+|$fA\uw!fA_ԛʛ|$@鸛鮛A>際鐛S逛vlj w/$ v"v|$p)?5+8vM|$hw,A1D@|$X!wٚϚ鼚鲚騚鞚锚銚AwCAvw:qvD|$@ t+|$PӺOKA7}Ѓ%Aw) ADՙ: fA]鴙骙|$8v]|$@ w;1|$P 醙|$0S|$p#wp a&wF<2|$@ v|$8wE|$X9v>|$8wc|$P}:Aw'w"AA@鸘鮘餘 v|$p7邘f oeAQD$@ Ѓ;1w |$X-wG1DOwd$|$X4w6齗fAR$隗%vc|$H\遗<Awe|$X5QG$ /%}>f]~8|$hEw'$=|$@ؖΖĖfA@A驖fA\|$8wr|$8w: }|@fA<~/vVLB8%0$ >|$0DA.wYf`t9v'|$0$v*|$0fvw~tj`V|$0w#A v|$83)Ѓ ۍэA鶍鬍Aw|$8鑍重fAbEpw UK|$p<2(6tZ$wPP|$@ڌЌ|$P}b鶌鬌颌阌鎌鄌zg]KvwF<2(|$8wFw>|Lf\3A&Ѓۋы龋鴋ABw61|$P镋~vu$`|$hNDdw?Av,# 0%Av8|$@v'ފԊʊ鶊鬊wm|$0=wF|$hUt'AwukaW|$8wC7fAWO|$@ w>ASv5 v|$X8׉͉麉鰉|$86v鎉鄉z|$P|wdZP|$X->|$p3w7fA9&Aw$ v|$Pވ|$@vpƈ鼈鲈C颈$Vw@Rw.|$p8v'| i_UB8XtJ|$8w(v$ Nw%|$@ׇ͇O鸇鮇餇隇鐇E n8F3|$@ J@}v$%|$X7vA^wKw9|$8v2Æ鹆鯆饆集鑆~Aj`VLBAw'A v) Au5Av/vM鼅鲅騅鞅|$@vw酅Zxnd|$XMw'qJ@6#Aw|$P@Cv%+ЃԄʄ鶄鬄A阄鎄|$ t{AwW$fSI?AwF|$h9'v6A4w- 0w(A߃|$p$|$@鮃餃隃鐃$v@p|$@ w0VC9A%Aw?w05݂ӂ$vAw騂鞂AqNh~tj w8RAw6|$hjw%|$@w4*  |$P~&|$8߁ՁvA鱁駁$w$AwvJi_UKA.$kwC|$02v<Aπŀ黀鱀駀AAt|$8w 遀wm|$hwv$w_tQ|$ht8AeЃ>4* Ѓ$Y}|$XehA[$A|$p|$hAvuEtpw9Aw&0w!kw&|$8TJ@AU|$@OfA_U|$X=-|$h2fAT&~@9|$h3|$p)wq$~|$hfA\?+|$86|$08|$ wmw[AwKAo:~fAR&/ ~1|$HD@ ~~}}|$@ vi|$X>z|$hAwZw.1ƒ|$8uAyyAw^AOw<|$@y|$X$k|$p#VALy|$P6v.y}3 w!$sЃjy`yVyLyfbf`E|$hQwyy|$hhw_|$pwEx$|$hXw|fA]:x*xAx|$p&v3c$l`Zx|$X&UA;x1x'xA x|$w,wAv |$p#ww|$@wwwwww|$pwwzw$fA]u\4w5BwAAvuwm w|$hhv>lw6AZЃvzv/vAwvvvvv=vvCw"Iv|$hvyvovev[v|$p,w|$hAuw;v(vvvvuAu|$X(uuuu$awOfb|$8w4Aw+u|$X$w]|$8vLgu]uSuIuAv9|$@.u$u?w,|$8w|$h2wutt$t5 tAtATtv$rtht@|$X5Awc6wT0t9v2)tEt|$ptsssf`R|$hssBsfAb3|$@vov`es$w|$0Duw'^s3KsAs7s-sss7Ѓs|$hn|$8f^GA0|$pTCwg|$@r|$8$AfAS{|$@ZrPr|$X6w[A15r|$X4v6$v~8 rrqqAqAq|$08wqqq|$hgtAAv8uqAbw9Ayw&wQqGq=q3qfA_"v|$8q qqppA(w5pw|$@ppp@w4v"ƒ|$8u Aw nnUnnn|$@nw+/vwfn\nRnHn>n|$hwb|$wQ+v8nn|$vAmmmmA|$X4mA"@ Amm omemv|$X7MmCm;0m  mm w>fAJ7llAv|$8lllllllA\w3?plAt|$0DZlPlFlddw(?w#c|$XEw|$h~cccc:ccc|$p5wH|$p1w$\vAtcjcANMc|$hA\1c'cAv:Dw+BwJwcbbbbbb|$0;w[Av-Abb|$hJwJwBbbxb|$@$Ѓgb3TbJb@bw<|$pv5'b1fAcbHLЃaaxaaa<a|$8ЃaAyaafAT?}:valabaXa|$@FaDI"3=35$$M|$Po|$8%A|$hS'|$X#Hua@fA_9 |$p&? ii d7Ao 0L$DDlD$@ fDo8|$p(fA_C,|$P7EfAKT|$HDA o$(AgZ|$0z.fP<&Y|$@ ks,A|$p9fAZc|$X,fD|$0!+a 2%|$h3 )fAW2|$8CyQ|$0)|AGA-|$@#fD|$XB!|$0w*|$0IH|$P|$@ @MGn |$X+!VtA{ |$0/t$@|$0 3 f|$8#fD|$X6] |$p 6 |$ HA|L fA f|$X+$K!+|$8|$pH1|$8zDfA[ Y H 5Uf`|$p -|$X--|$X%.A|$0r[ @|$0U[7|$@NAfD|$hX5r [|$X/I@|$@}|$@%fD|$p&] |$8A(|$X/-|$0N$L|$8|$@d|$0s$ {|$X6]|$h|m$0{1|$@/fA  dI|$p/)A b7:uQ)Sr|$8(fDfAR=|$05f6$+f.|$p- $] |$%A6B Ff|$p5B |$X"&< E|$pKe|$XDA! |$p'9w$E|$XE |$X <|$8[|$h%K|$Hx{1,|$hr fAa!A<|$0[W|$h0z|$8AFvM|$8 |$p(g TfA\|$@&5|$X6@|$@ -|$hd1A D|$h|$p; 1|$@|$V  >-'X|$81xAf>=|$0+>A |$X<(|$p+'|$P~|$h[@$*x!f>m9|$8v|$@fDAj) A |$h31ArDA5[|$@A>f`k'!@A6|$0H fAX1|$0(IfEm|$p.fAN|$p%AfD$$\#|$X{Bs_fA_|$8Ak 4|$@F|$p4ip f|$0 $"$ 2vƒ|$X6dd$)fA]2 Q|$@ *f|$8/v|$p)QGf.|$0h|$p*U|$X5O+C ƒ|$X3t$  A U|$hww+eeb$'|$X-$*|$hp|$PA47f.|$xAf^n+|$>(L|$h0VAIAvr |$@fA_$D$1fA] |$8A RDA A(%?vA|$p- G#<8|$p$A@|$@ |$p--A5JI|$0~2|$PO[fD# |$p2|$/AdK$)7gIAG AZfD|$hn |$@" E3"$A%~|$p s@pxA8|$hLp >G|$XD$$A7|$@AfA^|$p4(1Ae> |$p0/ D e] uA[ RH67AB At 8U|$hM1|$pA{w |$hKfJ|$87!v@A{ |$X>zDAyc P|$0EV|$ ;8D$j<$qX^fc+|$8AfA`_t^|$@w4 U|$8 `?  fi*|j|$8fZcG|$X w|$H,A?v!A}OR$v|$8(f_OAY $I #A9$1X Ѓ\|$X*E|$hxz+A[ m|$X|$pAAv |$X,>9|$p9|$XvEw|$0|$8<9wfA_F<|$X)|$hSRLUAf|$0q 9$|$@P|$p+h]7B1|$PQBQf.|$0J _|$p0j5A 5Az-|$0L[ 8#|$8NL|$@ 1|$8'|$pPJh@Q $<y<h6T$8_fAbX<KZ;fD$|$0;#W#Ab31A1|$hT|$p) <|$8o|$hMIw f  |$X:uAMC|$X82g |$p?|$8T|$@ AvA|$0b , <fAQY|$@|$87Av[vlf;>fAIU$jOӐ}|$0E}f|$X;-|$X(%AE|$0}[w |$0W7|$X8%A  A|$p[ $mA?MU|$h~z! A* AfA_I|$0~|$0Ҧ$+w7|$8  +|$h{*|$p+*+*|$01gAgT|$p(Of|$hfA] (H|$8 b |A$ >fDfJ7|$A@4|$h1b|$8;|$X46jx|$PY|$p1|$PRA2D|$0?DAfSi A?Q%$x1U|$HgA|Af. 0|$p({P#TqAJq|$@5Lq,1|$p!11|$h6q|$X-V.6j1zƒ|$hw//TfWE|$8 -$F$fKO|$@3:Z|$p%&|$X4 =|$hN} r|$8A<D|$X4 |$0k1T|$p(@A|$@2DD |$@ME|$XG|$X'y|$0R:0 U$ $|$Xi)vfjAm|$X/|$p6>$T5|$$ L  fD|$P]~ >x,bo,A-ZO*S|$hyEA 7WAy uv bKfD|$p9|$09X$ |$0|$@yAjv|$`fDVA:|$X< |$0G|$8w Iu -$-I<;%fA]|$80|$@u|$XAJw|$p%wAf|$X.u |$8?1 wA _r|$p`|$8#@`0$0 f$o СiAR:IfAaA|$h%I1f]|$0p|$8#9 rirYA*a|$@ ? v|$h9f\fAaAA'fbs7|$p$fPOo1fAXD@|$0K=|$P>e|$@3e1R%v|$| $ 8|$8 c|$p-|$@?<|$f.!|$p/7fFM^xA W*|$X//o;"Aߊj|$0Tp"Aw|$pJ@|$X)3|$08|$8[ZA%]|$X@vA|$88!|$p1feAXƒ|$@uA|rA!T|$X-FmA  |$X&|$8X#fA`'|$8&HfAVrAhyNAYuNiNx|$X8#A%#'fAUhF2 6|$@$|$0\/>bAEr+  6fX1cTL|$X:&cj|$@ |$h!Al|$8W-\*]6|$p+|$812|$hv1"A 7t |$8|$X36|$p|[9cw|$@ `$ |$pr6|$heL|$0.,}|$X,|$p|$XfDAAi'|$htR$ |$f>F|AC}|$h<A|$@&AbfPЯfA\iЃ3fD#X+|$hd${|$@w JA9Ѓ|$@ i1!$0  vAsifAYt|$8+LdvN6,|$@z|$X5`$P<|$XO$<+|$8&rofA[1WCvj(gs|$p3hAIY=Y @$-$  $}$ jA A $|$pfS_D$_)MAzDA "v`%6|$0nU^|$p AfAH|$0<)|$01u|$@tpFA>|$h"|$X]|$0|$h9|$H9|$p iAƒ|$@fdwf[|$@ep V|$X.D|$X-gfX<~a vA |$8Af:Z|$pvndfA[fAQ<Akb|$0e$  |$p|$hp"(vfA]|$h(^7|$0-s[$PWD:$|$98AUS(y'$yw|$X't A3<|$@5EA_v|$p1K|$@KfD=& Aru |$p.S; 1|$8|$h<d7f*?[lڮ$ɮ@|$pJ /fA`fOz|$@|$X0n$|$X+k.0A A:|$p1:3|$@v%|$X$4)  ,.|$h[R|$@^|$SAA|$h.1),|$X:[|$8d^&$6,A'E|$p|$8$s|$+A =Aw f\f]a#$W3|$p:.X?|$p3v|$@AL@fAZ*|$@I^xA(4|$8^MfA_O ts|$01Y|$X/Cy$N ffDW:%|$0Q@9|$h_|$hr A, WA 1|$p26|$X^|$p ̙Av&BD|$h}-;2$P !fA_;|$@Ѓ"fNE|$h|$@6F|$@+|$8#|$@ N$A}<%n|$p"c|$@|$8"t"|$X.CAFԆ|$8Ɇ|$@ fNm|$X6 J|$0IAy|$p+e4E~Zj|$P|$h(PH|$@ (|$p,$0 |$8#fUG|$h~fAY '|$PDs$|$0p=A|$QG|$h7fY(A1|$PD LFfAbFAG餿 y$s$CGVv|$p2(|$8|$(&|$8AAvaλ|$X'lQbvA顾@M$|$X7;|$@|$X3[|$h\Ĥ$-=JDLW*|$h4fU/pfA[jAAE޽|$h|,$, v|$X頽|$8-Cp邽Ae (|$8B;As|$XC|$hAK|$8f|$8 |$@9O^$-iͼA0Q0韼Y1|$P{|$0XY&LF|$X&b:A?f|$p!-|$8w|$f|$p"3|$0N3fAab$< ̻|$XE骻Z&$J|$8pq|$h|p|$@^Ae&Q3}s|$|$qjAL;2{/2Y J[ 2s|$@A vO 頺L$.!;|$h^܎8W|$@LSfDtSWA{Vb|$p5QfAVC|$0|+[A{ q ݹ|$pDU$G|$p~oB|$8|$8鐹|$8{$NG|$09.v$t E@|$P$ }A A3=U_AJۑ|$0E4;|$X6\AЃ餸AkXAx<g|$P+7|$8"5$d{v Ѓ.|$@$z9|$890$pxHfB]|$p') A鴷fAa~A銷|$0x|$8(|$0,|$X-S|$p|$p3A*D$,$~P g|$XIvgB|$0;>Avs$RA颶D|$p( fA^A܊5^A\RDAB-|$h%fANwAI$5ݵ͵|$H`'|$6+页|$8_|$hiA|$@ kAltkYmT|$0r@$:|$hJZfA]fATPj$fIAFӴfD|$P0Av顴iv$P y|$%yA  <|$p$O fA^%8vA v|$0c??|$p)|$06\vA鳳fDt隳|$hMN7p<]A7 w@1A A#}|$hE*pA:  |$@ !|$0a!|$0^%|$P2uA 靲|$hy邲 q1 ^fA[|$0e4|$0|y 3k |$8 V AL f$AЃƱAM|$}56$U|$p0ƒ|$Pu|$X:yofcA4O|$p"?$&|$P]K|$HAlA!|$XI>UA(Ѱ|$hGEQiO鎰|$0P2|$h]kE|$hGd|$h=v YOfA,j -|$p vAv ֯A¯i>" 馯|$X锯銯逯|$hp|$8`M =  GYfT|$|$@ Lf@ҮfPî|$8#E{fW/&钮Y |$p0XES|$@cY|$@VA9F|$8"%&2vf_Av< "xAέ|$@vA$髭顭|$8(w fYu|$@eA N|$X6 CA~|$8|w|"|$@0$0ج1A^Ĭ fAZK|$pE'A@|$8q@|$@GGL ;d+cAjKnx|$@_x|$8q|$(ZҫD 麫鰫|$h9|$X9"u|$p,{Ѓ}AwVcY|$h3$ 6uoAA  |$P;.$Q$3$@fM|$@!鹪8Au|$p#AfA^O鋪fD1|$@rK|$h}yf8OU$;r$Yi|$P#O"|$p2.|$0Yv |$8=<שO©|$0k*9 rf>y|$@鏩Az*f_mKaKee"F|$h 7Aw'|$8 ;|$H$kzmz|$@ۨ|$X.!;ffH|$Ptx^x%Ux霨\E;|$03AIAwh>|$h|\ED)4$_ ;A:Ѓ|$h8|$X&J|$pu  鬧|$h:隧|$@ d|$h:Am[K|$h\(|$X7`AfoAv|$@i+|$p_|$8鷦A1|$X0d|$hvO |$pg$ vfaUK/!A|$X+|$pA'|$p/'<AVХ|$@龥 鮥|$0D5|$X,l|$@ 醥|$X>+tL^CV|$pJL 0fc&+fAZ.6|$X@#I|$HO4"Q|$0b֕|͕|$X,KyE韤|$hY<A2vޢA6f`qP`A鱢|$@fTISfAYfAU2|$@   Ё]uAWM$;fA]O|$0Na|$X/A $  |$8ء|$0_v|$@ 鷡$1D|$0+]A遡|$X0"c|$0$V|$X?*7h=u#|$@AvA|$0nw*|$8!I|$p$A^ĠA鳠頠$a|$h<MwjA9E ЃOK|$p5K(|$88#-A% fAb|$h[Eu_ufAb%|$8fR騟|$@iAx8m速|$@+|$PY@Z%$6gB|$0J@|$|$hwA F …AX~Ҟyu*|$h_E`|$0e|$8q|$ $銞`6V AkRfAXR<vAJ-#m^fA^VK A |$h .fA]A|$XXǝ|$p#9|$8駝Hb b}|$@)|$8 )c YR|$~|$0=G~A ~f4L'e>t$|$h]n)Ԝ? A.|$8U\K vf_鋜A%$ ]fA_ԕ|$@HfVƒ|$X)t A*0|$0n,|$8vR|$X3Rp|$H|$HMEAɛA7|$XdC uA~ 邛~)fAOfA_ |$p/fAYA/ P O|$X5d6 |$p3*1|$PϚA\n%$`A!Ɏ|$hLA鎚fPAeA NZ-a|$08P2AelAkvA( ltGAJ %0 齙A )+r@F ifAY@ A aK|$h1@\|$@ P|$X#=|$p0ͨ|$p'$%k|$@fKAߘ|$0eFA|$C|$X,CfA[M酘fA^bf_A  fA]M 4d|$@A fA]  8F Jrz$ |$8龗A6/|$03/5fA\P|$8A6e|$h#'H_\UMULM7 XL|$p5CL|$X9CCA'C|$0DX|$h|9/јA鶖A[P*Z鍖A1m|$8Y|$8v|$h KA|$8p`|$p.A' >fA`*f|$Hג|$P’ABf]EuAp駕f^3ANu^GnCO|$F3 DA$AfAVr |$8XEA\ Ѓܔ|$pv8 Ĕ麔 DAn|$Hn zE gjR3|$@G3FAs |$8'1A6tAA I$~Ѓ鰓|$X2 fPf=|$@逓A$ @A9@IfAT& f5E Ѓ%|$83U'&|$pƒ|$X uߒ9̒|$0K. eK$wfAPwA酒|$h~Wf3z:AE}$1w:0&|$P A Ѓ0&|$prp (A鯑L-鐑|$0%|$X*b[|$8 |$X|uQAq&mi<At|$0iπQwl 8&65cC|$P(AG饐AJB|$Hr[z$v|$@%`V/O/Z.:9AfS8A 8|$p)v֏Ah>|$hv>鱏8K_ 镏A ,|$p0~,v$|.fA]]A D]` ="'|$P)'W v|$8 At%|$8i%A{ێtEAg,|$X1Hs駎<bUA鍎AvT(|$@I(b|$p0r%|$0QU]XU0A'|$0bQ|$8#^A A  T ߍf:'|$@Ѓ鱍|$8=!A<7|$@ ^ {v|$X#f\|$$  vA7-|$H~|$% |sA8|$X38$ F@|$8;@A55靌|$P9mAev$\siVLAv 8A $fO*$|$h(fAKމA|$@ ЋƋ58+骋fAF($ZZ|$@vP|r_|$0y%|$fO0A&A6-|$p^A-^Ŋ|$p$;;|$8T^4 ~fAI$A/by%AЃF|$@  ff|$X*P1|$hec^]|$p$o]1|$p ]|$81|$b|$@ EAN隉|$p/e3Av|$h*S=vA,QG|$06.A$(AGa-2Aۈ Ȉ龈D<Adf|$@ 铈郈|$0F5hqXA8Ka|$8+Ȭ|$0SA|$8zAt@/|$@ هf>25鼇A P9|$P\t|$btA Kt$;:tqg|$h}7Ar|$p0FA2*A.$.ЃZ9i|$XOE> |$;GA鲆|$hg5fao|$0Ak|$Ph$ MA@_A) \ 6$: y5fAam|$8 q$ Ak@鵅|$p!m|$h?5|$m ~xKiAAia`5|$X4s|$8)s|$X?|$Xv2iut`uބf`36|$8tq 鹄|$hg.|$phQK5|$8*y|$hT:.|$@/h$<Kr|$0'z6Ap$#a^K^1|$hY6$ 8@|$8b隃|$X:~/$mf3qAɻyЃX|$8 F3|$X9I1|$88lA A(5A<eAA2|$‚BbAsb韂 錂`oomA2A vFAv|$0NKw |$@~{AOv{|xc{Y{A4rA|$0A|${){h{$ f|$p7܈vAvzz|$pr1a\1|$h'Q1bzQ?|$h:x|$8)P`z|$X56@Ak|$hGkfa|$@!z|$0[M!  R|$@M& MyfA[` OGyAyA9|$h cA|$hAby|$88A.qAq|$8=C|$8Ѓy|$X(i9y|$0XAuXAv|$@ xx|$@xAxAg5rv|$\kxax!7ADAxc v7+x!x|$@8A~wfAX- wA~wj6fa6w wAzM$Mdwt|$8#8>:w k@|$@pAr w]&|$X=NxNv|$X%t .v|$P1$ې$Tv|$hBE|$8<UADv|$A MAL|$h|$8u|$p2j/B!|$P+q68uK,A#v|$p&v$Cu 8A i|$0VWu|$0(1|$p+vfA^)uu|$hkw` uuER;Af?ftpAkp|$h~p|$8t|$xt2qt|$hn9|$8Ttfa|$X(UB|$FЃ"ttfAV/.|$hb's s|$@*#t|$0"sK22vs$v|$p ^sTsa4˅|$on|$8X|$hfAPNrr|$h_Ad7;vf_rrAL7|$hd|$p*r-|$X2ZmI|fAY$֑<Dr|$@ 138 x|$0Nxf]fA_|$8q|$p!@5n_ q|$p>,fAYUmzm|$HqqaA;AbV'@q=. oe q|$h"*(m|$8pE/$\XefanppAp|$h 8$f;b$ ʭ:pfXw/A6p|$@ 8|$8o|$0K/|$8Vƒ|$hWt|$8oo|$81k+$o:-$* rh|$3no|$pfAWtAt?os|$@!oA*$tA)n|$@%1Ao|$X;A]Xn|$@ A}v|$Lnn|$8|$8Kiv \nRn$a (fA_i|$@v|$X6R mm|$h7|m|$h Am|$p&e|$@ Ѓm$] |$@d>ObmANm|$X> |$8v+m!m6A<mll|$@llS/45|$hK{|$={ll|$@ACAil|$@O|$@ ƒ|$PRuA2l(llfA[kAPA PF k$j|$XM&ƒ|$p iA9_kAvk|$X+AZk|$0S%w$QwAoQwAk kxbA|A|ZfbLjAM_a9\1j|$8W|$hIWU]GUjBjA! s|$@ #jA/|$$i6 v |$P 8vViisiAv|$ii|i iifAbvAy9e|$P~ 0i&i|$8tAxqt|$Szt|$Pot hf@-A Z'gfALA"Ѓh h~h$1|$0423$|$@ƒ|$8i|$ht^$h|$@hh|$X,g)%Agf735 5 g|$8ggI*gA-ng$YgfR^:{|$8$e?e1f\DefA]x9 v|$P@eeA B|$X99GЃrehe^ep:Am6eA |$]5=|$h $ed|$@ O|$X5ddddddd|$X7F; EA ԘadWdMdCdfZ.K&d!|$@aA"b3c|$X>/aa|$8K|$0@-Acc|$@ \wv|$0X{cqcgc|$h%a{{|$X>A"fA^IJt[v$ ccb bb74|$X)3fb$'fYif[~Obbzb|$py fSIA<@b]r|$p$r1|$Hb|$Xv|$@aaa?1UfA_t^aaa/|$03dƒ|$8u A(Oa|$X >UA|$8TfAaa# a`B.$`lkAk|$p0``|$0Kgxf|$0H`\u`k`A.wA5D`:`A2An``|$ `A_$ _P_|$V__$i`0 M0A@0y_f`F/|$8N Q_G_1|$@ c1A~wA___A"2  Ѓ^^$H.fAE.^A9U0fA_?Ab^>A=d?^A..|$8x^^|$p /A/]AM/|$@/`/]]vR]]|$@1v0|$8`g@|$X45G]f`~A/]%]|$@]?<0fb9|$P\|$@7j\f66|$8>5ҽ1D\ Ѓz\Vj\fP\33P\|$06|$XB5fA[m|$8P \|$p8F:|$8)Ѓ[$ [ACK0[#?[An[|$PO3A|$X>Z[:A^=:|$hW*[_29|$p 8]9|$0P|$X.Uv|$X'ZZZ|$0o#|$HjZ|$0G/|$X:HFWcZ|$h7A6_D$8.ZV1BZ=YYfAW3|$@AY oYxY|$0N5.GAXA4Ѓ`Y|$h4A 3 A+YA:v|$X)YYXA4`2FoXX$V 3$+ m1|$h@Z|$X<X|$8-fA\vASXIX~v=3X)XXTXF!ЃW|$pWA WK,AfXfRW|$X53|$@.}WsWiWA]UW|$0H.A6W|$Q324WWV;::VVV: 3W3VVe0|$P5|$p3fQع,]V|$@v|$@a 4V*V|$@>fZ~$VUUW ‘UwkAfUAUAFv|$XUzUpUJA|$8^|$@WDi5U|$hDZzD UUT|$p1cTTw6|$@TT|$T 6 v|$0PwTmT6|$8BRT|$hx>|$0'|$X%Av TT|$@S{=S _}Sw8sQ8[|$@Sܜ5SAv0hS^S|$X50|$@5S+S!SUDA|$8 A;K/R|$X:BA# V RR 8 R|$p"?5$ 5$ lR v|$X0TRJR@R|$X6v|$0j)RR<|$hl<vnAQ$ :fAa~`QQQ1f>1|$@ς$mQcQ|$h:: 9|$P*|$X81%QQQP1\1AP|$@GJ G GPP$ <|${<ArP|$h]+?|$8 ?|$XBP1=P|$8*71fGPPA 11|$HDOAOA7|$h&v|$@OO|$8Z0ƒ|$8u O|OrO\=SO ?|$h\;fAawA1|$HOfM43fCT1NfVE|$@ uE3|$@N|$P9A"9 vNAbN$D;|$@a*NA!O5|$h  w<MMA06|$p,ЃM|$p;|$X=M$76*.6M`4|$X>4uMkMAD|$HЃAMA-M|$@Mf[4|$8e4$LA1L*;A;f2.&$U |$X4LLHv|$HpLfLqSL Q3 4L|$@g4$ L4L2fR2 KAJyGKA}KA < v<K{K|$pGBA sv$EK;KfA^;A;KKJ|$pJJJJJ JAQJJ|$p6j|$p!1|$@ $s|$X"hAJ|$PK|$hYK;sJIII|$@ c|$%c|$p.I%;OI|$hLfA\%|$p>Ǟ|$@ eI[IQIGI4I*I%I|$>B v* HHfYE$ EvAHH|$pG>1fAOH$EfVO`Hf`D¡Ah 'H|$X>/>|$@=|$P8|$h_i$wFGG|$0tUD$p4GGGfA]1O|$X3GelO|$HOEQPG|$p8qN{ w|$8-G#GG|$8|$hr3^OFF%B$2w;FFB|$PAA;Fi8^|$@oF|$8#`|$82_|$@ |$H-Fw F Fyw|$p EEfKOE|$@^|$@EX?$1EEA5YY$ '|$p$NEAE=_%EP^fB$DA0D|$8TNdA|d|$@NdA:dA#dSdDwDuJ ?|$p4PD=D|$pGD|$X$A4A vA AA|$h/OfQO|$0'@@A 8 @A@DI[fA`fW|$X3v\|$hoR\|$h<=\,W@ D@|$P2ANrAQ|$8 @A=R4?|$X4 A@|$h+ؚA|A?fNO??1|$Pu?|$p%_S|$X3BS*[|$h"[|$@*?&v|$hE??NK>A5_Rq7RJ.R>fA[Bg>yfYA y>^MJ$W wO>E>A OJkI^T>>|$@>=|$X-=FP|$8PA=|$8=$7A7fR7{=77|$8$T=J=@=|$P6v|$8==f=E|$@E|$8A< 8P|$8o ЃE|$hA^|$p8]|$8^|$h9k^$sP^$a/^A@:|$0H+1|$Pe:$%>09g9A9|$hFEA999A8+|$XH+|$8[ko9(9#9f|$hB<929(9fAX!|$@ ƒxAtx8Aw*;|$P8fA_2D8|$8|$*Ae q8A S;|$X8;ASfbَAfY!Ёv„|$hZ 88tv|$Pθ77An *Y|$@YAL# 7 C$ѤAĤ = vfAST7J7 77'7ƒ$uA76CEA(A|$8|W@iW|$X,^W66)|$p)|$hzXAK6x6|$p$:Z66|$P96|$XF 6|$@v|$8655h55555f]\A|$@ 2A_U$UAl5b5AN5D5:505|$8t|$ptt|$84 Yr|$8 Dr$m3r4|$8wA 44|$yqE4Avm4c4P4$uAa&44|$8 4d(p 331|$P3jqjxqAQ3Aa q$ w|$@ {3q3|$0Z|$8;q$xZqAzFqf_q#333|$@pAFЃ2ARf2fV`xfA`Kxw"w2222$Kn|$X<n1f[D@a2W2M2|$0fOn|$@222  2$z111Uq11|$@w"v|$X611$ڏm1c1|$8|$hU=1fAZ71J|$0P5=100|$@v|$p500p00A ϘAy0|$0F [0Q0G0wy(wt30)0A9v> 00|$81 sAr|$PsUrh////A/E/|$Po/A$cq|$8[UqM/C/9///%/|$p+/ /fA^qp|$8p.|$p+Nq;qABq|$Hp. |$hk|$@so.e.[.|$@!nAB.8.A tL$...--|$0(A[--|$HēA-A|$h |$8pr-|$@Ѓa-|m|$X2UmA>m)(m m--fZGoD4o$ o|$8,,|$X&:M,,Q ,q,|$P}DL|$@ ЃM,C,0,&,|$ L|$X<& ,+͕|$8•+fAbU7+A ++++An+AQ+|$p6w$ vA0+&+|$8(^U+}|$P}**K*|$h9***AZAAX|$X7XXV*|$X1\/*AXwc*uAWA|$8 {A)A )AZv fAb=))){)q)$l$ tg1)')|$8 wkAiTI`"Aj |$@ _ A"{1"f`PfA_ƒ|$8NNRwAJ!!|$0aw9A!!_NЃ!!faRMfA`[M|$8L$G}Lv|$X2A!7!]M|$8 MM!|$hJ|$8Au   |$0xJ|$p.I|$@IA v f A U K }*fAY^Q|$0ISQ&  > v|$@ AwO|$hNA N|$8NHzN$[A PA ZQ GQXQ cQA3YO?<2CSwAc|$@w+;@P|$hqwQ|$p5PP|$p1PA ukaWDv.$ A |$8XЃgY|$@!\Y}sUAUSAOfYqSQ0e|$8!$QUEU|$8qf^NЃAANXXOX|$hew*|$pX8w|$@g]|$8uH>4*  vA&A.A|$X-aPe|$X(eAv|$@kaOAD|$@\d|$p+GdyRd]+d|$@  d |$]d GdA d|$d|$8|4f< eeBeB|$p)wM5ML|$X4LfA|$@[N$*JNAjf zpf|$8BfAf5fDA90&|$@ |$X+A|$@ |$@ ƒ|$p'tAn{qg|$h3w+|$8@v?5|$PܺO|$8]D]e |$p5MA"|$X4O|$8|rh|$0[^A `^f9 `A_V _|$@fL9N]RAh,ЃvAK_9wVxnx^T|$0[5]fLE]$| *]|$h]|$X;\A|$8w6fT[A\fA^\|$8w($uyoeR?|$@NM$(MqMATL 5L|$p"L~{L0|$X= |$PO |$X?wx|$hwmI]A{K K|$X&K/%. |$p+ܭ/ƭ|$p"|$hffA^J|$H|$@ LMAK:ЃiA/UKA7-JyA l |$p|$2w.|$HIEPKA9KA hI|$p6]I JI4I|$8IQ 8A>'M |$@J J$\L|$p6LL' J|$8 Jk|$X?YO<wa{!|$@ /K|$p(%KKWKC|$p|$@||$p&|$p6JA IIaW/JXwp5s v|$h1 O7|$HvA~|$8J|$@|$X;J|$8J~kaWMHA6|$8iJ|$P$^J$ cZ|$hSMv|$p{q|$hb&wALB$/t A |$8 $ Y  |$8iAh|$@h hAhP F 9 |$@ |$@  :\.4 |$p("0ofA_Շ|$X' $v  AwrH]|$@d]|$87F]1|$@f |$87]ps]$oH]*,]A"Ѓ( f@A   1|$@ $w;A1Ѓ  SЃ |$8F]|$hi;]ATz ,֖R |$8 @ 6 A A  |$hF'$''$h'|$H]' |$0Uw|$P} Hkx ^lxVxk a w |$8(wA F < |$h Wa Ѓ  v$  fH w     $   fAaG|$pv@i v|$pQ G = 3 ) |$hxIw |$Hs|$X@U\-AUufAXuyA h' |$H|$Pr|$8Ѓ&fb|$hY8|$p(|$X!vvfA^u?vTv>v35vNvy{UbU|$X+TAD|$0IYT/&|$@ ^fAb_s^Ave|$hh|$8;A|$hw$hwmck%+A\+$8%fARy1fA`o$4v]AЃ|$P\V|$P ;|$PN|$8[A(/&fAXf)~|$@~|$8*~|$@ "fa^?_W|$pTW|$p8x|$@f|$0J8 |$8w|$@5*A*|$@$m|$@ЃAS |SxN |$hn" ЃG=3) ]Avh|$0=n]AEb>q A|$p$zЃx$J_ADM|$8u /%|$87w|$@ }ApfS\|$p/G|$8<FA*2wAM|$@ |$hfY|$X5.|$hA|$@ |$8|$X- v cYOE;1'A Ѓ|$p$^}|$pwQAb^1f]|$hyvk|$P!^<]A]]|$P]B8|$Pƒ|$02t $D^|$8c/^6Yy|$8y$nyf]yN$ LAsy|$pvOfS|$8|$X&$#|$[Am)|$P޺Osf[|$@_UKA|$h]|$X9H1A}A f$??|$Pl k kAk$e k|$hvk|$8YOE;1'|$09ƒ|$X9vAv|$8wgAx|$@ vAS=|$wEtP|$O=w|$hr= BwABOEe_A+A_|$@v|$8|$p)w-|$PI_AvA{|$ j|11fA^vl|$@ /|#|KA7-c-xЃ |$@ Hwz|$p,k|$8hk$|$p,eiyuY|$h%|$ biADA76'Aw}fA_c|$p,scA;_cfA]O|$0Bw|$X*v|$X-d|$0Ec|$8vA|Af<b1f_M|$8 |$h:Ѓ.}f? |$8sy`y_wc$Az|$X;pziJz|$-$zAJ|$X?hgA+fdv|$hkbvw|$ptA u|$X->dc|$hW|$p'oT|$8iIh^i|$pIiAt`ijSI6}Wd$7dwA|$8wKA_r_|$p]_|$0XH_|$p#ve>3d|$@ d|$X0d|$8cr|$X/Iw|$@"4wdI?<|$8 '|$XB0h |$@ dfAVd|$8 d ]v|$@RvAX/v8xnd|$XHw6>d2>L%eA['A|$@b|$8fTkQ|$hjwV|$Hxo|$0Hc|$hlc$ cAcSTw`$n'|$h((c|$@cwe|$hywE|$@w+G|$X4Ѓj|$h|w5sw-~|$pv0AvD[QG=3)>wLA$#v?$Yƒ9tAwA~|$8A dZf`~AA@w9$w"$\ |$@|$p7wm$ wDALw!|$@DwAЃxAv3f?O\I?5|$p0w|$@"w Eu-}w fA^b|$hvQ|$8w6- |Av|$0hcYA E;$t    u|$@6vЃ~tj`|$P}AG=v;O"v%|$8wA0ukaALw0|$@ F/ v97 $w#~Aw51fAbD@|$0ZwG|$0Ww6A wxv|$hq_UK8.|$0W wf|$hv_ AvP w>|$P}7wh|$hwa$wU|$w6fTƒ|$8t^TJ1fM5+!|$hOmAAV.|$X9VAwG|$X0v6|$8w\}M$w@|$8v~|$@vmCvhAv;g]w6|$0Gw|$hN?5V"AI|$hixfAaS@-!xnwAjQwd{wEAv3Gv!|$X3v|$p0 |$8v;nAvARAvdfA^4AwtvE^T|$p#wZ|$@wIw-+|$pwAe| A=w2|$@w+kfbu/&w#J@6,"Aw0:  v|$@ {qg]S?A (N Aq ƒ$n$wЃxndZPFJ3)ɺO |$p+w;|$@|$8wD{QhvAOE;~5Ow&AjЃ |$@ wb"vfAY|$h7Ary`A`cYOE;$wYARvF|$@t5|$P,OAH$~v7|$p3w}j`Aw|$@wI?5+!r|$X.w A|$p,w wP|$X0wI|$hvu|$8v6fZf\I?A+!|$X=w6|$p8At$T{w!/wApf\AH>4* wi|$hBwX$-wKKw!AwIA|$80EtsyD$XPϸdQAw7-#Aw6|$pw%wAw7|{i_6C9/%.Ѓ A-F$|$@|$0Uw|$X8vd|$8!wS骿Aw#v避fC~%|$@wj`VL|$wEv3|$@w,,Awn|$p7w]fwU |$@wp|$X?e鿾鵾:饾|$Dw8$鉾w8Av%QwfBSI?|$@0$ w|$X3 ڽ5ǽ齽鳽|$8顽鎽鄽A,!f6|$8AyA>Ѓ,ew$MwA Ѓ|$P}7Rw2ۼ|$8v+fw&ż|$8/鳼驼韼$|v|$h*{q|$8hvAAY|$@wx|$wRfG9w!|$8E) uKjwF|$p3w?$rڻ|$0KwLw41D@齻鳻fDc 隻釻|$hwp$wY|$ wH|$hw7Aw$vJ|$0I8.$A|$p@$ ٺϺź黺鱺|$X5fA_tA遺w|$0*w8bXAЃH>$n w|$@  AGvnwfҹ|$X8ws|$XwbvSA髹|$p=w$vA逹vlbX|$0|F<2(`|$@EٸfM|$X9H 鱸|$PAw2鍸nf@!AtQG  A '|$8v$ ܷҷ|$h 鶷鬷颷阷鎷鄷zfA\,Aww[QG=3) |$hpvAAw8ݶӶö鹶Sv U鑶NwNAw;|$X7w4rh|$@wFAw'H>4 wAAOߵյ˵AwRA;v?馵霵|$09wQfAX%A}siƒ|$p+t6Aew-DvZwC|$p-w|$!v7v/u|$X1۴Ѵ|$8w'|$w$ 飴OvtA逴vl f]3Aw*?|$0[w[|$X,w|$8:fW~`EvQw*ݳAƳ|$X2v6|$@w%|$8w駳靳铳鉳ARkaW} A7-#wS|$hQfXAu>Aw5fA\$@w魲|$雲鑲釲AIsi_UKAA-PPAٱDƱ~v|$X5餱Cwm|$pwG$-1=az1D@i} wLAuFQve|$p,wTAЃ2|$hcw 1fAb |$pw4Eu|$Xаư|$0@P騰鞰锰銰逰vlw vND:}%lv|$8qw%A|$@uvЯ齯|$0v<߮ծf[3|$P||$0b鶮鬮霮|$@vA|r|$hw%|$0JwZPF<2|$@w|$X'|$wd$1 wD|$Xw)6w$|$hZwͭí鹭馭|$hT|$p%|$P|$pffAYU|$@w/v=3)Aw-ywfAYu |$8I|$hs4D$D$wg$鍬|$A-fAcmEuK|$8Mw:5w+~w&H>|$X*,"|$@wo|$X0v^?wYޫ|$h!̫|$@w7|$8w&w鬫颫阫鎫AindZPfN|$@8.`wL w'AnwڪЪƪ鼪鬪颪阪鎪A'Aw|Awi|$p"wbf[~R$wE?AtAiwfh4v"|$H|鶩鬩颩`鏩w(Asi_OE;1'fL|$p.vAqڨ|P|$@è鹨鯨霨|$@ w酨{AQg` TJ|$@ 8|$X;$wl|$@v[AwBfYAi٧ϧ|$X,v|$8鮧b鞧锧$t3Avw^|$H}*MW|$8vO=3)sw*|$h)Ѓ|$p5צĦ麦鰦馦霦钦鈦~t|$@ bX|$p5wy|$8vhAu3w+!=v-|$@ vwإ|$w'鶥鬥A,阥酥$w'h^T|r?|$0Jw *v"A5AЃݤӤɤ Ѓ鷤魤飤除鏤|$p:w% OsucAR OE;|$p%wK2w0AYw|$8pf[\yģvS4w"v|$hi镣|$05vx|$p#vgAv^1f^D@l|$X'v Av|$pOE;|$p/w(A  9|$VwG|$h\w $vˢ|$0KtA顢|$0R|$8 ww|$X8w@At:xn|$h(w=|$p*v,fYwH>4*|$p(A5  Am |$@ X AK 鹡 馡Av$邡xfcAZ$6|$h.|$8NfA^|$X1|$@|$PfA[|$@$uR鮠fI:ƒ|$08u|$8xw邠xn[QG|$@5$|$u |$p4s 1D@A[ϟ|$X1w- 鵟|$hJw+ 雟$9 郟pf\IAv5wwA2ߞ՞˞fAW9~+|$P $鯞韞镞鋞xA wOFw@|$P%{P|$@>A* Xw" v|$P+Avf|$hyw1A  t|$@鯝@ ƒa(A 遝wm_]S1|$PA|W+$E " wB|$0aw;  ۜќ|$X?鿜 鬜颜阜D$@ 鄜zpf|$ a|$hpw@Cw|$XF@6|$@CA6|$hz<|$@1|$h wAϛś黛鱛|$@ 韛AAAw,~ugTJ@6,"CŃЃޚv%|$8ǚe鴚 w&|$p隚鐚醚|rAvC?v1NDA~0&AЃי͙Ù鹙鯙|$2ww閙錙邙|$PWw<ƒ|$$tA_wKA7$$5 wFA|$X#w,|$pv|$wјǘ齘鳘@ƒ|$8u*Fw%钘v wmcvv|$8NDA0|$8w9AwA" |$@ܗ|$p龗鴗骗頗閗錗邗xn|$8w9bw#|$8vAI?A.|$hA%ؖ|$PAA齖鳖驖韖镖wKAw;|$X/u*$1wiVLB87v  v|$hO͕ 麕鰕馕霕Q 鉕|$@Ѓn|$p<_|$@ M:0&|$p%ؔva齔鳔驔A镔鋔達w7w Nw\R|$hZ3$|$X8v1|$@w*/fAT$1fP|$P}\4 fU/t v鶓鬓颓阓鎓鄓z$Uw"$5UKAfA\|$@ (AX |$pw*fQْƒ|$8鴒骒頒閒錒 w>|$0{v-Azw$ dZPF<2(|$hboЃfRJAt+A~ۑAwE|$hFv>3w9$w/騑w'Av鍑郑yoe[|$X2ƒ8t|$@wA8v%iv$ |$0)|$h1jA<wB|$X5v1A"雐}鈐~t|$X%v$AOw[SI?5+|$@wKA[fAbAwswavOُ|$hO/f_靏铏鉏fA_15w"|$hn'[Q|$X3_A&|$@|$X-fZ{f]e$ݎfA_&|$h7|$P{驎韎RЃ鍎4}si\wRw@$ow)|$81w"|$8w-#AAdԍAA鬍颍阍鎍|$X*wE|$hMw,Euh^T|$p.B86 v|$8   |$P},A݌9wŌ黌鱌s|$hM|$hw:fAXu|$@w+|$8 \w.AC|$8Cw#) ًϋŋ黋鱋1AD@韋镋,邋xn,v:f.~4w"|$P}JA9/%A|$0.w,At w|$p|$X! Au\|$X'tU|=A ƒ|$huA:w鄊zp]SAws0tn|$h}w' AKwu|$p|$ vT|$@v7|$pu&wˉ鷉魉闉鍉ARA{A|$X"wwwD1|$p wA |$8|$pwA׈͈ƒ|$X!ufb騈鞈锈銈逈vlYK|$X6|$p&A!% w3|$X:w ۇ|$@ɇYv8驇韇镇鋇|$@|$86kCvef\/|$@wfZ~E;1AwV|$pw8|$h\ƒ8uw|$X&w!tֆ|$8Ѓņ~;$?v$fa餆隆鐆醆At#Av|$X*h^|$8ЃMCD$P+D,@w[|$X;w6|$P~AAcwMw)A Ʌ|$鴅|$@w:+w+k镅Ww'}si_UKA7-#Jw\EtM|$8w3Av 5v҄Ȅ龄髄顄wO|$p vHAJw'vlb3wA$wJ@6,"AA|$@ փ|$PO鳃驃|$pFwA醃||$0tj|$@fA]~owgF<2(Aw/[QuA߂Ղ˂A)魂飂w|$@遂|$XCvIxwA|$@ w0XN;1' ׁ́ÁE鳁AD|$p</|$hCr}$wY|$8>hu:Aw1K8A2$|$8wo|$p;wh|$hwWh|$pv/ƒ$t|$@鮀餀隀鐀wAsvlbX|$X=w1|$0hw v4* Av@A>fKXAw;w,^wAAwD|$p%w3A$v?v-[Q>4* w61|$P|$8w7~~|$X*wO~A|w#|$8 vA~~~~|$@z~p~|$pc7H|$ A@~|OE<A%f\*~B=w8Aw%|$p}}}$w2|$X'v!|$h>v|$@}}}s}A|$h<E|$@@}M|$8wXH}|$X+}FfA`k|$pw3|$h\v"-v|||>u|$8Q85AS|AwYk||$8tl@N|fA_|$p(wXvIwA%||$pW|$h^&fAbO{{{|$h1|$0H{|$8 wp|$hLwU|$0Dw3|$XBw"fA`u{{{{Aww`{V{L{|$@w>2{:$v-AuAw{zzzBwi|$8tX|$pw5pz|$8t-|$@w&Az{Ѓzz{zqzgz|$X7v@OzEz|$hZw)vAKw)zzzNvpЃyyyyT|$8wpAEv]|$0QwV|$@vEf\yyN|$@wtCvltyjy`yw0Kyv5y+yw%|$h2vyyxxxv$ xxx|$hX,|$@|$X.51fAYoxex|$h$ WwzA vjf?dA8$xvAACw%x|$9wEwwwwwww@wAkxwAw|$PbAji@w6w,w"wwA wvv|$p*w|$8wvvvvfYJ|$X.wAv|$H~SvAwfAwKv9Ѓmvwwz|$X=w_|$XЃPvFvvK|$@w:Anw'qAqqqq=v%D$8uxqnqdqZqPqFqA{w1|$Pmm|$pwcЃjmAwb|$@ v[Pm|$h$wxwR|$uAA w8m|$09wllll|$8v|$h'llAw4|$@w-l|$p#wAllylflSlAt:l0lA0]l ll$$uykt'Au 9k$AA|$09nk|$8w7|$@Uk|$@ wE8t6w$|$p)u0kkk kdjjjjjAjAw fA]~AjjjjvjljYjOjZBj|$X3ƒ|$hCtAjjjPwzfA]3$wAQiii|$}N|$pABw>$iici|$h} |$pA9i/i|$p,|$pfA`'hh|$haf_ ЃT„t7Ew2Aw"wh hhh|$@w" v|$shih_hUhKhAh$ |$hz|$Dw}|$P}fDw9Aw0g w<|-|$P~ wggggg4gAugAwV|$huw8$- @ƒ|$p)t|$P7g-g,wI>vDgAg|$hYwEv6|$X1wff|$&ff$ vq$ vZ$ f|$p%rf7_fUfAcЃBf8f.f$f|$X<ffe|$p2w8|$h7wA6eeeeeeeew|$pvteje`e wN$w7|$H~0:e|$H|$8-e e v$fAY uPwdddd|$hF,|$@ }$]tdAD|$p0&/w4A5ЃJd|$88|$p#w.w&&d 1|$HD ddcA$woAƒ|$@ =c|$p3|$H61|$@ D@cmcv%wVcyCc9c&cAcQcbbb<bbAw|$05w*Eu%bgvbbbUSDT$`\$(l$xD$A (# A|$p |$8I f]|$pq.|$X\>|$X|$01s|$h&TA|$8!|$8|$0l|$X/|$ $s$a r(|$X |$8A2v|$Psif|$hn|$dz|$0Y7|$p&$ %f]q"|$ 7|$p+BPA?AhB Ay1|$p!|$0>"|$@8|$045SA;t|$X$iEfDAa~$A w|$8"|$p<!8A 0SAK |$0U |$p.fV% >HAoh|$h(|$@ v h^|$p EaA8W|$h~|$0y35DfCv|$@$AA;f_|$p&qAK!z w Ae[@fa.Ag x /f[NK|$pCK|$h<NANM AMF|$h} A>xƒ|$ph A<^ w|$p@|$@ |$hMr A|$0d-f?;A>R|$ i} |$8 DA |$0mTf_!$y !>.[|$hzuAzfXf|$hAwi|$@x|$df[x |$0N|$8. 5|$@ [v|$X*՟A3 fDf`FAW I!|$0?>_$A|$8A5A=zAAyf|$0"vy/ A1|$h3#fX@AWDV$ |$@|$X2*"[]fD|$X |$8,feָṽ|$ fD|$@ E|$X,|$0.!&<|$0W|$ |$X&_AZv 3|$p0$ |$pf|$@fDO @ A-A41fDAm AW~S w aW/4:ADU.DfT A |$X1A  N A AK |$P'|$p#"=dDf]|$hE|$h4|$X41|$0Zf$A/$v 6$:OAA AUfa|$X-U|$pD|$@jA+ /Aj*|$p#; #@|$8EA- |$X0|$h$1t DAc^<Ag )AI9|$p%^Av|$8~tDw0|$X5 LvAB8|$0h A 8'<S f|$0|$p |$0?e 6A@|$0p%g|$h!gh 1lD|$p-|$X&Au14$G#ZA\|$PO|$@ |$0buj<AV|$X4"r|$@ A fDA! |$ H"} j$4'|$X,!A?&0 ]|$h`q|A1d|$@A$Ѓf$|$0YD~ @=|$hSy^A<@|$pd An|$83v|$X rh|$0n|$8 $AY$=\|$09w|$p11'@|$0^AO48X WW|$X5{|$h|$@ AC|$@}fDA!eACf`(ƒ|$X)%^W^|$hd $Kt|$X&/|$8w t$HAAt/v|DA; |$h|k#A;|$8ut$@<2|$0T|$p;A4nS|$82|$0*'@QA(@|$p @afA* |$0HcfYI)|$@F|$p \gA.fGAf.fP A3|$8(f.|$8H1 A \|$@ #A/|$p-FA|$p@0Ai+AP|$0\k[Aɢ|$@AfD|$0vk 8,T A |$hSA`|$0mEf.|$@A|$p\A""?v|$hqA6|$@ f]$iw |$8AaN|$p2#-|$0ABAsf|$83A@ tm RAB[A!|$8?>A|$hT"|$8;A Z|$@ ҄AyjAA:p|$PD|$8f.|$X1wAQw|$pg1T$/ `.$A |$@A;"A"|$@|$0;>w$ {q|$p0Aj'9A 9,?|$ + |$0G"A<fd^|$||$8f`bA1k%6H|$8,!H D|$#|$0|3/AgS1|$PD|$0sf\R!4X$@|$hE@ As+|$8 @/v|$h9  |$h+Iv|$8 |A~x0AH l|$PYT$8 |$H9fc8Akv|$hy"W|$8|$pE$o1(|$8/V$ |$XA|$pO 9A|$8v |$@qg|$p.WAA50fY!Aƒ|$8;C;AAL7Vo |$h&+|$0zPK|$X7cfI{A!|$p-C|$@ l/&|$@AFAf=#|$h|$0An |$XBk6Ak|$8_|$8f]VA1ufDAB& $&L$@C|$hsw T$80&|$0VAA< Q[A80eA|$0dNf[5|$p1R G~A =~pfA|$8;# Au;|$h*l|$X)3Ay|$hn|$h#@|$h |$p.,|$0.98s\|$X7֙AJA#AAAA+PyEA{P|$0Q#A7C|$X,]|$hlAv|$X'fD$l  )fR:E|$8+$ |$H 1}fZ.|$8qJAW|$hb7A3@|$8 |$p>|$p21WaS|$P'w|$0zf.A1|$hA Z#f8BH|A|$c`ff\|$hRA b|$8 b |$h |$0c [0|$ON3{A&{A A W+|$8};|$Pb!mW$ A $|$p3)RA= ufb~A|$0z|$h`] vA|$hfQ%4;A}AvA$fJAS/AB9/AP|$p ~|A<wxA6|$05Acv$A5|$0N8A-A}$- rf]y AY H 5+|$Xq.0KA#KAB,2AY"212A 0=|$Vr1|$@T|$8}|$h\|$p.W|$X8$-G "A_fbO|$@ uAN A1{AL>A0A|$@uA<Ag|$p$G=*N-$4AVZ|$XCЃ$ $D}VA"AS|$X2<|$X*fl|$H؄|$@A0$ wAXWMfDAv-#|$pUAAv$Rf]K|$p8K T$6 F>|$8W@O|$p6D|$@FAAS`AXZA@Nf|$7|$X'-A|$8vdfan|$pxc 7Ab7 fD|$X=f[S|$8E3AiT|$hH||$8A8 |$PA!|$0D+0|$hf$4 A<ĞA.X.Gf|$PE|$0o6]$v |$8bAV8|$|$p@$ |$pvA[y%+K|$8>|$hd"|$0W7f]ffHA^vG|$8wAMCAw|$p* |$X* v AC|$hr|$X%"Aw|$p|$hnY+A1OA,zA')|$X|$8A *$*Vx|$8%3AdV$AYͯ a|$he"$ )|$pXf_e_AII1f.|$0$%A+HA|$@ fDy/|$ht|$Pgr|$0AAsv|$VLD;m)|$0.rW|$hk0zA&Ac?{ A~fAs 4 |$X86A: lj|$@aj]AGNO"A0v|$8| AI  |$hPl|$L-A\|$0Rƒ|$pwAj@|$XtDA"e1RA C|$@3A]|$0O6|$@[|$8JAI|$h2AI|$0{vfY|$p.A2|$XCtD.  $ %7fX^|$@ |$XBEЃ f|$p"|$p&|$X5:|$hLih|$0=^hAGp$ f[1fXD@fD|$Xo|$p"|$ht"AZI=(1#< $yo|$rz'fEC|$@5sAW|$0ӯ|$H1<u( bXSE|$PA?9E eV˫ë AE|$hq[<|$ NsArd|$X%A'|$8Ѓ@g|$hcwzfVp`A |$hSF3$ A|$ |$X6=|$p+h_1|$8%uAsa NAIHA1 6A qb ebAe|$05|$89|$@A# |$89<fcd|$@v|$0{|$0pwN oeL?4Ag24|$@v|$X#5+f`Z|$8;Xd|$X1$|$@~DAI$O faAv An ]|$8K/CfdLLh|$Xě&AG'A 'vAfSA |$@c|$Pc|$p,T"|$X4/Nq{|$0PG{|$hџ|$8$DA6|$X8 6|$@|$h|/AWЃ$ AT 5$A z|$8, UA=u$u$3@|$8dw,fb0CAw%fZN|$X5rc |$p7)-Al3BAi o|$P-KЃn|$p3WA`3WA-|$X:|$0C"|$8ƁApyn $l$ z3ApWM|$XvAzp|$ |$8"S|$@C 0"A{ fXI|$P6||$p5|$2|$pf5|$0t]>tf.Am!|$@:<; vfEKAAv7|$@ D^|$X6e^f^A fAvov|$hu|$p.$|$X,EAHr}|$@|$0F_|$Z4f_~|$@ "AG ~|$X>i&K hAg^龸"l|$@lASl|$hfl|$8Ѓn|$p,$|$XVg|$X#Q$V)A&|$p)W|$p!|$@W ӷɷAy  qu 遷ua|$p)T)AJ|$8JA_j y5+|$H!fTDAx1A|$0<ҶA#i\顶fT|$p5&1|$Hu8 |$X;EFaA8]38|$!|$p8ML s " M޵O%AOn|$X8Ѓ鷵$"|$X5閵錵 AoA ]1 J|$8_|$XWv* |$X)|$p*DA=ܔA$FA鼴|$8 |$X9CGAy|$p?鄴$oe|$X>C#dIfb`B#As#!f.AuAbqA>J!]c鿳$#$ziM|$X&|$Xן|$8,|$hu!g]|$8"MG|$ |$p+sJ|$p!TJAQ"J|$hh J |$X3 A _|$@˲@|$X/#fdL|$haq|$0i4|$8 AmA=A]<|$@AJ1f_Jv|$X0/%f5yV"fZIZvf<ٱϱA2黱*騱鞱An|$hL Ff:y lbXN$V#Sƒ|$@jA1`|$pDD|$X<AyA#-yA yŰ|$p,#|$0LR|$04f;O鎰|$p||$p0:v$YOD|$@ D.|$h5fZmfM{A{fWc g̯ 0AfO Q3 Ѓ镯|$@+|$p8Jh|$X?AIXA VAh8 KAiK,$A~1D!B1ݮ|$p/,5A`A鴮|$h7-|$8 LALA}|$X4LAvf[ZPfQ/)AdJTfHA ѐ|$hD|$hDP |$0?.|$I$$wA?Ѓ鬭A>|$@>鍭 </[|$@[d |7fJe$-Ax!|$p ZA¥f`|$p!Ѓ\uA#۬Ѭ|$p)鳬Aƒ|$@Zfb Z鈬9|$p @4|$p ܈S|$0N"|$p.Q|$hlf]Au5AA N ګ"TOA@ĉ!髫Ap /|$8$^ 4|$P$ |$XC|$h@|$X7a=K=A_{=$1 j=*6i|$^A%:4H|$8S|$@ ҏA鶪|$::S)8f]T|$8V zYXAO7A7,A{%|$p5UAd |$X/(BA.|$@ĩX鴩A:v|$8鑩|$8*@A5Aon$"j }AM}A}$|$@Y)$ OD|$h |$0:|$p8A,fXA*~D$8/鯨|$0Zp#A^]A   q|$@ &ACVf&~f 2)|$Pp<q <AdO&|$p ~AߧAnAUAt|$0[頧fXk&|$8؅u|$X)|$p|$P ܲA|$8Az% p3f[`$xD J|$h>vJ|$P |$8=|$p<A['~閦A f\uAA`V|$X6D "|$8ECw |$p& |$pA!KAvf`¥鸥c v|$h閥Aq$CM |$HfXϤ1f1DHAF*AZ|$h|$@AOyK K|$p7L& Ѓˤf^O鵤AKLh阤d+|$0F1VAo TlXADfS(|$X5KL w ;A6J |$0`T0|$h}TAgj,i|$ dt鉣#n]$b|$h' GL = .AA|$p6+$ SAfw͢|$@ ;UAq鱢 Q 镢AA A }An }$.d|$p u A 4|$@"$W ;|$0ZG ,tA s$+|$@w)AdjQgAvF7MsA|*Zf9*fUAwp/%A|$8$ fZ~;|$8r'$,,R|$hw A5|$p饠-A!A,釠$xAЃff`,|$X/AP~|$@s-|$P'$x V|$hPj`|$@AfaL|$L|$X05|$p#y|$@骟@闟% Azf\|$XC\H$`A$r|$h$A|$0&AN11|$X .C|$pHȞAvo餞f\#+ Adv tjA"A .R7 G v|$h$/%|$8W$A{A$۝|$hN|$P<CA鱝(|$X4S|$h$ԙe OF|$X+vANC9ALwq W$\|$ho-A>O$M|$p- ŜA9# JAJ阜 1|$@ y|$(|$8Y|$hssA x|$X=wf_vq AAJ(ݛ$2'AqQ|$X;{Q|$X@r^1fZ鞛AN|$83|$ht|$8 fOD|$8]pA.A6NTv|$X fd++D$@ޚ|$0!$ RA_}u|$X:w$yf]ƒ|$h>o/Ab/K5vA1'|$X-ƒ:&|$X=/&|$PTA8|$8$!Ar„tA鯙fYCA$错 p|$p+NEN pAT WAT6B&fc6A|$@v7ژA2|$Xfbt韘|$8E2A$&c( *D$@@Ѓ.AF,|$P ,Av|$8H ƒ|$@3AT3Ɨ 11鞗A? )A=rIƒ|$hz}A$pE(  |$hQ-A  >)|$pAVAD||$Xq鱖A1'AAv|$X;wd|$p/;A*|$8h 1fYN&|$0O8;AO5"A֕#ACs9|$0:鮕$exAG酕|$h# Fu|$8#;u\A=p"gw6A$Az"$|$pA9 ;|$@ :鼔 ,Av,霔A`$|$@途g >"|$PJ8fZ LA8S|$@|$p&} |$),fU.G|$8V鿓鵓f6'|$85間$-$Ab{Mka|$@O<#,Ay, "Gz fV'GC|$0+|$PT$T|$p隒N <7Ag|$h֙Aə_ALNA&|$X8fay|$pD$##A|$pvDˑ (|$XsA|$X. |$h fG'|$X$ovASI$x4&A( vAAO{'AJv$АƐ 4{ 駐$R'Ay||$8|$X/kAaY)A1y|$0=:y:A6fRmA(Ѓ$׏$鿏H ($ ԃAB|$@|$hl l|$h[}(rƆA%|$8j%Ea%*fAJ|$X0?AAw ׎͎|$0Ko'|$p#|$h^}8k(~AM;jAPv|$p8^T|$@1A:1$},|$X),d A/|$@|$@.|$0(rVA_ANXvA鏍ADVAV U ЃW|$h+|$X1U|$8VJ#$-zfSu A&|$hx.|$@Ќ3R_|$@ _|$8A鋌$e|$P 6_+iA?A6f]uA8 fM3jЃfX=8|$h0w|$p!ŋ黋 騋A鈋AfC k\ *0|$@M|$hg;(AX v|$8fXP2A\a|$p,A\V鶊X2[v|$8 鋊|$@dAxЃmAB d|$X2%1 BA..|$0@AA@ A"v%։|$P[O鼉AQ0|$81c|$0beaARvs|$h 05A ?j|$R 1|$hqc$ /hA|$8vAZ؈8cA`|$hMvA6饈|$8+!5|$@YA:aKo _|$X;| >|$@ |$8v|$X0|$3|$hX|$0. |$8 ʇA鶇A.|$PZ;鎇-jjA`jew 10|$f+ _$A8A|+ A(-A v|$hOۆ|$Pi/|$phAh|$83v|$0P鋆A0|$0goA>)A\|$X2]A$ApAy 0QɄf6 G |$X8j8餄A:0fX6fQ~|r|$@ :|$8isA<A3A+|$p4,|$X98$P|$@A<Ѓ.hA 9>鿃vfX鞃 鋃Awi f\a|$=|$pgƒ|$X&u+!A>9|$@v3|$@5|$X@5 4ƂAB鵂A0|$p-||$XQ |$h^ A8fY Z|$h1k9|$@mnfCD|$0M$-2f^=|$X7B|$@|$8|$X:m"|$p-WARY`4Ѓ鯁 霁|$0<"Cd?f|$h#|$8 IH^++|$h5|$@ |$@?A-IA|$p#a|$X3M|$@B龀|$0H#|$X7'H|$X(KvE}m>|$X9r|$p8_r|$80|$XJ"An|$p-rnv fI@G $aAkhM |$8.9r|$r|$8#A A` fS|$XLwA;($58|$h7aj|$pDj|$8ӏA0~|$0LR|$p,|AI vAC~~ ~f]1n1a~|$@Dw Y/AyL/3~ #~A\~|$0v|$83$ c|$hz1f[}Ah|$8u vA }}|$@5A]s}A-Au Ab>}A04|$]ԄA$k|$0FK|$@|A|$@v|$||$ k/||$@ +fWm|fL7v$v$1|SV:|$XGqf`||$h|$X4A{{{A/$ =$] yAB{v }{$ )0̅P{$|$PE!{|$@ A&Gz|$6A9mD|$$^L zAЃz|$p/(|$@ pVH`ƒ|$8 tA_zUz|$ $g u |$X&&p&zfa+)$6 !}$ |Aa~ƒ|$88AP.y|$ ~|$hy|$0,&f!zz|$PN|$@ kyA1(A$}|$p99y|$0GG5|$@ yVf yA &|$}AtfNAvfYxx|$hnx|$p1AnW rx|$@8Tx|$hZ?+d|$XA  $.  |$8 |$X3w$ wAB+5vfbQt|$X&Ft|$=wA/%o|$8X)|$p#¹Gw|$X3|$p [Zw0A0n|$X0];kvf`l3|$8}|$h\qARAvp v|$0Dv||$X9uvkv$Sv|$h,Df`D|$p1DA Cv$WrL.AkYu|$X<2 w5|$p*l5) us&$\|$@){u$mdE WuAr#4As0u|$N(|$hVv3 uu|$@t|$@5/A6$5A>|$8!tArtA? vutkt 71|$hfo|$@J|$++t|$X)(2 t|$ /{dAs5$sshsAsf\~|$X)ss|$hk*55Atfƒ$A sA'As|$PU|$XUr)=A=rr|$X r|$pAP|$PPyr|$hfOF|$85RrHr|$X'6r4Y<rAK$O ^D$ |$@ܓ|$@ qvATqqAq|$h(xjfLnjzq$ lYq$ %|$8 6qPAMT_vAqp|$X#pE]$p|$ uA ppAO}AL{HrHAoH|$@AAHpAW|$hwW)p pvfXpo|$8 DADo|$p/S S|$P~P $ oAEouo boXoAA"1|$hrD@;o|$0,rW|$X2{Wv|$HoonnBnnn|$8fAwAnnH nAvknanWn|$p:QADQ8nA ax`fb|$p-`fa~|$P ƒ|$p-\ Pm|$X7f\3|$h^mAm|$Xl!f5W|$8Wmmcm;Aa7:m > vA?m m|$0P_$ .lA;lAA|$@ ll3ylolEZlPlFlf4f !f|$p6NAI|NfNAP\NeA8eeeee7e|$X:GA} P|$8Pbe|$092A;eA8GAeeANfHA:@|$@d|$hPEASE1|$X-DdA%F|$@Ej}AI||$8|A|cdR PdFdfh0$ 0A$v|$8dc$uJA=D1A7c|$8P2A/|$@f`*$ncAYv1|$pG1Fcϒ AI( =_|$02_$)bg@vA,__|$8V5A#_|$X255Oi_$?*|$@!*$Ar (_|$h''_|$p2x)|$X>^AH$*|$h`§$^|$@ 7|$8w|$Ht^j^fT:&_M^|$8+' 'A."^|$ |$hM*AJ]|$0:N(|$XBX|$@Q;|$@]|$X*-],A]|$@1|$XL1xX]N]X $$A)]*AM]AJ)|$8<$!AAw\\\ALSXAI\\fN<nq\a\W\M\AMA&v)\\|$@ \|$h~4|$XB|A|A0{Az|$@[[|$X+z9 Ѓ[A>d|$8?A5Ke[R[H[ 5[A/&v|$0Q[[A/|$h/Z vAZZZ|$0,Ac,|$h`v_ZZuZA 5fMR5|$@ CZ8|$8~8%Z >9AQH|$Pwe ЃYWU^YYY Y|$p|$9 Y+3OaYAMY :Y0Yd vYYYAX v|$0]XX|$8];Ac ;p~Af~XAONA}:|$p4wAQ_XUX aA8XA_-|$h),$X|$@4fZ AWNAKYN[W WJ0|$X0`6/A=AqWgW|$H7$M<$uG9|$@ (WAW WW$URA.|$@fYVV$,A+|$P OVЃrV$\0|$XOV|$h v|$8$8V.V|$p _8S8 VVUU|$8&^AM3  M|$8vUU|$h{~|$ L|$@K oU|$h3^^]HU|$@<*|$8 $ *|$X, *U,$:@,|$X4t$t|$p!tAT|$h%|$ht,t~}TjT`TVT|$87 8TE ^6|$X0|$@T|$p,0 SX H%Aqv|$X SSS|$@SS|$X*,|$hrySA-ArXy$JyAS7S-S#S|$p2S|$0gSS|$8A|$@ |$8XVЃRe|$P99RRR{RA"eKE\K^RTRJR|$0I P|$@A RRf;fU|$@.|$p5|ЃQJQ|$hJ[ Gf]{GAu ADQAЃrQhQAWHQ|$pD|$X#|$8|A2hfv|$PQPP|$hBKAPPB PPPЃPf_SN|$8AdADAvAPWwPPA{ЃOO|$puRЃO|$0>fWv>OO|$@ Y |OA5hO|$83?\c|$X5yp3Op|$XOONNNA|$@2NcY|$hf XAWNA4MMA2EwAZNPN|$p9PJ|$8|$PըA N M|$h1QfV`Q|$8;AHMAMALMM}M|$p9X8|$h18f\lAUi=MO(MMM M9$!6|$08|$hd|$8t|$06LLLL|$P: xLnLAO4;EL:L$ %LL|$hLKKv|$p3KKKKKKKA3KuKbKAfU1|$HCK+5]|$p&v$j KK4JJfb2|$@[\$s ^|$h8]-J|$p9?A^mJAA |$X#i I?J5JDA u AII I|$0J.DI|$8IAElK|$P~AKAtIf\b A2* A:|$8 i|$X96I ЃIA :|$hg9A@P`HA];_|$8)HH|$hC AHPPAeA`H$.W.A + 'H2HAHGAB9?|$XF.?f5HGGGfY@|$X$*GABG9GAmGA -|$?Zf]O?G5Gf-/|$X7.B  GFF k2|$@"FA HAGF|$H| FF|$8 MeF|$P8AFFA 8&6\]AdH]A F|$XKЃEEC|$0IBf8ȥ|$8>EE|$8Y |$hJ A"YAU4|$X(nAhE^E|$h8[5 0|$X5Y YA E|$P n|$p%vADD?sAgA_DD|$6|$pB?636D|$h;D|$8DFAFUD|$8"$'ؑf;Α|$p&AD$Us4k-4|$@C~CAu$vBQCC|$X75DCtCAHA\MH|$hK|$p"Fn(CfL|$@  B B|$HJAI|$8IBAB|$@ B$|$H?Ay[BAcAA/A|$0@h|$p'fWmBA|$8B$PAA6A6|$8 |$@O}AAA 4AV31fOVAA ?|$P>~E4A*A|$@GЃ AA ve @@|$p$fbPSAw$[ @@@@|$P|'Aq@^@jN@D@|$@|$X9 @@|$8̒Ab?p0|$X.l?|$X2 AW??'??u?w/]?AlЃA? Ѓ2?(?|$@$b?|$8AJmDM|$pЃ>I >ASs$ufaX|$PO~>|$@f P|$p(Y|$@ >>|$@ ƒ|$Pϋ Ë>>A(A\w==A9=|$p==A==$Ox=A|g=|$0z==3=nj|$X5AE=$v[1|$@ 3wCgAMA63A:wY2|$0A|$X-A2AH22$VgAgЃk2> X2N2D2:202&222vAN111X1|$X5y7 1|$p1116yAyj1ADw^f_z|$X1y|$hq=1|$PzACz|$8[{AN{1Xs$s|$hMs|$@ 0|$X'w 000|$HqT eT0ADTA=T|$hyTV0L0B080|$pwJ|$80faBAlA:S$//|$X)c|$HqcAZc|$8ƒ|$p8cA?.c/|$hOOg/cA`[cA>c(c|$Hc)/ |$X< //|$8f[A݇LJfT.AvA..A^^_q.|$X.a S.$>.b+.A.A N|$@N \NAOHN|$83N - wXA W$-FQ- QfVQ~-t-Ac IIfMI$<-|$X@WA<|W|$@-|$p<-,AwGA4gW|$8 ,|$PVV1,|$.,fNpA},AUO$O|$8 OAgOANA&NЃ,AdGS 1S|$h&SAFЃ++AM|$^va++Ѓ+yMy}+_m+c+Y+O+E+;+1+ +i  ++*f[+LAvA**$*|$p0L*qq*g*|$H|CM*E}DfaiD|$0CD|$8*A>Ѓ *|$p7A@d|$@))A)$A Ѓ|$hXcOWO)x)|$@ i)V)L)|$X>.CP+)!)Av|$> ))l(|$8H|$X$HA HvA((|$8)]HJGH|$PNAt(|$0 S(S7(AJN|$p0N|$8wAz (('AMM'|$@''''|$X;wP|$X8R1fYD@'Rf\Oe'['Q'$lHAUHmIH 'S|$X#Ffc~A8&&AR&&A(TT&' EA&v&|$p,wtA}}SYSI&6&,&"&Ah[ERE&%A>E$ v|$hV%%%$%%%%%y%o%e%|$hpU%w A @%6%,%Av|$p9% %|$h<J J|$@Ip v|$$$|$p2wMfSIA$$$$~$t$|$0[OK K P$F$N9$/$%$A8<<D$X4"<<#f]EfTE#fO|$P|##|$XASA6S#w#m#c#|$XQ#|$<#2#(###Aƒ|$X#u f\|L"|$@wX|$0u.LfEL|$p7LTLAWhL|$p2K""|$PJp"f"AR"AuWIfCI|$8)"o Ѓ"|$pR|$@G!!!!!!!!!!!A%'zABr!h!|$@(V!|$BP|$0}PA?PT! !|$@8   fbPAvA  A ARPP~P$yP^ A,LN|$8? 5 + !   F9$n9fO^AaNfJM|$PMM|$@ M|$8M( |?99|$%9AC9<MAJA<vA 07Ѓx |$p7>N|$X?)Nv|$X1fY|$0T6|$0A96|$8$6A 6Av6$ 0A 1 Af\SL=L'L|$PL$ kAVW|$0S><A#Df/yDfMO|$0YgEAHEA EE|$@ Ѓ}|$0HGK_7 OA<|$80&|$hN.8.A[..|$P)(%.WD~t "aiv$C9&ASwcAM'|$8h   R]-|$X9A-A\A |$@A.q-Pb|$@rD:)$ ^$mQx|$8wD|$@|$B!2|$p1;A1h^Ë|$0$2$|$MfZ'|$h%(A7|$P޺O|$@, +|$h+A^TJ@Av< &|$p&++|$0IA@|rh|$h[(|$X+((6AA|֩$7(Zf`(P(A|$X8!AA„h(A[(fX(|$J(|$pk|$+ ƒ|$8~+u+4|$X2 wC|$p3* 'f^'|$p%v |$@v$j||$@vA`AM.A6AQ)ЃAw6|$h))|$UwA|$@ AEw-A?%ЃAn|$@a(AT(L|$X4JqAY-q|$8vs$#d+ AЃ fY0Ai_Aw!Av ?5A F|$X/  |$X7p}hAkwe1|$@ D@|$@Ѓv|$0j|$@V|$p)w$ADЃ?A+|$0iw|$PYABL|$Pp$3p|$HAhAЃ|$@ $rЃaWfOzA7 $7|$p3wg|$8-mAFm|$X8m|$@ wSA/ mZ|$hmAmA Y|$h#|$@#A# Ѓ*AhA' |$8A &LA! |$X$ f_v |$p)#A{A\|$p&fH|$0g|$h!f`" "#Aa|$X.wQy $/$|$8"|$@w]A$$N|$@M|$p nd|$@##AOd$#(} |$@ < A~  D     |$p#wK|$pmAmAЃ~ ;h ^ |$@L A+ v|$p03 ) A:   |$p3;  |$@Al~D wX|$p~A2~A~A~|$8~~|$pv|$8Q G fb$P|$X8Q|$8'f\A  Ae, AwG|$8e|$@e fbƒ|$p#u AI{ea AGl8 |$@ ) AgAeܛ|$pi5|$@ڒAƒO $vmOl|$X,smA.   1~ $~ v@#w8_ $*m|$@  m|$81 '  d  S  |$XAH|$?    $ |$X({c u |$X7v|$h^ T J @ 6 b|$h4wC|$p2bbЃ FAc w&A|$@ ndJAJD:0 |$p6|$p7uAD|$06 c|$ b|$POc|$hTu_|$@ ZPF3)  uAPAC:|$8|$h~p|$p2(|$0Jl lA#lfWA#f`sAQIA|$PO$ w&|$hIAU|$p^A xnt|$X/xtA&ttf]t-k^|$h|$8҈|$p2|$@|$p<.f f |$8 r rvfZ~tj`VsC9|$0+`t|$hKtBtA |$0{P_|$XeE_A0cbATpf\AAƒNb|$8CbcAjvE |$0Xaab|$@v|$h |$0Pw2Ѓ$ b|$@ |$@$ 'Aj`VA% 3A{|$8A Y|$pYAY Y$ubwibAf[ݚ|$p1yAN|$@jЃCAKЃ3An"|$p$HAHqf])u|$p,uAFz hA9A[e nd|$X)[AH>[.$  |$0J  ?W|$8 A|$|$X% |$8.vlbX|$8HK@A(|$h>  Aw9$  |$XA :A |$0EA8A@v|$@{qAc1A GfR *|$X>$dUAZU|$@qU$ |$ |$@ |$p<  ƃfX|$X@{i$OC9b z|$@z|$X4;r^D^A]$R ]|$HA?]4~$f~AC|$X4w:|$p\|$8\vAF  lA#|$P[\|$hKo|$X v$,p|$P pAsA\.ЃTAER|$p4A|$0irAr|$hCa|$8<A4]|$p!] }mA5]fUO]|$LofXdo|$@.o oAVA?w?|$h+upf7`A7_x q|$0VqHrfT{qACЃyA_Apv|$0PJ@6.A/fXk|$C$$_A;|$X6r|$hr|$@ЃU+z}s|$@~fOOR 1f`8.A`|$p0|Ak~|NAHQh |$Pr~A A|$hqCPy|$p+vA:qgs TJ@|$@.A?   Uq$+ q|$X,ƒ|$@Cp7p$T |$0arr|$8#\Eq|$8 oo|$hMofXt A0 |$8u }|$@sAs_UAMp|$p46|$XAv(|$0?7P|$ jTAAyw|$p|$@v,An|$XCnxnAZP=Ar]rA_Ir=r:|$p$AAЃ|$p.AwmvXAbwE|$huw>U|BvA@+! Anw4w,|$0Fw%|$8(ЃAz|$B|$8|$X-wGrwAf[Q>fMfT|$8|$8nu AwЃ|$0Nf;~>|: w(|$Pk}ukaWMC9/%|$pw"$CEA|$hI |$hQw7`$o\R|$@ @6|$X7Ѓ%1D$v,$U$w"v|$h=i_fZ|$X%77-A|$hwcf^~Q$|$H|!wAnnwmcYOE|$X*Ѓ}4]|$8w>fa$AnAyoeAATƒ|$@tR|$XOwK|$X8Au.w&|$0nAw!|$8Eyoe[$ wV$6,"|$0JwoAwQ!|$XB$wu|$P~F$?$ |$p(wD$HANv uk|$ЃZPF<2AjwSvDw?$Ѓ_|$8A A&0ɺOa|$@wYw8fL"|$P~7-AЃfS|$XFv|$X6$$MvkA]wbwPA"w=|$8w,wfA~wmcYOEv9w4Aw$wABA vA]Gvf`|rh^$w\AZwB;1 As A|$@wQAm|$X9|$@ tc$ wCfP3|$PATJA9/]|$8 vG$ v:AfTV}/vAwDfR~4Aw+vf\wm vZPF|$hmvI|$pwB)v0|$8ЃЃAAAo|$p6f[Y|$p0A_s4|$pЃf_|$p0vr|$8"w0AGv v wA^|$0LvrhAw,oO|$p4wLЃ6ARw!fS~$YvA|$h+F$AQ9 |$@A[ w5AI~fRN|$0Zt4I w" uZw G=_* A5 |$p3v!A# v|$X=|$X9 AUw;s fRP|$0Hw%An A]SvA5 9/%w+(  wR 1|$p6D@A1ЃO|$w0Ck$vlND|$hf[|$X-tS^APQ5|$h~t%\|$ps`VLB /%|$p; AA'^ Av||$@AUwC|$8v2#A& v|$87WMC9/w v|$h|v/"w'kAJA@/r|$]SI?5+!a|$@A s|$8+wi~E|$8v*Aw!M|$@v)6,"$<w#|$0%1D@ЃA+w|$@Ѓ+~1|$HD@k|$0N|$p/|$8 n wr|$X@$A3v2|$pw!f_~AvAt!|$$v|$06cYA w1fa+9|$Xv ) AiwD|$@w" v|$p3 v=< |$@w-|$8 Ap v"` v|$X9g]SI?5+!$:w' w0 AuA|$p9fGtvw^TJfA~ x v.$fM-  fJjA8 ƒ|$huJA wDl|$Pf> wl#wZA4w@w82(|$v$|$P|> A$vf|$p8A-|$0^vf\e$U vNAnw5Ajw%|$h wOE;1A}|$X>|$|$8 fXRA2w:$v&w{qg|$8$UK|$8/vw2(f_AAlAKwR|wAcYO|$hw%A7A#|$X6?A|$8 |$8 v$|$0YwUAvEATw,mZPwaAwHA1'|$X0w\ZwJv81|$8 D|$.AawZ|$0?w5|$@ t$wAmw3AGw#d TJfS)! AvAw9Ѓ|$h^w-|$H}w}|$P 1A?v!A[vYOE|$PT'$ wAfF5w-{qg]SI?5+|$8-Ag$ Awf`m|$@yvg^~<4 w!=vf];1V  1D@v"v|$H$nwNAw>|$X9v7v|$@g|O|$xw>\ЃI?v|$hx' |$X>f\~dv\|$XAw.ƒ|$PuAyoeA>wSf^C|$X0v<H>$wRAC  |$P}-wA3ARvp$|$81|$Hh^Aw@w1@6ADvi wW |$X%v3 w!|$X,v|$0C|$8ЃndZPƒ|$pt|$8u*  f_t_|$PF|$p6w5Aw"v|$8|$8|$X.w#[ otj|$p51KAAv7(Aw/w|$hww-w%A(At/w'} si|$8 $ev32|$0@wQ|$pw|$8A`$2wf_WA7+|$p*S|$X$wZЃcA9 |$p%|$P?|$X2*|$8ЃA1|$8D@f[|$X0|$X3vAw-w|$P~~tA`|$@CA*wO|$@w>|$p$w$ƒ|$hItNwa wx|$8wPnw7_w%|$X5vA7|$p1wafaIAn|$p!w{A`wU|$@w6|$X59|$8 'TЃw#Aw0f]zpf\$.w<$:fbA+wUv32ЃHv,|$P}%|$p*-$|$pwgwUXA7v5|$hv$UvAM~tj`VDw|$P~=3)A'|$ |$pwx|$0+v]$\w9A0wv|$hWAzA-v|$@wz|$X)fWuf`~TWM$wWA=vG|$@w0  |$0F2|$p|$huwk|$ w5A=A$w |$}wkwCfT~3|$v"wa,QG=|C'A< w<|$haw+|$8t$vAwܿҿȿv&A鬿|$@隿鐿醿|rhXN|$h<|$w$7vA|$h f<~t ־̾¾鸾鮾餾|$X4w1A鉾lMb:iM!A!! AsU$U*dU|$hBU|$@ͽý鹽Ww'Aw鞽A銽逽vlAXNDAFv|$h|.$0v7AGw1 CwF|$hzw5uAۼlȼ龼A骼頼鍼郼AuVj|$p wPPF|$0`v1'TD߻ջ|$8Hw,AN麻|$06v)|$p&w"颻lv銻逻vlA:|$HfUV=* wWwHA v?$w!AGv3ߺպ˺fa|$hZAxwOE鐺|$hs|$hJgT|$PO=AwBQw0Aw$Mfa~~w7鶹w.1fZ霹At'郹A%o|$p]S|$0M|$P|$p|$hkw#Aev|$h^A'w1/ٸϸAw|$X/v鸸鮸餸AwA釸}A4lbAOQ|$X7vfX;1'ARw:Aw4fP8|$@ƒ|$8*tAxwӷɷ鿷ADw_AqvO|$h-weAv8w0锷銷jvTAndZLGA1vZ.$$B A|$p.|$hi  |$p'Awf$w9w'^dZPF|$P~A70&|$0@%|$A5|$@$|$XAcµ鸵鮵Av=x镵|$0:wgA(wEAv(A4k|$H~A=wTJ@A.we0'|$h|$$\AAwZ$w9|$@մ|$hvƒ|$puAw鮴餴隴|$X,wCAw0D$8t)y|$X)v,$ZPF<2|$8u!vfb |$p"ݳӳ齳鳳驳音镳ABwI1|$@ }siAFw'*PF<Ѓ*  Mv/ӲA/v鷲魲飲陲 醲|AwcAUvSlЃaWMCAZA8wf\'A6$رkwA鷱|$@w#|$hkvA鍱郱|$@w$ lbXND:0AFw(v$G `T߰|$hwd|$p5ws w=|$hhv6%|$0Bt/h vAwۧѧǧ齧鳧驧韧镧AMЃ酧SЃsi_|$@wBAVG=3   ۦѦǦ齦鳦|$wNAiv>A/uAw|rh^Amw-|$@ F|$8w\A Ƣ鼢AwG$w0Aw~tj`fL"|$8 wB8.A^w!A2v}A ١Zơ|$X:v餡隡鐡AkwDfPu&A wcPF<2(twb|$Vw7Aw'ؠAv鴠|$w?|$X9阠|$X*wB"w:uk|$@YOE|$0Qw|$0L,"{1|$H}FAw=͟ASwAv/6Ѓ魟隟鐟醟|AvcYOv)4* D Aswx$vnӞɞ鿞鵞髞類wA|$@銞AvTgwLoe[|$Tw11@B-#fMAwG|$pw)|$@Ѓ͝A8wD|$8鵝~GAw>鞝v6郝A.w$A=vj`VLB8A$f_Avܜ|$@ w>w,ADA鵜髜顜關鍜郜y|$0a|$hwsfTC+w1AZwA<2(ACI$*|$@ |$0GwR%w1A鼛Avl|$@wE 韛fB%醛|$ItjrvTJ@|$@ A\ALw*v|$@wt f]zA vjܚA˚|$8w\|$8 E顚闚VЃ酚{fL~AQf\rvA`B8$PA.&|$@ϙA$Ѓ鿙鵙|$0|$DAn0|$0YAMmA5Ѓ]A:xWA|$p-HA6|$h_\|$p wrAw!f\%ژИAu,|$X-|$ho|$8 阘鎘~t|$hAw5|$@[AIwEw|$88.|$p$w|$@ A1|$8 wK|$@w"Pv|$0/ʗAwA鞗A6WAu|$P|$X2wy|$0AwU|$0:w"9|$X='|$8we|$8vhw`AKwWAOޖ|$X9|$hcwf|$?|$8鯖饖雖+|1|$X-f|$p(+|$@w/Av&5A(w|$p,|$ |$@1ϕAw5|$P|$wA2鞕锕|$8邕|$h,w!D$p.dZAu|$p%|$hH0v|$P7|$@ w_۔ȔA=體A]$醔AMwMt4Tv"|$8 vXNDA 0f\XAw0AEw>|$H}-w%ғw'M鷓魓飓鐓}|$|$hzwyACviwL|$X5v1w)G=vAw($ eߒ|$0@wU|$H}Dyw降鏍配ZrhXA7w`AJwDA75AA:wh$KvG|$p w$$uьnj齌A^驌韌镌|$8Fw6G w$fKvlbX|$p9wNAW=3)A Aw5<ɋ|$p!w%A鱋駋靋|$p'v`AЃ郋yc`w/A,v)K$6,"|$8w*gww݊A|$8.|$8 wF"鮊|$h|$j$vo{AZwC|$X1v2A=v"|$H~PF<2 |$p2|$@AfIuv/6鼉AG|$@頉閉|$8 鄉zp]vyE;1'  Aw58w#|$X2wЈ|$@龈鴈骈|$8阈|$8wrvlbXA85A$~!|$0Xv|$H A_wm|$hw\f]~/%w'ڇAw4|$P} 齇鳇頇閇錇|$X:v^cr$wsAwW|$8 vFw7"w%|$@u1' w7цw7wA`魆飆A钆鈆~tjEt^$tJ|$h>ЃJ@A}/A|$h|A|$pvb|$@wBA鹅Aw镅鋅|$hNw|$X0rhw!uvfaI?|$8 -#$|A<&faM ̄|$P|$h(wl|$8BwU~G|$X6w@鞄|$8wA醄|Ash^$N|$8w-A3w#A^|$@vσŃ黃|$0\APALw0q鐃|$@ wF|$X2w)|$@pGvA ЃYTw4|$@w-CAew'* $ $|w%A Ѓ}w^ςł黂|$8:驂fS$wdAiwP|$hPw?|$X4w8wm]SI?AB1vЃ ہсǁ$wOAv4* $A|$X1wtA^w?AZv,龀w%A饀雀鑀f^|$8lfI0>ЃTf`t|$@ w_A6|$@|$X7|$8|$@ttЃf\~5<|$p'v8|$8vA AOwoe[||$D:0|$@|$p*|$H}HA~~|$@w8|$8wA~~}~v-fW'}~s~i~_~U~K~A~7~|$8AA|$pAwM|$pw$Av}}A|$@}}|$@}}}{}AA c}|$@v|$8L}B}f^E|$h,w-AwAv}}}A@||h|A|ASv6v$|$F||$@|||m|c|Y|O|fYO9|Ѓ'|tC|$XIw$8vAO|{${Aw%.{Ѓ{A3wf|$PO{{}{s{|$P| |$@ vfQV{L{B{8{|$@|$@ {wBAt!A5vNzz|$03w+Az|$8v"Pz|$X;zzz~znzA=7t`AwWGz1|$PD4z*z|$8ƒ|$X-t&wzyyyyyy|$XDЃy|$pw&yyyv|ALwc|$hw/|$HOQyw3A`w-9yAv|$P yy y xx|$X*w5xAawPAw= x|$8|$p$jAxx|$hf |$pA|$X;PxvS|$h vB$v.|$@w'&xx xwwwwwwwfR~gAv$ƒ|$@ uAwEr;r1r'rЃrrAywvKqfP|$P|u|$8wU|$@q|$0`!|$0@|$8wvfq|q|$@w>|$p-cq|$p-w/_Iq|$87q-q#q\w2Aqf`4|$8;w#|$@ vpЃpppf]R|$h$w8|$p5v'pApupbp|$P;p1p|$Ѓ p|$0N|$0Agw]$qw4|$p2woo6ot,Adw1|$Hoooo|oro|$X5w(XoOCo9ov&oAwY|$0xwHfZB|$hw*$ƒ|$X5u A-wOnAnn!wH|$@ w/AvywnnnЃtnA`nVn|$8!$ A#nn|$@nmmA2t[|$@w:Aw*|$hOwwmmmm|$09w.mv-wm|$8wAw]mSmImAHw-w|$8w*m mmw5AЃll|$X2w[|$@wTl$Gw3Aw AIt|$plllll$ mlclYl|$8Awp|$@6l,lv|$pl lw$kkk|$h[AD|$P}.A8k|$X%w4 k vf`tkjkA!Ё„tANg4gov9|$H|(#g v(Afffff1|$PD@ffff|$@w~wvvfl#ƒ|$pu A/Jf@f6f,f|$8*vf ffe$b wP|$pw?$_ fb!Ё„teeeAteoeUS\$`D\$(DT$x$1 wq|$p $)) =|$0/2D$@&4|$h;FfA`Hj[]f|$8|$0l|$X/3|$4v|$hz1g8Ki Ɔ|$00v |$Xwz|$hnwq|$dV|$0h|$p&r|$2RS#|$0:9X|$!F y DL$pE>|$@w5|$h~(O$ CoC uf.ao$A  |$8||$p<  ft fAMm|$0U+|$@_/9$#m  uF Ѓ|$p M|$8 $ |$p ?aχfAC|$8*$|$@mWM |$h|$4&1|$@|$0d A[ |$hV8Z|$p:3|$8O|$p+mfAX|$h|$X'|$p@|$X4-c $ |$X6uV|$0 |$h'6fAWWmЃ5f.fA`MW$k(0|$0>ICbr-.|$X|$0"ufARJ |$0<|$p,{1qAU1W@<hc|$h|$0LI+Dhw' fD$ TfAa1AfA[<|$X'w\ f.:  yfDl,VG=f+.|$h0fAX56?V$ pfDU fAaLx =%|$p7B-?e|$X|$P1fA?o@ vfA\SIfD|$0d-fAZA!|$X0G|$?fT1|$8f|$Pw fA]w|$@1uYfDZO z0-1F fDfA[ |$@N!1fA8D@|$@ M|$X)|$0.d"|$ 9fA`V~k_ЃyfD|$p-E|$h5|$@>A Dezp#|$8|$h B)h( D fAM "|$@=XAyJ|$P @q  N|$0g>9|$hnK$ k|$8*A fA^|$h21f +|$0mc$cD$u Av|$@z|$hf* $#'|$pM.Sl|$8`u~MAhYsf$.'/|$X,MA?Y5 =w|$h`fA_+M|$X*~ f|$0oe|$8m3Z`fo8A!fD|$0 $p#6pAK|$p-D|$h G|$8 D|$@$f|$p9  }f jfA_L|$0h{ 4 a` a$pf < t |$X)P`C|$pB?|< $c|$@wI?@A |$0I1fAX>_mk|$8,@|$ |$0+E'jBwv |$hst $  |$0P*|$0BM|$X*v2|$8y |$hU5A ?fA`i*|$hN_|$@fADOfD |$0ZfwkafD|$X |$X* |$hf5'|$hB|$@w|$8f|$hlu |$@$|$0&|$0/B+cpffA]<X0|$hZ_FAXB|$p. Ao'|$XGD|$X- (  @1@fAb=w.j E|$88G7vPF$ |$h5xD$8f! A fA_|$p4|$B=|$8__ |$8kwz|$X2v rhDB :C"P<21|$@|$0 |$p 7"v6|$h|'1z.|$h*a-fA`?|$p/>h|$X.N ZB w|$8* |$00'|$8 QAwfA_J fAVA,|$p9|$C|$p&8/AVE|$0;561|$H@4m@|$8kDk|$p1d)|$8P/ v|$hU|$X4|$pp|$O: Q>0UKz_|$hv@SW$|$0B9D$8Z<bЃD|$0V)fAa|$@ ]|$p)QAG|$8Uf.|$X)I|$p+1A&vBfd }/fAVFN|$8*l|$01ӝ|$p/_|$p%$z.F=\$ ~|$h|q ̿ 1f.A,|$p2A ƒ|$@uzL$8/|$p#I*vxn|$X4 9|$8<9B|$0A$ ;!|$P`||$hf $@ 2|$N2kfA$<|$0 v|$8!RfALl|$X&3 :|$h |$p -;yyN|$0KfARQ?J- 8UJ |$ |$0G1|$X6|$pY|$88D|$p,} A$ |$8x|$p:-fA@|$PDT|$8z1$C |$pxMp|$0Y`H R;fAF|$X6$uC|$hkfAQ|$@ v$j|$p!^EfA]Z`wuf.|$0@%M|$p.|$0C-|$09A|$8ky$Zy|$0x|$p.B' 8H  |$@?|$X/-l [ ~y|$09"5jE|$0#n|$@;wP'|$853W2$ ʗ|$X.N.f. fAZ|$E|$@}|$X.z ?BЃrfA_ O( <|$h|$p.~|$024|$8V|$0,|$X6g9ffA[ |$@t~|$p!Z/|$X;j>1N;($V$BA|$P1|$p|$p|$X+DT|$p PwfA`XNE; #t$@…RR|$8 |$PӸ_!|$cHR [|$@|$Pù1fAco@|$XVPGB%4AgKB|$0Nm|$85|$@}|$P~|$0JD|$@v$ |$@ |$@ v|$X8oe|$hU'+|$L>g |$0O!fAd(v1fAGD@f.fAbY|$hw=|$XB m  u&|$# 6|$0tfA]LB|$82l'$|$@2|$0YfA]y fAU,|$0%^A^Mp v|$@c$/uT|$0S`|$@9fD|$pfAZ2|$h9mZ|$X%gf|$'9Ra 6{ fAZ4#|$dGR8^|$8Ó|$X3*  Tf$O#AF$;/h|$0XB|$hX}|$8 |$@ EME|$hTZQY|$8YAYYEY|$P|$8v4 r|$p+|M B"TDxAЃ7@|$X#s h  ?Anp|$@o|$0`Yv|$8g|$p-|$@  fA]1A|$0GJ2|$@fhƒ|$ht$ 9/@ D$8|$hXbs$P o B $ f*|$p*A{|$p"(<bO<|$h V< w(h%1fAcn|$X+.t|$8|$Xy@1z|$hj1{W|$8A"w 3)9q# P|$P|$X7F: (% w |$H$A,|$@ ЃN|$hH|$0\-|$p>[;|$0D'|$h/5-|$p#-$S ЃD BfA`B|$h!d8H iAh|$@k.v\|$@Ǘ|$@-f|$0t$Y93|$@ƒEnZ|$p>|$8 iqZ |$81AO|$0a|$P|$ |$@v|$PyfD { |)|$X/d|$PrM|$hSuZ|$8Q+|$P'+_ppy: |$X5/ /|$ = |$8z Ѓ}c$8A|$Pu 4`A2|$XD|$p$b|$@fAaA)$H$yh8EM^6r|$0fA[35`H)`|$8 d|$H|$8|$8fDfAQ$ |$XJ>|$0|$h^f|$X?*A fD|$h|$~0 LPV|$@|$p7n($|$P2$#|$XQ|$@?f|$h{|$7|$X,%G|$00ς|$0>zO;|$X$_Y|$hFI|$hQ!yC,|$8!e|$@6v |$@|$XJfAc__|$@T_x|$p$ WAEu `N0|$8 v fAa fA?#|$8xyEH@f~sfAK1|$HN};Z;akǒW*E$|$8DT$HE- -6KW|$}fA&.|$@.fA)9/@fAT~|$) $x5fAYT|$X:V v|$h^f.@3B2N8|$H~3nd$P =`021 fAP3HF*{ |$P<"fA\`|$H`|$X!1Bot "35Z$|$p״fAa̴"_S_ v|$X0ffAS+A$5Q |$@S|$XpP|$@ v$2 {qv|$pYO#>|$ 6X Zb$o_|$@,|$X6/<%C|$8 3cL)A ЃDGfA,|$X3yvt(|$@Y|$hzYP|$8 @/|$hK]v$P |$XywfA^eCk@IfdZdz|$p $cv|$XwRH|$p+W$ZV4k{|$p)`{ HN1$ =14C X|$ 3|$PB9u|$0`Z { +|$8-T|$0ThfAC|$Y|$@.s |$0W>|$@ k|$8|kfAS u $0|$8?<|$ ji|$0mAv|$X1e[fM|$h/TA %$ |$8w|$P$ W)fAOR ́,ݳ(8颿?|$}S|$pW$ WAw|$8I?@|$09NLHЃ fA^) &X|$HXݾ|$N;e驾4,Ѓ鋾*l|$0SK|$X4I|$8zfAN - |$X$<|$p/|$X =f|$p*ٽfDuT@ 髽$s|$@!QfAV^q$L|$hm>|$X [7 &1b |$h2{ I|$p{|$@T:ͼffAS#|$haX|$@!lTfAC`|$h|$P4C|$gCxCA^+C;|$hOO|$8:|$X? +q&|$8A2[$N鰻|$hT |$X,7f$lAGfA[x= :z:] fd Zd$ |$@ fDqa6|$Px?髺|$@ v 鉺Yy|$8 $f?R|$?fA:/fAB4-|$@vfA5 mW"G|$h^|$@йCc95饹f.|$PD\$8$ !E„GGZ$:2W_|$83x M|$8B yy m AxT!QS|$8f3S|$ƒ|$X;tA镸'酸A +|$0d+[?\I Z ` q i$oMA2z$ ַ$w|$h馷fJ |$8DIf|$8 ,ffAb]fKFMAMB;k4!j|${fAT˶|$X'%魶T$@|$X NK|$PCK遶$ld[ J|$@ jp <1|$@*|$@4{MfAPpM ڵ+ w _ɵ鿵U雵|$@|$X6,X$tmc.Rn%23fAU|$p(P:  |$8v &|$0H&$v~驴|$85fAaTdw|$X#w/ _UX2|$hO,$aC- f$t|$#|$pv[ճ˳鸳|$h!DV6A*|$8#ƒ|$X?a|$@Vj|$p <PP=|$0PfAFR|$p0?IfAPd S$|$v1A|$PAܕu ò|$8 K?$ GEga " V  ЃhD|$0+|$h9l6fA_|$8"yr\|$  1|$@v۱$8  [Q7|$p鬱|$X7 |$0e?|$0bsM|$p3RFW@Av|$@=3|$p2#zA |$H հ|$@,A .s|$hs韰|$  :|$8ySZ|$p+|$@GG.39t! \{ F$OpV{y<W$Ѓ鼯 闯vl~t]N!v|$pPF|$@ $%$@|$@5|$p#1|$PwuŮ黮R 騮鞮$#|$X20C r$kONC@5$ !1fAbD@|$0Ct |$p0wE cϭ鼭@r(,f(靭铭 $nF|$8*|$0CJ|$0>fA_/jvOЃ6|$0K!J|$8E|$ O|$puЃfAV! v Ǭ齬魬飬鐬醬|l|$8#fAQVfAYfAE|$8|$@ ,(|$0R0V|$@Z|$0GK5|$P鴫|$.!|$8闫鄫|$h^0E|$XwaWfA`*|$@S3|$X3fAY,|$X)|$p+&$w|$8obC~gF|$0pƒ|$Xu髪|$hv$fAabYfA^}\}}|$ L$L|$LP|$@%JG?M|$X$z"O|$Xaߩ! TRAR({饩o+ 鉩Hv$ E|$@EB|$@ Q_$>|$])AX|$h`X|$hh: 麨 v|$h阨}(DV|$h:o|$ J|$h^|$@L|$p8#$Pj9~)~ ~  |$8M|$XB*AէfA( !)g$驧|$-J邧fAH oxAtsAsA|$8Y-|$X$FfAdjx7x*F'vF|$paFfAaCFEܦ |$XwfA>韦|$ha3|$@<\fA\onV(|$@ l$<MfAZ|$X'$ ] |$p0::!OOե|$H|$p0K|$h}p|$Hi|$@闥W/;b#;u|$pv|$@^T|$pABfAI4Ѓ%|$X1](|$0) H!wEA PҤ|$X7{*|$hRv靤8~l{l|$p'lm|$pm1|$0Mp:|$@ /(v|$X0|$H4]|$hY3|$p2d|$@  )T<驣,|$8Ѓ鉣 WVT?|$8:Y|$8+6fA>i|$p91W *]g ' |$0upۢX. (e$C w$4酢 .~-[]$$fAB>YfAUsfAA? $ IvE01Aɡ|$@$fA2(Ys ٫ 锡A /$z|$X/(|$PZ$O|$8=^A' UiG<><R*$G$v|$X7Š黠|$hJ_l[SfAa~I}s|$P1sdO|$@=-5(%|^ s|$p V$|$p+' ֟\ ß#|$X*\|$@Ѓ鞟L= A T)nI|$@IWSJ"a@|vN |$h*|$Pa |$X=ߞmvɞ鿞|$X3P$t|$0|鐞fA\n,|$0eO_ |$8 ٗ|$PKH|$p*|$0~.|$Pizl= [|$0f 4A4ĝ~|$p/ed ;|$@鏝|$0l.|$8%S|$@ ||$8bf]E3/|$@'|$0`W'|$87PAƦ|$0c=A̜鹜 P. 靜1fAZ釜A3|$/8|$p  Ai|$P <vA%&HxG|$pG MNϛj  _鳛頛w%"$ V OE6AC-;!BfA\X$6 LIfA\D|$88O ؚ|$8g*$OEىC$鑚|- Ѓs|$H||$@\R|$p6@-|$h v]|$8K W0AM љfA\ * p;A驙|$]|$p8)M|$6Qu|$@Ы|$PN]:2fAYy O|$8Sb O|$@O龘D-|$hC9-Sv|$p.酘R(|$hO?[fA=[E[$P|$p)D?EL0`C0|$8 )$m<|$08v|$hwX|$pYJ頗|$p =酗|$p:*|$S|$0{`|$8(`A`|$8C`7|$p*1|$X/6SifA@O|$05 |$h2TՖĖ/v顖|$@ ?3|$8鄖|$@7 MX.T#(|$0cG"|$hE61fAZ |$p2cC|$8<Õ鳕$ #SuJfA]'|$@s|$h&|$|$0OA5şFM>Ģ|$p(|7|$X7gJ:$2|$|$@ mivfA^xVY* 8ƒ|$X T$Sv|$8Y+|$@ c|$@v|$8餓WSe.$-.hpD$X6Y|$03>fAZo|$p6G6o|$@ .$|$8 T;\גAh-fAXM-鯒O--鐒:L|$@iV|$0X|$@ U<-_ 9NN$a ĝ-|$X@ё|$XfAdBޗ6|$XBzSGsmv|$H[QA~F|$h,(|$p8GF:|$@-,|$X8w^0ؐΐĐ[鱐駐|$8镐-fAK-ka'(p;6W#|$H<l ܏p *|$X*黏J-|$hU?-靏|$HPW%MOZ ЃH|$X)T.iIUO,,p}MʎA#魎fAb#9١}gj|$h+#fA;|$r$rۄ|$8 p|$XvEh ލ|$X=+qvfAN饍?钍 'A 9$Na5E1|$H/%|$@&'|$h/2|$h(v8fA,~ =݌ӌɌfAZ%|$0]d|$X2de阌)1ZXЃw|$0D'"S|$8N|$X'v$fA\AA v|$8|$8XЃދ) afA^a 鮋0U鏋\ |rF'|$8*-E;|$@ƒ|$p-uw  ':' ފԊ|$h'$髊u|$^鍊fAatuk$9|$@k`k FfALQlV|$8O6|$h|o $;|$p :|$X/鱉|$~A铉|$h_#K#|$@w`g]|$p%[2(~r|$8dЃ,D"3$ TofAbm|$h=|$8|$Hl|$X#aňE3|$X2kd|$8'v鏈|AkA2>;Q|$X1053|$@!x*|$8[fAb$x^|$03Z[|$@$ 2|$h鞇|$X&鏇@7$4P|$@E$O<|$8)|$pW&%|$@3|$0LXFA3"Ѓ鿆|$h5=s/ Ѓ鍆?U|$XK|$0E2|$0<ƒ2AA2$8 }fA`%|$8%)kk|$8 S_=|$p02閅|$0*/fAEi|$p.o|$p(Ի|$p#̳|$XHt@A7|$8-b,cU|$h>|$p(SfA^3 G$齄|$X8/AIlD$pP郄 P(Z\Rv43|$X6($Fc|$p63S_|$p Ѓ^σ|$<ocu|$0$s|$X2雃|$pt$$#[Ѓm|$0f0c v$D:|$Pc0I\ l-|$8 _|$p_-9|$0V 鵂颂鏂$% ^#k|$8 . '\'>D.2|$hS|bfA`g|$hOI|$@fA[4'|$hRNM|$0Ѥ|$h( 阁fATbm )|$X:o|$p1&|$0tK|$h5Nx |$h5-A-Vc|$@$^|$]|$p0 ƒ|$@ֶ|$h˶Ȁ|$8%*6ifAZeY鎀|$8vP vl Y ƒmt \0.|$h3.|$0>'.|$hxF/|$XA![|$8<$gZ|$h]O.J'%JoH'/S@$t (|$P bDk=~_ Fi= Ѓ~].A9_|$0Zcߵ~\Ѓ~$.$E^^C~-~ \E|$PQE ~6Ѓ}$ v|$X7}}|$X69|$P| }2 NN}|$@ c;[}1K}fAJ||$p1.%}|$p6Lx}|fA?< j6ve|||$8=Al|$Lm @m||$hS ; lR|<Z k|$@ |Ob5+|_F<{|$0W-fAXux|$XCwD$8{{?{|$X(rArArsQ{ 5k ,{|$@{fAD.zHBGl|$X;.fAYyXs|$Jsx|$h;2 x =|$HOx|$h#|$hdЃdxBBBx$ 7O'}"Lx|$vAwwtPw$??=fA`~|$@~|$X# |$0z> tw|$X"SS#&#Y|$8ij|$P|$X,|$@5Pvvvv|$p:K;|$@?Zjrv9v|$@0 p|$0[wwJv|$@*|$8E-y !vZA|$X4vha$)$v|$0duu(heDhu|$p|1Hp1pu|$8QX5O5RuAq8Ap|$8,u$I;d$1|$HtV&` I|$8A|$086fAadt|$p3I Wƒ|$8 )|$8 Ct|$p-0w<tArA3xs|$@sy:|$p1h Nh1fA`soq9Js|$p6&  as|$6Y)B/|$0S$7$MvPss]rvЃrA2?g|$8r|$X'fAWx$Bv srir7|$hPh$=r7fAckhr|$p 4Bqq|$%%q 99qZ|$@ yqoq$~ ^-@Nq ƒ|$Xnq nq~*|$p"$p4fA_9|$h9 ppm5cp|$8wpAfp|$0H}Hp|$8k$ƒ$up po|$0~"Ҁ |$p-oAb-|$@ Ѓo|$h?2|$(}fAVŅADgo|$@ &6;t_fA^8e8/o % |nfA]nfA6fA0n|$p2:!XҠbn|$P, |$hIk|$X# A |$@ fA\JnU7n|$h}%na5 nqn[njmfAO w|$@mfA[2$A l|$0Xh|$h!fAVDA |$p51]m_\R-|$pD-0m24|$p?_l  mU v|$X:ll|$@vAll|$P '|$p4 t7ll|$Xwnl$ 1Jl$u A=|$PZ;1fA[Dl l$ibK=|$05?qk( Ak|$X? 1v kk{k nkdk|$8RkHk>k4k2|$Xk|$h~)fAb`whE|$@  j$j|$X8F"jj|$p |$Xwfj\jRjHj|$8-|$X6eej|$@ j|$@ uZii|$X-ii|$X?h{:R{Dip~itijiM&|$X0ZAy-iAr*Ui *{V|$8V|$8Ѓh|$XB'|$P}|$@hhhh|$8xWЃh{hqh|$p8 fAV54A*;hc+h|$P|Vh h<6Mge|$8uHSgЃgg v|$0gg~gtg|$pt>|$0;4>|$ht.8fA^|$hr*g|$0r<<|$0J<|$@pkfAa`fEff R|$h}vRXRv0f|f|$8*C B ЃSfIf?f5f|$0J @fAa?|$@vIee$1|$h0*eeee|$X=e eue ee[e% !'ees eeddddddddddzdpd:-kQdGd$``J`d|$8)dfAPu c|$XZfA`Y|$8Y|$@ |$0=4=cc|$8TacWcMc|$X5h|$8rhlMc|$8 bw7f$bbbb|$hd8fAL%8|$0A9݆|$@ dTfA\Ib|$p(rbhb^bfA_3g|$hG|$@ g`bbQ7A%7|$X=a =7#aa|$h9/aaaa|$hA 3|$8$Ma|$X27|$hc 7-a|$0lV1LJ |$`.3|$܈A`fA_"5`|$83``z`p`S?A|?P`=`<\EFE|$@;E`|$@ H|$p6_GSG|$@O___S6c4$'@a_fAYOJ_$75v &__|$8 4|$hu>|$X6|$pu AZ^|$Dr>|$h?Q6|$@ v^^Ѓ^^|$hb-|$@-$-|$X%sJ^w 4^*^ ^^.|$p |$pƒ]u]]|$8U2|$p1/2|$8܅|$0ą|$X=]$.fAaEl]Y]O]|$hx{.]X<|$0et|$8-\\$ v\\*  v*\\|$t8*\YtVZ\P\ ,<,1\'\.|$8.[O+|$X8+f3[|$- $|$X79 [|$@ +*?:|$8wH[0F+ ++ [f5+|$@[|$Pd9E%|$p7vZZ lZ'|$Z% w|$@wbZ|$8LPZ7&|$hW&ƒ|$XuZ Z|$P/&x|$p/xY|$X/F|$p Yz,%|$p$y)y$Wv1v|$8bYXY ?7n?-Y#Y|$h6j;fAS;XfA9<|$8vfA\XXXd<Y<|$@u-_SXAwkXaXfAKkD_'1D@9X|$P DXXPC(UC[Fm$ٸWEW$v1WyWoWec3$NWDW1<|$X80AWfAU2-AV/fAR VVVVЃVA`CACC|$@ЃuV|$X3:fAS3$v[AV7V|$8<=<"V|$X(/G/QUUfAZA@vYMU$rUxU<<|$8Ag8wsDU:UfA\::?&T|$8 vfAVTT|$Py>IT5j j5|$h  qT|$h%8XSTIT?T|$X;-T|$X-vWT TTSS|$8+ S s@ g@S|$p <X; SvS[fS\SA5|$8Q5|$P*5i%S|$X;N|$p,t|$8<SRN*:h GfAP<RG R|$@ 4|$@r4vfAMR~R|$+b`v QRGR|$p+8$0+|$X'@|$h|$8 !$|$8wQQ Q|$p*"0|$%0|$@0A/Q:QfAa^DfASmYQOQ|$@ =Q3QHKD|$p$"DB Q|$;)4|$03v|$@ PPfAK,:|$@|$POPwc zPpP `P|$POIP?P,P"PP$POyP1fAZ 1OOOfAAcc|$PBO<|$N<L|$X7|$@ 1|$H?O|$p6_a|$p#*a|$@O|$XUcTVЃN|$R|^tV|$8NNNfASyT|$X4[T<N|$8K|$hIvm_NUNC13Ѓ.N$NNN|$@MdWH|$p 3HM|$hlzL|$pFL|$@pFM|$09+^$*@|$hA|$p4v|$X)VMLM|$X9J|$0qwJ#MM|$hze`xIЃLL$ V<L|LfASL~LtLjL`LVLLL 9L9)L|$85]|$T{ KEЃKKN|$HNKKЃK|$p$D|$8 ߰|$@KuK|$hLzKK$ w|$@ .K$KH|$H9fAVrn_|$p;J|$P:":JJfAMZKJJ|$@ R g2gjJWJMJ$ aw[b|$0@DB^~I|$h Z|$PYЃI|$p0G|$hGAIAIIIvwAmIcI V|$@~VyA 2I$A III_KfAU|$8  ȁܷH ?$WW?vfAJHHH$}`H$-Jvu6H,H"HsHHv|$8GG|$X9|$h{E9|$03GP|$hjrI|$05ЩfA^A^/C*(|$89@G|$hx2B|$p3|$p,|$8|$8v|$X2FFMYTF!ЃFFFF|$hvSSF|FrFw={ v|$@ EF;F|$@Uj F!B|$8EEEfA``=NW= EJ EEOn6E QiE|$?|$huvbFED+DfA^OD DD|$0EC|$@ CC2|$X:2AlHI|$Hl|$@aCrChC$JgJC$3Ag3ChI$J WIBp 6BfA\a3A v|$8 BBB|$@V <|$h-Z|$0O9|$X5MBfAE 5B+B|$@b0|$$0|$@$7( AfA\XPo|$@W+vA|$Xq e {A-{o\A|$@CFv$k3A)AQF|$89FF AA1fA^@ .|$XD.@jM|$0b $@|$@!@W 9 A ]@S@|$8!A@7@|$@W|$8W@ @@?Nh.|$PK.|A???|$@\ |$hQ ?@ܪ?f?\?|$X2L >?|$@ <|$8!??$fAA>>M#w>>>|$8%87>fA\.^K.|$@ |$X5M>|$HKuKG#>|$PU|$8zG=|$X15|$X|$P==|$@2i=|$pzA|$X>\Aa ?|$P4g=@T=BI|$8'IA#=fAWcL=_4|$84<<5|$8e_E_9_<Ѓv<l<b<|$X1{|$p$wKB<8< l?|$X08?|$p- |$hI; +6+ Ѓ;|$@JS;7^?|$X5fAQo/x;n;|$P,P;|$@ ?fA`f1|$P$;CP|$8;Gt|$h0fAPR|$p)R:|$pv.9|::? A:|$X,n:fAV:|$p":$m$4:*:|$XB|$P3R|$X=9999BfAaA|$@9K},|$@r,9|$p4::$ k9s??|$@ EЃ69|$& j&fA_|$hfAKO8A-8c888A !8v,|$X- v$6 S8I8?8$UA@|$88` 7777|$8we|$PZY$DY$qYf >X1|$p}7s7|$h|Z>ZU7K7 Z|$@Z*7 77\7fAHgZTZN66 _V|$p5TV666666l6 Y6Jw`G6=6iS|$8|S6F 6Xk~XrXIX5|$p555|$hTp TzЃ5|$HSR|$X'RT5J5|$@LS(S|$XGLSRAR|$hЃ5 v4444 4|$8 T:aTfAOS=45|$X+O|$X#QM4C4|$PCR<4fAFN|$p)N|$hN 3,3E333|$p(5Q|$p QAQQ]3S3I3?3 Q|$PQ33|$@ QAQ2$z^z2|$X7|$@2 +$~2  !_2U2|$p.|$@Ѓ92A(2|$X*UU1|$8v3fA[SL|$0;>L11$bKKWQw1x1n1|$h<%_ yL4W$$1`|$8j|$p0Z'|$X&0Vv|$0`00000vn0d0Q0G040*0|$ uV$ZV|$@OV//v//|$X3w6$l$vv//|/Ak/a/|$X3O/E/ 5/$8d0|$hpw/..O.$!fA` &..|$8..|$8Ar.lS.I.|$8(. |$@|$8 -$-OЃ---|$hu-|$p)w9|$PU|$@mUwOd-Z-7J-$vETT|$@ TvfAPvZ:-|$@,|$hDw<|$0mPKP$wh,,|$p(t|$0]t|$hmt|$8ty,o,|$pwA|$pDQ J,v1,',|$X$WЃ ,,$ P$ ++^ T++++SWЃu+|$ w%$LwS+I+|$@ sU++$QRR[*$>PW**v|$H*****|$8.P|$8 P|$@ +Pe*R|$X1?r5*+*!*Q*))$^w1fAYqA E)<)er$Tr1|$p8)w;cЃf)\)qq=)*)S|$8S$xQ(|$hT>O|$h P(TAT|$p.T|$X;oTfAKuUy(Av f(\(5v$>(4(|$X+S($w"PvfAW''_ehq' mS|$8bS'|$XATTT|$p0TTo'e'['Q')' $kl  ' &&AwT|$HX|$pX|$PX|$hnX w$%&&~OXR 1t&j&W&S |$hac-&#&~[J &|$0]fAKy[ bfASb|$0Xbbyb%|$p>#[|$X=[%|$8cbb|$8b|$8 b|$Hb|$PO>%fAaa|$0Ew%%_4b;b$(ub|$@ $|$@ mnWnNn$$2Y|$h?tn$d$|$X2UF$|$p2UU($$$ $$##fAO Tu######|$@u#k#a#W#i|$0Q?#b,#|$p"X|$X4u) ##wY|$@"$""}W1fA_D@"|$0*``w"|$X-]]|]D"AvD@1W$W|$p v$"!|$hX!Ri|$@ -i@ii|$8h!!!|$hwjbcRca!|$X/V!Ab|$pb%b9"!oc|$p"^]%M|$0ZMA]NfA\IXI=XIw!|$p'vfA]5X\V\9\O_vy/ C 0&|$X*aXXL|$h2(J- YЃ|$X=mN}N=a|$aV nDmW|$8IW?G$ w>$H|$0^G v|$HfAVG3WW0A P ƒ|$p1u|$hAWMfAYXMEMA;M%i2|$XCC1{_fAAf_@X|$8 wXUX|$pF|$PEE|$X1E|$paK|$p!v;"|$@E$E|$p,&[|$p!ZAЃ|$hn{Z|$8VZ$:[@ZdQG|$@5+!u|$X?u.v|$AaگO|$8 |$X9|$8 |$pnX]|$@M]MC1|$P<D0&9Q>]2|$@ |$0/*h,ss|$8s|$WHD2|$8^."|$8z|$8#At W@6|$0\|$@&$a|$XB|$8ӗ y|$X8 |$@fA` a\$E;1'fA[|$X.wv|$p)|$p+|$@ZȌ~A|$P: XNfAM=6,"fAU=fAQ f|$H|$hM$fAOW|$@E"`ҧaND|$8w8[*$ vk|$1tw tyt|$h$m|$8FXu|$@q$-t U|$@O"Aw_ |$P$|$p Ѓ|$X&a|$@ƒ$a |$8  xMc`Dcj ` |$hk ihG6 &   |$h |$@On $" |$PO $HjF j Awp f \ R H |$h$ $ |$0v  AwT$|$h|$02Ϗ.ÏZЃ Ѓ $o fAbm|$hzmY lAl * ; v|$X7   |$0\w+A|$p$v|$hk   |$h6{A^|$8  fA]# `#k B O Ѓ= $%  '|$H|$8 w0c(d|$hd|$@   $ss1 } |$p"|$] S $,o o # |$X>hI nf InAn]snnЃwmc|$hvm\l|$h5bm|$@3v|$p20v|$8SfmTm|$X<l =md|$0SwI|$X@kAkOw |$@<2 "fAVl|$Hl v|$|$0bplAflN|$8[o[tЃdnDs?|$P+|$hw"7v ֌|$8ˌ|$p4w~~y|$@fA[^SST`* |$@|$@w"v|$XA4 8rfAc-rfA_$u|$h{$ˁ$wvui>4* 78r|$8#r?r_7|$p]|$HTH_$_sK `Vs =|$bbcbb|$X=[Ѓ|$@v|$8 |$hAyfARdRH|$@]-#|$P5[-|$@w-R׃vA|$P2 Wv4xfA`ߙ|$@O3v|$p*|$hwCA g|$0`fgfAX~H|$p2gfAWf|$@w/fAPƒ|$8urh &@ ȡ|$0_|$PtA` fh|$X9Qh|$hFh|$Pl|$X5v|$8fAblNldZ|$8ЃIA (,Zl ^l<j(=v |$0_Aw<rjgA}jxJ|$p*`,vfAX |$@wUAlwllm l|$HrO6N|$X1K|$8{|$p3_|$0@=o k jwYA Y~@|$8 ԔȔTJ@6,!|$PfA[fA_қ|$XvlЕG%|$@?\ g~|$8~=3 |$@ aP|${PfAYfP|$@  V  dfAg~'uqd\qI|$ 7$|$8w|$I|$?c|$p%c7c|$X*bAcc6w~tjf RSRfAaƒLvRAlR|$@WR$IR|$p)Q!Q|$8 }QuQJlw|$@|$hyEy|$w-|$8%v|$Pui_Tt|$0t;|$h"R$Q|$@  |$p%|$h"*Y}|$87|$0;A$P |$0.VhVPF|$he|$X&$26wwv`ƒ|$@A1|$@ D@|$PcLAOL RAAb7|$X"|$P|$pބքx|$@OOQ&|$8bTYTj` 9GHt|$p#tBtt  |$8wVfAPR Z VD '  $SRyfAX'y|$PxЃu|$@cQ S|$hA7$v*  fAY |$0+?V $fA`IJI|$hrI|$p .bA  b|$0[a|$pa( aTJ|$8 IGu|$@u0v|$83|$8-}sibY|$0EA:b;b_bS$8b'h|$X&vg o o oA so$tfATt|$X2vnUKA l|$X=l1"|$h[|$X;fAQF>OAOtjw=$qqv/%fASO|$pklfANVl|$hAl.lfA^#l$B h|$h;MM9Mj$Bl|$@Kl|$hz6llwo  {O|$Dw)|$@ HwA{|$hlbXND:|$X&iZ~ifAcsii|$X>G|$8tAA zpfeSIYKFK|$p/1K|$fAbK|$HK|$Pƒ|$@.KfAX#K$m fAY/<B]$iqVCKfASgffA]gzf1|$@ :|$p939|$hl9]ddH|$X=>H|$p+)H$v|$p7YOE;,+|$h,w)6eAv|$8#|$0Q:I$ЃfAT16|$h6A55|$ho|$hTT6 (7|$868$,|$@|$@M5|$8>$C>|$X-%>kЃ1|$PD@$-|$@g:[:|$X,F:7Ti=5|$8|$@|$p"8b8|L829E2` mcY|$pv]|$@ @6w/fATA!Ѓ|$X4„tw|$@|$X@|$X,w@|$8 w/wo[QG=|$EwPw0 Aw3|$h@fAZ7|$8 v&1fAaD@w|$hCw~|$@wm1|$HDVLB$w||$H#|$p w.vw%E|$04fAPs\SIv|$p,1'|$0]|$p2wO|$8t-Eu|$X4Dw||$@va1fA]D@|$X%w[h|$8P>4* |$0=w1?w"fAb~|$p'|$X8|$X*|$X;wB|$P} vE||$@anЃO<w0w($iw! lƒ=u<|$@ w5w{qg]S@6vgR!|$X(v|$0wHw+$wt}jZPF<|$h)w/[ vo pwsw1Sv|$8wow($Sw|$p%wsg]|$8<|$@<T 6w zvvav|$X%}s|$8EUk BxwE|$X'w( v$ 1fAa w|$P9wk3w*|$Pƒ|$Xt fA^|$X7vtKwdYOfA`?|$X* tD w |$P }fA^vvA|$p&w:|$8 vlYOvD7-#|$p-w#w tj`Vw9|$@?wFyv7|$8w&p||$p4|$@vvwn|$H|A|$X9ЃBv!wAuw.|$8w$i_OE;|$X8wRv@$ w21|$H|$p5wyjwXv|$p(Ѓr|$Hbw$1MC9&EЃ}|$hyw{$wdwL|$HOz|$@DcYOE2(Pw|v_|$X-wE|$8wYo1fA^D@y}4a|$v@|$pw&@- v/fAY|$p2w[g|$h}xb|$X28fA`#wCw<|$hzw"fAb~fAbA|$pw#[w|$hew-zbw<$o|$pwG|$X+v6|$8t%wH1|$ D@5+! |$X8w?Av/w'BA1|$PD@v-i|$hQwOEwj|$hkvYuwG|$X.w!XvA|$pvpv'fAaW|$X.vFw>pAw;ЃXNЃ<2(|$8ƒ<u"Ow$PwJ$v3$;"vJfA[N}?Rw-|$8vwf\RH>J|$@ $7 wv|$h&'wEvv$AЃ|$@wN|$hv=$wRH1|$@D@5+w}fAb@|$8|$X,@A N}]wN$w7|$@Ѓ]$w}]wh|$h>v:|$X27-|6fAa1|$P|$@v~|$p#wxn|$hfA\|$X4|$h;wK|$X;w1*&]v%1Ѓ3Ѓ|$X1v|$8 rhw~PF<) |$8w4w"$v>Ѓ|$p*w7!w1AD@bX1E;1'p  D(|$hw\fA^;w%Cw|$p/ukAZ|$8 wN@|$P~j$w;fAV*mfAY=nv+1D@Av=fAM~67v'ndZPFow5\w#v/ wfAZ|$0]ƒ|$@QIxnd$LWw 7-v|$P1 w=@w;w|$8Ѓ{|$8(wc$bwLfAcE|$8w4v,|$p4w'$A v"} vfAL$zp|$h)w& ЃWMC9/%|$X;vIv7 E|$8?w.w&|$p0Iva^0Mz|$0OwY|$0Dw8wQGI4|$hXw]E|$@w1v~X|$hIE$wDeoe|$X1?G=3)2wA|$pwpwh$vlbXND:|$@ ƒ|$8uA |$@ v2${q|$@v!A wSI?5+!v%T|$@fA]Mv;1fAUw0>xn[Qv>|$8!w78|$X5wxfA]=Hw.wЃ v"|$7v[|$wN w$rw|$Hnd+K A/%|$hMw,|$8|$P}#'޿=οĿ麿wJw8Y隿鐿醿|rhXXNw4T9|$X'w' |$H|#v׾;þ鹾鯾霾|$8鍾郾y|$hLg]whxB|$pw3|$8w"|$@uvHٽϽ9w`wN}0駽锽銽w%fA]uqg]SI?1fAL-|$X4w-@w(~w-|$@w|$@ܼҼw?Aw/Tw*鸼鮼|$hw#yЃ阼鎼鄼|$P~ewm|$T$4 |$X?wkfAX~d9/Ww!w|$@|$JvA ߻ջ˻鷻魻飻陻|$p4cYwCSw(9$D !N?|$8tfAXݺӺ|$X.v1 w"|$X4wo饺雺鑺fATTAAKZ$\vEw=;(w5|$0G!|$w,|$0PIFҹȹ|$p(v3w+\馹vZ鎹鄹zp|$p&|$0HwV:w>F<2(w#vݸiʸ|$X.鸸鮸餸|$P ~#銸zpWMC$+!A7wV'wiwZ+ѷǷ齷|$0M髷|$H~|$p1銷逷m|$POVLB8%|$ptO|$h~vH|$@wUvC$v,|$p0Ѷ-鷶魶飶|$hF|$8zpf\|$8t#VwF<2( zYw}zӵ|$p(wHAw-w|$0bw髵页闵鄵|$%wA|$X2v0cY6Fw*d]|$X'viF<2v~|$@vwfAb`|$hw w1Ct/ЃѧO鼧6鬧颧|$ƒt|$8vlw"T|$@B8.$|p4Ӧɦ鿦 v韦镦鋦遦|$p8w-|$h6vЃaWM=|$!+!|$p;|$@ ֥̥1fAX鶥$QЃ韥|$ tu|$p1wn|$X8w.vwpf\iw{fAT~jvXtF|$v#|$X9u٤ϤŤ黤鱤駤|$0Cu 酤{qg]SI|$p7W A$pvmIܣң$t]$w=髣顣rwB|$X,w;鈣~c kaWMCwO (|$X4v!rvA |$8vD v5â|$p6|$P&f:顢闢鍢v Wwrh^Kv70|$v|$X8 |$pwPʡ鶡wAu=頡w鍡fAX6AwmcP|$0H|$8_o$u۠|$@w,?w$ |$X3w騠鞠2e[Q"(8|$@ wPAw($W w  |$H~|$8 w~ǟAv"|$p#w韟镟7w Kzpf\|$POE;1'|$X:wT|$H~C[w;H ̞֞bV骞頞閞1|$PD@郞yom \RH|$X.6|$@$|$00|$p"wK2vUЃÝ|$h`|$p|$hQ|$P }wI逝v$^TJ|$PC>-|$8"|$ fAYv|vdDwLw2͜fA[髜|$@陜醜||$@v2w*c|$h*w-|$8 v|$p%C9/rwQ|$X4w8|$8 w'|$8̛֛|$8(v-鲛fAG~阛鎛鄛|$@wR|$8 w4v"|$X@w(VLBD$X:+A w.|$@w4  Кƚ鼚鲚騚v$V通vlbXND 4*  |$@w$0 w_鸙鮙|$@(& wE$v;r7_|$X<A7|$h $ |$X?wpAwT wB|$0U$!Ѓ[„t$6騘鞘1|$P鈘u|$@e* eЃC$wU|$8w#3 v.  $twT5 wBVw)|$X/|$0@|$hw4`|$X*w7 A|$X2|$p0ȍ fAA|$vS$w!|$@w|$P߸|w;v, vYWMC9 zvyPwg|$P`|$X-=|$0@fAEyv]vK餌隌鐌醌|$p4w'_lbXND$wrfAGaAwK$i|$h|$X:ߋϋŋ|$@wD$w$$v|$8*鍋-zAi_ w#vZA7-#AujAvZ_݊|$@ΊĊ|$0Qwv|$p+wG|$hGw#|$X@頊閊錊Jv`yo|$p/|$@ wz|$0Lw=Jw8G|$0fw;|$h@w*$vZw$QӉɉ鿉鵉A阉fA_]|$0TvLw2Aw"fA\dZP|$8W>4w}w34wy,wb|$0{v4v"|$@ w͈È鹈鯈饈|$@ 閈ew"v|$hvl|$@ wySR|$hh!fA]!)|$hv|$@wJw|$h^|$X4l|$hT@`鹇|$p$wp|$hRwI:w7/w鈇~ЃlbAwIv7kw/Bw]|$06w4w%|$hRw v|$@݆|$X8!駆bvQ錆wTwB|$hqv;k|$8w  ND:0&|$X6?|$@ Iw,wȅ龅鴅$|$=|$p9郅wZEwE|$X9w4|$p4v#6wOE;1 !Hv$|$8Ѓۄф|$8=wR鷄}Ѓ饄雄鑄 w#|$hLvx|$8Nf\fA]OEfA_&|$X1,"|$8 |$@w8|$hbw'ރԃʃ鶃鬃颃阃fAJ~f fA]tJ|$X6wCndZ|$06HB.5+! |$@t`e߂Ղ|$8wa|$h#wF$u29v#dw馂霂钂鈂~Et4qЃj\|$hw$E;fAFG$Rw# K ӁgwY|$hBvRw@|$8 魁|$w_|$hfwN w?w$ uk+XND|$8 |$H|ScvA$ w4|$X6v#wAԀʀs魀.|$8fA^|$8vw-|$h+jw.Os4s$Ѓs|$8v6Os|$X/vfA\rr1fA`rUw rr|$X;wP|$p7w?|$8 w8rrurkr[rQr >r4r|$X6"rfAb=Eu+]q,wM|$Xw"1fA`qq|$|$X0wMwEq$  fA@lqbq7vJq@q6q,q|$X+ƒ\u:w2qpu|$Pppp|$p"|$hEvfAYmv[1|$p!D@p|$XB|$00fAX3VpLp|$pw"Ѓ6p1|$PD@#p|$P|%v$poo|$hTo|$p&w"|$P|9oo|$h,w<|$X:w5ofA[8w&Ѓyoooeo[oAJov;|$hlv4*(o|$@v>fAZLonfA@nnfAb|$8Sn9|$p&wSn|$hfA`fAV=|$04w[|$@ Jn>7n-n#n=v@$tv)nw%|$0>Ѓmmmmm|$X-|$@?mv{mqmfAbfA`5S$+|$0/w^$vG|$X*m1fA[D@m?w^|$p$w6llfAWM|$@ lfA_k|$vZlfA]&0l~ulvCw;[lQlfA[ju$w*l ll|$X*w\k$|$0=|$ z|$0;efAN4k|$0/wU|$pvDkP$2'$ЃakWkDkAw"-v|$@'kk|$X7.FwH|$X3vAj'|$@|$@|$p$jjy1|$h\N|$0</|$pwPrgj|$$|$pwM|$05w*j j|$X9wI|$hjw/wjiii4ii|$hvi|$@Ѓii|$8Z{iA|$p(VGi7wi|$@wOv=|$8 w6/w$|$p!vi[ihhTh|$8wW$v@hhwhh{h1fA^D@hh^hQh8w-9h|$X3w1sh$w$AhoggggggAgggg~rghgv ? vRJg@g6gA * gg$wM|$p8wF w4: v,fv|$X)ffff vfffufAt"vfAYWfMf$t-$v fA^A ff ff|$86ew6|$pweeOeAeee~eteje`eVe2Fe3e)eeIvHe|$8wLAw<v7d|$X=v"wddddA|$h?|$XBwkoded[d$w!|$8w:d-d#ddddcccccccwE|$8w41fA]D@c|$X.v`|$8 w0w|crc_cv?|$ v.2v|$X=6c,c"ccccbb|$p0bwwbbbbbubkbab|$X6wLv:|$w 5b+bbbfAM|$a|$8taa>wZcafAX1|$X+v Gv"aaa|$8maOXafAY >a4a*a aa aa```````````o`3 \`R`|$8w& 8`f %`|$@[ `___|$vd|$p!vS|$p(w<|$H|+Aƒ|$p"uO____u_k_a_W_|$8XE_;_Svx$<w|$@v__ _aw=w"fA\~`^^^^^^$w Iv^^v^l^W\^R^I?^5^|$@^/|$@ ]]]]]]|$@]|$8 ww]]]|$@ v e][]Q]G]=]3])]fA_~2 ]A] \\\hv w v\\\ff.UHAWAVAH=ڌAUfHnEEATASH8H MhDD}xdH%(HE1QM8H^fH:"QM QPE`Dž8PHDž@HHHPHDžX)pMXPEPPE0PE(PEPEpAPERUPE@WDPH0VDHH@f&HHHu`HHRHtf;B vHRHuH9<f;F 2EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuWHHRHtf;B vHRHuH9,f;F "EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuGHHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu7HHRHtf;B vHRHuH9 f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F zEhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu'HHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9tf;F jEhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9 f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9d f;F Z EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9 f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9T f;F J EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9 f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuo HHRHtf;B vHRHuH9D f;F : EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9 f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu_ HHRHtf;B vHRHuH94 f;F * EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu HHRHtf;B vHRHuH9 f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuO HHRHtf;B vHRHuH9$ f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHu?HHRHtf;B vHRHuH9f;F  EhfF"EEDDPE8PE PPE`PPEPPE0PE(PEPPPEpPPE@P MXUPH0HH@f&HHHuHHRHtf;B vHRHuH9f;F HHfF"HEIHpHt!LeH`Lfop)MHELeE1EHEHEHEHEI9tRIw LLIH9uHEH]Dh HtHsLHH[HuHEHtH}HHpHtH`HH@H0Ht IHsLHH[HuHEdH3%(HeD[A\A]A^A_]ÐH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHH%H&H(H(H0L%HHHHH&H(H(H0L%HHHH5H&H(H(H0L%HHHHH&H(H(H0L%HHHHEH&H(H(H0L%HHHHH&H(H(H0L%HHHHUH&H(H(H0L%HHHHH&H(H(H0L%HHHHeH&H(H(H0L%HHHHH&H(H(H0L%HHHHuH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHH H&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHHH&H(H(H0L%HHHH-H&H(H(H0L%HHHHH&H(H(H0L%HHHH=HHHHt7UHSHHHsHHH[HuH[]AWAVIAUIATUSH(HHKHIED(1fE"fDm L9MEv fE9srLsM9t(LHL$HL$fD;h ,HxLHL9tLHHC(HH[]A\A]A^A_@v_L9c MLHL$HL$fD;h I|$9IĿfM@/fA9MHHL[]A\A]A^A_DH{(t HC fD;h w>L{MuIGHtIAW fA9rIG1@I1fDLcMu0DID$HIAT$ fA9rID$1IM9LHL$HL$LP IfA9IM1bEt$ 1fE9@]ML9{LHL$MHL$P If.L@tYLcMumDID$Ht!IAT$ fA9rID$1fL@/L9c L'fM L IHt7UHSHHHsHHH[HuH[]AUIATUHSH(H_(dH%(HD$1HLd$ HSHt8HAEH}D$C D$ Ht$LHUuHSHuI܄uXC H}D$AED$t^HT$Ht$HU1҄HEIEIHD$dH3%(u4H(L[]A\A]H_ E1HH;]0tHIHAVAUATIUSH(HdH%(HD$1HHA$Hu E IIHtLs HtALLHHC@HHL$dH3 %(uUH[]A\A]A^fL9tE H{D$B $t+HHt$HS@HL1HHHH+AHEHHHEHt LLH0HHpHtH`HHH@HHEHt LLH0HHwILMoLLR#6&6'6) 6g*ZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E_GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0GNUzRx 0-,DáFAA  ABK $tEA AF $EA AE $EA AH 4FBA A(  ABBC ,$FGD  ABI $TEA- AD $|EA AI $EA AH $EAG AB $EA AC LZ7E H w I { M  K t D q O  N  R J N _ I q O Y O  B  P t D G Q R N u K S M C E R F @ P n B M S p H E S y O s M O I h P b N F R x H { E G Q S M k M _ Q F J r N m S g I ] C r F B F m S m S b N l L Z N ] C y O n J [ M E C p H u S o Q a G H P B N b A X I T I R I k G r P s G z G i A s A z A  M c I i A z P } C \ D [ M  J G I G I c I z J a G @ P z I T I U G a I q A W I B N D L p H D I @ K j I j I y A \ I s P ] K H G ^ K f A c I G I ~ G l I ^ I H I Q I W I i I ` I S I E A B I i A h G b G R M j A l I k A X I I J q O S I ^ G W I ` I _ A W I q I C I G I U K } C ] I  K n A h A g A I G ^ R ~ A } D H I j A [ I M S U I T N b D U E G I X I E N T I i I u P F R N R ^ D @ N d A t O z A c I V I V I F M k M ] I M E Q I k A { O a G A O Q I x I _ N \ I k I n A E S h I G I k I e I o I ] P g I W I I J R A H N G I t I _ I s L ^ A s I Z I k A I G Q K K G F A F A G I X I E A G I ] I V I a I m I ] H Y G d M F I n I | A k O v A P I ~ M Q I R L C A Z I G I t M [ O  D a I v A q A C A F I W I L N l L V I G I S I E H ] I F G j S j I @ M b I ^ A [ K ] I @ J d A H I u M ] L l I v A  I i I T I m A G I @ F t A \ L o A W I w I q A I G _ D m H o A x A n A y P k G ^ A \ A ] F [ I e I ` A A K | I G I n A Y F W I _ I ^ I n I I I k J l I _ H i A p J u K e A h A ] A g I h I Y I  P G I X I @ O A L G I F A T I c I e A x A r A { A [ I a A G I b F G I F A W I o I [ A g I ` A G I ` I D I F A ^ A n A d A l A  G [ M F A M A W I G I J G H I S I F A ^ A { A L I I I g I L A ] F T I G I ` I D I ] I m A R I m F ` I j I i A _ F e I Q I A I E H ^ A D I F I L I o A X I s I y A x A l I n H G O A I k K f A w A I N ^ A S I j I [ I N I } A t I i I } A G I ^ I w I ^ I r A W A ] I P I f I g A e A b I w A n A L A C I K A R L ^ I ] I t A ~ I ~ A m F P I T I T I P A G A N A e I v A s I m I S I ` I k I ^ I G I t I S I G I w A ^ I u A w I T I i I T I n A G I h H s A d A Y A G I @ H u I _ A D A u A G I D I { A g I R I j H T I S I H I c A H H H F v A P I D A @ I v I y D K I R I O I _ A Q I F A F K Q I j I i I i H \ I d I ] I E S G I Q O [ H G I y A G I j A j A _ I H I X I s I X I F A A I q A F I h I E I f A h I f A F A F A H H r K ` A ] A I I t I U F k A F A H G F A M I [ I \ I F A F A F A [ A s I h A ^ L O I \ I k I { A T I ] H S K K A O I U I h H W L Q H N A G I H I F K t A j I g A G I v A A I d A L I \ A \ I E I ] A Q H ] I O I M A c A \ A F A c I h H { A w I g A i A S I v I O I _ H f A S I U I I I B A p A R I H N _ A H I o D } I S I d A w A U H L A S H r A j I K A q F F I m I i A D I G I C I G I F I o F C A w A h A r A F A ^ A ] I [ G Q F O A P I T I Y A c I _ I m F F I S I _ I Y I h I r A U F d I b K P I ^ H f I G I Q I H I e D B A _ A d I p A [ A T H Q I | I Z I r I H I S I  A W A X I H I q I ] A E L F A o F B A _ A o A \ F \ H i A V I A A Q G F A ] A h F [ I j A w I F I P F b I _ I v F S I \ A G I P I K A ^ A ^ A R I F A G I T I D H i I A I g A | A ] I T I G I h I j I L A ^ A v A U I ] A h A F A H I F I R I F A F A \ I L I H I F A G I F I F A d A b I F A G I P I F A F A F H e I F A  A F A F A F A F A F A J I } I k A V A G F k F F A F A F A m A G K v A F A S F v I F A F A G I I I I I F A ^ I R F \ A F A G I h A U I H H h I F A \ A F A G I { A F A z K F A g A F A t A j A F A j A F A v A F A F A F A U I F A F A y I S I t A R I ] A F A Q I z I G I F A F A F A o A Q H G I G I F I O I F A G I F I T I F A j A f A S I \ I F A K I F I F A F A P L \ F Z I F A F A z I R I ] A m I f A s A R I F I F A x A F I I I D A j A m I F F ^ I R I i A G I H I ] I E I F I Y I R I H F F A F A F A ] I H A F A | I K A F A B I B A H L F A F A i I G I k A D I S I R I _ A G I  I _ I O H F A F A F A z I [ I D I F A F I F A F A u A F A D I c I p A E F F A ] A F I F A L I ^ A k A H I H N F A F A H I g I I A _ A i I F A Q A F A F A k A Z I Q I F F G I F A Q O F I h H F I E I F A ] F r I F A O F F A F A F A ] F C N F A H I H I j A F A G I U H _ M F A d A V A ] A G I j A Q F F A _ A Q I F A S H k I S I F A ] I F A e A h I F A R H q D ^ F F A F A F K F A F A s I R H F A d F \ I F A F A w A H I F A F A ` A G I C A ^ A S F F A [ A T I F A I I ^ F F A G I V A A A ] I F A F A k A F A F A F I F I  A F A s A U I a A m I m A H A F I g I G I F I l A Q I \ F F I F A F A F A F A s A F A A A F A V I k I ` I F A G A k I \ H c L F A g F ^ I ^ A F A F A N I E A a I F A [ H X I e I F I F A F A ] A t I Q I h I j A F F R I m F F A F A F A F A F A } I F A H I ^ I F A F A G I b I R I F A F A  A S L _ I C A F A R I G I T H g I Z I } A F I S I o I F I F A r I k I U I  F F A F A F A W G q A T I h I F A F A [ I Y I g H ^ I k I F A e I F A F A a I h A h I F A G I F A F A G I L I R I r A G H F A U I Q A G F F A F A F A F A F A Q K l I F A s I F A F A j A ` I F A L I { A U I f I F A ` I F A F A ^ A F A F A f A F A a I H I F A T H e A F A F A [ O \ A Q I F H T H F A F A S I F A b A F A ` I F A F A G I G I U I G I F A F A F A R I F A F I ^ F F A F A F A ~ A [ F F A t A e A Z I F A ^ A F A G I F A F A r A S I X I F A F A F A ] I F A F A F A F A F A C I [ A F A P I F A k A i I q I F A F A e A G I Z I F A F A F A c A F A F A R I F A F A F A f A T I d A r H _ I O I F A [ A D I } I D I F A F A ^ A ^ I v I h I ` F F A ^ A S I f A v H F A e A b D F A j A _ I ` I F A F A G I F A g I L A L I S I ^ A ^ D G I F A F A P D F A \ A Y O F A i A t I l D F A l A m I F A F A F A F A N H F A M I G I F A l A F A H K ] I e A G I P D G I U I G I F A D A a I R F F A D I R I F A F A F A F A v A f I G H F A G I F A o H H I Q I _ I F A \ A O I Z I F A F A [ I F A F A l I J A { A G A ` A F A H I F A Q F H K H H F A K A t A H A D I x A F A R I  I H I O I \ H X I F A G I N I z I G I F A ] A _ I F A F A F A F A F A G I a I ] I F I f F { I F A S I G I F A F A _ A j H F A v A I I ` H g I Q I [ A L H l I E I b I ^ I U I a I F I c A H I T A t A F A T I F I G I r A F A F A  H u F F I S I F A F I F A V A S H F A e A S F ` I S L E A R I F A G I F A ] I F A F A Z A F A F A P F F A T I E I F A G I V A F A o H L A F A F A \ F F A F A F A F A F A P I U I F A F A N I f A h H G I P D F A F A R I F I ` A F A \ A | A V I F A k A F A F I c A S I F A G I F I H A ~ I F A e I Y I ^ A F A G I F A F A A A i A m I F A G I h F F I _ A u A n F F A R I F A F A F A F I H I k A Y N F A S F F A F A F A G I F A F H U I f A F A H I F A c I E I P I ^ I F A F A i A e I H I G I F A F A t A F A \ A F A i I D I F A F I e A G I f A F A S I F I F A F A X I t A L I w A Y F F A } A b D G I O I R I H I H H v A S I F A F A ` I Q F ^ A F A g A F F ] A F A J A F A F A F A F A F A F I G I ` I V I P I F A u H F A L A ` A K A j I F A F A F A P I F A ` I H I F A F A F A F A F A G I ] A Q I I I F A F A F A F A F A F A F A F A F A F A G I j I [ A T I S I F A F A F A R I G I [ I G I F I F A H I F A F A H I T I F F F A F A F A F A F A S I F I M A t A S I r A F A h A B O x A H L F A i A f I F A k I \ I F A R I F A h I q A q I Z A O I F A F A k A \ A F A w A | I a I H I F A R I F A R H P H H I F A F A P D t I F A F I F A F A U I _ A F A F I v A G I t I F A i I F A R I y A G A i A v A B A H I [ H F A R F F A F A L I c H u I R I G I R I F A F I F I R F F A i H Z I F A F I F A F A a H ] D F I G I F A k I F A B A e I G H F I F F v A G I F A F A J I X I ^ I P H F A O I Q I \ I N I A A k A F I G I F I n H N I F A R I F A F A F A H I b I { F F A F A [ A I I s A f A F I O H F A F A F A F A ~ A O A L A H I S I F A F A F A E I F A F A F A p I ~ A G I h A | A p H N A _ I \ I Z A F A F A F A F A H I F A F A F A ` A G H F A F A H I F A t A F A Q A a I F A F A F A c A F A F A F A F A F H G I B A n I F A R I N O F F L I O H F A F A r G ] A G H F A F H L I F A F A g A F A F A F A F A q A H I a I F A F A Y I F A ^ A F A F A F A F A F A F A F A U A | A F A F A E O g A ^ A k A F A F A F A F A F A F A F A F A F A F A F A F A F A F A F A F A F A G I F A ] I F A F A F A P F F I F A F A T A F H F A F A F A v I F A F I F A F A Y I f F F A F A F A F A F A F A G L b A F A F A F A F A d A G I ] I F A F A F A F A F A H I F A V F F A F A N O G I G I F A E I F A V G F A F A F I F A F A F A F A F A F A F A F A F A F A [ L F A d A F A F A F A r A R I G I F A F A U H J I h A E I F A F I F A F A G I G I O I S I F A S I S I F A F A F A F A F A T H F A R A k A F A F A F A F A G I g A D I H I F A O F O I F A F A F A F A F A F I F A F A F A F A F A L I F A F A F A F A G I F A F A F A F A V A X I F A F A [ A F A F A F A G I F A U I F A F A ^ F F A Q I F A H I F A O I R I F A F A G I d A G I F A F A F A F A F A G O F I G I M I F A F A G G O I F A G I I I F A F A D I V A F A F A F A O H ] A F A F A F A F A F A F A F A F A F A F A V I G I F A F A V I F A a I U A F A P I F A F A G L F A H I \ I F A N O F A F A F A F A ] A F A G H G I ^ A F A F A F A F A R I U I F A F A F A F A F A G I F A R I F A U I H I F A Z I ] I G I F A F A Y A F A \ A F A V I F A n A Y A U A M I F A F A L I G I F A F A F A F A G F F K G F F A F A ^ D O I H I G I F A F A G I U I F A F A F I G H U L N I F A W A F A F A c A F A F A F A F A H I F A Z I N I F A F A F A F A ^ A F A R I F A F A F A F A F A Z I m A [ I H N T I F A F A ` A U A N I F A G I F A F A W D g A G H G H F A F A b A F A F A m A V A N I F A l A F A a I F A F A F A ] A G I F A F I F A F A F A F A F A F A L I F A F A F A { A F A j A F A F A F A F A H I F A Y I D I F A F A Y I F A F K G I F A f A G F H I D I F A G I F A I I F A F A L I G I F A F I F A F A G I X I F A U A F A G I F A F A X I F A F A F A F I ] A F A F A s I F A F I U A O I F A H I F A F A F A F A F I G F F A F A I I F I F A F A O I n A F A F A F A H I s A F A O I V I F A F A S A G I G I F A H I G I F I F A F A F A F A p I F H Y I F A F A F A d A F I F A F A F A F A F A U H H I P I G I D I F A N I F A D I F A X I F A Z I F A F A I I F A L I F I G H ^ A G I F A Z I P I F A G I O I Q I F I F A F A j I F A T H F A F A F I ^ A O I l I ^ I G I c A G I H L H I u I K A d A F A F I y A M I G I F A F A F A F A k A F A F I F A F A F A h A F A F A U I q F Y I F A F I F A g A T I G I F A ^ A F A N I I I F A G I F A F A F A F A F A F I Z I S I F A G L F A F A F A F A f A F I F A d A G I ^ A v A F I F A F A w K F A L I G I F A H I F A U A F A F A F A F A F A D F F A H I F A F A G F O I H I ] I ^ A F A g A F A F A F A m A Z I R I T I F A F A F A F A N I F A l A F A f A F A F A r F M I E O Q I ^ I ` I I I F A F A k A [ I c A F A F A F A F A F A F A S I O D ^ A F A F A Z A F A F A L H F A n F L F O I F A F A H I F A H H F A I H X I F A T H G H P I b A F A F A G I V I F A D I F A G I F A d A P I F A F A G I F A F A F A F A F A F A F A F A F A f A X I M I ] A F A F I F A F A G I H I N I U I F A F I w I N I Q I F A F A G I g A G I F A F A F A c L F A F A G I F A G I I I F A F A O I G I F A F A F A U I F A h A H I F A F A ` L F A F A F A F A F A F A H I K I Q I Q I U A F A F A F A H H F A F I F A H G N I a A N F F A F I F A F A F A F A T A i A F A F A F A N I N I F A F A F A F A e I G I F A F A K I U A G I F A F A F A N O F A F A P I V A F A F A F A F A F A F I M I F A K I F A F A G F D I F A F A S I F I F A F A F A F A G I P D F A G F G I F A F A F A F A F I F A F A F A F A L I \ A a A F A h I F A \ A G I F A M I F A F A ^ A G I G F F A F A G I p A T A F A F A F A N I [ I ^ A G L L I F A G H F A F A G G c A T F c A F A G I T F F A F A F A T I H I H I F A F A ] A F A h A O I s A F A E I F A F A G I Z A F A o A F A F I F A R I F A F A F A F A F A F I V I F A F A ^ A F A F A F A [ A F A [ A F A F A r A a A k A p H Z A F A F A K I F A F A F A _ A E H F A F A \ H N I F A X F [ A \ A F A L H U A H I F A F A S I F A F A E I O I Y A F A F A H I F A f A H I F A F A M I F A V I F A F A G I H I F A F A F A H I L I W I F A F A L I m A F I H G F A F A F A F A F A G I F A F A N I F A k A F A F A F I ] A G I F A F A F I F A F A F A F A M I O I U I F A N I O H F A N D W A F A F A F A F A F A L I H K F A R I F A F A L I M I [ H F A ^ A N I O I F A F A F A F A F A F A F A Y I F A G I F A N F g I F A f A F A F A f F r A F A F A F A i A P D F A F A R A F A F A o A F A F A F A N I S I F A F I F A j A _ A e A F A F A F A ^ F S A F A F A M I N I ` A F A ` A F A F A F A F A F A F A F A F A Q I f I D A M I f A F A F A G I G I F A F A G F N I Y I F A F A F A P I F A F A F A F A F A b A Z I F A F A F A D I G I i H O I G I w A F A F A F A F A N I F I F A ^ A F A ~ I K I M I l A G I F A F A O I Q I N I O I T I F A I I c I F A F A F A U A F A F A F A D I F A F A P I F A X A H I F A d A F A F A F A F A F A F A h I l A F A F A F A \ I [ F R I F A F A G I I I F A U I F A G I F A F A F A F A F A F A O I E O e A F A F A G I F A | I F A f A F F F A T I F A F A F A F A L I F A G I ] I F A F A F A ] A ] A ` I F A F A F A m A F A G I G I F A M I F A F A F A U I T I ^ I e A [ A k A G I b I F A R N _ I H L U I g I _ A f I F A P D F A F A H I F A F A G I F A H I Z I ^ A F A F A G F g F X I F A P D P A F I F A F A H I F A F I c A G F F A Q I F A P I H K G I F A F I x A F A F I V H F A P I J F H H H I F A N F X F F A F A F A F A F A e A F A F A F A _ I F I F A b D F A ` A l A F A F A F A F A F A F A F A F A F A F A F A ] A F A F A U A F A F A i A F A k A G I S I o A G I R I G F F A F A F A G I F A F A F A H I G K F A F A F I N H d H O I F I F A F A F A o A F A T I F A F A F A F A ] F \ A F A F A ^ I F I F A M I G I G I F A F A F A F I N I U I F A H I G F K I ` I H I F A N I r A F I F A F A G F S A H I F A y A F A G I F A b A F A G I F A F A F A \ H F A F A F A F A F A P D ^ A F A F I F A N I F A Z A F A F A F A F A D I  I r A F A F A F A F A [ I F A F A F A O L F A F A F A U I F A F A G I G L g F F A c I ] I H H F A F A F A F A ] I ^ F Q I F A F I L G G I F A F A O I F A \ A F A F I F A t I O I F A F A F A F A s D g A Q I p A F A H I F A F A F A F A F A e I F I U A F A F A F A F A F A F A F A F A F A m A O D F A F A F A F A ^ A F A F A F A ] A L I F A F A _ I F A F A F A F A F A N I E I F I F A F A F A u I F A \ F F A F I I I F A D A F F V L _ A F F F A H I F A F A F A F I F F F A F A F A V H F A F A F A x A X A E A F A F A F A F A F A F A N I U A p F F A F A F A F A G I F I R I F A L I F A P D S I [ I F A M I P I N I k H R I G I G H F A G I \ A ` A G I F A F A F A G I L F d A F I F A F A k I F I I I F I F I P I [ I F A F A ^ A p A F A _ H w N G I k A [ I F A F A U A T I F A F A t A F A F A F A F A F A F A F A \ A ^ A F A F A F A F A O L F A d A F A F A F A \ A ] A F A F A F I F A j A F A F I F A S I Y A F A L F k A a I F A b A F A F A T A ` A F A F A F A O F F A F A F A ^ F F A F A K I ^ O F A F A M I D I F A F A F A H I F A ^ F E I F A V D F A Q I F A M I [ I F A Z A F A Z A P I a A M I F A F A F A F I F A F A N I F A F A F A F A F I F A G I F A F A P D P H G I F A F A U A F A F A G I ^ A F A F A F A f A F A F A F A F A F A F A N I _ H H I H H F A F A F A F A A I y A G I ^ A F A F A N O c A b A ^ A F A G I F A H H F A F A F A F A Y A F A b A G F F A F A F A F A d A F A ^ A F A W F M I F A F A L F F A F I F A X I F A F A F A s A w A F A F A F A [ A F A F A F A F A F A F A F A F A F A F A p A ] A \ I F A I I c F G I N I ] D H I F A F A P I F A U A S A G I F I F A ] A F A F A R I F A F A G I F A G O F A F A N I h A H K F A F A F A F A F A F A l A F A F A F A F A F A F A F A G I F A F A _ I b I N F F A F A g A H I F A F A F A F A i I F A F A F A L I S I F A F A y I m I F A N I F I G I M F N H F A V I F A F A U A F A h A S A F A F A F A H I S I F A F A I I F A F A T I F A F A F A F A E O _ A F A F A X I H I F A F A M I v A F A F I F A F A F A F A D$l\أEA AG $\gEA AD $\EA~ AK $\EAv AC $ ]WEAQ AH $4]EA AB ,\] FGD  ABF $]yEA AI $])EA AA $]HEA AG $^EA AC (,^AJDG aAAH`X^ FBE E(A0A8LP 8D0A(B BBBE m 8D0A(B BBBF (^AJDG aAAH8^FEA D(DP (D ABBA zPLRx D$FBB D(A0L@s 0A(A BBBJ <l*EC DQHD.h. B ,zPLRx  4   -@  FF !%PáR E`63 `s  `U7APyأn0ge W$R L 0y ),"H 0#8" A" ."A" * ; " !     ) 0s%*\ hevc_asc_agop_tree.cpp_ZNSt17_Function_handlerIFbSt4pairIttES1_EZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjssEUlS1_S1_E_E9_M_invokeERKSt9_Any_dataOS1_S9__ZNSt14_Function_base13_Base_managerIZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES3_E_E10_M_managerERSt9_Any_dataRKS6_St18_Manager_operation_ZTIZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E__ZStL19piecewise_construct_ZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjss.cold_ZTSZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjssEUlSt4pairIttES1_E__ZN4aenc11AGOPSelect1Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect2Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect3Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect4Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect5Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect6Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect7Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect8Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelect9Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectAEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectBEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectCEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectDEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectEEjjjijjjjsjjjiijjjjsjjj_ZN4aenc11AGOPSelectFEjjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect10Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect11Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect12Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect13Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect14Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect15Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect16Ejjjijjjjsjjjiijjjjsjjj_ZN4aenc12AGOPSelect17Ejjjijjjjsjjjiijjjjsjjj_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_GLOBAL_OFFSET_TABLE__ZdlPv_ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT__Znwm_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS__ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZSt25__throw_bad_function_callv__stack_chk_fail_ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_DW.ref.__gxx_personality_v0__cxa_begin_catch__cxa_rethrow__cxa_end_catch_Unwind_Resume_ZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjss_ZTVN10__cxxabiv117__class_type_infoEC=t% u%!u%"v%#vw%$Fx%%y%&y%'z%({%)V|%*&}%+}%,~%-%.f%/6%0%1ւ%2%3v%4F%5%6%C%>%?*%9%7%9%B%:.%B=%:v%B%:%B͈%:%B%:N%B]%:%B%:މ%B%:&%B5%:n%B}%:%BŊ%:%B %:F%BU%:%B%:֋%B%:%B-%:f%Bu%:%B%:%B%:>%BM%:%B%:΍%Bݍ%:%B%%:2%B>%J%hV%07)9!;h<=>-9<a<?)9<AB,;B@i=9BAE9F GH`7hH?9KI 4 HPx E`(6X s  `U p\Py\0\\e] 8]`] L]0] ],"^0#0^\^ ^ ^ 3_DH_ Q_ _0s%__D` `.symtab.strtab.shstrtab.rela.text.data.bss.rela.text._ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E.rela.text._ZNSt8_Rb_treeItSt4pairIKttESt10_Select1stIS2_ESt4lessItESaIS2_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOtEESD_IJEEEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EDpOT_.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1_.rela.text._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_.gcc_except_table._ZNSt8_Rb_treeISt4pairIttES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKttEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_.rela.text.unlikely.gcc_except_table.rela.data.rel.ro.rodata.rela.data.rel.local.DW.ref.__gxx_personality_v0.comment.note.GNU-stack.note.gnu.property.rela.eh_frame.groupX@ #7XL #:XX #?Xd #@Xp#CX #D Z%@8&#&%,%6%A1@&0# @% @&# }P%Ax@&0#%@&H#n%i@&#Ȕ% %@&`#%&ȕ%@p&0#%G (%@&#00%,&\%6`% N%`I@&x#!% $  % 0&_/51 0 0 0 644 154016 ` ELF>V@@ 9AAeWkSPZQ=rw #*AvfDwpdg 3*)FAfT! "h]>A#; ;Á$@к O"CALS}LAAÐT1w NG"7AO>|5$C3/Ðz   p|*.#>z`*ܮXAwD@  "b20,C Y^]ZOA?uA"øÁ4z ,x3S RAnÐ 0 || #7EP"v@ї!(AD lA"q~ Kb#R7sU1 :Ǖ ',fDau> %j$J)^IATIiAifDzZ /N&CAnvIA'p3A@<S "c(">#)_gQ!$0AA@AA|gAÐ ( .:rL7pAAf<6 `A@" 73"Iw D5A X G44A vfDAdANT?*8#}4rAD|T "O(DWoqd' =8KEgZ#AfzTN$'M35 lAv D@AF#TAJ"C"̰#E>.EAfoA%Ag&7veN ֧yE'5ƒA&@:  +-,XAu%C 6Ð%`[,MOmW0Af;g_vN4*"Gg(D( no=+>=A!DApD 'dD@j  A  DVsÐH A}H;0E0ÐG 0AD A,DDA* 1#//A&^L&RLRf E 9vA %^A@F f.A R!8LXA AA zE"rA0A:NjADY ~Xb6T]A$\".AvO fA GE@7Awj}kj@aBfD" J 4B Z},A, A&/ 2^!/dAkskfj `AfA2 A"$b(f2!/=v&=ÁR5HDA%;1OHE D@  Aq,A9Q9p&(Fs5 f. A .  AAfDc @: "J;1A+f. ~A X! L!G,%A%DOB;ODJAK::[c8 N!AAAf.vZ">}lWmm?u fr 5n9Ye9Di#A$~;5MKcA=mXfDN O"nA!Po&EoڹsA? +`%4:/d'}vd"4A!fD %j,@)r&>2]KQA) J T!z.'[[QHP44'0U{@u$SA$CAZVA\`Y#$ƒ;8CW/C>4A@wADO }lAv ZDJ  A*">"yUÐÃF]ø*K!AF5S  dAAfH<m.(Dm );(\D5}v/P2B$({IQ@^ÃNAJ y w XjÁ/A)'4NAÁtt)-}kCHzi a٨i AK8Avg@ $(IElA ܰXv Ð^P7!65( XA Av VfD^Ho824V\A@1A,D$l"(d&;<Av^!;fD3A) F= _B?vfAÁq A-B wAv JvaÃiH_'b8Sx&f.Gg #GZpAa|A\!qLv A+CN7;"1iAV\ J\Á{+CQAЕA;~AÁa?'=)vvTA#@(Э*M@2;gJA v?Eø.9q|JÁiMNdC1`4ƒQtLÁ 4ivAøA){D7AbA-øA$øÁ+A A1._. f:$A#v ~AÃX* 9gøÃ032W%/Ã"< 0qTz~ '"lϖ, ` A AfD >hv ø>q 3A{3ÁwA CAlh1nS*ÃB'S-$/RWm$GW~]Y6,2A!AøaqV`OAø"6%^ 5"sVw͹3BB&BAAAMM'jÁB ,OcbAf."h}0Q yA<T#3YPIHdAÐ`uhLAv#Hw,Á[5tO,OVo($gιX3@8 4#pK#K#y#]#N#UB#g,#1f5AA -,XA  1AÁ.5TmR<D <'A2'Å3."p*l>71{1,D1`)Ak&Á'/"~V$z+Ѡs9v 6øGve?wANÁÁ*Ãb%AvÃ\`n#F;ccA}5DO2o]AS@+R7YyvÃFWA$$pÁ4(A N@Ao|b*xUϷZFAȸ~Kuf.A6!E5qdRwA6HA1pLAB o!5$=a[Lْ36 (Af.1!A9#OywAøI/# DA$A#?O?e>pZ`7A#$Z>A.A'@>Q=~~wAnf>ae8tA%ÃIX9Gk;kÁM":DQA!u@@AQÁ<AøRSÁ +3( ]xh2gyJ fP";e'ͦ:& fH F  t A &dAÁh!A$=3}:hA$s dn @AÁ$,0"~}7-JA*Á : ZwA'v]9@AgA#>A9gPIv @AÁo 2[A?^ ay51=$[;H{YdrA.&FA @B%qpAsÁÁi7V PDPPzx|S|@^ *p |+rAbAƒ+uAkAø: 4sw AaÃ]$5VAiAt49=pOײ4Ų7AzAz@BZM3O"A#܏/4A8{IfA#/4AÃ!ÁQ  ޥ Ã=8h5)L2O&FA@A" A.9=A% A!d9A'gd fD+AA;_ øÁ!A!!øFR6A!DsQ"AÃ"E*'=#=A!(ø%RAq$y< $AÃG"\@=k0 ŗ% v@ EA"SA?ødžh%AMAÃ? ;A*v ( *ptO;| f.<"d=>AAøPx,'1K#"w .;fD. m;re{:A<]<A%A'ÁL<9Á! R22øNA"?.AÁ!]@>øOw"#AÃ&Q 8B;-` ;t.7#nfD`~A=A/Aݛ A  3 AÁ{$AA`h1lwA`|A?838Áh}A!kD- j~u66wT3EAjAÁX3øFAà C@r3)9A9fD{'OBÃb`(Aø'&à AÁoAG>;>à ..=58\ Á9sOAÃ9+Aø&A$ÃXMÁAv AwøøA.nvA.1m?MgA+A#øÃ:nbCRÁx#S.VA,3øø<`AÁ9Á`I#R7`I_2obQ=c[2A%fDb+B$F[Kv3ӢBH'#)Z( o!nÁ?[[[WAÁ?A!NO]dZ|Q" {KVA3vz5fAÁ0A 0Ã;A;A**FCA'L<A&fX"#L|'Tk@@p @A$Ʈ D"s@ֈA$"?# AÁJ$W Xj ^AAÐA/ 00ÁQøA2D:"8(.AÃW)AA U^?1Rpo_,Av,Á#_? ΈAYAHH&sEV\Y+rv AA.XJv[;fA  h:S;F{71οA. r!z5G" \5g (A)GH/ YA'yX= .Dm:Ð',A'ÃA&.ewÃ@\+XS+ÁK_' BYA# fDb$%3 B sTxlA&7$A .u @Q:AfRA=ofDAÃb1=y7NAv\A#^w[A!&,g ue!Af.4!0JvAüÃ)$>A(B:A'@f>(_Q=dÁ*A)AAK%AdA#Á)7/Au SA6,7$߭AJoGek^DhOd6Q(*QÁ1ø  w AֺÁd Q,JyA%Á P[-PA/ÁK>K݈ZC vA3|8ʍ{øeWÁ,Fr-A)fDAkJArAhAAޗAvZ'θf"A71siAp-a ÐJ-#'dnSSAA _Ã3u Gs"Af19Ã`# DDA[F[LAz8fDA2H711#sxxA&Aø_A=%A'!=?)uA&ܾa#9D :*t~ø(J|  .#+SD|eA[A}6As6Ár.0.KY)L)Lv5Ã?vAlÁi$Á}!WQ*yLB+AfA"*S"k = @4f.Xa#Gh`lAÁ {!miL6LV A$WD]+DAÁ75l!@vK ƪÁ)!FA }$z4AfD\ÁБ  =B=<2-[ ø61_%Á*;L!m*{D.#[AA1$?YRvA/høÃN#2EJ-fDG-"A H)Ts+(AqASAGD|%AAøÁ: wA$}AR>F>øALAv :Á))2A%ø bNNBMީQÃcZA( ZA?AÃY4Ai bAW H A> A#5 4ͿAA#Á}O'A/&]PYÁF1eBi1'@N/TAÃ<hAAz-`6\7ÁM-)AAHA"$SAUj!NNlP#P#Á*A$U+ x)Z6H  !jÃd!o 1oÁ %? g-|W:A'tÁk,#jA@SmŎ(+$2ۿDwnÃ2"2Wŕ&+"1A!w+Ã/X"qCFhCÁf2GKVÁ{;,b[AMGÁ8TA$\6T`Á((Xw OÃHR()CcvAעÁZ v]&Á9-Á-RTxRÁ'<Á.,0kÃ9vV vA'vw  A! ;I Ã}" A)=Y:v Á:1/DTAAQjAu XÁ&%` iNAwfÁ#SYSW8Ēh*v AÁf3EQC ;r;AAÁ&7Q7ׁ) 44 4u488?5Á f-gy PÃ:/A%Á wAv1Á +A+Gz c"}A)A')A(!ÁR/A\sAÃ1ÁC>/*7VԴAvÃ=ZZ{F^AÃ+ӿAÿZAu (ÃV^VAʕAÁ\q5BAzA#h-@*coXѠyLA9*v:Á ,k^A$AqHÁ"ÁZ, kOAjbAÁ=gÃO)V gA[Á0cc  cFKnKA'dKÃVb-d1e١?]A'fA 00 jjmw AmA9l0A)aEgr>z~A"TÅ4Z#;.E*AAà n1|mAAÁk{Á]M?"~Á&(A.pLcp'PA)'A'ø&řA!u Á#"^C lA.løÁ#pjEr+57,fmA65oeA2MA@ƃ@tkÁ!AXQ5OQAr!Á$ 1 Di8i mAWv.Ã7whÁx;ÁkD*2AM- 6vC`AF, :,Ák %_ vDBN NN uNAÃA(W{WA&>9G=AAzF;AÁ t!A"b]A#SlZA%>3Uö&2.3Aw ̕ÁFH',)DA$v A0 4eA-ޠ#1EoN'`N.NANAÁrY~EIRÐAÁIA Á N&vA)A j MAÁUTIøÁWQvA&AÁ&FjHŒi WA[Ã^BAE/At\ÁT=*!U"5Á}>1A 41øÃPRcB/AÃ4Y5 tAøA#vÁ &A"Gq3 4AÃE0!oA)G(AA!kAz yL yyøøÁvAÁ!A"ÁWKÁ|\Á$øøÁwAÁ(kAv+VøÃ/Ã!i SRÁi4A4Áh*AÁ7AvDÁW^ 7hEA @Av SÁ|4 NM?__AAÁ +/#Sj SrFÁ5Á{aøÁxÁ2'7AxoÁ,Azjy[AÁN 3KÁyWYAMYÃ@ȍG2lA))Nv pÁ%AAÁ s6TS8Z! !F cA AAÁw/TYA)ÁQVÁD )~LU_SÁ''a@-A#vÁCB(6(Ã"6A,A\\_bA'Á&u.tA A&,a \AXl ~7 AÁMwAÁ):)A1)Á6_7~RÍÃ+wAjÁJAÁ0AAÃ[U.A,~ cAwLQA A!u$Á'01#G!C (A%4ToA(o ÁE*1Á8/ #n5 vAÁg]2AÃ4V0 bAAÃv!P Cu|*AAøÁ&,AøA#1tj2Mjo9Qj#EjøA!Ã`/ 2NKco?|;A;];X;| wA1q1ÁHsA'# DA$Ã;A-)SAvxøA//(gAgÁ A,A= 64 Y92Au  øA"= @%øÁÁ!A)#&øøøÁÁ +A$UÁ \Cà ?m ?Á"Xk _LZ3A)ÃZ#NXÁU)w  Á/AC\Á=wzw6hwAv\Á^!OANÁUÃ%k#z%Ճ&#?AA#`A߃A JƒL!ÃssÁ ".A+}Á A v?Á_[NA؃@Ɓ_@F(]:(4Ám/%qmCA3wADAhH4D]eAfAVDAE 3{'ÁK'KÃO*| `cA/AÁ5OZA0ÁG 5p^} ÁdA C7Ix&Á:4#&p8g/gÁ`6XqAs#)ÁE>A*A"wwÁUA"Á8AALaÅ587hA#vEvATÁKPgU0GAA#Ám4mAÁ7Áa.qEAA à 7AA AAJøLZ+w A!HAe]fÃ'p=A)m1WA(BAÁ)2U#i`A(à dK?ZːA&ݧԧAS@zzÃ{FA&A)Ã@0M_4D_Q>_A7AÁ95*/Nz z'y%yA)+z#z zsÁz%!8qi~+RY+AÁsabA*Á^>XøÁ*A2)tA.,CA/CCA0CDB'BMw6V}A )ÃTAÃ2*0%b0Kb A| [ Zm> A AÁ`2Á8A8Ã"ۦAvs|ÃMVMECMuÁJÁ1phAQtAÁ6/wA{Á7"_'q ej۲A-Á >eRAAÁ.[ ŠA a{JJJAÃ_wA-{Ã";&A/!@A&"sA#AÁ(d*$f,fA+ÃGea,Áu-K^lATlÁ<_9Av%6zÃaT3A!tzà 2A y yAÁqqkmk%avyÁ&o`-c%7>%,7,%5%3QA=A AvRyøÁ {-A+eAK/9-ÁB(Q~xdfAoAAøAÃ++ AA!A!AMAÁz <)30)B`;v'gA(BA$A+ `A`\Ã|8A0NA- <A02Ã\'yA#@ƃB@GG=vAtÁE{!y\HÃIA2pA1KÁS~tAAA)h?K!YyIYI9JI>I/I#IA I#iÃI}D :Fy}+ vA&sÁo{KDABBAv2asÁ% 9WK7K ; i;iA"hA.hn hÁ|<-!ZA#Á(#)-twAAA9!؊A%A1Ã#!@A!׉3s 'AÁnrÁ{lAkkPk4BװA6:AA.AÃt nqÃ~$P~A!A#D#l{(x]DV'AHG?AÁ QA"PBPPAPÁÁTKBAm1ADÃID iA%uiÁBut^ÃKA$"E5E"DAvloÁCˣ{iA)AbAj{XÁ B0DAlHl7=l|bц.Ã;ZOAÃEøÁSÃ)k@tkAeknÁ^6u;A$=wo#v;nA%bÃ~\u !Ёt „t 3W\Á)EVA#5VA'ÃAÃ<!A> =!= AAÁm-(mv& hÁzAøA%øà o$Á4MA5~AÁzق$~A~o~A}~Ã!Áv|gAOOwAgA!Ám.3ÁrOOavngAøAÁkG]>`/A%Áy,]@]k][ A'Á=ÁÁ UU1G wAfA%A ÃbonA>A.AÁiEWEAMEÁ{&r?wAwÁ?y[._:3+ u&peøAv,"MeøÃO&>.AA\V\AWW&8MXøÁtFÁAwddøÁK|AZWÁ]ÃR||j,AÁÁ9"k NAvdcøÁ A$AøÃ:ÁW)b*B}$r?A(W?E?M?"A$h$hA"5c#,!v͵bÁ%0* Át y[wyÁ-LAKAAu u(øøÁøÁ+ ÁUbcj(HÁЃÃ6y`Bb%VAxJvtaÃM5?AÁxDxA"xÃQ<OwJaA$ÁM AAÃIl5l-k"HR#ưA++e1YøAB-g1gg/y4A^4s.ÁvA`øÁKD9AøAYW9;8AAÁ C iÁ#t&GÃW_AA*u2w A^Á ] _,OW & R*MAƒMAw Á- 'C  a?!!or fÁg6*=<?g<$AAv]ÃSCF 7FÁN"8NXXÁøÁpJ6KJF2Au+\Áz#AÁ&ÁW9=E9/Ã/rArAÃdX d0-AA#DR3;RøøÃWsK FAÁ3Yh *Y%YYA 1*A&ÁwA[Á$QcÁ6ZAÁjj6 jAÁ m7l:ZjA,}A Ã*$77ZH&Á8J1AvXZAÃaÁM$WAÁ,RpvnZÁ6֊*{*֌AAW øÃol\ M)AA0W $WALx @xÁ AÁ^pÁ8:نAA?2Au=A16[6Am4AV3W .A +a U ÃFÁoÁ-P Ʊ"ÁB ZA$tAXÁ# Wl^ م97' 7AÁ.-A-Á! $ԹDWA)VÃ^A:ءVϡÃ36AøÁZss}sAA%&-AÅ1n)>nnA)~~Á lNlAA à +,EA-+-*+DÃ=5\5AÁ59whcÁCTCAA$ÁkLDZÁ 4 QA"d[*Ág7AvU,TøÁAl+2>#<AÁ/wASAAA!0Av uSøÁ_øÁ =7A* -Ã2g<,Á^Ã5hFELmA*ÁA-A`IWI @IA)A v à Á p(\;:%&AAÁDDøÁ ; { SÁmvElQÁ lE CA!O@A"6 8 øøÃ8vA PA"FA%οA,Ã*66(ymZ8%S|uwA(FPÃNYD!<Aw?a=øøøÁ<-;A)gA!WNÁij]56G.(wAOÃWGAMGÁU:,? 6rA#øøøÁN,At0AAøà 7GAZG ASԴA&Ã:1A^1ÃZ. 9A$D2wA5NÁ9F9 +AQuøA'E,A&Á/øøøÁ-A0v zMÁøøøøÁmA!|4\4MAÁtÁS L2?AAøÁ\V7 wALÃDøA,H<;2Á>Ap Á2(AAÃJ?: ?ASøÁ 92| U=D.OFqRzvA?KøÁÃA %A A@+VTVAF: !DÁY5A5mv4 wJÁ @AC Á#A&E:A$+-v JÁ>A%Tfj4:AÁi AB-B@A Á1M_MRWAÁ pQp M M,MÁO@'AÁvJ8A%"Á"= =XAøÁ LLLK!LA-E3 DøøÁ9"9O9Ey]Nh<;$AÁ99vGÁ,*A ÁøøÁ@@øøÁeP APA*@ )N J A#A'ÃmÁRjA SX{ GXøÃ+˛A!Z5A+A$+ÁL`!?øøÁ-tR2z\2M2A"+2(C2g2U øÁ3KJ'BqnpBٔÁoÁaAÃ?1A W?XNA/-ÁvADÁ >nA"Á __4Z ZA&A/HK 8% A) sZ røÁ $'d &Arvg+vA!CøøøÁ(dYYS%v&vA%CA-E0%A%Xk v% d%3'[svAFCøÁmAG% G$ $A$AAÁ"A&?@øA&øÃ4FstftA&øA9FAA#gfA(ÁMCDCXwA BÁ`kG7 ;5 *øøÃdF]hÁWUA-UA*RÁ'g@ a7Nu274Á3ƒa AøÃaXA(XA&vFcg(Ãu4A)E K4;eE*SEǦGEÁ ^U"ƒgAgÁ<vAw3Ã]ZiÁP|1n111y1zg12A*22Á T_A ҍƍÁ(n-YhX]XA lXiAIIAIÁ+uAFdA'%'At 1ÁJTf]TL Jv{Af{9J{;{y A!S(ÁwRM:RAAÁJ ZAYHPA.Ov7*=7W 6$61e#euøøøøÁiA!øøøøÁg92H AzQ%8 2;LA<{0øÁV"; LӭA,ɭÁ IAw /Á3\ ZA##A#6$ $5$ )à . vA"*/øøÃbAy2Am2øÃ0Á#(Á\[AÃ,A#\(JA!ÃCpBOU+vR=.Á BAvu.Ã1-+A,Á4A ÁT]9;]vaA%ÁvB-A#q=*cA!c'cøÃ`Á*1Av$:-øÁ ( A0~CaMC#7W#N %|%5%)x%,(ÃuøÃp!%Ahk_køøøÁp4=cc }c!AAÃL&ÁøÃb%Io%nnAøÁ''øøÁ$b$øÁ{øÃҮA5xøÁwA+à AÁB)5 $ÁAjAA%AÃܭA øÁʭA/w&'*Á˭ԭA/A!ÁøÁøøøøøÁ/øA(Áh&@Ɓ@n e"U#Ai]vA)ÃB ΅z ނ Å|+ÁcÁ wv^R(Á(K L`=QZ øøøÃKAÃP6DAAøøøøÃ_ÃZ0$A`)ÁÁy2  A*tA 'øøAÁw$A7nfvA&Áv:Ammpmwlr&øøÁ p[pA"ppQE3A]AÁ'ÁÃÁ Yˈ øøÁ0k| IA!!=ÃKK1 z*ƒD]A"SøøÁ;(̈́{"A%_!A$ZqøøøAÁ5 +Ӂ̡8A.Ac5Ã%~ ~A-~A!ÃÁw((øÁÁ`A.øøøÁ |8j øøøøÃAÁs}Ã}qA"ԄøøAvH"Á øà ɄYzAL A7zq+z6u 6"øøøÁ;>>A+|[øøA&øÁAݜ˜AøÁhøÁbs6R!AÁ/ ޖS ̖vÁi&w3QkASkACkøÁU4ÌøøÁ p ÁijvEw=dw tDb_ AøøøÃ`kA`k HkZ(kjPjAjøøøøøÁH øøøøøøøøøÁÁzIvjA'lA*,SøøÁ taeab YaZ(øAAÃøøøøøøAA#Á3A3A3gÁG5?Á-yG j,|>(n#Ã=eAЩ_ÁKIvA$PÁ> A+tA ڏAAAÁ$OUAAAøøÃZiW"{AÃB;S) ÃCv!(Ãc{AtøøøÁ1 ÃDqC_AUÁvAfÃ=h wA@AøAvrà øøÁV;}qAÃ1W@o Á3 AA"ÁøA [A#ԇ.ŇtpA݇AӇ#øA1 #Á*6w ,ÁxwObÃ+wMÁI f AAÃKu+`(AU A ЃøÁGAøÁ 5AA"v!d2RA(AøÁ ÁgxA"hAøøÁ&A~A~~øÁ"qA aUTøøASøøøøøøøÁ !wøøøøøÃSÁ8Ay}A}}z~A~(~LøÁ^1%Á{zF øøøøøAA"V0y,jA"`AP ÁT G AAAxJv, Ã*&@}$ CAD „Y[ M&>[2ANz Aøøà ÁwS-@Ã0TNøAÁFA&1 Á Q|A|J|Ã>vw øøÁJkhf2AøA&{/AAÃ}+}A0A(DA(DA%xÃÁnxÁv3v/v^vLv.Á!~%~4~øÁBS7Á+-wA ÁA)t<tøÁe{AÃHA øA%A/w\A,F|5.|,|7 |A-{J {J){øøA0{y,Tyr øA/zuws z$øÁNu:u,ufu4øÁmAÃEyAyyA*\JVJJMAJøÁytA!øøøAÁPwz37Á@vA5AwYAnIFAQAEA:I'.IÁÃFEA wøøA"øøÃJJAJA DøÁ%IÁIIIVøÁøøøøÁn>ERNEA#wÁ D;DAvYøÁ@B øÁ øøÁ5JE"8EA"EDAD@DDqa D 8 7AÁøÁ3),AÁ =*1**>))Av< ÃB)Ow)E(|(A'D2tøÃ";A1+#"A.A*`A)øÁk(A (A"'A!'oÁx((AøÁ% >)'2t Á l'A$\'M'- ;'*vA"_øøøøøÁ'ÁiøøA0'3Á&ÁÃ<&-&Á.øøøÃ-&&&A"%&%A%1AøøøøÁÁC 9JAD@øA$9A\ÁøøøÁaA/A.ÁløÁ"D!A"!H!A#s!d!Ág '*øA((ЈøAwà  øÁKA Á\AAA#+A#/7øøøA!AAetAøÃ5_AA øA'<%iAÁg ÃDA20M& 1&H AAøøøÃJ Ve ܬAøøøÁ'/?'"'C' ' 1"k'#"Y'C1A 'øÁy VAøøÃUCA,AAÁlv*A/w"A!øÁkÁ i{iøøøÁ?'ȟA*øøøøA&øøøøøAo&Avp Ao*9f*nT*AA#LIICIS IeHA.vHšGA'GxGÁ/&øøøøøÁvA":øA"uI2:Á38HÁ=?R  AAA EM6A",ÁL{AAw̲ \OA(EA504A4AItAtHøÁ_F7kÁw9AÁ.A$A*øÃ:A3A7øøÁ Ã"??>>Á??tÁ9AA øÃ;?* øÁøÁ@Z>>A>d>bO>AÁWw>AÁT?f>>A!ЃÁ  ÁA; ;A#:øøøÃLA!3kAv@&OÁ  K KÁ Je/I#GA!(G)F3FÃLDNDÃ-A w 1ÃcF OFA))F!FEEk!EAAA"fD. ADmD/DqCAøÃÁE DA0Dg%ƒ!Dk&DA(øÁ&jC) %øøøÁI_JJJA%Ã<K J  KHdJRJAÁh *A""IIEH&HaÁ gI)!>I",I3IH HA$GÁ"hI)YI+JIA ƒ./IA)%IøøA*29%Ã#8A%7 74vA ^Á&{øÁe)R A.|A(øÁC'NQNÃ)v<3jA(S e A!v Á%ÃEøøÃ (Ã)~)A2 5? ֦ZĦ C1! [- Á'A'ÁAøøA'A ''Ň'Ev،DøøøAøÃ2øøÃ^wv &ÁnvøÃwXA@A%@ A$mAvAaA^'O''&A&&Á88 @ ÃøøøÁfAøÁ| 8/ 8 à `AÃ!vDøøøÃ73A/88T#8 Á A'{à !2w<E#1!A)u!-vA+gA+v3JøøÃ<L:x/2Y /AÃ^7.AvaÁZ. 'Á w 0  \'AÁ!AA ÃYkQ /A 0 v øÁ øÁaX{5-e5A:5-+5֕5A-w øÁA1øÁ Á A& ÁrAu%Ay/}D/ 2/8)/4.A.A..-.øÁBA+A"}A!à ,uw)AA"~g*eA$øøÁܕ#+øøøøÁg+L*A2+ A1S-ÁøAøøøøøÃ!wjøÃ" A$øÁ)A)ø1ÁxJ!ЃøøøA(øøøÃ;K ?Á[ øAwSY3A*[A(KøÁ  øøÁZ-AP-øøøøÁ øøøÃ\wAZøAv%W%?%A!%A$R-$A$$A$$$Ã)Á@ GøøA(,A&,,A!,A"_,WI,7, ÃZO w[AÁ$.$A.$$A/{$i$y3]$AFAøÁvÁøøÁ J8)* yj3^ÁU X" "A!!A&& Á1 5 øøÁx% k%Á*moAeS4AÃ7$ A#;A!A"&(1ÁwDS sA&g(  ÃMA&A=Au,øøøÁw`lÁܷ AAAÁiLA#øÁVÁY1KøÁ+AøÃCw/~&l&A u, A ֔LyĔA!øA C(ַAƷAA%O&CÁtkbÁøøA",8 Eà '1SY1A01w0A0 Á%)i%AøøÃUK+ A0 A>øøøÁw1"Rk C$øÁ +w*A"Ã@~RA(A AÃøøÃ!øA AOAMÁOC$OLAvMÃTøøøA A:Á-+--ֱ&-A$øÁøAv røÃWøøøÁwAwÃ$uAA$AÁ\FM >& MEoAøÁT øøøøøøAi,4R,AAÁ,-A> øA à >øÁvx=A(A*6%Ã+AA(tMv ÁMFA)ÁD^AwpÁøøA xvp #ÁuAÁPVnMDF 6Aw hAo Áw[C@lVbS < vCÁ)  gA]A"AøA&øÁSøøÃ%ÃB A,'ÁRv1EÁ  AÁ$wA#øAÁ"mA2+)AA?+AÁ ÁX3(({vՇɇÃQwD3A"øÁkkA!Á8ÁeÁA9W|<Y[  '[ øÁAy / AL sA'ÁHjA# >  6A/Ã%w9L  %AÁaÃo_+P)4ÁP w;I߷n ӷA,v*ÁgÁYA"mA*ÁKygAWRKøøÁ^A ǍA ӌlv FÃw-"NA(Ã#øÁy8  [AAw7-x e wtDÁEEO82u YøÃIA-ɳD&A'ÃW7$WEA/ H ù øøøÁbøøøÁFɝA%nAwv+@Ã3L A # A nÁbA-E9Ás5BiA_øÃDt! bAAÁ CY:[MAAÁmAÁÁ!3dYÁBA"øøøÁh]^)X AÃbAYAAøøøøøøÃKA4A} ÃA5vwøA'Ã0A#ÁA$U "HI &7 e+ A A' øÁyA A$+i݋7ȋA Á v/I]Áp~.~A~d~øÃ"øøÁ$wA%>Á*w*A&øÁ})}A!}ÁȐA1ÃAqA OAøÁ{ w0A|Atx&Ãz| Á3o&> tQKAAøøøÃA1øÁ$$wjA'Á&DA  0A"$.øøøA$w3A"w>Åt#A ÃwA#øøøøA'wvQøøÁC&ÁA&Á$v A"wÁC'vAw øøøÃ8vVÁ'w4v&Uw!Á&w,y"}øÃSvw øøøøøÁA)w#wAøøÃw?Ot/A,A$wOA!wCAv1AwAøÃwQw øøøøøA0AøÃ=u w>4w3A!Á,wc%4w@v øA^uB>Ã)w`&wUA&wI$wDÁEwFvw. ÁD øøøA,w9 ÁwdwJw A.wz v øøÃBwk)wPi w5øøøÁFv]QwÁ øÁ vA)øøÁ w5wwA.ÁÁ$ A! w4Ál wGv2^ w*Áw v|Aw4At6øÁ{ wX]Awg vYAtM{ w?8w7øA#uBøÁøøøøøÃ+viQw[A"t20A!w4< v&-w!` !Ã6vZøøøøøA+)t%vL wA%jøÃ%bÅu}twÁoøA*-"w@w"Á"v]4Á* wA"wsvkÁiwW%wO-tD#v6&w+ w vA øÃ(øøøøøøA$Álv|tw\AwP3t>Cpw*\#v"#Á%w$øøÁpøÃ3u#w AA!øøÁÁgQwKwoøA"w%v0,vARøøøøøøøøøÃ-wøøÁ25wT(w'ƒ(tà w5A v) w$AA!t)w øøøÁ v%v1wASøøA!w&w øøÃ3A u6A"w0Á]wE=v:A&v.YwA+wA't øøA'øøÁ5wOA-wCEw4v&vA"wøøøøÃ'øÁtfw%)A uH*øà wA øA v9A&w-=w(wRvA#øøøÁn w9=w)A"1tAA A!øøøÁs^v@øøøAuu/wj\wbÁcA"uw øøÁwA øÁw'øøAAR s*AøÁvW*NÁ"Ã+v0jA0t#2vÁK)øøøøÁ^ w>Áx%wPO#wBAv6At*]wÃ6AøøøøÁ) v!eøÁwO1Ã"A"w\wN"t: t(w=Áf øÁbÁHøÃ"t%vvvA#øÁÃ#dA!%AA$&A vsøAw8At%~vÃøÁÁvw&wøøøÁgÁ1øøÁÃ'v(kÁiA"tZ+tO*tDHv6mv(vÁxøøøøøÁ&Á%6 A ÁN wgAwHt4 wgøÃIw#v øøøÃ/v! vADÁ øøøA%DÁ øøøøøøÁw øÁ6wQwCw;Á)v w øøÁc øøÁEvvQøøøÃ)A-2Ã5t+vAvøÁøÃ4AcvAw9AtcA!w9A Mw!w-øøøA"t7w)vwÃ&øøÁ{!wNwFøøÃ-wv-ݺøÁøÁVw-AA'A&tj2w!%Á#w2øA#T$u7$AÁWw:(A)w\A(tL'vAw3#v)Áv+øøøøÃ)A*A+tx;waA.tN)v2#Á%w,%wA*øøA!øÁX%ÁÃ'w%øøøÃvÃk{0{UwptRtGtNt0AtCpøÁpw.nÁLrøøøÁ/vÁZwAtG>øøAwxywmAt]Á@A@ZÃøøøøøA(v0Rw("Ã)w vøøÁøøÁ&wbwEv7"t%A%vkwøÁ%øÁ&w|A,Áw,Z#Áq" 4A+*A)wO>w/ÁiwU+wGWw4g+Ã%wb$wGA"Á&A øÃw;u1o"wwcvAOÃVAt6Á øÃw wAøøAøøA"øøÃwsøøøÁ+,v&Awgv1wøøøøA'Ár%w&A(Áv&AøÁwA.øÁ+.A+øøÃw= øÃw va|øÁwlwR+ wDAw8w0 = v"wv øøøøøÁ)v.øøøøøÃwxwjwXFwJxFw t6! wøÃDw(vUwøøøÃOÁsz\w5A&w)Aw0vAt øøøøÁA32Ate~wAA%w.t&A AuBøÁÁA$øøøøÃwICwAA(w5Aw"tAvƠøÁøøøøøøøøÅt)A Ã1vVøøÁMøÁJøøÁ7w`wRA#wLÁAuYwKA w9Au'(øÁwA$øøÃ'øAtU wMÁ_wA%v3A(wEhwAøÁwXb!w%A$wtÁøÁwwAøA%wFmv8$v-A%fAvhøøÃÁt#(Áw3S v%A$øøøøøÃ!A% øøA"wkÁv};wB&v7 w,wijAv%<øÃ,wwøÁASøøøøøøÃwøøÁ A ЁY.AÁ.wÁ8Ã:8A#w>wAøA$Áv+ w?øÁ6øÁvA)ڛøøøøA"AÃwG:t<.w.u$5v6ulv øøøøøÁ5 A øøøøøÁkBAøÁw-Av!MwtHĚøøAG)iAB]LGPAAÁcwøÁIOà wVAwAt7Aw&AwøÁ@AøÁÃEøAøøÁv løøAw:t,Ãv_)wwDv6à ÁfbwAøÁ,!ÃKøøøÍ=M   wkv{%6wXRwSøøÁ vO wAyøÁcPw/w'øÁøøøÃDw"ƒAuA-øÃwFw,It!jvA(øøøÃIt!A)ww øøøÁwzQvl5wgøA%whw2vwfvKHA#wL~wGÁ: wKw=A"øÁ A.w0øøøøøÁwDAv8w*<v-wøøøAA:Ã0wW(wLAw("wvA+øÁ#vF#vAAw"AøAw*8w%Áw#%wA wøøøøÁ9øÃ$vX#wDךw"%wxw øøAv-[ADøA%øøøÁwÁøÃ3øøøøøøAw@/ÁvAvCøAÁ)à vAv&_øÁiv+w ,wøÃ&øøøÃA w)vAwAAøøøA;vtAtWAt2%v'Yw"ÁøøÁkwfÁw'øÃ,wOøøAvww øøøÃxvAAøøÁøÃ@wAv øøAv00#w">w øÁPcw%wVvA'ҐøøøÁTvFw%NøøøøÃ&t MwA+w øøøÃjvSAt JvøøÁwwøøøøÁ[AtBnv7Jw2AwÃpøÁFøÁJøøøA'tR(Á F=wnٻÁ .wO*wAJw0(wøÁ vJ)øøøÃ0ÁO.øøÁøøøøøøøøøøøÁw øAu4øøøøøøøøøøøøøA&AøøÃMwAøAwAøøøøøøÁcvyaøÁ!8ÃøÃ> AD]wlAøÁ AAuAeJ At-t7UøÁw=At1Au)wAwww øøøÃ4wC øAwt w øøøøÃ7At mÃ8w1f v)Áw-v5wpv øøøøÁGøÁZw+SÁw+Áv7vw øøøÁwv2øøøøøøøøÃJAøøøøøÃKvosÃHttnwfAwK|w Áv(>u#AvXwøÁwøÁvA!wøøøøÃ3wV8wK(w3Lw%A vøøøøÁ1øÁwZ:@Ɓ@u?w7A"w&=A tASvÃ;DøA v"A%Á,vøøøA/øÃHøøøøÁRøøÁv8uÁw.v}uøÃ$wHw=v/A,wTvFA'w@øøøÁwfFw3bv%w@wøøøøÁwk$ w] .w8 AAA,Ã0wRøÁ@ƃ5@t"YvAw@tøAu=8øøøÁE v,søøøøÃv_uTA&vN%w1A.øøøÃ:wøÃ=tNøÁAA%wdA"wXAt9A"t?ÁvÃ&v'u"(w'øÁ6MøøÅu9'w%A-wøøøÁA,A!w7vAøÁwøÁ _= øA(wKwøÁ{w[t/w Aw)w øøÁvA$AÁ w@w2Aw,1A-wE'v:,w%A&v9MøøøÃ.wA)øøÃ/teA$wYIvQøÃ(*A!AAwOvGAøÁ\wA'pÁwAøÃ*wo wTAvH%vC&t8A%w2øÁ wA%vøøøøøÁMwAAøøøÃ)t]sÁMA(d(w\A%tC#w1A(t!w- øøÁ ÁÁ{Á_w1)tøÁ/Ã)vjÁo w?*t:A(ww nÁwøÃ$i~WE%< *) A+ÁQA/,% A/!"cwj:øÁw:8wGwmÁ-w5AÁhøÃ#tA+wøøøøÁÁøÁ` Á bwrPwN'vC2ÁKww(w øøÁFøÁv&lÁv(v)uA+løÃ)øøÁ v)A+Aw@wA,øøøøøøÁi øøøøÃw=t0AÃ!wpwYw-A Á v;A$wA Ãu+w#A(v:A,øøøÃ)w*u hvAw øøøA"øÁwvgX<vY Áv;+w 'v$øøÃ#w: v øøøøøøAwMøÁ+ (øøøøøÁ ww øøÁMA uyA'wsÃA,/*(EwcA%wWtIt8ىwzøÃA uA"w øøÃøÃ,wiøøÃ%w6Cv(=vA%vsWiøøøA$wkA"wD0u3v(gÁ7mvA-uøøøÁw~wsA#u>w6Á[wKLwFA(w/9v!Dw /øøøA)t3w øøøÁÁw)1Åu[+wL&wW#wt"ww øøA*wI8v;Lw&A'wq wøøøÁøøÁe2Lwlv6w(cÃ@t,A2wøøÁgÁwøøøøøøøÃRÃJww^)wjWwSvHAwBøA"øÁ&øøøøøAAÁøøøøA,w4A'w!v øøÁøøÃ^w%wYtøøøøøÁ-wSw ÁwK8 ]Á}[k1Áa A.3w`w5wøÁcwøÁ7wA(:]Á wt4tdw>A)AÁv?Uw1v#@v2øøøøøA+øøA&wHÁ,w\6ÁwA/v3ÁG\A+AøøÁwUvG7w5v'vA)wÁøøÁ?7øA) A-øøøÃ9eelw99w+4vA&wQ[øøÁovXA.wR6w@-w!8vJ øøøÁøøøøøøøÁevAøøÁvJvøA$w+b<A$tF|TøÁ7A"øøøøøÁN øÁw8uøøøÃw2 v*vv\ SøøÁøøøÃuASøÃ3v);wv6vWSøøÃÁvA$SÃ7AteAtYJhvKAt,iøøÁøÃv.RøøÁ&vøøÁww3w øøøÃ*wV5wK.w-wvÃ%wG w5øÁKwev`øøøÁÃv^1vS9wDCw6v+Yw#øAøøøøÃ*øøøøÁvbaQøÃv'A&u!vAøøøøÁG+QA&AÃ-w,u/øÁvÁcøøA!øøøøøøÁCwRvDV;ÁwcTvXw;w- wAwøÁøøÁ w"øøAøÃVwMHwB*w#Aw øÁ:Ã:wAOøÁwwrw[3w9v+/w%øøÁMøÃAv2At v*HÁ øÁ X B  AAÁ   A([ DCAG ! !  R   "øøÁz øA&ÅuA$v2FA"øÁ #'0+øÁ}vPvHA$w+#w øÃ'wVA vJwBÁ8w<øÁƒ$uA(tøøøøÁA)}3nAdÁLA*aw*A)ÁAwLA,Át w32w(TvA#v,jEøøøÃ(w4A"tAxEA*w)u"DÃwDA+t8.v-!w*!øÁ!EøøøÃ-A+t)DøøÁQAøøÃ.wwøøøÃ9rR3|Áw*k w0vCCøÁ wH3wvCÁQ_M9øøÃ6+9tWA vKwCÃ@A|wkA!v_gw7w)<øÁDv);øÁwA"u øøøÁw-A!w!vÁøøÁ0A!xlÁøA"øøÁA!AA w 3AÁ\@=:+A"S28wsA wP3vB5w.wv5nAÃ,ÁøÁw!wXøøøÁwQA"Ã2A"^wes wv0v"øÁ?øøøøÃ-w%,tøÁ Áq2Á{v/A#u)3Ã;tTlwøÁH[V?w!A$tÁwyA øÁcw: w," ÁBvV>øøøøøøøÁfA!øÁ"vøøA$w? w(+wAw+t øøøÁ A%øøÁ"øøÁJw\Jw=Et-A w!vAøøAÁw$AAÁv#A!ÃIvMwAw øøøøøÁw%bÁg w2A"w&h Ãbt&wAwøøøÁ A AÁv v<ÃÁ wp~qÁ2D Ã";C,=K wiAtT Ã͚ Aw At}AtqwaAøÁ^ v/(v*$v5w0 ;øøÁIøAøøøAtd;ÃwwAw øøøøÃ?+wdw?9w45w)0wAøøÁgZøøAv :Ã*w wADøøÁw," øøÁøÃ>à w6A!u*T2Á vA)):øøÃt;A#ÁwGwA$9A%Áv øøÃDA1  øøøÃVw)v< R9ÃXv=Aw7Aw[v: wQøÁw(e wøÁøÃ:H ow.%Ã-v| wQ& w.Áw" j8Ã4wW vIwAÁ w- wE wQv øøøøøÁ6H $  dÁ 5pAIA'wF Awu,vgpv_AtFv8vSwÃ'w øÁ v0wøÁ,øøÁxwXCw'@w/øøAAvB1w-vAw øøÁAuAw øøøÃ''A2wE-w:Aw4øÁJ  A"øøøøÁn!Jw'HÁ1:ÁwMA$w-vw-øA%t-øÁtv >wA#w øøøøøÁwwA"Z-ÁgwV7wE/v44w"Áv A&Á/?øøÃ=øÁøøøÁ&vEw2qwGwAv øøÁA%øøøøøÁwAtOøøøAwgøÁw'v6wJ,øÁtvu+øÃwA&v øøøøøøÁw;wAøÁrwXA!wL2w$AA Á>w* Av'+øøAøøøøÁøøÁ/!w- ÃwLøøøAvvWvh[vHa+!AÃlu0S w(vA#wAøøøøøøÁvA#v*øA!AÁ)øøøøÁwKw9A,w-TwA"wA!)ÃBøÁuÃ:ÁzwswYqww6A ÁvwAøÁÁg@(øøøøøøøøøAv/ WøøÁ-vA.øAI,øøøÁ&  )*qaMAÁ3 wavM w'4 t1xÃ=ƒ1t w øøÁ wi^w[A)wI w v GÁ vA%øøøÁ] w"w9wAøA'w1v#vAAøøøøÁ øøøøøøA!{u øÁw v"øA"Á2Iw vAÃ,vA4v6 w#A%øøøøA)øøøøøøøøÁ9!A uw øøøÁm whw øøøA"w-w7wAv4xøøÁw=6w)AAƒ2t+6A'AÁg A.øA%Áv`M vRA w5Aw øÃYv A(w/A#w#YwøøøøøøøøøøÁA&AAw* w%øÁ+wA øÁ+øÃAA-A%wQvFA%t@A$t--0vC|U.øøøÁ|øÃo/A2w!uøA/w"øÃ!AøÃ!t%Aw wA0øøøøÁ/w&wA(vA*vA-t øøøÁwYOwK.tFAAÃ+eeGA(QøøøøøÁ5 øøÃ]øøA*aøA( øÁwøÃ9u w?A"w9A)FA+t2øøÁ7wFTÁw+JwA!vøøÁv&.wRøøøÁm w A(wv øøÁ vA)0øÁÁ v1A+A% Ѓ u( øøøà w}Ҝw[A)øÁx vt1wd/øÃ'AuW vO$wDAw>Ã.vA'NÁoAøøøA"w,v'ÁHƒt}(w øøøÁF %A')A%A-Á# w9v+Á wjA(w^GwVøÁJ wA"v2;wøÃ)ÁmøøAA"øøÁw;Á]A#./wB#v:ÁU 9w{wmKw$\wAøA"ÃLt9w+#A!u.øøøÁw_twpÁ2 ÃVw+\vA!v?øÁ_ÁwQA%wEw7Au1øøÅtAøøøÁA)A4øøøÃ-tAzøøÁøøøøøøøAww øøÃMwA"AøA!SøøøÃÁVw"v1A-w+øÁv A-øøøÁ)Áh Á}(øDZAGT% v}lwow(vAÁøAw3!w%MvPvAøøøøøA$ww øøøÁ}øøÃ8w9Ã^5w6 v( v8wÁøøÃ2vW t>!Atvi øøA$øÁcwAøøøÍ7Fu&wøøøøøøøÃ7wKjw=w/t'uGwA#øøøøÁ9Á A#(ÃFA&&wiA v1 w#2wA!DÁ.wøøÃ2A'|AwzAt_1wH-Ã3;vwÁwA#vTøøøÁwÃ@Ã1w=øÃ\Ã7wLAv@A$w +v4vVøøA%t(øÁ)Jwy!vn2v.FøÁw#w2v øøÃwtUanÃ@w'øøà A uE.ÁzÁ øøøA%øøA.vøøøAøøøøøÃ$Ã!øøøøÃwZw2#w$}wA!øA$øA$w{AwcAAÁJwvAwEøAAwi0zvaøÁ w@A(w/wA"øÃBt(w AvO w øøøÃw%A)w ?øøÁ :A&x&oA$Ã:1#!ÁRoY A$H  o )øÁ,   L0fZA%Á< m[A$QE w_1vTazA"3?v~ w3v%Av+øøøøAwb.vW?wR@ Au8At2Atc wBv øøÁøøà v3 w: øÃ>ÃA)A'@ƃ>@2øøÁøÁ ƒ4tAøÃ/w:+w,1v!5 vuA!øøÃKøøøøøøÃ4w#ewÁ9 wA!øÃ-A,ÃlwAv79ÁC A!Ã2  A&A"A#ƒ2ur?wm9ÁX$A$E.AA"øøøøÁ( ( 'AøÃsÁN A"wt wL v> w%wA øÁyÃ,w&A w øÃ/w øøøøøÁ^Áv(w w øøøøøøÁ aw A)w6vA)øøÃ. øøøÁ6   vZ5wO w()A uw HA)w8Aw,At' øøÁB øøÃ4Áw|? ÁKà X <D A"0Á:A#w&%Át wkl w]'w2Á w wA$øÁ w6 w( w wøøøøøøÁEv0I v"-vA$vu øøøÁ vA_Á A"wF,v86v-w%Á wv6øøøøøøøøøøøÃ7wwøøøøøøÁw}AÃ5øøÁv2;wA'vq Á5øÃøøøøÁøøÁn wewZr øøAu*pvuv EøøøøøøøA u)BÁ:w"QwøÃUAAWw<w.UwxvRÁC øøøøøÁoøøøÃEwkA%Á_ øÁ Q;7A!w1AøA%wUwJjv0A*AvwA#øøøÁwYTwIv;6 v-tIøøAøÁw vAÁDw.AÁw9A w-TwAAøøøøøøøÁ$ vAAøA'wA1w8v*A1tA/u(Ã,øøÃ7w0&w%A/wøøøøÁ E ,X mA)A!AøÃT%& A(v/A+ÃWwIfv;OwøÁ!  AEøÁ w9Yv4Zt)A"V tAøøA&w$UvA v5øøøÁ øÁmR wH w(rwA"øÁ ÃEwA"w øøÁ ÃHwCwA!ÃMwAøøÁ}øÁ w(hÁRw,A#wÁÃøA#w!zwXøøøÃLv+w#Ánw; XwOøÃv8A#w(w~øAÃøøøÁ\v_ jÁ~Áw./v vA#w øøøÁA"AøÁÁ{Áޝwnlw`vRvDJv<)v.AwAw0A(øøøøÁ8w]j'Ã*vEd w39Dv%A%wp vAøøøÃCøÃ?wAv]E Á' øÁ w.øAÁv!bvA"øøøøøøøøøøøøøøøÁ&øøøøÁOwcAvWW@w=Aw7Aw+e v>wAøøøøÁ/ÁÁQøøøøøøÃ8v

 w\A'AÁ/A#l8KwwAw'wADA!øA!tCA"icÁRwk wDMwg_wApÁgNcÁwEm/ÃNg øøÃMwA vK øA,p<S FwVÁj A/!ЁK„tA!\Á1w9A-ÁvLv>، v*Bw"øAt/øøøøA(v\Á: OGA%DÃWA,w!Á>w]A0vWÃUwFE)Lw$DA%v øøøÁ  øøøøøÁ&øøøøøÁdwDRv6A#t!,v}øøÁ>øÁw1Nv&+vAÁøøøÁøA!v A"tw øøøøøÃøAvøøÃ1Á w_w5 w wA%t øøÁqÁ"' uA!w øøÃwwøÃw wH Á wW w4øøÁøÁv vAøøøÁ4'_Jws"t2Xw-Áw@<w)4vv5øøøÁ)Áu)Á&wøøøÁ+øÁwK-wCA$v7w,A%tt#IÃøøøøøÃ.v\wBAv6At0AtvAÁøÁ/w:3øøøøøøøøÁøøÁøøA)vAøÁ̽."A!sAøøøÃ$wÃ8KCA!/A!,wF(t;øÃ0wv9w`w3At't0 øÃzøøAt v2,øAt&=D@Á w#At) øÃ5ÁCA øÁhwR0w&A,wA%v*øÃvv.A'utw øøøÁ(Bà u#A(wA%w øÁw w øøÃ-wøÁ}Ã3øøÁ &v>Vv09w%A!w%øøøøøøøA$w;u3NvItÁw7øøÁ7g+w3Gw$A%øÁvwÃKøøøøøøøÁ?wøAÁ/XAÁ Á ÃtMøøøÁ w&vwÁøà vAøA A& AAøøÁ wwAtøÁx  wÁAwa wNv:AtAt Á vøøAÃwsAt[bXwMwEÁA-v+@Au pøøøÃv ÁwAøÁ'SøÃ4w6'w+%wAÃøAøøÃwmtb wZà wIw;w6Yv(Avل vøøøøøÁ Av>A%4A",R A oU ÁJl  %rÁIw+%w |vAøøÁ!(o"Ã%v^Á( * cw,$w!Aw øøøÁ'vjFwCw5xwqv$AAøAv[w+n# w$øÃ&w:A#w4A&w4K%ÁøøøÃpøÁcv<w.7ÁQvTøøøøøøÁG w9g A$ mR !m Á( vN.w'w PÁv(vi,øøÁ!w3i v%vA!vNøA u[Aw^+tSAt(øÃ)w'{vÁM v'w%øøøÃ"d'UI C(4T5 øøøøøøÁøÃ-w';Ãt}øÁ  w{A!woNwjÃBw A&øøÁ v+vvA øøøAweøA"øøÁw$wAwÃøøøÃvA#ut øøÃRv]! wwwA#røøøÁ pøÁU% ÁwC Á3Áwhv`A%vTA+w #vÁwAøÃMwV:wNJt5Kt#A%wA!øøøÁ'A!wv øøøøøøøÃøÁøøøøøøÁ ÁvL w5ÃSÁøøÁoøÁhvAÃwJO(v A+ 8  øøøÁS%wR*wAÁ8'wEwA)vM&Ã[wP&w5,w#wA.wøøøA A#v 'AøÃt2 v$^ wAøAøøÁ wB wA Á> vAAøøøøøøøøøAøÁBw8_Yw*A#w-tÁdøøøøøÁ_øÁøÁøøøøøøøøøA,AAY1tcWA%+I=wqviÃ-8< SøA1w^-wJA0t%v*w(øøÁv_ϴÁXA2øà t>Ev0!t A*w/v øøA%øÁ4wWA$Á\'wv$vkA#AÁxwBwA&A)Ápv(;v \vA%w øøøøøøøÁw`*wNw@_w+vAvføÁøÁA*øøÁsøÁ A*w wqA'wkÁ8 [w:!w[ÁÁwAÁA!øøA*w wA%v øøÁA0wYl ÃTvAw-I w A*vVøÁ wXvKA3Á v8 wA3øA)v+A*tvA1øøøøøÁw;w-k wwy øøøÁ w!Aw v3$øÃøÁz øÃ1&øøøøøAøÃÁ6Á AÁøøAuKwFw vÃv\vTw?Y øøAtøÁ ÁH øGCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0GNUzRx 9T9Thevc_asc_apq_tree.cpp_ZN4aenc9APQSelectEjjjjjj .symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.note.gnu.property.rela.eh_frame@9T!yT'yT,0yT,5TET ]T0X@ V T  U18Vg/76 0 0 0 644 82456 ` ELF>>@@ A\wM|$p|$`uE|$h|$(j Ѓ@|$A|$X!PCAC v|$ 9o |$|$0 Ѓ@|$(s w^|$pFA y7I|$p*|$hY~ |$$|$p>11A \$|$X|$h!|$}1|$($!ЃD|$`|$X1|$!|$S|$pZA|$p|$@|$H!1A|$h"wl|$P|$ ,|$@  Ѓ@|$h1]|$(Q:1|$X~(|$@>|$HA!ЃøÁ|$hA |$hH,A|$H!Ѓ|$pI!ЃfJA-@!A@@u%C Ѓf,|$E|$H D|$X|$8!|$XBgA1|$(p|$|$@+@'|$01|$X|$ Ѓf|$ E|$@|$ f|$Pnw)|$ Ѓf|$P(|$H$ @|$H"|$HNf|$|$ |1<|$` !Ѓ|$H(|$pA Ѓf.-|$Pv1|$8iX[1|$ N|$P?!Ѓ|$)|$0 Ѓf|$@|$X4|$@ |$1E|$hA|$h#fAt$`|$H_! t$0!|$@;g|$H |$@@*1fl|$P|$!ȁ!fD|$PA  Ѓ1|$|$!ЃA fD|$ |$`c=|$ f1|$GkÃ|$@5(fD8|$@R^|$H|$pP f|$hKj|$|$p|$p |$(P|$h!A 1|$(|$pGw|$P$A|$!Ѓj|$P |$hq|$!ЃÁ|$HQ!ЃÃ|$@Ã|$pE ÁÃ|$@|$ D$(!Ѓ1|$P |$1t|$H6|$h!Ã|$U Ѓ|$ƒ$!!A!ЃÃ|$@=|$P|$|$@Ã|$`_|$ * ЃÁ|$XÃx1|$h9|$(A ЃÃ|$X|$p6 ЃÁÃ|$`l|$YH|$H4T|$ of Ã|$`P0|$ X1|$pf|$P|$XCA A|$( Ѓ|$|$ R|$h(!Ѓ1|$X*y|$8shÁ|$pW|$P!ЃÃ|$@"@|$p2|$XÃ|$|$(1ÁÁ Ã|$@5Ã|$XQV|$X !ÁÃ|$% Ã|$pM|$Xh|$h,|$|$`( 1|$Xl|$\ |$@ Ѓ|$( ЃÁ2!|$@'|$H Ã|$!1|$ L|$H^A |$ )!Á|$HC!ЃÃ|$P!ЃÃ|$`8Ã|$`O|$@ ȃ|$X ȁ ЃÃ|$A )&wb|$H|$(!Á|$(|$P  Á|$pA ЃÃ|$(Ã|$PÁ|$( ff.BA M|$|$XL|$p Ѓ|$h!Ѓ!|$( |$H |$|$P |$@!Ð|$ a |$iE|$@]|$h EV]A!@Awb|$`]3|$H|$p`|$ |$pa|$X Ѓf|$|$pH1|$|$P/A|$h3 ЃD$H4|$P|$!Ѓ|$hX @t$8(w4|$h(!fD-f1D|$X@=|$@w1A wہ|$(wr!Ð|$pR q|$({3|$hh|$X |$p S |$ K1R|$H|$Hy |$hZ|$X%m:|$  =A!@|$(r|$2A1|$h,|$@|$& @|$1A[>(|$(N|$p5!ЃfA:e|$h*|$p !f.|$X|$( Ѓ|$ < Ð|$@&|$|$@:|$H<|$X ЃfD|$ 7|$P n|$`=@|$(|$H ЃÃ|$h-|$p[t|$(|$@ ЃÐ|$X|$ Ѓ|$8!D|$hN|$hMA5|$(|$@ D|$pO-x(|$@5>|$pAV Ѓf|$(H@|$(GA  |$|$X!f|$ifD|$(J|$=|$H|$4 Ё|$pd ] . !Ѓf1|$X7|$`#|$h:!ЃD|$H y1|$h\|$(|$|$pa!ЃfD|$%|$X8p|$@)!ЃA1|$@|$H|$(|$ ;!D|$( ЃfD|$@5|$hV|$ @|$7y|$Hq|$P|$h|$|$`!ЃA |$X!ЃÃ|$/1|$h/|$`S|$X|$8|$HÁ Á2|$(4|$H!Ѓø|$P b|$h-øAdA|$ +!1|$E|$H |$!ЃA |$V!ЃA  |$(el!ЃA|$X|$ g|$ ;|$H!Ѓ+!Ё!ЃÃ|$@d|$PA ȃ,!Á|$HBAZ|$|$(9!Ã!A!Ã|$`,A Ѓ|$p Ah|$M|$@'!Ё|$(!Á|$H+|$@! |$P  AÃ|$x ЃÁ4Ã|$ |$@|$`<|$ ЋT$P!Á|$H|$X]!Á Ã|$ ||$P  0|$X"|$Hx!ÁkÃ|$j|$|$ ЃÃ|$|$XD$(sdÁÃ|$P!ЃÁ-A ЃÁ Ã|$!|$sÁ|$($|$hl!Ã|$h_Ã|$PÃ|$QÁ|$HOøÃ|$X|$!Ã|$&|$(T!Ã|$@#Á`Ã|$|$ % Ѓ|$h!Ѓ|$!Ã|$P|$(KÃ|$( |$ !ЃÃS|$ |$HV:|$HH)|$@|$ )] ЃÃ|$P|$%|$h.|$`Y!Ã|$X |$(N Ѓ|$(n!à |$!Ã|$)A|$@- Ã.|$hS!ЃÁÁDDT$@A|$pAN|$+|$H|$X|$h ЃfDA|$C|$`AM1AA|$h% A Af 4Ð|$I|$1||$h<A.AA Ѓf.|$ PwYD$X5|$hQR|$|$Xd+ |$`'|$ ЃA^|$pi+A2Q|$1|$`-|$XW |$H|$ Ѓ|$`  fD|$p[ |$1-A9m|${|$X_ |$L$8 fA |$8k|$HdH|$h( Ѓ@|$ U|$ 1 w?|$HM|$HF@'>u |$`|$hz@E|$XT|$~'|$hY|$`Ew|$X#|$ Ѓ@|$hA1|$R|$P#S|$P!Ð|$`$|$81|$(|$ xt$X|$H Ѓf.|$pU|$ 1|$pcc|$|$(!Ё!A'|$( vf|$ |$p6|$h?A!Á|$()@|$`A!Ѓ|$H~|$h|$p|A WA |$P|$/ |$X|$H&!A!ЃfD|$ a|$h!RAf.|$H |$`!I|$(A fA  Ѓf.|$(-|$h& Ѓ1|$`A|$ ÐA |$X|$  Ѓ !f.*D|$pZA|$  ЃÐ|$"|$pL!ЃA' Ds1|$ XA!Ѓ |$A|$XX|$2|$( }|$(( f|$A!Ѓ|$h'A!ЃRA|$ Ѓ|$P|$(% Ѓ5 ЃfD|$p2 1|$p|$(;|$`5!ЃÐ|$HA Ѓ|$P|$8 L|$pA|$H|$(!@|$P!Ѓf:fD|$P'|$p |$H!ЃÃ|$P|$-|$B!Ã|$(4A=4A) Ã|$`&h|$  ЃÃ|$pY|$!A+!Ã|$`|$P A  Ѓ1x|$X> Ã|$P|$H   :|$ A|$!Ã|$"|$ z ЃÃ|$H Á|$(n|$X ЃÃ|$ 1Ã|$<@|$p70mËD$(|$ !ЃÃ|$`C|$h6eA,|$8u|$ #|$H !Ѓ|$  Ã|$hk|$( ЃA/!Ã|$|$H9!Á|$(W|$P AÃ|$|$H$!ЃÁ|$(&!ЃÃ|$P A|$(Á|$X|$`5|$HA ЃÁ|$( ЃÃ!b|$4!ЃÁA? Ã|$N!Ѓ!Ã|$A  Ѓø`?*A*|$p!Ã|$p}1|$pA,|$h: ЃÃ|$PAÁ&ff.@|$8wI|$~ |$ ~|$pT|$ Ѓ|$ |$ |$ |$p T$@!ЃA Z|$8A|$p#|$||$(n|$(|$p!D|$`waA G|$pn|$` |$7C|$h~ |$Hy-|$@|$!|$X 1|$p_|$ F|$p?|$@Zb|$`*|$P D|$ 1AA|$@.<A x |$H ЃD7wS|$(S|$H|$ t(|$Hyw|$H|$C Ѓ1D|$p5|$hJ*|$1|$XS~Ѓ|$@ f. |$p1|$ Kwsu|$ |$(@|$`A=A|$pd ЃÃ|$@+|$(#|$A|$`  ЃDA|$X41|$H-|$M|$p|$X i |$|$H9 fD|$p=|$X/1|$H I|$pQ|$pK |$"(|$@6|$(o Ã|$h* |$p[A Ѓf|$h(|$@@|$(|$|$: Ѓf|$(|$H!Ѓ|$h~|$ ||$H|$(VA f.|$h}|$P |$`F!Ð|$`X|$XQ ЃfD|$HvD$p\@fD|$@  ЃÐ|$ |$Hp~L~|$P!Df|$@/|$&|$(X ȃ Ѓ@A |$ |$`5 Ѓ|$H)!fD|$+|$XS ЃA !D|$9|$ So1|$H!_|$XL1>|$(?+|$hC|$(A!ЃfDfDE fD(|$P!@|$@>A!Ѓ*|$ A!D|$ )0|$X#|$D$X(@E|$|$e|$@1!Ѓ|$`!Ѓ|$(4|$  D|$p 51|$HK|$HH|$|$`i Ѓf|$1|$`>j|$p1Z|$" Ѓ@|$ 2v|$(\|$X' |$P|$@4|$ !ЃÁ|$X@1 1|$P A!ЃÁ|$pÁ|$(jI Á|$(!ËD$@!ȃD!Ã|$2|$ ЃÁ|$X@|$  Ѓ|$p` Ã|$,|$ |$P ÃU|$P!ЃA|$ ЃÃ|$@|$HE Á|$(|$|$@ Á|$(Ã|$h[L|$`ISyC|$P XA|$HC!Ѓf|$H|$( Ѓ|$X Ѓà y|$PPÁ|$(t D$H-e=ÁÃ|$ :|$ !ø-: |$(6 Ã|$h.|$@ Á'Ã|$N|$`xC|$@A|$P Ã|$.Á\!Ã|$R1|${|$ Ã!Ѓ1|$ 1&Á|$(!Á|$h|$!Ã|$XÁ|$(ÃaA Ё|$ Ё|$H Ã|$h<ø6"|$`5!ÃA|$H| ЃÁ|$=!Á|$(fDDT$A A_|$p4|$ |$P v1A|$hqL$0!Ѓ|$(K D|$pA|$!A%|$XE|$( ЃÐ|$p@A,|$|$PCA |$( ЃDAR|$`!7|$ \|$@|$(A|$  Ѓ|$@ Ѓf|$`1EL|$5o|$TA |$ A  A6|$X1A |$h k|$H5f{A|$X A1|$I|$hK |$ O!Ё|$p!f|$h1wa|$`vC|$P|$(Kw.|$3!ȃJ!Ё|$H!øD|$HAf8|$` |$ m|$!fD1>v|$D$)A !z1AZvL1{AA&|$:A|$pv  |$h|$@ A 1|$@|$@ f.|$X|$@5g|$PT|$pO|$ 1|$@* QA@|$(%|$PI!|$|$?|$  Ѓ Ѓf|$TA T$!ЃAf@|$ 1|$@|$0|$@!Ѓ1|$tz|$8A!Ё|$(p!f|$Hp @f|$ !Ё|$p!ЃA |$ !ЃfD|$@ |$pf1|$P |$H7!ЃD|$hV|$G|$P !fD|$H@|$P|$H\|$ r!1D|$8 ЃÐ/|$H!Ѓ|$@> 1|$(<|$|$(_ f.|$X&W|$X|$(;|$@!@|$XO'|$H|$s ЃO Ѓ@J% A& f|$H|$!1|$(|$(!|$@%|$P!1|$8|$ D$@K f|$`zwt$@lf|$p|$`M1|$hc?.1#|$hI3 ЃfD|$P|$P|$p|$ U|$@0|$(|$@ ЃÁ|$(~|$X!Ѓ|$pW ЃY ЃÃ|$`fÁÁC!|$`,|$X} A|$H2!Ѓ|$X !1|$P|$(|$@(A |$  Ѓ1|$`q|$`*!ЃÃ|$h |$8|$ Ѓ1A*|$(rf|$X5!ЃA|$P!Ã|$P!Ё|$HR!ЃøA |$Ã|$`7|$H! Á|$Ht1A|$|$1A |$@ |$p#\|$`Q|$( f.A5|$!!ЃÃ|$@,A.|$h/|$@ Á9A ЃÃ|$:|$@7|$pu!ЃÃ|$`EÁRh|$pA |$@&!ЃÁ|$HnP|$() U|$(G|$D|$@ ЃÃ|$ = Ѓ|$`- Ѓ1|$A A ЃÃK|$hs|$` @@ 4) Ãm ЃÁ|$@ ЃÁ|$H@Á|$(^|$|$h= Ѓ1A<|$N|$!Ё|$p!ЃÁÃ|$PÁ Ã|$@<Ã|$@à A !ЃÃ|$@(|$(|$h#!Ѓ|$%!A|$@2!ЃÁ|$({|${ Ѓf.DT$pD\$AA\A )YAt$81|${A@ |$X|$!fA BAAkA)|$h ЃA\cU|$ cJ|$@|$(|$8!AA i@|$(kry |$b|$`!fA A|$h%|$01L$@, |$hfD 1|$|$H||$7!Ѓ|$h,Lv{|$PA  ЃfD|$X9|$(N|$X |$ F!Ѓ|$h+uA? |$ -Ðf.|$@ 5|$(w|$P|$@A!A|$H |$ fA |$H1Aq|$`Af|$h31|$`(1|$`)!|$@A Ѓ|$(|$ Ѓ|$hn1|$@#f.1|$X|$ <AX~1Ar|$( fDfA.1|$@".|$X2(|$H  Ѓ|$(!|$8!ȁ!ЃDfD|$H@|$(J @1|$("}|$hAAD|$b|$( Ѓf.|$P5|$@ M"fD|$@ |$ _|$H[fD|$H|$Q ȁ |$`iug!Ѓ|$X!@|q Ѓ|$)| ЃÐD$(-=& S|$(Wj!f.|$H  ЃX ЃfD|$@8|$H!fD|$h|$8 f.|$h9|$ |$H !Ѓ@AA|$(|$`y Ѓf.|$HT|$X@b1 A|$ 1|$&!A!A|$8 1|$ 8!A1!ЃÐ|$`|$@7A( ЃA|$W'|$h-!Ѓ|$!f|$P !@|$@|$(r1|$@-"|$`* |$ vÃ|$P q|$!ЃfD|$X|$@|$!f.A |$` fD|$HrA|$H ЃÁAH|$H* ЃÃ|$H$  ȁd ЃÁ|$HxÁ|$( 1XAA!ЃA |$(c!AA|$(!A|$`Ac&|$ #!Ã|$84|$XÁ2A{6|$(d |$!ЃÃ|$ D1A|$P!A |$hJD|$Xhà ЃÁAh Ã|$A!1Ã|$ [.A Q|$ O!ËD$(-=0Ã|$`}!ÁÃ|$  A ЃÁ|$HÃ|$nÃ|$(ËT$8|$(+ ЃÃ|$@ ЃÁ|$XAAwA"|$@'|$`X!D)L- AA A"|$@|$(!ËD$PAD$(!pÃ|$s|$@!!ЃÃ|$h-Ã|$`AtJÃ|$` |$@6 1A.}D$@'A Ã|$SA ЃÃ|$5A |$ & ЃA&|$hsA!ЃA%|$'!ЃÁ|$H4Á-|$ j Aff.|$DT$pA@v|$h|$Pd1|$(T|$(~A|$P|$0 )|$( D\$XE|$(A|$h2|$XV1AD$= |$ wA Ѓ_!fDA@Z|$|$<$|$!|$`)|$5K|$h8|$P!Ё|$(B!|$XAA_'|$h|$5|$h>|$X' Ѓ@|$].O|$f.|$X |$H||$|$]?|$|$h]|$|$h@@u+|$%Av~! |$'1D1|$X~|$(~|$@|$P |$%|$`1|$@5wA%AC|$`|$8 Ѓ@|$HJAA |$M Ѓ1|$(L :|$@:A*AA|$P[|$@0!Ѓf|$(|$` L@|$|$X|$* |$h|$PA Ѓ|$(!@|$|$@&D|$H Ѓ@)fD|$ M|$h1 Ã|$9|$ !Ѓf.EG|$Hi !Ѓ|$ !fDA5|$P  Ѓ|$H !!|$|$H f.|$h-|$P!Ѓf1|$@4|$`$|$ Ѓ1|$ ||$.|$X!Ѓ|$  AA|$]!Ð|$~y|$hk:|$HW!Ð|$ f  ujAo@|$@|$@ !Ё|$Hl!f|$ ouA|$Cf|$. 2_|$fD|$h.L|$Hn ЃfDA {1A$g |$( |$!D|$X@|$Hy|$X|$@1Aa|$Hu .@|$ <m @|$c|$X#1A8|$"|$`4+A |$H)|$( 1|$`~cDA|$@!|$ /|$( AM!fDD,Ãb"A!Ѓ|$@!Ã|$hx|$HCÃ|$P,Ã6Ã|$`Ã|$|$H!1|$@Q|$H|$ ACÁ|$HC|$Xo|$@2|$!AÁ|$X|$@!iO/ ЃÃm|$0A ȃV!A(1|$`*|$|$X|$(~!ЃÁ|$(|$HA Ѓ1AA|$ Á)Ã|$|$` Á|$H>|$H'|$X!Á|$(Ã|$`1|$ b|$`|$@AÃIÃ|$@A ЃÃ|$X|$@!Ã|$@1A!Ã|$`H|$@(|$H|$ Y!ЃÃÁ|$(wh|$ F|$H  ÃHA5|$P|$XU|$ AVA|$HÁ|$(AA|$H ЃÃ|$ FÁ|$(|$H!Ѓff.fA|$p7{|$|$XB|$(7|$$|$ |$ t$`DD$@E Ё ЃfA~|$`:f A|$h|$`- Ѓ7wC|$(Y|$ |$X4'|$|$HN|$`wa|$pb|$P |$8`T$`|$(g& |$pX|$(b|$`  ЃA&|$ |$ vu|$pI~n|$h6}|$@ f|$ !@|$hn Ѓ|$ !Ё|$( „t A 1@ew;|$|$?M|$@|$p A fD|$!w1|$X~|$H|$X1|$h*`y|$(|$P Ã|$X>|$ #|$H4|$pw |$@:|$P!|$XAx41|$H`` |$c D$(^f|$`1|$(+ |$hx|$H|$ Ѓ@|$|$ @1|$HM 0|$XT |$@A|$p!ЃfDA|$`"!Ѓ|$h |$`B|$|$Hq|$X ЃfA|$|$Hf|$HF R|$`CÁ|$X |$(D A |$!D|$p>A m|$@|$ |$h>|$@!Ѓ|$P !Ё|$(!fD1|$p^vA D$X|$(|$X> E|$@*|$7 D$H-=fDD$h?|$ ЃD|$P1|$r|$(|$X!^+d|$Cf|$P)|$@ Ѓ@F]1|$PP|$hn@1|$@3|$A!Ѓ|$|$(b|$H|$(Z!Ѓf|$`R1|$h|$X|$P @1|$pW|$X}!f|$X'f|$&[|$H|$$B|$(A!f.|$>|$h\(|$`*|$P|$H|$8|$X |$h1A|$@(!Ѓ|$p |$h'|$3 Ѓf.|$ @|$px2C Ѓ|$ g Ё|$X Ё ЃÁE|$h ЃøAAÁ|$Ho|$h8!ЃAƒ|$p Ѓ|$  Ѓm ЃÃ|$o|$+!1|$XT|$(|$PÃ|$Ã|$?Ã|$@A  A|$@D!Á|$@|$ A|$ ȃU!Ã|$Á|$|$X Ã|$H%Á|$HÁ|$(Á !ЃËL$|$HÁ Ã|$|$(!ЃÃ|$\|$( A|$`= Ѓ1|$X|$1|$|$|$8 Ё|$X ÃQÃ|$hwøD}|$>|$!Ё|$X!Ã[g F|$H  Ã|$@Ã|$ /A|$h/|$@7|$h{!ÁÃ|$(NA|$X!ЃÃ|$ V ЃÁ|$ Ѓ1|$pt|$ |$@ !ЃÃ|$@w8ÁÃ|$@!wID$h!AwX|$HÃ|$Hn|$`!Ã|$(,|$H Á|$(*|$P"A!ЃÃ|$>|$pR ff.fSD\$ ADT$xA A5*|$|$`r [fA|$p%|$0>|$U'vNjD$0[->=A@bAv|$p4/ yA!Ё|$`[!Ѓ|$X wa|$hA|$ |$h fA< 1A|$ |$j[Ã|$h%|$P} |$X,At[A.|$pK1~k|$PA[|$+A |$8[6 Ѓf.|$P8r|$p1 |$PAt |$`& [f.|$`r|$w|$FlA ) |$(J[@A|$3D$`:AA AG|$0*[ D|$#1|$H!T$P[A ÃG7X|$p+[H!A!fD1|$P ||$`,|$P|$`[!Ð|$`N1|$PP5|$0<M|$[!f.|$`51AA|$p[ !Ѓf.|$ |$0 `[( D|$H)[fD|$P[|$H*UA\?3A|$n[!Ѓf|$|$PB Ѓ|$[!ft|$X|$[!Á|$pA |$@ Ѓ|$h![ Ѓ@|$p|$!Ё|$`-[!f|$p.%kPA[!Ã|$pD1E&t|$0D[A!@A[|$p#|$P[|$h|$`L$A[ Ѓ|$|$h'A |$h[ ȃn!@|$H8w|$({[!A|$0 [!f.A[|$H[fD|$PO|$`L|$K[ Ѓf.|$HKAp|$|$P@[!ЃAj[@|$Ab EH<|$H,11|$h$|$pX|$X [ @A[A ЃAIPA|$p@!Ѓ|$X[!1|$H[A!Ѓ@|$h[fDE_AIUAZ|$!|$(G[f|$0|$H9[!ЃfD|$`? A|$( Ё|$P[ ЃDA:,|$ |$Pa [ Ѓ!f1[@A |$|$pf(1Aj|$0[!ЃA[A/D$0[-z=1[1[1[ø[Ã|$p+[Á[A [!ЃÁ|$[$!ЃÃ|$H|$P[ Á|$0,[1|$q|$h/J[A|$0[!ЃAX|$pF|$X =1|$P-|$0[ Ã|$8![A |$h2 |$0{[!!ЃÃ[Ã[A ЃÃ|$|[ !AO|$(!|$H[ Á|$PW|$H=[!øi$ &[A[Ã|$hG[Á|$P|$`= $|$ [ Ã|$`a|$PrAT|$H |$pP[A!Ã|$p-|$`- Ѓ|$hF[ Ã![Ã|$(@|$H [!ÁJ[A[A!Á|$P; [ Ã|$(f|$X [!ЃÁ[A} øA |$`Z~'|$P][A3!ЃÃ|$[1[1[fDDT$pA4A G5|$h|$X|$P|$|$ !D"|$Pwr|$X|$hED\$XE~V|$` A 1|$H|$ |$X u A$ofAA1|$vʃ|$h|$u|$~|$ t|$h%!Ѓ|$ |$A` |$hC]1iRA|$H!Ѓ@|$0A[D$X|$h#|$HH!ЃfD|$( J|$`|$P1|$ Z|$X3A!A-!Ѓ|$Hu|$(|$ K!f|$X :A%T$  Ѓ|$(C!|$E|$X{|$LA |$ vD$(-l=A|$|$HQ|$@|$(v AS #CA1|$hV4|$X`|$HOr|$(+@|$Hb|$X|$ {|$`V AE ЃAA*|$h;4AA1{E, GDAuRB|$ 7|$`v!A!D4 1A\A4|$HC!Ѓ|$8]|$=|$|$!fD|$h9|$ |$  ȁV|$H+!|$Xe|$ a|$ |$P Ѓ|$@!f|$f|$  |$(f|$  D1Y!|$`#!Ѓ|$P Ѓ@|$P |$ Ѓ|$H!D1|$X}|$P|$+ ЃÐ|$%|$H \|$ |$hAS1@|$mAD|$(+@|$(|$@"!f.|$P<f|$`A|$XiA[_|$ |$( |$!n|$|$`I|$h%!f.|$'A9 &|$hJ|$(^ Ѓ|$@)|$H!!Ѓ|$`!ЃA6:@|$X|$8Ð|$ |$HA7 Ѓf.1|$yA j|$(c_|$@A ЃfAA@m|$(p |$(2A  |$0 ȃ|$!ȃ!f|$ |$hwÃ|$(|$@3 Ѓf.|$@  ȃ/ƒ|$hR!!@|$P !ȁ !Á|$HT|$X!ËD$(9R |$h[|$H !A\!ÁA |$`?|$H:  |$ ?.!ЃAI|$|$hx!Á|$H!|$hj ~|$H|$X Ã|$P |$hU!ЃÃ|$3|$7i|$@ A|$h)|$H|$  ЃÃ|$|$h-A!A!Ã|$Ã|$`Ak1|$HR|$(A|$|$Y Ѓ|$P!Ã|$`EÃ|$%,N|$@(|$h7!AL!ЃÃ|$P|$h3 1:|$`D|$P ÃNA!Á|$(E |$`0|$HB|$@A A#|$(!Ѓ|$ !Ã|$`&!|$(|$@' ЃÃ|$hE|$  Á|$(|$|$ -!ЃÃ|$h/ A1|$ A|$@5!ЃÃ|$h"A  ЃÃ%A !1|$|$Pb|$H  ЃËD$@ÃÁ|$(r Á|$X|$(|$hS),|$h ЃÃ|$J$!ЃÃ|$ 3|$hp|$hU|$P!Ѓ|$ K!ЃA^1|$P|$(!ЃÃ|$A[!ЃÃ|$ Bi|$ w ЃÃ|$ |$H!!Ѓff.DT$pAAA7|$@wN|$|$p|$HVEd|$(|$h D ؅ Ѓ@|$X7|$@9A|$|$Pf|$7 |$ &!fDAw:A|$2|$X E1f|$I|$H[|$x|$`+ ^A Ѓ@|$|$hDJ|$`1|$X[ |$)"m|$ |$8|$@ #|$h1]Al X|$X.!|$*5|$HEÃ|$D|$|$H|$P!|$h&|$`|$`LU|$H, |$Xu!Ѓ|$`*AeA|$H|$A!|$-#|$ z|$@F!Ѓ|$+ DA/A|$( tЁT wA|$h7!@|$ 1|$`w|$P+tz Ѓ@7|$@0A |$H|$X!A!Ã}|$h5t|$(|$ 3\@A wz|$X|$ Ѓ@|$ |$hA|$@'@|$-|$HÐ|$@!eA |$@ |$hh @1|$ LA_AAw ЃD|$P|$h Ѓf|$H|$X!Ѓ@|$A" Ѓ|$XA|$(C!|$(*A"|$ !Ѓ|$S!fA|$X5`|$h+U|$0JT$`9m|$P !fD1A |$X |$ PA A|$I @ + Ð|$uA|$.|1|$Ho|$H_|$@|$`} ЃÁ|$( f.S|$`*|$-|$@<!Ѓ1|$@|$@1A|$h)|$X Ѓ|$@- |$XAA@|$ !Ð1|$HZ|$PJ|$P|$X!Ѓ|$@5!ø]A A |$|$H|$hH!DrÐ|$(A Ѓ|$r"i|$H!1Ql|$P|$(8 @A0|$X M51|$X%|$H|$ 3 !Ѓf.|$@1|$`A n@|$|$P |$@|$ 4 Ѓ@|$?wA1Q_|$@&O1|$h^BD$hd f.1|$@|$@|$(|$He D1.|$`G1|$u|$  @|$(Q Ã|$`A Ѓ|$!Ã|$Ug|$(%Ã|$h.h|$`|$ gE|$HÃ8s|$ '|$ ÁÃO(!ЃÃ|$Ã|$(|$ (%Á9A|$`u|$A!Ѓ|$@!Á|$X- ЃÃ|$@/|$P  Ѓ$ ЃÁ Á|$Hn|$P!Ѓ1|$<|$H|$[ Ã|$Á|$`i!1Aj|$@!|$dA|$!Ã|$Ã|$ Ã| ЃAÁf|$hc|$`|$(f!ЃÃ|$@4Ã|$`$A!A !Ѓ|$hV Ã|$P|$!Á, ЃÃ|$X|$P|$`!Ã|$hhw$|$` F!Ѓ|$( Å ff.fDT$pA9Ag|$0|$ 1|$h|$XpD$(|$`-u!A |$N|$A36A$|$P C|$ ЃAwB|$0|$h(A |$?A|$(#!D|$XIY1Ac|$H7/|$(|$`t+dA!Ѓ@|$E|$H|$ XT|$hGN|$(|$Hk!A !Ѓ|$ 5|$h'|$h|$Po|$E Ѓ|$XA|~|$|$hul|$ vesv[|$H A!@AFFA@1|$XW~D$hifD1D|$`|$(vAd [AA!ЃD|$`!E|$Z|$@W|$H2|$(R1AicA|$@!Ѓ|$ fAv|$ Ѓ|$hn!m |$!Ѓf|$8w!#vAB|$(fDf1|$@=|$`A|$h=|$(Z|$v|$H !@|$b|$ U!DAA Ѓ|$hs!f.|$h#"|$ 0 ЃÃ|$@B|$!!ЃfDD$`|$hËD$H-uYÃ|$ |$P,|$!D|$` |$!f|$-|$hSS|$0aAR|$@ @1=|$H,|$P!A !f|$(1|$ A|$`!Ѓø|$`H|$0 D$H |$(T$P|$ fD|$IL|$P@A|$|$ |$n!Ѓ|$X!|$(@ )fD|$H|$!f.|$h4t$XA|$`F ЃD|$fA|$h5 Ѓ BA.!ЃD|$`0hAY|$(GAD|$ ^!ȁM!Ai|$P|$ h3|$` |$P@|$@)|$'X|$~|$h- f|$H|$h!f.#?A|$hj|$P !ȃ|$h- ȁ ÃÁ|$ ЃÁ|$(|$P ЃÃ|$K!Á|$H|$P |$(@ƃ|$P@kAVa|$@:!1/A>|$hHA  Ѓ|$` ЃÁY Ã|$A!Ѓ|$ !Ã|$h6|$P |$@9 ЃÃ|$nD$h,*Ã|$hM|$`vu|$hI|$P9 ЃÃ|$`Á ÁC|$PÁL|$(|$X ЃÁ|$(|$&!ЃÁ|$(ÁÃ|$Z5|$Pp|$(-!ЃÐ|$`,|$H |$X!Ã|$h*|$( !à  ЃÃ|$ Áz|$h= Á|$HÃ|$`?|$ !A|$H !ЃÃ|$h.!ЃÃ|$XA ЃÃ|$A|$(A ЃO!Ã|$;|$  ȃR `AV|$ !|$p;wD|$X9wu|$`|$@|$!Ѓ|$ !D|$X|$ gk|$|$@|$@@|$wQ|$hV|$0|$p}hED\$PE!Ё|$(!|$1|$`(|$A |$(|$X2A|$( j|$pd^1|$V|$@(|$XJ 1|$P|$(|$P|$,A Ѓ|$h$vjA(A |$P|$H  ЃA :|$|$(Lv|$h+|$ øfA*|$(?|$@ |$h<!ЃÐDT$XEzAP|$(]|$h$vU |$(u|$p!|$ ^1U|$HB|$P |$)|$p7 |$H> 1A|$@7|$H!ЃfD|$`4|$X7 !Ѓ|$H |$|$hy Ѓf|$P1UjAV|$X|$h`C|$Q |$!"|$P|$(A!ȃ/!f|$A |$@#|$(|$P !ЃfA|$X!@|$|$Hga!ЃD$ |$hÃ|$@#A/|$@/ Ѓf|$pb|$`; Ѓ|$!Ã|$`|$|$ Ѓ|$ |$|$P!f.fD|$h@|$h7|$% fjO|$ @y|$( Ѓ|$ fD|$h'}|$A|$`Oz!|$w!vA f1Df|$hgXA w Ѓf|$(@|$("|$X|$P|$`,|$C|$X|$p)@@|$@=f 2 ЃD1|$H|$(h|$(A !Ѓf<|$XfDI= Ѓ1|$H8 v|$(|$Nf|$(Z|$&!Ѓf.|$h1|$` D1|$ |$(w|$H@|$p|$H|$X @|$  @AeAT Ѓ !T|$P!ЃÐ|$H ЃfDA8J Ã|$&U|$h Á|$Ha|$  1A|$@!ЃÃ|$@&!Ã|$@|$p5 Ѓz!Ã|$X !D$(%|$@ Ѓ|$hg!Ã|$ D|$@<|$)!ЃÃ|$hb|$!ЃÃ|$p"Ã|$pf|$(X|$@T$P|$H!ÅA ЃA|$@.|$X= ЃÃ|$`8|$hE Ѓ|$ Ã|$|$!ЃA|$(IÃ|$h~]|$|$h Ã|$X`1f1 A^?|$8|$`6|$P Ѓ|$ |$ t|$@|$D!ȁ |$hG|$(!ЃÁ|$ > Ã|$ W|$8Ã|$q|$H|$ A |$ A Á|$H|$ ЃAY|$p|$`!ЃÃ|$hv|$ ЃÁD$h; Ã|$|$(@!ЃÃ|$`I1|$ A |$H!Ѓ|$( Á|$X T|$(F|$ |$h' ЃÁ|$(Ã|$h'|$X!Ѓ|$ !Ã|$Pw1|$hkÁxÁ|$Ã|$hcA!Ã|$$Á|$('|$p Ã|$ |$XÃ|$p?Ã|$`Á|$H!ff.f|$XGawL|$|$  ȃ!Ѓ|$` fA|$|$0|$t  1fAw#A |$A fD|$wQ|$|$h*|$HM|$p<~|$Lw|$Xf Gf.|$` |$HA |$H v|$'l |$ b S |$@|$(8 |$pg1|$ |$(|$X Ð|$(6|$p??1Yr|$@ !Ѓ|$p`8|$@=1|$(I'A|$IC |$>|$F |$`4|$h$ |$X |$ |$P ЃÐ|$(1zA @1|$p?|$pbp1|$h4c|$ |$H8!Ѓ@|$e|$ '|$`6!f|$hMU|$j|$`dA|$ V|$@-|$($ |$h>* @Z|$X. Ѓ@|$(16A5H|$0!ÐD$X|$ YM|$HpIR~|$ @D|$hy|$@ Ѓf|$P|$(!Ѓ|$!ÁfD|$huA|$|$pn|$H3 ~|$uH!Ѓ|$hY!Ѓ|$`d!f |$ 1 |$m|$H1|$(P|$h&|$  fD|$,|$@ |$`/|$pfA |$P|$`( Ѓ|$(!fD|$`|$ t D|$@|$h|$h|$ ȃ!Á|$HA!Ѓf.|$HP|$51|$6|$Kyf|$`zO|$(A |$P|$(@fD|$(=;|$X|$|$X!Ðv=o|$hO Ѓ|$ ЃD|$|$81|$`)|$ 's!!Á|$(|$hST1|$H p|$@`|$`Y|$` fD3 |$@!Á|$(l|$.{1|$P Af|$h1|$|$ |$P Ё|$(M ЃøAN|$ ,!Á|$p Ѓ|$ Ѓ|$! _|$@|$ Á|$Ã|$'/|$h\$1DD$X-.|$ 7!ЃÃ|$|$@5|$H# !Ã|$@ ÁÃ|$ 0Ã|$|$81A4!ЃÃ|$@Wv|$p Ã|$|$!ЃËD$ P1(A|$( à 1A|$L$ÁÃ1A|$`(|$(_|$P ЃÁ%A !Ѓ1O|$(| Ã|$@?|$H!Á|$HT|$  Ã|$4 ЃÃ|$@ Ã|$hËD$@+|$( Ѓ1|$Hg|$(f[|$(TÁ|$|$ |$(=!ÃA Ã|$ s|$X0|$H,]i|$ AÃ|$hn< Ѓ|$ ЃÃ|$x|$ht à ȃ 3|$`" Ã|$X|$h'A|$ !ЃAÃ[Á|$(!Á3Ád|$'!ЃÃ|$ tÃGA A@|$ !Ã|$ Ã3|$h Ã|$ |$@7!Ѓ|$ [!Ã|$ ;F ЃÃ|$` ff.@DwWV|$p1|$h8"|$P|$( ȃz!fD|$@|$ |$XzA|$p|$0ƒ|$|$h|$`"|$( |$`7 ЃDAv|$AYkH|$p/x 1|$ |$h= |$XA !Ѓ@|$wyuMA1!gEV|$h|$ Ѓ1|$ *|$(|$p6 DA=|$p@%|$|$61A |$`/R A Ѓ|$ K Ѓ|$]<|$h(vg^T|$(HvT|$ H|$Xa t@|$  |$HU f|$p3~ |$Xf T@@ >|$`(|$z|$`oLw̃|$|$pH|$(|$H ЃA ~1|$(w|$@|$H:!ЃÐ|$8W1|$PJ|$ v|$( D|$|$=|$p<1o|$hr|$h/!Ё!|$h/]|$pz|$X|$P{|$(|$0 ЃD|$Hn1|$0-|$ GIAD$@.A$|$HA!D|$H!A !|$1|$@R|$pP|$|$`A!fD|$+u|$H(|$X|$p A fDAFA| f.|$pb|$D$H-)1 |$(!Ѓ|$ eAÐE|$@!Ѓ@|$(|$hJA|$( Ѓ|$@ Ð1D:Q1|$h4D|$`7!|$)|$@ |$(1!|$@ *|$(Y|$  |$/|$H!Ѓ|$p. Ѓ@1|$ A|$ |$`(w|$ |$P Ѓ|$p@A|$(P|$Hf.|$P|$h!f.|$h|$@1|$h|$` @1|$|$H|$O Á|$(# f|$ ^1r|$`E|$pE|$!ЃD|$ |$`h Ѓf.M1|$Hv|$H|$X!Ѓ1J|$8|$ Á|$pb|$P!Ѓ|$h!Ã|$`|$X|$(J|$@!Ã|$ A!ЃÁ|$hÃ|$@1|$pH|$(|$=!Ѓ|$ 4!Á|$(I|$p Ã|$ h|$A|$'!ЃÃ|$Ã|$`>|$0|$HÃ|$P|$(!Á-\|$`7|$PÃ|$+E6&(1A|$`H!ЃÃ|$(|$?!Ã|$3|$P# ЃÃ|$hRUA1|$`H'!ЃÃ|$|$p^|$ > Ѓ1|$H _|$(' Á|$h4|$H Ёi Ã|$ Ã|$@!Ã|$8jA|$H6 Ã|$#D$X-g,Ã|$Á|$h|$ s |$@&|$hE Ã|$pt|$)|$P !ȁ!Á|$(2|$FH|$h:Á&%S2!ЃA Ã|$pN|$@Z ЃÃ|$ |$ø |$<A ЃÁ|$(|$  Ã|$PÃ|$(4Á|$(m|$X|$P!ЃÁ(Ã|$@|$`b!ЃÁ|$(AÃ|$@(Ã|$@(|$XF ЃÁ|$f.A|$p4cZ|$`|$h\1Z|$HAG|$P<DD$E|$(!|$|$@.|$ho|$Xo[1|$(y|$h( |$H |$@E ȃ|$( E!Ѓf.|$9|$h-|$ C|$Px|$`?!|$p>)|$n|$   ЃA!Ð|$` |$-|$5|$X1L|$(1|$p_|$4|$h!Ѓ|$pI1 vA|$P9/|$(|$X{ Ѓ|$`) Ѓ|$p A Ѓ|$ $fD|$@wq|$(|$/ fD|$h||$X|$0v|$HKA |$ v3T$8 ЃfD|$`)|$Q|$Hm|$`V1|$E7|$X!f.|$p<|$X,1sA!ЃÐ|$HV|$X ЃA'|$hA#|$|$(E Ѓ Ѓ|$ fD|$|$P"U|$?|$ *||$@!NA |$H!Ѓ1m|$!|$H7|$ 9fD|$@4|$~|$ |$ !|$P1|$X|$pHFsA }|$H!f|$p} Ѓ@|$`9!Ё|$p!Ѓ@H|$H Ѓ|$( Ѓ|$ ЃD|$`V|$HA|$h Ѓ|$(!|$X x|$v`vX A Ã|$PvA|$pw~:|$(|$  @|$`I&D$(-1=F1DA~|$X~6 f|$m]|$8i H|$XE1|$ [|$@+ @|$ Z|$ '|$p7|$PTfD|$HA1 6|$3|$@.L$8 |$H,F|$ Ð1A|$X|$H f|$ |$|$0!Ё|$p!Ã|$ |$HCk1$]|$@*M|$`,+|$(D|$H |$ |$p|$(n Ã.T|$h2|$@!1 |$ }|$(:!ЃÃ|$`+|$ C|$hC<|$H3 ЃÃ|$&|$`$|$p!ȃ Ã|$PA!Ã|$ht$A A|$$!Á|$hÃ|$O|$@:Ã|$X|$p. D$A|$p!ЃÃ|$p|$`Ã|$@#|$H!Ët$ )|$p1|$XL|$(A'|$P|$h$!Ѓ1|$ |$X|$H !ЃÃ|$hlÁ?#ËD$|$o!Ѓ|$`+!Ã|$h>A 4|$@*Ã|$|$`Ã|$|$@Á|$(D Ã|$Ã|$ h Ѓ|$@&!!AÃ|$@|$ g ÁpÁ|$Ã|$h_A  ЃÁEÃ|$`)Ã|$Hd|$P|$( |$`S!ЃÃ|$P wg|$Y|$P!Ѓ|$`+ Ã|$`4|$(  Ã|$hhg|$PA  Ѓ|$`& ЃÃÃ|$@|$XELA|$p5D$`[|$X|$0|$ C!Ѓ|$@!|$5,|$h*|$(A fD|$p@I|$|$p1|$h,|$H !ЃAJ|$|$+L|$@9)z<|$X? |$@'X |$Ð|$e|$h.1|$H|$ '|$7$ Ѓ|$(!Ѓ!fD|$ |$@.*|$|$Hn1|$`Q  |$h{ Ѓ1|$ |$ =|$pH|$@!f1.vg|$pH|$rA y|$HÃ|$8|$h>!Ѓ Ё|$(wu A 1Ð|$`|$h]VA% |$pM|$(j1|$p]~v|$h=r|$@%|$(!fD|$P|$hL|$X/1|$`%|$ dD|$p9|$hM|$`*|$h!fD1|$(|$0|$pc!fDfD|$hhA Ё |$@ E|$XÐ|$|$Hg!Ѓf.|$h!|$X|$ |$h!fD|$@)U|$f|$P|$-fD1A|$P|$H'Ãj|$ ^ ȃ|$ |$p2}|$`C A|$ X Ѓ|$X |$@ 5|$@ |$) @|$ |$H7 Ѓ|$ ; Ѓ|$p Ѓ|$|$|$@|$`( ЃÐ|$A !fD|$+, ЃÐ|$hfD1|$QA  Ã|$0 Ѓ@1|$-|$pmf|$(|$h? Ѓ|$@-1|$(e K|$H`|$p"|$ !Ѓ2|$PkZ|$$ |$(!f.|$ 1|$pc D|$`)$|$ 1|$`|$5|$p|$ |$&|$H& |$HWEÁ g|$p|$`#|$@)!ЃA|$h!ЃËD$H- =|$P  Ar |$|$( ЃA|$(y@A|$)|$|$p|$`1b|$(D|$XL|$H1|$h]|$@#  Ѓ  Á|$HH!Á!o$|$hb Ѓ|$ c!A Ã|$`&Ã|$P'A ȃ!Ã|$X|$1|$H|$(!Ѓø z|$(,|$|$@$!ЃÃ|$P A !Ã|$A ЃÃ|$pe|$$Á|$(T Ã51|$p|$`L|$Ã|$p|1|$|$P |$ Ѓ1A|$@$ ÁÃ|$P |$( Á|$(:1!ËT$X|$( ЃÁ|$P!Ã|$ A1|$p|$(|$(Z Ѓø2!Ã|$@:@|$p!Ã|$(Á|$M!1|$pt|$@%|$ Á|$HN1|$PA|$H|$(!ЃK!ЃA|$ ȁ ЃÃ|$P ЃÃ|$t|$( Ѓø|$(|$hN!Á!Á|$("` ÁÁ|$P!ЃÃ|$|$pg ЃÁ|$HFÁÃ|$ !ЃfDT$A i|$p3DZ1{9|$e|$X2Al!ЃfD|$@$wQ|$p3V|$ 1|$P6|$ AÐAF21|$XCx1|$ZkA\|$(4|$V!Ab|$X2Ad|$`P|$(#!Ѓ|$h!fD|$h.|$@1A|$8R|$(A !|$hA|$`1|$!wq2A |$p01|$PvE|$|$H!DAu |$8fDA.|$p]1|$`)vۃ|$@'|$(|$? ЃfD|$p|$v1v|$(|$H!$?|$5|$` A6Ð|$|$( !fD|$(ze|$ |$X1A|$H|$- fD|$X(D$`A!|$|$@|$(!ЃfD|$ M=Ac|$hBf.; !ȁ|$(w!|$A|$h6 ЃÃ|$ |$`G Ѓ|$ + ЃfD|$11|$`|$( |$Hq!Ѓ@|$h%5|$P Ð|$ |$XU!ȃC|$(Dy Ѓf.|$XaB|$hZ!fD|$p@=TfDA%A%@7|$0|$H|$X/!f|$2}|$H|$(V @|$hyA& fDZSA A1|$hD&A h|$hA Ѓ|$p|$h{f|$({!ЃfD|$(C|$H!Ѓ@|$p>|$`-|$( ЃøH|$@?|$ : Ѓf |$HmA|$`<|$ !Ѓ@,AAl|$H |$@% @|$X|$ J |$X|$P |$pP!Ð1Am|$ 5ef.|$8|$@!|$X Ѓf|$@!O|$@|$@8|$H|$P !ЃfD|$|$  Ѓ|$ Kƒ|$P!!Ё|$p3!Ã|$(3~D|$(!Ѓ1Ã|$(6!ЃÁ1|$;9|$`*) =y|$H= Á|$H1|$ L|$pU|$(|$  Ѓ|$V!Ác|$ 0|$1u|$(7|$@,!Á|$HkÁ|$h@|$X4|$ G|$H |$( |$@6 !ЃÃ|$`O|$P ЃÃ|$h7!Á|$(|$`5 Ã|$Á|$X1|$|$@"u|$@|$P!Ã|$h Á|$pU|$@Ã|$(4*|$ Ѓ1|$ Y|$hJ Á !Ё!ЃÃA!Ѓ|$P„|$h,D$(=>Á|$HA%{|$ht|$P1|$W|$p|$H!ЃÃ|$`;wb{à |$ C à |$@!Ã|$paÃ|$@  Á|$XS|$Ã|$ ÁÃB|$`!ЃÃ|$`#|$H Ѓ|$ ( ЃÃ|$Ã|$@-Aff.A|$pF+|$T$@|$H Ã|$|$p7|$@<|$X |$8!Ѓ|$P!fD|$Q|$(|$h.|$XU|$ 7|$`%|$ ЃfA*2Q A  Ѓ|$,!@|$ Zu|$p=ZA|$X A1|$`#|$ |$ ЃD|$ |$`V|$X Ѓ|$ 6 Ѓ|$W!6|$(/ |$ |$h2R|$X|$p1|$`Ew|$@ fDL|$p1|$h9W@-Ð|$|$X|$(N|$ A!ȃ Á|$(*1A|$p|$H |$D|$P|$`{ ЃA1|$|$  |$(`|$pS 1|$H-W|$}|$(i|$|$ A 1|$ |$h=|$|$@|$ 8 Ѓ|$X|$Xr|$|$h|$( !@|$X-} $|$H |$H J|$ |$@, ЃD|$Hz|$(!t|$` Ё|$( Ѓf&|$HpC!f1|$p<|$@A Ã|$ % Ѓ@|$h4A!f.|$P |$|$Ð|$|$P$|$|$@' ЃD|$p|$h!Ѓ&!Ѓ@|$p@ ||$@|$p fD|$A Ѓ|$Hl|$(/A|$(R@1D|$h1|$"|$@!Ѓ|$h!Ё|$X@!Ѓ|$H @|$H|$|$h @|$(@1|$yy|$`*b|$@$/|$(A  |$Hq,|$'$|$hV r|$` !f|$ t|$@D|$@$A u |$`9f.-|$@|$`K Ѓ@|$h+|$`(A Ѓ|$@ P|$P!ЃD|$ 1|$(N|$!|$P f|$h(|$@*|$n!Ё|$(e!Á|$( |$`Q!ЃfD|$P|$@|$`r|$ht|$ Ѓ@|$|$|$pV-D|$!@A|$PA|$P!Ѓ!Á|$(|$pa|$@'!A!Ã|$^:|$(=Ã|$K|$ Ѓ|$@ !Á|$HÁ2QAB|$hV|$.A 2|$`& o !ЃA Ѓ|$ Ѓà 1|$.D$@,Ã|$Q|$(@ !Ё|$He!ø|$|$`5!AÃ|$P.|$_ Ѓ Ã|$ D16%|!Ã|$@.|$(!Á|$(Dd A' Á|$p|$`aA|$ !ЃÃ|$ 6A!ЃÃ|$=|$`!ЃÁ|$H$   ЃÁ|$(1|$ ЃÁ|$pTÃ|$ B!Ѓ|$p |$X |$h:|$( ЃÁ|$H/|$|$(!Ã|$@A!Ã|$p4|$`-O4 Áq!Ѓ|$ D!ЃÁ|$( |$p!Ѓ|$ !ЃÁ|$(|$ q|$ ЃÃ|$ W |$@|$('!Ã|$@-|$pxÃ|$pZ|$P!ЃÃJ|$X(!ЃÃ|$p'EÁ|$({A |$ ЃÁ|$H|$@ Ã|$@|$HAA  ЃÃ)Ã|$wU|$(|$H w` Ã|$pB9Á*|$H |$p ЃÁÁ|$H4|$h/!ЃÁ&ÐDT$XADQ|$|$`AC|$|$|$A-|$h"|$I|$h;,A}1A !Ѓ@|$hM|$@ 1|$|$p=|$(g|$P|$({A ЃfS1A[|$(9AA1A 5|$pH|$!Ѓ|$HA%|$h]S!|$(2|$pU?|$h+:1|$ ` |$p_!ЃfDA1|$H(n|$@vO|$(w<|$(!ЃfA 6|$j AN1|$HwV|$h|$ !>|$(F|$h !1A~|$( !ЃÐw|$HT|$pJY|$@|$ .A!@A|$ |$H|$@|$h$ Ѓ|$p8|$@7|$hgA@|$h/wY|$P|$@'!Ѓf.|$@!Ѓ@|$H @|$p e9A^#|$`:|$@4|$ A |$!Ѓ6ATb|$@" A Ѓ!@|$@9!|$`=5t$Hu ȍe ȃ!|$h% @|$pj|$@ |$hr|$!|$H @A|$@ ЃA A/ Ѓ@|$ _ @A||$ :@@||$pbyD$ U|$|$ Ѓ|$h!-f|$(|$@Au|$`& f.|$V|$@$ Ѓ|$ H1fDA!|$hYA$ ЃÐ;1fDA @@V@ƃ|$p*@>|$P3|$ @ |$(|$ ? ЃfDA1|$hV|$3<|$H|$@|$hC Ѓf|$H@|$(b|$HR|$ C Ã|$ |uADA(!ЃÁFJ|$}!Ѓ|$`/!Ã|$ |$P!Ѓ|$p!1|$ ^;|$Hd |$`4|$ L!Ё|$p!Ѓ1|$`pA!ЃÃ |$|$`* Ãwp|$pÁ|$(  !ЃÁo|$`.Ã|$pN1|$8|$hu|$`&d|$:Á|$p|$0A A7Á|$(K1|$hc|$4Ã|$ `|$H A Ã|$@E`A|$8"|$`|$@0A`vK|$@ A fD|$=|$ 4|$H; ЃÁ|$h|$.|$0!ȁ!A!Ё|$(^!Ã|$` Ã|$i|$`E A ЃÃ|$pT Á|$(8A"!ÁÃ|$@|$ # Ѓ|$h# ЃÁ|$H!A!ЃÃ|$8wO|$|$p Ã|$@!ЃÁ|$H |$ Á|$(Á|$HwkAj|$/wv|$o|$hB?|$H|$ Ã|$8o|$  ЃÃ|$~A0|$|$ Y ЃøÁ|$HÁw A Ѓ|$ Á|$H|$@!ff.|$([~|$p@|$X?A|$ |$2 f|$_ |$ 0 |$(!@A :D|$+|$h|$!|$|$p@|$@<|$P<A1|$X-  D|$ |$h(|$X/|$`L|$Y1:NAw|$h%9r|$ &!ЃD|$HZ1|$@}A * @A|$`7"|$hU|$ |$H|$ \A 1|$X|$|$`3vA~Ё|$H;  1|$`cAq|$`v^|$Xff.1|$HZ#w|$pڃ vA~ԁ|$(r |$ P!ЃfD|$ A|$'A f|$H|$h.'|$H91|$pQ>|$`- Ѓ|$ Ð|$U|$h>:|$pcA !Ѓ|$`.!Ѓ|$ |$X8r|$)_A|$p6|$H1|$`xX!J |$h0 |$P$|$2|$h2!|$HI|$P$ |$H |$@!Ѓ@|$ A|$h(|$(|$ J ЃD|$@DD$`|$"Ã|$n|$h\z|$`X Ð1|$(U|$( |$0!Ѓ.,|$`8 |$|$` Ѓ|$pgƒ!!|$`|$@>!ЃfDD$H-Vk!ÁA A ЃÐ|$X 2|$|$ Ѓ|$0|$phAD/d=|$HZU|$|$@ Ѓ|$`% Ѓ|$A#|$|$P Ѓt$8|$@ |$|$Xi>|$h> fD|$|$<|$pOA!ЃD1,|$( f1|$p^|$pi|$h|$I!|$X 1|$T$(y|$H |$!Ѓ|$!Ё|$(!f.|$|$@)@|$ d|$X  |$8  Ѓ|$X f1|$h|$H!Ѓf|$hL|$(A  Ã|$hÃoÃ|$Ã|$@0|$p4 S|$8^|$H|$  Ã|$pHJÃH-|$p'|$X Ѓ|$@!Ã|$XA |$`1|$hn|$($fAÃ|$1|$u|$`a|$ Ã|$ DH|$P|$ ЃÃÃJÃ|$@/4u!Ã|$(NÃ|$ |$Xo Ѓø|$X!|$H_|$@ A Ё|$( Ѓ1|$ z1An|$|$(Ã|$ x5|$H-|$4 ЃÁ|$X+ |$H1|$hN!Ã|$|$(  Ѓ|$(*!Ã|$@9|$p5|$ |$; Ѓ|$ Ѓ|$H |$p|$(!Ѓ@|$hSw]|$h>A Ѓ|$@( Ã|$(Ã|$(|$H ЃÃ|$`4Ã|$@:|$ !ЃÃ|$|$(Ã|$P?Am Ё|$( ÃÁÃ|$|$H!ЃÃ|$|$@|$(NA A]h|$`!Ã|$pxÃ|$A ff.@AWAVAUAATAUSDH$Dt$`|$DL$PD$ W$Q$V$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQDD$|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$DANj|$tHpW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpAW$V$R$Q$V$RDD$8AP$AQ$V$R$Q$V$DR$DQD$D|$tHpDDDAW$W$W$W$W$WDD$8AP$AW$W$W$W$W$W$WD$T$|AE A9HĈ[]A\A]A^A_GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0GNUzRx 0 D X lV S j EH C z V \ L d D u K D L d \ U K @ H E K k M u [ i G { U g Y l T F J I G n R a O Z F s M a O a O m S E K T L _ Q h X W I P P ] K F J e S o Q H H F J E S w I T T F J s M Q O j N [ ] C E C U E K R N C A C A C A F A F D G D E O I R Q F I D _ G P I ~ O K A ] O D D D P F L X F Q F d D E D F D a O y P a F D D N F G D E M R F N I G M _ P F D C A C   , @T\ h | _   FBB E(D0C8GPZXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKK[PAXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPDXJ`HhHpHxHGKHHHHKKXPMXH`HhHpHxHGKHHHHHHk8A0A(B BBB: b ) 6V0E@S *@`S Rmj z{Љ    Bj\   _ < f av1_asc_tree.cpp_ZN4aenc9SCDetect1Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect2Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect3Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect4Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect5Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect6Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect7Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect8Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetect9Ejjjjjijjijjjjjjjijji_ZN4aenc9SCDetectAEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectBEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectCEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectDEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectEEjjjjjijjijjjjjjjijji_ZN4aenc9SCDetectFEjjjjjijjijjjjjjjijji_ZN4aenc10SCDetect10Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect11Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect12Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect13Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect14Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetect15Ejjjjjijjijjjjjjjijji_ZN4aenc10SCDetectRFEijjjjjijjijjjjjijjjjh_GLOBAL_OFFSET_TABLE_e   ! ! +""G##c$$% &&)''E((a))}* 4H\)p60E@S@`m{Љ0DXl.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.note.gnu.property.rela.eh_frame @*@`: &*,*10*,:+J+ b8+]@X< 3  6h>lav1_asc.cpp.o/ 0 0 0 644 88512 ` ELF>N@@-,#$AWAVAUATUSHH|$H?H4$H6ffAAAӁAfAEzAAD$AfAn1fD$Ef8%D$AD$IfD$ID$AD$fD$D$AD$fD$D$AD$fD$D$AD$fD$D$AD$fD$D$AD$fD$D$AD$ fD$D$AD$ fD$D$AD$ fD$D$AD$ fD$D$AD$ fD$D$AD$fD$D$AD$AHT$HD$foT$HcHXH L,LL9AHI9A<fA11fof80fsf80fffffffffgA HL9ufE9D$AHcD)f=AO1fHfD9T$rD$HcD)f=AOfHfD;T$DD$HcD)f=AOfHfD;T$D$HcD)f=AOfHfD;T$D$HcD)f=AOfHfD;T$D$HcD)f=AOfHfD;T$D$HcD)f=AOfHfD;T$^D$HcD)f=AOfHfD;T$0D$ȍHcD)f=AOfHfD;T$D$̍HcD)f=AOfHfD;T$D$ԍHcD)f=AOfHfD;T$D$؍HcD)f=AOfHfD;T$v|D$HcD)f=AOfHfD;T$vRD$HcD)f=AOfHfD;T$v(D$HD)fAOfHшfA9H$H0HD$H0H[]A\A]A^A_DHL$AH1D)fAOfHшHH9uff.AWփAVAUATUSHT$HcLD$LL$H|:L$HӍ t$HcH)H\$HcH6HcH\$H $HHL$)HcHL$HHL$)HcHL$HHL$ع)HcHD$HHD$HH)HH3Ll11fT$D$D$D$H$LHD$LHD$L HD$LHD$HHD$HHD$HD$HHD$HD$HHD$HD$H 1fD$AAAA)DA1A)_AA)EDDDw1E)A*A)DAD1D)EA)DAD1D)E$/oAAA)DA1A)ljD)AAAD1ED)ED4GAA)A)DA1D1)D)Dd7DD47B,;A3EA)DAD1D)EE)EAE1E)D$+l7A2AEDAA)DAD1D)AE)EAE1E)DDd7AEEAA1A)DA1A)D)AE1)AA0B,8D7AA)DAD1D)D)AAD1D)F$3H\$D2EA)ZDA1A)D)AE1)C'L|$DbA/EA)DA1A)DD)AAEAD1D)AZAHD$A)DA1A)ƉD)AAEAD1D)ED$(B)A)A)DAD1D)1)B\5Lt$DD$2A,6EA)EDEAD1D)Dt2E)EAE1E)D|\2AEAHD$0)ʼn1)ʼnD)AAD1D)Ld$DE$4DDt2EE)EAE1E)EA)ADAD1D)EfD$LLl$MMLl$MMA,1Ll$LD2LAD)A)DAD1D)AAD1D)D|$D|$McL|$DfC,wHl$fBDul$l$;l$yfD$H|$D$;D$H[]A\A]A^A_AWAVAUATUSHH$D$L$L$dH%(H$1$DŽ$DŽ$DŽ$$DŽ$$D$D$DEGD$ foD$PDD$foAHcظOA)IH\$0E1E1Dt$ E1ɉD$TEHHD$8ȃHD$XL$dHL$lHL$tHL$|H$DE)ى$ȉL$L$HHHD$@J\HH$L$`HL$hHL$pHD$\L$xH$1ɉ$1$bMcOTMJNN$J,IL9AI9AIE L9AM9AE E$ffEL\$8E1fofAofDFoLCo$fAofDofA83fsfAsfD83f83fE83fffAfAqfAfrfAfrffAffqfAf8+fDBIM9mfAof\$XfsfofDfsfAoffsfofDfsfAoffsfDfofsfEfDfofsffofsffDDfA~E9\$TEl$ McFWFVCF<DEADfFR؋\$d9rEMcFWFVCF<DEADfFR؋\$l92EMcFWFVCF<DEADfFR؋\$t9EMcFWFVCF<DEADfFR؋\$|9EMcFWFVCF<DEADfFR؋$9~sEMcFWFVCF<DEADfFR؋$9~4EMcFWFVC8F<DEAfFRDD$ \$ 9$LD$0IcH\$(IKlONL,/L$*JIM9D$PI9AHD l$PI9@M9AD A l$ ffEHl$@E1fofAoFo Co$fAofDofA83fsfAsfD83f83fE83fffAfAqfAfrfAfrffAffqfAf8+fDCIL9nfAofD\$HfsfofDfsfAoffsfofDfsfAoffsfDfofsfEfDfofsffofsffDDfA~ED9\$\$\EMcFWFVCF4DEADfFR؋\$`9$EMcFWFVCF4DEADfFR؋\$h9$FEMcFWFVCF4DEADfFR؋\$p9$EMcFWFVCF4DEADfFR؋\$x9$EMcFWFVCF4DEADfFR؋$9$~xEMcFWFVCF4DEADfFR؋$9$~4EMcFWFVC0F4DEAfFRDD$PD$D$\$;\$|$PD$D$D$ |$ D$ $$\$9$ EAD$foAED$ ED$foEAAAEODt$DDD$0AIDK\$8DL$\DKDL$dDKDL$lDKDL$tDK$DD)LD$H\$PA؃\$(DADL$|EDsIDt$XDsMcEODt$`DsE)Dt$hDs\$TDt$pDs$K\ LT$ H$LD$@E1Dt$xEE1$sMcOLMNNJ, JIM9AH9AIE M9AL9@A E$ffELT$HE1fofAofDFo Co$fAofDofA83fsfAsfD83f83fE83fffAfAqfAfrfAfrffAffqfAf8+fDC IM9nfAof\$8fsfofDfsfAoffsfofDfsfAoffsfDfofsfEfDfofsffofsffDDfA~E9\$0EL\$McFOFNEEEAAEfFJDDL$\EADD9EMcFOFNEEEAAEfFJDDL$dEADD9<EMcFOFNEEEAAEfFJDDL$lEADD9EMcFOFNEEEAAEfFJDDL$tEADD9EMcFOFNEEEAAEfFJDDL$|EADD9~wEMcFOFNEEEAAEfFJDD$EADD9~5EMcFOFNEEEAAEDfFJEADD$\$9$LD$ IcH\$IK\O N L$H,NIM9D$ I9AHD d$ I9I9@ A\$PffEH\$@E1fofAofGo Co$fAofE83f83fsfAqfAfD83foffsfAfAf83frfAffAffrfqffDf8+CIL9qfAofDL$PfsfofDfsfAoffsfofDfsfAoffsfDfofsfEfDfofsffofsffDDfA~ED9L$(\$TEL\$XMcFOFNG8G<EEAADEfFJAD9$EL\$`McFOFNGG<EEAADEfFJAD9$`EL\$hMcFOFNGG<EEAADEfFJAD9$EL\$pMcFOFNGG<EEAADEfFJAD;$EL\$xMcFOFNGG<EADEEAAfFJD9$EL$McFOFNG8G<EEAADEfFJAD9$~9ELMcFOFNG:G<EADEEAAfFJDD$ D$D$\$9$|$ E|$DDH$E9DH$AN։|E$$9MD9DMEDN9H$ND9O)DkdH$dH3%(H[]A\A]A^A_Ld$(L$MMDFFDEEAEDfFIM9uHT$ T$ E1@FT]G$XEEEAAEDEfF[IADD9HT$ DHl$H$MHDFF EEAEDEEAAfF IDI9uHT$T$E1@F SC,PEEAAAADAfG SIADD9HT$E1|$H$1H$E1DŽ$|$ DŽ$\$9$H$1H$E1DŽ$11DŽ$f.EUSEA@DffoDH1II@oo fqfqfo f8fofqHfqff8fL9ufoEfsAffofsffofsffofsfffofsffofsffDA DD _,ZAA)DA1A)ED ^YAA)DA1A)A[DA9D _,ZAA)DA1A)ED ^YAA)DA1A)A[DA9{D _,ZAA)DA1A)ED ^YAA)DA1A)A[DA9*D _,ZAA)DA1A)ED ^YAA)DA1A)A[DA9D _,ZAA)DA1A)ED ^YAA)DA1A)A[DA9D _,ZAAA)DA1A)ED ^YAA)DA1A)DE9v;B<_BZB Y)1)AB^)ʉ1)EHT$DHT$ []f1E11E1ff.@fAWAAAVAAUATUSEAHEA11ED$1fEt[E1fDAIBM9tCIFF<LE)LHA|A|NE~YA cAA IBM9uDLLA9uHD$8H0HD$@H[]A\A]A^A_AAzfDAAjfDAAZ11AWAVAUATUSHt$DD$EZAͅOLcHME1HD$CHHD$@E'Hl$E1Hl$HHAE1fN)‰1)G)ȉ1)ȍ VG)Й1)ЍFO)1) NW)ʉ1)ʍ VG)Й1)ЍNG)ȉ1)NW)ʉ1)LLAALfE9sHD$8fEEDHD$@D0AHE9Ht$AHt$D9t$[]A\A]A^A_f. z9~u9f.ttt1H71fHH1AWAʍ AVHcAUL\9AzATUSH`T$|$ rLÉt$rLcЃt$HLHc҉|$K<H)LH|$H4$H)J4HT2HT$LH)HT2HT$LcHLLD$PHT$H)LD$IHLcHLLL$@HT$8)LcHLLL$0HT$()Hc1HHD$ LfT$H)H|$LL01D$ L$HD$1Dl$Hl$Ld$I1DfA80;fC80#ȃfA80sfA80KHfofC80\#fG80tffA80SfC80df8fofEofG80<fqffDfD80Rf8fofD80"fEoffEofD)l$fofAofEoffAfE8f8fofAofffEof8f8fC80lIfqfEfE8fE80|fDfof80jfE8ff80bfE8f8fDfAo)t$ffqfA8fE80tf8fqffqfqffofAqfffA80dfAqfT$)l$fAqfAqfB80,fqfqfEHfofAfEfAf8fEfD8fofAfAf8fEfD8fAqffoD$fAqfqffqfEfEfffd$fAfEfAfDfAffAfAfff8f8f8+fA:D@fA~@f:Cf:DCD9`9D$L$HT$Dl$Hl$Ld$LfA80;fC80#ȃfA80sfA80KHfofG80tfC80\#ffofA80SfG80<f8ffEofD80Rfqf8fDfD80"fofofAofffEo)d$fof8fC80lffDfEof8fDfC80dIf80jfEofE8fE8ffEfE8fE80|f8fAofE8fqfqfAfE80tfofqfff80bffq)|$f8ffAoffAofT$ff8f8fAqfqfqfEfofAqfffAqfEfA80d)l$fAqfqfB80,fEfEHfofAffAf8fAfD8fofAfAf8fAfqfqfD8foD$fAqfAqffEfEffd$fAfEfDffAfAfff8f8f8+fA~@f:CD9s9D$M|$D$ft$LD$|$H|$PH\$M4;H|$@LM<;H|$0MI,;H|$ HI;H|$I ;H|$HLH|$H|$8LH|$H|$(LH|$H|$LA+AAA)DA1A)AkAA)EEDEsAD1ED)E E)EAE1E)EA)ADAED1D)G,'EcEA)DA1A)DD)AAAD1ED)ED4(AC*AD)AA)ADAD1D1D)D)GlDG4Fd=B,EA)DAD1D)EE)EAE1E)Fl%GdC,AEDEA)DAD1D)EE)EAE1E)DGlAEEABA)DA1A)DD)AAEAD1D)AB,F$8CDAA)DAD1D)L|$D)AAD1D)Fl5D1A/DEA)iEAE1E)EA)ADEA1A)C,/DiAEEDLd$E$$E)EAE1E)EE)AEEAE1E)AAiEAAHD$A)DA1A)ƉD)AAEAD1D)EF, AD'A)E)EA1E1)E)L|$AEDF,C,4G$EEE)EAE1E)FtAE)EEAE1E)E<,Ld$BlAEACAA)DA1A)ĉD)AAEAD1D)Ll$EGlDFtEE)EAE1E)EA)ADAD1D)EfD$MLL$LMLL$LLEF$LL$LBDLAD)E)AAEAD1E1D)E)Dt$Dt$AMcEELl$Hl$fGdufBDuDt$Dt$D;t$BMHfD$L$|$;|$H`[]A\A]A^A_11ff.AWAVAUATUSD~DD$LcLL$JB~ GLcJMIB @HBL)K<@~HB~N,HcIE1OdHfDoK,fDofDoHJ\fDoHNHD$OMАHD$Lt$1o,AoΉAodAo)footfDofA:BfDofDofA:B)l$)T$AofoAo,fA:BfE:BfA:BfofE:BfA:B)L$fE:BAo fAfA:BfAfAfDofA:BfA:Bffod$)|$fd$fA:Bfd$fT$ffofE:BfA:BfA:BffA:BfffAffff=HLt$HHfA<6f8Aff9s HD$f0fH|$8HD$@D8H9yLt$AMMMLLMMMD9|$=[]A\A]A^A_fAWAVHAULl8ATUS^HLD$xT$@\$DRVHcD$,MT$ff.AWAVAUATUSHcމHLl;zH(T$ Hcи)LD$LcLL$DI)؉\$$LcDL$|$HT$LD$L\$EHE1HfDd$H)HHHD$HHHD$HHH|$HLH|$HLH$)HHD$HHD$HH)HL\1D$ l$D$,HD$E1D$fDT$MLHD$MDHD$I|HD$ItHD$ITHD$LHD$HD$LHD$H$LHD$HD$ILfAEEAAE)EAE1E)EUAE)EDEEuA1EA)A(AA)EDAD1D)EA)DAD1D)E$/AmAAA)DA1A)ljD)AAAD1ED)EF4AEDA)E)EA1E1)E)EdAEDEtC,:EEE)EAE1E)EE)AEEAE1E)E$*AlEAEDAE)EAE1E)AE)AEEAE1E)EEdAEEAA)DA1A)D)AE1)EDB,8ADAE)EAE1E)L|$AD)AEAD1D)G$2D2EDD)DRAA1A)DD)AAEAD1D)G'DbEHl$mA)DA1A)DD)AAEAD1D)EDREHD$A)DA1A)DD)AAEAD1D)ED$(B)AD)AA)ADAD1D1D)D)L|$DD$FT5A,EEA)DAD1D)DtE)EAE1E)F|Hl$DTAEADD)ʼn1)DD)AAD1D)Ld$DE$DDtEE)EAE1E)EE)AEAE1E)EfD$MAL\$MMEL\$LLA,L\$LADLAD)A)AADAD1D1D)D)Dt$Dt$McDLd$DLT$fC,tfCrDt$Dt$D;t$PLt$AuL|$EMCD5Hl$)lj1)AE)Də1)CT=)1)D)AЉʉE1)B 0AEAt-D))1)1)IEUEM<DCT5)щΉ1)D։AU)ɉ1)D9Dҍ4CD=)lj1)DD)ə1)D0AEAt-)D)I1EUEM)1)<DCT5)щ1)DщAU)1)D>Dҍ CD=)lj1)DD)Й1)DƍAEAL-IEED))ω1)1)<1DCT5)щΉ1)DƉAU)ɉ1)A}҉CT=)AAD1D)ʉ։D)AAD1D)AL-AEA)A)ɉEDA1D1)|$|$D)HcLl$Ht$fD$f ~HL$fyD$;D$D$ D$D\$D$E2|$$1)HcHcHCH)HL$H,XHD$I|HD$H|$LHD$IHD$LHD$IID ILHD$I1fD$4HD$LHD$HD$LHD$HD$LHD$HD$LHD$E]EMD)‰Й1)DAAEE)AЉAD1D)EA$A)DAD1D)ADD)EAAD1D)GEEEAA)DAD1D)ADD)AAD1ED)ED AEAAD)AA)ADAD1D1D)D)DD FEA)EDEAD1D)DQE)EAE1E)DDAAEEDEE)EAE1E)EEE)AEAEE1E)AAQEEAAAA)DAD1D)AD)EAAD1ED)FAEAE)EAE1E)A)ЙE1)C D EDLD$EXE)EEEAE1E)DTAE)EEAE1E)ETAEAAHD$XA)DAD1D)AD)AAD1D)LL$Et$E YHcEDDTEE)EAE1E)EA)ADAED1D)ELD$EXDAD)E)AAEAE1D1E)D)AEELL$HT$fD$IfEqHIIfrIt$H;t$B|$$-Hl$AMLd$LL$AD-)ljϙ1ЉAE))A}1)ЉD$CD%)‰)AЉAACD D1LL$A1D)A)AMAAȉA)DAD1D)AA)EAE1E)AEED-D)AAD1D)AC|%A)A؉AD1D)EEAC| DA)1)߉D)AAD1D)|$A|-)1)Hl$ACL%EA|-A)DAD1D)AAM)1)D)AAED1EۉD)EDEDEljE|$EADD|$DCTuB4BAxыT$H|$T$HcfWHD$f PH([]A\A]A^A_LL$AuHl$Ld$CD )lj1ȉAE))A}1AAD-A)Ή)AAȉAD1)D)1)Ct%D$AEA)A)DAD1D)A1)AIDM8B4AAA)EDAAD1D)ApA)EDAD1D)D@t$4(EA)DAD1D)AD)ADL$1)B< t$pHAD)A)ADAAD1D)D1D)A8AB4(AAADA)DD$EDAD1D)ApAEEAA)EDDAD1D)D@AHt$DA40Dl$)AىAD1D)AD)A1)H\$ApL$AD))É1)؉1)މEAEىDEEDA|$DΉϋ|$ЉD|$D|$|$DADAff.HtH8 11Høf.SHAH^"1ǃ8 HH^&HǃV")HHǃN&V&H^*HHHHǃV&HǃN*)H^.V*HHH׉HǃV*HǃN.)V.H^2HHHHǃV.HǃN2)H^6V2HHH׉HǃV2HǃN6)V6H^7HHHǃV6HǃN7)V7HH׉HǃV7Hǃ7H)7HǃD"HǃH"D[fHtf1GG G0øÐf.ffHGfG8HG\LJHLJHLJHLJHLJGO(G<GLOdOtff.ATLgUSHHHH+HL9u1[]A\HH8 H1fIH8 I8"HH9uI^"D1Iǀ8"HfAT"1I^&)HIǀ@"V&IǀH"I^*AǀP"IǀV"IǀN&HDHIǀV&IǀN*)I^.V*HHHDIǀV*IǀN.H)V.I^2HDHIǀV.IǀN2)I^6V2HHHDIǀV2IǀN6H)V6I^7HDHIǀV6IǀN7)V7HHIǀV7Iǀ7HA)A7HHÐf.AVAUATIUS0 HD D , 0 , DA, $ $ ( (  A$  A$ A$ D"A$D"H"A$H"L"A$L"T"fA$T"8"A$8"<"A$<"@"A$@"P"fA$P"R"fA$R"AIDŽ$ IDŽ$ LLHI$ tH8 I$8 MtsHV"I$V"LHV&I$V&LHV*I$V*LHV.I$V.LHV2I$V2LLHtHV6I$V6uF[L]A\A]A^f.HLA$, A$$ A$( HV7I$V7L[L]A\A]A^Ðff.foHHLJ H( 1HLJ LJ0 @H  fHGHfHfHnHGflGHG(HG0HG8HGXHG`HLJHLJHLJGOHGhGxÐff.HG fo@Hfo@fo@ fo@0ff.SfoHHG @foH8H@(@0@u 1[DHC [H8f.SHG(HH8uHC(Hxu1[1HS([H<USHHG(HhHtHH7HHC(H(Ht%HHH7[]f.H[]ÐUHSHHGHxHt81LMtLǾHEHxHHuHt HEHh8Ht%HHH7[]f.H[]ÐfHG(HLJHLJGÐ@ATHfoUHSH_C@HCDHC C(C0CHC7HIHEL`8HxHEtHx[]A\@Hx8u []A\fDHE[]A\Hx8HHff.UHS1HHG(H<HE(H<u8HE(HHHǂ7ǂ7HuH1[]H[]@HG@(HHLJHÐfD~w41Ðf.?~w81Ðf.G4~9w<1f.f.HG x(t H01҅‰P0@AUAATAUHt ]A\A]DHuDH]A\A]HG p(@,tD1҃t%H HLJHP01fD@,f.HHLJH1҉P01fAWAAVAAUAATUHSDHHG`D$PHWhD$ H@ %Gd ~fH:"Gp~fH:"~fH:"H8HE @IHI$HE(7HIHE(7L HIHE(HL`HEHDDDHtrHDDD[H]A\A]A^A_~fH:"Gp~fH:"~fH:"]@HDu DmHtH[]A\A]A^A_HHu$t3HH[]A\A]A^A_DH[]A\A]A^A_DHuC\$ E0E3HEVCtJAV1 tB|$ AVC uHHHH[]A\A]A^A_HH[]A\A]A^A_HHƸHHHff.G3ÐfDATIUHSHt&<u"ID$(HH 1[]A\HG@p@ÐfFwHGp@1f.fSH(HtH{(HtHC(H{t#HH{Ht HHCH{ Ht&LMt#LǾ@H{ Hu HC [8ff.AW1AVE1AUMATUSDd$8l$@AHt$DD$@Au AA1AAAAT$1E1E1It1McHt$DD!E~9A4At$KLLD$LHt$HLֈQI9uAA\$HA9u HD$Pf8[]A\A]A^A_1f.HIcLW LO(HIMQM IT"ARDPARDPARPH(ÐHIcLW LO(HAIMQADEEM IT"D\$ARDPARDPLARPH(ff.AUATUSHHHw(dH%(HD$1HG HnHD D PHD@HAAT"DT"H H$HGx0uA)DfD1)fHH LV"DDLV& H<$SpHC(H@AUATHL"HV2HV"HV&LD"LH"SxHC(ZDY DH@H<$LV*LV.1HT$dH3%(uHH[]A\A]Hp8H t(H HEEShHC(H@ff.@@BHH#9ÐAWLV"AVAUIHV&ATIULSLHL L LދD$PDI0AǀA@Ht$ L\$PD$0LT$)ʍ,LT$XɉI(AWAVDAUAATAUSHHHoXLPdH%(HD$1I9IfAxxAAFf5fEti11E1E1Aw@t+I9w1HL$dH3 %( H[]A\A]A^A_H1I9vHIMI9IFʃfteL9wLsHHH$LH4$Ht`LfEkfAxxAFE111E1I9sAfE9EGAH91H9!&@HL9tIHmHkXLLI9uz11E1f3tSH21[DfUHAWIAVAUATISH8HuH]HH} HE0HH bHfHnLLHHHdH%(HE1HbAfH:"H8HDž8HDž@H(HHHPHDžX)pA$ IOA$T"f+T"f1)fCHIG IDŽ$8"HcM(ADŽ$@"HHHHыy0E1I,1DžfDDžDž fAAfDE1Dž ύ L6H0HDIALLPAA6DDY fff^ɍHIH$;$~'H$;$~H$fAHA95H$ H$HfT"H1HHĸH[]A\A]A^A_1fDDFDDA9|{1땐fD3UHSHHG(HHH77HHHtHHDHDU4M8E1RDE  k]  )  PG    Й  &  "  @GB  m  b     -   N  Gp  p  &     `  !  '=  Т   1  0l  8  Y  z       `.; e     + Y @v ` #  Ь "  D 0 j P#    D x  @  `  ) 0 #[     $6 !}  @, py 2 0- `- K к"Aq"A""Ucr  p."L|":" lek    < 6av1_asc.cpp_ZNSt17_Function_handlerIFbSt4pairIjjES1_EZN4aenc3ASC14MotionAnalysisEPNS3_14ASCvideoBufferES6_PjPtS7_S7_S7_S7_NS3_9ASCLayersEPfEUlS1_S1_E_E9_M_invokeERKSt9_Any_dataOS1_SG__ZNSt14_Function_base13_Base_managerIZN4aenc3ASC14MotionAnalysisEPNS1_14ASCvideoBufferES4_PjPtS5_S5_S5_S5_NS1_9ASCLayersEPfEUlSt4pairIjjESA_E_E10_M_managerERSt9_Any_dataRKSD_St18_Manager_operation_ZTIZN4aenc3ASC14MotionAnalysisEPNS_14ASCvideoBufferES2_PjPtS3_S3_S3_S3_NS_9ASCLayersEPfEUlSt4pairIjjES8_E__ZL15et_tab_killmask_ZL14et_tab_twostep_ZN4aenc15ASCTSCstat_InitEPPNS_10ASCTSCstatE.cold_ZN4aencL9PDISTTbl2E_ZN4aenc3ASC12VidRead_InitEv.cold_ZN4aenc3ASC4InitEiiijbj.cold_ZN4aenc3ASC14MotionAnalysisEPNS_14ASCvideoBufferES2_PjPtS3_S3_S3_S3_NS_9ASCLayersEPf.cold_ZN4aencL8lmt_tsc2E_ZN4aencL7lmt_sc2E_ZTSZN4aenc3ASC14MotionAnalysisEPNS_14ASCvideoBufferES2_PjPtS3_S3_S3_S3_NS_9ASCLayersEPfEUlSt4pairIjjES8_E_.LC0.LC1.LC2.LC4.LC5.LC6.LC7.LC8.LC9.LC11.LC12.LC13.LC14.LC15.LC16.LC17.LC18.LC22.LC23.LC24.LC25.LC27.LC28.LC29.LC30_ZN4aenc12GainOffset_CEPPhS1_ttts_ZN4aenc14RsCsCalc_4x4_CEPhiiiPtS1__ZN4aenc16RsCsCalc_bound_CEPtS0_S0_PjS1_S1_ii_GLOBAL_OFFSET_TABLE___stack_chk_fail_ZN4aenc15RsCsCalc_diff_CEPtS0_S0_S0_iiPjS1__ZN4aenc20ImageDiffHistogram_CEPhS0_jjjPiPxS2__ZN4aenc25ME_SAD_8x8_Block_Search_CEPhS0_iiiPtPiS2__ZN4aenc17RsCsCalc_4x4_SSE4EPhiiiPtS1__ZN4aenc28ME_SAD_8x8_Block_Search_SSE4EPhS0_iiiPtPiS2__ZN4aenc18Calc_RaCa_pic_SSE4EPhiiiRdsqrt_ZN4aenc15Calc_RaCa_pic_CEPhiiiRd_ZN4aenc23ImageDiffHistogram_SSE4EPhS0_jjjPiPxS2__ZN4aenc23RsCsCalc_4x4_NoBlkShiftEPhiiiPtS1__ZN4aenc9imageInitEPNS_18ASCYUV_layer_storeEmemset_ZN4aenc9nullifierEPNS_12ASCimageDataE_ZN4aenc14ImDetails_InitEPNS_16ASCImage_detailsE_ZN4aenc10ASCTSCstatC2Ev_ZN4aenc10ASCTSCstatC1Ev_ZN4aenc15ASCTSCstat_InitEPPNS_10ASCTSCstatEDW.ref.__gxx_personality_v0_Znwm_ZdlPvm__cxa_begin_catch__cxa_end_catch_ZN4aenc12ASCimageDataC2Ev_ZN4aenc12ASCimageDataC1Ev_ZN4aenc12ASCimageDataD2Ev_ZN4aenc12ASCimageDataD1Ev_ZN4aenc12ASCimageDataaSERKS0_memmove_ZN4aenc12ASCimageData9InitFrameEv_ZN4aenc3ASCC2Ev_ZN4aenc3ASCC1Ev_ZN4aenc3ASC17Setup_EnvironmentEv_ZN4aenc3ASC11Params_InitEv_ZN4aenc3ASC15VidSample_AllocEv_ZN4aenc3ASC17VidSample_disposeEv_ZN4aenc3ASC15VidRead_disposeEv_ZdaPv_ZN4aenc3ASC10InitStructEv_ZN4aenc3ASC12VidRead_InitEv_Znam_ZN4aenc3ASC14VidSample_InitEv_ZN4aenc3ASC21SetUltraFastDetectionEv_ZN4aenc3ASC21SubSampleASC_ImageProEPhiiiNS_9ASCLayersEj_ZN4aenc3ASC8SetWidthEi_ZN4aenc3ASC9SetHeightEi_ZN4aenc3ASC8SetPitchEi_ZN4aenc3ASC12SetNextFieldEv_ZN4aenc3ASC13SetDimensionsEiii_ZN4aenc3ASC16SetInterlaceModeENS_6ASCFTSE_ZN4aenc3ASC21SubSampleASC_ImageIntEPhiiiNS_9ASCLayersEj_ZN4aenc3ASC4InitEiiijbj__cpu_model_ZN4aenc12AGOPSelectRFEijjjjjijjijjjjjijjjjjss_ZN4aenc16AGOPHEVCSelectRFEijjjjjijjijjjjjijjjjjss_ZN4aenc3ASC16IsASCinitializedEv_ZN4aenc3ASC15AssignResourcesEhPh_ZN4aenc3ASC15SetControlLevelEh_ZN4aenc3ASC10SetGoPSizeEj_ZN4aenc3ASC12ResetGoPSizeEv_ZN4aenc3ASC5CloseEv_ZN4aenc3ASC15SubSample_PointEPhjjjS1_jjjRs_ZN4aenc3ASC8RsCsCalcEv_ZN4aenc14Hint_LTR_op_onEjj_ZN4aenc3ASC10ShotDetectERNS_12ASCimageDataES2_RNS_16ASCImage_detailsEPNS_10ASCTSCstatES6_h_ZN4aenc10SCDetectRFEijjjjjijjijjjjjijjjjh_ZN4aenc11TableLookUpEjPjj_ZN4aenc20CorrectionForGoPSizeEPNS_19ASCextended_storageEj_ZN4aenc3ASC12CompareStatsEhh_ZN4aenc3ASC16FrameRepeatCheckEv_ZN4aenc3ASC16ML_SelectGoPSizeEv_ZN4aenc3ASC15GetFrameGopSizeEv_ZN4aenc3ASC12Put_LTR_HintEv_ZNSt8__detail15_List_node_base9_M_unhookEv_ZdlPv_ZNSt8__detail15_List_node_base7_M_hookEPS0__ZN4aenc3ASC13calc_RaCa_picEPhiiiRd_ZN4aenc3ASC25Get_asc_subsampling_widthEv_ZN4aenc3ASC26Get_asc_subsampling_heightEv_ZN4aenc3ASC25Get_starting_frame_numberEv_ZN4aenc3ASC16Get_frame_numberEv_ZN4aenc3ASC23Get_frame_shot_DecisionEv_ZN4aenc3ASC23Get_Repeated_Frame_FlagEv_ZN4aenc3ASC29Get_scene_transition_DecisionEv_ZN4aenc3ASC12Get_frame_SCEv_ZN4aenc3ASC13Get_frame_TSCEv_ZN4aenc3ASC13Get_frame_MV0Ev_ZN4aenc3ASC16Get_frame_MVSizeEv_ZN4aenc3ASC18Get_frame_ContrastEv_ZN4aenc3ASC27Get_frame_RecentHighMvCountEv_ZN4aenc3ASC17Get_frame_mcTCorrEv_ZN4aenc3ASC21Get_frame_mcTCorr_APQEv_ZN4aenc3ASC17Get_frame_ltrMCFDEv_ZN4aenc3ASC23Get_frame_last_in_sceneEv_ZN4aenc3ASC36Get_GoPcorrected_frame_shot_DecisionEv_ZN4aenc3ASC28Get_frame_Spatial_complexityEv_ZN4aenc3ASC29Get_frame_Temporal_complexityEv_ZN4aenc3ASC35Get_frame_SpatioTemporal_complexityEv_ZN4aenc3ASC16Get_PDist_adviceEv_ZN4aenc3ASC14Get_LTR_adviceEv_ZN4aenc3ASC24Get_RepeatedFrame_adviceEv_ZN4aenc3ASC18get_PersistenceMapEPhb_ZN4aenc3ASC25CorrectScdMiniGopDecisionEv_ZN4aenc3ASC26Check_last_frame_processedEj_ZN4aenc3ASC26Reset_last_frame_processedEv_ZN4aenc14bufferRotationEPvS0__ZN4aenc3ASC21GeneralBufferRotationEv_ZN4aenc3ASC19Get_Last_frame_DataEv_ZN4aenc3ASC15GetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc3ASC15SetImageAndStatERNS_14ASCvideoBufferERNS_10ASCTSCstatEjj_ZN4aenc7DistIntENS_14ASCcoordinatesE_ZN4aenc16ME_SAD_8x8_BlockEPhS0_jj_ZN4aenc12MVcalcSAD8x8ENS_14ASCcoordinatesEPhS1_PNS_16ASCImage_detailsEPtPi_ZN4aenc19SearchLimitsCalcSqrEssPsS0_S0_S0_PNS_16ASCImage_detailsEiNS_14ASCcoordinatesEPNS_24ASCVideo_characteristicsE_ZN4aenc16SearchLimitsCalcEssPsS0_S0_S0_PNS_16ASCImage_detailsEiNS_14ASCcoordinatesEPNS_24ASCVideo_characteristicsE_ZN4aenc16ME_VAR_8x8_BlockEPhS0_S0_ssjjRiS1_S1__ZN4aenc12MVcalcVar8x8ENS_14ASCcoordinatesEPhS1_ssRiS2_S2_PNS_16ASCImage_detailsE_ZN4aenc9ME_simpleEPNS_19ASCextended_storageEiPNS_16ASCImage_detailsEPNS_12ASCimageDataES5_bPNS_24ASCVideo_characteristicsEPFvPhS8_iiiPtPiSA_E_ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E_ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E_ZNKSt7__cxx114listISt4pairIibESaIS2_EE13_M_resize_posERm_ZNSt7__cxx114listISt4pairIibESaIS2_EE17_M_default_appendEm__cxa_rethrow_Unwind_Resume_ZN4aenc3ASC17Continue_LTR_ModeEtt_ZN4aenc3ASC15get_LTR_op_hintERNS_11ASC_LTR_DECE_ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS2_ERS1__ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base_ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1__ZSt25__throw_bad_function_callv_ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKjjEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT__ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS__ZN4aenc3ASC14MotionAnalysisEPNS_14ASCvideoBufferES2_PjPtS3_S3_S3_S3_NS_9ASCLayersEPfsqrtf_ZN4aenc3ASC21DetectShotChangeFrameEb_ZN4aenc3ASC16AscFrameAnalysisEv_ZN4aenc3ASC8RunFrameEPhjb_ZN4aenc3ASC19PutFrameProgressiveEPhib_ZN4aenc3ASC12RunFrame_LTREv_ZTVN10__cxxabiv117__class_type_infoEs$}% &&J&2lN4 <'<Q=%v'vQv( w){w*w+ty,y*3z+VٍUe]pZVgg1gHg_gvgggg- .!/-091Y2l3Xhіhe+_?e_pϗe9|A4ys]c[Řh(W9U*vSwox*}*vD*F^*w N H K S O P›q̛]]s] c]'c9]ElV{ G H K L M Rߜtk mrY|**1Оnޞpo_._N_/TJϤ2]FЯ5;6Jffºr)ֿfJ@HjJ78]J(r9:;<<"JNYaiy  XhR__[h 0 wWyy{t/rGm|ޝ D T l צ    _`a-_5`:aQ_Y`^at`ya`a' ~Dɘh))]8Y`cxa>` J,]CnJ`a^ l@P 00#x0$%%&4P2x4<v`zЍ\(P1 c\  ,`@TPtp0 ,` $i HxЙ @H\ e \3\T H] l p `P Pt    Т  0   |   `    , @ T  h @| `   Ь   0 P 0 D X l   @ `  ,@Tp @pP0`@к4HQ p`  /\T ] lLx.symtab.strtab.shstrtab.rela.text.data.bss.rela.text.unlikely.gcc_except_table.rela.text._ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E.rela.text._ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E.text._ZNKSt7__cxx114listISt4pairIibESaIS2_EE13_M_resize_posERm.rela.text._ZNSt7__cxx114listISt4pairIibESaIS2_EE17_M_default_appendEm.rela.text._ZNSt8_Rb_treeIjSt4pairIKjjESt10_Select1stIS2_ESt4lessIjESaIS2_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS2_ERS1_.rela.text._ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE24_M_get_insert_unique_posERKS1_.rela.text._ZNSt8_Rb_treeISt4pairIjjES1_St9_IdentityIS1_ESt8functionIFbS1_S1_EESaIS1_EE17_M_emplace_uniqueIJRS0_IKjjEEEES0_ISt17_Rb_tree_iteratorIS1_EbEDpOT_.rela.data.rel.ro.rodata.rodata.cst16.rodata.cst8.rodata.cst4.rela.data.rel.local.DW.ref.__gxx_personality_v0.comment.note.GNU-stack.note.gnu.property.rela.eh_frame.group@ *L *X*` *l *x * * *\ @P%8* & ,601@8* E\AW@:0*@A@:0*>0~@:*@;x*[`V@0<H*p@x<*ql@=0*~ 0@=*#0,$( H @= *(@+F  7XJ!oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/000077500000000000000000000000001443134507600215175ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/CMakeLists.txt000066400000000000000000000103561443134507600242640ustar00rootroot00000000000000# Copyright (c) 2017-2021 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. add_library(ipp_sse4 OBJECT) target_compile_definitions(ipp_sse4 PRIVATE $,_Y8,_P8> $,_ARCH_EM64T,_ARCH_IA32> ) target_include_directories(ipp_sse4 PRIVATE include) target_link_libraries(ipp_sse4 PRIVATE mfx_common_properties mfx_require_sse4_properties) target_sources(ipp_sse4 PRIVATE src/dispatcher.h src/ippcachesize.c src/ippmalloc.c src/ippver.h src/ippversion.h src/ippverstr.gen src/owncc.h src/owncore.h src/owncpufeatures.c src/owni.h src/ownj.h src/owns.h src/ownvc.h src/pccjoin422pxca.c src/pccycbcr44deint.c src/pccycbcr44deintw7cn.c src/pccyuvms.c src/pccyuvmsw7.c src/piconvert02ca.c src/piconvertca.c src/picopyca.c src/picopycpp8y8cn.c src/pilogic.c src/pizigzag.c src/pjdecdct0.c src/pjdecdct0w7cn.c src/pjdecdct1.c src/pjdecdct1w7cn.c src/pjdecdct32f.c src/pjdecdct32fw7cn.c src/pjdecdctcn.c src/pjdechuff.c src/pjdechuff.h src/pjdechuffls.c src/pjdechuffp.c src/pjdecpred.c src/pjdecqnt.c src/pjdecss0.c src/pjdecss.h src/pjenccc0.c src/pjenccc1.c src/pjenccc.c src/pjenccc.h src/pjencccps.c src/pjencccpsy8.c src/pjenccctbl.c src/pjenccctbl.h src/pjencdct32f.c src/pjencdct32fw7cn.c src/pjencdct.c src/pjenchuff.c src/pjenchuff.h src/pjenchuffls.c src/pjenchuffp.c src/pjencqnt.c src/pjencss0.c src/pjencss.c src/pjencss.h src/pjhufftbl.c src/pjhufftbl.h src/pjname.h src/pjquant.h src/pjver.h src/pjzigzag.c src/pjzigzag.h src/precomp.h src/ps_anarith.h src/pscopyca.c src/pscopy.h src/psdiv.c src/psmul.c src/psmulm6a6w7cn.c src/psshift.c src/pvccommonfunctions.h src/pvcdeinterlacevideoplane.c src/pvcmacro.h src/pvcown.h src/pvcvc1functions.h src/pvcvc1rangemap.c src/asm_intel64/pcccopym7as.s src/asm_intel64/piconvert01m7as.s src/asm_intel64/piconvert02m7as.s src/asm_intel64/picopyu8as.s src/asm_intel64/pidct8844im7as.s src/asm_intel64/pidct88fm7as.s src/asm_intel64/pidct88i_3_m7as.s src/asm_intel64/pidct88im7as.s src/asm_intel64/pilogic16um7as.s src/asm_intel64/pjarithm7as.s src/asm_intel64/pjdechuffpm7as.s src/asm_intel64/pjdechuffsu8as.s src/asm_intel64/pjdechuffu8as.s src/asm_intel64/pjdecpredm7as.s src/asm_intel64/pjdecqntm7as.s src/asm_intel64/pjdecssu8as.s src/asm_intel64/pjenchuffm7as.s src/asm_intel64/pjenchuffpm7as.s src/asm_intel64/pjencssm7as.s src/asm_intel64/pscopyu8as.s src/asm_intel64/pscpudef32eas.s src/asm_intel64/pscpuinfo32eas.s src/asm_intel64/psdivu8as.s src/asm_intel64/pssetm7as.s src/asm_intel64/psshiftm7as.s src/asm_intel64/pszerom7as.s src/asm_intel64/pvcvc1rangemapm7as.s ) enable_language(C ASM) set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s ) ## ipp add_library(ipp STATIC src/ippinit.c $ ) target_include_directories(ipp PUBLIC include) target_link_libraries(ipp PRIVATE mfx_common_properties) set(IPP_LIBS ipp) oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/000077500000000000000000000000001443134507600231425ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/cpudef.h000066400000000000000000000032401443134507600245600ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __CPUDEF_H__ #define __CPUDEF_H__ #include "ippcore.h" #if defined( __cplusplus ) extern "C" { #endif #undef __CDECL #if defined( _WIN32 ) || defined ( _WIN64 ) #define __CDECL __cdecl #else #define __CDECL #endif /* Intel CPU informator */ int __CDECL mfxownGetFeature( Ipp64u MaskOfFeature ); int __CDECL mfxhas_cpuid ( void ); int __CDECL mfxis_GenuineIntel ( void ); int __CDECL mfxmax_cpuid_input( void ); #if defined( __cplusplus ) } #endif #endif /* __CPUDEF_H__ */ /* ////////////////////////// End of file "cpudef.h" //////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/dependenceip.h000066400000000000000000000025651443134507600257460ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DEPENDENCEIP_H__ #define __DEPENDENCEIP_H__ #if (_IPP_ARCH == _IPP_ARCH_XSC) #ifndef _CORE #ifndef __IPPI_H__ #include "ippi.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* _CORE */ #endif #endif /* __DEPENDENCEIP_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/dependencesp.h000066400000000000000000000025671443134507600257620ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DEPENDENCESP_H__ #define __DEPENDENCESP_H__ #if (_IPP_ARCH == _IPP_ARCH_XSC) #ifndef _CORE #ifndef __IPPS_H__ #include "ipps.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* _CORE */ #endif #endif /* __DEPENDENCESP_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippcc.h000066400000000000000000000207411443134507600244150ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Color Conversion Library (ippCC) // // */ #if !defined( __IPPCC_H__ ) || defined( _OWN_BLDPCS ) #define __IPPCC_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif /* //////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422_8u_P3C2R // Purpose: Converts 422 planar image to YUY2 // Returns: // ippStsNoErr OK // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr Width of first plain 422-image less than 2(4) // or height equal zero // // Parameters: // pSrc[3] Array of pointers to the source image planes // srcStep[3] Array of steps through the source image planes // pDst[3] Array of pointers to the destination image planes // dstStep[3] Array of steps through the destination image planes // pSrc Pointer to the source pixel-order image // srcStep Step through the source pixel-order image // pDst Pointer to the destination pixel-order image // dstStep Step through the destination pixel-order image // roiSize Size of the ROI */ IPPAPI (IppStatus, mfxiYCbCr422_8u_P3C2R, ( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize)) IPPAPI(IppStatus, mfxiYCbCr420ToYCbCr422_8u_P2C2R,(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcCbCr, int srcCbCrStep, Ipp8u* pDst, int dstStep, IppiSize roiSize)) IPPAPI(IppStatus, mfxiYCrCb420ToYCbCr422_8u_P3C2R,( const Ipp8u* pSrc[3],int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize )) /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422_8u_C2P3R // Purpose: Converts a YUY2 image to the P422 image // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 // // Arguments: // pSrc pointer to the source image // srcStep step for the source image // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width should be multiple 2. */ IPPAPI(IppStatus, mfxiYCbCr422_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422ToYCbCr420_8u_C2P3R // Purpose: Converts a 2-channel YUY2 image to the I420(IYUV) image // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 2 // // Arguments: // pSrc pointer to the source image // srcStep step for the source image // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width and roiSize.height should be multiple 2. */ IPPAPI(IppStatus, mfxiYCbCr422ToYCbCr420_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) /* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr420_8u_P2P3R // Purpose: Converts a NV12 image to the I420(IYUV) image. // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 2 // // Arguments: // pSrcY pointer to the source Y plane // srcYStep step for the source Y plane // pSrcCbCr pointer to the source CbCr plane // srcCbCrStep step for the source CbCr plane // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width should be multiple 2. // roiSize.height should be multiple 2. */ IPPAPI(IppStatus, mfxiYCbCr420_8u_P2P3R,(const Ipp8u* pSrcY,int srcYStep,const Ipp8u* pSrcCbCr, int srcCbCrStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Name: mfxiCbYCr422ToYCbCr422_8u_C2P3R // Purpose: Converts a UYVY image to the P422 image // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 // // Arguments: // pSrc pointer to the source image // srcStep step for the source image // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width should be multiple 2. */ IPPAPI(IppStatus, mfxiCbYCr422ToYCbCr422_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422ToYCbCr420_8u_P3R // Purpose: Converts a P422 image to the I420(IYUV)image // Name: mfxiYCbCr420ToYCbCr422_8u_P3R // Purpose: Converts a IYUV image to the P422 image // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 2 // // Arguments: // pSrc array of pointers to the components of the source image // srcStep array of step values for every component // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width and roiSize.height should be multiple 2. */ IPPAPI(IppStatus, mfxiYCbCr422ToYCbCr420_8u_P3R,( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) IPPAPI(IppStatus, mfxiYCbCr420ToYCbCr422_8u_P3R,( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize )) #ifdef __cplusplus } #endif #if defined (_IPP_STDCALL_CDECL) #undef _IPP_STDCALL_CDECL #define __stdcall __cdecl #endif #endif /* __IPPCC_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippcore.h000066400000000000000000000100531443134507600247530ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Core (ippCore) // // */ #if !defined( __IPPCORE_H__ ) || defined( _OWN_BLDPCS ) #define __IPPCORE_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif typedef enum { ippAffinityCompactFineCore, /* KMP_AFFINITY=granularity=fine,compact,n,offset, where n - level */ ippAffinityCompactFineHT, /* KMP_AFFINITY=granularity=fine,compact,0,offset */ ippAffinityAllEnabled, /* KMP_AFFINITY=respect */ ippAffinityRestore, ippTstAffinityCompactFineCore, /* test mode for affinity type ippAffinityCompactFineCore */ ippTstAffinityCompactFineHT /* test mode for affinity type ippAffinityCompactFineHT */ } IppAffinityType; /* ///////////////////////////////////////////////////////////////////////////// // Functions to allocate and free memory ///////////////////////////////////////////////////////////////////////////// */ /* ///////////////////////////////////////////////////////////////////////////// // Name: ippMalloc // Purpose: 64-byte aligned memory allocation // Parameter: // len number of bytes // Returns: pointer to allocated memory // // Notes: the memory allocated by ippMalloc has to be free by ippFree // function only. */ IPPAPI( void*, mfxMalloc, (int length) ) /* ///////////////////////////////////////////////////////////////////////////// // Name: ippFree // Purpose: free memory allocated by the ippMalloc function // Parameter: // ptr pointer to the memory allocated by the ippMalloc function // // Notes: use the function to free memory allocated by ippMalloc */ IPPAPI( void, mfxFree, (void* ptr) ) IPPAPI( IppStatus, MfxIppInit, (void) ) /* //////////////////////////////////////////////////////////////////////////// // Name: mfxGetMaxCacheSizeB // // Purpose: Detects maximal from the sizes of L2 or L3 in bytes // // Return: // ippStsNullPtrErr The result's pointer is NULL. // ippStsNotSupportedCpu The cpu is not supported. // ippStsUnknownCacheSize The cpu is supported, but the size of the cache is unknown. // ippStsNoErr Ok // // Arguments: // pSizeByte Pointer to the result // // Note: // 1). Intel(R) processors are supported only. // 2). Intel(R) Itanium(R) processors and platforms with Intel XScale(R) technology are unsupported // 3). For unsupported processors the result is "0", // and the return status is "ippStsNotSupportedCpu". // 4). For supported processors the result is "0", // and the return status is "ippStsUnknownCacheSize". // if sizes of the cache is unknown. // */ IPPAPI( IppStatus, mfxGetMaxCacheSizeB, ( int* pSizeByte ) ) #ifdef __cplusplus } #endif #endif /* __IPPCORE_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippdefs.h000066400000000000000000001110521443134507600247450ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Common Types and Macro Definitions // // */ #ifndef __IPPDEFS_H__ #define __IPPDEFS_H__ #include #ifdef __cplusplus extern "C" { #endif #if defined( _WIN32 ) || defined ( _WIN64 ) #define __STDCALL __stdcall #define __CDECL __cdecl #else #define __STDCALL #define __CDECL #endif #if !defined( IPPAPI ) #if defined( IPP_W32DLL ) && (defined( _WIN32 ) || defined( _WIN64 )) #if defined( _MSC_VER ) || defined( __ICL ) #define IPPAPI( type,name,arg ) \ __declspec(dllimport) type __STDCALL name arg; #else #define IPPAPI( type,name,arg ) type __STDCALL name arg; #endif #else #define IPPAPI( type,name,arg ) type __STDCALL name arg; #endif #endif #define IPP_MAX_8U ( 0xFF ) #define IPP_MIN_16S (-32768 ) #define IPP_MAX_16S ( 32767 ) #define IPP_MAX( a, b ) ( ((a) > (b)) ? (a) : (b) ) #define IPP_MIN( a, b ) ( ((a) < (b)) ? (a) : (b) ) #if !defined( _OWN_BLDPCS ) typedef enum { /* Enumeration: Processor: */ ippCpuUnknown = 0x00, ippCpuPP = 0x01, /* Intel(R) Pentium(R) processor */ ippCpuPMX = 0x02, /* Intel(R) Pentium(R) processor with MMX(TM) technology */ ippCpuPPR = 0x03, /* Intel(R) Pentium(R) Pro processor */ ippCpuPII = 0x04, /* Intel(R) Pentium(R) II processor */ ippCpuPIII = 0x05, /* Intel(R) Pentium(R) III processor and Pentium(R) III Xeon(R) processor */ ippCpuP4 = 0x06, /* Intel(R) Pentium(R) 4 processor and Intel(R) Xeon(R) processor */ ippCpuP4HT = 0x07, /* Intel(R) Pentium(R) 4 Processor with HT Technology */ ippCpuP4HT2 = 0x08, /* Intel(R) Pentium(R) 4 processor with Intel(R) Streaming SIMD Extensions 3 */ ippCpuCentrino = 0x09, /* Intel(R) Centrino(R) mobile technology */ ippCpuCoreSolo = 0x0a, /* Intel(R) Core(TM) Solo processor */ ippCpuCoreDuo = 0x0b, /* Intel(R) Core(TM) Duo processor */ ippCpuITP = 0x10, /* Intel(R) Itanium(R) processor */ ippCpuITP2 = 0x11, /* Intel(R) Itanium(R) 2 processor */ ippCpuEM64T = 0x20, /* Intel(R) 64 Instruction Set Architecture (ISA) */ ippCpuC2D = 0x21, /* Intel(R) Core(TM) 2 Duo processor */ ippCpuC2Q = 0x22, /* Intel(R) Core(TM) 2 Quad processor */ ippCpuPenryn = 0x23, /* Intel(R) Core(TM) 2 processor with Intel(R) SSE4.1 */ ippCpuBonnell = 0x24, /* Intel(R) Atom(TM) processor */ ippCpuNehalem = 0x25, /* Intel(R) Core(TM) i7 processor */ ippCpuNext = 0x26, ippCpuSSE = 0x40, /* Processor supports Intel(R) Streaming SIMD Extensions (Intel(R) SSE) instruction set */ ippCpuSSE2 = 0x41, /* Processor supports Intel(R) Streaming SIMD Extensions 2 (Intel(R) SSE2) instruction set */ ippCpuSSE3 = 0x42, /* Processor supports Intel(R) Streaming SIMD Extensions 3 (Intel(R) SSE3) instruction set */ ippCpuSSSE3 = 0x43, /* Processor supports Intel(R) Supplemental Streaming SIMD Extension 3 (Intel(R) SSSE3) instruction set */ ippCpuSSE41 = 0x44, /* Processor supports Intel(R) Streaming SIMD Extensions 4.1 (Intel(R) SSE4.1) instruction set */ ippCpuSSE42 = 0x45, /* Processor supports Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) instruction set */ ippCpuAVX = 0x46, /* Processor supports Intel(R) Advanced Vector Extensions (Intel(R) AVX) instruction set */ ippCpuAES = 0x47, /* Processor supports Intel(R) AES New Instructions */ ippCpuSHA = 0x48, /* Processor supports Intel(R) SHA New Instructions */ ippCpuF16RND = 0x49, /* Processor supports RDRRAND & Float16 instructions */ ippCpuAVX2 = 0x4a, /* Processor supports Intel(R) Advanced Vector Extensions 2 (Intel(R) AVX2) instruction set */ ippCpuADCOX = 0x4b, /* Processor supports ADCX and ADOX instructions */ ippCpuX8664 = 0x60 /* Processor supports 64 bit extension */ } IppCpuType; #define ippCPUID_MMX 0x00000001 /* Intel Architecture MMX technology supported */ #define ippCPUID_SSE 0x00000002 /* Streaming SIMD Extensions */ #define ippCPUID_SSE2 0x00000004 /* Streaming SIMD Extensions 2 */ #define ippCPUID_SSE3 0x00000008 /* Streaming SIMD Extensions 3 */ #define ippCPUID_SSSE3 0x00000010 /* Supplemental Streaming SIMD Extensions 3 */ #define ippCPUID_MOVBE 0x00000020 /* The processor supports MOVBE instruction */ #define ippCPUID_SSE41 0x00000040 /* Streaming SIMD Extensions 4.1 */ #define ippCPUID_SSE42 0x00000080 /* Streaming SIMD Extensions 4.2 */ #define ippCPUID_AVX 0x00000100 /* Advanced Vector Extensions instruction set */ #define ippAVX_ENABLEDBYOS 0x00000200 /* The operating system supports AVX */ #define ippCPUID_AES 0x00000400 /* AES instruction */ #define ippCPUID_CLMUL 0x00000800 /* PCLMULQDQ instruction */ #define ippCPUID_ABR 0x00001000 /* Reserved */ #define ippCPUID_RDRAND 0x00002000 /* Read Random Number instructions */ #define ippCPUID_F16C 0x00004000 /* Float16 instructions */ #define ippCPUID_AVX2 0x00008000 /* Advanced Vector Extensions 2 instruction set */ #define ippCPUID_ADCOX 0x00010000 /* ADCX and ADOX instructions */ #define ippCPUID_RDSEED 0x00020000 /* The RDSEED instruction */ #define ippCPUID_PREFETCHW 0x00040000 /* The PREFETCHW instruction */ #define ippCPUID_SHA 0x00080000 /* Intel (R) SHA Extensions */ #define ippCPUID_KNC 0x80000000 /* Intel(R) Xeon Phi(TM) Coprocessor */ #define ippCPUID_GETINFO_A 0x616f666e69746567 typedef struct { int major; /* e.g. 1 */ int minor; /* e.g. 2 */ int majorBuild; /* e.g. 3 */ int build; /* e.g. 10, always >= majorBuild */ char targetCpu[4]; /* corresponding to Intel(R) processor */ const char* Name; /* e.g. "ippsw7" */ const char* Version; /* e.g. "v1.2 Beta" */ const char* BuildDate; /* e.g. "Jul 20 99" */ } IppLibraryVersion; typedef unsigned char Ipp8u; typedef unsigned short Ipp16u; typedef unsigned int Ipp32u; typedef signed char Ipp8s; typedef signed short Ipp16s; typedef signed int Ipp32s; typedef float Ipp32f; typedef double Ipp64f; #if defined(_WIN32) || defined(_WIN64) typedef __int64 Ipp64s; typedef unsigned __int64 Ipp64u; #else typedef long long Ipp64s; typedef unsigned long long Ipp64u; #endif typedef struct { Ipp64s re; Ipp64s im; } Ipp64sc; typedef enum { ippRndZero, ippRndNear, ippRndFinancial } IppRoundMode; typedef struct { int width; int height; } IppiSize; enum { IPP_UPPER = 1, IPP_LEFT = 2, IPP_CENTER = 4, IPP_RIGHT = 8, IPP_LOWER = 16, IPP_UPPER_LEFT = 32, IPP_UPPER_RIGHT = 64, IPP_LOWER_LEFT = 128, IPP_LOWER_RIGHT = 256 }; /* ///////////////////////////////////////////////////////////////////////////// // The following enumerator defines a status of IPP operations // negative value means error */ typedef enum { /* errors */ ippStsNotSupportedModeErr = -9999,/* The requested mode is currently not supported. */ ippStsCpuNotSupportedErr = -9998,/* The target CPU is not supported. */ ippStsInplaceModeNotSupportedErr = -9997,/* The inplace operation is currently not supported. */ ippStsExceededSizeErr = -232, /* Requested size exceeded the maximum supported ROI size */ ippStsWarpDirectionErr = -231, /* The warp transform direction is illegal */ ippStsFilterTypeErr = -230, /* The filter type is incorrect or not supported */ ippStsNormErr = -229, /* The norm is incorrect or not supported */ ippStsAlgTypeErr = -228, /* Algorithm type is not supported. */ ippStsMisalignedOffsetErr = -227, /* The offset is not aligned with an element. */ ippStsQuadraticNonResidueErr = -226, /* SQRT operation on quadratic non-residue value. */ ippStsBorderErr = -225, /* Illegal value for border type.*/ ippStsDitherTypeErr = -224, /* Dithering type is not supported. */ ippStsH264BufferFullErr = -223, /* Buffer for the output bitstream is full. */ ippStsWrongAffinitySettingErr= -222, /* An affinity setting does not correspond to the affinity setting that was set by f.ippSetAffinity(). */ ippStsLoadDynErr = -221, /* Error when loading the dynamic library. */ ippStsPointAtInfinity = -220, /* Point at infinity is detected. */ ippStsI18nUnsupportedErr = -219, /* Internationalization (i18n) is not supported. */ ippStsI18nMsgCatalogOpenErr = -218, /* Message catalog cannot be opened, for more information use errno on Linux* OS and GetLastError on Windows* OS. */ ippStsI18nMsgCatalogCloseErr = -217, /* Message catalog cannot be closed, for more information use errno on Linux* OS and GetLastError on Windows* OS. */ ippStsUnknownStatusCodeErr = -216, /* Unknown status code. */ ippStsOFBSizeErr = -215, /* Incorrect value for crypto OFB block size. */ ippStsLzoBrokenStreamErr = -214, /* LZO safe decompression function cannot decode LZO stream. */ ippStsRoundModeNotSupportedErr = -213, /* Rounding mode is not supported. */ ippStsDecimateFractionErr = -212, /* Fraction in Decimate is not supported. */ ippStsWeightErr = -211, /* Incorrect value for weight. */ ippStsQualityIndexErr = -210, /* Cannot calculate the quality index for an image filled with a constant. */ ippStsIIRPassbandRippleErr = -209, /* Ripple in passband for Chebyshev1 design is less than zero, equal to zero, or greater than 29. */ ippStsFilterFrequencyErr = -208, /* Cutoff frequency of filter is less than zero, equal to zero, or greater than 0.5. */ ippStsFIRGenOrderErr = -207, /* Order of the FIR filter for design is less than 1. */ ippStsIIRGenOrderErr = -206, /* Order of the IIR filter for design is less than 1, or greater than 12. */ ippStsConvergeErr = -205, /* The algorithm does not converge. */ ippStsSizeMatchMatrixErr = -204, /* The sizes of the source matrices are unsuitable. */ ippStsCountMatrixErr = -203, /* Count value is less than, or equal to zero. */ ippStsRoiShiftMatrixErr = -202, /* RoiShift value is negative or not divisible by the size of the data type. */ ippStsResizeNoOperationErr = -201, /* One of the output image dimensions is less than 1 pixel. */ ippStsSrcDataErr = -200, /* The source buffer contains unsupported data. */ ippStsMaxLenHuffCodeErr = -199, /* Huff: Max length of Huffman code is more than the expected one. */ ippStsCodeLenTableErr = -198, /* Huff: Invalid codeLenTable. */ ippStsFreqTableErr = -197, /* Huff: Invalid freqTable. */ ippStsIncompleteContextErr = -196, /* Crypto: set up of context is not complete. */ ippStsSingularErr = -195, /* Matrix is singular. */ ippStsSparseErr = -194, /* Positions of taps are not in ascending order, or are negative, or repetitive. */ ippStsBitOffsetErr = -193, /* Incorrect bit offset value. */ ippStsQPErr = -192, /* Incorrect quantization parameter value. */ ippStsVLCErr = -191, /* Illegal VLC or FLC is detected during stream decoding. */ ippStsRegExpOptionsErr = -190, /* RegExp: Options for the pattern are incorrect. */ ippStsRegExpErr = -189, /* RegExp: The structure pRegExpState contains incorrect data. */ ippStsRegExpMatchLimitErr = -188, /* RegExp: The match limit is exhausted. */ ippStsRegExpQuantifierErr = -187, /* RegExp: Incorrect quantifier. */ ippStsRegExpGroupingErr = -186, /* RegExp: Incorrect grouping. */ ippStsRegExpBackRefErr = -185, /* RegExp: Incorrect back reference. */ ippStsRegExpChClassErr = -184, /* RegExp: Incorrect character class. */ ippStsRegExpMetaChErr = -183, /* RegExp: Incorrect metacharacter. */ ippStsStrideMatrixErr = -182, /* Stride value is not positive or not divisible by the size of the data type. */ ippStsCTRSizeErr = -181, /* Incorrect value for crypto CTR block size. */ ippStsJPEG2KCodeBlockIsNotAttached =-180, /* Codeblock parameters are not attached to the state structure. */ ippStsNotPosDefErr = -179, /* Matrix is not positive definite. */ ippStsEphemeralKeyErr = -178, /* ECC: Invalid ephemeral key. */ ippStsMessageErr = -177, /* ECC: Invalid message digest. */ ippStsShareKeyErr = -176, /* ECC: Invalid share key. */ ippStsIvalidPublicKey = -175, /* ECC: Invalid public key. */ ippStsIvalidPrivateKey = -174, /* ECC: Invalid private key. */ ippStsOutOfECErr = -173, /* ECC: Point out of EC. */ ippStsECCInvalidFlagErr = -172, /* ECC: Invalid Flag. */ ippStsMP3FrameHeaderErr = -171, /* Error in fields of the IppMP3FrameHeader structure. */ ippStsMP3SideInfoErr = -170, /* Error in fields of the IppMP3SideInfo structure. */ ippStsBlockStepErr = -169, /* Step for Block is less than 8. */ ippStsMBStepErr = -168, /* Step for MB is less than 16. */ ippStsAacPrgNumErr = -167, /* AAC: Invalid number of elements for one program. */ ippStsAacSectCbErr = -166, /* AAC: Invalid section codebook. */ ippStsAacSfValErr = -164, /* AAC: Invalid scalefactor value. */ ippStsAacCoefValErr = -163, /* AAC: Invalid quantized coefficient value. */ ippStsAacMaxSfbErr = -162, /* AAC: Invalid coefficient index. */ ippStsAacPredSfbErr = -161, /* AAC: Invalid predicted coefficient index. */ ippStsAacPlsDataErr = -160, /* AAC: Invalid pulse data attributes. */ ippStsAacGainCtrErr = -159, /* AAC: Gain control is not supported. */ ippStsAacSectErr = -158, /* AAC: Invalid number of sections. */ ippStsAacTnsNumFiltErr = -157, /* AAC: Invalid number of TNS filters. */ ippStsAacTnsLenErr = -156, /* AAC: Invalid length of TNS region. */ ippStsAacTnsOrderErr = -155, /* AAC: Invalid order of TNS filter. */ ippStsAacTnsCoefResErr = -154, /* AAC: Invalid bit-resolution for TNS filter coefficients. */ ippStsAacTnsCoefErr = -153, /* AAC: Invalid coefficients of TNS filter. */ ippStsAacTnsDirectErr = -152, /* AAC: Invalid direction TNS filter. */ ippStsAacTnsProfileErr = -151, /* AAC: Invalid TNS profile. */ ippStsAacErr = -150, /* AAC: Internal error. */ ippStsAacBitOffsetErr = -149, /* AAC: Invalid current bit offset in bitstream. */ ippStsAacAdtsSyncWordErr = -148, /* AAC: Invalid ADTS syncword. */ ippStsAacSmplRateIdxErr = -147, /* AAC: Invalid sample rate index. */ ippStsAacWinLenErr = -146, /* AAC: Invalid window length (not short or long). */ ippStsAacWinGrpErr = -145, /* AAC: Invalid number of groups for current window length. */ ippStsAacWinSeqErr = -144, /* AAC: Invalid window sequence range. */ ippStsAacComWinErr = -143, /* AAC: Invalid common window flag. */ ippStsAacStereoMaskErr = -142, /* AAC: Invalid stereo mask. */ ippStsAacChanErr = -141, /* AAC: Invalid channel number. */ ippStsAacMonoStereoErr = -140, /* AAC: Invalid mono-stereo flag. */ ippStsAacStereoLayerErr = -139, /* AAC: Invalid this Stereo Layer flag. */ ippStsAacMonoLayerErr = -138, /* AAC: Invalid this Mono Layer flag. */ ippStsAacScalableErr = -137, /* AAC: Invalid scalable object flag. */ ippStsAacObjTypeErr = -136, /* AAC: Invalid audio object type. */ ippStsAacWinShapeErr = -135, /* AAC: Invalid window shape. */ ippStsAacPcmModeErr = -134, /* AAC: Invalid PCM output interleaving indicator. */ ippStsVLCUsrTblHeaderErr = -133, /* VLC: Invalid header inside table. */ ippStsVLCUsrTblUnsupportedFmtErr = -132, /* VLC: Table format is not supported. */ ippStsVLCUsrTblEscAlgTypeErr = -131, /* VLC: Ecs-algorithm is not supported. */ ippStsVLCUsrTblEscCodeLengthErr = -130, /* VLC: Esc-code length inside table header is incorrect. */ ippStsVLCUsrTblCodeLengthErr = -129, /* VLC: Code length inside table is incorrect. */ ippStsVLCInternalTblErr = -128, /* VLC: Invalid internal table. */ ippStsVLCInputDataErr = -127, /* VLC: Invalid input data. */ ippStsVLCAACEscCodeLengthErr = -126, /* VLC: Invalid AAC-Esc code length. */ ippStsNoiseRangeErr = -125, /* Noise value for Wiener Filter is out of range. */ ippStsUnderRunErr = -124, /* Error in data under run. */ ippStsPaddingErr = -123, /* Detected padding error indicates the possible data corruption. */ ippStsCFBSizeErr = -122, /* Incorrect value for crypto CFB block size. */ ippStsPaddingSchemeErr = -121, /* Invalid padding scheme. */ ippStsInvalidCryptoKeyErr = -120, /* A compromised key causes suspansion of the requested cryptographic operation. */ ippStsLengthErr = -119, /* Incorrect value for string length. */ ippStsBadModulusErr = -118, /* Bad modulus caused a failure in module inversion. */ ippStsLPCCalcErr = -117, /* Cannot evaluate linear prediction. */ ippStsRCCalcErr = -116, /* Cannot compute reflection coefficients. */ ippStsIncorrectLSPErr = -115, /* Incorrect values for Linear Spectral Pair. */ ippStsNoRootFoundErr = -114, /* No roots are found for equation. */ ippStsJPEG2KBadPassNumber = -113, /* Pass number exceeds allowed boundaries [0,nOfPasses-1]. */ ippStsJPEG2KDamagedCodeBlock= -112, /* Codeblock for decoding contains damaged data. */ ippStsH263CBPYCodeErr = -111, /* Illegal Huffman code is detected through CBPY stream processing. */ ippStsH263MCBPCInterCodeErr = -110, /* Illegal Huffman code is detected through MCBPC Inter stream processing. */ ippStsH263MCBPCIntraCodeErr = -109, /* Illegal Huffman code is detected through MCBPC Intra stream processing. */ ippStsNotEvenStepErr = -108, /* Step value is not pixel multiple. */ ippStsHistoNofLevelsErr = -107, /* Number of levels for histogram is less than 2. */ ippStsLUTNofLevelsErr = -106, /* Number of levels for LUT is less than 2. */ ippStsMP4BitOffsetErr = -105, /* Incorrect bit offset value. */ ippStsMP4QPErr = -104, /* Incorrect quantization parameter. */ ippStsMP4BlockIdxErr = -103, /* Incorrect block index. */ ippStsMP4BlockTypeErr = -102, /* Incorrect block type. */ ippStsMP4MVCodeErr = -101, /* Illegal Huffman code is detected during MV stream processing. */ ippStsMP4VLCCodeErr = -100, /* Illegal Huffman code is detected during VLC stream processing. */ ippStsMP4DCCodeErr = -99, /* Illegal code is detected during DC stream processing. */ ippStsMP4FcodeErr = -98, /* Incorrect fcode value. */ ippStsMP4AlignErr = -97, /* Incorrect buffer alignment . */ ippStsMP4TempDiffErr = -96, /* Incorrect temporal difference. */ ippStsMP4BlockSizeErr = -95, /* Incorrect size of a block or macroblock. */ ippStsMP4ZeroBABErr = -94, /* All BAB values are equal to zero. */ ippStsMP4PredDirErr = -93, /* Incorrect prediction direction. */ ippStsMP4BitsPerPixelErr = -92, /* Incorrect number of bits per pixel. */ ippStsMP4VideoCompModeErr = -91, /* Incorrect video component mode. */ ippStsMP4LinearModeErr = -90, /* Incorrect DC linear mode. */ ippStsH263PredModeErr = -83, /* Incorrect Prediction Mode value. */ ippStsH263BlockStepErr = -82, /* The step value is less than 8. */ ippStsH263MBStepErr = -81, /* The step value is less than 16. */ ippStsH263FrameWidthErr = -80, /* The frame width is less than 8. */ ippStsH263FrameHeightErr = -79, /* The frame height is less than, or equal to zero. */ ippStsH263ExpandPelsErr = -78, /* Expand pixels number is less than 8. */ ippStsH263PlaneStepErr = -77, /* Step value is less than the plane width. */ ippStsH263QuantErr = -76, /* Quantizer value is less than, or equal to zero, or greater than 31. */ ippStsH263MVCodeErr = -75, /* Illegal Huffman code is detected during MV stream processing. */ ippStsH263VLCCodeErr = -74, /* Illegal Huffman code is detected during VLC stream processing. */ ippStsH263DCCodeErr = -73, /* Illegal code is detected during DC stream processing. */ ippStsH263ZigzagLenErr = -72, /* Zigzag compact length is more than 64. */ ippStsFBankFreqErr = -71, /* Incorrect value for the filter bank frequency parameter. */ ippStsFBankFlagErr = -70, /* Incorrect value for the filter bank parameter. */ ippStsFBankErr = -69, /* Filter bank is not correctly initialized. */ ippStsNegOccErr = -67, /* Occupation count is negative. */ ippStsCdbkFlagErr = -66, /* Incorrect value for the codebook flag parameter. */ ippStsSVDCnvgErr = -65, /* SVD algorithm does not converge. */ ippStsJPEGHuffTableErr = -64, /* JPEG Huffman table is destroyed. */ ippStsJPEGDCTRangeErr = -63, /* JPEG DCT coefficient is out of range. */ ippStsJPEGOutOfBufErr = -62, /* Attempt to access out of the buffer limits. */ ippStsDrawTextErr = -61, /* System error in the draw text operation. */ ippStsChannelOrderErr = -60, /* Incorrect order of the destination channels. */ ippStsZeroMaskValuesErr = -59, /* All values of the mask are equal to zero. */ ippStsQuadErr = -58, /* The quadrangle is nonconvex or degenerates into triangle, line, or point */ ippStsRectErr = -57, /* Size of the rectangle region is less than, or equal to 1. */ ippStsCoeffErr = -56, /* Incorrect values for transformation coefficients. */ ippStsNoiseValErr = -55, /* Incorrect value for noise amplitude for dithering. */ ippStsDitherLevelsErr = -54, /* Number of dithering levels is out of range. */ ippStsNumChannelsErr = -53, /* Number of channels is incorrect, or not supported. */ ippStsCOIErr = -52, /* COI is out of range. */ ippStsDivisorErr = -51, /* Divisor is equal to zero, function is aborted. */ ippStsAlphaTypeErr = -50, /* Illegal type of image compositing operation. */ ippStsGammaRangeErr = -49, /* Gamma range bounds is less than, or equal to zero. */ ippStsGrayCoefSumErr = -48, /* Sum of the conversion coefficients must be less than, or equal to 1. */ ippStsChannelErr = -47, /* Illegal channel number. */ ippStsToneMagnErr = -46, /* Tone magnitude is less than, or equal to zero. */ ippStsToneFreqErr = -45, /* Tone frequency is negative, or greater than, or equal to 0.5. */ ippStsTonePhaseErr = -44, /* Tone phase is negative, or greater than, or equal to 2*PI. */ ippStsTrnglMagnErr = -43, /* Triangle magnitude is less than, or equal to zero. */ ippStsTrnglFreqErr = -42, /* Triangle frequency is negative, or greater than, or equal to 0.5. */ ippStsTrnglPhaseErr = -41, /* Triangle phase is negative, or greater than, or equal to 2*PI. */ ippStsTrnglAsymErr = -40, /* Triangle asymmetry is less than -PI, or greater than, or equal to PI. */ ippStsHugeWinErr = -39, /* Kaiser window is too big. */ ippStsJaehneErr = -38, /* Magnitude value is negative. */ ippStsStrideErr = -37, /* Stride value is less than the length of the row. */ ippStsEpsValErr = -36, /* Negative epsilon value. */ ippStsWtOffsetErr = -35, /* Invalid offset value for wavelet filter. */ ippStsAnchorErr = -34, /* Anchor point is outside the mask. */ ippStsMaskSizeErr = -33, /* Invalid mask size. */ ippStsShiftErr = -32, /* Shift value is less than zero. */ ippStsSampleFactorErr = -31, /* Sampling factor is less than, or equal to zero. */ ippStsSamplePhaseErr = -30, /* Phase value is out of range: 0 <= phase < factor. */ ippStsFIRMRFactorErr = -29, /* MR FIR sampling factor is less than, or equal to zero. */ ippStsFIRMRPhaseErr = -28, /* MR FIR sampling phase is negative, or greater than, or equal to the sampling factor. */ ippStsRelFreqErr = -27, /* Relative frequency value is out of range. */ ippStsFIRLenErr = -26, /* Length of a FIR filter is less than, or equal to zero. */ ippStsIIROrderErr = -25, /* Order of an IIR filter is not valid. */ ippStsDlyLineIndexErr = -24, /* Invalid value for the delay line sample index. */ ippStsResizeFactorErr = -23, /* Resize factor(s) is less than, or equal to zero. */ ippStsInterpolationErr = -22, /* Invalid interpolation mode. */ ippStsMirrorFlipErr = -21, /* Invalid flip mode. */ ippStsMoment00ZeroErr = -20, /* Moment value M(0,0) is too small to continue calculations. */ ippStsThreshNegLevelErr = -19, /* Negative value of the level in the threshold operation. */ ippStsThresholdErr = -18, /* Invalid threshold bounds. */ ippStsContextMatchErr = -17, /* Context parameter does not match the operation. */ ippStsFftFlagErr = -16, /* Invalid value for the FFT flag parameter. */ ippStsFftOrderErr = -15, /* Invalid value for the FFT order parameter. */ ippStsStepErr = -14, /* Step value is not valid. */ ippStsScaleRangeErr = -13, /* Scale bounds are out of range. */ ippStsDataTypeErr = -12, /* Data type is incorrect or not supported. */ ippStsOutOfRangeErr = -11, /* Argument is out of range, or point is outside the image. */ ippStsDivByZeroErr = -10, /* An attempt to divide by zero. */ ippStsMemAllocErr = -9, /* Memory allocated for the operation is not enough.*/ ippStsNullPtrErr = -8, /* Null pointer error. */ ippStsRangeErr = -7, /* Incorrect values for bounds: the lower bound is greater than the upper bound. */ ippStsSizeErr = -6, /* Incorrect value for data size. */ ippStsBadArgErr = -5, /* Incorrect arg/param of the function. */ ippStsNoMemErr = -4, /* Not enough memory for the operation. */ ippStsSAReservedErr3 = -3, /* Unknown/unspecified error, -3. */ ippStsErr = -2, /* Unknown/unspecified error, -2. */ ippStsSAReservedErr1 = -1, /* Unknown/unspecified error, -1. */ /* no errors */ ippStsNoErr = 0, /* No errors. */ /* warnings */ ippStsNoOperation = 1, /* No operation has been executed. */ ippStsMisalignedBuf = 2, /* Misaligned pointer in operation in which it must be aligned. */ ippStsSqrtNegArg = 3, /* Negative value(s) for the argument in the Sqrt function. */ ippStsInvZero = 4, /* INF result. Zero value was met by InvThresh with zero level. */ ippStsEvenMedianMaskSize= 5, /* Even size of the Median Filter mask was replaced with the odd one. */ ippStsDivByZero = 6, /* Zero value(s) for the divisor in the Div function. */ ippStsLnZeroArg = 7, /* Zero value(s) for the argument in the Ln function. */ ippStsLnNegArg = 8, /* Negative value(s) for the argument in the Ln function. */ ippStsNanArg = 9, /* Argument value is not a number. */ ippStsJPEGMarker = 10, /* JPEG marker in the bitstream. */ ippStsResFloor = 11, /* All result values are floored. */ ippStsOverflow = 12, /* Overflow in the operation. */ ippStsLSFLow = 13, /* Quantized LP synthesis filter stability check is applied at the low boundary of [0,pi]. */ ippStsLSFHigh = 14, /* Quantized LP synthesis filter stability check is applied at the high boundary of [0,pi]. */ ippStsLSFLowAndHigh = 15, /* Quantized LP synthesis filter stability check is applied at both boundaries of [0,pi]. */ ippStsZeroOcc = 16, /* Zero occupation count. */ ippStsUnderflow = 17, /* Underflow in the operation. */ ippStsSingularity = 18, /* Singularity in the operation. */ ippStsDomain = 19, /* Argument is out of the function domain. */ ippStsNonIntelCpu = 20, /* The target CPU is not Genuine Intel. */ ippStsCpuMismatch = 21, /* Cannot set the library for the given CPU. */ ippStsNoIppFunctionFound = 22, /* Application does not contain Intel IPP function calls. */ ippStsDllNotFoundBestUsed = 23, /* Dispatcher cannot find the newest version of the Intel IPP dll. */ ippStsNoOperationInDll = 24, /* The function does nothing in the dynamic version of the library. */ ippStsInsufficientEntropy= 25, /* Generation of the prime/key failed due to insufficient entropy in the random seed and stimulus bit string. */ ippStsOvermuchStrings = 26, /* Number of destination strings is more than expected. */ ippStsOverlongString = 27, /* Length of one of the destination strings is more than expected. */ ippStsAffineQuadChanged = 28, /* 4th vertex of destination quad is not equal to customer's one. */ ippStsWrongIntersectROI = 29, /* ROI has no intersection with the source or destination ROI. No operation. */ ippStsWrongIntersectQuad = 30, /* Quadrangle has no intersection with the source or destination ROI. No operation. */ ippStsSmallerCodebook = 31, /* Size of created codebook is less than the cdbkSize argument. */ ippStsSrcSizeLessExpected = 32, /* DC: Size of the source buffer is less than the expected one. */ ippStsDstSizeLessExpected = 33, /* DC: Size of the destination buffer is less than the expected one. */ ippStsStreamEnd = 34, /* DC: The end of stream processed. */ ippStsDoubleSize = 35, /* Width or height of image is odd. */ ippStsNotSupportedCpu = 36, /* The CPU is not supported. */ ippStsUnknownCacheSize = 37, /* The CPU is supported, but the size of the cache is unknown. */ ippStsSymKernelExpected = 38, /* The Kernel is not symmetric. */ ippStsEvenMedianWeight = 39, /* Even weight of the Weighted Median Filter is replaced with the odd one. */ ippStsWrongIntersectVOI = 40, /* VOI has no intersection with the source or destination volume. No operation. */ ippStsI18nMsgCatalogInvalid=41, /* Message Catalog is invalid, English message returned. */ ippStsI18nGetMessageFail = 42, /* Failed to fetch a localized message, English message returned. For more information use errno on Linux* OS and GetLastError on Windows* OS. */ ippStsWaterfall = 43, /* Cannot load required library, waterfall is used. */ ippStsPrevLibraryUsed = 44, /* Cannot load required library, previous dynamic library is used. */ ippStsLLADisabled = 45, /* OpenMP* Low Level Affinity is disabled. */ ippStsNoAntialiasing = 46, /* The mode does not support antialiasing. */ ippStsRepetitiveSrcData = 47, /* DC: The source data is too repetitive. */ ippStsSizeWrn = 48, /* The size does not allow to perform full operation. */ ippStsFeatureNotSupported = 49, /* Current CPU doesn't support at least 1 of the desired features. */ ippStsUnknownFeature = 50, /* At least one of the desired features is unknown. */ ippStsFeaturesCombination = 51 /* Wrong combination of features. */ } IppStatus; #define ippStsOk ippStsNoErr #endif /* _OWN_BLDPCS */ #ifdef __cplusplus } #endif #endif /* __IPPDEFS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippi.h000066400000000000000000000154701443134507600242630ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Image Processing // // */ #if !defined( __IPPI_H__ ) || defined( _OWN_BLDPCS ) #define __IPPI_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif /* //////////////////////////////////////////////////////////////////////////// // Name: mfxiCopy // // Purpose: copy pixel values from the source image to the destination image // // // Returns: // ippStsNullPtrErr One of the pointers is NULL // ippStsSizeErr roiSize has a field with zero or negative value // ippStsNoErr OK // // Parameters: // pSrc Pointer to the source image buffer // srcStep Step in bytes through the source image buffer // pDst Pointer to the destination image buffer // dstStep Step in bytes through the destination image buffer // roiSize Size of the ROI // pMask Pointer to the mask image buffer // maskStep Step in bytes through the mask image buffer */ IPPAPI ( IppStatus, mfxiCopy_8u_C1R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep,IppiSize roiSize )) IPPAPI ( IppStatus, mfxiCopy_16s_C1R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep,IppiSize roiSize )) IPPAPI ( IppStatus, mfxiCopy_8u_C3P3R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, IppiSize roiSize )) IPPAPI ( IppStatus, mfxiCopy_8u_C4P4R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, IppiSize roiSize )) IPPAPI ( IppStatus, mfxiCopy_16s_C3P3R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[3], int dstStep, IppiSize roiSize )) IPPAPI ( IppStatus, mfxiCopy_16s_C4P4R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[4], int dstStep, IppiSize roiSize )) /* //////////////////////////////////////////////////////////////////////////// // Name: mfxiConvert // // Purpose: Converts pixel values of an image from one bit depth to another // // Returns: // ippStsNullPtrErr One of the pointers is NULL // ippStsSizeErr roiSize has a field with zero or negative value // ippStsStepErr srcStep or dstStep has zero or negative value // ippStsNoErr OK // // Parameters: // pSrc Pointer to the source image // srcStep Step through the source image // pDst Pointer to the destination image // dstStep Step in bytes through the destination image // roiSize Size of the ROI // roundMode Rounding mode, ippRndZero or ippRndNear */ IPPAPI ( IppStatus, mfxiConvert_8u16u_C1R, (const Ipp8u* pSrc, int srcStep, Ipp16u* pDst, int dstStep, IppiSize roiSize )) IPPAPI ( IppStatus, mfxiConvert_16u8u_C1R, ( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize )) /* ///////////////////////////////////////////////////////////////////////////////////////////////// // Logical Operations and Shift Functions ///////////////////////////////////////////////////////////////////////////////////////////////// */ /* // Names: mfxiAndC // Purpose: Performs corresponding bitwise logical operation between pixels of two image // (AndC/OrC/XorC - between pixel of the source image and a constant) // // Names: mfxiLShiftC, mfxiRShiftC // Purpose: Shifts bits in each pixel value to the left and right // Parameters: // value 1) The constant value to be ANDed/ORed/XORed with each pixel of the source, // constant vector for multi-channel images; // 2) The number of bits to shift, constant vector for multi-channel images. // pSrc Pointer to the source image // srcStep Step through the source image // pSrcDst Pointer to the source/destination image (in-place flavors) // srcDstStep Step through the source/destination image (in-place flavors) // pSrc1 Pointer to first source image // src1Step Step through first source image // pSrc2 Pointer to second source image // src2Step Step through second source image // pDst Pointer to the destination image // dstStep Step in destination image // roiSize Size of the ROI // // Returns: // ippStsNullPtrErr One of the pointers is NULL // ippStsStepErr One of the step values is less than or equal to zero // ippStsSizeErr roiSize has a field with zero or negative value // ippStsShiftErr Shift's value is less than zero // ippStsNoErr No errors */ IPPAPI(IppStatus, mfxiAndC_16u_C1IR, (Ipp16u value, Ipp16u* pSrcDst, int srcDstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiZigzagInv8x8_16s_C1 // // Purpose: // Converts a natural order to zigzag in an 8x8 block (forward function), // converts a zigzag order to natural in a 8x8 block (inverse function) // // Parameter: // pSrc Pointer to the source block // pDst Pointer to the destination block // // Returns: // ippStsNoErr No errors // ippStsNullPtrErr One of the pointers is NULL // */ IPPAPI(IppStatus, mfxiZigzagInv8x8_16s_C1,(const Ipp16s* pSrc, Ipp16s* pDst)) #ifdef __cplusplus } #endif #if defined (_IPP_STDCALL_CDECL) #undef _IPP_STDCALL_CDECL #define __stdcall __cdecl #endif #endif /* __IPPI_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippj.h000066400000000000000000001463521443134507600242700ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // JPEG Processing (ippJP) // // */ #if !defined( __IPPJ_H__ ) || defined( _OWN_BLDPCS ) #define __IPPJ_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // IppiEncodeHuffmanSpec // // Purpose: // Encoder Huffman table in fast-to-use format // // Notes: // */ struct EncodeHuffmanSpec; typedef struct EncodeHuffmanSpec IppiEncodeHuffmanSpec; /* /////////////////////////////////////////////////////////////////////////// // Name: // Mfxi_DecodeHuffmanSpec // // Purpose: // Decoder Huffman table in fast-to-use format // // Notes: // */ struct DecodeHuffmanSpec; typedef struct DecodeHuffmanSpec IppiDecodeHuffmanSpec; /* /////////////////////////////////////////////////////////////////////////// // Name: // IppiEncodeHuffmanState // // Purpose: // Huffman encoder state // // Notes: // */ struct EncodeHuffmanState; typedef struct EncodeHuffmanState IppiEncodeHuffmanState; /* /////////////////////////////////////////////////////////////////////////// // Name: // Mfxi_DecodeHuffmanState // // Purpose: // Huffman decoder state // // Notes: // */ struct DecodeHuffmanState; typedef struct DecodeHuffmanState IppiDecodeHuffmanState; /* /////////////////////////////////////////////////////////////////////////// // Name: // // Purpose: // Enumerator of lossless JPEG predictors // */ enum { PRED1 = 1, PRED2 = 2, PRED3 = 3, PRED4 = 4, PRED5 = 5, PRED6 = 6, PRED7 = 7 }; /* /////////////////////////////////////////////////////////////////////////// // Huffman Encoding Functions (Baseline) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanRawTableInit_JPEG_8u // // Purpose: // Build Huffman "raw" table from counted statistics of // Huffman symbols for 8-bit precision // // Parameters: // pStatistics - pointer to array of 256 int, // with the one entry for each of possible huffman symbol. // pListBits - pointer to array of 16 bytes. // pListVals - pointer to array of 256 bytes. // // Returns: // IppStatus // // Notes: // pListBits represents list of BITS and pListVals represent list // of HUFFVAL, as specified in ISO/IEC 10918-1, Figure B.7 */ IPPAPI(IppStatus, mfxiEncodeHuffmanRawTableInit_JPEG_8u, ( const int pStatistics[256], Ipp8u* pListBits, Ipp8u* pListVals)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u // // Purpose: // get size of IppjEncodeHuffmanSpec struct // // Parameters: // size - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u, ( int* size)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanSpecInit_JPEG_8u // // Purpose: // Build Huffman table for encoder // in fast-to-use format from "raw" Huffman table // // Parameters: // pListBits - pointer to array of 16 bytes. // pListVals - pointer to array of up to 256 bytes. // pEncHuffSpec - pointer to Huffman table to be initialized // // Returns: // IppStatus // // Notes: // pListBits represents list of BITS and pListVals represent list // of HUFFVAL, as specified in ISO/IEC 10918-1, Figure B.7 */ IPPAPI(IppStatus, mfxiEncodeHuffmanSpecInit_JPEG_8u, ( const Ipp8u* pListBits, const Ipp8u* pListVals, IppiEncodeHuffmanSpec* pEncHuffSpec)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanStateInit_JPEG_8u // // Purpose: // Build EncHuffState struct for encoder // // Parameters: // pEncHuffState - pointer to EncHuffState struct to be initialized // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiEncodeHuffmanStateInit_JPEG_8u, ( IppiEncodeHuffmanState* pEncHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_JPEG_16s1u_C1 // // Purpose: // Huffman encode 8x8 block of quantized DCT coefs // // Parameters: // pSrc pointer to 8x8 block of quantized DCT coefficients // pDst pointer to output JPEG bitstream // dstLenBytes bitstream length, in bytes // pDstCurrPos pointer to current byte offset in buffer (in/out) // pLastDC pointer to last DC coefficient from previous block of // the same color component (in/out) // pEncHuffState pointer to Huffman state struct // pDcTable pointer to Huffman DC table // pAcTable pointer to Huffman AC table // bFlushState if non zero - only flush any pending bits // from IppiEncodeHuffmanState to bitstream // // Returns: // IppStatus // // Notes: // set bFlushState to 1, after processing all MCUs in scan, to // flush any pending bits from IppiEncodeHuffmanState to bitstream // Encoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex F, F.1.2 - Baseline Huffman encoding procedures. */ IPPAPI(IppStatus, mfxiEncodeHuffman8x8_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstLenBytes, int* pDstCurrPos, Ipp16s* pLastDC, const IppiEncodeHuffmanSpec* pDcTable, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_JPEG_16s_C1 // // Purpose: // Calculate statistics of huffman values // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pDcStatistics - pointer to 256 elements array // pAcStatistics - pointer to 256 elements array // pLastDC - pointer to DC coefficient from previous 8x8 block // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiGetHuffmanStatistics8x8_JPEG_16s_C1, ( const Ipp16s* pSrc, int pDcStatistics[256], int pAcStatistics[256], Ipp16s* pLastDC)) /* /////////////////////////////////////////////////////////////////////////// // Huffman Encoding Functions (Progressive) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1 // // Purpose: // Calculate statistics of huffman values, progressive coding, // first scan // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pDcStatistics - pointer to 256 elements array // pLastDC - pointer to DC coefficient from previous 8x8 block // Al - successive approximation bit position low // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1, ( const Ipp16s* pSrc, int pDcStatistics[256], Ipp16s* pLastDC, int Al)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1 // // Purpose: // Calculate statistics of huffman values, progressive coding, // first scan // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pAcStatistics - pointer to 256 elements array // Ss - start of spectral selection // Se - end of spectral selection // Al - successive approximation bit position low // pEncHuffState - huffman encoder state // bFlushState - set to 1, after processing all MCUs // to flush EOB counter // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1, ( const Ipp16s* pSrc, int pAcStatistics[256], int Ss, int Se, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1 // // Purpose: // Calculate statistics of huffman values, progressive coding, // next scans // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pAcStatistics - pointer to 256 elements array // Ss - start of spectral selection // Se - end of spectral selection // Al - successive approximation bit position low // pEncHuffState - huffman encoder state // bFlushState - set to 1, after processing all MCUs // to flush EOB counter // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1, ( const Ipp16s* pSrc, int pAcStatistics[256], int Ss, int Se, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1 // // Purpose: // huffman encode DC coefficient from 8x8 block of quantized // DCT coefficients. Progressive coding, first scan // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pDst - pointer to output bitstream // dstLenBytes - length of bitstream buffer // pDstCurrPos - corrent byte position in bitstream buffer // pLastDC - pointer to DC coefficient from previous 8x8 block // Al - successive approximation bit position low // pDcTable - pointer to DC huffman table // pEncHuffState - pointer to encoder huffman state // bFlushState - set to 1, after processing all MCUs // to flush any pending bits from state // // Returns: // IppStatus // // Notes: // Encoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.1.2 - Progressive encoding procedures with Huffman. */ IPPAPI(IppStatus, mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstLenBytes, int* pDstCurrPos, Ipp16s* pLastDC, int Al, const IppiEncodeHuffmanSpec* pDcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1 // // Purpose: // huffman encode DC coefficient from 8x8 block of quantized // DCT coefficients. Progressive coding, next scans // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pDst - pointer to output bitstream // dstLenBytes - length of bitstream // pDstCurrPos - current byte position in bitstream // Al - successive approximation bit position low // pEncHuffState - pointer to encoder huffman state // bFlushState - set to 1, after processing all MCUs // to flush any pending bits from state // // Returns: // IppStatus // // Notes: // Encoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.1.2 - Progressive encoding procedures with Huffman. */ IPPAPI(IppStatus, mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstLenBytes, int* pDstCurrPos, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1 // // Purpose: // huffman encode AC coefficients from 8x8 block of quantized // DCT coefficients. Progressive coding, first scan // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficients // pDst - pointer to output bitstream buffer // dstLenBytes - length of bitstream buffer // pDstCurrPos - current byte position in bitstream buffer // Ss - start of spectral selection // Se - end of spectral selection // Al - successive approximation bit position low // pAcTable - pointer to encoder haffman AC table // pEncHuffState - pointer encoder huffman state // bFlushState - set to 1, after processing all MCUs // to flush any pending bits from state // // Returns: // IppStatus // // Notes: // Encoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.1.2 - Progressive encoding procedures with Huffman. */ IPPAPI(IppStatus, mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1 // // Purpose: // huffman encode AC coefficients from 8x8 block of quantized // DCT coefficients. Progressive coding, next scans // // Parameters: // pSrc - pointer to 8x8 block of quantized DCT coefficeints // pDst - pointer to output bitstream buffer // dstLenBytes - length of bitstream buffer // pDstCurrPos - current byte position in bitstream buffer // Ss - start of spectral selection // Se - end of spectral selection // Al - successive approximation bit position low // pAcTable - pointer to encoder huffman AC table // pEncHuffState - pointer to encoder huffman state // bFlushState - set to 1, after processing all MCUs // to flush any pending bits from state // // Returns: // IppStatus // // Notes: // Encoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.1.2 - Progressive encoding procedures with Huffman. */ IPPAPI(IppStatus, mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Huffman Encoding Functions (Lossless) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanOne_JPEG_16s1u_C1 // // Purpose: // Huffman encode one lossless coefs // // Parameters: // pSrc pointer to input differences // pDst pointer to output JPEG bitstream // nDstLenBytes bitstream length, in bytes // pDstCurrPos pointer to current offset in buffer in bytes (in/out) // pEncHuffTable pointer to huffman lossless table // pEncHuffState pointer to Huffman state struct // bFlushState // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiEncodeHuffmanOne_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, const IppiEncodeHuffmanSpec* pEncHuffTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatisticsOne_JPEG_16s_C1 // // Purpose: // count statistics for huffman values for particular differences // // Parameters: // pSrc pointer to input differences // pHuffStatistics pointer to accumulated huffman values statistics // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiGetHuffmanStatisticsOne_JPEG_16s_C1, ( const Ipp16s* pSrc, int pHuffStatistics[256])) /* /////////////////////////////////////////////////////////////////////////// // Huffman Decoding Functions (Baseline) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u // // Purpose: // get size of IppiDecodeHuffmanSpec struct // // Parameters: // size - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u, ( int* size)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanSpecInit_JPEG_8u // // Purpose: // Build Huffman table for decoder in fast-to-use format // from "raw" Huffman table // // Parameters: // pListBits - pointer to array of 16 bytes. // pListVals - pointer to array of up to 256 bytes. // pDecHuffSpec - pointer to Huffman table to be initialized // // Returns: // IppStatus // // Notes: // pListBits represents list of BITS and pListVals represent // list of HUFFVAL, as specified in ISO/IEC 10918-1, Figure B.7 */ IPPAPI(IppStatus, mfxiDecodeHuffmanSpecInit_JPEG_8u, ( const Ipp8u* pListBits, const Ipp8u* pListVals, IppiDecodeHuffmanSpec* pDecHuffSpec)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanStateGetBufSize_JPEG_8u // // Purpose: // get size of IppiEncoderHuffmanState struct // // Parameters: // size - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiEncodeHuffmanStateGetBufSize_JPEG_8u, ( int* size)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanStateInit_JPEG_8u // // Purpose: // Build EncHuffState struct for encoder // // Parameters: // pEncHuffState - pointer to EncHuffState struct to be initialized // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiEncodeHuffmanStateInit_JPEG_8u, ( IppiEncodeHuffmanState* pEncHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanStateGetBufSize_JPEG_8u // // Purpose: // get size of IppiDecodeHuffmanState struct // // Parameters: // size - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiDecodeHuffmanStateGetBufSize_JPEG_8u, ( int* size)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanStateInit_JPEG_8u // // Purpose: // Build IppiDecodeHuffmanState struct for decoder // // Parameters: // pDecHuffState - pointer to IppiDecodeHuffmanState struct // to be initialized // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiDecodeHuffmanStateInit_JPEG_8u, ( IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_JPEG_1u16s_C1 // // Purpose: // Huffman decode 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // srcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output 8x8 block of quantized DCT coefficients // pLastDC pointer to last DC coefficients from preivious block // of the same color component // pMarker where to store marker which can be found // pDcTable pointer to huffman DC table // pAcTable pointer to huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // Decoding perform as specified in ISO/IEC 10918-1, // Appendix A - Requirements and guidelines, // Annex F, F.2.2 - Baseline Huffman Decoding procedures */ IPPAPI(IppStatus, mfxiDecodeHuffman8x8_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int srcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, const IppiDecodeHuffmanSpec* pDcTable, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4 // // Purpose: // Huffman decode row of lossless coefficents // // Parameters: // pSrc pointer to input JPEG bitstream // nSrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current offset in buffer in bytes (in/out) // pDst pointer to decoded difference // nDstLen number of mcus in row // nDstRows number of rows (actually color channels) // pMarker where to store JPEG marker // pDecHuffTable pointer to huffman table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst[4], int nDstLen, int nDstRows, int* pMarker, const IppiDecodeHuffmanSpec* pDecHuffTable[4], IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Huffman Decoding Functions (Progressive) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1 // // Purpose: // Huffman decode DC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // srcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output 8x8 block of quantized DCT coefficients // pLastDC pointer to last DC coefficients from preivious block // of the same color component // pMarker where to store JPEG marker // Al Approximation bit position low // pDcTable pointer to huffman DC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // Decoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.2 - Progressive decoding of the DCT. */ IPPAPI(IppStatus, mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int srcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, int Al, const IppiDecodeHuffmanSpec* pDcTable, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1 // // Purpose: // Refine DC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // srcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output 8x8 block of quantized DCT coefficients // pMarker where to store JPEG marker // Al Approximation bit position low // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // Decoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.2 - Progressive decoding of the DCT. */ IPPAPI(IppStatus, mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int srcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Al, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1 // // Purpose: // Huffman decode AC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // srcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output 8x8 block of quantized DCT coefficients // pMarker where to store JPEG marker // Ss spectral selection start // Se spectral selection end // Al Approximation bit position low // pAcTable pointer to huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // Decoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.2 - Progressive decoding of the DCT. */ IPPAPI(IppStatus, mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int srcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1 // // Purpose: // Refine AC coefficients of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // srcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output 8x8 block of quantized DCT coefficients // pMarker where to store JPEG marker // Ss spectral selection start // Se spectral selection end // Al Approximation bit position low // pAcTable Huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // Decoding perform as defined in ISO/IEC 10918-1. // Appendix A - Requirements and guidelines, // Annex G, G.2 - Progressive decoding of the DCT. */ IPPAPI(IppStatus, mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int srcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Huffman Decoding Functions (Lossless) /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanOne_JPEG_1u16s_C1 // // Purpose: // Huffman decode one lossless coefs // // Parameters: // pSrc pointer to input JPEG bitstream // nSrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current offset in buffer in bytes (in/out) // pDst pointer to decoded difference // pMarker where to store JPEG marker // pDecHuffTable pointer to huffman table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiDecodeHuffmanOne_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, const IppiDecodeHuffmanSpec* pDecHuffTable, IppiDecodeHuffmanState* pDecHuffState)) /* /////////////////////////////////////////////////////////////////////////// // Quantization Functions for encoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantFwdRawTableInit_JPEG_8u // // Purpose: // Adjust raw quantization table according quality factor // // Parameters: // pQuantRawTable - pointer to "raw" Quantization table // qualityFactor - JPEG quality factor (valid range 1...100) // // Returns: // IppStatus // // Notes: // "raw" quantization table is array of 64 bytes (Q0..Q63), as specified // in ISO/IEC 10918-1, Figure B.6 */ IPPAPI(IppStatus, mfxiQuantFwdRawTableInit_JPEG_8u, ( Ipp8u* pQuantRawTable, int qualityFactor)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantFwdTableInit_JPEG_8u16u // // Purpose: // Build 8-bit precision Quantization table for encoder // in fast-to-use format from "raw" Quantization table // // Parameters: // pQuantRawTable - pointer to "raw" Quantization table // pQuantFwdTable - pointer to Quantization table to be initialized // // Returns: // IppStatus // // Notes: // "raw" quantization table is array of 64 bytes (Q0..Q63), as specified // in ISO/IEC 10918-1, Figure B.6 in zigzag order */ IPPAPI(IppStatus, mfxiQuantFwdTableInit_JPEG_8u16u, ( const Ipp8u* pQuantRawTable, Ipp16u* pQuantFwdTable)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantInvTableInit_JPEG_8u16u // // Purpose: // Build Quantization table for decoder in fast-to-use format // from "raw" Quantization table // // Parameters: // pQuantRawTable - pointer to "raw" Quantization table // pQuantInvTable - pointer to Quantization table to be initialized // // Returns: // IppStatus // // Notes: // "raw" quantization table is array of 64 bytes (Q0..Q63), as specified // in ISO/IEC 10918-1, Figure B.6 in zigzag order */ IPPAPI(IppStatus, mfxiQuantInvTableInit_JPEG_8u16u, ( const Ipp8u* pQuantRawTable, Ipp16u* pQuantInvTable)) /* /////////////////////////////////////////////////////////////////////////// // Functions for color conversion for encoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToYCbCr_JPEG_8u_P3R // // Purpose: // RGB to YCbCr color conversion // // Parameter: // pSrcRGB pointer to pointers to the input data. // pSrc[0] is pointer to RR..RR plane // pSrc[1] is pointer to GG..GG plane, and // pSrc[2] is pointer to BB..BB plane // srcStep line offset in input data // pDstYCbCr pointer to pointers to the output data. // pDst[0] is pointer to YY..YY plane // pDst[1] is pointer to CbCb..CbCb plane, and // pDst[2] is pointer to CrCr..CrCr plane // dstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128 */ IPPAPI(IppStatus, mfxiRGBToYCbCr_JPEG_8u_P3R, ( const Ipp8u* pSrcRGB[3], int srcStep, Ipp8u* pDstYCbCr[3], int dstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToY_JPEG_8u_C3C1R // mfxiBGRToY_JPEG_8u_C3C1R // // Purpose: // RGB to Y color conversion // // Parameter: // pSrcRGB pointer to the input data RGBRGB...RGBRGB // srcStep line offset in input data // pDstY pointer to the output data YY..YY // dstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // Y = 0.299*R + 0.587*G + 0.114*B // */ IPPAPI(IppStatus, mfxiRGBToY_JPEG_8u_C3C1R, ( const Ipp8u* pSrcRGB, int srcStep, Ipp8u* pDstY, int dstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToYCbCr_JPEG_8u_C3P3R // mfxiBGRToYCbCr_JPEG_8u_C3P3R // // Purpose: // RGB(BGR) to YCbCr color conversion // // Parameter: // pSrcRGB pointer to input data RGBRGB..RGBRGB // srcStep line offset in input data // pDstYCbCr pointer to pointers to the output data. // pDstYCbCr[0] is pointer to YY..YY plane // pDstYCbCr[1] is pointer to CbCb..CbCb plane, and // pDstYCbCr[2] is pointer to CrCr..CrCr plane // dstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128 */ IPPAPI(IppStatus, mfxiRGBToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* pSrcRGB, int srcStep, Ipp8u* pDstYCbCr[3], int dstStep, IppiSize roiSize)) IPPAPI(IppStatus, mfxiBGRToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* pSrcBGR, int srcStep, Ipp8u* pDstYCbCr[3], int dstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToYCbCr_JPEG_8u_C4P3R // // Purpose: // RGBA/BGRA to YCbCr color conversion (ignore alpha channel) // // Parameter: // pSrcRGBA pointer to input data RGBARGBA..RGBARGBA // srcStep line offset in input data // pDstYCbCr pointer to pointers to the output data. // pDstYCbCr[0] is pointer to YY..YY plane // pDstYCbCr[1] is pointer to CbCb..CbCb plane, and // pDstYCbCr[2] is pointer to CrCr..CrCr plane // dstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128 */ IPPAPI(IppStatus,mfxiRGBToYCbCr_JPEG_8u_C4P3R,( const Ipp8u* pRGBA, int srcStep, Ipp8u* pYCbCr[3], int dstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiCMYKToYCCK_JPEG_8u_C4P4R // // Purpose: // CMYK to YCCK color conversion // // Parameter: // pSrcCMYK pointer to input data CMYKCMYK..CMYKCMYK // srcStep line offset in input data // pDstYCCK pointer to pointers to output arrays // pDst[0] is pointer to YY..YY plane // pDst[1] is pointer to CC..CC plane, and // pDst[2] is pointer to CC..CC plane // pDst[3] is pointer to KK..KK plane // dstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // This version handles Adobe-style CMYK->YCCK conversion, // where R = 1-C, G = 1-M, and B = 1-Y are converted to YCbCr, // while K (black) channel is unchanged. */ IPPAPI(IppStatus, mfxiCMYKToYCCK_JPEG_8u_C4P4R, ( const Ipp8u* pSrcCMYK, int srcStep, Ipp8u* pDstYCCK[4], int dstStep, IppiSize roiSize)) /* /////////////////////////////////////////////////////////////////////////// // Downsampling functions for encoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownH2V1_JPEG_8u_C1R // // Purpose: // Sample down by horizontal 2:1 // // Parameters: // pSrc - pointer to source data to be sampled down // srcStep - line offset in input data // srcSize - ROI size // pDst - pointer to sampled down output data // dstStep - line offset in input data // dstSize - ROI size // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiSampleDownH2V1_JPEG_8u_C1R, ( const Ipp8u* pSrc, int srcStep, IppiSize srcRoiSize, Ipp8u* pDst, int dstStep, IppiSize dstRoiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownH2V2_JPEG_8u_C1R // // Purpose: // Sample down by horizontal 2:1 and vertical 2:1 // // Parameters: // pSrc - pointer to source data to be sampled down // srcStep - line offset in input data // srcSize - ROI size // pDst - pointer to sampled down output data // dstStep - line offset in input data // dstSize - ROI size // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiSampleDownH2V2_JPEG_8u_C1R, ( const Ipp8u* pSrc, int srcStep, IppiSize srcRoiSize, Ipp8u* pDst, int dstStep, IppiSize dstRoiSize)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownRowH2V1_Box_JPEG_8u_C1 // // Purpose: // Sample down by horizontal 2:1 // // Parameters: // pSrc - pointer to source row // srcWidth - width of source row // pDst - pointer to sampled down output row // // Returns: // IppStatus // // Notes: // Downsampling is performed as simple "Box" filter */ IPPAPI(IppStatus, mfxiSampleDownRowH2V1_Box_JPEG_8u_C1, ( const Ipp8u* pSrc, int srcWidth, Ipp8u* pDst)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownRowH2V2_Box_JPEG_8u_C1 // // Purpose: // Sample down by horizontal 2:1 and vertical 2:1 // // Parameters: // pSrc1 - pointer to the source row // pSrc2 - pointer to the next(adjacent) row // srcWidth - width of source rows // pDst - pointer to sampled down output row // // Returns: // IppStatus // // Notes: // Downsampling is performed as simple "Box" filter */ IPPAPI(IppStatus, mfxiSampleDownRowH2V2_Box_JPEG_8u_C1, ( const Ipp8u* pSrc1, const Ipp8u* pSrc2, int srcWidth, Ipp8u* pDst)) /* /////////////////////////////////////////////////////////////////////////// // Upsampling functions for decoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1 // // Purpose: // sample up horizontally 1:2 // // Parameters: // pSrc - pointer to the source row // srcWidth - width of source row // pDst - pointer to sampled up output row // // Returns: // IppStatus // // Notes: // Triangle filter used there (3/4 * nearer pixel + 1/4 * further pixel) */ IPPAPI(IppStatus, mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1, ( const Ipp8u* pSrc, int srcWidth, Ipp8u* pDst)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1 // // Purpose: // sample up horizontally 1:2 and vertically 1:2 // // Parameters: // pSrc1 - pointer to the source row // pSrc2 - pointer to the next(adjacent) source row // srcWidth - width of source rows // pDst - pointer to sampled up output row // // Returns: // IppStatus // // Notes: // Triangle filter used there (3/4 * nearer pixel + 1/4 * further pixel), */ IPPAPI(IppStatus, mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1, ( const Ipp8u* pSrc1, const Ipp8u* pSrc2, int srcWidth, Ipp8u* pDst)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiYCbCrToBGR_JPEG_8u_P3C4R // // Purpose: // YCbCr to RGBA/BGRA color conversion with filling alpha channel by // specified value // // Parameter: // pRGB pointer to RGB color space // srcStep line offset in RGB color space // pYCbCr pointer to pointers to the YCbCr data. // pYCC[0] is pointer to YY..YY plane // pYCC[1] is pointer to CbCb..CbCb plane, and // pYCC[2] is pointer to CrCr..CrCr plane // dstStep line offset in YCbCr color space // roiSize ROI size // aval alpha value // // Returns: // IppStatus // // Notes: // R = Y + 1.40200*Cr - 179.456 // G = Y - 0.34414*Cb - 0.71414*Cr + 135.45984 // B = Y + 1.77200*Cb - 226.816 */ IPPAPI(IppStatus,mfxiYCbCrToBGR_JPEG_8u_P3C4R,( const Ipp8u* pYCbCr[3], int srcStep, Ipp8u* pBGR, int dstStep, IppiSize roiSize, Ipp8u aval)) /* /////////////////////////////////////////////////////////////////////////// // DCT + Quantization + Level Shift Functions for encoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R // // Purpose: // Forward DCT transform, quantization and level shift // // Parameter: // pSrc - pointer to source color component data // srcStep - line offset for source data // pDst - pointer to output 8x8 block // of quantized DCT coefficients // pQuantFwdTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // DCT is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.3 FDCT and IDCT. // Quantization is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, // Annex A, A.3.4 DCT coefficient quantization and dequantization. // Level Shift is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.1 - Level Shift. */ IPPAPI(IppStatus, mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R, ( const Ipp8u* pSrc, int srcStep, Ipp16s* pDst, const Ipp16u* pQuantFwdTable)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R // // Purpose: // Forward DCT transform, quantization and level shift // for 12-bit data // // Parameter: // pSrc - pointer to source color component data // srcStep - line offset for source data // pDst - pointer to output 8x8 block // of quantized DCT coefficients // pQuantFwdTable - pointer to Quantization table // // Returns: // IppStatus */ IPPAPI(IppStatus, mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R, ( const Ipp16u* pSrc, int srcStep, Ipp16s* pDst, const Ipp32f* pQuantFwdTable)) /* /////////////////////////////////////////////////////////////////////////// // DCT + Dequantization + Level Shift Functions for decoder /////////////////////////////////////////////////////////////////////////// */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform, de-quantization and level shift for // 1) the whole 8x8 block // 2) top-left 4x4 quadrant, in case when rest of coefs are zero // 3) top-left 2x2 part of 8x8 block, in case when rest of coefs are zero // 4) only DC coef is not zero in 8x8 block // // // Parameter: // pSrc - pointer to input 8x8 block of quantized DCT coefficients // pDst - pointer to output color component data // dstStep - line offset for destination data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // DCT is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.3 FDCT and IDCT. // Quantization is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, // Annex A, A.3.4 DCT coefficient quantization and dequantization. // Level Shift is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.1 - Level Shift. */ IPPAPI(IppStatus, mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) IPPAPI(IppStatus, mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) IPPAPI(IppStatus, mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) IPPAPI(IppStatus, mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform, de-quantization and level shift and // DCT downsampling for 1/2 and 1/4 scale factor // // // Parameter: // pSrc - pointer to input 8x8 block of quantized DCT coefficients // pDst - pointer to output color component data // dstStep - line offset for destination data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // DCT is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.3 FDCT and IDCT. // Quantization is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, // Annex A, A.3.4 DCT coefficient quantization and dequantization. // Level Shift is defined in ISO/IEC 10918-1, // Appendix A - Requrements and guidelines, Annex A, A.3.1 - Level Shift. */ IPPAPI(IppStatus, mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) IPPAPI(IppStatus, mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R // // Purpose: // Inverse DCT transform, de-quantization and level shift // for 12-bit data // // Parameter: // pSrc - pointer to input 8x8 block of quantized DCT coefficients // pDst - pointer to output color component data // dstStep - line offset for destination data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus */ IPPAPI(IppStatus, mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R, ( const Ipp16s* pSrc, Ipp16u* pDst, int dstStep, const Ipp32f* pQuantInvTable)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiReconstructPredRow_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc - pointer to input row of differences // pPrevRow - pointer to previous row of reconstructed samples // pDst - pointer to output row of samples // width - width, in elements // predictor - predictor // Pt - point transform parameter // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiReconstructPredRow_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width, int predictor)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiReconstructPredFirstRow_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc - pointer to input row of differences // pDst - pointer to output row of samples // width - width, in elements // P - precision of samples, in bits // Pt - point transform parameter // // Returns: // IppStatus // // Notes: // */ IPPAPI(IppStatus, mfxiReconstructPredFirstRow_JPEG_16s_C1, ( const Ipp16s* pSrc, Ipp16s* pDst, int width, int P, int Pt)) #ifdef __cplusplus } #endif #if defined (_IPP_STDCALL_CDECL) #undef _IPP_STDCALL_CDECL #define __stdcall __cdecl #endif #endif /* __IPPJ_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ipps.h000066400000000000000000000163121443134507600242710ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Signal Processing (ippSP) // // */ #if !defined( __IPPS_H__ ) || defined( _OWN_BLDPCS ) #define __IPPS_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif /* ///////////////////////////////////////////////////////////////////////////// // Vector Initialization functions ///////////////////////////////////////////////////////////////////////////// */ /* ///////////////////////////////////////////////////////////////////////////// // Name: mfxsCopy // Purpose: copy data from source to destination vector // Parameters: // pSrc pointer to the input vector // pDst pointer to the output vector // len length of the vectors, number of items // Return: // ippStsNullPtrErr pointer(s) to the data is NULL // ippStsSizeErr length of the vectors is less or equal zero // ippStsNoErr otherwise */ IPPAPI(IppStatus, mfxsCopy_8u,( const Ipp8u* pSrc, Ipp8u* pDst, int len )) IPPAPI(IppStatus, mfxsCopy_16s,( const Ipp16s* pSrc, Ipp16s* pDst, int len )) /* ///////////////////////////////////////////////////////////////////////////// // Name: mfxsZero // Purpose: set elements of the vector to zero of corresponding type // Parameters: // pDst pointer to the destination vector // len length of the vectors // Return: // ippStsNullPtrErr pointer to the vector is NULL // ippStsSizeErr length of the vectors is less or equal zero // ippStsNoErr otherwise */ IPPAPI ( IppStatus, mfxsZero_8u,( Ipp8u* pDst, int len )) IPPAPI ( IppStatus, mfxsZero_16s,( Ipp16s* pDst, int len )) /* ///////////////////////////////////////////////////////////////////////////// // Vector logical functions ///////////////////////////////////////////////////////////////////////////// */ /* //////////////////////////////////////////////////////////////////////////// // Names: mfxsLShiftC // Purpose: logical operations and vector shifts // Parameters: // val 1) value to be ANDed/ORed/XORed with each element of the vector (And, Or, Xor); // 2) position`s number which vector elements to be SHIFTed on (ShiftC) // pSrc pointer to input vector // pSrcDst pointer to input/output vector // pSrc1 pointer to first input vector // pSrc2 pointer to second input vector // pDst pointer to output vector // len vector's length // Return: // ippStsNullPtrErr pointer(s) to the data is NULL // ippStsSizeErr vector`s length is less or equal zero // ippStsShiftErr shift`s value is less zero // ippStsNoErr otherwise */ IPPAPI(IppStatus, mfxsLShiftC_16s, (const Ipp16s* pSrc, int val, Ipp16s* pDst, int len)) /* ///////////////////////////////////////////////////////////////////////////// // Arithmetic functions ///////////////////////////////////////////////////////////////////////////// */ /* //////////////////////////////////////////////////////////////////////////// // Names: mfxsMul // // Purpose: add, subtract and multiply operations upon every element of // the source vector // Arguments: // pSrc pointer to the source vector // pSrcDst pointer to the source/destination vector // pSrc1 pointer to the first source vector // pSrc2 pointer to the second source vector // pDst pointer to the destination vector // len length of the vectors // scaleFactor scale factor value // Return: // ippStsNullPtrErr pointer(s) to the data is NULL // ippStsSizeErr length of the vectors is less or equal zero // ippStsNoErr otherwise // Note: // AddC(X,v,Y) : Y[n] = X[n] + v // MulC(X,v,Y) : Y[n] = X[n] * v // SubC(X,v,Y) : Y[n] = X[n] - v // SubCRev(X,v,Y) : Y[n] = v - X[n] // Sub(X,Y) : Y[n] = Y[n] - X[n] // Sub(X,Y,Z) : Z[n] = Y[n] - X[n] */ IPPAPI(IppStatus, mfxsMul_16s_I, (const Ipp16s* pSrc, Ipp16s* pSrcDst, int len)) /* //////////////////////////////////////////////////////////////////////////// // Name: mfxsDiv // // Purpose: divide every element of the source vector by the scalar value // or by corresponding element of the second source vector // Arguments: // val the divisor value // pSrc pointer to the divisor source vector // pSrc1 pointer to the divisor source vector // pSrc2 pointer to the dividend source vector // pDst pointer to the destination vector // pSrcDst pointer to the source/destination vector // len vector's length, number of items // scaleFactor scale factor parameter value // Return: // ippStsNullPtrErr pointer(s) to the data vector is NULL // ippStsSizeErr length of the vector is less or equal zero // ippStsDivByZeroErr the scalar divisor value is zero // ippStsDivByZero Warning status if an element of divisor vector is // zero. If the dividend is zero than result is // NaN, if the dividend is not zero than result // is Infinity with correspondent sign. The // execution is not aborted. For the integer operation // zero instead of NaN and the corresponding bound // values instead of Infinity // ippStsNoErr otherwise // Note: // DivC(v,X,Y) : Y[n] = X[n] / v // DivC(v,X) : X[n] = X[n] / v // Div(X,Y) : Y[n] = Y[n] / X[n] // Div(X,Y,Z) : Z[n] = Y[n] / X[n] */ IPPAPI(IppStatus, mfxsDivCRev_16u_I, (Ipp16u val, Ipp16u* pSrcDst, int len)) #ifdef __cplusplus } #endif #endif /* __IPPS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/ippvc.h000066400000000000000000000105421443134507600244360ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Video Coding (ippVC) // // */ #if !defined( __IPPVC_H__ ) || defined( _OWN_BLDPCS ) #define __IPPVC_H__ #if defined (_WIN32_WCE) && defined (_M_IX86) && defined (__stdcall) #define _IPP_STDCALL_CDECL #undef __stdcall #endif #ifndef __IPPDEFS_H__ #include "ippdefs.h" #endif #ifdef __cplusplus extern "C" { #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDeinterlaceFilterTriangle_8u_C1R // // Purpose: // This function deinterlaces video plane. // The function performs triangle filtering of the image to remove interlacing // flicker effect that arises when analogue interlaced TV data is // viewed on a computer monitor. // // Parameters: // pSrc Pointer to the source video plane. // srcStep Step through the source video plane. // pDst Pointer to the destination video plane. // dstStep Step through the destination video plane. // roiSize Size of ROI. Height should be greater than 3. // centerWeight Weight of filtered pixel, must lie within the range from 0 to 256. // layout Plane layout, required when the plane is only a part of the frame. // Takes the following values: // IPP_UPPER for the first slice // IPP_CENTER for the middle slices // IPP_LOWER for the last slice // IPP_LOWER && IPP_UPPER && IPP_CENTER for the image that is not sliced. // // Returns: // ippStsNoErr Indicates no error. // ippStsNullPtrErr Indicates an error when at least one input pointer is NULL. // ippStsSizeErr Indicates an error when roiSize has a field with zero or negative value. // ippStsBadArgErr Indicates invalid argument. */ IPPAPI(IppStatus, mfxiDeinterlaceFilterTriangle_8u_C1R, ( const Ipp8u* pSrc, Ipp32s srcStep, Ipp8u* pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32u centerWeight, Ipp32u layout)) /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRangeMapping_VC1_8u_C1R // // Purpose: // Performs range map transformation according to VC-1 standard (6.2.15.1) // // Parameters: // pSrc - the pointer to the source block. Block coefficient could be in the range [0, 255] // srcStep - the step of the source block // pDst - the pointer to the destination block. // dstStep - the step of the destination block // rangeMapParam - parameter for range map. It should be in the range [0, 7]. // roiSize - size of source block. // // Returns: // ippStsNoErr No error. // ippStsNullPtrErr At least one input pointer is NULL // ippStsOutOfRangeErr Indicates an error if rangeMapParam is out of the range [0,7]. */ IPPAPI(IppStatus, mfxiRangeMapping_VC1_8u_C1R ,(Ipp8u* pSrc, Ipp32s srcStep, Ipp8u* pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32s rangeMapParam)) #if defined __cplusplus } #endif #if defined (_IPP_STDCALL_CDECL) #undef _IPP_STDCALL_CDECL #define __stdcall __cdecl #endif #endif /* __IPPVC_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/include/owndefs.h000066400000000000000000000420161443134507600247630ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNDEFS_H__ #define __OWNDEFS_H__ #if defined( _VXWORKS ) #include #undef NONE #endif #include "ippdefs.h" #if defined(__ICC) || defined(__ECC) || defined( __ICL ) || defined ( __ECL ) || defined(_MSC_VER) #define __INLINE static __inline #elif defined( __GNUC__ ) #define __INLINE static __inline__ #else #define __INLINE static #endif #if defined(__ICC) || defined(__ECC) || defined( __ICL ) || defined ( __ECL ) #define __RESTRICT restrict #elif !defined( __RESTRICT ) #define __RESTRICT #endif #if defined( IPP_W32DLL ) #if defined( _MSC_VER ) || defined( __ICL ) || defined ( __ECL ) #define IPPFUN(type,name,arg) __declspec(dllexport) type __STDCALL name arg #else #define IPPFUN(type,name,arg) extern type __STDCALL name arg #endif #else #define IPPFUN(type,name,arg) extern type __STDCALL name arg #endif #if !defined ( _IA64) && (defined ( _WIN64 ) || defined( linux64 )) #define _IA64 #endif //structure represeting 128 bit unsigned integer type typedef struct{ Ipp64u low; Ipp64u high; }Ipp128u; #define _IPP_PX 0 #define _IPP_M6 1 #define _IPP_A6 2 #define _IPP_W7 4 #define _IPP_T7 8 #define _IPP_V8 16 #define _IPP_P8 32 #define _IPP_G9 64 #define _IPP_H9 128 #define _IPPXSC_PX 0 #define _IPPXSC_S1 1 #define _IPPXSC_S2 2 #define _IPPXSC_C2 4 #define _IPPLRB_PX 0 #define _IPPLRB_B1 1 #define _IPPLRB_B2 2 #define _IPP64_PX _IPP_PX #define _IPP64_I7 64 #define _IPP32E_PX _IPP_PX #define _IPP32E_M7 32 #define _IPP32E_U8 64 #define _IPP32E_Y8 128 #define _IPP32E_E9 256 #define _IPP32E_L9 512 #define _IPPLP32_PX _IPP_PX #define _IPPLP32_S8 1 #define _IPPLP64_PX _IPP_PX #define _IPPLP64_N8 1 #if defined(__ICC) || defined(__ECC) || defined( __ICL ) || defined ( __ECL ) || (_MSC_VER >= 1300) #define __ALIGN8 __declspec (align(8)) #define __ALIGN16 __declspec (align(16)) #define __ALIGN32 __declspec (align(32)) #define __ALIGN64 __declspec (align(64)) #else #define __ALIGN8 #define __ALIGN16 #define __ALIGN32 #define __ALIGN64 #endif #if defined ( _M6 ) #define _IPP _IPP_M6 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _A6 ) #define _IPP _IPP_A6 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _W7 ) #define _IPP _IPP_W7 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _T7 ) #define _IPP _IPP_T7 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _V8 ) #define _IPP _IPP_V8 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _P8 ) #define _IPP _IPP_P8 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _G9 ) #define _IPP _IPP_G9 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _H9 ) #define _IPP _IPP_H9 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _M7 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_M7 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _U8 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_U8 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _Y8 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_Y8 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _E9 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_E9 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _L9 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_L9 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _I7 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_I7 #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _B1 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_B1 #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _B2 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_B2 #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _S8 ) #define _IPP _IPP_V8 #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_S8 #define _IPPLP64 _IPPLP64_PX #elif defined( _N8 ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_U8 #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_N8 #elif defined( _StrongARM ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_S1 #define _PX /* This string must be removed after migation period */ #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _XScale ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_S2 #define _PX /* This string must be removed after migation period */ #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #elif defined( _XScale_Concan ) #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_C2 #define _PX /* This string must be removed after migation period */ #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #else #define _IPP _IPP_PX #define _IPP64 _IPP64_PX #define _IPP32E _IPP32E_PX #define _IPPXSC _IPPXSC_PX #define _IPPLRB _IPPLRB_PX #define _IPPLP32 _IPPLP32_PX #define _IPPLP64 _IPPLP64_PX #endif #define _IPP_ARCH_IA32 1 #define _IPP_ARCH_IA64 2 #define _IPP_ARCH_EM64T 4 #define _IPP_ARCH_XSC 8 #define _IPP_ARCH_LRB 16 #define _IPP_ARCH_LP32 32 #define _IPP_ARCH_LP64 64 #define _IPP_ARCH_LRB2 128 #if defined ( _ARCH_IA32 ) #define _IPP_ARCH _IPP_ARCH_IA32 #elif defined( _ARCH_IA64 ) #define _IPP_ARCH _IPP_ARCH_IA64 #elif defined( _ARCH_EM64T ) #define _IPP_ARCH _IPP_ARCH_EM64T #elif defined( _ARCH_XSC ) #define _IPP_ARCH _IPP_ARCH_XSC #elif defined( _ARCH_LRB ) #define _IPP_ARCH _IPP_ARCH_LRB #elif defined( _ARCH_LRB2 ) #define _IPP_ARCH _IPP_ARCH_LRB2 #elif defined( _ARCH_LP32 ) #define _IPP_ARCH _IPP_ARCH_LP32 #elif defined( _ARCH_LP64 ) #define _IPP_ARCH _IPP_ARCH_LP64 #else #if defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) #define _IPP_ARCH _IPP_ARCH_EM64T #elif defined(_M_IA64) || defined(__ia64) || defined(__ia64__) #define _IPP_ARCH _IPP_ARCH_IA64 #elif defined(_M_ARM) || defined(_ARM_) || defined(ARM) || defined(__arm__) #define _IPP_ARCH _IPP_ARCH_XSC #else #define _IPP_ARCH _IPP_ARCH_IA32 #endif #endif #if ((_IPP_ARCH == _IPP_ARCH_IA32) || (_IPP_ARCH == _IPP_ARCH_XSC) || (_IPP_ARCH == _IPP_ARCH_LP32)) __INLINE Ipp32s IPP_INT_PTR( const void* ptr ) { union { void* Ptr; Ipp32s Int; } dd; dd.Ptr = (void*)ptr; return dd.Int; } __INLINE Ipp32u IPP_UINT_PTR( const void* ptr ) { union { void* Ptr; Ipp32u Int; } dd; dd.Ptr = (void*)ptr; return dd.Int; } #elif ((_IPP_ARCH == _IPP_ARCH_IA64) || (_IPP_ARCH == _IPP_ARCH_EM64T) || (_IPP_ARCH == _IPP_ARCH_LRB) || (_IPP_ARCH == _IPP_ARCH_LRB2) || (_IPP_ARCH == _IPP_ARCH_LP64)) __INLINE Ipp64s IPP_INT_PTR( const void* ptr ) { union { void* Ptr; Ipp64s Int; } dd; dd.Ptr = (void*)ptr; return dd.Int; } __INLINE Ipp64u IPP_UINT_PTR( const void* ptr ) { union { void* Ptr; Ipp64u Int; } dd; dd.Ptr = (void*)ptr; return dd.Int; } #else #define IPP_INT_PTR( ptr ) ( (long)(ptr) ) #define IPP_UINT_PTR( ptr ) ( (unsigned long)(ptr) ) #endif #define IPP_BYTES_TO_ALIGN(ptr, align) ((-(IPP_INT_PTR(ptr)&((align)-1)))&((align)-1)) #define IPP_ALIGNED_PTR(ptr, align) (void*)( (unsigned char*)(ptr) + (IPP_BYTES_TO_ALIGN( ptr, align )) ) #define IPP_MALLOC_ALIGNED_BYTES 64 #if defined( __cplusplus ) extern "C" { #endif /* ///////////////////////////////////////////////////////////////////////////// Helpers /////////////////////////////////////////////////////////////////////////// */ #define IPP_NOERROR_RET() return ippStsNoErr #define IPP_ERROR_RET( ErrCode ) return (ErrCode) #ifdef _IPP_DEBUG #define IPP_BADARG_RET( expr, ErrCode )\ {if (expr) { IPP_ERROR_RET( ErrCode ); }} #else #define IPP_BADARG_RET( expr, ErrCode ) #endif #define IPP_BAD_SIZE_RET( n )\ IPP_BADARG_RET( (n)<=0, ippStsSizeErr ) #define IPP_BAD_STEP_RET( n )\ IPP_BADARG_RET( (n)<=0, ippStsStepErr ) #define IPP_BAD_PTR1_RET( ptr )\ IPP_BADARG_RET( NULL==(ptr), ippStsNullPtrErr ) #define IPP_BAD_PTR2_RET( ptr1, ptr2 )\ IPP_BADARG_RET(((NULL==(ptr1))||(NULL==(ptr2))), ippStsNullPtrErr) #define IPP_BAD_PTR3_RET( ptr1, ptr2, ptr3 )\ IPP_BADARG_RET(((NULL==(ptr1))||(NULL==(ptr2))||(NULL==(ptr3))),\ ippStsNullPtrErr) #define IPP_BAD_PTR4_RET( ptr1, ptr2, ptr3, ptr4 )\ {IPP_BAD_PTR2_RET( ptr1, ptr2 ); IPP_BAD_PTR2_RET( ptr3, ptr4 )} #define IPP_BAD_ISIZE_RET(roi) \ IPP_BADARG_RET( ((roi).width<=0 || (roi).height<=0), ippStsSizeErr) /* ////////////////////////////////////////////////////////////////////////// */ /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif #define UNREFERENCED_PARAMETER(p) (p)=(p) #if defined( _IPP_MARK_LIBRARY ) static char G[] = {73, 80, 80, 71, 101, 110, 117, 105, 110, 101, 243, 193, 210, 207, 215}; #endif #define STR2(x) #x #define STR(x) STR2(x) #define MESSAGE( desc )\ message(__FILE__ "(" STR(__LINE__) "):" #desc) /* ////////////////////////////////////////////////////////////////////////// */ /* intrinsics */ #if (_IPPXSC >= _IPPXSC_C2) #if defined(__INTEL_COMPILER) #include "mmintrin.h" #endif #elif (_IPP64 >= _IPP64_I7) #if defined(__INTEL_COMPILER) // #define _SSE2_INTEGER_FOR_ITANIUM #include "ia64intrin.h" #include "emmintrin.h" #endif #elif (_IPP >= _IPP_A6) || (_IPP32E >= _IPP32E_M7) #if defined(__INTEL_COMPILER) || (_MSC_VER >= 1300) #if (_IPP == _IPP_A6) #include "xmmintrin.h" #elif (_IPP == _IPP_W7) #if defined(__INTEL_COMPILER) #include "emmintrin.h" #else #undef _W7 #include "emmintrin.h" #define _W7 #endif #define _mm_loadu _mm_loadu_si128 #elif (_IPP == _IPP_T7) || (_IPP32E == _IPP32E_M7) #if defined(__INTEL_COMPILER) #include "pmmintrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER >= 140050110) #include "intrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER < 140050110) #include "emmintrin.h" #define _mm_loadu _mm_loadu_si128 #endif #elif (_IPP == _IPP_V8) || (_IPP32E == _IPP32E_U8) #if defined(__INTEL_COMPILER) #include "tmmintrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER >= 140050110) #include "intrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER < 140050110) #include "emmintrin.h" #define _mm_loadu _mm_loadu_si128 #endif #elif (_IPP == _IPP_P8) || (_IPP32E == _IPP32E_Y8) #if defined(__INTEL_COMPILER) #include "smmintrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER >= 140050110) #include "intrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER < 140050110) #include "emmintrin.h" #define _mm_loadu _mm_loadu_si128 #endif #elif (_IPP >= _IPP_G9) || (_IPP32E >= _IPP32E_E9) #if defined(__INTEL_COMPILER) #include "immintrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER >= 160021003) #include "immintrin.h" #define _mm_loadu _mm_lddqu_si128 #endif #endif #endif #elif (_IPPLP32 >= _IPPLP32_S8) || (_IPPLP64 >= _IPPLP64_N8) #if defined(__INTEL_COMPILER) #include "tmmintrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER >= 140050110) #include "intrin.h" #define _mm_loadu _mm_lddqu_si128 #elif (_MSC_FULL_VER < 140050110) #include "emmintrin.h" #define _mm_loadu _mm_loadu_si128 #endif #elif (_IPPLRB >= _IPPLRB_B1) #if defined(__INTEL_COMPILER) || defined(_REF_LIB) #include "immintrin.h" #endif #if defined (_REF_LIB) extern void lmmintrin_init(void); #endif #endif // **** intrinsics for bit casting **** //unsigned int __intel_castf32_u32(float) //float __intel_castu32_f32(unsigned int) //unsigned __int64 __intel_castf64_u64(double) //double __intel_castu64_f64(unsigned __int64) #if defined(__ICC) || defined(__ECC) || defined( __ICL ) || defined ( __ECL ) #define __CAST_32f32u(val) __intel_castf32_u32((Ipp32f)val) #define __CAST_32u32f(val) __intel_castu32_f32((Ipp32u)val) #else #define __CAST_32f32u(val) ( *((Ipp32u*)&val) ) #define __CAST_32u32f(val) ( *((Ipp32f*)&val) ) #endif #if defined(__INTEL_COMPILER) #define __IVDEP ivdep #else #define __IVDEP message("message :: 'ivdep' is not defined") #endif //usage: #pragma __IVDEP /* ////////////////////////////////////////////////////////////////////////// */ #if (((_IPP > _IPP_PX) || (_IPP32E > _IPP32E_PX) || \ (_IPPLP32 > _IPPLP32_PX) || (_IPPLP64 > _IPPLP64_PX) || \ (_IPP64 > _IPP64_PX) || (_IPPLRB > _IPPLRB_PX)) && defined(_MERGED_BLD)) #define _NOT_PX_MERGED_BLD #endif /* ////////////////////////////////////////////////////////////////////////// */ /* header depended on the architecture */ #ifndef __DEPENDENCESP_H__ #include "dependencesp.h" #endif #ifndef __DEPENDENCEIP_H__ #include "dependenceip.h" #endif #if defined( __cplusplus ) } #endif #endif /* __OWNDEFS_H__ */ /* //////////////////////// End of file "owndefs.h" ///////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/000077500000000000000000000000001443134507600223065ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/000077500000000000000000000000001443134507600244335ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pcccopym7as.s000066400000000000000000000140461443134507600270540ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownccCopy_8u_C1_M7 mfxownccCopy_8u_C1_M7: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 mov %edx, %edx mov %ecx, %ecx cmp $(64), %rdx jl LShort8Copy8uC1_00gas_1 test $(15), %rsi jz LLoopCopy8uC1_00gas_1 lddqu (%rdi), %xmm0 mov %rsi, %rbx and $(15), %rbx movdqu %xmm0, (%rsi) sub $(16), %rbx sub %rbx, %rdi sub %rbx, %rsi add %rbx, %rdx cmp $(64), %rdx jl LShort8Copy8uC1_00gas_1 LLoopCopy8uC1_00gas_1: sub $(64), %rdx test %rcx, %rcx jnz LLoopCopyNt8uC1_01gas_1 LLoopCopy8uC1_10gas_1: test $(7), %rdi jnz LLoopNACopy8uC1_01gas_1 test $(8), %rdi jnz LLoop80Copy8uC1_01gas_1 LLoop00Copy8uC1_01gas_1: movdqa (%rdi), %xmm0 movdqa %xmm0, (%rsi) movdqa (16)(%rdi), %xmm0 movdqa %xmm0, (16)(%rsi) movdqa (32)(%rdi), %xmm0 movdqa %xmm0, (32)(%rsi) movdqa (48)(%rdi), %xmm0 add $(64), %rdi movdqa %xmm0, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LLoop00Copy8uC1_01gas_1 add $(64), %rdx jz LExitCopy8uC1_00gas_1 jmp LShort8Copy8uC1_00gas_1 LLoop80Copy8uC1_01gas_1: movq (%rdi), %xmm0 movq (8)(%rdi), %xmm1 punpcklqdq %xmm1, %xmm0 movdqa %xmm0, (%rsi) movq (16)(%rdi), %xmm0 movq (24)(%rdi), %xmm1 punpcklqdq %xmm1, %xmm0 movdqa %xmm0, (16)(%rsi) movq (32)(%rdi), %xmm0 movq (40)(%rdi), %xmm1 punpcklqdq %xmm1, %xmm0 movdqa %xmm0, (32)(%rsi) movq (48)(%rdi), %xmm0 movq (56)(%rdi), %xmm1 add $(64), %rdi punpcklqdq %xmm1, %xmm0 movdqa %xmm0, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LLoop80Copy8uC1_01gas_1 add $(64), %rdx jz LExitCopy8uC1_00gas_1 jmp LShort8Copy8uC1_00gas_1 LLoopNACopy8uC1_01gas_1: lddqu (%rdi), %xmm0 movdqu %xmm0, (%rsi) lddqu (16)(%rdi), %xmm0 movdqu %xmm0, (16)(%rsi) lddqu (32)(%rdi), %xmm0 movdqu %xmm0, (32)(%rsi) lddqu (48)(%rdi), %xmm0 add $(64), %rdi movdqa %xmm0, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LLoopNACopy8uC1_01gas_1 add $(64), %rdx jz LExitCopy8uC1_00gas_1 jmp LShort8Copy8uC1_00gas_1 LLoopCopyNt8uC1_01gas_1: lddqu (%rdi), %xmm0 movntdq %xmm0, (%rsi) lddqu (16)(%rdi), %xmm0 movntdq %xmm0, (16)(%rsi) lddqu (32)(%rdi), %xmm0 movntdq %xmm0, (32)(%rsi) lddqu (48)(%rdi), %xmm0 add $(64), %rdi movntdq %xmm0, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LLoopCopyNt8uC1_01gas_1 sfence add $(64), %rdx jz LExitCopy8uC1_00gas_1 LShort8Copy8uC1_00gas_1: sub %rdi, %rsi sub $(8), %rdx jl LShort4Copy8uC1_00gas_1 LShort8Copy8uC1_02gas_1: movq (%rdi), %xmm0 movq %xmm0, (%rdi,%rsi) add $(8), %rdi sub $(8), %rdx jge LShort8Copy8uC1_02gas_1 LShort4Copy8uC1_00gas_1: add $(8), %rdx test %rdx, %rdx jz LExitCopy8uC1_00gas_1 test $(4), %rdx jz LShort2Copy8uC1_00gas_1 mov (%rdi), %ebx sub $(4), %rdx mov %ebx, (%rdi,%rsi) add $(4), %rdi LShort2Copy8uC1_00gas_1: test %rdx, %rdx jz LExitCopy8uC1_00gas_1 test $(2), %rdx jz LShort1Copy8uC1_00gas_1 mov (%rdi), %bx sub $(2), %rdx mov %bx, (%rdi,%rsi) add $(2), %rdi LShort1Copy8uC1_00gas_1: test %rdx, %rdx jz LExitCopy8uC1_00gas_1 mov (%rdi), %bl mov %bl, (%rdi,%rsi) LExitCopy8uC1_00gas_1: pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret .data .p2align 4, 0x90 mask3A8u: .quad 0xffffff00ffffff, 0xffffff00ffffff maskA8u: .quad 0xff000000ff000000, 0xff000000ff000000 mask3A16s: .quad 0xffffffffffff, 0xffffffffffff maskA16s: .quad 0xffff000000000000, 0xffff000000000000 c127: .quad 0x7f7f7f7f7f7f7f7f, 0x7f7f7f7f7f7f7f7f oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/piconvert01m7as.s000066400000000000000000000074461443134507600275740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxowniConvert_16u8u_M7 mfxowniConvert_16u8u_M7: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 mov %edx, %edx LAlign16u8u00gas_1: test $(15), %rdi jz LCvrtW16u8u00gas_1 movzwl (%rdi), %eax add $(2), %rdi cmp $(255), %eax jle LAlign16u8u01gas_1 mov $(255), %eax jmp LAlign16u8u02gas_1 LAlign16u8u01gas_1: cmp $(0), %eax jge LAlign16u8u02gas_1 xor %eax, %eax LAlign16u8u02gas_1: mov %al, (%rsi) add $(1), %rsi sub $(1), %rdx jz LCvrtExitW16u8ugas_1 jmp LAlign16u8u00gas_1 LCvrtW16u8u00gas_1: movdqa c32767(%rip), %xmm7 sub $(32), %rdx jl LCvrt16W16u8u00gas_1 LCvrt32W16u8u01gas_1: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm1 movdqa (32)(%rdi), %xmm2 movdqa (48)(%rdi), %xmm3 add $(64), %rdi pminub %xmm7, %xmm0 pminub %xmm7, %xmm1 pminub %xmm7, %xmm2 pminub %xmm7, %xmm3 packuswb %xmm1, %xmm0 packuswb %xmm3, %xmm2 movdqu %xmm0, (%rsi) movdqu %xmm2, (16)(%rsi) add $(32), %rsi sub $(32), %rdx jge LCvrt32W16u8u01gas_1 LCvrt16W16u8u00gas_1: add $(16), %rdx jl LTail16u8u00gas_1 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm1 add $(32), %rdi pminub %xmm7, %xmm0 pminub %xmm7, %xmm1 packuswb %xmm1, %xmm0 movdqu %xmm0, (%rsi) add $(16), %rsi sub $(16), %rdx LTail16u8u00gas_1: add $(16), %rdx jz LCvrtExitW16u8ugas_1 LTail16u8u01gas_1: movzwl (%rdi), %eax add $(2), %rdi cmp $(255), %eax jle LTail16u8u02gas_1 mov $(255), %eax jmp LTail16u8u03gas_1 LTail16u8u02gas_1: cmp $(0), %eax jge LTail16u8u03gas_1 xor %eax, %eax LTail16u8u03gas_1: mov %al, (%rsi) add $(1), %rsi sub $(1), %rdx jnz LTail16u8u01gas_1 LCvrtExitW16u8ugas_1: pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret .data .p2align 4, 0x90 c32767: .quad 0x7fff7fff7fff7fff .quad 0x7fff7fff7fff7fff oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/piconvert02m7as.s000066400000000000000000000076511443134507600275730ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxowniConvert_8u16u_M7 mfxowniConvert_8u16u_M7: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 mov %edx, %edx mov %ecx, %ecx LAlign8u16u00gas_1: test $(15), %rsi jz LCvrt_8u16u00gas_1 movzbl (%rdi), %eax add $(1), %rdi mov %ax, (%rsi) add $(2), %rsi sub $(1), %rdx jz LCvrtExit_8u16ugas_1 jmp LAlign8u16u00gas_1 LCvrt_8u16u00gas_1: pxor %xmm0, %xmm0 sub $(32), %rdx jl LCvrt16_8u16u00gas_1 test %rcx, %rcx jnz LCvrt32WNt8u16u01gas_1 LCvrt32_8u16u01gas_1: movq (%rdi), %xmm1 movq (8)(%rdi), %xmm2 movq (16)(%rdi), %xmm3 movq (24)(%rdi), %xmm4 add $(32), %rdi punpcklbw %xmm0, %xmm1 punpcklbw %xmm0, %xmm2 punpcklbw %xmm0, %xmm3 punpcklbw %xmm0, %xmm4 movdqa %xmm1, (%rsi) movdqa %xmm2, (16)(%rsi) movdqa %xmm3, (32)(%rsi) movdqa %xmm4, (48)(%rsi) add $(64), %rsi sub $(32), %rdx jge LCvrt32_8u16u01gas_1 jmp LCvrt16_8u16u00gas_1 LCvrt32WNt8u16u01gas_1: movq (%rdi), %xmm1 movq (8)(%rdi), %xmm2 movq (16)(%rdi), %xmm3 movq (24)(%rdi), %xmm4 add $(32), %rdi punpcklbw %xmm0, %xmm1 punpcklbw %xmm0, %xmm2 punpcklbw %xmm0, %xmm3 punpcklbw %xmm0, %xmm4 movntdq %xmm1, (%rsi) movntdq %xmm2, (16)(%rsi) movntdq %xmm3, (32)(%rsi) movntdq %xmm4, (48)(%rsi) add $(64), %rsi sub $(32), %rdx jge LCvrt32WNt8u16u01gas_1 sfence LCvrt16_8u16u00gas_1: add $(16), %rdx jl LTail8u16u00gas_1 LCvrt16_8u16u01gas_1: movq (%rdi), %xmm1 movq (8)(%rdi), %xmm2 add $(16), %rdi punpcklbw %xmm0, %xmm1 punpcklbw %xmm0, %xmm2 movdqa %xmm1, (%rsi) movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(16), %rdx LTail8u16u00gas_1: add $(16), %rdx jz LCvrtExit_8u16ugas_1 LTail8u16u01gas_1: movzbl (%rdi), %eax add $(1), %rdi mov %ax, (%rsi) add $(2), %rsi sub $(1), %rdx jnz LTail8u16u01gas_1 LCvrtExit_8u16ugas_1: pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret .data .p2align 4, 0x90 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/picopyu8as.s000066400000000000000000000520121443134507600267230ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data TableCacheSize: .byte 0xec, 0xc3 .byte 0xeb, 0x93 .byte 0x4d, 0x16 .byte 0xea, 0x34 .byte 0x4c, 0x34 .byte 0xe4, 0x15 .byte 0xde, 0x15 .byte 0x4b, 0x15 .byte 0x47, 0x15 .byte 0x4e, 0x33 .byte 0x4a, 0x33 .byte 0xe3, 0x14 .byte 0xdd, 0x14 .byte 0xd8, 0x14 .byte 0x49, 0x14 .byte 0x29, 0x14 .byte 0x46, 0x14 .byte 0x48, 0x32 .byte 0xe2, 0x13 .byte 0xdc, 0x13 .byte 0xd7, 0x13 .byte 0xd2, 0x13 .byte 0x25, 0x13 .byte 0x7d, 0x13 .byte 0x85, 0x13 .byte 0x45, 0x13 .byte 0xd6, 0x12 .byte 0xd1, 0x12 .byte 0x23, 0x12 .byte 0x87, 0x12 .byte 0x7c, 0x12 .byte 0x78, 0x12 .byte 0x84, 0x12 .byte 0x44, 0x12 .byte 0xd0, 0x11 .byte 0x22, 0x11 .byte 0x7b, 0x11 .byte 0x80, 0x11 .byte 0x86, 0x11 .byte 0x3e, 0x11 .byte 0x7f, 0x11 .byte 0x83, 0x11 .byte 0x43, 0x11 .byte 0 .text .p2align 4, 0x90 .globl mfxowniCopy8uas mfxowniCopy8uas: push %rbx push %rbp movslq %esi, %rsi movslq %ecx, %rcx movslq %r8d, %r8 movslq %r9d, %r9 mov %r9, %rax mov %r8, %rbp imul %rbp, %rax cmp %rsi, %rbp jne LCheckSizeCopy8u_00gas_1 cmp %rcx, %rbp jne LCheckSizeCopy8u_00gas_1 mov $(1), %r9 mov %rax, %r8 mov %rax, %rbp LCheckSizeCopy8u_00gas_1: cmp $(64), %rbp jl LShortCopy8u_32gas_1 cmp $(1048576), %rax jge LGetCacheSize00gas_1 jmp LAverCopy8u_00gas_1 LShortCopy8u_32gas_1: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %rax test $(32), %rax jz LShortCopy8u_16gas_1 movq (%r10), %xmm0 movq (8)(%r10), %xmm1 movq (16)(%r10), %xmm2 movq (24)(%r10), %xmm3 add $(32), %r10 movq %xmm0, (%r11) movq %xmm1, (8)(%r11) movq %xmm2, (16)(%r11) movq %xmm3, (24)(%r11) add $(32), %r11 sub $(32), %rax jz LEndShortCopy8u_00gas_1 LShortCopy8u_16gas_1: test $(16), %rax jz LShortCopy8u_08gas_1 movq (%r10), %xmm0 movq (8)(%r10), %xmm1 add $(16), %r10 movq %xmm0, (%r11) movq %xmm1, (8)(%r11) add $(16), %r11 sub $(16), %rax jz LEndShortCopy8u_00gas_1 LShortCopy8u_08gas_1: test $(8), %rax jz LShortCopy8u_04gas_1 movq (%r10), %xmm0 add $(8), %r10 movq %xmm0, (%r11) add $(8), %r11 sub $(8), %rax jz LEndShortCopy8u_00gas_1 LShortCopy8u_04gas_1: test $(4), %rax jz LShortCopy8u_03gas_1 mov (%r10), %ebx add $(4), %r10 mov %ebx, (%r11) add $(4), %r11 sub $(4), %rax LShortCopy8u_03gas_1: test %rax, %rax jz LEndShortCopy8u_00gas_1 movzbl (-1)(%r10,%rax), %ebx mov %bl, (-1)(%r11,%rax) sub $(1), %rax jz LEndShortCopy8u_00gas_1 movzbl (-1)(%r10,%rax), %ebx mov %bl, (-1)(%r11,%rax) sub $(1), %rax jz LEndShortCopy8u_00gas_1 movzbl (-1)(%r10,%rax), %ebx mov %bl, (-1)(%r11,%rax) LEndShortCopy8u_00gas_1: sub $(1), %r9 jz LExitCopy8u_00gas_1 add %rsi, %rdi add %rcx, %rdx jmp LShortCopy8u_32gas_1 LExitCopy8u_00gas_1: pop %rbp pop %rbx ret LAverCopy8u_00gas_1: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %rax test $(15), %r11 jnz LAlignCopy8u_00gas_1 test $(15), %r10 jnz LCheckAlignCopy8u_00gas_1 LCheckAliasingCopy8u_00gas_1: mov %r10, %rbx mov %r11, %rbp and $(4095), %ebx and $(4095), %ebp sub %ebp, %ebx cmp $(3936), %ebx jge LInv00Copy8u_00gas_1 cmp $(0), %ebx jge LFwd00Copy8u_00gas_1 cmp $(-160), %ebx jge LInv00Copy8u_00gas_1 LFwd00Copy8u_00gas_1: sub $(64), %rax .p2align 4, 0x90 LFwd00Copy8u_01gas_1: movdqa (%r10), %xmm0 movdqa %xmm0, (%r11) movdqa (16)(%r10), %xmm0 movdqa %xmm0, (16)(%r11) movdqa (32)(%r10), %xmm0 movdqa %xmm0, (32)(%r11) movdqa (48)(%r10), %xmm0 movdqa %xmm0, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(64), %rax jge LFwd00Copy8u_01gas_1 add $(64), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_32gas_1: test $(32), %rax jz LShortFwd00Copy8u_16gas_1 movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 add $(32), %r10 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r11 sub $(32), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_16gas_1: test $(16), %rax jz LShortFwd00Copy8u_08gas_1 movdqa (%r10), %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(16), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_08gas_1: test $(8), %rax jz LShortFwd00Copy8u_04gas_1 movq (%r10), %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(8), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_04gas_1: test $(4), %rax jz LShortFwd00Copy8u_02gas_1 mov (%r10), %ebx mov %ebx, (%r11) add $(4), %r10 add $(4), %r11 sub $(4), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_02gas_1: test $(2), %rax jz LShortFwd00Copy8u_01gas_1 movzwl (%r10), %ebx mov %bx, (%r11) add $(2), %r10 add $(2), %r11 sub $(2), %rax jz LEndAverCopy8u_00gas_1 LShortFwd00Copy8u_01gas_1: test %rax, %rax jz LEndAverCopy8u_00gas_1 movzbl (%r10), %ebx mov %bl, (%r11) LEndAverCopy8u_00gas_1: sub $(1), %r9 jz LExitAverCopy8u_00gas_1 add %rsi, %rdi add %rcx, %rdx jmp LAverCopy8u_00gas_1 LExitAverCopy8u_00gas_1: pop %rbp pop %rbx ret LInv00Copy8u_00gas_1: test $(1), %rax jz LInv00Copy8u_01gas_1 movzbl (-1)(%r10,%rax), %ebx mov %bl, (-1)(%r11,%rax) sub $(1), %rax LInv00Copy8u_01gas_1: test $(2), %rax jz LInv00Copy8u_02gas_1 movzwl (-2)(%r10,%rax), %ebx mov %bx, (-2)(%r11,%rax) sub $(2), %rax LInv00Copy8u_02gas_1: test $(4), %rax jz LInv00Copy8u_03gas_1 movl (-4)(%r10,%rax), %ebx mov %ebx, (-4)(%r11,%rax) sub $(4), %rax LInv00Copy8u_03gas_1: test $(8), %rax jz LInv00Copy8u_04gas_1 movq (-8)(%r10,%rax), %xmm0 movq %xmm0, (-8)(%r11,%rax) sub $(8), %rax LInv00Copy8u_04gas_1: test $(16), %rax jz LInv00Copy8u_05gas_1 movdqa (-16)(%r10,%rax), %xmm0 movdqa %xmm0, (-16)(%r11,%rax) sub $(16), %rax LInv00Copy8u_05gas_1: test $(32), %rax jz LInv00Copy8u_06gas_1 movdqa (-16)(%r10,%rax), %xmm0 movdqa (-32)(%r10,%rax), %xmm1 movdqa %xmm0, (-16)(%r11,%rax) movdqa %xmm1, (-32)(%r11,%rax) sub $(32), %rax jz LEndAverCopy8u_00gas_1 jmp LInv00Copy8u_06gas_1 .p2align 4, 0x90 LInv00Copy8u_06gas_1: movdqa (-16)(%r10,%rax), %xmm0 movdqa %xmm0, (-16)(%r11,%rax) movdqa (-32)(%r10,%rax), %xmm0 movdqa %xmm0, (-32)(%r11,%rax) movdqa (-48)(%r10,%rax), %xmm0 movdqa %xmm0, (-48)(%r11,%rax) movdqa (-64)(%r10,%rax), %xmm0 movdqa %xmm0, (-64)(%r11,%rax) sub $(64), %rax jnz LInv00Copy8u_06gas_1 jmp LEndAverCopy8u_00gas_1 LAlignCopy8u_00gas_1: movdqu (%r10), %xmm0 mov %r11, %rbx and $(15), %rbx movdqu %xmm0, (%r11) sub $(16), %rbx sub %rbx, %r10 sub %rbx, %r11 add %rbx, %rax cmp $(64), %rax jge LAlignCopy8u_01gas_1 test $(15), %r10 jnz LShortX0Copy8u_32gas_1 jmp LShortFwd00Copy8u_32gas_1 LAlignCopy8u_01gas_1: test $(15), %r10 jz LCheckAliasingCopy8u_00gas_1 LCheckAlignCopy8u_00gas_1: test $(3), %r10 jz LCheckCopy8u_03gas_1 LLoopX0Copy8u_00gas_1: sub $(64), %rax LLoopX0Copy8u_01gas_1: movdqu (%r10), %xmm0 movdqu (16)(%r10), %xmm1 movdqu (32)(%r10), %xmm2 movdqu (48)(%r10), %xmm3 add $(64), %r10 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r11 sub $(64), %rax jge LLoopX0Copy8u_01gas_1 add $(64), %rax jnz LShortX0Copy8u_32gas_1 jmp LEndAverCopy8u_00gas_1 LCheckCopy8u_03gas_1: movdqu (%r10), %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(32), %rax mov $(-16), %rbx mov %r10, %rbp and %r10, %rbx and $(15), %rbp cmp $(12), %rbp je LLoop12Copy8u_00gas_1 cmp $(8), %rbp je LLoop08Copy8u_00gas_1 mov %r11, %rbp sub $(64), %rax jl LEndNotAlignCopy_00gas_1 LLoop04Copy8u_00gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(4), %xmm3, %xmm4 palignr $(4), %xmm2, %xmm3 palignr $(4), %xmm1, %xmm2 palignr $(4), %xmm0, %xmm1 movdqa %xmm1, (%r11) movdqa %xmm2, (16)(%r11) movdqa %xmm3, (32)(%r11) movdqa %xmm4, (48)(%r11) add $(64), %r11 sub $(64), %rax jge LLoop04Copy8u_00gas_1 jmp LEndNotAlignCopy_00gas_1 LLoop08Copy8u_00gas_1: mov %r11, %rbp sub $(64), %rax jl LEndNotAlignCopy_00gas_1 LLoop08Copy8u_01gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(8), %xmm3, %xmm4 palignr $(8), %xmm2, %xmm3 palignr $(8), %xmm1, %xmm2 palignr $(8), %xmm0, %xmm1 movdqa %xmm1, (%r11) movdqa %xmm2, (16)(%r11) movdqa %xmm3, (32)(%r11) movdqa %xmm4, (48)(%r11) add $(64), %r11 sub $(64), %rax jge LLoop08Copy8u_01gas_1 jmp LEndNotAlignCopy_00gas_1 LLoop12Copy8u_00gas_1: mov %r11, %rbp sub $(64), %rax jl LEndNotAlignCopy_00gas_1 LLoop12Copy8u_01gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(12), %xmm3, %xmm4 palignr $(12), %xmm2, %xmm3 palignr $(12), %xmm1, %xmm2 palignr $(12), %xmm0, %xmm1 movdqa %xmm1, (%r11) movdqa %xmm2, (16)(%r11) movdqa %xmm3, (32)(%r11) movdqa %xmm4, (48)(%r11) add $(64), %r11 sub $(64), %rax jge LLoop12Copy8u_01gas_1 LEndNotAlignCopy_00gas_1: add $(80), %rax sub %r11, %rbp sub %rbp, %r10 cmp $(64), %rax jge LLoopX0Copy8u_00gas_1 LShortX0Copy8u_32gas_1: test $(32), %rax jz LShortX0Copy8u_16gas_1 movdqu (%r10), %xmm0 movdqu (16)(%r10), %xmm1 add $(32), %r10 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r11 sub $(32), %rax jz LEndAverCopy8u_00gas_1 LShortX0Copy8u_16gas_1: test $(16), %rax jz LShortX0Copy8u_08gas_1 movdqu (%r10), %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(16), %rax jz LEndAverCopy8u_00gas_1 LShortX0Copy8u_08gas_1: test $(8), %rax jz LShortX0Copy8u_04gas_1 movq (%r10), %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(8), %rax jz LEndAverCopy8u_00gas_1 LShortX0Copy8u_04gas_1: test $(4), %rax jz LShortX0Copy8u_02gas_1 mov (%r10), %ebx mov %ebx, (%r11) add $(4), %r10 add $(4), %r11 sub $(4), %rax jz LEndAverCopy8u_00gas_1 LShortX0Copy8u_02gas_1: test $(2), %rax jz LShortX0Copy8u_01gas_1 movzwl (%r10), %ebx mov %bx, (%r11) add $(2), %r10 add $(2), %r11 sub $(2), %rax jz LEndAverCopy8u_00gas_1 LShortX0Copy8u_01gas_1: test %rax, %rax jz LEndAverCopy8u_00gas_1 movzbl (%r10), %ebx mov %bl, (%r11) jmp LEndAverCopy8u_00gas_1 LGetCacheSize00gas_1: lea TableCacheSize(%rip), %rbx sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rbx, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_1 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_1 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_1 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_1 test $(2147483648), %eax jz LCacheSizeMacro00gas_1 xor %eax, %eax LCacheSizeMacro00gas_1: test $(2147483648), %ebx jz LCacheSizeMacro01gas_1 xor %ebx, %ebx LCacheSizeMacro01gas_1: test $(2147483648), %ecx jz LCacheSizeMacro02gas_1 xor %ecx, %ecx LCacheSizeMacro02gas_1: test $(2147483648), %edx jz LCacheSizeMacro03gas_1 xor %edx, %edx LCacheSizeMacro03gas_1: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_1 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_1: test %ebx, %ebx jz LCacheSizeMacro05gas_1 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_1: test %ecx, %ecx jz LCacheSizeMacro06gas_1 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_1: test %edx, %edx jz LCacheSizeMacro07gas_1 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_1: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_1 LCacheSizeMacro08gas_1: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_1 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_1: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_1 sub $(1), %ecx jnz LCacheSizeMacro09gas_1 jmp LCacheSizeMacro08gas_1 LCacheSizeMacro10gas_1: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_1 LCacheSizeMacro11gas_1: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_1: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rbx add $(64), %rsp cmp $(-1), %rbx je LAverCopy8u_00gas_1 shr $(1), %rbx cmp %rbx, %rax jl LAverCopy8u_00gas_1 LLongCopy8u_00gas_1: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %rax LAlignLongCopy8u_00gas_1: test $(15), %r11 jz LPrefLoopCopy8u_00gas_1 movzbl (%r10), %ebx add $(1), %r10 mov %bl, (%r11) add $(1), %r11 sub $(1), %rax jz LEndLongCopy8u_00gas_1 jmp LAlignLongCopy8u_00gas_1 LPrefLoopCopy8u_00gas_1: sub $(262144), %rax jl LPrefLoopCopy8u_02gas_1 mov $(4096), %rbp LPrefLoopCopy8u_01gas_1: movzbl (%r10), %ebx add $(64), %r10 sub $(1), %rbp jnz LPrefLoopCopy8u_01gas_1 sub $(262144), %r10 mov $(262144), %rbp LLoopCopy8uNt_00gas_1: movdqu (%r10), %xmm0 add $(16), %r10 movntdq %xmm0, (%r11) add $(16), %r11 sub $(16), %rbp jnz LLoopCopy8uNt_00gas_1 jmp LPrefLoopCopy8u_00gas_1 LPrefLoopCopy8u_02gas_1: add $(262144), %rax jz LEndLongCopy8u_00gas_1 mov %rax, %rbp jmp LPrefLoopCopy8u_04gas_1 LPrefLoopCopy8u_03gas_1: movzbl (%r10,%rbp), %ebx LPrefLoopCopy8u_04gas_1: sub $(64), %rbp jge LPrefLoopCopy8u_03gas_1 sub $(16), %rax jl LTailLongCopy8u_00gas_1 LLoopCopy8uNt_01gas_1: movdqu (%r10), %xmm0 add $(16), %r10 movntdq %xmm0, (%r11) add $(16), %r11 sub $(16), %rax jge LLoopCopy8uNt_01gas_1 LTailLongCopy8u_00gas_1: add $(16), %rax jz LEndLongCopy8u_00gas_1 LTailLongCopy8u_01gas_1: movzbl (%r10), %ebx add $(1), %r10 mov %bl, (%r11) add $(1), %r11 sub $(1), %rax jnz LTailLongCopy8u_01gas_1 LEndLongCopy8u_00gas_1: sub $(1), %r9 jz LExitCopy8uNt_00gas_1 add %rsi, %rdi add %rcx, %rdx jmp LLongCopy8u_00gas_1 LExitCopy8uNt_00gas_1: sfence pop %rbp pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pidct8844im7as.s000066400000000000000000000473161443134507600272260ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 CONST_TABLE: round_i4_0: .long 66560, 66560, 0, 0 round_i2_0: .long 67072, 67072, 0, 0 round_i_1: .long 5802, 5802, 0, 0 round_i_2: .long 4520, 4520, 0, 0 round_i_3: .long 3408, 3408, 0, 0 round_i_5: .long 910, 910, 0, 0 round_i_6: .long 1024, 1024, 0, 0 round_i_7: .long 746, 746, 0, 0 tg_1_16: .word 13036, 13036, 13036, 13036 .word 13036, 13036, 13036, 13036 tg_2_16: .word 27146, 27146, 27146, 27146 .word 27146, 27146, 27146, 27146 tg_3_16: .word -21746, -21746, -21746, -21746 .word -21746, -21746, -21746, -21746 cos_4_16: .word -19195, -19195, -19195, -19195 .word -19195, -19195, -19195, -19195 tab_i4_04: .word 16384, 15137, 16384, -15137 .word 20995, 7373, 8697, -17799 .word 0, -6270, 0, 6270 .word -4926, -4176, 11893, -1730 tab_i4_17: .word 22725, 20995, 22725, -20995 .word 29121, 10226, 12063, -24688 .word 0, -8697, 0, 8697 .word -6833, -5793, 16496, -2399 tab_i4_26: .word 21407, 19777, 21407, -19777 .word 27432, 9633, 11363, -23256 .word 0, -8192, 0, 8192 .word -6436, -5457, 15539, -2260 tab_i4_35: .word 19266, 17799, 19266, -17799 .word 24688, 8669, 10226, -20929 .word 0, -7373, 0, 7373 .word -5793, -4911, 13985, -2034 tab_i2_04: .word 16384, 0, 16384, 0 .word 0, 0, 0, 0 .word 14846, -5213, -14846, 5213 .word 3483, -2953, -3483, 2953 tab_i2_17: .word 22725, 0, 22725, 0 .word 0, 0, 0, 0 .word 20592, -7231, -20592, 7231 .word 4832, -4096, -4832, 4096 tab_i2_35: .word 19266, 0, 19266, 0 .word 0, 0, 0, 0 .word 17457, -6130, -17457, 6130 .word 4096, -3472, -4096, 3472 .text .p2align 4, 0x90 .globl mfxdct_8x8To4x4_inv_16s mfxdct_8x8To4x4_inv_16s: sub $(136), %rsp mov %rdi, %r10 mov %rsi, %r11 test $(15), %r10 jnz LMISALIGNED_SRCgas_1 LALIGNED_SRCgas_1: movdqa (48)(%r10), %xmm0 movdqa (80)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_35(%rip), %xmm1 pmaddwd tab_i4_35+16(%rip), %xmm0 pmaddwd tab_i4_35(%rip), %xmm5 pmaddwd tab_i4_35+16(%rip), %xmm4 paddd round_i_3(%rip), %xmm1 paddd round_i_5(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (48)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (80)(%rsp) movdqa (32)(%r10), %xmm0 movdqa (96)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_26(%rip), %xmm1 pmaddwd tab_i4_26+16(%rip), %xmm0 pmaddwd tab_i4_26(%rip), %xmm5 pmaddwd tab_i4_26+16(%rip), %xmm4 paddd round_i_2(%rip), %xmm1 paddd round_i_6(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (32)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (96)(%rsp) movdqa (16)(%r10), %xmm0 movdqa (112)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_17(%rip), %xmm1 pmaddwd tab_i4_17+16(%rip), %xmm0 pmaddwd tab_i4_17(%rip), %xmm5 pmaddwd tab_i4_17+16(%rip), %xmm4 paddd round_i_1(%rip), %xmm1 paddd round_i_7(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (16)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (112)(%rsp) movdqa (%r10), %xmm0 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pmaddwd tab_i4_04(%rip), %xmm1 pmaddwd tab_i4_04+16(%rip), %xmm0 paddd %xmm0, %xmm1 pshufd $(238), %xmm1, %xmm0 paddd round_i4_0(%rip), %xmm1 movdqa %xmm0, %xmm2 paddd %xmm1, %xmm0 psubd %xmm2, %xmm1 shufps $(20), %xmm1, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (%rsp) jmp LDCT_COLgas_1 LMISALIGNED_SRCgas_1: movdqu (48)(%r10), %xmm0 movdqu (80)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_35(%rip), %xmm1 pmaddwd tab_i4_35+16(%rip), %xmm0 pmaddwd tab_i4_35(%rip), %xmm5 pmaddwd tab_i4_35+16(%rip), %xmm4 paddd round_i_3(%rip), %xmm1 paddd round_i_5(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (48)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (80)(%rsp) movdqu (32)(%r10), %xmm0 movdqu (96)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_26(%rip), %xmm1 pmaddwd tab_i4_26+16(%rip), %xmm0 pmaddwd tab_i4_26(%rip), %xmm5 pmaddwd tab_i4_26+16(%rip), %xmm4 paddd round_i_2(%rip), %xmm1 paddd round_i_6(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (32)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (96)(%rsp) movdqu (16)(%r10), %xmm0 movdqu (112)(%r10), %xmm4 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshuflw $(216), %xmm4, %xmm4 pshufhw $(216), %xmm4, %xmm4 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pshufd $(80), %xmm4, %xmm5 pshufd $(250), %xmm4, %xmm4 pmaddwd tab_i4_17(%rip), %xmm1 pmaddwd tab_i4_17+16(%rip), %xmm0 pmaddwd tab_i4_17(%rip), %xmm5 pmaddwd tab_i4_17+16(%rip), %xmm4 paddd round_i_1(%rip), %xmm1 paddd round_i_7(%rip), %xmm5 paddd %xmm0, %xmm1 paddd %xmm4, %xmm5 movdqa %xmm1, %xmm2 punpcklqdq %xmm5, %xmm1 punpckhqdq %xmm5, %xmm2 movdqa %xmm1, %xmm0 psubd %xmm2, %xmm1 paddd %xmm2, %xmm0 pshufd $(177), %xmm1, %xmm1 movdqa %xmm0, %xmm4 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm4 psrad $(12), %xmm0 psrad $(12), %xmm4 packssdw %xmm0, %xmm0 movdqa %xmm0, (16)(%rsp) packssdw %xmm4, %xmm4 movdqa %xmm4, (112)(%rsp) movdqu (%r10), %xmm0 pshuflw $(216), %xmm0, %xmm0 pshufhw $(216), %xmm0, %xmm0 pshufd $(80), %xmm0, %xmm1 pshufd $(250), %xmm0, %xmm0 pmaddwd tab_i4_04(%rip), %xmm1 pmaddwd tab_i4_04+16(%rip), %xmm0 paddd %xmm0, %xmm1 pshufd $(238), %xmm1, %xmm0 paddd round_i4_0(%rip), %xmm1 movdqa %xmm0, %xmm2 paddd %xmm1, %xmm0 psubd %xmm2, %xmm1 shufps $(20), %xmm1, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (%rsp) LDCT_COLgas_1: movdqa (80)(%rsp), %xmm0 movdqa tg_3_16(%rip), %xmm1 movdqa %xmm0, %xmm2 movdqa (48)(%rsp), %xmm3 pmulhw %xmm1, %xmm0 movdqa (112)(%rsp), %xmm4 pmulhw %xmm3, %xmm1 movdqa tg_1_16(%rip), %xmm5 movdqa %xmm4, %xmm6 pmulhw %xmm5, %xmm4 paddsw %xmm2, %xmm0 pmulhw (16)(%rsp), %xmm5 paddsw %xmm3, %xmm1 movdqa (96)(%rsp), %xmm7 paddsw %xmm3, %xmm0 movdqa tg_2_16(%rip), %xmm3 psubsw %xmm1, %xmm2 pmulhw %xmm3, %xmm7 movdqa %xmm0, %xmm1 pmulhw (32)(%rsp), %xmm3 psubsw %xmm6, %xmm5 paddsw (16)(%rsp), %xmm4 paddsw %xmm4, %xmm0 paddsw (32)(%rsp), %xmm7 psubsw %xmm1, %xmm4 psubsw (96)(%rsp), %xmm3 movdqa %xmm5, %xmm6 psubsw %xmm2, %xmm5 paddsw %xmm2, %xmm6 paddsw %xmm7, %xmm3 movdqa %xmm4, %xmm1 movdqa cos_4_16(%rip), %xmm2 paddsw %xmm5, %xmm4 movdqa cos_4_16(%rip), %xmm7 pmulhw %xmm4, %xmm2 psubsw %xmm5, %xmm1 pmulhw %xmm1, %xmm7 paddsw %xmm2, %xmm4 paddsw %xmm1, %xmm7 paddsw %xmm0, %xmm4 movdqa %xmm3, %xmm1 paddsw %xmm6, %xmm7 movdqa (%rsp), %xmm6 paddsw %xmm6, %xmm6 paddsw %xmm6, %xmm3 psubsw %xmm1, %xmm6 movdqa %xmm4, %xmm1 paddsw %xmm3, %xmm4 psubsw %xmm1, %xmm3 movdqa %xmm7, %xmm2 paddsw %xmm6, %xmm7 psubsw %xmm2, %xmm6 psraw $(6), %xmm4 movq %xmm4, (%r11) psraw $(6), %xmm7 movq %xmm7, (8)(%r11) psraw $(6), %xmm6 movq %xmm6, (16)(%r11) psraw $(6), %xmm3 movq %xmm3, (24)(%r11) add $(136), %rsp ret .p2align 4, 0x90 .globl mfxdct_8x8To2x2_inv_16s mfxdct_8x8To2x2_inv_16s: sub $(136), %rsp mov %rdi, %r10 mov %rsi, %r11 test $(15), %r10 jnz LMISALIGNED_SRCgas_2 LALIGNED_SRCgas_2: movdqa (16)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_17(%rip), %xmm0 pmaddwd tab_i2_17+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_1(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (16)(%rsp) movdqa (112)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_17(%rip), %xmm0 pmaddwd tab_i2_17+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_7(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (112)(%rsp) movdqa (48)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_35(%rip), %xmm0 pmaddwd tab_i2_35+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_3(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (48)(%rsp) movdqa (80)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_35(%rip), %xmm0 pmaddwd tab_i2_35+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_5(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (80)(%rsp) movdqa (%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_04(%rip), %xmm0 pmaddwd tab_i2_04+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i2_0(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (%rsp) jmp LDCT_COLgas_2 LMISALIGNED_SRCgas_2: movdqu (16)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_17(%rip), %xmm0 pmaddwd tab_i2_17+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_1(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (16)(%rsp) movdqu (112)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_17(%rip), %xmm0 pmaddwd tab_i2_17+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_7(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (112)(%rsp) movdqu (48)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_35(%rip), %xmm0 pmaddwd tab_i2_35+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_3(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (48)(%rsp) movdqu (80)(%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_35(%rip), %xmm0 pmaddwd tab_i2_35+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i_5(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (80)(%rsp) movdqu (%r10), %xmm0 pshuflw $(221), %xmm0, %xmm1 pshuflw $(136), %xmm0, %xmm0 pshufhw $(221), %xmm1, %xmm1 pmaddwd tab_i2_04(%rip), %xmm0 pmaddwd tab_i2_04+16(%rip), %xmm1 pshufd $(238), %xmm1, %xmm2 paddd %xmm1, %xmm2 paddd round_i2_0(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(12), %xmm0 packssdw %xmm0, %xmm0 movdqa %xmm0, (%rsp) LDCT_COLgas_2: movdqa (80)(%rsp), %xmm0 movdqa tg_3_16(%rip), %xmm1 movdqa %xmm0, %xmm2 movdqa (48)(%rsp), %xmm3 pmulhw %xmm1, %xmm0 movdqa (112)(%rsp), %xmm4 pmulhw %xmm3, %xmm1 movdqa tg_1_16(%rip), %xmm5 movdqa %xmm4, %xmm6 pmulhw %xmm5, %xmm4 paddsw %xmm2, %xmm0 pmulhw (16)(%rsp), %xmm5 paddsw %xmm3, %xmm1 paddsw %xmm3, %xmm0 psubsw %xmm1, %xmm2 movdqa %xmm0, %xmm1 psubsw %xmm6, %xmm5 paddsw (16)(%rsp), %xmm4 paddsw %xmm4, %xmm0 psubsw %xmm1, %xmm4 paddsw %xmm2, %xmm5 movdqa cos_4_16(%rip), %xmm2 pmulhw %xmm4, %xmm2 movdqa (%rsp), %xmm6 paddsw %xmm6, %xmm6 paddsw %xmm6, %xmm6 paddsw %xmm2, %xmm4 paddsw %xmm4, %xmm4 paddsw %xmm5, %xmm0 paddsw %xmm4, %xmm0 movdqa %xmm6, %xmm1 paddsw %xmm0, %xmm6 psubsw %xmm0, %xmm1 punpckldq %xmm1, %xmm6 psraw $(7), %xmm6 movq %xmm6, (%r11) add $(136), %rsp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pidct88fm7as.s000066400000000000000000000754411443134507600270530ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 cos_4_16_: .single 0.707106781187, 0.707106781187, 0.707106781187, 0.707106781187 tg_2_16_: .single 0.414213562373, 0.414213562373, 0.414213562373, 0.414213562373 cos4cos4p_: .single 1.414213562373, 1.414213562373, 1.414213562373, 1.414213562373 cos6cos6p_: .single 0.765366864730, 0.765366864730, 0.765366864730, 0.765366864730 cos2cos6m_: .single 0.541196100146, 0.541196100146, 0.541196100146, 0.541196100146 cos0cos2d_: .single 1.082392200292, 1.082392200292, 1.082392200292, 1.082392200292 tab_norm_frw: .single 0.125000000000, 0.083260002914, 0.095670858091, 0.098211869798 .single 0.125000000000, 0.146984450302, 0.230969883128, 0.418576300766 .single 0.083260002914, 0.055457824682, 0.063724447388, 0.065416964525 .single 0.083260002914, 0.097903406084, 0.153844425139, 0.278805312173 .single 0.095670858091, 0.063724447388, 0.073223304703, 0.075168110867 .single 0.095670858091, 0.112497027892, 0.176776695297, 0.320364430968 .single 0.098211869798, 0.065416964525, 0.075168110867, 0.077164570954 .single 0.098211869798, 0.115484941564, 0.181471872713, 0.328873289212 .single 0.125000000000, 0.083260002914, 0.095670858091, 0.098211869798 .single 0.125000000000, 0.146984450302, 0.230969883128, 0.418576300766 .single 0.146984450302, 0.097903406084, 0.112497027892, 0.115484941564 .single 0.146984450302, 0.172835429046, 0.271591850464, 0.492193659822 .single 0.230969883128, 0.153844425139, 0.176776695297, 0.181471872713 .single 0.230969883128, 0.271591850464, 0.426776695297, 0.773428154144 .single 0.418576300766, 0.278805312173, 0.320364430968, 0.328873289212 .single 0.418576300766, 0.492193659822, 0.773428154144, 1.401648956504 tab_norm_inv: .single 0.125000000000, 0.320364430968, 0.163320370610, 0.271591850464 .single 0.125000000000, 0.181471872713, 0.067649512518, 0.063724447388 .single 0.320364430968, 0.821066949034, 0.418576300766, 0.696066949034 .single 0.320364430968, 0.465097065906, 0.173379980665, 0.163320370610 .single 0.163320370610, 0.418576300766, 0.213388347648, 0.354851853378 .single 0.163320370610, 0.237104428053, 0.088388347648, 0.083260002914 .single 0.271591850464, 0.696066949034, 0.354851853378, 0.590097065906 .single 0.271591850464, 0.394290253737, 0.146984450302, 0.138456324687 .single 0.125000000000, 0.320364430968, 0.163320370610, 0.271591850464 .single 0.125000000000, 0.181471872713, 0.067649512518, 0.063724447388 .single 0.181471872713, 0.465097065906, 0.237104428053, 0.394290253737 .single 0.181471872713, 0.263456324687, 0.098211869798, 0.092513558441 .single 0.067649512518, 0.173379980665, 0.088388347648, 0.146984450302 .single 0.067649512518, 0.098211869798, 0.036611652352, 0.034487422410 .single 0.063724447388, 0.163320370610, 0.083260002914, 0.138456324687 .single 0.063724447388, 0.092513558441, 0.034487422410, 0.032486441559 .text .p2align 4, 0x90 .globl mfxdct_8x8_fwd_32f mfxdct_8x8_fwd_32f: mov %rdi, %r10 mov %rsi, %r11 lea tab_norm_frw(%rip), %rax test $(15), %r11 jz LALIGNED_16gas_1 LMISALIGNED_16gas_1: mov %rsp, %rcx sub $(256), %rsp and $(-16), %rsp mov %rsp, %r11 LALIGNED_16gas_1: movsd (%r10), %xmm0 movsd (32)(%r10), %xmm5 movlhps %xmm5, %xmm0 movsd (64)(%r10), %xmm7 movsd (96)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (8)(%r10), %xmm2 movsd (40)(%r10), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (72)(%r10), %xmm7 movsd (104)(%r10), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (16)(%r10), %xmm4 movsd (48)(%r10), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (80)(%r10), %xmm7 movsd (112)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (24)(%r10), %xmm6 movsd (56)(%r10), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (16)(%r11) movsd (88)(%r10), %xmm4 movsd (120)(%r10), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm6, %xmm4 addps %xmm1, %xmm6 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm2, %xmm5 subps %xmm4, %xmm2 movaps %xmm7, %xmm4 addps %xmm0, %xmm7 subps %xmm4, %xmm0 movaps %xmm3, (96)(%r11) addps (16)(%r11), %xmm3 movaps %xmm6, %xmm4 subps %xmm5, %xmm6 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 subps %xmm3, %xmm7 addps %xmm7, %xmm6 addps %xmm4, %xmm3 movaps %xmm5, %xmm4 mulps cos_4_16_(%rip), %xmm6 addps %xmm3, %xmm4 subps %xmm5, %xmm3 movaps (96)(%r11), %xmm5 subps (16)(%r11), %xmm5 movaps %xmm4, (%r11) movaps %xmm7, %xmm4 movaps %xmm3, (16)(%r11) subps %xmm6, %xmm4 movaps %xmm4, (80)(%r11) addps %xmm2, %xmm5 addps %xmm1, %xmm2 addps %xmm0, %xmm1 movaps tg_2_16_(%rip), %xmm3 mulps cos6cos6p_(%rip), %xmm2 mulps %xmm5, %xmm3 mulps cos0cos2d_(%rip), %xmm0 addps %xmm1, %xmm3 mulps tg_2_16_(%rip), %xmm1 addps %xmm7, %xmm6 movaps %xmm6, (64)(%r11) subps %xmm1, %xmm5 movaps %xmm2, %xmm4 addps %xmm0, %xmm2 subps %xmm4, %xmm0 movaps %xmm3, %xmm4 addps %xmm2, %xmm3 movaps %xmm3, (32)(%r11) movaps %xmm0, %xmm7 subps %xmm5, %xmm0 movaps %xmm0, (96)(%r11) subps %xmm4, %xmm2 movaps %xmm2, (112)(%r11) addps %xmm7, %xmm5 movaps %xmm5, (48)(%r11) movsd (128)(%r10), %xmm0 movsd (160)(%r10), %xmm5 movlhps %xmm5, %xmm0 movsd (192)(%r10), %xmm7 movsd (224)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (136)(%r10), %xmm2 movsd (168)(%r10), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (200)(%r10), %xmm7 movsd (232)(%r10), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (144)(%r10), %xmm4 movsd (176)(%r10), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (208)(%r10), %xmm7 movsd (240)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (152)(%r10), %xmm6 movsd (184)(%r10), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (144)(%r11) movsd (216)(%r10), %xmm4 movsd (248)(%r10), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm6, %xmm4 addps %xmm1, %xmm6 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm2, %xmm5 subps %xmm4, %xmm2 movaps %xmm7, %xmm4 addps %xmm0, %xmm7 subps %xmm4, %xmm0 movaps %xmm3, (224)(%r11) addps (144)(%r11), %xmm3 movaps %xmm6, %xmm4 subps %xmm5, %xmm6 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 subps %xmm3, %xmm7 addps %xmm7, %xmm6 addps %xmm4, %xmm3 movaps %xmm5, %xmm4 mulps cos_4_16_(%rip), %xmm6 addps %xmm3, %xmm4 subps %xmm5, %xmm3 movaps (224)(%r11), %xmm5 subps (144)(%r11), %xmm5 movaps %xmm4, (128)(%r11) movaps %xmm7, %xmm4 movaps %xmm3, (144)(%r11) subps %xmm6, %xmm4 movaps %xmm4, (208)(%r11) addps %xmm2, %xmm5 addps %xmm1, %xmm2 addps %xmm0, %xmm1 movaps tg_2_16_(%rip), %xmm3 mulps cos6cos6p_(%rip), %xmm2 mulps %xmm5, %xmm3 mulps cos0cos2d_(%rip), %xmm0 addps %xmm1, %xmm3 mulps tg_2_16_(%rip), %xmm1 addps %xmm7, %xmm6 movaps %xmm6, (192)(%r11) subps %xmm1, %xmm5 movaps %xmm2, %xmm4 addps %xmm0, %xmm2 subps %xmm4, %xmm0 movaps %xmm3, %xmm4 addps %xmm2, %xmm3 movaps %xmm3, (160)(%r11) movaps %xmm0, %xmm7 subps %xmm5, %xmm0 movaps %xmm0, (224)(%r11) subps %xmm4, %xmm2 movaps %xmm2, (240)(%r11) addps %xmm7, %xmm5 movaps %xmm5, (176)(%r11) movsd (%r11), %xmm0 movsd (32)(%r11), %xmm5 movlhps %xmm5, %xmm0 movsd (64)(%r11), %xmm7 movsd (96)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (8)(%r11), %xmm2 movsd (40)(%r11), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (72)(%r11), %xmm7 movsd (104)(%r11), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (128)(%r11), %xmm4 movsd (160)(%r11), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (192)(%r11), %xmm7 movsd (224)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (136)(%r11), %xmm6 movsd (168)(%r11), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (128)(%r11) movsd (200)(%r11), %xmm4 movsd (232)(%r11), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm6, %xmm4 addps %xmm1, %xmm6 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm2, %xmm5 subps %xmm4, %xmm2 movaps %xmm7, %xmm4 addps %xmm0, %xmm7 subps %xmm4, %xmm0 movaps %xmm3, (96)(%r11) addps (128)(%r11), %xmm3 movaps %xmm6, %xmm4 subps %xmm5, %xmm6 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 subps %xmm3, %xmm7 addps %xmm7, %xmm6 addps %xmm4, %xmm3 movaps %xmm5, %xmm4 mulps cos_4_16_(%rip), %xmm6 addps %xmm3, %xmm4 mulps (%rax), %xmm4 subps %xmm5, %xmm3 mulps (128)(%rax), %xmm3 movaps (96)(%r11), %xmm5 subps (128)(%r11), %xmm5 movaps %xmm4, (%r11) movaps %xmm7, %xmm4 movaps %xmm3, (128)(%r11) subps %xmm6, %xmm4 addps %xmm7, %xmm6 mulps (192)(%rax), %xmm4 mulps (64)(%rax), %xmm6 addps %xmm2, %xmm5 addps %xmm1, %xmm2 addps %xmm0, %xmm1 movaps tg_2_16_(%rip), %xmm3 mulps cos6cos6p_(%rip), %xmm2 mulps cos0cos2d_(%rip), %xmm0 mulps %xmm5, %xmm3 addps %xmm1, %xmm3 mulps tg_2_16_(%rip), %xmm1 movaps %xmm4, (192)(%r11) movaps %xmm6, (64)(%r11) movaps %xmm2, %xmm4 addps %xmm0, %xmm2 subps %xmm4, %xmm0 movaps %xmm3, %xmm4 addps %xmm2, %xmm3 mulps (32)(%rax), %xmm3 subps %xmm1, %xmm5 movaps %xmm3, (32)(%r11) movaps %xmm0, %xmm7 subps %xmm5, %xmm0 mulps (96)(%rax), %xmm0 subps %xmm4, %xmm2 mulps (224)(%rax), %xmm2 movaps %xmm0, (96)(%r11) addps %xmm7, %xmm5 mulps (160)(%rax), %xmm5 movaps %xmm2, (224)(%r11) movaps %xmm5, (160)(%r11) movsd (16)(%r11), %xmm0 movsd (48)(%r11), %xmm5 movlhps %xmm5, %xmm0 movsd (80)(%r11), %xmm7 movsd (112)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (24)(%r11), %xmm2 movsd (56)(%r11), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (88)(%r11), %xmm7 movsd (120)(%r11), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (144)(%r11), %xmm4 movsd (176)(%r11), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (208)(%r11), %xmm7 movsd (240)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (152)(%r11), %xmm6 movsd (184)(%r11), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (144)(%r11) movsd (216)(%r11), %xmm4 movsd (248)(%r11), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm6, %xmm4 addps %xmm1, %xmm6 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm2, %xmm5 subps %xmm4, %xmm2 movaps %xmm7, %xmm4 addps %xmm0, %xmm7 subps %xmm4, %xmm0 movaps %xmm3, (112)(%r11) addps (144)(%r11), %xmm3 movaps %xmm6, %xmm4 subps %xmm5, %xmm6 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 subps %xmm3, %xmm7 addps %xmm7, %xmm6 addps %xmm4, %xmm3 movaps %xmm5, %xmm4 mulps cos_4_16_(%rip), %xmm6 addps %xmm3, %xmm4 mulps (16)(%rax), %xmm4 subps %xmm5, %xmm3 mulps (144)(%rax), %xmm3 movaps (112)(%r11), %xmm5 subps (144)(%r11), %xmm5 movaps %xmm4, (16)(%r11) movaps %xmm7, %xmm4 movaps %xmm3, (144)(%r11) subps %xmm6, %xmm4 addps %xmm7, %xmm6 mulps (208)(%rax), %xmm4 mulps (80)(%rax), %xmm6 addps %xmm2, %xmm5 addps %xmm1, %xmm2 addps %xmm0, %xmm1 movaps tg_2_16_(%rip), %xmm3 mulps cos6cos6p_(%rip), %xmm2 mulps cos0cos2d_(%rip), %xmm0 mulps %xmm5, %xmm3 addps %xmm1, %xmm3 mulps tg_2_16_(%rip), %xmm1 movaps %xmm4, (208)(%r11) movaps %xmm6, (80)(%r11) movaps %xmm2, %xmm4 addps %xmm0, %xmm2 subps %xmm4, %xmm0 movaps %xmm3, %xmm4 addps %xmm2, %xmm3 mulps (48)(%rax), %xmm3 subps %xmm1, %xmm5 movaps %xmm3, (48)(%r11) movaps %xmm0, %xmm7 subps %xmm5, %xmm0 mulps (112)(%rax), %xmm0 subps %xmm4, %xmm2 mulps (240)(%rax), %xmm2 movaps %xmm0, (112)(%r11) addps %xmm7, %xmm5 mulps (176)(%rax), %xmm5 movaps %xmm2, (240)(%r11) movaps %xmm5, (176)(%r11) cmp %rsp, %r11 jne LEXITgas_1 mov %rsi, %r11 mov $(256), %rax .p2align 4, 0x90 L__0037gas_1: movaps (-32)(%rsp,%rax), %xmm0 movlps %xmm0, (-32)(%r11,%rax) movhps %xmm0, (-24)(%r11,%rax) movaps (-16)(%rsp,%rax), %xmm0 movlps %xmm0, (-16)(%r11,%rax) movhps %xmm0, (-8)(%r11,%rax) sub $(32), %rax jg L__0037gas_1 mov %rcx, %rsp LEXITgas_1: ret .p2align 4, 0x90 .globl mfxdct_8x8_inv_32f mfxdct_8x8_inv_32f: mov %rdi, %r10 mov %rsi, %r11 lea tab_norm_inv(%rip), %rax test $(15), %r11 jz LALIGNED_16gas_2 LMISALIGNED_16gas_2: mov %rsp, %rcx sub $(256), %rsp and $(-16), %rsp mov %rsp, %r11 LALIGNED_16gas_2: movsd (%r10), %xmm0 movsd (32)(%r10), %xmm5 movlhps %xmm5, %xmm0 movsd (64)(%r10), %xmm7 movsd (96)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (8)(%r10), %xmm2 movsd (40)(%r10), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (72)(%r10), %xmm7 movsd (104)(%r10), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (16)(%r10), %xmm4 movsd (48)(%r10), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (80)(%r10), %xmm7 movsd (112)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (24)(%r10), %xmm6 movsd (56)(%r10), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (16)(%r11) movsd (88)(%r10), %xmm4 movsd (120)(%r10), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 mulps (96)(%rax), %xmm3 mulps (160)(%rax), %xmm5 mulps (224)(%rax), %xmm7 mulps (32)(%rax), %xmm1 movaps %xmm3, %xmm4 subps %xmm5, %xmm3 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 addps %xmm1, %xmm7 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm7, %xmm5 subps %xmm4, %xmm7 movaps tg_2_16_(%rip), %xmm4 mulps %xmm3, %xmm4 addps %xmm1, %xmm4 mulps tg_2_16_(%rip), %xmm1 mulps cos2cos6m_(%rip), %xmm5 mulps cos6cos6p_(%rip), %xmm7 subps %xmm3, %xmm1 subps %xmm5, %xmm4 subps %xmm4, %xmm7 mulps (192)(%rax), %xmm6 mulps (64)(%rax), %xmm2 movaps %xmm0, (%r11) addps (16)(%r11), %xmm0 mulps (%rax), %xmm0 movaps %xmm6, %xmm3 addps %xmm2, %xmm6 subps %xmm3, %xmm2 mulps cos4cos4p_(%rip), %xmm2 movaps %xmm6, %xmm3 addps %xmm0, %xmm6 subps %xmm3, %xmm0 subps %xmm3, %xmm2 movaps %xmm5, %xmm3 addps %xmm6, %xmm5 subps %xmm3, %xmm6 movaps (%r11), %xmm3 movaps %xmm5, (%r11) subps (16)(%r11), %xmm3 subps %xmm7, %xmm1 mulps (%rax), %xmm3 movaps %xmm6, (112)(%r11) movaps %xmm1, %xmm5 addps %xmm0, %xmm1 subps %xmm5, %xmm0 movaps %xmm2, %xmm5 addps %xmm3, %xmm2 movaps %xmm1, (96)(%r11) subps %xmm5, %xmm3 movaps %xmm0, (16)(%r11) movaps %xmm4, %xmm6 addps %xmm2, %xmm4 movaps %xmm4, (32)(%r11) movaps %xmm7, %xmm5 addps %xmm3, %xmm7 movaps %xmm7, (64)(%r11) subps %xmm6, %xmm2 movaps %xmm2, (80)(%r11) subps %xmm5, %xmm3 movaps %xmm3, (48)(%r11) movsd (128)(%r10), %xmm0 movsd (160)(%r10), %xmm5 movlhps %xmm5, %xmm0 movsd (192)(%r10), %xmm7 movsd (224)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (136)(%r10), %xmm2 movsd (168)(%r10), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (200)(%r10), %xmm7 movsd (232)(%r10), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (144)(%r10), %xmm4 movsd (176)(%r10), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (208)(%r10), %xmm7 movsd (240)(%r10), %xmm5 movlhps %xmm5, %xmm7 movsd (152)(%r10), %xmm6 movsd (184)(%r10), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (144)(%r11) movsd (216)(%r10), %xmm4 movsd (248)(%r10), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 mulps (112)(%rax), %xmm3 mulps (176)(%rax), %xmm5 mulps (240)(%rax), %xmm7 mulps (48)(%rax), %xmm1 movaps %xmm3, %xmm4 subps %xmm5, %xmm3 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 addps %xmm1, %xmm7 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm7, %xmm5 subps %xmm4, %xmm7 movaps tg_2_16_(%rip), %xmm4 mulps %xmm3, %xmm4 addps %xmm1, %xmm4 mulps tg_2_16_(%rip), %xmm1 mulps cos2cos6m_(%rip), %xmm5 mulps cos6cos6p_(%rip), %xmm7 subps %xmm3, %xmm1 subps %xmm5, %xmm4 subps %xmm4, %xmm7 mulps (208)(%rax), %xmm6 mulps (80)(%rax), %xmm2 movaps %xmm0, (128)(%r11) addps (144)(%r11), %xmm0 mulps (16)(%rax), %xmm0 movaps %xmm6, %xmm3 addps %xmm2, %xmm6 subps %xmm3, %xmm2 mulps cos4cos4p_(%rip), %xmm2 movaps %xmm6, %xmm3 addps %xmm0, %xmm6 subps %xmm3, %xmm0 subps %xmm3, %xmm2 movaps %xmm5, %xmm3 addps %xmm6, %xmm5 subps %xmm3, %xmm6 movaps (128)(%r11), %xmm3 movaps %xmm5, (128)(%r11) subps (144)(%r11), %xmm3 subps %xmm7, %xmm1 mulps (16)(%rax), %xmm3 movaps %xmm6, (240)(%r11) movaps %xmm1, %xmm5 addps %xmm0, %xmm1 subps %xmm5, %xmm0 movaps %xmm2, %xmm5 addps %xmm3, %xmm2 movaps %xmm1, (224)(%r11) subps %xmm5, %xmm3 movaps %xmm0, (144)(%r11) movaps %xmm4, %xmm6 addps %xmm2, %xmm4 movaps %xmm4, (160)(%r11) movaps %xmm7, %xmm5 addps %xmm3, %xmm7 movaps %xmm7, (192)(%r11) subps %xmm6, %xmm2 movaps %xmm2, (208)(%r11) subps %xmm5, %xmm3 movaps %xmm3, (176)(%r11) movsd (%r11), %xmm0 movsd (32)(%r11), %xmm5 movlhps %xmm5, %xmm0 movsd (64)(%r11), %xmm7 movsd (96)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (8)(%r11), %xmm2 movsd (40)(%r11), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (72)(%r11), %xmm7 movsd (104)(%r11), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (128)(%r11), %xmm4 movsd (160)(%r11), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (192)(%r11), %xmm7 movsd (224)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (136)(%r11), %xmm6 movsd (168)(%r11), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (128)(%r11) movsd (200)(%r11), %xmm4 movsd (232)(%r11), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm3, %xmm4 subps %xmm5, %xmm3 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 addps %xmm1, %xmm7 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm7, %xmm5 subps %xmm4, %xmm7 movaps tg_2_16_(%rip), %xmm4 mulps %xmm3, %xmm4 mulps cos2cos6m_(%rip), %xmm5 mulps cos6cos6p_(%rip), %xmm7 addps %xmm1, %xmm4 mulps tg_2_16_(%rip), %xmm1 subps %xmm3, %xmm1 subps %xmm5, %xmm4 subps %xmm4, %xmm7 movaps %xmm0, (%r11) addps (128)(%r11), %xmm0 movaps %xmm6, %xmm3 addps %xmm2, %xmm6 subps %xmm3, %xmm2 mulps cos4cos4p_(%rip), %xmm2 movaps %xmm6, %xmm3 addps %xmm0, %xmm6 subps %xmm3, %xmm0 subps %xmm3, %xmm2 subps %xmm7, %xmm1 movaps %xmm5, %xmm3 addps %xmm6, %xmm5 subps %xmm3, %xmm6 movaps (%r11), %xmm3 movaps %xmm5, (%r11) subps (128)(%r11), %xmm3 movaps %xmm6, (224)(%r11) movaps %xmm1, %xmm5 addps %xmm0, %xmm1 subps %xmm5, %xmm0 movaps %xmm1, (96)(%r11) movaps %xmm0, (128)(%r11) movaps %xmm2, %xmm5 addps %xmm3, %xmm2 subps %xmm5, %xmm3 movaps %xmm4, %xmm6 addps %xmm2, %xmm4 movaps %xmm4, (32)(%r11) movaps %xmm7, %xmm5 addps %xmm3, %xmm7 movaps %xmm7, (64)(%r11) subps %xmm5, %xmm3 movaps %xmm3, (160)(%r11) subps %xmm6, %xmm2 movaps %xmm2, (192)(%r11) movsd (16)(%r11), %xmm0 movsd (48)(%r11), %xmm5 movlhps %xmm5, %xmm0 movsd (80)(%r11), %xmm7 movsd (112)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (24)(%r11), %xmm2 movsd (56)(%r11), %xmm5 movlhps %xmm5, %xmm2 movaps %xmm0, %xmm1 shufps $(136), %xmm7, %xmm0 shufps $(221), %xmm7, %xmm1 movsd (88)(%r11), %xmm7 movsd (120)(%r11), %xmm5 movlhps %xmm5, %xmm7 movaps %xmm2, %xmm3 shufps $(136), %xmm7, %xmm2 movsd (144)(%r11), %xmm4 movsd (176)(%r11), %xmm5 movlhps %xmm5, %xmm4 shufps $(221), %xmm7, %xmm3 movsd (208)(%r11), %xmm7 movsd (240)(%r11), %xmm5 movlhps %xmm5, %xmm7 movsd (152)(%r11), %xmm6 movsd (184)(%r11), %xmm5 movlhps %xmm5, %xmm6 movaps %xmm4, %xmm5 shufps $(136), %xmm7, %xmm4 shufps $(221), %xmm7, %xmm5 movaps %xmm4, (144)(%r11) movsd (216)(%r11), %xmm4 movsd (248)(%r11), %xmm7 movlhps %xmm7, %xmm4 movaps %xmm6, %xmm7 shufps $(136), %xmm4, %xmm6 shufps $(221), %xmm4, %xmm7 movaps %xmm3, %xmm4 subps %xmm5, %xmm3 addps %xmm4, %xmm5 movaps %xmm7, %xmm4 addps %xmm1, %xmm7 subps %xmm4, %xmm1 movaps %xmm5, %xmm4 addps %xmm7, %xmm5 subps %xmm4, %xmm7 movaps tg_2_16_(%rip), %xmm4 mulps %xmm3, %xmm4 mulps cos2cos6m_(%rip), %xmm5 mulps cos6cos6p_(%rip), %xmm7 addps %xmm1, %xmm4 mulps tg_2_16_(%rip), %xmm1 subps %xmm3, %xmm1 subps %xmm5, %xmm4 subps %xmm4, %xmm7 movaps %xmm0, (16)(%r11) addps (144)(%r11), %xmm0 movaps %xmm6, %xmm3 addps %xmm2, %xmm6 subps %xmm3, %xmm2 mulps cos4cos4p_(%rip), %xmm2 movaps %xmm6, %xmm3 addps %xmm0, %xmm6 subps %xmm3, %xmm0 subps %xmm3, %xmm2 subps %xmm7, %xmm1 movaps %xmm5, %xmm3 addps %xmm6, %xmm5 subps %xmm3, %xmm6 movaps (16)(%r11), %xmm3 movaps %xmm5, (16)(%r11) subps (144)(%r11), %xmm3 movaps %xmm6, (240)(%r11) movaps %xmm1, %xmm5 addps %xmm0, %xmm1 subps %xmm5, %xmm0 movaps %xmm1, (112)(%r11) movaps %xmm0, (144)(%r11) movaps %xmm2, %xmm5 addps %xmm3, %xmm2 subps %xmm5, %xmm3 movaps %xmm4, %xmm6 addps %xmm2, %xmm4 movaps %xmm4, (48)(%r11) movaps %xmm7, %xmm5 addps %xmm3, %xmm7 movaps %xmm7, (80)(%r11) subps %xmm5, %xmm3 movaps %xmm3, (176)(%r11) subps %xmm6, %xmm2 movaps %xmm2, (208)(%r11) cmp %rsp, %r11 jne LEXITgas_2 mov %rsi, %r11 mov $(256), %rax .p2align 4, 0x90 L__0074gas_2: movaps (-32)(%rsp,%rax), %xmm0 movlps %xmm0, (-32)(%r11,%rax) movhps %xmm0, (-24)(%r11,%rax) movaps (-16)(%rsp,%rax), %xmm0 movlps %xmm0, (-16)(%r11,%rax) movhps %xmm0, (-8)(%r11,%rax) sub $(32), %rax jg L__0074gas_2 mov %rcx, %rsp LEXITgas_2: ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pidct88i_3_m7as.s000066400000000000000000000410531443134507600274270ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 c_0000: .long 0, 0, 0, 0 one_corr: .word 1, 1, 1, 1 .word 1, 1, 1, 1 round_frw_row: .long 524288, 524288 .long 524288, 524288 round_i_0: .long 65536, 65536 .long 65536, 65536 round_i_1: .long 2901, 2901 .long 2901, 2901 round_i_2: .long 2260, 2260 .long 2260, 2260 round_i_3: .long 1704, 1704 .long 1704, 1704 round_i_4: .long 1024, 1024 .long 1024, 1024 round_i_5: .long 455, 455 .long 455, 455 round_i_6: .long 512, 512 .long 512, 512 round_i_7: .long 373, 373 .long 373, 373 tg_1_16: .word 13036, 13036, 13036, 13036 .word 13036, 13036, 13036, 13036 tg_2_16: .word 27146, 27146, 27146, 27146 .word 27146, 27146, 27146, 27146 tg_3_16: .word -21746, -21746, -21746, -21746 .word -21746, -21746, -21746, -21746 cos_4_16: .word -19195, -19195, -19195, -19195 .word -19195, -19195, -19195, -19195 ocos_4_16: .word 23170, 23170, 23170, 23170 .word 23170, 23170, 23170, 23170 .p2align 4, 0x90 tab_f_04: .word 16384, 16384, 22725, 19266 .word -8867, -21407, -22725, -12873 .word 16384, 16384, 12873, 4520 .word 21407, 8867, 19266, -4520 .word 16384, -16384, 12873, -22725 .word 21407, -8867, 19266, -22725 .word -16384, 16384, 4520, 19266 .word 8867, -21407, 4520, -12873 tab_f_17: .word 22725, 22725, 31521, 26722 .word -12299, -29692, -31521, -17855 .word 22725, 22725, 17855, 6270 .word 29692, 12299, 26722, -6270 .word 22725, -22725, 17855, -31521 .word 29692, -12299, 26722, -31521 .word -22725, 22725, 6270, 26722 .word 12299, -29692, 6270, -17855 tab_f_26: .word 21407, 21407, 29692, 25172 .word -11585, -27969, -29692, -16819 .word 21407, 21407, 16819, 5906 .word 27969, 11585, 25172, -5906 .word 21407, -21407, 16819, -29692 .word 27969, -11585, 25172, -29692 .word -21407, 21407, 5906, 25172 .word 11585, -27969, 5906, -16819 tab_f_35: .word 19266, 19266, 26722, 22654 .word -10426, -25172, -26722, -15137 .word 19266, 19266, 15137, 5315 .word 25172, 10426, 22654, -5315 .word 19266, -19266, 15137, -26722 .word 25172, -10426, 22654, -26722 .word -19266, 19266, 5315, 22654 .word 10426, -25172, 5315, -15137 tab_i_04: .word 16384, 21407, 16384, 8867 .word -16384, 21407, 16384, -8867 .word 16384, -8867, 16384, -21407 .word 16384, 8867, -16384, -21407 .word 22725, 19266, 19266, -4520 .word 4520, 19266, 19266, -22725 .word 12873, -22725, 4520, -12873 .word 12873, 4520, -22725, -12873 tab_i_17: .word 22725, 29692, 22725, 12299 .word -22725, 29692, 22725, -12299 .word 22725, -12299, 22725, -29692 .word 22725, 12299, -22725, -29692 .word 31521, 26722, 26722, -6270 .word 6270, 26722, 26722, -31521 .word 17855, -31521, 6270, -17855 .word 17855, 6270, -31521, -17855 tab_i_26: .word 21407, 27969, 21407, 11585 .word -21407, 27969, 21407, -11585 .word 21407, -11585, 21407, -27969 .word 21407, 11585, -21407, -27969 .word 29692, 25172, 25172, -5906 .word 5906, 25172, 25172, -29692 .word 16819, -29692, 5906, -16819 .word 16819, 5906, -29692, -16819 tab_i_35: .word 19266, 25172, 19266, 10426 .word -19266, 25172, 19266, -10426 .word 19266, -10426, 19266, -25172 .word 19266, 10426, -19266, -25172 .word 26722, 22654, 22654, -5315 .word 5315, 22654, 22654, -26722 .word 15137, -26722, 5315, -15137 .word 15137, 5315, -26722, -15137 tab_i2_0: .word 16384, 22725, 16384, 19266 .word 16384, 12873, 16384, 4520 .word 16384, -4520, 16384, -12873 .word 16384, -19266, 16384, -22725 tab_i2_1: .word 22725, 31521, 22725, 26722 .word 22725, 17855, 22725, 6270 .word 22725, -6270, 22725, -17855 .word 22725, -26722, 22725, -31521 tab_i4_0: .word 16384, 21407, 16384, 8867 .word 16384, -8867, 16384, -21407 .word 22725, 19266, 19266, -4520 .word 12873, -22725, 4520, -12873 tab_i4_1: .word 22725, 29692, 22725, 12299 .word 22725, -12299, 22725, -29692 .word 31521, 26722, 26722, -6270 .word 17855, -31521, 6270, -17855 tab_i4_2: .word 21407, 27969, 21407, 11585 .word 21407, -11585, 21407, -27969 .word 29692, 25172, 25172, -5906 .word 16819, -29692, 5906, -16819 tab_i4_3: .word 19266, 25172, 19266, 10426 .word 19266, -10426, 19266, -25172 .word 26722, 22654, 22654, -5315 .word 15137, -26722, 5315, -15137 .text .p2align 4, 0x90 .globl mfxdct_8x8_inv_2x2_16s mfxdct_8x8_inv_2x2_16s: mov %rdi, %r10 mov %rsi, %r11 movd (%r10), %xmm0 pshufd $(0), %xmm0, %xmm0 movdqa tab_i2_0(%rip), %xmm6 pmaddwd %xmm0, %xmm6 pmaddwd tab_i2_0+16(%rip), %xmm0 movdqa round_i_0(%rip), %xmm2 paddd %xmm2, %xmm6 paddd %xmm2, %xmm0 psrad $(11), %xmm6 psrad $(11), %xmm0 packssdw %xmm0, %xmm6 movd (16)(%r10), %xmm0 pshufd $(0), %xmm0, %xmm0 movdqa tab_i2_1(%rip), %xmm7 pmaddwd %xmm0, %xmm7 pmaddwd tab_i2_1+16(%rip), %xmm0 movdqa round_i_1(%rip), %xmm2 paddd %xmm2, %xmm7 paddd %xmm2, %xmm0 psrad $(11), %xmm7 psrad $(11), %xmm0 packssdw %xmm0, %xmm7 test $(15), %r11 jnz LMISALIGNED_DSTgas_5 LALIGNED_DSTgas_5: movdqa %xmm6, %xmm2 paddsw one_corr(%rip), %xmm2 movdqa %xmm6, %xmm3 psubsw one_corr(%rip), %xmm3 movdqa tg_1_16(%rip), %xmm0 pmulhw %xmm7, %xmm0 movdqa %xmm7, %xmm1 paddsw %xmm2, %xmm1 psubsw %xmm7, %xmm2 movdqa %xmm0, %xmm4 paddsw %xmm3, %xmm0 psubsw %xmm4, %xmm3 movdqa %xmm7, %xmm5 psubsw %xmm4, %xmm5 paddsw %xmm7, %xmm4 movdqa cos_4_16(%rip), %xmm7 pmulhw %xmm5, %xmm7 paddsw %xmm5, %xmm7 movdqa cos_4_16(%rip), %xmm5 pmulhw %xmm4, %xmm5 paddsw %xmm4, %xmm5 movdqa %xmm6, %xmm4 psubsw %xmm7, %xmm4 paddsw %xmm6, %xmm7 psraw $(6), %xmm1 movdqa %xmm1, (%r11) movdqa %xmm6, %xmm1 psubsw %xmm5, %xmm1 paddsw %xmm6, %xmm5 psraw $(6), %xmm2 movdqa %xmm2, (112)(%r11) psraw $(6), %xmm0 movdqa %xmm0, (48)(%r11) psraw $(6), %xmm3 movdqa %xmm3, (64)(%r11) psraw $(6), %xmm7 movdqa %xmm7, (32)(%r11) psraw $(6), %xmm4 movdqa %xmm4, (80)(%r11) psraw $(6), %xmm5 movdqa %xmm5, (16)(%r11) psraw $(6), %xmm1 movdqa %xmm1, (96)(%r11) ret LMISALIGNED_DSTgas_5: movdqa %xmm6, %xmm2 paddsw one_corr(%rip), %xmm2 movdqa %xmm6, %xmm3 psubsw one_corr(%rip), %xmm3 movdqa tg_1_16(%rip), %xmm0 pmulhw %xmm7, %xmm0 movdqa %xmm7, %xmm1 paddsw %xmm2, %xmm1 psubsw %xmm7, %xmm2 movdqa %xmm0, %xmm4 paddsw %xmm3, %xmm0 psubsw %xmm4, %xmm3 movdqa %xmm7, %xmm5 psubsw %xmm4, %xmm5 paddsw %xmm7, %xmm4 movdqa cos_4_16(%rip), %xmm7 pmulhw %xmm5, %xmm7 paddsw %xmm5, %xmm7 movdqa cos_4_16(%rip), %xmm5 pmulhw %xmm4, %xmm5 paddsw %xmm4, %xmm5 movdqa %xmm6, %xmm4 psubsw %xmm7, %xmm4 paddsw %xmm6, %xmm7 psraw $(6), %xmm1 movlps %xmm1, (%r11) movhps %xmm1, (8)(%r11) movdqa %xmm6, %xmm1 psubsw %xmm5, %xmm1 paddsw %xmm6, %xmm5 psraw $(6), %xmm2 movlps %xmm2, (112)(%r11) movhps %xmm2, (120)(%r11) psraw $(6), %xmm0 movlps %xmm0, (48)(%r11) movhps %xmm0, (56)(%r11) psraw $(6), %xmm3 movlps %xmm3, (64)(%r11) movhps %xmm3, (72)(%r11) psraw $(6), %xmm7 movlps %xmm7, (32)(%r11) movhps %xmm7, (40)(%r11) psraw $(6), %xmm4 movlps %xmm4, (80)(%r11) movhps %xmm4, (88)(%r11) psraw $(6), %xmm5 movlps %xmm5, (16)(%r11) movhps %xmm5, (24)(%r11) psraw $(6), %xmm1 movlps %xmm1, (96)(%r11) movhps %xmm1, (104)(%r11) ret .p2align 4, 0x90 .globl mfxdct_8x8_inv_4x4_16s mfxdct_8x8_inv_4x4_16s: mov %rdi, %r10 mov %rsi, %r11 test $(15), %r11 jz LIDCT_FOR_ROWSgas_6 mov %rsp, %rax sub $(128), %rsp and $(-16), %rsp mov %rsp, %r11 LIDCT_FOR_ROWSgas_6: movq (16)(%r10), %xmm0 movq (48)(%r10), %xmm4 pshuflw $(136), %xmm0, %xmm1 pshuflw $(221), %xmm0, %xmm0 punpcklqdq %xmm1, %xmm1 punpcklqdq %xmm0, %xmm0 pshuflw $(136), %xmm4, %xmm5 pshuflw $(221), %xmm4, %xmm4 punpcklqdq %xmm5, %xmm5 punpcklqdq %xmm4, %xmm4 pmaddwd tab_i4_1(%rip), %xmm1 pmaddwd tab_i4_1+16(%rip), %xmm0 pmaddwd tab_i4_3(%rip), %xmm5 pmaddwd tab_i4_3+16(%rip), %xmm4 paddd round_i_1(%rip), %xmm1 paddd round_i_3(%rip), %xmm5 movdqa %xmm1, %xmm2 psubd %xmm0, %xmm2 psrad $(11), %xmm2 paddd %xmm0, %xmm1 psrad $(11), %xmm1 movdqa %xmm5, %xmm6 psubd %xmm4, %xmm6 psrad $(11), %xmm6 paddd %xmm4, %xmm5 psrad $(11), %xmm5 packssdw %xmm2, %xmm1 pshufhw $(27), %xmm1, %xmm1 packssdw %xmm6, %xmm5 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm1, (16)(%r11) movdqa %xmm5, (48)(%r11) movq (%r10), %xmm0 movq (32)(%r10), %xmm4 pshuflw $(136), %xmm0, %xmm1 pshuflw $(221), %xmm0, %xmm0 punpcklqdq %xmm1, %xmm1 punpcklqdq %xmm0, %xmm0 pshuflw $(136), %xmm4, %xmm5 pshuflw $(221), %xmm4, %xmm4 punpcklqdq %xmm5, %xmm5 punpcklqdq %xmm4, %xmm4 pmaddwd tab_i4_0(%rip), %xmm1 pmaddwd tab_i4_0+16(%rip), %xmm0 pmaddwd tab_i4_2(%rip), %xmm5 pmaddwd tab_i4_2+16(%rip), %xmm4 paddd round_i_0(%rip), %xmm1 paddd round_i_2(%rip), %xmm5 movdqa %xmm1, %xmm2 psubd %xmm0, %xmm2 psrad $(11), %xmm2 paddd %xmm0, %xmm1 psrad $(11), %xmm1 movdqa %xmm5, %xmm6 psubd %xmm4, %xmm6 psrad $(11), %xmm6 paddd %xmm4, %xmm5 psrad $(11), %xmm5 packssdw %xmm2, %xmm1 pshufhw $(27), %xmm1, %xmm1 packssdw %xmm6, %xmm5 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm1, (%r11) movdqa %xmm5, (32)(%r11) cmp %rsp, %r11 je LMISALIGNED_DSTgas_6 LALIGNED_DSTgas_6: movdqa tg_3_16(%rip), %xmm0 movdqa (48)(%r11), %xmm1 pmulhw %xmm1, %xmm0 movdqa tg_1_16(%rip), %xmm2 movdqa (16)(%r11), %xmm3 pmulhw %xmm3, %xmm2 movdqa tg_2_16(%rip), %xmm4 pmulhw (32)(%r11), %xmm4 paddsw %xmm1, %xmm0 psubsw %xmm1, %xmm3 movdqa %xmm2, %xmm1 paddsw %xmm0, %xmm2 psubsw %xmm0, %xmm1 movdqa %xmm3, %xmm0 paddsw %xmm2, %xmm3 psubsw %xmm2, %xmm0 movdqa cos_4_16(%rip), %xmm5 pmulhw %xmm3, %xmm5 movdqa cos_4_16(%rip), %xmm6 pmulhw %xmm0, %xmm6 movdqa (%r11), %xmm7 psubsw %xmm4, %xmm7 paddsw (%r11), %xmm4 paddsw %xmm3, %xmm5 paddsw %xmm0, %xmm6 movdqa %xmm4, %xmm3 paddsw %xmm5, %xmm4 psubsw %xmm5, %xmm3 movdqa %xmm7, %xmm0 paddsw %xmm6, %xmm7 psubsw %xmm6, %xmm0 movdqa (%r11), %xmm5 movdqa (32)(%r11), %xmm6 psubsw %xmm6, %xmm5 paddsw (%r11), %xmm6 movdqa %xmm5, %xmm2 paddsw %xmm1, %xmm5 psubsw %xmm1, %xmm2 movdqa (16)(%r11), %xmm1 paddsw (48)(%r11), %xmm1 psraw $(6), %xmm4 movdqa %xmm4, (16)(%r11) movdqa %xmm6, %xmm4 paddsw %xmm1, %xmm6 psubsw %xmm1, %xmm4 psraw $(6), %xmm3 movdqa %xmm3, (96)(%r11) psraw $(6), %xmm7 movdqa %xmm7, (32)(%r11) psraw $(6), %xmm0 movdqa %xmm0, (80)(%r11) psraw $(6), %xmm5 movdqa %xmm5, (48)(%r11) psraw $(6), %xmm2 movdqa %xmm2, (64)(%r11) psraw $(6), %xmm6 movdqa %xmm6, (%r11) psraw $(6), %xmm4 movdqa %xmm4, (112)(%r11) ret LMISALIGNED_DSTgas_6: mov %rsi, %r11 movdqa tg_3_16(%rip), %xmm0 movdqa (48)(%rsp), %xmm1 pmulhw %xmm1, %xmm0 movdqa tg_1_16(%rip), %xmm2 movdqa (16)(%rsp), %xmm3 pmulhw %xmm3, %xmm2 movdqa tg_2_16(%rip), %xmm4 pmulhw (32)(%rsp), %xmm4 paddsw %xmm1, %xmm0 psubsw %xmm1, %xmm3 movdqa %xmm2, %xmm1 paddsw %xmm0, %xmm2 psubsw %xmm0, %xmm1 movdqa %xmm3, %xmm0 paddsw %xmm2, %xmm3 psubsw %xmm2, %xmm0 movdqa cos_4_16(%rip), %xmm5 pmulhw %xmm3, %xmm5 movdqa cos_4_16(%rip), %xmm6 pmulhw %xmm0, %xmm6 movdqa (%rsp), %xmm7 psubsw %xmm4, %xmm7 paddsw (%rsp), %xmm4 paddsw %xmm3, %xmm5 paddsw %xmm0, %xmm6 movdqa %xmm4, %xmm3 paddsw %xmm5, %xmm4 psubsw %xmm5, %xmm3 movdqa %xmm7, %xmm0 paddsw %xmm6, %xmm7 psubsw %xmm6, %xmm0 movdqa (%rsp), %xmm5 movdqa (32)(%rsp), %xmm6 psubsw %xmm6, %xmm5 paddsw (%rsp), %xmm6 movdqa %xmm5, %xmm2 paddsw %xmm1, %xmm5 psubsw %xmm1, %xmm2 movdqa (16)(%rsp), %xmm1 paddsw (48)(%rsp), %xmm1 psraw $(6), %xmm4 movlps %xmm4, (16)(%r11) movhps %xmm4, (24)(%r11) movdqa %xmm6, %xmm4 paddsw %xmm1, %xmm6 psubsw %xmm1, %xmm4 psraw $(6), %xmm3 movlps %xmm3, (96)(%r11) movhps %xmm3, (104)(%r11) psraw $(6), %xmm7 movlps %xmm7, (32)(%r11) movhps %xmm7, (40)(%r11) psraw $(6), %xmm0 movlps %xmm0, (80)(%r11) movhps %xmm0, (88)(%r11) psraw $(6), %xmm5 movlps %xmm5, (48)(%r11) movhps %xmm5, (56)(%r11) psraw $(6), %xmm2 movlps %xmm2, (64)(%r11) movhps %xmm2, (72)(%r11) psraw $(6), %xmm6 movlps %xmm6, (%r11) movhps %xmm6, (8)(%r11) psraw $(6), %xmm4 movlps %xmm4, (112)(%r11) movhps %xmm4, (120)(%r11) mov %rax, %rsp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pidct88im7as.s000066400000000000000000000575031443134507600270550ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 c_0000: .long 0, 0, 0, 0 one_corr: .word 1, 1, 1, 1 .word 1, 1, 1, 1 round_frw_row: .long 524288, 524288 .long 524288, 524288 round_i_0: .long 65536, 65536 .long 65536, 65536 round_i_1: .long 2901, 2901 .long 2901, 2901 round_i_2: .long 2260, 2260 .long 2260, 2260 round_i_3: .long 1704, 1704 .long 1704, 1704 round_i_4: .long 1024, 1024 .long 1024, 1024 round_i_5: .long 455, 455 .long 455, 455 round_i_6: .long 512, 512 .long 512, 512 round_i_7: .long 373, 373 .long 373, 373 tg_1_16: .word 13036, 13036, 13036, 13036 .word 13036, 13036, 13036, 13036 tg_2_16: .word 27146, 27146, 27146, 27146 .word 27146, 27146, 27146, 27146 tg_3_16: .word -21746, -21746, -21746, -21746 .word -21746, -21746, -21746, -21746 cos_4_16: .word -19195, -19195, -19195, -19195 .word -19195, -19195, -19195, -19195 ocos_4_16: .word 23170, 23170, 23170, 23170 .word 23170, 23170, 23170, 23170 .p2align 4, 0x90 tab_f_04: .word 16384, 16384, 22725, 19266 .word -8867, -21407, -22725, -12873 .word 16384, 16384, 12873, 4520 .word 21407, 8867, 19266, -4520 .word 16384, -16384, 12873, -22725 .word 21407, -8867, 19266, -22725 .word -16384, 16384, 4520, 19266 .word 8867, -21407, 4520, -12873 tab_f_17: .word 22725, 22725, 31521, 26722 .word -12299, -29692, -31521, -17855 .word 22725, 22725, 17855, 6270 .word 29692, 12299, 26722, -6270 .word 22725, -22725, 17855, -31521 .word 29692, -12299, 26722, -31521 .word -22725, 22725, 6270, 26722 .word 12299, -29692, 6270, -17855 tab_f_26: .word 21407, 21407, 29692, 25172 .word -11585, -27969, -29692, -16819 .word 21407, 21407, 16819, 5906 .word 27969, 11585, 25172, -5906 .word 21407, -21407, 16819, -29692 .word 27969, -11585, 25172, -29692 .word -21407, 21407, 5906, 25172 .word 11585, -27969, 5906, -16819 tab_f_35: .word 19266, 19266, 26722, 22654 .word -10426, -25172, -26722, -15137 .word 19266, 19266, 15137, 5315 .word 25172, 10426, 22654, -5315 .word 19266, -19266, 15137, -26722 .word 25172, -10426, 22654, -26722 .word -19266, 19266, 5315, 22654 .word 10426, -25172, 5315, -15137 tab_i_04: .word 16384, 21407, 16384, 8867 .word -16384, 21407, 16384, -8867 .word 16384, -8867, 16384, -21407 .word 16384, 8867, -16384, -21407 .word 22725, 19266, 19266, -4520 .word 4520, 19266, 19266, -22725 .word 12873, -22725, 4520, -12873 .word 12873, 4520, -22725, -12873 tab_i_17: .word 22725, 29692, 22725, 12299 .word -22725, 29692, 22725, -12299 .word 22725, -12299, 22725, -29692 .word 22725, 12299, -22725, -29692 .word 31521, 26722, 26722, -6270 .word 6270, 26722, 26722, -31521 .word 17855, -31521, 6270, -17855 .word 17855, 6270, -31521, -17855 tab_i_26: .word 21407, 27969, 21407, 11585 .word -21407, 27969, 21407, -11585 .word 21407, -11585, 21407, -27969 .word 21407, 11585, -21407, -27969 .word 29692, 25172, 25172, -5906 .word 5906, 25172, 25172, -29692 .word 16819, -29692, 5906, -16819 .word 16819, 5906, -29692, -16819 tab_i_35: .word 19266, 25172, 19266, 10426 .word -19266, 25172, 19266, -10426 .word 19266, -10426, 19266, -25172 .word 19266, 10426, -19266, -25172 .word 26722, 22654, 22654, -5315 .word 5315, 22654, 22654, -26722 .word 15137, -26722, 5315, -15137 .word 15137, 5315, -26722, -15137 tab_i2_0: .word 16384, 22725, 16384, 19266 .word 16384, 12873, 16384, 4520 .word 16384, -4520, 16384, -12873 .word 16384, -19266, 16384, -22725 tab_i2_1: .word 22725, 31521, 22725, 26722 .word 22725, 17855, 22725, 6270 .word 22725, -6270, 22725, -17855 .word 22725, -26722, 22725, -31521 tab_i4_0: .word 16384, 21407, 16384, 8867 .word 16384, -8867, 16384, -21407 .word 22725, 19266, 19266, -4520 .word 12873, -22725, 4520, -12873 tab_i4_1: .word 22725, 29692, 22725, 12299 .word 22725, -12299, 22725, -29692 .word 31521, 26722, 26722, -6270 .word 17855, -31521, 6270, -17855 tab_i4_2: .word 21407, 27969, 21407, 11585 .word 21407, -11585, 21407, -27969 .word 29692, 25172, 25172, -5906 .word 16819, -29692, 5906, -16819 tab_i4_3: .word 19266, 25172, 19266, 10426 .word 19266, -10426, 19266, -25172 .word 26722, 22654, 22654, -5315 .word 15137, -26722, 5315, -15137 .text .p2align 4, 0x90 .globl mfxdct_8x8_fwd_16s mfxdct_8x8_fwd_16s: mov %rdi, %r10 mov %rsi, %r11 test $(15), %r11 jz LTEST_ALIGN_SRCgas_1 mov %rsp, %rax sub $(128), %rsp and $(-16), %rsp mov %rsp, %r11 LTEST_ALIGN_SRCgas_1: test $(15), %r10 jnz LMISALIGNED_SRCgas_1 LALIGNED_SRCgas_1: movdqa (16)(%r10), %xmm0 movdqa (96)(%r10), %xmm1 movdqa %xmm0, %xmm2 movdqa (32)(%r10), %xmm3 paddsw %xmm1, %xmm0 movdqa (80)(%r10), %xmm4 psllw $(3), %xmm0 movdqa (%r10), %xmm5 paddsw %xmm3, %xmm4 paddsw (112)(%r10), %xmm5 psubsw %xmm1, %xmm2 movdqa tg_2_16(%rip), %xmm1 psllw $(3), %xmm4 movdqa %xmm0, %xmm6 psubsw %xmm4, %xmm0 movdqa (48)(%r10), %xmm7 paddsw %xmm4, %xmm6 paddsw (64)(%r10), %xmm7 pmulhw %xmm0, %xmm1 movdqa %xmm5, %xmm4 psubsw %xmm7, %xmm5 paddsw %xmm7, %xmm4 psllw $(3), %xmm5 paddsw %xmm5, %xmm1 psllw $(3), %xmm4 por one_corr(%rip), %xmm1 psllw $(4), %xmm2 pmulhw tg_2_16(%rip), %xmm5 movdqa %xmm4, %xmm7 psubsw (80)(%r10), %xmm3 psubsw %xmm6, %xmm4 pshufhw $(27), %xmm1, %xmm1 movdqa %xmm1, (32)(%r11) paddsw %xmm6, %xmm7 movdqa (48)(%r10), %xmm1 psllw $(4), %xmm3 psubsw (64)(%r10), %xmm1 movdqa %xmm2, %xmm6 pshufhw $(27), %xmm4, %xmm4 movdqa %xmm4, (64)(%r11) paddsw %xmm3, %xmm2 pmulhw ocos_4_16(%rip), %xmm2 psubsw %xmm3, %xmm6 pmulhw ocos_4_16(%rip), %xmm6 psubsw %xmm0, %xmm5 por one_corr(%rip), %xmm5 psllw $(3), %xmm1 por one_corr(%rip), %xmm2 movdqa %xmm1, %xmm4 movdqa (%r10), %xmm3 paddsw %xmm6, %xmm1 psubsw (112)(%r10), %xmm3 psubsw %xmm6, %xmm4 movdqa tg_1_16(%rip), %xmm0 psllw $(3), %xmm3 movdqa tg_3_16(%rip), %xmm6 pmulhw %xmm1, %xmm0 pshufhw $(27), %xmm7, %xmm7 movdqa %xmm7, (%r11) pmulhw %xmm4, %xmm6 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm5, (96)(%r11) movdqa %xmm3, %xmm7 movdqa tg_3_16(%rip), %xmm5 psubsw %xmm2, %xmm7 paddsw %xmm2, %xmm3 pmulhw %xmm7, %xmm5 paddsw %xmm3, %xmm0 paddsw %xmm4, %xmm6 pmulhw tg_1_16(%rip), %xmm3 por one_corr(%rip), %xmm0 paddsw %xmm7, %xmm5 pshufhw $(27), %xmm0, %xmm0 psubsw %xmm6, %xmm7 pshufhw $(27), %xmm7, %xmm7 movdqa %xmm0, (16)(%r11) paddsw %xmm4, %xmm5 movdqa %xmm7, (48)(%r11) psubsw %xmm1, %xmm3 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm5, (80)(%r11) pshufhw $(27), %xmm3, %xmm3 movdqa %xmm3, (112)(%r11) cmp %rsp, %r11 je LMISALIGNED_DSTgas_1 LALIGNED_DSTgas_1: movdqa (%r11), %xmm0 movdqa (64)(%r11), %xmm1 movdqa (%r11), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_04(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_04+32(%rip), %xmm0 movdqa tab_f_04+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_04+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_04(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_04+32(%rip), %xmm4 movdqa tab_f_04+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_04+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movdqa %xmm1, (%r11) movdqa %xmm5, (64)(%r11) movdqa (16)(%r11), %xmm0 movdqa (112)(%r11), %xmm1 movdqa (16)(%r11), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_17(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_17+32(%rip), %xmm0 movdqa tab_f_17+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_17+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_17(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_17+32(%rip), %xmm4 movdqa tab_f_17+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_17+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movdqa %xmm1, (16)(%r11) movdqa %xmm5, (112)(%r11) movdqa (32)(%r11), %xmm0 movdqa (96)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_26(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_26+32(%rip), %xmm0 movdqa tab_f_26+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_26+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_26(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_26+32(%rip), %xmm4 movdqa tab_f_26+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_26+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movdqa %xmm1, (32)(%r11) movdqa %xmm5, (96)(%r11) movdqa (48)(%r11), %xmm0 movdqa (80)(%r11), %xmm1 movdqa (48)(%r11), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_35(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_35+32(%rip), %xmm0 movdqa tab_f_35+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_35+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_35(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_35+32(%rip), %xmm4 movdqa tab_f_35+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_35+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movdqa %xmm1, (48)(%r11) movdqa %xmm5, (80)(%r11) ret LMISALIGNED_SRCgas_1: movdqu (16)(%r10), %xmm0 movdqu (96)(%r10), %xmm1 movdqa %xmm0, %xmm2 movdqu (32)(%r10), %xmm3 paddsw %xmm1, %xmm0 movdqu (80)(%r10), %xmm4 psllw $(3), %xmm0 movdqu (%r10), %xmm5 paddsw %xmm3, %xmm4 movdqu (112)(%r10), %xmm6 paddsw %xmm6, %xmm5 psubsw %xmm1, %xmm2 movdqa tg_2_16(%rip), %xmm1 psllw $(3), %xmm4 movdqa %xmm0, %xmm6 psubsw %xmm4, %xmm0 movdqu (48)(%r10), %xmm7 paddsw %xmm4, %xmm6 movdqu (64)(%r10), %xmm4 paddsw %xmm4, %xmm7 pmulhw %xmm0, %xmm1 movdqa %xmm5, %xmm4 psubsw %xmm7, %xmm5 paddsw %xmm7, %xmm4 psllw $(3), %xmm5 paddsw %xmm5, %xmm1 psllw $(3), %xmm4 por one_corr(%rip), %xmm1 psllw $(4), %xmm2 pmulhw tg_2_16(%rip), %xmm5 movdqa %xmm4, %xmm7 pshufhw $(27), %xmm1, %xmm1 movdqa %xmm1, (32)(%r11) psubsw %xmm6, %xmm4 movdqu (80)(%r10), %xmm1 psubsw %xmm1, %xmm3 paddsw %xmm6, %xmm7 movdqu (48)(%r10), %xmm1 psllw $(4), %xmm3 movdqu (64)(%r10), %xmm6 psubsw %xmm6, %xmm1 movdqa %xmm2, %xmm6 pshufhw $(27), %xmm4, %xmm4 movdqa %xmm4, (64)(%r11) paddsw %xmm3, %xmm2 pmulhw ocos_4_16(%rip), %xmm2 psubsw %xmm3, %xmm6 pmulhw ocos_4_16(%rip), %xmm6 psubsw %xmm0, %xmm5 por one_corr(%rip), %xmm5 psllw $(3), %xmm1 por one_corr(%rip), %xmm2 movdqa %xmm1, %xmm4 movdqu (%r10), %xmm3 paddsw %xmm6, %xmm1 movdqu (112)(%r10), %xmm0 psubsw %xmm0, %xmm3 psubsw %xmm6, %xmm4 movdqa tg_1_16(%rip), %xmm0 psllw $(3), %xmm3 movdqa tg_3_16(%rip), %xmm6 pmulhw %xmm1, %xmm0 pshufhw $(27), %xmm7, %xmm7 movdqa %xmm7, (%r11) pmulhw %xmm4, %xmm6 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm5, (96)(%r11) movdqa %xmm3, %xmm7 movdqa tg_3_16(%rip), %xmm5 psubsw %xmm2, %xmm7 paddsw %xmm2, %xmm3 pmulhw %xmm7, %xmm5 paddsw %xmm3, %xmm0 paddsw %xmm4, %xmm6 pmulhw tg_1_16(%rip), %xmm3 por one_corr(%rip), %xmm0 paddsw %xmm7, %xmm5 pshufhw $(27), %xmm0, %xmm0 psubsw %xmm6, %xmm7 pshufhw $(27), %xmm7, %xmm7 movdqa %xmm0, (16)(%r11) paddsw %xmm4, %xmm5 movdqa %xmm7, (48)(%r11) psubsw %xmm1, %xmm3 pshufhw $(27), %xmm5, %xmm5 movdqa %xmm5, (80)(%r11) pshufhw $(27), %xmm3, %xmm3 movdqa %xmm3, (112)(%r11) cmp %rsp, %r11 jne LALIGNED_DSTgas_1 LMISALIGNED_DSTgas_1: mov %rsi, %r11 movdqa (%rsp), %xmm0 movdqa (64)(%rsp), %xmm1 movdqa (%rsp), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_04(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_04+32(%rip), %xmm0 movdqa tab_f_04+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_04+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_04(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_04+32(%rip), %xmm4 movdqa tab_f_04+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_04+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movlps %xmm1, (%r11) movhps %xmm1, (8)(%r11) movlps %xmm5, (64)(%r11) movhps %xmm5, (72)(%r11) movdqa (16)(%rsp), %xmm0 movdqa (112)(%rsp), %xmm1 movdqa (16)(%rsp), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_17(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_17+32(%rip), %xmm0 movdqa tab_f_17+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_17+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_17(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_17+32(%rip), %xmm4 movdqa tab_f_17+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_17+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movlps %xmm1, (16)(%r11) movhps %xmm1, (24)(%r11) movlps %xmm5, (112)(%r11) movhps %xmm5, (120)(%r11) movdqa (32)(%rsp), %xmm0 movdqa (96)(%rsp), %xmm1 movdqa (32)(%rsp), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_26(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_26+32(%rip), %xmm0 movdqa tab_f_26+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_26+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_26(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_26+32(%rip), %xmm4 movdqa tab_f_26+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_26+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movlps %xmm1, (32)(%r11) movhps %xmm1, (40)(%r11) movlps %xmm5, (96)(%r11) movhps %xmm5, (104)(%r11) movdqa (48)(%rsp), %xmm0 movdqa (80)(%rsp), %xmm1 movdqa (48)(%rsp), %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 movdqa %xmm0, %xmm1 paddsw %xmm2, %xmm0 psubsw %xmm2, %xmm1 movdqa %xmm0, %xmm4 punpckldq %xmm1, %xmm0 punpckhdq %xmm1, %xmm4 pshufd $(78), %xmm0, %xmm2 pshufd $(78), %xmm4, %xmm6 movdqa tab_f_35(%rip), %xmm1 pmaddwd %xmm0, %xmm1 pmaddwd tab_f_35+32(%rip), %xmm0 movdqa tab_f_35+16(%rip), %xmm3 pmaddwd %xmm2, %xmm3 pmaddwd tab_f_35+48(%rip), %xmm2 paddd round_frw_row(%rip), %xmm1 paddd %xmm3, %xmm1 psrad $(20), %xmm1 paddd round_frw_row(%rip), %xmm0 paddd %xmm2, %xmm0 psrad $(20), %xmm0 packssdw %xmm0, %xmm1 movdqa tab_f_35(%rip), %xmm5 pmaddwd %xmm4, %xmm5 pmaddwd tab_f_35+32(%rip), %xmm4 movdqa tab_f_35+16(%rip), %xmm7 pmaddwd %xmm6, %xmm7 pmaddwd tab_f_35+48(%rip), %xmm6 paddd round_frw_row(%rip), %xmm5 paddd %xmm7, %xmm5 psrad $(20), %xmm5 paddd round_frw_row(%rip), %xmm4 paddd %xmm6, %xmm4 psrad $(20), %xmm4 packssdw %xmm4, %xmm5 movlps %xmm1, (48)(%r11) movhps %xmm1, (56)(%r11) movlps %xmm5, (80)(%r11) movhps %xmm5, (88)(%r11) mov %rax, %rsp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pilogic16um7as.s000066400000000000000000003513011443134507600273740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 sMask16: .quad 0xFFFFFFFFFFFF, 0xFFFFFFFFFFFF dMask16: .quad 0xFFFF000000000000, 0xFFFF000000000000 .text .p2align 4, 0x90 .globl mfxownpi_AndC_16u_C1R mfxownpi_AndC_16u_C1R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 mov %rdi, %rax shl $(16), %rdi and $(65535), %rax or %rdi, %rax mov %eax, %eax movd %eax, %xmm7 mov %rax, %rdi shl $(32), %rdi or %rax, %rdi pshufd $(0), %xmm7, %xmm7 movdqa %xmm7, %xmm6 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_1: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(1), %r11 jz LRunNgas_1 sub $(4), %r12 jl LL2gas_1 LL4ngas_1: mov (%r10), %rax and %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 jge LL4ngas_1 jmp LL2gas_1 LRunNgas_1: mov %r11, %rbx and $(15), %rbx jz LRungas_1 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_1 sub %rbx, %r12 LLN1gas_1: movw (%r10), %ax and %rdi, %rax movw %ax, (%r11) add $(2), %r10 add $(2), %r11 sub $(1), %rbx jnz LLN1gas_1 LRungas_1: test $(15), %r10 jnz LNNAgas_1 sub $(32), %r12 jl LL16gas_1 LL32gas_1: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 pand %xmm6, %xmm0 pand %xmm7, %xmm1 pand %xmm6, %xmm2 pand %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32gas_1 LL16gas_1: add $(16), %r12 jl LL8gas_1 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 pand %xmm6, %xmm4 pand %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8gas_1: add $(8), %r12 jl LL4gas_1 movdqa (%r10), %xmm0 pand %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 jmp LL4gas_1 LNNAgas_1: sub $(32), %r12 jl LL16ngas_1 LL32ngas_1: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pand %xmm6, %xmm0 pand %xmm7, %xmm1 pand %xmm6, %xmm2 pand %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32ngas_1 LL16ngas_1: add $(16), %r12 jl LL8ngas_1 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pand %xmm6, %xmm4 pand %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8ngas_1: add $(8), %r12 jl LL4gas_1 lddqu (%r10), %xmm0 pand %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 LL4gas_1: add $(4), %r12 jl LL2gas_1 mov (%r10), %rax and %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 LL2gas_1: add $(2), %r12 jl LL1gas_1 movl (%r10), %eax and %rdi, %rax movl %eax, (%r11) add $(4), %r10 add $(4), %r11 sub $(2), %r12 LL1gas_1: add $(1), %r12 jl LL02gas_1 movw (%r10), %ax and %rdi, %rax movw %ax, (%r11) LL02gas_1: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_1 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_AndC_16u_C3R mfxownpi_AndC_16u_C3R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 movdqa %xmm7, %xmm2 movdqa %xmm7, %xmm3 movdqa %xmm7, %xmm4 movdqa %xmm7, %xmm5 movdqa %xmm7, %xmm6 psllq $(16), %xmm2 psllq $(32), %xmm3 psllq $(48), %xmm4 psrlq $(16), %xmm5 psrlq $(32), %xmm6 por %xmm6, %xmm2 por %xmm7, %xmm4 por %xmm5, %xmm3 unpcklpd %xmm3, %xmm4 unpcklpd %xmm4, %xmm2 unpcklpd %xmm2, %xmm3 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_2: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 cmp $(32), %r12 jl LNSgas_2 test $(1), %r11 jz LRunNgas_2 LNSgas_2: sub $(4), %r12 jl LL3gas_2 LNAgas_2: movq (%r10), %xmm5 movq (8)(%r10), %xmm6 movq (16)(%r10), %xmm7 pand %xmm4, %xmm5 pand %xmm3, %xmm6 pand %xmm2, %xmm7 movq %xmm5, (%r11) movq %xmm6, (8)(%r11) movq %xmm7, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jge LNAgas_2 jmp LL3gas_2 LRunNgas_2: mov %r11, %rbx and $(15), %rbx jz LRungas_2 cmp $(14), %rbx jl Lt12gas_2 mov $(3), %rbx jmp Lt0gas_2 Lt12gas_2: cmp $(12), %rbx jl Lt10gas_2 mov $(6), %rbx jmp Lt0gas_2 Lt10gas_2: cmp $(10), %rbx jl Lt8gas_2 mov $(1), %rbx jmp Lt0gas_2 Lt8gas_2: cmp $(8), %rbx jl Lt6gas_2 mov $(4), %rbx jmp Lt0gas_2 Lt6gas_2: cmp $(6), %rbx jl Lt4gas_2 mov $(7), %rbx jmp Lt0gas_2 Lt4gas_2: cmp $(4), %rbx jl Lt2gas_2 mov $(2), %rbx jmp Lt0gas_2 Lt2gas_2: mov $(5), %rbx Lt0gas_2: sub %rbx, %r12 LL1ngas_2: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 pand %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %rbx jnz LL1ngas_2 LRungas_2: test $(15), %r10 jnz LNNAgas_2 sub $(8), %r12 jl LL4gas_2 LL8gas_2: movdqa (%r10), %xmm5 movdqa (16)(%r10), %xmm6 movdqa (32)(%r10), %xmm7 pand %xmm4, %xmm5 pand %xmm2, %xmm6 pand %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8gas_2 LL4gas_2: add $(4), %r12 jl LL3gas_2 movdqa (%r10), %xmm0 movq (16)(%r10), %xmm1 pand %xmm4, %xmm0 pand %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jmp LL3gas_2 LNNAgas_2: sub $(8), %r12 jl LL4ngas_2 LL8ngas_2: lddqu (%r10), %xmm5 lddqu (16)(%r10), %xmm6 lddqu (32)(%r10), %xmm7 pand %xmm4, %xmm5 pand %xmm2, %xmm6 pand %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8ngas_2 LL4ngas_2: add $(4), %r12 jl LL3gas_2 lddqu (%r10), %xmm0 movq (16)(%r10), %xmm1 pand %xmm4, %xmm0 pand %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 LL3gas_2: add $(4), %r12 jz LL02gas_2 LL1gas_2: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 pand %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %r12 jnz LL1gas_2 LL02gas_2: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_2 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_AndC_16u_C4R mfxownpi_AndC_16u_C4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movq (%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_3: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_3 LNAgas_3: movq (%r10), %xmm0 pand %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_3 jmp LL02gas_3 LRunNgas_3: mov %r11, %rbx and $(15), %rbx jz LRungas_3 movq (%r10), %xmm0 pand %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_3: test $(15), %r10 jnz LNNAgas_3 sub $(8), %r12 jl LL4gas_3 LL8gas_3: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 pand %xmm7, %xmm0 pand %xmm7, %xmm1 pand %xmm7, %xmm2 pand %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8gas_3 LL4gas_3: add $(4), %r12 jl LL2gas_3 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 pand %xmm7, %xmm4 pand %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2gas_3: add $(2), %r12 jl LL1gas_3 movdqa (%r10), %xmm6 pand %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_3 LNNAgas_3: sub $(8), %r12 jl LL4ngas_3 LL8ngas_3: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pand %xmm7, %xmm0 pand %xmm7, %xmm1 pand %xmm7, %xmm2 pand %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8ngas_3 LL4ngas_3: add $(4), %r12 jl LL2ngas_3 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pand %xmm7, %xmm4 pand %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2ngas_3: add $(2), %r12 jl LL1gas_3 lddqu (%r10), %xmm6 pand %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_3: add $(1), %r12 jl LL02gas_3 movq (%r10), %xmm0 pand %xmm7, %xmm0 movq %xmm0, (%r11) LL02gas_3: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_3 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_AndC_16u_AC4R mfxownpi_AndC_16u_AC4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_4: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_4 LNAgas_4: movq (%r10), %xmm0 movq (%r11), %xmm1 pand %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_4 jmp LL02gas_4 LRunNgas_4: mov %r11, %rbx and $(15), %rbx jz LRungas_4 movq (%r10), %xmm0 movq (%r11), %xmm1 pand %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_4: test $(15), %r10 jnz LNNAgas_4 sub $(4), %r12 jl LL2gas_4 LL4gas_4: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 pand %xmm7, %xmm0 pand %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4gas_4 LL2gas_4: add $(2), %r12 jl LL1gas_4 movdqa (%r10), %xmm4 movdqa (%r11), %xmm5 pand %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_4 LNNAgas_4: sub $(4), %r12 jl LL2ngas_4 LL4ngas_4: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 pand %xmm7, %xmm0 pand %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4ngas_4 LL2ngas_4: add $(2), %r12 jl LL1gas_4 lddqu (%r10), %xmm4 movdqa (%r11), %xmm5 pand %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_4: add $(1), %r12 jl LL02gas_4 movq (%r10), %xmm6 movq (%r11), %xmm1 pand %xmm7, %xmm6 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm6 por %xmm1, %xmm6 movq %xmm6, (%r11) LL02gas_4: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_4 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_And_16u_C1R mfxownpi_And_16u_C1R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_5: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(1), %r13 jz LRunNgas_5 sub $(4), %r12 jl LL2gas_5 LL4ngas_5: mov (%r11), %rax and (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 jge LL4ngas_5 jmp LL2gas_5 LRunNgas_5: mov %r13, %rbx and $(15), %rbx jz LRungas_5 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_5 sub %rbx, %r12 LLN1gas_5: movw (%r11), %ax andw (%r10), %ax movw %ax, (%r13) add $(2), %r11 add $(2), %r10 add $(2), %r13 sub $(1), %rbx jnz LLN1gas_5 LRungas_5: test $(15), %r11 jnz LNA1gas_5 test $(15), %r10 jnz LNA2gas_5 sub $(64), %r12 jl LL32gas_5 LL64gas_5: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 movdqa (64)(%r11), %xmm4 movdqa (80)(%r11), %xmm5 movdqa (96)(%r11), %xmm6 movdqa (112)(%r11), %xmm7 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm2 pand (48)(%r10), %xmm3 pand (64)(%r10), %xmm4 pand (80)(%r10), %xmm5 pand (96)(%r10), %xmm6 pand (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64gas_5 LL32gas_5: add $(32), %r12 jl LL16gas_5 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm2 pand (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16gas_5: add $(16), %r12 jl LL8gas_5 movdqa (%r11), %xmm4 movdqa (16)(%r11), %xmm5 pand (%r10), %xmm4 pand (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8gas_5: add $(8), %r12 jl LL4gas_5 movdqa (%r11), %xmm6 pand (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_5 LNA1gas_5: test $(15), %r10 jnz LNA3gas_5 sub $(64), %r12 jl LL32n1gas_5 LL64n1gas_5: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (64)(%r11), %xmm4 lddqu (80)(%r11), %xmm5 lddqu (96)(%r11), %xmm6 lddqu (112)(%r11), %xmm7 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm2 pand (48)(%r10), %xmm3 pand (64)(%r10), %xmm4 pand (80)(%r10), %xmm5 pand (96)(%r10), %xmm6 pand (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n1gas_5 LL32n1gas_5: add $(32), %r12 jl LL16n1gas_5 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm2 pand (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n1gas_5: add $(16), %r12 jl LL8n1gas_5 lddqu (%r11), %xmm4 lddqu (16)(%r11), %xmm5 pand (%r10), %xmm4 pand (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n1gas_5: add $(8), %r12 jl LL4gas_5 lddqu (%r11), %xmm6 pand (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_5 LNA2gas_5: sub $(64), %r12 jl LL32n2gas_5 LL64n2gas_5: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 lddqu (64)(%r10), %xmm4 lddqu (80)(%r10), %xmm5 lddqu (96)(%r10), %xmm6 lddqu (112)(%r10), %xmm7 pand (%r11), %xmm0 pand (16)(%r11), %xmm1 pand (32)(%r11), %xmm2 pand (48)(%r11), %xmm3 pand (64)(%r11), %xmm4 pand (80)(%r11), %xmm5 pand (96)(%r11), %xmm6 pand (112)(%r11), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n2gas_5 LL32n2gas_5: add $(32), %r12 jl LL16n2gas_5 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pand (%r11), %xmm0 pand (16)(%r11), %xmm1 pand (32)(%r11), %xmm2 pand (48)(%r11), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n2gas_5: add $(16), %r12 jl LL8n2gas_5 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pand (%r11), %xmm4 pand (16)(%r11), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n2gas_5: add $(8), %r12 jl LL4gas_5 lddqu (%r10), %xmm6 pand (%r11), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_5 LNA3gas_5: sub $(32), %r12 jl LL16n3gas_5 LL32n3gas_5: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 lddqu (32)(%r10), %xmm6 lddqu (48)(%r10), %xmm7 pand %xmm4, %xmm0 pand %xmm5, %xmm1 pand %xmm6, %xmm2 pand %xmm7, %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 jge LL32n3gas_5 LL16n3gas_5: add $(16), %r12 jl LL8n3gas_5 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 pand %xmm2, %xmm0 pand %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n3gas_5: add $(8), %r12 jl LL4gas_5 lddqu (%r11), %xmm4 lddqu (%r10), %xmm5 pand %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 LL4gas_5: add $(4), %r12 jl LL2gas_5 mov (%r11), %rax and (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 LL2gas_5: add $(2), %r12 jl LL1gas_5 movl (%r11), %eax andl (%r10), %eax movl %eax, (%r13) add $(4), %r11 add $(4), %r10 add $(4), %r13 sub $(2), %r12 LL1gas_5: add $(1), %r12 jl LL02gas_5 movw (%r11), %ax andw (%r10), %ax movw %ax, (%r13) LL02gas_5: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_5 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_And_16u_AC4R mfxownpi_And_16u_AC4R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_6: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(7), %r13 jz LRunNgas_6 LNAgas_6: movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 pand %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 jnz LNAgas_6 jmp LL02gas_6 LRunNgas_6: mov %r13, %rbx and $(15), %rbx jz LRungas_6 movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 pand %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 LRungas_6: test $(15), %r11 jnz LNA1gas_6 test $(15), %r10 jnz LNA2gas_6 sub $(8), %r12 jl LL4gas_6 LL8gas_6: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm4 movdqa (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm4 pand (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8gas_6 LL4gas_6: add $(4), %r12 jl LL2gas_6 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2gas_6: add $(2), %r12 jl LL1gas_6 movdqa (%r11), %xmm4 movdqa (%r13), %xmm5 pand (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1gas_6: add $(1), %r12 jl LL02gas_6 movq (%r11), %xmm6 movq (%r13), %xmm7 pand (%r10), %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) jmp LL02gas_6 LNA1gas_6: test $(15), %r10 jnz LNA3gas_6 sub $(8), %r12 jl LL4n1gas_6 LL8n1gas_6: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm4 lddqu (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand (32)(%r10), %xmm4 pand (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n1gas_6 LL4n1gas_6: add $(4), %r12 jl LL2n1gas_6 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pand (%r10), %xmm0 pand (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n1gas_6: add $(2), %r12 jl LL1gas_6 lddqu (%r11), %xmm4 movdqa (%r13), %xmm5 pand (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1gas_6 LNA2gas_6: sub $(8), %r12 jl LL4n2gas_6 LL8n2gas_6: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm4 lddqu (48)(%r10), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pand (%r11), %xmm0 pand (16)(%r11), %xmm1 pand (32)(%r11), %xmm4 pand (48)(%r11), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n2gas_6 LL4n2gas_6: add $(4), %r12 jl LL2n2gas_6 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pand (%r11), %xmm0 pand (16)(%r11), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n2gas_6: add $(2), %r12 jl LL1n3gas_6 lddqu (%r10), %xmm4 movdqa (%r13), %xmm5 pand (%r11), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1n3gas_6 LNA3gas_6: sub $(4), %r12 jl LL2n3gas_6 LL4n3gas_6: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 movdqa (%r13), %xmm4 movdqa (16)(%r13), %xmm5 pand %xmm2, %xmm0 pand %xmm3, %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm4, %xmm0 por %xmm5, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 jge LL4n3gas_6 LL2n3gas_6: add $(2), %r12 jl LL1n3gas_6 lddqu (%r11), %xmm7 lddqu (%r10), %xmm6 movdqa (%r13), %xmm5 pand %xmm6, %xmm7 pand sMask16(%rip), %xmm7 pand dMask16(%rip), %xmm5 por %xmm5, %xmm7 movdqa %xmm7, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1n3gas_6: add $(1), %r12 jl LL02gas_6 movq (%r10), %xmm5 movq (%r11), %xmm6 movq (%r13), %xmm7 pand %xmm5, %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) LL02gas_6: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_6 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_OrC_16u_C1R mfxownpi_OrC_16u_C1R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 mov %rdi, %rax shl $(16), %rdi and $(65535), %rax or %rdi, %rax mov %eax, %eax movd %eax, %xmm7 mov %rax, %rdi shl $(32), %rdi or %rax, %rdi pshufd $(0), %xmm7, %xmm7 movdqa %xmm7, %xmm6 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_7: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(1), %r11 jz LRunNgas_7 sub $(4), %r12 jl LL2gas_7 LL4ngas_7: mov (%r10), %rax or %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 jge LL4ngas_7 jmp LL2gas_7 LRunNgas_7: mov %r11, %rbx and $(15), %rbx jz LRungas_7 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_7 sub %rbx, %r12 LLN1gas_7: movw (%r10), %ax or %rdi, %rax movw %ax, (%r11) add $(2), %r10 add $(2), %r11 sub $(1), %rbx jnz LLN1gas_7 LRungas_7: test $(15), %r10 jnz LNNAgas_7 sub $(32), %r12 jl LL16gas_7 LL32gas_7: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 por %xmm6, %xmm0 por %xmm7, %xmm1 por %xmm6, %xmm2 por %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32gas_7 LL16gas_7: add $(16), %r12 jl LL8gas_7 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8gas_7: add $(8), %r12 jl LL4gas_7 movdqa (%r10), %xmm0 por %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 jmp LL4gas_7 LNNAgas_7: sub $(32), %r12 jl LL16ngas_7 LL32ngas_7: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 por %xmm6, %xmm0 por %xmm7, %xmm1 por %xmm6, %xmm2 por %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32ngas_7 LL16ngas_7: add $(16), %r12 jl LL8ngas_7 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8ngas_7: add $(8), %r12 jl LL4gas_7 lddqu (%r10), %xmm0 por %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 LL4gas_7: add $(4), %r12 jl LL2gas_7 mov (%r10), %rax or %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 LL2gas_7: add $(2), %r12 jl LL1gas_7 movl (%r10), %eax or %rdi, %rax movl %eax, (%r11) add $(4), %r10 add $(4), %r11 sub $(2), %r12 LL1gas_7: add $(1), %r12 jl LL02gas_7 movw (%r10), %ax or %rdi, %rax movw %ax, (%r11) LL02gas_7: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_7 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_OrC_16u_C3R mfxownpi_OrC_16u_C3R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 movdqa %xmm7, %xmm2 movdqa %xmm7, %xmm3 movdqa %xmm7, %xmm4 movdqa %xmm7, %xmm5 movdqa %xmm7, %xmm6 psllq $(16), %xmm2 psllq $(32), %xmm3 psllq $(48), %xmm4 psrlq $(16), %xmm5 psrlq $(32), %xmm6 por %xmm6, %xmm2 por %xmm7, %xmm4 por %xmm5, %xmm3 unpcklpd %xmm3, %xmm4 unpcklpd %xmm4, %xmm2 unpcklpd %xmm2, %xmm3 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_8: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 cmp $(32), %r12 jl LNSgas_8 test $(1), %r11 jz LRunNgas_8 LNSgas_8: sub $(4), %r12 jl LL3gas_8 LNAgas_8: movq (%r10), %xmm5 movq (8)(%r10), %xmm6 movq (16)(%r10), %xmm7 por %xmm4, %xmm5 por %xmm3, %xmm6 por %xmm2, %xmm7 movq %xmm5, (%r11) movq %xmm6, (8)(%r11) movq %xmm7, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jge LNAgas_8 jmp LL3gas_8 LRunNgas_8: mov %r11, %rbx and $(15), %rbx jz LRungas_8 cmp $(14), %rbx jl Lt12gas_8 mov $(3), %rbx jmp Lt0gas_8 Lt12gas_8: cmp $(12), %rbx jl Lt10gas_8 mov $(6), %rbx jmp Lt0gas_8 Lt10gas_8: cmp $(10), %rbx jl Lt8gas_8 mov $(1), %rbx jmp Lt0gas_8 Lt8gas_8: cmp $(8), %rbx jl Lt6gas_8 mov $(4), %rbx jmp Lt0gas_8 Lt6gas_8: cmp $(6), %rbx jl Lt4gas_8 mov $(7), %rbx jmp Lt0gas_8 Lt4gas_8: cmp $(4), %rbx jl Lt2gas_8 mov $(2), %rbx jmp Lt0gas_8 Lt2gas_8: mov $(5), %rbx Lt0gas_8: sub %rbx, %r12 LL1ngas_8: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 por %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %rbx jnz LL1ngas_8 LRungas_8: test $(15), %r10 jnz LNNAgas_8 sub $(8), %r12 jl LL4gas_8 LL8gas_8: movdqa (%r10), %xmm5 movdqa (16)(%r10), %xmm6 movdqa (32)(%r10), %xmm7 por %xmm4, %xmm5 por %xmm2, %xmm6 por %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8gas_8 LL4gas_8: add $(4), %r12 jl LL3gas_8 movdqa (%r10), %xmm0 movq (16)(%r10), %xmm1 por %xmm4, %xmm0 por %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jmp LL3gas_8 LNNAgas_8: sub $(8), %r12 jl LL4ngas_8 LL8ngas_8: lddqu (%r10), %xmm5 lddqu (16)(%r10), %xmm6 lddqu (32)(%r10), %xmm7 por %xmm4, %xmm5 por %xmm2, %xmm6 por %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8ngas_8 LL4ngas_8: add $(4), %r12 jl LL3gas_8 lddqu (%r10), %xmm0 movq (16)(%r10), %xmm1 por %xmm4, %xmm0 por %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 LL3gas_8: add $(4), %r12 jz LL02gas_8 LL1gas_8: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 por %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %r12 jnz LL1gas_8 LL02gas_8: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_8 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_OrC_16u_C4R mfxownpi_OrC_16u_C4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movq (%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_9: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_9 LNAgas_9: movq (%r10), %xmm0 por %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_9 jmp LL02gas_9 LRunNgas_9: mov %r11, %rbx and $(15), %rbx jz LRungas_9 movq (%r10), %xmm0 por %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_9: test $(15), %r10 jnz LNNAgas_9 sub $(8), %r12 jl LL4gas_9 LL8gas_9: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 por %xmm7, %xmm0 por %xmm7, %xmm1 por %xmm7, %xmm2 por %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8gas_9 LL4gas_9: add $(4), %r12 jl LL2gas_9 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 por %xmm7, %xmm4 por %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2gas_9: add $(2), %r12 jl LL1gas_9 movdqa (%r10), %xmm6 por %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_9 LNNAgas_9: sub $(8), %r12 jl LL4ngas_9 LL8ngas_9: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 por %xmm7, %xmm0 por %xmm7, %xmm1 por %xmm7, %xmm2 por %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8ngas_9 LL4ngas_9: add $(4), %r12 jl LL2ngas_9 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 por %xmm7, %xmm4 por %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2ngas_9: add $(2), %r12 jl LL1gas_9 lddqu (%r10), %xmm6 por %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_9: add $(1), %r12 jl LL02gas_9 movq (%r10), %xmm0 por %xmm7, %xmm0 movq %xmm0, (%r11) LL02gas_9: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_9 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_OrC_16u_AC4R mfxownpi_OrC_16u_AC4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_10: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_10 LNAgas_10: movq (%r10), %xmm0 movq (%r11), %xmm1 por %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_10 jmp LL02gas_10 LRunNgas_10: mov %r11, %rbx and $(15), %rbx jz LRungas_10 movq (%r10), %xmm0 movq (%r11), %xmm1 por %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_10: test $(15), %r10 jnz LNNAgas_10 sub $(4), %r12 jl LL2gas_10 LL4gas_10: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 por %xmm7, %xmm0 por %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4gas_10 LL2gas_10: add $(2), %r12 jl LL1gas_10 movdqa (%r10), %xmm4 movdqa (%r11), %xmm5 por %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_10 LNNAgas_10: sub $(4), %r12 jl LL2ngas_10 LL4ngas_10: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 por %xmm7, %xmm0 por %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4ngas_10 LL2ngas_10: add $(2), %r12 jl LL1gas_10 lddqu (%r10), %xmm4 movdqa (%r11), %xmm5 por %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_10: add $(1), %r12 jl LL02gas_10 movq (%r10), %xmm6 movq (%r11), %xmm1 por %xmm7, %xmm6 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm6 por %xmm1, %xmm6 movq %xmm6, (%r11) LL02gas_10: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_10 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_Or_16u_C1R mfxownpi_Or_16u_C1R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_11: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(1), %r13 jz LRunNgas_11 sub $(4), %r12 jl LL2gas_11 LL4ngas_11: mov (%r11), %rax or (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 jge LL4ngas_11 jmp LL2gas_11 LRunNgas_11: mov %r13, %rbx and $(15), %rbx jz LRungas_11 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_11 sub %rbx, %r12 LLN1gas_11: movw (%r11), %ax orw (%r10), %ax movw %ax, (%r13) add $(2), %r11 add $(2), %r10 add $(2), %r13 sub $(1), %rbx jnz LLN1gas_11 LRungas_11: test $(15), %r11 jnz LNA1gas_11 test $(15), %r10 jnz LNA2gas_11 sub $(64), %r12 jl LL32gas_11 LL64gas_11: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 movdqa (64)(%r11), %xmm4 movdqa (80)(%r11), %xmm5 movdqa (96)(%r11), %xmm6 movdqa (112)(%r11), %xmm7 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm2 por (48)(%r10), %xmm3 por (64)(%r10), %xmm4 por (80)(%r10), %xmm5 por (96)(%r10), %xmm6 por (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64gas_11 LL32gas_11: add $(32), %r12 jl LL16gas_11 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm2 por (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16gas_11: add $(16), %r12 jl LL8gas_11 movdqa (%r11), %xmm4 movdqa (16)(%r11), %xmm5 por (%r10), %xmm4 por (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8gas_11: add $(8), %r12 jl LL4gas_11 movdqa (%r11), %xmm6 por (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_11 LNA1gas_11: test $(15), %r10 jnz LNA3gas_11 sub $(64), %r12 jl LL32n1gas_11 LL64n1gas_11: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (64)(%r11), %xmm4 lddqu (80)(%r11), %xmm5 lddqu (96)(%r11), %xmm6 lddqu (112)(%r11), %xmm7 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm2 por (48)(%r10), %xmm3 por (64)(%r10), %xmm4 por (80)(%r10), %xmm5 por (96)(%r10), %xmm6 por (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n1gas_11 LL32n1gas_11: add $(32), %r12 jl LL16n1gas_11 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm2 por (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n1gas_11: add $(16), %r12 jl LL8n1gas_11 lddqu (%r11), %xmm4 lddqu (16)(%r11), %xmm5 por (%r10), %xmm4 por (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n1gas_11: add $(8), %r12 jl LL4gas_11 lddqu (%r11), %xmm6 por (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_11 LNA2gas_11: sub $(64), %r12 jl LL32n2gas_11 LL64n2gas_11: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 lddqu (64)(%r10), %xmm4 lddqu (80)(%r10), %xmm5 lddqu (96)(%r10), %xmm6 lddqu (112)(%r10), %xmm7 por (%r11), %xmm0 por (16)(%r11), %xmm1 por (32)(%r11), %xmm2 por (48)(%r11), %xmm3 por (64)(%r11), %xmm4 por (80)(%r11), %xmm5 por (96)(%r11), %xmm6 por (112)(%r11), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n2gas_11 LL32n2gas_11: add $(32), %r12 jl LL16n2gas_11 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 por (%r11), %xmm0 por (16)(%r11), %xmm1 por (32)(%r11), %xmm2 por (48)(%r11), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n2gas_11: add $(16), %r12 jl LL8n2gas_11 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 por (%r11), %xmm4 por (16)(%r11), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n2gas_11: add $(8), %r12 jl LL4gas_11 lddqu (%r10), %xmm6 por (%r11), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_11 LNA3gas_11: sub $(32), %r12 jl LL16n3gas_11 LL32n3gas_11: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 lddqu (32)(%r10), %xmm6 lddqu (48)(%r10), %xmm7 por %xmm4, %xmm0 por %xmm5, %xmm1 por %xmm6, %xmm2 por %xmm7, %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 jge LL32n3gas_11 LL16n3gas_11: add $(16), %r12 jl LL8n3gas_11 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n3gas_11: add $(8), %r12 jl LL4gas_11 lddqu (%r11), %xmm4 lddqu (%r10), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 LL4gas_11: add $(4), %r12 jl LL2gas_11 mov (%r11), %rax or (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 LL2gas_11: add $(2), %r12 jl LL1gas_11 movl (%r11), %eax orl (%r10), %eax movl %eax, (%r13) add $(4), %r11 add $(4), %r10 add $(4), %r13 sub $(2), %r12 LL1gas_11: add $(1), %r12 jl LL02gas_11 movw (%r11), %ax orw (%r10), %ax movw %ax, (%r13) LL02gas_11: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_11 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_Or_16u_AC4R mfxownpi_Or_16u_AC4R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_12: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(7), %r13 jz LRunNgas_12 LNAgas_12: movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 por %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 jnz LNAgas_12 jmp LL02gas_12 LRunNgas_12: mov %r13, %rbx and $(15), %rbx jz LRungas_12 movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 por %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 LRungas_12: test $(15), %r11 jnz LNA1gas_12 test $(15), %r10 jnz LNA2gas_12 sub $(8), %r12 jl LL4gas_12 LL8gas_12: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm4 movdqa (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm4 por (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8gas_12 LL4gas_12: add $(4), %r12 jl LL2gas_12 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 por (%r10), %xmm0 por (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2gas_12: add $(2), %r12 jl LL1gas_12 movdqa (%r11), %xmm4 movdqa (%r13), %xmm5 por (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1gas_12: add $(1), %r12 jl LL02gas_12 movq (%r11), %xmm6 movq (%r13), %xmm7 por (%r10), %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) jmp LL02gas_12 LNA1gas_12: test $(15), %r10 jnz LNA3gas_12 sub $(8), %r12 jl LL4n1gas_12 LL8n1gas_12: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm4 lddqu (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 por (%r10), %xmm0 por (16)(%r10), %xmm1 por (32)(%r10), %xmm4 por (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n1gas_12 LL4n1gas_12: add $(4), %r12 jl LL2n1gas_12 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 por (%r10), %xmm0 por (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n1gas_12: add $(2), %r12 jl LL1gas_12 lddqu (%r11), %xmm4 movdqa (%r13), %xmm5 por (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1gas_12 LNA2gas_12: sub $(8), %r12 jl LL4n2gas_12 LL8n2gas_12: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm4 lddqu (48)(%r10), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 por (%r11), %xmm0 por (16)(%r11), %xmm1 por (32)(%r11), %xmm4 por (48)(%r11), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n2gas_12 LL4n2gas_12: add $(4), %r12 jl LL2n2gas_12 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 por (%r11), %xmm0 por (16)(%r11), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n2gas_12: add $(2), %r12 jl LL1n3gas_12 lddqu (%r10), %xmm4 movdqa (%r13), %xmm5 por (%r11), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1n3gas_12 LNA3gas_12: sub $(4), %r12 jl LL2n3gas_12 LL4n3gas_12: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 movdqa (%r13), %xmm4 movdqa (16)(%r13), %xmm5 por %xmm2, %xmm0 por %xmm3, %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm4, %xmm0 por %xmm5, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 jge LL4n3gas_12 LL2n3gas_12: add $(2), %r12 jl LL1n3gas_12 lddqu (%r11), %xmm7 lddqu (%r10), %xmm6 movdqa (%r13), %xmm5 por %xmm6, %xmm7 pand sMask16(%rip), %xmm7 pand dMask16(%rip), %xmm5 por %xmm5, %xmm7 movdqa %xmm7, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1n3gas_12: add $(1), %r12 jl LL02gas_12 movq (%r10), %xmm5 movq (%r11), %xmm6 movq (%r13), %xmm7 por %xmm5, %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) LL02gas_12: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_12 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_XorC_16u_C1R mfxownpi_XorC_16u_C1R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 mov %rdi, %rax shl $(16), %rdi and $(65535), %rax or %rdi, %rax mov %eax, %eax movd %eax, %xmm7 mov %rax, %rdi shl $(32), %rdi or %rax, %rdi pshufd $(0), %xmm7, %xmm7 movdqa %xmm7, %xmm6 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_13: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(1), %r11 jz LRunNgas_13 sub $(4), %r12 jl LL2gas_13 LL4ngas_13: mov (%r10), %rax xor %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 jge LL4ngas_13 jmp LL2gas_13 LRunNgas_13: mov %r11, %rbx and $(15), %rbx jz LRungas_13 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_13 sub %rbx, %r12 LLN1gas_13: movw (%r10), %ax xor %rdi, %rax movw %ax, (%r11) add $(2), %r10 add $(2), %r11 sub $(1), %rbx jnz LLN1gas_13 LRungas_13: test $(15), %r10 jnz LNNAgas_13 sub $(32), %r12 jl LL16gas_13 LL32gas_13: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 pxor %xmm6, %xmm0 pxor %xmm7, %xmm1 pxor %xmm6, %xmm2 pxor %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32gas_13 LL16gas_13: add $(16), %r12 jl LL8gas_13 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 pxor %xmm6, %xmm4 pxor %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8gas_13: add $(8), %r12 jl LL4gas_13 movdqa (%r10), %xmm0 pxor %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 jmp LL4gas_13 LNNAgas_13: sub $(32), %r12 jl LL16ngas_13 LL32ngas_13: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pxor %xmm6, %xmm0 pxor %xmm7, %xmm1 pxor %xmm6, %xmm2 pxor %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(32), %r12 jge LL32ngas_13 LL16ngas_13: add $(16), %r12 jl LL8ngas_13 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pxor %xmm6, %xmm4 pxor %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(16), %r12 LL8ngas_13: add $(8), %r12 jl LL4gas_13 lddqu (%r10), %xmm0 pxor %xmm6, %xmm0 movdqa %xmm0, (%r11) add $(16), %r10 add $(16), %r11 sub $(8), %r12 LL4gas_13: add $(4), %r12 jl LL2gas_13 mov (%r10), %rax xor %rdi, %rax mov %rax, (%r11) add $(8), %r10 add $(8), %r11 sub $(4), %r12 LL2gas_13: add $(2), %r12 jl LL1gas_13 movl (%r10), %eax xor %rdi, %rax movl %eax, (%r11) add $(4), %r10 add $(4), %r11 sub $(2), %r12 LL1gas_13: add $(1), %r12 jl LL02gas_13 movw (%r10), %ax xor %rdi, %rax movw %ax, (%r11) LL02gas_13: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_XorC_16u_C3R mfxownpi_XorC_16u_C3R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 movdqa %xmm7, %xmm2 movdqa %xmm7, %xmm3 movdqa %xmm7, %xmm4 movdqa %xmm7, %xmm5 movdqa %xmm7, %xmm6 psllq $(16), %xmm2 psllq $(32), %xmm3 psllq $(48), %xmm4 psrlq $(16), %xmm5 psrlq $(32), %xmm6 por %xmm6, %xmm2 por %xmm7, %xmm4 por %xmm5, %xmm3 unpcklpd %xmm3, %xmm4 unpcklpd %xmm4, %xmm2 unpcklpd %xmm2, %xmm3 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_14: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 cmp $(32), %r12 jl LNSgas_14 test $(1), %r11 jz LRunNgas_14 LNSgas_14: sub $(4), %r12 jl LL3gas_14 LNAgas_14: movq (%r10), %xmm5 movq (8)(%r10), %xmm6 movq (16)(%r10), %xmm7 pxor %xmm4, %xmm5 pxor %xmm3, %xmm6 pxor %xmm2, %xmm7 movq %xmm5, (%r11) movq %xmm6, (8)(%r11) movq %xmm7, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jge LNAgas_14 jmp LL3gas_14 LRunNgas_14: mov %r11, %rbx and $(15), %rbx jz LRungas_14 cmp $(14), %rbx jl Lt12gas_14 mov $(3), %rbx jmp Lt0gas_14 Lt12gas_14: cmp $(12), %rbx jl Lt10gas_14 mov $(6), %rbx jmp Lt0gas_14 Lt10gas_14: cmp $(10), %rbx jl Lt8gas_14 mov $(1), %rbx jmp Lt0gas_14 Lt8gas_14: cmp $(8), %rbx jl Lt6gas_14 mov $(4), %rbx jmp Lt0gas_14 Lt6gas_14: cmp $(6), %rbx jl Lt4gas_14 mov $(7), %rbx jmp Lt0gas_14 Lt4gas_14: cmp $(4), %rbx jl Lt2gas_14 mov $(2), %rbx jmp Lt0gas_14 Lt2gas_14: mov $(5), %rbx Lt0gas_14: sub %rbx, %r12 LL1ngas_14: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 pxor %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %rbx jnz LL1ngas_14 LRungas_14: test $(15), %r10 jnz LNNAgas_14 sub $(8), %r12 jl LL4gas_14 LL8gas_14: movdqa (%r10), %xmm5 movdqa (16)(%r10), %xmm6 movdqa (32)(%r10), %xmm7 pxor %xmm4, %xmm5 pxor %xmm2, %xmm6 pxor %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8gas_14 LL4gas_14: add $(4), %r12 jl LL3gas_14 movdqa (%r10), %xmm0 movq (16)(%r10), %xmm1 pxor %xmm4, %xmm0 pxor %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 jmp LL3gas_14 LNNAgas_14: sub $(8), %r12 jl LL4ngas_14 LL8ngas_14: lddqu (%r10), %xmm5 lddqu (16)(%r10), %xmm6 lddqu (32)(%r10), %xmm7 pxor %xmm4, %xmm5 pxor %xmm2, %xmm6 pxor %xmm3, %xmm7 movdqa %xmm5, (%r11) movdqa %xmm6, (16)(%r11) movdqa %xmm7, (32)(%r11) add $(48), %r10 add $(48), %r11 sub $(8), %r12 jge LL8ngas_14 LL4ngas_14: add $(4), %r12 jl LL3gas_14 lddqu (%r10), %xmm0 movq (16)(%r10), %xmm1 pxor %xmm4, %xmm0 pxor %xmm2, %xmm1 movdqa %xmm0, (%r11) movq %xmm1, (16)(%r11) add $(24), %r10 add $(24), %r11 sub $(4), %r12 LL3gas_14: add $(4), %r12 jz LL02gas_14 LL1gas_14: movd (%r10), %xmm0 pinsrw $(2), (4)(%r10), %xmm0 pxor %xmm4, %xmm0 movd %xmm0, (%r11) psrlq $(32), %xmm0 movd %xmm0, %eax movw %ax, (4)(%r11) add $(6), %r10 add $(6), %r11 sub $(1), %r12 jnz LL1gas_14 LL02gas_14: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_14 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_XorC_16u_C4R mfxownpi_XorC_16u_C4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movq (%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_15: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_15 LNAgas_15: movq (%r10), %xmm0 pxor %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_15 jmp LL02gas_15 LRunNgas_15: mov %r11, %rbx and $(15), %rbx jz LRungas_15 movq (%r10), %xmm0 pxor %xmm7, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_15: test $(15), %r10 jnz LNNAgas_15 sub $(8), %r12 jl LL4gas_15 LL8gas_15: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (32)(%r10), %xmm2 movdqa (48)(%r10), %xmm3 pxor %xmm7, %xmm0 pxor %xmm7, %xmm1 pxor %xmm7, %xmm2 pxor %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8gas_15 LL4gas_15: add $(4), %r12 jl LL2gas_15 movdqa (%r10), %xmm4 movdqa (16)(%r10), %xmm5 pxor %xmm7, %xmm4 pxor %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2gas_15: add $(2), %r12 jl LL1gas_15 movdqa (%r10), %xmm6 pxor %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_15 LNNAgas_15: sub $(8), %r12 jl LL4ngas_15 LL8ngas_15: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pxor %xmm7, %xmm0 pxor %xmm7, %xmm1 pxor %xmm7, %xmm2 pxor %xmm7, %xmm3 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) movdqa %xmm2, (32)(%r11) movdqa %xmm3, (48)(%r11) add $(64), %r10 add $(64), %r11 sub $(8), %r12 jge LL8ngas_15 LL4ngas_15: add $(4), %r12 jl LL2ngas_15 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pxor %xmm7, %xmm4 pxor %xmm7, %xmm5 movdqa %xmm4, (%r11) movdqa %xmm5, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 LL2ngas_15: add $(2), %r12 jl LL1gas_15 lddqu (%r10), %xmm6 pxor %xmm7, %xmm6 movdqa %xmm6, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_15: add $(1), %r12 jl LL02gas_15 movq (%r10), %xmm0 pxor %xmm7, %xmm0 movq %xmm0, (%r11) LL02gas_15: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_15 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_XorC_16u_AC4R mfxownpi_XorC_16u_AC4R: push %rbp push %rbx push %r12 movslq %edx, %rdx movslq %r8d, %r8 movd (%rdi), %xmm7 pinsrw $(2), (4)(%rdi), %xmm7 pshufd $(68), %xmm7, %xmm7 mov %r9d, %r9d movl (32)(%rsp), %ebp LL01gas_16: mov %rsi, %r10 mov %rcx, %r11 mov %r9, %r12 test $(7), %r11 jz LRunNgas_16 LNAgas_16: movq (%r10), %xmm0 movq (%r11), %xmm1 pxor %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 jnz LNAgas_16 jmp LL02gas_16 LRunNgas_16: mov %r11, %rbx and $(15), %rbx jz LRungas_16 movq (%r10), %xmm0 movq (%r11), %xmm1 pxor %xmm7, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r11) add $(8), %r10 add $(8), %r11 sub $(1), %r12 LRungas_16: test $(15), %r10 jnz LNNAgas_16 sub $(4), %r12 jl LL2gas_16 LL4gas_16: movdqa (%r10), %xmm0 movdqa (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 pxor %xmm7, %xmm0 pxor %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4gas_16 LL2gas_16: add $(2), %r12 jl LL1gas_16 movdqa (%r10), %xmm4 movdqa (%r11), %xmm5 pxor %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 jmp LL1gas_16 LNNAgas_16: sub $(4), %r12 jl LL2ngas_16 LL4ngas_16: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r11), %xmm2 movdqa (16)(%r11), %xmm3 pxor %xmm7, %xmm0 pxor %xmm7, %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r11) movdqa %xmm1, (16)(%r11) add $(32), %r10 add $(32), %r11 sub $(4), %r12 jge LL4ngas_16 LL2ngas_16: add $(2), %r12 jl LL1gas_16 lddqu (%r10), %xmm4 movdqa (%r11), %xmm5 pxor %xmm7, %xmm4 pand dMask16(%rip), %xmm5 pand sMask16(%rip), %xmm4 por %xmm5, %xmm4 movdqa %xmm4, (%r11) add $(16), %r10 add $(16), %r11 sub $(2), %r12 LL1gas_16: add $(1), %r12 jl LL02gas_16 movq (%r10), %xmm6 movq (%r11), %xmm1 pxor %xmm7, %xmm6 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm6 por %xmm1, %xmm6 movq %xmm6, (%r11) LL02gas_16: add %rdx, %rsi add %r8, %rcx sub $(1), %ebp jnz LL01gas_16 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_Xor_16u_C1R mfxownpi_Xor_16u_C1R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_17: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(1), %r13 jz LRunNgas_17 sub $(4), %r12 jl LL2gas_17 LL4ngas_17: mov (%r11), %rax xor (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 jge LL4ngas_17 jmp LL2gas_17 LRunNgas_17: mov %r13, %rbx and $(15), %rbx jz LRungas_17 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %r12 jl LRungas_17 sub %rbx, %r12 LLN1gas_17: movw (%r11), %ax xorw (%r10), %ax movw %ax, (%r13) add $(2), %r11 add $(2), %r10 add $(2), %r13 sub $(1), %rbx jnz LLN1gas_17 LRungas_17: test $(15), %r11 jnz LNA1gas_17 test $(15), %r10 jnz LNA2gas_17 sub $(64), %r12 jl LL32gas_17 LL64gas_17: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 movdqa (64)(%r11), %xmm4 movdqa (80)(%r11), %xmm5 movdqa (96)(%r11), %xmm6 movdqa (112)(%r11), %xmm7 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm2 pxor (48)(%r10), %xmm3 pxor (64)(%r10), %xmm4 pxor (80)(%r10), %xmm5 pxor (96)(%r10), %xmm6 pxor (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64gas_17 LL32gas_17: add $(32), %r12 jl LL16gas_17 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm2 movdqa (48)(%r11), %xmm3 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm2 pxor (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16gas_17: add $(16), %r12 jl LL8gas_17 movdqa (%r11), %xmm4 movdqa (16)(%r11), %xmm5 pxor (%r10), %xmm4 pxor (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8gas_17: add $(8), %r12 jl LL4gas_17 movdqa (%r11), %xmm6 pxor (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_17 LNA1gas_17: test $(15), %r10 jnz LNA3gas_17 sub $(64), %r12 jl LL32n1gas_17 LL64n1gas_17: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (64)(%r11), %xmm4 lddqu (80)(%r11), %xmm5 lddqu (96)(%r11), %xmm6 lddqu (112)(%r11), %xmm7 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm2 pxor (48)(%r10), %xmm3 pxor (64)(%r10), %xmm4 pxor (80)(%r10), %xmm5 pxor (96)(%r10), %xmm6 pxor (112)(%r10), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n1gas_17 LL32n1gas_17: add $(32), %r12 jl LL16n1gas_17 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm2 pxor (48)(%r10), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n1gas_17: add $(16), %r12 jl LL8n1gas_17 lddqu (%r11), %xmm4 lddqu (16)(%r11), %xmm5 pxor (%r10), %xmm4 pxor (16)(%r10), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n1gas_17: add $(8), %r12 jl LL4gas_17 lddqu (%r11), %xmm6 pxor (%r10), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_17 LNA2gas_17: sub $(64), %r12 jl LL32n2gas_17 LL64n2gas_17: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 lddqu (64)(%r10), %xmm4 lddqu (80)(%r10), %xmm5 lddqu (96)(%r10), %xmm6 lddqu (112)(%r10), %xmm7 pxor (%r11), %xmm0 pxor (16)(%r11), %xmm1 pxor (32)(%r11), %xmm2 pxor (48)(%r11), %xmm3 pxor (64)(%r11), %xmm4 pxor (80)(%r11), %xmm5 pxor (96)(%r11), %xmm6 pxor (112)(%r11), %xmm7 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) movdqa %xmm4, (64)(%r13) movdqa %xmm5, (80)(%r13) movdqa %xmm6, (96)(%r13) movdqa %xmm7, (112)(%r13) add $(128), %r11 add $(128), %r10 add $(128), %r13 sub $(64), %r12 jge LL64n2gas_17 LL32n2gas_17: add $(32), %r12 jl LL16n2gas_17 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm2 lddqu (48)(%r10), %xmm3 pxor (%r11), %xmm0 pxor (16)(%r11), %xmm1 pxor (32)(%r11), %xmm2 pxor (48)(%r11), %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 LL16n2gas_17: add $(16), %r12 jl LL8n2gas_17 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 pxor (%r11), %xmm4 pxor (16)(%r11), %xmm5 movdqa %xmm4, (%r13) movdqa %xmm5, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n2gas_17: add $(8), %r12 jl LL4gas_17 lddqu (%r10), %xmm6 pxor (%r11), %xmm6 movdqa %xmm6, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 jmp LL4gas_17 LNA3gas_17: sub $(32), %r12 jl LL16n3gas_17 LL32n3gas_17: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm2 lddqu (48)(%r11), %xmm3 lddqu (%r10), %xmm4 lddqu (16)(%r10), %xmm5 lddqu (32)(%r10), %xmm6 lddqu (48)(%r10), %xmm7 pxor %xmm4, %xmm0 pxor %xmm5, %xmm1 pxor %xmm6, %xmm2 pxor %xmm7, %xmm3 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm2, (32)(%r13) movdqa %xmm3, (48)(%r13) add $(64), %r11 add $(64), %r10 add $(64), %r13 sub $(32), %r12 jge LL32n3gas_17 LL16n3gas_17: add $(16), %r12 jl LL8n3gas_17 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 pxor %xmm2, %xmm0 pxor %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r11 add $(32), %r10 add $(32), %r13 sub $(16), %r12 LL8n3gas_17: add $(8), %r12 jl LL4gas_17 lddqu (%r11), %xmm4 lddqu (%r10), %xmm5 pxor %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r11 add $(16), %r10 add $(16), %r13 sub $(8), %r12 LL4gas_17: add $(4), %r12 jl LL2gas_17 mov (%r11), %rax xor (%r10), %rax mov %rax, (%r13) add $(8), %r11 add $(8), %r10 add $(8), %r13 sub $(4), %r12 LL2gas_17: add $(2), %r12 jl LL1gas_17 movl (%r11), %eax xorl (%r10), %eax movl %eax, (%r13) add $(4), %r11 add $(4), %r10 add $(4), %r13 sub $(2), %r12 LL1gas_17: add $(1), %r12 jl LL02gas_17 movw (%r11), %ax xorw (%r10), %ax movw %ax, (%r13) LL02gas_17: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_17 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpi_Xor_16u_AC4R mfxownpi_Xor_16u_AC4R: push %rbp push %rbx push %r12 push %r13 movslq %esi, %rsi movslq %ecx, %rcx movslq %r9d, %r9 movl (48)(%rsp), %ebp LL01gas_18: mov %rdi, %r10 mov %rdx, %r11 mov %r8, %r13 movl (40)(%rsp), %r12d test $(7), %r13 jz LRunNgas_18 LNAgas_18: movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 pxor %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 jnz LNAgas_18 jmp LL02gas_18 LRunNgas_18: mov %r13, %rbx and $(15), %rbx jz LRungas_18 movq (%r11), %xmm0 movq (%r10), %xmm2 movq (%r13), %xmm1 pxor %xmm2, %xmm0 pand dMask16(%rip), %xmm1 pand sMask16(%rip), %xmm0 por %xmm1, %xmm0 movq %xmm0, (%r13) add $(8), %r10 add $(8), %r11 add $(8), %r13 sub $(1), %r12 LRungas_18: test $(15), %r11 jnz LNA1gas_18 test $(15), %r10 jnz LNA2gas_18 sub $(8), %r12 jl LL4gas_18 LL8gas_18: movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (32)(%r11), %xmm4 movdqa (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm4 pxor (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8gas_18 LL4gas_18: add $(4), %r12 jl LL2gas_18 movdqa (%r11), %xmm0 movdqa (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2gas_18: add $(2), %r12 jl LL1gas_18 movdqa (%r11), %xmm4 movdqa (%r13), %xmm5 pxor (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1gas_18: add $(1), %r12 jl LL02gas_18 movq (%r11), %xmm6 movq (%r13), %xmm7 pxor (%r10), %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) jmp LL02gas_18 LNA1gas_18: test $(15), %r10 jnz LNA3gas_18 sub $(8), %r12 jl LL4n1gas_18 LL8n1gas_18: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (32)(%r11), %xmm4 lddqu (48)(%r11), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pxor (32)(%r10), %xmm4 pxor (48)(%r10), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n1gas_18 LL4n1gas_18: add $(4), %r12 jl LL2n1gas_18 lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pxor (%r10), %xmm0 pxor (16)(%r10), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n1gas_18: add $(2), %r12 jl LL1gas_18 lddqu (%r11), %xmm4 movdqa (%r13), %xmm5 pxor (%r10), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1gas_18 LNA2gas_18: sub $(8), %r12 jl LL4n2gas_18 LL8n2gas_18: lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 lddqu (32)(%r10), %xmm4 lddqu (48)(%r10), %xmm5 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 movdqa (32)(%r13), %xmm6 movdqa (48)(%r13), %xmm7 pxor (%r11), %xmm0 pxor (16)(%r11), %xmm1 pxor (32)(%r11), %xmm4 pxor (48)(%r11), %xmm5 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand sMask16(%rip), %xmm4 pand sMask16(%rip), %xmm5 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 pand dMask16(%rip), %xmm6 pand dMask16(%rip), %xmm7 por %xmm2, %xmm0 por %xmm3, %xmm1 por %xmm6, %xmm4 por %xmm7, %xmm5 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) movdqa %xmm4, (32)(%r13) movdqa %xmm5, (48)(%r13) add $(64), %r10 add $(64), %r11 add $(64), %r13 sub $(8), %r12 jge LL8n2gas_18 LL4n2gas_18: add $(4), %r12 jl LL2n2gas_18 lddqu (%r10), %xmm0 lddqu (16)(%r10), %xmm1 movdqa (%r13), %xmm2 movdqa (16)(%r13), %xmm3 pxor (%r11), %xmm0 pxor (16)(%r11), %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm2 pand dMask16(%rip), %xmm3 por %xmm2, %xmm0 por %xmm3, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 LL2n2gas_18: add $(2), %r12 jl LL1n3gas_18 lddqu (%r10), %xmm4 movdqa (%r13), %xmm5 pxor (%r11), %xmm4 pand sMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm5, %xmm4 movdqa %xmm4, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 jmp LL1n3gas_18 LNA3gas_18: sub $(4), %r12 jl LL2n3gas_18 LL4n3gas_18: lddqu (%r11), %xmm0 lddqu (16)(%r11), %xmm1 lddqu (%r10), %xmm2 lddqu (16)(%r10), %xmm3 movdqa (%r13), %xmm4 movdqa (16)(%r13), %xmm5 pxor %xmm2, %xmm0 pxor %xmm3, %xmm1 pand sMask16(%rip), %xmm0 pand sMask16(%rip), %xmm1 pand dMask16(%rip), %xmm4 pand dMask16(%rip), %xmm5 por %xmm4, %xmm0 por %xmm5, %xmm1 movdqa %xmm0, (%r13) movdqa %xmm1, (16)(%r13) add $(32), %r10 add $(32), %r11 add $(32), %r13 sub $(4), %r12 jge LL4n3gas_18 LL2n3gas_18: add $(2), %r12 jl LL1n3gas_18 lddqu (%r11), %xmm7 lddqu (%r10), %xmm6 movdqa (%r13), %xmm5 pxor %xmm6, %xmm7 pand sMask16(%rip), %xmm7 pand dMask16(%rip), %xmm5 por %xmm5, %xmm7 movdqa %xmm7, (%r13) add $(16), %r10 add $(16), %r11 add $(16), %r13 sub $(2), %r12 LL1n3gas_18: add $(1), %r12 jl LL02gas_18 movq (%r10), %xmm5 movq (%r11), %xmm6 movq (%r13), %xmm7 pxor %xmm5, %xmm6 pand dMask16(%rip), %xmm7 pand sMask16(%rip), %xmm6 por %xmm7, %xmm6 movq %xmm6, (%r13) LL02gas_18: add %rsi, %rdi add %rcx, %rdx add %r9, %r8 sub $(1), %ebp jnz LL01gas_18 pop %r13 pop %r12 pop %rbx pop %rbp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjarithm7as.s000066400000000000000000000060421443134507600270520ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 CONST_128: .quad 0x80008000800080, 0x80008000800080 CONST_0: .quad 0, 0 .text .p2align 4, 0x90 .globl mfxownpj_Sub128_8x8_8u16s mfxownpj_Sub128_8x8_8u16s: push %rbx mov %esi, %esi mov %rsi, %rbx mov %rsi, %rax sal $(1), %rbx add %rbx, %rax pxor %xmm4, %xmm4 mov $(2), %rcx test $(15), %rdx jnz LL1ngas_2 LL1gas_2: movq (%rdi), %xmm0 movq (%rdi,%rsi), %xmm1 movq (%rdi,%rbx), %xmm2 movq (%rdi,%rax), %xmm3 punpcklbw %xmm4, %xmm0 punpcklbw %xmm4, %xmm1 punpcklbw %xmm4, %xmm2 punpcklbw %xmm4, %xmm3 psubw CONST_128(%rip), %xmm0 psubw CONST_128(%rip), %xmm1 psubw CONST_128(%rip), %xmm2 psubw CONST_128(%rip), %xmm3 movdqa %xmm0, (%rdx) movdqa %xmm1, (16)(%rdx) movdqa %xmm2, (32)(%rdx) movdqa %xmm3, (48)(%rdx) add %rbx, %rdi add %rbx, %rdi add $(64), %rdx sub $(1), %rcx jnz LL1gas_2 jmp Lexitgas_2 LL1ngas_2: movq (%rdi), %xmm0 movq (%rdi,%rsi), %xmm1 movq (%rdi,%rbx), %xmm2 movq (%rdi,%rax), %xmm3 punpcklbw %xmm4, %xmm0 punpcklbw %xmm4, %xmm1 punpcklbw %xmm4, %xmm2 punpcklbw %xmm4, %xmm3 psubw CONST_128(%rip), %xmm0 psubw CONST_128(%rip), %xmm1 psubw CONST_128(%rip), %xmm2 psubw CONST_128(%rip), %xmm3 movdqu %xmm0, (%rdx) movdqu %xmm1, (16)(%rdx) movdqu %xmm2, (32)(%rdx) movdqu %xmm3, (48)(%rdx) add %rbx, %rdi add %rbx, %rdi add $(64), %rdx sub $(1), %rcx jnz LL1ngas_2 Lexitgas_2: pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdechuffpm7as.s000066400000000000000000001036501443134507600275320ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownpj_DecodeHuffman8x8_ACFirst_JPEG_1u16s_C1 mfxownpj_DecodeHuffman8x8_ACFirst_JPEG_1u16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(72), %rsp mov %rdi, (%rsp) mov %esi, %esi mov %rsi, (8)(%rsp) mov %rdx, (16)(%rsp) mov %rcx, (24)(%rsp) mov %r8, (32)(%rsp) mov %r9d, %r9d mov %r9, (40)(%rsp) mov (128)(%rsp), %eax mov %rax, (128)(%rsp) mov (136)(%rsp), %eax mov %rax, (136)(%rsp) mov $(0), %rax mov %rax, (56)(%rsp) movq (152)(%rsp), %rcx lea (12)(%rcx), %rbx mov (%rbx), %eax cmp $(0), %eax jg LDecHuffExitEndOfBlockRun00gas_1 lea (8)(%rcx), %rax mov (%rax), %ebp lea (%rcx), %rax movq (%rax), %mm0 mov $(64), %eax sub %ebp, %eax movd %eax, %mm1 psllq %mm1, %mm0 mov (24)(%rsp), %rdi mov (16)(%rsp), %rax mov (%rax), %eax movd %eax, %mm7 mov (128)(%rsp), %rax sub $(63), %rax lea ownTables(%rip), %rsi sub %rax, %rsi lea ownTables+64(%rip), %rax mov %rax, %r8 movq (144)(%rsp), %rax lea (512)(%rax), %rax mov %rax, %r9 mov (128)(%rsp), %edi sub (40)(%rsp), %edi mov (32)(%rsp), %rax mov (%rax), %eax test %eax, %eax jnz LDecHuffAcT00gas_1 LDecHuffAc00gas_1: cmp $(8), %ebp jl LDecHuffAcLoad00gas_1 LDecHuffAc01gas_1: movq %mm0, %mm1 psrlq $(56), %mm0 movd %mm0, %ecx mov %r9, %rax movq %mm1, %mm0 mov (%rax,%rcx,4), %eax test $(4294901760), %eax jz LDecHuffAcLong00gas_1 mov %eax, %ebx shr $(16), %eax movd %eax, %mm1 sub %eax, %ebp psllq %mm1, %mm0 LDecHuffAcRetLong00gas_1: mov %ebx, %eax shr $(4), %eax and $(15), %eax and $(15), %ebx jz LDecHuffEndOfBlockRun00gas_1 sub %rax, %rdi cmp %ebx, %ebp jl LDecHuffAcLoad01gas_1 LDecHuffAc02gas_1: pextrw $(3), %mm0, %edx mov %r8, %rax mov $(16), %ecx movd %ebx, %mm1 sub %ebx, %ecx sub %ebx, %ebp lea (%rax,%rbx,4), %rbx psllq %mm1, %mm0 xor %eax, %eax test $(32768), %edx cmove (%rbx), %eax movzbl (%rdi,%rsi), %ebx shr %cl, %edx mov (136)(%rsp), %ecx add %eax, %edx mov (24)(%rsp), %rax shl %cl, %edx mov %dx, (%rax,%rbx,2) sub $(1), %edi jge LDecHuffAc00gas_1 jmp LDecHuffExit00gas_1 LDecHuffEndOfBlockRun00gas_1: cmp $(15), %eax jne LDecHuffEndOfBlockRun01gas_1 sub $(16), %edi jge LDecHuffAc00gas_1 jmp LDecHuffExit00gas_1 LDecHuffEndOfBlockRun01gas_1: mov %eax, %ecx mov $(1), %eax shl %cl, %eax test %ecx, %ecx jz LDecHuffEndOfBlockRun03gas_1 movd %eax, %mm4 mov %ecx, %ebx cmp %ecx, %ebp jl LDecHuffEndOfBlockRunLoadT00gas_1 LDecHuffEndOfBlockRun02gas_1: pextrw $(3), %mm0, %edx sub %ebx, %ebp mov $(16), %ecx movd %ebx, %mm1 sub %ebx, %ecx psllq %mm1, %mm0 shr %cl, %edx movd %mm4, %eax add %edx, %eax LDecHuffEndOfBlockRun03gas_1: movq (152)(%rsp), %rcx lea (12)(%rcx), %rbx sub $(1), %eax mov %eax, (%rbx) LDecHuffExit00gas_1: mov $(64), %eax sub %ebp, %eax movd %eax, %mm1 psrlq %mm1, %mm0 movd %mm7, %edx mov (16)(%rsp), %rax mov %edx, (%rax) movq (152)(%rsp), %rdx lea (8)(%rdx), %rax mov %ebp, (%rax) lea (%rdx), %rax movq %mm0, (%rax) LDecHuffExit02gas_1: mov (56)(%rsp), %rax emms add $(72), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LDecHuffExitEndOfBlockRun00gas_1: sub $(1), %eax mov %eax, (%rbx) jmp LDecHuffExit02gas_1 LDecHuffSwitchOverToTail00gas_1: sub (%rsp), %rax movd %eax, %mm7 mov $(64), %eax movd %ecx, %mm0 sub %ebp, %eax movd %eax, %mm1 psllq %mm1, %mm0 movd %edx, %mm1 mov (32)(%rsp), %rdx movd %mm1, (%rdx) mov (48)(%rsp), %rcx lea LDecHuffLong01gas_1(%rip), %rax cmp %rcx, %rax je LDecHuffLongRetLoadT00gas_1 lea LDecHuffAc01gas_1(%rip), %rax cmp %rcx, %rax je LDecHuffAcT00gas_1 jmp LDecHuffAcRetLoadT01gas_1 LDecHuffSwitchOverToTail01gas_1: mov (48)(%rsp), %rcx lea LDecHuffLong01gas_1(%rip), %rax cmp %rcx, %rax je LDecHuffLongT02gas_1 lea LDecHuffAc01gas_1(%rip), %rax cmp %rcx, %rax je LDecHuffAcT00gas_1 jmp LDecHuffAcLoadT01gas_1 LDecHuffErrorSrcOut00gas_1: movl $(-62), (56)(%rsp) jmp LDecHuffExit00gas_1 LDecHuffErrorRange00gas_1: movl $(-63), (56)(%rsp) jmp LDecHuffExit00gas_1 LDecHuffCheckLen00gas_1: mov (8)(%rsp), %ecx movd %mm7, %eax sub %eax, %ecx add (%rsp), %rax cmp $(8), %ecx jl LDecHuffSwitchOverToTail01gas_1 mov (%rax), %ecx mov (4)(%rax), %edx bswap %ecx movd %ecx, %mm2 mov $(64), %ecx bswap %edx sub %ebp, %ecx movd %edx, %mm1 movd %ecx, %mm3 punpckldq %mm2, %mm1 movq maskFF(%rip), %mm2 psrlq %mm3, %mm0 pcmpeqb %mm1, %mm2 pmovmskb %mm2, %ecx test %ecx, %ecx jnz LDecHuffInfill10gas_1 lea (7)(%rbp), %rcx and $(4294967288), %ecx mov $(64), %edx movd %ecx, %mm2 sub %ecx, %edx psrlq %mm2, %mm1 movd %edx, %mm2 add %edx, %ebp shr $(3), %edx psllq %mm2, %mm0 mov $(64), %ecx por %mm1, %mm0 movd %mm7, %eax sub %ebp, %ecx add %edx, %eax movd %ecx, %mm1 movd %eax, %mm7 mov (48)(%rsp), %rax psllq %mm1, %mm0 jmp *%rax LDecHuffLongLoad00gas_1: lea LDecHuffLong01gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffCheckLen00gas_1 LDecHuffAcLoad00gas_1: lea LDecHuffAc01gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffCheckLen00gas_1 LDecHuffAcLoad01gas_1: lea LDecHuffAc02gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffCheckLen00gas_1 LDecHuffInfill10gas_1: movd %mm0, %ecx LDecHuffInfill11gas_1: cmp $(24), %ebp jg LDecHuffInfill13gas_1 movzbl (%rax), %edx add $(1), %rax cmp $(255), %edx jne LDecHuffInfill12gas_1 movzbl (%rax), %edx add $(1), %rax test $(255), %edx jnz LDecHuffSwitchOverToTail00gas_1 mov $(255), %edx LDecHuffInfill12gas_1: shl $(8), %ecx or %edx, %ecx add $(8), %ebp jmp LDecHuffInfill11gas_1 LDecHuffInfill13gas_1: sub (%rsp), %rax movd %eax, %mm7 mov $(64), %eax movd %ecx, %mm0 sub %ebp, %eax movd %eax, %mm1 mov (48)(%rsp), %rax psllq %mm1, %mm0 jmp *%rax LDecHuffAcLong00gas_1: movq (144)(%rsp), %rax mov $(9), %ebx mov %rax, %r10 cmp $(16), %ebp jl LDecHuffLongLoad00gas_1 LDecHuffLong01gas_1: mov %r10, %rax lea (1572)(%rax), %rdx LDecHuffLong02gas_1: movq %mm0, %mm1 mov $(64), %eax sub %ebx, %eax movd %eax, %mm2 movswl (%rdx,%rbx,2), %eax psrlq %mm2, %mm1 movd %mm1, %ecx test $(32768), %eax jz LDecHuffLong03gas_1 cmp $(-1), %eax je LDecHuffLong03gas_1 movzwl (%rdx,%rbx,2), %eax LDecHuffLong03gas_1: cmp %eax, %ecx jle LDecHuffLong04gas_1 add $(1), %ebx cmp $(16), %ebx jg LDecHuffErrorRange00gas_1 jmp LDecHuffLong02gas_1 LDecHuffLong04gas_1: movd %ebx, %mm1 psllq %mm1, %mm0 sub %ebx, %ebp mov %r10, %rax lea (1536)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax sub %eax, %ecx mov %r10, %rax lea (1608)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax add %eax, %ecx mov %r10, %rax lea (%rax), %rdx movzwl (%rdx,%rcx,2), %ebx jmp LDecHuffAcRetLong00gas_1 LDecHuffAcT00gas_1: xor %ebx, %ebx cmp $(8), %ebp jl LDecHuffAcLoadT00gas_1 LDecHuffAcT01gas_1: cmp $(8), %ebp jge LDecHuffAcT02gas_1 add $(1), %ebx jmp LDecHuffAcLongT01gas_1 LDecHuffAcT02gas_1: movq %mm0, %mm1 psrlq $(56), %mm0 movd %mm0, %ecx mov %r9, %rax movq %mm1, %mm0 mov (%rax,%rcx,4), %eax test $(4294901760), %eax jz LDecHuffAcLongT00gas_1 mov %eax, %ebx shr $(16), %eax movd %eax, %mm1 sub %eax, %ebp psllq %mm1, %mm0 LDecHuffAcRetLongT00gas_1: mov %ebx, %eax shr $(4), %eax and $(15), %eax and $(15), %ebx jz LDecHuffEndOfBlockRunT00gas_1 sub %rax, %rdi cmp %ebx, %ebp jl LDecHuffAcLoadT01gas_1 LDecHuffAcT03gas_1: pextrw $(3), %mm0, %edx mov %r8, %rax mov $(16), %ecx movd %ebx, %mm1 sub %ebx, %ecx sub %ebx, %ebp lea (%rax,%rbx,4), %rbx psllq %mm1, %mm0 xor %eax, %eax test $(32768), %edx cmove (%rbx), %eax movzbl (%rdi,%rsi), %ebx shr %cl, %edx mov (136)(%rsp), %ecx add %eax, %edx mov (24)(%rsp), %rax shl %cl, %edx mov %dx, (%rax,%rbx,2) sub $(1), %edi jge LDecHuffAcT00gas_1 jmp LDecHuffExit00gas_1 LDecHuffEndOfBlockRunT00gas_1: cmp $(15), %eax jne LDecHuffEndOfBlockRun01gas_1 sub $(16), %edi jge LDecHuffAcT00gas_1 jmp LDecHuffExit00gas_1 LDecHuffAcLongT00gas_1: mov $(9), %ebx LDecHuffAcLongT01gas_1: movq (144)(%rsp), %rax mov %rax, %r10 LDecHuffLongT02gas_1: cmp %ebx, %ebp jl LDecHuffLongLoadT00gas_1 LDecHuffLongT03gas_1: mov %r10, %rax lea (1572)(%rax), %rdx movq %mm0, %mm1 mov $(64), %eax sub %ebx, %eax movd %eax, %mm2 movswl (%rdx,%rbx,2), %eax psrlq %mm2, %mm1 movd %mm1, %ecx test $(32768), %eax jz LDecHuffLongT04gas_1 cmp $(-1), %eax je LDecHuffLongT04gas_1 movzwl (%rdx,%rbx,2), %eax LDecHuffLongT04gas_1: cmp %eax, %ecx jle LDecHuffLongT05gas_1 add $(1), %ebx cmp $(16), %ebx jg LDecHuffErrorRange00gas_1 jmp LDecHuffLongT02gas_1 LDecHuffLongT05gas_1: movd %ebx, %mm1 psllq %mm1, %mm0 sub %ebx, %ebp mov %r10, %rax lea (1536)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax sub %eax, %ecx mov %r10, %rax lea (1608)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax add %eax, %ecx mov %r10, %rax lea (%rax), %rdx movzwl (%rdx,%rcx,2), %ebx jmp LDecHuffAcRetLongT00gas_1 LDecHuffInfillT00gas_1: mov (32)(%rsp), %rax mov (%rax), %eax test %eax, %eax jnz LDecHuffInfillT08gas_1 LDecHuffInfillT02gas_1: mov $(64), %ecx sub %ebp, %ecx movd %ecx, %mm1 psrlq %mm1, %mm0 mov $(1), %eax movd %eax, %mm1 movd %mm0, %ecx movd %mm7, %eax add (%rsp), %rax LDecHuffInfillT03gas_1: cmp $(24), %ebp jg LDecHuffInfillT06gas_1 movd %mm7, %edx cmp (8)(%rsp), %edx je LDecHuffInfillT06gas_1 movzbl (%rax), %edx add $(1), %rax paddd %mm1, %mm7 cmp $(255), %edx jne LDecHuffInfillT04gas_1 movd %mm7, %edx cmp (8)(%rsp), %edx jge LDecHuffInfillT09gas_1 movzbl (%rax), %edx add $(1), %rax paddd %mm1, %mm7 test $(255), %edx jnz LDecHuffInfillT05gas_1 mov $(255), %edx LDecHuffInfillT04gas_1: shl $(8), %ecx or %edx, %ecx add $(8), %ebp jmp LDecHuffInfillT03gas_1 LDecHuffInfillT05gas_1: movd %edx, %mm1 mov (32)(%rsp), %rdx movd %mm1, (%rdx) LDecHuffInfillT06gas_1: mov $(64), %eax movd %ecx, %mm0 sub %ebp, %eax movd %eax, %mm1 mov (48)(%rsp), %rax psllq %mm1, %mm0 LDecHuffInfillT07gas_1: mov (48)(%rsp), %rax jmp *%rax LDecHuffInfillT08gas_1: cmp %ebx, %ebp jge LDecHuffInfillT07gas_1 movl $(-63), (56)(%rsp) jmp LDecHuffInfillT07gas_1 LDecHuffInfillT09gas_1: movl $(-62), (56)(%rsp) jmp LDecHuffInfillT06gas_1 LDecHuffLongLoadT00gas_1: lea LDecHuffLongRetLoadT00gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffInfillT00gas_1 LDecHuffLongRetLoadT00gas_1: cmpl $(0), (56)(%rsp) jne LDecHuffExit00gas_1 cmp %ebx, %ebp jl LDecHuffErrorSrcOut00gas_1 jmp LDecHuffLongT03gas_1 LDecHuffAcLoadT00gas_1: lea LDecHuffAcRetLoadT00gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffInfillT00gas_1 LDecHuffAcRetLoadT00gas_1: cmpl $(0), (56)(%rsp) jne LDecHuffExit00gas_1 cmp %ebx, %ebp jl LDecHuffErrorSrcOut00gas_1 jmp LDecHuffAcT01gas_1 LDecHuffAcLoadT01gas_1: lea LDecHuffAcRetLoadT01gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffInfillT00gas_1 LDecHuffAcRetLoadT01gas_1: cmpl $(0), (56)(%rsp) jne LDecHuffExit00gas_1 cmp %ebx, %ebp jl LDecHuffErrorSrcOut00gas_1 jmp LDecHuffAcT03gas_1 LDecHuffEndOfBlockRunLoadT00gas_1: lea LDecHuffEndOfBlockRunRetLoadT00gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LDecHuffInfillT00gas_1 LDecHuffEndOfBlockRunRetLoadT00gas_1: cmpl $(0), (56)(%rsp) jne LDecHuffEndOfBlockRunRetLoadT01gas_1 cmp %ebx, %ebp jge LDecHuffEndOfBlockRun02gas_1 movl $(-62), (56)(%rsp) LDecHuffEndOfBlockRunRetLoadT01gas_1: movq (152)(%rsp), %rax lea (12)(%rax), %rax movd %mm4, (%rax) jmp LDecHuffExit00gas_1 .p2align 4, 0x90 .globl mfxownpj_DecodeHuffman8x8_ACRefine_JPEG_1u16s_C1 mfxownpj_DecodeHuffman8x8_ACRefine_JPEG_1u16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(120), %rsp mov %rdi, (64)(%rsp) mov %esi, %esi mov %rsi, (72)(%rsp) mov %rdx, (80)(%rsp) mov %rcx, (88)(%rsp) mov %r8, (96)(%rsp) mov %r9d, %r9d mov %r9, (104)(%rsp) mov (176)(%rsp), %eax mov %rax, (176)(%rsp) mov (184)(%rsp), %eax mov %rax, (184)(%rsp) mov $(0), %rax mov %rax, (16)(%rsp) movq (200)(%rsp), %rcx lea (8)(%rcx), %rax mov (%rax), %ebp lea (%rcx), %rax movq (%rax), %mm0 mov $(64), %eax sub %ebp, %eax movd %eax, %mm1 psllq %mm1, %mm0 mov (80)(%rsp), %rax mov (%rax), %eax mov %rax, (%rsp) mov (176)(%rsp), %rax sub $(63), %rax lea ownZigzag(%rip), %rsi sub %rax, %rsi mov %rsi, (8)(%rsp) mov (176)(%rsp), %edi sub (104)(%rsp), %edi mov (184)(%rsp), %ecx mov $(1), %eax shl %cl, %eax movd %eax, %mm7 mov $(-1), %eax shl %cl, %eax movd %eax, %mm6 pxor %mm5, %mm5 movq (192)(%rsp), %rax lea (512)(%rax), %rax mov %rax, (56)(%rsp) movq (200)(%rsp), %rax lea (12)(%rax), %rax mov (%rax), %eax cmp $(0), %eax jnz LDecRefine2Coef10gas_2 LDecHuff00gas_2: cmp $(8), %ebp jl LDecHuffLoad00gas_2 LDecHuffLoadRet00gas_2: movq %mm0, %mm1 psrlq $(56), %mm0 movd %mm0, %ecx mov (56)(%rsp), %rax movq %mm1, %mm0 mov (%rax,%rcx,4), %eax test $(4294901760), %eax jz LDecHuffLong00gas_2 mov %eax, %ebx shr $(16), %eax movd %eax, %mm1 sub %eax, %ebp psllq %mm1, %mm0 LDecHuffLongRetgas_2: mov %ebx, %eax shr $(4), %eax and $(15), %eax mov %eax, (40)(%rsp) and $(15), %ebx mov %ebx, (48)(%rsp) jz LDecEndOfBlockRun00gas_2 sub $(1), %ebp jl LDecHuffLoad01gas_2 LDecHuffLoadRet01gas_2: pxor %mm2, %mm2 movq maskFF(%rip), %mm1 pcmpgtd %mm0, %mm2 psllq $(1), %mm0 psrlq $(32), %mm2 pxor %mm2, %mm1 pand %mm7, %mm2 pand %mm6, %mm1 por %mm2, %mm1 movd %mm1, (48)(%rsp) jmp LDecRefine1Coef00gas_2 LDecRefine1Coef01gas_2: mov (40)(%rsp), %eax mov (8)(%rsp), %rsi sub $(1), %eax mov %eax, (40)(%rsp) jl LDecHuff02gas_2 sub $(1), %rdi jl LDecHuff02gas_2 LDecRefine1Coef00gas_2: movzbl (%rdi,%rsi), %esi add (88)(%rsp), %rsi movswl (%rsi), %eax movd %eax, %mm1 test %eax, %eax jz LDecRefine1Coef01gas_2 sub $(1), %ebp jl LDecRefine1Load00gas_2 LDecRefine1LoadRet00gas_2: pxor %mm2, %mm2 movq %mm1, %mm3 pand %mm7, %mm1 pcmpgtd %mm0, %mm2 psllq $(1), %mm0 psrlq $(32), %mm2 pcmpeqd %mm5, %mm1 pand %mm2, %mm1 movq %mm3, %mm2 pcmpgtd %mm5, %mm3 movq %mm3, %mm4 pxor %mm1, %mm3 pand %mm7, %mm4 pand %mm6, %mm3 por %mm4, %mm3 pand %mm1, %mm3 paddd %mm3, %mm2 movd %mm2, %eax mov %ax, (%rsi) mov (8)(%rsp), %rsi sub $(1), %rdi jge LDecRefine1Coef00gas_2 LDecHuff02gas_2: mov (48)(%rsp), %eax test %eax, %eax jz LDecHuff03gas_2 movzbl (%rdi,%rsi), %ecx add (88)(%rsp), %rcx mov %ax, (%rcx) LDecHuff03gas_2: cmp $(0), %edi jl LDecRefine2Coef00gas_2 sub $(1), %rdi jge LDecHuff00gas_2 LDecRefine2Coef00gas_2: movq (200)(%rsp), %rax lea (12)(%rax), %rax mov (%rax), %eax cmp $(0), %eax LDecRefine2Coef10gas_2: jle LDecRefineExit00gas_2 cmp $(0), %edi jl LDecRefine2Coef03gas_2 jmp LDecRefine2Coef01gas_2 LDecRefine2Coef02gas_2: mov (8)(%rsp), %rsi sub $(1), %edi jl LDecRefine2Coef03gas_2 LDecRefine2Coef01gas_2: movzbl (%rdi,%rsi), %esi add (88)(%rsp), %rsi movswl (%rsi), %eax movd %eax, %mm1 test %eax, %eax jz LDecRefine2Coef02gas_2 sub $(1), %ebp jl LDecRefine2Load00gas_2 LDecRefine2LoadRet00gas_2: pxor %mm2, %mm2 movq %mm1, %mm3 pand %mm7, %mm1 pcmpgtd %mm0, %mm2 psllq $(1), %mm0 psrlq $(32), %mm2 pcmpeqd %mm5, %mm1 pand %mm2, %mm1 movq %mm3, %mm2 pcmpgtd %mm5, %mm3 movq %mm3, %mm4 pxor %mm1, %mm3 pand %mm7, %mm4 pand %mm6, %mm3 por %mm4, %mm3 pand %mm1, %mm3 paddd %mm3, %mm2 movd %mm2, %eax mov %ax, (%rsi) mov (8)(%rsp), %rsi sub $(1), %edi jge LDecRefine2Coef01gas_2 LDecRefine2Coef03gas_2: movq (200)(%rsp), %rax lea (12)(%rax), %rbx mov (%rbx), %eax sub $(1), %eax mov %eax, (%rbx) LDecRefineExit00gas_2: mov $(64), %eax sub %ebp, %eax movd %eax, %mm1 psrlq %mm1, %mm0 movq (200)(%rsp), %rdx lea (8)(%rdx), %rax mov %ebp, (%rax) lea (%rdx), %rax movq %mm0, (%rax) mov (%rsp), %edx mov (80)(%rsp), %rax mov %edx, (%rax) mov (16)(%rsp), %rax emms add $(120), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LDecEndOfBlockRun00gas_2: cmp $(15), %eax je LDecRefine1Coef00gas_2 mov %eax, %ecx mov $(1), %eax shl %cl, %eax test %ecx, %ecx jz LDecEndOfBlockRun01gas_2 movd %eax, %mm4 mov %ecx, %ebx cmp %ecx, %ebp jl LDecEndOfBlockRunLoad00gas_2 LDecEndOfBlockRunLoadRet00gas_2: pextrw $(3), %mm0, %edx sub %ebx, %ebp mov $(16), %ecx movd %ebx, %mm1 sub %ebx, %ecx psllq %mm1, %mm0 shr %cl, %edx movd %mm4, %eax add %edx, %eax LDecEndOfBlockRun01gas_2: movq (200)(%rsp), %rcx lea (12)(%rcx), %rbx mov %eax, (%rbx) jmp LDecRefine2Coef00gas_2 LDecRefineError00gas_2: cmpl $(10), (16)(%rsp) je LDecHuffErrorRng00gas_2 LDecHuffErrorSrcOut00gas_2: movl $(-62), (16)(%rsp) jmp LDecRefineExit00gas_2 LDecHuffErrorRng00gas_2: movl $(-63), (16)(%rsp) jmp LDecRefineExit00gas_2 LDecRefineInfill00gas_2: mov (96)(%rsp), %rax mov (%rax), %eax test %eax, %eax jnz LDecRefineInfill08gas_2 mov (72)(%rsp), %edx mov (%rsp), %eax sub %eax, %edx add (64)(%rsp), %rax cmp $(8), %edx jl LDecRefineInfill01gas_2 mov (%rax), %ecx mov (4)(%rax), %edx bswap %ecx movd %ecx, %mm2 mov $(64), %ecx bswap %edx sub %ebp, %ecx movd %edx, %mm1 movd %ecx, %mm3 punpckldq %mm2, %mm1 movq maskFF(%rip), %mm2 psrlq %mm3, %mm0 pcmpeqb %mm1, %mm2 pmovmskb %mm2, %ecx test %ecx, %ecx jnz LDecRefineInfill02gas_2 lea (7)(%rbp), %rcx and $(4294967288), %ecx mov $(64), %edx movd %ecx, %mm2 sub %ecx, %edx psrlq %mm2, %mm1 movd %edx, %mm2 add %edx, %ebp shr $(3), %edx psllq %mm2, %mm0 mov $(64), %ecx por %mm1, %mm0 mov (%rsp), %eax sub %ebp, %ecx add %edx, %eax movd %ecx, %mm1 mov %eax, (%rsp) mov (32)(%rsp), %rax psllq %mm1, %mm0 jmp *%rax LDecRefineInfill01gas_2: mov $(64), %ecx sub %ebp, %ecx movd %ecx, %mm1 psrlq %mm1, %mm0 LDecRefineInfill02gas_2: mov (%rsp), %ecx movd %mm0, %ebx LDecRefineInfill03gas_2: cmp $(24), %ebp jg LDecRefineInfill06gas_2 cmp (72)(%rsp), %ecx je LDecRefineInfill06gas_2 movzbl (%rax), %edx add $(1), %rax add $(1), %ecx cmp $(255), %edx jne LDecRefineInfill04gas_2 cmp (72)(%rsp), %ecx jge LDecRefineInfill09gas_2 movzbl (%rax), %edx add $(1), %rax add $(1), %ecx test $(255), %edx jnz LDecRefineInfill05gas_2 mov $(255), %edx LDecRefineInfill04gas_2: shl $(8), %ebx or %edx, %ebx add $(8), %ebp jmp LDecRefineInfill03gas_2 LDecRefineInfill05gas_2: mov (96)(%rsp), %rax mov %edx, (%rax) LDecRefineInfill06gas_2: mov %ecx, (%rsp) mov $(32), %ecx sub %ebp, %ecx shl %cl, %ebx movd %ebx, %mm0 psllq $(32), %mm0 LDecRefineInfill07gas_2: mov (32)(%rsp), %rax jmp *%rax LDecRefineInfill08gas_2: movl $(10), (16)(%rsp) jmp LDecRefineInfill07gas_2 LDecRefineInfill09gas_2: movl $(-62), (16)(%rsp) jmp LDecRefineInfill06gas_2 LDecHuffLoad00gas_2: lea LDecHuffLoad10gas_2(%rip), %rax mov %rax, (32)(%rsp) jmp LDecRefineInfill00gas_2 LDecHuffLoad10gas_2: cmpl $(-62), (16)(%rsp) je LDecRefineExit00gas_2 cmp $(8), %ebp jge LDecHuffLoadRet00gas_2 mov $(1), %ebx jmp LDecHuffLong01gas_2 LDecHuffLongLoad00gas_2: lea LDecHuffLongLoad10gas_2(%rip), %rax mov %rax, (32)(%rsp) mov %ebx, (24)(%rsp) jmp LDecRefineInfill00gas_2 LDecHuffLongLoad10gas_2: cmpl $(-62), (16)(%rsp) je LDecRefineExit00gas_2 mov (24)(%rsp), %ebx cmp %ebx, %ebp jl LDecRefineError00gas_2 jmp LDecHuffLongLoadRet00gas_2 LDecHuffLoad01gas_2: lea LDecHuffLoad11gas_2(%rip), %rax mov %rax, (32)(%rsp) add $(1), %ebp jmp LDecRefineInfill00gas_2 LDecHuffLoad11gas_2: cmpl $(-62), (16)(%rsp) je LDecRefineExit00gas_2 sub $(1), %ebp jle LDecRefineError00gas_2 jmp LDecHuffLoadRet01gas_2 LDecEndOfBlockRunLoad00gas_2: lea LDecEndOfBlockRunLoad10gas_2(%rip), %rax mov %rax, (32)(%rsp) mov %ebx, (24)(%rsp) jmp LDecRefineInfill00gas_2 LDecEndOfBlockRunLoad10gas_2: cmpl $(-62), (16)(%rsp) je LDecEndOfBlockRunLoad11gas_2 mov (24)(%rsp), %ebx cmp %ebx, %ebp jge LDecEndOfBlockRunLoadRet00gas_2 LDecEndOfBlockRunLoad11gas_2: movq (200)(%rsp), %rax lea (12)(%rax), %rax movd %mm4, (%rax) cmpl $(10), (16)(%rsp) je LDecHuffErrorRng00gas_2 jmp LDecHuffErrorSrcOut00gas_2 LDecRefine1Load00gas_2: lea LDecRefine1Load10gas_2(%rip), %rax mov %rax, (32)(%rsp) movd %mm1, (24)(%rsp) add $(1), %ebp jmp LDecRefineInfill00gas_2 LDecRefine1Load10gas_2: cmpl $(-62), (16)(%rsp) je LDecRefineExit00gas_2 movd (24)(%rsp), %mm1 sub $(1), %ebp jl LDecRefineError00gas_2 jmp LDecRefine1LoadRet00gas_2 LDecRefine2Load00gas_2: lea LDecRefine2Load10gas_2(%rip), %rax mov %rax, (32)(%rsp) movd %mm1, (24)(%rsp) add $(1), %ebp jmp LDecRefineInfill00gas_2 LDecRefine2Load10gas_2: cmpl $(0), (16)(%rsp) jl LDecRefineExit00gas_2 movd (24)(%rsp), %mm1 sub $(1), %ebp jl LDecRefineError00gas_2 jmp LDecRefine2LoadRet00gas_2 LDecHuffLong00gas_2: mov $(9), %ebx LDecHuffLong01gas_2: movq (192)(%rsp), %rax mov %rax, %r10 LDecHuffLong02gas_2: cmp %ebx, %ebp jl LDecHuffLongLoad00gas_2 LDecHuffLongLoadRet00gas_2: mov %r10, %rax lea (1572)(%rax), %rdx movq %mm0, %mm1 mov $(64), %eax sub %ebx, %eax movd %eax, %mm2 movswl (%rdx,%rbx,2), %eax psrlq %mm2, %mm1 movd %mm1, %ecx test $(32768), %eax jz LDecHuffLong03gas_2 cmp $(-1), %eax je LDecHuffLong03gas_2 movzwl (%rdx,%rbx,2), %eax LDecHuffLong03gas_2: cmp %eax, %ecx jle LDecHuffLong04gas_2 add $(1), %ebx cmp $(16), %ebx jg LDecHuffErrorRng00gas_2 jmp LDecHuffLong02gas_2 LDecHuffLong04gas_2: movd %ebx, %mm1 psllq %mm1, %mm0 sub %ebx, %ebp mov %r10, %rax lea (1536)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax sub %eax, %ecx mov %r10, %rax lea (1608)(%rax), %rdx movzwl (%rdx,%rbx,2), %eax add %eax, %ecx mov %r10, %rax lea (%rax), %rdx movzwl (%rdx,%rcx,2), %ebx jmp LDecHuffLongRetgas_2 .data .p2align 4, 0x90 maskFF: .quad 0xffffffffffffffff .byte 126, 126, 126, 126, 126, 126, 126, 126 ownZigzag: .byte 126, 124, 110, 94, 108, 122, 120, 106 .byte 92, 78, 62, 76, 90, 104, 118, 116 .byte 102, 88, 74, 60, 46, 30, 44, 58 .byte 72, 86, 100, 114, 112, 98, 84, 70 .byte 56, 42, 28, 14, 12, 26, 40, 54 .byte 68, 82, 96, 80, 66, 52, 38, 24 .byte 10, 8, 22, 36, 50, 64, 48, 34 .byte 20, 6, 4, 18, 32, 16, 2, 0 .byte 63, 63, 63, 63, 63, 63, 63, 63 ownTables: .byte 63, 62, 55, 47, 54, 61, 60, 53 .byte 46, 39, 31, 38, 45, 52, 59, 58 .byte 51, 44, 37, 30, 23, 15, 22, 29 .byte 36, 43, 50, 57, 56, 49, 42, 35 .byte 28, 21, 14, 7, 6, 13, 20, 27 .byte 34, 41, 48, 40, 33, 26, 19, 12 .byte 5, 4, 11, 18, 25, 32, 24, 17 .byte 10, 3, 2, 9, 16, 8, 1, 0 .long 0, -1, -3, -7 .long -15, -31, -63, -127 .long -255, -511, -1023, -2047 .long -4095, -8191, -16383, -32767 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdechuffsu8as.s000066400000000000000000000215241443134507600275450ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 TOP_LABEL: .long 0, 1, 2, 4 .long 8, 16, 32, 64 .long 128, 256, 512, 1024 .long 2048, 4096, 8192, 16384 .long 0, -1, -3, -7 .long -15, -31, -63, -127 .long -255, -511, -1023, -2047 .long -4095, -8191, -16383, -32767 .quad 0xffffffffffffffff, 0xffffffffffffffff .text .p2align 4, 0x90 .globl mfxownpj_DecodeHuffmanRow_JPEG_1u16s_C1P4 mfxownpj_DecodeHuffmanRow_JPEG_1u16s_C1P4: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(104), %rsp movslq %esi, %rsi movslq %r8d, %r8 movslq %r9d, %r9 mov %rdi, (72)(%rsp) mov %rsi, (80)(%rsp) mov %rdx, (88)(%rsp) sub $(1), %r9 jl LDecHuffExitEndOfWork00gas_1 cmp $(3), %r9 jg LDecHuffExitEndOfWork00gas_1 movq (160)(%rsp), %rax mov (%rax), %eax test %eax, %eax jnz LDecHuffExitEndOfWork00gas_1 shl $(1), %r9 movq (168)(%rsp), %rbx mov %r9, %rdi LInitDecHuff00gas_1: mov (%rcx), %rax add $(8), %rcx lea (%rax,%r8,2), %rax mov %rax, (%rsp,%rdi,8) mov (%rbx), %rax add $(8), %rbx mov %rax, (8)(%rsp,%rdi,8) sub $(2), %rdi jge LInitDecHuff00gas_1 neg %r8 movq (176)(%rsp), %rax mov (8)(%rax), %ebp mov (%rax), %r11 mov $(64), %ecx sub %ebp, %ecx shl %cl, %r11 mov (%rdx), %edx mov %rdx, %r12 sub %rsi, %rdx lea (,%r8,2), %rbx cmp %rbx, %rdx jg LDecHuffExitEndOfWork00gas_1 lea TOP_LABEL(%rip), %rsi LColDecHuff00gas_1: mov %r9, %rdi LDecHuff__00gas_1: mov (8)(%rsp,%rdi,8), %r15 mov %r11, %rcx shr $(56), %rcx cmp $(8), %ebp jl LDecHuff__Call00gas_1 LDecHuff__01gas_1: mov (512)(%r15,%rcx,4), %ecx test $(4294901760), %ecx jz LDecHuff__Long00gas_1 mov %ecx, %ebx shr $(16), %ecx sub %ecx, %ebp shl %cl, %r11 LDecHuff__RetLonggas_1: and $(65535), %ebx jz LDecHuff__04gas_1 cmp $(16), %ebx jge LDecHuff__05gas_1 cmp %ebx, %ebp jl LDecHuff__Call01gas_1 LDecHuff__02gas_1: mov %ebx, %ecx mov %r11, %rdx shl %cl, %r11 mov $(16), %ecx shr $(48), %rdx sub %rbx, %rbp sub %rbx, %rcx shr %cl, %edx xor %ecx, %ecx cmpl (%rsi,%rbx,4), %edx cmovll (64)(%rsi,%rbx,4), %ecx add %ecx, %edx LDecHuff__03gas_1: mov (%rsp,%rdi,8), %rax mov %r11, %rcx mov %dx, (%rax,%r8,2) shr $(56), %rcx sub $(2), %rdi jge LDecHuff__00gas_1 add $(1), %r8 jnz LColDecHuff00gas_1 jmp LDecHuffExitNorm00gas_1 LDecHuff__04gas_1: xor %edx, %edx jmp LDecHuff__03gas_1 LDecHuff__05gas_1: mov $(32768), %edx jmp LDecHuff__03gas_1 LDecHuffExitNorm00gas_1: mov $(0), %eax mov $(64), %ecx sub %ebp, %ecx shr %cl, %r11 cmp $(32), %ebp jl LDecHuffExit01gas_1 lea (7)(%rbp), %rcx and $(4294967288), %ecx sub $(32), %ecx shr %cl, %r11 sub %ecx, %ebp shr $(3), %ecx sub %rcx, %r12 LDecHuffExit01gas_1: mov (88)(%rsp), %rdx mov %r12d, (%rdx) movq (176)(%rsp), %rdx mov %ebp, (8)(%rdx) mov %r11, (%rdx) LDecHuffExit02gas_1: add $(104), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LDecHuffExitEndOfWork00gas_1: mov $(1), %eax jmp LDecHuffExit02gas_1 LDecHuff__Call00gas_1: lea LDecHuff__01gas_1(%rip), %r13 LDecHuffCheckLen00gas_1: mov (80)(%rsp), %rcx mov %r12, %rax sub %r12, %rcx add (72)(%rsp), %rax cmp $(8), %ecx jl LDecHuffExitEndOfWork00gas_1 mov (%rax), %r10 bswap %r10 movd %r10, %xmm1 pcmpeqb (128)(%rsi), %xmm1 mov $(64), %ecx sub %ebp, %ecx shr %cl, %r11 movd %xmm1, %rcx test %rcx, %rcx jnz LDecHuffInfill10gas_1 lea (7)(%rbp), %rcx and $(4294967288), %ecx mov $(64), %edx sub %ecx, %edx shr %cl, %r10 mov %edx, %ecx add %edx, %ebp shr $(3), %edx shl %cl, %r11 mov $(64), %ecx or %r10, %r11 sub %ebp, %ecx add %rdx, %r12 shl %cl, %r11 mov %r11, %rcx shr $(56), %rcx jmp *%r13 LDecHuff__Call01gas_1: lea LDecHuff__02gas_1(%rip), %r13 jmp LDecHuffCheckLen00gas_1 LDecHuffLongCall00gas_1: lea LDecHuffLong01gas_1(%rip), %r13 jmp LDecHuffCheckLen00gas_1 LDecHuffInfill10gas_1: mov %r11, %rcx LDecHuffInfill11gas_1: cmp $(24), %ebp jg LDecHuffInfill13gas_1 movzbl (%rax), %edx add $(1), %rax cmp $(255), %edx jne LDecHuffInfill12gas_1 movzbl (%rax), %edx add $(1), %rax test $(255), %edx jnz LDecHuffExitEndOfWork00gas_1 mov $(255), %edx LDecHuffInfill12gas_1: shl $(8), %ecx or %edx, %ecx add $(8), %ebp jmp LDecHuffInfill11gas_1 LDecHuffInfill13gas_1: sub (72)(%rsp), %rax mov %rax, %r12 mov %rcx, %r11 mov $(64), %ecx sub %ebp, %ecx shl %cl, %r11 mov %r11, %rcx shr $(56), %rcx jmp *%r13 LDecHuff__Long00gas_1: lea LDecHuff__RetLonggas_1(%rip), %r14 mov $(9), %ebx cmp $(16), %ebp jl LDecHuffLongCall00gas_1 LDecHuffLong01gas_1: lea (1572)(%r15), %rdx LDecHuffLong02gas_1: mov $(64), %ecx sub %ebx, %ecx mov %r11, %r10 movswl (%rdx,%rbx,2), %eax shr %cl, %r10 test $(32768), %eax jz LDecHuffLong03gas_1 cmp $(-1), %eax je LDecHuffLong03gas_1 movzwl (%rdx,%rbx,2), %eax LDecHuffLong03gas_1: cmp %eax, %r10d jle LDecHuffLong04gas_1 add $(1), %ebx cmp $(16), %ebx jg LDecHuffExitEndOfWork00gas_1 jmp LDecHuffLong02gas_1 LDecHuffLong04gas_1: mov %ebx, %ecx shl %cl, %r11 sub %ebx, %ebp lea (1536)(%r15), %rdx movzwl (%rdx,%rbx,2), %eax sub %eax, %r10d lea (1608)(%r15), %rdx movzwl (%rdx,%rbx,2), %eax add %eax, %r10d lea (%r15), %rdx movzwl (%rdx,%r10,2), %ebx jmp *%r14 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdechuffu8as.s000066400000000000000000000277601443134507600273720ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 maskFF: .quad 0xffffffffffffffff, 0xffffffffffffffff ownTables: .byte 63, 62, 55, 47, 54, 61, 60, 53 .byte 46, 39, 31, 38, 45, 52, 59, 58 .byte 51, 44, 37, 30, 23, 15, 22, 29 .byte 36, 43, 50, 57, 56, 49, 42, 35 .byte 28, 21, 14, 7, 6, 13, 20, 27 .byte 34, 41, 48, 40, 33, 26, 19, 12 .byte 5, 4, 11, 18, 25, 32, 24, 17 .byte 10, 3, 2, 9, 16, 8, 1, 0 .long 0, -1, -3, -7 .long -15, -31, -63, -127 .long -255, -511, -1023, -2047 .long -4095, -8191, -16383, -32767 .text .p2align 4, 0x90 .globl mfxownpj_DecodeHuffman8x8_JPEG_1u16s_C1 mfxownpj_DecodeHuffman8x8_JPEG_1u16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(56), %rsp mov %rdi, (%rsp) mov %esi, %esi mov %rsi, (8)(%rsp) mov %rdx, (16)(%rsp) mov %rcx, %r13 mov %r8, (24)(%rsp) mov (%r9), %eax test %eax, %eax jnz LDecHuffExitEndOfWork01gas_1 pxor %xmm0, %xmm0 mov %r13, %rax mov %r13, %rdi and $(15), %rax jnz LDecHuffInit01gas_1 movq (128)(%rsp), %rax lea (8)(%rax), %rcx movdqa %xmm0, (%rdi) mov (%rcx), %ebp movd %xmm0, (8)(%rcx) lea (%rax), %rax movdqa %xmm0, (16)(%rdi) mov (%rax), %r11 mov $(64), %ecx movdqa %xmm0, (32)(%rdi) sub %ebp, %ecx movdqa %xmm0, (48)(%rdi) shl %cl, %r11 movdqa %xmm0, (64)(%rdi) mov (%rdx), %edx movdqa %xmm0, (80)(%rdi) mov %rdx, %r12 sub (8)(%rsp), %rdx movdqa %xmm0, (96)(%rdi) cmp $(-24), %rdx jg LDecHuffExitEndOfWork01gas_1 movdqa %xmm0, (112)(%rdi) movswl (%r8), %eax mov %eax, (32)(%rsp) lea ownTables(%rip), %rsi LDecHuffInit00gas_1: cmp $(8), %ebp jl LDecHuffDcCall00gas_1 LDecHuffDc00gas_1: movq (112)(%rsp), %rax lea (512)(%rax), %rax mov %r11, %rcx shr $(56), %rcx mov (%rax,%rcx,4), %ecx test $(4294901760), %ecx jz LDecHuffDcLong00gas_1 mov %ecx, %ebx shr $(16), %ecx sub %ecx, %ebp shl %cl, %r11 LDecHuffDcRetLonggas_1: and $(15), %ebx cmove %ebx, %edx jz LDecHuffDc02gas_1 cmp %ebx, %ebp jl LDecHuffDcCall01gas_1 LDecHuffDc01gas_1: mov %ebx, %ecx sub %ebx, %ebp mov %r11, %rdx shl %cl, %r11 mov $(16), %ecx shr $(48), %rdx sub %ebx, %ecx xor %eax, %eax test $(32768), %edx cmove (64)(%rsi,%rbx,4), %eax shr %cl, %edx add %eax, %edx LDecHuffDc02gas_1: mov (24)(%rsp), %rax addw (%rax), %dx mov %dx, (%rax) mov %dx, (%r13) movq (120)(%rsp), %r14 lea (512)(%r14), %r14 mov $(62), %edi mov %r11, %rcx shr $(56), %rcx LDecHuffAc00gas_1: cmp $(8), %ebp jl LDecHuffAcCall00gas_1 LDecHuffAc01gas_1: mov (%r14,%rcx,4), %ecx test $(4294901760), %ecx jz LDecHuffAcLong00gas_1 mov %ecx, %ebx shr $(16), %ecx sub %ecx, %ebp shl %cl, %r11 LDecHuffAcRetLonggas_1: mov %ebx, %eax shr $(4), %eax and $(15), %eax and $(15), %ebx jz LDecHuffExitNorm00gas_1 sub %eax, %edi jl LDecHuffExitEndOfWork00gas_1 cmp %ebx, %ebp jl LDecHuffAcCall01gas_1 LDecHuffAc02gas_1: mov %ebx, %ecx mov %r11, %rdx shl %cl, %r11 mov $(16), %ecx shr $(48), %rdx sub %rbx, %rbp sub %rbx, %rcx xor %rax, %rax test $(32768), %edx cmove (64)(%rsi,%rbx,4), %eax movzbq (%rdi,%rsi), %rbx shr %cl, %edx mov %r11, %rcx add %eax, %edx shr $(56), %rcx mov %dx, (%r13,%rbx,2) sub $(1), %rdi jge LDecHuffAc00gas_1 jmp LDecHuffExitNorm01gas_1 LDecHuffExitNorm00gas_1: cmp $(15), %eax je LDecHuffAc04gas_1 LDecHuffExitNorm01gas_1: movq (128)(%rsp), %rcx mov $(63), %edx sub %edi, %edx mov $(0), %eax mov %edx, (16)(%rcx) LDecHuffExit00gas_1: mov $(64), %ecx sub %ebp, %ecx shr %cl, %r11 cmp $(32), %ebp jl LDecHuffExit01gas_1 lea (7)(%rbp), %rcx and $(4294967288), %ecx sub $(32), %ecx shr %cl, %r11 sub %ecx, %ebp shr $(3), %ecx sub %rcx, %r12 LDecHuffExit01gas_1: mov (16)(%rsp), %rdx mov %r12d, (%rdx) movq (128)(%rsp), %rdx lea (8)(%rdx), %rcx mov %ebp, (%rcx) lea (%rdx), %rcx mov %r11, (%rcx) LDecHuffExit02gas_1: add $(56), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LDecHuffAc04gas_1: mov %r11, %rcx shr $(56), %rcx sub $(16), %edi jge LDecHuffAc00gas_1 jmp LDecHuffExitEndOfWork00gas_1 LDecHuffExitEndOfWork00gas_1: mov (24)(%rsp), %rax mov (32)(%rsp), %ecx mov %cx, (%rax) LDecHuffExitEndOfWork01gas_1: mov $(1), %eax jmp LDecHuffExit02gas_1 LDecHuffAcCall00gas_1: lea LDecHuffAc01gas_1(%rip), %r8 LDecHuffCheckLen00gas_1: mov (8)(%rsp), %rcx mov %r12, %rax sub %r12, %rcx add (%rsp), %rax cmp $(8), %ecx jl LDecHuffExitEndOfWork00gas_1 mov (%rax), %r10 bswap %r10 movd %r10, %xmm1 pcmpeqb maskFF(%rip), %xmm1 mov $(64), %ecx sub %ebp, %ecx shr %cl, %r11 movd %xmm1, %rcx test %rcx, %rcx jnz LDecHuffInfill10gas_1 lea (7)(%rbp), %rcx and $(4294967288), %ecx mov $(64), %edx sub %ecx, %edx shr %cl, %r10 mov %edx, %ecx add %edx, %ebp shr $(3), %edx shl %cl, %r11 mov $(64), %ecx or %r10, %r11 sub %ebp, %ecx add %rdx, %r12 shl %cl, %r11 mov %r11, %rcx shr $(56), %rcx jmp *%r8 LDecHuffDcCall00gas_1: lea LDecHuffDc00gas_1(%rip), %r8 jmp LDecHuffCheckLen00gas_1 LDecHuffAcCall01gas_1: lea LDecHuffAc02gas_1(%rip), %r8 jmp LDecHuffCheckLen00gas_1 LDecHuffDcCall01gas_1: lea LDecHuffDc01gas_1(%rip), %r8 jmp LDecHuffCheckLen00gas_1 LDecHuffLongCall00gas_1: lea LDecHuffLong01gas_1(%rip), %r8 jmp LDecHuffCheckLen00gas_1 LDecHuffInfill10gas_1: mov %r11, %rcx LDecHuffInfill11gas_1: cmp $(24), %ebp jg LDecHuffInfill13gas_1 movzbl (%rax), %edx add $(1), %rax cmp $(255), %edx jne LDecHuffInfill12gas_1 movzbl (%rax), %edx add $(1), %rax test $(255), %edx jnz LDecHuffExitEndOfWork00gas_1 mov $(255), %edx LDecHuffInfill12gas_1: shl $(8), %ecx or %edx, %ecx add $(8), %ebp jmp LDecHuffInfill11gas_1 LDecHuffInfill13gas_1: sub (%rsp), %rax mov %rax, %r12 mov %rcx, %r11 mov $(64), %ecx sub %ebp, %ecx shl %cl, %r11 mov %r11, %rcx shr $(56), %rcx jmp *%r8 LDecHuffDcLong00gas_1: lea LDecHuffDcRetLonggas_1(%rip), %r9 movq (112)(%rsp), %r15 jmp LDecHuffLong00gas_1 LDecHuffAcLong00gas_1: lea LDecHuffAcRetLonggas_1(%rip), %r9 movq (120)(%rsp), %r15 LDecHuffLong00gas_1: mov $(9), %ebx cmp $(16), %ebp jl LDecHuffLongCall00gas_1 LDecHuffLong01gas_1: lea (1572)(%r15), %rdx LDecHuffLong02gas_1: mov $(64), %ecx sub %ebx, %ecx mov %r11, %r10 movswl (%rdx,%rbx,2), %eax shr %cl, %r10 test $(32768), %eax jz LDecHuffLong03gas_1 cmp $(-1), %eax je LDecHuffLong03gas_1 movzwl (%rdx,%rbx,2), %eax LDecHuffLong03gas_1: cmp %eax, %r10d jle LDecHuffLong04gas_1 add $(1), %ebx cmp $(16), %ebx jg LDecHuffExitEndOfWork00gas_1 jmp LDecHuffLong02gas_1 LDecHuffLong04gas_1: mov %ebx, %ecx shl %cl, %r11 sub %ebx, %ebp lea (1536)(%r15), %rdx movzwl (%rdx,%rbx,2), %eax sub %eax, %r10d lea (1608)(%r15), %rdx movzwl (%rdx,%rbx,2), %eax add %eax, %r10d lea (%r15), %rdx movzwl (%rdx,%r10,2), %ebx jmp *%r9 LDecHuffInit01gas_1: mov $(16), %ebx sub %rax, %rbx add %r13, %rbx movq (128)(%rsp), %rax movdqu %xmm0, (%rdi) lea (8)(%rax), %rcx movdqa %xmm0, (%rbx) mov (%rcx), %ebp movd %xmm0, (8)(%rcx) lea (%rax), %rax movdqa %xmm0, (16)(%rbx) mov (%rax), %r11 mov $(64), %ecx movdqa %xmm0, (32)(%rbx) sub %ebp, %ecx movdqa %xmm0, (48)(%rbx) shl %cl, %r11 movdqa %xmm0, (64)(%rbx) mov (%rdx), %edx movdqa %xmm0, (80)(%rbx) mov %rdx, %r12 sub (8)(%rsp), %rdx movdqa %xmm0, (96)(%rbx) cmp $(-24), %rdx jg LDecHuffExitEndOfWork01gas_1 movswl (%r8), %eax movdqu %xmm0, (112)(%rdi) mov %eax, (32)(%rsp) lea ownTables(%rip), %rsi jmp LDecHuffInit00gas_1 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdecpredm7as.s000066400000000000000000000133231443134507600273510ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1 mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 mov %ecx, %ecx movzwl (%rdi), %eax add $(2), %rdi addw (%rsi), %ax mov %ax, (%rdx) add $(2), %rdx dec %ecx jz LExitReconstPred1_00gas_1 LLoopReconstPred1_00gas_1: sub $(9), %ecx jl LTailReconstPred1_00gas_1 LLoopReconstPred1_01gas_1: addw (%rdi), %ax add $(18), %rdi mov %ax, (%rdx) addw (-16)(%rdi), %ax mov %ax, (2)(%rdx) addw (-14)(%rdi), %ax mov %ax, (4)(%rdx) addw (-12)(%rdi), %ax mov %ax, (6)(%rdx) addw (-10)(%rdi), %ax mov %ax, (8)(%rdx) addw (-8)(%rdi), %ax mov %ax, (10)(%rdx) addw (-6)(%rdi), %ax mov %ax, (12)(%rdx) addw (-4)(%rdi), %ax mov %ax, (14)(%rdx) addw (-2)(%rdi), %ax mov %ax, (16)(%rdx) add $(18), %rdx sub $(9), %ecx jge LLoopReconstPred1_01gas_1 LTailReconstPred1_00gas_1: add $(9), %ecx jz LExitReconstPred1_00gas_1 LTailReconstPred1_01gas_1: addw (%rdi), %ax mov %ax, (%rdx) dec %ecx jz LExitReconstPred1_00gas_1 addw (2)(%rdi), %ax mov %ax, (2)(%rdx) dec %ecx jz LExitReconstPred1_00gas_1 addw (4)(%rdi), %ax mov %ax, (4)(%rdx) dec %ecx jz LExitReconstPred1_00gas_1 addw (6)(%rdi), %ax mov %ax, (6)(%rdx) add $(8), %rdi add $(8), %rdx dec %ecx jnz LTailReconstPred1_01gas_1 LExitReconstPred1_00gas_1: pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpj_ReconstructPredFirstRow_JPEG_16s_C1 mfxownpj_ReconstructPredFirstRow_JPEG_16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 mov %ecx, %ecx mov %edx, %edx mov %r8d, %r8d sub %r8d, %ecx dec %ecx mov $(1), %eax shl %cl, %eax addw (%rdi), %ax add $(2), %rdi mov %ax, (%rsi) add $(2), %rsi dec %edx jz LExitReconstPredFirst00gas_2 LLoopReconstPredFirst00gas_2: sub $(9), %edx jl LTailReconstPredFirst00gas_2 LLoopReconstPredFirst01gas_2: addw (%rdi), %ax add $(18), %rdi mov %ax, (%rsi) addw (-16)(%rdi), %ax mov %ax, (2)(%rsi) addw (-14)(%rdi), %ax mov %ax, (4)(%rsi) addw (-12)(%rdi), %ax mov %ax, (6)(%rsi) addw (-10)(%rdi), %ax mov %ax, (8)(%rsi) addw (-8)(%rdi), %ax mov %ax, (10)(%rsi) addw (-6)(%rdi), %ax mov %ax, (12)(%rsi) addw (-4)(%rdi), %ax mov %ax, (14)(%rsi) addw (-2)(%rdi), %ax mov %ax, (16)(%rsi) add $(18), %rsi sub $(9), %edx jge LLoopReconstPredFirst01gas_2 LTailReconstPredFirst00gas_2: add $(9), %edx jz LExitReconstPredFirst00gas_2 LTailReconstPredFirst01gas_2: addw (%rdi), %ax mov %ax, (%rsi) dec %edx jz LExitReconstPredFirst00gas_2 addw (2)(%rdi), %ax mov %ax, (2)(%rsi) dec %edx jz LExitReconstPredFirst00gas_2 addw (4)(%rdi), %ax mov %ax, (4)(%rsi) dec %edx jz LExitReconstPredFirst00gas_2 addw (6)(%rdi), %ax mov %ax, (6)(%rsi) add $(8), %rdi add $(8), %rsi dec %edx jnz LTailReconstPredFirst01gas_2 LExitReconstPredFirst00gas_2: pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdecqntm7as.s000066400000000000000000000313531443134507600272240ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownpj_QuantInv_8x8_16s mfxownpj_QuantInv_8x8_16s: test $(15), %rdx jnz LNAgas_1 test $(15), %rdi jnz LNA1gas_1 test $(15), %rsi jnz LNA2gas_1 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm1 movdqa (32)(%rdi), %xmm2 movdqa (48)(%rdi), %xmm3 movdqa (64)(%rdi), %xmm4 movdqa (80)(%rdi), %xmm5 movdqa (96)(%rdi), %xmm6 movdqa (112)(%rdi), %xmm7 pmullw (%rdx), %xmm0 pmullw (16)(%rdx), %xmm1 pmullw (32)(%rdx), %xmm2 pmullw (48)(%rdx), %xmm3 pmullw (64)(%rdx), %xmm4 pmullw (80)(%rdx), %xmm5 pmullw (96)(%rdx), %xmm6 pmullw (112)(%rdx), %xmm7 movdqa %xmm0, (%rsi) movdqa %xmm1, (16)(%rsi) movdqa %xmm2, (32)(%rsi) movdqa %xmm3, (48)(%rsi) movdqa %xmm4, (64)(%rsi) movdqa %xmm5, (80)(%rsi) movdqa %xmm6, (96)(%rsi) movdqa %xmm7, (112)(%rsi) jmp Lexitgas_1 LNA1gas_1: test $(15), %rsi jnz LNA3gas_1 movdqu (%rdi), %xmm0 movdqu (16)(%rdi), %xmm1 movdqu (32)(%rdi), %xmm2 movdqu (48)(%rdi), %xmm3 movdqu (64)(%rdi), %xmm4 movdqu (80)(%rdi), %xmm5 movdqu (96)(%rdi), %xmm6 movdqu (112)(%rdi), %xmm7 pmullw (%rdx), %xmm0 pmullw (16)(%rdx), %xmm1 pmullw (32)(%rdx), %xmm2 pmullw (48)(%rdx), %xmm3 pmullw (64)(%rdx), %xmm4 pmullw (80)(%rdx), %xmm5 pmullw (96)(%rdx), %xmm6 pmullw (112)(%rdx), %xmm7 movdqa %xmm0, (%rsi) movdqa %xmm1, (16)(%rsi) movdqa %xmm2, (32)(%rsi) movdqa %xmm3, (48)(%rsi) movdqa %xmm4, (64)(%rsi) movdqa %xmm5, (80)(%rsi) movdqa %xmm6, (96)(%rsi) movdqa %xmm7, (112)(%rsi) jmp Lexitgas_1 LNA2gas_1: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm1 movdqa (32)(%rdi), %xmm2 movdqa (48)(%rdi), %xmm3 movdqa (64)(%rdi), %xmm4 movdqa (80)(%rdi), %xmm5 movdqa (96)(%rdi), %xmm6 movdqa (112)(%rdi), %xmm7 pmullw (%rdx), %xmm0 pmullw (16)(%rdx), %xmm1 pmullw (32)(%rdx), %xmm2 pmullw (48)(%rdx), %xmm3 pmullw (64)(%rdx), %xmm4 pmullw (80)(%rdx), %xmm5 pmullw (96)(%rdx), %xmm6 pmullw (112)(%rdx), %xmm7 movdqu %xmm0, (%rsi) movdqu %xmm1, (16)(%rsi) movdqu %xmm2, (32)(%rsi) movdqu %xmm3, (48)(%rsi) movdqu %xmm4, (64)(%rsi) movdqu %xmm5, (80)(%rsi) movdqu %xmm6, (96)(%rsi) movdqu %xmm7, (112)(%rsi) jmp Lexitgas_1 LNA3gas_1: movdqu (%rdi), %xmm0 movdqu (16)(%rdi), %xmm1 movdqu (32)(%rdi), %xmm2 movdqu (48)(%rdi), %xmm3 movdqu (64)(%rdi), %xmm4 movdqu (80)(%rdi), %xmm5 movdqu (96)(%rdi), %xmm6 movdqu (112)(%rdi), %xmm7 pmullw (%rdx), %xmm0 pmullw (16)(%rdx), %xmm1 pmullw (32)(%rdx), %xmm2 pmullw (48)(%rdx), %xmm3 pmullw (64)(%rdx), %xmm4 pmullw (80)(%rdx), %xmm5 pmullw (96)(%rdx), %xmm6 pmullw (112)(%rdx), %xmm7 movdqu %xmm0, (%rsi) movdqu %xmm1, (16)(%rsi) movdqu %xmm2, (32)(%rsi) movdqu %xmm3, (48)(%rsi) movdqu %xmm4, (64)(%rsi) movdqu %xmm5, (80)(%rsi) movdqu %xmm6, (96)(%rsi) movdqu %xmm7, (112)(%rsi) jmp Lexitgas_1 LNAgas_1: test $(15), %rdi jnz LNA1ngas_1 test $(15), %rsi jnz LNA2ngas_1 movdqu (%rdx), %xmm0 movdqu (16)(%rdx), %xmm1 movdqu (32)(%rdx), %xmm2 movdqu (48)(%rdx), %xmm3 movdqu (64)(%rdx), %xmm4 movdqu (80)(%rdx), %xmm5 movdqu (96)(%rdx), %xmm6 movdqu (112)(%rdx), %xmm7 pmullw (%rdi), %xmm0 pmullw (16)(%rdi), %xmm1 pmullw (32)(%rdi), %xmm2 pmullw (48)(%rdi), %xmm3 pmullw (64)(%rdi), %xmm4 pmullw (80)(%rdi), %xmm5 pmullw (96)(%rdi), %xmm6 pmullw (112)(%rdi), %xmm7 movdqa %xmm0, (%rsi) movdqa %xmm1, (16)(%rsi) movdqa %xmm2, (32)(%rsi) movdqa %xmm3, (48)(%rsi) movdqa %xmm4, (64)(%rsi) movdqa %xmm5, (80)(%rsi) movdqa %xmm6, (96)(%rsi) movdqa %xmm7, (112)(%rsi) jmp Lexitgas_1 LNA1ngas_1: test $(15), %rsi jnz LNA2ngas_1 movdqu (%rdi), %xmm0 movdqu (16)(%rdi), %xmm1 movdqu (32)(%rdi), %xmm2 movdqu (48)(%rdi), %xmm3 movdqu (64)(%rdi), %xmm4 movdqu (80)(%rdi), %xmm5 movdqu (96)(%rdi), %xmm6 movdqu (112)(%rdi), %xmm7 movdqu (%rdx), %xmm8 movdqu (16)(%rdx), %xmm9 movdqu (32)(%rdx), %xmm10 movdqu (48)(%rdx), %xmm11 movdqu (64)(%rdx), %xmm12 movdqu (80)(%rdx), %xmm13 movdqu (96)(%rdx), %xmm14 movdqu (112)(%rdx), %xmm15 pmullw %xmm8, %xmm0 pmullw %xmm9, %xmm1 pmullw %xmm10, %xmm2 pmullw %xmm11, %xmm3 pmullw %xmm12, %xmm4 pmullw %xmm13, %xmm5 pmullw %xmm14, %xmm6 pmullw %xmm15, %xmm7 movdqa %xmm0, (%rsi) movdqa %xmm1, (16)(%rsi) movdqa %xmm2, (32)(%rsi) movdqa %xmm3, (48)(%rsi) movdqa %xmm4, (64)(%rsi) movdqa %xmm5, (80)(%rsi) movdqa %xmm6, (96)(%rsi) movdqa %xmm7, (112)(%rsi) jmp Lexitgas_1 LNA2ngas_1: movdqu (%rdx), %xmm0 movdqu (16)(%rdx), %xmm1 movdqu (32)(%rdx), %xmm2 movdqu (48)(%rdx), %xmm3 movdqu (64)(%rdx), %xmm4 movdqu (80)(%rdx), %xmm5 movdqu (96)(%rdx), %xmm6 movdqu (112)(%rdx), %xmm7 pmullw (%rdi), %xmm0 pmullw (16)(%rdi), %xmm1 pmullw (32)(%rdi), %xmm2 pmullw (48)(%rdi), %xmm3 pmullw (64)(%rdi), %xmm4 pmullw (80)(%rdi), %xmm5 pmullw (96)(%rdi), %xmm6 pmullw (112)(%rdi), %xmm7 movdqu %xmm0, (%rsi) movdqu %xmm1, (16)(%rsi) movdqu %xmm2, (32)(%rsi) movdqu %xmm3, (48)(%rsi) movdqu %xmm4, (64)(%rsi) movdqu %xmm5, (80)(%rsi) movdqu %xmm6, (96)(%rsi) movdqu %xmm7, (112)(%rsi) Lexitgas_1: ret .p2align 4, 0x90 .globl mfxownpj_QuantInv_8x8_16s_I mfxownpj_QuantInv_8x8_16s_I: push %rbx test $(15), %rdi jz Lalign_pSrcDstgas_2 mov %rdi, %rbx shr $(1), %rbx mov %rbx, %rcx neg %rbx and $(7), %rcx and $(7), %rbx Lnext_prgas_2: movzwq (%rdi), %rax movzwq (%rsi), %rdx add $(2), %rsi imul %rdx, %rax movw %ax, (%rdi) add $(2), %rdi sub $(1), %rbx jnz Lnext_prgas_2 test $(15), %rsi jz Lunalign_pSrcDst_align_pQTblgas_2 movdqu (%rsi), %xmm0 movdqu (16)(%rsi), %xmm2 movdqu (32)(%rsi), %xmm3 movdqu (48)(%rsi), %xmm4 movdqa (%rdi), %xmm6 pmullw %xmm0, %xmm6 movdqa (16)(%rdi), %xmm7 movdqa (32)(%rdi), %xmm1 movdqa (48)(%rdi), %xmm5 movdqa %xmm6, (%rdi) pmullw %xmm2, %xmm7 movdqa %xmm7, (16)(%rdi) pmullw %xmm3, %xmm1 movdqa (64)(%rdi), %xmm3 pmullw %xmm4, %xmm5 movdqa (80)(%rdi), %xmm4 movdqa %xmm1, (32)(%rdi) movdqa %xmm5, (48)(%rdi) movdqu (64)(%rsi), %xmm0 pmullw %xmm0, %xmm3 movdqu (80)(%rsi), %xmm1 pmullw %xmm1, %xmm4 movdqu (96)(%rsi), %xmm2 movdqa (96)(%rdi), %xmm5 pmullw %xmm2, %xmm5 movdqa %xmm3, (64)(%rdi) movdqa %xmm4, (80)(%rdi) movdqa %xmm5, (96)(%rdi) Lnext_ep0gas_2: movzwq (112)(%rdi), %rax movzwq (112)(%rsi), %rdx add $(2), %rsi imul %rdx, %rax movw %ax, (112)(%rdi) add $(2), %rdi sub $(1), %rcx jnz Lnext_ep0gas_2 jmp Lexitgas_2 Lunalign_pSrcDst_align_pQTblgas_2: movdqa (%rdi), %xmm0 pmullw (%rsi), %xmm0 movdqa (16)(%rdi), %xmm1 pmullw (16)(%rsi), %xmm1 movdqa (32)(%rdi), %xmm2 pmullw (32)(%rsi), %xmm2 movdqa (48)(%rdi), %xmm3 pmullw (48)(%rsi), %xmm3 movdqa (64)(%rdi), %xmm4 pmullw (64)(%rsi), %xmm4 movdqa (80)(%rdi), %xmm6 pmullw (80)(%rsi), %xmm6 movdqa (96)(%rdi), %xmm7 pmullw (96)(%rsi), %xmm7 movdqa %xmm0, (%rdi) movdqa %xmm1, (16)(%rdi) movdqa %xmm2, (32)(%rdi) movdqa %xmm3, (48)(%rdi) movdqa %xmm4, (64)(%rdi) movdqa %xmm6, (80)(%rdi) movdqa %xmm7, (96)(%rdi) Lnext_ep1gas_2: movzwq (112)(%rdi), %rax movzwq (112)(%rsi), %rdx add $(2), %rsi imul %rdx, %rax movw %ax, (112)(%rdi) add $(2), %rdi sub $(1), %rcx jnz Lnext_ep1gas_2 jmp Lexitgas_2 Lalign_pSrcDstgas_2: test $(15), %rsi jz Lalign_pSrcDst_align_pQTblgas_2 movdqu (%rsi), %xmm6 movdqa (%rdi), %xmm2 movdqu (16)(%rsi), %xmm7 movdqu (32)(%rsi), %xmm0 movdqu (48)(%rsi), %xmm1 pmullw %xmm6, %xmm2 movdqa (16)(%rdi), %xmm3 movdqa (32)(%rdi), %xmm4 movdqa (48)(%rdi), %xmm5 movdqa (96)(%rdi), %xmm6 pmullw %xmm7, %xmm3 movdqa (112)(%rdi), %xmm7 movdqa %xmm2, (%rdi) movdqa %xmm3, (16)(%rdi) pmullw %xmm0, %xmm4 pmullw %xmm1, %xmm5 movdqa %xmm4, (32)(%rdi) movdqa (64)(%rdi), %xmm4 movdqa %xmm5, (48)(%rdi) movdqu (64)(%rsi), %xmm0 pmullw %xmm0, %xmm4 movdqu (80)(%rsi), %xmm1 movdqu (96)(%rsi), %xmm2 pmullw %xmm2, %xmm6 movdqu (112)(%rsi), %xmm3 movdqa (80)(%rdi), %xmm5 pmullw %xmm1, %xmm5 movdqa %xmm4, (64)(%rdi) movdqa %xmm6, (96)(%rdi) pmullw %xmm3, %xmm7 movdqa %xmm5, (80)(%rdi) movdqa %xmm7, (112)(%rdi) jmp Lexitgas_2 Lalign_pSrcDst_align_pQTblgas_2: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm6 pmullw (%rsi), %xmm0 pmullw (16)(%rsi), %xmm6 movdqa (32)(%rdi), %xmm7 movdqa (48)(%rdi), %xmm1 pmullw (32)(%rsi), %xmm7 pmullw (48)(%rsi), %xmm1 movdqa (64)(%rdi), %xmm2 movdqa (80)(%rdi), %xmm3 pmullw (64)(%rsi), %xmm2 pmullw (80)(%rsi), %xmm3 movdqa (96)(%rdi), %xmm4 movdqa (112)(%rdi), %xmm5 pmullw (96)(%rsi), %xmm4 pmullw (112)(%rsi), %xmm5 movdqa %xmm0, (%rdi) movdqa %xmm6, (16)(%rdi) movdqa %xmm7, (32)(%rdi) movdqa %xmm1, (48)(%rdi) movdqa %xmm2, (64)(%rdi) movdqa %xmm3, (80)(%rdi) movdqa %xmm4, (96)(%rdi) movdqa %xmm5, (112)(%rdi) Lexitgas_2: pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjdecssu8as.s000066400000000000000000000310341443134507600270540ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 CONST_3: .quad 0x3000300030003, 0x3000300030003 CONST_21: .quad 0x2000100020001, 0x2000100020001 CONST_78: .quad 0x7000800070008, 0x7000800070008 CONST_3_1: .quad 0x103010301030103, 0x103010301030103 MASK_V1_0: .byte 2, 3, 2, 3, 4, 5, 4, 5, 10, 11, 10, 11, 12, 13, 12, 13 MASK_V1_1: .byte 0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15 MASK_V2_0: .byte 1, 0, 1, 2, 2, 1, 2, 3, 3, 2, 3, 4, 4, 3, 4, 5 MASK_V2_1: .byte 5, 4, 5, 6, 6, 5, 6, 7, 7, 6, 7, 8, 8, 7, 8, 9 .text .p2align 4, 0x90 .globl mfxownpj_SampleUpRowH2V1_Triangle_JPEG_8u_C1 mfxownpj_SampleUpRowH2V1_Triangle_JPEG_8u_C1: push %rbp push %rbx mov %esi, %esi movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx movb %al, (%rdx) lea (2)(%rax,%rax,2), %rax add %rbx, %rax sar $(2), %rax movb %al, (1)(%rdx) add $(2), %rdx sub $(2), %rsi jz Lexitgas_3 cmp $(32), %esi jl LL1gas_3 mov %rdx, %rbp and $(15), %rbp jz LRungas_3 sub $(16), %rbp neg %rbp test $(1), %rbp jne LNAgas_3 sar $(1), %rbp cmp %rbp, %rsi jle LRungas_3 sub %rbp, %rsi LL1ngas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx movzbq (2)(%rdi), %r8 lea (%rbx,%rbx,2), %rbx lea (1)(%rbx,%rax), %rax lea (2)(%r8,%rbx), %r8 sar $(2), %rax sar $(2), %r8 movb %al, (%rdx) movb %r8b, (1)(%rdx) add $(1), %rdi add $(2), %rdx sub $(1), %rbp jnz LL1ngas_3 LRungas_3: sub $(16), %rsi jl LL8gas_3 LL16gas_3: movq (%rdi), %xmm0 movq (8)(%rdi), %xmm2 punpcklqdq %xmm2, %xmm0 pinsrw $(4), (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 pshufb MASK_V2_0(%rip), %xmm0 pshufb MASK_V2_1(%rip), %xmm1 pshufb MASK_V2_0(%rip), %xmm2 pshufb MASK_V2_1(%rip), %xmm3 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 pmaddubsw CONST_3_1(%rip), %xmm2 pmaddubsw CONST_3_1(%rip), %xmm3 paddw CONST_21(%rip), %xmm0 paddw CONST_21(%rip), %xmm1 paddw CONST_21(%rip), %xmm2 paddw CONST_21(%rip), %xmm3 psrlw $(2), %xmm0 psrlw $(2), %xmm1 psrlw $(2), %xmm2 psrlw $(2), %xmm3 packuswb %xmm1, %xmm0 packuswb %xmm3, %xmm2 movdqa %xmm0, (%rdx) movdqa %xmm2, (16)(%rdx) add $(16), %rdi add $(32), %rdx sub $(16), %rsi jge LL16gas_3 LL8gas_3: add $(8), %rsi jl LL7gas_3 movq (%rdi), %xmm0 pinsrw $(4), (8)(%rdi), %xmm0 movdqa %xmm0, %xmm1 pshufb MASK_V2_0(%rip), %xmm0 pshufb MASK_V2_1(%rip), %xmm1 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 paddw CONST_21(%rip), %xmm0 paddw CONST_21(%rip), %xmm1 psrlw $(2), %xmm0 psrlw $(2), %xmm1 packuswb %xmm1, %xmm0 movdqa %xmm0, (%rdx) add $(8), %rdi add $(16), %rdx sub $(8), %rsi jmp LL7gas_3 LNAgas_3: sub $(16), %rsi jl LL8ngas_3 LL16ngas_3: movq (%rdi), %xmm0 movq (8)(%rdi), %xmm2 punpcklqdq %xmm2, %xmm0 pinsrw $(4), (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 pshufb MASK_V2_0(%rip), %xmm0 pshufb MASK_V2_1(%rip), %xmm1 pshufb MASK_V2_0(%rip), %xmm2 pshufb MASK_V2_1(%rip), %xmm3 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 pmaddubsw CONST_3_1(%rip), %xmm2 pmaddubsw CONST_3_1(%rip), %xmm3 paddw CONST_21(%rip), %xmm0 paddw CONST_21(%rip), %xmm1 paddw CONST_21(%rip), %xmm2 paddw CONST_21(%rip), %xmm3 psrlw $(2), %xmm0 psrlw $(2), %xmm1 psrlw $(2), %xmm2 psrlw $(2), %xmm3 packuswb %xmm1, %xmm0 packuswb %xmm3, %xmm2 movdqu %xmm0, (%rdx) movdqu %xmm2, (16)(%rdx) add $(16), %rdi add $(32), %rdx sub $(16), %rsi jge LL16ngas_3 LL8ngas_3: add $(8), %rsi jl LL7gas_3 movq (%rdi), %xmm0 pinsrw $(4), (8)(%rdi), %xmm0 movdqa %xmm0, %xmm1 pshufb MASK_V2_0(%rip), %xmm0 pshufb MASK_V2_1(%rip), %xmm1 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 paddw CONST_21(%rip), %xmm0 paddw CONST_21(%rip), %xmm1 psrlw $(2), %xmm0 psrlw $(2), %xmm1 packuswb %xmm1, %xmm0 movdqu %xmm0, (%rdx) add $(8), %rdi add $(16), %rdx sub $(8), %rsi LL7gas_3: add $(8), %rsi jle Lexitgas_3 LL1gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx movzbq (2)(%rdi), %r8 lea (%rbx,%rbx,2), %rbx lea (1)(%rbx,%rax), %rax lea (2)(%r8,%rbx), %r8 sar $(2), %rax sar $(2), %r8 movb %al, (%rdx) movb %r8b, (1)(%rdx) add $(1), %rdi add $(2), %rdx sub $(1), %rsi jnz LL1gas_3 Lexitgas_3: movzbq (1)(%rdi), %rax movzbq (%rdi), %rbx movb %al, (1)(%rdx) lea (1)(%rax,%rax,2), %rax add %rbx, %rax sar $(2), %rax movb %al, (%rdx) pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpj_SampleUpRowH2V2_Triangle_JPEG_8u_C1 mfxownpj_SampleUpRowH2V2_Triangle_JPEG_8u_C1: push %rbp push %rbx mov %edx, %edx movzbq (1)(%rdi), %rax movzbq (1)(%rsi), %rbx lea (%rax,%rax,2), %rax add %rax, %rbx movzbq (%rdi), %rax movzbq (%rsi), %r8 lea (%rax,%rax,2), %rax add %r8, %rax mov %rax, %r8 lea (7)(%rax,%rax,2), %rax lea (8)(,%r8,4), %r8 add %rbx, %rax sar $(4), %r8 sar $(4), %rax movb %r8b, (%rcx) movb %al, (1)(%rcx) add $(2), %rcx sub $(2), %rdx jz Lexitgas_4 mov %rcx, %rbp and $(15), %rbp jz LRungas_4 sub $(16), %rbp neg %rbp test $(1), %rbp jne LNAgas_4 sar $(1), %rbp cmp %rbp, %rdx jle LRungas_4 sub %rbp, %rdx LL1ngas_4: movzbq (2)(%rdi), %rax movzbq (2)(%rsi), %rbx lea (%rax,%rax,2), %rax add %rbx, %rax movzbq (1)(%rdi), %r8 movzbq (1)(%rsi), %rbx lea (%r8,%r8,2), %r8 add %rbx, %r8 lea (7)(%r8,%r8,2), %r8 add %r8, %rax sar $(4), %rax movb %al, (1)(%rcx) movzbq (%rdi), %rax movzbq (%rsi), %rbx lea (%rax,%rax,2), %rax add %rbx, %rax lea (1)(%r8,%rax), %rax sar $(4), %rax movb %al, (%rcx) add $(1), %rdi add $(1), %rsi add $(2), %rcx sub $(1), %rbp jnz LL1ngas_4 LRungas_4: sub $(8), %rdx jl LL7gas_4 LL8gas_4: movq (%rdi), %xmm0 movq (2)(%rdi), %xmm1 movq (%rsi), %xmm2 movq (2)(%rsi), %xmm3 punpcklbw %xmm2, %xmm0 punpcklbw %xmm3, %xmm1 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 movdqa %xmm0, %xmm2 movdqa %xmm1, %xmm3 pshufb MASK_V1_0(%rip), %xmm0 pshufb MASK_V1_0(%rip), %xmm1 pshufb MASK_V1_1(%rip), %xmm2 pshufb MASK_V1_1(%rip), %xmm3 pmullw CONST_3(%rip), %xmm0 pmullw CONST_3(%rip), %xmm1 paddw %xmm2, %xmm0 paddw %xmm3, %xmm1 movdqa %xmm0, %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 paddw CONST_78(%rip), %xmm0 paddw CONST_78(%rip), %xmm2 psrlw $(4), %xmm0 psrlw $(4), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rcx) add $(8), %rdi add $(8), %rsi add $(16), %rcx sub $(8), %rdx jge LL8gas_4 jmp LL7gas_4 LNAgas_4: sub $(8), %rdx jl LL7gas_4 LL8ngas_4: movq (%rdi), %xmm0 movq (2)(%rdi), %xmm1 movq (%rsi), %xmm2 movq (2)(%rsi), %xmm3 punpcklbw %xmm2, %xmm0 punpcklbw %xmm3, %xmm1 pmaddubsw CONST_3_1(%rip), %xmm0 pmaddubsw CONST_3_1(%rip), %xmm1 movdqa %xmm0, %xmm2 movdqa %xmm1, %xmm3 pshufb MASK_V1_0(%rip), %xmm0 pshufb MASK_V1_0(%rip), %xmm1 pshufb MASK_V1_1(%rip), %xmm2 pshufb MASK_V1_1(%rip), %xmm3 pmullw CONST_3(%rip), %xmm0 pmullw CONST_3(%rip), %xmm1 paddw %xmm2, %xmm0 paddw %xmm3, %xmm1 movdqa %xmm0, %xmm2 punpcklqdq %xmm1, %xmm0 punpckhqdq %xmm1, %xmm2 paddw CONST_78(%rip), %xmm0 paddw CONST_78(%rip), %xmm2 psrlw $(4), %xmm0 psrlw $(4), %xmm2 packuswb %xmm2, %xmm0 movdqu %xmm0, (%rcx) add $(8), %rdi add $(8), %rsi add $(16), %rcx sub $(8), %rdx jge LL8ngas_4 LL7gas_4: add $(8), %rdx jle Lexitgas_4 LL1gas_4: movzbq (2)(%rdi), %rax movzbq (2)(%rsi), %rbx lea (%rax,%rax,2), %rax add %rbx, %rax movzbq (1)(%rdi), %r8 movzbq (1)(%rsi), %rbx lea (%r8,%r8,2), %r8 add %rbx, %r8 lea (7)(%r8,%r8,2), %r8 add %r8, %rax sar $(4), %rax movb %al, (1)(%rcx) movzbq (%rdi), %rax movzbq (%rsi), %rbx lea (%rax,%rax,2), %rax add %rbx, %rax lea (1)(%r8,%rax), %rax sar $(4), %rax movb %al, (%rcx) add $(1), %rdi add $(1), %rsi add $(2), %rcx sub $(1), %rdx jnz LL1gas_4 Lexitgas_4: movzbq (1)(%rdi), %rax movzbq (1)(%rsi), %rbx lea (%rax,%rax,2), %rax add %rbx, %rax mov %rax, %r8 movzbq (%rdi), %rbx movzbq (%rsi), %rdx lea (%rax,%rax,2), %rax lea (%rbx,%rbx,2), %rbx lea (7)(,%r8,4), %r8 add %rdx, %rbx sar $(4), %r8 lea (8)(%rbx,%rax), %rax sar $(4), %rax movb %r8b, (1)(%rcx) movb %al, (%rcx) pop %rbx pop %rbp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjenchuffm7as.s000066400000000000000000000334761443134507600273740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownpj_EncodeHuffman8x8_JPEG_16s1u_C1 mfxownpj_EncodeHuffman8x8_JPEG_16s1u_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(72), %rsp mov %rdi, (%rsp) mov %rdx, %rax mov %eax, %eax mov %rax, (8)(%rsp) mov %rcx, (16)(%rsp) mov %r8, (24)(%rsp) mov %r9, (40)(%rsp) mov %rsi, %r8 movq (136)(%rsp), %rax mov $(64), %ebp lea (8)(%rax), %rdx mov $(24), %ecx sub (%rdx), %ebp sub (%rdx), %ecx lea (%rax), %rax mov (%rax), %r11 mov (16)(%rsp), %rax shr %cl, %r11 mov (%rax), %eax lea ownTables(%rip), %rsi mov %rax, %r12 sub (8)(%rsp), %eax cmp $(-24), %eax jg LEncHuffExitEndOfWork01gas_1 mov (24)(%rsp), %rax mov (%rsp), %rdx movswl (%rax), %ecx movswl (%rdx), %edx mov %ecx, (32)(%rsp) mov %dx, (%rax) sub %ecx, %edx xor %ecx, %ecx mov %edx, %ebx neg %edx setg %cl cmovl %ebx, %edx sub %ecx, %ebx mov $(32), %ecx cmp $(256), %edx jge LEncHuffDcLong00gas_1 movzbl (64)(%rsi,%rdx), %edx LEncHuffDc00gas_1: sub %edx, %ecx shl %cl, %ebx shr %cl, %ebx mov (40)(%rsp), %rcx mov %ebx, %r14d lea (%rcx), %rbx mov (%rbx,%rdx,4), %ecx mov %ecx, %r15d shr $(16), %ecx jz LEncHuffExitEndOfWork00gas_1 and mask0F(%rip), %r15 sub %ecx, %ebp sub %edx, %ebp shl %cl, %r11 mov %edx, %ecx or %r15, %r11 shl %cl, %r11 or %r14, %r11 movq (128)(%rsp), %r9 lea (%r9), %r9 xor %edx, %edx mov (%rsp), %rbx mov $(63), %edi or (124)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (108)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(1), %edi or (92)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (120)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (104)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (76)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(1), %edi or (60)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (88)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (116)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (100)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (72)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (44)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(1), %edi or (28)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (56)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (84)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (112)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (96)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (68)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (40)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (12)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (24)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (52)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (80)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(3), %edi or (64)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (36)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (8)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (20)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (48)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(3), %edi or (32)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (4)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi or (16)(%rbx), %edx jnz LEncHuffAcZeros00gas_1 sub $(2), %edi LEncHuffAcZeros00gas_1: xor %edx, %edx movzbl (%rdi,%rsi), %ecx LEncHuffAcZeros01gas_1: orw (%rbx,%rcx,2), %dx jnz LEncHuffAcZeros02gas_1 movzbl (-1)(%rdi,%rsi), %ecx sub $(1), %edi jg LEncHuffAcZeros01gas_1 LEncHuffAcZeros02gas_1: add $(1), %edi mov $(63), %eax cmp $(63), %edi cmovg %eax, %edi mov %edi, (56)(%rsp) mov $(1), %edi xor %r13d, %r13d movzbl (%rdi,%rsi), %ecx LEncHuffAc00gas_1: movswl (%rbx,%rcx,2), %edx movzbl (1)(%rdi,%rsi), %ecx test %edx, %edx jnz LEncHuffAc01gas_1 mov (56)(%rsp), %edx add $(16), %r13d add $(1), %edi cmp %edx, %edi jle LEncHuffAc00gas_1 jmp LEncHuffAc10gas_1 LEncHuffAc01gas_1: cmp $(256), %r13d jge LEncHuffAc20gas_1 LEncHuffAc02gas_1: xor %ecx, %ecx mov %edx, %ebx neg %edx setg %cl cmovl %ebx, %edx sub %ecx, %ebx mov $(32), %ecx cmp $(256), %edx jge LEncHuffAcLong00gas_1 movzbl (64)(%rsi,%rdx), %edx LEncHuffAc03gas_1: sub %edx, %ecx shl %cl, %ebx or %edx, %r13d shr %cl, %ebx mov %ebx, %r14d mov (%r9,%r13,4), %ebx mov %ebx, %r15d shr $(16), %ebx jz LEncHuffExitEndOfWork00gas_1 and mask0F(%rip), %r15 cmp %ebx, %ebp jl LEncHuffCallWrite00gas_1 LEncHuffRetWrite00gas_1: mov %ebx, %ecx sub %ebx, %ebp mov (%rsp), %rbx shl %cl, %r11 or %r15, %r11 cmp %edx, %ebp jl LEncHuffCallWrite01gas_1 LEncHuffRetWrite01gas_1: mov %edx, %ecx add $(1), %edi shl %cl, %r11 or %r14, %r11 sub %edx, %ebp mov (56)(%rsp), %edx xor %r13d, %r13d movzbl (%rdi,%rsi), %ecx cmp %edx, %edi jle LEncHuffAc00gas_1 jmp LEncHuffExitNormgas_1 LEncHuffAc10gas_1: mov (%r9), %ebx mov %ebx, %r15d shr $(16), %ebx jz LEncHuffExitEndOfWork00gas_1 and mask0F(%rip), %r15 cmp %ebx, %ebp jl LEncHuffCallWrite03gas_1 LEncHuffRetWrite03gas_1: mov %ebx, %ecx sub %ebx, %ebp shl %cl, %r11 or %r15, %r11 jmp LEncHuffExitNormgas_1 LEncHuffAc20gas_1: mov (960)(%r9), %ebx mov %ebx, %r15d shr $(16), %ebx jz LEncHuffExitEndOfWork00gas_1 and mask0F(%rip), %r15 cmp %ebx, %ebp jl LEncHuffCallWrite02gas_1 LEncHuffRetWrite02gas_1: mov %ebx, %ecx sub %ebx, %ebp shl %cl, %r11 or %r15, %r11 sub $(256), %r13d cmp $(256), %r13d jge LEncHuffAc20gas_1 jmp LEncHuffAc02gas_1 LEncHuffCallWrite04gas_1: lea LEncHuffRetWrite04gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LEncHuffWrite00gas_1 LEncHuffCallWrite03gas_1: lea LEncHuffRetWrite03gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LEncHuffWrite00gas_1 LEncHuffCallWrite02gas_1: lea LEncHuffRetWrite02gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LEncHuffWrite00gas_1 LEncHuffCallWrite01gas_1: lea LEncHuffRetWrite01gas_1(%rip), %rax mov %rax, (48)(%rsp) jmp LEncHuffWrite00gas_1 LEncHuffCallWrite00gas_1: lea LEncHuffRetWrite00gas_1(%rip), %rax mov %rax, (48)(%rsp) LEncHuffWrite00gas_1: mov %ebp, %ecx sub $(64), %ebp neg %ebp mov %r11, %r10 shl %cl, %r10 movd %r10, %xmm1 bswap %r10 mov %r12d, %eax mov %r12d, %ecx subl (8)(%rsp), %eax cmp $(-8), %eax jg LEncHuffExitEndOfWork00gas_1 cmp $(32), %ebp jl LEncHuffWrite11gas_1 pcmpeqb maskFF(%rip), %xmm1 movd %xmm1, %rax test %rax, %rax jnz LEncHuffWrite10gas_1 mov %r10, (%r8,%rcx) mov %ebp, %eax and $(7), %ebp and $(4294967288), %eax sub $(64), %ebp shr $(3), %eax add %eax, %r12d mov (48)(%rsp), %rax neg %ebp jmp *%rax LEncHuffWrite10gas_1: sub (8)(%rsp), %ecx cmp $(-16), %ecx mov %r12d, %ecx jg LEncHuffExitEndOfWork00gas_1 LEncHuffWrite11gas_1: sub $(8), %ebp jl LEncHuffWrite12gas_1 mov %r10b, %al shr $(8), %r10 mov %al, (%r8,%rcx) add $(1), %ecx cmp $(255), %al jne LEncHuffWrite11gas_1 xor %eax, %eax mov %al, (%r8,%rcx) add $(1), %ecx jmp LEncHuffWrite11gas_1 LEncHuffWrite12gas_1: sub $(56), %ebp mov %rcx, %r12 neg %ebp mov (48)(%rsp), %rax jmp *%rax LEncHuffExitEndOfWork00gas_1: mov (24)(%rsp), %rax mov (32)(%rsp), %ecx mov %cx, (%rax) LEncHuffExitEndOfWork01gas_1: mov $(1), %eax jmp LEncHuffExit00gas_1 LEncHuffExitNormgas_1: cmp $(56), %ebp jle LEncHuffCallWrite04gas_1 LEncHuffRetWrite04gas_1: mov (16)(%rsp), %rax mov %r12d, (%rax) mov %ebp, %ecx sub $(64), %ebp shl %cl, %r11 neg %ebp shr $(40), %r11 movq (136)(%rsp), %rax lea (8)(%rax), %rcx mov %ebp, (%rcx) lea (%rax), %rax mov %r11d, (%rax) mov $(0), %eax LEncHuffExit00gas_1: add $(72), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LEncHuffDcLong00gas_1: shr $(8), %edx movzbl (64)(%rsi,%rdx), %edx add $(8), %edx jmp LEncHuffDc00gas_1 LEncHuffAcLong00gas_1: shr $(8), %edx movzbl (64)(%rsi,%rdx), %edx add $(8), %edx jmp LEncHuffAc03gas_1 .data .p2align 4, 0x90 maskFF: .quad 0xffffffffffffffff, 0xffffffffffffffff mask0F: .quad 0xffff ownTables: .byte 0, 1, 8, 16, 9, 2, 3, 10 .byte 17, 24, 32, 25, 18, 11, 4, 5 .byte 12, 19, 26, 33, 40, 48, 41, 34 .byte 27, 20, 13, 6, 7, 14, 21, 28 .byte 35, 42, 49, 56, 57, 50, 43, 36 .byte 29, 22, 15, 23, 30, 37, 44, 51 .byte 58, 59, 52, 45, 38, 31, 39, 46 .byte 53, 60, 61, 54, 47, 55, 62, 63 .byte 0, 1, 2, 2, 3, 3, 3, 3 .fill 8, 1, 4 .fill 16, 1, 5 .fill 32, 1, 6 .fill 64, 1, 7 .fill 128, 1, 8 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjenchuffpm7as.s000066400000000000000000001506561443134507600275540ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownpj_EncodeHuffman8x8_ACFlush_JPEG_16s1u_C1 mfxownpj_EncodeHuffman8x8_ACFlush_JPEG_16s1u_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(104), %rsp mov %rdi, (48)(%rsp) mov %esi, %esi mov %rsi, (56)(%rsp) mov %rdx, (64)(%rsp) mov %rcx, (72)(%rsp) mov %r8, (80)(%rsp) mov $(0), %ebx mov %rbx, (8)(%rsp) mov (64)(%rsp), %rbx mov (%rbx), %ebx mov %rbx, (%rsp) mov (80)(%rsp), %rcx lea (8)(%rcx), %rbx mov $(64), %ebp sub (%rbx), %ebp lea (%rcx), %rbx movq (%rbx), %mm0 lea (12)(%rcx), %rcx mov (%rcx), %ecx mov %ecx, (24)(%rsp) mov (72)(%rsp), %rbx lea (%rbx), %rbx mov %rbx, (16)(%rsp) mov (24)(%rsp), %ebx test %ebx, %ebx jz LAppendFlushEncAc00gas_1 cmp $(1), %ebx jne LEobEncFlushAc03gas_1 xor %ebx, %ebx lea LEobEncFlushAc12gas_1(%rip), %rsi jmp LHuffEobEncFlushAc00gas_1 LEobEncFlushAc03gas_1: cmp $(32767), %ebx jle LEobEncFlushAc06gas_1 mov $(224), %ebx lea LEobEncFlushAc04gas_1(%rip), %rsi jmp LHuffEobEncFlushAc00gas_1 LEobEncFlushAc04gas_1: cmp $(14), %ebp jge LEobEncFlushAc05gas_1 lea LEobEncFlushAc05gas_1(%rip), %rbx mov %rbx, (32)(%rsp) jmp LWriteEncFlushAc00gas_1 LEobEncFlushAc05gas_1: mov $(32767), %esi mov (24)(%rsp), %ebx psllq $(14), %mm0 and $(16383), %ebx sub %esi, (24)(%rsp) movd %ebx, %mm1 sub $(14), %ebp por %mm1, %mm0 mov (24)(%rsp), %ebx LEobEncFlushAc06gas_1: lea eobSize(%rip), %rsi cmp $(256), %ebx jl LEobEncFlushAc07gas_1 shr $(8), %ebx movzbl (%rsi,%rbx), %ebx add $(8), %ebx jmp LEobEncFlushAc08gas_1 LEobEncFlushAc07gas_1: movzbl (%rsi,%rbx), %ebx LEobEncFlushAc08gas_1: cmp $(14), %ebx jg LErrorEncFlushAc00gas_1 movd %ebx, %mm5 shl $(4), %ebx lea LEobEncFlushAc09gas_1(%rip), %rsi jmp LHuffEobEncFlushAc00gas_1 LEobEncFlushAc09gas_1: movd %mm5, %esi cmp %esi, %ebp jge LEobEncFlushAc11gas_1 lea LEobEncFlushAc11gas_1(%rip), %rbx mov %rbx, (32)(%rsp) jmp LWriteEncFlushAc00gas_1 LEobEncFlushAc11gas_1: movd %esi, %mm1 mov $(32), %ecx sub %esi, %ecx mov (24)(%rsp), %ebx shl %cl, %ebx shr %cl, %ebx psllq %mm1, %mm0 movd %ebx, %mm1 sub %esi, %ebp por %mm1, %mm0 LEobEncFlushAc12gas_1: xor %esi, %esi mov %esi, (24)(%rsp) jmp LAppendFlushEncAc00gas_1 LHuffEobEncFlushAc00gas_1: mov (16)(%rsp), %rax movd (%rax,%rbx,4), %mm7 movd (%rax,%rbx,4), %mm6 psrld $(16), %mm7 movd %mm7, %eax pand Mask16(%rip), %mm6 test %eax, %eax jz LErrorEncFlushAc01gas_1 cmp %ebp, %eax jle LHuffEobEncFlushAc01gas_1 lea LHuffEobEncFlushAc01gas_1(%rip), %rbx mov %rbx, (32)(%rsp) jmp LWriteEncFlushAc00gas_1 LHuffEobEncFlushAc01gas_1: psllq %mm7, %mm0 por %mm6, %mm0 sub %eax, %ebp jmp *%rsi LAppendFlushEncAc00gas_1: mov (80)(%rsp), %rcx lea (16)(%rcx), %rax mov (%rax), %eax lea (20)(%rcx), %rdi LAppendFlushEncAc01gas_1: test %eax, %eax jz LEndWriteFlushEncAc00gas_1 cmp $(1), %ebp jge LAppendFlushEncAc02gas_1 lea LAppendFlushEncAc02gas_1(%rip), %rbx mov %rbx, (32)(%rsp) jmp LWriteEncFlushAc00gas_1 LAppendFlushEncAc02gas_1: movzbl (%rdi), %esi psllq $(1), %mm0 and $(1), %esi movd %esi, %mm1 add $(1), %rdi sub $(1), %eax sub $(1), %ebp por %mm1, %mm0 jmp LAppendFlushEncAc01gas_1 LEndWriteFlushEncAc00gas_1: cmp $(64), %ebp je LInitFlushEncAc00gas_1 mov %ebp, %ecx and $(7), %ecx jz LEndWriteFlushEncAc01gas_1 movd %ecx, %mm1 sub %ecx, %ebp mov $(1), %ebx shl %cl, %ebx sub $(1), %ebx psllq %mm1, %mm0 movd %ebx, %mm1 por %mm1, %mm0 LEndWriteFlushEncAc01gas_1: lea LInitFlushEncAc00gas_1(%rip), %rbx mov %rbx, (32)(%rsp) jmp LWriteEncFlushAc00gas_1 LInitFlushEncAc00gas_1: xor %eax, %eax mov (80)(%rsp), %rcx lea (8)(%rcx), %rbx mov %eax, (%rbx) pxor %mm0, %mm0 lea (%rcx), %rbx movq %mm0, (%rbx) lea (16)(%rcx), %rbx mov %eax, (%rbx) mov (24)(%rsp), %eax lea (12)(%rcx), %rbx mov %eax, (%rbx) xorps %xmm0, %xmm0 lea (20)(%rcx), %rdi mov $(1008), %ebx movups %xmm0, (%rdi) movups %xmm0, (%rdi,%rbx) and $(-16), %rdi add $(16), %rdi mov $(15), %ebx LInitFlushEncAc01gas_1: movaps %xmm0, (%rdi) movaps %xmm0, (16)(%rdi) movaps %xmm0, (32)(%rdi) movaps %xmm0, (48)(%rdi) add $(64), %rdi sub $(1), %ebx jnz LInitFlushEncAc01gas_1 movaps %xmm0, (%rdi) movaps %xmm0, (16)(%rdi) movaps %xmm0, (32)(%rdi) mov (64)(%rsp), %rbx mov (%rsp), %ecx mov %ecx, (%rbx) mov (8)(%rsp), %rax emms add $(104), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LWriteEncFlushAc00gas_1: movd %ebp, %mm1 sub $(64), %ebp movq %mm0, %mm2 neg %ebp psllq %mm1, %mm2 mov (%rsp), %ecx mov (48)(%rsp), %rdx movq %mm2, %mm1 LWriteEncFlushAc11gas_1: sub $(8), %ebp jl LWriteEncFlushAc12gas_1 cmp (56)(%rsp), %ecx jge LErrorEncFlushAc02gas_1 psrlq $(56), %mm2 psllq $(8), %mm1 movd %mm2, %ebx movq %mm1, %mm2 mov %bl, (%rdx,%rcx) add $(1), %ecx cmp $(255), %ebx jne LWriteEncFlushAc11gas_1 cmp (56)(%rsp), %ecx je LErrorEncFlushAc03gas_1 xor %ebx, %ebx mov %bl, (%rdx,%rcx) add $(1), %ecx jmp LWriteEncFlushAc11gas_1 LWriteEncFlushAc12gas_1: sub $(56), %ebp mov %ecx, (%rsp) neg %ebp mov (32)(%rsp), %rbx jmp *%rbx LErrorEncFlushAc00gas_1: mov $(-63), %rbx mov %rbx, (8)(%rsp) jmp LEndWriteFlushEncAc00gas_1 LErrorEncFlushAc01gas_1: mov $(-64), %rbx mov %rbx, (8)(%rsp) jmp LEndWriteFlushEncAc00gas_1 LErrorEncFlushAc02gas_1: sub $(56), %ebp mov %ecx, (%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (8)(%rsp) jmp LInitFlushEncAc00gas_1 LErrorEncFlushAc03gas_1: sub $(64), %ebp mov %ecx, (%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (8)(%rsp) jmp LInitFlushEncAc00gas_1 .p2align 4, 0x90 .globl mfxownpj_EncodeHuffman8x8_ACFirst_JPEG_16s1u_C1 mfxownpj_EncodeHuffman8x8_ACFirst_JPEG_16s1u_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(136), %rsp mov %rdi, (80)(%rsp) mov %rsi, (88)(%rsp) mov %edx, %edx mov %rdx, (96)(%rsp) mov %rcx, (104)(%rsp) mov %r8d, %r8d mov %r8, (112)(%rsp) mov %r9d, %r9d mov %r9, (120)(%rsp) mov (192)(%rsp), %eax mov %rax, (192)(%rsp) mov $(0), %rbx mov %rbx, (16)(%rsp) mov (104)(%rsp), %rbx mov (%rbx), %ebx mov %rbx, (%rsp) movq (208)(%rsp), %rcx lea (8)(%rcx), %rbx mov $(64), %ebp sub (%rbx), %ebp lea (%rcx), %rbx movq (%rbx), %mm0 lea (12)(%rcx), %rcx mov (%rcx), %ecx mov %ecx, (32)(%rsp) movq (200)(%rsp), %rbx lea (%rbx), %rbx mov %rbx, (24)(%rsp) mov (120)(%rsp), %rbx sub $(63), %rbx lea ownZigzag(%rip), %rsi sub %rbx, %rsi mov %rsi, (8)(%rsp) mov (120)(%rsp), %edi sub (112)(%rsp), %edi mov (80)(%rsp), %rcx xor %ebx, %ebx movzbl (%rdi,%rsi), %edx jmp LEncFirstAc00gas_2 LEncFirstAc01gas_2: mov (80)(%rsp), %rcx add $(1), %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LLastZerosEncFirstAc00gas_2 LEncFirstAc00gas_2: movswl (%rdx,%rcx), %eax cmp $(0), %eax jnz LEncFirstAc02gas_2 movzbl (-1)(%rdi,%rsi), %edx add $(1), %ebx sub $(1), %edi jl LLastZerosEncFirstAc00gas_2 movswl (%rdx,%rcx), %eax cmp $(0), %eax jnz LEncFirstAc02gas_2 movzbl (-1)(%rdi,%rsi), %edx add $(1), %ebx sub $(1), %edi jl LLastZerosEncFirstAc00gas_2 movswl (%rdx,%rcx), %eax cmp $(0), %eax jnz LEncFirstAc02gas_2 movzbl (-1)(%rdi,%rsi), %edx add $(1), %ebx sub $(1), %edi jl LLastZerosEncFirstAc00gas_2 movswl (%rdx,%rcx), %eax cmp $(0), %eax jnz LEncFirstAc02gas_2 movzbl (-1)(%rdi,%rsi), %edx add $(1), %ebx sub $(1), %edi jl LLastZerosEncFirstAc00gas_2 jmp LEncFirstAc00gas_2 LEncFirstAc02gas_2: mov (192)(%rsp), %ecx cdq xor %edx, %eax sub %edx, %eax shr %cl, %eax xor %eax, %edx test %eax, %eax jz LEncFirstAc01gas_2 mov (32)(%rsp), %ecx test %ecx, %ecx jne LEobEncFirstAc01gas_2 LEncFirstAc03gas_2: cmp $(15), %ebx jg LZeros16EncFirstAc00gas_2 LEncFirstAc04gas_2: bsr %eax, %eax mov (24)(%rsp), %rcx shl $(4), %ebx add $(1), %eax add %eax, %ebx cmp $(11), %eax jg LErrorEncFirstAc00gas_2 cmp $(256), %ebx jg LErrorEncFirstAc01gas_2 movd (%rcx,%rbx,4), %mm7 movd (%rcx,%rbx,4), %mm6 lea TableMask12(%rip), %rbx psrld $(16), %mm7 pand Mask16(%rip), %mm6 movd %eax, %mm1 and (%rbx,%rax,4), %edx movd %mm7, %eax paddd %mm1, %mm7 psllq %mm1, %mm6 movd %edx, %mm2 test %eax, %eax jz LErrorEncFirstAc02gas_2 movd %mm7, %eax por %mm2, %mm6 cmp %ebp, %eax jg LWriteEncFirstAc01gas_2 LEncFirstAc05gas_2: psllq %mm7, %mm0 sub %eax, %ebp mov (80)(%rsp), %rcx por %mm6, %mm0 xor %ebx, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jge LEncFirstAc00gas_2 jmp LExitEncFirstAc00gas_2 LWriteEncFirstAc01gas_2: lea LEncFirstAc05gas_2(%rip), %rbx mov %rbx, (40)(%rsp) LWriteEncFirstAc00gas_2: movd %ebp, %mm1 sub $(64), %ebp movq %mm0, %mm2 neg %ebp psllq %mm1, %mm2 movq maskFF(%rip), %mm1 mov (%rsp), %ebx mov (%rsp), %ecx sub (96)(%rsp), %ebx mov (88)(%rsp), %rdx cmp $(-8), %ebx jg LWriteEncFirstAc10gas_2 cmp $(32), %ebp jl LWriteEncFirstAc10gas_2 pcmpeqb %mm2, %mm1 pmovmskb %mm1, %ebx movq %mm2, %mm1 test %ebx, %ebx jnz LWriteEncFirstAc11gas_2 movd %mm2, %ebx psrlq $(32), %mm1 bswap %ebx mov %ebx, (4)(%rdx,%rcx) movd %mm1, %ebx bswap %ebx mov %ebx, (%rdx,%rcx) mov %ebp, %ebx and $(7), %ebp and $(4294967288), %ebx sub $(64), %ebp neg %ebp shr $(3), %ebx add %ebx, (%rsp) mov (40)(%rsp), %rbx jmp *%rbx LWriteEncFirstAc10gas_2: movq %mm2, %mm1 LWriteEncFirstAc11gas_2: sub $(8), %ebp jl LWriteEncFirstAc12gas_2 cmp (96)(%rsp), %ecx jge LErrorEncFirstAc03gas_2 psrlq $(56), %mm2 psllq $(8), %mm1 movd %mm2, %ebx movq %mm1, %mm2 mov %bl, (%rdx,%rcx) add $(1), %ecx cmp $(255), %ebx jne LWriteEncFirstAc11gas_2 cmp (96)(%rsp), %ecx je LErrorEncFirstAc04gas_2 xor %ebx, %ebx mov %bl, (%rdx,%rcx) add $(1), %ecx jmp LWriteEncFirstAc11gas_2 LWriteEncFirstAc12gas_2: sub $(56), %ebp mov %ecx, (%rsp) neg %ebp mov (40)(%rsp), %rbx jmp *%rbx LExitEncFirstAc00gas_2: mov (104)(%rsp), %rbx mov (%rsp), %ecx mov %ecx, (%rbx) movq (208)(%rsp), %rcx lea (8)(%rcx), %rbx sub $(64), %ebp neg %ebp mov %ebp, (%rbx) lea (%rcx), %rbx movq %mm0, (%rbx) mov (32)(%rsp), %ebx lea (12)(%rcx), %rcx mov %ebx, (%rcx) mov (16)(%rsp), %rax emms add $(136), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LZeros16EncFirstAc00gas_2: mov (24)(%rsp), %rcx movd (960)(%rcx), %mm7 movd (960)(%rcx), %mm6 psrld $(16), %mm7 movd %mm7, %ecx pand Mask16(%rip), %mm6 test %ecx, %ecx jz LErrorEncFirstAc02gas_2 LZeros16EncFirstAc01gas_2: cmp %ebp, %ecx jg LZeros16EncFirstAc03gas_2 LZeros16EncFirstAc02gas_2: psllq %mm7, %mm0 por %mm6, %mm0 sub %ecx, %ebp sub $(16), %ebx cmp $(16), %ebx jl LEncFirstAc04gas_2 jmp LZeros16EncFirstAc01gas_2 LZeros16EncFirstAc03gas_2: mov %rbx, (56)(%rsp) mov %rdx, (64)(%rsp) mov %rcx, (72)(%rsp) lea LZeros16EncFirstAc30gas_2(%rip), %rbx mov %rbx, (40)(%rsp) jmp LWriteEncFirstAc00gas_2 LZeros16EncFirstAc30gas_2: mov (56)(%rsp), %rbx mov (64)(%rsp), %rdx mov (72)(%rsp), %rcx jmp LZeros16EncFirstAc01gas_2 LLastZerosEncFirstAc00gas_2: test %ebx, %ebx jz LExitEncFirstAc00gas_2 mov (32)(%rsp), %ebx add $(1), %ebx mov %ebx, (32)(%rsp) cmp $(32767), %ebx jne LExitEncFirstAc00gas_2 lea LExitEncFirstAc00gas_2(%rip), %rsi jmp LEobEncFirstAc02gas_2 LEobEncFirstAc10gas_2: mov (8)(%rsp), %rsi jmp LEncFirstAc03gas_2 LEobEncFirstAc01gas_2: lea LEobEncFirstAc10gas_2(%rip), %rsi LEobEncFirstAc02gas_2: mov %rsi, (48)(%rsp) mov %rbx, (56)(%rsp) mov %rax, (64)(%rsp) mov %rdx, (72)(%rsp) mov (32)(%rsp), %ebx test %ebx, %ebx jz LEobEncFirstAc13gas_2 cmp $(1), %ebx jne LEobEncFirstAc03gas_2 xor %ebx, %ebx lea LEobEncFirstAc12gas_2(%rip), %rsi jmp LHuffEobEncFirstAc00gas_2 LEobEncFirstAc03gas_2: cmp $(32767), %ebx jle LEobEncFirstAc06gas_2 mov $(224), %ebx lea LEobEncFirstAc04gas_2(%rip), %rsi jmp LHuffEobEncFirstAc00gas_2 LEobEncFirstAc04gas_2: cmp $(14), %ebp jge LEobEncFirstAc05gas_2 lea LEobEncFirstAc05gas_2(%rip), %rbx mov %rbx, (40)(%rsp) jmp LWriteEncFirstAc00gas_2 LEobEncFirstAc05gas_2: mov $(32767), %esi mov (32)(%rsp), %ebx psllq $(14), %mm0 and $(16383), %ebx sub %esi, (32)(%rsp) movd %ebx, %mm1 sub $(14), %ebp por %mm1, %mm0 mov (32)(%rsp), %ebx LEobEncFirstAc06gas_2: lea eobSize(%rip), %rsi cmp $(256), %ebx jl LEobEncFirstAc07gas_2 shr $(8), %ebx movzbl (%rsi,%rbx), %ebx add $(8), %ebx jmp LEobEncFirstAc08gas_2 LEobEncFirstAc07gas_2: movzbl (%rsi,%rbx), %ebx LEobEncFirstAc08gas_2: cmp $(14), %ebx jg LErrorEncFirstAc00gas_2 movd %ebx, %mm5 shl $(4), %ebx lea LEobEncFirstAc09gas_2(%rip), %rsi jmp LHuffEobEncFirstAc00gas_2 LEobEncFirstAc09gas_2: movd %mm5, %esi cmp %esi, %ebp jge LEobEncFirstAc11gas_2 lea LEobEncFirstAc11gas_2(%rip), %rbx mov %rbx, (40)(%rsp) jmp LWriteEncFirstAc00gas_2 LEobEncFirstAc11gas_2: movd %esi, %mm1 mov $(32), %ecx sub %esi, %ecx mov (32)(%rsp), %ebx shl %cl, %ebx shr %cl, %ebx psllq %mm1, %mm0 movd %ebx, %mm1 sub %esi, %ebp por %mm1, %mm0 LEobEncFirstAc12gas_2: xor %esi, %esi mov %esi, (32)(%rsp) LEobEncFirstAc13gas_2: mov (56)(%rsp), %rbx mov (64)(%rsp), %rax mov (72)(%rsp), %rdx mov (48)(%rsp), %rsi jmp *%rsi LHuffEobEncFirstAc00gas_2: mov (24)(%rsp), %rax movd (%rax,%rbx,4), %mm7 movd (%rax,%rbx,4), %mm6 psrld $(16), %mm7 movd %mm7, %eax pand Mask16(%rip), %mm6 test %eax, %eax jz LErrorEncFirstAc02gas_2 cmp %ebp, %eax jle LHuffEobEncFirstAc01gas_2 lea LHuffEobEncFirstAc01gas_2(%rip), %rbx mov %rbx, (40)(%rsp) jmp LWriteEncFirstAc00gas_2 LHuffEobEncFirstAc01gas_2: psllq %mm7, %mm0 por %mm6, %mm0 sub %eax, %ebp jmp *%rsi LErrorEncFirstAc00gas_2: mov $(-63), %rbx mov %rbx, (16)(%rsp) jmp LExitEncFirstAc00gas_2 LErrorEncFirstAc01gas_2: mov $(-2), %rbx mov %rbx, (16)(%rsp) jmp LExitEncFirstAc00gas_2 LErrorEncFirstAc02gas_2: mov $(-64), %rbx mov %rbx, (16)(%rsp) jmp LExitEncFirstAc00gas_2 LErrorEncFirstAc03gas_2: sub $(56), %ebp mov %ecx, (%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (16)(%rsp) jmp LExitEncFirstAc00gas_2 LErrorEncFirstAc04gas_2: sub $(64), %ebp mov %ecx, (%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (16)(%rsp) jmp LExitEncFirstAc00gas_2 .p2align 4, 0x90 .globl mfxownpj_EncodeHuffman8x8_ACRefine_JPEG_16s1u_C1 mfxownpj_EncodeHuffman8x8_ACRefine_JPEG_16s1u_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(680), %rsp mov %rdi, (112)(%rsp) mov %rsi, (120)(%rsp) mov %edx, %edx mov %rdx, (128)(%rsp) mov %rcx, (136)(%rsp) mov %r8d, %r8d mov %r8, (144)(%rsp) mov %r9d, %r9d mov %r9, (152)(%rsp) mov (736)(%rsp), %eax mov %rax, (736)(%rsp) mov $(0), %rbx mov %rbx, (%rsp) mov (136)(%rsp), %rbx mov (%rbx), %ebx mov %rbx, (8)(%rsp) movq (752)(%rsp), %rcx lea (8)(%rcx), %rbx mov $(64), %ebp sub (%rbx), %ebp lea (%rcx), %rbx movq (%rbx), %mm0 lea (12)(%rcx), %rbx mov (%rbx), %ebx mov %ebx, (32)(%rsp) mov %ebx, (104)(%rsp) lea (16)(%rcx), %rbx mov (%rbx), %ebx mov %rbx, (40)(%rsp) or %ebx, (104)(%rsp) lea (20)(%rcx), %rcx mov %rcx, (48)(%rsp) movq (744)(%rsp), %rbx lea (%rbx), %rbx mov %rbx, (24)(%rsp) mov (152)(%rsp), %rbx sub $(63), %rbx lea ownZigzag(%rip), %rsi sub %rbx, %rsi mov (152)(%rsp), %edi sub (144)(%rsp), %edi mov (112)(%rsp), %rcx movd %edi, %mm7 mov $(64), %ebx movzbl (%rdi,%rsi), %edx movswl (%rdx,%rcx), %eax cdq mov (736)(%rsp), %ecx xor %edx, %eax sub %edx, %eax add $(1), %edx shr %cl, %eax mov (112)(%rsp), %rcx mov %eax, (160)(%rsp,%rdi,4) mov %edx, (416)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LEncRefineAc00gas_3 LAbsEncRefineAc00gas_3: movswl (%rdx,%rcx), %eax cdq mov (736)(%rsp), %ecx xor %edx, %eax sub %edx, %eax add $(1), %edx shr %cl, %eax mov (112)(%rsp), %rcx mov %eax, (160)(%rsp,%rdi,4) mov %edx, (416)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LEncRefineAc00gas_3 movswl (%rdx,%rcx), %eax cdq mov (736)(%rsp), %ecx xor %edx, %eax sub %edx, %eax add $(1), %edx shr %cl, %eax mov (112)(%rsp), %rcx mov %eax, (160)(%rsp,%rdi,4) mov %edx, (416)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jge LAbsEncRefineAc00gas_3 LEncRefineAc00gas_3: mov %ebx, (16)(%rsp) movd %mm7, %edi xor %esi, %esi mov (48)(%rsp), %rcx add (40)(%rsp), %rcx xor %edx, %edx xor %eax, %eax jmp LEncRefineAc01gas_3 LEncRefineAc02gas_3: and $(1), %eax mov %al, (%rdx,%rcx) xor %eax, %eax add $(1), %edx sub $(1), %edi jl LLastZerosEncRefineAc00gas_3 LEncRefineAc01gas_3: add (160)(%rsp,%rdi,4), %eax jnz LEncRefineAc03gas_3 add $(1), %esi sub $(1), %edi jl LLastZerosEncRefineAc00gas_3 add (160)(%rsp,%rdi,4), %eax jnz LEncRefineAc03gas_3 add $(1), %esi sub $(1), %edi jl LLastZerosEncRefineAc00gas_3 add (160)(%rsp,%rdi,4), %eax jnz LEncRefineAc03gas_3 add $(1), %esi sub $(1), %edi jl LLastZerosEncRefineAc00gas_3 jmp LEncRefineAc01gas_3 LEncRefineAc03gas_3: cmp $(15), %esi jg LZeros16EncRefinetAc00gas_3 LEncRefineAc04gas_3: cmp $(1), %eax jg LEncRefineAc02gas_3 cmp (104)(%rsp), %eax jle LEncRefineAc55gas_3 LEncRefineAc06gas_3: add %esi, %esi mov (24)(%rsp), %rax lea (1)(,%rsi,8), %rsi movzwl (%rax,%rsi,4), %ebx movzwl (2)(%rax,%rsi,4), %eax test %eax, %eax jz LErrorEncRefineAc02gas_3 add %ebx, %ebx add $(1), %eax add (416)(%rsp,%rdi,4), %ebx movd %eax, %mm7 movd %ebx, %mm6 cmp %ebp, %eax jg LCallWriteEncRefineAc00gas_3 LEncRefineAc07gas_3: psllq %mm7, %mm0 sub %eax, %ebp por %mm6, %mm0 test %edx, %edx jz LEncRefineAc11gas_3 test %edx, %edx jz LEncRefineAc11gas_3 cmp $(32), %edx jg LCallAppendEncRefineAc03gas_3 cmp %ebp, %edx jg LCallWriteEncRefineAc01gas_3 LEncRefineAc08gas_3: movd %edx, %mm7 psllq %mm7, %mm0 sub %edx, %ebp movzbl (%rcx), %ebx add $(1), %rcx and $(1), %ebx sub $(1), %edx jz LEncRefineAc10gas_3 LEncRefineAc09gas_3: add %ebx, %ebx movzbl (%rcx), %eax add $(1), %rcx and $(1), %eax or %eax, %ebx sub $(1), %edx jz LEncRefineAc10gas_3 add %ebx, %ebx movzbl (%rcx), %eax add $(1), %rcx and $(1), %eax or %eax, %ebx sub $(1), %edx jnz LEncRefineAc09gas_3 LEncRefineAc10gas_3: movd %ebx, %mm6 por %mm6, %mm0 LEncRefineAc11gas_3: xor %esi, %esi mov (48)(%rsp), %rcx xor %edx, %edx xor %eax, %eax sub $(1), %edi jge LEncRefineAc01gas_3 LLastZerosEncRefineAc00gas_3: or %edx, %esi jz LExitEncRefineAc00gas_3 mov $(1), %eax add %eax, (32)(%rsp) mov (40)(%rsp), %eax add %edx, %eax mov (32)(%rsp), %ebx cmp $(937), %eax jg LLastZerosEncRefineAc01gas_3 cmp $(32767), %ebx je LLastZerosEncRefineAc01gas_3 jmp LLastZerosEncRefineAc03gas_3 LLastZerosEncRefineAc01gas_3: test %ebx, %ebx jz LLastZerosEncRefineAc02gas_3 lea LLastZerosEncRefineAc02gas_3(%rip), %rcx mov %rcx, (64)(%rsp) jmp LEobEncRefineAc00gas_3 LLastZerosEncRefineAc02gas_3: test %eax, %eax jnz LCallAppendEncRefineAc04gas_3 LLastZerosEncRefineAc03gas_3: mov %eax, (40)(%rsp) jmp LExitEncRefineAc00gas_3 LEncRefineAc55gas_3: mov (32)(%rsp), %ebx test %ebx, %ebx jnz LCallEobEncRefineAc00gas_3 LEncRefineAc05gas_3: mov (40)(%rsp), %eax test %eax, %eax jnz LCallAppendEncRefineAc00gas_3 jmp LEncRefineAc06gas_3 LRetWriteEncRefineAc03gas_3: mov (72)(%rsp), %rcx mov (80)(%rsp), %rdx mov (88)(%rsp), %rbx jmp LZeros16EncRefinetAc04gas_3 LCallWriteEncRefineAc03gas_3: mov %rcx, (72)(%rsp) mov %rdx, (80)(%rsp) mov %rbx, (88)(%rsp) lea LRetWriteEncRefineAc03gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LCallWriteEncRefineAc02gas_3: lea LAppendEncRefineAc01gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LRetWriteEncRefineAc01gas_3: mov (72)(%rsp), %rcx mov (80)(%rsp), %rdx jmp LEncRefineAc08gas_3 LCallWriteEncRefineAc01gas_3: mov %rcx, (72)(%rsp) mov %rdx, (80)(%rsp) lea LRetWriteEncRefineAc01gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LRetWriteEncRefineAc00gas_3: mov (72)(%rsp), %rcx mov (80)(%rsp), %rdx jmp LEncRefineAc07gas_3 LCallWriteEncRefineAc00gas_3: mov %rcx, (72)(%rsp) mov %rdx, (80)(%rsp) lea LRetWriteEncRefineAc00gas_3(%rip), %rbx mov %rbx, (56)(%rsp) LWriteEncRefineAc00gas_3: movd %ebp, %mm1 sub $(64), %ebp movq %mm0, %mm2 neg %ebp psllq %mm1, %mm2 movq maskFF(%rip), %mm1 mov (8)(%rsp), %ebx mov (8)(%rsp), %ecx sub (128)(%rsp), %ebx mov (120)(%rsp), %rdx cmp $(-8), %ebx jg LWriteEncRefineAc10gas_3 cmp $(32), %ebp jl LWriteEncRefineAc10gas_3 pcmpeqb %mm2, %mm1 pmovmskb %mm1, %ebx movq %mm2, %mm1 test %ebx, %ebx jnz LWriteEncRefineAc11gas_3 movd %mm2, %ebx psrlq $(32), %mm1 bswap %ebx mov %ebx, (4)(%rdx,%rcx) movd %mm1, %ebx bswap %ebx mov %ebx, (%rdx,%rcx) mov %ebp, %ebx and $(7), %ebp and $(4294967288), %ebx sub $(64), %ebp neg %ebp shr $(3), %ebx add %ebx, (8)(%rsp) mov (56)(%rsp), %rbx jmp *%rbx LWriteEncRefineAc10gas_3: movq %mm2, %mm1 LWriteEncRefineAc11gas_3: sub $(8), %ebp jl LWriteEncRefineAc12gas_3 cmp (128)(%rsp), %ecx jge LErrorEncRefineAc03gas_3 psrlq $(56), %mm2 psllq $(8), %mm1 movd %mm2, %ebx movq %mm1, %mm2 mov %bl, (%rdx,%rcx) add $(1), %ecx cmp $(255), %ebx jne LWriteEncRefineAc11gas_3 cmp (128)(%rsp), %ecx je LErrorEncRefineAc04gas_3 xor %ebx, %ebx mov %bl, (%rdx,%rcx) add $(1), %ecx jmp LWriteEncRefineAc11gas_3 LWriteEncRefineAc12gas_3: sub $(56), %ebp mov %ecx, (8)(%rsp) neg %ebp mov (56)(%rsp), %rbx jmp *%rbx LExitEncRefineAc00gas_3: mov (136)(%rsp), %rbx mov (8)(%rsp), %ecx mov %ecx, (%rbx) movq (752)(%rsp), %rcx lea (8)(%rcx), %rbx sub $(64), %ebp neg %ebp mov %ebp, (%rbx) lea (%rcx), %rbx movq %mm0, (%rbx) mov (32)(%rsp), %ebx lea (12)(%rcx), %rax mov %ebx, (%rax) mov (40)(%rsp), %ebx lea (16)(%rcx), %rcx mov %ebx, (%rcx) mov (%rsp), %rax emms add $(680), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LZeros16EncRefinetAc00gas_3: cmp (16)(%rsp), %edi jl LEncRefineAc04gas_3 mov (32)(%rsp), %ebx test %ebx, %ebx jnz LCallEobEncRefineAc01gas_3 LZeros16EncRefinetAc01gas_3: mov (40)(%rsp), %ebx test %ebx, %ebx jnz LCallAppendEncRefineAc01gas_3 LZeros16EncRefinetAc02gas_3: mov (24)(%rsp), %rbx movd (960)(%rbx), %mm7 movd (960)(%rbx), %mm6 psrld $(16), %mm7 movd %mm7, %ebx pand Mask16(%rip), %mm6 test %ebx, %ebx jz LErrorEncRefineAc02gas_3 LZeros16EncRefinetAc03gas_3: cmp %ebp, %ebx jg LCallWriteEncRefineAc03gas_3 LZeros16EncRefinetAc04gas_3: psllq %mm7, %mm0 por %mm6, %mm0 sub %ebx, %ebp sub $(16), %esi test %edx, %edx jnz LCallAppendEncRefineAc02gas_3 LZeros16EncRefinetAc05gas_3: mov (48)(%rsp), %rcx cmp $(15), %esi jle LEncRefineAc04gas_3 jmp LZeros16EncRefinetAc02gas_3 LCallAppendEncRefineAc04gas_3: mov (48)(%rsp), %rsi lea LLastZerosEncRefineAc03gas_3(%rip), %rbx mov %rbx, (64)(%rsp) jmp LAppendEncRefineAc00gas_3 LCallAppendEncRefineAc03gas_3: mov %edx, %eax mov %rcx, %rsi lea LEncRefineAc11gas_3(%rip), %rbx mov %rbx, (64)(%rsp) jmp LAppendEncRefineAc00gas_3 LRetAppendEncRefineAc02gas_3: mov %eax, (104)(%rsp) mov %eax, %edx mov (72)(%rsp), %rax mov (80)(%rsp), %rsi mov (48)(%rsp), %rcx jmp LZeros16EncRefinetAc05gas_3 LCallAppendEncRefineAc02gas_3: mov %rax, (72)(%rsp) mov %rsi, (80)(%rsp) mov %rcx, (88)(%rsp) mov %edx, %eax mov %rcx, %rsi lea LRetAppendEncRefineAc02gas_3(%rip), %rbx mov %rbx, (64)(%rsp) jmp LAppendEncRefineAc00gas_3 LRetAppendEncRefineAc01gas_3: mov %eax, (104)(%rsp) mov %eax, (40)(%rsp) mov (72)(%rsp), %rcx mov (80)(%rsp), %rdx mov (88)(%rsp), %rsi mov (96)(%rsp), %rax jmp LZeros16EncRefinetAc02gas_3 LCallAppendEncRefineAc01gas_3: mov %rcx, (72)(%rsp) mov %rdx, (80)(%rsp) mov %rsi, (88)(%rsp) mov %rax, (96)(%rsp) mov %ebx, %eax mov (48)(%rsp), %rsi lea LRetAppendEncRefineAc01gas_3(%rip), %rbx mov %rbx, (64)(%rsp) jmp LAppendEncRefineAc00gas_3 LRetAppendEncRefineAc00gas_3: mov %eax, (104)(%rsp) mov %eax, (40)(%rsp) mov (72)(%rsp), %rcx mov (80)(%rsp), %rdx mov (88)(%rsp), %rsi jmp LEncRefineAc06gas_3 LCallAppendEncRefineAc00gas_3: mov %rcx, (72)(%rsp) mov %rdx, (80)(%rsp) mov %rsi, (88)(%rsp) mov (48)(%rsp), %rsi lea LRetAppendEncRefineAc00gas_3(%rip), %rbx mov %rbx, (64)(%rsp) LAppendEncRefineAc00gas_3: cmp $(1), %ebp jl LCallWriteEncRefineAc02gas_3 LAppendEncRefineAc01gas_3: psllq $(1), %mm0 movzbl (%rsi), %ebx add $(1), %rsi and $(1), %ebx movd %ebx, %mm1 sub $(1), %ebp por %mm1, %mm0 sub $(1), %eax jnz LAppendEncRefineAc00gas_3 mov (64)(%rsp), %rbx jmp *%rbx LCallEobEncRefineAc01gas_3: mov %rsi, (96)(%rsp) lea LZeros16EncRefinetAc01gas_3(%rip), %rsi mov %rsi, (64)(%rsp) jmp LEobEncRefineAc00gas_3 LCallEobEncRefineAc00gas_3: mov %rsi, (96)(%rsp) lea LEncRefineAc05gas_3(%rip), %rsi mov %rsi, (64)(%rsp) LEobEncRefineAc00gas_3: mov %rcx, (72)(%rsp) mov %rax, (80)(%rsp) mov %rdx, (88)(%rsp) cmp $(1), %ebx jne LEobEncRefineAc01gas_3 xor %ebx, %ebx lea LEobEncRefineAc09gas_3(%rip), %rsi jmp LHuffEobEncRefineAc00gas_3 LEobEncRefineAc01gas_3: cmp $(32767), %ebx jle LEobEncRefineAc04gas_3 mov $(224), %ebx lea LEobEncRefineAc02gas_3(%rip), %rsi jmp LHuffEobEncRefineAc00gas_3 LEobEncRefineAc02gas_3: cmp $(14), %ebp jge LEobEncRefineAc03gas_3 lea LEobEncRefineAc03gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LEobEncRefineAc03gas_3: mov $(32767), %esi mov (32)(%rsp), %ebx psllq $(14), %mm0 and $(16383), %ebx sub %esi, (32)(%rsp) movd %ebx, %mm1 sub $(14), %ebp por %mm1, %mm0 mov (32)(%rsp), %ebx LEobEncRefineAc04gas_3: lea eobSize(%rip), %rsi cmp $(256), %ebx jl LEobEncRefineAc05gas_3 shr $(8), %ebx movzbl (%rsi,%rbx), %ebx add $(8), %ebx jmp LEobEncRefineAc06gas_3 LEobEncRefineAc05gas_3: movzbl (%rsi,%rbx), %ebx LEobEncRefineAc06gas_3: cmp $(14), %ebx jg LErrorEncRefineAc00gas_3 movd %ebx, %mm5 shl $(4), %ebx lea LEobEncRefineAc07gas_3(%rip), %rsi jmp LHuffEobEncRefineAc00gas_3 LEobEncRefineAc07gas_3: movd %mm5, %esi cmp %esi, %ebp jge LEobEncRefineAc08gas_3 lea LEobEncRefineAc08gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LEobEncRefineAc08gas_3: movd %esi, %mm1 mov $(32), %ecx sub %esi, %ecx mov (32)(%rsp), %ebx shl %cl, %ebx shr %cl, %ebx psllq %mm1, %mm0 movd %ebx, %mm1 sub %esi, %ebp por %mm1, %mm0 LEobEncRefineAc09gas_3: xor %esi, %esi mov %esi, (32)(%rsp) mov %esi, (104)(%rsp) mov (72)(%rsp), %rcx mov (80)(%rsp), %rax mov (88)(%rsp), %rdx mov (96)(%rsp), %rsi mov (64)(%rsp), %rbx jmp *%rbx LHuffEobEncRefineAc00gas_3: mov (24)(%rsp), %rax movd (%rax,%rbx,4), %mm7 movd (%rax,%rbx,4), %mm6 psrld $(16), %mm7 movd %mm7, %eax pand Mask16(%rip), %mm6 test %eax, %eax jz LErrorEncRefineAc02gas_3 cmp %ebp, %eax jle LHuffEobEncRefineAc01gas_3 lea LHuffEobEncRefineAc01gas_3(%rip), %rbx mov %rbx, (56)(%rsp) jmp LWriteEncRefineAc00gas_3 LHuffEobEncRefineAc01gas_3: psllq %mm7, %mm0 por %mm6, %mm0 sub %eax, %ebp jmp *%rsi LErrorEncRefineAc00gas_3: mov $(-63), %rbx mov %rbx, (%rsp) jmp LExitEncRefineAc00gas_3 LErrorEncRefineAc02gas_3: mov $(-64), %rbx mov %rbx, (%rsp) jmp LExitEncRefineAc00gas_3 LErrorEncRefineAc03gas_3: sub $(56), %ebp mov %ecx, (8)(%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (%rsp) jmp LExitEncRefineAc00gas_3 LErrorEncRefineAc04gas_3: sub $(64), %ebp mov %ecx, (8)(%rsp) neg %ebp mov $(-62), %rbx mov %rbx, (%rsp) jmp LExitEncRefineAc00gas_3 .p2align 4, 0x90 .globl mfxownpj_GetHuffmanStatistics8x8_ACFlush_JPEG_16s_C1 mfxownpj_GetHuffmanStatistics8x8_ACFlush_JPEG_16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(40), %rsp mov %rdi, (8)(%rsp) mov %rsi, (16)(%rsp) mov $(0), %rax mov %rax, (%rsp) mov (16)(%rsp), %rcx lea (12)(%rcx), %rax mov (%rax), %eax mov (8)(%rsp), %rcx test %eax, %eax jz LInitStatFlushAc00gas_4 cmp $(1), %eax jg LCountStatFlushAc00gas_4 add %eax, (%rcx) jmp LInitStatFlushAc00gas_4 LCountStatFlushAc00gas_4: mov $(1), %edx cmp $(32767), %eax jle LCountStatFlushAc01gas_4 add %edx, (896)(%rcx) sub $(32767), %eax LCountStatFlushAc01gas_4: lea eobSize(%rip), %rdx cmp $(256), %eax jl LCountStatFlushAc02gas_4 shr $(8), %eax movzbl (%rdx,%rax), %eax add $(8), %eax jmp LCountStatFlushAc03gas_4 LCountStatFlushAc02gas_4: movzbl (%rdx,%rax), %eax LCountStatFlushAc03gas_4: mov $(1), %edx cmp $(14), %eax jg LErrorStatFlushAc00gas_4 shl $(4), %eax add %edx, (%rcx,%rax,4) LInitStatFlushAc00gas_4: xor %eax, %eax mov (16)(%rsp), %rcx lea (8)(%rcx), %rdx mov %eax, (%rdx) lea (%rcx), %rdx mov %rax, (%rdx) lea (16)(%rcx), %rdx mov %eax, (%rdx) lea (12)(%rcx), %rdx mov %eax, (%rdx) xorps %xmm0, %xmm0 lea (20)(%rcx), %rdx mov $(1008), %eax movups %xmm0, (%rdx) movups %xmm0, (%rdx,%rax) and $(-16), %rdx add $(16), %rdx mov $(15), %eax LInitStatFlushAc01gas_4: movaps %xmm0, (%rdx) movaps %xmm0, (16)(%rdx) movaps %xmm0, (32)(%rdx) movaps %xmm0, (48)(%rdx) add $(64), %rdx sub $(1), %eax jnz LInitStatFlushAc01gas_4 movaps %xmm0, (%rdx) movaps %xmm0, (16)(%rdx) movaps %xmm0, (32)(%rdx) LExitStatFlushAc00gas_4: mov (%rsp), %rax add $(40), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LErrorStatFlushAc00gas_4: mov $(-63), %rax mov %rax, (%rsp) jmp LInitStatFlushAc00gas_4 .p2align 4, 0x90 .globl mfxownpj_GetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1 mfxownpj_GetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1: push %rbp push %rbx push %r12 push %r13 push %r14 push %r15 sub $(344), %rsp mov %rdi, (32)(%rsp) mov %rsi, (40)(%rsp) mov %edx, %edx mov %rdx, (48)(%rsp) mov %ecx, %ecx mov %rcx, (56)(%rsp) mov %r8d, %r8d mov %r8, (64)(%rsp) mov %r9, (72)(%rsp) mov (56)(%rsp), %rbx sub $(63), %rbx lea ownZigzag(%rip), %rsi sub %rbx, %rsi mov (56)(%rsp), %edi sub (48)(%rsp), %edi mov (32)(%rsp), %rcx mov %edi, (24)(%rsp) mov $(64), %ebx movzbl (%rdi,%rsi), %edx movswl (%rdx,%rcx), %eax cdq mov (64)(%rsp), %ecx xor %edx, %eax sub %edx, %eax shr %cl, %eax mov (32)(%rsp), %rcx mov %eax, (80)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LStatRefineAc00gas_5 LAbsStatRefineAc00gas_5: movswl (%rdx,%rcx), %eax cdq mov (64)(%rsp), %ecx xor %edx, %eax sub %edx, %eax shr %cl, %eax mov (32)(%rsp), %rcx mov %eax, (80)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LStatRefineAc00gas_5 movswl (%rdx,%rcx), %eax cdq mov (64)(%rsp), %ecx xor %edx, %eax sub %edx, %eax shr %cl, %eax mov (32)(%rsp), %rcx mov %eax, (80)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jl LStatRefineAc00gas_5 movswl (%rdx,%rcx), %eax cdq mov (64)(%rsp), %ecx xor %edx, %eax sub %edx, %eax shr %cl, %eax mov (32)(%rsp), %rcx mov %eax, (80)(%rsp,%rdi,4) cmp $(1), %eax cmove %edi, %ebx movzbl (-1)(%rdi,%rsi), %edx sub $(1), %edi jge LAbsStatRefineAc00gas_5 LStatRefineAc00gas_5: mov %ebx, (8)(%rsp) mov $(0), %rax mov %rax, (%rsp) mov (72)(%rsp), %rcx lea (12)(%rcx), %rax mov (%rax), %ebx lea (16)(%rcx), %rcx mov (%rcx), %ecx mov (24)(%rsp), %edi xor %esi, %esi xor %edx, %edx xor %eax, %eax mov (40)(%rsp), %rbp jmp LStatRefineAc01gas_5 LStatRefineAc02gas_5: xor %eax, %eax add $(1), %edx sub $(1), %edi jl LLastZerosStatRefineAc00gas_5 LStatRefineAc01gas_5: add (80)(%rsp,%rdi,4), %eax jnz LStatRefineAc03gas_5 add $(16), %esi sub $(1), %edi jl LLastZerosStatRefineAc00gas_5 add (80)(%rsp,%rdi,4), %eax jnz LStatRefineAc03gas_5 add $(16), %esi sub $(1), %edi jl LLastZerosStatRefineAc00gas_5 add (80)(%rsp,%rdi,4), %eax jnz LStatRefineAc03gas_5 add $(16), %esi sub $(1), %edi jl LLastZerosStatRefineAc00gas_5 jmp LStatRefineAc01gas_5 LStatRefineAc03gas_5: cmp $(240), %esi jg LZeros16StatRefineAc00gas_5 LStatRefineAc04gas_5: cmp $(1), %eax jg LStatRefineAc02gas_5 test %ebx, %ebx jnz LStatRefineAc06gas_5 LStatRefineAc05gas_5: xor %ecx, %ecx xor %edx, %edx add $(1), %esi mov $(1), %eax add %eax, (%rbp,%rsi,4) xor %esi, %esi xor %eax, %eax sub $(1), %edi jge LStatRefineAc01gas_5 jmp LExitStatRefineAc00gas_5 LStatRefineAc06gas_5: cmp $(1), %ebx jg LCallCountStatRefineAc00gas_5 add %ebx, (%rbp) xor %ebx, %ebx jmp LStatRefineAc05gas_5 LLastZerosStatRefineAc00gas_5: or %edx, %esi jz LExitStatRefineAc00gas_5 add $(1), %ebx add %edx, %ecx cmp $(937), %ecx jg LCallCountStatRefineAc02gas_5 cmp $(32767), %ebx je LCallCountStatRefineAc02gas_5 LExitStatRefineAc00gas_5: mov (72)(%rsp), %rdx lea (12)(%rdx), %rax mov %ebx, (%rax) lea (16)(%rdx), %rdx mov %ecx, (%rdx) mov (%rsp), %rax add $(344), %rsp pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret LZeros16StatRefineAc00gas_5: cmp (8)(%rsp), %edi jl LStatRefineAc04gas_5 test %ebx, %ebx jnz LZeros16StatRefineAc04gas_5 LZeros16StatRefineAc01gas_5: cmp $(240), %esi jl LZeros16StatRefineAc03gas_5 mov $(1), %ecx LZeros16StatRefineAc02gas_5: add %ecx, (960)(%rbp) sub $(256), %esi cmp $(240), %esi jg LZeros16StatRefineAc02gas_5 LZeros16StatRefineAc03gas_5: xor %ecx, %ecx xor %edx, %edx jmp LStatRefineAc04gas_5 LZeros16StatRefineAc04gas_5: cmp $(1), %ebx jg LCallCountStatRefineAc01gas_5 add %ebx, (%rbp) xor %ebx, %ebx jmp LZeros16StatRefineAc01gas_5 LRetCountStatRefineAc01gas_5: xor %ecx, %ecx jmp LExitStatRefineAc00gas_5 LCallCountStatRefineAc02gas_5: lea LRetCountStatRefineAc01gas_5(%rip), %rcx jmp LCountStatRefineAc00gas_5 LCallCountStatRefineAc01gas_5: lea LZeros16StatRefineAc01gas_5(%rip), %rcx jmp LCountStatRefineAc00gas_5 LCallCountStatRefineAc00gas_5: lea LStatRefineAc05gas_5(%rip), %rcx LCountStatRefineAc00gas_5: mov $(1), %edx cmp $(32767), %ebx jle LCountStatRefineAc01gas_5 add %edx, (896)(%rbp) sub $(32767), %ebx LCountStatRefineAc01gas_5: lea eobSize(%rip), %rdx cmp $(256), %ebx jl LCountStatRefineAc02gas_5 shr $(8), %ebx movzbl (%rbx,%rdx), %ebx add $(8), %ebx jmp LCountStatRefineAc03gas_5 LCountStatRefineAc02gas_5: movzbl (%rbx,%rdx), %ebx LCountStatRefineAc03gas_5: mov $(1), %edx cmp $(14), %ebx jg LErrorStatRefineAc00gas_5 shl $(4), %ebx add %edx, (%rbp,%rbx,4) xor %ebx, %ebx jmp *%rcx LErrorStatRefineAc00gas_5: mov $(-63), %rax mov %rax, (%rsp) jmp LExitStatRefineAc00gas_5 .data .p2align 4, 0x90 maskFF: .quad 0xffffffffffffffff Mask16: .quad 0xffff TableMask12: .long 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047 .byte 126, 126, 126, 126, 126, 126, 126, 126 ownZigzag: .byte 126, 124, 110, 94, 108, 122, 120, 106 .byte 92, 78, 62, 76, 90, 104, 118, 116 .byte 102, 88, 74, 60, 46, 30, 44, 58 .byte 72, 86, 100, 114, 112, 98, 84, 70 .byte 56, 42, 28, 14, 12, 26, 40, 54 .byte 68, 82, 96, 80, 66, 52, 38, 24 .byte 10, 8, 22, 36, 50, 64, 48, 34 .byte 20, 6, 4, 18, 32, 16, 2, 0 eobSize: .byte 0, 0, 1, 1, 2, 2, 2, 2 .fill 8, 1, 3 .fill 16, 1, 4 .fill 32, 1, 5 .fill 64, 1, 6 .fill 128, 1, 7 .fill 256, 1, 8 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pjencssm7as.s000066400000000000000000001237371443134507600270710ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 CONST_0F: .quad 0xFF00FF00FF00FF, 0xFF00FF00FF00FF CONST_1: .quad 0x1000100010001, 0x1000100010001 CONST_3: .quad 0x3000300030003, 0x3000300030003 CONST_x1: .quad 0x1000000010000, 0x1000000010000 CONST_x3: .quad 0x2000100020001, 0x2000100020001 CONST_1x: .quad 0x100000001, 0x100000001 CONST_3x: .quad 0x1000200010002, 0x1000200010002 .text .p2align 4, 0x90 .globl mfxownpj_SampleDownH2V1_JPEG_8u_C1 mfxownpj_SampleDownH2V1_JPEG_8u_C1: push %rbp push %rbx mov %edx, %edx test $(1), %rdi jne LL1gas_1 mov %rsi, %rbp and $(15), %rbp jz LRungas_1 sub $(16), %rbp neg %rbp cmp %rbp, %rdx jle LRungas_1 sub %rbp, %rdx LLNgas_1: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rsi) add $(2), %rdi add $(1), %rsi sub $(1), %rbp jnz LLNgas_1 LRungas_1: test $(15), %rdi jnz LNAgas_1 sub $(32), %rdx jl LL16gas_1 LL32gas_1: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa (32)(%rdi), %xmm4 movdqa (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_1(%rip), %xmm0 paddw CONST_1(%rip), %xmm2 paddw CONST_1(%rip), %xmm4 paddw CONST_1(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rsi) movdqa %xmm4, (16)(%rsi) add $(64), %rdi add $(32), %rsi sub $(32), %rdx jge LL32gas_1 LL16gas_1: add $(16), %rdx jl LL8gas_1 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_1(%rip), %xmm0 paddw CONST_1(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rsi) add $(32), %rdi add $(16), %rsi sub $(16), %rdx LL8gas_1: add $(8), %rdx jl LL4gas_1 movdqa (%rdi), %xmm4 movdqa %xmm4, %xmm5 pand CONST_0F(%rip), %xmm4 psrlw $(8), %xmm5 paddw %xmm4, %xmm5 paddw CONST_1(%rip), %xmm5 psrlw $(1), %xmm5 packuswb %xmm5, %xmm5 movq %xmm5, (%rsi) add $(16), %rdi add $(8), %rsi sub $(8), %rdx jmp LL4gas_1 LNAgas_1: sub $(32), %rdx jl LL16ngas_1 LL32ngas_1: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 lddqu (32)(%rdi), %xmm4 lddqu (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_1(%rip), %xmm0 paddw CONST_1(%rip), %xmm2 paddw CONST_1(%rip), %xmm4 paddw CONST_1(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rsi) movdqa %xmm4, (16)(%rsi) add $(64), %rdi add $(32), %rsi sub $(32), %rdx jge LL32ngas_1 LL16ngas_1: add $(16), %rdx jl LL8ngas_1 lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_1(%rip), %xmm0 paddw CONST_1(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rsi) add $(32), %rdi add $(16), %rsi sub $(16), %rdx LL8ngas_1: add $(8), %rdx jl LL4gas_1 lddqu (%rdi), %xmm4 movdqa %xmm4, %xmm5 pand CONST_0F(%rip), %xmm4 psrlw $(8), %xmm5 paddw %xmm4, %xmm5 paddw CONST_1(%rip), %xmm5 psrlw $(1), %xmm5 packuswb %xmm5, %xmm5 movq %xmm5, (%rsi) add $(16), %rdi add $(8), %rsi sub $(8), %rdx LL4gas_1: add $(4), %rdx jl LL3gas_1 movq (%rdi), %xmm6 movdqa %xmm6, %xmm7 pand CONST_0F(%rip), %xmm6 psrlw $(8), %xmm7 paddw %xmm6, %xmm7 paddw CONST_1(%rip), %xmm7 psrlw $(1), %xmm7 packuswb %xmm7, %xmm7 movd %xmm7, (%rsi) add $(8), %rdi add $(4), %rsi sub $(4), %rdx LL3gas_1: add $(4), %rdx jle Lexitgas_1 LL1gas_1: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rsi) add $(2), %rdi add $(1), %rsi sub $(1), %rdx jnz LL1gas_1 Lexitgas_1: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpj_SampleDownH2V2_JPEG_8u_C1 mfxownpj_SampleDownH2V2_JPEG_8u_C1: push %rbp push %rbx mov %ecx, %ecx test $(1), %rdi jne LL1gas_2 mov %rdx, %rbp and $(15), %rbp jz LRungas_2 sub $(16), %rbp neg %rbp cmp %rbp, %rcx jle LRungas_2 sub %rbp, %rcx LLNgas_2: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (3)(%rbx,%rax), %rax movzbq (%rdi,%rsi), %rbx lea (%rbx,%rax), %rax movzbq (1)(%rdi,%rsi), %rbx lea (%rbx,%rax), %rax shr $(2), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx sub $(1), %rbp jnz LLNgas_2 LRungas_2: test $(15), %rdi jnz LNAgas_2 sub $(16), %rcx jl LL8gas_2 LL16gas_2: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqu (%rdi,%rsi), %xmm4 movdqu (16)(%rdi,%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_3(%rip), %xmm0 paddw CONST_3(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(16), %rcx jge LL16gas_2 LL8gas_2: add $(8), %rcx jl LL4gas_2 movdqa (%rdi), %xmm0 movdqu (%rdi,%rsi), %xmm1 movdqa %xmm0, %xmm4 movdqa %xmm1, %xmm5 pand CONST_0F(%rip), %xmm4 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm1 paddw %xmm4, %xmm0 paddw %xmm5, %xmm1 paddw %xmm1, %xmm0 paddw CONST_3(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rdx) add $(16), %rdi add $(8), %rdx sub $(8), %rcx jmp LL4gas_2 LNAgas_2: sub $(16), %rcx jl LL8ngas_2 LL16ngas_2: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqu (%rdi,%rsi), %xmm4 movdqu (16)(%rdi,%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_3(%rip), %xmm0 paddw CONST_3(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(16), %rcx jge LL16ngas_2 LL8ngas_2: add $(8), %rcx jl LL4gas_2 lddqu (%rdi), %xmm0 movdqu (%rdi,%rsi), %xmm1 movdqa %xmm0, %xmm4 movdqa %xmm1, %xmm5 pand CONST_0F(%rip), %xmm4 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm1 paddw %xmm4, %xmm0 paddw %xmm5, %xmm1 paddw %xmm1, %xmm0 paddw CONST_3(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rdx) add $(16), %rdi add $(8), %rdx sub $(8), %rcx LL4gas_2: add $(4), %rcx jl LL3gas_2 movq (%rdi), %xmm2 movq (%rdi,%rsi), %xmm3 movdqa %xmm2, %xmm6 movdqa %xmm3, %xmm7 pand CONST_0F(%rip), %xmm6 pand CONST_0F(%rip), %xmm7 psrlw $(8), %xmm2 psrlw $(8), %xmm3 paddw %xmm6, %xmm2 paddw %xmm7, %xmm3 paddw %xmm3, %xmm2 paddw CONST_3(%rip), %xmm2 psrlw $(2), %xmm2 packuswb %xmm2, %xmm2 movd %xmm2, (%rdx) add $(8), %rdi add $(4), %rdx sub $(4), %rcx LL3gas_2: add $(4), %rcx jle Lexitgas_2 LL1gas_2: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbp lea (3)(%rbp,%rax), %rax movzbq (%rdi,%rsi), %rbx movzbq (1)(%rdi,%rsi), %rbp add %rbp, %rbx add %rbx, %rax shr $(2), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx sub $(1), %rcx jnz LL1gas_2 Lexitgas_2: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1 mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1: push %rbp push %rbx mov %esi, %esi cmp $(2), %rsi je Lend1gas_3 cmp $(4), %rsi je Lend2gas_3 cmp $(6), %rsi je Lend3gas_3 cmp $(8), %rsi je Lend4gas_3 cmp $(10), %rsi je Lend5gas_3 cmp $(12), %rsi je Lend6gas_3 cmp $(14), %rsi je Lend7gas_3 mov %rdx, %rbp and $(15), %rbp jz LRungas_3 sub $(16), %rbp neg %rbp sub %rbp, %rsi sub %rbp, %rsi test $(1), %rbp je LL2ngas_3 movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx sub $(1), %rbp jz LRunOgas_3 LL2nOgas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) movzbq (2)(%rdi), %rax movzbq (3)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (1)(%rdx) add $(4), %rdi add $(2), %rdx sub $(2), %rbp jnz LL2nOgas_3 jmp LRunOgas_3 LL2ngas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) movzbq (2)(%rdi), %rax movzbq (3)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (1)(%rdx) add $(4), %rdi add $(2), %rdx sub $(2), %rbp jnz LL2ngas_3 LRungas_3: test $(15), %rdi jnz LNAgas_3 sub $(64), %rsi jl LL32gas_3 LL64gas_3: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa (32)(%rdi), %xmm4 movdqa (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_x1(%rip), %xmm0 paddw CONST_x1(%rip), %xmm2 paddw CONST_x1(%rip), %xmm4 paddw CONST_x1(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rdx) movdqa %xmm4, (16)(%rdx) add $(64), %rdi add $(32), %rdx sub $(64), %rsi jge LL64gas_3 LL32gas_3: add $(32), %rsi jl LL16gas_3 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_x1(%rip), %xmm0 paddw CONST_x1(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(32), %rsi LL16gas_3: add $(16), %rsi jl LL8gas_3 movdqa (%rdi), %xmm5 movdqa %xmm5, %xmm7 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm7 paddw %xmm5, %xmm7 paddw CONST_x1(%rip), %xmm7 psrlw $(1), %xmm7 packuswb %xmm7, %xmm7 movq %xmm7, (%rdx) add $(16), %rdi add $(8), %rdx sub $(16), %rsi jmp LL8gas_3 LNAgas_3: sub $(64), %rsi jl LL32ngas_3 LL64ngas_3: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 lddqu (32)(%rdi), %xmm4 lddqu (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_x1(%rip), %xmm0 paddw CONST_x1(%rip), %xmm2 paddw CONST_x1(%rip), %xmm4 paddw CONST_x1(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rdx) movdqa %xmm4, (16)(%rdx) add $(64), %rdi add $(32), %rdx sub $(64), %rsi jge LL64ngas_3 LL32ngas_3: add $(32), %rsi jl LL16ngas_3 lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_x1(%rip), %xmm0 paddw CONST_x1(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(32), %rsi LL16ngas_3: add $(16), %rsi jl LL8gas_3 lddqu (%rdi), %xmm5 movdqa %xmm5, %xmm7 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm7 paddw %xmm5, %xmm7 paddw CONST_x1(%rip), %xmm7 psrlw $(1), %xmm7 packuswb %xmm7, %xmm7 movq %xmm7, (%rdx) add $(16), %rdi add $(8), %rdx sub $(16), %rsi LL8gas_3: add $(8), %rsi jl LL4gas_3 movq (%rdi), %xmm4 movdqa %xmm4, %xmm5 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm5 paddw %xmm5, %xmm4 paddw CONST_x1(%rip), %xmm4 psrlw $(1), %xmm4 packuswb %xmm4, %xmm4 movd %xmm4, (%rdx) add $(8), %rdi add $(4), %rdx sub $(8), %rsi LL4gas_3: add $(4), %rsi jl LL2gas_3 movd (%rdi), %xmm6 movdqa %xmm6, %xmm7 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm7 paddw %xmm7, %xmm6 paddw CONST_x1(%rip), %xmm6 psrlw $(1), %xmm6 packuswb %xmm6, %xmm6 movd %xmm6, %eax movw %ax, (%rdx) add $(4), %rdi add $(2), %rdx sub $(4), %rsi LL2gas_3: add $(2), %rsi jl Lexitgas_3 movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) jmp Lexitgas_3 LRunOgas_3: test $(15), %rdi jnz LNAOgas_3 sub $(64), %rsi jl LL32Ogas_3 LL64Ogas_3: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa (32)(%rdi), %xmm4 movdqa (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_1x(%rip), %xmm0 paddw CONST_1x(%rip), %xmm2 paddw CONST_1x(%rip), %xmm4 paddw CONST_1x(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rdx) movdqa %xmm4, (16)(%rdx) add $(64), %rdi add $(32), %rdx sub $(64), %rsi jge LL64Ogas_3 LL32Ogas_3: add $(32), %rsi jl LL16Ogas_3 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_1x(%rip), %xmm0 paddw CONST_1x(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(32), %rsi LL16Ogas_3: add $(16), %rsi jl LL8Ogas_3 movdqa (%rdi), %xmm5 movdqa %xmm5, %xmm7 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm7 paddw %xmm5, %xmm7 paddw CONST_1x(%rip), %xmm7 psrlw $(1), %xmm7 packuswb %xmm7, %xmm7 movq %xmm7, (%rdx) add $(16), %rdi add $(8), %rdx sub $(16), %rsi jmp LL8Ogas_3 LNAOgas_3: sub $(64), %rsi jl LL32nOgas_3 LL64nOgas_3: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 lddqu (32)(%rdi), %xmm4 lddqu (48)(%rdi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw CONST_1x(%rip), %xmm0 paddw CONST_1x(%rip), %xmm2 paddw CONST_1x(%rip), %xmm4 paddw CONST_1x(%rip), %xmm6 psrlw $(1), %xmm0 psrlw $(1), %xmm2 psrlw $(1), %xmm4 psrlw $(1), %xmm6 packuswb %xmm2, %xmm0 packuswb %xmm6, %xmm4 movdqa %xmm0, (%rdx) movdqa %xmm4, (16)(%rdx) add $(64), %rdi add $(32), %rdx sub $(64), %rsi jge LL64nOgas_3 LL32nOgas_3: add $(32), %rsi jl LL16nOgas_3 lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 psrlw $(8), %xmm0 psrlw $(8), %xmm2 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw CONST_1x(%rip), %xmm0 paddw CONST_1x(%rip), %xmm2 psrlw $(1), %xmm0 psrlw $(1), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rdx) add $(32), %rdi add $(16), %rdx sub $(32), %rsi LL16nOgas_3: add $(16), %rsi jl LL8Ogas_3 lddqu (%rdi), %xmm5 movdqa %xmm5, %xmm7 pand CONST_0F(%rip), %xmm5 psrlw $(8), %xmm7 paddw %xmm5, %xmm7 paddw CONST_1x(%rip), %xmm7 psrlw $(1), %xmm7 packuswb %xmm7, %xmm7 movq %xmm7, (%rdx) add $(16), %rdi add $(8), %rdx sub $(16), %rsi LL8Ogas_3: add $(8), %rsi jl LL4Ogas_3 movq (%rdi), %xmm4 movdqa %xmm4, %xmm5 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm5 paddw %xmm5, %xmm4 paddw CONST_1x(%rip), %xmm4 psrlw $(1), %xmm4 packuswb %xmm4, %xmm4 movd %xmm4, (%rdx) add $(8), %rdi add $(4), %rdx sub $(8), %rsi LL4Ogas_3: add $(4), %rsi jl LL2Ogas_3 movd (%rdi), %xmm6 movdqa %xmm6, %xmm7 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm7 paddw %xmm7, %xmm6 paddw CONST_1x(%rip), %xmm6 psrlw $(1), %xmm6 packuswb %xmm6, %xmm6 movd %xmm6, %eax movw %ax, (%rdx) add $(4), %rdi add $(2), %rdx sub $(4), %rsi LL2Ogas_3: add $(2), %rsi jl Lexitgas_3 movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) jmp Lexitgas_3 Lend7gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend6gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend5gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend4gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend3gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend2gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx lea (1)(%rbx,%rax), %rax shr $(1), %rax movb %al, (%rdx) add $(2), %rdi add $(1), %rdx Lend1gas_3: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax shr $(1), %rax movb %al, (%rdx) Lexitgas_3: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownpj_SampleDownRowH2V2_Box_JPEG_8u_C1 mfxownpj_SampleDownRowH2V2_Box_JPEG_8u_C1: push %rbp push %rbx mov %edx, %edx mov %rcx, %rbp and $(15), %rbp jz LRungas_4 sub $(16), %rbp neg %rbp sub %rbp, %rdx cmp %rbp, %rdx jle LRungas_4 sub %rbp, %rdx test $(1), %rbp je LL2ngas_4 movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax movzbq (%rsi), %r8 movzbq (1)(%rsi), %rbx add %r8, %rbx lea (1)(%rbx,%rax), %rax shr $(2), %rax movb %al, (%rcx) add $(2), %rdi add $(2), %rsi add $(1), %rcx sub $(1), %rbp jz LRunOgas_4 LL2nOgas_4: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax movzbq (%rsi), %r8 movzbq (1)(%rsi), %rbx add %r8, %rbx lea (2)(%rbx,%rax), %rax shr $(2), %rax movb %al, (%rcx) movzbq (2)(%rdi), %rax movzbq (3)(%rdi), %rbx add %rbx, %rax movzbq (2)(%rsi), %r8 movzbq (3)(%rsi), %rbx add %r8, %rbx lea (1)(%rbx,%rax), %rax shr $(2), %rax movb %al, (1)(%rcx) add $(4), %rdi add $(4), %rsi add $(2), %rcx sub $(2), %rbp jnz LL2nOgas_4 jmp LRunOgas_4 LL2ngas_4: movzbq (%rdi), %rax movzbq (1)(%rdi), %rbx add %rbx, %rax movzbq (%rsi), %r8 movzbq (1)(%rsi), %rbx add %r8, %rbx lea (1)(%rbx,%rax), %rax shr $(2), %rax movb %al, (%rcx) movzbq (2)(%rdi), %rax movzbq (3)(%rdi), %rbx add %rbx, %rax movzbq (2)(%rsi), %r8 movzbq (3)(%rsi), %rbx add %r8, %rbx lea (2)(%rbx,%rax), %rax shr $(2), %rax movb %al, (1)(%rcx) add $(4), %rdi add $(4), %rsi add $(2), %rcx sub $(2), %rbp jnz LL2ngas_4 LRungas_4: test $(15), %rdi jnz LNAgas_4 test $(15), %rsi jnz LNAgas_4 sub $(32), %rdx jl LL16gas_4 LL32gas_4: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa (%rsi), %xmm4 movdqa (16)(%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_x3(%rip), %xmm0 paddw CONST_x3(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rcx) add $(32), %rdi add $(32), %rsi add $(16), %rcx sub $(32), %rdx jge LL32gas_4 LL16gas_4: add $(16), %rdx jl LL8gas_4 movdqa (%rdi), %xmm0 movdqa (%rsi), %xmm4 movdqa %xmm0, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm0 paddw %xmm5, %xmm4 paddw %xmm4, %xmm0 paddw CONST_x3(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rcx) add $(16), %rdi add $(16), %rsi add $(8), %rcx sub $(16), %rdx jmp LL8gas_4 LNAgas_4: sub $(32), %rdx jl LL16ngas_4 LL32ngas_4: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqu (%rsi), %xmm4 movdqu (16)(%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_x3(%rip), %xmm0 paddw CONST_x3(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rcx) add $(32), %rdi add $(32), %rsi add $(16), %rcx sub $(32), %rdx jge LL32ngas_4 LL16ngas_4: add $(16), %rdx jl LL8gas_4 lddqu (%rdi), %xmm0 movdqu (%rsi), %xmm4 movdqa %xmm0, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm0 paddw %xmm5, %xmm4 paddw %xmm4, %xmm0 paddw CONST_x3(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rcx) add $(16), %rdi add $(16), %rsi add $(8), %rcx sub $(16), %rdx LL8gas_4: add $(8), %rdx jl LL4gas_4 movq (%rdi), %xmm3 movq (%rsi), %xmm4 movdqa %xmm3, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm3 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm3 paddw %xmm5, %xmm4 paddw %xmm4, %xmm3 paddw CONST_x3(%rip), %xmm3 psrlw $(2), %xmm3 packuswb %xmm3, %xmm3 movd %xmm3, (%rcx) add $(8), %rdi add $(8), %rsi add $(4), %rcx sub $(8), %rdx LL4gas_4: add $(4), %rdx jl LL2gas_4 movd (%rdi), %xmm6 movd (%rsi), %xmm4 movdqa %xmm6, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm6 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm6 paddw %xmm5, %xmm4 paddw %xmm4, %xmm6 paddw CONST_x3(%rip), %xmm6 psrlw $(2), %xmm6 packuswb %xmm6, %xmm6 movd %xmm6, %eax movw %ax, (%rcx) add $(4), %rdi add $(4), %rsi add $(2), %rcx sub $(4), %rdx LL2gas_4: add $(2), %rdx jl Lexitgas_4 movzwq (%rdi), %rax movzwq (%rsi), %rbx movd %eax, %xmm7 movd %ebx, %xmm4 movdqa %xmm7, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm7 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm7 paddw %xmm5, %xmm4 paddw %xmm4, %xmm7 paddw CONST_x3(%rip), %xmm7 psrlw $(2), %xmm7 packuswb %xmm7, %xmm7 movd %xmm7, %eax movb %al, (%rcx) jmp Lexitgas_4 LRunOgas_4: test $(15), %rdi jnz LNAOgas_4 test $(15), %rsi jnz LNAOgas_4 sub $(32), %rdx jl LL16Ogas_4 LL32Ogas_4: movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm2 movdqa (%rsi), %xmm4 movdqa (16)(%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_3x(%rip), %xmm0 paddw CONST_3x(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rcx) add $(32), %rdi add $(32), %rsi add $(16), %rcx sub $(32), %rdx jge LL32Ogas_4 LL16Ogas_4: add $(16), %rdx jl LL8Ogas_4 movdqa (%rdi), %xmm0 movdqa (%rsi), %xmm4 movdqa %xmm0, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm0 paddw %xmm5, %xmm4 paddw %xmm4, %xmm0 paddw CONST_3x(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rcx) add $(16), %rdi add $(16), %rsi add $(8), %rcx sub $(16), %rdx jmp LL8Ogas_4 LNAOgas_4: sub $(32), %rdx jl LL16nOgas_4 LL32nOgas_4: lddqu (%rdi), %xmm0 lddqu (16)(%rdi), %xmm2 movdqu (%rsi), %xmm4 movdqu (16)(%rsi), %xmm6 movdqa %xmm0, %xmm1 movdqa %xmm2, %xmm3 movdqa %xmm4, %xmm5 movdqa %xmm6, %xmm7 psrlw $(8), %xmm0 psrlw $(8), %xmm2 psrlw $(8), %xmm4 psrlw $(8), %xmm6 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm3 pand CONST_0F(%rip), %xmm5 pand CONST_0F(%rip), %xmm7 paddw %xmm1, %xmm0 paddw %xmm3, %xmm2 paddw %xmm5, %xmm4 paddw %xmm7, %xmm6 paddw %xmm4, %xmm0 paddw %xmm6, %xmm2 paddw CONST_3x(%rip), %xmm0 paddw CONST_3x(%rip), %xmm2 psrlw $(2), %xmm0 psrlw $(2), %xmm2 packuswb %xmm2, %xmm0 movdqa %xmm0, (%rcx) add $(32), %rdi add $(32), %rsi add $(16), %rcx sub $(32), %rdx jge LL32nOgas_4 LL16nOgas_4: add $(16), %rdx jl LL8Ogas_4 lddqu (%rdi), %xmm0 movdqu (%rsi), %xmm4 movdqa %xmm0, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm0 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm0 paddw %xmm5, %xmm4 paddw %xmm4, %xmm0 paddw CONST_3x(%rip), %xmm0 psrlw $(2), %xmm0 packuswb %xmm0, %xmm0 movq %xmm0, (%rcx) add $(16), %rdi add $(16), %rsi add $(8), %rcx sub $(16), %rdx LL8Ogas_4: add $(8), %rdx jl LL4Ogas_4 movq (%rdi), %xmm3 movq (%rsi), %xmm4 movdqa %xmm3, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm3 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm3 paddw %xmm5, %xmm4 paddw %xmm4, %xmm3 paddw CONST_3x(%rip), %xmm3 psrlw $(2), %xmm3 packuswb %xmm3, %xmm3 movd %xmm3, (%rcx) add $(8), %rdi add $(8), %rsi add $(4), %rcx sub $(8), %rdx LL4Ogas_4: add $(4), %rdx jl LL2Ogas_4 movd (%rdi), %xmm6 movd (%rsi), %xmm4 movdqa %xmm6, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm6 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm6 paddw %xmm5, %xmm4 paddw %xmm4, %xmm6 paddw CONST_3x(%rip), %xmm6 psrlw $(2), %xmm6 packuswb %xmm6, %xmm6 movd %xmm6, %eax movw %ax, (%rcx) add $(4), %rdi add $(4), %rsi add $(2), %rcx sub $(4), %rdx LL2Ogas_4: add $(2), %rdx jl Lexitgas_4 movzwq (%rdi), %rax movzwq (%rsi), %rbx movd %eax, %xmm7 movd %ebx, %xmm4 movdqa %xmm7, %xmm1 movdqa %xmm4, %xmm5 psrlw $(8), %xmm7 psrlw $(8), %xmm4 pand CONST_0F(%rip), %xmm1 pand CONST_0F(%rip), %xmm5 paddw %xmm1, %xmm7 paddw %xmm5, %xmm4 paddw %xmm4, %xmm7 paddw CONST_3x(%rip), %xmm7 psrlw $(2), %xmm7 packuswb %xmm7, %xmm7 movd %xmm7, %eax movb %al, (%rcx) Lexitgas_4: pop %rbx pop %rbp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pscopyu8as.s000066400000000000000000000430521443134507600267410ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data TableCacheSize: .byte 0xec, 0xc3 .byte 0xeb, 0x93 .byte 0x4d, 0x16 .byte 0xea, 0x34 .byte 0x4c, 0x34 .byte 0xe4, 0x15 .byte 0xde, 0x15 .byte 0x4b, 0x15 .byte 0x47, 0x15 .byte 0x4e, 0x33 .byte 0x4a, 0x33 .byte 0xe3, 0x14 .byte 0xdd, 0x14 .byte 0xd8, 0x14 .byte 0x49, 0x14 .byte 0x29, 0x14 .byte 0x46, 0x14 .byte 0x48, 0x32 .byte 0xe2, 0x13 .byte 0xdc, 0x13 .byte 0xd7, 0x13 .byte 0xd2, 0x13 .byte 0x25, 0x13 .byte 0x7d, 0x13 .byte 0x85, 0x13 .byte 0x45, 0x13 .byte 0xd6, 0x12 .byte 0xd1, 0x12 .byte 0x23, 0x12 .byte 0x87, 0x12 .byte 0x7c, 0x12 .byte 0x78, 0x12 .byte 0x84, 0x12 .byte 0x44, 0x12 .byte 0xd0, 0x11 .byte 0x22, 0x11 .byte 0x7b, 0x11 .byte 0x80, 0x11 .byte 0x86, 0x11 .byte 0x3e, 0x11 .byte 0x7f, 0x11 .byte 0x83, 0x11 .byte 0x43, 0x11 .byte 0 .text .p2align 4, 0x90 .globl mfxownsCopy_8u mfxownsCopy_8u: push %rbx mov %rsi, %r9 movslq %edx, %r10 cmp $(64), %r10 jge LLongCopy8u_00gas_1 LShortCopy8u_32gas_1: test $(32), %r10 jz LShortCopy8u_16gas_1 movq (%rdi), %xmm0 movq (8)(%rdi), %xmm1 movq (16)(%rdi), %xmm2 movq (24)(%rdi), %xmm3 add $(32), %rdi movq %xmm0, (%r9) movq %xmm1, (8)(%r9) movq %xmm2, (16)(%r9) movq %xmm3, (24)(%r9) add $(32), %r9 sub $(32), %r10 jz LExitCopy8u_00gas_1 LShortCopy8u_16gas_1: test $(16), %r10 jz LShortCopy8u_08gas_1 movq (%rdi), %xmm0 movq (8)(%rdi), %xmm1 add $(16), %rdi movq %xmm0, (%r9) movq %xmm1, (8)(%r9) add $(16), %r9 sub $(16), %r10 jz LExitCopy8u_00gas_1 LShortCopy8u_08gas_1: test $(8), %r10 jz LShortCopy8u_04gas_1 movq (%rdi), %xmm0 add $(8), %rdi movq %xmm0, (%r9) add $(8), %r9 sub $(8), %r10 jz LExitCopy8u_00gas_1 LShortCopy8u_04gas_1: test $(4), %r10 jz LShortCopy8u_03gas_1 mov (%rdi), %ebx add $(4), %rdi mov %ebx, (%r9) add $(4), %r9 sub $(4), %r10 LShortCopy8u_03gas_1: test %r10, %r10 jz LExitCopy8u_00gas_1 movzbl (-1)(%r10,%rdi), %ebx mov %bl, (-1)(%r10,%r9) sub $(1), %r10 jz LExitCopy8u_00gas_1 movzbl (-1)(%r10,%rdi), %ebx mov %bl, (-1)(%r10,%r9) sub $(1), %r10 jz LExitCopy8u_00gas_1 movzbl (-1)(%r10,%rdi), %ebx mov %bl, (-1)(%r10,%r9) LExitCopy8u_00gas_1: mov %rsi, %rax pop %rbx ret LLongCopy8u_00gas_1: test $(15), %r9 jnz LAlignCopy8u_00gas_1 LCheckCopy8u_00gas_1: cmp $(1048576), %r10 jge LGetCacheSize00gas_1 LCheckCopy8u_01gas_1: test $(15), %rdi jnz LCheckCopy8u_02gas_1 LCheckAliasingCopy8u_00gas_1: mov %rdi, %rbx mov %r9, %rax and $(4095), %rbx and $(4095), %rax sub %rax, %rbx je LInv00Copy8u_00gas_1 cmp $(160), %rbx jg LInv00Copy8u_00gas_1 cmp $(-3936), %rbx jl LFwd00Copy8u_00gas_1 cmp $(0), %rbx jg LFwd00Copy8u_00gas_1 LInv00Copy8u_00gas_1: test $(1), %r10 jz LInv00Copy8u_01gas_1 movzbl (-1)(%r10,%rdi), %ebx mov %bl, (-1)(%r10,%r9) sub $(1), %r10 LInv00Copy8u_01gas_1: test $(2), %r10 jz LInv00Copy8u_02gas_1 movzwl (-2)(%r10,%rdi), %ebx mov %bx, (-2)(%r10,%r9) sub $(2), %r10 LInv00Copy8u_02gas_1: test $(4), %r10 jz LInv00Copy8u_03gas_1 movl (-4)(%r10,%rdi), %ebx mov %ebx, (-4)(%r10,%r9) sub $(4), %r10 LInv00Copy8u_03gas_1: test $(8), %r10 jz LInv00Copy8u_04gas_1 movq (-8)(%r10,%rdi), %xmm0 movq %xmm0, (-8)(%r10,%r9) sub $(8), %r10 LInv00Copy8u_04gas_1: test $(16), %r10 jz LInv00Copy8u_05gas_1 movdqa (-16)(%r10,%rdi), %xmm0 movdqa %xmm0, (-16)(%r10,%r9) sub $(16), %r10 LInv00Copy8u_05gas_1: test $(32), %r10 jz LInv00Copy8u_06gas_1 movdqa (-16)(%r10,%rdi), %xmm0 movdqa (-32)(%r10,%rdi), %xmm1 movdqa %xmm0, (-16)(%r10,%r9) movdqa %xmm1, (-32)(%r10,%r9) sub $(32), %r10 jz LExitInv00Copy8u_00gas_1 jmp LInv00Copy8u_06gas_1 .p2align 4, 0x90 LInv00Copy8u_06gas_1: movdqa (-16)(%r10,%rdi), %xmm0 movdqa %xmm0, (-16)(%r10,%r9) movdqa (-32)(%r10,%rdi), %xmm0 movdqa %xmm0, (-32)(%r10,%r9) movdqa (-48)(%r10,%rdi), %xmm0 movdqa %xmm0, (-48)(%r10,%r9) movdqa (-64)(%r10,%rdi), %xmm0 movdqa %xmm0, (-64)(%r10,%r9) sub $(64), %r10 jnz LInv00Copy8u_06gas_1 LExitInv00Copy8u_00gas_1: mov %rsi, %rax pop %rbx ret LFwd00Copy8u_00gas_1: sub $(64), %r10 .p2align 4, 0x90 LFwd00Copy8u_01gas_1: movdqa (%rdi), %xmm0 movdqa %xmm0, (%r9) movdqa (16)(%rdi), %xmm0 movdqa %xmm0, (16)(%r9) movdqa (32)(%rdi), %xmm0 movdqa %xmm0, (32)(%r9) movdqa (48)(%rdi), %xmm0 movdqa %xmm0, (48)(%r9) add $(64), %rdi add $(64), %r9 sub $(64), %r10 jge LFwd00Copy8u_01gas_1 add $(64), %r10 jz LExitFwd00Copy8u_00gas_1 test $(32), %r10 jz LFwd00Copy8u_02gas_1 movdqa (%rdi), %xmm0 movdqa (16)(%rdi), %xmm1 add $(32), %rdi movdqa %xmm0, (%r9) movdqa %xmm1, (16)(%r9) add $(32), %r9 sub $(32), %r10 jz LExitFwd00Copy8u_00gas_1 LFwd00Copy8u_02gas_1: test $(16), %r10 jz LFwd00Copy8u_03gas_1 movdqa (%rdi), %xmm0 movdqa %xmm0, (%r9) add $(16), %rdi add $(16), %r9 sub $(16), %r10 jz LExitFwd00Copy8u_00gas_1 LFwd00Copy8u_03gas_1: test $(8), %r10 jz LFwd00Copy8u_04gas_1 movq (%rdi), %xmm0 movq %xmm0, (%r9) add $(8), %rdi add $(8), %r9 sub $(8), %r10 jz LExitFwd00Copy8u_00gas_1 LFwd00Copy8u_04gas_1: test $(4), %r10 jz LFwd00Copy8u_05gas_1 mov (%rdi), %ebx mov %ebx, (%r9) add $(4), %rdi add $(4), %r9 sub $(4), %r10 jz LExitFwd00Copy8u_00gas_1 LFwd00Copy8u_05gas_1: test $(2), %r10 jz LFwd00Copy8u_06gas_1 movzwl (%rdi), %ebx mov %bx, (%r9) add $(2), %rdi add $(2), %r9 sub $(2), %r10 jz LExitFwd00Copy8u_00gas_1 LFwd00Copy8u_06gas_1: test %r10, %r10 jz LExitFwd00Copy8u_00gas_1 movzbl (%rdi), %ebx mov %bl, (%r9) LExitFwd00Copy8u_00gas_1: mov %rsi, %rax pop %rbx ret LAlignCopy8u_00gas_1: movdqu (%rdi), %xmm0 mov %r9, %rcx and $(15), %rcx movdqu %xmm0, (%r9) sub $(16), %rcx sub %rcx, %rdi sub %rcx, %r9 add %rcx, %r10 cmp $(64), %r10 jl LShortCopy8u_32gas_1 test $(15), %rdi jz LCheckAliasingCopy8u_00gas_1 cmp $(1048576), %r10 jge LGetCacheSize00gas_1 LCheckCopy8u_02gas_1: test $(3), %rdi jz LCheckCopy8u_03gas_1 LLoopX0Copy8u_00gas_1: sub $(64), %r10 LLoopX0Copy8u_01gas_1: movdqu (%rdi), %xmm0 movdqu (16)(%rdi), %xmm1 movdqu (32)(%rdi), %xmm2 movdqu (48)(%rdi), %xmm3 add $(64), %rdi movdqa %xmm0, (%r9) movdqa %xmm1, (16)(%r9) movdqa %xmm2, (32)(%r9) movdqa %xmm3, (48)(%r9) add $(64), %r9 sub $(64), %r10 jge LLoopX0Copy8u_01gas_1 add $(64), %r10 jnz LShortCopy8u_32gas_1 jmp LExitCopy8u_00gas_1 LCheckCopy8u_03gas_1: movdqu (%rdi), %xmm0 movdqa %xmm0, (%r9) add $(16), %rdi add $(16), %r9 sub $(32), %r10 mov $(-16), %rbx mov %rdi, %rax and %rdi, %rbx and $(15), %rax cmp $(12), %rax je LLoop12Copy8u_00gas_1 cmp $(8), %rax je LLoop08Copy8u_00gas_1 mov %r9, %rax sub $(64), %r10 jl LEndNotAlignCopy_00gas_1 LLoop04Copy8u_00gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(4), %xmm3, %xmm4 palignr $(4), %xmm2, %xmm3 palignr $(4), %xmm1, %xmm2 palignr $(4), %xmm0, %xmm1 movdqa %xmm1, (%r9) movdqa %xmm2, (16)(%r9) movdqa %xmm3, (32)(%r9) movdqa %xmm4, (48)(%r9) add $(64), %r9 sub $(64), %r10 jge LLoop04Copy8u_00gas_1 jmp LEndNotAlignCopy_00gas_1 LLoop08Copy8u_00gas_1: mov %r9, %rax sub $(64), %r10 jl LEndNotAlignCopy_00gas_1 LLoop08Copy8u_01gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(8), %xmm3, %xmm4 palignr $(8), %xmm2, %xmm3 palignr $(8), %xmm1, %xmm2 palignr $(8), %xmm0, %xmm1 movdqa %xmm1, (%r9) movdqa %xmm2, (16)(%r9) movdqa %xmm3, (32)(%r9) movdqa %xmm4, (48)(%r9) add $(64), %r9 sub $(64), %r10 jge LLoop08Copy8u_01gas_1 jmp LEndNotAlignCopy_00gas_1 LLoop12Copy8u_00gas_1: mov %r9, %rax sub $(64), %r10 jl LEndNotAlignCopy_00gas_1 LLoop12Copy8u_01gas_1: movdqa (%rbx), %xmm0 movdqa (16)(%rbx), %xmm1 movdqa (32)(%rbx), %xmm2 movdqa (48)(%rbx), %xmm3 movdqa (64)(%rbx), %xmm4 add $(64), %rbx palignr $(12), %xmm3, %xmm4 palignr $(12), %xmm2, %xmm3 palignr $(12), %xmm1, %xmm2 palignr $(12), %xmm0, %xmm1 movdqa %xmm1, (%r9) movdqa %xmm2, (16)(%r9) movdqa %xmm3, (32)(%r9) movdqa %xmm4, (48)(%r9) add $(64), %r9 sub $(64), %r10 jge LLoop12Copy8u_01gas_1 LEndNotAlignCopy_00gas_1: add $(80), %r10 sub %r9, %rax sub %rax, %rdi cmp $(64), %r10 jl LShortCopy8u_32gas_1 jmp LLoopX0Copy8u_00gas_1 LGetCacheSize00gas_1: lea TableCacheSize(%rip), %rbx sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rbx, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_1 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_1 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_1 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_1 test $(2147483648), %eax jz LCacheSizeMacro00gas_1 xor %eax, %eax LCacheSizeMacro00gas_1: test $(2147483648), %ebx jz LCacheSizeMacro01gas_1 xor %ebx, %ebx LCacheSizeMacro01gas_1: test $(2147483648), %ecx jz LCacheSizeMacro02gas_1 xor %ecx, %ecx LCacheSizeMacro02gas_1: test $(2147483648), %edx jz LCacheSizeMacro03gas_1 xor %edx, %edx LCacheSizeMacro03gas_1: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_1 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_1: test %ebx, %ebx jz LCacheSizeMacro05gas_1 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_1: test %ecx, %ecx jz LCacheSizeMacro06gas_1 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_1: test %edx, %edx jz LCacheSizeMacro07gas_1 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_1: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_1 LCacheSizeMacro08gas_1: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_1 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_1: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_1 sub $(1), %ecx jnz LCacheSizeMacro09gas_1 jmp LCacheSizeMacro08gas_1 LCacheSizeMacro10gas_1: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_1 LCacheSizeMacro11gas_1: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_1: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rbx add $(64), %rsp cmp $(-1), %rbx je LCheckCopy8u_01gas_1 shr $(1), %rbx cmp %rbx, %r10 jl LCheckCopy8u_01gas_1 LPrefLoopCopy8uNt_00gas_1: sub $(262144), %r10 jl LLoopCopy8uNt_02gas_1 mov $(4096), %r8d LPrefLoopCopy8uNt_01gas_1: movzbl (%rdi), %ebx add $(64), %rdi sub $(1), %r8d jnz LPrefLoopCopy8uNt_01gas_1 sub $(262144), %rdi mov $(262144), %r8d LLoopCopy8uNt_01gas_1: movdqu (%rdi), %xmm0 add $(16), %rdi movntdq %xmm0, (%r9) add $(16), %r9 sub $(16), %r8d jnz LLoopCopy8uNt_01gas_1 jmp LPrefLoopCopy8uNt_00gas_1 LLoopCopy8uNt_02gas_1: add $(262144), %r10 jz LExitCopy8uNt_02gas_1 mov %r10, %r8 jmp LLoopCopy8uNt_04gas_1 LLoopCopy8uNt_03gas_1: movzbl (%r8,%rdi), %ebx LLoopCopy8uNt_04gas_1: sub $(64), %r8 jge LLoopCopy8uNt_03gas_1 sub $(16), %r10 jl LExitCopy8uNt_00gas_1 LLoopCopy8uNt_05gas_1: movdqu (%rdi), %xmm0 add $(16), %rdi movntdq %xmm0, (%r9) add $(16), %r9 sub $(16), %r10 jge LLoopCopy8uNt_05gas_1 LExitCopy8uNt_00gas_1: sfence add $(16), %r10 jnz LShortCopy8u_32gas_1 LExitCopy8uNt_01gas_1: mov %rsi, %rax pop %rbx ret LExitCopy8uNt_02gas_1: sfence jmp LExitCopy8uNt_01gas_1 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pscpudef32eas.s000066400000000000000000000077741443134507600273050ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .globl mfxhas_cpuid mfxhas_cpuid: mov $(1), %rax ret .globl mfxmax_cpuid_input mfxmax_cpuid_input: push %rbx xor %rax, %rax cpuid pop %rbx ret .globl mfxis_GenuineIntel mfxis_GenuineIntel: push %rbx xor %rax, %rax cpuid xor %rax, %rax cmp $(1818588270), %ecx jne Lfalsegas_18 cmp $(1231384169), %edx jne Lfalsegas_18 cmp $(1970169159), %ebx jne Lfalsegas_18 mov $(1), %rax Lfalsegas_18: pop %rbx ret .globl mfxownGetCacheSize mfxownGetCacheSize: push %rbx push %rbp sub $(24), %rsp mov %rsp, %rbp xor %esi, %esi mov $(2), %eax cpuid cmp $(1), %al jne LGetCacheSize_11gas_36 test $(2147483648), %eax jz LGetCacheSize_00gas_36 xor %eax, %eax LGetCacheSize_00gas_36: test $(2147483648), %ebx jz LGetCacheSize_01gas_36 xor %ebx, %ebx LGetCacheSize_01gas_36: test $(2147483648), %ecx jz LGetCacheSize_02gas_36 xor %ecx, %ecx LGetCacheSize_02gas_36: test $(2147483648), %edx jz LGetCacheSize_03gas_36 xor %edx, %edx LGetCacheSize_03gas_36: test %eax, %eax jz LGetCacheSize_04gas_36 mov %eax, (%rbp) add $(4), %rbp add $(3), %esi LGetCacheSize_04gas_36: test %ebx, %ebx jz LGetCacheSize_05gas_36 mov %ebx, (%rbp) add $(4), %rbp add $(4), %esi LGetCacheSize_05gas_36: test %ecx, %ecx jz LGetCacheSize_06gas_36 mov %ecx, (%rbp) add $(4), %rbp add $(4), %esi LGetCacheSize_06gas_36: test %edx, %edx jz LGetCacheSize_07gas_36 mov %edx, (%rbp) add $(4), %esi LGetCacheSize_07gas_36: test %esi, %esi jz LGetCacheSize_11gas_36 mov $(-1), %eax LGetCacheSize_08gas_36: xor %edx, %edx add (%rdi), %edx jz LExitGetCacheSize00gas_36 add $(8), %rdi mov %esi, %ecx LGetCacheSize_09gas_36: cmpb (%rsp,%rcx), %dl je LGetCacheSize_10gas_36 dec %ecx jnz LGetCacheSize_09gas_36 jmp LGetCacheSize_08gas_36 LGetCacheSize_10gas_36: mov (-4)(%rdi), %eax LExitGetCacheSize00gas_36: add $(24), %rsp pop %rbp pop %rbx ret LGetCacheSize_11gas_36: mov $(-1), %eax jmp LExitGetCacheSize00gas_36 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pscpuinfo32eas.s000066400000000000000000000030121443134507600274570ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .globl mfxownGetReg mfxownGetReg: push %rbx movslq %esi, %rsi movslq %edx, %rdx mov %rsi, %rax mov %rdx, %rcx xor %ebx, %ebx xor %edx, %edx cpuid mov %eax, (%rdi) mov %ebx, (4)(%rdi) mov %ecx, (8)(%rdi) mov %edx, (12)(%rdi) pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/psdivu8as.s000066400000000000000000000344401443134507600265520ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 SINTZ4: xorps %xmm1, %xmm1 cmpeqps %xmm0, %xmm1 movmskps %xmm1, %eax and %eax, %eax jnz SINTZ4_N rcpps %xmm0, %xmm1 mulps %xmm1, %xmm0 movaps %xmm7, %xmm2 subps %xmm0, %xmm2 mulps %xmm1, %xmm4 movaps %xmm2, %xmm0 mulps %xmm4, %xmm2 addps %xmm4, %xmm2 mulps %xmm0, %xmm2 addps %xmm2, %xmm4 ret SINTZ4_N: xorps %xmm5, %xmm5 movaps %xmm7, %xmm3 addps %xmm7, %xmm3 movaps %xmm7, %xmm2 movaps %xmm5, %xmm1 subps %xmm3, %xmm5 addps %xmm3, %xmm2 orps %xmm7, %xmm3 orps %xmm7, %xmm5 orps %xmm3, %xmm2 mov $(4), %eax SINTZ4_N_LP: comiss %xmm0, %xmm1 jz SINTZ4_N_01 divss %xmm0, %xmm4 jmp SINTZ4_N_1 SINTZ4_N_01: mov $(1), %ebp jp SINTZ4_N_02 comiss %xmm4, %xmm1 jz SINTZ4_N_02 movss %xmm3, %xmm4 jc SINTZ4_N_1 movss %xmm5, %xmm4 jmp SINTZ4_N_1 SINTZ4_N_02: movss %xmm2, %xmm4 SINTZ4_N_1: shufps $(57), %xmm0, %xmm0 shufps $(57), %xmm4, %xmm4 dec %eax jg SINTZ4_N_LP ret .p2align 4, 0x90 .globl mfxownippsDivCRev_16u mfxownippsDivCRev_16u: push %rbx sub $(48), %rsp mov %rdi, (%rsp) mov %rsi, (8)(%rsp) mov %rdx, (16)(%rsp) mov %rcx, (24)(%rsp) movq (%rsp), %rsi movzwl (8)(%rsp), %edx movq (16)(%rsp), %rdi movslq (24)(%rsp), %rcx mov $(1065353216), %eax movd %eax, %xmm6 cvtsi2ss %edx, %xmm7 shufps $(0), %xmm6, %xmm6 xor %rax, %rax shufps $(0), %xmm7, %xmm7 movaps %xmm6, %xmm8 pxor %xmm6, %xmm6 cmp $(32767), %edx jg LSTART_BVgas_13 LBGN_ZR_LPgas_13: test $(14), %rdi jz LBGN_ZRgas_13 call LSBRT_ZRgas_13 add $(2), %rsi add $(2), %rdi dec %rcx jg LBGN_ZR_LPgas_13 jmp LFINALgas_13 LSBRT_ZRgas_13: movzwl (%rsi), %ebx and %ebx, %ebx jz LBGN_ZR_LP_1gas_13 cvtsi2ss %ebx, %xmm0 movss %xmm7, %xmm1 divss %xmm0, %xmm1 cvtss2si %xmm1, %ebx LBGN_ZR_LP_RT1gas_13: movw %bx, (%rdi) ret LBGN_ZR_LP_1gas_13: mov $(65535), %ebx mov $(1), %eax jmp LBGN_ZR_LP_RT1gas_13 LBGN_ZRgas_13: sub $(8), %rcx jl LGLAST_ZRgas_13 test $(15), %rdi jnz LGLOOP2_ZRgas_13 test $(15), %rsi jnz LGLOOP1_ZRgas_13 jmp LGLOOP0_ZRgas_13 .p2align 4, 0x90 LGLOOP0_ZRgas_13: movdqa (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm7, %xmm0 subps %xmm1, %xmm5 movaps %xmm7, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 por %xmm6, %xmm2 pxor %xmm6, %xmm6 movdqa %xmm2, (-16)(%rdi) jge LGLOOP0_ZRgas_13 jmp LGLAST_ZRgas_13 .p2align 4, 0x90 LGLOOP1_ZRgas_13: movdqu (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm7, %xmm0 subps %xmm1, %xmm5 movaps %xmm7, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 por %xmm6, %xmm2 pxor %xmm6, %xmm6 movdqa %xmm2, (-16)(%rdi) jge LGLOOP1_ZRgas_13 jmp LGLAST_ZRgas_13 .p2align 4, 0x90 LGLOOP2_ZRgas_13: movdqu (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm7, %xmm0 subps %xmm1, %xmm5 movaps %xmm7, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 por %xmm6, %xmm2 pxor %xmm6, %xmm6 movdqu %xmm2, (-16)(%rdi) jge LGLOOP2_ZRgas_13 LGLAST_ZRgas_13: add $(8), %rcx jle LFINALgas_13 LGLAST_ZR_LPgas_13: call LSBRT_ZRgas_13 add $(2), %rsi add $(2), %rdi dec %rcx jg LBGN_ZR_LPgas_13 jmp LFINALgas_13 LSTART_BVgas_13: movaps %xmm7, %xmm9 movd %edx, %xmm0 pcmpeqw %xmm5, %xmm5 punpcklwd %xmm0, %xmm0 psrlw $(15), %xmm5 pshufd $(0), %xmm0, %xmm0 movaps %xmm0, %xmm10 movdqa %xmm5, %xmm11 LBGN_BV_LPgas_13: test $(14), %rdi jz LBGN_BVgas_13 call LSBRT_ZRgas_13 add $(2), %rsi add $(2), %rdi dec %rcx jg LBGN_BV_LPgas_13 jmp LFINALgas_13 LBGN_BVgas_13: movdqa %xmm5, %xmm7 sub $(8), %rcx jl LGLAST_BVgas_13 test $(15), %rdi jnz LGLOOP2_BVgas_13 test $(15), %rsi jnz LGLOOP1_BVgas_13 jmp LGLOOP0_BVgas_13 .p2align 4, 0x90 LGLOOP0_BVgas_13: movdqa (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 pcmpeqw %xmm0, %xmm7 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm9, %xmm0 subps %xmm1, %xmm5 movaps %xmm0, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 psubusw %xmm7, %xmm2 pand %xmm10, %xmm7 por %xmm6, %xmm2 pxor %xmm6, %xmm6 por %xmm7, %xmm2 movdqa %xmm11, %xmm7 movdqa %xmm2, (-16)(%rdi) jge LGLOOP0_BVgas_13 jmp LGLAST_BVgas_13 .p2align 4, 0x90 LGLOOP1_BVgas_13: movdqu (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 pcmpeqw %xmm0, %xmm7 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm9, %xmm0 subps %xmm1, %xmm5 movaps %xmm0, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 psubusw %xmm7, %xmm2 pand %xmm10, %xmm7 por %xmm6, %xmm2 pxor %xmm6, %xmm6 por %xmm7, %xmm2 movdqa %xmm11, %xmm7 movdqa %xmm2, (-16)(%rdi) jge LGLOOP1_BVgas_13 jmp LGLAST_BVgas_13 .p2align 4, 0x90 LGLOOP2_BVgas_13: movdqu (%rsi), %xmm0 movdqa %xmm6, %xmm5 pcmpeqw %xmm0, %xmm6 pcmpeqw %xmm0, %xmm7 psubw %xmm6, %xmm0 movdqa %xmm0, %xmm1 punpcklwd %xmm5, %xmm0 punpckhwd %xmm5, %xmm1 cvtdq2ps %xmm0, %xmm0 cvtdq2ps %xmm1, %xmm1 add $(16), %rdi rcpps %xmm0, %xmm2 movaps %xmm8, %xmm4 rcpps %xmm1, %xmm3 movaps %xmm4, %xmm5 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 pmovmskb %xmm6, %ebx subps %xmm0, %xmm4 movaps %xmm9, %xmm0 subps %xmm1, %xmm5 movaps %xmm0, %xmm1 mulps %xmm2, %xmm0 mulps %xmm3, %xmm1 add $(16), %rsi movaps %xmm4, %xmm2 mulps %xmm0, %xmm4 movaps %xmm5, %xmm3 mulps %xmm1, %xmm5 addps %xmm4, %xmm0 mulps %xmm2, %xmm2 addps %xmm5, %xmm1 mulps %xmm3, %xmm3 mulps %xmm0, %xmm2 mulps %xmm1, %xmm3 or %ebx, %eax addps %xmm0, %xmm2 addps %xmm1, %xmm3 cvtps2dq %xmm2, %xmm2 cvtps2dq %xmm3, %xmm3 sub $(8), %rcx packssdw %xmm3, %xmm2 psubusw %xmm7, %xmm2 pand %xmm10, %xmm7 por %xmm6, %xmm2 pxor %xmm6, %xmm6 por %xmm7, %xmm2 movdqa %xmm11, %xmm7 movdqu %xmm2, (-16)(%rdi) jge LGLOOP2_BVgas_13 jmp LGLAST_BVgas_13 LGLAST_BVgas_13: add $(8), %rcx jle LFINALgas_13 movaps %xmm9, %xmm7 LGLAST_BV_LPgas_13: call LSBRT_ZRgas_13 add $(2), %rsi add $(2), %rdi dec %rcx jg LBGN_BV_LPgas_13 LFINALgas_13: add $(48), %rsp pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pssetm7as.s000066400000000000000000000632611443134507600265550ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data TableCacheSize: .byte 0xec, 0xc3 .byte 0xeb, 0x93 .byte 0x4d, 0x16 .byte 0xea, 0x34 .byte 0x4c, 0x34 .byte 0xe4, 0x15 .byte 0xde, 0x15 .byte 0x4b, 0x15 .byte 0x47, 0x15 .byte 0x4e, 0x33 .byte 0x4a, 0x33 .byte 0xe3, 0x14 .byte 0xdd, 0x14 .byte 0xd8, 0x14 .byte 0x49, 0x14 .byte 0x29, 0x14 .byte 0x46, 0x14 .byte 0x48, 0x32 .byte 0xe2, 0x13 .byte 0xdc, 0x13 .byte 0xd7, 0x13 .byte 0xd2, 0x13 .byte 0x25, 0x13 .byte 0x7d, 0x13 .byte 0x85, 0x13 .byte 0x45, 0x13 .byte 0xd6, 0x12 .byte 0xd1, 0x12 .byte 0x23, 0x12 .byte 0x87, 0x12 .byte 0x7c, 0x12 .byte 0x78, 0x12 .byte 0x84, 0x12 .byte 0x44, 0x12 .byte 0xd0, 0x11 .byte 0x22, 0x11 .byte 0x7b, 0x11 .byte 0x80, 0x11 .byte 0x86, 0x11 .byte 0x3e, 0x11 .byte 0x7f, 0x11 .byte 0x83, 0x11 .byte 0x43, 0x11 .byte 0 .text .p2align 4, 0x90 .globl mfxownsSet_16u_M7 mfxownsSet_16u_M7: movzwq (%rdi), %rax movzwq (%rdi), %rcx shl $(16), %rax mov %rsi, %r8 or %rcx, %rax mov %edx, %ecx movd %rax, %xmm0 cmp $(524288), %rcx jg LAlignSet16uWNt00gas_1 test $(1), %r8 jnz LAlignSet16uWNt00gas_1 shl $(1), %rcx punpckldq %xmm0, %xmm0 cmp $(16), %rcx jl LShortSet16uW02gas_1 punpcklqdq %xmm0, %xmm0 movq %xmm0, (%r8) mov %r8, %rax and $(15), %rax sub $(16), %rax movq %xmm0, (8)(%r8) sub %rax, %r8 add %rax, %rcx jz LExitSet16uW00gas_1 cmp $(64), %rcx jge LSet16uW00gas_1 LShortSet16uW00gas_1: sub $(16), %rcx jl LShortSet16uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet16uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet16uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx LShortSet16uW01gas_1: add $(16), %rcx jz LExitSet16uW00gas_1 LShortSet16uW02gas_1: cmp $(8), %rcx jl LShortSet16uW04gas_1 je LShortSet16uW03gas_1 movq %xmm0, (%r8) LShortSet16uW03gas_1: movq %xmm0, (-8)(%r8,%rcx) LExitSet16uW00gas_1: mov %rsi, %rax ret LShortSet16uW04gas_1: movd %xmm0, %rax cmp $(4), %rcx jl LShortSet16uW06gas_1 je LShortSet16uW05gas_1 mov %eax, (%r8) LShortSet16uW05gas_1: mov %eax, (-4)(%r8,%rcx) mov %rsi, %rax ret LShortSet16uW06gas_1: mov %ax, (%r8) mov %rsi, %rax ret LSet16uW00gas_1: sub $(64), %rcx LSet16uW01gas_1: movdqa %xmm0, (%r8) movdqa %xmm0, (16)(%r8) movdqa %xmm0, (32)(%r8) movdqa %xmm0, (48)(%r8) add $(64), %r8 sub $(64), %rcx jge LSet16uW01gas_1 add $(64), %rcx jnz LShortSet16uW00gas_1 mov %rsi, %rax ret LAlignSet16uWNt00gas_1: test $(15), %r8 jz LGetCacheSize00gas_1 mov %ax, (%r8) add $(2), %r8 dec %rcx jz LExitSet16uW00gas_1 jmp LAlignSet16uWNt00gas_1 LGetCacheSize00gas_1: punpckldq %xmm0, %xmm0 punpcklqdq %xmm0, %xmm0 lea TableCacheSize(%rip), %rax sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rax, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_1 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_1 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_1 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_1 test $(2147483648), %eax jz LCacheSizeMacro00gas_1 xor %eax, %eax LCacheSizeMacro00gas_1: test $(2147483648), %ebx jz LCacheSizeMacro01gas_1 xor %ebx, %ebx LCacheSizeMacro01gas_1: test $(2147483648), %ecx jz LCacheSizeMacro02gas_1 xor %ecx, %ecx LCacheSizeMacro02gas_1: test $(2147483648), %edx jz LCacheSizeMacro03gas_1 xor %edx, %edx LCacheSizeMacro03gas_1: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_1 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_1: test %ebx, %ebx jz LCacheSizeMacro05gas_1 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_1: test %ecx, %ecx jz LCacheSizeMacro06gas_1 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_1: test %edx, %edx jz LCacheSizeMacro07gas_1 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_1: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_1 LCacheSizeMacro08gas_1: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_1 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_1: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_1 sub $(1), %ecx jnz LCacheSizeMacro09gas_1 jmp LCacheSizeMacro08gas_1 LCacheSizeMacro10gas_1: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_1 LCacheSizeMacro11gas_1: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_1: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rax add $(64), %rsp cmp $(-1), %rax je LGetCacheSize01gas_1 shr $(1), %rax cmp %rax, %rcx jg LSet16uWNt00gas_1 LGetCacheSize01gas_1: add %ecx, %ecx jmp LSet16uW00gas_1 LSet16uWNt00gas_1: sub $(8), %rcx LSet16uWNt01gas_1: movntdq %xmm0, (%r8) add $(16), %r8 sub $(8), %rcx jge LSet16uWNt01gas_1 sfence add $(8), %rcx add %rcx, %rcx jnz LShortSet16uW00gas_1 mov %rsi, %rax ret .p2align 4, 0x90 .globl mfxownsSet_32s_M7 mfxownsSet_32s_M7: movd (%rdi), %xmm0 mov %rsi, %r8 mov %edx, %ecx test $(3), %r8 jnz LAlignSet32sW01gas_2 LAlignSet32sW00gas_2: cmp $(262144), %rcx jg LAlignSet32sWNt00gas_2 shl $(2), %rcx pshufd $(0), %xmm0, %xmm0 cmp $(16), %rcx jl LShortSet32sW02gas_2 movq %xmm0, (%r8) mov %r8, %rax and $(15), %rax sub $(16), %rax movq %xmm0, (8)(%r8) sub %rax, %r8 add %rax, %rcx jz LExitSet32sW00gas_2 cmp $(64), %rcx jge LSet32sW00gas_2 LShortSet32sW00gas_2: sub $(16), %rcx jl LShortSet32sW01gas_2 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet32sW01gas_2 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet32sW01gas_2 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx LShortSet32sW01gas_2: add $(16), %rcx jz LExitSet32sW00gas_2 LShortSet32sW02gas_2: cmp $(8), %rcx jl LShortSet32sW04gas_2 je LShortSet32sW03gas_2 movq %xmm0, (%r8) LShortSet32sW03gas_2: movq %xmm0, (-8)(%r8,%rcx) LExitSet32sW00gas_2: mov %rsi, %rax ret LShortSet32sW04gas_2: movd %xmm0, (%r8) mov %rsi, %rax ret LSet32sW00gas_2: sub $(64), %rcx LSet32sW01gas_2: movdqa %xmm0, (%r8) movdqa %xmm0, (16)(%r8) movdqa %xmm0, (32)(%r8) movdqa %xmm0, (48)(%r8) add $(64), %r8 sub $(64), %rcx jge LSet32sW01gas_2 add $(64), %rcx jnz LShortSet32sW00gas_2 mov %rsi, %rax ret LAlignSet32sW01gas_2: test $(1), %r8 jnz LAlignSet32sWNt00gas_2 movd %xmm0, (%r8) movd %xmm0, (-4)(%r8,%rcx,4) pshuflw $(225), %xmm0, %xmm0 add $(2), %r8 sub $(1), %rcx jz LExitSet32sW00gas_2 jmp LAlignSet32sW00gas_2 LAlignSet32sWNt00gas_2: test $(15), %r8 jz LGetCacheSize00gas_2 movd %xmm0, (%r8) add $(4), %r8 dec %rcx jz LExitSet32sW00gas_2 jmp LAlignSet32sWNt00gas_2 LGetCacheSize00gas_2: pshufd $(0), %xmm0, %xmm0 lea TableCacheSize(%rip), %rax sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rax, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_2 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_2 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_2 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_2 test $(2147483648), %eax jz LCacheSizeMacro00gas_2 xor %eax, %eax LCacheSizeMacro00gas_2: test $(2147483648), %ebx jz LCacheSizeMacro01gas_2 xor %ebx, %ebx LCacheSizeMacro01gas_2: test $(2147483648), %ecx jz LCacheSizeMacro02gas_2 xor %ecx, %ecx LCacheSizeMacro02gas_2: test $(2147483648), %edx jz LCacheSizeMacro03gas_2 xor %edx, %edx LCacheSizeMacro03gas_2: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_2 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_2: test %ebx, %ebx jz LCacheSizeMacro05gas_2 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_2: test %ecx, %ecx jz LCacheSizeMacro06gas_2 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_2: test %edx, %edx jz LCacheSizeMacro07gas_2 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_2: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_2 LCacheSizeMacro08gas_2: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_2 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_2: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_2 sub $(1), %ecx jnz LCacheSizeMacro09gas_2 jmp LCacheSizeMacro08gas_2 LCacheSizeMacro10gas_2: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_2 LCacheSizeMacro11gas_2: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_2: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rax add $(64), %rsp cmp $(-1), %rax je LGetCacheSize01gas_2 shr $(2), %rax cmp %rax, %rcx jg LSet32sWNt00gas_2 LGetCacheSize01gas_2: shl $(2), %ecx jmp LSet32sW00gas_2 LSet32sWNt00gas_2: sub $(4), %rcx LSet32sWNt01gas_2: movntdq %xmm0, (%r8) add $(16), %r8 sub $(4), %rcx jge LSet32sWNt01gas_2 sfence add $(4), %rcx lea (,%rcx,4), %rcx jnz LShortSet32sW00gas_2 mov %rsi, %rax ret .p2align 4, 0x90 .globl mfxownsSet_64s_M7 mfxownsSet_64s_M7: movq (%rdi), %xmm0 mov %rsi, %r8 mov %edx, %ecx test $(7), %r8 jnz LAlignSet64sW01gas_3 LAlignSet64sW00gas_3: cmp $(131072), %rcx jg LAlignSet64sWNt00gas_3 shl $(3), %rcx pshufd $(68), %xmm0, %xmm0 cmp $(16), %rcx jl LShortSet64sW02gas_3 movdqu %xmm0, (%r8) mov %r8, %rax and $(15), %rax sub $(16), %rax sub %rax, %r8 add %rax, %rcx jz LExitSet64sW00gas_3 cmp $(64), %rcx jge LSet64sW00gas_3 LShortSet64sW00gas_3: sub $(16), %rcx jl LShortSet64sW01gas_3 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet64sW01gas_3 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx jl LShortSet64sW01gas_3 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rcx LShortSet64sW01gas_3: add $(16), %rcx jz LExitSet64sW00gas_3 LShortSet64sW02gas_3: movq %xmm0, (%r8) LExitSet64sW00gas_3: mov %rsi, %rax ret LSet64sW00gas_3: sub $(64), %rcx LSet64sW01gas_3: movdqa %xmm0, (%r8) movdqa %xmm0, (16)(%r8) movdqa %xmm0, (32)(%r8) movdqa %xmm0, (48)(%r8) add $(64), %r8 sub $(64), %rcx jge LSet64sW01gas_3 add $(64), %rcx jnz LShortSet64sW00gas_3 mov %rsi, %rax ret LAlignSet64sW01gas_3: test $(3), %r8 jnz LAlignSet64sWNt00gas_3 movq %xmm0, (%r8) movq %xmm0, (-8)(%r8,%rcx,8) pshuflw $(78), %xmm0, %xmm0 add $(4), %r8 dec %rcx jz LExitSet64sW00gas_3 jmp LAlignSet64sW00gas_3 LAlignSet64sWNt00gas_3: test $(15), %r8 jz LGetCacheSize00gas_3 movq %xmm0, (%r8) add $(8), %r8 dec %rcx jz LExitSet64sW00gas_3 jmp LAlignSet64sWNt00gas_3 LGetCacheSize00gas_3: pshufd $(68), %xmm0, %xmm0 lea TableCacheSize(%rip), %rax sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rax, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_3 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_3 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_3 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_3 test $(2147483648), %eax jz LCacheSizeMacro00gas_3 xor %eax, %eax LCacheSizeMacro00gas_3: test $(2147483648), %ebx jz LCacheSizeMacro01gas_3 xor %ebx, %ebx LCacheSizeMacro01gas_3: test $(2147483648), %ecx jz LCacheSizeMacro02gas_3 xor %ecx, %ecx LCacheSizeMacro02gas_3: test $(2147483648), %edx jz LCacheSizeMacro03gas_3 xor %edx, %edx LCacheSizeMacro03gas_3: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_3 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_3: test %ebx, %ebx jz LCacheSizeMacro05gas_3 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_3: test %ecx, %ecx jz LCacheSizeMacro06gas_3 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_3: test %edx, %edx jz LCacheSizeMacro07gas_3 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_3: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_3 LCacheSizeMacro08gas_3: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_3 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_3: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_3 sub $(1), %ecx jnz LCacheSizeMacro09gas_3 jmp LCacheSizeMacro08gas_3 LCacheSizeMacro10gas_3: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_3 LCacheSizeMacro11gas_3: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_3: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rax add $(64), %rsp cmp $(-1), %rax je LGetCacheSize01gas_3 shr $(3), %rax cmp %rax, %rcx jg LSet64sWNt00gas_3 LGetCacheSize01gas_3: shl $(3), %ecx jmp LSet64sW00gas_3 LSet64sWNt00gas_3: sub $(2), %rcx LSet64sWNt01gas_3: movntdq %xmm0, (%r8) add $(16), %r8 sub $(2), %rcx jge LSet64sWNt01gas_3 sfence add $(2), %rcx lea (,%rcx,8), %rcx jnz LShortSet64sW00gas_3 mov %rsi, %rax ret .p2align 4, 0x90 .globl mfxownsSet_64sc_M7 mfxownsSet_64sc_M7: movq (%rdi), %xmm0 movq (8)(%rdi), %xmm1 punpcklqdq %xmm1, %xmm0 mov %rsi, %r8 mov %edx, %ecx test $(15), %r8 jnz LAlignSet64scW01gas_4 LAlignSet64scW00gas_4: cmp $(4), %rcx jge LSet64scW00gas_4 LShortSet64scW00gas_4: test %rcx, %rcx jz LExitSet64scW00gas_4 movdqa %xmm0, (%r8) add $(16), %r8 dec %rcx jz LExitSet64scW00gas_4 movdqa %xmm0, (%r8) add $(16), %r8 dec %rcx jz LExitSet64scW00gas_4 movdqa %xmm0, (%r8) LExitSet64scW00gas_4: mov %rsi, %rax ret LSet64scW00gas_4: cmp $(65536), %rcx jg LGetCacheSize00gas_4 LSet64scW01gas_4: sub $(4), %rcx LSet64scW02gas_4: movdqa %xmm0, (%r8) movdqa %xmm0, (16)(%r8) movdqa %xmm0, (32)(%r8) movdqa %xmm0, (48)(%r8) add $(64), %r8 sub $(4), %rcx jge LSet64scW02gas_4 add $(4), %rcx jnz LShortSet64scW00gas_4 mov %rsi, %rax ret LGetCacheSize00gas_4: lea TableCacheSize(%rip), %rax sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rax, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_4 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_4 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_4 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_4 test $(2147483648), %eax jz LCacheSizeMacro00gas_4 xor %eax, %eax LCacheSizeMacro00gas_4: test $(2147483648), %ebx jz LCacheSizeMacro01gas_4 xor %ebx, %ebx LCacheSizeMacro01gas_4: test $(2147483648), %ecx jz LCacheSizeMacro02gas_4 xor %ecx, %ecx LCacheSizeMacro02gas_4: test $(2147483648), %edx jz LCacheSizeMacro03gas_4 xor %edx, %edx LCacheSizeMacro03gas_4: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_4 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_4: test %ebx, %ebx jz LCacheSizeMacro05gas_4 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_4: test %ecx, %ecx jz LCacheSizeMacro06gas_4 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_4: test %edx, %edx jz LCacheSizeMacro07gas_4 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_4: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_4 LCacheSizeMacro08gas_4: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_4 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_4: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_4 sub $(1), %ecx jnz LCacheSizeMacro09gas_4 jmp LCacheSizeMacro08gas_4 LCacheSizeMacro10gas_4: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_4 LCacheSizeMacro11gas_4: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_4: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rax add $(64), %rsp cmp $(-1), %rax je LSet64scW01gas_4 shr $(4), %rax cmp %rax, %rcx jle LSet64scW01gas_4 LSet64scWNt00gas_4: movntdq %xmm0, (%r8) add $(16), %r8 dec %rcx jnz LSet64scWNt00gas_4 sfence mov %rsi, %rax ret LAlignSet64scW01gas_4: test $(7), %r8 jnz LNotAlignSet64scW00gas_4 lea (,%rcx,2), %rax movq %xmm0, (%r8) pshufd $(78), %xmm0, %xmm0 movq %xmm0, (-8)(%r8,%rax,8) add $(8), %r8 dec %rcx jz LExitSet64scW00gas_4 jmp LAlignSet64scW00gas_4 LNotAlignSet64scW00gas_4: movdqu %xmm0, (%r8) add $(16), %r8 dec %rcx jnz LNotAlignSet64scW00gas_4 jmp LExitSet64scW00gas_4 oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/psshiftm7as.s000066400000000000000000001404721443134507600270770ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .text .p2align 4, 0x90 .globl mfxownps_LShiftC_8u_I mfxownps_LShiftC_8u_I: push %rbx mov %edx, %edx mov %edi, %ecx mov %rsi, %rbx and $(15), %rbx jz LRungas_1 sub $(16), %rbx neg %rbx cmp %rbx, %rdx jl LRungas_1 sub %rbx, %rdx LNAgas_1: movb (%rsi), %al shl %cl, %al movb %al, (%rsi) add $(1), %rsi sub $(1), %rbx jnz LNAgas_1 LRungas_1: movd %edi, %xmm7 pcmpeqb %xmm0, %xmm0 psllw %xmm7, %xmm0 psllw $(8), %xmm0 movdqa %xmm0, %xmm6 psrlw $(8), %xmm6 por %xmm6, %xmm0 sub $(64), %rdx jl LL32gas_1 LL64gas_1: movdqa (%rsi), %xmm3 psllw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psllw %xmm7, %xmm4 pand %xmm0, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psllw %xmm7, %xmm5 pand %xmm0, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psllw %xmm7, %xmm6 pand %xmm0, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LL64gas_1 LL32gas_1: add $(32), %rdx jl LL16gas_1 movdqa (%rsi), %xmm1 psllw %xmm7, %xmm1 pand %xmm0, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psllw %xmm7, %xmm2 pand %xmm0, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(32), %rdx LL16gas_1: add $(16), %rdx jl LL8gas_1 movdqa (%rsi), %xmm3 psllw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(16), %rdx LL8gas_1: add $(8), %rdx jl LL4gas_1 movq (%rsi), %xmm4 psllw %xmm7, %xmm4 pand %xmm0, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(8), %rdx LL4gas_1: add $(4), %rdx jl LL31gas_1 movd (%rsi), %xmm5 psllw %xmm7, %xmm5 pand %xmm0, %xmm5 movd %xmm5, (%rsi) add $(4), %rsi sub $(4), %rdx LL31gas_1: add $(4), %rdx jle LExitgas_1 LL3gas_1: movb (%rsi), %al shl %cl, %al movb %al, (%rsi) add $(1), %rsi sub $(1), %rdx jnz LL3gas_1 LExitgas_1: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_LShiftC_8u mfxownps_LShiftC_8u: push %rbp push %rbx mov %ecx, %ecx mov %rcx, %rbp mov %esi, %ecx mov %rdx, %rbx and $(15), %rbx jz LRungas_2 sub $(16), %rbx neg %rbx cmp %rbx, %rbp jl LRungas_2 sub %rbx, %rbp LNAgas_2: movb (%rdi), %al shl %cl, %al movb %al, (%rdx) add $(1), %rdi add $(1), %rdx sub $(1), %rbx jnz LNAgas_2 LRungas_2: movd %esi, %xmm7 pcmpeqb %xmm0, %xmm0 psllw %xmm7, %xmm0 psllw $(8), %xmm0 movdqa %xmm0, %xmm6 psrlw $(8), %xmm6 por %xmm6, %xmm0 test $(15), %rdi jnz LNNAgas_2 sub $(64), %rbp jl LL32gas_2 LL64gas_2: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psllw %xmm7, %xmm3 psllw %xmm7, %xmm4 psllw %xmm7, %xmm5 psllw %xmm7, %xmm6 pand %xmm0, %xmm3 pand %xmm0, %xmm4 pand %xmm0, %xmm5 pand %xmm0, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(64), %rbp jge LL64gas_2 LL32gas_2: add $(32), %rbp jl LL16gas_2 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psllw %xmm7, %xmm1 psllw %xmm7, %xmm2 pand %xmm0, %xmm1 pand %xmm0, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(32), %rbp LL16gas_2: add $(16), %rbp jl LL8gas_2 movdqa (%rdi), %xmm3 psllw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(16), %rbp jmp LL8gas_2 LNNAgas_2: sub $(64), %rbp jl LL32ngas_2 LL64ngas_2: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psllw %xmm7, %xmm3 psllw %xmm7, %xmm4 psllw %xmm7, %xmm5 psllw %xmm7, %xmm6 pand %xmm0, %xmm3 pand %xmm0, %xmm4 pand %xmm0, %xmm5 pand %xmm0, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(64), %rbp jge LL64ngas_2 LL32ngas_2: add $(32), %rbp jl LL16ngas_2 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psllw %xmm7, %xmm1 psllw %xmm7, %xmm2 pand %xmm0, %xmm1 pand %xmm0, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(32), %rbp LL16ngas_2: add $(16), %rbp jl LL8gas_2 lddqu (%rdi), %xmm3 psllw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(16), %rbp LL8gas_2: add $(8), %rbp jl LL4gas_2 movq (%rdi), %xmm4 psllw %xmm7, %xmm4 pand %xmm0, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(8), %rbp LL4gas_2: add $(4), %rbp jl LL31gas_2 movd (%rdi), %xmm5 psllw %xmm7, %xmm5 pand %xmm0, %xmm5 movd %xmm5, (%rdx) add $(4), %rdi add $(4), %rdx sub $(4), %rbp LL31gas_2: add $(4), %rbp jle LExitgas_2 LL3gas_2: movb (%rdi), %al shl %cl, %al movb %al, (%rdx) add $(1), %rdi add $(1), %rdx sub $(1), %rbp jnz LL3gas_2 LExitgas_2: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownps_LShiftC_16u_I mfxownps_LShiftC_16u_I: push %rbx mov %edx, %edx mov %edi, %ecx movd %edi, %xmm7 test $(1), %rsi jz LRun0gas_3 sub $(4), %rdx jl LL2gas_3 LL4ngas_3: movq (%rsi), %xmm4 psllw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx jge LL4ngas_3 jmp LL2gas_3 LRun0gas_3: mov %rsi, %rbx and $(15), %rbx jz LRungas_3 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rdx jl LRungas_3 sub %rbx, %rdx LNAgas_3: movw (%rsi), %ax shl %cl, %ax movw %ax, (%rsi) add $(2), %rsi sub $(1), %rbx jnz LNAgas_3 LRungas_3: sub $(32), %rdx jl LL16gas_3 LL32gas_3: movdqa (%rsi), %xmm3 psllw %xmm7, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psllw %xmm7, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psllw %xmm7, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psllw %xmm7, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(32), %rdx jge LL32gas_3 LL16gas_3: add $(16), %rdx jl LL8gas_3 movdqa (%rsi), %xmm1 psllw %xmm7, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psllw %xmm7, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(16), %rdx LL8gas_3: add $(8), %rdx jl LL4gas_3 movdqa (%rsi), %xmm3 psllw %xmm7, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(8), %rdx LL4gas_3: add $(4), %rdx jl LL2gas_3 movq (%rsi), %xmm4 psllw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx LL2gas_3: add $(2), %rdx jl LL1gas_3 movd (%rsi), %xmm5 psllw %xmm7, %xmm5 movd %xmm5, (%rsi) add $(4), %rsi sub $(2), %rdx LL1gas_3: add $(1), %rdx jl LExitgas_3 movw (%rsi), %ax shl %cl, %ax movw %ax, (%rsi) LExitgas_3: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_LShiftC_16u mfxownps_LShiftC_16u: push %rbp push %rbx mov %ecx, %ecx mov %rcx, %rbp mov %esi, %ecx movd %ecx, %xmm7 test $(1), %rdx jz LRun0gas_4 sub $(4), %rbp jl LL2gas_4 LL4ngas_4: movq (%rdi), %xmm4 psllw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp jge LL4ngas_4 jmp LL2gas_4 LRun0gas_4: mov %rdx, %rbx and $(15), %rbx jz LRungas_4 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rbp jl LRungas_4 sub %rbx, %rbp LNAgas_4: movw (%rdi), %ax shl %cl, %ax movw %ax, (%rdx) add $(2), %rdi add $(2), %rdx sub $(1), %rbx jnz LNAgas_4 LRungas_4: test $(15), %rdi jnz LNNAgas_4 sub $(32), %rbp jl LL16gas_4 LL32gas_4: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psllw %xmm7, %xmm3 psllw %xmm7, %xmm4 psllw %xmm7, %xmm5 psllw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32gas_4 LL16gas_4: add $(16), %rbp jl LL8gas_4 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psllw %xmm7, %xmm1 psllw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8gas_4: add $(8), %rbp jl LL4gas_4 movdqa (%rdi), %xmm3 psllw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp jmp LL4gas_4 LNNAgas_4: sub $(32), %rbp jl LL16ngas_4 LL32ngas_4: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psllw %xmm7, %xmm3 psllw %xmm7, %xmm4 psllw %xmm7, %xmm5 psllw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32ngas_4 LL16ngas_4: add $(16), %rbp jl LL8ngas_4 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psllw %xmm7, %xmm1 psllw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8ngas_4: add $(8), %rbp jl LL4gas_4 lddqu (%rdi), %xmm3 psllw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp LL4gas_4: add $(4), %rbp jl LL2gas_4 movq (%rdi), %xmm4 psllw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp LL2gas_4: add $(2), %rbp jl LL1gas_4 movd (%rdi), %xmm5 psllw %xmm7, %xmm5 movd %xmm5, (%rdx) add $(4), %rdi add $(4), %rdx sub $(2), %rbp LL1gas_4: add $(1), %rbp jl LExitgas_4 movw (%rdi), %ax shl %cl, %ax movw %ax, (%rdx) LExitgas_4: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownps_LShiftC_32s_I mfxownps_LShiftC_32s_I: push %rbx mov %edx, %edx movd %edi, %xmm7 test $(3), %rsi jz LRun0gas_5 sub $(4), %rdx jl LL2gas_5 LL4ngas_5: movq (%rsi), %xmm0 pslld %xmm7, %xmm0 movq %xmm0, (%rsi) add $(8), %rsi sub $(2), %rdx jge LL4ngas_5 jmp LL2gas_5 LRun0gas_5: mov %rsi, %rbx and $(15), %rbx jz LRungas_5 sub $(16), %rbx neg %rbx shr $(2), %rbx cmp %rbx, %rdx jl LRungas_5 sub %rbx, %rdx LNAgas_5: movd (%rsi), %xmm0 pslld %xmm7, %xmm0 movd %xmm0, (%rsi) add $(4), %rsi sub $(1), %rbx jnz LNAgas_5 LRungas_5: sub $(16), %rdx jl LL8gas_5 LL16gas_5: movdqa (%rsi), %xmm3 pslld %xmm7, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 pslld %xmm7, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 pslld %xmm7, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 pslld %xmm7, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(16), %rdx jge LL16gas_5 LL8gas_5: add $(8), %rdx jl LL4gas_5 movdqa (%rsi), %xmm1 pslld %xmm7, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 pslld %xmm7, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(8), %rdx LL4gas_5: add $(4), %rdx jl LL2gas_5 movdqa (%rsi), %xmm3 pslld %xmm7, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(4), %rdx LL2gas_5: add $(2), %rdx jl LL1gas_5 movq (%rsi), %xmm4 pslld %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(2), %rdx LL1gas_5: add $(1), %rdx jl LExitgas_5 movd (%rsi), %xmm5 pslld %xmm7, %xmm5 movd %xmm5, (%rsi) LExitgas_5: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_LShiftC_32s mfxownps_LShiftC_32s: push %rbx mov %ecx, %ecx movd %esi, %xmm7 test $(3), %rdx jz LRun0gas_6 sub $(2), %rcx jl LL1gas_6 LL2ngas_6: movq (%rdi), %xmm4 pslld %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(2), %rcx jge LL2ngas_6 jmp LL1gas_6 LRun0gas_6: mov %rdx, %rbx and $(15), %rbx jz LRungas_6 sub $(16), %rbx neg %rbx shr $(2), %rbx cmp %rbx, %rcx jl LRungas_6 sub %rbx, %rcx LNAgas_6: movd (%rdi), %xmm0 pslld %xmm7, %xmm0 movd %xmm0, (%rdx) add $(4), %rdi add $(4), %rdx sub $(1), %rbx jnz LNAgas_6 LRungas_6: test $(15), %rdi jnz LNNAgas_6 sub $(16), %rcx jl LL8gas_6 LL16gas_6: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 pslld %xmm7, %xmm3 pslld %xmm7, %xmm4 pslld %xmm7, %xmm5 pslld %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(16), %rcx jge LL16gas_6 LL8gas_6: add $(8), %rcx jl LL4gas_6 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 pslld %xmm7, %xmm1 pslld %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(8), %rcx LL4gas_6: add $(4), %rcx jl LL2gas_6 movdqa (%rdi), %xmm3 pslld %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(4), %rcx jmp LL2gas_6 LNNAgas_6: sub $(16), %rcx jl LL8ngas_6 LL16ngas_6: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 pslld %xmm7, %xmm3 pslld %xmm7, %xmm4 pslld %xmm7, %xmm5 pslld %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(16), %rcx jge LL16ngas_6 LL8ngas_6: add $(8), %rcx jl LL4ngas_6 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 pslld %xmm7, %xmm1 pslld %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(8), %rcx LL4ngas_6: add $(4), %rcx jl LL2gas_6 lddqu (%rdi), %xmm3 pslld %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(4), %rcx LL2gas_6: add $(2), %rcx jl LL1gas_6 movq (%rdi), %xmm4 pslld %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(2), %rcx LL1gas_6: add $(1), %rcx jl LExitgas_6 movd (%rdi), %xmm5 pslld %xmm7, %xmm5 movd %xmm5, (%rdx) LExitgas_6: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_RShiftC_8u_I mfxownps_RShiftC_8u_I: push %rbx mov %edx, %edx mov %edi, %ecx mov %rsi, %rbx and $(15), %rbx jz LRungas_7 sub $(16), %rbx neg %rbx cmp %rbx, %rdx jl LRungas_7 sub %rbx, %rdx LNAgas_7: movb (%rsi), %al shr %cl, %al movb %al, (%rsi) add $(1), %rsi sub $(1), %rbx jnz LNAgas_7 LRungas_7: movd %edi, %xmm7 pcmpeqb %xmm0, %xmm0 psrlw %xmm7, %xmm0 psrlw $(8), %xmm0 packuswb %xmm0, %xmm0 sub $(64), %rdx jl LL32gas_7 LL64gas_7: movdqa (%rsi), %xmm3 psrlw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psrlw %xmm7, %xmm4 pand %xmm0, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psrlw %xmm7, %xmm5 pand %xmm0, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psrlw %xmm7, %xmm6 pand %xmm0, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(64), %rdx jge LL64gas_7 LL32gas_7: add $(32), %rdx jl LL16gas_7 movdqa (%rsi), %xmm1 psrlw %xmm7, %xmm1 pand %xmm0, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psrlw %xmm7, %xmm2 pand %xmm0, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(32), %rdx LL16gas_7: add $(16), %rdx jl LL8gas_7 movdqa (%rsi), %xmm3 psrlw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(16), %rdx LL8gas_7: add $(8), %rdx jl LL4gas_7 movq (%rsi), %xmm4 psrlw %xmm7, %xmm4 pand %xmm0, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(8), %rdx LL4gas_7: add $(4), %rdx jl LL31gas_7 movd (%rsi), %xmm5 psrlw %xmm7, %xmm5 pand %xmm0, %xmm5 movd %xmm5, (%rsi) add $(4), %rsi sub $(4), %rdx LL31gas_7: add $(4), %rdx jle LExitgas_7 LL3gas_7: movb (%rsi), %al shr %cl, %al movb %al, (%rsi) add $(1), %rsi sub $(1), %rdx jnz LL3gas_7 LExitgas_7: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_RShiftC_8u mfxownps_RShiftC_8u: push %rbp push %rbx mov %ecx, %ecx mov %rcx, %rbp mov %esi, %ecx mov %rdx, %rbx and $(15), %rbx jz LRungas_8 sub $(16), %rbx neg %rbx cmp %rbx, %rbp jl LRungas_8 sub %rbx, %rbp LNAgas_8: movb (%rdi), %al shr %cl, %al movb %al, (%rdx) add $(1), %rdi add $(1), %rdx sub $(1), %rbx jnz LNAgas_8 LRungas_8: movd %esi, %xmm7 pcmpeqb %xmm0, %xmm0 psrlw %xmm7, %xmm0 psrlw $(8), %xmm0 packuswb %xmm0, %xmm0 test $(15), %rdi jnz LNNAgas_8 sub $(64), %rbp jl LL32gas_8 LL64gas_8: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psrlw %xmm7, %xmm3 psrlw %xmm7, %xmm4 psrlw %xmm7, %xmm5 psrlw %xmm7, %xmm6 pand %xmm0, %xmm3 pand %xmm0, %xmm4 pand %xmm0, %xmm5 pand %xmm0, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(64), %rbp jge LL64gas_8 LL32gas_8: add $(32), %rbp jl LL16gas_8 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psrlw %xmm7, %xmm1 psrlw %xmm7, %xmm2 pand %xmm0, %xmm1 pand %xmm0, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(32), %rbp LL16gas_8: add $(16), %rbp jl LL8gas_8 movdqa (%rdi), %xmm3 psrlw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(16), %rbp jmp LL8gas_8 LNNAgas_8: sub $(64), %rbp jl LL32ngas_8 LL64ngas_8: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psrlw %xmm7, %xmm3 psrlw %xmm7, %xmm4 psrlw %xmm7, %xmm5 psrlw %xmm7, %xmm6 pand %xmm0, %xmm3 pand %xmm0, %xmm4 pand %xmm0, %xmm5 pand %xmm0, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(64), %rbp jge LL64ngas_8 LL32ngas_8: add $(32), %rbp jl LL16ngas_8 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psrlw %xmm7, %xmm1 psrlw %xmm7, %xmm2 pand %xmm0, %xmm1 pand %xmm0, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(32), %rbp LL16ngas_8: add $(16), %rbp jl LL8gas_8 lddqu (%rdi), %xmm3 psrlw %xmm7, %xmm3 pand %xmm0, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(16), %rbp LL8gas_8: add $(8), %rbp jl LL4gas_8 movq (%rdi), %xmm4 psrlw %xmm7, %xmm4 pand %xmm0, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(8), %rbp LL4gas_8: add $(4), %rbp jl LL31gas_8 movd (%rdi), %xmm5 psrlw %xmm7, %xmm5 pand %xmm0, %xmm5 movd %xmm5, (%rdx) add $(4), %rdi add $(4), %rdx sub $(4), %rbp LL31gas_8: add $(4), %rbp jle LExitgas_8 LL3gas_8: movb (%rdi), %al shr %cl, %al movb %al, (%rdx) add $(1), %rdi add $(1), %rdx sub $(1), %rbp jnz LL3gas_8 LExitgas_8: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownps_RShiftC_16u_I mfxownps_RShiftC_16u_I: push %rbx mov %edx, %edx mov %edi, %ecx movd %edi, %xmm7 test $(1), %rsi jz LRun0gas_9 sub $(4), %rdx jl LL2gas_9 LL4ngas_9: movq (%rsi), %xmm4 psrlw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx jge LL4ngas_9 jmp LL2gas_9 LRun0gas_9: mov %rsi, %rbx and $(15), %rbx jz LRungas_9 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rdx jl LRungas_9 sub %rbx, %rdx LNAgas_9: movw (%rsi), %ax shr %cl, %ax movw %ax, (%rsi) add $(2), %rsi sub $(1), %rbx jnz LNAgas_9 LRungas_9: sub $(32), %rdx jl LL16gas_9 LL32gas_9: movdqa (%rsi), %xmm3 psrlw %xmm7, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psrlw %xmm7, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psrlw %xmm7, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psrlw %xmm7, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(32), %rdx jge LL32gas_9 LL16gas_9: add $(16), %rdx jl LL8gas_9 movdqa (%rsi), %xmm1 psrlw %xmm7, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psrlw %xmm7, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(16), %rdx LL8gas_9: add $(8), %rdx jl LL4gas_9 movdqa (%rsi), %xmm3 psrlw %xmm7, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(8), %rdx LL4gas_9: add $(4), %rdx jl LL2gas_9 movq (%rsi), %xmm4 psrlw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx LL2gas_9: add $(2), %rdx jl LL1gas_9 movd (%rsi), %xmm5 psrlw %xmm7, %xmm5 movd %xmm5, (%rsi) add $(4), %rsi sub $(2), %rdx LL1gas_9: add $(1), %rdx jl LExitgas_9 movw (%rsi), %ax shr %cl, %ax movw %ax, (%rsi) LExitgas_9: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_RShiftC_16u mfxownps_RShiftC_16u: push %rbp push %rbx mov %ecx, %ecx mov %rcx, %rbp mov %esi, %ecx movd %ecx, %xmm7 test $(1), %rdx jz LRun0gas_10 sub $(4), %rbp jl LL2gas_10 LL4ngas_10: movq (%rdi), %xmm4 psrlw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp jge LL4ngas_10 jmp LL2gas_10 LRun0gas_10: mov %rdx, %rbx and $(15), %rbx jz LRungas_10 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rbp jl LRungas_10 sub %rbx, %rbp LNAgas_10: movw (%rdi), %ax shr %cl, %ax movw %ax, (%rdx) add $(2), %rdi add $(2), %rdx sub $(1), %rbx jnz LNAgas_10 LRungas_10: test $(15), %rdi jnz LNNAgas_10 sub $(32), %rbp jl LL16gas_10 LL32gas_10: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psrlw %xmm7, %xmm3 psrlw %xmm7, %xmm4 psrlw %xmm7, %xmm5 psrlw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32gas_10 LL16gas_10: add $(16), %rbp jl LL8gas_10 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psrlw %xmm7, %xmm1 psrlw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8gas_10: add $(8), %rbp jl LL4gas_10 movdqa (%rdi), %xmm3 psrlw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp jmp LL4gas_10 LNNAgas_10: sub $(32), %rbp jl LL16ngas_10 LL32ngas_10: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psrlw %xmm7, %xmm3 psrlw %xmm7, %xmm4 psrlw %xmm7, %xmm5 psrlw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32ngas_10 LL16ngas_10: add $(16), %rbp jl LL8ngas_10 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psrlw %xmm7, %xmm1 psrlw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8ngas_10: add $(8), %rbp jl LL4gas_10 lddqu (%rdi), %xmm3 psrlw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp LL4gas_10: add $(4), %rbp jl LL2gas_10 movq (%rdi), %xmm4 psrlw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp LL2gas_10: add $(2), %rbp jl LL1gas_10 movd (%rdi), %xmm5 psrlw %xmm7, %xmm5 movd %xmm5, (%rdx) add $(4), %rdi add $(4), %rdx sub $(2), %rbp LL1gas_10: add $(1), %rbp jl LExitgas_10 movw (%rdi), %ax shr %cl, %ax movw %ax, (%rdx) LExitgas_10: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownps_RShiftC_16s_I mfxownps_RShiftC_16s_I: push %rbx mov %edx, %edx mov %edi, %ecx movd %edi, %xmm7 test $(1), %rsi jz LRun0gas_11 sub $(4), %rdx jl LL2gas_11 LL4ngas_11: movq (%rsi), %xmm4 psraw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx jge LL4ngas_11 jmp LL2gas_11 LRun0gas_11: mov %rsi, %rbx and $(15), %rbx jz LRungas_11 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rdx jl LRungas_11 sub %rbx, %rdx LNAgas_11: movw (%rsi), %ax sar %cl, %ax movw %ax, (%rsi) add $(2), %rsi sub $(1), %rbx jnz LNAgas_11 LRungas_11: sub $(32), %rdx jl LL16gas_11 LL32gas_11: movdqa (%rsi), %xmm3 psraw %xmm7, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psraw %xmm7, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psraw %xmm7, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psraw %xmm7, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(32), %rdx jge LL32gas_11 LL16gas_11: add $(16), %rdx jl LL8gas_11 movdqa (%rsi), %xmm1 psraw %xmm7, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psraw %xmm7, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(16), %rdx LL8gas_11: add $(8), %rdx jl LL4gas_11 movdqa (%rsi), %xmm3 psraw %xmm7, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(8), %rdx LL4gas_11: add $(4), %rdx jl LL2gas_11 movq (%rsi), %xmm4 psraw %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(4), %rdx LL2gas_11: add $(2), %rdx jl LL1gas_11 movd (%rsi), %xmm5 psraw %xmm7, %xmm5 movd %xmm5, (%rsi) add $(4), %rsi sub $(2), %rdx LL1gas_11: add $(1), %rdx jl LExitgas_11 movw (%rsi), %ax sar %cl, %ax movw %ax, (%rsi) LExitgas_11: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_RShiftC_16s mfxownps_RShiftC_16s: push %rbp push %rbx mov %ecx, %ecx mov %rcx, %rbp mov %esi, %ecx movd %ecx, %xmm7 test $(1), %rdx jz LRun0gas_12 sub $(4), %rbp jl LL2gas_12 LL4ngas_12: movq (%rdi), %xmm4 psraw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp jge LL4ngas_12 jmp LL2gas_12 LRun0gas_12: mov %rdx, %rbx and $(15), %rbx jz LRungas_12 sub $(16), %rbx neg %rbx shr $(1), %rbx cmp %rbx, %rbp jl LRungas_12 sub %rbx, %rbp LNAgas_12: movw (%rdi), %ax sar %cl, %ax movw %ax, (%rdx) add $(2), %rdi add $(2), %rdx sub $(1), %rbx jnz LNAgas_12 LRungas_12: test $(15), %rdi jnz LNNAgas_12 sub $(32), %rbp jl LL16gas_12 LL32gas_12: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psraw %xmm7, %xmm3 psraw %xmm7, %xmm4 psraw %xmm7, %xmm5 psraw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32gas_12 LL16gas_12: add $(16), %rbp jl LL8gas_12 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psraw %xmm7, %xmm1 psraw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8gas_12: add $(8), %rbp jl LL4gas_12 movdqa (%rdi), %xmm3 psraw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp jmp LL4gas_12 LNNAgas_12: sub $(32), %rbp jl LL16ngas_12 LL32ngas_12: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psraw %xmm7, %xmm3 psraw %xmm7, %xmm4 psraw %xmm7, %xmm5 psraw %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(32), %rbp jge LL32ngas_12 LL16ngas_12: add $(16), %rbp jl LL8ngas_12 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psraw %xmm7, %xmm1 psraw %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(16), %rbp LL8ngas_12: add $(8), %rbp jl LL4gas_12 lddqu (%rdi), %xmm3 psraw %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(8), %rbp LL4gas_12: add $(4), %rbp jl LL2gas_12 movq (%rdi), %xmm4 psraw %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(4), %rbp LL2gas_12: add $(2), %rbp jl LL1gas_12 movd (%rdi), %xmm5 psraw %xmm7, %xmm5 movd %xmm5, (%rdx) add $(4), %rdi add $(4), %rdx sub $(2), %rbp LL1gas_12: add $(1), %rbp jl LExitgas_12 movw (%rdi), %ax sar %cl, %ax movw %ax, (%rdx) LExitgas_12: pop %rbx pop %rbp ret .p2align 4, 0x90 .globl mfxownps_RShiftC_32s_I mfxownps_RShiftC_32s_I: push %rbx mov %edx, %edx movd %edi, %xmm7 test $(3), %rsi jz LRun0gas_13 sub $(4), %rdx jl LL2gas_13 LL4ngas_13: movq (%rsi), %xmm0 psrad %xmm7, %xmm0 movq %xmm0, (%rsi) add $(8), %rsi sub $(2), %rdx jge LL4ngas_13 jmp LL2gas_13 LRun0gas_13: mov %rsi, %rbx and $(15), %rbx jz LRungas_13 sub $(16), %rbx neg %rbx shr $(2), %rbx cmp %rbx, %rdx jl LRungas_13 sub %rbx, %rdx LNAgas_13: movd (%rsi), %xmm0 psrad %xmm7, %xmm0 movd %xmm0, (%rsi) add $(4), %rsi sub $(1), %rbx jnz LNAgas_13 LRungas_13: sub $(16), %rdx jl LL8gas_13 LL16gas_13: movdqa (%rsi), %xmm3 psrad %xmm7, %xmm3 movdqa %xmm3, (%rsi) movdqa (16)(%rsi), %xmm4 psrad %xmm7, %xmm4 movdqa %xmm4, (16)(%rsi) movdqa (32)(%rsi), %xmm5 psrad %xmm7, %xmm5 movdqa %xmm5, (32)(%rsi) movdqa (48)(%rsi), %xmm6 psrad %xmm7, %xmm6 movdqa %xmm6, (48)(%rsi) add $(64), %rsi sub $(16), %rdx jge LL16gas_13 LL8gas_13: add $(8), %rdx jl LL4gas_13 movdqa (%rsi), %xmm1 psrad %xmm7, %xmm1 movdqa %xmm1, (%rsi) movdqa (16)(%rsi), %xmm2 psrad %xmm7, %xmm2 movdqa %xmm2, (16)(%rsi) add $(32), %rsi sub $(8), %rdx LL4gas_13: add $(4), %rdx jl LL2gas_13 movdqa (%rsi), %xmm3 psrad %xmm7, %xmm3 movdqa %xmm3, (%rsi) add $(16), %rsi sub $(4), %rdx LL2gas_13: add $(2), %rdx jl LL1gas_13 movq (%rsi), %xmm4 psrad %xmm7, %xmm4 movq %xmm4, (%rsi) add $(8), %rsi sub $(2), %rdx LL1gas_13: add $(1), %rdx jl LExitgas_13 movd (%rsi), %xmm5 psrad %xmm7, %xmm5 movd %xmm5, (%rsi) LExitgas_13: pop %rbx ret .p2align 4, 0x90 .globl mfxownps_RShiftC_32s mfxownps_RShiftC_32s: push %rbx mov %ecx, %ecx movd %esi, %xmm7 test $(3), %rdx jz LRun0gas_14 sub $(2), %rcx jl LL1gas_14 LL2ngas_14: movq (%rdi), %xmm4 psrad %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(2), %rcx jge LL2ngas_14 jmp LL1gas_14 LRun0gas_14: mov %rdx, %rbx and $(15), %rbx jz LRungas_14 sub $(16), %rbx neg %rbx shr $(2), %rbx cmp %rbx, %rcx jl LRungas_14 sub %rbx, %rcx LNAgas_14: movd (%rdi), %xmm0 psrad %xmm7, %xmm0 movd %xmm0, (%rdx) add $(4), %rdi add $(4), %rdx sub $(1), %rbx jnz LNAgas_14 LRungas_14: test $(15), %rdi jnz LNNAgas_14 sub $(16), %rcx jl LL8gas_14 LL16gas_14: movdqa (%rdi), %xmm3 movdqa (16)(%rdi), %xmm4 movdqa (32)(%rdi), %xmm5 movdqa (48)(%rdi), %xmm6 psrad %xmm7, %xmm3 psrad %xmm7, %xmm4 psrad %xmm7, %xmm5 psrad %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(16), %rcx jge LL16gas_14 LL8gas_14: add $(8), %rcx jl LL4gas_14 movdqa (%rdi), %xmm1 movdqa (16)(%rdi), %xmm2 psrad %xmm7, %xmm1 psrad %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(8), %rcx LL4gas_14: add $(4), %rcx jl LL2gas_14 movdqa (%rdi), %xmm3 psrad %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(4), %rcx jmp LL2gas_14 LNNAgas_14: sub $(16), %rcx jl LL8ngas_14 LL16ngas_14: lddqu (%rdi), %xmm3 lddqu (16)(%rdi), %xmm4 lddqu (32)(%rdi), %xmm5 lddqu (48)(%rdi), %xmm6 psrad %xmm7, %xmm3 psrad %xmm7, %xmm4 psrad %xmm7, %xmm5 psrad %xmm7, %xmm6 movdqa %xmm3, (%rdx) movdqa %xmm4, (16)(%rdx) movdqa %xmm5, (32)(%rdx) movdqa %xmm6, (48)(%rdx) add $(64), %rdi add $(64), %rdx sub $(16), %rcx jge LL16ngas_14 LL8ngas_14: add $(8), %rcx jl LL4ngas_14 lddqu (%rdi), %xmm1 lddqu (16)(%rdi), %xmm2 psrad %xmm7, %xmm1 psrad %xmm7, %xmm2 movdqa %xmm1, (%rdx) movdqa %xmm2, (16)(%rdx) add $(32), %rdi add $(32), %rdx sub $(8), %rcx LL4ngas_14: add $(4), %rcx jl LL2gas_14 lddqu (%rdi), %xmm3 psrad %xmm7, %xmm3 movdqa %xmm3, (%rdx) add $(16), %rdi add $(16), %rdx sub $(4), %rcx LL2gas_14: add $(2), %rcx jl LL1gas_14 movq (%rdi), %xmm4 psrad %xmm7, %xmm4 movq %xmm4, (%rdx) add $(8), %rdi add $(8), %rdx sub $(2), %rcx LL1gas_14: add $(1), %rcx jl LExitgas_14 movd (%rdi), %xmm5 psrad %xmm7, %xmm5 movd %xmm5, (%rdx) LExitgas_14: pop %rbx ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pszerom7as.s000066400000000000000000000211641443134507600267350ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data TableCacheSize: .byte 0xec, 0xc3 .byte 0xeb, 0x93 .byte 0x4d, 0x16 .byte 0xea, 0x34 .byte 0x4c, 0x34 .byte 0xe4, 0x15 .byte 0xde, 0x15 .byte 0x4b, 0x15 .byte 0x47, 0x15 .byte 0x4e, 0x33 .byte 0x4a, 0x33 .byte 0xe3, 0x14 .byte 0xdd, 0x14 .byte 0xd8, 0x14 .byte 0x49, 0x14 .byte 0x29, 0x14 .byte 0x46, 0x14 .byte 0x48, 0x32 .byte 0xe2, 0x13 .byte 0xdc, 0x13 .byte 0xd7, 0x13 .byte 0xd2, 0x13 .byte 0x25, 0x13 .byte 0x7d, 0x13 .byte 0x85, 0x13 .byte 0x45, 0x13 .byte 0xd6, 0x12 .byte 0xd1, 0x12 .byte 0x23, 0x12 .byte 0x87, 0x12 .byte 0x7c, 0x12 .byte 0x78, 0x12 .byte 0x84, 0x12 .byte 0x44, 0x12 .byte 0xd0, 0x11 .byte 0x22, 0x11 .byte 0x7b, 0x11 .byte 0x80, 0x11 .byte 0x86, 0x11 .byte 0x3e, 0x11 .byte 0x7f, 0x11 .byte 0x83, 0x11 .byte 0x43, 0x11 .byte 0 .text .p2align 4, 0x90 .globl mfxownsZero_8u mfxownsZero_8u: mov %rdi, %r8 movslq %esi, %rsi pxor %xmm0, %xmm0 xor %edx, %edx cmp $(16), %rsi jl LShortZero8uW03gas_1 test $(15), %r8 jz LAlignZero8uW04gas_1 mov %r8, %rax and $(15), %eax sub $(16), %eax neg %eax test $(1), %eax jz LAlignZero8uW00gas_1 mov %dl, (%r8) add $(1), %r8 LAlignZero8uW00gas_1: test $(2), %eax jz LAlignZero8uW01gas_1 mov %dx, (%r8) add $(2), %r8 LAlignZero8uW01gas_1: test $(4), %eax jz LAlignZero8uW02gas_1 mov %edx, (%r8) add $(4), %r8 LAlignZero8uW02gas_1: test $(8), %eax jz LAlignZero8uW03gas_1 mov %rdx, (%r8) add $(8), %r8 LAlignZero8uW03gas_1: sub %rax, %rsi jz LShortZero8uW02gas_1 LAlignZero8uW04gas_1: cmp $(64), %rsi jge LZero8uW00gas_1 LShortZero8uW00gas_1: sub $(16), %rsi jl LShortZero8uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rsi jl LShortZero8uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rsi jl LShortZero8uW01gas_1 movdqa %xmm0, (%r8) add $(16), %r8 sub $(16), %rsi LShortZero8uW01gas_1: add $(16), %rsi jnz LShortZero8uW03gas_1 LShortZero8uW02gas_1: mov %rdi, %rax ret LShortZero8uW03gas_1: cmp $(8), %rsi jl LShortZero8uW05gas_1 je LShortZero8uW04gas_1 mov %rdx, (%r8) LShortZero8uW04gas_1: mov %rdx, (-8)(%r8,%rsi) mov %rdi, %rax ret LShortZero8uW05gas_1: cmp $(4), %rsi jl LShortZero8uW07gas_1 je LShortZero8uW06gas_1 mov %edx, (%r8) LShortZero8uW06gas_1: mov %edx, (-4)(%r8,%rsi) mov %rdi, %rax ret LShortZero8uW07gas_1: mov %dl, (%r8) sub $(1), %rsi jz LShortZero8uW08gas_1 mov %dl, (1)(%r8) sub $(1), %rsi jz LShortZero8uW08gas_1 mov %dl, (2)(%r8) LShortZero8uW08gas_1: mov %rdi, %rax ret LZero8uW00gas_1: cmp $(524288), %rsi jg LGetCacheSize00gas_1 LZero8uW01gas_1: sub $(64), %rsi LZero8uW02gas_1: movdqa %xmm0, (%r8) movdqa %xmm0, (16)(%r8) movdqa %xmm0, (32)(%r8) movdqa %xmm0, (48)(%r8) add $(64), %r8 sub $(64), %rsi jge LZero8uW02gas_1 add $(64), %rsi jnz LShortZero8uW00gas_1 mov %rdi, %rax ret LGetCacheSize00gas_1: lea TableCacheSize(%rip), %rax sub $(64), %rsp mov %rax, (16)(%rsp) mov %rbx, (24)(%rsp) mov %rcx, (32)(%rsp) mov %rdx, (40)(%rsp) mov %r8, (48)(%rsp) mov %rax, (56)(%rsp) xor %eax, %eax cpuid cmp $(1970169159), %ebx jne LCacheSizeMacro11gas_1 cmp $(1231384169), %edx jne LCacheSizeMacro11gas_1 cmp $(1818588270), %ecx jne LCacheSizeMacro11gas_1 mov $(2), %eax cpuid cmp $(1), %al jne LCacheSizeMacro11gas_1 test $(2147483648), %eax jz LCacheSizeMacro00gas_1 xor %eax, %eax LCacheSizeMacro00gas_1: test $(2147483648), %ebx jz LCacheSizeMacro01gas_1 xor %ebx, %ebx LCacheSizeMacro01gas_1: test $(2147483648), %ecx jz LCacheSizeMacro02gas_1 xor %ecx, %ecx LCacheSizeMacro02gas_1: test $(2147483648), %edx jz LCacheSizeMacro03gas_1 xor %edx, %edx LCacheSizeMacro03gas_1: mov %rsp, %r8 test %eax, %eax jz LCacheSizeMacro04gas_1 mov %eax, (%r8) add $(4), %r8 mov $(3), %eax LCacheSizeMacro04gas_1: test %ebx, %ebx jz LCacheSizeMacro05gas_1 mov %ebx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro05gas_1: test %ecx, %ecx jz LCacheSizeMacro06gas_1 mov %ecx, (%r8) add $(4), %r8 add $(4), %eax LCacheSizeMacro06gas_1: test %edx, %edx jz LCacheSizeMacro07gas_1 mov %edx, (%r8) add $(4), %eax LCacheSizeMacro07gas_1: mov (56)(%rsp), %rbx test %eax, %eax jz LCacheSizeMacro11gas_1 LCacheSizeMacro08gas_1: movzbl (%rbx), %edx test %edx, %edx jz LCacheSizeMacro11gas_1 add $(2), %rbx mov %eax, %ecx LCacheSizeMacro09gas_1: cmpb (%rsp,%rcx), %dl je LCacheSizeMacro10gas_1 sub $(1), %ecx jnz LCacheSizeMacro09gas_1 jmp LCacheSizeMacro08gas_1 LCacheSizeMacro10gas_1: movzbl (-1)(%rbx), %ebx mov %ebx, %ecx shr $(4), %ebx and $(15), %ecx add $(18), %ecx shl %cl, %rbx mov %rbx, (56)(%rsp) jmp LCacheSizeMacro12gas_1 LCacheSizeMacro11gas_1: movq $(-1), (56)(%rsp) LCacheSizeMacro12gas_1: mov (16)(%rsp), %rax mov (24)(%rsp), %rbx mov (32)(%rsp), %rcx mov (40)(%rsp), %rdx mov (48)(%rsp), %r8 mov (56)(%rsp), %rax add $(64), %rsp cmp $(-1), %rax je LZero8uW01gas_1 cmp %rax, %rsi jl LZero8uW01gas_1 LZero8uWNt00gas_1: sub $(16), %rsi LZero8uWNt01gas_1: movntdq %xmm0, (%r8) add $(16), %r8 sub $(16), %rsi jge LZero8uWNt01gas_1 sfence add $(16), %rsi jnz LShortZero8uW00gas_1 mov %rdi, %rax ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/asm_intel64/pvcvc1rangemapm7as.s000066400000000000000000000060741443134507600303330ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. .data .p2align 4, 0x90 const_array_of_128: .word 128,128,128,128,128,128,128,128 const_array_of_4: .word 4,4,4,4,4,4,4,4 const_array_of_9: .word 9,9,9,9,9,9,9,9 const_array_of_0: .word 0,0,0,0,0,0,0,0 .text .globl mfxrangemapping_vc1_sse2 mfxrangemapping_vc1_sse2: push %rbp mov %rsp, %rbp sub $(32), %rsp mov %rbx, (-24)(%rbp) mov %r12, (-16)(%rbp) mov %r14, (-8)(%rbp) lea const_array_of_4(%rip), %rax movdqa (%rax), %xmm4 lea const_array_of_128(%rip), %rax movdqa (%rax), %xmm6 movslq (16)(%rbp), %rax movd %rax, %xmm5 pshuflw $(0), %xmm5, %xmm5 pshufd $(0), %xmm5, %xmm5 lea const_array_of_9(%rip), %rax paddsw (%rax), %xmm5 lea const_array_of_0(%rip), %rax movdqa (%rax), %xmm0 mov %rdi, %rax mov %rdx, %r10 xor %r12, %r12 xor %r14, %r14 xor %r11, %r11 LNEXT_Igas_1: xor %rbx, %rbx LNEXT_Jgas_1: movq (%rax), %xmm1 punpcklbw %xmm0, %xmm1 psubsw %xmm6, %xmm1 pmullw %xmm5, %xmm1 paddsw %xmm4, %xmm1 psraw $(3), %xmm1 paddsw %xmm6, %xmm1 packuswb %xmm1, %xmm1 movq %xmm1, (%r10) add $(8), %rax add $(8), %r10 add $(1), %rbx cmp %r9, %rbx jne LNEXT_Jgas_1 add %rsi, %r12 add %rcx, %r14 mov %rdi, %rax mov %rdx, %r10 add %r12, %rax add %r14, %r10 add $(1), %r11 cmp %r8, %r11 jne LNEXT_Igas_1 mov (-24)(%rbp), %rbx mov (-16)(%rbp), %r12 mov (-8)(%rbp), %r14 mov %rbp, %rsp pop %rbp ret oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/dispatcher.h000066400000000000000000000034401443134507600246060ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __DISPATCHER_H__ #define __DISPATCHER_H__ #if defined( __cplusplus ) extern "C" { #endif /* IPP libraries and CPU features mask fitness. Implemented only for IA32 and Intel64 (emt) */ #if defined( _ARCH_IA32 ) #ifdef _IPP_QUARK #define PX_FM ( 0 ) #else #define PX_FM ( ippCPUID_MMX | ippCPUID_SSE ) #endif #elif defined (_ARCH_EM64T) #define PX_FM ( ippCPUID_MMX | ippCPUID_SSE | ippCPUID_SSE2 ) #elif defined (_ARCH_LRB) #define PX_FM ( ippCPUID_ABR ) #elif defined (_ARCH_LRB2) #define PX_FM ( ippCPUID_KNC ) #elif defined (_ARCH_IA64) #error _ARCH_IA64 is not supported #else #error undefined architecture #endif #if defined( __cplusplus ) } #endif #endif /* __DISPATCHER_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippcachesize.c000066400000000000000000000142471443134507600251310ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include #ifndef __OWNCORE_H__ #include "owncore.h" #endif #ifndef __CPUDEF_H__ #include "cpudef.h" #endif /* //////////////////////////////////////////////////////////////////////////// // Name: mfxGetMaxCacheSizeB // // Purpose: Definition maximal from the sizes of L2 or L3 in bytes // // Note: // 1). Intel(R) processors are supported only. // 2). IA64 and XSC are unsupported. // 3). For unsupported processors the result is "0", // and the return status is "ippStsNotSupportedCpu". // 4). For supported processors the result is "0", // and the return status is "ippStsUnknownCacheSize". // if sizes of the cache is unknown. */ #if !defined( _ARCH_IA64 ) && !defined( _ARCH_XSC ) static IppStatus ownStatus = ippStsNoOperation; static int cacheSize = 0; static int tableCache[112] = { 0xec,25165824,/* 24, 64, L3, from doc cpuid for Nehalem */ 0xeb,18874368,/* 24, 64, L3, from doc cpuid for Nehalem */ 0x4d,16777216,/* 16, 64, L3 */ 0xea,12582912,/* 24, 64, L3, from doc cpuid for Nehalem */ 0x4c,12582912,/* 12, 64, L3 */ 0xe4, 8388608,/* 16, 64, L3, from doc cpuid for Nehalem */ 0xde, 8388608,/* 12, 64, L3, from doc cpuid for Nehalem */ 0x4b, 8388608,/* 16, 64, L3 */ 0x47, 8388608,/* 8, 64, L3 */ 0x4e, 6291456,/* 24, 64, L3 */ 0x4a, 6291456,/* 12, 64, L3 */ 0xe3, 4194304,/* 16, 64, L3, from doc cpuid for Nehalem */ 0xdd, 4194304,/* 12, 64, L3, from doc cpuid for Nehalem */ 0xd8, 4194304,/* 8, 64, L3, from doc cpuid for Nehalem */ 0x49, 4194304,/* 16, 64, L3 */ 0x29, 4194304,/* 8, 64, L3 */ 0x46, 4194304,/* 4, 64, L3 */ 0x48, 3145728,/* 12, 64, L2 */ 0xe2, 2097152,/* 16, 64, L3, from doc cpuid for Nehalem */ 0xdc, 2097152,/* 12, 64, L3, from doc cpuid for Nehalem */ 0xd7, 2097152,/* 8, 64, L3, from doc cpuid for Nehalem */ 0xd2, 2097152,/* 4, 64, L3, from doc cpuid for Nehalem */ 0x25, 2097152,/* 8, 64, L3 */ 0x7d, 2097152,/* 8, 64, L2 */ 0x85, 2097152,/* 8, 32, L2 */ 0x45, 2097152,/* 4, 32, L2 */ 0xd6, 1048576,/* 8, 64, L3, from doc cpuid for Nehalem */ 0xd1, 1048576,/* 4, 64, L3, from doc cpuid for Nehalem */ 0x23, 1048576,/* 8, 64, L3 */ 0x87, 1048576,/* 8, 64, L2 */ 0x7c, 1048576,/* 8, 64, L2 */ 0x78, 1048576,/* 4, 64, L2 */ 0x84, 1048576,/* 8, 32, L2 */ 0x44, 1048576,/* 4, 32, L2 */ 0xd0, 524288,/* 4, 64, L3, from doc cpuid for Nehalem */ 0x22, 524288,/* 4, 64, L3 */ 0x7b, 524288,/* 8, 64, L2 */ 0x80, 524288,/* 8, 64, L2 */ 0x86, 524288,/* 4, 64, L2 */ 0x3e, 524288,/* 4, 64, L2 */ 0x7f, 524288,/* 2, 64, L2 */ 0x83, 524288,/* 8, 32, L2 */ 0x43, 524288,/* 4, 32, L2 */ 0x3d, 393216,/* 6, 64, L2 */ 0x21, 262144,/* 8, 64, L2, from doc cpuid for Nehalem */ 0x7a, 262144,/* 8, 64, L2 */ 0x82, 262144,/* 8, 32, L2 */ 0x3c, 262144,/* 4, 64, L2 */ 0x3f, 262144,/* 4, 64, L2 */ 0x42, 262144,/* 4, 32, L2 */ 0x3a, 196608,/* 6, 64, L2 */ 0x79, 131072,/* 8, 64, L2 */ 0x39, 131072,/* 4, 64, L2 */ 0x3b, 131072,/* 2, 64, L2 */ 0x41, 131072,/* 4, 32, L2 */ 0x00, 0 }; extern int mfxownGetCacheSize( int* tableCache ); #endif /***********************************************************/ IPPFUN( IppStatus, mfxGetMaxCacheSizeB, ( int* pSizeByte ) ) { IPP_BAD_PTR1_RET( pSizeByte ) #if defined( _ARCH_IA64 ) *pSizeByte = 0; return ippStsNotSupportedCpu; #elif defined( _ARCH_XSC ) *pSizeByte = 0; return ippStsNotSupportedCpu; #elif defined( _ARCH_LRB ) || defined( _ARCH_LRB2 ) { int buf[4]; if( ownStatus == ippStsNoOperation ) { mfxownGetReg( buf, 0x80000000, 0 ); if( buf[0] < 0x80000006 ) { ownStatus = ippStsUnknownCacheSize; cacheSize = 0; } else { mfxownGetReg( buf, 0x80000006, 0 ); cacheSize = (buf[2] >> 16)*1024; ownStatus = ippStsNoErr; } } *pSizeByte = cacheSize; return ownStatus; } #else { int maxNumberCpuid = 0; int buf[4], n, tmpMaxSise = 0; if( ownStatus == ippStsNoOperation ) { if( !(mfxhas_cpuid()) ) { ownStatus = ippStsNotSupportedCpu; } else if( ( maxNumberCpuid = mfxmax_cpuid_input() ) < 2 ) { ownStatus = ippStsNotSupportedCpu; } else if( !(mfxis_GenuineIntel()) ) { ownStatus = ippStsNotSupportedCpu; } else { if( maxNumberCpuid >= 4 ) { /*if( 0 ) {*/ for( n = 0; n < 32; n++ ) { mfxownGetReg( buf, 4, n ); if( !(buf[0]&0x1f) ) break; if( (buf[0]&0x1f) != 2 ) { /* 2 = Instraction cache */ buf[2] += 1; buf[2] *= (buf[1]&0xfff)+1; buf[2] *= ((buf[1]>>12)&0x3ff)+1; buf[2] *= ((buf[1]>>22)&0x3ff)+1; if( buf[2] > tmpMaxSise ) tmpMaxSise = buf[2]; } } if( tmpMaxSise ) { ownStatus = ippStsNoErr; cacheSize = tmpMaxSise; } else { ownStatus = ippStsUnknownCacheSize; cacheSize = 0; } } else { cacheSize = mfxownGetCacheSize( tableCache ); if( cacheSize < 0 ) { ownStatus = ippStsUnknownCacheSize; cacheSize = 0; } else { ownStatus = ippStsNoErr; } } } } *pSizeByte = cacheSize; return ownStatus; } #endif } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippinit.c000066400000000000000000000024131443134507600241260ustar00rootroot00000000000000// Copyright (c) 2020 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "ippcore.h" #include "owndefs.h" IPPFUN( IppStatus, MfxIppInit, (void) ) { return __builtin_cpu_supports("sse4.2") > 0? ippStsNoErr : ippStsNotSupportedCpu; } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippmalloc.c000066400000000000000000000067231443134507600244420ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include #include "owndefs.h" /* ////////////////////////////////////////////////////////////////////////// */ #define ALIGNED_MASK (~(IPP_MALLOC_ALIGNED_BYTES-1)) #define ALLOC_ALIGNED_AND_RET( retType,lengthType,length ) \ { \ void *ptr = (void*)0; \ /* IPP_BADARG_RET( (length<=0), NULL )*/ \ if( length <= 0 ) return NULL; \ ptr = malloc(sizeof(lengthType)*length + IPP_MALLOC_ALIGNED_BYTES + sizeof(void*));\ if (ptr) { \ void **ap = (void**)( (IPP_UINT_PTR(ptr) + IPP_MALLOC_ALIGNED_BYTES + \ sizeof(void*) - 1 ) & ALIGNED_MASK ); \ ap[-1] = (void*)ptr; \ return (retType)ap; \ } \ return (retType)0; \ } /* ////////////////////////////////////////////////////////////////////////// */ /* ///////////////////////////////////////////////////////////////////////////// // Name: mfxMalloc // Purpose: allocates aligned (32 bytes) arrays // Returns: actual pointer, if no errors // NULL, if out of memory or if incorrect length // Parameter: // length - sizeof in bytes // // Notes: You should release memory only by function mfxFree() */ IPPFUN( void*, mfxMalloc, (int length) ) { ALLOC_ALIGNED_AND_RET( void*, Ipp8u, length ) } /* ///////////////////////////////////////////////////////////////////////////// // Name: mfxFree // Purpose: frees memory allocated by mfx*_Malloc // Parameter: // ptr - the pointer on memory, which allocated by mfx*_Malloc* // // Notes: function correctly free memory, which allocated mfx*_Malloc*() only */ IPPFUN( void, mfxFree, (void* ptr) ) { if( ptr )free( ((void**)ptr)[-1] ); } /* //////////////////////// End of file "ippmalloc.c" ///////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippver.h000066400000000000000000000032331443134507600237650ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: Describes the base IPP version // */ #include "ippversion.h" #ifndef BASE_VERSION #define BASE_VERSION() IPP_VERSION_MAJOR,IPP_VERSION_MINOR,IPP_VERSION_UPDATE #endif #ifndef STR_VERSION #ifdef IPP_REVISION #define STR_VERSION() STR(IPP_VERSION_MAJOR) "." STR(IPP_VERSION_MINOR) "." STR(IPP_VERSION_UPDATE) " (r" STR( IPP_REVISION ) ")" #else #define STR_VERSION() STR(IPP_VERSION_MAJOR) "." STR(IPP_VERSION_MINOR) "." STR(IPP_VERSION_UPDATE) " (-)" #endif #endif /* ////////////////////////////// End of file /////////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippversion.h000066400000000000000000000026631443134507600246640ustar00rootroot00000000000000// Copyright (c) 2001-2021 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Integrated Performance Primitives // Purpose: Describes the IPP version // // */ #if !defined( __IPPVERSION_H__ ) #define __IPPVERSION_H__ #define IPP_VERSION_MAJOR 8 #define IPP_VERSION_MINOR 2 #define IPP_VERSION_UPDATE 3 #define IPP_VERSION_STR "8.2.3" #endif /* __IPPVERSION_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ippverstr.gen000066400000000000000000000076061443134507600250500ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifdef _IPP_OMP_STATIC #define LIB_THREADS " threaded" #define CORE_THREADS " (threaded)" #else #define LIB_THREADS "" #define CORE_THREADS "" #endif #define GET_LIBRARY_NAME( cpu, is ) #cpu, IPP_LIB_SHORTNAME() " " is " (" #cpu LIB_THREADS ")" static const IppLibraryVersion SLIBVERNAME = { /* major, minor, update (ex-majorBuild) */ BASE_VERSION(), #if defined IPP_REVISION IPP_REVISION, #else -1, #endif /* IPP_REVISION */ #if defined( _CORE ) /*GET_LIBRARY_NAME( core )*/ "core", "ippCore" CORE_THREADS #elif ( _IPP_ARCH == _IPP_ARCH_IA32 ) || ( _IPP_ARCH == _IPP_ARCH_LP32 ) #if ( _IPP == _IPP_M6 ) GET_LIBRARY_NAME( m6, "SSE" ) #elif ( _IPP == _IPP_H9 ) GET_LIBRARY_NAME( h9, "AVX2" ) #elif ( _IPP == _IPP_G9 ) GET_LIBRARY_NAME( g9, "AVX" ) #elif ( _IPP == _IPP_P8 ) GET_LIBRARY_NAME( p8, "SSE4.1/4.2" ) #elif ( _IPPLP32 == _IPPLP32_S8 ) GET_LIBRARY_NAME( s8, "Atom" ) #elif ( _IPP == _IPP_V8 ) GET_LIBRARY_NAME( v8, "SSSE3" ) #elif ( _IPP == _IPP_T7 ) GET_LIBRARY_NAME( t7, "SSE3" ) #elif ( _IPP == _IPP_W7 ) GET_LIBRARY_NAME( w7, "SSE2" ) #elif ( _IPP == _IPP_A6 ) GET_LIBRARY_NAME( a6, "SSE" ) #else GET_LIBRARY_NAME( px, "PX" ) #endif #elif ( _IPP_ARCH == _IPP_ARCH_IA64 ) #if ( _IPP64 == _IPP64_I7 ) GET_LIBRARY_NAME( i7, "" ) #else GET_LIBRARY_NAME( ix, "" ) #endif #elif ( _IPP_ARCH == _IPP_ARCH_EM64T ) || ( _IPP_ARCH == _IPP_ARCH_LP64 ) #if ( _IPP32E == _IPP32E_E9 ) GET_LIBRARY_NAME( e9, "AVX" ) #elif ( _IPP32E == _IPP32E_L9 ) GET_LIBRARY_NAME( l9, "AVX2" ) #elif ( _IPP32E == _IPP32E_Y8 ) GET_LIBRARY_NAME( y8, "SSE4.1/4.2" ) #elif ( _IPPLP64 == _IPPLP64_N8 ) GET_LIBRARY_NAME( n8, "Atom" ) #elif ( _IPP32E == _IPP32E_U8 ) GET_LIBRARY_NAME( u8, "SSSE3" ) #elif ( _IPP32E == _IPP32E_M7 ) GET_LIBRARY_NAME( m7, "SSE3" ) #else GET_LIBRARY_NAME( mx, "PX" ) #endif #elif ( (_IPP_ARCH == _IPP_ARCH_LRB) || ((_IPP_ARCH == _IPP_ARCH_LRB2))) #if ( _IPPLRB == _IPPLRB_BX ) GET_LIBRARY_NAME( bx, "PX" ) #elif ( _IPPLRB == _IPPLRB_B1 ) GET_LIBRARY_NAME( b1, "KNF" ) #elif ( _IPPLRB == _IPPLRB_B2 ) GET_LIBRARY_NAME( b2, "KNC" ) #endif #elif ( _IPP_ARCH == _IPP_ARCH_XSC ) #if ( _IPPXSC == _IPPXSC_S1 ) GET_LIBRARY_NAME( s1, "" ) #elif ( _IPPXSC == _IPPXSC_S2 ) GET_LIBRARY_NAME( s2, "" ) #elif ( _IPPXSC == _IPPXSC_C2 ) GET_LIBRARY_NAME( c2, "" ) #else GET_LIBRARY_NAME( sx, "PX" ) #endif #else #error ARCH not supported #endif #if defined( TICKTOCK ) "+" #endif /* release Version (by Manager) */ ,STR_VERSION() /* BuildDate (by QA person) */ ,__DATE__ }; oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/owncc.h000066400000000000000000000027561443134507600236020ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNCC_H__ #define __OWNCC_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #include "ippcc.h" #define ownpi_CnvrtEpilog3(p1, p2, p3, size) \ IPP_BAD_PTR3_RET( p1, p2, p3); \ IPP_BAD_SIZE_RET(size.width); \ IPP_BAD_SIZE_RET(size.height); #endif /* __OWNCC_H__ */ /* ////////////////////////////// End of file /////////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/owncore.h000066400000000000000000000026731443134507600241430ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNCORE_H__ #define __OWNCORE_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #include "ippcore.h" #if !defined( _ARCH_IA64 ) && !defined( _ARCH_XSC ) extern void mfxownGetReg( int* buf, int valEAX, int valECX ); #endif #endif /* __OWNCORE_H__ */ /* ////////////////////////////// End of file /////////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/owncpufeatures.c000066400000000000000000000064141443134507600255310ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #ifndef __OWNS_H__ #include "owncore.h" #endif #ifndef __CPUDEF_H__ #include "cpudef.h" #endif #include "dispatcher.h" static Ipp64u ownFeaturesMask = PX_FM; /*=======================================================================*/ /* 1). The "ownFeatures" is initialized by ippCpuFeatures. 2). Features mask (MaskOfFeature) values are defined in the ippdefs.h: ippCPUID_MMX 0x00000001 Intel Architecture MMX technology supported ippCPUID_SSE 0x00000002 Streaming SIMD Extensions ippCPUID_SSE2 0x00000004 Streaming SIMD Extensions 2 ippCPUID_SSE3 0x00000008 Streaming SIMD Extensions 3 ippCPUID_SSSE3 0x00000010 Supplemental Streaming SIMD Extensions 3 ippCPUID_MOVBE 0x00000020 The processor supports MOVBE instruction ippCPUID_SSE41 0x00000040 Streaming SIMD Extensions 4.1 ippCPUID_SSE42 0x00000080 Streaming SIMD Extensions 4.2 ippCPUID_AVX 0x00000100 Advanced Vector Extensions instruction set ippAVX_ENABLEDBYOS 0x00000200 The operating system supports AVX ippCPUID_AES 0x00000400 AES instruction ippCPUID_CLMUL 0x00000800 PCLMULQDQ instruction ippCPUID_ABR 0x00001000 Aubrey Isle ippCPUID_RDRAND 0x00002000 RDRRAND instruction ippCPUID_F16C 0x00004000 Float16 instructions ippCPUID_AVX2 0x00008000 AVX2 ippCPUID_ADCOX 0x00010000 ADCX and ADOX instructions ippCPUID_RDSEED 0x00020000 the RDSEED instruction ippCPUID_PREFETCHW 0x00040000 PREFETCHW ippCPUID_SHA 0x00080000 Intel (R) SHA Extensions ippCPUID_KNC 0x80000000 Knights Corner instruction set //#define ippCPUID_AVX2_FMA 0x0008000 256bits fused-multiply-add instructions set //#define ippCPUID_AVX2_INT 0x0010000 256bits integer instructions set //#define ippCPUID_AVX2_GPR 0x0020000 VEX-encoded general-purpose instructions set */ /*=======================================================================*/ int __CDECL mfxownGetFeature( Ipp64u MaskOfFeature ) { if( (ownFeaturesMask & MaskOfFeature) == MaskOfFeature ) { return 1; } else { return 0; }; } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/owni.h000066400000000000000000000025201443134507600234320ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNI_H__ #define __OWNI_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #ifndef __IPPI_H__ #include "ippi.h" #endif #endif /* __OWNI_H__ */ /* ////////////////////////// End of file "owni.h" ////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ownj.h000066400000000000000000000035551443134507600234440ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNJ_H__ #define __OWNJ_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #ifndef __IPPS_H__ #include "ipps.h" #endif #ifndef __IPPI_H__ #include "ippi.h" #endif #ifndef __IPPJ_H__ #include "ippj.h" #endif #define DCTSIZE 8 #define DCTSIZE2 64 #if _IPP_ARCH == _IPP_ARCH_LRB #define CPU_CACHE_LINE 64 #else #define CPU_CACHE_LINE 32 #endif #define OWN_BADARG_RET(expr) \ {if (expr) { IPP_ERROR_RET( ippStsBadArgErr ); }} #define OWNAPI( type,name,arg ) extern type __CDECL name arg #define OWNFUN( type,name,arg ) extern type __CDECL name arg #define LOCFUN( type,name,arg ) static type __CDECL name arg #define ASMAPI OWNAPI #define ASMFUN OWNFUN #endif /* __OWNJ_H__ */ /* ///////////////////////// End of file "ownj.h" ////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/owns.h000066400000000000000000000026001443134507600234430ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNS_H__ #define __OWNS_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #ifndef __IPPS_H__ #include "ipps.h" #endif #define IPPS_ABS(a) ( ((a) < 0) ? -(a) : (a) ) #endif /* __OWNS_H__ */ /* ////////////////////////// End of file "owns.h" ////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ownvc.h000066400000000000000000000026541443134507600236220ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __OWNVC_H__ #define __OWNVC_H__ #ifndef __OWNDEFS_H__ #include "owndefs.h" #endif #ifndef __IPPS_H__ #include "ipps.h" #endif #ifndef __IPPI_H__ #include "ippi.h" #endif #ifndef __IPPVC_H__ #include "ippvc.h" #endif #endif /* __OWNVC_H__ */ /* ////////////////////////////// End of file /////////////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pccjoin422pxca.c000066400000000000000000000114101443134507600252000ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include "owncc.h" #if defined(_REF_LIB) extern void lmmintrin_init(); #endif #if _IPPLRB >= _IPPLRB_B1 void lrbAlYCbCr422_8u_P3C2R( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize); void lrbYCbCr422_8u_P3C2R ( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize); #endif #if defined _A6 extern void Join422_8u_A6 (const Ipp8u* src[3], int step[3], Ipp8u* dst, int dstep, int width, int height); extern void Split422_8u_A6(const Ipp8u* src, int step, Ipp8u* dst[3], int dstep[3], int width, int height); #endif #if _IPP > _IPP_A6 /*defined _W7*/ extern void Join422_8u_W7 (const Ipp8u* src[3], int step[3], Ipp8u* dst, int dstep, int width, int height); extern void Split422_8u_W7(const Ipp8u* src, int step, Ipp8u* dst[3], int dstep[3], int width, int height); #endif #if defined _I7 extern void Join422_8u_I7 (Ipp8u*, Ipp8u*, Ipp8u*, Ipp8u*, int*, int, int); extern void Split422_8u_I7(const Ipp8u*, Ipp8u*, Ipp8u*, Ipp8u*, int*, int, int); #endif /* formerly mfxiJoin422_8u_P3C2R For input we has : plain #1 y0y1y2y3y4y5 G roiSize in this place plain #2 cb0cb1cb2 B plain #3 cr0cr1cr2 R for output we'l should to receive y0 cb0 y1 cr0 y2 cb1 y3 cr1 y4 cb2 y5 cr2 */ IPPFUN(IppStatus,mfxiYCbCr422_8u_P3C2R,( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize)) { #if defined _I7 int Inp_Arr[4]; #endif Ipp8u* pSrc_Y0 ; Ipp8u* pSrc_cB ; Ipp8u* pSrc_cR ; int Step_Y ; int Step_cB ; int Step_cR ; /* test pointers */ IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pSrc[0]); IPP_BAD_PTR1_RET(pSrc[1]); IPP_BAD_PTR1_RET(pSrc[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height<=0), ippStsSizeErr); pSrc_Y0 = (Ipp8u*)pSrc[0]; pSrc_cB = (Ipp8u*)pSrc[1]; pSrc_cR = (Ipp8u*)pSrc[2]; Step_Y = srcStep[0]; Step_cB = srcStep[1]; Step_cR = srcStep[2]; /* test ROI size */ #if defined(_REF_LIB) lmmintrin_init(); #endif #if _IPPLRB >= _IPPLRB_B1 if( !( (srcStep[0] & 0x0f) || (srcStep[1] & 0x0f) || (srcStep[2] & 0x07) || (dstStep & 0x0f) || (IPP_UINT_PTR(pDst) & 0x0f) || (IPP_UINT_PTR(pSrc[0]) & 0x0f) || (IPP_UINT_PTR(pSrc[1]) & 0x07) || (IPP_UINT_PTR(pSrc[2]) & 0x07) ) ) lrbAlYCbCr422_8u_P3C2R( pSrc, srcStep, pDst, dstStep, roiSize); else lrbYCbCr422_8u_P3C2R( pSrc, srcStep, pDst, dstStep, roiSize); //return ippStsNoErr; #elif !defined _I7 roiSize.width &= -2; //#if !defined _I7 # if _IPP < _IPP_A6 roiSize.width *= 2; int i; for(i = 0; i < roiSize.height; i++) { int j; int k = 0; int m = 0; for(j = 0; j < roiSize.width; j += 4) { pDst[j + 0] = pSrc_Y0[m ]; pDst[j + 1] = pSrc_cB[k ]; pDst[j + 2] = pSrc_Y0[m + 1]; pDst[j + 3] = pSrc_cR[k ]; m += 2; k++; } pSrc_Y0 += Step_Y; pSrc_cB += Step_cB; pSrc_cR += Step_cR; pDst += dstStep; } # elif _IPP > _IPP_A6 Join422_8u_W7(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height); # else Join422_8u_A6(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height); # endif #else Inp_Arr[0] = Step_Y; Inp_Arr[1] = Step_cB; Inp_Arr[2] = Step_cR; Inp_Arr[3] = dstStep; Join422_8u_I7(pSrc_Y0, pSrc_cB, pSrc_cR, pDst, Inp_Arr, roiSize.width, roiSize.height); #endif return ippStsNoErr; } /* mfxiJoin422_8u_P3C2R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pccycbcr44deint.c000066400000000000000000000111461443134507600254410ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose : IPPI color space convert // // Contents: NV12(YCrCb)To YUV2(CrYCbY) YV12(YCrCb) // */ #include "owncc.h" #if !( (_IPP > _IPP_A6) || (_IPP32E>=_IPP32E_M7) ) static void mfxmyNV12ToYUY2_8u_P2C2R(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst, int dstStep, IppiSize roiSize) { int h,i,w; int width = roiSize.width ; int height = roiSize.height; for( h = 0;h < height; h += 2 ) { const Ipp8u* srcy; const Ipp8u* srcu; Ipp8u* dst; for( i = 0; i < 2; i++ ) { srcy = pSrcY;dst = pDst;srcu = pSrcUV; for( w = 0; w < width; w += 2 ) { dst[0] = srcy[0]; dst[2] = srcy[1]; dst[1] = srcu[0]; dst[3] = srcu[1]; dst+=4; srcy+= 2; srcu+= 2; } pDst = pDst + dstStep; pSrcY = pSrcY + srcYStep; } pSrcUV = pSrcUV + srcUVStep; } } /* YV12( YCrCb420_P3 ) > YUY2( YCbCr422_C2 ) */ static void mfxmyYV12ToYUY2420_8u_P3C2R(const Ipp8u* pSrc[3],int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize ) { int h,w; int width = roiSize.width ; int height = roiSize.height; const Ipp8u* pSrcY = pSrc[0]; const Ipp8u* pSrcU = pSrc[2];//??? const Ipp8u* pSrcV = pSrc[1]; for( h = 0;h < height; h += 2 ) { const Ipp8u* srcy; const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dst; srcy = pSrcY; srcu = pSrcU; srcv = pSrcV; dst = pDst; for( w = 0; w < width; w += 2 ) { dst[0] = *srcy++; dst[1] = *srcu++; dst[2] = *srcy++; dst[3] = *srcv++; dst += 4; } pSrcY += srcStep[0]; pDst += dstStep; srcy = pSrcY; srcu = pSrcU; srcv = pSrcV; dst = pDst; for( w = 0; w < width; w += 2 ) { dst[0] = *srcy++; dst[1] = *srcu++; dst[2] = *srcy++; dst[3] = *srcv++; dst += 4; } pSrcY += srcStep[0]; pSrcU += srcStep[2]; pSrcV += srcStep[1]; pDst += dstStep; } } #else #if(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) extern void mfxmyYV12ToYUY2420_8u_P3C2R(const Ipp8u* pSrc[3],int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxmyNV12ToYUY2_8u_P2C2R(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst, int dstStep, IppiSize roiSize); #endif//(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) #endif #if(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) /* YV12( YCrCb420_P3 ) > YUY2( YCbCr422_C2 ) formerly mfxiYVToYU420_8u_P3C2R */ IPPFUN(IppStatus, mfxiYCrCb420ToYCbCr422_8u_P3C2R,( const Ipp8u* pSrc[3],int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize )) { IPP_BAD_PTR2_RET( pSrc, pDst ); IPP_BAD_PTR3_RET( pSrc[0], pSrc[1], pSrc[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxmyYV12ToYUY2420_8u_P3C2R( pSrc, srcStep, pDst, dstStep, roiSize); return ippStsNoErr; } /* NV12( YCbCr420_P2 ) > YUY2( YCbCr422_C2 ) formerly mfxiJoin420_8u_P2C2R */ IPPFUN(IppStatus, mfxiYCbCr420ToYCbCr422_8u_P2C2R,(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst, int dstStep, IppiSize roiSize)) { ownpi_CnvrtEpilog3(pSrcY, pSrcUV, pDst, roiSize); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxmyNV12ToYUY2_8u_P2C2R( pSrcY, srcYStep, pSrcUV, srcUVStep, pDst, dstStep, roiSize); return ippStsNoErr; } #endif//(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pccycbcr44deintw7cn.c000066400000000000000000000167521443134507600262500ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Purpose : IPPI Color Space Conversion // // */ #include // __m128i etc #include "owncc.h" #if ( (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ) #if(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) /* Lib = W7 M7 */ /* Caller = mfxiYCbCr420ToYCbCr422_8u_P2C2R */ extern void mfxmyNV12ToYUY2_8u_P2C2R(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst, int dstStep, IppiSize roiSize) { int h,w,width8; int width = roiSize.width ; int height = roiSize.height; width8 = width & ~0x1f; for( h = 0;h < height; h += 2 ) { const Ipp8u* srcy; const Ipp8u* srcu; Ipp8u* dst; srcu = pSrcUV; srcy = pSrcY;dst = pDst; for(w = 0; w < width8; w += 32 ) { __m128i mSrcy; __m128i mSrcy1; mSrcy = _mm_loadu_si128((__m128i*)(srcy)); mSrcy1= _mm_loadu_si128((__m128i*)(srcy+16)); _mm_storeu_si128((__m128i*) dst ,_mm_unpacklo_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+16),_mm_unpackhi_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+32),_mm_unpacklo_epi8(mSrcy1,_mm_loadu_si128((__m128i*)(srcu+16)))); _mm_storeu_si128((__m128i*)(dst+48),_mm_unpackhi_epi8(mSrcy1,_mm_loadu_si128((__m128i*)(srcu+16)))); mSrcy = _mm_loadu_si128((__m128i*)(srcy+srcYStep)); mSrcy1= _mm_loadu_si128((__m128i*)(srcy+16+srcYStep)); _mm_storeu_si128((__m128i*)(dst+ dstStep),_mm_unpacklo_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+16+dstStep),_mm_unpackhi_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+32+dstStep),_mm_unpacklo_epi8(mSrcy1,_mm_loadu_si128((__m128i*)(srcu+16)))); _mm_storeu_si128((__m128i*)(dst+48+dstStep),_mm_unpackhi_epi8(mSrcy1,_mm_loadu_si128((__m128i*)(srcu+16)))); srcy += 32; srcu += 32; dst += 64; } if(( width & 0xf )>= 0xf) { __m128i mSrcy; mSrcy = _mm_loadu_si128((__m128i*)(srcy)); _mm_storeu_si128((__m128i*) dst ,_mm_unpacklo_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+16),_mm_unpackhi_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); mSrcy = _mm_loadu_si128((__m128i*)(srcy+srcYStep)); _mm_storeu_si128((__m128i*)(dst+ dstStep),_mm_unpacklo_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); _mm_storeu_si128((__m128i*)(dst+16+dstStep),_mm_unpackhi_epi8(mSrcy,_mm_loadu_si128((__m128i*)(srcu)))); srcy += 16; srcu += 16; dst += 32; w += 16; } for( ; w < width; w += 2 ) { dst[0] = srcy[0]; dst[2] = srcy[1]; dst[1] = srcu[0]; dst[3] = srcu[1]; dst[0+dstStep] = srcy[0+srcYStep]; dst[2+dstStep] = srcy[1+srcYStep]; dst[1+dstStep] = srcu[0]; dst[3+dstStep] = srcu[1]; dst+=4; srcy+= 2; srcu+= 2; } pDst = pDst + 2*dstStep; pSrcY = pSrcY + 2*srcYStep; pSrcUV = pSrcUV + srcUVStep; } } #endif//(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) #if(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) /* Lib = W7 M7 */ /* Caller = mfxiYCrCb420ToYCbCr422_8u_P3C2R */ /* YV12( YCrCb420_P3 ) > YUY2( YCbCr422_C2 ) */ extern void mfxmyYV12ToYUY2420_8u_P3C2R(const Ipp8u* pSrc[3],int srcStep[3], Ipp8u* pDst, int dstStep, IppiSize roiSize ) { int h,w,width8; int width = roiSize.width ; int height = roiSize.height; const Ipp8u* pSrcY = pSrc[0]; const Ipp8u* pSrcU = pSrc[2]; const Ipp8u* pSrcV = pSrc[1]; width8 = width & ~0x1f; for( h = 0;h < height; h += 2 ) { const Ipp8u* srcy; const Ipp8u* srcy1; const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dst; Ipp8u* dst1; srcy = pSrcY; srcy1 = pSrcY + srcStep[0]; srcu = pSrcU; srcv = pSrcV; dst = pDst; dst1 = pDst + dstStep; for(w = 0; w < width8; w += 32 ) { __m128i eSrcy,eSrcy1,eSrcu,eSrcv; __m128i eT0,eT1; eSrcy = _mm_loadu_si128((__m128i*)( srcy )); eSrcy1= _mm_loadu_si128((__m128i*)( srcy + 16 )); eSrcu = _mm_loadu_si128((__m128i*)(srcu)); eSrcv = _mm_loadu_si128((__m128i*)(srcv)); eT0 = _mm_unpacklo_epi8( eSrcu, eSrcv); eT1 = _mm_unpacklo_epi8( eSrcy, eT0); /* Y7v3Y6u3 ... Y3v1Y2u1 Y1v0Y0u0 */ _mm_storeu_si128((__m128i*)dst , eT1); eT0 = _mm_unpackhi_epi64( eT0, eT0); eT0 = _mm_unpacklo_epi8( _mm_unpackhi_epi64(eSrcy,eSrcy), eT0); /* Y15v7Y15u7 ... Y3v9Y2u9 Y8v4Y8u4 */ _mm_storeu_si128((__m128i*)(dst+16),eT0); eSrcy = eSrcy1; eT0 = _mm_unpackhi_epi8( eSrcu, eSrcv); eT1 = _mm_unpacklo_epi8( eSrcy, eT0 ); /* Y7v3Y6u3 ... Y3v9Y2u9 Y1v8Y0u8 */ _mm_storeu_si128((__m128i*)(dst+32), eT1); eT0 = _mm_unpackhi_epi64( eT0, eT0); eT0 = _mm_unpacklo_epi8( _mm_unpackhi_epi64(eSrcy,eSrcy), eT0); /* Y15v7Y15u7 ... Y3v9Y2u9 Y8v4Y8u4 */ _mm_storeu_si128((__m128i*)(dst+48),eT0); eSrcy = _mm_loadu_si128((__m128i*)( srcy1 )); eSrcy1= _mm_loadu_si128((__m128i*)( srcy1 + 16 )); eT0 = _mm_unpacklo_epi8( eSrcu, eSrcv); eT1 = _mm_unpacklo_epi8( eSrcy, eT0 ); /* Y7v3Y6u3 ... Y3v1Y2u1 Y1v0Y0u0 */ _mm_storeu_si128((__m128i*)dst1 , eT1); eT0 = _mm_unpackhi_epi64( eT0, eT0); eT0 = _mm_unpacklo_epi8( _mm_unpackhi_epi64(eSrcy,eSrcy), eT0); /* Y15v7Y15u7 ... Y3v9Y2u9 Y8v4Y8u4 */ _mm_storeu_si128((__m128i*)(dst1+16),eT0); eSrcy = eSrcy1; eT0 = _mm_unpackhi_epi8( eSrcu, eSrcv); eT1 = _mm_unpacklo_epi8( eSrcy, eT0 ); /* Y7v3Y6u3 ... Y3v9Y2u9 Y1v8Y0u8 */ _mm_storeu_si128((__m128i*)(dst1+32), eT1); eT0 = _mm_unpackhi_epi64( eT0, eT0); eT0 = _mm_unpacklo_epi8( _mm_unpackhi_epi64(eSrcy,eSrcy), eT0); /* Y15v7Y15u7 ... Y3v9Y2u9 Y8v4Y8u4 */ _mm_storeu_si128((__m128i*)(dst1+48),eT0); srcy += 32; srcy1+= 32; srcu += 16; srcv += 16; dst += 64; dst1 += 64; } for( ; w < width; w += 2 ) { dst[0] = *srcy++; dst[1] = *srcu; dst[2] = *srcy++; dst[3] = *srcv; dst1[0] = *srcy1++; dst1[1] = *srcu++; dst1[2] = *srcy1++; dst1[3] = *srcv++; dst += 4;dst1 += 4; } pSrcY += srcStep[0]; pSrcY += srcStep[0]; pDst += dstStep; pDst += dstStep; pSrcU += srcStep[1]; pSrcV += srcStep[2]; } } #endif//(!( (_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9))) #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pccyuvms.c000066400000000000000000000465351443134507600243400ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include "owncc.h" #if !( (_IPP > _IPP_A6) || (_IPP32E>=_IPP32E_M7)/*|| (_IPPLRB >= _IPPLRB_B1)*/) #if defined(_REF_LIB) extern void lmmintrin_init(); #endif #define CLIP(x) ((x < 0) ? 0 : ((x > 255) ? 255 : x)) static void mfxownYCbCr420ToYCbCr422_8u_P3R( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV) { int w; int h; const Ipp8u* pSrcU = pSrc[1]; const Ipp8u* pSrcV = pSrc[2]; int width = roiSize.width; int height = roiSize.height; int srcStepU = srcStep[1]; int srcStepV = srcStep[2]; if( orderUV ) { pSrcU = pSrc[2]; pSrcV = pSrc[1]; srcStepU = srcStep[2]; srcStepV = srcStep[1]; } /* Y plane */ for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dst; src = pSrc[0] + h * srcStep[0]; dst = pDst[0] + h * dstStep[0]; for( w = 0; w < width; w ++ ) { *dst++ = *src++; } } height /= 2;width /= 2; for( h = 0; h < height; h ++ ) { const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dstu; Ipp8u* dstv; srcu = pSrcU + h * srcStepU; srcv = pSrcV + h * srcStepV; dstu = pDst[1] + h * 2 * dstStep[1]; dstv = pDst[2] + h * 2 * dstStep[2]; for( w = 0; w < width; w ++ ) { *(dstu+dstStep[1]) = *srcu; *dstu++ = *srcu++; *(dstv+dstStep[2]) = *srcv; *dstv++ = *srcv++; } } return; } /* mfxownYCbCr420ToYCbCr422_8u_P3R() */ static void mfxownYCrCb420ToYCbCr422_8u_P3R( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize) { int w; int h; int width = roiSize.width; int height = roiSize.height; /* Y plane */ for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dst; src = pSrc[0] + h * srcStep[0]; dst = pDst[0] + h * dstStep[0]; for( w = 0; w < width; w ++ ) { *dst++ = *src++; } } height /= 2;width /= 2; for( h = 0; h < height; h ++ ) { const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dstu; Ipp8u* dstv; srcu = pSrc[2] + h * srcStep[2]; // Cb or U srcv = pSrc[1] + h * srcStep[1]; // Cr or V dstu = pDst[1] + h * 2 * dstStep[1]; dstv = pDst[2] + h * 2 * dstStep[2]; for( w = 0; w < width; w ++ ) { *(dstu+dstStep[1]) = *srcu; *dstu++ = *srcu++; *(dstv+dstStep[2]) = *srcv; *dstv++ = *srcv++; } } return; } /* mfxownYCrCb420ToYCbCr422_8u_P3R() */ #if !(_IPPLRB >= _IPPLRB_B1) static void mfxownYCbCr422ToYCbCr420_8u_P3R( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize) { int w; int h; int width = roiSize.width; int height = roiSize.height; /* Y plane */ for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dst; src = pSrc[0] + h * srcStep[0]; dst = pDst[0] + h * dstStep[0]; for( w = 0; w < width; w ++ ) { *dst++ = *src++; } } width /= 2; height /= 2; for( h = 0; h < height; h ++ ) { const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dstu; Ipp8u* dstv; srcu = pSrc[1] + h * 2 * srcStep[1]; srcv = pSrc[2] + h * 2 * srcStep[2]; dstu = pDst[1] + h * dstStep[1]; dstv = pDst[2] + h * dstStep[2]; for( w = 0; w < width; w ++ ) { *dstu++ = *srcu++; *dstv++ = *srcv++; } } return; } /* mfxownYCbCr422ToYCbCr420_8u_P3R() */ static void mfxownYCbCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV) { int w; int h; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1]; int dstStepV = dstStep[2]; int width = roiSize.width; int height = roiSize.height; if( orderUV ) { pDstU = pDst[2]; pDstV = pDst[1]; dstStepU = dstStep[2]; dstStepV = dstStep[1]; } for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty; Ipp8u* dstu; Ipp8u* dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width; w += 2 ) { *dsty++ = *src++; *dstu++ = *src++; *dsty++ = *src++; *dstv++ = *src++; } } return; } /* mfxownYCbCr422ToYCbCr422_8u_C2P3R() */ static void mfxownYCbCr422ToYCbCr420_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV) { int w; int h; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1]; int dstStepV = dstStep[2]; int width = roiSize.width; int height = roiSize.height; if( orderUV ) { pDstU = pDst[2]; pDstV = pDst[1]; dstStepU = dstStep[2]; dstStepV = dstStep[1]; } for( h = 0; h < height; h += 2 ) { const Ipp8u* src; Ipp8u* dsty; Ipp8u* dstu; Ipp8u* dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + (h>>1) * dstStepU; dstv = pDstV + (h>>1) * dstStepV; for( w = 0; w < width; w += 2 ) { dsty[0] = src[0]; dsty[0 + dstStep[0]] = src[0 + srcStep]; dsty[1] = src[2]; dsty[1 + dstStep[0]] = src[2 + srcStep]; *dstu++ = src[1]; *dstv++ = src[3]; dsty += 2; src += 4; } } return; } /* mfxownYCbCr422ToYCbCr420_8u_C2P3R() */ static void mfxownYCbCr422ToYCbCr411_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV) { int w; int h; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1]; int dstStepV = dstStep[2]; int width = roiSize.width; int height = roiSize.height; if( orderUV ) { pDstU = pDst[2]; pDstV = pDst[1]; dstStepU = dstStep[2]; dstStepV = dstStep[1]; } for( h = 0; h < height; h++ ) { const Ipp8u* src; Ipp8u* dsty; Ipp8u* dstu; Ipp8u* dstv; src = pSrc + h * srcStep; dsty = pDst[0]+ h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width; w += 4 ) { *dsty++ = src[0]; *dsty++ = src[2]; *dsty++ = src[4]; *dsty++ = src[6]; *dstu++ = src[1]; *dstv++ = src[3]; src += 8; } } return; } /* mfxownYCbCr422ToYCbCr411_8u_C2P3R() */ static void mfxownYCbCr420ToYCbCr420_8u_P2P3R( const Ipp8u* pSrcY, int srcYStep, const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize) { int w; int h; int width = roiSize.width; int height = roiSize.height; /* Y plane */ for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dst; dst = pDst[0]+ h * dstStep[0]; src = pSrcY + h * srcYStep; for( w = 0; w < width; w ++ ) { *dst++ = *src++; } } width /= 2; height /= 2; for( h = 0; h < height; h ++ ) { const Ipp8u* srcuv; Ipp8u* dstu; Ipp8u* dstv; srcuv = pSrcUV + h * srcUVStep; dstu = pDst[1] + h * dstStep[1]; dstv = pDst[2] + h * dstStep[2]; for( w = 0; w < width; w ++ ) { *dstu++ = srcuv[0]; *dstv++ = srcuv[1]; srcuv += 2; } } /* for h */ return; } /* mfxownYCbCr420ToYCbCr420_8u_P2P3R() */ static void mfxownCbYCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize) { int w; int h; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1]; int dstStepV = dstStep[2]; int width = roiSize.width; int height = roiSize.height; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty; Ipp8u* dstu; Ipp8u* dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width; w += 2 ) { *dstu++ = *src++; *dsty++ = *src++; *dstv++ = *src++; *dsty++ = *src++; } } return; } /* mfxownCbYCr422ToYCbCr422_8u_C2P3R() */ static void mfxownCbYCr422ToYCbCr411_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize) { int w; int h; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1]; int dstStepV = dstStep[2]; int width = roiSize.width; int height = roiSize.height; for( h = 0; h < height; h++ ) { const Ipp8u* src; Ipp8u* dsty; Ipp8u* dstu; Ipp8u* dstv; src = pSrc + h * srcStep; dsty = pDst[0]+ h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width; w += 4 ) { *dsty++ = src[1]; *dsty++ = src[3]; *dsty++ = src[5]; *dsty++ = src[7]; *dstu++ = src[0]; *dstv++ = src[2]; src += 8; } } return; } /* mfxownCbYCr422ToYCbCr411_8u_C2P3R() */ #else void mfxownYCbCr422ToYCbCr420_8u_P3R(const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize); extern void mfxownCbYCr422ToYCbCr422_8u_C2P3R(const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize); extern void mfxownCbYCr422ToYCbCr411_8u_C2P3R(const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize); void mfxownYCbCr422ToYCbCr420_8u_C2P3R(const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV); void mfxownYCbCr422ToYCbCr411_8u_C2P3R(const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize,int orderUV); void mfxownYCbCr420ToYCbCr420_8u_P2P3R(const Ipp8u* pSrcY,int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize); void mfxownYCbCr422ToYCbCr422_8u_C2P3R(const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV); #endif #else extern void mfxownYCbCr422ToYCbCr420_8u_P3R(const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ); extern void mfxownYCbCr420ToYCbCr422_8u_P3R(const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int ); extern void mfxownYCbCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize,int ); extern void mfxalYCbCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize,int ); extern void mfxownYCbCr422ToYCbCr420_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV ); extern void mfxownYCbCr420ToYCbCr420_8u_P2P3R(const Ipp8u* pSrcY,int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ); extern void mfxownCbYCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ); #endif /* /////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422ToYCbCr420_8u_P3R, mfxiYCbCr420ToYCbCr422_8u_P3R // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 2 // // Arguments: // pSrc array of pointers to the components of the source image // srcStep array of step values for every component // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width and roiSize.height should be multiple 2. */ /* P422ToI420(IYUV) */ IPPFUN(IppStatus, mfxiYCbCr422ToYCbCr420_8u_P3R,( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR2_RET( pSrc, pDst ); IPP_BAD_PTR3_RET( pSrc[0], pSrc[1], pSrc[2]); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxownYCbCr422ToYCbCr420_8u_P3R( pSrc, srcStep, pDst, dstStep, roiSize); return ippStsNoErr; } /* mfxiYCbCr422ToYCbCr420_8u_P3R() */ /* IYUVToP422 */ IPPFUN(IppStatus, mfxiYCbCr420ToYCbCr422_8u_P3R,( const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR2_RET( pSrc, pDst ); IPP_BAD_PTR3_RET( pSrc[0], pSrc[1], pSrc[2]); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxownYCbCr420ToYCbCr422_8u_P3R( pSrc, srcStep, pDst, dstStep, roiSize, 0 ); return ippStsNoErr; } /* mfxiYCbCr420ToYCbCr422_8u_P3R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422ToYCbCr422_8u_C2P3R mfxiYCrCb422ToYCbCr422_8u_C2P3R // // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 // // Arguments: // pSrc array of pointers to the components of the source image // srcStep array of step values for every component // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width should be multiple 2. */ /* YUY2ToP422 */ IPPFUN(IppStatus, mfxiYCbCr422_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR3_RET( pSrc, pDst, dstStep ); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 1), ippStsSizeErr); roiSize.width &= ~1; #if ( (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ) if( !( ( ( IPP_UINT_PTR(pDst[0]) | IPP_UINT_PTR(pSrc) | dstStep[0] | srcStep ) & 0x0f ) || ( roiSize.width & 0x0f ) ) ) { mfxalYCbCr422ToYCbCr422_8u_C2P3R( pSrc, srcStep, pDst, dstStep, roiSize, 0); } else { #endif mfxownYCbCr422ToYCbCr422_8u_C2P3R( pSrc, srcStep, pDst, dstStep, roiSize, 0); #if ( (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ) } #endif return ippStsNoErr; } /* mfxiYCbCr422_8u_C2P3R() */ IPPFUN(IppStatus, mfxiCbYCr422ToYCbCr422_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR2_RET( pSrc, pDst ); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BAD_SIZE_RET(roiSize.height); roiSize.width &= ~1; mfxownCbYCr422ToYCbCr422_8u_C2P3R( pSrc, srcStep, pDst, dstStep, roiSize); return ippStsNoErr; } /* mfxiCbYCr422ToYCbCr422_8u_C2P3R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr422ToYCbCr420_8u_C2P3R // // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 2 // // Arguments: // pSrc array of pointers to the components of the source image // srcStep array of step values for every component // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width and roiSize.height should be multiple 2. */ /* YUY2ToI420 */ IPPFUN(IppStatus, mfxiYCbCr422ToYCbCr420_8u_C2P3R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR2_RET( pSrc, pDst ); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxownYCbCr422ToYCbCr420_8u_C2P3R( pSrc, srcStep, pDst, dstStep, roiSize, 0); return ippStsNoErr; } /* mfxiYCbCr422ToYCbCr420_8u_C2P3R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: mfxiYCbCr420ToYCbCr422_Filter_8u_P2P3R // Purpose: Converts a IYUV image to the P422 image. // Return: // ippStsNoErr Ok // ippStsNullPtrErr One or more pointers are NULL // ippStsSizeErr if roiSize.width < 2 || roiSize.height < 8 // // Arguments: // pSrcY pointer to the source Y plane // srcYStep step for the source Y plane // pSrcUV pointer to the source UV plane // srcUVStep step for the source UV plane // pDst array of pointers to the components of the destination image // dstStep array of steps values for every component // roiSize region of interest to be processed, in pixels // Notes: // roiSize.width should be multiple 2. // roiSize.height should be multiple 8. // We use here Catmull-Rom interpolation. */ /* NV12ToP422, formerly mfxiYCbCr420ToYCbCr420_8u_P2P3R */ IPPFUN(IppStatus, mfxiYCbCr420_8u_P2P3R,( const Ipp8u* pSrcY, int srcYStep, const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize)) { IPP_BAD_PTR1_RET( pDst ); IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2]); IPP_BAD_PTR2_RET( pSrcY, pSrcUV ); IPP_BADARG_RET((roiSize.width < 2), ippStsSizeErr); IPP_BADARG_RET((roiSize.height < 2), ippStsSizeErr); roiSize.width &= ~1; roiSize.height &= ~1; mfxownYCbCr420ToYCbCr420_8u_P2P3R( pSrcY, srcYStep, pSrcUV, srcUVStep, pDst, dstStep, roiSize ); return ippStsNoErr; } /* mfxiYCbCr420_8u_P2P3R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pccyuvmsw7.c000066400000000000000000000631461443134507600246130ustar00rootroot00000000000000// Copyright (c) 2018-2022 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include // __m128 etc #include "owncc.h" #if ( (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ) #if ( (_IPP >= _IPP_W7) ) extern void mfxownccCopy_8u_C1_W7( const Ipp8u* pSrc, Ipp8u* pDst, int len, int nonTemporal ); #elif ( (_IPP32E >= _IPP32E_M7) ) extern void mfxownccCopy_8u_C1_M7( const Ipp8u* pSrc, Ipp8u* pDst, int len, int nonTemporal ); #endif #define CLIP(x) ((x < 0) ? 0 : ((x > 255) ? 255 : x)) /* Lib = W7 M7 Caller = mfxiYCbCr422ToYCbCr420_8u_P3R */ extern void mfxownYCbCr422ToYCbCr420_8u_P3R(const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ) { int h; int width = roiSize.width ; int height = roiSize.height; int nonTemporal = 0; /* Y plane */ if( width*height > 348602 /* 131072 */ ) nonTemporal = 1; for( h = 0; h < height; h ++ ) { #if ( (_IPP >= _IPP_W7) ) mfxownccCopy_8u_C1_W7( pSrc[0] + h * srcStep[0], pDst[0] + h * dstStep[0], width, nonTemporal ); #elif ( (_IPP32E >= _IPP32E_M7) ) mfxownccCopy_8u_C1_M7( pSrc[0] + h * srcStep[0], pDst[0] + h * dstStep[0], width, nonTemporal ); #endif } height /= 2; width /= 2; // if( width*height > 348602 /* 131072 */ ) nonTemporal = 1; for( h = 0; h < height; h ++ ) { const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dstu; Ipp8u* dstv; srcu = pSrc[1] + h * 2 * srcStep[1]; dstu = pDst[1] + h * dstStep[1]; srcv = pSrc[2] + h * 2 * srcStep[2]; dstv = pDst[2] + h * dstStep[2]; #if ( (_IPP >= _IPP_W7) ) mfxownccCopy_8u_C1_W7( srcu, dstu, width, 0 ); mfxownccCopy_8u_C1_W7( srcv, dstv, width, 0 ); #elif ( (_IPP32E >= _IPP32E_M7) ) mfxownccCopy_8u_C1_M7( srcu, dstu, width, 0 ); mfxownccCopy_8u_C1_M7( srcv, dstv, width, 0 ); #endif } } /* Lib = W7 M7 Caller = mfxiYCbCr420ToYCbCr422_8u_P3R */ extern void mfxownYCbCr420ToYCbCr422_8u_P3R(const Ipp8u* pSrc[3], int srcStep[3], Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize,int orderUV ) { int h,w,width64,width32,width16,width8; const Ipp8u* pSrcU = pSrc[1]; const Ipp8u* pSrcV = pSrc[2]; int width = roiSize.width ; int height = roiSize.height; int srcStepU = srcStep[1], srcStepV = srcStep[2]; // int nonTemporal = 0; int sStep = srcStep[0],dStep = dstStep[0]; const Ipp8u* sRc = pSrc[0]; Ipp8u* dSt = pDst[0]; if( orderUV ){ pSrcU = pSrc[2]; pSrcV = pSrc[1]; srcStepU = srcStep[2]; srcStepV = srcStep[1]; } /* Y plane */ // if( width*height > 348602 /* 131072 */ ) nonTemporal = 1; for( h = 0; h < height; h++ ) { #if ( (_IPP >= _IPP_W7) ) mfxownccCopy_8u_C1_W7( sRc, dSt, width, 0 ); #elif ( (_IPP32E >= _IPP32E_M7) ) mfxownccCopy_8u_C1_M7( sRc, dSt, width, 0 ); #endif sRc += sStep, dSt += dStep; } height /= 2;width /= 2; width64 = width & ~0x3f; width32 = width & 0x3f; width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h ++ ) { const Ipp8u* srcu; const Ipp8u* srcv; Ipp8u* dstu; Ipp8u* dstv; int dsu = dstStep[1]; int dsv = dstStep[2]; srcu = pSrcU + h * srcStepU; dstu = pDst[1] + h * 2 * dstStep[1]; srcv = pSrcV + h * srcStepV; dstv = pDst[2] + h * 2 * dstStep[2]; for( w = 0; w < width64; w += 64 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_loadu_si128((__m128i*)srcu); t1 = _mm_loadu_si128((__m128i*)(srcu+16)); t2 = _mm_loadu_si128((__m128i*)(srcu+32)); t3 = _mm_loadu_si128((__m128i*)(srcu+48)); t4 = _mm_loadu_si128((__m128i*)srcv); t5 = _mm_loadu_si128((__m128i*)(srcv+16)); t6 = _mm_loadu_si128((__m128i*)(srcv+32)); t7 = _mm_loadu_si128((__m128i*)(srcv+48)); _mm_storeu_si128((__m128i*) dstu , t0); _mm_storeu_si128((__m128i*)(dstu+16), t1); _mm_storeu_si128((__m128i*)(dstu+32), t2); _mm_storeu_si128((__m128i*)(dstu+48), t3); _mm_storeu_si128((__m128i*)(dstu+dsu) , t0); _mm_storeu_si128((__m128i*)(dstu+16+dsu), t1); _mm_storeu_si128((__m128i*)(dstu+32+dsu), t2); _mm_storeu_si128((__m128i*)(dstu+48+dsu), t3); _mm_storeu_si128((__m128i*) dstv , t4); _mm_storeu_si128((__m128i*)(dstv+16), t5); _mm_storeu_si128((__m128i*)(dstv+32), t6); _mm_storeu_si128((__m128i*)(dstv+48), t7); _mm_storeu_si128((__m128i*)(dstv+dsv), t4); _mm_storeu_si128((__m128i*)(dstv+16+dsv), t5); _mm_storeu_si128((__m128i*)(dstv+32+dsv), t6); _mm_storeu_si128((__m128i*)(dstv+48+dsv), t7); dstu += 64; srcu += 64;dstv += 64; srcv += 64; } if( width32 >= 32 ) { __m128i t0,t1; __m128i t4,t5; w += 32; t0 = _mm_loadu_si128((__m128i*)srcu); t1 = _mm_loadu_si128((__m128i*)(srcu+16)); t4 = _mm_loadu_si128((__m128i*)srcv); t5 = _mm_loadu_si128((__m128i*)(srcv+16)); _mm_storeu_si128((__m128i*) dstu , t0); _mm_storeu_si128((__m128i*)(dstu+16), t1); _mm_storeu_si128((__m128i*)(dstu+dsu) , t0); _mm_storeu_si128((__m128i*)(dstu+16+dsu), t1); _mm_storeu_si128((__m128i*) dstv , t4); _mm_storeu_si128((__m128i*)(dstv+16), t5); _mm_storeu_si128((__m128i*)(dstv+dsu), t4); _mm_storeu_si128((__m128i*)(dstv+16+dsu), t5); dstu += 32; srcu += 32; dstv += 32; srcv += 32; } if( width16 >= 16 ) { __m128i t0; __m128i t4; w += 16; t0 = _mm_loadu_si128((__m128i*)srcu); t4 = _mm_loadu_si128((__m128i*)srcv); _mm_storeu_si128((__m128i*) dstu , t0); _mm_storeu_si128((__m128i*)(dstu+dsu) , t0); _mm_storeu_si128((__m128i*) dstv , t4); _mm_storeu_si128((__m128i*)(dstv+dsu), t4); dstu += 16; srcu += 16; dstv += 16; srcv += 16; } if( width8 >= 8 ) { __m128i t0; __m128i t4; w += 8; t0 = _mm_loadl_epi64((__m128i*)srcu); t4 = _mm_loadl_epi64((__m128i*)srcv); _mm_storel_epi64((__m128i*) dstu , t0); _mm_storel_epi64((__m128i*)(dstu+dsu) ,t0); _mm_storel_epi64((__m128i*) dstv , t4); _mm_storel_epi64((__m128i*)(dstv+dsu), t4); dstu += 8; srcu += 8; dstv += 8; srcv += 8; } for( ; w < width; w ++ ) { *(dstu+dstStep[1]) = *srcu; *dstu++ = *srcu++; *(dstv+dstStep[2]) = *srcv; *dstv++ = *srcv++; } } } /* Lib = W7 M7 Caller = mfxiYCbCr422_8u_C2P3R */ extern void mfxalYCbCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int reserved) { reserved = 0; int h,w,width32,width8,width16; int width = roiSize.width ; int height = roiSize.height; __m128i mask = _mm_set1_epi32(0x00ff00ff); width32 = width & ~0x1f; width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDst[1] + h * dstStep[1]; dstv = pDst[2] + h * dstStep[2]; for( w = 0; w < width32; w += 32 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_load_si128((__m128i*) src); t1 = _mm_load_si128((__m128i*)(src+16)); t2 = _mm_load_si128((__m128i*)(src+32)); t3 = _mm_load_si128((__m128i*)(src+48)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t6 = _mm_and_si128( t2, mask ); t7 = _mm_and_si128( t3, mask ); t4 = _mm_packus_epi16( t4, t5); t6 = _mm_packus_epi16( t6, t7); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t3 = _mm_srli_epi16( t3 , 8 ); t0 = _mm_packus_epi16( t0, t1); t2 = _mm_packus_epi16( t2, t3); t1 = _mm_and_si128( t0, mask ); t3 = _mm_and_si128( t2, mask ); t1 = _mm_packus_epi16( t1, t3); //U _mm_stream_si128 t0 = _mm_srli_epi16( t0 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t0 = _mm_packus_epi16( t0, t2); //V _mm_store_si128((__m128i*) (dsty) , t4); _mm_store_si128((__m128i*) (dsty+16), t6); _mm_storeu_si128((__m128i*) (dstu) , t1); _mm_storeu_si128((__m128i*) (dstv) , t0); src += 64;dsty += 32;dstu += 16;dstv += 16; } if( width16 >= 16 ) { __m128i t0,t1; __m128i t4,t5; t0 = _mm_load_si128((__m128i*) src); t1 = _mm_load_si128((__m128i*)(src+16)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t4 = _mm_packus_epi16( t4, t5); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t0 = _mm_packus_epi16( t0, t1); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_store_si128((__m128i*) (dsty) , t4); _mm_storel_epi64( (__m128i*) dstu , t1); _mm_storel_epi64( (__m128i*) dstv , t0); src += 32;dsty += 16;dstu += 8;dstv += 8; } if( width8 >= 8 ) { __m128i t0, t1; __m128i t4; t0 = _mm_load_si128((__m128i*) src); t4 = _mm_and_si128( t0, mask ); t4 = _mm_packus_epi16( t4, t4); t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t0); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storel_epi64( (__m128i*) dsty , t4); *(int*)dstu = _mm_cvtsi128_si32( t1 ); *(int*)dstv = _mm_cvtsi128_si32( t0 ); } } _mm_sfence(); } /* Lib = W7 M7 Caller = mfxiYCbCr422_8u_C2P3R */ extern void mfxownYCbCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV ) { int h,w,width32,width8,width16; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1], dstStepV = dstStep[2]; int width = roiSize.width ; int height = roiSize.height; __m128i mask = _mm_set1_epi32(0x00ff00ff); if( orderUV ){ pDstU = pDst[2]; pDstV = pDst[1]; dstStepU = dstStep[2]; dstStepV = dstStep[1]; } width32 = width & ~0x1f; width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width32; w += 32 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t2 = _mm_loadu_si128((__m128i*)(src+32)); t3 = _mm_loadu_si128((__m128i*)(src+48)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t6 = _mm_and_si128( t2, mask ); t7 = _mm_and_si128( t3, mask ); t4 = _mm_packus_epi16( t4, t5); t6 = _mm_packus_epi16( t6, t7); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t3 = _mm_srli_epi16( t3 , 8 ); t0 = _mm_packus_epi16( t0, t1); t2 = _mm_packus_epi16( t2, t3); t1 = _mm_and_si128( t0, mask ); t3 = _mm_and_si128( t2, mask ); t1 = _mm_packus_epi16( t1, t3); //U t0 = _mm_srli_epi16( t0 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t0 = _mm_packus_epi16( t0, t2); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storeu_si128((__m128i*) (dsty+16), t6); _mm_storeu_si128((__m128i*) (dstu) , t1); _mm_storeu_si128((__m128i*) (dstv) , t0); src += 64;dsty += 32;dstu += 16;dstv += 16; } if( width16 >= 16 ) { __m128i t0,t1; __m128i t4,t5; w += 16; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t4 = _mm_packus_epi16( t4, t5); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t0 = _mm_packus_epi16( t0, t1); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storel_epi64( (__m128i*) dstu , t1); _mm_storel_epi64( (__m128i*) dstv , t0); src += 32;dsty += 16;dstu += 8;dstv += 8; } if( width8 >= 8 ) { __m128i t0, t1; __m128i t4; w += 8; t0 = _mm_loadu_si128((__m128i*) src); t4 = _mm_and_si128( t0, mask ); t4 = _mm_packus_epi16( t4, t4); t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t0); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storel_epi64( (__m128i*) dsty , t4); *(int*)dstu = _mm_cvtsi128_si32( t1 ); *(int*)dstv = _mm_cvtsi128_si32( t0 ); src += 16;dsty += 8;dstu += 4;dstv += 4; } for( ; w < width; w += 2 ) { *dsty++ = *src++; *dstu++ = *src++; *dsty++ = *src++; *dstv++ = *src++; } } } /* Lib = W7 M7 Caller = mfxiYCbCr422ToYCbCr420_8u_C2P3R */ extern void mfxownYCbCr422ToYCbCr420_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize, int orderUV) { int h,w,width32,width8,width16; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstS = dstStep[0]; int dstStepU = dstStep[1], dstStepV = dstStep[2]; int width = roiSize.width ; int height = roiSize.height; __m128i mask = _mm_set1_epi32(0x00ff00ff); if( orderUV ){ pDstU = pDst[2]; pDstV = pDst[1]; dstStepU = dstStep[2]; dstStepV = dstStep[1]; } width32 = width & ~0x3f; width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h += 2 ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + (h>>1) * dstStepU; dstv = pDstV + (h>>1) * dstStepV; for( w = 0; w < width32; w += 32 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t2 = _mm_loadu_si128((__m128i*)(src+32)); t3 = _mm_loadu_si128((__m128i*)(src+48)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t6 = _mm_and_si128( t2, mask ); t7 = _mm_and_si128( t3, mask ); t4 = _mm_packus_epi16( t4, t5); t6 = _mm_packus_epi16( t6, t7); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t3 = _mm_srli_epi16( t3 , 8 ); t0 = _mm_packus_epi16( t0, t1); t2 = _mm_packus_epi16( t2, t3); t1 = _mm_and_si128( t0, mask ); t3 = _mm_and_si128( t2, mask ); t1 = _mm_packus_epi16( t1, t3); //U t0 = _mm_srli_epi16( t0 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t0 = _mm_packus_epi16( t0, t2); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storeu_si128((__m128i*) (dsty+16), t6); _mm_storeu_si128((__m128i*) (dstu) , t1); _mm_storeu_si128((__m128i*) (dstv) , t0); t0 = _mm_loadu_si128((__m128i*)(src+srcStep)); t1 = _mm_loadu_si128((__m128i*)(src+16+srcStep)); t2 = _mm_loadu_si128((__m128i*)(src+32+srcStep)); t3 = _mm_loadu_si128((__m128i*)(src+48+srcStep)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t6 = _mm_and_si128( t2, mask ); t7 = _mm_and_si128( t3, mask ); t4 = _mm_packus_epi16( t4, t5); t6 = _mm_packus_epi16( t6, t7); _mm_storeu_si128((__m128i*) (dsty+dstS) , t4); _mm_storeu_si128((__m128i*) (dsty+16+dstS), t6); src += 64;dsty += 32;dstu += 16;dstv += 16; } if( width16 >= 16 ) { __m128i t0,t1; __m128i t4,t5; w += 16; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t4 = _mm_packus_epi16( t4, t5); t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t0 = _mm_packus_epi16( t0, t1); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storel_epi64( (__m128i*) dstu , t1); _mm_storel_epi64( (__m128i*) dstv , t0); t0 = _mm_loadu_si128((__m128i*)(src+srcStep)); t1 = _mm_loadu_si128((__m128i*)(src+16+srcStep)); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t4 = _mm_packus_epi16( t4, t5); _mm_storeu_si128((__m128i*) (dsty+dstS) , t4); src += 32;dsty += 16;dstu += 8;dstv += 8; } if( width8 >= 8 ) { __m128i t0, t1; __m128i t4; w += 8; t0 = _mm_loadu_si128((__m128i*) src); t4 = _mm_and_si128( t0, mask ); t4 = _mm_packus_epi16( t4, t4); t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t0); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storel_epi64( (__m128i*) dsty , t4); *(int*)dstu = _mm_cvtsi128_si32( t1 ); *(int*)dstv = _mm_cvtsi128_si32( t0 ); t0 = _mm_loadu_si128((__m128i*)(src+srcStep)); t4 = _mm_and_si128( t0, mask ); t4 = _mm_packus_epi16( t4, t4); t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t0); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storel_epi64( (__m128i*) (dsty+dstS), t4); src += 16;dsty += 8;dstu += 4;dstv += 4; } for( ; w < width; w += 2 ) { dsty[0] = src[0]; dsty[0 + dstStep[0]] = src[0 + srcStep]; dsty[1] = src[2]; dsty[1 + dstStep[0]] = src[2 + srcStep]; *dstu++ = src[1]; *dstv++ = src[3]; dsty += 2; src += 4; } } } /* Lib = W7 M7 Caller = mfxiYCbCr420_8u_P2P3R */ extern void mfxownYCbCr420ToYCbCr420_8u_P2P3R(const Ipp8u* pSrcY,int srcYStep,const Ipp8u* pSrcUV, int srcUVStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ) { int h,w,width32,width16,width8; int width = roiSize.width ; int height = roiSize.height; // int nonTemporal = 0; int dStep = dstStep[0]; const Ipp8u* sRc = pSrcY; __m128i mask = _mm_set1_epi32(0x00ff00ff); Ipp8u* dSt = pDst[0]; /* Y plane */ // if( width*height > 348602 /* 131072 */ ) nonTemporal = 1; for( h = 0; h < height; h++ ) { #if ( (_IPP >= _IPP_W7) ) mfxownccCopy_8u_C1_W7( sRc, dSt, width, 0 ); #elif ( (_IPP32E >= _IPP32E_M7) ) mfxownccCopy_8u_C1_M7( sRc, dSt, width, 0 ); #endif sRc += srcYStep, dSt += dStep; } height /= 2;width /= 2; width32 = width & ~0x1f;width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h ++ ) { const Ipp8u* srcuv; Ipp8u* dstu; Ipp8u* dstv; srcuv = pSrcUV + h * srcUVStep ; dstu = pDst[1] + h * dstStep[1]; dstv = pDst[2] + h * dstStep[2]; for( w = 0; w < width32; w += 32 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_loadu_si128((__m128i*) srcuv ); t1 = _mm_loadu_si128((__m128i*)(srcuv+16 )); t2 = _mm_loadu_si128((__m128i*)(srcuv+32 )); t3 = _mm_loadu_si128((__m128i*)(srcuv+48 )); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t6 = _mm_and_si128( t2, mask ); t7 = _mm_and_si128( t3, mask ); t4 = _mm_packus_epi16( t4, t5);//u t6 = _mm_packus_epi16( t6, t7);//u t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t3 = _mm_srli_epi16( t3 , 8 ); t0 = _mm_packus_epi16( t0, t1); t2 = _mm_packus_epi16( t2, t3);//v _mm_storeu_si128((__m128i*) dstu , t4); _mm_storeu_si128((__m128i*)(dstu+16), t6); _mm_storeu_si128((__m128i*) dstv , t0); _mm_storeu_si128((__m128i*)(dstv+16), t2); dstu += 32; srcuv += 64;dstv += 32; } if( width16 >= 16 ) { __m128i t0,t1; __m128i t4,t5; w += 16; t0 = _mm_loadu_si128((__m128i*) srcuv ); t1 = _mm_loadu_si128((__m128i*)(srcuv+16 )); t4 = _mm_and_si128( t0, mask ); t5 = _mm_and_si128( t1, mask ); t4 = _mm_packus_epi16( t4, t5);//u t0 = _mm_srli_epi16( t0 , 8 ); t1 = _mm_srli_epi16( t1 , 8 ); t0 = _mm_packus_epi16( t0, t1); _mm_storeu_si128((__m128i*) dstu , t4); _mm_storeu_si128((__m128i*) dstv , t0); dstu += 16; srcuv += 32;dstv += 16; } if( width8 >= 8 ) { __m128i t0; __m128i t4; w += 8; t0 = _mm_loadu_si128((__m128i*) srcuv ); t4 = _mm_and_si128( t0, mask ); t4 = _mm_packus_epi16( t4, t4);//u t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t0); _mm_storel_epi64((__m128i*) dstu , t4); _mm_storel_epi64((__m128i*) dstv , t0); dstu += 8; srcuv += 16;dstv += 8; } for( ; w < width; w ++ ) { *dstu++ = srcuv[0]; *dstv++ = srcuv[1]; srcuv += 2; } } } /* Lib = W7 M7 Caller = mfxiCbYCr422ToYCbCr422_8u_C2P3R */ extern void mfxownCbYCr422ToYCbCr422_8u_C2P3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst[3], int dstStep[3], IppiSize roiSize ) { int h,w,width32,width8,width16; Ipp8u* pDstU = pDst[1]; Ipp8u* pDstV = pDst[2]; int dstStepU = dstStep[1], dstStepV = dstStep[2]; int width = roiSize.width ; int height = roiSize.height; __m128i mask = _mm_set1_epi32(0x00ff00ff); width32 = width & ~0x1f; width16 = width & 0x1f; width8 = width & 0x0f; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pSrc + h * srcStep; dsty = pDst[0] + h * dstStep[0]; dstu = pDstU + h * dstStepU; dstv = pDstV + h * dstStepV; for( w = 0; w < width32; w += 32 ) { __m128i t0,t1,t2,t3; __m128i t4,t5,t6,t7; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t2 = _mm_loadu_si128((__m128i*)(src+32)); t3 = _mm_loadu_si128((__m128i*)(src+48)); t4 = _mm_srli_epi16( t0 , 8 ); //Y t5 = _mm_srli_epi16( t1 , 8 ); t6 = _mm_srli_epi16( t2 , 8 ); t7 = _mm_srli_epi16( t3 , 8 ); t4 = _mm_packus_epi16( t4, t5); t6 = _mm_packus_epi16( t6, t7); t0 = _mm_and_si128( t0, mask ); // V U t1 = _mm_and_si128( t1, mask ); t2 = _mm_and_si128( t2, mask ); t3 = _mm_and_si128( t3, mask ); t0 = _mm_packus_epi16( t0, t1); t2 = _mm_packus_epi16( t2, t3); t1 = _mm_and_si128( t0, mask ); t3 = _mm_and_si128( t2, mask ); t1 = _mm_packus_epi16( t1, t3); //U t0 = _mm_srli_epi16( t0 , 8 ); t2 = _mm_srli_epi16( t2 , 8 ); t0 = _mm_packus_epi16( t0, t2); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storeu_si128((__m128i*) (dsty+16), t6); _mm_storeu_si128((__m128i*) (dstu) , t1); _mm_storeu_si128((__m128i*) (dstv) , t0); src += 64;dsty += 32;dstu += 16;dstv += 16; } if( width16 >= 16 ) { __m128i t0,t1; __m128i t4,t5; w += 16; t0 = _mm_loadu_si128((__m128i*) src); t1 = _mm_loadu_si128((__m128i*)(src+16)); t4 = _mm_srli_epi16( t0 , 8 ); //Y t5 = _mm_srli_epi16( t1 , 8 ); t4 = _mm_packus_epi16( t4, t5); t0 = _mm_and_si128( t0, mask ); // V U t1 = _mm_and_si128( t1, mask ); t0 = _mm_packus_epi16( t0, t1); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storeu_si128((__m128i*) (dsty) , t4); _mm_storel_epi64( (__m128i*) dstu , t1); _mm_storel_epi64( (__m128i*) dstv , t0); src += 32;dsty += 16;dstu += 8;dstv += 8; } if( width8 >= 8 ) { __m128i t0, t1; __m128i t4; w += 8; t0 = _mm_loadu_si128((__m128i*) src); t4 = _mm_srli_epi16( t0 , 8 ); //Y t4 = _mm_packus_epi16( t4, t4); t0 = _mm_and_si128( t0, mask ); // V U t0 = _mm_packus_epi16( t0, t0); t1 = _mm_and_si128( t0, mask ); t1 = _mm_packus_epi16( t1, t1); //U t0 = _mm_srli_epi16( t0 , 8 ); t0 = _mm_packus_epi16( t0, t1); //V _mm_storel_epi64( (__m128i*) dsty , t4); *(int*)dstu = _mm_cvtsi128_si32( t1 ); *(int*)dstv = _mm_cvtsi128_si32( t0 ); src += 16;dsty += 8;dstu += 4;dstv += 4; } for( ; w < width; w += 2 ) { *dstu++ = *src++; *dsty++ = *src++; *dstv++ = *src++; *dsty++ = *src++; } } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/piconvert02ca.c000066400000000000000000000100651443134507600251330ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #include "owni.h" #include "ippcore.h" #if !((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) #if !( (_IPP>=_IPP_M6) || (_IPP32E>=_IPP32E_M7) || (_IPP64>=_IPP64_I7) ) #define _CCODE #endif #if ( _IPPLP32 == _IPPLP32_S8 ) || ( _IPPLP64 == _IPPLP64_N8 ) || ( _IPP <= _IPP_W7 ) #define BOUND_NT 524288 #else #define BOUND_NT 1048576 #endif #if ( _IPP32E >= _IPP32E_M7 ) extern void mfxowniConvert_8u16u_M7 ( const Ipp8u *pSrc, Ipp16u *pDst, int len, int nonTemporal ); #endif #if ( _IPP >= _IPP_W7 ) extern void mfxowniConvert_8u16u_W7 ( const Ipp8u *pSrc, Ipp16u *pDst, int len, int nonTemporal ); #endif #if defined (_A6) extern void mfxowniConvert_8u16u_A6( const Ipp8u *pSrc, Ipp16u *pDst, int len ); #endif #if (_IPPLRB>=_IPPLRB_B1) extern void mfxowniConvert_8u16u( const Ipp8u *pSrc, int srcStep, Ipp16u *pDst, int dstStep, int width, int height, int nCh ); #endif #endif /*******************************************************************/ IPPFUN ( IppStatus, mfxiConvert_8u16u_C1R, ( const Ipp8u* __RESTRICT pSrc, int srcStep, Ipp16u* __RESTRICT pDst, int dstStep, IppiSize roiSize )) { #if !((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) #if !(_IPPLRB>=_IPPLRB_B1) const Ipp8u* __RESTRICT src = pSrc; Ipp16u* __RESTRICT dst = pDst; int width = roiSize.width, height = roiSize.height; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int n; #endif #if ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) IppStatus ownStatus = ippStsNoErr; int nonTemporal = 0, size = 0, cache = 0; #endif #endif IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) IPP_BAD_STEP_RET( srcStep ) IPP_BAD_STEP_RET( dstStep ) #if !(_IPPLRB>=_IPPLRB_B1) #if ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) size = width*height*3; if( size > BOUND_NT ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( size >= cache ) nonTemporal = 1; } } #endif if( (srcStep*2 == dstStep) && (srcStep == width) ) { width *= height; height = 1; } for( h = 0; h < height; h++ ) { #if ( _IPP32E >= _IPP32E_M7 ) mfxowniConvert_8u16u_M7( src, dst, width, nonTemporal ); #elif ( _IPP >= _IPP_W7 ) mfxowniConvert_8u16u_W7( src, dst, width, nonTemporal ); #elif defined (_A6) mfxowniConvert_8u16u_A6( src, dst, width ); #else for( n = 0; n < width; n++ ) { dst[n] = (Ipp16u)src[n]; } #endif src += srcStep; dst = (Ipp16u*)((Ipp8u*)dst + dstStep); } #endif #if (_IPPLRB>=_IPPLRB_B1) mfxowniConvert_8u16u( pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height, 1 ); #endif return ippStsNoErr; #else /* ((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) */ return mfxiConvert_8u16s_C1R(pSrc, srcStep, (Ipp16s *)pDst, dstStep, roiSize); #endif } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/piconvertca.c000066400000000000000000000206161443134507600247740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // XXX cleanup /*M* // Purpose: Convert: 8u<=>16u, 8u<=>16s, // 8u<=>32f, 16u<=>32f, // 8s<=>32f, 16s<=>32f // 8s<=>32s, 8u<=>32s // // Contents: // (M7) mfxiConvert_16u8u_C1R (A6,W7,T7) NT // mfxiConvert_16u8u_AC4R // (M7) mfxiConvert_16u8u_C4R (A6,W7,T7) NT // *M*/ #include "precomp.h" #include "owni.h" //#if defined (_PX) || defined (_M6) || defined (_A6) || ( _IPP >= _IPP_W7 ) || (_IPP32E >= _IPP32E_M7) || defined (_I7) // dlaptev:: enabled for all platforms #include "cpudef.h" #include "ippcore.h" //#endif #if !( (_IPP>=_IPP_M6) || (_IPP32E>=_IPP32E_M7) || (_IPP64>=_IPP64_I7) ) #define _CCODE #endif #if ( _IPPLP32 == _IPPLP32_S8 ) || ( _IPPLP64 == _IPPLP64_N8 ) || ( _IPP <= _IPP_W7 ) #define BOUND_NT 524288 #else #define BOUND_NT 1048576 #endif #if (_IPP32E >= _IPP32E_M7) #if (_IPP32E < _IPP32E_L9) extern void mfxowniConvert_16u8u_M7( const Ipp16u *pSrc, Ipp8u *pDst, int len ); #endif #endif #if ( _IPP >= _IPP_T7 ) && ( _IPP < _IPP_H9 ) extern void mfxowniConvert_16u8u_T7( const Ipp16u *pSrc, Ipp8u *pDst, int len , int nt); #endif #if ( _IPP >= _IPP_W7 ) #if defined (_W7) extern void mfxowniConvert_16u8u_W7( const Ipp16u *pSrc, Ipp8u *pDst, int len ); #endif #endif #if defined (_A6) extern void mfxowniConvert_16u8u_A6( const Ipp16u *pSrc, Ipp8u *pDst, int len ); #endif #if (_IPPLRB>=_IPPLRB_B1) IppStatus mfxowniConvert_16u8u_B1( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize,int nCh); IppStatus mfxowniConvert_16u8u_A_B1( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize); #endif #if ((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) extern void mfxowniConvert_16u8u( const Ipp16u *pSrc, Ipp8u *pDst, int len ); #endif /*******************************************************************/ IPPFUN ( IppStatus, mfxiConvert_16u8u_C1R, ( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize )) { IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) IPP_BAD_STEP_RET( srcStep ) IPP_BAD_STEP_RET( dstStep ) #if !(_IPPLRB>=_IPPLRB_B1) { const Ipp16u *src = pSrc; Ipp8u *dst = pDst; int width = roiSize.width, height = roiSize.height; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int n; #endif #if ( _IPP >= _IPP_T7 ) && ( _IPP < _IPP_H9 ) IppStatus ownStatus = ippStsNoErr; int nonTemporal = 0, size = 0, cache = 0; #endif #if ( _IPP >= _IPP_T7 ) && ( _IPP < _IPP_H9 ) size = width*height*3; if( size > BOUND_NT ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( size >= cache ) nonTemporal = 1; } } #endif if( (srcStep == dstStep*2) && (dstStep == width) ) { width *= height; height = 1; } for( h = 0; h < height; h++ ) { #if ((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) mfxowniConvert_16u8u( src, dst, width ); #elif (_IPP32E >= _IPP32E_M7) mfxowniConvert_16u8u_M7( src, dst, width ); #elif ( _IPP >= _IPP_T7 ) mfxowniConvert_16u8u_T7( src, dst, width, nonTemporal ); #elif ( _IPP == _IPP_W7 ) mfxowniConvert_16u8u_W7( src, dst, width ); #elif defined (_A6) mfxowniConvert_16u8u_A6( src, dst, width ); #else for( n = 0; n < width; n++ ) { if( src[n] >= IPP_MAX_8U ) { dst[n] = IPP_MAX_8U; } else { dst[n] = (Ipp8u)src[n]; } } #endif src = (Ipp16u*)((Ipp8u*)src + srcStep); dst += dstStep; } return ippStsNoErr; } #else return mfxowniConvert_16u8u_B1( pSrc,srcStep,pDst,dstStep,roiSize,1); #endif } /*******************************************************************/ IPPFUN ( IppStatus, mfxiConvert_16u8u_AC4R, ( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize )) { IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) IPP_BAD_STEP_RET( srcStep ) IPP_BAD_STEP_RET( dstStep ) #if !(_IPPLRB>=_IPPLRB_B1) { const Ipp16u *src = pSrc; Ipp8u *dst = pDst; int width = roiSize.width*4, height = roiSize.height; int h; int n; if( (srcStep == dstStep*2) && (dstStep == width) ) { width *= height; height = 1; } for( h = 0; h < height; h++ ) { for( n = 0; n < width; n += 4 ) { if( src[n] >= IPP_MAX_8U ) { dst[n] = IPP_MAX_8U; } else { dst[n] = (Ipp8u)src[n]; } if( src[n + 1] >= IPP_MAX_8U ) { dst[n + 1] = IPP_MAX_8U; } else { dst[n + 1] = (Ipp8u)src[n + 1]; } if( src[n + 2] >= IPP_MAX_8U ) { dst[n + 2] = IPP_MAX_8U; } else { dst[n + 2] = (Ipp8u)src[n + 2]; } } src = (Ipp16u*)((Ipp8u*)src + srcStep); dst += dstStep; } return ippStsNoErr; } #else return mfxowniConvert_16u8u_A_B1( pSrc,srcStep,pDst,dstStep,roiSize); #endif } /*******************************************************************/ IPPFUN ( IppStatus, mfxiConvert_16u8u_C4R, ( const Ipp16u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize )) { #if !((_IPP>=_IPP_H9) || (_IPP32E>=_IPP32E_L9)) IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) IPP_BAD_STEP_RET( srcStep ) IPP_BAD_STEP_RET( dstStep ) #if !(_IPPLRB>=_IPPLRB_B1) { const Ipp16u *src = pSrc; Ipp8u *dst = pDst; int width = roiSize.width*4, height = roiSize.height; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int n; #endif #if ( _IPP >= _IPP_T7 ) IppStatus ownStatus = ippStsNoErr; int nonTemporal = 0, size = 0, cache = 0; #endif #if ( _IPP >= _IPP_T7 ) size = width*height*3; if( size > BOUND_NT ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( size >= cache ) nonTemporal = 1; } } #endif if( (srcStep == dstStep*2) && (dstStep == width) ) { width *= height; height = 1; } for( h = 0; h < height; h++ ) { #if (_IPP32E >= _IPP32E_M7) mfxowniConvert_16u8u_M7( src, dst, width ); #elif ( _IPP >= _IPP_T7 ) mfxowniConvert_16u8u_T7( src, dst, width, nonTemporal ); #elif ( _IPP == _IPP_W7 ) mfxowniConvert_16u8u_W7( src, dst, width ); #elif defined (_A6) mfxowniConvert_16u8u_A6( src, dst, width ); #else for( n = 0; n < width; n++ ) { if( src[n] >= IPP_MAX_8U ) { dst[n] = IPP_MAX_8U; } else { dst[n] = (Ipp8u)src[n]; } } #endif src = (Ipp16u*)((Ipp8u*)src + srcStep); dst += dstStep; } return ippStsNoErr; } #else return mfxowniConvert_16u8u_B1( pSrc,srcStep,pDst,dstStep,roiSize,4); #endif #else IPP_BAD_SIZE_RET( roiSize.width ) roiSize.width *= 4; return mfxiConvert_16u8u_C1R(pSrc, srcStep, pDst, dstStep, roiSize); #endif } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/picopyca.c000066400000000000000000001506541443134507600242740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Purpose: Copying image into second image. // Filling image by value. // // Contents: // (V8,U8) mfxiCopy_8u_C3C1R mfxiCopy_8u_C1C3R (V8,U8) // (M7) mfxiCopy_8u_C4C1R (W7) mfxiCopy_8u_C1C4R (W7)) (M7) // mfxiCopy_8u_C3CR mfxiCopy_8u_C4CR // (V8,U8) mfxiCopy_8u_AC4C3R mfxiCopy_8u_C3AC4R (V8,U8) // (V8,U8,M7) mfxiCopy_8u_C1R (M6,A6,W7,I7) mfxiCopy_8u_C1MR (W7) (M7) // (V8,U8,M7) mfxiCopy_8u_C3R (M6,A6,W7,I7) mfxiCopy_8u_C3MR (A6,W7) (M7) // (V8,U8,M7) mfxiCopy_8u_C4R (M6,A6,W7,I7) mfxiCopy_8u_C4MR // (M7) mfxiCopy_8u_AC4R (W7) mfxiCopy_8u_AC4MR // (M7) mfxiSet_8u_C1R (M6,A6,W7) mfxiSet_8u_C1MR (W7) (M7) // mfxiSet_8u_C3CR mfxiSet_8u_C4CR // (M7) mfxiSet_8u_C3R (M6,A6,W7) mfxiSet_8u_C3MR (A6,W7) (M7) // (M7) mfxiSet_8u_C4R (M6,A6,W7) mfxiSet_8u_C4MR // mfxiSet_8u_AC4R mfxiSet_8u_AC4MR // // mfxiCopy_16s_C3C1R mfxiCopy_16s_C1C3R // mfxiCopy_16s_C4C1R mfxiCopy_16s_C1C4R // mfxiCopy_16s_C3CR mfxiCopy_16s_C4CR // (V8,U8) mfxiCopy_16s_AC4C3R mfxiCopy_16s_C3AC4R (V8,U8) // (V8,U8,M7) mfxiCopy_16s_C1R (M6,A6,W7,I7) mfxiCopy_16s_C1MR (W7) (M7) // (V8,U8,M7) mfxiCopy_16s_C3R (M6,A6,W7,I7) mfxiCopy_16s_C3MR (A6,W7) (M7) // (V8,U8,M7) mfxiCopy_16s_C4R (M6,A6,W7,I7) mfxiCopy_16s_C4MR // (M7) mfxiCopy_16s_AC4R (W7) mfxiCopy_16s_AC4MR // (M7) mfxiSet_16s_C1R (M6,A6,W7) mfxiSet_16s_C1MR (W7) (M7) // mfxiSet_16s_C3CR mfxiSet_16s_C4CR // (M7) mfxiSet_16s_C3R (M6,A6,W7) mfxiSet_16s_C3MR (A6,W7) (M7) // (M7) mfxiSet_16s_C4R (M6,A6,W7) mfxiSet_16s_C4MR // mfxiSet_16s_AC4R mfxiSet_16s_AC4MR // // mfxiCopy_32f_C3C1R mfxiCopy_32f_C1C3R // mfxiCopy_32f_C4C1R mfxiCopy_32f_C1C4R // mfxiCopy_32f_C3CR mfxiCopy_32f_C4CR // mfxiCopy_32f_AC4C3R mfxiCopy_32f_C3AC4R // (V8,U8,M7) mfxiCopy_32f_C1R (M6,A6,W7,I7) mfxiCopy_32f_C1MR (W7) (M7) // (V8,U8,M7) mfxiCopy_32f_C3R (M6,A6,W7,I7) mfxiCopy_32f_C3MR (A6,W7) (M7) // (V8,U8,M7) mfxiCopy_32f_C4R (M6,A6,W7,I7) mfxiCopy_32f_C4MR // mfxiCopy_32f_AC4R mfxiCopy_32f_AC4MR // (M7) mfxiSet_32f_C1R (M6,A6,W7) mfxiSet_32f_C1MR (W7) (M7) // mfxiSet_32f_C3CR mfxiSet_32f_C4CR // (M7) mfxiSet_32f_C3R (M6,A6,W7) mfxiSet_32f_C3MR (A6,W7) (M7) // (M7) mfxiSet_32f_C4R (M6,A6,W7) mfxiSet_32f_C4MR // mfxiSet_32f_AC4R mfxiSet_32f_AC4MR // // (M7) mfxiCopy_8u_C3P3R (A6,W7) mfxiCopy_8u_P3C3R (W7) (M7)(V8,U8) // (M7) mfxiCopy_8u_C4P4R (A6,W7) mfxiCopy_8u_P4C4R (W7) (M7) // (M7) mfxiCopy_16s_C3P3R (A6,W7) mfxiCopy_16s_P3C3R (A6,W7)(M7) // (M7) mfxiCopy_16s_C4P4R (A6,W7) mfxiCopy_16s_P4C4R (W7) (M7) // (M7) mfxiCopy_32f_C3P3R (W7) mfxiCopy_32f_P3C3R (W7) (M7) // (M7) mfxiCopy_32f_C4P4R (W7) mfxiCopy_32f_P4C4R (W7) (M7) // */ #include "precomp.h" #include "owni.h" #include "ippcore.h" #if (_IPPLRB >= _IPPLRB_B1) #if defined(_REF_LIB) extern void lmmintrin_init(); #endif extern void mfxowniCopy8u_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniSet_8u_C1R_B1( const Ipp8u* value, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniSet_8u_C3R_B1( const Ipp8u* value, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniSet_8u_C4R_B1( const Ipp8u* value, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniSet_16s_C1R_B1( const Ipp16s* value, Ipp16s* pDst, int dstStep, int width, int height ); extern void mfxowniSet_16s_C3R_B1( const Ipp16s* value, Ipp16s* pDst, int dstStep, int width, int height ); extern void mfxowniSet_16s_C4R_B1( const Ipp16s* value, Ipp16s* pDst, int dstStep, int width, int height ); extern void mfxowniSet_32s_C1R_B1( const Ipp32s* value, Ipp32s* pDst, int dstStep, int width, int height ); extern void mfxowniSet_32s_C3R_B1( const Ipp32s* value, Ipp32s* pDst, int dstStep, int width, int height ); extern void mfxowniSet_32s_C4R_B1( const Ipp32s* value, Ipp32s* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_8u_P3C3R_B1( const Ipp8u* const pSrc[3], int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C3P3R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_P4C4R_B1( const Ipp8u* const pSrc[4], int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C4P4R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_P3C3R_B1( const Ipp32s* const pSrc[3], int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_P3C3R_B1( const Ipp16s* const pSrc[3], int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_P4C4R_B1( const Ipp32s* const pSrc[4], int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_P4C4R_B1( const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C3P3R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* const pDst[3], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C3P3R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[3], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C4P4R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* const pDst[4], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C4P4R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[4], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C4C1R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C3C1R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C1C4R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C1C3R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C4C1R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C3C1R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C1C4R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C1C3R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C4C1R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C3C1R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C1C4R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C1C3R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_AC4C3R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C3AC4R_B1( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_AC4C3R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C3AC4R_B1( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_AC4C3R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_32s_C3AC4R_B1( const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, IppiSize roiSize ); #endif #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 ) #include "cpudef.h" #include "ippcore.h" #endif #if !( (_IPP>=_IPP_M6) || (_IPP32E>=_IPP32E_M7) || (_IPP64>=_IPP64_I7) ) #define _CCODE #endif #if ( _IPPLP32 >= _IPPLP32_S8 ) || ( _IPPLP64 >= _IPPLP64_N8 ) || ( _IPP <= _IPP_W7 ) #define BOUND_NT 524288 #define BOUND_NT_ 8388608 /* Atom: Temporarily for Copy_16s C3P3R,P3C3R,C4P4R. 7.05.08 */ #else #define BOUND_NT 1048576 #endif #if ( _IPP == _IPP_A6 ) || ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) || ( _IPP32E == _IPP32E_M7 ) #define CACHE_SIZE 2097152 #endif #if ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) extern void mfxowniCopy_8u_C3AC4R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_16s_C3AC4R( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_8u_AC4C3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_16s_AC4C3R( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_8u_C1C3R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_8u_C3C1R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniCopy_8u_P3C3R(const Ipp8u* const pSrc[3], int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_P4C4R(const Ipp8u* const pSrc[4], int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_P3C3R(const Ipp16s* const pSrc[3], int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_P4C4R(const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize ); #endif #if defined (_I7) void mfxowniCopy_8u_I7( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int len ); void mfxowniCopy_8u_I7_NT( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int len ); #endif #if defined (_A6) || (( _IPP >= _IPP_W7 ) && ( _IPP < _IPP_P8 )) extern void mfxowniCopy8u_C3P3_88_A6 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_84_A6 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_48_A6 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_A6( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C4P4_48_A6 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, int width, int height ); extern void mfxowniCopy8u_C4P4_44_A6 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, int width, int height ); extern void mfxowniCopy8u_C4P4_A6( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy16s_C3P3_A6( const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy16s_C3P3_A6_NT( const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy16s_C4P4_A6( const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy16s_C4P4_A6_NT( const Ipp16s* pSrc, Ipp16s* pDst, int len ); #endif #if defined (_A6) || ( _IPP >= _IPP_W7 ) extern void mfxowniCopy16s_P3C3_A6 (const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, int width, int height, int nonTemporal ); #endif #if ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) extern void mfxowniCopy_8u_C1_W7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, int nonTemporal ); #endif #if ( _IPP >= _IPP_W7 ) extern void mfxowniCopy8u_P3C3_W7 ( const Ipp8u* const pSrc[3], int srcStep, Ipp8u* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy8u_P4C4_W7 (const Ipp8u* const pSrc[4], int srcStep, Ipp8u* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy16s_P4C4_W7 (const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy32s_C3P3_W7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C3P3_W7_NT( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C4P4_W7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C4P4_W7_NT( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_P4C4_W7 (const Ipp32s* const pSrc[4], int srcStep, Ipp32s* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy16s_AC4_W7(const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy8u_AC4_W7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C4C1_W7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C1C4_W7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); #if (_IPP < _IPP_H9 ) extern void mfxowniSet_8u_C1_W7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_8u_C3_W7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_8u_C4_W7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C1_W7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C3_W7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C4_W7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_32f_C3_W7( Ipp32f* buf, Ipp32f* pDst, int len, int nonTemporal ); extern void mfxowniCopy32s_P3C3_W7 (const Ipp32s* const pSrc[4], int srcStep, Ipp32s* pDst, int dstStep, int width, int height, int nonTemporal ); #endif extern void mfxowniSet_32f_C4_W7( Ipp32f* buf, Ipp32f* pDst, int len, int nonTemporal ); extern void mfxowniCopy_8u_C3M_W7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_8u_C1M_W7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_8u_C1M_W7 ( Ipp8u* buf, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_8u_C3M_W7 ( Ipp8u* buf, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_16s_C1M_W7 ( const Ipp16s* pSrc, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_16s_C3M_W7 ( const Ipp16s* pSrc, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_16s_C1M_W7 ( Ipp16s* buf, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_16s_C3M_W7 ( Ipp16s* buf, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_32f_C1M_W7 ( const Ipp32f* pSrc, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_32f_C3M_W7 ( const Ipp32f* pSrc, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_32f_C1M_W7 ( Ipp32f* value, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_32f_C3M_W7 ( Ipp32f* buf, Ipp32f* pDst, int len, const Ipp8u* mask ); #endif #if defined (_A6) extern void mfxowniCopy_8u_A6( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy_8u_C3M_A6 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_16s_C3M_A6 ( const Ipp16s* pSrc, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_32f_C3M_A6 ( const Ipp32f* pSrc, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_8u_A6( Ipp8u val, Ipp8u* pDst, int len ); extern void mfxowniSet_8u_C3_A6( const Ipp8u value[3], Ipp8u* pDst, int len ); extern void mfxowniSet_8u_C3M_A6( const Ipp8u value[3], Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_16s_A6( Ipp16s val, Ipp16s* dst, int len ); extern void mfxowniSet_16s_C3_A6( const Ipp16s value[3], Ipp16s* dst, int len ); extern void mfxowniSet_16s_C3M_A6( const Ipp16s value[3], Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_32f_A6( Ipp32f val, Ipp32f* dst, int len ); extern void mfxowniSet_32f_C3_A6( const Ipp32f value[3], Ipp32f* dst, int len ); extern void mfxowniSet_32f_C3M_A6( const Ipp32f value[3], Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_64s_A6( Ipp64s val, Ipp64s* dst, int len ); extern void mfxowniSet_64sc_A6( Ipp64sc val, Ipp64sc* dst, int len ); #endif #if defined (_M6) extern void mfxowniCopy_8u_M6( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniSet_8u_M6( Ipp8u val, Ipp8u* pDst, int len ); extern void mfxowniSet_8u_C3_M6( const Ipp8u value[3], Ipp8u* pDst, int len ); extern void mfxowniSet_16s_M6( Ipp16s val, Ipp16s* dst, int len ); extern void mfxowniSet_16s_C3_M6( const Ipp16s value[3], Ipp16s* dst, int len ); extern void mfxowniSet_32f_M6( Ipp32f val, Ipp32f* dst, int len ); extern void mfxowniSet_32f_C3_M6( const Ipp32f value[3], Ipp32f* dst, int len ); extern void mfxowniSet_64s_M6( Ipp64s val, Ipp64s* dst, int len ); extern void mfxowniSet_64sc_M6( Ipp64sc val, Ipp64sc* dst, int len ); #endif #if (_IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) extern void mfxowniCopy8uas( const Ipp8u* pSrc, int srcStep,Ipp8u* pDst, int dstStep, int width, int height ); extern void mfxowniCopy16sC1Mas( const Ipp16s* pSrc, int srcStep,Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniCopy16sC3Mas( const Ipp16s* pSrc, int srcStep,Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniCopy16sC4Mas( const Ipp16s* pSrc, int srcStep,Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet16sC1Mas( Ipp16s value, Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet16sC3Mas( const Ipp16s value[3], Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet16sC4Mas( const Ipp16s value[4], Ipp16s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniCopy32sC1Mas( const Ipp32s* pSrc, int srcStep,Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniCopy32sC3Mas( const Ipp32s* pSrc, int srcStep,Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniCopy32sC4Mas( const Ipp32s* pSrc, int srcStep,Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet32sC1Mas( Ipp32s value, Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet32sC3Mas( const Ipp32s value[3], Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); extern void mfxowniSet32sC4Mas( const Ipp32s value[4], Ipp32s* pDst, int dstStep, int width, int height, const Ipp8u* mask, int maskStep ); #endif #if ( _IPP32E == _IPP32E_M7 ) extern void mfxowniCopy_8u_C1_M7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniCopy_16s_C1M_M7 ( const Ipp16s* pSrc, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_16s_C3M_M7 ( const Ipp16s* pSrc, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_32f_C1M_M7 ( const Ipp32f* pSrc, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_32f_C3M_M7 ( const Ipp32f* pSrc, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_16s_C1M_M7 ( Ipp16s* buf, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_16s_C3M_M7 ( Ipp16s* buf, Ipp16s* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_32f_C1M_M7 ( Ipp32f* value, Ipp32f* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_32f_C3M_M7 ( Ipp32f* buf, Ipp32f* pDst, int len, const Ipp8u* mask ); #endif #if ( _IPP32E >= _IPP32E_M7 ) extern void mfxowniCopy8u_AC4_M7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy16s_AC4_M7(const Ipp16s* pSrc, Ipp16s* pDst, int len ); #if (_IPP32E < _IPP32E_L9) extern void mfxowniSet_8u_C1_M7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_8u_C3_M7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_8u_C4_M7( Ipp8u* buf, Ipp8u* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C1_M7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C3_M7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_16s_C4_M7( Ipp16s* buf, Ipp16s* pDst, int len, int nonTemporal ); extern void mfxowniSet_32f_C3_M7( Ipp32f* buf, Ipp32f* pDst, int len, int nonTemporal ); extern void mfxowniCopy32s_P3C3_M7 (const Ipp32s* const pSrc[4], int srcStep, Ipp32s* pDst, int dstStep, int width, int height, int nonTemporal ); #endif extern void mfxowniSet_32f_C4_M7( Ipp32f* buf, Ipp32f* pDst, int len, int nonTemporal ); extern void mfxowniCopy_8u_C1M_M7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy_8u_C3M_M7 ( const Ipp8u* pSrc, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_8u_C1M_M7 ( Ipp8u* buf, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniSet_8u_C3M_M7 ( Ipp8u* buf, Ipp8u* pDst, int len, const Ipp8u* mask ); extern void mfxowniCopy8u_C4C1_M7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C1C4_M7(const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy32s_C3P3_M7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C3P3_NT_M7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C4P4_M7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy32s_C4P4_NT_M7( const Ipp32s* pSrc, Ipp32s* pDst, int len ); extern void mfxowniCopy8u_P3C3_M7 ( const Ipp8u* const pSrc[3], int srcStep, Ipp8u* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy8u_P4C4_M7 (const Ipp8u* const pSrc[4], int srcStep, Ipp8u* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy16s_P3C3_M7 (const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy16s_P4C4_M7 (const Ipp16s* const pSrc[4], int srcStep, Ipp16s* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy32s_P4C4_M7 (const Ipp32s* const pSrc[4], int srcStep, Ipp32s* pDst, int dstStep, int width, int height, int nonTemporal ); extern void mfxowniCopy16s_C3P3_NT_M7( const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy16s_C4P4_NT_M7( const Ipp16s* pSrc, Ipp16s* pDst, int len ); #endif #if (( _IPP32E >= _IPP32E_M7 ) && ( _IPP32E < _IPP32E_Y8 )) extern void mfxowniCopy8u_C3P3_88_M7 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_84_M7 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_48_M7 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, int width, int height ); extern void mfxowniCopy8u_C3P3_M7( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C4P4_M7( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern void mfxowniCopy8u_C4P4_48_M7 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, int width, int height ); extern void mfxowniCopy8u_C4P4_44_M7 ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, int width, int height ); extern void mfxowniCopy16s_C3P3_M7( const Ipp16s* pSrc, Ipp16s* pDst, int len ); extern void mfxowniCopy16s_C4P4_M7( const Ipp16s* pSrc, Ipp16s* pDst, int len ); #endif #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) extern void mfxowniCopy_8u_C3P3R_cn( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_8u_C4P4R_cn( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C3P3R_cn( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[3], int dstStep, IppiSize roiSize ); extern void mfxowniCopy_16s_C4P4R_cn( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[4], int dstStep, IppiSize roiSize ); #endif #if ( _IPP32E >= _IPP32E_E9 ) void mfxowniCopy8u_E9( const Ipp8u* pSrc, int srcStep, Ipp8u *pDst, int dstStep, int width, int height ); void mfxowniCopy8u_cn( const Ipp8u* pSrc, int srcStep, Ipp8u *pDst, int dstStep, int width, int height ); #endif #if (_IPP >= _IPP_H9 ) || (_IPP32E >= _IPP32E_L9) void mfxowniSet_8u_C1R(Ipp8u value, Ipp8u* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_8u_C3R(Ipp8u *value, Ipp8u* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_8u_C4R(Ipp8u *value, Ipp8u* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_16s_C1R(Ipp16s value, Ipp16s* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_16s_C3R(Ipp16s *value, Ipp16s* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_16s_C4R(Ipp16s *value, Ipp16s* pDst, int dstStep, IppiSize roiSize); void mfxowniSet_32s_C3R(Ipp32s *value, Ipp32s* pDst, int dstStep, IppiSize roiSize); void mfxowniCopy_32s_AC4C3R(const Ipp32s* pSrc, int srcStep, Ipp32s* pDst, int dstStep, int width, int height); #endif /*******************************************************************/ #if (_IPP_ARCH != _IPP_ARCH_XSC) IPPFUN ( IppStatus, mfxiCopy_8u_C1R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize )) { #if !( _IPP >= _IPP_V8 ) && !( _IPP32E >= _IPP32E_U8 ) && !(_IPPLRB >= _IPPLRB_B1) const Ipp8u *src = pSrc; Ipp8u *dst = pDst; int width = roiSize.width, height = roiSize.height; int h; #if defined (_CCODE) int n; #endif #if ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) || defined (_I7) || ( _IPP32E == _IPP32E_M7 ) int nonTemporal = 0; #endif #endif IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy8u_B1( pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height ); #elif ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) #if ( _IPP32E >= _IPP32E_E9 ) if( roiSize.width < 1024 ) { mfxowniCopy8u_E9( pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height ); } else { mfxowniCopy8u_cn( pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height ); } #else mfxowniCopy8uas( pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height ); #endif #else #if ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) || ( _IPP32E == _IPP32E_M7 ) if( width*height > CACHE_SIZE/2 ) nonTemporal = 1; #endif #if defined (_I7) if( width > 16278 ) nonTemporal = 1; #endif #if !defined(_CCODE) if( (srcStep == dstStep) && (srcStep == width) ) { width *= height; height = 1; } #endif for( h = 0; h < height; h++ ) { #if ( _IPP32E == _IPP32E_M7 ) mfxowniCopy_8u_C1_M7( src, dst, width, nonTemporal ); #elif ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) mfxowniCopy_8u_C1_W7( src, dst, width, nonTemporal ); #elif defined (_A6) mfxowniCopy_8u_A6( src, dst, width ); #elif defined (_M6) mfxowniCopy_8u_M6( src, dst, width ); #elif defined (_I7) if(!nonTemporal) { mfxowniCopy_8u_I7( src, srcStep, dst, width ); } else { mfxowniCopy_8u_I7_NT( src, srcStep, dst, width ); } #else for( n = 0; n < width; n++ ) { dst[n] = src[n]; } #endif src += srcStep, dst += dstStep; } #endif /*#if ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) || (_IPPLRB >= _IPPLRB_B1)*/ return ippStsNoErr; } #endif /* _IPP_ARCH != _IPP_ARCH_XSC */ /*******************************************************************/ IPPFUN ( IppStatus, mfxiCopy_16s_C1R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* pDst, int dstStep, IppiSize roiSize )) { #if !( _IPP >= _IPP_V8 ) && !( _IPP32E >= _IPP32E_U8 ) && !(_IPPLRB >= _IPPLRB_B1) const Ipp16s *src = pSrc; Ipp16s *dst = pDst; int height = roiSize.height; int h; #if defined (_CCODE) int n, width = roiSize.width; #else int width = roiSize.width*2; #endif #if ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) || defined (_I7) || ( _IPP32E == _IPP32E_M7 ) int nonTemporal = 0; #endif #endif IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy8u_B1( (Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, roiSize.width*2, roiSize.height ); #elif ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) #if ( _IPP32E >= _IPP32E_E9 ) if( roiSize.width*2 < 1024 ) { mfxowniCopy8u_E9( (Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, roiSize.width*2, roiSize.height ); } else { mfxowniCopy8u_cn( (Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, roiSize.width*2, roiSize.height ); } #else mfxowniCopy8uas( (Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, roiSize.width*2, roiSize.height ); #endif #else #if ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) || ( _IPP32E == _IPP32E_M7 ) if( width*height > CACHE_SIZE/2 ) nonTemporal = 1; #endif #if defined (_I7) if( width > 16278 ) nonTemporal = 1; #endif #if !defined(_CCODE) if( (srcStep == dstStep) && (srcStep == width) ) { width *= height; height = 1; } #endif for( h = 0; h < height; h++ ) { #if ( _IPP32E == _IPP32E_M7 ) mfxowniCopy_8u_C1_M7( (Ipp8u*)src, (Ipp8u*)dst, width, nonTemporal ); #elif ( _IPP == _IPP_W7 ) || ( _IPP == _IPP_T7 ) mfxowniCopy_8u_C1_W7( (Ipp8u*)src, (Ipp8u*)dst, width, nonTemporal ); #elif defined (_A6) mfxowniCopy_8u_A6( (Ipp8u*)src, (Ipp8u*)dst, width ); #elif defined (_M6) mfxowniCopy_8u_M6( (Ipp8u*)src, (Ipp8u*)dst, width ); #elif defined (_I7) if(!nonTemporal) { mfxowniCopy_8u_I7( (Ipp8u*)src, srcStep, (Ipp8u*)dst, width ); } else { mfxowniCopy_8u_I7_NT( (Ipp8u*)src, srcStep, (Ipp8u*)dst, width ); } #else for( n = 0; n < width; n++ ) { dst[n] = src[n]; } #endif src = (Ipp16s*)((Ipp8u*)src + srcStep); dst = (Ipp16s*)((Ipp8u*)dst + dstStep); } #endif /*#if ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) || (_IPPLRB >= _IPPLRB_B1)*/ return ippStsNoErr; } /*******************************************************************/ IPPFUN ( IppStatus, mfxiCopy_8u_C3P3R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, IppiSize roiSize )) { #if !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) const Ipp8u *src = pSrc; Ipp8u *dst1, *dst2, *dst3; int height = roiSize.height; int width = roiSize.width; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int wPL, wPX; #else int align; #endif #endif /* !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) */ IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2] ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy_8u_C3P3R_B1( pSrc, srcStep, pDst, dstStep, roiSize ); #else mfxowniCopy_8u_C3P3R_cn( pSrc, srcStep, pDst, dstStep, roiSize ); #endif #else dst1 = pDst[0], dst2 = pDst[1], dst3 = pDst[2]; #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) align = (int)(((IPP_INT_PTR(src) & 0x7) << 4) | ((IPP_INT_PTR(dst1) | IPP_INT_PTR(dst2) | IPP_INT_PTR(dst3)) & 0x7)); if( (dstStep*3 == srcStep) && (dstStep == width) && ((srcStep*height < 160000) | !(align & 0x33)) ) { width *= height; height = 1; } #else if( (dstStep*3 == srcStep) && (dstStep == width) && (srcStep*height < 160000) ) { width *= height; height = 1; } #endif #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) switch ( align ) { case 0x00: mfxowniCopy8u_C3P3_88_M7( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x04: mfxowniCopy8u_C3P3_84_M7( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x40: mfxowniCopy8u_C3P3_48_M7( pSrc, srcStep, pDst, dstStep, width, height ); break; default: #endif #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) switch ( align ) { case 0x00: mfxowniCopy8u_C3P3_88_A6( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x04: mfxowniCopy8u_C3P3_84_A6( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x40: mfxowniCopy8u_C3P3_48_A6( pSrc, srcStep, pDst, dstStep, width, height ); break; default: #endif for( h = 0; h < height; h++ ) { #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) mfxowniCopy8u_C3P3_M7( src, dst1, width ); mfxowniCopy8u_C3P3_M7( src+1, dst2, width ); mfxowniCopy8u_C3P3_M7( src+2, dst3, width ); #elif defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) mfxowniCopy8u_C3P3_A6( src, dst1, width ); mfxowniCopy8u_C3P3_A6( src+1, dst2, width ); mfxowniCopy8u_C3P3_A6( src+2, dst3, width ); #else for( wPL=0,wPX=0; wPL < width; wPL++, wPX+=3 ) { dst1[wPL] = src[wPX]; } for( wPL=0,wPX=1; wPL < width; wPL++, wPX+=3 ) { dst2[wPL] = src[wPX]; } for( wPL=0,wPX=2; wPL < width; wPL++, wPX+=3 ) { dst3[wPL] = src[wPX]; } #endif src += srcStep, dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; } #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) } #endif #endif /* ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) */ return ippStsNoErr; } /*******************************************************************/ IPPFUN ( IppStatus, mfxiCopy_8u_C4P4R, ( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, IppiSize roiSize )) { #if !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) const Ipp8u *src = pSrc; Ipp8u *dst1, *dst2, *dst3, *dst4; int height = roiSize.height; int width = roiSize.width; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int wPL, wPX; #else int align; #endif #endif /* !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) */ IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_PTR4_RET( pDst[0], pDst[1], pDst[2], pDst[3]) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy_8u_C4P4R_B1( pSrc, srcStep, pDst, dstStep, roiSize ); #else mfxowniCopy_8u_C4P4R_cn( pSrc, srcStep, pDst, dstStep, roiSize ); #endif #else dst1 = pDst[0], dst2 = pDst[1], dst3 = pDst[2], dst4 = pDst[3]; #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) align = (int)(((IPP_INT_PTR(src) & 0x7) << 4) | ((IPP_INT_PTR(dst1) | IPP_INT_PTR(dst2) | IPP_INT_PTR(dst3) | IPP_INT_PTR(dst4)) & 0x7)); if( (dstStep*4 == srcStep) && (dstStep == width) && ((srcStep*height < 160000) | !(align & 0x33)) ) { width *= height; height = 1; } #else if( (dstStep*4 == srcStep) && (dstStep == width) && (srcStep*height < 160000) ) { width *= height; height = 1; } #endif #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) switch ( align ) { case 0x00: case 0x40: mfxowniCopy8u_C4P4_48_M7( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x04: case 0x44: mfxowniCopy8u_C4P4_44_M7( pSrc, srcStep, pDst, dstStep, width, height ); break; default: #endif #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) switch ( align ) { case 0x00: case 0x40: mfxowniCopy8u_C4P4_48_A6( pSrc, srcStep, pDst, dstStep, width, height ); break; case 0x04: case 0x44: mfxowniCopy8u_C4P4_44_A6( pSrc, srcStep, pDst, dstStep, width, height ); break; default: #endif for( h = 0; h < height; h++ ) { #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) mfxowniCopy8u_C4P4_M7( src, dst1, width ); mfxowniCopy8u_C4P4_M7( src+1, dst2, width ); mfxowniCopy8u_C4P4_M7( src+2, dst3, width ); mfxowniCopy8u_C4P4_M7( src+3, dst4, width ); #elif defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) mfxowniCopy8u_C4P4_A6( src, dst1, width ); mfxowniCopy8u_C4P4_A6( src+1, dst2, width ); mfxowniCopy8u_C4P4_A6( src+2, dst3, width ); mfxowniCopy8u_C4P4_A6( src+3, dst4, width ); #else for( wPL=0,wPX=0; wPL < width; wPL++, wPX+=4 ) { dst1[wPL] = src[wPX]; } for( wPL=0,wPX=1; wPL < width; wPL++, wPX+=4 ) { dst2[wPL] = src[wPX]; } for( wPL=0,wPX=2; wPL < width; wPL++, wPX+=4 ) { dst3[wPL] = src[wPX]; } for( wPL=0,wPX=3; wPL < width; wPL++, wPX+=4 ) { dst4[wPL] = src[wPX]; } #endif src += srcStep, dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; dst4 += dstStep; } #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) } #endif #endif /* _( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) */ return ippStsNoErr; } /*******************************************************************/ IPPFUN ( IppStatus, mfxiCopy_16s_C3P3R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[3], int dstStep, IppiSize roiSize )) { #if !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) const Ipp16s *src = pSrc; Ipp16s *dst1, *dst2, *dst3; int height = roiSize.height; int width = roiSize.width; int h; #if defined (_CCODE) || defined (_M6) || defined (_I7) int wPL, wPX; #endif #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) IppStatus ownStatus = ippStsNoErr; int nonTemporal = 0, size = 0, cache = 0; #endif #endif /* !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) */ IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_PTR3_RET( pDst[0], pDst[1], pDst[2] ) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy_16s_C3P3R_B1( pSrc, srcStep, pDst, dstStep, roiSize ); #else mfxowniCopy_16s_C3P3R_cn( pSrc, srcStep, pDst, dstStep, roiSize ); #endif #else #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) size = width*height*12; #if (_IPPLP32 >=_IPPLP32_S8)||(_IPPLP64 >=_IPPLP64_N8) if( size > BOUND_NT_ ) { #else if( size > BOUND_NT ) { #endif ownStatus = ippGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( size >= cache ) nonTemporal = 1; } } #endif dst1 = pDst[0], dst2 = pDst[1], dst3 = pDst[2]; #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) if( !nonTemporal ) { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C3P3_M7( src, dst1, width ); mfxowniCopy16s_C3P3_M7( src+1, dst2, width ); mfxowniCopy16s_C3P3_M7( src+2, dst3, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } else { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C3P3_NT_M7( src, dst1, width ); mfxowniCopy16s_C3P3_NT_M7( src+1, dst2, width ); mfxowniCopy16s_C3P3_NT_M7( src+2, dst3, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } #elif defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) if( !nonTemporal ) { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C3P3_A6( src, dst1, width ); mfxowniCopy16s_C3P3_A6( src+1, dst2, width ); mfxowniCopy16s_C3P3_A6( src+2, dst3, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } else { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C3P3_A6_NT( src, dst1, width ); mfxowniCopy16s_C3P3_A6_NT( src+1, dst2, width ); mfxowniCopy16s_C3P3_A6_NT( src+2, dst3, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } #else for( h = 0; h < height; h++ ) { for( wPL=0,wPX=0; wPL < width; wPL++, wPX+=3 ) { dst1[wPL] = src[wPX]; } for( wPL=0,wPX=1; wPL < width; wPL++, wPX+=3 ) { dst2[wPL] = src[wPX]; } for( wPL=0,wPX=2; wPL < width; wPL++, wPX+=3 ) { dst3[wPL] = src[wPX]; } src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } #endif #endif /* ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) */ return ippStsNoErr; } /*******************************************************************/ IPPFUN ( IppStatus, mfxiCopy_16s_C4P4R, ( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[4], int dstStep, IppiSize roiSize )) { #if !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) const Ipp16s *src = pSrc; Ipp16s *dst1, *dst2, *dst3, *dst4; int height = roiSize.height; int width = roiSize.width; int h; #if defined (_CCODE)|| defined (_M6) || defined (_I7) int wPL, wPX; #endif #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) IppStatus ownStatus = ippStsNoErr; int nonTemporal = 0, size = 0, cache = 0; #endif #endif /* !(_IPPLRB >= _IPPLRB_B1) && !( _IPP >= _IPP_P8 ) && !( _IPP32E >= _IPP32E_Y8 ) */ IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_PTR4_RET( pDst[0], pDst[1], pDst[2], pDst[3]) IPP_BAD_SIZE_RET( roiSize.width ) IPP_BAD_SIZE_RET( roiSize.height ) #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) #if (_IPPLRB >= _IPPLRB_B1) mfxowniCopy_16s_C4P4R_B1( pSrc, srcStep, pDst, dstStep, roiSize ); #else mfxowniCopy_16s_C4P4R_cn( pSrc, srcStep, pDst, dstStep, roiSize ); #endif #else #if defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) || ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) size = width*height*16; #if (_IPPLP32 >=_IPPLP32_S8)||(_IPPLP64 >=_IPPLP64_N8) if( size > BOUND_NT_ ) { #else if( size > BOUND_NT ) { #endif ownStatus = ippGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( size >= cache ) nonTemporal = 1; } } #endif dst1 = pDst[0], dst2 = pDst[1], dst3 = pDst[2], dst4 = pDst[3]; #if ((_IPP32E >= _IPP32E_M7)&&(_IPP32E < _IPP32E_Y8)) if( !nonTemporal ) { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C4P4_M7( src, dst1, width ); mfxowniCopy16s_C4P4_M7( src+1, dst2, width ); mfxowniCopy16s_C4P4_M7( src+2, dst3, width ); mfxowniCopy16s_C4P4_M7( src+3, dst4, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); dst4 = (Ipp16s*)((Ipp8u*)dst4 + dstStep); } } else { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C4P4_NT_M7( src, dst1, width ); mfxowniCopy16s_C4P4_NT_M7( src+1, dst2, width ); mfxowniCopy16s_C4P4_NT_M7( src+2, dst3, width ); mfxowniCopy16s_C4P4_NT_M7( src+3, dst4, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); dst4 = (Ipp16s*)((Ipp8u*)dst4 + dstStep); } } #elif defined (_A6) || ((_IPP >= _IPP_W7)&&(_IPP < _IPP_P8)) if( !nonTemporal ) { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C4P4_A6( src, dst1, width ); mfxowniCopy16s_C4P4_A6( src+1, dst2, width ); mfxowniCopy16s_C4P4_A6( src+2, dst3, width ); mfxowniCopy16s_C4P4_A6( src+3, dst4, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); dst4 = (Ipp16s*)((Ipp8u*)dst4 + dstStep); } } else { for( h = 0; h < height; h++ ) { mfxowniCopy16s_C4P4_A6_NT( src, dst1, width ); mfxowniCopy16s_C4P4_A6_NT( src+1, dst2, width ); mfxowniCopy16s_C4P4_A6_NT( src+2, dst3, width ); mfxowniCopy16s_C4P4_A6_NT( src+3, dst4, width ); src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); dst4 = (Ipp16s*)((Ipp8u*)dst4 + dstStep); } } #else for( h = 0; h < height; h++ ) { for( wPL=0,wPX=0; wPL < width; wPL++, wPX+=4 ) { dst1[wPL] = src[wPX]; } for( wPL=0,wPX=1; wPL < width; wPL++, wPX+=4 ) { dst2[wPL] = src[wPX]; } for( wPL=0,wPX=2; wPL < width; wPL++, wPX+=4 ) { dst3[wPL] = src[wPX]; } for( wPL=0,wPX=3; wPL < width; wPL++, wPX+=4 ) { dst4[wPL] = src[wPX]; } src = (Ipp16s*)((Ipp8u*)src + srcStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); dst4 = (Ipp16s*)((Ipp8u*)dst4 + dstStep); } #endif #endif /* ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) || (_IPPLRB >= _IPPLRB_B1) */ return ippStsNoErr; } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/picopycpp8y8cn.c000066400000000000000000000713711443134507600253630ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Contents: // mfxowniCopy_16s_C4P4R_cn // mfxowniCopy_16s_C3P3R_cn // mfxowniCopy_8u_C4P4R_cn // mfxowniCopy_8u_C3P3R_cn // */ #include // __m128i etc #include // _mm_shuffle_epi8 #include "precomp.h" #include "owni.h" #include "ippcore.h" #if ( _IPP >= _IPP_P8 ) || ( _IPP32E >= _IPP32E_Y8 ) #define BOUND_NT_8u_C3P3R 1048576 #define BOUND_NT_8u_C4P4R 786432 #define BOUND_NT_16s_C3P3R 524288 #define BOUND_NT_16s_C4P4R 393216 /************************************* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ static __ALIGN16 Ipp8u msk_00[16] = { 0, 3, 6, 9, 12, 15,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_01[16] = { 128,128,128,128,128,128, 2, 5, 8, 11, 14,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_02[16] = { 128,128,128,128,128,128,128,128,128,128,128, 1, 4, 7, 10, 13 }; static __ALIGN16 Ipp8u msk_10[16] = { 1, 4, 7, 10, 13,128,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_11[16] = { 128,128,128,128,128, 0, 3, 6, 9, 12, 15,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_12[16] = { 128,128,128,128,128,128,128,128,128,128,128, 2, 5, 8, 11, 14 }; static __ALIGN16 Ipp8u msk_20[16] = { 2, 5, 8, 11, 14,128,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_21[16] = { 128,128,128,128,128, 1, 4, 7, 10, 13,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u msk_22[16] = { 128,128,128,128,128,128,128,128,128,128, 0, 3, 6, 9, 12, 15 }; /************************************* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ static __ALIGN16 Ipp8u m16_00[16] = { 0, 1, 6, 7, 12, 13,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u m16_01[16] = { 128,128,128,128,128,128, 2, 3, 8, 9, 14, 15,128,128,128,128 }; static __ALIGN16 Ipp8u m16_02[16] = { 128,128,128,128,128,128,128,128,128,128,128,128, 4, 5, 10, 11 }; static __ALIGN16 Ipp8u m16_10[16] = { 2, 3, 8, 9, 14, 15,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u m16_11[16] = { 128,128,128,128,128,128, 4, 5, 10, 11,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u m16_12[16] = { 128,128,128,128,128,128,128,128,128,128, 0, 1, 6, 7, 12, 13 }; static __ALIGN16 Ipp8u m16_20[16] = { 4, 5, 10, 11,128,128,128,128,128,128,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u m16_21[16] = { 128,128,128,128, 0, 1, 6, 7, 12, 13,128,128,128,128,128,128 }; static __ALIGN16 Ipp8u m16_22[16] = { 128,128,128,128,128,128,128,128,128,128, 2, 3, 8, 9, 14, 15 }; /***********************************************************************/ void mfxowniCopy_16s_C4P4R_cn( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[4], int dstStep, IppiSize roiSize ) { __ALIGN16 __m128i v0, v1, v2, v3, v4, v5; Ipp16s *dst0 = pDst[0], *dst1 = pDst[1], *dst2 = pDst[2], *dst3 = pDst[3]; int h, s, d, cache, nonTemporal = 0; Ipp64s width, width_; IppStatus ownStatus = ippStsNoErr; if( roiSize.width < 8 ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < roiSize.width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } return; } if( (dstStep*4 == srcStep) && (dstStep == roiSize.width*2) ) { width = roiSize.width*roiSize.height; roiSize.height = 1; if( width > BOUND_NT_16s_C4P4R ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( width*16 > cache ) nonTemporal = 1; } } } else { width = roiSize.width; } width_ = width - (width & 0x7); if( (IPP_UINT_PTR(pSrc)&0xf) || (srcStep&0xf) || (dstStep&0xf) || (IPP_UINT_PTR(dst0)&0xf) || (IPP_UINT_PTR(dst1)&0xf) || (IPP_UINT_PTR(dst2)&0xf) || (IPP_UINT_PTR(dst3)&0xf) ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 32, d += 8 ) { v0 = _mm_loadu_si128( (__m128i*)(pSrc + s) ); v1 = _mm_loadu_si128( (__m128i*)(pSrc + s + 8) ); v2 = _mm_loadu_si128( (__m128i*)(pSrc + s + 16) ); v3 = _mm_loadu_si128( (__m128i*)(pSrc + s + 24) ); v4 = _mm_unpacklo_epi16( v0, v1 ); v0 = _mm_unpackhi_epi16( v0, v1 ); v5 = _mm_unpacklo_epi16( v2, v3 ); v2 = _mm_unpackhi_epi16( v2, v3 ); v1 = _mm_unpacklo_epi16( v4, v0 ); v4 = _mm_unpackhi_epi16( v4, v0 ); v3 = _mm_unpacklo_epi16( v5, v2 ); v5 = _mm_unpackhi_epi16( v5, v2 ); v0 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); v2 = _mm_unpacklo_epi64( v4, v5 ); v3 = _mm_unpackhi_epi64( v4, v5 ); _mm_storeu_si128( (__m128i*)(dst0 + d), v0 ); _mm_storeu_si128( (__m128i*)(dst1 + d), v1 ); _mm_storeu_si128( (__m128i*)(dst2 + d), v2 ); _mm_storeu_si128( (__m128i*)(dst3 + d), v3 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } else { if( nonTemporal ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 32, d += 8 ) { v0 = _mm_load_si128( (__m128i*)(pSrc + s) ); v1 = _mm_load_si128( (__m128i*)(pSrc + s + 8) ); v2 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); v3 = _mm_load_si128( (__m128i*)(pSrc + s + 24) ); v4 = _mm_unpacklo_epi16( v0, v1 ); v0 = _mm_unpackhi_epi16( v0, v1 ); v5 = _mm_unpacklo_epi16( v2, v3 ); v2 = _mm_unpackhi_epi16( v2, v3 ); v1 = _mm_unpacklo_epi16( v4, v0 ); v4 = _mm_unpackhi_epi16( v4, v0 ); v3 = _mm_unpacklo_epi16( v5, v2 ); v5 = _mm_unpackhi_epi16( v5, v2 ); v0 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); v2 = _mm_unpacklo_epi64( v4, v5 ); v3 = _mm_unpackhi_epi64( v4, v5 ); _mm_stream_si128( (__m128i*)(dst0 + d), v0 ); _mm_stream_si128( (__m128i*)(dst1 + d), v1 ); _mm_stream_si128( (__m128i*)(dst2 + d), v2 ); _mm_stream_si128( (__m128i*)(dst3 + d), v3 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } _mm_sfence(); } else { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 32, d += 8 ) { v0 = _mm_load_si128( (__m128i*)(pSrc + s) ); v1 = _mm_load_si128( (__m128i*)(pSrc + s + 8) ); v2 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); v3 = _mm_load_si128( (__m128i*)(pSrc + s + 24) ); v4 = _mm_unpacklo_epi16( v0, v1 ); v0 = _mm_unpackhi_epi16( v0, v1 ); v5 = _mm_unpacklo_epi16( v2, v3 ); v2 = _mm_unpackhi_epi16( v2, v3 ); v1 = _mm_unpacklo_epi16( v4, v0 ); v4 = _mm_unpackhi_epi16( v4, v0 ); v3 = _mm_unpacklo_epi16( v5, v2 ); v5 = _mm_unpackhi_epi16( v5, v2 ); v0 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); v2 = _mm_unpacklo_epi64( v4, v5 ); v3 = _mm_unpackhi_epi64( v4, v5 ); _mm_store_si128( (__m128i*)(dst0 + d), v0 ); _mm_store_si128( (__m128i*)(dst1 + d), v1 ); _mm_store_si128( (__m128i*)(dst2 + d), v2 ); _mm_store_si128( (__m128i*)(dst3 + d), v3 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); dst3 = (Ipp16s*)((Ipp8u*)dst3 + dstStep); } } } return; } /***********************************************************************/ void mfxowniCopy_16s_C3P3R_cn( const Ipp16s* pSrc, int srcStep, Ipp16s* const pDst[3], int dstStep, IppiSize roiSize ) { __ALIGN16 __m128i s0, s1, s2; __ALIGN16 __m128i d0, d1, d2, t0, t1, t2; Ipp16s *dst0 = pDst[0], *dst1 = pDst[1], *dst2 = pDst[2]; int h, s, d, cache, nonTemporal = 0; Ipp64s width, width_; IppStatus ownStatus = ippStsNoErr; if( roiSize.width < 8 ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < roiSize.width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); } return; } if( (dstStep*3 == srcStep) && (dstStep == roiSize.width*2) ) { width = roiSize.width*roiSize.height; roiSize.height = 1; if( width > BOUND_NT_16s_C3P3R ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( width*12 > cache ) nonTemporal = 1; } } } else { width = roiSize.width; } width_ = width - (width & 0x7); if( (IPP_UINT_PTR(pSrc)&0xf) || (srcStep&0xf) || (IPP_UINT_PTR(dst0)&0xf) || (IPP_UINT_PTR(dst1)&0xf) || (IPP_UINT_PTR(dst2)&0xf) || (dstStep&0xf) ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 24, d += 8 ) { s0 = _mm_loadu_si128( (__m128i*)(pSrc + s) ); s1 = _mm_loadu_si128( (__m128i*)(pSrc + s + 8) ); s2 = _mm_loadu_si128( (__m128i*)(pSrc + s + 16) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)m16_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)m16_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)m16_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)m16_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)m16_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)m16_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)m16_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)m16_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)m16_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_storeu_si128( (__m128i*)(dst0 + d), d0 ); _mm_storeu_si128( (__m128i*)(dst1 + d), d1 ); _mm_storeu_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); } } else { if( nonTemporal ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 24, d += 8 ) { s0 = _mm_load_si128( (__m128i*)(pSrc + s) ); s1 = _mm_load_si128( (__m128i*)(pSrc + s + 8) ); s2 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)m16_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)m16_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)m16_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)m16_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)m16_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)m16_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)m16_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)m16_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)m16_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_stream_si128( (__m128i*)(dst0 + d), d0 ); _mm_stream_si128( (__m128i*)(dst1 + d), d1 ); _mm_stream_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); } _mm_sfence(); } else { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 24, d += 8 ) { s0 = _mm_load_si128( (__m128i*)(pSrc + s) ); s1 = _mm_load_si128( (__m128i*)(pSrc + s + 8) ); s2 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)m16_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)m16_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)m16_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)m16_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)m16_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)m16_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)m16_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)m16_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)m16_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_store_si128( (__m128i*)(dst0 + d), d0 ); _mm_store_si128( (__m128i*)(dst1 + d), d1 ); _mm_store_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc = (Ipp16s*)((Ipp8u*)pSrc + srcStep); dst0 = (Ipp16s*)((Ipp8u*)dst0 + dstStep); dst1 = (Ipp16s*)((Ipp8u*)dst1 + dstStep); dst2 = (Ipp16s*)((Ipp8u*)dst2 + dstStep); } } } return; } /***********************************************************************/ void mfxowniCopy_8u_C4P4R_cn( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[4], int dstStep, IppiSize roiSize ) { __ALIGN16 __m128i v0, v1, v2, v3, v4, v5; Ipp8u *dst0 = pDst[0], *dst1 = pDst[1], *dst2 = pDst[2], *dst3 = pDst[3]; int h, s, d, cache, nonTemporal = 0; Ipp64s width, width_; IppStatus ownStatus = ippStsNoErr; if( roiSize.width < 16 ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < roiSize.width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; } return; } if( (dstStep*4 == srcStep) && (dstStep == roiSize.width) ) { width = roiSize.width*roiSize.height; roiSize.height = 1; if( width > BOUND_NT_8u_C4P4R ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( width*8 > cache ) nonTemporal = 1; } } } else { width = roiSize.width; } width_ = width - (width & 0xf); if( (IPP_UINT_PTR(pSrc)&0xf) || (srcStep&0xf) || (dstStep&0xf) || (IPP_UINT_PTR(dst0)&0xf) || (IPP_UINT_PTR(dst1)&0xf) || (IPP_UINT_PTR(dst2)&0xf) || (IPP_UINT_PTR(dst3)&0xf) ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 64, d += 16 ) { v0 = _mm_loadu_si128( (__m128i*)(pSrc + s) ); v1 = _mm_loadu_si128( (__m128i*)(pSrc + s + 16) ); v2 = _mm_loadu_si128( (__m128i*)(pSrc + s + 32) ); v3 = _mm_loadu_si128( (__m128i*)(pSrc + s + 48) ); v4 = _mm_unpacklo_epi8( v0, v1 ); v0 = _mm_unpackhi_epi8( v0, v1 ); v5 = _mm_unpacklo_epi8( v2, v3 ); v2 = _mm_unpackhi_epi8( v2, v3 ); v1 = _mm_unpacklo_epi8( v4, v0 ); v4 = _mm_unpackhi_epi8( v4, v0 ); v3 = _mm_unpacklo_epi8( v5, v2 ); v5 = _mm_unpackhi_epi8( v5, v2 ); v0 = _mm_unpacklo_epi8( v1, v4 ); v1 = _mm_unpackhi_epi8( v1, v4 ); v2 = _mm_unpacklo_epi8( v3, v5 ); v3 = _mm_unpackhi_epi8( v3, v5 ); v4 = _mm_unpacklo_epi64( v0, v2 ); v0 = _mm_unpackhi_epi64( v0, v2 ); v5 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); _mm_storeu_si128( (__m128i*)(dst0 + d), v4 ); _mm_storeu_si128( (__m128i*)(dst1 + d), v0 ); _mm_storeu_si128( (__m128i*)(dst2 + d), v5 ); _mm_storeu_si128( (__m128i*)(dst3 + d), v1 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; } } else { if( nonTemporal ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 64, d += 16 ) { v0 = _mm_load_si128( (__m128i*)(pSrc + s) ); v1 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); v2 = _mm_load_si128( (__m128i*)(pSrc + s + 32) ); v3 = _mm_load_si128( (__m128i*)(pSrc + s + 48) ); v4 = _mm_unpacklo_epi8( v0, v1 ); v0 = _mm_unpackhi_epi8( v0, v1 ); v5 = _mm_unpacklo_epi8( v2, v3 ); v2 = _mm_unpackhi_epi8( v2, v3 ); v1 = _mm_unpacklo_epi8( v4, v0 ); v4 = _mm_unpackhi_epi8( v4, v0 ); v3 = _mm_unpacklo_epi8( v5, v2 ); v5 = _mm_unpackhi_epi8( v5, v2 ); v0 = _mm_unpacklo_epi8( v1, v4 ); v1 = _mm_unpackhi_epi8( v1, v4 ); v2 = _mm_unpacklo_epi8( v3, v5 ); v3 = _mm_unpackhi_epi8( v3, v5 ); v4 = _mm_unpacklo_epi64( v0, v2 ); v0 = _mm_unpackhi_epi64( v0, v2 ); v5 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); _mm_stream_si128( (__m128i*)(dst0 + d), v4 ); _mm_stream_si128( (__m128i*)(dst1 + d), v0 ); _mm_stream_si128( (__m128i*)(dst2 + d), v5 ); _mm_stream_si128( (__m128i*)(dst3 + d), v1 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; } _mm_sfence(); } else { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 64, d += 16 ) { v0 = _mm_load_si128( (__m128i*)(pSrc + s) ); v1 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); v2 = _mm_load_si128( (__m128i*)(pSrc + s + 32) ); v3 = _mm_load_si128( (__m128i*)(pSrc + s + 48) ); v4 = _mm_unpacklo_epi8( v0, v1 ); v0 = _mm_unpackhi_epi8( v0, v1 ); v5 = _mm_unpacklo_epi8( v2, v3 ); v2 = _mm_unpackhi_epi8( v2, v3 ); v1 = _mm_unpacklo_epi8( v4, v0 ); v4 = _mm_unpackhi_epi8( v4, v0 ); v3 = _mm_unpacklo_epi8( v5, v2 ); v5 = _mm_unpackhi_epi8( v5, v2 ); v0 = _mm_unpacklo_epi8( v1, v4 ); v1 = _mm_unpackhi_epi8( v1, v4 ); v2 = _mm_unpacklo_epi8( v3, v5 ); v3 = _mm_unpackhi_epi8( v3, v5 ); v4 = _mm_unpacklo_epi64( v0, v2 ); v0 = _mm_unpackhi_epi64( v0, v2 ); v5 = _mm_unpacklo_epi64( v1, v3 ); v1 = _mm_unpackhi_epi64( v1, v3 ); _mm_store_si128( (__m128i*)(dst0 + d), v4 ); _mm_store_si128( (__m128i*)(dst1 + d), v0 ); _mm_store_si128( (__m128i*)(dst2 + d), v5 ); _mm_store_si128( (__m128i*)(dst3 + d), v1 ); } for( ; d < width; s += 4, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; dst3[d] = pSrc[s+3]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; dst3 += dstStep; } } } return; } /***********************************************************************/ void mfxowniCopy_8u_C3P3R_cn( const Ipp8u* pSrc, int srcStep, Ipp8u* const pDst[3], int dstStep, IppiSize roiSize ) { __ALIGN16 __m128i s0, s1, s2; __ALIGN16 __m128i d0, d1, d2, t0, t1, t2; Ipp8u *dst0 = pDst[0], *dst1 = pDst[1], *dst2 = pDst[2]; int h, s, d, cache, nonTemporal = 0; Ipp64s width, width_; IppStatus ownStatus = ippStsNoErr; if( roiSize.width < 16 ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < roiSize.width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; } return; } if( (dstStep*3 == srcStep) && (dstStep == roiSize.width) ) { width = roiSize.width*roiSize.height; roiSize.height = 1; if( width > BOUND_NT_8u_C3P3R ) { ownStatus = mfxGetMaxCacheSizeB( &cache ); if( ownStatus == ippStsNoErr ) { if( width*6 > cache ) nonTemporal = 1; } } } else { width = roiSize.width; } width_ = width - (width & 0xf); if( (IPP_UINT_PTR(pSrc)&0xf) || (srcStep&0xf) || (IPP_UINT_PTR(dst0)&0xf) || (IPP_UINT_PTR(dst1)&0xf) || (IPP_UINT_PTR(dst2)&0xf) || (dstStep&0xf) ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 48, d += 16 ) { s0 = _mm_loadu_si128( (__m128i*)(pSrc + s) ); s1 = _mm_loadu_si128( (__m128i*)(pSrc + s + 16) ); s2 = _mm_loadu_si128( (__m128i*)(pSrc + s + 32) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)msk_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)msk_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)msk_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)msk_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)msk_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)msk_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)msk_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)msk_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)msk_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_storeu_si128( (__m128i*)(dst0 + d), d0 ); _mm_storeu_si128( (__m128i*)(dst1 + d), d1 ); _mm_storeu_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; } } else { if( nonTemporal ) { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 48, d += 16 ) { s0 = _mm_load_si128( (__m128i*)(pSrc + s) ); s1 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); s2 = _mm_load_si128( (__m128i*)(pSrc + s + 32) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)msk_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)msk_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)msk_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)msk_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)msk_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)msk_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)msk_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)msk_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)msk_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_stream_si128( (__m128i*)(dst0 + d), d0 ); _mm_stream_si128( (__m128i*)(dst1 + d), d1 ); _mm_stream_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; } _mm_sfence(); } else { for( h = 0; h < roiSize.height; h++ ) { for( s = 0, d = 0; d < width_; s += 48, d += 16 ) { s0 = _mm_load_si128( (__m128i*)(pSrc + s) ); s1 = _mm_load_si128( (__m128i*)(pSrc + s + 16) ); s2 = _mm_load_si128( (__m128i*)(pSrc + s + 32) ); d0 = _mm_shuffle_epi8( s0, *(__m128i*)msk_00 ); d1 = _mm_shuffle_epi8( s0, *(__m128i*)msk_10 ); d2 = _mm_shuffle_epi8( s0, *(__m128i*)msk_20 ); t0 = _mm_shuffle_epi8( s1, *(__m128i*)msk_01 ); t1 = _mm_shuffle_epi8( s1, *(__m128i*)msk_11 ); t2 = _mm_shuffle_epi8( s1, *(__m128i*)msk_21 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); t0 = _mm_shuffle_epi8( s2, *(__m128i*)msk_02 ); t1 = _mm_shuffle_epi8( s2, *(__m128i*)msk_12 ); t2 = _mm_shuffle_epi8( s2, *(__m128i*)msk_22 ); d0 = _mm_or_si128( d0, t0); d1 = _mm_or_si128( d1, t1); d2 = _mm_or_si128( d2, t2); _mm_store_si128( (__m128i*)(dst0 + d), d0 ); _mm_store_si128( (__m128i*)(dst1 + d), d1 ); _mm_store_si128( (__m128i*)(dst2 + d), d2 ); } for( ; d < width; s += 3, d++ ) { dst0[d] = pSrc[s]; dst1[d] = pSrc[s+1]; dst2[d] = pSrc[s+2]; } pSrc += srcStep; dst0 += dstStep; dst1 += dstStep; dst2 += dstStep; } } } return; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pilogic.c000066400000000000000000000206561443134507600241110ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Description: // Logical functions (152)(mfxi domain) // // mfxiAndC_8u/16u/32s_C1R/C3R/C4R/AC4R/C1IR/C3IR/C4IR/AC4IR // */ #include "precomp.h" #include "owni.h" #define IPP_BAD_LOGICV_RET() \ IPP_BAD_PTR3_RET(pSrc, value, pDst) \ IPP_BAD_STEP_RET(srcStep) \ IPP_BAD_STEP_RET(dstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_BAD_LOGIC2_RET() \ IPP_BAD_PTR2_RET(pSrc, pDst) \ IPP_BAD_STEP_RET(srcStep) \ IPP_BAD_STEP_RET(dstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_BAD_LOGIC3_RET() \ IPP_BAD_PTR3_RET(pSrc1, pSrc2, pDst) \ IPP_BAD_STEP_RET(src1Step) \ IPP_BAD_STEP_RET(src2Step) \ IPP_BAD_STEP_RET(dstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_LOGIC_OPT \ ((_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7)) #define IPP_LOGIC_OPT1 \ ((_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7)) /* #define IPP_LOGIC_OPT_HSW ((_IPP>=_IPP_H9)||(_IPP32E >= _IPP32E_L9)) */ #if IPP_LOGIC_OPT extern void mfxownpi_AndC_8u_C1R(Ipp8u, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_AndC_8u_C3R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_AndC_8u_C4R(const Ipp8u[4], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_AndC_8u_AC4R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_And_8u_C1R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_And_8u_AC4R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_AndC_16u_C1R(Ipp16u, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_AndC_16u_C3R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_AndC_16u_C4R(const Ipp16u[4], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_AndC_16u_AC4R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_And_16u_C1R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_And_16u_AC4R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_AndC_32s_C1R(Ipp32s, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_AndC_32s_C3R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); //extern void mfxownpi_AndC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_AndC_32s_AC4R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_And_32s_C1R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_And_32s_AC4R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_OrC_8u_C1R(Ipp8u, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_OrC_8u_C3R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_OrC_8u_C4R(const Ipp8u[4], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_OrC_8u_AC4R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_Or_8u_C1R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_Or_8u_AC4R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_OrC_16u_C1R(Ipp16u, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_OrC_16u_C3R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_OrC_16u_C4R(const Ipp16u[4], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_OrC_16u_AC4R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_Or_16u_C1R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_Or_16u_AC4R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_OrC_32s_C1R(Ipp32s, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_OrC_32s_C3R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); //extern void mfxownpi_OrC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_OrC_32s_AC4R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_Or_32s_C1R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_Or_32s_AC4R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_XorC_8u_C1R(Ipp8u, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_XorC_8u_C3R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_XorC_8u_C4R(const Ipp8u[4], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_XorC_8u_AC4R(const Ipp8u[3], const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_Xor_8u_C1R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_Xor_8u_AC4R(const Ipp8u*, int, const Ipp8u*, int, Ipp8u*, int, int, int); extern void mfxownpi_XorC_16u_C1R(Ipp16u, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_XorC_16u_C3R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_XorC_16u_C4R(const Ipp16u[4], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_XorC_16u_AC4R(const Ipp16u[3], const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_Xor_16u_C1R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_Xor_16u_AC4R(const Ipp16u*, int, const Ipp16u*, int, Ipp16u*, int, int, int); extern void mfxownpi_XorC_32s_C1R(Ipp32s, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_XorC_32s_C3R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); //extern void mfxownpi_XorC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_XorC_32s_AC4R(const Ipp32s[3], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_Xor_32s_C1R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_Xor_32s_AC4R(const Ipp32s*, int, const Ipp32s*, int, Ipp32s*, int, int, int); #endif #if IPP_LOGIC_OPT1 extern void mfxownpi_AndC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_OrC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); extern void mfxownpi_XorC_32s_C4R(const Ipp32s[4], const Ipp32s*, int, Ipp32s*, int, int, int); #endif /* ================================== AND ================================== */ IPPFUN(IppStatus, mfxiAndC_16u_C1R, (const Ipp16u* pSrc, int srcStep, Ipp16u value, Ipp16u* pDst, int dstStep, IppiSize roiSize)) { IPP_BAD_LOGIC2_RET(); #if !IPP_LOGIC_OPT || IPP_LOGIC_OPT_HSW { int i, j; /* Ipp16u *src, *dst; */ for (j = 0; j < roiSize.height; j ++) { #if IPP_LOGIC_OPT_HSW #pragma unroll(2) #endif for (i = 0; i < roiSize.width; i ++) pDst[i] = value & pSrc[i]; pSrc = (Ipp16u*)((Ipp8u*)pSrc + srcStep); pDst = (Ipp16u*)((Ipp8u*)pDst + dstStep); } } #else mfxownpi_AndC_16u_C1R(value, pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height); #endif return ippStsNoErr; } IPPFUN(IppStatus, mfxiAndC_16u_C1IR, (Ipp16u value, Ipp16u* pSrcDst, int srcDstStep, IppiSize roiSize)) { return mfxiAndC_16u_C1R(pSrcDst, srcDstStep, value, pSrcDst, srcDstStep, roiSize); } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pizigzag.c000066400000000000000000000063361443134507600243060ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Purpose: // reorder zigzag to natural // // Contents: // IppStatus mfxiZigzagInv8x8_16s_C1(const Ipp16s pSrc, Ipp16s pDst) // IppStatus mfxiZigzagFwd8x8_16s_C1(const Ipp16s pSrc, Ipp16s pDst) // */ #include "precomp.h" #include "owni.h" static int zigzag_index_Fwd [64] ={ 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63 }; static int zigzag_index_Inv [64] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiZigzagInv8x8_16s_C1 // // Purpose: // reorder natural to zigzag 8x8 block // // Parameter: // pSrc - pointer to source block // pDst - pointer to destination block // // Returns: // IppStatus // // */ #if !(( _IPP >= _IPP_H9 ) || ( _IPP32E >= _IPP32E_L9 )) IPPFUN(IppStatus, mfxiZigzagInv8x8_16s_C1,(const Ipp16s* pSrc, Ipp16s* pDst)) { int i; IPP_BAD_PTR2_RET(pSrc,pDst); for(i = 0; i < 64; i++) pDst[i] = pSrc[ zigzag_index_Fwd[i] ]; return ippStsNoErr; } /* mfxiZigzagInv8x8_16s_C1() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiZigzagFwd8x8_16s_C1 // // Purpose: // reorder zigzag to natural 8x8 block // // Parameter: // pSrc - pointer to source block // pDst - pointer to destination block // // Returns: // IppStatus // // */ IPPFUN(IppStatus, mfxiZigzagFwd8x8_16s_C1, (const Ipp16s* pSrc, Ipp16s* pDst)){ int i; IPP_BAD_PTR2_RET(pSrc,pDst) for (i = 0; i < 64; i++) pDst[i] = pSrc[ zigzag_index_Inv[i] ]; return ippStsNoErr; } /* mfxiZigzagFwd8x8_16s_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct0.c000066400000000000000000000143461443134507600243220ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Purpose: // Inverse DCT transform with nonzero elements only in // top left 1x1, 2x2 or 4x4 quadrant + de-quantization and level shift // // Contents: // mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R // */ #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) extern void mfxdct_quant_inv8x8_1x1_ls(const Ipp16s* pSrc,Ipp8u* pDst,int dstStep,const Ipp16u* pQntInvTbl); extern void mfxdct_quant_inv8x8_2x2_ls(const Ipp16s* pSrc,Ipp8u* pDst,int dstStep,const Ipp16u* pQntInvTbl); extern void mfxdct_quant_inv8x8_4x4_ls(const Ipp16s* pSrc,Ipp8u* pDst,int dstStep,const Ipp16u* pQntInvTbl); #else static void mfxdct_quant_inv8x8_1x1_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { int i; int val; Ipp8u dc; val = ((pSrc[0] * pQuantInvTable[0]) >> 3) + 128; dc = (Ipp8u)(val > 255 ? 255 : (val < 0 ? 0 : val)); for(i = 0; i < 8; i++) { pDst[i*dstStep + 0] = dc; pDst[i*dstStep + 1] = dc; pDst[i*dstStep + 2] = dc; pDst[i*dstStep + 3] = dc; pDst[i*dstStep + 4] = dc; pDst[i*dstStep + 5] = dc; pDst[i*dstStep + 6] = dc; pDst[i*dstStep + 7] = dc; } return; } /* mfxdct_quant_inv8x8_1x1_ls() */ static void mfxdct_quant_inv8x8_2x2_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* workbuf; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; IppiSize roi = { 8, 8 }; workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); mfxsMul_16s(pSrc,(const Ipp16s*)pQuantInvTable, workbuf,DCTSIZE2); mfxiDCT8x8Inv_2x2_16s_C1I(workbuf); mfxiAdd128_JPEG_16s8u_C1R(workbuf, 8*sizeof(Ipp16s), pDst, dstStep, roi); return; } /* dct_quant_inv8x8_2x2_ls() */ static void dct_quant_inv8x8_4x4_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* workbuf; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; IppiSize roi = { 8, 8 }; workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); mfxsMul_16s(pSrc,(const Ipp16s*)pQuantInvTable, workbuf,DCTSIZE2); mfxiDCT8x8Inv_4x4_16s_C1I(workbuf); mfxiAdd128_JPEG_16s8u_C1R(workbuf, 8*sizeof(Ipp16s), pDst, dstStep, roi); return; } /* dct_quant_inv8x8_4x4_ls() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform with nonzero elements only in top left quadrant 1x1 + de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_quant_inv8x8_1x1_ls(pSrc, pDst, dstStep, pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8LS_1x1_JPEG_16s8u_C1R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform with nonzero elements only in // top left quadrant 2x2 + de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_quant_inv8x8_2x2_ls(pSrc, pDst, dstStep, pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8LS_2x2_JPEG_16s8u_C1R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform with nonzero elements only in // top left quadrant 4x4 + de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_quant_inv8x8_4x4_ls(pSrc, pDst, dstStep, pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8LS_4x4_JPEG_16s8u_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct0w7cn.c000066400000000000000000000220301443134507600251060ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Inverse DCT transform with nonzero elements only in // top left 1x1, 2x2 or 4x4 quadrant + de-quantization and level shift // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #include extern void mfxdct_8x8_inv_2x2_16s(Ipp16s* pSrc, Ipp16s* pDst); extern void mfxdct_8x8_inv_4x4_16s(Ipp16s* pSrc, Ipp16s* pDst); static const __ALIGN16 Ipp16u iSA[8] = { 128, 128, 128, 128, 128, 128, 128, 128 }; extern void mfxdct_quant_inv8x8_1x1_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { __ALIGN16 __m128i _iS0; Ipp16s val = ((pSrc[0] * pQuantInvTable[0]) >> 3) + 128; pDst[0] = (Ipp8u)(val > 255 ? 255 : (val < 0 ? 0 : val)); _iS0 = _mm_set1_epi8((char)pDst[0]); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 0*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 1*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 2*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 3*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 4*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 5*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 6*dstStep), _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 7*dstStep), _iS0); return; } /* mfxdct_quant_inv8x8_1x1_ls() */ extern void mfxdct_quant_inv8x8_2x2_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* buf; Ipp16s ptr[64*sizeof(Ipp16s) + CPU_CACHE_LINE-1]; __ALIGN16 __m128i _iS0, _iS1, _iS2, _iSA; buf = (Ipp16s*)IPP_ALIGNED_PTR(&ptr[0],CPU_CACHE_LINE); if((IPP_UINT_PTR(pSrc) || IPP_UINT_PTR(pQuantInvTable)) & 0x0F) { /* Source or quant table is not 16-byte-aligned */ _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 0), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 8), _iS2); } else { _iS0 = _mm_load_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 0), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 8), _iS2); } mfxdct_8x8_inv_2x2_16s(buf, buf); _iSA = _mm_load_si128((__m128i*)(iSA + 0)); _iS0 = _mm_load_si128((__m128i*)(buf + 0)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 0*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 8)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 1*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 16)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 2*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 24)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 3*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 32)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 4*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 40)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 5*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 48)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 6*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 56)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 7*dstStep), _iS2); return; } /* mfxdct_quant_inv8x8_2x2_ls() */ extern void mfxdct_quant_inv8x8_4x4_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* buf; Ipp16s ptr[64*sizeof(Ipp16s) + CPU_CACHE_LINE-1]; __ALIGN16 __m128i _iS0, _iS1, _iS2, _iSA; buf = (Ipp16s*)IPP_ALIGNED_PTR(&ptr[0],CPU_CACHE_LINE); if((IPP_UINT_PTR(pSrc) || IPP_UINT_PTR(pQuantInvTable)) & 0x0F) { /* If pSrc or pQuantInvTable is not aligned on 16 byte */ _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 0), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 8), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 16), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 24), _iS2); } else { /* Everything is aligned */ _iS0 = _mm_load_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 0), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 8), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 16), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)((Ipp16s*)buf + 24), _iS2); } mfxdct_8x8_inv_4x4_16s(buf, buf); _iSA = _mm_load_si128((__m128i*)(iSA + 0)); _iS0 = _mm_load_si128((__m128i*)(buf + 0)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 0*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 8)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 1*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 16)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 2*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 24)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 3*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 32)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 4*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 40)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 5*dstStep), _iS2); _iS0 = _mm_load_si128((__m128i*)(buf + 48)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS2 = _mm_packus_epi16(_iS0, _iS0); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 6*dstStep), _iS2); _iS1 = _mm_load_si128((__m128i*)(buf + 56)); _iS1 = _mm_adds_epi16(_iS1,_iSA); _iS2 = _mm_packus_epi16(_iS1, _iS1); _mm_storel_epi64((__m128i*)((Ipp8u*)pDst + 7*dstStep), _iS2); return; } /* mfxdct_quant_inv8x8_4x4_ls() */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct1.c000066400000000000000000000110211443134507600243060ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Inverse DCT transform with scale image size and // de-quantization and level shift // // Contents: // mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R // // */ #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) extern void mfxdct_quant_inv8x8To2x2_ls(const Ipp16s* pSrc,Ipp8u* pDst,int dstStep,const Ipp16u* pQntInvTbl); extern void mfxdct_quant_inv8x8To4x4_ls(const Ipp16s* pSrc,Ipp8u* pDst,int dstStep,const Ipp16u* pQntInvTbl); #else static void mfxdct_quant_inv8x8To4x4_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* workbuf; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; IppiSize roi = { 4, 4 }; workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); mfxsMul_16s(pSrc,(const Ipp16s*)pQuantInvTable,workbuf,DCTSIZE2); mfxiDCT8x8To4x4Inv_16s_C1I(workbuf); mfxiAdd128_JPEG_16s8u_C1R(workbuf, 4*sizeof(Ipp16s), pDst, dstStep, roi); return; } /* mfxdct_quant_inv8x8To4x4_ls() */ static void mfxdct_quant_inv8x8To2x2_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* workbuf; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; IppiSize roi = { 2, 2 }; workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); mfxsMul_16s(pSrc,(const Ipp16s*)pQuantInvTable,workbuf,DCTSIZE2); mfxiDCT8x8To2x2Inv_16s_C1I(workbuf); mfxiAdd128_JPEG_16s8u_C1R(workbuf, 2*sizeof(Ipp16s), pDst, dstStep, roi); return; } /* mfxdct_quant_inv8x8To2x2_ls() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform with scale image to 1/2 size and // de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_quant_inv8x8To4x4_ls(pSrc, pDst, dstStep, pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R // // Purpose: // Inverse DCT transform with scale image to 1/4 size and // de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R,( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_quant_inv8x8To2x2_ls(pSrc, pDst, dstStep, pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct1w7cn.c000066400000000000000000000243231443134507600251160ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Inverse DCT transform with scale image size and // de-quantization and level shift // // Contents: // mfxiDCTQuantInv8x8To2x2LS_JPEG_16s8u_C1R // mfxiDCTQuantInv8x8To4x4LS_JPEG_16s8u_C1R // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #include extern void mfxdct_8x8To2x2_inv_16s(Ipp16s* pSrc, Ipp16s* pDst); extern void mfxdct_8x8To4x4_inv_16s(Ipp16s* pSrc, Ipp16s* pDst); static const __ALIGN16 Ipp16u iSA[8] = { 128, 128, 128, 128, 128, 128, 128, 128 }; extern void mfxdct_quant_inv8x8To4x4_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { Ipp16s* workbuf; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; Ipp32s* p1; Ipp32s* p2; Ipp32s* p3; Ipp32s* p4; __ALIGN16 __m128i _iS0, _iS1, _iS2, _iSA; p1 = (Ipp32s*)(pDst + 0*dstStep); p2 = (Ipp32s*)(pDst + 1*dstStep); p3 = (Ipp32s*)(pDst + 2*dstStep); p4 = (Ipp32s*)(pDst + 3*dstStep); workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); if(!((intptr_t)pQuantInvTable & 15) && !((intptr_t)pSrc & 15)) { _iS0 = _mm_load_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 0), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 8), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 16), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 24), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 32)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 32), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 40)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 40), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 48)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 48), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 56)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 56), _iS2); } else { _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 0), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 8), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 16), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 24), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 32)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 32), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 40)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 40), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 48)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 48), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 56)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 56), _iS2); } mfxdct_8x8To4x4_inv_16s(workbuf, workbuf); _iSA = _mm_load_si128((__m128i*)(iSA + 0)); _iS0 = _mm_load_si128((__m128i*)(workbuf + 0)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS1 = _mm_packus_epi16(_iS0, _iS0); *p1 = (Ipp32s)_mm_cvtsi128_si32(_iS1); _iS2 = _mm_srli_si128(_iS1, 4); *p2 = (Ipp32s)_mm_cvtsi128_si32(_iS2); _iS0 = _mm_load_si128((__m128i*)(workbuf + 8)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS1 = _mm_packus_epi16(_iS0, _iS0); *p3 = (Ipp32s)_mm_cvtsi128_si32(_iS1); _iS2 = _mm_srli_si128(_iS1, 4); *p4 = (Ipp32s)_mm_cvtsi128_si32(_iS2); return; } /* mfxdct_quant_inv8x8To4x4_ls() */ extern void mfxdct_quant_inv8x8To2x2_ls( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable) { int t1; Ipp16s* workbuf; Ipp16s* p1; Ipp16s* p2; Ipp8u buf[DCTSIZE2 * sizeof(Ipp16s) + CPU_CACHE_LINE-1]; __ALIGN16 __m128i _iS0, _iS1, _iS2, _iSA; p1 = (Ipp16s*)(pDst + 0*dstStep); p2 = (Ipp16s*)(pDst + 1*dstStep); workbuf = (Ipp16s*)IPP_ALIGNED_PTR(&buf[0],CPU_CACHE_LINE); if(!((intptr_t)pQuantInvTable & 15) && !((intptr_t)pSrc & 15)) { _iS0 = _mm_load_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 0), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 8), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 16), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 24), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 32)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 32), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 40)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 40), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 48)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 48), _iS2); _iS0 = _mm_load_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_load_si128((__m128i*)(pQuantInvTable + 56)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 56), _iS2); } else { _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 0)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 0), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 8)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 8), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 16)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 16), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 24)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 24), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 32)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 32), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 40)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 40), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 48)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 48), _iS2); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_loadu_si128((__m128i*)(pQuantInvTable + 56)); _iS2 = _mm_mullo_epi16(_iS0, _iS1); _mm_store_si128((__m128i*)(workbuf + 56), _iS2); } mfxdct_8x8To2x2_inv_16s(workbuf, workbuf); _iSA = _mm_load_si128((__m128i*)(iSA + 0)); _iS0 = _mm_load_si128((__m128i*)(workbuf + 0)); _iS0 = _mm_adds_epi16(_iS0,_iSA); _iS1 = _mm_packus_epi16(_iS0, _iS0); t1 = _mm_cvtsi128_si32(_iS1); *p1 = (Ipp16s)t1; *p2 = (Ipp16s) (t1 >> 16) ; return; } /* mfxdct_quant_inv8x8To4x4_ls() */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct32f.c000066400000000000000000000056431443134507600245550ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT + quantization+level shift and // range convert functions (Inverse transform) // // Contents: // mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) extern void mfxdct_qnt_inv_8x8_ls(const Ipp16s* pSrc,Ipp16u* pDst,int dstStep,const Ipp32f* pQntInvTbl); #else static void mfxdct_qnt_inv_8x8_ls(const Ipp16s* pSrc,Ipp16u* pDst,int dstStep,const Ipp32f* pQntInvTbl) { int i; IppiSize roi = { DCTSIZE, DCTSIZE }; __ALIGN16 Ipp32f wb[DCTSIZE2]; mfxsConvert_16s32f(pSrc, wb, DCTSIZE2); mfxsMul_32f_I(pQntInvTbl, wb, DCTSIZE2); mfxiDCT8x8Inv_32f_C1I(wb); mfxsAddC_32f_I(2048.0, wb, DCTSIZE2); for(i = 0; i < DCTSIZE; i++) mfxsConvert_32f16u_Sfs(wb + i*DCTSIZE, (Ipp16u*)((Ipp8u*)pDst + i*dstStep), DCTSIZE, ippRndNear, 0); mfxiThreshold_16u_C1IR(pDst,dstStep,roi,4095,ippCmpGreater); return; } /* mfxdct_qnt_inv_8x8_ls() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R // // Purpose: // Inverse DCT transform, de-quantization and level shift // // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R,( const Ipp16s* pSrc, Ipp16u* pDst, int dstStep, const Ipp32f* pQuantInvTable)) { IPP_BAD_PTR2_RET(pSrc, pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) mfxdct_qnt_inv_8x8_ls(pSrc,pDst,dstStep,pQuantInvTable); return ippStsNoErr; } /* mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdct32fw7cn.c000066400000000000000000000310471443134507600253510ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT + quantization+level shift and // range convert functions (Inverse transform) // // Contents: // mfxiDCTQuantInv8x8LS_JPEG_16s16u_C1R // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #include "ps_anarith.h" #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #include extern void mfxdct_8x8_inv_32f(Ipp32f* x, Ipp32f* y); static const __ALIGN16 Ipp32f fLS[4] = { 2048., 2048., 2048., 2048. }; static const __ALIGN16 Ipp16u iST[8] = { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095 }; extern void mfxdct_qnt_inv_8x8_ls( const Ipp16s* pSrc, Ipp16u* pDst, int dstStep, const Ipp32f* pQntInvTbl) { // int i; __ALIGN16 __m128 _fS0, _fS1, _fS2; __ALIGN16 __m128i _iS0, _iS1, _iS2, _iST, _iZR; __ALIGN16 Ipp32f wb[64]; __ALIGN16 Ipp32f wb2[64]; /* 665 clocks with second buf (690 with only one) */ if(!((intptr_t)pQntInvTbl & 15) && !((intptr_t)pSrc & 15)) { _iS0 = _mm_load_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 4); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 0, _fS1); _mm_store_ps(wb + 4, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 8); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 12); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 8, _fS1); _mm_store_ps(wb + 12, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 16); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 20); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 16, _fS1); _mm_store_ps(wb + 20, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 24); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 28); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 24, _fS1); _mm_store_ps(wb + 28, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 32); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 36); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 32, _fS1); _mm_store_ps(wb + 36, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 40); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 44); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 40, _fS1); _mm_store_ps(wb + 44, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 48); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 52); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 48, _fS1); _mm_store_ps(wb + 52, _fS0); _iS0 = _mm_load_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_load_ps(pQntInvTbl + 56); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_load_ps(pQntInvTbl + 60); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 56, _fS1); _mm_store_ps(wb + 60, _fS0); } else { _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 0)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 4); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 0, _fS1); _mm_store_ps(wb + 4, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 8)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 8); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 12); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 8, _fS1); _mm_store_ps(wb + 12, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 16)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 16); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 20); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 16, _fS1); _mm_store_ps(wb + 20, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 24)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 24); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 28); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 24, _fS1); _mm_store_ps(wb + 28, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 32)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 32); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 36); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 32, _fS1); _mm_store_ps(wb + 36, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 40)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 40); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 44); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 40, _fS1); _mm_store_ps(wb + 44, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 48)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 48); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 52); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 48, _fS1); _mm_store_ps(wb + 52, _fS0); _iS0 = _mm_loadu_si128((__m128i*)(pSrc + 56)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS2 = _mm_loadu_ps(pQntInvTbl + 56); _fS1 = _mm_mul_ps(_fS1, _fS2); _fS2 = _mm_loadu_ps(pQntInvTbl + 60); _fS0 = _mm_mul_ps(_fS0, _fS2); _mm_store_ps(wb + 56, _fS1); _mm_store_ps(wb + 60, _fS0); } mfxdct_8x8_inv_32f(wb, wb2); _iZR = _mm_setzero_si128(); _iST = _mm_load_si128((__m128i*)iST); _fS2 = _mm_load_ps(fLS); _fS0 = _mm_load_ps(wb2 + 0); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 4); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0,_iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 0*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 8); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 12); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 1*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 16); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 20); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 2*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 24); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 28); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 3*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 32); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 36); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 4*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 40); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 44); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 5*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 48); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 52); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 6*dstStep), _iS0); _fS0 = _mm_load_ps(wb2 + 56); _fS0 = _mm_add_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb2 + 60); _fS1 = _mm_add_ps(_fS1, _fS2); _iS0 = _mm_cvttps_epi32(_fS0); _iS1 = _mm_cvttps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); // saturate to 0...4095 _iS0 = _mm_max_epi16(_iS0,_iZR); _iS0 = _mm_min_epi16(_iS0,_iST); _mm_storeu_si128((__m128i*)((Ipp8u*)pDst + 7*dstStep), _iS0); return; } /* mfxdct_qnt_fwd_8x8_ls() */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecdctcn.c000066400000000000000000000670221443134507600245620ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT+quantization+level shift+range convert functions (Inverse transform) // // Contents: // mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R // */ #include // __m128i etc #include "precomp.h" #include "ownj.h" //#ifndef __PS_ANARITH_H__ //#include "ps_anarith.h" //#endif //#ifndef __PJDECLS_H__ //#include "pjdecls.h" //#endif //#ifndef __PJQUANT_H__ //#include "pjquant.h" //#endif #if !((_IPP>=_IPP_H9)||(_IPP32E>=_IPP32E_L9)) #if ((_IPP>=_IPP_V8)||(_IPP32E>=_IPP32E_U8)) #define XMMCONST static const _Alignas(16) #define SH_2020 _MM_SHUFFLE(2,0,2,0) #define SH_3131 _MM_SHUFFLE(3,1,3,1) #define SH_1032 _MM_SHUFFLE(1,0,3,2) #define SH_0123 _MM_SHUFFLE(0,1,2,3) #define SH_0000 _MM_SHUFFLE(0,0,0,0) #define PADDSW(a, b) _mm_adds_epi16( a, b ) #define PSUBSW(a, b) _mm_subs_epi16( a, b ) #define PADDW(a, b) _mm_add_epi16( a, b ) #define PADDD(a, b) _mm_add_epi32( a, b ) #define PSUBD(a, b) _mm_sub_epi32( a, b ) #define PMULHW(a, b) _mm_mulhi_epi16( a, b ) #define PMADDWD(a, b) _mm_madd_epi16( a, b ) #define POR(a, b) _mm_or_si128( a, b ) #define PMAXUB(a, b) _mm_max_epu8( a, b ) #define PMINUB(a, b) _mm_min_epu8( a, b ) #define PSLLW(a, c) _mm_slli_epi16( a, c ) #define PSRAW(a, c) _mm_srai_epi16( a, c ) #define PSRAD(a, c) _mm_srai_epi32( a, c ) #define PACKUSWB(a, b) _mm_packus_epi16( a, b ) #define PACKSSDW(a, b) _mm_packs_epi32( a, b ) #define PSHUFLW(a, m) _mm_shufflelo_epi16( a, m ) #define PSHUFHW(a, m) _mm_shufflehi_epi16( a, m ) #define PSHUFD(a, m) _mm_shuffle_epi32( a, m ) #define PUNPACKLBW(a, b) _mm_unpacklo_epi8( a, b ) #define PUNPACKLDQ(a, b) _mm_unpacklo_epi32( a, b ) #define PUNPACKHDQ(a, b) _mm_unpackhi_epi32( a, b ) #define PUNPACKLQDQ(a, b) _mm_unpacklo_epi64( a, b ) #define PUNPACKHQDQ(a, b) _mm_unpackhi_epi64( a, b ) #define SET1(w) _mm_set1_epi16( w ) #define ZERO _mm_setzero_si128() #define LDX(p) _mm_loadu_si128( (__m128i*)(p) ) #define STX(p, v) _mm_storeu_si128( (__m128i*)(p), v ) #define LDK(p) ( *(__m128i*)(&(p)) ) #define LDL(p) _mm_loadl_epi64( (__m128i*)(p) ) #define CAST128(a) _mm_castsi128_ps( a ) #define STL(p, v) _mm_storel_pi( (__m64*)(p), CAST128(v) ) #define STH(p, v) _mm_storeh_pi( (__m64*)(p), CAST128(v) ) #define STLH(p1, p2, v) { STL( p1, v ); STH( p2, v ); } #define BITS_FWD_ACC 3 #define SHIFT_FWD_COL BITS_FWD_ACC #define SHIFT_FWD_ROW BITS_FWD_ACC + 17 #define RND_FWD_ROW (1 << (SHIFT_FWD_ROW-1)) #define BITS_INV_ACC 5 #define SHIFT_INV_ROW 16 - BITS_INV_ACC #define SHIFT_INV_COL 1 + BITS_INV_ACC #define RND_INV_ROW (1 << (SHIFT_INV_ROW-1)) #define c_inv_corr_0 -1024 * (6 - BITS_INV_ACC) + 65536 /* -0.5 + 32.0 */ #define c_inv_corr_1 1877 * (6 - BITS_INV_ACC) /* 0.9167 */ #define c_inv_corr_2 1236 * (6 - BITS_INV_ACC) /* 0.6035 */ #define c_inv_corr_3 680 * (6 - BITS_INV_ACC) /* 0.3322 */ #define c_inv_corr_4 0 * (6 - BITS_INV_ACC) /* 0.0 */ #define c_inv_corr_5 -569 * (6 - BITS_INV_ACC) /* -0.278 */ #define c_inv_corr_6 -512 * (6 - BITS_INV_ACC) /* -0.25 */ #define c_inv_corr_7 -651 * (6 - BITS_INV_ACC) /* -0.3176 */ #define RND_INV_ROW_0 RND_INV_ROW + c_inv_corr_0 #define RND_INV_ROW_1 RND_INV_ROW + c_inv_corr_1 #define RND_INV_ROW_2 RND_INV_ROW + c_inv_corr_2 #define RND_INV_ROW_3 RND_INV_ROW + c_inv_corr_3 #define RND_INV_ROW_4 RND_INV_ROW + c_inv_corr_4 #define RND_INV_ROW_5 RND_INV_ROW + c_inv_corr_5 #define RND_INV_ROW_6 RND_INV_ROW + c_inv_corr_6 #define RND_INV_ROW_7 RND_INV_ROW + c_inv_corr_7 XMMCONST int round_i_0[4] = { RND_INV_ROW_0, RND_INV_ROW_0, RND_INV_ROW_0, RND_INV_ROW_0 }; XMMCONST int round_i_1[4] = { RND_INV_ROW_1, RND_INV_ROW_1, RND_INV_ROW_1, RND_INV_ROW_1 }; XMMCONST int round_i_2[4] = { RND_INV_ROW_2, RND_INV_ROW_2, RND_INV_ROW_2, RND_INV_ROW_2 }; XMMCONST int round_i_3[4] = { RND_INV_ROW_3, RND_INV_ROW_3, RND_INV_ROW_3, RND_INV_ROW_3 }; XMMCONST int round_i_4[4] = { RND_INV_ROW_4, RND_INV_ROW_4, RND_INV_ROW_4, RND_INV_ROW_4 }; XMMCONST int round_i_5[4] = { RND_INV_ROW_5, RND_INV_ROW_5, RND_INV_ROW_5, RND_INV_ROW_5 }; XMMCONST int round_i_6[4] = { RND_INV_ROW_6, RND_INV_ROW_6, RND_INV_ROW_6, RND_INV_ROW_6 }; XMMCONST int round_i_7[4] = { RND_INV_ROW_7, RND_INV_ROW_7, RND_INV_ROW_7, RND_INV_ROW_7 }; XMMCONST short int tg_1_16[8] = { 13036, 13036, 13036, 13036, 13036, 13036, 13036, 13036 }; XMMCONST short int tg_2_16[8] = { 27146, 27146, 27146, 27146, 27146, 27146, 27146, 27146 }; XMMCONST short int tg_3_16[8] = {-21746, -21746, -21746, -21746, -21746, -21746, -21746, -21746 }; XMMCONST short int cos_4_16[8] = {-19195, -19195, -19195, -19195, -19195, -19195, -19195, -19195 }; XMMCONST short int tab_i_04[32] = { 16384, 21407, 16384, 8867, -16384, 21407, 16384, -8867, 16384, -8867, 16384, -21407, 16384, 8867, -16384, -21407, 22725, 19266, 19266, -4520, 4520, 19266, 19266, -22725, 12873, -22725, 4520, -12873, 12873, 4520, -22725, -12873 }; XMMCONST short int tab_i_17[32] = { 22725, 29692, 22725, 12299, -22725, 29692, 22725, -12299, 22725, -12299, 22725, -29692, 22725, 12299, -22725, -29692, 31521, 26722, 26722, -6270, 6270, 26722, 26722, -31521, 17855, -31521, 6270, -17855, 17855, 6270, -31521, -17855 }; XMMCONST short int tab_i_26[32] = { 21407, 27969, 21407, 11585, -21407, 27969, 21407, -11585, 21407, -11585, 21407, -27969, 21407, 11585, -21407, -27969, 29692, 25172, 25172, -5906, 5906, 25172, 25172, -29692, 16819, -29692, 5906, -16819, 16819, 5906, -29692, -16819 }; XMMCONST short int tab_i_35[32] = { 19266, 25172, 19266, 10426, -19266, 25172, 19266, -10426, 19266, -10426, 19266, -25172, 19266, 10426, -19266, -25172, 26722, 22654, 22654, -5315, 5315, 22654, 22654, -26722, 15137, -26722, 5315, -15137, 15137, 5315, -26722, -15137 }; __INLINE void dct_8x8_inv_16s_algnd( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16s* pQuantInvTable ); __INLINE void dct_8x8_inv_16s ( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16s* pQuantInvTable ); /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R // Purpose: // Inverse DCT transform, de-quantization and level shift // Parameter: // pSrc - pointer to source // pDst - pointer to output array // dstStep - line offset for output data // pQuantInvTable - pointer to Quantization table // Returns: // IppStatus */ IPPFUN(IppStatus, mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R, ( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16u* pQuantInvTable)) { //__ALIGN32 Ipp16s buff[DCTSIZE2]; IPP_BAD_PTR2_RET(pSrc,pDst) IPP_BAD_STEP_RET(dstStep) IPP_BAD_PTR1_RET(pQuantInvTable) if ( !((IPP_INT_PTR(pSrc)|IPP_INT_PTR(pQuantInvTable)) & 15) ) { dct_8x8_inv_16s_algnd ( pSrc, pDst, dstStep, (const Ipp16s*)pQuantInvTable); } else { dct_8x8_inv_16s ( pSrc, pDst, dstStep, (const Ipp16s*)pQuantInvTable); } return ippStsNoErr; } /* mfxiDCTQuantInv8x8LS_JPEG_16s8u_C1R() */ __INLINE void dct_8x8_inv_16s_algnd ( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16s* pQuantInvTable ) { __m128i x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, t0, t1, t2, t3, t4, t5, t6, t7, xe, xo, t1e, t2e, t1o, t2o, a0, b0, s0, s1, tp03, tm03, tp12, tm12, tp65, tm65, tp465, tm465, tp765, tm765; __m128i xmmTmp; /* ------------------------------------------------------------------------ */ /* rows */ /* ------------------------------------------------------------------------ */ x0 = _mm_load_si128( (__m128i*)(pSrc + 0*8) ); x0 = _mm_mullo_epi16(x0, *((__m128i*)(pQuantInvTable + 0*8)) ); xe = PSHUFLW( x0, SH_2020 ); xo = PSHUFLW( x0, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_04[0]) ); t2e = PMADDWD( xe, LDK(tab_i_04[8]) ); t1o = PMADDWD( xo, LDK(tab_i_04[16]) ); t2o = PMADDWD( xo, LDK(tab_i_04[24]) ); t1e = PADDD( t1e, LDK(round_i_0) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x0 = PACKSSDW( s0, s1 ); x0 = PSHUFHW( x0, SH_0123 ); x4 = _mm_load_si128( (__m128i*)(pSrc + 4*8) ); x4 = _mm_mullo_epi16(x4, *((__m128i*)(pQuantInvTable + 4*8)) ); xe = PSHUFLW( x4, SH_2020 ); xo = PSHUFLW( x4, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_04[0]) ); t2e = PMADDWD( xe, LDK(tab_i_04[8]) ); t1o = PMADDWD( xo, LDK(tab_i_04[16]) ); t2o = PMADDWD( xo, LDK(tab_i_04[24]) ); t1e = PADDD( t1e, LDK(round_i_4) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x4 = PACKSSDW( s0, s1 ); x4 = PSHUFHW( x4, SH_0123 ); x1 = _mm_load_si128( (__m128i*)(pSrc + 1*8) ); x1 = _mm_mullo_epi16(x1, *((__m128i*)(pQuantInvTable + 1*8)) ); xe = PSHUFLW( x1, SH_2020 ); xo = PSHUFLW( x1, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_17[0]) ); t2e = PMADDWD( xe, LDK(tab_i_17[8]) ); t1o = PMADDWD( xo, LDK(tab_i_17[16]) ); t2o = PMADDWD( xo, LDK(tab_i_17[24]) ); t1e = PADDD( t1e, LDK(round_i_1) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x1 = PACKSSDW( s0, s1 ); x1 = PSHUFHW( x1, SH_0123 ); x7 = _mm_load_si128( (__m128i*)( pSrc + 7*8 ) ); x7 = _mm_mullo_epi16(x7, *((__m128i*)(pQuantInvTable + 7*8)) ); xe = PSHUFLW( x7, SH_2020 ); xo = PSHUFLW( x7, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_17[0]) ); t2e = PMADDWD( xe, LDK(tab_i_17[8]) ); t1o = PMADDWD( xo, LDK(tab_i_17[16]) ); t2o = PMADDWD( xo, LDK(tab_i_17[24]) ); t1e = PADDD( t1e, LDK(round_i_7) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x7 = PACKSSDW( s0, s1 ); x7 = PSHUFHW( x7, SH_0123 ); x3 = _mm_load_si128( (__m128i*)(pSrc + 3*8) ); x3 = _mm_mullo_epi16(x3, *((__m128i*)(pQuantInvTable + 3*8)) ); xe = PSHUFLW( x3, SH_2020 ); xo = PSHUFLW( x3, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_35[0]) ); t2e = PMADDWD( xe, LDK(tab_i_35[8]) ); t1o = PMADDWD( xo, LDK(tab_i_35[16]) ); t2o = PMADDWD( xo, LDK(tab_i_35[24]) ); t1e = PADDD( t1e, LDK(round_i_3) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x3 = PACKSSDW( s0, s1 ); x3 = PSHUFHW( x3, SH_0123 ); x5 = _mm_load_si128( (__m128i*)(pSrc + 5*8) ); x5 = _mm_mullo_epi16(x5, *((__m128i*)(pQuantInvTable + 5*8)) ); xe = PSHUFLW( x5, SH_2020 ); xo = PSHUFLW( x5, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_35[0]) ); t2e = PMADDWD( xe, LDK(tab_i_35[8]) ); t1o = PMADDWD( xo, LDK(tab_i_35[16]) ); t2o = PMADDWD( xo, LDK(tab_i_35[24]) ); t1e = PADDD( t1e, LDK(round_i_5) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x5 = PACKSSDW( s0, s1 ); x5 = PSHUFHW( x5, SH_0123 ); x2 = _mm_load_si128( (__m128i*)(pSrc + 2*8) ); x2 = _mm_mullo_epi16(x2, *((__m128i*)(pQuantInvTable + 2*8)) ); xe = PSHUFLW( x2, SH_2020 ); xo = PSHUFLW( x2, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_26[0]) ); t2e = PMADDWD( xe, LDK(tab_i_26[8]) ); t1o = PMADDWD( xo, LDK(tab_i_26[16]) ); t2o = PMADDWD( xo, LDK(tab_i_26[24]) ); t1e = PADDD( t1e, LDK(round_i_2) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x2 = PACKSSDW( s0, s1 ); x2 = PSHUFHW( x2, SH_0123 ); x6 = _mm_load_si128( (__m128i*)(pSrc + 6*8) ); x6 = _mm_mullo_epi16(x6, *((__m128i*)(pQuantInvTable + 6*8)) ); xe = PSHUFLW( x6, SH_2020 ); xo = PSHUFLW( x6, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_26[0]) ); t2e = PMADDWD( xe, LDK(tab_i_26[8]) ); t1o = PMADDWD( xo, LDK(tab_i_26[16]) ); t2o = PMADDWD( xo, LDK(tab_i_26[24]) ); t1e = PADDD( t1e, LDK(round_i_6) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x6 = PACKSSDW( s0, s1 ); x6 = PSHUFHW( x6, SH_0123 ); /* ------------------------------------------------------------------------ */ /* columns */ /* ------------------------------------------------------------------------ */ t3 = PADDSW( PMULHW( x3, LDK(tg_3_16) ), x3 ); t5 = PADDSW( PMULHW( x5, LDK(tg_3_16) ), x5 ); tm765 = PADDSW( t5, x3 ); tm465 = PSUBSW( x5, t3 ); t1 = PMULHW( x1, LDK(tg_1_16) ); t7 = PMULHW( x7, LDK(tg_1_16) ); tp765 = PADDSW( x1, t7 ); tp465 = PSUBSW( t1, x7 ); t7 = PADDSW( tp765, tm765 ); tp65 = PSUBSW( tp765, tm765 ); t4 = PADDSW( tp465, tm465 ); tm65 = PSUBSW( tp465, tm465 ); t2 = PMULHW( x2, LDK(tg_2_16) ); t6 = PMULHW( x6, LDK(tg_2_16) ); tm03 = PADDSW( x2, t6 ); tm12 = PSUBSW( t2, x6 ); t5 = PSUBSW( tp65, tm65 ); t6 = PADDSW( tp65, tm65 ); t5 = PADDSW( PMULHW( t5, LDK(cos_4_16) ), t5 ); t6 = PADDSW( PMULHW( t6, LDK(cos_4_16) ), t6 ); tp03 = PADDSW( x0, x4 ); tp12 = PSUBSW( x0, x4 ); t0 = PADDSW( tp03, tm03 ); t3 = PSUBSW( tp03, tm03 ); t1 = PADDSW( tp12, tm12 ); t2 = PSUBSW( tp12, tm12 ); y0 = PADDSW( t0, t7 ); y7 = PSUBSW( t0, t7 ); y1 = PADDSW( t1, t6 ); y6 = PSUBSW( t1, t6 ); y2 = PADDSW( t2, t5 ); y5 = PSUBSW( t2, t5 ); y3 = PADDSW( t3, t4 ); y4 = PSUBSW( t3, t4 ); y0 = PSRAW( y0, SHIFT_INV_COL ); y1 = PSRAW( y1, SHIFT_INV_COL ); y2 = PSRAW( y2, SHIFT_INV_COL ); y3 = PSRAW( y3, SHIFT_INV_COL ); y4 = PSRAW( y4, SHIFT_INV_COL ); y5 = PSRAW( y5, SHIFT_INV_COL ); y6 = PSRAW( y6, SHIFT_INV_COL ); y7 = PSRAW( y7, SHIFT_INV_COL ); xmmTmp = _mm_set1_epi16( 128 ); //STX( pDst + 0*8, y0 ); //STX( pDst + 1*8, y1 ); y0 = PADDW( y0, xmmTmp ); y1 = PADDW( y1, xmmTmp ); y0 = PACKUSWB( y0, y1 ); STLH( (char*)pDst + 0*dstStep, (char*)pDst + 1*dstStep, y0 ); //STX( pDst + 2*8, y2 ); //STX( pDst + 3*8, y3 ); y2 = PADDW( y2, xmmTmp ); y3 = PADDW( y3, xmmTmp ); y2 = PACKUSWB( y2, y3 ); STLH( (char*)pDst + 2*dstStep, (char*)pDst + 3*dstStep, y2 ); //STX( pDst + 4*8, y4 ); //STX( pDst + 5*8, y5 ); y4 = PADDW( y4, xmmTmp ); y5 = PADDW( y5, xmmTmp ); y4 = PACKUSWB( y4, y5 ); STLH( (char*)pDst + 4*dstStep, (char*)pDst + 5*dstStep, y4 ); //STX( pDst + 6*8, y6 ); //STX( pDst + 7*8, y7 ); y6 = PADDW( y6, xmmTmp ); y7 = PADDW( y7, xmmTmp ); y6 = PACKUSWB( y6, y7 ); STLH( (char*)pDst + 6*dstStep, (char*)pDst + 7*dstStep, y6 ); } __INLINE void dct_8x8_inv_16s ( const Ipp16s* pSrc, Ipp8u* pDst, int dstStep, const Ipp16s* pQuantInvTable ) { __m128i x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, t0, t1, t2, t3, t4, t5, t6, t7, xe, xo, t1e, t2e, t1o, t2o, a0, b0, s0, s1, tp03, tm03, tp12, tm12, tp65, tm65, tp465, tm465, tp765, tm765; __m128i xmmTmp; /* ------------------------------------------------------------------------ */ /* rows */ /* ------------------------------------------------------------------------ */ xmmTmp = LDX( pQuantInvTable + 0*8 ); x0 = LDX( pSrc + 0*8 ); x0 = _mm_mullo_epi16(x0, xmmTmp); xe = PSHUFLW( x0, SH_2020 ); xo = PSHUFLW( x0, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_04[0]) ); t2e = PMADDWD( xe, LDK(tab_i_04[8]) ); t1o = PMADDWD( xo, LDK(tab_i_04[16]) ); t2o = PMADDWD( xo, LDK(tab_i_04[24]) ); t1e = PADDD( t1e, LDK(round_i_0) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x0 = PACKSSDW( s0, s1 ); x0 = PSHUFHW( x0, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 4*8 ); x4 = LDX( pSrc + 4*8 ); x4 = _mm_mullo_epi16(x4, xmmTmp); xe = PSHUFLW( x4, SH_2020 ); xo = PSHUFLW( x4, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_04[0]) ); t2e = PMADDWD( xe, LDK(tab_i_04[8]) ); t1o = PMADDWD( xo, LDK(tab_i_04[16]) ); t2o = PMADDWD( xo, LDK(tab_i_04[24]) ); t1e = PADDD( t1e, LDK(round_i_4) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x4 = PACKSSDW( s0, s1 ); x4 = PSHUFHW( x4, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 1*8 ); x1 = LDX( pSrc + 1*8 ); x1 = _mm_mullo_epi16(x1, xmmTmp); xe = PSHUFLW( x1, SH_2020 ); xo = PSHUFLW( x1, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_17[0]) ); t2e = PMADDWD( xe, LDK(tab_i_17[8]) ); t1o = PMADDWD( xo, LDK(tab_i_17[16]) ); t2o = PMADDWD( xo, LDK(tab_i_17[24]) ); t1e = PADDD( t1e, LDK(round_i_1) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x1 = PACKSSDW( s0, s1 ); x1 = PSHUFHW( x1, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 7*8 ); x7 = LDX( pSrc + 7*8 ); x7 = _mm_mullo_epi16(x7, xmmTmp); xe = PSHUFLW( x7, SH_2020 ); xo = PSHUFLW( x7, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_17[0]) ); t2e = PMADDWD( xe, LDK(tab_i_17[8]) ); t1o = PMADDWD( xo, LDK(tab_i_17[16]) ); t2o = PMADDWD( xo, LDK(tab_i_17[24]) ); t1e = PADDD( t1e, LDK(round_i_7) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x7 = PACKSSDW( s0, s1 ); x7 = PSHUFHW( x7, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 3*8 ); x3 = LDX( pSrc + 3*8 ); x3 = _mm_mullo_epi16(x3, xmmTmp); xe = PSHUFLW( x3, SH_2020 ); xo = PSHUFLW( x3, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_35[0]) ); t2e = PMADDWD( xe, LDK(tab_i_35[8]) ); t1o = PMADDWD( xo, LDK(tab_i_35[16]) ); t2o = PMADDWD( xo, LDK(tab_i_35[24]) ); t1e = PADDD( t1e, LDK(round_i_3) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x3 = PACKSSDW( s0, s1 ); x3 = PSHUFHW( x3, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 5*8 ); x5 = LDX( pSrc + 5*8 ); x5 = _mm_mullo_epi16(x5, xmmTmp); xe = PSHUFLW( x5, SH_2020 ); xo = PSHUFLW( x5, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_35[0]) ); t2e = PMADDWD( xe, LDK(tab_i_35[8]) ); t1o = PMADDWD( xo, LDK(tab_i_35[16]) ); t2o = PMADDWD( xo, LDK(tab_i_35[24]) ); t1e = PADDD( t1e, LDK(round_i_5) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x5 = PACKSSDW( s0, s1 ); x5 = PSHUFHW( x5, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 2*8 ); x2 = LDX( pSrc + 2*8 ); x2 = _mm_mullo_epi16(x2, xmmTmp); xe = PSHUFLW( x2, SH_2020 ); xo = PSHUFLW( x2, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_26[0]) ); t2e = PMADDWD( xe, LDK(tab_i_26[8]) ); t1o = PMADDWD( xo, LDK(tab_i_26[16]) ); t2o = PMADDWD( xo, LDK(tab_i_26[24]) ); t1e = PADDD( t1e, LDK(round_i_2) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x2 = PACKSSDW( s0, s1 ); x2 = PSHUFHW( x2, SH_0123 ); xmmTmp = LDX( pQuantInvTable + 6*8 ); x6 = LDX( pSrc + 6*8 ); x6 = _mm_mullo_epi16(x6, xmmTmp); xe = PSHUFLW( x6, SH_2020 ); xo = PSHUFLW( x6, SH_3131 ); xe = PSHUFHW( xe, SH_2020 ); xo = PSHUFHW( xo, SH_3131 ); t1e = PMADDWD( xe, LDK(tab_i_26[0]) ); t2e = PMADDWD( xe, LDK(tab_i_26[8]) ); t1o = PMADDWD( xo, LDK(tab_i_26[16]) ); t2o = PMADDWD( xo, LDK(tab_i_26[24]) ); t1e = PADDD( t1e, LDK(round_i_6) ); t2e = PSHUFD( t2e, SH_1032 ); t2o = PSHUFD( t2o, SH_1032 ); a0 = PADDD( t1e, t2e ); b0 = PADDD( t1o, t2o ); s0 = PADDD( a0, b0 ); s1 = PSUBD( a0, b0 ); s0 = PSRAD( s0, SHIFT_INV_ROW ); s1 = PSRAD( s1, SHIFT_INV_ROW ); x6 = PACKSSDW( s0, s1 ); x6 = PSHUFHW( x6, SH_0123 ); /* ------------------------------------------------------------------------ */ /* columns */ /* ------------------------------------------------------------------------ */ t3 = PADDSW( PMULHW( x3, LDK(tg_3_16) ), x3 ); t5 = PADDSW( PMULHW( x5, LDK(tg_3_16) ), x5 ); tm765 = PADDSW( t5, x3 ); tm465 = PSUBSW( x5, t3 ); t1 = PMULHW( x1, LDK(tg_1_16) ); t7 = PMULHW( x7, LDK(tg_1_16) ); tp765 = PADDSW( x1, t7 ); tp465 = PSUBSW( t1, x7 ); t7 = PADDSW( tp765, tm765 ); tp65 = PSUBSW( tp765, tm765 ); t4 = PADDSW( tp465, tm465 ); tm65 = PSUBSW( tp465, tm465 ); t2 = PMULHW( x2, LDK(tg_2_16) ); t6 = PMULHW( x6, LDK(tg_2_16) ); tm03 = PADDSW( x2, t6 ); tm12 = PSUBSW( t2, x6 ); t5 = PSUBSW( tp65, tm65 ); t6 = PADDSW( tp65, tm65 ); t5 = PADDSW( PMULHW( t5, LDK(cos_4_16) ), t5 ); t6 = PADDSW( PMULHW( t6, LDK(cos_4_16) ), t6 ); tp03 = PADDSW( x0, x4 ); tp12 = PSUBSW( x0, x4 ); t0 = PADDSW( tp03, tm03 ); t3 = PSUBSW( tp03, tm03 ); t1 = PADDSW( tp12, tm12 ); t2 = PSUBSW( tp12, tm12 ); y0 = PADDSW( t0, t7 ); y7 = PSUBSW( t0, t7 ); y1 = PADDSW( t1, t6 ); y6 = PSUBSW( t1, t6 ); y2 = PADDSW( t2, t5 ); y5 = PSUBSW( t2, t5 ); y3 = PADDSW( t3, t4 ); y4 = PSUBSW( t3, t4 ); y0 = PSRAW( y0, SHIFT_INV_COL ); y1 = PSRAW( y1, SHIFT_INV_COL ); y2 = PSRAW( y2, SHIFT_INV_COL ); y3 = PSRAW( y3, SHIFT_INV_COL ); y4 = PSRAW( y4, SHIFT_INV_COL ); y5 = PSRAW( y5, SHIFT_INV_COL ); y6 = PSRAW( y6, SHIFT_INV_COL ); y7 = PSRAW( y7, SHIFT_INV_COL ); xmmTmp = _mm_set1_epi16( 128 ); //STX( pDst + 0*8, y0 ); //STX( pDst + 1*8, y1 ); y0 = PADDW( y0, xmmTmp ); y1 = PADDW( y1, xmmTmp ); y0 = PACKUSWB( y0, y1 ); STLH( (char*)pDst + 0*dstStep, (char*)pDst + 1*dstStep, y0 ); //STX( pDst + 2*8, y2 ); //STX( pDst + 3*8, y3 ); y2 = PADDW( y2, xmmTmp ); y3 = PADDW( y3, xmmTmp ); y2 = PACKUSWB( y2, y3 ); STLH( (char*)pDst + 2*dstStep, (char*)pDst + 3*dstStep, y2 ); //STX( pDst + 4*8, y4 ); //STX( pDst + 5*8, y5 ); y4 = PADDW( y4, xmmTmp ); y5 = PADDW( y5, xmmTmp ); y4 = PACKUSWB( y4, y5 ); STLH( (char*)pDst + 4*dstStep, (char*)pDst + 5*dstStep, y4 ); //STX( pDst + 6*8, y6 ); //STX( pDst + 7*8, y7 ); y6 = PADDW( y6, xmmTmp ); y7 = PADDW( y7, xmmTmp ); y6 = PACKUSWB( y6, y7 ); STLH( (char*)pDst + 6*dstStep, (char*)pDst + 7*dstStep, y6 ); } #endif //((_IPP>=_IPP_V8)||(_IPP32E>=_IPP32E_U8)) #endif //!((_IPP>=_IPP_H9)||(_IPP32E>=_IPP32E_L9)) oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdechuff.c000066400000000000000000000443041443134507600244150ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Huffman entropy decoder // // Contents: // mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u, // mfxiDecodeHuffmanSpecInitAlloc_JPEG_8u, // mfxiDecodeHuffmanSpecFree_JPEG_8u, // mfxiDecodeHuffmanStateGetBufSize_JPEG_8u, // mfxiDecodeHuffmanStateInit_JPEG_8u, // mfxiDecodeHuffmanStateInitAlloc_JPEG_8u, // mfxiDecodeHuffmanStateFree_JPEG_8u, // mfxiDecodeHuffman8x8_JPEG_1u16s_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PSCOPY_H__ #include "pscopy.h" #endif #ifndef __PJZIGZAG_H__ #include "pjzigzag.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJDECHUFF_H__ #include "pjdechuff.h" #endif LOCFUN(IppStatus,mfxownpj_DecodeHuffmanSpecInit,( const Ipp8u* pBits, const Ipp8u* pVals, ownpjDecodeHuffmanSpec* pDecHuffTable)) { int l; int ctr; int lookbits; Ipp32u i; Ipp32u j; Ipp32u k; Ipp32u L; Ipp32u idx; Ipp32u size; Ipp32u code; Ipp32u huffcode[257]; Ipp32u huffsize[257]; mfxownsZero_8u((Ipp8u*)pDecHuffTable,sizeof(ownpjDecodeHuffmanSpec)); mfxownsZero_8u((Ipp8u*)&huffcode[0],sizeof(huffcode)); mfxownsZero_8u((Ipp8u*)&huffsize[0],sizeof(huffsize)); k = 0; for(i = 0; i < 16; i++) { j = (Ipp32u)pBits[i]; if((k + j) > 256) { /* protect against table overrun */ return ippStsJPEGHuffTableErr; } while(j--) { huffsize[k++] = (i + 1); } } huffsize[k] = 0; /* Fill huff_table */ code = 0; size = huffsize[0]; idx = 0; while(huffsize[idx]) { while(huffsize[idx] == size) { huffcode[idx] = code; code++; idx++; if(idx > 256) { return ippStsJPEGHuffTableErr; } } code <<= 1; size++; } mfxownsZero_8u((Ipp8u*)pDecHuffTable->valptr,sizeof(pDecHuffTable->valptr)); mfxownsZero_8u((Ipp8u*)pDecHuffTable->mincode,sizeof(pDecHuffTable->mincode)); mfxownsZero_8u((Ipp8u*)pDecHuffTable->maxcode,sizeof(pDecHuffTable->maxcode)); idx = 0; for(l = 1; l <= 16; l++) { k = (Ipp32u)pBits[l-1]; if(k) { /* huffval[] index of 1-st symbol of code length l */ pDecHuffTable->valptr[l] = (Ipp16u)idx; /* minimum code of length l */ pDecHuffTable->mincode[l] = (Ipp16u)huffcode[idx]; i = idx + k; while(idx < i) { if(idx >= 256) { /* protect against table overrun */ return ippStsJPEGHuffTableErr; } pDecHuffTable->huffval[idx] = pVals[idx]; idx++; } /* maximum code of length l */ pDecHuffTable->maxcode[l] = (Ipp16s)huffcode[idx-1]; } else { /* -1 if no codes of this length */ /* huff_table->maxcode[l] = 0xffff; */ /* OA: huff_table->maxcode[l] = 0x0000; */ pDecHuffTable->maxcode[l] = (Ipp16s) -1; } } /* OA: huff_table->maxcode[17] = 0xffff; */ pDecHuffTable->maxcode[17] = (Ipp16s) -1; mfxownsZero_8u((Ipp8u*)pDecHuffTable->huffelem,sizeof(pDecHuffTable->huffelem)); idx = 0; for(l = 1; l <= 8; l++) { L = (Ipp32u)pBits[l-1]; for(i = 1; i <= L; i++, idx++) { lookbits = huffcode[idx] << (8-l); for(ctr = 1 << (8-l); ctr > 0; ctr--) { pDecHuffTable->huffelem[lookbits] = (l<<16) | (pVals[idx]); lookbits++; if(lookbits > 256) { /* protect against table overrun */ return ippStsJPEGHuffTableErr; } } } } return ippStsNoErr; } /* mfxownpj_DecodeHuffmanSpecInit() */ LOCFUN(void,mfxownpj_DecodeHuffmanStateInit,( ownpjDecodeHuffmanState* pDecHuffState)) { pDecHuffState->uBitBuffer = 0; pDecHuffState->nBitsValid = 0; pDecHuffState->nEndOfBlockRun = 0; pDecHuffState->lastNonZeroNo = 0; return; } /* mfxownpj_DecodeHuffmanStateInit() */ #if !defined (_I7) /*F* //////////////////////////////////////////////////////////////////////////// // Name // mfxownpj_FillBitBuffer // // Purpose // // Context // // Returns // Valid error code, or 0 for OK. // // Parameters // pSrc // SrcLenBytes // pSrcCurrPos // pMarker // nbits // state Pointer to current IJL state structure. // //////////////////////////////////////////////////////////////////////////// *F*/ OWNFUN(IppStatus,mfxownpj_FillBitBuffer,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, int* pMarker, int nBits, ownpjDecodeHuffmanState* pDecHuffState)) { int byte; int marker; int currPos = *pSrcCurrPos; Ipp8u* maxPtr = (Ipp8u*)pSrc + nSrcLenBytes; Ipp8u* curPtr = (Ipp8u*)pSrc + currPos; IppStatus status = ippStsNoErr; if(*pMarker) { /* !dudnik: data is corrupted if there is no enough bits */ /* !dudnik: 18.05.2006 status changed to ippStsJPEGDCTRangeErr */ return ((pDecHuffState->nBitsValid >= nBits) ? (ippStsNoErr) : (ippStsJPEGDCTRangeErr)); } /* HUFF_MIN_GET_BITS = 25 */ while(pDecHuffState->nBitsValid < HUFF_MIN_GET_BITS) { if(curPtr >= maxPtr) { /* reach end of bitstream, need to update output variables */ *pSrcCurrPos = (int)(curPtr - pSrc); /* !dudnik: no enough bits in bit buffer */ if(pDecHuffState->nBitsValid < nBits) status = ippStsJPEGOutOfBufErr; return status; } byte = *curPtr; curPtr++; while(byte == 0xFF) { if(curPtr >= maxPtr) { /* !dudnik: buffer too small... update output variables */ *pSrcCurrPos = (int)(curPtr - pSrc); return ippStsJPEGOutOfBufErr; } marker = *curPtr; curPtr++; if(marker == 0) break; if(marker != 0xFF) { /* detect JPEG marker, stop reading bytes, update output variables */ /* !dudnik: 18.05.2006 removed status for marker detection */ pMarker[0] = marker; *pSrcCurrPos = (int)(curPtr - pSrc); return ippStsNoErr; } } pDecHuffState->uBitBuffer = ((Ipp32u)pDecHuffState->uBitBuffer << 8) | byte; pDecHuffState->nBitsValid += 8; } /* while */ *pSrcCurrPos = (int)(curPtr - pSrc); return ippStsNoErr; } /* mfxownpj_FillBitBuffer() */ #endif /*F* //////////////////////////////////////////////////////////////////////////// // Name // mfxownpj_DecodeHuffLongCodes // // Purpose // // Context // // Returns // Valid error code, or 0 for OK. // // Parameters // //////////////////////////////////////////////////////////////////////////// *F*/ LOCFUN(IppStatus,mfxownpj_DecodeHuffLongCodes,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, int* pMarker, int nMinBits, int* pResult, const ownpjDecodeHuffmanSpec* pDecHuffTable, ownpjDecodeHuffmanState* pDecHuffState)) { int max; int code; int index; IppStatus status; if(pDecHuffState->nBitsValid < nMinBits) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,nMinBits,pDecHuffState); if(ippStsNoErr > status) { return status; } } code = mfxownpj_get_bits(nMinBits,pDecHuffState); /* !dudnik: 18.05.2006 limit search for huffman code to 16 bits */ for( ; nMinBits <= 16; nMinBits++) { max = pDecHuffTable->maxcode[nMinBits]; if((max & 0x8000) && (max != -1)) { max = (unsigned short)pDecHuffTable->maxcode[nMinBits]; } if(code <= max) break; code <<= 1; if(pDecHuffState->nBitsValid < 1) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,1,pDecHuffState); if(ippStsNoErr > status) { return status; } } code |= mfxownpj_get_bits(1,pDecHuffState); } if(nMinBits > 16) { /* JPEG does not allow huffman codes with more then 16 bits length */ /* !dudnik: 18.05.2006 add signaling for corrupted data */ pResult[0] = 0; return ippStsJPEGDCTRangeErr; } index = pDecHuffTable->valptr[nMinBits] + ((int)(code - pDecHuffTable->mincode[nMinBits])); pResult[0] = pDecHuffTable->huffval[index]; return ippStsNoErr; } /* mfxownpj_DecodeHuffLongCodes() */ /*F* //////////////////////////////////////////////////////////////////////////// // Name // mfxownpj_DecodeHuffSymbol // // Purpose // // Context // // Returns // Valid error code, or 0 for OK. // // Parameters // //////////////////////////////////////////////////////////////////////////// *F*/ OWNFUN(IppStatus,mfxownpj_DecodeHuffSymbol,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, int* pMarker, int* pResult, const ownpjDecodeHuffmanSpec* pDecHuffTable, ownpjDecodeHuffmanState* pDecHuffState)) { int nBits; int look; IppStatus status; /* HUFF_LOOKAHEAD = 8 */ if(pDecHuffState->nBitsValid < HUFF_LOOKAHEAD) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,0,pDecHuffState); if(ippStsNoErr > status) { return status; } if(pDecHuffState->nBitsValid < HUFF_LOOKAHEAD) { nBits = 1; goto slowlabel; } } look = mfxownpj_peek_bits(HUFF_LOOKAHEAD,pDecHuffState); nBits = pDecHuffTable->huffelem[look] >> 16; if(nBits != 0) { pDecHuffState->nBitsValid -= nBits; pResult[0] = pDecHuffTable->huffelem[look] & 0xFFFF; } else { nBits = HUFF_LOOKAHEAD + 1; slowlabel: status = mfxownpj_DecodeHuffLongCodes( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,nBits,pResult,pDecHuffTable,pDecHuffState); if(ippStsNoErr > status) { return status; } } return ippStsNoErr; } /* mfxownpj_DecodeHuffSymbol() */ /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u // // Purpose: // get size of IppiDecodeHuffmanSpec struct // // Parameters: // pDecHuffSpecbufSize - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u, ( int* pDecHuffSpecBufSize)) { IPP_BAD_PTR1_RET(pDecHuffSpecBufSize); *pDecHuffSpecBufSize = sizeof(ownpjDecodeHuffmanSpec); return ippStsNoErr; } /* mfxiDecodeHuffmanSpecGetBufSize_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanSpecInit_JPEG_8u // // Purpose: // Build Huffman table for decoder // in fast-to-use format from raw Huffman table // // Parameters: // pDecHuffSpec - pointer to Huffman table to be initialized // pListBits - pointer to raw Huffman table bits // pListVals - pointer to raw Huffman table vals // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanSpecInit_JPEG_8u, ( const Ipp8u* pListBits, const Ipp8u* pListVals, IppiDecodeHuffmanSpec* pDecHuffSpec)) { ownpjDecodeHuffmanSpec* pDecHuffTbl; IPP_BAD_PTR2_RET(pListBits,pListVals); IPP_BAD_PTR1_RET(pDecHuffSpec); pDecHuffTbl = (ownpjDecodeHuffmanSpec*)pDecHuffSpec; return mfxownpj_DecodeHuffmanSpecInit(pListBits,pListVals,pDecHuffTbl); } /* mfxiDecodeHuffmanSpecInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanStateGetBufSize_JPEG_8u // // Purpose: // get size of IppiDecodeHuffmanState struct // // Parameters: // pDecHuffStateBufSize - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanStateGetBufSize_JPEG_8u, ( int* pDecHuffStateBufSize)) { IPP_BAD_PTR1_RET(pDecHuffStateBufSize); *pDecHuffStateBufSize = sizeof(ownpjDecodeHuffmanState); return ippStsNoErr; } /* mfxiDecodeHuffmanStateGetBufSize_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanStateInit_JPEG_8u // // Purpose: // Build IppiDecodeHuffmanState struct // // Parameters: // pDecHuffState - pointer to IppiDecodeHuffmanState struct // to be initialized // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanStateInit_JPEG_8u, ( IppiDecodeHuffmanState* pDecHuffState)) { ownpjDecodeHuffmanState* pState; IPP_BAD_PTR1_RET(pDecHuffState); pState = (ownpjDecodeHuffmanState*)pDecHuffState; mfxownpj_DecodeHuffmanStateInit(pState); return ippStsNoErr; } /* mfxiDecodeHuffmanStateInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_JPEG_1u16s_C1 // // Purpose: // Huffman decode 8x8 block of quantized DCT coefs // // Parameters: // pSrc pointer to input JPEG bitstream // nSrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current offset in buffer in bytes (in/out) // pDst pointer to quantized DCT coefficients // pLastDC pointer to last DC coefs // pMarker where to store JPEG marker // pDcTable pointer to huffman DC table // pAcTable pointer to huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffman8x8_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, const IppiDecodeHuffmanSpec* pDcTable, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) { int n, r, s; int diff; int zz; int* zz_index_ptr; ownpjDecodeHuffmanSpec* dc_table = (ownpjDecodeHuffmanSpec*)pDcTable; ownpjDecodeHuffmanSpec* ac_table = (ownpjDecodeHuffmanSpec*)pAcTable; ownpjDecodeHuffmanState* pState = (ownpjDecodeHuffmanState*)pDecHuffState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(nSrcLenBytes < 0); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pLastDC); IPP_BAD_PTR1_RET(pMarker); IPP_BAD_PTR1_RET(pDcTable); IPP_BAD_PTR1_RET(pAcTable); IPP_BAD_PTR1_RET(pDecHuffState); n = DCTSIZE2; #if ( defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 )) || ((_IPP_ARCH ==_IPP_ARCH_LRB) && (_IPPLRB == _IPPLRB_B1)) status = mfxownpj_DecodeHuffman8x8_JPEG_1u16s_C1( pSrc,nSrcLenBytes,pSrcCurrPos, pDst,pLastDC,pMarker,dc_table,ac_table,pState); if(ippStsNoErr == status) { return ippStsNoErr; } #endif /* Clear output buffer */ mfxownsZero_8u((Ipp8u*)pDst,DCTSIZE2*sizeof(Ipp16s)); /* decode DC coef */ status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,&s,dc_table,pState); if(ippStsNoErr > status) { goto Exit; } if(s) { s &= 0x0f; /* s should be in [0,15] */ if(pState->nBitsValid < s) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,s,pState); if(ippStsNoErr > status) { goto Exit; } } diff = mfxownpj_get_bits(s,pState); if(( diff & ( 1 << (s - 1) ) ) == 0) { diff += mfxown_pj_lowest_coef[s]; } *pLastDC = (Ipp16s)(*pLastDC + diff); } pDst[0] = *pLastDC; zz_index_ptr = (int*)&mfxown_pj_izigzag_index[1]; /* decode 63 AC coefs */ for(n = DCTSIZE2-1; n > 0; ) { /* !dudnik: decode category */ status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,&s,ac_table,pState); if(ippStsNoErr > status) { goto Exit; } r = (s >> 4) & 0x0f; s &= 0x0f; if(s) { n -= r + 1; zz_index_ptr += r; if(pState->nBitsValid < s) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,s,pState); if(ippStsNoErr > status) { goto Exit; } } r = mfxownpj_get_bits(s,pState); zz = *zz_index_ptr++; /* !dudnik: 031222 fixed zz overflow */ if(zz > 63 || zz < 0) return ippStsErr; if((r & (1 << (s - 1))) == 0) { pDst[zz] = (Ipp16s)(r + mfxown_pj_lowest_coef[s]); } else { pDst[zz] = (Ipp16s)r; } } else if(r == 15) { n -= 16; zz_index_ptr += 16; } else break; } /* decode 63 AC coefficient */ Exit: /* !dudnik: 18.05.2006, return index of last non-zero coefficient */ pState->lastNonZeroNo = DCTSIZE2 - n; return status; } /* mfxiDecodeHuffman8x8_JPEG_1u16s_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdechuff.h000066400000000000000000000153531443134507600244240ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __PJDECHUFF_H__ #define __PJDECHUFF_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif /* minimum allowable value */ #define HUFF_MIN_GET_BITS 25 #define HUFF_LOOKAHEAD 8 /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpjDecodeHuffmanSpec // // Purpose: // Decoder Huffman table in fast-to-use format // // Notes: // */ typedef struct _ownpjDecodeHuffmanSpec { Ipp16u huffval[256]; Ipp32u huffelem[256]; Ipp16u mincode[18]; Ipp16s maxcode[18]; Ipp16u valptr[18]; } ownpjDecodeHuffmanSpec; /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpjDecodeHuffmanState // // Purpose: // Huffman decoder state // // Fields: // // Notes: // */ typedef struct _ownpjDecodeHuffmanState { Ipp64u uBitBuffer; int nBitsValid; int nEndOfBlockRun; int lastNonZeroNo; } ownpjDecodeHuffmanState; #define MASK(nBits) \ ( (1 << (nBits)) - 1 ) #define mfxownpj_peek_bits(nBits,pState) \ ( ((int)((Ipp32u)(pState)->uBitBuffer >> \ ( (pState)->nBitsValid - (nBits) ))) & MASK(nBits) ) #define mfxownpj_get_bits(nBits,pState) \ ( ( (pState)->nBitsValid -= (nBits) ), \ ((int)((Ipp32u)(pState)->uBitBuffer >> \ ( (pState)->nBitsValid ))) & MASK(nBits) ) #if !defined (_I7) OWNAPI(IppStatus,mfxownpj_FillBitBuffer,( const Ipp8u* pSrc, int SrcLenBytes, int* pSrcCurrPos, int* pMarker, int nBits, ownpjDecodeHuffmanState* pState)); #endif OWNAPI(IppStatus,mfxownpj_DecodeHuffSymbol,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, int* pMarker, int* pResult, const ownpjDecodeHuffmanSpec* pDecHuffTable, ownpjDecodeHuffmanState* pDecHuffState)); #if (defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 )) || ((_IPP_ARCH ==_IPP_ARCH_LRB) && (_IPPLRB == _IPPLRB_B1)) ASMAPI(IppStatus,mfxownpj_DecodeHuffman8x8_JPEG_1u16s_C1,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, const ownpjDecodeHuffmanSpec* pDcTable, const ownpjDecodeHuffmanSpec* pAcTable, ownpjDecodeHuffmanState* pDecHuffState)); ASMAPI(IppStatus,mfxownpj_DecodeHuffman8x8_Direct_JPEG_1u16s_C1,( const Ipp8u* pSrc, int* pSrcBitsLen, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, Ipp32u* pPrefetchedBits, int* pNumValidPrefetchedBits, const ownpjDecodeHuffmanSpec* pDCTable, const ownpjDecodeHuffmanSpec* pACTable)); ASMAPI(IppStatus, mfxownpj_DecodeHuffman8x8_ACFirst_JPEG_1u16s_C1,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const ownpjDecodeHuffmanSpec* pAcTable, ownpjDecodeHuffmanState* pDecHuffState)); ASMAPI(IppStatus, mfxownpj_DecodeHuffman8x8_ACRefine_JPEG_1u16s_C1,( const Ipp8u* pSrc, int SrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const ownpjDecodeHuffmanSpec* pAcTable, ownpjDecodeHuffmanState* pDecHuffState)); #endif #if defined (_I7) ASMAPI(IppStatus,mfxownpj_FillBitBuffer,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, int* pMarker, int nBits, ownpjDecodeHuffmanState* pDecHuffState)); ASMAPI(IppStatus,mfxownpj_DecodeHuffmanOne_JPEG_1u16s_C1,( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, const ownpjDecodeHuffmanSpec* pDcTable, ownpjDecodeHuffmanState* pDecHuffState)); #endif #if ( _IPP >= _IPP_W7 ) ASMAPI(IppStatus,mfxownpj_DecodeHuffmanOne_JPEG_1u16s_C1,( const Ipp8u* pSrc, Ipp16s* pDst, int* pSrcCurrPos, const ownpjDecodeHuffmanSpec* pDcTable, ownpjDecodeHuffmanState* pDecHuffState)); #endif #if (_IPP >= _IPP_V8) || ( _IPP32E >= _IPP32E_U8 ) ASMAPI(IppStatus,mfxownpj_DecodeHuffmanRow_JPEG_1u16s_C1P4,( const Ipp8u* pSrc, int SrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst[4], int nDstLen, int nDstRows, int* pMarker, const ownpjDecodeHuffmanSpec* pTable[4], ownpjDecodeHuffmanState* pDecHuffState)); #endif #endif /* __PJDECHUFF_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdechuffls.c000066400000000000000000000163541443134507600247600ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // lossless Huffman entropy decoder // // Contents: // mfxiDecodeHuffmanOne_JPEG_1u16s_C1 // mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJDECHUFF_H__ #include "pjdechuff.h" #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanOne_JPEG_1u16s_C1 // // Purpose: // Huffman decode one lossless coefs // // Parameters: // pSrc pointer to input JPEG bitstream // nSrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current offset in buffer in bytes (in/out) // pDst pointer to decoded difference // pMarker where to store JPEG marker // pDcTable pointer to huffman DC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanOne_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, const IppiDecodeHuffmanSpec* pDcTable, IppiDecodeHuffmanState* pDecHuffState)) { int s; int diff = 0; ownpjDecodeHuffmanSpec* dc_table = (ownpjDecodeHuffmanSpec*)pDcTable; ownpjDecodeHuffmanState* pState = (ownpjDecodeHuffmanState*)pDecHuffState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pMarker); IPP_BAD_PTR1_RET(pDcTable); IPP_BAD_PTR1_RET(pDecHuffState); #if ( _IPP >= _IPP_W7 ) if( ((nSrcLenBytes - *pSrcCurrPos) >= 8) && !(*pMarker) ) { if( !mfxownpj_DecodeHuffmanOne_JPEG_1u16s_C1( pSrc, pDst, pSrcCurrPos, dc_table, pState ) ) { return ippStsNoErr; } } #endif #if defined (_I7) if( !mfxownpj_DecodeHuffmanOne_JPEG_1u16s_C1( pSrc, nSrcLenBytes, pSrcCurrPos, pDst, pMarker, dc_table, pState) ) { return ippStsNoErr; } #endif /* decode DC coef */ status = mfxownpj_DecodeHuffSymbol( pSrc, nSrcLenBytes, pSrcCurrPos, pMarker, &s, dc_table, pState); if(ippStsNoErr > status) { goto Exit; } if(s) { if(s < 16) { if(pState->nBitsValid < s) { status = mfxownpj_FillBitBuffer( pSrc, nSrcLenBytes, pSrcCurrPos, pMarker, s, pState); if(ippStsNoErr > status) { goto Exit; } } diff = mfxownpj_get_bits(s,pState); diff = mfxownpj_huff_extend(diff,s); } else diff = 32768; } pDst[0] = (Ipp16s)diff; Exit: return status; } /* mfxiDecodeHuffmanOne_JPEG_1u16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4 // // Purpose: // Huffman decode one lossless coefs // // Parameters: // pSrc pointer to input JPEG bitstream // nSrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current offset in buffer in bytes (in/out) // pDst pointer to decoded difference // pMarker where to store JPEG marker // pDcTable pointer to huffman DC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst[4], int nDstLen, int nDstRows, int* pMarker, const IppiDecodeHuffmanSpec* pDecHuffTable[4], IppiDecodeHuffmanState* pDecHuffState)) { int i, j; int symb; int diff = 0; Ipp16s* dst[4]; ownpjDecodeHuffmanSpec* pTable[4]; ownpjDecodeHuffmanState* pState = (ownpjDecodeHuffmanState*)pDecHuffState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLen); IPP_BAD_SIZE_RET(nDstRows); IPP_BAD_PTR1_RET(pMarker); IPP_BAD_PTR1_RET(pDecHuffTable); IPP_BAD_PTR1_RET(pDecHuffState); for(i = 0; i < IPP_MIN(nDstRows,4); i++) { IPP_BAD_PTR2_RET(pDst[i],pDecHuffTable[i]); pTable[i] = (ownpjDecodeHuffmanSpec*)pDecHuffTable[i]; dst[i] = pDst[i]; } #if (_IPP >= _IPP_V8) || ( _IPP32E >= _IPP32E_U8 ) status = mfxownpj_DecodeHuffmanRow_JPEG_1u16s_C1P4( pSrc, nSrcLenBytes, pSrcCurrPos, pDst, nDstLen, nDstRows, pMarker, (const ownpjDecodeHuffmanSpec**)pTable, pState); if(ippStsNoErr == status) { return ippStsNoErr; } #endif for(i = 0; i < nDstLen; i++) { for(j = 0; j < IPP_MIN(nDstRows,4); j++) { diff = 0; /* decode DC coef */ status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,&symb,pTable[j],pState); if(ippStsNoErr > status) { goto Exit; } if(symb) { if(symb < 16) { if(pState->nBitsValid < symb) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos, pMarker,symb,pState); if(ippStsNoErr > status) { goto Exit; } } diff = mfxownpj_get_bits(symb,pState); diff = mfxownpj_huff_extend(diff,symb); } else diff = 32768; } dst[j][i] = (Ipp16s)diff; } // for (nDstRows) } // for (nDstLen) Exit: return status; } /* mfxiDecodeHuffmanRow_JPEG_1u16s_C1P4() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdechuffp.c000066400000000000000000000401561443134507600245760ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Huffman entropy decoder (progressive) // // Contents: // mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1 // mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1 // mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1 // mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJZIGZAG_H__ #include "pjzigzag.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJDECHUFF_H__ #include "pjdechuff.h" #endif /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1 // // Purpose: // Huffman decode DC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // SrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output block of quantized DCT coefficients // pLastDC pointer to last DC coefficients from preivious block // of the same color component // pMarker where to store JPEG marker // Al Approximation bit position low // pDcTable pointer to huffman DC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, Ipp16s* pLastDC, int* pMarker, int Al, const IppiDecodeHuffmanSpec* pDcTable, IppiDecodeHuffmanState* pDecHuffState)) { int s; int diff; IppStatus status = ippStsNoErr; ownpjDecodeHuffmanSpec* dc_table; ownpjDecodeHuffmanState* pState; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pLastDC); IPP_BAD_PTR1_RET(pMarker); OWN_BADARG_RET(Al < 0 || Al > 13); IPP_BAD_PTR1_RET(pDcTable); IPP_BAD_PTR1_RET(pDecHuffState); dc_table = (ownpjDecodeHuffmanSpec*)pDcTable; pState = (ownpjDecodeHuffmanState*)pDecHuffState; status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,&s,dc_table,pState); if(ippStsNoErr > status) { goto Exit; } if(s) { s &= 0xf; /* Make sure s is in [0,15] */ if(pState->nBitsValid < s) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,s,pState); if(ippStsNoErr > status) { goto Exit; } } diff = mfxownpj_get_bits(s,pState); if((diff & (1 << (s-1))) == 0) { diff += mfxown_pj_lowest_coef[s]; } *pLastDC = (Ipp16s)(*pLastDC + diff); } pDst[0] = (Ipp16s)(*pLastDC << Al); Exit: return status; } /* mfxiDecodeHuffman8x8_DCFirst_JPEG_1u16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1 // // Purpose: // Refine DC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // SrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output block of quantized DCT coefficients // pMarker where to store JPEG marker // Al Approximation bit position low // pState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Al, IppiDecodeHuffmanState* pDecHuffState)) { int p; int diff; IppStatus status = ippStsNoErr; ownpjDecodeHuffmanState* pState; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pMarker); OWN_BADARG_RET(Al < 0 || Al > 13); IPP_BAD_PTR1_RET(pDecHuffState); pState = (ownpjDecodeHuffmanState*)pDecHuffState; p = 1 << Al; if(pState->nBitsValid < 1) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,1,pState); if(ippStsNoErr > status) { goto Exit; } } diff = mfxownpj_get_bits(1,pState); if(diff) { pDst[0] |= p; } Exit: return status; } /* mfxiDecodeHuffman8x8_DCRefine_JPEG_1u16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1 // // Purpose: // Huffman decode AC coefficient of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // SrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output block of quantized DCT coefficients // pMarker where to store JPEG marker // Ss spectral selection start // Se spectral selection end // Al Approximation bit position low // pAcTable pointer to huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) { #if !defined (_A6) && !( _IPP >= _IPP_W7 ) && !( _IPP32E >= _IPP32E_M7 ) int r; int s; int k; const int* index; IppStatus status = ippStsNoErr; ownpjDecodeHuffmanSpec* ac_table; ownpjDecodeHuffmanState* pState; #endif IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pMarker); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); IPP_BAD_PTR1_RET(pAcTable); IPP_BAD_PTR1_RET(pDecHuffState); #if defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) return mfxownpj_DecodeHuffman8x8_ACFirst_JPEG_1u16s_C1( pSrc, nSrcLenBytes, pSrcCurrPos, pDst, pMarker, Ss, Se, Al, (ownpjDecodeHuffmanSpec*)pAcTable, (ownpjDecodeHuffmanState*)pDecHuffState); #else ac_table = (ownpjDecodeHuffmanSpec*)pAcTable; pState = (ownpjDecodeHuffmanState*)pDecHuffState; index = &mfxown_pj_izigzag_index[0]; if(pState->nEndOfBlockRun > 0) { pState->nEndOfBlockRun--; } else { for(k = Ss; k <= Se; k++) { status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,&s,ac_table,pState); if(ippStsNoErr > status) { goto Exit; } r = s >> 4; s &= 15; if(s) { k += r; if(pState->nBitsValid < s) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,s,pState); if(ippStsNoErr > status) { goto Exit; } } r = mfxownpj_get_bits(s,pState); if((r & (1 << (s-1))) == 0) { pDst[index[k]] = (Ipp16s)((r + mfxown_pj_lowest_coef[s]) << Al); } else { pDst[index[k]] = (Ipp16s)(r << Al); } } else { if(r == 15) { k += 15; } else { pState->nEndOfBlockRun = 1 << r; if(r) { if(pState->nBitsValid < r) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,r,pState); if(ippStsNoErr > status) { goto Exit; } } r = mfxownpj_get_bits(r,pState); pState->nEndOfBlockRun += r; } pState->nEndOfBlockRun--; break; } } } // for(k...) } Exit: return status; #endif } /* mfxiDecodeHuffman8x8_ACFirst_JPEG_1u16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1 // // Purpose: // Refine AC coefficients of 8x8 block of quantized DCT coefficients // // Parameters: // pSrc pointer to input JPEG bitstream // SrcLenBytes bitstream length, in bytes // pSrcCurrPos pointer to current byte offset in buffer (in/out) // pDst pointer to output block of quantized DCT coefficients // pMarker where to store JPEG marker // Ss spectral selection start // Se spectral selection end // Al Approximation bit position low // pAcTable Huffman AC table // pDecHuffState pointer to Huffman state struct // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1, ( const Ipp8u* pSrc, int nSrcLenBytes, int* pSrcCurrPos, Ipp16s* pDst, int* pMarker, int Ss, int Se, int Al, const IppiDecodeHuffmanSpec* pAcTable, IppiDecodeHuffmanState* pDecHuffState)) { #if !defined (_A6) && !( _IPP >= _IPP_W7 ) && !( _IPP32E >= _IPP32E_M7 ) int r; int s; int k; int p1, m1; const int* index; Ipp16s* thiscoef; IppStatus status = ippStsNoErr; ownpjDecodeHuffmanSpec* ac_table; ownpjDecodeHuffmanState* pState; #endif IPP_BAD_PTR1_RET(pSrc); IPP_BAD_SIZE_RET(nSrcLenBytes); IPP_BAD_PTR1_RET(pSrcCurrPos); IPP_BAD_PTR1_RET(pDst); IPP_BAD_PTR1_RET(pMarker); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); IPP_BAD_PTR1_RET(pAcTable); IPP_BAD_PTR1_RET(pDecHuffState); #if defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) return mfxownpj_DecodeHuffman8x8_ACRefine_JPEG_1u16s_C1( pSrc, nSrcLenBytes, pSrcCurrPos, pDst, pMarker, Ss, Se, Al, (ownpjDecodeHuffmanSpec*)pAcTable, (ownpjDecodeHuffmanState*)pDecHuffState); #else ac_table = (ownpjDecodeHuffmanSpec*)pAcTable; pState = (ownpjDecodeHuffmanState*)pDecHuffState; p1 = 1 << Al; /* 1 in the bit position which being coded */ m1 = (-1) << Al; /* -1 in the bit position which being coded */ index = &mfxown_pj_izigzag_index[0]; /* always only one block per MCU */ /* coefficient loop counter is started from first coefficent in band */ k = Ss; if(pState->nEndOfBlockRun == 0) { for(; k <= Se; k++) { status = mfxownpj_DecodeHuffSymbol( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,&s,ac_table,pState); if(ippStsNoErr > status) { goto Exit; } r = s >> 4; s &= 15; if(s) { if(pState->nBitsValid < 1) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,1,pState); if(ippStsNoErr > status) { goto Exit; } } s = (mfxownpj_get_bits(1,pState)) ? p1 : m1; } else { if(r != 15) { /* EOBr, run length is 2^r + appended bits */ pState->nEndOfBlockRun = 1 << r; if(r) { if(pState->nBitsValid < r) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,r,pState); if(ippStsNoErr > status) { goto Exit; } } r = mfxownpj_get_bits(r,pState); pState->nEndOfBlockRun += r; } break; /* EOB logic is handled the rest of block */ } /* Note, s = 0 when processing ZRL */ } /* // Advance over already-nonzero coefficients // and r still-zero coefficients, appending correction bits // to the nonzeroes. A correction bit is 1 if the absolute value // of the coefficient must be increased. */ do { thiscoef = pDst + index[k]; if(thiscoef[0] != 0) { if(pState->nBitsValid < 1) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,1,pState); if(ippStsNoErr > status) { goto Exit; } } if(mfxownpj_get_bits(1,pState)) { if((thiscoef[0] & p1) == 0) { /* nothing to do if already changed it */ if(thiscoef[0] >= 0) { thiscoef[0] = (Ipp16s)(thiscoef[0] + p1); } else { thiscoef[0] = (Ipp16s)(thiscoef[0] + m1); } } } } else { if(--r < 0) { break; /* target zero coefficient */ } } k++; } while(k <= Se); if(s) { /* Output new nonzero coefficient */ pDst[index[k]] = (Ipp16s)s; } } } if(pState->nEndOfBlockRun > 0) { /* // Scanning for any remaining coefficient positions after the end-of-band // (the last newly nonzero coefficient, if any). Append a correction bit // to each already-nonzero coefficient. // A correction bit is 1 if the absolute value of the coefficient // must be increased. */ for(; k <= Se; k++) { thiscoef = pDst + index[k]; if(thiscoef[0] != 0) { if(pState->nBitsValid < 1) { status = mfxownpj_FillBitBuffer( pSrc,nSrcLenBytes,pSrcCurrPos,pMarker,1,pState); if(ippStsNoErr > status) { goto Exit; } } if(mfxownpj_get_bits(1,pState)) { if((thiscoef[0] & p1) == 0) { /* do nothing if already changed it */ if(thiscoef[0] >= 0) { thiscoef[0] = (Ipp16s)(thiscoef[0] + p1); } else { thiscoef[0] = (Ipp16s)(thiscoef[0] + m1); } } } } } /* Count one block completed in EOB run */ pState->nEndOfBlockRun--; } Exit: return status; #endif } /* mfxiDecodeHuffman8x8_ACRefine_JPEG_1u16s_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecpred.c000066400000000000000000000220271443134507600244150ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // reconstruct sample from differences // // Contents: // mfxiReconstructPredFirstRow_JPEG_16s_C1 // mfxiReconstructPredRow_JPEG_16s_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if defined (_I7) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) ASMAPI(void,mfxownpj_ReconstructPredFirstRow_JPEG_16s_C1,( const Ipp16s* pSrc, Ipp16s* pDst, int width, int P, int Pt)); ASMAPI(void,mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1,( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)); #else /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + pDst[i-1]); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED2_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED2_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 0; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + pPrevRow[i]); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED2_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED3_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED3_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + pPrevRow[i-1]); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED3_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED4_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED4_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + (pDst[i-1] + pPrevRow[i] - pPrevRow[i-1])); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED4_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED5_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED5_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + (pDst[i-1] + ((pPrevRow[i] - pPrevRow[i-1]) >> 1))); } return ippStsNoErr; } /* mfxownpjReconstructRow_PRED5_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED6_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED6_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + (pPrevRow[i] + ((pDst[i-1] - pPrevRow[i-1]) >> 1))); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED6_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxownpj_ReconstructRow_PRED7_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // Pt // // Returns: // IppStatus // // Notes: // */ LOCFUN(IppStatus, mfxownpj_ReconstructRow_PRED7_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width)) { int i; pDst[0] = (Ipp16s)(pSrc[0] + pPrevRow[0]); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + ((pDst[i-1] + pPrevRow[i]) >> 1)); } return ippStsNoErr; } /* mfxownpj_ReconstructRow_PRED7_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiReconstructPredFirstRow_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pDst // width // P // Pt // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiReconstructPredFirstRow_JPEG_16s_C1, ( const Ipp16s* pSrc, Ipp16s* pDst, int width, int P, int Pt)) { #if !defined (_I7) && !( _IPP >= _IPP_W7 ) && !( _IPP32E >= _IPP32E_M7 ) int i; #endif IPP_BAD_PTR2_RET(pSrc,pDst); IPP_BAD_SIZE_RET(width); OWN_BADARG_RET(P < 2 || P > 16); OWN_BADARG_RET(Pt < 0); #if defined (_I7) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) mfxownpj_ReconstructPredFirstRow_JPEG_16s_C1(pSrc, pDst, width, P, Pt); #else pDst[0] = (Ipp16s)(pSrc[0] + (1 << (P - Pt - 1))); for(i = 1; i < width; i++) { pDst[i] = (Ipp16s)(pSrc[i] + pDst[i-1]); } #endif return ippStsNoErr; } /* mfxiReconstructPredFirstRow_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiReconstructPredRow_JPEG_16s_C1 // // Purpose: // undifference row // // Parameters: // pSrc // pPrevRow // pDst // width // predictor // Pt // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiReconstructPredRow_JPEG_16s_C1, ( const Ipp16s* pSrc, const Ipp16s* pPrevRow, Ipp16s* pDst, int width, int predictor)) { IPP_BAD_PTR3_RET(pSrc,pPrevRow,pDst); IPP_BAD_SIZE_RET(width); switch(predictor) { case PRED1: mfxownpj_ReconstructRow_PRED1_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED2: mfxownpj_ReconstructRow_PRED2_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED3: mfxownpj_ReconstructRow_PRED3_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED4: mfxownpj_ReconstructRow_PRED4_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED5: mfxownpj_ReconstructRow_PRED5_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED6: mfxownpj_ReconstructRow_PRED6_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; case PRED7: mfxownpj_ReconstructRow_PRED7_JPEG_16s_C1(pSrc,pPrevRow,pDst,width); break; default: return ippStsBadArgErr; } return ippStsNoErr; } /* mfxiReconstructPredRow_JPEG_16s_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecqnt.c000066400000000000000000000070251443134507600242660ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Quantization functions (Inverse transform) // // Contents: // mfxiQuantInvTableInit_JPEG_16s // mfxiQuant8x8Inv_JPEG_16s_C1I // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJQUANT_H__ #include "pjquant.h" #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantInvTableInit_JPEG_8u16u // // Purpose: // Build Quantization table for decoder // in fast-to-use format from raw Quantization table // // Parameter: // pQuantInvTable - pointer to pointer on Quantization table // to be initialized // pQuantRawTable - pointer to raw Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiQuantInvTableInit_JPEG_8u16u, ( const Ipp8u* pQuantRawTable, Ipp16u* pQuantInvTable)) { IppiSize roi; IppStatus status; Ipp16u wb[DCTSIZE2]; IPP_BAD_PTR1_RET(pQuantInvTable); IPP_BAD_PTR1_RET(pQuantRawTable); roi.width = 8; roi.height = 8; status = mfxiConvert_8u16u_C1R(pQuantRawTable,8,&wb[0],8*2,roi); if(ippStsNoErr != status) { return status; } status = mfxiZigzagInv8x8_16s_C1((Ipp16s*)&wb[0],(Ipp16s*)pQuantInvTable); if(ippStsNoErr != status) { return status; } return ippStsNoErr; } /* mfxiQuantInvTableInit_JPEG_8u16u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantInv8x8_JPEG_16s_C1I // // Purpose: // dequantize 8x8 block of DCT coefs // // Parameters: // pSrcDst - pointer to 8x8 block of DCT coefficients // pQuantInvTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiQuantInv8x8_JPEG_16s_C1I, ( Ipp16s* pSrcDst, const Ipp16u* pQuantInvTable)) { #if (_IPP == _IPP_A6) || (_IPP64 >= _IPP64_I7) || (_IPPXSC >= _IPPXSC_S2) IPP_BAD_PTR2_RET(pSrcDst,pQuantInvTable); mfxownpj_QuantInv_8x8_16s(pSrcDst,pSrcDst,pQuantInvTable); return ippStsNoErr; #elif (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) IPP_BAD_PTR2_RET(pSrcDst,pQuantInvTable); if(IPP_UINT_PTR(pSrcDst) & 0x01 || IPP_UINT_PTR(pQuantInvTable) & 0x01) mfxsMul_16s_I((Ipp16s*)pQuantInvTable,pSrcDst,DCTSIZE2); else mfxownpj_QuantInv_8x8_16s_I(pSrcDst,pQuantInvTable); return ippStsNoErr; #else return mfxsMul_16s_I((Ipp16s*)pQuantInvTable,pSrcDst,DCTSIZE2); #endif } /* mfxiQuantInv8x8_JPEG_16s_C1I() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecss.h000066400000000000000000000024061443134507600241140ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Upsampling functions // */ #ifndef __PJDECSS_H__ #define __PJDECSS_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif #endif /* __PJDECSS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjdecss0.c000066400000000000000000000112631443134507600241700ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Upsampling functions // // Contents: // mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1 // mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJDECSS_H__ #include "pjdecss.h" #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1 // // Purpose: // sample up horizontally 1:2 and vertically 1:1 // // Parameters: // pSrc pointer to the source row // srcWidth width of source row // pDst pointer to sampled up output row // // Returns: // IppStatus // // Notes: // Triangle filter used there (3/4 * nearer pixel + 1/4 * further pixel) */ IPPFUN(IppStatus, mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1, ( const Ipp8u* pSrc, int srcWidth, Ipp8u* pDst)) { IPP_BAD_PTR2_RET(pSrc,pDst) IPP_BAD_SIZE_RET(srcWidth) #if IPPJ_DECSS_OPT || (_IPPXSC >= _IPPXSC_S2) ownpj_SampleUpRowH2V1_Triangle_JPEG_8u_C1(pSrc, srcWidth, pDst); #else { int i; int invalue; /* Special case for first column */ invalue = pSrc[0]; *pDst++ = (Ipp8u)invalue; *pDst++ = (Ipp8u)((invalue * 3 + pSrc[1] + 2) >> 2); for(i = 2; i < srcWidth; i++) { /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ invalue = pSrc[i - 1] * 3; *pDst++ = (Ipp8u)((invalue + pSrc[i - 2] + 1) >> 2); *pDst++ = (Ipp8u)((invalue + pSrc[i ] + 2) >> 2); } /* Special case for last column */ invalue = pSrc[srcWidth - 1]; *pDst++ = (Ipp8u)((invalue * 3 + pSrc[srcWidth - 2] + 1) >> 2); *pDst = (Ipp8u)invalue; } #endif return ippStsNoErr; } /* mfxiSampleUpRowH2V1_Triangle_JPEG_8u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1 // // Purpose: // sample up horizontally 1:2 and vertically 1:2 // // Parameters: // pSrc1 pointer to the source row // pSrc2 pointer to the next source row // srcWidth width of source rows // pDst pointer to sampled up output row // // Returns: // IppStatus // // Notes: // Triangle filter used there (3/4 * nearer pixel + 1/4 * further pixel), */ IPPFUN(IppStatus, mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1, ( const Ipp8u* pSrc1, const Ipp8u* pSrc2, int srcWidth, Ipp8u* pDst)) { IPP_BAD_PTR3_RET(pSrc1,pSrc2,pDst) IPP_BAD_SIZE_RET(srcWidth) #if IPPJ_DECSS_OPT// || (_IPPXSC >= _IPPXSC_S2) ownpj_SampleUpRowH2V2_Triangle_JPEG_8u_C1(pSrc1, pSrc2, srcWidth, pDst); #else { int i; int thiscolsum, lastcolsum, nextcolsum; /* Special case for first column */ thiscolsum = pSrc1[0] * 3 + pSrc2[0]; nextcolsum = pSrc1[1] * 3 + pSrc2[1]; *pDst++ = (Ipp8u)((thiscolsum * 4 + 8) >> 4); *pDst++ = (Ipp8u)((thiscolsum * 3 + nextcolsum + 7) >> 4); lastcolsum = thiscolsum; thiscolsum = nextcolsum; for(i = 2; i < srcWidth; i++) { /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ /* in each dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ nextcolsum = pSrc1[i] * 3 + pSrc2[i]; *pDst++ = (Ipp8u)((thiscolsum * 3 + lastcolsum + 8) >> 4); *pDst++ = (Ipp8u)((thiscolsum * 3 + nextcolsum + 7) >> 4); lastcolsum = thiscolsum; thiscolsum = nextcolsum; } /* for width */ /* Special case for last column */ *pDst++ = (Ipp8u)((thiscolsum * 3 + lastcolsum + 8) >> 4); *pDst = (Ipp8u)((thiscolsum * 4 + 7) >> 4); } #endif return ippStsNoErr; } /* mfxiSampleUpRowH2V2_Triangle_JPEG_8u_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccc.c000066400000000000000000000062301443134507600240600ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions functions, forward transform // // Contents: // mfxiRGBToY_JPEG_8u_C3C1R // */ #include "precomp.h" #ifdef _OPENMP #include #endif #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCCCTBL_H__ #include "pjenccctbl.h" #endif #ifndef __PJENCCC_H__ #include "pjenccc.h" #endif #if (_IPPXSC < _IPPXSC_S2) #if !((IPPJ_ENCCC_OPT) || (_IPPLRB>=_IPPLRB_B1)) LOCFUN(void, mfxownpj_RGBToY_JPEG_8u_C3C1R, ( const Ipp8u* rgb, Ipp8u* y, int width)) { int i; for(i = 0; i < width; i++) { y[0] = (Ipp8u)((mfxcc_table[rgb[0] + R_Y_OFFS] + mfxcc_table[rgb[1] + G_Y_OFFS] + mfxcc_table[rgb[2] + B_Y_OFFS] + 3) >> 16); rgb += 3; y += 1; } return; } /* mfxownpj_RGBToY_JPEG_8u_C3C1R() */ #endif #endif /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToY_JPEG_8u_C3C1R // // Purpose: // RGB to Y color convert // // Parameter: // pSrc pointer to input data // SrcStep line offset in input data // pDst pointer to output array // DstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // the color conversion equations: // Y = 0.29900*R + 0.58700*G + 0.11400*B */ IPPFUN(IppStatus, mfxiRGBToY_JPEG_8u_C3C1R, ( const Ipp8u* pSrc, int SrcStep, Ipp8u* pDst, int DstStep, IppiSize roiSize)) { int i; IPP_BAD_ENC_CC_C3C1_RET() #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,pDst,SrcStep,DstStep,roiSize) \ private(i) default(none) \ if((roiSize.height*roiSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < roiSize.height; i++) { const Ipp8u* rgb; Ipp8u* y; rgb = pSrc + i * SrcStep; y = pDst + i * DstStep; mfxownpj_RGBToY_JPEG_8u_C3C1R(rgb, y, roiSize.width); } return ippStsNoErr; } /* mfxiRGBToY_JPEG_8u_C3C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccc.h000066400000000000000000000046651443134507600240770ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions // (Forward transform) // // Contents: // */ #ifndef __PJENCCC_H__ #define __PJENCCC_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif /* ---------------------- check input parameters --------------------------- */ #define IPP_BAD_ENC_CC_C3C1_RET() \ IPP_BAD_PTR1_RET(pSrc) \ IPP_BAD_PTR1_RET(pDst) \ IPP_BAD_STEP_RET(SrcStep) \ IPP_BAD_STEP_RET(DstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_BAD_ENC_CC_P3P3_RET() \ IPP_BAD_PTR2_RET(pSrc, pDst) \ IPP_BAD_PTR3_RET(pSrc[0], pSrc[1], pSrc[2]) \ IPP_BAD_PTR3_RET(pDst[0], pDst[1], pDst[2]) \ IPP_BAD_STEP_RET(SrcStep) \ IPP_BAD_STEP_RET(DstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_BAD_ENC_CC_C3P3_RET() \ IPP_BAD_PTR2_RET(pSrc, pDst) \ IPP_BAD_PTR3_RET(pDst[0], pDst[1], pDst[2]) \ IPP_BAD_STEP_RET(SrcStep) \ IPP_BAD_STEP_RET(DstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #define IPP_BAD_ENC_CC_C4P4_RET() \ IPP_BAD_PTR2_RET(pSrc, pDst) \ IPP_BAD_PTR4_RET(pDst[0], pDst[1], pDst[2], pDst[3]) \ IPP_BAD_STEP_RET(SrcStep) \ IPP_BAD_STEP_RET(DstStep) \ IPP_BAD_SIZE_RET(roiSize.width) \ IPP_BAD_SIZE_RET(roiSize.height) #endif /* __PJENCCC_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccc0.c000066400000000000000000000206371443134507600241470ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions functions, forward transform // // Contents: // mfxiRGBToYCbCr_JPEG_8u_P3R // mfxiRGBToYCbCr_JPEG_8u_C3P3R // mfxiBGRToYCbCr_JPEG_8u_C3P3R // */ #include "precomp.h" #ifdef _OPENMP #include #endif #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCCCTBL_H__ #include "pjenccctbl.h" #endif #ifndef __PJENCCC_H__ #include "pjenccc.h" #endif #if (_IPPXSC < _IPPXSC_S2) LOCFUN(void, mfxownpj_RGBToYCbCr_JPEG_8u_P3R, ( const Ipp8u* r, const Ipp8u* g, const Ipp8u* b, Ipp8u* y, Ipp8u* cb, Ipp8u* cr, int width)) { int i; int w4; int rv; int gv; int bv; w4 = 0; for(i = w4; i < width; i++) { rv = r[i]; gv = g[i]; bv = b[i]; y[i] = (Ipp8u)((mfxcc_table[rv + R_Y_OFFS] + mfxcc_table[gv + G_Y_OFFS] + mfxcc_table[bv + B_Y_OFFS] + 3) >> 16); cb[i] = (Ipp8u)((mfxcc_table[rv + R_CB_OFF] + mfxcc_table[gv + G_CB_OFF] + mfxcc_table[bv + B_CB_OFF] + 3) >> 16); cr[i] = (Ipp8u)((mfxcc_table[rv + R_CR_OFF] + mfxcc_table[gv + G_CR_OFF] + mfxcc_table[bv + B_CR_OFF] + 3) >> 16); } return; } /* mfxownpj_RGBToYCbCr_JPEG_8u_P3R() */ #if !((IPPJ_ENCCC_OPT) || (_IPPLRB>=_IPPLRB_B1)) LOCFUN(void, mfxownpj_RGBToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* rgb, Ipp8u* y, Ipp8u* cb, Ipp8u* cr, int width)) { int i; int r, g, b; for(i = 0; i < width; i++) { r = rgb[0]; g = rgb[1]; b = rgb[2]; rgb += 3; y[i] = (Ipp8u)((mfxcc_table[r + R_Y_OFFS] + mfxcc_table[g + G_Y_OFFS] + mfxcc_table[b + B_Y_OFFS] + 3) >> 16); cb[i] = (Ipp8u)((mfxcc_table[r + R_CB_OFF] + mfxcc_table[g + G_CB_OFF] + mfxcc_table[b + B_CB_OFF] + 3) >> 16); cr[i] = (Ipp8u)((mfxcc_table[r + R_CR_OFF] + mfxcc_table[g + G_CR_OFF] + mfxcc_table[b + B_CR_OFF] + 3) >> 16); } return; } /* mfxownpj_RGBToYCbCr_JPEG_8u_C3P3R() */ LOCFUN(void, mfxownpj_BGRToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* bgr, Ipp8u* y, Ipp8u* cb, Ipp8u* cr, int width)) { int i; int r, g, b; for(i = 0; i < width; i++) { r = bgr[2]; g = bgr[1]; b = bgr[0]; bgr += 3; y[i] = (Ipp8u)((mfxcc_table[r + R_Y_OFFS] + mfxcc_table[g + G_Y_OFFS] + mfxcc_table[b + B_Y_OFFS] + 3) >> 16); cb[i] = (Ipp8u)((mfxcc_table[r + R_CB_OFF] + mfxcc_table[g + G_CB_OFF] + mfxcc_table[b + B_CB_OFF] + 3) >> 16); cr[i] = (Ipp8u)((mfxcc_table[r + R_CR_OFF] + mfxcc_table[g + G_CR_OFF] + mfxcc_table[b + B_CR_OFF] + 3) >> 16); } return; } /* mfxownpj_BGRToYCbCr_JPEG_8u_C3P3R() */ #endif #endif /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToYCbCr_JPEG_8u_P3R // // Purpose: // RGB to YCbCr color convert // // Parameter: // pSrc pointer to pointers to input data // SrcStep line offset in input data // pDst pointer to pointers to output data // DstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // the color conversion equations: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128.0 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128.0 */ IPPFUN(IppStatus, mfxiRGBToYCbCr_JPEG_8u_P3R, ( const Ipp8u* pSrc[3], int SrcStep, Ipp8u* pDst[3], int DstStep, IppiSize roiSize)) { int i; IPP_BAD_ENC_CC_P3P3_RET() #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,pDst,SrcStep,DstStep,roiSize) \ private(i) default(none) \ if((roiSize.height*roiSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < roiSize.height; i++) { const Ipp8u* r; const Ipp8u* g; const Ipp8u* b; Ipp8u* y; Ipp8u* cb; Ipp8u* cr; r = pSrc[0] + i * SrcStep; g = pSrc[1] + i * SrcStep; b = pSrc[2] + i * SrcStep; y = pDst[0] + i * DstStep; cb = pDst[1] + i * DstStep; cr = pDst[2] + i * DstStep; mfxownpj_RGBToYCbCr_JPEG_8u_P3R(r, g, b, y, cb, cr, roiSize.width); } return ippStsNoErr; } /* mfxiRGBToYCbCr_JPEG_8u_P3R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiRGBToYCbCr_JPEG_8u_C3P3R // // Purpose: // RGB to YCbCr color convert // // Parameter: // pSrc pointer to input data // SrcStep line offset in input data // pDst pointer to pointers to output data // DstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // the color conversion equations: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128.0 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128.0 */ IPPFUN(IppStatus, mfxiRGBToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* pSrc, int SrcStep, Ipp8u* pDst[3], int DstStep, IppiSize roiSize)) { int i; IPP_BAD_ENC_CC_C3P3_RET() #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,pDst,SrcStep,DstStep,roiSize) \ private(i) default(none) \ if((roiSize.height*roiSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < roiSize.height; i++) { const Ipp8u* rgb; Ipp8u* y; Ipp8u* cb; Ipp8u* cr; rgb = pSrc + i * SrcStep; y = pDst[0] + i * DstStep; cb = pDst[1] + i * DstStep; cr = pDst[2] + i * DstStep; mfxownpj_RGBToYCbCr_JPEG_8u_C3P3R(rgb, y, cb, cr, roiSize.width); } return ippStsNoErr; } /* mfxiRGBToYCbCr_JPEG_8u_C3P3R() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiBGRToYCbCr_JPEG_8u_C3P3R // // Purpose: // BGR to YCbCr color convert // // Parameter: // pSrc pointer to input data // SrcStep line offset in input data // pDst pointer to pointers to output data // DstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // the color conversion equations: // Y = 0.29900*R + 0.58700*G + 0.11400*B // Cb = -0.16874*R - 0.33126*G + 0.50000*B + 128.0 // Cr = 0.50000*R - 0.41869*G - 0.08131*B + 128.0 */ IPPFUN(IppStatus, mfxiBGRToYCbCr_JPEG_8u_C3P3R, ( const Ipp8u* pSrc, int SrcStep, Ipp8u* pDst[3], int DstStep, IppiSize roiSize)) { int i; IPP_BAD_ENC_CC_C3P3_RET() #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,pDst,SrcStep,DstStep,roiSize) \ private(i) default(none) \ if((roiSize.height*roiSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < roiSize.height; i++) { const Ipp8u* bgr; Ipp8u* y; Ipp8u* cb; Ipp8u* cr; bgr = pSrc + i * SrcStep; y = pDst[0] + i * DstStep; cb = pDst[1] + i * DstStep; cr = pDst[2] + i * DstStep; mfxownpj_BGRToYCbCr_JPEG_8u_C3P3R(bgr, y, cb, cr, roiSize.width); } return ippStsNoErr; } /* mfxiBGRToYCbCr_JPEG_8u_C3P3R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccc1.c000066400000000000000000000100351443134507600241370ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions functions, forward transform // // Contents: // mfxiCMYKToYCCK_JPEG_8u_C4P4R // */ #include "precomp.h" #ifdef _OPENMP #include #endif #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCCCTBL_H__ #include "pjenccctbl.h" #endif #ifndef __PJENCCC_H__ #include "pjenccc.h" #endif #if _IPPLRB >= _IPPLRB_B1 extern void mfxownpj_CMYKToYCCK_JPEG_8u_C4P4R(const Ipp8u* rgba, Ipp8u* y, Ipp8u* cb, Ipp8u* cr, Ipp8u* a, int width); #else LOCFUN(void, mfxownpj_CMYKToYCCK_JPEG_8u_C4P4R, ( const Ipp8u* rgba, Ipp8u* y, Ipp8u* cb, Ipp8u* cr, Ipp8u* a, int width)) { int i; int rs, gs, bs; for(i = 0; i < width; i++) { rs = 255 - rgba[0]; gs = 255 - rgba[1]; bs = 255 - rgba[2]; y[i] = (Ipp8u)((mfxcc_table[rs + R_Y_OFFS] + mfxcc_table[gs + G_Y_OFFS] + mfxcc_table[bs + B_Y_OFFS] + 3) >> 16); cb[i] = (Ipp8u)((mfxcc_table[rs + R_CB_OFF] + mfxcc_table[gs + G_CB_OFF] + mfxcc_table[bs + B_CB_OFF] + 3) >> 16); cr[i] = (Ipp8u)((mfxcc_table[rs + R_CR_OFF] + mfxcc_table[gs + G_CR_OFF] + mfxcc_table[bs + B_CR_OFF] + 3) >> 16); a[i] = (Ipp8u)rgba[3]; rgba += 4; } return; } /* mfxownpj_CMYKToYCCK_JPEG_8u_C4P4R() */ #endif /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiCMYKToYCCK_JPEG_8u_C4P4R // // Purpose: // CMYK to YCCK color conversation // // Parameter: // pSrc pointer to input data // SrcStep line offset in input data // pDst pointer to pointers to output data // DstStep line offset in output data // roiSize ROI size // // Returns: // IppStatus // // Notes: // the color conversion equations: // Y = 255 - ( 0.29900*R + 0.58700*G + 0.11400*B) // Cb = 255 - (-0.16874*R - 0.33126*G + 0.50000*B + 128.0) // Cr = 255 - ( 0.50000*R - 0.41869*G - 0.08131*B + 128.0) // A = K */ IPPFUN(IppStatus, mfxiCMYKToYCCK_JPEG_8u_C4P4R, ( const Ipp8u* pSrc, int SrcStep, Ipp8u* pDst[4], int DstStep, IppiSize roiSize)) { int i; IPP_BAD_ENC_CC_C4P4_RET() #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,pDst,SrcStep,DstStep,roiSize) \ private(i) default(none) \ if((roiSize.height*roiSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < roiSize.height; i++) { const Ipp8u* rgba; Ipp8u* y; Ipp8u* cb; Ipp8u* cr; Ipp8u* a; rgba = pSrc + i * SrcStep; y = pDst[0] + i * DstStep; cb = pDst[1] + i * DstStep; cr = pDst[2] + i * DstStep; a = pDst[3] + i * DstStep; mfxownpj_CMYKToYCCK_JPEG_8u_C4P4R(rgba, y, cb, cr, a, roiSize.width); } return ippStsNoErr; } /* mfxiCMYKToYCCK_JPEG_8u_C4P4R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencccps.c000066400000000000000000000110001443134507600244120ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions functions, back/forward transform // // Contents: // mfxiYCbCrToBGR_JPEG_8u_P3C4R // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #define CLIP(x) ((x < 0) ? 0 : ((x > 255) ? 255 : x)) #if ( _IPP >= _IPP_V8 )||( _IPP32E >= _IPP32E_U8 ) extern void mfxownRGBToYCbCr_JPEG_8u_C4P3R( const Ipp8u* pBGR, int bgrStep, Ipp8u* pYCC[3], int yccStep, IppiSize roiSize); extern void mfxownYCbCrToBGR_JPEG_8u_P3C4R( const Ipp8u* pYCC[3],int yccStep,Ipp8u* pBGR,int bgrStep,IppiSize roiSize, Ipp8u aval,int orger); #endif #define kRCr 0x000166e8 #define kGCr 0x0000b6d1 #define kGCb 0x00005819 #define kBCb 0x0001c5a0 #define kR 0x00b37408 #define kG 0x00877530 #define kB 0x00e2d002 /* ---------------------- library functions definitions -------------------- */ IPPFUN(IppStatus, mfxiRGBToYCbCr_JPEG_8u_C4P3R,( const Ipp8u* pBGR, int bgrStep, Ipp8u* pYCC[3], int yccStep, IppiSize roiSize)) { IPP_BAD_PTR2_RET( pBGR, pYCC ); IPP_BAD_PTR3_RET( pYCC[0], pYCC[1], pYCC[2]); IPP_BADARG_RET((roiSize.width < 2 || roiSize.height < 1), ippStsSizeErr); IPP_BADARG_RET(( bgrStep == 0 || yccStep == 0), ippStsStepErr); #if ( _IPP >= _IPP_V8 )||( _IPP32E >= _IPP32E_U8 ) mfxownRGBToYCbCr_JPEG_8u_C4P3R( pBGR, bgrStep, pYCC, yccStep, roiSize); #else { int h,w; int width = roiSize.width; Ipp8u* pDstU = pYCC[1]; Ipp8u* pDstV = pYCC[2]; int height = roiSize.height; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pBGR + h * bgrStep; dsty = pYCC[0]+ h * yccStep; dstu = pDstU + h * yccStep; dstv = pDstV + h * yccStep; for( w = 0; w < width; w ++ ) { int g,r,b; b = src[2];g = src[1];r = src[0]; src += 4; *dsty++ = ( Ipp8u )(( iRY * r + iGY * g + iBY * b + 0x0008000) >> 16 ); *dstu++ = ( Ipp8u )((-iRu * r - iGu * g + iBu * b + 0x0804000) >> 16 ); /* Cb */ *dstv++ = ( Ipp8u )(( iBu * r - iGv * g - iBv * b + 0x0804000) >> 16 ); /* Cr */ } } } #endif return ippStsNoErr; } IPPFUN(IppStatus,mfxiYCbCrToBGR_JPEG_8u_P3C4R,( const Ipp8u* pYCC[3],int yccStep,Ipp8u* pBGR,int bgrStep,IppiSize roiSize, Ipp8u aval)) { IPP_BAD_PTR2_RET( pBGR, pYCC ); IPP_BAD_PTR3_RET( pYCC[0], pYCC[1], pYCC[2]); IPP_BADARG_RET((roiSize.width < 2 || roiSize.height < 1), ippStsSizeErr); IPP_BADARG_RET(( yccStep == 0 || bgrStep == 0 ), ippStsStepErr); #if ( _IPP >= _IPP_V8 )||( _IPP32E >= _IPP32E_U8 ) mfxownYCbCrToBGR_JPEG_8u_P3C4R( pYCC, yccStep, pBGR, bgrStep, roiSize, aval, 1 ); #else { int h, w; int width = roiSize.width; for(h = 0; h < roiSize.height; h++ ) { const Ipp8u* srcy = pYCC[0] + h * yccStep; const Ipp8u* srcu = pYCC[1] + h * yccStep; const Ipp8u* srcv = pYCC[2] + h * yccStep; Ipp8u* dst = pBGR + h * bgrStep; for(w = 0; w < width; w++) { int Y0,Cb, Cr; Y0 = (int)(srcy[0])<<16; Cb = srcu[0];Cr = srcv[0]; dst[2] = ( Ipp8u )CLIP(((Y0 + kRCr * Cr - kR + 0x00008000)>>16)); dst[1] = ( Ipp8u )CLIP(((Y0 - kGCb * Cb - kGCr * Cr + kG + 0x00008000 ) >> 16 )); dst[0] = ( Ipp8u )CLIP(((Y0 + kBCb * Cb - kB + 0x00008000 )>>16)); dst[3] = aval; dst+=4;srcy++;srcu++;srcv++; } } } #endif return ippStsNoErr; } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencccpsy8.c000066400000000000000000000675341443134507600247220ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose : IPPI Color Space Conversion // *M*/ #include "precomp.h" #include // __m128 etc #include // _mm_shuffle_epi8 #include "ownj.h" #if ( _IPP >= _IPP_V8 ) || ( _IPP32E >= _IPP32E_U8 ) /* Ipp32s iRY = (Ipp32s)(0.299f * 65536.f/4. + 0.5f); Ipp32s iGY = (Ipp32s)(0.587f * 65536.f/4. + 0.5f); Ipp32s iBY = (Ipp32s)(0.114f * 65536.f/4. + 0.5f); Ipp32s iRu = (Ipp32s)(0.16874f * 65536.f/4. + 0.5f); Ipp32s iGu = (Ipp32s)(0.33126f * 65536.f/4. + 0.5f); Ipp32s iBu = (Ipp32s)(0.5f * 65536.f/4. + 0.5f); Ipp32s iGv = (Ipp32s)(0.41869f * 65536.f/4. + 0.5f); Ipp32s iBv = (Ipp32s)(0.08131f * 65536.f/4. + 0.5f); */ #define iRY 0x00001323 #define iGY 0x00002591 #define iBY 0x0000074c #define iRu 0x00000acd #define iGu 0x00001533 #define iBu 0x00002000 #define iGv 0x00001acc #define iBv 0x00000534 /* Lib = V8 U8 Caller = mfxiRGBToYCbCr_JPEG_8u_C4P3R */ extern void mfxownRGBToYCbCr_JPEG_8u_C4P3R( const Ipp8u* pBGR, int bgrStep, Ipp8u* pYCC[3], int yccStep, IppiSize roiSize) { int h,w,ttt=0; int width = roiSize.width; int width8 = roiSize.width & 0x08; int width16= roiSize.width & ~0x0f; Ipp8u* pDstU = pYCC[1]; Ipp8u* pDstV = pYCC[2]; int height = roiSize.height; __m128i eZero = _mm_setzero_si128(); __m128i kYr = _mm_set1_epi16( iRY ); __m128i kYg = _mm_set1_epi16( iGY ); __m128i kYb = _mm_set1_epi16( iBY ); __m128i k16 = _mm_set1_epi32(0x00200020); __m128i k128 = _mm_set1_epi32(0x01010101<<4); __m128i kRu = _mm_set1_epi16( iRu ); __m128i kGu = _mm_set1_epi16( iGu ); __m128i kBu = _mm_set1_epi16( iBu ); __m128i kGv = _mm_set1_epi16( iGv ); __m128i kBv = _mm_set1_epi16( iBv ); const __m128i sHf = _mm_set_epi32( 0x0f0b0703,0x0e0a0602,0x0d090501,0x0c080400 ); if(!( ((intptr_t)pBGR&0x0f)||((intptr_t)pYCC[0]&0x0f)||((intptr_t)pYCC[1]&0x0f)||((intptr_t)pYCC[2]&0x0f)||(bgrStep&0x0f)||(yccStep&0x0f) ) ) ttt=1; for( h = 0; h < height; h ++ ) { const Ipp8u* src; Ipp8u* dsty,*dstu,*dstv; src = pBGR + h * bgrStep; dsty = pYCC[0]+ h * yccStep; dstu = pDstU + h * yccStep; dstv = pDstV + h * yccStep; if(ttt) { for(w = 0; w < width16; w += 16 ) { __m128i t0, t1, t2, t3, eR, eB, eG, eY, eY1, eY0, eU, eV; __m128i eR1, eB1, eG1; __m128i mB, mG, mR; t0 = _mm_load_si128(((__m128i*) src )); /* |A|b3|g3|r3|A|b2|g2|r2|A|b1|g1|r1|A|b0|g0|r0| */ t1 = _mm_load_si128(((__m128i*)(src + 16))); /* |A|r7|g7|b7|A|b6|g6|r6|A|b5|g5|r5|A|b4|g4|r4| */ t2 = _mm_load_si128(((__m128i*)(src + 32))); /* |A|rb|gb|bb|A|ba|ga|ra|A|b9|g9|r9|A|b8|g8|r8| */ t3 = _mm_load_si128(((__m128i*)(src + 48))); t0 = _mm_shuffle_epi8( t0, sHf ); /* |B|G|R(3-0)| */ t1 = _mm_shuffle_epi8( t1, sHf ); /* |B|G|R(7-4)| */ t2 = _mm_shuffle_epi8( t2, sHf ); /* |B|G|R(a-8)| */ t3 = _mm_shuffle_epi8( t3, sHf ); /* |B|G|R(f-b)| */ src += 64; eV = mR = _mm_unpacklo_epi32( t0, t1); /* |G|G|R(7-4)|R(3-0)| */ mG = _mm_unpacklo_epi32( t2, t3); /* |G|G|R(f-b)|R(a-8)| */ mR = _mm_unpacklo_epi64( mR, mG); /* |R(f-b)|R(a-8)|R(7-4)|R(3-0)| */ mG = _mm_unpackhi_epi64( eV, mG); /* |G(f-b)|G(a-8)|G(7-4)|G(3-0)| */ mB = _mm_unpackhi_epi32( t0, t1); /* |A|A|B(7-4)|B(3-0)| */ t2 = _mm_unpackhi_epi32( t2, t3); /* |A|A|B(f-b)|B(a-8)| */ mB = _mm_unpacklo_epi64( mB, t2); /* |R(f-b)|R(a-8)|R(7-4)|R(3-0)| */ eR = _mm_unpacklo_epi8( eZero, mR ); eG = _mm_unpacklo_epi8( eZero, mG ); eB = _mm_unpacklo_epi8( eZero, mB ); /* calculation */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eR, kYr), _mm_mulhi_epu16( eG, kYg)); eY = _mm_adds_epu16( eY, _mm_mulhi_epu16( eB, kYb)); eY0= _mm_srli_epi16(_mm_adds_epu16( eY, k16 ),6); eR1 = _mm_unpackhi_epi8( eZero, mR ); eG1 = _mm_unpackhi_epi8( eZero, mG ); eB1 = _mm_unpackhi_epi8( eZero, mB ); /* calculation */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eR1,kYr), _mm_mulhi_epu16( eG1,kYg)); eY = _mm_adds_epu16( eY, _mm_mulhi_epu16( eB1,kYb)); eY1= _mm_srli_epi16(_mm_adds_epu16( eY, k16 ), 6); eY0 = _mm_packus_epi16( eY0, eY1 ); _mm_store_si128((__m128i*)dsty, eY0 ); eR = _mm_srli_epi16( eR, 1 ); eG = _mm_srli_epi16( eG, 1 ); eB = _mm_srli_epi16( eB, 1 ); eR1= _mm_srli_epi16( eR1, 1 ); eG1= _mm_srli_epi16( eG1, 1 ); eB1= _mm_srli_epi16( eB1, 1 ); dsty += 16; /* Cb */ eY = _mm_add_epi16( _mm_mulhi_epu16( eR, kRu), _mm_mulhi_epu16( eG,kGu)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eB, kBu), eY); eU = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); eY = _mm_add_epi16( _mm_mulhi_epu16( eR1, kRu), _mm_mulhi_epu16( eG1,kGu)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eB1, kBu), eY); eY0 = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); _mm_store_si128((__m128i*)dstu,_mm_packus_epi16( eU, eY0 )); dstu += 16; /* Cr */ eY = _mm_add_epi16( _mm_mulhi_epu16( eG, kGv), _mm_mulhi_epu16( eB, kBv)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eR,kBu), eY); eV = _mm_srli_epi16(_mm_add_epi16( eY, k128), 5 ); eY = _mm_add_epi16( _mm_mulhi_epu16( eG1,kGv), _mm_mulhi_epu16( eB1, kBv)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eR1,kBu), eY); eY0 = _mm_srli_epi16(_mm_add_epi16( eY, k128), 5 ); _mm_store_si128((__m128i*)dstv,_mm_packus_epi16( eV, eY0 )); dstv += 16; } } else { for(w = 0; w < width16; w += 16 ) { __m128i t0, t1, t2, t3, eR, eB, eG, eY, eY1, eY0, eU, eV; __m128i eR1, eB1, eG1; __m128i mB, mG, mR; t0 = _mm_loadu_si128(((__m128i*) src )); /* |A|b3|g3|r3|A|b2|g2|r2|A|b1|g1|r1|A|b0|g0|r0| */ t1 = _mm_loadu_si128(((__m128i*)(src + 16))); /* |A|r7|g7|b7|A|b6|g6|r6|A|b5|g5|r5|A|b4|g4|r4| */ t2 = _mm_loadu_si128(((__m128i*)(src + 32))); /* |A|rb|gb|bb|A|ba|ga|ra|A|b9|g9|r9|A|b8|g8|r8| */ t3 = _mm_loadu_si128(((__m128i*)(src + 48))); t0 = _mm_shuffle_epi8( t0, sHf ); /* |B|G|R(3-0)| */ t1 = _mm_shuffle_epi8( t1, sHf ); /* |B|G|R(7-4)| */ t2 = _mm_shuffle_epi8( t2, sHf ); /* |B|G|R(a-8)| */ t3 = _mm_shuffle_epi8( t3, sHf ); /* |B|G|R(f-b)| */ src += 64; eV = mR = _mm_unpacklo_epi32( t0, t1); /* |G|G|R(7-4)|R(3-0)| */ mG = _mm_unpacklo_epi32( t2, t3); /* |G|G|R(f-b)|R(a-8)| */ mR = _mm_unpacklo_epi64( mR, mG); /* |R(f-b)|R(a-8)|R(7-4)|R(3-0)| */ mG = _mm_unpackhi_epi64( eV, mG); /* |G(f-b)|G(a-8)|G(7-4)|G(3-0)| */ mB = _mm_unpackhi_epi32( t0, t1); /* |A|A|B(7-4)|B(3-0)| */ t2 = _mm_unpackhi_epi32( t2, t3); /* |A|A|B(f-b)|B(a-8)| */ mB = _mm_unpacklo_epi64( mB, t2); /* |R(f-b)|R(a-8)|R(7-4)|R(3-0)| */ eR = _mm_unpacklo_epi8( eZero, mR ); eG = _mm_unpacklo_epi8( eZero, mG ); eB = _mm_unpacklo_epi8( eZero, mB ); /* calculation */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eR, kYr), _mm_mulhi_epu16( eG, kYg)); eY = _mm_adds_epu16( eY, _mm_mulhi_epu16( eB, kYb)); eY0= _mm_srli_epi16(_mm_adds_epu16( eY, k16 ),6); eR1 = _mm_unpackhi_epi8( eZero, mR ); eG1 = _mm_unpackhi_epi8( eZero, mG ); eB1 = _mm_unpackhi_epi8( eZero, mB ); /* calculation */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eR1,kYr), _mm_mulhi_epu16( eG1,kYg)); eY = _mm_adds_epu16( eY, _mm_mulhi_epu16( eB1,kYb)); eY1= _mm_srli_epi16(_mm_adds_epu16( eY, k16 ), 6); eY0 = _mm_packus_epi16( eY0, eY1 ); _mm_storeu_si128((__m128i*)dsty, eY0 ); eR = _mm_srli_epi16( eR, 1 ); eG = _mm_srli_epi16( eG, 1 ); eB = _mm_srli_epi16( eB, 1 ); eR1= _mm_srli_epi16( eR1, 1 ); eG1= _mm_srli_epi16( eG1, 1 ); eB1= _mm_srli_epi16( eB1, 1 ); dsty += 16; /* Cb */ eY = _mm_add_epi16( _mm_mulhi_epu16( eR, kRu), _mm_mulhi_epu16( eG,kGu)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eB, kBu), eY); eU = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); eY = _mm_add_epi16( _mm_mulhi_epu16( eR1, kRu), _mm_mulhi_epu16( eG1,kGu)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eB1, kBu), eY); eY0 = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); _mm_storeu_si128((__m128i*)dstu,_mm_packus_epi16( eU, eY0 )); dstu += 16; /* Cr */ eY = _mm_add_epi16( _mm_mulhi_epu16( eG, kGv), _mm_mulhi_epu16( eB, kBv)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eR,kBu), eY); eV = _mm_srli_epi16(_mm_add_epi16( eY, k128), 5 ); eY = _mm_add_epi16( _mm_mulhi_epu16( eG1,kGv), _mm_mulhi_epu16( eB1, kBv)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eR1,kBu), eY); eY0 = _mm_srli_epi16(_mm_add_epi16( eY, k128), 5 ); _mm_storeu_si128((__m128i*)dstv,_mm_packus_epi16( eV, eY0 )); dstv += 16; } } if(width8) { __m128i t0, t1, eR, eB, eG, eY, eY0, eU, eV; __m128i mB, mG, mR; w+=8; t0 = _mm_unpacklo_epi64(_mm_loadl_epi64(((__m128i*) src )),_mm_loadl_epi64(((__m128i*)(src + 8)))); t1 = _mm_unpacklo_epi64(_mm_loadl_epi64(((__m128i*)(src + 16))),_mm_loadl_epi64(((__m128i*)(src +24)))); src += 32; t0 = _mm_shuffle_epi8( t0, sHf ); /* |B|G|R(3-0)| */ t1 = _mm_shuffle_epi8( t1, sHf ); /* |B|G|R(7-4)| */ mR = _mm_unpacklo_epi32( t0, t1); /* |G|G|R(7-4)|R(3-0)| */ mG = _mm_unpackhi_epi64( mR, mR); /* |G(f-b)|G(a-8)|G(7-4)|G(3-0)| */ mB = _mm_unpackhi_epi32( t0, t1); /* |A|A|B(7-4)|B(3-0)| */ eR = _mm_unpacklo_epi8( eZero, mR ); eG = _mm_unpacklo_epi8( eZero, mG ); eB = _mm_unpacklo_epi8( eZero, mB ); /* calculation */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eR,kYr), _mm_mulhi_epu16( eG,kYg)); eY = _mm_adds_epu16( eY, _mm_mulhi_epu16( eB,kYb)); eY0= _mm_srli_epi16(_mm_adds_epu16( eY, k16 ),6); eY0 = _mm_packus_epi16( eY0, eY0 ); _mm_storel_epi64((__m128i*)dsty, eY0 ); dsty += 8; eR = _mm_srli_epi16( eR, 1 ); eG = _mm_srli_epi16( eG, 1 ); eB = _mm_srli_epi16( eB, 1 ); /* Cb */ eY = _mm_add_epi16( _mm_mulhi_epu16( eR, kRu), _mm_mulhi_epu16( eG,kGu)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eB, kBu), eY); eU = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); /* Cr */ eY = _mm_adds_epu16( _mm_mulhi_epu16( eG,kGv), _mm_mulhi_epu16( eB,kBv)); eY = _mm_sub_epi16( _mm_mulhi_epu16( eR,kBu), eY); eV = _mm_srli_epi16(_mm_adds_epi16( eY, k128), 5 ); _mm_storel_epi64((__m128i*)dstu, _mm_packus_epi16( eU, eU ) ); _mm_storel_epi64((__m128i*)dstv, _mm_packus_epi16( eV, eV ) ); dstu += 8; dstv += 8; } for( ; w < width; w ++ ) { int g,r,b; b = src[2];g = src[1];r = src[0]; src += 4; *dsty++ = ( Ipp8u )(( iRY * r + iGY * g + iBY * b + 0x002000) >> 14 ); *dstu++ = ( Ipp8u )((-iRu * r - iGu * g + iBu * b + 0x201000) >> 14 ); /* Cb */ *dstv++ = ( Ipp8u )(( iBu * r - iGv * g - iBv * b + 0x201000) >> 14 ); /* Cr */ } } } /* YCrCrToRGB */ #define kRCr 0x00002cdd #define kGCr 0x000016da #define kGCb 0x00000b03 #define kBCb 0x000038b4 #define kR 0x00000b37 #define kG 0x00000877 #define kB 0x00000e2d /* Lib = V8 U8 Caller = mfxiYCbCrToBGR_JPEG_8u_P3C4R */ extern void mfxownYCbCrToBGR_JPEG_8u_P3C4R( const Ipp8u* pYCC[3],int yccStep,Ipp8u* pBGR,int bgrStep,IppiSize roiSize, Ipp8u aval,int orger) { int h,ttt=0; int width = roiSize.width; int width16 = width & ~0x0f;int width8 = width & 0x08; int last = width & 0x07; const __m128i iRCr = _mm_set1_epi16( kRCr ); const __m128i iGCr = _mm_set1_epi16( kGCr ); const __m128i iGCb = _mm_set1_epi16( kGCb ); const __m128i iBCb = _mm_set1_epi16( kBCb ); const __m128i iR = _mm_set1_epi16( kR ); const __m128i iG = _mm_set1_epi16( kG ); const __m128i iB = _mm_set1_epi16( kB ); __m128i kOKR = _mm_set1_epi32( 0x00080008); __m128i eZero = _mm_setzero_si128(); __m128i eAval = _mm_set1_epi8( aval); __m128i sHf = _mm_set_epi32( 0x0f0b0703,0x0e0a0602,0x0d090501,0x0c080400 ); //RGB if(orger) sHf = _mm_set_epi32( 0x0f03070b,0x0e02060a,0x0d010509,0x0c000408 ); //BGR if(!( ((intptr_t)pBGR&0x0f)||((intptr_t)pYCC[0]&0x0f)||((intptr_t)pYCC[1]&0x0f)||((intptr_t)pYCC[2]&0x0f)||(bgrStep&0x0f)||(yccStep&0x0f) ) ) ttt=1; for(h = 0; h < roiSize.height; h++ ) { int w=0; const Ipp8u* srcy = pYCC[0] + h * yccStep; const Ipp8u* srcu = pYCC[1] + h * yccStep; const Ipp8u* srcv = pYCC[2] + h * yccStep; Ipp8u* dst = pBGR + h * bgrStep; if(ttt) { for(w = 0; w < width16; w += 16 ) { __m128i t0, t1, t2; __m128i eR0, eR1, eB0, eB1, eG0, eG1; __m128i eY0, eY1; __m128i tU, tV; __m128i eU, eV; t0 = _mm_load_si128((__m128i*)srcy); /* |y15 - y0| */ srcy += 16; tU = _mm_load_si128((__m128i*)srcu); /* |u15 - u0| */ srcu += 16; tV = _mm_load_si128((__m128i*)srcv); /* |v15 - v0| */ srcv += 16; eY0 = _mm_slli_epi16( _mm_unpacklo_epi8( t0, eZero),4); /* | y7 - y0| */ eY1 = _mm_slli_epi16( _mm_unpackhi_epi8( t0, eZero),4); /* |y15 - y8| */ eU = _mm_slli_epi16((_mm_unpacklo_epi8( tU, eZero)),7); /* | u7 - u0| */ eV = _mm_slli_epi16((_mm_unpacklo_epi8( tV, eZero)),7); /* | v7 - v0| */ eR0 = _mm_mulhi_epi16( eV, iRCr ); eR0 = _mm_adds_epi16 ( eR0, eY0 ); eR0 = _mm_subs_epi16 ( eR0, iR ); eR0 = _mm_adds_epi16 ( eR0, kOKR ); eR0 = _mm_srai_epi16 ( eR0, 4 ); tV = _mm_slli_epi16((_mm_unpackhi_epi8( tV, eZero)),7); /* | v7 - v0| */ eR1 = _mm_mulhi_epi16( tV, iRCr ); eR1 = _mm_adds_epi16 ( eR1, eY1 ); eR1 = _mm_subs_epi16 ( eR1, iR ); eR1 = _mm_adds_epi16 ( eR1, kOKR ); eR1 = _mm_srai_epi16 ( eR1, 4 ); eR0 = _mm_packus_epi16(eR0, eR1 ); tU = _mm_slli_epi16((_mm_unpackhi_epi8( tU, eZero)),7); /* | v7 - v0| */ eB0 = _mm_mulhi_epi16( eU, iBCb ); eB0 = _mm_adds_epi16 ( eB0, eY0 ); eB0 = _mm_subs_epi16 ( eB0, iB ); eB0 = _mm_adds_epi16 ( eB0, kOKR ); eB0 = _mm_srai_epi16 ( eB0, 4 ); eB1 = _mm_mulhi_epi16( tU, iBCb ); eB1 = _mm_adds_epi16 ( eB1, eY1 ); eB1 = _mm_subs_epi16 ( eB1, iB ); eB1 = _mm_adds_epi16 ( eB1, kOKR ); eB1 = _mm_srai_epi16 ( eB1, 4 ); eB0 = _mm_packus_epi16(eB0, eB1 ); eG0 = _mm_mulhi_epi16( eU, iGCb ); eG0 = _mm_adds_epi16 ( eG0, _mm_mulhi_epi16( eV, iGCr ) ); eY0 = _mm_adds_epi16 ( eY0, iG ); eY0 = _mm_subs_epi16 ( eY0, eG0 ); eY0 = _mm_adds_epi16 ( eY0, kOKR ); eY0 = _mm_srai_epi16 ( eY0, 4 ); eG1 = _mm_mulhi_epi16( tU, iGCb ); eG1 = _mm_adds_epi16 ( eG1, _mm_mulhi_epi16( tV, iGCr ) ); eY1 = _mm_adds_epi16 ( eY1, iG ); eY1 = _mm_subs_epi16 ( eY1, eG1 ); eY1 = _mm_adds_epi16 ( eY1, kOKR ); eY1 = _mm_srai_epi16 ( eY1, 4 ); eY0 = _mm_packus_epi16(eY0, eY1 ); t0 = _mm_unpacklo_epi32( eR0, eY0 ); //|.G1|.R1|.G0|.R0| t1 = _mm_unpacklo_epi32( eB0, eAval); //|.A |.B1|.A |.B0| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_store_si128( (__m128i*)dst, t2); t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_store_si128( (__m128i*)( dst+16 ), t2); t0 = _mm_unpackhi_epi32( eR0, eY0 ); //|.G3|.R3|.G2|.R2| t1 = _mm_unpackhi_epi32( eB0, eAval); //|.A |.B3|.A |.B2| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_store_si128( (__m128i*)( dst+32 ), t2); t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_store_si128( (__m128i*)( dst+48 ), t2); dst += 64; } } else { for(w = 0; w < width16; w += 16 ) { __m128i t0, t1, t2; __m128i eR0, eR1, eB0, eB1, eG0, eG1; __m128i eY0, eY1; __m128i tU, tV; __m128i eU, eV; t0 = _mm_loadu_si128((__m128i*)srcy); /* |y15 - y0| */ srcy += 16; tU = _mm_loadu_si128((__m128i*)srcu); /* |u15 - u0| */ srcu += 16; tV = _mm_loadu_si128((__m128i*)srcv); /* |v15 - v0| */ srcv += 16; eY0 = _mm_slli_epi16( _mm_unpacklo_epi8( t0, eZero),4); /* | y7 - y0| */ eY1 = _mm_slli_epi16( _mm_unpackhi_epi8( t0, eZero),4); /* |y15 - y8| */ eU = _mm_slli_epi16((_mm_unpacklo_epi8( tU, eZero)),7); /* | u7 - u0| */ eV = _mm_slli_epi16((_mm_unpacklo_epi8( tV, eZero)),7); /* | v7 - v0| */ eR0 = _mm_mulhi_epi16( eV, iRCr ); eR0 = _mm_adds_epi16 ( eR0, eY0 ); eR0 = _mm_subs_epi16 ( eR0, iR ); eR0 = _mm_adds_epi16 ( eR0, kOKR ); eR0 = _mm_srai_epi16 ( eR0, 4 ); tV = _mm_slli_epi16((_mm_unpackhi_epi8( tV, eZero)),7); /* | v7 - v0| */ eR1 = _mm_mulhi_epi16( tV, iRCr ); eR1 = _mm_adds_epi16 ( eR1, eY1 ); eR1 = _mm_subs_epi16 ( eR1, iR ); eR1 = _mm_adds_epi16 ( eR1, kOKR ); eR1 = _mm_srai_epi16 ( eR1, 4 ); eR0 = _mm_packus_epi16(eR0, eR1 ); tU = _mm_slli_epi16((_mm_unpackhi_epi8( tU, eZero)),7); /* | v7 - v0| */ eB0 = _mm_mulhi_epi16( eU, iBCb ); eB0 = _mm_adds_epi16 ( eB0, eY0 ); eB0 = _mm_subs_epi16 ( eB0, iB ); eB0 = _mm_adds_epi16 ( eB0, kOKR ); eB0 = _mm_srai_epi16 ( eB0, 4 ); eB1 = _mm_mulhi_epi16( tU, iBCb ); eB1 = _mm_adds_epi16 ( eB1, eY1 ); eB1 = _mm_subs_epi16 ( eB1, iB ); eB1 = _mm_adds_epi16 ( eB1, kOKR ); eB1 = _mm_srai_epi16 ( eB1, 4 ); eB0 = _mm_packus_epi16(eB0, eB1 ); eG0 = _mm_mulhi_epi16( eU, iGCb ); eG0 = _mm_adds_epi16 ( eG0, _mm_mulhi_epi16( eV, iGCr ) ); eY0 = _mm_adds_epi16 ( eY0, iG ); eY0 = _mm_subs_epi16 ( eY0, eG0 ); eY0 = _mm_adds_epi16 ( eY0, kOKR ); eY0 = _mm_srai_epi16 ( eY0, 4 ); eG1 = _mm_mulhi_epi16( tU, iGCb ); eG1 = _mm_adds_epi16 ( eG1, _mm_mulhi_epi16( tV, iGCr ) ); eY1 = _mm_adds_epi16 ( eY1, iG ); eY1 = _mm_subs_epi16 ( eY1, eG1 ); eY1 = _mm_adds_epi16 ( eY1, kOKR ); eY1 = _mm_srai_epi16 ( eY1, 4 ); eY0 = _mm_packus_epi16(eY0, eY1 ); t0 = _mm_unpacklo_epi32( eR0, eY0 ); //|.G1|.R1|.G0|.R0| t1 = _mm_unpacklo_epi32( eB0, eAval); //|.A |.B1|.A |.B0| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)dst, t2); t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)( dst+16 ), t2); t0 = _mm_unpackhi_epi32( eR0, eY0 ); //|.G3|.R3|.G2|.R2| t1 = _mm_unpackhi_epi32( eB0, eAval); //|.A |.B3|.A |.B2| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)( dst+32 ), t2); t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)( dst+48 ), t2); dst += 64; } } if( width8 ) { __m128i t0, t1, t2; __m128i eR0, eB0, eG0; __m128i eY0; __m128i tU, tV; __m128i eU, eV; t0 = _mm_loadl_epi64((__m128i*)srcy); /* |y15 - y0| */ srcy += 8; tU = _mm_loadl_epi64((__m128i*)srcu); /* |u15 - u0| */ srcu += 8; tV = _mm_loadl_epi64((__m128i*)srcv); /* |v15 - v0| */ srcv += 8; eY0 = _mm_slli_epi16( _mm_unpacklo_epi8( t0, eZero),4); /* | y7 - y0| */ eU = _mm_slli_epi16((_mm_unpacklo_epi8( tU, eZero)),7); /* | u7 - u0| */ eV = _mm_slli_epi16((_mm_unpacklo_epi8( tV, eZero)),7); /* | v7 - v0| */ eR0 = _mm_mulhi_epi16( eV, iRCr ); eR0 = _mm_adds_epi16 ( eR0, eY0 ); eR0 = _mm_subs_epi16 ( eR0, iR ); eR0 = _mm_adds_epi16 ( eR0, kOKR ); eR0 = _mm_srai_epi16 ( eR0, 4 ); eR0 = _mm_packus_epi16(eR0, eR0 ); eB0 = _mm_mulhi_epi16( eU, iBCb ); eB0 = _mm_adds_epi16 ( eB0, eY0 ); eB0 = _mm_subs_epi16 ( eB0, iB ); eB0 = _mm_adds_epi16 ( eB0, kOKR ); eB0 = _mm_srai_epi16 ( eB0, 4 ); eB0 = _mm_packus_epi16(eB0, eB0 ); eG0 = _mm_mulhi_epi16( eU, iGCb ); eG0 = _mm_adds_epi16 ( eG0, _mm_mulhi_epi16( eV, iGCr ) ); eY0 = _mm_adds_epi16 ( eY0, iG ); eY0 = _mm_subs_epi16 ( eY0, eG0 ); eY0 = _mm_adds_epi16 ( eY0, kOKR ); eY0 = _mm_srai_epi16 ( eY0, 4 ); eY0 = _mm_packus_epi16(eY0, eY0 ); t0 = _mm_unpacklo_epi32( eR0, eY0 ); //|.G1|.R1|.G0|.R0| t1 = _mm_unpacklo_epi32( eB0, eAval); //|.A |.B1|.A |.B0| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)dst, t2); t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); _mm_storeu_si128( (__m128i*)( dst+16 ), t2); dst += 32; } if(last) { __m128i t0, t1, t2; __m128i eR0, eB0, eG0; __m128i eY0; __m128i tU, tV; __m128i eU, eV; for(w = 0; w < last; w++) { ((Ipp8u*)(&t0))[w]= srcy[w]; ((Ipp8u*)(&tU))[w]= srcu[w]; ((Ipp8u*)(&tV))[w]= srcv[w]; } eY0 = _mm_slli_epi16( _mm_unpacklo_epi8( t0, eZero),4); /* | y7 - y0| */ eU = _mm_slli_epi16((_mm_unpacklo_epi8( tU, eZero)),7); /* | u7 - u0| */ eV = _mm_slli_epi16((_mm_unpacklo_epi8( tV, eZero)),7); /* | v7 - v0| */ eR0 = _mm_mulhi_epi16( eV, iRCr ); eR0 = _mm_adds_epi16 ( eR0, eY0 ); eR0 = _mm_subs_epi16 ( eR0, iR ); eR0 = _mm_adds_epi16 ( eR0, kOKR ); eR0 = _mm_srai_epi16 ( eR0, 4 ); eR0 = _mm_packus_epi16(eR0, eR0 ); eB0 = _mm_mulhi_epi16( eU, iBCb ); eB0 = _mm_adds_epi16 ( eB0, eY0 ); eB0 = _mm_subs_epi16 ( eB0, iB ); eB0 = _mm_adds_epi16 ( eB0, kOKR ); eB0 = _mm_srai_epi16 ( eB0, 4 ); eB0 = _mm_packus_epi16(eB0, eB0 ); eG0 = _mm_mulhi_epi16( eU, iGCb ); eG0 = _mm_adds_epi16 ( eG0, _mm_mulhi_epi16( eV, iGCr ) ); eY0 = _mm_adds_epi16 ( eY0, iG ); eY0 = _mm_subs_epi16 ( eY0, eG0 ); eY0 = _mm_adds_epi16 ( eY0, kOKR ); eY0 = _mm_srai_epi16 ( eY0, 4 ); eY0 = _mm_packus_epi16(eY0, eY0 ); t0 = _mm_unpacklo_epi32( eR0, eY0 ); //|.G1|.R1|.G0|.R0| t1 = _mm_unpacklo_epi32( eB0, eAval); //|.A |.B1|.A |.B0| t2 = _mm_unpacklo_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); if(last & 0x04) { _mm_storeu_si128( (__m128i*)dst, t2); dst+=16; t2 = _mm_unpackhi_epi64( t0, t1 ); //|.A |.B0|.G0|.R0| t2 = _mm_shuffle_epi8( t2, sHf ); } for(w = 0; w < ((last& 0x03)*4); w+=4) { dst[w+0] = ((Ipp8u*)(&t2))[w+0]; dst[w+1] = ((Ipp8u*)(&t2))[w+1]; dst[w+2] = ((Ipp8u*)(&t2))[w+2]; dst[w+3] = ((Ipp8u*)(&t2))[w+3]; } } } } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccctbl.c000066400000000000000000000530371443134507600245710ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions tables for forward transform // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCCCTBL_H__ #include "pjenccctbl.h" #endif #if ((_IPP == _IPP_PX) && (_IPP32E == _IPP32E_PX) && (_IPP64 == _IPP64_PX) && \ (_IPPLP32 == _IPPLP32_PX) && (_IPPLP64 == _IPPLP64_PX) && defined(_MERGED_BLD)) || !defined(_MERGED_BLD) const int mfxcc_table[] = { -1, 19594, 39189, 58784, 78379, 97974, 117569, 137164, 156759, 176354, 195949, 215544, 235139, 254734, 274329, 293924, 313519, 333114, 352709, 372304, 391899, 411494, 431089, 450684, 470279, 489874, 509469, 529064, 548659, 568254, 587849, 607444, 627039, 646634, 666229, 685824, 705419, 725014, 744609, 764204, 783799, 803394, 822989, 842584, 862179, 881774, 901369, 920964, 940559, 960154, 979749, 999344, 1018939, 1038534, 1058129, 1077724, 1097319, 1116914, 1136509, 1156104, 1175699, 1195294, 1214889, 1234484, 1254079, 1273674, 1293269, 1312864, 1332459, 1352054, 1371649, 1391244, 1410839, 1430434, 1450029, 1469624, 1489219, 1508814, 1528409, 1548004, 1567599, 1587194, 1606789, 1626384, 1645979, 1665574, 1685169, 1704764, 1724359, 1743954, 1763549, 1783144, 1802739, 1822334, 1841929, 1861524, 1881119, 1900714, 1920309, 1939904, 1959499, 1979094, 1998689, 2018284, 2037879, 2057474, 2077069, 2096664, 2116259, 2135854, 2155449, 2175044, 2194639, 2214234, 2233829, 2253424, 2273019, 2292614, 2312209, 2331804, 2351399, 2370994, 2390589, 2410184, 2429779, 2449374, 2468969, 2488564, 2508159, 2527754, 2547349, 2566944, 2586539, 2606134, 2625729, 2645324, 2664919, 2684514, 2704109, 2723704, 2743299, 2762894, 2782489, 2802084, 2821679, 2841274, 2860869, 2880464, 2900059, 2919654, 2939249, 2958844, 2978439, 2998034, 3017629, 3037224, 3056819, 3076414, 3096009, 3115604, 3135199, 3154794, 3174389, 3193984, 3213579, 3233174, 3252769, 3272364, 3291959, 3311554, 3331149, 3350744, 3370339, 3389934, 3409529, 3429124, 3448719, 3468314, 3487909, 3507504, 3527099, 3546694, 3566289, 3585884, 3605479, 3625074, 3644669, 3664264, 3683859, 3703454, 3723049, 3742644, 3762239, 3781834, 3801429, 3821024, 3840619, 3860214, 3879809, 3899404, 3918999, 3938594, 3958189, 3977784, 3997379, 4016974, 4036569, 4056164, 4075759, 4095354, 4114949, 4134544, 4154139, 4173734, 4193329, 4212924, 4232519, 4252114, 4271709, 4291304, 4310899, 4330494, 4350089, 4369684, 4389279, 4408874, 4428469, 4448064, 4467659, 4487254, 4506849, 4526444, 4546039, 4565634, 4585229, 4604824, 4624419, 4644014, 4663609, 4683204, 4702799, 4722394, 4741989, 4761584, 4781179, 4800774, 4820369, 4839964, 4859559, 4879154, 4898749, 4918344, 4937939, 4957534, 4977129, 4996724, -1, 38469, 76939, 115409, 153879, 192349, 230819, 269289, 307759, 346229, 384699, 423169, 461639, 500109, 538579, 577049, 615519, 653989, 692459, 730929, 769399, 807869, 846339, 884809, 923279, 961749, 1000219, 1038689, 1077159, 1115629, 1154099, 1192569, 1231039, 1269509, 1307979, 1346449, 1384919, 1423389, 1461859, 1500329, 1538799, 1577269, 1615739, 1654209, 1692679, 1731149, 1769619, 1808089, 1846559, 1885029, 1923499, 1961969, 2000439, 2038909, 2077379, 2115849, 2154319, 2192789, 2231259, 2269729, 2308199, 2346669, 2385139, 2423609, 2462079, 2500549, 2539019, 2577489, 2615959, 2654429, 2692899, 2731369, 2769839, 2808309, 2846779, 2885249, 2923719, 2962189, 3000659, 3039129, 3077599, 3116069, 3154539, 3193009, 3231479, 3269949, 3308419, 3346889, 3385359, 3423829, 3462299, 3500769, 3539239, 3577709, 3616179, 3654649, 3693119, 3731589, 3770059, 3808529, 3846999, 3885469, 3923939, 3962409, 4000879, 4039349, 4077819, 4116289, 4154759, 4193229, 4231699, 4270169, 4308639, 4347109, 4385579, 4424049, 4462519, 4500989, 4539459, 4577929, 4616399, 4654869, 4693339, 4731809, 4770279, 4808749, 4847219, 4885689, 4924159, 4962629, 5001099, 5039569, 5078039, 5116509, 5154979, 5193449, 5231919, 5270389, 5308859, 5347329, 5385799, 5424269, 5462739, 5501209, 5539679, 5578149, 5616619, 5655089, 5693559, 5732029, 5770499, 5808969, 5847439, 5885909, 5924379, 5962849, 6001319, 6039789, 6078259, 6116729, 6155199, 6193669, 6232139, 6270609, 6309079, 6347549, 6386019, 6424489, 6462959, 6501429, 6539899, 6578369, 6616839, 6655309, 6693779, 6732249, 6770719, 6809189, 6847659, 6886129, 6924599, 6963069, 7001539, 7040009, 7078479, 7116949, 7155419, 7193889, 7232359, 7270829, 7309299, 7347769, 7386239, 7424709, 7463179, 7501649, 7540119, 7578589, 7617059, 7655529, 7693999, 7732469, 7770939, 7809409, 7847879, 7886349, 7924819, 7963289, 8001759, 8040229, 8078699, 8117169, 8155639, 8194109, 8232579, 8271049, 8309519, 8347989, 8386459, 8424929, 8463399, 8501869, 8540339, 8578809, 8617279, 8655749, 8694219, 8732689, 8771159, 8809629, 8848099, 8886569, 8925039, 8963509, 9001979, 9040449, 9078919, 9117389, 9155859, 9194329, 9232799, 9271269, 9309739, 9348209, 9386679, 9425149, 9463619, 9502089, 9540559, 9579029, 9617499, 9655969, 9694439, 9732909, 9771379, 9809849, 32767, 40238, 47709, 55180, 62651, 70122, 77593, 85064, 92535, 100006, 107477, 114948, 122419, 129890, 137361, 144832, 152303, 159774, 167245, 174716, 182187, 189658, 197129, 204600, 212071, 219542, 227013, 234484, 241955, 249426, 256897, 264368, 271839, 279310, 286781, 294252, 301723, 309194, 316665, 324136, 331607, 339078, 346549, 354020, 361491, 368962, 376433, 383904, 391375, 398846, 406317, 413788, 421259, 428730, 436201, 443672, 451143, 458614, 466085, 473556, 481027, 488498, 495969, 503440, 510911, 518382, 525853, 533324, 540795, 548266, 555737, 563208, 570679, 578150, 585621, 593092, 600563, 608034, 615505, 622976, 630447, 637918, 645389, 652860, 660331, 667802, 675273, 682744, 690215, 697686, 705157, 712628, 720099, 727570, 735041, 742512, 749983, 757454, 764925, 772396, 779867, 787338, 794809, 802280, 809751, 817222, 824693, 832164, 839635, 847106, 854577, 862048, 869519, 876990, 884461, 891932, 899403, 906874, 914345, 921816, 929287, 936758, 944229, 951700, 959171, 966642, 974113, 981584, 989055, 996526, 1003997, 1011468, 1018939, 1026410, 1033881, 1041352, 1048823, 1056294, 1063765, 1071236, 1078707, 1086178, 1093649, 1101120, 1108591, 1116062, 1123533, 1131004, 1138475, 1145946, 1153417, 1160888, 1168359, 1175830, 1183301, 1190772, 1198243, 1205714, 1213185, 1220656, 1228127, 1235598, 1243069, 1250540, 1258011, 1265482, 1272953, 1280424, 1287895, 1295366, 1302837, 1310308, 1317779, 1325250, 1332721, 1340192, 1347663, 1355134, 1362605, 1370076, 1377547, 1385018, 1392489, 1399960, 1407431, 1414902, 1422373, 1429844, 1437315, 1444786, 1452257, 1459728, 1467199, 1474670, 1482141, 1489612, 1497083, 1504554, 1512025, 1519496, 1526967, 1534438, 1541909, 1549380, 1556851, 1564322, 1571793, 1579264, 1586735, 1594206, 1601677, 1609148, 1616619, 1624090, 1631561, 1639032, 1646503, 1653974, 1661445, 1668916, 1676387, 1683858, 1691329, 1698800, 1706271, 1713742, 1721213, 1728684, 1736155, 1743626, 1751097, 1758568, 1766039, 1773510, 1780981, 1788452, 1795923, 1803394, 1810865, 1818336, 1825807, 1833278, 1840749, 1848220, 1855691, 1863162, 1870633, 1878104, 1885575, 1893046, 1900517, 1907988, 1915459, 1922930, 1930401, 1937872, -1, -11060, -22119, -33178, -44237, -55296, -66355, -77414, -88473, -99532, -110591, -121650, -132709, -143768, -154827, -165886, -176945, -188004, -199063, -210122, -221181, -232240, -243299, -254358, -265417, -276476, -287535, -298594, -309653, -320712, -331771, -342830, -353889, -364948, -376007, -387066, -398125, -409184, -420243, -431302, -442361, -453420, -464479, -475538, -486597, -497656, -508715, -519774, -530833, -541892, -552951, -564010, -575069, -586128, -597187, -608246, -619305, -630364, -641423, -652482, -663541, -674600, -685659, -696718, -707777, -718836, -729895, -740954, -752013, -763072, -774131, -785190, -796249, -807308, -818367, -829426, -840485, -851544, -862603, -873662, -884721, -895780, -906839, -917898, -928957, -940016, -951075, -962134, -973193, -984252, -995311, -1006370, -1017429, -1028488, -1039547, -1050606, -1061665, -1072724, -1083783, -1094842, -1105901, -1116960, -1128019, -1139078, -1150137, -1161196, -1172255, -1183314, -1194373, -1205432, -1216491, -1227550, -1238609, -1249668, -1260727, -1271786, -1282845, -1293904, -1304963, -1316022, -1327081, -1338140, -1349199, -1360258, -1371317, -1382376, -1393435, -1404494, -1415553, -1426612, -1437671, -1448730, -1459789, -1470848, -1481907, -1492966, -1504025, -1515084, -1526143, -1537202, -1548261, -1559320, -1570379, -1581438, -1592497, -1603556, -1614615, -1625674, -1636733, -1647792, -1658851, -1669910, -1680969, -1692028, -1703087, -1714146, -1725205, -1736264, -1747323, -1758382, -1769441, -1780500, -1791559, -1802618, -1813677, -1824736, -1835795, -1846854, -1857913, -1868972, -1880031, -1891090, -1902149, -1913208, -1924267, -1935326, -1946385, -1957444, -1968503, -1979562, -1990621, -2001680, -2012739, -2023798, -2034857, -2045916, -2056975, -2068034, -2079093, -2090152, -2101211, -2112270, -2123329, -2134388, -2145447, -2156506, -2167565, -2178624, -2189683, -2200742, -2211801, -2222860, -2233919, -2244978, -2256037, -2267096, -2278155, -2289214, -2300273, -2311332, -2322391, -2333450, -2344509, -2355568, -2366627, -2377686, -2388745, -2399804, -2410863, -2421922, -2432981, -2444040, -2455099, -2466158, -2477217, -2488276, -2499335, -2510394, -2521453, -2532512, -2543571, -2554630, -2565689, -2576748, -2587807, -2598866, -2609925, -2620984, -2632043, -2643102, -2654161, -2665220, -2676279, -2687338, -2698397, -2709456, -2720515, -2731574, -2742633, -2753692, -2764751, -2775810, -2786869, -2797928, -2808987, -2820046, -1, -21710, -43419, -65128, -86837, -108546, -130255, -151964, -173673, -195382, -217091, -238800, -260509, -282218, -303927, -325636, -347345, -369054, -390763, -412472, -434181, -455890, -477599, -499308, -521017, -542726, -564435, -586144, -607853, -629562, -651271, -672980, -694689, -716398, -738107, -759816, -781525, -803234, -824943, -846652, -868361, -890070, -911779, -933488, -955197, -976906, -998615, -1020324, -1042033, -1063742, -1085451, -1107160, -1128869, -1150578, -1172287, -1193996, -1215705, -1237414, -1259123, -1280832, -1302541, -1324250, -1345959, -1367668, -1389377, -1411086, -1432795, -1454504, -1476213, -1497922, -1519631, -1541340, -1563049, -1584758, -1606467, -1628176, -1649885, -1671594, -1693303, -1715012, -1736721, -1758430, -1780139, -1801848, -1823557, -1845266, -1866975, -1888684, -1910393, -1932102, -1953811, -1975520, -1997229, -2018938, -2040647, -2062356, -2084065, -2105774, -2127483, -2149192, -2170901, -2192610, -2214319, -2236028, -2257737, -2279446, -2301155, -2322864, -2344573, -2366282, -2387991, -2409700, -2431409, -2453118, -2474827, -2496536, -2518245, -2539954, -2561663, -2583372, -2605081, -2626790, -2648499, -2670208, -2691917, -2713626, -2735335, -2757044, -2778753, -2800462, -2822171, -2843880, -2865589, -2887298, -2909007, -2930716, -2952425, -2974134, -2995843, -3017552, -3039261, -3060970, -3082679, -3104388, -3126097, -3147806, -3169515, -3191224, -3212933, -3234642, -3256351, -3278060, -3299769, -3321478, -3343187, -3364896, -3386605, -3408314, -3430023, -3451732, -3473441, -3495150, -3516859, -3538568, -3560277, -3581986, -3603695, -3625404, -3647113, -3668822, -3690531, -3712240, -3733949, -3755658, -3777367, -3799076, -3820785, -3842494, -3864203, -3885912, -3907621, -3929330, -3951039, -3972748, -3994457, -4016166, -4037875, -4059584, -4081293, -4103002, -4124711, -4146420, -4168129, -4189838, -4211547, -4233256, -4254965, -4276674, -4298383, -4320092, -4341801, -4363510, -4385219, -4406928, -4428637, -4450346, -4472055, -4493764, -4515473, -4537182, -4558891, -4580600, -4602309, -4624018, -4645727, -4667436, -4689145, -4710854, -4732563, -4754272, -4775981, -4797690, -4819399, -4841108, -4862817, -4884526, -4906235, -4927944, -4949653, -4971362, -4993071, -5014780, -5036489, -5058198, -5079907, -5101616, -5123325, -5145034, -5166743, -5188452, -5210161, -5231870, -5253579, -5275288, -5296997, -5318706, -5340415, -5362124, -5383833, -5405542, -5427251, -5448960, -5470669, -5492378, -5514087, -5535796, 8421374, 8454142, 8486910, 8519678, 8552446, 8585214, 8617982, 8650750, 8683518, 8716286, 8749054, 8781822, 8814590, 8847358, 8880126, 8912894, 8945662, 8978430, 9011198, 9043966, 9076734, 9109502, 9142270, 9175038, 9207806, 9240574, 9273342, 9306110, 9338878, 9371646, 9404414, 9437182, 9469950, 9502718, 9535486, 9568254, 9601022, 9633790, 9666558, 9699326, 9732094, 9764862, 9797630, 9830398, 9863166, 9895934, 9928702, 9961470, 9994238, 10027006, 10059774, 10092542, 10125310, 10158078, 10190846, 10223614, 10256382, 10289150, 10321918, 10354686, 10387454, 10420222, 10452990, 10485758, 10518526, 10551294, 10584062, 10616830, 10649598, 10682366, 10715134, 10747902, 10780670, 10813438, 10846206, 10878974, 10911742, 10944510, 10977278, 11010046, 11042814, 11075582, 11108350, 11141118, 11173886, 11206654, 11239422, 11272190, 11304958, 11337726, 11370494, 11403262, 11436030, 11468798, 11501566, 11534334, 11567102, 11599870, 11632638, 11665406, 11698174, 11730942, 11763710, 11796478, 11829246, 11862014, 11894782, 11927550, 11960318, 11993086, 12025854, 12058622, 12091390, 12124158, 12156926, 12189694, 12222462, 12255230, 12287998, 12320766, 12353534, 12386302, 12419070, 12451838, 12484606, 12517374, 12550142, 12582910, 12615678, 12648446, 12681214, 12713982, 12746750, 12779518, 12812286, 12845054, 12877822, 12910590, 12943358, 12976126, 13008894, 13041662, 13074430, 13107198, 13139966, 13172734, 13205502, 13238270, 13271038, 13303806, 13336574, 13369342, 13402110, 13434878, 13467646, 13500414, 13533182, 13565950, 13598718, 13631486, 13664254, 13697022, 13729790, 13762558, 13795326, 13828094, 13860862, 13893630, 13926398, 13959166, 13991934, 14024702, 14057470, 14090238, 14123006, 14155774, 14188542, 14221310, 14254078, 14286846, 14319614, 14352382, 14385150, 14417918, 14450686, 14483454, 14516222, 14548990, 14581758, 14614526, 14647294, 14680062, 14712830, 14745598, 14778366, 14811134, 14843902, 14876670, 14909438, 14942206, 14974974, 15007742, 15040510, 15073278, 15106046, 15138814, 15171582, 15204350, 15237118, 15269886, 15302654, 15335422, 15368190, 15400958, 15433726, 15466494, 15499262, 15532030, 15564798, 15597566, 15630334, 15663102, 15695870, 15728638, 15761406, 15794174, 15826942, 15859710, 15892478, 15925246, 15958014, 15990782, 16023550, 16056318, 16089086, 16121854, 16154622, 16187390, 16220158, 16252926, 16285694, 16318462, 16351230, 16383998, 16416766, 16449534, 16482302, 16515070, 16547838, 16580606, 16613374, 16646142, 16678910, 16711678, 16744446, 16777214, -1, -27440, -54879, -82318, -109757, -137196, -164635, -192074, -219513, -246952, -274391, -301830, -329269, -356708, -384147, -411586, -439025, -466464, -493903, -521342, -548781, -576220, -603659, -631098, -658537, -685976, -713415, -740854, -768293, -795732, -823171, -850610, -878049, -905488, -932927, -960366, -987805, -1015244, -1042683, -1070122, -1097561, -1125000, -1152439, -1179878, -1207317, -1234756, -1262195, -1289634, -1317073, -1344512, -1371951, -1399390, -1426829, -1454268, -1481707, -1509146, -1536585, -1564024, -1591463, -1618902, -1646341, -1673780, -1701219, -1728658, -1756097, -1783536, -1810975, -1838414, -1865853, -1893292, -1920731, -1948170, -1975609, -2003048, -2030487, -2057926, -2085365, -2112804, -2140243, -2167682, -2195121, -2222560, -2249999, -2277438, -2304877, -2332316, -2359755, -2387194, -2414633, -2442072, -2469511, -2496950, -2524389, -2551828, -2579267, -2606706, -2634145, -2661584, -2689023, -2716462, -2743901, -2771340, -2798779, -2826218, -2853657, -2881096, -2908535, -2935974, -2963413, -2990852, -3018291, -3045730, -3073169, -3100608, -3128047, -3155486, -3182925, -3210364, -3237803, -3265242, -3292681, -3320120, -3347559, -3374998, -3402437, -3429876, -3457315, -3484754, -3512193, -3539632, -3567071, -3594510, -3621949, -3649388, -3676827, -3704266, -3731705, -3759144, -3786583, -3814022, -3841461, -3868900, -3896339, -3923778, -3951217, -3978656, -4006095, -4033534, -4060973, -4088412, -4115851, -4143290, -4170729, -4198168, -4225607, -4253046, -4280485, -4307924, -4335363, -4362802, -4390241, -4417680, -4445119, -4472558, -4499997, -4527436, -4554875, -4582314, -4609753, -4637192, -4664631, -4692070, -4719509, -4746948, -4774387, -4801826, -4829265, -4856704, -4884143, -4911582, -4939021, -4966460, -4993899, -5021338, -5048777, -5076216, -5103655, -5131094, -5158533, -5185972, -5213411, -5240850, -5268289, -5295728, -5323167, -5350606, -5378045, -5405484, -5432923, -5460362, -5487801, -5515240, -5542679, -5570118, -5597557, -5624996, -5652435, -5679874, -5707313, -5734752, -5762191, -5789630, -5817069, -5844508, -5871947, -5899386, -5926825, -5954264, -5981703, -6009142, -6036581, -6064020, -6091459, -6118898, -6146337, -6173776, -6201215, -6228654, -6256093, -6283532, -6310971, -6338410, -6365849, -6393288, -6420727, -6448166, -6475605, -6503044, -6530483, -6557922, -6585361, -6612800, -6640239, -6667678, -6695117, -6722556, -6749995, -6777434, -6804873, -6832312, -6859751, -6887190, -6914629, -6942068, -6969507, -6996946, -1, -5330, -10659, -15988, -21317, -26646, -31975, -37304, -42633, -47962, -53291, -58620, -63949, -69278, -74607, -79936, -85265, -90594, -95923, -101252, -106581, -111910, -117239, -122568, -127897, -133226, -138555, -143884, -149213, -154542, -159871, -165200, -170529, -175858, -181187, -186516, -191845, -197174, -202503, -207832, -213161, -218490, -223819, -229148, -234477, -239806, -245135, -250464, -255793, -261122, -266451, -271780, -277109, -282438, -287767, -293096, -298425, -303754, -309083, -314412, -319741, -325070, -330399, -335728, -341057, -346386, -351715, -357044, -362373, -367702, -373031, -378360, -383689, -389018, -394347, -399676, -405005, -410334, -415663, -420992, -426321, -431650, -436979, -442308, -447637, -452966, -458295, -463624, -468953, -474282, -479611, -484940, -490269, -495598, -500927, -506256, -511585, -516914, -522243, -527572, -532901, -538230, -543559, -548888, -554217, -559546, -564875, -570204, -575533, -580862, -586191, -591520, -596849, -602178, -607507, -612836, -618165, -623494, -628823, -634152, -639481, -644810, -650139, -655468, -660797, -666126, -671455, -676784, -682113, -687442, -692771, -698100, -703429, -708758, -714087, -719416, -724745, -730074, -735403, -740732, -746061, -751390, -756719, -762048, -767377, -772706, -778035, -783364, -788693, -794022, -799351, -804680, -810009, -815338, -820667, -825996, -831325, -836654, -841983, -847312, -852641, -857970, -863299, -868628, -873957, -879286, -884615, -889944, -895273, -900602, -905931, -911260, -916589, -921918, -927247, -932576, -937905, -943234, -948563, -953892, -959221, -964550, -969879, -975208, -980537, -985866, -991195, -996524, -1001853, -1007182, -1012511, -1017840, -1023169, -1028498, -1033827, -1039156, -1044485, -1049814, -1055143, -1060472, -1065801, -1071130, -1076459, -1081788, -1087117, -1092446, -1097775, -1103104, -1108433, -1113762, -1119091, -1124420, -1129749, -1135078, -1140407, -1145736, -1151065, -1156394, -1161723, -1167052, -1172381, -1177710, -1183039, -1188368, -1193697, -1199026, -1204355, -1209684, -1215013, -1220342, -1225671, -1231000, -1236329, -1241658, -1246987, -1252316, -1257645, -1262974, -1268303, -1273632, -1278961, -1284290, -1289619, -1294948, -1300277, -1305606, -1310935, -1316264, -1321593, -1326922, -1332251, -1337580, -1342909, -1348238, -1353567, -1358896, }; #endif /* _MERGED_BLD */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenccctbl.h000066400000000000000000000036251443134507600245740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Color conversions tables // (Forward transform) // */ #ifndef __PJENCCCTBL_H__ #define __PJENCCCTBL_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif /* -------------------- macros for JPEG color conversions ----------------- */ #define MAXCSAMPLE 255 #define R_Y_OFFS 0 /* offset to R->Y section */ #define G_Y_OFFS (1*(MAXCSAMPLE+1)) /* offset to G->Y section */ #define B_Y_OFFS (2*(MAXCSAMPLE+1)) /* etc */ #define R_CB_OFF (3*(MAXCSAMPLE+1)) #define G_CB_OFF (4*(MAXCSAMPLE+1)) #define B_CB_OFF (5*(MAXCSAMPLE+1)) #define R_CR_OFF B_CB_OFF /* B->Cb, R->Cr are the same */ #define G_CR_OFF (6*(MAXCSAMPLE+1)) #define B_CR_OFF (7*(MAXCSAMPLE+1)) #define CTBL_SIZE (8*(MAXCSAMPLE+1)) extern const int mfxcc_table[]; #endif /* __PJENCCCTBL_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencdct.c000066400000000000000000000070221443134507600242450ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT+quantization+level shift+range convert functions (Forward transform) // // Contents: // mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PS_ANARITH_H__ #include "ps_anarith.h" #endif #ifndef __PJQUANT_H__ #include "pjquant.h" #endif #if ((_IPP>=_IPP_H9)||(_IPP32E>=_IPP32E_L9)) extern void mfxownDCTQuantFwd8x8LS_JPEG_8u16s_C1R(const Ipp8u* pSrc, int srcStep, Ipp16s* pDst, const Ipp16u* pQuantFwdTable); #endif #if IPPJ_QNT_OPT || (_IPPXSC >= _IPPXSC_S2) ASMAPI(void, mfxdct_8x8_fwd_16s, (Ipp16s*, Ipp16s*)); ASMAPI(void, mfxownpj_Sub128_8x8_8u16s, (const Ipp8u*, int, Ipp16s*)); ASMAPI(void, mfxownps_Mul_16u16s_Sfs, (const Ipp16u*, const Ipp16s*, Ipp16s*, int, int)); #endif #if IPPJ_QNT_OPT ASMAPI(void, mfxownsMul_16u16s_PosSfs, (const Ipp16u*, const Ipp16s*, Ipp16s*, int, int)); #endif /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R // // Purpose: // Forward DCT transform, quantization and level shift // // Parameter: // pSrc - pointer to source // srcStep - line offset for source data // pDst - pointer to output array // pQuantFwdTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R, ( const Ipp8u* pSrc, int srcStep, Ipp16s* pDst, const Ipp16u* pQuantFwdTable)) { IPP_BAD_PTR2_RET(pSrc,pDst) IPP_BAD_STEP_RET(srcStep) IPP_BAD_PTR1_RET(pQuantFwdTable) #if ((_IPP>=_IPP_H9)||(_IPP32E>=_IPP32E_L9)) mfxownDCTQuantFwd8x8LS_JPEG_8u16s_C1R(pSrc, srcStep, pDst, pQuantFwdTable); #else #if IPPJ_QNT_OPT || (_IPPXSC >= _IPPXSC_S2) { mfxownpj_Sub128_8x8_8u16s(pSrc,srcStep,pDst); mfxdct_8x8_fwd_16s(pDst,pDst); #if IPPJ_QNT_OPT mfxownsMul_16u16s_PosSfs(pQuantFwdTable,(Ipp16s*)pDst,pDst,DCTSIZE2,QUANT_BITS); #else mfxownps_Mul_16u16s_Sfs(pQuantFwdTable,(Ipp16s*)pDst,pDst,DCTSIZE2,QUANT_BITS); #endif } #else { IppiSize roi = { 8, 8 }; mfxownpj_Sub128_JPEG_8u16s_C1R(pSrc,srcStep,pDst,8*sizeof(Ipp16s),roi); mfxiDCT8x8Fwd_16s_C1I(pDst); mfxsMul_16u16s_Sfs(pQuantFwdTable,pDst,pDst,DCTSIZE2,QUANT_BITS); } #endif #endif return ippStsNoErr; } /* mfxiDCTQuantFwd8x8LS_JPEG_8u16s_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencdct32f.c000066400000000000000000000054651443134507600245710ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT + quantization+level shift + range convert functions (Forward transform) // // Contents: // mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) extern void mfxdct_qnt_fwd_8x8_ls(const Ipp16u* pSrc,int srcStep,Ipp16s* pDst,const Ipp32f* pQntFwdTbl); #else static void mfxdct_qnt_fwd_8x8_ls(const Ipp16u* pSrc,int srcStep,Ipp16s* pDst,const Ipp32f* pQntFwdTbl) { int i; __ALIGN16 Ipp32f wb[DCTSIZE2]; for(i = 0; i < DCTSIZE; i++) ippsConvert_16u32f((Ipp16u*)((Ipp8u*)pSrc + i*srcStep), wb + i*DCTSIZE, DCTSIZE); ippsSubC_32f_I(2048.0, wb, DCTSIZE2); mfxiDCT8x8Fwd_32f_C1I(wb); ippsMul_32f_I(pQntFwdTbl, wb, DCTSIZE2); ippsConvert_32f16s_Sfs(wb, pDst, DCTSIZE2, ippRndNear, 0); return; } /* mfxdct_qnt_fwd_8x8_ls() */ #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R // // Purpose: // Forward DCT transform, quantization and level shift // // Parameter: // pSrc - pointer to source // srcStep - line offset for source data // pDst - pointer to output array // pQuantFwdTable - pointer to Quantization table // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R,( const Ipp16u* pSrc, int srcStep, Ipp16s* pDst, const Ipp32f* pQuantFwdTable)) { IPP_BAD_PTR2_RET(pSrc, pDst); IPP_BAD_STEP_RET(srcStep); IPP_BAD_PTR1_RET(pQuantFwdTable); mfxdct_qnt_fwd_8x8_ls(pSrc,srcStep,pDst,pQuantFwdTable); return ippStsNoErr; } /* mfxiDCTQuantFwd8x8LS_JPEG_16u16s_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencdct32fw7cn.c000066400000000000000000000254101443134507600253600ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // DCT + quantization+level shift + range convert functions (Forward transform) // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #include extern void mfxdct_8x8_fwd_32f(Ipp32f* x, Ipp32f* y); static const __ALIGN16 Ipp32f fLS[4] = { 2048., 2048., 2048., 2048. }; extern void mfxdct_qnt_fwd_8x8_ls( const Ipp16u* pSrc, int srcStep, Ipp16s* pDst, const Ipp32f* pQntFwdTbl) { __ALIGN16 __m128 _fS0, _fS1, _fS2; __ALIGN16 __m128i _iS0, _iS1, _iS2; __ALIGN16 Ipp32f wb[64]; _fS2 = _mm_load_ps(fLS); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 0*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 0, _fS1); _mm_store_ps(wb + 4, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 1*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 8, _fS1); _mm_store_ps(wb + 12, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 2*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 16, _fS1); _mm_store_ps(wb + 20, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 3*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 24, _fS1); _mm_store_ps(wb + 28, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 4*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 32, _fS1); _mm_store_ps(wb + 36, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 5*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 40, _fS1); _mm_store_ps(wb + 44, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 6*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 48, _fS1); _mm_store_ps(wb + 52, _fS0); _iS0 = _mm_loadu_si128((__m128i*) ((Ipp8u*)pSrc + 7*srcStep)); _iS1 = _mm_srai_epi16(_iS0, 15); _iS2 = _mm_unpacklo_epi16(_iS0, _iS1); _iS0 = _mm_unpackhi_epi16(_iS0, _iS1); _fS1 = _mm_cvtepi32_ps(_iS2); _fS0 = _mm_cvtepi32_ps(_iS0); _fS1 = _mm_sub_ps(_fS1, _fS2); _fS0 = _mm_sub_ps(_fS0, _fS2); _mm_store_ps(wb + 56, _fS1); _mm_store_ps(wb + 60, _fS0); mfxdct_8x8_fwd_32f(wb, wb); if(!((intptr_t)pQntFwdTbl & 15) && !((intptr_t)pDst & 15)) { _fS0 = _mm_load_ps(wb + 0); _fS2 = _mm_load_ps(pQntFwdTbl + 0); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 4); _fS2 = _mm_load_ps(pQntFwdTbl + 4); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*)(pDst + 0), _iS0); _fS0 = _mm_load_ps(wb + 8); _fS2 = _mm_load_ps(pQntFwdTbl + 8); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 12); _fS2 = _mm_load_ps(pQntFwdTbl + 12); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 8), _iS0); _fS0 = _mm_load_ps(wb + 16); _fS2 = _mm_load_ps(pQntFwdTbl + 16); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 20); _fS2 = _mm_load_ps(pQntFwdTbl + 20); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 16), _iS0); _fS0 = _mm_load_ps(wb + 24); _fS2 = _mm_load_ps(pQntFwdTbl + 24); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 28); _fS2 = _mm_load_ps(pQntFwdTbl + 28); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 24), _iS0); _fS0 = _mm_load_ps(wb + 32); _fS2 = _mm_load_ps(pQntFwdTbl + 32); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 36); _fS2 = _mm_load_ps(pQntFwdTbl + 36); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 32), _iS0); _fS0 = _mm_load_ps(wb + 40); _fS2 = _mm_load_ps(pQntFwdTbl + 40); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 44); _fS2 = _mm_load_ps(pQntFwdTbl + 44); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 40), _iS0); _fS0 = _mm_load_ps(wb + 48); _fS2 = _mm_load_ps(pQntFwdTbl + 48); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 52); _fS2 = _mm_load_ps(pQntFwdTbl + 52); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 48), _iS0); _fS0 = _mm_load_ps(wb + 56); _fS2 = _mm_load_ps(pQntFwdTbl + 56); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 60); _fS2 = _mm_load_ps(pQntFwdTbl + 60); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_store_si128((__m128i*) (pDst + 56), _iS0); } else { _fS0 = _mm_load_ps(wb + 0); _fS2 = _mm_loadu_ps(pQntFwdTbl + 0); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 4); _fS2 = _mm_loadu_ps(pQntFwdTbl + 4); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*)(pDst + 0), _iS0); _fS0 = _mm_load_ps(wb + 8); _fS2 = _mm_loadu_ps(pQntFwdTbl + 8); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 12); _fS2 = _mm_loadu_ps(pQntFwdTbl + 12); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 8), _iS0); _fS0 = _mm_load_ps(wb + 16); _fS2 = _mm_loadu_ps(pQntFwdTbl + 16); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 20); _fS2 = _mm_loadu_ps(pQntFwdTbl + 20); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 16), _iS0); _fS0 = _mm_load_ps(wb + 24); _fS2 = _mm_loadu_ps(pQntFwdTbl + 24); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 28); _fS2 = _mm_loadu_ps(pQntFwdTbl + 28); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 24), _iS0); _fS0 = _mm_load_ps(wb + 32); _fS2 = _mm_loadu_ps(pQntFwdTbl + 32); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 36); _fS2 = _mm_loadu_ps(pQntFwdTbl + 36); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 32), _iS0); _fS0 = _mm_load_ps(wb + 40); _fS2 = _mm_loadu_ps(pQntFwdTbl + 40); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 44); _fS2 = _mm_loadu_ps(pQntFwdTbl + 44); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 40), _iS0); _fS0 = _mm_load_ps(wb + 48); _fS2 = _mm_loadu_ps(pQntFwdTbl + 48); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 52); _fS2 = _mm_loadu_ps(pQntFwdTbl + 52); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 48), _iS0); _fS0 = _mm_load_ps(wb + 56); _fS2 = _mm_loadu_ps(pQntFwdTbl + 56); _fS0 = _mm_mul_ps(_fS0, _fS2); _fS1 = _mm_load_ps(wb + 60); _fS2 = _mm_loadu_ps(pQntFwdTbl + 60); _fS1 = _mm_mul_ps(_fS1, _fS2); _iS0 = _mm_cvtps_epi32(_fS0); _iS1 = _mm_cvtps_epi32(_fS1); _iS0 = _mm_packs_epi32(_iS0, _iS1); _mm_storeu_si128((__m128i*) (pDst + 56), _iS0); } return; } /* mfxdct_qnt_fwd_8x8_ls() */ #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenchuff.c000066400000000000000000000446071443134507600244350ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // Purpose: // Huffman entropy encoder // // Contents: // mfxiEncodeHuffmanRawTableInit_JPEG_8u, // mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u, // mfxiEncodeHuffmanStateGetBufSize_JPEG_8u, // mfxiEncodeHuffmanStateInit_JPEG_8u, // mfxiEncodeHuffman8x8_JPEG_16s1u_C1, // mfxiGetHuffmanStatistics8x8_JPEG_16s_C1 // #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PSCOPY_H__ #include "pscopy.h" #endif #ifndef __PJZIGZAG_H__ #include "pjzigzag.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJENCHUFF_H__ #include "pjenchuff.h" #endif #define MAX_CODE_LEN 32 LOCFUN(IppStatus,mfxownpj_EncodeHuffmanSpecInit,( const Ipp8u* pBits, const Ipp8u* pVals, ownpjEncodeHuffmanSpec* pEncHuffTbl)) { int i; int j; int k; unsigned int si; unsigned int code; int lastk; unsigned int huffsize[257]; unsigned int huffcode[257]; mfxownsZero_8u((Ipp8u*)pEncHuffTbl,sizeof(ownpjEncodeHuffmanSpec)); mfxownsZero_8u((Ipp8u*)&huffsize[0],sizeof(huffsize)); mfxownsZero_8u((Ipp8u*)&huffcode[0],sizeof(huffcode)); /* Generate Size Table */ /* ISO/IEC 10918-1, Figure C.1 - Generation of table of Huffman code sizes */ k = 0; for(i = 0; i < 16; i++) { j = pBits[i]; if((k + j) > 256) { /* protect against table overrun */ return ippStsJPEGHuffTableErr; } while(j--) { huffsize[k++] = (i + 1); } } huffsize[k] = 0; lastk = k; /* Generate Code Table */ /* ISO/IEC 10918-1, Figure C.2 - Generation of table of Huffman codes */ k = 0; code = 0; si = huffsize[0]; while(huffsize[k]) { while(huffsize[k] == si) { huffcode[k++] = code; code++; } /* code is now 1 more than the last code used for codelength si; but * it must still fit in si bits, since no code is allowed to be all ones. */ if(code >= (unsigned int)(1 << si)) { /* corrupted table */ return ippStsJPEGHuffTableErr; } code <<= 1; si++; } /* Order Codes */ /* ISO/IEC 10918-1, Figure C.3 - Ordering procedure for encoding */ /* procedure code tables */ for(k = 0; k < lastk; k++) { i = (int)pVals[k]; pEncHuffTbl->hcs[i] = (huffsize[k] << 16) | (huffcode[k] & 0xffff); } return ippStsNoErr; } /* mfxownpj_EncodeHuffmanSpecInit() */ OWNFUN(void,mfxownpj_EncodeHuffmanStateInit,( ownpjEncodeHuffmanState* pState)) { pState->uBitBuffer = 0; pState->nBitsValid = 0; pState->nBE = 0; pState->nEndOfBlockRun = 0; mfxownsZero_8u(pState->pBEBuff,sizeof(pState->pBEBuff)); return; } /* mfxownpj_EncodeHuffmanStateInit() */ OWNFUN(IppStatus,mfxownpj_write_bits_jpeg,( const unsigned int uValue, const int nBits, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, ownpjEncodeHuffmanState* pState)) { int nBitsValid; Ipp32u uBitBuffer; IppStatus status = ippStsNoErr; if(nBits == 0) { return ippStsJPEGHuffTableErr; } uBitBuffer = (Ipp32u)(uValue & MASK(nBits)); nBitsValid = pState->nBitsValid + nBits; uBitBuffer <<= 24 - nBitsValid; uBitBuffer |= (Ipp32u)pState->uBitBuffer; while(nBitsValid >= 8) { Ipp32u c = (Ipp32u)((uBitBuffer >> 16) & 0xFF); if(*pDstCurrPos >= nDstLenBytes) { status = ippStsJPEGOutOfBufErr; goto Exit; } *(pDst + *pDstCurrPos) = (Ipp8u)c; (*pDstCurrPos)++; if(c == 0xff) { if(*pDstCurrPos == nDstLenBytes) { status = ippStsJPEGOutOfBufErr; goto Exit; } *(pDst + *pDstCurrPos) = 0x00; (*pDstCurrPos)++; } uBitBuffer <<= 8; nBitsValid -= 8; } /* update state variables */ pState->uBitBuffer = uBitBuffer; pState->nBitsValid = nBitsValid; Exit: return status; } /* mfxownpj_write_bits_jpeg() */ /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanRawTableInit_JPEG_8u // // Purpose: // Build Huffman "raw" table from counted statistics of // Huffman symbols // // Parameters: // pStatistics - pointer to Huffman symbols statistics // pListBits - pointer to list of bits for Huffman codes // pListVals - pointer to list of vals for Huffman codes // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanRawTableInit_JPEG_8u, ( const int pStatistics[256], Ipp8u* pListBits, Ipp8u* pListVals)) { int i; int j; int k; int v; int v1; int v2; int freq[257]; int codesize[257]; int others[257]; Ipp8u bits[MAX_CODE_LEN+1]; IPP_BAD_PTR1_RET(pStatistics); IPP_BAD_PTR2_RET(pListBits,pListVals); mfxownsCopy_8u((Ipp8u*)pStatistics,(Ipp8u*)&freq[0],sizeof(freq)); mfxownsZero_8u((Ipp8u*)&codesize,sizeof(codesize)); mfxownsZero_8u((Ipp8u*)&bits,sizeof(bits)); mfxownsSet_32s(-1,others,257); freq[256] = 1; for(;;) { /* find v1 for least value of freq[v1] > 0 */ v1 = -1; v = 1000000000L; for(i = 0; i <= 256; i++) { if((freq[i] != 0) && (freq[i] <= v)) { v = freq[i]; v1 = i; } } /* find v2 for next least value of freq[v2] > 0 */ v2 = -1; v = 1000000000L; for(i = 0; i <= 256; i++) { if((freq[i] != 0) && (freq[i] <= v) && (i != v1)) { v = freq[i]; v2 = i; } } if(v2 < 0 || v1 < 0) { break; } freq[v1] = freq[v1] + freq[v2]; freq[v2] = 0; codesize[v1]++; while(others[v1] >= 0) { v1 = others[v1]; codesize[v1]++; } others[v1] = v2; codesize[v2]++; while(others[v2] >= 0) { v2 = others[v2]; codesize[v2]++; } } /* count bits */ for(i = 0; i <= 256; i++) { if(codesize[i]) { if(codesize[i] > MAX_CODE_LEN) { return ippStsJPEGHuffTableErr; } bits[ codesize[i] ]++; } } /* adjust bits */ for(i = MAX_CODE_LEN; i > 16; i--) { while(bits[i] > 0) { j = i - 2; while (bits[j] == 0) { j--; } bits[i] = (Ipp8u)(bits[i] - 2); bits[i-1] = (Ipp8u)(bits[i - 1] + 1); bits[j+1] = (Ipp8u)(bits[j + 1] + 2); bits[j] = (Ipp8u)(bits[j] - 1); } } while(bits[i] == 0) { i--; } bits[i] = (Ipp8u)(bits[i] - 1); /* sort input */ mfxsCopy_8u(&bits[1],pListBits,16); k = 0; for(i = 1; i <= MAX_CODE_LEN; i++) { for(j = 0; j <= 255; j++) { if(codesize[j] == i) { pListVals[k] = (Ipp8u)j; k++; } } } return ippStsNoErr; } /* mfxiEncodeHuffmanRawTableInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u // // Purpose: // get size of MfxiEncodeHuffmanSpec struct // // Parameters: // pEncHuffSpecBufSize - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u, ( int* pEncHuffSpecBufSize)) { IPP_BAD_PTR1_RET(pEncHuffSpecBufSize); *pEncHuffSpecBufSize = sizeof(ownpjEncodeHuffmanSpec); return ippStsNoErr; } /* mfxiEncodeHuffmanSpecGetBufSize_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanSpecInit_JPEG_8u // // Purpose: // Build Huffman table for encoder // in fast-to-use format from raw Huffman table // // Parameters: // pListBits - pointer to raw Huffman table bits // pListVals - pointer to raw Huffman table vals // pEncHuffSpec - pointer to Huffman table to be initialized // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanSpecInit_JPEG_8u, ( const Ipp8u* pListBits, const Ipp8u* pListVals, IppiEncodeHuffmanSpec* pEncHuffSpec)) { ownpjEncodeHuffmanSpec* pEncHuffTbl; IPP_BAD_PTR2_RET(pListBits,pListVals); IPP_BAD_PTR1_RET(pEncHuffSpec); pEncHuffTbl = (ownpjEncodeHuffmanSpec*)pEncHuffSpec; return mfxownpj_EncodeHuffmanSpecInit(pListBits,pListVals,pEncHuffTbl); } /* mfxiEncodeHuffmanSpecInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanStateGetBufSize_JPEG_8u // // Purpose: // get size of IppiEncodeHuffmanState struct // // Parameters: // pEncHuffStateBufSize - where write size of buffer // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanStateGetBufSize_JPEG_8u, ( int* pEncHuffStateBufSize)) { IPP_BAD_PTR1_RET(pEncHuffStateBufSize); *pEncHuffStateBufSize = sizeof(ownpjEncodeHuffmanState); return ippStsNoErr; } /* mfxiEncodeHuffmanStateGetBufSize_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanStateInit_JPEG_8u // // Purpose: // Build IppiEncodeHuffmanState struct // // Parameters: // pEncHuffState - pointer to IppiEncodeHuffmanState struct // to be initialized // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanStateInit_JPEG_8u, ( IppiEncodeHuffmanState* pEncHuffState)) { ownpjEncodeHuffmanState* pState; IPP_BAD_PTR1_RET(pEncHuffState); pState = (ownpjEncodeHuffmanState*)pEncHuffState; mfxownpj_EncodeHuffmanStateInit(pState); return ippStsNoErr; } /* mfxiEncodeHuffmanStateInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_JPEG_16s1u_C1 // // Purpose: // Huffman encode 8x8 block of quantized DCT coefs // // Parameters: // pSrc pointer to quantized DCT coefficients // pDst pointer to output JPEG bitstream // DstLenBytes bitstream length, in bytes // pDstCurrPos current offset in bytes in buffer (in/out) // pLastDC pointer to last DC coefs (in/out) // pEncHuffState pointer to Huffman state struct // pDcTable pointer to Huffman DC table // pAcTable pointer to Huffman AC table // bFlushState if non zero - only flush any pending bits from state // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffman8x8_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, Ipp16s* pLastDC, const IppiEncodeHuffmanSpec* pDcTable, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { int i; int r; int rs; unsigned int cs; unsigned int uValue; int nBits; int data; int ssss; ownpjEncodeHuffmanSpec* dc_table = (ownpjEncodeHuffmanSpec*)pDcTable; ownpjEncodeHuffmanSpec* ac_table = (ownpjEncodeHuffmanSpec*)pAcTable; ownpjEncodeHuffmanState* pState = (ownpjEncodeHuffmanState*)pEncHuffState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pEncHuffState); if(bFlushState != 0) { status = mfxownpj_write_bits_jpeg(0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; } IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pLastDC); IPP_BAD_PTR1_RET(pDcTable); IPP_BAD_PTR1_RET(pAcTable); #if defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) status = mfxownpj_EncodeHuffman8x8_JPEG_16s1u_C1( pSrc, pDst, nDstLenBytes, pDstCurrPos, pLastDC, dc_table, ac_table, pState); if(ippStsNoErr == status) { goto Exit; } #endif /* Encode DC Coefficient */ data = pSrc[0] - *pLastDC; *pLastDC = pSrc[0]; if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } data -= 1; } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } /* Encode Size of DC Coefficient */ cs = dc_table->hcs[ssss]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* Encode DC Coefficient Value */ /* (difference from previous value in this component) */ if(ssss) { status = mfxownpj_write_bits_jpeg( data,ssss,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } /* Encode AC Coefficient(s) */ r = 0; for(i = 1; i < DCTSIZE2; i++) { data = pSrc[mfxown_pj_izigzag_index[i]]; if(data == 0) { r++; /* Increment run-length of zeroes */ } else { while(r > 15) { cs = ac_table->hcs[0xf0]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } r -= 16; } if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } data -= 1; } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } rs = (r << 4) + ssss; /* Encode run-length of zeros and size of first non-zero AC coeff */ cs = ac_table->hcs[rs]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* Encode AC coefficient value and sign */ if(ssss) { status = mfxownpj_write_bits_jpeg( data,ssss,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } r = 0; } /* if data != 0 */ } /* for i = 1...63 */ if(r > 0) { /* Emit End Of Block code */ cs = ac_table->hcs[0x00]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } Exit: return status; } /* mfxiEncodeHuffman8x8_JPEG_16s1u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_JPEG_16s_C1 // // Purpose: // gather huffman symbols statistics // // Parameters: // pSrc - pointer to input DCT coefficients block // pDcStatistics[256] - array for DC symbols statistics // pAcStatistics[265] - array for AC symbols statistics // pLastDC - pointer to variable to store DC coefficient // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiGetHuffmanStatistics8x8_JPEG_16s_C1, ( const Ipp16s* pSrc, int pDcStatistics[256], int pAcStatistics[256], Ipp16s* pLastDC)) { int i; int r; int rs; int data; int ssss; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR2_RET(pDcStatistics,pAcStatistics); IPP_BAD_PTR1_RET(pLastDC); /* Encode DC Coefficient */ data = pSrc[0] - *pLastDC; *pLastDC = pSrc[0]; if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } if(ssss > 15) return ippStsJPEGDCTRangeErr; /* Count huffval Size of DC Coefficient */ pDcStatistics[ssss]++; /* Encode AC Coefficient(s) */ r = 0; for(i = 1; i < DCTSIZE2; i++) { data = pSrc[mfxown_pj_izigzag_index[i]]; if(data == 0) { r++; /* Increment run-length of zeroes */ } else { while(r > 15) { pAcStatistics[0xF0]++; r -= 16; } if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } /* data -= 1; */ } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } if(ssss > 14) return ippStsJPEGDCTRangeErr; rs = (r << 4) + ssss; /* Count run-length of zeros and size of first non-zero AC coeff */ pAcStatistics[rs]++; r = 0; } /* if data != 0 */ } /* for i = 1...63 */ if(r > 0) { /* Emit End Of Block code */ pAcStatistics[0]++; } return ippStsNoErr; } /* mfxiGetHuffmanStatistics8x8_JPEG_16s_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenchuff.h000066400000000000000000000112541443134507600244320ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* ///////////////////////////// "pjenchuff.h" //////////////////////////////// // // Purpose: // */ #ifndef __PJENCHUFF_H__ #define __PJENCHUFF_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif #define MASK(nBits) \ ( (1 << (nBits)) - 1 ) /* /////////////////////////////////////////////////////////////////////////// // Name: // ownpjEncodeHuffmanSpec // // Purpose: // Encoder Huffman table in fast-to-use format // // Notes: // each hcs entry contain composite value. // Huffman code size (in bits) in high order 16 bit word // Huffman code in low order 16 bit word // */ typedef struct _ownpjEncodeHuffmanSpec { Ipp32u hcs[256]; } ownpjEncodeHuffmanSpec; /* /////////////////////////////////////////////////////////////////////////// // Name: // ownpjEncodeHuffmanState // // Purpose: // Huffman encoder state // // Fields: // // Notes: // */ typedef struct _ownpjEncodeHuffmanState { Ipp64u uBitBuffer; int nBitsValid; int nEndOfBlockRun; int nBE; Ipp8u pBEBuff[1024]; } ownpjEncodeHuffmanState; OWNAPI(IppStatus,mfxownpj_write_bits_jpeg,( const unsigned int uValue, const int nBits, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, ownpjEncodeHuffmanState* pState)); OWNAPI(void,mfxownpj_EncodeHuffmanStateInit,( ownpjEncodeHuffmanState* pState)); #if defined (_A6) || ( _IPP >= _IPP_W7 ) || ( _IPP32E >= _IPP32E_M7 ) ASMAPI(IppStatus,mfxownpj_EncodeHuffman8x8_JPEG_16s1u_C1,( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, Ipp16s* pLastDC, const ownpjEncodeHuffmanSpec* pDcTable, const ownpjEncodeHuffmanSpec* pAcTable, ownpjEncodeHuffmanState* pEncHuffState)); ASMAPI(IppStatus,mfxownpj_EncodeHuffman8x8_ACFirst_JPEG_16s1u_C1,( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const ownpjEncodeHuffmanSpec* pAcTable, ownpjEncodeHuffmanState* pEncHuffState)); ASMAPI(IppStatus,mfxownpj_EncodeHuffman8x8_ACFlush_JPEG_16s1u_C1,( Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, const ownpjEncodeHuffmanSpec* pAcTable, ownpjEncodeHuffmanState* pEncHuffState)); ASMAPI(IppStatus,mfxownpj_GetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1,( const Ipp16s* pSrc, int pAcStatistics[256], int Ss, int Se, int Al, ownpjEncodeHuffmanState* pEncHuffState)); ASMAPI(IppStatus,mfxownpj_GetHuffmanStatistics8x8_ACFlush_JPEG_16s_C1,( int pAcStatistics[256], ownpjEncodeHuffmanState* pEncHuffState)); ASMAPI(IppStatus,mfxownpj_EncodeHuffman8x8_ACRefine_JPEG_16s1u_C1,( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const ownpjEncodeHuffmanSpec* pAcTable, ownpjEncodeHuffmanState* pEncHuffState)); #endif #endif /* __PJENCHUFF_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenchuffls.c000066400000000000000000000132611443134507600247640ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // lossless Huffman entropy encoder // // Contents: // mfxiGetHuffmanStatisticsOne_JPEG_16s_C1 // mfxiEncodeHuffmanOne_JPEG_16s1u_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJENCHUFF_H__ #include "pjenchuff.h" #endif #undef CATEGORY_FROM_FPU /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatisticsOne_JPEG_16s_C1 // // Purpose: // count statistics for huffman values for particular differences // // Parameters: // pSrc pointer to input differences // pHuffStatistics pointer to accumulated huffman values statistics // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiGetHuffmanStatisticsOne_JPEG_16s_C1, ( const Ipp16s* pSrc, int pHuffStatistics[256])) { int data; int ssss; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pHuffStatistics); /* Encode sample */ data = pSrc[0]; if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } /* Count huffval Size of DC Coefficient */ if(ssss > 16) return ippStsRangeErr; pHuffStatistics[ssss]++; return ippStsNoErr; } /* mfxiGetHuffmanStatisticsOne_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffmanOne_JPEG_16s1u_C1 // // Purpose: // Huffman encode one lossless coefs // // Parameters: // pSrc pointer to input differences // pDst pointer to output JPEG bitstream // nDstLenBytes bitstream length, in bytes // pDstCurrPos pointer to current offset in buffer in bytes (in/out) // pHuffTable pointer to huffman lossless table // pDecHuffState pointer to Huffman state struct // bFlushState // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffmanOne_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, const IppiEncodeHuffmanSpec* pHuffTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { unsigned int cs; unsigned int uValue; int nBits; int data; int ssss; ownpjEncodeHuffmanSpec* huff_table = (ownpjEncodeHuffmanSpec*)pHuffTable; ownpjEncodeHuffmanState* pState = (ownpjEncodeHuffmanState*)pEncHuffState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pEncHuffState); if(bFlushState != 0) { status = mfxownpj_write_bits_jpeg(0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; } IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pHuffTable); #if ( _IPP >= _IPP_W7 ) if( (nDstLenBytes - *pDstCurrPos) >= 9 ) { if( !mfxownpj_EecodeHuffmanOne_JPEG_16s1u_C1( pSrc, pDst, pDstCurrPos, huff_table, pState ) ) { return ippStsNoErr; } } #endif #if defined (_I7) if( !mfxownpj_EecodeHuffmanOne_JPEG_16s1u_C1( pSrc, pDst, nDstLenBytes, pDstCurrPos, huff_table, pState ) ) { return ippStsNoErr; } #endif data = pSrc[0]; if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } data -= 1; } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } /* Encode Size of DC Coefficient */ cs = huff_table->hcs[ssss]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* Encode DC Coefficient Value */ /* (difference from previous value in this component) */ if(ssss != 0 && ssss < 16) { status = mfxownpj_write_bits_jpeg( data,ssss,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } Exit: return status; } /* mfxiEncodeHuffmanOne_JPEG_16s1u_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjenchuffp.c000066400000000000000000000735001443134507600246070ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Purpose: // progressive Huffman entropy encoder // // Contents: // mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1, // mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1, // mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1, // mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1, // mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1, // mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1, // mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1 // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJZIGZAG_H__ #include "pjzigzag.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #ifndef __PJENCHUFF_H__ #include "pjenchuff.h" #endif LOCFUN(int,mfxownpj_get_csize,( int data)) { int index; int ssss; index = data < 0 ? -data : data; if(index < 256) { ssss = mfxown_pj_csize[index]; } else { ssss = mfxown_pj_csize[index >> 8] + 8; } return ssss; } /* mfxownpj_get_csize() */ LOCFUN(int,mfxownpj_get_eobsize,( int EOBRUN)) { int ssss; if(EOBRUN < 256) { ssss = mfxown_pj_eobsize[EOBRUN]; } else { ssss = mfxown_pj_eobsize[EOBRUN >> 8] + 8; } return ssss; } /* mfxownpj_get_eobsize() */ LOCFUN(IppStatus,mfxownpj_count_eobrun,( int* pEOBRun, int pAcStatistics[256])) { int I; int SSSS; if(*pEOBRun == 0) { return ippStsNoErr; } if(*pEOBRun == 1) { pAcStatistics[0]++; /* EOB0 */ } else { if(*pEOBRun > 32767) { pAcStatistics[0xe0]++; /* EOB14 */ *pEOBRun -= 32767; } SSSS = mfxownpj_get_eobsize(*pEOBRun); /* 14 - is max category for EOB codes */ if(SSSS > 14) { return ippStsJPEGDCTRangeErr; } I = SSSS << 4; pAcStatistics[I]++; } *pEOBRun = 0; return ippStsNoErr; } /* mfxownpj_count_eobrun() */ /* ---------------------- library functions definitions -------------------- */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1, ( const Ipp16s* pSrc, int pDcStatistics[256], Ipp16s* pLastDC, int Al)) { int pt; int DIFF; int SSSS; IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pDcStatistics); IPP_BAD_PTR1_RET(pLastDC); OWN_BADARG_RET(Al < 0 || Al > 13); pt = pSrc[0] >> Al; DIFF = pt - *pLastDC; *pLastDC = (Ipp16s)pt; SSSS = mfxownpj_get_csize(DIFF); /* 11 - is max category for DC coefficient */ if(SSSS > 11) { return ippStsJPEGDCTRangeErr; } pDcStatistics[SSSS]++; return ippStsNoErr; } /* mfxiGetHuffmanStatistics8x8_DCFirst_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1, ( const Ipp16s* pSrc, int pAcStatistics[256], int Ss, int Se, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { int k; int r; int temp; int nBits; ownpjEncodeHuffmanState* pState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pAcStatistics); IPP_BAD_PTR1_RET(pEncHuffState); pState = (ownpjEncodeHuffmanState*)pEncHuffState; if(bFlushState != 0) { /* count EOBRUN */ status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); mfxownpj_EncodeHuffmanStateInit(pState); return status; } IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ r = 0; /* r = run length of zeros */ for(k = Ss; k <= Se; k++) { temp = pSrc[mfxown_pj_izigzag_index[k]]; if(temp == 0) { r++; continue; } /* We must apply the point transform by Al. For AC coefficients this */ /* is an integer division with rounding towards 0. To do this portably */ /* in C, we shift after obtaining the absolute value; so the code is */ /* interwoven with finding the abs value (temp) and output bits (temp2) */ if(temp < 0) { temp = -temp; /* temp is abs value of input */ temp >>= Al; /* apply the point transform */ } else { temp >>= Al; /* apply the point transform */ } /* Watch out for case that nonzero coef is zero after point transform */ if(temp == 0) { r++; continue; } /* count EOBRUN */ status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); if(ippStsNoErr != status) { return status; } /* if run length > 15, must emit special run-length-16 codes (0xF0) */ while(r > 15) { pAcStatistics[0xf0]++; r -= 16; } /* Find the number of bits needed for the magnitude of the coefficient */ /* there must be at least one 1 bit */ nBits = 1; while((temp >>= 1)) { nBits++; } /* Check for out-of-range coefficient values */ if(nBits > 10) { return ippStsJPEGDCTRangeErr; } /* Count Huffman symbol for run length / number of bits */ pAcStatistics[(r << 4) + nBits]++; /* reset zero run length */ r = 0; } if(r > 0) { /* If there are trailing zeroes, */ /* count an EOB */ pState->nEndOfBlockRun++; if(pState->nEndOfBlockRun == 32767) { status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); if(ippStsNoErr != status) { return status; } } } return status; } /* mfxiGetHuffmanStatistics8x8_ACFirst_JPEG_16s_C1() */ #define MAX_CORR_BITS 1000 /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1, ( const Ipp16s* pSrc, int pAcStatistics[256], int Ss, int Se, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { #if !( _IPP >= _IPP_A6 ) && !( _IPP32E >= _IPP32E_M7 )/**/ int r; int k; int temp; int nEOB; int nBE; int nBR; /*Ipp8u* pBRBuffer = NULL;*/ int absvalues[DCTSIZE2]; #endif IppStatus status = ippStsNoErr; ownpjEncodeHuffmanState* pState; pState = (ownpjEncodeHuffmanState*)pEncHuffState; IPP_BAD_PTR1_RET(pAcStatistics); IPP_BAD_PTR1_RET(pEncHuffState); if(bFlushState != 0) { #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ return mfxownpj_GetHuffmanStatistics8x8_ACFlush_JPEG_16s_C1( pAcStatistics,pState); #else /* count EOBRUN */ status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; #endif } IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); /* It is convenient to make a pre-pass to determine the transformed */ /* coefficients' absolute values and the EOB position. */ #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ status = mfxownpj_GetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1( pSrc,pAcStatistics,Ss,Se,Al,pState); #else nBE = pState->nBE; nEOB = 0; for(k = Ss; k <= Se; k++) { temp = pSrc[mfxown_pj_izigzag_index[k]]; /* We must apply the point transform by Al. For AC coefficients this */ /* is an integer division with rounding towards 0. To do this portably */ /* in C, we shift after obtaining the absolute value. */ /* temp is abs value of input */ if(temp < 0) { temp = -temp; } /* apply the point transform */ temp >>= Al; /* save abs value for main pass */ absvalues[k] = temp; /* EOB = index of last newly-nonzero coef */ if(temp == 1) { nEOB = k; } } /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ r = 0; /* r = run length of zeros */ nBR = 0; /* BR = count of buffered bits added now */ /*pBRBuffer = pState->pBEBuff + nBE;*/ /* Append bits to buffer */ for(k = Ss; k <= Se; k++) { temp = absvalues[k]; if(temp == 0) { r++; continue; } /* Emit any required ZRLs, but not if they can be folded into EOB */ while(r > 15 && k <= nEOB) { /* count EOBRUN */ status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); if(ippStsNoErr != status) { return status; } /* Emit any buffered correction bits */ /* nothing to do */ nBE = 0; /* Emit ZRL */ while(r > 15) { pAcStatistics[0xf0]++; r -= 16; } /* Emit buffered correction bits that must be associated with ZRL */ /* nothing to do */ /* BE bits are gone now */ /*pBRBuffer = pState->pBEBuff;*/ nBR = 0; } /* If the coef was previously nonzero, it only needs a correction bit. */ /* NOTE: a straight translation of the spec's figure G.7 would suggest */ /* that we also need to test r > 15. But if r > 15, we can only get here */ /* if k > EOB, which implies that this coefficient is not 1. */ if(temp > 1) { /* The correction bit is the next bit of the absolute value. */ /*pBRBuffer[nBR] = (Ipp8u)(temp & 1);*/ nBR++; continue; } /* count EOBRUN */ status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); if(ippStsNoErr != status) { return status; } /* Emit any buffered correction bits */ /* nothing to do */ nBE = 0; /* Count/emit Huffman symbol for run length / number of bits */ pAcStatistics[(r << 4) + 1]++; /* Emit output bit for newly-nonzero coef */ /* nothing to do */ /* Emit buffered correction bits that must be associated with this code */ /* nothing to do */ /* BE bits are gone now */ /*pBRBuffer = pState->pBEBuff;*/ nBR = 0; /* reset zero run length */ r = 0; } /* If there are trailing zeroes */ if(r > 0 || nBR > 0) { /* count an EOB */ pState->nEndOfBlockRun++; /* concat my correction bits to older ones */ nBE += nBR; /* We force out the EOB if we risk either: */ /* 1. overflow of the EOB counter; */ /* 2. overflow of the correction bit buffer during the next MCU. */ if((pState->nEndOfBlockRun == 32767) || (nBE > (MAX_CORR_BITS - DCTSIZE2 + 1))) { status = mfxownpj_count_eobrun(&pState->nEndOfBlockRun,pAcStatistics); if(ippStsNoErr != status) { return status; } /* Emit any buffered correction bits */ /* nothing to do */ nBE = 0; } } pState->nBE = nBE; Exit: #endif return status; } /* mfxiGetHuffmanStatistics8x8_ACRefine_JPEG_16s_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, Ipp16s* pLastDc, int Al, const IppiEncodeHuffmanSpec* pDcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { int pt; int data; int ssss; unsigned int cs; unsigned int uValue; int nBits; ownpjEncodeHuffmanSpec* dc_table; ownpjEncodeHuffmanState* pState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pEncHuffState); dc_table = (ownpjEncodeHuffmanSpec*)pDcTable; pState = (ownpjEncodeHuffmanState*)pEncHuffState; if(bFlushState != 0) { status = mfxownpj_write_bits_jpeg( 0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; } IPP_BAD_PTR1_RET(pSrc); IPP_BAD_PTR1_RET(pLastDc); OWN_BADARG_RET(Al < 0 || Al > 13); IPP_BAD_PTR1_RET(pDcTable); /*////////////////////////////////////////////////////////////////////// // Encode DC Coefficient */ pt = pSrc[0] >> Al; data = pt - *pLastDc; *pLastDc = (Ipp16s)pt; if(data < 0) { if(data > -256) { ssss = mfxown_pj_csize[-data]; } else { ssss = mfxown_pj_csize[(-data) >> 8] + 8; } data -= 1; } else { if(data < 256) { ssss = mfxown_pj_csize[data]; } else { ssss = mfxown_pj_csize[data >> 8] + 8; } } /*////////////////////////////////////////////////////////////////////// // Encode Size of DC Coefficient */ /* 11 - is max category for DC coefficient */ if(ssss > 11) { status = ippStsJPEGDCTRangeErr; goto Exit; } cs = dc_table->hcs[ssss]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /*////////////////////////////////////////////////////////////////////// // Encode DC Coefficient Value // (difference from previous value in this component) */ uValue = data; nBits = ssss; if(nBits) { status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } Exit: return status; } /* mfxiEncodeHuffman8x8_DCFirst_JPEG_16s1u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, int Al, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { ownpjEncodeHuffmanState* pState; IppStatus status = ippStsNoErr; IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pEncHuffState); pState = (ownpjEncodeHuffmanState*)pEncHuffState; if(bFlushState != 0) { status = mfxownpj_write_bits_jpeg( 0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; } IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(Al < 0 || Al > 13); status = mfxownpj_write_bits_jpeg( pSrc[0] >> Al,1,pDst,nDstLenBytes,pDstCurrPos,pState); Exit: return status; } /* mfxiEncodeHuffman8x8_DCRefine_JPEG_16s1u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { #if !( _IPP >= _IPP_A6 ) && !( _IPP32E >= _IPP32E_M7 )/**/ int k; int r; int tmp; int tmp2; int ssss; int i; unsigned int cs; unsigned int uValue; int nBits; ownpjEncodeHuffmanSpec* ac_table; ownpjEncodeHuffmanState* pState; IppStatus status = ippStsNoErr; #endif IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pAcTable); IPP_BAD_PTR1_RET(pEncHuffState); #if !( _IPP >= _IPP_A6 ) && !( _IPP32E >= _IPP32E_M7 )/**/ ac_table = (ownpjEncodeHuffmanSpec*)pAcTable; pState = (ownpjEncodeHuffmanState*)pEncHuffState; #endif if(bFlushState != 0) { #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ return mfxownpj_EncodeHuffman8x8_ACFlush_JPEG_16s1u_C1( pDst, nDstLenBytes, pDstCurrPos, (ownpjEncodeHuffmanSpec*)pAcTable, (ownpjEncodeHuffmanState*)pEncHuffState); #else status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Flush; } /* and the BE correction bits */ status = mfxownpj_AppendBits( pState->pBEBuff,&pState->nBE,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Flush; } Flush: status = mfxownpj_write_bits_jpeg( 0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); mfxownpj_EncodeHuffmanStateInit(pState); goto Exit; #endif } IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); /*//////////////////////////////////////////////////////////////////////// // Encoding of the AC coefficients, see section G.1.2.2, fig. G.3 */ #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ return mfxownpj_EncodeHuffman8x8_ACFirst_JPEG_16s1u_C1( pSrc, pDst, nDstLenBytes, pDstCurrPos, Ss, Se, Al, (ownpjEncodeHuffmanSpec*)pAcTable, (ownpjEncodeHuffmanState*)pEncHuffState); #else /* r = run length of zeros */ r = 0; for(k = Ss; k <= Se; k++) { tmp = pSrc[mfxown_pj_izigzag_index[k]]; if(tmp == 0) { r++; continue; } /* // We need to apply the point transform by Al. It is an integer division // with rounding towards 0 for AC coefficients. We do this by shifting // after obtaining the absolute value to make it portable in C; */ if(tmp < 0) { tmp = -tmp; /* tmp is abs value of input */ tmp >>= Al; /* do the point transform */ /* tmp2 = bitwise complement of abs(coef) for a negative coefficients */ tmp2 = ~tmp; } else { tmp >>= Al; /* do the point transform */ tmp2 = tmp; } /* when nonzero coefficient becames zero after point transform */ if(tmp == 0) { r++; continue; } /* if there is any pending EOBRUN code emit it */ status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Exit; } /* if run length > 15, must emit special run-length-16 codes (0xf0) */ while(r > 15) { cs = ac_table->hcs[0xf0]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } r -= 16; } /* Find the number of bits needed for the magnitude of the coefficient */ /* there must be at least one 1 bit */ ssss = 1; while((tmp >>= 1)) ssss++; /* Check for out-of-range coefficient values */ if(ssss > 11) { status = ippStsJPEGDCTRangeErr; goto Exit; } i = (r << 4) + ssss; /* 256 entries in tables */ if(i > 256) { status = ippStsErr; goto Exit; } cs = ac_table->hcs[i]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } uValue = tmp2; nBits = ssss; if(nBits) { status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } } /* reset zero run length */ r = 0; } if(r > 0) { /* If there are trailing zeroes, count an EOB */ pState->nEndOfBlockRun++; if(pState->nEndOfBlockRun == 0x7fff) { status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Exit; } } } Exit: return status; #endif } /* mfxiEncodeHuffman8x8_ACFirst_JPEG_16s1u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1 // // Purpose: // // Parameters: // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1, ( const Ipp16s* pSrc, Ipp8u* pDst, int nDstLenBytes, int* pDstCurrPos, int Ss, int Se, int Al, const IppiEncodeHuffmanSpec* pAcTable, IppiEncodeHuffmanState* pEncHuffState, int bFlushState)) { #if !( _IPP >= _IPP_A6 ) && !( _IPP32E >= _IPP32E_M7 )/**/ int r, k; unsigned int cs; unsigned int uValue; int nBits; int tmp; int nEOB; int nBE; int nBR; int absvalues[DCTSIZE2]; ownpjEncodeHuffmanSpec* ac_table; ownpjEncodeHuffmanState* pState; IppStatus status = ippStsNoErr; IppStatus status1 = ippStsNoErr; Ipp8u* pBRBuffer = NULL; #endif IPP_BAD_PTR1_RET(pDst); IPP_BAD_SIZE_RET(nDstLenBytes); IPP_BAD_PTR1_RET(pDstCurrPos); IPP_BAD_PTR1_RET(pAcTable); IPP_BAD_PTR1_RET(pEncHuffState); #if !( _IPP >= _IPP_A6 ) && !( _IPP32E >= _IPP32E_M7 )/**/ ac_table = (ownpjEncodeHuffmanSpec*)pAcTable; pState = (ownpjEncodeHuffmanState*)pEncHuffState; nBE = pState->nBE; #endif if(bFlushState != 0) { #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ return mfxownpj_EncodeHuffman8x8_ACFlush_JPEG_16s1u_C1( pDst, nDstLenBytes, pDstCurrPos, (ownpjEncodeHuffmanSpec*)pAcTable, (ownpjEncodeHuffmanState*)pEncHuffState); #else status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Flush; } /* and the BE correction bits */ status = mfxownpj_AppendBits( pState->pBEBuff,&pState->nBE,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Flush; } Flush: status1 = mfxownpj_write_bits_jpeg( 0x7f,7,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status1) { /* 21.05.02: returns the last error */ status = status1; } mfxownpj_EncodeHuffmanStateInit(pState); return status; #endif } IPP_BAD_PTR1_RET(pSrc); OWN_BADARG_RET(Ss < 1 || Ss > 63); OWN_BADARG_RET(Se < Ss || Se > 63); OWN_BADARG_RET(Al < 0 || Al > 13); /* It is convenient to make a pre-pass to determine the transformed */ /* coefficients' absolute values and the EOB position. */ #if ( _IPP >= _IPP_A6 ) || ( _IPP32E >= _IPP32E_M7 )/**/ return mfxownpj_EncodeHuffman8x8_ACRefine_JPEG_16s1u_C1( pSrc, pDst, nDstLenBytes, pDstCurrPos, Ss, Se, Al, (ownpjEncodeHuffmanSpec*)pAcTable, (ownpjEncodeHuffmanState*)pEncHuffState); #else nEOB = 0; for(k = Ss; k <= Se; k++) { tmp = pSrc[mfxown_pj_izigzag_index[k]]; /* Apply the point transform by Al. For AC coefficients this */ /* is an integer division with rounding towards 0. */ /* tmp is abs value of input */ if(tmp < 0) { tmp = -tmp; } /* do the point transform */ tmp >>= Al; /* save abs value for main pass */ absvalues[k] = tmp; /* EOB = index of last newly-nonzero coef */ if(tmp == 1) { nEOB = k; } } /* Encoding of the AC coefficients,see section G.1.2.3, fig. G.7 */ r = 0; /* r = run length of zeros */ nBR = 0; /* BR = count of buffered bits added now */ nBE = pState->nBE; pBRBuffer = pState->pBEBuff + nBE; /* Append bits to buffer */ for(k = Ss; k <= Se; k++) { tmp = absvalues[k]; if(tmp == 0) { r++; continue; } /* Emit required ZRLs if any, but not if they can be folded into EOB */ while(r > 15 && k <= nEOB) { /* emit pending EOBRUN if any */ status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Exit; } /* and the BE correction bits */ status = mfxownpj_AppendBits( pState->pBEBuff,&nBE,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } nBE = 0; /* Emit ZRL */ cs = ac_table->hcs[0xf0]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } r -= 16; /* Emit buffered correction bits which must be associated with ZRL */ status = mfxownpj_AppendBits( pBRBuffer,&nBR,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } pBRBuffer = pState->pBEBuff; nBR = 0; } /* // If the coefficient was previously nonzero, it only needs a correction // bit. */ if(tmp > 1) { /* correction bit is the next bit of the absolute value. */ pBRBuffer[nBR] = (Ipp8u)(tmp & 1); nBR++; continue; } /* Emit pending EOBRUN if any */ status = mfxownpj_encode_eobrun(pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Exit; } /* Emit the BE correction bits */ status = mfxownpj_AppendBits( pState->pBEBuff,&nBE,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } nBE = 0; /* Emit Huffman symbol for run length / number of bits */ cs = ac_table->hcs[(r << 4) + 1]; uValue = cs & 0xffff; nBits = cs >> 16; status = mfxownpj_write_bits_jpeg( uValue,nBits,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* Emit output bit for newly-nonzero coefficient */ tmp = (pSrc[mfxown_pj_izigzag_index[k]] < 0) ? 0 : 1; status = mfxownpj_write_bits_jpeg(tmp,1,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* Emit buffered correction bits which must be associated with this code */ status = mfxownpj_AppendBits( pBRBuffer,&nBR,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } /* BE bits are gone now */ pBRBuffer = pState->pBEBuff; nBR = 0; /* reset zero run length */ r = 0; } /* If there are trailing zeroes */ if(r > 0 || nBR > 0) { /* count an EOB */ pState->nEndOfBlockRun++; /* concat my correction bits to older ones */ nBE += nBR; /* Force the EOB generation if one of the following conditions: */ /* 1. overflowing of the EOB counter; */ /* 2. overflowing of the correction bit buffer during the next MCU. */ if((pState->nEndOfBlockRun == 0x7FFF) || (nBE > (MAX_CORR_BITS-DCTSIZE2+1))) { status = mfxownpj_encode_eobrun( pDst,nDstLenBytes,pDstCurrPos,ac_table,pState); if(ippStsNoErr != status) { goto Exit; } /* append BE bits */ status = mfxownpj_AppendBits( pState->pBEBuff,&nBE,pDst,nDstLenBytes,pDstCurrPos,pState); if(ippStsNoErr != status) { goto Exit; } nBE = 0; } } Exit: pState->nBE = nBE; return status; #endif } /* mfxiEncodeHuffman8x8_ACRefine_JPEG_16s1u_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencqnt.c000066400000000000000000000100271443134507600242740ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Quantization functions (Forward transform) // // Contents: // mfxiQuantFwdRawTableInit_JPEG_8u // mfxiQuantFwdTableInit_JPEG_16s // mfxiQuantFwd8x8_JPEG_16s_C1I // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PS_ANARITH_H__ #include "ps_anarith.h" #endif #ifndef __PJQUANT_H__ #include "pjquant.h" #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantFwdRawTableInit_JPEG_8u // // Purpose: // Adjust raw quantization table according quality factor // // Parameters: // pRawQuantTable - pointer to raw Quantization table // qualityFactor - JPEG quality factor (valid range 1...100) // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiQuantFwdRawTableInit_JPEG_8u, ( Ipp8u* pQuantRawTable, int qualityFactor)) { int i; int val; IPP_BAD_PTR1_RET(pQuantRawTable); IPP_BADARG_RET(qualityFactor <= 0,ippStsBadArgErr); // The basic table is used as-is (scaling 100) for a quality of 50. // Qualities 50..100 are converted to scaling percentage 200 - 2*Q; // note that at Q=100 the scaling is 0, which will cause // all the table entries 1 (hence, minimum quantization loss). // Qualities 1..50 are converted to scaling percentage 5000/Q. if(qualityFactor < 50) qualityFactor = 5000 / qualityFactor; else qualityFactor = 200 - (qualityFactor * 2); for(i = 0; i < DCTSIZE2; i++) { val = (pQuantRawTable[i] * qualityFactor + 50) / 100; if(val < 1) { pQuantRawTable[i] = (Ipp8u)1; } else if(val > 255) { pQuantRawTable[i] = (Ipp8u)255; } else { pQuantRawTable[i] = (Ipp8u)val; } } return ippStsNoErr; } /* mfxiQuantFwdRawTableInit_JPEG_8u() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiQuantFwdTableInit_JPEG_8u16u // // Purpose: // Build Quantization table for encoder // in fast-to-use format from raw Quantization table // // Parameter: // pQuantRawTable - pointer to "raw" Quantization table // pQuantFwdTable - pointer to Quantization table // to be initialized // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiQuantFwdTableInit_JPEG_8u16u, ( const Ipp8u* pQuantRawTable, Ipp16u* pQuantFwdTable)) { IppiSize roi; IppStatus status; Ipp16u wb[DCTSIZE2]; IPP_BAD_PTR2_RET(pQuantRawTable,pQuantFwdTable); roi.width = 8; roi.height = 8; status = mfxiConvert_8u16u_C1R(pQuantRawTable,8,&wb[0],8*2,roi); if(ippStsNoErr != status) { return status; } status = mfxiZigzagInv8x8_16s_C1((const Ipp16s*)&wb[0],(Ipp16s*)pQuantFwdTable); if(ippStsNoErr != status) { return status; } status = mfxsDivCRev_16u_I((1 << QUANT_BITS),pQuantFwdTable,DCTSIZE2); if(ippStsNoErr != status) { return status; } return ippStsNoErr; } /* mfxiQuantFwdTableInit_JPEG_8u16u() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencss.c000066400000000000000000000106741443134507600241270ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Downsampling functions // // Contents: // mfxiSampleDownH2V1_JPEG_8u_C1R // mfxiSampleDownH2V2_JPEG_8u_C1R // */ #include "precomp.h" #ifdef _OPENMP #include #endif #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCSS_H__ #include "pjencss.h" #endif /* ---------------------- library functions definitions -------------------- */ /* //////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownH2V1_JPEG_8u_C1R // // Purpose: // Sample down by horizontal 2:1 // // Parameter: // pSrc pointer to input data // srcStep line offset in input data // srcSize ROI size // pDst pointer to output array // dstStep line offset in output data // dstSize ROI size // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiSampleDownH2V1_JPEG_8u_C1R, ( const Ipp8u* pSrc, int srcStep, IppiSize srcSize, Ipp8u* pDst, int dstStep, IppiSize dstSize)) { int i; IPP_BAD_ENC_SS_C1C1_RET(); #ifndef _W7 #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,srcStep,pDst,dstStep,dstSize) \ private(i) default(none) \ if((dstSize.height*dstSize.width) > (OMP_BOUNDARY)) #endif #endif for(i = 0; i < dstSize.height; i++) { const Ipp8u* src = pSrc + i * srcStep; Ipp8u* dst = pDst + i * dstStep; #if (_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7) || (_IPPLRB>=_IPPLRB_B1) mfxownpj_SampleDownH2V1_JPEG_8u_C1(src,dst,dstSize.width); #else { int j, k; for(k = 0, j = 0; j < dstSize.width; j++, k += 2) { dst[j] = (Ipp8u)((src[k + 0] + src[k + 1] + 1) >> 1); } } #endif } return ippStsNoErr; } /* mfxiSampleDownH2V1_JPEG_8u_C1R() */ /* //////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownH2V2_JPEG_8u_C1R // // Purpose: // Sample down by horizontal 2:1 and vertical 2:1 // // Parameter: // pSrc pointer to input data // srcStep line offset in input data // srcSize ROI size // pDst pointer to output array // dstStep line offset in output data // dstSize ROI size // // Returns: // IppStatus // // Notes: // */ IPPFUN(IppStatus, mfxiSampleDownH2V2_JPEG_8u_C1R, ( const Ipp8u* pSrc, int srcStep, IppiSize srcSize, Ipp8u* pDst, int dstStep, IppiSize dstSize)) { int i; IPP_BAD_ENC_SS_C1C1_RET(); #ifdef _OPENMP #pragma omp parallel for IPP_OMP_NUM_THREADS() \ shared(pSrc,srcStep,pDst,dstStep,dstSize) \ private(i) default(none) \ if((dstSize.height*dstSize.width) > (OMP_BOUNDARY)) #endif for(i = 0; i < dstSize.height; i++) { const Ipp8u* src = pSrc + i * (srcStep << 1); Ipp8u* dst = pDst + i * dstStep; #if (_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7) || (_IPPLRB>=_IPPLRB_B1) mfxownpj_SampleDownH2V2_JPEG_8u_C1(src,srcStep,dst,dstSize.width); #else { int j, k; for(k = 0, j = 0; j < dstSize.width; j++, k += 2) { dst[j] = (Ipp8u) ((src[k + 0 + 0*srcStep] + src[k + 1 + 0*srcStep] + src[k + 0 + 1*srcStep] + src[k + 1 + 1*srcStep] + 3) >> 2); } } #endif } return ippStsNoErr; } /* mfxiSampleDownH2V2_JPEG_8u_C1R() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencss.h000066400000000000000000000047561443134507600241400ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Downsampling functions // */ #ifndef __PJENCSS_H__ #define __PJENCSS_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif /* ---------------------- check input parameters --------------------------- */ #define IPP_BAD_ENC_SS_C1C1_RET() \ IPP_BAD_PTR1_RET(pSrc) \ IPP_BAD_STEP_RET(srcStep) \ IPP_BAD_SIZE_RET(srcSize.width) \ IPP_BAD_SIZE_RET(srcSize.height) \ IPP_BAD_PTR1_RET(pDst) \ IPP_BAD_STEP_RET(dstStep) \ IPP_BAD_SIZE_RET(dstSize.width) \ IPP_BAD_SIZE_RET(dstSize.height) /* --------------------- external functions declarations ------------------ */ #define IPPJ_ENCSS_OPT \ ((_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7) || (_IPPLRB>=_IPPLRB_B1)) #if IPPJ_ENCSS_OPT || (_IPPXSC >= _IPPXSC_S2) ASMAPI(void,mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1,( const Ipp8u*, int, Ipp8u*)); ASMAPI(void,mfxownpj_SampleDownRowH2V2_Box_JPEG_8u_C1,( const Ipp8u*, const Ipp8u*, int, Ipp8u*)); #if IPPJ_ENCSS_OPT ASMAPI(void,mfxownpj_SampleDownH2V1_JPEG_8u_C1,( const Ipp8u*, Ipp8u*, int)); ASMAPI(void,mfxownpj_SampleDownH2V2_JPEG_8u_C1,( const Ipp8u*, int, Ipp8u*, int)); #endif #endif #if (_IPP >= _IPP_W7) ASMAPI(void,mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1_w7,( const Ipp8u*, int, Ipp8u*)); #endif #endif /* __PJENCSS_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjencss0.c000066400000000000000000000100071443134507600241750ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // Downsampling functions // // Contents: // mfxiSampleDownRowH2V1_Box_JPEG_8u_C1 // mfxiSampleDownRowH2V2_Box_JPEG_8u_C1 // */ #include "precomp.h" #ifdef _OPENMP #include #endif #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJENCSS_H__ #include "pjencss.h" #endif /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownRowH2V1_Box_JPEG_8u_C1 // // Purpose: // Sample down by horizontal 2:1 // // Parameters: // pSrc pointer to source row // srcWidth width of source row // pDst pointer to sampled down output row // // Returns: // IppStatus // // Notes: // Downsampling is performed as simple "Box" filter */ IPPFUN(IppStatus, mfxiSampleDownRowH2V1_Box_JPEG_8u_C1, ( const Ipp8u* pSrc, int srcWidth, Ipp8u* pDst)) { IppStatus retStat = ippStsNoErr; /* Check if srcWidth is uneven */ if(srcWidth & 0x01) { srcWidth &= ~1; /* Make source width one byte less */ retStat = ippStsSizeWrn; /* If srcWidth is 1, it will fail as "bad size" */ } IPP_BAD_PTR2_RET(pSrc,pDst) IPP_BAD_SIZE_RET(srcWidth) #if IPPJ_ENCSS_OPT || (_IPPXSC >= _IPPXSC_S2) #if (_IPP == _IPP_W7) if(srcWidth < 512) mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1(pSrc,srcWidth,pDst); else mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1_w7(pSrc,srcWidth,pDst); #else mfxownpj_SampleDownRowH2V1_Box_JPEG_8u_C1(pSrc,srcWidth,pDst); #endif #else { int i; int bias = 0; for(i = 0; i < srcWidth; i += 2) { *pDst++ = (Ipp8u)((pSrc[i+0] + pSrc[i+1] + bias) >> 1); bias ^= 1; /* bias = 0,1,0,1,... for successive samples */ } } #endif return retStat; } /* mfxiSampleDownRowH2V1_Box_JPEG_8u_C1() */ /* /////////////////////////////////////////////////////////////////////////// // Name: // mfxiSampleDownRowH2V2_Box_JPEG_8u_C1 // // Purpose: // Sample down by horizontal 2:1 and vertical 2:1 // // Parameters: // pSrc1 pointer to the source row // pSrc2 pointer to the next row // srcWidth width of source rows // pDst pointer to sampled down output row // // Returns: // IppStatus // // Notes: // Downsampling is performed as simple "Box" filter */ IPPFUN(IppStatus, mfxiSampleDownRowH2V2_Box_JPEG_8u_C1, ( const Ipp8u* pSrc1, const Ipp8u* pSrc2, int srcWidth, Ipp8u* pDst)) { IPP_BAD_PTR3_RET(pSrc1,pSrc2,pDst) IPP_BAD_SIZE_RET(srcWidth) #if IPPJ_ENCSS_OPT || (_IPPXSC >= _IPPXSC_S2) if(srcWidth > 31) { mfxownpj_SampleDownRowH2V2_Box_JPEG_8u_C1(pSrc1,pSrc2,srcWidth,pDst); } else #endif { int i; int bias = 1; for(i = 0; i < srcWidth; i += 2) { *pDst++ = (Ipp8u)((pSrc1[i+0] + pSrc1[i+1] + pSrc2[i+0] + pSrc2[i+1] + bias) >> 2); bias ^= 3; /* bias = 1,2,1,2,... for successive samples */ } } return ippStsNoErr; } /* mfxiSampleDownRowH2V2_Box_JPEG_8u_C1() */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjhufftbl.c000066400000000000000000000120271443134507600244400ustar00rootroot00000000000000// Copyright (c) 2019 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Purpose: // common Huffman tables // */ #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJHUFFTBL_H__ #include "pjhufftbl.h" #endif #if ((_IPP == _IPP_PX) && (_IPP32E == _IPP32E_PX) && (_IPP64 == _IPP64_PX) && \ (_IPPLP32 == _IPPLP32_PX) && (_IPPLP64 == _IPPLP64_PX) && defined(_MERGED_BLD)) || !defined(_MERGED_BLD) #define MINUS_ONE (-1u) /* entry i is 2**(i-1) */ const int mfxown_pj_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; /* entry i is (-1 << i) + 1 */ const int mfxown_pj_extend_offset[16] = { 0, (MINUS_ONE << 1) + 1, (MINUS_ONE << 2) + 1, (MINUS_ONE << 3) + 1, (MINUS_ONE << 4) + 1, (MINUS_ONE << 5) + 1, (MINUS_ONE << 6) + 1, (MINUS_ONE << 7) + 1, (MINUS_ONE << 8) + 1, (MINUS_ONE << 9) + 1, (MINUS_ONE << 10) + 1, (MINUS_ONE << 11) + 1, (MINUS_ONE << 12) + 1, (MINUS_ONE << 13) + 1, (MINUS_ONE << 14) + 1, (MINUS_ONE << 15) + 1 }; /* The csize array is a way to calculate the length (in bytes) */ /* of the lsb's of an 8-bit signed value. */ const int mfxown_pj_csize[] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; const int mfxown_pj_eobsize[] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; const int mfxown_pj_lowest_coef[] = { /* lowest AC coef. given i */ 0, -1, -3, -7, -15, -31, -63, -127, -255, -511, -1023, -2047, -4095, -8191, -16383, -32767 }; #endif /* _MERGED_BLD */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjhufftbl.h000066400000000000000000000035421443134507600244470ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __PJHUFFTBL_H__ #define __PJHUFFTBL_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif /* // Figure F.12: extend sign bit. // sometime, a shift and add faster than a table lookup. */ #undef AVOID_TABLES #ifdef AVOID_TABLES #define mfxownpj_huff_extend(x,s) \ ((x) < (1 << ((s) - 1)) ? (x) + (((-1) << (s)) + 1) : (x)) #else /* entry i is 2**(i-1) */ extern const int mfxown_pj_extend_test[16]; /* entry i is (-1 << i) + 1 */ extern const int mfxown_pj_extend_offset[16]; #define mfxownpj_huff_extend(x,s) \ ((x) < mfxown_pj_extend_test[s] ? (x) + mfxown_pj_extend_offset[s] : (x)) #endif /* AVOID_TABLES */ extern const int mfxown_pj_eobsize[]; extern const int mfxown_pj_csize[]; extern const int mfxown_pj_lowest_coef[]; #endif /* __PJHUFFTBL_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjname.h000066400000000000000000000036241443134507600237360ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* //////////////////////////////// "pjname.h" //////////////////////////////// // // Purpose: // */ #ifndef __PJNAME_H__ #define __PJNAME_H__ /* // The prefix of library without the quotes. The prefix is directly used // to generate the GetLibVersion function. It is used to generate the names in // the dispatcher code, in the version description and in the resource file. */ #define LIB_PREFIX mfxj /* Short name of library. It is used in the resource file only */ #define IPP_LIB_LONGNAME() "JPEG processing" #define IPP_LIB_SHORTNAME() "ippJP" #define GET_STR2(x) #x #define GET_STR(x) GET_STR2(x) #define IPP_LIB_PREFIX() GET_STR(LIB_PREFIX) #define IPP_INC_NAME() "ippj.h" #endif /* __PJNAME_H__ */ /* //////////////////////// End of file "pjname.h" ///////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjquant.h000066400000000000000000000035251443134507600241460ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __PJQUANT_H__ #define __PJQUANT_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif #define QUANT_BITS 15 #define IPPJ_QNT_OPT \ ((_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7)) #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ASMAPI(void,mfxownpj_QuantInv_8x8_16s_I,( Ipp16s* pSrcDst, const Ipp16u* pQTbl)); #endif #if IPPJ_QNT_OPT || (_IPPXSC >= _IPPXSC_S2) ASMAPI(void,mfxownpj_QuantInv_8x8_16s,( Ipp16s* pSrc, Ipp16s* pDst, const Ipp16u* pQTbl)); #endif #if (_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPPXSC >= _IPPXSC_S2) ASMAPI(void,mfxownpj_QuantFwd_8x8_Sfs15_16s,( Ipp16s* pSrc, Ipp16s* pDst, const Ipp16u* pQTbl)); #endif #endif /* __PJQUANT_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjver.h000066400000000000000000000026031443134507600236060ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* /////////////////////////////// "pjver.h" ///////////////////////////////// // // Purpose: Describes the version of ippj // */ #include "ippver.h" #define BUILD() 1061 #define VERSION() BASE_VERSION(),BUILD() /* //////////////////////// End of file "pjver.h" ///////////////////////// */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjzigzag.c000066400000000000000000000034111443134507600242760ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "precomp.h" #ifndef __OWNJ_H__ #include "ownj.h" #endif #ifndef __PJZIGZAG_H__ #include "pjzigzag.h" #endif #if ((_IPP == _IPP_PX) && (_IPP32E == _IPP32E_PX) && (_IPP64 == _IPP64_PX) && \ (_IPPLP32 == _IPPLP32_PX) && (_IPPLP64 == _IPPLP64_PX) && defined(_MERGED_BLD)) || !defined(_MERGED_BLD) const int mfxown_pj_izigzag_index[] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63 }; #endif /* _MERGED_BLD */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pjzigzag.h000066400000000000000000000024051443134507600243050ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __PJZIGZAG_H__ #define __PJZIGZAG_H__ #ifndef __OWNJ_H__ #include "ownj.h" #endif extern const int mfxown_pj_izigzag_index[]; #endif /* __PJZIGZAG_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/precomp.h000066400000000000000000000023131443134507600241230ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef __PRECOMP_H__ #define __PRECOMP_H__ #include #include "ownj.h" #endif /* __PRECOMP_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/ps_anarith.h000066400000000000000000000032301443134507600246050ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose: Common header file for IPPs arithmetic functions // *M*/ #if !defined(__PS_ANARITH_H__) #define __PS_ANARITH_H__ #if !defined(__OWNS_H__) #include "owns.h" #endif /* __OWNS_H__ */ #if (_IPP64 >= _IPP64_I7) #define IF_I7(EXP) if(EXP) { #define ENDIF_I7 } #define ELSE_I7 } else { #else #define IF_I7(EXP) #define ENDIF_I7 #define ELSE_I7 #endif extern void mfxownsMulC_16s_I (Ipp16s val, Ipp16s* pSrcDst, int len); extern void mfxownsMul_16s_I (const Ipp16s* pSrc, Ipp16s* pSrcDst, int len); #endif /* __PS_ANARITH_H__ */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pscopy.h000066400000000000000000000032631443134507600240000ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose: Copying a vector into second vector (Copy). // Filling a vector by 0 (Zero). // // Contents: mfxownsCopy_8u // mfxownsZero_8u // mfxownsSet_32s *M*/ #if !defined (__PSCOPY_H__) #define __PSCOPY_H__ extern Ipp8u* mfxownsCopy_8u( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern Ipp8u* mfxownsZero_8u( Ipp8u* pDst, int len ); extern Ipp32s* mfxownsSet_32s( Ipp32s val, Ipp32s* pDst, int len); /*******************************************************************************/ #endif /* #if !defined (__PSCOPY_H__) */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pscopyca.c000066400000000000000000000214061443134507600242760ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose: Copying a vector into second vector. // Filling a vector by 0. // Filling a vector by value. // // Contents: mfxsCopy_8u // mfxsCopy_16s // mfxsZero_16s // ************ // mfxownsCopy_8u // mfxownsZero_8u // mfxownsSet_8u // mfxownsSet_16u // mfxownsSet_32s // mfxownsSet_64s // mfxownsSet_64sc // mfxownsPrefetchCopy_8u_A6 // // *M*/ #include "precomp.h" #include "owns.h" #include "pscopy.h" #if ( _IPP32E >= _IPP32E_E9 ) /* #if ( _IPP32E < _IPP32E_L9 ) */ #if 1 #define mfxownsCopy_8u_AVX mfxownsCopy_8u_E9 #endif extern void mfxownsCopy_8u_repE9( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern Ipp8u* mfxownsZero_8u_E9( Ipp8u* dst, int len ); extern Ipp8u* mfxownsSet_8u_E9( Ipp8u val, Ipp8u* dst, int len ); extern Ipp16u* mfxownsSet_16u_E9( Ipp16u val, Ipp16u* dst, int len ); extern Ipp32s* mfxownsSet_32s_E9( Ipp32s val, Ipp32s* dst, int len ); #define BOUND_NT_COPY 1048576 #define BOUND_NT_SET 2097152 #endif #if ( _IPP >= _IPP_G9 ) /* #if ( _IPP < _IPP_H9 ) */ #if 1 #define mfxownsCopy_8u_AVX mfxownsCopy_8u_G9 #endif extern void mfxownsCopy_8u_repG9( const Ipp8u* pSrc, Ipp8u* pDst, int len ); extern Ipp8u* mfxownsZero_8u_G9( Ipp8u* dst, int len ); extern Ipp8u* mfxownsSet_8u_G9( Ipp8u val, Ipp8u* dst, int len ); extern Ipp16u* mfxownsSet_16u_G9( Ipp16u val, Ipp16u* dst, int len ); extern Ipp32s* mfxownsSet_32s_G9( Ipp32s val, Ipp32s* dst, int len ); #define BOUND_NT_COPY 1048576 #define BOUND_NT_SET 2097152 #endif #if !( (_IPP>=_IPP_M6) || (_IPP32E>=_IPP32E_M7) || (_IPP64>=_IPP64_I7) ) #define _CCODE #endif #if(( _IPP32E >= _IPP32E_M7 )||( _IPP >= _IPP_W7 )||(_IPPLRB >= _IPPLRB_B1)) #define SET_OPT #endif #if ( _IPP32E >= _IPP32E_M7 ) extern Ipp64sc* mfxownsSet_64sc_M7( Ipp64sc* pVal, Ipp64sc* pDst, int len ); extern Ipp64sc* mfxownsSet_64sc( Ipp64sc val, Ipp64sc* pDst, int len ){ return mfxownsSet_64sc_M7( &val, pDst, len ); } #endif #if ( _IPP32E >= _IPP32E_M7 ) && ( _IPP32E < _IPP32E_E9 ) extern Ipp8u* mfxownsSet_8u_M7( Ipp8u* pVal, Ipp8u* pDst, int len ); extern Ipp16u* mfxownsSet_16u_M7( Ipp16u* pVal, Ipp16u* pDst, int len ); extern Ipp32s* mfxownsSet_32s_M7( Ipp32s* pVal, Ipp32s* pDst, int len ); extern Ipp32s* mfxownsSet_32s( Ipp32s val, Ipp32s* pDst, int len ){ return mfxownsSet_32s_M7( &val, pDst, len ); } #endif #if ( _IPP32E >= _IPP32E_M7 ) && ( _IPP32E < _IPP32E_L9 ) extern Ipp64s* mfxownsSet_64s_M7( Ipp64s* pVal, Ipp64s* pDst, int len ); extern Ipp64s* mfxownsSet_64s( Ipp64s val, Ipp64s* pDst, int len ){ return mfxownsSet_64s_M7( &val, pDst, len ); } #endif #if (_IPP >= _IPP_G9) || (_IPP32E >= _IPP32E_E9) extern Ipp8u* mfxownsCopy_8u_AVX( const Ipp8u* pSrc, Ipp8u* pDst, int len ); #endif #if _IPP_ARCH != _IPP_ARCH_XSC /*****************************************************************/ IPPFUN ( IppStatus, mfxsCopy_8u, ( const Ipp8u* pSrc, Ipp8u* pDst, int len )) { IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( len ) #ifdef _A6 if( len < 8192 ) { mfxownsCopy_8u( pSrc, pDst, len ); return ippStsNoErr; } if(len < 16384) { mfxownsCopy_8u_A6( pSrc, pDst, len ); return ippStsNoErr; } mfxownsPrefetchCopy_8u_A6( pSrc, pDst, len ); #else #if ( _IPP32E >= _IPP32E_E9 ) if ( len < 32768 ) { mfxownsCopy_8u_AVX( pSrc, pDst, len ); } else { mfxownsCopy_8u_repE9( pSrc, pDst, len ); } /* old code by A.Solntsev if( len <= BOUND_NT_COPY ) { mfxownsCopy_8u_E9( pSrc, pDst, len ); } else { mfxownsCopy_8u( pSrc, pDst, len ); } */ #elif ( _IPP >= _IPP_G9 ) if ( len < 32768 ) { mfxownsCopy_8u_AVX( pSrc, pDst, len ); } else { mfxownsCopy_8u_repG9( pSrc, pDst, len ); } /* old code by A.Solntsev if( len <= BOUND_NT_COPY ) { mfxownsCopy_8u_G9( pSrc, pDst, len ); } else { mfxownsCopy_8u( pSrc, pDst, len ); } */ #else mfxownsCopy_8u( pSrc, pDst, len ); #endif #endif return ippStsNoErr; } /********************************************************************/ IPPFUN ( IppStatus, mfxsCopy_16s, ( const Ipp16s* pSrc, Ipp16s* pDst, int len )) { IPP_BAD_PTR2_RET( pSrc, pDst ) IPP_BAD_SIZE_RET( len ) #ifdef _A6 if( len < 4096 ) { mfxownsCopy_8u( (Ipp8u*)pSrc, (Ipp8u*)pDst, len*2 ); return ippStsNoErr; } if(len < 8192) { mfxownsCopy_8u_A6( (Ipp8u*)pSrc, (Ipp8u*)pDst, len*2 ); return ippStsNoErr; } mfxownsPrefetchCopy_8u_A6( (Ipp8u*)pSrc, (Ipp8u*)pDst, len*2 ); #else #if ( _IPP >= _IPP_G9 ) || ( _IPP32E >= _IPP32E_E9 ) for (; len > 0x3fffffff; len -= 0x3ffffff0) { mfxsCopy_8u((const Ipp8u*)pSrc, (Ipp8u*)pDst, 0x7fffffe0); pSrc += 0x3ffffff0; pDst += 0x3ffffff0; } if ( len ) mfxsCopy_8u((const Ipp8u*)pSrc, (Ipp8u*) pDst, len+len); #else mfxownsCopy_8u( (Ipp8u*)pSrc, (Ipp8u*)pDst, len*2 ); #endif #endif return ippStsNoErr; } /*****************************************************************/ IPPFUN ( IppStatus, mfxsZero_8u, ( Ipp8u* pDst, int len )) { IPP_BAD_PTR1_RET( pDst ) IPP_BAD_SIZE_RET( len ) #if defined (_A6) if( len < 20480 ) { mfxownsZero_8u( pDst, len ); } else { mfxownsZero_8u_A6( pDst, len ); } #else #if ( _IPP32E >= _IPP32E_E9 ) if( len <= BOUND_NT_SET ) { mfxownsZero_8u_E9( pDst, len ); } else { mfxownsZero_8u( pDst, len ); } #elif ( _IPP >= _IPP_G9 ) if( len <= BOUND_NT_SET ) { mfxownsZero_8u_G9( pDst, len ); } else { mfxownsZero_8u( pDst, len ); } #else mfxownsZero_8u( pDst, len ); #endif #endif return ippStsNoErr; } /*****************************************************************/ IPPFUN ( IppStatus, mfxsZero_16s, ( Ipp16s* pDst, int len )) { IPP_BAD_PTR1_RET( pDst ) IPP_BAD_SIZE_RET( len ) #if defined (_A6) if( len < 10240 ) { mfxownsZero_8u( (Ipp8u*)pDst, len*2 ); } else { mfxownsZero_8u_A6( (Ipp8u*)pDst, len*2 ); } #else #if ( _IPP32E >= _IPP32E_E9 ) if( len*2 <= BOUND_NT_SET ) { mfxownsZero_8u_E9( (Ipp8u*)pDst, len*2 ); } else { mfxownsZero_8u( (Ipp8u*)pDst, len*2 ); } #elif ( _IPP >= _IPP_G9 ) if( len*2 <= BOUND_NT_SET ) { mfxownsZero_8u_G9( (Ipp8u*)pDst, len*2 ); } else { mfxownsZero_8u( (Ipp8u*)pDst, len*2 ); } #else mfxownsZero_8u( (Ipp8u*)pDst, len*2 ); #endif #endif return ippStsNoErr; } #endif // _IPP_ARCH != _IPP_ARCH_XSC #if defined (_A6) /********************************* Return: pDst. *********************************/ extern Ipp8u* mfxownsPrefetchCopy_8u_A6( const Ipp8u *pSrc, Ipp8u *pDst, int len ) { int length = len, length_, n; const Ipp8u *src1 = pSrc; Ipp8u *dst1 = pDst; if( length <= 0 ) return pDst; while( IPP_INT_PTR( dst1 ) & 0x7 ) { *dst1 = *src1; src1++, dst1++, length--; if( !length ) return pDst; } if( length < 20480 ) { mfxownsCopy_8u_A6( src1, dst1, length ); return pDst; } length_ = (4096 - (IPP_INT_PTR( src1 ) & 0xff8)) & 0xfff; if( length_ ) { mfxownsCopy_8u_A6(src1, dst1, length_); src1 += length_, dst1 += length_; length -= length_; } length -= (length_ = length & 0xfff); length /= 4096; for(n=0; n < length; n++) { mfxownsPrefetchnta_A6(src1, 4096); mfxownsCopy_8u_A6(src1, dst1, 4096); src1 += 4096; dst1 += 4096; } if( length_ ) { mfxownsCopy_8u_A6(src1, dst1, length_); } return pDst; } #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/psdiv.c000066400000000000000000000126071443134507600236050ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* /////////////////////////////// "psdiv.c" ///////////////////////////////// // // Purpose: Div of Intel(R) Performance Primitives Libraries // for Signal Processing (ipps) // */ /* //////////////////////////////////////////////////////////////////////////// // Name: mfxsDiv // // Purpose: divide every element of the source vector by the scalar value // or by corresponding element of the second source vector // Arguments: // val the divisor value // pSrc pointer to the divisor source vector // pSrc1 pointer to the divisor source vector // pSrc2 pointer to the dividend source vector // pDst pointer to the destination vector // pSrcDst pointer to the source/destination vector // len vector's length, number of items // scaleFactor scale factor parameter value // Return: // ippStsNullPtrErr pointer(s) to the data vector is NULL // ippStsSizeErr length of the vector is less or equal zero // ippStsDivByZeroErr the scalar divisor value is zero // ippStsDivByZero Warning status if an element of divisor vector is // zero. If the dividend is zero then result is // NaN, if the dividend is not zero then result // is Infinity with correspondent sign. The // execution is not aborted. For the integer operation // zero instead of NaN and the corresponding bound // values instead of Infinity // ippStsNoErr otherwise // Note: // DivC(v,X,Y) : Y[n] = X[n] / v // DivC(v,X) : X[n] = X[n] / v // Div(X,Y) : Y[n] = Y[n] / X[n] // Div(X,Y,Z) : Z[n] = Y[n] / X[n] */ #include "precomp.h" #include "owns.h" #if !defined(_CCODE) && !defined(_A6) int mfxownippsDivCRev_16u(const Ipp16u* pSrc,Ipp16u val, Ipp16u* pDst,int len); #endif IPPFUN(IppStatus, mfxsDivCRev_16u, (const Ipp16u* __RESTRICT pSrc, Ipp16u val, Ipp16u* __RESTRICT pDst, int len)) { IppStatus result = ippStsNoErr; IPP_BAD_PTR2_RET(pSrc,pDst) IPP_BAD_SIZE_RET(len) #if ( defined(_CCODE) && !(_IPPLRB >= _IPPLRB_B1) ) || defined(_A6) || (_IPP64>=_IPP64_I7) #if (_IPP64>=_IPP64_I7) if ( !( ( IPP_UINT_PTR(pSrc) & 1 ) || ( IPP_UINT_PTR(pDst) & 1 ) ) && val ) { if ( mfxownippsDivCRev_16u(pSrc, val, pDst, len) ) result = ippStsDivByZero; } else #endif { int i; if ( val ) { Ipp32u a = val << 16; Ipp32u b, r, t; for ( i = 0; i < len; i++ ) { b = (Ipp32u)pSrc[i]; if ( b ) { r = a / b; t = ( r & 0x10000 ) >> 16; t += 0x7fff + t; r += t; r >>= 16; pDst[i] = (Ipp16u)r; } else { result = ippStsDivByZero; pDst[i] = IPP_MAX_16U; } } } else { for ( i = 0; i < len; i++ ) { if ( pSrc[i] == 0 ) { result = ippStsDivByZero; break; } } mfxsZero_16s( (Ipp16s *)pDst, len ); } } #else if ( val ) { #if !defined(_OWN_MT) if ( mfxownippsDivCRev_16u( pSrc, val, pDst, len ) ) result = ippStsDivByZero; #else if ( len < 2048 ) { if ( mfxownippsDivCRev_16u( pSrc, val, pDst, len ) ) result = ippStsDivByZero; } else { if ( mfxownippsDivCRev_16u_omp( pSrc, val, pDst, len ) ) result = ippStsDivByZero; } #endif } else { int i; for ( i = 0; i < len; i++ ) { if ( pSrc[i] == 0 ) { result = ippStsDivByZero; break; } } mfxsZero_16s( (Ipp16s *)pDst, len ); } #endif return result; } /*===========================================================================*/ IPPFUN(IppStatus, mfxsDivCRev_16u_I, (Ipp16u val, Ipp16u* pSrcDst, int len)) { IPP_BAD_PTR1_RET(pSrcDst) IPP_BAD_SIZE_RET(len) return mfxsDivCRev_16u( pSrcDst, val, pSrcDst, len ); } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/psmul.c000066400000000000000000000061101443134507600236100ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose: Functions of operation of multiplication // // Contents: // mfxsMulC_16s_I // mfxsMul_16s_I // *M*/ #include "precomp.h" #if !defined(__OWNS_H__) #include "owns.h" #endif #ifdef _IPP_C99 #include #endif #include "ps_anarith.h" IPPFUN(IppStatus, mfxsMulC_16s_I, (Ipp16s val, Ipp16s* pSrcDst, int len)) { IPP_BAD_PTR1_RET(pSrcDst); IPP_BAD_SIZE_RET(len); if( val == 1 ) return ippStsNoErr; if( val == 0 ) return mfxsZero_16s(pSrcDst, len); #if (_IPPLRB > _IPPLRB_PX) mfxownsMulC_16s_I_Sfs( val, pSrcDst, len, 0 ); #else #if (_IPP64 >= _IPP64_I7) if( (IPP_INT_PTR(pSrcDst) & 1) == 0 ) { mfxownsMulC_16s(pSrcDst, val, pSrcDst, len); } /* if */ else { #endif #if ( (_IPP == _IPP_PX) && (_IPP32E == _IPP32E_PX) && (_IPP64 >= _IPP64_PX) ) { /* block */ Ipp32s tmp; int i; for( i = 0; i < len; i++ ) { tmp = (Ipp32s)pSrcDst[i] * (Ipp32s)val; tmp = IPP_MIN(tmp, IPP_MAX_16S); pSrcDst[i] = (Ipp16s)IPP_MAX(tmp, IPP_MIN_16S); } /* for */ } /* block */ #else mfxownsMulC_16s_I(val, pSrcDst, len); #endif ENDIF_I7 #endif return ippStsNoErr; } /* mfxsMulC_16s_I */ IPPFUN(IppStatus, mfxsMul_16s_I, (const Ipp16s* __RESTRICT pSrc, Ipp16s* __RESTRICT pSrcDst, int len)) { IPP_BAD_PTR2_RET(pSrc, pSrcDst); IPP_BAD_SIZE_RET(len); #if (_IPP64 >= _IPP64_I7) if( ((IPP_INT_PTR(pSrc) | IPP_INT_PTR(pSrcDst)) & 1) == 0 ) { mfxownsMul_16s(pSrcDst, pSrc, pSrcDst, len); } /* if */ else { #endif #if ( (_IPP == _IPP_PX) && (_IPP32E == _IPP32E_PX) && (_IPP64 >= _IPP64_PX) && (_IPPLRB == _IPPLRB_PX) ) { /* block */ Ipp32s tmp; int i; for( i = 0; i < len; i++ ) { tmp = (Ipp32s)pSrc[i] * (Ipp32s)pSrcDst[i]; tmp = IPP_MIN(tmp, IPP_MAX_16S); pSrcDst[i] = (Ipp16s)IPP_MAX(tmp, IPP_MIN_16S); } /* for */ } /* block */ #else mfxownsMul_16s_I(pSrc, pSrcDst, len); #endif ENDIF_I7 return ippStsNoErr; } /* mfxsMul_16s_I */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/psmulm6a6w7cn.c000066400000000000000000000636001443134507600251100ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /*M* // // Purpose: Functions of operation of multiplication // // Contents: // mfxownsMulC_16s_I // mfxownsMul_16s_I // *M*/ #include // __m128i etc #include "precomp.h" #if !defined(__OWNS_H__) #include "owns.h" #endif #if ( (_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) ) #if (_IPP == _IPP_M6) #include #endif #include "ps_anarith.h" #if ( (_IPP >= _IPP_M6) && (_IPP <= _IPP_A6) ) /* Lib = M6, A6 */ /* Caller = ippsMul_16s_I, ippsMul_16s_ISfs, mfxiMul_16s_C1IRSfs */ void mfxownsMul_16s_I(const Ipp16s* pSrc, Ipp16s* pSrcDst, int len) { _Alignas(16) __m64 t0, t1, t2, t3, t4, t5, t6, t7, mmxZero; Ipp32s tmpValue; int tmp; if( len >= (8 + 3) ) { mmxZero = _mm_setzero_si64(); if( (IPP_INT_PTR(pSrcDst) & 1) == 0 ) { if( (tmp = (int)(IPP_INT_PTR(pSrcDst) & 7)) != 0 ) { tmp = ( -(tmp >> 1) & 3); len -= tmp; do { tmpValue = IPP_MIN((Ipp32s)(*pSrcDst * *pSrc), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpValue, IPP_MIN_16S); pSrc++; pSrcDst++; } while( --tmp ); } /* if */ } /* if */ tmp = len & ~7; len = len & 7; do { t3 = *((__m64*)pSrc); t7 = *((__m64*)pSrc + 1); t1 = *((__m64*)pSrcDst); t5 = *((__m64*)pSrcDst + 1); t0 = _m_punpcklwd(t1, t1); t4 = _m_punpcklwd(t5, t5); t2 = _m_punpcklwd(t3, mmxZero); t6 = _m_punpcklwd(t7, mmxZero); t1 = _m_punpckhwd(t1, t1); t5 = _m_punpckhwd(t5, t5); t3 = _m_punpckhwd(t3, mmxZero); t7 = _m_punpckhwd(t7, mmxZero); t0 = _m_pmaddwd(t0, t2); t4 = _m_pmaddwd(t4, t6); t1 = _m_pmaddwd(t1, t3); t5 = _m_pmaddwd(t5, t7); t0 = _m_packssdw(t0, t1); t4 = _m_packssdw(t4, t5); *((__m64*)pSrcDst) = t0; *((__m64*)pSrcDst + 1) = t4; pSrc += 8; pSrcDst += 8; } while( tmp -= 8 ); _m_empty(); } /* if */ for( ; len--; pSrc++, pSrcDst++ ) { tmpValue = IPP_MIN((Ipp32s)(*pSrcDst * *pSrc), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpValue, IPP_MIN_16S); } /* for */ } /* mfxownsMul_16s_I */ /* Lib = M6, A6 */ /* Caller = ippsMulC_16s_I, ippsMulC_16s_ISfs, mfxiMulC_16s_C1IRSfs */ void mfxownsMulC_16s_I(Ipp16s val, Ipp16s* pSrcDst, int len) { _Alignas(16) __m64 t0, t1, t2, t3, mmxVal; Ipp32s tmpVal; int tmp; if( len >= (16 + 3) ) { mmxVal = _mm_set1_pi32((int)((short)val & 0xFFFF)); if( (IPP_INT_PTR(pSrcDst) & 1) == 0 ) { if( (tmp = (int)(IPP_INT_PTR(pSrcDst) & 7)) != 0 ) { tmp = ((0 - (tmp >> 1)) & 3); len -= tmp; do { tmpVal = (Ipp32s)(*pSrcDst * val); tmpVal = IPP_MIN(tmpVal, IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); pSrcDst++; } while( --tmp ); } /* if */ } /* if */ tmp = len & ~15; len = len & 15; do { t1 = *((__m64*)pSrcDst); t3 = *((__m64*)pSrcDst + 1); t0 = _m_punpcklwd(t1, t1); t1 = _m_punpckhwd(t1, t1); t2 = _m_punpcklwd(t3, t3); t3 = _m_punpckhwd(t3, t3); t0 = _m_pmaddwd(t0, mmxVal); t1 = _m_pmaddwd(t1, mmxVal); t2 = _m_pmaddwd(t2, mmxVal); t3 = _m_pmaddwd(t3, mmxVal); t0 = _m_packssdw(t0, t1); t2 = _m_packssdw(t2, t3); *((__m64*)pSrcDst) = t0; *((__m64*)pSrcDst + 1) = t2; t1 = *((__m64*)pSrcDst + 2); t3 = *((__m64*)pSrcDst + 3); t0 = _m_punpcklwd(t1, t1); t1 = _m_punpckhwd(t1, t1); t2 = _m_punpcklwd(t3, t3); t3 = _m_punpckhwd(t3, t3); t0 = _m_pmaddwd(t0, mmxVal); t1 = _m_pmaddwd(t1, mmxVal); t2 = _m_pmaddwd(t2, mmxVal); t3 = _m_pmaddwd(t3, mmxVal); t0 = _m_packssdw(t0, t1); t2 = _m_packssdw(t2, t3); *((__m64*)pSrcDst + 2) = t0; *((__m64*)pSrcDst + 3) = t2; pSrcDst += 16; } while( tmp -= 16 ); _m_empty(); } /* if */ for( ; len--; pSrcDst++ ) { tmpVal = (Ipp32s)(*pSrcDst * val); tmpVal = IPP_MIN(tmpVal, IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); } /* for */ } /* mfxownsMulC_16s_I */ #endif #if ( (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) ) /* Lib = W7 */ /* Caller = ippsMul_16s_I, ippsMul_16s_ISfs, mfxiMul_16s_C1IRSfs */ void mfxownsMul_16s_I(const Ipp16s* pSrc, Ipp16s* pSrcDst, int len) { _Alignas(16) __m128i t0, t1, t2, t3, t4, t5, t6, t7, emmZero; Ipp32s tmpValue; int tmp; if( len >= (16 + 7) ) { emmZero = _mm_setzero_si128(); if( (IPP_INT_PTR(pSrcDst) & 1) == 0 ) { if( (tmp = (int)(IPP_INT_PTR(pSrcDst) & 15)) != 0 ) { tmp = ( -(tmp >> 1) & 7); len -= tmp; do { tmpValue = IPP_MIN((Ipp32s)(*pSrcDst * *pSrc), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpValue, IPP_MIN_16S); pSrc++; pSrcDst++; } while( --tmp ); } /* if */ tmp = len & ~15; len = len & 15; if( (IPP_INT_PTR(pSrc) & 15) != 0 ) { do { t1 = _mm_loadu_si128((__m128i*)pSrc); t3 = _mm_loadu_si128((__m128i*)pSrc + 1); t5 = _mm_load_si128((__m128i*)pSrcDst); t7 = _mm_load_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, emmZero); t1 = _mm_unpackhi_epi16(t1, emmZero); t2 = _mm_unpacklo_epi16(t3, emmZero); t3 = _mm_unpackhi_epi16(t3, emmZero); t4 = _mm_unpacklo_epi16(t5, emmZero); t5 = _mm_unpackhi_epi16(t5, emmZero); t6 = _mm_unpacklo_epi16(t7, emmZero); t7 = _mm_unpackhi_epi16(t7, emmZero); t0 = _mm_madd_epi16(t0, t4); t1 = _mm_madd_epi16(t1, t5); t2 = _mm_madd_epi16(t2, t6); t3 = _mm_madd_epi16(t3, t7); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_store_si128((__m128i*)pSrcDst, t0); _mm_store_si128((__m128i*)pSrcDst + 1, t2); pSrc += 16; pSrcDst += 16; } while( tmp -= 16 ); } /* if */ else { do { t1 = _mm_load_si128((__m128i*)pSrc); t3 = _mm_load_si128((__m128i*)pSrc + 1); t5 = _mm_load_si128((__m128i*)pSrcDst); t7 = _mm_load_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, emmZero); t1 = _mm_unpackhi_epi16(t1, emmZero); t2 = _mm_unpacklo_epi16(t3, emmZero); t3 = _mm_unpackhi_epi16(t3, emmZero); t4 = _mm_unpacklo_epi16(t5, emmZero); t5 = _mm_unpackhi_epi16(t5, emmZero); t6 = _mm_unpacklo_epi16(t7, emmZero); t7 = _mm_unpackhi_epi16(t7, emmZero); t0 = _mm_madd_epi16(t0, t4); t1 = _mm_madd_epi16(t1, t5); t2 = _mm_madd_epi16(t2, t6); t3 = _mm_madd_epi16(t3, t7); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_store_si128((__m128i*)pSrcDst, t0); _mm_store_si128((__m128i*)pSrcDst + 1, t2); pSrc += 16; pSrcDst += 16; } while( tmp -= 16 ); } /* else */ } /* if */ else { tmp = len & ~15; len = len & 15; if( (IPP_INT_PTR(pSrc) & 15) != 0 ) { do { t1 = _mm_loadu_si128((__m128i*)pSrc); t3 = _mm_loadu_si128((__m128i*)pSrc + 1); t5 = _mm_loadu_si128((__m128i*)pSrcDst); t7 = _mm_loadu_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, emmZero); t1 = _mm_unpackhi_epi16(t1, emmZero); t2 = _mm_unpacklo_epi16(t3, emmZero); t3 = _mm_unpackhi_epi16(t3, emmZero); t4 = _mm_unpacklo_epi16(t5, emmZero); t5 = _mm_unpackhi_epi16(t5, emmZero); t6 = _mm_unpacklo_epi16(t7, emmZero); t7 = _mm_unpackhi_epi16(t7, emmZero); t0 = _mm_madd_epi16(t0, t4); t1 = _mm_madd_epi16(t1, t5); t2 = _mm_madd_epi16(t2, t6); t3 = _mm_madd_epi16(t3, t7); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_storeu_si128((__m128i*)pSrcDst, t0); _mm_storeu_si128((__m128i*)pSrcDst + 1, t2); pSrc += 16; pSrcDst += 16; } while( tmp -= 16 ); } /* if */ else { do { t1 = _mm_load_si128((__m128i*)pSrc); t3 = _mm_load_si128((__m128i*)pSrc + 1); t5 = _mm_loadu_si128((__m128i*)pSrcDst); t7 = _mm_loadu_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, emmZero); t1 = _mm_unpackhi_epi16(t1, emmZero); t2 = _mm_unpacklo_epi16(t3, emmZero); t3 = _mm_unpackhi_epi16(t3, emmZero); t4 = _mm_unpacklo_epi16(t5, emmZero); t5 = _mm_unpackhi_epi16(t5, emmZero); t6 = _mm_unpacklo_epi16(t7, emmZero); t7 = _mm_unpackhi_epi16(t7, emmZero); t0 = _mm_madd_epi16(t0, t4); t1 = _mm_madd_epi16(t1, t5); t2 = _mm_madd_epi16(t2, t6); t3 = _mm_madd_epi16(t3, t7); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_storeu_si128((__m128i*)pSrcDst, t0); _mm_storeu_si128((__m128i*)pSrcDst + 1, t2); pSrc += 16; pSrcDst += 16; } while( tmp -= 16 ); } /* else */ } /* else */ } /* if */ for( ; len--; pSrc++, pSrcDst++ ) { tmpValue = IPP_MIN((Ipp32s)(*pSrcDst * *pSrc), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpValue, IPP_MIN_16S); } /* for */ } /* mfxownsMul_16s_I */ #if !((_IPP32E >= _IPP32E_L9) || (_IPP >= _IPP_H9)) /* Lib = W7 */ /* Caller = ippsMulC_16s_I, ippsMulC_16s_ISfs, mfxiMulC_16s_C1IRSfs */ void mfxownsMulC_16s_I(Ipp16s val, Ipp16s* pSrcDst, int len) { _Alignas(16) __m128i t0, t1, t2, t3, emmValue; Ipp32s tmpVal; int tmp; if( len >= (16 + 7) ) { emmValue = _mm_set1_epi32((int)((short)val & 0xFFFF)); if( (IPP_INT_PTR(pSrcDst) & 1) == 0 ) { if( (tmp = (int)(IPP_INT_PTR(pSrcDst) & 15)) != 0 ) { tmp = ((0 - (tmp >> 1)) & 7); len -= tmp; do { tmpVal = IPP_MIN((Ipp32s)(*pSrcDst * val), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); pSrcDst++; } while( --tmp ); } /* if */ tmp = len & ~15; len = len & 15; do { t1 = _mm_load_si128((__m128i*)pSrcDst); t3 = _mm_load_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, t1); t1 = _mm_unpackhi_epi16(t1, t1); t2 = _mm_unpacklo_epi16(t3, t3); t3 = _mm_unpackhi_epi16(t3, t3); t0 = _mm_madd_epi16(t0, emmValue); t1 = _mm_madd_epi16(t1, emmValue); t2 = _mm_madd_epi16(t2, emmValue); t3 = _mm_madd_epi16(t3, emmValue); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_store_si128((__m128i*)pSrcDst, t0); _mm_store_si128((__m128i*)pSrcDst + 1, t2); pSrcDst += 16; } while( tmp -= 16 ); } /* if */ else { tmp = len & ~15; len = len & 15; do { t1 = _mm_loadu_si128((__m128i*)pSrcDst); t3 = _mm_loadu_si128((__m128i*)pSrcDst + 1); t0 = _mm_unpacklo_epi16(t1, t1); t1 = _mm_unpackhi_epi16(t1, t1); t2 = _mm_unpacklo_epi16(t3, t3); t3 = _mm_unpackhi_epi16(t3, t3); t0 = _mm_madd_epi16(t0, emmValue); t1 = _mm_madd_epi16(t1, emmValue); t2 = _mm_madd_epi16(t2, emmValue); t3 = _mm_madd_epi16(t3, emmValue); t0 = _mm_packs_epi32(t0, t1); t2 = _mm_packs_epi32(t2, t3); _mm_storeu_si128((__m128i*)pSrcDst, t0); _mm_storeu_si128((__m128i*)pSrcDst + 1, t2); pSrcDst += 16; } while( tmp -= 16 ); } /* else */ } /* if */ for( ; len--; pSrcDst++ ) { tmpVal = IPP_MIN((Ipp32s)(*pSrcDst * val), IPP_MAX_16S); *pSrcDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); } /* for */ } /* mfxownsMulC_16s_I */ /* Lib = W7 */ /* Caller = mfxs_Mul_16u16s_Sfs */ void mfxownsMul_16u16s_PosSfs(const Ipp16u* pSrcU, const Ipp16s* pSrcS, Ipp16s* pDst, int len, int scaleFactor) { _Alignas(16) __m128i t0, t1, t2, t3, t4, t5, t6, const0, const01, const11, constW, sFactor; const Ipp32s const1 = (1 << (scaleFactor - 1)) - 1; Ipp32s tmpVal; int tmp; scaleFactor--; if( len >= (8 + 7) ) { if( (IPP_INT_PTR(pDst) & 1) == 0 ) { if( (tmp = (int)(IPP_INT_PTR(pDst) & 15)) != 0 ) { tmp = ((-(tmp >> 1)) & 7); len -= tmp; do { tmpVal = (Ipp32s)(((Ipp32s)*pSrcU) * *pSrcS); tmpVal = ((tmpVal >> 1) + (((tmpVal & 1) + const1 + (((tmpVal >> 1) >> scaleFactor) & 1)) >> 1)) >> scaleFactor; tmpVal = IPP_MIN(tmpVal, IPP_MAX_16S); *pDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); pSrcU++; pSrcS++; pDst++; } while( --tmp ); } /* if */ sFactor = _mm_cvtsi32_si128(scaleFactor); constW = _mm_set1_epi32((int)(const1 >> 1)); const0 = _mm_setzero_si128(); const01 = _mm_set1_epi32(0x00000001); const11 = _mm_set1_epi32(0x00010001); tmp = len >> 3; len = len & 7; if( (IPP_INT_PTR(pSrcU) & 15) != 0 ) { if( (IPP_INT_PTR(pSrcS) & 15) != 0 ) { do { t1 = _mm_loadu_si128((__m128i*)pSrcU); t2 = _mm_loadu_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_store_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* if */ else { do { t1 = _mm_loadu_si128((__m128i*)pSrcU); t2 = _mm_load_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_store_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* else */ } /* if */ else { if( (IPP_INT_PTR(pSrcS) & 15) != 0 ) { do { t1 = _mm_load_si128((__m128i*)pSrcU); t2 = _mm_loadu_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_store_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* if */ else { do { t1 = _mm_load_si128((__m128i*)pSrcU); t2 = _mm_load_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_store_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* else */ } /* else */ } /* if */ else { sFactor = _mm_cvtsi32_si128(scaleFactor); constW = _mm_set1_epi32((int)(const1 >> 1)); const0 = _mm_setzero_si128(); const01 = _mm_set1_epi32(0x00000001); const11 = _mm_set1_epi32(0x00010001); tmp = len >> 3; len = len & 7; if( (IPP_INT_PTR(pSrcU) & 15) != 0 ) { if( (IPP_INT_PTR(pSrcS) & 15) != 0 ) { do { t1 = _mm_loadu_si128((__m128i*)pSrcU); t2 = _mm_loadu_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_storeu_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* if */ else { do { t1 = _mm_loadu_si128((__m128i*)pSrcU); t2 = _mm_load_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_storeu_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* else */ } /* if */ else { if( (IPP_INT_PTR(pSrcS) & 15) != 0 ) { do { t1 = _mm_load_si128((__m128i*)pSrcU); t2 = _mm_loadu_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_storeu_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* if */ else { do { t1 = _mm_load_si128((__m128i*)pSrcU); t2 = _mm_load_si128((__m128i*)pSrcS); t0 = _mm_srli_epi16(t1, 1); t1 = _mm_and_si128(t1, const11); t4 = _mm_unpackhi_epi16(t0, t1); t0 = _mm_unpacklo_epi16(t0, t1); t1 = _mm_and_si128(t1, t2); t6 = _mm_unpackhi_epi16(t1, const0); t1 = _mm_unpacklo_epi16(t1, const0); t3 = _mm_srai_epi16(t2, 1); t5 = _mm_unpackhi_epi16(t2, t3); t2 = _mm_unpacklo_epi16(t2, t3); t4 = _mm_madd_epi16(t4, t5); t0 = _mm_madd_epi16(t0, t2); t2 = _mm_srl_epi32(t4, sFactor); t3 = _mm_srl_epi32(t0, sFactor); t4 = _mm_add_epi32(t4, constW); t0 = _mm_add_epi32(t0, constW); t2 = _mm_and_si128(t2, const01); t3 = _mm_and_si128(t3, const01); t6 = _mm_or_si128(t6, t2); t1 = _mm_or_si128(t1, t3); t4 = _mm_add_epi32(t4, t6); t0 = _mm_add_epi32(t0, t1); t4 = _mm_sra_epi32(t4, sFactor); t0 = _mm_sra_epi32(t0, sFactor); t0 = _mm_packs_epi32(t0, t4); _mm_storeu_si128((__m128i*)pDst, t0); pSrcU += 8; pSrcS += 8; pDst += 8; } while( --tmp ); } /* else */ } /* else */ } /* else */ } /* if */ for( ; len--; pSrcU++, pSrcS++, pDst++ ) { tmpVal = (Ipp32s)(((Ipp32s)*pSrcU) * *pSrcS); tmpVal = ((tmpVal >> 1) + (((tmpVal & 1) + const1 + (((tmpVal >> 1) >> scaleFactor) & 1)) >> 1)) >> scaleFactor; tmpVal = IPP_MIN(tmpVal, IPP_MAX_16S); *pDst = (Ipp16s)IPP_MAX(tmpVal, IPP_MIN_16S); } /* for */ } /* mfxownsMul_16u16s_PosSfs */ #endif #endif #endif oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/psshift.c000066400000000000000000000051511443134507600241340ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Description: // Functions of shift (mfxs_ domain) // // mfxsLShiftC_16u // mfxsLShiftC_16s // */ #include "precomp.h" #include "owns.h" #define IPP_BAD_SHIFT1_RET() \ IPP_BAD_PTR1_RET(pSrcDst) \ IPP_BAD_SIZE_RET(len) \ IPP_BADARG_RET(val < 0, ippStsShiftErr) #define IPP_BAD_SHIFT2_RET() \ IPP_BAD_PTR2_RET(pSrc, pDst) \ IPP_BAD_SIZE_RET(len) \ IPP_BADARG_RET(val < 0, ippStsShiftErr) #define IPP_SHIFT_OPT \ ((_IPP >= _IPP_M6) || (_IPP32E >= _IPP32E_M7) || (_IPP64 >= _IPP64_I7) || (_IPPXSC >= _IPPXSC_S2)) #define _OPT_HSW \ ((_IPP >= _IPP_H9) || (_IPP32E >= _IPP32E_L9)) #if IPP_SHIFT_OPT extern void mfxownps_LShiftC_16u(const Ipp16u*, int, Ipp16u*, int); #endif /* ============================= LSHIFT ============================ */ IPPFUN(IppStatus, mfxsLShiftC_16u, (const Ipp16u* __RESTRICT pSrc, int val, Ipp16u* __RESTRICT pDst, int len)) { if (!val) return mfxsCopy_16s((const Ipp16s*)pSrc, (Ipp16s*)pDst, len); if (val > 15) { IPP_BAD_PTR1_RET(pSrc) return mfxsZero_16s((Ipp16s*)pDst, len); } IPP_BAD_SHIFT2_RET() #if IPP_SHIFT_OPT && !_OPT_HSW mfxownps_LShiftC_16u(pSrc, val, pDst, len); #else { int i; for (i = 0; i < len; i ++) pDst[i] = (Ipp16u)(pSrc[i] << val); } #endif return ippStsNoErr; } IPPFUN(IppStatus, mfxsLShiftC_16s, (const Ipp16s* __RESTRICT pSrc, int val, Ipp16s* __RESTRICT pDst, int len)) { return mfxsLShiftC_16u((const Ipp16u*)pSrc, val, (Ipp16u*)pDst, len); } oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvccommonfunctions.h000066400000000000000000000203151443134507600264120ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Optimized function(s) definitions // */ #ifndef __PVC_COMMON_FUNCTIONS_H #define __PVC_COMMON_FUNCTIONS_H #include "ownvc.h" #if (_IPP >= _IPP_A6) #undef deinterlace_filter_triangle_upper_slice #define deinterlace_filter_triangle_upper_slice deinterlace_filter_triangle_upper_slice_mmp void deinterlace_filter_triangle_upper_slice_mmp(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_middle_slice #define deinterlace_filter_triangle_middle_slice deinterlace_filter_triangle_middle_slice_mmp void deinterlace_filter_triangle_middle_slice_mmp(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_lower_slice #define deinterlace_filter_triangle_lower_slice deinterlace_filter_triangle_lower_slice_mmp void deinterlace_filter_triangle_lower_slice_mmp(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle #define deinterlace_filter_triangle deinterlace_filter_triangle_mmp void deinterlace_filter_triangle_mmp(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #endif /* (_IPP >= _IPP_A6) */ #if (_IPP >= _IPP_W7) #undef deinterlace_filter_triangle_upper_slice #define deinterlace_filter_triangle_upper_slice deinterlace_filter_triangle_upper_slice_sse2 void deinterlace_filter_triangle_upper_slice_sse2(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_middle_slice #define deinterlace_filter_triangle_middle_slice deinterlace_filter_triangle_middle_slice_sse2 void deinterlace_filter_triangle_middle_slice_sse2(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_lower_slice #define deinterlace_filter_triangle_lower_slice deinterlace_filter_triangle_lower_slice_sse2 void deinterlace_filter_triangle_lower_slice_sse2(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle #define deinterlace_filter_triangle deinterlace_filter_triangle_sse2 void deinterlace_filter_triangle_sse2(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #endif /* (_IPP >= _IPP_W7) */ #if (_IPP >= _IPP_T7) #undef deinterlace_filter_triangle_upper_slice #define deinterlace_filter_triangle_upper_slice deinterlace_filter_triangle_upper_slice_sse3 void deinterlace_filter_triangle_upper_slice_sse3(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_middle_slice #define deinterlace_filter_triangle_middle_slice deinterlace_filter_triangle_middle_slice_sse3 void deinterlace_filter_triangle_middle_slice_sse3(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle_lower_slice #define deinterlace_filter_triangle_lower_slice deinterlace_filter_triangle_lower_slice_sse3 void deinterlace_filter_triangle_lower_slice_sse3(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #undef deinterlace_filter_triangle #define deinterlace_filter_triangle deinterlace_filter_triangle_sse3 void deinterlace_filter_triangle_sse3(const Ipp8u *pSrc, SIZE_T srcStep, Ipp8u *pDst, SIZE_T dstStep, Ipp32u nWidth, Ipp32u nHeight, Ipp32u centerWeight); #endif /* (_IPP >= _IPP_T7) */ #endif /* __PVC_COMMON_FUNCTIONS_H */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvcdeinterlacevideoplane.c000066400000000000000000000313571443134507600275220ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Function(s) to deinterlace video image(s) // // */ #include "precomp.h" #include "pvcown.h" #include "ownvc.h" #include "pvcmacro.h" #include "pvccommonfunctions.h" #if (_IPP >= _IPP_A6) #ifndef imp_mfxiDeinterlaceFilterTriangle_8u_C1R #define imp_mfxiDeinterlaceFilterTriangle_8u_C1R IPPFUN(IppStatus, mfxiDeinterlaceFilterTriangle_8u_C1R, (const Ipp8u *pSrc, Ipp32s srcStep, Ipp8u *pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32u centerWeight, Ipp32u layout)) { Ipp32u edgeWeight; /* check error(s) */ IPP_BAD_PTR2_RET(pSrc, pDst); if ((3 > roiSize.height) || (1 > roiSize.width)) return ippStsSizeErr; /* create pixel's weight(s) */ if (256 < centerWeight) centerWeight = 256; edgeWeight = (256 - centerWeight) / 2; switch (layout) { /* process upper slice */ case IPP_UPPER: if (16 > roiSize.width) { IppiSize size; Ipp32s x, y; /* skip upper row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); /* set new source line */ pSrc += srcStep; pDst += dstStep; /* process all lines except last one */ for (y = 1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; } else deinterlace_filter_triangle_upper_slice(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height, centerWeight); break; /* process center slice */ case IPP_CENTER: if (16 > roiSize.width) { Ipp32s x, y; /* we need to process last line from previos slice */ pSrc -= srcStep; pDst -= dstStep; /* process all lines except last one */ for (y = -1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); } pSrc += srcStep; pDst += dstStep; } } else deinterlace_filter_triangle_middle_slice(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height, centerWeight); break; /* process lower slice */ case IPP_LOWER: if (16 > roiSize.width) { IppiSize size; Ipp32s x, y; /* we need to process last line from previos slice */ pSrc -= srcStep; pDst -= dstStep; /* process all lines except last one */ for (y = -1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; } /* skip lower row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); } else deinterlace_filter_triangle_lower_slice(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height, centerWeight); break; /* image is not sliced */ default: if (16 > roiSize.width) { IppiSize size; Ipp32s x, y; /* skip upper row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); /* set new source line */ pSrc += srcStep; pDst += dstStep; /* process all lines except last one */ for (y = 1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; /* skip lower row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); } else deinterlace_filter_triangle(pSrc, srcStep, pDst, dstStep, roiSize.width, roiSize.height, centerWeight); break; }; return ippStsOk; } /* IPPFUN(IppStatus, mfxiDeinterlaceFilterTriangle_8u_C1R, (const Ipp8u *pSrc, */ #endif /* imp_mfxiDeinterlaceFilterTriangle_8u_C1R */ #endif /* (_IPP >= _IPP_A6) */ #ifndef imp_mfxiDeinterlaceFilterTriangle_8u_C1R #define imp_mfxiDeinterlaceFilterTriangle_8u_C1R IPPFUN(IppStatus, mfxiDeinterlaceFilterTriangle_8u_C1R, (const Ipp8u *pSrc, Ipp32s srcStep, Ipp8u *pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32u centerWeight, Ipp32u layout)) { Ipp32u edgeWeight; /* check error(s) */ IPP_BAD_PTR2_RET(pSrc, pDst); if ((3 > roiSize.height) || (1 > roiSize.width)) return ippStsSizeErr; /* create pixel's weight(s) */ if (256 < centerWeight) centerWeight = 256; edgeWeight = (256 - centerWeight) / 2; switch (layout) { /* process upper slice */ case IPP_UPPER: { IppiSize size; Ipp32s x, y; /* skip upper row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); /* set new source line */ pSrc += srcStep; pDst += dstStep; /* process all lines except last one */ for (y = 1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; }; break; /* process center slice */ case IPP_CENTER: { Ipp32s x, y; /* we need to process last line from previos slice */ pSrc -= srcStep; pDst -= dstStep; /* process all lines except last one */ for (y = -1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; }; break; /* process lower slice */ case IPP_LOWER: { IppiSize size; Ipp32s x, y; /* we need to process last line from previos slice */ pSrc -= srcStep; pDst -= dstStep; /* process all lines except last one */ for (y = -1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; /* skip lower row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); }; break; /* image is not sliced */ default: { IppiSize size; Ipp32s x, y; /* skip upper row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); /* set new source line */ pSrc += srcStep; pDst += dstStep; /* process all lines except last one */ for (y = 1;y < (signed) (roiSize.height - 1);y += 1) { for (x = 0;x < (signed) roiSize.width;x += 1) { pDst[x] = (Ipp8u) (((pSrc[x - srcStep] + pSrc[x + srcStep]) * edgeWeight + pSrc[x] * centerWeight) / 256); }; pSrc += srcStep; pDst += dstStep; }; /* skip lower row */ size.width = roiSize.width; size.height = 1; mfxiCopy_8u_C1R(pSrc, srcStep, pDst, dstStep, size); }; break; }; return ippStsOk; } /* IPPFUN(IppStatus, mfxiDeinterlaceFilterTriangle_8u_C1R, (const Ipp8u *pSrc, */ #endif /* imp_mfxiDeinterlaceFilterTriangle_8u_C1R */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvcmacro.h000066400000000000000000000025651443134507600243010ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // Intel(R) Performance Primitives // Video Processing Library (ippvc) // internal macro definition // */ #ifndef __PVCMACRO_H__ #define __PVCMACRO_H__ #include "owndefs.h" #endif /* __PVCMACRO_H__*/ /* End of file */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvcown.h000066400000000000000000000027071443134507600240010ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Intel(R) Performance Primitives // Video Processing Library (ippvc) // */ #ifndef _PVCOWN_H_ #define _PVCOWN_H_ #include "ippdefs.h" #include "owndefs.h" #define IPP_BAD_RANGE_RET( val, low, high )\ IPP_BADARG_RET( ((val)<(low) || (val)>(high)), ippStsOutOfRangeErr) #endif /* _PVCOWN_H_ */ /* End of file. */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvcvc1functions.h000066400000000000000000000031651443134507600256170ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Declaration of optimized function(s) for VC1 // */ #ifndef __PVC_VC1_FUNCTIONS_H #define __PVC_VC1_FUNCTIONS_H #include "pvcown.h" /* declaration of optimized function(s) */ /* for ippiFilterDeblockingLuma/Chroma_VerEdge_MBAFF_H264_8u_C1IR functions */ #if ((_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7)) /* VC1 rangemapping function */ void mfxrangemapping_vc1_sse2(Ipp8u*,Ipp32s,Ipp8u*,Ipp32s,Ipp32s,Ipp32s,Ipp32s); #endif /* ((_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7)) */ #endif /* __PVC_VC1_FUNCTIONS_H */ oneVPL-intel-gpu-intel-onevpl-23.2.3/contrib/ipp/src/pvcvc1rangemap.c000066400000000000000000000066051443134507600253760ustar00rootroot00000000000000// Copyright (c) 2018 Intel Corporation // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. /* // // Description: // VC1 Range Map transformation // // Contents: // mfxiRangeMap_VC1_8u_C1R // */ #include "precomp.h" #include "ownvc.h" #include "pvcown.h" #include "pvcvc1functions.h" #define VC1_CLIP(x) (!(x&~255)?x:(x<0?0:255)) #if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #ifndef imp_mfxiRangeMapping_VC1_8u_C1R #define imp_mfxiRangeMapping_VC1_8u_C1R IPPFUN(IppStatus, mfxiRangeMapping_VC1_8u_C1R ,(Ipp8u* pSrc, Ipp32s srcStep, Ipp8u* pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32s rangeMapParam)) { Ipp32s i=0; Ipp32s j=0; Ipp32s temp; IPP_BAD_PTR2_RET(pSrc,pDst); IPP_BAD_RANGE_RET(rangeMapParam, 0, 7); if( (roiSize.height<=0) || (roiSize.width<=0)) return ippStsNoErr; if((roiSize.width>>3<<3 != roiSize.width) || (roiSize.width>srcStep) || ((roiSize.width>dstStep))){ for (i = 0; i < roiSize.height; i++) { for (j = 0; j < roiSize.width; j++) { temp = pSrc[i*srcStep+j]; temp = (temp - 128)*(rangeMapParam+9)+4; temp = temp>>3; temp = temp+128; pDst[i*dstStep+j] = (Ipp8u)VC1_CLIP(temp); } } } else { mfxrangemapping_vc1_sse2(pSrc,srcStep,pDst,dstStep,(roiSize.height),(roiSize.width>>3),rangeMapParam); } return ippStsNoErr; } #endif //#ifndef imp_mfxiRangeMapping_VC1_8u_C1R #endif //#if (_IPP >= _IPP_W7) || (_IPP32E >= _IPP32E_M7) #ifndef imp_mfxiRangeMapping_VC1_8u_C1R #define imp_mfxiRangeMapping_VC1_8u_C1R IPPFUN(IppStatus, mfxiRangeMapping_VC1_8u_C1R ,(Ipp8u* pSrc, Ipp32s srcStep, Ipp8u* pDst, Ipp32s dstStep, IppiSize roiSize, Ipp32s rangeMapParam)) { Ipp32s i=0; Ipp32s j=0; Ipp32s temp; IPP_BAD_PTR2_RET(pSrc,pDst); IPP_BAD_RANGE_RET(rangeMapParam, 0, 7); for (i = 0; i < roiSize.height; i++) { for (j = 0; j < roiSize.width; j++) { temp = pSrc[i*srcStep+j]; temp = (temp - 128)*(rangeMapParam+9)+4; temp = temp>>3; temp = temp+128; pDst[i*dstStep+j] = (Ipp8u)VC1_CLIP(temp); } } return ippStsNoErr; } #endif //#ifndef imp_mfxiRangeMapping_VC1_8u_C1R oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/000077500000000000000000000000001443134507600200345ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/Coding_guidelines.md000066400000000000000000000742371443134507600240060ustar00rootroot00000000000000VPL Coding Guide ============ Contacts: Miroslav Goncharenko (miroslav.goncharenko\@intel.com) # General information This document introduces code guide which should highlight some most common issues and bad practices existing in VPL library's code. This document doesn't cover questions related to comments, code alignment, spaces/tabs and naming conventions. It focuses on code, logic and implementation. These tips shouldn't be considered as strict rules, they are just good piece of advice on how to implement your solution in modern C++. But please be sure to know recommended way before implementing something different. Violations of these rules must be committed consciously, other ways better solution is most likely just to follow guidelines. Feel free to improve this document. Bring more examples and rules. But please try to keep size of document small enough. This document is for wide audience of developers, so avoid insufficient details and rare cases. # Table of contents * [General rules](#general-rules) * [Code comments](#code-comments) * [Includes, namespaces](#includes-namespaces) * [Macro](#macro) * [Types](#types) * [Memory management](#memory-management) * [Smart pointers](#smart-pointers) * [Exceptions](#exceptions) * [Writing a class](#writing-a-class) * [Functions](#functions) * [Modern syntax sugar](#modern-syntax-sugar) * [Threading](#threading) * [Standard library](#standard-library) * [Common mistakes](#common-mistakes) # General rules 1. Do not overcomplicate your code, every single block which makes some work should be as local as it possible. Person who reads the code should receive minimal context to understand the logic. - Keep variables definition local, i.e. as close to usage as possible. - Introduce new scope if it helps to isolate logical blocks. - If function checks parameters, check them immediately at function entrance. - Do not write huge ```if```/```else``` blocks. - Prefer to write short code under ```if``` and long under ```else``` statement. - If program reaches some invalid state and you want to signal it with return code, return immediately. Do not carry this information till the end of the function to final return statement. Wrong: ``` mfxStatus sts = MFX_ERR_NONE; mfxU32 buffer[100]; // 50 lines of some code without sts and buffer usage sts = WriteDataToBuffer(buffer); // 50 more lines return sts; ``` Correct: ``` // a lot of code mfxU32 buffer[100]; mfxStatus sts = WriteDataToBuffer(buffer); MFX_CHECK_STS(sts); // a lot of code ``` - Prefer switch operator to giant else-if statements. 2. Keep code at level of 0 compiler warning build. 3. Do not rely on side effects of your code. # Code comments 4. Do not leave dead commented code. In most cases such pieces of commented code will stay in source base forever. Either leave meaningful comment why this code is commented (i.e. determine the condition when this code can be switched on again) otherwise delete it at all. Traces of deleted code will remain in git history. # Includes, namespaces 5. Watch your includes. - Limit it to bare minimum. - Prefer limiting scope of include. Do not put everything to some common header which will propagate it's content to all translation units which don't need it. - Try to capture the balance between spreading headers to many source files, which makes dependency graph more complicated and accumulating many of the headers to some common include header, which may lead to significant code size inflation after preprocessing. - Prefer to use forward declaration instead of including a header if you don't need complete type. - Do not put using declarations in headers. It could lead to undesired scope expansion. # Macro 6. Use macro only if you want some compile-time instrumentation. - Other ways use functions, templates and constants. Example: ``` // Instead of #define BLOCK_SIZE 1024 // Use constexpr BLOCK_SIZE = 1024; ``` - Remember when you pass something to macro, it will be used in the way you provided it and will be expanded textually. Example: ``` IPP_MAX(++i, j); // will become ((++i) > (j) ? (++i) : j) // twice incremented, it is an unwanted side effect ``` - If macro contains ```if``` statements, it should be put in new local scope with ```{}``` to prevent unexpected behavior in nested ```if``` / ```else``` constructions. Example: ``` #define MFX_CHECK_UMC_ALLOC(err) if (err != true) {return MFX_ERR_MEMORY_ALLOC;} ... if (report_errors) MFX_CHECK_UMC_ALLOC(ret_sts); else ret_sts = ERR_NONE; // After macro expansion this 'else' corresponds to 'if (err != true)' and not to 'if (report_errors)'. // This is undesirable side effect. ``` Fix: ``` #define MFX_CHECK_UMC_ALLOC(err) { if (err != true) {return MFX_ERR_MEMORY_ALLOC;} } ... if (report_errors) MFX_CHECK_UMC_ALLOC(ret_sts); else ret_sts = ERR_NONE; // No problems now ``` - Use ```MFX_CHECK``` / ```MFX_RETURN``` / ```MFX_CHECK_STS``` macro for ```mfxStatus``` checks. It allows to turn on tracing. Hint: Treat these macros like an ```assert``` -  expression have to be evaluated to true and no action is taken in that case, otherwise error is returned. Do not put complex conditions into these macros it may reduce readability, if you need such conditions use the following approach: ``` bool mem_pattern_valid = (par->IOPattern & MFX_IOPATTERN_OUT_VIDEO_MEMORY) && (par->IOPattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)); MFX_CHECK(mem_pattern_valid, MFX_ERR_INVALID_VIDEO_PARAM); ``` Do not put function calls inside these macro, it may lead to double call. Example: ``` MFX_CHECK_WITH_ASSERT(MFX_ERR_NONE == SetHRD(par, m_vaDisplay, m_vaContextEncode, m_hrdBufferId), MFX_ERR_DEVICE_FAILED); // This code will call SetHRD twice in debug, because in debug expansion of MFX_CHECK_WITH_ASSERT has additional assert. // It is definitely not what author of the code desired ``` - Include guards must be used for every header. - Include guards are preferable to ```#pragma once```, since the last one is not standardized. But all popular compilers supports it. Don't mix these two approaches, choose one. - Stop (!!) inventing/using maximum/minimum macro. We already have ```IPP_MAX```, ```MFX_MAX```, ```UMC_MAX```, ```Max```. Use ```std::max```/```min``` instead. 7. Do not overuse conditional compilation. - Do not leave dead code under ```#if 0```. Use comments to hide it from compiler (do not forget to verbose your intention in related comment). See [section](#code-comments) about code comments. 8. Use macro when extend public API / functionality. - Fix binary layout of newly defined structs with ```MFX_PACK_BEGIN_USUAL_STRUCT``` / ```MFX_PACK_BEGIN_STRUCT_W_PTR``` macro (they are expanded to proper ```#pragma pack``` directives) to guarantee compatibility with different compilers. - Cover new features which are not in publicly released API yet with API guard. Correct way to protect some feature is to define separate ```#define``` statement under proper ```MFX_VERSION``` guard. Do not use ```MFX_VERSION``` directly in code for such purposes. - Prefer positive condition to negative one - ```MFX_ENABLE_FEATURE``` to ```MFX_DISABLE_FEATURE```. # Types 9. Avoid implicit types conversions - Declare single parameter constructors as explicit to forbid implicit type conversion. - ```std::max```/```min``` won't compile if you mix different types and this is good. - Scoped enums will prevent errors of mixing up different enums - Be sure to know literal types: 1 - is ```int```, ```NULL``` is ```int```, 1.0 - is ```double```, etc. - Use either mfx aliases for types or built in exact-width types (this one is preferred (currently for integer only: ```uint32_t```, ```int32_t```, etc.)). ```int``` is ```mfxI32```, ```double``` is ```mfxF64```, char is ```mfxI8```, etc. - Use ```nullptr``` for invalid pointers, not ```NULL```. 10. Use unsigned types whenever it possible. Unsigned overflow is well defined behavior while signed is not. 11. Avoid usage of local ```static``` variables because it might bring unexpectable overhead. Since C++11 initialization of local ```static``` variables must be thread safe, so compiler generates additional code to provide it. # Memory management 12. Avoid manual memory management - Functions ```memcpy```, ```memset```, ```sizeof``` are dangerous, use them only if you really need them. - Do not copy User Defined Types (UDT) with ```memcpy```, ```operator =``` does the same - Do not ```memset``` POD structs for initialization, use ```()``` or ```{}``` initializers. Example: Instead ``` Class() { memset(&field, 0 , sizeof(field)); } ``` Use ``` Class() : field() {} ``` - Do not use ```memcmp``` for comparison of UDT. Even for PODs compiler may fill padding between fields with random garbage which will lead to incorrect comparison result. - ```memset```/```memcopy``` non-POD structs will lead to unpredictable fails. - Do not use ```memcpy``` if pointers may overlap, use ```memove``` instead - Prefer ```std::copy``` to ```memcpy``` for arrays copying. ```std::copy``` is safer, it could be faster, because it could benefit from knowing data block size, ```memcpy``` operates with typeless ```void*```. Also ```std::copy``` works correctly with overlapping blocks (mind the polarity of overlap, maybe you will need ```std::copy_backward```). - Use ```std::fill``` to initialize arrays instead of ```memset```. - Be aware of pointer aliasing, especially if your compiler is gcc, since it heavily utilizes this feature for optimizations. - Use operator new instead of ```malloc```. In pair with modern concepts of allocators / placement new it could lead to much more flexible and efficient memory management. - Do not check pointer after operator new. If it fail, it will throw ```std::bad_alloc```, and won't return ```nullptr```. - If you want receive ```nullptr``` in case of allocation failure from operator new. Use ```std::nothrow``` specificator. Example: ``` char a* = new(std::nothrow) int; ``` - Do not check pointer before ```delete```. Deleting ```nullptr``` is defined behavior and does nothing. - Avoid macro or functions that check pointers before ```delete```. This considered bad practice and indicator of bad application logic design. Example: ``` SAFE_DELETE (p) {if (p){ delete p; p = nullptr;}} ``` - Do not mix ```new```/```delete``` and ```new[]```/```delete[]```. - Use C++ cast: ```static_cast```, ```dynamic_cast```, ```const_cast```, ```reinterpret_cast``` (```bit_cast``` in C++17) instead of C-style cast. To limit possible cast scope. - Avoid manual allocations/deallocations. Use smart pointers. # Smart pointers 13. Smart pointers is a correct way to handle memory management. They implement RAII paradigm. - ```std::unique_ptr``` is a tiny layer over pointer which brings no real usage overhead, but brings major resistance over memory leaks. Example: ``` // Manual memory management int* memory = new int[10]; // some code if (error1) { delete[] memory; return; } // some code if (error2) { delete[] memory; return; } ``` ``` // Memory management using smart pointer unique_ptr memory(new int [10]); // You don't need to care about deallocation anymore ``` - ```std::shared_ptr``` is a correct way to handle shared object. - ```std::shared_ptr``` is a thread safe! - Copying of ```std::shared_ptr``` involve atomic operations, which has some cost. So don't overuse it. - Smart pointers supports custom deleters. Example: Using custom delete function to return memory to pool after it goes out of scope. - Use ```std::make_shared``` to create ```shared_pointer```. This function will place ref counter and object in one chunk of memory with only one alloc call, also it could bring some performance benefits. (```std::make_unique``` available since C++14). - Use smart pointer as if it was an ordinary pointer, don't call ```.get()``` every time you need to operate with pointer. Smart pointers have ```bool operator ()```, ```operator *``` and ```operator ->```. Example: ``` // Following code is valid unique_ptr ptr; // some more code // If you want to check whether pointer is initialized do the following If (ptr) // no need to call .get() { // some code // If you want to get object int t = *ptr; // no need to call .get() } ``` - Avoid usage of ```.get()``` function because it potentially leads to losing control over owned pointer. In such situation raw pointer may be used by other code even when owned object is destroyed by destructor of shared pointer. - Do not use ```std::auto_ptr```, it is deprecated and removed since C++17. # Exceptions 14. Exceptions exist! Your code most probably throws them even if you don't do it explicitly. - Operator new throws ```std::bad_alloc```. - ```dynamic_cast``` to references throws ```std::bad_cast``` in case of failed cast. - Use ```nothrow``` specifier for methods which don't throw. - Do not use explicit throw lists as functions specifiers. They will force exceptions which are not listed to be converted to ```std::unexpected```. It is deprecated and removed since C++17. - Always have at least one ```try```/```catch``` block with ```catch(...)``` to stop the exception and signal an error in block that assumes to be ```nothrow``` (at least you need such catch statement in main). - Use ```const``` references in catch expression to avoid excessive copies. - Exceptions are cheap on a happy (good) path having almost no overhead. In comparison ```if``` operators for return statuses slow down every call even successful ones (+ return status occupy additional register). - Pushing to container may trigger allocation calls and cause ```std::bad_alloc``` exception. Example: ``` // The following code is not exception safe std::vector p_int; int* t = new int(); p_int.push_back(t); // <- may throw an exception, then t pointer will leak ``` - Exceptions is a powerful mechanism of tracing errors and displaying trace during stack unwinding procedure after error. Think about benefiting from it. - Do not throw exceptions in destructor. It could lead to double throw during stack unwinding which will lead to ```terminate()``` call. - Do not throw exceptions by pointer, it\'s hard to manage exception object life-time and ownership. - Prefer to use dedicated exception class instead of throwing ```int```/```char*```/```double``` etc. - Don\'t re-invent a wheel, consider to use existing exception classes from `````` header. - If you decided to create your own exception class - inherit it from ```std::exception``` (or its derivatives). - Use ```std::system_error``` to convey custom error results through exceptions. - \[Windows\] Don\'t use ```catch(...)``` to catch asynchronous (SEH exceptions), use ```__set_se_translator``` or ```__try```/```__except``` instead. [Here](https://stackoverflow.com/questions/4573536/ehsc-vc-eha-synchronous-vs-asynchronous-exception-handling) is good explanation of synchronous vs asynchronous exceptions. Please note, that both ```catch(...)``` and ```__set_se_translator``` require ```/EHa``` compiler switch, which is turned off by default (VPL explicitly turn it on). # Writing a class 15. Most of the hacks, performance optimizations, advanced C++ language techniques, templates and programming patterns should be localized inside the class or special utility header. Do not use them outside the class / utility functions if that won't improve readability and reliability of code. The main idea is to leave the high level execution path as clean as possible, so developers can understand the intension by quick overview without need to dig in some complicated C++ code logic. - Create a class only if you really need it and this class will be highly utilized in code. - Do not reinvent a wheel. If you need a class for some simple concept like queue or fixed array try to use STL implementation or inherit from STL implementation. - Try to avoid multiple inheritance. - Make interface classes pure virtual. - If you use inheritance make the destructors virtual. - Classes with virtual tables are non-POD. - If class has a virtual method it should be class but not a ```struct```. - Use specifiers override and final for virtual methods in child classes. - Do not use protection ```if != this``` in assignment operator. This is optimization for very rare situation, but which will perform additional check at any assignment. There is almost no cases where this optimization brings any benefits. - If you use some advanced technics like SFINAE/template metaprogramming, limit them to only class, class methods or utility functions. - Write default initializers in place. That will prevent unitialized object creating. This is especially relevant if default value should differ from ```0``` (like for ```VASurfaceID```). Example: ``` class Point { int x = 0; int y = 0; }; // now creation of Point class without {} or () won't lead to creation of uninitialized object. ``` - Prefer initialization before constructor body. That will save default constructor calls (but actually brings no difference for built in types and types with empty default constructors). Example: ``` class PairOfHeavyObjects { PairOfHeavyObjects (HeavyObject & ll, HeavyObject & rr) { L = ll; // \<- at this point default constructors for r and l already been called R = rr; } private: HeavyObject l, r; }; // This approach solves the problem PairOfHeavyObjects (HeavyObject & ll, HeavyObject & rr) : l (ll) , r(rr) {} ``` - Use C++11 way to forbid constructors or define default ones. Example: ``` // C++03 way class NonCopyablePoint { int x = 0, y = 0; private: NonCopyablePoint (NonCopyablePoint &); }; // C++11 way Class NonCopyablePoint { int x = 0, y = 0; NonCopyablePoint (NonCopyablePoint &) = delete; }; ``` - Add ```const``` specifier to methods that doesn't change class state. Example: ``` class my_vector { ... size_t size() **const** { return size; } private: size_t size; ... } ``` - Declare ```struct```s in C++ way, not in C way. The C++ approach really defines a type with desired name, but C way declares a new pseudonym for nameless types. The last one may create painful issues during includes. Example: ``` // C way typedef struct { int x, y; } Point; // C++ way struct { int x, y; } Point; ``` - Be sure to know [rule of three and rule of five](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)). See picture below ![C++ special members](pic/cpp_special_members.png) Figure 1. Table of user declared / compiler declared constructors/operators - You can use copy-swap idiom in assignment operator to guarantee state invariance in case of exception during copy / move constructor (i.e. it guarantees that object won't be in "moved from" state or it's state would be somehow affected). Example: ``` my_class& operator= (my_class other) // here copy ctor or move ctor is called, so if those constructor fail - current instance won't be changed { this = std::move(other); // replace content of current instance by content of copy } ``` # Functions 16. Use following tips for functions. - Declare small frequently used functions as inline. - All class methods are inline by default. - Declare functions with scope limited to current header file as static. - Always check return statuses if function returns some. (Note that functions ```fread``` and ```fwrite``` have return statuses). - Check input parameters. Especially pointers. - Prefer to pass objects by reference instead of pointers. - Avoid default arguments, leave this feature only for backward compatibility. Example: ``` // This is always true statement, default second argument of DetectFrameNumGap masked typo if (view.GetPOCDecoder(0)->DetectFrameNumGap(slice**),** true) // Correct code is following if (view.GetPOCDecoder(0)->DetectFrameNumGap(slice**,** true**)**) ``` - Use ```const``` qualifiers for parameters passed by reference/pointer and for class member functions everywhere it is possible. - Prefer to use function return value instead of passing out parameters by reference / pointer. - Mark free functions that you don't want to expose as ```static```. - Remember that calculation order of arguments required for function call is not specified. # Modern syntax sugar 17. Modern C++ brings a lot of powerful syntax to ease most commonly used operations. This is a limited list of most useful ones. - Use ```auto``` when type deduction is trivial. This will save space in code, remove unnecessary noise in declarations. Example: ``` std::reverse_iterator> it = vec.rbegin(); // it has complicated type auto it = vec.rbegin(); // auto reduces visual noise, type of variable it is easily deducible ``` - Remember that ```auto``` doesn't deduce references and ```const``` (and ```volatile```). - ```auto``` is very powerful in templates. - ```auto``` is the only way to create lambda function object. - Be aware of rvalue references and move semantics - this allows to reduce copies. For template functions prefer to use forwarding references. Example: ``` template void foo(**T&&**) ``` - Don't forget about Perfect forwarding (```std::forward```). - Since C++11 all containers have method ```emplace```, which creates an object of desired type right inside the container without any copies. - In most situations is better to move smart pointers, but not to copy. - Since C++11 RVO (Return Value Optimization) is mandatory for compilers. - Try to limit usage of lambdas to situations where you need functors. - Remember that lambdas can't me moved, every copy of lambda is also a copy of it's closure. Possible solution in situations where you need multiple copies of lambda with heavy closure is to use ```std::function```. - Using declaration is more powerful since C++11, use it instead of ```typedef```. - Initializer lists make initializations of complex objects more straightforward. - Range-based for is an easiest way to iterate through any container or array. ``` // remember that auto doesn't deduce reference, but in most situations copying of an object is still faster than pointer dereferencing (using a reference equivalent to pointer dereferencing) for(auto& item : container) { // do something with item } ``` # Threading 18. Use threads implementation and synchronization mechanisms from modern standards. - Since C++11 ```std``` has a type for threads, use ```std::thread```. - ```std::thread``` has limited interface in comparison with native threads, so you can get POSIX interface through ```.native_handle()``` method of ```std::thread```. - C++11 has powerful cross-platform synchronization primitives (mutexes, lockes, condition variables). - C++11 has built in atomic variables, which actually still could be implemented via ```mutex``` if HW doesn't support real atomics (use ```is_lock_free``` / ```is_always_lock_free``` to check). - Volatile is not atomic! It doesn't give any atomic guarantee except that compiler won't optimize operations with it. - Operations with atomic variables are much slower than with regular variables. - Use atomics only for trivial built in types (like ```int```) not for ```struct```s. - Sleep is not (!) a synchronization primitive. - Use scoped locks to lock mutexes, it guarantees exception safeness and provides other benefits of RAII paradigm. - Always protect shared resource access if simultaneous read/write is possible with appropriate synchronization mechanism. - Avoid time of check and time of usage mismatch. In multithread application value of shared variable may be changed at any moment by other thread. For ```std::atomic``` variables this issue can be avoided by putting modifications of variable inside Compare And Swap (CAS) loop with ```std::compare_exchange_weak``` (prefer this to ```std::compare_exchange_strong```). - Limit usage of synchronizations in multi thread applications. The more synchronization primitives application uses, the less benefits it gets from threading. - Prioritize usage of non-blocking locks, such as ```try_lock```. - Try to reduce serial part of program since it is the main bottleneck of multithread application (see Amdahl's law). - Try to avoid spin lock paradigm in work with shared resource, i.e. use shared access. - You can achieve much better design with modern features of language: C++11 introduced ```std::async```, ```std::future``` and ```std::promise```, C++17 added ```std::execution_policy``` for implicit parallelism of stl algorithms. # Standard library 19. Utilize standard library types and algorithms everywhere when possible. - STL developers spent much time to optimize types and algorithms, in most situations their implementation will be the best available. - Use ```std::vector``` for variable length arrays instead of heap allocated arrays. - ```std::map``` and ```std::list``` are node-based containers without random access iterators. - If you don't use ```std::splice```, then it's better to use ```std::dequeue``` rather than ```std::list```. - Vector reallocates it's content at the time of growth, so pointers to elements may be invalidated after inserting new element. - To avoid reallocations ```.reserve()``` memory for ```std::vector```. - Use ```.data()``` for getting raw pointer to ```std::vector```'s data, not ```&[0]```. - ```operator []``` of ```std::vector``` doesn't check validity of index, but ```.at()``` does (it throws ```std::out_of_range``` for invalid indexes). - STL algorithms have generic interface and can be applied to C-style arrays as well. - ```std::begin()``` and ```std::end()``` (```std::rbegin()```, ```std::rend()```) functions are best ways to input range to STL algorithms. They brings unified interface for all containers and built in arrays. Example: ``` int array[4] = {1, 2, 3, 4}; std::sort(array, array + 4); // correct right bound value is begin + 4 (maybe tricky and lead to errors) std::sort(std::begin(array), std::end(array)); // also works and it is impossible to make mistake in boundaries (it also unified code for any container) ``` - C++17 brings ```std::size()``` and ```std::data()``` functions which are unified interface to get data and size of any container. - Use ```std::strings``` for strings. - If you need unified callback interface in your class you may use ```std::function``` to represent any callable object (function, lambda). Remember that ```std::function``` brings heap indirection on every call. - C++11 provided powerful mechanisms for random numbers generation. - C++11 also brought ```std::chrono``` with full functional operations with time and timers. - Do not define limits for built in types on your own. You can obtain them from ```std::numeric_limits```. - Do not write your implementation if you need to find, sort, move, accumulate (get sum or product) elements in containers. Use ```std::find```/```find_if```/```accumulate```/```count```/```count_if```. Except possible errors in implementation, STL algorithms can use internal threading to get even more speed up (available since C++17). - If you need to apply some function to every element of container, use ```std::for_each()```. - Be sure to know all algorithms in picture below (they are the most useful, STL has much more of them). ![Most suitable STL algorithms](pic/stl_best.png) Figure 2. List of most useful STL algorithms (made by Konstantin Vladimirov, see this [link](https://sourceforge.net/projects/cpp-lects-rus/files/slides-cpp/slides-2018/18-algorithms.pdf/download)) # Common mistakes 20. This is list of some most often mistakes seen in code. - Misusage or overusage of references. References are better to use instead of pointers, it allows to skip the pointer check. Some developers consider ```const``` reference as a way to avoid undesired copying of input parameters to functions. The common rule here is that it is very cheap (faster than to dereference a pointer) to copy anything with size less than a cache line (about 64 bytes!). - Use prefix ```++i``` operator. Almost all increments which developers use are actually prefix increments. Use postfix ```i++``` only if you need a side effect of postfix ```i++```. This may introduce sufficient difference for some untrivial iterators. - Always add ```default:``` in switch operator. - If you allocate some buffer during work with C-style strings, do not forget to count terminal ```'\0'``` symbol.oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/HyperEncode_FeatureDeveloperGuide.md000066400000000000000000000323451443134507600270710ustar00rootroot00000000000000![](./pic/intel_logo.png) # **Intel® oneVPL Deep Link Hyper Encode Feature Developer Guide**

**LEGAL DISCLAIMER** INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. UNLESS OTHERWISE AGREED IN WRITING BY INTEL, THE INTEL PRODUCTS ARE NOT DESIGNED NOR INTENDED FOR ANY APPLICATION IN WHICH THE FAILURE OF THE INTEL PRODUCT COULD CREATE A SITUATION WHERE PERSONAL INJURY OR DEATH MAY OCCUR. Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined." Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information. The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request. Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order. Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-800-548-4725, or by visiting [Intel's Web Site](http://www.intel.com/). MPEG is an international standard for video compression/decompression promoted by ISO. Implementations of MPEG CODECs, or MPEG enabled platforms may require licenses from various entities, including Intel Corporation. Intel and the Intel logo are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries. \*Other names and brands may be claimed as the property of others. Copyright © 2020-2022, Intel Corporation. All Rights reserved.
- [Overview](#overview) - [Developer guide](#developer-guide) * [Feature API](#feature-api) * [Migrating your application from Intel Media SDK to Intel oneVPL](#migrating-your-application-from-intel-media-sdk-to-intel-onevpl) * [How to install graphic driver](#how-to-install-graphic-driver) * [How to prepare the system](#how-to-prepare-the-system) * [Running application with oneVPL runtime](#running-application-with-onevpl-runtime) * [How to get the best performance](#how-to-get-the-best-performance) * [Choice of async value](#choice-of-async-value) * [Recommendations for GOP size](#recommendations-for-gop-size) * [CPU and system memory utilization on the 4K streams](#cpu-and-system-memory-utilization-on-the-4K-streams) - [Release Notes](#release-notes) * [Supported configurations](#supported-configurations) * [Known limitations](#known-limitations) # Overview Intel(R) oneVPL Deep Link Hyper Encode Feature leverages Intel integrated and discrete graphics on one system to accelerate encoding of a single video stream. The feature is exposed through Intel oneVPL [API](https://spec.oneapi.com/versions/latest/elements/oneVPL/source/index.html) and implemented in oneVPL GPU runtimes delivered with Intel graphics drivers. For the sake of readability, we will refer to the following Intel processor families by their former codenames: - Intel Xe discrete graphics will be referred to as "DG1" - Intel® Arc™ Alchemist graphics will be referred to as "DG2" - 11th Generation Intel® Core™ Processors will be referred to as "TGL" (Tiger Lake) - 12th Generation Intel® Core™ Processors with Intel® Iris® Xe Graphics and Intel® UHD Graphics will be referred to as "ADL" (Alder Lake) # Developer guide ## Feature API - The feature is enabled and configured through `mfxExtHyperModeParam mfxExtBuffer` interface: ```c++ /*! The mfxHyperMode enumerator describes HyperMode implementation behavior. */ typedef enum { MFX_HYPERMODE_OFF = 0x0, /*!< Don't use HyperMode implementation. */ MFX_HYPERMODE_ON = 0x1, /*!< Enable HyperMode implementation and return error if some issue on initialization. */ MFX_HYPERMODE_ADAPTIVE = 0x2, /*!< Enable HyperMode implementation and switch to single fallback if some issue on initialization. */ } mfxHyperMode; /*! The structure is used for HyperMode initialization. */ typedef struct { mfxExtBuffer Header; /*!< Extension buffer header. BufferId must be equal to MFX_EXTBUFF_HYPER_MODE_PARAM. */ mfxHyperMode Mode; /*!< HyperMode implementation behavior. */ mfxU16 reserved[19]; } mfxExtHyperModeParam; ``` - Application must attach `mfxExtHyperModeParam` structure to the list of extension buffers for encoder’s `mfxVideoParam`: ```c++ mfxVideoParam par; par.NumExtParam = 1; par.ExtParam = new mfxExtBuffer * [par.NumExtParam]; auto hyperModeParam = new mfxExtHyperModeParam; hyperModeParam->Mode = MFX_HYPERMODE_ON; par.ExtParam[0]->BufferId = MFX_EXTBUFF_HYPER_MODE_PARAM; par.ExtParam[0] = &hyperEncodeParam->Header; ``` ## Migrating your application from Intel Media SDK to Intel oneVPL 1. Rebuild your application with new oneVPL headers and link application with oneVPL dispatcher from the package. 2. Change MFX session initialization in the following way (check sample_encode source for reference): From ```c++ mfxSession session; mfxIMPL impl = MFX_IMPL_HARDWARE; mfxVersion version = { {1,1} }; MFXInit(impl, &version, &session); ``` To ```c++ mfxLoader loader = MFXLoad(); mfxConfig cfg = MFXCreateConfig(loader); mfxVariant ImplValue; ImplValue.Type = MFX_VARIANT_TYPE_U32; ImplValue.Data.U32 = MFX_IMPL_TYPE_HARDWARE; MFXSetConfigFilterProperty(cfg,"mfxImplDescription.Impl",ImplValue); MFXCreateSession(loader,0,&session); ``` 3. Please pay attention to `MaxLength` field of `mfxBitstream` structure during bitstream allocation for encoder output. It must be set using `par.mfx.BufferSizeInKB` and `par.mfx.BRCParamMultiplier` (if it's not zero). Bigger `MaxLength` values will lead to huge memory consumption on Deep Link Hyper Encode. ```c++ mfxVideoParam par; mfxStatus sts = encoder->GetVideoParam(&par); mfxBitstream bs; bs.MaxLength = par.mfx.BufferSizeInKB * par.mfx.BRCParamMultiplier; ``` 4. For more information please refer to full migration guide [here](https://software.intel.com/content/www/us/en/develop/articles/upgrading-from-msdk-to-onevpl.html) ## How to install graphic driver * Go to `device manager` -> `display adapters`. Determine which adapter is integrated and which is discrete by `DeviceID` as illustrated on Figure 1. ###### Figure 1: Display Adapter Properties * Uninstall driver from integrated and discrete adapters as illustrated on Figure 2. ###### Figure 2: Device Manager Adapter Uninstall * Install driver on integrated and discrete adapters: `Update driver` -> `Browse my computer for drivers` -> `Let me pick from a list of available drivers on my computer`. Select `iigd_dch.inf` for integrated adapter and `iigd_dch_d.inf` for discrete as illustrated on Figure 3. ###### Figure 3: Device Manager Adapter Install ## How to prepare the system HW/SW requirements: 1. iGPU: TGL/ADL 2. dGPU: DG1/DG2 Set virtual memory not less than physical memory size as illustrated on Figure 4. ###### Figure 4: System Settings ## Running sample_encode with oneVPL runtime 1. Download and install the graphics driver, containing oneVPL GPU runtime. 2. Download and install the [oneVPL Toolkit](https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onevpl.html), containing pre-built sample_encode and oneVPL dispatcher. 3. Find `sample_encode.exe` application in the pre-built `bin` directory of the oneVPL Toolkit installation folder. 4. Run Command Prompt under administrative rights. 5. Run simple example of sample_encode command line with enabled Deep Link Hyper Encode feature: ```bash sample_encode h264 -i input.yuv -o output.h264 -dGfx -dual_gfx::on -w 1920 -h 1080 -nv12 -idr_interval 0 -d3d11 -async 30 -g 30 -r 1 -u 4 -lowpower:on -perf_opt 10 -n 2000 ``` 6. Sample_encode source code please find [here](https://github.com/oneapi-src/oneVPL/commits/master). ## How to get the best performance sample_encode tool has performance mode. This mode enables by using `-perf_opt n` option. It sets `n` prefetched frames (application preallocates buffers and preload `n` first frames to buffers from input stream). Performance mode allows to evaluate clear benefit of the Deep Link Hyper Encode feature, excluding input stream reading from measurements and providing permanent load of Deep Link Hyper Encode with input surfaces. And this is the main requirement for the applications, otherwise Deep Link Hyper Encode will not bring performance improvement if it will not be loaded enough with new surfaces. ## Choice of async value Figure 6 shows performance dependency from the async value. For example, for AVC NV12 4K GOP=60 – common async value threshold is 35. It means, that for async>=35 there are no performance lost and at the same time lower async value helps to reduce memory consumption. For async<35 performance fall lower than 445 fps. But please pay attention, that these data depend on the system configuration (especially physical memory size) and application, in which LE library would be integrated. So, this chart cannot be universal recommendation for optimal async value selection. The chart is for informational purposes only to show possibility of using async value lower than GOP size without performance lost. ###### Figure 6: Async Values ## Recommendations for GOP size Deep Link Hyper Encode don’t have particular recommendations about GOP size. With gop size increasing, the probability of 2nd adapther wait increases, that may be the reason of performance regression. Also with bigger gop size, async value must be increased to have enough queue of input surfaces for hyper encode, that would be the reason of memory consumption growth. ## CPU and system memory utilization on the 4K streams Figure 7,8 shows max CPU and system memory usages on sample_encode application with 4K streams: GOP size 30, async depth 30, input video(dx11) memory, sample_encode `perf_opt` option enabled. Please pay attention, that these data shows usages on clear encoding pipeline and depends on the Deep Link Hyper Encode configuration parameters. ###### Figure 7: Max CPU usage on sample_encode application with 4K streams ###### Figure 8: Max system memory usage on sample_encode application with 4K streams # Release Notes ## Supported configurations - Supported OS: Windows. - Deep Link Hyper Encode was tested on TGL+DG1/TGL+DG2/ADL+DG2. - Supports AVC, HEVC, AV1 encoders in low power mode (VDENC); Direct3D11 and system memory surfaces in NV12/P010/RGB format; VBR/CQP/ICQ/CBR/QVBR bitrate controls with disabled HRD-compliance. ## Known limitations - If encoder configured with MFX_HYPERMODE_ADAPTIVE it will automatically fall back to single GPU when underlying parameter combination is not supported for hyper encoding. - Deep Link Hyper Encode check codec/feature support on each adapter and if encoder on primary adapter don't support it, Hyper Encode will return MFX_ERR_UNSUPPORTED: - as AVC B-frames and AV1 are supported on DG2 and not supported on TGL, Hyper Encode will accelerate encoding with 2VDBOX on DG2 if it's primary adapter and will return MFX_ERR_UNSUPPORTED in the case of TGL is primary adapter; - if application don't set the number of B-frames Deep Link Hyper Encode will try to set the default value from the primary adapter for both adapters to check if it's supported. If primary adapter supports lower value of B-frames, then encoders will be initialized on both adapters with this value. If primary adapter supports greater value of B-frames, then encoders will be initialized only on primray adapter. - For achieving good performance, we recommend using async value not less than GOP size, but this might be not possible to achieve due to memory volume limitation, then we recommend tuning down and share sample based measurement for reference. - Possible low performance gain in the case of fast encoder (target usage 7) on transcoding scenarios due to insufficient encoder loading. oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/000077500000000000000000000000001443134507600206075ustar00rootroot00000000000000oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/4k_max_cpu_usage.png000066400000000000000000000227231443134507600245410ustar00rootroot00000000000000PNG  IHDR!0YsRGBgAMA a pHYsod%hIDATx^O#ס!{C^!ɥY 0Ms60w荬`&{@Y!`dmD_ă{LnC-mܖ(7;ԩRI*sZ00ORW眪o׿Z'?ޞp}F & D` 0h B4!MA& D` 0h B4ׯJG72CM[hzryC%曖*hǴަ4W+ß)[뷺gLF́m=P>w:oF䱷MU:FvX|Lgt*nuؽ vsS{4#mWVh A4vsgQVƑgWv\$Q9R2~ŧ/\Yd۲{"rv:cM<IJ]IE46?b>!s$Vրі`Qit>:g>V֓׋MdMA 51Z]tӣӓ6KoAdRf.WOW>$:{zހ՟RǙ|Yyq;y5E2q+M~Oo'dЬAq ;bf @iXӪxY4EjMPF-ۼ]d9W3ņuA,Z & zEU%A{ãbFӻ}ddu&g/ai9.t_L`K(?M" `[Doc;VxPܳqxɤErKZ"Ԧyi  "L+ K}6g_."56D6 :K9ndidUT=ؒJ> Uᖨ}{6tf 埲KK6Dl)IүyX/:gl;ٮ;%sG\hpkKAoux#v*"c2_C*Xgq^HYJU)}_ݰUhş,pMVw2fjOP*WY\:>]yD^PdV=KX"%O'PºUO2h#`MTQLJtqZ~Sj~0iMЅwYNҘvQ."T`*VV+*Jasmq=Zh&6%$RmV~ݟ|]"s]DM%"£NEY[nP?gc=iJ̔s™S_W?W̎[M*UX"vXż#|9e%n_Wg O>~#3ewgy|ɫSKnh{Vl';iJa6o[B`o(W!Eц)Q/{zmIJvNOO,_kYG2Q횗F`jM v} /W:\]o_BOS;?8/9R~`v MRz$h4J&"QTgzD L3j|7(ׯ=J1ɫ>`i<~_>y$A>NR%)6ke{q5.L_hke&]؜;\fx۷kwϾO'Gy}X 椨.Nh:nŰT m1 ~2D'wcw1S԰ &a5I]=6{{\17i&Ւn% >zpYX6 !VK0?~#.,;V>nvdKoM`m4o}vOcO{_/=<8xwU!k.\髟LH$ y姜 p &p;K'㛏~%>R cPkfoM`-=^Go>S7ƐDl ` lkCz*r}\Wo`~OWc<)_r7V޽~9O>Jdշ\s8zpNT8g:O>`V 1m/IF,U޳޾>hH&^$ݐOn Gȇ+u>*rDܡo''"V]4b=}<J>,Q"N"Xż|ȰНe%h{f,.kЩ ~HYf.k)^;~+n Ѳh+Cp뭈&NY54ҽt:TNú\"-?Olhh1X]4[l+tvdSV 6sYyֲn'a9rllǍYf27?~O_]gf$&oөb~׿G?/n~=tvwwSI4n[eGDqB$0+fYb`\%LNVv˯&nA`y=ӃO]|/$뇿 ~MKw^ǁ7*ȐwjL ⸵jL fEu0+TfK&ZM7 BP"Z}5| ]KG԰X dPpE&=:?w>~/ ϟܿsQ0 dc뜣ws_s sQ-r[kU"Xo~{&J|>wߟp9%h*Bޏ\G4D -?G%"_kwBo ޣ`ɋZ 2EV EĞ#]Ӄꂐv$iG+I;O윞8nK7<'WkYGA9zF,3Lu+w^CP"F8LCR)=h4%G+lR..bqSvfŒLNVv˯&F@]'Q(P"D6%Ib{= >%"aTEE 4椨ܶH+")UA\ :4Q(P"D6jMA& D` 0h B4!MAVD?@g1:m7~J0k[\ Tb4'FGhq0*r^%70srQȗKJ&aُ&^C|9e%d5I&l+l';iJa6o[B`VX'h}X;ulVŽ' vNOOX]sU^ֲ՚_"FzS72gdr~~G[uhB1 aJ4oww7JD(9XQfs$ FkaN)" x횗_Mr݁O>!(PDLClJD{fu%F]?,}X rrsRT=SdH+")UA\ :4Q(P"D6jMA& D` 0h B4!MA& +|DYn[>O E"Pr4e=:+SltzouS9^ z)P7MDPb%Gsj"Xż#|#" %ufY#d'R:~k\X7ktooOu4XR/ݨ;tWcRj,+WUr\\~=%b4i(n*#FGMN;yoI4񃉞 07ýwE6O>!(PDLClJDx-o=ZYOlʙVZ R+)3խD^koW*>,M99)n+iZTe :uqDBq1 %h8D` 0h B4!MA& D`D=-G>6g1::qS`VH&nԲ Ōn*AO);DfTzi?X)wSa–/ZC["C" Nv,lƅ0u`úlߩ;&e=`ޞk-h#:>ZsS+ȱ]{j.kd29??#׭z:yE!@0 %bJķJHhDN #ҍ0ELN]+Q;C9=%b4i(Mh R=;V0+BnД-4IQuo]"_/Ҋ+jnJinP.WlZۍkJ(i(P"ZYkp& D` 0h B4!MA& +|fO>A'J=^ǧ#//uqouSP z"SlYNṅ=w(ɉ&"V1/l95tj,M ӜUV0TMUTX\XV"Š}SVpkM@5%b4i(M5ZD` 0h B4!MA& D` 0Ȋh2}_ՓKݶ|4 2뷺JGT8kax89D^Z? VR4*9НfY K" Nv,lƅ:szzfyZ:Et8v֑JXخU:eUܳg vvv?Gx?я޽GFˏ&bD&9jZI#nĒI :keiXdaO6LIl;%5 AS^ۜUV_+ g-NW Wu0sSݪgLmԠs]p\X#MA& D` 0%;_ 3Jmus:\-vĨh2л^Gdz4S|GOtO#n<~"Lё*nK0Ot١?#\27mݟd)؞;<;|ZVW$ʦQ\X^s*j'MynJM x̷ca\~M.˿'*'هln{R/̷q)wfK>,Q Kw͈?tqܳy$'_We . Z&=d/%[w&/4񒜲8-=}|E7D w\g~M^^cz?jUo *;}FuS[w뷆Y(\ #t&Ӧ]ŵWk?Aۭ`35l#<x^M=H2Ϡow~_kįEQO^S>knwu;Nˮtw8 zP]+U`e՚C48.bLuإR5:ڥfŷ|0~U#B{ D]w= i815kԴw 7ZbIjMA& D` 0?e_-w= 7FZ4MA& D` 0h B4!M0mJ7Xׯڮ)%oۖcY|q& rT1 ~0*8).蹖M2YVgݪn)=q'~DL?D$ fQFĠAGH|q&JPgϔm +F4A@:bf&#'Pb [n;MVNv& ѹNQ^Zp}MJe|qvNOOFie_-$& D` 0?e_-~3= 7FZ4MA& D` 0h B4!MA& D:xZT{jmn0L}Yᅿ7'-ERF*F0c[h\x-Hm7'ţC[^;+zbV#5cSI:2H<f:$rn p;X "X#\ bb?`d]U,0{ .ZV힝u2Y%X|OkJ:#ۨ&ȷ?Mt-q*5lvpO*#[ Fg3+2A^5L D4Y0hVTi0:NmWUjZ"  xX@Ẍ́jPo3Xx=pդFqW^'ue9Yv6VU kjr%m=DRyLYrY~ÿ ѽ4=Jʉ-Z QIT*o[5N6!WJc몁\.w6tDxn`ɼ"LOݓA.qsg%_C0ɶS ;-" Z rɋRmN*DG^ >Gt/ 3kq?/~f.KqE0)[5@^J_J́geq^]qtSWY-޴IQ1$I+z ;S{iq{DHCLL~o")xID*mGq>9R|Fh!aM' `|>D4CbXn.DaIM1)Z4RfWJURTeY~W^{UW/_./˹ypq[: `B`B`B`B`B`B`B`B`B`B`B`B`B`B\nZ.Wif:0=L E .9p80 m\.c3[e+K1`De/mc( hRgIl`*YXY/8^J[ky^]{)%T-BsROQMp IuTÁk8sn6[Ŋl ?_W[* -mu{:5U糔TC00x}d}W`zs5Uv9'ˉR\%'no!'ϧykJh2#4)h@4pknl$]R>}Bwa6K3$K9+^sèD\I6e͌\@5I&k6i-{y| WrrAE]Bol]Y L$Cu5rǝi-{9FV-v|>zl @alUowQ0K{P'D;j.1'v06+FRh<56'-@s=rCo@au޵_4٤kw+hAdr%gF#s9c]"1jQ7ܻ?ڹm<^0mݧϯ?FxDbdփ=|Un>9${{G ?~W ޮz<ܰ^Zo;EUj|&#D&Fhlt_9:a-iU?EZOvn|D[p8 ݧ 2Ճ|PpzW km~{@Eh`OW^b+kID0w$^0U[~k =1]T6:kI8m}2:&8?6ڒ-cZ>HȠe/dȱ̌?N]_N!=v 'ZL̸\d\"v깮:Vi9/%q$$^0={H2Hӗr<?`&t>Z,V-{dtHS:nZeL?[9c[tzׯ'%?izֿ|S??;K9y=T48k׮e2=(F(4<ĝƇ;֪qԠ}Ru2\z5TZ}F~YPKyeܻ˳'y2i=-6 2v/<&rpKY otNc{X?l/[59Tȇ&gF~큵[w I~gDkZ;}7\&n*R 0 Ri={_'EhrZ0&z#4Ix[6O]?LMF,,@7X`B`t :b`РBh Bh Bh Bh Bh w,xO@^f!4!4!4!4!4!4j\mz.LUBvTFL@ɡDJ)\ikW\Š۬729\)d2Nrh_Hsh2_.Y;#)LפPm5F)I Y[OO^vk3Gz׭@Θ/^~.OJ:uA~)l{pbX׮]d2z Q>qh"cew 9_3;3s{\ֶ|jpU92 7tFG/vSDff*iRldVWZOWWv0\2ErhйJhR@KEDxкs;#^Z>|A$3 :Ճe8'u1큵zgv F޾xpW}zrn-.ntYCh^a>{Pw,(BL}jX=xxp?sNB W^?"y\t=;!4w~QFsﭾLu,ً{^֧2΍g=^a %S5;3YMAMAMAMAMAM0#ZÃτ'#4Lhm~bă;לO_$3lyAGqB8!~@S&Oav_^5^[1 O~}X=o]w-84& ;2|wtJ 4la %OM/X8<& ݧgg^7{gޫŸzY17t"xCH N1;eRiqrt7l;sHMrZ) :LeW[{2`INrh_\:Vi9/uird 6uk]== %uzݪ͉qh"cew 9t7:uA~u:/XS NMNmrY۲qV!o$@ &7zb/[5Us9yLAL<5;@S&u3@h Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh Bh r&۬=ێH BYod*Bk:`&sh2_.Y H& szhfno./^_077=7nDvۈDtI)./Qr :v`5՛9~*%3kb/[5pWZLئ0!4!4!4!4!4!4۬lQ*gՏamQ e5;F]jƩȎtp&{r>xĕqJBhrҖٖJQdenAbko|.^.p P?x:B^R|ye* SbbEU{W;YodTNP1PL MNAuߐk+6~m.csg 2tŒn;Fw v깜sGY|!'u*-˃/,u &qe0-F"49稕ʿgPZqz5qOkbzYH1'4MN?- mSVL6Awvz:)n&ֈ+ xQV֑Jz 5 zz3`/;3(h;4M`rF8RL5 q8}!491e/>t'ȼ'8h!A]m}/iq~ÊmHSk){JF?.7C]Jܚ%{i=z.V+|hFG~C"!3ybڇ26N_C掏i8R\RO_$OMAMAMAMAM~8R\RM׿8R\Rh!4!4!4!4!4!4!4!4!4rtCr򶣒RruPpP z& 4ꜣVi{' +P:u;Ņ:GլʮU8 ads&WLz&gaEB6׼3\m*2R\lZ r46tL\kV 50ɕ|c`,/WR2R3ٞ#q&W87M&j06韚l;) 4UEb~Idjl)3>Hlj׶J=(=\v~_0? 0w||}"YK\yݶ܋\Qrʊ!]p w5qYod*L$/6٫G}#k&gza~ mfE)OYŬSMt'y`E0+MGZˇ(r8,l|5j[KD000:F7Sz:As7G]J;j>465rM4ږ2K'BF5 ;q^XU*$W*tv 0xCWΘ7tzol:"2e߈lvMhDBKoZ""?2w|%{'& "4 0 0 0 0 0 0 0 0 0 0 0 0 0ǿoz[a[IENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/async_values.png000066400000000000000000000237061443134507600240210ustar00rootroot00000000000000PNG  IHDREWs='IDATxL\6L7nJڵtiRJWm#v)dlJ(qj/XMuY]\36jh( *6N\۱6/'sf9g/a;ys ^* pIHz\F2e$=.#pIHz\F9<<t!\CXSSt!\C#zzz}FMMMjettTee[[[<Q/Y:փ^+uyHxmGGGuuu׍b}}}͵)FUUՖ-[GͲ=z㥥2Jֳ+S=SMk*IY@www_0y@>T:z@]>UpйIZfZH1L-t~ڡ{Y9,l4#;ufIl\fz\&ER#_huwg[[g`ƹZE憈񤶓SG>z%O;yt^=gIU obMs߿zTfz^ow`FS? ޺n}z+jΝz>C#x>,d.͗4~=~;=qhn4&\2lowwͷv}elL=I< χgU>)ĜI;SݛAe7.r}hAq%́n݌@]4UgPo}w>zKmF3_GP^^><;ӜyNz9L%=)7> qt>fLes ko\mKI۳q|9YқڱW)OـG;l'=y ۑihӓSj3}u{z:eA;v{޸co>.vPM+!6O lޥZ"NuS$=tl#1@ـe$=.#pIHz\F2e$=.#pIHz\F2e$=.#pIHz\ollT ͵===mMMMkk,- K2---hN};44۫jhh@+ge2^}-[qݕWWdb>t,{<- =Nzܝ*#$=?z"!@'Lzs][[[MMdww9N<- {2<>sppPѨ- K8s.#pIHz\F2e$=.#pIHz\F2e$=.#pIHz\F2eLv\ZZ% ===PSS$IuVEW[ZZ*++=-A\#GydÆ O?ݲck>,֬Y\;_xꜭ4 E۾` 3˰[{_wttw}9+ @e7uW^5zZz-٪x衇}Qߖgy_19`6m冬˰[tU| ۶mHNg}69[={|:)S"Ii& 5zF,beee gYETEݾ}$J\¦M7xC[@a(j@ ~IP&]?aI)n!#[3I"aU˪ihO>+*-w}w}}{ߓO>W_) @V'JΪ*F7l N\eu[2vuu3.Cu{=gU-Y0;YQcRb eGVs/.C/Fٙqav SI9r~ړ% K.e%YѣGwiƌ<Yݢ,;RIn>P2fdYb~5kȭEU"9ۧ`VQQa8 %Y'y2Kc0C(,fe v+ɤbNHs?88( hTu햌3'}.e$0d}zsHt"遌s9vlـj:dٖ:s#ua#<sy쟧 ݢ5R'ԣsy|Zv.CCQQ6{stx mY2y @2Sf^ȳ{9@8SfCt@&n#pIHz\F2H?'-+[0c$}R׏&&yn}I=z)Y:D􄫙٩}f>/d+>1y-xoe]}1aYcyT;o>7v V/_r~lIڏ`]^5B+LgtY8=KݵRmnOKy[hV$}$c8W&R*9[篫^r]Sqa!E3%w$jEǨȗۻn_t@s*el\5On+t@2CCC555mOOO,h#s{sג9wb_B;0q\>RChON )R7lhh䷑w:?}~@ќU-tٗޱ߶mO?-]]][~``CUU$tʫxZ^ %7_WMym=Oқg}:z.Nzۼy={tG<IcYY|p?y|yɝAþ9zct7m><2:ug$O$gCύ?ˋr;>7rzbQ/XW̾{;4;vطoO00mοO 3ظ'؅e.􎞈bFnGSe!ȅIu9p-ħD$Zt @}.$=\Ǿ޲#1_[hEA ˾ީs4|Oç>)͝++.‚9qJ}$TN/-ϛihhGQ~u>Go A;6zqo2_xd\6?3gihh𖅊G}tǎo,Sm۶mw>L g/2DG2+_47џLۗ K_}kW5Hzȼ.r{;kV^t3G7l`v=IF! Iٵɾ~b˾햒ɾ~bii'M>}m۶ٳIйS4|+YtS/tɩo}>{=OL?}V.[vȽ _r[J"zfر_4" x?=Sd_2ee%^ åw$_z饈qR^ݢ%໺T `">1TOEsi[z# _;:ÖW[}ͫXz_tx{J}zH<<0vi.~XU+_uǬ;#yJH}4߳glx`_zgdܢB_rrGm[0^wqρ383{Mr#w~׾ycǎE{,#=khBk__;::={%yfqi%ȇ~XYYň _?u/خ}osiӦ/K'^-+:mIxhTw-[Fcchkqu׾M,WCҧ7&pOb1oܹs{'7]z"_}{gIU}H"կҭgk?7az QzK9$SOE>-[ڪHzp  Ck۶mWW PSA;v>+$~RY>rWu A4@vk_ a8!I?^R\^o?sFݻ_ .j^~ӟVTT${1w_jjjZ[[}[!}eтjW p3 YF_0ue3dΝ޲۫"444TVVzZ /k_̝r;n] K]~`~Y{3IXiiwx_۷o#x<^O { ?ul}Ki>|;͗$n-* M'{3=fD˗/.))y|:=z!Y<- @^󞐿 oRzy#XtN}W}tκW|^XZͷя~TWW΢[joorw!u''^O%nإOc=oUFu}s}$Ms<}Fإs_UU5::GO$djut#[?x~meEIN.)}Qyݞɤ>ܪceۜg0#fKW&9K2yIj^E}ܝNMݻw{~`ڵ3F.r´?f'9קW5/,e% Jb}7Zvrt@8dadO-[W6_Ԁ|y3y7ѩ-mnIp>h;rbI.c+,(Z8NG>ʱ'#*3,{-]T?I[o-_\}V.W*'_-??qeV钛?y׾|w'>~P W:8 ~|bZ3M_/.KEdR϶v<;QyoTI@֝97vݼK,4I@Nه=/w>/Hz\F2e$=.#pIHz\F2e8;;;e!655BOOO,Դ,d ܹS[;::Qz{{eR[[JY߼y]ʫ<-!+I?00}.3cpYY|'+IIzokk$?WV`g8%櫪tx twwdŒ<'I@;;d ge$=.#pIHz\F2e$=.#pIHz\F2e$=.#pIHz\F2,IǻԷ===PSS$IF%U *++=-A>֭[UK]+iijj z%ବ'}d*cpYY|'DB+ P+OeMns,xZ@d8r}}}]]]gg|FUnY™spIHz\F2e$=.#pIHz\F2e$=.#pIHz\F2e$=. e+5HβWuK~+/˯-[^ 8+>44uVȞyR|[trWP!9CrE娾pP6G<U|ԟa'^daBp1k],V! 7n <dH=^QAmPW #]]j GeY9R T3$N6"swr2kVO7y/X޽{#!HzҾ)h4n]Xx>ѣa(n SPhGR,,̣lxқ3/ԯĉ3eGgE|0$yRΝ;U=YK\e[7Uu|dI'ٓ<޳@﷓w>bSܹSj@qO6wFrf7X¾pbwoܞnls\TGL/uRux+Qkʨ&Kgu ]]ghf:rZfD$ bm[yF,U&I"*qQxn!]8R@56K|D;vhii8 klٲou]D* ߒ6*1s me&@*]aX;XB"*K@Vj9c>)u^xK5|;>_Jj p5",:o4)@$i,ضb@4Fc$@C_#*P8[X6"r**\s'? ‰Kܴi7D8Epa<ªTUa"j*)KW,p%+XKHU\ BTBW S5u H(UcqD`*wE6uAEʗO%mWADH_`.(OWRQ`g*x|t0Hp_^P*G8RXvH\=裍[޾g׮]˗/a-͉3-$@1X0" x)Dx%. rwDa.![m࢐/( 3PJ.:AaE:EXԊ.ʅb% 85 uЭ"{Tv(]xET$^y䖡ڐx|TBQIu"J|iZ(UZ QqF'g77P12T(\@EQ:ˎ4;&VoF+m*Y)GI4a*X !n*iHV9}ߴ,$@ݶ-rFDT)$LI0UCIS7@Z E-k*Ch O"KnHbG4KɎma5ME4 LLR#N@LƆN]J(\`DxV.EvЂ Qg8D߿k׮8q4]' 8޹txKq<tjk]=ut6K ]0ѐa9t`}yӂP%Q&^v=~y~Jt G;WA6Ggyĉt^* nS)=Ƿlyɓ#CScdž\_O0KL) }8*tP]XgWR# K >. 3Lf ڲIb}>}jj2O$s`Tzh{?_~wZ*UV6=n2Z2"*ќ0㵃خ*G]\(}ň.;sgB7M7pî]vo} !>Kb1xt'a(H?C镴Ь`4CڽD21 HvW:b u!#=3}}4wcOMD&F#-;$[,E"&yIWG'OfҨl?~'$!14梘9nE,Rֆ ~33"bsZ ; z4b.>R%.D8 ",Vs5=K(^|@뺾xb˲6osɲ|}HSS3.LTH'>#M " m߾c|l|phhxd4ͥRE -\T576F MtWj+S'Ҧhي)ɏ34hdb˖--ԋ/˙˖-[ydR" M{nhHjr7\/ 7byr/)Zksʐ߶lynӋ/!9<ЂΥ|o%{:ty^eT67ZR2=0Y95ĩ452_d ̼z:-japk!.:,ETG]Dµw^8lD"<"w\s 9.¯0ӵ[gPSvK.IA2Drko_m~7r-K,Ea3'^u F;Vqitc_CWFƺ9s׿ֵk}Ƕ<ӝ6OLL^淼MK.d#>s hw x]w>7ܰUA@'O<Ɵ#m###Ԧt<6~ ;WQWG5USz!??شiSWWÞن0M 1GXg&.t݂_N${Hx\Bmݠ[S(*='>bB1XǡlRU-Ր Du- #L\>=*͏-iǦ*6LK˼~cG7 hR㚡׹xɵ^ֻޘH6%T*NO#tsmu׮>~gucѺMU\U\kwp{ソkɓ0(.H)T( ]vg`ppllLUTh𖖖D" ׾bz]"؎o;BoW$Yv<7,x1O:d]Ǜokk?dV."tAx,*ŋ׮f޼f]W<CGAkX& L֖f  V,[_EE+, .E7驩Pŷr[[[|ONN"`u[ XL Na]]gϞ=#eL = ;ya7_?i7xüyo殻_ԋ/n**.ܬr!̾F=Ci&;sݺutևfJnDTߡ'Ab舲>Խ)kC"HFY(dz -(Iʚ^&űݴɄ,Ir&79.Ǜ|51hz驞3b⢨oyv6ruzP\MbxG/Z 5o@hTCt+ơPP0xbS+nq(_0x.: T;u3eȝ(6 t.7$ulvq۶mX"b?8B*8 6h (*.{m9 n>粖ѱqzڈXUgGSTԈ+w'dO5TM Ox,"0IGuI2MFDS#P>*E ]dM d] $Tkt]U.8>aS7480488<<<>>>22NMӂؕ9諲}cTd\'Owy'"z0ѷ07di>]OA@ 0.N`T { !8v?aTk KPPK^0ż]t%/\DHÂ.ڊ]VBo%ePBVbaW*?lmaebfڪAY/A97ّ m7%K@m޽{ժUL\x}c^*s&;CE/+X8U)3oQt`M_>*7{xy0~_9@}ɘksQ.DwyiDW*,MxP1œQm*$sX"A^t=,Dd9dXT8+"Ob)C_+gC/!l av1It0 a%JZZ$e.!jFXaNf"+Ŋ.E셄ae Gf!.C]*FZRj̅ujCX aLy3Qt !n߲c׮]k֬Yja8#JA* tmEF9-ג0u[HUbbRϜr<{0ebWh3J5 i-"]Dw+ba|5WqDLuu6aj&a-|h4[+V.KZȊ\Ak,j-˕'FrG :QV[9\%x\FE"WE1:U~Bq[;5#lf&¼Wa& 3A+*fԌeH2TT0zG#_pPfDW06uj0{&f"+B|I/c qHȷxF +(hÚ@\鞃tUzݳDIr=:Ka3QqV@]Qj1[łP*gΜQm)f "IL'h*o%MFi olа3}O )_\`hF<׃~V)gDYd|f'qԉ"! *Wն-EEGlITU`avAVѪ2JZ[*@l( r>MX< tF] 4%JKlSKYEKzhћqI_Dؙ6P C]`RV+٘u|VR|ck ;juxjmSVt&C!((S$jA * R@EՒd=Ȓ/ 튎 Ub-؁쫲W :X5XV˄Z$,b*$Ss@Av$mT 1mkC43ZKu-.iW sT/P̘x4÷Uudɡo Y[yg8U,I 1%$ |} 4ÇSS\}&[AJ^̨X C.I8Z䶁Gh 6h/K(gnluEbqQ5ȥEE ,dG~ ##.BtCbUp(b7gk=057 O& @1*+XnE"ᡲ ,|@]J[ /Dyy}d2]n K"E(Yf`@ CPi'GH[YQ"v oT ,6%: A7~ iY\A:iT5RLXTzv.8!~KjBK>Ng ExAZ=4-\.(b$K/ $U0CCjHE"j}}/g]驓ltz ۉlTzYAHJY:. h1L(j-w)`Pa+oX av1h+P:e)fQ/aj&re)\ ޽{…˪pab?|>?<<<00?091"K@ taObX5"s^L:te;t*ZjUcc>~/ "K!9yڪґ-m0&;ު,~͢kj*Ҫˁ2BQ%)'yWHGyQl AcgMA1H"/k&}uٌ"[Q?{L'*[Pso#V2%݂>iw޹:fb2Wv.+@m+WVV5Ծ. @Lԫ[P cZE#A7)x[mll*T.ۧPPƜaQ:EG>\޵cgKK$0  f0$]lG7qe.j}}ΟߎD4tO0b0!o{0u9W6Eՙ5BArI)"5ǂR5U+P\a2 +#SJ9abpa+r?A(ŴZ`:ai`=l \S'N7 cɒ%mmm ?>l6;66"2St@ʢ) I1?w ֦5D2]=SSHFA`CE৐8P3L>AS aE娑6ĹAbՀB%%f"+?sggC/H3a&`L\ EX|y$B\/ǎGTL$4]흜wl4t:HU8Syt׊"vn`j\:ݻusUS ͑憡]ez.E XjiAnb;7#i1K^ڱls4~tόc$-hQ"kz8o9uݵ[~Yjĺ˗V-OZZel´НHTX ;hi7D]Pi},5@ڦm8K5T3:DXRsfWAX^fD,^BZ3UBXV,<}zv-0_ׅD bU Gx)hww7 ?~|`pD< )A<9g~ ɑcN;'ܲyM e{~nYbY"Aap׆ݳhupG_?=ዦU%S"D%_\Y^8a<= m32mx*6P:L q$._3}'7l>5}O>Oo2"ƶFDOsԗ6po$uGu,3ǎfoڼqyō=HU_{l hkoEl!2b6=~:j BtZgH d-IiZ-BD%҆S?=a6(ᒥ0w)FT^5Z;0+L_(R/0(2q)o+0$OLLэhY֡C-[Fw1ſᑑd2  ::VX!"ѱ\.d,S&acTooZϿfՊV9u)O#k;F"h<(HgQO$T7bb)b xˢŮ'yrTlPSA, EObLށ=VYg j{v'6'~tޕ+uYyxûvٱkCvnSsLUu"QyHgDB]BU3uӧVm 4,߷eTZ:|hOt=gZO<4 c|bLEVQOāscGmݺXTl|1p1<0F3@1 ~]6o?fY 9k(I%=@QOD EծPgEu ¼FsӧOoڴStUQ|I_#bp| ٶ j09׬\Oıә ( LO!沰e6rc xWDKƨږU(n]}gt.ŠF'"2-Xvr1M&e1d.VR rr_xXnJ1l]1Kb\W}%`p^"ZZRK z٪׬ư<1犾*1<>=Ѓ]>vU8.!j#=>߭ -?}'* ȋK>p ps}}SS鑑GYfy >O++Ct뢈Aਨ*_'ݞE&1~=zX(=u<_@m{~6\K`)`"Eݚ!hh RyR8w Ɯx^/81X0 PgΜݼy3yaE^@j X޶[nESSӪի{{?onnn{L*d(*uP7` sM7όM uwwEd5"i+/ɺsL f* wl0Fxs=bj"X8tѪ.\x͍j)G.0Q۴N$HmM׭]{1Uu-kvȶn_wӝD-2l$z?E %*^aՇ?U+0rԯ_:Z"OLJE m^zMV 6,4zsSs،];wnٲСC\6]U;% r\(H*1uQSCh\6.Eu_ˎfdWT%GHliڢh i'M)?ໃygV}j^g+Tr$ZԬ1et4p1{'z찆~ֿ|c#_:;d ƘYMQ~gh˶ P"Z2CLNViw86?~}l|_՟oλ'mN ;͛c@mV(2=T4,*WTEAݑ?8eW L`  dD¾e zTzwF/K"Q-ңt'HX<yK]U[x[+L"̛U0 Pda%Blq뭷~߿tR(`[lFZԈ/^U68z(,/ `1,\d!M>a7[7/Dbq33;y7Ϩ@6=BxJ#)Drp.oMLmǝʜ8?8m/;9R yMW4C*ҐjVT#TQ1Ћ9[] & ,B;vرcʕ+V\ǘѳܘNfg H'|mH5VIEѧW˪#*G"#D߱Mٰt(y7<gDá4VDtU>}VFCuH$k(0a$O:lC܋ cѹ2 BNNZ<5Rk[mD/ ׅww 0AP4=Q3j:h2Lǹ@Qj"}TfrE"(TD.'%~N=rKA03-2C" |> ,Z`{8QB뮻;ߺ Yze#"d'jMi X ~G?z*אL%yh !b "gvjbO2+z4gz\Άæhq=Ң:Nh KY]ԀZ&r?~{sq݈5v, %a&{l3=oGO5)Ɉ[Xt ΂t\ sRT0U7nb~7>ƾXHf 8eb&]$Ets)DIdCWh$ESU]#u|sI>:{A dEQD[C*H2fGE8\k^J"}`Ux% IR~tKQ\Eɓ|iW{wٖ"T{"*IQׁu!u+W|쁵V,^0s]; ET"[>x… D0abE<3yXUU1]yiD7|QAW GǦ\[jo0=S[ZE-\ɴQ^ؠз&贯mG$eM6 ݈Eo |KE7V73gζ/X `kXaS#J-a{cnܰ>j24"uL-*l8d"d+@0,Ť{v޶m۪UXlAxbCuZfjw}˲uڰaCSSo: R'zo3MCC|~ҙ#Xuk"v׍xDϜ#}χT jo6FcVpXz䵈Gro~3OwBPg}ɓ!Ȁ8{,EGGǭ޺dZ5p> /LJ5nYȾ&[:RM톬ɒ&J_QQF8K-vPйyM ,#L6oYMjԥ*OW+< !*fڼhhX˲MT/uZE  7&eߡҐ'X̥ͱ؂+~⪵ 7Y>Ұi֬YU-.(͉FlAu|x\9ORA;0}%d9ˮtDz>5>T4=D}յlYQN5gI}C땂@ ůa![9,x\agh3kuvq[vܹꙨH:0BlnG QmM(H'(( $AoT ef GU.>dkQa/1\u=KJ@ ꩧF- `CW(H.V `q{Cw.mq"#J/XFjr#}4ВD>D 5H4G'L'>@|xvj'1o٪n .Q4 z 2H1pแ>y0=-_,2ɰ{Ʀ k4-v޽f͚+ZT$^pe̪~0?~VTYǰ`Y *LDw=x-d@Ba%곗 (tOu"CNO3Y3XN4^6B<%W5w7HND%b8 -  vInb :@#hҷdoT6mv8 'Kd%5>Į頂dQ!&@(}QH kIOS9F}#,1-ĵ툮A\>䚃{V}ԩe@_T0[b-myy׮]k׮]l oEuZ .lcMUbm$ ؒTUǰ@<uYHWd- o?1~G!&@X se-X{Z.|JQq+cN╁fF3 8؃j(=/;s$`!ƣPzCiLd@+traJ<(U۾HW| A!5Sd q:酨JBzm68ϞE% >׏)﹚"Ӄݖ`[A@AWi<*ū>+QW,EX1Ȱ/-֭[tR]7ݳHbY ^+)BE>pj -bB+hL!F vJ1>R3e!3 :eR;z2o T c&L/<#Z@b@90ˀDE1 Tb(U)Aa/&m&Tj""xƒNi"B낖=Aл}Z>gaS*)^-L #"VhL%Iu豘YK ޡ]*0iHmVPb0U:Ā5_( :Hs8vyb̢\^Hu O}E/Q/˄inZnTª3zWJ\왨u0Ab3~ a<ϞEl%BA3b ;@FObF[=$[Z[_ AT jeJȖpU`'xbȪFZ ѯ uQ檢Ѩ29d3ؑARXF`;aJ-3LK)rJ'5^T1RXK0R`ɂE 첵[-adF{))¬AQ>)ܐs V$ME>yrVX^hKX`K†gU\#ӹK8vݎ L1Tai&kK(33Ca^p S,A S*ǠtE".y\p,j3q^a^.!V(ȳDqv`4u{kA.*q8x~X%Iuُ@Z 46zG-.*$x{jઁXj`A~S-_?Xoudh/^0 av1X@RN9bG +`PT"oŨuMV]CѨ-rA¯eY0@<؀sc(`!2}D0S_rq?Dp~EJ?X?Ã,Q8JOr"d'8(l3K V)uMČ3[}GT$  tA8tLkaN6Z raHe}Des nфgi{U>Ve<*Zd-ذ໰Pŧq *2\Kb_VD<[ȅS- ȧ ~VH:H[]= GiFO/:AE,CQk+p c U3 rtMDi{LT]+ŊrU`y JHA/t*!A)GK,MJ0٦5%t^aI{#'V%Qk*\C ԀՑYZbF4gaFe ?h)nϚfU؃C `dIU$k ^Xaz& u*AR, ̋i@&:W"nqqrr]1?bR#@1 uG QOVTD҉}O=~EjBUQ)h6N蛦zjSeDDg ǡ\ڡG.Xtv!lxQQP=U%ݷ^XY\ϒCt aA `a.ii^}ROe62'N224DI5  ;ߪ@)Xt^[Bil%4Bs% 7{TMwp.,thhN]wu`@5?q1gVaXYKҩ"j %][Z5.a-˩t3Қ ť hg;*$Ca{/%T訨Ek E3U7p}zgUOkڐbfdv&%}ȯVJ@ݫ@K #vEIãsL2$Z }銃FIٵk`DO1,-mb 8Ɔi/F_vFɬ1kVX)$JʜmbCAz8k+hytv<<:Nw=u[t:!vzҞ^_̧1gOA_i9[(Vk`Lb! 63)B6G4qMQ!FGD&D4Y-/N Js'µ-%XޭvB%-:t;I>?HVLIڨ0KW8gpΧD Kb׮]===]wի/^++:q 1dz'_#xye.bU٪wz SSc,$qw"WUqcpĈLC#1˲Z4Fd*)=[8(Mx"}+ѡoѹ J #jCy:f'4PI=vF\. H' ^Nt;P@LLWP=6T#pG(Rٕs ,( !+-0Jsc|{<@xݐ7"wNyp>Ir?)6 ۨ.%#̖HTGӚV7ClƬ^)/,ceX\ZkfD!s`de%y:2bPuL&=::N:d d6,sxxA&Hw2BOִ }o,\*Wy.X+ ̞ HPcޮݧv 䳰" .C4q1;XJt:C=z/4AY8tŵ,4551e*X `/c翤AX+%Ⱦ$;X)L+Ɏ?:2M;[wsׇ?+ꚢ_Df<̉'08Hۻw/1GH ?遁W.@'0Ht^5~@ɂ[*J\J<ݻMbyH*xG G0hԂC8tnnM-M޾sc ]{5C{ӧN+ܽ{{PHA1g|V@`%8lF.ٵg+[H{Koݾs߁/mڼ2al Z{7xT"Ԑdoٽ޽v:z˛_ܻo G'6ı#Ǐd%Jܹ~rБCoƩԓ?$twDy٩ɩؿ;~̾C H|f'z +׬^Hzb4b *5ȥ3yFQỶiKK:=ztK:ji=O/\(It@Moz,IJe\]vm* @a(N>&aiaiMNe'c=շkSg{ O]3f`>- X4X<#A1СZL6[x6m+o3>x/}Ko}i8B/3,XxѱQQMBhtCt45]UMGzU\kRT8hѢ5W^& ^fo'f2^x!L6?{\6jg'u.G?ɩɱ={wgS?}c/<??{[2(;\o]w}Xdi4#>(4643߼ӟ^~=l!@,E+J_;%G[AL@g$Eo1xã7x},jäN Q($fbxFnDx--QRt rV]ٽgH% t4;ؙ,`mߑUUTן>{gȳ]9pٳy fΓ(tӍX ޚH$Frub׮mmmXÌb٥$48d*U֫lf P*) \;w 'g@[c%fY0 p .hnn\pmm kcDʕhNgpw.^Jp炎E%h1Z9,!666pHP?>`n6~ৡBA{{.hw{>+(dhK qtؐdA+EYUlP ER_"KGǎ`}ݷrrC'@D hxf`! 0X*wݟ>ҳDTě6+ &'1IU4zM >}S- #Ȃ $y1tVYSd[kmO'>>L -=EѣȲ7!u &h%;q(d}| P[Z~~뮻 @% e4Ri%(G{atYWòAc~&gxx@Ջ3Ȭtf w@z*c-Q<ٗq;HFW@R`5UHP+( #x ¥ !j duIĨA{S'N:(!N*Ӳ-,2 N$z+_ϝf P2ꘊ -4UVo}?|niqgg{g}f@$3d?ϒĚ5k~_w/5`srm6ԺeYXڐnYZn]4?]tYss-?=6]j"?9Um (xo_WOvtt<9riUpڥaf!̾ E^Xݨ D֭YDzيkl1cwI~i 4Dc`gQ,㥸S;hW^|r:Gќ`cRnP;D8n]y9nN6xޞSmegdۂƖO-ZP`bTtRzD"k׈JF 1J'6,bؑtu܁Ugޕ3WHLMMa]R)ֱ:KbzjɓSw4.^Ԉ68{L#HT|~[ü;tb ܸb\vxשJrEŽI5M'ߗI%bF$;xd~{[CLݠ%I}C'z%^1cA4?vt,qtt1ɤ]kmmC4$"&۷'@mom[ќ˛NwʁM.ZjnwIAxqČ`^\=z/&{cZ|T}ǃ{mOEYZ.u1| 1~HpMH){cUVXbbւ;-/~@I='}i癑=v)417uMH)҉:U W]AF*y,Aρ`X(q^4};@+0ށh +K::IV^H XmЛa=\64)tbF7t,5q xZťYJ3YܠꢾѩzHʀS)ΰاmٜmwDQț>Ȃ'(O/4uόjcyހ-Y9ݐlq$ t9'һ =ңQgT-j;Xa|^3 MFRC@e9*(EzIpIG{\v dDYE O! ۖ'ELqb?3PæSd-$Y=KK%]coy;ޱ~ʆ>N @G6\_ iH$B71ΌŌ73yl\ͻ4(ПlTjBƁ5|PiP1]iQ=5ǬH YiR=Ew .&3:c+LHy?. F9J s\?(إg$E| _@c,ͺ UG bJV TD2tp1'(MrطiH~N0t Oy*P/C!d; l@Ijp3v᭄ lDpb`wэ&m,]t+!Rذh2,l'%2EiJqTq09k0R*SAk++zӫ^}QM8.z^-H:F \zE*F;DX8A<{Y@= 2|z3l FF}1%jk7P`;I#DwE:Gƞ٪[G)F(=hD [}tK6Jg%aφF6ۖ~r͒K/zmZ(c&V+coq@>tX@`#xwlݱs׎0t  LT =T$kVLOipIl٘l# |ȇ02e9%7(:x,|L R7/Xڈ]ِ$H6jqpY(3)j "dBPh˪h}`8=MvqCuOU*GK%XIX`TR nAXBn`YNX`;CiKqT0WEY&'*l5.P: AEż ry<4 &~L $j!DÅ &iX1348KAơ q(bZ#D[,g :oYtXbX)MZK .]聀J=1MC=nDS uH[l Pd BmMPK^C$fϲEA:졪BG9#pA;T;0%s`=:SV;>7nD`A$`$J\xMphq˓DY9u 7-o_pݼE75I]RnomW yO͹j^0kѥ7M6-4/pm=$hґ5KQL]{vh¶fIf< 6LdbOUTa]B[Dw%0`9B"d\V)$VZ?ynV:lx&¼Wa3aLea3J>l BIb'*ڕ "JNOЊ! !ij' d%5+V|cvP y\}qRC:-?FhePav{<ʁ4avb[T:_عtNM3Q1"Mf6J-FQ~.=R%,8VE7-S1)kfx7]f^aܗ"R9_˚k -vp㪵weG tϔʂJ+ҹ"ADx!@2)$g1;<&76wuAhHp!{OQńfv։k|Djx0ra! F T"qsO'J qdrʕBPI)z9Pk{ eGLe 6b  aSl_qAٵPU/+'=i{tqBS5:PL"BhtxzH.uU{q%ãiӲ$5ˮ&yH HS|%N#vqjmx__smDkh`邭dפ;$0Y@FL,uTF,D5=ѓe_U\E$-jYԜ45Mh*RQI8_DmeX a72CŊeījUjy6Bn Ul%J2-6;E)PV,\VKO糿)`'< .bnq$\?G8B*Q͐/"He( Id)v:<2wtj8@ bsKaL3U&R$.iVY$t{e9fCENNen>#~d)\-(-;6@ Tmҍ3!nۼ AK(NFp'}5\v  3HS_D.]).i)(Ry |],܊(tȄs;:cmʵ'\gqFq۶XzJxOVeG6ouIOxWRJfg/@RA\juxn9p /o`&i8(!Url @+D8ڬ'>0Y$4۟KiJ]U.4KQc(y?إ#٣ !EIk-P$#T~34h VhV:30p"Q) v2>0.\EUeP OvomZy$ U?1$fbq8} a_CVԹb*Z"}'8ᱡPnh`os7뀢J'fcxn{%oXhY{D҂qt jD12ޠV Mi\fsjhtc4Q%:pxŰ: A2]^IH.|uQԅWF*!~Cq9gb 9HQ&l$t}z7*83().RBDFǂBt;tZ`>]$d\bYahGّ9`:M>O|{~赤UCC?=Y&q(igTbMM7M"~A/ҡǠh|0*RXJGH!LYMC-s6ۆ+% kD+Y2$lq>1R[Q[|a<;8`l\yLtQ57%{]"L253Ga[BGp=s* +iguC"U  쒮gh95e`+Xdb%Q2 Ȍ:Yk ̛ ]oKA`+P`7 @w1.[qy"=KziI_;>֘h"q&ӹM=^I1=a&[2,g̏\}A\3W BAA"&a]CƚP4Y S#r;0T6}Տ DG bydTqpqӶv9݅5mLIgz "C&28>gh:wkEU\Rfs5Pg}ٔb">'l!ZN<.^"}I3X)d~'$'BՄK1`N_fi"L Bl.iK?B_,gV$ǎc{흚ʥRIz8pW<_H2Ѡdtt?2LuHQL۷oG;vl߶}Gs]Μڹ@cSBC=NSahaT Lo,*n#QJXtvkgm[޴iˎwMEܲcc\X f h4_z9s}P˟gZZ(lđn"VH 5$/@`lYSM[<7IOKϏ#iT]t-}ruK;/.5=3&(zy-*!̬h€>;C苈,|w"2tplX &+ĩ% v>ꢈ1:L=H6@jͽ}D<fF4RcysR Izu0C@Ug.f|Ja0hpnj:,~t6|gΡD2 qbɐ ?IX]P8$d  (fpQGQkr5+XPtv$S ;zϞ=G9{+ܱc^Kǟy'=204:ٷ]{zAv6ܧy_$\ؾӓSHsS-/oٲT r !FF,BǏwtt&d4MJOZ_w޻f͊{ĴT$*8;p2`u ,Zpl=0:YO;::04lGE,VD0 zZ2ɱ~'N=Am ޡsMFv<59 U.) 6;sWhٳ09TRE~2'QF?慎#d"yzpj$c{+kΛ^ -!q[t'+.o#R E4A~)! _ /Op2#4\ltJ ey9R8pj AkT]~'~ȇD߳gTz7ݶk[[[Q}NPb 6]1@E V :7[6c-o.+ = a\o~[V^5Y4Mamc5x"O.ݿ7O~=yϢŋ\ ־dɒ;Mg29sX>z;UY7-˷]]]-.喛듟>ѱw]UMkko׻e˗n"Hζv8^OBE7͟_o[oeU NUd;vmM\fm Bv,(KS'>=f>"|lY۲&&'0aUgxi`K1i`qmzAK-((b*bZV%Eo͏>o\w%шU_D%0V4NLX]=0xc <`=˴v; }۩o\ ^??P3[ ;%ްW_L9qCỶ Ǜ:-˾;jbn8i5eJaBx5u@MT-& l7]ztn>!ea3Ed!_ D{d'~}?_|ѣG|G-&'Iw޿~_?x#7ܽaױlSOcGǎx/_f0?O;N?㗿{(kNXv`ƨ'o^/0㦙C i{{{4869֘fSd [[[G,?r˼Dc @;%qId677q''H@o@2!xPPځ4ǡw@烱ǎͩ):o| A~o9þv^^2h!̛X)R6}ڑGiLvر#SIh s~.VTjTaAhѥn8J|Ram!$ߖʁ o[ ޹vf]qR#{][m 5m֘CO`(9(4 )&] ZT-]p.܀^N"׳}ͽ*ȳ`6ODDW$;Cb­#"Qe/rѣ{ΞBU+W]Xb9gyyǶΥKП6mɛy"ɋ.|o{N:5om/3htfphv.YH |Nהgyj`p0carFFe:-MBظ񹆆d2iYv$E {>xQӲDWTTYA|^ ·hBɓz{{mf!h I+X+V\/g7>Ԥ0WuզN "O$]Gs w@  OLL:y!-,0a(Po<c@QdE[G~::OAx@牮+ *p. >) BNļT<5`-P=wntxhu׶vTַu8K#0xo=𭗷nOeV-]692֏dxش5y'[Ċ::808ku/] MJgzmo}~φ 66$]ۘ&3goߺMow2o|l2aiXֲֶ]4%e7M0v᭔J^x+{~45c #KNNe$>v5׼}-X01::gsMh lgO|ݴhîgg*K^n27.&o~[{/Z(:|,W}/e5V]OLێz&Ԇ^D2ܾe_wG,]0qcOr(et6׿_Mo\lQDTU\5;yTֶyr;ƪPRFG!m,]dX+o42l/@iۮ[oW4I1߂qVV}Q Dݰ"4 i ȥrA Qc*1dT*v>?6:S rhL2Ņ%(T/V=:Dб;&etԤ>g D$ϑ1N,bGf?C >Nq0xQB`# \qȫAWMb/e $ѻe;=E};1ǎ M9slKӔX,˗.?g{Zd)/s, v~jikû 56]C]=c=_>='Spֲ\$|QuxR1Q#*D2b5N&\TKFoT@|/KO lj" .٘3JK@ jZr<*0 Cna)8ẕyË4oY0%3L,Zhdx,[L0xt玝׽[o9C(XN.C$]b$-M(v\&?S/|泟c?}ɮH$yv͎-7ݚyۿd".٘8<2}TCKKKʆZVǁX2sX/ bZ],[h+~EdT@IV\B;KW_JA+g:@GY[D-53(Tf {EIl˯ tF^kx΂3ٓUWS<] "]TVeO|EFIqo:x*"iAfb :-ž< o`纆o fӢ3;ΏNX{`Qf]tc=vc۷oG1xJm˲ر`xv%9E"#V:>^u^x< mzzz8pԩ6H Nٳg{,ۙ/inj>{ÇN: ͇9{n|r ŋ544Bǎ =rܹqZn=DL,%IσBTAW5\9st&I$ba_%<7}ep`p||ٳm!|N:aΕkִKtRtCGH?~X׍x<\v C 4tP-0JH{T&E"5 GӴC7K;(!"BK\X! eP F]FU;*QDBGMEK_ il&3$F}U !C M>:HY57n坣G;=z-oZn ɁFS|k_[v-|t6c=?7l!ON%iK|K_  E-\v,X`Lv[z-0$CCGlw`U._Bմ??_W:}>ɟ1Z_o;WX)/ |.fDW0*ӉA*z+C744@`,˂{ko\bkV۾֯' HfԈ"x܋_֯]Ou/u뢑ȁ+_ƛ`0/;v 4 lTU"ZW\L:)$HSXmX-\б0U,[v_j7| \v;x;L{mnjp7\nГS\+Dp An좸 (G 0/B.)Q=2n@* (2m/oݳkUk/_ipWUUibe2+^l*4]0Q:T`HOW8#(w[ v Zy &- Y@A#XUB0z"t!1$P|gA"iV^K.7BDţ_] 11OW4gWP)DS+Z;d{F2f8%M9IvL#**x nFo~Mڠ]ێo2**FS?O64b MQ1Dc&؁IFQ{ =I׭ D +",,܉|>j\"Wa0\׆"^ y*˩X5va(׉ Qt1' N)`o4M K:zӦM~+P캪&Q=39ɡ Hh歗^z)NwFa 4b7HpP\F a分!rUS9z5AheG4S0$xg-&z9T=N9=bTXdL4 !fshqj<M[YWplԈh9tJA^ nX#-Ƈcb떎ry`"`|߅3%CfӝX54Ilal"ۋ P#MC/S=]n6MaK3K!XC kBAb>YsGtˡeC,Mc3iO=)2lϴD櫉"xs?Y7ȸ8'' ҬGu=f,ʩdT7Tۥkz\=3ic%cL.$ILyCV>`htq0qYU'';z5VC"=MQG ꑗaZd0~^mz#8h"EuL˄i `5fW`4f!~#O9yޅ$Ɂ>|tCZjє{A7Syy =o/H@HϏ%1A{ )ƢPQSb9d&,|9*qmZp<_e N$WT`gM3"%IvʛtMI2ᓃNKs2ibk2=Mq,406 2aݱ(Rl/ LAELT(:X(vTpa,TȰ(o3Q `j7]r0g #0tF9$wYz8w! Q"v:T(-SML{؆`p*@;-*U?: M7RsZtbseuDh&B cֶvfPē?v҃Q}_]wuObw~:^"R. xi. DlLC7'l&]ǜXhA*JX\/Hpkr1O@A931>W7bp㉤,)fBUS|^ $ KprzPvЛ%4c9\r -0m*0)(@FD`c7$0`< h*ci0 cySl.V= N#.B>J6kZy7fvPC)+ES" g>5xس]v@@&d%k&YhB2<"dq_~y{׬^| $^* Ń?j%x -RZbzu:88J~@:rf=4K@oDEB"@A4}Ax(GfDɈ"‚ƍ7"d6?746AlEʁ܉_^|~];wbFhI`!lgn.$o588_f$2ˑ 5L02ݴsgHH7"buCq=ȺD\,hCY2 >J9WpqF+i >ȑesCMOG+xpcB#;fNT HNKd>'K$!$iEz;':Ƥ8R0HOևMsQ (Rx5Q:L9r9eM:Mod˞#,TY4;=5娃rd/(jQ'*3›V"H]^ g.PsKz*֬iFo&[a,m#xhXpz3U2IutmіBf ABBR }PApL)_jG2 U=i4RPQ(ϛ2K7!K HsM#ehX."zƖ eO,rŒFR96t&8=_vN*0`P XIY:pӧOC>ɾ޾ikPJKS #{d2t.] A bAoF ܰae n1D qh՚x"P*Ťš+H&SUaqw= B5IFxhv@u1 ؠ7n!sz;OHHhw F (ԛpb@eAeܜu!ۚqac^ Hl@ap4)P8-"wk7$<Β1ǓWXZX@thGGpi ZtGfPsA:,ZjdŕBb#pLcP_~i:i P d@@BJYS7P#e| N 둫 0w*C]ljD;̙q`Wt<,C8^P+*p(YMwf .cQ(ͼD‹/8~Tw;zݵ99ycQ2Fl_;ha.)_W ?k#P~?V1SRB9}"t V @_tbk԰-W: sBTNJ={ry*: ]&*17]`QqD `lxЪlQRto}NDVTc0 LЧ2@mxUSrXmhƄbobf uU,ˆjN8|tsR,/@qlGql$QWU;ob@FOԠde'&Prt__k+bFx*̙K:;͛B;}kd|B #Gۇ7m419Ǝ;y˖'OryGx<>Y-K==OP\7mziۆG4AX<1:i=GO3hٹes== =h:l;>}f۶Sx$J%H$ DcJ}e]Ç]IӰ$$H;ɘnD#BE =Ebzr9[4smՈN`=l٪#8L3= W H ?ѧЃ:tWb0"S#> B.gyLT%-E5 ":Q:e[$gւr! /Ct+N(26:d';u cCB @+F Q@, -tC "( OaDz]턄}=LVy( q4ՠP< #Ⱥ6XRt=&M[00 _,G"*Hv@h[ ڗ`Mw c lhdײ#'i:75}62hs^ *' ΞS.{P%Aq #N(#p7RO<Ɔ?/od2fm;`4海G#!'l 뿾aݚ~||绖,mkI@#C|ƛnVY7h,w{Ǜ\D7 QJ[^H %hڂby}g$^\pR L"1ݑɣ*l+h vf.3ژ.g(w Dy`a?'Qgs) %`YU2 pr&F;ӱLWNsC׎QFQ*G"L"1I|$t52IP,8@:E|^Ćei҃r6 R& a( T a\pS04&&yr)˄+;&*рMpK(#s]\ӆ=1.ZnO-5/| @ѯg#b,\DTƣ|;یH\ŋZZF';wtDmm/mڵ+WT9ѐԳ _~--t˧?ݽ{6ZP">yOO}b}Q*St!JH=n}l]B/gΜ~̙@$9}Z*Z(U'ؿoO{"=sU{ڷn`E*̚9c,8M[n#hZU? D]5 5 7@f, ɓ@Ay$IqN%Ҋ8Ra6ly}n" )CK=\b:x Q=%J-:!#Ҳ.-PDQZf08zPA F-Mň`b{o:|rK'F.8o"@0L&,Y裏E(d2~z[l}V p$ygヌ~dƍ`"x_Z}{}=d)ʇWTeϞ=wﮝ;!KK>SO666hHCumOʗxW,{W \B+HA>i6mھu aÖGzv//bt1{'z|W+/ytw%Ԃ7{ꩧxNN. e!Jw+M+/+;>~\/>W++-;s c h0PC <06WAa;h;DMId:2?i47zuÑp8 0yTLaDo=e%e/FPٮ6P&wn{P-|c@ƌa| )aʹޅ՞U^oljP=i򤜜؂h-[ɔՓ&sϝ_JS$9d:/:}=B/YO:|x-ps 4e[mƨO:Ox'4,\x~EyEiIIoWs>u˖#G&LlkkWU`֬Y֯7[%nؾ };mFeEi8ָ7md3sf 5ҋ/ >D ((.I^xW^\ R\Qn/{s?+f̘>mv"3O+--EO qi].Pg^րW &Xw3,RuT4ةyb 3ӿ?~\6k4:„@@~XA OTX1u 50rq2f: `C:1U'?6e oMӋ6lpy -~ihM/`mw^jdeZZKEijj],KJ`v۽9m\`҄ʲڝ1IeERzap0?'4xNS `O>#"WA'\Ҝg!h%x)O/)[;Y3u%̙5UUU$:TNNPlظ VTYZ E6nDŽJDjFsrU!smQ )x1xKqzVt$%ؼ6F.õe{ٲue]-D-h6cP0m۶_}>qGMt-9kdk{' nZUَk5y܈_3YGA-sq 1uuG,S ֭`m+_yeڌl7)C׷nٚL$'OsK+^]zꪩXYіWVwO7wuM0*̌VIScE7oUQ(ܝ²b0UIٹ{WYYyWww%m\> x:^1C1A-zd6Gˬ[枇}'>\XUBa-Pd힦IS'%E+FkP(|Ҝ-XFhݙPCL :`괩H$4P=~3 1L/ "qf5MEFB.t e"_؍&T*0:D2d)45Fpr e' Zj Z;":DIen,"j/BqaL )A1d?,Lzi{44B.DbFzQ2Q,%C:@M k[ mFl6h%#jGJdGbăpXL^=$eAa&.@6[q|T=ѨRښ"byflk,N5bZ-?`f"x'Jq_`@3,|I~ d5Ӄ]qa@ٓjEqͷ@ۿy h$ ^вZ:JҪ>tc9g]RRqbKg2Y(@!ro󓟼O~я~p!jgAܹs1{--͐*H(}G}g?Bz@bDsr{ؑm* &5il;rpL I< )u!I #7'ZR]NaV"d?LC1] 4T$Rx``0p4Lg1070Mw@@6<T,4$@B@#: ` P D<"G^$F^p}A5(a^rۃdX^tmMCq8|mGt,O㩶U gRT"+aާMeN$RIPZ^z*5Uong19E]~7]E"lmk[fѣG`s[[oߞH$Z+ɋ_ԴgֶRԒʢB}cʐrrgmm[k뾽{[[ZtfcnNQ,TT@I@3mMkVThѫkwջvٷoc?ve'byMM=={ hD5j#z(9AQ́@87}ǎ5F"Bɤ'S&q$4ЀzFChHC>Q E+ldTxtO#4i /ˮ9_T\Z]]5qRż ֢h$meDxysox ۈp4 k#]v 7|bt~YP8eY_TY3y/G푙3ffb-5_͟?+/~9sfC9555׿G?z?ܽwo_<weYI%:Fs`R8́jZA 9ŋt~>GYYԩS' EVy-:zq\tE^YfUU9GD&/Ƴ&Z&g$xƉ9/A4: >Ϗ)~Հ KXE[kFrnڲe'NAA΋`D ѐ` 9Z##N=a]rJKl ) B{iw&8["dcp_@O I!*'DRZtzQGJV$dMu/T(Xh>};BxۓՅl&WtF 67.>꘢i8OtJqEB1o[ ۉцc:֦mR&C qlKe"[ʌa[n;猼\YiMD88ްn[6n's6 y(ZV7 2(QW1J+*@(@CH }2B$x_ Z֧H $18d[$=,>󯖏7t+,Pyy?}:Κꇃ" *L1`lݙv؟9)|H04 $b+VHabuSz^u͙jK}cmm0BniCC||xwrKO[L6 ~-6 q  %sɣ%pxfk qm!iKUeӧP9m$70ΠslZ{}|T#yEcھ" Pc@=>>eh-c& W3FB6ufV!W|#DW1r'86 xfXR0*H. @E/F@npk(oz/ W`x׆$ƌ~zxezz#] V~Ar{d.Em/d NqCs{.x;! с#I2'oqA}e038ܚS-n[ Vh >A]䓑ȘK-o@ [`@h}W vV9+ 8)HѧNGspn;VrtA}8F w@Nz_1͠V)oW(w9o:oʷ`dj ~`zԃbRybx܉kgMȁ`^p hdȱ R4ՠ-̷%- t(_€{Un1HQ[  #H|}[Z- chSܒ\" RߐzH:m9sL|A#dl!s>C*E;-bdxFDKj.'l]~U<6xy/0x/0xO:ûvR1pA.YS="\.`a|1ɠcXJJ mhe84dIN ŞFW?1mo757z8ݱ8A`޵c[mS^xgw;4V7$r$$Ii IdУY,N@EEr= 1æ&gl^1Ey>@0xt6 Emz:A#A_yzaB0ؾU B3lzƚ^zHC`pC&25 `HԽahp;lȑ6#^p ?E2Zn*}З##IAԚc* 4,P`PMꞺ\4_---ގB6lL|DK;"JIn:.AVY/z2C6? 9 P > !gҞHd~*|ƺib0L2&zq=u, 3qf=)D\lNiRQT'M*ʫB~R΄>$),2 ik׮۸%0e7|ۣHd}Ǯ+_y98X{]w<D"U4J (T 剧۞xѧ{gyP$"ٱmϯՓO/}}{ȉFBcꩻyGX),V$鎻>ZYVEiN:tmөH4GICʢޘⲧ[}S;xg|;jٻiư?R')48wvرKW~idm}v蓔L.4^x  ͧN@AyMn;# n w]"@GtjO!Lmw)L _ (=Ap +9_Tfo6u/ĀsMF+#2Cl/+B0+\}鄊 BvL/ṥ/<_X^ZVY5jJMU#0fF`Pʪ |Kvǟ{9wO9YGyC dzBȴ㡞MxqyQIz\d钽Ξ='Pt-NȊy/(/,*E`$  ~10tC`ܛ8v_Gw.k 0)Ir_m bymguٳ! ^>usĉ$Y O2Z3i3VV~r&ucɳgϚ6uj0>8o޼ &4tRrl̩==}n$dKs=)Hݝ}.3pu*h)mPsa)EEA =a;{,ZChS=xڰ9F ')El`;lǴY1pEnuۄ* srY J cD(g: r4'VRZ{Ϯl:q:w8d?{iʖ[zˏ>޽{ߏB@_Jg3/W޵WoEW맞z-A3q>C&^Uu[7Wo};{@mm*<|-[444|ӟ^x'vuW~ߴ1ziٶu|馛Z[[RTSS /*-,,s}ZN47R8U7lhFK"'I[eIf2m[wcw?ppEIfbEHD ( ma'ќ(ݝ9`eyJ&ׯ++++,,S'~^ P23T%~n v_Vx5VWnqCw\`J}.-<`rNT@!:<Upt9h?N5֮(E-jMvz^mZ" O}i<<{3e0EAknzgrin| ZZxooO,/77' 4L#IM9pӟ޹cG[g;,73l42qdU dH/)\4'=]__~ ο_.]_>yEG[#GxV,ped*-BuzIY70@MMM<omnAl۲eԩ_/K<p1L}g>KJ~r]W34ӟ?&lڴc]"믟{]|910CHr"a݀2ݙtz歉x_!tɉVVVeYuS؁(^ DA#Šg %!Ì40|EϦW,_fXf8L-xkǎ?ؑ#uG>t͛wF, 3JHk/zݱXn4??YPT ELvv72݁.D[A xvx0twkO:w7p>Z~O縬p<~5Sgfx;+YW/ѯ'nx7>}9goo|c7,K>%^%>__W^zÊ^Oٍ)!mKmPf&8Yɢ%^b:%"g  ق_VT\O%zDI[&тϘ[XZp;C#QY,`@  ˊK.e&O>y ,Qa݈iaXJմsYg\qμ08 Cwf\L?_P|0-d?N۸'5(?I;P0I,H&?lEјuI&Nܒɀ͜$^T:vc nnoA7zaD*2UOoOehٳMX(EУnիnGl;hzO1 6+^.,f4 ijI[plV+*,#$¿d<1ɬj>jdӽi#7(ۻ'K. ϝ3P T\TN%lDZ}P/Í򏝿x1j"}V+,(Pfu6% t"c4 H$}x/8 XK[:\z+*.<̹pwꊊ]stv!nl߾hʔ)֯߰aÇhC6 λ#`ܥUHft%? / ^?I)S&R)믯=+))/5֭۶ݽUTVnߺyMۻsC* 2g755{{z=uݝIEVښn߰a}g["okfc{{SA$ _W7^2ѣǺ{afA]s͵6mM${=|n {,/l۴yݻ:b|/)d3dsU=5iDM7aÖᩋ3cDHt}cdx=1a]t}tC JEYd9;N!Q7%;"6UK`gŗO Z; Y!i7v^ңSh$0YZ389$[MFOZ2<$Kn`-uSޘ@t}OCcuV;L0*(tM7c|FŭG?j߯=c3gfaaA2,*#{g{Օ}Ν^ee"KsE nUV qF%׮.-*'zzcGZ~͊/zumKs\h\9aBii;iAz@tA蕖UF`Ǝn>9}ȓO޳c2s.Y_0҄j,Ijm- 2ij]==UpbّH$׋_Wrb`*!@ޏ&c;޵Jfr HJ -#_RRp0qRN'p tfC`0 ='hM6#| {`@Ȑ(1`8KP~욃NXT MoЖnᴖt*6*+*)etʼn#ZO#ѺX܂$Y-L瘛M b@^ T;kH yǤmխ*:&-ր1J*Ow(iݱ԰`޴g`"%yQ1e:~Q&2$8"t^Rx(kYƏ"sVO?`l, dVh1e}J3pP$6#\lsYAtKE~(eK2&͞Tz,V9 p }L@߼ O8: xKA9<ԘH/4hۀl<]!  YlH"P0]vBN<577u,ЅL C[ =PN4)`dj)99* aX suI ىyM F'~5mUa1'@4 }l MeiEu <(| no I(Ԅh8٣aզnM%;k, ۧGBۄqK;@mڐ38n/`2bZJf6><$7ˤRR l;1pIV8O㓩dc1+-m04e?63 ڱ | oz$$EĪ?0う2a≍aoӂ^يcV}B!ۺhH|T$O NТziOx>Ҽ$ VmD&ڶ#~ǂۡشwNX,JlG$Z)u p-J*- 3 (zݶ'+DŽQ1\d?2 E}0(C|;@2ަ21p$ -+-^oHeyh0Lez-* |Us:i4l,DIX787f=퐢W[fX0tѲ;"ȚØB@`ӂzg ~X$HCZ6uBU@adᶂZ@:0D)ʄf9 /fs. X AJL6V!֡ETOnAl B$$ fxj|(BQ2TmGĀdÜ,UU7X0"{׆<޵A`ȣ7% *,h8Myr4%2^(vpJ[ؼԣAC)8h%p8@8%YQ`57-j{x}rU"80`7!dN Un[ 4r^8ӑi;%57xzAٜs*-:j^yռj-<3|VrC`3U,X7ޝ+ZF J =Ĵ434yM~n[o4 00eSPlQ̵6!_VKI]U1U.y{Pt8:m8B'KڎIHk: R R>k|sD5OZr   #)`TRHp#=2Ǥn.dݥL4L%/!5㍀y+N=n<8 .$IE:N11;iPmN7LF$]A0 ` Aב $'Ѝu WHSy$RerJ1r6% ma[/\b1[F! b}(ڊ `TߑQ`, ӊpڀ2\|g:27c !; \L,J$bHk7<i ד.w'#X>&'Chb|! - Ol^Ł~34p@Щ`I& ʒuCyȉ~ ÐIqFx^N P4[8-m[7t5l^ĎFW4lJu 2$ϙ# M-AapYːyA=PTF}胮9'') FT xh$T4(Á+@|H~mC#X#`=PaHkp/}t= !,O;vAq8k]JrVRh7 ;?/v0kÎ7G-װaĴDBFzE'i:}O%TA|h {؆l_jme,( $/hVK sD̯bdC*o *#DdnE%E1 4-MBhDqFNDOu ?*þE>a!zVf"%Bi1`N4r./ <$C:= wذ`OGHb`2ӇaN$'f(̀U. PHzkX*2tPѕ ÒV@! in=%ِ7 $J~ "pnv_:M_fR~z,BwiMW`T S!kНcy&+ 3d;Ëf_0V u%Z~t,\vZs|)9.D7 &wTq#O[kҽHBc09f,AvxQ$$:>?税%[d8}*(OUц!oWVlJP!t-;; @ $& :\Q_ `@W pA xpf JP*^u'A΢㳲YZNL` 9jS='rҤZ/C<:iYRpuҿ!P;ƞceACKNY? P* EK Dx임?G"a 4kfPX/0DL:hָZx3Jï2=mdz~7łj&AVC^ < 1R|HwCQ5`$9,R:e 0 G2/hAe"W w(,#iӷGƠ @xI$ÏlD$;8m 4"Jr #r@9TZ1" T}eW,8@pD,–BIU`&5wh - WG#-M%0aFgaLl{_Fga31B46N( =^X,=&lLV =\@s{`4 e$ŸIpA?>c( $5} L^|0)2&1j!a@ˆWUN{ӋHIb*.,L&2l ({Z&AZ0(p,ɠsaE58?neYA7 #%x0$`MXc,kYtǎ`*@`~kp9u$Z x{$2 q0t@ʌ^sׄyydbKKKAA_E$[kƎHG== 5AξS4/yM]܃ -@RS`Ђ 6ҊM%n\FnrXZ^w8-YʧfA(,6$d2"Y )~0`wp t7O6RT&-50RxI@F: ,-A 6 %(1HiNβ0${Ģ#`0]0X I߉yl;p@91XGc/`P{y0]<]L/j2] )ѐq$=)n$UQ~9ůq\{u۶mPUGI$˗/^0w(_bG~ $ ɧFW_~zͷd2yѵk_wgMWTTxЁ_g8rX,  nh8v͏~RZZڣ9aI[NTtwzm<, ː@M^]+K 3d ?5k֮[Dᰩg~~Ϯյwr3O?STk:ZxhCeEU@JLڼy_HPTxW7@U(jS{ 73O=}!/\w/r ;Z_|viN4bA#׈Hʑy=H[ )nS[Fkl$Xpʊsrغ J ?IzM2[IDATHF`#,(~.7=^,gCyH]@?!ٝ1 Wjqm3Zc.*h&҉E$K:|\"`fLnAijW$\*!u9CFX_s" 0FzeXR@0i0|B2m(auhcFgp ֻ<6''H)OXwmc ^a.#w1 pd" _G>RYY @lK.D.×=p}ӧLS,y&U W E^2}ȱ.O|_'TvԿ; aM3ON> h#hOK(`ŭk͸ =9iɓ4f=D>Ƌ'Zdlgk.{_„gOѢg^~o"H%(JIǕ B҆m&ӨOAsBG0`AӚ*}Jw|ik; L9\0L#'/7N\tхs朑x(^OP=qĹs瞷haYyEQ,OpesgTշtilI3SfN6]hΜY%%yyߎ6),7X,kҤHPXXXo/~_զiFPᆰFXsrӧM AhZ03֯;p8&K`P9s:jnjF v$9N E yHZڊb05t6nin7 z$Mpm"I)(,F"`-hOn5S"śCw=$8 TWUȶoQ i$o$8=!)NNZS#SJ6 U}}A>>%+{L-3`܇ ;vcA7=3엞? Y! xW^9>ē~o?_o'?۹kO{sw|sˆG?zs>^ ~O\rinֻ{1olu-16Fig,O@g? ?mhhuѣaB`_tutEH0MTT ?cX(`>hj Aok1M:LT*2E-LHB4M2٬"5NRKKK(pرWkl3gΜp(*rEE%C_qF` F)p9\o} /0zR0$)*W]]+nkmjj9Z tیp ; SZg0 ;g?{ɇ.yꩧә4&H M%N`=u/y M4Q fBPHzt,; emn݆H}rLyO2=2~]&)yw./*R=չĔ];7e{ U1?HUz9}6ig骫e0  $m.o6ߨWqHLL0 wpRDQ-Ueƌ'N,,,4 Dy߹f ܇L2 ǕrhJˊmlj~GDAzޗ_ @. ː'ޗx̛7<''>G x X,VX?ikz9+Vw}}}OOgݑk׮/*;ޫ_sFªxɃJv"84t0k4MꗼbpO:?|鲗_~O[IY)|='KOQMڪvēN0:m]iTD>}{.W /ss\ >o '._>z};W|C" zꢿ{$4n.:!6[ݿ-j>K̬L-m[:PtN8L*cҶM DؿF0AGT8(-L"_2frK3`+ʋDaYmm?` wv |X 3}}}ܵkljX%)g<{x,(,liVsW+;w0|RYIn<#g}·?|ɓu0zzzqHQ_yUY?яowO]_UkWZ),*$ X6L54=%.Y}ꔩ?hf~~~8AdYO{u20壷LѲcڊHM|JoJKKUqnoK o籅]6Ƹؙ&-->~@@вiH"Zaq z:'9k6 GY,}`)8ttq `7): 4G;m\ {}%NSDt[~#݀Yd/ ] E1GXT+;=|rD _ksk}gΝY /7ܵHݴiSϝ^4ݐ/.&'zl !Y'z,yl.w4` ,Px!o(fEHM?]4pRY=kd|EEEnNuoOOsK#G?x`={I%6oDerss;::=|`eeEPPizBnn}VZ -JK}f*(O{{|ӦO,-/dM &M@uuL< `ĔPY]STP;q)SI;1DCND7=IA{e3JVTLyE_ R8>68}r Uܦl~;ݦh4"5As khsI/#X&sO 5뾴 sk"}f*_[ ږi"1QTJ[L nV0/)b&Hb 0c2kK,JֵտR9Rp+l->% t^TjDNlۃBdтEe%v=oKʲihPh [ܲ3YЫ?}0 q#;, Tg/4:FLB@1J>w ȨG!cqXߪ2*F[i# >ᐮZE4?J&O"p0l18ʔU@eFݑ:C&MHd "%Spd4L82-SУ&$cwyz7N"0#Uv+^EvaKjl'0 m-2LpoKI}>Z9d.tLQ# AcuSCoCӡ ,tW#Q#0@jeS#A /)1LQgK=]M-6H5@KP,w<·F#Mw-F%0b,"ް-r|@:غiꃘ?[9 !)e "D Job`}}7z"gt+wAGVl A^~}3+(U":uҨ>zC%9GWfh<)J? ݕe7Gisw.?hARMP`$&hfdT#g&fN0ᇃcHC̲@L U:AI3^ $HoX \=y3&Qh SӴtr`p2H2eEr~]);`>yjހS> +9$a$ x5 y rj J%\LTy1hJR63f/++r0?f5+@E>xd?y;kZ!a i/c#gIc31h}CMaHɏ `K>COrl`qr'q IUbP"}lQdO!188ɒ f fB I lsR dF(`Ɗy¬D۶Q/둋}`-w=m:FIA{;gxsG+mC7g@萼Bi {6YoyZb\r* vFlJ 1G &!#xc蘎d2Ln Ap7-"| Wk L30UT "%I!l~-&@F||GIM`T}>0V +ˊt3`"ZAI|P8~yɁSӾ c% D(+l)%;^0  !NSP ʡr5\*`/L X,>?(P4)E}t . UEQHȴbDf k-}#pJ^8c!BbC7RixbqJKwp%,|%6$85H"NAc\_H`|'>&hpb iL;+h@G;P[_&hfPZ= BYf1rSP8S  wwn4Oi@eAbDhcB!/IL.8 eklZA22B ZiȅFsp@vcq$YIkMIjF=xp$N Ġaɦ8\rۧҧX0}E+5C $z4fߍpiԀ#1f0pY~Ȧ |BMq`cF~CϏ7wp2@frJ11_P#X2 t=I3h5`Šu hU:Q'^B]d3YXE(l#&.aj%ɒA@y2L49]- VT52q zA1MM7mh 5jޣGpO6ǁ Ѷ136 e.C@0?$[y?Sx ܕ(t 4j mPɤ1_o&$q2YXo'U cL˄{+x4bhn^_P*wbPH~ 2o`b2~wuQzȑGkhkllDfIa;\.meC;E4W'-K`1P/k:J ѽkl:) 8hE:3{Gl?yɧ7 I8#-a;-h} 3f'}l2AĉَHm)"uCirX =? A0{CnL-Cd2&?hc h E&~a`9 t-R0To(~-'/aFx;D[%w'/iHjD s\#B[:+Â$Fa>D CSD=xUU JR~Ok_,+>У`VMW8,$-c0 6'GP[-P𺑑dZײrĬ ,螁 N%IסT@otEde#h 05CKPx/ޗ'|P~0(r24C IA  ^F~H5ҳ0EH: 냞ӈz x[57Eslz-(hq*|Y *P%h0$죪4ŔMCfLV" @<6 ~(;YY3@$SibUHvP3(6 @UG6'9dgL#cp9-hBO:en5O `A'<=w?TH_p(f;xp/r*C!-^y ٙd3IX~AW< |R6pozLC8L)~U|b^]Ƹ@L' /F & NYxD5Z#`a\5]dNSS31? ˯K$U]]_7>liɤ G5ŵV :h@ u_zUW/,-*޺}7 k4yիWsǝׇA7}bu*R<AH2Ẻܼ [5Θ;5 CAЮ"+wϟLahyAf3 T[[_2VWW=J.->xP$_eMQQqs ">Ej2K_ғ?* UY#Z2rK_Zk.J<~{X%{x=yȺk6m]al|n/wEQŕpe+ixL:U3{o}+_~MAޯ?Ꮿu>igQq؄ꊀ_D)[7 7IJHMr61l_.X,nҲ|#Kǟ޸v]s۱]nݽﶛo7+9ʲʜi3}=;wlغm}{!~p8bkYv͌3ڛ~|ah-(|jZviYm߾o͟w𥒦_hZx˰];gmȱƆLH%`P8~굕?wtZK݉G6}xz~ {4RF(g0wLXR b+^{˗lkk%>QN<H]Oe09%ZIUEtmIUU4v  7?oom8?|ʕ+:2]0s n0HM B6KJ(//2s $m"r饗Κ9{„sϙOܦѨŠi'?# %)={m۶{׮e˖{pY Zh0!`3m)ʦҠ6äǎ{zRI#?)e,iL44F:vcsGk[+46hminnooǓ) k?y;8͈gR$1iwuuZϏLa oz„h8QĶ榼҂&F= s `柿x)-ˆ+t c&OPӃT!Y7_^gBILJҍL:uh],/' Ad6XxW/0/2ix@f2CYX/{Ιv1̾c ٲ2 qF pA!Zà= 8cΤI1]]]]omDžb?N/8p`&V5qjh]J05?ҊOGVjs[ T ֦K4P~&sA zڀ"I@__x'.,΍__x1Et]~C 6W_}uA8~!#(C|O=uƜ9 l|C!&}!},/7Cݳwٲ3gΌOjA1Rֶ^|) WTVA':}ԽN/Z-U_ 'L(++f3<3Hi X877 =ʏcA#n\qePU9 ܎X~Hݑ8OIC6aFh6dm̿ϙ=[v C͟?+_~UQh1G+غ`Fz| 0t<9A‹x׮]sL< *+DQ׿^ʇy+ǖ-]R9aB5}nMՄ#zy ݿֲ+e˗± B@o޼yɒesShwbvhpG%$A`"b#a[Yt 5CElfW3q"eZhƉm O$"0 ؀0I'Q{MMMqqSgΜevuu‘ `dcs?oѢⲲh$ :[_]{f|D h!.(^`q屁e 0xûvj L9'qҤIJ !4KJana׾Olܲ5$ES^ec>ڀ`g.^|~eUeE2 7ly Λ8q!+68ͦ7_pR_oeyyܜ55_Lrkdv큽{w75ڵc]DcRl Ӵʗ_zGig> + O$4n޼%)++a,]F ;N\(2P>|٭ܚI֮^}HkK_Gvnߎtc1qǣmN  LQ;ok~ttXuUH8rrm͍_.o/o鷟ϗWW}C=﩮ŗ~>swſo?6mjĚӟyTTT|se)/hK, _SSU;8Pa0Dp, ů~?4Y#mW@8mݎ'_mD,@OA #$j@ #*@zI1u|(k𮽃Pp>J%A43\_$ZZZ iM:,/:eJ ێt5u&{rss) !'8q%\RVV >ojWT@- ټs#G[TYr=xƆm[1*))Yn "(6ٽo޺#GnSQ^1sP8aރݥ}&Oϋ[t˫'r ib4Y lXG]>UTx*žaZGDxxFpXEuuu;vؼyi&L/ A=K,۴iӶg>р?P]RL+JK MtT*{HT88xpkڹgp -Yʫf`"{9eڹˍ= [|G>zl3;S@ȷ@mkCfL6PmV)5{Fw4?g9Hcǖ($} ns16#<޵QRL@qxߚ5k^_jN81wgfҙ6444 BY(gEm @͸NIYGBA _[I[b14K1-ZI>H㗵LEI/oc4O )HH@6/4:~qQqQa!CTDۦ=ah܆rEn ~Qݱ^MtUQjʒNC z" &E_w>rQ@"NiI*@^T:L:*.)¬M6%]q0lEA褂3f͚9diYJ%i59_cEť^C!_n"ްq8JRD-=N4; 00|<䅎m6^. \otms@m\(6g̖)2!?DzinnK_tӧ,(,F# K*z_*vޟr&LޕwނŅ0-ӡt& h%G"a2JaRSI$I +DK .Gg8QUʼnJ]b}ԩTi'b3MQ[rzmj/-*PaX ֱlOT{y$ }t\u${ڣgsOH0q Jr,->K@X$Jަ>@mphuG@9,A3!=Ndm&۲JK_[gBCիq0 b^nFiYGƎ&NE?\VV9eٳgΞ3,Lj9b)䥿PTapPCXRAvn M pӧK0a(zCK,C(̩,4"E]siM+n gp{n씚C@a h{ u2BLE:ZH%!=x-_h|o?Fdlxg۸vӖ-[Ow} j-R 40F1߂c_EJUȖ#G1b!m ~^}?J$@о p'B2۱a^эnDZ.!HEѾQ 0;4C#0 '8L]K<311(%0`0J<*PȰbF.a1b\G`$BgVNْm}cGa׷8>b\-jucX>>io(ēC #] Ha~^]'a1Pxy1kH޹x @Ù74RVtS=fI|OO:'/Gg3Ip}z=NZĢhuD!#zHЮ(1I=e7~H360G<29#vdJ <9Tg;g1iMk>(O(*Ȧ88[Hl׸9Գz߬ uk$ZC$şwPayeac)dH1 ӥ1mqDH= gNwD]rC:H5d% jpWBk9NC1ѝ- ]EEŅ^hѢ "pEM2}:+t]h0 L C jMÒe?`^4T;FG?XqQ1wtFLXdHIܐ_k$H/F(#t;wa." DrI ?~_I t/oZ: /ݻ`ƜTCܨP;po h'/~!MӄXw/ x33xQ ^e '4^p)N\dNR`0V= ǁUhG3ʂK677p 6DPL8(`(n2/e({ys$;Doi"S#|>Fwyl0xQ>}i$H B7 "1J~ c|hQ[ +x(7uQ/z6c8>N  v}Q* p 9ì~ݳg߾-͐ϘTO >t 5 -Me3iIkt<%Hh|ʹTed2($QLKdR.p9Ȃ`@2Pnv( L.S_ * l FUU'/ Vdiq2;x+A40 ȡG6xADžN3D$:mjv{[c;==Ik3$-D 0d2f@ 9ۆti\9L#( ;K!(s8No~psׅ9nJ҈ B\_2Fv6pc01p($/*"IL;NAAٳ&O+Ŋʃ;:{Gwy>1_w_;zby9y08ۛ~woÏ'ҲR0-[z=j$??ƜB4ԍU -.9f l۸kQحrwuvtA4 fƲe6oޤ߯J Z ATCAAF/tUD&%8$wO_>ȸfczgoFnbr ΦK醙m8VwcmH$ AUQۃ7ݠrCQyU^N3|I|啿gwyGgGĉeK{K-53۲euşdž_m۶椉P8Bn_Ksrr U*+y'g̜Lw<ޏ׮$jqI>/8N{1|Wm?s@P_\{Ç*+BUpH?~SZG2'E]r7Q㳛G7=|ii1R#LNHXT\_|%{6\*;R'Tm۶nX$y:TT =9YLXhx_|=w}wR@Y }b fA+F-?m1.^4a==Jb޽@6P´b8@ c {v> ՑP̹sϟ[eʌ3EQ}'?[PZZ)j&NG".\x~2':  ;|nf/AnrSS>Q> ij:Vw;:S`#uuP`,S}`j`ǽk Clz!4qu Q@ih8kcY:@9665:|e]]aypyY9Xn,6u£T|%%Š Ҕ_ TXX^RZZ^^ !Q/7\"˴`@%k5 ,uH*ػgvځx0dyO72!/]@Ey޽;^Zp2'Z8  6 p8oʔiP]]h4mm({Z|/^ {vcGyXñeKysϽݷy˖_O|}gpG1Y1ooP+# }yCҩCb$1֬Y+L: ?e< U5V#!jr᪲QaCڂAH4nX%+j @$$, n>wNaEAH JoܹM'M #p B e}~5*}OF< `leY6KtvwN{v5/݃q' (Κ5Ѻ/vݺȤ6o655)lo< LB~A㾉rg5w8%/%/!!/-r@8e{ >Q<(1q彁#%$@];wW=݀s&ѣD$H )8 mmip]|E=>rjlSP)tM" s`M4 }T&(儍ˏ͛7,nzl3f et < }. hC͝u֙ZOWw2߷o߼sEy‹5))) ȂPDh0tt޵x3tt:o#PH8|G?AYYYmmmWgzv^nm9oܿ@(B&^/"T /fwرv9sE#Q>W`9*@C}5*t`dڃ6J]> D+ȑ#R^^D9ž+_9sf4A#Ev~`$ǽҊ+V,tu?gElAt$ -t9R>H{>1K FAaGKkc%u䝥Qfҁ ]FƖ+<WaxB6,BED!k=xAQʰ.]?я`ٻuk[s:tweQÇݻvݚ'x|M˗/oon Udee!9>['zwO/ 4Qp1A%=D)^e-5斖(2} % |x;ѓOț'9Ri(Bn0Z~h,RPiI9CiiQNN|twX^Lj@:mڷ?Xqݻ7'rf9n? ~kl(/\haEyi(5ڒ YQ!6mjy-Pه Q[E=m"ƥhN$W~N.W<~ݚ~5hv-׾.Mt667feunm:p6]bE6EDc 6n *'HF(`O8+_۵:@Du}K_˿߻rp7 :lL!GjZM;@ ܝ>mw  |֬,;TdJ%3  Ô\qspLC-ۂb%nhA`@,I}=!-RSUixHxŮ(ipOgzd?9, {z%TS]Qġ]{,[n-).x.KtuSA'EA}u7VE!ׅй%xa\4,Dž|9Ѳ̒RQF#/L_Wi+W8z̤Mؚ>O7R|.6, /s/şue <-7tdddP(ׂ2us"rF0v`ډ]A 4̎*0.'bcciM /\4:4-n◿|6]@x\MNXȽ*,(;)?ڢykTRt[F/ c׭N ^F 3Ws 6D_JyVoāg9:\x%PoD> ܂$7,ɓ0}5Zd#Ahbб4ZA#lnn޻wΝ;;;;jjk=‹/Zcc5\az0e&޲eˁۏ={+?|-7_:`V_C ~ TW`~$EHiA7/oyСPTKCt:裏nm$I\z}uMmo7}'NUW+k,*ӿz3g?ְ{npo߾}gϜ-/+C>|p__OQ4 Sd;.[QQYVC CuᡧTiqٵ׾n5uCCwx"rΝN6׬YHQy˱v:P[UW%,Ylm;W]fth+ױnj?r縅 O:p"`I>Q}F~t:/m۶tK7߲zx۷oGq.-+ZWTE㏻ܫl?|W^h" #<ܜ!̕OiO\KV /3;: c,BJ(|AT91F+%urWM#si Vp2l /Ů$:&#"> hBB8 0ОHy 9t: x"=ڵk.\f#q)E M]\\z,`0tWd (e]K,m(---TtEe吷ȏFaժU ,Jp`"rؿ.ZIh l|L?2UYYDP[T4Qa=3I+;ڛcy|`8#L$}R'g-&A-7 `~e jU lAM:xKt;=̭^" }NRYǦtjjju=?Q-V[[{OOiX0ZƪZA ڎLNّe**-hZֲD,lk2rwEoi99ċ5i;#*K*aBQS\0ExqC<++#(H /}RAaa*OvV`jNC]$eGh 60⒒%hC%SɒE@l4W4j1ODJDpꫯ@1߃FB;9E/: l0 = ?z5!CgOz@Ie^RyEu% E}dp4gBv h:uRTْf EVdW X1~$]@2 . B &ob aP0 bEFX ~8ۍ`chXuFYc]]{z5^L:wΙAra3([Cł[*23D~3҂@EA!P F jBPޥp~s[d𶵸k-D s[b'!` H$ !a(rN0 ZvQqiH9$$ORB8 TL |<$y X  ]0]7W9x(u] x"cBy.{ >&0ڪL)EօJpaP!HUPç";?(3z sJğ53 H>Tt Q@٨.AH&S= =hTf-^}U(1Z_?<rd a|M@y@97/$jW"R$E$=}E9<t,Y= .h9.p8`vY>J_BЖ@ Aσya ¯fzM N CgJ ?6z/Cu` ?lȏl(4څh;en,ٱ]+K ~"hGgh&^$vgVw(*}  Ԁ81 F' s,V`U .\-ܾ AeU=;83s~&ʱ-%i%v"ѾO`oz6Cyd_2}:x|QĤ(b'0?\r_4l4ggH\GpyT J K@ Sϼ(=۲UQAAIAI.O"drhb5;- RI4si m@yu43Cp1˩f}T`g 30}>_Q[z^MIgY돚_G2C47TS3Q,3nڷΝ;Mo4%(Y#k./҄c sa9Əzc( `(Hyq9B/=dWDc.,0@5Zj#e[l91P! 'j&A^tE~iAfT*ɖ⤚iDylF*t* NxN*TZG0.[&XE[ȯh*\GL>?%K^J0Hw+[>Pߊq`e~pFw`;.hŮ'S RpJ|3@j>4 4/`o ~!5 &eJl!Kےpm%,'"-<~QTPޞ \6=>j9//|6gGUYHF`=cXi ʈTIrI b YHºN+1ˡ_RId&BC@Sj A@ԠdY3 K eYd9hXp(a #1۠(3ČC'f`%aqQ9өJSbYQ&IxˆUaP3* xF:]n{!؜x=g`efM3a ='` \AD x N r9}F6[@lR`!z 0m"+Ђ8[< H\rQTTKH&٤S,2H$r'ŵuȃXM@xo,\ڲ H*"3\0>9p5=ު"&BC2T-V7h4+!bY ,Jh9,Ԁ Bp/0d Ō[yP}!0*QțP#VE;d@48"SsfjR^@OZ/hZI1`("g{'Zhkz+79(.2O) -oxK:ܬ -&: PDfQ ([$-a0|A9͆׃"n{tu$>4!?C`2FBЦIFF/jqEP qׯMjB(5B pon_{sB4`4 1@E09z 5䓤OOBmo~p[`aeb`Uz^kȃP+d 1.9[h4@rl~ :oA뎅BBUQ A0,ي-^h]ڐv_NօA%.˙ԗ$J\q } 蔦ihyi 2`9Y3OdLA*z\IS4 {3eA@GԜ% k§?ncm@& YPs XQ }|&a8u%Zea=+;,-xDX2r ,/Iłˢ;E0@! Otx63WO}!b@yp-5558qܹs8?~1 *G᪀e! >m O,x Vi_l &b V2XH5C=y"=엂oȢsUqI0܅3TR(P5r1s<MMo&&{hND`4jZB/耟Q!-(Ue?{`EH,Kg$Y8zN$sy*-xr"y4\1Dai$BAY8 @җa@ sq&PUiLGzb/L&"0?p$.oR  @ha1hAB0 |\.J,ʳ_3<L<?,H_?ϊt kQ %y]e\ͷH19yzMӐ#H`LD.~À "" (p6 ' o#"Hev9 :ꦭp^֋ͲArЮ5JzxaYE}VߌJݭ2>{BPIxK@!# =f h.|@'+F&1Ps|>O~#hCڷ.8?~~ 4N 3IۢdV@u!n _K=!-Hfq:-8"'XU3A3!PM3@3T * ; 3?5 jG~ ռn&rɘP BWdrL8@mb.kkP75FFкIMyL3f/ B.fIEЯf2zV|/22P)c\0&tx`[EF;Z</**¨|(zC) wzt>dp[}0JeCF٠^N!>mz{Attu-"o LY0t|2F%-Jt&6!hȓOP W8𤃡 ME sg  Aj`tѰY2Q "ѐF:;ә*BϷwuw@+FKK Ӷs~+R6e#Bd( )Ȓ؟W,?P9= EFxZ߇>nSy uzk@'L?.X yȇ`(G4~cXfg[YJJ%įs@ɞ!F4+u۱cNˠzv8:>7i vHB1*Rۨ1"jit-Q ಴@.r^Phq_̶и(@2'W@;gtb`@5000 4v..~ׯYTJ_ј27l|(Q LC%D ZW9|unVؽA$V+m*5(5 DdLAP7 38}Ҳp$lVSSӋ/޽{o\SCn'cHѣk| h!~|mwҖ͛*.)^ X+J w=|e˖3ZHX޽g}v%%%%LNQL׌Y/~ደD"O lK`_s!8؂ R+Z +='teKݺ!r-ubcv$%m'NWhҎ%n@E肐y㣼TkaKS]KF97L g})hʼnX8(;[RVSYQVZ>?CCCC'Ng?|򞞞`8TT[z{:;4|kp/ZjeII,i93/\hU}gȧJKGU5;- ڶСoK%˗?˫V3#CX8ATr /;v|ƍe".)2Qڧ6,ASzPxElԾw|ӟ{0p0<D|d1ЀX ZE ы2Lۣg 2PKoq0JblA$рN9;drB23rQ^T ^=Yw0.rBLJ,4+FR|0e8ӓ4B 4_7f-\PuݱTrxt\{SOF[rILKts}_xn׎?:8:r-G6rM{rOnnom͌s]mϿܮϞi:7?',8_m=~Tc2FW(Qi*>SB91 Ԇch!LJ~ L[HM{i4ᣣ#=]0GId* *!^jUeu% +xiْr@2ohocŕ5UV,FeɲNgpӧ-^Oa**++*B0YRTN??}ՖɒشUR4grgJxo`XzxCW_X>G/z*RQ;/ cHQ2cZyEXre ;;:|5 -\&5FBp8>?'@<БCkV jj>{y˖'xbǶmT FMD؛sGz] MtZbD,3 bӀ627tpc>cZNm۹ݯkl跲v>ܯ7=ԔM98ԿG}'m{o{xy}޵{{}=i;Ύ6jyud/<| t L¦3r2b3e1 G3R3\PKr]{04[Oy}l T#z 7_UUԏ>ȣ[nUmUepȅKOo iz9zK(h_ޞ8y ƀmڟbk;: ӂ͐T8/`ni8۳]#_99ܱkk ,Y$YQ+**a-:p2,N$JԐhyI=ǂ 3g%MCL"ºLz 1[eEѰJ я |8M9&g=ǁYMmˤRz.Jw8~ؑ#B&#'NP 4BH@[/FqC \;FKE}7uRz}iSq3QiذҢybZK+r6"x{>P,1@>8yd2,.)yD9>D\6 #QkoK!P`C}׭X6}и?M]W?c-_k&bqTbO~׮-~ޑGGG{6|Ͽ'kC[lcS`2LE”蘐)@8 pp2Xp>xc؟TWW BXiy>M::yݴlQ$z1X0LĢ0 p#wmW_}uMm-҄ }Q`~auuu ۦ<H{w^ Mۂ&)RUUeIqko?w؊a*X)eZh*O{Y <:ʱ{~~-B `Au4niireex5*Aԅ #vY@np$`?˧ Cu'!U"NPg^UT^:|z?j!8g9F16y噶kJJN_+nhĹgiZFqqov1B>h[ 6L\L>V5?8qӁ 2Q\\ ;^8׫kj$K6^@vaLÔ$]Cw@{;niIR[-VEyŪ+PQ,'@\+**-[zm7A>SduuU(xk"*o!7/*KB.XpͽGccɣ M5=v֢jꚰ"Bo۾k7xc(z^4töm8UgZ[O,). *I#J: $X4 kVOÑ|Wz|ȡg{7:?߮9ڈSV-"D[w}Q$ʑpuۿ2[UU$Q@ ]T\ [)Bdt\O}j鲥K&//G"d u`}Ux1'*ah+F!zJ9dKuNtdO5LJ8}jltB8S.t/Rhd3tئ ˒i p饜䱼B$#cè9a0 9<ѴlOoowOOcSS2?t#[ye平m#45a[a1oマvmU$E=`6ùC ކe >$i::::;;UUO/eee7ZopQ$k;;:4xo4,-  jEpwª<:2rᅋ]w&HMuUUkKhgG0ܹs,_y%%%P(А䐱 xp:8 UIq빐' ㄨwܶvjjI&SOV:W!v 6mCĐƞI" b4i9 MM6 1*@!AۤSa b@rŊ|v;FPfK |s_%Q=+bFAk=И3PXR09iS?,Gbh0i[1c[bRسšx`Hr<4>L t74:7V3#x\9'qZ-hhijq, 9v PT؉ǟ#GGeM+-/߳g/~c Wj݆K<;v6Geuw-\XttrEu5{w[rĩ%K,__n~FFFG #|A:WE=~30%G|FVe=}bd~߿"P8V#RO!|'xﵛYYY=8SOhjŢeTD#'6o֭[yW(^VZ c565Xk;vؾc߾}/b{G;|xQd|-4צЛ-#cgth緔^qŚZPR\>6:v7 ohhxrӇ_?ZUUڍEEAUg[_پhX,ǡ֖ RHlݺuHMEE }ƕM"N'/2\lPP!|V_E\z{|g8Ðr-VG裏tgΜ-G)x8_3DWiFUNj;yA',O0qT4ar_&F¿&4&;~|,u}AzNGGG3k;.[Ʒk-U1f[=v`rn'<K+ E&F鱒"EK]K$ xEjkЩ̘Jp.Ht]BoX/  %E}Ufa_/\NjL4{ "iEMI׈|. ŸEJ֯[WUU^&4K29fe˗#qERmݼ8zdpddƫ+"ѱsI_d x(gCee|,nȨiR \66YXB)zepԘnxQDrpJڄi=q0?KxA=C*/Cj08]0*P9bazʼnN"k;WCQDs la=0<Ĝ>>L0CN_9:=7*QŋP&io@ ?::qi0Q32@MX>;sǏ<%u.P`-LC_QQ gFoI[Gi+p O<ӳ[!xۢ bt 1Fcab&Xe2{Z@5 ?wcPH `P#e{ͪj&aYG׵MYLȩXn;Z$"BjEC%zҐbZd󻴄4-Ȝ6H i+=2MUQKimUt8R @(ydl ;[bP M2Tä 3 30B8lwqwaEA4 <{{{1:Saf ݻ^Xf:ZQ-7 ,bRӔ"ޓi9[f"gˈ8)dž`΍\Nq!>W$%Dv8 ,J&3% 7.- jɋ\g30d8q$S>i@1*jR0Z(tvu=$"H+38 HnEK-74=]y;6}X r}|(3xڧVAzZC+ jl o79'Ct aZi0L;Pˊo~O%x2²\,XAЁs?=zGE 5xeH߫JH*pI{r'(֖ ~µ0eqBj̱?㘐-MȮ_2(c&@mOjFiN E,HiX EBILcHoQ;[ g7eűB4iFބ`,0 tA, P *]r9_N^& nC|S0eF7  k&ym#Ұ"͸c كB,;{ 툿 価 6‰ 5J tU,B;JQ\0sL+G[Pte t9Xf&#\e8d,|SI e:ToZ 2m鸴s~t-@Sݬ? B4:R`auʼYTAus$DUa$eQmON(ĔGXTV컏);|>LRii96L+.7떶넞DZ9MS%IݖE2 :BIʿ?UH xb^ <6a2CzABƉc88K> J It|ɮP"N Ƥ5oa7!+$Q9 씗Haq 5%ޠɔRdh{T&}ւKib}7id_꠭xGvqe$z*M;!EDT\.7 P/g8B +g b Q6KLʂVIU!Z"+ 72z---gyAQ$0Nt,7vv( [^С==lSG7oi<ޡу\rĉ j$@HC 05-ڰsʊJ8^ҍԏm4\b4s_ܵpSSرx<Bܯ#|l=tP&PUUgh"9ly[ H5,Ċ 5AwfY5;``9p֍vxi+[ˊKH(tڌ?\:gYeSUNPhypPDUdBRIg{:eC_CrޞڥxI(ij`E%UX+/Xhy"^+ DDoG46 !/ RUVjh"NBDr(CR£FU_"N|Hbu^7O5#x 2MiЏ >)+ GBɌ?ٴ`HQLSstɜkW'bAIX:^ٹt⒠x]ވ̵(]X+Ho.whT*`gD247%X"/7d~9#4+k\ @Bj2\/M3  ゟ2,H%Ǟկ_y{ۍ7U!9s>`F:[P-!9ZqL[㛖_P[]R&r=]eeg{ AxA}bq(2LfSx}Ѫ?qr,ЁC8@:ܺUx.gτ5=ܳgΝݻg/C\%}n=\Vմ3[^~i}{.=22]>qok8r&j <ַ9 )*+Mim9pܹgϞ۳g/Kٳg3K4f' u| O½)@7 QF܏4ĉtFX 3#tM Q`?}(-]ٷo/M1*6n[#tSN11pc(8$ؖ qӧ\]Yn2x'`?*+*5-8EYY Ԗm˒閖\6CpUeiZ#cS͐"gan۶ b+q&NͩP{!/Bw12<{Rc[^xR |^7Ro x31Ͳ p0FfY=; ޸(3"/t&YNDQBU7r&cl&mtڵkJNh_<44of,Mfݶc񆆓Mtz+W\T4; |$.LtjQKSS s:by`pfh:!< -]n ֯bEjzsK.G?v>@6n9~U‘Hց\.5p-p@5D"qw "-X5k֬[vժUp[+**nƍa jD2~.JwNӡpoHl X{kjja<$h4 > P$ p{vwtu&SI2,Ӥ8U¡ u_سgϵn1MBiAs}6LK. uɀRd,1}==$TU!nheM';;W\ByipY`sᦁ ^}?뫫*B:ܹ'N2ѺF~>1St&bO*+2 ^x⡣'w >rH{[@7h:dx<" $@Bƒ48|C5Ԛm٦Iz 8Yh&i Ӳc^2 e.hXM@!]RRzÍ7{;}!⋭g HDCZ VnWFW8D50Q2$x>-РX-Pr~mVjvx:ҧZL[5EѮ=VFaEliI mW PiiW_}]wmܸ aqD)-2 I}&;Qkov1 ކlԃ[(A0ɲ (]SWw_ݵxw0ԓ9a+(mV@K׷* W)..7B >lƲLEU;voX2˴!7b-Iv,{nTEiiYOjk!Ν_?~Rջnf2}}}T56nλ?[n.6Z^E{; *+kCUZ T 蛊en>-\~={۾s[w86Vw%p t{.IҰ 8[ڳKNu DDYTTUUACP(YߦOjЂXʍ*DV͸0 C ]H\Tk,*T%l*Rf;*S8X-PL H JYr}C{?z& 39QVTY+ ҩp($""--(P VXhIOO/0hW4޽{u]=90@βG+~o%y~ MEQ!PI9{\gg'<*؏T2YK 5 VCLZ ƪ*b!dcӒK*Y&7 `^Ý]#C#pΝ+F/[^UU) "H8Z {tS "(_?>vߪU˯H(644̇r,}8A-47}RQ% e˖R閖h$E!IAB!_!g,vw* -C.=4DECEa6^qUE$/A>G Δ,I=H#=*43"]z_=S|!Uji9]^[]QYkN(|7,^ŗڽ;J^(;Xhqq%jkyOnT:?lhl| \ti-ˆ8 { 83~ 0USa?zzz)$|_(P4VYY)l`֚EpNl@d`Ҋ6?أ?|Mms#o~'÷q򕫊}{<?02< .#<ގxؽ>? D[[;qM$y-8'?PWn:ƙ^")OSh1No0(7{%3B po̯<1{iP}!MٔM0Ѐ|$'=jهT}޾}G]]ݢEs䩪?"_jm݂zw6^yEu]mu5par{bOxQQOP(3&4=igthf"RO֋^٥W %첲2ńǷCr<}*h&(C_Cru/ n nrۿ|)ȓYޒ?#Y Y4\L^& . gZPIٺi[*ՠnY9y^%WFwz`:6}¡Ȟ5lC08EDgh`{ mB4K>{.LXY>? 3kV@D,VX2s/_|lt, Q[Fhj pŋ&;ިz&†DSK  3h|IɁo`9(p(l6*MH0.k!k0`ZMtƃ{]ȸ1NN_阁J3$`^0wkqy0y/%\ kq `ޤa^k/hAn6y/.5E"CM86R5 .7AqWr6fáH.%KB<ؘgϼ!iH9Sdˤ9s6Q Ba=8J,ax2ML=$> ZVF<-*ʶQKdN؋|W+ReEVUms 4ByXfA *bBP nf+Jk'E*aA?LZ0D ߷{OWWEtPHkXm!4% p\ hcaL"H\c::a29Ê f$)7pسЛz<:``iݰA; CdJAφ ^9x4P5';{z{zzzZ[Z_CBlbJ\*^S늎*JB:|OK֐MP.M'~pF4 zc" 3G0DP L &ͲL /őIQ*}@=0 rZsFf$n_\U_ j\w3=A.!-u#PrxE|&K%EQ0(%ˊt 8R`9H I(EZ.Bd٧Ra d:XW UtOyô@sЗtEVC{ڭBD xPD8sYEu,Zo6AHV =6 A =Bl0Q@OACkd2B}GgS`={NP?$zL)dw(aP| 텾B"#(Mvѿ{9!(DC}.]hB(`T {2LT1fZw85mtIRVVT5㚖gtj_tǢy#$sR@@9gLK֔ =mD &^'셔`RVL7~ǧhgeR.ZR.A#AAZsL  K }DȮ d58 ЈS@ X2E\4qFQIa8^G~. Yt ;l [  !Ђr>DMaF_`}m}|nU1/1Pla_J1#2@| `Jlaz(&i{h"jvBUduS ]WC0?OD@xl H %01O_$>;{I %p˴gu$*zC@\--IK"fd!>`2<9h6M^`P1P*( %J HD N`J-[ E>Jf Ȅ DM`r2[( %hHH"C ;|~v6^C=g*0[ #e 9XiB|9(PL:PAm@qLɒO-5ƀQ; a(hO0"/AP*Ou`PY1[$P;cV#+*D9>pqprC@0@U4qb\,z@K,”M%gEA 83E"QEU,Yh^`/pqY>IY Hfz0gEABj |ܦ[\ RL*s82" :N6KE_U7(BY/kXÍM!J (D aj6-5tjJAU4loȐԁ?ޅGx˄h9e8vФa@B i^Dƞp h4YAh5>)ǥT|% h2lN܀&&0#6qGog13ŒY/~]݉D").B @QcĀ\T M{!@!pl8H ,"k[rp (rBHMAp"iZ>;OQ0 v:)DB]dP 0"7/> (#`+kFFGiҲs|>5{`8 *N`x*J< zkyl'Ѓ)p4 +=dz=CVO*X` lR?P1df2H$Bm;Fj]F/:{-s*@i^\qr=zKИF> /A!?9S`=X"?zAB01w,B. hCGtP!&EMM61>Ҍ)@XPq/8"CmD ;^9!`@DP6: @|Bm51 @*wE\h́8HbT$DL\`\4f QvLc; @AO63Q\={t, qznb@Jq.so9Ѥݨ@ ͒AS0cHhf618@*FݰMR'?!'_P_V#jY aU9lv===È򆆆F;}tGG;dT [z`GZD@7Q!X%%"B~ 13HHFOZTeB04CGOA_RR ΀'ama- þpA5L8gx.eeM&7(57< Tbrsye&;5WW1Z1+|%()xCp} o2.L- mzaC pZ>Q=pi?AF-аD</BJ\H0L*4Dz_=F[8A3&O1BYG7hb +Ϗ}?Q'N;=i.$b.?1*|| ˗/_X]]]W[E<^4^) )1d'Q63~f\.d3 [%Hl)؃?D-$8dd .NeN>f*>A4^=3Qÿ{5̘듸㍁a8c~5a9/@cEwh5r/= qE,h1k+8d6{ S!A!dy%Lr&lVB-G:;3 6Bj2s H(s.!p USU$M?*n:"CXP'l!JДc^0lZ!2lz( xRi11X/0 ͷAFUB@pcЏOCH`@N zz4@69=mqiZG؛-DgB9ܳb! %ƿZD|ӏcz̯2FA+yq,5L e / 2'Rښj$vuY ._ͳ?j3Q.9v֭}A-fҙ'Qŗ߳wJa">S)v{ t=gh$Hʳp8m۷o*ȋ/XT$(tr߾A ')JPEEhSg{^?x r3MlyU G#EN\x/Ν;DKW_>"֡Ȑm۶ ߃ :NI{c0s $B+ߏhpp c/e׮GA!ԐR|&b:̯l*9F9DlQsq@3 y|^l~?]p{d-xa`>+~)S+`",lA&i | Z4xf*++rEOR}e .v@)J#q\> NzXΰY;dE0hVb|./Ȣ"\VX/"Z##B1m6qB,1 a9e!aМyrpjIWlkfL.e|XaP9@9|IQ$z'>zUM|_zux``lo`0VVd;|ȩk9r>+m^'b}=T4 Ν޵gYnT[J_zzGFGXwOwkKkyyEUuu8VRcǚWY=8ΝC]][ⲠTU0rkwt ,|2UQ8^JJJˋm\jto f\kf債4 ?vL\> QVZ L 㜙2rg/FT+ؼ&ɄCm8XMt .5LOI=q ak;ۛO>sL*$곍4dIi]~︵T J@Ɯ:UH6`'' MChi]Ɉ:Y\6j %+hW]#<#  ~FGĿӀ$-C %`^.lllʫ?ϾݿWUk@wuUWW//}K_t\{gXwmagΝ9[U׼㓟ԧ>iW6F>::}Dh}_^dI.҇v^t)l\' F+ n~3'8-_ %x"m|Y7LQ mw`Z0~"P$ᶻn?{lODz"IV.֖LQr,#IIGSl=r2=xj,pyúűѡ'{⑇>9hC/ёHCaZڰS]ӧV?^瓕<7ȊlYƙ3gvsɽ{++r—#t78idQV\VƲICXXHw./)w.Ly]K,x{`i:ׯ-:H8^[SnZ{]fMuu5~7Цt }$۲e )AS7^xի5r}vv[h`:s-ZC^~e%ՉD,{m߁U5 j5-yP/_<:65lH㴙(X^(KIBdvUeEuQ4QZZ׿/A WY^* =n٠c[LQ Ұ.޵׆;IZ`px " O g}z19llj]yhmjl16D(i M=822|ؑ]WTaP=q4}׮]w{ٲe`ǟx´k[o_!Cb;O=D&=z 7d31/B:o2 ǂвvO:EHSpA W ^ p=#W\~a-Stĉgg_D2 -,IG #=ScX,Q\\qS=#9m#GE-++/IdH6?cPeEBgΜӍ/EEŪemz-$ۿc}{@D< l<(AMCC2>gΜEă& $IF_гOH8>ǭl~@MU;~ɢlo<"(k1aPp:1@j9Ip= Bt<mthaӾ`g?(Ay8Sp0QtzzL ϴzmmm2tUeLR@0t"E# Gʹh*=+*[ Wl%2__`~uסl6x;ܸqC ;yV25{7_{߻V3|s+ou뗃CA+7m{w^ee%횣 i3O)P0~UocFP}Ӡ4`rP< -]6ﮩV-++Tdɒ|SWo'6il2afxڣFi5aD\ N,G655tu *(v8.)n@hYtlF!2B T==P/X,O"b?G7n\|舎! zn;&{W%S#Ces:|n&8OTs'$DBV@Ƀ>|:O)*"%\6ǰѝգ{8tf}?ec<'`sfIid&  FD Le^ -LC";k4dH3~>Бhu>e8a'e˗GL&*W$J p$S$U Y|!-(t.<;xg64-hY X8Zȑ # л5+/؄#a i'd-qh,-eB`IiBu072< g2HJ-/n'>/|YM ^Smmg3',!%xϻ/~mDG׋"}F> 8d`k)2BU8ߍGh/eƛn;^?tP׭h4/}k_~Zk dA~ZVLPraQ9Њpđż#I(>h y0ABq `@1<<<4#q]3mMãûw|r|>(pO:5Aepq1X jX'ЊGjkzCP,h" @qŧկ F[۹ֳ=}C]\$*\(*khEBE .(φ+TҸ$0|__>Op%8Z<8zcO>ֽ g}I7cȶYg ))6D9pђ`0?WCpP iW904|C?ޏ=7p#˗^22O<{eUVwG};޽s, A %>'v))oJw?_%\*)?;֮]p֮XM~Xn'ZP@Wg+/ ֯\[7nx՚/E}ޏOQ䯾p8W4M_X^9 *bYYU^s-7_ Hp'_ ֯ 8ߏTZV˧?|=~+G?ȹseex30q.0!܁=>bŊ%K!Pf?h[L * oN!cyWI':X)++^TQZE@GhQXB`zhV xi" 8&nuhHRΝCG,"xbhphoxgEE$ц`0"x]?K,B!1Q9]\ 6zdj D;k@$)⸴m|n:nd0;IuB*m]pSo;1o@_ aFg d=&X <\ gy|q8<=b"fA7sp<۾mmߔHD^0  RYژIgn%;wlͷ ouOu=.􅮼i烚bUHi*}mH&GC( v&Җ˓h: vlEVp0Kxrn^q% `-]FͼYz:kAEDO3YA=oɢGsPs9y) \\뱏 (iE`>* RⳞ>h7 6P-9Fe?q;/ 3SRRH$|X(3B8/zlsBTIԈ'v t V\VF+婒³n$F00U/1o~rOt1AxQSS)r{{]ljFK/ o9{&/DBy4pnRC5>xںb  BtMfo?|BhUuȶ5pM 3 G0z2|0 -aZ6<1; P}Qc R<3ӠpB(c2;AΤmGU0-\;bժU >90ilV6ւ(ki\ay+WP%*Ԡi;Z)I}4Z@ C 1c+URJ6T]d30L!]Ȏ p+V"EhF߼Ld0Qa7>'jG}̋WJ.pc m3 rV]Y/h$\@I# jx<ò!\H(<9"& dEÃdvn6T;!xlu/tSee% =AޓM?Nlg;(+/F;A:I1`!Ƃ}l $GE^ϢAdQ@AZg|A;7O4t2 d~g{77p9qB$gSb ײIȃ " ԼܴCG#86aZ9GTAru p6t81y$x AiplHc{8.} ɱ=8C"3@Ph'*ͥ㉐态, B0)nkJmgZ=P/HVVWy~[\~"I#O,/$*G~Ig~; ia@4T5ʎ O'mP q!` ;p[p8tЊ4ep8ߙIzH0[/w=6s3¾j'Z51p]l3s;TUGP,(kx.CU:қM`&3 A$ߊ,@KI5_Gd(rr WuҖ#hs(|7ٷ!OxF G+m|aG<,!ሻyQd2'kb I#>!~Ms04p`q QC<̤f @JNIy~q l0`"ari:dEg%ԃ+))!E?^yZEE% zVA'Ba/TUTL21\xSG.!DL6< #b",φ;2vkH{o,M]l7p 8oit(fpiQ$#"0 m 劬 o&H &moN45@(H"yHc$)/*? -!{T}(>.=maP4xKAf8nHVٲ~RB#s=@u/&lݼ`YlL>3 'y3O@ſB\BmqJkA.RΓvā.C-,#16!ȥ10K9N!cSD_9I-T =- !Ԑ,ċ6(iwpI2)mfdDI`'@w_"zu2`("a1>=Dj1 |gЪ?ƅLHAYMټ=.#+׏:iD2jWpaiP姧N w#'L. dn4|,[T/?ںs1 !HZ3zs@º@{;~={̠}JL>dCy]@x`FW,N-ꈚ+/Y.;\ ݀ eyUIXeEJU<T#.C7~'(3(M'̈́fl~Els/DQm_2L#GlEWho}fپc~K"=aSF12s/غ%Kɜ@$>Fc'N&C;Y{4;| |ZM\`Y%{ VA43 u`i5a:^~igΜKJ:޳g?Ϸ*,A,y8ÿ8gP4T%sGFw~>~s/jrcc>pqh'UzzO>dwW_$ -vw<`(GD##/'܂?[^.-P 8~yϮhC=Ʀ&EqXZk/ڼ嗷o]^Hԁ_=tPI8j0:Tr,Ic 2o qNع#QYc `|Zp\_oF'ڶm[EE_iCBjf&adf@> n>P '[#芫ˮ.F^G3w<bؑaE6W#\+8r"/x',yO4JjĞ}yeeeV4 ^́+/K/^F>׺ga~H3#Gu4zo y J'tKr^\r#FQ@a28ts&Xmo mm>2<{ ,[, 1<Ӎr_|?݉E_Pg`.]董ݽTrlxx7noSF/ (ukԯP}Q }( M7*fBiP}!DG90s&nkkw=ݴڲRlgA]]Eeŵ^~{בΙ7rݷDںtȥF˫jjjklVu]**MXr{u a%Rz*^aKeYA0:r56B!(AU7tӆ+6 1:: ]L \[o#h`*䥽5#=:;(I2P̀$NO)@=)@)0cVOl DWWʕ+o|w I ;_@I*=`a]-O0|a8`B=y5 j#h]7_vEEzC'vY]'2!ಊ1 @^t``O`KZf].N#5Š5"3sh>QT䮮'Oxm玟x{z𣏴wv2c˙s׿>v7OD N&?mӶ~O}Sww:Y; s#>25Oy7 q~M`cY[۹}{_? vCQVAߨ!M+-2Dih4:Π־nXrx08eeeAG Ŋ+pH"@Cŋ7_C^ 7G*ah2<#Ga~:|ꫯDBAiSVio& UQhKr&4 (ΝRھ}JKا^ɁXp< Ě˟ {JdDVf$ǎFcю544TZZE|:T3@@sz6Y0 >W''l/d,,BUUVnϽ/2:<=tY`WTE|ՇsT޵ty.3%N?NX:9 ^{ Fo>,58 01跞hC:6600޶U$+Ww 9:f?^S$ZMYdIKxf g?u rm8n>~ |+*;~}w24%EaK}߆7 LbfAP7 BPjl,N۶uws=vd2u xc߷> TV"AéƇj>z(Z<^\.>c 9҂}kL;zm FLӂ,ZsB.Q>w1Wee%k#ztv'.\TVVQE׬5_yek]]eYU56ۿp.c-)-%k8 &J*+"IdrGEEz>Џ »|8_O ?]w/#˧i*:E2$@ M^ x \[3 9G\O@-;$+[D%Emk˗t{㖇sgϽ^hEWQW-aL _zXoC@J [ Z`?e (r@DBkEdE> mq=+]ntͦ(.Bnk7]{uUW lbz>J[ K8׶ׯra]],kpWvmmڴfjx|tJu=O2sS]8 }KdQgB@\ꪫ6tӍᙆäsW\ۿ֭MV$.[9ohxHU8(G?馛 APPjh 5q۶m;x`]݂AU Ec0E PЛRd1=#_t}tGa-@?!}==P\__|[~{WU]^29v1ʼn)l ,hF8>($ H7u8B|_zw7=R0Ӂ *R#jdD]Z G=B#pS"QTJm?tum[j XA;#,zp9ϰib3%[UUˠ;^{m2ꪫ[+#܎D (ϱ26_ ",I#1"DX_Q`Wx 6x4$ (Q7 H9$W$w,rv G,4`D`h}ކR i!D䊻E1=K4[ *rX*J9C>\{([,6Ӗ-[}CKKy,E|^##JBIq1z.-[^w]=יgbXYYٕW^q@ 7.NB_ן|ו]” GLf!스!Dh A/C![H1FRrA/_!/㏭^]#m0kf +vxkA,0O1 Cce&=:r]qx$?:8Rܢ~{ZܶW٣rz˧]ڑȹeyz^]<&`S0+mh\| ]d?{~ y;~ܹ;^;tuI}{ie+C:uM#ZqB >s܋[^:zతȕU͍M#C1DUwAנ,ۄ` STaX'PmxfhX0GGǾ}{::kjjB`<^TRB:|0_2|]CHOޞ#'GF@IDATڶ).+/+9oohdq 4,=u8H4|Q!Ԝe`0---#P<G릦Smmm>}:B|1:hCld IJaua#./Dz&Q\jndPW @_-L< ǩSM {Ɠ0Tf$"r@MbZ*Nؙ J߿rfQ5~%(5Ɍ !Pװ=\^n=ypX: ĠQ\TVU_b񆅕Q7W&+㱘уoIEЅ70B#@3#T[[B𭆆!?(&,))Hā`h,]  LT׮^t|ӽUՕ/phݚ"DCي*/[u?4믽f33D ӯ]mŠ($**fӃ-gN/Zna'nΗst  6gcsl2Mr<]9ͷyB~Uw zW7[]իW/TwWW 8Y([Nw^&bxBfr٬_9>y@SpFâ h e^Qf/wnzb`tl[jbO#J |PXta +ӱp bBM:V7,4*aVuò F>U-BaPN0 bE~OjuNaOѴxkzի^{/384,M105DyǏX K/!lcԅdTمj  Q?" tf7TgB I!\)kڨFSTCo*p>+\#!Mo@Gઉb1Dey -ҁ-p#T2*W61{LD$" CİA@q@ExZ .ƌXQ1_<UDŽBQ'3%;0%T-CaR TaX~c ZTX'Ĉ0>̓4XЎ- &}[JFi> ߢ1N PBTM)a BQC#P]0&2T* ^D{8~B@X(g "["./˴ +oih}[ltmC+(k\2wFt?5lް=+ִ67ZsU ЭFL C#UX)a `9I@R 9\XE^.`F$cA m!V 3йb*]P:n: 1`TZ37;0]Ce!͆GoU63H6g~Q6X /*qA@/D//ʐ\'PԼ4@BE],:b1Lq^/eDV.`2H 1%A U&3QI^OXLXQPT.&&Å܄0 R1,'^*29I `2F#`Fm2_@HTF%` OkA1RӍӧDzkt Q066d2zz[WWQ%č݈KMw'F1QBYT1U1& S=ɚ> Ah UQ`Ac|, |eE/c-uTgdB(X \xVoE(1bѬ!\O 0Y%s#O3-W E@90ӅK'S)Q.`!WK fB3P}(:I W\ ʦEBpGb;7bxp匳eцlAꉨ[t.KPJ6YA#^N;#,Q /ʋ*e:0X $@q D½\BAH`iC:6  \[lz|;ʵXB`m!$/"qrRB!?<E76S  FR<^G`4q8. x >DShΡ@:0PBP #I*XT|Ya:`(%fGh.b8eAJD*('i 8GTi͔]jJ̀`8+Tn JE@@-OmI<ukЙEQTٶx(Oi5S_0&Y2B mk jǂe"ݬIa}u1 "bL.n`T6" u,J?A}t肘ax^ӅN-.=I@#qIW*M0$<!G}2ilO5p)P Ҭ ab&*.Ѳl\^E=p/@󳑞3 |0I%C]0TZCߔȥ^Bm٬ʢ8;<$DMC͏?z&]_[#v1Q|cK~ASۜtEPWxH*勅 Gxe %M0h_X h~8n IndS _! &S1lN d"+Ty(FAP*7Qu9pO^eg_IP2` `:~vHf[R[jCmA΃׍ZT} َ \q,奁_84R31YTK|t"%簐 BA}ұnĝ LY!":br DT rAE^@J5ڂ7.|-0) b0 y5Z %mB܀*,\hG$2eb[3Qw?ۻQDͰIBOce( fn7LSӡm'&<8=: ";rKh[e0lpAx mhh 12݀Gq,Ips kV)ؤvPYB%Ϥ%W,0iC~H kV=1` ff%s 4x zL  b"¿OγqO2{NbePκ@1 I(m{]``Gѕ4s*`bQ[0 T-DB*`BrdjA< F=N0%!߅}IRBL P֋6#ҷ`"HaX_B[e[0Aש2diTj >sPb*l)=6T9/.i 'TTEՀC"" abq'< !`)CS ggx*wd`~HHMi4+HGqeh zsj*_ 2\y `Q1[L$4BߵcW \Ƃ"s XqU9|ss{PNQ/&bf tQ}M }YuaES ߅q|)w ICO`a:ir߹=MDG~ jx?jr9 "&WZ 2K&pDdZ_Aȋa*O"Lka D3SK2,@F#~U(cDX,,n ljr*! nM! (/D/b'Pch: !!05qJ@`N:}0몆  \ЕޮtM:!>ytp:inmmljoyםTr=6mNe2|̈́Áv4D^MY a?C/ZVŠ'afh~v'> S I/1޳}8<GR"aS7Y6n "y;PY]3%I iA0]"RU9̖՗\9%D⥼_tu ~oA"?`hG|Ƕ7ݟǾ66ս{v_ybㆸe54ԝ8~on=ued (8q…Bʯ2~?կ{'O67aMrc[6m~'Z!Uxnݻw`67Af_nM?/~#556Bt=;omoLSզ+Ǐ7@=44s;]Q!hqZH u(h &<qh X̄;w[no7w^KKs!KY ! 5_ 58"lUQv xq˲w/>m :qh]@LF;Ro4x4}[H>3ad ?wx!uvwb [@m^>Z 7 ERvK#z+yMX&e 76ԦXLa/0L뛎׿uGG[.;أ^{5Luu\.9zH2~q/lپ.Jv5ںr&] mms1v+^ё[3=k^۳mx=6:N5Ԥj,ݺzՊ_ ̱ 縭-mP0t;}}.əJSGMPR8U3+ڙl8n-|C۹~ /̍LsCm`ХZ12 uYp1  vq&gZUH1Msq^Ppۃ&p@]AmTaa/ y|0@=DB#:W2R '$ Y_ԩ߿=;| OlLK%1wN&v467n>; 5J|Ԥd\6w&JR_uHƒ ,q|xz ~LZ( gq8r*7=96жyOI9H*pU$L7S;O@ [9ÿSOIPQ)PU${Y" ?Vkz{zXn<- FGv?g?yJX0弳c_g]qťۇ:YpK,^략v횕VdjRBn`\"i-]dU z./tMk[3V]ȿ_|rbE$Bܺb2\իVΟ;lCPuL:N%PFF KV_z*J0:eȹY%/~Q9Ã|tX_c#C#CsoXڣ#9??i jAb$8D_6\hKuźg_}ykC ,AUlc]e3$@HEܚm%D"K^?G_>C{#Q||۷$7@6hQ8~׻=}[ߺqSNAx㏽ꪫ^7r-A'%h>d jF20Lpc1#ͰPԺ֗?{#7}'ݯćۻӾ'?y{[KPcɘ(E ?_47ې҆O|׽oStG7鍯'?q̙Q0L4<#o}[ }llF&vfS?0+j<5#M XgrJJ1p讽淽k|P)>sHKڊHCkk35๶9B!6MC;~jkkGj򪪥aPaMw@ &t<1ӭs`ԈW=ixՎFrR5P:|ښd2UW[[vhx_Cfo`sC| RH>B!uf01|&OӦ؊崙:_+1Wxk[=s]g_e/{޿~gB!T  `¸At.Xn'?;|ś?1+kֳ+>x&<0eOƽ;:::22r7y^Wڵk1OPERA ӄ *G=qd<+A"=]S 7dǬ8!8oB~)[scc#?pow.C rc淽-O5nXt&+‚cXkW $,cdp+_9ԧ>xueRǎ\1}{[%%-AX]3%66}?_{ .\`EP]DJ 2}P>~#cc c9׬?7cC# -Y腢v.kTSL7f1W͢Y+W]he뮹hJtT}~e 鴧Ɯѝ?V49.\g?os#9-y~Z&,'.uW]uh hjGz+ڵk.Y=S3>l2fbU?6SRbY)))e츕v8*%/Z~խ-saΝ9 SIX+-o~wݑ/`car.765AW\ cRBѝwy%K̝3Г0Z=L+Jt,:e5?K.ٶmKkkK.5-{ѱo~ozӛΞ==2.>gow?omi涖cG<裐p6vTh6+PLDQ *NIA<07bm;wշmvߵea0. 1L%8re](LJ T+!.^zФ㸁ODm77|S޳{x =?0}h ^0B2 =#H /z*{;)"B_-ӉUkV8~F D-6Pn4"4Ɗ5uXd9̧+U>/䭄5cjh|SoC\}Ęol> <36FGv_ +vOƺ]󽂦SqǵAOݰ =^bܘF{g %V*kM .T(a%g&*K;H%|tni`::2XJ1vI0N&]+f^{0jk;sѐ9ދ546dhvtW+^\io.䰾`IMOlҗ˯[qmLJq0H-sUMzz4UKRaBV򣣹=a>?sC_׏z}}pu no9/Pu c4D2]o%=656u۵L$HEdx!`":&x@(9@q$IsB[COܹSooϗj R 3X i'"C?㗓& 8'UO|GӋAt߷=t`w6;h;YE.%^G f%DsS lW7n\[W[S RA[U*|BdZq @5qrŢS|+CȂsV⩑!БSyN>a 0Z1׵SG9ٷPvN%j7`  \GFX`^jN%n۴̩#v~&j'xlン'O\F"(P'Řgׅ橊+ 77|mvܺmwo9yx;yA .O?o(>cr* =C6SX We@j0%L)#z!a'Ty% 1 [0X0Vá}Zz[[sssv~ݻ?8gE)8kν'ãjTb[ZZzp遱ЈcgNk ?v|]@=tuvA4dDz'`>>S BB|n$u}?ȉo绾gWox_w-uÇeD2/)ߘ)Apl'3hJ/pB]s{0N|o> VSӰU,@0$2ٜbd/Y" Ҍ̒C=#`s [/_J[,)ë VtIOHajk2iB[`#5d@oZ Um߾KK+,͛+^TtЁ˗.^dhxglt }@*s?{.h`ޞγϯ,s1($ m*ܺ! /K%-4QUvl!wH1/L*bmdq{r2nܴ_W.]6fνɥb/s1N<)UlܼuիW/ 3BB?x8T)*nVX_e˖Xk_󚦦t*󢗼dhdБ/x-Z?[n /|U˒q=ooE`1͙3whL& &k5E1FpFI3b@$P}#vOBɑs=]W_q9\5FFaI(ݖd&sݿ;wޜy<*OyaXgc=W;~췾sK_+\,p608|\.+L Cm]M5f hT];'}M? 9z *Vr*]SɴI2"b U5#\Gj ,(~a* I]!DӛFkA>W֒)]2uϧy})lqS\ >}0{Q[ru]&ehJFLCa ,a! ȧdy HLǵq'nA*_r W9Ԛa/$fhI{,J^8= ӱ"y.*nL`*0=u#ڮ㻱w|hdъ\zrSNm0, a )$UPQ;/ \/oYL*VQB3aTշ⾮*@2}`kЮk:;;a3D XCU\&TݻSi0l2w\ݳgϢ%a57=~j|Μel ˗PǷ7|chhh}'OͲgΞ;w.OdƭCy)NEO` I "Jh:5~;:$HZ`=-F[>J}ΧZ#Ct|jBװWh' GE jX=~_QLu*` Sx ,"x %t~Ȝb%TC>\aЌXaapH ̴ &=mHn%cz1 1w㓁  ٞ<тґLl*<88  U@w`nH@ S%f.cAg\wu+W¬CdӁB r\N-ٶ裏57`w?+W,oj+ع.^x,nk8z} |u.[곐w~;ښt}CX&O<֭l۩}_{LxY+dbكXN`A_; )t=fQ(oLc/-/dȮ<AJRbܴq_,?/ovoO00|%LÜX-ܦm/π1GÊ|(iCЂ0#J'׉Qs$GA C*~P )束f61ZvT4ie Sʪ%[/fdE@AO\]暦ilD0X<ugHzlB4 >lw5(\8'q~c;Kt&B Jh)O|?`;%784b12D㖩qCMAA3\%f`Mb8c g݉#CU ϡN7Vo1]3/`O)pK`D%F)&DyBE(6*(~z4H+N֟KWhe0ER񉛁,3e8A!,*L ug0Cf.M$Rj\-F 6PPx  <gbg՝|6L׀KjX Xi 0/r= .%( {( m f 9fSFfeoAXTS3ǣ}WC+a!)P M,>~A MK4:zLHcA⶟СC˗-y$tVd , ld`#d(!0^J^zpم$yB Z|;|LYbJhA/zBPf_?~D  @Ǣ2[Z9,*gB}b`Xaa]'`8@HrbXǤ "RPOכok`y~- 5bk*{(Ŝ"u>˃ "T"\L(u7ۖF8߳64LDwUYy4EFy;i,hED68tyd,!("4: 4!j})4| _Nܳ`; qx>=u~Uꪨn|GHMl`e4I  ijH烺Z~2_ȧrF&PrKȮ+Fu8_Tbv`$2bnu*PFX]j̶]qbp4DPp Bn*NkEPH`-Bc0 lIHYȴ:{߹sڵkW\/ ǧ(ʫnZhTU* ׅJnc&Ɔt&K͖"mF+m0(V3LF-&`-,P(l߱lllDIN^ \9s,cɒmXGQ-pGR Âx\c@p+`-MwlƓQ`hpkq-1br J "~BEU3Nd-V9*%/p/ E@>n`v>ji 7 ;y?X0 y*P}~1q(>kv!İM1@ǒ=,!pY#Zi 8cтN䈏φrUM^y!y#5iY|RnC.2*plLbB1q _h ЧI{oooojjQ@j 1bUPERRG {AE*aBBQ I#XPhòI֖涶: JuX\ L28P`t0WI" VмXL$ <0'.`N8>X! NNAhkPJ hXk+B&@VH*@ٱd܄st袀">  v~,O<8Xܰy4%|Rc>FBcxyFd7 KRQSDVqJ ޘ {Ihh5P~hߥ-Bܢ/pr0С&]~ 3^RfZTGhxQtP3 LȢ"VYR ʮ0q7b\eDA\9(p`Y@4Ƀ^2g^>7iS8vС{B[z.VWp arNI;|nd$Spt l4sJ<K($,n,%|Iµ]>lZuD킎u ʶt)zzB)byEIa" Qj,:IAj "D͈,nӒI+:0%w[>$$ ga7kw464Y·tZ̒ Qb$xpeR7KMUlCy6~K"G`NXoh0We~Z[ᨭ\ĉuu|۽_l|ϯmYT*pč&?iƩSgn{h5-q:" E+SFIƓ^1RSQi| j@eטjG1!2`.T׾m`'s|x ߹wt2O{TMow=}?Sy}C_ʗaV]]ݣ>Wjok;tۿ}?~XKsKM4Lm Wַo82⅍0=c;Z0{m?c6ںxmGcԧ__ܾßS__BU qѱlŊu "K,)fm۹tݰ` qGI9>p7nr%S:bDh A:s Do(Gڗ(ԓD. :'㰕D>ŧ܍w }7կYhq:h a̛7/xѫ_'7pêA_5+?t,0>]1ս1jjlPbկq?70Con8sl*YϺoxѣG^V7;{sa"$RkU~_UW._#OZ =\~qdؾݽ'^T֖ƚ_;{WwP]&RvlLO gsZetL FXИ ڂE 7j%o>җ1iXi% d@ x: z2~r' .ܐ,9Y*SHTDX$"L4=lb;qc[w~۞ظqxd4c 5US K#o;X3&*F2bf^X.x^v:z l똧R$j6o< 劓*pW rv JP)|>^KkkSsEK^/mQ[_k;9zP'%[5 *ΰȃDůVr!hl-J(,V*@%@XO )*_Q Nl[7~iӆ{_N:O|{_5~wÉWK^/ m:4o, of믾_Ɨظ??;uso?܅_Q`_ɁdZ./W |0'H0@C]]g8^{ݿ˿vuu:węL&Stq+͙#iT^GD>:nc\LUF!-dƲcXtgtGY`+[IS7\6@&Qh1J/G ٮ\rt-U˜9 46|w ,Xe"=z|Ka\AF (}  'c2jh|A87A^|k'KZ"hQh, >iB5I)6B}ǂݓNMmJ\lBHm0d*9~X gq׳u]5u߾;?N$)?z[nF0v J̎?k^/}SԞ>|_}sy2IJ- Ʃ YU`#Ӫ'O)0,B.KRJyR0xϳWXxJ %CD=Մi1bNQ] $F <Lh2 w>79u׮m}\?[{׎z{/>[y}XMj:ocO9B}]6ߟ`A{{Mw+@]w+mlE |+滨{S5a}7l6p٥~3L&]͏ϛӚ%γّCŢx\Cӓ %Д9}VCcF׋`6~?L0t#f<*SKMD.yUGz;;oΜ/}3_珟џwƗ775 'V@*K YW2ON`x- b2Ţa+Ug@Cp7p.j)A"j:j .%\l,+nZԀҼp¾>A455YNIȂk:Ų1 mɒ% ϺׯK$X}}kۮڥ˖<б acѮo??_'?jjL#!%<" r LR RgLSaV-G Q)-flZ>L{[ƪD)2^ uuX9˗/iok_xQGG{x4U?oAMm4oo|<L=V, LT5Ԑq 9|~KKO(ǚ16:zw>}k]ha]}-}67"^/N4P{M-MMȿӵϾGFnP8qPGmW7}}Ntl}A3rc?754p?-Sٲe[*ioHA.M厉G~*0Aժ`J lԦh6OZ<ߋKmo{ﻻl__'?[~04x.P'6WF"idcȖvdr y^<%(E>݆ Xc 0}*j * pIˡ LyZR/-+̙3p&ItB}"emx;#aa*Eh*yu7GΝv펌 CCg@;9o~sYxav,?cn6;ᙣ0.M zC!<} ç<`a]`;788vڷo|PW^}(--mO*Ǻ`Qզ={v{1}=[~|eb2TMMhvlt,ytÏ_-_ӀY=tƒM<\s.G ȴm#-vftx3XCCC(̓b:gnK.6ocuu]N&ѣȅ& fX-Vrqyc ,S=uĽoyG fXGǎòsپ~z{|! DQ} +V@412۵kg_oJSsٳ]55׿U_k/2_Zvԩe˗ti GhiX|5KXf]l t_0m[ 3,X9!_Xz6pxѼ⨯?xر6n\|"ة](,.=Yz<-K!U%@T0Hy/uc󅒠iQ@3@56x- -̖Mœ9XxH)|>nxb޽Q8}`\H$a$'Ćx. d"9EsC$kz -+:{ɒst\zn tzzNCG>x`+^y ̛7k}:?ƆiFGz{ϝ>s155Ν}e=yklj:uTwW70;2iDzŋsqӚ^mҩ,@Emכ3wN&e<&ӖX:g^;߲yk\s2$#%I4$-ijhjnh^deI3.Zbf"]q=.π0t:}m[?ycܗ;VZsO8gŦiAyÖ۷\rҥ3Ȗ\R ȍ^ qv܏Qg\oCO(S}~T.4S-6U!B0("ޫG%zxi3!~1|zaU֭:uk֬a@U}g˗.CU8̞˳UaS{_\uMFė-bgtm߶}dh(\p ˗ÞRU 5%ɇrc.h0x?<25i4rhI x0>UY,p+ PBٌ_fIFz3UbqO //D ̮XccM{{]80rj!D |7qL( 2ayOcGG]F\ETcPdeX cQC&D?%XE$\ooɉU z*b]Δzp>C_qd!BV/S3@"Nj¾O"hZ?ѷV@WEY#~F ϶%:2L[􀓎f1j'ҷGy)xhپf91ȉ3'viJq[҉eXJX`c*W7>  Ј@?'r L[ ]AL#=?qRAXCv4 RiC#[%B5w5<<ƒzus5ap\ O(ቁoy'g/i<c‡w =gq*. A@b\x<k0ٔ,Bdד°%L,qmq &yoGih`*D()"u&d5Q19T| ^uc GZԢ ab SضH5LD }Qca51}!)5ݠI}ƃd/OGb] ynYP@ ԊBh @Q`UO*I_O늣zL5UWDMjt:5Hg )L%uEʗ߯ѸP (Y@fPHcъgRPM!pxGDh˛-lٲrJh (lWy)0AWx, <  Frn bfW?}9M+g\ςڄi)1KPgB=i@X>K냗b20&HGC $EjD$};*1$`dž ۧ/PSF-˧(7I2̹S|r| KQPÒ9 Oqtr,L|Qs<]@o ×Ha 鬧S'6F.J"VR}oCLp<2Dӊyi_" B8ڗ;Q Y2B$frS*FC{3/b CzمQLZu-ƖX" lxXQΞscgz;zr9y$vU_J,yF ^)$ǚ+sPDF)AzQj!MPHD89Ipua"F8o Lǀ$SU"A#e8pʴx06Da`N?hMd {C`9 vV ֌X1fM3*j p#DJ|2aYQ,((aV"@M |,% B{:W+0GpfGXeEDVuX\%V W zŐ8Z"/,8!] ƨ6IjIDY2w]===h!SQGL@⃔@] "O>\B:pey`@+C[`9Th%:s;?uxS "lΩI67֤,-%mb里&& J_ X)| NND, ٳĉgΜ9uӧGcP Pxz"i1T [eam)Dr ނ!$TM!>xR' ..IY KSC& > MDkUA$̮tU#Tg(Z>%fo#:$Q&߷ߊ;b8rF6t09D0 x+O|HMp~/84 {MY.s.=DIǘ!c.E5?hJ#>, ib;E wLj]@3ut8O+C L,L]zI|G[(77@ Sl.EPAzjŝ:.|n0]W޷nP|m9PT6˪!8@ f /p0[P?t9$ݪ3x384W_hk4abl˰ J>2/QP>IDa7eR  #0`XZ6Nϝ;ehp3:wp·a.릢U3Ed`8=ySeA [[Fs\@\U@e(FZW[[ 764tu9'c1Œ86e+ɱ JqHJ*@DK !*Ҏc\K<(=ʤw*%H#wTOFlS/0Ʌe6D6 x U 3 A#^mz> Pt\/~㸮xP/2XnB #Upl*|b)Qi[.:/ |xBT9XJB&F_s<6”KNG}+>f8ҁ ЎcNjS͋r[ڲeÇ M7t!zf :)(j %J 3Ю<@cqP;wٹgߎ]ϞBB9~ckGH|%G`sļ p^1~wqw$ڡ(,, /X-Rl!09 :(~Ç{8%\6S:' C3`Q%IPJc|t8?\]1lp?zƖTgIZ2΅$@ h2ёQ0?ٱ\x ׶)DB?LB>1\!s_el.N:Xh$"hA?A`qB[Xpk||b;@sЊkVG\s -w)@{ T]@CKS@ ˎ}^qI'_2tv,K,s(4B"DO)|ˁ3qSX^VAm~w{-twwt: zb,,:@?0aBD  Ľ 31V܋o6 gCNQ 5TOM`,WN&i-7'am n!@ nSsjF)D ( z@.H B+/}?_muӊ #6o - 7~sOh|>OnqjL;s?G̛3&xsǮ롽LO@OWW !Acay8y hʢ ,liVw1]v*ّ#GN8 YzT$Z<$'LDAr9_ w~D"j栄)_&^$ %X.bMpuuUr5:OYj9#ɠz!Xw ?;bû}C9)lρ{XQ cEU1`\@g8T76ACK\³QfZU_/xs+/oh >N :e!B{> Z !pcM1H@EGҗs1^9'8@ ^ m~(6+u/ϽJ@rTI p0`%ם)Dl :Mn)aJ# O7LAx0[$ J:|a4K~mo~/}acS8艍[;:Z_vl=sx{9_w mt'؀ҵu\yӍ7ܿgps{ԧ>|6 E w~K{O?w,]_>۷:z[5\Ne ijx{wߖ|ڽg9_UB.L}_>mG?rc ؙ0aNu]g{|/:p֓lM3.H)y>ti*H֞D?") G Ok㺾PQ x _xWC|ͣPy{-mJ=0~MݱcǹsШdS!xQ-ƂqcS|Uͼ3ңFmq~eɐxd'wj·\cCC07cEӷ8lλ=G\$$pՅjB!/#pN>_}۷%# \!D#p(Y_5<+LٮSN '´w|^8ӧusFGG;,呑Qᑡ< b597гo ,d(;|ol,'Om9=O_\Sp!< qA.x`6K.s\vxoo[9sιʫtSV}B>[:cݪ---'ɠSTtr޼p< Lڵhll;|Q{߻p~Ⱥ/ҮCQ!{ɓ'ꓩԱy3g/}0_ŕ&k~׎Oط%^O$nYq !^xƗ ZȒ)͎;@P*$PF k| rB4 q 7T;tW47v3dCͭӯwun?v?4>mI--%?<ҫ낀e ᛂiAe j#85@Fs\;>P'QA8۶mmjj׽uHE>_w7<NP۽_(x;m۶n5s#=y/_[{Yp;!#G?z㟾_sd2ׄa򌜩gw*H)n>O V'Ν4B_ηӟƻaqevXD 3X'N{.\АNN%B(?c9[Q%7-zIS  ʂ縇VScS&\tܹtO.diꮛ3 %jMv=]Muq˂|MW?}M;,39ނںsjoP>&ƀIM-ҡ鸭Ɛ`f/"LGqF,uvm_w𪫮z_jU<{{0vyh3H mBUc1鈀>B(-(J7Y@Uو`Sh icvch@ n'چ2zK͌fg3=Ca[<:qMohm$*&_I*$AD.h e b?{r%RAW _9 4 }ʕ/_o&K$ׯf́ SIxPtPW8qOl]{wqۂK[[1}/hN #rښew282OQS3=;.VJYL 5 ^t){@Ss39pe.~{߱eמQ|7)]]nΛ?68}_ F} ^`.-,",DW`& \q+W 3ރGippڞWs{lllۿ޽:ڵm? :}2'=J=[nk_ؤjX;:Z{za5jMi[?9A.^sf[n=}4e˖-zP(J@:+!d"f90h\b"~LuYз &%*( HLVG̏ a7=V\^xT(Po1\C&r҆L6NjAOe= ‘9 AKxbhH8+F|r"D!5?448: өY'B:w`pq1+(q+u}ӟ߿.[x%KRUSLX:YޛY䆉D󂾾^s;;$yy6Ɏ̢g!j:L(oftLL$a̙3y7gDz]Ѿhɒ\76:^jJ=iHYc#?˖|+_9N^7XV7o F C`@HFtԅhK$ccOO~l횕Lk[gd2P ]jip1WA` %=k[ST27 _uttB5}@M,:!m ??###'7?%= ۚPZ&A(\0%Wt%N9k瞗O:5<}=STcC= z+a'NܴmǺϜ:re_ZWc-z"f v1|ޞTy2`xDñ]?8qbΝ0` Gnnj^rw-7ڹ=˯^yKsKcux&\<5u[0wN*n;~{G޳RMرcFJMcΜ=8y fRL2>撵Xݵgws˗-tӭ(.WK_V\9IfC8pxCha>xᲖx"Y::`svֽKiݵ{GmmM[[k: rp@dAVBY7q߂IGG{bvںuUW]v% '8u%$ꨅv̢)D.D$PF`MJCȵf04 GlFleFQӴ5!`Ex. %ƶ=bVYjS 2kP|O~0V<^0 'dŽtÅVQ$hȕ4'A:SHjaa bɰz.\+)jkkq 666À-4Z[Z)SrQey ,-E/]tu+VYhkV^]o&ǶKnN*dtͲeK&PǜU30F4dґ%+WXzͥҙ![3q܂Τ]v٢E𭭐i]qIx o?9]rMsSSKCXϾ6]S6&nyJ82Z`Ο7`cC5^'1=KS-Ίa1,^܍ 7,|ZɂJϟԀ),]N` gꮸb+-ḋ%P6 0P$dZ"^tYC]cScŋ.L%0ܹsӖ8$fJHާrR0MQpp(/\z/zы15`BoĽ d%ۜ2EJ dڻwu P-EL_3P10%=WЗѵxQKoz{O_؈U3 =Fyd,CW=rte 6?|WJ+֧S+-XzܦֺZSCQTM)o0O@FdI A)ԱzOܣć@d!%,2!A:<-FU^E+v}2.^"n8X;bdp.:?1X\i2*"oHbEê4U2B!s Jť0 (& kG;){~u]VZm-Ux!#`HP 4۟bջxj4{ꌚf%Y詜gjXnsj,cG\ޥskk׭Y]LX*<d tT1XLy@QBG:.%d\Fd34`n3,_:)܉3!Nd.~EJ_A,a-D .bݕЀrU-蚅FkJ/ $TrJ!=#X+s*6R7@Łxc*JL/,8rՃ_ *3$ WRBą&A[xLr]3ck_òR%X~>4Vt56 ϟ SPUs $9E|\b&בy $FaHtgPnʭrԗKf 11 E|2TJ̪0%C *׼BxwⷡA{k_aGP `'`G2FKoe֢ogFN{aS ^ 18|zICϺd9 ͣdŹ_ޱ&mfi2d:RO-).1%>ǏMb"$0,ßBrD3y9( tV3EGdo &`M-D>#R?eR ʛQdRLMjՙ Q^U QnUc')B4AERO$uP(tMD1δҩ vu/1\jlH1 L+,҇A9!p B*eT) WR ~($ jjZNYc/A6.2Q*B( gy#/@8b' 9PHW&u!ZQ䔺㦈&*b(K-2.F,-#P1`ۗ6S7jU;eڹm΅Mnƌ4 ę"V;w$%NPB{&z$uJeHf8E577|Un]@Wgr Aq/8R,-QJ(EJ@!h =}&#Paj@M00ì7ў ҳ+Ǎq~K TaO"!R7(: fy&&C-8mӠ",8CL84ErM$Q:bR[E߱ВMuCy/G_h U@Eg[QaaXB\@bMHр<. H5:.2D=b9Uk%ڕG;Ah%.]X%UBIA˘ 6=ztll/KS@ 9~.4X[[kiiilll3$딃_ HP)`-_"+EC_-+ق:nj}+#=K;fsmF ׶ŚTq-y 'ȑ#x$.\QB!A" ;]s޾u\aGӉCȄ'@yx*!vVj96!3 XcȖң:AfM$ CV({TlDM5iPʐIEy 4%>BI,\`Ȋ 5H2VC^=t撧#c#hY^25+PDiqB<!/0>CρMUҠJr01x Agn|Z.D\F@-K> Λ\*MaY +g3P|o񼖶ƺ_ Asxe14_V;I$5+j+$v ᝡ|""m˗/T@Rh4 饿&gHDؔ2*ScV(L-2Y"z"q <^^Utd@"W@y jWĵ 偌&7ָLr$+=%iqO#a"}FJAP6Vb B0JlIkLKZ LT?ԟ'ObxޝN?v)Z9 PBuܹ_zʆwKV-\1h ڌt pOEFp\t8J~ &6E${|ʹ uش@M(5'lP:K Hؙ} WȘJ/ yk,X} IrĞT@cF~PQe!1]R@y Wra[-ģcS='OTnjL)E j /j^t&(J̤o)1O5%/] ""Qds_%c͈3 Ԙ劘T,)YB9WL=Fr@Rf He˳xE` S`&*!B*UU>?/ R %J,NOP8{}EE<@%9"0!p1$A? οJ'ttmY(H<ۗQ d]t|<'⁨)P3 <Y1#UK.@6H*mAJFjĥcm Dy"Ojb#Մʧ]r>m)>gRG vvCTŀ TU_SPR`iĭ@@4:ݶ *_Vhzxܔ◾D m^SSS[[؀61*ID/9MDYFR6J 8׹|0Rd_,y [Tn*H璶|+c2K-%"Axzy lI!^Nj4%3yH=PY 'Ja"}٣bw $bх $̓T(kWjbytW ( @BJ<"bjy,,xD"dٰVh5KƭkEMQ\,> [zSb/Z9%ӆկ|}يE˖_ji9==lT"I]UHjJXt}"GY)~k_;w+gf HpPD:$9ʩUCX5UQn4k +LL$,D2g^*.I,HTY^y4Zb WYPc=-hb:([vt*xxK,AQI{MdC,j|+Z[͎;~bdd$Bd%0] C0y.NooMN8:4׾n۱cWqwl<E y7Zz^׾v]wع>8~}ߏ066vٺ|p޽P<K(Hd$֨OLe@k8rPd|e603}?}#OL4NX2z Slx6aXΐ58h5z~1O,]nę3{{ͭ'5ԼbŲζϙ7}K_pTc':wڼicGz̙/xAGG -K 2_d)]t-UB;3TSx _җγ|BvYS> ] 8YJ >D"?pq (7O>O|ssKOM]3jkA>;8}1uy.R 7Š[@B@@:A_HaU4Rrj@Vh!{z c2Dy ʞ QQ MA4!f2DyO?uaXLX AO5gG'i/:78sv!Ξ[`Esq3hPKۏPA'Noua2(|cq<dV$yDqKc$ODГ2: AQF ."d,Ēş0 OkbmOfƬ`@|PFу*a0YDjl@ Ÿ <ۘ8o" 1Mux"q0 ]>kXf(Iٶgyz< @mxڕ~މ͛7ы^KOOXvsmw2i54Y?{w*OUw|ˏ}^ʆ&Hڮ⻾x+ c;węx<.TJ 7%K WK_Xb|j\A~!ʣ\BP:Gc"׃Q]+Dp)ݯQijC9)tctM|mYQ YYEDWGE]El" K%,oo|bCάW,ŢUBHIAp^р)AV{*If ,A4S-|X i Q^PÔ;p<>y!{8t>"pdu %ɂcUjʡ,k| /E˱P +̙Aɏ/P +"JhcY3C-;hqlްe۶m+W\lE AjL㚫|ϳLt@٘B`j3{x?0)3H=/.O$#C]=d +8D]H&wO|nnnA,|8"aO4t( !5%jS0X1\(HB8LR8@k5%h ) U 9UƏShG2` 3AvA&i5 s$2˪ A,F_&0$mfAenqKUWi4 oEH"f||8~bTT\$THHpҁy&[ H@ ^>biC𘺞 "Ëb5y/-YzBKS-O0(m<,XDO55)855VA& cBT4kvW\trmA <m5 \t u(KڎJ8,t4!kj2 <L7yˊ0J<-Y$j:_ pE2? 1%$PFT4Q-:8KHmD"'\FJm1%.AJhG2` 3Av2WH}-OC_A D BG4x2P%V5 " ռȄRӂ*qr,C; ٠"Px&%0{{`]~ HQY$JSsv2&;/:"җ; * ={H2ҁc'ZNGI]g;(PoP0|0tH ,⃳(# E8 2@q$~+L bYG'6L62)58*R[h>^rQ XBLP]bЂ,ǎ[~}{{;K;]j t`2<S|()[(&s|`;R[LA  -+&N胈tf{L~F[A3L/c ­lD)adYAm݀5'w{9T=(&p #2|MZq3\,ʌ/4\-|̢m D <79#\4M|q["HjZty2x,=--Vo(T ]012NQ"@j $".\ H1$*3@: ~E6t:AP*!]_˲FG3pD|ވF#2TtnB/U Rc& '>X"!:I=[)~ܳpV.eũXh䙠rPD:x5\{,.b :~QTj;" ^Ǖ(vЋn,[G A=-E \1tыx*"$1g)DwMq("΁{߿ZZZ |  eka1Ea~"}H(Ŝw)~BH< D3mU??`5UOr@{X@S pUSh TΕ~lthlܖ7򅭦](>q-N,@muUxBuTh JRnt[)J- 42 TD'0H븉K8UU&+h ]  \"Kv* 0QQ )2iG1 1zF$'N D Ž67E Pq,W!y&,~3g9rk*4']jJV{P-?yRH+qD8J3H%TjS !zϢ"ja).7?G1˦|fb>Fj̄3þL|(Q!c[wԏtߐ~eGsa̢" 0 O/ G(Р'al@M nW-?K$ճ!Z!.L&'4T ()%/hH5,LJB Ua6f()DP]8)0t&YFb"@x'PM"p|* &i %;A˸ k f6 \SB dqɇ~Ѭ7 *bqN9]bRV@`BLx F#U_8aV,⬍ 2EA|<WXQalXGN_ B}DU@TaD+!Bq=D"dYz@;QL/%/ mCtɘ?V:74 p=ДPN L+Zwj`SV<lrZVnt{s[6 fNI>~5%&7{Q9K?)ΐ.r$ ,4AZ(}tCc;P.<:Ht"ZCP LAId!:p@ײ|u0?FP XPȁO$TP԰, SxWg 5Zcl=H'l_ j J SE: C /Ɉ_H`L 8急R\h(=ާcRᅠ0zƂWGi _zu @4d'mD xd`8 $*.j5ieO()@444'C7 ɀYrt5%~XSH,EPR'O0fX 0+O-z1M  ? ƒha$#K!gc_Q) oyY^r"c)/ ?kx_+f^.l2(Q%@;-7F ? `sq{^Aa,f.,\+ Y njS8*d3,"eM)QʒȒA"Z)L4_ !/b J2 djT"x7o{߻qesv|dȈ{EUZ,c*@"XVRy )AK[ EKBTp8"2k 6y <@N>ać|0O IfÀ,\aĩʎ`N\9c֩r'6l.r $(]vZ~%٦:bWXK2@S̢8((Ӑ^bB"ؿC=;08v-P5B35 C-pr =XTJbLR0j$9 !P;I&(@B;3!v54'јabUIrHO ţVV-"++p+)4s=戞Pţp$0 3 %4٠q Äqeyp@Pb_T|ؠ'sI;08ܰ+ c#W} r@WDu&C7 L;LOAΉ(&1ڲdlIDI+ڲl?[[~o]W~ޕV( `I13L|o;=n P$qqnSN:uNMFpԤJ 9”/%8ؙ<{l^5i*b6Z9bwg"W8^Z#[|/~?te85tl)q3bJHerC|ZDRvc D4ie]r/ `ƈy?!Zy ])PQ~*;,`X'O0MĒO<mp2@)=@et5̑>Uނ]k,+ij_޹|KvR,~؉֭9|߿cևGG'{z xpWv?SxxH9?1::JN,&s̩Wxm{*vɳ"^Όo~m$ο{Yz Q&3*"Pr/qxɎ$v&Ca|=c9,&>p?޴cxl޽;^رm۶-cؒ< zӛ KzY! ymq6^e\ʃj%Q_+*˓>}˷}'ҋ;vUGy啝K-+&719EgO?~|ƍ/~gsytMT^x#ezvlbՏ=C?Fݫ坯XWM; ApPfD#r1Ooׯ_梽{޺e+[rM_ &uʀK&{RS5k̟?ϴM<@/u3O?}+h+>}z8"P5ȃ7ضkVw$J(xr+E&9H+Umf@hJνІSts!8]\`=E*իo߾~ ;^f׈(g=m0RNYPΊI&=*ؘ!z38V[-=׵ w||6}[7xԉ<u֬rmk :[Owך5{\.N5Ub!jc`F ViV0(/R*z?5Ba9/PK 'V,]5.~ڒ0k!Z U{b[ngg>^pmc?|~λ~cmm]wk"lr}G=8Ek/?b+V|;liѣm׿Ξ12r&hc!<Ѿځ3HTj7Xv7t5W&;ۧ&W_o~ץmH&.䆺i޽qWkrb2^o-﹅⋯aأ9B^>KR_wM7ߴ|BR+=CMT7g_<1 KvK/W_}饗=U;UVvZQ\]pfGظd6nǗ.]z5׼Ό Mnzwxё3/x cbq^$H#YU\:S/r1"DFLJު]T2ԇVNQ2PJˆLe IV@!bƺu]f뙶0{^-_g_/?ot:c1y衇.dç?[nDž#LJB5h'+WuiX YVdTz{BV=$MTNXڨhѨE&h4wmkL&- ,Y0bUȯ$ʱf2TJN4C@9RO=-? FpAPG5s!(S\uNW+x,^tAxXn/L+Xregg'g)ߊMqU۰),7r%i!, m-otDNRt422mzpK$G>ۿ|K,iOvPӷh5u}{`rr2R֍1Vvc{u[*_tjlj :t|ة*m͂@jh5 !: .f" 6|fUJ"b  J2Ik>kSιMIR)bc?i۾Q*E,zfX^, )-bG|G0pfٱcd-Z<2:}_؁CrJH&e^fE77DK+EL/b ;5#aKG ߑ'z8*myQ'}yLG~կ?1]r i]Ѳ(FOl-,[8f5laX DɌ]vvt`E r^r7Oz뱣W\uƊ-<\+ZF$/n{G3:GP%ڣݓSccW;>;ַlbP=?4zfErAŮppV @lydmL?lypo?ꫯx_ԭxgBO,4Mv|7λ6mȼy7p޻7,\#Bg$9$&k֮tƿ_w&h.s w\6دMɵX _Z%h@BMBGŪA#bɕ_IIF *zh5R3` 4Հ {}V̻Sb2TKID!Me&yq~{ickKL72SpBbrWޑd 808nyOgW_|O?o:5~μN4iO}_~7ѯz䱏}r%, "Dĩή|Uw̍Ytlvy3 njD #1CN~Ԗ48+ڦ1hݼiOAtd:'ToʱQ)"q $GUkrj+JNLLjbt)$h℔x,W7鞞\mCg77fMSK#Ni)."j -iA)Fݑ#GW2Ug3gr)Ǖx|ӏ?'>N۱]?8fR9.V1Q/uiV;3GVhU.󩩔.ٙTofluʔEϪ2!'h4ȁ 8U kq#E55hĹ%bɪpY.¹^FA-I#_ %E/\чmijъQ9 䬙<%>vޱ=_d%XYՐcn x7`Ξ}- FCߍIR FޤRijs̢ip^bsHeBx莫/꡴Z + LVԃL5xU3 CHG#UP-5y9HU>A>E4d @9I`'Zf,9hyI~<6Dz흉(sW}UKZYe_XtXr w;; ~މ2-/zd[19D4Z:[LeW`lNF7!BAO"5YOf@27s,SSibJtML}"ztE͠拼P}zn4YbcaMy5ٻ^"Mb1ihƆ}S##71'/10f7 Qȩf/NE :|9(N::.+$%cDP V08K" f1jgwKFDwo^?=o`P}``{5ޝ'OܰaҥK nY-tM1pX5;#-:g d9.\?(2CW 8sʇqH&^LTΒ^K j}2/i2g 3.aNeQUiS4|zy1}f LUڻh,ToV3HGPSAZ*޼A#P1Z%> ,@C87R#j4BZE4tXw|U+W-X@ , T4 Z3+%}Č?z~\t+qOq#0_9eP^A >%WԯzERqSj4sUe%"N"m<.CF*rgP2L}\\͛“\3=3pWs=pxpV;:qĺ/^|y["A@P`IB˦{@8Q,ƴY X(LR|"+|^pwcT,*$=iQZ.3.R)@L /h7͡DIڂ>ZF#3؈Ezzz<`^[I:;;L-/٦|Z6R_r|Y"LHȀq]X/@Ww#Z(΢\9ohFA-4-WӴ@l9QV;Ve՞|] DrkD^͈J;MA W3OA*Ҷ"W}t Ѣ%mhsȗ;ͤt'=b!oHM;JXPT.j k <"O95z@aXHEETd@#SvAXnpYϔ 7\|G8+I~M5i *$k ebhTVemЗMn k%hxu%s4FA L+Ք|8#)@lInxa˲@@Dgc\NEB A?hhIz^OBT%aE [ަ(w#cYS܌ +)!RV^Ğ3m0uڍodPHBU3"N0!m T(z*h9+ϓoqy$:;=[pV~@kkME'f*#CY|ȕ$'p(ZȉeAg 8Fp<5_ @j(yԘ 6̻XԞċV`0xYTLb-b%HK7 fBqWmvXv1Y2sn%9~ rgU^DR( /fNhJx$evZV~kx_x5k4%*HsA8'PمNpT+QVZ 9ܦԗD+6K]00IMn[&m{chܑ G4vl_jUѢiLoV.P(WYRf9%ZCwfHH9̈tn@F* n;tTjtt?lJ×A><ڟjQT(WkJDK* E#΍Шǧv.@J[ZjO_KŅuɤ~Q/zwmgrr+yDH ȓbγH{ŶD׉/'SBR(bj*Sjy#c\"QF:(ɒԃ4Nsɧ(^a, iЫ%*e#9TO-ÐKEUu$(BE%~gL,XWaO<1pNC = V$ 3 \ x邳o&&c5pI4Pr*WMgˬQ<$0"*stEuӮDX,OtZ)ՕNHTB% BikdMԥ2mSbR%SP } N:{DD.A%aEHܗ"Yc#>DV0/h81cQfv&H]t,Ǔ{jODqf58XJ9 SȊA<#F$R&N6^!ݕT.ǁ%]#JO7D|d Vm)nC>nqWЪ <&{v}KЎ@@ԢEK8$j !2ȏuxE,I0 p (!eeNХZ I7)P4]#dZf̍4C(aaMY|%,L3"]%!X-oZT]!@: #8V_i1XN.xJQ)k||brr bSSdGgOw/T!_Ȧ2VlstL{i,.Hx9T ؾa `:3jF\A !'GBeCXҟ]yW]uUKC>_O8ϥ(;By;Sv2ٝhO$YJJs+SO=;59:H"&$_bk4${lcys$u]$O:=\J/衂Md[{[<c YYf \“i,"SS$,]9ETUH F!Dyu `^G Ҩ"jtB@)rCV'h"HS'Nat_.i ΢pMh.Rq||;G?k_'OiNuvv1;r!NP¢ b2mS0td:{[/k%ˍ81W 6~ 0#@W75\ 6mO̘ Þi.cIݿs_pG?rկ-\u0Jv4VX,! ٔ<:mBkiq\fr&b-ۙʿK/{Um?E˺:sl:'07jOl'fL%5\C.@hkKGFd`p-cFiC8/#MHMelٺwマ}e4=;MhoO2aBDU/ȅP&B(+߬f ?6DcrAIX4@HZ'9㋆0A ]Oy9d^HXZB6$D5}ٳgm=~֎n&&r'۷wxtt*+IN<\ߍS?r'O={̙L6Nax"L/_:=tj|lbϞC956>4Ç:oucQCCCt#yq-&Z/o!`boCβeMHK4=56(u9f+##g]XMXrɲ=}?2iNV5 Cu'ь:fѓ'O"тEN8}9 x2~"aj:qͧoATЇ((B˗Xbʕt6MBS!U@Юh׬;@2JʻkEN2 3y{ϟn}CK.cǰa-GdG8699bgΜٷo?Fdj.~lM7i9kPJsC$#|M_bѢ)6%gv0v- fU4FtNhpp|M'xWx9ltk^GЙKc?3}?y~{]{̙fQm{bw}m9xș=(Ƕ?C[8~2R/]N}m{|?<<90xjjt}=6K.Äޅ34:ђFvT-pyn'K.`6ǙbT.шby%8@ê+”ՒT*iqqF17|цr0 90/b/܋E vFQ#6 ʪˀB hXEjOO m{{--Q~Tˆ^KB uNסS;_ HcPȒ ҏQ)DdHׯ-B7EϾǼKkΝ^s͵!lt0[|n#}sM8k;5ob|ء݋ϻ_>=4jdqӧOlݺW>`.X+̝3x֭[GZ>xon7>x;b*a=c.t5k˖-_x%lHţ[ҍc~S=rN'ż݌F8 SpLq !fCLu497z9XN~^["bd|b"ΌOpgH7'q1xzCCRpМe=`),q47DՑ#!)N[k.a544<:Q Ϟ^r ,@(Ltb s%lj@)$fD |G_sNz!"SekxЬ<hV}LK''SڋQp͚˖`z1w_z>vZqG~B&v K.ݸhҧ}np޼}lܸ1\G [uCt]2Y&{]/U䷮!]v?{ u%L?9]}%?j26~+'(mKs\QҊ{Ǎ<]p`` ܹ0 ]]tC;w|||V&.ʥ'źP Rjg=7J,4 \'9s̟S^d|.mRhC pڕ+W^|5gW^ 8_ 8}(oݺuD21O/]`;w\#3١o1usb.fʼn^~8n&8S Z@bvbj~-184FMY^ugCa$TG&S0| s0eQ>1^/q@E,q#'B&d8z&ܺ.KBvAF&d\'Ci4$^DEFC>it?M#t$=ӏ.{PfkaⰈ-A#6288yZ<]^xy>G~%2)QfƒI?1abݷRXce8wqE ն׉rI k.R4/=!Cp< [՝8\<91/y9efds=;>2tݻ7m|dg<wӿjM7wБ 纮-?*/ܨ}}w &;/=ݝ} eK{5N^}Uޣg{ DGUAj}@3gΰja /̟?yeM=Hc/k:RnW)ȔPN19x1FoWa"_FONg3gGjj-&9"dj⃵dx"d"BI=9$ Tsؓ2(+jȤUQ9AbJG.[zNYDYKZt(Z% GWzucD Ǐۼyw{'ٱ>#<)L!Whq2nnjn~۷-u]P)az=7FB̦yb߹t>"*l},he^yQdF6#[0_nYMdע\|霁~yҲ׬]nڹQ^\fՆbQoы.Za%ɤ݅y$ҩV/W^?w\xᑳ'Oϙמ^q˗Z0N̕oK8NoGڑ^ s**yU-r[8G%~rASL(GGXGubh4>aÐG&yV Ań|)& UؘW(t&+;::C e ™*jd2~DnxX 3d]Xף)l#J,h|Z08dHg2*?~^PAVșP|т -,.S\4gQTs@F:u 1j׵TQ y[._5.\p-Y$ۘʚk`ܨ,[K͛ Sڽtu_l ׭KE m y\D}@ݚ!b(eLo'h_yktV'nTk4zH m15nBAܣXR1a;;LayHʹ]%XEvT{[4YF|8Vm_E<>=)cX6R/r{˯9x⽿rR1ԛ&5N#72U#i/> ʏ=0&21,1a4n]=eDx ڂq &h4EC=bM588/,)ϗWךH“q2sO& hldxVcLXdJ\9NQI 9CCC7!䓣#<8sΥ9رct!W ^*E4=P*N81ֆJM?BAsTho['3>LQ҈IԋAYb?=|t#!cLfVsN10-BWB$`PL %);drV?4({h8k]Y4-DjPX!kW,hOVy4O7o^q(lKY3c'ӓ>>;qŲy AKRo뵅N-s^[ݨ5FFPq Y㉪%# Uo}@68Q:-dR"]&_+kV_(#XVy] b`ђ>W"7x>( ƤZ~X.k4ue 8ibxRҸ?76NPzϙ3G_k'LXE%;:g2N 1H2qmF5UG_mDq;i,XtG3IBu!${X!'0nJ ԅ߇%!he=b5:^4^S R9Tꑊ䐀GC2i>4Z͠neHW!4u2+2izAC$8DC ņOEz&JP#N@B+RcYjTi'Ȅ scE>șPa̗<-\AR._25 G>cZR*%ԭ5e 5h o,yPiPh qgrKCf6Rjn"phՔj~(.%:͐/sV3#e&Ys"m<<{[o0m|>kZ2w7S\…LQ}\ޖK& +?SOҙw^ueXmخ;:. 4I@08RcHԃɇóMҀX(\məPK@ͨIL{X"^[G{: Y e#kV&q\g͚mmk'<(W`$+1T|9/< 1׶dxQ b1lvԕ + #"c/YH/FtJxHN? cLh9]=Z-2PM`6Ygi}}rkr3jJ46FF[M&6Q6Q_WRLBmR=5S{crc(+Ra YϘp#P[ RTl.gTX\x4Vx18˙RWǚlJl7%LNˉt}߭ѓX2w`'b,o%4fZm(g@(|j:8uф:,kM/^$,M*STꞬ$٥K+A^{M'(xR6)(9E!TRczM+F *(WoeM[IaA2IP/@7V釲:_T/8)UIBrڐAPIehU D!B/%цTo,ŕ~ ) @E7BǤJUJt)")8maÚ-| M76گzB'ʛtb%MuqIuPmJTAʪE0OVҵMdqjؖU+ sf],Xew"L6My0/!,ѭ=}zȉF,dc򱿙.%vVrZj# 歭ˑH 8D!J'*7Jw"jfJ0#=:1b!byصd:8ƊByUõVHȗ"yK$l$Ź! UPt={dč87DVO-ϛE0&N`,RPCxJÉ[C"HU yRYx!,Z"B,R` A})V`ukVFP%'H5@*"΁~p Ś7EGSΝ;#VPTp۬ CqArEGo*H5nb6<[xm#twv Nm<}:j1VMZ8Fl+FJ|Y1@Țlib&Iû%q,[B`fڴ @Oy : pV^osR9˜,A ĭoT@Q ZRi(|-P:Y $ f[|F1-*ofE(P'FdDvК:;0hzN(K~6NNN5rC%!/shʥ椀QYgp 1Fml[ϗ{SS Wٿ6^CpJ3=dm&@s H;5B)88FLLܳQS}+OqA7)֔xa5 ڃA-uJ ,;[Y>Z@ /ie5\Io2#EUs-R  AU: Xl%u=脓<豳cNcWm7\vŋkE~ds_T5>FIDAT 6{\=MèC1z¹%u+k K}NfQdWx d.5P͊6+kpԣ%B7ͤghh7P 2ROB> rR]y4TN`scPhI`,gtg)ABk. _Yb"fEmDu&d3cWkwBN,LQgVM7 cszjO7[Dc 6u]3S-1$<`j;u:8]pH-R"B|C]#-V]gL u?%\u*l@ܘ: fNψ].9bM7CC.&n6(|"8wќ ՊKv."4A_cy1r ,2t"hHǻ=>=N/}emKcߋtŵtp?g͂<ʶyMamZ@-Bn45"p -'+S0AXv()R ]Bh[ym'0븮GkMAczRd ԡ|l>vv̶Y&ɱdgGwߜ,k~v8n3V}O7w]*Mϐ1%;R* 85=$BjD @-2 h@ RX:MAxՋ7!B7BKF:? LfQW,(uP\GPeD!)!qg.F8eؠP!ށޚ0u`FnW?2u KSN6"i`irY;DϜJ%5_y)q[o5K;m(D9@|UTuEYP='(Uû\]Sp da&Jn ts8qԢ 6;&50d-]5 ;IO PR%̴lMGm2i4)h R D)M YYK4K<Ehy9j?#KԤSiZ5Tn?1Y7V~'ׯ߽?qx$Ս)B_BͨbᚮёBsk0PUh@ #l΄ z0A!RwcC)BO4aBN&*e[tPI(]a!BSt5!Ҩ f؅Bm@]8k!ѝ(7+3kO8fݘЩPM CSa"$nD0e X,};ّncFH~2fg?&4y).ڪR kFab5P70mcUCǡ.:Y87hwxn7h5<1K*,yz5=7[j !OjFe݊+h<T@wV(V(z1q"L-Z>*P1zm 6\-*H̐؁-aJNz ݃~4jq"aJQϖ.^*N?AXHmbҕVV!o.KQ> U_HvuLgH~ 5VS6M-J TZehU|CƐBpVVg5Nqc.Z bzV/vuZǤ.C GVTM &Ҕ[!aLh6aA0*ؠA( GnP)e N{V4/{aۑm7Lg&%tY|IENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/device_manager_install_dgfx_2.png000066400000000000000000004621571443134507600272440ustar00rootroot00000000000000PNG  IHDRJ5_AsRGBgAMA a pHYsodIDATx^dGu7vvf6ծVYB DN L'-Vm@i T.$SAaa C4m6LSr0?,KVJ(-  sfxj R&iUdV)9Q!"Ba )(B *h2EU_3>NE=FISWF*+ƊCf$}]XC|U4iHjAMv T(iթj&D)8s VL92 j}UzuL{Q&zn6ᜁY8"^5A.v5`>꒺g U/ȭ}֧sz?y֩{U;(sSW;FD&DeYh&YC8Fm!LĝUy8a+URJ8+[ @/K]H)šɁD#TN$j]N՘F2K_ Bf5+qWrrɇRZFE1[ͨzz+a6Շ;\>UǬ<}Eڵ'SJB!4ʤdt@u3^^H6ի:!VlsB1E3u8ګò7+ϏR({]nV1L%t Ұ(PDdIF-B$ҲJPUotC7h0S+=e{K)ħRyQED3QVBNv߬6x(5 m%4]p.wJihG:GgSd Nu<lmNYGh-jL`%ʪ R$5YϪ-wfΔ󹅪|;X - u{mkߍʦf tvg?範 pRaX\.kY6|e-[q556,]ڗN%i6 }N |(7JI".(ׄ*ʦpМ:OGD68sT|S:&cV˒ 4il{K,c8VX/AҢM^ׄZ# so؄\DC^?]N13ES\< ۷=zȑÇ2ziDks˲}M 4hv+rʃ3a4O9(>mɷ9<>Sl-ZZdSS?C]~Fyv&g"*{5<Q DS4PCW\*i6ޑLSQ鯋sTVՑ>+8޸ۍDm֮NhڞDu3g鳷SQh0gPy\`u!s?{+K\툦?{]OKY).e\I ΆmC24'''q]DwQoGGSy™\vuQgu,v]/>998έ޺qw]˗/ollDQrQ7rCڑWM }|,]ngI'7umH)~\y6u[ypNhc.!s}_oG4o@|SRo*u\J:y*̭ڳg纺R>/±Z<~դ<1ỵFUЗR }9dVɓ%KOկ~e/{I6y|{Ꞡh jkyɍ{^|y" BNȏcB!^URBoNֿK]eA~p;̩%s6ԪM@yNtRrĴ3c{%sfO뵪N1 EA䈬?\t)1.LR)uܥtH xw\I7yޚի׬reoꚆi;0aqwt~C9Փ3Z URzQ;g(#)kCi9TBsDTP3jQ'4~Oy&H$4DրB*;D),GU`At1өf`D-3י@_jRj2TD?CQqV|D6u#j/tMn{(VGoTSPiT??}ߒō r2RDH7:GC}'WTD;Yi:yss% \U&q*uVũelǪ劧CR>j:E>>ZOzeU ʵT'3Oga6AQ}/}K믿~ٲe/ޱc͛ pR)V*>峎T3ގ9OvV3 SF#4D5!2Q j`"ѧj]fA;%\@ 9Qo.~N\9_wud2%K^566vm`bx{o2c_|ǭ`fkkːǁzrFZ9(6 f)yh>*ϜQ]Xc3\fxb6:U9 |8^!3ՕqF8uVu`vU_Y,3G]Ívjkk- tg>|xbbbT '=)M#zkMsӦMLIfʊ]@syYN㨔~ƀԈj7Q"*{'HfY 7L \w< &!=SEϰjߦ:GgL,ẹ~l3i6}~ pbrM \ % \]DP8 #s.y8Wx|6yc ΝنmYLqlB7&L­?0; cwAz71:ld:/xa%)qEǩT ;/qF $$NׄHloTO>t6 W>#S!-#w' 7g!Qo- x'sc5✚zeMCT ] B޵x"A嫟,2P.v;g$[nGū)`Ik9ubO9us 5|׳;F]F5&9:Sf~ikUpЉ`Z֫m+ e'M4縐! .R"tgfqV?6l KGrkf96A}Ψd.dzy5{.kc*x6Tc}-)0>{3pfblU+39٩I<2U;B)?÷^Ǐ8w)rֈxprQQɬ9mP9:[9yΨN>u,8{3WX1pX_ߒK/T-tӲ@ThU_0ā0 ]wu[lٵkШn:@Q3ͣNWr<yh=E| 7Qٳo>B6qybhV_uĥ 4"^|EM7 {{y oޞcvxvKCZ CI2?mByH)ٰ fprqʢ~99*pX48HA%g"4Y,a:f_k-{<440vrb3BcM-a7MYzڵ!*TgSJ3;%'~5D2jsuw.i3 yĞ ܼy&9Hׂz D%4iZ1&GN R%(% !w| d[nsũT`0 {䉶6tɴO gEEڑ\:/tƩ~G4{rn gQ }k9jA({ZYx&?Ƕ*tC^*rLe+Pŕ[30 QYyj69Xj j 3U+r̀SfaLIuAԕ*4'eաYMCܪܣftՙicVZS_:VcmV3JeĎ;Vٛڵk;ړDcc+2TBuGيѿt)hp*ٺmsX ,'ҾC#[nKe$d(?JCќ\, EyotIUj\k@κ4k8#‰UfKDgXQQ=}KsY֥׭9"ܩZV_P.e:B:hI<|מf臢NTz/.H25i KQ=E?0 ڗx?`!,n#33hMZ99[V9q0wJH?8G]DDպq6c8,먝ZxvZb0|BZ f"e8Uð\' ЏٖYƋ.dٚz~Ӡڈy\@4]g * +!%pS,,БD$TfrC߿tlTUM 4i }P ]7aN"Md2>_g^7ownnwqqŮHE8ȓ&hbz+"I!Ԗ|()c̶(P)XE$EyU7x*91+e0-Nݤ,4qo6 ?;x#<#߷ddP(O4iZ$+mtp?u=ox1Ҹp\󼆆qpcEZ*zTEYxb@<Ԫx8W!j&w Qn ֟Zp` D²lL&_+9pxScEkMI3Pn7l.]OyϿE^z zjS閆ã]kVihlHx p={viG{ӟ;NKK zD1ntכwO~!_v`+;@Ć*dzD<dCҗя~_`A[[/ ?ϑIT*Et!',͢RP7ϓ?TϩF 12I˿ˣGP]sկ~OOƠ:QwR@wYx"ph?8|lٲ%N777[lP;Deʴ_{>OG}4Ltw tC:-\>ryu^ ?mT2$T6eRCN_lGBdG .@K$?OѳVLeL T"1P!Ed٢l:,+=E4UuVd' }5VQdVB_#UX3V:A>Ϲ g5djMCT|I%j_pI+`ҘX|zÈi&!01\zK0[x3騩z5\y׮[۷O@aPer~ bgF3M V`tC0c\|#Ð}i v1<<_|[N\p'6n܈ dTo%4hp),^Oݺu4Ji!]/Ljp3\! o}=׾[on?ޅ( m$S Al>%-%ᱟׅ92" qI}Z;xGWDx"E\>>ESP9rS(M>%=pI&l9AC41/d0!8.kALl@34<rY 1#aWfŦsĽ"^Po>2r0l<ܶm@0dR IQ80yb{>tyPSț>׽nʕcLCp'\Ffl||wx" dF\>̱qKMAH["֑]E>/jG\4S\mʣ>*喅Ԃ^7sݻ/b,&&Ǡ9@C% CP;H4y\Q b4Qqdahh''pn+{nf)ٳg O?4;'xI&6&nĸFk5/⵺:n=!M3y=kVijj&8SV71l䯺9zti_Ýq[|衿7i|WcPo~_ M 6`/_cǎ~ŶM6a"W^;!z{ꩧ"c,"dkK+oG?:?3FG?}{wtt(_-xY.Q;/\-B/Qꯚ0_~s{WgE/|wB8/>Bc?woe[gnPkΝh9;N_pҌ>"^߿/#կB6oLu4o|__?qN{ٺmeaqa<5s_l>?66OO_]vq}/s=kniټi\hѯ~+~<%KPe7+"dR.0_Xlŋ3hY9_ " я~Re &̥t/'Bh7Fި}$.G(5;"SԚy**z8:9Wy.Q9!u󴛓>ݫa[C8:2ţ;&M0p5Ҭ[X%arӦ;qȆ@vm/^p[Ɔ 悎ʽ5 %t _g?KIg]X ֟`^vK=ӟ~;w~х"W^ycXa׽~to}Sz_}R}ttKG;Zt)GXR8w? > w^`OJ]wa&z+_J5A҈ψ>;JaNpvU ScSSk[j$.Mhp@ ѻdžg>SO?c7TD]wEg)-'VZ[%'# Ly WB1(^A>MMq?OK^yU =dh`b|!@PN 1Ôi  S.Q=1j$cE L0T((YDTJA+薑%dX}>7ITb)b~ЉKgj!tDs7yxl6+d?yrlwfb,4 $?_/xoZxܖJapI'Ϙ\96握ikk'=obb|ny0&&'\l 8XvCbя~}-&^K.E5l ˿nm>'@+V3!?PFC#cN7x?iWu\s az[nűQ+=g?Y,`:S( 0N:H$si $lQ1>J&0gz >YL5kle$?39ø'}X'Zd2KҲ lL!-XmwX|-[wظi؅_Էl͛޽cNLK.hdxd}CCT0Cȏ3aM޽r\R<JO?}1#rK֬YC/0p:m>wL$Q6`pU:Q 袋L&6LL.Qu{U *BƆD[_W^xak[+5DNfG&U+WYΝ;7oݲa8\r\{Ś;ed -^ox˖-ʃ=H/H?p;r(Ƭ\  gHx \apoߍ0==蜰GY;J?DsV2zhzΝ{^o[6o!֭[7y&4Յ}\W\֊_aaFyv 7\wul ݂ 6Do}"~1lJ .!ㅪk?3f Jw>0 Gm mZ35/#ToZiG=gϘdeӎY0|lQ{4T+fFO92Ԝ^8\0ږZ[ZdžIgqJ'n Øm;FM8Mʵ!fb()TTF{ήή΅b8hPU=%y~&+[~ϻrlĎ'38^",usK #߼`˖cgWxd,[ .h=L'v/y.oll" HS9V)v3JБuֵwFz֖V, Jڒ[KƴCE{]v)g~c ѓ@a\_p%<ާ!㊕+ߓ wtv"Һti]o! ߰hqTFcW^q^y r\u(0MvǗ.ZCY;/~KiDXqa" A#y;ɩ&{)?Rf5Ư!cz|0"snnnqcEȖ g^tEDl(L;&;/֭ I3!.a s6: 3{+^(๙iO> s`YCN[L]=Ќ;JZFA +1 *+HKS9!Lt0JՆɮSɯ:Qt35\ E[|T'|⩈fGDrIL?6-΄bd{3t/UZ-vseGRo CLQ.z!_;0@ZXBWQy75 kllSv۵"oƆ^s5#,HhA\Ro=L(n4ACJup\"MnDv%"7T Τ .p\GD+ \nB7j ͨ{d"nZWe&՗x5+`EI-NЫE ҡ"R5._5tZ>1GISWf15"z_&]S,ENX18H-_W_`pdDwf\"ذ/~18*! Ezr, C+|!bw)#>r 4JhtFrJDPJ-f̕u}VH\si}i2ez9ԁFB]̣<'Ne.22+$݀ƍD}bܿnذ1H6VIX}G4g;8Ύ&8Y,ӛNjvm\> lz/"<0\CcZ_PO7 A >#QQJnh,^Gcx8U=1giwH6L4%ȁxx\# \6,!S^\ʔ\&Sť+g݄hO}DZ1ttYtkvAjb$IҜ!&=M-: :v׬Bm͟$ѥĝ_Wn{\(D)SH{&&b*<! B)Ȏ'&L-<) %A)gXn3(wZ\<ٙ ;_z.뵵,_wa^ʅ T*).z>f١ڱ?0յE3ΎN6RCJ Ql6?,YaxAa8>zj;v.+o9A<8N@LTQJ&NbzG>-L^khHI!' -R'J[MjK ڋND UӤ92JȡrNE" rICټ@Oep@-qdQvRx`Ex=d:Ҭ@  1*}>B0҃piZ$EZP&ր'%*RweK[J垩%^-+7ZIhнlNو ͐]WC/P6(G5OnTB@)M"v$#ť%SRZHJҐNk@rpr A"9CM0BHIS'%$|6յNzǣEdrCӌ>U \@ TqYM  ћug]֙5b6P`M8:8gPgE!3ݛ^V3O?mAx֡XvZTR " ,sPEATz8(J+4gJizei3T.UmAF@,}TSs/CKX);)ᒊy IcuDQVT}r&} *'G%I.&+wJT*E?pAV Mtu-H"&'#M~LBL'슴HJlp|>"JҺa!9i3841LxZ_h a&w>DrҔFAZ[9c]f"*>;m%}qvTXVX &%bPa`j +" 8;  lJ}ͽ.C27"=eal'Z8 9Z=,Җw0$)I(!!%$t]0\+3 "*>pAG@:ugv&&i[*jIiRI 9NE u[vѦ3h ^YYo`A5">+8yIg.l]V-qs;>˚ %jgx06fH\c:9ׅ:8`ԪOѬB@a8ˈ 7]TsI8Nlni_%wŗC -s9|3YdrLD]s\#bcQt"* ez 988W/%qnlJ9Mw푑EQ325OCTl#f3@hD]l50Qo.~ֆTOET<QTDe3OET6ŷV0tCX"''SL&Nd*BP')G5ycG 8D_f * ڷan۾ 8844Kʣb.L;Kn@mé<1g?DQ3OET6Q j`*3Ck2L3kǎ_~<w ֯UQ^d_7fՊ!<3hܭZu9Ί6fCsٹgTqSQUJ!`*$45 灁~DٲL[+wykkK2$[~%o6HWp=%4zWA?2yQvԹW͕ r-VopVQU;>{FW rĩNawN1bY[Ps&.Ζ7 [u^-% u(Aj8Ncs)Ufyy)X*z͜@N1|L#i`bEVr6,JO<ё)G9rjY]('ICҥbh 5y/N.Lc/&gɫ5aQá!79g *Jx&&@DghBT *4MR3G$Mm:IyAM;ʚVWSZ/3!Fidg?Z3y4^q P IhsC@ǴC#UfD!6um&B8po#k 羽T-5 ji@)  {b!,uJ3Ӕ9i_y|!@!MN).FKzTDex@JDghBT *@SՈ"6Duf *l Bynh2ƹ6ԫ荢!OrKPQN]̡Je~UT-:eMtrTv6gɫu܄jҩ9WI?Qo.fS2#aP(Zԧ+yիe=jF8U#b26c\g3%9L;]':d!LyfL#%1)E#hEyY)_QAHA >J6hD#BM9%9\E#(RaCаPYa 9$/(PR*]6F̧!l -"o!7c~,^$ ENPb"|Kҵҡp@_k[,A B "QTOc>DJ!rh&:R)' (( 4JkjUǑ@LLJ V@X2JN%h&(-=g4qO"PUJ(X 3a]DUSOU3P:RdZ).Sn r4@eJBƅCWAWrhba%D!VFah"8ÊUQ$$o}b^FDwm<AY=Zu()3 ̵kV67'W~ G;6) rW2g}tJ!mUP.RJ \VkJ˴W SEX.+B-ʈPwȂn>qֻ@4j˵%N^{E# jTH* %UҔEENH7"A:ѵ虐)Hϕ.mYԂ86DB+,:n)&s!VE5H7!ዓQFE1͢YTė4ƥCȊ_lb+L%.*z$FR4ȠiF jD ,U:nE$%ro$ЗH [H%")*^tO2݂dC;?`,oɔ$r4Q4 !C"UHҤ1:Tu5R)@M,T9Q+Sf&"6B4 rhgm,T SW-G3_Mz5EEB+U(RKdEj(Ydp02 eh<*M+&!䑦!C(sZ%٧=PgZJdlu81J2!@!bPs }64Y4(檘I2z^ #N2#JSbH}_XT0}e+ *<9F+G媢jFiOY^jKT 1ە",Q,g67C4ȫrc9Iu&?EqeϜrЊ (NON}"3U8Q9±c|ߏx14cf3 _ۻ0j`\iVHC/3e@=H`"d½I1aT$S嶃J+ բZ$ $ Jl s\2%2 V9*C11! FJKI$JZh/+((i]tvMF.RMf>2e (}nL"L5VdܚD?I}f'A͔?bё9JSHNXP05bn.sEVT!I4k9f1Mxd*AbK|&VC|^ RL@,2E1ʠ!pƜјD Q$$UZ٩@$u v n۔zS"vGz')D0m~ 5"I%ٽѴ*-UU[xZ]2Id&#6rf +HE2_] a(r].96F8ݽ\|EgGWKK+Q8a*rjְԌ"*+ aZBN0`Ʉ&kW(H<'2sjB5bqʦo萊gy}lj!2DJVEXRDpB'Ҫ(:%1wE6}m6E5-P%BKrRnHʓњV`-M"MJ,PE+"TR$HE<9Л'9bIBKPKŢ܄KQTܤlƲ'0C`tHle_*KLH*.F^ 53X UQ22DYA gəPFn-YE+2['w d6}J".Kq{MՠBt$?'^Q:W}.?U*z hH>&b"r1L";&  j2Y6R_qNU~600O9yӓO>o~+9/HU/!rF? )#fqf2tXY %*JMf?Rke10)ʡ:'SSe\p&qC8(Ֆ Q=+_R!FJTDV5VβpEnԻN( Iİ>]5ci\y Ԗ-.)M&j@7QQs򩃃m%!|#UyRdB7+Tl:ҜodbJDWl\Ru5g9+*#ոMd&J ݞ7DRPJO%$K#My"WTl.Es2"e¶D%%v#=2D`4 4bөEhojΤ= @DNR\W")/#R^]6ee;RS"kZeK*+ ME-2WqK=14S5,Rߔ^VVQ%Ž^s\RiķS M(Dg)":áIBVMy?Ů}GҮC٩DqiG*+ vn[+֎x B/py 6b0n G$>;svcZ>~Sm7eXo_{o.ZژNHq~kwAP㺹lv\qG9MsFմMBQ.M*ع\ލIۮ)`Ǣ ByZ۶ܸ/($o%}i:/f_n(`80BSGjpx*ztF_Pm{EyE`3g4A\=]]'`Uh'6ǿljhJ$~~÷장x쮻޽GRxu0|9Р?ırytȺt \cݢi&3D|th_=}- nhمmo|'A`4/`<\< Jkg1MsyJNc󙜱4$mS-?,(6 OWe67t|';:SLmhHcA̷,v 2̢HS_;v |ۖemBsI_ؒKQhz]̄hqy1D%V>O9iRK˄-r477LLv?}|ۃC> Mp!·ddh844+NdLa,3BX + Y,S(S.3T6ˮ };7)`݄N7|gb,G\mL@>Ö߽3p&V/ZYl/xɄxX?rl`hl\~jYXB'!dr,* a`؞::)}_~*<{nžLxE/ٜY/,1ȉSa'N  IJ`m4̓?4Ѵɤa4AMDot{s[׾^vpaqO7 Qoyۙȧ۵g|ΝO-(`/0p~DZQh{XG{&6wޑLluX>d]" yqffcyY/ݐcV>ө\..;Y6Ķ=0r-b+/:^tN'DzyDcDVA]k|>oq\"5>1jHpf ?AR$)pUAQ4fca[.xW-jcM^x\wݒmVшY.rS` Evԉ$747SBї؇q6,NDl̖9N:JMdR ⽈8z `X:*of#n %qZ>ff2tȮ?6tЧ>E]vv.v`4HZ9 z슼bgaNjoeD6"ilh)raJZGk\-\xt©dLT ~ b-^XŖ/aYvviX 6i^0I-̃4nX`KQH2=0tL'i &-\2P{y7O_dd1n Se?Rܙ(lTlAF"zӉћc`tX|躗-5Y淾YIj,:x6ÐƦ 42"5;ѐ\`erX좃V5c8LBu/4ML&3hnn3G3xkɒh9YhL:q%R VANSl4)"2^;9)}M|Z #nXNgfKsc&K A3m^ѵ\!4 8 IF*y"csBC=bg$F2h=^f7Mfld|ܭs`UPKW-0Pskz,ָ͆h$D=E:&sؕ&yvgci70Jɖ,Vʲa(fN J!RѴqCT7f'Fǽ1<.(s=Y0&ɀolNs>d,j癦)''+/;cr3D YŹ8kоm&}=ϳ4Y9rNђJ(r01}ow[^x..6eF藾 K^җ˺~qO<;ozʾL/nf v/\"4W}G.[rÿe|:Ӷԓ𭻶r ŏ; OouVf׏?|#~ӛ޸kalw&Z|K[?ɽ7 V-^ԝȡoy G' Yav͚ozM-ٸaON4+tͷY??czзcݝ0]޽u~//{ђm^h_}ǿd0kdkA>tߝ_EKZow;܁لC}b%c۷ɯn#'?/<aGS?v;K. ooEzdhk_ޅ?~CK^|}g7[^vIgoGMK/m]/zٵ;ZWW]?F&?[px /n;w]7?ΞE=?qfro_/mn`f7{!6 )|vAFEByS?&7n#455k;?Sݜ$oot&{;6lڱ`K1m⦧ǿ\l;׿GfAGwgûw誋 hnf - 7bŪ;y5篿`xt^Kzzܸ<۽dͅ^y~ms}Ouu|m׿wpߊ,|7'6эnv\ƛ/Gw=4?~-nܾse 6=w<|Ջ^y_}+צ]sϾK56c'796]tya&lwzw~>Wuwލ7lWgWsLcH{x]<%ݱxq#G6lu 7Cq%>/&+nشy[= W\~߻+}-/%Ʀ}G|zK: zװ҉֭T[ׂF77u/}Œ[v~oi v?8i:t1IGSKOW{2<6͗^vy[ ̔8D>M0}9Ͽoxݵ\=:Z. 7}ڝ;>S_r\мЉO/)J,}}KVwh7yM?gÏ}7^t[8dQwK#%;Ȋw?nYz+އ7K?pcŗw+.Z׳/u|czb_·W\u}Cx]' \zAO2en?xCW_'Y+T˂e7􆫮^eۮ[n7~k^~|eknشwƧ[{/x%-L"htϲ{>׽鉭;߸/{߻n\fE3X5uu.u5/{xu{"f`[c2];|ɱ\x^X~KϷphl˯~ۻy/8t9ml{-n|{߾f͢~?7xފ?T qGr~oEKw;ӔjljZ}z&&=7=Kv9z2{ڼq~ÿ{zھ;߰C׼T-ۻ:{S#L>^TM}*ٰy02ڷ3nN֝-D۞ o'+룏ڽg4v;dGnnEَ<1=pp_ꡑ㇏,lȱ'FǏ_r+c*0yal^'50tplb,'L ͜y;{&u c|Xl-'cO<hvX{k:GsV,_ ZZll؄陉'Æ;FƎMFB۷_tɢΞز5 5F~d,]7ޞ~`Z{e7L_ݵx{Wn{Sc_n /~Kl'184&Rοga@hL Vt]~ڞ6PGoآ/u~;؂Ў]{B睿cG VY|+-Iƙ]#x9yƛnI`|zO4DCc@}_d-J3sMOJO;qg:JaaPΔ]g g>]GF {|+hezIK#&>r-?~#`9ђL#S 1lz?w>'A nLM{&^[^~N v}>!m̦Ƅ_bwt59,/[ʃflɢ.׶'' mjnu'wI@l+ضc-7vˣ=6Wo𩏿ݯYfŊaAcApP{cG?7_Ӹf6>;q+,ʰ]@P Đvv¾%my _#|e-oLӚ|[mzF,xܘcd}NHЃ]\Eu790Q/(せ?/?O|VnlK܊}S&orΞƾ% s{w8hѲNń屾yec+|6(3x8\19^4ήLgt{o{sk'\dz}n3G}UIi0G_VUfKX#\1v1*yy1ȇ>nco o،ň{| |'eksp-~<)pQǻs~-V~?c$3:;d~}wU I L,LcyN[B8 =O>]ms-\ QT16>!c݀3rcVUZkl1VҖre6`d{ nᇯ}S-nZH [_¿g?ȟ^| Ru>yZ]aiĬ"{a8td8}e*g*a40S;"]ЇJXS1[u5"3OkHR0GFFuJ.$f Cy EvO쌼M@A /m۲urb峲+T"ز{c3,>8Xl>O556'̌OalthrȄm vn;px/r=;  91دT"u'xDܕ=&G֛p]-0tMwA߳{r,gcy]܉粅֖֦'CG aҾUv{Pyh85ҜZlƍO .jLgb|:,nⱇXfcGM+skɢWO\g=n܂t}{ Kl:+^,acxPִ| ٻ'G7eq&'JIS` #b漥CCGoniZjmM>ッ;<<6pr!qЁIw6W|$iȤ}V8q#SV-߾mAB &|h^~}{Kjx(s&Ͳ*bـmmg bŠ!Ɏ|Q7Ul9x-_e}Kzѡ *L Y7,A7 =FhvoyÛZz ,x,%-X#Ɔ签ܷ S1<~?SSN"=9$oZ6vv>t\>m=`V[k zc$ a2tbK*f'|i#v yq nc5Jql2'+.7tP>FP̳̍0ofg,ck s!_cCqP+DゎލOme|5<2-釩xCdqymܲps*:^!okLŏ;߾L&˶3p{|ܳ{#G|lr4{Tua׎}[7<6b`' ȳ[#S0-G 3T=穙Z , d5Zՙ 5wX뿉',t. 0sѓu `rD_>KyN_SO8p-[n3:Yf՚UZGG'vo߷wϮ{Ybl߶×^z<:[:t=$ bWgGsCٹyӞ]=M''G=o9m1!}{ۿo|tqIJ%,IAK.ydhWvܵcmś .9_=Sc{ܿo`@WGeKz;=Çmܿ}K.ItҞmT*i>tp==hHv>p辝{7<Ҿز ;{aҒX& F2ɖ7y} >߮G kW,u] MR-;?|/h1l= umdq#Gȁ=ilj[vήË́S#C>ॗ]Luێba~AGC3#w:p`𾾾>[l;Zz͛G UDu;1/]ܳmǁܼg׶m[9kŲe-hHذotxxbHkۂݻv9tȑ#t6]C{/\ucC._cŔw26oݙ,Zػ`AÂ{gϊ؎@a^x^*iݳ?[fy: [1&u>Ʈ]Gmok@=͍ hɢŋFrhb.ػxd=;wmܽ {ի.H;6QܾȡcGG:;zzɉs44Əg:rdl{=m-Mq`>V}{wt`M/X5e'7&5+.if7|u/-eY;ppO8ڱ~b/;i%K$;xӓOn8:^Bc_?eӶT%pLH-wiP5EZU髱u j!P/U.Ε24g/ؤۿ_Ng%8 8ķΰ7,%|.`Qafp&ӴضO:Y d/`#-4BȆ~lѢ+{ ˌuwX%ؘ ̵%mooj َfFp=-64$xKs䯍L&l6FOu/h'"lkm^uM)mcX5׷ rqvW4%2k¶dI K:{ vh /Z@fd!diw߲q'ސZ=lk[ssse{/LDokk\jI{[ax#fP.^ܚzcqXze/Z"ݽ8 eK;Z&6'vlLʃ] ::}jޅ=PFk[2dN10,u-Ӵ=-Bɋ/ZדLhoǒA ?֬YBzL \s+/_kqM rÔ8e+{-C6)$܄{_j[ӷ@Qt ?O^1nbTg{c'A<$)Znwa粥K;;[0mj/hj;t%7+ HiMXߢ.g _wA&¦֦in VYڞF\_b/_׹#4/ln{:V-ϞMBDcP2RNwwŽ蓸l֖mYк[!6O Y\67/ZJ{{ںZ]'w.lOm-֪坩d >c_q٢޶iOs ~Sc[OwgcfYs"flwWW, /^xiK__W1 Zty^Lx:e.m_wڞ]+v7:NŽ7;oY_gSM(&K.[ln76gU8oՒe=+&Dcݸ299 tbՊE]lb޶;*,p7GT¦APj`*fR u f#',”f e3ԆTDe^9Ws7G^qUmmm_^6a#@\\Z)%1v@X l%f*ds\b_L,{8(q'l? }_^aċ2DϦ wJC9F.56ٓeFNڮ'oh& l+&7| "-l!KݟBCn_]( WEvB ZMi塊/Ydr /vw`)w$MQ'(|yݲhzM4Iܳcł|;t|8X[,l mN+xy/H|++ +켼3aϹSv:<5y%*%W6,F,jW`0 4=&`|ˣ̅x75{`&CS޺yk˄؞WLF _&vŞ7@n"q}7Ŋ^iK74Wtb,\%Pφɱ KޞAbf8~+'c>X~6yuvJ? dgĐ.YxnôYڒ~ʧgc%);xh/FS(lt &sYEɳ+١Ls:.(L8 ]+!sE-]a|Go1d[/N?zt ՗7f|봖´ gs+yp +!72YFP.prr޴iS6mldW+&F|>` `|b3ܙsZpq=EG#yyU;WީWtYvڲjxY;^A/xq 031c=k*O@KX6r{b* y&WV,r9Lj bUH\k<][_rP=≙,_#d X6%4_U 9 v!/GP`7cn6RkUbB=w"[be@&j_)p,RT G>϶Y:v::®ēŵj[O<+KP64`|BjmϮ!! hDv3daІ8~#380p$IPÉq|ā隸h_f0b.Lޚ]H$[h*{(${cMT]kC&$N.N>te0Б)-9Wy, Y#I"R1,~%vi {(>{v,L19>vt-wJL&//. #V %L@ 9![MK zVZe}ğbJj{cyP!GBt[RV $+C΢ɲ8`  |Mev X $&;1n" x2n2j{GtJDrSdf IYujoI%//6aB3 @wH 8}C%5'䭕sLZy(U ,y&Aw Ɔd2՝g1^W#Pb1%U F1+ZLByW}/~Ecwc\>IE͎Yz , I86AHD&l%-1})C< bcx|[;b/xy0H0\"Q>E ^cfWR1=U!<(A5]''\fd_B2 Dg|ѯZc,i_fj;28]A6mH6!y"A u9v$qZQi2B^~k?+s-8D) '&Lԭ|0, ܛC-ʽ&/6-j_^;BF2]٣dT#n⭈%NYDj(MB&rh%" *PĶJDKRҢ)GQf(ZD%,Ԑm5+>8I$zm% e 0Ǭ5< Wr;V-IېJ`\I2wHIː(gJwJZXc[KٳӤ7O<&&2֝Ԥ'vFz@:,<ԥ5X%bDTT ;J"*HQlԾK0lŇKyZe21yKP{"Z׍E",!a$"'E'N %>GlE_U͐ښFY#GvHf\oղnuV~rضi[0>16вhђn (<}v6RtQUjE,rUE;sNИM=N横&;/,?]%' ,.+B%'5%S,ں\R̡-O퀐 {*e\D~3:E(yM)wM'"Ct!=&AiQU10 U,PQRn#-1_Fvz!Ȉ*QSׇ*;vy/?ʧk1R-u]Gh*.0Q =2KAP(bFͼjL)Y*#Glr!2%92^`J %"?$Ѣ:TT-2}@Ȑg,e‰d\CGhΓ|GWiSf㮅)Cᩨ%*Z+G5N@[// $WhեF\F "hDF.L62:,&W.?HK*rIZf(U-anX!S\|z${5iu<7.Xku@qSa8ׅ:Ũ ,[QP=Q,iӦ\.РO:f:nlljiiM|_~ "U1(Q98$/*Y;EY3bu!g u ͂V3Ō5jTue¤ڟ~eE>@1Š?1gɐ,*I&BkC 䊃z XEH+moe.XA$D) _]DēICQ  ɶ?P=ꤺ2N$0Hܛi|5 E'/M|DZzQdR]0iD\***TQN͒H(@/JR Gf@R)(!c!(-a$2аUY1$jNJ+в U%DMW0J"*DzHB/FG%(QE Vd˧4b"AlW^4j:$hVGujKs-YLM=HH$KDT!HL *br rUJb9G|8'* iGKQI&D։:iYq@@@撾DTy A gk:V5;UKhnF*T)TV:R֬t)4Z)AL"S2nd(2b1JM%p"%@$lP0wBbԅze[Mp$ވNDo|ݧ)f9se@~ui@zC`JO!+\^) ckj#jr.gJf~Rhy9j#\*G%t" aYeruEmEވ1 EU4F)Q>dR'"KU[YƟd`lŠAE"t[>WLɥ-2BV#Bb)c;ڀB6'H%9N ȪQV yWdfTAvTx)y UZzOGTN!ĐhIDYŸ܊ +gє_ѐ-,ߒVD4ɪ#JsRZReީAQ8o*!e9_\LU%)C2uQ֩fd$)*WUJnWhC8+1wICP (TiS5م+rFd\I=#@Đ!|!Z!-,RBN"zP%SЂ:EsWpzoLi+|&^O&bV(yXPaǭfZU=emPKfVNˢ"_m$e Jv0|Ι Lsд 4eL_NIǔʆ9Cʐf=):Ut5]TlI?PA4H. .huAY^Bbqx|m\n]RWY:o]_dTFIͱjQ" hE,J zd.5Lt&Q)<$yJ0H$3Ĭ HUT C!="<"@SKMz$ E PԑR4$-YZDwTY*JϥT- dP75[RR^JKQBjRI"&-@C/D'"(AfHE4C(ZsREG 0PCj "I߱ YINl9Y §tu+H+:q``'9f@na6 ±܄Z[ }aS BZӐ%Oi7R,ЄjbCbʕXQZ(6h!QbFGU qB,mp,rV&^CQNpUɦ@b0:@ _US'0MI[Yu\:TR.틑.2{eU9S[LjtC7jڤ]_9QnCK˪jv4LJDr zJˉP*RW8hV|E*)! U*@UQPtt$3d],LQ%0QPN+B8"C,みqԽ24 L-.c] Fg+B)LHYLH:bHWKgm4F{T^ngB.:!4S!T+Kf^0 =tPPSa͎ݮ*,J,=''W߼}sqatIgzŲEZ˗ߙ yŢb!/j^ojŜv#Ԥqu-G\*Rpj"Z6 ٘UY|MueYP̧gtv?w:8WKVPMɒ/ӫ¾4JY}nHkU9T923}wf/zӇٳ-ZDnH ҐpVSRPi8-1HH(ES62j!:i77+ε-Q})N^uu1mmNQsׅ:d{sY[z^e6/^ҽ&j zQy͜!q~= 4ShI#*CʞS8)ՕG%;3yp:ҩʪ^ &c mF$h÷W(KLJ7~{o<ےZ(tLʞ[dt`Sr08LMTDe3OETV bL? Ԛ͍a[^VS2z򹛾mC}W*Ar$<+Wz9 <rCXSIHĒWmTAsӦ2[ ZD:l b1,eLGDb*!*rs]ܖFL~Z:TvfێybaX>Aרh֥sB@Cqz $M*m!(\ALuDZ#^S!MΞiVmK}։ӆU]׆\.Gbt%7kIgDGlq,]ZiEgR"I@Z-r*OǚK]];naQ~Nk։2c$D_!"WYƅL},u "VUթ Zuz2sIiHN,ZW(3UtiP2NHyrrLO&* 4U &/b/{@$ΰղ&`r2' 9u}d6JН& W|j%*E$ 6aA-7b*X/7god/'2l3XZk9|PJM=HPJ"gD C]KI60up d ;G'tNUe@=0Qq%fՙp:*;n;??:hk/^HDFF'PUΛ]4$j g\``X!jopHOe٨e, .C3[%LepfnuZ`L4̑mDftd93ŷaY81hDTBCE"WGH D;S3 )kvi=-s&SaeQWGiI,xb(EEh@5hlJ5KH +x'6 AT5Hφ麈͙&m%]M'D8 ՙrN[K.[lqO HrPjEhP˚PT*TmJ&mkN7QLBk bY:$?{_ q=0̰x :dYev;fǐwI'94Hf$;%Y'ݝhUΞv%trޞW^UW#8I!S OjSSS=U%v σG\,Kt@d:ް^;Dȇk >nj<9x%JI:}\. tR!} 0xuPLA*`I.y.5 y^* й,4 d@>h,GD$oK8'hi4`oe!2iC `{]0a`v; s!. ؞» Mc+"tfaXi.$)? IVAuU490Bwk ; 8IYQE($c<=A*:]vHEN",YyEաT2Hb;q)Y$皷jʊJ@-X|͊%PeL|GZ;/yI^؛X4}yX,^X{y BmbbϔC+X }AN'0F'b`.nE`6 XEf'KS)Kv(AzEYLC,2PED-h8uI1xD\.lsĐ"V 8 ) Ɠe %355 'φB + *L4; łS[ "ebaAxyn*:dwq17.=#, <Eެ2|zKm <'2 %ц)'s>ɧvmO/))n+1T1~!pBE1PF` nUSh~dNM%sf/QBQð|_\[[ #G3O.+CL_\'0NxX18IBt!eP7X|]<4:= j{CC7006xqLjcǎ뗿rw_`<8g0=5_ 34 b9o|TD_` WI@^ibq TO.dNGOwEL"䄜 vb m T fFn6;L/LJ4Cw_b!?&&;SlKR)tc bD޵D۷o߽{E %,MX,s{<(/[$jW{x+UTT`aկFc1'EbO c>`ZH4塡Ah2xJM$՘Y2}VAf8 V'} )"1IPiz6}>00>:CiL (|~_ˎX,Ag!lVEU&T2y  6(^:tzlo_پk'+8"DlGc)G/tl5 v$Mf">*GmH0iȶ3|Qaae(A3(`A:Meq|d?޶;GըhuXtzy]=ɾkѐv fr"!&5 (l@bK2֏hUZ]O:VB cMR5 +]AWP9aiaЏf63ɔ"gIT1#t{yFDiK4!E-9x篸UUUWT@vGڇa ֒)C2NgRbļ̢zYT2V64 Px*fwKVU%/ǜ};J1%bUI_ gza:,& ]-ʺI`}i3d T]mēx"VYQյo|V*ЌAD&"H&5&ɔDͣ ސQГ404] !Yrw8t`t|4J6vXmV Ux kE<'XX@2.@?HLLSqjx_+7]CJIee% NÖPk .RHƜV$gΝ;*VQVp' xzRwюX"w43#֣O ̝H']jU>vy晚ں/}+W_{=2q3ZIB-F1B4Xx* 4 # ̽!-ads*G X2#5z #2|S5C[nT7 j/f2*){>l;@,m.1^xm6;iR}&?T+)qE/PY OIeJVv?>u-ÓSQi5ɢ Aa3H T((KF5Z$Hx L* }DN<n_6/655\ { g'&;ɀdÇP(|ypxdhlm;=nJR# :}N%G::ay]Xr#xftw`pxt@w[dtġ DcmSS1̦T*#AZ-cc#gϝi-x|dlttjsjbBE" )%%Zɬw;~ipZ#]]cq,,EWF{zzuMسw{.NFb)"dd4nÃ}]V٢jjo]Ӳ{GGUZ`[xk[sP,؜tl`h`8,<>41?PBdkInm`98kW.Xfyjb}`bh;94^S] {;%z!TRY\Q@KNNG;D$jC#3bAPe鉉XdR ݽCCxBBX,g:]JHƓCCgQيK=|55Lb ΊhJIxlȱC-$-Dd|:O%'ј iˈ}"OOOvtLGV<" ZFؤh|m4:ܽ+ j&}j7>VqD.Fh곺00ԾޮvFIt Ö6d7#C}m]Dfi)m`d?1IӲ]N+I]]ɄЁG''= [ZrT5&tL.*Mg[GFF'v[:LcI2Hb^g[gwĸ,}=ЏD c#-]C=vQOA+2jA:&̢hj3 OMryP؞ٲ2䁍<5֒jmS8{H4 ]N7]Agx-I7VataUA,D' +L(ήD*MgEMdREz+I,z:{GdB̂LOtwuD"Q oC~||4X-@oO__[lBV]Mf=}iX g2t]=lh\}HZȃ="acaiHd U5|hD+*C V=|,XVwfCIdGӅDXWwZ'c1ex":97e8I- WD eU=-xu}N \8iyE80vVmmJ:nV'x{H,,c C3M'|艀啄}G{n>18~}N6NL =i=;wcc6ʷssn۱tvvv}ݻvy="~hӯ~ygө>}{m߱':vv:|zn˖=4w7}S=qh>,<2cj7oͦ#=c1 `2/<ǟܲsZʂ{x侇ػwfٺCG5w-2=bUڵ#'d瞻ܿkԞ>{׿9z,.j;8844TQ^tڱ^=zo3=ij֯]oNƾoh:Owpdr8POMkg +}>LO}?zܱcÏ>ǰp =]m{aO ylv>r`O{sFz]CȓO?u<`Z3U;>r &%:9Oxa٦#X:wfmh2({+` m󧛎î<}b4@mZfIĢUto/vFN:ygΞn/--w~=;-C}'ML ټudxkׯmklo,Ojz:.DwJLMy߽O=e%!?ߎ9tPϳc6HcC.uɓ'~۞{ꙑSgڮJ5=t=?얭}}=N$u}.2dL&λ\k[Eiy=x֝;y{vO~SO4];zN=O4 a9;~g?r\A3:z~}ϿtLl>{C{߶6߽GrBEs-w~3[?|XӣCG<~gu&;z<&JJ;:zfXYEcMXV4 0߱իs}Ͼ719~|N؉;a~];^8=8M[nâEY:GGǢ{Μ&,))Ũ4eﹻtAۻo裏}{ө&>2HXd(ؾ݊I 馮g~l/-.8txox;p`AA>k8'[nikmI&=Ï
Ò?|U]go|u8YTYWKiζ|oҸbŪ5k;[]wxJ2-CW<\V\r;vSZSB䑓jB?r/TPqx=?7tTu_:,xJW>{?/(K;&RX:S__o6U7U6 {[2z5t|}DMEG/tR{[~UWZH9Mn?rXcx?m*W^whn,/onmƴeK\цFjKk+݁`]C6Ԇ=?|";k\UVYJ+nĒoǟ 9ie{ɧj֮Z&. 鬗Y(-ڻ`QAQ]M{4BN3PQ>f~Kߴ/>TrY(?֡#:;:w}޵@muuA߹a͊5nw*20A|9K=~$ }VO}?5af(,f*}?~ ̳ϥn7\*zZUҧꚸvѱpQᾃ7]+*I,VoJ9qV3m.iXnݵWnjo{?Ʒn\6ŤiGFǮzֵ7-ov٭&]TٿoXGZz?~cX,8I]v?sl"::ڎ9~Ə|lV{Aȑ ΞƢW4;zdxhpͺeU0~kQ0XXۻzi"``[6c^ؼ 'thiS3*E:rSڸ0|5fȕEM0gTY]ŗ%P5` Mn~l=wdxhbjRM3 ]QMfUK%R3TFҨU؟& 61lǧ>ɧFG9382zj~&cɖc'O#CBw[Tc̀c^ě/]F_ZdxݺEh4|\Ӊ}Up4\U]iӦ"_/XǎKÉA,8\p8'&Gݱ inn~'lӭD, BwxM, Xd ?-KJKN2OMM๳g''& cVVV*3R Jm{':p#86lp9EE^Wt,P ̜NV{7XYYU^^VTTV`Lħ/ OSpJK zkйsgZθ? 4]>Ak!HTYr\n)z*٬锪g2$cz\SOwuuԡSFݎx<իVA*F=G%eL>ͤB jyӍ7ieeEE?45Dn@(TJM&j^?ժF0z&&kjk#HwWpٶmǣqt\<9mY*˫e 4cf= T: SZMM=k Irikkve"OO9}ntt%zH:YCHٳ-E!]L$<ԓO?tx:rqSj V%IV6]awu*+ +,-) } d'Dáb)*Jw,YZ:D~t.mMAlgQőÇ%Y,-- |(Ӊ0F|MojokF#Dbrz]S@qrj:8vjU)OYBy"=M 4ZmK3eeqz0< 5L08VZ3* m[zMrFߡK}{|֭t]TDGGGgg',qtɓMmm-p4-v{4G|ÇzG]A 4Ktg$ʑ>ZY_e2̢;Qbc9YEA28DpthEŨIS?5 &Cby }f]7fz 3*ܶ :;!Iagllѩ"jEoa]v]\R׬oZn\艧zX0k-|ޅE_qaCK۹MhFFJ +<.9A1d~%lmo~2z5]Na$Ga3*4SO=_W ݊)M3n*餋GY6ȞDGljLAJ`n'NL-g}Gip}CeJdo_OY;vTV569UӀw+pSEڟ6C(2~tpƫ./\ 6l%qѱaz7nAQzۻ۲m /86ǛhHRVիWoohu8vJOɒg?L34m쇪1󙊼 B,(ݷeK&uvf^]}Wfɪ&bDn*6DtƵXWQ"8J~c%<656Zj,YeAz?}gB{щ ީ檊2qc'N?z:~llswv& ֣us{m]'N5NMn\NOFJk.wGd2V^S8sĩ=ya`5^_]VRTx\ˡ#GO8gNiLZ{p3gO :;{,b"<|` ^EvZlko:}MYƠnsٜNٻoGg|ʚ@+kATOPy=nʊrq豦0W_STPݹwϞ3--+5+>y̡#:pݻjƂb iž὇;rpts{k.+.xP9'`79r*šk+KĮݻNnl>|5צ`W*ZtC\j¶ u^TSG{W[[G2*S43t#'Nhj:J4XL^wƚɩXÊa8rTgOwwOMUYyIh kIgN5̚cX<}G ktƀx'Μm6k沢ҳgO=q:ձy6y{^8z`G{u:W{]Zs gGΞ|^OoC 8΁~h¢pp {N֕/nn8|dʆf/)Y+90+v;2>SQ[5>>N*JKKKϴ=#X9r;6(*sO@_ZQ|ܹc't X nukVpżuښRX;YU]i׮vp9Y סEG9zpָ,wURb]qaR^U ù‚pUiaiqqUm:=.,Θ%׵iӆS}!/@oUÛ̈H$zJJʰEK^ +]6{ye%&/۴~㚵 GY =k\.weyeqa)FcAa(TXX+kҲRZ\\$;gmc5\[ruQaaa ԕW vEuuuMu.-6?׬n =Ngպ.+sbx؝ WVeN`-+-tجȺjڍW^bՊpmwN(./x5kVbf&K PXQ[on.zz;]pjuB!V*ʪ+K.' P̺҃u]6 Cm`Y=snsz=>,0.%%EeUe)>]}jN+ rWTPX^2`]a]YY 1KCTV`J Wq8 L$nrJa B![Vce'(*,{ppBu5EE55DS0Sp Ng϶BA @(Z7]yŚիoyE9c(./M7nz=v僌Ub@]Ҳ2lkQQu_Јr0 ͆Є~r…\e W]V{nTNQn怩y3:Uko|tn+3Ffg5:yKx0K%8bӺjDObp[&ܶ3e+Sr]蒤 BBˤ3~ƴJ72zJ(^͝zG{J7)|eEN"fRqQWEQʘo"2`*.(,stYh*-aTXG.hagR`f]Vْ:=eV]qQ,gj 3JJr:c)&QJQ0ܣUd bKkۊ f4҂ t34|2LpOQI 4t !lJȲŒVU.I)j-UN()lRIGMɘF - T$}IOKVtA2v*V6[f]u8,_ $6G"ڬx氃dJwcʘed)&IKX`D3t$!A$,4URH0c!IQ%d '\t~ p.!"fPϭYL' ɚ!dIjA& ISt2I n% + D4tKK?QW[s۰ZAs1l<@1N0RtEF, Kv()H&DKNtłmpD0ae5LE6, ic6 M9Y6+IMrMOT SI pgbJzTtMiev (R Q01N(nd-"hF0]$cxHF^/`̂_xҌ!`.&բVhYHd}z })pl!-f0&;i<:˫Z\l!2-dPZ,YUz۪h&0r@&cL_dQet = aAZϛ4#U$M'b65S P3& -aM (,:E %M %pAғ]TO7Mo^߸ ^t w"jFL,[5MCj0ٵ(0+)Pt"@6 b!b S7!,co#5 va fdp"tNÓo@ifdpcㅁ!ԻSԸSO9q Q8QqLc=1IPbt>{lΨ)E$ JQB ($@XGz&%S tlŤ0t[3_f!Sڙscèz>[ _Б0^0*HT=Nbº&03)kPbP9:va`*D:ÆZ/ƨ TpdxqQ FHb a}M))/V@-BEc 4*F'HV ,,#DD4R Pnt"_: w8UfVtT.%}Q$( {TI fY3iUԋ0jI@%H,8l$͂Cd£T#UC$=+O!`DJ"D"*)Lgz= ꃝO1 p[+'@OBDHX'b<#!HtL:Չ4~,/ߢ۵ِ`I+`Z`hh6/=.CX(J 3awNOMi",70ujbS*(DR ia!C {xqBh[LJ {jN+6[ISiJOC,&L L=`x>84C^d#aid]Ct6=b*&`9c\8h:uS:&]XAY⏴?zAX}4Q X*b=MRQ2@ =Ge1@4u644t=׾VVZ 7 ]T+R&+dI;0".Y lcaR⍢$ x{#XĆɋxlLϰ1͒A2#ݳC3 Sd7b|KX5aQxv"vD*5,y<?xLL9 X)c,`G)"!3JJmJօ=%7֕VФQ #Z %0ycvu V\Lh7g`P.m0c9*sҊNwb\`!*SV,[a:RXxp4 NlTJf.18CL.U;)Z ?{c- Ia=f ["ag$9RN:D Oou@aà@f2]Âc"A <{Wl!"ǨC ++rfW$=)q D4l[=M\.tU6yXҬŒŰTF Y2TGYE",b ~eV-(,YeȐ `QMOBRAQR qN$Eq" XPFSnRJ7咮p0?z| 1HˑOUUYPVd%.0!Vj)FP$"7JG TYex)P(wۢ&zCtЭ xM 3 Īz]X t/-^rtvޡyì5(j,lO$Bn0D !A'A3"0X x`q`i0PnE)t`)|l nQ$6 T95*~x:>6"*tATYXbYY򪊆.Yv"u FeۈxŞffUaj/IEyf^3dO''ѧg* krk?(j5[`͆1 b.c AepV颗jJ t& Z<'( UۑQѧU)@gT:V J+DP%J:ֆ-[BHuL.tjH$g4,i%E4${' \6D$'&3DEA4EA$o <;T4$1*rpHLAҤhbHHʥ*`b,D!L{5k`Y~ o ~T,(r:X`۠RSA0\t#d) eƅ@ѐ =PXH¬)z5,X9D4FXIъDD(hD) vff\T*f!"F~<G_j"/k5F±jCI9q5LIpX;@8m5Z߱45F#9alHٻ3`ǣ({~_.fcݫj)^3rt/<IU(I|,V |&?^ąH#DOS txkQpNYDD\AR$*2Av*ejaÀ l0J0r2%tHRBv>s{RN?_D98\BQDZ!"&SdTtz|k׆!ŖN5Ci~&[+~,/ Z-u ,HK+ە0y;aeD*a>Jw1@SQ3i] @#,HGtkSRfJ# S"'cPeYlU)c$`s ꀛ'#cɄBo u <,]kEi&ٝVe1ٱ`㦚LDad+Zd"ǡ2``bQ 6VȆ5c2 I[aNH@U& 2Bop;$F TUJM!' ]t:2=ha#4s:4l޶J&)$ "4b @AdFѨx<06oX#k}a/F60!Ҍ*>bQ# 7.!+*bFSC#/NIoBx] -{,X4Bly~4%H$Ʋn0$I!}:kN10.h}LC6pvOj<[XsX$H14 4hd01H`M'ba2K*i(R " i%3nU`;s2GVa""fĞLσ5mL|#1褽&LtE‘cE¦&hi dI3g$G$4sF jdBx 60'(-!x 0JJ"3ǃ< Xc&{An JE5ƚGeyKfW侽~Q5>tcM]t;eMΈVfrb h6Ӕs׮gy"ZZNȶT:)زɉ}'X R\+3*cS㿽SgZzaS|ieä\QXt252>&:Gh bm`N{׿;pnKJg?WN P(@WD9޿籧Me$ɨ u)EN#76Dzl0UG |"'e Ʃ5qM&+>3~x|l<7iqMɔN6ׯnT B 4DD$c`tx2spHqp16;B+ @4cEYlc3oguH9DgQS8jG:?[x. 7睜𱺩A'UPaRc ЩL!OcqndlqU7mZbuQ 5{dlߢL;D2ʄfe@JZ}eҪz>d :h-v8L#J`M; =;Tuj[z2 K-`u-(-`7К˦bO>m҉a?rHIiEAIpY%06Fx ΫYO?y)bE0o= q{?6m(gQ'Ks-?gЁPnG1DRȘlN|޲f*# n?omi@k>逳I7`АrlG_5Vuzzj޽W v'%YvM0_f:U'XOd`ވK>6XN6SZU(ψI]HWo#Ͳ[.5)E"-6I # UT!%wFuG[8lzkiڠς`4u^2q]Mi, `lJJ7з aę~~lrCAr ,45-JP[kךU+z'#Ɋq<#iѬ&(CUWWIDAT:7o7Mk+Tjv =#WC~zxlNÏ3뒠9_=ee0`X<hQL߇Ymt,&"4^ACغh<?nء~5AX$s@Mf|V,,b~"Hd民18ь zII^ƶ(pa̰NGؒ"OgDAKXY7x߭_?|V5-Lvb]d73.9y;{Xi~5Ca% g4?L4j*&LYtDS## EIţt \<L$Rn52=E"ʖIz D2}3XdpdxbrցѩI(VHASYcccd\bKFF[*ECX#cct,e |t$T$2695Nofg`462:>2:F HOI0TUa>8P5e32<<91AADE6t7f'S]b)hI$T<K%#qjz"7t?R5xq|trzJQӉDzz:>>1Oһ04h<S4ڒO%qgxxdrr2Lzl:7JBk}6MT*,8Gȥѡ1t9LNFFGG&:N *J* 'gb*GD'⑱hMQ*dciN\Rb##ccxR`dltlrvtt2KI47NMN XecĦ⩸H`pA\K 8+D/^hM#GtA21f$EP''!HRF^Fqa.OnC%Cx$GCdsjz2L9Qct GڊvbʐׅdGNkE#`Ov͐*%70t p;/~ӯՇ:tm}췏[?{:;Zb-pkWWgiYپcǝwݱo3gN#\K#?|mTUj=wqw࣏N?Gs$T{޷n۬nv<׿w{c'EY7v'G'E}{;}:RVwg’=p-ߺ{iŅ>wORSw t E6_tWc<׾ϖ=?q2 D~R\Rpaݻ|r;>q'ܱ}c?twͷ|w=z>;ZnU~忾Eu}aؽmۖZg6%No}{;@cmh߭/֟ljKZI?w⁇ڽkG{weu'm[QܽsWӻ}bVI%۾mkno=裑p_ٹcǶm:۳f͊'?=sU֎OTcWVQLZ 3Vdvp=p$yMMnO2|w.?xh_WͤgNtz#0#{vnl{ǿÃ=[0BDuvL ˗;xBzˬ WV z<]i=e5ӟW,lx:=82ZRTu<FBqa1t5` )qzѴga6HdhG.i@flfmH ?2~hO&TJ%!p.g:f5$_Rh̀ryxfh :37+3Rf@6WS[hDXr2.f#8i ɿ.t8].}qV)Έ6˃fXR;n,LtJ\46ޓLx6Z`hJǓSShbvf)3xYŊ XP2>b a8=hiv݃]uUg5ˎGN7] `<ɲԸxm]=vk[g>G֯]SV^nU^FF._17_Myw:[usMM_?^P5<8GsC@[kt}<ԓ+֯~Í7G?7U+W_}ݵ)315QQY~UWY-i]W6m{81wjIzЇa6? V7rŊChh<}淿W_{-^6t7wm_ODˑSosj 7701܋+;Q[[xzM6E? oF"pල CYtS uVe /[~ϡCOҊ;{6 ی)),p;]$[Qz*.k״w/y2ڹy 3*jΒ*'ڷwqIQ85>:UZR<8#P8O>矻2cVrԙ7ִjo۲cܽ7P]S=. wwumlc,ZiQ K ٰq~U==%^a[[˪B^l6?rLS'EVsO3+V wcLꪫ,V+='pNk:MԖ1 #`Iw12W l |:#?\N y9 aٴl`6r*$9?D"{7u$t0>[mt}f Zh=B2Y0΁8>9:yc|"JhZTEK=]=Yn:3ٳ;Z-tcl uBt{:a6 ###N^ oXɂ;=} 皓iph6+쐏t4ݞ&i5G j ̱z{x__=rd\=U[___\\J%3299[ A|ÆuEŅte,Y0XRTWSSӘvww{߽>+d"D&{&VYY z&''7?޽{F bz> --+/ x :y>C B`|,Ȇ a x߹۷~{jA3a7[$rhr8`0 =`.M">?TZ\u,g7?YɅ.sA\.?<W/x^'2=yo[>`4%P>4:so٭{vGytm]-|ljD<.=^MIlfMŞӧ|_jQ4^@ӬF֛G=f5 1ǠDݬyL]ªCՔY$CӒɦ&(/~>gǙd; i*tX~ßO}J)(B71 pݗ_~?я7^ 좮0?J)E`vznu&rrWtttw;hAm9{v:miiFb5utvN&nceM탓"Ivumiim(X *J}UVM'&u];|Q^~EI-//bNamKK߸N$"R }]](xFU:<2<2|٪uօ;v ɻo^8XTTTR8W\q$9< n. νAZ F|PӑR,Y,UUXdht$*XD0u9Ғj8`8*pZ"mN, ˋB BfзV:^vM( S.ZnmEe%ayƆRNk㓓VBL+p7106\vYII]1 eբ(a21> \}'kV=$/#=(2Y6T`SK*c)-1~_s"gK6f t'RD.`nH9,x$B4s8Ȃ Y4z{,C蜠dJ jsكvFFz&5ii{0ظzl1릞T"QRX9  tb9sA-st6#HӘҪ`Ѭj6IJjVmRBI: 'EאDL@$F QB9Hcq)I^)]?Ȩ4N_*Xb`a,5gLE9#e+}d,`%̪nWipA'VQ^)Pk ^NnzNz@>S{K5h Eedz,( n+n B"fQWu;\bݜҭ)Etݬط$@@TT!7ՒD]W:`yyXɩ7xc}}=.CK3 .K7AXZ(b dٜQ|"D&IIt =o yLiVDdE;=N-Pbq&͢M)}uh:C/JT(`$.c%;<臌J_3JR1Kŭ9נ`,O#v0而yǰٴ }NG@<L(z֯d*JΔY#3$*s,Yu4IF/F5en )UciYwƢ׵5n!x+nz4uİf3J"}QV}ŠDKD"Fuj,xX qc{>8>uƆ2ckJZv]tE aO3<JGlhрAF XIKC&) {1ݤ5/<@tPNށXNh$F(2NC& u:#GbA^oXӯE Ά0N6y[['T\*È**,t=|0uIиEӄtX 8T*)r ex[ML[UX*<^PD)NOLOA0u FLZ`U !4WC AC@ AubRAwn#{U3e,U6< (VGʹ%0cz*BA>^~)SVd < rʘ/D[t,' ѢP]ZCn8 Cć. t&[4~0lP'2a023_o,k6*^e5|XZ{Zo0d297I, la@A餷 r1'XFTEay|-# ~HϏcЬRӁޠzC>_ X`մb-ha*Ar8phJήev؟0hG@H졡hMK&7@MZXų6L*;bh&`,1d6X1xE!NE' tF0 GjI-#HK4frP] ۰u: ,۲! 5L^/se5JC(94 wv&bL3 G0`Z8<%2obA)czh+rE~hI3HSSQ> -1*HXffrq8m{~kI{ښ V^iYeH=lÍ!coT/"h&ѫ00_ ’@ow +bU| [4;hk$|59=?*((7Vp6Cӑ1D`GKKMica 3`bdt(G"7JP5/k8` P/HTAE!_F`4[.ЇZs:=<<EϴX磌Q>."@H0>bόz4?',i l#<I`2ey֝yr,ذ#Y,~,70z̋>qHZV"/k@%Ycv eD$" Au5$=1H&1gQgIJ6$ߌj2A#H<~5ť.*#&rX)3{GMTM  nz1IE5z **^ʘcY/L;@[B2Q`S(c4(9>qd3pBDD f6x~Ni:cBZqpHٜdك"fDxi%E* Y-opm,*"F-Ɂ-NӠFIN8YR3] zL$I-iz6P@oqZL4r6gHWHQX$4}k3y(1j9EMT8'|˥8=U iD6Iѡu~O4Yc03L R bOYY i..j!1.cW|/Xl@T"N{||]plB5N7 Q4mz`_3O)f!fҘ@`jE"[3HЧfqS _4f~IG$pr3+0瀢g9l%cѬJs1Ȓ5cz芼qQ@G, 2GD)H^-rR`8HpѹQ<sX2 Мf{!"(vFZ"X&C㴱?@m>YxLBJ!5Q%h᪨ѭf]2%q%@a˲ށSgahp> ~$^aDq} $I2f9_G섒9+2+LTsJdBXQR2y"3˹76V rS?3L]aDžȰlfB3On#.!ۆM4M騜 tH]a(Z"ֲ#N8Xtȕ3oQ|6(an,sFQni91y`TNaBȖanI,zqEIY1%u od7Qx2Hӊ% dZX]IB׷HҘ(fA髪B YH'S0u"B 2;Wvc29\mhYJfdȍ$hs(V:dPBauX: o#5h~! t5eKS(3? BgdlXl$"YOg [8D"/7aa8sI<ڳܲ,D?#:Fq祁Ve k/K@I# P],xAc1!5zvfYchSbcÆB%8rF]t_%h5JyX6a\]׋ovzzަ/$T#|HTXfǐ#̼Łb\>ځ  |yAp:FEBc&J [F6(S T|#GNE<ӹZ:`ItBg<@pdI,>O"lAg35sRp' /Usd8Ŕ_Ds$1-*BSf2h.u-glE247I<+V##i > a|⋹!{1#5F2e,0t sk6eXܢ^PX`tVO-,iMuբF3s4{S fn )m 5;[*w/9E^zz_l,f{M:ȅ6 IdѠn!-;(iT,ݒdZ̶y-{m 1E6!7OU Ejɷ-Il$y[^4(f)Oo5"<`s>Fv4Y0UUl$᭕V~lR)9X<]7~/e{, g1K ?q>{h~䃑|Iy9\`[ȸ NlKœ o[p{ Ca1H^KZp?CSs 6oY-V[ޜ“SUi+@S ca.x;?JΟ2Kw_wx=Jc <[%{ogR,r.9$,i,-O9/m27GL&SɤX,s([Ȍ 6ʯd*j!ٞ^mс0gH#`0,Fy0W#yxy銒9Y2bX0c`/sK^^\L,cX^.RaH$a8F fHeHAS3f`fO-eg^ubԛ g$K#1H~xE,cKsX#yx1_ ̰p@ l Hق(d/]*']B0&li/0ҖKq)AYL&of=cBe&nd?5p.p*F\оyr`$\}wafH{Th&y% n %3)$8魓fA$͔ͤ b8VVBᤌy@>9r`$\0DiQl6x Kޜ<bz 2:xHi`$σ `D̓#^ j""’Й2z&!'ef-v*#y\"1gH^2. 7F4FEf4Vn%U6e2ȟsF.$>XBl ,I/y0_^ex +3=_*͆ÁST27l挢4{o30u8#q"c1/v/c/#Rg~5٘#"CPUI*fIH`ҷ߈CnZʍe\r`FˀAh</y0'rk2ya$_d{NN z|>zIF$,dv"4ê-Fd}(_&\EDq,!spLKjOεVh惑<K`eEy3Uj_Z0KU[Q_ $IfZT-Ygn|n`:F~QߖPKꬼ\,tg˥pX%^twc["Pb);gE?8/5,=Y1ؖ;O^[0gbg"yafv+{x;n,w\0oHÞ>M@eKB^}wWb|l,.]~)9g( 5Xi`ɍ\,C7g>/KқzgcEKD7:.+һ@@<; P r+5F$ KMMMdv[, ~s݂ɭ6 N'R,CyÑRy`E^x<_r/ٙgGvy[ 6.Wȯ^艪%P24^b#@:?bpB͘ 7gjzBQҩT*z|>oX2%N >s7wn/cH~n#R!0.rx5]q9m%0i0zliD盅WS%оƫף.ϯ>efa#,XR \< X/ϋ%^Dܖ4ʋϏ0Zko}&QMy=6-kҐYyx^ 79.&GEwx~)睓哓K|`<9 ERYki T=HF99 W-I cI˰;J;N~w䅑> #ULzKK+H[C8^$єL'''EԂţ'٫'\X2^̱mFhu\iȇ? ͤ54vPrWL\xz?rT + D*<̍.@P,yۘ spތy9gs",D' @Z͌=9ϜKE[H{aTŞ9*4z0_9t_ ;FڥKB n3q;_uC _y`$W8 ) 4`jI#{}µ?Ty*_F `XyEroRqsrb8)^|plI$s2#]ʸ<#%gG a-%li H^2X#ya}Α+XSSSWYrKg?bV! tPo~UW]v{`Ғldd*p:@Ap<_j@`d3LEIe:Q&9?A@8pR*u Ox~HRIfjry5_ K|璠_1d;Y_39%,_B#yyȝ_ [XTxI*+mV,I]]7[6?l}} 64DԬX\r Y NPN$o, ,69]CGnx=S'mjs:]YufM/GA,Lޛ]A8sٳ06 $m7e"\;IfQp&tAdt3 Y[]2TVu"2RKnh61\Ȯ,)s FY nKJ,+6o Pt oKŗ<Ɽ h4bm%ݸ]ԙ#R1S)I ℙX|v?Իfl\i5MO A}&9=80,閱aۚN, $L:cRGdž'''27"Z%+Eu)Τ+)A2 jf-nLel/J؜f4"0{iݜE8&5& 5,)E$jmx6\C,^ E *3ԗ7e`<,0ؐyYbdqyQEcN o hŐۄElg.Yk϶(](fy~C3!˷9467Z<27g㢛֚<02F<9+o/f#얝[V(x.ݲL\,^@ P&iy1&m"$u(繜$=h&ւ.8cvܼy38vNF/ SR\*ʮjá Ti 5 q,@8N%,Ll%Xd K%ab6%Kf(J:[LF{dzVD o))" 6ᰢix,6|ѱX<nw@xnSji"V%PC?Y1bk' P*fi'b㒭Fg!S"4dUZG&@4Kb4Q!H0ziv!CO'ឺPJ)KZ+8˷w :62rٖo~?Ec|JZ~gN Onۓ{n  я~|ԧ/~ǟx\[[`Oo|hhp(%b7~GlEEt7?seee߼=o۶Wwd!ٳw=wZ]>deimwQSSeYypAlmi;wܓO>Сð%%Ew}חO';voi=r_oO7k\fçζ^sloI.d?wxCC_ӗ ]o}?{^vmww>o={\.Vԝan8 ,<2/6%ѦFl#e2x%b0Y%P^4.r,%]BWc6".]xFwNl p Y ?ѣG8e˖Ʒ-|2<͛ MOO?agΜ37ގλᄏa/͛?uԹ}ɤrdDKK *Euhj?7 j[?ǟo~7{瓟TKKJ:tOwysͣ#cc*¯~|m}k׮~v}OOG+׾|59pA׿ummm[[$+EU^׿O|Sկ>я:u%:HS7-M288}ozFGGG.47vÈԴ667:} \3O37o@%hxii>~[yԩT2aaO6]% $x]9‚h$a GP[d~ٲe^sUV=c߻ws=nڷEEEP{2`yQ^r;{p+v&FGv7\7),FR#CS֭EeegzxxfrݺuL3[PTn%|++ɄEMo|0kJ䦛ނQ?}ɉIG*蔢nڵ민JT~zÙLv4000<4[_O%2 ]}5֯;բhFlyl=L@EW9Xʊ+qlQaaA:;ueÆˢ#C:~ş?6=>$ fU4,)``o}]dn#Lcf)@0gH#y6y0_^"Xƥ>5H #m90H]2a]yXV |b/{ Fo?<>^lKrq<`˸\sa2+W+淔;o#tD&v@^&@|;񎷿_=9KSebIQ۹k?O:}f[Yt]Ybʈ =/lCVTˢ+9rP -//5>>^\\Z5O<--->؞= loAY`+!-[va^wxdd׮]O 3 Na'bvꂅC\wu>3l~ꩧ;ie`IdpM:Ztc;::ҩNd"T^Q<εDcq 7\w-*.gO*)*Uѱ}t%ײFQQ57?=gϞN$@*t& 6vw^eҸ#YRvH >E,6Æq-db\ɥc֭+W,-- U__-}v۷,tsKem)ZSWǡ׬^5>> +aFW_suqQ sUVcCc!4ֹs` .+a*::}>v=]|^/L Uaaa0X^SRM|JJv{Owd]]624jpkT68bIE\reW\VPTU5u7in-,*,CT2u{EI+p\D*n:es8+k(.,wu{\βu77@0(Y EQ\acZ+ ŠX,2e14!cdi _ڒg]Kq x!eyXzUK(q1ccIݼb P4y>I< <22Nև3m=݉d2Xmh@3ѹ/\pC:HWtP3 رW~[ Z,Lk‰$z̘LHfϬ2l9`Db. 6x |z76Ӈ@!Ğ"ZuU]ڂlFTl0nV_5(;d@nG~JǮM@ 6{:[ψam lYD<{9Mh=ن⢉I ,m(.)6WPg``ƹg E!;8\/ Ի rkyXHu왗}I_Bl,Ēd^eR^Pp>¢O0_y2X@F@aA8uT"ȾESRdfQF>:IB2(QihEb%=fѻFhuGyY2r"{Y cU$fIϓJ *Y_;`|̇F7ɳFlɹXx 0`>F<s`$60ww UH_.[O f];TYS,($zCZ0#Ƚ74Mr[FL @K~Yd~44ꡆb d"ǎV*0S oܙ0P sG*#V(@܈H9l 2Xx|P.ED~pIq/ZUy5`'-/i/i]oQC ՘!ri`$φ6Vz<3א?E$ID8g"-U/۰n~eۨɜ&FcC@Ptia8HB33f-?5HI; ,HV\| ݲ)IDᣋ$⩜IC5KU*3tfL„Ei6 0gǷe, H@ns~ǚ6\?tj.⠪FgDߘNAma 0sow:?OI!r!Hx?(Bm! jQJ㘢X6[$X`3ay2mϳZ$P0?l$%<8'?@a -f[Dհj"jBXñce׷e,w(s-ӓNCqd45 j$^nf KEd6诨Ϡ26q5pgfJYYF t yoܺ7㢀fcq [pHeYTĐĶl]A,Y#hfoĠ!"eg,L6;;OIn< 3IT{Xrs_G[R/̡˶b`F2ٖ9/ж4|8,fcȭۼv"G$6Cy^BmiX:ȍ _xɹT/i,{zz۔K5Z=X*J&>] Sg\iW+B3V-U2j2+bF5+f!hm "Sba7ȣ$js qc OqaN|:K:x*bA:-`"^![jDE~@fg6 ,ѧ Vf(eES!+e_4e@^" q~x^WTrn/#u@V΄{ƎrDR ן}z}]i%[^IeV,LR(s&$@AL}SUp{ЍT(ԭpԩsܸTD)?6mڴn:۶+(p@5-0o0t 7 f-,f@s+b46+ > $UPy>?X=j ͗+iB2VLNe+s,Q-W4Zv۷4|Wz,AӢm Rn {۹sڵkaJ5"+#]e  g4 KQC،FHGgQL ΌT2oܓyD"+ R85?͗L6o54*-NP`ɔAt)&tde ul'w< h=J`HhrC%AKdi\ȂBzU7*%OlEG*,pb4Zc/K '⬅#233S۽{7ܞ͛7 ( VE]V[k޾glaYc7o.lӦM`h䓱Ps͏Ej<3ՉWa,%b0ozfWltS-%% 6:u.rMEH$!Y a89#r  )!@ Y%%$ZS%d C˞7b`k n+lȿH;*,:2 $DqH1Ac֠J$IhPʍ|Hxb"N4r[aOoܸQ\M5@"~[c޴__/K7nEGIsRѰT%(9P-$r8V=$Ww8Ұ(#:} =tʧD|aUd]"SZPȭϬ nj PSs5 j4#,x˵yUh dgj$dv=$rs|u ,XIU+BS.H?Pdv5d^OO@8"i/g'OT("ΗY =22Ј iUCAf7,TY"W|t{zz:|d6*$=}t LK}ĉata@DaDE+S”! )64$B%*P,dԆb"T^jPSF WV_8,ʆˈ3LACMC2pURsk222/U6 05[\,$jȼ:AҪ̫̫̮K,Q feLz0,QT/}ﳁ X6ٹ/D8t70h,9Ctǯ0h4m]bp|B GS  A-"qט:z69Xx7 ʜ,FyApT3)ƃ$Ut$1$`!5eCdj #T6)jM]V -@Q W LT7-@rS W"zgY9G24l2/< g₀b0ʢ!%^ W" AfAfWCrY]] UnB4- o,PNejPI2^ Su6ry۶ (-~Ef9I@9WD#s'O}n X5ԉчy<֘aӭ'rj`&N;p1SSV64B߁4}rr꥗i;]^㼈>V{m2Жm4% !󚆬V Zu"8ZM l2 d%S̫̮Fb([$J/ N x(6rD5(h.dd hA, $CA֩N,1qY9rvGbʟ" (>᧡6#ؒmkг/}+_]8vuJ_{gv?316f¯StH ~w{ϳ={ɘn`よ<Ǐyǝ/|q,̇}o5D[)-#,9XK2X-9:!ߋ!h%] +}C= Z GP Q'8*:UV(HR5uՐy@VTmYUA _ c<66:VrJzbqݺu0b=a5눟+k-"Ew t< ho!+AMYr|OܾcnG}\`_WO.G7wN<6dO~g`} pBsṊSAFmq`zjZ+7)P5 Ԙ+klddgw,Kc2RI2t*gT*eYv6ds$#]}ۿO7ugwn()1+G8*(TDnH`ա:|*9H'R0U,UW@e:$h\Cej*(*pƢQ)ơ-6^ԭR0 :ѭtH;MϨ059ɀw)rm.x<}ȡ4g34._wga#_ öSӳ^9˯vtE8qrtlt^ؽg䔕hvUky再[a(XJZG<8UӣEW/T/0?(ʁoiEL?jDGe--y{wHP!R`-RWRf@m w|_GȏPc1JAjJkɃsU /֧t>!HIy޵@ShïB+(ILD%u޺D"tʕ R闫rAg[g WEED#~U5$HSGxP5:΅8Ԟh e x9h%qR^Y6C.!؈ ̼Dg9'.VE|)7_ ˥U8rPJ6X,!VtK$YUHvQ}߽+6߀&")Anfj[ǮSBG~i`iAbL5FUHGNdr%%EbO􇔫%U%pH I#-+1뙚y Q&$Mmb^4^ۊZDpkFPS9D&+}6 G)Sb] 6>R2(XTąBEɐ>&0OD?+ԬGyʲH+ . yN:}9k)|w}qh %A h!yzzq{o[l3Ju 1{ /M+seYtF% ٹga|`} =e[95Fht-[fJ>>xqOo_GнOselQKB'c+Y"EBohB 8GECX,.&0"!4xKkj6Y&r!iW v2 $%YhT/Ks"_ApرnR.ы'T(\7i֮~{xM@nȀT*9p"ըkmҼ3tϾ纚AptƴL=v 0|~26LBuE ys1?d,McG7g-tK4/B3v_:/ PL!7\eʠ 45̷CA|o{=3gBěq5A-·y_.yrAVYFh$rUU]$3/3 >JTҚo>*AHM+ShGmGx"Β"-R9b9yv;'+ j0OWt+9Y J~'lx9UAlN@=@ۂ Z@qo.+H] _{7u>bEXV&k̍iЌ|8=!Smˀ6!@]Colݻ T' }ta如+wdϟeiʻ-dLD " J;$)(j%Ae~y|szMЄ
cC~yB-ZrMcq h&XWXFtC((L|϶-xp(성_`TK,*в-9% =ǡ[1ݯMD5l4P㢢Z A#10P$@yh2"Eו]CVj5d4 ECNLL!}``4M]Qc1A@9D8zqϋk֬d2ABPC]7H TwaaĺG Ҡ(JtjR af`tӉbƆDiz1TS}2 !)Y$:hƪ;`6}tB:Bπi>}G al.C45wz166] 6͢F,㓋 h3 7 u˶+[?_hNI5y$Րy5H\n hDZ֩[j<- ω]#Gz{{;::`@2e!FaH5''~ܷ{fjy-J U@,b3nQFT[o2LrHAL:%I2h=]p͢Ȃ Jp㊊14РP }TDɇCdk]h 5S4[}(lЭzLbD h!fՑLM 80ɒ0U| :wsC]Z&2PB+|'麣ҫ/W aGWi!ȓ|X%-8^H } .OF!G6I| DZzoYӝ5ul|mBOr݂B Qni7IE6s3=^y߿yuA" Ue|kPMBٳX,y7n (Mz3.0T*GF=p̿zW]v:EӧSF I' %Tl(S߅1U3O|WÂbyR}χGUR"ϛYe,7Bxz&y?Mn ]QJR:B8?|{nf B6F*.YFS:+DѢV;bj4 UUAy- CD`OGIK%ӎ.@ftBDK*Ps]G) gR.~'[2gFzHx*āInpȰR \aoAmz 3 SJ7^q.a 8V#h,hQSMVhm+D7Keu}F/'hj׮]ׯyKHZHӫhƼ=rXpEj*v {U8!$XQ~\zB(e8h1VMT0qdE>a/ YJe+=3\2bz 8P[4kPŋ0h?BvHzn9!ߔeJaZVLiÛ㹖Ԑ |bL@Ea3-IS*X/Fa: ;$;(y8}VLKQȾ£#C"|d++* Q! 1俑 8p<8B.jHՈ5t<7!RDwF?s4R{HADQݴ;Ƌ>ޫ敜r-s˄y;Gi,,M(6[Fj5ׂ48{キlޠ7N%͘#a;{:`۸/BDE'(#(*yo0olyg215%?،=+*1s#@P"ųRHu(Q75X A]<3!([ڶ\ǁՉM&42'le\7If|7EgȬ"k 0Z^)c:[Anhp|o,3/FW&N0C 0EQ(C-m`*  ?, DEG_`a-0bz{htP L!zԦA&S=)=y)J_s"%#`7θ#N Ms][.-WySJ_PVug/͠Eˊy;Gi,,]"r,ۆ LӕM7"B@6 hZZ&kZ)t"vpߓNPh'hJQgT6+A4*PuLXƤMG^IxJdF(uHx0c(oāB#*1w::8gN*1W9:6dx&m]񊳹yn{N )⫁i]1)`+r؍KS)շP XX2bO^)ZBnшC[S#AO80YdH ]%p(zLzR[TiM1#\;zl vf[ր{X#R|=*7-(jܢ*fgSb4Echg8!vj0K}L 47g.KF6;|-)mAuYϨFm\05C@??}5Қf[争@ {{Y< +VR!Koۿ;|Hgo6os %-A'&(pM[2g g1IPqD>0LNR*@y;'e"jP j?ڸv\"8o~G~@gB~PMs KIl ^c5wto\bC͌Oť),J5Vz+HTlޔ i!=u@.22\4+''9gCf=Xћ.'`[uO{{_ʔƧB̊͂Yڹw+n7l;6MA AV&hnSq .Ct^n-!=37.n\jU~0G7LO*~T_t촣-þbS׶k+aYe.)SeRY4cEb;fVDZ1\U5VeԚl.iyzy##3Vb ZJZL3W1\$>f &S1BZt?%9\;WrfssaE2/ @M0Դpp[WBMQOP<fq@@IX /y/xUAQGGMSsw}Ӫt<{s"E@52E@`8ѓO)s6t^=^8xt?2;UgJI]C0oΎ}//JqZ G:캔fliE9ͨECd恎Ofc֟o u^yȘnZnΖJ\zu`-or CoyV)c'|%^زё}o|`-7 n(vR\U6^::9[F2YtTGO͖u,Ha3kz '&w^CjhVdɨn۰WCϸm6&'Ow~Tϱ333MO߸㑧/]czVo(L>L]t!oߛ9=6=5JY7^w9eM''gWuv=x"iBX0qA7_zWOEͱ*]}ȁR!uV_?*F7]o6uãok6[6\nxH(Zc[޶oЗ+ja ĵ[76rv;7-Lϋ{fٙlz^`q:t`?`yIhn ŗS -0E䴥[vuuuvvHI/1"[R.r*bzG\[3ei&@-Wyp;h,WTC,Uٖe_>:;ODn`.rf5t;͡q`ܾS'{{we6}lws)]ꪝC'n3u#o[?+OObPҔдMqJtьo`1sʽtjmZx|o}{^AC腺m~7_ԓO+sa`~a*SO>35?pة8 S{q{hc|HImds}z8=ؚ̩u])Ùv3g쓯>[y3r4 ~f_w?z2l]ްJѽ?|[p_ڕқLqb@*|8̼U77ٻofM[}LVv ްs_ۿ񏾿6ѿGtffr΋-λ6hdL OaOgƝBiᄛ/)D& /J<%.O =s{_}OPBys "ܻ\̱(F~o7it* E#; Y:3r"Zuç> OFM=vjrjdvftN0m731OKfG6cw#NeF94y wf(feɧ>6>©)OS{u'`<nrp_f.'`k !e]_5(1S#8=SF@:6^`sBa.X jhPq Gh Ga+2p |/x9KݲllYJ\dBϝNٺj:QFѫVt;X13L6˘—П6B-Ua12(= (7^{K7telv1qKQ[t&J 6'L~{\Cئ' p#ϿMwZVFS ^u=ƫy /+sWfǾ[t><3DЂPqrL$(9EEeNX)UQ ,ܖ.X6ۑ"aT =]M2eM#9S<鵼ts^iP\zN^Ĭ|5tƣhƊ&Bb/VcǢ)T ^)oqPS鯎㊭[*wZ*|#xWU]i'4/lWwwgORUx~!}@e1PICUyIr tvu)4;:|̶r)+Lw|WWo_ѳӎeѩBl;0\2Kvx&5Sɒ*-_8ܶK]sSIIyScNPZyիfgJA@Ԝra3%XkvLg842(f C##c:kt Gַ䘛K/9p Fl)LO)e{&Ocs9CެBhB˴6 ONI4n~˦3F':\-/Z_TSO{p$u-vıb`cO81Q0rݙ eG O3n0J/ U-%;녓s8usvnjtl27a׮wT]wt/C=.]Tξ@O=qR=sHdX'#'X褢+_tߺmWݰsUfONMJeoκe[@gɶ!dh aUHzȚA-9.L-햄\. sNX.q{HUqh%?uo Q[c)z oWLMGe^XFzY&E+.|^u-W#͍YUqTz7D'g:7`(ʩ dz%'Xj `JXR>ьf\RPFCz+u(ǫ5~W>94=USt3R c*mF;/:K_V-Oc%7=3,TL0 ;*xkgp;=xpdk&jܘTE{Wu<`h:^PԒ{Cqd>Cb+ψU jG-MŴHnrP0ʼnXಬf{VX8ϯie5էYM DiVTd_S>(cY:S2z,j*/tu=0Q =fЧAol{u”]Ӓ T [ x|h=O|o/&Yt,NYK‹0U82YDڥ| E&R cBUѐH xh^_4)u`dcA3RfY- k7[Eݨ/4@KТ4{~mذaͰR85#fD]a^zRfQW ihhmj1yۂ ;M Ɓ?` m+1 .[Qݳg5=== ]өkV_t[7oh/ڱmضsm5O鴙霘7_ь"͎TTHZgIӫ2N6 *Ao~LW3 ЧlC{, i>ܴTәtw'f^EFd#n:BPE!}tWĹ2kӥ(GEj/ _.Aϲ/رbŒP GgM}fRT4RP] >:O7`'MO3APFZ%-k)8Li~ ),fy OPM^=]ӟä91Q/zj{Qa!sɏ|zyL(1b胮H GĺteSǥ{Lfk?4rAfD3ΐ@d&\IR(2D[ej$F$,dPYպ ZF hl*Z pNe`lK+ljf:Lee(^#B3 JMPe˿kVOoX3R45A5cCՎi 놺:{nܰgXN>)xfYOSB=HWUd!`ᯩ1}uSE ^9ȤX*yE4P;5zjl@U]#߁Z GGx08kh<7B)sIO STيgkzэONM3׳# uWA/` C3!𧱓#I{_] ]"Fg #'ZcƞFP^(C[Clh&$M$ݕC?EG_UH "j, h-+ *B'WOň5C bF>&;XBv 0JA*S/}Ŧ^[Tc-rAM@oaC3zÓ[UF5 ʭ8ڂ8D[rT]V8%cHߒKjN:p0opCSQyS?;=6cKvl\tyo)j:m)TfDŽq BD8n뮾N,x.̒_EsO lgvѷ⫻zo{&e`O7AC ^Pt HtsܔeMXAK`}7dpԁ%F'ԟgJvp8K 6w@u0%&,C)t\?K-C'##' KDbhA>5c 6+,sKMb8bdU_F"-b/fC^`D&!ڐ"!? 49t<t^9ѧP%x2̗|%`%"a,>xQ鑢聚3/5:l`;/E 5r1Po2Y|se%x]2gZDa,͉~1rp]dE=oZG#5BDCID!+|k -ZYG?7o + T:AfM]OsC¼QDWH云zS#dh"̛7\އ(y+,;]nERaP&_Ae)sTzsL4ur&x`ϩ0b*@iR[¼ȼ3¯f!8= 9a}gZF鈞@hWEx`3`Jp#FPG/h8 mn0b0zo/-Z>̤gESeM0üLRt0h{T>Fϰ5@m^q Ie xx^}>2hۀ#JRBtȪPT+1a 60PjόЃ5VDፁCyC_=@3T`OC|# n8ڌFr:bb |se%x RK$mLo fʢZ"L5pN,OP[Q2ZlOt-6Z9 n:7à/: ȡҧtcP}y2en氀yK׭]g)rn@"Uz\ `eh񏫸6 &VppH h:G)4D8p!aPhnvm25v% F/W } BP:ٰ1 OA*0XfBZ& 1\pOnNemc(c-h#ךA6(aDס!h,2XA8e2 !_vn-J%'Ar<@Cz 4iEU.?Zs&t@g>Ә: AQ# ]4tҊ%=qu0 ~ !]`лg>7H@9yt 6g~yn!-D<9;}̏,A4,E) Ҁ/W1Pc$M2Ap8 MT_WǦ=ޮ9e0 M΀{A+FT4xL|(mt t4Ɗ\O8>mتkE⡍7\ 4Bbޞ|se%xBHՂD4i}6j"X.% <pUd撰 +M#ٞ#:&_VдZeT P4SG@ 2D$ HPxdtd@z.Z̈JkAnu ."aАEF63bt0De8 Dt:,Fv1GyIf1#)T~-gfM&cGuaS"4{ nO5kuFg`5&3(FïE,;mlZv*S 2&QB2<= w%, r#/): ۏ?I'cQ"QƐ!L΢@=sA V! *@8TgR-ZąqK¢ "01tXn5@m]A}?PX-W]LGpC XD:INFvG~H!ݜ. e#PN#l)N:Kɝ :~e,$sL㿜0 ֞fe5kܞp{+6,, :|#C sNXR'>2'tYw6mHzdTiPNh݅=&60.bHHS3Jsa.ЉKKdkV2o!Nn~ᠭXB_V;Hutw0SV:pDdY:A +H*Cdb5d^su! k 3_=jNӐ՚8HZAi@m/=}P]%/-PmDڦBJ5y$ՐymFK[{+N ~Κ(VMfB u& (@i_SUT_ CH$@u!X@75m-ȦPzbHBY5ZFY"̙*TC%(-TřP0 U5CŚ3s@ rƢC5L/ }"ׂҷe!,?,-靿ea B\&DզJU"RnK9B ʑ2qRMXUH 'yC 8'7b-ь4nRY 5A*[x\ m5kuÆy+K A݆z& X,*"m0ojYȹZƂª[$jȼ Af_PS@vCf/Pdv5d^dbdXN35xnޞGh#bZ7 Y6ژ@yhSq -l۷ _Wt6h6h4I#GÁƱoR௒r6!vpMBi6!- הohl[fhp㏻d8j ^k$ Z* 2oBrY amB0tޞŭH[C- !JȌ$I%!ư,Af~A=RVQS}"귕? #{\ju0WME 5{1!rDXEu%jWy55 @t@ϛ X 7rL=Dȼsՠ\8Q[]X8PVL-̉P(D(X7ř)yN!rk@օ2f AfWC%AN3k.,y%*Qzeh I"FD pBFQ,B9CZBT!mTγZN⼂fQh)/!I2ohH}iXY TU|Ī1$ Ȍ:EI`B$'@e98,@jòLWdž M\$^5qq4fGh.0vX2{ {mј eHAYp.? P8 z{<@Yf7@dvdC+`A4BՐym!I2:("PC$),X5b DV *z@hqK}YYOB])$Qz"s>\S⿔fZcc#Ϲő(@L.yT sȤEa=):6V>Mn΢ IU1N5@*, =UYbt!! /(H֫!Z<Z 9j2!~yud&LJO?>|7(FqȲq$ȝ[?mXlOtϬM5K69]8dR`/459Mz=DV+=ghm^~udIL8n:d}Tz d^5@BҚ@6h|B,F@g¯\mQ 9YfԚ|+ SML;A@Y@$FK( ˾f M2ubp@bU An U,<)"dFm,!#ۋf 所Lj,}C7u+}@??a,7aUYCUUĊ5_#:X4$Ր ,YuN2oBrY 8HqAf7Y2oAȢ-% 2UYhq!I2{ ! I2C&\Y=`1@>M(`>>7Y ݪ 8Qȕ6Zk%79Րy+jȼ e5dr /Xy}I^$!oSlj6)%|A@͠f*=!ȼAҪnuВ[@f6 Y2oBrY 8HZՐyU 8HZuՐy ,\T*|~|vvdtqmJ !CyP1y2oBrY Fm,QDBCf/H%x3Q{ ou6)X5ym27F&aY3)|ލW8GHQV kD5y+jȼ e5d^mҹO!ej@ &C_QoE6 J_G}Q)V+ 114D.ȼeB7ԭo5ZYX9cFVr1Xa2 &ZP޼9fYoW.FFfttٶ0lpΌd4e`KDb%Xf%RX6\8F$P08ԗPV`# z*XUrlAV+|24]se5Q&s$L._-6MJXʍ:,c5zBsiA}Ka$J KbЁ2Vh=d}i<7j*2Hp ׀]rUr#6Y" -) BY)2V ^Y-&E|]h,W"Qb%x,sD1&nD!v{0o͟e7D8s.h nK3#N&ʕ-r͉o#b$Adƨ)#jUBf$AhBdv@ 2Kę KT 1hFeЀPɅ{S* 3 KTQ N=dvjrN,0Pn|+uFeO$B@@btXs\VC5V[l0I`ǵ0\d\N(^uٶ-2@K2HW%@fV[yf-DzjȼK2o51 U,jA>AMTЩ "kBt2oqt$(v咢 XG-Y-/ p]SyD"1u1dhi/'@1{u] N$@{oMP`=yq ]7QB4mAp1A2EyPKϙ+9@Щ^$ 봈f* ً$i61 X((%F%?T4p%%@bDip@IM_d*d)!r֎'7`$Ŏ FRjb"`F_(;G1xo<E0 2@.k\r4@K2>h[rzZLD2DNICTd[Dp P[oD9bDhgh4Z’ "B# )4"Dfe 4bۉH,\I j-I w ."ffTmDO6 񋔽{VC#q0cd22UFgpaji_-Ĺh%OV)'o@Y& ~nDpRY9x^J Ҙ0o{/&2̛ˈ47B6F$-lFCu}\f͆ `p[3,T$_<`Ǟa(!]QsQhZ$qMFV7Yb\lI6,89ʯ=qz Oz?0\hXxoH$idd 4i-IDrs`P*RnFԩS\n $B'ycGf]  ~uS U]\l25 o&4pǒLNk&<(zE, ZA0YIk~yN5Lnzr4XaTWFmrYޕ GX|Bh&!Tevsժ!l0PyS )@f| dL J'&FXMdVj!D$d TC5 Y F5d^jrńmzT :l b Ě̫l ({ȁDn xY2]e"7rgI3*ȷ(,ĩ W.,2xAY]2! yXW!4%$!bpʏ ""|![}JsQIGZ!.9*/_+mh@GªABY\'7P1P"(&cL(c>^6Ob&ub>Ajz5$ = Nu-aĞ2DˢHNj,6q~AY ᑥA :,VT%[WH4]XXh fC*!/e$V4 8T"Ǩat1,>DbLhTFLQUh|\Q/dB_ctF Q`!-UDm1[!JI8ݶ :h$K{:1NzqXpG C~$dBjD TEtn9 GXZj!L cJ@ |I18xӘ1Y '~sIIA}A$W/5*|mU. BC%44H׵ =4j= -0 f ih8 /(Fqe.nZcX1P2B '`F0.2yKu}c M$̩O*JWRH K.PaY"""_u3yL]>IIAcu<^2]K?1<77Pt|5QsPJH&5H F#;x7o~v})?PgfzG'ƱDt+/<ؘz$p)Xk3;$ @^ڑ2DBYe9C/X,eɗrŔ gg/o0C4iend)4 )ҭd0?8 C1^VBSG;t!Fԉ#~|=z쉧z'x||O=[L&bնu/^ 5 +ӤGcv>7g  Buy5]CY%鼰L+@44AAfC3diZ5b(oOҨ"6wFvC೑!P&&I#kM㡑0oi¹W 3SO>ܩ\6c&옥cKб~=.x;66̳ςqqCֈ=̈́Q n >5r =v j&'0!`{~3 |Xi sT*fhm a aςA95r}J)hb0E3=أas  xӱe!3jd 1ac2 msDiwB4P2Y_ ax#F! Q ȼThH9ڀ2dAD!W!Ao*ҁ7|Çu]rsc "Z$]*d!vAD}:qr4HW?| k65LF, ھcbs4f 3U/{]M:Q~x6mო]tTenD^ttdٌ#DǞ;uu3333T*[E&[Ũ8FGG}G]y3;av(WeU|#@P>xs{_x'z{{j ~y=g}ݻz&NO^bJЍdIP|>I~Wv}ջѱ'fb" ƠbRv@懶OCS#GMI' 020 KM3 c.Cbک ÐD{wo*bC¼)4#5A{%pۑTMGnwTuE ӲP:Jhȱ~v8>R0c݁d p!SG?ܳw'|衑Q0" A$aW;^r\;6 [Ұ{@ɢ@6d h:{TK^f H=w?shqnJَ[qr tD%kv_b,1 ć8 AfWCAfAfWI22 |#Xh;'{4m,]0˧0kXQ01lTz4)aڡm* !ӆ |=}W=Yv͚5<`JkA s6(rH IZAi "ئ!"5rX_{%4wCSLYc(e^}gv%}EI|+F{{=q*m0zM#NmUeՔ:|#&l&%Y=$9Nmٲҋ/>v+zqَ>vvwd0(}m̑ hH`zv &_=alQNǧ)Ab_C4M?6L%8x4mޞ\.Y m/ M Lb2ZjZFX%0uΧiM%b2QEm ӔhP¾|Hg󝽃,-Ƃ`:t{%63s_W{GGdžmܴ0XIgTV䕂m̑gv~Ξ\6О 1XA1KG+0Xxh-V 41j(NҾ۷>Å?褭0*dޣl)/l6=;C~~wOٰ*b,:9rldto`ugGvͪƱcѮ}~L*헜W[{GzcIE!bnatK}ར.-avvֶlxo&iDW%){o/eЪժl*gHbv.+xeg(Ghc thSEa4gxX<Ö>ݝOLueepCBh\ +*TR?Xjuoֺw[oou><s_淾umezTOcwѭ۷ ;~yGN<|SϿ_;=]'ޝ? lwhWWw7ϻCCObH2`c2ٜeJ:o۟>ȣpFz{{~G|;͓Ǐg;:I;c'G|w^l\i& 'O 9_?=ïzj?˽+cc7'Nwvv_?])?/c> }dz?qtXgw><;;Q.ʗK_?P֑Cv6b?/.2k~m/f'?o~_{ؑ56>ɻ㉧7xg?{ ԧ?gv?כNg}7,mݯ?{yLvjjꡇ́iOv|BʤoCC}T o;_{ _x~Gް߿-dXin;jGwރ1?wܙS֌@g1:erh!q,2+,D"D,)ݚyC1( ngyѧ|ɮ]ܻ::}=}=z8K:uzWWW^:vX_T都}u豑u6t,Cʫt=َʪ9 ؼ}~L;ULtsiݲHѹyMzQC2ѝwg3=Ylf6ћʦc~M;{_ 06=t3%Ɓ/q{LW o~Rzoٶĩy{Ap]_58*M~)RO}Sl;zȕW]ujd_z;/{b>k֮[z߃m?;޶u4}qٕ_cЀ~8|Mo1c=u뻻l2>>NAӐa7Ƌ/t`϶R۸c;ȱ}ݺm?CC Y_y+ã7\sLXו{@vvAWoUXoyM]vWq饗:tT* Rt߸jW9/۩Wohَ7n~u}{>z7|nټyjr;a+S'N]/b۷mھc{T]f7_ַmݪU1ڰvttGK 95}Ek֯=uz}xFJB"eM(Lb]tfPyo/l+k۶nRye |綧~.BMتC/{+;{_z)cή8?|Ī5;r٩ 408ؙ{\z}}cF{񓣧7m7׀k+t~!ҙ.XZƲktd87ʳFLs:Y9,k~_զJV[79j{!ڳ7xhǰ]k2(~dNb5TCCz2 I׷TT2݀xa{%P>_qwC}%zLjlbtrlo_:vLK0;3;[nokׂ}]]W]yժUӄa(O:K_o)}'54u֭aV8̤L7o~7p &||pΆCkG92?8~X1}gߞSǯ_l&pӶ^~ջoeժɩYpsɓ'Y= {_cJa,`0C/dg.۰i?7]1\szn_g?~`J\7]oL`oi5pq2|*C?|ݵW]{kݕ*>9w26==6|E;.-7/B}p}}_g߾gu#O'b+y󖌥[>pΛoܴk\ajljƪeYeN:Mqbξg nr5Wci\s7|S.'g>|Gn SWgg NDO<.,mg.슡={^[o>ڮ] 8C#$L̾@ v>Aa贶 l۶/3k;;; ML};}ÿ~ZU1V~+܎N?]w??MlRݘ;`<=}!.hDҙO#<27Wznnv,g0$wp #'rrt '+$.MժĪawT*Pբutۼm[i7nزn.p\gʏPB RK̗eg{Us0L:Ie2t:Kdcߒ@WS,˼_|E8sn bkOo?/~&ec{lHTu\  A>Ӈ7s-[\{ٟ׾vztz0=o ?ޏ|p ¦Ö錡kX t_yY;91o|_gyzzzptک =^spY&mzF^S}/SԧbӆM0v -P!b>~ȭo[h(-M҄`{z4;R>Og?G:;L2L󤠛 {%P4#kedr]5|bHC bƐ<֭[?`)w}ʈTEgݺuڜ],> ~~͙L ]{jterX-E>Gۤw]?'? =FSM$pj!,2CKtA7c-l #X\a`[;?FĘhB=S);=407WŬƌ m7bʏ<&9v]ݘPo~ ö>x췾xW^g>~Dv}\-G^s_XޛIdh#=7NƚڬR>A͈[0+0"=Nqˆ|U/LCcnQ0 履~轻ݳg/26Hty.ܯGqxx!jn˦S2XU s { Q#F bOo|#1 SS *ѝiPee`6ɇQL~ w{?u'TƪCo#csFݦ%SV.X~\hT SKN WHk|ёY 5k;~y&Ɲ:W ݻA l }tGWgVgL+x(A:fwƣt&@zӧ1C9`s'zj<\z5 S-V>j*e@bK{G1hR6>099I7 "{9/|n|rC\G $BfWCU249񂐴Z40M`2{ {?7k~8f7M:9[labjhhln/ Qܾcg>_W֮[V:rY%u7vu嚫,:rJTF =; li2<|/>cWܶu۟믛 \kV_ڇ>Go}}7|6?7; iKSM6鮿]o~rrl#~grܾcӛmb|_g__~3淾@G|'g;-7p%Vݫ겷l|> S=9,Tjj T7S*@k00Ґ<> O|k&vo| w%vEt*6[oX,]Ll%֯_w];ع?/?;uo3oxoR6\&G?F\gߠ0 ^Xoiɶ(Ԭ*,O'&]P#+X{Rvw%@<44|>>)b{J; fZ5!ؾ}'?Ξ0Rf0eBɶwvPbT"=ݑ?N@x5כi-9W|7\{]E30)ˆn۶mvrhTaɑ8h\ūKak)L"/ȇkzک Rn=R뮎ܴ~uzmE׋_;xOP< = to 7Fy/J۬: bJ+qR3q(LGJ:*, ꅅ#s@t;?ئ "cz_ iRvf6l673UW<-k,FG'B}+5冖jL+=j:&Yq6gM3tR0wC}z @Jx:=uDJ6 ŖtKWf &+g8v ",+*iBd#,iәvl_͂+N=;ʊ&QƚBK<(%vc qo/Ukl4yرNJ*iR瘦BpӨvsNaaB2`O L)V\ Lzȇi#onelə h0Bu(ZZ/Vl`N7SeZ30, =fi)0>(1?Ea ̘LWd*ltX.i UFbI% S+ #a ͚M v/ _L,r6q|^@ôBTzw43<#egBޱٌe) 5, ?5A2-_RmtS® Œ60,۞Cv6ø(B7 5rX5tZ+EXKH TЂcW^yS}K%# 5Q{s|ʹ1{W;6t\l0T,O:Wяǧz $Q*^ l` gEl WBX;iH3(S:* {?6kEP-kc24- M=X)mbڀbc"\kؒ3ƄХt&}1JUw`b҄&tfB;Ju=LQD_Z#?uC(wK49wDF@u:VgAuuua5(h`P`]tߓɨX)l\ * L[=42L9s1Kf7f;6jnFA;t=jϙ0V7K&JKaCBX$w\yD IӀc`#uDQZᢗuA}Rd6& [l` MQȩ416?M:r&IQ&s4-Lh$20RB&$D*R%n0" ܘ޵ Y@ˣW'u K\7͢ k$pI2of9V_Zo2rW i$wDyG!M!ӧ7w0~bu>[?GZJfz /+.80: '/ ya)R&U'#[ 6-*`hǟÇ`.ʯ[nwaT\p*6J/$ slNCG ~臊 ,yY98k-as!En@=\DJOI,D[hԡdxAa0TIaZbRCUzod<ȅz3,&N`XAvcOF&J{CSؠbhŊN/%PT 1-%ÎHTExzUh\z}=614?Tt*&1o):X\XR^7*=AȢ.dXI $WSrtRޠ;z'keRO==K~rFb T'">5.{]i=|?{<'B'ea4y4"/M9p#R,t@84RPטX K [b6gKSe< f0lfYX(Z0 78pm;*;"e0F/1 ͂}87P Ɲ{00>:e{ z214="!`|# f1h²cWdR@b&dӶK^l)Ml \)V(h@ -*|8x5-*s2hQq|'NwBN1 m2|뇹;1)LsE)運G[ ZX&zMdO<b><f3NqQl΢򁘩"Inl&C]JEBL+FwГm،`LBno0M<1cl-iAzLD#NE7y#H 3[@BU4m7Bn"Fmhhub=`U4!Tig9X=1(э`$ K3ڃ0z!$:=)aXf؍A x s}Ԍ|-vc-ScЎ]s|gP]GX {«S,ѩS&=z'U#^7;:ѱ~zuyej8DuL&͛wJЃJN(FD[FF/.o]iڋnضm拷nh-]te}vOM[Hj7m|IoG':ixJ f'daBF(VGȫ\z*v;E@t#ʷ<v"ƩIƁ{S--\Kh7iF1|ݎ(LSLC܆I`LD(V `Sr0|X+z'BԙDlK`LM bFs 04ɠcKt/bRdIRdw5ى4 LV8+chpQh KqA4e +Nte&]'2a?|QB`_>Z'9ׇv TàS *!L}4^);PjdbH1M1+j8mQs=Smxf}agؐ9*P-/gDzBLg[ +,dФ3a -ii>Lan`>߁b *F(+MAcI GE*J3RHL*c[?zӪ yFt:ES;6a=$L3+M! 14D!첱1D,u C6mr A\t,R|4<+k48r JF0L!L0|D!?3f#Y{䔑6l`HEDJL¨B+bʂ ]jSk y|5a2cKԢ5%SZt-XMLuLy kÔ']S ҍp$qSp4\U8o1QU7|:Qia ^\I3M' tZ` 0 `.N 1Lncc+؂aQ6Uaɔ6]FNܒ L41]Wr H{@g{p0&)XtR\~ˆ@z{[40 љ &f%9HIO⍐|,<(xFA+h2M2ʥ2 h$o ѐt} ثGW%>^(h+P.L{&#%g8Gz2,MФȹפ 0= &3V]:k/@!`A#Cea`bbZb)%ׁU%Hg#Hj{}0ًY>P ^R X33}}֮M$ q&&*DL*ٳu]qruՇv.Mmڰzhp b !` eKia1/! 纀w *QAtja[9)NJ|:LR$t&H,">T <Jl" (a3tR;Hj+b7e*)h> 9@ uCF;%UN t;Ka1=QDje $k}QWBKb=NW&6"1epABkӠdSIDATB Z] `nm-@X8ݰ`߱Bz>s=װlDz.ƀ^ EmCMC>{q!덍jd17-8&Y"+X!^A_ɍu9;rY$&V.HS".pS-e 5h^ lP,Јr"Hs5@M8LRs= 4vA-8'p>F"'P")@PR瓕 b_91Ht% 9D4>N۠Ƣ#_!d¼J%l2_xԉbal捈K5a"J#*r *!X@l`.NhPцqu{&e_ ITz5-F\ᒍ a  y݈ -xt^Doc!5 P# G!D嶭54."KK&RiF)G j$ G=IdDcgj*Enp0l/0$ZaHz-"gb|9[\K(O37X9`Je[["(whe֑hvW5O5"ӌLBDfӝypEoG #>քb㶍7)}LWJ`!'H>GaLԣGЍbk9`Mr}uU1cňUT,:i% 5^4Lj`hGNOllUb]aFK"^ yH*si_AAyCk!l9}ts daLA8R`X:]t|% 6Vx?t>N\`NLVX,z<^5TR| ->4|QO(~`36zd XtO24#zTz>gu0 K jGGƒz̮̫n|!Z)OVEl22*@PzT"Kp"{:vHSWtuZD67^*4r}hOӏ=㣙LO6::Q'{g֫F^xaYR2r[1f@Нp}\XRgE ÁDQvdb_-g ?«0)[a&T(Iz[ 5\I_38{(SL*✟vo(1`Jxj0{pR}O޳o(4,3[tHY Ц_Fn, ?"rI5wt /iTBFh=pfQ1D:x9TB \^\u=0i:&*"Z.4Me&@HF4. o"K "_7m MMOvjt3BNht ٲ\H^D_eFw2[ׯˊMXۛ5B5ͽMMOp29Jc=]]yzGFUtP7S87lf]N- a \NWmۅ@JttDÎ:uۂe7l \T;X ;ů>~'T;r 3z;O|E[zz28S z/kU'n 㢙6zލVHi0AtgaakAjY~ݒ X]1۸np.?ŭ ד^ {z+v :!] ]_im_޶U|]zȇƑGy=7`G~[V$ȍ6d0d /{?HX)=6B;KS+5Wxѧ0N6 XT '8Y2@6P 4d TCAfWC5ǧ,Z] ʠH,/Јx"8+S WKAˉV'6 ADY@dՃ[(+0o64Fu^CQLt_s3_EA_ak 'ߑ쬕4FY }g&] :nGO#(,Ԙ@"SBvȥ=ӎz2z}=٫f#Œs o]elW 񬢧kST X/EŐ9Fg@=]l:ד8UPerrtOԉ۹cZ:S OJ!sbk[R" v̴Sҡޡs1. k15 :vwt Fʪ6zp=hnlBQsU(YLLtuw58] fXL>.8FI]=HFG7)W==)}-֜9DaG펌YM5 eU&x|gUT*-l ˲,1Fm7 ikhf{hzf؟q|ca` -l˖%dٲ֒jS{fe徼x/{/n潕J))7ĉsNč]gkFM-x:<# dJ>,\ 潬fd.zئMcc/¡Îr Q%)]Z!: xm 1 A{>xQ(p#R,]M3ˀx%k@g8(8rԣ~?r߭ۆ 2)zzo۶?ߟZ4zxC}laͻl3> _qǁ~=r-~}p[C۷O]}s{o~{3wpVf{>OTynpێ{{6?'r׽> wBθ-/ϖpn#CܵO-Ofݷ{{4PڪY|Cӳ=Cg7׻q|x{w}¹ӧ&k /?0wޡ~_;r>WzRuqSUMe4lO~w|f\Ot.}{o|R1έEJ>.ֱ,|aٜ#A.@jX]=׏50D9rR#=8iXe™Y"KHA Sc'/:Lwrﶷcũ]\-++GϽx?x}_sOܴm竧. n>zʹхw}w{pUU3Y;{XydYKKc2KsWLw8qP*grƋ/4eϮݥn/8pבS\Oxīf!Sgvޛ-rzt-+Bܾgx9W=vb|tl_wq=S`~{cYжmߔMgYOgl3[836~;s Ck uwKG]<7}#ܺgGE}遑ȌW=mlG;>ݏ}A}n[2]>pםwmS~;o=#z\mOĶ7:1q۾=۷w32 kҧRJ/줿$Ś@\kh-J:RP|u4ǖ_{m UTuhwk5r4nh:e,e/џ#ڵI_rE\awiIXԐo=2۷޻ed⼒ǧU<~n+؟#'\? E}?ŋnپկW'jH.ߣ޾ۇͭ[ܺW ü_sԬ;;7iSwJ'7eurYHx'yUzWpT=C=N奣G+}}|Z_ }-~E7J=?>zף#! ,y=ۇ[nI˝cܺWg0u 3hӾ>*;nԕ{win*߲US/稵;en@Կ..T]ǥUCͳf㷈[}μy`H9> [zӳlߩ:]KٌwﭻmGFN?H^֪B̸ٟ*ӣ|?̣g/^}lns6{[=9wZ6.\QjլXʯf쉅0s|%bmwmD Q7(945 fтOt"t}#@〮LL/w?Y(aIρ.K ԝZk(LXvJ9ʞįÿo>xDn~MX]^1_./꺽s`PlPa Tңǎk~*N3d~]*ԽҥCЖ^/g>x۾yaF3_B̈́{wm C^g%XfC 1.=vV:mY zeN-dL*𓀾Z =w*ZVf8+~ y W3~z]A\L": |mխu7bZ!A逨Du5@lfڠ.Ty[-@)ujtúJnh{TR-#C?|;~ kV]:2.%{ʈzsJ6 ,+SϜ23^*Y;رc9;_.#s3ԳtK%; ; WwgǥP+|箜;?в驸kYYCU-fRAwkPִKKǏ^>vSs;\66U/6ܳ}ds֠;$e`ppɉ_+a]sRM,ڜ;RQUR7\}^l(fU5Եzzɞqgyđ3Qs^X3ٺ'W8}nR_غ}ONg1l>ȒOdFKz n'LHe[ʅGr1,i=< k%st p3VGEX >Rl˦}cS3ka.5piҧDjfr!at< EOgz"%jl_{4wJOk,dg]ڹ|7 z/  Ssc쒂1&J_,Z O_|jgt5MOȆQVIyI&(9R..a Q{ҩ~'E*y+6Ⱋ' ]z6?{=###b-AMwE/~截d_WeW427$)k SO=&s/n۾\?8=oȵj/ (jxa+.U=?k[wXۡIĤ˘VF>( 7hLޮ\@Ŏm#[6o)/45vWu @)z=lV M4Mv|-&2m/z+&$?`Du2imTK!ȧ$A6)i³+as_ɽ}SӮݴkHXƈq6^IRH"5N!P_ غ|zݒfZiq1zCZi #k/˙b SZ݁3 |StB4iQa?Ft]z I=9cf~GOl U17\3t#Vȑv"S^I')7hʪU73W+.~л;DC :HR؊-BB \I0 Q9Bz10wo;s^]/&ނZB@N8芚UfB^Sn_ =mM=I莽 ] ed4Zͦ/\DJ8A^qHR'ƭ-GHN] t@+U+ L$B)D}<3`塟#SP@7v:n6߅LЇ]C qKb?b8M_;jKh{:vTK8bq 6} \.㓎5Ƚ .^Z9p!lJa]pXQ A? d KX#GK3Y $NrQė@LB0Fx΀ð0]z&"<%5j/P1uZj:4]TuftPGnfLoܝl:gy CfSvd("EԌ4D2CyψМ 7)hE6Qׯ |Qri(68_7ҋ|;z7e+V'7,;r@<,m^RjIO'h2ҭezmM*!}%SG_rffqQ3l1U:FBgSW%) S:Ez#BC>D@ u{hEm;yt"4B}IRܤ957FQ2Go#D/#U$N35ư2lq 1Bڂ!;-&Ō=&+H_Qr䛂|s%O|cޛx0O{o|!" po!?e @A;Z^Ӂ+]aкǶXf}tK b60pv t1hyD9i˦k$[4(8P& 5hdIɁeIH'cjkIf?ˈ`0 `@ 0_"$k"\E`WH@21.nٿN4gjԤ`%9 sLr&I3n1@%ȉA,6x}rD>$LF Sɜo*RvIA3rn>|Z"zC횝5Ӌ9]ӯWb.RAX:.jFQt,C&hXAْXh"V-'@rHqꄨTjQ׆ r_# gӗ&D)H )$а׈i:};;xnleC؁xry۾vN;R"C[~x9at*#.(iT.6 40V`Ti$5ۭh#8F78;!V5bCMDu :耨~B QQQy>?{Dy]w>8yGt-5 ~| ⌀8:K} ȟ^źJY6H-} ROTކXC-hڰ k4"ZOӿ4/PެĤru:ZHZSKAB8 `n;7l$t9011L8iDfZpNe8` FNť}eϥvN+8wB($Eu;?LķQ gY &^$BnѦ[ܝXC5_,`n|!y-bo$yflp ) + 3t$Dk95pen wNع'}G9Gryz0t h* IYBhH9$R^O?apmǒuE.PGGjƅ"*hxĸBHtFk.2(b2S1G0m ;/,iҧLQE',0 D,{lH DvȭW29J4{KØY-CQE+[;ا--zB)%uhkXZ="n )$B[e ZsƮV|}zU ?B;N6 l`%V l@<m dի`QmuZy+eU}t~^BU I*=u'@NZAu(rq@J򄐋rdk/1nbؤo-MNNu۶¿L+KϽCodkHm[./nc3mǕ 6qb RXIgjp]4@TT&hx+bi&AH>i肂Məcd <񅅅Xw޶vM/vδQ8=r}. tI=k?tA: 7`խ[IEU`tLBbR b)XHԚZ|tKAYiZs<5==ͣ7)z޻!+~ΧӒiǒ9Ap ѽ 仾9MȭN88i#+>H9X:Y&dgЭ5|r@%cyZjnY[-gVNBTrDn=7 GNԚaVRq/vSwwR FqE˛ Si HA+&O$T'P8]Ҋ݉Tkq\wrW-+,{ېJ$hqAyӈ'FS)AHunn-Ή 匲H#tM*FQ1D:hc58/7%/ŋӹM-ʎ4`FhJ@RW1A,\{9IHxR)tl-UjRZSVc*9CrCbV`a#+srtl gAVH3/pYr^=`:to@gє$*\BC>m y.ɓjuɽ}W0M7}םP&u/VyI(Ё%CRqN9ߞ7@#/l7NVS>XQJ59R&<{'֤G)$tR6q&Z5͆ݳT;.275%.mHLA}$o%ob.YqM'Z2)9c5h7 ƣ%z^] Ng&UӤc8(D ԌL0X{1I!D~8L } ? )v(%so1,RbHB ;A5@t ,eD9鮳!4"Rħhc.:sB=JXA0=R,dQ+Z BIMTtTog_~7K$?j$"{ x`݇'m'$".ƒa9q8"<>qb7g/WjmQ3b1i:?] г SZ!~,K6Đ\f 16Ў^ ;KG|ivCA,8YMu.zpuCk}C550 MM1jGJe/A)4́-lt?]b[j@ *cfz=P06nIO&2! OY81|my]|JC'' ]\pB#F. [Rz3'Lqz&iA1Ik~AԭF)DD*=X4+T-Ut  UμgqzhJ Ij6!#~iOw&:ʾ MP}3>>:a)+P! {,<R;Mn V?:,K/l=dlX7%QF{8긕4Y)Ct᜛ J )=(x&$a'b/A۱ v0lL3nkt}G444MGD,.?CUmZfZ=O7t vt=,bKUT\4j{~ȅ'{CoCw5U{Obܽ?j@][!!DmJt`Ď6:JP -b-v5VB!7y^]dmhGFFx2tO^}U5jje1"6lyf=ԓATookE\Q}  @#8qwwbɟ/eoϟ'HL%]p~P]@ޚvjpz⵲7Gy!W@/XW'ZəUȠܞzx:_ewα-IV4=Tɛ.zyo>gE;A89 0X)8 ^ !(MȠjpE'T^4 @!| J 4pxh])/P`y$A vJsk;ا#kt:un]ZG^OUM ( ]# ,ɺ"~ (!r^[V6-] }ga~ک/s =ϭ^Ͷ4שdmk\Q y3ci[-ïnMTi˓ nѕ/<]qXɵZcaڶsU`qgj*G1m8 &B=zli9Ms}ds} 7~܅p>F/}>܋MLzjBuA7uw=_7l,|e.ӃP 2^i${,aH,\=Cqwis4dn%a&JƮ]Ǐ͏|#\tRdY%xyM%=W\8P!'ˋ(e`B]Bsrj06bj[@_eaG ~USm-[rXTrilkRbؙəg{nrn!9y_늩fK9#kCG^b130grxj>7gggK<3<_җ_8N/_ߴi¾Gm۶I3*,..mIPNLL4P<5UWk1Blxg@j`tB%ISъKheŔbxZ!:#Hbh` م4=QH!F'?PL܇鈍.mHвmHH=n~ԩٹBOx~oOm[wǮ[ܹ}ׯʯ{/'?5<82M),J>y6r05*>\S96S1$J5D7#aÇ'*Y2ZDi{~?g?YӶggfffg'>9~m_|C>_eMϝ8qb~~1BPh-ݔnq*8^·MhcWЬ2{U6IFm[ I\V#~Atb. tBJѦ:DdmRsIt&Zd[lN26,56S\(D]Du+]'J2^ ڴ^)j$ ` B6(RgDIJ'g2<jU#t)02`hgnhXaX!NEݝ+莧zQG8g+Ѓ:vȫARcW'g2o<ޞ!(xlQƝe#ԵN/! CCC@."5X  vۆY1U*w8f6A$UVP :ؑ#z|va2|.w]4lkH|mfhXڵkWwzea}WժYЕING|\M!,!9 zFSUP4v\MiFsV{G~qo&C 0U  <7q$퀨[V 7˧ oҧg 54 _{7طLq8]’ʢ&$|X*Plqv;P~_ T_3?/ yU7+^h,/DR57tB=p6@|I!&2,U@x4 4ŀ)yߎyZZ9m۷:u?.^o~o{;w؈X)Өjp^8T@ 3_RO0-~(5hVpWKF1 PY}QJ^hI{yJ27! VFAQ Q Qw#!znM&DdmZ!|w@T~G LͷV(*݌a(!Ö|<# ֒a&udz̥S sj=c>w_x?f{efqnZ)yةW+Nգ-mT)b(xYd$"8<`@Ou_:/)nR[Ξ;|Gs/VR S'Ogylر>逸}ر<!v:HPNg 1 րs Y ~P9!ک)عk2EߪaQA7.Fs,B [zʽV&lݖcx|8:vuDZ[\lݺmϞ=CC[leZc\~۶aJ3K2o"M:WNKcpft\޻*UKq Ov%\v [,F(b,kpphhh… ˶nݺs.DlZun{[1Gv-7KÄY7o޹}{o+\޺w~~ؕ+w˖͆anۺT*f26&8 (mSdP299o䂦/{woZĎEZ9r4M(AH%ޙ Ьb@6`.=RM|U]s  d8d.L򅹹yӤo"c^H54 !`>2Υ1Ӄ(-߅NW*kF'ǯuh oaj[`NRDu+u7B : | Z!|"x7.Y@1P LJ, я&BМ,~0.=s}CEK3T]W4v@u`gB t55x0zv%v]Dkӧ̩_SsxdCZp~JqTW8̉r٣|4y[8"B8l8%,6]υ"x,x61Z ǽl-G8I.DڷrS3:.՝duxADܠQ:^uHףݖap,P҂V^sz;獞δ`*Vy.igF2}ab3̩yf-Eb8Y% ΩyP LzoAJ S z Y^SƦ)cd5Q`+zvDgԵlUt*a.aqpŏy~?mFaQb/N ĈJL#~0~6(wI`E_iy$~7x_h@SzBٱ}W upSn %tTRK%ҐD 1 wK tQnWm+7'NgLcdjXJ4 #h>?yT@yvNL?D!wU<&2ctˈ W@7hdļG{Eto'rflY4AxBygbjc~FuŭU-NΞ>}: c1l(PЊ< AWhNwpoeU8sjCE!%A z]oT-,,J%8c0}yl6{ 7ycs -r5d_piq'ªb')Nu@1HzaX7L>~x=q|RǪ͊:VKw?7s:I3:=CU~he#+jS= 7oS|ݧ{ρ1`VPSUM9OMMa/gL[JgcBB<=Δ9* X 6xR4X1cDn. ^mr]uvs͗|Loqs ot/s^ZDn!1Uwbn%etݬͅ.!6AS<ůg\եϕz5X 5:G@b4cthKhR K(Hieh`A5%5M-M^6TmC4!EX[,.ZSL]CԒ{c8C|wu񦐔s"uŖ{cP(#)-JUrVTw ^OȶRExck H"rxSu (v@a*z152NWh/ v}@ԡ]

VcM $hy0BFC|M+jv*IzTi}`۶Gzr905iƳPV#[!\f;:j qb;jL:He&28bkE\\5׻AH!mw)`_'H!تwCAEZZh5c<GWSA􂍤EdH(үv>@bMȠdWV4b(&B-&popr.po'N@4M6s>5qߞ/7X7r`!#FaKkhx&ՅLI*( R橬G,C,dֈ]YdK%^z5xf(+]>SR1|t@nx⁉M'1rqr=JeCyيgP-={Upl•TJ*FO&[h컙KI*4HT Q7jCrG3 eG,E.r$7H)T 3["׍Kޔ8&RS"R1'[*ΩLڥm 5K>㜐ԾKcFVZBx&t+"m+.*ߢ-$?Ew\ |cb먧B>AM4b;|p` NƮ!ơ>q˲ |&՟wC,ӆ&R&hy,y5H%U*1V9 Qj:=f?vpuX65$_R$1xW#RT `^ngNOjy4B7riܱq'-3V!vRt)zGzMlPM8 M)}im|H%I*19Eu0LH hX'Ahzvoq .3uaj-ngnsdxxI3OI |84pm]G8[V66 S̢SUSƃ\`T_m]o`EHe6W=n0Lٕ/3Gu)2kyH!F*^=c[f@wohƹ7éN,gc@|KW4C0`wa,;!RȒobESug;H$=XR1Jx7?J)Z=5A 1Rw^f6br 7ܽԽ@ !Yڍ8$Ĺwp*9کyZt -+(+,3"u=)=]EBcwsAOˌŇжmPkbTc0/ 'y~UdiIp0M .\V>`$1w+mE.98 keNKu}hu1K7F!ʤF|\FNnH~gt#koX:YahRЀ?1Hx\{0/aj "Pc o(~TD)IENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/device_manager_install_igfx.png000066400000000000000000011544361443134507600270270ustar00rootroot00000000000000PNG  IHDRXpXsRGBgAMA a pHYsodIDATx^$uϲU}ݝݝX,A#Iw P@htew$I㓮xE$$b3k{weӿDdUWWgtt?1ّaNL&]9PF$qt]`~-i*~JQRX;wntt5BˠgϞ|(֭E! ---\IhS4]vիWGQ Q 1Wlh(1J P2t T^b߷ %^9ܼ@Cj\?"W. .Rcjs{ ky1YJ@U۶f1MMM ;<t0rTUT@2=uC,t¸{9P\H$i.N*+GYV5WGm%^#q0<9`P(:* Ck?^L& Bq]&uܙ /sCOhPMS >rD{ZZZ(P7 ,~P(~U#<~T~@-x5q^xqvvv``" u񮮮UVq!/䰢T |2m9a91bqnJ%Ra PP  NFؠt(ލ%u$WlLې˒P&G*!+^4+xaǿ>C`/J!>crr=~fzp.{"'[Si( ˌ$NxJ҆g mt$9I_Ҙ:.1Q$(7H$;"iBϿZ,21}lta`g ~5$d=YM|!6ʧ~ ڇeuj^`F]M^j\-;ހ5js0JMЅѸI320l|^^ ]h)Suy(@ ; Q(#<`sUJtv5i*&]M^XedW#4WChmj{6&+A+A>Wˬ\ j6w5i]ErIډ<>茝+`;W80W1@ Ub lQQro$"L<%d o)ֈ7~T &oMP. h+)Xr#L@:*$"Iy_M!䑏?5g܌4'WQ<֌X\4+%(h;C쯯EzztNZ׺PG@ԤkHh!>Qy0ͼ s3<ĉwB߀3s ?Nx-m9,3E0 V pFԋ]=$ 5dbYsxFUO)2-ȸ\quP\;xe żaYVd>|hnn'ommaihԧL@UgX2UMS"e ?JC09"rL.|<[VjC~FXXE J*xŲbx<'c<#; d2N҈"Q*A y}B5Be~;wt微Bԁoi $/K)m@2|R7\Ć/ʡ|`<N 9NJfAhmM3܅p$#m9JKLS]&Hm {FH7_OǏL"yk/L\;2=>q]Ek)8Sm]B˅ⶂ^B'e["D7r8(/8"+{Ï=FliE2r#.k@~VVɰ%Ǵ<ہ.vJ:ء4.j1ԓ-`o%bo;ε/ٖضQ,hIRDSMm -hgX9/?[D,_y+B}_MN"t#0b:jKe^W".F(?<"D0eR!n0nn CϿ<0jp} ycw||[ou-Q#- X8SnJ5aq˚_b[(,dTEBqc2DkTnu~H9JU TBcGwٽG;C.]ȗ ɣ7,A, =@ B@,-+2>]c>P(KJ(QNF "m _-W/D"~Q m[/>/!zdU(vg_vBNxD2I@xޢǢƛ JeS=Y HatTLQS%/hmE`6!rm1- A*68QH&}ɘ " + "D(D+X}z*N9uឥٰLh,D*K!Bx\y/Puݴ]=k֮iNDP(HH(+@ʲlYD#^:wP}p ;>XY xz! jV(*hfRdzn!BC:{+ 8t锘q0{i0' CuXBS(dDuD 1t K,'8{HGbHD,9"\ۉD,RakAJ(F8E05h}ɥw3ã 7 [혝+rEC"Dlll޹s^HPl0#nd2?ff,>I( cBN  iZV bQNa B XӲϜ=wbs|6' bgGǺk[-deex_{=NG#1qL"f4*5?d%(7=D_$NY}_zwݵc;]('~]ݿwܶw˖Zc2L!B"ĭy$P]v]z%DX%f2ӧO_kjj\Q1fEq]]%H= r(9FX mDY%ǴBɳlz툎'-K9̙3+ɋ 7-NOOoۺ|mGOpQxST(>p^>wLX}xϿyชZY% ʇ"D!>hzzz/ٶm۶˗/yZBa{uK/~ڵT 4A !yu(K@ؚHxm\ADE '84m'M"8x\FTV9ccډ' <[zB^]¢\?^*ꪶaݺ_׿[o=3m]<_BheS `!B"D[qU| /Emݺիbq\W_y֯_eqec*Ёur#@ȲٙWN<573Ij:ҔjN6x$'^ ɅQYmAq{c-g\((HRYY6*؏X>sP#37㉒mPD"s614&Ԑ๊Iᘖ(^+?Iuú/\G{ZU\-q[Aۥᮬg$!B"D 6~Ӱܶ큁fmW\~AyM6577+q)12}6!|&NO؀NG_ka||ܶ-FP4fA}FO=4hx\ G=}踪TGgWs*ԔMh<4]T$Ȕ%I(<}ٖގVE[rcN~_~oM,Q8I05_ow_{c$xx枃6y?{wԮG-Crd^OwOmۺɎ`6A\#{5Nwthɢ$Ssl{}q9O=ѪNݻ_'| 1슄"D!n CS)T5wtts BKƅ;>115553;3KERtOw7loǡǖ6Ф|`Zf4uՅ4p8cJ*ڹ{O}3l;ǟ~/||;W>Fped{zn?s}&ޜD%tӏ?':rc vtWGǟ̗~^ŗxwwܓN mINB^nɣ㳥 v㲍VDq9fljivҫ B4@,7|1m)D!Bqoc4LUSm˦tSlMt \ Hn̈=GrE.iAܹm'KPP(oE,!$vB"LUMkkkNnݺky]wywotG[[T(eHb`p8U3$Z3gμ}g_Cw|;/O-ɏ:33K>g yޞg>S_=gw&Y]opw`UWu8yq??/r .8q4X)o֯Ou/|?|b1o;&&jJy$\ҥ oFkKO|Ւa`WG""!<(>ҒA(Yl4&XD;} j2+jN5P,@Z[[{zz{{z$D"zk[[kk[$r 4bPOrlEQl9w<4;Iv=Cw]0R##~d4KL'4MM%^yuKWG ËG2(&=ux<+2ղ(NOMZ:} =~_Ɵ=l4QbZm;W^wl!l6 B8U7D!B2eX,BvdZs{3_xJd![ѣ K7z\`A Q=w'Z?p-\(*HHL) UE&eԄUr\9;2|)IsE} ?⋯С#utzKridrW/OM&Po\Z2 D_T4]V#PJbTsHAQY4xK4%\ώDţ>?o9svvv:~wӚ5k&A^!Bbb$ơ|.֛o?򗿲zhU[{(֯{رڵ݉rpQgE ; ?t  T**A'~w7+@z>GlN`L>.#QUպJ''P]o鈮Z!ҵg׮\vڕLYL\Hb(h_2Ο=ѥQ`oT5ES=-30;5EӉ13=h݂@h*e&j/KR֣,C!&Md$'US6Pg"NX,-ʛj"D!BXRdݻx__kkk$aCs[kȑÈti B/`jj իb@#HQ(Ǵl6[,^259 鴪F`PBa.3wRҚdd2Ha/YߦrOtݴL%M,ͷޜ4W+[S({o׾4#lS׊QE_V{3tvzȩ|m GF'N<9~"{:9ZP$0Ο89vwq}yArk>cwwuwXwnslo swx s㦮VIJȣeOOlwwUYRU6 YFGF''>'bur*S2lPUK/K/۳qƾEQeR/Mux!B⃀x,%?//vuuwAsL&׭[/oڴMdOmLѹ>^1Mĉ8>[["{%X1RV4TS(cSzo60dG|>gFOOWo_/l!$-[RDG-QTI MBgӫ=:]U(%ziB˵&ISx%A0$)b2 k8뙪,n `LēdZ|*2sC\Bq!*J333Sz&''ᙞF8lVDUSIİ?H<`],%f~"CGZH@o? f+ 4з~TYmE! \GeLlDhE (=*kiH܍yG!cUm\O@ *E`cȟB"D\ E6#0? 6|1N##=C״p}̥uNⴻ 黻c(-8`[0A?sE]?cC$FCLW$艝"ћ V A=p""7#%#ƨ wVgu䄂NyPĉX)$z F "-m4t\|(CU4"{gC"D ,&'Nj! eb1xEGsc\w/dh04D Q8^%B+F J@a,씁D0-"c *Ly@&BoA\ Ȫ麖jCJ.=I")( cHR \[ :A"q91-%ٶ(*[TKQaDǦ'$y,{h*)"@ ZCB"D MIW ⭋#mٶxKi/Kžx1&h/ԍ)M#(NA BĖh=S' tETv#ʒH! ۮH 0PFhE Bz+@T12P( Se$u.D\ǖ5qQ0e1z %%)/WUlQvm;PgI%Fz"mEl2R6;}[Sʁ"+@-! %%!BѨ-Fhvkp%-lFhx8 H b[L]h"P*@]C;ғ5vņʂ=1 de?8&A+4ćmK+BdR&D?eABUI{@2YR5289c %IHܔԐ)mD8R0_$!2%E"b@? tE7ӣ, UDPd66eU\pD.Fh?X% /v렡AzոZ/  >FOi3TW.]Y3 ĉaO?t: BEkj1LbTJ`{#ƂJr`qn~f>.5Ej)/-m>sC^{Z5ҭAC|ۃw$ KePB oXxz ڎS+vJ!+ޔTtŸc -QV}sS Mau/-m!BCȟn_{l|[ZZx= i-Av^bF/tߨ aEҊjD_!\lvJwkKKe*/W b\C̣V/`h;%7BGGiBX MIG4= PByE^+(` O3~UbX"2[#WN$HB۰!|DaGDmHr,hC2OHWB3Z K N?b" ҷIxbR.X 2K C|h GM=빏jtV5su -@M+yw@zFB=b u+9M߆\o-zWm6 ɓ|ӟTOOO%Q^}^QX誧^n %nh (-rV' پMT+ƚc^95J^˶ @4T{ ¹.rꠞθK\';5YL9J"b L-DME7k@K~5X.BU_Oxe+^қN,quO,{abԔH@fm*лlj(q??x} eǧ&|򉁁@^IY R>mutN/"4xYP'с?0%m/G+X7/y`AC#reA_v\+ Q5x؆UhD߷7_Ш,|u-KOR F:Up}5.. <~ cNBw=zPcc#=ի#ʣo5QWE8҅4z P\= EKL\VV nHxis_z"H @CjԑА@pK5]*^?]=rxEhDzյAը[`%n21]tkn+A@)r5ZzKm" ?(]%Rׯ8e%+NKB-@Ƃo'\ wbs Wk },_BUQccc?Ut]G8 ha41# iK/^|P_uY*VJɸ ]" ^䆰Lj<5><15h5F P\`!%r֤cVBq|zW`@z ^)7Dj lHА|0T}pO%Māt  4Xo(VS(Ap Bgt_?z'螤y`3{B I]2,]?n~p[`-~=২~MU?aHWJP#ت!2~njW -FU5|_-mfCtY|Y7_V5k 4~ -B`u/إϳ~BqeTBxl xT T~\bR (n*B=ztzz'h/fs+¯M&Z)D.X7z%|q!5Hr]5o5>2H^ 6=zjoFQfmA1+w\-Xdžڿ^+ب b-\4f^ըA%@KM,*@\xd^Ǟ^<5MCL գ]/ӹz=MVL9yM6~ :ӗy_(G9**,XzU\[.cQ `YԸޕ dj =u сjo3Rb9ې@m:u9yk$*50ca]UkM>e,(S#ͷ)Ҫ"_:v> o :y:*"4z_nFH` x4@QP1$Е׃g#2L \I k_'Bmq&&&\_:R\)v:?.K:BTSPUΏCX Y~A=GXyYvT*jK.y=64aFmUcQՍ%Ed-.vLbPD%_@T A@ -F` Q-sYòYzw#Pdy^o䝧n˄"َM0 =m)"ж+Rېd]- <v8CYg>IL=)=9a#+(ڂ@(g,+1$E%H$V,q OGnR<!|с;LWt=,5OF%וʈaYQ =9R8۔*\Up QZN=oϮ|)hZ۱CAi:TuDW ?wR/ 9W.n[X*6dEdⁿx˰y>q'pT]veg.jP@euF/A~BZ,|Y pVl-x,T:Yd-_"7_Bq A.:~BqK׼J%[j@yKtv*&T\ jb薚>jrǮ9D̏ʲLE!K bwJ+N8`&K2)Œh@>+:H6pٓavkP e}Ax=+4T@ԓXA*+nY*(&m(q`!PB=K^CMɁ4pB֐@Jt0 FA`5Ui`7$aRY` qJijb(>S n,X,ְ$B l!(#9,,(D(5'IZH^2_e5BXH(x#g)p:2Lx5$DbBc-ܴE]5#hyθ$&S>^8Ib`!;2x=TCj׿g/5X. 6Է~2ptV/eeY2M  eML`hf)aTnG^:BytIc?Y:fȂeBCuY<~8- C\F[#0}C?K.J(. ($0!5V.1&3AhHc`XA'(+q*:,//2,e=/$c,G;XR#. uDAs( ɇ*Ӣ `I:™P+Au!)LIׁTDDd>*ĕ,ʰ !R?1D0%uqfHp^押gH/ge [fX!4v<>f44KD^) ,@PaPB4'P%"sW#0#ƟmN,2sT 1siz !JE LZ/zu DC:K\O=߷j ծ'9PBCM lH $Lu%q=4T@Kt VD)K"RZ bR4tqrѺvy5S()rŨ`f(1=D19ͥ(,!y2))/IdֈC*- eG^j9ks(ReJ TuDAGFIż-CylKmQv$'[F]h"AP'2aPͫ粁$.˅X46Vh (0F 4h,b .8@$zZ4hmiiN(H`*D9o.L,nuע"'4M ,Q]7l[9w Bj>"D `dШ 591Y,*({ lF)BQ83ܜ" 3Nd P, yX0UQ5MkjJԂwLtFlp ҍpxq eB&$ *hOѵv

zǝ}hIP"jDĬRV\ DPX) *9Pu c ~C{#G;( 4M;b[^"^䪢g%=ê_f")d9aB]Y!9œOöDaԐ"HUHhކIMSlEmSx+@|hB Tv*`D׾B8qGZݝ(gHO]W,5mۆLd඀͸@]W!Q\VCbzSkK)ۍfWP @,S:=3}ZrQMh\\ TU%'&:CR]6,ő[wڀ 5 `ct#vrQ(~AxSe陙ٹl0Mz q#2ph,)oOH$@ Yc]BQQ(ǒ4T-QIY'w!{ҞUw}4wvǔg6X0$2lhmb=4vLPQTAci,S V6LQ u)SIhZCb߱6DDN{'母Ȯ$DCT%@$&iy* =)icoSJJ:2Q1Ѥ4ա*׀.qQ(ѩ*ۿ;SSS (/%]b5q(~ف@9O‘qݬ6\zI6ψ#~P(x},H_)ր'4,+;-=|"d$c˪S9-͒zBҚI⒢5ՄMeK! vDpcS, ~D"bNYc -8s6؎`l>[( ~#UB,vѴ eLCi4G\lE4s)O Ѿ/vqr˅WKFcWǮK\)^-8?{hIfEcP`mѐpc>Lk7t `?99۩/};R(ėPs (ɁKd<n@"UGm3)SU"sjI{){S0؍I4<G (&szc2bMShjDti/&]zTJY&e95OЅs?3,t` v{`@} =sظ-m=W uvwXݣE|qxxDrx M2a~d| @D5Rdڙ4g]ʟr-v5=;s)T4h$J̢]F:Mȇ MIxNֶ1 ޴:֬kAdI`"I+Yy'3*fL1!KEϰDEmʢgkjd;S#'Go~xi+1ՒDNJdĜ͛bR<}sZ𴂫\d0B6&iMlI- =}˂zRyj-+0G:< n 9RWBdZVw̵FGGmpBUn|*;y4 l'>-?9 -"=mS@0L#@28˪ri8jFa!X,#EfT\*q0*fz]H祹z!B]P|Y,f2 YӛҭZ$^2홹8S6_dqDI"[bXLUS!_&YPMkVvf$o2O><M f9E4XIӲgf'MÒi/5)*ezvG¨Q6؛ײ3٣Ӆk1eZmS:{\:򊘍ێ'*V`i :ksh$5ˑEcUP4YUĘD0j ݋DĈ.F5/x LZsVu${[# M'ldbD7&xYըP7DAp+ɼ(x$ņ #d:#RH0G`ڂ%E;?CaFwol>ⶋ[-MӜ26-(G&ff&&g2\f.;K.7 d2KCXAY0|e=uƘ9Uʝ)\wzﻇ̍^1%MOfNOۑtKl\CiD̅|$dUŔٗ}rsgҵ|bi6y6z5zx s)UTDTĒ .mkͨ~mm}w$RqUO # VgYT h\5X5|={g`6T;RXI@/Z|iFrLNN]6͘H1I2#eaN(s.]1* GB\b<8p,%Gyhݺu׈BP,[' 8lFô ڙz{ TAtڰiC:9EmR?p"Dv/3 :*n"zBɴg2#%K&Np…Qbt6?6372xm#6l'[(d |1D_#GJm$'cˢ̎N[3K3dz34}BSlNl݂e5ETMmh<F#rƬ-I#ĕlI+ *ܬaLv1o\ۿgp=*H<4V̾e5R;˷9^&$~,0YnDR" AcRx˟Jɶ_~WNٖ_TM/ܗgz3Oo.}w(%2$Jܻh\&c)㖈Y/k!XtcpJ4tduFp}7p~!65stR`6#86U\Q,˦{׶nAǡ*犹l~\uld+1fCf bڞ!+$m iZPd'y{6_5[ȕ33KE#_ͱ T(ҍE-n|Ƃ8t9Q(iEuFj9l# x ~lHe$A8:c g ]>F & ٦0u'/Gyɦ gt;Cs%#Ë^9Kba 7]Ʋ985uuvzUuUlkJ;>m07'殎 NJ0yeTG*#Kl ̖Tr 3cKҤw}?ȃ_x߽M}zNĈhqMkR'7CS_oUՕ%[qX~g~矵-sllX4k>Ѓ)*/T;2?T9v$S"6g}Dґa33E7Cצg!HIL󽉉 2ITQ]ȱrii\[?4^!@>=)#c##yLl]q1agpٙPv1 tw)s\1;shVc=b[hi5Y[̨4wKeUldz1{'Z=I$U)&F".}OC=l蔋;=0. % gzwܹk>PN]ױvn|@=u&zYYtuD|AyJTnwT~ + {~GlѣG{zz`͏mmqS=ݥRٳ'8p#G4M[~_2("5 Doh(s`9N6_|ms.W"B_zyp%[k7 <#_z7#o=2586ul1+䉊b{ȢOKE\MrP픦1cZaWF.єlkZt]޳;TIQR,zI3C+j݄5J{2՟Ovv[Ը$D-!nxڬإv޵~ckk\OVo:Wɤ lR^ WL0K 3'P6l|;6mYhM퟽5m֤tyuz>{ڇSN[ 0si~O]wޥ(J<|{li%F7T}jbŰtIOΡPԭpP7/\Afff/$:k䛘fAf]W<ј$)ٹE#X__&sX$NkT*b,z$8#v"v*Np3J26ky8%8%0'UsPE.l!B|[ xRw177cǎ>h Bٖf#=zpG' KIfscsӆd{Ւ[Wțl)7 %\$WP3OύOHtE .9O)n1){b.VSґXSC%k؞Iaw4M-˲+ŔJӟE_vPQ͜`,[q6)0+յL#M)iAl_#v-}BнjGkeaN} Z/dITY"4GdL' B('䎄S|1oiѨA,ڈQԔxg~7~Ww6lN=z,0Qt>lԬ5:)̚*-Jg۞x-]d0uuu~B\~'Ͼ|aY.ђ.fh$H*!P(H[EC*ڤ"JFYG0ZrMDzF`Ʀ.[& Q-%MHD@PZQLW-yr;]1[rfLE z9 In oXuz$. 1AHN{Ps%э""h4.xִ-L9W)"+ĬjK̨VR쬁D#{֭[Zz ta J!Ԭ冽-)TMԂ#6H sҗ%b>;¾}w nذqfz}_^zh oַ<|o?;5VPX4z=wݷKΝ={ʶEc+O"8S!If%}lj?ydDZ.LLHjĬC,* @/Z@h-P:[!Π'T%3%ID_ѶS__[o?to[cc˿O=?ׯ_}_xg>$PWA%X8ine f, ؍ !1#[rlUQ%a-b}Q!B؀n\WE^ Ga&08d"dGNI~b A:ڶz<֮^UWs.e3^HN)5`6fDgN[f9Ns"7'(*0X.nzوPHvBқDLhѭH)/N3gg_=+}NYm!hi5H =EA&KB Tx6?妝`LvFgek~!F&3sYO<9Fd9*<͔ciŅhdyGR`{|xltY[~}{Pz@ZP##=ZyTM۰J5L{ߞ>ћń.HyO00EdG6 Rm9-Zr0PQ1pȅem(`D:vg?<}w5ˎ,TDggH=wW}#k'+}#}҄8aKx'mP+^o{0Ҿ%z08 dRahJrwnޙKp5D]Gr&ɩ`5mMm 9j ~#(`#;b⬘9>yrO]ek̜.ZfQ Uhj-QIb6 Vړ"&Z$IQ]Ew0dH 2~6;c*R>s@~tu#ҡE9*nсV%]'XeKka'Ԇ_Tx,l;˪NΕa<[Zl~M4EYǼu}vC݃=I>3F@g|mp_itKP֚P+hBp \#=F=k) "B@ -K #)&Ẍxٚr),̃&IDGpxnS-CKVGRZ9bKGc};鈧Kk#ٰhpOh(Ef%da$BA:|;ym'P(Č=:7zܱ*XT7qc" V~BTAm[-іw JHB=QM`c&A黜 Ei) ;[Zl36TŲ5aٝ3 Ssg'3\JȂHbDҪܩ띒<nLu5R5ц!WhQ( %۲s'ŨƛU9)Mq!`e+Vsj f#6܂#N۰2}Orh(G0z61ah S6K+&Ytm$j3G*0`Ui1)BF 'Z( V$z0Q1 DD[łR݁Ua"KW ٠9xإ(7\#mHBq xBYaJ?Q-ɫ+SdhpZ(._ZZR-ҡphC;1ޒ`} HJsTVM>=ɱ?!Xu% KWc?`N͡5QMV:XM^} ֟ LMOONLJFggGYUu 'BL{1`:(aZ~LA*d:;7/Elֵx-iF[KoB¶C83nqJ.(DfdڢHx$,IQQJܠaO/9&ҫ,M hId GDaV2Gp2'<5K{@BH-Y.tLI$H6p 8JZ2Oհ@ْ *ۗ418L90φע8po0J-tdb?i_ֆ|,njwWyĚ;&5QljB]0'N?#k=Nɧpի#ɋ`cԋݐKOW邐rR޷ n$a\H&TKKڶ@c GK]eW.y ({S@RU4@tݿ\8E髷.R$7Pv HrC,WOr=,] 1553>>Q*;;;S(,˰9qMSG5r˺t# q"3 -z8D1&k& m!=rd>ojt ;.`?a|qǬ17dy8煐xJd(rpΑ@ "-qqQno'6׿ EwG/ArkJX*hROpܨ~DppEh </QldK 02dg>d,HRǓH lȈ#[# <K &QYZ@w)ԭ|En/ U1sЇ{$I{<"^z]aX} |_J6,5VemH܁֡z+01_N[:4g*HSG  ^``FѐzB[)m%}@!*eV 1,~xbT2rRJ/ vPCtMC JSL ÂFatOsK@* o^yk/I lejԫF U[GBpS/K@Ի9^z:דPŗ [ v{ptEZZ%V"ʢRBB|h=,בy e[eZPCWG>_ 2&n"FOR#0^Ir}Sŏtpq+[F^7nچZE: 85NjPQ#x PHāhbϬ\bno>?J@ ՅB| Rf.Xr!xbp 5u +6 gX<~yJ_ ?z!x8OP Dy? ]1ȕY ?z!ϳ4y^?n~~˸}۪~" Dž8f+EC0T K Z?ni@zطqp9h~" }POm^qep b|u\Yqi5]%KIv#j QdդdWe!}Æ"ыG/wse-~Bq7_mJ Džh ^Svqj- 䙆yĉ z74 J='PfMv 6Zځ _ Ia.ij4)S$p(kXQyCs-HJ\`{(z:7$#[#-B#FC7`kj4ԁ݅YQyXXR#q x2HJKT`{/P_5vŊ`\UF4K_wF[#0%^ߞABAdDž.賐B 566?DP$d#'e@VeV <)?rV'7բ;~x 82_\Laď׈R'AGW:RJ P"\5$b"{Een{ogS\:W:u Q5rdzzWxG`y$D7+xaC\=@J@=,# k_PàPi8qfxBP!9뀫(*\WM[ᅢ+?gY e(3#}ylF=X??Ia9՝ 3.wB쥋&&&D#RHB\&i̛O#L%UH29yD %d= 0/ N Ns#qcȏ֌yl0FR&Qr$s `[`n-o(#qrЙ12ˠڮ\2339:::22R*NⓉyrTz<^x]T , -`>Dw# G/hM1DR/Z S/{Q7UayZj՚k.^h"'|H܂VNcH,D^߅`e/< h5[DT9nF1742!>AD"Yz{{ED"}}`ZmL!B|Ш]ĀnE}hus ^BqDOn20h EOwH"qK!+Ux?{ ɂG_b?8`3"Qt+6Ţ5Chg ⓉjSbG9?.KOf_XC>jՠ]ǹ!B,MYv|* j"+|i*GpdBXི' x쯉]֮y&_ KLVㆺWXp" # (ز,EU^x="r0(#ܱd!>hUu13JϿʨ7*`%ϳ@T\3 t0ldI$V~, i]XĹmFP۱(HZɸ̃@2ʱ"r*46dnɢȅPA=˫=أ'" D *\ 0MӲ0BBdmQi`:`0M#  d!‘{hON*%%a AMhPNF)ý@R϶( :6 ]סa,!* B2L+?E % . 2VJ Պ|GvA%.ahL/86':I#r,rG.v)0H}X3Q}ccְ |ѶDId8Fc1$gr. aEI*hY(*XVC%jܺ ?Ī"+1 # i 8:n!>YQdvfoѠSfppRf j^4HU, p\}v wsZHK.yrr?NQ X bq lBڄ:OZqcn 0Q.WǎqQ+/9rtzjlyK.r xs)Zf0.9H,@.[J!BXa>f֑t׿ øzѣG/\pk׮! a@@q &b$*  {K@9I쇭E!#pd~߲` 0E\$3Jc-WO#]]MMW^E 4EG+W}k_ַuM2 ě biaf&V6**o ^---H'-cul^|ӧNCs ]#2r+@9;aed28"1Fj) T r&''<(T:brfV?A| Ĵ7 ?ԈKO h]X^W J)28JU===4Ev[b6t5d#Sa)BV`S>zOƍlKQUhIp}x|㦍]]}}7lUUmjrڵk/s=tzhhh &HbԐk< d'ՙ3gA:::c(O kk/u]@O?_җCwvvnEdx_%tk׮mڴiݺuȘqD"M\nrr)1BUUoΚ?DV6۠ {92==Omܴoժ7nصkG03 sb|  l}],P&7]*0Si1Cc? 611Nv+J\0Zdf!I5= . DӴ&''r,s*3换xm}6WIWXڹ}癳Z;F1{ԩx}a5sTkn{ͷ>ppsg_jZ=}Po;0pFRݣ/?~'.7pݻw'I'۷67%5-vuK/mJ叕x<ݝniI&Pyg0-0Tk7=) vr[LXo5g=qJMq[\17[tqd:?>[Dz}SOO.*-Vx+ubx{S"-QQhr]EhrUF2lۚUz3Tt=ʵ"Qő+צ fsFtui߁BIT6p!Efv=ǎeZZ[Ξ;wU㗮╦d3W\D"---8-"D7 kGg˖E0ծE"ѳggf2}Rԉ a&3O[4յ˗ι6j z;g&}¨G[cW^9}r:֦j(gZ[RH)H;9px6oe抲"M\6<Oљ}+z%BSD=S1'<{jwϪ; O^ߚ+vug.;yJi۸y kR>)tO2ٿ_:9hz\6jU tx9gNkW Ģ>(#ޣ8k`{!hǵE4ݻ}pLw ;nw;;iaIQdAr$ɣ;EwFuruo&rSru`H|dDU(奲 QPeoG@~ Cc!B'zz GKmgaL{(\fL֜q|td"%GE7')Uc17 8b nMK|“\֫h(PRz뭷 =sLgg[̪6TKw߽f`W{KLoڴ9)?~G|/<;Ӈ[5s/g?tzZK~c#?ON8 ?XY8 "mF9~ԵAQpgO^nڵk6߼vhݚ5z$d"5C&'HSOޏ  uCC6L=twӖ/|gٸƳ̃ Rd[^%ɟg}'{"o_l9w>3?H@ի Y7؍Kѝz" Uf0t?333hozTo`KK+N>C}}}ɤF<3A64Y`ʤt3)`U⑲ Ģ?~ضmuѱ . @_K9njkkcӦΎ7;;z{:;ssss֮h0k?+WL42<2=9}߽Zdž "лEOVS\ڪ6rQɶ:m_|ccG~>}ҥ|ڵx"q㦶d"zw$qnMq=` '+\Ύ5Cܕ+#LcT:ڻQ\V8Y5p֠2B2QBU;_- X(5"DoWEp4щHnTrK[Jw֛֕8YL)Y73qJBuKOo=9%Qrzd#qF\v,5Nٱh~/^xa-44MC{_|񇓓=W.UT&,˺F_ dU'9DQdӱ33 9sqxfz=]څZ$١ ɉ/:8|;پc{"|恁>OVUb?сssٙٙ}=z]]]@0E,)0j*<0*$`h7`$ASݘ)轜Dq5w'qdeawG"f$hd1k&^@T(2Ma2b0Lkfj:~sgz驙dSSsDJH20!ꂮz ]¯5k$8mgicxE`5<:P5">:i;a B!'ʴ >cbckmec3C$Z. (4fyɮGG?쒓ps {\Ȋ.[,6qAX쑇ZzݧO,0#|qd3)qvm쇾OS4-8NLah9u?}W/_g>9D,Ї],7)IXھ}X{{;;ou[G}$B,z4!Y\}S_*L?_?'/ژ9idV6 ULX,؛v wlSĉq(Tr{s[T9Q͈JVTUSTLA4<+ . TGRKRjΕ,-lL\,Z$KP$7#TJw eeW\++m۔L]tG}Pݻgrb 3-zۘsYUSTM;sqcKGnX}<;ٺhZF<J͛)JYVuX*B"DOh5H|n||,;7766W^Yn]/v$I߷o3`ߚnɱ|JG"q5C֬^|&=Wd֬3Q_m?;Hd&װuTg<Qhw%MĄP P3oA_od~+.AG4@ky{4%(o~-'Ƿ.];ޛϗYҩS'gァUgΜtopuQ]ŌG/g`uC]Ǐ{{-%UQ1׌b4m!!B,/ Z|;{mw_z'W._흚}ͷ߷{GMNF5kWd"GaF0JS-ݵkߝwܳaz H\@m!Ѿȅ}BUP-0عl>lQuE(->򩧞Md< Dcitr<ޚnokմݝ]kVDle=mذUi7,OPJ4cOeÆM}==\,IX588߷fT0Gl}D"$C0W_'Z~S_zD/ T5t[ǺCd(QઁֶTgGUMr^5䓏o|Gww5;:l޸N44{?a@{OX}o Q3fq#Q𵉉x0^яOD:;A,cGjݳgp`@zyض,0?裏^uf?C0~HsCQ;"2-ٖAU 2h%]ZB%D(#ܔ(//8rT$ESAJ%4>HoХDL۬uϓT+f j-ٍ>kL%!jPSN*x41h-Jzlt,zʰK4}ܴ3Qv(JUj^t㴯`ھU!i#!#1@˦:8 jZEFxK(^rZDj;J(,AK5A9U ؈+gwj&z yB8g977؄`f__>q}P_uFrݥEH]HD7|sxjZPaRQQWi_[QVBa}5YEVԞY=bH&c3e32)2+þ22*S:v(e 6A\A "$ qF+%`6PሹR.ߞ hۀhC<Pm&c /0WLSTEѧ0 k:euXjkh# / b/,O8Ԁ#"X8l0E&LDȖoP,{ T].4Cx<†v. lʨd"!z1é×ˡP1شq ZäE>X,`ДX<[^>rR,X?Csa)0̤ij̨K_HuliKE,aO1t]!x,et4äj5 Nڭ vr5X>[bkMB9lo6 70hdTVrr!#nM#pMNS D/)_qgU-}xT6Ve*Y2m1:Kz900@Q,.H 9+b)0r(\!L r6G?Ѵ .e"btoHB6"=AX(DS'.R=>yPW%#; 1, ~" 2 =(k{*&<$)p]_ Z< U Ne@D<]ӆ8{ѹv-7'z@BEn#"S 'YV\B, AT/hQ Ѣrg}v5=C4C=+&F=%-JU5 _3(2=,ΘZQPS5Պ3;v㎕2M*C )P{rƯLܗ!ATh~#!+` Lj;nKZa ʆvl=GLg"E3!Sʋ i*Y|#RhTŦ>Q%ҧK v1 QEcXZТWJ鲆:SP0a00te/ W"48. aO{iGS"p*+ҬO5o :ɶζ`<NGfͷP9F4i !I?(%BdF ?kaKY miUΠ@R aq np,&ec E(+C(f D`v+uX}7؝w~b Ui ,@(!nOA }=?ssZ'MkATfVG`j!׉p֦gQwH8AlO"bZ`3Y̦r+;W.7WI4iU_Mn5 7䘭0Ɔb|Å,j8Z Pt41 Q1l=0E8cpH)ZRPuI'd!~y@ @C*2,e k1mmC̾Pab\"9;3]q `.t[C9І 3B !6"Ym!~keX>E<NS@:BZvQ9#&sJ>JsK@V;n!+v<0u/zS0uյlM[[($3 I#N~ jfP,:wh\(cƢP/S0(Qqn>.Hѭ!`B iN&o#" 9 p;2Q4p y Q4`[F)-sJ HLX#H柑+5H@I]JGi@D,|=iHHUР:sσ$]'k YIz2`=qf$g\VܨWh;5$j67bLj|dZ6a.NZW `;K(nO3Cp½=cIbMGBID݁BBEhGL t@j@VXk!Mru D |-_Nh`R@P ¸ 'XmX1jzZQ ml Ld(N`Mo߀"k0 &LxC:f:_ $3ȵ@W˜"|G~Âq<3<=/+^^Bs8p}Q7J("يb 0!32B~GĐ|p0ʹCF.W&D!= ~㚈էk%Q*)՚F{E͖TCIJ&3S\Pˡ ~'(>;G6h`zvA)ĝgb]䲊O䚊MBZԔ7/z)UYl=_SV9@`08z%RS[kP8z9&@H.ć8rΜy| sq94 %VYaxaѦD qqH{u-}\/%4p>,C  h0 u ~088D7Gr “T9WZbư$=N8h4G03C(璑%11)+C&B > ?s ހ,eEAT"50'_~]vD2d=d>F@{gcq6İ*-{-p G")sz2OW$4Qˏ(,WFQb:~ԦtLZP(q&YCp>5Z^3hgq*`X,Z~>Eq Ql LC++ڼ0=T!c0 sOԵ֊;3=H9qKxBgQu-ӼfNa:a= 1  ,W.8  9:d 1iqky=\\eըnx泓Gp*E,bpB]"ͧ߰$U(⼕T?KT3UI]BH#Lp5շ<ѹk~HW+Ck*6uwTBU a*qCO Or|V _7n|%[*D$O&`dzME+Ia!RԔphJ,jQQ<4s#(,aP@ @ e&KI P9d.H({ /'N@ "0WgeZDzWty(]K"#|nX* Y P=rՂsiOWXoWܢ5P-YrlsfRwv4޽aG[zMu!;q2/YpsίetȅT:S ЯZgUTpO)œuRO*.p\)P'8}! LNJ1 @ Byya" 1 KKsپ▯i7/:.%uE)!EW}yt'xDe.=qŏSQpg"18g,k6oO3šthjh`Y S讦X30b)>y8TyvH267Umj.QJRW bdPKx`$h>rzO(J֣.:9S@XNa"7;3r|fұWs#{gw =7sv]񓾓WaZ ( ~_vU XdKl??f>ˋ|bD_^$.TJ!!W*.7"]POuEz?PFT %u*7D`hC2c[D]?y!7|P|ռ5-s(s|ݺQR17u5KoA1֣RVZ-( $]ѠT73! Eך.Fd!P!ѵ:-,44JR9TZHRveђ sXIBHxKdX#^*eKG)SeGY0a*֍Oּ\V) )C 8>F8z?H5pXiQSKZjC"Rg\wh:EpG] 5W]Ut[U7ԬUBc%Unb*9|O|$FerXB>7AUhňij8 GbH_v EpDQ31a I]"R]Zz$ 0tq8(,tHCo^cT*M%.;p!IU)Xt!EtE+R&_G +!6Ӓ7< yPbpCL<@2" ?_n*P7Ow! O H@(;LAaUp>"  BY7(59=`N95aNtmQ,!E gkI[ 4C5A9%U]~jx Bh9Z e3s|3bɳp!ow6+oꢩBe,Nt\XO.oe%{I@N,MzqW&)ظ0D^rp-Gt۶ˇlqױ=UADtWbKY ̝?D," @ Al2BDD{DE۔- \Z4jxqEMA`WX >;<SqM 2"RF$GB L#& A81fQm™W5c!uDI Ea\.FR ?E2g͇V,qK/@ )2odZ%BYÅ;0i6^e@Ņ|Y C%A1o mYԼ``AldF1Xdʛ_Ȼ8_̊.יu$PH5ܑ7]gޡX\(kM鲦TanVWtU7U_'с؅[O}^ ~0$kAR s(j<;z1Y㾜p͒ /VЗ G{(\ sw 'ht Ɲ_ p.lϳ|dmAx?fȴEB2 O3EPH@ @tͱ\$߀Y@EFJbÐ͙#FiܑR8T_0a8hP%l !Ya<%#ETxp~h/س.9F":bi0-3HrOIh4h9H̙a rvŅBHz+ n3-" KY[v*( P$B;oTݲ`+!Gp(ut(7%{,GV%]@H<*uNX æiR qϹStna)y@V3NYLpBrkvnrXɎ6,NCjvڰ] C]%]?dGFM%9cCIQBX}ö&/Yʆ*&s w(ů'ux@J3fxyb&e0Nⶰ `ePBH,&aQYYM~8ҐҪX@+jd|1%HBBeVl$ù<h%vFj[68Mw?y4vpDza<0@F_1gjqf4 1|i*rop`Z})] 8_, @H0ȹ tMBZxEBvE A  !H/i ,hDكom.ye9)E ANA(|4a"_@Pd+;Nps\&j"EPQE9E鈏"p^ɜt΅|:|8"{`}vtsy\̶mILtQ{ Cb{ ʶD -W!$蒐 OrjYV+8]DE/4FȞSi4|VԄB:[+ӧؓL!ZgbdfFV L KU/DPᖦ.A+2.#61C{sH#L'ѹR H)ޔ7u̞:ƫk-F0AUo{V1;5cp 1#S n y0XCaQwa"h;#AnUJه?]Ph#`^Yz{y普.xnݺ[n%l9~XG{{ooCG Vsq-;/^^SA˞{^ҹlۖ/_O: fgG:yP,XvV^[{8 v/k;kmܰuɒܺ%;g%R!t0ccnnnmiiK&g~g^x ,ڮ4~m˖. G}s75UTTκko237|Uww/LpѬ{yUrX4jYnM֭019ҫO;۷n۶*}{?--۷߼dIG$\l>t@Xv@=0jFX~*XgYt%#W"O`9zrE0kt !D83)o&4Ebj"B6*(`n!|$'azp0 Gq!JTXb!_>JXA-}kp{n˖-_W?O{k֮ h s_~;ܱ}>{DEUzimk>xh߳ϼ}/|W[[Z|ٺT&]Yp]+ͽ3Ss7njok[$g}yUo}'Og_qtooo]]=r<>H塇ؾfٹ~=:ֵ4qJ֖S=s'nX437iӦK-1¨!S>3=ڶmkcs|G~|k_%PN S-dL7X}տOOb'Cg𷩩% 9-#On{{MUVUr8 A}H\;o}so|6mشbL&2|3 z`Ft*{KHv%DM)!E} -VH?. ~ @HSȿspO+@?З=>eΨℹ!v{VVl$晾]66G?u}CPυ<0u|[Z4U ۺ~H _O{/9@(mb7P7몫랦j8t_Gw \r_U)޾G=z{bbbvnFQFGF{FΜ9{1X.ؠl.2C|Ǐ( e9{.0陜DG NdsΟl NkXqP+(署--J޽{*׬Y[WWn/@@عkWeUUmmeKSU1(T5$Iؙ'OtttX"kii޳g/Q644,Zh7o\SSmeKX.;|ȦM[,^u\n[je,D«׬TTNOe33X˿_6'D0迹G"e˗'񱱱1+;ى˗u+-77l6_aӊmsٜip$OXG#%;,|Y~.R*./u7*I|V5 J@s}1I> J:ZNU| <x$Xgn< Tm1.Kxr]QTmWNGNND\.쯬XR=:TbP:@(KxNj3cܒ.] Ej[?Gtuu/To'y'=Ko3g,Ǫ0 #>\wv=O^㵳gNNN?/H<R% @ FO>TuU#̩O:9;p<Cm޲uUI=-[L$8IW.]FSڡƶm^YSQ(w䩭[wt.JV,С#ڰqx;o9Sy9z+dW3#'w;iΖkW,^>116<4x0-D:8hv>}3$gp(0o`kބґ@SΝ>Ss %[ZV55J/:Dy $:cYD, EmAQ3!q\' rp+p aQ{sR 64;\Eu,`ܻ$qĆFsI^QL˰}\ºRi(m_je$ ZLWC]=VMXA8Ɖ< " d}H$APIEc;h"(AnT (9#w<*Cwo%p(Y_Y0#M݋?ظosC'Ϝ[|;ܳg߾NA s=ON~mKv Nvٱ>_zۛ\?uЁuuƛ''g?x(_2h: gbb`|l\/ܳO>#w|Ş#P}F }woov[_״cQ،O1 F!=Mڶ[B3UM-͑X@t=22tؑƆʩYHJ|zn[+ྃ/Wj*5 "&GsSE4ηa\|+37R%ˌGaHWZyСxŗ:;:50 St|Fxi6Rl:xhwoCS}$u5oXvjbxlltر|cO>59yww=|~3_ү[bXh岅uk7߰O)rmq<;3;+ ].@ @)EMLem{{;[eeG=g=tٲh,JX,d2pdhp|ee#*]Y űᑁ֎p<tӹsϿMT$\.gێmRE 4|X't=c6ojlnW_CwpZA!߲t}tdȡ#Vʤҩd7˟F#:2v݆UWqp. =44xܹX4VQYY]U[SSSSSSg95=;955gΙ TmG jC-[7Cd@uc–w.:G=]g֮߶}ۦƚx,\Q#H3CHP.=pz͛0b 0b=< v[ʡCfgg,YRYYs)-Gw%Ɵ~__@__﫯a}_ʿۿw=2:b6AS-^ٿo﫯rȑֶgڕL 9FnZK0ɷs׬Y }7zsMDXTt0b`9>PTҺt0#˚D*~ƻ _//mݼY= @x(#!ѻ'B8_w< CMDm` Jm*p8oq!H[>@LJdU/O#yצ@;QdVz:ک@]ŵ{Vөd,0°ifzƱէѱӧO)xbj"CH4LNL  YH],aD"a 3)z0lb6_q hDƲ[ZTyhx`zfi~<=}Lggg]]]$Yp4go N;sV[W]]S92:<6>LTOo_ⶐ8xh.[Xdi"1u[o?q}nXg->ݕ:k:UUgN޵{߸qccc5:#&z +)N:H [#7hh}0;|D2K C]wկ|ӟ;mݺ9BT*!%:_n.ןFPDR6 ŝ֭]tImMM&/3⎇M7r˩SlʪJ"nds=K8=#@Jы ]t@׭fE4ˑSnC Ta8\Pݳ[pfuH D@៷PMU!ɷ#QRpg%ɠ|Z%J(Utϗ?}mjGU?sزbժ}Ksg~'YdqCC}2D={]ڽgϣ=zdŋa+at-ý7+V4CK/[o:t7x衇qx<:;;Si|~Ak[D,> @ h2ٰaC@o߁^|c=B&y~>/~S%wm۷߼aƩ~sϞ]v~N9]QHa]|0Bp8TRħf0 p4~H$rرJ4X2b3(冣yB 'Mͧ64ȬܹuHE!;|Pek#v@c!e.BQ rU <_guڂ.4O.:`qp.7@Xw.rrZ0Lgr~_xGo/M7ݴv횖6Ţefx5+w?wHsMݔT"<VUuc[S!7! \ħ`0 *U @ tͤl޲uӦ~?wqE0?@3~}Ş]a1mP_q;mlloo񉓧n;bvlrvt:6Ϗ/?79<2zwoڼagMmƦ:t'~?s"-_ '$g羾>%όGq|.=zع怱`a0 ZUU6"Sy[__{5;65 vi0 a8x BʥkUUUuvl d-DaEҦ 7 ę*ȩ>Гx0AmLJPk$c@\6qF3sl*ZǏݾ}{{{{$5 \@( ]K@W |}AYT)} b5_\/qpEXAB@GIE Q@zN .5zbpw1IGO/h7y0vHpI&^;pu8;H]۷ fv^Eq3hb M g2d}s}8EсSHvu; 6/NUģgυx$uQ.DuuT"ILO͞?P.Afa/0Bzzz| )hb.-GFX触''{zgfP>SQΝ;֮]T`|> Τ`ػ2 Mg-M _)~_l0]wwp!ju5H"tQkEbj2?88499~mmm]}iaO Y ,}PU:ՕmM u]wfjz`h$HG`8E y~_l1L`|3AgTUYT#:%@ Ch\G8|;0B䣏=608q7Q'qZ"WPf ,}Îi#onL?dZ o#|}~}Fv6uFq=&S= Mtp\j!]o1N%oR)h ֏SD4La *h^9+ !(3 u}M|h Y0Ù t\8v4B`%d@Tⴌ,q HUYC]YdE,(5PtfY(;}qoY^kA ؁I`")|D xD 59KQm_uUEߵX-I<'M!pfDv\Fo;_z~|j!3@[w+{bO*)8TkJTgJ)NscӳJ6V*_S3C )r ¹Ph!oF:M`øOA()k; 4xYExVMc2A~4cbd\( Q5A-}DkG`իVz-UUY4 "C*uH  GT0k0%;cMai`>4C0HRtʸ~\z #l@"=ct.ƌ¢ 0R3xP0ne12&8{1 1P̧#='8.37Eg|޼Cx L<]qdF$W䬔UUF]hhجWF%"~$%]߅GLP_TrڣP/h GV0.BCf5H6ɑGhh =da LS.Kwu24h}G-knsSU+z3:U5HG@Ay*!nPh|n1_%DkY^QK #Nmh>:QT;~^Q]Mn$b:2 wz }̺0u\Eez$!"tNԑ*Lq|$|HlXFcF) q$(EX>.!e+d(1 r|9]) 6?0~mYKK\"snXƯ.R{pPr Y`Y0AtgkX\\jAiJd4a &{ubiPbDE$+]DJx$d(R2gG9pUgPk D]c_%kFT]ˎ+P΅p!7bh`)$ 7hq_xM૚pLx3\&K @SG?4i!,x&5c;gXH0dfh6 q>S">22Z0 3CNIDATW:Zyӄsf GEJ(LO3/E-2kz$A`.dGx,y%ppB\KN ;/Hv!/l fd-PĞ:$eϏ JftQ(T*ѓ FLˉltI)ݽ{wkk+ Կ{tt4˵TVTGm^ L/%f# ³m_x @ţX4$V)w"GmRMVH.q E*P`cF4*j+++ z /7Țag++ˁC5|&ظHAt2081- hM6~ QgBI""(5,QDd()i~̊p065&|=-:6 t3Ccc(ё1 / E01ņOCSP"& /A8R 0!~XL]~gEi|<,/`%#30?0pRc@ ;AÉ%)W6[0\AAH&-L qD(BRB?@)aD,f^={F$ (c!2 gY)X#!&,H$\A頖 j@PP"dq*0k)p_EK~b#! .1 h0KQ 7Rp& ƄE bikT/S[&"W% zL !9y LpNG B =S2e|H.y k`qAJx$2/UWڌNYL5|B7WА8߫VZQQ is33O>[oﭫkʾoۺkil=^x366~Y'NU77:uGbUd2.-̙S/#8}l$@۵gc=g3OML ?޻w_ooow|>Hwŗw;0.S7*Rǎ?ill/LC 'Ng>>0846>#Rdc[Q)@ht]s^^a$DaRfggslmmm"n#4B+qWrFuL#R+\kax41$k1  ~K)^c>Ȣs'!nKWxD\ǂ&c -Rb" M I1&LK<9`E"l ^8b^&QƢ/Ny$|r 3_B_L\I(!@)0uq LAwo, DYGH* /x ]SV@Jőt:O|@WgT4I6݊ʌo'͉7 FF&9KUBhr|~vfZp,{Ϯ]/b"[[[5 v3O=nVZёJ%BbK._w'河=}K/437u/|_zO?<22z-77~k_ͷ܌kѱ 6կ~Xp޽XO>]wk_Zb<|;>?jp$ _Kt'pʥSr\L3$KF$ Că>8Cpٳ纻{FGFEV&v):z5B9'ALA8+@*T= J 3 EkGq}O -$i~)5SH6kuq^ Ҹ&!XW\c3 *_NBh\._fk0 ^\bxWLN-L~00c8i:\\yͷQ$l8J -Cx3 CIBX7($}@ L->ZnEDBܻ]¥\7BɮD aH)9_'qr瀐$`eΨ"5$rNK u'^I杯ٶebǓsYITt'Y/<Dz,*6+.YVssAЍ7s=Vڶm**t|ko~LGx7x'Xdڛz:uM"H$<84{3g:NB!NA-H:d``A$|/)Qd|>N% '#ڜ juue&SL%a pahq8L pW oq/݂,3ODM@纄\Q'ׁ<駞=|\kjb?1`ŊYLo'nlD J>_ C@SLXBt3d{ ^7,(4(ZzKL sM2ג< ^ש p.3q%+ v4Ak"s0 /{^K!+"<3= />AXD"裏?~wUUU $1dixѧ~dשGyG~晧ӱX];?Oz՗iDaÓO>Ï=$m˭LC9]<oeYN"]jo'|y晧z駟9|p*J&HIsS/坪$:g{Oo#vTԄ"!9Nj/_?3/= zat}??/h"#?"pSq`닚O 5~~׮]mA^-I@h}iHڊGŢ7;3{xzȆ o W|>g[|.3E[Bgl}/K}?ce,(`_$!p!hCHGy{JkKۚn;NG(Vm$d!v8,tR]Uy3 _ٰa?=< tWO}ꓑp:rɓ9Y-+,MvBQ}vDzC.P4l`"Ƃb-( ւL&"aQT&@ Kp!VccC{d22o ^N;hBp[5΃u'rxiZ>C'ia?,JxD%>DG<5gH}ΧK8D)i677/ wqѱ(M~9)uuv릍`zaёQ'N,[l۶0ַΞퟜ#>C*>s##}[mCu8Nw07ۗ/_o߾'xĉSo6̶mmvw''ggsi#CwO<1?e\|w#_wu߿m\.fa>Ñ~|*OvzWʼnIDDٷzoyvn^ط,Xy=v/X|]wn߾}ph= ޵3䌐:3; /S0.~ĵ=ʒ +K_şo޼Ȧ&']Cq6b|LDUd?7VB#\L!$]Ŧض8u̱c'TuuU:G#?tEEuۢEYCo7+Ra }i|rv**C=}-mMM}g{jSI(er:pk;ߋ^Z7#JDg a%˗Xx={++*/Y:7;}?Gע{o,;g_ٺeʉgt3xi{4 X}{>7/=wݱa榖#GO Nu&sfvfnf._[ؾhq]ɉ&?3뷵ui]C}5)u7^$53r?/~߱oڴk#0<\c0Xta.w|$L%QƅU/-f7ZZZ*2qSQlL+2ǎvul|5[0lԐ26ECM>s|hhu{d:K"~I9 a>̂ܬa^)C|~i~ ^._G,ϵsxp%>eA,`Y<ݺmkk[ ӏ~W_y iժ˖-&?|W_?v 7Gcw~mw׉[lY|ڵk+aP@cWO+PT9t".-& S|{T`R#K^<@Qs_áp&I̅??ygyhaϞJ[{xяLuu},?㯿E&6#t G~>}={.Sٶtln橧?/+{[TO9}7_}Wq}5-gVU*IJ-閞}Ɂd6/]I ~tcLv>bT))5ßN ?.Fd2"߷z޵mtsαK&hyvǷLUeBՕ`+/|hȑTUtO;{ndM7֥m7g3o~[C},cb\z'zw.շ|k;39scъDfO5b7u}7mڴ|ŲƪEڛJd„\[zW^}mÆMK.ŸGS_xᅍ7݁X<67vꑑycttzM[VZlFQ4.]r-s:P{*obmm0ݡ~ȡqӖ3P8|ښ*Ho+joP<{'TUG%d*b︎|WG?:~c==LEq2Z(BP*]MB(gɣ=v؎;;a1-ƍŋ ݒJ!cT0\Yœ.|QE5kkkݶnk9Շjjrt" d6Wt*!uԘ9*MSln"UQ4C/zTamZehm*>clMLty[WS :J8FȄ:D˙fYO&+ɤ7<8z.?QU]Y[Sg-X |>NϹYy4BkpCw ,gbX\ $QĀMH>/t>(\.oSE|'*8>SO=}5kֵw?׃Ν8~yݺ }/4:{j7-ۗg8Z}'_Y|ö[I_ϿQ͎wyoZm[[q_|V.v=߸?W,/ev ע hʥS4+2K 9(,0.$Y!?!|7@=HM\AJ%?*EΗ(.(`a!3#L$m~=._(տ޳ӟU/J,_[n_|hߨ{;& `߼ډ/+ݹ:wQQ"s:B!dlo_7{N1yw*W]Sߔ4B'2*~7ر0su_~GSw7 E<Ͼxlڸ^<|R7|/}/-] =?esٷ~+ mݴ#_-,ɤ},k* }3_O. =ś_zˆo?x^jʗqc3/t{sŎAum8|P&o= U͛44Ecᮮ@4#գGOW+̫4?L_7ߢo`HF޼Y(FC歿awkGWeYh*YtŢ%ȏkD:g╙T&O$d8 -z,JRX%Sjz曙ʤJs q2UM!ӄH@t_9F2T Ld/xH%=qY\8FQ:_@x*jkk*'*2mlFcbdPJ*3tuM5a0pG(}("m~E(gv]]]ZS]zM[{= kVF i|uok֮jjmk?z丫v%~F{?yڛjjյK/>7Zok|5rf_u!!1:P %u]oH8R!h!gŝ&p jO9p}3zz>xBN8˯նo>{|lܹnt(M S>t}CSgʎbas⺺ѳg3*Xǎ'SK:kj #;ϞٸqsCcEwϙ}\PsyS9cb|{=|ي^}ڪ{}}{*W\Q]2tCqҶmu8_]};ѱKWFĨr%WinnL7nڸiKBXjƍC#v嶛[;jzz3s3I;|CQYC0wWuctoϮw|T>x¨߸mf0</|7g,69}{fj]x0MwN9/o֗`jRF8ڪ+FGFN9ko&SKSinF(ސF&6-ŘUT4CqN zۭPmG=sO<KOtj:䆪CvJ"$v8A o dAV*)1! c%ÌZʐ#֍0z[| 'ϏbZH5WpuF&P#|?lrk%K`DA 8BU$HB}{d8hZD߃3B@ G914!u /٤P"_i"$ Cj_ !l價P&p*lDؖj6o<99=<4\2T* \JXuuumm-Pir'A!nB1ږKDzh - !TJ;6&r)QmT) K=﯄}\b͆M v GZ:+*~3ð'\QuťZ;@F>5Æ@~.CѫҟJ& |? ${FՠBlLrImT aMr BA@KP|wK_pʌt\  >Rp4U][uu@%B#={S5UچB&rrj!%_+Xv33hT:v"Iٷz'?yӟ-Uפ[O8295XtfWyXd:T^gyӟ7H5l8ySBkBރsbֶXB鞞'|OO#>sNWVVp8@Aissm Y S :O 5wͿ???~yŊ4F Eb˖uv6;vԩ3viT6OQ >ƴFP>(>~$,)"ı@.tt")ax}Wh4_sܛS..0@r0\q@9ŀ&(v~!ՇCᡑ|srkpk33x=M,=sTb k|" X1d7gnR~twh>$to9uk||tvvPD"LE`o`M->^.W(m,"UM-s#Μ=fJUu=7lu7^okm߲yۚ5k3鴋444ԟ8ytnn*e{{`|N8g޶֎m[w[wS<};4~M0&l), ƹ |>cS]Ξ9rh ǘyhh_W{ﻯ=M+++F1zD'&''=N#b0 Jb|T|=#iuui=ΝFQЍJ塹ngnv*X0X<b1 njj^j/g~뷾կ߱d2*:*aI+?d.2}\>bSN{up(!IWO?!ut]Q#ӕ Otvhim1C9ݸic]ce(lԅ zZZTE7\6{l6791yZqMmҥKaf`/aRS'&ϝ=[o /_|eL|7;+py]hͯz* ۱k} d Cx,;a=yԞ/_~ td29>2{ 8'9ӧϜ9>0~IlGe!?xww7r sz5k3ݿ+aG|O<kzLEҠ;|g۶mM\ !(_(2UB"Et5,z2aB(m 5B9V A".#$+ʇyHGp9Ͽ .Bx rϟO&t Fe `FX6 0UUUB v#>uuuBȑ#'N)[d m5gϞ( ܶlٲdOOmy˖.klۺCqzAaT>W8q$XNcQ}CM{{K8>}܉g812ڗJE"u/mim1ܜ۾N=#%jZZĢ*˲8xyt&swUUWٳmŊ k;wk߷ennnھcGCc}m]gϞ9h ]߾xɒ}|ŋ;әذr:{Ϟ}޷@.;WWSl|sΝ=zuGA{ر}cGҩTSC#G69>159V[_c0aQ7n\l={!jGGGuM5A}{|lr͚ytuV\uֶx,DP=w{||86 > \{™Tsђt:$8CjqGSSs&G~ʊ̢ hVЍDW4ގ` {!P(yf"d"980x1dIƓpDr'2:]-C({բvnjdr|]NE bK?A! 4O1g3INE繢PJĈ\ȑ=77k4CeAEgrP,I#@"yjnSLDOcL;?w}C}ScL*\*NXkk[4n;{w 25b9R㫖E; M5 GhZH8FXS3voسwou۶۶SwQ@_O LJMmMcC#N;a݃ 4ܜJ** <@$Xq~؟BBE皪ښ|pȑH,Z[__W7YD)a+1@I ̢z014m|t|h``:a0ps-G|a }6!#,Q.酻LSMmhpdp`2Eܹ^)U5WVTG!>3Tر{+SHM mff'd+ 2>>619dL$'Oȶ47VdR|D@B)I}9]WA9@@g#Hxopp|jQT2Nf1 +r.q]*"~o X|񣣣c;v \QoeR9mE)t\͗uh<VAdi:&''gff>2==v:fP@B8 T<K&fh7e+ jjE@l_+>ɽ1q XGtœ5K^\6;o:tuj})WY|ҪjA#Rhٿ{`b(!,p麪}Yϼ*Z]4b͙ bs#@ !̥a0.`bM#֭[׭[]4^Aڀ1"Z6„yxxW^u掎vxd, WrnRăJ41`|5FS 1Ch voXi@|T 3hBpq2'Hba* 96&RYvDr]VUCS O|;)-S@rvpZJM @]u=~ڡ ` !cQ+p*|<Ie^B}q.YA#fX.Q:Tg9*;+Xt BqwrTeT1/|F^$$+ʇyHGp9ϟjxP6F@Hl#S  #t:7z\&&&kj\415g0 _pD-\ͬ,ej9 GCC=jRf-ddZҦ1=a=]6a54 ad$[)ohW8Ah  X%KR˷٢a+t;E4ɡ~RUQQ`@֮]໾"IJ`2]NL` PL#+D.Y6"-12a}0gB^0LTT.]&&$E0dDGKgW=ùrk! ~FIC˜¤-!l\0A+'AXNEH!sL/;rwq!I pa"qq\/A&V2Ԍ d"MOQ{g&Bܡo % CjŅ3REؑTF ѯ\]Q(p޲3e?7|y'N޾}{EEy,7AҍlJ2%t reSՒ+# /_-B2! CIP,@(}.h,$XQfgg''^r:ȧ6,kD"XL>RB-8)hMyz[x:aDK ĭ!ybs!8!_@S|%b^ @ @) -je1H , [ Rw Sq D``wِpd+n߀dE!|D6].'+CIDYB FFFm۶H!]C>f[Z++*<RBJ$liz Ӭ!+k!)8?]^&B:MpbI+`.8 @":OB(8H+кa 7,^xɒ%8/ZG犕+2tXL$h H͐)(kH/ybHOIB<F|CWN$ZR+QlɚAq/h"ɴtDB F8tʃ(,jpҍDv\H:,qyZ_4El \%Qn4|60@Bs&Ę EUdJ6WCZCPDlƇ?C16TyFcPCKC}n$_VQ/!.9fI5*11s ,$.. 9NA!)XM!# Vc0)ȍFT .# F|>P@ƏӳIv7L Bh4j] Ax qO| ZgJ'frTGS \Xp 鈲XDՂ. ڵ吲D|!WPÂI5\ZgiC(SЖ}UWTnˌO2 KtKHp+R_v\B|ᄂ %̝9ձ=H$¡f$F#Xsx<`Db8fg| ϯ#7Jtۢ-!8UQhFh ] A:|DCmCLZX=dPr7C QQppj8sdQFLJ9`UHH< Wu`C&l@ M܀hl%, 8<|Wm@+oq&(&QQ)D(;h̞'stpm ؈J*˾n^h_G*0Zlΐ,(Ӽ iܧ7B " $ n\ b )-Hz.͍AaE.SL3YmODSt۵B<meH ٲ9[On yKD/>xJDɲ">@0fB8%~B́?6pt4)gRh^s.2ՅQJ!'a/Cm1P<^I"]7`gfg,|Mr% (uSӨM &@!E+n( @F,~4; hMDcP C / E6F6us;i^^(%0(܌D pc G0eRO@c%1 H\]p -/,n+adŐ>$'_D%ra8ihĴ|>AT*&Bpdw麦-/jaF;qֆAr'k\1 }h El-_l!hl+ )CL|8M MJSȧ0nb9BB٢v/(.VLjvHoQ5菛ȿذ/8Q׀QUB3mD 8%hwCЮ쮩8ёYVDqg tsh \d`2噌X[FiDubż{@ \gz/9xCTўh ҁ[$ M.8p# 5Pp0D;\#>qe\wARcALe K#J72Iab'N􌍎q_(6~!yDFS܄7)m) $2 l8n x+,=Y )DV: FpPm&@j0ܧ6XB0EQ&W&3dS|X*X+WU 2 "ZAP:NZ4624쳿tE04wHHL#ŰrD?k˖䰠 l!VQdOg"4XCŌY8``eEx`lֆ jUmMINpWJq{z;ǧEXas٪ivFzlPݼ}i@D0<0qH5D$:f~͞TViǶ)v2 .ΌMKOK߼cGʊjXXS=>: 5Fͷl\)iAJds=+*7(H9 "'NE) >ЃjIl}xϴt>ϭedFk3'{BѐjYz- vQ+Aۈ28OySo0sj1fӖ6obsk֝wlټ53'0 P35~gkVZswe 6@"ө{b..\I.,skkZ촲oց~Y*D B7O4o X+9Jo}({355y323l6HhJ\z2aRFtPy=,0)*t:bZMdvo^ogggY,fYF=oL(/dIIt&%Bw[n-..2 fٙh2QϿ^@v{jzB;6Abm?jVM *ajbȡPx+ 22Ԣ84

)673}##iδ-ECR+%1zkk.kڹp8X 5=ok41!-it0-ٙ vGgG' s>/.*HNKNv8"2z7x᱉$A}avYV2Ya^o2+WLJJ}HCA9IJ1s0O0zyIIJN)/0M lZ55hb`(E Z,+Ȼ&''aa4PH<+( LKZFKwߗi)꜄OD({ 7 Йo1p<)e_`umHP Xpʛ{B^]S!|s DX2"nݠf|hhz= ]\ hDњGnp`f&{ uuuoy+55[n}k׬\YYYd4:|_mr΍֭]6''/`;ܵ][$33L-I^ aࠨ";'בV@Z5 aBQI!Ѓfws歛֭YS"-=rٜ*I`[MQmhA(l4"7nH:C!NqChH&Yq-۷mٲjʒҒT@ Tmܶnæ5+o\_Z^RVRK3fg6_Zr[o_~]rrɓgGJJ٢Q ىsg/k+WbZr͚$;הph^OOغ wmv͚fukWZ)uǎ)^Q갘={Tc bǐt^GfD<''Js-%%%V(b8<p> Dmߙ 7y6GȎnjf*=S}u[ںܞ͢$ٙ NEG3T:wUΔS"ne&2LpO1e PFy6$-nY~}e%דHHC ; N Bdef1 %QeqLJy5]70Յ 0 EEKdR(*-ϋ];xLFH/^u+2SFJE)h҉laAK;?.6A~W)'\RF R,>#c$,߼ʛfeMz7䏄 ~jjrp2ƾDWpj.lMud^nʕIH_%(3R;Z !>> 0u¾7o,KMMjTT6Mo0``lll՛nqͻff\#osyί6^}WVs=G<|P/YaCE UwsX{Go~'Ng9zwԵ4UHsd2KZ^x宎n E}xO~я^K ciط~8@639>XS>Y6YY9j!-TJ|]}]jz3))--d4i$-WahZ@l$LҪKKK $Ip#,Qb3"%I-(*q&&+ZGlVkQQhZISS0L1ag JՆ }ѻ;1)WEɅ, Gv5ܬXXP}OMasssϜFkV1,*QwQ^/d$A)9BstAO}8Fӥ%%%yܞ0{bC\0fgϜ;LJ-d%RHޖQ.hZ`lVшijSO'x,: fASR#J0v"* D ҁF@JJhu{n!w7V:9CB/2@H(N@jd0L&$IU3ӳvH]+=('2`+Vdћ Y@hޜ[ϝ;yΎ.7D%QFgWdw8zº glminFy`z-jurjg~nm=_z9~lg~W;{}d_v{pr|2x V%)}^H.-]{8˧ș}=UU ޶SU{*ܳRkx/7 >tcZۛ?ҋ;5uO GKDS~ }㞟T#\mǤYQ\䄍348tC4_LHp(Z55=m2ZLfF6Y@h~+@sKB)dg؇QQ-iT&>OL':a uQej„"@8*Ξp؝έ[7цT+Dy8!ZZ;::+*\C=zthh@E%9OKMt&޽{Ϟ9m۳s F T ХHFvFB0,=-gfv Jml444fzX8'S]Sإ^۾}[o]<>> EƦ`S/KGGGkjj->ʰLh"0UACC":z@OIďZ컄"MSM qd%.}(d= )' d ]!,Rj*mX%AW ԉQBJ@&J9Z;lϗ~'BќJxnhlj蘜RCiCQюt F/򻒤ƀ@qPL>$%8lZ:VԜ~'g3--.0VB//zԙ޾P&\@(A 3²<>6bw!r9|`7D 2"4 #m9X[}nxx䝽%>(5%YDة"!^ Ed2 6$ʡdvvgy{HĔĄđYT(oo([%(Ukk/nݺKkv:2<ٍMnٺk++W%$ UŌq;ϻz{z.4ҲR'Nwa]ni67D+<_\Pim6֯>odZ8In̻ |ggݖd7uL_ry fz#U(-eUE/uA`\67U>&IZ-T23EV vTŒt뭷nܸ:}tvVʕ 0hj[o5LfSzVV!E£G>obrc9Y:T}fulzFVZz:ۥ^Lݠ+9)7^ZZvg?Oxg?YcC4E[{ǩSUw?_mvtPvLd&S B!Pi'}cĢ^buQZcDY~V$RQEHPW*rCP *$=rt,:GY9A9R̪*)zCBEhw9|7-gc61<2̬,׷0}yCɉɅ$d9 bԓEq?H&zL;.iH$,Ɔ{|W?0==k47o壏~?O?^W_#QZ`lB?h*"H{{R`Z|>ojjʥ˗`A |~zGQQҠ*)&DEQuˮ}={3u-Y9:#lM P4PkQE!RIƲUXYn)ɉPN8 %Mq ɩɩ{i)13-ˤ747ͦQ1m4֬]WjUʒZ=KPAjk8 ݷWt̓]@.#cð*WVju:V4kV?c\>w4,:NN4 D/in MfhD r_m+V`D9qf)"!ڦ/Ϳ}E2p1tsc`Ittz#FZe&@AwSߌ¤9HD=RaQ)]g^<}i_8~:N^?q䥾`wȍDWSuyhБ}{55;VfPSa+^ sMtUn!<@˜|V[Ɩ J!q:h4!A nz{:ÑihrhmmNMIRkZoD ^P[QQ`'*Tv=';"LVV^}CCHج>CC/OOO{ve6m­5++HܢV#m-])yN^8rZg*/_֨d+%t"}3!?x֡eS-ܢDV"6m%Ev/מKz{ju9W6nZaC-l۴@"[:3sKW jME-bOj8g`NuشvTgPrZ :)_PW eNMT 1/ϜwRrғ$Q¯yH((̋FN+v&ڽѣ'kϯYvef#panTՙLݨa5]nKM˅sі;vPZ^7%PpD´dN"]驩W_ybejZ*3S1<<\[[ vaթO3 C=r꼼lF%቉OZZrfZiHDzz/~oTXThsؔoXoЛr rF.P<>SQ).htRyYq4"s?ɔ-sѠjAvMѵDZ[wޱ{ްnݮ]!qvD2L(!#T$؈K̄Mo뫉NoFԆ" B)z^bBT)C EHXG41kFƱVY@k(Z!{nUėXsLngY:j2mxں5ifR+Y#~;l*ʨZ)"j4_OĖEZq ^OZ(333ayE}>/`3 fhhhll,x߄eHl֮9]U в /}nϼ =Y-BdHRK捛*/=rȅ&J)FGFFѿ֬YC=0F~|799611no[p{1$ I/Dd$!; -X,PPq;cS?O^㍗^~oX>+WOLz^<TGG>GkE:}Ơ#u0htSKVjd4il055+&%dfI͐w ĘIO yȥ¦ t\ ecմ-5%U`[v˖-7oڲmkJJ2=!kaK,IY(hY6 MOϰZGZw3@rȋ'/"uP).z'T!1G 0ΒF )HHC%uHZV"GXcڀV4QV)ifB0P0;5e^dH1/s,,.5P^ N6dp !P|=wWԥ+Ñш݃>jZ&bp&&&>}fddxzzC#=Cm/?z@xWGKk;wmNWsͻf.]j:y$R>FKJJStzFmwL(q[0\'Ν9u1_PUZVT{j;vr } `DgTv\櫯­v&X ]H,ojt8RWZ,Z<7?{Ё{~$9љbbmQ.*Nq&eTt O>uҖ`a"_ |᱑GWJohhg{NNJMI+YQF1xb]{{ѤlnU*ùw!RkjΝ={[^윷R",&?SGwON~AjJ }>/M+`&==rh[[۶mۓ|z{{.Ԛͦ4VkYz!V,+ɇyz\mWgWj?r`Gg_Ū5kVW8V %tXվqӦԤd-`JRӌlzAs rLfSGgw}]Ýߙ]T95={^^YZ(uWO bsƊO'RKΜ>p @ڵkCmqA FСff5O 6fq7yf11G{0L/d<"9|̤,F:z〿Q(+a`oЋy[UC *`8S @L +IJڣf%\SlBiF`?=`uLb~QTDWP˿X$NQH_Ooa6h)cT177;=3w3Th4 JG:7b[i& A e[kW]S 6STTLLhi$`PŞy㣃5g._7SR35juiQFP?v<;7wmͮX x,6źsU%ٹez/7[<=t'%9JK 4ZyU((wu$en޼q͚,If3ѣΞ}CYYi)v3 YXq;6} IzTGoشy&A4_j,+-+LHp@=[u#G_Pwsmi)199}wjjj|>+#{or˭nMMIZ|%egϝ:uLIȢӧO:o`U;l2t֜oo8~$٪x YYYiiOL/,xRSRNd2{JMթ@ e˖ nhQKKKTDhթ陎l$gR{GoC ۾uaח#J)ils(*zcBJuzɼzUkQ\d3W:㤴7 R$eBNB9tĉnh[oreyvfѣGѲuuuVY30sB^>ͻ1,P#FHmMy6mɁ~:9q7W   J!B\9h&KGP <~+(ENWрdht^l`p C0zNeFXD  )"BᎯo+癌"P, =1dG# ugKm'sp˶sʜ넭LLLutb=//͠PϡF2J43)/ö]o|V"i)yff&#GDL׋2B -TιfN "AoBFv`ONM ,\EfRцe@ Z,TVqLcDԎ[@`4£eOIN# ՐFHL&\`!s)NaqfP030޽{.]ڼyU; I!TC:$ܢ ᆻII ?8Ҽ뮻JJJ$@xQ 7 b5炄Ac@C5$ ijuZDy10lH 8!Z/C%Ai5"lctt҆IE" :bzzf)J8C"^h0BdB=nDOHH` BBȚ_~ U 'p5oE+  ^0c|*d ?E69 E~mߺ jmm]PȒU(fDDܽ<GBJA(6{VlMzO+!>xFbUaP!c:YA(% T$*F/o+24+ U Ma ٠dé1} L\ QR6!& mVKzd4bssUUgSqq %sgccc)\Fa60+{W"Vca X`dq;f۲eKZZR Q D<"O n:Se!34c[L "AxRФ  GS!H%UIy^H 1XwxdxtEb`Kn.v(G2,"6,%OI!oX0?hcp>81 ω`7>qj9a2ϝ 0 g < 3pAh/9"68QJQX@p="?kƮxsη"FC=z4bkȇgloK|hXdMƢd R@ϦHET)U0nRN /Q$d5:*&VpQJ\HzQ͖Qf0ȂGV:$ڨxA,D3/S` C"6Ā #++kŊ"?HE0-6 '`CҺږjtD3", IOgdӔȎE1Ȭ#XqI0)&R @ Ó$*jLExT}PH8-JZXCq`Z,Vܣ")i=&gBj҉D {|FI,&Ӥӕ| p <;f u,+.A;qDg p,U \d$#d:'vDPGDeГ* nJ%)|?Q+' |B/bKW g7cxwN^l2U(v 2b8?G覴x{bM{}D-ǪK/h2,OA~qqQEE9 AyWEyN?[Lpa=]d,;a8ۃ` bp1 E&Aڅ,Y:KcG7QHLjX+F2E%n-E5DD$ڱ4 x-f?!8X Rj(A]0F`N ?EY_,9="O(u -k5b"=aHk3| n~ZSF>b#v,b~7?Q;.qPeci A(=:7Ta\nU>K>t8@ [$HJޫ]ȼE8͑`!4ØYXQL]3 QVpAܣt-) tbҁ(hgldIN1ZJ}r1 .¨xf%܋B.x3Nq `lh-,W2ZXW{.%Hl#YZ~,9a%ǒ{ly%'~0N 7ϕbt,Yrp7aE;L DωOKr0u]F`XXXfH=F(&PB* C.T9ɍp0 !N6)\jUJ@%%L};A9cuBb>Q7N&0}`7455¨˗/]xYV5(V-q~KMM9NqS A\94UXfŹ6o8rZq2+n(?6PϹG1$F-I&!'`)D^L1D2hF;BG@(~qiZPٹyw8B\Ve"n$ɏN<͏"8)Nq'XaqM1LA/QLYƮX \%3-f\xi78-M= I -b0G 3Ѽs~R)ae3WZ>vBr(}>b`hWj4*Ih_ [X>L1>#NqS Pa7L{L~O̱hg,Z-̱+ n2" +60QɖeVA-ֆR0RqQzTb.)l<>:z>t*=Wc_=002HD%$$8@  }>_*NqSwPHvqLrKPKA]N?JUQ*6L GEئ@O]@NP)EK (V-K\Kkb~B V$p-bEF‚{~~azzf||\RxhY8)NqS@A V2s n~D3j_Vh9" l3QM#$pv]>/eyz yZ-ǿ6`91eED[R+J;y&7ΌѬJqO!(I} =c㣲#؃@h<Zrk+X2B\ I%'l.ǒř^N, p)0O<ƉΓz߃S>Ć9F4l3yB8[scc“ࣘDW %C]KCApp]@SK^F2ʼnH/9>e(~ (' n].y„{Е/"`elCLAgUG&#v vPXЯ=?ޛ!҃W]"~/Jo'''}>_fff $AQb)Q:a f DE'V >R?7! HjR Dv GCG8 D$&J @E8Vi哊VӲ'%G$EE9ZES6AzaԦ06#+uΛĀ_C]2S17蚆~ʠJ,G<n4HXK;( P>璙]RZdz`6 Vh'rDFV\@%LF;뇃ʑ'U8)0W(vÊ{pϞ_xE295s' - ,!9@)M9 ꃁ@!ET7*`rvp7ZcRWb(Nq7QKFpy]Hְ᧊ѐuAJLMONMMϻ-$ā_]sÓ`߰n $p/GBnCNNNMNOg}%ePILJǧmj_hHNLB|LL^F )Ԓ;Vk5ArB K,L3rss,^gҙOHitld|zUjIRAK6 fan<^x'D陹(}DQYy~'`iK`TMH1Hz3R1~OP7ؘ5ioQQmpQ9²f_)Qx fRnP$Q u^V*fsT P hiiڼysNv6"*> ƚ2ߜ(-:46BLBPR'DB}t$oU=uĒ iЭQir0 9BwCբĸem&PZlTp'aVQX F5*u:4BggSɒ&C%Gs?*d ň4xC\[m-A6ozzfxddŊBf[ "a^Yʊv);+Ñ"+$6JIBT^Fzj=ڲzCߐUAA*=LT{fʾcU}T'ٵ@ua*U(@hWT{}^tYBKOâT78Ρ[.._QRRv}wu|i<!T"@aZ(Cc=zش^%~yP?o$ÀOA'rݛn˵ *_}7^9??IIK\UiT[Z_yuÞΞ=908 ?ee!{ڻwd )_;.-Xi?!L~N?e$^W󧎶v~[EYI$A/ />?7E jvnOyʯ~eiI}AF'F ھݹqP]u]˯ު S޲{m&%&I*R__*jZ'\Xmw].'j/4~$O♧zs35'*=b 13?LG9zX}}tڹO?PfFf2 p{=E!Ùp%HtDѐ224?n"|;44 z322lVkl MZ}ՅIy^T4+)bB,2O`PH0h foD J@f`Hƨ!m? R(M)ho)R) .5u ZhuTzWG~IAޠ٣0:%MQjjt]{׈D+SRӳrr1װl @%1n8)N)1Ľ;ooeG~[w;Ru:=IDLNL;EZXfխw޵vuwvJk[tW^gvA~䁇}G+f]4z/7񉉬̇~h]CkJJuZW}s絷LO&~&?p߽;nojn/((p*)?o653WT Y~ +{YY=ܻsm[^Cc[f:TLwԙW_~cضmSfufv'O`Yy).іRRZi㺢δ2ZW~_լ52tDP&)333)9nٲl6^,Z:z I㨴y,ggG牓5v D13(jl9fDTXlswnش ;'8z;=9cZll$Q\lI\]2)L_9r1 ZT˲O>>gV+..XYjax9HDu B!H䃉P#tlbӌ T1B+ò >%N"Q6!L(#C@~"2D` BT5ʨ +#F(B8FA1d+RBR=ʣ͏B"ъr9 h&>3zҡ[BymƳ=K/9}ȑcUUf'^zС@l޷o+_>K Fz^կ=288E?sƛoimns͹jj.<쯞S_zፚKn8|[kbm4 9 ϺO-ZQSSӘx'-SvR3r +pfvZ^AvooʐNKHLHqԒ&$u: RLRIwoOOYjͪת2aM%$&䘍h9$ &6J8|_va 01HP7EZ@ C9SgΜv:EEE';644DիjQ7Li=<>|=3٨* ,a_ 4h`KKJZ@`WUMBH=۴ru$cZ'''H4 8y套_=|jme2-f7~GÁ2;@q1@hD*BUrD1CSBJ9 @EE`&-!q55P2 S*4V蕲!٠ညZ 1ǒ c`&&1zÑ;84̐8CM\]@0M=,IȋzܹsSSyɧNWq=3x!@l[}>oKK˂ۍ>vTW WU:wJ+C--> r>}̉'{{:AP0997Z[M LȊS%^3S##p|~K^<3'Lmio*-HINήSǏV&ö"?[QК&(!Qg!ϵjniEm^^)P$[Y==mVE-󮹹TP ,{mlF ~a2V׭[jXDQ@GL5A2Bӡ$M.AClVsܹ:Ȯ3ΖegeB,eg^҅#GKU'k 5: r&ZFN8~ZRn6!Aiie#4"(ŋ\ 6ld 0BQTR[?bnڴ @x`_ ½pjϞ7kanPJ9|vBz)D"&^$pD?0P"dT֮Hr8F<ވ\]Gx~.D׃C9p*hesG>Uof9dQIZQTV :"Ͻ&͍S,G@$f/,[[[ F8sDa!wDKMZGGh6#`)$62?;s` p}_}wމ&H ˑѱ/~K?G w뮻o||+3#x!!1λ淾':v諯 cSzc}o׮gϞ?u*33 _ҷo~[6mNp8!mQǦ8. ^ur2lu =6}>)d2斃>zpZ#IH( oH0(!)R XzP@*333i6]qxkj_P]^QLL# 0" 2 s\mMmͅ6oJLrJj5^"Q 4h`BmmRRRrrfs:[op7@feetH-$ETh5ssSMuUUgzG4Z+?A~ǏJffg.`jzHUDEF* 32:zD'aS2TM'TlM_ʗzg;12<:okk/\2!!(eƇh#"d@yPbNxRg$J1T J.Huz+86u{}`Wh+8vy<  y~niimmm̎%7o zӴJwd$Z%~ >(6lLzy7 # } 3`'6/4;; # 2o((#`) iarjr|l&UQQDEbU[0'Ǜ[1&@wOOAAAeee^^NHz#,#3gee%DGCF=/7՚醆Kgj5k `̂!yA'-U?Nq H̬_җn2>6X3<<]bh$,6|K_bQъu3.ɂJ$ttVHCn//R Rjrr*(Ԍ-7fE@  %!̀Ա#G;99UW_ QhI,?Y~&s%Qpʍq"DB-K"r'ʋ#\3g(N,پdɼ~og4T~~W NSS}'?x{z{ A !S%"DtL'A$r |xbFӮ>PeHl^D0K<ް0c.6$k7h6hwdYv䚶vq1b\+wdgggevYX3׺%˴$3jE$|FURM6AK6*v;Y$X!hT`08;;0ذ;0p+l%DE=#f~V"<~ @fVU~s}@>|ź.y"TђA%C! j0Z^+//~G}+_ʟ~OoDD#v &Cyzz% /Nqƥl@jH Ed$bt ))gT%mRR)DN*dRXW(\ cjI966;TXXdCvG:02:R\\{=yVYѡej3rXYv]wݕb CC4,{y &d>~IP驩˗/C[٠GR  qŊbF3<<GƦg&3H`4F.QP|TLDS!;|=C6lLINb|F!ʊΜ9QYJzC)ҳ'DV.4F).^eZ'u&:׬Y|_|G6lX`t8X%A~D Br[t]JPD2ڻ7}vo>;mC{xW> p|灕~`>jXOW~㾕߸wڽ_Ԛk_ܳ/YW}kzgvxGwW~fWgoRݫW祥$j>q'7h* M{E"A@ֽ> 3x?.\s^**?M/(4ZVb!:߇މ>_RR֭6n!s9N\[[(^jޅ$g V3鄹 reek׬Y<>>AU`E#2fSZqS~1m% MNLδvjb7=HMKs&ժ)pX ] 㣓WSc|QQn8ШU ‘PK륮䔤 x98s;Zg`M0CgtvZ>--d԰lP|0D$'FLYO#,/\xo_{o~7뎂²;Ԇ3Rg;'d9@%WzSx8z0$G*Xj`4%YA`1׬^05!!1+;ۙFGDP*(+ G#. ՉrLMMy<nk(1:dϿ !'KГDh}3DD"C=ITY$i2$ &}Yb't)]Ylҙ]N1ipNi%uK`9zQdaڭ:Yg]6kEihCh8"zu*}ʔ< Q459ۋΔ$ՄB!@sLwOOyyenVv{[K]݅YLWwOP?99Yؚ=}9IDAZ DI0-5mL>v CCGAK|>ЊbpiXj7Dl_((S?љfP[~B5}v P E#DLz om'7[G343" gAI%RG4* \,oP(4 Vs U8 #ҡHP42DTP6`q:\__D*E޿?!قNsE0<8B[bl|?wOHHE!FZ RSبfeή~IkZ~I/NLLvܴq˺ukE9|Vfb P\:iiTphfv>cg] SS 2334, w֬+UP7IB)N 5cX23fFfۦ lx V,٬532A5v-Ty}ׯruV6%# ffff+*ܹ3/?glۖ)f6 {t p5>o$˨XL7Zk߲֭iSRb܌kaavrznvnhdLè .DBnQ1IVr"{Ye+VLJNP*OLLβZ-P$b"A׷&&˕hXyU:VD Z(eyrtBԛ*WYQ-'2]sΔ"*I*ѐZZZjiSK lH0J(6oOŤբZ33@3&rժnxfΖ$qfzf*//7d2zX@)nnBoB(j͹995+jF7V?theQEH[{pѰ! e(>GUB$PrH` !bjPQ#܊I˴q@KɏG%ҋETr0PRE`J9 Q`ӹWu[7cՊYڑ[%,k3EUq \<7A*+W FT:YXGj,CXּ\FrO4r@QIւrЯ}̜hPΊ*J4z /A m%ZOVSI+S:80 %h1ևo8)N' goУh"Ӟ|^R ;ުoߴy[V-RGe_ 䇪 J,yO|~++dޠUJIy3): {~7du0#e+(A/(Uj*d;ZDj%5\w֔@dDڤH)D-9y֤HZI)Gh?f *"Z~~~zl6A@@1r@"9 {v }?Y$^xhAZN* x`D!* zRfD !fTF#QT?RZ9B_;5zHDҗ za)ORSLJ34aYxa~^'*zA/(&㝙(($`?5v1Ni7\ =cPKe gϿ ҡp йNIeҶz1Æ^@Y+  |)ElX~=AM`)) c EL(&TJ&Ĩ% sB,"*k59PTBRADÑϻ\ 1GGG2 ⬬,Nz{ZMbSgЇq!9hkk.>zb՚i)vZhԓacnHv4q F z:ڮ"ˆqѰ$0tdEQk0@a"-NQkZII %HK;ˋl NpHB]cw84]Q$@@S jg|Y{brEYe mzjAMC]~*$;uY3UgwvozzɨP"W$xHAO:ATh5&rX}%(pݥ34Zd2KZ&Hhi& ?  ʐ  Fɋf/( U##|!`AZ*hh3?(1eCS1"P"ݡ{K?V#:2X$ 2}O)JZѫ!8 E'OŤ4?LVL0Cug6ugB>hA@k~O֔7: YM6egg?P`]~q ̰uV UfئX@(YHj@t0܊E 7= B@ ʂ`4Cxy`*.0M =kehcQ(ai  Xl Dlk#BqøR4_nmjjqa$t$ t 7pt_3133-3+]C> C Ij/۷hswyV,rĜ8xx`l$lR v1q/B\E/s,y%St )b$+@Y0+0$7`C&1(9{c>gH' mL]a3+\3!\@<*{*BH>/'p#K~?̟y"cqx\P$;݂dM|8Q"[/@^xYXSz/mȺwaoZ1111??X^Hv)^NJdqG?ںeB(qu `]XxMiW@47;q!Dn7ˮl-ړbF׃P0V /9 lklj (Oh_8OSN"1PAQ~IيdҀCPmͅgyiUyݕ &ZfY1ׄD/P2u VZy8}({&Т"* ,U9.wKDtM5ÕcI b#^kR$P 5u~b|! KT+YPnA( wB\7՛Fe{̀PhvlR4azlIZp M@ayч3iVDQD#zߐ]Q,}^p$b6[mvZCsCeXrpbpfo7=*NqЕQ b#{McY {_Z}-55҆r15u~b.DzkB?kæ׍>y޼Iy7}9"E[&k5Fl6&ɬ7pb4pYO17m6{ZzZ~~NAA^RCkS,S:_0K|_p18)Nq2rE#F^[7H,tp_ཎDAnI7B}8Z!UxoaZ澋;?hoRm0TJpZ*F^榐@? jzqQ) Hҧ@V@:_wװtWG@ջ58},Ǎ놼Yc#a(XN7/A-rM yB1#A8j&-"PHZrvm6A'nf~ׇ!!TK$ LE/cABSD5AkGGK0qS>~DRɕqtp?.xbW7DƬ{wKGcB}2A(ww uk;/,ήΎFmmmc.=3W;y(IKQ-*b^X]Xh)?J\}+Nq8}@C#^K>\EDžT)HjB!9 h c لRoIRG,0S3n;B~e+ÃA}inkz* PI"V" >$f"Deb8Dh9X؄a"/ü1[Y`*$ 8&4qlj YęKZ0È_. .q .#1!D6t#"BR`F=]7ɰxKd$%!ݘsxR5Np( aIȗ|K*&^*5(Vr= K8C="saޗ0i%wǸBB3,Q27(:=Yr^K~枼T8FE{.OV gN6B18( cz6iiGpZb \b]NT _ $TƤ1n$''UT\Yr\}#ݠVFFFf2;E/fe=/[1@95&)KjE!vM|Ä ${%ee5U54nq!NqM$=XY17@Ls[FG,:`f0b.eFNXr3d``l,"aRm-39,Dy3(/ ǫZ[D=RxPd#lVy/`ؒ$"*J ꆌD;9@DuhУrj8aQ}ޛf H3LFYx*E zL (EB\.N]rb݃!v0(x|f>`Xx0 5%ƙڅIf}Hv)Nqˆƨ Edf}V.iF uh2K0` F4]at3EE @d(8bT!p`a+ț @ C*YdI/\2NE`iRYBJ"B!  @їaI^A^֋ȡ0“JNT1PJ Hn hY!7 xr4bԬ(0(*}fV%cM%?Z ?b]xV0!!h2 9sf~~?oҨ5ǐ:d]EN F݊:_]SSS_W41>+] sxB!dToSI*333O>y${ -q [[[Ճj2`Y:U~`%!yZ`!SNNObaX*v/^[ n ;?jjj:|؂h24==z|?gPD^5ȜjkjQ~J$ Us LBIRjmi;{l}}BBi4j_Rm@:&$`0/.!_L#肔!!Q*6A.L`Q[|eFǐԒEL'{zz>|p\j5 $Pqe!h3 Cw t! 9 @Pwqƍvrڵk**Vb`Rbf /UG&N"rŋ`PQj&+CNMN8yrbb*55b6B T& p-Y!D/9wџ,'܊fEB(ME\Xv_f5;:=(&( E(Ղn ǎ;q`bB")Ohzr7q8|J #ӧZZ[KJrrr[Z?ln<%HAшnPV"JySoDLrr t P_1 v;|80qABbX 1 NSMk.\}qnkkÈ߯~ZZZp GDf؀ LWg};U==}uΜ9G5Z"B/򫯾600X_׀Fn{=44>lӨa3T&P(=81yǏuwuV1G͵?cA߿433jO= h4h˗/9 z=DT$W~doo/+ ܦ&_xEENgb|9-/RO>C^ Tl* kO]ب/0O< /9Οhte af@(UKjtj?A`-n MEz9u+ktC{v$_ظ~æNm6223{FRSSmmm$j)(ѳѡ@G2SP[GhKKs3fV:: %;;:'&2 Nz'&gFG:GF</z!$sa)>C#>R^amIp0cXThf۳3#af#8,RF/" ;a q޳zDI-auo$,rZTE]==9zim{o ɡNdggk'N}vzF&22s'f6| rrrsrh|gy`rժLH0J#ԝnٽ;.*ZaÆD(C w;B-[FF}?6Ў.ђFܨ`Ttї/};npN4P貲32$ , Ls>/l߱###=++ N”s^O gjp2FgB4ęzEHNW c>-ajѣB4SB`~evnnzzfvfZ_ ̧YTΊ<08`M&Z`𣞶K}sٹ9j*"բ=&Ԯ,HI$*megtj#j.lپ=+# Z_P$,(,!F + :q/ODBbStH\p~ӏ}]흝ݽ=)\J)6y[wm۷ٟ}[~{-/8~șsgvyg?ccS]^/?ӿ|o& BejH.?`a00!n`4槥[6ْe;h (z ",2R B2M0{M5ZFVFo_C=  `"A 0<:{}jZfg~Hx¼gdd?OCϦK([db/ϺfճډNMݿַ[o[;{Gա?h u5Yv6].‚Ͻ5$h]ŕ+ך v3!C^9JJNJNJIHH5jeЗ`3g  =boOtzZ6D^*Za_1*y}E%Q!T53sURI ,HRT%Ɯ윿_=C%+ aOA\\4'aёы/ggg9xɧZ[Z]ssCC,ٸ~ Z ;얼)r714(ĤtajUWDBpR84^W*h=,{󲝉Nèf@u:]w_4ɪTD >IK'GbbN DalrU(Oթ}ϷgOOLnPk!6_䯋~PZ!ұDP7FE{7FdA)QMAj4juzt0-CK., 7d$9rsϝ|l4ef$(,(*Zh1YX?q.cn{9s<~h4>f~~allr1HNV4R르dnv#G^{={xkϞ'tLOM{޾yҍ7vtNNN,ԡ`sz={4++lѨ 3nxxRjm6 2hJHLtX5/ ,NHr1C!G0}Lv%EH@^"Gfq ` dZϡGB >)n$|9$_|yvv6''2vffgzzfnn#W1 "!YZZv̙_xGm9I]zIG4Si'pd9l1[TJd֬];99>9> x*PXX uwު3Q[pt+MA1I".qZX=#oo&YϞ=/#;>;36uz`ޫe߇wK}wnfl99#EU }$Іa}t޽W<)/ԾҋY>y;wlO8 Gáv:Pz3X漼/}0{֭]g"Q] ɬ'ƅN?_=22 -0Pxs>7<2R\R ,<8;^\ZT= v4e[#Ώ{=w8эF9&mۿG{FF&#tJ}:^ ʖCQDtlzP^ `$ЦJGDWlMFfKr:qY^Z{n ?藾E =K/5LMLG#aFk6~꩕DXDXQixMPZ4!uN{! ײ'-Fl7Q`0ff@0hM|t *%!6'vxCU\\}='~‹/?6mޢj&&ǒ֬Yc`-'!6jI˿˿/ԓ`5_SS32<25= l6@chNuttTUtSb(pee7'x♧-;w&8M6EC;21&LZHjI\XqSnA0'L7q [>=w{C}C+^{?ۿ=WS]{1ݴ?h_/Jh4 q^_d4Tb8${G^{]fKIɊEFAiPbу-PQR(##ã|`*o޼ T i/G Qfڌ%$!&''WHLLѪSĔTX. hV`q`R(ZI*ULNN9r'77':5)O=G>o~?u]YY@To1tT|G;w_c}=pUBPl6FGF=n/z; bt9 zE xUu[:nߥ{7% ~zB(!!lWaQx#zz}~)iYJQǃK#9ii)IɩVC1GK)BE@̨VA\Z͖¢k׭Zzffvtl@3vSD .m `?++_ƛ===@dV"9ٙjYg332S ])++l`jcPhe)NqIB=$C@@J:)%=/̻jjk04'd$l5u96oKMI띙XHV/q)pșl،ss--0IN z{;t@u5N-DqEEn޲} D  KXQQv=w _?ݻoT4,oUJV=8uرkLfKRJ*S48YTZY>'l-v0O$I&v?MzG9_>쳿/nj4;R)fP(R=U zOϋC2ҷؽ&{bVGxڛ;;;Ξ9v>+r5^ԉkj.^8q΁_ &_-ZTT?3::ѽ*E ޮ1֖֪ӧO:g[ǎ-,(-G# 766WԼm(bF^U|nj\]~_nBŒ >11Pt:aRRat: z^/ XMG Q%h,5 3$ [!\ADSSCH4z}0Q/ңZ i aWUyy׿??mg΍QP,{YBR!ZrQH9e |xaAbynV9*ש5dKkWff d%=EX N^kVkε0D >dኬH478<> ttttvvooo  z}޼U*@( ?7(\/xN8)H{'nFz~FPW}`ttWJVIh7ϻ쬴 "==!ڤ$':}5?WPۺ%AkCa살LZ695=72%ݝÃ@M4Zmjs&[pǧ!@`U@LA:`R `i?u ; >$v??+-+~s+* ;!::$ukѨCWh08( (Q0QTB(NJMMKIN͡H[B T%1I 8?#Z ;< xtpx`xh-t&]'tagۢ5%4 rJl$qzˆ#=vGm A[kNBŦ[Vp%i-Fܽg9)2#{Z99y.yy+Vnܴ~VH0ZؙYyy NU+nݜQyӦ gff`5l9)DәTԌ $:)iey6{RIr# ;vLKIJڲeS~~^G{7(M>M.׮ (jݕ('i{靳gDHJH 8gʹ޻|6"tcfUfdč7"nndd$({8yC*i#s"C5nX3SWLs&'KSTEEPQh| Tt$J5 U[˲p1*BW_qoUڦ)IDATX9zRV۷Uv_rNǍ.tfbM[Ǐ=zH!omݲc֍3]rZWW׭w6lX[(w}]v:yw1y\'Nq3?|=}Ӻ!p5geةF' \2AEZE$k7n\vsGݸ~֦'ϧ+׬^|YDEﭟN:qgHlmjjGFݼ~҅ }͛֯om7ܾjYm] .:1:>u̩Sْ%7bF'ECf!fS$pZ0<H"9{e2bXFˠY `>][]rZjE]*~hy4tHv lGr=0USg=W&*4ӔdUpw+J1#@g ڴW(}Oůfp|]d5- |>DِC-9wg(؈`dňLλ+d۶ei~D稛EZEx})_%#~WxgXLwoa]r/뒦EM`Xa}UYE+iz,91o۾WjT5 r# .#CAds+KQ#RXV1o[_xfqQQK+x:+0NpDgp``<7͈aipf4@<^D#J,aXŇbx.L,$RAq0m2@U.7J%0+ap GYCqm&$y$L=ZU{ܷB2tN U>¸Dktwmۙ;OqM-AcW` Ĩo~O?='Z B`0eH\xSy1/?*: O.P2}$F>3?*L SdpEtGCsp]VM-g|0(87J aSh:`H$X- @0>ܡIeB ְI+08q8>_KUZVoXPF !ƇNbn9 20awJieA]4` R"3y$j}6&  iTepE >'!.ts/dsl^C=7f=rM̰V(i E@c&# .@$ؐ'- S3u|㼮Chv}F9Rؗ\M[`PȫzXqi]}}EyS(d0#*H7 _yc*W32#.FL&411>11A펎ᡡT"QSU%I=j0I ?ID <mʄ 5Y=AbVѰh}}%Lor?:0ZIL$j`U\ĵT/ s^3k1di;z=Ljo 5umm-5tp&)ml b3> @4/m[Լ$#@lCb#& 0St,sRy1p8NX |-Ra`B`p JLG ܢЕyw>GfBh"҃<޸KpIf(zʼn+^B6"_@Kq=4/‰刅)JСǎꦉc4H47ww-򨲮lΜ`HXf664TEV Xn%'$* }ZV%G7AP0pdPF[A@302((!2Bcb~ uYiB{J`pq&RoLۨnHFL5"6B8-h! y򳀚̗i I5,{ ۉִ!EZEz빾[OSldc2c8K4)vRa 4AO3#F&0@<ڠ_8WA^XWA!I& ~> n0{rF!#w! 1D$I|@؄9W6H\,uE# oF"p0?A|v Ccŷ8$:,H*BbXC)h8rda<9CLƘ"kn6v}|70"?X6] .$HIdJKbS)6?f?z'ڀN>K)~xM̎\P81|+:ٳ`!|cx͓sw(S42 ml,M )(ڊfVM4B{5Mx l)@dQddm¹0OO 1!܈;ttf*$ R#4Q,w t52աBxZV,EBlE_EC5M~08J#T=T I9ˎbdAq7db:V5J! BX -Š3OX @&@p`O&`A(L$Z]G3XES(dx>zO F8dc R.l|M,4u R!?8:m?E.D i1xi*ϱ8n" ,0L1) > N;OhV,2 8pR,`M`m>&3{n#HϿ#8P MG yplx~JuBPE0$ Y]>0y,6ëRJA8E|Z;G1 +d SDadm:Y/"-ҧΈtfaVa BwA}tػq[)LZ- O)eD#B::mM,9*n0sqNv!bS"1y*XApa/r"5Ef 7L?o Z\0Er D&b P` BZc^"+$VaKpg*-#A04089lf`kj1xo}駞 o6!ß?y)6 ř@\`F POKفGx{ ఱ;hl"_dcE:53{T@6&yI,-Ӈ;Ë܅O, rRqKh~Jg1P)Pp-mZy/D9‰D4qW"Ϥ0"enqĪ8C.>!ezi>`0pvIѻT젰ˇI|W2[˜P^#7nSA/$QRE%*Nhp)@"4LJ9gUB B:DL=or H<"'(}MUEׅwf-Ql$a'q?<}3i8ȋH G9Jh 84-[1qC3^S!ptdLPx9+l^!ww2Aby%|,!Pٖ;44u>dIUl&[YQJ"F)-G%CN\B4^j;WJAp[Lw  (~g49iS$zV"a_f{H39EƝ9NE0ߙY:悿/iCT*Ea{G$wĄ܌r Wyhg/ab'|oc_ ' 4]twd)UܦD= |7?=TH'+:1_}?.O7Q]YȊdP(sMM%~LEqbؔi$"-"=, ?|֏G$N@\@ϜH jDK=M#{oOޝgE΢9~A`4))@˙ޚ!N_}h>W@UůH4;BN×97mڸi&[l޺u6A֭۴iS2M&SLvddDz,(4`/2lZ-𱦭 Ws:( oOQxsi ^ǎJh2N7Kyi1;BCp#{yF ILastp怷  ))fZ1)U$  yCp{xV ,Q޻!ҭJ3(,ibgXwzBK{(C-^ ތFcdH^z'6rlGTDc-s+O3et !h<7b( &L޽D1o'\EZOEJDtw/<(܄PHrā1 @y)6Ô!R2uA ~ I"1v(T.RK cC_`j^%ψB(?+"/_C!je  OEB4) IiRJL󝗌q<>w_AV 1 rd'sIE"-"=dB !vF~͢83ܢ/HCs. 軾Kr3|۰x"3&iE 0̀Dڧ@v]:~DsW0"3o{Eb8`Eb$Lh`pSkHA)E\bq<WvYdV_@bѸ;Ω m!VRRyY|!f,88Q sptFaS)̓J*-Hi1“i ~"MGD ~J/߉Ȇ XܮḢ@KlZ]MpeYq~RPlh" s <t6h)K.A7f"g2A[#$CR:n_KGGl$ Eт`dxȡ}}l7JfJ"-"=""`e} Z{5ߢOɨB qS`OsdFt`b4 d8v* f `F_,Z 6 mC'Ў CǨÁ ,$`nтPEHov(RD)l5XY qOX5 sC"]JW"ٿ`!40c%B&9< = !ggS)T9h_vZ7p|ë%-_D iee MeL6UyѰ!4 .9sFXxȅ qeI~׮8}4`̑Ç;v칞 0ayЯΞ9{D1,6DKC#lG<}h?>!]:tx/]drIǏhϞ  2wU;wn߸q 0":fp6ŋ;yg=zB⼯b&$J4!~GNFL'00TUՂm0ׯwC\>{D&;uرcÅʊP_?9ܹ}yɉÇ竫SLNܳ0w﫯[NWWFeph{x򕕕׬x'۱u}{,O%v{gy7־jU;kkeW|6o:'ZWDc||իlݰascÒXTӒp***֬Y}NښZoڴ6 VIr,燇/ʞ|+O=WtĢ5UѨ.²)']_կn޶)jFϜ j,_~$5uK1SY<…ӷGF'PJ8@TG_*MKG1~'N>8YPblرc-͡3HMPBPx935R Z rk{z{{{znutܹ}gdx0ϔ8>>2 Ң 7-IHOt266vMؚ]wznwvKLs}RwOիWn޺188 >鏏]|p=Dc,qF@os+7;MS~dލvvtv|ض \_wGEZECm=r8>=~M=\x4.\&SOW45l۾m5VXzT2&&&N>z@0Z[[կ֟>unr2'80>cu k׬{}ِ@/MNL߿mӦ--7nxg,马zy鶥m֮ٱ}lѶ\='| c8FЀB -zH| 8u}}}ȁE6L(`pvujj\3M3ϏM\y֭ '>?*juUMKS˺5xꚡau X|y.'<48SY]KfT|F7!1rрIq>z*͛Q OoFe`__͛7o߆s} c 92${hpPJfj^z z(EO)ZcD1-_Es-q'듩T́G4n&/mu܆W(/KtIo TC}k[o8qgϞ|JmmM4ڹ|O~/d=MMM?O>pg` 7TC={voo9y bl5պ;wG?[yȑd,gچ'N ìD̒#hi顐O?(~VGg hUO>s+Znʕk46F cˏ@fJソtM6}{0}OĻz톺Ǝ=XKk ,ե7}_inn3':;-Dm $)/S6.6 _<sow]mkLk't9iĄL{KS7l\WUU''R9@%=%xJn޼UWWi"Hд[:y}/w܉'&1XjRz*9VZ %P!X?ƵPNd&p Ջ@_ !*&yC 3)J|?̧߱#w;K^O~2 JH(t)I@/)$42۝oܸ988W V>A x42:zܹ/uttlq8/Ͳ]q} ftd漑?ꫯ/uҦܹu'?Ytm#?<+/vwwwn__kkj#xHEHv czgX^{__sדtw'O_3|3螷nyGo'?OO?ܽkO߰ df}e{ee%_7o޼bE;ܰ|> [I N_Yy:"d0bm-xZU43ϥhLdyY]tC5#l=@ s|-jnmPXODki(78>񽜒=_GBCCJW3Ȫ|p 0׮[x$ B%q! 8_/ow;zUO誻=w@7w{ j*Wsw *Ը!LєpPT'SѦ"$Jg+8&7<+@v?X y3yra {p2tkN8>:꧰:=#AAFR!'Q3=JALAKtb =ÊaTyLCpP۝4V'.rt/,`0TYL-N`D'GS"O=ʋ/Ͼ7N艸?t`$_i˯}_׾MgNm_~~g}n9|B u_ض/Q3ǎE'zW{7޴}G"Emz'/Ɨxbf w5# "-"=Lw`?}G+c;}Ff4?yؚ#ZN07n^q`xdh|b eDž!ert:27M\{=/²¸㻊}lRs؊C}o۽ϾU-A >MsC4wm @Cw]aC'٩Ju?NSSÑÇQkVUVV6X/_g"3 ?u{{Ɋ9gycuٿz9QlY4NiFDԥKWU$:/w߾{^o=7lږ*+w}[Q10:?8hZ>YA*_ cVYb_~/o?عSC.\qc+^ǶW%Q pp(#tRaC8x2D3FdB"ޗ!P pi&6:1E)}75E1\1@GDTM%5J[^ wj&l&Qr{sHT\*{TGtt]/Y.+o[~b2kYe"ZSKKYEE,P4.IUk g/U߼vecO-F]}E{gL@*޸e{Ee&(rʺuL#DS`,,Ym{gO&֭]1 PDK$G-ˢx$+(k1(+uWaH D@ aklܸyOo'_y\3jY[ZZgO{׮_ݝ ^5Xobɋ'MUBGGW`76.2 )OxlK*ʫk1M**"GxϿ}W_ kU-sҝ/@*Ð) XQMb(TUk*UED͚x"zӧoذ.ʢ]ߵCwSsg_t&vX0atv{Oꛖ|ߴ>JLtn۲ƵK#CCCSrZ@Pd.`~Ah-?b(d1ERo͛vGoy+w{/^g]zybl(4 ă&ѽQPLͺYATGxBmB"jUʓ8d=veQK2 $qR UŠ!_a(x˯^ VHFMUgJBm,KCD_Q8#b657\j|"?/͈D[Z֮[ڶ4.ETVUWTVE n %*0EF.q31Xee5Z95_Qkj88ЦfaFκ{(JL3 3ٜhT E6LCQAӁ P4@Ń ?rX<?y5H$ҵub٢l<^a\.w ]䛻p5#WTUmڴu,rE ίf`Yl\O#Uc0_u?z/KMţd,mkddsa(&S Sg͟gR@G[$MрUsuydtҕx2UWא./ ߵgw_~kz~?|ĉ5ukׯ[nuYyUu oh"şKrU2H&a][ft޾3<:w߾6UVUEctbh!S_.؎cF5_o ]ruxxtphoΝ.mRD=& C۳2Dlh>cjZ,,I?Ava}ay^!b@Z-P(Vpq* NP. 3_'?_ q2!r957FFVw~`U4 3`adtTL&c^P[ݽCÎ"ivG&آTԡ;0PlwDuàh9Hܯ߸'e*C yrB@3Xg#- bYoETOH ^<!de*U>:6,ul?LW;:nZnIYyVPpq5-p|T(w4_x؉?ћC[n'4yR+!c9:8!LF8UTTVr{W~W77n9a`Pu]}0!H(IEqȄrɕ nyk^7ܝ0$'%г(po(~DQ|Su  '3вOͥ)ΡҽGDSAȉLW T*͗Gl.(,7cS,? 9rFJ~M#hsuJ>+ڲoݺy%p;s[ )[-]bKW|owo`wpH͕O:u…] ׍N?k Ӏ%'R[lq+W/\b;ŋ;'fׯ_}d&&&-A1ld4`Gd'!cx8+ou^;~ ._qęhLc/wZ[gϟ+Zĩ3go߹SW__]SqL6{V0<ɟ[C##5uuf4rĉʪ%MMX NW7.i119/fl'\n~s._rԩFdc7,$7D* :,0t qW n@KgΝnikc?azyoxϿ76o[_xࡃ7G.\k| xpe[Ej:F cki96\?] Z2"GˀĔ<^8RSY׃8i(h,zԙk׮m ]z 6._|Ef2s esXX#>-pI75rMMMy~FJg[ʞb6>d/{3熯ޗ>>1sLt3#U=GTgp/%XUl8>i!"QQ>jϔ Y|A^OEY,E Ξ/+/V,2I |qML&CCC=-kkktMm֭۱X,VX@#+V/kiki9~C]:7odN~-K**;ov۽}۟wk{?{l6S]UJ%5 >$++//ݳgϥ;'!x)4c,dH([k>LDMA(xs>S;;}NJ)ٺ.Y7g7 <|˲kIcr r:)(Eăh fW qPfͫp"NꊃDA7;IYJlU OL\r5c~;I0t >ammm={-]V]U! >.}SL\_Z (2D/XX1j0䨾:B tnaV;wЬR|CTSSӶ-d\^7cdq܃"C O%0|.a,2nx~Dă{s6re5WW+ѰT'j|`C#Ms';)F9HK)M+ U}rÇe|.~ڇUV a1ᑑ -}5x ~T]S×C`@$o~<_@߸*+/PaG: %PDA\~h,jηzW.KxGd(jDH2*KqClk9pXC=p.׾]#9;c=Q]u Bf\h O`t(A[VYQXʼnt*+ HG*++bѨ)^.oI$8}*q[3cvi|lǏjhjZ~M}]p7F0F*jQq3g:;;z{{z i lB! "P 3O D9O Jqp9 94Ag 'Y ._|BhgZ КK̓4o眗 g0ʸ?=7rt'صυ$(ghʢjdOKzBM#8{W;" |`tI(H+E͊(|#"GK̘T"517oTU,P,`;rGxiuuKJS~p@Wy ΁rC]͛ۖ/-//K-4nJ]+%9e b@t:w]_tܼBDPpA"=f LbTOP'SkAL]:$zx3C2_т8?:1G ޼ >'z^UZhYh IE_Dr=\,T!"3ق5mI"+ܱOxe xP# '"tA B=Sw!ԥKfA('(L)̤v@I&FG+B(_Ը%ڦcjGslOYq }s؟|O\27:Ed_g 1$9RH%Y/) 09,?7a>PP5.p: pCφe /-5 bDN9Ӑ!Uxq<~}[SCeBV fbTK㹚jf51? xEu ~_d\v R #ERmp4weKᕐ^ߟ|+F,s Nb,@[W}*kAQTe+a+>M`0!(H&~y.ŽhR^7"?:b,KNK^q9/΅T3y%.mU8uQb6 1DUmvr鑦t^32 Ku gBgx ho% M-qŠ0zH<]p !C4M3I"ZyNaL68o\̛|x?AqXiubYf؜Df0r|@dsu<4N! 4O"rַfAOj'4 v/4!(-蚤9߿i˅Ûiq[^PD+X\X9j& \C/sq3w:25j_I ōנP΍gǫezf9K%SSK1Fs='ؔcmK 7Ӄhˇh0gBUGJrl0U&H Bύ ._Qm`UJ6y rRQrK#UQˢ\@N YCUͺ~ U_xdßLWR %-$8C"? y~!eY/ Rї鶊n$Nx&ܸRvNNXt>,17u~Q_ar<yrH,OU|VH|ݗ0[(*0xR Pgb #@B $8򉐐DK>h3)T\/4^ZP^y˲0=2zp)ob, V!Lފaa>AcODwI)zKU5% a(8%F -'8,EhAc|@8X> [_X0) dFaȔR+fQdqޚ1±WٍJYy84Y O/.K/3;^ h̊~O(/F1E,O +]4 [YΆP)ˈPZN}ǶµPBAy}-$8&6Qd@Ls2rQ"$fq_qUP.P =UBU)METJC< F3&84*N7)\WmrgSa+#4L $ G@Cn~=x`o  ؅LSiwcd2UQ^C>=:`h{â:TUB,Z53z+5fk_xGX2Qd!*( Ht]zXbg"sI*-=RlB(:…9>˖6Jh|?Zg#*TΥyUd^(ѣR]Rc`8[tK ? U=͌ups2 . 9ODXEGa|Б`aJ,ӹ70Mo`~f_ '>SҫSTۦ}](6K@iHi.Y?H ntD^J2_n@&Ȉ8m;(!/FHsaa<)j: ngۄ}j: rQLMr-X,Ț!g0(!"&aA>Y6_s !0DRK"3f%j0b@ŨPCc.S8)08m>bq8/ LUY+ [<G$$*4I0XP0y !V!'p(6B7 K {oV Y.BO#d4p\c;K1!]dJC[ % j]0,Otq,sX v ո=F-٠EM5sV ; t( c1+>5@FA'v 6>AhCF]B~4W.'9&zY,æ/R$礓~ IBaODB6ulN:p&G0:)џMA\e~>c ELtw[X,I Y֠j0!HP ,eVюz"B0,b 9 _h({8|n(h97'yB<0N,CKŔ< JP5YC\hAe,>@4wC 3 vmK~g`jk`T`ksO0|M5cAi`0Y9߱ȃظ`*q@ϕ%kMMC{p*i*^ςM(Kc(L+uǂRty[ Z)8~݈aF#QWmK"_- m q MMH /FrZ(ں[0|ɸ5x4^"F".AUn[\KSJ?ȀG Gu%Eβ|Tpoh E@)ȅ۾g,2+oL/~,$'xBPVh$bXDEE^vѶ \4]Y7HP"He`E =}t}8ԢX0#_NQ)J"+>ɨEsmxpKELh;| &U眠H84hlr@h;_IŬ7<<皚KFi7C*.OOፓFhP)J-UT~ϟdN2:" ΅T gP݃y2} .x$SX G}JzX4ɔVJѾīNVnL+r WWV"EcLP (Rēl>H2( ]uCtxf HÐ'&njȰBTD'$q;оha!0T0:=ϱ[nܤ{I2)>BVq <*nvCf-hU(|4Ah^ )=ΡҽD/MYC۳thB/*ɂDioCmFs 4%!@'+rv!aYC/=8R|a`a "NL躚ɸtT۱ѻ1^Oq$YČ -,^|316N@K8XV[h h:KH6+0HX4t$jl(4]QUHo9huPQS2` Khe뀐#T߱qSۑqHu-ā@s[l< <?%3m7U V{i4mH o@0.U$8P:Ā],؀,p-Pp I>0b,;6 #P4#I|#/r?v"P)W$D}~]BWQ|4J{4b1[(OG` E0 0?hJ*$1 V?fe2%  (*39nuUDG(6L(`[[.oH,2 q9ףC޹N8YjM}`CϡKlA`?pښt:|}]&B<|.{GRd*£8J}u"'(Ed @!)}U"&y<E`~)Sha=P{ d{iŋ~~S ca%^8wAڿC._h}]&FOib<{wywI[ KCC'O?#G޼y+D,ݽg{;{f||T׌dy#{vy4gHæ%w dJmwDB8߽kϙ32L$cP ]6Bؚy0 sBf B) UVV%ZbA0ƑB#TTx@|7Y|~YK_6{I75_/=pǤ_v!GUrW*Xi(ܣYY\mKx4Byso/~fbTM=|(9S8P@plFm3K&b(1,ZL6tҝ۽--GO557pDSW\jjv\q͛77;tĥ\i |¥kCE4cx^..;>h˖5iE 1l%3hUJ1!4?$Y݇Sy#ph!, ,# m Cb,55Mv:޻r?jkR$&ҍ?zk{\ڵ#t:fvhk=s1Hf\xqϞ=n_jlE޾O? 33<xN=19vd!Wlkb('ygWTTQ84K :otuy~_oijmget ؍ m_pgNlcd6{o;e2߸q=3jHē'zީqD*!^xihx$OwH7#up*OW9_%I}}?o\lyee% ]H[ӔI# Ri[.?v~^ e}}}m6%p#AIwFϋ6@C!3i +P\ @֡;_B(>u~ƞ]V,_K/> ϯ\,Yٳ<򋯴/k{W^xre8o W\:І ~闾k`h)U6ٿzj ycG{vu4}D`b% ;m{^ygyfrbr-VWVUFmD 'vSfZ:yr-+^>_ERuuѨD;8?WW^z1Kp fE:yZOoo @x &?'\rw+榖6\.Gŕh&MOSGb3<o~|~髯?޾2NX:j  yV.h ߝ|%KO$愴i -- CCe ' n^#?yP0~wuv>yׯ^s1q=ǽqqkWZ)|8p x: ۱byNyS%[+өkǎol\tT*YQJ$Ţq[֖ښm۶VVTܸ~+ɂ;ذdㆍ=5ke*+V._ѡX(ZKWXմ~ݺub~VXFGFD<gy 푰0QJ7h2 \z0̍6#C;;7˟8vӆe2nmg,t:H$Ø wWd ]ӫk6o\[WKXlLnOO+|qC0/i\87!L(d‘ P}}T}C]Y^|)n _tC'm PN@hhY(2`X s;p3g.;_HysAX'˗', RBy" 4|.ν̳M VHXpQa\P{i#*E3@R 9tHO$ŋ&&˖€kOo>}g~ԍL6{܅H,^[]YYSK'kj$)a6ZlMW,/(3 >GտRXhN~MBM)ܼ)(3J'14ED}]|衃h,( PT;(\ M;Yf (v+b |n<010[ƕ|`$_ R?U+QˏR8-%-)@~& Z-WqJC? pR!ւ %]nm߾u{|b5ʍ$| Wݸvcdh8IQP?n½BN{y8o믭\Ξ+_t- ?<{ŗqKF+N8/DfW.]}ח-]6:yv:]&fqL.xbC}c2LNؖ1c|Sh=&-ukFZUx,ܼq#0Pk&fŊ/\я~_ݻwWWU/]#h=r=o"3 O2UVV&릞L&V^f2}=xbƍbƅ-M r`$hŢʕ+O87gLFdGno}d4 --]*n9 /}yͩD us)4g~W_'/[>CUh(VSXqD_+$^~e(δ P3,zW^F?z7aX4qÆg}W_W^ߴy\dF| F - y.q}1 "-爂Pȏ E{m_Z*<}TgbO mm55qbx,]S_kF͞ޞlٰTp .7k'|]ti47oڹ 746.AF`lSh~uGGǻ711OTqifD5X#(T2!ZVBtph|bSTWW*ZVqÆMKO>pd55 bh㜬\cc{>{;ߏ֬.//\\p&"'Ν=jU{yY9P#? ƍҽOG`#ၲ@˖-;/`;{:yLOgz{7[}_~+i'!_8z=<8W!f<׵, uNȀ (]:&"4#WW^AF4nQW/f` , 0-m[Jģ%[Z]`Y2txwS8_^P_>mo@n堭w߹X &h$ pcccssS"T *K0gUUUH  K^t|,"=8 S4nT*~N<[jcw^z?8؝nftf&<_[/ ?Qv5mP/޺ѡ)ZcT@!_8wouu[]< gb$b8v~ɧzf uF?:@xP #Бe.^/._fFd*FkΟ?wĉh4L WOO#Gw^|o~k_+͡Cv绺Wj疯XGPY'k׮&;z(޾/c\+4J;efgJ-5J+~/%%+/{۶o}=owttݾsƍ;???rR6C:=ߡb}ؤ&~H5| *,#~d6o7FCsЏԇӓ 0+ IO QJ{V+wGʿ`]0 @wxw{Âq1Ł_,'''h*7~J}]myYgϜ`3O?֭[j飱LvҲ bb|> F]LaE"P,E׹{@Ք(rGgwl'LMN }WOO._(r"ӫtl{|tfwtLN аʏhj–˖5JuU͛7ǵbۛcX$ p[:bzhQx -'2@|~*1/M041h^CT!:= ǧ?>c{9O̽cv(>xJ 9a kKa#s̉3}ܓHAAǴnℷW/+o}3+seg'u%`OmkI] 80PA,fӉꊱ̐ٞ/MO45D&-kI%趝ygn\SSK7DR4\yQ=(vdɫuv\:r@cݒ{y˖MITmV)]5|!-* X6J=޾"Jyԋ//_Zqme}cOom[OD-1W(/O@хo* 2p,^A-jhkV._li{{{"fTN&c7v; ct%-EQ;\6]3H`y?3qOLb6l2l?SŝR gdc*Ktcد](K-il#SH۶m׾kްyk`sapEK8>(/hDt 7WqO(Li@r7-/B31蘜Xe&Ib8N0+q$Fh$N--UC9Wcȗ[x"~K/T^x‹^rŗ+.=[~eKzvG@"drVT)Y%:<`WMluQi%քy6VNLLG,g2l6y (.[Ш#8q8\Q 9̀hBә\I$+V=}ի\Ѿ}/^t3*+_bz{{._wng= `:rČ]`hW]z_40br f36<2GgNspÒڵknwݾv? \e[T=}X]}USS}yyK.4.$y#JްZǕ} Cq칊tYYe:ܳ;7ϝ82|y_~ ȂPWm<3UaFGGē5SGF|wtϽ_~_}㱧ڲcuk֬_;kχo޸|;w_x *0ꑨyO\|DWV$ Χa&RUkVVTU\|.A"HgiNByiN_"hD`SOqD$mikI`1_95 >J 'S $4 5_eZ2,m{?zͿ~'O}nٶm-Fļt;oQ7մ,wyUh(3pJ/\rT^Qaj JW7/kO$A, <ϿvvCCCcC͝;---uu &]w5hnn[pԙ/}+6JNLnܸbU%dwOOKkKM]i~ݧ؂gj!< n*J$Bghh V\b:Pðee( il{f|ҴkKHhh.*reL??uN1_FuUueEʼn'93lظ!::''tn ijZR__\zm||ܶd*^UY7/ LF+Q(+*j&å!eee00)"#X:{e0 ##DFEadW$Ӑyڵ\nee6 ʒqj$L&uȵ(}0eK,M}߹q(x$T1/Ghw[[i 'ȭ>Lj?080.$f~HUgLN|ʤE6*df۲|CۭKbotd831 KHqt1oڵ][Tc$ qizmchַSOc#PV: lk87`JLS*o*f&]]W#_2 rk֨Hjt&HsMNEZ_$-BL܉fw09g{vu@3ydA [jH".b??ikk{O @Wk@aВI V]O8! \zb< ϔY $<`sp(|dq,6xxˆ04=`U1  |/"AZdGsBSP됇|PtMZi"P 9bPRG\N6g@Х8JQ@N,3LHX'ɾ7\g|dLu!҅cQ)! BC7gP_a{)S(tD8mːrg EqP 5K_A1s]E-"s]U•Ǯ+; y幘^P%+^f4PF|O Q\dKW[۶lyltxfGǍ[}\R߸jŪwرuk[s+g"q?Uėe\8.%Wo1$Ք,W6|jܕƍCC/]Y[|PDh1 #kR,h@F0Lƌp!;أcE07\m4hT4$&[:tS4-qZiH@h}hfy v6 ^w$|׌3upsah3@:9hjMSA.qH&BSݎcS0&N)QP7yi_-|>ٙZZZR4 uDS43X( tQN%8pEXH$E1eZVX2&5]NZ-@rʈ\m,Ox["Eeh[iux\i1+SjݬSrU,HI6*KQ0b%x u=Lu8\yEVF@Cwa$=Gq=&Sf<KJ@QVME*oHO-!"\ .Ўn`! ʓqhMLL$۶+˗/. :  m%,#: Mn/|MNɰ$: r BˢA5Iq|@Y(r,: 4l|s}нs/w#0MTSeӠ% :MÐ+a&lEW .qzSeǢz` ;G { s@R|L$sua0qUb4'ܡ1n _PDd"#.s]?bR\BJG#a;_|]XC> Gukq"u"!D (4'])q%!LDfNӀ*ꀦaa*?#:CjBրy1#m  Ս(Dubhz 91Q!IpKL6/99رc-MXrߺy_|iu'y(R&}D)I@-J_cABlI$j,$?|P%/l@4[[[ZUIc(#>Q1O}uG!+iА|feem.&d`<2H~T @GgS.r|$4CĉFbC4EqcCpvω"PSu?Ȇ6$HwJEDBl g;]/S Ls;<-.EOfchxwO?&\i>b;-R?  h(±@bNe9c s(iRS"ҙtb[D"p yk/C% 3yk&Ҙ(LϤ? q 8#Sʻy&"Ɋ*S"#!KaTqz/aBA=MCόۅ<߼'}ҽB(>P!7ͧ|Juf2s'| ;~QA(qPFvPBB)b 'I qVUpDLGnI6JI>#;87LjAZbT lP`1; B!~B9ǃ'ipYzF+g'$T.U?Dl,s 41Ń@I\ի===;vhin5uGWH! |Q@jGS \: H4nsC+APj?U kܯ8ces>1| @"Y$P札Z ť3'\h'B(J'劅2  RBA\@`_3ؖ(W(8 H^-ӅsߙCɜtT3J>;:TR: 9)e^J<z%Ԅ5 mfpAZ?;̕Sϔf|1^ ]sXMۥR~oT̑p:hV)1\҂zּ4]!!^!b6㭏Z<e~Wqv:6:Rf}וe<,i<uXr1B55@CD! ~D` 1^LIxDklqRlCEA`:QLUJ|l,ۈ6!^Ε)GLq"Nt^Q(#!ԍ0PBa$S>@C(+2̓a8+VVVp)|ş-n%?6>!Ѵ$1i-"<45T!}k)4$tɄeGӁ]6s aL}Ha NwhO w/>C>4Lg({H0u3Sv}1#}=/لcdx$;9Byb ȋ_1ޥP?:1Bpyx,YbpKaĈM Y柞P2%v\ qm5P `5PIlϕM#/YV Һ \qjLjR\np`9Ng6G  r"fRHY>۲>we9,geI)QbΙwsW5X$$AYmoOuuիUWW놤XMy IԜfHhO u6ك?e`5L{@(>Tblն<>>92<IX(D4|(B~r–RRBW_ "Z_~/K^sKlX苙 sI伟/ 9㋳" Gg~p7y tޅ.FѢ]M\{Ҿ$:C`bhR`5K踱dggb 1!۬Ե@3vӧN=SZRBg{gxB^(1B5BA,~ʌ:=@cCPxRI /ŰCTJAOhW!6rL)%"۪UK[6xX_PX4 A(zG4 ȝ4\a5LǻA,':8(.Zϗ - 9Htvu!\7гP,K@2/pcag1`gM%p "ً+8G9պ|_\q㊥(9/~E.\!w!^&<ҙÉv,8,CPKt,e/,~ !%EZ~jy:_FVYb]jY)@^F"Pd ?,M<.#h^I.kP?x܊ PUUz6]Kjl`?</8Q(*) ;nH᱐fZNr 0K6  FI|"P1L'޴3}ЕnDX90R%ld"K ?]JcyabsM~A8df qg|aa o"AZ2Ku̫}L[ZfbMB:Rȅ+ V X@WeWA$TS{QtHC+IS3/cju9ysG`?[Dz ʎ (iM5NCSUCv㇘U:c'k'.  xBaC@横"H Y=O/! %a RBZTLd_Z8H*|U3r L 1Iܢ%(D  @_`0@ h H-M[Ӯ~&)0ݑ''! ݰ*J/ՙBY3 ҇U!{d5bʞird{Q/;F`8'ЍKd,my@š(2 6"LrqE]xޚm݅,ҕf.L,QjeQO٪\w"5Jm[R脤Q`! '"xUf̖ :" VO/[uIMר#nZ,&fGh: .4'JJ!ڝ\b]^;-q\ޕHNe%u,[BԂ$=ؐ$|EL8> >&Pchtγ*} ]ƜƠvwP/ANt\ A2E"MҬ!Ԑt eOrGY@N(}'m8KC*Y'j8SWt/r`Niw6]Eީo#w{ N=D H$2448UUUr!]Bph zQ*i KIy.!in@(t4;Fiu9+;/^ꖺj |PmƉb¯^az%{Tn*B%dz@- 8Ŋ04D@W2%IcʐivV-5E;99s<;====Dл6GTD1<н`^isv&1 B'fYT- ͭЬu l:YZmbi@H:2+AL27.@V#7Kg>5$]p3 Ah2Ducccuu"!w,40v>H~OuuuC,f" Qr +A2^$=r|oCP} l C7wtlݸѣmfͲfݖ6V(7dyxr䕷^;}Tt6nOʢi3Z;P8xXS#rE~sjCMٝ{Boopյ;wݾ~fR4CA3xͿiMksH۷oݻ5J2|=ܲ7 2F;)w ܱw޳7Է3Xo:$s6|g[+xܼ}˞{?qJFA<51[@tلޝn\$Cٽ[?pcaaatt_UUxJ6"q<'4G)whz!"Ɓfh o*"vG`V|&"~Pev+y}hU+W]vlj,30 `Mk & #u7m*(wF0 U( m@ǤLWGdݺuy!F yI-[4} [ BAAƭzE?PuPSN;x4ԜVUk Vktus]h-{}/JQAޭ{_6\P/z\J<{"l߶|s?u ƶ6[p}Mݍ⮮3SI`ͅNÅə1{e=~D&c|WbȮ+|K/oy"q8o۰aSIqqOOfݲuSaQ"|$Gopofv|ݷ} 7(L=>nŻ#ahHeSeZ0<2|@!WHG'%IQrt dӉ3&l64z ҥ ֊an1'h_@(XXZf̮[ `MNOB”V֬Zyf@˩TpbfwnFcA{ Pj#3E%۶(/+l0p~"^lvm>Ϻn$-qPDfRԑ#4m tvuR=~D&nڴUV2*C Mb0Ҳ$x)@Xҙ4kyiY(D`ڬ⚚U  LM H$zLC8/zXgd-(I6mC%`L,U@+3bblc㩓'N?F4,TTu&OU(<􏙙h4 TE0ņ^6~D{h@7y&9!м0zh5%Sֶ3 9BنGyH$5z ] E1S"Ѝ[C囒Dt 8r|s3dpKVUNب4=cF>EYxϯ=+Dyfe!n\]Ӽ {L 477bEe80Bc<|# !>xkllnmv *5Y4'7T(=o_|WUtEC:}c=vСǏ8q" Xy7>SnJM[)ؑX"˯>,7ԟo<72< ,aP'ơcǾ󽇟y^|\QAբ>9q/k6&K& *[LD*ܳ?W_;{nu]m0plWɐޕm(GBf-:?oY81>&|$ v=6ݼjU~7&#;]v3[6EK;JJBݝ۶\QQvRZccSSc5̚|\yEqo1J4lnm5W|^gT|KkSSݷu>d~fhtreMqQae5LwJھ}nUVV~نֱ۷m[m~@8z{B쑣 e׮[+ eo-1c<]Xho ʒ޶PAqAQ(/񸜀xͭojM#.{ڵy4IOTɰ,f~b"}MBˤOx7x㭷s- Ɓs7QknP ʖ@+cp''yk= Qё}afzw@) A0B+"2aK3ELh1M]Pd/|i#o2i-]W)C&ܐ`wg7퉔Rr+>ƀ?\AJzf? ;x]Fss4-Ǟnkk`w80ves:D h3ݽLESzLNJ;vD-A0CE44'nw/" *1ե?vG]jH_hl!ЌTzT4MxG***o׿6*G~gah}Y hlvwwu]o|0&b=Ν;oWs,gdEѐjSZɦs]ALLM6ixŗ[>_Kuzxdjᥗٟ_vwLR]]pXXFOS.ɰ3ӳTc4iĢ 4:6vL=Y(ZŠ0! O!0cX:Mħn#ʙ*"H8M7h1 iHxRd% $/*-+3 d%L; ELQF׼ T&VãEU&ri?pwnٲz;6lؼEo5k֬ٹs#ԥ4QFنݻwZ]7!=9Q7D< r;+7k歽=mD|~~zj15kz˭8`ԝ;wN.Ɖpff*+*].^}?s|]wUyZ`)vHF`$ UU267fR]wUSSC+7CHn146 -rB#//j;oza(@BǏEݻs-ssY4en!_8 /<#/Z\ڞX5= \?6:YPcJFnoׁh5<22p֖98x<8=}P[-sh )KW z$YÂ0@0Jet C7a Jٴy$CTX`|rWX %v˟`bb DP< $4ܸBkғ$$K8v9mY%ن15==,A@fP(zd``hێ샫׬kkxD"DjV@dDc2$ ?\&t-+455LNL>t{≧Ϟm\XXv@xڈ/]P'?|x({]geLSO>ԩS yti(ᡑ~?x}}FǦ'?ѣ?|駟j<{/#?3< O䱟|;?joxۚ3$c'=o}yWFx}ׇ/ֹx,jJk45Q`@*EE%tb+`|@iiYee%ޑHtbL".46,:` +GSm ޲Q 05Z9<0?]>p :0X(G0MbA6і@EȏYeEGSGaY#/-Ӫpkb[w,dҪ隑J#(.1F<= @gC UV5@ gᢢP8HH7;&YN[1P }܋ xYy뚜l>RQ^YXTcx}ÙJVǝw}|ǎ]EA !YXtRDՄELzĉ#uz>m%9qB+Ax( $Cm!\ K ?͖ѲBtpp#-( %\[-Pe$c3 V}9~}SMzwͪUP@{gffffgfgga3ծ-ˏG&F5(Bs}nbbrq3}Oٷm!6o{֮]v^A^XvT$eob"|b0ir)I#-al[V Y&ˋEx9y?X%]ED2166Pp]`YQ`F֖xJE"6zte)V1Q .eueZ&jkUƆlܶuGQauvtO#驩ϟ8q]h +6;$h$rsM i't=@ 3sH4:>6|l6lTUUft<931s R8?}]7¡P(ɉʢ"j&[aGR ԙ64á:Hpn١25zjs]h:q|{Kۙ3 ukS *.G":@ɩSǎϬ\zkd|4 sH,;``떭yy:Np:6tw/MN%KD M -`fEWWs`dw079i#eGuM\YSTXrS̞|=|ȹsvBJWW׬޲e농j׬__'ǧl%ettdnvrx௧wr>75I?t}%v&If8\Y Փojj<ݽu˖…TzzӚڼ`$Ό;nZ/R֡({>n³(Eq-k5.A(R𝝽M7n=dt}tdlEe!pkV. =mVڎլNMέ߰n5Pjw4=Ӆ7::qfߟN׭f!b47-\㷽k?p@xH$}c(`nJ[S9;뱜./kEջTݸ"J;饷].Pm|@Bevk4#IR^~$B(t: n,jKKK"e][^ܱcWiirtttJɞqkԮYUP/Y8mV[QaiFmC{Bo"' $ή د~ȾuEҲ"flm,**t;];vWהIZJ\_GD3Lf BAES{z:;&ƑǛWju ࣝ>JniB\b9Qލ0N Lt>2<3fݞ *;ڡ+n.--kuJCϝkownݲibb۷@dOOwssXGgwKsk[ksxAQhMJR60S'jك3Y!(7 ΗеWBVcuF&iAdadSaVJX,hJF^R7Y:rt>NAF#>66H_`FT55//\YY"3񡁡؂/( N4>6<4:O*`5)*bS~AAYq!4.jt~nbj:_ymDoVB@QBa lCe_,Drxp!B?`[Ԃ2911<6ZYu%'&͂C K$ EAbEZd+_zc@(H.7ZIT5$QoRVK/<ԋ6TVU;\'?oڵuV*7NGGo?LYyY 5 Z&r[% =::ꫯ|S\~}Ee,V6JXZrS]?+Å~ AJ3%2Y:;:oڸAt:MOVˊj\p<@5U0(5| g1J6l )CEÏh|b~bmCWis/jbM6766B>[n]rl5c-y*Cd7۾h%x+f`y^$|;着DU? Ó4G9чK[o峟ףJ`,,*?>8Q忋n]zRzJjqݽ"aE0~*(; jmmرcGII :*3(S4@!wyWoFEnwlڴYQho;6גD" hu;v BjgEUE&Gy=x6[NkQ|zT,t[khU3Ts0 4-388qAC;[,)#cc*-mҪ6888871L2ǃ, pe{k R:yf e.p*H!?eá -5UDĞ bRBMNXΣ:ʪEŅ6ľI4d0=eCĥ 27-Z^-C=+I>(Ķ! ^ƒ#G9u# %Sɻ2gՄRn\"H^!!C/A(ޓM/PKP|-:G HaG@v`l>؂1J*gi0Jm(EP tQiAH]Y U5P R#T.m3);fȤf6[.G*,])+xc3o3D* (IES:% KV jpkRi22-(,~,\ I>XRA`ujT4v0D(]*rR$U )ORPa9Q+q(^$,rFz06+d .n٥ 9 8}xi fB=p8 0\Sp_ ydDE3fd;&͔I@=M!LU^Hlv;еrFK{S4j ^/Muhꚢ"dE4=Ni"* ^$"@젢.JW:~)b9nrVI21~@LZAg!фfC >T6ţ_B? eYxJ(>[|0A|`C'e R@@!U^ dALtmF/P U9TB٢z9ZZs}fa.+V 7}-8Y|Z$60@Q~Zu-.R&߾,$ T5̂Zk-&jhiMvD%#C#ihH%SuHu`5Ɋ f2̚@CVҝأ)yH'n(SU^$AbgS2|Q$!!%'F@'e`bW2i8fPɨ  Es6"툄[h-2r6U~N,FDP7B͢`T(Lb ˅,0R%X H E8z;yǤDht`4n%"r9ѿkb_i(`k&VD }J@W9$ew ty`=gN@ ,GC4D@ "4ea腖 Ҳ *5ӌfהOP-zba2tLfc#D' b7YQ\Ni@JAd a@L`iG@( ;}r ')H,1;3cfvnzY'I&]7Q= #|* Ki)=9L@}QecEE-ekFy 7xR4JU/}T)Zi n`mDrˢ3s,EQr "2B n3 DÞ3WHb|"3AH $3*< %GlJ,[8`.3wLYD A&8kfYOKh2~3er' ϲLV gq~v KY/2wg-֝ꚉsO\ 5lNh]vs|`!?_+Rsf/ Rrf*AqAv,l% qqZ:؆f7a_=, UM\BWZ ɂა5{{{ 4=CL:Oxܮp^aa PD`kP}r;$H5,(KY?DulRܽ%˘.ghggY9QaІ 1 raB!O35R|@~rw@CtBFf`A!vΦ7JCZ O 2%3 ̢g90 ]$M<<pcĖeұ|6y` B1DqYZn"7/,^|~6 9̺.+Յ"_oj}tw95\.W^~Tɋ!ڳ{---P%%%V ΂ǿ"]UN<|?]q/{.((rMkuB_epIdz)CF y]OzRΑgb5lw4Eh&:::h* HBc*{{n|~nPGdң=ZSO(˼2%'-)\LhJt#;X8/gF6K뢎:8Iu>ϙZ.@4@Rp("< "`q* Œdn#`q\sҙ;,k",9_B^({P\rB,^L̛dFĕ%6\NW9**quAШ4p)A(jrǢ;?:BnJ YYcCe.;}Dlsa58cÝOPo!"0lMxq.9+[IScQxt~_"1J$^'IN[PIs*,MEf "?K*{IYIq~~JT|M rk={E1`1]igK0$1"-{70י0X6y҂-ۅQΥ w6MOOb1B QGE``q"}X |'Hz<"EGDr$Q"|K.(@$D/$ " E`/@Yfy2لL_]8p p ʈ<Y`%b sŻ JMS0pZH`,|;p&pA`RQ 6D \PECL #Ɋ)W !%Qm.CՍui.oz*D/Dz2bZGH??.w.W ]:3oF<=YYǻk8tz#Vh*s"n 驩vŬg8'ЫOkKt0o i:7;GSYS O'Xf#CղD!T>]-dnqan30`*{0&@=@S\~…rDn@,R䐅e0C7.r9i:+@ p7-EHHQB=ox\y%^ Y@U#UbHWJ]]Ӧ'xYiG^Cd7 ЕJ )&&w,X8&@g/qG`Z Eq[D P <{[FW<1-.c0ns8FgggfȖ d >rq N':(U1 H&R==Ee$/«hu`vg˒e~̵dL-b'r#G9#Zʴ)1<<799I8~p$ c6K 29A_oI!!u4=37:6 =`vZLA(̦3loo}A3b1e2鑑~D$Ih?{{{ƒ[%O@PKEFF<<Fʹo!}sɰDpVUAʲ27?76:Ł%~p'k33)ڃt)rfttHvd/A K$&*vhQ\D4(MٹT*XMrdgI$ j&t]˅cdgΜ)//տ2SduC[XgeJ*KNq-ǒ\K.[:cA ]REN^|,s,܉{n]z dc%FɆR@X< +YPVC@M!i\qfPe;Gnǃs/NruM%FifXBd )J,&`/t*]#eePnQ$.YJ /}`/Hz YZ3 6dSd.SaqQrtȀjV4Mz}ٶfY D P,f}N=ӧן?ېHnn+9zyIDATǎ{}.P-vcc9 tӵoߛ g8xI@J0 әcG^zSNC|Cź=nY?ګ9}CIB^k~nԱ# v{6"Ç~77o=}̑CG !HvY~_{ͼ¢b8 /߷|cckS)js{Ab@ ζ49uTZ±_yW^4x:tD=4%yЁ}Gx  f`X4p6רAh>}^z:uF M% ' z A+O⃴mjZ` ԗO$ tyzr*J{}^6{1#ƁW#]L,~p|`%\ry\}bAKnΛ515CQmg t4YQTJV>b8bUe`ʪUUͭV ?o!2oLmXvdd7,hL̙FGEɼfMMEɎ`K˹^xj^]bp(<77lݽm]EEe!W m?/=?8Xb%mI r %T][]SkkmkCnCe/@:pQkW={K  O<ںx4:02,|IRΤ-#~a[7o,/9<:rO b!5>11O~rYo tM7ȳUč&_:Gy'a󗕕oڴr~# -ct:T`2崘%oIC(x4WBl~0 hHb!J^+ĝ*n ݳWetWP" ?h&[fxx=,DXl||b``hxxdnvlN0:v MR7*~\=v,..E^ hk@HL(ĶV ;;{ ^Pɦ9' о &%+VhR Zxʚڼ`8'ih(Gtsܹ}۶oߴj H鰰Ұ56;t۷l[V^7`:*J[[:k}cwmٴCN?+( b͝>u RbM7lܹkuu֭u8'O-+t:}ޜ[';VZuypMͪ[7Ǭ]p?xvm~7553N:ln(-)Ņ+V֭]bEe*{˭kԄBY @˩T:7߼߁w6ntܶ gkg!ZKK}n7}86V6uOOuǞ[6?YH}X21WTPEɤO8Q"o\0/r$o⚄.ߌ|3i6l\_[[[YY Y|.idQ-"T JhQG@ k7l rmin9JF"Q{`B K)@uV!-gN8+ P_O=2451$b3g݇o /a˯luo?߽ CH=NDXKRi!~衿~GZ[F=SO7oͰ ۻ?ÓO=yl>3ן'|Yls=7G9i4֙ DѢ0-ݢjGNV BvJZ.7 N*v;\p0$7լd2jTPYYQՊU5>o(if1ZSSW_z~ &Ƨ~*8mG á7Sn.(ȧWgHݒ!MMV"Bd gN,ZzMЎ9Ρ*' eÆvD*"[mAL$9**}i}JUsdvtkvfb XEc G  %j@#dØMsCADGggҙ$;U\.g^^A@yuww?ksӱX P \SK.,{j,6sx Rtl5Ya U0˒p DH69| -P}iaaarr2OIl!{> Ӌ[tZС`xv$I۷999?x~9d>o~ֱX|9:?!!b-BG6 _KNOݺdG6룵 3@H  紤vC (r&2;_W{LnzNj4DS:@Xs"z^a@-n ,E'3.I2Ih{06;;: cwuuŢѓ'Om޼ bvjhg4kPjдHώPamhB?s_~./0Ar@8 {8rO>^[ϯ'B|wu?6==e6p뮻j{⦅ׯz}\D HtCfrtB2qs/Ć:v KKLw{̙p^d)q-5bn&IHe~}Epf /dh+)zmj%K@.K,ed(NUUŅEEw}w5;v|ժUya t wׯɓǃPaA {Y&-S@3ssoHi}r P 5PWWg[{zFGG3-澲h$yu )QP 3K`gyܹsss_z1//~~ƭ ̈qy1WB\زX[*.;VY05SRIwȲ#AޔSkם20&lYV$ T"~n(VjEr!` 6F&%+٤AhN.ͻTT6ߴq, Լf͚U+Wm޸)Z]gP(<ELXh e!={`˖M%V +/?099oٲEÇ>\bpaIaMn(ףL& 1DE,\Q>*ڎUe_җ~W>OLNͶv &D V.}O~+_?uֿ[~gbbZWDi TXf##Ï7zb|E,(ȯDΞm]rDD9~:2˽e(jW| SN^zꦛn|^zAž}ĐEXj,KKsE1` $,*=K`J4.+ H#8x<.[46H؂s8-&YE #L0c0kssd$DRU ?D邂B;D˥HB30YI56>}~s{S/k!2VZuӆVC*ʋOذVt<ūe`'G9ѻl/d++-Y V?HdlC5uJVJJj|~3.әLMV Dj<+YN;רzuu D( x_xCwum]n UV3g(oK0{o˷ [nzmv"BZ6' &X>&}hgN VۆKI$')D#󑮞'-bvڵk/H4AoA6j2Jf"lݺ~_Z~ {r!4#ٙCyׯ05$QZ= 1'n|E4ʯ7E?y??'oGmmm6Bgf.#唽_܊AS",6l16&A<"kl0F%9تdr"FxNhS(ח qx>;P-7+0~?F:"Jfg'i9lm (,e 3 JzKjAr(*G9Qss[d$tWV'LFW5lyWZ\ ȃ Cn!KÊѪ5ebv(h_!l6s,}7=z뭷y]vmiE.UT$%OЧ=nw"yg;~}CHٳIQhi:6F)@%3a:VUWvt rE{衇`ʯZy_K>FWP0TXXY DFh0+6HDz__{2P.QMHfS75gߡ[n]d2j$ QzbQ"HY/+h-%Śի v{;Qp`___77[l)**B,4=uKuS{qWl[p&rixˋJ88P.DAljhd9QaWWW֟mO,,QQ<.UW]pssvhM]|dnlr2299BC 3D2.2֌=p Ʒ;=5^Yfh;"D#~8rm<,:o~^>z<ݰqΝ;wٽeV@(#T`{}%n/U|Ac2?`Dffpak"~ۊ$tnT_T"_.G_!p7c)M]Hc@> DЍikbNӔ݆XnhcU`̹su'&^{-V\#>ccZ!VTծY;67?I:14b[6y407nGb3S]{#sǏ vݼ%=]"N?&_ /}7&r-&^qo(G9d lq\[<Gg44?WV\馛7ucWFzgG`_ߡF'޴a%]S˯LoW+`Ge2SO666^M7F&%QB4jmk>vXAAIͪ՝]}xlFPolL`F׆ʫV96;>@*ko;p{KKKdG~W:>{nn{xSaXffgc`_koؾcs8D'N޼gwYq1D^gO7zUMaQ~knk}{wmEc pjQA7#ܷaZ3gN89:: [Xteeecc9 Xtx=  BMrbMq)- RHavkͯ|[nONȚVY]{Dܬ)A;5B(d'A,Ro! Wc}4\!3R&Wv&iF,w8\@ vvFt:gf,Ds: 3rTezr6Q+V=Djpdn҂’sپ7ׯ\U><;wLA4Juժ`0aM%EK @/c5 lݽ/g,Vh$[aæ5W.DŁRd;]6]@0rwEMԠ.G9 !p^,?xuwqCN=n]mc3 Vؽgx󭦖Z(]ޞs -.//Z?㖽XQ&J&[Z;;zϜ9yCTz8<1>>^/=3e .i<*^irzOe-&E6+^EcWIHZrWww]G-J" maϋ /芁?bBNR,/ GA"O܋?'SsqovvNQԕ+v*Eb[D"D"!{㱃元U`TͬXMDrRa6Dsь,7z}ݼ{a;,29? B(B,47*fY%|dn6X'Z%J}|ǣh|,[ͩpL%%z]h1Ѕ,=<69SISRBJC?]v N g)UǓJ*vCE%d悹JVʤ2ހ?rmnC5 "ɂp%Z%(C~dI)hhJ[X&j*:g#"m52]Xɲ@Bx.(52AXl٢jz:C?H@2Nྐ'zR&=gnsP&r*ٚL߱g[iQ$d1d1_AWPW$kD\'5xqI%ۅW,$d#DT@,Vd2>=5sM7Y%1L nO#L+3l63kq mNyp(&/Ph-Fϱ%5-Q0L:#gDADyv3XZ4AȾW>NRM$<cܾI#W&)!i z!"ӷ h&(q* V+*WGi_}R䳼)ᓃP9&Zc60M:?-g ϿJwl[ fU%Icl#QP~]=HzOݝ UIa/Zf'ﮫZWnǐ@ k* OYV!|N AG "KҌ^B7!B`[6d"@d aN˪Aߤ)4FH(m }iȬc&S&rz 6HP! UUd$-lJSq$ -4-A/!!fC6~,[X*fboI(㈨ʩᲗY%t LeIڄT UJK_C/ACF fcDc) a;D=g+|^c8\+= dɩH,O'e QEpl*Q}@rt\NK:%GDWN}֟ î%ឋ8A;[m0299!=?79{3%yAu='}V4\BP:E3j 흏D[[f->ݘ,t9=~H# ̿`0//ZwfMU r:LXfI\-و`G#,Ū#KX@B%G9AF:$#U]0,"EuzDBK7 [؎-45M -p!F^UHOLP L;1E(,m"B%4$Q:$DK "jt]H[Jbp &T 3~3J4 /(18`%8 #oA0T p pH#oʠ/=CZDB3 zr3 *j (:ojBȨjYb@(M8)J2iSPbEf*3Ɏ橉ݴ2LSPx:i*fb0Å"G&X%[F&uO <ෛrZ%+,Ӳ.bA $fTH:3rAt+s>HQXN#%JɰhF zUXl2B544QB P b >J.HgҫVZQ  C"#h+V6@0!kꗷ<;V:ģ̑qEH Qh&\ ^˸apC:2[Oʼrs" )EJ@DvDD(IWQ10MVX@ sLPAɤР; v0gL ⁿs ˦q3y%ăU`$Ђd ]10̐3'p LI)oQ&I&)dC ,`D[aq6'E"%$KO7U}IkjF JPUg9&(715,rBi& @MӢrAB0ٹy6G*:w7\3!-˕Wϕ 8sOʎn$ȟ3?@;362(vD De r ?$z5e"@nPB$d{G!)24PQD V$HĈ*k;F>G dVI9d>]$lj@ηTRRxPMMMS("_ Pvm(2|"ʊ^de23}r<<lA=#eLXwH!y/YÀA[hXG\_EÜ0DLG" ==d/7Lb]+ºɤ Q]؄$GU2XeH!ϋq@QodIK@Kb$CXxsQЙ-Kt23df }bSBudG2IlT^ی?.iS̚ qQbR tMYM@]ͤj!%~Ep HK~&;]pr⾸KqqM0#>7sV3/=Geyg12?a(7 =LhRE##Z2NWuO ;nvĵL4O+/**;a3K(ò( i(d\.JPlqn'6o#aՈr)Y%͓v8VnP*" "[ߎ[L ,YmՊvA7%1lA{jF]DҧjGx4dJ#ĥí( 1 =i_rAevh =6zbv""%&>B1Afc>38] Y&`AVl6Q"-z)0'@ !m8CA-͊8dE֓)}*YE.h1D0BGVښ m>' ~6IG2l Ŵl0-⣒ ؐdR2 fA09"SHBU"女5$ȳ&{Ix+}Il`̦$$d>#*  =)|QT:GBc?u#M p6⚉U"iKt(2m."Qֵ !] `*=[=uF0`ddCOY 3nvl!ٕgҖH\K%a >j*uQ-B(>=Q:d>Rpf I2444::0`qr8p8!-1$8hd)Q$$ R%=>6 Y+DcD,BEőh=!N$ 2i(*M GVxFAQTB*QXz@pCqE >K`'!'8i0p-rL1YVo|Ťi9NCYF]ɢ%T* 0D2Wk&ju%*?#Uwa-Te6B#:'\O0 >77s|l:(d4)YѡnL |7߲NtMaKdW4;!Iā38x@j 1$tgYApp68ayO~1ja Cb-rQrČn@LLLOOOMC4!񅡊|d/ssh$1 yMᩩT* pe+zbD4/.OLLNMOtHg2###Oc@?40039 гb&}Fd2| ʀI69b'2?=334aMMώOF10m2C"I=ablrp`vVir:;7$Ih/D^C4-[X籱ZS$Z$ёqEdTT&3`+y~.2<O;)EjL}tQTju鄶Fx, 8v F9 -IV Z{٬f k:r;#qXRR288}}pz<~E] ϬLNrZnhhԓݝ}/ /tH4D87L Gy:b0fnRC,?Sc_~;izzfAx˲H$`Ri u>pf&08]. BĄЕ_S( Bd|)+&E`zޞA`¢ISLT O'2jAtqQb>0UуyYB1j,bnL%p)޽!Y9Q>aOLnڴ{ٸqcUU%DXdjj cö[nYnRss30^xn[GGG8rjr:!VRd[kKWG盛ǑTkk[aAA8?u_)++**+хٙΎp0xםwYU /#+ 555zr $xȈ3C\Zs˖%3(n#m #Xoltj+˦&'m߶mٙ7 C=yd<ُ{wUVͣrKksM(+,-+$2f }pp'?yg  ?D S"*8ך>tȸ[o}UUP-8I1-r6BP@(ELA, B?ʟjig*65Bpv3ATFJ&C~ԣ$ldB9 TeI`XT[V$љ"^p/22&Z!.X \ v\t]OgұX,LF"102cIw#M+XnxM Rt2L2L%ݾށ޾5yl5:uw3Nv=ot:Ar2B$BSi3M"KH }|ӑGVY^NVL$w8q֭χD0h?(G h@--mwuwQڤ*K'N݇nko߳{϶[SZJxV@];o[֔߿_9 aHٙÇ!7ټu-[!RVZms٥gzZ~3wXY  ].wiI骕+׭Euuk].Ͼm %H^{B#IBY [^FìF~ @׭s]0KE~cTEϤuFAQ`hd;w|ͻnY=`W]H =6Q5t z֭-.)ͤ@3<ܧdM5@̈Ť} JlÆ C *(T9J>sP˿wޕ+׮[ lv)T*O*MXSPgT{"@Ӽ!C(̅d)~5b(N*?hɚ fhl)Up@UCOlUɬɔԍnJYLaMfHIi'&d\dHnzP3f1)MTu 6[=T^Ȃ~Q5hU@4/Kh CKV,f2Z:Z(ВX c(&EAt{-L`< ]mC }<~ȏ{_~7uwNO>裯O5IY$$E7x>? ۚzD<_z زqɃ/Dc3z-ou୷?|;:`B{USrJYMˑsN?/\4==?=%Z(]4o).)/-+ Z:??Xaj{{)dMOTXYQrŊ"ͪr .._[)/Y.f >3u=+KK iIV; _]AGY@B R\Dg WZ v;36:!gԩjѰ) ÜI8Jv2 `?^ l5%RCpFfU8AH؈g*,/.XEℬGdS&koP"OjG`..Eh-0__l씮)@hFϾrtMTs̈-#\,B(/du0TRFL1NNƒٌ,N+^ F1iLKvj C0sҬ' =aR94,,v.E40 `têh5Y6Y2tH.X24WTZ>XkaQ,%B1p\$p^oPX&aA㩁щH4ރAN.v~CS3MIvw>k̫k #W^ygT #sL1K`TC*{l{9phtl|!@7 ='6.`h霚^bU0dkW_}kj/*(^봻 qq zzTfR*i:2 RyJݣ2A;.dcPHm\NX!0  tWw? y`ȷsʊhGo (TAPwLO x ggg"OZQXos8(-/y7^ho5u>F)`T2[ȺR,pD(oCC=ӳӐ8SߜHl6P*'Q @ZU^^{;fff7х#_}ή69Ϧ@4[@9W2I7d9!0ID0o1z{O##^@J NSfݡ%>#$T#TqEV$jfIt PÅ0ٮ[֪ $a+dSYZ^!>`-KԈH-Ottv IM/'X:t:cG,G穩iHbR( ј`'YXb8RRZ/|?g*+WjSd̙ί^w~w~~O~2?lTJ0Bv-2ٳg8q/~ۿ.-Zã[ǎXXYQQyǝw|cx<':䒺1~ɕ+?o,--E ^6KrNJ$ %%]KӪ9C(}o$dl m%,ȴY[PU_ C xҦ0BBY *ӠwLfrFC`$񆆆3g׭_ f6І_HF3gX\ccdNj `ZUfj BU@FnنӧN K QRa?KtݘFGFF[Zx iYvۊ+\.,33^zuIq -5NA0)Ίs$Pa7n|aw=633ZWWwCYK_җ~˿y󦼼OPʕ֭+)) Cuu7mr:([,ef+(񥾾>h8FQFǬVƍ>Gηnܸ. a̳͆[6O3]]024DO0^e˖P(DcJy(G99N+]w+ksD21<2keu `* y__/}]7 ՟UԌ(;fQ 0 VId9;?xD__| nٶuJ^fqiB%(7x7ެؽgOIIȌ.&H(JR[[zm[6o<77{׻eJJ I{8j^/W`)QTwmI.qIb$qb:?_8)_NWEͪV^@l$zoo6(;zɗ^zg>sؚt5|g_loBr0 .**\پsHX[k_+nҠ4 wtxx}gN8988l6[&gN?52: *7-E٠hrE!KCFBko2omK&3SLFe6Fi4V~Ӫ;֯\QZH,v>l<Nbao*0L.d5˦0wO441'|M|c3)]'c6","@),u26/jhhŸqa_YY !zj p/fdůsO%8PdN ?ߦ0i8Rt:j7r @p߾}>#>ܳE#aպ̙`0 vns_D =VAazЖ /3NC9x0U V5x<~ r! "(ÇT}}D m7owx}sϤI zV"2;7_\TఫxVWV]Nng~{//~׻uӆp8ɄLk5Z`A~n}'?TQYwK*_PN0#!;;;AqI1̼ :裏>ߵs7D뎻M7CFGg8\X`Q۪nrםw~xXe]$[C!(RY^^UUyYME͒?CQk6fUWWC>k9z驙?SϿcwzf=| ޹H6uDFB0|Q5 ɠ.Ae\HDKSqns};njn])'Lm>Yv&]3ے)%0chՌ)ŔT.|1㓳beXYd<\ Wǒ+9MZt9Ap8 |>D"Pe@B2H/Mr~cn~`Y-s3߷JETY]0J`gRɀjEnOccoff://fȉ&>ugw8yT ~-F,͏Ѹ1:6Ҁ&>?<40Ҽ(RG'zNYz{ZmUPrh&~pL{&&{-[kz0c2#!ht$IQ¯=֖wNy,C555Pl##R sSSb׃Zu0X,W$(d.(t|-7cpH B0mذ{ouH@RQB1Y١6dED_{{{wq<33 %ڵ|qǝwUTT"i'=m)׬b %5S. m.ae`=DGB,V-%nس[V}wG̻7+'Oxw:t>S1)e7%dj$#ֵt\M'!|DԌ/9]TJ?^Q/\eǁI@0z&󃚼]( \.' X\!w T _b 0`DNA!DsLW\R E1DT##t\ٴX@##tBAULD-+ Nbaa PSSn֖253;߾w Ȏ?1:<f.t`bEZZRJFBX*$e0耊8Mf!NĉczzNk6u "e5'gz CCںʶɣ'́zL65WDg䨭xtTq4m , X KjF1 ;t:*Nu@oni馍%%f  ~D%GC=-Zk#>}zqq?˯??}ᄋtl舑HLMMٸGpbHx,=0)@YԽsNƆRbP|N?1٤Wt\4l=7;>#kRt+*5jZ[WXV\\j)K<'$u4XR CX):f%\bsx}-< \C;)բL䶫~(:=%EEyJJCʼnI)ɸ a R~VS cn̚w+5Uz*&dpI^N,s|y/5h!e9 $aONu9JEQ!ҩ4D-.UHp8DynJt=148. A&s*yĩw/@G<ڳPqiջugMu髻ɢ|ɔ|ᅗ&A &8 %/SNgΜy!ob=Q|Re#e9ՁDfzWz{Wnim\}}- *~k+֭k/,D⋇::v?:63>1}};y¢;vw=cݧ{7;׷g98w#1spL224waG.p,{]gzUUU Xt‚"[[.3_}s}{z'bqck֭:2=ॼv`T(,jӜ5ť|?؉'lo/)ɟ?z0dTkKKQaS.",R_駟~P^|={ݾ;︫~rr {hp<;7 ඊ5*0ߠ#Bw~)I f:t[k#ɠZQ ipI\X EPP܄ 3|eBmX9;ǗP85iƠUϿJ kJJns, ͛" ЌyG*)ijB-FܯZt(}nI)$ߐ"%_ҙ%K..( Yo, i- a_P ;rWq*`bbuEyznpp\ D eEx468>:22tCgϟvU=T\7* ȸ@ICRSS|@ Fe\P_XT(6155jhl*).Y~|ю{o-(Υfh0sZW'J ߓh$y2KM9{Ex A:@|+*J1j7p4' #ˈ֔GÃӱK79zt|qvVO5NN*pn\Q_UUSiARhHB .oq#ฮGÇNNNZE v;jCsύ`q+WmmMM&W% A` N5_#K2 Q΢|s!$YdF<;?Գ)m7XYp@[=٬ E \3hlVSSkH#dVv&J%0R]a9:Rh&ep/bîB k\m0CKq*a k *SQ%vMpLWtjG̝1(q).j8+5!E`8͙T$,ޞБ)8CJ4~2Al{XNf?@3&kDf=L[ĂAfgQ J Qe5ccynN3 xPN\BHoRt7l\0sI= Iţ89mauw|TRb]^cFZOجfUQ(63;TGsCh tqާmmi,W.Vx|]^7rw(I [z 9uHgwwOmmm<C%@mPUvO@Bh-), 8p R”@3GL!h̚ EhS3SS{^tO\Oݷλڲu+"u:1F}HcHaq1+Ő$a`3U)# nNd j@B0R`WH$eEznZYGω& YƊ+$Xb#΋'@)!~0xB#9D}&2a-44pe[>R`5O"a@q@n$+@2))tA-0CED&|!8HYR,8ƪ|xΖe},'#7*;9&4H VbW8>- FZפ<;Ȳ'fMIT"l2pCzlIӆm EB{E+I(Y g;;;Q:%G*v]na6 u0.JPQVSʒ4‹ð%}8xT' {߽iӦ Zixd' K"2="#mԛPU2YbMS*4lq PHb B[lɒ> ΐF* -4y)D9#9$7YՔE &.2Z,j*Z> #U,xԁiHb[Sю dҤx" NG+iVBBH@:豄n S93|"\şD"N 2C@ K8,)X!MH|2њ$=@,L*o -> á+?4cҐ6܌"HDF|@ŅH]̚󡞢j"˰*F_\QڙCKHBX^'*SOYܽ dACja!i=qd@B&NG!`aX E+jlH&Yn 7E FBI wM 3xQ卄TlVL U5(IۡjA ky`igWPB4u*BEA#ZفW҈٬qEE kt@e%i6RfCJZc0 h BFlN,04/?w11I ^pj2/d%8 +gҘOA`%`<AO,)(a (b G6$4%DM&Fѥ#z2(C9>WXig`f ĠsF GDێR5M͑avȯ[QpȾ1%S:M9E@&yUf\S֔i+s g\[v9T-<+= bp+_\By0WTz$;}ř~ U WWQ_$ j ۨp@ qnT.nw\3r$:; ?/+h' p H|//C$8\,pY:#`Zv˫驩BEH +-Z=҃r4j>mhNfOh8mIUk0~qXXCWԫvGa߫%W+6ntQٚv|5 8[&XtK0t EUk3p p=5[!7Qq !%*'Ј  Ѓ_j"1H X A!)>>Z Ιq#1l2,Ui#nVibNĐ`XQzli"G̳(EX_8AzLz o9:@BGfY䓵0jQR aq#)Ntl&N AA2qL֊,|]0pq(y s$Z.6 票 \dd$lkC h/! )7 1l4Kȗ_=]GaQ`\%x|1F*cMz):%5Pp,1la?C%ʋOHk,OG+(#dLq<ͪSuX2לVaviv=b;?GQUDgPD %;-u({$wYt2s?p\W7\hT, GBH ʍ\[|hSv `$F@`nn5e5774~h(S ݈Gc7P_SWSYUVqfre aٝ xoDjpQdviFK 8M7m&r=w9 z(ީcAAZ8`Xe,G %K儈"dUTL.qLHᎻ)[|2AhB c5OHeEBT?dŠH )D~,;M9F@CR&CERR@JhhNIb9\*)x _EPL!‚S܈ޕ"Ydly5%q+TH@aP#҃ɀpPBA1& fɸ%HtT]74͊_Oh4qVUW">f ?HA!D'J Ы(R" g Hp=Twޭ \Idp#P\ C8ED*rSD%U,@ bgƽ޻yͬzs!k9bMh#9ugzj#ՖB? ̃cnvqpfF's׷TM %Z=熇%U U JHb8]xiM-FUEezxalb~qEyeFLE5-}:yeE8t?$O1~G@s_6cxpȑ#)__P\XYUXG ѵvMLLb,fȆMGJlY MEmyo_ qOH UAKf{gvL \L:KΖ 8"|X~R? 'Bi#/]?\`6Q,E, ]VT277;7=3SRZK҉P1)qPI)$vAT@e u6X\U5!)[~˚*6T5/0 lF7_&`B3ndqV3'NbCS Νonng袸r!R=w|GKK"tHȓO=/ʷ9:/ >| *OH($#y& mN?8_8d\K (y.-.9xI029̀<(l$I /.Bpxvvb1Zq~ ;+*L\.ON46PR?>;eb1Pb(%'fc zRZ DZq `3URDĴSAG2YT:BjDtbN-rHzsmapDt=chcc^+*ʷnR\TlIS ֭_Ѷ}ݽ{0@@ee]w'>eҢ`1~*HScêU+oVCoo_]m=޻﹫}3bsw?ڸV,5P= ? SXTXZƽ`9ݾe˖B~CV |:ݳwφ KJUņT` ږz7mjjvTfXOģp5X}j`pDNXқ3g)Ģͭ+@g0Μ魫Y|ժq}^/C>,ϣ{m|:op@2&Q vjf F%PVES$y`WR _"~2i&*Z7.J>F7br5l/ΆB < h #xDk~Mc\#5::v|N YaY(ꓻv}{nԐŅW_}ǟسg4q|ll?ᣏc]ty'^|充Ez{{ē/ǓIDϞ=#?S/(JWw;v|bbixgvލ @=>aa)|/d2zꪪ!R!Məgy+i@lN$5=3golh^reQq^BM FGj=^ۉGdJZ+V]AK9H;tc``!X f:~;rFN r(x>a5r:'3 IBX]]u)>\`kr K1$ A=%{.9.8xs%#Ӏ$ߧrEJѤ.Y-VsgFG&P6|2qȔ$BرcbX}}/̎;vl||<ѣGQP_z饮S_^{!$ ;8zh,?q1(஠ }@O< Da%%%J338E\H[uuu~~A B[zϜ9Q1$ ܗ)rz" ^y???}NMO' ==55. T544Ï޵;?ЀN vcW?;95 NG?ҧ>)ʹs!oz>799²*[m_گ\666?;J2\ {@['zBuC~R%q*s&lci)*lIq2-ѬDN1l ss++j1*$!&Rx\AJEeUum-5ͦ(DSwy10y xL1sY^YY[ZZ Ńf\Q]Z][޾cXTT3gP#{vݳgӽ(ѱ@@;ZZKJˋ~GMu 9Kc`[^^QYRZiM3AUU4{\^ICCuq/fl TVZWPԚG&U3d~s! x&mZ'?vw Fb7JJK@Yvww~닿zClJۿ|YؤQ=XSMCz,͔L'FF^zWw/+yCuzd(qos5e&cc3>ㅗv5ܲ}KM}qlrhAJY8C"dI0?7`[ ~5k jIIYiiY4H%禧:km/ΗÏ܇FF846:L$R԰*3S3?7?F6ou+KʊFZOK׮^3:60::O|Ίq龳ӳgΜkO=ӳV aSCR\# QLLd-/C6o7O&*p[,MoQŐd@x>y'ffc8znthF$Rg>9UUjOXĠDɤ:zVNBz#dNG,Ð6L,0Q [& Kt%r-BաC0R9~Pl#/.ȎI|]:6H3cH+-OfX5NrJNl"bZXPnw//ʯgW7~xGii)cn$t8 4 74|ˉ[153Թm)"H=OpusV oH7'akN)¨(&:^C9\aIIYEyl$F3iA;M>}vp;0zgf@b33-q=<2<216USSL&ܽg֭nzUɱP8I$ ¼;^[w~5u5v.c00"d"G3_8w\KsK/;a2UWU] llllbrrtl4°0+qlz[H /JRŅEwyG>w+v7Cx;vVWVVV51)η?OO=L_` D}5ΠLJ65RG0j`o;`}(|D4!Ō02Z ,K\j$%b-((DnVn[iTE@ 2' ʂqDP}ccaQΝ;{NOO H،$D rlZXƢ4 LoxM#r@˯뛝?w|OONqIX,*..HёP(f5?`w׬^ '''wc nwUUU:]v##NUUն47{}8[ ,myO"ǎATwt_*/gffCan,(l'^}$!ˉet` Por-]Gg>/}77/ u?qmmbWשIG>wiG2 CĀ,?bf2$!CrYv5ܾ E u%a+Ӛu I~=ԜANвeeeA:NWSS]RZMƏ27 wBU" 뗾8QofffЧVVVQ̼Ji[<P"m p#GGGЊ8 ӮܮZeUu]u!@ʢ*||J=]^pjP9(y(Qh#*yw&SxZ\\y4٪U5{v53;v>:='@MMMii)3GE؋/822aq8{ YWWWUUUTTAEsƍWM>j<|cn-6WN1X;yڵjj*l%mtuuЗ_G4:6vwm޲CmZۊ֢|P: Hs :K?`:::Ν;WY]曛p9rG;!j|@|+;2\1:Z){M/Y2:t*JJoh(Xx'VoJ t7o驪uw}<{< MՕb\\\c%euu.Cn*dDIӧ{GF6ݼ;8d}~ܷ 6nx; 75|>S-aZ2(^хAbJиP(@ 06IEE4FlBBk`QPt]@r (*ڲytŪX1>Cmmm.dQ*k*NT*>ϟoW^dIJZ7ylҵe59΢"|_]SST\rƑm%ŗC9U喼<IIbLi[f'[ZZWy$DcQբ@uUvV]LnZVmٲc|lz۶m55v'Rs{N }WPZRVRRT^^HN]vM @w0TT4((,Űlv\UP 9KM`BGG+=y-͍y8kPh^WW}]wYTDDG"q`եAH$ WYյu^|޺UV!p 6XjkjClpcARfE"EA9 7oڴmEIq1@y~?r8%: ˞J0On>Z634$ydhL~f|jjj˖- *הrsf;D4>9i2Nq2E3={;ӑq---yFdˊH!Э6Wh&>; k/ 2_ LflDKdIMx,cO۶ TUUIaaѻ}~xaaEEySsڬ+V.o9y*dK2\t/HlT+6ƌpGpxbb7mv&T,%PpvΝ; |E3L ܦh4!E(EMY܂]̓fSH1C3" (XCLi!" z+%msS`Pp<I8n#tq$Z81ğҋV `)8G~ /3Sޔ,D'w)Ryd/j:2vN ݘV$. JQT>Mr^JkҨ[lt ,T&GBi04 M| 'NTUGYYeYYî%Wv#1ڎpL~tpxڮQz{OǷ裏>zTV֠:8s@Pmm}uuZ(n܏;v~ 99]ep*刄/eu/0,w{7  gPxq1gPz<NՖA#kh c2\B6PK%ʧ( p4WՊoYt 4&+wC)噪ݡi(F$AdhnNBs\DOq)b~4c-EQUՆk/ QjX }B?1bwr!GItx)chhȇFq9fL>/X/pH #^GP7n 83RW4m"F_p:C_$LA ;ȝp J\ET#f9~0DhbGF5z9tUjp)Y> H/_%KHUD^ *&r\+0$(N$RBAT_t.yq>8z *\q_p\nt"Ф^cP9Ő_YrKi@ybFuY*N$M)on@@J99;3я}?s^ م@```{^({?m޼r8\h.>-֖#ţu0$^FA`(DQK_WB%,Y]^H!n607,q9 #ӽ]Ƴ燆udxu>A$7 u` EEp4lP,X{npN9#d–G&&3o2Z= Li㨏L$Bc0ӄhd@<] FR>q·HpVYGL U=&I$.Z! 2VW(1/J,|!c=sľwt ~ K;!ÿ d+P &yU܉,.)|*f|ʹ94Jk7ltwu] #'b JssuuDܽ;׬i))G]`b;;vo(H4R^Q^\R,"Hkx_*~Aa dR2s&*v?|lyk`54 Bs#CSgIgf\Bc`,ˑ,fAq0 QCxd !.BnAF? QLP̋#¥_LFHZRNcG)7!q)rx[&Ɔ& |nr8ld` LKgý` A K6;2ށ$F kx˿ngZp+d|H+I]:ڊP2WEshp&}|).^2sD&TЬISJfrHtp)m&IR.Et@]GHeq0o,1vY$& ݓd7F0i0 p: /TUUZ\CEacr07Wyn;&O:ej%|gSll(M=ulq"s'N8uy3gtsH=ěU,Fo<T.WcCCccêU+V|^D[QQ^XXgؤL)h)n I[r@0R%S {KSLf=dMPP|ޛٛMLUu_ӋAe$ ^){Ueɳ%,yK .OX2g96c6_Ӥ*'W3_r/sKlR)KlBc9i\w\\8<7NLe/M(N5 \/`%yzҥ!Lٕ9 [T8V7#_̵Ρ)%ʬڂP%5HM)1M$5 ÀĉbSscc k׮Z-bw~  L:j&U?Ν}v;ysdxx~~ԩX4io(a$DwaH:$^"GD#Cb0A],I#W׻W&B<tg/]8h9Ȟ>|d\KfɜC9\W1/o]h첳fN~ `ePBBe:I 4 RB.9.톌BpgȖ/"r[Q(SD_ =Ok'Rl%Mͭ>9Ouu8 to)n|vqc>_ 7>ǭ(>K;nM#r֊r}ѓ'O;~qQ_ w'C!{o"oKÑ/,cq9  &yP33gϞ~'FGG#gR)+Jr5" "e 㪰_V6h_1 vlтf 'rrKD-LB K6K4lTfYb!p6#K!2m*W.OBm,YmEKtФcr->+R󇭼 ] KW9ݵAxe6D¹gHCePO P|NʘYm3`֗ޘYdV:Pbr2!f1B}ZڝE%ngi0 pɫ83Hiȸp {$D!t5k@{ԂH\3J5rxV6KA :%v&. l$n-Dpe%G \ Br: N]Sű 6D/F̔h[;$0 H!Rr2eH8X9Q0x$lth ""$Gp' B$Ҍ<"%AH?ͫ7($'x"9ga[Ě5rG ֹ\\Bxoq.H([$`P摡q;= 6Up?*ҿ4\+&owU3E6"(Lh(J4T٭P.›GakeU3:vޱ~ZC2K7t 2Ȥø (c"D+AK&FG17$ Lj Jdqxxtll"HE觓'Oy%su:m.Xs!QDZ"9­% n Mbe1լ&i&1bYK[)ݬQ[ҊuP IQnUpLR#!a7_aB,iK'n<Fk,V˄YQ-Xb97b)'.s !('6 +rxHAXBK ,cJ+Y?`fģ͒DiZE3 2"Ȓ"(:Hۊ3MuMįsu, }"ua60.)m+#>9 RlimdaA)jUXIqOc@rAJv!{t#")㊂QKɐF((**AG$b g&mH W"jIP@INU8O>򒊁' 0f$tK RB ,)ܭ$?jAOYRȩ e=nT0@"@% OnwAaUla*S( "_׷o}µ$l:'$KX:͇ +6YzACu \%ޒ땸dIpXD=1<1"H,u " !sW/ B@j-l s*n<} qb B nw|h,:2: D6( BE5f$)q %|,IrEG QkLL^Кa"ff!qT3H*^>@9O ;a AHЄ-r1.^-)ZlU)GcjӴy֛y } QQψ ?hӰO]=[:mgRyCVŊX4/D/hpF)D4=>Vi"V=!2 [ċ!"܁:{)ka"HҌP#ȷUE@2L 49U-' & Y 8pf\uB7Vx-PX@^ K8 # s9E@Q1Adm @dRjL26q ~@DCFAdROtJcgj;ا"|h@f% l Ԋ .JR6Lm8$3H #=ÂbN. Љ %8)`RBxA+JJLqR ;q H0'gt V. 7~q2$s5n uTQ.7,ގZeO;.*!\ W,0byo*32g[^7W0g.@H@&"RpJd}Fpc3<<666X_\O$^"pR9TU~: :u20D,I %M'Ou:+Z{ӺJPդ&h驩ES57W95s5>1U_YzlsDaEe]uq s~aTwoWg7JAY 7W׺\?* [ЩgT͟;}d*YWtSEyf4gwvPU{ˊM3 ;ztxhTkW]WQ^MA?lccC3󅕵e%.TbJut޿8ćcJYY[6UW.P,8F ,z<+/ONoؼVմb1=ZSW$  <ӆ%?y⥝ǍaNF4%պiE?1:>r MFR$ ^O{QY]nݚ+͂DJ=- fё=ݽPvխ[@USSr-eBP/}w xщNOOBʂ|S~\&HB{5ew&qym.t5 O2\ͯ(^b4YE-DB"{F E2ҁ@(™6mgVo 6t8)7_{.(i*bQ>o~ꆪ´~'^yex,9442>5<.@_k;wT Ic>Ҳ_}p#8q -rP21"y9N0޵k4R33Ӄ'OZ.~0h_,?Q>3Vo9@sLt}O?3Rܑ.:^}Za$zΜ9=~☢ t~;e_sϿ\ ƢM׭BgiU @{^=u瘑NL{0Lyy-}经J&RGbpyTR^>119|(/ >_^EYcv),(s5pȲΞ;u;Dp$033oᅅ|EKCɾ|{vo_8/E옘6_~~P(NDF+ە\y>̏TSRRyŇ|75=OMZCCSqq1 @`7ZA4jd>y?q`p(644 +>z1t8y)<^2)yⱨCjk.H(=rS|Pe6 0o:_Z2p@,EA]rzEWRx^d,$g' Z,.,LMMrq+,δpqA2i 9Ee6N򑟻Mk!=O:LY#VUTT8*]*ܹopuuڵkɴ!zј `dr!x8a+Gyo妛nnji)*.}5#9"65XP2,r\7P&f`.բyC0W7E͒F^6 i7K\:~\Xqyx ;  070::wvrr* '`Q)"7ͱX]Cgp$ћ(Eq̙:ۛ/*+֬iU51 =ɴHUM :)S0+K-&K,*&ӝB~e{};??>>Q#d0 zY-d(rD)fr!kA*Z8t0}=ׯ.,,QUMU 'Ot:] 7l(+-m[v9-,,vww[jsK[ꚪ{Ȅ`$ ܌c[ʻm6767nVh5͍kֵ^ݺ햛Dw;oǖ۫*+jݶUO̜H]zgqQ/z YUMRSWSXT۴y3d65 E94ǏWhyx4X]SZ[Z4Ͷp)ioaGLm%%e7n1⪢`NLSjEܽfWVՐʹP$觟KX]D}g8ۀuu5m+[_,.z''YD6M}J]:LX{=BR34ӥc7l Ihnm0n Ƶn]T,x$`"WH]#5gh>MX A/t0:qhuuDUQ "npS QlYׅ2"c'b4D4t_~>_WW&ƿo|7>O>{0|ȑ5#v%??~~>ۿ_yQ)ctx;|/}ꗞSI#SXC%`@IIKt=z`ߞSǎ1.BTcW/8~Ech{?s% RDt;00y #H&H 7RmF pWin~ a0} _~sTreciV .N !bP244200 SÉan&'S~~려Çc488.qYKiZQιH8DC}]E_+xPb/ܣOuk׼ S33?ȣk̯~#mC9\#p(455}k_~//?3ǓF*y@0 'z+{Vn*_X0[%ލ㴁V$j,.ΟiߍQHOO lSOOoAa^A_<i0:ZJ`XoK-,vlb jʙɁs HS(ٷfsm޲n /{HKgIn2򜀴ZԏAzСCV{nMMO='N[?OuQhL]W(^v' : #O5L%\ #sg ==PNmX mZH8 0 ,nGjN M(㜖f~뭃C#SӠ#G:xrŊ\vi8\}w_y?䴞HG#p0ꚟffAXl1@j݇~Sy=>w~L&u?Kx׻޹q͛6\1D9IpLX7 C@;o|~k֬tMyp*sHGw}w_pz*1EC9BD|} ^}uѣǢQ~yM.vqy2;7?0wӽP$مH4L[ N@$q]DP6@hzzaV'xxg;mۖҲ"]q39O,|%JQ=$a֣z =ǎwzl$tt>t*a `Eĉjk[YPMGjjv{m]v`F2 RzAP(`4FnvL߹;^yFDY&&¡L`νNf5qC Y<<ɍ dE̋f{<޿˿9r/O>ugvn̙֭{}?{+Z[5M C"+S| }&%4\EBpcHDwtT$GW5n p"K+|@ۣ;,׬ڿ@`18?xࡊ‚|]"b;}_8q+ǎkmi??ַv۶[gvvn߾]@" ?OO/|7~hy=Mb nb,(f~k'N{=@NOQQ1WdP6r>Ӏs!:H86nشᦍk׬ټeӻ`0?ϟmjiBOj-<~ї^zyfvHU48QmV̕},E=}6KVUբ]C ~/[Z^__u5Tڬ(ɔuxVM5;3/O=5%]UTRbTCG3relT{*M&yn`׊ w^^43I$;۳y}~?142 x,|yC#??~njn,,,4rLUWA1Ñ;$t[*U\tg27PyXLfK^^ޯ/?mn}u+?x]]o:y2fZ- KoB\-ߚH(NGx'.p#b@466B@jte%%%PD`vD5 w#إU V55eJ*{cI09\|྿ڽkT,O& Qk\*"Cc>V4 5= v~cOI^~cۿureRS Ɵ` >'ƧɅowcooo؋ ^RRǠCݡT4%-S`sAp/+-At0T[Vl b#Qۂz2\&8]^^+py?,wqgSsn/j ZH%W;}}'埾1=5я~bV6¡`@ʞ TnY̚ s-j҈޵/-+QU%2Lڵ;^_8|_#;4Ev뭕UPvk444O afXAn_8/)+/ֿo] -tOOO{i획yr(tW9g\C>i$vJghF{ݱcǡ=A/,,TUHsY(Aop[q&tz(Z\ @xԪp8, _h{h N`-=9ApnVeݺue;^qȑR_P`j dLqҦbGj[Wjq9QP*DO ꇢjffرNH@\t4qn.GGF557uo<IS0A@qG;QX~o|||+;fgg+*;?pٴi=︫fא IC#ѱ)H(qr!.lx} 0O8ڻ?{lMMMqqQIq0јU %1Ify⒒Ņ驘`^Xonnծs Empp詧N$ov Ш1/j0X.OgVsIIAoDM7o.+NB$D@ϐ`AɆdwlltwK e+&1lwV\yTWUC)\nI޳mPPBp4BhV] *.!4Xiz:[w%!;j`&K̥YF4G[{éB<^ss>?W_> ji]+"*7y,䞔BfьGRK&t,_! ,禄nybzqG8Wijj-.. پ?oNy~_}CUU;<{{b|dhhpbbzKEGGLe90[|eo;rdwEDܨk,/hbjbgz|j``X(kd̩;w[ jvXPW[Xo$ǏAmNuΟ>s\3Gr9]eya=/?,870N420 3}g:kX¡NumݲK__Wo~]_=|状b}Gw9~4sb ͆h:em2B 0E4aד l6mݵuUeeO ,\F^Aߐ#atww:x>99{t٪**+m68806::?7733!l6 o ] 75pفB,5&%~0" y )3_ r+)A^|0)N^ҊUiEqA:vKq-LؼX* 9s//2"agH&H?/1P*`\ ,AG׃JfQP O#)/ Q<sCuuU V|mep30<219PSSU^?ēOKGPm7ݼreh[ۊb9#yaax~rɉC?~|hh(UEH{㓓-MMHRiYΝhЮݻ?ʹaƛot?~>xIImxrhn)),ϋcyfYddy*LGG#W^~婧ڵkcjkܸaCscj9u$jEWWwGH$߁E}3 ~ѩ^&y\\}nlNSTotY쳖8tPuu5%^H(hVOPt_YBI\nvᲘɒ0Sq3Sއ!@<(.!/t/E,+¥cFR |CP(dUp4*'TH4ۍ6i]nw~~I&!YPP `bE"L$>T*PūW,z=kkKN7j*9]wsUʼ|Fժb@(&w#jk}F? S\TiӦkTWWRYYYUu5MZkjmPP8k $#(ny55n$1ĊmTa@>677TW;0cHa":rx]nn۶m74==u3\]ӌD=RQaMn޾}{kk KP-UU^[6}Ӧ͛7o-ٵ ji˖` ngg@Ѻ>?m6t8ʡ~ZWQ,&+**o޼ie0 6zZUUU$=*:`2" g#icziIisK3XK9Sd^p&7`g j0ϏQbuIq)**^zm۷l{\`DPٔ\xBJ~Oj1>R\Nig h}ϥ)giSS5Px tUJk@£oo_eْQ P(ɵe(O>DGT;::;G3ꚝݺu+nI');Dp ^m#r "ޥ|iH(i{jY8-ȍ 0+5RKK% q fy0XQ0fkڈ4gܛu=1<< tP(v:ԀG繹P(U=dEEEf  sgQ.Qwa39bLEV6lJ1wEEi2p `QPٴ89zc<-60 K@DQ">(KЋa4B~< 00#@HOiM"yL0 7EJohs!72lhGFO< -n,vJ䌃hh\ Hhz*WUᄏ Q Z1)DP0uFV2m%Ip$I qJ,!x,fl#_p>@`2($BsSH.$p'CD+őH8 D&QVTT`)QUӎlWL3&Y$s0F CmB0B pMnbz \Ng8\q=ClIi ag\g@NKY[=͏%V(ˑq cլijEEy]]kFFF Qbr60҂M<u +q7R!@( e)dad8uq'ˮN'"ưv#d`r9vcC}ksSQa!'I3q/dDt SrN a(pGSwzmn+8k6aj}pyYGG*c5:6$Q08EÒ E x~ I9mʔδ/!0p kB E@%ɥM~K.x `ϖ+:Td.&/Hb)[40e YNLKK%O`YitL2[@YRxgpDY#d"DP0I2|e#b̔FYP&OL!pƁ,g Y2F^K'(a\EYT,CH_(x @Bg+~ ׿~֭P #'B7b0&RsK/KOtCYh_B4҇KT8@!;bp w9\ڲE y*\p aCEx9us]y~?t8!|^n1j6ML 4U-ϫ'UCQG, ~eȨ4K'. q'Әɺ$IK^$ R"[&A-$&ILcԊ0LRB>MLE[-3r;~e;?rU/ $Z"Y2š9cXYMzzV`$G4cS3K1B2 sY,,LL3 $"D&u2$"YBWrG.M HK/n^B:FSG`W) a ,6w9 ~6,;eAG 95vmPZ+:$ ȶAlKleO6h`K>]&#%)RKKRK./W'2 .<إ)NH1_Vx_z87d%^'N-8DHpI%4.Sqw80Á /RĎ2oooްEo,8)M+YT BU̪E3ҡ"l$=08u~Թl$2L1jV,&+ MaZ0/'Wp`e.y)Kg4]%  3ht"X2˒[1喀<̗[.W69W$IT]8dcNs!7I"l& 5 \G懄ORS VydO 2fy&Hrp Ë.-.g li^n%©ɞ..7,]_gB9d-E}Ƭʔ%S͇N;vvT$L83L&w=,&jl%B}H{Ȧ $Ps!C^WDrx3@}Ye ʵMZx#{ D&gHz, B? Ev2׮ rj 0ej*i56G\096<;<;0?19}h.pzddps!=0 2EIAf~}fT SLKνm <rq G!Krx]\,YJĂ/X!F_Qn70ˌPRK\4hPM/z2Q#Z60i͖캢M"zbxl!gñ`8O !|k !D]"YIDAT9Õp)dv9醬V 4I@Rt*f߽㇚34 2 b 0 ǒGBq0mɺyɔ)\hfaHdfd/6$/lb6lI(fI#.?Nwϴ͙SwVv23x*1LP()3i#ipSI}pr|zdjnr6>OOMM'Rn2h)+2a0pQ8Z3G:kuXuUTQśY{RU@m;Y.1hwhffK0gW@L8W՚Ǖ)RIGjXNJ7Ӻ O0!K2*J6W#ur[wo]s[B)4361y؉c'O I&;\&^vgUTQEkR&ja3TXd2y{SqaxhxGז}G]-?TX¸ .|}r`I%#(k`L$JdX}}mC a`Mi#f,y:[#3Db:ɤg3鉹񹙔lK}eOt$A@Js.!#O=#U3Y!UGVK8*X- cלx*~R(Pz (&qW_}uxxLhhp駟OӲ,`Gnj/c>TUKP@*NSDT+BIN/KDE/ /)z-%tMSrLIeGr-(i9VD9ȞwUvDi&i Oc቙9[7elZ Neԑ>Ig1ԌqY"ve|,^wS/*b?-zDnT`+Ɗ[*(|f`s qxA+a@)C8(b1psν+~GϜ9 u,%ID26 Xo @ӓScccP%E6/o)<#K{ڛOJׄA\q)kU҂fȊ )ךJSsgs2,S 6]OFն斖ƆzUOĴ ΓE(^)`P_ XR)Povʓ[-n@R*(YWPUfW(!Bq0 .A䉇R5N񙙙/777oذQQT}`_|] ƞf(_2)a]qeRlNcKm2c^'Rx?n eý0:1>sr|tҜ9Ь*ت!$fb>>Id͸Snҋ**Xp7 _wu{QUubbk׮][limm t1Z[%/ yK8FiŲeӤDzD PT"8 45?2'ƇgyKIZFR2h*'mA:2U1LL)nZ8" { PЅ*NUTQEUTq^/#]vx7pS[[[{{{,W:{  pĨ OhU?+ M̞4qCHےH#M{djf:Lێ ݘSԴLtsLɸ.DlAvdJTALN'ӎ劲j2&_q.Ј** ס6546tMo}]6mڸqC$ iࡔl*P R/NdWYāzXx칓/]?<Xڄ* ^e+^)^"xEË+^l,%-*N4Ê˟O9.=99N{z{ +gakl@KC $u1qE2WsՐ%i)ӝNS|Xv8ª$rsA,Szn 횦LZkS##MXC4XWKСp.ZrXܮ%Q*%~Vp<ɺ(*FA)Kq(o:/E :/E :/E ,:ˁ܂+ O\ .l*+_75*n \WUѹ!lБhYB-x[Ҳ<1PbA0u]?q߶qÆE$x$GtKGK5uGٶqdph7*Y4ES|:y-.N6aY_5hokۮ~[4芮&v~[^zd`XS^@<'bBd%bQJ+Px|Է;tÍ,C/+wRJaC=v~'1kl@WC't)qDMPB:2`ɢ*!iA)ݝ5K`VVb"x,+7IL;a\\2ɮƭ] H]CI^#{Ϳjϭ&c1vD1/p_t¶/ru"/e2䗵ZThQUq%Jqk'*8_Y=GZGE狂4Wx(^::S< +\~J(W|pC)ɞ/%f /+ D+8enE+ie$Pm!0LJjÆ(Է^8HZir!)]ɐ^8 $^93?312 Dz4t5R&ޢɿRm 鮃&S]Au5kjwBAȪT>@t!|9,X@ֈio4}+ /9r/-f(d۶=_R}aʀoqPjRR^4t6)$IQH$ җ3Jn'- T%Ċ$3\ z$^K[R .gh:+$쪂űH̟)(d)TLI>w׋C#qǏOLmƾ DXZ[=pB xYs8JQÎl$G_DSp\r IC(bfRiInhμm[ 'TSXqs߻nkvdQV0:d͐SwpGmSC&D,ӷy. *92W_WdQh[ل ɹHקKI@Rt$ 8Hy lˤ+ƂzKpْ-[zL]bD#BWE2Z 0PewuuB!Nz-PqY;OEoRX-I"2_ArEU f+DXC'_Xpɹfbe8Qq wwׅ~_w9#diw9cHT2/VG_*,g/Ʈ[%}\ߘu8_Xhm7vh#+‘JDZ)\! nQ(9命%iD_}@ PQ˕S "L>ؒemW(.{遄F Du倫,MM+bJr L]02e4ƶnhyR30'*ocss u 3_xEB `,WEUAvc-ee#qd \U(ϭYǔ\G$>z+OkYinٺ6w]YTA\81 }92 32Rl]s[۽}ӆX6.)o]=dzG~!ʋbM5x+' /͋j$T*"<+/n`2h.K'z `Im;\u"tONo%邓vƲt2 ۡ'eՖWTWUp4 9XkZiIk4wlhjjk iEƟQ#V(և R,+y]uz6[!|Eiy‹mCFVQEW |„H8bMӄ9}YuCHoK]YK ؋H:sq1uC,ѱ6;i)ۢ7d-ʒ* *"9 ~3 A8d@:žina{_֎ƚn.OIo_ұ,KՔT*555u…Q0u 1VjUxv^\ȶ'a@Oi/*Y hsDעJP![LvPM#56JLؙkk9k+"%K6$ɢ K(9d \Kq̰kmMuny u޾kCgOKCMH@ E\8>"* X׶^Q{ۿdX\k|.?x)rE@#^\mlv?P߸ty* `<UGSO=_2 D]KPÌ9:X #ݯ5>Ō̌Cs@pv\Ojh%$Q4ǖWȂ*#H,YrΝw-{[:C$9 #O$DrXjCl&v=d_~䩿. [R³@^~)/jӦ^{(|NX"x z KTK-/! ^\PcT/[Y@b/Wy!"EA?.Ju~#«jQ</<{"x1 =dYbD_ycǎ]x+63 SɉD"P CeYF mgu\AA~kwˆ֨Dfz|z𢕘̴,: ~h$M@Dѱ$M(:H,ɹh&qs{뮞m]uP8*=DKD-aCqNּcN:8I&z"T W{\F;:۽tF"hO(P.^hmme0ceʖ CLXBu5k{?]޳kwm_̎St؈LJm@tLʺX:#Ow`NѓP{\}~1M?`i"庪X_ˀxUTQWX)/^b7>@l$X`ۦض ?Vd"}X@]C+87~SOgi}jkk4;)I?ɹrpDѠ"*P^TzOV֞o] cvt|y19"\Qc53t$3k 6caMd]QQ8wb'B1Pƒ@cCC4;}ŋcX(CYwիPWkZUqX VHh{@:\ru7TM\@MMe\ }JԄ(&}LN:~'<۷gõO?t]]|mov]g֭u袖"LȕXgoKϼnꆙ][(d6Ԩ7夦džSB:%iqn"f{" XQy'lf/x R8?|Ai)H:zJQdE%Z tz0757* !*~X|rKahLX/9 -|%OJ%n:D f vli4,ݧBGC+*=h311;v̶oC@@+aP|S t5 sbbn۾Х> 3pp? r\IU(jhTK3p|f$1;qSOY KP5$jv9snZ+z.$ˉZ'EHT AKM@m9MD$Nym]a蝢 0t=A_TpMUؚNe5;3={**/PgjcX VU RɥQDWhbxqkb ܹ .9sfff}{_mmΝ;C{sʾIV$v}h4*~_meZXxOwk6#xy ܏p&)U63.c;J v#\@$ %A{}dr~v1N Dfhj॰ljkknW){zre*YQ.yy5¼D ^"lME"an <#cN`̆sO|ـϗ_ɥWV'5B:_FTЦKp~W!B Go+|b}?GR&M,> nVkԃWXV}K"uycS5y~.3z'kw#4K[L&ǽ=ⷈBYXw((T__ `#mCH$d* +恮qyeB&IGRL> fFmQSr"`:?Zôz f/SJ]f.Ub\q[5|uխlJ; 8W|;KaGbBJiX4˟Y_w!(000}{{zz MQ++Bيu3SV>ExtHTN* WAB`84-@~F8)[+ (FzP˷^1ОL2!,F*k/jpO9|#B/U=y7T OlP3xb ,9cң*PL ^*J2h?Rv1>@g ,Tt IX_`\=i:_,Ԛ d;"pϗ~s(1W',*4@oDj f UJ^ u3JWEg>p* i c@(5|Pa DDE@'$eCO/ƀղp$ϑhiGC]A}C!&=]0$Ƭ(5ESi`Xp)$]_mkq=cLxqEscY7$ Ë@x rOxxqe˖/nedËBeQV$L*^E)=E@}aZO-LA)0@dB]pqm]]]*($'y+ Xǔ&٣Y-Keq=QM"/{[ HZOcD C>r-ѻK-$R:^x@n,JI>1~2J<@xn_F 5QV%[PO^V)5W^k$#_&^USW+:u%FER*Ud:X6"o j Thgօ Qdv 4:EWؽB ' A ʅ飁]WC5ӁZa(\Xqr()*x3qVee?Гju2ŬQy뭏:X,S25is+ěBٌ|H`Ko6 H %F\=)M|CB!MZ+<=E UJATH%Fe 7@~ni/ O"xW4*]mx^ 麞KTQ`$5]@GدDۢJ6q Rpˎ'ٓ$a"BQz":b{+I)UAgYЇT&W@,?l_F* ']1*5]z'DDؗk9]zL˥(2xi̠)ReZ$z,8;}XYa1ǹ,)>0!}<*UT6 ŭ |xqUTQELFaQU9ɰr%a`iftJ +P(@)L!?ѽ3@ ðL1E= 㒤NF^E &U3':B'^]sBFWPU Si^*%mf1/jӦ/*b5ย $WV,"E .cS.76S׿Oܜe[&{?'SɤڎxO71Up(G cldW_yW]O:`Oq*@((,礼#J=唒E"d(03ifzқٕ28Vk!*+[l[:a1(}N%Ru2ۖKrlE݊Y(h%.1J !sH[CON[Hfsd pq-?t#DR׶ږ|=e⿏,X `]SS\ʴ67tɤif$ *aFO]re7Ů]i3-R:c̱~;}aPwdAV)BM-CUWt, ȦJ%*kݴzKlv:B]Wr3kIJM`( /dMڳر,ttgg)G5u (C, \LrA /JwiuMP#\ жL|ne@LWWG(@YGK$ΎΖښ#=~ԓOn%C88fffg<83=PHddh[$Msc`gyR@p~!zɧ?5j5Mַ142~ɇz$&Gۻ6C>σ#p8OY7ˇ[oE/ٗ@~%@NrM៑b /P*'+';}d26cMx<~}n(lQ:`z2u=n aA 'DcK hHNAUzŒ$!W]K*X-1=}Q^E ,U9X|iӆNj Jce2/Y j#`  ?r,=FX,Y2Atˁ.,Oj2ElEbEbS K0YdPWmIy+!u=4F>.`Ǟk~uȡٳiέ߾;wc G03'>_8t?wt5>#>{z[G{˿|{v η=j0VS7_mգp'~jKuc Hf Ѝ<'|-b51^RlU RآqG#gO j먗ĠlYFwA"$;  HlxKV3ܛlPRP('.KW5zwءHᣇ߼;xCK8W7n{ߞ[ouVY6#=}5ҋ/575oP5ݑ,E* ;:|)@+#:KMOT#?Hy*uuu!c4`3h kREU\)lV_g -#Dp)Tal9((A'ͷoqc%+Uڪ*NF R9[yZ(?貅~^#JLV$)q^x}٩;n~{M ([@\w_ek[O~ڡZtfZ H6yxsjIݹL_x@ ںe{}}}$T9  8~wm]mmmMO>O=s=`4c34PS]m|UR=Pn۱kƾ1z?c'٧_z`[{t.1y񾭻[ZPf,9/^oiB^MHc%ҫ NYٱ,HXj -+&y0 Ů U>ajjjp^㱫sUTqT&3cGFDGhodmsjuЧ]ճ6 e+XAKP:-ҭ)ʮVBLsc V5 —!2AbEXȋӀ!蹀k kcsCVw{GKDhJ cIPU$z{O}38p }/cWp?KVmI!"8=OtuvtolWpcp=\m㶭zz[[ښ7oݎD:sΞ }mmu͠5͍͍u5+nص}kg[K4v\㦛onkilihmhl jmukvn x2^_S(-m]=6mCmkJ%] T)T. /5j#]2iVx8@jc<0;UlG1nUzkt f022W -Z)P(-/K9[k=5UAmEfJܐ-h$CE表]* WL- b}tQ/ qd ^ K\”Z :傳)b!qdoj"sa<58ctƨ{sYVuݱl#;wlͅE۷oÆ G NUZ&Itlt%D@6ezWnf*iHXEےd3іp$PYJ'R\P p 3 J]MXdLdH$)XN"锪)J(_UZlڑc5u*Tڐd9Jf2@ 7^P|,sDR"VyT6oe%W- (FMW)/a-&`+w#\f6 X,s]8a}qoOL(ȆfIꢫ(VdB A4E*!ާ:gk@ikvB@Q4JJƆK(AX>Rk2z[ԓN/4>qB# W '4"׳.ez!@}8s]FWG$KD 3cb[%\yUFk<xSOPIse% M us,w|W r=u6 e2|+T"#/*vz ?YqVQ+u)ia|1G &cWqZ(t؂%ѵ(ەLq-$/J:UpgBqVf ^ Tbq,r`m TOME";iD"Р*z^h9,K"p98Qpx<z7bЛn4ŨDz$  uqJ1 Cph Wؠ4O]},pU! (4D'( )GV#QL,=(;mdΟ9ʫ;ysg/ 9ʥ 燆GAO:=3=Ϟ>sdrژԱԂkY*\ahyMS4-ɌRJiajч33ݲ@H1 *iYtTYA(VhjYz{ l2*h۲1,BPh.|F [j@m !&jK?xe.CsH\T:P#=z'$5d661f,=!%5Xh pև'f. N'A 0hF]=Hzu= |2 C $T3)L83h R8BK!{+kdp&.:i:_0Dq0DGX)ȍ Je k-31pƺ`)#ʗ Z`HuW|\?|߲nCuS^{jZjj"ӫXѿbt!f(虴*J ӐΤi Xt_5;P)# `'DE{!ŠkF/pa–FSU5HVT$bi,e҆cZH.DA0Vض\)X#ғ(2 UTvֱƜ>q3X]{kK[H|FX`2ڨ/xe<h!Mσ`ϦD~)VFoz2=]=pzc XtS (S#~ą͛QlCgXXUW_+ giWw]AAÊB[s3ff70Dlyl*&!6ӍёQ&R., a%#J.⺺ <7?4: $ՍUNX ᔟ>aгˢ,[T )NcI\BaE h늓p#4 ?q hOMMe2z&/^Cz~&&S+\x 40 ;E2,# Wٲ-7v66t6#a)BG_۸> %錡r0Xb4ش'XN2cNNNXn|<Sg:ْN ˵|{T*1=6>;=C8 5l) ;=*Ǭ ˤK5AXFVՂ_Mx]7wBp(VSz ji32Ze5*J*s\ T)i 4۴`YD|šxWg熞H8H\8[79т!-M֜=zD_O-P*d;5N>r2m)^wT =.FWQE_f?JbMV~AͿ V_ψ?,T%͈KRΖ@WZ`KD=B~ ,Dz3g~+__oq3J=6´~0,$ dҙtkFa Nץdebbrrb+Z6șLLj~ffZ DɴЧi@ %(螽 = QtG{]k[C?P>CB%ɮ.,*I),O r- ,Mh6ÇM̥;6TLƓ8vwo@SgƇ7mQ9~}{kS3cZ0={Ǟ9p#'y'|rjrl x{|Ϟ:}A'~xxC/yя_~.JJ@'NGxsgc!YV~fO&S!-@oF͋5:JGcCA5!-6>3N~S#GvVQdM" ־+'N{'x_|>Cc&Q /r}>cH32:FܪC\ˇ^{)>$ AM"[*[J(r$(#ߵK=Ao'쬯#f ͺ \E,r_At [XBJ%^}cgųQSSDgfLlmmkikD*6{oŗg*-| 0pPb;ؓXFC?/ 74?O= tǟ5o߾cdp;w}Em`sMzz vܱ-I,z=qؿ|g/\EIOϞ;ݹcg}]G&=*. ]x ^9|*LZVftpõP5 *O*:l4Es.]H-l 3B t~~.lntjP<5fcI󫨲JazLRO<ԥC` PA,6Ϝ?0{n Nz~n^mjl3gOG%N9{>gdžv}ԱS4484pݶd*qm;IfbxpСҩ޽nݳ¥vHP_+؆&ӓxY6}?u5ƆZ#ki|bzv~~׮m9|}Cs3'[w_P ċ/mt/=n۾}g*>yT4ڵkkvj4aazTm+#2li"c{ѱnЛN$≴ /x`Co//صch{|}cKxiMΦMB24ٹ}s?˿KٗH%3ozj?ݻG>w щK? 㻷o?,+-M:UQś [U5ufffxxxzzzb| ek[ksS35uK*ҹ^S2b>:DT:O<5:>q{HrJ02Gon|æOo曎O&Zy 7|M7^pi%,9gOjwW--bTJEX 'MlQxGdd̓y@sd+Fv-lsa纡Ph]>oovtbphdr<<B#e޽~7m-۶mkmihEK*f7 v]PTeƍ7ov… _m^LR1kuAK;tL1xE&Lcf" Ks:LS [nDmmwںu||ŋw}=zx<"B;;"HooO(T{Kt+ b"psb ?!̿N-]xS9'^ty^4->PErccCwwkwm{r 74)Ggkƛnwxۻ:шeXQ^엺Nq{+Xu]uȈ c~@ (X@ ־}6dxǖ[jG*u4e=M۪LxyV%D2 @MJƃJZ  ,ImYh.sj7ї ay@A"q% 6zNDIkC " Z E$žHg*i  7poڴӋb<кIMN/̎W̊PHPP>"Ax$C(£N< 27?!Ӵ뛚؝P k$]Xn[nn;NZFR`2#'mT(ba\9`A(666^{54Dx+p6a}2`M]f#:$ bJwWEe}}g?o~[*n, h [Ls뻩Tĩ-my{>hoUtE 1^A0A B`SsKoGu^n$A8ڻx|c\t)j;,B]]-dpp`zjfdd3^xqlltbb…sS֒@((imM@S'fр 0N8~kOA-˽Pt 6>cԄ[n{//~[ƥ/С&l^ FLo+ jqChfz-ӽqㆃ__Wϟ?z,馛`\;W>ؑeҲW ?_{-//O<$puoWW!{ADIÃՑ UEoDa.g]'@ff<U6ƧC}>??/S'xÍw﬩aOꡃη?ۻښoڃ䷾ͯ}?ᇒx0 ǂPE>}K;vU3u/mONN ͆.l[B $ :z*>IRmmhF~>>5;5ܲys(nܺoƹK.}߾wqM<9Tbdtyㆍu5QLOtvulڲմKm흝wm K%-75752ΎXԮ]z۷nݒ3c|;݋ܱGi#RSSWWFT/Dd2\XZ+s壗ࡗF()]sx2m9zG6n޹}+X:=;?޽qݻwlml6n۵uh$]Zd 46FX$ҷa歛l޴i۷#sgbgwuM ǚV Zz6456T'5ۀbd\2,а$`ڨj 5?Rz#{daIy{43( z2+&2)hWZ 7jjϟ?od޻[MRG Echa4{?ݻwutuw64ҩy[NMOvnhjj֍ѾޞζښU{[HY .T^E᥃/n-:q}6n@gQ9ؒ. ᚰc(urU[ Jw$݆eB`0LKpHLc>mL%2aSzF "a\:VdU jj7"M6])Dl'5M Ou#mN8aEDNӗ`u*L:Jh9bX>"KV('fg0UG"@ (r"9??7_W_ %.`- ,00x/>^h~z'O"E 4IȤآFSG]yロveRiS5h"5 ]@EGKL j,X,@l *J+8]_OO m&BF^y f֍[ z&RL\_ K(i%OYR/UALWowtAIvmFFF^`c Nܤ[ds)cst"J=JP=?nڱvpGk{m[;(h&i)4W.RLzvfFThM lΙkðtEb^D8qG iY'zGu=:;=;eϞk`a%!*##/<#zZ5ð4,W4[l蕂*$ t3=Ɯ:J30ŀEYl?W*`f(PXol`4mFZ~ʶnB2-WqkonܱnvX8jĠ+[^dXaȤRlAV=;l/Ǥ#ȮէPt]BMi 4x8C ; *V LNōCHIA "xV&p LڔD9c`qDXy4B*ʳ,-}Z~G+=1C o+ aL#i &JR2 Ĥ أ`FImVM bB9 (+J&Z:nJ~vF&*Y6Յ~W_[Jo{۶n EpUf6}=x3>|OlMP=DףE{8F3O23J"zɘtYw"e UWU/Ey[:l&P4hƑae%j"bPRʯP1H&oeDѴ93Ju%Lih?L;!VT#A-C7832X5Z:ZI^95膢j$[( A+ I-l9! ;vEC4- ià ,%;|<j`CA2Su°B[xM% AbHLHϕKCiȡ&oޞ@($ 4TK AU\{K T=ҡhgq 6M!º*< bxF #;<]L@< NbT iXdDHVZ\\\}s``t^@022bz0Yd[i30?;{sΧSލ[אD%+] !u W:;ևu8i ߆L5RSlt>S<_A81iEeHR(Y_ (_*ԯd+UZqsPJ7iE:bM*NW¾/v营۷n!݉oي\B MXgLu5'gWӮk{mOhtd^rh^F#MMd@rG`c0e%ؚ=uTrd,%̐A+ԍ0{/RvQˮ15iDQt`A\QU7lQRNMƛʽ$6lݦ.kK_޵wҡH][SS:5s[nT+h(Ŧ,fYY/r[2g|Tqe?;; )ӣ|ɮ|8^MLKռ7 #Pb&g R@EU4z5|,QA_kUAФ̉Xi'x5::MW^~[ z G@ V?Ӂf(y߅i]jR&[s(Ad+ĸ ]f 3쯵?DU!z h4]_|%`c^:ϯS&fBt %-<6DeQkF&6J°?6xp nAE39[e*]з/~}ҟ_3( ģɎ[E? bCӼv Dꥻ&d_z 3Fy(pe^Iw; nLBxq:WquፒT.L<,KENd hыؐlY۩:QWRv30TQSU~#E%MtlERGbb'9']3 ih n)#P%'4%'k'Yh‘@+ .چ`N];IJЊrggM; =jK?"M29GMJƑɹtL; NP 2@TTW ,G CUPs8W6%QöGe9Wb5 ʅg];Gֽr]Tu %VI躖gLmfM;Gvo%===]Pwe۲ly{,&Ȼ@̲#fѦ֖f*tvOYb I\%P~]Xi>%(JPﵓ /pqPpk!.M|%jUUBdKJqb[,E6{:3ICnf%Y%ې'U(zҚ"(>$ұGP`2 +^r !u%:KeNb~(&t H_Du >MhmTj2,r= v[O=?~6mhswݹ7-4qSvLtyOyPp̖&f JA {!;Y.<{BtqW) _-ph溬|B /}YWb@"< qբˍbi:Ѝ|"p \NrkBw~E4e ZvvXf[:¶$p 9+uAe]6qy\ mϹN9& ܰKSݣhGzhn4~z}4$oiP̈́7Pbpf< (1 tk]Gl肫E 0 /GA>?L6oVB;spJ呇 -Ƣ8. g.pu h:uœR'#Zd:pW[+AFX֕9 r,W;`% bIBHTIR׊0'=> /c>8:}j#G7[ن)|8XرE`w}%]W-gqc}4qtY9$>ZWe%dJ+Ҋ9Pp5NdkE^YE MJA,a!%j廜rёp.pE pk>e%Vhሊ+Hrܴ%l !M~g9pe66|ǿW舎:D:hBl;q2gM4nt,,C?ywwsogG21}ם{{7t+jvzΕo࣭RnVbUtM 4i .&Awz*KlG'wJ i5J ϪTK~  .Cϰ.F3JrZ)JFq]@.z!jTR:b<#?7SVXQ# آd\I>BF ףĒ KWMQR? P~T$(Hlh"M!\M DUG >[. ѷ~ (A\WzSR(`u+3PQ)I!J-x:to@ Qjx ,]~ hU̕dSܓ' u,J.+obPbj953زXSrT,5/Jd4D\R(0( \'m[j0I aP&Zi {i^.JNM$mR,iI͋Ubix™N9-zA{,ØBHdOI4ItdyB/ZhfO sCo_O r]oJ b]*ZK !2O*1 .-R8bFLt%<()$dH8lZbT2!ZT0R%˗Z.x)'Xm&&o۷O(C< ht@S|R *%W{gO& `c( :iQ1e]Dz]˧1udNgeiaX, sr $ l5YVz:%ɢ,+Pd)bGHd` .v<^BRZ8.v!띭Q'ʵL$+EQBR᛺TkWV^ `Py@r𬿔zX/|C((_kPʗJ׽*>uoS)( 0v(#*үbhC}C0i)J h ,#\x! J,IEDPqɷ$xu,EM E4 x}n ={|˕B@AD_iN JR( iDə~Tlg!ÃP0S?FOx@HZ@,$4` )g6~ONMFCᎎ N-EӾvͤKLIG)UqՁ^tdXDO DokTe[ Pi4 -pV0JĀ# JĨ٩!3Ovټ˃"]2-*dcv2g|Ë. k|xqEֳ5id僧)/lxv% ([Q 5ʯeEKǖ.dEd壂hlx, n0D>{U@ԃ# a@i<,\|"<h3@s!wgdiE/7R<+WwY0 <[// @!J)Fe[Mʻ g@]/Sn.r+Yߨ,/7g]UUM EEQ- AA7h-FݍQNÖC|@Fptw TMR$DX``b=9X _Hgi"x@8unhI!xTJ a ·W@<+{d1QKyAfXKT"˚Ç:LO2FR `EC~fƽSxi'p Hbˣ(  `nC%L˱z.5,F/ѱ񉩉ɉёt:1H$t29;MH&S`Xpk ;pi@sPӲgF&g";ˏN,sYh9V@֭p[/^tɇW/:^m]8r "x;(?x^|YY!)48~ѿY /B|n|,Aj" Pq]VVLv"7 0eKFr[ovv`RPEJ+S"L*EXUdL3gμgg Y0XHMmQk?f6m QHl)r2 (l];|@ (+RCW”!r~b k7\0>ʞR(u`N8(/ ʇW/j=WO%[`;\<>ϏOL%"XŁX,2rsmhjnp02hTCu$aaԊ23MK2M,{aت`h"o>ٻZZ["=}̩)ӶF뚦VP# `d˴jd 隖 5ҌMg S*cI\Vm1w|>`Pl2 5MC8,Y <|]q#u{@x~B OR(zaGD@,OX@<4E,By,O@"fC瞬0k5r  ?$@܃@ޤ xb 4((dɖ&h=.04@6 k2e_[MOW2 Z ccih4,) QZP|H<%O &xGyDHdҙ̱clG0SFFFΞ;?0iX, AQS Pr\YlGO_(Mfɉ~@KKk]]}0BzڽKHI-UIJ1  -08q_O T֬F)"1Ju'-h=O)?kZ}߼|{w{z\{]mMK6w4661E!(`dЏ숱`Rdն\z+H)s.<;vԇ?}h$]HR29c(J2MPGH%p-& b 8h96 ;<~cqVˉ䵀 0X}1ОCCC.]M$DL:XXD&GHCN"/ O15x ^p`0I pGB ;u0BjkkQ ^P$x^yeD,`NC^qQu$2:0 q H# q xX @hpqbb E?bN%riYmyΝC"=C$. Ttw2\ WÀ{;PBDYl?yWx,K凵A~ 5T):~v}޽{a9 @ChX\L-4n:xfӐ fceZ}*4Sʲ6, 0AKnͦ<?vl@oo_ss 4ΫFb,+" ex@G[PR䎪 W [0=M1ΜTnﶝ۷onjo aƦ:~`mX չsgO>=66j1ai\pC PUؖ311G.;?33L&95=<<|PoowccC(c`SrzHLpk+D&T?a|l|jrjdtdfz̙3gϞ*FӛU'N8{\*fôQ'_h&ˠS6al\c:n9(90$lvL---<PWWqV[Ģk4 ᘛ0(KFxxzj qV&033*jjjlJ^:`*/^bMMMt՚ܔˉ?\&uMGF~H5ASH$/|xqybDTMB?Bq<8y,(^iY.^Dm@{; ŐRfgrPAu +ǪH2|! f@Ba3<쉓n}{oyhmmä4~C_/$t g^8nnnK?{||™.'ҁ@PdǪ40ПΤ CV /=v@|>nAERɓGHmhjj¨H?[rO.NJo7^PnX4d +3;uɔյe{sCxR'O|֤'G6na:3O?gyA hW,8|~ zE"~/W_ww>Գ/|pll( |9zzjjZŦh$ 173ȣ?ȣSXE 7Cц/|{hn;b>/8kac䑇{'v#&S),ʫO=4ƚښp8)JQ<_.V"x)B_ᙞqFp̆0*$N)83@.x<*G,2 E8 :`RrqUzKPVRkK?S?b~$A9\1$@+!%΋\1~hٲ:"M{{;@CHgEPkA @^DGezÉ'  FE^$ҲCrQܵRʁuUcacS<7  MO$Y|'UU=647@>Jhoo۴qCCc=x3_:±cGghM-ȓϝ>ugGFa#?zꥃ/9}0uL^x{裏ǏdXMM28 :ϣP PT7 rJի- @%6g^9#Ͼ>>#O>q1465г/nucݛc\{w3=3 ״J #巿}w믿q0N{~?F׶AMڽocz64J_ֶxˮֶ-[CAԉc pأ>}q}gϜkkmwcݲ-[uilY{Z[ғ[6}S x=P(xEfVqnLm,* .{Qp)_tjAŋQЛ >``!H<22ڊSdCp!P=,#=jd$C@AqEuQD_qȪ( pY> 1@d(P=$@}|4]|c#ĢtDA Wb vrҠ8T22::5=CK4}&SS[ K=84B!vyZ I(Y/6d JK/jӆ Z%8 aVbzSisCC' s+L77]SgEkvĮa-hiiv@[kM7ݼyӆɉO>Gt-{C_'Aٱs }Dq7l۶#J9{.ÁK9jl\P\ Qs_*j5,|M .!_Ls`^\XpxJaeN[n_w}}hD%Ƕ0|ܶw~7~}`RvҲ}[aSU% _]ݝ--۶[/d9z4i=ݑH;?o{FGg=y*PIB.ZB-ܴi@0LOKޅtx>ÄuXȱ >|Ql?As:E)b7p4l:&a)ZrC?Q!$p>h4!N "1&x<+ E:u BI$B>$ b8EkAH8s ?P"E E@7)q)< XF4VY&P š0z{{;;;A jH5pDqCZz"/ʅءA H5~ ͫ-4 *\*^8Eww0#?$z{ܠ,LԲjU4 MU =kv]ܶuFLbSL%aR$BlwC>̉'mٻ?я6o:X/Y!Nys{]NdTN01n95m1X2ree-};~w~ӟ|7~6_sM$lwnrr =7M,X~߻wχ?ӧO}W?Ν=7;%MÞ hֶֆ,.&]q H7A4 t^Ḏ$*-Uخ; = ƦFUS"P8jhh,G׍񉉑ёw/q!V}3Di1c.bÚ)rJ!ŊKFIJm߾GG]߱cdž ҷc]]?`  BF`lsoƛo! bA 4P9bX5 (4EQ䎎6ѿ[lcc pwسg_.>11>;;m&mmmt欨 lڴ\{`-Clڼ.FQV;uM7 `mQqTv0X Z™&C+4( 1p4oC ,AeԐ|-(ўjPJG7p" Y+ HWJPИѯ[$X=f2 #1@qDcɎpH1Wt_%EQ67`|vObI=6:3|ο~;y8Ðc")hذ Pt*XCE[[[oOhjֿ7}8{ktO.*w xr.[\QOa0<~hBn|)]6^HD潃rxAKxW6WHl8rh4~n]-KTEN9EڛZ:ںꚚ[Zz2B j%)ilo?g|K`&_ai~O}ƛ?vo~O<>>>B0Dk :m)LCQ4-zl͐:% ñ2-^cu6<~ l޶= #;cbU50 d%Z$۱s?W'z:"5GtklN0-@lGJXc`UHb1瀍ۇuuFGGa:+  @r!; c xPgW1HT" dGB:xi v+~qسSh#N fLbQ(j ڱ+1H_2>SbgΜAϟg|ZNT&v:Bk@DXțߡpFQ)>Cy^#C,™b7bXHA2t/`ꮴ1!CG2! GS?$Pq,p2ni|Q vUt)(a"Ф6/U;Rp`8`r@ :BH1]Bu9sxӦ͓.7MY7S=p~sN|zΜ???_7dµLZ-i>): &[TT:n;$#X6mo _3Ї>sK%嘲 ѰT煫Lgϸ} ߱֠#p$[P M(nߕoztx?V94k+5\ ,8q2DE+uSU`(*ZX3X ]]=]6yg|AO<m:4 h$d((`EMц|B-4Y(SG 8%P{q>};.QeDNU` 4W 8.& T'Me@B WD@Jc 3w1xxzsCSh>p}:5.u hg|!li01YmؼuSSs$ Xbm:ICwMۦ'N:6;;5</|i>`GX/l,u(0+$Bᜇ K&sU\ @ Xi0 c`D#}}}ssoba.[/}˿ۿs?s+Oo޲=|[[l[9GGXIaKV>RAƃ/O=绺:AΜ9Չ~Ow7vNB~'![o;?gc]sMmf3g?{wwi#aS uXU1;P}/q>K9jiiw 6/,!X&2"=$ORY {H'~ޕ<XMCJ Ph(p h;==mt !HlW㒳Nykٱc{[[k:€:H# fHP#cf<\9 Y-,(76L!Y b*E!%b!8B|k5,]Ul0Bx,]*]˿0G_W?__˿KCPgggCCg?q`?Ţ1)zf=vr!l{{{{voo|X~gOOan`"07yI) |ufm7G7776>x@0;B12<@PWuoow'urc]ѵ?o~sWڷ~sg:[/ +\/&$$ *EdetR p]|!9,VaRג^N&3VIy峼Φ\-J #{Ʌ!tL,:^y|6鶦qկa[s6^̸&A?ڝ d՞m_{{[W?䓻_vl2q-¾sǓ)JO"qDo~w}BF[["*ъ)<IM+R锼MAdQ޽񍯽t__&=xAӧBuo矿F$V;D}HR89xOh49sf}_E1|[~K/Np7^F+ *!["XP68*y= Fկco&7n #l$݇nLjիk2{~1/ۑ^šXUH$p$3P*䚌pN iD@m^Rtq@C$.ЍAp(@HzX5b.?&( HL#F1d.Q``k8Տ]!I[b2fх0ghmS3C ?\cљN'5rh"8ʷH6Mؓ?.v;+|O# Qkb?߽J&7lD Y=^ ?~i` V0ILi˭~Gի.]qv57 9jx6(aңƛ%?'-q /5)\4Kb+ %Ԋ53{,!bVN9҄PHGI~t/WOQk @["iSS4Un4`J%\f%(@@! *2Sglvpl:6u'R"~ 0YPeEÄIpj֐Sp9 JoJ孀4c3Ձ M(PEu-ɟ{ -OuрUHTR:hGrtM8Nn\cN/Åޅ =-c  yu$%,Xm6>-9Uu\Ӄ l1B|Ac]'k $oqQ$OA>|ar.nS~O?cבo[znovCdQ*R(>(!FwG U2AEaȨv< K " MnG!̦YMbTWyA4KeyR%R8"]g|4םD\V X٤]  Y g̥W^?~+6$Ν?Kןڳ^a@4JC $>w, sJzE'<O bv( jLtLmᘑ2BtxVV>N!peFͷH# "? X%:ONS o0Шն!P.ź] "g# 3Ȣ4}4} Y D ++0A!MwP4HT!Sp ynA{qU?… W\etTYw1 2 "䣨z9*čd2z$‡O8i Z{Rv'S\s_YUJ,8Qk履~j潡hХ QT ,]F.7a9fT@'SD`%P4\'֙A ggg:Qd+PGC;U5k!fFo"7αG?rW~o_[oݽ{^{uR</tU:jieX4iX#Vx E`I>pR|p^f/OKL ԭoS*^ZEPZ㔏9 =T1bXϬd56b@ }gdQP*x]!iuLrV&@+8﷌"3BMD9X\= b0sֳ-vs5Y@/&htjBds[ Wg*E d/Ov&P,; lQH ɾ5B'I%.]4M4[{KS,/hfHE~О%Qd{P|KؗFJ%Tbi<ݽwv⋋~wAEweܨh oGݡS zHf+Ye#1"BQA(Dfe-!eoB%'$^Gr ˺35-+rɉa{ҙ2?w`?SJ' v^xҥKyje vfz`8D& Ge`/BbCe@\%OEPa> Є~;A&&1L "b~(UM,*xj|s AZY0C$+ʐsZ!Uꎆ +BÐ091B2OvˇSL8)jMߠFrzb`51x3m(!cD!CN_K3VEX;NObJfWHv &?A k^MK Fn9 <+uUhuAUhVgƐb@5 IbUi#"(TFJxzEb7I/b7Hz'^%RC8&d@]Be(ۑduV,_[Lɣf"l2.)Okw T7%R̍4 0c+2W^ QS_** 2NB _8$/ GJo|%YuX&ˉ (w72plrJhœ! LP]j~s(:AU4<0uU^ZAIM%*I~+m"M8b ;Xq"jaM%{!cOg6BUPZjZ]}.C.-Wú(B& LTP]F+#E =4+#TG0QUBQFS}hJΉYz\_x@9#E&~!{hKX\xAi<9P)T2dy6"ԕ!׎Zڭ裏>b^{GPYP&<h gEj{*b0[o\>u0p>U`0xݪ;a@\bx<<~|܅^ y3=?|̹F)>Ep_EkXSB& i$!Ye)T&g٫6Y2" ˁd‹JM lؔ6VpBQ~%A?b5r0sh^9(`9p= 5͙R %w\!KVeǒӝ eh JMM&y fEʁ%"vG*5MI#ȅLp#R!m+_"ː걾52Wέ]t; {:[gέo.:~ e,*ClZou-͏lw2?j;Vܼݻ_R(\.bشkSHتIC/(@sq:fHX)*[䢗ɢg gu煁ΠJ*SF|,nS4G{[㞐* Q.C XT= 4Yn f-#iX&.9+Lqn&>  L'<zճ`2t(z4hF&r46P tc_T:ܸťiaR:z6mwi]ȷMrI~zbjX"8@ΦSs=!U|h2+P\ǣ7oZ YH䑪p~>cb JNg O7Y$":k9/q^#}mq@<%AǸfZy uR83~RFlG~cO>?\^tԨNޠggVW;rڒ/@{z;)NB}Nq#"FmOP!Ta<,jM'Y Lv6rP1ivR"CR!^F;E`2BdChsSG aqs>ɲ^7\:{ku}fxYF4SxA$&BЦPWD踌P!?B> ycYL:kkkwܹCy{{{wwxhȨ` n >)NqS˃&+O3 Q뽥N4jѶeW(Κ`wg]( qyjvSO-Dڔ!y>G_*u7C?B"TGeh- LUW/_>`0@hwϬ ?Nn B 5{s=w>|ʾse$=9W~ # +hP<:o0]vz gtIλ3C#w)6eBzm"2B]hC Y *B2BDЬ A2I:$!>0 ,Rk>og;T*2BRVE ̐vlsĥ;fd DZ4MDמ#Ô'љuʫCyj9<)Q,$U{n2߼y֭[g":LSQ=VX`,qWLM$Y +9'"ʤHWnx{V9]'i#f"{L]) .R).#"$^_%,}bh05n{1i2y} {q@Qgh'7tNuw,B/ݖ/3{h:pQcsRH}#[Gƈ2,hC}p62|%"q67_}'n777/_ d2 rZG=F h-*,1.."p+h0SC YC6^E&n)=ҙ)kܡ\ϜK}KJHTp:mPVXG>sZ 7hSHtwPy/Dv@d\}@K!ph)5gظ\F>B}C$uLI(h:/.p-bp2޿){4s3 mii*:u<6N)[KO>BhG꽽=8qӞjvEرZ42P\3.*,Ms%ptɍ$FB`766.\`dh-l(X=RR"YR]!NP*eNERWFh6twP \i\xܹsl'VI<hWE{OY)꡾RaJ6`߈tR\ կ~Ϯs  Bn$ױ4]-4D%fSIۡ A?jө| 'L'i`) r[L&\EMF̰UpQ$&(o4y(2ʉ%%8RWgKH&HKJA. S̎R,A߯ƫymM2iv643U fwcԀ4X]+KPad3ką/#+3qE.X<ɥNw `aܢlJ;L"U 5J!dӭal悔@d> ڛY&ὄČ pYX F#y Cp/"c4)U K%DPVAaZWsz -D+%ۅ"@9- (+:b#W`݄LJn$itEn( zE?&m)/)oD;1R;z8^mH0 \&ddFOCfu 1)S|ўXbX*YIr0h:;`TO֒p%bw bi )0ׅةrCW Jоb5| ^ʇ!W+UmSE[ߠJW+;XH=쬄\{YvoT<(=j$TFsbIB VցjznۗnqX0x)B\J,n U^PI#EM"]XGoKhrm=Z˅Kׅ)IۇOb ȹ_ͳB kZ,RYXq7ur2yǽK)L!G8BfMrI$0pצң.].E38,S}:@ԾA<̵G2ɾI*ipt{rXep;[,f R*(r;=Po;)xP*ֲgnc옂: J%\d3#D5@Ԉב$HSbb"st+U/NSÓn=AJ e8]rE+E|22 FR$!ԠIKuY0sס;@񒀀!/+$Bt^La=s prXhX=:>g,f2ق* \a1L[ Ċ1z,HINXδ E#UPFGIJ޼( VxHGG#KyYpO R^Q3lR/*6Rxso#Li;xv_ObiiR,8Sf,ʦMW}ާ+19#PHr# fGaNu]1i1R.B 8X` KQ>]>vX(&NkjDvFڞ c=\eVR-[zę1  fpĠ-3ObQ+еF9O AM23;uJv.dvIa Īpō%_aazTKM=R^H#eKXôsbuABJWOي1NРK eeA 2B0Is=AiUZ9/i TV@MA IJnCIENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/device_manager_install_igfx_2.png000066400000000000000000006476011443134507600272500ustar00rootroot00000000000000PNG  IHDRg'$sRGBgAMA a pHYsodIDATx^eGu'9䜤Q  66x fk{6wm~k &iGĞГz{:眻_=U[zi`;wn[ԩS|nx^u}۶mȲ,I O$YV2̳> Ѩeے&92-'GfMǯro_P]^^Rh_W\612DctAAAQQfz'KdlZ?y5lGNJVj$K9Xgڎkڪj 0H&e'vlo-+~݃0 g9q 'OY^^elӂYs֖S!f\MVu1ݵu[$@ gm+9=m7o\[[ B8N3zaЊ$)tJ&ҙ񩹹D*=H߯E "*|ke-UE9*BYTukRIa~yyYYia蒇2ԘK2 Ȟ:$" XlD-=s'OOW`O%J꺪MmLȉU%U%`Hՠ)mY:D:kٚO7]U?@v'I)@ B=U厐FBliǟ=t'ii )˔d[lY":J %ɆzV*vo[w7nXo9'82mmm===(/@P"`/h_F82A^GT4ϲ6l"txeq1|BgfanfY$u$Tupކtzݚu5H^$hme] ÓBDJHxyGP:+MPx4@^A(FtؚTB = Mʦͧ/h NgF^F@ -scX@3j, (*NY0IeuLN-)^gA)C#=c {&%$`MI>?f IIq`&Q_d;fU44L0 r#sMxKsX(9!: c+"ɡ4YWs~ \2^}o)XVo77DWI_ފ|YJ[y:sK* ֬YGZE(g|y.yRiQQ{x!|sn5b?_Ɉ!""D[ -Y 3\K]5 ƴԀb\(8.H!"LF liV1YtsrBlQbPJJrp&˰Ӕ`"3iFq6BXTY-XM.Ni"jȥCs!W;;=0j: VIB7Qo1="ŲC_%xIw&K2!gg WL ~n.j,UpSxhBq28U H.gũiP*b^$yJH FE/"0Њ(cD/0 2΂M N*p#_۱*"^*n ^%e聉iCH6.J_5zj,ĸJ{e@e@$,#cQ8(7s(kۈ]&Pa*1?JO&eRIC2:d,S5-GO1KKp`A8?G0zPmT*۲L Wi㯔+3'o7,DP=HE[sD8^ !WJFX]\fJS+%o91wM F5᭨%`٘cEfpL\8F@O3xz/;P-r -:1$g$:JL@Hظs2iG!ȲEeFhCG'^.!2;Tq1M 9g( f@HecaK0 btޡ8Vϣ\8˖-Y(c{VTVG<&bws"(-RR6Ӟq2SdYlPt%Y^*[NaOIBKDbqDflI=jCepQp~ aΊ9QK]dAZ[e45>J Am`A4%+-Yh?008;{mZӒc0'|]&@-*B5۵AAq@ii 2p ID S:GEcY8Ed*]]I 䅆)@"Ig@ ˆ墅 ,Ɀ$s0ҍ47`,cbQ#bQʒHI RP"H R8Sk$ոuD k,SxoTg))K!WcRߵ` V8daZL՜ߧajAdaaGΤ!)ғk\\ D,^lX.9 yNsǮˠ*Ғ"H^]u\dteJ墖,Nt]Qz%d0_* "PmRf1]+5Ok]HnE c"W$3,w +U3WKqy4׈d/6,5,KL\Uؓ+ 2yr]:_N+';Gv]l6Clt*VXx^|_/$>DQ(8gG8] `MC&7u\MeKqͦwsr'HoZ)x@reHP/19@P lX,*".ʹ"$9$)Nq..".Rĭ?X,"QJ.7ZF52_ǥl2cZD$)]f@2 5k!:+/,5*g}TNrᤒUvA `$(+,xဃ,X`H_sуn2UYO?ԩC#8`fjooGkȶlJ~;%IGeOw][h:1VeeY$G %x;z[T\eǪ!Mly'wY]]5McQ%cҝꖖٹy۱m[ӉUpX\zD/C{:iYEWZsj82 g(+**|~:i=y)SrtޱQumļ֯+c8 \s/0jSE bT>r@qMdYT5zE:'|6"yᑡD"?XaiiqmM5B Bw.n:yx[R,,?!U^YoT;=MsY~eMXg#J,+..>ydgg'󎒒@ IbO T@6mJsGGG@Q,& MfqH4⛍ryI&|PCo:қg"ddSKl zƛd k\y*uaY:Z˲"/K/8ooEygdD70:F>q:;麺[oHalM, }ɵFiݞ!nwwE_t+m4o [_ܵK|!r.A] SB䮽@FK|܅7B^ \s–Bk"g v r/DAV`@G-$ gwuuٳ'??ݣG3mA+@bƘء"+>.( #w._ܵK|!r~is rr.Dڕ!. ep!r~+]{cɺk.D%]k `)j [wTlO/,,owCCCGLgBEӴ?6(Fc|&2t8((ADjMAc%=[Q ޶ɶb5gg/oܸ/++ ٬zg+]&m뚞wz9nRM.6Y RƟ<77n]vVWW|>D4ms^/ eJnc/\P龱 hVWW}mZ[[cY{?W,çWVUy睭MMMSSYS7XhEqmP$QF쎀[ |!r.A]"w*@N ƀ)]2䴹orZ^ܵ_iz!rruv!r^9c]ܵK| rij?}׻몪??c ~Kz GvHk=44p ( VB | j04 g^W_x9788_{w(, ݝf5J7;;28>?J,/ p8{\7'A6# pXZVBum{ddt]7lBN72gWie2wzx;H:;W_8B"x|2 ȏ{2错M_ \`Sxeaa_KR ֮^]]U eZ\' pu<2zNϓq-JhѵmvA@@@@@@@@~ .N&˲r^~edd4JxF@@@@@@@@` $5kn߾#5ܛ /5R%{UUU~á`IiqiiIQILC- vߡ&Room3dq,WZV٥c;זm~E4Uw%h8Mr w>ClWP_{ׂ2 \'y|XLm%ZnB_&kˎo9@ >gK}gәF¡X, x csp'/Yu 64Oqݡ@.`HK2X$ebY/P܅{}[ CҦd,bXr0,`nL\$qP.%`T2I:N|uG%IeZI&ɺjh\ؖ- <_c[xm) -qކX% KQep,۱ +nNhƱ <[|E!A=Iue]pj˞y͕APUUGUmg{L ^{Kƛ'Ygɉy0l&RYyd?L5Ӎ4=#OhD"sv5U$[hh0 ))$iWNmE&JkJI^V oR%.K YrjXMÕJx+=>noOm;csV&:f0/(,RFV/N7_N5rֲ;ZZ%5,(؊d+^ *[zEEiOSHZdŕWAS &U TUE\@@@`)kN&&&V/WHtUUE"⎔X*#k_'W^yd5辳膤5ջwڵckMe@Y>686 R4ļ¡_8_P%^a m*Q>t ֕<)sHa3&OGƧ&23#ذ3<rM+Z$MU*=m.xTn [ȹ*4p,mmϜVuzkupyJӳB_ꊺXyXO%&?@ $GRǏ9'g r|ܹ!h$!)w~8 o(TZux)^x׬YH;PLpK ְmLY#\ Ӌ8 B  4UG~_~ӟ>㨂C0$< NL0dי|ERUfdSΌ$Q"0LJ "/fO~r f$b?^B:(ʾ}:Lr&ؓ " @qD9)"j`?,@B< J63#D(2Sq k@3g|_}}{5-ϣ,k됆jG +,ڳgfh?3feDAL&6 m#"! E@z7~ kjx np Ԇ'N@x(B:9_G)P,X^$cxЁgȂGۻw/ P El?jUU(aA2/ dDh8E45 5xee2(DU\CT:$&H:x85X2L}`0뗛NcXLC5662X8<T\%CQ627;QB :t=U.fQG* 7;y\Fc7HDJꦺb@SO=Am63::8OLL$t: ~Ö > Ut2$ d3&B( T? ԎB$Ԡv%pD!>q /xww.8\ D3*LO:qFp$Q 4M dM/7X|BQ}aeᮡ]3}n“A$b9%JYrI Xb{ I1Mۡ;t*ǀvU&vYXp!GCl8| +Yu@Zb)ϸ#&⩆d:H,5B"Ӳ&CAOˈc>$WVV}[zo@dpx_۶m-*.F<̃\Y9$Xc@*L)5>LbW X^< J"/*+V8Ŵn߾(A[kPŇVDV@Cش؏ICfff l 6-aLy2ip5LA 6665 #JēOGH$O~sܷ??h3@f l=H"_Dn`'|=ԄB!޹P@PIȰL C,\Y~߿SO?LA"#wnF B%.]~-A! 6Dk#`h㓐 S/ٌM؜C֬Ij:qmC/B6@!\#)33s D&I @)HUpVV\"A0=l.NIÇwtt]%ӧO?󏀼8̙3E؝)e\z um3C}CS=#\$HZd 6%זɉx"}N2 .(059r醊:EB.( K (BAA_ ΡaL0m͍M +t2P9LҩL*' _PZU55HTh~D-5EDY{xoooyy]`a FIg!MF'4E KH GGQѸD$-mD$}!"KH2 r`eAA8rAuPӟP(t ^ / vz;Y[S7 Ѽ<-sUMz)aіK$>ǰ\E8~YY!9+r'$NgÖs@ad3V ǧ˾h4nEQyQ^ai9<&{ #p\+Ԯ_GGFowvv{e' HA׾/G?zG;*Ru] S??={|>7^x >,+T¿?}@e*++|=FZiN{{{wwm"0,L~_poo ro߾ֶo}[O=s=w#C)t---_A*~կ~y饗aZxuyɧ׿50<p= S<ȴ ߡarJ'JJJ"0QSO>nٲ[oAû{=EEE-GwaUaVZY LS:x yo}=LfN8AޡGq޽/  pz??`L!X#"Gyvq`Rh8xR^^^8FGnذ |k Y?L;j d'׾ra677 @Iq&jӨ"ʚ^Ϟ= ; !̢fGy$E~JG`O=4gy B/_ak_衇f c13֭}x>#GAe Y`F{QDiM膭!EcCH4}}+_AbA#G@9AjaC {+=C/R__՝Peݕ`4\. *)隧+/*(B`;smuuu>z:tnF#=jk֬Ah8GFFJJK6 }{FpiAFGG7mt]wB!xG.>? x^ ^;;mP((e`^[RRpU p0F_~m Q96"@P5Y|=u}:td (rA]]]ǎÔ`_=[nA4W1Wxt8c ˔A }@`P"4Q0xv]ӏ;裏wtӍ`_[o GA{am <~[nEB0 @1Izzz? A#PND*= :X[fjB6cvBkwGqHЕPR<A4pLZ`&\~D_DECy8 ^ `(ضS+TM8B/?e2&Bq"G# ȥh!+W@ `"LA^a=T4'l}@1! um@bb8 cfu`O 7cF6v1\ڱc"" lCP$E o޲ebhtO似|$D#G_0tmCa>YYaa twx;PWP^L Q| ǁ]) KX/YR[Yp* .^sڶ}F84oX)w.{4G"mz  =E/x.{a@]*3m2C`v*T="0f> N;>pߏLMNzct~nڴ!H=H!_5p`⋒JHs=7rHT Gְ6R2O&A #^ U"Benm7ã.#@(N&Ei^'@tn{y+q "y}w㮏|#ZYYJ}A` G퀂޽{>ʒ #fj+PH-hg EE+W֡PŜdjhp4 &RUz}"ιsОjuISz-7?TRVَy7t4U+%1cK$XֲtoێmwwozmDM]YQuVTkgg޽/u;voAcN -i>v˭aCnr@9&u*=gcPū%*@,CxVJ/Ff?@FDIMKD)==YxYW7/ II>]2dOW +3қ a,:bp8v ?(r?eDP8"vMu BWR4M[+_rЪk r?O>egl:j2$ƇLAَ{GyiKӓST:OHU-zQ/5.EQѕ+W`ʋ|'IG(lO?O?4|9bVYRRZeu-&Ϝ=~ar|2JKDkD3<>ȣp``_R{0f["P`dd~: ;ØlbTHYALR0 B ,hP`*0Fa~FWQY ҉|V_ā9:55=7G=uAb`j@,{iaFjZO8F9ꈴ@?ӟ?k"&';=?zɧ}`:Tڵ늋KoؿSgA{e69sVu6TW2K%̀w=h@(B '8i  "u{СC##ȠJ!,Fp=o=z{A!p5dzxx$HZF=?Յa/:jkk=Ŕlظ΂a5 8HƏ;~z'ƆG>? VZQn1$ab ==3鋌h6ݻ?g L G]yA2TjO8H*wPYCyػC-8J}C[T1!(>AFbLMMaT& 0Y} e1B}1ٶ}ob,b> =XXTJ SQ@`T؅0::ƏK8k E(o oq< P] #sjժkfeee`Bj<~5-ІcܛKݹcZʒ%%UpldcY= 8-d_7HK7 Oap*9'x+y_ n^]UaGO}ꓟ|-U3xD_0J<ss/3" Bpt^/(#揻, 555%Q{>O_'?I+2XZ{{Wn^~ytltvf*X n7??:maUfL]]]{{jLpTPI,)9EA]C 0lX#53&HBaVq??z2N"'0)ʍHXaeJfx.M90B5!Ši =C4$ji۷o,[neHfoGxԩYj ڎ9aF3iGBՆl:x`ss32s4Jk?gς5E^S028Yk"Νw xuׁBʩ[UC&jS4`ٟg>wwVu sAUb2ѿpy 7pmټf5l 8$V8%cv8"PأD={8__%:BEe ǩ3*x\ ӧO>ydSSӡC}9xb06:-u= B7\k:t~8E8P0oom텣]ziYtvwilLv6}HRT"%HmmW=p (Ν;*3;ߓd .ѼȺ2?SP<[Q8q>tQޡA2B\">OB cǎٜ8q#9wS9;'B2h IO:O[Dlt===x]'ʭC13gNETTThhdSpzFOnxc6l۷1O<mGFFA.}8B^yG5߽{7,2E3CIGA'r \SG{1ǀa ; GA=Knظax饗ۢ1@w7m,+W h ?t(*L:hk<{YLO?zeޗ>[Ys-oo)I3PMMg3$0 MLYӎC C*ܕ GO`cv?a Blj<%I.z#aҹJ(\\a! ąh 6xx\رv==o[A~?9 ѣGmۺkv>Q^QfpdSss"wummWB̖Pƶ6X8I{0+ APȏTVE 8nui낣h]p` g׮]{7nذ4FG A|]@pjjzMU`wD|@<L ÞpPZΝ{::=5m˖͛7UhiZ Hy||ܹѪUb1rxuס,ä/+/wٽԦMAKR$ `_EE(r6ٶm+p$<6:r1֯_7O>8u5:gO>iƍn6Ȅ 7nDKCA;.=(s) v i=`67|3 --:;uݘE[b(jjttv mvnᚦWVV@,d]h(,)hT3TtA-򅩻zڠ!vB5ɐ#oN%%+jKKJ0H6Xh]HRXTt==( 4sW\DQR|}ݻqB~'0jU ϹFT(j5?8JgJKIyDϋW^DO>}=>? ҡ-azh0t}#xd$HG; 9 >1IN hӣߣpGN̩{nЁ5` Ҭ=,ᜈ2R\W=ӄ{<x:&H DuJWH /h-θAyu8 i%hq C"-u((ٜ[$cM%{1 $\5TE )xWdĢ#7 Qdn@ZL?ʌF/f iV5fi) o^k9W ,8RjȔ5~ b^P!uHHb$bYˁpd`!ͳ:l4wo?z镗A|V1AI34( .-ԛ a5E6GH[6^5-@3K\hNY"HJG !cQɩ#O<ٳwkh8G>E`䩨8(\,YdH 9b8i~p=#>ÕAB$Gz2|tKd%.$}pp<*IFC78F?$Dl弘 YS B HO/D 8R7e@&>Dd(pRI)2:%.G@'ݘ1,(‮ӓ>rp^v'I&Ds( x"%a b\۫JLj @=#$"P 2=_jrgP)Ʉ W.4BVh~?Wo3Oሐf2C?mEie9dd\ f!$466񒒒R(cԕblPPN/v!dG #2ad.Ѱ8p*}&V)6k `j @Ix}XuqB3r!/)i~'LS R ]`.\@-8K,K*Frǂ83Ng1>=*^b<|xHN ha1?P\1y(2X̂^yQOS#$ż\ዊ-^pp~!wxa1Lz!S'1.V  51jhhx|ͱX (*y^.Nj{em씩WZ$ _ص;{c y=_@@@?m_4^UU}\L 믿kһ)wlgXzuMM͊J~<? 7NJK咾.W ӌ.Be#\^n΢UTTj`VD4eiv~~ӦM۶m1wqKsXn1 B% ʏ8>^!(4 XKSf.}4M69@5(M/2fC)Bcy$MWQ:X]~s2 o/2C(B/^)3>ȿH,kjP[6aj@cIBo1=\|ø\If~ۉF8ʗr3#_us] wvF D s/?vy紌><'t'rL+.ȿ`,[ LuÑ3p|eP#(#db@ $zC/$oC0z.AȎ"\'Sܫ \uȽJVgYm[ ppHq h<:-\ 6s3c[u[yel vQeEEnO/ۥqz#Fk M2y =|@~OHf TodaC F fFz/_Pp) 8ml>'>k3b,o ?95xM㋎.3\ܓ ZDg_1wfEQGlUR)yXP ,Kx}0䩉L ‚F%{U!l+2cȒk{iˇfYMV#QؘW^#KMȿDURBB>u4{ׯzHcq *2B017 dш.^HDF"W/{I"\v`k/2ʃ1~=%zpFI:}ї5!X W\z94.ˊK[EO+0kx}( Q@@@@@@@@!XCIͬFXƅ=:N_ ‘K'qU$O\qq.2؊<]ps(dّq,+N9ؒ,USK\0>^.Qt2)ŢXQE\A_+S! Jg=JL'tH"?"Ir@6!S)!mPd m2R,3y IB<*þФ1rt]J*e9LK_gGi \t՘0( l/gs ~fNQdB# !b$tE']K%=е<˲\ `0D16U$ABqOHK /lrZ J>L }]۵lG#{61,S5ij\Tׁo:˾k$S4* /@r@0rs*(@&LC y( 1P L7LgJM< #L,"ɒ {"g$g)HHi64b7?,%ph6`'(pY[Vp"IY*- "?t8bӓm/!l䍘s1ٸN6GAd& SɎ"'e7#> h6&|ЀdJ2RseU , eHjp'Sވ6, ERP#;?DS0?!4 ӛ(DbɊ!-kr($rgje**Z(EVXb2ɼ!..QdDZRh{c+)F )5e"fdjO# 몒9iΩ XC dqw* ɱdR EsݘRF ڽcYYAv F.DB~, k4Td 5y҇g=lHRQF$@Iɜ;Aac#-^@-+:''OC' GP| !Ċh^).{Uڕv  z?ʉ1:;+`ZdOӖ+8Yq'`J} Y-Ԑsf( ?#dtFl[30` 8{BTq G>1dFVtH yPL6&S(uU lQ )g|&7]U8R48*Pjڨ>PeYFYvs/Hp1,74Ȁ< q6?[vUIpGqS<]A90:"kptEm %e j#I:$S8rA\ț˚Wy ;fy VV*4ClQ 伨̢6eZA(S."H>uԒMk¨>M!ff6{*GH0"!/dad?JwEeՐ  Q5fo7Sbf yPX#zQ\S]x}FtaI"d!P,l 7J.&jt AT~jv$$# VztUDuOGrW7T@A06} &5H,bhz6#{Cj2#OYɯC7MNǓ+d EDT&b`jOڣcT**uEǜCpT҂̂ qF[*Mù1]2?MSETm۶$}h.5HeUE'C2o3GO5Plʦ;("DiN1:K~t|zBgG` Iڸ@T0SeJQ8E?>?9Ⱥ-SULP:#.ƹyp41+C,3) .d4$T- `em8(ŽEW'h褖̚'1kW&d4B 1ccC4>FDPrH)I#?]XXs+ K?2 |'ڷU|eZ@_qAh@ǙTT%rʮ "'L)ob4CSZftbR<8T!jZF$FH }9)xlBD ڠ.#6Jh0cF RIQH=֏& cHt=vCПa#]R$>h/k)MEM6&b:0Ur)ί gQDjTjf!,5U$Sl~5e;+hzEJb óM?|pK|Q3 2CG59(8&(c~P˞}Mmlidu@S@#P|xFbdcN1M&k4:;d>6h8yp[Vփ(RZ,%*iP4"jGJv2J|mv,.~vyPCN)XN,4gܩ,Lr,Fgll\' Nϥ_kn=ڴn|˨R lZzۖME>_みhO=%`c=9hR4SGZX8) OI2/%|H/WbXxqFp-*FĂ@5 nC@kqH,!Ţb9BЎ< \ɱ@sA'ƨT rŲ%b"4]b|~Hݦv1:|uϠ gka:.glu'5$(S,l>SsPVmݱ| ݱ5b̭e1qpZaRLG10xí=?Ѓ T鑿a'3QdHy&=h{F)e%IEUV#̝4 īA֮-W}mJ m>-CK0Re3EdcjDhF)D@Tay":LJ@ə!J>@UL5A'x~5d =^hn}ICc4ͤ;}{ͻn'л$> hcL eRJBx>] !49b0J0llepFCzc hmKG9r\2kwaM)-YLdScK{Ɩ_5E%8d[[A6E=GCB@$FmY1vcZ!LY ii\{slवO]mI!ii[c7YAE 8dz.(P8e XCƭuQG!Ci  $ɱ[8R/ Tj v$Á?Bύ Pٜ`zGJ%E_{ ;7oZ %h -IA$G|X'C<ByVrP #LQ` JEƱNP1ŪOz)F91 6gs @ 3C#c#Hc gHW*/{m(_(>d䀖1M$cլ Zi S0 GGf?KG&SY4Z{!c|RtǧS x-eW1e8CKTԜ w}o|l|`"0_mh{D(>k>tmٶ%3bI3-,Qy*- Uzq sh|Qsm.}{fwh}\Vla-`WFbQ2FBٓ=݂ XnI( JMz_Ds AM7lfb4'kEw=׬ZU$yiz4f8TTxH=Gʘ=Bzfl0dƠh 'clJb!{,TҒr_A\(G0D8@#bZFV"YW 6ֆa")^J,? jp4YlkLDf,4y:bk4y5Uik16IefE@{@ t* l މnʆG2l|t:]T(V$En@JX^>Ζi9E½23+k4j3Qtlz\GoSY"kl3m/Jc3dVddJ3aK2Uɯclڋ[47Ƣ|uWgu(cRZR2qG8\P(y=P±[ϖp4RTXͤ+$L2֊%IK!cէ:HhNÞ 0Of+lZdzpPQ}`Y4baH 8yz( Z)IW ۤv^h"#CٰsML XUSIg Ӱڤ|.?L>"OOKrA~X^g9an`fG![aU&<̣(;i?DIȖP!0SPb SWr5XqT"5F<Ă0wSQݲEk UPlѤis]Л$ 2)kG K00iB/klURhnͥBDKf<?I GtUmk8XM~`#N B8"njY%@8݇vV*QQ{p 2n@UОa#Ԙ5Cf"%DƗ ֬=*:9=z%~Dc4ҧ~GٙlpYz xB퐢emb@6%zU zX'jt|䈂>dx*0fjM5I/3kcD,M'`>U2ٵanhaR%x0 ŠThM[Z \Fq2Gh4(eL/WA]{YDSҔD,3Yca ]O# C=.=deESه&)r&b2A݇߭&1sFépD;YM暶[y/|51n57/%@GDCdn1֮_.ER1aA#>dmԔ%Oo=|l zA=10=lQLxM-3뇏jKل5}j5eo:ן{a_ơn=GY= Ck&W ȑq- uz$TVɳw7:ujpbaQ#`HԞGi n<ҍ_66H !ˤ) 돶oljGύΙ+VF:sw"cz=704cʡӭ}:<0$3Yj4@h:z6a87:yhIS-HR\tçzmX䜂J64.G?[+l(釅:vN_ racmS -K&J|e`hCFY9.nQ Ct CzlD*c`@յ?ѡ9irtf|p6p0Ds@|\=rbjxƜw'(@63Iܑ#CG:3?27FR 8@$y.i>ymq<);xuꕃgOIgjCڎ?>ro߱':FwӔ_c&g͙T;NBQS Mf6m@mz_i)(Էo*.azLƵuU!LtI鵴>bSCTF4S}(tR:vБC-cCw5 5-oJG:M}̡cM]rba`;545wlA?RLl# $ jOuM@1=DFsMV֬MΧNo>qc*뺡Պ46鵵MxC`Q ~L<{d"HBMGۇ'-cD~ysGwu%yk, .>C6'p5Ow 62=rudx g $Nk85=1Ü_֡=qut8uD񣍆 pht\>vSg[;GiE|:x7B=>H>SFhcJMnXCӫP}Xmt3ߚA'cUQ|}m}v;B! a*#g93LSO;r}$>858 󋣪L_9};֭(bKrG?~g`8=8:ܩFQA~cIy=G}''z3sy2>Ί<=J HSgG:gl9jdCS#]cαsM-33vyia^Z5r}O;svdh$ӏB  躿0\k` II<ܙgkm=331G6*(gd;?ݷhwwo8s}lp"D"{^<4JJCр:p.ٌ=Ϟ.)Zsw Ԭ &*ٖGwev|Leu=TP$;pf?70wo *CG&$2־C==QX~t$:<087BS:;ΞEH /45xv_DZo={sLc),2/k<ח.کH0?L!:On45P33MT C#3'>ܳg[ٽs]mq F#~?<=mnP $fڋNo~AEei4`(s3HΉ'{RH^qeDեiyƣ;#Sv0ъ0?uls驥UeƕcͽuEe#gׯYY] ` Wf;2xHg`r.T2 cO¾3]3#n_̙ީGOd^8+mP'Z`@Ċ4gl̕fhp-9/v&CgGg ֦Mgӎ8ꝸ}I4ZZYpl؏wL@{pwlڼ(253H憭knm+Ӗ{qMWZك q+]Xڹm ׬-/)KG R-X>02k׺;nt5וb#^Pp^QzdϽwݱV&Ï9Zk7rS5T]}]тX^0h= h(Sqپ䊺U5y~]1nkʻn^imM&嶶+Q4'] mz|#mZ|mߚqzb_ƭٵ[64*F\RVdW'욝Q*) iT҉5[6u6U'Z;$\c~a{4 ;V󎵫V`. _|9/Rvr ,uVTo\Snɦ#XPQW^-{^IE#[6,&գg{WZyShVV6nt͵uG'RVmEmI8CzM_YZrU7ܰ&d5Ǐ<>19{-[^[MqMP`lEYs`=H9keXkƺY VWDWk']9:=1rj,)ѴѱٙL0CHLywڵk-Y2R]3GzyEz6)umX|W{۷՛UWj 4_KPGsO]%*VBU᪈\  }nݐW[9 =5PT_KkK(ް{K4MQOOk鯬(~Mkn۽bum ZP"V\dkO>;oHiEp|$316UR+/Cd_mn{@{o*&TV^(=p[VFG;nƂђX,rv̚VU'NWPQ^tHzrcS]7WBVWWn-)ic':6o_qݎ@eYg[O[w^qc~mu$1kBe]uecj&Sdž|m7޴f<Թ1з)^Ys3ç3_s[72HgkkK#Hd̚XuYL HI=t|6UW57_umߺ2RS]>x(?DLG>vKQvo~gŅ#)O㠍j~ީ񮁱;6Z4;Oض-/:vg]; V,rL_Ñ`A z'Ό5e1:'Oǻ{g6l]YZ1Y(lm.m }UuQI{6P2õElO;wFyWԕW GGׯ___Hll\Q;\zue~mEtD+*EلzԚ_rHAiKOˎgPA\Toϻ߳qˆ1Skw\S})WK4$ QM lUUyuY8T'g}ϸ~u;y +#5UтىxŊXapbxx}w$\qDk*Ueu XvcykݷnQ(T9]Um]ʚpՊxA{WoqI$?2 -hxҲ<]3=#֕´_dfuFz'㩹 jv*-G :P7rkw VUVI6zZyyiP5FkV`s{qEy4R|~4>z@ GCs+ꪯbêpiX&7㖭;VDb%xf``_U_N?/XW]oN<򄿨;n\!Z"2,hclmzm2ߵ];wTFcڲյ[V+( GUsPUEA2kny ׭+) uy_+y;n妲ȊX:kM+@x?` ZUudXQ*++Z<;֚13kTY_TZvSE@Ii{(?.+(~\xsdUͪ[[sJ(_{Guͮ [6U˪ d]i=Xٕ, 4J70H" (p55XD"أ:$/W\t? c8JzZZ"ۿ{kN[S}{RTmbv(+٧:}gSMe)kh(HkdpP;J,ծ}eVߐ<NL9)3MUb%nJPwUύ t_ ǒԌGkS|lxO<SҢ5pa䂰$x*Hx}}c@̴|~уsͧӉi@jd0NO2z[{2ͫVaԽ25%+%]LK=p_ӳT[FW 'sjrFHfLf0~JTQ][PZ!-REo Z&j+i%eY-xAy4m+T{ȩ?) |97\z2yeIxYE5EZ$(T'wnX|MRMteUEUY {~ Уi+kNIqu'Z{xSfs[G~~heU4 ,hU7yT<0R{z$%J*"e+CŚ//ByNSV]cqzYw>.EcU;o.(fuw˵kJ[z׀ 5; p8}_H'M"ԏu+#e%Dp&[6ھwu>HP|bѰJ7FhPϦs}/JA>軡E%֬+ʖ,|OP,EEyLh*Nkm--(JѥҨ~VTv fl%NoEڮ SUzŊRU5$= W畮Hlr"5Aϐ;&g2)N|>]/ڶ7d{.bFA )=RK3ڤIfT=K_eR-}tf4vRU>"e[ vQTB*_ m_0/othhw"|/hԭ^03N`֞M/ݰ!eIw\gQRʚX]YXT`5/#7>0khJ H~gxwhl@{s#07vp3qp󦪊ʠ*~WSض}%xF\S hxRÙ (ka[$?W*7΍'v؀0,cĿy]qiq~J @&&{9 ۶Zّi3əXq,$ra,XPn=alǾOf>I|*ZQC2)h}VN)ݝS'Oxa %98&FB]O%%E33)rloI(wu~{~= )*/l:nE=o8b_$M1ɧI!}ז~c˶m={ΎLeG'}{o7}߳Iٍ1pcg̙W}k?'suL|~Z7/&B>9&4sܬՁPl۵,+C Jde۴Ab5ES~=ϧTU` I3Q]oz25=?rG?Wo?9q쐙`LRKENTdzSU^ Y " nIV\hB)x"9O~;_7^Ǟjjkk{F:{A;Ɲ[6ĊH}>^i9RcDJ#I#1K%v|{{~_?W‹LL')9flsɤd 24T8fWMɧPA: .2}CWŧHׯ)-݃T( K M>ċ~_+_[|<ͤ_t\PFYX]ޖتsJJ#LiE^qed0 c ee8(SI 2Z(#8qXˢW6ŢQ_*ǡ/xHض9˅Q'JJGȡ Z ` ^VV^   ;⭬=E {'>ĞCY̟@- E1HґiYzw/yȑyUQ08ژ89JAҧ T>zF/1As }^q-Sqild8Ni>~:eK JA˺+ "7ҘIdh y6L7s٬ ==,IT r_Iòj6i:`bEq@;|~婧wz#Mm3iǥ7ͯ=_wz話)z2۱XκN&V5 wRbJXAD_!s" &HPݲ~e">̦GnwrlvӚk*5M#Lg3EyeySS>tؿ}7w~||>pm2HDx0?N?ܿ+_X?G{Z{AFXkA?ޏ}L@- %֬Y}p8,W\d?>gnYfb|L09`^֮Z|톪3aH7[{g?_??7nXYSKaz֔2ٝOc[}?}B;aMzY%빊R"Sg٤d$PGץ<].Pw_?>} O|3| @ 0iy3iY) C>뎪dfj޶L8x9+eSҺ?ُ~gßv [7vlzT"1絴t&S+++"B %Ʃ~+9!8*Oʹj|&-|ݖmcO~#3g?uCA6+0|#[36: _ A62()UA- B`d0ZKjj閗5jBՃ :+(ж6t=Ж1׮-(QhL[}?|3ԇV!ʑUԨcvl@W@NaܪZmݦڡ2(fem^0_a}7i:p`AɆpL!WANy0F$ LFUVתEPhIyAv{U5:׀YbR>C$*Ȣ~I5 Јh$s݁C,GҹTNO;BY^a}ʼn٫QNw *P N'2h2Zj*p|V$-OsO'G#<*e\肂VtOGtK8oo?_w_/ y("R..9KX%]2H_o._J5j-AGޙO7raL,P&WpJVUZ j.s9CNQ>s߾]G6=| D(I2|!G($WU*<[sM-C{w݊? gC#&+J%rpA/G`"ɄyKRBx-Hcr e`h׫V65㶦inr 5a|kL(pOZ1^>?t*P)g{n#{o;RgGeE# RlrxjLKV@^t&Q(ң (j݂/CNWk]û㶚V@Fh)e;~I|&Io9'Iהvv+(P3d!eXj~C -iv)7jTE+BΈ_|ѐ뵚[ܭjn8۪vtz VU [b*U^4!45Gjafzu|*sڀ?j` }6_ߔdA3D% SͭM:i9  Σ @%QhX<.wz[m~x)\c!ч0"+A^Ղd < mO)[ Y@XF?D_9Q,HCrs.qJ?4P |X RDܺ#c((zC]H [@> 0|FQޅ(H(,{T YY7 ߼_ʗl?0Be\^U_ֶD;2v•{?_o=Z+RQP<}2 CW5zED/RbxqM#8FފrRL[V7)J( 4N*zکp_q98~}iT)=]\hGB2\UIf,BynLZ.Eu*fqvGۗz Kz⅞XHUu ~@=_̀,8`2f ͏=;Z8sEK P9hX35Y>CɄC8euID鬞[گz&24%G4 {[нx]@ Q3.lq䫿Ѓ{wm݇b^2-tw]~=Jq9vlݵjמC| r`~~F~ VR2&[OA[s?ӟ40='`XaB@2 G&HLYQP⚨q΢U3/*NB/N \[rf>6oY fP=f8UGskx~lGͩT S\>aqYNLnwZޢ.rt~/h+ZF0=(CAh.S!,X"Hô8>L qjOr(/FE_LoZ%Դ% ==#kbF4|1!Vhja*gĢiy-ѥN/t&-_ȫ93 2RY_U?;wmk8yI#pfwEP]^xTZQBy i2-p^T "n<])fL 87=72<_H#;uZH$x6-upcLZ]Zjkɵ"x϶ʠ,(XWϕtZ:/`ξ`tcIQ,I,#@9B p <6ܸyߡ=58:UVt=N޴j+qټg9+k3D* xUaSRrBK\ ӫLeu^Gc*67^}]ֻ(^Z[^[:%PY_]5fVꀛ7œ`%ls󉅹)/ KK%iQӥ%3BH9')20=C2H799^dA"V;+\Z,qbt9oFST8[QIQ3YKײEwl!|m"pBbaњo)OKe-%K&#Hl997KiK.0siaz%]U+W\a8k`\=ٜ-0JLmgh!c[z6'd=ɖ@7ZC0U\eUb"oq)Dl!*$ |<}Rrd+9=Oi 3 A|Q2.I<5D萯殻vc&U3m)ce;4gE-j "Vnbɹ|EhcH!5j!r#)z:E1$]TkRMR'/OOpJ޺04,50@:ٔC%km F險`4@Vc+ W7釅4IU3UIa8dZ24^3j+O͍_ά+k1haLMzh4h>׀EGlE>Lei o)pMw޿nljWL !-;&&oJfQ[{W^&z\+9xrWuwhC첌tgF ZJW874<E{[*žm i\>{ܩl:-eRPܱ r`s]pz$lHz"4$b ]u>Q"Ϟ-0=/N Vz~}hdaC *B) M_ز&͜tj+=>9qօK׀r"Qw*HBSZnnFO'ɉ̩.-B!@]9kRe$JN^hɓVwPT15 Y-rƊ\$0 {~aQ% .Ҥr˯\ϯ 84V Ծ=mnz ݇Et{(y{Z"<|*P]ty$RQDA2.E؏I|h 'nbru+jɻDBdݝ2u]IT]3 M_/t.r2zb# 6haIƋyȄAy@ml-M3Kg 9@ c(-E]-@C[F&.ɯյX\$}W,ѽ;;áS5=I>2F㹬x;<\қ&P3gΌϬR1rEՀT駸ev==ʉ\l]f w.NjO\?g;5=eu<0/LezЌ?7SQcMNWN qH31 .Ů]Y\[;r_1P8,_BOD#"vMNƧƲM/y|[{sh`djlhujXɗ'Vk+jlnPG[6TtxB{ww|}UDkGC#7޸? {MkCYS}m`dj~!{詓45DIL o.x\Juudၥ+/\ <9quV5Tn՗NsuUErYzX,\!W(4{j̑ob~%&gƆ';۷VzzB 9wp#5t7-4h.9ur*nHs#+sc_=T7lmhTlZWE3;3;.;a =#YojkouPZ7#ˋɉǧNUsmu瞺'`Ooj{GsG{g@^gqH[s 3#nBg/e3꾝u^ p h41^D;k>y9VVңшgaEzӉ'N\kl8z榠2& 3a kǯm{=}Fu_XnDw4d[\]-[ЁOY]Ku/x憪v" /GGG'ƆM O*꺰)NJxwoז֪ڷ5]NN7qbu$pxoSKcBrĒ53zv8w\l4nl@Gg/NTk၁ёïpmmQmk= UTD°W<1󳷀-S~bh4žc!L~?IKcCЯ(@i\.:u+ˋ k+˦߾aڶv?H(z.vh:*%8tzIqpnŬXl-W׹t2^T+# n* r*^=k׮:<''ɼ hɤ^Rk++ c{mtU}{M0zq׎jCrt67֭{"R@KLKIcbnVUPDnqrF,j+ICqxRdli08oKu `VW i|bu%c8zEZ3{;r"-ቂSq6Dlv=\tۏl=zdeIYYvJ om:]xQz$J9=RSSesUXq/9;^zQyGjh fKYlmk5~p]3V-uш]CE9X*ݎ8Y2w5HNRZZ;ڜNer|"z߾(} bKr+{ᆳ ⭯65~h;-˔_ɗltsq۾mm[!BM;nժTVTkRuK&R H&`WPɐܽ_Wll$2 3ӼݹXSᤏ҃lҲB,VRkkuMmHD:\Ԉyo#iX뱴, -斗fUl<*#74D:tt˒QH/M4W9QǶFj">TrL6XQ)+ވD!r@<@Plt5=_DŽmm\A"Mtwfaa&̙ڶܽƚB'=:h:4=\KuP0tvM3MъH(ʶΚDˌ%2\> BLDBΖ_G3K llf}wۑ=wޱsga5x8# TF7H4*U(N9^SaρϚ*r|, -*2Z5u~ s:N>T:B5!h3Y,qmAH "Ҳ{G}"pH|4ꮌV+-/M":th[m}wlk *Jd,{ 7wv l0B.[ZCg׶Çv4~D0Ү[k~;N[TR2ݲsP#XKYZhzp&\8-3R:1yx"ZU W+as舉ȋio xi*J &]%BQ(-]< O/ߚ Bjz}҉/P=. •EC( trC:A4L^3Yz/1Z.b:t_U9sre0:9˱Tu I8 08Ӓҁ=уxjl\|p3tw K,fHeiP*"r-GF ]81 E@$SPh`XKBީ7^n'MA6/@Ex@'(iҢ)nQҋ [k^)@dS)$S@z׋i "//hR%(lEAd(;s84@X v'rtnz:*B|[{NZf|xzb(EɑplpM&'i1&Ip>Tu+E)ɱ"Kt;'s~8,=h/f9 8 ˰D}^u Wxr (dKΡ+ҷ"Etț\aHgs4"v"kyP @Mr$^NuG6CJ28uYV @.I\7,9 (14 沜@/T1tD@fkExWB1U*9(X&pb5C׀:=\ҴrY'bjchft=qK$} Ё)%; cB] Q(-|,d%\6 Nl(M RC^.7'ː-YgkIajDI3SYlI6握n\APt@ML]"PƐ0jN⏾17%AlЁs:4o`1 cQJ;zJAn(LY2݈i`q֌w,[M&T n l 詎ɢl!?4L7]b11}MQv! +`0yLJ / ̞\N24Дyɭ"fV01.zen9N TT ҫЦ|T .FN!-6:&Z2Le5as z[v7UhYE >XN`Hlx)ZY%{ !UahYg` a%`ղF&zВp8U2WwX\@ # ;` nTғf8{z}P B3@&yQ4JH^ A1IEZ ZΥxaE3 B[ЭVzibA%T:AX^^B =: oH('^Y *GQ3d;5t@8.cP2KOlwB Sa9WC*cz_ՒqÀ_u29+. &muUUD0d32,hIuH$E/PozI:>Ǎth(nZnW<}nlm?9hTaJӇZ AX 3MF _azP(z+YMP1*$x6@ ]B>*DtOE7{N P!? APy FE]w ɜ&ӛg` ҫ_ HPSР8Iϰb. ~9mVɖb{CGQ9)3f=hҠBZ%ꂆS+hZh Po8z H7@o, U@nɐbL= #FU_ [Qca@PgP7 ØA F}e!h%d˘}@4yfpؗ!qoc"DV5g*&n ACC^Ja? |]!D /UYbYiOֆ6P!SThp s)ZDVA*3̀0X:}_J&"A$@/(`%+8P-^ 3M91$:O !ѷ0]RAUd?SQ !, t^GwM@&` pz+lchAOCn`R1@)"SCQ:BZ,js75"9(T[~j@ۦXw5R_!c3 =VMfK݁q>@Ǚr҇'hM` :I6a HMĊIpc@*&I 4d#2#ĥi`%( \lH(Fm!ZDul BAxxKH(U 64%_ɼ Ԉ-K))vF?2ӔM` MK 3y.E;2eiA ŒۄÂ=k$6OtHdO Ā Yhi ځѳY9Gs ,`%\/`*$BL@ D P'\FI$ ày@s<ʃц(RHc "5-:/-doNGv7Թ藔 ʆ"c0@ldb5D8qpE$E)3)k.(3ƀm\&C #P3ZE 䤜ILcl9D: ,V2N>Q!i1jt@ \K=FI f Lkj&a"R4O~i!}%ݦ:o(KEՀL-L3Fe4 z/LRhUD4!yEm2*@UHzhtD|4khџ mF GKc$;bkl0P#1N7b zAQ``WdSP4e*@!Pz'5Q HfgǠ%B5J4dX[:e52`lфga"$I {МB C)84SafL(bcF8M[TqIY>&M=Dnߐ"p5J48(i$Pj]DX0IQoQj282V%4HMYzqݡpM_1b|cgYMlA07d`n(G6Z-t%Xz/0di&ڰc>-隑T0$!& $x#fez`jC"%aDiDPy Q8P#O NFa"ҖUPmd D:Fh==2Ut]#"wKQ/]%HV=\-2)N'8<t`+iEk'{<%q ?2.z*dMg,S P+XȊ꠺LXlq/CC0d`{ .PNN&,=EI+ct Ы9俰 (n Ÿs{\jOߙsW%{>y Bz.pPP; EeG _ a0`OM(GphECޗp,*T A0(!6+$Tpq*I@8WH?@I(  dVXF!'nXP^8LޙBGl1!w:IHw]ZQ& RLKpDC AI Nj@Z1P6]HBQ@H]B T9,9l 3un9 &Bq2a?8@[$A{R eB12!YCgzP:[/.nr$` U(T^'(s3G%p,CJ (MdPM+(:և|Q .,X$ jX^#[J΃PLTXbso: 뀿T?s^Ҁ!ɌHN ِ-2dH{Q7$:}2h4 VAF6:`} @BCuGY82kZR@(L2?xmXM@=YlL2DfC+I +6g)C8eDYل+A-9Zc;Q*/bn 9K8` Cd(68@AA |cӐݙ:/ҫP34:}4Pe֖F~?R]C.LuDҡ)k%"5\{a+!.x*>P_XwJ(e磹i_(SnMy1/zR[6 s6oS22bitð_G5ap*2K0!P\StѨҽ 2j(/v(\îCr:BaeN6,׍5qn2$ D $%a ,7ٓ?٘E,/UB? 4v mВE"&#*z(F 60nV2^ qaCsHIFs.>Ko0#%LB%zff)-2egSl4UL<60Go8YBI$n.(Ji vvꤴ<6bJ68 vA8NZ/o+G壪pgR\Gq.nb@0vciL@R0$=77.eo$1]d it@(T<tJxXRV??M"Ԉ9#ѯ@L # k!nS 3C87L=Mv"8DY EXFto)@Q:SV "6H4%ޢ/rXgFNȃ6P?Op ոtQ1 "c}3OiW#Fk]v&m (<="((b FXYg&;tp,6XvuEcXH>l8:2dl6Kz3Ֆ*@҈[h]!ۘ"Ҕ؂sR~1e&|Ucw Jmሩ͒Xɛ3A'iv3`@0i"11"иYnŨUB&bSj.m$bهtR*V YX6.'(R(nޛL?~WI)\mɈ5`Е`'lX볬gz9Íz؍*fVl`Brv LnW1c;{ccQ|’bX\(N)Ϧsw2);t 9b76z"ͼ =`"nm<߹'YCBHF<fbkr4ac ^NcP#2KDǞOMxcyfS-XVx! BAX3o&׍ٞv' ђ V_8acV(\V@(B ŀ_ Qz;hWNyb>B3 CJ M 8ypGJ:dwޘ+"k6,ݎmXaVwi@%Zf7Jno V [Y b6EKO}r3P^[ Z"> t4VTYp@Sf7${YNѵKbR/Z1XMeUbȆʄaoal\lxn:tO4JYFَF,z v&.$1uX%[*BV ٩>җI-g>E7$I X)dB6g:Zӊ!`AbY!7Lp[d7oqED9Z-jR6G͹ JNIH2Eܱ!ce6$Z`$(:À\Ja$]lZZfQAt6{t|d1CLC.EQnA?vkj3M[6smo Fi#x%FLgWiM 3l ɨLA+۴JĆu+J#4<aJY6tLʴL4 HM8tlɧQ9Ǧ mJxn$Dn΀R`Ɋ"m-ōdcR76FTB c؅M'3H%SzJ¬ ogCe9Rٰmcr7MRt¶c";FF[66&/;٦ jg,2o$%xSEL P#mt=Z&QSdL =]t*`CىbWc'Dҹ݊}}CJTtڐ4%g8dXzY$+ܨ-ʳ|T-@m*7۠қٲٕ"k(efCSbڰ悴@;z₅D=H+g,78/S%DRN:(]F;KMm[& Q)6JӃ=c?Y؋~OA4 &2TglybQivZ9HQεYC\'Q3!vMEQ 6@ jjk&5]'acvjo!U:頴G\2ݒ.F~ueU%+ oL2Le*ST2Pfr,P*ST2Le*Sn&{?|ʵ+Go;TQQɞ.2Le*STDOWcyy;Ԣ[:<[:CeX2Le*S~j$A pX$bT2Le*ST7g{Le*ST2LIO(}rNjLe*ST2Lez+S1CKա@]]-S2Le*STs%QMiT2Le*S&>՞ٙ{wG"aeZcT2Le*?J9P/=lv۳^2j,ST2LeI?WV( UUU]2Le*S~s$N9ʈLe*ST2Lo'nHG PJ.S(rDp nB.K+e*ST['[^9cTDdE 6m.SM6˦Le*Sn=^DI$atLeIޜfh_!Ke*STw&A(jV`es|FVL=2Le*/GoArI(!c~IŽeX2L4 &}7T9noHЍoLe*S~ &Xj.NK/ĔLgAMho e*ST2$|`hrb=^W[zwTD! ރn:xfoW2LezEAax-?Yg,AD}hMteYs ^GlSvwLG"H7 c'6dȒ%fצ_ȯ̓9XĽųdod{X_$l4w3!YC8Iv*;` ξvoV#7㯄A[ 6 -j7!=[;bg w6wlW5MDȣ]-)F\< E~mp6Y//Eh0iܨ}P__mUypquscӻ}H=SlKӒ|:Y1dX::ʲZJ`fjhӴÞt S؞{)}|Gڔ-&E%bƈ$zF#w' iHcC`_oe92aT̈́rP{Chgd{J.#a`߁P!:[zdw&ߥT&RAvf*CEoX s]%6zaCNLٿ!.>x768EM $$lv%8s8`A2Nr{B; 3b#yJd!jnH;] %6l>?4ˡIa'os 4lR*tў07(ϔt!#disITD/LH0y 66[j.ar/.IeV Gn}|s7gq  ):@1%cP`~[I(c7R/N7K9H$9 D4'?HeL8dJ=i`wkwqY~yٽG{F\@liCcx5%lhIl} DG;8bVl&]1>#Ѷ ٪$Mdb0 Erv8*ltpFaW"ӾjF]]92*RجEm"@XE;g$B^E:lZ&v TB%w6JDC -2ϫzQfƓնuVmLTL*:az i9.)Oy~I cplKfGpd6K̚H!C)$b%bHK-oEpzʼ-"Ơ nII)HؙmoB@P*BSUa68$KAE,m|$^_DUp9&Hc3Ah;ңce%HaR cDA~.cՍ z񯈨#S97YS;3M*SVۄ<"Xg7m$"ͧ&Ğk :X%6:d6OUq*)%1BQ?m|o'R77KJK7w$j-slY'^ndze7n wh$Kr%hmjNqSG?;CX%;+Y^3{mM;" 7ޖ-L\f+3(Tdd K u,ޡw|;QNd6| 6>.I@v:ML^7_ B6uMYƨymv6* ~pyGY흈V?}ψ1j)I#[h,;DD!Y66hV*[#Kpct lt#H#s R;L3B{4tfl-rjiQ@;Z#$C?5"t; .y {"( MҝM1qib.8dƊMPvvj 4_*7z)Jvava1!b^GڙNi6P6[~F[0ef0M( +l7o-C[{Aayh u\P3jӀj*w(۽6lQl7;Kpd}U=j`>s'͡M#d_};no}Gnczǥ4P,Uyyto--w6"H@L)FbĉmTn3l4|^*îP ԀF2XM"H4S,|<`OB);zw5v1k$m~. d@x stCdS6(RޏziYdrT*NLrM7(Rar:9s3o`/℩KFDMqLR׮]я~Ӏ?( 2vʾz@}t!m"eآ@=/Öm5uiIث]'$ryC<Yi公gϞ!YWL{x sii饗^xG*nxJDZHDW^7;;x|^F=#1_?ŋX8*(m,CSS&=&ǫ # .zTm@ @O`)UU[~} {f}~~?r _~yxxة8mMλ@``|b}>:N! sļ7^zvy^" [EAvG(b82jc$ ImLJ<J1Tj'L=dd2!3͕??\. XEu;wj *]. q\dIDATw’U\4g!#x.ck33skTޤG46&bup׍Rm[ɲ{DM0N؆Zww?Oelb"sHEbe,kffgqezK1sLzaiqai)/ XMzY"j<_\Rif3/0`ڛܼ u։&;AFa]NxZodZNUFH`CD/GD@ʊc-dirŨT}Bۍ̀6;+rZ,]Kmb'%2&mrݽLf gskC4;C~"m)m7qhetIj בBȎ%X7*L&'?dʕT!ejz S^xbQs:]LNߐ!TB&v㪝Pvtc"*躡"zt3M63T}X+vĀ(Yj$h?C?!6b+g$R[v Ԋ& <+NWt3MQBL)61^==Cl <6b5Yɟtu]+]3d7}l BM鶐7"]}RYe40IjsKL^DNv] @T&ڡvm"U:aX3*ea&JADD:Bjxꕹ0oG?LpzAѪjqhxzo6_QÀAz&zyJ}w~w&#(ЙK?ڳ?!)@,Mbce'Q Z*X\^-i|ccckL~,|[=0<*9\dӨ6  mJƖF:-&g [ruI2`jf` !_S>RR 7mv[]PT9qYᖣ ]py "|ww \L}Wxʫo ^_Kj̢D4\!gf ^'μ%P3LVܘa0K$p`˗.~>>/~? $MN39Z|OOeSfG KS!*#wunpU3T@+&MW׻.>N$xr"j EEE]XOv +Ah< gwrYX0!Kf)2Ӆ b U2U`C=ph y F-8|!OP5&!y:M7 :GpoѻSOuttHd2_9x"dk~Z>'N|VW xC@5,/7Q`v<4B"cZH PQ^JCVLDA=EKlf>b0rCJ+\^C6gy(U]rDEb7!H j$e0T F,&%j##fp&ٴ2S ^69

Νہ%!0ѾmQJAFLGz& dtTh##L F\1xU#B*I 2 b%Ax`nzhr1{T( oh %㒹<%h1eIHf`A(2M :iyAI4 uc[!'H&4؁Aר;l. V@. ~2 qp2#Lc될ii -G9]xY>t#HP2.if4(1MFӢ`ATU7 Rk0PNZdE$<4'Y^p(N`6qE]Xzյd|3<{ P@twLz5c|$]+ Tmx)\btUAoI C+' H`{HJR\$wRUCțB% id8ŕɾ|2k/3+ d(r#[!@h2j7SSlT0 Q?VcqZhа҂)/d:I'tŹ_;q>OvuM0$^zmA"56ăF; Wz =4 ?z4H"4 ,ɓ'H@l(bHu0XV<4*Si/rLq-Y3V-'ljcnjIm1D99A4Ztt8M]N1nDL5ۄ򘑋cX™" W.TQI՟MŎ̼peWfSٴ:'ȂEVp2B1h<{h00]#vqttO|zO=W={v!=#;p"&"aޢ&$D-z4P`uuudd"ȋgnyĚ(@nz]b\c,'PNL =yÖ8rͨŢɊn^@ט)GB EU ˩@E5x,{%Li12_vSќtb ҴS,.!&X%N-X+1? mkBCw{\܅Fxr KNMO/3$#E&\NL ~"9Tn q,_e o.$ F \i}N%V,&D\I0WK%H2CeY!^hm 4f ] d0u>_D\(<[Ա|>;@+v7 RL&E7c0bn$/,-Ӊ*!c*O[CW.1*4IDePMHZݠ;DhEnۖ/jć9.@=n{ig!@O&$ @ˢP.I(+BY@T(lml3%JX46(TXcԎxC34qЃZ"&Dd% iQ4ذ'0*=|9/Lsߠ=`] ,9hV@]T5k/`Qx̸UٛH^57nL+tFOH7rxV9~۱.1ՊeD(Dp c)@a)@)ƀ`0h՜J.\N G1=$9zvHe`._:69Ha\.…Ӌ[p$׎ONN $Ɇ3'^0:6z˗xAܲ%Bu|/,LA%;M$_ֱF¥+c5p0 wY?``euMB0sQx"[]]spCNY\XLH #K+]9nt|eקR:_\^ZzzLLO8 ؔ{z{xu ~||tt|:y/8@'ɩޙ8n R% 9,-/]re [XXBwqaVff\.Ǧ&ga<11>660;011 K׮\43?79MNLML龞Iŀ?@*bLпot0\W{®AΞ=/̭wfs\!3gb+ѕͥT<^$ۃA6;7rnC!!T*(tLO?|*Q(2=C!ܵ=c962ywb|4ʸ^׵pg/YY(8`(r#C$z}~x6hB_j,x! ΍OLN-|A202n"ʼu驑9M]\pgpi=+H2L^V"dqשS.]xNRSĥ971u5Edo`3+˓s5$3k+kj^ }Ã!l$K _xydd5䊹׮c񕕵׋j.:uj׵zVNNP&!L/u ;|t龞:SZBQ#@EӳxMgWh &&g^&{K <3;?0s"H;b<  YZX^S`ΞY[MǒSOfyI&DW^Cg3|WW([n#s]+,-͝8ڹb|*4͜e滮\E]Y00{P6 @Іa҅K0Y0; 3?6>sO&Oz|xh,@MHB x<~kW{FG&2e0Z[-?@&wg`hxDs5blygyy-ө^SJ-vbJ?k6?,L 3p+/`Gca xzCZ5`uu)xtzQHVWNl0XǞk'V%,X+iv @$4BQŐ<;`S0׌J.%%\*lIU^_ī\U@}LQDhO1/JQ|>_kk[ooߙ3gԢk@0`csD?V;{c;@(B(Gtx٧ *D=tTeuug=w\+cCp[6j=PL2K7=l񸝅tFk/f #=GwLgN% pG~j@.:u.azf8ʧ GOo4={,-ƙ 㶃 i} O gyvvvA==;RY~GFLI˩=n9B ;:5-믟y,/T:c<䑣ϲ+N3)~}(rzI 8%xū+Uՠ0M#v޾_t>t{g'VVB' 8~ٙ`82z>pftԩs]lT2 E5UPS_|{}&[^,< AEQZ(*y`UeI@ >kgV#\߿kwh/NO}⭩ FD8hϜ~=8'85^|g/v:rG$x?:}Bw@Med9znhK[|?HE$w k~UG_z]-[=WQY/_%"Ԍnrɓ'1]K,J"Ϟ|?^^\2*ҽ=яnk|B PqG?s_o_&Php2 g}w[WWS,?BV>gׅm@3Si,,oy~\!S$X:4׾{v'bӡjq:0@P$׾vUEVȽ)T&* aǟwOv£xY w8~޷r]_0kܾ=?O|귾_:qx2\D?#<&ZL6kai>˲2g}YX-Ϣ[w?>V/?℮e|3_޻ť'8.DwPSSjoZ077L|67–:78Ӻ豳/w]U}me?;]JvУL=c?Ne>G+ zfzn/ͷSop<xm矕%CV \z.wO~q߽wVD2EZ>׿uYz&*N|[[ $!p2B Yˆ$CPeL]"iD(~.a)ULd ψ!* 1Q< |6,ȈOcI ;c /848wCܾ & ]_TD4 4Wan=oܽ~뷫).;}p7 GBӤy~,Kc]__+'/7~=_?vء{'1>hww߅ggjk0j%Ifa;ԧ?S,>q?DGkӅ >v^Ѭ~sOz=G9yXGs q]V>Oׅkˇf =pJDP{[Kӗg2_m[.8*2?qjW\cccWo544n4Axq?JRS>+i-Go#d]`PP|OWWGg_zEݿWk%Z=P]w5j*A?A؉xA7 P೟{R]0ߚ[YE+:}?g{&ouWWCPOK?ri_h /41q(|O#ӟo|K$`3]u5?zwvm}m9.Bb߸ps>__F.kZDYg=_y>_;|6o onhkkm_f)u[wpHa`޽⹳ӓ[w%ͥѱڦ-O?V]m/^lꈇ|VD!!/dev{KK+ _kjkaz$E3eőێmllb?g/GAqgVQt]\[S?/~nt姿¶[|JT2 =754-f=h>ISy֓啕O~[\b"˯<|}C_FHTnB{}zp`_=EQzŗ~3CnK\?F~w~7TW?z~q8l KT_?qo~ǝsŒx:cڥg/_я}t5gϞ?TW!Q馢$74|K_Fdz'/,TU:#&S/WNLǿ!^ݵk"K/*tGݾcgcS3f';(\;ɗt >p[ڣ^RS3wܓY+?44.bvg{wK3!L@,ˁo?8+~߅ٳ{oU8[Ӧ68oso} זV1D 't֤>~7WD.wm!x̉ޮcwbKgEU{~ QW0˪w'O~mmm_6~BoOߖ޾Eڏ}-Uo>ON|嫿]S[}n7=BO@ЭqIkcQ| vGk.Gwn9zx<ΥTl߱bQ]S3p4>0;64{Ccp1FwOwSS (4 cD*n^<<f⁃z-M#3"j?S>'w>u̥ɩ[;Eow+` Ž`Şyk$k$ٳ;#; +CS⭪ q~· kDڲTz@Jgy3o m3E ! ')W%䜗<#2RpfŞU\kro|mz)1`hK~h7ɓk =c#;mwR[߰svCSɱjj;;j3S3UU۶l۱c[]m ~ X_oCR;{Ζƻ_gNJu'IH4^!.ƎKY;:tvvTUVڽOHm|lܡ(p ](MуPξx QQz/|6 '!ЍIQ*B vM2_Y'i +iZlW^1%Bަ)qDMsbrwu{g}{>?i]}=X{}G>zhmuף@@ X s#ckIIRKOW_k^6B0b t> / WWc:4`gLGML#txDY]v]``Zd Dnځd`_L$\ ss}? uHCwr^Q ^Q$Iw>tĆX 90M0g{RiCW 7TVTe2W/ON/T"t#әgVWEDGCeeu!w`6%SI=mvynn42: &/~kcFLÑ]+Mi捴W%u7 ^ydl;=/Zk˚>IK`TZL xAPd72gs;wxwgy&u:1©SEPẎd20'.1bZ.'f6ܟrAK+9vϋh$ ly! ʉ k󢕕p+N<^%\}M{@H'.r4n>tYXOf9e$Nj*,<ɞ x#!`9& ˤSɕyp"Z,¢$v^?@ 6\2.Ȅw%+Sם 7Sb>466 Q4啌e4V"' xChN qt/&NQ5H<$Oz%A1,^W {\Pd }H~ ,x=P=!_Pںj6H.-.X$ #8Śp(R,3$`hBoQ|E4)D(3ƒ|bKG3@l7<=ݎH`tC-kkkA v5à'jAd2w gD>H + _-N +ckN6~WR delFSi5^BDT%CT }dc`?Ĕ MsM̴͕?0.:a`bBjuyd%!שFLYz|qaa-yae=^)h "m߇sA 5P5&•jk뾖-~&&CC-{I̔Ti -KҢ546~VWUx. Z} #:z/\,Piۭ'^~e-F<6b=Ccޱq"g"ft2GpXyM}ӷdbh2[_ 3--HQl.0fENe_&qN= !Bs"E /y'`62Ͼ~څ]ĺed<ǎ^(J"yRe=C5?>t6 M+&S8xX^Yx{/ N%:Yn׭KBGMEr&ogΕ^via G8`ä7 USUVMKiN ]MZNƟI}W3\!_ʂ[U ==}Ih2awo>#G;;;u]d3P6܌9pȑ {ӏ?#PZ Qf"pPQDWJ"ׇi`( x$K٫j=IH,@}t*-["z'n8<Ԁ1t{F-!HbQ B3ğ}O|/zjmha@łڠG$0-6qA:Xz@Sa0xP~%ȄiBR&ER4I+ *ȬQ?&)Fwe` ѾkÇ|8 w4411+/{<'| _ !=MCzw 0(d$ ZdPp"KT\v({`׋PB\c: .`.%K1|de"ùcdwI5p}Dvۏ~O|<@(t $f Ј}Xn{{82ҋԔCrnݺq|_X0T䢷LVCWrBr9tC?viBz` ic# x>! C\F؇H 0 B1_|EG!T%ߐt&H@i׊hl]+Xe]C{{dW&W7p896B;ݻG}sc=na ,$?<_Ks޽{as}}}>uVL鞞^/XW߀X} x\%A$?4UъNGovw>׃>( (58()` ze+ '$ &H fM1f[Bt̚pA_U8}lr.y (vlЬAm/ Mwq k"T04YWSTz0Xwqч|F/MϤwHX6@&4 PKʊ;ɉɩK)c ӷAAl „EZĆG+n8zۋ?O0>_O<otUU9w c]nm;w{߾m+$ӊgO>oW~+|8hdhnmaK'bNҤ/  %ܡɩC"p8 bȺN;譙O*UCz??870wbb6]Sh9|$ (q:˕/Z[[hMMO>O~|0XYo|̧xGyx׮]՘0KKt J)GLt2e,8pvMv [;b"|jm|Cg?|jkk"HE j*eRz0Dد% Ꚋl.ʾԅy%dM~f#^8fAoã\.O;Y*=B81$S)DMMPhuu5L<6:0? 2i.IDrDksM`C u宻Gܓ}G;qI l&&=^w,`4qU8 fF bcED['⦦X̪3"6f BCgXXTWV-522^x^h"\]P'`0x~w$2;ŠY͹=澾5ua؆>{<1 -i)/:ʭ[[D|AoMM Ѳ kCC ]WUJ F9)sB4,BhJc]$0h :VQYPaФ$@:Av<^4dI\. NMM#  7 VT7U/[0S5 斖heU3. N 4;w? O޳|}u]?t]XXY.X mֆp>bzQY;y`x'KIKnB޶uLLN^W]S@u/$%X\>va<pLǡE!8Ƥ (#B / uJV-L\t ׍+*0}>aJ>vޅO5a>$tkm&7Xx+3ne^MQ7jȐiƃ eʒ!8J 'PTtq[ u)^8bF*PXqwMB\+^7b> †VTVntb!n) V`zJ(NzܹkkE8ZhTK/OvC|$+Wֱ᠏ 06bp(\._p:[Q4]CD< ϛ FgjjK\/lrE4 Ht`4ycY e 2d 3: $K R(=hfҪZ|ajuՅ遁AZ ВH v{}ЋWޕͤ!;>:2|5DCJ(>򥋚mkkz3Bsww/..b 7Bm۷u  ƎKc|]u]Cu>J`U-U@NLlSMRvV} 7?pO:9P9;3277/+QL JVj*NtB]q0l%+}{gݻrEVݶm[CC#/-ՁٹSʝw嫗GF[6Bjo,Px#wM ~<=ws&g[:g_RSLNG h}g_xH[r۷~6H|k]WWV֖߸|>ttB^.](rN˻0LYS0fZG $6$$!r5~\=YWWZK1I Z9~ѣvk_*Օ4$y^?u?G"ӑ=HE@݊crb)?E,7  ф%[g_?dCMqV6WD`p ^ F+i*P+ !8a( y8`_s0.UOwdֶlN'f]M=wC|`qz}}ѠAe2/^>w{w׮]PA(Yxl I7%dL Ofs;kj#G7uɩɩʚ&j[6hN(|N8[EO'2!z x"AWF =WB!hy}}a^776"tAQY=x+WOmllz<ktnDf"UUU_::Z&k]/qpki;o?h-ay\Vΰ!zLNن b0٦a;BqK,0k-A7eMQN"}VӪ HPٓz[5|gffa{z{GG1o >V&GGg^lnjlh%4=slzrrjqq)bj465 sbAD008(1jG{}!`b~xdj #Nvfflx`jj:ؾLLN /p x 3laj򹑑Ņh?\JEu:_Yڳ6R0x"L;0[0:N#'hvn &8W1Ӂ Z+As!?;Z+#HXc}0uF`}ώF7=h$|QW_#/N` VLLOTD}SkscgKhUK[}0ŜEm#ッs ZS eo-( $x^L.XFv`hkmoM&,@TN[jUTEÑѡѱa( 1lRe4Nvl5uKkL*s65%SѱqD@K"d[UUx9reU%\swE@ z$CdҧO_ *>s"!6qGG'xSxۏ-҇jgҩtMM5B HŅeXUU@%qbzP\y }eey[4\h~JK(x$y+ξ Iq83ޗ>3+}}7 1ܯ"\߽Ʀu:-wFg T `'o\C_vahRr}ZD:=C: 1Qj,-J.]Ng|>|k}y M>?eFG[\ Åkcb(LMfR%JƓI7G3&"gcq_lgM9bn]e$u0K]-l.\+״l36tZ-1mpրm\],&ZEӴlzk{Q4T"89>Ε -p[UettlhxX#0]ͤcs,q*U g"P.YFGidxjl,S )VGZRؼ^oYtqF-1+clbzrzbV rhOL<{4y/ ݪ23~;&Nwh]voXTyƔmTQdC* jd{*fQ}j}"fBRGCcJPF0 5p$MEbVt GC\'[p'jlDu.qR`l2' XFߨX<3=5+ѧfH55TqR% 6661#rMMIׅ@H^ՃH]<A݇%hP/k;ȫ58829=kH(5p @($B/Iů*ձo}_ʗ7[Eᶼn~ct|dt"u` yI#!Ggga>47V=d) MLg  %>x+S?cptzc6 ohʬTZh`6C8F;~4\:׽HWK˫ie z@GCu8|/M$f'[`=OP@H8/Ģh,V߸V_*.0Dzl|\)DP8.Ybvf>X~Ĝ~eUk̴iq4$ߋ7T(I|Z1ׯ^QX+ 48l5oшvzedlBw]fUˎ  jhiCD])i^Bit`*x[Qἱyb<4(z4{|N=\mVFF-jJX14453E}(b!@ "'c^_2ׯ} T]"H&nC0fS+96!knO5u<^+ZڣGQ{G BC/L,;/^qdK&c,|~/H'M&蜪ygΞ5[/utR?awjD ^dō"cW0ԡ١b:dC89P$LJ tl_߀3Y랝áN .8ۇǽX7rX5 omwU͹Jr[.$lt*菽.YRGԡϮh|ٽι)rK%xkp4|>zj W e ,ˆh*W^GXŇ@aÑpJEA'Īp,EH~i4̯̙d\.:mU M>WAR9_u[,d t 0ru|>Fxi7X"V].C!o@A?xSm<5nY ,`r己M^7A*,[eSUW w_Sx2NV;[ S<1R7|e/ !%BpVUz, znA6)]q{ lκ{D-Jك 4AZ.誩x' /:4' >GaR0fm$ P(;Jc}P>4|xꢌ|?6Lk|VwAM{ qNh*W^TaV5Ұ(֥fjEٞ +nԤK^)/_<~}/}sK;[Q9VR,~M4jP1M(}" :N9`~۹/ZxpP4-P(ԶF>D`K6<0 TAr"ORY:jy44x&S4ph&„u0_M012a@d\EPEwiOxaOx ep lg| @-F@=TK <\t-> -,n*Fgl9꬚eе^&!mrVt@tA7x#zԅP.BdF鋺&vSU=@%AE|nء Y|.1R\+h0Za.d>,e"6N5pUQ_jʂXhwUBJ@Xd (AaˢlCGByuDo3u>"ߨ3qۏB*UH֪&L LhkhJ P٪ OAkq\ zMM[GM^ !lDZh^Yx$Hn=YI.aCw1k@5EPZةia5|w U&F v2/=gJ> >v8/~<̫UaK[\FopT`m zòЇ٣ۂ!;A/1,QS)**sI#Z :vlDL5#IQ{"ArJQ^EyS:FfO ͧ%$IFRB#e U4 3=5N!RC9X j W]>`606JC=M nr1<{'ŻvPGwHRnGN\Dz 0$%,Z ]TB Ͳ60oO=h"Qߨp2U(@7Oo ]4t9BRd`# #>\Qd(6@+| JQ4yuH/lm )a意de>3 [@$D!1к5T(+S~zI3QN@:7녣Z l؆P^<]h3@RpRfGEqD]3!hnW#AQ( Kdlh^ (6C^;E)T RD(LqɺMχAi:\~ASJbω.V4ʩB PzyCqnj?0G>ރТ ?y=UA+Abh@Hs`h`әcON93GH4RhP6cWa?^KF;d/!4a!BE>*&I!̼ #6}~N"MRF"ȅ]wfY@iBH.ϜG8Aq;QIe_"$f`Rd_H\0&*F ebT/4x74X ڲy({8[.yRHxzJ4d`*oXsLCW@'eZZ/”,Z!ګhhHht:W$K6675?Љ#B< ]uè jGؙ{t"0fOn0 51#%(ËisG¶јEaʕ r&f JƶrrBD?LJltё U0~{,BHaU袀52D.C2ǼATp:PC`CE1 Mbz|^WFY6/cL,ۤC7.Kg|1"+V95-ϋvQ%"-Xģ7h/,G : UP*Vt\PRtˆdw; B, SA 3&̾ DFY,V %e1^.S #1ELGOxMj,*sG(AE&Dbq`AEMBq 2ÚL 9Vʰ|ШW c!x D2H zDJBj^ĦH @=\1}~^G06t#(/J`R^.O"׀jx)%2 $Ph`0|p ǭY^rV/#29`L;FoYx0_()B2&ݕ*Qi IPM }DJ 'OqjIT7k WŲlYFB.Z+V$A>3#8Lx 3_޳BtM24 R3m@E?- s-RplC[k"`a$˰/t!"pVtz!h9 Nz#4Et P|Lކp,E0M7nu=̕x,j%tR\r<55:R*hnE7RZn05qExkTr]uẠaNg/;HM4Mv|)j1TM ao:^$CU *FP*ͻx0G0#އ=^M dž@L``1o(=.ȃEX8a^S"M![ӤCXjj$ D,`F,% c.T(H{֮;$ )L60]!,_ "c?+FȂx^q!1{UQ 8 q*"Pu1[t֢܀:C1x^`XQb!P £ F1ĊkɈ3N(&Q;@S9'r9XENtD:5U ©T}8"ZYd=$ a9ւ</'!кEˠ(3|8@HH!kz*@phNG``080l13Je߰x2}Hx7G$sP9r M3:8OChg#9O{ 9Y#8^EI(ibᡅ ̀˩] J!0oD!%Dczً~N! "k @"u{o 5Efb IP6q 'q]ኂ->XA8cM#28Rs"Z-v|'rAyvr; YZ8 14 !׷¶ѐDcCC].DȮ)=:׵42Ym ,0Z`)笳^,s[}sqo$qR\ 3 v)'҆eOBcͫ3HUXc jވ@4Emq% yXvIo*GbaJ1_(ah}]'T 2qw:yst8F/%>i IQ=p0jp)I^7#`Uqi>iELe;*>]S+P&!Bp!sv 2<  bbXc/GOlσd2`pDoW$ƠN<揱2k"Gv@8tLK'Tćn- _'}4zWe$!HPlv*;]0x0to^uYXj jFU-pһ; L/VqdGO֋k aP;QMgRksCPnQ[zOxJB/J!0P5'@\Ad)[mD?~8}WBՂ5fkqU-`g}]U3==3N f3|Q u2гs8}mFV}(x g弹X2h$#x,fF6&%3GCQ1DδR%E_ӡny:yEwg@ 577BG+ImU>nIoYvPo@Y4nUQq2B$$=zlcAT1q@M0sxLbk{"A@ $sH5E N:9#ωS8VALGþ85^h.xf4b(ybA4%mqJ8޳!D;\ROwz4UܬM'I׈zA β`1q1+JSyÉ,Cj~[ mᖅ7n WpHr7PIN-j#?( @83V g{> iHp ZaÍVz`<'상,Q =  6iVO& LvXHްO5/"%%XkpWH'a :R#iD >}^(0 Hlc͐ȝWy=8KN=ᰓi0.3vЎ !j>׵brؼiԓ4xG7-ΣX#50k qɛA]^$oq@D)'bG'>Jqn 3͈ j}hbָjK7,knХycx4Mb*Rf)ͥm(L]fX|7K-[ZťT\ 1˝DԪKalX*y}H4 @Mr7j]a!?8{8vps"of2 ÷@tayW!&{v[D׎>Ճ=-j"`1u]~\dg(=Lp~|>ԉ`bE8z?v"XC*G0`$bty7uh"8щXD>bkx˪8=5N`pI∄_TE<-<B2_A B,!\U4!Y&sD4(s h_M'UbщZG,\<,xSjŚ?79TB94VS$ DA|AJZшĆH擠>gX6R'c#VF.kESPY_d/W7 ie?4P>R-P Q~ ,ĤcT u=8P":*W|8" -ŦJ2NP׻syN H_Oi |X3`9N$7V>p=3mj~F@(ELPx%N!$92P[Xh7y eԢPt<.8p|x ,yN,8 =lB E"?z#G "✈!~"qf$ňǐ=98(W1atT.W}9GcQ{00z,7x<x$ L]8RؔH&\DtF&N*(wRZJ<^Tl}>x"}|Pa 1ϙ7)3 D`ܢc7yp~@Y3abY9 aSbr? P{D\NZܝMQAǼ$D- <"M"_QHpD9u\ŗ^޽{O8I&ǎ?X,jh@O"T-3g L3H7 ?+iä̕Xo믽م1(VȊC^˗NOe4z m+n~_H*A܅{)vl;7r` --੨2FX_}pgjj\?8.]FAp#=w\,\(@(jE(R!ٚD C.^)ʐy1At"$Py?Ξ8qv JE8&]9=9{X" =S/\Lg>FGGGFP ^sj)H{L`(5}W|_Gq U)_xͷEKɋU5n AfDtvo;pbCLq\H+p;AEq %(V0okQNN LK==}|:p8@B9U{.>skҳ"5BT"[0ÈRMOO޽C drg6HB@`ʹ|ָ3z|Q4+Z)Lٹ%>4O&u>-D% r6S ˥Vss}z)(ұF/ 0 3€"v,ɉYGѳ#(/?Hׯ྽{gffi(, '`&1LfԄF.P D`~r;_ ?x҅K2Z@sサ{hp8 `X##CCC8T|TU& ;Thr5YB Y;8o-JqdXrU)Ֆdd몥}/?K~Wg,#M6G'ԙL̴=ffܙ\/Y׸- brk=[m9Z')]hJs'V\1 lٺ__re"@sBWϬIc&"`u+f+wf-pվ7rpn>=iv:y4̱|;N2#SNjժ|EB##ZzyTϐnrWG_}퍫Wm.H@\$mX,c~_վ<&JF)tz51jL Vl아,N̤go-$-mo&OB@OƀBbچ,|^PC!!6V:6)x!: BٱWRp8hȎ"",9ee.5\U!l .C RּMBD+s)"GZr܂l ZG)|!Tm@DQa0KԤAt$xb>GR8 %z(ıb3{ ~xv)M&-OINPF]3ᑁAd4Ø~fffrbrzf\*ӿ|U }3Ssٌ!ȦFGFF'29ʊv.;75姦{Ft ݜE#ct.CaA2@`__?U,5ߟG.4Y5t( )  sFq sW^D_A#4DI8~Tt8Pgq,>Ҽ4$a] ԣ+t:;;B(d}z&IXA4jRa* Co_? >?7G3ٹ P(¤ eĩI]]u V]Huf&;8::159Ҡ*|.5+LNLAH0橚.R~ 4e؛|01_Ed6f R:) ( ,HXC@JS0^Af%gg: F0tM33|mKEh``xppjz&+^L.h;ԧR`A)&˃b }XPo38Kc'')2: uzjjdx&==5],`^й;S}lb;kJ CALO;!9 ߑ< HGܳE4\8B)FpalvN<+lF@s =:۩ h9jy.W.K|۶ъo ,hhϦA5Yu{>gO=}_1?qnR1fe&ơ {Eg240'%$$~H~ԯemmh ;ۻ];s4&"SnzKs\̽ʫ/\K$D+F… ᄋً|.3{ھX0N=tСgFB˻~kv%0ux` R +W #ǎ9zt]ػwO:}Ź\Qz#V;_68|ɓ``(۷3 hǏ^;y#:ba6ۻ} P$&FY>vPԍJ2ʶwwLNNNF҇Ϝ>939%#AR;o:sҕ3p`"z<ΣT n\{wݻ:uX;P_o޽z{wU8'N]@(hAy=X,x;>;B -?~# d^Ɔh4 nCϝZ__/Y^̾}{ӧO#/F=SgfhlhB?|豺DTvڥWH$'ǧw7={!?._ GQsW^)ǎds`jմM3/+Uhn%sݿ9x#z=>,r嗒0} O lǏ=|cGBn/^[8ܹΟ=gϞ{%T˗vzر'O{SUO4 Vhmizɓz6zcN@BF:ĉU>_Kλm+W۳{ڂZ|{F>u x.U҆=0-$9jtE=+s-mM|Z {Ɔ+r=:xu?}70/0X2C~ >!kѨt/{>v z`/ >g"kt&O_ಥkb>?uH8J6:ptk[SOOg듑o|r|}sޞ^d*70x|Ͻ>؜ξ[׮\Ǡ+x%O1h[blH$ᕣgj<J57nƋ68'b|Rad#6]J6W>ʕF&0͗JB~jzz \>)jwffzR*T,Wݸtd}8P=AO<-1? =‚c[sN= e|7zWD"162>R1mۼz{A 'ٻP*@(G$UObkR9`F DSTC4ҕCCI8|Ν\._ЩԹs= '$d,6<5#i}|1խC{\>p4J2}ӣ㓕R>^|嚪࠹_{+z|ȷ%YV@J@l';Q,._+;z<񀈜>unz0>>sγg!.3NBMU^!EYJ$1udSsS,_h  )n5|띳gd90;eP+W9v|jz#4{?<=Ѯy_Y,{=:NV޺{zΝ?Fzw)>6]pιXpݻfzo 900tٷ|ul۝Ν8qT*C2#G\r (j߁Tcc :s[;߹>T(\>tc0@P._e C$իWP/'  Ź|/] (JCX[K8pM R8x`~ #Tf{r6)0` PJFg-$P/`ÌAN> /s+(>Μ9s5өӧ09wufjz7߼݃J0L#h(jko%jlL[.?FJ( REq{K^ƞ#`]A`0a (:= U޵kuXFr{+"x<CSUoww! 9=>t6==}BW*e^^ SSSĩT#LhCcM ?v.eeqsD{_v0j#U(0eṯn-->/ahf{o5y+iMSk.#/`ʶD2l_efAz|Ǯ^}'| 6ܳ뀦z~u%rsgN=Ț5kjzzt6ۺ2\pK{ov? z(akp׮]۴i311TOgǒg>@skldd/ g5To_oKKT}ǣ~'mimyϼmv+ ڳKa_}]SNqgSP`>p~T*Auv=ZB˗-[d m[Jx]{{$g>x{{'hߜ8q*ONrGz9 i׌7n&ɚ50$ظq#YOo zjlhZ{YQa4,W( f r-qYijjhnj9~fgy YhoSSKcc}gTtiX.x駟c=}}ާ/]{߳uǶw(?&jڊ5k?vόlv<|굫W'?RQ#g}߼tJ<mS~fvQ-U[0PYbţjhg_jln&GFWHՇ /WhmovUGyخ|/f)ةsq^X3Tm^paÆ O=4Hs0ɉ *݉ aAR)Iۻ񩧟Yz5!Ϟ=`-` 6~Q:t =.5o^5k::;TCjʕ )ˈP)wo݋/ O +tɷznMM-]y=d3`cI 뚛R +:ׯ_U(ҙLXB pE]XWpROOoX>vĻ;ΟwrvA֖Ej[nO&!+|&j(wtwt465zr1q]& L .#QCCģG{뭝{ts ]0P%c,*%5VDڵ[H>y&ItVhI˺Q᤬hV  Ah _|iPFA]ٽ}Kcc`HߣzBAXmҥ0KG.M0f(:¯b~-ć:NO֚h$}h7nN| `͊#榶VEYr%D4TCCʕ+-Bڔx6"tM~/KJ-D ދfb˅l[B uudF2ɍlFtr<!*00lؘ!pWhWSl[j՗~P(iy饗9499sm۶Kgx-rp6m/^kK==}`}<p@h<ƉG\,輋*aTccSӧzr@Aitw=x sF;f)!!@Y[*.ygH]Z-QhSs=Kڷ_=,U([L93Sɕb增[f=G졧 [7J^34 jX|,Y>ބ560D±X_%I) 'C-gؓ?/|177ܳ~;Ϟ={b@sz;7zLz<@,DU=x~h_NÏmD1>|JW^#=KvwNLL>srnذ!Y(`s|+'Ox(N}} ^4jA.dJ͠8`ԡpxݺubl$cF4bqSJQL:ar\1-h ( PG*6Httt˽=I<ׯGAQMpe]qTk1m(xy戦X*A{hO8 banQP#^9Bf@Tף3I+`7ήNXG(aGp8Xn @c;N8{='@A[ZZ1`&ɜ9}&ɮX" }fz:  ^x }ҥ a}ρ ⋱98$+ƙtbX8#Y X駞~'Y ~{ ȡsgOc >DJHH0`l)RkĊܪ?@f7_ #~CTQJĚ[+عɡccܤZ\Z P{WM6mR<9>j./rb6?vb4Ɩ=ӏ ^=sXV<_ϥRuv7==x]c F/Vm7tjvU]Que%rkN]8 z>gvLf 5 ^6p`( IC%ìLL¨xדF'P>ӄ+7WH(hWumyA $3*p7"# *"Ç;3~W~w@0TPZE- /d:$k_7m8|ı ܎cXhb!`MPgK.උmG"'|_~οںi},y{ ==3PjW=c3\ڶt7_:/`<E^5?c'O^ѥK:w?{~?o7mX"څ5Hi2'x7Hs]](}W\" s\TV]B&TAuRRJ;WFv@ 0jZ$J޸q勭m`pk׮r ̨!˦3{ӟLWgPE!<_,ek6?iV,Ө ,xmyф6-b*$J)W!XNNG"a^N`50;2Ncȇy-j^[momm|aS*+4'fqOy8Msf3sT.#qMQ`XRY1#/ƀvGG?<lda!N~4PC'⃪JP)1PmVdnp̯?䎕+E"IETˣsr|nXe]p04Q`y;?ݎGjooY낡 [rλYS6z {޽6m'}iQe_~|ܙ'0܂O_H(t`߁l>.YTPjX6ѿf,!!Dt΢f}*Sf @lTޞ u]zWjiKc6H>O54%R -MpPy3FX{ݡV=SOOMMs;IMHx ѡ|6rҘ4J0uoellg35=.y=Pe0b)4uDS4F/i5>Trs@|ڵ+WLQ Z X6mqA6n\_޷WࣧfӨϜprżv+P!}jϡ4 tVhVzA+=LtĀsZgi  s g:gzvau7or.)|ҍE+Wfׯ9|bff4ѫq Snv] C?_x5 ._ hm͝Ix=J}]]Wg{(陙ZpyPdH_,`V<ߺ˗/d>[mlCSf2;=}ԉR1p[[3hKA43̍O˃Vt| R%K\z>U԰nڪa:qL4- yfNBX1 ,;ۖYȥ)a,tyQg>P)dX"|ŊkׯϤg^{ )x 0 ^m y@1%0Ţm֬ٸ~)euT(553=madPTM; .Z`g:,ya'-\roYD+቉ QNąiGOU[ZZЬ\|l:V291I€Ju~Hl1.H32U] G.Pup < WFF&J|R@ղg;o6774$ct5N#d]uvv_+e^ѣo H!/~rٲ>^ x}|5>2xu}UUngg8o^6 EZ[[~6~<+Vؿdf8M*%88ݨӣ|'" Z~w٥K"rb'|, C*g^Gz/~q8Qwo2yO7DM!?վj]{>crillog+ os-ͭ@ m۽k֬u#!߃.4C~n7x _!X0ڵkQv:z( &#;vlڸ1Y\zuccΝo]x~rr@1k`˯.Bf$SO%Vڋ/x)n*zk/8ݪ;^/|ԧ*2/%ݻwrrr۶mP< .@c+7m{Z<Ԅ\.+HTuh[ss$d8q흻LCc m C@ oÒ]_mhH7W_+ȃLG{r+8%(-!:u P*ʉ܃<8::[oٳgSX?vh Bb< t;:~__}x< jx Q>٧CkBx%K;6>H(BA8PK2U EeB(D|{Ash]O??|;ֵt /[l#'ގ0]*4sԉ|?459C;_ʗWZz*>QA?z`ύkcAӐ@wo.~[;_1qCd-KHHemVn‰.ё|@O&N/o7b(ZgY}وYV\qG%rG<~ۓ'ږZZУx}ff}p#0P$q, O©@lGQG-_ A(KV)j*?aԭ[~jjbffU~'|ju1FA#&Z.Y66:ZZZ킡\K(X .PYR1Cnڼ ܫ>>@>Ӱ|-[V\ 5 ^tI." Ifgf[9(0i0֖d"抐T=5"5PFq5w*P+'EK,?z,Yt_֭C,h/~ N_vjDFPS ݅=܋ԠBKytvu456͛7#)(VH }ZBhˉx wK$ "EWW'P, B;  |7sGG|e۶֬YP)F~;2JCScOäT DXb%p /LM@k֬khjh[x,mmmm]Pc5ȽЍP8`?̡C`'ׯPEvJth"}blhll¶H$T+`PE87g6EUdPM6nڼʕ+;ڛTGSp} l7$\d)1|uފ[~#Ɩk׮bD/j qk׮۸qJށ#P$n媕O?4r}2[t2ٹbY|.*S%Dz#rA,jfcr#0jX*?*]nPw^M\K.LT{G-Kw+0]|Z< o# nIS5Ky+0޼8uar+ DaEB)%I  Y#:HGQo5U TS5uWᙄKRh2Oτ`bR tDNgg >6,BD.]/ BQdNk ) m]X#m q7*wyY@hXhTC ~FGG>n۶  *W\)Q: =@oֈ02llϡ$(>EAD 6jzæ۱YHe4ճ#B7q*EYKteXKCv!SWAhni,!T՜6H;pDXBTּ6mECPZ4*Ay0uzK\f #6w$>% kgC'~*m QZ/wT o$jlN}e"b28! EWqe._0 ]KbAg^ux Er]W{}VBˬʘU,GtNp ސ͆ax"._(?|{`D.Nʣy \)("8 .(bFH")Dt>D㟓yS(Je&N5I4krp|´NE5,jb@Td`Va(P;R/8 p(@u?Yx"ݓxA\` S@qR=$"N0:X}lёQp`Lόcd;xuӠTKԈ @l;e₯Np P |Wvc?g .w3AVC6ƅPX ؘ" LQ[(*Wb|3͑k9^PFd!-oDFN#DP:,-ɨȂrȼS rM.fO b ʈD\kq(+C$8cX|+Jh!J ᗷ̪jJc<1`SUZezE-Ս\䵠OQ#iƉ pJaQNgrzIwcxZO P&NA8Iu2tvn\8du >򆺂asspS``x5bGdHd=Y/Aqvpn> xS P@: N!sl8A,0B?K9DBN""r~nI].`LL@K(Mu}:΢|6/3b>Lvrz@ KgZENʲ@v ~!&‡i༜${jtk3< e@NR10 萮UW F[Qd>t@Hn!E5֌ /Ӂ!W3fa "<Wp9c m1i(/䐘5`|kA; Ya{XI(]R4(+BGHn$;PP $(z_kĚ]QTWLc@@%O$PG ©Ӌs1 ^U(~7'8ݸ M,A*DƮׁx; Z # ҤrpBa0^)<)+WEJ$EOJP -2w2e#۰T(2'ؐPQj;9P1>!69% 2# 7$"@ @ ؜S"Ed$|#,gչlMs2%fȫ@!ܭpҕ~wyn۶mM(7h"S/"T4K,12 > QRHS 7NBIjNe!sYs~8mB`u M١2gəj5R]+jp Fz`烃ՄYa%`l3,/I$J1'>,JDA{ǐ$$$>٩YA7CH.&ݧ Ć /@C`"CI ޟ,s-6h'D],΃,?bgأ"Av.8;%txai!i|>fO1 `(]A0>9{3 lᬣ7l`cZ`Ă0 F_%4^{™!M! [KLClՇfA>©),r.Ыp4+I-i~Xɺ^pgNQk";I9gD@l 6JmlZI|x+G:Nk\#?D<#B:a S ) 9eɽZ g <_N`"B|y}$X,]'-񉄜kmŴ݆T\XO_,·: J )|X˭b1n‚㌂N,jCY> /.mDM;'?c"v}/qaq:0[n xwQ,@$8p֜4'[ ` g>Lv/M- E  ~ǃlth.GZ6?>Fp棗y,ڬ:V2)~ gp.J7v7/"0p3ZxnX`auq_n~9gWBBv>:~ӄE-{m p~љ.Ct:ZxG (xxQQȬis]X> glIG:,O1,S|a|߿zx|o[eٶS7ü-NbNԛ#wjK-BXž}n9&!!#@4!oVtn;1E}"F,ž0b\j+["-, Wq!nd$ʩEmX(\d n]P()eCo&DHN݌ыo[.G,j_XA-w6ðnpvuN"t$E8;EudzWNkCSܪKu^ʁR.\e|r""<9 69tjIL "/^> )a>bͅj]hIyq ! n09ހD|HJ]IdxjE3pErdrË>Ѳ2;%aj;e>گ8b-vi|D.`#|nFAXgqA.fF4p|xa>0ɦ͔o;mspC]H?Vs4mlGX\F/fJb4H%jU!! 0۬G$$$$$> e\?4^z}*J7[W3>E2;JjnWu>$!!!!!!!!!q/ v5'=99 OK W1B^2Wnm;V6'/}ťe~_BBBBBBBBB}Py-7%b^My%_xT2*nUj}C-!!!!!!!!Sii| xKHHHHHHH|׸;]7a(j!!!!!!!!!!q 7PL۪J(!!!!!!!!qg(ˮr%$$$$$$$$>is~~DUBBBBBBBBQU5X#_;*!!!!!!!!!]'Wk%$$$$$$$$$7b-ymYG;>6E!OKmQBBBBBBBB⎐MKHHHHHHHH,h.5JHHHHHHHH|4$khH(!!!!!!!!ѐQBBBBBBBBA ĝƪ5 c%ѮVJig%$$$$$$$$$jUEQ@k%$$$$$$$$$A,Ӳ,EQ Pa$$$$$$$$$4--mmP4M3 cfvFxjvXBBBBBBBBBbrrԩwwS[U;,!!!!!!!!?+n ;uR()nvXBBBBBBBBBv+˪j[ JHHHHHHHHb~nEgO4G4U*sTBBBBBBBBB™etۮv<>ӜoTJR*|_ĝ U]ժ<ܳ/r;KHHHHHHHHH,~eWԅ%$$$$$$$$$+Уh"W%$$$$$$>Y,~X'1~rlضm2BlT}iy<j^inMuJ-"&jRN4JHHHHHHHH]uUmU-H-IF^V[u)|FBBBBBBBBhۼN-!!!!!!!!!qG(.>4YZ2G ;Aq.R݊[pG9(!!!!!!!swSشaWRF sCk;5m7#_(i3EN9rYP(!!!!!!!!!q 7GI%$$$$$$$$Es5JHHHHHHHH|%$$$$$$$$$>JjU-J 摐>ՌX/lpdsL+e1ĭP9+ EUUk%$$$$$$$$$Ay뭷r|WgL9(!!!!!!!!q(SWuܚdz ('`ղOX" kZQBBBBBBBBp_ح Tk²,X;? T6\Mx<{''+]Q*JHHHHHHHHb=+RdҲ GIHHHHHHHHH,@y"^ ;CI듪e-p84L}^9(!!!!!!!!qG(➜عsxFE8}|!s 8ĕ{#.2 d*" GL\q;j&70 9:z1M6Rdq1Qk# : 2M O?DŽ ogP;,XaPsuL9s&CB&6l8w:`D B,[~}4]lUYRpWh*0 wD7_T/:dа*m^vTw؊b&4 =C`$ s4p;"! ˆQk;;o57Lbn2X*,kkGICᤊ,f.~Uͤ}9=n7AB3$딙wE Q#6 yE9{?|Z:X-Gc$B]2!D@ i 06K`j( ӡHVd !!!!b-{yLB#9<(1#5;g'!opl0iX¤,үzѿۿ}7Ϝ>}=>rtrrb6=;=d: n,=zH ;Ȝ|CHq&x5@Z&9^ue$6Rd] SCșt3cQ8>lHK$M'HD d7nٳ333=,}^w_{qM ΐWpSqza ŠY2 v|>d#$'ψ7)jR^P<B jn-P?>ǣ"6IizUS5&a0)|$("*{?8N$}D12"gX&ޜp7x#Δ|N4yO?TCLvQHSNP9*8l&g!Y E'vD8 BMHHv& ŒG"qoQn5(-o_؅܅ `Wr83;51> a=ސϧzwv[碑GP8ݴ&'&ffŢ<^O4mVŹ{Kַ-YQ)gf&rقYU<~Gu[&yXT dj63"ݙW>e}ppplj\|zlѣ=.ͤ m3tk *J񜞙IBntl|fl2CzJ%}f6gӳe:G̦3SS3n<Qa?v"!!!A;l9zPd sղAvܩ֭[WXQ. Cokk lbG;;;qFģnNY==/_ gϞ}ݷsҍX4L}~_X>p /sڷo?i88pP(7 ^z纺ʮ]N<F ;7?p護߫T- _xW^?o/_xBh*\t}?:xxvr.T;zo #^|axt豓Νoػ;.˾;ϿҞݻ{F_ p}|+W/g290՘0M;yX,744Tmܹ3ssw{{׮>ڤ‰D]UCYۖX2ers}o; p4ʪYξnvݻsϮN;iD99TokW^}upp>J*+; Rxܹ_zZ{׏8=ggo^5@0x¥{~ff)/_oCk}c{_xԑcOŬO&jѲ<ۣc镫W_B #x<غek[{ әlSSS ػgϱc#uPM 36nr߽`ӓSxbt@ xW_yFnh$`+:{#7,[53H%!s}owEYz )Pwvv4 wtG1XsO5taqe˳rd" Ϻ&nڵkX ĉ}}T xm ʈֶV0L&jX,Z[[7Nu+V p8?݊K_>tٲUem]PFXŋ`mT'+ŢhR)lڼi}K*!_liGc}x粮u.og{u+ff&?̗xTC"˟:yTxWΝ?[|ࡇ~pӦ˖-9yL6otuu5%-׬Y3>8rgnii\b9"^›쪛kn|\~k/7t: ʸdɒNC7&`R2RD"֯?,~~###455xcSSsSeԳ3ln떭` ?644]Z訯xҪ+ΦTUT!(o]]L$^oth$ -Y|ߊb\~/ P0t;TkjnDuɺM֮[۵di]]4ۼ+/5=qGٟɡgf2}UУp_0>Ujݰa=xUO PiYc._߹s7/uсl.*`z 6%8iƪ?333PI(ºqd=rNcԀ* 7o`6n4MsxdK6¡0k7.^?~gcsv{>!/;vO/{0H> #!!!!>ae|n,v "nfSPx<˿4MZvRa]JmٲV^}…)h>@!šO-CEP)Q55 'ɱBzre˖Q0TiKW4q|Lݣr[q΂.`WW| iqAۖ)ϏR }ภVG`‡"@Nwy@}d$ӊ"DBiJEC0o<7$ ^MaDrTV:=[,&''@/_B] ӪZoUʆa8Ϻ mH^T^zo}gvTB) zTT ɢQp(H ͉L&*V,]"'\.?'׿47|;ffbdTt+WcG6+`fda I==p8<66"VΓN0}> ąOu…J$ <ƍe˖ŷx4 ~j%x2t&='xl!_,X4-eq.U֐/PTAYE\.]Lze 50̩񉹹9F=}Sy׮R( =d3ERpA@U )76>F2l02-ݣ)HW}?}{Q*5t2L  g` OLC?<~&PCgjTYi.₝MbL+* sqP榦׮`ҊAuu._.J_W~{?r kY*$mM_[O}/'x>0;}$$$$$$~~T&x%#Q;C0NJ777GX|!"" 9PӧN]8~.8tp" Q4kZS(+rsK֭[~ޙW9Zۚ‘+ݪ{"G+֭[{)z7Tʗ]PpʕW^rtvl<.a|1oщQ;rx&x}jJVkhP"6 l? d_tq7޺y# /sׯ_tab|3 -.wY8 (rU|ŋ'OT/KW,_ C8-v۩P(tIpщRFfFGŢ T.Z)-ⶫ*_HV;>>JځrjW8d㴥_^z˯䈢jbaƾ޾h4ҐJmg t{Qꦁ]ŶsّO޸q=%bHa>-IRw-׻u肺{|eKD#x<>NpK`sss䂶 ,!:%ofhpȴֶ6Uַݻ7z Ctcǎ[^'_vu$z}gϞyg6n @>^m۶6wbW5ўNliK%_{N8v̩\aUmMM޻wO_P:=˥sپҥK 7447_}'NZG?q2, Q߼n%D Ǐ;{={_|h$\<F %.I^mrbo`8H^Ԩ;22 x@0y<{rr&GCE9t#g.߳gOP󪪲m!cЦP(C=ёH; U~oɒ%˗wRx|ֶkWFr>k_kąes*jnnE2BP{[["+Wʡhg>#;R)?kU+ٲ%Bۊ۽qV6:9(TocƓe˖666V]H4OZdU0J)`1ho)!!!!Ӏd?|kt%wk[K8UT5YϠpkJ\v+*xRچ^h_pׅ[H15| ~n|8"UˎU쪚˭ ꕊ/ACUqٚz,>qwACevM"xF,jLZ bڦnSìFAj8bKԢ>v7ޱkOjn1~ H X8[3 ^UYU9\-d.^_aۆz!)X JP# U-ͽ$^жMQ.í>Hb2*T\ ^gTuGeFF]*aZ@C\.b@]uz?EmiC*Zྫྷ](nM rPCR.]/@(~aP)bIHHHHۨc]?~THz-?L /|! ǐB}°HeSPP [## H|Ɛ䝀(LzT/(#XŐbdqe])>ײ $#?BvNj誇7z}`Z bSvx,ۢt.xI~Q+&*g`̏ HcVGI nٕ2%ÂXl0! Kh&DŽ(z>tx< ^mUE,?Dy w<̜3I$9A%QlJjmzze -JT )A̙@L<'v[s&3GꪧA=Б ?3Å H@Bc:(T+()~ڲ-3@ިCzg.r\ՠPf!k(ta4jtK϶;OtEsMK8 *vf9kzJ\ਸ਼퀉taPCT 0 rZ0U5=Ȫ+T H1M&kBH(d\B'O$$ l h.i4It$L*J1ĬB2Rh5I0'i B2qNIFaH3􀦒7 :@AfI  H["5OO}cI# H52~M󚨙H$,lHDTC"}7ZPg*NӷX= Z6QMqjDxY84#qQ *QЋ8r +iPALЗuHqI!1:1@Ap#Ulе"M#e;<\T2U&B!Y`0u@JwYp4QEd;|X"aqP R.u8ZV.%vC{%$S>I;l;_$>%9 l@n'OKp XTfOyOZy2q 6)E`Y )m&E3R }4f%~b!wdSI.aa.5&÷ALۈ[vD܅k=ߡ&՘痡6ʮOAySX5]5j!P̮C_uCߦw11 0 .{U)sWjF|{ G߸aU̠aWAdafX.Fr,\8j\␽$~,W" %HOr{>81Y6!'9xQ) ,& m(a\kwq50@9B*hb}}}]]]MM Gm^16w3t2VUUQtvzZlIDAT27۶y|ay@ x 0ee.;c梠*t*W@$8ϿѱbŊ˗766 a[\H5 e2l.iFI?:e~T g}*;wN,Y baNxQG̠f%2gK^y{JH 2ͽK˖-FƤ5UBBqxp4lII .\x{yDT%,_9[ 0 `|!.~p+K7l^ ̫Uh$zUGK쑆KבS"!FŢVN6iJ`FH73I.cF餻h gn/!0iD?3Erg,U=[Vo_vm8],mruDYlB'yGeVg!>pX!b8;vرcǎ]a?Eq#n(ѣGKJJbmc҂|E4)- @#sի]q_U嬚X+Ndajs鲥p^JKMUi h⠈gDʝaa*^I'SՌxƑ\2wu5J[~{0 0 s ;v,^ͷHCM Uaa7מzw!^H](}R5#u:cqs'0 0 s%={Xζ ~C\zUl6K8tRbXj.gxDZm |'1._4۲sTx }U@? ҠJ\0 0TD4U]&)SiK67?~Fh&Hr6̀i[)GMCx\6X9~xQQtCKRm*&M3*cnnA,]?Ҩ9Q4MO%uCG␃}hp?c>с@MBOmR;fsVo_߷ݧ~t_-g8aab*򧼄W,4Z8D cAC3 H=}}+_~G{o&9% Ƞ=>?ӿ80ԡaBF6L*f3*A!FǦB۲ېbVKK˙3gmCnҜ%iG~2<0m>tpwwOND`a4LEZ.d;e] s覴@B ۷w]G3L>*T]6޾}Rz.䡧8kjq,0lQ<0 HVCH3`U&( ;U)aq_D. [4#H$"o_]@?9BգiZmM`G{@($lB9|dPz4 銦yX؞AУgHRCPf2dJ7]"l%Z&d.JnayװjDgTJ.|bCFo/ҤeY^*?u\;FTzW^ K5e+猍$O8c{_ݵsШxЂ nsKŗ9fFԱ1(^{y"ԖS 0 0i2qA'gj"~&Pf4 &W;-))I$T'yC1x##GFJ6/oo,++onn GBg=vǟֻFGx 55}}O=܏-[۷C'N*c`ww~'4E(#\ J _c&Q.@~ CbrR I׵[ 1wٖ֭[77/F*M̘eeKJ+*bNt.4Ͷs1qk JKK#Ry}>_z)`m jTVdE 0 0 @!MUR2r3>#OT;ېkab0W[wѣؿsM6&JK몕˺Ȍx:GQ|Uf꺩PNL*%^pK:L&MӌF+Vشi5\sK_; K}A?0 0eG;":dAo(f jZ$~m ?Ӑz7tcMMK:Ꚇ/--(?\k&@O&šnb`0tqzovsYٳЂK,馛>}3g?}-1hPGK 0 ü;1FH<Dتxq+mظ|u][cQ3,+MjVUSatf_/}kqš{キSO=?__0MԴ7>|'x~~ޑNPyLaa//o H9ӌ\ioow]RzrP~yGL&{zeK6&x4[~b1HtpteuUeյҲS'?f׮oUUPNz5=>$t¶*&YͩDj Bgv-+`0 0; IRK=^WW|ŲjJH5\¨Fmddql6C?\lWPd9I| ]hEQ"B^*<-@}a#"TmbwGk;H~x%%9*0 0;AI!DO~k Y@ f2I0l^ژR;~ŠΠ$U~EQ+T Vє%0 0 sѾ>66v`a|16/|?HDD8IsDl?PUZ7ܔQ W[aaVo|Q]}VjkT72%5 @8UHIZ'JfBW -/9#0 0v 7_;u \s-/ iLFN;M (Dd da}'3s5K?䔟ʿyĢ``>)8i0 0 s3]]}g;t]+,\Wb Yb=fH_ҡ=EwH[d~r,$".Q-]H 9"EDžd$o'"L|Eeb/?iN;Pd'7񥓥p "]yYwI&0 0 *CU1~`#?ᆛ|Ci"G˴M;XZZ(+%QQMA:vV|sD?)mB3I丐mha :A9 jCI$yTG:4xY[t)|Q<4;:2![Ů)̂6>)|"YGD>ibT|Q\'͍vbu"cIτoAb‰ PqD|Ԯ2aaC30ĨP84JǎceeX,&t>R;ɡr) ut twv+*U5;gS 8f˷^苌IBqUl!Hgev"ҵ!G]Ri{O!.RG,8HΏ6̐}dyh)U #}*7a)7~y4W;ᑈW_ZpS@%~KtdE1-6gڪ,4'2aGRz'i?{3tk֮.L\CMswi &ϳUUCMS')1%p:t71BhSw=>M!H?a)=XE+b  MPjj"/䄄?򯟾d҃X%ߟOߊGwgHV@D  _wrgE"#O܎"χyvD4 $e6D6N@j~oaY +$o06is21o;&v}:x5k/_aQ^\Qb:b^Qi~K6Mݑ2]phpT$%dex&밯/h.r@ K|'WE|i!3/h/Q| 'LV:$.o睴| pŒ"De`>ܚ_C [!ŸbTlxTَD_ޏ%Y (0 0BԾޡQ %%%u6˲.TMӡԌM=ŲG5 RP 1OQ㺆AH\SWэniLdVM&%NbhHzե]hBGӞ'GkbQ#@qEؙ&/&E.Ś0L,Psb,Z˥HA:Ɍ IF p:t(&d$Ŝ[4<:_Hv2 0LQeu=E~ٲeCo1HH! ;X6wT*v,++;N9T-l{j44$iiةظYB#EE@'jIsUp݀ybjCmbYcYyIH MTo6̟͐(Ժ?$@%A/PCĒ #(UblgZY BDU48ͫ %sGS 2PgVYMJS}mcAPM#eej.s YuB_{ٶ=6652Y0C]VF_`vn@&ۆFF{F:FϏ $ik:;NƱGHCUu<LK+1@D.˱@@U mѴd2e8X"۲[iGwm{XI<TT_koܱcv۷SH-ɠ(=3Ykt,H8 uADaj6Fkkk۵k'VV^893h8ױ6Lvphdәs/=qx2d`0N:}/B! PFFF^TE,`ۻgp0Bdҩ DʅCnh4CoϜ9344Jgz{z PRl2Q(ԃ0Dmб p?V\ 0N=Ǐ/)AKlPccQC|@"e5S2ZDRq 3)aaab`C Fj sj%i0"ȏ\bU1ѨgB5:01͂ɕtlGr`2 :J¥fƈTbu`! bH"fF5AjSl,jLMIص?ʵkGFkj? "ۖ1g[4!RԾZϵBUWAxlJyA/`cǏʖ+b벥K{g'O=?p G(E$cqs^|2WmDžd5kڵǟ0@mmf@,K9%u떟짫VD%%1A&-h,~|lk]}œO>?q#=Dieg^yΎn]%"mSU?ٷo_}}=O$//p!H\۲,H:&G?z۾};om۶P0vÍQSU rC84ۊVИ)M5MC[:0lٺu͛a^p0=/G dFѾHR^$S ^xbaM)SPЉ7ݼaaE 1U|e~QSU#yIHS5rUzUKJRɸ9=IT5F˚HjV+еFd]1M5+= X !!/KBA")6, 4^v~8(߿;eQox֭Rt˙;vm|seUe,gϾW1ZΜm9^_Ը&$3G]FC)4M+--9|@&9z7|uBU"Ç_|{{{i8A'O@/zmp[h^PSL${'z뭃>(5}y! '|O&=܃> /*z0o122dD{_z%MTE,EwF6<z<?#>z!ϞWRG%\ *5NC0 ,bݡ&~Q 3mzyQU;٨/TyT.Z٬9`T(R=W$̀Ɍ$}59NnеGU/E^j,=`+t.-nxW۶m}'b%+75/Yf5Ҳe˖/_rz5ձx|ǎ۷҃qA1ݼt)~dTz|||tt Zz) -_N0R96*>) D}o d]Oܶ~2Dñt*kH%`rV6mii+DayyY]]-,I0ES +VX~ݖ-[ O-[ M3wmۆ"CAJQ8󰡮iF"\dSÚыA/rGGVrŊK>s?ϓhwW3> [+++#'zݙ1IeN岽FecD6dBC'rM7V׾|讻nDJ8 ީg׮Vt6__VY^^Qg}ܙ3-/ׯ߰ac}}]II\p3fiHV.wSg444 xi>/| 6\sȱÇ}tCo}ӟλ֮]vV*^zMz㍭-:϶zq7xcYY۶;vUUWRZhIӄ9o uwmᆊp8|h4|SRU}˖mK!@KK8ccc(x6iZ )~晧~[;:ׄvЇW_[ouÆ7m]߸4޳kwSԺuZ[`쩬:r'O~PwTu\l9c ___#~>U믭[oGo(ݚjӤI`(HQ'!ZX} 0 Lb&':?81*MvƜ\p~Q4U,fS=FuH7'WZ&sj*Zv@tRݑΎN>zD3mgS}'[o9{ٞ{۩k;zu?kA>cEt4//[6 P445#QWǒtҌP`PߩKzN:qxHڳv*EGpεjw[{-۶VVWmzhH$lZ:\0G hS5Ts)I\DE5\6c)egkA u۹k=F!<űd67 u]ؿSO>s`ߑ+]|EiI8 %I(?Mwۃe gOdәp(;`ch=hsm[;m:wMہGIP;vNQݮ[mymgR5-[ּD*#ão'?~7^'Jϟm/ ƫk]F%׃]~]/F^tVZreMM RSSӚ5k,*0` ׏CPYYQZ h4\UUQ__{ك=z,@:B1:AlӘl 0 ``@ђD^/2M)W5k4f;醛pB6跟5Ҫ:霝zDЫ +5Q:T튐SLǬ63}Rϵ#@JSU?lFd,dm]jLE_6mTe!PԜf@# aEoU?_~w_zer)ikt\m mu˿={pѐdx ݆dȇ_[qmlvxhĶÄt! ä7RsGܱk}w;vwpd$ 600uևz?xq)yנoUUU0ftdY+W?@(9F˱gII<_yt:UYVbEB_VKQ(DE,@mu &PX,'"z^g 1l%%D"dwMMʼn;u0T|sZ$0 ,>t$: F4|\ё$Fbʹqf[uM7I?9 R~????;=`p86 2;:7'+**> =rftxSKoe70H>`s6}n3ߣt-@SijZ7m<~[o킺ij`^0!}̮vzdNi~mo$Co&dHð|hh #>9TB ǷrKCCCIҥKmjoFq- /`(*y뭷|_ذ~CXYͦ3i$ #OI a PUt ذj~uF<(IU=66L&Q7x׾/~񋕕޽{QpeRt,daGb)8 -ؤuw%na̻r%# V|Ur5U4# ǡZ:;ZOttl?v|ѮS]ek>eT/ f\ U쟦d/4H(4G7ZZ , @:A"hGv[k,s L\]9HTMׂ==#K~CC^d&c9Qá4(ٰMo<~z{{Sp:Zb!vuoؼk"LS'O﫮P["&F,Pxk^sw;~\GWWO{[;luer\5@N<{+K_`l{p`@g^")lRl$/=84GtOtSN?vlܸᦛn:Gxd.O }0 0Zጼ#9+ 7WȊZGUT@/V4.+m*/),iLT/j 5ꥶpڊJGDZP \- j6Y9ȊP #*3TG:r% ζ on3yO?}{=+!YʪGxwWIO> f[n^lّÇ;600 E^SSu)a^H|E 4uCS\F fBpb˲v?=c㍍ӄ3Tvl,%&@i2 zeGnooJEjk*^xH4zM7֔&J7߸{:y;ly}/bo_+~U9~o~=zHC}}64J6Xt娖-ol3ϺBbH Ej|'?/]N [-r7M eA X }/?|~cǎ>#~K- ӧY#aa.B1hiAi%Gtef+DU ښ:NnQtN:Zѳt n$gr; L9twl8]*YVU$Z FCkVFv.P_ǠN2L4ihh(++,/+<7L%J%%֯Oz BKW^բƒ%M%e#ظq8p$[\YQCF18 GkmJKMsy(|8qMo3и",^m^tk)}}}R`unFG}؉\έ*OWWWUV&B`< è`ػ瀡!@J&S0M]sZTE$hAAHf[( t\/Lgi]uU/)ssnvЏK_KлߚarDyP(DZq((Naw\.%lF|O9Y^5E#`U> Va-ogJfaaI/~˗i1(MTFe纭g6ݦS_co]9KT,)cefNո=.jCIlK9vШcCK5%UPQrrS]MU=4iGzXsU'?dgU ߯ФAqjpyEu,QUU^QQ.&ct 抷GrKW\)daJDvi2;x.r U)&v~("u3@V5\PZٳgp VĢION#?eFL[i4hy՘g*0 üs )h<$Gwt"grQrl%QCw )\QÈ.މ&BL@a>Pt"*F1Lʹ1-\S[(- j+U/BhM"tGp|,ʁ q#7/Eh)bF+)55-I$JJHB5ס_Z^eMh>CsHdt뺔t(!W:Ēt% oFVTTVV&H{<-@ШKyhuQVԏ1 dLE;0ArHC,H&Z~\WulD$R(Nvtt+KTKs#@{.2qjS 0 sLU0&UcU5[Tf҉zq&.3S-RK25N*?ME!4X%i3tαҮꦡt/e:;>yS,#h) ](y6y˜6ptoWHH@qCV"EzUffsa]-R5:NӁVuzusAEӍ\")C#7 ~V!u kd?T划Q6&!NkdOӶ =t GYaPfzA(VOʂҤ?# OQj8 0 ^ܡ^WW|ںZG`b+f,#.pZ3z a.6+XA︨71F/lWɹ*}DPo,5#ZU@ a#G4GsT<[6C>*,AGfI,i͗O(o7B}α;}č B>H{qF%`SS0K&.H_HqHАf@C<Ƕ@q>mȜ_QN$? /UEe_M  tSI UdJ%R=ߟD)+KTUB(}ݲl HR$1%wH^2c K:aYta_{AЛc;M:ƴ'W ޡzzO *.rP]ϰX'GІ$I\ рN"M'&TbkoqD& t>r'iS4Q"^ h4tZ3d$$EP8V'M8?;*b҇4KI!ҡ[B?kA=NyA0H @J'%*'LA""ݰF%$@KP :&L}O" )J[jesbz 2×OPzĞ"eB$R0̛0W~\D _2!(aa.) Cw!cdL10;;>LCkkJ(1tq3$>䣣n@klɒR-ԜEl5 7*![7-C72HȚ#Ey6tSR$.&34n4 41S@ʔk+Jrb%o1hNbb#?Plg1M=/$X? M3ZV"2DLӀ9JdinLDl§&d &F*utX擙"vӟ$SW⊆aa.-4 gAG#?t-UfvH5\\$-֤'_c$=CB_m1b=zP#/*^̔/:| CrMOF.;aA;9c@A[̔jrަ_L{d,64@Xw|J{2߉Yu2 gS2HrI䐠0UD~T"-3X4!ҡ} JSsx}Q~LΏG&N@a؇-͕wLSvku90 0 Ƣi8;_h(xiACMC@G6)4N_~uh$J:!{0ʿ[‰UڜH&V<(320?@V SʀfO  SO2_!i6MJ+`Tu"`UXF"%D9 <lNCb)6ZG ?C2/"q8Dd3!/Sl/%#0 hHu+nbM]hD;zO1U /&H!V="#@@ Nh9۰ɔ/ǜͅV]nNhDeGI""Oy0 0FE,7H2 0 0,nJn\aazK GzcaaaLAoP3 0 0!҇ N̬WaaFٞ>9+ OUaaF|UC_[tLvGT]jQtaaK626xs ⻍~(0 0 LEISЍeaafyJ k-Faaf&:srY,]Faaf6Mٴcgueaahb±T~PC50 0 ,R ЄZ(՜U%@8^ LщNW?-0 0{]FEi>q3!酜p$VW eq Kv| `aafЪk5f,鶢 0 0 G+K-ug\0 0 m~Ztqgaaf=6O'aah5{JN{ w7. bnx$0 0 s5UlT$jYhdaa Zv#UTCU4? C|X2 0 ,&¤OS 5VBT+4O8_,NwPaa潉p#Ye۶%AĚr$"9xust.] 3i0 0 FRRoq e3)ID0 0 \W&ؖm 0 0 s.wmh`0JC} 0 0b &zAdPKgSB: /JaaK.#D.حdm|lgh|<꿢0 0 \}L\;M$&/͵]۲؋E" /oV0 0̻!=L#B/M[}q -glҥL#0 0Մ$=O4ZPZRoT#\qSg0 0 0Ij5$0 0 B h$ > 0 0 LCUǟfaa 6㕚t\qsaaޡNDBc2u]U# aaK6zڴfW;S䡧w}ҪoL0 0 A|fg40 ewc\Hw];gۖs>HP_fa4h3j)(QaaEe_jr?aaJY)j=-CC튛15PUIAaaf6Zo޶h=>aawnQK+vp3 0 0W$ m\vj1O5+d\bV 0 0̕TuF򼩛drhkol[entdorK8,ay1cZ@ Z p8-P?0 0 \*43+ (IX72 0 \j4WvƶӪbkWww3h.'J#gqЖTV&!SU5yE&{ޥej*E5c/\|Kymff1ȟݗTia 莪d4=G*B傻wM0#;`F -63[nA;`F sw.{H]O|f N&<+ǂgF I+fwgFvY'+cV-t>3R_ciEΰ\%;UaaJZSP dss) E\9,꥝}!Vw 0 \ !  :?B>kHUM qx/G(g϶ZU^^^Z ͱ]}J7_Sg HA <7bsA"{:X+rAm^fe<#_b^feś1 ub̼K(eN9 ھόy1/Et u1v=ET4]u#G#HeeE<ѐ 4%QtMB;zz:TWj\jKoh_bkROZ+WQCE:hzqfY1(y1+)od]77g:3/ Q0\bŊ榪JnBFAy. {"Uns혦?| V-?GsV@5n߾sll!IG1C+M-L MiLi"<s_ dg6@/V,1saS' ;޳S {QO*_"[1t2膡k*Oܡ.N, hj2L&UUУHQU捐ss*.>"f2q DS_{< *MPIsyq-9A5I|kPwCn:JHV5XjIFhܧF jaC^YF UL1% <0 seB#+#DNݺ4N9}H%qZ:/G)BSG"˳#e^~(~dCv7O~}"6qޥtīcoĤ]33 ] Ύ'/;V S|oR;@pJ1 CvMMz";#I,b>\)3̻9qў~IP<بo zT5(joZx7k(oy"aI]nւ|! w [@ge_О̎6;΂⩚ABpusD Gl?yy1h9 0;4*ʡqjԪQ y^ܲ+cзp4٬G&`,I%/2/dry7) d NL|䡀 @Jt_>J9%]qOuyx8.~1Nd(]4A91$'zWPU-9l'fErԱÚZ~ d"2fj :KI6É4d؋Bw7UMQC-c)saŏ/wp)\M^M) ԰DX:tF QqP&H~~Lف8P35(d^l\`(8 #pjZV gDf&o0N#L_mY$8Hq2&0 7}M$);_g<)Ɖ'h}"_18a^`?ᦉ|^]6<ڒLuƘ%|Eck(I8lsqs`F{95iYD9K3rG=%[OS0"yoISRʗm0_tsq@wgqbR D@.E"mN1b Gu&oa~E2F~50b1.emR% 7|@`wqÖX-LMtS XpՊ6:!~%z(H'݀12keSRˆy)-YA=5bNQӊT1EͺJŽg8b@-i)OϸM9궪.S l LzL)Fn*\ |҈L)6\Q"n*SbwɹIMSb>P:.7IwpdD"oP: IctrL$? Zqh=ќcip0¢".;4R8EV1iMӏ.j54zE?x"N/ӗᨊ%6=Y,b܏{uID25hd\EQHlG D 1}$)(P0ݸ+nɟ'͟bHdv:Sd.D"8<gb\J"Dn)ĝ.WJ@iO|g<-$e~+ՉXn" _ SbgT 3NY?KYSk2)9*NE+Any(0BDdoxP_ѣ6ݾX6R4UWUp/BqAhN*H? GOjF|`U1H,ߠ.~z'ә e p"+鑧lXd i.&k\y%v.Qz9:8P\: ͎3\jMxQ#5fg2c8\r$Gag|8MFG#+KW6BXMl 8eَL{zFFFi]숽hU= ƒDЎwS#N9+G)zzzFGG3,Va Alqm:@"q &"`e[5EqT^8[B ,"Wap__0نE'B~4т(eT& C,+@ 9L,Tl.+{""p[>7rDRv`0)% ~QU2R(cOw:([ P%d-GV@lT#iWU'ȍQH hRLYP=+pp8JO) 8Jk#mym&|_< QhjBID 'd2T"5JS8E8d NjR`'*:~.~c) Q*8! )QT"N&0DMF W vm臠p"R\mEx+frc؄0mtJѰu'8lkkGw&=08pdk4i SDҳS q&q?0Cd2U)%qjS+D%WCO9׆mx_W !]3,+z?QA)AʔmۻwHn kEִD"WN g r@bBzhnYVV"h"Uٽubae1<< U@4Ī,Lehksh8pꚦm-#hAA qՠ ;`ښ9DSRCUe5Uh"T~ H4t:o<ȣ[K/=;wڳ{ѣGc>jժe˖AsD@ǎ{W2LUuU4&3Ex,'NaX ii9_=ظlrбD!:y,-KTÞ2wJ"y:.Y@qvQ4Fb2I;%_{퍊e˖bQYR: -?Y$,R"M"DL} G[dׅ~5$bRTWHvowꖬCdp|FT U:x|l4yz8L^|'mشP͈ ;!Hi6#BuJ8'6:yd&ASxx7>V^^F!`^0@*E'$IPIRHʡJqAXLk,џ&Sɇ~q\+wwwBa_̉2 '!g#DDe˖ϗ' Jz}"TvBP8Sph**JJJ`-QI1 CyvDB `/M@+0 !jB"5p52%+هpDCZ0VSlE𐑢m#2eG?U#%UKJ鶏o*h7jq 7=whh_9|D, c\(0C`Cp2gÅ9!6Ǧ~[u& |b/g_:těo/}ׯeZ X|%%;kоE^cQC# Kd0L6>JJDY+ 6e4,żRW[{w^{HDh)"AǗL0c'VQ bD "" t`e t1S(5(GQgkDf-j#lH9@#$Z'ȔB(ͽ[Cn ! 6 ʄNn:w3B9+7800G'`YV&řNCU_?Nd})2}Ej :!2 򲐺y?Nv쎫nD`}}'>~[n{wzv\fojj #0zE1`OȌO^EFiN"+}wR]2ee:!!DsT8Vr[ˊ,+f 0SM@2}xh|vmv@Nj/2v敱&OL9wdzv?Ԓ "̹ˌvdҥ{?͛oXrŦM}w}+05'̤ոhxѬJƓ&& sr,RaD@Yh$BR4OR8 W^A2%QDq"C>vOg$JfjJAz"L.ɎQifIG=Faڢd1zdxddu O?Bcc'b t*ʈP%Y9$GtУ PU---PGAv3U $;Ca5AvtvtvvBmә^hqS=ET(ʉj&l'Q$-h"B| lP,!?6t o宻}/wɡښkVTT`쳯ʎ4G"hI;M+G3lٲ}}--g׬yy3Fߟ?ރ꫐]hv97oB!@0!>>}_xw  ڶn˯ڵWĠT܎s =[]gϞ Pqf}n떭HR&H@ac<>qʈzس{P$)++DZrww7z;Yx Rz'pڣ_{ _GBmZHg:Weänf[{oxԙMGd[[ر=Mȷvx?PPih00 )[o!mthP^;;ںMN١% (bܣ}ɖctF^xښZ )#GQ!8- #` 0;qYU9xڿCX\AoA@$ ]/ ^GeʊH4do۶M7%0عW_~mGii)mބ8CL>3sqСC}}}% E\;k+`bh8fA,aS'YY=|dkkG 3gZ0,")t8z``_:t1" D{tS@D:*HLd!ewo;"ݡB\2 RMrBR2 Y.sqs8ٔ`"_FRr^mkz۫Qh>/˺NȐ {jhuMCePT74pNQ\FA.TVV-[4s0ʎ'a5T2m+W t`߾_y$QVS]u$sh̲s0#ӃsF0?d:b$;qx˙s7tMlo=:2u2ΆSN=]==8VZ^P<+o 4޾>H14qD{[^0}}DžAkm%xIIuu5:y^bPO8p qћEXee٩S'ßtvt#< AxJ) w:B;Bu ˖@DPGxjpfTE"!ʾ+ E#GZ7X 'N<(n0ɓDc˗- ;vz'@ifRPٜrO< tV{:)zyrz KV\iee_{5k$%y'Ţ;(˦%=ݽ66OA Z 54 4O@ Cń2QG0W2D FtYWM5mzYۊn@6ZvFQ\C w]ϟ:ø[o$ۃQ=h.0q-˿: X?xI%mO?LWw7zL6s鑑ʚH431ik``$ [\] '%[;XQQSYUkk|Gl4:;zQ'1J5.=%U@,'tL9 D F!qT'2~{fFEFgnxH,Ͳm`Y Z 6OW)\ųU/kRS<֛åǔ!TOsm\PGw|g;mf0rn@M֢*q_K:!Sǒ!J~'DL.gao/| _ʗosg[:) r;똙Tر6n?/oesUE9P#yNePo]faCe"C+D)#sM -[v6A2Zs;C/|_㶛ζvLe|Wn5T@ǂA-XY\G(ew~>_ڕΝ: G/~>:'ZZZzVZO} _ KAUT=J,o|s|7|԰e2i/iXjӧ>ni[ G&X #[ϵ?~ zwU}}޽{! :Ѳ<7ҭ:qijڪk>v]oo5M-{۟'?S|WOWWۙg}$Q{}~閛oڽ`d*y~3߮*:?|Y=Z|卷{>pæ5=z@16ڴ}_.Yo~=_җ/oSgZO{ WG Q3/hD WԼlőcе$*=P[W{}[a5}} @s=_/~3gO l/K|SѤfxcGxiI7lя&J|='8 ӿJwyo=/~-xuZp>/~~xthl{ؘ7__xۺ:LSݲ[ock[}7U圬)E]'3\yh=9Τk}>w?v|mD ʎP.E;BxB s9_?LDlD-GV97=Tw?t-[x՗_|_[Ks͏~ltG[./jZ[ e-kxd .n+Vr=kǮm\{}3u뮡!,͸u սkpZ +F,5ñ5Px3q]?zյuWy뮻**=BMQw{`聟v ǀI7Qo$Рl:$=ؔ>%꼙&̕NKTMwe]=0EЃPh46YF4X+W,V^fMK/OTWk!s%W! QMWYtjG6o|08&T-tAUKuߺꚦ%7 4bP¡≇Bcc]Cs$bh4m`L6mukkj7]zHVׯa0G9XZظ:+߿oUkc% =t  c>ql:֓LY%ĺu6m~ISC40H 8zk׬]z꺺+v5R]Cbll}zI$Ngu!Nήh,D9zv<b==կzG/ҹd:m{FÉ޴vʦM_tK';qNgϞuP[[#GÇY⋌t[MTD KKTI8XV 5˚=sG4^Gζ\6yyv,[溆˫+W]nj1ROלpig5Dp GK zGGk˩˚WuK744z[niem 7nZw-7[ﳧ7/_}jjko%˖g]o|l\&7:v#cÚa:VQiI `8+q̰Q^UbŚ%U_WPfD+kkGӖ? A[fhUW9{ܹTe]v } C8d}db}FhҲmwܶvujaTru-]l5U5獦8ق~_jz񱁁aJq<f`\[*z~D@}9VDYTtU:;d Dw22<]ڸ~ 7/_4:.}Z# aWϐ ˂9EطsM$NK fꡝa.og,cl5WWS . tOmEː~F궪T2M/RnKJk%P2XV-KKJPZ9=Rfl_*7tU>!?4kPPޞVI04P(EEC:Ff  qЈM5kЯOj={vϾ~kIiI:9xЃ>o}?z^Y]SSFa H$,dA54#QM&lpȥ/ C=gΜill\~}sRQJuӦFo"Ζ-IQ4lvp`?ѱ榵׬4 =`  18؆|趡xZ Lt--- & ={gۇ~ %%j %Ң7ہ_:MBZFpLѢ` L4X @dM7U\obdt%JKQ$DsE Z%# 3G  88Mީsr}/??}?y$.p(QҜ1ʘ32C04/03NYzҏe̥xVTT,_lZ`شqeIt,=SO>򆆆+WTGw0M\Y6Ep;:ڏ;_=?-GGS6dh 9+ ځA\ӓTz8p _M{g 8|˖4-1B8=ED/1(;V6XNC׌RCѴe'>Sw 0p4'j9i3m8锕ʩ)Gɸɴ猪gC۳cG^Sm {QmىRK2[NY_x4v\[I͋t'd}F@Ooxb8x4cuŋ'J??'O/~nК^O;J-q-mP|ť;(_!Ĺ=zocW/_ݻw )$eY6AsQaD~U L,i{PfhS ??W___z+>(җu]HPn0f} CZv`,DB5N}[.MQ苏OCW ioU/.ߡ444}ݿW7{E:523u:j(Ij'؂Vj]$]RGo??7c<(l6}̀Цtݥb*GF-i_chǰO^Y#dqȑg[nB*PIFb˶qvథITtxRx2ɢR37p^-2L}UOVt&-n`ǔf5hҏ6ZaE}QoIQ6m~kjk:ZͶs{+Z4\76,{~ƿ7߸qI\RTXAr02(9UU:,O&S鱱jX կ~{ݺuwپ}X&o}w9p@gG'Jiz'8RBq؊Zzd;0"b(\b!).+8PRѴf\7ka81ڻ߶gۖ{{xϾ#9֋|GN~;S={s_sդh<$,1䅡ѷiBSPf $hd 24TaP h0C=] PI"KӧRّჇ AY9 㽮X"cBa\qF 7i޳ DeEEMoo΋]fjȊ2^9>DѨ6ҤFz%BLda24D/GWVV 뎎gϢJQ'$ٸaC*Q>eA4@CĉSݐk8Bi=ouPmQ"0tHUZYYf VX*BNJQtPT`6EWBu F1[g'N@8MSW,_w[]mqGѣy.-ӧNBHlnڵCCCsBI 646467&J*ѶkjDz|cI4vk(MCV(@1St!ђMBL jmAv{ rAITjeU5ƅSL ~ jDC)1:#QO4ClDt28Fcqܹ $Mg~tMM j׮;:`[5*F/_]vXPn5W/Z?{p"& Dy7p) \3D!4.&qY*ffČ FFfAߎSU8[vA  "ڹѣ7x= @Ҳh$ )5VVV#!FЗˢ{+}Sf&8=M ͍Kp)F B#bǛo}/Pчx 6m<|ݻ1A2JrZZZz{1߳gFF0Υmg;x|NcCTNdmkVZuёD6=xʊifv054H*+,/ظiDYͶW7>75r, I4?s.CgD,ZUOOi13=;+]Hiy43;+Fi5Ui+ ᚿ=̮.'著?WWO?o;vHZ:IE%aZEǣK%Df~OMMөcNLMݳ iCCCoaU=0 Ţ/3 sSyinJSd-,1C_ nG};vJAAPx}qqq`nj#2*;FF^/dN J`vHhU*tܷwz??|PGw|󷾾ZZY^O:NOA|&{K$N7==Q]ò7={Oߏ0(ӧ~'?Jg^0dWG8>G/7{* ץOciq*#Z2VAvR' h 8yx7O8ʤqpSb>[Ӊ><w2=x䑅 "9 +2,ZI>$NӇMMMM$Ͽ𹪵N:~׾oz߼t7x`ΝHX7Q'QѷT`>MB@>_ezˉ~իW>SO=N'0ӺZ[='_ CCvsWv6,ՅC=R,!#UCxssSsv?x` J,.^"heeܹ 8CyG2 -ד>}csԎAzL>}Rin~idd'}3Oe>w}c}?~hR=2:l25>(w PdG'Vf\rGy$ڵ0??wY>ЃwCr_p}{sMG՝pWu5|AɓO?v'xՔ\#0Tx\..e˳;Ft5_ݹko0If:=3۷߶ǎ}JG.:<ɶ_⥗X}DB_\XS(d8`&po/d0Sbds33BGs9MV`\1ct#! W/;q|88:'|(v>C}OF,{{;ܹ kjz22wCEG =;w¬vwyT.\h3h333cc| Ę#5Pװѝ7H,oߑc&snМJ؜C!2Ks_FFs,G]_X<{>OCVOv||ʕB'Sܳ#I4Lq]>1 ,޽X蝜:y+WqǟҚoVΜ=w}bŋ'wc,z/+{3Dz}t~pӞo}xk0+]cGt~q໣h&t80t&@uv`I,%^=7jOa }_~HD;˥T;E )X#K>KR1Uq);Hʊ#1[UWY\*73VjYU˫v N~Z5qsLA_@[dL7T!{k~ It=32z% xF_l;$;q?DU3i @/̎x(3%VfQ%. I $_CJT(BF0s#GwjP_rf$կԨ+4Hb\2*96tqej{O<=O4d*nذ-[ Ǧ3+dg;8$C,zb(&]q׾xAc[rR3,R D7ڎsb"2 F:uNP1g#A:8H$lIhoh =O7`0z@a\! C3fJ /3~|gyZZD3PG!k Y]P[A rM# *=`N U4:3qa-4Ӛ}{&;肑Lեs$YL^ϡzn>.KJ dJҪcZLd`% É0njYO F4ė⟋Tތ- h X3o4Г|<6#|_~aCt7t(6S Dj1t"IT2mE4(hL LȹLXOӹ|Tq0?3;337+1S/ۜokfվ=;J _8xQaZy)EIXQÉqP9_~ۦA<5 7 jz9)s$Dj3''I9IF !A"8IlXRSL8>.ʓ+#$uF(r xA*wt}YA}ԧ$i.[{9K/'ڽ{,aiR3CE' GT/EL0 2?Ţ^Gǡ (ƛlBP kH "pQ0lc#)?c(ulkhc&87hQ h?8'7ḣX{/:iBr&v|$/CBI8"Pg)2~$*&5S5]EfpK Hx=]bdPdN6 5f ^hJAH$- UHmԌ0:TY KC-[ȆG rY]-U9ZD+ P qwc֟Z0e+hefŒӻڙrra_;ꁛ^}~u@笋O@g[ gnhRV(Q藛6>ᰖMpcM?ZPdk!k( a(vt*JY4o:D@XÆ)փғF w6`q\0t}~T@b9 1ȉZNka @-jW0յ OXA[ aNb*"\ѕ䉹 F jq!Y)Bkq:RSWxz@kd%&oŗT&'>ʲhJeGT6Z1;maiVWg3g{# _y]oR&ySsM$Z y4#] !Nt DIy?jsmGtM]n~Bo/+%eE8LJˎY Jp1)vNͻ 5t%9y~٠5"jx;!8- Ґ{@x$Ժ E0-(Wtk-`@x[ Qư0G _'4 " T F\>8PfP6.`f/ݺ+-yU# Rqj5  ժUڮ;ϔ*͒ȎϜ2/.qgdi'$/].8rCdž,nOj 4c7oX|ߌ/ ~H8W P`$""niC2;q O5+RLR"K;EVyxk87p$ƃ=^: nt')}Ӂe(]֭&_)x ~K5n磧T[H&n-9" ϗ U㬑"q I#R]qꪻZNeB@؄q*=Eb*;LН/Ԧw <|p}PEDboɣoʹ>Fm >wWY#^mN EjVbra<>ճ? -k4Db4"H$GȤ0pwSWD|t!r05lV.w?8K [g-^E5*7x#|Ե|6[-BoH_a`qh ;?0:0ppϮ];zJzOIvS,2IE^74i5DynPB"pd͠-DrPMzP<)V)I6Lx8 xZ턄BPO'B{5$<;yk!Dbp@#j"paPM4CCH?چ!@xnVHT-D'x:TW\#m $u 6JAل ܍1q=|}^L,a^mz>OM7NDw'ԥ 7^@2tcll졇<ӏ<蘢'L(ss(#)Wl<2Bz"5QX*q!?"DZ1btk=Pl"[?|<AgFhPLH+<)(@j[μXG'܂8u@Bє{0]25#3^1i<{賏&Gˁ0`ߊ&2Vv7pG"d/\ 45D&κ'O8-0A@i#wBAZO Wo#)ZÁ1YQcPDc E=bw lI-[mXul/*>N Q--u4)*] x<(a3ߐ}gzޣ{_j׳:=tfU22oO|6w&NIn j4%ϤP5ZcIICg ܋bb;t˄Npڄ\f&|5G-;.OHl uwX^ D&䮃Zd@% "p kq\>/j{R8JJi( &)k1E.2߅ADZaQOXtEUEőmأږMXIO$"#PZ"Ҵka65.ԺCk[ؒ{!jcؾ@+ݯ_5_fo Sb!F6|!҅? Q #Q sq<-rq萂.!kCYV a҄;BO~'Z( ˜k@Pa!S?BRWlatjC/gM?[.H26!$a/tkC4QBxpl' "2!ܤX'iZi=~'ٮoZ-agho;UOUPHLhBN/4[_Qqsf{4clVn3y@j<^SHA8ȘDˣX'1 S$ݝIW] @iU&nĚH6)-dC 魐pM[C <^xqݘ72d@tX+D08^FDL..( $5Ʌj^⤑S4yQ,GL֯BEs2 TyXp [kdT!Dr-\"_bt=~)w r+^BƇ * ʊA@.4w0X:zu<Ş,۲{Ï=kwi٣!4wCt PC E;: =e J:׹6. bsň4UŸ l;0SQ%:y)$Vmtsp)?.j3}R:t#+R/5-n0HXKa=2q-HN^[#Z0}(gv+HT5@ɵf"NՎ#:`@k䫌Y#Ұ*I>eǓuY@Y#z/@фAa$^ZGhSMP.Jd.dcP]5ĚrmS|WLq([c#xKYlfƱ> Bb|GLoBvQ 0dTu"hO^g%4 VCP;I 2錻A6(§.U,YF4T k9~kmXNQRF- )"5Q ;Fw :hT :^^Fl>_jKнS~cO"͸`dj5E>3GL&8,kHCyMwaXjJՒi#>wk?56[yّ;m5:BX#`; Bߤ{ɮ@qDeo k{֎PD m%?tpف,2o\PLhȈj 1hd'; ^lNHuzDjDT.[\a(teB 7H8 ]POh,TmLk:<iPqYi#F;`X}~舮/9$)y0Ÿjd {p5Y)B3M18B-k;7% 9I S\;vCtƣP(NВ- a16Raާt<^;dKADTo6['awnvjܩMvS4MMtt2PK \k_WM&oC*e&j%ֵ {9lh|!M]OQHHX눯*$Xk!uR/K Zi_[xxNД8kZ:7]Go:"v-֠OW(?$A,"aB=2OЅ: WA<D΄?Z2(,Z}`6uSAN\H#FTk#+D  ӵT4ziTƱ_ګx1U{KlgfVjŭI3K19`-/[D1$%ٗn`dH 1N9Dq,ְJh:8"ȗnppAĝRJm|9{*8F@7/"!@dnpjtppvɝ=>UDuDNxq;-ιP"HԤ /!IlSAz?*D Qn"BhdA~DG&V2 8[@$^. Vw#2#}N0Yi@Ga0g#"T{iiC hX㕋דz.WRI(t; nNODPs$\U/;Gkt3d8F ~1b.ЧFDQl44=Bq.9IN 䆺oD>F9QӸ!2\dnX{ItEI&@1뀵0iO^5K}OV툾#QueU {2O ^;tgˊ |5<ּ!ŋjAA"?u!oJgȚo#vhoqqh\=,5  P Nm͑.tN: _P#Hktǡw,)y*U]5ƈY{.&.|F盈o /.3X#="1D/ MqTrbSfWBE2Rcp򈿐7_=weٹlLA4QA[#aHjrҵl6L$'hܔF{!)}?q: fU/">m,L,1 C6鷆5 ف./o/z5sxLRU(I-L./\i{AL{|w]zXw1ns|=蕼ay3э1!XCHu7>tb4(1~5]#Z\'x4.|~3aV3>7{$ݓU M5Y*5w·ž볳?ڗK*dv*/I?@p"ĹjP/p-d1 Dq`Q!1 ԓz :y!OA\/2U:s3781 "-.d}D:/?xЭ0;6{1ӻT`u'{mDf &Z6ifi}O/тS^xRǗ-Wb*6+E8\X l!PY*-ٌ{ӣȎ|@H2C&t]2V5=J=9EaU),TDz9l֗J12(#q VE")SOF>% Yxoۨ ^甉)~Pz2bp!V!W <9NQ>`z(0@+nH‹62$QSDQ$$j^>u~Z+P&cQw()CCA ]R9>G$ks?}넙̧tqP[Ds"HeƈA"ud5ƽ^ 7 4Y0S[ hbدbꚙ䲙%' {^:SsjsK ˥ã{ ԋވy{'.Tݪ*~`ޱJ}v)zEzSט-撙ʡ]GJ돮h[/-,&rCGvKL J98˗L!0^_H7j5s'/^qwJUؿ7tumhjK̎>+I\w<~zfaEqB{tŠOZ3篏O,޳k`0;9r._Vɛ>ppHչs ՟\(Io.-/Wo̭J~w1jԒ 7gV.}#;RI]=yƩkѳ7ggw2(4猤ݑܵoM[VпcC{ o_199O.ΔlY۵}9C>}aw/~mvhxǣY }PN1F11{>8 Wg4eҩB>0$*]b07X^Z-d{M?wg1={aK7fV󹞥|a+fv 'l2g2ohO6GO8ɫ8T'A0P]4]("gVly|vLg̈́04E]:yH\JՉ\936+f`M0z)b?z!{g'{sciQf0s/w#HwPXTL:gJ:) ̻7?778ɅyaySƊ /TT?ՓY](%2۳~ӶF"7+5UkߨwOL#cpD2_LΖ/}=S}_^`%Ee\{ՉI>:T͢6ڥIRXN5l:-\\-dzUǯpC?uɝw $t;"Eˎ?_jĢ{@kI-KΏ`{3O^=QdyKN]<\!W6_wl r|AWO,A"f\p}rpp$V_zeBԧ^,+& ܥ_}ajXчZ+]y$ldG1_L)va~=wZij˕9R ;{}ZQU -M-W=?g LYCb#FkAPӇ@qX'SЂ JB7L 4QO^]"Cyꙝ/?|ctlZXK]~i@2Q+yR.|g`S~uMLtx _zbĵSfg+M҃ v+˓㕥`faN++KTyfj"TA/>~ O ~}CDgLMU@Z8SK-3<ڛJ("t[/>';:XHTue[c_|ꁇ̈́nRLC'gtsj 7ɛ8ؓ C[<}qT`o=][O<6ZL湺/%ڦ,ISo~ȮrQUrJꌦ|?Gz^N/I-LL. So-g,N>yfBr:>p񁽹ӏk{*5cBbaavuXhi@;iMթa>#5>C~]Bcla1bĈcYyKj@OWAר9[S]Ke eqəYyb9&ueR|_RSt$F7^BǺ$P G{pVկ@AK;bKv%3=(s)fWr T $-v動<$]>/ء4$iL.BFG{BQiHQ啙žtBKOg4I*, ͐}wR2!eSR.MܸpإWTJ1 d*S8y%<Ա,Uix.^sp'WG `5] SJuvO]ʛ'oVJ6*T˲ɯH VJFO4WdzAT]zW7|LUGJL!jO^x^~_z~<]LWƟflanչ8럾2^T3Kt_-K*ʙS`z$S \ZܕbR~_u/_8}?}~EFs)4Uyn3tZ1 Ёn\̪’|?yI 8UۗGv,+KҩJyO`XDr+/_xշ/ړLd'Ų=i[ʾLl_d={恧>xw~xScl>loKK`j)R9m-iȺxU./[USi5Iػ&)zRUTOe*JNoMʴXh6ht y>4Y;i;4Pt^o}*wN;7o~<;9J*>eۖd-c@2ʦѣٓI-H=(-NtɚFư4zBE1u3OȒゼtU/ICKI}= V]zLjYSokt=A |?~乩O>ОePL&%JJE4K$E5١7 Ӄ58pIt ň#F %zϝŷi:L,Za$̜)L30?'~盏_o>/o>܎}b6lHoo5Kz%kRQK0j+TiT][\y7/sǟ|w~kLÔ," ilGo^SF2TْW{Sz1Eo~*.]$Z2lMF΁YdYדI% N+eKU*)*]5.^Flyny CKJƀd)R4q5k{({)$8הD2x?o #j:$P"QgQ T3O/7*UmGU}I$ʁ0cȎ(-6)cvÛt VYx%ױAD&G9:b'U?p _Z׳2ck ei =@LJ##}}מ~t╩r"4C|'`Oׂ)Horɰ: \gYʊbKou}RM{  cvE*WbOVvXBQ+WJx-,eSzrTLCM %g8}=G{fGƌLvJYJ%a3UT$ߗG]}\,'|_)$-V=h"'1uj#F̯ȶc*}\#,97HTV/%<_uUk +r))ͷ-q\LVeA8 9mGA5Y25UYE<o1݊U>8*\ߔoP%;-=7T,PeؙۚN+.ݫuR_+*\̈_3Wef@Ԁ=pxl@1]Ou䔣Īkezqyuz[pE?~ښYfU]*jUnV\ȱ/ 3{+WLPL([i:9j^ =]qmIZUl%Xd& ֊"ۖoY^:~)ЗU+LUMf,Ԭt`*-eg-Ó=8!mC{(ۥ=TNBj9RQ|zuѾ~՚ZKwuj*gS8gd[׳DQ4H[vO%i-{uiy]H#.y]wI Uv+:3xW,K%/j˽ts%w s<2`c:ۙHXss'Ǘ]dꞻ68rQ5(U*J֯I)UmbYXV峋'L)C*=ބWQD꫼Z+^$ϧW3Ъ.cĈ#v[?:WCU_ܵ#?+w_ُ޼|W)ڛx|&K9un|:!d0qJa+^5TR?X4D lOJB sJ'}ҥTȧBR?Íz0T:wr{/]?~b64Nʶ;֌,դgM{X1$#ٳ2}4?sGvp^\?<8y_//ԅS[lծN~n3ɣ@R{KxgO3ل03Uܵs_+_.uE#5QxKK4stkT&c28f |G% &g~ h%zͪy`P_+x~v΃ I<3#A JhWݫ*?o~?W8iL&Z |ZyCJ]Le8sEI2%0ֲ7Ə'|{wz8o¹3??űW=$z CZ0YE%2JZr.=އg\[+'>_\+-L],&Ѽr)};!2`/I lI+FOBv8s"H~c1bPGa&~SG;LRRbiOIo(}]YXYXH}c +H_ʐk /uLk*,egPVQa|v0L*toUqd!QTLsjqqbn>¾HO2E/a3G)I鞤nyJ!ӅBlpY;f2aŸ.W\wt[⤄n`e՟_Y1 l͙(j. Cw|y)p}`Ul/[nKgƔ0?sk7'6%}im8tbi$@M1ҚV|>1<ͤt0UJeszOoĂ+ffwInݓlv+аY%7M!PeۓYCke VdZ0ƹ_̕-Ty^pc34UL*#DJ]]ZRu}ttWMN2ԝc4A!K4๫bzL^)g=t`GZzCiZ&; iߣϫ<ؗ$槮{\Ncc1bSyXF7/Ot`7ޱX qY n.U3"%iI9Ϣ-˞ % ůJ.\d^[Eʊ囊 ݡGde>NW+'^qZG _зg< V1ZE<DT =c~9z0j_I޴N^9“ЧM_R L_1 ݚfLӸl8 VKJLr>=;җ'%\APYd(NREoHO7Wz Tz}-U '2:-iU-+0*][vd%?{㷿tQu^V#hէw0SP4 n&}1`z:]1(>"@èf`mKREuTs[3|p#r e > pTTUe>T ,($ S'+H}`e,RZ(S-*2]L'>sW_smtOBZJB>/Pj0@qTIFCq|eH7b@FcGѬ9ySJc23eձ{LU 9וcQ " J~& ="zV=F1bl+lo[7GwÇ5rTa,{]T 3Z}Ā \lژeXjŴn8`5m td"Vu1U)0% -lzc;#H2MQ]w&)UD)b_}LK߮oiDRAWGgԁe*=b] Z2դ}Ӛ-a0r ,=OQ+p Hb0|4PΊ:mz*ʗ`> Y۔\oޒC\H<VtSsՖ)HUS] z SXUGdBn8'/_Ccci~Mݵ+H4֟++RRKZJW5xrKgfHNUW N1mWNI5>4(IٞdǢE,ףHFd{!iuBO3+$& =NVSђ P\US쪥K!.?-j.]8kUUi/PZ*S>_>ˠʙGWG }i>t:#F16b?rp=}Cd5$v '\QrTS JOk ="9t `7yI u@"FH^7TPZP8 `tIJJ4|boU!TB1efrfB-IsH=Kt58xHtGAeRuc:u}˗?GV:QdHI߿vmДEbdXfڒW-Tɡ $ֳ KbdкZbUJ'{\ N%0tץ*Z9Uïh(pn|JM']+ݜzGR:F=7M"辯B; I܈N*PiײU4}KO=AU?I-xrPaJ&OeIDATZœ@镒(j_uF{D&ZE\ËW_vlߞGe!rs Ue7Z˖pZBѐ6pT+*EdgVX%'Z>D#&=."oIYIRerUKT\RiNRG;O tbĈ#F~=]Q\_UW 1ҲnNu.eh;"_iͅfbGQݧ{?Pf;҂3(SΖ\GUTShl`2AB0Y#x*~nH13ӤdXLA]zK ݘ)cK9ýF(8ȟT >r<[HeDem@>8Ld;B0AM|xz%!;c( r]8 %X{һ\pt"+r0 {Zn Tw.~xq-)`ZRVKsX?hO7 lzj@!-ʅ:PN6Eϯzo4~jIM.Tʹ2|ѡbBJPH,j |GEE:!t"ֈvPKÞCu?#}k77?>`Nf*ʨ4GTA+B\ GAl vCj*Z}.*TP_Ef6jNrฤ 5ױ > +J5s!%0G2#F1*6bsg|Y4pSjEO|8[ B$ s)- -t{~9=JIDzIT.8C-% /-VU 9id"d4JRV~R|s'w`JmC)wRņ{~>B$BEFPK8[*K*t˂"8 t%g#t˟^V^ r=ى BIb`xJHmhEI=jB0qJDQ^Zp®[΃`5ƈ#]1vqfvNV-7=bbb4 ` _wp׍_?oݿZ#\[ .|pyT *  y"xRp'~&C]X2q]WeN0d,I ~j' ~!kbg nYS @.Q^!!QxxH(F"89!#t<9@paz4YGKh(^\ϰ8Ca+IKqxPC' ?['1khH'Ђ}1bؐ5N/h҅bNW?@ G#F1bh X#JtezwcĈ#F1b,̗}&-e. #F1bĈV)<8`Yc1bĈ#FfE@ez($F1bĈ#F&RB5+Y1bĈ#F1._x[ǸO *cĈ#F4Ӱm{avε|zmp<Ĉ#F1bh[-^&_hcĈ#F1b4ٶ-mU\]7&1bĈ#F1ZtEUil1bĈ#F1b4H)Ĉ#F1bĈ \XP MV1bĈ#F5=†zMM׼cbĈ#ƦqP4~rQ+&~f(#]u"~@Ĉ#FAi۶8$OྦHDI&$Ew%19M1bĈiP14fi d;-*`{@HQᮃFeH`TD^Y^ZQڽnORY:GS{oD{^Piʍ2oW\q~z:[9^x4#aC9_ks{!܂ʤ5SmMhJʕ+`a3f*56<00)zrD؏>V55# DlUnJ3\:]1R9nNvcE4:7!,h_)wMF;!uۡv,wzM1qME n0uG2eRNrvB+UY֙+tev;/ xJvܦgEwvjAu%I}<FopdMi3JDʤ=]!k/ܑj|ЦP65H;5F( ƫWK?$2AY,("@&έEz~b ]#++kt% oέ C5U仇[l#Q4HVn9blzo][=ɑh'l7DDZZQ4j45s]DJn@Fv=d1b܋ T񠩾acLgfĬ1F;Պ08 PlzP''ֲm>}2)tWI's+n. .aD]FUMöNH=2vY03¶"  P\potε7c!-6WB(ӊ0^m 䙋%Qd-LgS^ڍXV vлI.ZhE*[pt )j]UME9݊z7{`KVj.aʲz\MMߢ[)`j"' h:ը"&a[0a&#0xEb?`Ҥ۞z^U OkIJ (4FhtLj# j}Yd٧k]nۧonFη%c DNO1ql|?rfL|EES35»df]Y$Z-E4&ۺ*=n&'z;DT)Jp7z\WY{ JE gUq7Ǧ[ņ}{eYdpɭ in^ҪkFkkIDPXn$5J"A.!`bq|NC%N wM너<}m\CGWE AӨi1&6xD+}فd.ɿߩzxy tp:lnqIcՈj^u;NrWTsݡ5t]LB(}6F;K;vgIйAkoKwCwUtgLV]Q<0IpJ 0'_lcRJ~HJG ^:wFHSSjxe>Hvɂ)P9:Р4xz.\8+O] 0] tnv2w C n;ٖ_!6F/g|QfFw$I]aѦʦ|U "3ϭU+܍m:Vn^hoH][s0]dgԹ;lt4BYr$IWg唽RU;@3UyA :-:l7ugݓFBaYc.MA" u 9v1)ts$`O!,pvvqzzzϞ=dU8bclQ%w'k1bDam~3^0Z0&h< ܑUq}GT d}Z` `n66"$oȧ!!>%lزw}_i8h3} #Mdї]I=@7]#7؋V8"LaX :Capgz=$bp%ɶXNmu1bĈq_a 9s&K:#&`I5j"!@f>cL8L7z u/aCxBP&<m<w!ZnZ9jLٱ zk6?ܐK'q7l7b6I 9j* ;Dj{n4ľ·><}:Ximc7 eY#8a䪪BE& [!2<B}P BLp}á@x"9$c"ON‰`^&'z!60}1bĸ@qìd/1LKuf!!!8>[C\M:* 2\7LꆱyșIѫow&;zs>BIi LCO oPI c{:=Iv.PX&ZMi"ռэ #V9KRp4Hd %u :=*&#jbN=b\"2H!]FPkPyqɈNEB8:DczBoW`aofX:&MƗcĈq`$16l˪e%SU{2ݴ}[ JTsXЍTw؊*yn$v&iJ &)C3U|׭ǂ6bnH X\$Dsh]Ijy9=Gt ¦oBHG,Ja P &eq(FT"  Ilt@pn@$SLn0EA^DfhҸIcrճ<߲g+' 6z@T+1bĈ# VE K.\қc؈I>Кc}n|Rll:{,Uu];4j%0yݶ*p$L> Yzk| :*D&xMS`oJAzuw&cl@S/tѭ=$I+K9hU`ۄ6QQBׁ"2VUGer;6"8@ GUU”"F# I+'@d {[˗ggg& HDkFuSyx+tQ{[:v%w;)5 E]*}MԺl=Qduت"v)>D@.U.\J*{ fQaS$$8@smC\W*8iqi¥Kb1NˊeWO>WW6n dPU@ĻZcq5C*qƲl`9@@ k :oqh+ $tnIg=Id{p`('ui\.[e ^a@ BS*-X q(G}'~Ƽq&4MpGZ-B<$oCHE"D!_x#r!?tA=BR-JbgVlfqejKBU= muǸ=6! 3BQ!LaXgt0zaG#FXkD]GEAGa蓂t#[orȡ;qr|rj\?WU E)ѡyfo t\( "x^}W^[\ZF44 SlNBR?KҴ:ʋL=)y\ZuVsW؜ .x????~|ddd߾};v.OLL,,,  ^ B`8!2חk8)p$4PɺL85F@#o6Z[ZT-ߣ6Gb-[{`:Om 1" qt+CwU -=Ry,_]nob_ 7Z608Hxk7n&"Cd}j__TV*'1 *$\jurjĩW__Y-U=6EnH?\bYdlDaREH]qpha~{777_տ?oO=V,ZIH <w԰ѓu~|u4Gk+q+ڔBL*`cS`6?3g3\:N&dB8u@6qobr칳_p@ѴS'VKTJaR\:qKΜ>yI0>giEy PqN/ԃSB ӋF952ܵP_a`ORa &V.,jn_}z+&S]|;FG||?q3_.V{_bib:F"kjbm_֐BW.2+k>b $P<jU Q{+  p]sks+MM|3 ( y@ +//ΙgN{ꕫK&o_և7o<}믖V!T: ~}$8re%K]v~˯={W\3d.Wx3D2 mPdXY_<)"OtF ֈPd9+A_.:@z'mIfm])ڣ2M@c6WDҩ54h. [bc^| DӆݽJbajF{ٶ١ptq֗[KAkt]}'(&"LHMaN-C7/^z\*z )/~ٹO}So-/>W.8qW}ˇz?L| !%oюL :ũ!m3Ƈu `GRinn./E}']ǁ|[]]ޱc;WggO:.8L>_|o}^?'>Cj孷Bs??;/++Rq}s9ė: GG@!nD[uYlWkaHZƸwԶin-M~nu((fQ&awPza[[fU] S"=FBNf)39"ßEl(\SREcYU5 )կNLLٹj:zޅ n޼gݻv%} 9{\.?#{}^{5˲}K#étX,T* fCPw*"k6؜xCߧM0IӴPvׁcttl߾8|LRv:Ё} O> vwk,VWUb6j]-M &D+0,H'5E< ~ `&qVC8Wa+m u ?G1dSظm[ %ap +5 j]ȳ1[a4]||ywBk3O?3~ J.,//L߼qoٟ}  AY y@*&spDUJ|Qዚ)D i p6$}^{-|I}yy7_+ 9{3 ss/rb.:wBǯoܸ:uܹsghRt"Kc#Þ;yLJ7L:I4Qm$hpP3ʴצW;zw"X#|<߫4F4E^mmnSA@ϛVOMbPV-7|?ۿwϙ3zbOOA5V&fdz],Sճg/k,14tk$9dna1n:¿KKK>_'ο)VWB&Lo>jvBWGBm P#l7Ir^B-mNOR F?4#Ώʄ#-eiSGE/"OߙT!} Z Xpח^ ttzzT.gs90 T5ݶʲ^:LtD*[*ezF V>tؓI33=d_Ovo.9՝#t <ǥi)x!KJ_{=+[Ǐ#C׌MժL/..rvסKQjD {Xm{l8LR*3Z7˔xAٓs ܓ2I_tSLִ]ky8_mGѤBo&_x]Z]YqS1A&5cn~ۛNgRS@`D-! L?077N'&8ih9(>m\$g!\+W _M|+QdiƤOK'a캐|g-JX!uv$F xz ]VbWغu:?I5MЕCNJFe\@Ȳ)Jt"kȤ[_k̃,9klTqaWU)e{d4MG'pS# t&9/gggVWW3 D4,v)zkR \dc`Q%oiD8+D=EjI Ի!2" ִ7oLMMݻ7Ao d0)"CKȗ %:mSbש~@JthI]&ʆB$u6bQ# ؕMhtv&u{6iwP:\W_!9-76u;&TpX#E q% ԉKPʞ9X(/v⧯/ӢRu\LXFDX# WbxkP†ԍJkSD$ 2y&$lhBq:S**HOSAu6hHaD}w3MfF{zzzi7!]ˆy)*x|GN ֘L&ۭ5nslBЍpGbMXU(fPuo¦TJ4TQuVrW un#y]þ-7ylRC Lv:GzܨȅfC;ɑ@Yr|taJ#=hs}U~|qК$A_DaNJm$#еeh.rLz,HP8.=E !Ztp7'r4lmv-|[]y4G"R Rhڠ0 !uB Z@T'jll;U[Q_=AS5nA눮,8D[Gm76u;RwِIn\x5|+1P|Gr2S}Y &) q$ù/U=^D2_y]DQ Z LM7 E w\H֞ /B83rN趕n:rL/!kS׭Dnq{!/zgTrղPΚc5PWi?QGhnƂ1b60m\wۇ0E !$b<'ldI{ Cش9A&$j#RfgqPJ7E |Ua b Mc`6uϮz;ڭ h JBPQ+DRy^`YV\^YYϟ%lP(jZ#hM{Kl:e ] 7ʒMvStK#ȿUVZYFJF7je061Hj|%;ݳ w>*~LXa<-lp5iǒP nT$A@oTr:.#I k4"j&*z2 "Q1k At"]}Z!)F. ~ q Ξ=k%H$t]/@1?n1bll#'j'F91mpMFL P3L I jR p ?<>Y:Hb˶.1s5ߥ'Ne jbr# Mi*H4Z V7B)qTiGD0F̩s.a.\k Fn҅V@ ]. ۦjh[i d)cV2"]݅& ۦ'εF b1fۥ1d} 0&D6ؕ1REGٴ!Mˆ4wuse`\nܯ':FSD{I˲Zc>VlГ02rWcAbCHb\~i wZp6YA}[i ҠCՈ.Lו]qElA[F,ZiAc|팈 j4c;m[ 'h\uNiѧ'@P|ѣF&oaDn@\Utt 1[ʵC[ӐDUl$ЙL::TYryqu]oL4`vu5&Qh_.4zB~ :,0&4v1$4nsC܆:p*Jۧ$4[f66n% t.Nֻ{unp:[="[$5z-CR,P#'7f1U"E=d5p4fa rvȉU<`]eվCAmo:2Ecf@<-#9vЫ^b9-lD6F䖢w[@8 t]G Y .B#Cq(C 5ũ,R\[l'S R5MBv9ndaΣ ZCP6,KL7RHB#HodžVMUbGYr{kqԕv@'IG",I ͩȵ Ȯ68ԁzTI^74LitR6F B펛4cи%<9VVJNȝ#2v'm -ѻd87 /%Fqe9k1GIENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/device_manager_uninstall.png000066400000000000000000007422121443134507600263470ustar00rootroot00000000000000PNG  IHDR#IsRGBgAMA a pHYsodIDATx^%uv'ǝٜw  @Dd?ɲ(+آel=g~[)`)Q R$"igfpwjwޝpη=uN:uYNè/j Ep_PB #d"(jMۃ_m}W~\FUdS?ו@sU|b k:~ dssH;-bɚ+YS\YBI`x)st)IL̫s?9 \jˁyxS~ﭷtT$~$?<<5~?H@#Ob&@lhk`}֭db,وL(G[ǎtڵk;;;Q 2h{Cd|F7f39srye?"(}A>WV'EAeپmNJ+`$r` ,D=q!_ymr0!lܸ1ш3hFGFtMGwA4A,\~=<@m߱JN:݈8m6?}4rUC6yG^ec}!("ޞ=ܚ5kL4100(@0z0 #T Q+ܹsЀM|饗xhha< wa W^y1^25O`93s:Hט*+`OQu<)P@uҌ 6fH: \ \FoW\`BԯPkWbZyPRngAb\s@gHLc_l0K]TDQ\Gá0b]+b5XQym;6cy|lxb|,=3=CKzfv.=NLgH ؏k,3.r N Mg-IH8نS,e51b]</^ xW2ؙBn%Dc?5Og[#B$DnA>;\jtnmiXCBp\ŋ"pr ^SSSH#M=Ewp - AE7NQ^Ӑ mЌ`Zy0 f2!at0)8#DFb7Q< FV"bEܦM1樧u 18.664P;kYۜ 1Ia'Ē . Lbg1ݎv""&69@0hu1y9,UFpH RKkcEt޵fT{̀-q*B:K@Ȩ ,YX 81O#FO]]_&d nͮ7z[R uz겝ᰑ6]:j( ?5p`7sQ ā]$b3FsR aR]U@|TDhEJ=keN5ͧsFU?ѥ5CxJ*575X湁?>9P/F/bϸo>xE }'fB0TO1^@LAOQJpFG/"6@pr6IiE\ɳ;a0CNi$80!Io' -x%T HcbnaёDCv0x,ʊF XL6k6"Y, nkĂ|)=;aZ>s`9 ?A,лt FB@&:*]$`cәX^Ge5t9MpmXyvl9`0A3=6#_TI‰dj!ɝ0?FTۣA At< B3,|&<Sx:y-EGh7f Ȅ0!xQćF@)@]͛JCa$Q@`ؙ\^UzsGu45$-Nȣn$3tvn\#n~zM'%Nq@{nѣ{t 6]( 9: 1w^~YW? >5"Ԍ<.R5uYR< jCjNV)3@N}Cp,*`6닰l?p]w݅},G毌R&fMEOۣB.tvbK@m)H6vQt~x؋{xꂵ(o)`Z@V"yKfHXʚ$c@-̢;riV B^p@oCӤJbʠt*`r&`T2lR4(3-=,)i^9b`x05pm|b*,+@d`JHHE`S&A eUOyNߌhw EbM6(eA pLJ\W$=[PFQ"02Al؈  ]d J5 lQP)PA3࣏ "w،5!%DC͆uXXOF` vFpr~(皹I\[h &X 4.Ə_mX4 b& ȼud3EG( ^+Pm1q i)Q;1- ,JXZyZXᚵefPjfꇉCIʜCL֚D)3 y -c۾2x~yƌUF>X><.J(@6j!ͭbYЏZi+3K Ohc4QI7 ':XMb@>V"Qo InH{P Ia׭=. I{x fCU~T*2 ƘNpQYl !r@Y.;4"1eWLx\3~ΧAC9/EuĚ@Е"p\ 3a.\ Х+Lf*'aӀ٩0B?Ҽ <<|ijMdbMM X#x? A(T䭰+Jb6*dS Fz\ 3F@1f;佀s"4z1eF* ~ 4ĭ$dN6:zPub@/*!,V@cUT Z)X B\!ET+ W@ Q@XXP_¡"/ UzTTD,/C`vԼ ǯwbckػoo[{E*>|Qxr?gǃwni Bƃ~2@/ChtL7~ơ?\+oc;f$!yr9 "^kR 9SDry;0ټnꦦyG!*aW"pؚOrx<{m;YߋD Sw3G}5Tfa!d7yѼ0_HbeF4tKA Dm:$$ `6J>*$PL1oPv& (l!&B3ݹh16[^^$K 6RU\-YY`S%u!”%ؕ*,s RJIռbIB!,59``*Gm ?獬6V,'Ґ_k @>i. 3*A"j jُOJkW۬XQgtXz@S+ZĨ!K9+Pdr8ӧ{@͈l;$xX ˸hG.pѲtf3 8`GuXbNЃ/}Kzk2O_я{gui2Ksm\/I ._<3xı\f.Sp8Ft֫N7z.qQh"=!&N:xv^-=/tGJ:y{Ѓ*`6JPo1 "HfNN|>c|<_ba{eA[sBLO\|\ga xLF [)ƱT\Y=P,.yw~f[D_쐫ukK_vٵ+))ɚ@mBsB,(,^JqW]6J)v \_%:iX/􊞒«|J_a?jWx={z̨Ms= nb).1H ؃PU8=M vrvno!4FE(r@: - m!9PKbP={477C'r>Nޜee!`sJ"z2'xK^xyK'^շgŊYĠڮo;-nĤ[ؤ@gj=3H]Ijo3 _ks~3sC LMW&&]/HNjFt^v~#+Pܹdzn%YYئ)hO@gOȪZ'Lzj|xl4gvI#k9n~nt<7x#Qu(T_D\2ʁ l>eR %hx|}?૯) (=wBC3HIN:gg_}ltWid4ѣ믃?937tC @Xmz+z( (LftdǶ=1dG !6N$M"F گ|?zF'I ˚&q2ۃ2k_}MLLM776Mv г3,MȊ+PLU |_?t|r:GXkP5a2Ql,fP!8+ JK!* K!* (YaMDqmuJ!VW@bQh,)e֔BU@BJ>O}߷oϮ]|ɗ_~yϞ=oa/=b6ʅotgQ׭[wM7?wKgs𧞞~m|Wgg[D , H dgY0`X@GX1MzB Ћvc0r #ɉ|=k[YآDkHݝe\|/n R QvBXY QVؙ]uR%hlcp}zD rGy{¨{b.S2$}w 7gΌݲs]_[Ԡ3.R011y…gLLNhF$߱u[gGG"䀞x&nRg&fVoiiݸv X{<~ԥK4C|uMwP.~h v/@+ٻw3t6+kJ`S$/Ooؐ26w<-e S8xK#P׵gP@x64559s_@:388x {) ,{=~#d2˞>}ŋӓD`X³>{M7*2W[J'$Ve7x… ֶV9<*Gy7a-'.DYd1\tfu /Xeٳg:;1>qرǏێӽ#KX(LB57  SOOάoH6ƣ'˲pSG;q?=mi'''G_zʼnT¥s|[~sHKSk/#cT*J"}{\ݿqhsˊ?m;ϏNnݺSC{_{W_߳#߂;ٳ_}ӦM?x% ^}K{18ݻx G3c||k_ڙ3|~ڵ|`Tĥ\qg}pߋ:^QW Q:+DWRDpsC-|+u/Ik]Jo5(uOQgzvfvvBL9z'9C'N=zq3N777#(: Ehdٷol>g %*fptm@X j`ipnʟ8~|||˨lC-cX[쀰ž3G'}?q Qga1z<4^`'Pى,1`h=_}{nƍcǎW^y u\1#ƂT ]ܱ+2{Q:uF[$T t'}٣GB 9QO2- GK/{әJ&cĎm7g?/?Vkiiy3]ݝ`!0$]5ĥK@t 4 _v睷77MIj4۾~> vS5Iفȃ>mV(a"Q}nnnrrD#>~0%ѩɩϣrv˟4`$J01B]X2z;P/!H2⁳3BtMβ ݴ/m]J8k/g׭_ww~޼y /255=FA)R6ˡ&>n.:;vk{Z#:+2(@###\ +Weny3D<O4@@>WN{wƫ/jenm -p?|vkoz=ݙwݶ31+x<^`l'3Ͼҫ{[lii2UŞ{@oHvvwݴfóO=yX~c0g:r:+9枣ǎ>;Ѿr#GDmٲ4#?v؉'֭[6Ǐ?3Ϝ_z͚5O> /NNO@ʕ-P樸VGUsKޅ:!j4f,]YFקC\ Q4mYB!uPU*EiX^E A?ydEc ( {{lժUH$F!'H W C@ȱm_\"?xogS^AV&٣GF _nhlljnFetKùG.ٰwl>k:{m>e.rVYeFbNNM<9491mDugֹцDWW./bc%-͍m?p d݈u5#xCCfc<R'Oh]żL fv/;棉XKKk*L$d <p͚|Odmͺ^StL%V.!ٸiDu\bxo^@`BPc@6?@O ё)*9I[O줶HZC}2pƀ ƞ*$85EU@;@kH*B{^7988d>W^C+RH-:OYcDJQV4s*if,@j=7:EQPXQuQ3\ u0HKڨsyR;c/ ЌS]XRu b &v _ĂDWo5JC5+t DФo&^$m&yMo Q &a])L ˯nDYFYKC~޽%Noft.=4-DX>e-sc(*bPf式 !\ntthtEݪʰf۬s?ṃBx#P* !7oGՉ%tkfo(y@9xA je7X=/_Rk$0C!9:YE4:[jz8ڵkVYn:Ì(~U*!BK!ʖq]N,({:N,Oe,㚨O =y˪,NYie[iT`5 ,9t]>𷚓1veqXF(,)(qCXSQe,c P"mno-.ɒ/XΕP DfW۶kt=^X2BѮsXRyK ~oKt?l55:4»(hZ8f5}j}~ˀxyNee3 aO)D;ťeAY<_J!jSQ\D2?=e7$"H-@Y`-d T]);DWw2 S\2q\yɷ=p>|w5Ȼϸ8~"cM^\3[xsd7X% 5Gl&r~ \h M--T \(L'(3! *({pl*-[?BPx b ;5gޘHoFU NYvś#d @ ;gq!W?D7[ʀ|WN)DYm9Q\DU J!B~ R PqcF@3f@)/ڨQ-@)(,(-VBQDqȽ&3!P Q`Hyfv{"K8vM!:)a@#B|EBT Imk6CO4 .Xkp@k@-tU[L?5G7s7L$ 樴Ύ^HL!GáA&q*>"?OTt4d"tcԍ XX QVDRk R Re\YKscJP=c'Qg (Da9@)D6 o Nf }DLЈ{Fp[ okbD2rJdbͅII=VYamqmHWi:{?=*$4 -ˆ]==\X̮rZ˸>'"4WTQNo /c%N^!2}Jh[?;@ёb*1`䀲@WЃTA ~rRB,jq?DsE窬iJo+(tB&)FQ4=Eht\' kMiny @[֗w pq* 6:eo!D ":\)+tbeB#R"\#U+2i~%!B^Rs~Y z]bLR3c,}*e6EJAeW5P߲,bQIV 8a/hP]<;@(khYߙ_P%7=POԚ53?R.hٖm'&{&(se\š'8w ( N)DE!DCȕx ՗- *([6J!jS Q-2X:\kQfWrbYA!BՄA̞RRG@A[o 1< R.%3#F!DBf7Oa$aϣ{;u]g]A-۶CUv@(tu|4A7Eq~n5&%$ 9'aOV4B,㝍w`l,ߖGdIPw@[li٫6<46gFom7FVJbرc?N8O<93u;>(1чeT4q>Ojѹ ux FӧN=SL6jPRB(6M^|m&4X\'Lqk +W&xnh4b P2>6ҋ/OLI0^x!=ȷ2 ZDsEwi*i.ZHdػez/BxCE &&ߏXĤyO~?NhF"IZu}[BP/j\jG] uQ"ƆP$ usT,GW*uJQ^K=_SB eP܇" b˕҅+_-&4`\j J^mPU[ TqT1//%} W\!fP_4ժaa؟r@oՅD<̓ DN~Φ!4 }ϙ{~SCowo۶!;w05 5$U_ET9P|Y 1u٪"`-e9W9><:5;wr钢yxi _ۣǎe[랖ֈa(l0|>iOr@4$Rxk0ŵ])`P.`g ”{{ۖ-hUMUU8GnRTh$-̫# Am:+KSN]8ˢQ,kt] 9+pf@q.oQ+abwzKζj\%CY[/CpWBe <˞/Rȗe/ M0/e:TBh+C%b)ox -"3l.Ta zZjz ϥB`{55\`Kdr:!BA-7"m GM}bb"PS7ivpl71abO'LNUl|X dZD :veՑ$ eVãz9Ϸ5tm 43v\7﨤3+S􈖥I#߅PنX|.eGuŋX]nm0'ՎjBeo#\PDlP^W[9LUPVK]([}Y { Ll~LOD?Jnޜee]BqLcjcddܹ5kִGQu/"9{&޵{o+kVǵH\3&ö+A~s'_bvz mM?WfjW5kqfƆ淪u]*|'B@ܞESEn (^ԢZPKeҙQ!zu/Dձu =YkٳgOKK `"Uht:/]wۿۯSӁ_~ 'msu|߾33趢p[J c{3;;O:fϝ;>#ci0vAjvv?z6l³>cǎ9somۮBmY_~糟Ǐ8qD&!RK!֖@e$ߥKKD tBU@W@At6:Aԩ(^2n r9#G޽^xgIYcI{W n7t#L)fٶvڿoW>:fqoF UלmtjPqi'a\KK+(˖M?8pll˻^q[[;45H4]tGGGWWW4͟ڶ}Ν;YjW\X1`N0b/zAA*ph44 M=?Lh硓Lfzѣ5Fr _ :HwPZkim!< ^jH.&|__ocgϞžJ5~Ws@Ae>:ĹhtlJٴ,)=O+>Oq(@l>"e(ݰS&=jwtq[ v,Q0]eU %rKױBE)DYDq)D-/5]VZ W@ |mujSQe)2L6ED4G\CU( +̐4z<*#jt:RWw:u4k;Qӄm+\$j}/Pdufzҥ>G{tf#G.OMU&ғ3$鹹SOK/R;HEVtCFWΠЉ It4GAЙgg[ZΜ9Dׯ0pv jFT2 $PAsE)@皚x+dC,3Fr[{Xڮv _M=;ycG_~lg[G"@1f22_]}'^O,#xX2v 5ߓpr,~~Rbn05fKRf+׭hw|v횘^?f(F1[,JQs;MPT+{ٳǞx'bMCjd(54$}Y߿}ӧN}ȃ;vhmmؼysScS>_ٸacSSƞB.f,|I/;q@.;F'q,F7ݴu=him{{{^Zٷswܹs=֭FhFgT@Z}"k|~+ň ^hohiiJ$㐷-wp7lXc?dCL;C U,-T=~Q5TczJ{ Q zBh0{?O>nzP(Xs<]Bߐ&BU@/DeeaEyB/aAԩ N)0͡&*Q6:Aԩ(.([jSQ\ QVQ\":!t-DePB6@Ԅa-"lfKH$!EQN1]V8+H('<g2M(TN9جO^+?"0O~"gj:Gb z [! x?IXS\!kEU$3#,Ĉ2Qf($d&2u-a=FN Pc  eemW@jDq)Dťe(AQk: X 7@mujS *[:FG *T@H3V)DYD@4P By,+ QEGpu B@4P Qu!@`vzMY}<GE Wl~E#C) ~׭$<>D*ՂT-: Xk$IxGb~[(,f)am# rPW0\),$Ck-ܫeBNB /j60S½WKk׼t[ەpoCOa&.Bh&v Rh6Uإ eOmJN.iwm\`8pG lJXk|()ӓ:2*¾&u~ *Ct{)j1Ӏ*t&6>NY+,BH:Dw"No@%?4.oIU SyX\QZ\-cj)f[In MG1 d CгB{TAQى%z)$2~㺶FPմ- TpGVf62hE\+ޥL|] 6n q\c~s%"e 0zBmъ_j:,mj(t(˶^N,R{fU$(ߦ,^1KdsUj\x*r<bK+-^u4%=wyT*ʭV\'˷y5 E@qXPT6 ]U۶=Bl& z #-nnU4\5t l"5zi^Q]PDL?ADT -.4Fĵe]=Ev}E]7H&Y= fnPA 2 4M8J5TESTvr(umNHF EAZĨF.cHlVaw=5ahc{lMaqL{ 7f60Ѷ湎'#YA$ %(hjT%GPW˵}fXV4lN'oqI3=b=N9*1ݵgl6kFLzC ;fOb{>T)dTcȯ\XUPjm . Z8-"jRv|IQi\FH*B_/o\en`w7|3(KSSӊ%s_{ƇK(L’aWFl$FmnfWLnAuECtd%߉FVN2UC%,I=]G$$9l*Ja5X0DžP~,(;^NU#G 5g^^ N$j?`(Z*`'*d+F"B)|f\*@'05 c1cHh84׌[~N U2$hr;J&]t Q'dLjeۋWp.#jjm`7l`iP6t|K2p$(EA ԈP*&K\:X 4b!u|eu[<E5Kҗe{Y/V]?K']?zNAYp -0bF! zC,k(h qQ?r $l4ہ0Ia  EQ QݦAR,'x64v n{NiGJ4ۓ2Xk5-ۆ!Zg!| dyU1APAWƜ"3A,]hvA#|ב[ꊪ{VV~ y+BcLJ>ƸPk!.;2#Gt.7́~"v֗9 "ւ@ʚ_@6ez#SEIr"u4~JLqnd8?b00`x`F{2iTtMt'#A]%O7\N5E>{H,7e5ftO\U Ձ~EU]u(݇%d(1Tt}b>G@5(!E-+B&C$Y%N`ɮ ] &!Sٱ}X YX3(G.BER`SWӡeM> d i`tM"l#w!~׀7 lXE1Tй,׭[ӠJ ]eTB- BW)DYxxݷoa? /DHC~Mt%NWSk>)2{3 t#:Bϑ0vXX!$C_~h$ah, zAg6 p K` m8'>l#9`EWu lܼyskk+WȪݻ_?}\fWX(4N MW׬YG_;J(h"*N:yӺ&C*HiG_d%3>a0G\E8~>tZbP1d)xpe)U,;- eru8Nbh/IĈv2[vn5:SU?oDKy<<~ed`^4d惤ХAD 3gΜ;wnMMMJ3w MцMDNPGh9Ur|7˪YG7<mʫ-yє)2piٖ]DydJJ֗ҹ,չsCsid2H`0|HiF~NIr _Z.GuY(#[Nļ3ڜǥjU 2񪙁X/~En{fL {{sN`'^,ݲ7qÆfQZOߠh+ʲqFx<^' @sZcCêp|O\ފFDDTvt xYa a'\H LeG}"C=ʲ~(F JkˍM+VƢǶJ:UՕ9wY+*-|5}  ϟekMA(Fv/eL_uC_gܤa8S󽩩]vC!Y|O.X4օ@(FG=8؅X"pmnnN.;#+]/|c'N8y3G8u㧏8u}:yO<)*1M<`l| ԭ&ѡi{kkoOHl-L} Bpq~aI7y(=3@lgFK<{vLϓQfb81׳Fg'FG֬HmN&o=Zuqh^>|'O'SϾ'Nǎ4|)H4R`S ~! _tlKKEm置57_j.˗'&R M[1R)=;; F9YгP5:NEWŲC!KQ-?l! _\-4fC ,JX:$Եe:=P/!_j]]W1` ʒ禍d9}Vq@pW^yeٕ}+`2""ԭ5;;"fCkph011cǎ"`tww@ )h =bJ_p-t/_"Hk\tv576[;[ۚ[KVxªsUX &XņPj6uKSx>Cc2:::77F@YY梳h{gCDHuTgiYW^uwh2|C'i+o]Τ27 ;/w斦Ʀs6nfVאݹ#/Gtw H` 8y6]`rو.67#jNvdnegch*҅{d*H5hAF7T갷9Rf"Xdx\86}RT[{z'&3v4wmaMalՈg ggt_ibm7o}[/<v1 LXbct 9AAdAjD@4\Q|CbQx5}Q\P3D T@# TzGUoEAU]F. C[E}سgυAb 8pp}N>=>>u=LK.=/څ&x㍃k$Ip_Z*xi4-`d @2-/NLN\<169:2:6>>69~y|!?c<{D<[W@ pBdN+ܳ l% iB Ɯ?[[[Q.!MMOtv"GZnZ'vRO`Qww芬AK2/fWtͨ$97;sL<:<262>1>:66|y⥑h,1>>F39k֬Gct;L\N42*Y{XSa6>}eTkNA?\ok)A] )'&^}}w&3{~e] R k;Z$Ct0\>=.E6*e,hjkuFǃ)wr2#gLD;}"h8M?z``x9u3 RsOkK _r`ޚYfoyOX*!EQփw 6`+RWB/u)&( V@sʂ@h+`~O-N p?<J@eLJї @I7Xt.y4YN;+{*E14iw+P)XD& MHcl:UL_ށyK]Ksb[V|#۷& -z]k~CVTnŀln +:Ƅ) [`0o-z}$FXe}D2&V Q .!D:#޽{+ ϝj9pɉ##RBn: CYѢrP%N##uP'/z}]'_bCUX0PUȞjd`6Z^·t)3rd.(Zv2ݎ[tRF׊ [lپqy'ւhrCs\mcNAZ:b#`ru$ϱ2;8V6KݜMϲdk.i/n\=g͞y}{.N9^VX%YlXJd4AFGfо^F O?{ښ=YPTcȾ G87ϻ7a;P"/cK]Ͷu_ 2eVa?HF{/sssoH466614tuuuttp=(:~t{U ΆVdh||IR(B&lMMNjR6?y#o\> '@Ѝ,rH$|z%?˿MWbJH@8PH Y,w魭̜~8sitΑoJj7P>=oA{X襰bJh.]*؞] PeTE\AEjq范iϷe=;p3q,.Ы=vt{/f_ UzI=}$h,G"z4DZ,yr [@Y$M 4bHɨlTAH |3oh~VO6a{z'AsYd»Ads윦,f@1!#5swkkǻ7޼1̙LAj빉;nwnko閘>W jL$RMz<\K,M4F"*}QQf}QR&|T/Mk޷?~]HJ0}O>Be51&j063 >eՒHOOcj)$LfXx65i~rqXRN'ŵA)( ((Z)DYmW rQ\Y>Y9!˷l_ktBR)zy6@KXnuz]jdž N4 Q a @ /ˌv5+8mllDE 2^g EjkoFcdʊ\&w¥Vg2iͷu4LP vϜ]O$VʷwtD"tx֑>F9k)lfnzf6MnmnAEMS=/ML5E=s0d[ ϿIr4unА4wlMԩ "o孹-Wi: 'P@˶ϝM5Rɉɉ]6$[Z;@=ydgGg<Kћ]HTe Y{[BɚPw5X:Y{vmuzVt5h[ݱ#O`x0si .bygsXw6FS }z{;{wl߶bmwj8}ڀ>kpy3}=?:+ǒOޛeGjxfr*3<5163oN35[A Yɚsi_ Hgw+mz׻ߍ03;sixXQLQ : \m_PWPfpf /PͥS*j 2c6W7X:3D l 2:^P PMPQEdV`QzDp,-e6~W_moo@o^d T##Ǣ109D|.ԴsU+A5J0ZB]=zڐ1XB,{"H ^r:m[ssowvutwʁhS1O"2?{Eo$_Y #kC-ɍÇa [sKKD3+h2v2XȠ,] 4 cfɩX"w/J?zv΂yMFtBӥK 99-M{zAW S}=xD"sNkSGwg_ks{gϞiil<=9 R2=5Gt6qa-ptvzvc_:73Yr9?W][;B6ta#%}y6s93;<וiIADťhwLM:U#: hskghKwˆn#7馟@1%"ћvrlvn546ɕ}+1ӄ+tvtLkP1DO~^WDIB* (]<P^AeE.)Gj r 0tBͨ]z핽&,Z2KBjF <֟r \¡;%5Q\ .$]1R", U"Rzc^,?69990OY\ۘ|s_ƾΘ5xA:c Tb}}})t-u]sgϞEPvZ5xzz*X`] d2'-Vt755[V.d"֑L$_MMSbLLNX0/8=@~oo/X3ӳi*Klt3Sma UMK#Tt!?S׍DMgvͥM]K&M^XiC d?ogWYHͦ{m6974w5:ڻzV6380{u?irb=# 3Jh|kK+Qpҳ?ɓ';6044|Cusatddr||zrjvj gNMNb 8OEPYP~o1rVgϜfsl4zWtn]uu=ТU^('L{?uUKZ7vyUsT5o o_Occ|;[m ͨsLnuT9k&GLv5]466fY A1`vlXf+u'8XB ϲXO^QFBKy bW2I5GABSQ:e(YT)CU+̨P5$L;kay@4P QV QVQ\Q\Y뜨taMq`WTfF J!* k\oX"Lb-_8D>ѻvЗZ< հt҉'oN/n'vH%B-CżƓO>yH$ |UOҮ"sㆍX"yJ{iD(4oDr=iΨGHϿ[ ?rfr떭s80W^mhpkK2:2MC5WwutD1(ݐ?38xԉ;^7˾If9\FP(nIkp4xDt=`ʒ 91=+BUh;t~䱱qǮIVކ?o֖& ۶m۶566qػIL&sit;|Uj,!&e`LtJLQ5a@ _rnnn*>p%ilb|bb&:hh^iG{y}=mKiԧsnFl>M_QQ7NcݝՔ#k6Ќ~Z!ѥwlz6=;qylvzE1"L3$إL0Eg~5bOalHQ#\uj<:*zrD@Ҍ욑;]?b*G]7F_h(-#ϲtJ13+=P'KvݨŌB_B{] @1,2*l^KRu9hsmWA|(sZ뮂̮˥:Xo,j0աހh*b]RQ~x˖-`؁ah}Q<'βܽ7Hn4O ȥi^+t s6mhh_\rvL"P(h,߰>@!">b <Q>=̹q D%#ȣǶy {c\|`<\$Đ5OMq(r"^T'U="l! \*ņ fe,v!(fޱ%]%lhL7(*H1^ֶd]T$z[NʌlK>l+ =K7V94hƨt Vk!(Ee=BuBPa*Fz1o"HA0"E{fz]hy)B(e RQK j*ij(谣%@53BZ+Q]`AChmݖJLD@[xJ){6߿s]+ʱOpT͎ n.pQ߂ 1դJ7 U@, LgMTGC}DžaFﴅz)!O ,xDnGjh8'j%7L y~?pWD"&0CDZhMӻp<)! f fC#9Qf} -EUuNY6P9`Vs=.l^|H3a%d6, WBa_B5GFgංXCtp.P@[ٜ ZQN8Wr*hJ!W9DiPAs{fKA$P1]0]]t`}Z6 0Kk xyG@ICPPt( WI\MG,?JPKCWG53 .Z(ǂU6WcEqLؾEvV(6@_&F29$<@Wqd!^H*̯gxK#j 1jRkn)IB]Z_"5j0nu3d#ܑ> `5?卺v+"!ӌ\Z J!}N^&R͠QjS.{١4TC]RMAu$0=@~Y"z)XEBS l]c @ԤH{ (8 Q 9Y@EoJk(X6[ r[[+xhǎKj&a&Sd}"%|^[Lgcw B )eqPuDl 6-Bd}ೂhKB[b b1 [SǂdW!Ǩ%I[5l"@݊KRWvaxlkn- Ki0ﳚpX]p걤.oԾwfY?YR,pWC.. x Y3_݌2`WMQͶ%jXfM?sN^%71\j{ڵ=ռS\ $UPcXgQ晢눢D ( *didmY$Ês=RҊg*t+dd eVX5*UP>OVx, iEIVT/DƂ".ā17j䉲a!lDYŚA}+EEF1XL p e4}z  05%BO&;tL+$IZ= ?a>G *CoGpjD͂uYvjB3pfH-M"lraz§;:ɝC^lhͨ6j׀mwPo}[[laߥ+7ډLÅ#o6Mӣ[A-4^j`b^K/9#QTMC|ޞINOO9DTc"]A[I|VP:|B]jӭR0 t R ɸ@La$ a%<k5+ cӰg,HPuBm!b/yooYXKLyy GbͥG}ޫu-l<#ܥ3奨KC]0%%~/bn0  w1f ׾yd"N*j;ꄩ[s:!&#놊 NwPcDY^[cXP|Н_y'~gyᘦ7$MͲL>;V&A/<Yq ])xۆ A,} G,ptco%@8_ 0Pm~ l&UR4y}ɱA50u`zL1:H&y]1. t]v,[p5'p Y,Ec046Z> fALl,_Y0 4XtՎ5Y+)4! -ODK!"qea Z"ú&2#jKo eykʍZw=XɱT6׃7pgE~)͠PB#|Xq))D3Ͽ`02N#W^8wOβvl4}[߾~wٯ|KϼRGO/ܲ!uo~C=wXҧ>4 @<畗7=<|wg֬^$K~zhv럾,G~MGy^KG?{{yQ4g/شvѝܝ7}lÖݔC.RG# j`#ϓ 7jFp>T#j1tJ@K9j3 o-k\=X[J3)Qǖs)gYEQ . ='pIК[nM$HCX}ḙmmk5#4 }:Ÿqr趍 @> MȐd'N8s\zTn1~@ {Ϝ|?>t^lmL?}ꍱdC|aݯwv=Go<'oE1 Bw>y&zg;:23tm?s]ԩs8oZ7ԟy͛C=Ѓ7߲UU~?yĩ}+:Μ>D{?>g}*ЩPl%WG+p5lڍZ(\ 3K K9nI}CQ7n^UxKj)Ss(r">FU> /syloooEPf7(^F. 8gy& : ΂!؎-+tE SU5 lK3}a8 #` 9wU"-Mz~ L"w\DQqFTjmiZջDmu____4b-*tizz2w}rk[k{2ٟ}s蠦3=ȓ;Q/[o/|ώ_}}?S@7~n~m삔oz2lZv]Ss*;zw><Fw]__zEqe3`Z$AysW_}=8LvkyǏYhU mIz닡:HQM$?aDcD"+Xy &eYUSоhµTj5G3, amρɺaN9vM(R~>gsY] R 39hÌAVmnnE~g>q/_Q =ft |B= d^vmS'z!ɷXLhigc,<11>==mf[{$9)0`u@Зl6tO ҉y,oX21MQT!<'NI"#h@հF,޿?Xˮ]Ο;?99w}{{a @mwrj0D[oذ)K8S,J*">tС`Duۉd#yg#bH\+c=|짻ooS'a ,a-;c!~bnT*NO77[mG#}߽yÏ?9t<GA!~o_MLttv~3Yf͑#G~3I"+cv3_W{G :$]{ߧ?U^g(Oϥe*MA&_iooEFciTQUz$XSA #U3콽Il&O>y_վ{mյix<.D"'~W>N芕o8ZZZm['կvmMD+)0p$G9OgEϚ5/? b4ɲr ØmMlDLrohCeΒ-n [Q.磊tPM}\-<^ Q\Q\ Q0]e U QlU1O8AdUG{vDž9D:L&tcBS^|ECq1^')В,W<@3?3{yꩧP=yM7݄ZqӦ&M;;;6[eU۶nkLs歽}Ϩy.G=U|^̤ϝ?MM-S)26266>O$&HLD#Q6;l:Q.'֭ݼy |ٶl]-+ocۏ>ƛ{/nM&练CCCggM[merr v&Y$}/M:Qv[omhp…EoSU̙SӨ4o NU<伌0edvve U Q0]eXF^x7 !P\[n> V9+54r`3te)MnW+VwxkkK$ FB׳2,:}(ض791sv?WY=b?pc}?SbPh4j`0 +y.a TQl6cF:}<9kB!"s3~s3&&[(9Άynw{f;sW|[S]ԩS]߭VFg'O?ܴq֭`1Ӯ`+XJ_EW._*h .M6-oG͛7A\Ce \b{bKνqY1%疖fM~ +VgDՠ,֭uluߖD)o96b{i+mo߾sl۲ .hZ[gg}2ЮkDOα?S淬[ۻn\^Wj͚^s=-L:|޽v|+5mkдȪU]G⊭[nKӓiX%u656h05k֢Uf2|v&(GNٽ=/W_k;{`Y=xvw9hJҐAKRi$_0qʹKĖ .DWP: -!+丸j_jԛlW]JV|)ck:R5;v0geoR {oUE O5 ޲eS,w7\ϳ1ԥnȅ ݻ}gۯjz%Z{NZam)YPoze [h] gJwy/Y&/ɂyg8Ez^viA0yk؎%jQݦ=eS<zD M"qmqDSTx:i:9d薦)Af-*XyY$1⹒莧KC٬HtWpQQEseB%)E\ ,(gs(Txځף$*zV#j!@BʪQf'Jm,Okw,B(L\PvjJUJr:X(Ӆ@ɕzEjBky# /|oDU#͂{,k @$Fw-[ =}с< ٚPi8r{~fw뮣@ZJ __rh+}Qa/ и`7M8U! B,γ XJŋ.왖Auc -;L,e߉9O[s#+C۟pNEbڀOTD0A((ľ,$Jv5 Dނ9hKzϿPQp#*H*% 1DP+C*ZZy@Pu .DW AtuT O!хVp9RqC A*D@p ^",ïf|βhA3D":q ##N1t# (yy%́F?( Ȋ0|"A.rL&w(?"xڦ>Ȳ) <8RD\۔_qQ@@ ApT-vLӀ&V| 88AиmIXj^CvE AA` W> ͈#D"QQSgf9MOύ?z߿'gNOf\C]E$iĶi , G] Nj4;#Ȫbx28o18tLPh߿,YCDM$#Z<<4TĬ烵RЙf1w:ׂEd|e|\21se5w, ˭A ?f6 fk xS@11 8s4mďL޵73}#>sC={u׏ß y]ҪXClryl2A!TU,3ηn۾tr|QZH"6sR 7&?GLNy%FlxISU͹dD*ɋ"x7tvtrٌ Jk`:î,+,#o8^,iKvhM.m'uƑcU]FZ tdWYAt P :yJDW OuT+AA[" 2C`-4"}YQe1қ֮jnidz >4͢(×Juٙ2D*fو" yNes\3StnҊ3^f"=I ЍdZ~# ͍-DJMmA}MNLjo?vfWߴ~#?}_>-W3<}?~?y{y۹^?+;l2c⎟<83zW P/˟'/%˿?o;,Qډv_-R LtQ¿_2K*uAkY+$, _ A\u"H z\@|0Ɂa[M+D: aXX9DE A?ij1+߿CQUP3qMOsspe7}^_ֲܱZs<555== pIEPH꺑w`O߼N?W^lR]W%B4S+%G%J2QA]jY0 VIjh%֬׮\?XXWBP^ݻw7663̴6F%A4-ϥghe>m3XN޴rO=s=ēOw_WOdJ*%$Ikmc "uoC]w̴TD9v?bdldbj՚m u'hwُ͜g<-Z>~kў8ݻvC{#B,m?p3d,rA' 8bGdRQEڡ&Yؓ'MU%QL{jjsGsƆܤ܃{=tۮǓ'ҷ8Υ8IQxInhjikk]k|b_ǿ/p5m͙˙`^|s==],o|k]7b.`+X ^AgV@$t!Yf2 ;˂( =+Ξ=;99 u -*'n碄HDYm̴q鱡su[W^H8}\sl>xffΜ9w̖-SŢg:qIN!8;0lYVGs9Λ̹}ذ%ʵ뷭7|/}庫."mg+zk mp8F ;"P4LE]zw%v)+ g Op$x-B\ 缬IED*,vυ}ѲnQdYt>s,5wi=bn7~7(I%5B%^<*eyNj %)_g,%W_z,k\ e/pՀ_RAKҟ+ /\ae-X6ɓ',"}|+}KQHDsW<Ͳpo\5Z%g=kϬgt>9rWhljhkkc] ŲeN ٴekYhr3QxN@^4?'FTåU-4%hnҞOOYU+޸}kLIl@LNT8\5Qz4aC$o2D8  #/~֫޺cs"Y/$O"dl˳-ǕEH}\jQ,C$F:Dt僅0- 30:PI@_1UdQ厥VAt XO,F@E.=9|z V9-A}ٖ(ND`X,z8;"ӡdɄwV(F/5B6"հ6jhK|*X";O@3](֬`ԩl\ <^ĉPEAyA2ٜ\cc3 D[Çn۷oe 4~F9 APpF/Ѕ@9[QUom2*ekΫnP{5mǕ|HꙈ"B,*$ (plEfft79!Oh؉O0pQ9ȃd8)˒ cLƦ P"rt@C3E=;⁢KĭBo`+Ώ/n%`0u\Ǐ3tssSlXpusT y^R$]Ic)EH4ZZjN͍w䤦I.Ƶ㆚TϕeA<>Wy,3w7{ēyV 8B5.'\_A) |O`KeqDaőch䝵*Ü\GYbO+<`+XA-A?w!~9U5Mulĉ#_??ۀ.A[`J[WdYi}=Nry;gDD3DKP\Ut2ve˕󶔵圧,W</r#|9w|6c;(Atlw=yOpmE-( ^XG-5.( 3Ԍ^ѫl/ɧ,z⛅lHZy)d>D@V Q6R`#EJD"[4q( Y!K!D9!+?! .DR#Цe磖 ^#Г?P RPv٬ 7mo}oolH_6 "l:{رci,/H(ҐNy.㲬&)8 J.Hʖ,=/x+QAUdMqKI5d5z?RɆ~͛7D;Z777DcϞH%9‰'20nk9 c| dIisiOMb1g2lDzL&u\  eZDo=>lz5I)X Σ&Kh"%V+{|Hy"p_w9 q=Odd޸:ؗ9Ar}6'~ >a`h&J dR'J:' eCjcFx %1˹`3K lOV54EmriC|"6[ߤ +}Ȯ_߽':P~߻G/ߞӧgK_'Ngw5=mil|{Y^طߎ:#?cg\gg׾_}{ۻ׾oDU$2|KuԴeP!{)]e+eHH%.G(R;;/k2`MոuemGi9G#QCؓO=9<2|466H yPa0~AAy" gGeY ֭4mbbbp`pbtLЊD!Oly̻Ɣ>+,.kyJUDq#.rr (D$>ZTc)MI f_Wÿo|l@W_O;s?淾944w$h?g>M5ep[[n?%R/WpD2}n[jj*d[!ܥg1+8",.\ n+X 7{| ,\ yN烞h0O$1-S$YQN>=69>53=vne 0I>`-drjbrdx4=L>#Ǚ{uȳE8+MόO'snlliK#E$!%2s33ci#?#)rv3s# 뮩K5Y׳u{O67X ;^u RWm߶yHDu]w]`s===m\ WP)Y"a.  }k_?S<-)J$mmkkmmEJ۱,-󍵂(ۡW`i[M)\JVgqӲ"7 O>K$iX%3.~OwBeY߾NR,[e'x4"BLeL+;0?g[giuTt6''GgѓQ/#8y2Lh]cW'MNNeYF1̤'&''TEyeh{~$K +\.kjjjrjJ$$A䲴uZ,ķ/| x;jeZ!FF݂`A%x%\;A |.DK-Lbq% U O `/G"s A-% O=udHo_3c.οޅo]Ωf55ڒjU^a Ca9]v$]޳[%'ahhYm1I353iohM^ݜJi;o[^"ؽg3ϝ<786:295wht'~u6Z՛HF{WcڃܷaTgwܙ$I#7^*E?r'N۷oՆu]]}GO  4>4|#0Аc;zRɤ,K="hZ `cM1.dBI!dTU<|#NjR%A8&vBZ#drT{."FXTx-+HRɗ2 pD^4駟"Z$ F{veu\yev-^4_@J|?"=ݝE A^O{oZccڎT1ҖT;izS W~꭫{RQ* Dukof&_ܴyړ'!${˛b<^<綶578 Y}Z_-=]y]«׬۴ysWWws}S~-ݲy˦Ϟ;726:NRTksKg{{*'B GUl"6)o"WL;DI_u*\H{ i^,_[.۱5zYGg|)IuK+Sz研~j\(u!W ~vcr X@5ż:\UB0Kh\s͝Ϲv u Vpcbb- wH.?~X[[:x\k}coӴni˖Mh 1ƢDH/lG* +ZPgς@tutD4}LYdSHpmω3#w=K4ΓBijM+K2d|Ĺ m(^5x(@8WmB}Qh Poʔ8_G`)R-bXca\~j\R]z |o<I桒ƶPc +N.$#(7Vn4[bz{]YҢl-|-9Ue!3"wq5WTWWʒ֛6C0%PŇ?MiОA4!!xeZCCâг!^=l%I6 HJ&YRϕ$M=i,"fud=TLZhq0'qq3.qYE1A9yOwm'W|Y?'fP;?|H9HdMt9Gk=akY$+C+a($"VJT|ҢR3b-H)q=ǣEg:yFނ1O2dSƫVmyڭ^M׵lnU;Ug6H$E8Mq\ײ,IQXDA2HYlAvD*K T🧥D$QDuIQ󙌢R*Kl3g( Q9[MdEBQ+Ne% 4N& B$:l" <=4#vkSSl`:ő"]VPS+Hp#̋S&f?;/zf[l `)/CE<^(۸~At/R5@P"h iu,BqK@t sАjRkyjBqAKǖj5c.ᾟ< G6PҷzNgE:W?T܅#. VDD,zLJmBۡHc@UeQRYb66+R?iQ1b1"g"'}?{kn^ݻ]zC>wẍ7vuvo۶_}_]tް eҢzw> 7۰qM_?sfjj 4ug?ҋ/ tH`@IB>gOr6~{׬YU׽[Ʃ'h:dsu\)Jr{zh||jMUQ $Q9TŢŐ '4(+X V},F.0,H|N>!q~ P= &1 #eA9?r .9xßx5JB̴$8A<8jU5I-lnFǵP; oxoݺĉC-[~~l;^w{V%ʉ"?z׻*6ןٺu>_EPdN*6::87BfEuE!i[_^}bv,Ax>PٶȎp.<G%8N<G M8mP؟Y=Dg1̀ε҂ւ-̤%T㥐\LSm,,zqte֨ ѣǏn޲,*AԔA6&C8Ug\d|b'0]6q"(6995>>ddΝ=Cn鈨\ZD(RWtx)$E5^=j22^" ]#Ύl/ =ZV1 *J0WӴh4r,{'xbӦM}}},eQ|@Y%,B211uIIR) r`rT!U78rT$K8r#kNfL\BR~mo[Nvzr'p A$W(g]fukKPw옙qeE佈$H.M}֭lkjmsOԑcG;~rݨ“O>944=z^ַc?sM-u?{gH%ԈpYߐlij3'+Z 䮻?ww6chhj|go?bѨ,/>;<{,W~v?~а1L1F}uh ˷"Q@H^Y;_,^ e"y[kբu ZUp`THZr\< )U z,[|׾c<<J˂\vhppr|^47 YdwfmGܬnMfu,QPUE5c12\>pu >x4iF$ˊHD)rSSaM-m~rOm' (fIDAQ]Ӵ__z߭( lַٳ߿nJ N~o}ۛSI86ggz>O7+vIg2lv}}k[Z@9s挮늪 {6D^gjQ [e&\XF%/њ!۲0삵iz0 vV*MgHX #YM-p w\<\ɹQ /=2tf,cN .ir4jԷtG7$AhnÖ S855-;ys2@Df@#{G  LF(l+FfFQ" ɔ 2Czx{{{8G?7-AN5,<.ѶyʏO8xuEEF?_y啷0WlߞL$dER٬H$ozӛ>WgyӦ??^nO=NLXcLVr51kDO=1BEq/=.ϭD-܋$WPs-WYu–"_EEƠAEU|W=2Vvի?0`eb '`mzlMBQU-͊:KeDネwdTAj4rĉ'.k?==tt:NOfƇgqSgFX~Mq9*yb 4e9QٳE >v8R]}019sζs=z㣿wo}ScK@[]]KcJG?>}ciǺ5^5<8891?:x Wcccwwmutt(2<< />}YSNzDٖ??yđcL˹u]VG9|GX)'xo~s{[m;wܴq#§3dsH4 ǏpÏ ZFjh7*fc̔SxF[."D0bPNzd7H)p, [C_V:" npWJC&j C!ҕΡ\PT.XAPgdKqW)q.##(I1iC$X~[Wd3( [ps,\Odet:}鑑ZDܚH$1 AHR1r:,dcTsjq1W 9U'nz[c[vGmeW8Nv8dhQffnU7dAUeTRxv֖HDE!!|UGg}")ETñst#o^$Aljnbuuw67$ ^zƍ---){=ojnljj#(I ML%7wu@æx, }%RUuڵ6mKMS5&lףض,plWrcPL@ /-ܐ{HRr(R+J\W%j6XxA%C B\vj/E \1/#w%dTJJ.w磒eӗJ KsY2iYe !fc91  ˤQjw%jx.ETD{ڵ+]@9GR8Q]/#pY=;01|t遣>)?!DzcgטLfmLq&n8^QĈXt{@h$H # } xAV#%[/@X_AD0|lA2YM.AG:Hm@+f!2 [&"=p=?AITZLU0;Hbiz' X8;yeT?]*KP6pj"[ Va; 6;L,ujeY3%`tDCl4-#i/w3{tլNSdJNΧu=Ԏm6xMi nB6}3YY dQqlWAGApz&΀OAs(myr@GPT +PTp&zYd#*A3h[XZ$h$$"TI&AtfbP Aet rc2( % 4:V@۱LOB b|, :y@V!A!U At!P)ƒlT OuT O!d+Dw \ j H_ y_̏Ɏ\3Ox]s$| Q1b̤Ş P!3QW2Yͬnhݼ*h2'Q^]QHDrx.G_8 H F^uE$=o e LMPw`Z3@ Bpp |c"o#ZDtBŁ|Q#ˢu $n_ KU O  (A*FWp(E,"Q@ps$xj!#suAٹlf¤ 5.b. 4!˒)7daLǂ<3' OYb&F"x $Š^ZWZ`/#-7 lU P zY"PAtu@H$?fa45 o$N儷r|>o4"2Of,y8E[mQD[\<9.{و|Geq6Hch>earrB,24#P^ϱ[7 ԓ^dqLwWZYb9 y! q4d;iA Z"#?vһf,n#шs2hϕ??ڵku]FPMZV5 CGb!0"؏lA :%d#XDȾ 4] n A"[Kz }ĉ=\YU-4Bo%M s`c"xD__ -**_!J^zCfٓ#^xڤhy"іШKx޿w@&+ٽ3꺅1hx gD?rDz&9n!*ː:==906211>>4| [6ɉI1\6i tzzfʱAD8;uveşR*/DNϨ>e` `t?Iզ VUӲU\j 0+*` ҜT"ls!+A]<5@P@ XMJr/,m/9BV:5˂AֲG}[V^]őÜu^@HxL#8n$D,@l0"+]O,A78]~-2lBsy[7,ôLY Weu:nnWgg]]*J޽ :wuu3H@os'NƢ#n55 bF_'z>O<й驭;:tC>c>`2{'w{|=CϜo<Î644R)ff `.QAWgĂ|ՠ>%Ce`a,BsYXJ7.[+5I$`}kxu0-eqcǻH$$I ҹ|KP=lm!",4.yŀۋQ<Μ?;<6g:8g[J/i粹3N&wosCChhG-j&J./2N)b]N\H%O|u7uzbg}3wO_{;m9uu}/Myr7g#LL>]wms!$>~pݺu"{{EV\GBUJր?t(4B=aJLP]ը2mx-^+{јkj\9$7ez_ 2T.+AyK ETB _4AoqxF\ 0]@а'NN Lg'mh,.$XkI2NOH{A:/hYv"}n;;vܳo\&?80>>ndMI9{nbb*3floY#G<6mJRD=yϟ-w^T?}t,7 .d^f)\2EQ-*\4*X$wځ%"k?-raQ],W,k{,R`C"ۖu&9sX<mijjHE#Q#Oiq\dٵ{ǎYÇOu'xsȆ |>nqc$H펍=ԓ>wzlrbێ錑˯] hh㡇?7wQHgϞ}]?vzg:;;7nXWW[3)E=`P! \}ЊG;` }I taK˱keb 6S=jƒA\5X\\ _I[˂/X~6Fؿ{{;Hi$SLoXL[ֲׅ@;E/dD.Hr'O$QnW> R6?xh޽gGFGFGFύ<>53Ԕ?wXwwgKkS}cHp ;.'bX$曶mۦiUUdoo/T,_~;vw]IS6PYTI1.WرaT}WGGgG{2ǒ== Tqu[l%1U91O44! Mbfkk˵^?yAt @!V$jhKes _\X;,k\jTb;q'|!&-R`oi1b䙃FM6"|B{ @%T }}}m4 h, " ۖ>311裏>T%۴m粮uQ6]7zvpflW?W_}5kHIJMĈ<=w]}uM4 &}PNq#LP$òx67 BM!/•6bHfI{*R삙 A(ReK 4~y!*~ε2NH]B%_|MCIX!R.4*F(R/٤E ,,K,3o|͛"! 䖌XZ2!1;z4p]w$HN[='r͂l=:ƋsDZ%i"#B/4ѺdH[abl6h.͋ZAFVC 2!#<G`3%3}WJLV"7M][T-}(1#,YXW -xy+ѡ\Hy5*HB*T< $"Q+2 PzKbQe+NIZg8!\STnIJeݠ?TcI\FT}Xl F%Tjjg,(s^.Sa!nipAP! 9EHePPġmꆑNgFA-pj#}PH$'چE690zC#*!( pQ$YǣO9~0HFd=6 !dYA0-+?"q 藥^jb;*^A ^"P nq({ ^(PinZcFdYךPZC=eOd!дuEļ+l)kȜ! yII|N܈v8zCId^m۲-@ZDSUZkb?FR&}PU#4C (1м 2DE~7/sJ37ޒsTseIQh%aH4U.=, l+X%DCg+A+=c$a0]"p@?γ8vj2:#$|,+(YAJ^F$7yɼ8F.Z,"B6D3 9k@kxM=O?daMЃΤ*e-%A@]+Rf)c_h $!( -RFUUxA_ n/pE; @J{)Sr.H$X~͏foؼyS<tH4@ufrޅA,}Y(3s'9W;'6'ZX̹2.'\YsF7{׷)<xl IT}B#D#T: /˲ "COuTXhNgWK2gE*[#sծKN#* )E<$)͂h:Vd*&L@Jn's| Uwv֨ Wf ^ 5 ?Ҕm傗{VJQcv _YVR6JLrIHDO8!~rOtC 455a{UW]|y&, L.<A <( ba?oSyXm״־n{S-[Zz67vol\[ћo41v^Ar\ξ_~մH{[AƦd28$K Z<(*ѳWjmD# MD"'fP! rH B޽SUb+MNф6byY0zs ϜB(A(/倥FXZ A%KQ.&ȳ8 A@h].Z?*+<|%KD/9B ^r=] ]e"-d̲]!HP< C 'P !trrr˚OY bdwu׷_|q]C G) K$8JRy1>Ef-#3 ?-sS7{;SkG2izgqho~?Uzo8xtoy[QsY#`-(RA]$u3YklhE"f-.=lJ's̞7r+֬YcSN8133F\=}t.9zٙg|LK6ԧ"x葓N<3M$$;yrxlrhhص}CT&+) +,\監Ř f:r!A9gX } ]:yWv%R* */'<2bI$"8?UD$]#IѺfN`zeX9z&#9:8[] D,";~XϦw駟J57<‹=ϽSO>h"Yܳ4nhh8{??{dc9O>B&ot=cXL3O=߳{ׁwX̎'wûO<6mtOg>XxЊy2v$-Jr(̻. $^YG0r^{*++aBO*ʀeWtѐ} \UЀZʚၯ O0Ve~NWR#5Q5KȚ:2ϕCѡM6%_rPκE(:)l}b1?:tM`(Bc-lkUcǎ=G9v}?<ÊZTQ]vl[Qq-n1:eV.Ly1:-:E琕ޫz9k<'q".'H+ pD851,䗕#O\u5Z4W՟Zf̌Vԫv\u-lڴyzz:O464MMO?qlժU] EtM_;w~ck֬&ˊmnoxíLzpp0gsYD|`6omm}7>I௸b\g̴mW_s>H4{G7o٢E"ûs0+! Q(I+d ՛ugeէQh\He"ekVBql5R[僠q΃S6Oqᮨ׽+衇޿w[_ݫU^$f\]WxK䳲0jwǥcK?;6O#o=e[ yk=>50t3H546޷|3g]n݆ dI]⮻zN3M3JђY[dsSSC]=mh%Q Øͤ'WI& Mp֭klj|GsiڶJ(Jb AW X+JyJ\|@BqAPF!\&{06C }iMoz֭[ϝ;w7nXN%$Q苂$x̜`fd;y+<7qg_|:s7:Lscs/y<+YgYC˲ǚ4Q1jilȇ>iS'߷{fjbrb|rb"IC%E~p`ԩSx`VU~y$H l?K|CIw'!zttĉAL瞻?яE"Agf'&&Tr@A뮿ȧ|}mljB{JPf|޾OR_+LyKX !+EDg/; \ n"" A%DPBq+X{ ?)M0b/bؗ%ʮ["F&E,dV]Ws_ܽ{bd$& kyE —.4TJEf5ΐKao'Os}ʂ@hll_0}w?uuucqZX~'EU0@ )㡪`Ò> ~þS F(B놇Y#HR&=MOBDLJ)$VDLbEfv&}/Z©G:Ծ{ ,RA/$OK@?|?Wx.WF.[gO̩Ō^]c}FFD-o/xi bXqq`̋A9p zy]۷nooo4-TM1MK%0*"Kb<[v퍯q 8r%.h4U#M4!be h>ZߓJ6mڴqD"Z C 䪪NZ3a[DAzpsHHElTIV4ٖAVp s>P?0اNQy$$D%jQeY[42"!zTQ+!ֲU:-f%E'j.t[d eYbybq%a?TTŭX+<Fcܽ{7FH$B[a),oa-x̲<6QCs%_-9pA[C f吾J=4YSSL;qNDAFN0]M -^yEtQ&rȹ\Ѳ-NYh3H>W:2JE +JkxŲ*ΖꆥȢg#!p4DZ1~؄y)H1-+0"c7m[C;d2uIqLA8} YdTYёzh/ô]ס-k*Ę rI`]P<]M}A8mX!Xf/|/~y*ATm‹@5B!εR#js)KnחpK=eK!P[+?;l۝dQi Mrgjh\GӴ2bK%%c;=IϤA2~V'Qhe 9}-8cł +X V4yMffflSJx+g - BlZhťtpSkq(G"y6o圈lλތcMsc 9gxVa [n˘gLSNXr55=X%K ̡H4 O8U##lvZ9zZӦD69ҺcFx2ʢZDl 21~%9Q4A, ;AYQqHP1QԩqIBG(*49o Jvq 2fL"G8Q"76tC + 9B2P J4dHG[)QKĭrFp"[,DW=A%_A10F(7|Zxvh- 8K gs/,DSuOr)Iqyϓ8p#HaTE^qCǾ3Qщ@l\H+\Z?&] wuɨyw||RX4f;zq0{Fx .J+XyEGE@[mBZoj~SS *PJ,/;ZXvAT &)UQ e2 aTnYvߛ[%F)(?fT}K\i#^Lkz)0B,TijY}cNi Rh$mЇ>[o]ӳj{'yefzdtl#8_ʜ.*u(X{KHMP(TeC |QvMCIۣuD w$?09ufh*jud-q&/ċ,1bڄ!̸BJ2WnKQ9L}T}MoL4  Šגu"$4TG\~d;7٘hi?uݷg2_w6ΏO̼f~zdtCU1z'޳mF W)ܶ=ܚpm/"˦Wie|`Gvxǻޑ䍙_G~efzjlbT5h4U GcXîk-^dYBKœgK27rO?}=~omnlh"EΕui`YItÂ<'gg;ɔi'"7 6W"C7UsAK]kh]Gݦ+?Q#"Pd{,M9pEw5 "PpZ\L?d쮍3\#.-*;ߕʍ>Lՠ<$U@b&>:^ gd BBi֥EE}pECp^ c "9dP?0KZP`<;ITTU$1OQVY_=ˆRQ;Xn} BeEC.tqx@JI%h#8.r&gM/k9"zFNUuqLjKgN'm9sHnrr޽GOxO?s^Kw;~8IEx@Y::>LK]lmoG.o:~nƍɑI^z{v9knljQ9Ӵ}۷?>qPzl03>8˘2289ZvRTy mM>y[H5[vMo{[ϿX_(Ȗ567?cLfdd|Ǖ;:$Y B4q9\0}zoٸqC[kcGӔg=~2,_|zlTUط_ΰv-">՗Iy?IS=vڂKv:o߾S6NݻwZk n$D۶mV$ѼO ?4 GSr\$f/KeR*$,lݪqE6Abl*X+\~U{XABr >9i_?nCHKN}<{04`E/'.e+SAyɽ7~[Soфhp"(i-,(I!]òrEl0qћw3㫛1MFhX޵{L%߹ڽ{cM%zf|,2‚>|͎-39'_?wF76t'@YRDYb1ճӻo639sO>O=sƺ^gyf`lęA6_a*Uvܜї,A$ű|puW^>y{`.(8SX\? O>COUEz~p=%|?|۴n'_җ<}`{ :r_L$W"IzXt`߁f(?gΞUd9 JlV #yjLr)T@n..eH^?&32J/baPwKp GY"(T7)Y:0i\19?^ED^Afϳv=67Ng21/sPZǓQ?Njh77Ŧ"Um7Y_O|rfzڲ77\{9vXSccgGlj''&t*295E,M{ yu BuQ[LneIH$n7muͼ AɩmW\~w淊j:\דU- ڵ+IY.OFc p,t\QAPh,iYi:v=z8R657#c\淾w%eOLN0>1+'6l܈w^VDME Z  {0$I/5mJD|ԳA VYcXOO NKDW-9V? =rcr ̉Qzrt/|vnwfB,}|bbp ;9NLv &JسtM]3-˳mKdc'{ikoģ7?c2l^LG6l?oQJ%cL@wԩrݵ;&N;n:_ڟ~ClZi_xkg{W>v*O{"X癙)4*˹t?ESU ؓ1! XxC><#??>#gC}($5 m7G;.`-Y`O0BC}!Ľ)DFPBq+X f7}`xm% vlߦi(8b¿E؈(G ? 'ʓظ#Mo9飧niJ;״n7c֮]̌uZ$vH,<EO>xP:mmmy]A55"юÜk8 >Fx,ܠߩG_++kMDFȋ%`+乘˰V@S/x֒ .|U%T!Q}#j kNq}G;OsJ̵d/vZ[۱ARy , ܂ Y5ᑈ 9==^BP@pFD1l3?>qO~<49m,EQQ^|~+6 ykad VNthSL^bv-ӋDU'\;fQot]wJ L;ӂlwnM`H Joy2ճ%1uݳdM&'~կ˶mWt6soq6(x{hHĻ!40ys%W@ 4*OYyP~4ECE;_{6{8ܒ4WVAu2CH5 e(t~TP;r%<~}ʂ[(Ue42/:=v]E; RԿ(KɁ1\I2hO2nD^ƎJvC,}e [zoq+&ꚔD+4J"KPGMLPBGQ":Ȍ@޳syq7okhe6nmlްnÚ #8NQ d6 A!aߴZ!c*-AaDa]i mD\^T3/444nظuӖxBbnlw@H{j*&t+ů)Um^8R=g, H䁡^ܹkꛢt&:eD&° b82P$5(ea)YH&=Q< ԈYC$zeʆH̰,t J4^2᪸ 255e+ld?3FmJ?qC( = (CYz:Z[SZZS1=@Q8Ք@0ۭOK=%ʮ:aeg5RL/!VwoO:F3J]\F !K?%h|%1Ҭǻ4 N i0 c؂$@ɶI?QmERxY!DPE[ףHZAPA Q@xq5-Q_Nxɴ(* M`(fzhg!4qHAY|*G0™)DhHm{tt+kU2EIEQE%^<ڡĂ=H`fQ <U: }墌E&B"E{`@$f#4=ǰZu%e3dh0 k42Et3 @u'N\]4,nj2- rB1oA-TQ`Nr({hbL ~6{g>V%DJDRA ,26bVfgf f+UVuOWWWK@|OiJ_EY$Q8ż.ZgCA/8"I؞hq:,d!6zhӱ"nGB!ː$XD$ǏjZ`ŒXMw肤}IA $P!*YjFkY|d u<;XӼNc%Z?O ]Σ|\2@-iǠw5zw;}Lv:hd SgH>ʝ5LgI/jGdNvR!`PL+e9s4DYzV_wu%ۊ1z- ,Tl Ik=ȠB E/ZqUߑX.L{nv>uÐ)90hIk4@$ݓ\杬( Ų"LJJe0eAѣ٢nhm -ݐ-lUSCFzEJ!A)2(pD{&IV'dG"X<)% MHZ5S9Vh@׊%Y@+f@4Je&@- lOQKʂ@pz":ZM~bshG[kj9Pp-è\m@)d<־h=4VKFՠZ1CTQ1~NbɃFBhՙ/|a wS< +QSUZB qk 1O 5Y:u\r.8mnM %f LkTZLέCUM>)8!ɍvU;V!mo G#縆a<Ï>Ν;.\gn;e-%4ǎ.] |XqY] KB߲DXq?0lu`7$3680STQER%' SoVi =ꍘX4",['*=l$ɴ [i%Ic7d'͎X<~X,pbMM-?fySO㸚*ް$=L& ت/0pK$tQ JyD0\ϵF*H6gbzkk X*R|ٗGF -M,Vd9bII}p!IpGuv%ARX$Qf${BܦȊZ`4=} ;)bR\tW_o/TX"i͈Loa"P.--y>ګim#g4dL< 'tݰm+JE‰,t仮{C(M7r_|qtxt AiΌ ޅ!^Bd1@5@1uYRqvV?&; q&8qCCgʧ-*7 ѠH> ?=y;.!R)fh &2&{zԵhQSI!ky}cǎ$aZ/!-h鎫ڶ﹞"rqSu p'wjc]];mɏ ۷>ju[7o/9nQ}߮֯۶c,IQ]ƺΙ3k̙3km[loiJgG3|/{CёErRNp}.vvȌLXxԌZ*kJ'Arc#Md Y\8=t9LaSDYk(Sx*׹t@ԯ3'>Z2a?Ay-K:te,(цPO& h\,EcFYW@YГsvݸ@c`EGC%w. }-h~ ˊ%N6;(޹`HU ZTa ϙT+t71,{WY:__%N@k>55o|#mwߜ /]zջ`,cX~{l\rIĔT%_kʎ{篻΅}핱W\3:bFZWQ,3UTЁd ]t6TQ,$Du8@SiЇВ0NL_Ik 4݌" Y4H[mQӳl@Yh $#/ G >pMgQaHIQ*.m ګ\5C= B󅜡8E@ve?yS]`FT0dV2i&4Ž'Psyq.[Xݐ\uр`5y37-ΜT}rȍ_}jA='*70Qq}{ Łܑ5X?Xc2i ]OT/,X2d"a$ `]/(av͜xқn%L)&Lڻf]ZOOe\) j. О&=MlHUrБ {Mc 2{* ,H]D+RɴF)w e h+JT\iQ%JHᑣdDp"UTd)A2MYPg*mPL kʒ n8E~w$iHLz~8dKcHG<׵8C",EY DQXŤ>yjׂҏ\,Z[7-oQ^[tYAW0z"¸i@5eR.2,E2oZsϩ:'{ 3L{ 0dۥR.'lq,7gC[vuZ;m/ %IՑKRyFdמ=LJ|!HȪyǾ 2P#T-DShPL>4g'ь29m{"IȂ`q}(z %_$DqA`Hy@أz 3e*-OXȌ!Rw%{qOD,i+ѓ'4ȴ Mn G^8joV50*\]g" 'l"2R=7_Z "BxLƒ3@(a 4>8`4Bd 51CӁ@h}e >)¤ L45ys?\b"¸!g 0nr4<1?=hU.Rc@'*SY v꒦rS,䆏۹mۦu[7zt.77&-T8} cN{)iD@kזɁ`EU7U(P 3?x6-^\?˿—|\9K6>"b9(9G->t.Цa>(G"mf$j6}#Z%$v\<-Asi/l7z8?aܖ~aaĖe %*fFb < ZDt 'ID"/:49E#.1z&P(u ;ȴ? =+R/F(2K}MBiE "=ò!x 0u)=%xB[aP4H.t99psRbY4#CzBj`0<)@xpp˛f{^[oSWYz z-K4w=^lْh,ub2,S]oz0^_VM!(J p̓nT m:w춖Bl ` G>t,W3D)HeabfDֵϏd1WJgR62;t|ȑH,֑ Z$Y9o3>Okc1UO:}`6\zyKkKK>2ԯ2U;SLjXB6/]_װ\7|)tGAkۖuc]aYC4#feBd&B!Ahq ݅s?/eLс -@Л\ׅ(kL<>53F;!ڂTXB x`!U-B] grqg]r~ϩ SLӌ=">dHYNZZAӇy!!LgZKR p-ϤӈkYpwJtèJ.pΌ[ɸ3Ǐ Ti*RfqoPx~.WPU=GHԌ 2.-ԥH2S "ɬPƆzc !Es9HB_X+]]5帣EQ12;%&nY] H;xtxx8͢0Vvj@5ܶ$:t%ژ>@1אky y~ 3La:) 8, Q A E ƏP39r՜֙[iWwo](]3Wb;nxuKW kr4h`m/>T9Yft%;:(Cb no˦摬3+fRLJ| HxUKr oxxȎC?9pFn^)Uat%&O';,PqccSY_H~Λ20]r 6O2Рs%Tzr0( !ͣUCۘH 8$1㆟5DQ3'"QHxLW%-P\;PEŧb1t]Dc rf1C 9zǙl뻮7 3ػ6L9nI}&8m |JB!xw%>=B C#^]{ EWi~Qtv <G*E}_>tU*3iF_E ,FE,1V&?UeYM؊ZP h*1hQW,˫WXB4 Y]AϤӶ477PjD& x4W< 1D2d0L.LP\.b|k(Qd<˹C67e2L_ a mLdA[vi}@LNYe<R,btMmΘ) K>~_$wS _%\|Y,WrJVaL<6'\L\T2Thr)isEEc!S,Dt- [* *EYRhK&YFhbTW\h2Ituϲcc2=Rubz`X1gN8I`Ì DulX#4LmR,<GV qaFS&Sp\VZO}P Ֆ2 { Bp6 \h$9nPR1OD_ƛ-]V8aN a r/Im3eD }1茯0zjQ݉#"{nUQ\\~ }Q[FTr]=͵,Es*>(KdPƸX~QW sG&Ɔa:PhG#DQ#q5ӢnF"x:dl=5C0[Q3ĐP[2T3\ U]βS42aV\ҖLDz+V.[4yeP/r쑑+^^dY"OcQlڮ{綁ͭPADW XT*DQUeܯf;w̚ XRAP1t.FQT*_CمBQe$o8Íf\/Q<;Ӧ suWJ&I`ܾFtSF"b.Dq~Ϧg~`=? :SEI |p St%4 jLd`$87WSj\+ PIeA(6m1#c4&U+dw`2 9:ݴvZ9\Љ.[AP.YEYUR__.d?5BB *,xׄQ*Ʌ|1JۭON:[ZCl1]TA$ߵ]+iQ늸|ʀ"Pɞ|Lb۲9*(}/]ߠ+"v] `M}7P9xZBSbx:h.h%CvDWVfT*L/\ T/Xc>nwozT ^^/OǗ?;>4nng]8% cJ蠟zc1MDe8iK8 t "0YCQLYH s9T4 Q,PUUJ!:z:J j$펺-߳t;BrLwu_a%W PM/+aTHZrN&s]mdɔz{nt@1ƒAeޓC \^\,7QܾjO>裯%K;)9>O.;}21@8!Z22/V@J%B# +W?zGwʤa7֯O~|ͷ/1 3=O]Z*J %{CWdQq'jz*E}Uld@4q4E25u-C?TU}*.4|Et7T8j. 4{>Dء>ЬZm2KqG4Rb>aJ'磱, nwՏu^ (mNnAx-¸562l *G499RrTPvaܔ1i sSM<_qf99;䚡0'nDNdY<AKPpY?|?[ou̙fΒxS"-kFV1r6iBԏEL={BB­]w;;~=x0c?.v]FhZCVz_^޾76mʎJW%ETTE}Xł(XD`)ҧqhw]9vh5F֐(_e0.oWIz4~+O$4NP:k%%Bg(g̘q%Rŋ4 tuhoo+/B/| ?e(ATX\~c>⥕e{INj$Zd饗\H$|ϗ%&>JAߨ[:ÇD Vpm۶=/~ޞd2 ̟?cc@oV30. r; aU{N~T!;3&" y?~O 8e9q #D{[apM2{ eIY*Zp#ּJXZbqM7!Ugσ\?|GY/xBn %ȆQr|"$x*6. Բh94bYT;^[A^\Oi/*)ЋdD;~`1@e O ;{t&}!}=|aG@q]wtl $# C} LJ[~Fg|j~ۭ_ٿٳgb%uѡ#CCJT(^%[%tm޶~-6aF:wK_??\v饩duMO++tƲ~Ad sg ާ6aDX uj0.툰'"{Kz2bȑZC͊J/ 0aΊÃQX>aO@"qZM__ߡC p,3gٳ5mjjڰaÒ%aGjm;v_>뮿2Ӝg͘h9A=բ]A`ۄux*}34( L7I"M`_V]Aw-A5A^ 2}ŀ_jDJoWesU8HsCR>XEZ`Vܵk__~% Cãt:|s%wر{ClqKP}{܁CGFGKҾGͩ*vPv>B8w]w>vxnϑϛya#1cV*fyyռ ̊+\ǹ:;10>s#Gn޴9tt>^!xLU@`]Ɲ=LLଋ@np?~<ŢQ 1,"Ӂ,AO 3[ݼݷ"&SYC_d6)QiimFM*}߾sg$H֬@~jŖCG7>۶oݽrcGW_yu=iS>wQK#_z}A9>76:+Wؾp$W^}dUX6ϽCAih=*"'앉@8K( qʢЇ~鹊$R>ӄ-i/4ttv9:66.ছnle6mܜN7‚.0ήK.K::ZTM-XK/_p^S:z ]m/[r6_pYtls[G" bF! ]4{֌d:1)ӜXGLSs*RUesI$---i!_:;bآ:E+Sai Y&<4U鬋@CSZS pfsUWա*Q^81M* NCn=ho65.˞ih $I,ܿuVX\LGrX!86;z7-]I@ /e;Qy* ^ΎLi"Jy0Ҏ畬҆ fW<1r6q]`n:kw0WV~jڤnJa邥;.?9Kw^?s$M;֑FLsR#;:y{ޣw]diJΙuh {{o/|Ɋu457w^K+ \s_X8"&i}`Q(/D%aXy .2rG?@h#OTReqy8d!VٳӃ .%.q\ -*苀 E_Is#*3H1kdc; c.}wsSs<+?xbՈt۟hJ K]s%ֆ;ۺf߻gرҙD2bz{z9 Py}C]]r 5_W`YRH dA K/KTI&Dڤ_bO_$*pr!B! O h9څ cUT[!"b0~DUbAPPdq"ԈL1{y!B%qX7Q?UjFODwRz'GA 3FUmd)8Q H݉,Zt'Gn )Op=T!A=UPa͇SR0",x"¸ g8*qUR%ɍ'6͇QF10D"9Q j 'atttq^LaPKk&CTPUq_zɥtZU}XU 5ZUq3ͦtKFSL)nKB_vGz׋%S֭߶ml=@}!co-[~---Ʊ~f\ 9&p"rYEϯJd4E$T@#"QA RL^\>|U(abDD/Z O/ C2 iiIQ ~'X쉳U(D4 ;S!T?ؤTqQSJUjX_5¸ `(*SCg"¸)#Uj=YaW{C/2(Co7$Emxb<0j' 'Ǧ*&xf rUWe0y9e xS6u!!u =&`(t2OLh>q҇W:ƶHfHmT@:ǁgPYs3~8ua- h+1҆Y:)TNjB8@(oimiimibi'"A4uv@kږHp˂RO/hbf9}{x?BhD ȊoAS%ѱNbKqd&L T7_UTdag޾D2nʬ^?wپj"xnssۇ>?oփ<0<<8'.h;JAcYm렲wDWUNыU"*@"Ah3̓[:AWʹAC)4BGqzXH,=} Ã0Dp }@V>fPފ*q5'" =j-jʜoo"Ѩ㺊J{{k/_\*.o!XE۶u] ߱cG6J0{bJhk]۱A4TU[f#,IR\6AY !D"FE|=xQ Fn>\@t̼*h8#ɪ z D<}rJrVErwokoK$bmL$*|-~!@ wiRxޓVoEU74fh&,ԓ yx]|:}`Bc@FF)]Iڸo>V'ۈ< ~|.%(JF[$EP Oii66<) @S) Y a 8K(-]Ϭ3[Q0aDqpӆpMD75yjFmTTf1 }S i*L`2\%K̘|[l5CP*۶ᄑ{Ξ5{Ι?%-^8g_KXS/ɡ9O U3'NFntTӔ:o ;~Ц2= Dq#јB^+d[jx.K0$v,5 M <,+R*y~P*˂b>_ .F9FZ&ǩ!Y'уbkP*2mU4B dvĎd𔕁e?Ӝ;)]o0E'߲QY..ʩZ q2 <[ z*uhK%KeUmGUdn{J~'D7iOc={~t1b e>Hx1 vC}ֻwn"xÌET GiHDQ5u08͡e"cBbzBsluN`.,^*m |UU 4h64 )GU@>G7\Zk*-Iuz:%->(Z!RV06ZW($D- W=뒻Af#iX>ihKeOr/?8u01'//}S؝HʁUz05(gt4jdrJdRVz`1u< 0a*uR"&ٰ)@s >zN  ӫA#|i) b̅vhg/LJplSTF_)0-p8o߾/}K{ѣG7m$G>?q#E}t`n hΌpK4yvãIm~+[ůJ{%Ȃ'S(d_=>CHA@ Vp;^T, B(v^[kF/Q#_mr}WXcFg"6m/.Ε큟{BD0Z~C7mniD+hJUh5(Z(ÞRnzЖh Jy*rQ3 h06X*3uPOP(wG>-LCU,9vD4QTE1Tw=*i}VWMv dF 'pF ohw@q]$Sl٥ts<+QAv$-viꪪӠsA CEoc(gernң>UKĊaeq\&W*A ř_[CA5CQ_6_qo E'q  A_i#Tޘ&>F#W-FO >u~ `[yo>=o KM4.g#^"~cf͚u) CB&Q ؑ!,(94!QzFl./rl*䀱,VY,+i!- y) "PuUBU R ǖuc$qЬG|) (l16;Czb0:N&7A@YH;T4Njh.UUR}>k^]5;v)L;z^c*BoWI~@Yix4B_ӅˆM¿䌡0%6NH\0nFEgI58E$29K.ᴵqq'6DY-qV i)4_Ciڪ(+;Dkn؊ )}clږwM6iӆoؼi6mظiݺ7^}Cqv,"hZCwط{,;ރlxbȾJC<QRLU 7IRѲP( dB:瀴.[ob~7:8vT LU5}}47?5so~K-ɤS{ 4!D|Ğy,T *!{l DXhC˒e]|a,MB.[A n$J袋>O-^$JA&G! Ln=Hؘ YC ŰSsyOɴt>o-B+j0.3zX'X ?,('4 fCA|G]6<\رΎL&3X/bt#fX,tvu1V)òJ<#X"7UeEkoJ+& HUGT?T _U1bh:#d*mЦ LWڼ,+qEEY*g$w{?NNA6˂za5ԓS,־K5ҙEWʜ91عgk+Ym;$qϲ_[.Ҽ{Ϯc;ECC5cl}iіòFqYݻ˫Ww{^}%ܞ45gi˶9g?508mq\yUjbh޻oтn߹kx] KǏ(dZ^^_Rq9;ZD![~wu5הefϚ+:[bBB8+x%KZ ݾ}ЉDc4ͅ ")Vvopu׾;͝'ɢ픈J&O/a\,X`Eo\zeܽ{$-3 SR XK[iW@-io9gμ+.[oimmFn9qQauz5ΊJSUbeYso)EvÅNޔJaJpE,e˖AŒ3fϙ}W" ^{uֽ˯_iӦUW_뮻ˡ%C ŸTQYa' \aD@>oCO~cK&dF"85k;q.=xȲez튪 Ub#H|豾>pb5MM&^r=g2YTdIWdP;];G󠲺!~|Le۶]`suѧ3UM I00~JvPmف$јLG{뮽&5yCUW1g tTJ8~PV@֢@N"TDqV>T!;3)<DeH]gΜF58I[AE}YBѣBp{v$H7޷eW_{^~9_(cc9`5WHĜ5{&=o]3|ZBOoA1L(-Ix2fijBT<1c#Gyꩅ x TPՔڝFی5Ph, \C,K0>\W,kc}hkm1N%SAmF[ d{HT|ӗ3n=~FN4 }rK+G?zݮmm?Վ۶nLJK xۿΗM7D]3A.]~[} p7|=>??8?Lztxx3/ 5\LG>|{޷qڿ_'=rTCK9Ő+} <>KKg o]8~"艘* Uܒ>:01d kY/0-, <.JlND3S#6y[:wf2BЮHJ5:۷go{~#8YF4BQx'>&PB4gE]hK.#òH$VuuXe˖á ˗_<®T *:;svtt&t:љXsƌ.9sfΚ5˖-_pY3fJҦ ,\4oK`QK̛7X|_ŢbLizsS\ ̙eYE%K^~%/Z:{ 0.=bڳv"B <Ӏ"E49txa".m ϫAwnQ.usPKp[[hq%&}}0i5xgt20V(Vkwfo;f /p ~觏-m@~IϿZTukmn޵s_\t*z=QUtC={0ê[nKzng b)PMМ\6PCt]Uq,kф)ќ IFntHJƈَI F+vi(EOm5T.eKՈ.~RQJ] k]ox0;4+틂+X y˖OAG9`43uh#+[D@$I}Rs=d4xǭw?}ٕW ;@3 MsfT-T@>T25\U`&&0,-4Jux4J`aQKphagg.FČ4dP(ɑX<;^& r3,<.O@+"-4Fm}AJdjM$ҚM'nI75ojf̌X"LSG4Jd'Ӽi| KD0]Dڲ,۶JB!/iJɱIP.X,{hLdvl,L/$;)ɴ5XmPiRIt fT] ,K]]B.b-:BD/piA0=c15tZPcP)p9 /Kxj^MyLM'@kwvwb 8_p]uq7`֎;~ bCu !tpU$cn…\r ̦bhW{WdAs-?G[mIMM0 S֍TSn$s#H^AKɈH۱/((i;m.J a0z D]dE=EO$(W%'W%u%UddE<) 1;6F0bhE݈J0TՂU$kҁkEצo#Gt Ne]}A`d9PՁF(ц4|zvI/,?2WRhJEVdqmD8gF, yQW]R , -A4E|B|/Y{Cc(ѓG⏭@%3 "q `U(-y#[bMiO$ *PwH3Rdz򈚂ڀ5(bA0}ވQ5z:TD0V#GZ~ry&wYxPT9c( C'qf%Uפ\" PmS31gaX๦&CXPԸC+T9Huyu 05Lrٯ9*tJG  -wU:[vUeQ&S rHPPv| L2UgEnWU 4$W ǵ@T+5nʕt'^UexJ?L0/:Ŷa_9,fRzF-GcX̀qܻ[)O>[=z+GoD0 Zeah ~E.>I^0\ YnJ<N,?)"$ =r: j٪+q=SPVWFQ$?ۚAI\ên'sv9W 82 jq1:ŬgaAZ\4W䇝V%m!+FCCooDǎs geʗfR0󚦂6C7Jqj<|U0 B"ύqHdyO,mU]NjIŌ"ݺ=ՔˢKQ+Q )#^Wh_3b 5K?,DWUb2q\2c=dž؇yxzj\9ө9-aF"!4nB@~ l.sbZtBȪ8,Z RGK(A QAia@7C{t;)F|>{D<ޞijkYL$͸qMۓK-|s"7X0}ڨBje:T{߾}0|Bd| 4 !fi Ï"ɒe;% C1A  e"t04$aFk@JܒՔc)2M(7+d2B9ڠ;f'8︴Aw$`&P6āDzxq@MXǟ(^Cnxc< w<jFO&aD1Y↠?|ɒ%玲j J覟- SE$Yv\Z9EĢUwpGzx,zɲn(h$aeS&b~)WhKO`i, }gǦ_ɶ]A) +8=4{#VO ٤ hb)B)Y◒t'FO>9T(!QKJ!L U 7+8jtM'!4TQg0@mjX ŢCE ȒxFhDG?>=xQdКhI>m/ F N^л/Oh8zĦJ! C QMX/>Tg(r Uױyw]U:+"QsbnX2C荛sx8}!NƪGű4,ᱡqq”B)*1dIQ܋T3t3J>V_r 3cK`l4*qSaJ]񧌰׫u#8aFi=SCg"¸U#NDwfM&~]׵,b~ Z{>޽;wڳgv޳kw޻wdi ݷoϖe[zW+{w6T[%D*Dd9\%>U.ZA S ^zzzoMPrl&ܠ vάV0OQDFJөs4HYnO('7KP Bpã>UDq0DW娲ORB*.`R\ oqpN a\ tU50¦ >8+r!R:*jy/abƄT22X$+ CL PBk׮#G0 G;p=>r1xcqǵaBE*qZ,YQ ZH(yxUSI:ETEGc>%.co"{@HK t 5}z}>i") =c7-$DJf`0TMQ0=ChEǦ S$MI'aWRKF|8OSrL(QuFOg0ě?7ѓS)w0AE'";c*F 'O9xU!LQF;5(S܀2 ;)=‹RH9!7;j4 ?/;v dD"r`KN USәlֶ͜$mIR1cZ:L}+^ZwCMϥ28 /2k.Hؾ`J##/AȮێֱ3ŢEHw=!"Z~ae%q\NY*v *#휅1Dֺ*\~l>888V.?䓿84B/##ds^x~ڵG8Cc:z' 8 :T ۶G^x7oٺrꃇy2Ṫ~x׮=#`~Kd""փe=Û6n:z(( jԄF0-/f3mt'GnrjFנGLDWrTE%ĻdS&J<{BXuFOajgܳ@o6 >{N"|ǓrՂF75y&"d'U0b MDaDq(aL5(r"*Cx!;y»Pē7nD_.I.[@o%=-=}=}{SOlڴ=&{g?yG޸}W4Jӿxr]O>TKB~/rhEK>ȣO>а*i   lXF3,h <hpG |Ck2h*2|vcf,$ADŧN[SL,a͞L3P4|Yl&g־ރ|IHQt8Rzxs=ֻqd"5 1@rNy߻-6gIEPeʠ}P,hp*c;lU=Hp]bA-LBz\ H %,b,E4guOˍ{Blz敬Sճ A0nq&< 5lP@ɑIғSCXQYD2 `xSSÇr,nđ (=4`>:HtCVbqӌtu ',ՠ .]tʥ^'m68пm>rc[:J$/Z4g޿رzTy>0_u-?w#^ [g͙*? Z3{֜|.76:ݻMX 1F-\ t(==zْ|$]XVOAhk^~ys3!"1e˜eʧŸChU*u۷w^pMZ%EY5 }Wj6fա`iAii G)k,B˜EBPsڦC yr(a=p\;~8E"&"Aݨ N|U!ѓ 96,ܳ1 =n|uCDL-bZ%A2n)aPqx@)pO8 yX/اζd"Fh-[JN!og2M͙d26<2/~iރ;v>x`?D.X8#]s}Nwo/_('^||}W|mWW[уmD"+{M̞;^W-/ =G.sFy ?p0˗,Y5#gCX*j, Q4F+Rh[֬YּU ϾrɲK-+܊_^wyd$c_Ys[~'~Q"w7n޻}Gz:3-6o귾ܷ%w۶m]KUMU{o l߽K.K}}~bJ_wl;?>S`+EPW+WH&_~hXjjjƨSC DB݌cսP7qzϲ vٳ$g- h 96R3Izr=4 yj|Lgyg2Iҡ, TQ 'e!wM%OD0̙3g\.;66 *TY;q=$UAPKjmk]pe^vUW/\[nhs$iU7hqE8 ~TBSŋ}k׮۴qnQ'ן?/(lذi&RaJ&ӌJB~96:ޒH$pقsx4 8T{7>#wm4EvS3ϲKFO, \u k׾6{ cǶᑡ{;\,۳Uw;}cǎ`|G{kog͚}ӟ޽{7R yY+Qps|0 z\_OQǎ"<}roϞ={`o]7|?A}{! B{xRy+@4:gE=a\ )#:]@#8 qpV)btɄԴ;Q::IKX-[nظqʕ/ҋ/ڵka=51$:. m vw+0<445We,eߞ=Rhk{4ݬڳa`wpwc-f{}ݠQaFL<ǎ]{vƦAq4zu7(W 3GALOӁUUV/f?<|UF#ho+*pDZi) I//K&Rq={g_vvv477eΝ~5%.}P=*8Y Cw_v,E/_׾o~@OoOÇSd{{t~6۸qE-O]lYKKKOO3O?韟^2toWSgsposQe\AeL*2Q lll߾}0u--md=pq '_׾<~>ԓ?3O?u?\ҊÁG߂\QUX4:t]rŏ>͛OЇ>xw| ֞1cfD?}ﺧkּystv4Wn_䢅gí[6Q@TY,::/}OdӖͺaJowu6i~ m.}]V#t!Q$4=bF@p%XtGG @D,Q5 U]Ot5g\Iq&IkhΝoҊCctlgxt[npM7*se$MW W,rLF%?E>5H?{?|38-GFH$#EQ2Mt: W\yUz'_/{فR*JP70-PSupfXi M5UBU&qC5ޤl gƽQC ((VR=SZ?y :ޝkkmpA5kOb%PDײKRa,+[|  cLJ|aXӂ!ms4!r1Uޥ˗7eRǾw\lO~m^_i.UV̟`]7dW_<[7Ͳ˓f]7ulG~nC?'>.w޺`fw=o˿o//~ŠW_Y͟;7bD$O B}jj~)Gl9P̐Q:p@ R(MDVҩΧ}X߾|W::2)AP"n+:UQʎfe\ߟxool!{hX![T*i֭[(Ⱦ'芬^1;⻎T*z[vZ;yC35Y3gk"ܹ "hޞy}ݚ{"C3RtXDb!jxıK$̄FhOlC'Pr~a]yxSvzCXZ20tQ(jpԀNQk\*P6+!M8=O's)zUI.ѓ:]UU; ¢BK.Wy*M^\a)TlUONP_CY8W:*Jܣ(JXDX𾿢JEUT0=)0 &WP'ȅYI꥗\G{g^x+^xǞ~I7?w~/O]z#x ٧߸XvHz,,|i׮cccnHB68sYdA@dY, {Ds- gR!eDP ZCH4}ś FװqxD*c\}`5T-򳚔'>/YkXʯ=馔HlG$#Ali"|uD*Z‹/~ck^=wּ?}Ϙ;?nuУ1ߏG"qP!f?{UR8:"~3/G>7L57 grf,a;/c=>go'7>?eo0EQ*.`'Oc࣓)Q|~%pn%dL aP\UNBUޓIVaTJ3gGKUtr(ĝsdiYq%'.bH-ڪD=%KGT7C@geQHbx.ڶǀ@ qYvMDb];?[LuUq]+˄ r>NJ![sޯ =_ tCUz֔(ch.Jcl-[O%Ŀ|RLT"7A$S`i4&cl 8vPss}, H%ќ y0OU-fqRXu9ic!Ƶe[mDP(mTO4!]׹ ݅\.<^B$ "%$4׍jD*\HR ٣Ȱn>r( GI0I_B[ )PsxJjsT7޽D %G?"Y' 3:OQ7%PiɞbkwrLErٹ HFF$7S¹Fng5PՈa9 U޷o_C({^X j+Cf5>JfX|OIsl}NTR좹%gyJ LD ՖwezdNiBN5UlmOZIk,4@*d7Nz;zFpUQhaqzG{[)F6SoTq@b GpE⋬J"ѕfa SL % Nu>3͈e۠`.vE<`|˭͂\=h{J%>ʴbe;P4D!b#B: ȗJiPm pz#Z UdVEG[L֭Q(W){GTڵQ@ԅ_h{%(x<h4FQ4p8M0sv+'eeH8mF4EC@ $M Ȋ븐V%P2V`<灠/ T#D__A. q9h.^~ < $&A$5-t`$8.LK=lٲQV7ȍj1te?,,n{  >td]cc|AYAIdU/ $zhDQ蔊1+cu<#c!7b!O g?d )27`-IA̳aq|7tL>m DE@,B=/.;J۲Л:7"YE" = 9 NQ' T?ZLOKG ۢ 2DQU 8 jp QU`9 0njxsK?s`ѯA=5yj1ma-'"{OZSCgjy:p-txp':`B]H:aw }0fBz $"g\ad ؗ$El[Vd׷C% Ð4C5>S,' ieE%@pkzla # ʣQs1,KЃB߳$pZPFt&) /'H_.K@JJ!U#"?XY=. J%z540MDI0Cj{Ǿ@WqQ?$Iah3$PMGݚLV*=Iғ7RZ8[-~kB.C) Ox!tZ$v%LCv?$+iJ- }َ :48x;vzFG!`:22l%ZI"a-[޵THgo/~cJf p].W'l]$rC$f#{O 9KQ𿾾ޕ+W-J02L?ͼp_q\ Äޗ׬:vD&Ko@L19%ȏjR(Mg`9.-)b2i$ IC]Ոe b N` PQ𔳔x̆TE=E^Fijb\pkFOD7zLB8sa]c@T Lh(k"q'GaĩpJg^DZ s hˆzXʘTrB¤羳0!&kf5&O %Pcp]e _sgK @(y l4;TUa/xCcٜ4?A*Z%mmd`?Q@Xo-gqmOMY0 d} qز,\ANpJvN&= ߶],ʫG=WlI4#{vu/,]^mb~ kQ~|45Qʏ%"|ӱ1/ڇ^6Qt0rBS@a@X v%ySV夨ĹIx8%yxW`hpC=%~;!lDqo 1׃0@1=˨DZmBA ,gh}0\رcGfjS!j$cd/X 2}H"Qնq4e3DzaFoϱ^a_ѣGL[n5{kKlo~AOFvd :cԜMNT0 -a"oZ (,DrcV{/-DH|ZM.YFQj&T2B]@$ C֘4?qeaI@j5(8*p|+-GF ^{_K?чή6^ym]=ǎG=|n#L>ȣ g/Yi22:أ[.j7x-7*lݺXo[n=kQϑgh:zhEgZYwY?|læ7,x]7^}O'}.λn0˯[ٻ֛oJv4C/e!0IO ]K}) Y<'%c$,$#* M ×uKES֔)02l$<)׉lkkE#IQiIoq.)'v S5ވ+YɞF(<}@%naxb@NS]C+NzꪫmLFzO NIxoWT%>.'Np9RUeEIR~hl+9o%'kvn᜙---Nk^؝:R;'υ_}`-˒*Y9WIv}LS(G褧*mwli&X?wةʚE|l'~7jrq,]fe{{/_\Fn.$g~_5{]/DYpXaxd5֭ݼ`%K>̟/(I͞?08?vgRI3"8^'?zth/X4Ϸ6ϙ3c板vׇ/["֊ի9r%uۗg[[Z|M&hi0$4wu'W&*< a<>caO%B ''¦ZQz+\0A킯2B͔PU2*rB&+a7M uq544s7$p+9ְc0/7@lNSNxh@v8/$ONe1}kSYݠ0T’NQs'˾\9Jiںuk{G.AlP%d$gVivvvb700x`.wL)}%ŽA\V4#L b=]C=gϊb͑ѱQEAwr뮻ʫZp!2<7y﷾׏K6ۻgGywREzm7tӬY wڻ㎖V.V`Y]v믿]zעET*N_xbX3npj>"}E6EL3H!0#@vCPxc6ՠq\*$r Af#Dys L:!0n".|F8(37cm4B!]&VD)OϐD2NmˎY}Ԇ&hROS;VTٶ\.N$1#Or$ "v&]IQsM"HԌōǎ+&nƵW K*=(!d}?[1ر㥗^O]haD7D_ǢA 3V(Z&bUiXnBKl8 fXE`$Y(5H&6[zHMc>থ=ubz Ø=#s p =ޒբפ.*}fH>G[4eͲKcG(F&.YZM\Qz(x"}Q%”ƣѱ1J"R[7Ψ0ڍ=x+a1U7V5ıLgZ(r20AA;!w섮wIy#8SrZS Si܊ /^PUwڝdrW%$OdU= 5 4OjB(tQY]Y-ܝ肚F[T0tzO8/E+ &F"pWd׺rTPx=x` C?/2yJKI#T\TU5MŌG X.X xlk:*hH m4p?DA-pe5]w|xEh΂^r_.>wu_o%?Onټ*:-^hÆ Q[UL-(\ǒD So~z`Q>$ 3;wn'?;=3kKğҗؽ$*`SQUUC;9B:);pHf2iDZo)rzXff,S%XV2L@(YCuM+pU*9>|Ll6 f)e]S1+ZL>13:3(xu>B %ȋ<9jzwD%ZZ[lF\LՋ%;/8 :/;xEx#&=;~CKB+3O)@j; TI̝$LЪEC&qۼ&s珖k>;cL{$7|c9_,®}2~;akj̜53L($`6-T9I,5k~0c%!UU xBьa`+Z  % Z s()s -F f{ԁ u kخHTr#TpAt$gih  d0c'SK%>#%WDUIAF0Q@4߹Jd2Q(a}q 7臮:;;-r-PEc 13h*l۶ > 7)K (~d6 <ŌD,ؓ0h6 h ?MRP( =@Զ"$\OeG$H;l&d@`&* I@8D^ї4jzk>f&G\QAYX=IpQH|Vtex, b$Y)|٘~ F^$ |S=Q8BR8xRX#x25> < 0NCH]v&ⱎC8w. XFkJxeZ0lkvt:=ssf3ij!# Di?I=:ؓ4D4l{ϞFo7V+RvEvJŢ&7OueU-YG Rj.Ёm&1MX C.izY|T%&UmJT*U Pֵ Xesh{ ( NFXTGvh Z60Ps /ս@kr*zmJA(FXڥRѲRh' E0@h#ib1"sSJ-u  PD@oW@.T"F#v怑dDF2cw!Of>O$!H&|QaO#e&6pTv'OYFe|b\q 8{a\yF'S,.֠Esj/~0d:$aN&PxcG'3ڦ5[#=~;fwd 3|[\4SO-#/T (bIaaTE5MK%dgp`o{ɲi@˦)>a#f 3Rx)2R CUW&J?6bǡw !XdK:+~z&T,]gopK_h 02,dd2 ޘfyI<)' '!7hch1UzHE#ue:-hHxliCa[2i6Z<[-Xo7F # $>-@~6Fx1Qъb@tH0= _b+$2Ug:1YM&g,(\!e4.&rH[4gfkk Ȅ> G.l Wq }F ^9W ,  -jwl۴a֭[3cFG>.7=T F/϶~S!?[K"lR\hHLQh40N *S XPdɗ&ɳi~B!Y7BjqXk0y4eY7rDI"9A鐵Fq"K(ͬ;w>|X,9J/1Q-gB HۢW*>w_7L!Єcyaq wCK ?q}Ya ]T)Kj- $(0uMijBh/U`L/\|?{>Cwu׹[;lb/DJdUKVqNs򒼼)4'ϱdYdUKz({` zux{Ed|^̜9sfv C<09:m)Kز P4z0ĸFAܸi,@: 1VHiZͦLTfV8YQm=rD: BkTh0kWUճrS`۶nCPaBNiY^7O+cmٲeƍh@ꂺQ}~A.IDATXEF^ D+jiU'␾@E٨Z%(N &,qCge:9$#RDn(|0>Ggy:<)2^+͢,F=ʂv Zo:O+ezWHÒeGE\4ư]@  =7$SZOyb`n9Q%R Q`pt"0EG^ Ф`Y.rD0ʒ*H2}3B"q.زh 0UU6-B}* ":nPޖejZ1C,hZhMIP&*S!CD!'`rGAcz晧/~OK}UUBهQ%Pß#aNԍC ga;vDcP|C/&XrJ n!˴gPXJ$e̱l"Lm'JLoRWzĴlp\4ڒ !̀  М ʨ PH߁b-wtAGKQ6Ax0"h*RL(<4beՏ_Pa홤 ?8 3fyCZ `%%e.)J죿`e:[E VQ`J1fÅDvO}ކbHy-Mu4c@E)@x3 ozyM^&npE9>iE !@ǢQKU۴ @nL%4aBn.nq-6 c؃Ȝ֬HUgz͇n ̌`޴ķU/ HN¯*2nYYPR8`&gXA chKf+7YxI2 #fn=\<ۻw_ UTVWה'~ƓO)ںm7l?~fB;w;N`>'Z޷goHk~jϮ#}ڂa~jǁ}nٻ}Mؽ}GO_D2 OPh08ךgJ1~h+*;`(D"ag`^Q604b2cK@ K,Hr)#A,h=V (9&{r'CjIјʇV4JH0NTcSqY21eMCn ˢ,.=NЀ(WGc ]DBi$b xi'Ni~r_l?hc{}Ԯ>vtDZUa-B/KAL u/i( L:t_>R-GR5pdޖ)ԿXm##C? .0 FNĠ* T=^}ѵm-Y5xf)> 7FYfY;X?,yx^C~֬KeѲD"_/{m^YaI8}Gojl }^w _[`"9Uf"&*K.瞮=7r՗ܱ-\^K^撕g7+!C _z׿*j+ep{?lْx,?^GG r7,\СímMM[6oYx{%M*tv5TWU$#Ow=VUSYQ]ys^wՕHO_7-H#Ƿ͙ b> xu];U_xm7ݲ`V={ZBt2qǃ͍G_}Օ^woyjՊV"okzHFZޱAoX Լƛ+WgϞ ʂ *?vM̓pqOCaJ09nˢ0J~%O\aH. NGOcp"kLd'BNsE/ dSC.;?AT$Lƅ+Yt ƉzFc8=ٽR:ȗtlX4#S3[`@,hdOJՕS >Ǵz8V7O$7J: G08$݇=۷đ5__{Бx,n[ۊ >h&NbPгEs͍FCCH{a 0nT#Mg]QQ0Ǒ V={8(zokk۲eL8x>Jnܰah^*5Eini G4!G1SR"G{SH429\TUUQ-ےDQ榆H( F~ӟBhKK FtI]#Hyyyuu5ht %Uu08~NH: ۵͝*+Z4V!i@uƳrkʫA(= C啕U(}p,ԨxۆhsCBdak[+Ѳ2T"Q*VTT iYHt%k֮?O|i꫽}}YW fP*Ж l6l}3$lNVxuP$PUbӧq<88dͲd$ ĻϮ5uQiָHmZ$7,pvuWՖTM5:LI#A͓';zʑdAKıі[Fu뚚`{9әL,p2TE]"/z*1[RyZI35`0^Y'9Jǎ?ۛL&ElN8?҅8QUUyW!T%(W`+ *}#H,ݵc֚*USa^(J ֆh!G"i:urڵk֮ ݂ݻϜ9&taQf> HTU?,D.64\VY}ekʈ$lM4JOMѮ(]q{{MseI.}=;Ni?ީMQTEOEm775CulT:h*Z48y$޿@.S馛VZ ZvW (N"'c56Lؕ ?l߲Otæ6Qw/z0dHwkHP8{0TegbhRa:qZD( 6w*'Rujl5jH#l KIO|h:N}4זAٖC3EkjUU|G:xl͚ˣcG{wއÑxŗg'OwI0Nw'NĨYUUO}_~y*?lO~V[yG|W`$ P||0NR4"Gͅzǒmݺ`Z߶{WXTdW_y}C-e{왻|1Fߚpt/VV)jHrSǎ$Zڪ#꜖^.^eon:"XVY[dEț^U {Nv?s;vEa4lSO>uчkjIܻs+/aÆxcMMP,^yudp&TAh9oOHc׎+U۹k炥Fj7jOo^xsՄ@~wmf xEjzќ'ƛV v캶N;w՚e˗"X%M"Y/)c{I DzdICˆ zYCt8zMoV]…j,)967e7|fߟްrIRu{칾U//+-7z]cD'UcS wg;]ʫ9~ɚ53~qݟ̟\K_>TZW?vt-s[gUT?+W]d3XxɥVhk7ZYgWWEC>ݘTw #y Wg9̙3Kal1 8 EF,PлK;꾧{hhp8\S]'#Z$.n@µ POoP%b{{"UUJ@B$S(l3$ 8 \h ueնhdH{Ҳ•Zx j@M FGĀ&ReemYD UQhYj`eee m $b1Tl85<攀'b ʇ@PopXU塐kO *ѐ*} Gxl$;啵PWoWL Z$NCbڐyhD vtU UR&pńo "Er!fx7lE~jo9k;("#[Q@q(>x$4y]څ 8㍚-A:I{ȱd䷆1}2^- `d,ISZQn΅1Nh!30~<n'=6{ūƾ1$oYҵ6hLlHra?}Z H Kx+"4ɏ~0Y)*Ydz q%N.a1'ZӘT˥|Muװlr,xH SM'Y!Il[12ر/vXg-[Ԕ-Y.]d[n[W._e3=] MdɒE{nk-Ҏ;͝_[S{˪*+;02,[B7d2V[WoEK.x𡪚V(* eSZ`=J7 ,$ DՊ?^1`&.*UUydDq.ZFԲʲhBQ4Z!U`y pByNChueeuEe Q!ux%2j 0/"F{˒*@G"QFaߣJ*Z^VUUNIR4lhBJ=UTU!*qQ"A-@-/(2ٙ̌@:IA MiAU+GHyE0AP4B[ +Pp$ F:I\lYykʐPШ*+4zy:-dVF<5TMo&MhLvWkv ^_:5ACLWPgֳp[Tᇝ2Sfry@>uy(aK,?8~`qȈ'gpgb{g\{h ʶKF![݀Fs' TȘ^E3H,rcccEenXHiV|.ڎ)H<ĮeWW>v~Ol?rUWnjxoagWT1 &ISu#'n G [@q\IU>Jl9L&(c>( '/X똘wx)mV;=Xg°C9d"NtT.g@,Vn:6,I 2 [LAOn%ؐj$#ԭ~!76E6d(liMP~M7mx}e2UӠpYyy(yر'7oD`p8%}iEB0ht0m3#ǎ{Wм ,< !r}}g>[c#C3Vc5AQ3/./(ƒ&~ _9pJLvSF1atcD3إ$r&u )BM@SAc~Pp-튮ra*idg0Ӱ5zo<(W9|ώLR(uUk-[WdӲ j `V*5vT-bqC6u=x_545#!IUVڜhs=+ WIYι:gۜ!誎l\k *GNtR;]yqy29- V4VfdJUYlǤ-648'@\B}90 QI|GQdEUzF_<&o>@q0@hOoL7 1C&+\̔+䜒Yz-h8_2-3G!tp= aiV*Iz| ǖFƆ4K'@ itgI4 ;S2TH/QԘJkvdv]ʤeXR?SBAO@UAي~xJ8*2pQbV+0f(_jeʠ,QBhHZuhZUeȵp'qoM,-s@/>AEPUp1)`4(WE !ln=8뼨q@ov"E ᡰ ,aP *DE4qUq,HDA@\8 a8xZӓL%DE Y q!eV,za5U5~C!Hpiʣ,`"e}I=ޓV)ŨwNs0+kOl&X'gp}" Q赯-$#'5;PmYYqzʒ 2TH/QyD'ȑYRwb*h( rsM)8] ~===uڶhvҏ?Jgp?n㞇iRA 4MC{ilc5V]{{]wٚZwú5 g7KugwL3ii@"G0APp#{]6!ꆁb@MEםP ۦW]2MLG EuÄ=*д8eͳ`9^#LIp7$GqjnQ%QeF"MdIBI4 2,˕U%.t 16E  ln%6 0}#  ^G-EXBӧ(dsԙphDsfdvvZѭ(2_)p ~<@2 %Cq.L UL\Px%OtkqQINkÇׅCzSӕʶldYsϽS0zOl%4uOJkt~cT 0: 3[ >nISnuU*z}en%=/kiidXld d2~`!c q N=WfVl' V*Ndb?%J'ה8WlUI BJ7E_ q RiQ-6LM h f;i]l7 k&{@[d[p.-CFQ@e2-dy1׆  ";r4-RIQx& ^CW H_$ /(~; XfR4T'5 ) ~B`#(= = |ώJ,uzl%fYDPcǎ=GjشrɒUժF߿M$?"VPtyù?x 1 wxhW/ε] *2EC]OJ&m@^x][m^: *C(),e6mT &i'%iɢƹee ,Np2fXC:a20C!~&fХs-eXh[Cپd4R3G:E# V|3Y=B?e$z\u4{3o#ƴAI'dP@=BAT ^RK0:^lO81ǖ̲ E![R/U(FI(Aw=MS42tjtEfoW] Tbt˄g*JNRj---k^600adj e$iL'!isU0.&ٻЉ]i {Db71ba,)c:p ơyPrC ixʦU,(h "z^9bYA\gH9R3C.4a;IU$³<h!sFI'˃|$羴la_V&˂Hh.0c6 glx͇v~bͽé[n+lz¥= o|uUwUIiڪ+n&2c8:_w,?Ck]bmD2.i:#q#N^e i2E9 OundLIb%ˀ $+:)7o>yX5S\*C㒭$'+H{WW:VӲ ׿7'O)+-+/o$E[_nuOIA,[ ںh9W]E?on}}]0D~Gѕ+VΛFD.H,C}?cWg]qUVs|_oY(_嗯Giqb{$,(6MB%8OHFd6p(ZcLJt=M3T{@V^{]ht~Hhjj #CCCdtMkF$8Z2F'ܴ[DH_j$ %t|nUS﷿3x^f:nV0 BKe{;ѡнkھ//p{]2 $Bu-5=hôכYݾc#)hOw8KzJDJf(:/}e+ M-j򕡈~P7cFIUAt292}~oՊ/>b# qRtYY8ّ#G:;;QH$yݻw'?᪪*سV xto_/ 1lD$$ӱ<ÉdGOyNH&9She*WAQe4A,Jw"LNiEVҦAi?x~q}G"CȢȻa;"p*Q9>i$3Z6HfqeY:Lx*<fqI o 2ZuxxBr]߂ֲp#:MkY ZR_W+巃6mekБ3kiDCj KI44LZsQ\#MM h,+$Ҋ9g`C]]}O8?>{$skDkݲUNَ;v 8T[_W^UZs%j/Zc_jj6o܋/5i…O͛3oY-O\P[}]{(ꪻΜ W$豣5MM7a+WWF"}G}tmɒ%ͳ,]_-kݺ+f޵kC<;e63=Meኲ/:<+q6 "t.\Nw8W6)HGSkYCϓlD,_s1޲ɑxle4"y{ g:~ӟ$n{ys^*W^$K/Ea zB#G44DYpLf'َďX!#A=CG UFCX^[PH%QpNo:g5ȋn&-Ch8h$5U9,Km^ UZzz*H`"kb,%BVpϋw#" jdse, Ţg6:d*v)*A#;T4yUJ?}+.YRڪ`0k:i˃u/opvAL`'N|o:~|՗/^#z@ _u岋/jw-;*o^F~W |puׯx{dڨnu3/=niln@uuKxi8O/\wۉ'9>z]4$\P.u+ } /,3z|6CE#),"ŝ2"]/c2b-cL,ߖ P[ʮ(x5JT-WbQӹ@`KR[iaZmL>P : /~\ hbN{ZC΢7d <6몫fjTp5J wΜ9mmm p ?TnDp3GoJ<ށ.Ii}cOic؃VALH:% a#$͵\@^Ȫb͠\`0 Ҫ ڒI&GC9%j% M K쐶3(C[w(}$׼i-hbP ǫC"@WQ3C=rpZ e B 3󍡢gYpriE\T@I/}CG\|d"q9/,]:8q;>[cË#/D_~m΂2u/>?u5yoڰv5kn#ég>-WƓC?K{G:Xwt{.믹̩cOX7;@,A YCB2 0k@akLU{\%?fYK+ЭXمyˮx %p0JRax D5J>D0"i4y>&-#$Sڄ,TSIQwβ }U>VJ7 BT^viEEӺu/^oY*w ZZZf͚DA'h/}Zs+J[H"H`m$Fҽ3Nl4FO >%i7C+)J8hNCy0RPmB Y31N} !QJ./QlDT ".ٔ8gj]7E,Y?H[/`mjnD!kp,b$ 9HmA?o}f55H䷧h{:/C[[%Id!I|Dt!zΜ/]|嚖+7S,TU]]+mk%dz2V%H\0zk ^q?l @!裈 D8 isgPb@b)Ӣכh#E[`@$\0,P%g"QrK6nժ]w}M--b4JNͅHR7DlDE``c" 34@ee5 dD"J#($ɡAsʣaQ~_W?G`|ZeĻ"'ʊuF,rU 7˖qxWtw pIϲ-P(b"O#u?x3(f0M@@,S1ph[Ced=vќaNYD{8۲UUϦoŞl1/W+? Ļ"{n%jn즹 .j\yՂ%f-j]_S ͚^6")MUT .m/K#Ӌm i 3)qD{ѹ6;26рO˥^@`zZjʤ-h^8F@ʈDX ?Y a\Gip$#_Kb{0Dϓ /D3RTR1yWu_YYD`tOuk..$ӧjݺچWqxg$vm-xтtuؽo/Pw[<RtٴumZ2ϜY<ٳO<}رSvlO%ރpǏleΩ(/TOd3Я "#b 20gz؃vPlS"1U]y(A4Q$H))Ts|=߱Cgc,ݭAQ1cTWWɠ,=~zBPfBa&l %\:HEpWI6ŀʮ$؂ɮÁ$і-RLe&܉I/Z[ "o/5J'h =6!h- 9ЋM-2Ph^G`c3%Ak ɩ-GjQYE}?>083頦ZB2(Y6kj:Ǥs^b',t!E@A.+^tY e8ZQevEYhݥ\b{ںHkKu߰|Y -mpU;bnۜU+TU8YUSՕU 55g5-Y0efΉD,-8Dyӟ{S'y3iVP:q02G!n]˲`NK!4V`ԣ9@ޛ4O PgI2c82bA$bj?qמ;mj3p96ytw3]յF2-|@@wpgɼ;Ͻw===g"hY\S3f[qǏyW],M (e$p @K5( =Ug=DKS9C|:b/U _H ȸ$7䣏h{{@/OҺZ3&869QYFZSec?t6T͒e4.$.ɳqp-mĺIE[5Αlv\Sj0Զ`՗ijd߫vQâM;~ "˺iXB\Ǣ,du@ `]iIU@8Eo3M{Vπ 0d<R&Q@WS±4-8v~P`"G1?Cj/9o(:[@1"LYƁ7n6pA v]Pʠ`h `2yJ Zdΐ,cA׆j300{ϞG ۮɉlʀa(4rceEGp%N_ UGԈi ejin,U%n:ϙ?NPxWٳk,Yqe_s序[LМb,LыF QKƤ&䀮IwhiޗYF`W_D·; F9'H38ɬl!~`q=/or` ~ٳ.zͲ3) e\/BJ, WՑAǵVI Y/-n?|Hflmh<ӝ޾^x! EÇ4:ح7:k`02wh$ Rkc帟?kD|'>>c閖K~Sƛv ~Ʀ7Z[[??onyY'u{{[x7͛`'7x?GǎUTV>uz‹NM6`EիW7ßLC#e-_|޼V]|eCCC۶m믻_™3,EG>Hf֬f6n>}; i?ȱY1?b (Y ?; ӡqʲ ƌ 'K- G4CN >"Xv(}YHW]b(6i$SIi! K~k*y#.c;|ӧkk*g4WAtش鍻~i 1m.\&r#eeuHKۯ9a<3k^}5Γ~5tO?n6{O>W|TO\.[6G׍d"/}ݾbʚuc}O>+k՗\6 /PT uS'2uҥ/,=ZP][-\8@Ñ#zzz4v VP:z$Gog&H'ٔy\0F`OZX7>-Byf={.x/X%1> Q .Fׇk&(`m^Gǯ&Ӥ!is_BxP(Fg_`5;JnY`L$d6'=zt}Y]EQ,Fe%u{._NETwqw'HvttئXzVHM^IO[6o?iYDٹ7Yu\Y-d%J&wUh='q=ˑ_׸kko^ޏXxk7\{fn~c5k/{O+_Dáȷ[n _ c?kիW}ok/{wqWZV}cG|`7|cem#>䵗\ Ć׽ںpwKG#Qˢׅy饗,Yώ}O.}( TFӆ( 3̈V]:hCCC@AYx,(gܮϥ/pd$DQtS\x1jℒl[6r՗/_TVU* &"fWh"iZwuu_ƺFPhY\1&a4"9awu7ӫŽ%5k7@$<<D" m^`Aق^:v1κ+RG{._5رksmccݶWT hwo~-6+ΙW^k5|{E+X|E8sAQ~G*|f77_~5 X5 b$/}T_at`dXoRړ=n!U i4JW,Ʃv41y%E7Vd',QpІV?*///@Y±ۮ|H2u3#xC!Bt:=88ˢ@$ȴ}8eAtH;2gA%1> 8ȑ+`L:gt5~yυFӐr(?;DO X,'̛oi;~D_?S<$3˾ƠD" D @NH)kfYK, %JDp4$!G8O$蔿:l^d q d=tpiꁽ $Aae!"HdfYn)ƒFK6>`g 9|.~|Ys0d7j@]~p6 -gÀóJ0(Ek 2n3x_6h'vSwSwgSlN)beR@r,!@(pNwLmƂ![єp82m钥涭Zl9k֬.+ A7}zٴ4}:\G͕$9exU 2۵h,vEzZ#ڃrkMo$ q:=Vt]hA6, :xcVBSmIpc&i[)9}~Fr:#K Òeu ԃeXL3AENEp,JƀyIlȷڬD^eEԌi3G=Gcq [B  Q]:|zOFOQ{֍!缟05%&GUL'9Êal 2 UбLlmD\N1^3wXry2(z!ȑ0c+~̆v~lU\nQ-c.'X`!y4;!olxr0O.' Y_ FN19_vXĮk\wբ  a,aQvoA 1h{'0.J`|eYJR'OjhhB8/ImѿÇEB/<$PIT;3ϼcOu4O|.V4DtԔa4$ 0eڲJ遠,Ӓ$P*ǶtY:_^K/\kk/?#]YfJ#߳s۝?P,Rp~wKg}Kom+ +ڋ?K7Xda E tg/pZZ;xZ@gUdISɮS=̪Ο0X+/#O\vVzDuWUVՀY:EU"=Z8h"̯sZ Re7 +B(X@JA=j5/(KPLg+pG"hD-,Fw+J4AAk ovT\'{9kY h;w\ֲt/9_6wDOYe>MI5D\yӴ:Nv<3رsmxc _}om5TUUd ުڶ}nֆƍߜ5kV[sit* +(at:>|8 _"d&.pxlƍO.[\U{ĉ}~K1N;oƦ{XRwo߲q˶pYE(ʜZ߲uWB嚤jhzfx(| WVV&CDэ%a,Degm'7چK^՗^~Сn>֖cGUUCaԱ'X=mbYa68X(3qQŧS); gퟏwEρDv"O"_H`dZv2[e@ PQY|뭷646q0ϟ[YCcI t X3"OTᵙxWt ʇ ?8~ػ~g˃|}aNJ/](I0p/.5Ms``8_@I+ȁi!i465-\peK-]dy$dI@6[@ EX͔p̙֭k~'k?;-[~+_͛7֮Z_?I'NDOנVT7Z. a };/$Tr\=j έAlm^owϱ# >#rtKQ$As]}݂ y;>tDZGkj*,Nd6cd*j*`t:_$&@O$ T jX`@H4d6m[nm>x[`poeeeÝ/V=BhY ~hn8p#NH$=BQ8`*[nxw|[Z~}Ow$#O~>7};߮E;͛?L[[۬\ Bд`0 EB`yyum=N4WU5CAMA( QǭY{Ȼ;NƓ[RY^lXwOwx,Zv-=zdpdd޶95YyQL NeK iӦS'O(,4g$QI<4]]PUyxl4w8f;A̓g:X ·Ʀ9s̛7> k>o /yͥkϟȥ .\rAD3-Te"_ c=cvF 27rDQDexhHl: zzDA$9+ZyEy0Z1m@O=UkI)r%j nxd<'>ܓeZ `ٮ:*"Ò"kN㉟s~߼\z)x&ˊ6P`6pTlVTPI\Ndf0w&1C`>% ?}+#wSOlll wRmxrtl!&L_{ C=gd<>"IxQВ%tc%M1e޼Yb$1Kٷohhb-Nf8ZVU^vpߞCZjC t Pee Z]& >|q&3ȖeCf(G?'| eEq\ӴEI%(i2A+r***`0oAf &?ld7~ _Q}iO,ᇽ+)~p6<_P>dlj ^%[Bxz~YhAP*ĺzEQqE8_ "Ejz{{A\{zN<ʲl2E4dAڒp z;~Y*ǩ\t֭[lݲq:USAnP@ 000pP( ğ8UU%I gE`mx{ͭo}뫛vv|7ڎ͛w9zt%U5<WٽJѴT*),7xz曇ٻw֭lY}$;~:08HO\U#8a m@Gb#xIC }`/XkF^xW/$x2Eً/?)?%O ?[08 ?8"}YQD.~i|=Ά?8GG'xL g˃|Cfx2c~F ڰ_W[bnc#7 VaǓxƕǀ,E0\&Na^r!BkΝ;]MήnY@_ ÿKafKP8I\wx$.Z}m]Ee' mEY-/7ߌq4`vmuvmm tQ8}L4}׏?}}-fAEXVU-_^}׻gEj[ˬgyOͷժU彽}J V_[%uW8pq욚JEDlX#0_y-[<~?x{o|Gv6gvMmi&Nvx 2ILXoꖄ04FśBkLh6{ə8@^#! NpF۰m%g;D,ڱZ)˖X*#+4vcJĨ?00p p(LoͰoQ+< wu5W_X֭l?/>|_-_BQ4'6vyѵ`Ic;/:e︚ X-M\˂1Z+KlZ&t`` Idolٶ5-d\^]^mxwDC\ ^\m-jNn+--AG沊2bws8T0sHY~KZBs,o hQ}}}[[[sss8M!1öYMW_}DArDW\3e6g[3~(-*VdX %MPO8/&)(ȖeyyK, n"68J *BzԆh/ZI%v@M2QulZB(,TLEyRT(F5TzVZR9}2d+rlxb؜DT;f"Wp6G6/+~ ?,~p6zZv:&(cdT(mBazYx( k$A{0H$rӍ7]wuHTI2"ĪHd)d6^L1̓6L2/s<_!Y cR<Ӕ{ _ S0.Ni,+ (zG> . . C5X$?<@8EE {B0[6}HR䴮#/8 Lq@Vl(  sDt,z%Jtʵx'-}b+/} ϛޱ8hHXUt0Iy; ?'J(ʎc!ٚ< M 840m #Ef0/#; K~09 'rAPѦ ~ygP:ZΆ65Ȇv~ee;?Ά?8~Xp;?g . ou4#HJ43xq! oaq:86`atbE׽ڛny_YJ@ENnr.o0XD2=EYA~4@([ ~cZXiPM0 VZ̈eEKAH"ѳ(V&}Ȃch !82L-i&Ac b߉$s |,=&ECѱ,b'("NJM[#Gp4؈&=fFi:E :l9'I'X\07^v )xn|rҪՙr5||YgCQl7=3^_\`p_MD[V3!88$.+ 4qWv81a)N !Y gD .8pmicYUI]),L42r  rfhb6^gAD-p&:DϨ,%9N[28M*8` ,.$C< 6Sg7 4Л;H*JE,FUY|d ΕEPƄpЄ V7#x\:Oyv\S s17~;Q̆/bS++9]JPVw׋Jga_V6dr?#D8Ey9滷A|!ؙQd,K!d&J>.<a@0ӠFR>Q A -&4uK1LLNL)hPԐb ;\ emΉ qLϡ .ҐHmt  Cl*t<=AgiP!QHwFq!Q$IVexC!2C -%0ɒ[("q+B̈ˁ-&f؊Eb!q@ usAf;~;E{6 g[r޼W{<1xh+9Ci (b 6"e9_)DY6Ã3[DF^0#a *4a:|lݏvW36+QE-!@JIɯ|k?xE%X_bbq]vO`(P EU%+bаh2m"-9Z>bXPdqmEDΡgHl@!I*QLg.PA%x< jD=$={Ld ~GK,_I} .l|Ɔ-gxLljq臝JRbyb 1e:?B6%\lޠ}Vrqe1w`0!fVr1x žyC8K BDXh$=}?/~^|/ZtRR#Utؓ,K <_~iGʣp@xV {k?я\z^Z<+jlA kV}բE [ gYfZQUWʼnPx)RpZ[ig)ƻ=b]1 K@V8>WEe RB'㋪*CѲm٢ăc g?o9ilQ-n17QQ ӟ1~s0s1u/%IƿX,8Ў Z.# خX<-~ ‰dd U`N"1I2ǵu=I ĊA>JJ?"$d F>؄̸ ū|_P߂yCf|4j-caU4Vc IA-?hdbfrZ'6 )E=?U Ps̓B!R0ti Ð=H74ϙ3' wwvGF,ˢ7 eYt ;woٿs/~__~럾`$<Jn<_׿.\X^^ԅ-PU.v .7~UUEIiv@/4-`ιN$3u] ʛsBLUԑSN}{Pp^Q0 ?>|up`?ӻv$us0N/(~o(޽-?h^I6ԊKlW?M6<. Oj-~ _laSn_0ͅz?8c3pp۰eA"_!.F ,4v-{m6//꺩̵<Ytтuk\z%\z풅K,^QTK΂lMcQJzQueIȇo($I7L}c-{Ⱦ[TJI&"vJ%zi;EdC=4'9B/}K<Ѓ@?0x,L&eEL$`_Wx~S]SݵM}o5UEƔ 5- g+  ?YΆvg?x3ۄܵ,?C8),"}>+~ޞEV*** 2*%皦# twu576'n[+oرuoy²Hp\4N^߷er-f8l +g__lUssܵg܋R@o9s***;Bˬ3gN hZB9)(q`ǏgVKee#:P/vޮ)U5`}wLq套454owOut9sP{bŋ.]w߾}_9|pUuUﹺRd突˶*ͯlx<#3иT~𴄯b)@ Kb. W 9Ê8igg 13΃< 'L5J»tb'?@kĔh;d<ڱZ)=k/ZD;x0N7.mZ~  .55M@b i0f_q\gdxxmxwtUljj*? ҆PTlX uyD3tñyUULKGl؂hY!#-FdQt}̑ l@)(ArȷRaM΅+yޢPPHAW݅% rzLANw%]n oӍ0A ]M<~+AY00WWWPQ媕$:%,:,LA PTUU G [yK55ſ/˗744-r-ⲕK֬tEsFQP;Ӯo6H(A0Z E FjAL %q%p8I/[u,Ӡ%ıN<7\YY԰cs: %7脴0I2^"+}>'#"J(C;QsI0m"U#syFC«|@eX~%DcL MS9rJTLYaԘ:L`'Kaf?,˸$C=haByl_\!#7;Ԇٵ j*+gׄ-D 2-N3CD< \GV4C.KmmICe;KMoe !' K]iVs(&ݑIHav`;`jȅ @B/,B)fUpAW">2C|TUJP<  {hτto9&p7JCY5L- ~<٠'po9 E-92'pLEr 2{"㹩FNvJENxW9zQˀ0 ꝧ 闍NDHC|rK, w1z,4pUmJai+ #6gqeA]rL؈Bȫ+ҬZD[3(8 (6ӟ'GLCP+A8G#:+8K@ˬ9+WUEZX 4@@ >w{$kMW!ų6@"t9REҏ grtΊ)ұ _|fr2rӹ68H]p%¯![4( y TjnNJswD^/&R#F]vu~sE¹*˰ؓeȀ&2m%硰rEێMinJ!]06ȶ =ݱC:ܾО-;:ܿs铧8XLTDI ͳrJ54$:6Yr|OqR_-ga*8D6yJYg<8C0-sHSmWy-/M*6748{9OYQ$쬬c\45xk ThSԹD~ܘ:R2.ߟ.h /TDk xK3 `*szE~ 2!}ӪAxcB4Г -dfo`C4i=a QL Tϫ@yMp:᪒#I}ӫ#Oq!x`==%UEHlD^TD4ɰ 9 et}*I1Cd:;¾L 2ΰD/G Đ(BK0& $dVWAq@}y= 3|g [|6sSqV<~ &?c1x_}Y=uVmm([s _|{w/:ygw}ߚ22?O7?4~OѓO>;OtǓU~w~>|]b(TQx#y-^L Xla(>p_̆6iKzΆ?8~`.laSoqaeG?YdO ( UUռyB(K"aagəqxQUUuWV, .q"XvlñS[fɑp瞼9'`;xǜ;fɤhg}JeﵭDٖdSE3I< x9;{;3ڞ O=TMgg(xeVumyo?<ZT$JM-_YXXrl* u]c#ʪxR|T=_?~qq1~3gN ХK^{qpXlI(kqi׮w6ep%UHȑ#sssiC<[ =܅{ `W m% 3nǯaε,bk:aeY64]K,ݰm-;bܬ`$TplYEwpOj8WB!z,:ωԧX_ͱD<dEM$DB%u[$WB!߿׿o׿|w-~ꩧ{z>>O?v~afzdjq !]sTP8_>|rl|jCSl 53JxqOJxq_|X{mߏ#X=\[ b.+6_ Pl|۝w!+(Ic h&L v?avvvxx8JUWUV#D"<ޱ_;}~mv$(YZ\9Kip>;(+MPi>i iA/[l#̋@ Զ9mAQ6ېstݐh;lAu]Dz3td7,ǰl SE^ҌXjȧR P\M*2ȓn4l6g8\ݏrr|W -#23p/-|a$}X/بZzۅl!7#QBOn4\c!mBI<(VxᩋW #g㢱rl @Q iP.yioi !p۰=LW.2u]UKJJ97teXvAQ8u Z[[![vL##%p؜mzJŰԤDSJBI'%#iҌKnpn&-`Ih$Gج$shY=?♇C,KC{׃w޵EwŴ,47s^+jac0G<R]PrIg* U.$Ti"t^?Ea=6⪯؛,S-kIuҢptNw+"{R% RA긕5 ;EדNL`hJ,{(IOAYE+L1_'n@)"b )Ikdcβ"]AEh\J `aWx^mz2q8YRPٲTX eqHG"A"7vǻDQq9ѬrtɱDp,|l$4E4$qtDAsx02,4%AUIAYhI-(vFhL"rӇJ"P.vvn͗>,>vX] yD>7EOr(ZY,F\{zti܉tYL/- Ork)$dX9PGY8N!(˺97%#pA7E:TTUVWWm,o//mx^ ܠ T pHSXfbqțJ& D1-Db&[hݪSl_rT"0*T)9e#ph*H0/ҡ.d mh)EZ3:uBAѮ'sX&^6exߍ,x(E_n9Q*qhyJ{²rneh,]r]Kj6a#Xċ~6W,C,ØNJdQPdY?A/cXIS`74{+.}>~?(EYQd d-Raf hCyĆbۚ 8dy#DLYq4CG20I}U]Q}~/4q!Q-.PRn{e[ /n5"e qˏz<D O:<62,rxl)86S(j:5>n:4sݝ)=63;97+ 8777?3-KD"6>6584>ӈ&==ãS3S#cҺ^4+"46E'',{2疅*xqYW‹˂^6kƗ-[e/8l&ՅMAYѣ[+U 2ίx] ~!/ceEDPi7c# 4 ScC=SVʸwϞ8[c3, /'eqbrɸ>I]|??/@@:v_|ɁҲ_~uxdXpORVOգoyhO?TGOߓO>u䙉၁`*|ɯƦK)8ώ<048M[ZogO4T>ӟMUբtྗ_=4xŗBg{{O5TNO3Ͽ+kďlx9W]$ABh ־jmN5 HuQ"ո!Z_I̝~/%Eu}X+ENjvXgZZگoza=\K~՞쒵oG vw ]yPnRU]* ۿ2$4|F=2\mp4 #bh4j(hcD7J!8ҝ;vȂ eHK8R! X;vok;.s wg}# =( |~~cHyEiۥUjm:rBcSsCc;{_&oMm_=w=04 G#6cڪPJƟz_g?яL$DMG7uCЎ/]~{?px{kKg;]8455msS&'?~Wz]o併ͭ㣂-_oSjmm셕id+nvH77BۗOI|CqBΖ\\YEu}X+EjvX/,鵴~X?7]5^? R̃c>ʒP03(/߼ysiiL47hbQ_*BIUTz'pPyKUPMYdZ|1 pȏ*&' <?*ԩG|G>qziy87R1qKPqF WaD\9<0a$pmwA_jtź暪ʙمwT9j0-VLTٳF .?>x耢ZZTVFyNٲ5B{MӖA+$6f{g9v AA>ti:&m.hZtС=m  l`Q,eK;ȲLKVC2FY4ٖyb*"BDAD.[A Z XZMemd`(DL&S sD, ر#aGŸ̧//|QMMH Pc<{I_amP{(ݱ{+ VT3(B)47;;ҴTR%_eyCw7궨#Ӫ_Od2H$c?ۿ~SYY+N: kz(:L>=}*xqYW‹˂^='^!SIO.o`hOp,HӛE4TWUZ6Bq\W.W9_]USVV>]̞|7 ٚuuv[cҋڽFtZ|pjzn[QRx/JmT3| /ܹ{9~b,]8wlWwܬSuX:v,KВzOgb,)iix{職=WBHyC.^Eu "/_E!SHsOqHeM֖rfN]+B%N<;0?.>415vQWWKhd֧qx49bAOFc]uȯ\Fsb8f.J` Q%]?נsY'ɒ>i rJ(( !W5&|a> 3З ̀+#{ғm YEI^?~ em\9LUkgg5 ק:*Әmhpg,O<#bMN^Iree Wp8Դy溺:[eEQUyhxxdhhfhxӱꔭFT;hs iZ`!RAdYox?O*֏UM5+yUX&19tJxr(M:҈Id'nX,ȩ6j5mM׳z|y$B]-}{ !å˃{du{<J:ElL)ضdSSxaEUij(+'cm*)Tj6'K9fy B0VGo~F!4A)EV![ƐAyIJ!~^Kv% Q#ĘNN , v tKD*TmjHiP _иX塣Ml%1i`%f AGJĮ Pyv+ o V0nM;(EhK?t^뢴~ָu7O+ s"4Vl  ?;*\@nPK%Ͽλ{׽[wv]RQarAlXj!Fo` (:GPug(MoGDkX7za4##ȴP[<+%&Y*vGE rIt2,U]xi]j6I d2 tRU6P$pqȆ l0c'@#G*e2L&AiEn)} U ;!p>w/'tݰh c]4.I.RhU iϙf4ʓc;#4'm˄F$J/h^|r{Tn8  "~삥"ツ1V)}56Fqa lE'^E$V%sf%.nj^$ʃ 8uj;r^z//ǕKӉJز E&[[&YY[4ɉ`Y0v| u>YEIJ&S +l1-.|;-j #iIQ+)YsB( )Gdm*Dc7 l`M ?{mIfJ]T|[ss +@y\{s_"`q [Y(eM$$4mO<}zٓ'o1g:&- ӜnʺiI2=ˣkZ8ƢK~j& k$')&(2/Jn(>eai)RJ$R29YQkUL(L EC%quZ)2<`aj+%)>M]3,=׭3L"$-D$E1LӧH 2kBI LTJX(i ,ӰlK KK6|D2nH#C(1R(=B7ω\9Q^ WN6,x+Ž(R|ɋ2i9E$_Fȇ]0Tf^h$$='^@pĵ1_JՑׅw +D$kS<+iϻL mI|9qо,4JRŋuuuH1Բ#˫pLgq,ڡK\0l+]Z@df+@%–:DY*7 H cr>]ǧv~gzfD!J"ߏk_ܼf(*.x|i1=lpYU0A0t菊nFZ <t؈r  %%P@YA/,@* M\)px1 O$$g|UU_2E~dXYR&Fcm~Y4,EF: vq~6 &5 % ݻ] >z1  /00Pd2<^\,x+ŭ/z(^ɂ}CX6z /2J ,dO W~͏o}#42q ʸ?]?=*[½Uw}}%T]qxVH*ĔєZOviy{حP"}G_?SO,ɢh!COUILE!Me\P"7tMYh4(U  Y} `8H&-&B/-X2eB[$A 1LX`YEţ T|$"| y(%5ЧCΡU'^)S#`D"L> ,Tj9E_<4_xW^^\Z B?|Μ9S?;c^~GO|p"m=?SU[C^gρ|{;x /<‹/:}-zo}ۯ <~g_~ُ8q}G38*-7񳧞D"]'e%c[?@*KdË˂/z%r8'ED"pz.E*QDS۝%X|׏E{斎ʺ9Bce.|mnٲP]R?oæMѱP(b:G?__{S^QwsW~W>OgΞiinҗ~Ѱ잾G?/|`̩s~ˏ~gNml9{'>/A)&&&._?{Wv%OPz{%fƧ?~*ML=_|OMN |Wӟ͛E`FM+Wt4r-\7^XuWpȗؕ /z%,x+]^J ű^Y9e.yz"Di$0Ob?C+63$ *̬e9V-Wm1M+**jQl,3}ָs--H-Ӿ,c>/?vϿ|t_|RSiٶ+"'=#v7H֪ZUQDa"L cYieI-='C7m|g::/ ԑ$/^xɱH$"@ܜ}c8]-B޵l[V7777VVVVTVTUW`!ohOPtMpxiif;Z6m(``wO337[^^e@UU5m6Zq͛kkkO9ꫯAɨAn`o8uNL2NU\ҤD֥䭇|wYY /. ^tXu%̗Eф ^"5 m-KT=F+O_qqU@k?EuIOavgA2b-8 QH?rl4BLVZ8oRyKttY[xrjjjzvMjăhqCKc#WT z%&Flnk:wxSMٶֆGV862kǪ*?{BGQ~{GG}JF"B>RէBT*4?0>6%QYfITQF rBűa0'gF'r>R<+ h Jd ܓdS=/؇>Dz`8R@=ʭm-[>}ٳ V'7}Q"+>x%.伎,2ٛ|\8|Y1gZ2V$[vҤݪd ^ F2Z6ŪZ,;_L#>@Xp>Wf>KHnW$r|oI2RwudxU*ح3vtK%w}_cFB]T3umHkYr__rBw<ۭm077_}>eeUYY?p. -!&]0ptvtvf;m,suuu>E /ck'=Gޱkλ#S~Nw5mwp`Ug;'jK^<; w߶NK/] CZZBpcSSuMm,<~/]`f0$s##CϜnk҈ 'NDS'O}{Wή۶F&ǖPҒmmA?LTy܅K/9w=&'Μ9uܙm۷m) #/*o߾- dc/^ܡŅx"޼…p+Lض+B4Ν;  0D!_ba#V̈́М-2(|UɹQƃU̅.:#C`q"혐.rXjxqӇ?W "Ut^ K]Hjⲛ<(=egxv҈N?(=kk'@!ܵ,/ uazSPT֖,D4\ܪIdxE Ð8 -Fhƈ#-[tcEDADG7󮆺?@vip4#&g%5Mvyꪷnm.F"}C͵>isI$Xˊ$|*WHr{/-WAEUwqd@pӦ"jjj'4RZV dEC}o.I8S`~Ce`m[7TT#ҲSOC>m55uu5UB{zbӦM`` l۶m߾6 CsuUXHssScCc(*+-d F@0;vw}ȂZ=JųeE Z56!r5]2u\/Eֳ맳E2YrAX`(BrQ5 7A( ykY'D!{âRC;EȶE"WlYAYXXIR)fb74Lj'gϞtJئ.OVص{ǎյ[\-A\bJz9K@D0BA-6JgJ zCOqd_,(!"0gr!kBsӴTgYA5i2R0 6630=r @*$i(N4Oq] BaG|λ*+ٰYicPݾ1{Z(T2 `(c4LHei(2ն,4h^AʜW*B+ W1Isؿ[6_siɐGr>+D> g+xoA Uf|gݼ.׏+H(EH. X͍?02AeylfXys<` ~R'I qĆ<$^a,24˪D+fhE1t2i7<-Z8Ǣ(oȎf[,5YejC4@,KQD7RC̣A" |7CUUWS >qhIgqJr8z?Noy r5nUB -`76Y g%u@>^˓/z%,࢒ /. ^Jxqܯeap3=W*xq@n '?{rG[Pi7$A (>/ EӶ x[Neᒲ2ä!Q+A6ۢmZEQ3yA-Ѭ߯㉈SO͙EQ[,3 g҆)Ḣ}Kʊl(V4CҒՠ0QMRM@؜khRX,C H?˶U<=3 `7Hd2)yRHut 5p b8¯ D G7teN'J"BRfvЅSd׺z [dE5]Iܦ-"tQXF,J"zcnvDQ"|4z[P&=.1|ƒC)c8DHe&\L'7644o߶u֊꺦ƖJ = ϐ@#2]c%chtQ -̀C~t y%Aw|/H9)O'LZ1pn J‘4wBouF@j@YDEh-*Ve)/ݚA]sO4-IVQY\`Ci^E5@قFder eI&4/d*2L[Xՠ0Qc0o rr 4R4Mdd ȃ#d(AH"¨@4E cQeZ!x%8"r]34샳9fu' ^iE<|5#,ˡj(I ;JЊ$Q/j8D,ܛqm]8mD 0xynUxZX8^,xynq}s=OlDw mlMRm) lo=* Il %8%+1YqxQM\L˱|~gq>-U'P4x<>g^"CsJ" < QTJ E4 DJTD*(J& Ӵ|CE|P:({E$Q(I$ dZ$^gË6V-r.Y߲X+xR̔8)()zl* Ȼ:c"נS1úLc9MR~{i;νw645>URe9l^$YNl)L%S!ʢm̥ ĄSZBRĤf,bgTs 4DГ`!]bWUlYaMAq BEX4C34 %,KQ0(^D*Ecd2k>E,3&~?=ymצ=;f $ /0-Vz䶵PQvlQp=\ Rz(RuMd~~jjiswfy_ź:Q  dvY@!@*k <© PJZ9Bs0HާI- Z]nrBjNbtGRTS o~qbKO<>O̘Q^Zf?|˿{na>%^9Ka = ͛&mmp?T4;]5MsM(*$ɒ(9!_~B22L ;wi[! m*A,z^) &`~ ,zKk l`[?1[,e!UmomJw 2>1ҬC឴!/Sri%KFՠ1}jtJsMEU@Os-hv^qx[ӵ޾Ulnm)- ٜ;}zghrl".oXRVq}rb< HhMiar4]guӀ5&&'E/()h`OOg+*jkBH__oGGD06-Ky'&cT< =0 mbm./.-ޮnZ:6s[Jf'c_/_(iN= 4Nxn8 ^ /@Qݣ(xU] /nM qL2Eg^ /n * Ȃ}ñnEd%]>U"RuN_&"OҢn !ۖ7WUQ>Ƞ,w#0"\l3LKNJdPiѺ4/w\ߵꚒQ DzEǒxSM1ea)FtK8z;ζ>uv|b}_9afz}KKX__ughߩ>LHtv>ץ'_?th#tɟdkO:]]U yHIiY(MU_\2lnpx8 ?Ƿnnuu!Sm^ >vn_wSWPS[_F}}]J"s{ݶuwLMM_ g?۷oۍMk2Z\ZB_W55+˽>u^׊^dRW}X>80]H׍i@ųtU GSâd WU.(*3s,8wkiʖ?U΍[.g⬀[+RQtkQTDd%uJz]m94$!'ӥwk\Q yz~?(b0UjU}&t %]~\iiYSSd4do=b٢ ǢM&JE d[xE X,' 6/9dKq zqIT}55l EYwLUNJ3*K`O-&.t>MζVNKmm'jIɯ줞X\靜E9 lϷUTUV64onXtfffld4Jܱ% uw PUuEA {vzԯh쬢[lٱc 2MoTAkcEV ,q2Qðy]EpdġQ\QcF́g,YXs$t_:W.tUxVíL8ΫJ@H,<ۭ*hm -Ycz_#(z~ҭ^RuFpKJLEex6ZftJvFedDĶiq8$}MSdUrdU{z!@BdlIƵYСYI+kF(7Mkfvvtl,l݊E<{PI$ƺڝ;w Ȫ߯ʣCd rڨ6ss>"˥_W'?ɒˢ Ȳ28;;?2JXX\Dmo{ۗ??'?ٺyӶ-Ǐoh U8ZK&)R=}o~ww]Bq`@g 0f`] x:re8:\w9[Q*Lݕ> +KaXη.˥+)^hZkvYBr<` /O(.tXUV~WlP,!ymUn%.^܍ê޲T ( m_@__?2ninieyWϝ;ښT2up, G._lMO9s79J8A]ɶ}uwwWWW޵9cu3UZr䀗`%ed\EcK0,ٿUQDRkH?kjk1NƭW`ild^\ٵ{?`%&?,Trzzzfff6]MX6q4mQfsN,?9tJ:8M-6ml}bt4mk` eVbg-.,"US[O&QClGO?n\RRr|ז--5=w664.^\X\T|jmscEMtP*Mӎ=:J>fmt F"ñccۺu+*) Ȣ4<4dYIU޹Js΃Umm-dB 2[6oL{#%}R7o@Y O²>V*^GE21n4ƼlS^ T"@͞iLSMz(R碬'vQBj Y(lqXOq5-7R+抂LAѣt,+-ék.QJJUz) \ nPo" dŋLgg { {U,r[ !@;ڴ.Jgv S%}N3tV.$6TE5YAOAؖe˦ MEwEP|(JP$ I,&Vh[`( 5UN$R@-˘8^>0(n6>h!TGh]@[ֹ[QEv~};]o=O{}s&vGj7LE{5\ug3]+sDvAeɄkΐ9 5HY5#g}tebCCC}(PX!7@&h#X[APĊ};u:xq԰ّzVGxC}>_2I ݓ]@AĜDi6Z0#"gWeɊhڶn (iZ0r(UՇP8L$8,>*|B|n - Gd&O\m~?BN4'$3Ғ/“L&a-u9g&O{\#_'\Q7dL %=^mOLn_Ef77x,FE0܂a cwnIDATT :x(H&>q/ֲL0~~;]]]EP)쓬(O ^LKEUƆa>4@RTCaj CQݠ OWZ* .dsiѳ(& iJږ#o\/Kiѡ,HQHDYQ؞oTk*ٖk/qdD8jASY"0vaE"aM'+ QPHе*u• /z%,x!=bejv?/`_)G/jx9f6k,JΕ,z=سgW MZe /8P:r0B*e(=)ٍ!|$U0MehIY$vDH$b4@BzMJT*T{@ B (͂@pB)@gLæ$L i!]&MuPEm:$I0LTl #Dĭ(jzrP@jT$?-a~xHd$m@_~? 'ǬIWXN{@[R۔dHf7M&g?:P@`Fd/%˳.(2Rf,­V]v׍:DQ^xT(ɫ5Y("Q(g EOOOPqJ.1nUVTԽ1t=w7{J~d -^ܑC ,A9 iL8\RRRW__[[[WWW^^C(Г4S͈PQYht_4@LRC4" 1@pO腅Ȣ"tBM =$Ȓc<h`->cP"+(@kY6@ ϶HN]GiqO:4eg 4=O*BY0E*y)ThG6GORd1U&1z5eRu{DTY[` B+GY2)˃dS8C~IbtG C`|bǎ?rD" @Mghm4 0‰ I44KWo\b fXFlH&bd UEUE$0 4'9hZ*-9VT9eꊟVݲ{I7)FmH|P ¯`:pC9&+{u"! WcYdhm =!za4@^Alp:ò ,վ@ }Nxo6t/˛ 4Q^I Sɘ%r R~4,M3hŒ\ tz96 l`?Oz,RV Goa[L~<'O?UUY!q|0]/-- HD,C\>a ^dXk_Z"(//|P= E5(EUUx À3>oYbxδt=EVΞ=ھhqzLEFdK0^{sQE*|Ko]u^?᷌L\KwY(lqXWoz  /{;8ŅVW^<Ryx z#acSǏg.\hp8A 0S"6zXǡ}8.dIzO9}faqэ͂#*ޱT2.JL."M{Ok76ou[`ə}qmy7Z <(dCSC趖ƚjIR սt}أ+ (?% K^*tw1I*D111FkV:Ds@\@*RzL2ofJE2eIyI=m͛#q/ W^./yAYff;kkZ6>{W^ fr}NR0IlGvvtyh͉T]]mϞ9w~!kns:߹89vBۦ7o/? /2驯_X\8s>TUUYR ]~}7=Ek2}3m.vv8S׵C{嶎TJ.+xwpҥ+ F꯾={ٓ{KKK;7oZvuM͹m?QUY twvu7ڱپގ-[fhrkSOpG2kՎaYQ~鮮MӪKKXGbY,=yisft[Q,kp^quWbV^tW³lfM \E2J7yo<\n)^IE\  +EZD/KA =+B{cH}>6o9SǶ67e\=V@rvO,/ 򕶥EP'W_>uӎӟD2:ݾsOeE,K6=7dD?TYzu{|jij6M㋿_ַOIBŅEUV;O=ا? 5:2R >4H$L$aKwڍak{ω23?\_qpe'ޭΝݶrm%>y;ߝH&wؠ\UUu?ϴn~{O* 㠆884:Qؤё;wTE$~g?c|>G{-3YW]*~闾tǎ~657 ?}.p)-?{ɇO?? ӹi1;CYuG? t}ch^|td ݕҹ)W_ɕ#Z[EVX!ʜ2 SbnN"$:,F(y+R Y̬e] צϙ sLqc,HeY,e)`%/.- 2AWhVc$񚖜ǢD0%Ơ.l۹}ooٳ՛YXFJ$Y,kin{20;$(0au]~_2躑JiPTcӦ͠ 7Q UԴ6\pĆBq\P( MMh"pVCCweYfYYY0?@IbLJR<5|,/€;o#5 )M7-̩eS (h!='d$)JuumCCCkkkII=t'PXũ C--iFyEB@n!MKJKK|jCaDRO$ͪ.+vʈqYC%[7>^3Oعcw0PRUU[YY&8k KJJо(W֭[5-~ڊf$Qa].++瞻++*ARQp(tww\':eE'$٠4@,xqfd5,x+ej+e(56 ltE \7> ^uSO523hTfv@3,O>)}qaq~nna"ȊaL^i,794"`HCI D5Ɂ# Mw碃*Ê(6786>0Dĉ|tj)kb9 :ۂ6'=_yp -j:3 ´8<4<80 m1_ OO㴳e?z%I˴esQ@# ~GW+/+E! ( FJ(%饥]mڕ LePHIBELP+E ÓSS`[ss0z/7/0N ZlG>_g?&AA>obbH+.KWѳ P7^6P Z/n79٦d_kY 1l138񓽺TQZdАLY0d_ǒ?S}痢0w ecnZc}WzxC;w,y<~lێkwMuiwOϋ/v} xwPIiySs} |C{[V\_xṗO:999vӖgϷ/E5eaU8U *K '*Kgs_ڴi;k~SN۷u&0^xCwݹw˖` Sd̙=~?귷_ܵsGYIܦP_zuflxxphKpdddg_lov޹sg2I `!yjjrϞ=eee'Oڽk7|4sZ*J#S -U5m/:r*WWS]QV*?g;|荎}VTv^~4RyoԴC*9B-ZUBۙ3炁Ѷ[++k8p`kueol4W^ht8q,pɆ-u}}7O8RUUvQ:=̣c9RF)s&͏"Xgl%r:`~o8XiiȹvQ(D )Mu~mwײB~`7 ._OaЅwWIGy;?_6~2Y˫\ٹo-zzzP|}}=JeIVL&{2x|rr:J͌NMOWG~yML{w!G֒p0ܺH.--9^y0oS3ôM gUWTL/%%e*D]8P_H  3>Ӻw}*>%-]tqص-DbdrVёP$BEUUyy9(g(e%e۶mM&e654|*Kkg`rfƴ@())i}sKXmEP❁щ0gMe%>-%K.EGx0,$RQQ~666VpC#cuAE-zb N̥t4q-OSDB:zZ(ij+-ON :ҼNH8Lktt%)0ZF}٥^T[j-s#cÑ$Sz}iedtbp|ƐpIdGcHEu/A$* oPdb7qa@X>*$ߺ("ZXOM֫]֯{2o8_l/\]η^kxooZDBH>l%x{dBY@V0haÏ`A1PGk{EQB]lJ]/\.-}+_OsP%G)L -FeQRM1 hn4ͧ(c7[8^A-.,B6We6Etg^|u#<"/iRQTyJBΉ )vM$S>.b&*(ˊ CqD[CߤtMVHSufζD3mKd[O9bwࢦȶT?'> 4URX^{@!±-P?YD9&/ RJ3>YKj4$AU f`_VSSUg* ĢQBz ,.ĺ&[vh̥8Q,NXMXb"zc@L- &5H_:#ZKX`!i񍢜S=_:`oyʂ3HPֹů+r& Z:u5p;R,4dRZC6@G`HK 1x@rD"۶m;1jqMM-?@Mb 6*!*`T$d2oYxu. ^WJxq7^+e ' ^+ɂ^2u0'0^2e^< ^ ʀW:/0xy,/JVk :CFe[JSUW3MÈg N9fӞ A60"-FS|zY=M04{^rM#4 `Ӑe"9&LgJ_Bq^AE9j_W5|(H]V_U֛w\dƦ^~+I/a|% ;R9qt 'V%X31ː$Z΁29ވh"IU@aii.IB>C1PK$$~2/ `~̆ݧ`AX 'ba1lҒeTcc9+%$7qŶK&`S ~?Z0;]!n9S$rKK%(ʆaIXKRHH 6&I傪4!,2>:!=F,`-"| Vd%z$8 il~V+D2\M), *DQ{p!hmXV"Wm5Jׅ|8/^dכvr,~Αy Gd1RܗCi:yAX&+vx )ie--D YD(D;fC0l4U;_hm+'x -p@z\V0CX3C* ,LO!-KRuAL ӭHrxRp/^pH$-%)P9w3:]cւdȫ> $e>r~4iERYd^MYe (|Sb?c)ye3 Y! p,luZ$fC7s2v$ X b) + )I%ҋ(69/3d9ʻj\7 l(DiIe+Rs%ӟ7ԍ‘1E5EMq~gx<2?Ji%!1#,bl6M @aEZy*zHi8, NivU)p2Pt˃~c w{$]r\KͼdEAP/Rm)DDGHx^9Am6(=zVU"N­Pz9Z9yIcFb-2seCd( ^ 'a< ,׵|$uT!F(7ªuNX /t=}KZ2@"{3{rڳ<4ky-Nˍ|lnD= lc?ܤ[t׷/<|cX4⒈k7H( N:'$_` \AW@!8R6d"5``Jb(ʒ &Y'^M,=ݽxl~nTd\i&&1CJEGw;]ÔH;*dy+=g}02Y8i(*KLV 8zˉ.V}hd ^\6 l֫_'伲:z&]/)nn 0k+=޶3.Lm ۹^2: !g9Bc'p%`C .8|O2P}b2v؆eD#+,K72e?}PKSSc.!?&̾dng+=BY@Ps^xnL!CNQD| EoH6TBfq7 ʑ9NebI2+FoeX=,uas1rUywS\uwm[[~+~_":4 a">x:δ #j4?saזV[OMOmn(+9zpH)gN:yH?}'FF@iza5Fv y^}y O˽ -Kjw}FFov2kH.F(2[Ktk57c=[dv~5%D:q +EJ^W*KϛlmCfpvҳ,;Cδd$]"kl_ ɥ,2v9D"-(b6ZEq+0@?6>6vSX-UĔF ]"_T>^{On$(no8:7??7TQZ#35奂m_:vxCMMHg/_npҥG O$H$RUUN}{y\^z:zff.]hsXԷˣ++/_j}򾮎W>:1[uxű΋*^ؾlrnivjđc}=QSC?{/wΏO5m+)-Q< s~ީ{kǮªE,7MZ/RlcR"ո%$q4ʺ&}U!y) m%Tn%)JeigXH3 ݈b=vLOT$ۑ^QhL(RgdxcaaFMc2]R x"t)(U!H U %d*~a4w\O< /<O}rh,2=5i> 'MOEc/_޽}XNGKEc-Oik*5;3m2I&'&zTW8~lzzӟG>ᡑ!rj/\P^VK#wݻyss\3>OܱkPʖ?Ghyߧ>9䫪RKwojh3\p1mni|;w~_0m䅳|{>o޴)Ӯ1MvzKFSƕ})*r3QDRMqO/|oyw_M$v4<]Tv(*p{ R?37 RXsY}cHѢ釜qm.2p}k\r@9 KKKe555eeeJwX 1iZWO [ ;712;1>50c)Y=7Բ2 Cvu]ڵ{<=3uYVz_~vxxڵcfZ6m*+?{|<}{k+>uĉ)P;{-m_zgE]%55բT⩧~sAbhhy";[ĉ[l*x7v+gϷq,rεnRUꯨ(}O?́^ھ{{[j?wa֭iMNn3Ͻ‹{**ϟ96B⯾ʫ@ƆFz) {3ZAb̳eHJiײl /`ֳU]==mJ|dk^KB3 aeh{s}_YeYuAHµ5ih jk>eiq^p/;SccB )b"e N9~C#Ï>֭8ؒmY%ኊHI9:?%>mMe,ǦgL'UYSVRR)+AhR (奥hMǒfyyIv|pEP+?:MH6_X+ىԣxT9ӶHfan<~о!4HMmmgI6qfy}x[ԛܖ_ArGr>К,ɹC(Xu|b(5JվA})zl__9?ҭ57wnXWfexE"{iNnpC8@۩ORՔ%ػ޶kNza6eaɃ $BHF'&&0TUV* 4=cc`]}RȃlmlN-?(>HwP)J;aFM/"EPL'a"t-rO|ORO>xCcO FJ؍V8x"C h) )‘45$ 3yNcەEx98Keڨ7@Vvb)Is qcyՁ!CKQ6B/P&&eRJZ`9E~rR &EJ^?b:X5nSrNݐt\#7JnSV1KrnXWfexE"{iNNY***pe{%Y.))Yxe*%C?BY0l Zrދ&.dڊ}M7m )*22-0%.һ`# ;d9놡sk}HIIlmێRvd0@HF(Aim!QۑlB,ɖ[D-6Luq9PBՈĨ!4@$SQ0U>YQH%-" oq?(zd"( MlZ~T#{Ⱦ\?eI7(,Ĥv5 B]1K ZaHެy>8L&+lĴXԧpu8, s6=jD+SXNh(!MI<|.e9e?Ç9{+--zjÂ4òt^SZ%48vXǓ[s:y  g?p{6 Xy~.2rhXY Hz"4Ȳ&9/m I[_E86'>GGNx`^xM3nvJs =iȧH':z2ʋ>ݤ]d/ 2E7薍e4C{{,ϲBލ!(β(1?, `dCͲxK2% HD(,::`zcՃJ$rdFJ)s,t9QHzUn"T"% \TUo ?(\7E6bQ襷7nb\ fe֭X,v*++aO@1~hǗKd"L.-R (`H n&W¡@cxfXI#)68 8XLinqC0 #H+phq IzRsV$!О'@f̮}vHnTy]?DEh~;Y]g4 UHF|23nol l- hZEr#"KJs6@Es^B>H#w S,P@g 8b3;7vܷ5׏M$cm "Hne\‘fITQtâWxȵр)C/8eESAQPsd}lIY %YCCހhE A8J z3[[= &)RO htM"ȤM-@D$V$L/+-i̠8VfN"i٭P*6 scݺ/~Nv&WV彁V-n{`H Wx2 31t^=m ZA)L&+! S -`lڜaL~˒DqiiqxdxhtlԞ/!yh) =6&1 &k-ߤZ ^,P+Q"Yke+/OEw5PRv[u ψ+BViUwDXO,xLtisһY0dZO,*Mڥո \N;vi'xHq+u^+ wi?}Pd8[ i@ Z=  Cz=aܶlN8216 wtN͏ĻRIAHpbJ Y$).pK<~_RlYxvtLLv\lGgg8I6 KlIU!]erZ˱FGzzb%t=eX ]DIH&S((h)jq∲݄(в uݚw}ҥd*!C"N* !J">|hrj,HaA8qA7QVU]7FC /OdUWC$nsµD!.< 3Jx7 e8Un ^ܭUMqbUn@ <ۂ).Nn PSSq pL& D~Huق;َmɲOĻ{:{z㩸f.% tLLuMLLLM̅JP%A/Fʚ_/},-QE%_t" 2*@^l)-O}r4K*X0TWmQ8D-hĢڶE,NlLڶY%p$Yz,&tdM'ʼnki$j0۴ư&æ1 H,`w,YQV ̅kĿX/se,$),$|3مSg}pUKH+mI"E-(,E]=/ ' "8Co_ {޴m՟lM G9ڶgG{76l458-,-ꩋ==q_w}C{y_ZyщGz$j˶_Cc=غc)s+]\:yGw 董}=c.\,-Ls ӳm;zu娲oltG|я}b LNz~#vR!ϲ7h@/7^Z /nr!FiӤeeuH$u-XLu! Ds9iZKccK؈eڂ刌L 4hyctx78A2Z?ا},y偡޽w|c:[3 -,0MCۺ}~3tUeE8u׹r.:{H%YbĊqOŎKʋyNy%_i%K,QMl")@$@hlwf-{{$|\^̜9sfvϷ3Yfl55646ɉxYq]r]G &8yƆzAQtsϻ޴薅W;~|}/76Ks%M74(slmm%?p|kg>5{{M[. `og%Q;Г^U0zX0zo- W4xp]Y?ho-mDUp ( ?iyuDAebQ~QDyLeF2ݓ\_mAu_M;бSm'MòLEU/^x~Y ؤIw}mݪ*3r $)RDo{=\N $ɶeC=hlۆe |NT<}aΝNYXt犻~ӯ'_xk1ŋjLzd>J$do㎻箘~mz{; >y]0a\`g}. zt.!‚ڥ ab ވrX#+C]<"4%#Ԧ atª#+C]0 a4CxzabyF#a00/T Datu\U,C]f0C ,ŷBA>v,,q) I 6ammN8afC}}ScS"@SKO/`quT|ؙn/{A3W̜(`$OM_?u^Yxյ W]=):N׵+;{ܤISg̸b->p<[Ow] ~塹Mh%I(/ qV?o?٦͛PWUӮjɓ?ߏ}ca4{Ln) D#%5k[_yɒ'?o;>Om۷ϙ=jnq*3a[I9j%YT0faYƾQ.A5Ux@0z)Qb]wHzybFN7Sl.\8zhOO|)SA&4]Cu}hX?/.]vX]J2ekKy.ùosF\=r,d|33d[[MN?=yw={R:c.OMlJe{, u*g{=Y7o1yJZ楺ָ&xپ+tLz:=/ڼ F,ʲf&gb:d,kKavR M\w|A򹖸h̅ ƉI/)'s.n'P`z$5a{^PtWP%qɓZ'܅N%[qmNSj"Aɲf+&:ڷ_>?[0oA>%x_h[\NL>YG%MUA |3lyn.+H/gK"oqk)*Y+J\u-Z"{+ˢDd.VNYyʪds6Mҟ92 ͹663F#A@Yb#X]Jcl*;7#|}2ѹc10H-C ((r` CY,e,Lj< r l-k.Di |WDӴ$E9q}>x̵Qq<ۦǐddXE?8P۫,`̄-38_<ȧ--p"+71ߵ8u,xTQ;Òm dLpsYSP騪Xf]@@RE6@-Ӕx0$ˠY h !/.lh' a)!c0s m.К`8uvH>͜ {;>Q #2VUd&"[ݐ,POD)M%-k@AoEK``BoWPV!@i˲WڪG()RQmaa1(@@+[KG!z*n"Jb"ΆZyh$MՊ@0/ԅ)iea@N9Ub7lCVS=j6gZH4VI@~Ȃهj`uftJ+U0j5Vh[P*; v/p0P. 9vhY$,@ v!۫I%  4L"@hZkA=š̼`6$@K+.̶X`qMUP7ejmCEћ$PM3X! )$$!S5>u,d<ϱ`Čif6X ,˦C`OV}.Ք# A 6Sml@ <$##j:A+A72ƕ$s(AJ\4o`na\J%&J +>egpYDsʙӛᇐ=P](#I㇒s][g̘UWW҂|7x?6p`gYvMÎ4 Wl9}"¥KPc0`kRW2}'{ }Gsn>۷k^;pjɘPQյoAW#(.p@*? {;v8p`ݺ+VܱUV6ݍӋ,Ƣ1 2u]3CEeGyIinL[!7 / $* }9IlDZ(-A8%1oۢ&;p qyNޞn9s׮faL@"`n)U^T$$b]wuϽM2ԁ9ZI W?P-yW~>gŖ֎|6y(!=d>=.%^VhKC%}Yq3PaJE384hu21Ygٳgwww7!bC,.$7lh :4$ڲ%IA"zFxE#Im:\AJvK.b  S ,<2Z,ZjҚ.%\xd ,E72ƕ!2* @mI#~%0׊CfNonnBw`MЃGAWC%{{{:;;aM%H3^2ap( 8vqM@h:pw C0P p6M.g^1s^: 歯LhRnZfs~˟oʉxC>~#GIN%]ϯ_.ٖӟlŪjniZnMΜ<}vʥ/._;o$eуѕ6:s`y R M:*M'cBwÏ>ⲕ9؜Xn{8~3zL=t~KK_D[['rs4֥c=z3ȩtS댉 nݐWD]Wx,/lʗ^Ձ{zYI1i꧟~jͪ Ihjgh5EAUǏcW/{iX]r5+_^~ uU+Vٵ{׮T<̪U+/ti6W'LlOoݶe9T&#\BsRo;oëWmfN/-[x2t }hZ7Q˅ i%ioLQXTPfwlAGΩ77 !+CPAe*B[=. {aU.-esMKP6Dң"SIE:J% =$ 'D"-;sz%@.(,Pat7K*ͥ,, (PFՑCfP/l2MW::;^|a鹳K>ws}ǎr{=~XwWcx #30{#ǎtvm޽}}=-5I{9sFSkˊկ`93WX왮ܶu}پ];w85et}ӔԨ ,(I\}q@AYeFPV1¸2C2R ['8'iJ3#ة`$p>mԉ'9DӤ8 %(mЛ s:lu.ae4\>h̦]`{ߏ}6̀4uuw>rdΜ9}o߾aÆ-[ݻ״t}M7ݴr\>kϿuB*ڹk׺;y<}C|p=Ysymܴf[rÆlٴ{m۷ؖ뮻O9']ɓ+},#aQAI[Z[-f3mN?ߙeiT,}ueutmitKN預`,+77f|7>yk&^ﮝyo<Iz`ֻ?8uTT{YW\1;X]oᆛ/5M ?~䲹L1"hA… W=_-[@tE( A_B%FCEV %:T@Q@~ ¸2T  GP #AT5(|²t;=<ؔ)S겹(|$CKp0#oϟed'6 i^BKĦjijY7Ϟ=0O4^"ȟJ&P7oРvG>G9'_<=|_mΙu3 &y|$0uxϭ.>vpf z⭷o M1d3~(}{gϚץ5P Z[Z,47j bu R՘g͚οmټ̼UO5J2'i./Y:(*VWO784X1765b: 4NT:xʊr8҃ΣiyG?{ޙK755O}[e/|؉@ zmQnPo?\;[cԮvC#4ǂ 2 ۃW C!YϜi?D8~f„ C32 M{A86&醆t: …W+4#Ȫ3g057467a1Mׯ[,|% 8coǭKn9x@6{^9kNGUpvIӰ\OWcϞ;y|OwsEMUi h)}[m[4wϘ~<S@ eYuvA\F3,U~}} ŋ/Y>y|"Tn8scuILG&cǎ764ɲt\* -vV~`r=}}h'#⚪+fh 5KRTbU,iʌ邢#jHyW=|]wګ _|Ux3$h7m/}7e/|^s͗^^_g;:\ߣh8OSU4[[&|_ }P+&?O?n֖ `$Є s9k[:}څBtâZZ[# Z^f Kd~O~O|w>O45&ǎ?7/^` w0;qzC8QLm;xoyX}x.M>,0Ã_paϞ=ly)u-CxH H-[ϭ_{wwDr| ^C >8f=FjZsL&Ji 4  K1 4L*=Žkg2Oŀ\5UHҢ4)?4n&ɲ F{*ϩg[fwOËtR$P² 3Ak"lUp׵}zבe 6EZ[Lõl[cvIryK|ǴD 7B31,^]s,N]]LtMհ'`e@/iגcmP!vD:W500$MQ9B/gg ImSd2T1pyi[ #|N慄:"ߓ=WuT$ q\y_DzVBʂCr 們#x㍸4|*96Jb/!a,<d7 P?H ƀ$(^<>x|I&+ H^"Bx˄ idޚ NE䅘mzl;ON)4,xLp 2Uc,+4矈'4YI%VތQ*FPH744(p۱S)ٱ=W>Míx,.*ɺ4gZ':c#@Z9!H*'$Yr>2G D\dMD, $c Tt?JՁDu2ЁM^</E2 '9Y<,Qt:7L˴t^=8iztZ"P@5iGEu Qv+"l%R&x 1k0C{(z4)1{ZǻLa,5C٣.pC0NUSɍPj LեyM<9: Ʈȹi6RQXb-ӒpәL^т%i0bvyNviV2 C eO&rF.gUZcjLw=~5l6H g"m%UA d\()pܲ(&6Bƴ*˶i+h,t-;7dVԧaG $"A_*/ɒ8׫'O״d2oؒFa0 Y*e[@J&SɁL,f2YU-I*hwnjn"i`0F| Fi3@\Ru yP'LF oqyٵ Fם%ND3 IhY'.9R /G7qcRvk8y  pUUqs|G@G' SD}}]}}Z؛#F|.eZ@$ւ;ي;A-@G\dzL* <@dK:LࠗHFL /D,ϛ&R\6C:H,x8J~rh1@2ͼٌ UPEY0&R [*|TB^Zfv Tj"I @UIzz{5 7 5yP! z!FO0|IrD2Ar< hЛ)6-ESmוQ\!7a9ZLg_3 Ȳ@`lNErcZ UH$4U=ח՘cY"YZS4mbFq d _PǛe-[io̞% mcjĒ% ]>(Ql DCB4UnA `8±,@mםb|w.Y`~2g A`%~.  /egc#6CHɂ(sEi ݁s*%_(,:[DGy@EA:R&3H$@TU@J"E+5P@Yj4=$!׏1=$ZR!:QAՂud‚UEtC:`q 倘"i|*R~"-D,ɶ BUckLMcMPKҚiJ`hXo0%`U̔l3mE+ @Q}V&QKHeTb$s5,ugvRZu U!KjPFW/UrPܣJvz]9PD&ơJLOaTkx$G` O utKJ*ҙ#ZZQi d|>vD6`وmkĸ>#]w|w^ϸ^,AW2;T6tܢhhnAY 9sBWS\YI m(0]Nce_iC|0LtD0GUSi=ZP} ARuipЙ`cb!j*%pB9]ޡdNq끦 ,)x,o"l@Bvߠ2YŐ9q%`e`GHZ *H ʂy@VF!H6}B++~UYjN  0-ȎGgeS0 a Sv6()kp&*B./~8Axށ5kl۶޹b;ɬ?=jD@-<Tm$PU,>yի׭]h6'2L\0{LM{K婲a-rR5EUL,^ &7L^eErOQ`0vۡAGqul0atGthYy}8גiB<6h9\4^PEIEDbDT@FDa-822?D",qk8!^>:^92R1@X@1*)C]0M Cʕ+}ʎ; YArdqpQ/1~r40hn}QiFxkb$4>>.M<}|Ղep Ex۶$<2/ƒ8(܅>5ydE@EPJ& L7FRk`L%%}(O$9OWo@|ţ9~i E[2l#ǛL0 冰yƽ.Mƕ!.FW0a8iӦeu֭Zj͚544!"8 \dd?r̜S[Av }V9&@ /("'}w) 2s\>Jss3S"N|O8y9Ex-7 bg+m޴dWoݺm]]Pd2A|~$q7mڸf͚{RIdSy+[D'hV6lL=J@5DzewU:EcYso?ydǎL2'^|y'u=!#!Oa R %"~V jL>6%%"OdU55jB:נF U ͅԎN:cv I+)Sr%,k8FxϞ=&L>rHYDYP8Ȏ !`0hg0{( C+>ݾ{='N?qD[[ɓS"H.|q<]zݡG麺0ԑW/tLo6K;җz{2٣G=2O<Çԋdc  P^롊.@N>rDUR$A%?zʂ$)  eG{ SUUó{NLzFLK?!OW[\cBa()0 atBT8S<Ũ$;SrczWUs>jGZ5Xȴ$g)AW0a\2DDU~bT׍0T";^ԕP5,G IXF$s1P;Db8ĉ,H̢$i(,c5V#xdh`iH O{>CÇoٺW^ٳg@#P a/p zz4C?p>/'? &):s֌ȇ)=z{\ד$ٲo[?Hb s[͛7wtcﺒ^`^H5.Ud6:ב[$vv<~LlҤ0&: bBV At'ܘQj/SbGP^`}W+{qV ZAo:"@aDFq rw}W_s,ˈe򞯺svF\}WΘ6i`2 "BeEF}mmmNtDQ‘+`P ȧ x8v y]?{nVA`Tɍ"w۳fN7qI-ͭ6knijiܚLN;1m pSm9sfե$Yw{«pDD]r?/wwwþ ǎO~fu8֮Ye˖{P0G}'\tIr?SOm޼za흝Sh//|OMY~'۷+'LI-gx%>}[L%;}ۛdŚ5|i[n]bs=v-Jn߱ߖX~cBK x?O_}uہD<ȣ\Y{{ZP $4bRVYU#V},x.ᢛ;jFU].<^6#{@qQQQJtJ¿#DPnPXRM QAH.)"@aф@H/{ RU8 1"&uhza'AW Ǐ'I'6L<b!l kymq =D=u c'h|E]߱=1c1MՅW]{}L6Ö4pw~Ϝi,B:nhhꆹX.`ZMH}}}dR ?7X'"!Ȉ" h1׏K"1&PAM+gh6<^ReUOKqm'O>s,=_<؝wO~r޼yJijlL&hx,vz衇nZ&+tßww|_7/~iy6ף^g9o}kgϞE)d2Pa21rqeƕ!BJ9NRJF"ZÂd)EYPV1*5B Al zZ#+F%8֪i$ALP1rH~* *C]B-ePQIH]0[4_4lUrB-FKF5IPbYPexJA.$ 7?rܤՏz-3>IWUDÛC"~4^AYGdI_D$|(Yy%u\8N0UQP@VHYyFe39$ܹD2c%:}Rz Eu^L!1  (j e<8w\]-,JX- (}}}DBh ~yVA#_˛[iyMSe8]|cC ye]B/r,dLɞp--:Z,́q蘙L+L: Iw,j㹲"۶cF,W5Ձyc&5&/08aԯJ0jȒ'TI1(T`pryWʬQ CZUxV2*%^A/ t - K G)_U\Ui[”C*$ơG[$ZɁ%*H?AkB%ZrIJ..S|{n:xpMWO]7NOX pQdE@EG w0*lU( Y  0rC1ŦJ|PEB@Yep9Z_k7r]C\|2-]O]A3ʑigM+e&2/};Vj hOzh FQ593CCyxlEQGLa'06Z9'ѷ[{t3<@9V<_ã'71QL,9_Ue91 H/\SDQM>n)`1r@ΠUfI7rhMQ\bOJQ_TErQYFU}s@_ǃZ'RDdjB!UhD_ %I!"1`Ju$7JFpvtҤuFw C H?lmFG~݊Y 3"T)#W.~7-p؈ t*щ+YΕZT1Yn/Se gY *Y)VT:\[eP#RHkTBY M"R;5!ɰ^mF]w,CErXn߽e y-!f`u@v(\Ȏ0䠻vّl  4LYѪk!J Bh! aT̆ iY,Ӱ9>F,e иX,>0Avhij<=*A( 0kt6g͠Hr8-37S)'(, Re`5kI<.)qL&25EuR)6QJޠ7TWDV ͪ^I b&1O*G5vFjQ.0jj]!y?ZH+% `+ &s0T+)Jtn(/B/Hd(끒VV㍣u&RԀ1RI ןH C5P4lŖ?sOkN'x"?eųs5OK fOU% 1 Q?93cm[h(-J+ħ;y$\9ߴ-PqWD |%Gk@ J:_' "y0 I]ZyzGw}2]`cs Nj bp"K|heaj ù;7m%yM=ZF̓Ӏ<kT}6XJTPA \ϥ)g< qDY1\V=$ "ulj "0)ҩQ  QKښQ)arD>bQIzjن.ԎAs#=Y F [P2_ 6t +Fn%2íJ I ;F+PXbFl־@LߏZYa6W ְ Ն!\9bT9f/$oAJƕ&qa%JG] Cv8q"G0͆"#8UULn!7ָf0!pOHaCI&F#J&;}JpPsl p޶LCd8 y &Y<,ij P>҃ʃ" t@XRH.oa84D1)_E}>qA-H|0=ZM2DQ4Mx泅EAqX[z@7e›p11C \;&vs,HW() exzi4&chxFmDMUd/6m`f+EKTݢ'*^0m:a|â8#11;h̞TL/NLYM cU,nrdk9<FB*?!#"t(bK}H'~FMz{Gϊ$Qk"!`!a>Ҙ)LuϠkؖH#EӲ`^AOE}t";qY]i#FׁBESVHFK຦;IsO8Cp8ןWT6en3l nq<ǁkw9_ _ȒN3I(y7 eAa@H~ك҃( y]AK>AQ{ǎyA . se#n;,P*ŧ=96ca4̿T'3F|2őڐIfF`BREޣwRorB^uL'v h'cE4* ~4 AgPM(!T>\CH`,z7iTIB=MUѻPmsAX_!EY΋`.;坓'hqD%FʠZx-=bkB\y7|GN&'YX#:$s+Wl8ˁP ĂA!2j(J|=qhX2A@ih wg*F|0 "jzAɠ`ev1 d^h3&Ig(E+ѥ{aϖ4ǂ܀>CvcMmٿoMu\GBH2 h) =o"FJ7,ӧڎk,[4 j_QNT[3|TQA(*kۻ& A!pq-[={^1oW<Dzi7 a6`Oz\1y.B<{47 p Cƕ!~"gy]uA{[>2 pAx^}{vrQd?,-VqGN!)}{ڻ~=:ojjUeQ,3i/KEw_9_bӧoY&Zځ(+z 5ZԦ1IM~I'ԚWgwٗ> Aiٌj(M:ybU 9DPa3D_#֭[O,fA@z!ϡmHQ@@"̶"*ȴqIJ\YkzqmEQ6ĺD6vV)]r\b>zԄh:;$~( άFFTdEb@Yΰ rAgGi(fN{Zq !*jZ%ы4>m6s*RSˆ[O$Hlʏ @H92o() yҏ"B-"0[r|,GGbeV ¸2 (C]0 at1p<,xf+F72l-Q%Va T<aa Բ a4C[ruĔ" PO[rb/lK9hjӜil9}ڞ+fuVxmSO?up["NĵVfY՞~]˟z'|ꩧ9vC/_~p)??ٲe+;;:'Njd9xŬ;}'O=<MK$m?ëVl?s4@'Nd2KxC%xqb͛=wW?nZoصswf>vnBߴd9ؚ59g+&Mnݾ}G.k8#I3۷mk8A֯[mǎi3g~ǝvkkk fϙsM6.Zȴ'6nxܹ4m +0\ǹsV8q"B޶׶# ]vСΝ>ȑ}_[vm[KeeKKyQ['Lعs',!Z@_w)u 8 ֋K)C]PP1¸K[a#]o=5eW닁`L)s tv6MX4YU||y1R 7.z>0gܼE2Is,[Ͽz^I/tweOK-W_1kyΝ˗}ǏsW LOR|SN͚5+fh9:Ι3WQ{Y0:m/_?7mjZ;}>i믏bCN%F_}5k:p=}3g\bO_a}WwSNqѢ(&)2lnnB@I-XpU6ydwب*IgΘy 76657:wVsau=O=e{AE4ywL3Z[,+=O>+_۹5of9^-Wy_=̳VKoyɻ隅 r˖?ӏ>իAF:4m x=qΎ{{YT](]_ //ݼu̙3z{zwvi_tz*ˬkYEwsWλRŕKZ?z[N<-N9% Ua81q @W‹.8@d.0k*&vVDZ2(Hi M(ymRIumihjeQ@|TY[o>Oo{J2~_?>νr(8]IP ㉏~cܼG?PMU5"x>'I=;my<|o_rccKs8ʠ(DRV5bBS',_Ҷ Muu)n/~_׾/\y啚kimM4vQUJm(隮*j<]fx?/|> (^{_|>qe6 Dr~W՛n174454XAYz<`L4QWoκRIzdAF$:Xt!D-lۺ>}/_f,^|ӆWۿ&o{1,.gK_VXT ȞlcE o= _$Q.(j"xWd3U+֦bgF}ɲ b_/O؀O2ˮ(Syywi(ӒBw_9o;u\G38"#̙3g::: HK8l2$\WQc*7˂Lr+͛{-- YJ]wu/[pkʔӦ͘=g dY$RM3L4iY3HҞ8ICuME8ojnVlvʔ). hGyvl꫋nN 6/ŵ):O M-SؿIWΝ;m}{;w44#BXa81q@WXKe}+x/ضxλڎݿ8ldhִoin\.l&d#3|ӟ߻w44<7؜u-ʴDoow=_Oz$G#wvu3fL6|gg<3LL?-=q(hmH~̘ rmN6>|ⓟܶ};xAUT(CCL uѢuMo~ӟ,`=q<҃؁F ~~P"8$=`|;_y~йȃÿ{i3?O8#{O{xB{)z뷿җ^G>J񍿾wG?<}}Μ=н?O~?͋o>~W44@+4")W̘ysǎ'Id/y睟T:Qy-S_=w;ǏO|%7رc`?' GKW5QbF_*V08r a8~tz#WdNϺ=i11@]w]?;x$vuu77lϻLo@hmg%/ȂymKu1q8yȪ'sc X"r]]]ZV1򖢨-GA$>h!XL%x|n=S GM!/R،'w|OSz]ϐ,/'[J [nWᑒ6MEEe3`FB΢㒊 Kcn٢jPp# A?YguTQp- yVKɞ+snﺲPf1xs~ 'ʞ-rt<_e5g4*Zu31D!yoJAp%I88r5j j*121?eĐZK]`vhۛH$q' 0j`^I2#}*,`ƨc=v 7d(KӜl GKniqaCCh| & bT!nMHCf݂ !,9;k D8G<鹊g6/xΓeEޗ*Z3 bPQ"_#GMVQޥ:Z']J-^m,wMʍ]T8 \fWWWCCq"5J_5j9h0R}nɍzzRv_&ټx]1e7~"* hQA Al|0L3XPEDzeDš WdK'][rEddgbS˫֕$_Ψhv0XQF#7Fv%݀O G|g*BJ&5%D%E =DKT8֢3ln^aM9*u#$(LA}5MGя~tu!^( _xbCxNvhrf0AHaޖD0ί4FaDt X.<!E$P֦*yAPs|Y J! %Sy2>;F χ^c#FNQAP"nASKt]Gq(˛bo3!i+Z PȺEYoVx'?7""(Z ?vݓ[Vi PT:T%xk4%Y` , NK<BMBx%{l5AQ`{G5DZ@go:noLZ/qb&+BbV HZT wQ-/sݠes$W' Cň,a(h۶K*IIrjDbTJI)KMOFqd%:*VI* G(fh߰aÒ%K@YPwzʒxSmm'= }Fޒ2ІFK?vrQ5 n3*G G!q2AaDf0Vd#T}`8؜Sg6H\, IL-Z;)KdbWuEcT$$d c%zTҹN_kjJԵ Ԥ3vM 2x(AjrG#H*Rt8w86~^҅))$`<%Ly5`.t],kѢEdQ46NN5hw-K5 \PaF?h1b_E@x=#O0%KOK!"u9vtT-6fSC\GWH8ެNPuVrxo%@Y³ruT#8MQ}`dR%#wb#dK\%& +Wu8oEq8SZPkrG!< Hg9mt%e%𸏇*J\w;.tڊ&PR׳Tttږ g@ P(]TQ@dyT~%ϓyb1P?;nh2-zLEQr"P䉁o81b;D;';9pxHP&#ː\J__4 ~ $I +%DϻӇ(`+=b!Ap4 9\nnAc޹>DeEWAHT ʭNb":m ? 1 SbQx}%S-G& !U( Syc4kI{"Hn ȼҖuڨUd]j0v5 ahQCԄyTP}W!U/&5QjQ9gkR}7ו@M DY蠉XI42 CGc /8(5iiQ)R"H$乂g-* /x} mhl8EUjIJmTP5*aTe䨤W.X:Z{QL_GP.{ٗ?PFURit,a%h8BpVIENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/device_manager_uninstall_2.png000066400000000000000000010161421443134507600265650ustar00rootroot00000000000000PNG  IHDR!k?#LsRGBgAMA a pHYsodIDATx^%y߉tוU f07CI@===Zi{tIZ$J'rv%jD(8}ϴW]wj3ggEF|_DOs3͟ RTZa@E$SF$)uqſC=#zfʗ) -#|Ȍ" j ÐNDU3yWO\tF*V_dfņiTA`N#LmAiq 隡hK=n2U?_0: SQRoF{NP*#?[銓 -LO9+uu vww?sCC6M̳...nٲe֭\ۼy˯z{z/^055Y,GGF:xԩWCw۷H3Ξڵs(s]2m O. o{i%ϗJ%qGvmۘw}{]r.d0x|||gϞ|2UCYT'~'ܹs-Ϧ}K.\<~9lP(}ݕ{Iɝ;wRW9D! y /Fl>=y;vطoϟ?Owdd ֶmadsb}I&=avҥ3O͛dN7??gwcӧqسi&1> =tchqXB;ɮ);j_ o{クT*c̕+W>j=hmΜrCΜ9\W~=~pX*{ŋ۟kwy'd|Сޞ{y')Oe; ğ^~ ƴBģ-yLE>3E);ÇTեFe3!2U*a$j^?i0hj R joC!mh֢yVT,X#aP+H*Y-V]+ Hi|Ϻn C Vp,$X כ%xyw2 rLXX[XZZXX^^\Z^X[^[Zd{\|XXX <nRΩ3咑O/&1iE3BBNj1FZ/6"ļEȺn1ͶЦ0^+g~!r,;,~`M4Sa# \%{Νcxޮn-L ;obR ;`Q3#q+:S@;X1|6Itr(хĕR4OA7ML}=lۺ#aaBK֛"x(B'NQm 3B>Qҥ f/.j1NRx }_|5 MV'M$N]~ꩧHFFFƴNII t`QJFp"lǹ|FfG}@aC&=|睔b^TjцW{ܹ狥$FAwt *ԢjFaG1d $jPBZ7͚'Nwכ h 4ЉIx:K(bLiLq$l.wM7CHOL0f k8H~Ww~`8ĦM1crZZE4**B>8d B)a' $K)1(lrmh$7AdRu#.Ke q,s Ѷ;\l} Ȭ5 ] ]qYZ69G\VcN5͈y }G%rn{Pr6iKܥƶqp  i#M;{2aM5VR;UP:ԑ_":$p$SO=E xIHLtMm߾}j@*('xb׮]cB&NR="{Xфߐ&c] ϝ0rl2{x7^'3y D?bv U# xZIƩ&~Z!8JT=s%UHWW |;ьDͭ@}Jƭp6pdouH VVe_ځwhW75{<&Ɓ|CVQMJ}UyÀMݹL";.Dd:ads"nck}";"RB)*8Y3h§"Ť♑iPJ[\-l7GE2ᕴ{Lϫd(mY^r\(r4$⬏f\6RI " J)xo/؂DA(̘_X"h!bGtƹzm^\* +$[,`_o/tbT)W>_|hf2H(`vfZ lV2 ɞr1/Is~,':Occ3 &FBA!;]*u|} % zznn6ǹ|6;==?vJ&*e 8_82-9#jح&+гM 0 %fTZ` :JWe|%֊&9[Q(""q[z$KNuѶ ,ے`6 gd #IB5&H4 On(cE7b*4J@BȨ3 mi-3rdG#BjI}Z\evJ*% lPQ$g.QJsL9Ɣ"B2uhZ3#7@ Ԫ :K\\#n qY=O8{U %-$ޑS#.kq&hʥ#.kB\\[M8UTQt9nȯ#uZ0 &GwGވ'Q:A @/^drg0_kα`XBS8POS.\J"DYpf9q}vsIG zzڎ;GhwxKڀPjGCXtWjkIn5QRSLQա`Jԅ+$$q_ś7Eܢ r*-]kalƍJF~%WhlFmkeWr4U@#4Ū&U|WaqՀYҢ**6_cM9-5TGd]oTĻWgn^@q'P}&o+K&l)"w6NM޵ؚ؁~B*M76 fS$ʭreBک:7N jٳgYF?}G6 ULF5Q#NtFnſ˿׾G?+y bqIEL .W™{ J%' P mDAwG9+2FрM2iZD[oŐz8#h{7pz`I3qMآ͚6LvռF1νujQE[ѼPZ56 :5:K_{ B' c:^SZYu_ꈌl@ .&M@o='MӰbϕ;5~fiu%_TIwwOe7aF:ۥ^ ɭzpn7.n tAxK(ECP[ j4zs[r]ASk}kF\`` oB&iJ$Py &ɕW\GyRavf\hnDl =?PX.`2VAW?~{~Z>uMI5T5/|y"RRZ7Ebo_Ckꫯ>SΝ;{SN8qرG^rɓ B.|@DId'.KCDp{'%h0@ʧvڥtam}Wݟnh#/2'ebK/t+W.b?<4^b\]. IqL\ZZv ZXAib\*kgΜ!7t,l02ukMfܸ fa~z${l\ 7Iw`+T2tj:$:Z}ݝZe!ӄ( cwy}s!㐕aĨK4[GA<%C$2 R粹, {5MWVTW/j?@-~uG=)<2)iya9tұyuǙEUTcvӌ{'~r֭8X+M&008ڽ{(i"?h}yy qIi팆\ځvj#.nB\\l7P }ܪAkkB\nxsZyLD\b1QYc'D6uq0R׊B3hBfm*W\>?زu~vU2[Ox[ݺ jY7 5&@?SrKEM]tҩSfgfm+ewyxDWWn,-/PV{:0+  PzEH4Cx9KKK\ZQHmJoo/vQ04=h"iZT@ 2у$n-.--Z} _9f4UD-@@|6h.N%AVuRYm@7u T^ zzCKo>hmgnt5:V nt䍎mj^_ba04a 0[gvD 244D_gΜ!2bջ3Џy" =ݾٲ]vAT> "F,;~ gڱǏ~iqi_oߖ[*J_?v~gg\ɳ6<`1@5`l?^p~qq >Ng`O5t?Ο?"6tc^Q~پ>Chtnn.6hg;wN>fXBfQTY^^+W.ӺD{W^&Q{1Vȇpv1&uр*@MTvFm,Y?3:Bg6 jX qBՆZ:{{-h_Z{|qA t`ul%UU@sѶ[BӈluĈXV x[~A\ 76Y&D 8ޤ;-lш0dpttt`` u*W~S yQò24ցullL*h4_]7ޮihT%;~ 2u}fxxw|{~?ۧ#7M@Y`i;j6ex5c= ›p &zE]$I8p{~9` .v"Z>Ѿ'b 2Nԅu#J:Ӄ[aS*xd8hrl/mݺmڤNAD?n#.][Ylu`bĩ$fv5P̐ȑ2 qqu@@=ⲶWG\:nW "d">г}!V+wvhHH4?!LSV&(Z"\-(QM$mA4 GәĦMtɓ3\X>6:6>6~ǏC8&'v܎ZG7t7t: p J 'zzz I'ISƀLrG3u\LM?& Sa Gh ҥK׮]0*4 Yc!)D~:)m*j7vSq*+kD\ 4!.NEu oĦ#.[%tӵ ˛ ו>dΝw}}w{y;NÇsKXנ 𤂏<?`M ӱDC^m%GZ%^xz]wټ|2D"HTZij 0[^KV{.3s?_{5[ah}ߜ'P crTx<b,A*:@ }Ax@\sDy*B/2شiSEst5US|Ĉ͛7S3~@{ `"4p||ZLEL*Q\S޿mhquMZsV"7bkݮG\ гaQP%{Mw,o6Accd-"t,aMl"Fc!kZY rʅsі(zbbO&1J-A =hxrO& *!"}MslaUMd`ٳg^yl+aT饗_}nnyԲQ;{n_|ŗ_~=ܹs疗Tkt$鼾Io1(bS,-DLO&]RҬT\!Hc{~ٳZ9v?~i4ԐRuCkzc@m#.kB\G\6jC\ qq=C !>`2 XD:;zǏ?O>$kc=F$vck-JN tvff@OOD6dҥK%hwn5`毾so˥lT_G_3 ꕫccl{79ymvvΝ;nMl0ťvwt'[JMN^G.O>s[=BD^6I~ %tZkmHF_ 46i!{{{]p dHU^x sLa{s {0hWhrTjkqˊd55ɼVu`FOw5qFVf$bF#;Nnm9z#͝L):3hSA"@5$AJSVNiwxxẍ́?kQNЏBhAY_5!QJ9x7;;=DI"&Qt ?߯0;|"@4^}t:ӝ_h]ޘbN:}}aZe[l@Q,JU(؍)lJ; 2YBE$@3%znB@ ֦{苼_dCaT%AvTMQuK;V:~km-Fb)i\m+Vh@TX1L:.? GNa*ܽw|0t SAxXnniSt)Ҷc+!>p7mJ# mɌ S=&+wɯZifeFjNmcSSVE^kfr]Ocn${I,p[荷vhFg`Zў">]~QךzW'2?f_@Pzzz\uBwWo0LaZ#:tqO;]&OD\qz!6@6!Blz=&yqa#b]  lୈx׫n҇ZŌDU ،=K Jh24]mk #Y: zn`׷ԡqjB\\ qZmZog$tT BaضMFe]mIXA `P(Aqq=& \Cgj͈WXQu@@=!Հqi l`mG0jgX%"&a$:hʒSo׵З,=&xSPӌ-zeCqn3c|#!ՄqY Cї', ϋI8F"q;|+ kt_{J6vx"&o)Ħ#.[b] 7 AĻR-vTETba3H Z}YE~JY;+/%Ep5 .n@m~-jiqŌ6ǑO$)]d(AjfeM~Votk6ƆjZonMv3bӛzAur[r#.[b]M#.kw6#Bz]5R_@mH KWr Y2iMO}1LXkrmjp}yM[?|0:7`.5#.kB\܀팸6Ck1Rd -o૫HC֙($4!aV/[SúN'fYkm6 i͊t _lf=hRW%%ke TtvW"FeCdeCqG\hB\|["6 qjkjD\f6&.*ZJiQr>e 7G(5AQG,YZB@  բm**Pm <1 Й<6EBRvdrv|_}ӁޮTBow5@wLvt|J">BG!:Ai"w:f3P.{L=$P@i3PrG,s(@TӚ;UgF-˒,R9x|% .Z~3wo=щ'?׿cǎܬeT488@|V2$S5Wܡu "O:oP(ضUf*QÄEaÏwܱw{]wvw=q ɽkہcy!ˆ|ɈDrp C-S^& _g~ׯL/;,7Ŷ^K_{W w4\ڠ`2bإr C"wC|"ȔK$VK%7oJC# 'K ׯOS?pM6*DPzʥ}%eY6eb!֍aQ 2,+G={yP3eUt㋳" )|W\ꅋ.[ BTXLyY'b7-o`rPk q(}Ϟn'ӆc[ED\.IϜ={̙_~=2 *߿ҟR??uWl&^:_?w?o}Rq2Ͽ'OFa{֧}zl֡ё__-[\6Y d1^u i̾knrfʮux+gW;~G)W*+}p~a~zfr}rsgi˶~lڴg}w`\QC2dm&:nA( 0LZ^.Nf~~ayiqG#C]//|S׮Nf2ٞW^}ر}}}KKK_غu\eR M)oXOؿ)Cj}XM+iڐѱ /\tJG,?߿~{ϟ?O_vڑeqʢ|q y?/~p_xk_G>a2ffg/>~_ӧ\KKm;=8aa\.7AZ/77#.kB\\ qq= l`#.[b]MoK8غu#G|~衇inZ :Sɾ/ѵ#r(*Ν~SO[n1s )mD} }#p :P"L:/{U+Է,ӭT0~G4esٶU(,gsTtOuiC IIڙ̊m^*P҅\.g}_q;P32aCayFm jƏ/<^V&,8iƽn&Q}c=կ~3, * }P*KegӾ4$nR*ngҌxX%A[&:M5!.G\ք=u6".G\քqa#&C\ q*PPחaUB^~ߠPdBJd&`E a8DWwO>uc[_0M]mbjm4G!IJ~*njML?~rrr`F@=߾}c^|2M-hԩS\~޽/^K=dվ Q[eyyz} p\yG^<;77=; ݱ Sc{{tiqi|l4Ӻ֫Ao6PMN{l7r B9+άm}c}]V$ !qnv~iigK.  \{__}ɹ=;vfh2M[H5vKBPX>{,vڕeM;9Ү;??co;Z럜o~;"oΝy|>뮾Ǐs=db}}zќ =MF8\`*FZ a8}2>x{}_?m۶0 ,˾vq9Ν;yDZ2R |;>)#4s.m޲Kܺ|ܥ}{߿Τ_xVF^~%Ǵo?q>ÇN5D 4wO:kޚ@v&eb-J#3Vo3%[LHwbF*AS2eůkCwnɄvFWR[Fj{Q"Ê=K~bs#!IFyUA+M DDbydNi 6 jH$ P}H !IHk)sc ko\UԦأ/N"K *k"7RR?Q*/r .dfptJʫ?|lڴ7t\.:${cq -,jhD'ft-&aMZLD+3w]+H 4'ZҪ[QV%#ѠBERVjJh%(pKmMVTuHTԶnh#$= FI;jPBIz$+CN;]q]駟&=<<Օf.֨T@/ 22,5Ҳ{qi#D*.ZUutZJ?IX> 7rHZ/"H}m4ǠuP(teTJRj5"PXRhV~ѭJ[$-5$SUHOشa6q MI2]uZAKOV!EkMw8%F Iʏ~,ڶM]ۖO:V++VƬ-k5mX}{3+WkE+83T\7k@Z nZARDT VlȢW(ԟk!jAٌڌvS1Mk@BZIpXh%*Y)_dKlit 2(EOkPkл QybfjБfP74L*[[-( @o+F+#V?XlkDn ܢ4#[ּh7AL̙3}}#JtƸ7KGvgЀSe*Iev=7"}aT)oڒx~Nql[WFZ|͟)әVH;iR)g3luM I0]m+(e=4#ߖO:bC>㺮Ro;:8:繹|T*TA-HASW$CnZސFQxJL&_.LOAUp\ߨ@LZa 02m32J"#w s)pA\fDg0ˉRA/?͔zmUpuhPHʬi6BD-\Fz8#zdLkG^[E>}8.{ %~ Җ #;D.֔KL3h/D6'+3(S ;-VzaeB/X '0Y%? txp]TKf,{7?ν;SIgi8!s,Vs*/$$ kf-EJ4*{xfض7BҠ֦p-!5b( $7*/L'c;i>QhMCȅP?qE8}ܲ T#iZfTHgi;+?Y# rH4%ie}Pmn*ml32m~t%b{<7~hӽF`W0 y4wlY6\ ߶hѤC xoRg:`r6L9~@O~WvTȠ.ދL6"%8|>OߥM#Id eXjyauͲՁ[Ƨ $6\Wu!+G|PeMC( a4 ppY5UHk`t\A'5n%P uC HU8qm2gsj&kn5i#WG< 5"'>{dѾC5"DD)i{ s?yYs T*U?~P(twu(T7%3m΃.d!.k"lx3g\|UICH DtANZ W9'6c?@tΤ055u…|hbcg2sKN*eTʇ@L%ph)1УG~Wׯ_p\є MTَ(e:ngH+W 2FTӔ;fAa%c" oXE Ee*~j@ʇ"3(D\.д&42_F%eMpTS^Ә#jzT2D3tQ3U V6jm Єx5!.G\ք5*TިX%t@@ze!:M5!.G\քqG\քvAm:QI\Pi".k  뮮.bDo;đ9yT2" hRe2N:֟7uF\'Brr?Ԩ<{Gz8+_ (\1#+BO$@JeYp\D /K듋%CE>0'<}LX9T\dZB>߱gϞ AgϜ9}wY1>0a\[,.]rM8Vv!EvWڶ>z`ΈȄ;Sp/KYLyCzz/٤oF@a i~⑊[48f,#C\ɖJ QOgz=?t m+etRЂa[Ȅᄆ[\,,O]|R&Vl>O/W jf qoԠ*2U$j7ZiNDGͭ Qy+k.\Yu01?QKo4Ȍ[r+V| qPGHrbAx&KK=<}MLL -I+%$,c}w 0JЉ^Dbڵpaq: Q_V$K N,Qz(F%.MK s$\I 6my % ⣏>?0m|K{Y(-z׹sgݻwP{.^p@m3~rSi.Go}u2t};vlwOݦeà_ClnvY~9BDL¨FH];Z霬1?r z~8KiFsrݡm,ss_[(ML C*a]v&\2?cO~%ԍ={ܹs§hc'߮]sӁq{~?ϡAŲ";,r]JIn^H1w,bx/ctri00<,]~;YL2lfX% e2W/^|98m+\zeXʭ[B7ņ<$OUӗk :9g jkoKRKo،ڊk+T30˚ݟm]F{J5ɅG%gߩLQU tI5o~333pd*2_GзiѾ<tn~Ba*t+AGr%A]Op}AT}y6±-y% ffa!JXB/b̳3Q $:i{ppwrrqRNA0?;;IV?NS)3R+Ųئ۳ Jܰxu=>FK.i_feanYU5YFXPx1NKbg:BaQ4=y5 PNF>MoĮco3mmn=8?077wٌ5+cĐ#R3s??عyxsW.Q /#W\7c _w@N T ]8gUO׮]#%_T?Oztd+'X/_{ǎkǎ?~O?}II?‹/8y^:qԕke8Lیhjju+ 0^|ʼn̓C.bbHeߗɤϜ9e1 ̍ `*CӆXN{?8Q, uA[//#]嫗/n߱s2$^ݛrVy'^ӥM4ߝbV LeqqqddD13*é=hh`;PS#L% p\ y:K xjW.eRF_vt{*̥C鱁06Ҏ\&?{k Ho_wslssKKK؜Ig;fsWc=3<+_zAy@g'Y_tɲl"1r5T*>s&O_~}ܵ)| u ܊[.ڹ /1S0,L-5`W{zhtbQ:S/3ψ}Y}L*ggY2YCNxˋAci"wo߼̵;o聕QHDQ.N:COOOMMO^2y469}l "ۻ-+R?vܡ\;Φy7x]CL_ LK+ɅxFŃ2ew˦o] LEX e\>O ΞfR=]{4D#C} ʯRvڠ]=cc|8=_>]xiS/]X6-yO93;)<Ԥtư [_[Z=ã'׾5;ޏ|reɲKr_U\.$dMXs'mx},z1!r$,]իW)gΜ ضmi˖-===HIޫ"$I`߳gϾ}Ça*pv{ܹ˗/~/ɒWe sY0&ܱỎ{u#~]{w?o{w޳+5%gouPCow.<008+LG I lQY $H^E&?]KGc#[ /]8[,aT^ !/w ҄b3ݵ;ww3^-$"nb'?`؅|߷-+l }HGh h:)+]rA6nUj{&Y0 -cH}xbx\?,m@e>pow Sڹ9:en`ԏȏ¢['G}k_ZTbv--/}[zG p ?JȬ]{ l` 1S!C6<& AiNahAL|䳩 #E&r9yO b!ktu&"0Ig<w?+m;;c\5T Q?WE54숐>77O^ZZ.JP,]LNruˀ@|c,̒;Y fSiH&'LX2+ptFʵ {lb㛇zMC:xx;vȠ qn$SdE )$䦓׾V$Cny\Z-˚/-WNT$mZ$ғBV7ݾ^_>wt/xK3^&ry@*JaTq\g˅_rڼ8}̼GVh mȲuǔ.QX]&O|ĉÅoL+/+_ygggeL,LJų6k3 )b<J?000222>>><,_8WEiT*Bz5U۴i͛Ii2aH$1uE_<mAY QX(͜:ןtL4wP$}#RɨK4N` ELK.֚o)R^E1&+z \Ά GdLO(W^.yFI:-\;^;gK6JH-ʄi۶YBBdn_ !ʓF.92S_;}ls.fw*7?-\_zawavrҕtβ{vfha&W* ׌^z^W*hů~%Jt˗=4PKQ+^9cOެS7)o4 fX% fgG~~g3,luqa1͟zV~W-IĦo`~P:L%uy2cbbU,,,@8`qqqiiRE .:!Z&%!u J&&gffNȧֶm(ٷoߖ-[htU~h5pl|'B^PkXSp*QP,LoP"*OĖ`B8@& 5 `&v&\dջ]LJҢ(TO.HS# Ky.-%1>̴r[)jF%%5pK8;7s¹_%raqijz _ lIl ʏx-ΰ?x;{d{={len$ ھSɔG3}}=COx[.w&z3=vXޑ~i>7H>{y|ٴ򕙓_z¼4_x]tqmo|tq2 iԟbR-״R]pťzz~Ӂ_x޷uV2R~cA }m6 l 9lB۟mD ओ: C_Y[޽{׮]۷ogw^H#?%sddBL,WU6_|"@觮~8hE8Ѥ$K;58< _oFabU\tr_m;]ݕrKCceFF %6ox2_,WCÙl*M^yG?0 DQXX*?_./+Jeqyyaq;53u}thdeTX>2ܗȯeH^ 0r9/3FkwvڳsEυZKSؼcS -\JnJ{\_edzFSy|.5==316ArlcO] sN&"/(31.S##CccǏCPQg 0`ɻD#a*W/d~ǖg,͆6|+K-[M)9;Փ Klڴ9r\` n  {fEl֫޴yXO_Tt6 sYDzO QLsqiizzrx/ߕc>?azJ˕Oѝn&k]t--Q+^߻{b&ygL:*C`^蝿pR^Z,݁>xҶQ-ϧә[:lhp82B< ˥ũ+WڵK2Pw>kR +e;rH.Y2 f<#˪qGcp ;O>2',&K=FYNeB!cEyOYɋ^|[>acfis볓#Fs{f+G)gm(E+ir\(, MlCC=ݳss{N\NPVZ5hJEijE4W2%6tMvjҢ7.M%0K]qiaQÂx uª3`JSɼSdbqqPEGq&! }6Ye˶`'OxΜ9seϫ2>99=55?;07wsgnh jaqaqb|"g]R[3K RybbĖCܽmNduh嬥Э)7mz1?o6僴]nHmCc!'0"4#Ce S!, eۥJqjfzn~;S̾t2AX2C@~fk[h_T9H\g^kiB+x>V6@ۍʕ+6)'sr.Y7D/IQ(RN_X58UVשG7!eq/nbs\^VO&[Vn d35ũzf[@5RujscyWA6AWkB\Zf$'#"jOVm8 mUhTG/rO_kp."\"h@ߏ?NÇ[y61RT2w]xömۆ\v^NNM 1$X-/u˕~[6,v`*_,G5p̔X?Ig K끭[YaBa۫ eo g}OgAXrR)y]0:>cCy]M=ıs`? Sݖ"ԿW3T*Q:mB6Dz p|~}xø9i'SS[Ht3dHs2;3(fr א֔%< ng!S?)gL µ|;wccc- _޹b[%Ȍ٦ !MϣA#+VBowLN~_)ɋ[#w5VjE=r9+OWlń\#l: "o:deBt9|3<ASA Ҹ_X^\c'E쾾>Lmm@Dfz2#(P5AͮӐ`ބjZ0T=尐$^5VvlRTL'nhN8Zin麤NDZ QsGĩ$ļV#Ǜ};7Ѱ5lVJ8,ǩjhї8UDofh?Üsf-cl̄rE _IFu]чtKHăouH64W4#~?tzϞLL|P ˜?W\_GPN1T#i + ,̗Wm2_?̞={Re#43;/^: $;Q 2KW i9ws{cYzALK^wyw?8Ȩ\l˜[\F! 3&FJslR(5hT_)q2zn)?fSN"o;fj~2B_^b˼ +NqW30)232͠VMH:&D3t$x N)m QYesCeFoM+%qk8DɐA?-=ؗ7u'ʳũ$ wVH4Ct$h^1Cj#А9 K Ǣ8UV! Ёf }S6uqLa*X>rZeAlcl؄@#9-/#o4Y먉rZKٹYȠ]pȂ@u"ةzʄ-ykZȞ`[7ЖzA&HWJ\#1M+ns}hhTZ:mJ^3T(䲜;rGG,,tɤ+QqPd2YDHM)ٌCܵȭ` a9HS*$ed$ںT*BqdB.<HtT*2 M#F"kM'M ]@G%J?Ѓ6w z1I^OOO!7y-dŔoKby(y ΰBӉ̜ `9]J(MҡbZʮ)8Cs-š R+mn L̰)`^c0=NomeLAi Fd>$cQAT t?[Xw4!F 3:` {-!5PO %hp F"SqjHTJswD[! '鸹UU:lm[Z$j׭~s-b\5)Ľ"GySar6 nI\ݠ1gP3όX3X+:q$D䈯#Vc+Ht 0\ W6H Vћ*Tʙ.Ut@8&RٍɅȥ-[o JGdK"fPΤ+GS^כ8[F*~.>%w xe#`Wϵ7V_ ٞr!9{⊼ y+–PEݑaP0Vt pgqPq#c'}_z(rIvABB\ꕾU  QgH |̔Xr14Dq'2cG;ӵ\(ByY KF;Yww4{K咉jҡ;[}!C+3R)W񘺘7kA-i짃2O))dH>5C&T+М`FuT$ih4עj?0 z\ #وAiǽk0yH^ ȟ*ґN`P:`[3 BuCMKhD  wH9$ިA+\m1&&Z|G{{{ m9 S[wkXv$ WI *7]1K 3lU +;B?@NS$)X]SLD:E8(>A"TmʢJlW3U#dJM&tE3еj@wEo-1n2Uot%0ieVVݥ.= dAVZs":;K$xG6͎kBۚotAE5且Mn1YNv<:KhMa;š9qęrH[ZiSHxk+DA}6Or{zzr;o{g5D T't@E7zT5J*j$ɖ.s"r̸TZRc-$"z#UոRlV/.ѹZZdT@mf*2T7(SujEղNV3XrHMlN:~`rE)ċj%/]pi\RYSBTO3~#^$ECiBu0Nmdٶ5wz<:YZi!Jsu 4ZMգ7LK2fv8u+0:2 kD yclG7In‘آzG,+X=Fǻ G=_5W6ɕNW;$P+*0%"tSF8C%-k*:~mEReҠi ˒X(RUUhHe72uubGr-V:߼?ёD,"#6E;1庈wwқxsHkR"ZMYb%qkm3͠ 5!mOyG6}f7nۊ::cG@wf$Mؼ&h5׭f?$6CF|&pseY(e-+ nǓGSGq\ىuot\ `ѱKL uj*u QebgMBGs#% l@)I_j.Lxi/K@ԔK)|\ZA9E.,+)b,FڣZT.)'z1O\n>7P-Bq}+XO륻mͱeGW+PDZZS۷w _#-!@R̀{h .T>o>˓~%nB oODFɄ5Yq2ZXErrMN? զz%PBRIo_2b.-PUkWۤdQmJ.+dhD44t+(*vխDbG{b zXC܈h9ʚE>򚲙"_7GVMDUw@R*4IcPco Q#Affݕ:'t7~,h&`r`@,ڎn lh}a;Z>FHբҚx&!5oqx{ =zq7yN#5<_ (%SmARZ#RdF)``6D݅R oe|:N&{>!'Ίm3e^%o#J5\Rp1(WPN~ oRw r$UJ6-/r!6DNn%'l=xR~xL UjVI0s,#ؽ2DHYy iހگ ҫEbk8hX] to Gb-ln6s[6[*N V:Kqڬ;j͉ :-}hQ:N%jV%:) D}Ѻoȴ b6kh8 gZGfKbᅁl.?yvGek4ؾyb|nH8WRu C60D2%):`O~z湧_xcKYU4mCBHA+zO( ȷRBGoBB![ "K^ljBr"=QZAl3\CqNyȫ]\rY:B4mݢS@~ ctʁL!(d:au0,APb0-脸d3Qh3iьz^w,;%r# Gk,߭<*N%l}<,lb P~+1Ћӿ4WS*.*-U"VuqA\mt *PmD4#-QUA9̬)Z :TNVtQf7mCZ톫%dhJe`Tʪo\Տxn0VXDw̩Ie[&ؐ^ ^q3MF)QZ.aCO]?•+WΝ;w9y] wgeN~$GeݲX>))za?*,(!i3v\3}!nBvNH"Wɷr= }$ YQY*n*7Z'Oeb(iaw)]' eQlQ\f~„J6'Ĉ=HgϜĹB1 v"D($)LUQj!CF'š xZiS ȼMҰ9o2+ 67mﳭNy|H 벩ȓ&_07`i];3l&ɨ qA(^;gdItcRy>7"MT7~gxX\\>>kܶsWS{v˥G}_/]#YAy#cÃgG7/|\@W7}ﴃm7~>xhS~~~۷]>߿˿-[AGW\ {O|}YXro߾vm>;?[U?_f;6G>|'?ч>?_|9­wo{^~?̅'?2rh^Fe;CL F{R(}Wa#|5wCٚ5;vlft߸Bev^~ٯ}_|ջwxx'S.'2‹nr^G>׾}k`` 1pgΜ]^.||̙s=̿{~M'N?}+׷N&'>s(qCO~uOm<|1G>3?׏򋯍ome-qft`J%Ԏ, LS34:{hhH8(@Vk5k`g=X]]/3:BFȵ{:e -$wmtjswFz$ .nHKɱz54X( kyߓrxDRn68 HH @^^\*AߧR䫇maJey>gGTX*,Kd ťe/ FD{v7_tRUK08лm]{_9rwOwJs? 4tywMrOڽ{7S/sBAQL&{ ?sNڼx}G>ɏnw> -KxӻyӖCM S=LLl޵k]w=ąڳ{>tB(TCX5B2?xkBp#.kB\qqۈ+6NٌxhDoF\\vOxiZ6WjD\Blzze 7.(_,|+.\wuI"G+|#U*f*L Ӑ{E \|'/8q*0rs}k_;}[qa֚gT'V; iD\znO6tx|],RɤLֱ-\޳kL\t(q}7\p+i˰R)xY+ SKE?{V`Z41==?<ܹar-@t[,/*ew-l]._2 'wl?J^XN{{ ~.XRڥr]wXZڔ0}G^yv|A$C}>}3s=G;q$bI=_5@$4t:a),/\.QkRv "b7-8<{ UX.P1R*/_co{!4w:D3rY: +Kc=//G* Pm'b twu9{/__?=#?iNTB~~7~_ӧܹww?' "T4s,f\n:88He4J6}>6:˚#.kB\FlMU VԄ=u YzeMq ;C\wqlhB\ lB\:M5!.GC7cѵ ~5 qY{.kuĎjY qVzĽ~zb5\._d~{{{ O:Of!w.>sBFܽr˗'orF.\WRׇ>RdR.^ۛN رm;Bn(BXDwww6ws|۾itt$ɄZ߷ywGOwOq%ɛD\RO=%QW^twbIЀI803e2ٔaN^+/>Ҿ}ܹ#m{}~g~gG3KYBh9nNm۱}Ӧ_~'teC};ٷoOOw7S@OOWڎ<]K~ѣ/⑻|xlt,Oo>v׿أ\<{8{pd,.l'ih_щ!xiE-"{ʥ3^xW^~yσbV1]HaJ^L'÷2mA͐gTۂ+@[N~fgKZxys;xGX ɶ7vэ*@6;[hXzZ G!RtwϏW^608u&#O;ȯ}ߧhrj B(Duo'>{<˓@w<דF!G~B|NRbQ, }۷{hR?e<쳗Ϝ{s=R',mF\{lʗg t1Re )wmALmپr];7YMQ%\(ʦRGX"#3@Ow}b%z׻~gƦM`Yl+5!')0pj|džtE?1mHA@ӖaءO䩖zA&<|/(Y,Rfi'O TmJ˾)\UyzEP}z1 0px[зٞ6n+0 ~hk#ϚpNBEj2(JnЕRa' er"c4l>+aA%B/fڦm);E R1)\G:/[̡m bf)-I;AMy(DyS"~vXTW0L}NS(9Q$/|0MI/EiFiXVe$ %e%QM֐lX:G,xy\b -4̸]Љ)bytNG,L Y-=ystX#q1\UY7HVS-ioi$<>jAN}!Z:@ RL, 9QbT,݊O.dd2/]3pV$9Oރ r1@|0ګѼˈ\+i,%dIȖ,T๮ev|ݐV̳u#eyW 1;2픕^gxxAn98/ l a֏IXC*0yZdQzP> ]@H?E+zRހqi*5E˃mFGu F,6v:Y:8J4i=tܐo)]{±t:ء[sSt>k[XriH[u$]lsn`/rwOO6K[=$B[]}C".P%eX$%ݖ^.N=Ӆ+?əE;1ʹmc2C# )>}m V(Ja+㢔Ð)KJ BGP,M\P4EO,:Ŧ{{IH!Yꌬ*U66Lɾ 6w7Oƻ!ד !|@n¬K4k<13Ro`V*"^|P,,G_=>1==mmxɳ;3wrRH rӳ MaA )Ks WݻowN'iW[]᫯Muu}ӧGs9]xp3LeQhj)G([D[heh PHd8BZQgDF4}6H:e5Vn+XAf ~ V=pCw 2BP֩ hP\?ГɤT0nބwl1$oQ XHS;5Y1Й눴E}h$"L, qe{K:w>N˼hRA79M9cSۿw1~tOBJ2 IVY)KN@g$y{-ݱXupRfp 0yh"i+YTy&w%тսul-n]@s*H)Ih,mGQduTY ggg:QThZZw1޾[.Yo8Y1jbt $u |E!܏ŲmpmKyY¡PwgઁtGP\l;Vy-`g6} j(%<-74U2p!M3-K7 D0a. ѲߵWr?z+X"hRʂfYn@Hf7wtd00#}C7vCݛ rAF}A3ӧO$bJɂh AM$J<ɶlnj0n[MB!0ِ-}OhH㱘* "gqݹbOڿo~##Ϗ?~౧wH'g?/^y&c}~dGI G?Kj`??`cD" ea85 W!\_V% @EZ6?O3ϵ4*ǵ~5TDf/o?(([*ڷKr!;6z,gLv@MZ848fop:55z}^5λ^wJ8#+?};T9ܮ}~;w>gxe>罗ػgymxnzg>vСW <<{Wj{0۷^= ihX4,Ӥ'HjxFXT>/| P֗JF3G@j}~-LWfIz!dVHz7eU7%eM!@V7\,!`pxSJ:xd[[8QC5qSVe2iSv<Ƅ1u2lEm(قKʊ(P udl/cSlhzۭWf9cvD;]2J3Nݼnko@$%׆̃O n]u#O 6WE~|:nT"wYvT߹gۿy}ݵ57C=udgy{ V~+_ONNՕ.-YYXY58ڞ eJ,𪢦R}_W_/~nۿnީSPS,`+xQDS~HS =ST$YFRNe<9meA1|~P.EL&U2 xКr$f2mW SŜulcr^ʛEqNMu޻}Gʥ3Ç+!uh( ݷK Bm%>규LEEcX&eӦBz%E;@MKnl] H5?-P`uA)\yuCyIm uU_4csڐPK{ ̔jV^V@LwqKf $:"]AFݛRKGsj KmEVBZѣZQc|QCذeZVRɐ9GS[d iZ"與òb~apwU-3z`kZ}Q'f ]B`W&)Ezg-ɢ tlCSr!} BNdx`CN,ע,5B"Ԥh9N0]-,)i"ll !cUi >uг|(X]%:Dǜ7jQFr Q[{FQixݠI4DyEkPBX\kU_[,*; ʱ09WŒhgAF2=\Y?WE Z:,묣JPB=o)/S[`띁|(t def:;0COC.ڰ7(b;$\>g˪H$dIq=CO~Bq_Qu(/ tvvD⡢\(GNnrf,X7\M=BjT!c;kQbˮ @a!W!قpll:p-V&<ҫH2@>LhQNCmy}&#Kf#C RsduZ&|Jg:2#U*˵QM;$o\2}2ٻz?5,W^-xfYvOWRt:D*áGwHrHU5Y:GLe#gN[_1CSJ8 <])ǐLDE?,kt=oզ͛\/U%BIøYQP+^thxAd&pd]_G \ @0or4osi;%A@gpְt%ADI%δ EId8+vܭ+$ypZڎ-.rA?Ab,MzЧX=9AY~]z,Fz$M!M,٣(V]!,xN&3@2KSm *2_eG =:>g5RET YsD.{Ѩ]^35G$`)W֑#G @z z#cXdmc4dJ1>o~-y[G],6Rwxu0`P';.ͩS D@]p '3X{IbWF_#ަ\]JʙgJ?2)^sƇBBj(ipT*D(qB>I$"%< 7x`QlOG277xyєTWB@IyV._h~N[|ACV` 7p±cDz٬8Ish=4TUxQ $$dƍPҎgx.ɩЦ{5pv|`֊pb\peK1Y_Wyi w}?0@~ـ,B|,NX?^٠hZ ?~\ LՅ-^(b[?z n~Jq~ϳؠ(,ɏ<'?|3Dx/ҊT]hZ`s7ԫ0 deq*Js皼c./8+jްfك'[ &ʲ:b,jqJp`b.UKk;ze^69,(Lv'w>՝-AU"lYfQ⡅jY(֕$7iB?IFYmsg#J g['IRWiC9΅**p'9#X:,HڱM-JHP2]seU!"gLU~t%T S/"aD4B@с U u{?ЋB5`驁 tTiF}fάA ^*$Q: G\Q/xcoHͼ gAcoBqxx'T(˥,}p-rt6_Y"BX,9%ǽ]_fhi}V`ׁ󅂪 ${o)|~b`&71t]*K$G,Kޖ S\y-Z |g 亦("8c+ lؓ=](>NM^~ŖK%U]wy~߿yOu-ɟ}߸wWaϞ]'N?/}zA~w׉C7wFg&}O~SO-oo7Ş<_v׿'wh4.˲(J g29J"8HP2adSY".*k-Pt `U :kNr#12In|ws"Q9M筒 bH(R-fd];]=`Lx%ZLYxW ez޾~H$?323:nEWxIpxE״M(- n:5[4󺥳]]۵ʆQ(g hJ$kD" GdUAo]v;~$7;srW^_sȑ~~ԉbDϜ9OG~O<9:2jESR +__|?dGwП^{5{noO-oe`?,xz<[d:~,S~ t}Ճ] cOy?ŏ aD4 Beb'OM^,{b o}ϥR탃ɶtvHnrsDbw8ǢU!%=-Ne 6eeEy1ETG (NY3J׊6733QșfQԘtv8;mɤ2[3_W↵k֮^K3؎].EQ|[ҞjߴqSrlUB4]Ue%P\7l99t__Ƕ+{zzәi68g9f穁KdXa-׵!"'"m9+fad0|t1|G+GĉC>~=^<7ePdrdP4f݆\>{)!Ɩ3Em!gvvX1b!S$jgZ&9za5MfBZgCEeY&Źeт,}PʥiH~w]af3@>ڙ55;C|ߋ zA})^~`:WL+TE-ƒ)^~ e+ǽi~ѕjG/.3Vka<`}͍Ł[>د|nrL:-ɴ`gZЋ0sr###;c6Ae(֩8Y*d vĵխI;I#Fg ݚ#+:sr<޵{G=~|__CGGN߻K]Q*'bqm`v=?Yn},|g~dždQ{ŵWx'N ?k5{O:B87L9rSgw Xzժ6U1h6yp`o39QAbY@HsˠO3XȒ"љdH~@Җe ^bP;E#yYp~:̲HH+:vu*6XD # XM1JϘ3ҟIY!r2G=;amS =}}P4 @Tqs#uúK6 ^y`W{WBkbw[hUGց6ްmm[:)(> ֮]TTm/rޱP(r;b,[*kud:;;CZ4͍6DBǷ?jO:y&ݞy͍IK>22 rzp͆M;)-ںi˦ N:5:1>'D#ۓGdIǕC³gz0RXZ;9:yT8=lhiκ Ba bqUcTqPr)Wli5 Ի*cλ"6:;Keʝ'I-^^S! kBa*.mA5ByH(c:;pn(!YQ>} NayQs1DUU;t&iЫ4'ں# $B%c2I !o E }T*şxߦMSIA H2[p jŪii L,,>lUH"a&)t$﯇y -= / kjP}ρITRyu,5 NyCLrBZj\`qKCƢ  ̻V+5BA% XG2Z'9bD%X>u?b*^Si/jמ݊f::T@Y(v@`C)FPewrd( ,B{ˤ/07 6B}&2!qyкMZ,) {;sYU*R k<; ˶4A80 8lXq̎S*¡ykc;ehiR #%y,D@G8|?Iq<{UC+'wYPj\$ָh*,-بk2Ļ|櫰@r K_$XFxnY!/Y\ O8b~r@Ogg O޻#As#1dz{ԎC (y9.[[ )<OOϞY{_=fCwTϪPwL)eV6ؕױ8h}`vVWmܸQT 6Sv0?^DFG=VDLB(a8w5IRѐיygnMӀ|T2t/t ‹ŢZH>=291n"ʼa B4>>~晧[;qUh$ՙ"#$8 #{TEX\f9[} hr$HqTF}rXFT]8( 7Vɽ,nx Zh逢[InIVU>ydڵǎ /wHSak&2"X.AS&''K2h*),Fiq 3ה|~ШmըI\he5ivDҿzuG:ўmI%߳o@ΩSo;h2|uww?Cٿ:t-w|[wJۓI-"O|dWWGi>0߿3̝w ۿ/Jiɯ~+mRUҗo|H$f3_W/#o($wcx<D@4DFê)/k D,(7@ViLh䠀cuQr&o{uR-t@ѭҤ@L0 b,z>w gv{[jooo[[[>;}ؘ^*C6CS+ \]Q%Eh :L!gr%cctyTBqC[SS2h+\K-zQ#2mN]S#_أT9פ%hh"ϋB$}{7aorwy駯Y7r//F _rs:3S>",[u]0گ}޻weYGoozӛ:20 'ЀkCOu.lͽ_,z_K~k3n+VP8?FUb0ӁϬ^mVĸ_}}p$粖^ ZU8:a6Epْ+#I@JǶA2ojj 8DaI3s]P~~;’L&L>`0O6L,[ׂf񚲪AY$iHO1_>鏒/^\ėh 6X#f(vP(Vi#E1g芸 EGY'r̒U,%-Τ <-5]((Jvhbl%ٕ9CτY}2M2 %7m45uzǎ'iT+;:DPɉ={=vpȩ3C3c(Uh~MbQ쩩vT5" Ȑm$RAś_ڝ;瞟NgR 4V~W7ޒPZ=b@¶EBC8^4 ګ?W]o<|ws.F"XGB0T;1d[???GG[lG?i=ۧ,4DkByaXYOn޳2_E#[lkt\@Ѕ\*RT7s0,4ȼwA@[Bw/,' Uibxh5S. UU%0yFK'[Q+ twv:Ve;)6RR)S 1rA224LLɪL%ᴈF{]NEdof}ʅl!;˕ҔrcR;+/ͨRDp%ΠC_-dAc;=|={9nYN*y?xggdwO/=zޙiOu b3̚z՚UGNX5֖ܵ{W4tdzm= a###O?QCi'N'bR.U9|ߟ>~CtӾWFGKRm?ɓ'oUi=s֮kkoܹks<'h sG#/ۦ FT4I@KZQ\сAi[W˲NYb>Ǡ;66JgWO&&-lƓDtűKe f"UbB(98'1JJMhض}1SxGlV(+خUIv6_(5-tW& EEA֮YH$WZ^N4%qo  R4t0TQ,[ i}WLFc/R<]~-[H$rN[uww$ɁpX^dly!7n``U4dXDu'Nܼys2t9GSke2,xmÆ iz9Ruץ)Qzf:3Y*'WRvj(u:K9@r@upG#˴ teheA5^8v9毝 < /1?rcc (4+*l74rM7\qɶpS,āTȝ{ D{1O]LOO>}\.g0gC0 heO!M}(f]3/sӓqlF?33MkpWOt( )"H./X.!r(e((z(Bo)srP^t9ѱhb7M޶GuEFIreW 8h"y(xsN1 ^h=^bi(,)@7KL x[ az@ iZ4;3m1MV uurYhQ(dәAA %I(!I6칱IL&,IVrI\4jᴐj&rX0 p0#Z fh`B*m`6,˺n^2HRXY'v( !LQd&Ȉt6Dl{Ҁ@P9d[jXgHlÃGZ5?09Ư`?_C`?c_hTl~JqK/~\kQ ?9y*5 ?BЍlKDEULr>P#lX#)=n 2qeQp]+_58Y(%Z% I)Ɣƫ#Ȝ Esy}0 $c@-I/ct-H$&M<؅]Eu]UiZIDed& ͑E=HC4tUz([ j(4_bYPrqy)(MSg#dHEyHBNcRɛA2#8 FD鶶6C!H?H i#aT /(NS5ejZ$ dRoReҹ9[-X"7{k  -M:!@b$ $ֹ.YQu@gF:Ѥ_ILx G sJf~︨LO Ͻdx_@FE{!Rx~kVXkY?zEUb|8e`7bŰA*憽bjV"*`˴=#Kj]@Yd(vg˜SItUY% <9Nzs)%-8nۉcظSy'Da.pc9NYph$hJEcD,73[(b'6aȃh uKS 4J$m 7aX5zfE4 ?O%*8lWG\weeZ59.M J̆&Q)){S1Úz{ogϧS/mt&O-oUaKeq͋ H$ *&^?~G~i㦍ZHΖE8I&e $ *җzP}]ȚγU+@{+@γ]W`-9]\Ï[H#e$;w{Gͩ$K;G}rrĉƞ6!8{J^MMV9H aJMDdhełߗG{4Hfs ՇGGϔJyP'NNM +4:9./F!2gr3'ΌLL8x`̌m۳`6\+ J%0DDML9sB5cǡ,+B5ͼ6O/JR 4bA@$0>IDAT%ӵ^?9T$Z(0~l .f?A%輴5RC8O*q/.:@f8q9`Ҝ \/x[ott^LC~UOGR (d#a,>2H )cShj0ݒn^C4u`LApmEڢs-nߞÖ "Z"۽{ |o?'whx||qx8v=<#==ݨ$#o? egg\vɾ}w~4z{ȑ o'xޓ'O&mO??%IόUXHFexh$a>Lq:7:DP/|*/;m-UyqA9f_DAR7JQқOyJ${^]PzHВ6v0e%|9Ь5hS[Rwͣ*2,XyCQc3LMMx::;pJ2ٚVnG1-<_(xooocٙɉ|`96d!("/:ۮsnmeΖ]oK>`5*ɜKJA@[8ױMۤEP2R$Ǔeّ"?LaϜJD("?95Jk:3k׮_aT2hdTUaX,N>33SN>cg ۷z`>޳gff`A} Pkո>XLl=磮r 35PB..(MؠwJ<WR^e6UXPf\b8Je/9Pgsr6`10naLnS_ Y-P霮H*5Z VjlQ,)Hu˲MM9{dxzj<-Dv]. BkSO=ms) />v.勫V3SOMOϾFe}lt|6;3<2;3;4HЮjW_smܸ)JZ[o'>_{k~njz8v j\|T5 \"DX棚r/RTբ;TIXEUE\Pz_hT"v* .ZT\^g'0[>ԯb~jގEQ`5bӒ Ŵɓ'gffa-ޞLc: =c#G:|Љ;|CGcH,U`׃v;:{+ꫯ${ݶmă&+J$ ԲTu*޻?͎lLUidCţGBޞT*% d2? vuԩёӣ'O81|d&;$FO?zhU_GG:&k2* ȋr$CM4-Wj۶m(Nxa#Wlݲ9m yh'1'N`N{;Ú jx\^t9DŢ-L䙙GydONNng-T挢q݆gr_x5HvCI(A]7Ӣo"ӓ-zE_̱-[xI8Q C"e8mP'&uTWqAYAcy`ds*R)"{Bp*CLES@ I;9Đ~@ ,}2PU"Jk_i |;O+ZJҡ?V(m\DzL3yT\7rŐ]ikLF b /  .nЁ/)XuuYquS i!$ eJ3mXR4]/Klɍd;iXLXEY22XMS0h婇TU BCZHb œ$:>/T 68P}MȎdM/G,SRS<<2W9Z*MGAE$s64 OZѕ`f? 5_P 6V0?:}x! o'h4J_a:'4V hBC$:]-E1^WOʬ񑂠 y!pe.~coJ 4)$.h4 q1 rYREPNVMd5E@e@h.D@AT"SFf͖(RfxA9GO 3ls9 :U.ٴJ0&U ~ ÷` `9^ Vpa~< * *ϛ)OOE .Ϯ}Mo޴ɛl_@8{-R]?OHAU;;vVx)* ssΕWxmPo_xMR;uP$ Nʎe%+T[& FO9zcp9i;iryN",Rk!7-d&34\tlZӹn@mV0΍Q_Rxݥ|#7B#+-D@F hgFx!t/L렕ͯ+-QxF;vr$@5{go)˲O=t{*%JR[{[<8ۦL&DD1V27C8PqWlo՛R;7w lNml[YosmWew o'+_o^_t:@Qe &Y.N˿xG{8i!jXPCQPo{kg wO? 5S (5rxLü@}.tsbYR$%L^ :VJk]7M ,*(Va$"HˈR\l]`] *ь\?o@%B#1t<:rxlrNO=ģcJ$"rЁG;=DE8vؘc'PGsh$ ǨZƟ[tSHۼk6T#ЭTÏkA#u\7b%JPϹ\1* D;W-=rfĮw7RHJp-@8!̓QoP^H4Q7@6\QSSSa>ֻf)Bᰍ_D21>"oC\ёh4h3&~bb{ٳg(DBc#?݅qòJ#75bpfy3Z[QB Xc%([iv>_ t(JK3Q'*)ڽpYwW1UN<7 ݫz>OSo}?D[?3og%}m'۞Yw]?G?]yg%3q~cAcPHû~?c5Vy?'@ME޴iӧ?O>dwOX_c>щBvGsatf ~7{M$5΃:ˎ;zBQOwt#0 zژ6Ba-fX XE"vp VX < )޽Ze5bUEyJ"Jivuw,->͸z,k) ͛ճ"(?la#0*~*%!s4rTU9~#st3w^qH0hB 6:sjtt6eo?׽曷lݒ+MMg:fffN %m}+xr0:|9k(}]i͚57t_q˶JR(/˽7t[/]gݫ%\wS.޽+o}"Hoo}W~el#ڌߛ3_ .{G5V4,͞]het* \[]:a0yJ {nb3WyO 3׼5^z3g~};vWoZ6hɲ 9e3D(9޸t\2jS&K8 ^u-h Ǚc8. E鵃qc9׭ߴiS{{[%4xK[zg>bQ۴=~fx"KG4sBQ?|G=暆k/e:zzz:;;7lؐH$ jR XRQWhⱸӮtTͶ陙ɑ\v#bΎtڵt{O:eut!`+h ٕ_+XFX1t^vK 7|mۆN mXu7v'+Y1TK ,9 FA6 \qBvbv=nxґȈ+poqI >m%W?T11A&'ړnZw衝{vLg&'&⡃p7%.71>m)I:;Y|sE#L"ǰ%Gwמirѣ<ɮ]ʏ|#k׮SUX_ᆇGLB /e3E"˯ÿG>hkDNM7ݷw#G]zfl7z`q+X .:oreaT0n' twgLIXJ/"@bj$X{{{EIW_}ͺ0GiE,rECdvϞ}\~j|<79b4]53 !G],Y-c1iwڹ󹧞~P^ ?C֮+ ߾{v -BcG~-6~G^zٽ޽O-ʛ7l-Yf-Rm)*fw:p{Ra۶d}C2\fо}v}̙䩧Aپ}WZ}%sGOHe>=Ϝ9=x򉭗]w|w܁\dۦ[mm"mOM͖yD%9s18$J>=Upy["]5jGW[,T8S~\ J4"G~t%fKJ)^]إayԢUrtit-eUgYV֩;"$IpXVx|"wuvvx+jVҟ{A5i,d2kW)l7vmDlY:6dc&?KԞP4֮(Ժ޾T2k uuuկ^v]<$5oߴnC[<:noo]iӦёR`5FSL*ݿ~sMߪt&~˦kfͪ鶶ln&WXa3#aE-Èڒxr۶-7\sLGjuk^uUW\q@WW(ںuuVgݸqc*kڞ $E}=7nhootuXv &,++ڸiFS*<-SA~Ý19zB@D%j Vm~mtN/JxwK\9XZ1bKy1,yrA+ uTD0HDeO}}R+.ٶr߶mPI܏uP i(ϋbBCΑD4t!I|85 [UӤ##O=<);VyrZD?N4_ʛ|ժ,ٜm E;}c8gs/e-^6SCg^ K0j9cZeD^1خ( }9YDXޟU}]k"g;!k:e+$UxTrTYh7؊mB)3g|_馛6nԖhZX--AEUFIUd AE"ٖ+0H{ՁHMm@MCt舖a,Ӝ rv@s:(M%*+%8.X[4"Dnܨ!%oUO-.DU~b+h7Y]Y5׶NJC@5B 6o'6Pȑ#iΓ1MkRq#ZݽwiL&֩P&@vLjI 7Y+=! h,c8)jJd" JiNb;MA%4 68=諄 F ˂Ȼ6H ہ{8ng䁒Ȱ C[ GWW ZGۀز雈ГZ<@8JAY^ ;x(/ N=K ^kGo%h?_>;_-~*4,;xl xjGW] ?~E_.~5kGW] vyUQbON-ذV ?9Pd#! ^7gN2 蹁:z::2"W Ah ÞBq#lYh ّ S)z2X6ݵftv'bi 6(Zw-U.o xs*ZOqL6_q{lڙ7k F):.7d4h8nW57G| Ip "!DžP[SD+ lfvo޶n7FQEtM  $ӻ4CoČKo]Q?FX]Y ziaI+^Q$!3DhET,=C"OOp\ ᥄Xx(B4W%6d!F"@RB %7N5JVP|⢨G$B+,\h^5?J&'~1Xxk;'r# t> RF`axH X4eL)7@ViDAe=Z$>͚TTrOwF%@n^WV \$a~^{%8䀉 70ѣGi`+_olͦ##r"*&K2}ߏQ3e;Ш>j+Q9iphHeO3#؂m nr.*Rx 'n"W%E۶HZF\ӲcK^0m݆@v]˶QlKR:o@Db | 5bXXEZ7ce-25|}C;H!M9) 0,01`#aC`φ0v"1x,(JJHqB,JV4tM) a`&$3&RdUȒX*P TY Ih]MSCqD*XHJ4E84D΀SJlWT%K* kf$jց$G`+XAQyX2S|  *t|"K>M!6E싎J1݄a%[ɸf+]9$B8jL0 EہGtwADA)9XE˕ivȢ"+hF |n6p.B3Z4_.-CGh"aNPd7./ 㨒 ”@$.7[&W S*@X]QLLFP(B5 <Hh˥i mY4EDABeٳْe)K `&́[@,݋yBY2S˺m9aI" ##J)xV\|QU#W,'~tjjGW]?~GYJr8U*á9ZB:L&QI==|mV4uBa Mx<1xiıLNYR729 n-m]$v ˝,κޢ'۲]4\RՈmp"Kl@DEU5YĀ.e.#-ExH+i,+` %5re=6M3`zېw 8}Y5rM& X )YXBy\b<4V!_(,;Mq( "x dDAUShՉmOھb$}T_AՈd66eq:( ILVp?isD/D@(*4[~8g2OTѕjGWk~<㚃u#<5`s^ X;?O%K2XMKS?~_p N5 N~yl]1(Fiu*޲` 9YTvg*A%V#3[=A $hu-S%P!H$J26'rel"?vd7$;ZYKk-NtDE-$/xͯZߙpc(qN4hRHLCvyYplޡzX48&+Yr͎͐M 2DVd2jhc9 b:(HGGFmDX ,5Xh(+ xlzrP6-ͦ)fsH$ + %|!E':;;^활DKDAi [@MЦ g i{H*.ɴ6QӈhzJ;rFQN:N! K\& %7B}KVc]|U' tufD}tF]7Cje 4kZzu@C;7h:h`T#ЏxuW~o&FjNM_ՓIӜ $,| @ Pz$X0ijA9FH)͋Er [Ja^Twzjf$ozEMUkֶMK m] {HA im`TZ3}S3Z4h@o6c ٗRqddtF az?Zӯn;~o'C''wLAB!vɉ/H<C+*\>1 uTUv-MБ~pÏ>fⓟwwǝwڹS#+Clvf|rk5M=;=*rmrlΡכiYeDԘATUU[6YYH0]5*KsM2EU wuTr],,-Ѩ$WFJ湖,b}|1߯pk62_مna.(.5hd%/?9}a1of\!A=/4JwuA3sW =75S R!H a-xcPxqM،i~Ne>0 NDcjajVK/⻆8G-OB+X9#_t^(s™Y-6%Q\\tKa"mTHHgyu 84;9w !ҭg{p=yFXw>tmCWoԓu}ewW&cǎO>} B`Vo#s`rjZQ'|;8!6TMҿk4׿W?kf~ {D_oѣDz9zIs5UegeYa/Ћ0#=iY7'@ e ɋeYm[ jWꍷܒlkm[Ưd{i[ >T֍ѱ?W U !X(KeWc;<ϴݜi?ݻxGG4@zxNOO?3߿p|!ɤwݼyuk׮Y3>::=5K&ֲeknoǒ\1?=1m753y_qۿ;7nD>y{6mh3AJdwײ~K/ehͤYA+Y ~܅T& u]`1%)AYDW`1F;Кasr1li1~Z-PNݥ}ɲ3kKf 8!j7m;+ |ϻV3\ %m %&'趫u79z|>Etwuuyˏ+A~>MhSB{=_}wAQ\+JSp$+@֮]ɀutH@_,òLm.֯_d|f4A;x .\~t%-]5^/cO~K~U+5 (ΣY5 ?~TP8;B\=υĂM(6,*d|Kn%+;Mw|dzC;=ߘEˆK^QpeL^'yA^*X4t Ci(˛_Эop:IRBjz[[d:-1Κ):zEdFtޑ*)7x[P(kl>KĠ F}gX햍mcǎM槦gʥņJ*VZnΝ;4M[z_ RA@\ʟB`1/6{?VڷUW]}ɎMLU ,)I"{A L~Μ9ض ]qo}[{zO>=44ĺmnM-V:XQ5\7˶ Lb,%p ȡ1M@Hu N8ѴʓcG5{쬢;ӣ٩٩T~coȚӤ0g3D~PumɴLUq1x۷m|[$Q?~cg;wXO2[nÇK`ޖ\ĉc?}fv45 `(ǐn8Q=qo~?3ct#]nbt,ˆIH RqF;v7 3HM* }K{=vW\}W8p`Æ &OgRO,jz]DH:d$ ȂKI,/;y>ަ:5:5R2 ǭۮ{U6utj>'Oph86)2C._+z{1БczY_fȺa>}Ze1AB8kl6,)ro0ISŢіDѡGGOHUS?W&m][2 F#h#ތdAٿl6 {zJȰ=]=(yc2f͙]:^K/EyR ըk=AM 6l٥4'ĿU"hqzA+0'΁{4B^57ۿ.a늮+nh^j4BwmZEp1 %蔽H 4sR¡NŮh~?qhƜ2k›+7^/'!)a/xCh4\&+n2M4jܺh$-U/Jf6w5պQ֨(4]f ;I@ \`.hq0zs*tZTcҞ{dMb=]s ;;:d=#5&`替#; `Q T[˦ V\˧l̈́rDwRbpնpgr2Iv4n#/qAm;\h4l6oَ Kx\Q2J R9"B6eMC$:z%,+穁<5`ne- 穄jG^|A5+ ㇲizT8!?SvHCrZi5sA@9XV.X 6ga Lg"_ѝl3=m8/N1ӝ᜞u-2/**8*?=S6A1wDz9Zsq)4A%ERZ5b$ͦMH(܂H3zV-# O;GJxEV%,/ˊEQEi 8?U=]07jxj/&Q'9@4Ɍ4QmC0]x%Gj-5TUll[F9PKZf`Li9-ZI0LGֲP';AZ: ,ĔT. "ɂj/&=X}qW ju8ƳR-A QWy-ʫ[bkfT`YԨ:IDꂊ4pAE j4 Փzu5oTH RB%wJ;ehJHU7>[n9r(:Ծw-7a^D cܢZ?K\?[  4kN)O>xOZҒ`z@_.-%#;$9$Þw%5O+K_ؑ^RU6J$[h%vlFP8D${rfz%ӣG rmT:8XmoKHTU,nlt+#jeޱ*ɉarDCe Qw Z8teXhqbX"=]) r<.ɊHSRul T6+x4Bݖ4zEUrhgO7BT72ƦơS]EUlgfygjúQD/?eBaDT}ⱇN: ,C,5̲v=ۥ}>oNӲ~D/sR,cg_ttS]EdѰAT%P)p?I۟5n3WEۿuH{+vtߚhMgRJX;|O~|[L{HGov?or u"8Y61zH DM"d$ k_ M@?wbl-EöJKT2+5ћ{tjPMw@y0+E+؄g^y͇bj(j u"mA5hz?A%NVsШu"j\ :8נnx$1U.꛳!5j Y*kCϳ0Am<V~εA6wRɒreK7]foƁ(a& >|7,䋸 j!lC㭉'G&nxutrmټqșΡc.igmHR5ǡ"p΁I64KO_Ap8= >}sYڱ "yCg/4# @٨I K]%S% FA('ϔjҨ `:Mi*;lb/v @ITt痚tAJ,<9sN?8$ Of@O`t=+X3kQQWU,! bʖTp1y`>#}o ʂ!ԡ+{=?8#[nݷ`2C۶ef_Ǐnټu߁C-7lxsE`x-MsRLƺhxx`LsWw4*+tLD|#'NH ǷmrL*Ԕ 6BzS*:piyeeiZZjk>EjjjC.ιN$ݷ`_/, Ço~'j@EYZM[.퟿`^&z;Oj7`EՒ뢁C{v8YaŚ;FR:j~}CW\ye}] 8F&cO67-X@T) ']w>yzo4ͽn۾];ꡃ779rv܀_K8,gN#hг>;qUUDUU7ݕcvf6lJ.PPqv2ܞnw^OG09Hf}RSn8>IwlemhW?Ο_UW_}hǏ?zmZk=644l[v:v}2QVU"v:J554:fq dYWS5pIVGo[nBT}fAO3\MMM5rA!5Ue4L0{,êo~d]BdDM۲P8L5dC۟dPSǎK&Ρ,˗;u;ZS[k ,;PQYQQrvb)$kZBFatO6kYZ!=Y4_zED2o?H SXl'E! |_wцzҥ7 B2QW_?ÿZf$I(M7;;˖- >gp:%j%?t^K{xryi \8ȿE渔1: |,P/ ,% /l(Hg= ! }GuHGl"S@P@Z(ϱѱ{"=qZzkb^;)+9IQZE@E Aˑ2uIJ BU5K/[ϛ%TՏʱlعe^>яcd hhCOo k:&s&3PYYJ+ʯP }} 趒AH}}'>;G 63}Od=k=]v7aggwG{D486?8}ɆT*R f3Dl|e~ks4 )ٳ{ǎU%AǻUTVVUUZˢѹsEUUW~?Óն9::R]U ;r-'O9e=0BxaJ{bx&0 ^/|nbL4DBFx ^KRyY)\/xf ^'h&l2Gswnχp>JzD-;C X}߅m m0DTC̺cJ$/stlpc:vFǂs~2e[$AMMmc.9 bҼ[}cɡMhq Y%+ܖHOOxSo4Z *5 GE$S+C`}}}kkk2Uq`M`9 3,]:>08>:K~?$|>]uH_ʢE榖{@$I555W^yg>qyM IPΝjeQWeŗp2#On5W].7<8fl޲{y]uCc޽@Ed;vn>qi]Eʣ2HRzkcC#L}=~xyG.S25wwwMLLd2gEE]wu嗃tvv"{`T .^X^̒@s7|D|\xxaE5hZ/Lɚ /,L<43Yp 3^Tȳr*07W :{A<^PgJ0e<Lד5 J9߲LQ8y4V%gOR /b3~!0q,Sy|Py x/G4Tl`;4c2 pWR%A?zp_OlGcu?%WQVYUQ[5=0")m޳;VVmۼi%`HonܲtHvE N>Ͼރ*"enl fTYe ζ-Mu55صvMY{[77Ki6mٽl颬`=~bޢe U3FG{G;vW-iiUOTWU#sTUWg~>(?<ί@^|CG~ / EBKƪU+:Nz酗^xCGNh@]me0Fv=wh@6vAH5}_jEucc#GƆ?pM-s@ V_7'4M$+/>#/FCC_bvmՕՉDu684P[[rёW_y}.[~WIȑcD"x|enGWO(nYx;~W_}t__7mڄ|e͙3G4,DR颣 x~ bF9\x{fJ2P2e$iq fܖ\A*h:|3|:飣È_-eEO߷liUS \{p珄*=ݑ \72V)h<>OUWjrMDJ-j<*2tyP㈃CczHymG̉iPxULD&( =).mInlSW;y|SsT0J ``OwݝU+W-]5]ƆGFօt&3:7\<Jdžc#hݜh4`fƂ+Z;/D,P@bN*&*/ Dx&sz0 N-_If&BhUy,.e2xR˫j"c VjNLTt',]446Tfz`x$\UiRjb23?KhrFD{O lTBN4u]T,43tQΕ ~ KvC86E|#3QBJDΓw:mH.MJ$_Kğs,Q"2Ftj,8GVs%30%#ɸ|Er iPAv|P g3ǩS`YU\Avv$[U/ٱܛtgnr,SQy~W)hɬ͗q}&Gh?~x,;*+F0lˮ*k5o oI0DUDAEMSRfV $qvV]5Ȏ.dS2_F|%I>?;&LVNlgm=k;ʂtFU%X2}VR\Ǎ"ڶ 6ʨ IIQ]œ=H?HDÒL6߻s>wu7^s5ѬQ GRIC$vD(%1s#HY# Eod%)ەɤ%UU-Εeќd2h =+gA,Lp.5~*6SW԰aeM7*k#/K78]AF]~ٚKVTUj_ I!SAkJi[!d-J6̢K-L@b'@cZ 'ɚ\^I 0Ȉ8M@gX*+Si:xWu+_6:cgc𙶌3l{E 1#+Ts%$Ow(|0b+pV Le`c*?w6XEq}e /+dE u3p`s~߇yM5Irz[ 5-k}}b6n ?р.PP p2) Ȣߖmid/Dd*T  hiڶj_۴MQhL0~Ӏ(ˠZ 3+` ย7ɺ_4"8Յ$U%1h`.!lb" ɢd-rd]I%͏n Y]\# j6:ȅ%ɠ&ֈz$L*JE+`mӐ5jVST@W$0I\ٲ*@s@ E_+ۘDfAiT.MU3ICp]ݬ :h>\_/ /+,XRLUEE3E5SPRTkdڤLSuL x}m̻4J$Q!8Pg7>Peȏ_ L+H>rH()TdCǧiB9"yP,go\F;7nK /RRsMŬrw!Qut1 q1y@depɂxr?%ANr)Ԙ;~M(KsoR= vƦ\zӿ( 6V`YPӧ)q"9H0S~t,g|"PF&&呠5-ALv8엳6,if\H (h_T2t' PpKd^B|V1nss?8> Gݸq# @( c%OGB PR"DIn,H.%e\`sO'0%'y%ϸJBhE.OuT#I(ݗ.}x 2X`Ģ}U(J=$iQ |O >1 2]dQ%t!ǐ%1A`/Tڒd3 ꚮ=,`&~e8-7!Tԫ"zk")D0 &z^01BeB@;EIבi"AEUsŬid>85%``R6AHL=4Qel,JYtT:cEgUE>: 9rT~M>4ɑC+C|tl3 +/l/*3E2,[(.{;# *ə~ Q_Nt#OҖk@B$d vkeP2aC`i 28(i~d OIM:8T{>c%t]pE@?~ollliiL9JbВ:]T!fiJVHɩq@$Y$tu%`(@óT>ƠDVBc1˾1^: 5@>j;ȁ&GAm1sE #GZ 2wV1_ަZQeQU 2WoJJ'e{i噅t6:K3"adwq"^u ,EYI]!l!VS" ',aAб<튶k;bфԠ-M*&LBe!t>HfeEIu 1򛖁 HsUh:M%2;g2IMS'+KL$1LӯQ0:y#QXK utI4 -'n!!2 LMQlV}-YY3HtBpMQRC[#u,n"UUڈm \.:?4ٗe Z& OVT0kagp?PL L|ACBGLF.Td[N()2 mdٳ܎FN&UJ* MXvU/JZbp+J. ƒiy-+͟?߯CdX2K)';VA2;.A(ĒP8SH)s>lϊ] ,BPR ^LUJ⢀/V^`>tK{y䣴 u!B@b@>\ )%{ *ŀn%sd# qr?gFs.,Xllppr8jpL5~# ]JNɾ1[?ǏU5CWw&ML:Si ى%j0 "L,H Uә3y BsTAMg %Y_2dҘ"110081>>7cbS6қ1ʎ >0iN%(.be.Ja0: L't!݊M7`8D\? >zsSQV}> ]K]=D  xҒ(C熘4ʄFDS(kdF HȼSDA!c/)P63Q5d(8DLPc=Oxx"{HbY,Fw`JCG9QQP]˱-eC9jSS欷PT \_w}~x-Xkb/@4J+#U 9PhByE>&&&B 5=k}zmxMP8 `4.NVbBSAjuʓ$Arg]Mc,Eɴġxm$7WQ^\1 `pX"MsagYEo(Lql|+)[x3KANeo9}NZEb31S< 1b" jUU)4LN9eķ(HZƳ8Op.O`>|ʀuA?O>֭[.[!\篋Bwov%@ U_S99 y r ٓ dsWl6mذq2O'ϟwtۿ_b`Kdꗿ… QH/ݡ̈Ne}F&tW~z% ĬHz'>*YfӥmJTE2M s0ݑiVVL"He:NuMG߀?MdWGΧ?5=TToVV2Ke.γ<=Xi9ؙO:8  j;}뮫$0^ vdJ鹉Q3>o0o9ɬt&/S&p %C:QKDcHpq9a[^mR8#D#ΙFdA!j3ΉYɽD$_s`(T-윊. 5*yem 6tXJkDe chh@՛ncc P/ ;?ܑWuP; )8zxggW:@QO6OǽNfé"P("˖J~gFe/˂G.J1 M(\ƋT'T4*8Go>X zqqt ED\Sf`=v0c䉦9s¡4;;gXXȱ  ;\r3r2i II Lr΃sN8pO+C‘χ3 {hhYtҥ]ݛ6mF.]O\s\*{c+~zxߞ؋/efR ,KR;ErY.]B36G灨":dNAK}*#dĺղݔA/@\^FDvûhFWݏ;ΨB 5Q3u`y|%A87s$ e|gĬ"r R:anS ^; OKv9tf菘c>®bU 休\\K)9<r Ԍ*t&&V V.jxrB6>d,] j9ҍ X</+^q7xW]4-Ǐ6=AuO 7響20mGȺi 섛/DpMAv+:0x('[JĐIuI&Cj݋69IN@5{@L/4s31 ~(2,E%x)"]B;4F#/S Po%Ab$On{zw:GDL=Ki9̑aL‹=^XIfƷnܨ>Q&7۰n}멮`< 7o<ֻ~Æ9U_z}ݝ]5 jj{~8rEdjcv:~^/gqrt [76KpܜMLF: IGL(ęE8~ "G[#&4i(pRHVaH%dgP4 J7#r4rsy~ʼnJ$$_<\osbritys{&P('(%[_ O -<+\d&k{/U!Gy,6i QGΥgrLKdɧb .&k(܈ccctBTrS-+ۏ#( ]X, 0 LZhayyd/I<:xx]߻wlY}D˫’y}Ҫg3~zht}'#{7W{7<]8{QU=oth0c#dbz0\~}/N>qܺ^zBi#9ETf[{&̢LmJgDF -)Yb"脱X"  {ɉdφw\q Ţ>"S*JIZQQ }w/Z(*ͷ}B#㉖K;NS5ͧ.+z;:t*͛7,:N>s'Of2\*g@~F4^_"t?RbF ={d#Բz&S) =mt آBS/~}!0 IZ ']qmǕU)lBv0]]/©'m߶nXg::=׿K/3@Wa-qO~r8f!CJ TlDJ+-C;|nPK6^a>vBS)Aj0uf"!_O/?A|ꩧ:::N~8113ϴbRCLӴأȔ'ѐ]6HLF.˶^TxaEᅽPF^8p  a ;ϻ%H)`` TmU:{jaVePAŸ r/^ H{ĵbš-Ztǝw|_reMMX+ŚjQqQg} ҡQT 2}Ko,ٴZu_c1YUdbH0FG7<:rԩÇ s - ի0_}g{K S?#&F($xpki ̱c`ҙ4阅h?&0͛73"{`6q!̿YCy]ǔE=KI!J `SQ[%teK7/kjqr-7O>ɔ`;o& HY//e6.,WV@78J52,ϸ١Nt}邕 ȸ0åa}}?qAVN:OttttMX]5i[/{Ҝ;mbbtQS}-=걠E9 2&fFGG2LEyyuuu44"TUdT*3<<\WWLSkfܹ`555X@ =fZnsKK8 R2ؼ}WcC}uyxמ=.FS'O_Simhhm߶-XR_<37uص{W_4gN||7_7FK4ٳ{ޢՕ z p?SN5׫ P G8_f2(\q0]25qtPE,1h8)u\qcT2 Oo1aRw%;}p͜9UAexxdi?O?G?=_ЃtFr}?GƛDa;gnj^[& ZqdEF_sݼ?;[|׭S_084/~b+l_՗*jF{,2&Seebȸֽ1<,="޽rxhC7|_a3[YYy&TECCÆ/Xe/;͛aÆx|+AP]Tfxcڪ/ Dɦ -B/ fȅ\3,S̢;t48v믿yUW5*yMhKxg*||DA(jFX!a"eeD(?M#5v70WUVZٶ!ҲLpa7$NгhKZVV%r5Q? 5kG`(~{8\VQlS 5ݔ#յ̭DP߯)*NH(R^ĪƆU,++W.o4n ve{rb 0Pa```&˗N%A}썐 w-]k|$G N2)Ymw|`e eea۱FGGjkk`VVt__o޺4 @!Iv>c68V266 Guuȋ/7_OI lko'&z#_{gS%KVWCtkkO>^f VYv27 $ +<^إ L%_x2^KuzW!{c^N^%*W"xi.4؜ -C:U^^r%K455x!FD;%IL7Oz!غ ϝ;wѢEKZZZzȀ Y, EӲ_WpiΘ҂뀉&} nD˶%:#@&]US 8K:m–9}MV{Dp#k>׬I]4-hzz"0(H"c䭁U{xo/:2AQЯ062EN'{zzP t/]TX9~1|-ߘo_xܱX?W_Q @GLKt,Q 9J\`qȄ ߳g7CskK/~+_[0vٍ8& !&4 eULKO3>֭[W ,q8l mKԄc—οN0k׮[ _b~ddIJ[?hbެpv`RU vN'c+6/Lp `Ji"IX%\q-SrEhHl$Sk ww$>,*!$|v643X>.; <8'Q13Π4fs٧ٻ@%Bzip sxL(6P2 2{ss~._>r)̤L~%bXvtm`) kuBZN~ӟijnjllOGX&AnXmo‘pd<(/ߺusWg1e{:::8J*?{dvzj x* h%~K/k_tY?:g%_x.UV(vAa/5 |J& X`;K7Uq ,w$ْ}i5k(YKt,6*>AsE'nYY͊_xy'O;tȱCG>zd}NٻБ/[Ot ӧ .8 &k hkvV\[D˕,؊iJ( W|`88F8SIIC_B%Ye:( .j@̂9DiTUTm~.sPUM/p\4*ӥ"'3Vع*$A h!;f3z@sF.aQ.ZATv9-:$Pzhv*RA$%u'8H ݱL nvȄ2u`㑋BJ#?˳ls(m"1[~z'':X9b.&z@*KW|+X`?0O&BZ@UH5Uյ5v;O|ӟo};>>1w˯ṧ?5c uG"(DiX؎蒤w?w~oZ;_O}wK/< 3)a]j¡PeE>͛7~k_? 6|U~w?];GI5:~`sNy28n!XzҨxbxSe!.7t<[" %^KdzxA@/Txa3IY:.bbb]_ϟi넦9wN:uT*h~f&Jv($N3f^GmУx+V,t`yĞW= p Ri"{c7^bŲ`(d6\SKCa 6cLtY r@7@,b of4;`tjx++,}-_t~]IZ{" #rM4hEI:S}QAx0ɓ9HUD%K7flLYT|>2$!,kwTtH$=1`iGcx0Mc%=9P$˜.0|$h4j`O!,'yرconnwáktB{DP|=ܠ pF MU34ri~Rn.捀,qLo߾D"a0^ f  IoݐQr,sk;=emK~*qp Dƾ)<^X|};ᅽG@>x#] l>(h|SkT@*邌:X $ͿX76EpdAդ9a v 'Fɉd:` 332:jZ*n`Ds}Y},˝S(I&fƗR^<ژf;]Aཛ(T<r)nmftUmX w;DU Aye:q,}q…~JelCظi{ȝ,ECԧ>o+mݲw=6 dts}cEšE?b򐪂baJ`*4nbd?OK:A'0g]lR'~>ymGC p":f Aӳ @<d® (>[e=gB OWN2bCDrܜm1K6^o>WyP4tW8hDS'^hAc-v{vG*UipڅPAxGG0,>]*"]GLΪjqѧltK?4`0Zv|<6wna5D49rX*c565EtE cUWTyhw]:y#{wycX"|7n8<2RYUneǟxbXE#G:~Ӧ_y}p`2 ho޺eeXض?'8qd >ޖXMU0?7֭;|PMUe|< ;wyozەhx駞xu'jkC6'}ŗ^9r ݽgϳϮ]a3m0u͚W_yueu*?v,{Zq6'k?qo$ݱyVAT͗y}aUY?Kw쪮kk=̳أSs[Sx>;C"t`p|э OLL斦P(~ll.wم!Ƃ_A{Fhry|f%'} 8 2??Y<'(ȅ'<nGPt^abxa8).T%&Cui=i#s5BxBLEiLc*'i!m\C(|<@4׸?Y[&ŞL 0"β]pg<χAU$aiKs4]RUA4WJ#3h<VlP.N[dQu +q4<tmLSc"ol5ٷІ[wٻu-|WsŕWVE#j˫*+{۷l .r7x3@;w7(*&o9wܲ2˶NROjx}:'+ ];vʚdIw_$HvxlTUS'm G6Y7ygFz^9>6J&^y5T|B[lfLDY{yys[I`> 55i?vuϞ=>`0P^A%`x/_U]UƆ;˫ثIV啡xʫMuё͛ 紴4VWܸW Ya$6gUU׷D" ə肞k*fo fdzw7r79X-$fT=""`'93{nL?́gs,.n~e!{<&y|h#swOGTW i%p(jւ7`v %,%A"JN2]Y?rN'+2+#󘂜' rAOT`f1ax| 48",O5$9=@0 h [[)Y,, V@ P_O 32O}D9nYG7$w;C$B< MM}}==0PTѣD0 ۦ-JBӜ9k֬k~{Cc(l =B) ,XQQQSSsWPX k=y2HQUUum~_nnj?T?P_}՟gV\L&Qd}Xsnܸqǎ߲y#G,O?\MW^U `董m?u"622:6~.K_]w}۷l }m[SkM@ʺHS7ؾc۶vSYQ7 &:׬OFa]ԀLX =:2c믿5-rrt]VP׿o|:j<@#(:Y7eч>}K淯5Woߵk!YiwaOYX~[_zշ-pJ&XbFo4xOv!c0|L1ȳt[ H=Xʊ&hUIKM&n0';::le) ^z;6{0Zjܹ"pc SմPVLzX(=r(jhG+_f͒% [V Uxll`pp_vY:>ъ։qd,zК뮻!hJ. ض}WVUWVk*r5W^uy Xjv˗bVAFnLhl$B~I[o˖Zܾlٲd2mҍ`u֍ ᅽ3aX?#5-3IAqg?=ӈoXu<Mg{JU/  28?x +@QӅyyLV/xfLV f!+|e@bxa816Q;{/.c ]_]YS_SF%Uҋ۳BVއ7=v"38=s Hޅ&Ǔ/Dz{nhY>rmyj{.[xz_{kvwvƦh$Hilhjo=zz7 _?gN#ӟ]S_|˯/j;yʜ=Dnkiia_EQ%'ŠOVw)Eԋ:^X)LJ:f7 8ч;`V\YaR.ӡpƌjMSϙCvCC =+?x+/[m 9BXxjDGu#WT1㠊PdN\UY 0G= ӌ} *+j@~˘5޸leoxɊ#G9iX0łI&K>]!ـ?i,EKg,Uv]q|-+ Yы8ٛ4Uu׵3i#t0S"C)c -Bq Sm?}Hpo[F:n)l&MSDM%Q j~gYGtRd: JikZ"u]AKMhCCcx@# CO> Zl`"$:^b Sw3l)Mf6siWPVv~Mg]tTXBNy_S\`)|x/D hPu㙗|l [Gw[9}D+"eEG/.z3`>3~im87fDty5م,x%$fW% N/!GΝ;v8 -KlnI$'8 ϕl aVcd\ s\]Dz(/g)|zUuu S9O)CWrHBw#ߖsk4]..]L*J1Cݳ>;>x-dÃe-]q UD,k||*N.38s|`4c@ NKe4 X,z*2UzMSQhuE6}&&YձL$ $\A/Ӈ2T! ȡH Cd/a >æG+*_g}UY$L4O~%,*+"JWdȘ}>%$,0UIsl7s,J*\_V $厭"euPUu 0!k<ŠOV 8uOt0.T"\S=h!aOLL-ޚFO4Pi/ʝo Ģ8,١μ)K03<39PҔdT]EŠmN=M^Ԡ$CV./V^56e9xΊbp(Us/B4SD(, %#9FGG/++Ax|xzyLEip"4QKS>Ch| ΩPQ)(K5jml^( *Phtɒ%_~yUU$ev\K?6>P 9BCUmP OQ#*Mǰ ! F`l]z…U!ı^IiCitDW NVe5$8f&뚘%>ʂؖɮ%`eئ68>D}Y Oʪf j8:d8>钬ؖG] ~Tm٘2ulԅ(O!, [EkY*2k`j(Yi28 h^\hƑvDBT܈eqH$ޗ*m dݏ.ɘAq1uǢwu`!nye{ (pT)SXB;h4#"\M%Qs,ĂG/f آϔ}z W`ȏd^H }}t&t1-| eI+Y'y`r)f-h7B؆H^dV{#&mwzx29!A9XȨfI*03 >+6.x+ɷ\*UaF ftIQ[L1J^E(Ll~s\ֹ 2B1lIIz 5*%wΑsKqx^S]C%`@13'H\;Ȏa~Ȕ?J,+ sffL{+@2Za lCT,^, $644E`;e_Wzҩ8(ՏɓVdM2Mar tä{Co2dDLUKTV;$^lX0`5QD2mif)qɓC C"5]f5`OXؠc(cGoe Ϗh玩ʼƠ95 mqYIfZL6PTA]8`2Swbrc ĝ~AbLnmj̼}(eR~sƗ~GÈ #~cvu$TDWɜg%3+bnsnH bBs t&[@6p6d4 !(J~TO(鶙d]xYLN3)"H&nc˗t5Dbo{PB;g3*s=xJsmU|JޜdYvЯ[cF8O*]a(` I39 CV, HGvLJĊ HINZ@/b2c* 8h%*;ё!UId\4H̾'Wkd". ?##cKb3,% OYHΥ$XKC҂;6=16:zWC!Pi1KfA%&0¸*Bי;3L1]`BE@q{`+;8b8yA |3/Q8NSS^03{RS1K}g!]Vֿ§Onmmmnnp3T>M!8(@~0Fyi$\0J( !iKA[UYc]#^eUW~wr/6Hy,ng C*Dd8tI*eiblU'Pu2Ou@YkEѳ*2HRª/ZK+O'\v:\4<O6 ހg!&9xa4# R:EpYYլdES!"wVr Bӟ.ܦ&٤/&^=0J1݂Kg_: b@b#H q#D78("MY^8@zKIm1LC%kZ^&Řr Ggi.hJYYw9&'ϝw?,"cQR ];WqAP"eۦt`Z$ˈa{RG׉dIT-1@M~qi9Īd(ݍ,' t8DtG"k֌:#:Fo ^"x4&9p U/]ezEX/|Bbdq˜ښjFa %z,.?0O2IgGhl<6:662:񉑑Z6ؖ}{GGoo,i=tpEe,ז9&Ö t`*ց$լkegD%fX4%&ѕ}& ]pWVǏ xF`* x/ 8GۃY*1xO u~GΠ ;pSGtQSUsX#]]AĈ:Q~bt˜"$碀)= љbLUd(_B`1ӏG'^y/yp#Dր~ `qˀI\V)$I*0#&.0]t/~^/8ӗIF_(d89rLش8 1D}KXIrd@a}}ư'<6MPǀJ53@ HԢI}P5 "''Ottuutvvutt:vt[wwOzzzsĉǰk@YMEvڹuᡑ[opxsmYdqp#xg@4f>ʤɄiF@8Froo_ u=NTAVH>|ȉ֓U5W^}UM]u@c={eqΝiɊjXݻ=_[Blt_k<@o==t4*_g]\S61?߹}Gwge+|~ll 6KU*mS~XQ.*f[uV޷ffXg&"8c3"@՟9s`B:M2H0j ۥ <G@S|` XKByFn|0s{%O0x(ʛ4Ͳ)&ʋ ȦIg$(DFH41 6!Lq8'up@ SdAJQ\`&?]m8aSeNBm7yKȼ|T٬kHN P ¨ H=`^$;PEDUC.?YYFWu:Gb՟}'뜸x8MT~ީUn]ឃC2`PU ݒE`@b 4TTT@~ ޏ%K4k*=̬ YAT48+Ymjj&ÃE {kcs˶-cc[7~{/|Mȑ#CINZ۷ K-y;;z{Ƕ,Y^yutCm}[nٳ -x'ajjkөd*h=v %Xz **`tP^d΀D1r[R<2_oØm;$IɊ-i/MgVT/s"b se#)ѹKŌO,C&ZL|x( ˅t\$D|,E *Iq}Y6LL y.C0< DF#贇A 02Ȃ%A]2}=޲m29T0(ҡaTC2E%Pj A#LӢtEn=ܟZS=+U$z}1p xGudOq dP1PLl#z`"1 X1QP۱Igp800 z{,MiQiMD2d޼F:O$DIںe󫯼Ï'N(uv -ppŷvG?˗n菵>v?ٿg3O>}v()E+V;Нw~qUWWUVjL ,(+pɫ|Lv q]SY2tYT`:S]nܴaמCm#/%\-*AǧD]> 1p88Ee0MzṴVDԱd&r"sm*5@1:rc (;;H O'6|0/gt mQc>p$IPM ТG }Yx0AiPY؃ ZEJBի RLQ y&(U ++_4@ h8|ӇL:JH<uA8 *j 䠌~U[{Ρ*Xo h rM x|lt @ ၁q'J2 u\UY4qΜ暚Zz0~ &N`PsP0r;XQu ϭgM7\W]^6<<:8:Od*=r X]xAݳ_U-h}m=~Dl;P]㜖辽{%gS]ƆDl}eghe^YTT=f>=MnP4&CY1rHTffgՈk:L.Fs4McnzbDv*Al`W`R4ЄC2;l AIVuӗMD+s㏃J`܉< 7L 7&p(( 0,/P`0022{{?yx'zzΝdFsi٭ǶlT/9L7w,ꫯ}x=ѣeѲc'¦ɒ?,cP0 &ә hu9YsVal| /^k@cǪk裏>խu(׻kNPp8F=z 9޾yp>r" ΤQVD鰀|!*`V΃F(%:v8ߞnuAցuű1g >nD .ܘe"4Qgu}X=W8Kc/ӛM,JցT$ǀhLO r<?xж\W^شi;`,$䖍 t`ނC6njmmTntdt |bͽ]յbw@W@2a9|4W4>gxxt{Wg$p&0y2QWW c6Dmk۾m: xA-bcy-s_W7Bbok dAG|`D,/+8#*<$ Vf*V3ݍ=/<]Or$qL*H=Cd-L/4'T8@6mڴeL$0XL,f\={vcee>Fhk먬ڻwL 8fer{z{Q!$gׯ_?>>(pD;qB3LsSۿ뿁=9^^^~(tUM$X=:48t_| JEMZ& viBTXξAԡiCMLL wƞ={N:ӧN=C(mܸw[7lxi4Wc>(f0>yB |w| K {x{h %>?6=0l0B0 >HEeeMm H"F/Jpg2X?{G~駟z7{k}?=ܽiE|tW|z?~?|wx]CCMuUC}͜9Xy /?c#O<}?koXh񂅋^~?zXkYY8ot5ˢ뷿-=E3_w]ȟٟ5֜tCBe/ e2X6>/'s,viW³BᏪcϋ3 yz+Gu7XЩ4 \ ͥt1zPN|RF H:Tiקj1c=ht`xOŽۊU*!D[2@˚6BsՂ%t2666442H(lΘfE̤m Y)c6^:*5ȤGFөc۩dIC{HH]w]}U_';6?%s]y/\peM-McWcёNk7uvu߷" *QmK%Vajkjz{8@m]$)YAYVXU][HUu{َήʫu?hIk+X`-7UVTU32&i7蛬$Tb5GƱcmL'Kΐ)$̪>ztTp>F"'g3r\{SUtDK8`iA!K`lH/EjFs<Osf\^a'RW)T#+:Yj]L Y_V& h_V3&+>]G'Ԁsr:Vg%IOV.""೰hڛ}HcӤ ]F"f$Dc|me>h{[O=u˯'|<J]{7j=4<{_¼[oѿn §c#Kg?WY韈v֭[ԲeZZZt^HӟЃ|MݻGS>ɏWt:1K 7]ʲ?2?O*jvú] NGz_v\[[-kӦȇ#^QT4GFFO{KO[~J o} Iǡg)Э LE;V[WW-̙S)m@ecus[baD+[\ѣpiC/[䡇}7_{_[u, ^z{WO~?3dY1 `UvH,L-0;**iaƓcQU_[]+$E l2FE? m"^_~.Cl!EZ&l>$N"0ƍ5 TbAQM}$4 zO8ph``pw}ϟ^}_|N 4/=HYSS߽/>x L9um۶?xǮGTzxd>'8u+X^LY /ݍ;" $I=F7.0!Waojj;wnmMk4obb)`0D"(c B%A#`(~tQt:\  7ȣW*B"&300}o۶^{mmm 0J3%mk~(~9JRDܗ"Mn.ZS6"pݦ'RORR+ƈTP9qFɀ6 Q^}M.fjskVP|3>Y!%G\w8ө7ڸЩD4Pɂh.7y'w r W^yEmmm}C_UU)o}[w6nڈֶ-,:MՅCU}>  6 FӴBUZn@8of\ee/+/; 7tã=vڿ+++IMPd||CO˗?#b@^:m2;XA! .F<X&X!g,}ݿ?CADqؙO2  '~r B>1OˑKBq H {>l ix4O٦Ir ?OӏG\ȹg#H܏6FȉpmS0 JDzdR;8 /0OwtP|Pe#ZqHNVTul-&FDS(#i!01<$>]àX7ǢW??{ǟxxgęaM <)R0i2$Hk`A!7`\4U妛'Yh/~vϞ;S$6r |ʕUUUX!-3/d@ 9s= .뮻n;w!ڍ7_~k_`XEuU]]l[/Z:ԉX T_k׾KgR>O|֭34&Luޞ^'9?HA`s|_w*++DTYfV2HR]]-jx؋L ˿Xdjb-nݛ7ďw{s3lݹy"5 Ůe&M (ZTUdh` :#8t~5%vDe׏!*az&hdxr-)YoL)_A$"@=]o/T>F aR2ݾF4O1 U'*FP\E +\댒,>cGx8wKɋZPӚ~%[:{%x'YR+ae e`ׂ茦SlAvD[Ĭ#hV4FjYEK4%M(Q6OkYB֬+NQ&0fᑑt&bŊή͛ڽW[`w-܈ hiu*~+ zC , +K_,RvWK')y&۱)& =h?JsԩO}S2W_}5@W۶ڹ<| ڔNeK/^hBޖiðR$+WٽkgG{g>p(t TW޽;662.Z\mm/۷{[[1G_G~G> 4'mݺe۶tW#ʣQAhU[W֯[W^z'*j %T* /x*qBiGxؓ7OtWަ?ә\r K0} #M‹M bep&cfzddOEƐ6rEU@آY VV-40e( KJ4@ *H3e#3O1KK$ PH0,@['S sP:C 9b"(FnڸYpQcѧ9xht4~xBo2=ø|L9"`jjLv%8X;ρ)lM2AԢW PK`fF&ڇbR,9芊ݬE63C>-1P%ˣ`t}EFcJRg2<0c6P}BU'Ot Le"߿@GGGxUee|bbv: K466@ D4Qi=W^qUuuL_a\Ghl3[wmbŲ 8̯]G^lfhrO66x-Λ O/ZP@?4o|UWXQUUy{^yՕK-ںmKSSM7 ;k),,4?w@XO#4y@a!sz*f"q }K(O>2AIbAzg 29H浩@ddI)@f8X([]T˒e;2>mZӧw Ͱ."cxhhltd<w,^4K+_RHKb[>$=Gt&[׊K3“l.} N!GNv9wKKDziǒ{Goi . Пz0ҡX +$iqч}KEf7;ҟ~ 5UTb[>DYtsTđC@J= Ak;tUU5(u3f29wDb+J2,}ՅgoRtkW Ѵeр4lL3*6m7~؁Cr˝󠏛͠ahѣGT`C sÆ3ҢI0,ǒ$a iz2LQd2kJe$ Bb:%>l^ +˦e2N5yczy\q`d}H(_Zz^'Y D[w9Fi4>.j^kf)ig "$JJr"s+ AB/zΥT\zqPƓOATEee8OI y[3td QMzdO)\~E^fѱb=H&{zDI`޿o#Gbqմf0[ʭT\օfY/, :]u{=d !&i/V~%4: 4C$]`!:@_r2}2ӈ)ʨ hWdBA e&%2,"@\f8ɶPQl`MJ T0@Kbjgׂz$Yv/:4#PKBt2P~,zv yhi$+#iE\ܤH$PWqh P2H# FOCudVlCw2Ƭ+v&8>I˂Ss1!bs 4:,#yN,@sD,֘ mNҘLjsС1gf̌/]MDGEɨ El0,TeAs .3g}wt ShJCC!=s+BYq f3ӽ/>uW*d֌pFYt卆**a3X&]]$$R=2]bQe& U}}ݼyX#%(BZs|}ÐC~`\fl5al ;\!Ӂ:j)xVYoV;j%Nӫ\>1NWbvٖMq 5/"lpX$aVyφǎU`"|544k>YR苄JB &YL%5@wda`51buڀw0Y4PUȟٚ* ɀʺ۶ڡWt-`I* 0CѱW^~YC $ L!G+wLTDh:|pOo70*̈I_sCQT*kXS#ۇv@E {L3 ҲV&SKfX+$? /*#ucAZw']Gr Eϊd̅&i'=##d"߬#2e[hh4EC'T$c^Cu49flxH&NL@v.Y<%4waPd@+~f|SdDiOD"6Ž̲@4VtF#IӜӣFN﫤*)LvNF?^V(QT1L @Fk&8TXchF~P-R^FspJZ[[AΘrAp7kH{IYb'&aGc&n+$JF~Ge<YEmWxK +tAHȹsg'%chcBԿٟo6PYUy葉 D™`' #X~qG}om=H55P-l F7cIĸedd%ǴJa0Ӗb㺩^oٺ̰o}ij!kz0#ȋ,k?'@od蛱X&8TZf:XJ"I."$I6:bXUSL[a@kd'=O$SP c|xPFV=“l=-iكX(=zd=@)u]Mtڶ2]!'HkRnF̴ .! u%Cs2Q^0;|\H, B't CD)0[ۮT(S$AB:9e󦾾x6LX,6 WB0X:ۋO gʰr@5TE|75AE0 DmشiC{G{*;Ν YS`e41@d1@1i:uU]DYP`{" V%Kr Vk8NE56l 1`ڝs\w6azP5߫+sh&MHcvtnWu>zi^ c'7ɉ+dkcpDpxE-jcNzԱ{wNpe ФK9NjǑ> HsllG(8*/s 2IDATsDS@iLt,m6b 0{+ii W5\&$l^$fr1i? /*9HhBM^6, 6G.{50J TBxaSQB{GJҳ?5f9b"> ڶ,c(]X %UN?u#=2< 1qؾӟʪJ,Z -qho=2TQQ^_Wk{ ڮ:Lx6l4?]?|Ύ@ }c=ڦyŗ'>Og-D+6qgF˫zG'+FI͚Iz깧=$}{7mrhe9uT,a<y(D0[g??y$Yg7mhQ{Ү]lټnݺGya|?x_z@ P k,?tlmWwx[e'۶}]Fccs*_zЁ7^{cӦ>xGt_U5mg?W^q,dŴ['?޵{W{{k ?Ń>/76y4JvڱcV]/\Wy6:|PIA0: W@Ύ\B^Β3MVJ=iDc09Ee]~+nKk:iuW]SOh=qUVj622* "r2(kk{#G\zUyY7ܸdɒH8qv8p`ll%iڵk.W ٻoph. G ~zMgwwƍc%\rѝ;w+y׭[wmmMMFF^$hS._VZ QC  q}񱫮 qB7ϒ'Z[_z~8o\bң?^/޷o(ŋ/26>$Jb{G#G@^~꩝;v._q>+.C/kjko~- ƱcM[y-7գwQ}u 8xO>r?,cnx0D >38 xl1|^Ӭ) /k^XUPΫ SjU:K3ܩ$JJiA0D|^C[vpL= B8;3E1L!76,ōcErOUbH`>Jj) Ē8Qq/9;ud9:[oV d2ܸ t͓cj3ՆEv)< m088FMBf`P~R:$ ;-?ϠpslР]R𵮮g~y@yhyKˋC}m'AP]v-_+},,X{G.Ϣ *+)^h!=3|kFŁ>ʫnFT;Pmmm_ͷܼj*>?ŝw޹ s@MR̟U/o/K/ [~ߡ:0Wkk E*}b_#St'wHDư>Ύ ^}Sdm$^c I9:t@{HOH,8SO۳dǶ ʥ8DSh6lr +SNl̑ AT`QT]pSgSy4eĂ \<HOifH<* ~&e*xIspH#~ sS[pc@?nJ0&s<*7X"HA H`$ "hz}(6ۢx1V$/fhIm6Hv2͂%6I_zK.)))؃),l=Z;-F]miغu'??'.W}G@F,`X"Bqa$hʲJ=i!YUEd(R>/#a؊~֜9 gx"45wz͌h9Cp0;dJl%9m&4=Ʊv/j!lXd9YmY`)/,,Fɡ`DQv,1,m`n⩾{}_^~U+/}:TV^ Us=9$JUz' | __~m'G?];bUi|o13Ϛ i4E4ơiғ(H[/h"G)L;r5LJXNh }٪(+Hyi(:{::{z#L4 'zMÖƌ́In:$*2\|ǁ@ GG`8;.B*S28('3d /P*$SEr?2e RIqP*Ҍ/I ./L"y"_yΆwfpeeÍH*7+R&MtLw ?pA)>A$̈́98:{(U%4UA<aS~EJ&^+>O{jQE4MVCEaDbpxs,(^n`(P@7u++RAQṿGIyqQxt4X_TTY%E5U:a'tQ* G2l/38qBT,+Ow nd}<1(X%9}Hm'@@Ccs A, != u=|whhkeEk:ֺs羊:K>I (>T$kLO$Ej-xYLY1ؑÇ;;ڟ{fKCQX\ɪ ]=]--ٱcwOw0=[VWaSWoΦWU| F`luF(A)Ne{ ْ]c֚{b !H$9mK.XrQY^oK_p\ F#1'F}TfD񁱑Xot$f๦nJtzȔ?5]9 ,3 @ϰ3~+>A3KEj-`HY d :% Apm$Bu[#81S͛ ڑY)dCHBJA>+Iя(V!T ,>@*=O a7p;3-'`KCpL =CgÍB@xZs :y#tt: @zX(y.fb,9`hMD4t,d2ҢZyyiEey$obt\/bX44/UӠ?1=i!VG8}T ZlyT{hށ< }2Kn{7xC}CbO@ѱQ6/[ꊵW/~q7|ӟ޹s?{|[伏|#vF^oeG?r}^7HwMi~_0 kO}g?M'dIJj1P'IRsۻ?g뮹W6=Kηif/_c1]g>;<2ߟwcMG MA& Fwo&-\hQ(/o|P:@0FRlKs,l\oovB3LSPɂ¡?p/t\n"yq^H0/aIRtG>><W^ -8Q!L-+siF$)GZ~F hfqp dC-{Q5%/2 ؈q#><6mF|g+ꎎF"~C`)/+ϐK^/OqJꆟ,AV!Sh0ӯaT->t! F286iX+OB5dn8BeȄlx0 zwڵյP)BGExU1 z=+m?A5 ֡^ aA>Ȉ#7F (0QÀ?:ZZHhZBRG-n(\XNHJw{GEiYuEeMYlI6%^nn@+pvO.q9 S;IL@w}٘3 f<ÇcsBWe(UGr@W\.z0css3v|JЛ@)-)J?x󕖕af |Q\enll,-)zU)ʧ!hM[aw- }djea _^\b} Tzvဣ$Iv2K/;i"^Ao~EѯH}g$RqdoKcMN$B$Y(a؎Z"b|`UdQ0 ;T zc FAmX"^X@yAz<&LoFzqͽ Cзw%qXg(bᇇvG㱄@tOuG0 @Z[Z~䡺00P>?4M-AXslGȈFYhEDl|RzDOC;2`p9s8`-I0'W]PW1n˗.Zh sk-wK/Zbk >$)!̝d 7:n0{5n9ҽ7&SRb0gΜU +-k.+Sw_E7M׮Y5:wes_|ڊ7֖<ֽ:jmdz^Q-ixG_}'7~{>PfQA, ZB jAv~cECUX8@ =pHKj=H=I, 2; #;Vl- EH W*,) ^nJ*K`,prpL9F5lAz,H)aiH]u&9t M[T8b؋[l޼ϰ=eϟ7wܲbr.&&C 2mJXqvP 'H|٦Ȃ<Q`^U^Bqt#cU6EǐEDau@@*y-lyI퍎 -邕aF^nn@슟\2sv:3)q 0f9p21lLg~g6 JE8Νg`幨1,b4m=u:qPcѽX-򣆨鰗@[ݗѼxέ"e214ZA<)6}  5z%eF–<Q)X*/4FFD7hزMoV$~B|# AFXJ~zI *KLOwNBE]X4z6$VS]HBU鳈#1;RM> *i`2>I`URr`=b8%} Kc7ڨHV >>0D0KRcF$N}4lq$CZИ$>Ɂ8~#5_YpL&= L" F O^tVғhn=*lA6Dރ4`'ѱqCdQ!FOY68T0ԙN37g*c*SʒJKS&8&)XJf&LL3X{g,FtM߫x$YPT͙]GT=H2E'i(a9l%j*"^f߾ffEZ)0(fj].#f1Xsiͦ;R.$PyOq0ƭKi0tzE\@gĽCKفCCFZҀ-ybi̞m@7ma@gW,K,HHӇ4 ANÎDQ>'a!½^ ݃Y^F$ؠ)P4aEeXK)/qPCY`_P(V5J"IDN 9p&3n)Hg@>GPtSD$h[7H]EwLˋ1kZ!?ADe3EfQ'̬,}2 n\~~R]T7`LyXE˜YQ(x lu2ZdXMPj\pe%kl" .*нCiS*+< H4ggHB Cx&DV$@X(~XX r9DSh;:&D`pHQ4&HȨ̃iV8"2 / l,hgä70#byrH=!h^z'{Hx ,D$o4VK\M'eK:4(%5]4LR`{dtLLchkj,@/Ȁ[LL 7:n\6P\ D)^/v 7z lqjӐ<5$`* .y*|Rd#ϼ%M %L³O}R\IpfLq'zNd\x>xv1iAGebRcpɢ! $h'!x'15^UFhd'! AB..'$ A˭ jcBOZ,%] (KU&Zїh݇B~zGL@U]g G0;0dp׹b'OAs7#18XI٢( `ę@{f //7MoXsfxA=>=i| Dkltr6 "ci,4+QO@w;rE n:LJ ઘӰ[Ts8]S@6ܸ0o*4 >]p ^X\.Hu7}'奥&ewbzY<#1_Rn|Jl?q}M'4uk>r`K-wm:^|t2XƎ]EH ~@==z+,,DA~=j #t}W`0 3.(m65tKYOH eJf GnHe9T2D\wr0)V;'(Y4f@r})L3'FFϫֲ*u`0cӯx&ƒC,;#k vU|$ml(;E0r[ܳ0":ZZٳð`pk^QYQUeze+'"W%eӯL UϤ9Y?JGf;qQ)?nH ^w]2y CڛS BZtL(Nќ]Fp{dT8=79x)fLhoaqz禛7.?L*4tf*2nLpr@I~1 GGGA{=>_Gl] 2E6ux + %]d]s%-^aZ WEE!@I? ~c=|%*w߽w 홧w׿쨬,ͯ_?̳--mTVV<Ԧ?]=%E]wnݶCQw>~󡦼M8mv$=֓)}/%F^7u:_?cɬT <^i1oVOҝxwUL2ёd"Q[SUsH*$Я)'}z4#v8?L9\0C{M 7n+3nt~i8s 3IJ̌zxͧɦ˘#|d(,,T{k^⧀ƤSw-LP/~^J,Nbg9`c{& wo49.P0 g:@zgWذa[=h;&8 GKMY5!zh8N$M'{'i; (H2dF7PiGiۘH&C-ԢhIG˗?]UQ{ܳ/?ʫ/{-orwW\ǛZ}{u||5a;_.b?4a +M\/9sLF: 4\1= iܲҖׅ"H/n=$8~/)j@,;\'%Jm39gn+p>ל4.-85<%dMllܹ -lnLu׹%0sZB:x\]flL<, , C}{S1XW?@ =`)1Ճ&yWqzLyolڂ7NYy{3s.! 7.u" HJ:2?RJN8pSA0[ ݕq,U.n~W0!lҐUeV`OA*j?n$d 3d7 R怣ޝƼopp19:= ˒R^/ _emxbF܌bXvvҫGe#9Ն,QD<Sm$u#5CTo #>#*hQSKW^_Ţ`($ֶ׶o.,(ypث#x\`0mږ(K:$:HooOG{[%Iy##E0Vqq_vۭdL1kMt8?7S;%oL|K{ Hȧx8>ψ.@ Ђq0! ^n6Xy:Tf;J5L~:q1(W<}zz>º.` F1Sp[Kq]/hd¹EFiPdJIZʘ!M^4k iYt0:;;;R[[SU]{*MסP'=أpw郭xg3^a6ICW-PqyY׫^wݵ|;*+"Š*$*..{o՝w}CW\* E BVD`˱CPiY7_׭_jʊʲ/>47Ys92U9uˋ_5W_C\|EE2cdX T̅LQi?tJwp|'fn2\M܌E!e g*4T5Z7+X#):iX #5bY:Xp ~Ń-?P.:TB8[ ʼ)d=SH,ف=))`ח)JOLW[ⵛQ˿qu(v˖K8\%Ӣo<:K͎9Ne|&򺺚P$$2=` Si}g8Ď'I>$tyV=byY7W\}aCMGUTAbiWH&}y}IUB+'eѫȊe ]1MٷxE >H=j| O5W9Ovd*}Q CO26RRwP 06Az 3(kIߒr&8M!J¥rWya B=Jo:zeuxhh%C!Qmb8)ѣ)>dq0DM`/qkH~HQ,Q1 MSyEiى)xjAi3dqIKW)GTt1%Uv~a9 @?\tݴbqnyABz.HĦ9X8%$GAA2%%4Ift@t c)@ј9[ZZ9R__0re4/rL=ѕu6.%Q20M?~B!N!`gn`;]ZZJ#`0HRTHG&wE"H-DU$>eRĘ- '7 P(X^T"j YIsj%EIhI0W= A]}(ʶmӆR0 }Eͣ ޶0hvGV Ƣ*{U Ο­uSjTERf9ēST30#\rf53EnSφrJ+6L #> LL =P= H%#dfU`)>:%vb{01:SI D1]&gqe`ji {)4m,5!DLt{jEV"%AVYER2qjO IOC`O'P'}L-nbzq_hrX@`tN3 Y≑K n' tԤS.g E+S ?F% 9o^?s@4CsRxC<~?]Lj'-$FkqxUҺwu/4bSmkb/ }ش^*v< :21A|^xUAP0-Dݓ 4}&Wy_d3@};-ʯaJ㨦wƪҫ\t㕫nX}U7]sK7Ԋ-a&Aph@2i JQ>H`Yz}~/X{,U \0-/HϏM(T5 #=NA\ER2+*{$} BX$ @zy0{gZK2#Ѿ6s{pe4sgLrL HƒH;O]HɸLE$a4E-21$'`vuy#={4~}\10ᑱA$;]CeC p9r'@ej~Lwڄ*#O;|hFA>^ &9!Ht8^NÁ* {$I[͐dXvt`^~al-3>$ãQ8X(-SAC5"r"LRH='ٖ #yUH+(5JQ,n{($Ftvm>eᦀh^Kf*V!1o&K.Kđ+OUJg_u!<?h,(Ђ»:<'dR{qeG.0 MN2lћQqpؚ3Y8`cf}yqLeGA' R<2ʢ2&BLQj;(}8cl#Q 4ȈTYd-LCD(Y64Gb. r8R$mY+X9%IܓR`$'>|`)% vJ!,9;= k:raìAE4AD{<@ T mFxj#Ubʻ]uy9 Ãd8MȂ##!e5%IE n&(T&/TCØ0z\U`О=1L(bR0!P7 6{PJ&---ǏGkq*H-)|($@BX!Q+yi"諯䓛;:ړ*HƃA*2*K'RUL K k52ّ~joFRY2*?B5Mc*>@gdD8Nqd,ӰÔmғJLO``> kj V6 X~i:V1H$ǃ ckf,$ה°<'VWW禍OWVV*FcX]]%%v+E6#!@ ,~C4ȴbӗǤGN fXx$K/TVU^3Cho6" SCd 5Hlٲ ~zÃ|l9J`lZ[ a=f#J#= 9ûv G"mѣxp 7m+VD>y`a[K׶ϟ?/Nhj?l*[Z@v BMl~rseE@Jtʈ?ِ%PI]w`gNuՊ4먧t'$ [$&-N"O_Flx)@P^ˌ0 hAyVGWWF"CcX A?&_1Lӈ# l ">SjZS>JJKS-~tS6?D2oDgWsE.0wcAyxM `qlYCyPI?Z۠ҎA69*$t~1Z1%>C@ ڵҒ$<7oDXT I#NLKAy6dG1}>fdf%ԀvAΨ=0i ⫚NSU[1:t Xoddp˖X_ͅd4һ&%HJp GC!G B;0ʆiAG' 5)"V8%ʌcʫ? 4m0>: S.$5+]$ gmGQ0'ku ԷJG{M ٟY?.jt dtdPQwb QqvIet6XZ1h,pŽMzép}0{ME k*D^]UX3=<%O=͇(Ȁ-8IQE{>]T/Q *=)\ $WZ(>OcX [If|1E 7,-` |0}ZWV6ܸ)pƝ#Uz1en,;+WcĨ7?q=7nD䆍#:|x>xkK+tC;wҌaW^xq+?e{|=/T-..A{v./+ݿ3O=y睇#<~Æ2'R /`| pXy'<[8M$⽽{yM266VXXt)~౭[_=Vuuz깮^է8ZTTzbˋ =[_36CcGnڸ |h~[(iEkDJЂ֭:|0^hAbu_nz1_QPRG^χyB~?l۾4 wԏ?k۶ܹؽs mVV^ b'uC^{W_E)PܑHuvt`|GѣG+NhG{ٳw]6nD I{뮻ЎƉ'WQ4ƍ{tCzgT vͨKSs-/<̳h߰qCOOOaQ؛n;(M nG—k*-eD)8fzpeF]S؞LE -L i)Y)!4.2m%cG@LJ`P1@D{M8ze`td415Џf :<byd$y'|e~?x;W_WWV6=^h6Q8`+f7qΪ AASXS>f~d2 +(aP^d$Ca;KZ8Fbh`GV/ [oR&>Lov'T{}2Lأb5 qN ik->`ee#G+*5-ކ\۷oz{;uX П̙rT.\Q +raaz A\{tuݸ|yc?Ԣ+;:Q1MO?S]]uV>)CC=ݝǎ5UԌ#q]]}UM ew `3OⱾ9 +[jA/^<b,Z8B-`.SlǏYrӦM0*S(2`~Xߕ,\HK]]h榆9,8Jyy/\PJOM$ں_XH_)(?onCC"CC-Ck.}=]hx ڱkWAAac6-_~>؜׫B-[ Yh8`H0ٽ{7׶4Ν{^r}6yǛAl:vlttxm;v[@eVx3Rk=>>P_Դ͝% B3ر~ll<%ѧ  }ٲR1tؚj-hzG}}c;(}`gΜy恑 08EA8 ($`VUV#/6֡k , @Mm bAZAoN46ECF>|]MS$X6iɀ١?e.<=SqLI )mFL,0]1#%ֶ!JFͮgQzI)XP=w kkj+*j1 VV(>UMHW0;xf;-_]tI_OOoG;6/'#iI`@_ѣG@ڌhMObz40]Q5F 1- 1Np Ea 3[7([2>Sm62:at.|2=pTL@b ܸlyʆ7nt6ܸ?"Paź=lMMؕb X3E_QI:t #>=ݍi"a~e/9 sƢDXL˗/0 cu֮]x?ȷճ0*+#9b~u7xÍ cca(ǘ4 ۲tMۺe~'6= TlV&{]w_ >7o~׶/喛o}˯5Wwuw1WBM0bqAVXE{zJ;wؒSȈYbLJJJ˯‹.H&H@,XpWtӘ=cL&[nyWT.^4=3w[Ős,a(c1^`+(^uՕ50+ܹkph[nڏ~pp%F =ʞ={`Il~yg_yU`B-WZ `خp(|Ӎ|Wعkƍ~߰qѣG0|޹0ܹuuu / %QBo믿ndd .Ye˖.\[`QJ.?22rx ڋ񦕫.閛.bT'd7]x l2AL/ƛ@{Xp_|j?$p814(/jqE*^t 6aTE=g9t8e.jܸlD ^,S4Q,8++^L0``2/` #>wY,*.,$eC.Je34 +2U 1KeIݐd+I.I[9DWaċյshWˋUs5KS}jbthw , 6='^z W^x64߯ZD =Wku~K?-]GZZs㕒eǒ#W%cÞIZZ[n~JKK㎕+/ ӟbwr7yG|Ҳk۳H˱Cnq'܁{XЏӾlnl0;pÍ<ܳD?jR 4['r8MϦZblͅ)8LWMS2 )9wi|s%(MT,8eqrP,g4Pb'8$AE(jkK/m *HSKxbyŊ(l\[oBw{lA@)K`Яi{tVBG<'qG FfXĉct,RY~?2lб *g2I$ Utx?;gΜ v^_z17\w+. ݰ =nݒ󗭽#ǚJa ET$60*AR~k@WldIzD`?Q'Yê A/EIM~H2Ң?y.9mPB!#/ ?h?rرn{^~pM;vR B8'$_XXHJتL?zƣ-[_z̟U*Жh% E,ؠ ¯ / :~Phwpoi'`>AC㝷"¢‚B&aq&~oв } o a7aenZ|X}}C80MB7 KetxB7)}) -[8x'𔕕͝7ge^r%/Ï>lZq>Oc ٳu?QVXhMχ J)՘NrA Y8rN8SedN6ynޜrsR3z'4@#x &ҭf;eo;0̊!{hd dI~m] -y 1G_LJ%$~#Q$dB7w0y?fkV˦y<7i$1Z|__}uIkn]monij~zfL7n6=zn| ;^zst|W] TPqI8Lc`TU~Sk8q׿5˿U8W޾~l;BEM?| MWcg?&ޞn,O|/~neNu4adxFz e#wjG~&<T.MNInF7##33*Nl A1`;0-(#h"?(KLV)8q,<+1V~mlα`W,F7 PW_H`TTh!y=6&ǂ@ggG0J$b׶ P02<%CP L$@bT=(`T{GIb`oޞnH$c'bu篩T >ccQ0+֬/+.-*(@[G"Çww◿ڲEVݴѠ7<<3/,쭤mh׮ݰ(V$/dhtg=;Cד$I4&TCCzw0\)¾X\Rb6&ѱx"IOH 'CG}$\{5y]]3:tkYqa )0iV-|c\Vm2TE/auHϓ G{\&6B)A] O0H?,0S!<5n1s9!-mp,{Ȉߏ,--7ovCC8!m< "}d+xPoO"X_Wv7%RP GdIͶG~e\94%~ '!9sΛ7oe/(/C?HsD<{>|˶UVr-8}0eWxl4˖.]rҥKZVUUablϙ䓛m߾}!vvv>s"+**`LV9|M=9'G,cҋ[=%:eE˗?䓟"fE'DVVtrX'W%QƛqǝwFwڵ~>p(] VbVVV]0K/dnrm JJGGG|C࣏>:>6Lj~jAA>O}:y #Ų,T_O?S]/lO~+_+>CI<̛ؐ;ۿ޶m(ao6me0l0կR_|? 7x|{>{~twuktm#XPwhH7`RLw}~TnC$_0җXHKp('/D_`\ u vTa/F0q?|W\kAݡ&.WXмq?> (~X,Hp8RPpݵag>_?;v[" E5= ,/],@}oԇ>tu ̴v ^h-_P0\[S tɲjvZ˯|6B~lCStZ(i:9 RR|~$@@m,( Q#!- ;H:]au(x,4n(ǣh5G|^`[KoدCh,"6q% Creж4BNLֆPXh , K∐FG NM8XKCY8^E,6-GROjQYb [da&oS}݂ϟ.@A!"IAt]tjMYkL_yvpY:IqZ=q *BC6a;[G g'ay; r8 HÑK@AT:8tŝH+:t9tIGكkzDOB0^ai3iS6fEGT'L.N}-o{z{{S)(,~[?u[Kh5;=V],vLqh6BaCGGQȇ/u?~aal@;#tĢp{V 7&.E7@IhkD*@hiI ݻڐt~{Z|%]ӟJ{ݶxce7z s%fH GgðŶc+ (߇2ޅA4t{z7ck[f9pz_w~={@cn4$ÂE0c,@d'0=bBL,TM`ƒd|| J0DV FJΐd !:  #.xPraڈ$p"<. EJ^fxa}A>FY\&bȅ0j(4lSxDiZ#y##LoE`t|iFHM"1nբ& Ab0Ea=!FW^) Xȣqԝ bs&:#)vF"41-*YQ`/aCH@F/=!QD)MALMnFrltlp`H -H&54k"U5h !VЖ*(05o;;l*_D[C#>2< " #>3?8xↆ9˖-{G6nXTXj*߿wO__KtuˏV\rQeum>`oߊ /|gyUoΜ9s06{/\Vm t72 g2٘Q]ASF䖏 11FGG0`n[&aZI6 a-AmMSQXvbD̞ő]s4}6X!G?}o(.*AEL@C6FN0TEeXŞP +1A21( ƃ@jaV5HɍA.d#v x"T48B+XA8G r\u`C $S(1A9Tlm-yNI>S"/rqB>?f"S+4aqlH 0f7-C'lulPLî Yr 0>*HmʾSFJxPGGjPAmnanF,N$6ܫBlC!E@H=B_bED zUW^qE?Hoh&2!䓶`HĤɊ:6Ch sq!ro{; :~Si Q lשHWچc f[()EO@GG7j`l} Bt@SbCYh4tFU(={^{00RgW2pqL[b&qQcfЗb0oREʆAQ8BB&`¢ B` RPL&ܢY^DA>IĂF \X QA$F 'Ƒ+\TU")/X#KoeE%?f<,DdWA IYĴ,@0| &_Iii @gj| BNcʨy։[mUPRR{x@U,Zttԇ[')cn߲Ğh@{4:&C^?&?6ZP8H*c_t~J3C*=-#a":2!$c)H fa>d mzz>ۀⶃqSQgր}ѡ,i( !oky酏ex@Kǣ㲁D5fz JC~4/h SU(n\~pdÍ;3(sf ܋7AjMK/}z VDLxJs#N0HR1MXGDYQ~=׽$A#BKcǏ<D}^j8d@h! ? ĆaRJx|>+l΀~)؁`7z9!vYѬ'OOab" 9Ʒ<caba$ tnz812!cJ>L:{C<آ!}Ut}v}T+ lHa& #oz\ G҃ =e[D3ME ):: ˫#*)]b@k,2fk /yq <ubSA͉fTQ/NG8{dDJyg\#XIjkkAѩ(1CI+HwFgJۻcB ~}鉼MA@83)ʚ8e3bi9/,s/;%mGҸ)EA(M Iue݆e&<}:$}Jedg! 7&'1:: H~x(ր̻?I!{OLQHzZ"AQhby *]\{ѪUV.^6r^aLJޠ BTʠ6Ĕ` ؛2u4503xӠ ,tI0iZv^u؁,F;N0%lD+$z-X,TGNC6J p>Ua# 旰ˮ9se՘0D>*9ÄKtwNŻ.Sχ4lB?Nk{3G`uۉpIVFy);wbogMdEf NJR#"S&/LJud h;) vH 8SLT}V.(wS 4Ff'\b0|nMtR{@7=º W\zU7\wzmx;n^} kop勗\P^YURZ|6r`ɦ>+얣-&cz!t!x,]>TM?H5CvT@aZ@SpjL8Di$)üVt̠0Qإor@tlo&{$jV2te c&)9C 鬓_ f'A4ݮR8t%HM qXaTp 7" H) ]XIT{L9dR; RC?O)b?D5b!Єׄ\v)S9 X"+wfpQ"@<LŧRSgC&*? Jx ]Ҳ,Ȃ4#%<]P"ttݤg[" :(хCnH)\!ա`0ሁu xa|>l>Of^c9&У-ݎ6+5cUߝ9{qtCR&yqw< ?u&tKdRFH;6%1 tr6^Lp7Q>nH[`hҘ6њu3=KOr1k4!O꟔!19KǝÙkF24 M5).{Fe{GCXx[kcܻHKO[񞣇Zw:oCQIdhM,~Im Q6: Ԧo[PJ>AϟSI%bPy[ GuP^(0>:GBn@ $DIb!b^LP,aI"{U\=fffÍ{A㖜; Cn7ל]8u0ןc3}d`VI&L5ά/?'\LcP8R<ʘx&9W$om9Zn7Y8Zs)yMJv#,M wi1xg-Oj~ҟ9OqIUplc^!9tN)PSsWYOeijG"YZE0F?vLA K9re ="Q  x,V}t U !_aʶ$>5=|.^)n;Ibn 7ێt+/[jͥ}Cj(!׫$-ENfnDm,pOEf,Y;4O,SF%y$ ӹ(;r HV! DJ:bb~t;H sOa|vY)1mDq3ŤoӍƒ,1ɥ"]lde=uWdB.ץNS=->=;H?n8zKs$όVlI4TS4G_詵f>\cA0|cߓ3D׊8(ttt >߯bFB٫A Q4-xv Q U(L_1В[Z3AYU:•VV Z;mq-BWwG񍯿sP(iwq]w͟?'?֯[P?GQe-mmo>~3O~⢢M6  b?~ȑlғI˻_wJ$755`=;x׿~PPa:x3'mcfX䳀g?.jtd$HЛXIA}fxq 0 ߼z3 =3ěB 1xN?t ̐iT4lBF򐾴%/ ,"zyzBb2X,O>@bx8 FF #)$9`M˲Io+z|W0恾ޭ?oz27= Ч齇O"y*I/.QdXwK|a8*ߘ3gNwwW4:~]ZtoٳgdGܰa_Qaoz뭿//WWW3𡧞z[nFԆ ?Og?ݻo_\whJ;Ĝ 7%p}' 7ppp61BzȐZڕ )4g,LjjA{z:GF,C>58͎eM{m]w m7X[]^-(++ o"#KF;;;lOXZ" | D,br˴.9 sV+D]Ç#==M̓VPCA`CCC]m?r֭/| _xlꫯ۷odxr59[W 7O~pL}p7 W)p)pa f7R"oIp' %did]Sg /}#KJeeEHZ}, iImdh1#MZt**WIC &]-So~=~/ 0B=c5TqvFGP)#4ۿ׶7y饗>Ǐ{R }>(I##L_AZhg/Һ_G?c_m{U]ám2r3kָI7^Gpy|]3ƥM\ SL%"g|4V뱱h4 EA_Pj>DUYWUc ɨn&{|?|neKX4(싣$~E+b=a榦={g?]tiMMUo[a100Z__ꫯ=z4L0 â+¢P0zС?ܞ{QE]O?]@w7 ;z%(^0ZwuwBႂW_ŇGJKKwaOV@lNdr9{˙tpgEi%Ɂ*Q1OJニkJ! <τ%`6M 5UՕX!fvަ|| BuDς XAjAԘJ:35ޥ-ٱkw\~ں_}|d2V ̛ ģ㊪7\p|a0򊁁E!vee%mmm>.e_]]r{dgcsEAYxQ  e^r}?ҢEozjƍw4novyW.Y$p)jM'M1 :+Mxz\8oEɳIo&| fPSmɳbߤ9P#FFF&}K9 !0+%-s@n.5s,HOtd'AniiSpٓ<3oI~ `iC0hoKKˑ#GpXaOd3I~Ar.!eg`iRssa Лc,Cc6_ZR~_ZZ>_6PoP(\cccUU'7E⚆ڊ򲪲چHaQ0t2 Q ;Q(N@P&@w('HGe(!g`9u3Q0wF.n$dOtL7fW NY3(i to,h*㺜2T8@***@VU(c v~٧7?ij[ܓ7m|-IzU_^↬$[ &$sHƊ)&!3!1G](- `'t1] /4bn1phd5u}ڔejӼyh'Í;3e6ܸ)9nNQ/iԘMbW$I92Mk(:WRX¯xo};~}[x=kLn#dU'T[b$N#9< Dy @l;5 YH3~_LxB`G<ˎT pͧ dJ]o9y$sBI{Zo nm l2Gog+"D[@#L(T;>~cG>я~,=?l2m Ӿ ?U c08{F<rî<4i>= 2{;ܸ5;=3F9 |*ܸsxaRS=?nn6 .]7v$@L_{?-dmw:p`=w~mΝ;ww U`!,#' E/uɾn%1cK2dvN*ZܓYZ\YpMvgG*g"8spo-q2ܸ'nT3SWO#j bY ]SaE GT%Y,Oo9?={taYU)=]a Gm>e2? ?, c5, = B~XjYTm҄PhIGH 2R$D#?bHgx\5~Hijh dqM,R\𴔜 L9p-n,a;yI@f'w3}0ISnql4+ms3Ťp9^wP͡_06IN˱E +-$'2SjBh ɔ$0EI'Kt[<&sէ,\0w+͛7K. a@'+ ApHh7 8=KB0 $Ţ/`G/ & cYd꺅, t%&*) c'fLKJ yVB$%m.K JJ o|8Q[4ALS5ӈC5z-B*ے1AܔMH  h 0Q-Y ˒$h堶'Q#WIa]Zg*X3nlqO7 ܠ&H&7);߹6 K?R!\#:1H>(@wdɓ˹';Vy$0 xYqف[tN]o&\A0`چnҮ(+vr&?"'d:*?%)Li,@sj?fi2ALL l*/\YS0n{v0M#Nv•|6ܸ3c TpC,mԷk/--UUaZcV:B DF2*ؙX2d`,>Wd1 84y@@5Z'λy1A|Ȣh4OeOeb-\LȁWta6 ^߷~Ʈ poWw5m/ۿobKJAIqH?j+@Qק$[};?4$YDl׿W^}9|>ˢ&<ЃHE'$O?_' u7sw{~f3*VVV *#|Ib=!I 2d'MTfg gA& I ӢWh$`>dґaR:lL-]S'f| 'g4PbX+18yҢNCi4VS#SW%#M*7N*L yHidrz]@N4* ?yyZX7?ȀȊ2q|pќRBLT!̓ybn;.NZ<HEd!7o>rvkK/km۾}C*+E,ĕ؃-3#s׮=@]ﺵW_n3 3iAO=a ?l(]~CYmQeHf,:W;;/_緭o{{sۖ,n"z[Wn񖚚]{J!=;^zeGÞ;a:)7|sqQჇ};Ne$+Zd2iɱ1 Eq?iHMUeyIѶm,t׬eK_vKV,+/)y|˯f .tk/P{aYVUU  & :--M̝;˲4͈ToC}]}}]ÜH8ڳaZ>ϰͤ=NR,rb0,++B:4PW! `skkk/:tX7$D$ 67Cf)C&' 7:npit'4RߤHN2m.nR<̬}'10)v)LQT NQUXD"9:6+uazh4d ʼu&)pg l$<'s9Qi1ό,rIqzfK Ӟ rhܱ4d*]0p8<44Յc2*ӀSxf[hooo[ۉήֶm`fS"å<Ȁ:vD"p7[~mM}===`S~{οE ""x?O/\rMÔDV(hY4}1ȊgB7:np>՟YĸK!鉰\AS}BSY)Y =߫Pr!3ԼS9S'}zf f#&RG) sf}@ OKșQkbY,(DJKo]P! A =աq\x E03~yv|ᕽ#_ۺwmߵiK,(kݻwoP\x8v2  WU%c duk/ܤkmxR5x={<822BBاTEL-vSnOOb (^-7k$V7.?yfCpdc\TpN V|Fp 7:?L?7.}=IOGEAJ,{CK1 @) `(Q,xuP~D^84\&pv2$ܸd$Y esiCƍ^V>`.T 2#:Vɣ=y2çcD6Sxzn7B8<<iፅ@HOK8ObEa<=tsM+TK;7/PSt*T*N8R^۩L =X/O8ݍʊrz/ZjOQ'w@ftwuz0p.] BSi FW]QUZR"H"J>3m>62[U3N0חa߹sWggW8YnO=RwVUe8C7GjJ .^ҳW:{\~H@i}Ol~*a]pAIaAo_͙;իTlh(/"( ̑Hh[*]ol:PccmUU J޷{]{ZN4 >W ؏ȢiMê[`a 90\lj\wR e'ه];)\Yf}.˲FjUQ0ӐWy^M x2`g R*M"A85MD;ހ!V\Pe$s2(ɰBfd7)L75 À˫(U@y-ly O&/E6tӲ8Ãtz7$@,Gux] ?Sr@Jye5aG3͋ #Bxd\,ᥓY,I͡L%g9eJ|ǎM.Zʋ=6cNWg2<yR% Wܰ:⑺z%91Uq&YJ</-- NLv{B,-[~^qٵc7ˇ>g}豣/_՗^ B.b_t}$K)'^AL+ɤFĘdYgR$HBbEQA-F_۽.^2nAȧ*H,$L-)mx%O=arҖQF{tC%R~IƞS &%غ^icA$AT Oaĸk%,^o$ I4TE1?y̤*D{ _tc^sC]]CA$5Cң@e34}c:2lb:OVPOç  p(BetoVA _|VGzOƲdytW7kLD^AP@TG(G/#iR2j`Lj%!1!/rT:LD8@}]hpjgY KM-@8* 35h9< CQs3 p H#OɥQN^{2~d*0+C38].̪59+&?NIssCز6b`bFix[$} WU @0ѣQ5M:TD{(iyC30"vlѦ ^6#/t]=R0c H D66 #ZxYn(eZ JH[$ ?X_pېq&A~c%S/:`sF΢[J]06QTSS* ubVwB>bccc]8<2<42Do|j0 'p$ѩHk-:9?Rε? ?A2ṰpRMrXĈĠ&H̷| F,n)"``6r?NyHK; D)BQkiD8!6we#]SH,WԴ; 3<]TTepZ850T@x⧙4h\@{5@0Ho~:LgA^X9 B!B,@Ht: "JJ/_QWW{hSWGW2Xl5^}eeg5*Ƀ D_軇`Hl>/YFځ6w3*uhAS($y꜆jZaa՗ dv b8Eư˰W a$,ڪL0"rL͂U>,;``S,ؠHN#%TdV0CPERE!TC_L>%(>s66 N\Yq73 eY78\ELW.si z2ǫ=Ƅ>gk xlrw\s5_~le+Vt cˇq3Hw>|0 H$nޅ7{{zx#GR):n>CCL/={LON۶mOٱX 5`m1!6s׮]'O0%@6!billa1]/'͔k!ho$ 6DcUc^IEu5<#j=ӓah0|hxF+Br\{dt赯j|֭=] BBIJ2mI蔨'DP(RQKҐw(`gkPAdiG>x 1\uԓ0JH) $yL03Rǜ1^ &K6(_x^c+*JKKGg6Yeygv5ӰV/)to@%f-Ь}Y/p)F9Kh"X:BOmxG_Áe $ZJ%ͣ=?Ꮗ2 <ǗuaAw E .]Q_D!>-KòUQˤE=A4m K:x t#C(Amt+໴$W5K%kDC:f_sAh I$ *mc ( Xv3IfGXY*d@QWh2SLgEr%cfNhO*/j(o8+ B3l9bX0޽{SO?]XTtŗ6T.?)Dԑ}{mx~AA&GJJ{o홧-vБU+W;~{w=v '߽fy{>K%%Dٹ۟xIϑႣuvᄏOhF+w<}mWaNnR[ݿ֖ͯ mٵsۓ[9TPZwׁd,a|t7򊪱{{n;٥--۞~z֭Pyy!8~-r"rݽw}wwo؃>v =ȃ|YDwyGH~^~Y'{mÄ'7/[oG9'sσGx'y]/Bzux߸N4+,uMj#k34;m{DSÊOЧA .\a0t2FQteU8Q3.F9C3~ d ug扤'>;#DQ=+rTddan#Bt y]X.- TJ3I6*h\cTUѷY(e6ɣՎ=]TT{׮H$ op}}K.vJ+۽%_0'[[He}mUM5@C7N8cF .@oik E"a\~C=]]5+j46FQI}Nup˕Ѣ{W֖ ێ۾vݪe˪o,+/(A+;֤xXשѼѡުֶǟх< 6ZqԩֶV^m/.*Z\fsA|$hp|".𢋶$6n\{;~s/4C]o߾=׬F#jU֞ݻ]+nޞ.\asai=V\<7566ҹҋz5M?v]jmuMEnbA/jmkZѰsCC{ꖗ<؃7]d ~"V(;vd}BhUmٱƃ,l:ml_vϞbX^^޽zlۍ#ǏݰagAy=}t7h_ހ)Z4=#6k9abܚ""+4p4@z}nRF(\3~9ܳ.4Syj<á)ϩpŸk*,㴃 mRVVp K *2sǨ R zP,|ɂpU DGUˤVO}7CLZ+r*ez8ւoشx *2-MThE&+VA*"zB6T:;f%S`3#F3[Ib䃗Xm5qdQˆp^BOK=t6Sg.ŒKyAbqP:gАUL0JCحCʃ§eYO?uӓ1/)-o_GZ/J 'ۛ:Outvt?za׮ hh~tq]鮫Dk׭3={~՗hMM׿#DkZ!S-ǟ|{^ؽ{+VQT;}˛߲ai#^R첋Wۻ';Ps;vNb99ks(mMM' 6nTRZQxkcX2i79J֮[=24vzp1SO4"HA~10opdÏ>c[[ڪdbúU7ݾ/.(*GTGGF/;vD~~5mUu塃e'v[WZ]\g٣d2_x}}]oxÛֶvGOu4m԰csm-嵫n\ven=r$6zkhXeDgo۳wϳz}G?oڒ;2*]y(Sͭ;v][S@*X v0O|pL;S^axT`4 ؤm6*7CD ~LC!@!Sf 9-JZ{/t?~{{`g˩Q?hM1dAt<7JL?{UWwmI=x+} MnEl) mY 1:6^MT - =d$ѱ!ɶpWdQ䤕t]WD.d39P[ЙkZ ƒȨHc,9QlUO;.J5i 0_P뮻n||\q900 Myyp\ hN$e4t)TW_et8=fu]NfO|o{7}ӟЋNpx>C!Aaltd"6B{ص5]ꪫ'saP?Spm8'''W i_o|7͔)́ΉDByy9%ErtciLݚ,!>ϼ=}G&aF_7_-[@ƛQo-@;Qh4Ԗ#>o|_W7n؀uA%N[0.a gC:`L'B A;@3 ~ /|yO0KKj{Q5iz,?oӣ-Ą!Q(Jr"vg?Ok׮֖Dʈ`V mdYv#P$Uuo8r̤jHEbcp4"ʪ8֧$\1L:11nB.Fg`+ ZЬ8zrr !Hkl%m~޼y3 6aG+F6myhɄMMM{쭮(|##?ras!jŊCC Ou]ekk,(}rǎbyɤS+d kCh47 f"@}Z[9BRTYG-˵1sH{xY4[f|MX*dNo{)45Zӟlxdyϲeːg`f).)e;- wl;jjW_Wh$gOظ9ذacwO~ϱ*\ULHZ[ۉS]'{&bc:1T8{FDژE_ 2ηo⢂xlIS4;6:RkokV׌ d9D"-_e(tښcǎ566v~guםw}|z9EE@F:<3UfĂ1c88q ӣf@Ipw$g4U΍j5k*+*嗔DA!CQʼnQ_`v@D_]Uy{M$SƆ]$^KJ 0<2"D%E;ɉǦc󯲂56*׷M˃ \ps91G)n"7ۓ@bmvй[)ZaI&c!?,HUAC=JPRMKX¼BS8ɱ=p>?xGmZhyC8GBwe5k]po-?/G?1f1l}忾rٽ߲nyIQ?>%f]rӲ?Wyd{"Cˢ5]{͕Wj7O|u55*C:Cho?;[$/|6EYik]6B6l| o??{W44 zݿ}UWr-o~[ O1h}3ZtQaq(do?Sxe2 睿5kT#{v!1gK(<| ׁDqAN&RpBFo~ ׬XQ'>AUAHN87N[0Ȇ&&0 zWz)(["?7_U;s_Z{}kS:3e7iEB_xEk}{ bn8׿_ڦM*+*<Û-€(U-a g#+ܘxAizoڸ!a #n{pӛlQaSy/..Ƭ ы0x-đ㍊GsdUU=!,IKE[v Wc9q/v]rRIT%Mٱ;not ~x%}79G?}KSk%]ۻNٵK>-wɿ׬)=WpTRrŻz矓 /heq盫_s[_}oNlشO{|rsC_w< nVum׾g]y睷|yJ*?9&y,DS;'s@ba/b1/,hY'1ӣɈ2ipn##\|q:WL TK_>ja8{g%?߼ ٛ0u(s-Lgzͱ, LLE0)04ݴ,#JR8(*I,6#L+O VTȉf.nב"YtM"P؍RHI"fa 9j":xQnb1CGKXˆHcfIUtUA`n!^nnzd y)cn"@39eEl #$BM lWP*GkH>4]֡Z[8V(5mo$+,LS1}*eGab"VXX1j8zjc~Tt6+j[jH1=䌏R$.(E1Uvj)+h[戎<%xGF#Z2tT-#s\/BJ!P_ԫirz1Xݼp·ŶF ` [~HY uYž*'8#90R*.*Kq nZ16E 'q@6?ѳFGF"a*xU=*m19XS,>t17 .8W]w޽{Qο 닋 |WrXO65dq`:C I%Cb1/,!8T{xb- GRIM_ 3<s=wuף>z}y]=c^qeUUfҍ0=(Tz 1>:TLEt!,=ddsຮACR$CG{}R4L]G:oG-Bv=Ghwzr2chnC4^ô'04zŶhMAۥ5Bh:^<(j #vUuM&Yz03 #j2W21HK5 6 }w @HJ sd1p#S=Eסm,QH]o| _S <^SNPhkpޞŋ +UC)+p2Es]{7y=c#)gSOgfT#+VVQOH:bkǠ;59??^Q~un9z5_Z_Gw@[{பMyˢy*&`'o|gɲ{NmW\5VMVYOw@(̋T,kiiK7sò-_ڗOh4"G.>AYi]U[N d;膐i(Ef[Af󟹀ˌzff9 ][ڑ5TySsA: ^!p8s5w1`cT/\--ف Z3,xA ބ9POіq^xJ<d1o_Gp ٛz]"z0x@h4xn6^[W/H1)?_E / 0T]?S>0H=4b1f hh F"Bo//JKKhDm( T/ۿ_w?Oݹs86 :bl8w t+ܖCs#й*1hH&LĂ 0b섉Z1 +\ډ҂b܉'CҘ?CN&C3aa?dc?]b셙>{A>(L+i dKYJR]30q! y%pW$Ύ 3 1lLDR`a3w>Y|J1~QP~ɒ)D>R;H% 3Kyk8A8/@?gGG a4 {cdd$2@YeU _@AeZ=]/s_/|_W𕛾M zzƆ㊪;t *R[ej:e{)ӆtSi~U86d8?0 "P>#?®8RAqaoo ;w>OȾʆ=CmM'tCM$w}~Nk֬ٱc߷gGw4o }ŊPxwX=El SKŕ~o@}e]a'yMNi144B= nH&4i,0 >rKdt`ذu ٓQ7iqِ&f#;45óO 8z@H(KoɌm(,VZ\K$P11!,.AX43aQVLz"e.IAȞ~ZK L\g!p?]LCz7{Ԃ ~q"H*MeJKK99  >=Z;00;::{{*rw%6%ڶ 螘߲ecNNcVVVB&?0jݦrvꖯ nDI.//(+1BƖ. 9GFq/oXo vnTVV?qCSիV8Rqk֮8 ;jҧmOm;x5W_tg? t`ә} φt/ND]i ?cTQ/z7 cq0Y"]=*>QpYwD)|TԾ7_v>FY#d#+2FrYq,4,e=<%qu[[4+.../-_co_ A0 ݷ7H⒪e5c Hd{"˒@Sw%βGo;a_'&|zD_GwC[=D{kו_ٰ!E0LDMdNxh6=yi3z7YVi;~zWf9z$1M/ľiȳMN8u s _$x[gulI$L炴ӂs 3|9_d eD!%cH4|ADד㴞!*۴5[q&tYi=H{S0P̧CP\IAg h&R`) ē=.D)Exa?Li`بF7wQQx]Z0SD zmla [B#W5P"=0'2fӡZhhLLp\ɟ\)f&2p:4S~bܔv&̥ᠾ+LXL3Y=[F'{;\xc0xHEtq h5 gyz^(pi\,.QOr 9gxz"4JN@!p7H ;$ %IC e0Y6ێJ%Z`  `u=;Uɳ'd=ضCDP !{H[ ђ00ʐ-jBTC>z9=e=2zNsG)2-8ҨAoȊeRAP[%?BP1w19 5@.1/xPW` Kxc`t-:4zD qz$'4L :x\LZqq~AqknNZVVn™R Z+恤M;&efbD#|RB=N8*ӄZ;5xrO'OYEdR1YŠ[g&\~H;eU*e4΄>Kչ"c:fEgo#sGl 9#v;%=G%|9 IYv137LsOZ % >ڃq2C@uPᖮS<|іcv聃]c;ޜ+$ S"J=P<מlY:e`7=odi Ι-u@, OSIC::\x5%A5Әq ̲!|ڋ/٘,9IFp'((sA #KtgABj:Y#pN j9^u@]+}otu|M38A-#1:M,QMƶ~g+vHȖ Dr '9^7:!]8D"k_}wII t<ez0$b*$L/,v*"..JR|WG]d(IErQrmWm9G/?H9*Pc \@ .]6{*ږeS'O _|fxԴŋq^:L x:sSAœ 12ƛyxʂlgToA@ݥmC-t p8Dڈ[ J'̤ɮ"DoM(΀G͉E^?1,Z{C㻶,zxs_PQ!ٲR 2FB{+0W|M(|u~  {\2! N6pap KXl1.&i%,DXS@6?@c\ip #tK$7H&1GhŐ1b&M> cVi M`cHOOWx77,-fK[(8X_sDf:W*dOO87< n4 c: m)$?HLej `Y!IR8aa<϶muMhNtݺuH}~GOǿOO./B^;+7pg_>|ox/љl HNSxIs%!fNk"`3L \rL%(̫aw28"W@]+0"d,B<,@j`np8T2L摑#GNsӵ,+#Ǐ}!'-'_ F<+g-Ϋ]߱eb !yukKKKdoi0]"ׁ!HR& GMɳœ{.;)3HL$#2SAׁT*'ldұ׵?JZfƣ|/a y5E4&BJEl<3^ Htn@97g#py:Efy, "*hk*]'VTW(l^ b Lv.#_މ I P5>2Uۡ^àUE%rd(+zr%E}kcc5=7U$v`qC'RNmMU4}~羪| _Cnկ~lϞ-loK_?2e-G_>o|󙧟\V{~_׎>ă_o'S7|w9vd7[omssѣGG?PYYY^^o̚=86,!wT ,> -2x%9]U=VT&j0y ccc%9"3g\(YLpq3:sVs@`:E&@vnd A Kl3zΨ2tttt`` ??Gbia*i#p{ 1<<~ Suf0+ wޚ/ 2ζmӴ0N^:tuuO;PTf11<DZMTD[ٲ B#i(ٴ, c) h.K2YD"սuccҲRٰa?pg-hw '?_ 7ёcOuY7+V~λ?r~7#G5ۖGp v߯\s>J,+>c{w?rg*+߾9PUY_TPSzśv}ݺTIqU$;nQuȑO3J;IMpTCQ fk g#p{uaRWgE`Z M)6C,W=Q;8f gHMiooDiYYyEiY4d>" cXcgF\:=04td_W@idߺKJ*U#,Ȓ(M! KK|wlMRRdݪ⢂h^YYE˯5euu5;{N,,(Ͻ-]]C}v=xCÊ5+Wtw=~/؎躂"8-YwّuհLӕ%)خ߷{Om_G 2Jo,`JbA5v1TN\"{;a1Ut ̩D/n\[`j*E$W>xaM-GnXj칖x~1!;v#4?>tK~-qgݵ`{*\BU4k7bCG#aM}b` qtD,p@0,D"uuu U܈xx VO\l9 ~B)GP))t'ƼظdlĀci)Ƃg+qUs)*nH>D烌j(WDIA`"TץF湊Lt<A@^"~$t'fL_YBBSRÎsG,s cV*1? 10C13MC h2&' /^! mY p{<8`v9Uy嚷|Zu5% @Gc)&<8a#.P( @o(dE")|ꪺ+WW_YWS^nՊڍWYBW E/z tJVe0 GzIuTJ%iQ$k+wdSEc](͖ *hH2'OwK(Seg/#cVϨE/2J<0OA6LVK[VFTM"H|A|dxFyxIDATǏT?7'gI0?q ĝ 9gu]D@: |8՟O/-rq1 =ɂ0݉Ek.*gߗ]F^AqAQIaqyqIE^~qNnqAaiA~yIQmQeKj2ώxB<tq\% F@< %t:}Zt#RV,$F\(GWoHHꎠk l&[D9Mt :b1ӎrg ܁s }9 .`F'd 4b nKX˄Rzvpd+`*h.w@@d%MY> ecDE=dE fTV}G<UtU14{B$CMdS|BV,p9 ) j3]N\~~倷%,zz:sɲɝ\Sb3vW@ DSWp`0$EUE~?3O?c[n{#G&1KN VJ%M~WihES\U vˆ 3"EК \e gt }-GThU %B%qs> \KB|ArU'\ dEQU/':I[)d?SᒅLl2\3  9 0 tLuf`y ^bȚm Kxi{ پ J`B>di|H`u;hv`6Iyc7ٷ'?~߽{?7};'ww˶5F0Ļ<:"3, C!DZAU<y/qN,TZq)b L&$rioTOzpDƺ`}*=tcӛPK,l˥'@г=[WYwII|IRuCGLt'c&H6sKg@Z8U\~"ȯs@ g"p[^CjY0=#B]NN`Z^O۟Dв 061y~ͱ'x7xd]ɒkVSD}_عce&B!CdI=GZ֜HD4aO=6/ Qklj6A! x&9U :-f!p^62VWNwT ,H# ܦR|qbhM]uI  LE,4%qHmLت ɒiY,0MM͍l5.DKΉήᨡzZmpį~yGQQ?hԘD"تjГ"4; |QQɳ鎋!Nb aQ7M%۞~桇ΉD5EQtqJ+X"&k`{,CHKXˉXeuUA~4UeE0SFXq,Q5_tr+0T_ UJIKFo&6= / Tr ^X@p=i{> 0 @cIYx-ektIã|K&**$L\&J2 K Yă?jfA lh^Wy𩠑`}63զ !@6Y铽\HՍ^O ׭`@SKYU9' n +ݻ=z:4 c`M[4Tԉat8GzNzB_Q_:LLj¡|UC\uU::cS 3J:985?OLQ#TJDlbdhX<'GST"iCOI/)VDI%V*nDwwKKG"5778}=><<2::ص-L!'{ⱘ KT?A&P^HH*e#QiYĐr!%,aƂ yh3 ˍ@ LKȎLΐP |d4%L(l躢!?z )\Q8-WEn91ћ{Wr8.m==vJ&Qh?=O>\}}]8;k_/qGwWW~A?rɰ"T_(+3?K{yvdksKKѦhaYaxߞ/+*kr4_Qm_ܿ?Զ.ׯ-ɏvwfyi?c=C>Up}PEQnoG?;yGTW |_$K`Df s˔4^63KWsCϸyh}=t+ \+yxqAt٥.V5 ~3#L2d 8a F˝6p̸ABY\S}`B̿^SY0 EmY cn2`Ê-䈂(qZZFy˺uya982:\_[]Ǒeqڵ?cǏ ?6o>nooE裏^sx[PVQrq4 ?PyEee^hWmO}9tٕW._j-<՛W\sUk֮YSRH~w}};ց[Q}Gu_a㯽_6on-+9ggGw;o'o.҈}[8OlS22H ׮]H$9n ⷾ|UU\v0Ds]uA0@ZV%iB"[l޴䣏o+. g9y4%M B \5W_wo? _/\(JdJCXց1@ӁbDXi3( "aKWs5H,wϩ,HW0VùHWsfUKqvE[RlQ!cB{< y֤aQ@_UC>2*Q|mp@WG{?䊞H}4!8ҮBtm!!z&Q?¾d7l0rғLHZEIf73`p')DMɅ_FA=\QF7lI{djJ1.(Hm#ɔH/H9elP '|N18''GadI`jL>!xccMMMy0p$p@II`Bco# xu,6$_oA/hp(lZj!*!iMv_W%DxPL9z<(S6z6^Tȁ3j.TemiXĉ>>$C3EH B!zEcrlPyw0).Q)X:% 90EOJLO{ n ?4JR"S(/+%Pޙ,3ph ҂3</,=W&3`*(0Àk#`T8To)W0"wxUl\31ˍYQAH$A d$"{Ϟ{w">xq*4'o}MxahdzU[B*+G 8` Ăd{H7]yf0zx~TIDۣMJ=AC@ |CPL=che]fp8@oVk=O 'p kܞ$N @7H/<3SA^k *wV`*+Sa0'<2Y|\G>לf*(ŕ fHΌZZ[9rSM"^^UE_|}cْ_ E=\<'`*8U3̀ LE$jؚ OsS쒾jGGgW5E)3 L/iMM0Y-fLE鋋-P^MR4nlb*I3)(-W$=]1IB; 䚊 ""lME!1$Rɞ'+xmluoj uN7Uˍ3+{If8 SSSAܰXr []XQHF 灩t yhMI{/[^j$* tn.:6 E3_,vյBumHYui[2j} Mڎ]A2-c(%苡1z15o}*;un}v՗nzyu%`*H3 i9Cc[:cUQ,҂{4 hKff<&1هS [ w aG\VQ TZ[[S0Sb*>T" r?X{RlhuMUYi %f@kG3L@~`iZ^uկu׽񍯻ꪫ/,**(-/T9(_4K>#0\NVI;XhAJ/5P;'hBh$h\Ùjr$mX%i52'1dzN0A쉾HlCB-D}:0ksCfO}^ୌ- kA玎ɪ*z-:4',ZF Xj !RroRԟJ[&&zEL+-F{\ױjgPuESzF;V4,-+Ԩ m=\GƸchw2xZNz1BTR`D={yxl[hf?rF]‰h9P_U)sjJs$5J{D$|҉HxqDc&ML$8E`dr3O1skNSk48 i0Pc fTqh Br5ɓ\SZuDɒqCkUa|CQחL۵\AC2}M7|>Md%XIۢGtE{.8 7_ B7A;Ql|I\dGYs|H%UDvh蠨RdgvABK)TKYJ۰Q%9U`f)`I8t>~1:Lp0c e,A/ed*EaUadh&Ƕm? y<=@F3G&#NiRڪR^ӬRX<fn.QY ĶoOQFM9 ?zr措܈VFThŀFw@ѳUhƁBgb",QݘoZx!' -[-$ uN^F-"˨p$8n̂<#H;}Z(`L%#], dB`$o NqV@p`(<Ԙ wVʍy iO j/nI%Lj㌍YYSS y&,g"p%gA$C$`?WCy6]YeŒ5J0XRs:ڛzj a83O=tD~AAN$ajkR2nsi 4%$xkS/Jc<c0ٳ5ZL$:{ǎD#ᐪȾDحyQaOROjk`wOeˋQ?fHQ)|MEg gf?$zwtMOOO^^QZH3ӿH7xgӴ>P8R,^,7T h4.Κ 5-͈I]d\sK2LYS G"6}ZN`rsr }"lB02[,LfIL%Hvvvڵ}lGg='>pDpJ8E:ȩъ g$\䒡Zc6 )crH& d"L**ͨ_)#ʐɔI., -h K Oζ j\7E\!A6T@ cZs(iBҎe*] ȊL"ڇ>1dO3I~Ddu˄trCzXA`ktp0;<ɓ'm{ ܧ>? 57  :yX#;!qNaâGwhGXxj;^SdRvwk*tf%5?ndGp@ifD\O`?jW33ϳ{9˙ 4͹gjg py: ,y:A3<9]ADtVlO|$TS|%[-OdM\˳Eit©ێ#MIi^nX9dt'o\vc#=A#UV*?U|/6T]SLg)4nD{GrC_||~˛@H6uHeFs.첚UW_?{_by<#8Ky.혒J =*F8&CFJ<. @u)ݯ s~g#p~1# 0s}=W aKXXiRyˇtWZY Y!q!{ڹ6pS9LMB]1bu]-njj:莘 ,_7j=V Gb]lEM^Hc){|rTF#቉ CӢ?/&bu55즢t7eF8i:9QLZFHM|Ƃ1z*+j2q v/ j;|TYX&Ifb⸶efJɉ2 B*B!Csa&(x$IP̀MJѻx!$&(aY &@D"DCP4lDAR5 \C8H8KdDEe4K<徼.&jBK$UlZE:@N`3y3bA,2 2g s"[zy!cCuaD<&QhLh ]im?zN`ݹ{?1n#H?-x-۶=}mDo[ۻw=;ݵߡM7uu?яxat8:6nJSj{7թ$."`)qrpC 'S 5:~'nP"WŖ66u^nL[hmm7|m‘[ne֭9x`?{UQݽqǭtEoܼ<G֬Yc Ȏe LW>Q;22w^jdQ:LU?f(kn?0 3;԰T*3,j"PaeeMMGێ-z w⩋6\fH:/[rYNq)y\&R]w ˿|P^n.j$-$8CGww׽GwP8H8:¤RZ$jAd QEMS)H-D7tPh4j u IM/k!>2fIGq]Z_ts]wmMNД152DmzI5(f e&e,1QFB H,ӂbhK*Y: f.ɤ/V_\,9A8?7JE"HFvqld͈yx7K<徼AM&0#g,L, ``&14OL " 3g"_P_/4*hx18{I該'.#@Su+CҤGb>QVV_s<|榖ږrݻ⾞񱑱‚dZf"?(+ꫯhN0pTfo&W W䊲C;&$}`{zYmyQHAMAgCu SAO322UvuucX[[D5C׾-__WEō'N\kbD>o&`@7xL`aH܊xLmzzP+4%k{D$DZ ~%lmmmjnjokCyOOL`N&Sd|xx&mOOа8ўnL67hmmM`9}}] mǎ188O|D:8؉DىnM#C]]ǎttwBn2=zXkKSW)9v^2Q]#-m'Ntvvx+Rl|Mk׮=m'\Et#11~䩁1=z CPd+%,!K% .2"p0YDELB<ŷ󮫸2{fj%EPd*^,Utʹp$wM9u J$%5u9p7B9eݽm}ZQC!'?٧??g=}݊',۴xʴث6=I*mn" ]}^ZNyJ9i+$7zEѧ0t?ۿ׿YUUvhNv!2‚ܜOç7_[~rM7ǩD@LcLeZ(%(UΐlME[?v2<p~s羼>cG؊s{[ +/&NgbΝ=2T옇yar_^_^^@`YT yy^15ȋ>/̒Ӯgƶws޾Sņp^e8_uTߖ,9yb6`pץ5"}TU!v̻?oPJ TE@CЧ - ET8soAT<փ1~ Ǔ֯\_SV^VW].ʕVWF e)/]o;pu%<ܳWXru(}kύ._ƆǎWv&Ɗ"ƉVhݚիkjS)/okk5 ]tIYyEwwOMm}$y:xo|>]sMAauc{׻RXTۿO?![[9z r;a9?}5Wܱ{}7"?6ľo5Wɒx뭷l|Rvʳk{Z;klp`PWǩ?ybxMTd/YWBa1h !g,L%l?~g"pzqPBf#p˂3}G{ =!ece^T$2/3bFf7~辳+JŻJK:**spڍ--EE% 7nZqp`4w?j-*vKV^\i͉dthxP[[z"6~ZgLKhzX{gomuU]Y~XqxFwg0x1 !ȉ\5Unkk9u'ʒߋƴ,Lh;:;k!lWGyyy}}}>P$rc"hmk;z F^:20蚊Oș&HW{dc*H]Ѝ?b*g(%%k,Cm7M8- ~C;fy||e}E/Pv~'O&by`h+VJ&G} RJlb~^5W U[Sj{}ǎWaeeeќTѣvydGQQqnn⃃peޢD$7'w \tхe+ EŅ9J{kKjjk/_>:2`ayN.@IMS׭][S]]ZZ D<|l!> J LsmG}ӚD" 6B$~Lg#lK@ tnH`e)%K,2mH+J;Q\t#c)+;&SqZƾVY7lٸ(/ 뫫׮Z5)/XY_eζμPޖM_w==BW]ёƜHh6߸v*)K{aXwvBe$z r$ےbEl2BN /RtmG^n݆ȶaܻ‹0<5,_ s*袋֮];00x嗯߰o~seŲ.ҲRdV2tIK'#0%M\Vj41#.lUz3q(7 )j(!$X 1#{Z UF'Sfkٮ^ 7./**ʁY]1Uq02ؖ҆;V4:o+*+*/)[U[[wܱ#}C#Xmܴ1EVX ,•W]u]ih4x424PUX%rܧ|dYyEU4z*hj'N]&7?g||&'9xpa^^Ia}GǶ>m՚u:پbECAQDl8q|sPm۶YƷmz{:9v*>1`Hj;w6\]UUUXe&ɧ~ı(fx~h&uh NX}3ѾnuZ |0?U973) ? tBg866 H96hA}/i Lg!pldH4H&L!HV=.gڧ(@N'9-L17F|HPy0Lz! Ի?T( YZlQ,yc>3J@'zZ&237e~8d*D嚷|R\S))A5Eύ)}r\ENO:ujpp - 4_KZZ,TeIC0 UWDi%mV~3Y0:˯(}7lK_w͵UeFX+*.\cWUTU/$LV#~a}3 íY< hX,CޅBe R~~na~>mx%kV ׾Ղ`QZZZUYe U`*{|~o1ٶFlry[  Y 5PV@U C0X^VQSSQ*NUWW!-7'Q! VXj*ʹa^3b5y}%gttKV-[ ϰ̠ 9 -D+ H ٦P8V%ݔj8D,)T"q%T)!vL5i< }~0II9)9'eRĞ=*K ETW'y91F8 Iпф{#hp3A\'1eIY"`;'50TڵH slP*=A>Li> #{Ks* F+QO:+/Znm4u B ÄAb2|\juvv PRZ \̥J*Nidb޽ǎRIϦ5Yټq(HiY B`.ѮOzEߋ MQG sDz*DtlQR}W\,ǡ1հlde|/d!*$4ڊ ^)tjӴr9E=[j#ْ̨rR,3l_7BICOA"#Hkb;??]mܸybE}>xY;j0ΏBQ2 X>灨͑(C7R)srLrZ%Nq2,gYj ֙⽤XX -EOuG@!rM-I0eQ=UU]XrSC++bXss3f\1U LUFK 0:O #X3B6 #E}0LI< Ч555 g ^FNPo% ĝ84fɨgFH:%$L_* >S%S nqQm*8UB2ApF_^=wQtCL:G /4"^ix"_*6!g䋪AoL(,m "n FV4lUǴn烩2u۴E459!)\U=}ZӏKdZih6FI 0-!QCD C!)<9ۮ+=eQ?\7^pyls9hMu뀬 lPFK\|ޤ)cSmN&SP0TrX} ,V7jgx/OQ(TX՝YLIɓ'/b4%>qiKx5f\{<|dt8kkL9lK!ɣiVJ0݁,іܫ|F/' UW_qޚ͓m3웵`* Ɂ6YdP^L}*&8@Ps7cĭJ3uFymmm%stq 0 _r΢3a\cϖS .t 20БØ~#xMk_Xiۇۚ[S Kꆕ6o"k#p^$Yj<Ğk}@mAcFal\CpEKI Jв"G:Lp+AVJg2.BDs̺L_VM> (8tM(Jn̥gmQ2#Ta|FNpAk*Tf!'9(6-1rk*! 0A)ȁ<Jc0صk׻$N⣣6XEWh³¼hnЈl mA&R6-Xhd;IUDphQDs SUEё nB55&C$9Dtu9j؄2-t Bc-3^d@hylI)ӱQ ' ]O#,њ $Kl}"˴!Ftk!"}VL9DpӴT+b+"AEF€J Π2HROv3ڻ6*,T^d)M-'hA` izCk*M"cYݸd.*-pj+oj5. )K&"cS,|s|z"M$TbAL%uE3ỎlD) *3P0yT2 GɞPr€X*q@AbKT3f< GpR̘ 'jo)LgDP`KN,"H8A*E߲>2܂P(,,O+BC[W2=-Nb4Ɂ'$TH4li%A$IEAQ*hоo:j bڷ6 r MhGF&āLRg?4,CXà,pCĨgH?H1э/6zt9B"m?;`A0pRBGVÐnKbtJdgJ:->IMJ$so!0O%擡82{GgmjQsZZ%ΟO"leTLȖ?KEpU6]ùl;aԽ4|p-KiBa'ex[9J_?vR9ot/ PLtT3m $}3nbu9pL` |i:0΍e@6'j=SֿRcDpi:t ?jFx4f\s@l8ϬOD-w~|7AuXF8lryG!階K!e0٤RN3k6T *QUv 0 _p\7fc(NX dЃ>cW5U )ŰQ ٵ]#,-?lDm!D& \ g0Epj γrh@Cy]ѳQ.s5Z5ǣԼBʐj!A|йgOlh{cS$kϴe:%% f/g .dlnD`;˞#6Ffw\KpR,z6ΐl=nLN%˦OM8y.)9tȳO>g}{ya#+*h2jz·&d[iyWrdAnI$b+l=C1+ !ra)Hg9Dć+@MאUWx^򖤼<}p}\u%L"}E4`/d "Cr]$۶ kI{/|+J4\b|+21J0$xCŠАeF, :c]« 9l+:_7\b2abȧKhn0ƙ6gZ( olچ$[veڊڎahNNL`t P`D .0!ˢӤmN>"m.eV(/D$b2I&%y}yVcw=JׁPؠ-tD#f`2:x 0O%=D=m`O Uz! Y"AO}0[k nS\2kD|EGg33%b3-eĨ`@Bx 0N'r")NѰ)!Rl"^K8 @yTT{n`. 2vy4yУ,pr2?3lAdefLIsr^j }h>{ϭw Z S-0q GV;=H~r QO\3( 8!EגW{HMY8(hU <-i#O?Uo㷷v{MM-E8D4EEf~IpM8f=P[uhb*j-VtGIސ9`ip{uz9:wV3&rΔ3 o'OW]hAt #4ik<٪`%u8_XZT2 1"Y|26bYeyMuM4]zzEQIGxlxd\0vaطosKh4'W]/rvT{SsSltl}ehcs'{zsÑ~siwz{{&޾x"o-mm---0+uήhS7;焳\1 KEQQs' m1OLtSC>Pld ###*TM~{Xbj) YK;&E3L_14a0ŔN _x ~@2b0?_zS\ؙ^27̘QQ3fTfArv1듻=sp8+1F<Yx:OqLUn)$oFTi} h Q 򅪉AvQgELC-}Nw: .xJA~9{S24hA)TCv>wG{ںƖVOҔ';;KkC!s۞zY]^^~wlݺu07o۾Ɯ\ڦy~N?vfꚖ_<Ž{ȓOn=y޽{::;u=*<ȣM'N+cw~`thnncvqII^^.L*]G2; m6 4aHdVi1dLM4ёɑ\ghrfw3CQ$HݕvܕۻOfr\Iћx hn4i" UY@ՠ{G";2ĉ'"3ʌM%-eMÅ:] 4o"ܸmW_C 4 4ÃݫJ +LzvM9PMzh c%liE:+UJ%,"qubyH Gsif|is 1P  PGQ1,EFR1J1nsP<P21_Sطi0z5+*yIL`Fă'c0x"Z}ZꀾE)r&Xё~Xq0' ȊbJ]Ϝ9qɀٟɳ>k;Б֬Zz('>ݸacGYlrthpU6]g kj{~e͊UO}M"O̬_&Ξ;g~_뎻z[[7_kim]eK]m֭zzׯ[;22<95mINSS+/\S[Og6nܔUVtXr*17_[U[[<`}SOzor:X$[|x(QcGWUpugyGW71 %<;Y6J(8xj>_{j3B[`fn68} +݁2*Vj˿'@m%P%'YXnB L7QhN+ :}FY8eFZ$ o (Ƅ ^{aPo[鈧8,3*-kSJnc0$y;;C0bƐGj9?dCm~r7TGL\];62 PYw~gMMD-5逅DC>W/`M 765|;lܳ{>C?3ݻw5[6>okzGXiZBP;nEkJ'7XcӺkcp(yӖukݻgssSC=֛o{m# s5\XsmUmھ^$Tz͊ #f*F_23PeVz P?aE78X-?gyb#Z;쳟)9gV:MDZZZ% yf,X 5B/:n?@ LW/t06ƓGi3*B8 X +HP:4۱/R.$_wT4xՊQʒ|U, o~]G֭[i7^q:( gׯFfh2C y?g/qϩ a‡6r j^)S)|wwd}}X=YZN&eI ݹ6L'?ٻgw&Em;t ]Oj#/yMh?n=c3M+IٿCa>p߃O|'Np(olx'&'ݸnՁviȴ$(=$JXe@%d*=wTݠ)h6 )nOYAMm f~ڹf,ٚիڐ7|F۱{z{{tuf--MxȑDwug}C,J FBL^dӺww^z~v{`uEMXΙ9-lOTµhCM,H8|x& (B}}ӶMꫪi3}0hJV@>֭[գUWuܾm{,sɹdRV+IXa]۪ Rr@T]TS ,Vz! 4*@~ Y!?(:~0!vxiEݞt9UXcVT^csbqlO%*\C@NX&3<϶Ju$-S{fתy79x8ws:x9hKked*p.s.S0]B{1W[Wuyq Dɋ]]CCS%cuuF`\Z7d$cdL:*c9L/TTrl2Ef :l,DM$hm~KRdñ i֪aJ/ z m$4}  U Y9jJ6c,R0 *{   æ=@P1"kvCd˴4ٕohaSI!oPsV04C(f6/s@G)Pk߱9:GE" >H/TN=x4g`YQA}Hrjqmތw L7`F*2#?c,wp18qҕ!8G灥Rt%`*46(TOnF-;f*(IM0H#;ˠ WUbDNz)<$EYWW^yJZ"IA;n=&(A*ǛvӱhZ"e3}G0AiB9 #'3,.ȫAvƔhHz/1lRU%kZjDKehE;D] !c&UT%ZB2 # 4 45X-cҡj خJgsa"5l=!Gy@TELXOQj33~%WԡGxv ,Ld,{,S8pm[ ɯ ad7G^h)a Y b/;wDz4Xÿۿmv]ӹ$)9 B.Icxzиt6Բ%JlwaC<:m6R` U>Z?#0"[ hFL9Q=X@qilAlEBXg: #`a,@ !߰|C/<"57Kr(X, 嘱t%QXk+4#/^Rgo{UPAp +G?=52L -)]dLE|z`MP!tqMDp4ш$zjR'0T$T]Uix`<w4fp~L!P[PKzGW Dz"Va yLӆjp(T"`aD/,S`8+h:!T! sZh\$ABWL&SU#B  epȚP { T3^(~] `dP}sX(}0t%ʢ=R(,+"3ITP =c<`rC0X~?, s N RKk^)0x̨QKX_yٕX:㣄]ֽp(e͐ƙUR}Q _!=s1႘2+_9Jz{{1n"ra~H=q0ELE|S?eFQ;n ڦyBUzfBUوq1-K_P ]S ȝNgRA,8,G m(D^h!F\ Jd*uE;+b.V\h3#F.~slc-?z25r/j$@”j@z`; Zy)2\D\A?¾TQ/pnLi折/J /Fu][f<xVu)5B/|i4n.0_ȕ\zrVLǬ{S1`(jR2n a/.t[n%#YQZl&;1>>=3599 =`*+Wb=D^6HXE5ЏHV.+ 3lDX7l h-G͛#6=rfjdN*qz3H&H iA t:Y0 ~Y}G@lF_[b_vS)re`ok#{W yhD^j>kP96l6g#  <}Q^o_vY1{ȁYSWex")>,·R;6P9h14 ߥKVePPw; 1sP$5Wfԟu"H*eކw) Tq[ QoKu2?qbn~~Q6vHUtպ59rC*x`zbȑc:/LNM)9v. ?vBTUuXәsg&N<1<:EӅBӝc#'[i{m. *eMLN:rhhnQF={cpf9s:I?q`cǎ\eAiՙs;O>w[hI=Yr`lbb~ 2Ƃ0x{{R&UQ>{\b؉=-f3ǎ=~(}vnnhrwO7ϝ" Ϭٰaj.>1=zŊ>ti}aM<+]= g/^<}(5p(PtCDž]}BEF䪑30dHɁnRURPvķ8SW2U4J~33q1ȩ%PQ.%ኽT_ XaW̸FǬPie[)YҢ.Lc ,U\p~Gl|G\TrL?+i5O/k8?iU{}} LsHQd`YA6fJ0e`vӓ3ssPT)4LOOX v$SQU0KݝOiս{w>ut_<8P?0o"m.vV+G?uԙS޴qZo֫/}˃IܰqKcFS$G]Iw+VU)޽{Le]oM^y?:1:}b+A\zzMw΋=/vYSXWwyٳv^aC"mwwיS'O93375vR_z ӣ:;;ݱjP@tRt^y7.]9kiiN$G>uj#\N<|C'NfRMM ^ySgΟ>8h4$ RoN35#o:;/V?ӮO;tNcǏn;w魊Fz{_~%]};{WɩΕ6L'3um3W}zҦ\_ήޡWЗ^|T:]CƸ(u1KzCW@lF |x(QHO-.Cә|b5%q-|m."|L+Ae7 o0*/HQ|c 7 6R^%:?J WdyΤMVV |IKLo3{䓩t|v>qX̦wN[qX]νV^U s׶;Q5К+ ~qݽmuTU73;x=~FQUښhUP\ljT :s:m<C+Zcn翼m곧NzO}CCkfevs}Gt*ڴiS[[>pMMoV}}?6Αӟ, cWZw?0Һ"^|yԕ˗.{?}C>c6׽Tg4gɖƺĚ~K_9p]w\'/}7mj>3h'?s1B7scƹ13;뛴꺡 +Ξ<{zg}~x/8pyq!")96|)<3U]qY~!Ҋs*~RsotFJ|X'|5i/ȌooSliiC$R\ )`(Ɠ3=]}U*4ӲM'H{E8%JK " 8.$P=\v-~W P_O~oA?,v,V/^ry,V/y1"xE %@^/O* /P O"lQJ<EC+ ʼQxe,V/y1"xV.vctK,gbxi~1!Sr7?-vzK, l 79910p)LT754T@3rFC$Z3::ۋ,(`ˆr, x,+ݨH;o[==[P믽+o9u~Ӧ-7ksg]ollXbUpuu];= ctշN?>6>XԹ d:`bA_g~ ѾKC+j:/\xW. ^l[b- G~{Ωٙ5W'^zi=d[nYfM$Lo2k~C8yLλD#gOٴaC]mppᓯcॾ-wZBh^xܹc7m >|ԩS×lݺv۷mklh2M3%5UssWinn;y{v\SS%`H_ܳpWg^륷v UsCkVnjCy78qԩӑHtzzcEcC^۳{;wmv۶-uɹӵb톹DTlۆuܻ.4EN;rƖ_ UOVutRO{vwE`pKI|xiQ/|%ӊ@7 UIQ^j.wi) -;RPQyzLyl\=Ď䁉\KQR S+zCaAo)W?lПz4 _ܼqC8:) ¬P(X߀TA> Co4eIqD">:6I1^bCCCA_YzD" T6FWZdΜN&Үaoٲ5T'J!74LO&6 . HR+WF#81 N煮{v~:˵e)Y"Xq(e4%4Wh_f%)лEI+ B)%^A*Rj'>`.rϏphE(}QQ/aϑ2H."BZ̹z0G´F-g*ЅO=M- _@=2 CR 1NJf O0S|B:xӲ$a4XvӪ*(*/c+%5]K5ˢYhCUr-fm>Sq-WDH Fq1Iɲr#>*Z"bF0YJVHuź$ؖ%) #5@:l>ض<˵*݋H `t1>_d)3Q'r8kAZbځ >Ryзp8sJ BYh:Q@ Y6iN' lפaيiL Mg*}0,] GCT  h;GNu,'iP+!jr\Y:9NfL+󘓩:.S4@Ys([5h(ms)t9ʗN/Jy/ c1Jiٷ8]9mY[bE6]uh460c*Df_A.. _6B_kW]1NO !w ѐ9NbYGca:i3*XhNa۷mbU`G{ zc`E$XfTj O\bƁL鴼 EqoTØ ;וl˅0SXNL YL&w&%xilGULȍ4Z) :ʊq{E |rfiU/$ ?̳k֮)Ӡ_tSɬQ&ހRy$sK#PoJE.}80 )h,Ь2EV `W s"'0UE(@C;%DmDD5dq["'J+:μ&ޥ끫EVLW{- Th(2xix_,5'._4}=bxeWmE%K.%W⢗L(x]yrW~x.&\Ou5(ʫ`dM=+\,ٰ.l!˅"op˗ #Wz_z'9 _`)>/r0,n9. b渎elڊw3͍`fRX`/dAxtMEeu=ԣ.%Ѓ^Ga/vָpPܹ<(Eq=Il<rj蘕F$F^yG0鶴wm::"ۆik +R4F&@3N4ӴSe PHSpM˲ +(ܐ|,M 6vD~})I+#w`J9< ̙^/ґ4 bd7<f1UDS7c/y1 EO6K{YS6lH8&H}a*48B2Cm f\Nēa 骪&I.ma$YinY#A bv1[ptڳ1u!M)x Dxy'P,(!!ɰ$/gg.,?מ?"Imh0$t &ͦ)ERDA$J*cXg GK`{}g2Hr/DA2i\|n#Þy*PJT}X hT-f9RzHBY 3Tbc)B3qnaPE s^-0u/(#0XnFtHH J2uvllHòm8!gBp zg $=br>Xy?:YgߣB4^<痳L.CQܥ(`Gz ³q:!oBV/cS͚Wbxi7<ʀ oCYbySa`h×/ڵԩSw9tPj$bA ! };q#'S( l҃7-ʧQ.h4.-*!$H? 4,Nd)Lv) K\' J˲V4t*57;חL@GdMz?ͽUUf7Ma@2[njY".,NX8 )Jy,Ա4 'DA;^jқޭ+XE+~XJ+G /Odo /+ISt-Cr%<֨U])>qEkcCL߻Y^`=bD^jlfm40 ۱{[qxJUu49*J刂(9cc3^zߑU*:35k$ႌT mA$#R]j$"#l*/ChsT " #Wym' Tez+Yhb.yPv2<|% ʒL]A(H{Wrd5]?|[PxͷUEպ+$٨*J (Lؖ~6ϗh &`E/q |D 5 !4x]H B:Ű?;hOX!,yUHE[y Anb\[G H"+%\+ҲE{]p$\3%m1RyiP_"|e(Pz u[I;p{ ॕ\MUr@-[$wg,~U? yo)OȲg7ۊ9 pd#"}l䑲x#`صsDZc2-6t\wϙL:1;s'N5Fdqrj;;Ϗ NL두e9O{睃O C%ti־<|%J ];sl&ucxb'weZ=?pPtheUО^W+tVTUUUUΩSpPN||xnC.>25\akBqCRHpy(<_+Nȋu}T^zx.Ep%܁xx1E+^N3?MsIV e ;’Q,7Z_;((;D|0?MӔyɘ rT ˲̙ (#\*tb㦍۶&j8'IboO$jtűՠ.jO_#r$ŮG†;v9vpbrofj>72>S]lW؁wjm+\ɓΟohn2CC#WFT]]m]ʶ ;%IF&&^{ ]sS3;/ܪښ<{nrttsg:/ z9yvC㓳amkL%g/;rnEagOڶq͌L7NO?xbP6PnŮXO_hTCCc4/f>Gm\7 py%QӖ7~PVT⎛u惘9?K 5-]HWX.3{W/b*TwxTIBL`LM@l< O}:(f%( pF=44}l*2ocsә\*dϝ IRGc}DdEDNKڪd}{u?=L_?_L,V?x6:>6bʓO?}-E<11J9{-[4w'>|q;'+֮=|ٳ4M'''bZIGGGo?ǟ{>vʯ|]l:vM㍱_Ν{wo߶uuʔa=Onٸv)~go[?XO~Wy{v=ս~J;o]N- S+֬~ԃ?я>rŊH$}C>,8MJ],|+y. ?,Co|(!۱_,_W9;>{獊p>Ff]0>O%,ZM~!Htʕ +2JYS aQ-6 #HF6m4;;H&o:3}™y;sD5,ZUCl!W6l_y;tu_AHk;Dr.RpKK[m0(ʶ쟽⥁HJ iAmʕ`6l+RblmljT5d+I466(.Ff ]Jަ(*Z۶oVa<cBx>> WݼeS&u!8ibTLӴmokDvxɏ]ַuرq"M0œWk,ykKNb[Ʒp^(-8~`HqK2lt2N0H=`,!]]];wλؓM>wt'={dhl*pySP׶2K]#b@U䪀+fJL!F5cnpp`v:^$E5 LO=xAE#> G"u>/~ooo6SW_ןf0Id*27??&L&h^ax$uUYR5&V??% _>YWSEJ2؏KE8[x>'xeM~}GQKqxM+o.1W59|-,5ܷ o[j :$/ Yrw|t@UK7V$/"/`}}}xNUUL (03gώ:b i}ccӎm(yَ[[be*tٻ{7g]>Ƕm xz*yvϿ^}qʕ{~`×3zꦚ/L;nkmlHe?zCޙemw;o‹w665b1QTM? /ɓ`/o]nCnڰ)C9yӦ8}#b1LaͱhMM՛;A_vm \beSS׮h˯.v7w=~ҥƛou=ZVaw|X/d,  */e:"ߖ BY>,!;BvݠB*P3]zTo|0V7E.{Ž 8HBnFv_đ/wߺyS0_8-ld|NP## )ӵVYLT ;$-џٹ={<|hbb–*%\ vM0moymn+@2vǧOiz[[[$FWѪVpl6D#6?;k؁hUuPq''FL̈šIS=vХ+Cπf捬;:Za=֎'L&SlmɹٱIrb jAWWWW)*<81ZWS\:[Wh*Q]J ͧ7о]ҭ;31[ ȦB5ժNONXFÍ-35hd3W.gM+6iՁ$brvq@^pZ8.r4/%J{ϧPn[Y p\Ho#zcD*%J(68 ^Ӥvy`/aA-u#Ba,¸ ™ty[IR^ $x|dd$Ő\@ Ն+#Wa O)Z  ,H X&{#𚶕{XdVMH`;NLj4qE+(+Ɋ$Qe8}K;DA-Kj'/-VSZk;$ץ<yTxf[$d%F)v@e b k#܊H9̨3[Ԅ@Al%n#6|h9S>0&1& ~Y3E)᜶%F ,'޻ŗ/riE7IYOB}q C\5ֲ?aП{*7T.7,*`yJaE@vB`sNv*$;*溶;5+;V%7lZkTVUlxeB T$[Ɛo[d[]ze ?˲zoߴ1r$*4QX J@ڈ 0ⲅ\a!2A;v H.hs$);H۪c"%r i'A9{LEudAz)Иk"]\IJE&!:s/-ͷ:B}q#LS`(XSyP(Q% {nEbHkl71lʲx\fjMu )vh4sk#Z0 ,c {oAZIyHX8X( RxPV[Ǥ'Fɓv ~|1^-0xN)^)^"xɋ-%M6W=BF~\ 17"413#2$JqdӢEm-! 5VbOI)π4\"r(^a,잊eYJPIfdA EVeAu)('$ZҢ?tC%-vOj )6b%t3DJG[vt-tSE! "5 T Mc`_Tam `YˏrvqFGzYXmj*RR~(%ueڼDK6HaEB}Q=Μ;KTCߊAnrpXf_d2 >)eTM+mPefhSViOdCYCV$UpL5?iZ=-\2A 8%!UW$IhmYw;>DS2-`WD^E\ }E v5L yX( @[XD(]xy/OyK^ /mP/*w*|À*@R@8,tQ B3T*IfǞ9Q4TͬZ j5KaEfM'mdE]56xѝ/bG ynD-tlǵ-!W $J|@t@Ir L|!!_\2!DnXt*B6ccZs!WtA ǂ>Ip ?`Wxɷp sܘ9Oi~ xm+OmZP_(_0 \ ;h'&X *z 4X;33Νps`ROooȨ躺< ۤwy,>V$>q]]&:ȮJa >tG Q bd4I6,j:B ɪiSH-6ME.DV1A/hI)u"F !2F]RQrCPQP ġ*(C$ :A,`Ҟ6/t5{$7 K@.u A9_{+ W,(<F__PP ͧ2Ue-+n4/rǒZK[beF@̭ruo˄}]Wo8 ~yÅ@Pd~(R5V9SCFr74{j &u8h) E`fgg.]:w\wdow+1X);y&dڙߵwxxĠ{!4r$ײ%ב /G-6(튎娢dg gMGT[RDz3 һ= YlǠ@6؄H{ zEّP9Α 9)HT3#+ЄV8ӔQ"M 'H`^esKDԏ2 pYॱei\](ܥ6nR[Ako#׆'DzC-JN"xi ZTYOHhy*ˈ Ϭ7] Xr)^"xɋ- ᥾k݂0%3p ] O zWz4M\!wr^<4J%&02.@ GFz{G&&'&g3ٌ(nk! I7 Z(c9KO,4L?gI5 K 8di(&I`& ږm[F_B2 lBd[ '\2Ft&-Im"=A@a;D"k箉L&'>X݄% h`4UMɦ(=Md^ڌaʹ*OFv % _j[48 ("(*<VW]1~'J5CD~iUIIH$=}}{Ra'2䪉306;63>=171?2961U i _{_g?l}]&+MvM!`flGR4@/dU+/t.JUUTtp$ڦ _`ӫ:02`BUV٩NnܼVW]쀫 +Ҵքa@$5]˘4r Wil. ڨ oi~QV/nUTwn%{w,7EEį([Rǽ; >BZM?J ˲ MNNZ͊Qae7h+bBSۊHm}usڸrZ])ww mm []0 t֪HSuųiS굊uŀ k={/ ^{Tho|흧Ϝnjj كN`_aGصApD] ygfv_>zؕ˗7o }3ѱ9MK95;U#GJb@7wܻ{v޻O\{vyi9V5MSx"T ~K{]hk8{uUg9=ZgMQ峹l2{>+͆`qtIk"'&'eE Ê V,%SÖTM Dъ qYriQXf'\EKdhSGlR:MuMA nZRdۂuYyy"93>266vLMM8r|zr6Oŧ'&:/46և}X~P3 {}6jc59{g.eM'RDH^UE7jl_Q[W>LSbgG٭Z(ykR \WQߍӵ}/wK+~Tg3VGpQi6^t,.)vMTTAT‘7OGۛ1OLLNMN% gJH a|<lgߥ+iZLlUuU )n8f`56m2\;)W̺Mgoߺu]h]r@jjz*pDhHo}G>ѧ}~駫>{g`=Iܰq>mw}ooݸ1LNl׶ԉ'o~zҙtOW]{zzFFtvv[2Fzbfl.<{z9&Dyxhc_g?tC}Ξ??xypxt5ڟzc7nbQ 85-VZz"?jk 7-%SaRhY5&y#E2j[&Ȱbzzvxd,1h-cZiZu1uػCfDtLAo\O~4*V?v\o_Xym۞xO|~l*麴.-su=سx~jڵP:kkP)2^SFfQb1IUVXQ\];PW]ww~򓟹n󰷡NiQ;۠יQںBZl$1|}/?g?۾O~}~v/?6>n|--J10 (يm<-Բ\;@&1 b@TUhDOb/ 9(l6ɦ=gd捬!Bf敀%K.!7$fW.F˄=p۹㯼ꕛ}GEf ˲@-@JѪxO<}TUWu4MK &㺆"DSdYu瞹SN:UUU55k׬~чyCMq^zUQS\IR4M ޾޹94á`mMM8~m?O< ~&tm)Fk#l|.kg&TSCXR;n'Y+RT1;RUeT5vK] 9jrMmbNTR Fe=HMSQfg窢UHp6Kd]H<8u?BsDdP]c^v- Xx Q^3@pKb7A]nZp Kvb'wSl, S) R}Qel@2sJ{܂KeRԱ0 UZdğ=. 74A]=^G ppUd(X2ϏCOsSs}m**-}&w'N2>!ӗE9&gXm^@t崹6$,8`rޕ,CHٖ//|_[Zٸ 5qim+J+* f@ZEr,-7ѐfҮ+ꘆl=6@&4Pd&eꪬ # d-тR0LRuUD x.L QP4AU++d3$3 dzXNϠ`Xhڏk2pý

#0MZWQt]OeLQUM44O,I236BO˷g+)iK٧]\T\i.^%UP+i"\Jc^NpKԱ3 ߾Tʌ/Ϸ@Eu!eWhsW=z2uSA}aek0͎d2YTh 8AU aY Vh)[Kfqx9[ӲݔL eV2 )j]4VJHLs"#ZIgD!j:JD$p-)ʦDGST#0}rd:I OdF窪,*A)l0RYEDZa*2AUPHLqL',Hj:ke5úJ. <#o:ܴv-e^- <ܺ| X u yyL؛%Ԗ@kßL@^@1QĀzum88%_膌 b+Sx|zL1nY3w-ͦK*}QKДEm>$\#Ke)$E#`Z$ h'5]'8BVfZ0IU+3tsC0)K"?vHa6 b.AHeFd@P D%!r=H9K$2bG+ڍ_B5#o+$]BF:r;X,SL;? we!6 '4D XG II֧@KM%2] Wdꢍ_qGImU˘|m"Ŗ ^+u$(=]u +o+V yʃg1Jl-nd`u^8F>F.rM!'HF"QB?zuw_k0P(PyEXNe0b,7Is|VW0̽r߼=F1q 40-SO_ZaFaW52-Ԁr>YBeXQ={H<4=5U Ձ r)# zǎgv6TW8kA_Ui >Zt``ȕں[U8{T. E۲%z#vLs*Y dh4 FÚ"#Fp뵑pu8bٶ(i!u^033]]]]z<мO$o 51=;^K;;sLjn{ A E=(`t /GThs)q8^ZyL^Ũ@siwxEK[ z7OWrVX.y:T!<(S<˓[ { ] ?|rO0d={[ CZx.^"_ll H[2ry4=Kሦ]űm x=~[1Hh@րɖeƛoT^}ѱǎ%/t'sMMM=sssuut.\x7&lȽ|{ҩH$J9N~׆4ӓSHk[sNJ;߾uqz&SDIF'oO-ɮ\w #޵󭁁~ſ+CA%z({[ǎdR-u5-p؏p885=B9+/_a׎ΜV5UƆx"cήo`߾}DJ#8q|||,ISOáHxt: W Ot_8{޽{ӳ'O8rŊz7F[[60ykc&9u92 &"euzFǒI"+\sl֐86F8UQzӄq\zc=3/J[mp#  Jj[<3O=8ښ@DwOMqK/9r'Nxb670G;k˖m-P豣י52YaW#uo_~Gܷ;v?~٣NCwsםw JDPoٙx#0@؝w×gfAA\{|'a+V=Uv8P[_[;L+~{ӟ̓O>)+ bFCc#>O}5kd׮[#s={߽_<G<̯nm>/rKKK8F0T.HkA/O<Tֆ4-oVM]ݟٟK==)+r[x_\޿Ua" nVxV/ύӕozK+ ?xɥKg,<=YKx?xF2Dۼ>Àb F#1=kkkUU2rbW `-A/ⰹ;gR$6 c[̃ r~cյ T2y*VZq&fh1|㡇}≏щ;scWd)$ sSύOɱXUBڦxѭ70 lVY#km޼uú``6,@-t4Ey\48؈* (ppvf*{㵵u{߇?`PJ'IR֚1>53zHta.>67?uw.V/2xJHf3Y#MV} GF5qwjzjvv7͂߀D"QݺI̴i6{;Vr4IS+W=}CC:--2f^b\a`Ć/5@I<011 FQꪪ+-O?k0d3Yp[f˿g>R]] ᧿uYR$Iuz0QvuU5ljoo!7????K0/|Kefn?o]H`#r)N:=3y]woݶ~^{/}מ~H&Q5&ɒcu qjrZ׃y]׳iMnؿw?ӟ*{gsKS>/~O_ 7[8W~7~xX8buگNN>~?/_w{=b { - p-1Ȁ+jzwvc[limme5LɲF(JcS'>I( /|I  G_6W[--,;7KYYY<7ObxiJ:ॕu%Gym6:v`?0g񆆆+VTUUha( +*SO~Sʖe>zѦ~z**ͤ)(8J-BaN$4 l(:5R,iE|E " }rPd*Ӛ h92QTj޲ E Vi̤)md-ZTTtKKbX\2m l* 㳶mXv4 *iH4JlM*$Wss5ն v*MӚ,[!A-hme\<#I%" B$3o2L$! $}bȰoXPU iEE9HUƒɘjX@C3hӝ+fU)QBu6cf"Fm݅\6VԐUUq,j2Mfv/*dX!u{:ե>^,n9ϬeD%ff_rH$ǹ(ZfmʩTv΅B0`0(|Z@LLhmjjdҌZMD_YxL&}$@S@Jdh 7ʏhKR.!kkmdp(JӲA]B`(du=8cUUE%E܋4k\& aciX`(%YFPI` ZH 3 °9i8utMFƐ hYV0(C,p$q^%E=ԂhDSu6/U4 e!^Pjt&))  saF"aMժ*8RD"A/LӈTךY&7JE4J H(bN]BӘ!T/ˢ)p5Ҋ"#t&c;B(XgH"V ZHK.hT]o :zץJ%Җ^YG@+r.7c^V}캰^r>*xI*Y^Z@\ JY`\<c<>1( #(ro)8@)HIuu֭[7oсў3o<#@;$)Lb"}]@`#qGV٫*{`JK9edBTL qt: 83L* /(\SUǾ5TYbno#|)xCPТ[hi8dxKmuuC}}ϕ$6-> &NZX\d~W1 +: T.MSh`Fare YKMA`I&II $>XSUf6T:#Hb&Xp>-!Wf(J2 *"-wؖ G`$ X ']m$8;iȨ;EUplt i B03=7o"H0'A&W{D"CʡN_>4aUV'R YSҙi`i>':\*lDkG_ 2"Mdt:nkEMÝD8\5-KDUtҐ a, - W3ؾX~[va^{Z`gey {(li{^9oC{0E`A3ӻ1 ^jП@$ ]Cw߾};=ڴ,=5+n/ K7x7(Z-o+pnEvThVu:X)Tb~$1 cbb"a, ~tÂ<Ν;B9Hf _܁( JX נl%Y$a]ױd MI&S##CC~s0;l) |GcAY9dg2iHw8TvYQdEOU" &ѡ pSi: j ߘ'7rsGr|%hO(ʘT5Mc?t +x 氂"ПШ#IJ(IҐwlZ\0$A^=x./oN,/jzy)D6eG4g Ы[`RӖ] =E`6. fEjUЬ%<$w"V9K|î}A̓G?p`UU3̾};33Cc0~ׅղz,`C 1^b@ fAFT67[oݳg`` G# AȆd/"TMJL -MuUVq-T9Lcd# Y`EfƇAS <+ePI!%z$ON{T^B"fei*2v2Id IEkbR*{$ËF\ ISm<w [~$N#Jo^xqbb;;fYV086޹gSA,^<@JUr1 'v'RcCC]m țIa= 1|cďqn$؎,Ɋd# ,EU%'$`-H$C+Z0{E7rɁj@46 4P^\Qedk7EATK0RlDZ.\"j5>ZS+oC/_NMOwȑcOg^ˈK|;w4Ҵ\VbY( 遜@@6{Bp@ [H_>qdrEZHVW"^ym%T j:Ⱥо3+`#C.} QQWҧ#1Ɨ)\JPr- Q{7U򔙯B+мl(oBKƥDveI*Xc=xI2rJuuC=uV\Oxo)o){LEJNohmnj1^Cz04 kHOBvPZ&, ]|˃ggf/ _ƾC/A q fг}{wPS]eַ-zWW^|g}}D*Q]]oN%>GͣٹGݓT Ҋj-8}ipWVT]̄1 D2>?Et~`j}s{0kf~_;ﯯkP\C3d o4pMrlOK\2QJɡ8*RrLSY PT/b*S!n$)^r>%X +xTRӵ^Zk"'Ƴ']T -qɋPJ7wKGrVlܰK-%D NA4MȞH$۾{oN<=b7WsL0=4l"xedטt:=:::22ǹ`T,={رclkkw]Alx7}?晧e^twFә4Cƴ,lUO(Ѫj' &h!Y %=q(XxdWvK[ /^--Rr~P`Mu䎅=#c=4HFIzImO}] kZZZ y=Id;87lmNYPBã]0/w}MMMA =$B$SCO@_Ο`VGZYvΡ}u-Xc:2tyʕ+W嚚G"aY'&&';hW h֮]k333UUU_7{n4OMM!|ȑ|ϟțdoFsss4ocSSұG"zXC~×lLUUӾ;} )ÚOZ={wVw\T<{$XŋGݱc^F5];q׾zHcC=Bg'NHҗ^xg0;bz?Qo @E.\?^hSjupSET|)/YZJ/b(J,m9(Qq MHp yITEvNE֖#)|lnPZ9]E}faN8 R__g /2޲?` Bgԡ Jjf][sK3hوC0Ta<yZV?OY ,lB99fҥޞ^VE#eYĽ ixg;T܋]鴱bꪪh3;[;Uzd }{6K 1gϝۿHGGٳgQVCCuЩk<_b*/Zٱc J Z ?ў={i󦦆d"nܷiǏjik]ֶs玚F1#klڲu݆ Ȯ52؟6`UtXmdvte|-Mu5A}K(hJU*>|IV][ZZ߿n횹P(\]]s:xhrj&g2 ^ljmid =6mڸq# ) Y|AZ \b\;W WI)aV철@nJ˖kOa \狊ŠU5.Jkˇ'Z/y1_Q{PRs2_ zx(_O5JB)H7KuXgXf_3$y ; ^Qt2uAyd34EjBHB x ]C=*OP/fXNUƊU-7mkiE.g=hu|>17;{۶}(*{/ayjdCOMM?S> lT… ֭>m۶;w~C>x߽`* o&Xə3g~=?~m[Z[L a}uյ=umW XSS{=mwkeQrޮΑwF/klӿfXbz'cdr֭s&{@/jkkl~cN;n=J~䉏qם6nf޳̦Ι;3wy'6G^{ilLh,iD]^bxEpFIDATi 1<\.ʀ0< _R|xr R"J@y #35Y /_3p-߸f33S>l(LOblߺPdWxb0& 544E";uDIC55:r}ڙɱ~{>ؗk6m^* h$b&7m[]P NQUcguZux/~?Vm--`nW {#ڍn!^ rx/P%/=2l񁧫~)PD?^b2K^RžAWQfK^ ()"xɋ1xn"/–Wqϲ2a॔ 2^)t-R"x+ dxj<+^6/@$_V(ْd?yzদ*f!(#4ʣHC/ $^0CfTE5af>_$577a܀SqT*jAV,+]F7F 3l& 7ggE'PR@ A\LS2M`' +XT^HQІJR)ăCDH$MעAMPd6VUeizj!\}!ӫj&f0`İ[* pt&4lqzl8EYFtI5^^GL#KCַ '櫢Q3N'A]' dVԠ{@d2H*`0H}wSM7^y;p>U42W؆wRfOf'bQ,r_E@q}Rʶ ڶB_PKcpqv2(_>|(L݋Ϭ|嘑+~XbX6(# J@sٸJL44O3-O>!)F[ѿxk?u !L8Y<%gI/!!r|HE xeuqkY*3!wgC! ~P5Uшe+H-45BP8'vę܀)`2Faxq (@BàUDס6A5OA 1@.p۲P1Ġ$D*ep hȒ6SȦRITJY& ʚĶT)xBɚG4UItVq$3U`/ˎf5\'?dX'.qAB{@H9M3ˈAt7]?\e;}ә/숱]OggEfxދȌ 7Hƣ7op4i1?Óv>;C x|j)t4/fIhnBVi*Sz*L~#S=: @4qW\U3fPj\QY\Rמ2¹\k3'TP]椪9 }m0pFicV\6f;Ϊ=N@PH]A6l-AA!tl%J:b |cA{bu\sCŶ(By n5MsFDvDw]itטfx2xWc<7eb*5r#i9YzR)Tkn\ˆҠbhg^n$n萠q R*j)zRހ#:GsMdcMlCð-nA4Dmh [Jva5_46 mhmOhXz :Bi4_Y і)h#u | #@vt`!*ي;̅&Rg!u|gLT[Huj?Tܰ*Ajf*{ / B-徱J-6Rlц筜Z޷^P ؊n6;D:F#u! ؚ&H?MF!m6unHR]GBwXSGZ a&6SkxHTבf,iYNŖp^b#- {[v-1^.\`܆[vo2+be{+=z}i u;@: ER1#uR]GHT[Huj?T{PsZ,?R*-+B,8 p-xq1%N- #,Ͷbf. Qd 70-H;EbPicanMTER}WH-xU #YHuh. Tב: CXH0{LEG9=bG-8y6װk`ᆈ ؊ v#7`}6±<}B\rppT=k҂@C6 H}#ԑ=CyFZZvL:RRܐdzM?pճ~†lK]m~g)덴iis8'"---uk\*9*W&pH,YHuOl"RҲ1eey뉴iiCdYHuKKK:kD2Ǡ<ְ6o n'dl,iSGZZvh#--- {2 g׉&_{'brڋ-KIFޘ-lGnEGq}XRv{퉴OF/ mnCðMH.hXz v'4ZhbvG#}􃧧GMK_0},f H M{}iqעhBDΣ"-2;]<ɣaѿ4Gtjdlva__ &[1cQ|4TJ\fimGJU(< Fu㈞.a=J*1.-0!'IǏC3w"QG7[j⊒mj: UOۚjFe/_t]|W"p R(ŸG)Kyxxg#}_~wnE%A~*V-PM|cU|WO)c^cIS\b0*HS:ۨH~o!>٬?{8 ߾k"Qz(3R`w#v#hi72ITYqȚWǪM.,5t&vÍ޶X<^xѣȻI>57@;. 4z [͈9Xo3W^bh^I(aHOQR`ƿ;lS(嫫h?sd*8$~7?ӳ cZ.F)\iWF} -;O'qDo-WG46HrHӨ͢7I$CdyntZ HG_̓ʊAT 9*qQnjuC Ȯ6+%C:IVU/rnl3jݯbM5~qqqxxNVg* \afg4((pO&x_| `0Ĉ>{g9f+>"p5pݤJ HN I/Q,Of@ʌr7PLy-<fnU4hA(b6KfAeX!|AA2( fz=.3eųXtivss_#3>;;z~?o'.g7qD ֬-.)0\銭cЃ3B} L}CȲ(y4Mzi/) h]ej:XA)eGs6]PL]W TTz@L\VW4\#EFgR’~@43☷H,TBmZb! 8Df= SFӿEg),+ <zk-V;7-"G4" nc}lwx`PeṞdY/Y7''˳Gdh51?^@Çnv5EN8M@F~2f[[0C{UVgWFjV2$(JAqM< [fu?$X9켖Tk]">hp%Iȫ)Q4f4DЛi bM䝆"%FENѧҼFTf,dW?|<8>,,P'ϭ} ȼb+Y)oU5B"^ TNicQХj|aK8ĭ$ۃVJJ鲙TlQr:}_kۮ]!lY5!vTQC^JU5Z3[T<$ +{@ʯ b6K>F#v ]-KgM. ]s6m$ >9LrE?$h#,*3:H@ɻȦӢ׏ә G{g0OTН#M Qa#Ay j4T%O~:YMZ6'5SBXW4Nv`Nm ÷(n=4ÞԵ" AՌŤl1|qB<I^iƿn4BC'%#Pi-PmFF\`[r\-f^-&7G™c s,Jp7?~#?DcTqf/ujD#wdVmyUAUF18S;$LzkcYOʠlyMZnG)DXgyguuݎb(d*دZ; k^2;)0q\@vEҔ(0-:QаIENDB`oneVPL-intel-gpu-intel-onevpl-23.2.3/doc/pic/display_adapter_properties.png000066400000000000000000015673331443134507600267600ustar00rootroot00000000000000PNG  IHDRI!xsRGBgAMA a pHYsodIDATx^dy&^gr]H :މEIowfvҌF3y{9wΞ} G>Gg}~w7n~hgd_8xwE|DQC}Aچh@x8r&$rdRm&nڟ9ȚcRcPk$K^"[gg \Hr ٴ-7.Kn]KR<R4Vd;iYfRjްc΋"M  y}m,fbbb6{NlW?LRezvzeylzOFEBW4 ((-G@@@@@@@@@@@v㦶}p]s57LH?vK*r&|7 A2¡=nj鲴gVÝ5:Cױ!)K7 Ϟ?wsΟxK++eДl20#$w[m8PkG΅kf~hogϥZWT-Z)2=Ϛ[9yeJ xऔ'8=&b{b_2%۶m1vr=g\.UxG i뷑7tF.h~3Opv=gia1|Ǐ#t < xxK)2#˔z|?؋qir5P}a[9]*sU_Ao%wlaL S,8WNJ^YY)m8lKk97D#]]]pn/,,ߧ:#-0$6Q Lc,>8c,jE@X',@`ٴ- *%17M RrDOT%۲ Pd:k=ߒw tQ A>  htnWVWnܸ10ւ[ʄƈ8֮FSD[G@[S !^]]5C@ZGCUa@eFE󱱱޾v[n4|>f\ mdYfPEV%aGq[֦|OozR J %ExVtطuʂE}IS5Cӑp,udrf![} J3gB3 go&D?AQՂ}M$mHY&i˗/OMMU+U"^+/^ĮJD^-l3R  (wAMoP$N %@ WS_xYY^^qF.D}%^5PnLڈW yqm϶\MUuM}wY ٲN<oE<###ccǎKRgϞ-P)<랢@x<~#Gd2`!S7!MQ À)JiFMD&<apഎKW3gb{]DP[JU}?kp0at(c;6Bp8K"f'}Qj4/bF'bhaE+~ "M5sqaʥW\m֛x"eҹ|6e!> v=&=@)ZHe6gfgkK-톢3Pl6[*!A v2Ua !ͅ\www^jIT+z-jyyD݌̥Wf'8ꚍs.] 1kt…+;}׮olc_f,xk듛Ūe9tV*g=uԭTb,c}uD J6ID+?__F[ Dc {Aj.B^IDBF3]بj(FWcơ+|\Ξ{jݸ|2 0/)>uEV<5O$FȠ03g/-oס"MUV覟ޞ|>ՓwV/6M:BghbJlO(isc^odvh0P0HWWWϟ?'&&'T J4[^^Ƨ{`@DtD$S# RH@" ;={VUG/--#XN"Xc00K,A]סjfdUd ]$3R#G K r#Bޘ]L$#ã#RqchHDk4jRs`Ѯ%"ׯ_qc6.-..Lݘˤјz3Tz||<#7DZA:nEsF@@@@@g\`sb_mS7~s]z  ҥKׯ_D{mItuuum|< G=r(])8xM o:4:: v2^$&y'S5Md2[4 $t\_̀0t=N L1%V=8d,Ӵl+ #O4L,bڦJCvMCTeY˴ zݥk:NZEsP/d2MᅅJO4!F7 Hh$HEQf40WX܀.>?m˞C! (^@A؁J%Sx$_'h,rnp$Y*[700O˥RZE\22ra^B,{UPtttPȆ#B*h3h,R܀+&IRWwҡ!yl}:~kd]pfoFI=BY`iѥ3ѱqލ#G 1<< NL%5{ [m:6N>z6 f 1K/T`c rKM˛:?~0t%b#|.C溺< 4j!}}CCCL$0`.VrH4I}0НZbHC'hJz>`|tA!^ 2hnD,;HPdde}}jDSu՟, l6JA3 }Ga(%%4DdAĚx1B!Vא#fWA]|?gyfum,:BRqEmہ0Cіk2;r_ rWin`r.=#* )Q4`8p]#G]fz.CZI&=n+*$V`tĞh$ՁR; 9 /1z4"Ԑ >,['NLMM-.."4v: Vf@P/--\pfπDn4J 듓׿o~C84+H++K=[օsB 4Ql@+d?o1Lnr^z|  W"( gf& ,}"4)Caz{}S{8K"P&N1idP6hB| u{*ղm[Lkׯ={sos6j6d*E!r,קk"aIvkb"wg_zS^D#wBUuq4<- =L$#`*FMAX<ggWϞ9,..k=-!ThLtԇpW˃"}sm}/20iFOEq= !߅5J8oQ|I5$̦SO}`lluŘRGY$@u@vHږnYt@d[]@HJ˴\~{hp9~Y*r0|[ ;m^z`7&IH2ES>l2̲LƤ11[cLtY0L#@bmm}ff&uww3t<_[[etv *t ^%D" 4V(>қj m9ٹjbYDb m8, ̡鞞.b~zeoFqlPIԒZRo4hr/MjP4M0tR^C ȩU44X,D lDw{ 1;Fw3 Fآ>I@@@@@@@@X@bZ>ݎę7­ .ؖDh4~8| `fĆN&SSSKKK`D[c1≃H`sM鶠W5tE8_o4X7D*P;6{#YnAkhvƇMdyyyqqŋ`GC0)@y(7n,/-C,,,P}QTzHjLBťYhD׮^CMz;')4S<( ee?0 Aq(D2@G6%2QG Iz8]gh0BH$,.,@2-../6LFvڵٹy؄:;QĤ\ϣ.>".𘓣 W0 8@!k0g̢~y&v36, قpZx dP.\ ` <ѣG!'1L~r5;3Q ԭC/77D_ DjR0b#GbEʲeۡpxltlh`@cgNݐ{ o(9 Xqssye=GL3$-x7`h{cL"dl7>O˲("Lp\) BCO J:nlj4ȡkҚ운ZZ45HLft? pJHd9v9}l)FgWINx"Y NPl5$h{, _3eBU)=18I>X>k|>v1Na>t=m h&HPg7 HtH>tR\*6aVQUEX)1 D}k=Zl,|tyg*( pox#X&$/N*H#3!N0/Ã֢2؏~2??w}OC+,-ɹ/sçH(v0N到Xzq=!~4]9zJww S&{%^|f h]!’5ƙVуLlKgP1%)4lS$x+lp3 >u.oFj%]hcRA]ϤsS*BR~IMfdҠP5E}A,\[1i4 ݃@ݘZZh$f8=3 H 'q_6aw!`t,pkdRk,]LCs]@@@@@`?{Y:=\ $]ٴEJ/2=0jtL#8 ')jόC(Dyyqҥ}}#121p+Uub3E$B(r2$08SPzH ߠe!86ه;U :A|bu7ϊ?2 K v$B| <ߔ7.b(5y·g<PYQY|qmϵ'2TXFwS"ౢb.)~65"32IP|~1pJb:J5$޸T:/=`%Ǝv ̲m+F 1GrC%S 50J}bedԡnՙ !i4˒TFp|_!Q<4Fa(;0c3@, b8PJt ,{6jX>)6ڵ-- , yGn`G Ƀ' p/_^BSN|,g/eK!=r~' 7Rݻ.㞓ˬ(F]fWx[BA$- xxiB~e؄KǂG){3 9  $+ NXG2ϨLA(*)b:O JUC eSvgnУ[]m~>fR-t3'š:E7 P=!+ n'y֊Ot 5m6-sp G0ɘ0gwv Z@Y=[Zg-W !|/i`0$h⹭t+B~dtBݣ+)|gCR,b-8C`)AQgnSnm]Ex>*ѪU>s V^pb`{1fIZ!%CP& MXW+ ?WձB D$E I;ҬG8{+L-f~SYaeͽ@P#PuFZcfxlob6YO[M`F lypk:}b堸i=3le*DO n,~@JOOV4}8b#X;:fs%d䙮xqzپp= {\Gi;2BĚ l4mlƱs}mR9V:P'BOCI$RTewݔԶ3oz>D$džb;]p:F$bl_~hm[K'Z!rDA,/9iێi+yM*JXPʮ/N0mx t& 執@[(TçmS$.`{UE{U:T*Z5G: +Tز qIc ;xr(W X!ñm0fK jh۽BlWU0rI<09CpSSܚr@I c+|Lf%.-pz|G >E#b~٤?4Ay"a B`tndWZc ')O3BG1܊b(CDCSjNC]SzF 㐺C1"췖黄΢$ pPЗ+Jv>^P*UYD 60iz:ࡎm2ʪP קۮmK'r`CU55t ;q;!|܀ z\ d5e elZj-C8< 6КYڠL7evR g$בHX/""=IQN6 t:Azn;2p`oH1Rbr_0emSjh<ƕk_/}᳟}٧X\}?:wb$= W|`$h>1WDX%-Z90Z&e)ټ|ɟ,.d2h4̮C*J Bgrt_\qQ|;O>T8áėE- rY(?jP^N^ h裫+t; )4;2KW>p8! jvxAbc˽ :z `֜z~a#ca=Dʕk0Hu]SGCnqm_s}}}DL;|]y vl;a//o؝_;LcS k(.!'D1/\`v2.t@]E&}.>j:]E҅䄦1XqӰ%Ngr'MYU;x}A Jm_P dUEwlײmv8k L'SHRhtz <ʵKS*Dbg^>K ),0,= yIwY8aY|7yk/\Tiƞ$.A'߸qcyil fmv[$U݌e;\hQJ0P v,{ ň%%Kd- ^lO3 `x/Gxۮc%o???<ۿ7cDke2EפItG z gΞ;~xZ~}rmuE A>/6~iΤ~#''NԜ8FGOisX$ K s:pF;z/k===lrzfjBj²eFzo#_Gp:߭@Y6$k-$}v ZeM$x5;tZ i2d "MBa8aa-@wzkYT1PL-a;6'㘥׿=poW>%WVssC~r=c>g?Yσ;DbaV*x§>~_?c*~/]>>95;o_җ{|^-?g>ͯw-%t9Og<D&1 z^\ơSRpDGFFgȯ|7Ok/^ۿ|3穧+h/}TW ?%)~\NRD\״I"2V9JΟpҡh,b٬T3O?t&fׯ_??ů}?}Ro6Lѣ}};_Wo9sFӴmE["+ y ;Ivv VoHPҚOGFeiF0vR }WWWɳxNf20몮WKӧ^el:sm89ԛ=3>LW?țr+ׯ2L*DsD#ū($(q/}KozGƠ1_`v_o*?_x|[;y؃'_|˻>cM;b~;]=7GӱH,z_:L'zyxd/qv`{LX(B._~^SCoyᑞkW=s5ܘ/>Zw}LTʶK.-oIR+++g֎9;77!z?v瘷4׿,-n\vԩz'~ӧyŋCC;2 MF} 婦uKc'/ݏNЇ>4883lnn A@#إ7j{{8 ܳ`҆>ŧ+A<^K40|h`ڀ8lM^H WdPb_ߜj6>|4M=ױlM7t#(oE"w'N>΋gϖuU:br'Zv/!qfMZy'?y{~7~mo{C0I ;~t:tbBVWWμRwww=oo]|ReUQozn}\mmu U'(O7HJ:+gffk&_77;v}/J ‚]KKΟOӃkk3 P(.K=|w5U5zD8<sgi6o|AG}2BJ/@sw?~׮]A(i"L@@@@@@@@`DZM⿌%`֜ +FO?K}}|.0ٶL&tC04ײUf#`Syzm O'a] ²h ڷ@YEDtzcxܛzC ϟ4<<&2QM#XR?|OL=v Je~aadtdxPZT]\6 Qy EeL TH$Ы rR 9 Ѩ+e豣o{zJD A,Cv(NePḭ C`oH$ɃPPŏc yi!N7䀧ӣ~`p~U u@ECO?xߞͦ64#@7By&?ww92;;`+`f2uaAifYLN{PA)4*Z t"MO+;$ Bׅ~AʒA't&}cr駞?th@e6EUvhoO//~wOwС\][{'|pСX,ve(H$o:\tHǂyȆv"2͗^z]]=l6JMRih@So~[>3g]| Ϥ׮LMM7m 䥋>Ͽpޣ_zd2J*]ȧitvnpg CwlЊضIÞ+!#oqpUSǏm'?ə3/]z3gx≹9v&&& f~G"t:u9۲50 T$l:v&H1zV ?5:76&|333/O>q %GU}ݠU,=wgyS/{:4 #$KL9ýfP\μ0~KOc$,iEpd,"ٲ?tG;Bt=r<B$=LG²"J4w}y_?pYȨGn4;K xCa:D"G' {/~S?~;JHxݛ禾9{J3p0 ?N{_2;ɿ??LH(AK" k XBD#adBό ?t[ tp^ ŋ GG]jű4vTk/tvl|<Fә7nLi?o|[/U*s kkeǢ.(h4N{XC [IQ`zb}}>ih ף_}8V(lם_(6]ljbGǢӳjmhhϯ:308PXܜ,n-  G"dYFqsdd$nd$ 'z[d4Mf{8vʒ277<6>0V+4@ [ڦq6 B J  0K]k*tբ*]N%(FgPrmF%?T<5;c# ]0@$i'nbf' UCIlKňq3qΡtK%$O:eT ּ(]oTI#Z'o40}T? %pdb$q:B[grAXf2!uP,h\F[|J9a ()rѬV=!DGy[:22½ð| rH^K~t8%W H*(>Xl8,IBg(Ŀ"S!KouLji.}x}qպ, &29 R>}jdudEI-n$OZUn,!V Kkl"yaKl/P^ papQ֭MضX 6tކ{׊0HPHa wXo m k {~ޟ4j:ῠCHp "4' B*$X)`MqN*]Kǜ٣!45Lh0LgQ`H1;kAPt S,22&7ؕ]XgrRN̛]Ǖa9h2e2Xh$Y(f4B9̮B8\K0?uO؅6{&CAm7HtZQCXPl_[{aP.h.d̆@yuyŋBa||\qdӳi(&Ig<_ˀy-M,fHHSpqƅk3t GnRl4q:sGzm@veڵk|~hhkpk^ ; YށKG2N 5NS8Hf~YwX wuԗ[Yv+vhƭeW! o n}ܡO >v(m_FAjP#+ܶmb-:!:mAGuRmGCW088mm۬mιwmN㭞Cˆͭ"'c?n6< (J"6_Ⴣ 26;ݯmݸu` f# p{?j}u|{m߉AjP#nu˝F֍\H;*|费&X[+Kkϟb}}}(0N6m,{[`A5 zmkFcCL\Z%a?>~~FTJ^AompG {1+4>{#o[W9w9_Lt{q%;~-v]=NC3whˋ/^r=F[?~ߓC@ caLRd өq BvQO$x>"t͓}5K_rE=3jNѠ6WW ¡b=eƂyРJe-byQ_WUzJ>1UVI,)+(+K_mFaCNVIc{@a^=% bVcY0\xIޢJ'!M.zgQ0Ӥɘc,jmy ,&c5e)lYP@oOn0FU>HQϰR%۾w<ÓuOd̑|q"{4<L! /] Bcle_q s&7@ F!pWZ-v RbciB:M_LX8(;lv…#G&(| ;9Dl؃ ͕T C g(6=e:@ͩ/vHش^!hk̴J\^^Bh$JR+iXf #0eSOaAa*8P)瞇>4B)$$IKKn===mx|C  kzJ¤^VB#nE=׈ҫA!!@}9 |tI&RxVc2J`ɲ QAA/HɛkTN0JM`BQ*4\ϥw*PıZUuC1P1v s|!a,E-CMjdjј@oidg4"P.:dC}=8bPifc 4d aIk;br mYC ۵rXVҺa!Ɇb@dƌfh+Z.r0HHiIْ A}M ϖ!)\6MF%U " ƞ%F?iӹ) |^?$#-aja/L7w'{&ek:o]8rxi"a)=el | ( Ľ\6C[e3C'Wff*ӪW$S NX+s}.CM5Lܬ-p?#:Na%M}{ϴ Jn6lEɩ5tbĚSc9h\1A,@_Ww>qUB 6ESWpRs5|_J)`+fHU4%b4Q[St7TIܦ[*+?RX9/81|EӐpD*@D(ml4%#VM6"iAG<.*I 3N1Ptfh$IèN"8|#*j5:f¨*!:6PTEY]]>5|0mCcgLYXX^Y^UUTP²sOFb:ue0l#>!%yh"N`?NAh|*Xä@-:B%Az)wGS51dMO$ ы2jcc}X,S.#lG"D2nF*N&Sh&xY_up t hK.miu;7_ NH4ũl6 k1v,… @D)%2"Xj`fX$'rd^d*u 802xEbۜ:K6Ji2COT<BPqa)7Zith4f}`wP6G 6smH`2]:Д?'O*uuޕKjHKaʊ9P k5}iZ3pb=t"@"_[u.+s\G">mzFn~㠤(j.L/m"3n* !,`T ѵC=c}=+ 6=95ܷm*1uNyz|{chX̧L0MQڅ~,k1k=iyyeK0hP=0t\_*zvjf.Et؃qk8,J^(WVV, ML:DBXRd,1i4M˲ êy`[IN6o4`&vk[ŋ/]4==l6-m@m( H%( Ohqffڵkhwue^1rEdiwƁ*{o5B)YrnߧeM :UVTIQ,oXn7m/sIU9/MF%!ni6.-Nnb1tvgەjVoB'N B ?O}4XZ$ٞg{9꾮lV"jSHz|ToL;>LfcJXuO]Eux ўfF,Kr~ »kA6˧D=ěX,u}4Ci8fE¨f)H'zCGNxá>:rr#Ǝ vf{zGr}#T`"'!Շ iaW#؄tΈ/7vTF4dj"n^ W7M/ FTߐdBѐYU ;`})]Sww}I_څrpOOw2I׽,cN]MnIi7nL_|nvA"LppDF$A -(f<"phP4*[פ%~EIYrص>_W3H4AKu,) kgO=ݛsBP}_{M'iŊ8eKLXG3'sil8LH E{v.'B&5~G'bs<[A3g/;S7ɍ=5aD e۲5YoFCc#cHZHśפbWC.Ku_l|뙳˶=zS0triIޮ:4U:fHSX:r%ٴi*rժKzdžB*$0&LpM7^8@z f,|)Wj_◾{wٲawOihh,Jӓ);f ۠n ͅ=ߥ+1+\yus'bqZ])C<7{r G D~c@xCGJD{{|l;k;}߱]Mcy^\YYqwtt$|oMS_@@@@@@@cpC\xRb287i]xiffl< UUfg7U.N |%Lxi66333rKbRl{A/[m :l۶e+}}C}Cf޾ށBW_<×5ۥ{uPv2 BG^PM(֎m7K++'^~crnrr~jjazzizvevnev~uyesfvu~ainnڵl Ɗ4cH pcp #R8$tKr_ܒpQf&7/tʹk3s˾ezNll&Nw,E3PXov;3ؓtUʥz6 3{t6Loz4E24z[٬6mZ]-Y6)aU%?DuY]uQw.^^{3/j ϧ":8!M + ]L/:XڀY)đOO7sU ݀\rpG.BGO'Jt;,j@U,ՖK.]~/BҀlnn-/nn+jTVkH!QZS1̎Z|c8i0U,MōM,b SSS(`b1X+W(M=)v:,7,m E"L6L.םӅd*ugs]x7MW =lY>{-&Q5Gv7x>(08Sl&07;>453w}rjD\YYY[[Vʥ&"HiHagX[t&k90 JqČFy,.KQY ˶BIrm~پ~zꕫbYizUsV)Z^QզB*o+qit2 $.›I瓉 <%Ē5n֮~_],in=QY5"d6!f!#Ud |7y2"4M #zHzb- J kjj6VKUuϣ=kXt_4CP]x}GWƦ) O/} WP̒YlFxWMG=D]FzŢq"E<1,@ܐnn0c5Ih ]I$ox#GI"R7hc5i𜝡z*@'9dגbOY0dX8 %(Vbג\H'#M[r BX6sn4c;:\p>\CO {kҨ&{uR_W^uk%ɨRL)G>+8qߡ|OSg1 (Sp?@uأwM]kk?O/E- O5GP?sY[7'S$@-oƕ|DEg#=m;Pb9ZPEBQCE| IG&&(.EƼ]]]gd"qsH@@@@@@@C>((h%i]z̙ D!}i$(ԋF8qA>,C`(* _w6;OV.^d6MMB@,|>5~6FM$l06yHPos@áp`>@TC#=DSOafzzr9@a Ea8N:t@baa2,=o9K]t9#1ь\wLZ6jV)r5䲓fF(d\2s(4k``@^jtsU:#)Ͽ6=C'_&lS=#v%z3M^\XueQu'{ m!WL B8f{zs|_oOoCgpzB ރAH }d9itBlIj@KMRّCG+*+m6JvŐ oH $ôm#C:^e5c]x!uHER>ka[09aƸ|Ӳ.^tc[5} j;d4C}c#l(Rm0l6oHBiiSYkCeI t\K*[jhuk4Memݾ<Y,So~0"'.)!SX8Az-,{({++Ģt& ѽOtPSO?sE|k5,o{X'iTс>SF`~32 teqqX,6m \FQ*+Wϟ?BޖOty 8 $ *L& @86YVj*Q&8 xَ֞Y^]] G"Ja ]]`ȁY qɯOZZZz,|m"_$icyCE˶AAt*m u&KA2d!.2|&SXLVwS7iY1cA5v%NT.T]E#T UpT2,,N/bMGd?@[7es]I#Giz/߸Q$%7Y`" @{Dd2J'r4-T&wev\*f]݅l. EC"CƦ4B @OkkEWݱ-&wMsep!c_sܺ5$ٔK-E2}tL:_9 MWQS ‚ž]L @Se߈HQԼI6-]VOn\-V$Ig oueL =+EJ%Ǐu73{f+:3YZئhz."G&tVw&H-aJ ^Lb2#~ţY*P.7:Jţ 48 >@!(e0 DU2YXX8s:x OJba!^X6&jVT ZNVY&#Z1_:]7M}H6MM9Jkֹ$Z! N vzP.7+ sW^q}qi~m}yaqfee~iif} "pyuuZz}DJxK-P[D;Y{O0@_}tj61wg𡣇8qA JecrL.Ƒ=3ƢL`syL-P2P>_wd†NxtZ{@i7lДզt}ۓ\_|Ͷz.jAQjs[r {sU^5MzVCý]C9?O[37ܙ:wq3/nT ޴0 A Ed Z]GܬEtpx!7Y\_^>S^l6GбF'd1˂c+d\:u3`x:k5Ejz̙U:|>%P}QCF9l-[C' )~BΟ0pkfj i@MpMt A\7@FAtddsVy/i259 ңk`P,| kl7p )XP32:'`2UC;9/1z˯I<umsXF Ӟ_]+&WidJ&NɆ]6\=wcj"I%=}mV%t&zd3dcW/_ d"YMMfRh%1aG̰ a# cՕ5>xj:,,V"t'Hp# tN_^-L6R]Cx&j,Xo̬mTOKj̧[qͅBX>OPB5Fkja~vH8Ig$]ZwVa]5ݕήX ;z}eӪn"Fq- 9>7DZ=K@c~h ] ۃR5n䍆{izubnA6mD{s"7˚]y9!Ą&ͭb5Z)J0=ݹlm܂/7ST"ga'? Z(ީ$5 /LM͆9x|gߌܲ.VP%4]æCZ(l:mt>Y/6Ν_W[Xj*Hx SoZMR|=5t)Y:ϥ =zs䡫:J\&6-keu8U׶ xGDQRAphr94` ]ؾ88\ 2rgЉk >Ek×XCnݻ3EܲGh;֔ރVsaOdFlpavKUsn链`J lF$h/XZwb=ᬾr=mӽ2vLp8 fRUYU$h PH hF87J^WL=Cp!Tggf $IzZ>*=vWX(⊌hkkkfqHle2쳀]Ʃ}PLkWAH2hQޤKzq}cVH'vDeey rGz*͞ƞ5PX~ǘҍ6Aa#b/\%mȾfɼDoǔpY_-., {Q](Dw3m,Ğz" !#䐴[:5o^hEّ %=+ᚣͬM+9t(?xgfmmm#N7Q#6mEmX`2=F4LwaqBQ.6RYZ3KE*)b6$NCw-^ujHfͯeQin,咱ޞLZ|+ZmX% 5| `( ٰ.83=h41}݇!(WjV7rHW8o)iu%Gs4e7RI'ۃ=Zj@4H,^B >4;GugETL٤ga=DqFc1 um#_dsYzQTPL:H΅}[A ;ڱ[X`!7ȟ,Sv{=@# -v }`cT(ޥ= `,m-®ˎ^n Zqo|uѭMhe=a=T{ٮjO]²ciccA3vdk>.c&+M6iڢmg $}_pVP@JE #N\ǣw^j77[4 $PADBe Cj6M=[Rj`>r\*+bVZD9FP(9?cc}}P v9 gPiG fzm{biT JZFWX2Zk,4wvbxCD!E}uLgYX߭mx;?+WB!;FtB&$Mx"MOd轖p$QTmm}5D+mXhkT1h@iE +ζ3k33ɧE#x"竺; eUskzP ׉;Fe:6Q(c"OКX+KK@# !5敥sUwY ;QE#[ºKLSJ2u==6 fMm%FeAA<*$4+9җ}`$C#HdNÞJh!1gc1͏([یKVo\I9~dp!c/2Qe_jMZ"|<͏~rM C}rVbGǒh6&]p )dCOst4=%Mw}Ox*EQ;ek+3qԳ ֨@=G=RuѺmffכjŁ~ ^<:F _f-%(nL-Ƕ0;|>L&!cjz ?<~W>T*j*UlJ8B=`7]h߾l{@(G'X0yl_:Ю ETv { sپ..2m!t=FU:Al[:@Gz;-i~ؾ{>=3ajN|r{\|ރ`@QcMqb;rv> XX(V dk+˿hS@^gx]&5C+KOZV$jj[&4{(49y|z#ͥ)pl GCC}}T(<|84p M\- vΐEz4ueeUFctlz^8D]cH~9@5i$Z5L,f>%mB\S䖼N mqԺ׸MSt,G(7] C9T.--/cc8xtA`~ I.tNЮ]@=v{1څFoK!NG#`<ё' ,owo߄};={P>H-]3-4}1],nc Ͽ&Znӻ@[RE~?;aXv}hz̹0xӧOOLL ]|f3VG )8ݵI?w&ig]W}{F f\,! |Ms-s/IPw)m{sOL!yɷZ^M\666 FPt~nw{odt] /v@|-.MA#/{ja0i%h)Cý#<"lzi1===\i06?O(Z llW?P{F\=sWgr8<=>/K25̛gE)ںAL8 h>1ۺƸL/o ۀm=T Rж$A4G,tK}sϞ=mhk8xGHm?mevњ:_m F:Ч=XNWEz Ƚ1OvۅN~ޙտM/<~צGِ͂Fw\Zk`q7oQNG!l T W ! دjd",&Jz|$FÚ1=93S(7ɡBrL{}Fok.>cjFt۴ ?8m|+_ʺu[&(=tYIQiM[_VX:QO=ߓ\? ~'3d+GSZ^rms'RY=>{l:˝gSAۤR)h#^no4B*w灾`LO;Rd<9O-.V$БFy}nn5ydj&;D6_|3Ķc9^i/.-,_]֌H!Oh$jOZF ]Cbhi4;m=_eAqP 6@0~Ei׾o|kr]Քz6~rl fU0}$?t_TeE ɺg$#dK!zfT-.Zݸ>};!;~,v4Fef豹 MLM w/eP@P 欕ݠރ6h/;ݩNq<9h`'csr{ {w܆mǥ-> Q*cڲu[R^]Hi[ON0s[{ +/k=9!{:îMB >{=-t:?WkyNw_cDHMZ&VΟ?l6>~qqA[m/O7"i:q8iiW R>ϣl6#*ˍh*QnEh{0Kۀﲶ·CC0@|mT_f6kɦ23Wfw.yDN)_[/f`v8ʩ|ʕbms`(68> 700822͖U:[)m%bJ׫rCM7$ܳG :6Ɓ?񓳵dz:w–`PQzquݔ_Qzu_kzDZ%M4dhE?uTH&0z4\W;l"HY5\\\.dB\zڮԛ 533PiQ3{K田4A%`yVlVZ}qiT6V"'c\TG\"ZUGh e !!56صg{t:r}m-6}}lgS9`jsoeu NphZM+nGᮾB7Uq+RT #U ]+MArK? ͔|'l_[ܬL6M5I D(=QUrDbm~+BAJPMf~=֪P$B}Q )۲FSSfIa Db@Y0Z[`?7nmA[7: ]td#7nϷ~ir[#8X?wa?7ڂ+mc{/_}pwi~#gμ'(nZomz8^ C7QbӨ!IŬq… tm ҙ $OXyRZ-t"A zM[Ué5YY|>2QmC`19u9 $ؘqT1 :Tbr\#4c}ztó'/^p@A0"}6i$a~u#*HD[-hbG݆>:|n"e) m@ahL6lݶE`?ONg_sMoyNv8񨙎*mxGs#6A[6KK/8===qpw z6>4&*/Dv㠟3g B>NmJ.k;r_d26wTB´%md:*եDCtYs kZ.'=x嫶GoMAT47:a&2022ݓy{{gtjo.LXtҍStxR7KLEt;pmcuCru 4ؖ4%Ywfݽ =x$`-,, }ЅF*i?2򆹃m_|O:ѓ"6AOHiq0Gf:* '>G6F#+{?'N^Y+9sfp12lb:-Y{~RT.#=W;~ ʺ Ru[D'`[>(<4VpFcd*=F1*WBm0P. (&v#KQ=phSls}!LuQZRӟ>9000th?s (lFRѥR,TN%Uėu)[Gvl|$≮$_Fd]m,U.:7.} `~pW--oaZtǖm3>TE :TWLMr{2C}=4IT>wU(nJ HR=@`330+`ONbK')!_ qC! '0)Omm ?l(pP}l9(N˗O?dk鲆/`–8db7_@NC^]<{ h0T〬 n~O D1 d|?H+P(&t}nZtu2{']Cg-$šmH9@WE6p.+C>LOO0sbdz 4HtpnB9`Α)Z+ 4W ݔT'6iX_BDIXD$M3CN[Bl>BWA0 Vִ`Ct`v9 3)e$VWm&eԷA=& EDͮD77k|o?B:yT ke xHQTr0$ 2,46 m8CSi I߰f؈2%ۜ`x/};l(pP}ӧ/^pl:L&uU3 n pwX9nN=F8p #^cl(A<^>@؞w}Rh~^ۺȒ#GeV( l6Dn2-C†V)T7Tl`abd[eatVc[rۮ_ByBz#-q[Ԡtn9x@:wp`wV}˝; l%b. )YP#(G%h} 0mp1+,;ʀ3,~`M[;y}nHG&@Uvk2Y|;Do$?@1xý 6wF6 J6] tWBitUMcl{T'&}4ltSKo߹9HuDx]䆢 #DV9Q{ H DEaEna Leo n_!>TwD& %4.?9D5eqqw5Ux,Fm5RT>]5DmqE84'1 6P\}4Q-dКj\CQ %TXd @nu\$x 7|m5JA4UGEH44`/euُ~#4͠Z4dQʅ8r4[{AY4JI*q odZQNWĝun ;:РtZ9XƝpOͥ{WZG+: Ν;zh&J$蚮h4[ڬ^$qDZ_+>w['﨏ҎovMXټp邦)GUTze8T&8-u)e]8dP-dمN#c&9 ).V`Y~ *{,X~'Us 69~Ŏ*.RlEU$2f*\}[LAgw8PqvS02:xr '| :AD_E$F( G=ԑP+ 7xqhet5 Y%F*A~8~L :Y]A1VA!<;hVO=]54ѭⰀ'm)4~ahHf<3OiVa2i*hd(bs=[tp ՘ekZDKkډps $ ^QDk_al7;|KدM>QoaER ^a pu(@qrg,L˦ rtTǑa{9-ӑ;7(?@@?~ym2Xsy/ s.0>6á8]'v9h GFLX(ZM}|Ͽ:Qo=aڇn{rqxy˲O<8t&(` },2ʁ Ą@Gh Pyb hd ǫ B!F͂z-t܃QhejPh?FftT¶ӹ$[P@<1 ٤7k486<,<N*C hNI mI#K$[l ݣTl*DqJ 14F,,|Qo_t :F +iS'BGaZf+b|w>=tAMj@sla=1zC`nIbttݢ0y{([*I`XL ^ʃE-D6,C%(2I.l;A"fKgD)T`&lhIte[k_?ccJxg[MZ V]mh_P _suLSL tْifv+$Y=U@2VUUc[10ep{&nv}arHeJƜ6hs7~ZLWafy[A5Y=$y%[ 6ΰm"Y~CKlMtlm.c1ԟo/چĦna˳n3܅;mm`Dm{hV9j=d @Ⱦ ĠQHsfkϒ@̷fY1#Ai $ukَ}#GdsYVfdPfh x\.5|vnѹ{ 오BQ0]Pw3x#l׶LV=˶m;J yc*{y=f-4IlClJ)]>^m2cDM |$]|H>4J|jؤvzNE0w^,WbT$97ڶs7YNXcF-ڦ4wy|Z@x["؂\1xR=A+iozlɖ{4ӌ7$즓lfMj 1c{-ɲzoSw͌0$YVw{-J5x͖=ǺL&RJ9IRˤ"eޖ$gd(`,̓¶p(˛~a#fc| a4565>t1fA40[.DJ(Y9:-2MxFM&RC\r޷!O'DL`o JEFdTUxlBghB!^yF~0Jy[X#d!%~bRP+jpD#(Kdʨ3vP,K 0d˜[n:.v!|w1JYfbȀCMhT0`>5E ,%.(c7Q*B+vj;"[k쪉7q Q*^!)N6N LHd$vd)0wX8tzH8-oގDv~IP# j, p*VE&:곲L\q0 Dy>(v!N0QMnqxLyTAH fƪ,k"'R$+p H)VކGKI"3H()˩$)M\ oz{De={-dFrTkry$ ')N͸-tdbS&>E*E*?s QZx(h0eDiMN!L)&SPdygD[.RNAN)e$3Z qhYfv' ]5 B\q0N&P!lmT{,53&Ώ{5m'xZrD+(|މu3F CO<xkD$$)E<$ !>yI#:~5̨NsTfUpa^ɬb^yLTODJQ0jvM̜R )$[c LtSD GSwFiay;b?IΨOFj6Nԃ%.; բ@ 2vbF&i!jd& ^8A $9ĦLh4ٞJa3\"VoK씜oyR9T5FIf24F2)FFxbbrJ"`oG1/e&f>QQlU4Fw3>(7W f+PHȞy{vn\=^jj GUaCR=ʫ#*J,2IPJg'L~q K&9@r-W|t1[?q2$*UA H!RCj& h8`(YcW.d T]Wj,~ı"Ab8D 9λ$`MaiBƃ  O [nKTCD$1lGJJMUHòňcj܉Iʆ% qٹx[b?ی}4̜ML1':PIA- ET! "sdJ 2)3yjdf6n d*B짠GCL2xNMlx8[,!) 6;iCKry<ˍWc.]WZBK8€sTg8WTYf^t2ɪg&s8 "9UfeS$3NKOsb&b DLdR 'LISjAJ{j2? mLlqJV)Nl~u*!M$ZV&Och!KQN;TA""#!eelp#b .VR=<3+NA"\V\P@bcY9Sff8X2Cv3cx?FB2\9*GH1+.XʨMRH 1#AJ22I*v0v$4pH9.%%FB*ejORl:= <A/]Vd@إ{L$.¯fAI^҈3`JfK9XwЌ,.`b0NviHaS"*N~Ȑ24DRx!"$+ȠLf̶|(ԜA >vgLΫ5z0q9mba~Q&hup9,0Si{\:MBI%{#L1 v J24L LyP !AY0 fXxXT‡AEcuG+..X=wOƳ57F5?$i#UhKoJ&!֌ GKՄ1i1i#/0-i7ƻW$ΐ$dr_<yG"P(>̳_{SqXG\DB)n(׈AXX5Dn vUY( ڠ Uq5Ft0@ =b'eDIVI(ذElhU`5*0l &$)aE%JI=`|-QYꬢ9UCI"L?O(k)_=&^{V*Q_%b@]9?nUOE0retJ8$ .&'/[#hѨ,{ &~ Ǵ2Lf>ۂf5IhWZJd}F]<2 TVqQ"8h M\hA6v(\+)USb}qWFtP%BXc!>v8k8ʖqϛD:()Ff` }}gqFqqqNN1zXW h,K5557|3#s&qVvu`,t4p`sw6>phG-(d2qpKQ1 rKA׮YNL&*vQ"F,ᾍ0VZ,"Dhvmj7/f9k3NqpIi,ގd9(@ÚCƚZlި7u)ƒ~XdHeP;7S8#Foco~˷WJ0/Hi/",Mv$ח+Dt6B?#79[z4)fxDQEdß+VTVV^7[~ Yf97I4./[w{pBDǫi.':Ețޒ|\dȼmR0*Lܙ$tȲucTjǃNH f@ZɣE@1CL/CRKd.xaO@@Gg:+7AAvH"ݮl(f F%J[ҐI02ҐdJQ@Q( !(b&nI%4hRL(ĺ!"9X)FhML /%A-dR@eb6)`P#kfSy:2 bP_zL"# +m6|^ M%4Z{|3/xkA؄X!lz$}[?Ͻ~{Og[^ym[`4B\F:'؍0.%f "J`˂&쁄lÖ`Fp]}/ҍ7\S\ ua'K| կM257/?WqϽ4uA6= `mF|>'9% w~tx@(2 9\9mP>cۖˮ,(♞+j5`P?OV^{˞H@VIa2`'+Ғ~O;;zm݆WdVXQuXhUT! F" SW[o[y5@A鼯x0Gt< HGwWk{CsFe ʣQ(2Ła X1, (u_oR0؅t eٗXq$6x3bR,%vpӦ]_\+=s{}ow\@GGQvu+yH!*g("6ZKo/} $SYMK`Џ %lj/FHn|;wjl p@ F^x!LJUe 舔1XyY>#Glڴp?#0 o޼gΝ[TT+-+/ EVOcC|0nu/Gq=M,9JPK2KVz"K tkz$DC.d*2"%LEBf#DhRB֤.NeJ/ O:{\RXD"K22&Je&6EXRɔm(i,f2)¹а4:53I%kfҒM'A&J&p{#A9]NIV1}qbTøh^',A.;{=}}! bv }A0vCYA,P4jʆ(qtM`q:1 K +"CD.yaؕXڷt ';'7xPo~?^w &),E#kl| ?s[[ZZz^$FЯI,.o0q&Q 422cP4eB+ Xԁ#:;?rǝ?WEvr~'k[nn B`ꠑ\Nt]C) }'CNtjC18Y0't=ovf4\ 1yL3=Hmm qof0Lj1q:=8~ C!N]Nҥen}hO4N$5g}۷e 4*aԔVTo7ee9Xisccs8Dh4ӂ rhud}{Y X /@oA&P/vGQ46%^kSkoljrrg=[Fh,r0:P_qQ?]z~<6zS8j: `e9t]DbFyj!FዲYS)9c2Ax*xdbSd*(AMdbR) L͞ "&6E-L&SI+E*.lRd;=,,ɪ1c ļ Ouk3ƈ)[:,s=3^ 1i:RJa;AAN*elV@2)9J ̘][8NGͺ ehѐI1`zbHZ)}NM-N&fN͠6EfSQ& Sũ 0ðAy^8ȍأz+kʔј+HWwg]1Qn˯8jEk FMslRQ* `|C| bxؓc~ a)ÆCs";,qv끡"'NRVVFΓM }BAK$ u44BP }Z *pM dggxf<7rA DB%;7|ٳ&:[^t4~DM$t.'<, I-7n}͛ C_?X< n݋`Dˠ& qi0<^+eV_ϯqg=48 :8^5փݭr:Giԅ*!!$msT >7 9"puy ݜy'MT[[ [^W*n$C$|'(NNxi7_x{ C PL=x"Uoa? ?z4mfӪqX}h.  ԡQ^V<:œ0w YF泟-[ᴷ%Y֭[?~ӟ6mZVVm@ߦ?9/G C$F"ΐ9@\9aj5vTֈd))dbSd*(A $FL-d*nPqJ/YNə[ē of;5(v J`.gVEY?~1۪3T ӱℏvʾQa"idE tdbK E 2-.ɵ3SnIKE'mD[,ĆJ %VI<ȴŠRj'(ڐnL<ɍ`1=2huHD[_W{lyeE8"ޤ8V8(["}g^ۺyΜe^ ܻy[%g\TUV:ս.Ɠ]=Qa;z{ឞN(LӴ ~?3%K0Olhh x<́:::N67A^fM [;v(7˯{]yn8)GF7-k\UɅW?rܜ9rEkiim8Yۯtd@47 (_G那…vp`FsskkgWgGGmDۚ?`s#lkiko rΛDHcCcɓ-M}}vpztvuvښ uCね6vG4屸ph9p0lz8z::;` ~m [7֌甍bIS?kh#>asSWkk##x=Y\pmQVsKck[KOo<b08m`p J[__Sgg8j?~& t>rxסNgv^VNW}p |Z!κ:xwALm; ɦV}` X1ބ p~Axt]ޱ}_VVVRZf{*pHT` {]3v1jyފ2 \eǭA@|C8ḛ*6Rd&06EJTJo )Ed8AGEi%#N(&8INKPF~!Qȉ4KLK/,-) a#O?VTTO||.ر{g`yG/soM}CoK;[g+ʦ]x픙t[@}ݿg78!p7vϥ׬\v’wgorzW?+?BsxƕO~v=6X>6z/ /wÑ¢/p^~b @,޷sǟY{ ]0gNAg+j:7}?3_L~y?ՙӊ:Oٹ ss n,83b֛+/1}J[K׽xwܔ[<`Wg_(|3=Ͽ3ƌ3s`||_̛n%/+ƫ\ѰwCom?~luNє.С#1CKO}烾~-[V=²eU%v:rp q_y-W]y}-om?Gnxc{MBKT;.2c5Y=ٹY.yǏ?vfs~>{yg/aouv]s5K=0 bZrnק/[QkxΏ4׬ySf,<0k#In>xĉn ,.);|dO~3f̅榍PW|N _XYx.o^o^kv>W}}=u9&L+ˊrW?^sՅ%{:|+&/~:,vÏֆ;ne l6|0w\]d((wwww?7oޫ~ҤIy\LdD Ds;fٴi˖[+Y9xUɲ^^ZL 3Ab<+m&gNZQ iU md:6)#}`ib5ˀLڥ<*wJL:r f&h3|]]A|oÞ &= ʓJ2J'd<ة #n;ʉd^9V^FFiI:7?sӥ;ZMÞ"s`gFZc\^IDg#c! ]_% b}{-^hzO7q{Xi목[_z JGᇧgqjO{ݒ;_׏O|⳪jgQUM9#u;n47g__ߗ%؂z8c?7t\PSS#}y˗_ZXu+oooַY\\|wN:.ڽgM7p9ym{}Y3-w.e^>kDC,b1{ ?qPyF5y̧O-G5tϚ7%;֖>yޜs.̧o}-ԼϮ}s=-|Sy'|t^{9瞗aÆ+<.paK4y\vO++E7-;u~Wx͊y½_~\;ncڣueqG~ ^0a¤nկ笳]O>v{nMYzM΂iho~纺'{N%pCn(~jc'j⪹szшE.T-p_[7o_ KK-g~c9Z+W^YT׿Eq^Yi&t.Z!!KZrKֽ~oks ٳ=˖}neI~ξڕ70ᦛ>PZZСzb<\;)Y^L,-N |t2uSO=u9,Yre(88clذ^;I  UFJđAXS!҉Τqx` fRoy7gjQU^1̷'666ZO6HmM> Kv;**+ ՘V{w"hSwVpFItF\O6!M@f)%ة3L T1 ,c#nZ@pl6TqXACHddH0L@ j12꒩*rUXg#;7|FB_93%&2U(duu/[~ݒ3+˟VO.qMj~ikӁG93Nƫ}r5qU='MМnqGYK&c4a#f_ܴcOgyz_gͳYN ö5"@ m%蟲x/xAi~-vVx77hʛ>x /?r/_|ւ{̆5sCǎ>ONouy|_—fNnkU~xe1nh2$ dH+}`Nƍ?v !P,C!5@SC)g:#E(lFf#/K*x6-i򄦜YnٲӟԂe`UJo\b鬝?܆M ;j҉SWо7woYrΕgNck^ 9?̾&ݤqX~XEٷ?>3qHx`-~ҫo=mVYa4kl~[nʋZ/[=ܳ_|ᕲq'OYrfNzvG^_kD<]m_9cwm`oSS3𑺾gϯھs=ruo_瞻-P=v7~x뭬7ߚ7;tԖumD)Q b K)')_ Kß9m0*f~Hg@D:32 1Wp4IQA'O';e=w[ŷ; upٲe'L˔Da $). % z@DN ]0?eͦmt6> l5" $’k!SܾW)$$%YX49.m09HFv`֥[-:;`Ī8y]g9.X4MWg%mhJn7PXTn񝍱/VN$MV,`ڂgݘd7MWDT Q`Tp8T2h2}JiҲGiUq0"נUaFBP0裏\wݵӦO݃$Mؕ'lѻ[_^u53??'?YYո򼭻vtϮk[w^xUgͬz{hw|jЏg,uWO,r4-ݻw?Y2otD~p/2á[7x?iS {G9r#4uj]w}5'C7lPtvt>Mݷ_]o ;ܳβۣO}﮾s>ivW#5 h/=s7\]_9_ʗg^W^}Œ8^8kUw7>yd.w|n=wyM=wK/n3rrUVet|}{7=ˮey:~=~>zǹ*W=O8cFjWwW[ln᪳ϞP[?|?⚅yEN#kyG׿[}{zŞ{׽ƤW\uzU,z~_Q[t޹۸} ˪Z=h-kK*ShdBWd|%㜙37k7~뜹%Yz$Ҿ{~`튋/p=[O/>O~xb^^ WVx/iS'aqӎm{ 򋯻a圹3ryא|-!uR8*K|k:X/l`0555^xܹssrr޾zj|)Sprq5E9J?R%Z؎m<xn,r=e`X!@S5a50P $nnF Jn e̐E2MI%IF^( QY#S@Rri+*q Q CJ"3>TڕMuʼnl*2c<"6QUc;p?V`(;`)om-ye^ ExQ0g_mݱ~,H(Vߥ n$Bw䷷ú 9l`rgeyS\\t7n;yaΝMeuu0󌖾zQX1]͚` ۿ% tCQQ~o$ riG( \pԩ!,0n3f|S]7[ʁƒ>4ݠoz]}ۑ%gu.GB_)l8u WOZr++_>wXoB}}BQK9/7P*G'ǏZ8?iq9iٽe'MRp/܎X!{QO~߹[淿O}NK;^{:5WG{Nc`ut7lz0Ѯwɓ<W^P/4 _ \XPqZNU0Vԓ.,,:iڧ>}wo~ܧ-P*z5Gd G,7h`=fqܡp%6QT^৮/YH7n\]]m(;mm,5%x@৤TGx._ⷾmt|+jϞJs^R Emśut`yxjeeMOZ׾/H[y?;w@31;Zc_xرcK,=#΋= k+444 3\$lv~XEl%b%((K==R`$H01AEvt.~6 SL mk~zrح'N4`.knl\n߷ezػ𧊋 ]nLՎFdyXͫ'Nu/عܘ6؄pi,$:hid-a= w*/̣ f76n t8Q؁V?q=7oe奲[z';+m`1o&7>jhXg0lf̘Zc j-ZțN'?Ac_(7J_ɓ\|߷sܼp ֎nSwv1Z6|}ݯ~ߑ#g/9fC<ke5F'xuή~ x AGXAЎ1+|0GdJFV䄯9P9.O=y$<ю_x9}΢]>X䓫:16oނ~ҥ*++'O|С'N~7o;|d=%,oVnEOpTvt0_дo~p8ҋ/64l߾s`_rq1ƈfMec}[7c=Ǐ?ϟ#5G<̓\pe~X(˴pV6>c]#W'/^|yi#y8ȓ#yd0 A C\t08CfdXl0Zz}jC7 ¿_]],J4DG fS c.ص O6bokm?~|^^'X4 PDy2a$@=#= V!.+F 徰ȽklX909*WwCKa{cH2LU <+1H~rZ<̚H`2p$Bג)Yec46 0UMyj$9 2MF` #-ҟEb5 kDx߾3g(**D.W8,7X=my^gV,늊hXͱUSǗ93>5uJuIg~z㏭^z-%.9d9`M4#z'xꩧ.0ݏ>?֦-̽eEEӧܼyOyǟZT@ߵ^gy1;V:b\K}7j`6ϼ“O<ĪGK W^{ܳEbg޽ck0ŦY8{Τ-o_~͚5cnqqikpoˋ.f#wl8wyO/ˢMYC_\Ȫ57IS'fkjvAwx=ϛ5yʬݻ?C>Ԗ[g[9mEg]׾ߎ@eѢU4ݰi]aݿgʫWܜ,;39r(pIYk|}'_9œ'Ãϟ瑻Xv*ѣm'13 tx cm?y U'xxKΘ%YDɾ_Y]ZZp"#QMшbEE34V[cm~ ׬,`0Dw؁N0D1t0" ]-0NZRVb ~hM{wm(+ٝt55E‘-ʞ=yAl X':1QX:jN S&_բ:޶G"cጔ+*[5q:N͘lktvF8 ܾr|`G#ݽ`<`0|C|e!u[k7[SXuɓbJDӚ8~t :1ܜ6=k>V=k^V^Ђ25p0,'fu;v j.myuׄ͝3P 8a[A۾-~ --/7{9lf!/6hmmͭ8W88t+H$zO+-+УV_bw`tygQt{2;XXI^ov]CУq506% '4 `k?ijJ Oxrq1IDATodYUaqٺ=VWwǍ?jlO{[־Uݙ;ǎۢqe9ym|->:8mi__wW[܎UJK5mMNrӃX3ס%G `iKn>HG{GOO,:6A<:d\tdՊYvn~f˓l^"EmB 81$A a-C@u+[QNO۲u߈o O}k^Ѓfgy*+1N^x%+.T=F@IGԠ"c?[rY*Nm=) Zs02B1ŷQ{`=Uy%/<| \ךP@!M'`756*L.i|B5D;igf.A$ұa ~)LҢ#3ᙲ6@7eσaK 45B!GomX%-lP(\sSN;۰qz Nafj.軲p` F8Sc1jade6Q=1M ;ba~ly c,0:]#%l14j9T1:Q'-%P8*rEP?r:pቪ9Q$8N͎@Ю>ЎPbu`]8JnoÕݶƥ9@8aգp7,nw9#FÉI#Xt[f(gh1l9KpX&xV-yiH-[mGi'֬: `h^ n[wѬsfkHœb%uE(uhQe| r;)6Jɇe01`ToX"68lP~&CaqhcIu`Nv{8r8ޚ=?gu7\^2.} 3`8Xh 撞9# '1X0hxG$6t/G1qcPR/p;%1 MB ~Kݩ'Gv%"s/vy2ߕw a zP0^fh,C 8{#yc@(⑓UK6O6=?/ߓmi"AdX0d{mPX!$1·Nm˖ L4R#i\*|3Vc@ׁ~v_A*LjyI}T`02GuLXFD9Ha r# UOyY>O`գ9)& R"f@MJ,,*¤RMGI#yYjtگ%DȐ`*LJE1Pc8TRa$ؑH> * 8.g#UCC9si9.gC! F1iA݇@p V`jv ǭik8;xbUv~ڮC[imJP]ƮcqXfF`e4x(cq;]R] ,pa6eFdfvEH`sfx͎x W/Uk6s(fqL-">:kѥg?R@ q8¡ (CPшhPɱneӜ( DnxhL%y,5<N.X'4teʴBT*ͥaŢ9cǏ?C{v@9X .wWOw{={'ML9jlv+윜?k%Փa mcgͮW5x}pd3ZymIqIas]/{}7;ϛ]rfB 'w7sƬꪪlWt45L淵0^Nc9 .:uƸJo  47=sEx+'TKG:ҕW8k֔w׏~o6S }Wڱcݫ|@(Wtŋ͜:_oCr&T{IIqiNN.m-+&WvOUiZ 讼(vO/HCI& `q1?@ jhT(bfrp&YwE݌!HHdN(WԼG:rpyPȄ$TUv9R}CX*3-kMD.g#dV{VAM$A k7UҨ 8a45fX9ڧ,K 1JUTYټL<}HN0F:X#bY٨1>P{s^vխd!"B *fbuyOsbz٧~?F߿G睷G '!ΛVT]0"r=YDD@[H.8#a_]͊> Y1Sv/~囋.qbYJ6M`Ҋ`" _آ/Lt*'EP1i#" ϠIa:$U=klh7ƒA8=v^*7L|޹+/BҼAec-B1( )RQCY8x|PAg'+P&4~Yk`2d=c(ثSV1 CM>#/7/uRTy yd9^f َa i9 E{t-v/'7+<S;ѹ<8ڲeSKTWW#7qlG?=X2ë$vwD-$ x0qb'n ߿jb5çjʔ(NVD^{K=,I6Gw}b30пk[tjYG}Weͱ@p=Y)z=/wX]9M ?î旕3{V(߱}C9ez^{}CooOqa~Q~}'w9R1vvccW;Vr}H2*~l`DŁ_F0|>?cƌ4 0F,҆6,U:4`yu`b W=b1+0 T&5لC?$IIbF ZvL0Cq *Baq:ʊp%v4rJ#P(9T0׈XnYȮ<1p̪$m΢6<%XŜˆ9Fyۛa+ɿkН̾K ͤ\ᘚ¡p$ï3fL-1c&L [ 2uC]t$z@Ո3a+] *&zD&~[ΚO12;X]TóCLhB1(I5ī38쫃 F1*#V3r(MǶ OoXt<f?DTP-U| 갍TEY-H_1JG}080E jG:QTTva`У\瓤 ({J!k c-0i]xqއbBÚrAEp;odFNz[9rpQ^a:/E}A,4xy2e7` _[[{!L$U-y+'ORTXz(N e i&" mm;?~ ב&~iMsUVN|7Ǎ2era+hz{7UӲ.8,+dCG]yuW,\4^g|g@|x)/<.d^tѲɓF6Vw5][ot-q;Vp͓O yes-,Fy2mS|h;wq7xU+/G{:/0q _O~],VUMz u5=>ѣu_8n|ekkkz7Q믽ܸ|?ֱcGJJnmp5^u*MTenY1nw~[nڕ+rԩ{kWRTVVV!7DZ]9ZW0rF~i{qy-jOV΅{Y%ph QsqdiRPi%j @Dv%l fdn`J EbgVRY*?,~܅IU*U L_EXp j#[DloC7O x3g_^9 QrZ@,hvoˊq?!`iG_ua;p]8?+r~ P"E 9T 霷يR^0g`VZC:<(>u1LfH^c&%g%AY{o :9²tIROaH(h5F +xBD&McQ4pL2bHo$iUq¿.a\tixGȈ>_s c[ưv[,-ɾ36 Q))1aD:]$lZ}Q0r qΆ[@ FÑ"  ! XoO/'N!U^8nhh/o҈,V:V x1sVc1` 9Yܜ|qbHPj" V;z؉ADa @i. ovȑ@0ty\.7VҀz&oT47EIMbpZz;YgH:hIǏtkA܁R]z{[*Ə6}ǓŇVj\Ÿ|Ԓb^}cYlq ~?,!k #Pt({΋_\Q>ǡA\dxܞ.Ї>!jm s dv1CS넴"e9 , s?K @I7J L m3Xb.H)bFP)I䚃PB0824H ihj=5ˉ F`QKdQ 8LLA'DyV^I,vG7zO@Ƞ|tDpQ] !O%Qh8I? %$4_#,}C[%pl+[rIYsq(9K1 ab*FmT20$#wGHSxL៯`c 0oXE Jni'*LH!e*?,Ax`!)S%#^ 9a cFpo- í>,߿c[ىYLded]æM`UGw<7|N86 0@{{>g=Vsl)SL9cfL9zrvV.@Q=UB:cXh0ք]+Akk4Q僯X0)>okhHZXXx5~c?</NX2ag[[[{{cc֭[Ə?u4x\.ώ{{{Pȏ;w.\c ͰIXvnVOZ`=3ᤡcǎa>}5;o="??9sE>)JJʜ.Ǜ)Bh(D{F4aY`Zcu'.*.AG.tXa^X&O\Q^ C qyu;m)#H %mT<0f"l Sy*?dd#af1$2 /,$ʎoɦBbU 2x  *$+J2WQA2q]G _1  0hIAQBQ*F|H@0tzNΨek09^5y,C( rW`,57qeey5>8cDGЦX tPkN_{AmK&@3RTn +bfC5؃{ BQD)m uP/K$<|AH"ILǁ5|zI"DC=jǩD01TB /֖wyW\qEeecvԤ,aZ+G4Lef/_lҥKQ=7o...F… ph|d T\#`# `ԩsf͞1}왳fΜ9{֜3f̚9{Ӧp=5 A2o &tytiX6> k^bA9]lqW0F^rYsɔ CȎ^Mc,`ڊK&VWRpoOwwvv N:3̿>; ytmQ;;{ E(xV8G?F=!Kv+_́@G.|Ӊniڿ?ǎ 8:GYzͿO\~e8.z hwkN- }wK:^94cm TZc8+23b )p5Ѷ1MHg\ƾtpcI2=͝D! `$LpGQu(j$#DT 5 qIF@Oj\-ųFb(G0qDN,K~'o`"HAnުQAJ!ԔV+;.jpDbex-ugy b HJ; &͒w< } brbUfme#$|`O^գK.S ֭[[oegg_tE/*.)s? ZT/Q rJJJJ 3.).7rҒq㪪TvNv UUUEEE. \a}ŔnlyA!a@G[[W8P|#'daeGlX0Bbz$OU\px|"d\-'>u aKt¤.1m /^2qbفGzĆ59洄p9>zg֮Z~g wmj|3A89HD, \#Ғ+V\}'Lhmo vO[hv& gp]s̹xݸk%E%0"Q[^N*+T ! s8b)x0x 9HɃ*ANc &JҰ(q4ٌ2ʬ=B.P:L̥CB&092'U9c ٨d s |U&lEMv#aʲSSO0R#q.<:$CbS@)cQ3&S6dE#Gf< N1ަV;{D&d/NFf@®"#FgSgp'h )yM7oC\ !nðawԣBc{,q|i/^\FYiz̘9#77W.>`6z@V*Bp2M9-'}ˈs,V+/_h’bˉEP1"rȖ׽wӃ txm-/O>e恁[@ɧVVଠ Y`#A= Y6oځz啔z|֘zYyC BY^ۭA8e, <.a&jy`ey;YxN5{ʪVoN^iw,zn$͞9uB=t:08l-/  c UXXP5a|o_w[{k__?)(,Xqn+;?n=wiǛ}y]r%7o\*Hpe͚1k>~+aZ* [v2fˡW \p(x,!LI8ؕrj䢉1 #,CaȻgY^UGF$0̘Olll) a]5njKO A޺*l9@/PterdSwI*3 c<,%'.P?DQԉ\ڏ|ʓMH)­T_ *`' @=}$jr"yٍ |Hd#2+Rȭt>Hn!uDlFvcJa~vN!II4b2v L0):LS :LS(LlL00I)`R*e: #Hm;MiYH#sgN8rƢpاNo9  ]%t_#V j-[v-nVIi) qb")u8P3?pѽ{644:jphY^w= :t-<-6~b%>X5l^{c&նEP0\W[_"''k v lp'Bfe X`znp{E<¢ª z$DΎq(_¼q{\ͽ?3/Xr:uވF-"Qx)< JKK&Np+uC~X *_&2Ū9i=09*KY%JKWXV^^e[555=ݽ!~  jj^{mC8X=1 n!v?6P&HGQ% ;6zG"bCP-Hs#K6U /oƚ5O999e~(h|@Ǩ,r!;;;_]nÆ׷o۱e˖57o^AAьplysӛ7nÏL<(_ÃT+{yyaPi͚5>ѢЧ h&t LՓi>7bz7R)Ll jH~;zة"S8TŖT 25{v#df6S#+9G%sTjڎ}wHr2PFQcbn 嶶V׺KC#xܓ&MϕPd@[F`R}( ^^CPKsˑ#GPʄ UǏ6-&.v0l޺n߾s׮&NrS E=Zs箭[=rxɒs,_PO Ƣuys!tSSs4// _nK/m;vR.:眳&vZmݴkgd.5 Ţ~x\yyrG|:F Ѳ6[[kƍ:tAkN4Tuu矿hdWGk۶m} /`)Ey?՞믬0aө %>mFy<4bmk1tpNMVTv; >tjǫqڽwCζ3xpLPϻUMAa˗NoCl:Ōx`k9ȅ 9rͮqG a#+s9]hFXH;"L@ cQӨ!l:;tn u>l1>.O}Y,㝚s̷й?#\p!| GId@8B}&iT5F '}%AucVѩ7*;(@zoCz٧_AaN!r)qT31Y F.atd`?fL8}Ọ»"yB1,Ł^{̘>#O60h`|з!`Zmp@G"`"Fu'bv>t#]|^ғLbT RYji2]M&|Qe+9!8[9&E;= t8@#1J+y>S g7V\-<\(Ձs1tJd\,@t^#A{`iNy/ b'/eVUPS7t6t"%َ G5c/ C4/@8mwOЙ|Ûƚ"[}- A51=@lxP:mv7V]݀/LE vƐƐ-M(tB$P{S(d"f ħ1sf&8i(L)2MM1鐑PSvEMa&ȔW'A&6EnB슒!A&$2TdI!vJ2gWQZ3,A8 2LdbSdy[2eWdIM'A&6E&xdbSdIM睑I"ے)""sS– LES vEc{ (4HLLJTâTߞWYLwvt`+ԥ@$YZ|(ET_AD:b@N2(Qy])$DA,v{E6sY#AB#*>nstLaU$4&Ĥ//j[[!O,<| <#K,??+s H#9@C#(W@VQWrP޻VJHVUP7ZҪPL?Xc[lcڵg东Nsr&-C:BKVH}܏tJVTx#BA? r iMoYikSc}iIa4Lm"۴]Ux;&vPT>b aH;A#XI0"!K;? f<ǀS. 6Ê[!)0 *O#j$20GY|:1{LUA:!$mXcf(k(ƼMel=%l= 1~2M"8Ǚ mDs۬Z ͼy Y2ԚhKrBdFi:cPD$924HwTPF$OD[];7Χu8:i%Gk ]w%Y2i7|Z6.m.OGGÚ.$)dtn-+;;;';+ۻͷlb{*U JCHc#Puy"*xF@ӒJ0fB}E;xCY Da}Q~4b!8J|(@]@kU~i? ? P3S, 5t ?$H#^fwqȄ憊 G(!A2!O!}[ ˉ aڧM<)dIdM!&g8:&O0ڡٓoWN@NJA"LdbSdQ/>!Ȁ%xWiL{hFHELbA`di ĚHX8آݑ/0E!h~4@:Q0QAko|lY_nn!^B05l!I:@ 5~}HqIkDK +'",@̢u8xއ$uT5M?(%EBx L<'O+ %bLyhhH2yc cxw o36NRx /%6-iB]Vg `:Dí [c|;q#榎Gjֵ4uvtwu5l۳CǺ:{`/ӕd$3BQhbVwsE$^a}r&N"Q2nx2T8)柱`8ĎL 1'GlոH8?YŒ7 FSHN%0:& (NӃ!k8Yʎ@$JN*1`t0uxsJ|-ckB-#;BbZPA쨙VFryX!L`;*GÊs3dW1ЮD1ݡ? #fic|;ڋn^)M Iȫ?r7QXHe\0w^Ck`N%&9Iv⋒Q#(Fi\|]]A m[sƖƦX,4s֔,*X4sgsgF ]=0$ [4Ţ6.Hl-b}g~ -tBY"E uAzG6v/0V=( &57 Px~K|2zw-tҰ3"d?PH@bT,z xn+H%KMHqox<2Ш af16s= (dL!#ل$;u{ `00ikDgP0fEɾnKs;a.[< /_z(02Sc2D16!F6U|?9CKofCÁbv[b=9N,!WxBqv͘65??[$ZJHn X |M\$ ^<JuzkTVn`u#ƓQn Th "h~1cG"aK1~KJj^w HcShJҒ8ҞAN’ĖTlYF)TW3z -IVG ߿LKn>S0#RgI' N%8dHOȤCBԤh/E0)92`KՌ+ %~2&$H#:A7L6v988!MCw5]sNa4;xm#;.թ4\.ߖV~ 8 OV~<c *K^n-䀚 ].(qÈc{rDU3&P SƇ# HI#$nj@"[9Jp%$S:>BbH7EIQJ~L0`7 ʇ,SY'(AS"ɘBgi: LШ$c6(b{P(+ 0Ζ֖"L=2Y L9lq",LPfX|s$ ysSdnv{fnx7Y>A=:??Oļ ɔ@?j/v9 8R.RQī+>"ʎ23`Ą3`M-'[N#G%hoo<9hΖΊˉۨY-y!6~S| c_!Avڌ&ԧfx#П:Cu+/1'ZK)<ἆb8EfӐ%J pr]Ì.v ,rqLsqJ{T)1%v3ƌa9FIV]":=$-kHIU&x ĤF)EeYRl8'( e`FjH=aČ>*z8"-<~1?Idlt9 &1F7x[`'& 5~ʻX6Ձ8sO⥈z6;(0w1]_ʈ };ޣ0jVa@f`*\F=xvqZ${i Q{6ԉ5pIii㲆! E (EQ `Jd6 _krc_(F1 u!<9b3ćzᲸGSS[}^O,#8V P02|IqE& {Aī!- Ac9-`TҸш\b>;t:v#7 Rkrh_롽t=xڣ[Nz@(IXMk? ˀ .|(~Zֿ{w}U׽zplpd‘A beyWMDM9jTcMC+<}$b)_l޽GלNoGLPBJHHcaP> 9{Fc$G+s&t,#m Pٵ0a1Kv^_Tl90pX CXݤ)F fۢͭ q|89yjAN  c\|$r"aG`Y<Q2c:%127ǹ">]A̱xB)CaN#93@F( ̑%IAl6S8A6)ȊP .F8[tE9v1@U9dF>g#-Fpi#=ON_Hwhh:hKa̷{)|d}b\t//iljZjwgyIQ4sH &NboGe ,~8k+sGm"p- -A_x]{w(ɞV\omo [aP댹.+:sYflބfsfpD۶֬|m`g̘=̜uPwY"Fx7K,?]5驩5y䜜xkĪ:>ZF5&dZBkVo=,x^B y] q:aj1w6Dpv`ltuym?% r%|V'3Ҧ&x[Pu QqT_nrP*S]Tm8Pr0`U6ͅ-0(s&x޿ʧVj&,6]'M18+[F:JDQC: A1 {`9qXG3Uq9+k_oBCS+oZdL0#Ayg@'Q 8M f0̍jJ=\Kc 3B:AJ'r8I@0\tQ(_N >޻,]j>}znv|0 8Z38s#cv c0A  b^$&IU5i "E˵e?/';)et  x<|潾n)e6P7Y~ww7{]lN2rU'o`í"!ui@sxC8B-q5BJz"۫9N~gar#[n]+V}b{1U=*-'8]TWOz0#ןX)T0//z㐠&б^ۍ"yE4ܜ W؊Fyih4d%2{ FC$G+i66 > F SF*eh($ 0PO RG v,8L(=y+[Lcp8|NOqblԔ>"t)a#o_#eX@>Dq"ƌkw@ejǎ?!ۤ`lr%rP2Z#ûKQ+%NJq\GW(ΪhU#4idbNHxNjQUd(6u1~^\ Vʸ6=gElnn>|0UWWW(RlT[΂RY/\1KD,֠fвee9N v]7 V>rD}gW;sqaIIwOO__7 mr8|UQrϘ>cy^x GxBwa0Bt/$:;;#'N4塿A`__?G \>06=BxťEBf AC(,w«>  ?8^6 #!!g8}hd$}1NFsqɈgm0 J8F29p8Š. rUWoG'Z8cCb l7$R/bQ1 EyYXsU#8 gNi׀jTaH#-0HOUDd(f0A2KTX pSCs*a#-Fpi Ϫ}0~ͷuw>nFyz3iRu~{{FY(XՉ4^f cj`$+|^+:_ mF,Ձ@(>v wܹo][ݵ>"ez5UP?XcGOEIYiٸBnŸˑֆ:svkC fLqwwj^s':XV6>e{Vwxkja̓exG}饗qnOAAC5C;j}]06Qw%]' 1f 2AE& ~CUYQ4# f0ZQ Hp jN RIc8ƛD3^aimmom|ݍ) x/^n:$>5==}>z]/yH>%LINYo4ٽH{Ⴧ$۳=|w~EN;lvA5\b E+'/Iftvot44ܶpgW;6nxD} ;;:׿ܹs=Nw\\`XZ[[gΜ~?,).=kwwue9x^lnowjS忱ics[…gz?75L>='' /9h֬Y KK p(!FC?1+}$ڂ @XC<,o [@[(MC|qE v˭!|!:#f&D|84$R@`C [P 25= `a" $aAu:D G#1#38]Z(]9a΃ :SDS@5rhh!?J.ۑN";d ؼdm,Q]_~ϏZē^=NYZ\J8Py^B;RAB*Ԣ2|#eݹs#< wK/C Ud,1?%S)z6v E@iN P 2Eg$h0A=t9?tS4š9T5Tˣ|3ÊL`^Ȏc FZa(Re xDCxx-HXΞn̛.z:C=m+#yX` ^eeˇhf W! x8pP.k$vK  ?`Fz#bзq TXBS> < rLpyR`$#ydgT/-uҤfC[yյf͞Xŷ2455}YK,:erOOĉ/.byp#eE)3f]vɥdBu-[1ڧ@:Гly$Ddx|%I|ζd% )bss؈909vW53] $No{{+zUգskvn] E~;vl$+҄i,DE;XZ -u1nKM-|.)2HK%Cΰ%S| l/v6a 7 K!3.+ A/wX[j :ٌgwaQWBFH$AA2Ȏ#9aCw!; Zu8:x() Á?jT , \^D0FxvDQѨ4Zzƈx,211s{7^~o*hu&c.zGh(-v Bzww7$$AB ;Z^5t ff+˲23VKBZPuk" (>H >pyF |@`3QBd$1> 2C C8 {# {d V iYbC$Fv8 y\Cll0(@aq_ѡlqz4mxH+R7NT.4~8\A"HB]ӕDH%V ݃ڣP3Ll"a=.o;#< h p\52_%KJ$,9ߔ9m<ocH"TalX48WHҸ]rK|3S9Y2uݷ9m=ۿicI()oݠ;a@wɐ1SdEk4Ѷܴjl$<;)-"nS:%Q"jϴ{ogtrah:89\N>h]g,NGß[% 8l6)>z /szWOvWUajikoav:igϞm-..>yoq&f{{ˋ&=ЖmސveV^y%`.)+4Ԍj C.BW Xe}Қfz#&G~R`qLKv[n4#*&(bUsdo8ENOoqya M5¢0|$ĸL 0Ŧ&''&f"a$B+@bވ0fqn~L&#ρI9zom~1% 1"r*D|`2AB$`@7l_ XH"wTj Y#S q1:=ݱon57oۿw_yAA0RMKaCKEEEzIBN1̬^ADN1Yg;''&KK &s0S1b^נQH @>T In/] Qd^GGPr:H`4Nh }x,hwP280 Qa R `St5q A9 } yr*/%O!IT[[Aa|lC"eaqv57K44L8HCfB,hk7I] ZG)jL:C4V{m`6v)Z)&H os L=31R0h fb Ff5]֪ A0,,XTYG$J3:2 >031D:Y[[WEE^/ţ^Y*)=yMw|(?3#f]&IygOm۵eUիfVׯ.7 Mc3apyԩvw;z|߾{ɫ x\n]Q^FGO74,F7mЋ?=~Ё}{ y;w<ӰW4TuS<.'XqE8Q<3T70wGZD~G??44 MnfGzDMEIcL!k @QX y! ٍ2 ,u $Pɒb4:Wƞy晦Vb6[- "6JqH =Lgo}|G~{7^73=5Y(;t U䙧y7p{^-T:sC>ȓ]1MatF #a,FtE YΦڢBͤ`%22sJAѣ'|cOSclػwߋzqrr  8xǎ65MO FԞyav?4<::59QYFIv?pԱ#ݝ]`APzNIC+6z5 yW^׾裏g?{DZ8??t1"#Т,YTHipX+(q!:-45Tɢ `:%Zd)ؤlK]܇)' ???>?Ox Hs :]n!7'b6$?}ݟx< { @<AUFP`hO:SD"+ag[.tS>/ӌC}@?AB:z15T[\Ͱ(ARY/`\(WW.=p.唋]ߙx'ٙYl_20Y&N^TP[0Ì ;~bYY6) MLöXlihܰs?sݦQYYJ/z}mp EŅ0\.b>} ħO|3]07ۿ03ZJ 9zmE:o?~S޻ᄃuU[jǎW9zs30JW}`is `n`0ts]?v-;;Kk94CI @tӉt#[d!2]Q ٲ)H5z&3Uuz:>_,;;ᰲnEoząH|A"}㹹_җ_򗾼nݺg}n#D$\z5N9 \ҪѨѤQ"1KrxݤžF /D-SUKfRa6<ݲe;=})4Jsss c8v e=ۧWҾgN>sdgo`pZ^z5pUY޷wy7:[N?169GL$- ($#8\tqThs@g|3pCv5VqTIZ˭ykKTd6"MF77ĸxͷڃj F^D= R/=7)4pD~ /2|򓟼{W]{)4zAA!&o40b,D@Uh\\/|-Zֱn$!@UP!".E { dy)> O+fi] з\ WW .Μ 9#m232a⧹M!^{nXvZKd ŞIاdr@jI[͕6..JVE#ѩ)p Sa.!O|;J~U+tG:>7zloo{ТNg_Ƨ=~_z=Eٮ*),(ɪ]زek^~b9tdb"뻊264||U]FfQ >xDgoܸ>03ylułsiiܲuKIV"6mZr1,LOO54X6 ŀQ 8o0( ?N>1?_TQYc'(B*\vvzjpll6mnPa0鴨۷gddb*EGF՗ƕDE;XZ|ҁ>0zwagzۀܖlڼ *G F>ؚHG .8 p ,) #Ϣ1Z [4N(H8;?! *EDB0b9 eY]\L-BgnDNc9݅j zEM6Ԕcmlla8Z,t\.007:X@~1+@ (L8A}ROP艽T%tmpgw\Qq]AnѠHx:+]m}]w}>v#DZZ׮]~c}x ӳQ).,=S3%>`~n6e?IE??ҚqTuI dBнr,mPR8&֭[+****T~~FEIDMV(i"5G(F5 z>p  Hsqq#5 ԀɄV8W̦!WNBF^ruׁBꪊʉ;woX6fBBh jE|w 6DB^YᐤP R:e܁~7G94g3z1h >baxT,0X"Hwϖ// …>\ WW .. 9 z޷Y mϤʦML/%Q0gRS9d#pi-H4s61`Ŕ!yQQ,T5Ae)!¡&&zŠ8;^XPXxf~&D#0BlCe"& ޞJKA$^dih@GWѣ7oڲi6{{KSMmmޅҬɩɦLIXWq1Kbaa>|tCGGDs#G湙Io$R\QYc6cXQ9hׯ[W]k5;qrhpщ':;;Qojj; }qq!=Z4aK8Q{m---0OZX_ĉm'Osgm\v~fwp(3  {VUNOMOӛ%j)jYo`]TpgAJJK6(%jC1_|P(&1;;{!q}ـ877{xx_ Љ'| "Ҩ456ګCCqQB@O<[oAafff!(Tϸ%Wl+aE1;PDYA Fp`..tttUWW[f=oj2~ѣP hmmE)0i5ډG }1QDP}~N˨7zkxxرcEOcS3R>|x0BQؗ_~5 J.rg߾}|!8DBPpw}Vz V⪐*UW|S.H%v 0!2&wW<-,gefvgb8t=%8,v*/rf=Dt99=Nt;acPFhx\8Hd0fZl;"iϔ7 HޠFskrJ1a!`ڸfc- wpjفp4w1 ۷ݮ ;'/wGT3;?!GvF̩ 7d^XXZ-%ť%."UVر3\0533SZV},VܜL70I#~ժ,љW\Rffd\vMEyjob|lnvvffz wugyYѨheDqe&6v|ϐ0׸wmL0?~a̡$ݎx0pl„OV/{tXi h$;+}`Rѱ!EqX-FFd1zTñgP`oHFn@o$%PdR* 0U4Xް/*VAySDh5$JV>ӆt[:܋OTsX5Xv +wdxʏW_ mtGM-g''z}NAav^dVKV/`dT{ʓZr\vvT.).鴈bvwvykoeUk36:^9LUݶjU-jWVVج1jСd{<>3sgdl, y׭YkN648xjseff7ש˳Ip"1k+UL\+f(DCCYxG323FSVFf_Ϟ{cϞ֎TpwO0Fy涎=#ݝvw(oon3U-͍/ ettrj !##gDwԘPNဎ467ٹYp䙚U5y9G3vuOLh=(l4VzVX Bۗi(qG)oL% Zˊl[٣)P M$ uRɒX{ M݃ 7X HeJҋ JNo,UZQ[YrMiEmh[/F)b7/̮VFQ-N΅َ\;mQR\Y\,-.7zk>/?G:^c[$|G23ݻo+Fc#CsoSW1vz͛o`ICYŕų WE%YY6{ VKiNK*9kTimeeEE"tASE޽g􂮬4{ht$NI u zweT3{zmX~}br⦛o;V֎wge |l >~]w9rN^ 2lP'[wy+˒L 3tvLNLWUVX,fk~n~ϛo744}]AaԸgO}>\__YQQFonnx?֮]{x9`Z,,,.z_QQnnn [tz/b,ptk!0D.XK@Pcxw|j0сBMo?WZO6 kk(|8=Z|#?T\lŠB%CC`&5 EдAaqk*zӧ>֞=--g++o\г|qr=wx17{IϢ﮻o۾ŕ./+;3gns "tBV[ooVb3 S}n&hln߸S|$Ǐc;nQVkc#Xpwjrrr J7t-@E=%ER@ueڠ7P ^U?.ܼ9# oRTdyz&IbHђA9%͒dG%O#j߷AO_E灟= +v k6}v|bBObV)*` iҲRHg~`PԘ@4C" ;{mLfɦ ֔Ֆ]L`@|pƟȪ)*,ve$B%:F4 E{C[#VI{6stDt"3y#'@K&rHLҸ`՝XòX$fnNl˼oq8pπ n7l֮ΎS'Om{̽b٦޾މX$R^VoZn}NN\gG>﫯ƇGF;{z'f myqLXlںmMU M hl=zp_O[\1$nBrH l(=E!(,Su B,:ެRKsUFPccݮ)=>+=63137pjn^aC ڰ FxÇT_H$={K0GGG۪s{zngaqaqQQyŝ7\SSYQ\XRZECwuulh4 Cx:>`nA{8!SQ=,6WxKCAy޷%H_K߷'rÃM9oα9-%a߷ }ef=^Al2h{ ?L5*YHZ)n(9-Mk6gZ5f/.Ώt OJ^lڪյ5yT:uPXT  < _bP.\^Jy,Ź&N hjNfXH 1شi]{aanٰ~ \NN7M-Ң=01-f߹y`MuuvbGN$Acc#v-'7`4hXH".-1FʐWx&W&K6Mr;b,>:>{24ETlfP>//ԉSSk׬1M tY\s *BzH *E' D~:5~aB?ַ„]fZZ7p7<|j*ToqIɓ'v7x#NO?SNCA@TFfr nmioukrra%H#4PF ӑ3ᨯ_}uqw坓m6]SSР]QrUuwYIT`hG]aEqϽ>=r??7;;k+7{Vvm{>뮻MLLtzAH(ڵk]~WUU8pǏ4h=@e"_b1z$L5(?pAi96Ԫ333@@YC8e4=]wCMNN}'NLNMs-oeA4Hwڏ j6@ 04`@02ӁWA g :-~Qd1-fT:u\mPZk1#Ϟ_.q6VVfYqw10#\%ʆU}lPM uR#9\ h?;r;ҸXK7ֻoh4ZĂ cM#d#ɩ >p7o}7o޼}h8XSӳ Ee0}oOWksӖ͛,fKss˖-[[,EcqP򡡁9OeuuakoxM7l۸NMVfg'FaÝp+i1FʂRAP+pɲ"XU^\X/ l=g+јp7Xށav9< 5嫪W- z7qni{}};o&iH<^QXF;P| zJg8+m΁z٠F9//fժkV[nͷv5ʨWYYYUU }M@ }fFVYYYm-U[n)/u׮lݎ+.)rEŹeeUUeՕWuoDS ia,$'QG3i~a788TRR^VZnw8rQ["NdX;/KF }TMW"{&,Òcĥ X6O|Aj1a, q@0` Μ@b1̏mDXp:!(ZޚWVTV_fSflVoZmMŚ|g^1je=5E-q,O <H~GФħ$'w_,=9R+Ӹ"X^Ksl6655MLL4C]]=֖֙Ǐ9펚ɩəҊAn?zkz0&'Nihimk,+\V֖ u Cɉ3'O8<15SY6+=><EYYv;,NiQjݐɉ~C9*zV}ώii>rЫ/=??;׬Xh\=pXfk*JJJ,V۩S[wUSW[\\ ZZZa_ m{萠WDƎk:¢"()jZ 9y%nÚ^YVծ]nWYUSkJF$RXPS__hH4*ꌌL\^Q^_WfrZj1ܼ,.4ݎ6ljd;>4ऋ [4qZK-֤ių'Nz񉳭퍍MMOhՠ^5?0<2rͮ]UŶedC-[&KN{zl=`rtLK[(&"#<׏رc \c˻QՒtR@;4P9< VRԯs:y_ocSskY;#7/w|llxţsbzzh`J޴qc~^pWw|wwǻ{j֔̏mYrށޡ֦;;;}?vXKK 3UGj_r؃zCOlP-A sUF|=C#}=-gJb /ko[2-EEvYWSU:XӓӞnbBҐHhqyَkvVTJqqlff5f.??`3aAw6\z4%4Q^. +PdװuwiĢTTǀZZ1.B4/+74#$b&PHk(vvrbLg1;; ?p(j]zZR\G?{&'a_sgeyRFFkWhAqiyiAP¶)*+˞ki=֭]{5׀zBU'F_&4oCEccFFGG~nDHN}55j횵q]]}}}~_je˖2hH[[{Gg'l8wnhin}ntB1W^N7Ԯِs u6fENkܹ[nk||Ħ o...Fq UkkkoO/ ~z0x{6E܆2 d[T+ݱr]MWWۨxHv[DAe fb KJ0+P`4d&6@|EsjI.[qFTTd z ˴F*1P-C "KӿR5I_T7a;ci.+4c0Z` 85e~m۶]VAA s s + ?=><ٙ@ d0T:?;ΩŅwp"19~ NYLNCapa>Z ڹ)o8n;sV"O-Mv 6:& ,N xTjXMēZqQQp@qʓeQ-D122FCJ-.fuYMYND|3h,f׷ 3.& ݃b<֪.JMх3Nd,x'LFp#鵲"$JhBf2kgj6(=΀rfI/1Á\`4 0&,rq *K`ԁ'OE]RHB!؃ &d j$>\<UPv;zz Cd0YC;//nGAghu,V^[,v"ȑ`Lt\V?3eYHMLZ1<}h*If>Ce Pc8KߥQfZJdlw8qj_N'2t-p(%CxFɶX K.ϣ l6w"!"4\h7v¢בkԛauꐗQ)wvP,n0Fx&kff .;efeh5zX: ØQ+Iv%\QSQ{4]RK^0#Q  c "zO=,ʣFF>4.;1ltuA-9TQik{L*́X^mFk ̴5Z Gfk*,?RUQDqD.]Ұ'6&Bl?J+Z501ԒDd+HU'&`H/ ˫N0EjԈ./U}m8RzG1Ҹ`czRXC/8h&4RnE۸q L&1ɢIt:L0FZ EH3@W~Ib/R`I%""oVbB" zABWiuB+*AE^#jTJL*J#K* 9ңW F uPXx(`!I &dɀauuFJW;+(HOj/SLE,AfStA_rPBPI^& \$*-]l qL7e¹AqY 3 >䍒M5`VlcgX-P߳ %ՠ~8@?JmByMn"!q "QUEE q$ +ʘ* @qDFLh4tq[Cd4#F >GZz?#!W3 R* ҠhsF+cQTƞa`8j&UJȍҵ0JI_LKw R?4j<!;ԉCER$ \0j{&- 21W.x4fw #^"Zµs S.{e*y)sE⧐}K6S<z `ۤ΀E nRB(wn`Z^"nr6ԏBA//%QzIns]qI! l^rXZ1oTk?&$+-gd/гSMղAh%؜jȔH]9NF% -R($Q9d Yle@8! 2}QRKH>ZuQ JsKóRHȚ.0αT-)&pNL6쾍KA˅Wڑ*/>ꊄC"ufp]buG W$mВ܍,%E4"FͥAinsp8{+pAnç6'Ojc6 b,(AkaqEP6%w}Р^с̔Q4Q N5vDf θ7:B:{XA3sv|:Gp,jZۼں}>6rZMzZUU.)Yv) X2Qry@2pZ&򟔃 h5Tυ,0/2R޽ }\L+#=: ~|߷IJ DVj"lTS70>>e1 b)tfkkX6F #f: 3QTYz> ~(tH'  !l9!i`׫R9ύh)եܷၡZ< su8<(1&w ? d1Kd2RAv_#"mPR&jd1zDc@TQfJG)27 ) :-5H;1*6TfgSrCUcT *l_ @`V h%ML#gSHRO/1Pq()@fՓ KAtj@*Ϗ8bA8SB84MD:ȗn!8*'tE5긆< % 9p:YOVZ엦Dt]mE#~ECR MDԌ(R0[4dHj5(2j$ՑPs*E )3` =n'˲! alki X`fr` 'R<^dT":d4`, NgA8>*Ȃ‘ eCC|Vt1\8Dq-qL/cqn?cOQ<بXh#X^{Ip؃p jqdnN.RzQ@6R#*@&V*&* 's"-K|P?@\:, .PЈ +T?Kp/XK7^VWI_P xC@Hs4(w1!546.ܴ5C~v_M˶DDmJnˆL]3LJ-C{N5׬1fi@ah*wipYɄS7 VȞkjKWefYu21 Ơ$\!Q^F1 tVӇ(\<'dK<@7ؘL|NDn0{󉄒|&|s^`lY RXN#&ߥ!  R%KsJ怂P!Caq:zEhm7S!d nH Ao`~i=# RwT쾍HilA vBRtU Iz&9Q2^gZ=kE+SM&Gʽ$%jbjv| l5pHgZA]bC=).(-VvT$;Lz䉝Zdj`T5Y: L@ׂC) 7:orYC'7R`w.A!8Gn(!JIG3Y >h2mtx]cW"#Mb܌ ,⫸0mLĢ S*wsBpx|lŅ Kvv.)W%UR)@0c%Ls4(mh[rCVri_Gg(ŃA?U1,kŸM?6nC%Ĺ j@K['m9e) 0dP]"4R8DELWaTZx}MvMooJs/+Smͧin9UYY9v} K+}7?#}EhM1)'K6b0?6py07tL'"&!F(.EgrBzZۦf B0nw22PR1.Wn(#XA"j @2="=}U0(c,(P+u=EqZa-b&VAȠ#c>WCxor&fKjtDg1nCc$9,‘ʡ8~`4F۠% 瑑c 1@܆oUݷ{8hG-Y2єu SM%چN&l7& sy!;@&۰PY~QZ! gYu $aspT ?"qIჩ$ORN9Y Lm$XC`4Ҹp`%-ԯy`p&mҸ2ɹM(WߘAp (ȝZA`,ր>ydTs#4.k^<(( H$ 洱>CO;ّS..2zz#$bݫ&)$UDGтQ9&:3TM7v0?uQK`ჴ!M4 Z{ɓ,,xwl߾ p*5K]N=#%bQd -TN4Y)xxrLFVP#3~#'Nz1/eAt0)xo:]|0.\)ʂΠgo݃䐭xm)-r.5d)0,9ucf&cqcqYLZ}d-a% SF% /tr-9%zP?IaeHz]q),m,H:HV%Y,<5Nw8ݖKȘLMX5oSTN:=ҥR;tT)Z~y]0EJyCrsD!DRxxf)'ťF/r)<h2#$8kJ\ 8$DH8 d c*")P<oxJ X AqPJ48<O_SIш"#'1dK:R)9J5,q~/M"h te4Aڊ͆q Ҋr%M/(`GnK<;2xt~zIT @Rxt%Ԑ1cb37#ҡyP^t)Re+\ ٜ AXB9y]=lJRɼ !R,;*׹(dh)͇ \sM!Q9*5$&FȋO .>󡜱#s]" lqjj)#7,NHUOi3bpHwNt")gyPd6C)1.dܥѩ@`]8&] +}P";oÊ`vA.vQqb@eNx\$xQ%/Wj&%F\璚* dC6(&9bs! bzz0YF#`d2:ԩ+>Ls7!^o}}-M#&VQmHSS3(x8DѡzZ:PϞ$,fN(mlic cm뛜Fah2v/. =ustrB+`\ =NLL657MiZYU"9ױJ7o-X9Gr 詳œz1BMK8^eQWl!օ>`F\^VK>&_{%R90~?_Vzэ]c&#{F)iԂѝ#QEKwvU%*aI `<nd r U&V:$ix _<.qyAAA#kZx;888~W1CW_yޞij;yX3CC#=MM]uLƃOLMmom;sLohE"yGFFfF&|gvas=#b4fШlzi;xoychxb_{C`YOFmv. L=rsB$<rvMZmtd**zj6iFis܆ YXK!mx&R_ a$w"i :%bR4j]VV5;;,[OрĆMFUPG^K\VE%uHTcJXcZT6VơzY/J"hٗYz$RJ0(/1z(d*Ksss}}>?=Cahp$,.x&-}j߿ovγ/ڱؑ@389>%ƥ~?áPexx* `0R4ҬPZ+oA 7ի_eN?ʃ?81>4=;7;?8|c~JlҪjPmHTzi"qcP}EQWR4"Wi%5}@5D[5(HnJ1 tI T*N0jA٢@}ko޵k dfԭY[Sz fuWY] < xrm۶}ÆMu_kg<,J `D <7e4zpg]FiFi Q!q@Vx™|g@\Lx<>55588 -K~~~NNAoYa=)z".7|Νcn[;_ms^k_[ro}G6}?OZjrwW]MF N"qu]+F#GB1)++̣dd$D‘j4@ ")䝎FFt(aS N:}Lc %|j͚5. .r|ϫ9q&D͝;?8 IEy'U6mZǎ?s oֺUWUAHTt4>2 @*xZ,/,x :::N<u QTk1iJ Q&Ess}~QٚUgu8gyQذqSYy̡Ç<1g6jNܜA++)ZvY5&璣4.5w` n!@piFi;,ށ`Ꙛzm{2@*n21IiL/q yɶD*]%nc2imV, -rnW@$cK ">N8EB$nh38`b WK7)ȇ}Rgiq0z(q%̑J\Be*UO1#  :NpD PDTh0:.Ҳ*S jI#*(_3H_~ی85M*Ac!DѰj6c,-&^Ÿzfz^` uzFt^gB(e6`,by5sbv)dkZbI^?)S[~۔($šaX$ywl۾vZݨd-NGc1AMKuzFi dilL6}U55v=ZQ=0GKi\/‘\8"dʔf*ӯsgyxI.t SO]f -FHװ&B='-M{ATJ#4qI ~TT*_TtAQ jj1qgY_(P?hdU"{゠ X%6KAQANna7:bL GQ=Gg4z` d:֤i`&a2q Ӓ" z 9/7;(:k&awgJJ33uj-ұ `纊 sssĬ;3&Yzc1lV3 MtYFiFiN]$یiq*p%qUpa[`w=uޠgEOCY6缡yg`lwxxtjhtjph`tphtdtrl|fa?9572:Ԍgjzan_ FCqYQZ'h@A%b 㱘F|H8$UG(zM|eY%(FA38tK*DJЪx4wA CbEP!HDFED% :]ǐt0ʠG;6z^x  ˏH#4H#ɘ@TrԑF RZxUpd+plph:PJu5!7UZ+3M='{&'&fFrz{{:z{{;z;Z;4454 ~yBUhTPdȧģY:DCǣ,ؓex\ՂDp o4D gR@/Ę E8BjHVEkN ( [A5YݦQh C`8ڋ.hSELFNb1Ez D_i]\RL%rAS ,/VO#4H#4`io 4O&Q=7xY6Lo6+N. IpO -q K@P%Z|aZUV' DGy5Ekvv!Ћ(FX4lWz hTZIRLF@WŨV%Q`«eQzUyQkt  dd׀}Z:QE% r\FBfEGYE q姷ZEEhDyT)!;iIrF⇊H|@5ytW 2.B<!*l#b6HUN$V,͵J ּlsAW/J3 %%\{!EY9LCj%fHD(u!Faw<* -`0 FD$F[| -1%5bUؾ ?C(H\@c(0V!$ZmTk(Sb`4z4PUi: 2a$b -n)@`b\ՐsP^ܟ5'$\ z4\6ޜTp;P*EjI=m܏v2rAmhqj2.=),-IaR/wҞxeH9FW lHliq5n4O? t߆1;Кj0Dcwr⌡HUvK"ʪ($%(QY|S*Bsn1 dV݅wߗ%'RN%٥yJ%2@PK90Lw þIVѢ 8NrR?Y0J+ѳԔ 4BѨaBa2Nob\9aXPm*oH1H%(}*M׍,iFi-Vœ3H^H>nA&‘Q(Xd`85 'r8q tvyJ$dcciV#yY<̋h$2E\x7`V"8 ma?H4RKjm"MTiWLn&c\1dR񂸒bTIGj,Sҥ S'^I [~vIr 7!qA*G{%.{K#4H9`d 4###@ dlab:LLؑ}FUDjGxUNպܚy5WϨXQUQZTRg,R٠hLjIM/ IZu0v61?uaPPxCp||ѱ9ROf3y^3g!aRs^bY~)RWȉce4fix;ii% ntY't_(V%kUBg^(&:jɕ`|~8w@" nW AR{r`,0`b=RP~yŧ4x&8#u< @$CX )B ]vc[(OiF`bhGH9x;X,R$[2ut&B> ۨ4EkB*UX kNkZ]n{F6`wv)؜ZScuNť69TUV=$SȘc92y/6)'`*:HOɾV$!r*wScT+SS@{i\kvv}p<=W@hVQEIHA+R0kceZnUp9 T-4 Vla}?%2fK$:PxtH;?tiF#|0NTiJKKsrr@o`k)jCA1\yN%Iώ7[ܓ&ahdJ>-.$5=980=3ӓcScc3333p/bax-+Ȋ G&QoIń^Fx$RdY!icYD%*mK6%XTnzG㢈6GDx8EEDQÑ; B0i!KD#ēŞŠC ؈IUhu% Yq]’Y".Ħ$GHr@![CiLYd 42>ؑlyrE8U42PYEtr(,D4>@"M4nۋ̟͐s7L#:.{{!B]󶶶 jNOOgdd޽8Q+u IG$ fYbNA.0= <ơ٠Vtި L&p"=D &W4:CLQtgVlQ -;j\.ѨH ņN ᬬ*FC==^,їDL&3U5۶o.*.@ 77լ]ffG` Zu<Pr_0d1[/l&'&`1I566lܴ9';7//Z4Ah5/RNѠPpX5!9"u8;;_yyӊRj3WWW;ȍ>KGđ!* "'rZmBf#ӡCW6 kt#Y?@|!$<&(ʗ78?g T rRp2CMcqX_H}skR$Q۝,s: - KR`Skd<=3;\fS6=7m7 Z^CĚf@^,{43( Ǻ/B; 9T (5Uz z~ ҲnxCaAXJ$5nLHjudL, Y6ژle'mgAiF^qV~+'ϒerfvg[9fgٕ8b*m\Q F;RE(ddϪQZA?7y駟{پo8 hGOĢh|^P_#+s?ꫯ FwȨ:!dc?z*E}ttM- 7TMF|e1[$Xf!D1Noblh]e0/`b1A'B48ELFb, F"(卤ي2Q$K3gθݙF)3MNWa1LIL#a(9ࠆ 2_rԛѬНMPWE9998PQH)U y$@ `R#8}U _HoZi<1Ox|!48Ȑ H" 8*XdSq."rTρ8ɋ_&xޙETn $-.zffgf](T$CCE!LP&Ԍυ(ąxYirOSgL>;#@܆nLfq"vl|bYXz/İl4]`30fL diń?̥B, x|PfHԿg~nMft4*mH R*(>jH"cHW(T[$~PHY*@ }I0N$U$r) 䉴GǣjOr-vJZ[[;0spH*ȯ٭ K8 hx˝zLhbkkw*KK˳ݨ UR)a,BfTK٬ bEcQFjT]M &FRvg!G]%`*£T,|YJcA/ΏWmۤq|nñRi1cLݘ\7,$n`ע;uuuac`}EV%P]„$T^RkyTZ0h9-^a㫒AIPlvKL@f)*Sp[{>mkYT\SXTTVZVSSSTTQyV-??jրbZnۆWD=Hh{˝U\\~￿iqABL&lj ՒFQYB0<=s ]b |1z&CQ:$T*ȃĆ) k{ӦM{waaxߐEEain~6 ʲ*p4Bw^!aQdee\6V |>Xܬ A׹<* iᏐܬ4.orU)5jPd8* EY9"k)W;Z=ҡ:F͞mq^CCDa)R].H'J,T3g?33g϶NNN[o&rvv6($j m'rDA^<2CH5tpCbQAt/;1m$rɶm7|ˍ747;ko64XL7$Ynۿ};vJ#)dđ#ە,U  uNnM7ݴvZӉ~.H61%v?:@wu6կ~oo??8y嫭}@- U .*/T];=D[SsBB8u T1q 20eԩӑpwfz"`rd0-, $̡B=?A[0O'D8CFma*Q^ɛ6&@DiFસo{H|Z!ZX*{jla) lRDFV‘!ɦ%N1WDE *B1%10 PE Z AC+UX3a2P+eo^CwYSWNwE '>ssǎܸauBC 7..o^^It1&L4oڴ̢w-4wp`F۝ HO>SogddB 2[H ҿۿutt9Y/7G3<388vEI>t+~0(0P@cS 6'zaj3NgfUx≧_^S$m,*/ ɹ}WzC`` .# [wl9~{??~{CRp\p??G?:|04!33ԑ)Y]Roă!GWۯ3iM0GwrYdxzLžD\Rgj-*$EeOyS^¬7 Ha|mN.SƌB!91z ئ`v43+J| TƍKJ+rsEuvAYpjg5aSuS'x amCa?CUU5'N>yTVVN^^F/M!)$zx_{˖֯YqnNoEcQgȗ$y<0ϬBB%dox>dl8Dz뮿[o^fMyyź19r ?5ZEё #k jHhii\u5WABc(.а#(FMzMQSֳ' 99j  c `A`2ø(* bBU~߇z ć ʲA dh{DĞC@FI$| i@˫6}&+}vāX(ghb w`: EՀ ͊ dхiMT_8zwTk. =(E"*"qz\ChȧGHP y3=FVLB'$7̳ϭZal"Sk=232ζ;~.MMN۬\$ep`ȑ۷]SXPpA;Z(twihhs:@uulOO$z㣺fbn?x l۷g{'mя~lb^~ԯ^|TVVnڸށLɓ 6lttZ zM$[o}Q{Fttt\ܼ\ۅjk`ykM7;d6<^}UlǎN ˯rQ> cǎ/={{;P DNΒ2z/܆-R~LT4l@49>;61C=t,løUvwDo~12- s)E<` .2MB"|($+'y] LlErpD3`[4='%ƀwq}^Şm=D424zfzd P6dw^ dSSrlhhLC/䡡OvuvZ(C:E]m]n[MM =rYC6H\ bfllzvF_oߞ={)v;N25T`kkLaAa^~>*h9윗^zVZRYXlkk޽--"4PB0[O:uXTmw8gf&vdgUUOMO8pDӉLJ*nw ߷e'<Ϝ|P/4+D[qQs~wdxvˆۻw'Q. hlȃp_ijjFQpZH ZdIGHG— ic{4M?^\ng@DgnC}Gy7Wp,ES" ݮ:H]Zz%EezYrH`\oPKj%&9^sN%Th*n.סZPe~v_߼us~A^N (Mݺɩao5ffNj*/r#Ç}c^^[j52ˢӵX<tcc߰~s^nlTkJ@_N2:ݴem]tػ;{w&#F0[sa6)okڵo 6ܹ{KkbA}ncǎ-y]*]'Oٸy{N^[A¹ W``}ݿqukVb//+ U UW|Goڴŝ191gQ]Uvtdn;OM‚f׎ÇR\v- Mj]>Xp@̐K `;z#u_m(6=g$л@D7]WD0*lj0:JLc*uL#bZmLk ՘BȌgb3 ̆b޸:(VD_TF'KZ-"7L}_]&suxx[n 50[sssP I ٬kW|>$h3Yٓy ;@|P{ƦJJKF}4peZZ[;fVׯ~32Ϝ>Gy79zyzG?>voy3 p4?/' w92rcs<=pѣ{0M|r8==O=l0)+-pa%E6sرɾ vh@=؏_Ջmlj,..cG'9֓G8px|jP?~{bwHEM-x&S_:~`ss@ ~_>ēG-++=̠{tNT hi c܆&T驩EtpV w p4I܆# #<6cJ%:I^>WZ$؛\tr),G"?X14~iKr5؊6"ÖH!Q&(X y*6/G`8W0,ן?M;Ua7k *NUbqŨ(_iT` J-AT}PY%{< m-={mni?2<:9> GADQM(+b!3F+TQKUVH 5$V\: FLb,&jԘk||.,,TTT\CQ⋿z㍷N74/,A+(,,).0Ux&UZ^' P')q?6F0!dxh'66<94>68t9V8OXz Р7٬P0jaRtիWcDB<֩Sg^zejje\X\\n||?tp@݉V2:vI$\؉Ô<4 NQAM/ɴƕJ~"i+ 89lRJa&Qb,hAZWI "b9z!Vq,zq=O<ѾCgڧF{ dDP[PŊ 8>8887;759VlΠQiqzh8x⭗ި]?~7:44 7m7`99O3W:;;o@3aڢ;_շo|6l>~DSS>潟;??Sw|?}}S%(E^7 Zc<O~_Ζ-GFgf懇GnџO|`x_+K/3ܜobrqhdLV*+?*^Q ,]UD#b\yBb$*ţ|'/).?=W_TWך Y7nu?zl=037=3>F5P ?ꏟ|ݹ}7(MYeqIY^N74յv'[M3Dա"(LV=;^S]p1N?K ?ӯ=Y]d28l>Y#?C[NLOG!qwfUӧ=/}v'?Ng#'&ںP4 Cs=լ @i|`@LJI4(04QBlN0Ĭ#%it >L`0<l v]a9QSkld7R$E5GSaYH*QGpb"f-!|>C,ט6Pz9:2S=tjPRKqQp9ѢR!EcGOګǎ|8 {j$dZDLO R,33d3Z&FIVܔΞ>}0// -pSN#&&+*sssQP\[x\97Nep04݋vINO?v'ؿ2]~MqIQm*Q?<<$eeefy>h,lfk[Q}CϮy{'ܺuU57pC}djz? /ԺKi5bKD4J@59wpIult 6%\,D*K7?kȐpQ!h雝2F-уjBLEt6krO2f-9sŧ>@__#-N2K!v7jL^F"JF塃id"F=E]RMo!4P Q9drxS%$83054EtqERrZG4$ -GaOL@]G(Σ/cO_WfA#YvZnR0 ,zCHMIDAT: H(SO=~8 Mlz>$KȈJHf?v>ffK$l8s*ce騱0Hڬ?{_wɩ`O(6AEFΠ1$EQ"-hDs?0>6􎍏6)@F>-tarIi|pHX [#Apoܗ~1`5<233aL39AH7]_ BPTzEgֿ ͏ GϪ= CqQuUmW XnU $QV,%πa:`5?~|޽G:91> 0*-twWVVfeg_lfvzxx0ga0Uf~~vxx7򫘒ׯPZVa`?ŢaEb2AL+Dy@ 77j@x'''FFPB!T}tś XQ 291135شgϞ_zI֭P\\yfXu`z}}H`fvjpp22Wfh5P5n q!$}٣-\kVȑ;2z$!$ih->HzS4lf;vljrv+}žA|$8|Hgg'8B"tp(gff< ج7r_ݻǏb#$-Xbn Px,XE`PK"9Q.9*j0}K:j zӟ_w܉%"/~G>zh{{EOqݡ`e㓯vSS`7]U+$Qo_ Zr'YetÙ6ѩxo}?ѷ}{{‚ex~z_\ݷ@>чfbx, !T\\5i lpa#?o|_77poٲ$HF5 eiSE 6\i|@׾NЅ@vF1qn(--u:,J{%0ta|),,t\05`SHFךAuUJcn{lia7emYWXНg[{dJJ< lv[~~"oMM'Oh N=3-h5ssO5YU[Zܜ|Q23aBҲbQNOvtt54:~Ȥ۝sM7oZg[&'zzGk++RghMyVh4UTTlڴD[-VCm`w:[&Vx@ϧiFF=>8?{]k%K-K)r9s 4С{jC>oxnսuCa(6,h߾ݙUѲ*Vx\0;e 4Pel.J`IAb_~JFذb Vel5lKCHZӑ56|h uSMǴlؒ.*ʚOHiH*J:)nf}뮢Ap۷ᷜ?>b24cuM'Dxg9KTWUZ%N:9I~v~W;t}''' $8OUUu~~Aggq>ƨoQ__VHmܲ-LmKŅ9y:o7ݾήmegN<},}Bjlt,6>41=.B?J[nn3=739B{^}*6.s=@olk-+. %tu3kW T*qp8"+rwwg"ڷo}o\,C]t@PkGoGhj.9;5r^-X wl Zuv ˶56' =mOM`'̌z,\%zK@}x7}T>@0@|ȡ vWrlEǂ(@C HX j(dBڈ)JiArxNDU>PUr3uZYMIF PáHnii+׮] m ۇs"uuy,]>IA3 ÕUyJ$%n`ڑj K,TJ< iZִaƜpnQqQmmMA~>JeҶLh6 JAUJKݼc-7 JA}hu%`"_qiqqbC444p ސGh%%W4UUUA$ m2(]v՚5kKr@v\f5,JỹqМ$ŁF ͤ9 [ZȒz߆|1sD[I`m0r*RʐXGEy%i RqN8111j `W֮5zE$԰T,_VP߉ϟigؼm+Lyy9 Y(e˖}c-++Wx~wlܸ=ܹs߾y˖ֶ֔\qH̩Sg{{!<B+>`LO8Ο; QEQ֭_u⢂gz۷# mmmǎ;tÇia҆X$jRм3ͧ:4oڼ[o)+/V16Z[;;u'9Ld"jOʧׄ K'Ϟ?wQЀ񦆆͛6  Gj~wܽnjTtw`qyeMUs8=ߧ'P+ECw%QڴO7pڵ-[ V3}DߊU+FϜ>rmsK6VUUu؉g[RIQ6_QD嵜k..+mV,_͡ڎ5hP,szzzldΝ;kjv3\@2{Lp䈿{?)l$6$QIqP'̌Ζēs=mr@x0Čd'J̦PA.hPjAJXe:j@ T]1mƾf<A ۦZB$iQaL5!)_ &XbEXiշ ZD$Һ* R`-zS}1/4*@NFDYĆM_푩,ZC6m%l P1;6ijl :7l` DJ0Ya%^j= 0M: Ո&!~U%eE0MS5x'PxP޲gwqWF$jj~ڇB7hQ*|ᇷtӚk|QPPiCW؛r'&c\' 7 'X#̥p!YASC6h>v [m.7n>611S[SX Gi=M86?Ph@KKKsrrQ0]qAA~0OǛ-++-uik+TQN144jJqQI0쀨EK*=>33CQ='fX^^]_GO_wpEY}C? ksC9{]}=[֮ ]VQQS $:z@niaHo{lʬ*)kj2m.YTRRQmfv_?iZYǔmttȧ@_Ilݘk9ӫ&F{,C()+BvH8qٲd2UWS,[ӏ>~,r¢₼|"om=q5i[4鮶 X^aqemCEI) 1"&m.KֵN8ٴz|1dIY"8O(,; E2' z5{ KqHKʚ*BEO;t06sn ptd$?/mXȦ̾ P^CM*-K[0ucv6n;JΓ+aN7Lbs(M&Pr "Œʪ9A\ ,iHy`,aW Xu0%&ۤ Hq=3r=~ <YTгu ̇J tMVJMQJ (iZ C~XLpbˤG R@B$%:sI(L0I_!C!K}9 a>3~Yl{aCy5-<ۺ@nBޞPwai7H$x-7_+Ep$+K4tꥃN͙e@~Jы_/T† ƦV@jl-eʖq )xÙ{A`-c3eM *pSEtbͪ#[tl@p&f>0ygL$ 4m-B0EQA4ڱ$,;z(n[5 Q1#;e^BPL+۠~PmAR&˝`zF1UIO/O~z͊[&-;IcE-+4)Ci#bJO>eou[EucbbPYaLLc eBlSpHh<(@i#Y聊ceۂv$FڿǧfO~3+jC9>bgñU iY%Փ!IPD$[lȕUC0kYn.9ߨi ' nn㧗mT}㛘 6 0θ}R={pH%qTZMtݒmO.peMX\@˧Oې<Yya3. UnFL'Rl|:99 WU4Gt3f:g.93&⺮CIgY&́K3s{+qq_d T?4h !_cec +A9 H?_$9@6į%1)-NZX .(]X '-ϚI0Ejl PT:3a %K""bG-|*7 d\гm.傧b cdP[E tU13؆䘠5eX&δGi9iJZkL "ADT"h_ *O(CXwt |3SYk fL~О]%-jI;ko2k^Rl̑ 2=0h+B$AY8 lI8kKR(n>^r˥k/3L>=qbO/L$ 厲BIpoCKlҩ/Q144op+#l"C&+53'\@٢h(i-=1v JR5f%F4gbrCyBjTWdXP +o$M/x7 z<]oפn%bv:?3}c- ט]wXIS4 áꊪkn);יּ{UwRy-k֗,)/ˋDsr9@ M:/+  +=]]%-voܛg6B`k{ 6? kE6E/;KF4{0 T&'cN5m(H[vVR8sTYU,xBOBt5fm8x`$GU +-ˋv}xP]MQvF#;:2?o-'~u7h:2ͻkjk{DjfȓcYC6tzsvpG6]H";QqH N0z(ˢs\~qBw.Ӵܸd{C"0U`Τِ+elm I>'UqÆM7V\?C4tMT(ڐ<] mYVAsPA2<;QԴ%v4zdy`-`v.SAH]om_S]TSeizNUU 4UƉʎ4;o~.Xx1ToJΛ̬+` 8*ul#? U4nP|l3T,B0GWZVO*3\x"6% JV٦5Gi;>QrQQ򀁉KX`LOX&}ҊgHl6KO̤d@,**EDCCZ(( IjX2Hn(&g2y(ֹȉ92g~B7*++Н7ӡ4>A]+m5i:(HBs ƽ5i.Ӻ>>v5i݋Fa^鎕Y͋BǠ5i^}[9^}ę/hpo ACý ͐W]RXTN6'Qa&fǧDJh BEPO&l)2rIA6ThnLOM MNN^7Z4+t&jtMXܺ21_LwӀaqoͺ sʶ33X2Dt3YlsZ2"H4hn4?/ T?Z83YX`EEEX&~* I   @t bhfZ~~AQaOw{sG֊ nBחb>~ޔ!:xgzr3kd/X-90ZБDTEġ)*[;( _|;6=UeѯI~Bкm XP4d$\eՂn JɂYfOVL&> \@"0-ŷ@z @5cp=Gt)2~ d㼢Vtk[.H+!1ԖmZiY8=ip"߮ Gd͸f}ZL$}J5bj:%ZrNKh阜TIqǚ4GJ>YP$hi T?2S%L*xcMq˫p0l|̰d:XlKO6G^s=!ʂBqifvpåLXxcSx &5܆r!%Ӎ,s{n .ĶpOMNӎ YA4Glɲ$TIdE%AEd]|*/_#v!pnp6c~.Bb+prAW2\#Xlo'Ǐ"Wqpw u!RW:$U*.߶aŧݽoZ%]b sJ:NféP/fG |?K.%խ9#zr0Li#T% Å7.Ć; /g"w\p*G~Z_6ù8&m%& -m:j uu^+i& ՆcZҒa6":w]3Ag]SMQiVM3)S߬ˁ0uwtg韏”v'N?F# 4Q~՘Mf *7CL8"rvb'cCBگb`qQ2^ ("$k]RJ_)KP>{#Y2q2L 5QPh2X š`xF1eS&NIͰ,œ]F_IzRE!@d4ft/¯[.876hсn C۝lb 12<259YXP(v'D?B2Ȯ2vYvaYNpR]FW܂з;~YQ[i䟝Yg n#}wa2 cfhZ~ 2s?{w'gp/%C{֪ Jג("'攞/|6mH !p7-ɢB=Kq҆`:ͱ 8;dn!}qrLy3mt? l+"&miX6z @PàTi^Xp3mq"!-"gAaTװd&3\Q́ {rb' dXfho|:!Iٯ{`3pQ< 1H*S*a~T:k]A@#OH,-B7Pdbg>m_(~m"פp\Y\T~˲Oo_v%4FK\:[|G>a 5Zy9y>'LIcݫˊ+kXp,5[d2q#ǂ< ?*=QjqPjѼ>x輦2eņW3 ǯ؁xЁD_QhFFt4 z]hvV %*gUM}!bۋ$fsǩKpÍ4|)E$-|__?}k_?7{3gNǦg~N89:2j&_(H%ϝ=ceVE,`\T*Քe}---SS¦kt:} DekUK?D$.\k*̥2IXn;\T׵>J涎mm}c#i;wӣ#=c}SC1s&Op|pbnT ѐ#-gΞ82u|ž\MvcPc=nKCWމeĻ*+֮]WRReQAD˲C [,G&ݥ#LB=p}rd6P K NOb) GKZn sP8/Lx"1373z4ѶM ڢȶmt<]'"mmmswI t2ĥ,64tF`8-!i]|J|*SF:mC'p E_O9?BA۲L!*tCGmvsIqI8DGՔ2ph1үJ^^X]]O?[om>u*17 ssΞ ˗5'N.K dQ 'Cû_c׮W=6::dI}uuuK}{! ='>߅sO8H.\8s% HJ)>f:K:sٿ3gPM櫯wޞ^?F2ьJ5[v*\G9(iTUV*҇;*gӶiF-7t#~W8i#t!^$\4ѧ ~mhfR6TB I5.*L?ʏUVU .*,B@ N݋㍋<ك19=1i8 E2Nm, 4Tp(TS]˹Dkk Ͽ֑NGGG;z4J i@L^O8#;!JPpBÃO?̮]M$斳gm2;O|gggN?}S}oyc'ٖwG~Tg9t]^zq]{{{c}q1.`a& 4U8 `'A#%55Ղhu ([c 63 r-;ot-nyն́₤8̖8}a_?\iob<\L. Lu-a`뵨 *l0666`Y I^#-lBOYҒ-Y)LDi&| 㰗EUe0E͍HHh)s3Or-̯~K_;Jd~TD% Ѽ8HSϜ>sfҦ>ysOAA!2h }s:&8 3;th}pG>/}K_bmM ' o/g-oRUy_:Y'k F& htޱcb$(]QbԖl:]R 7.)-)-,ˋD9y7]!6T=x5L@ P\\ ړNgff$h y6]4S*,T83gS,[nFL, Pa/ Z -ݮZu: 'f*F>…~䫠lMSt*OyM򢹪Js*͉lܴt՛6o**.5x 7ݴuueezrUU҆ڱt*;nΡᡂBH 891K LOCp8GQi9ҩ<![d, בTG( uJs\{UT\W Cakyy5uU+kVԯmXVհ$T5Df>C<֩i~Z9~vFGF@ 11Z4/|_{:txxhm"`:y.??2A0 }jb̋+O%M!.?Qˋ BeӲBi pxC6:XPT377+ۿ??~;v옦+w}҆g{^x#HYi/ LQNK!I,d.$NXTV旮B%u(Ҥ&lY+ į5DE@a_ )SlsѲZ˗ 2ӈm"Qg`  ^C>ζʪ ӧN}K_oo߾}>??XlSO=Ҽm~Ei4F1cXnl5W+ Dˆ\B8**!!s|bSlؚ %0S Ueor:N =xM+{Gf/П'p*//D#ͦq/6ݻ{_xɧǞxG{~ч~ȃ=gx'904+Vn R,0miDk=|bOO%P/[;Ըv%u,CP_VV+b2 ƣ<F%h8lA%͆Ep| •5O+?G>+mХF% BȧT,.-%vQGZe&Ơ? r "{28C)***,,,/+'#KЍhVGl:iK74{A˺ag`qp=SsIfgggf KKŞ-fPgR(Qf)>b;ȱÇ~7unm۶¡H pDǧɶe<ַ{{駟oˋ|e(6loc<|tlrIiC`nM[~SO>/~بi,pXrl^$0R`5T}V.-E͈ɫoiGyG?ѣ=}{gڻ[o{?CaPiIITXzxu.ПlGbܝix[MQMEHr*QoPU j%A\l>EpS$8 QԠ~U5;fk5ƀg߇UUgU͗6@ M:\[[]0ױD 444 68h2I$:QzzE߷Q55974::6E6- 2d"H bSeTVUG"y=Wl50 ~D=tpg{~;?Ol޲PQš˚e_w^XEE?WTT-mhؿt0Ly3,E D *++?::aڦƆhtjjbrb|5JP;:;dUZjEIi@Jfn}gÒHh~8|p{G{EeM7mDr{zSN&gԯXSo\{'XW/]g-8g ʊbg¶@靴@rLDk$k  & ;2wI~Kr)= %9qjpfBu hq?ctm 6׫?mtvP ?}߆Z7]p@OT?86<>>1 mPƧcႼΝTY8>R%=}/lX,؁QT=wafn.m麙B{-菆"1##B7ߴuMWoBmg(1(RdG;Hdn pl'LCAXSi؎ 5P4bGuRUR;*J on`У*" @iAP6B{3@0φsPW!i ޏbxd"!7z3Sv p' Hpvnc& P/p1+tn?7N^md;m#'P/R[VF {nD3gDD\nsC#6tk@5M Cyyyтpa~NAAn^A4 RP-,+..(-.*-QPVXXRP i] qJ T(vZǁ'k z3Qd6{AdgV9({ L O* >D`CB "4zAaRp\DTj33jhҀ,>@m W*=/p-.6T!RUYYZR ** ۤ ȳ<7/y{.6&2NjoH%P^W7…^{ FbX % (ؠC5lYr+8hT%x#z*[E L(hIJ(Khn7KfXχ2 3%R$))"28 Ĉ2>%Ʊa 3M!,Cb1ВlQz4g&>"Ͼ< ٶ '6hmhу@5 Ί.jZbEn$d!f%T%U쒬 8@4GUG$,Jȣ'IqaANa$A$i'Y7`<+j p@tAlͷ03~N`C~(AFW!$ A%4ȑH 4AިА^!iY,)iH0t{^bkl/Z=x7$MՒd*T&M W^8n<K3hƝA$ё LH2|O5` $Y"D[hi֙fklO_4E?%AHM8"!0>-CSH. HSX8sٞQd8 DWX#Iq-ٙ8 ;<(BApK]F2P$c5!3#_ J&Scr0 (,!-(貘`JC&?pd3$3GJ YSܬpmB?~yMδs*^_^v ٮ9)R#:%%++Ydyĝnii? Z+[]eLMEn߹&E3{z#rdX 6cc?v~ѓ颦 -*e%Hwekoj mZduCeA'hK -j^k-2M t]QR (8KtuRZ2€!do4e%s~I $_2[lxVosje kz۝na꺾۝`q@~~1[9Li=MkԩSK. BowPt P" !f?B]1u}|lY\¶닸 s%]J,ێEQO8dRRip&d. BXn}:x334@k <2* p7*Tm]>:0jΚ2~363b " Z Zvl7/KW3o/>;Kۺ1e"tT/ٰNXpW~0^ c wXql7\2Ad4!ےM)2 xKz=Qȕd0u.|0$d=P\~*3xR&"s?s k<TU:z_$pnd'x6K:_%KDIR0`o":*hpfs8a/p'K$e;NLPE˖L[2l3#(^@=E4AYN7N2):oM}iٞ1Üs-ӑOIYU(?$L޿vI&xx''9r.J"Q%[VU} 6E!&۱uRO+JS 20-YY"Ӛ8۠ATJL^G>QIUӦ-qL4nhOSL$Q(pɶFTQ28Mw,&dN b/T”dHN%9Ȉc;}o?zjpt \u! (mꐘjn@X*jHǀIP&2L~E&7.(23@cCdDKS^eŘ]a(8sJu5|b::>==jz'4@\ XiX`%AS:Tooh{{ڹHwwOֶѹ#!ڶ?K]ݧN<{\{{6Һ[hljftdBkf=mS;::::Ν;9::F>t}jr U ;:iinfFGΟop5Fq v=E噹x /H!8]3$H7iTzF7c1LɸǞIۈV\0gDU`PSAohg"Q4!tuw>ݲ~֊@'+rCቱTԍ}Nk!γأq//|}O8L"hN8 +M @cx\Xv2K2ID(hʃ@٢MڙE^/9sX1.Ѱe#WkJ޹%n<:_́o(..uȁ.Ws]wv^yʺ幑<'=k{rK00˹]ntwOgIiiFRmܸ! ,$1My=0=r_>tU9zDVV[xzbd*۰okX31ȃ(H~]w}s?o^b.3ܾuk]ueo߳<uA{-95/>TrUVwuu#-[׬Y[[[WQ^3A3e:7w\XWny%m03|N\,#Ҙ=xûC562qvx.!~#|#;w}sρ~ͫVDb?xI]|hzUߢwӢc̤C5YKqmC "{?;lLtaJKT.P?)>Ɖ ba%Q,DK"9J+jN*+,)+kljڼyKqq XSO76.e۶z__]aᣱ8TxYQ>jÆo!'&h$yˆ}ߴ,Qٹ#G45-Aa,nfT; ;9r]0DڲeӇ>|-ZPT Yp[nYY[iaOffgSn4Xܲ&_WZ։Ҫ'VXZRUYOYnl߾cnnlL(/+WYugQQqiIɦM֬YFhU-tz9Uw7/,wV<*{p;Erx>>k׮;oEE` !j$hpIJ"z m jJgjt5vԙ3gϚ]}=4hJHIx$6%Bݷl"$J;b*F>Q!K.=rzpoRi`,XUQ+*FF' TBh1P2cfzCO<O< O;ftlTOۡPd-&uvvO,]稪B̆ EL&'N!`0аsիWO"1aqA|etc$tR\ډ'DR5 ;1;>99;3?$ǓtZ1 Ѳ)*'~"IKd&9Q mEUU}_z֙x=o> 3`i~E8D4/Њ#!Ο?ݓs6mg>{ﬨ($+֮]}|LS !O򓟬(G|d*~9'`&TRO$^xE?}泟ٶmhn(7L#C㛠Ѽڏ Td\$ٛ TU B._r͚cav?0`Y&U*ڃkEe({}m@8TU5"!zÚ&MgT3=b`iQDa`g.=@$`;!f#,ufus~X$ܐz6. r3 S{p%\t 6Eg[ ]n%JwV92+4SR6UUG{gժU 3^^/8FNM t>><<2ϧZ{߾}{W!d*9󩢢>_owGky{zQ+Ikww[oٿ??ٵ k(Ϝkiu)䱹3zm󭭆6 g*#ԙ;22:{`2.| o84I(3G}__ͷoN$ 9YK"u,#'2+"2"F9% #M>ԏ`iY xjO&VqL HuI1s@=7D%eœUCPeG xEgwǡCG{N:u߿iۛV.i.Yqlgys3gZظqeMwE7>z\"a?pOQac̜8q:[$?6555=|ʺ%ૻ^]jMk*@ #?$Cd2}-禦Ѽܪ++kl-ϧ#MW,[Rӧ(UV= 6k>th_lr|-켫Я "uu$g碹9ՕHn{gS'N:ri%y*S]vy߷a˖Gc۶@6W\XvδYoO0QMwb 6H$*`Sݾp8Z@@П_ hi!,~h !Rd4"C,mf,m9i4iC*(P擄fܛ pfk'`>il 3pFnZ]@I$ w i8}||``P:{hߦa( }@j ;wPBnrTVbY ̶ݝ|0٢$}LǶTi 9[0xOGɳmGq6SsqG7,Ik`r !`5M"8%R=Z#c.)Z$6(AIIiA^TWMNtuVVjf'zbIUG"9?z'[ !;V!iy%5ϘjkPҒON&`HƣyT%ΫK5k-DGf y-LNMCee#c%őP(Ս FQqK+ɘ*i"'tyEi|rNm}@i}6?'\UY LOcko eHĴ񱄞 0 uwtyHhSssPQn%27(ˌ8l#?F޶['lm麑T*#lzӚ5kBhQh|F=߱u]5m㧀>ٰP_󪕛Czc/{՚Ľ55h hK$;wIۢ' [" i iY nJ8{쮻^~}ii)<;!kh(e#,:F7vp )h}us#q Q "-}+k̋(GQC(7t׊0CPy 6Vz1n#HΔhP4P;eT|06ھov;&tP;q-RUyjAm^Yeq5@HqDST"e;e$I-tlZ ,G lTulvH3mRZehM-Nw{#>>++5UG`ڪ:1>&(:BU%!bCi2?vb|sU+!(l3 ^r FE(4= m MoيB+Gt2u%v A d5<4,食TYMi0HŋDL o Y o٦C Ai8DPZ"JդɊc:(+te͚kVvHn4).s n\+1LiY&EXo56.Au̅o~ߋ?|99ɉIW\\ yM传NNM& s~^^]]Ht\Z. ۄBʊ=fmK{{?a@dggW~~>l?ˀh8\_,S'rg5k]$*6Uo[u˪[ Ŗa99!P &( =Ҷl_YMd2BeF r?+W4D#ȩZCV J:MPiu?,93G򾭛o^)V4p-D@Kz8z.b(C1F  L UT<U E⥨d|sfuEy,z<8OTZ5$bF,JJST4*YFR;O!ib)J:6.,; صY}ͥk҈糰&&mQhFB n?ssӯrEymÒƢl;?K޽[|xW</~w׮W{_~PNo7G}^z7A]JKKO<{^x᥃uw##:}tEEeEEy,A{ 1 x~agzp`vIpԛw}M0?n(íX@f2Fj @2So!5ށf݅\;d_5&+Ĕ5UmxزHtY4 FXP@("6-ab* iIѬW=&MR)頦 B?tq $21-0t q Z(Cg >TvǴTz4-IQ|~?ՈmK erRc6("$5t7>P"R]yHv۝baERnI%Rd&x2P`lEh&X#:Z>ds &64h*юҊ*CaCl1tA(@a){ҹrZgL 䩺]`إ*`q|S,"<<;s;Jjq҆ f3S}}C=ybS()+~MΟ/6[v뫩WU}{>|;naAW;v8qܼu~K_ؼy}K7m^->=>3?DJJH\=x{̽27^):.jfh_ AU(=e%@]mM4+J\&}&kp3Kj;ӆ!(?.\neAVR.h DsC+Iyk -9u\A GsB>b ]q.*)Q&t@SCRtQRI_p"󕕗"H3)S,D:(#.'Ulaaun+`nhۓx CnpHO!_%_=$IiDH$Z\^ZQEsJxQb#& Q5I)/$~pMat_pI̖ġ= P?0WΞyJE"`q---ť%OE!p/C jhJ"ڳǟx'~{{?xcmwl_759L;7m7oo;wn`r~7y˲+liN. G?7m޸eˆT"zBUUё#ZΜߺi, 33-/*,(-нm޸2]a[-HyUQ׏o|S}mYqie˃|m#)`䷆;/?v%Lwu~:1MAGcXaQOc{;AnjY }HH=xX .Lm,ÄRD)ӊ.h`@!5>o900Tfw½lκ XĶ.6 5tmPEr*6oSj?XЊ6~0)\(@_R a)螆uB,u6RvD^Fɲ* 86T~kߴmkYYrqS6O(6vJodIbÒwyϽw%$ ?X/@8I~FWa kQeF|7^vM[RH< 7aZxc>R80s( ̜\,H^䍎"+ qqlb=4=5ӕ"2тRhYyD,6豇i/Apvv4~׿=2<J $mi* V?}QWVՅC!3LtA٢fْ bۊHVZ0;%ɖ$>RAC\ju8#g+>[!}LE0$CuA5EٔE8mGVn:J~:NHM!ˤ'vիwh [gɲPnlS7Ӹ.șg 2BM"@_eCeLNN}}cЇڼmKiu t 6JJUE`'‚Y}>-45LCiyyѼ7m};~'v7 T )DJQ~k|jh&^1 zLMt<@k-um˖-6XPe$+4 8 9 kJ%>VI6`4C@ %3ߠ p#Ђ.(h*͢[1R }AyHnXymg!B{j7ƫGXPv2%zavǎEHKƮ.|e\q=A)\TW8|5pPhL\zp0W/`ua!Kīsssgff- ˰l' 5M-(}*릾| ۱6wuui>ܽ{7 J( ݚJΦSk婧JD EV/W C"ީAnH]+vɍg{4ɵJdNWFr|Tt&ؖ66hʒbM1_w4^u>i()&ƥM5u90EYJ ̩//ϧX>7MA;~_]vM$uORM+Wk>U+koXTT2HV|VSS_MyUyhDIeU׮XP֍tKKmwܵ~‚bV4.Ij ?4^%"edY+?S|~嚦hhrM(,x4|&mþovYw paL$QJNMw]]]MM۝:9ُv.APzHMʜ=xhh>>>J$}$\ew=&|Zaq 2?X123LHf$&@KBXKHtz(aš4R@ZKq+.vJsbǜ>'-f~v,}~,uv vah:)lYwp"|AQ|Ca#Frؙt`&L113(E &dgn3f \yM^3HjͮHƜ6T\*&5V,H 'gaaɌK)~ P~ɆIq?]eS`m8gqQIgyig7i* eQB s1Sk Dp-iD)*1' -}OSaI` ?5JBqnȨ2}[Jv{x_UUSYX͋2]CC1~FtrA49K_VGz]^K&ӤercZ"m5hLj)d b;$AZ<p`^ay}cյլZWrM58W,_[ڴi]qӚ5kWGքjV֭ʩ^nJ"&W _*RҒ6}'1zC-*5jӸTL6LNaJ(N3BRnȒuU% Lƪ q UFFFO922:RDh E`JhZN\r₄'+L0Y`"#KGaYA), #8ܸ2_yd$5`#$ EaH0)JJ1ЙeM$('uoV&_\~mh"^M{'5u|Ve "1>5%s<"/a)P$$LrD*,- /uvtkZ guz,oM<ћp8ؘL6ˁ5y3`Q;bM]_eM>)J},J6Ptɬq&C֒H#"EDczu1\T**;K[lYYU[UMY6%e]ӎ%,IRm(3A'4%{fp,li9[ggƣtV884|N:|8J4'"YH32e ,סE ]6Sy̴jCm($_!BÌ #CaENoos=c5D"i)`&jg:x#'OښL$ j+23FCQ̄?vD, bEHHљ{7N:uĉ3g& BI(={4SDfLD)Q4aӧ{H"REQbH(Cmx ~KïhSSSzuٲ ED2_ &,k,qK9.ɖkKCSH$RYU]VV 9QYH dK6=Ma[#QmF;m@2*l<1,3\d,nds,$`!FP+;<ѷ;k0l&JϰIO^17n<@ٺÆZM/8H[|D;@]IwuTLv`-[\"i e?5'E#N 9~???7t傪҂Y 1==sށ@ tM9iliՌ(ק |T"1Ӫ``E dR'jkmYzueeā{{zGGx(gOz_|뭷yͮ>-HEW09R@.s (ON<422:=7 "0k̳YU'!^{衇vڵgϞW_}{{d(H㓭mzZ'FԑB2h`X 1\`'$n=;Jm|gV#vP"1'x<9t2juMqærg(J ŴUUCbƒ "h!|3NJ&X($ r"%'O QCɰ\jufb 6); n@l/z+"!RírGfǺLnLH8$^FceSOرcppf||;iiCOϥl<=H$iSƜ-KVI`,hFAEl ˶gNM׭x%Ks#o1224󊊪}ٹY7db}O<#<˯B3|Z[[y2&&&_||绯ʮ]ӇB @P/~?77N]]=C=Ͽ+@o_Лoe#G6Pp8bט9}^C¢Xl}U5uD…'H?wr]]]=GɲbO=uH]&NA 0[ FE;!CΟ?oZFVz2M ,ht>~^0'%h.$dNB3em{ K0Jpg+.,^ YJ[|4D"2x4x\cg}X.ۜ8q$J@wBwJ4} &:rOmP>%S!(|l H#[B0Dʘ2a>9Cq4()M!3Gd{ڱ;-ԝ,:@4|>M["Й3'' mcccMMe>t,cvjs-ĭo}{?7ݴ}Hhkۅ_xp6?#VW`~=ow[nu՚uo|[\|߾j7z>ӟnܴ~w.Ybٺ ~( ӽzB  n_}=nllljZS'ù7mݸ~}@=otQ9q~hP|nultD2{^zII@ҥuh&E+Ib[ںjͧMMO =J\ k_+#$Tlfz߁w7ZEK/8}&2s!@.Ŧ&{zJ+w|K]]큃:ىe;[o'e`Mf26uHH4*as ˟Žr:N07fpԼLȃ ;"af.+/;U8 W))dNE>6]mD&}\YÃmٺ}Ӗ+V.999e}yy%7n_auccT|§˫j* J&uIS'O:uz||rxdgph2SR\"Vm] WMG #yVBvܺcUVWoڴ5>s豓׬v I5.m(((@WTpGJ9M!VsKs2. V4ۼeڵ`sLsCR0m۶tV6_~rᮎsgϯܰ$7\а|KT]hoy M /rQQ 6/x`poV,_:HVdӯgʕi\bEQQ1={Pn\'D۬pOT1 H~M1K5|(/dpCg/nlT='{gK [HHb9YI$`Ե`g͙3)bd /:yX&e_+| /؋p)+y& 8~V.+|MFg~1_ )E4h +-2^:*3np"b.ف- ~wV̛wag>oC[T. 8CñBG6p5x6! 8iYD`6=ōiYhn26hbWGw{{{0A3Ep,)(۹6bpb(B/㫊!Js=WڲOZj'SDbXg[U(ϯfsm7UTm]RPVn:A$7fT_UAN~բR?,t'ύ'UWݺm#ۇnkΟ_~7=_x??XZSZS^}ёg/o>\ye)L1"wmXV ljt,};;:oUVlٲihtl+_jQa>p׺uVxODSC%K}~k'~rٲ5e4QUGl|wfffXr ړm7t8ÏxʼPg_u6v[֬KQqW_۷wqi^^"9hKJy ӿϯX\4!a9nhFyQ"2L7M7.td P|tQƌLѲ&Kp,?|){thf˞~6\4WgJQ_ "9֕d. x,ǕRlJ`~6J7r59+xlƯ26w`W@s+( B)l(+DN]d"&س7ĉ]]]->G+@p4HВ{w0N<\jЎD"᰽jFm3~X"WH4G-sstZG, ^6}SDSh74'|bSR.G<>l#sf*"mɹY0EYiZvqgFw,YmuVa$˶ AKfZ3m??즛~Ng~o}K_\R]Ϝ=X۟שּׁ<~'?uݲpfۺ>+ڂXWkVnܾcBI}㥥{QAJ|{ߵ|WoX/w/~j._YJVB; ~:λVYLMں%;m i7=;)*=rk|;n߱~S~SojHmewݱbow~i }}:ϰ8m!@{ONN3k׮dzYE{+^~#{{z>ɏm;ȏ|𩧞Jo#H~~>}o۶mp??rW?sQ]yiO~V۲aUq$WTز<~SqI<{5z47ŗv+}vf(q[7wmMӶtso#~),xx2\a4(Eaq7,Ngd7OJ st"m+}iD eŸ|9_gĸ_̗)^5 Jl${WrYk5w]3~b H4/v|R`c1h4gggu=US[`dTzFL6+P>܆WaRB[K *9)}M[jvzWHRA'>17?=k4;lmftbzh|zp,9:w. ~m+&08?O@V hXI;ċ/x᥍KiU*Ҵh$Pm1$܈qhAЦڳ"\UӠBHn՚L& C$޳wpNzAAz׾O~AI)MIhD"h7HW@ ,e:6pDFl(dkd@0fsc߇ Uη{>=ׇhl3&&bɔ,j T šZ( Cd5~mTeee}}*yf#|O|mmO>=EӘ(1ӋÚ'o_w;Jː5!֮]WZZ1>>WQQbنhc/Ehmk77g*gew;Iw>&D+45rWeZmp- ~4 ={a`鰓M rzJo>K e\a͍΄$Uh+o]K-W!MuZkC%ˤHf0EikV=go#^  MUE'!׮ Ç'bc#`ID\,Ȏ_^fhpԩ]]]ЕpYYB(ظqCEEE,6ʓ'www67Mzko%UU:;Pm_l(@Jipg%ԩ3IZrFFAΜ>3FhOtr.''%%ET:H ؜卽==T,>0 DO۫slj*joo8شl.T*Dgfgf zKii ra8UwwWGG3ޒ#SҦ`PT6?vБ_~̙իܶ6h;|qƦիW] .z W,[}7C)׍DKK떖s}dܜB=udsssOOϱ'^~շ]a5xc}G ] 7z::7:>v;+J'''nڼ%??nI#.?ҲX,V_Ҽ"~s㓧O~]{|iYӭݺ) 9259fh4G?o{PMMMtɓ###ǏصkM7ݴ~Ң0.ٸ0/F>G&'N@j6~ꩧoyK p HQA6]_|JʊVt=0FܵB]m'pGrs0J;F$3)J"%{lْĝٙMo}' g3$'ٲ(*0G0$D΍svhHIH V:unݺ1#T讶@\ = fi+D`-*D*@03 Z02TAgRk1JgTj38{~ cfA3 ,%| ,YPfA͞ sf럫F!UL|P5{&$<RWczf591a.2 BN9Iq' sj@6hΩ\FnBC.K@o$IzݘqACHe]8һLh>m'lKGMVG,#<..\p-~[ ڱЯ A2Wu9Bm.KFI4&x{h|$em(V4JRa%> piqeaqX;7"E/B]r</((,,VYUPq4nO}Ccϫ۔U5u˗4Y業eQزjuT80 ں ;놭[@}``o1LT+WW]PdI'F|۷r뭷WTV) UW8NP\죋0H'<))&Y\5. υJsa4υh[g6Լ=0J% EQP,xfrSI*ynǧm 'XtweK@nAWs} 'E Yꤤ&OttG u97\BKO~FKH|zyKwp!O$zI,+\L`D#KI9$dYJꌰSA'@7dΨ%d^P1'#Z Z Nf4qd1)H 'qEtyキEEXgYʂNޠ"cHPkR%! xZg&2>95,*rw1O(i,hd*XݖybA]=T]F"yv8<9;DLJPLYL# MϜbvHdC0< ] +9SK/-i?$ںZZZ%.<)0.0%hq惇갎#>+$I䃢PMƂSFb"Hgؠi?XN DxbN.3tZ=GibINfzQ6=5^Jq3 &7 (.l%u1t2h!jK TjO<*  Pz*I?z}̀*@A;]-"EW@UaP?h2*:~b#)3DdJ IC'`$Y .z"ef|jfAV<jM^hZLyfτD@-?7TPfA͞2WULyPfA,yyv,|%!@Ybæ@ V ?x΂ŵ18Ǖ2j,51,/t b'-Fj*8+  ZX~]5}$ VFq7dg/.P]"x<O*t(HŢ(VA 6PK6 #^(G"$h6. y/p [7~Gijjb ^bpsСK"Vq4 u{rr2Uh0 A'Lf:&&٭D"~}}cccniplJP5zX@H<=Iғ^Muq!jmZ϶Be=z.BjQE,/v@` l@GW\<>dvf$].Wyyuq$(P<"D2#+"A*O8@2CK n)ONJJcCZPp4L0`kz$~$}N!CRpN`6.HzIϖ񁛮ja n!N7# B &7jKF(b4 iPFC]oΊK 6P$&RLV"Fe-ǯ$#]6y\c6a >ߚFa7~ّ#8XcO'$qǂ:N[vE3HXB2 bjqL;ƠKZ1 rlIPC\UР` hA$$ T!UK9AMd$4 OBa jtNcNJA.Nx"W)Eɜf2I,SY0w ~v ]z{ݺuΊ:9}X$/._>}Š㮻nrcJ:w9z;0ꍻex;p fń>ޅK4\ @TUF?bGcݙK؃ln3Ќ^y|^SR%CCƊ^gi~}$,J4Yq$d<؛h(k@!P'$" ې.p$hL5%$c@sFT?KPL|aYzA$u2oΐϯ"$a Fei#ݺ ~Ngz[tZn4oE*GBXn4[Ԏ(?~lq6|F Tֆ ^cnC@DۘLLm IvP TVO5<Ƚ6n*X%(`dhp<J{>CwuUYQ}eEm}45?xr9EoZth+.\ӺT=lomey,?yc8\z]s)*)@ jln ʋJ~ׯ_ؼݝ?x'?NjOTc;ٽwڵwムպqFlB]tT{uuuUU={F??44XQVZWS  yͷvsnx>Jm0Щysz?wjN,@0q*%Y"EԽY`?abE#|0L&X fV#E_ 0cuQF3DfWP8i$"Hq`7ގ'r*3O_)h2)F-c@XX\7ݼ[|{붻ns;[ncɍ/zg덷5nVn[ݚ[*[7W|͎|,AY3:gNުg 2E3Myb LW"E 9]A9ri4Д.p dڬ)CV@"U@'QS*{m2a-hd[ 3EoD)9y>LhFB6pr.ZEdTm^Sx #Kj4["nB #z3F1z OG|>v&9iY 9#h4 3Ha.Z3hFBMP)t"&ŻZQ^VM`D\Bg2d2?qȔ$l;lfL pV+:<_ܽ{'Oqmm`cFB0R)VOcPUx /_:kV)tuwn?]^Zt8O<*.Y?яoҽaF)!G1 7믿SO'?T%ѽK(l`+**r~ٟ?oo~w˽Ñ0 v,m9G##'<#SLG@yy͛o˗crD A<}Y,P\:<)f`dT9Jv(i"Dg5Fk&{RlnꔬnL U29e=3%Y&=i0IaRcnɩљzsRk$C=_t ¿ oS\,025D\ ŵ9K,W 6: EL]tF,K) VpXw黿'NB}B )p rRScS@<̆n*/*#T:Rl'&&7;@oX,7T؞xrr7H46b1Hl0@&&pQh2ŧMΩ[N%S=~sj*FT4m.H1dRHiO$•  i6k 4b I7`?VPF?hm}}QrGcpl)LNK'O޽ԩD p8!@o\NxXeee7urr2(fv V=a|l||l, ?L'C`h 6 hK]mm 'ڎ^~&'~>0( Ѐ>ct%JSƎvcTy\3LϨy|b8NLk3bRY*mLgpT[0(ُγbQ8 9FXUњ,p?Oh!qpA רquVv* _W4"zN;9zIrر#O|V  :mGGn̗a]8(xU[y<`W^yBD}C̫t+.+?~}^xdA+=8#|wQ٘h w,QWC~' Fbu8p|M5C\"alH47ܳ=s/<}2-oc1[n =C[ceAȇ/54.z]n-GkTnI*ƀDqw fs tCL5sov}]]Ks3]>+MT{q{ޏsX<44 }r|YYyee :taDؿgϾ{OζǵKSc6UTk {uԩ{wtx lXpb;ysuMH<7mĩSGڎjh 4䳆EgqD7ʙ[*0 L"l~r7Er`,@@fr_X Kgbu/64Vt$OZWqAuڱRQNKF66#^Mi 'M*|ZN%5G">H!\4rLc&%>];QW./ONE4`8&Gh>Z( l9vl%9]/KJK =njgrr/'ʒ˫**xBNVl  PSgJE*haB^}vSoPnﹻSO?^g>r>{?``pb׮v;sHpj?^8=j"YS]Sq'b2ȸr%+Νk׮_|yCC=㮮 ,(ѳd6b(Ĕ9 ZBwu V>P5C EDJB6~n'-X4k׮cGްe {: Hq=^EΩj>jidsPo0UդN DU]SEEEK]So^nCiEMqad.Cɢe0xbt$mشbYksCjw:]ZjUv͠7^WPPR\\YUI-0p\ׯonAx,f5[Z-+-)q9˗p:S@0ljn^|YYY 68=D|`>h$j[ 4775ԣvEV[(p`Ea0Pvi.w_f8B,T636oqD\[<'c-ڄEЬb9a(#qIKR8qQ  LNߓF'0Rs< t4$&K ({`JQNKc5hdž'N@z$ƎGAoIR|jdǎpPr3݆][[GJU]Ih&MBb?IYqWB3?O|J%M./ 575iKF=GM}g埊wޱ}uM$3v\/~6>ůl\%'dҠO*tFGlЛ XKl@v9ndڄQF;B2(ǀ Ì&}לlH`c+  Z`,m?ymnjn+wӠEJ?y{1z=_ZAľ>v_M[&^3KeYcY`=߸zG\*!uJ,d/uٲV:.}oέ7RF_RX' 7ݮ4ۯVT{:-\c=$=|$'mR^-Ҁ60%&(hdxp;?Yj N|%>I '} 5[, aL#Fd@c+@ TIFGoaؠ^heמm\1w,1FdH.ь&8aFsj3Sa,y* 0㐵hQkhF6Z|,Isn۱@qT]`A; @qHY)\-|F X=11kv;2. d Q3#bgDcY5.vu/iiq:fLT0E`$8`)POy1."h8GAdP%0:<~ӹB;K惇355%{`Q+R4 @ 6=iD:-Nw\?ڝV3NcGOG@%^k O pb'ip)1ePHO54+E=2>nӱbeZ٭vwuU`p@(^䱛,fxҽ}'N?yԹ3ȔDCm'69{.^>xٳ/\ٜ/?|3g._ ns`v@Ξn? E-f;:drrb={b灃{oX4 uJ׫G`OK"-?{ؤYZ̙C'O:ydَ1h/O'ۏoooB+:CGlP,yX۩S'.] pyMx"߁H(rҒR:3v#f#:.:t޾> pGGG.^왜9v3gS~f_Ǐ\isEYI =qS. ێN Vͪ%ڎ7тLj ]4>{ݻ |+VVVU1ӀIpSޥ]62QG#bIac hy9Y] 4hNg7XQ7^jBwPMq:A+`:=$g6?ȃ҂^A4x ti4f`; r|6:}(b\!}C7a87#Ƙzo]cӘ^R]wa.,PGDg,FNaԜV1$NmI.s&΅RT嵀.H[0/Wg9 \@,yWQzV+**-p83~gw?5S'=~2Fsx;8ylhχ7C">_!Fǟ{cǎvwwZֲh4_zwΝ@.] cn'c!8iѨʪoT88b'4&ϴlZu‚ᇻB3gO:91(Zݞ^zp3\VZ=?O[ZڎPvӄK&=؊嫊15tP G*>`ѣj* NjꩧڎSW 9N~_pqмFrm;Ξ9y` ՗_9`҅#W_{z>ln*ڤ.kStmʕezQV@4"Ibt*{bn "R]ci^u̓Ot ̇Ķ_K jhi}? CEBRI FMy(H.AL˧"h*B 'L#{+mU4ǜى)`UcZ \ܞ ̬7 nAvd͜ LV֨gsm٠ޘB4Czaf,7r ]lY5@oVZfue&W=i׎h4ChO|&')pI.*#lHsԠU=h\N(]#ѐޠ5 DJHjX ÑH4re+JKJV1t^{ '>Mɟ ovû﹯k_+zmۿ)++ݻw_΋{<299uǝwG+=z{gUu7oooC\)(({V^qGyt۶nk~tR˅#LpXٳ/ғO>#mEEws_//uN|՞ 8}"8{k))}<իx uSLfPdZ}.HNxw'&&}kV*,,D# vwJKK8 @5`HQolhxkw=@,s?5~˗zAG% TYP+@ N>SZV.i,#OO_ Ojv(nDE\!"U&Q9i'$B?*927.ʪ/Kf׫(GQ.Q5*ՈKcj}&ԜP2 HP*E L\6P5fĂsAU4 jXeX}4KgZsns`ASsbFG CX, _OK~){yTn=:B)DRt"#ΏHHb $Ftrpd1S }Ӄ'LM;Ο=p鮩3|&) Zz+$KFx۱3gmqۆ-[ڲ|ykIe[޴y3'ʶx5k+׭_{- _V`S&)G޸qˊ7o|]wL=x z (PEII>_!52|uuŘUVn߾{;ڷo_ N__[ͧO>/q'_D"`v755UWWu:OhBȱc'%Yr֕+W657[eIW`aې+mG㈦~=d<>FPhJ"{kadt--KVZܸv͚; Rvqq(N<6:::4<E''&/3uZ"yDٳcF5CQ'6=Fld<DKb LG@B@*-!J]E 2<(CEUq(`z 4TL˰*7D4@(zʢ\1@6NeNX!2>sr瀚=j,ًZD:f6,5ϮrZ ՠPfBm, K{&T]3ޫDihb\ƚK83HTg"0jL̥ L&8M͞Y`]9f3! Xܣ3ӕ"Ԑ  G1Nyb[?O?ܽ_ŭfD&'\Ngii9jIs$ cl@sԷaŠm o~uC}l@ű8u?ӯzgWg @[h+k>oі-{{ŞNȫ0x<|N G _2#ighYAr ='?0pp'cژ?1$C6lIDc]^No4:2LMϯyPזn{{{KcYƠ3%r""440ďfhM?8魪{0OH|Beǎ_]H__MM#cZHg7I !%$ "c+ 8@N&; y @~Ѿϟ})~z,ڸ.((ض}{mMv >U~e"(IzXDGf`\>340"D3t;EL"s=~v KϜH&5UJ)i8ZoɈS\W]W  ^/c?vH}?mfNWUVR߷,Yb2 ~K/t~竏|}BO~;wݸe󒦦p(hhm޽G˚"^:s_Dp*rM7F8dwx_+//y~joGFwڵ~m۶MMxVaegϜxw O>nܺtNk{~ᇛΞ>ӟ=)/ EO?, %K,(7 hcϞ>m `P ЪKݥe7oZfmIiw]:|k׼=ntyɟZ,Kblt7Zaw߻uٛ/ӧݪw^[66V[,Ǿn㞺_{m˗/A F#XɄﮨ~D75` 4#@oR!H 7|%DKrݎ;E Q"(G'v+ tt:I7qW;7΄Z~&I"2 JS<42ciy8m5ΥyA2#sϴZcWٚԥEn1&cf[Ӯ3d u_|`yu4mtj~)J,ں[vdƱ^ףAbm f^uGY"FLO'1u>o-Œfz=b>x?ׯEan߾$=q<'N40*^ҽ(h軆>m7O>&=vQhO&"8A+򹋊|MLGƣй&F_Q>.h:F,}Ϟ=wm߼&L#<+**A<^~饾n uww?qm7mZTR4<<3;vlddqe6:s\IIwY\R$^v^8{l"lm]f͚+Vw~ޚڬ׭ߴiSCCM&I̽#rq0lbMI 鶴Y࣓τhTE?³!yӘKxAX<9ˉÂ6 1OͶf¼$  uCsԥG.K ncKfpmm]yn@q5.8V/zmCj.޽.H%8<&bX"lθ̨iIW|/bZċ$ɑIDATκv66|)\SSHy@,4v C#ӝւ%}-/gU$qnjl<GJ86 -S|P N|(n ˆH T0 `NC0|ZnjLCz @Yal#%z 6=6n[yҎ{U&hC#pȡ1=!nVW2Rcy"cv|yj,| SyyC9_M ]m&EWm0x<B?>rP0,IAq?Vc/am6dPcgOP6ɤNAF#NNH#CN50>pFX BYN<˖48PHշV4ovWq$tlb1qzӗ7ɵkNd!7oGzA$1`C\lD I8ԨZG2*TjDYph;$bJ@UUwZQB,ɘlK *b!aWG/eސ3`5hhaUh@At,#s+h+0n$Ԃ")76=љ-IJ %_eIUC移6p7oV-.][3QT 3F *ow~[ATe9)%dIYǤ}$o|闿\b% 8h nC榆؈ptgπJЍjlȩZ9 W/<rjrl50W"=MK*y,H1W^37`I/ sb4_` UcW ھ)vl9?Ɉ\ynǧ1.uFRd6^fdp…ΉId7h z RmX,.tFGx'2p)1$ӧH@">@Σ<;CSFC6)O&In\aMq bh5+<{إqT\p0b"A^;b1Î,8ИbBn+VŘq FɈ`I"0a B?B,m Ht5)8Y ((SR$n&n#EcD`0U0eYE kGY D v$cԋA]yA`GЃEDa9 #u&7:x֭[W^Mׯ*ty *%yoBIPKPH8t984凿nz$D48}4!)PW_]ڲdÆ Yl4MR]h&VPW2ƨIcA9jKN| i51c4)kqv|M{y?ϧG٠~F9?m UrCOu󁃇#c6PNd<0&8~mК P3s$>#u`W@L HbYٕz-\ppT/Eb,PNUJ#$WZ8" Kih*P'P{caC3#*jX&l!% Ibľ`o|Iۋ07Z  Qz(BunD,$GT dG Kd)h]DNHEqX߿ɒ%۷o|}MF9L 4΀tch~OxMyIEE4Qe @ 1 Q/K8NBoP۠j=])+u.M1Օ jl[a65 gu m.i&m\O' 9^nwCΆc<uR}HF/Yű8hg;m sg\an316uQݴgK#Ubxd0M5{3jM9lCo4k':z2ПF"XR{0.G,!kM\֘Fbw)8zļIAبg@j H4Ldl`6.$_AretxU|(56ͤt"np-4rЏHzP-)aDW$1NJS"iT`dDoh&OYb)t QĸP&W(ˆE"'M:RONy :ڛ$HD}%%۟h,wA &Q6oz(M*::V[cSs az6jGc@ ϯ^ FA"(t10:.sГB|7FOB("vT)gtp0od0 vB d6)*!1^ddlnAȈxl"=QCR*_U21fn5ҏļMLΝ[TMkHThU13~(KG:(Iz,˒$WUVg: ?A@ayGy\!QoN#5=i^ ˠ#_ZQnZiyd~(&~4u0&Yl6ժ7֟ !/!ѓpX56n Yd[WcǧN:y侽N8VnDxgϝ;wɶ.))s\:;E~q:Xk|?u*ss 0c\  O3~°Y2W"SHRG,Q5y -|d.n}ow=GyGWÔmt N >ۈ%PQ4s`eydŵ6jX-AKoIB`IȎ*SNg6oocUO>{d;¾}vpKNjҗAmP5Xb:PN4h4FMs}F|~R 8"63oN3T9F:H#H~"5Z#O b q. \6u$D) !w!ipޠղL !!`d2WUUUVVLhxSSSqq1EK(c47Í/ሏImRւ1AoPIj((Q# zVʺS)YpJ2)#U㜥 pP\eB4,g 2+J~H?GH5N 237lf[H5sijX:5NovK1Ԑ)LFI%b ΣJ$>ߤQ(h\VNYP ) %Qꨤ珫@B\zPӸa jtue"W{Π :#8 KjBVz É"z v0)AoD*5/V!I,H0Da^JB,#<:>tc_N#_;}OT5 'x>*@5AK^dޞX4DC̢r׃;w`  ݇&`6Hd1w…I$ba[ 8ЬkAw_>H}}u]]壏|[ :((])X%f"'F$x(C#0נB)| D'.@i-}e[ZQ)e&&%l2ے.E3'Eޙ2#Y| v1.|8,N"P."wjy|Zޕ5Bjj[/]/EP!aRVdQYFfR Nmdtx(@QۋHd.tvz:(M d۱,*,t:]^ov].b6ux d`2k0 ~T(6C1$53L&'zѦ߰wgҏ"QnxVJ(`BSSX$$dN;622?859Kd%V4c@r$okLidt'O4"ᆊM̫ H?ާy݊O B VHW^H:-43%1VMB,#qMGy|>)Є?<A^ĉpi ߲A0|>۫Y4nC.N'A-n7lQe`ph"% //]Y'O^_$@-$cժ5K, "h]Q^^ye)IFOƐ4(؉cZ,+/MT?RIQ_`?t8\oC,ii}]5h=hrSmGy%o:zݚokn:w9\_W>檊}|7׮\rpy߯+=ж8r?x[#[޼;ׯPZ;8ԫ 3y\H71?icKHHxt_b˦+WlBLxl2R}uXg cNãc`9!%I[t4WGO?ԲҲRD7 !FRbceUMNf6!U/U.[QǏWn۾uС#}}˗-v&ۻny]_{K׭Zz@wǥK=+n۝'? h|iKk;q̹s˚Zz{.J6mOvۿtilzwFF/k޶ckSSC'_zꪪ}ѻュٳK.ZMz;9!]+\㓗CÞH|%0sRrfqHGx̆G7P٢øǜQtS$]ˤ|A@=PzfH5u@iy\һjyy?Q:yCj|:1A.3K!T6 Z@TUF?bGqfcF)T]z6244 Ip!h4 (jn7UZQ5V f0+𫩩)8H.E6̰Bh|޽wtEa6ЁvB(fwvv477z Ix{PHI:K*Fqt^woϼk}k4oy˦憆S;.\^n]2<nSײB7ui1[mEcZiҥ7/-//pztz enmbghu?p {Ud-pҲB_QmVGyyaC0E䮣\+\㓗d :me-ŰDNO )w%YiNaI /:6qEB>gd h9K1C1Df ͇|ȇiPOdM+6t3lgЁjQUeyd56(iZ F}o_?.𜀔@tz@~K,e4#yf@&d@V oٲUNhE}@bR=ښZب"#Lס҄70._{իVNQ/%,>*OM,YZZVf9 =/&S\\\U]SQQp$6ny"]CCC`;5cC^LNL>̳~~:Hzt;LO$ʹ?/^yÇNLá|YOt 5._<>.D/_LOCCwxxkll,( c2>6}CC#pXdTQBH[Fv ua>C>|NBxbyy|q>Gz zx9pXqLݲBw' T` xܹxcӦ$o4H2Q;LC»Us*"K5i\5h?>>?xoo/jnrr^ǃaЋ%,P]씤H0~.C&+įj<H'uPȹy\0#+ןyPHO3<cu 5ѯM,3p !Jk 1Iz7Hș3gBhCQQQII+C  JxU< ߕynfA7c d HLf* -ETd%)idttZx0E]7t$uZjiF:=Z }z'<#u<05EUEn7ql-90h&`[ln144o4`-}jh`(+RƹzL"!MONO%GIm\Kt޷GyGy]| 5x~6a"UVVVWWW^^,Leffx[ouYZ[` ~ީw}Rhr{:IjthZE~^"jANnLCKlfqHӁ|X,fg66bFEl6z]v.i4[*k P]ccf-)*DnR,).B|uM O~/Dbap?b0nՄsz}w}gAkϞ?|K$dtp؃?}ǧ!xA*tZ~n?K$S3gXp$G;=  tG{@+}`C}ȡÑP(ڽ{~ӿvuAitӝjOyGyǢBP\YY!vC*B!={Q_g*Y7X%n" !3%iFFƆFA\Nr"R軃jqVUU |& $%a4!ӣB-} 4)kKڸoZUD XhNh4-憆ҲB%u uE>dVa@⢦:ˎ܂B_ss֥.bٜƆJ UU6pXzæK=dxQ  up.^XX|ۊ .o#,:B9 4++*JJJ0 Y +r=i(( .apzܞ .{˗/y{˽I9w4Wҍj>nZ\f;;Z[}gǙ3d,))>zK/<::O$0it??>>QV^xQN~NyG2KRgNֹߓ;ttUO#7x\H'MeA3skvfzIK+|) n#E&(Zppq{r 7|t'}YJ3 ={(F{ bQA Ìv6m,D!+G vcm]ph6wumMYYfY[W[YUaBFa1[kP74Y49^qBlilwFM(-/kln*xxk׬i+)hjlyhWUUY1(܁zr,]d֭? Co5kzծ>GDݷ[W '/12~&4bnc Sǧ]vښZmٲlpU+Wl]Kã{{\ãA+ =:ΗU׵.ku,/:YZRz^KXdM۶m:rt\N&GyǢBLǼs<>5X noI30hQ>Y{_L!>#7Vw`IHZQtXϟx嗏9l6+3|y@fm>3HBǡш &3x1HUzYIkn)zE8J&k2h0@!z=[I~t_EG|NpiEpO4!:eCJ`8$HRFQz㾢URH= 7W1\AGN[15L ;8v¢uvv^j4 5?*^ۧO;wappl]o-7vݫW.wXM ^8 tSʑ..ф;r-;n/ya>zdOԔ1k/$NBK(<~ FPz]ɈtXVu˗5h2)c+t\aZ(&'w*)Ip$v[oڣ_}n,箻s]wuwu痾k_+/3b0&Lo?k- Q}~pMY$0%l&0\(U@aSlQyHDDLL635P灬/]w9^C;NdFFطw{%' =s`qzF&(:ɠ d LM*Rb|bqTT΋J W^G22eyG58 /A'||[WX B1>QZ? F|3 B@Qx,FO[6m^rnR\T;L 1YG=5'ݿ|wc1{Wnlя~{{VTTNLzwʪ~Ek׬{w.^Yrto L}+_[^z8_UU[[X5͠$<:p4œH$%<9-fd6 :^B ^CK%H׃R<#ܛёp8FLC i4++)`-(x=&iO(VfwW{ VK]ma^CS0a2PtVXLvf6"TD#Noԋ//'9]4f#>> a~k-ftJf_ag`8ӧOK\LQK(znsvvvM;鲛MF=:q'mVKiiit:3P5]GۍĺUV8q}}555?zF#%*Β&^e%^,djĻAgPT-/GkbGq&Tكf: xJR0H{Ãpt'@i"Ѹ5ugᬰkS<"o'e;Sd"!gn*\,4m;iח'A P{^K}% 3,ӝG~&ϸncٸi6%d(`  Gn8: $"19#n,`0h5asAH' bbQKtNp؋KtZ,a2Q3|ʊri2=nٌDz u6[),6aYn$)tzf4vHϭ)zˇ|ȇ|ȇ+b"#<2]uvuh!ߠгZ^gj "9L'q9W$I) 9+1<%O( ) :NzA4#O?WLI]7̘Ѩ7&,'8F toL^Љ=z"i,-h4]9X XL(}*$KqyGy䱸HڡP8H4Jތ(IIsؾ\kص&bxH矜'l^*$l-gz]41F#t2a+y^]iP sZ }.X >+T7Bfr 1,1|n9/}#yZY j'#|_=i]"peqmXh≨. .PLX@q`@:!tWHtYjAo@hAkHHh2{Gy<ǔ+C?]]--{`{xEer=r!n 7ƥ@p0۬u,E8T_ "pԆ,ISJ<EO<=19H  B@ ?H%Hx LcnvQR}pztz|Pt\Rإv d$`DlYt-Vil ],)B\ZHZkI74 d2,ç+)tT '/m!.Nƣ I2B-F$j|Yw uaCgB9"*,dr5Rn-e9LD @ԂRm0EP)CX(@l[Z9  bPvA?$efnf G1EꇫIպ(1U%%%,E6Ҽw .8 a* ~H0b~8iWEa VE} %3A鳀Bvv)PYX\>YuQۼmQ6*dI~*a.dBاļ A,H%=4w9  NNL|>l?7ԏե!& >ʒ<~M88N" f%3Y+$ g,IZuj'FO@?91<4yMx4;C4 iN739a2ʻh;lpd`*tX`/G3̒D=SFE f4Pr [[*5.a }] \-;Ca=""@"lj*F]O x0C"KcSY@Bh^3K!c7k&6Tr3a.pï07V.01C8P&ɣ5(ˏnɶcui1,&3 Bu:;\`/یEarD:i1a5F@(! W['E hTa0{:KAQpbi *Q+G؏N7KR>ZNhӋ%ɹmDMJY ldEg$&+!@;fF 3e bF@wҌva]̪K &a^yVk9͘%¼sf%P16+9zta]Mn7ެ.i~| :A_xK=vgAAv|r3'714~)U ؏ؿ1R' _'7o.Π?%"ǟT8( *e0C*ƒXyE<>A:62T$1{gNKnCZoD l)B<UO?:t`mJJ Ձ@5 0!fAuR??ܷoBhPVR)|Zn,2KLznitXҐE6YhjdKmhj~Q^MHj@?>fE2\@gI"̿9=l@Xrj+̅ rB`H.,0\%pusubb4f,k!KrCuxD|pfCLy^s<<.fs 5_&@rzTAU'`hFJ*PA5|#L}7 d|l?G]H8fMɆE _022O Sp? LNFFH2}ێ/3FGG9D$Cpll|bb2?F@d4!F@5St-NY 3˩"3Q mڑ`)9PY)D]HSi!UBr/С@I)¬]ȨRZM>7W a4N8y{gB0 Pq ;W%fȗPD8ۃ4ŕP(n喯~~;v@>xϝ;D ,B";bcQ݈ n*//Ǟ@F(XtqGҡ_ts $*oLфLpQ9#j@BVW٘%}?;d\iȉ, GVA5d5MZdUi{f*j$5ḐڥY26DG~cjtDy*`6yfn#('%/*J@F P>ѲN SIؤ1 EP5d$vW\ymGu֝9sѣ[UA(jAmЙ&ZA0խXn@f8dFM)1DQ¶Dף.lMN۬#hjL )48b)"EsZ*V9ԟyt( 2=;d]QP+,Zz|U6&ռ0Q׼0^40Q!K,Au|Bj\fc lدHX2YXـyU}y+RЎN?q{B0{?99<4+ؾ#..@XRcoooww7<悂݋'iKSœK<&%ț}ow07`&1BSppN"V'x691iЗAKǛ֖ƪ =CK&{Ody@JKӈCx% Z*I(#Ta7' v& X- !G1WʌgiiMA+΍Ԣf,3^O+Y ry%UGRzWE5vϫixR۔,-o`,Ob@2ԯ4(82/diQs2#љhڸU(OQGXrڟ.Af:OK@1,UD-'WDD$Rr8m]b|eG&vpt.,,;l-GB" 8Pw iqr/y%=>$^ƻLCc۱sa|C1A[郞&v% Do`*000pEa.I dh'ARM7I/} 3%,69//KN&}Do/ؼ6!%9]EE(/+v:yJ)7we56 oltݝ,k]u\o{ݾM?o֚Ky%U5xllYU\֨7.PO[eMͷ'9:1:0:CJ>hdS*6Y*HgҸu!/++3sh "p)kȢx*joJzS-B "`E7&#I5ڄ'a>ٟ.>OF漐ٙb3dZ@!hذjcI%}y<|Ltڮ(X<UUTZq7;l&,ѯm&n;mL߆s<M܆o)T!9cq{=&1ǑF1jqLbO z^SSM H^svjRw" oHr)>oDO& G Y+Gϝxb[s\}m2o2Mw\=ZPҸRڨ1X^}M$\YXPIj! ,`|W-t=z# Enxλ`E#џ?kԼϞ||==esCpl++j7˫+Gf P\nͶ7MϿ\|.K=7³ϝ>wn 7<5<6FlhjN(fQQw;_7o+(f]Nu-A[i4L_an$9 ֬]~d°,awo4meqK{ol E4$eZ܂DaeT;S*SH9"%I4υ`-87Xle>,1QĦSib@l7,NW9T4BJR 7&pp/SUPnP@4/ӹQ(8%R-Idʉpl*"CIGDh 6MlV82%&E#ѹp^A*74jʩH#]}zS同q C)#cLy!Ԝբ+=P!J%扌 ?x%@egDcW /dJ H~ajLeڙ`RN'=qzi=XӍCl2`nl/I.]N-ZK6Y@BH o2\eVM@dd*||}hl?MK'Wa3gqˎ[nݶmۍ[ɕ4/mh*7 gϜ8׹aæ⁁CV߸|eCih0:uyoq9qfxxt͆ {?~=o3vGiEuǣ9v@oݲUnjk[z<.z֝|SnshDKKkyyuwwѣ%KTzmѡ`jb_brʆʆs^{ʪ֢phpBqq1&M6ޔ8キjժҊRSS9g{m٬ښ 0ڲr9-UOKMX<7:6izӟx+V=>corrrlbѣpO< zVZRt:0>8h|ELz?TԽQ, LpveeWI$7 N2> ]=HMLWXlvn`3YFl MȢ@0ԐN,ov!o6ZRYđhƪLβ:zĒ#V)Uge)j ^*8FR[bN¼Ua0B4r(Ѯ*33VTJS3CaBPHMf^ъU[0ET5WTIzնS)(4K"'j-MRj۷emiiBpLZgCe6zEoC$ Ԫ6 dD4z@ k9p#X1>e11 D|VJJm)Ꭵ@quk A@5cɹz/v978ҥRSൡA }t5X ($5(HH\r2< H=hTʮ;{t4"1P &(P Uh8>L@\ibˑFppTV8lni:sR ĸ3G=ÞTDFB Gܼfͪ ֮^jꕫ׮{qX$ic# `bH$ fӍV9AOg$5.߭FO yJ$}'?[,2M f%pܷXp'dB\Ympx^' l(ш'4-=M]n;v'|Ixv: η'3we2-_@vЁIXXMG:fzP:cJ|eBZ#((Ag@hFCc).%FGFwtOg}[VZ<<4422rᡲ 6 <$W(B`t/^|x≟'< v;]ۿƞ~ݻ/O`\ROj4i^@[O*5ah0*b2B@P 8/) ™A Ɣ9OE!  H!K.¨..2!Kd1ȥ꒰'W°rVP%$H Kn,S{9HFXBD*ӁBRAL*Nudgp#9"3s43سӎ޵w߿uؓ5J,Jb(@"sowߩ  &6 ֭pԩS绑0%= 08 yb>/T' %R. YeW7S~.O1I$0"a6(hI"yH !p][93yH61JGWԮpB˼ g Mrml(YCt!÷ТXL,bQ1"`HD2?"/47XH]3`(KC#Ъr+BgHb kb>  B[dBQ( B1Xi~$S(tJV(8 2?808::R܌lvsM S$+o˔IBcQjd$$.jNӓ9ܼ7 }wGQ/ D#<.>蕾cprEt;1*Uk4txA4 ofuH$ O+p^@AKJ_ݾs 'x;z<3+KV&c2ɟɩN:v~I±~"~]c;Vb5l}7???yg7nPaa~ghhaB`^#=@9kS 9zZ]]_oo?/<ꫯvvvANz DA7! &@9$iB*C%`z46- ŒDA!-,$eBreE(H&,,P(JіGd}Ҙz$EI@Yj qV ExC,=eSxt-ʲ^)VxU5s~D$ ֗5yWCBP`#UM"/ҨDJ㲲$ Rwm6 T[! ڲ( خhϛX .rF2 1()YN  7dc(8;82:y=qlQ̆Ώt#d6) 84PBR wy͈Q-#<@MS+ݚC4lhx,@<(YUg"Hң%jZUJ! t>UN,I rB!xA7  Gz{{g=b'JW B`Qsޥ[uo]vεž@{w힎9o" !¾@ g>\pHB pQrZ ȥrstE"T Aƻ#o<A `R"jX= CfIo0L>j?"H `PA; ~\E! rorchz kD:X*7tAORyngqq ?z]tbm+0 C6\- zgZj546`d"YYF..--+x#8]SB{@@Dȉq{3kw7m/(LO>Z] +H#XTTl\qfgF 1R|U^^~ҥɩI(Lt ]...޸qciinGp0 |kCB~? k 08y"V{5p b'2@LcI3/eNB(+U,G*RTܝ-M %O wpEH v@30AP<"2'h Mݯ"EAmAH&h7AϷ#%E7k=l; \˜Ib,] c b#Ř@2ْ4V&UMc{dLrueCЋPGĦ8"+MlT!?Sb~tjh*>,.&ěyuj)?ۦOb C)l%@Xr%S5y:/ #oZI 嬒x̩9J$$F` Έšl?@@GyMs X\Ăl{<`__vw!vfiu^/]QCtZ G~   -VFQSp? X]@$ΡPDciz۠JPKl,)z'LL&'jU$S$Uyy9pA/.S(X{[lIxzC&wOmYݚ7ojuGul3=iyV~qa/YtrInѱ-;kׯ/x{:ϽNwgwzf~qYYfNݝ@XRRZ/ݩkɵEE.7ѝ}@ _588ܼ}tb2 pOglvajSI7nGD,jh}=44pwμ֚ ve٫WTUUin7p۷&'_8tzJ+JJ nvt96Ўuv{[:^pwϢw˩ Dր&o\t\k[gμ=ǎHW.]ul]}ٳ/^v\ z NeզbA8;3S^:v޽W;M9Hlmmq#kt 2%[vT]&ӆ*n-&EFz&giv-}X-ǫ4.S35 2b<24~Qv{8@|˅qwí-7V#ŝ΂32>1U2 `.;Ǔt<33wnol(-)ܲ-*r(:c--`GW|~A'?`c1 s_6:6 NthÆ v!wZR$$ebY"C[1A(';ɸry>)A>* gf-vfwIAZ x)`B:I.[rS) }Fr٪5AGLCdIjE,%H&PC$fǦ"eݯ"NjP7y8%`KQO ;1CDށ#PJv؁S5H*%aet65.~C7N?TO%0Ն~X/^ ~%-sZhUb$MoH8[5bVeH ~j;bQ(bDR\b~  7" ,|s.1|8X b-hRMYSD.K8{ljQU<CbR`uALIj)=&%J8ʪÔ" gŹ^R=txMH5JMDX9D)%Fw̲ц-Tz,aWSN_R.ǢSS p:4CB$ʔ6?,,8ulN?}bzAOXfy+tfr :*`2$"O=yjuf;3$&L +I $2P$c`N$!O%q QnTD7fTJ8"FRc5b+ǯ"u]UR(MI M:PM*Aji2ѭjRfrƈuo9 [-5 T B9=t21&&$FJ^UX5b䕪eR_lZzgg焘"*5)FLPi`4 F OvڀL5@ V)B.,}Zc4Πc%d|`/[,J.`J% U"H|~TJmNJb lbrHiuNL'#?5O-tKdB4_/'A!'w:ҬV; MvH`bj #3VV-.4sXB5TXEh:> /,,qj:VT5M#q ^ZZ3`Nh2i`8Тa,!V#aԠGJbYzfR },KщF_.} j6+0 л[Z  JT)H5Zz[$ p8j2YLn+d~?{#k4ZFM4FffЫ:@WAY`NJr8z^OKw@ zojhb|I]8Jh \[͢0L/.-B>1! 40hUCNdh.11"rt3DQ.x,6:2l.Hh #4/,C,Y$tC%+&G$zqN(!D'#lM%bnTdXA`iHR ۚ*Uv"pBŃ{mQ왌^7,OKH)<(ϋ^Y$2'x,+! c9[}^* ۷JE0Hܐʤe"rlf?NpWC,$(Y&{ܹ93;IK3woޔ.QɇfEVdǦj}&iXT J%'N?{nx'X8! L)RY}!ZQW5 2B$t[PP-6!2YBD(2l<dmāRrz‡Ӳats5Vԣ@v} *eA'L2T5vɑsDgn%Q(;vV62AEP ggcjb}c1! ?Yn?6wJ K$driaޏ `}~jǎqmFY[mޙ[\b?ۋ/~5\lkm;x1C=oyדvONNdөttԼ6p +TTqӦ/ၗ~?74%F~sO3Kd/ zEL!OML׮^v{۷'=7~N|JJK7xٳpݳg]hBQ4#_/o\ ?Xoġ3osM%\Sc1޸qn#ڍ۶4kϽшDPCKyD]vku|_Vl4[y\6a4u%= &"ɸѨx9wvwݻoovNVvvWkU۝4ΊO 믾{Sag^|~cdsX;wzF oݺ[o ]i6v$% ݙɒE[jjk6oq6޽޻{b^&4*i_gs{):tpoixi@G a W'N?n0臆z ^9X ϿԩS=ip##/"}'nvʥ;ccD<ٲe9yt/!@c8 20<4_qoɯh4DoVQa#r3Q sz.5>3E[x[dXMv:-o7ápVv?v;"._ꫯL]w`ttƫ.]<7nʎCw;]} 7ot;wṎNIRkCG57|߀l!LtܴySO=@L.Ns ggf\.g? HR;w'[D ͋PFB|[7o^5 (Fno߽k^OfJ# SV6̵-~WUkkm.<=M5&5V%ElSa<3!Nxp۬/^<:Y'+ӳFSŻZMmayL&"p l*o6c+:yo76Cc6VQ$v򛯽Q;uZc^NFcannC[o|($; j ɺsh"| aaEc=b_v2xԐ*8t @#LM Ol} =*hMl0ܓFq*LN$+ˢ|N봖^"\v~ Z4+yteV,p6E6TJ^+mY8"!V¦^]tM\)SB!Is=NوWAVsAvz~VѠSpbѨhXb(UUYo0UIJeF.(du PAVJ" "XNJ?ox) 'RCrI5m~Kؼ S[(Ng~vTiT#|wGH8p` D2)U%H9R؆]vx)l#Omy؄ሳ1e$m "j?r|Ғx9ׯ^]xSǏشt_ N6cNU=19H*ii1 ;L~N,Ocڻg7M%2z]qYY~AIhoQku|9]Q[ن Ja#ΝE"{晪A͑wjiqb7"AxK/v zo|=|'A!fK :M7ضl2W^>y7;?xiO?M7-.4oJYqI<u |-=M+Jg;:kwϿv|'6VWoܸ17'7 MOM[,VX,v- l kҋ/'Nb]:}۷BC*cQVaJr`` ǎۺu+Zijj૯qp(XZZZPX`4v߾s^km;1>*IpþW/CN=}G剸dtxsv~nZ`=:[jmh>/ ER' W1[kkw?zL)SY̖cG?v-[-&@ɱK>()8q;().53S]yy#U%EŕeE0'@Pem-s͛7WTTA u:3 Z4Cڕk6n\(ǹ= tiq;dwEo /7O?/ 7o//1[Mr V2T#JQnͭlJ K*Ra4V lC9Vdx2ۮcuӋG6\@bC+kǎʂ9L2K4AHP;LzuQN}vYZVjuɤ V[ytߎl(Os;(܄5O>q>_~_~+QTf+9pDVwAH$'﷑rVT?;+ YnH<";⩈a%?w`)_.ۣ〲MRYVo#V?J扩"rN-JJD\S') |!&bqz(U+ 8pY@ @8U2No6YLUEueEN{Gdd؜v\'0M힘qBQᰍ~8i :]Μ,Z#S'pab|rq1Kot"Wb>Y(HEb4ЗE`Q篪2.}Kڭp(B/XZ{L*!c#:r᡾z(`bp,+3j YIL㥀h4ZCG&&]R q!R]m[LMh8lGWBQc)bSrzK:fk; "$=޻,ʁNoO;`c ul12QNMKsz<ŅH4jlo㌁ tC9?Y`8~2ÓBOa @wJⱈ@'IGa(`(V0[l#G"fdd;v~˗FF&&^{H$w޼\ɠVz4k5j'°F"1Tb8$ 'm6瑣kMKK3F#懖1P(UO>g>LNC~ Mx^ݫ3+8YRZjw8d+Uj`0@ ƙY٪"ag$MsyK>;NKK>Le 4h0j CɁhU;~, Zt: /hw} HW Dr0|a245Pb*- Y=]=x"?Ux䤾DBPtqQdR*Ņ%%B*.,>駞|:;+:Ch&)͔ٺՁ\&Ka}$ռ&@0DH\QhBn#'Ii AQZfr`ֱ(n ̽IWk|C,J"GNڤ@F'$Za5:= 7v,juZhàzj4 Jfu4"12ȈqE}`?@\L:2xHb`mH5xd9PEa mVdh`9P1xcU|,lX~o_L$ʵ"#|y 2;ԆH#J2K DsԷ?D[U5x~ xul,ߓuwfǸnE.OXvɇt%B~c]=|bBHKsLJ>eXGGƫUqQ\Tی&yk[[Gȶ;HTty<&3\@loobU^pvgA~L&~Z0.z{:"1 ݓm3ܼ~Cwxlw&H/ G 4Ϟae6V I.^z5;+pZᑑі6ݶisVs|̀?XWxk}}C6UQ Z<>=={]ZXWTm۾tP8zd8]fBه~Ve 驙ёEQj6G0V._:FX%uhO$:pӅᮮ.@ V577 qv=/?h"tlEEiλ- jüQgd F219,j+7dezFa۷m\:M6v`֎쬼X,277PR\VSvCЭ;wna|ZbTzltʕ5 þ7nTiTs3MPvpppdx77]km4VGĆW@[*Y I &H@.ȈXBdoS)У3#MQs̱FGy5V\/uUG2}TSMgJ|2!xeߗp24OHk4k}[˿=Fjw6[,' ٵL *5B*Ý&W(&&BѨV+))ɥ}ņzF]]]e6Ʒzŗ^|^z{'‘Ad{/{659 PIhv9斖.~`4Z)`(JRsUpD*PXT}}s燆M&I&8333;;t:3;ϼ\gW׍7Ù|\.Hv΂w)&ZW$/:*Uw{Hk^{޿GfgK^ZF Y=]Rt[lE_{osp^o4/;08T|KKVejrkvv^cK{k{nvnA^!C8846c}N￈E16>V9HP<3O?<Я}?:11drd/z*:)6! % "mmgyK/s]i2cN<쳟/@_nݺʫ?|ҥ+c`ZZVz䉉ɋ?lo8UVTD"3 woߨhP.h>qL' 5F;=;]氡NZ:!MDbz ":R@ ͤw(ONN]|ujj4#3l2gffB0p.*Y6i0S%{*aS)53z hݼq5Xq[ U*KdgK7_miiƔ MMMwo|gϞټy&@)a.tܹ ?|"{=w{<LTRwo|Aaf+T*9d)24#al+Fꠄ^T˕RB5I9@wekM@=kRX@]V?O2V~YonX.d9#N?-(mSU 7frrV;0J ,@@͟6 Af #J?2:[CMzHnŢOMEF ?[olX'; ( &`D[q R+#,]vMKXazOyxypC:ifYψjZF&58–sJrjz(:,5&Xf9DׄĒ$^H!j|XVǤ"V(-Óy:c)UojY,wS5 C|'&&ON#fX(x;ށX,y}K~ݳfp$דka. %$I)ǎ{m{j.;i5:fdddvft^iiiQQQ۽x޽2z^y΍7WmRtCi7\^Vdfenm\%QTZ3J:U=OHμVgggYYɮ];|8X-##1!ZPt9Zč 32/~xCyL&$ 26:رǎݽ= ߼umÆR>`ѻwMg禽K p(hw[ Zh n0obr|ؾs}{lRzSeUuiYѤ5hbhږťS=l% }975CN6U@F$**srdž;:o_Tv~txl,y;;zFGpZE q ݨhw:$3@6رcvaە[VS'3';l  [,ipphCYi3%A4}4QT z=9߱k͛6vuwac&JRXTTQYrGF1^>g_.*.V+@AQJN[BTVWW?|_ھCsi6E?8]\l|dw:;:'EdD&f/pQ\T155 $Bр _^YUgC9vc'WVꭦYPUe56-} r,Jzs70g/~ZzډS'|>Y t@$cXku'#㧟|OƮ%_l3m4fKu8NhkKgVvnyU.Ξ=wfttP2Z P#IV{Bȕ \r{6lpߡ#J?c=YA+Sʳ2\{Gwj R(a G!dA_Wgq8iqifsUE%-mUc]M]|凯_rҥoܘ_J&UO_9y1nTRAQqyeӏUTWI$&S#j,7'O=Břh߷0 -|-|2yM 17'g>zO?ޙ{wϿnhxp=x|߁HxdlD‘0lgV#c{_Goݶ㉧{ӑXo' "\EW`,fvfΟD.?xHAqdRpñ8FB*W:(0ROuзY1X zyL|7''ǫliֶֻwؠp$P*$|^e Njo着r~'xܽ 0>+#=/'+  e%>r@;gLML9A}?qwn{}<;v9pȑcPc@*L*Ow4 ӝZ@jcՕ*0!ܚ0 yث0M, Fޤ)tSU4!$%18J,ÉG Ek=$^EٖÆA+"Xa'&*DJ~xL?FcNL'#RD*Bɑ3M+}FvIrYH&쑙c[r'.|9AAt.q!%Ic$,J@r@Ұ!DR`2ʱ%[5۹9Ӝ_!e&ȎUe;+Il$r zӀ$.e);,Џ"bGf)Ph .!-|3lN*.+).--(tzMVBvy<g`kjf#bc^t###~>6̀U4. nDxT.];996S&W;z+E\g\$-R쮭u\W_3}Ȁl4ޓ44Z1p F3$E| سoșDb٧gϼիptU*,+ٹ9`!]ohOpTjTUE"#[Cajg"16>\|crrza^>*Jj5 P(mTb*944|˗8tPE t~ZN_ta:مO.yo^y֝cGfJќF-jQ( 3ԗ*dɤ9ݟF048֛onۺmƚL Z VK*ağ]@?T$DEӤ~u?wZR.k&* }_v܆bt\}f> ,v @q,> V#:=$vVs"Hl 曠 2XQ?D-A1ETsG`@C8&ϸIqE1PnF+Z1n< j^4PDa%a5,"fcq~1%&;c8@C3铑(wOXԙ AvOG!eܓBCan>4gL49d p@s3< <)(դ1!Jo.R 44_|[9Y96o?Q{j?882,Zֱ={nܸ~ (֎{ݝdgg_ufݡөܸqsn[_R^YA@儁0&TrAWM9w\^Z\\ ddd^v:|l15Z) 4dϾ7m(˃,,-?xzhljnzہ@  tuwBt5jyks`0BCã70Vm˖- 7oݚtuu]|޽lvTqzzÁBsgφá%"45޺yΝ:e6 ͦW(.]۷w_Cf.)Q3ʤ÷oZvwܺy(޳7/?ߠ3ГP8$m/19yΝᚚ-z}O $<0384p;zvܳqsB-knmknnyf{ggnAvtvut󴴵u,|XFF/su@j%֖jtݾ&-i* ?48TQQ{L14[s0FX!m[O쬭--)1c22ҳVBŋ]#[l*<P{Xc*",?6 #-tv#NM4A~lIc~_/'K/RgIcDERbe{mqNP{ c\1(bIjc?`zj JI < Rhd쇵4+[sɦ-mc1: i 3Q nρtLxHs (%,yMn$XgXB!x(rZto72/JUu0%_R"h"Đp25G%pd .8eC#nPʼn)pms(X9V ԅTL$ zS^^a<.Sw5޽6)ٴih lnn! {<NNaaV:T͛7{z7577ܽw^SSKЀh sB!5Ѩ]X*.ݐg4h2`OUSm9@n@0XQYuQ Vc`ࣟhYc @h]b7"4 ޠR%]}_R7*2DlA;L`*j^3@ 1!:==4-jcKB‚wҰZ!^Jt".@ ZfWKUsť%ja!|F:11[ZBG\.Ncpcf1"ȯQZbv##ciiix"`s8&AIk2C)>^x:s=YLjZU:G WC$ia(i4P$A'-d)<!P!qG4(1,Dc6EAzfm(}= J LB :3*,R%%H ^ ^G8 bvm D#a!+2Jń捛Kno*HJB\`O'@{`4~HբtYg`N!=THW-Q0^x}rt4>*RKU m sD01FG+K zLTA\AҠK$ mNk:LFM1Z:#I`Dz%Ak}Px(-FSHSs+Uԝ` g: &=C?oܸs}x2`?Վ;JJJ*4'c B pN`E諸2< )DŽas1=!b HDix\ðM{sS aqˎcu'6lN2}f {+ *^O3LT gl6\.#Tv>hm0plMfj25ZRQH C\. x`@a]uxO8"3Vt$d:I@&`ih5i@A18kd5dj.Jr??r5մToXj?~կ~lC Ͽ>yyvUNz\abt/aSqRƅo}vn*Q$1z'AB '\pIwD @HXb:s#S`(jDZJ jT2*Ӏ V=kOuc"x"CkX4Vǡnm`ӻN kl\SSa#My xmؙT^\?Zw)#;tC%h]`7B ҄B O ʎ»&?C;>)Q?8xGLsAD+7_/ŏs9\eZs|.KV8 I̿/1ͫؔȡ]>Ț"""oa-R T kT˻rHs{$UbmokiZZ- "$'~>* }x5g#;j` JZLMsX<fRi<*OEDuātʔR) 6JzJZșA"3̼]1NE"3=1g2t]P b%V5?>JtJG\:[ ZuMub!*I"v?*%.G)5"uE_;Tj[d.:=(|~~݆+6:/gɲ4fXTխw.RTXC\ɩ!;bK;::霓\A_Y<FP(DA?3= ԁ|Gf|׻\b (tU.7EC(H- LFY ID `v:M@]~H&cM ί!W fU +rI"t':j WkX*_(}AtyiE 6x@6޻84Ĩ@&2% @ jF= iEa@7Yq%1F~1vY+bJJJ4ؚ@2 Xq|W 4[KUJNjj^|,{FyUH?y͢RQHEhYNrhXm4m.&)SӮ@B|M`3@ Ϳ]|X)v)JOF aӇ$̮P iɂk*R1$i r26^k5*r2<$' |rXM ) |1:l.-]5@~n:ӧ386vǮ|$)eMϓp0OVVh4<'9[n|ەfPO8Lj( 3&Ec1+9NJe0~8tvFzvGPieJH2`7n|3ǏXYNs, λia!7'hZyEũNx2s/Iwm)ᇳKj=}r}jz8"ʏ||-:bddyfffjF޽_\H$/]wFC'ܓf;Z:5gcSsIAγ=wͨv8S[?a!| nMi4v;r(]!i&>LH_߼qSMMZf3^zel7dNg<N-DI"O!q^EH~u؏ ,+YE%{pcHt2yh 7y"+ M㜤Q{0!я&8`-j>8;,-w xWjlQLˌykټA|b[?*JsUͼ5r>]A߃Ga E[vNƴG#bU%Xt䞮i!F;HXڠɘ5@7h@;KLGyz/m!@-v1~sVO,%ʹJEML Z33Ǖ E(okU+lM@G@'ZbJBb[nNXY\Y\m0+ Km9q x3?7x399i۝Ng'Mt7l0hr||ޠwBԌl  : A'㘡鞜tA` x,&S*/]fsƄӟmsibzA7:\ee=@;qxx'jll—P^Q>|ڛサv^]ecGv־3o/+~IUvul߶cÆH$ sNݡC| ''?)oϔ]>g 7mZVI^ރdGgϾPs:?deo۱Y.K4ݑiQe :Y/Q砵F-c-[{HQmzfWVWt#X|#$tȷ(7 Q%L=h2A/9^ɒtORlYt凲0xD"ulNha_$av1=`o=G#mliii >(lAHvtv`K3`Zm$ch$FAhE/R# <3=-;ˣї7&"!={F勿彵5h))-1 #G']5l/C۷Tg|7˲GIXī0 ½wUJMUvI&bf~{k,s%R$/` v)Nm8k˓hS9UNju8Aq;vݖqYfǕaiLǃLtnAM3bV8qH]]KKKt29;33>>><<\WWګ=sgμDuz62<̽}}ssn8 b & "LaԗkWL*_$T aUP kVt_H_r /˸Za91$.|\Aةl)D Bk:1@"g5!D&aM@"f9:BEc \.Dy|>URF^Ύޞ֖uuW޼q7/_y7]u-xsss?$ɂZUtBQYYyСp$|{K^R &hNڸ:/?w㦍>orrr:j5Z5%%3zm?ըH #ΰ h{׀v/|ѣ.] Sk9 $RA!QG`W.?3{I$/~B4,A^:t"\OD4 EZDod1J1+@g2Uel[4sT(Ka9尐]<: eeՁW%ջqPJDAc*FqPiq1Ci &2Qž* \bXO@ X'W{&2UjEyAЪdQLfin%thO';j`A̰[؛ V颖r˾oB*b† oqU`EV(ccYO.t|O\Q|^l<@nV+iע3Gfff74MzzG1m4X<115qέ>οs#r?޿.|x7_zK._ܹrʅ >CD]{wd(!V*˟xdg;;^rKK;/|k_گڿx99%*}htl7媔jB'FwGC½&\kV[4_\F"iۓ]]K[lKXT%O4hRr,tXDޙřx^?8< dҐr~o׊; 2%3L ٖRD"yI6viAY:H FM2*IDQe<$(`ՒHF>bh¬LQ=@]J߫aOQz`>'|P[4o6kՑ^Q?9!]T^>h: A!Y1τ LK4!b RDDt"A$3GzqZcM.(ȅ>+Pcx#FԈHPHFf /4Xtf DRZ&IzҚ*27]&1%XB&ɇfZ@SvFAGug䧗O-% )P6  /ڂ40JG! c[hA=1C+ّx )]%¦LE<ݥ䃀]$qw%[C Y R2obdETX&:,Ҋ㌙,'N_VT* R xfbdbYI$0HGD>PDZ.ʠ8lf:kYT|[֭lZz_I9yJS@sI:G <8,"Gl:5*wOoZjlvH`yҲLk{;uwnܺQX4/biXa9Ђ^â`,[k=:2s]z[-mwnc#Dn~a5jMRK^Ǘ6VWUҒ‚]xw퉉\n2C{MKkIrJA%$WTZ^X\zy /^tmaqAFឮ+^}}+`ժrN0mQ>-p,oD j[<.QʡaIsvS^|-; ;KC_BWH& 1^XI$HH$H(7k PO>~!LFg H& G>?<:zC5;K:2:RF.ЙK IYD>F?a jKb0hJ $ zEY u:%GCvI4.8[Bg=Fu1SJ$ !Cqr\j& =aJqR+d``B\r$H=F%1>AR *70f)(4M:AF|>( 7l5d:`3A1d.XG nܧ҃h1ƔGiB8ZJZ#M`"<Z&gL\|h4"lCL-C͍ HJ,Pe54^ja(quH@5kªxX~`XSְ PMHR(R B b f]&N_N\uzTʓ^ػB ?WkWeBfq?/q \ t;lØ#ZA#N\98wD0&r[#ZQCV^8UkSDL qwb|@vd;?;91N' R`|lt~1[vl6F!&\r{?xesǏddtZ CCh0ffjٌpX z!nL&p;== ec6+\892$ ԃ^b-˯10 L5LVB|>)qηeZ+ 3pw%m|ߝ9{k+P'O+).P mgϟho]΢**,9qxEE$W^|s}6.7?pd˯Ԩ;ZXը%MϿÉ%Y!syI'/|/w|(dUIсo5r߾EN~2 0~߸q;8q ^˗9P=̓%inp/f/ɲkޣGe[k|ֶh$Zӵb@kko\h[sys[xbzfs4$!332Ҷnݹc߁ly,poȬW`dJݾ{MOw~n%q8+WϟXZRy4ODJB"b}f5Zզ;N?TaaɤB41>135;˿-tqOyIqwF#3#=͕mVVFVfFVBzf:#OǝCF4s::Q0 l§EcryZp7MiToй\nͮ0uzە6Nê oߑfiV a1[ 2nT*-0R@ n;777+;f`}P<dgegfdrޠc+4 rCCBJ{ ,{( jn7!1HeN(fj2O^Ru(;=)ڊ pI#ȶȃ pΠx@EX>'&&VǓF/``CGyǎݧ7] 6So^|uzfcGm6[&f7˼m۶6mٕJu+4jh?kpxRY}|K'>xȡ}kkgqI;mJsس3ML*,-_8Eڬ:2TpѠt3Drܹ7x}޽M-rvLy](kβΎť% ^xyמ#{S-m*.ۓ>?3޿v=C=]m93se9@bKϪ ?~}{L6 bת$muc[vc';8=ZFݓ;PgϜywtdئ Ѕݴ<OHbr<^~{ڕ'ZQL iw7\t^bQ*'g7nܔ!^|酫Wo۵Vm++`76[Ks/oߩ33v7_ ط{wI-`nя76Wmt;UJ}gia*}Yqaxiv}=-O>ub w cH655/..`'nƜу4`.U_VTTr hnonnٝPTJRdm$oU]]ة:^lL8GGo߾s/ܹӀb%mom}/<rc醊Ң T[_dʇF&-FJx7{{m=|d[kSnNAz9C܎ mQ#Ģ?|ݑݻ9߻x%7NxW}Ν99٣c>24ͅeK3|C?fai,poj~LB ߵлC<8!ȹLTDkHb1R A` 1 W~U=IZn ttllٵ_4q.``7N!G"r;˖r+1 b\aRwcb'KT ,Kt>a'v*9IJGfy+E,7)UJsR)v (I!ϥg/ J zا333kN~tq--M.` XTbvG [HJOװJP6v_lp!<`}һ *cg :W Dq O9',,.۽{]>UUo;{BB駟yS'O=|䗿O~ga+`t86^~8bJK=}`2Nz"k76lV2dmܳw޽J7˄kz+W/vtd\ S=!$Ku@?5;X tۼuSO?/}Pؘf߽{cܻwA4[/_1<4cg-jzǿuaOZZ\H(?tv/L:E8m;s]?qW+wݭ[pѠdܲkϾ;vܳrƼܶ` `&@?t32rBIzaEy}_җ**ʻ'$KKzlxhȻ[1AlzXdBTjfg/]gÇtEEyꩧ9v/}KO<ő1N'DdL  AO<,vrP:91/_Ekk+rTj [7o_W#T?Dk׮ =v>} 3S^¦M[6o~ٙhXؿбcGg7m8==37 DFFKJ SUJU4^Zi[ܱc'~_Wlj` Q_ub/=MEx:ӧJ̳ӧ`8pNOڜl(BθHCTEJ A)=' v!# &+Mm*0Ƥ + М\@JL+TH4OAD_NMO3@m[d z5CPK@t]HN ; vt,F؃DAݡ`jTd `1 9 " T 0!(E& -Fs$> Ұ_Ċ&$8FM@bӛQߗ[\Z`g|z=0?*PNzh&Vw8]s ^8*jceEpB4&$s{ͨ-++KUZv ;'!x#JTKQg>Byd$,$=L.cU NO}J f,V[zVF5u7Vty^_A!FC r90[DƚzvCy `0hjTކ{w/Bf fD‘p݈~I` ԋDTө) \Nsqx\ ¡XNV.?V~ qp d*Tt…}l4Z ӕ.&6lذqcU4-Ȉ&%W]ɥ[nw8jN.SF#f|54YYiY@J0SqiǓ666yY^n05ݖGf'Rl_[R\f4شZ=bOCd LKJ Lr zl]ZhB 37$N`/~oQXXp;wlhho|S%N? iB TҜ8~6mڔ^O ԉNM@Ғ}kOjaJ8Mf"d9?G6@1;t77?cuFBiJg?}KKN^5MN3iT:̾h49LOUB iM*Tɜ vgdd.0@rJ41e^+2F&{~^~,P|~|Æ2Z~!f>늱NF@ %ˣҧ۰$t,C89tFE 0`GLF:/n01Pa),q,eR(P Ij(O(.ZMlœZ NlUtǎҗkkUvEF#tnF*)J@/t;*b]_L [{ T Jjcj-Ɯ!I8U RfʲN?/yF-9m\J^Rb `@#YTVx3PԌLx̊ eSS} T=}@;kkUtB62:{;ohIƓf 3}nNeP0 5S=:o9s^ńݴN_ #cVfϷFO?eZ|{]x3vkKMNY͇7;r%=RRZ(/XPPr !L\  UjBIo nv~uZ57\uׯ߾v[)Inݺ0ݹ935+ ^Β I(8R.K0.fyhl|FB!xpHV[OMŅMM>_8[ol;I:b|n\b/ B6h47?N,pFI'rg>rK]ɨh`0&sbBJt[kݻwn˿+Wl\fkC]?}._:;-JO]_-=so;o޽N-,555CCC??o}C9 J%… ZӵvNMNnݺV<;;{ǎY( aC3OzFUuuee9lZ]XX-(*\)'' ;?7::>e豣@˗\wo}:#3X2,JIDAT.5 MVrX4 4}no^x[;/{_ݻ-P93( |Y\qY#NYU׽d`B`f@`nϐS1 gOd鴸`~=hqJ6PBIz<* 8&VHz 4]hr A@88  b Db*$IQ:}r=*:REMGA0‰vYfl 㑝[qfPr"d}A(N<3(prÛAgMR>L >ahA/1pK3{'ݝ;=b4I@a]SvRr~9s D鉉Iw+N T\RP*'<~ر'=p_x'ft$1 DpF/~xq ~q"+Eܐ(|ȼ<9<[n:6R.EFVf֖-(rOyxV #02:g664 wC`oo|B/^zCC` 0pѨׁ腭o?'O>ph}Ǐ:11𸲳]SӣS}S}=9zR"}:hzL+DV}mg=83 =9r $A$%lٖm[ӝ}wNg[gLbN`$@&l933_b)eޞ ^z_wUW{@41=}CC6 ofcppc¢"xフF)+#;nowCxBFjqPTIso}M~__[nyCSslS(P"sٜP 255?~?/vhzkfCqi?~Dߺu{EyѨccw'Q_?|K_z3j18Bա*%Z'+rOO=܃ߺukee%zb =u:bSՌ N8wyw͛ncFk\Wl$zՃs"kW4ljGϜ{3`R&i0H&K W`!gdz0ٽ{7Pb+(W]+Zn,P2:ؽVi-_zBB,CDg"n28RL=3u|<7?{zr{>{F:b iNM{}=ηѸ|> qOs߾G__?u]ո!28rSb>/z|`ީJ" a5C`0(\g?-F} fK8~w>vGOjhjr,n94I5wE).BR*r,GԑX_#%W:s\o?q7ի ) 0֖`0nDoNgaA~$ #`q=|lMM(%^쨞e׮Y_RRn}ƭ0&LZ Κڏ~ށg,-·oKDbbbW^ټymvw~IIQsKPzinE,&X8xر>OlZ޷Iov:\55յ%.9ެs78ĘHb n8'Eb1(Iinۆue5%EEeE7VhtV_^^WveefK,Q'LYjNi85M+ڜlP\ْPmYiƍ6lij>O=?s֝Zݏ<ౣqu{ч{p tdٺYI4;,?ɏu'b(@$_ZX he<Ώ ~lXBp<ްau7nڴk׮|ˑH#KK87].ۺv3t:"ñ]%L&#T >&'N|7}՞/{mmmKKK'axW] 92QfdL@Ez>4F'?XE0Fa '$d?@ssӾk_s͞ `gΜsw ә:n?52: <ǛG^kjl'>w;}]_򟁇_:!]2$.pvWTBC>Ĕ7kFkF$rP"cH*.JQCFsJÐ! dSskSSB09qXѭoy\f YaVZDJ9rѯ %#.~i)p z2hAc$x|tqdd$ f_~o<3;>Dכͦp(jvAB`8赛7Z}HKG_x, V(@2)G#q%f6u\L&tey43i4CI$σG`4 Nڄ3c¼h8f!E1ٖ)A F}fg7 j9sBoɧ[6m۶ٷ3+#j8ܢ:CऻL]6Z vH:\Vlhd1P2:ۓyƁ@0X$=ZۃW" 777?ܳ}n`pvy}wG77Lޡo򕿺馛jU~cHzs>ԁcccKKln4FGpZzڵZ,}U_'{'p(E 3// fdp,f,qYj9PyZM" 4C|z_[Ww_'Ottts_WrTϿƒڄdss݆ D訳{a%@a<O yD #"`bO~goI@PGݢ#kTh:$=e-i$ h424r=ttٳg׮^p,h,Ђ26Mfs^^D{{$ y PJj.]nZf+..F)EXyB&jY5Z5&" [@Mt9fEѡF"vMja\X,S? tյ1 uu< ce9yFU3{&eaacqN}vydnmB#&/b.D.8']($"]XM3)cS990^%X0 \!BF}$! 0?811}zh`:}:TTTdger? `"ZJ3s@8y *??crrk.+;fDcQt)9Y6iw&>zTo_}W|gv^f"O;~PO_@̌^^iK^fiHhn7Fg+k[_upNkjtwvvBh]]]M 6lLkD& sM ͇޼uCvfzWghR#uw;p\cYi olbfdptp`_Hdʜ੉ɱޮIh+(*̰vv]c9>s?>5=wwޕv vcaqtphlto`hpaifv:XN<Қwߞ̈́ (g-ȱXkK3O?36:119rɩ.۹nCvYY]i~! ā'v.;wZ~ {mT\'|Vz{z_{@ w߾j7= T21;36>>tZUwgezΟo뙚\<~ěGNgl\S^Z?vL(ddžzoVε7ܔ[;4=S䙙ѡ֖avfnﯯ;w#.k֭e^W'N-.,ر+;;G`$A[[ۀFF&Pmm>L8\. _p~ `Q7M.jkffΜ>T\U]O@TSZ^^Uy7^ZY ѩYe\LLM:tt ۮ|eioo_X8srظv LBo74ojVx~~L]]KKKAA͛rsYX,v/!lB]%^̹ۨʁA\n h&'ۨKFQyL%Ɵ5Z'0oB.]48rW 3imwL@ _cTᗋbL--bvnirb:''?7Pյwo;Pg23ٖ}1EVRNv_>㇁S)Uj{KR >_.܅mrmr~9&O  (-+K؉A>+ӽY~'N6^VVqM7!|ˉž8v ЩOvۊsrmN:}ّё 6ٻ[wTGGluYiaANiYs @-:+0+;333r8]i7xvڛnmƍn# uuomGO~ǏBK?oݺw fggݻoǎ<KPޞH8aæ .{t cr[k;@ummym sLd9'tvv565OLt#ֹNG7=\ZZu&1*\.8VqWZz7Qdp 6.Vj|# s NO7+##LJefzfh`ԝf6GH^^̦ ʭ]JRWصf& 6i2$$MBo֛3, hh~anph@sm ٙ9Ӗf4jhCyt.;#+3== qE n3OM/lP̒||d~fX̬L;4j,C=C#s?/JflV-bxhdrn>uI)9Y9ZM8l%y%???-=a!ejz0q_R\KU8= sP(pX].g^Al5tl1hǕ5===361Cn*r.uh1 Ishr2Ϡ 7+;eE}s3x`,̴t470 dIa@u Bcs shnwZnvn&<>55;1[XtمEhVDƧgPvǓr;X/TEpчԪJM٦ ۶lr8l48zoMUhq3 Co>`NhwMM;p0H0@1љ/(UFkt A/Xlvf&mD)b`WcʓqY+c1DS`tm gllT֢6_%|nC-"C7܄H{t>SXVZp:lVov%n0: M 56C$Whp(N2ZIp *ANJJ OatII>UegxE@N,T$!5dei\b pND+ql_1;-K#Hr"[BRH%" x2Ij#(l јcʦ~D0qT ?Yd!O,hB`eшW 䦥`Ef9*Q`\$ħE7ŠEҎ K 0ɢqWUقҌa0$ad^ huԥ)q0:`g,;#nbx- }< `c"/lc0Jb*$$Fo*++)؆($u7 d]04 Ͻ^gG•qSJJ%[F!@B#ŵz.O&0*L*jҡP4!a <$46%91ِ5񱱉nnH +<z#.Qf4뜝ODh^Nz_/69 ]BLXtJ8b6Ptz'jP6BlZ aChqTw\k@4|idZ!礆W."brrrhhxvzFL/Q|'ѽ@ߨhbli|VTfh2"M%NE-@r(dBAl@uG QqAO8[/.H q >ԁ^{}|b*,^C0nNF_XyϽ8Xĉc'D`>A_72фFAippb08ԼL"0#Q/;hĨx4(5#1^~CN̒#A19fE`;# A2C&c?ucspp /FSa 1RE^09n,0 6+p"S:g$վD@pqIZꇠ"zqiH1]A( Z]hRiP\T[" kS2)XςUܠ˪K$Dt Ofxղ!0Ι50gNjڈ(%ՐB9PNQALA746B Ɇ(*EM! =*Z I#dR2@#t:GY0Un"Dd ta{D^J&Ɍ+= (1?4vpJ6 2K~1#{d9,@q$mȝDQX^ "f6%WkQJnp ) g5$llHyf LP]=!Vˆ˔kQ,/%q3u- 5H/,@/ ub-..v\N!12M2[MMw EuOEOj{O>ILf492⛛_T7OHdt`  L"iH >D~5468nӎQa7SK K qcܜ V^B`bnG\ }( $sEA/+.n"0Ћzؽ,=,DHɰgPp+c"GkPdÆut"/r,3Mz~; $K&g&Ο--詉:܅n'H41'GlCDgD$xe|Fd0"\zXUXJ{`n$ vboıhe; װbYT z-ZOo_wWl`b4&8xp6˩Ġ /L']#>ͦ>9Z v,L+1+b?T\Tj# RPrឞtU@Uw4Ihx@wED-LLLd So걊DB/&ᝤ!0HMOsz 񊈼M:N;/s())TUYUYYYUUUZRM=!%T&$.%GAԫT ^;oCfP)W+[QEFᨪāR܄J]=:/8̻$:ED$%8[o{J%A_\ .42n]]QQQ^V W Ed4ImO].EV .hu35j`=$I9T=O%[/]oZim6h#k(C2W8kFo%hg6_ѥմKn#zil|L/b1hhcI,ApÌhQs4J@< \v1spa(k2*> D/²Go#+A7dybrܹs#>#3d?w~~n1 GḬ]Y.N\aægf’G ̉Vi@Q(_o\A:pH0|8]xIbU%Q BmNdHhT:[\L$dBӟDtT-'сDAqz1~z]RJ-1~i 6q͵ܵLMt REwtt=zbppu[Yٟj2Z fPel$\!VJ+p.>$ Tn6|-+qDAseݮ+ghPĔ EY肕F]|BiHTmݪc?ϫ+V.W] k5W8YYˢ0& ڞC@4? ]HN%)ӡL9V" RE3Hq tQ%&]aV%{#g-:|jDٗEϹ8)D,>CkFkFkdR7Ym|0zeƠNlQqE9CX/0Z-HMb:W4mP$¡t@*T\ʠ$H\V<.ITUU;91?'Ri5==]yk̜ KJ8*"sss `^l Bdy Sܒo~zr CmɘZX9"X XR8Kv:q X|KK@ FN3Gnܾ%X@FE)لEh$q~7=98?D &3(åCfgC("* BDic1e~#,- _ B/B A\Ŝ `Z`>XbQ3-BֳAfeHE !! A1Ң/ 0 ?87 09U.%O4"| >Yf0M;] #hv :`b4VMCIj;@&&C̰`5^@kE Jjs5d UOo0~y >>"ˉ5JGk%!sȩPbIUoCqIw^*彦})!q q@5I1E *V jqFkFkF???b6AJ礩āD@֋  k&=M9ih}CuunNXy_T5CшIWgqڊU,I5z}osg/ Ma!{: y|N[-ܶ0Fx ګ=Cg6'*^z7[ڻ.=7?4}iyه}_CxK[VLO/pd4YmVAMOOK=3X{' ?|c~js&Ahv_}^?ה,b{w.ͬ{'??z7yǏcZ;wna浃/8lWĈaOz |ZZZ}{f;F#?q/x!СC1+hNPJ4bN⒭'qCY>jh+y5/ETe\esmȒy&AOJM C76jRE^UCM-zyY\T8bNQeEaQ~.j.x,jŨ5|/qLRo*z@ n.+1D$q>F[B +"+UT:+G$*WFk@Z&ksW%:ti5-ۈzN__b&"0F>< C⩒#Ρ|>@nw⌳$loo(Wewvuh23隖'{)Q j*ˁ545:nfվK%u޽@Opn^M<%W=#hlݺ ۶_)ǏcYYι%z+k|T4a}UYI7*+Μ-,(޺us"$3 Swٺy$ 6o~ E(.__[ Μm1[9ڸO?Ņ,/+s||vd.ϾovfVcyg9mTVO rnM;3 %+gx^ـ`Zy晆U[.33}dd$ɜя]~}uM%,-[gee\fC(V;48Sϟ(+_d57 NݳߛOFzɓ'Ooڼ biikF m999~iq^hA`a8Tϕ*c a-_ &/iM N5#Rej.i9$i*ڸʭV5F6@R󏟃9QzJ1sC%ձr)"% @<+?EI Ĵ̋>.rTܲG2-A. \HoϦw / FQt8u*HDO-{8%/@Bkf~u6x".D"fn*EjJ\!$WWTTbN(ko HEB*Z=&fhqءK2LVd2qKfED3E YX& n7 \]~/65ÑBբg,qGϹi7|M7O곟Lvv։ {wo|n{쒣4Ͼ}{?Ox_;==.[[[n玝wSEEC'N|>OSX..,>|j^g>njOss3jޱsgQQ-7m\ZV6{nN5\sӍ7~w>(r8FRmmgϜY_nw}ݙ QYٻn[n,,,B/i=j{5^{ ^|ym7ހ[f|K\3PP @l9m[~(hWW4TSSyč6TVWA$&jlF7-eg\{g>y7щɩSG>ܽJt1!؈zz{q]wo[&nsMM[n#L(RNv(i,6PAqrZm0+Acr0O.,@U%յW>!HuAq* )l"w},yGJaޑz%u Ϙ1:| (K- C) %Mj䙋zLE[+H=r)逫/gCaV"3PJ+NڀYĊJ $Z7''@T%ġ^5Z5Z_ &;< ~&tp:gA?bxCjpl{ 3v;<&ގ"᰺D ˱h8.(*.+0`hpk&` ݽDԑʄ? n| 7'wtdxfv{733#// Q7F#&ƳH(S333E%^oy.X\\믿ѱ W'8'`PVq:6m@0h$VWWt"e:ZKzz*lܸƴt B|,Xm6Q\b4fee=v++-z|KKKKťcGO:u CaK BV2hA))Lեel2 6LLL%XeQq j-**]W;77UUd(JО-2-E55*r*=4jBf$2eei1 yBt͛ SB!VA*/+˳Zm(˞={\. ::ځ^>Co].l6YQ:y[t|`h$N,VmM+ "A"W$иP(i"H64W"GȚlk(0 d7K !%1 bJdr0>$]"#4"aC<5iӂC ҇#BPENohrs&:6؀=nxOt iKPwLeL |D8Fͪ6`ukEݓ҆Ʋޅ("0JJ 4ake2G ɣCpmu~lP& BF YC,|BLCA|ȂkFbCF~;y`q$2bay<xSXSoKph%ծ7HzX/|>qiI`6 6ffP*U,a`q1/?? ?77'GX? #baQavVVOgGW{KFǛ1:11MfXL sC]$ рT3z:wabrD/%-- 0kBvH-//ٺH,vUii83x̙3MM~o4ꫯ8 rzhiܡYVFl1)Q\5i&af XPVxo}J:ֶ)rҷlq_}呑a0_Zjjjjkm]3KJ"1+,sVsi*fC0fD+! 0[hZ<5ss3 }G_.3ccCE]'ruu5,1XlY_ZX>Da~?dZζ'Eu>;3kmiic~_I!wwvOMMF‘PP4'zGa.,CR_\! I@P8~hhsp``a~91>0D kPfܳhvNn\ ΁4=p#$IaɍPՔ@Qv@AbB_P[k_]FU L 斾~ryaoOTvuvon@aî&@3IM0[ЪYpո#< -F% MMNA3ш| o As>?ӇILk tu@b*xC Q-784:=1@BtBwoo{GG_? ai. =3gddtzzS@\8A# He$NC(83=>?> $ЛI874o􎎍bz &@P@>gYQ&_|~?djx2&H.h>ZS5}応KX+|~ 1~@{@All݆ îzw`0^ڹ8)|bjj4, wQ>zX<ڤ#lF+/fU9H%HmeEV Cl7w-kK ߑiYeUlC3r$rƆ̬gϝ?ơ) EŅ3g`uuv>}zig0Z6lX80 \ʬLe E%ZM]==Gx*$sׯ񦧩HPPɓ=ϜyP[nmut盻{fg~)v< o۠M͜?W]]SVV >z䱓'D1ўWTdfKZԂN-m #&;\W]e1;?qeSǏ]_+'; xL/-/Jk>4ٺm{vG4`]/j*i>_o```麆m]LfÙ3[eE'-M'fadz ggeLLwv:ubw;,|rg sfgc]WdfWזCG55~:( %ݹs6mTRRc  w VçrP4ibb 9//dEUUW>7z_|ŧ<Ϝ:u ?O GKgϞM Lm4-C{}]jvV8zn[{]OѢh_c={_z'ɗ_~okoq{ffz-V,o`pp4++a$MM=} i[mv#ʩS~;}駇כ[|rr׿Ol" LsS~}{<ȉ'322Ѐs﷾gyv7=n_ߟ{'xǏ C'='>Wp9F~rèG~\9C22 {×_~KL$_зd}VVVVXXU, ;LSt-[l Y={^wu]mvB{Zov_~`Vr,=='Oԣ0=LIs!Aik=PYiYiiYKK+nj7;.l fzz٦ނ˪sLʪt(Ki^{5UUUr dnO_ꫫ`+#}pK/P޾={F dffwO=W_ Lۿqsn:nhMMf}IY(&yGGPꪚP( Tx|gw8uSwOw}Į*|G }7^;/] r;?‚驉~;o?q]6dm;vsӟ^WUQ\T0<2v:vȖo #= m22-7r˺uJz Cѣǎ=zUW./`Q Gګ}?^(;lPnM*K?'9Y@?ح~nYxk3O>dN^Ѿm߾oW_[|-bZ[Mm޲mkjkk7XTT`@ VѪ'9(/NC$3Mfy3$cᡇ̉b4*5tk8 jnj뫬Da6`;ވA #1AHI0hJВh$63;&jR5SuNjxy\n7,3gR(A D 4ֲgܗ CԼfN)ʕ!`0 ';+u\, H[-ЙVX[L*6dx\IH B3L (Q!|τPՠZQHDzpS5mv7#ػowlÆjj1"'@;ٚ_8>9w#(^ }'Ϝ-(.LXͺ!5R3B&sȹOcڤڌkLJBZ)5ShV].x Fc~rsn-rJ jzasfĕp_QaWVV8 8$zx,3k[v"P<V5)A_UU~{ fst2@oךZ}Mk5VKjl7;=;0O$#QZ|E9*q bv9]v-;',,.Yhl< UffvԙЍ6gmp$#4DBP RZRQYYюVx<{ssK\NmyiyNv6 nݻgOVV;)ES5'W];n/--u8hRèVt |HlVgIIlu{U5z85XRV5#=tͱ.U\6KO.q{0 VU~R4cJ*'Bh+0,͝]^Y ^ȄQy3 SQQQ~~$@Ja]hk^ }gDϖ{rIYy,$X5zD b(Z wqa^O&^JZTv-B0mn8 +.ar|x /@_ðq!^gBWƷlKL#mX ɋ29JĩBtdO%q+6d!"VRRVu(}C]Dd1WXlRZZM7_WUUi ɖE}HLVUN̍M"H2khoޖ+J,>S<~sr$M苪ݿsnqN!Ƣn5 dYT_~{'+*f٬-e &+./ ݻp<Ͽ`Й*˪SZ;ԝn^ZZP^O8qL^A޺ UIDJх&CN5%3M'}x_C7m퍁v|3 "P|@4nfffGgfFGF&O>dUQ^PUQ[+Ѥ<}Hߺ 50 [l.R_Pac̴I L"C@Zq,iczqF-/pj,!KX|_q&yNVkvG7mfw81/ >_0fdu 7zUWgyxWʃIpCMKP 犌GKRټNdY:Q~뢸%/R/ H[;&<_RcZ+***J-~gF+eJeʑwS?[)3% TJ#խTA$ tjX,mo+2'';f6jf蘫YPˮ;}&2 cO`<.;*jspg._dsD VZ/igf&#ٺ&YS[SXknN8cO?{ugH"u/..8y@jrs3g^}ƦLAQn% 8/𨤏D"@ݮ_|x7822;w^GЊ7xh2yNFfj>ySKp$r &be07&F:{'?dln^nMM‚o72<:1>UXPTZRj[/Ns8[n{Gw{)nj>rs&'zKJKJMRAV;w{@1ѽugpS2%-:u'͓y232bȓO> 4CC+>OObxߋ&SP*lX ɠski`^j{mO\jqnhmiypLf-BJTl4hP8G<6;R_!GC3SEE65 ;qyǎ^/hTSheJ?T pELB|0@pђЂMzװ@KV'& UB\]Rq@pυgh5 PPd}]4^}wVqH]zI[dU`p`+Zb4uZiy5%Kk*JKˊ 3F}BU.h9?hbZh5k q *.$"d0#+k~VR nAsrWii7#-- jM<'>/_~鏿{vsvnnF8Nc ubx>?7+/!] |Y>В/yӳoo/*k].dk%~s}W\}-7~[>[ou5tI{JʆMos ϷBAX xCvoS0<#*_2G0xܲ,#Jqq 7'? q"sҡ۶^DήҒ]}zC=f0Pa^ cD ]۷mnnnN11<4ݝ|YaTe?%`p\\s͟~O/Oƹ]vn߾}W]}%DwwIkK?}_y՗O:1:2&яgſ/ޠޞh4RUUU]UuwoݺcO=$ݍ7aAl𛇻:P;`2hcu7G_XiktF; jHdY #k.pqIɞk?SYQ G>yYYiMM f}9|=[Zܻښ {Og[Cc{8kmilkN($ zA8`{' R30N6P\K=VBړ^%$I};C>{d4$q,Eo &qI6p6>O>0S^^}wmTS\T =9wЛGz{+cyeEQugO8MMlٲ˶wu=v\CsSuO>q\󃃃[7mJFannndd+v_uՙb tzT4TqE{6(п5449}jX#KKK r]'h$66>jwXrN7tvNML֔W: oz<4=ny$;{b`p`Ӧ]wCyyYn7-=- g~zۖ Oi-D460y8bNP!fص[n:pK`L7ZVI<$uIt:rR% h$ B@29ay.F!j3X$MhQo6NR@ԛ6lD&C! Mb7sج:O$a4e4D4f'_ P̖|>$-VlaDY9|5Z~bWW߄51,-%~15!G5X@uجnf@z6`(S`]jX boV Q) 06t&`:)GxRjd=A23`GK,/^g濸+故٥f8f*0d ¨H" KcBc46FI|J:2p~NF?_ƃ逤0ԁm9AȯΓ`,Ā `@8"gՂ7k-ސ"3 eZIIn\!؇7|{>ߞRAUS?<㟕Śif۶m(b&f/V|N3 S+{p w* 51ieh{tʂê0[_Y4HGR4\-Mвt.#'!MH9uh4!%  ֯_tqcB!.fYP`xRe]<`!qD'z4AXaQ8lU+SmQ ԢڠjAn![GtI)q*5 bOwOkK u` 6ȓ)**ib= [qWu~S?ePY(Z _sDPBXUj QQd`(&*'A DY4*T1ʈ" R{Iqr F$GcYV"?* Es9PQaq`>vb-aB%imLތVdOdCS臃!TR3E59^6h$Z Uuۘ7oސJ,]b[oa5O!U/톎یtCqWQ8+A}))'RV_Vo`aY6U6-k6uMo?QJR8 ZcZt3& 5XHYfQܚHm}gmʒtajE`BD,a[t<$4 TB jVoi`!G~ R+BZ&R>]+kUAӎSV*5!C5 6~x?drZpa!1NLxJ'! IÛ }]&6iHn0"" e0 #wħ(٢ rV#Sb-K/KK#c^6H dY:,բ;aQ$VI?B7{XG(3z#+7R8"e5y5ee,0| aW?UaI @w)A[כ. Msd.%O@Qtp#_]B/0V A)T;\o[ )¦Y{$H{ \BT%Gerئiۘ{ba5HՋ,bDr Q*Q礕J+Q9A b +puhiFE %4JԸ8Z"EnZ..'cBkooج&E#Fv` &Նq!%00. +PtE QUcy) Gj\Ǩ,^*HJ4` 5J* CfI Jz/>6~x?kUa68-hр *QmisJ7Nh,a *m^$wmȔjFjv~h|hIHڤA،cXKtL,fY12mgB,d~PDi!H4"DB<ԌX4t*A|?(VT⇑y'NѢ8/S`@`O{48?O0)gFڢEjNtD/\$2ޢzAOՁd" #]NSL DT}W"a=ʼnO[~IB2(fN5@|.$HO^_wj\8d]h.;*23j M4N9@"zSfiѻ#TJ mV۰Aa5HՋ>PTɽ+  b(9Y10 8C=Jc"ٜJOqyZA ?=?כus\9y[f5ٛef,keMB5N}/NnceɌ`4џ={.R KEaĢ+<^JZ4܅я }[MOM^!GꐠA"+|XkFoOՁ߱%-m8P Uf/RTTC\* |Ezznʅ8Ws-Bde Ֆb#nzY! N@`4(^!3[ ĴšSrƃ"ml0[)]}IE<>8A-8eE(GAq@"b4PH XKeM$LHS=R,L :/`*%J "% fjFkOvFk!&"sXPUuTgWѐF\ptOOx+xbpe?NhIk4% R Ia2h.%PZƱta'h_hͻDE7^Ost;Ѷ%'EQ3WNqqʼn T"⎰|Ia$%H1$Uo69nq-n`D"0L@ Qra7WqWF:LQR#,Rn@DUL*eX""OD !B$4UIѓ]VJJ" 1MF` !L1Yn# ܔ S)XMqC* E.";#OeH5p=#;fr+Ra'VQWkF%Hh ܤۆ6nڈ Atm?$fZ,˳CCC@ & w1.nC HBfoxrahbڙ3YZI9$!>= |bIЄD4*6Ώ]*SfJ͕Nkڑ~uK̬4ˊrȑ6ǭĕ-[h,288zkjj:QOO546O͏Ou5HV'`ɠ[_lii::82k`) bD8$'&sr˼W=Z$3rtzM"c( [fb* -Mp?|T&-KTh/.pir9TG  Sg/HR$dHX{-P` EK#qg_LQR"}}NH$p OYȺ MH_lƭE>^5A'~2B XX땄F?Jηc̈A!MQPY"❈X@HSLUT/R#L$ DzduH$2ҫR8`%ʉE㊀$twNE``@.vVdr nS;`E7-f!xiV\ U$EVA]FbuqqU2i&!8 ^(fC L zP\: ra1mQ_S%qr nf kHT:^_SB/`=<̥,E( A)oqV4r kh&&6McpJt:DRgM z!`C5SĆ|\rO^!t3\666;mjjk% ؾ0"H0Y-%%%ni1euRiLS sKe9@{[ZZBi(X!$L40VxbDrh|vbfL6 xSI MD"@ K&E#WYFQ3Z|ڑۯ\'&fJ ]Nd|A7h6-.-TWWUWU'Ϸ  L"Pwo@PG#:7>pcpb5w9}zag6mV۝‹Ͻ}C#m-M!Ycue8o˯tmhE#桃/22N.IHIM\XK5C@A"d*ۡz9 MZXPjJh7Bpo?½`y:$U MDH c q.Xq`35AB>ANQHJ֔a"$> chE )|A19 - bJhHQL,=zd ?Xp>#`՚ 畁wIF׳#D iEE^+rFĢ?uD" /B/`㣘 ˞Ha$ w" I#"'E_`LѠh!O.YFG8A$K#+n^EP[ .#n nQHh 8H@*~"]jj̕N#Nؚ*QZZjpJC,HbYsb mXIb` C>b`GHI@#X'1rMĄl6aL[W07;80eK=ibcё)|_/dFZZ:f`E‘E_iYqgΌON.--"Qp<5W_}; x㍂??SW742~Dcw;4'OTTU}3/~?RU a!4T8D'zHp}m1 vT4=AP.Q{bDvdoGDtШikbOƄ`l)߸DxHw C&`UAH)W0kF0M1"l $YrW@Xf*NΗ*vJ h6( ĈnFb ^B.L؟7nR`Na` ɂ(*ct8Q/ܰ!mH-!nAj|$B ZJOǏ2LOY/J"4 H|➚ FJ{&DLR"|El<^IXLAl sĢXXuDTNB+cQQ^ (Rt 8ꠘ °bH#&!ABnH&8lqz(Tt)nH P":b ]& :vRfJQ#qt~``%m? `}>4̷n"IMR2#-D:J2+P"7HX |D|BV%  ,8 <Iĉ<e  |(_!"G*qVO .{hh>|$FaC``CHBL^`$F>FXLòǰ%#F8U8*#NVs:FixTƀESE#q g za@W)F >iMMM57NdfdX,vhx9awxӣP4Ej:P.5 D4 AjJ4)((sv9 zMOKs\QϿ} Ox8[W7?74 EERE\_sN@M],+G]/"suLBsb @?W1lhYO.Kb!a ]d :"MGha%'V':doO o ց%XD+,ü'`c|^Fi|̀F/`D!(;# :yS}낄/bDxJB58jz.n@( >a%!U#-J/"7%@8\Ȟ0!hDʊZ2Mr ؍'؇,I|V!]71҆ B̞S+q֟ľİH,?-# љ0s|\ј9u8:.%^kalܸXn:~-yyv{||bhxg E%}}}}}[lݰ~CNnC Z;CiA.7f[b6\YtqÆ9^wlhlAkʁOZ[|PqQi^^^8}\nGqqQNv8|>;707st W噍( ֦ΎtT Ӏ["]X-0 -Eikk+ʂA&BPG0ao#ug|»Zo{z:{{R;?7 GNr%BooO[k߷Ƭ;_Hs#y4 I_Y\,fǜC8I&76?gxfj@߷4ьVY#q]D,]\& hBY) $zI?3==6:f2YaJf G֖>FYQJf;{:@Bf?񩹶1 $klnf*M0X[[ buꜞV>Xm[Pё-}=}]ݐjO__{G\h#{G͵~:B,y& tOΛsX @ R)ʲ$˒wgl}9u:%Z$f  ,v9wvrjvA "ޞ o骮-uvvt΀"mxp ٬f>_IzIFGN])sn6P[׫d26V== ͳ@uEZņjmoj/% Ff0i\0=;<00 E?l1^)IDPm 9. 5462D*")xSKKooo ÒM%xeedt >48 QDDtm--@ x=h$zMK 2+Rz]k߷G/y|m̀v[XH_zj\ 7p ``LF?A -r}߆@{lF>:6f_wiiihT<%nc.q9/U[RAʄYXHCۃ 0B9>6v̅gg}ΜܬRI2MOTVϷ-}uUp֬]>>2FJ+sr$(,IZ[PY^찘Ν=SRZp@UDnt[ݒ㚜z66P?}g?zĹ3gΝ={R݅ 2VDm|⩧O|M8X791s:c?Sǎ\Dv* +?S?}򧧎liiŔ,ˮȑ?z;zm&ۛ%x,c?xx'/C5PE#aftG~ēo?uǏ!'Ox.O<~:3! PN$ss v /U!k&'_ySOC^T;3=o6B7??8qfeefجv䘈&{W|V#;'K0gf<^mmiY22,fI4h?~7q܅oZ7- ڎ c'ɧ_|c]X E/(pSK /pر .44ԣ?4-D\yT`TzY%tN?xСǎ Ylve1JM=GDe͞ G9_=nh`>3-fsC0LӉDi%a׀%4H X84nWې/zia{ یOLi`Lcyަ۰{k*(W$EvXXX)//w\!f? n_A t !P0,,||q{}/hur"۹}?Z > O6ܱAw{iAW_w =+* mUH܂+W{>;]vWWu:rnsHīիWeIp Ɋ /޽{wrWNF ݻb8ug>SϜٽg;MfÖ噝SMwmՋ,,* E|?y'͝{[UY+9v3F_}e={?q`]hIIvXF&ޱ<86:޹f2;3~|0'3sdh e%'~zu+eeJvmpq"?phFï.#!?lކsLMMᲪIp8h6[K6,[RASY\yy_#9'0`F EXH -Cn5Ilysh[B؜G{~sܲ/]LrlRI;7a6imr?Xժ.CQ4TTo޺9# ~ph0X,-.v{e;:FFJKݷjժ̴` V @2!ᑪ4+EUuN4==ĠT^]ajkk:{rb,FGJ3 'Μkin6GHEEUu]y n{{ Ջ7m>* (k ~6;ă:nM8x=w^VZWPclx8?ԙc#{`MMMqIѪU N-xC}מ ӧf!(=݅zʕʪjLo_zO|aѹy۷]]_W\PͰZM]mmfo ^Ig/oroXvZ2 (OY9[s=KPgge(7J]m۶3o޴n=,+|oAlNGaB]߷֭JK-V{n^VZSg^? 4exofٳoueE=]Ene~۶(,**((*(,Dv8Z'lݚ[9W}99PQP51y~vW_ oVYU>::919c6gg})..\gKRPD[[+/'Ҷ+'~5}`;:zz&ǫ*J1O64VTVw4oKkguoFVmxgW'>ywրBU-4 W^y.Q>ȧ{͚n77mbˁ$\dQ'=}O~wضip8;тM[ܹgoMu(Oݰa,6_jhg>wǮ6 }p p޷}#\bK"Yj}+k гɇ H ۠3@Nf{@ar!_f\Rі5hx m>LPb=|"xuttt MOO^<g6P(jAk>U[o%xDhBFd ^GYUuCնu;֕ޱt/VS&?sMQOUoC w/ٿ 6Tl))˰[HPAJqՆNᰗUTeFjEE[m./+Z͠D Z]wC>vlQRV:uxlVu2vVWW쬬;vXy׭ܵafeglٲ>߽aLhf` E6~wݵgڵ. O@p^fnu~ɹ+oPe܆Gȩ&;ă՚.i0*/I--m]%9]=5X@5kk6U*|m}ٹ٢bfZcJ2==#+k ~ߓOT7ݽoݢ?{|~IuU^Q4$NHwO[k}tth$def;}/6y3ڊӽVzM! FLNN5dewv't6:]v Y9蛛ν<3=u53;(/bHٶs_a^JW2[6t:zlܲ~͖T'OwyeyYkӧ9ÓjY*Vm,)35+j٫$Hʕtf"{{W^WS㶣@2>*`0xQѺ}̷4weL+Vy\eN)Sf&9LsЖm뫫|w-+ɩIгҼ|57;o1 [BQ7l\V^aN8R_Yr%t.%ej64v;ھz}ٔf"P hT@[ԁw!IvN)OL?PYpgO޺yÖ- ---u۶mp] P@Kpqop$#+oq~vdRn8% A x8k Q!R5⦸ roIo;sԼ7T2zAmMF?6 rnx,UbCyz0:6Ԝ_6~_^s'PГSш(e̙6K՜a1; \xojgb{dfp043[fG:GsA1)4hN}BIȬ?D(xU-< 3VnxH,!Y-&ItzU0.Gzq.ƷACGdfL^ь"ńCv##)+##p#r݋݁322=OėqXm˳D `xҼެtm4Jfp)Yj0#)lSݤ&RFyDGGgAa3sBa$Fs:\VUXc2郸(MFknnA4yy% #h*Iս{t8'gg:.7\zB@hQĢ&z~̹m̓IYH !crݥ\vq~57'Ǐ?o;7o7"/JKKrRwkO?kS{=;cSȡ7^?/}g0we7O<ĺuknߜetI5( |vѸC(GGZZZ4\trmڰa36]㣓MM6鴱Xm--~bdH$phW 1Y_8744\RR[6^XXl1[^dX|p(#1tuMu{x<|箭e!`.*,B7e6-z K֮gUkN,ӖؐAQe׽~5UidJJi@CDljzRVj$ zP(12T 8:6~ѓǏU8]iWz= 2ZvC&b9f!#L$4|@Z/ҠmTMoX·}2iK.I.iRjh187瓱(MɄƃS|21sRg$U네ꇞG`k *j4 >2)*Yd`0AQam6* Jb,Db25mDDQ0R bFP})[dIะJ$hs jU f6K= ڋC{""`!;.Hjji}W/oo~;L&epBgE݁Rn:`N+ FzM$(fejfj]n'`KSdZaCIi1'>o}>O_=5KC޻v}o..* oXĽ{?7$h`5Cbe%w,-.VI^8We} 6iji|':;Ͼ0<4TPSRR*ӧ/8Q?99 -͗!(CF?NoΝ{{>GΟ+,)ڸauwWo~.MN,U&o{A`D7ow?p( _ٰqS HhfzjrrJJ˷np8 aZz,`bu}{gyzavNc'_|99جUfqfzg_|upph=@C`U!^ LJFE㶣^>)C;mat`Q%s1#PG% G#1 _#Gx'=&:ŠSx(]Q,f3Cf$Ջe3a٠AP_d; nW67=FD0|bXo@Mt.Vwփwm~`}ݶ}{޵26 zYBU,$ :B_ Ts\bT$f ZNĘO$` F!W `LBa21N l$N ?P&~ ?Gp(UpԞr^2% :CT(ZN߸25L~AH=U*ncϿ"/9|䏷o^@c ŷiP, Wp4)'=tj`w8=^ *%45WUWwu555c$SrOˇ=vȱ'Nyo|zj($ Ze}9֞?Ў\ Lr<6 /4hРAۋ`I|dr4  Ma` LЗ9qO4LgtWE*uFQjUQo*`$esą8F$姐O4@2lDu3d4C MQrZP ğh`D t(N.GAU >fc\D7)7QiRi'D@g<Qp< I 1fCjP_ X͡CG>roQqQn^TPcT jb4Q/_ƕE}hA2- @ MqWWWMLM]tɿ~:ˁl2IX(=3h˶6n\~ʫ,D\h*:}tSSs8AZ:$###>lMM?/|k_ZyyEcSoSPhaq1bNV6"{Wo|srs:;A%w=iid6nZOD#s-?CC31oz4i &ٙLPGP2׮Yvڭ[رmժի+3ڕf67^l%;PECR!_xQyBǓڵW?{>z3O=rB~ዿ>vgZVʛe4z{z@ժk?wl]赗^>2-[^^2=3ִd*h"kkU8rDFwwgϝom TxF<벳h:YD3҆&3z,A׬_/i .\zݡH]#u$< .'/ՅoZ:-@6\=.e dQ{c\2hp{起6Kc`-i%1Cف"raO[F7HiG@H=ݧ{lLod7 LRh ʂ0@3B,nTE`N 0D(D` $ +DZp/}P_|ve@rÒʁKƭC)3Q_@<x<'X8ף۽^##P' B{udp-U b1egg&Uyzz:OE^]c6z{{Ϟ=2b -KHVSb:A/+IdZ%{vWVV;~bll,PIq`>@Ou^:]VFtܑ 4ⅅˍW<n ;͋$l2FV3>6966 8h4PAT|>۷׬Y߇u6]4E$`Ksɓ'^Oeen4眄Ыq`Pc1bJZbltr|nv^fzjEު* 2z{zD#^{}ph(C ddfBO}ַGr:̓k׮e{Swl/_ώ 92HŌn?QNtraaIfF֪ruMW1-5:8=.))),?stss3"~GW4.E6n=)).rKKXWW$ыF=ܛoF-UdVڭEphpzvntt ٕGGG&CpC}Q2F1ӫit\ԅR'A/ B1/XZKc'-I+v>iK^jS7=K)L$un ρv' w I} z\Ңp~P`d]>948``<$!DjIDHT|ЈL-h($68z ?$ŜbBBLڊZ/B^i邕rbς^eR#(xlʇI9.Z Bb⚃IybtEr[̂8 8#n)K.cvwH% 8^y̆.YK?KgJJQu0 rho˥iQ-Bd劀`u~]Oxxt@xIVՕU94{PD:{._45127;344t#۷>԰{Ϟ<ЂX<)sv;qMВmXqSvNOP%'f&FF{zgf D[52mfnqX̖3gύOW^jUyF*4`j $ܒ( 7664:6VWWp133sㆵ=] 3ӭMMO*\f}&ަ으ܜ+>M]SMhS}}}=`R0TTŠf.^C wٷy&ǂ,F!PooϷ`1IVa$<^\=VZ:u$` Ԃ~_|ށѱ.lܰӓ۷m+(MR$#m40085=kם֮Y-?7o?9z/,āǎ.,99;3;?3:4r'2sc7}bbO`4&EQ2_if:;;.mټI2$Ϝ:5669=9qSg.ܳ5U9mmmbSC]G[kNA֭ۊsf/ύ =f<}e%sj*3]jn)x W>`q t ãdF=h*|XҔ5;cA'}'u 4ts(eW*8.F?Au U\p8z KԢeneG3jbomt,ZL51xsbmWW p8y4jCEzD$_f *9%r9 2=3;wbG߷vp]AF\ilok=p kkGGQ~ɲ;vؾ}kZkh&l:4[V-O4\o;vsdD55Uy^ljj*'; iZ-hCCԱENv8Q+WPwϮ];rҼ^<2Nl/ibe\KR^ Du ^DNJFEr"?JĨ蒸9 IO%s&1Wxhb!_.[ &ϖΔKgfH@hӲ^|͛6m޴HOY@0 *#,JaM~ buU ր(Pw}}ciiilbPq C&d jfhphnn㜇!//`UU8H$MíCg}aa!<`˗ѵgb!s6kfF&|$$~F'@B<^Ys#cccfANrljbb =(eQQQfV&ҋTA3B9''aAɊ<:2:44si .322 W(yӑ<` ipZ2ZUV!! "p7 9 OHE邁 h$ ! ݁;@r^{n#E6 !LN0'@Ca41GJ&i5d)ҋ 6;r݆zqqAA5g@FAHp,8G( =Hru}$A(_Dސ8= PY&#(F>QtJQ󣣣~!4^8S~@󺍲ʹeÇ|\;kcjjkӆ^(il0\B2FʜJV6 7qR7.. ̍*Ӓwz%IIrL wJN>+vZ=%RND QAUoWRr0۰zs Z#DBzk s (S4&kTA^+ga.Opn2,MmjDtV%,(Q6\N~~+[>7i\- C?$>2JT 6\hLT + @d!+\Bi& {B&SU PsEHU| Ԋhwwx<ņKd*իW@&yM*M(㛠G(zfkMqIrvɄn:Lxfa"T\ KBxReRTh3F3J1pQ%TC[]fP\Bc]B!!PBt~9  H]w^@2 Œ.Q\ SFJ6^)G3LE$@XY3W!/, {ؐ& ʜRAT~I@9b¢RkFï"P/0d664|T7+lV E=n(^ɷ?:R(1q* u>Eٓ]QzmNU ֬ϩZ-J/q6H|Er$ Fo(b/)P AcBg:P򓸡cDIzNUd_Tx.wFl(VfKNh0\! p ٤ Q%.5cg2ȸ⒛qàx-\!I%[ %8 Fej;9'6pC:(-snMkdf- ` ;"Dc(|1w]2z@F  g[gL|M5a;"1PXB ,44ҡor2]>,O(}p@ ]4mḧXÞ$A2f- !,y81FAS)WELw k]% È"P<2`@(OiOϲ{3 =sƙ8Q0VL gnIF8xȈ!,!UBF/)^ hS~ ΰ$*QK4hРր>iܼ)$ulަcϘ/1E=))d9* N72ybD$[\.mq>L[2 bTe%:(drrb(?1{D qڛT& I a/uFI z?I, ~ `@*.|13%e (C3  G>(P4Ad#@U,|@gЗ`;,%@ɂF&# @CAvbCA o3N=i8%-LI!3haIXE*C2UoԊ4r88vȲYib*݅?*~RIQHe7ܐֻ43C 3k$EBtK3'< H2h@;KO'E鄔%iI:4j6~zmPةb.LW/@R0d6]TQ{]ux[?ŐDT*? hrk =um3/:16=2<>:6>::6:<41<2=2:=8<3<2;:ꟙe9 GI؉vJ" z Lf t, lH1Z1sD>ad=Z~ꊝx M"$3p+2E C---I2&@1h ֖vbvFR c'g efJS;-K tI;s4kEkx\'i0ޓbM:*-*S&PY2/59A pI6|>.X(tzKXLdCQP|47dϪL@dxKJ?+xaShI# XD< #9ZJ) \nX&Fb_2Q2|V?1dưܠׅ LX%bJr# x4hРր:]JtL+ Uǀ;0u1Nޞ^0L4(b>4z[Ku`b@eAj|#7]a9H0Y&DJ),[r抚5*j6TU痯J/s miѤ>7(>&lC):5O}mdh=sǏǩ31&~RH@."SS/#GG'(D3x!A#*$ Gh,Fz KI Ԏ  OF(](5 ho b&=6#BdN#N}<CLOAA"P D\U K$>a0 ]z*=:6sϝ[<W[W 2v$wEU=ٓ#:=e7S,>) |V ~d3Yb@X13K 72ܯt=(C+pRX%G%!08egD9ec $K*c-GЙpDz(@' ˸/^r@ PÑA~ssSgwUATAO(J\NCDl' HɄ`Q #[@-sQC%Ʉq$?r~ub 94r-šz"G L,Tbph) {{#t i*3x:_ @lrI B(({ O  mTa1LQ;Ұ7?!Wvf W/W?*nn",VYr{xepF7 R< 3yٰ|k%E|'pIV v9eAJ |!Xg\ˎaf.Jx2{ n.us~%DzuJK/Wk``YYnV=UɈ?݃Id`8 LO {PĒ$&_`5 +2cD 1JlH'" Ppzjzfjjzrx!0"̷ L#*CD|zzj~Fàg0808>6-c dDV =cG|}~n~xht~~BL I5SxXR6V.4hРAw7Bj 8EzzzKvk^b:\RRv;x(PSU ~TrQ5br\ "zƛ{TSr)F3%tIY&,$u:0/ĤU[,Ir{fZA&IxY-LqX&':=*^5^z?~ӟxtlB?|.tt]iGNh9ٺh[UUvgW^{҅n~;yǏԌp9ܖy߷ؐ111k+++!>iYCTVqwؑ~'w egg9vbO<|o94<:95vլ6[ċ]裏ks|fjK/4www{ΜLT/~3O?O:s @_Ћ/Ή,ip=w~uwddddggJHlP ,+аX!W4<-SQ9999"'LQZ(×\"j~711xrsS_fu39Lw%nքp+֠t}H\i=4T80[&}jc%GofK+199f21T"B1K5xз0 >@קq@m4|0Ej f(-Xac IPPApAY5??Ͽfdx?AMHei&);;vMLL@H[4cޒiMj2$c.ªQ QYƒtD=m)$A/)1rCDt)IwPINqDlM5ի57;{9}(Jbtȑ7m޸;ׯ_}=a`.,*4-Nݻ\.w0=`||b2LMLE"Q47ڹy֍6} ?::12eŨ$ jBX\ WƗ_'QSQh5t>7 ^7٬lܱcЈ?$pCUFF?ԛo ‹~Hօd.I0Όׯ_  )V~aauPYY ]:}TرG݋/.,4Ԭ͗ddd=Zoͫ+Fzc0lظ9;;G yyN+}4A)c m_+!ȍK?O?t[kkKZ̖tJQfD544WQN5K:sKn9ƼP xfh){.@?X,/jРgzJ]hH&?!jETWb\\p`f%x^z(M=%E+iС!Aw !.:;;fmw6h,I0 I_T= ;1#cc`po_쟛  c>urLcAW@-!h0NV#ٽyfaˡi}`!)'s*{o|/o|׷mے+!oդWF}uiQ`fʥQE/(w}SYh7x$ K{M:ff0΀,wlku E4<mmp=ܷ{* ,$G$QШ7' ]wݵ vgRAr0 NLCh>2??HVRyS_zkHRjK/'&H_ިp%.8Iw)uկn"7_ Ѡ}}T a%0ШԷu["3l,o ;r]SR&R\Aj@_WHLS d):`j0H2Tx(A+?3 :}<glyyy 4jIb-:)KbA%&uĆdU 4B.jZl[$#䥛 j4I_IЭf*4E?XOȰ,[n-kioاi J+ʫ.^7=39::0;; dooT(()*ϞKKϰ5UW/唖VTOMMU,fdGGk_p,[EEeaqt嶌+WѶm[lٌ!hc㕅IT5dkmmG0x .}>`07qɖ9UPP`6T nGpؙ5*Rj!1l"2*XA~>g)9L8#nO;M6sG &OڤɢX7W4hР lؚ6>';b}pvܚ>i_/`h)|ј57ؐ2xԠp]mzI5aRCXOa*9`u1[2qPjB?&To ڀH!v7љ۰7 %z`HWCɨa:>a>Z6SiR=&jv@eOktI+hr I(lr ?HDo%999=KnnnAAY#׬]iדYII ͛nܸjr:EE9n+# tWU׸(dddXm @[v8ep" 3z%JI_qeee۶m[~}UUl`_\\v$gםwgdfeddxrs36lXeU%9 >ȧ=^gyyݻ7mژa2&2y=ʪJP<p"!bff@@l8LpH 'wuWqIB)reJQYWq 4hp6L d~S# jˍ+lS7X?ezg2F[4%AV4gEŨŷr2؜ .E}4VzidnӭKB;*'p<603D h|QMF"P,Cz)/_͑zW-͠Dh-&yD?СqFȐDMP/!4BjJoOBd/Q^%|'>W=R"@(E@mPlQI@Ez=i%o+A0el1SDAr:tzςwIݦd*I1"$ޤ%tz"Kؙsgߺu-RͶ A1"qB2qEvOnBeGR*88@ZdH<_d3/ HKߖ.Δ[KgI0T%Oyf {V;?i"۝w'Avt644Xnڴj BrPmdCڒ4hР?J~R?33__h67nX8n`BqÎ!XS8t G0Ґ#CƁJn4BU1a{C $ <jV2teU ?%2I&d4^gvv^$yX K,gCnS5hРA 3H1`e֠V@&fN^a]sdfD\ODe[^_IafkTKr`)vUe^D"P0 Ņ/8E^ İ(Dĸ_,gfSI1MB?XXYD W\ ȖX =$ 39uNlBdC鏻FI^:ZŔxABD"b<yfz^BPA Q@*A@Ȃ(Gy(@67SM8`IHxBup$m2]1\@XCL2Re eRs40E +8ҠA 42GX5),*5-šPyI$HDjZZVAsgR1tq "aLvIw^#k={V?lώeUy9tgqfIJ,#* % )،$$p$ؙ$AqI0Kyt;\WO-Ax[ O&2yN& @U Z hayeO&'2%yS~7u,p)o~pF$I^iAݢ!oXY G8{ sG|0YfiR4hРAx֑TAJsgNO12$ɆL'[$2ѠOqUA1QxTP4 uQƃhrZbCچ&f*I! -(`!cgĮ@H4F ^'I*I9ANb4O+TWVKDw4D1Jgrj* G2` WE ҫB 9%2DNx?PZ?J3s 4hРA(%\٠- _,iB %qhLчLfNlT~H]} `8r2Kr͢5Mn3Nn|xi3%a!D<Fy< !O4;7w7}_;/\[KG0CBKst</. zXN@hICM Dv$%AQ T p ABHJR(JöoY [I:՗^T{yt|R/L6Ő-0I!F(&m`kx9,=oӠA 4ʁps5ei='w?}k{injꁨԔ$$ďA9!q,= >off FcqJD`4ṅ(zh+Pg}ŀ/ @߅@8`0֛PtȐX$ A3327ȐN4j2烁`<QAhtn~A$} >nA>ƏX3R 4h%e4]ip{aY$OUCN$Pa`!ϟ &`mV DkhUjF8mv Sc_Kb"HDY%9ef765reT|<%;e2I fnHX`UU9b6GG{/xnjj>n6w$9u믽~鮮n\FTh tV_\cŠfs}!~|JU ??++ #  hi@;? k'9Ĥb";tsšA h!56]B׫(Y/:a&5; ),9wjrKzzdwms4Q^ _'ˌ75hx'\W[^^_V\/Iccc}W(9vӧΝ;ꫯB^/24%23]&E"IITbG&cNՅEoanN%]&]4 }s >lhvYpTd-8VWU{ifYGCϜ켼Et[,V͞f2`ƒϿX4>'N_199+676u?s՗_mhhӛ6@6CO$l @dC| Fѷ;t g?[#`(Tw[P/Ȇ4t 4hРW M [4V H@:7,akz?U+2uIl۶vwvvCFs!@BHcDldYgtD^!zc0 f!.LΎ %h IPﴊkKq|WKsKrss?я~ i鵵6466}s3sCHQ~~Q2C"g{D{җ/#GV+l>x>oTɉbpYgvMpJ%u+1rʾi3ԠA ?ˣ,'6{4UDdgTٔ51njwK@DBbm6 (B~_{p8\SS~J|@ quʕ>L1QIm XrztkbMlvlhj2:379SleeRqŶ8`::(' + COIОh$j2@N?xVnCQYY#++pz! ]IQwwO{{?6>AoPVQ!$Q$;wܲuKFFFQaц,fs8-t=##Ȗ>+*ƦfglO׀%I7eeeA! 788ƦFGG333`OOx$m]L#ʪ6|hРAw0h`*ϡ-{7= O.YhH:Ś4_ClhzP!={m۶iFNԌ kE#1%) }]FgT7&𥋵j+VTVݒK~ I2yL&#̐€N#&2£2 z'@, 9vd{r" G}cG}}~aQlr8ٹi 5ld$AFG%[, "XfXla~axh䉓'|қn: cc]Q(,.>))dgdfm"dE^\\yz'|񤥥}(,$oo_{&H64hРA 4r&܆ReYۭ;wg?nڽ{TUU[+D8'FLG{sbO*>S2N4 C1YvH*U("J"&TH4yuHطC nY3??o]z5**{zHL$H AȽx4-Eڀ[ yyywm&׿o]jjj>{ +LMOK((ޠ4hРA 4h5- \e0-??͛79l*`I`>ym %H/̈hntfH,[ ^2&hN($qYp+ l@w:;;;+z/ ⒢,ɨO&充9Tj8&#eZeٌl [qQQmFg6 ONN.rCVMſA/i;_jU"onnZΝD9춒X<-VkaQa^^ۓvNg 3KK^(d%_^iyx|t,ˊ H^o2e:n;ATx?6mHEˠKl4hРA 4rLh\nݢG]@$#CoB/n2m6 A_䯧sFoV274})I<*e/)+NDNAbY(z }@;JS+nX322^K;zK//b8ڿޭ[=Nɰ|@PcSsKJA ~WUUUTTڡg~܉'"*ǻNWEMip |N I15p칦Ɠǎwu(rĦ0wvv̙3===Nꩧr\0 u׬ۼe{nANN՗),.Z]^;904A/]$#GO~ /ҋ/^|lӦ͠m(>(Vbꗁ_\cŠt}e--yuv`yT]dKh{@kРC!56B '&0@fiS8M%K3LNNk㤭- ~\wEB;AS- "$9ia2 ! Ԅp0%w0݌sU Eó3#&\j;qW͵ZfHd}( ]2^f-euǎ?;wfeDĠ;uoܸN7L/V86ѠBx<';$--}q9wmk 0]*ρ?w4jpB.]^W[^!')p"XKbmūjҊx^B1MaoHjċF . Zj{c\ hJjq'.^|_|=2L/A( H1igZҋ:xl]uɄNg:0d$X hN 2IY@)$ f3=8@l"$lDސ4V\C[eY-&D.MPbd:h4E$n6^oD`L4DyEK&#(a/ЭTYBiFGRSX:HE2,dP.`Jv&K0~3Ȁpq7]q0lS o{vp jz4hР>B)h͠_2QUMMMy6ElrⶆPpb|BD"!՟ę^ (e0.4 |>D8):+44dITi탖Ms#D `dK< 7>K/+k dHoH@ x6mZndomzې4޷Ո wq@(̇ 4F@ׇ/sIE'ب@ $tAk/&g\alZtia* +4ׂwo {F ߷ qAkQ(*\Ry_ j@\V*xcT?7~X?М6X\YY.WU&;;tRgL'mx& 2YeHФ $E #ZwJ\ Om?R޵$rʨįPӠA ZhC763jX&ghEOt$ <@1MzdO3X~\&H [&X$ 0,yhx \'y: 4hF(BL: nmѴ\-Y@;W}3>m4&P=* v__Na+t(jRс<d!ɪ... !u&(k%+`%[ÇZ=РA #nHH]3I_6RkXγ2&=7|[dYb+WK, ߠϽ !B,ExfC=]==} @4ϴu6459=0;hH~Z5VZ^s7A9>/yDܞ9Vy /WS.-GJ%p  7,ob/pDV >\Sxac2mzr. mƻV~Gf)K} L9.'.e.^MGO?{/zW{=1?GG&'gXB% ES3W$bd,+& <8 >׉"}4ࢿc/T,z"30j7uS^Q  cI5I儽@ .䲨|m! M1ՔRZՕq[afx4h6j*ύ\`o0լAMU"j'fxLB!Sg/]t3ug6=tow>0X[7͙YYtp{E9HL_,%X!fCɆ%Sir&QdXG |Z4gS E"!Mٻw1鳟AH̦xA8C~X{ʿ}1Sl"@6T(H 4hРA n Vj\_iY">@ l3ޤ:`CJ0ň#ǑU!X,l2`# smj/^X4hРA  n#r ->@Y*z 1)x2S㊠6=˖S]:ߞn1UZILwUUWH!*m3p6XNMR+PU(ʊrԩ|+z|7sҥH8kR7@'k_|'58k \@0mo~s=GO?t_8Ecl&ONNCSc8'YNݾ }e( 4hРA/ (e\b5Pw?<:!:zS@l‰p,WDYըUgQU1!a7[͢dЙ$8c}`u^'r< *mPV@-'իW#ɹt4ήx&;@h 3?oEEŮ]Ȼ^P%'1%#hllh4]vϞ=ׯz'o>u: Qjk/l7d8xKi Ct>C>.hn "AM?q I/8pϽ{6oTT\`2@|IaAy9^;ʢр{$9b>)]T0&>sG]'f/]޼yg?=ƦƑac-3E~pd2>S,^MI*---))KKO٬a8{N! BHeeb+77l};::rAssrD&ĸLpHTW|ׂ0w~~711xrr9[ РAW0'0|HqMMPdbbGNvb"A>_di*)CeْɅ4H/ @/*w)0g -W/juB%I4::f?ɩ)QV86E*B!RRRg/ル0%]MRpWFqίGu3j<ϑ#fU;\F58V{H8dG#-szl.(8hf+IKVTcc؈rcEEF‘@k[{y險jIcщqόd,(Ϸ3022>66,z:3;7?04;STA2WPW{B$ߺmGfF$J͌f8@tb$(ɉP`lNL.t C?Do[6hɖx4 ᑑh$j2DBp]`## 9i Hrt)'4;83ɢ/5΂MAAwAԌooDR/- d8QṹũiI+6X Ec]]3 >?jJeͻ02({X (--YYF9O NCT\64hUzHC+ R\g, ϰfeAstkKOOǨb#""|~ݏZ>lHCr'gd4TQ ݙK8Rmż3_OrAԢףn2Vi==? ~Q2<赂|_;Ν;?1:*_}gbd bf&|٧o<84d6[f˩_{#GǏ-,>rѾ;v[,|2KW2 22RV;:֯_\\|ŗ~ēN>vx@"vw|;tvvtG?/̊z?5:>qX" z#G>S'֭[0O<?Ϝ=Ҋ^dgguK+p6X 4Epqgee,*$ miF @hUeÇtmDQ^6K[6%1ŸMZZ6$^ .1|3ݏZ4U\-],+ 74mB6Wפ5 Dx,100%ۤr.E*ѱDdNACfdyӳQ J`YIMWhcc-W]n8w܉ݻhܜ={ݻEB5 --_~c;w(.*t===A4>=/XMFzaKh2ffe3gMNN| иQ323srsL9yIP;a8?OMdUTg>'cξٹ͛76Gfe'CjD[Qa6rW8~tIIoo=ЃUOYC޳' l6zf1Fwkܥ;_NlkMm4hР!\y~tq+ ѸV;H9u(HƘ2闔NZ0!ˠ}"@3y}2,YEBPhlgNjHP&(*vH zu*+nŋ#0ʊ2#`<!Q4@NKVVJ633S]YݱjU pm* /җOJQGk^XJ[Sj` ׷#G!ުL9ʲ¢Ҍt$RQQT{i횵HEvvv^^.,} v}ͺ56^U}6|ڵvܱsp?>> T"j X"YQvhkoE @ +:@ضozbm0_盛iU. %QFϜ=n>}PY:77'?/lqǁ@Ч 4hРAeR6ׂe 'ҹ%6Kw}qnhvw~tvZGUYYWcy6UeC@:z*Atz~~??Apgzg}===>/ع>|':y¼Ϸ8<8<62+</2J,C< 6T@yc{ܷ wu:]Ibh`@ ^y^xean!_"0QZŦcG=SDB mYmA2x񉏥zr]hC|$!h[vp_WUVKƕAHސUlِ:o"6t'h 6,?011 B 3.M[v݃~l-Mfj ~< vDR@(VD\D$#==='77lX D]S54hРA 4%,gۼGMF- R;ndz_ [6m-:Mr`fqrd~dTu X *:;S6hʌ@%¼ڶ BpyEeM¢x<UP%މ?}f6^ƕ Bmև~_}7>nܰTj"BEUÑH< `#RZZd( [lFCm-ukVMzl4}{u§Oߙ޴UY^mp7`  ܔIr !40JWܻ%˒ե6٩=Er&>{y9og?uuLLLtyVD@sՁ]lܸ[oO|qk7,c"AۮCiB(* .:ٴSxq(%\rzSSO>V,[VW[[aFP_"]7|ӊ+J/֖S'7ċáHPT5PUH@w)h>, W4,rǕwy b"PZJ  &zWl^bC&D^(Yꗝ }zZZZ(2MÑ+75fO3'J#VIq4~9LrԴ$US`(D t#Rya_rUSsv]7lؽ{wb6yƪfu.+)޺yS8zbvĉ&PҲRG #\r}>vyGdIۼyS]}uiiIkkfnJESc?79=396aUFvᆪ"a"X33MmnF-cuׁ"K<[7m..)-d-dz-K 8`&^r&]{br{bynټ~'Ypcc`F=xP[KOQeE쁃GָjECr$#3S 4~Pt:355608( 8$ӟ͍;Ӽ³{ H17>BH$Q>UUb .w"Ѓyw75NIFFTuq/JYAFYy:{ m?Kk3W{K1ov{|Rrv nxT!GZQJђȻ>OG8ѢЊUu@>3*ch<h%qYʃ O+VRQDQZ!Ȉr]'[;km;Lf.WXV[ A,Nm'իm55{k B۶nްa]uM<ۋn}> P.Ew9rGGъ/xÆqЍs?|.dz&&_xᅗk:ޔ]׸K.[VW&'z&'ǫXd|*2J**'&u=WWWWS[r0;ybmڪxI,X6lZW jGNvo=fpx$t8X+i>4KXHm@hkA-<28ZQY-9ox@RⲐ/(*bb6922<55 JKHj.522LxR<¾o ݙyN1iF>g?K7o =$\ꆡh1l.=4S'mnhhؾ} ] K#ppppc@=Cy z$c>!N21>}H߶usq@~-!I4#.݉0Шxpo|㟾_g lmh±A:T ^nA/E K#lK+ 8 fͼ#w 4id!5sl3\/r >(!R.CG"y`M6cMzVH v?QYgAк-3> ~!I|*S( h ؇HN\4Hb`HjJ@8fiM%$pd(DViRD 8 &EU# y=O@g 2DIIvаښrK>@ H-lԜ/SJ" _x<@wgWރ인v ~( Ϲ/>r8,jlFz=t}dihh}/؞ O\u 3,e3-7{7^K=[.T 9(H![N̵S:qW.ŠȂpli+ =+,AVU5Fk8q-94xlyԃeڊD^\kKPݰIY@WAbd @J*nv}w[lN]eI+ "7F+,41,G:`qidYFhbEA\6Qy" -=fePlɚJF-0tXF¢cG&2XCX Q"i~F $PP *M##t?@ŋ £`"xw)<7 ?2r&QH ëS{9L/ PB)@m%r b -f9/ м&ZB^D2ҧ$!m |Q,(I.vۦIPAֲl˲$jm%Gp%ԝ#Ңgb1 ~S>iE ?4CRæ}>P:J<~q])HO#!N"DMŁo4"nI& =H0\ې%ͧlҩr)ZH?s%BdD^TWiX>U) MSI Pvxp8 X JA@n |؏=ˮRPi_.QE `J0h?a}[bq1T~I5qp*kT2AW J9؅ y+iU rB'cZaWpnI,fF- $(8t=~HDE$_fۢ '%<`:b#5*?)dxɄBi5rF)Y ax(3#4L4 (凹C0XL mظÈE?=^LS {IbA- 3cNY ?fڥ`V2 Nz*\WEA52}o*p}RK ig5-6|6_V[L NVp,0;c霝鼮\>gg|YSJf&f&ggy;yʖ ЪEgg,UDZ"9l2 0qhb4WE.PP0RA-JIU|>3j4)1hsCi"p ksXtO*  E,: e 'jTpN$ץC2:=8=Bi. z~6 wKLArL{btrS3259386~hk#[k9|p"ʡCvEoM"RfB.:݄E;OK$ʊ*t(I³:? (@g\^|N.^HC`2lg:. !! "閄Z6i)õkKjHBh"`Pl98Ph18N!kAꅔppppp&/<'1R\*3;l1ZZUleyݪʺJӶ&LJn$h[ /*8ˆw-.x+ 9I p [U["x:[{ UCN5IK{-$2.%A{!P^Xv<,I) !\3S3@y "\,)fB#QOY?l@\A!X/ӯB`xIlzfW#H6+[l .&Sё':OLuC_kfflh}rx𤮸ffͤad]SMi[2phK5ǼK6/󲴂 {"d@o9.+J+ar=@CG1AƳdv/TDjk[2 Y3NۤńgX H E8RA홝BOyU{,\3ag^V#.,42Rc)TV{>闗onpppY,w@h=xj "荥*90MV/T\dKi.`˺&H(,kjpv9Xu$RS}D$zNĆ.6f.Ğ=oE<@g?5=}p(1#_yX$.ųb3ǻ` spOH`sٖAՖGR\-d)kM)^YWo^ʳ֜mH"^[Ui]u+KKcłq˂otu(LƇ>vv<<<9bCpd裏>; HV& -~T%R 8@8888}@硠?/ sk_߶ϑ}s`Pп/AK*8[-[ H[--)j/ KEJoN "MWįd}CEIPR"S7JC6 ({Vq#G[#NQG|/u:ɤC0hh7͍OL'f8ǛٻwHK4=:19N(B7 Pxl 2ߠنShb5pI^Cd4Qa:՝Io(%^tN EJx牓<㧟yȑc/駟}y 8s$F8 &AԒi7^;w86>Xq76G矅]Apl .dPSth8H jQ0- KWBL{q_Ps᥍~Y @ x=dAu~{~^vU, xKPwsCQJ|i v/_@q)lF ˂#; Bᦆf'G[Gs}I{F7sDsnfb3R̬òlSw¢ZS9 ̎ ØB"1y i2!<#Ddv"$"S= U0Ur{^Ĕi^u C֭-FEč2f!CKclkEa#a䐤N;"x q)r"nI*Ňr\セ~yM 8u:dIFmxzz[Z۪ko/|~wx][vU('S! `eTa`0T, :䙖f۽l6s2pDKAaȦa) yV*"Dń4hjfx\#^ Z%($!z (G:qJ) i嗥8@2.S0,ت(  r8x)z/wJӎb*i! y3?tᇓAa6L䭼8И9 M!RᡡLrv6͂X`_AP;YUA 7T*9595=5;=idD8XSj.u7x^{ƍ6nxE۶lXR,GMJ\h;\jf&NgFf'''Yvf&GGP 9\33s=;;HB*ǩId)tddMdJ/Τɉ1b*IL#Qى%U6!=b%d5'K3F/Bcj2Hu=@N]|y,s2ci,}=[]V G39yeI/7M#?+cNL'jl|z.c⢢"IUUIE"8%[\7tlv־ٻvm_+*.ʊHڵv4ye]]]gyz葆:*'Rm'*BsO?];Oeҩx?ъ:_08=9أ8qb>Ю_K@ ^|q?344WWUC!UQs==|駟y=y #` :t|'⮞SCCKE1@^{8-ssޟއ~3xIH%3sϽPYYoZ^_eF? rsϿc=vAX4i##߽mmm>l݁PT" x?_O?t1H@9|-G:~ċeO=cO#;.JQQ,RVŋG8hOɮ{׏yNt?RUU2 `MU qyOщN>pቃ#C'D)qIɆ%fxG^$Ol~TfsE|Ҡ41[wtccc%%% Hl@AjRC~ ٿ8O@*Zg6 3ۧG3EtUQ@Fqd ӲE4ӯ\r* JA%=731;3i cJuͯ.[V F}xR,ABt#,ȒueHҖ-  nڸ] EU&&'GGMâa#13j>Ӵ4ͷeիW/_~{o=ׅCt_2J 8|UˊKJyo###]t]#  eG~v^w-MMxg}{_.;مl96Qޮ1z9 ?_v?>339I!n|b"ΖP!h c[y'?ihh!>`8d6xgFGG/C`wd8 7nܰvֆ#ɉzTwOÊ< ;n6d2]MP~"́`tw|;ɤ37\7ߌiϞ=GEbP/"rqQjlR _1@͟usm<0CRw?OP|ٚl*)J-P!'U% W훘5~E!?)fr:?M2)_ eP0 i>Va;g-aKB\UU}>;N:5CK&=jz}}]$iuz (y-U($Cцjm~kWjܺm{c㚕+TEIͥr|8R|`>WqЇNj!_[n>ԸjeG[}yѯn~y_m/gYkng> 뺁AAX@|w~W\~嚦AbY0=6ڟnh:ٹs k׮ko0~555}}},Bhll"`ãcinؼqՍ7nܸ~ꪀ ֬Y{nA]9k}w~\re[[h*ԕi*"Men/)''{}m۶FcAX96-BM6,ǙP_PQqEgJ,uu4,Ĝm?|dh/k=JMu:52|2ƲJ'ȿ(شFF@R(PqAh!(p%G{[[O,oX`>I؎$sZ@4L!r0F*]Qpc`M T-ͧȑh$p$RZ^R]Si+CPqIU)#gMg͏>Ν;z{džGs֭ BklU2-d,6F|V߿׿}_|٬$.MxG=x`?$xlMյՊ,-/u $TVi4EA#  @y1y8֛q ,vO7ͼ-ڂOBNE39+i(6S%0SFr851$>2=5tg,u]5żi CTdmIum4^vťWifm7--E7kyGRlWDԴp EWI*1$YX >a$0ײ}"!`.:lOm' NIYr`. t-pQ8Pj67?pp#ghZ 4%N$ftB12(OP}FNc3ME(#(F' lb: QLϧEE1U |ёaʇ>V$Q D3< t Uhwɗvz{_++/UE $uQ~F$II*AbyLx H9#?țq^%DL49A|.)IFg6՗E&{):ix:WyB_+0i(q6('֢~1xI/8D:^em=X`Y@*tT W5sɦ&k'!1Q5 kFrT/efŠ"hN أn@QȒ)u׾}qʊeH8E0O d)ϩ>űݹdA7MD6t0hFLt&q0b ĘFi|cl;,AD)!"X‹.g>}?w~K..D,STQ&3jy1FFm=Y2ɤ"T!]A4 ͥ)nYmN8sl!HJ\E@P@J|p8̘&R- 6 f;ʚ?AO{ B}}=='sL6aŦ' 07ϧ>t`8I&` [nK/=o}ӟ`C=(FFB)@Yo'S-BQ zT-88888888uX FFf)d*pU#UmWm%j!'f$9pA$;477uu=g=vXjn2MXrSt:l.I>tM~_.G\(DUSS}7?k׮ΎNkbbr`ppbrrŊ /<JMOO75kk;^ZZ}1M@P$MPkgOѾΓ8%Җc +ّɹֶ1R5ᛦ͙QZRDES#SySd3SS=s96cwluRs#7r.(888888888^ R6]HlD )% ߯#H8F+kj*B~7㱠znX"LG:7LNBEM+n.drmP뮻~ʕ֯+++e"\gc;U/cM˷U\7 imO B˗7̥<3<ږA2TB Kp! `,h>la3M-+<_?~w`0xugw77{\ZZ}> vWW\n-=og+I`(߰aÝ HՃ<__ٟ?ENMO|0|OQ .V^Q) ʊ BJ4AAUpU5uLۻwωlVgVhT]od| swP;Q^^NcA,˲ vzm555|/300V0@E> 0f2R5Y@o/u||*H OϷm`h MrmE&fs颢H<[dúuU3 (eUA-<6 &ߒmȱ/PB`_1ogE͈VGwLۈ3Sɖf%.d2911akfO'r#auwf҂m +kV7UcԡXH*MiG2WoQGg&G%GYٸU/TUUmrF` a.P.d&ytAdn8["YQ2L$OQUf@ْXikࠟ1ɡ)gc:*CNe%:z_FʐmPC5-h3 T4␷%Y-Lk> 9E :VG<(ܜ 9X(Lr'>G/fRZ%0 šeqNNQht,Y6! ,!,uj>*(`Ee|U0~J)Iҁ3(QQ%Uô|P_`$B`0$jӪ}Yzu$i>z/ȦGo$Z\7BRX pgE']-`isni|.@R#{+lY /<#?cO> ;_eyr@:#FhqMiyxԄjF5 _RF$t@$ht.CgH+ %IN@vg"%!ZnB٠ 6KC+ 8mNg\R.MA<| d E A ΢) sŢ-|Pʙ#3)|'ShE(*ʐʅР B Q2 !9 -/dEMJ/^4uJ9+tXP.y %GP0 |sppppp! zW;f{xW{#-:Ԑy/)~P\h5'mnnnllk#zmzNI|L* .bhQp+WWT#~ueWGOovZl&}lgADk@_$P(x)L=_bf?ft1?c 0#o6;3,Mƴ1s DSLX"eb;s͢ kӍ1_"[ =ntB&B#4&0{KD-Ba0{zįrJ P'f"á&mP$4M]<@hXHZORAüBJh\4!JM9i` *[ٜ40KH0d'ݵ@^x⣗" mۺ8 moWY9==44ͯ6' M|@Ur{n3Zˢv^V-kVhuFb>MմCt^rSZAɎ+G>~殻]w?_ .Yrđ"p#1$qA,p-Q0jH8Y<`h<ȏg퉟vc谈 g~]ģX^̍ ɘ yssWp=hcüm_իcy:.xyڂ=oBڂ !93"h  ?&}Ipg6oLHf!u{>%SxkZ^󀤝Ŝߛ l6RyZd4- P,=xμ , ?/t̛ Ow6o ۜ`iYLgcG[m>t#hjn'Xzp{Sǡ}^ܹ_hjn鞘7,!MQ*Dp ht`qiƐ fEυy݂xdӼ1?lcF{f0>!jPbpܼ3ʎgli|n3fw薋Q HXW#؆=24#?v?Ox衽{^89>:655161Lg@fUEX2-f3cC#ڙ+aK$q Tϐ(T)jv9fvgUHF)I-i0 fbd~7/,R %_fIkWѼc9] R/uTC޽$1wlY h%Kɳgia t,%3&gS閸@F)^+.hEAP 6 ƀ\ùrB}ѝ((曲Kqa0^3ޅ4$-B`JsȤ%ZP:Nt<? > Ei sIb2{NiۖemF>89̂9$ۦW \tM$N*,9iۑ\MtU2#xtD@Է4[ybfvpB ɛn]6m&YlXtm $CaAYSq àhi?:j`TL"\[`"uL@@hA9:xcX,{#1.JOK1M+56|WIG]W֑+(" H D" ;@ymrMj4a@AL,=ej HU| A*y"Z,AёPߊȪd 3^Bӷt{CP˽k,j98888 HLbn:(dC'{ x/V=1t=h#Y:3M/g   y&]A¸ͫ_glRvIfBWbP|8/IJ˗ձ$'PPCd2qѧ^\AGDj|t:Ȁ8'\т-`B.ZJ+ HhX" Bl`Y lȦeɲ`wd 9dtWղꇘ?5UV$ $lPeXpAE\!26I'Q( NyD j"j%C!xW-a0mq(њ%07>PȝE+:|Ё (SwVʱq:Q&ǵu;oYd0`B c1xuylGEE[3m16P|Kw^έWHUVLBȯEJbEV]{Ƌ6+~= #ٔ03K"jY4MKH2d^)199:2J% 3L&4L=op uݚdɉlr.ၫLXU JH(8l:4HbZg2.k2."d0ю,okC*Ʀ2 *mBQ"$Ft4J^ 0()$|DiqMʦƶD:y@a$+ȅ"m<95RBO:b>JTζf!.h%<ES@Ȑa-UUdXx-?̄ʃH7P5p!J>-d|4{SO>999ILϱTMCl4oxy`f7_- X K _ ق b2L X|y,#s^ !^³+Zsy֙ Յ6,WFK#~>ih߯рV4QV*Jc@l">lC%WZٹ~oއ>C}PQWN={O~_=H8XtߟkˊC>X\pGGo_vzaj|29"QMS#h0?;%J )v"9=3&ɚ_ʒF@Zyb:̽* =v4WT! Igs@D*\($9 <,7=|V~ΓEHYI]1Kp%E>Գ/@eqHPDZ7L 5ɩzӯ"UPD 8lSFQ,y8 E3}`)B~6W`BNm@պ:t ֟z٣>_`ڕqf ‘YYAi(҄UUD`)=98888qZML&^Q je; 1[^ra`DħiO 3/i.8O)پ88gE,f^9 -YQCs8%&QBI0t d( O3>Sp jDhUI@S~2[{!zGvo|[nwҜH̞w\N?~W)MLM1=9#":D$f!~s6lpo;;wOz챧OЇ??_s_$!&г4BECÊkn]dtd~AZr\^3n!OOM8qbxhX7L&o$Uk\.Jt!JI@; /h{{{{bz.6Ga:K7tET: U$QE2 4@@Km^QQ)) Xi\ޠ~I$Ľ w\yymMJٹ޾L0hE(\tn߶rBa,*+d"nt*0,8pi Hj((@VJL& Im.5t6Cfy!GTg3(]GH D%I)io+K% >'47oa9oݽNSw/%,m.&(ّ}me!k>g"r0h0HQ`y\NXnS}M,`XSP @=ze_ve>MVAdQRP 890=\{UIYy<yK(v.jj9ݵJ|> ۽;N6V'9v䩜il/ݝHҹlI<*vשZ[;gfQQ% MMO<+W޲ucɓHqyiE&E9thl*Ɋyí{{@z{z\QQ\:|u6D"($Y'Fv}p皚G'E,:rpSGkܬS!S@djg=p5#V{ǩɤ5٠榣G57Y ^@Z[;;;6vvv_i  ,9;y董@OO$+`{KTvhh&g,  i 7c;p@G鉎ήĶ[YUQBdpib[R`r?GBsqppp#8&5'M Ζ|>O@rdy0 ,~lY3Zw= }k~Ŝ6(Yۍ)j nnnsBqC񺪒b*V292윿)N5VUEC%q cݫkj%cG)$Sw\U66EC4ਲ޵w˗XIi,V$2% v.jnk[Uk*JTJD9):788pLN⩮ήQp-|tVSÚ$hH|ΎqM+ tl ℈/O>7rllb6Zju4ZVggOrxdtt xwNOGKʂA?Q;d^|dWvvuud*+d3>8i~Yl1!STDb=mȲlPڎk[(G{[{c~S_/vۭuu^ò-QmMڏگ]~ebUUzpG}|`` /?ʗ?#ҽ{dYC7өLIIٝw/}[n${d=\O}_>88ןJet݄l:m|3]zes󱡡ޞ644uݿۿ}UWi>av)ӠI1d/!y0=9n(l286޲6؋L/nxK kD=?R#9L߸iÖek>ruS, SV>cgRSFfԉζ\*LdTE\a=PlEs? .ؾb MSQ!@TLZP/3qD(@ZmN;}0ڧ|(/O mdmC`0|mϞ-[GG3,+.))**@vY?ޞ]/v}xha;с`;3Ӊ={BىᮮDbwltjúndŊ5kW[Z7r^ /Yae]VSSx65H0*#Af6m/F\EID8r 4 `i)H(.~ oܸ .]V__}kfxxsɴ$e[l[bU}]%\\Z)ds&m Gҫjj(zؿtmrrJrP b[6oY!ԯi\s;3'OvE"[!|m[a\}J܆$3pɥ]@()+X츲hVVdd~phwfv29֗Qcl(;4dmn/FEAז%Iegˠ*K1KHĠiEݰaM7t^uL=vړɳ:.&H1mT,Fe @PLϥ?dG?nkHΦdY G"mvVH  _|FpK HE%.(:]':OOL>ֿ=3}fSS}cHL+8V#$2+C.K媪jW]eޟGeY`AKgt0t U255J**\a~D1!bH,ZI;1tLMĬ,x AAthJC(c`8 d`T`(ha*h6^Aspppppppp-^{܆VLV>oCb'@塣3HtLHڢHX`8BgrNf8j/C1KtɁ䠤%Jۋy3HQr69:Lǯ񑐐)b$SXqA 4ASL8uѣoPTŝ _uտ?}{ouu *8L2?ϧyͷ޾rjYUl6eœN"]ħ\t%  u,χq2*}wxhXnG>%%K,ǧIA6Ed/f2c?&bYBih6H 6 Nѩ;g6,~<=@#(!A"(;`7[*.c|f8f,C?(CBt2s'Sݒ"lhWl1I$iHƥ(1Y^fuEy}/O? ([I3C#cTh,{S@cJV˺𣂃f u=G~''8xSӱP(bOؐ2L'm: ZG( !ɀTUU._<)|>Y-ڟC-]W|\@II0ttttww(?Qcx3x}\>i@.؊;DIjiisz#sԲƵRCnIIpEclXY-CR:ߒO#.ͬr[ V+K2H8TR9pS'ێh|:n:tx%TT#aDzUҮ;|XdOw߮w>c{v]vUW^~`Gi<ϙ-ǎ;x(1߸~]867t9[dOnj=ta7guz=CccW.߰aH&Sn,=g'.⚺ hG9@d|lrj2vڼ9~srbֲ ǵvkrjza7nar3=9{׋L\{MҐikjW.yꙧ4<|(m6њk7n^VO8<08ήH~ժen8􎌌uuu=:׿:ԬO oes7/(t*+s@+RCN<9Cm65$fgꖯ]nnfv}7m]V/ ȆFjk}~_{ۉ'A:[9p/T F֯[^W|HԒ}h"E[g(2Wwz:1:Z'[ni}62laJG Wk1[oOX"())|tNcrdO)پ88gE͈VQǦc###Fl*mk\94 nr{|Dp,[bUÊp6;,P8'$ZhpK*pR}7D@s1-]aCyimFKME)\j?y7mܴiuT]VLcѺ~h?q24| DB+/+|?VNJ{;;}oX}uEP8ljUuOW7ƭVVhXQY->fͺʋ.ކDϿiF+*+**,hFϩm[&k:y~UC9GBfVzV7ج+gUU>ia,8ieiZQ$XcƬ~ 9l6mRDMh\³r٬ (S4)e3a4ANe+[r:(RON\ @ɉǥw:kshAi1;)T5Ot& ZPii#,J}nRL$Zu### I ~e % fdSQ*;ryvx:6FfA(Hl-aӰLh/;YDs#_Yt/hpz}>@X}{ŗl޼9 16\[1n764 $GƧ@yF{'FF&tHbpdbtb|ffJTh.vv#;>f"\WU(F%DyFWXwhjleO4c^ːdΛ\K@(QɛJcn 6Q#%q,{dpz<ľ9tk_Xbd6395764-^^[Vj"k˓ɹIZC-B(xx4="B8A?"jDihD1/D=XF a7HmLGIx~YZMy1w8)!:>וDH'SDrvdjd83:& dYTK\e_05#-mI MAN򉹔A=1hX4&B&D@ $ꍱ E$vjTXx,)4$0C ,NZ"Hor_ϖ..Bm`(8 LS H%JW]U.i. geJx8X7ԗgb%l.788f˦r*l2-!ش WFlFNb%.MKt 氱~c&EEJڎ Z)e#g(`/u||*Hd=SHźg2` |h4J6oZ0~w8 %zzoNҍ% j+VWd& pWZ9+)Qj6=6ᓵXQQ0@2FCFBL|?O? pNz=/R"1 344 /E>UOb&SO?xǡxgۧP(Dٛ_s治_ܽ~Mӂ~ WW4L=<ʊ}=i2!2ȘcccDԧi'}]82xwM ? 1ɲmY|(qn {lg0_qKqH R( h~<݊,EH0%+5a߰+Om],3&1YoKֶU***'>|X׍DGoۮ]G@uk~g&&S㊸(4vw7 E@Oɟod2e4el^( 4#czEP09*s7axx'.ǯoqsYJsC/eژ3>L:(܃WlY ӯ˙Fz>t\ɴ3 J2M/O5?y$UkJpsICmDrd,D7[V^;}O?u>uG~gW]_׾OrͪU؆%j22䊢. FuC/|}OST;xkWbju@,? ƂjT+4#NtB)Ъq5|ollƢ$[yGQ/__pGGBTJ׿'OxoԊ$!MkyG?O~S{_~?|w>@ww(6MzF9888888888~ 9Y92P A !"399/.}n0;]F>3$Z>*n0[ EeI YZMsH8"IB.똖u񱉢H.-K~ YT8F^^TUU؜4ѝى7^"CGem56NgRٻ?VZRYUrEicO̤d*׬i]+OM%$IK,WC}o*t-?zmxx[teYDAٝEW!W$Y$EA1FGF|:TCHO3cSӃùx 2p'KGJ)\Q`zzo{AeeUMMaO%bCh fAHlN7^BY'ˠU1EѰm\vϞ= +VxMlve3ٱ5k::;ig Y矋Wi >MEKŗ۷?].+n馕+ڛA~Y qUiiYSS 粺m888888888~9Y`y8Y [tl^0 enTkMLJ#=lDY'/ufzxUYP,Q"!19n ~r{[_ϾҞ.䲏~/_VYQFnڠ/2[A$ h,m:x.輝!p|8X$6-xkko_Ν;G?WN֭C#-ׯC4/g3(HXuuuC/D[ɉB8?xpo:=s=#xl Qn%u_ ۜx((p eLOfL(>J\.3o&]s Wv̄} ,!t_kwVWUF~dt8IYEC33iu8SQ`7m`##NNe˲@ct]߾} V\yLLLۄzŊ8@ ,We{ |>FGLJGf ۷]EXO% YFiIbfgm潜@6igd(hcd- ٦ɶm[eZQHd.5b;hi0TE`$ٙĨp%&Ab6Q"rQQx[n^1Z',C\-Qpaf3 %ffZ_(pW(."DOO._Wnr <+- Gl\sppppSXoז~x[ԧ76g<AEeh tPʘEP8TS]U[^l̍뙱@blYQժp<-=5ߓͥPl8 x`Fײ2]ז$'ʲҪի.p{__c=k ǀÇ? t0 @$ &B9n">fYVcccuus=} "U6Ӳ@`~_ii隵{inlm=qQUV%fg9|!С##E 8kPxoO˃+TUk~ݏ% (܆~QrgdXj x?Nʗ:>>irL&,_<.X`Ga-ח Z"BGvȒjk7[TO6پJQq0KE~5sTY2Q- GKY }YDZF)LKSV][SY*"Y}@Uu)==MG67ۿhK\*U_WV[{ۥ;XV,h GrQtdOOsS={O9sŎ+zG}]m((DsGmohii9~x>H$L&_~ep/hʕ~j2is㦍et&zĩcMG:N7m6𮶶㭓ShD4jwK΢nN^ Y\,5^?x)В.F|AY;;;1緘#G(A؂fK25L2 gA 1uUU^{+yݬϦFG⨬`@DX_2C${0M$JJJ|B "Ep*5 n:$@Жx+ GJ1"6Qx=,Uspppppppp=8Y)B0M륗^~'gff|.3 4LPCE m7~[_/_?~lg.ۯ TTLbZm tȆ V#9&%ІDhei*`T5bHLenh?"Q= 2ٲ!Q+im?dh !4@c/ dE/3*l2tNitK0|6ElHaXCCp1lÂL988888888޻{@·P. K\uݟ_?qm,ZVW|kfU WWbח"R- 6b AD lYM\#CCF4d@t+l0ÖoР \z!p\ lƴǦb=`7Ipl~M FQqcA ޶ 6'MS$BĸH*6qhjD ̫ L /1``q0YBG)"cE2{v/;BK.\ҫP֯o*<ĂWF m!iw#d/NopZߊi 2Y{`=դ"Hg)\dvYa5WT]Gi1K U0ļl hٮ%ʮ ns$* \HaU7,%UGӻ/(Qx.= \B8,ٯy.Z t5ǛiԞ9ǹ=oZyF⼖H`*Qwm7i#uҹ\"&%`%dMqN86m2 *Y&*6akv@X&EpXE<3x׼+‚3TKxX4a*9Kz<5\Pr`#~3B y>"05>{p_˾R=ulמS-'FfƧFG[;v=/?xk@H. ,ڈv(,E/9c)tӾqxb 9.}XgA` ރ Y j3鼆Gly,zOu?p}?='?'_9}29H'3YIʫkWnز\JJj692849>帢jk; q(PHa4d3{=x3\ aqȌK,`f2_,p |I2ވM\rRX f:؜<vP͔!aڶ=;9sD_牾>KkѲ9:v9SiOǧ?0 3ΦsnLH%/+,YjQ,h.ݒ1gzF[./ jϜMk Sms@rQ;[tIpgK6cX6m^V y biM[ۗ7H(MgxljzvJPfr+n n :^y;#$yy2a{1&:BEN /D w_P,h$mF Cܙ"ўS SҺ#f t-U8^(D@(qM.Yvx@T(h~/lZΔ qOLҶ~ P m bK%f%#㳋lmǚ/)dPӈUT5W^zmWG}L2V,˛ m9 щ%eIζ́={^~i>w}+N麁gy:=/{}/|ĉGf dAcS}zg/Ν/9zt6#\۱!4x<{7cj.@GGG;::|h(\@e!0'C\ j \_%S8AA/V &g ^< oN`Y遬RF􋼍88^y?ih^+z& Xhks(b<438KѰ-GuѨ\YqY/Y#DJ#MV ':⢈FH8 h[ȈCQg?=?>Hӱc/}d`,Za8=ؓ;wO8888~yII$Z"I}=/Qedd9KvѬY9'\^U@ ' c;ln_[Q *;FDlɫfEDYim>lo8|ǎ5\?ɻ؆ Ѓ@K1;;G늲L<}i~v+ұgާ|wxrj7BP&Y 7ӲTmݺu^{튆QpnS&8Ϭ/UCPܽb-'ggr$&\hhGmgrNufۇl42N{g'3Ni`>VelۢQV CKKK6߸c{{?D"ឞO>L&n}~}5kVQѧEA)q7,fm]t 7\;ۿ;zݧzȫ$\ |>%RYdôhlG1Fyiymum8<4xN$TM䟹 Iz!{#7t[6$v39 jlC Ȯ8`K%t͡=vrŠى#ރ3=#'!U$W4D7I,IS^lYiYI.K׮]W]]iCEQS*αK`荺# McChn-//ߵs*e韾o~kjnikx}yԴ7 ;w>m{_|GfҮ Gs=?725==6>wwС9Ym9 _?M@+L$"tXq6ɰQ&>nH6t*eHPt򳓃c=܀?7iSik*E(A7bCS\0ML\(=T*ONNiui\|6ƔiD ̈*`DjXcP()RVZmz= CH牮]v9v/LO<ƳlkK}fgdٻwH>sj>_ ڹs籦c ͘;8rppppppppMagp:! oNmF˂/wdžƧXL69je3rzf$]8ɪ,$ M4#:|\~yޟg:%eqȅ#aߧ KQAb};סVdMd`Ae'lbʤӻ_ r~c뮻ܱcrj*1;[]]?22 nG 6#:s}/wwڸaӇ??> }?|W}'nvcMYbfqppppppcA!2Hy/H`sҘji ? '1l\Y[]K"Xb9R.oOOuM'&z&N͹Yht",r%p$CḢ+fX6G˿|;Bo[nE(*;.ĴDPhԗ[ vH )jH184ӦaX,Xf6\lFN=tёёdrLl$1eWWVUUJZ@mٲo.(.() Mp ȡcG雙dp_rFH; =.A4{ zwXκE-) _xYԅ³&0ygMr> @?Hnc9-_EV\67>:49geLmMeᰑ02فX:Wz'h;3AiHHQEQ[vW}w~wc򊫫k+ʣgsL&v&&xD}\ $H( Q13 l *_Qdr(4d_wKwˏ<(ܽ{w>//’40_Dثq.~% r˛[9+5Q\؜4OyHɸ t]𼛖aۦ #~MdʌVf2P!8,FCV&1;k'I pAоl(nYV*ݱ~\skKPj69ܔgǥ[pHE4ˊeX|^@{T"dTӱc䒋rEy9_//kƍ/TjnXhfsT4OO'  eeVw?~|) W>eh"cQ<"iX&XH2"PM}bME1ݓ]b>)4öE[0M0tY|j G(Ynݺڗ~ᅝNuFndxl``0N.(&LqTU|8h;eُ?7^vI+WVTT$?{q o;WEU-ے=.?'N^'|qؖe[Ų,jT$R{';lwfp8$ Ewfgfߙggv4p$0o̪ʢB,]2x≗_vnǕjluYQ:XJuu5ٳgϜ=ghd<^7ЇJ&sΚ9F BlƇ>|Ǥ/a<5wu]GD"kkk _b ؚQ6❤zKKGEjjV._4oVd`rdQ]VUXpVyyFz\E-Њc`C htEO9 .9JeQfSˮ]\;g~Wg׳n}wܵu볿zW<륗_hAEChepbx׮={?u ~|>#[w\</,+) =w?GAmGcѲ޾x@yyy8';ٳMnPVQ\T;v+/l8߂>p0vڣO?޽߾};MEey0*]f F]4?/~ەtjۖe=ztPgscˊvB.` z{ڋAh!Ƈ>|\`*m(xؒT[[zʊP0NyfwfG˴GHg&0}%%MSh]> _@/t8>|\ye4e0 JU+)>ɂ}" :"26iuuutH R/^xaMU`-JbǦbqP 8)HZHÇSm|\k-#(sN.{:W yd-k``d˖-f͢fŃk1k2;bidql{)Ϫ)W_MV4wv5:cjW 0_tMCG +liHpHF i-lGj 6D-)9e˄FL2mB, ZtZ d#Y`Qdסs 7=iB J% &Є,Ia퐡[HyޣWt,WP~D)ʎƁ^ USLunD",q0Ԁ9'bpY8G>Uo_ܹs׮]P!CA`Ç>.gH6\Nهz? W^/`^WS7g!L973;p\ -@ 8 `<c\2Q-> F2r xB&9N psΝRPGF^% IKr/2}_=~cmM-]Nksdߡ}Jfq}coDϠ?dꖣ rX+ۢ2خD 6#%6̥],R$ C_dLǰ ĔUeHA+m)MϑP 9M]!5ن%"6Z@?Q`$|ּ!,tF䶋&lя !hƔo;" uid&ƸOЇ>|\1' j10G1xF 6f 9}x̙Ʀ΁XQ%5s[aX 7ֲ5g\7wnB nDpTIYiHs,^8(+yon MY6**g=Sn 6^i4MdP8 ^PT48#iD]5SHm;MJ1)J@* dX \KJl1reʊj1}rV6·>|t8S#p;aw]hOQi} 4B F`K#fx0"L[׍Ǐ7?duk֭[rnOpg7lznzg}ק7nyoS7lV"023K--PL[ɊS L ^ppQQ8͍>YOIo\~Ç>|Fu8e㘍sN*M?|OE6pceHRT"łX(H1A rnH4I|DŽD%477tF>Ɂ75&s]ZV/?osVVVΙ;kvmYye,^"‚ x+*b +\!oDKA7M!?£c@B7ȝdP k><:1Eg80>Ʒ>@ b>|Ç>|LhM.DJ=,`5ﺦI!ʲLĤe^g#z"CdAyJAkA%(=jd$ p)œ/&?7# FÇ>|#ws e2hL'#ضk.m .ڎhXn؆Xc++D <;ğП&p8X!7ɌL˰Ix$+PpnFO׌2g_% e\`\G>|Ç>m09Q(6#1:LE˲0Lu:uܙ'?}gpӟJYC֖c'N?ttc?ux@w,%iF(+H;{eX [!pv/,hF(de8,.N%<.z ,L61 1YHxł (c.,\WxÇ*2mxSJitkxv*oMϺ4-:xsSrӲcJL,B#9s?裏?C?ӏ<ʳO>~U7-[+pL:Z;Jtڦt YfX#Zbٺ뚬뙎Xii2Ui,8Pu˄h[pu˶].sA!cBZX m4{Cx=AD$pdiZ1er' ɋ2%Z@"Wd+y7R\P\2SpÇ>`=8(IEE9$IkfH!)Krd@%ƀ6x-^϶EoҀV{pE mIAzvٷ}_ٹ}v6wOYéTz0V. ;R5ZaRNw4Dve#+62͔``7LA%A)]d5cxHIF0wiP!3d^2ɴ%U2I6uS$H0P=MK2m˲lLJGohDC'a*^ך\x PgLiK9x2>|x(a8r:;ߏx@M LC%G9퓖7 g ƀ9LwLKvP߮ K3  Q%X(?tD+ۏ5X\^5TCSO@‘hJF4>> 2 lHH$ %jc B#PEV =Yv\۱ D4҈MClFT5 }439#X! " R8ERpG$n4"983ez$V#܆~-Ç)w~2FMh^se? √-ˮH`azEr;oXyelVɠ0$^YSS=cEk{{Ñt-#WAȓ(Iɡ䰮8i2H xrB!KII'MTE34$Lסy!PMd,IDATdU5m+Lc@6tZX6.q0|ʇ5d =)j | @MJ_)"E?D L̙}LÇ>|$@y 5|= 0 VΟQpF:dH:ij jg/Y4TtMdQD$[T$Qae5xokӦ~7~v=`4H&?򱷿o_7;s/gu We{O|cw}wy7C!YL[Qp]6 ?o( k`v2|WܹsOwO/ai]7l}q!a ,fW5!8#Ç>|R#!mr u`/aHh!EAYR@JbQ-Ũ’w|ŠpH+kmK _tɓ' ~Zf/Ձ_+Wz;޹aÆֶ桡ӧπ{Rib Xvw{Y=}G?~򌢪1`H 74Eɕy;$/ы:CyV̙=  4P(.G3?Dh2\ĤBi 83' Ї>|Ç[Ϗdvtt4M1ea]D(-**W8ذە0 pCp_GC@kGZϒt9VP Ngz-iZb`p+ BIlDX<ػw{wߴxIGV㏿c?wuvm[nk7\[UY‹/\w⒒B۲i4H 9|4V;n[l;>ǞX|&HDRTaϰI.D2X[qU,Z1L6]#aY&[&2Įlh*l5]tf&ָnNؑ@~9b_*:*=ѣ3g(//Gb(O/MZ7c$WUUY|1JaI"W" gœ ;wfG˲hF6%%%u_ֹSpxGBF?=B^k5T&Ɋ Қ?oQg*A裛"(*jT}zɦ !M]DoTgێ<5ܲetntR]JM,06ȁ+C{5 7l.--8{'6ok7.Z8^|L+.yq }\ȴOb":9v@+(K, B!c pRw,IN+#%iHŅmw5h:髷zun;߯TVψC`+!Bdz%$N !ڣ$S!݅K,bB_AT"ڱ6+ AƲ$􉞻&[^+++׮Ysd2900???7Om귿's ^IȡCxw7'^z7oyϞ]ݝ=?obo>/ϝ -ZcEl^P΄ jh uFϹ}[.0d=rc@;Ӄx]ޯCF/o6W3pkz ^) Y.؉bFJooTC5%#]iEpdC.WF [J H*p¡Hb#70/tvvbx8^Chђhh4MˢeEThjr!ضj҂ ̴Դg_a_ ՟,0v~O<ѹpҒ8ڇe: ^}__%K| o`8|\pf = ) u&hrηuolܤ ollL$NIvb%B ,k80M'';wβKUMUU%@o\ЧcPQI66_k. /4Dd7o&N-ӂ0Z޶wE#E3f;~o_o[G{w˯l K4U\h4qu+V,]xѪ+ϛgEV.]V+bU:ufhhWq1Г/?{ >|zJc,~㲂mF[S!BK.$ 9{#T:ygo)q:$s"հW, 'Bu{;cw3gNmqqCEӛ+. m&- fohB,2mS8/L%CcM -m[>w}?я~S,Z0v\ѣGWZV$Ex|pDEYSDSSCss]{~ß|rF.9³] ^,~ȑǛ xMɶ@8l;Abڢc[N:~wjw=-\ ]gFIcKDQOj9E?яş߾x`HN ן?H$Vh ,#ӛHKԘh#ۦmqD Һo OAAAIzFYVwnXE -[۷mۋHb…Eqz( A 6S8ZeeEE553fX`M7toUIkH>|Ǜ0~Q&)ی@X^}*9#- 6e]IHec,=(4! v]#D@X/-0CɶS1,8"wҬ()- µ**ˣѨ(pxErɞ^=fEOR -0їsC2ȈHlM8N゚4uՕͭ|w]Ї~fٲee\0Çl߾c…3jfSiqiYY4mkokkkOMEQjkk_G?я}}KDdQ >|c:&v^>|\&}6}Cm ^ ֋J̈́xCBS! VǗΞzA3|6=p>q KcdhjK5[=CJDb,;HC6##cmegR/Y1vf33`'HN9ug;pP&vݳq xqIqm9 MR䞽Ξo2,{wO zm]wmYi0}wv  vt9r\$N8+M3w}h4RGoh[a]yUCv&uD?xp_29?184088PwʲH$F^nrsVc-}.|(M'd{{':@@g1PsgvL }"cCŁ#txWZR@b߷OQ|߆`q!䵖\G<+$I6L8oiWt\ݱMv6m%%GBpiirbYG E+/ pI:]`4*ENb,^\R@-8(HJ8 ϛ=ԩ<>mۋdRP44{lUr/ i¢^>/CfoƆJKKko[nܺz"kBi3bAAlW +f+lܸwO?Ѓٽw?|}DSޭ[677Bf031^(rVNS8[lTodvā5Ns>| LS? pIC;W?Oj%j+bC0NZ4x#LօҤI!Tĩ͝;kV+ $@ZäÇ7_^B3]= WEE7%t;E3WJG( RWWWܢbZ@W~i/#zF,NИz&>|7byY^k9V Dxt:4vsm]K5ё7J5:O Igq,x+NgP"VNG\8DN&z2gwU/ЕTATRX`JH0fu ƲgY ?%1lo4S"C 9E$ CL@~!q`nPCB 'FH1 (: ppJ+m6>|W%MgG4|0\zm|1<,qfE$]fϞ=Wt̤qJҴM8:~خ]ܵ?qHwWm;Z(Fg:j`*-n͢6k@/ӥYJR mvEݵҠ+ fQ(I4#RA 6`+e2.D!@u@`ρ#+]ɁhYBrÅ #"HKv(rNqB!.tE%($&"(>|4=g3`WmMS%3OfJV% J(jBH)s'O|~mӇMuM ^+EP "X ͙'| ^FfGCc W-'~I9 0HH; pa ?<\";?iXÇ>|du-qu_66 k8{ҭMC}Aq\Eth<.(A nۢ+ =4 AF qv9p ) rA a !ȑ P$anC,8bD-:4ϒ,( #O>4 ,]/0`K$\`ہ\Ds59^msbפÇޯ@IsNZ VZQ\Tǿ \k|CpZFN3^͊IlM`iA4M$9k6lm~߸uoxe4^-QAnH d7ꮠc*Ybc)(Y1q!Aѣ t 8!BFA S4$@`K.K7fA01˦ݠc P=\&ui9'- |:Vd"g~ |",)2l @2'fhÇ>|*'Ac`@AmF J36[.,c$ʖa;TbMD1d2 F:F(*32KADH[Rr'8sk)D }<‰m;`zZ#yX"A#H   \8EAH=bA0 lTA ! ' ²%96y@I8pȈѥzÇ>|L3hA#`r|Ʒ#$0Y6&\%͟.tO;_2P@nLWA KmIvefqX0ٶ46lK : s Bs_ Q QU=x҈L&N!H{@x 7 p  I EҀ^a҂ 0\@7(O^{ڥ*:"ч>|\!ut%lF h{abaX<>..հeeB?"1eRADEHtH  v'n9NYCɾξ֮ށ#VUDWi LƯŶc|H*ͦ\G`h zIp&+D$($B͢ E$ NADd;zm:@"#(^Tkʇ>|0.YUQESLɵ$Ev[:_zg֧^|}s=54y\ݱ}ȡ8zTKkCj8[@K\Fancɡ}T(,1B cTylH`2qm)ɁFi?ULr2|Ç>|LvHi}U zq `;ֶ'yWO<3=C?{z::[;ӎ[T1j޲Jk Ilmo7u]f̌} g04BlܰP6CL@2BRFuP$ PG  .KK8{Ç t:-ǩ^f.xe! "b-] --Íz8%ŔJ b:4tϖ#R ?8<:p nj䲗+x9D##60'%6 v 6_Q (E V7iI]8ǥ1Oj|;VS,>|Çrƀa?\AqD&M$Q6Rb+•K+WVW)3ԴꅱPq<&R4{םJ͢X(kf s v?Yp" T*xs)qO4LHp3y2ɒl&M Lxfo1)CÇ>|L+]]]12Wd2 fϞ]XXx5 p} 4 6hX™Y[2cY#tpUEXAYY"F53K"ҮHHA8 @ , 42{WؽkT$Jiݻw۶m;v8|䈮QM?P$Po-N*;P3[w ۿ\> p) ̹NfD͎ޏ(yĉuuVO"d"z|G07]$+dG^T#2MM@iWWUUVV r8R_ vȗ6(:}qU/.&`6wr|=)p1H+# ApyǗ1̷$i؞FlW3 [GdquЇ !7#v[ l hmm9'=Z*8vgg'C7m2{,vIʕ q]Gth oIH[[_z?ٽxU9CRxTU**P8vttVUULq]E˫g(,]Gv TE*^Qr-=Oo+)*6Tr5w~ܹtܳoߋ/m ّ믻ysWQU%A{ӗ,(* T!53ko%֔d֬Y*YC m))v)4,UTGٰ3fB$IlrvM070 !d(ԕ=qL8[iHئeܒC>a5W 3mMCQ1U*y1X"bgN߿?ܹsQ!y]WǕs$S޾ƆkWӠQP7`T*%hC s-Z(VP(( [AMHb/:c,h048䵖Sk7+2uٳG8tdchBie tvt[n2{6q4@m&Պ`s?CzIey#5kחJ]ŁXMMMeEd NZƵb8꺵gHQ̙bc%QIHCE;3o}Ufz{ի֞<}/*.\l̪HaX5g,Ypiֻ-s$#;~]` 敕"' (dG]QLQT0[dX`4Ӵ@0 _\J+teM] %% e|` ? ш&Nݸrp8̃6hT RAhTtƺeBt:P7ÇW<;DW,ЙaNUUիBd%w fP$eGp`7:^T6@( !m|N`hpk-#6V6][\-- EZqK=)*N8*~gϷNXΪ(  u>ee3W &'OǂJEUUqU$Wt M\[]ߓǷ`9s9}K΋FBZHҍ` n;k3jזޟ;dy=˖/, ˂'g?qǍ//bJOjeUHch픖㈶-*5?\-Ѳ:+J&Cz:ȲKY,{px0b]TTeD /,x; Ѧ 5ƗJz{ DdYƇW<6/Mp} ۦ Z~<bGxsf8䵖SۼxFq\.q?qDab7ߺrɊL0Ƭ='랱}%b3T/3 JW\ɕzֲ%;z[{wzoEbp7qkϨ,UcҌm+s[ʺ(.sy}Y +8.Dž~(v7hf9C^k90k80ʉ vo(*lEH9C}`4ZP^RIdosg=9CgT6u#X`*-GHC|d녽\G#]]E}}UTD D(]4,ˤ=TEBeZGUQ:Lzmd6Xw%kCO ~<޺n-Z4_\hQUU칵zZYgϞ=[QQ|bY Djhǫ/' ?[_hjjLz_h>i3b.c] f2xކo <+akN]5rq ;Z|n hEOENLu\QՂ('Ɂsh4ҝa*k&;N'{da:FM*ck^o{G?f3z2WP`2 VT*,۶`[,)"}hԵ ,rAΜ>=kfM254<<}i@o|Š)uƊ>|\IZ.ߕ ۘ0XdG}^1SzɆ,.C?n,?A 5 *[fKá^BS17-r`8PUS6nt @0@ UsVo}&@qYb@M1P&P@me[˄$ϙ;纍<ܳ{vnnjik8qdsIH}u$U 爎#ɢa{z:ˇ~gWfK-_ti[[[:;@g:z)cŊez֮][UYaY ",Z|CS';:uÚ?gCG9ޖJ7 AM·>|%/}649ui d" jkk ԄqҺYx ۶ B$,Yp;ٵGꋢv,9;>AeEZTdoPQ*"q FHk_y%e,Q]j Ñ%H1o߾w΃{?O=#KKJUQ:xк뮍Ǣ1H)%L?{߁Sgٳs/sGr˭6o^rY0 O<]:X_Rp?A/IhbhB/d%_RR4kć3YK!yN4X=Is }\B䵖fy$ښm2Fnƙ.Eeph0d2A, +㫖/_[mò[U :{Q8*8=KPi$Z*k*;0 M+f ʊfЦ._%Jj@7[oYlP/8sLU&`ۨRKl2EE Ò4}>8w嫖anqdPFmBΞaիW4 믛5svUu"{(WΛ?( E +vͪY3g,\dтep8JJUu.[RX 1Ć֔sk7^X}7We2rߌ9ox|6;ae(Ӳu>qܱc:::3 Y+ s/}{ |ٽ)U(6K-{[+lKD jaHntSAME)ո<آkہHB\D8T )Rmm,S #*p]I\ɡ9`"yaİlEJS$B{Цe* N-ASz^&Q3k,)oZ֬HhP< Q{.Al ԧ۝ܲÇ>7.4R(,+8Xúp }~…Hdow7$|۝>&  ye9͊-싑j@S5mNjΙFy5Ɯkc.+(U%|٭O=_?6=%¹F3W,*<ՠm-jtAJ Ad@+z3?zfmSDY2 "Mg0ze߶> #A".uA p"IRT&zbA'[ 6Ѣ ̙%˴ރ G ٱA])erK|@ Pko|\=|bŏ;#T;Pٹs^njhL  SɂHႥ7#}h֚Ϲ=wk~sYK7}jņ.6/uE]!JXe:3kԇv" `*}D)@t lDo0ࢤ DH`;X 2G#) |/bh2Ek4gN\`b|xÇ>^3$: ~2k;;5ic.b/Yc:gN7&RvdXSV-Zl`$ Z-U1WlNEvEZFF`+H74`E ?cI2.}~2-U71l& ͹PDhF-S" )CvGAovIJWr^@)O6NED-G")YM1&Y$ E+*G:7,6MK7t*֤!BQaҚ4.Ǵc<<}SjtO}`Z_Y\Fdz&o$_cr@3ZKima0)NEUw=9nS;|2%"[G>˱ܴڒ-RdQHw WUh^ t-F}ƲEv23V1EIw?FǼFBҁs~D Ԣ,P=0G .d^O'&ā<-X= ҝd{r<}x+(x1MTo~9_nzϛ޷7U-\_D6X*6nCmr6> y%k\y{EQlIRpHQWwڢ- Zt%Q %ªxUIEUQeeQuqTS‚ Jǥ5[$aTU'p 9-VU wuA+[#5 GRiGy|ᥒ㍆Ol~GJ4P%J;I꼉}Us hk h&T`/ni`.K**DE[,A2TDAe8D'-1 !O`ϘqTEEpu5<hns#LIŚɓƛLI͛oj蒛ZC1M%7oC=IŇ+ >T bRZ z1޴],GrTv1Ҏm2MXV*̈́-G7R);Z)!z?tB<&@` 3&p#& ;`q9W>/VI>c4f:Ŵ_0h֓[5>|߷ɁE:)ζn0$>DdAJbE%VJL؆k% p(VDa n2Hݥ GFudx`00Q8] G. OiGU_Lk{߆o}aӇ>|"B/‡(l/ida6}ǥ F֒{m+\XƍHFc475>?O~r?{'?ϟ9{0PayaՂWYܚJqD+@P J:ᆁ~sN=䝎zfeXT̑O0%W>|M.hC؂7pCǎ<]wxކRJZA,-Y7z:I[?P^9gX 77"pE4 6'f`ARfaQGÇ>|k::ۀ^_rl`sJ"݉KU+V~mXlc؎:Cn8 ͺΎ|ǵV*i:{ƶҚڢH9N$L/IO۸7m~@r4"A=+<{]:s>-8 ?f$; 10I",kSX苎 ?r* tyƢP,a B#ӌZkӐdeM5Q B"mZdH19L5* ('>,B @! 0C84A.V) z^MDAmIf&#y gll\*LKŔVr<&_ y%4B6MFPlKN\В6~9ݳזoز:̩[dSJ3gK㖦&9rYKfɖoPt뚴 JN)i1֬]򶷽sْuecwt_f1M+ ]sͺ;s``?'?ŤLPt=UV]l%++++A1iLh=`&SqVpcQ5[Va[oueee@*("HW0u]4> u q Y$I3'py3_q #~Qdc 2O8N!t\":H)` DEd&SS |E»g3吽yR ׃^&dyp 58u% |nc֘8䵖ӑv pK_jGG1Mu0`M&RfZ%m6@PLC?ߴ,(Q* VcXaQ,VrWSZU ӽ45h, k`\G駟4JN9|HMX,~~_~䦛̛78cƌ'|{SP $)`<<ܿCorͷ޲n艓v-KHAPUǢ5m, kD^)X:VJθD"fͪ, ׅ1ؖM=KG ! ,8Eس*¨+'n`0A=ztHIbEN,<Èj#.FHfgLLb֐)!_„&+LI*Gǘ%4$ÑȻQ`n}}%% 6 mhYBJh B/C^k5iYq67f$X5a é?pIHÃ=MSkH t}MqbUIQ#76-D "2}Ŋ=dyu.U.;oڲ7Ω޳g"is۶;k7[v͚\sMyyYOO_ƛ`YY艀L;v"y;7^qe6m~gy&Z,Ee^IRmˁZ¨:H*R\F TEElHjJmXL]UXBjź0I~9L ;.V\T~*$uQ!$^p^P`*24tP'L@1v_ 0N1N u!~W?dFYyY#Goߎpx. Q^^mu/ -FYX fAx~$Hf&Mۧ* X.f6SMZer3f0n``lbk|m~;0o!\x1];_)e/~ܵϼEВ_WHGU::^|GX{{}챇ȶm/۷jollx_gC}}'xtM `E㵀/Or 5x~c}A]LBfɸ5k4$}xqƀ2F̸Xw\d2!}+  Ƀ5539P|\ e@$v-z\nPJfBkSW[S&%%{;]B]EA!ViZWWPGf@Gpm aHGOVii̴H V -XDQDUaDuEI*K*x,2/5U^Dzkg؆aS;^~osGxNfEeyssCKKa:CGut^0D[@bܵkϞ}kfw__}~%Gzuߒ+?{A˲ZjΚq UK}8{_֥sæ`8rLcKbnx-TD7V 7ʲx y~@/vTt.\\]Sxx<|ne]=]]S_ߐLһ7Pd.dSs0'?6PPè2cƄ exv!Bp@%k֬xٳ HSee !mLaP=26(L41I&Eh:xz~]v:D/^TYUrC.Y RRRLoWCтҲ`0"F{{k[{{{ /J%4w=m-7YS[ CxqUUU8&y=ڡg# {ǡ>hmc 4ru'?S]vK0*0'gv D:91l&F粠:+")u/=!O*Ic@Oqa^N{-nς ;\KU U7ea9QlEr(- &("(M*TkvJ!k OOgqeM 9Pn`5(B!1@t0/Qܹs-h(b@Wm1Cc, s֒{:r_51xxZՀj={|n AIѻ}_x (-S".7;6DWd_ч;}S ƫ7.}m\ fd+41d_濶G6^ :AvhW~|mrˆ+*ʂjuo~f93]ǥm V{Gˏ!wgѢd;Fw4[ROyT8v:0Dզo|? g6^[޶t\=n>e};gˍbE2vAj˲)#`(gJe9G:ppI׮L/:L{C" cz牗u K&8JuIPDKsLRײwPSJn~|IqCVwb,u ;ldA)pLrRUݠ)j5וD:҆kvfD'$d νrÌm0Q7{$dٳGH,JeeHaW˃Ǵ--pk-#M>*G 6Qh=^ H.}Fʲk޴v޵{gyP^Zup;sj/e,YxM᪹nе0Zh&גz5.RdI5G7-бӿx藍WVTT ׇzڍ|?spYg~CO̟8^RL&+kn[n"8ٳXooG,Z|U)C=RZV|7Nj=-G>6w~ucٟ?@wڵD }}W/֞%+̨2tc]SRGNI_M~ j69ǖBUS_:ig.YRP j6rtf`^cAk4>l)#|mpìk+KAK؂L8$tKk0vHD%{ṒGW> ޔ H1[2B9Bb}𹍏iknY!䞎4i&fBq#{{GzrP8.?gɂUdv mh;I wHA{&ɵ{#A%Vk'hmwk˔`Lvqʺz5YZ.X^aWА6Dhc_Q"Pؕh?PA$:64өi4.!Ppb8 C!Te 4aaZ P8J'U*RdR Ir5P~D3Lk``8GVA =aEZF[):RIsFA$ ˪`023NUI ;>>@&~v` 5ּV%=m`q} J MESk)ij/=}8/yÈ߳`鋉}MGd5sۏ]7d٥UqA%zG-ۤ{; B! ɑFyOܼyG_Ȉ}mqGRWWW$3gN(6-;!}ncZ8䵖ӑW~M6+0芅H+H` ][[[XX}`خe9D3˸\ך&;;r੓'N8zhADk=} yH%Rε 4B{kG[s_"!҂TT%@C2 z°ځR;( #_U@R`GAAN6 V"RC#a ahUDC"h0@$K aʢk W:"i IH:U K.~sr8vdG؆rѣGgΘQQQat78{4<1x Kx4<S~)c.x 5xz=|aUFзPPHAð\r/q-6ҢcUI1er:1J. DVDF-Y@S̀"p4BQ7`.`l;!cMhh/Fwd 鞡mqEa4(X؆>48@O݄~|mޛ _L!vtN{: %CCدS3 ~J+KcH$'wlކKhoo+))A4D 8TX=B^k{= e84DV6IW;0zײ- [Μ>qsgΝmhhlm jn|ƪpZ5re.%\B/ՊWV_SVr*?KiQ ReA1Y{֗3C)1I&$y =`(XB)Jg _n>|\` vxf:ӷ'W\WqK bO]XF`¡idqlhuCO0.7 ]UP@*Z@  hz2"ze@;d^jOmA$ِĔ&)i;2#((t[P e& aL&!D k3 N't"@r‹-ّ8CK6L!pRFIVDYyqp(‹n| C3fEcX~ÇvGmoo|g[? K 2A+y3-lϒq?S/dj$2R ­5YYE Edl^{18/ !*>|\U ِEEz<.уyz@.%JLt)I$5%H";8lOh!GTp-װ]%VE bɺ wATj8#{Q>ÆNKJB ˅))bJa0CLR8Q?J0lu1Mchh CZ7it: S$ iB"̥6@(rJ.ar>|\JdZ&h>mWh-}U5-$VϿo|[o_K_yX j  B ^+]TIBWQ1GYgAqgT&\re33a!Aaa`_i<:u_/8Kr!)f'@(A,G"dxKwfy΃w x +Y`6 @+i&7]8rH?\yy#?r Dʑu=kɞTsNխ0>|q5: (AYrIDAteS AoDz-^ܟxfLH%6)_QE!ʶnkn aTӢck mlkѓ 25E!d |Ko\[s-9'hpռ -sD5J|z >:J"hnn;3gwk?$|S ЁZ[[]`ކF&ܳq/1]+_Npv8gI+**J4@[@.}^á`Mi4ͺHM+ @@*-6m̶W$ׄDp!O˒@1/#$Ҍ{HL(aVvF/͠s~%YIbn_CFX>BqX!)Nj9}1[9˄YG0>i\e˿b u֬@j0eDt,vO9*Yt&Ȗ_-I_HLcUZ HE67ٵgyG}{v56SIU5Yn< 3"47=c[~vdlȡcnyAqPK}k^|Orn<m3#Ж e%CA褉^@f~G}׿z؉a[L}8 Eu$s% e8q{\\GZ*핊q^1zR)HK%xf|I+--ECPdR k-7z4[ϲmJ8x kYT@:UM)[@"חi8qlͭ-ݝ>=C9P`; M;';O0 ~Gtl2TYPdb("Bgm en$pMDLl)"(MÝ!4<~z-Ȇ d[\3W2DȐ?RÄ\M+2vΎ>/U^T`P;1>L7W!]ko56Z7SSLlfj(((^p<#L.<]Aeg~GΞ_x-r5W_yohhhup*ז'xz۶/7oaUp$iG=C9 : chWR\f 1Ptp^gcdc$$ƟӱX\kɓ'x۷á͛7rͥ{<Ϟ=Ӎ[vdIFO%ؑq0u!PߒDV.l I.@OT"nhO U%(K !{l sK9ru& x{PIPǛj|D'8ܲ l>FZ-ٮVi =-l掭Ͽ맞}O>G?l}mM}--- -}ݽm=-퍍M\+ME(#A9By1BL }(h: (*̲ i īq,vӇ  Do(GF8("w  @* ]&m_Z0m<P$ѵP29,(U+͞* *LܗTd2g, zY`/j&1M6/OAn.n&'k4FEN5p,8Jc%9q/l^N\*xW4ߥ'7#9Z&2baCp(Ht%`ȆHk}$ ,WZvTʶ(nbIo`,Fࡃ=RP|#O'?>T\R'NM$uzP:{[6x[u͜pPтHȦ0*N^n'0c26õ$(8Iqdd"- ])ytdam$izELr C^Vܦ6?ӟgoΎ֖d2if:t2,ۤb]]7d*a:NeQ6ǝNS,08KI iXrlFY`PA/<2X{*i00?s`C  9)0=r<7GjFJ#ORlU4DBͮI3g_y^IK|ǎ65ih<.~qa,^T_BV b5ZLP `A@V;RIrrQTEIdIT&22􇎁-]SZF:.N.PB6*f;aChW eO$)| R(ҥfh)dɀxdaIίgSŨ+9uf]F`YG֤6+^?a& LxZS?\0'c c F $yL@'yRsx'IU2$(TNi.ݣ*/Ԝ uA&VXあlÒ3XXQDZ~閖zҥ+Ñ`0b12ǎHsKJK˟}#G^,/IB+օ ] $K.+9+*/Dbe`0CÁ@JQQd.bdG<-ޣy;@8655*53D(,,,jhh蕗_c|uuz{J{7ۻ/8q ;X́{t BP*>vSO=QOJ Z 5ڹ{xYIIT! Ƒsp1ڰ:V>|MZ2ow* 3l^3@KdED_#ܵ d mdkZ[[q3ܖ\ɠgb`4m- ']=Tˠ-Jc+ 3"X~| uhAuC&q %a؂M@\an[Ż75B# `D>" $OkB("7I$Tr2Fd`c'׋0'Q, 2^0օzMkw̽[. Ry˃ o@N">\XJk`zy/ ˀLx|0 h0˶WVVF"@ 7Ds+**L$p'ի0-** htЬnr z@":Iwd?@tnE0Q ((q~ ^~%KK/=C?z//nimnc?r__=֦W?!PCm۶?ݵ{7?߻wɓ'oqܹexxXU \22A /N1Y9ŸwwX \R`\_$A{ۂ4u+ /]yVf*]U㡒VnLJJ*zCSp j¡8Ui4C00|xdM8֛qȑMl*X4uExV9Mhs}]OEMdhZF#q6Δ@PrD+XQQ0 ac(_th/Fn K (=YnߔI˷&6J M āt*548`tɝJ iC7Μ9-+`o_1۴A4z"4>uz)\ڄF߻":;v1,vT2F (.( ( ;{'>~w*r|p:@WU~;vug7 {}X'~~ ~_q4n햏}{{5Uݽ{WCCҥ-nrǎ8JFr̩&[ \ @}6nf[ݫʆ*bs]2ӲEnj*"/]XY^4XHIyMDklZF3* zၾG~__|/|O|ӧ  E}~???=svΝƿ>rlpp"EQRD$~>??^Y0X̓Iu}\0MU6xhP Plr'?IUU_xᅮξ^БDw1y^ P_BND؍E: RD0M$< ?Ņc0\d ޟ<أ'NODvqOZСC>=vȑ#$:2F:,W,SSJb>f݁Awqqnso6^MQE[lEt5E7Ha5AYU,U3ۚ5g $5vJurD#n?APH?`:;StWW#z{ﺺ%X]Y+/oomikkn{vsC"_&N9u! Ϛ5{tΟo7s,.LyiȪSRL$4G^;1)'*RW#Xȴ FR롋bs bEւX, g͚?0:88n㺎i҇)1dpӦM˗/_͛7777򶶶d2PòAp 4h(5|_'xXpi$񢢢zA $ݯ3gZZZ~ӟ>ӡPf鲥53gʪK,QY]R ez th4+\#!6gș5ku5Nց0i ]o"][.ԚyY.}XMi#y~gwlL p:6-M6=jw QvSvʕlMFcF8:CR`#tj'>>aC;~'zvK.>?}K_LDU(ǴΟyo+_W x_ÇnhhOS{/^LQ{0tJ24I6@0 m"$1HB !>nRiSEҲ͛o5kVCc/|׮[SY^Q/.++9sF8)((PU FSYj"%>P- a ]O.c*m?qĉgϞOSTdR!@`|Lt%S {b N:x|نs`h"=m:sǖ` b3&Y?{6Xt*(Lv'N8Nz;$a><ɁxG>ݠs9W(cy o K o 86 &=Qݍ FvG~X2^Mq>^'XSx _y GJ}P ,h\W%jQ :S,E2Nٰ0 GΞ a؂>RC)*.1-gp cYv041 X$Er?0D A ,YQ 6סWe$|^zk9&o?O_'o>s$YO|?G}Ʈ~UQ׿σ2}ٳwW@c{׍MZFYc`7@CNB@X 1~yx"wX>廛I (C ?zۍ7XQQA6( :&K@@?އ?u;׋6ѿtΥkf bK*% nٲ7~7,Y_w~w>?óg~{ *8{ٳ?Ç%P0d劣h_Z7, ayޙ3g}?xG|w;>wO~[n/O~rJ$5la s[4w&Maλ߿d¢òp~;g?~/=w-[8ۆoܼyphuP8xؿ|_yҹ{v>taA7-Z8dAj;w'-666ܹoڴ2(UOd-9(ٕz\H .Na,f}0tq+WGB~fg:=<] 8?0{K *8FٻD2.oV #o$Ԗ<.P̱MD{XU^hnZ:'&kA ش w9&))Q*"Zpiݝnqq"KBxph<@Yq z `a8$=&+Z;D -c*HVC=9`R8ZU <\PQ\,hr"nkjՉFÑ0.(^nkwl0VX]U^]QGE5&L > ЮTz}| e˧7 vwuΛ7/>'NsVt;w… \ffľ$B'%IJ}~yetd[g@uES{vϛ $"pmzuFAa:r鮮"D-1q|}k{{:54v*ni4**AI X%_nݦ|[ߞ=kvuMB8UUz?]ՠ>h/f>WC+h3k::gijX4=vr˭˖.]nnH&M3f8~xggW_߀e/2իJ%/(zmd;vǚ5 o|ҥKYzk"'6(>.Kγ 5$Fxo G{}dw2Hf$ԧ rܲ,I~hή[o޴YfA%FWZl2 Qlgfuf̈́#2Fj)EPQwɫ c >s5klذaյ\W#Ͽ[Ν;k%/?zzE 3\ɀ$ n\h53jPu֮T@*0PP3g΢E4MXa\d.b`;޸}o {a͏Xz[43adȶؚ֜AUPN9{raD_ }d=rh9K2 ʙE:u[}_߷ZbjUim41Ʋ>!L#L:N  %v_OoA8bz|c=N-\ss֯g`BWWwOOo<9sVQQX{$6Μ9:_}D vCxi'Ǖ UUqЫɴN*t$CC !UU1Le٠{"1MD"@@CD# {CcZ9trG&(56א5Аu>6h!O^S8}vFBST,ӴJ(t*.l=-KrH!6$C:LTA&hE{JH\}ӱlGl2ʈ(2&x>|Ki7>'~re]tGlEqeIiiJ cjKsRBŎ(Ú0^kQHY>7#˕&,[+_귿Mի xOooKkK4)\PIa%I\q&x R):וUcݵg4UO% OF8^~U.]zӧδؾkɒUUUKnZ4IgK45dS?gf0W_~]<^L゠dpFoPaҏ~!}q9)qO{u۲^tcew14TM0D" 0T F԰Cmn@u` NP9By]"0qQ2 3;d_2W )+@m+(Cau ڎhMnXa>jdjRHQT J$X'}?k@ X0/1p{.2ȝ#j[4.i0TG%K^K+Ujt%;Ը,%$ @Cc7 PFy@jREEEeUŋJKKgͪN yp8o3g$lhCV#CÃt^FhcwZ$ԝ+#h<&ʗ,̧?g_W|fƍk&J9}nՕ$nF{zzɔ$P(\RRx~_Ͼ_w 9z)Yweo=։)Q'/}>|\Bw}&zo͑ե{cap Ix0<e'D F]d!'$Gخj[)M5ΐ7 kۚ{g>guw/=wv(9l:ښ,BAZڎucW^-֬Y;u-ͻ^}u}GۿGSi}%e?cGoش,\,*PJJ ϛݽ{:xx竻Ϝj\j}CC{Çu̙!c3чg)j5#U.bGshuދ#KrɃUĄEL!M+rsu3Ɓ !/Dfxux༼Md&@^(n|vPឰk:.((nCK-˝*2L`e18IujP5Y Ȋ*9a5=d43r,4 &mEjcM^ A[bKF`BRs ʊ^*%qٯGKG\qgɂ$y6xKP L/Y (* [E@;eki !#`,[!%]eIaFջ*/ [fѼI3tXIsÌDŅLZ~BLv?܇iZ2Y,+K_ =ɴZ(,iD" ͙S[TTDR6J&[ێ:ɪ&E93kW,_L%^#qm~MYyT )hήDi<.TK2M+Ӧ(o dZ۬XTbcYJ {O l?o޳*qΜ;qƙ55ڱ{32?u!:Xw`+/?~2 r֭5{F .-=rcG8zi%%pxhhh=-vÆ@S3C+V-),92G՝8qEVEq;vdϞ';p`WW'YYY } ʖ#ۀ2J<"GNO;gFw ~Ɖ'Pr5j-â13QQshT*߱@!OSYKd5d5'GCrxǃؒh$cĉ h`J9,0ϝ9{^W``h@K'Oy*~e ;gLJKەs?()G92^8?GO|tvߧ)ضp0 *f{t&W'6jrԩ?m#wZ\X|뭷x L4A#;:tZBOTBtsΩɩbɰFx܁Ν;]&'&{zz9s^۵sn׳jڡ]p[oEW0*}cǎy719;v@h- }?.:lFO-8&o>"tڀذgt"EC@2(ɮ1'-ҵ5a50n-0ʶ-HlqE%Wg@SX&choRob#F@cuba%Ww'>=3Rt!j֦f~NjWx2b!,:;tw=>Zw tb?RY9~`\VdՔQM^3آ7zpƌ}ҥ^ n喁 @XVC$|(84P.z ֆpv,')m 4i9 Fjۃ/6p]硆zp|c>ej w]=֙W{46-h~􃃵Ňujg܉R>;,ײKt<$o0Mz7%ӖdV 8t9[GSiY 'Y$] ZIIAE4&Q*-#:zGf}P,m4P*~qY@[r}mx$SDbÞʡRQf#PLl NkK DB\ԶGbz/0(UiIERJi/X!.)RE@.1HH 0ICOL .vn$LcZ6ַ|6e?N&HQf#" Q:(7)%R,U>Ȍ\&~wEskN 4.\Mo]gz A~H[ +6 aݡo qC.ٱ覔 ;)Ŭ{NoSC_;1:^ e~perIGpp>ܻwm7_( 茟69AGm !WV|7#ţ:D7~|}w؍F>'?{^?hY0= U5,vJ=#ށ0t-'uOzq+ 4|D 5P,U00"VKP$R'J |(,4]?|3iD1!R-Tݨժ=daM{j=pKղFuɮVroQz4٭]Ro4LcQmo#ydlBi,IQf#PJP|(d _"9S:s x Xk,Pthm{UC3޸5+†I~`پ]Ιˡ>DxRȉȹCCiӇo;snQ,j{Ke'_|ئAMWTMc-{!:AW3l3Fyal哨 ZEv_]Bz,8p?{kt :hS\Đ `a 8&vmzW> t)V򜝳ӳ^ OqUo + bZ;G3 i/G7uL׶+Gf=a;D?&g@$&@h2L@(D!Cյ#TCb8Tcl1McW( RTpjOa-:ZrZ#7 wyy9nS.!AH{*JEћ ֑ݧC3²Rj^OT:s ֵŁV#ϩa< I$f%QyolM +cp 8!TC4z=yM0-lAv0gԴ!0JŠ($%Ǫ;Hg4(CT#i@0M&:@Ќ%6_;SAWB34†wA/.xNH>DxC ևt[ 'mr:)T.^rXa9F|FG%}x5^lg%[.wK8tX:E'pzSt+` LTE@]"ra`ΡgAbBvsf6 $Y v~Uo w"* .zhFxI"T /kZH q聽H. 9:4A`ǿoөg POŠ!U,9txjHLr[TBz.Ԗ0ь)5m7F fRs^u 40 0ҬA![f3|BGsYV~=נծ vfGP$8Dg;#.ͣ bx`*W / "xCgi,1lȑ φ=:2ufHkYg$\Y1$}e zMnsKt _)T.GbHa]0mZ4@őpÌJX]@UBg#Xv4x k33jfTCA o{U˫؅W9E+A \pvҢ=>y,:7RjiKȴ͖)fɚXb6*)a@g?N'gF)!.ZGvPULS!σmteC퓍hyCFѵ|mtq;H{H^sH S~#F%ޛxtCJ54ZX[G%՚]ѧp}2clwh^r V>=XF./O3XE<-2ť@*5e * @$mtLPdPfMұ({@YՒ [@A U|ڙB_16;,4BOB M!p~XfCndzhKڨ֤Sn4ot6F׳TUrYZ\kUhA$IJ&'B7#qDcf#6},'zݚ_TJ ,er?ºSha1Z\}a_Z,`~-[>l奠Et"A6!L{b.@?i\ȁ@eC 9Tq UYZSfTY6>Q5ʲIUJW +lZ*6& Щ[NͲ]ݺ OvΖ[BRbľ=w.՝_w{~ir-xto1TR"83F(fh:ObJ"'g+o!z4LVKK==={<@m[uqcǏ:|C}szPh8~#'N}tȅg/W+Aץ_諎I׵4bv$G@IDUz1&R_8uT۬#֚XqtjC_{}Ї_^T*[;H@?ty }~QUKqZ3pxsZ&Ւ,xC$s,gk%>M[j_?T6JB{ӔQ602cRq6 įEF-4ю捽at d C'ۍ@GEwJ Abuܲw oױmd#G#A@~Iюp5+-196aov>3m.SlS.#<xlSi}"Z7eorn`0cLDlߓ(h_:}ɳGϜ?q7JlʥU?,Ua+Uj +z%'Fu45Do,B"wOB1hӇvS{td􀣑Or[}NNvFllFed_= Thn eDHv|O[$,jfQ)TfjMSl}iF%ekP]@UЌ(q P9`Y*m۷--::m7MP2vHɆڧ cb*5"=35%DqK~f}vb^"u1diT&*ntu u 4$9trYa_opm._|ё|箝$zC Tz`@9f۵z{O?-_y߮20пsfPi؟ʍg'/םЇ?vﻥ;ᩝSSCMWn"xAd5Ç?:v񱱱aNg^4W[U'Nٳc`T*ɝQV?v }c'-uvQW)PܳGrڹsgOL A!`yPGqhY(]o,pFɈ^>3zJ"DP1wb^ zH4HކRcdcژmaHdʝY%s9 m?JxC6m6Pks)aVDۉ:W 6A#Ѥ8 t]҈aiune8Gl>mOz`ZT[l`bQ)'MY EG3PѳpzZzh7By.=.$Q`#bCRnԱ&H~\異h4+CEL^ rG)?-X> ޵X,؅'cH=Fh>KOnm}./rP@X-aX"O,JT*y/mHbUl3:cܹF^{ږ[Y?ӿ/n{d]޾m;no ,[wNΎOmN Ϟ_>uDp]8e=+S##}g#jֲ'X?.u '~c?OLWw?xW^ϝ:W1u{{o ?Sk> Ο__~}jme;}t`کuac [C<6`F7\ki=;=vg_<u vk>Ε 9p5[7+.;oUVC_a@H @&I1)H⽴䤑sXР+2!E%40ʐY2Z[/𺲺_|ɾ, I<G_ʻGN|⑟inT8ށ|λ>{鱱mk5gFXwlenZ/^9{ŋcc#ctA38)ƀ -`棠7+r#NY.>I\o㰔M G܊HdB,atxB^eIĄ̨jaը5QAF gmCT3kf!Q:נQ]0ll_H.HB&YT4E3h !> : |%L V\k6I6P#.4YA\X;Kk` p(!VDdW@si) F5\`ȭSȔ!7O]vFLHj06<tҶ pR{O?_3 ܾZ`qxxOXw:}M.b{0= עPAٖsy139[m|qCmCLX[;c:w:wX'NoӀvmo9=ow~ϳ^ߍn{O<1k ֿ7o޽suvvԉ?W/?S?ˮm7~/~߾w#'yN©ytd*80==}ם&& /->s.w筗<裏+?q^=xJuT?GݵoezW=juu`#ƀQwF*Gσk:2I6 J=caE\a FUwDIЙ~u*o J$MvD:^Ymjڂc_&k|ʡ3Un%+ՙ!X"%*͎djAk "a]YtU {!Ȓ"`4b"-?eb S<bQ#h-l 5A8۸},/޽{hh%Tߙ# ]C*}ͷjB WrXݾsrlພS-8wqrieqKbgv\-BA _8wuϞ(x^xazrj=cNL v#WAבCG{G?жmb:,.;н}F ¨=#^xϾ^>Q(x'N\.op9yoyx=wS8{Է77866R,mջ>ST*GV*Q6lGm2Ceб/*N#맖(>J#2"UB:ҟUٛcp , "WUB7ʲK=iTq _TY3,JD>Q+Q0F2{ fTY U܌*KQeY(Gr4'EJQe)"e.SҾr4>C)R @vuĹsr2a4^ȩVɀ$)  M 9qd۬A Kw®.!6zGR%&y*uz>Uܼׯ.;_9{BpxcccJ:û6ꁆ}Ï}m)oVo)vw /;}s_'|Ŝ 5BяƦv)^|W^ٟΞ^{{C#??#ݿod7臯}3_x3O||7WVos BhG!p<iitsS* ' Z$: T Yi T` [̨ݚ50;R)Tq3FQRLvUH$U/iG)@`Zȷ.wIuTQBFGp(fTY UcR$niֈPoPW{;:i Psr2ad]XN/,,.,,X`~ A6z<MH =+uG~ť^ajebx.\pܻKG_{FF{ܞ[=|M EJ/{?z}-/v˭Zk}}ãCEI!M0?6O?O<,D8xБ;ol>]+''gC~xĥҥ_a@ߣ?o]kX+_k#}G348 1r#ydɣ/:I$OgD$27M*2ɆڧU[6>mfYiUv9:4n8uO,1B(*KQe(7$BeFZqG#i6B4AI)bi ^E6:7ez DlzSg{・bU%=vA ED%^Qj6B@VF z@(,)"9@ߔAkj򙳇/hG{{U ,^8z`.[t&JHJGRg8O=ԯ__~ӟbR>bb<(n9;BɥsàV;ِP0]g~~ԩSC/,^>z;woA}7tӱΝ?oxbby*a"fZvً/߿ooKMOrи:!^: XX/N:AUW4A"*n(H_%#VZA[[PMjFՌ*b4*KoF:aRq#HHnr-m JS0R6fEy0ҥ':C-:ECA- I }NNf0lC!~ceewy뭷ÍFueBߺ .ĢbH"_ Cu]gx}U ~ݷM !oώٱ]=V]hhgҾ{oSCv, DD?0OO|7>9Q.]˽tqŗ^ pÃ}t2:'>:y6mx} Y7n{H䡓3O/7PGuC? c=?OyޙŅW^?}^=]wz_#[rifvp 3[^6 (N+-K?|;v*.` .ŋsh[^]F亶ѥ2B"DkVV//}}wOLLwSSNX^Zꛙ>>>8ؿwW._|ុٶm 'JN@yf̎##|K7;;kk`OɭUoG~W-{w:{O= _8?}ǎ55:6rx:xq܇ەħCP_у#Qʄ$!+OGBU,'4|btDNIkUFj 4 C;n-HICW^33Vଛ{6\gTa7͋ZL_@ij\W5$?7Gi47tӧ>rgb?"IC=-M>&P*W^y%'mG\xfAZ[]t¥ށR{w51쭮}?UF__Z^:{斶ؤW,ضEНor`Bn5ۣ_ֱѵa880pCNN-/,;uVONN?}Z=?xӭKBhoԪ.xia~3?ֽtR gNDns;;m033;w(?"Vk]c{nu]ʽG4wݽ{׮{şY^Z>vc=&`>,GrD'mFL.`dy7U"RnѴ3ӆ:6h jۨF6uO{= t@19SNFZ/E:zKHY6W(z۶9sf||EwA7'YtA68I˯@h#ǤxGX\~+{wοÕGjS^~k>̎.<_ܛn~j凞ns@3.¦BXzE^+*K "qV{ŒA[da^)zv{#ǯC__sAםk;˪T*E. 6F~)@(BKq]H8}T,#ث}qk/hCˮ밑J}qD| '0s J@‚(c칺4.-..&cЀl63Cc94{{O9rJZmbl?x.kSۋAHkx^/_{v\6ygN7o*uSjZP/xEa?C1L݃5crD> MoD.q~ nsGuS"Ar/L`LT_T?MD&00c@S۵ Ac? v$Ў]L4sfuw̶iXa@w0)ۇ7ym՞ Dh۳¥F QA\&e}ꮀ\%2l!{ȑX nyP( Q(xjM\%Vp|Ԗ-Mͅuaϟ;1- $Ţ}58l]zϾ|siis\GGww6;=7P,CgXvCrT4\J jڀ""/]N?gFE) h@$)v`G/CZBҴ*CMVW{34Ҡ"QMqEz"0Uocȥg40m iRv@G4w 1r]~]-lY6{:%ȪiRm]͓dukN^׊ʍ 2|hƌXXJSaFu-TpY|a7XsR+#~ު5+x{°Vڔۼ6R铧ǟx≩),7#?yMzSbl7,s=fgϞE (kȿ#{{{2bGd|^&j!/Ѕjʛ!]¸Ġ['ʒWNNNNy'%:d7a<嘰Gf:eX&2'Hu+qtrv*ZZK A27:p4cjK/smP m. em Q5Ui#$\p> gBS}2HEG.aU Ae2NZ~ di&Pw̻qcAYt+?$-’:F.22#t#oKW;kec]vå`F["k!}C8ɶf"b+34 wx( m^fI S o{'fggzFqSݭI/f%ȮWŮK T(!}iޢ/ʣQ(2-% PL tFo6fd>0$n_iSe5z2ym-’曗]C0r]|}Tk滮S bܙW %t \S:`rGlJv-YwEdWޙf ̎_eԉ]-@%\yf6|l ._>s̶m۞|ɝvҾQuƎZu` |ڿ}u!ާGh; _! 2zu>]r9L#6Dtf=#1~ѢL[Hp-|mѣQtcj2Ԑkr6htEJG i@& .,6K/͏|ӟ޵gd=SLDR~I6p#"0\ZZA ^}/ CÃk/i  E͘Q\3{3N-{/v|-zlP&tkqdm`Z„0 f)027V"Hɦck*״?unZZ3Wft a["[VfZҡEPآ@B)[lW_cbS޾}Tooy`5nulj+.{ bwjoO, QjKGSvSwvɌN e|͏BFP6as){RmyM%]!~݆S=gmT CٶhFiT-lYimB%-&aO۬C5=NbNJ5ClIi1>ӳԱƕ I`m2_>|YtՑ"ù^!Ch$hYH&Q]-HWXtb 34Ҽs II2#m{FZf–hEXFqf߈z"`A.')W`bsǎR$sXƑ4+ h[FUH#֠ku]r d4cNj]cFӞ: 4wE -:F,q+>N5^"ԛB\q>=t=Rft03o{}jF';ik oxJ:t32!P"^~"*MUš ^F. i;k6==ݻwL{,HS32s֔ȷ j2yM'u8&hЭ%0!X"̈{骡s8Yf#bSMc ۳YNC:GzsGlf.[#a63":@=w؜f>5vcXƴRߓ%TܢF=kJ>KݓXuXY,+kY3ӓ8&m82tq,vo:bT:@oh4<{uv6%MF {R!qꚞ@3= !~ɺK1h vkf:+` ͺ9gka kz vHga]MIf:ΦzaduY7Yuo̰fK,071tg3 @RRj+m:B'%OqiuHW8V02 =M攰Glf͐0H㐔G %;f_uul0\YE%+ɕZ3{ /#Ql{Q6E4FUТxQBgKG1Rbܘ s;]cpd pik6'X#:,dr# G]HGH+:CٞE@\f^hTTqtL!ɷ2Gdr#}3:ͲMj6㛥KÞRbd$2UG4Pզ1iyWl$bGx_HmY^]޾ l߿_='N (%k9 kx3%چdɹNN38_=UoUUDp3l3lH0FeXmF):+Mg\L˔I:7i"I~0ƦEiZzPe9J{Db6-*4ڏ?2ux$gCT@eCӌ*KQe8jPQe[iaUJW3, F]SBgC?:79$)Ȫ6MdP1{ԺL[ǒֈ hQdCӌ*n͖ͨ2f6 Ts sΧ99mBglf "qq^C) 3=ͨl}YoVE* NBm&ʈ5w]-3r6o(RTC_m*3'''sd~yInH b̈#P,2U9Tq{$0{|3r6t_ho#Bm('''4oH x2 콎լk7XjFNl5P :䎰u,6P!{=a,֠4~>T@]FsQd/KT@JӨs|ͼ>rQGټD ]YKx> LC~,+ 24*Q-.bJ[c"=p捾o#L#B8999999Wދ-VYm 3njm2B[aZdjo!]#Jsrrrrrrrrrr4W2:mN 26bۜ Q3P UQfTYf0? K@$xkMy'*ɹvԚO99999[.+g@q3I(2,"DQnNENɹ n)[ǒkuԥn[m HhmW@C?I)AkBs| ݴ6$˾͈ͦľ-&*=Yn5IC}7@ ! tP*v AwΒɍ0?>aGK&ٽUH! C070DutlY\f\;'o[,ُY#tmft&fՎRm2"<^XX}/Jc@UflJ7ûDxEl֙!V9f3cn:[\NTl4u"WuэD idluut6SD#JdAS0 )I&of,iι -B1k]]IРۮݖcDj AGn&e߷"7yx`\_ ]C0,J"zDU Tuͨ4];.x]6omfL)jRN`x{QWK VMџO.hFPͨU9#LV@ZFD9UsC" TY{(]5}QeQej56RfTY{(])Tq6>ʹdTͨM߷xrm#;F@BҨ✜S3K,6C/|9[5Hc6?s F_m5ͨk e}3,3&t5#Dь*k:SPeAь*YCUJW3vlUsà:UԙBՌ*iv%PғxϬ㨂-C42)ǷxM"rKT7ʮ_6v¯  Qe999E`)TqNN{`(}Ы+#J;cπ8G7FմFw>Rf|7 ̠7CW>p%4!̩1,VmqbZAhlgINLeh.! Ԩ7 eМgQu:%,:ͬVب:ӜVIJe@'j*1WBnz ԛ0r|`k]uٽQ l fmI)5=zҤ\p5 *Diy_P,=C69N0fdrٌ j0m`W5C{fxU l:3FǒJ%A9H+RB%k V63jNDR83ڬ9uy ]@Dfu OBYN *XF FF)7}l*yjKӪJŀٌͬXa dfԬ! QobRqdJƱu Wu!*C7fOxaEhcFۢ0lhDGxW5Q3FԏHyF,f mI+X]GE6ȇ&U| k.8mzzzvNOM':4 sY,#Ri1 l42 c5(,#'FbDj&- 3MF CL B< 4 `>퓨+¨:Vv{dD)7f;D Z3۠0McJ)řu$lӳ!Ǭ,)c89ى@v4lg!g mU` [k-rDF6! ձmaMVff#H`<)mK@p<0W_}վx }$ (333ӥRoo t֛%5wNvFdYg:f=O@7#?zaDU"3Hc?0#DZF3*M;D',:&SK N|4P sڡE1rv,qJ< ^kZCoht,{fbsGmf`kKB)qFRdωT 0k-$ABXB{q6FPr:FK1FKtD~k$šE=Z680oa_[@l6Ql1!!m u5aYosG ՜its!ʮ t^2̺T(varb*׬(jҍAITwk7v6Бx#5UFaRVa$ 6F #tЙǻ4/tA;S)M!FVd{MqĿv4*L-y}J޲Aa4*u8`ac'9.$CJ^ ݹc0fu1}po8ߙf椴`ϟ<|@?xۉDW'/ *'\ pS݋6qTŢm5C~QVs1fԉ∣7]B\G#%@?rb^WILM3 fH" 3ҭXl|i#CCg0~WzH{YQ^vE'!6O韾)i ITT3:@y[ #"ʼnm#|U55%KfߐRSSlllLMM<{F_.F $ITU|Y̫@QA7;,Xx6Q.ko{R: 03Rّrv9Z|[eWQ/1}jVGEBHi[H*i)Xq䑾 }*tXqԻ2ήk}\8xSɤllO5RYC2)MK_ԞuqI73EձP¾J{Agl*EAAhVvVzz:J?_ؘ#3@]Fr-xӴ03Ӗ`>[r]2.w{yoy73oXDO,>rUW5;V% ; Z xF[>3M&KJJnݾ-// Z8-nL`fq1UJ4/o)}ʟ;mߟqwxE̛e+o}{|2VoKW ra{JVt_&8`g&\Ns|5eG=d\c:70RuBCO Uw 's :y+_8;ja*T{%RVf&"u[oIo"؞V)qywX! ^VhNyP(?sZAABb_/0uTmsɎ~峞f y þo*cqRuJ{.awEVqI(ADؘ%-$AXB[ےWRRR,-?]O}L !Ce6zRoO\.pb6F ]C) [{m+fx>%L wXI=ݷq*)T쐩yXFNf䂐GOǘL=-r޽7}󫫟nYbń?y`$p-\R2s,}"tVdE58CXh&R>/usYF,vGMvToY 8v6%1D}P('d455EG?ٗF?k3Fkn߸_±b}< FlyRC7OeM$&UM`*nn^-Zeήbqb^Q](0T]^˦a7V_Ipt5bzT>U"} O.LL 'gGpbfEK+ޮgə fe)Qp?RV^=L_]=2ˈu#UMUo*ߒ<jt5(R$Wuä-V[F\Kx;HT= omfT#<"H$y%g++3boUIqۧWF IuI#]C~&dnhdQȚ+rN(/V?1$nx՚}N4O<4r^N:G˖~Gwswx|9w)zO}\Nf`solDy %:!rWeP >;70\tz`arq =1FK6uv;w2odKA>yB¦ /=#@|yoc͓YA2buR-j `R_]6ٹ#z[ ToP!ic $Yӭ/S\LtwlݠٖuOjOɮ[U.kpi'궎s 6|)fa&(svw05 z'Ԟty}"#fS&-O|1,m%s/.4\Rp}^*k``08یgd<|#$$/)!} 4 @SEP4*t80*JhT ЩoS`p(ævQ?@`[0h0|JGcMȓdpG$jzMW:)ԩ NC"W[$˄A0I 15:P*ِǁ#tg:A&Ih$b0 Ʀ@Цɩ=u)׏:qS3I屗/c )|LN(rsEz ?ERAkRO}ˋIs_qdGb3Vf~)Qi(E}-dwi}F\(<'|&+2`V5DeʬsFDx+e`j{РjMYFO%9Ǩy(1LRsstb.;? 3Ӑ%؍aie)Jh0>EiDˊI:7VCA3ķJFFffxxUUUQђ3ɷwƖ(kI<O53ڛ;{0TD (y0>S5YW^e.75F_䕏5-/CoHY}z֬_OȕijZݖ0iᱝ55.vJ]/Gf宍]wC{o> Aj3G^i>[h\uy੧~XsË[".4 97CC98000LNNΙ켄[Ǜ`gP5) R˸{H0^r569ςw)ZBS`Îv%1WrռLUsyvd= S4sTzQkux ӛg82KM{ :|R|3u0ȡCg2ƒ<*ꡣ0Bj.8~P-~ezploNe~X\)M9QWu\҄'=刌kꨳ""0UO^Kl)(3_ رs1>11QTT|CCE}(t}*$WLtw47t{ B,XRzN m/ SCRU 4<|8@{mm8X6c9x)h6An2"!Ć)cm0 ? rK||Q]TA7eMcaH0$nIZL7tQYyx#T,;;}kHO&$O ׶tOLN_(%@@|D"T qqq|ypssπ/}뛀}o&v:2,FyuT Gu>l {<W=N(wKGo)zt^QK\YƋ<"(ʌ̪t(ˈc@CB@7g\v C@@AXj&m N_l {gX[[C1k=#>>~͚5πg[YY11KGC@@|### k׮ π|3@π3 f-àgxyyg@@@f π< _Ox/سgg2>>g2%@g=z YŌg߿C hL>6ˡP(D"kd݌$_^}9]vyq 'O Ϙ||||`ajmm!J áȯg=cTA@@@3yF@@GARXώ#e=Nh$2 Ahsd$exdbZ3( x B> P Ĭbo\bkkgwJWKN$8"i!he`Az??R(1:@a0H+420Xt.\7u',l'X P%x ٱ@kIϸ|… g&)ΚN A~$i4B/mj) hgX[j@r|/`#A|5G$/O0\333 ~ >gΜqrrzGA%&'յ"y2*&AQF(c)W8-ǂɈM+#0a|)JKsc+?W]WʆֲqŪȏ<>kM4M0j*s-~VC\DH\1S[3ẢH./ +p 1h]<EHAf͵@e\a_$%qdڋ*3[h!oo)/aR"l/xg_ 􌀀kkyH@ˌvJ m`34:foSm"0  hTFRpj59~H/4bǢs"1.+X3]V 0w08 ASi08 Q݁GXPia4SAKiV_}-p5'lw݈%Yʿ(iw2RHhU`%PNo ^e)"~|T`$!g*MtOb@ӣ^f}WB6Tg位O)[4\PZzB*̀h|qWi2IQ֭͹87+#09Nexg[C$> d*pA#M8:"Zx8F12NE!91u*@`LHo]6"jMgPF#pB>'PH8% A%DDT>9SVh͕#Oq8p; J&&(8@`h<g|gw ?;oDB= OzGg|Աkdg+zNCn*7csn,zY,U}4r"`BbH(԰Aiϸ}O吗B޻y!"WՉWZ5vS0Zzj4~%5 MF:$͞byuUb`PJ2}I c^FS7LU"kJ(V\6>*: م^f9go)fţ҃MaÃ1qtuzs?򐛒=)5~6U;.i~YC[D*ݲ붼μCb*뼖Pu/p;|,rnm++ɼj䆤A:Aiܮ䔢.: 'eIX\.׶WtR ܃ p>ĭ dKA(*vP8_\N`FY- Cm̴Qϥ_.bvc@c~z{/Tdt YUXGOi^ݛ^9cLBs x-g|gwaccQ|5࿌?;7xBɺx}HBxbTL9kR16gD% -s˼j<v?}#C8P|: r?!#-@3 _uf<(4T?:WM!uJ"Y48lwzL8zYPFLZTB)hOY54P%\ihکd&okzvxFiْgw.wgʅ7 I58Q[\ɍG^v`қU{c"3Ƈ&U7n|G~`1 {e %[7xh pD0鏮j ^ORb@-slPZKnH˨wt+ON~-xINȭA$eLqb%Rq£Bm'\nSce|͝QSTӧ:rJ˶㧔]!]DM@V;Z|Z O(F|iw\0 jz u9RjM]QB\2gw3Nd?ÀyWٙ"bvB$%$$~v_4P}dV7xXǞ*gұ7(zV/yrvrYa$+8U {e40(t`ARozHSo ;Zkza&NWgrϗF=o/tȒ;^qK볻~3z;:x,duVƽz&OJlCLN-ee>+%̉0dd6V`nz*Aٷa_ňWD4Fɚl|h1OnO7)xY]z| ('͋ PVLj#7&Z^9,Wbj|'sŒ,G(oR6yYbоg;-&/aQN5Q\.ba-:6-ZͣژBbe#0Xs:5k#)\Ǎ&*&D6qmq.^⭇O]thvcVF$U}<&sPh |t+N?˓5ҳR#^~*".x59O\@/Moo,LSw>CXGPʞ|l83 P2lJs D QIIɟWJCA?;h]\E]jw$ j;W4`Z8h0j-방iSa0$ FѦgr58 ʽl8SLۧ2#p1g䔅(kT";x~ ^H3X{# ΅n0ڦ zF}u7U3a(Q]3B. ˳JS>^cJ,4[Ou[ Nrj:tYIrԆ26Etc?#a 􏶒o&?􌱱YBR{B ~nL!}gP侶"sHHm]d /)}`΀dB7w#(, v`YD uԖ7PzDXM} x$C@G[*'aH s%(:Rca 'xvYI6f@y=KJ$$)+Æm,&ن+_4c lfdb 'Gs8F!`/%?dSCFa%`KC y$d&<|l<4-$9VW c`d)*"G++H 1O>SR+-PV7/a t C[]H|;cAQYu44ATa.' 3 30=cO{5f?Mx'a%{ ,Ϡ^=x7*k_@fJmy껲KvOLK;.cGI-?W4u|3m o5oyuW+4n͹x{d;X; xCNFz yN@SЀ3TؘM{y񪘰?>]b(;!;S`ѭwS_ XɃ|?3r-N9;a~&o~gU'zw)Oy > NeWx.T |c̙KF}u9 ^Z[CݞU?g2rܝZ^ie^bSٶ_|'| Sӝkl#7h_ش7-@rܳM5 ^`PPqƥ7Skx{x-їJn>Hos߲e+3ǯi9O—ghGoW)_޻DL_褾Œj>rD/˯=8ǘ2ZhPuǧuha-2Fڪ>@MIfR`}naW5~3F*=ke7c_8 |C Ԧ&0˚E{/T*udd(/ H, >SvB@|'3>h4GxZp#0.ke1499 Lh7<9 Ϝs*?D3}C/jzϲDll,hgԨ:Ya/=GGy^KE0{yytN;=K9Oɦf"a~3E R"st]jBT%FsG_!a1gu s8':F) 5l1nUU-`S1I7hVVc!rDnl#7&jG,[?U$jmc-'73 s2J&QJt~/-ݵix}sYkBڼ KeԲ3Յs5KE&J3 mk8::Aòs0"$9ψʬ*.[MKJØY*he5\]TY>=cttt,̶ _UB@-CCC*ϠQiSq|&r,zi:_9u>`:?x|]Ď BU^9QQ,ŏ}\p^@Kk7WaƶK%z}_B3i,ټY#ܽj3^r>^n'4ANjӷmp kLCR[I>RO7Iz:sTeZ>]$(7.]{Z2.2~պgLք8ATx3o 99;tΒ%g)Lܯ߲-2*9-;- 9]PYҪ _3 tОeT:?oqZD,Y'IJ}Rtb~+4Dw_ϋQF m(0HXOԮ}Όxukg-~0jK$Yh3a*(o}<}FA7Y8盘N'U k)<,aw9\ѐB`aug'3( 7{JMsц-ԅ~]π*! ~`),x5 {O9EU8Njuq5~1PR%H*?da#S~(ybYl铊Z@Za"EgjTlL瑣6-MﹾApIUX#™Wy><运.ab^ Ԗ/z=u=˞2/]h-2K4mę^(`"Ϡ)GWt {^|ν~m^}ƢCʩ6勞ϽΑ\w|k{/:m>iU&M89ƻb`U.X%Xq3zO3w)vٚdJ[JT7e(K듳a>xTdy׵ӗ/j Zk[$[)#tPH[͋qO/clYK>V3[n]}P47yvtd`h[pKe*ՒFs%نR7?$ _~]).ljdUu'Lإt.UHj:b[vq40MI+.9ty^q:~*%$mV>(y" )Dw29)ҥM{3ly,9f΃`}EwJj*;Ī".޼Q1mGbb71=}鿜o,?ؖRѓyFR^O >=Q{C[U"_mgs^v0giܘxPu"LǴϘJ$^]{w Qdrqϥnl_SRѭ[%o:ЅA#a42b}LF󍋵3nx`{.-@(4"IRj1-(EW-֞ W_IJKzNV|]&4ЧO(m0y x2),Op6 ϊq\,=Y^Rum 1͑^6Pm&iǤ]TÍ GL 0e$Y-_H }[N{`NN@R:<5OR+,x@Pw5_:A%MJ d$<[AeUKYMO]8rjoF7Exaaϟ7r2?=GT>-K:Wd*v  Fڢgl=ڱ؍zywv:o6Όa 5Ą$[}3XU]YW~FrŒ%Lў{ƏRqK&c!clW\eODMg\u)j7yy= gO n6Oè~:< 㚣{B3n%skz<V<^%b]<*{ŕ1lM%3^6 `#pekZѤA\y'BѨ֛gK_uҒwj@Z[YmuBh fV^/35lKR![qpsQ5==f<#W˝දoHtEmG*NlMvu.\C=]YBߏk}TO*兿IWj^^i]% PG˟DgqWJdV«1"Ŧ/W=vj&C= <͍g_M>ՒBlNLLX;'* ܛs)GxU 9ZX?8'>=csԐ+#ufէ&dPuwa΅r~ifb?鵿oyFTfͻíOGU]l4Ŧos9J̩P{x}[E,ߎXq$ŦwLLj2ykO2Yx<ΩAx!AHڄ.7a. Z}㉾]gsaR]WM0Y|,Cu$TTw_(.rGU_;Lu[ z)qrЫJ:u -34^uo޳E/u/V,ygw{ǞqŁu עsǾcRpSeBϰ^ʺKuTʻ|7*1VJ?^&ioЭS5%q)W6 W^!^z,s.KO[=>1}aƙ?53um`Hwn~06~S!CN?-VJ8hUK5x:ߜyk0 И?&is7ܾ3(w$ ]U#p&L2cH@խiS,;mv9rv=Өo÷$P ҫEKS7M;~v*⏞Ƹ֋13&ӲKت[ Cc]̪KW&c*=tr$ oGzX=NUčw޷Hk !;yDO҃{/3, IھgnSZWTȌѡ [V[Md^uvN5(X݉3tN57]]>nl=l:0\U82o" z~qGĨj~R;̩B`ƽ /Bl١D uM͕(R{Qkp0Ww;g+~b9ؑ|Ʀ҄I +o۩uR #;Oy*q DXXm0ס$c=SwSXXXD+񀞡.&Vmm7.m?ΟƵvW +$ʍERRv+K>^!A/Fn kwG*߳OQk倂ʭ)zF"է/Vl=2ur+vK 2KgwS=o[^c"=Ќ(ݛ< g`]ב̮qiC~Ta_qf *ʎ  ̹&d<J"ϟͪDnݻM=(Qe/[F̔8G~y[gS3Ձ.؟?53I-9a̵|=w5&KBpTEpw-7C|?nˤ Kk0O 3op_o2S+K7&tZQ0n 7 $lW@x̆$A`f-g|3 f?3ƀ$`q'022H?_3fnd aaaC}'GΎ@ >3 f?{|ώ?/~~W CCCМ9W,@1v ɼ?;~nU<C3!π%|g! _|g\r;=B͎ 뀡XW,fNָ鬋uqwoK[΃Go|+b'J0 ĿgFG"/g蛫e`_j@#Mp  pS9F 0¡`$?P,*eLAcH$4>$ H*ŠSH5=*F&''I*C4$J(8l6Zbhx pG: ˀB$$D.w~@ z IPaÝ36fQ@#Qh A&) WB6 π=c(25U^::QQA?]Zw&'~1pX.Ɂ"w=l0J Md 3RDf'6,%149zvO3^KiS^6sRn>w43іwpⰻ2!4"GIEEDTաiL+~3wQ\^1 ϿuōBIj!tiY4גn3{wQ_ UR_̳Ɔ@ >gP(n3eXy&NCT~=.tIŻI²Vf$ݺ(*$B劸2 hӿm8ȜrDs$[m(te^d#Ċθpof4W6t ,ΝVR|S1I8s*NsK,0uki?c^..My/?===<<<znÔ `w؋a pǶ樨eѺxQGH<^x1 ġRMnެuWsj^O(\؃k,ĸ35weg2{4e\83.ظ~lgW4a(?5}{'9Vv+9oМ<gB}w |~K?/+Bڦ/Q4 Z32g 0=<g D"r{w~$ eboxdyƧo8g$%.p?;}J6n@l^€&3WOF| ͚̖_ɼʻD xdzy7W{,N3>E&Xk"ؼjݓ W->~4єZHf?1-Vp iRq)$mf )]WA;kT@~ mwFO=^U~9?-S~|x5+4hpIe"aNq#!wdg(o޶83'3Hݢ eWg): dZ)M_Hwg&=іWgz事roUl _r=O 6P*a#|S}1ton6#r6"5!AOȱIiIw ɴ 6Tqe-aW'nqAKߩy}'PfחWI:Yk`'Gڟ; =g'{4DKͩzo1zoGOߧec9S. zŚ)M S{Z?K|gJ.Sm٬YV{2*,=i+L& >on)[ Z~zE ԱۢV;ŏ/-9ɩgng-5z/1>+>3)Yej |jL5 3}U`?)s&8~QO_/x^x_e:jPG ݄֛hb!^x9y~׾?&/:ӹ1cA_rK><%+}#>D}=ͤ34 E 08ŀP8M-#Bg`P g`q#ipV0) lw|_f9,2T@^&(ZSskҰNxO<;uEڑQmʣX ,r3*=W+qOg)F 5$&f<κ$T]ݾBbNzɣ;xUgϘqa h#+JvHpz׈6 :OvC9zFR+3.bpX~핻XozϞM>1g50"4ڲTK, o Syo8⺮lqffnmdKWnPƇ1އ45w2:fqF=% Xjױ3H^:r8YV%Թ&"~zC\ʇy;.轿]+yhyB!GK:D~^_uFYs~"ʚ̮=y8黥NE9cj8X񙎎vN}3w_!z?Mp̫)GWcWfzY|oj1ڡ~"m )'ݞ{F83fm^O&twJiHqBjo=[hJ2SQǔ}EɉSv\a. xMi={3NS%NjlU!,MX$,7Т[jJ Sq#L;foF]qD(},w\~=!%#;_o sV:p=GnVO "C}c$zT9zù"KzFZb䏵esGET~ V g,f Б|+VL&>`P)*1R8=DUV̜ehDضrC^> Lq7,.1EOoW?xڻ`ŒKvݧ*s>\ jXvyK gM g\XU4xkC+ڭ7V7o@ZikNzBA`Msk5^ni| ؙ3[y{.d2AKKx7iڶwN {:|t/vZ(.Og,glQft]6?w& FIHu/飂ٵ",6'׫,^:_FQ vWcC{.ˇV=ZKKq/_yV f  ZK |Dd6tB݆|t >x@AO1lҝ E1.xWp4oE3v/G5o}]@ 'l|!W2p+ϖ{Vh]?w&6` J>Lu %hs߸L+;}%^&g#U~H0E- ^:s`{VJDp6LvqrtT_T:݋!1>ۏJٟabg=Xp^y򱀯pG,1MYQX?Sʃ?Dj }3L:}1al $9D}Ќ5Xy铿ydhErxE&hr:^6`}G$"uҝ+qȿ?!3;.DgE+;TP8C@f+w }-ަSGS1d7VH}nx |`nATdmi.qpoHã~[#Lj.T]t's/-O;MDQz Gt+u*/V|xc*Ph(x7GCy3CR>_Ti٪Dž _p@cDpsN+,Аv{yn"K}r+mxnBˮ֛[3*K\M-P?{:y'屷&fUpJM8 ~QDިW3ҋ{e#}DGŃ7_m(/ i ]|&7sog1mE'.} c'#2o"񜌴Q[W I"3TrCWNvB.IccooA4HyI |s0Ҫ0::;Ngdd~ -(*.F:LI-9w ,\-V2]dqR"Q2B :"X0QTX gz lKoܴT F'vu p ,IUQ5JwuvIl ,s#Agșǎۻt O@LJš&Fz $494c$$E+C3C tZTRVD5baxd`$ec*BHB l0RLBJg J|PzkS7K;zL*?4`n'"!%)Eho'LPxE51,aZǨwpTđa*FH/&tֆA YdM6 DHh$6/%av0}{dt{M?63.r=B!519 4΀_r6oKs=x۞:#ޟ{ EeV|~fM֐"=9L{nSۺ'fز&Q<2cfKK!"Fnx="bi, pTжtb3qm~#{QH(6Dar^:UWzv\ɿ{yym=Pѥbr KaGnČM9$e Ne"4cKgP t4f\vF_BTvwQי &M=.5]c*TF^]" v/ƨ/:Ѳ#p5f!HOSJ αz^Ҿq.֝B!Q͚Db09f%,blD/%k2ayߣۙD݀$vc@0YNpAT=!5_^ժs*3B9˷L}* Yk. qJ3|!NDJk.Bx_.#!lڝ!M&Ta[S_*-t[k.09{dߢy.g72bֺo.3b`o:pmp>9j3'Q`_2Q_Vc3W]t# 8xLDtiyEJF9!V?xH7iK0^U6Wpֲ2QO|VSgxt+rYڦC9kp Fᔏ](řˍd`=^o/wA |uuZw7Wnh) $l,^fX~ ݲ]XqPӥ&D:DɜPm+~ce.=qRٻռ\ [S#jZ{30m&vc/ė֛xucCZm?w 1CʛLfvHΞQUS6X,dGpKߊ W+z7V}38lFAwTk59{B@1{lpuWmP$EgV씳B7gyQtuвF޼̗ ƌ*ѕ 9wH{)f̗Hg쮇+74xdIK[QcuE67捼Zy]}3cIPu%O#Bn6?Q05Cѣ{Bk[s|{mW䦯9u/,gi,I(7!sUE!bu|PJ%M\|3>`򵍞7Szs °$Mf꤂n`KMh5@Sz 7U  bkl}D4/c=cbT}ᯞ!%@[.Pq u_{ƍLbŦW6hyYgZiV+zyE+I@VeG Wh3-CaX$?(2&^AxvmP =%#5UGK8nܧmY( KJTNT2jA ~ũwk/T=?Z8 q3[rnw`/-d=w=d+Rl;ױ5W,/8K @^1R\ZN,2>ξluu>NNi8w꛲&.N;dJJ9:+ƚSz%g9&ǡRI%vN%/Jvs$ƙqLqV\(HHHݸ@b}VҸ?ĻoM-kvsҹ~ot:Nwʋ6U3تpj3==Rڴr ˧VhW$vdo"JY"p*{Y9p,jaݫ6%7%zS)" T.%M εRx΋;00uцõ>XdVsl3{ %yA3m!9([h:j72+ɚVm]K ̨BRC =m͔DrkDvϱo87%l٩uh\L-%Q9veփx{ EƳ w.7Qq'g klfԼnɀXW/3u0l&e0TBߥOlC-t,rեMqL=ŮF57k 2'x)2#⪶k6Ӈ}x0<4!/up0RJ9nž!+z޹Re$ee g &^~ɁR[]vGx2łmiw#}9JU idDw ߱]3O-g Օ~ zp 58Ŷj|<}HR 6`{'|Mɗ`^pRVW M'%ײ<ܮaISg<eOUL2^$(aN-'=oAO7TJvޏ/oF,Q?"[gbkOMx-ї.e.N;rGAN"d~{,}3K~3,Ҏ\pu^xRLڇG2T߼fHTyњͫ &bRRރucI5{X JÂ&jޑ7ݤ˗X_+Sy:KyʓWPtKZT+~\gxħdUg{4D.3㴝cEB&OzN7:HߋHi߳nLhb z޵Jkc3 9W}Մ3[^uSsJLcɁ{jeFo_/;lђ@ueHKם:(*X~r49qMWX)%T4,6l[Z :bX2}2'%B ޘX $Vs=uX9^z?iKHݼ2_t0֌ gڣeUg(K4"J/^.vr{ BgvWjCY㥩3Č% Eu]~ "XsYֈ]F* ~@cОvۃZ%Myg<͜Xن'.$WyF|3c\{Qfaoʻ2wwoj0R^2{L~8/nB<[ ! te U)Ʈ>r]vbE|qyJjgzrN<$gߦyXk 7r4EÔep(Zꘖ ʨ;ZuD]ڵ,dUM$jyB0iҜ/z*J@ђ!9GO` qY<:5uܯƪNL)?gt_om~O@/;5#n umt@v~ƌwݣl97.est#pɴON $ZL^e#v~#ߧ7P?uC<>5e%oc!/cE?~"o|5=mΗQ T\R~SCa&m M#* xM#;҈v3nH<>rf,h2$1 &Rx̜a|wƒ>iQyv}T& "qH6Ǵ;•.] Fp;rp  e@a;<Ƅ7B$HV h>Zvf ̆#Ns>{E!}d[A0WMzi;r+Ιe8ř[N XSm4ZB^W<)$ʣ ݌7,~2 2F{lՋ54Qi:/XsffT|^;,Uzq͵g~$:1y⹞*6l̾;-$~hb[ieJ'U 3?GOʙ¢KgJ) JIv4|$R\w.S$欄 LezO԰Ic|W͎Jغ#gq 0X?!NIHŜJ@n"7M"$}=Cl( p#l$?C`>aoD’hM"39p 0X!<L' SP8JPDYt:yxFCAQ׽r` Dh apdaFcTa) :9{kđF8`NRZs?gө$bwGD\`@w?@ `, m|tp Ab]$&C  #!GG,-(,"* sj D%iC4 GD^E&GǨl/"$$b2H0XY!x8`ql̀ɨH@9-Nj≝=L6L\Ӕr,g|h A}2`(ct &2`P&}kc`(_N&2hAQA E!1XP$\IT-)M081A8О[7u`>i`IJFCIA 3%.4/Nxb 0(]-g 0=<g ?gLO<`zx3~3xd{ƷgLOgp@ѦǏǷ֮u]a[f=8u,`80) 'LoϠ T Y}(e gi0OqYUA m*_nJ6m~P|gL{ȍ\y{)PO~dfIG->8 .'K';ƆRUٓ8}ZgryOœF\ C$My'-( 2Þ|cr|LψzơUQ)PMpbE6 83ޛ!Rj^n{K;_hUp񛮽}'@PڜqY]}Fm]Hg$pDvo cJ@5pz [i֪Ч'MYuHEy_5Qƙm{V/- <`z2-<{%O}ii}:zN4{ 'Ep]ggMVqv ]78kM]tv UROΗ>7r׉f?Cxq&%ERqߢ]a%4&{;>d&*]׺-M ܕ{EsfaԔrڹ ާGNNOxdZxFGG$ z^q=#'fľ3vP=~Z XlK:Vo]_8wu>-~3j (kݝ g[AEO\6}WgJӗH:WR‹9*f+%E]|67&P0y$U&7[uٯ^ql,  ^Y/1l\6|-;'Z4x$~b3⸞[$e5YI\Pvε[5 .y >PS"ofp҂+<7Q#$wNK#O'A{{,?3 oR#\$e*{A@[ik+ <;(=Up; =Ge*n{VPO\x-7q5m"*}֗v'?{pcAy(ŃBJy@^m/A ?gq{u3;,6h-HoA%<. 3}7/grX,޸=(}T%t ׫<*|7{Y 4ŗˈ%iK Χ>+R{Y/@ѸV;V3GJ6)n.9t2mV"]Bd*kN!3ht$A`n3'#k4oōӜ| i NXl(?i[7;`&|"P:ld iߎg ů.)}~坿290O3=R7)KB{l&L! V>|1X B }A4:-H4 >5W s>Fj,FcpB (ˇB&:\ph ?? a1d bpH]Ń{ PEpgqo( t "T:F3O/?:P&Š1>>~ il½cqvIJdnjC,b3lj6 ŭ<0`Iѩ4?? ަO0 k>L6FH$|2tHdq@0\@&Lj9R!ŏ?5?gp@Ja z }k%073&>̈́Iڸ,/Ԙ_eAS')%͢35e%k|y:js#ΞK&ݳg26:4wדeP_]eFB ;ެ) }($lg!49!d?|o[W^M-}AAW5,} ѬgQT^@6TVw; ybZyx8,MeGz!| שgv]&O*y9rU [KZ_řEY jݝѐ^0]ڻN\5+1IDn֚T=e>ǽFRZ 'ROfˋA_('%7_'g,qFݹ# aul! UK@2meVӶĬ?5 ;f^|S3gkL1GmV~'56\ޠ>mdz}u`MUVw}fcL9/?#ރg6٨!|uw3sL]:1g8{rŸ #"Xm ;)/>r@x"u3~ v@_vhTfb6zuG4m*^7p =b$hٓRcQ[nǨP%IzrCW 0@НЕv],,|r<_p4kO=, <yLm&x\nl #>Je .i!/7I~ߞe3`P@c#Ë+B ^^iR@:ωbۮxk_"P{oU8fzx`‰SWK]*^j,5|`V 3)u7 Z3Jz hrcgvr7(8m!㌡ zt qB=F~2] 0!A.qG<j-}B/l%pΡgL;~ OL< ?[fR/XD鉣PP3vܽC?BڱNu-F^bh˼6>Pr¥|[ 9-E I e(.;n2==|QjVᢨj8(R{qMƱKxiX,Q}'U-/(4o?t4)Ջ '9UqTjͳ,c7ኧo>'f4Zq]7<ԠPhaĥB(Ś,2歆"-]23W(盜Q~GC= i4I!y ?}EJҝq{+d9-Мigbd!ޙVMVMkm.x߹è3[Qzr0f rcց[ !}G]uΎ*3ݍ/.g`Ŕ|^$?}+䛱S#)UVTںv|T;Hq£WN<~#.q#2S\cֽ`]~l#je:wB3M~,v@@"7DrK?8A QP(D <0O s H9N"S,4 Fcp# $A!qG&f2 `BxQŠQ L( Y& C$NA䡎~k}Kph808\/b T́`Pa * "$CaQJ PF(A 0y潀 h P4ŏP0^p& VCnx~E'Lph VT=2<64D@ix->Q[;Lw83>-AH^|8KO w%w[g|?1l@gpX j_Y[ϒPg̶sMA|&mjw$,)qs@LR_k]E ~΍M+䛳BT^oLAEaLT̬wqYT3'}qkBqXюZvZ~P8.7%`g *s5Dj?giT*0p;Nu5A!N18 9=b33=c"!&#Nva [ 6]%w@f,XFB6`F({V]pzvhݺ\S x Ԩg[s-/ZjvV4pHҸӻrO.T`_]FغE,E\Y2 vXA?IW2&ELZDDMUFJM[!>eU;FŘK6r,\`ozuΛ6-k^=.'=or”NlЇP9)HqYYuMOCvȘW05 5.BUhay=mpMdhiƽ/S `sp(K7%^; x0<.mRR@б_nm 6_*!uUQT~,)fMVbjE2܋Gc[` ]W;kc`JjHMʬhfstFU|>с|$. [9F6v^v$a!mKw3kyzL+U楤 T.uSVqvHM}Rvn |.KQkUD*@㭇M[Zk**ԚmSaCы8RWbWz]uU+GւÒ[HК*2ʚ f!?״ww-f!KˆݍƋb"c_}`@T9t&bl rĶM5s$8`rsNn;Tj\])xMlꀚxO͸A굋ea Oo@V3b^1 ̰_s2UIz]gXlDz#ʮcXocYZ⳷#dF}-=6R[ D^ƂW{p>MP),`>Id[Q˖[A*OJɨ&pD4lݗk6]ڱ؟H Euvu8zv(he<6iR~ITqR'#ɑo5 oqn3UO^Viwy莾+"YnLrQ;LSg4L{0F 3 (+{rJRi1IgP[OL|J=寋ۆTBO{AW+OaRs(3ACU)vg~lф+=֩^:Uj 0-\8QSŒ4uL1G w[Bs_ԑs^+l99qI܃Rer֛o]*k%J(ލ5̆R_4@ŕ6bђx!$yCҩWvV=WV=ꢏke:0ާ$XH;2DʵFhJ16POURG ]5DŽh#y6i [>6ɛ 24W~@4\X^ΐTq߶ YcJe)H@PI>T]_/7Ó5cVHm/-gս֘> `MشINgV>2mDb͇b㦹w;h R Vs&;ZL^6xy4Qdne)yDIjwp#:Ti*o[~T[0ʚzM^]pEuf {F:ӀzWφw^Jv/..8a-N! Τ 4W['{M5N 02wn`t 6{}';nNSѭd1{efumEfۖf/vM(n)*k-Ia;.*=/~ ӗJب)by̘̎{x7<C% ciP]'v:?ot۱lCؗ/FΑcKb56K;_3 3j.l<}♒κRsVC/d(z{O?} >ݜ}јTpo-eÔU׬^?5 3Yei R$fƨnU^y/svtVVj9Nrϰ>dz@gۘp~:96}57+ԢȚfL/+#^a <1<YDD&}Rlldi 4[8ׯgc~-( tlqgޙG˅./F<~q\LG~nQ%sPk P(JK}gԆOX[};Yde%%`wn^x:~JƟ҈g |7 ~π{Ҟ8-x]{TDTWGbiDyw2>> 'UNޑŇ.&g|m~hmg@QC7ը{]&t32-8n_!`vJb̶KZ+o.p&ֽ~)0Wr5~ J"/_pm[{,I[d^g=~R1?:afUz}{,lax>%DC֬Agp*=o*qg1k}-{˼q8%sϸ8եmlU;'М y:3dl"^{;sZвs3]Ew|=v~祥}QlԁxpHꑭ餹s#W^ֹ8 m`|y+=9$h˥WcEr!/-*FmA>+˗XCFUV~:3 &w|jwXstˣ7rU=毙ae(,V2WGmsL2='s@-joퟲ{;^1mk9z2nsi ]h5N@@nH>rD-ď7#$emYgэb/7BЗw<2f2[~4aπ¤{"_䵑YO]ʉ4gfrp%RV3kUڤS7uWLG+VXgN|3g;kŞ1Mu"}Y %ZUh#'LF W!thtA%oŞ=EOo>H-`OfV_ t'.ܶC ;8SGg+Wsi\Ilui:xbNԨVK4}?ӱfҢ-Y7ZtE]GjS@&=t[y╘$c"9}Ίy{S7>_㫊^g_K"^U|)=/EU0b>+T@X"#aE"-nJe8 U4PWWGp#+QQ|Ven"%o $ r{ÂbE|O~%cj2V{7NƩB=GPPTA@!*PVnQT.s7@ &/euT5տ~`㩸zvyP7E( b{bq8rR C1%<_.a8 r*1Hȵnu{vOС^)Q|eW=ܿv +8-5;R!SP7dˊySt/̀@ ډ7kxV|ӯly\%ϟ?.Maο)l?eT ^Q“($3!  `Q ܜD2G/+lMϕ H"}E%@45/,P@$ ?m9X$$ @cqDOrdR'd!(@8r/ 8KlTV_C3o333 g8N*T>~ xtQ$6 \A...Cp8HFegg7zÓ P(p%TT,I>ῐYɉ[}>)GE ,ҏBg :gIIIdsBln׌Bfe]G=>ae+CT@@@t ! 7otuuɹ{.ǃ2SS˗!-d]hTwd / _Z! 0;r :DA(,SRQLnͮGhÙ>Fi.uj*!΍aWd V!3mnnϟf W7 ՘t-&tWW[ ZR-4)SBҵnvz1SP]eY[|:Qk٘5|QTFXi׼'+3:{QR T 6ce' OzYYa*LZ)DWM Ut_> 8ڝWUcV njgE+Ǚ?}(oSTӱaA !"ի&L8qDuu5lܹ1... @a!u*c'MxFŬkʧsgۍb<ײJ*1^ߟeGL{/ng*MZF|I-<^ztIַb+º<*OjVƚ/^}Ѳ pB3/JG[<]\$vZcݕMtl܇TΪ7h |zy~61cMk5s+-M1NvLwN3C3_{FDDDff&O+c26m211ʤaqUl-^̞(,xa/evDK!gOtU76dd Yc(Kf[Rӣy;1Ÿ~x|;TodQ $_d6$<#-- 3X&~`K3007[k43yWa![uƬ;0dꃽ9mtU08B}7>c-1՞vkщiGNx~6( qŋ;N$bObbʥǦEgf]v0éRah清g'I* &zYBU)}ܤۜ {XSGhc趼{ f*UTS3736T!x!B0::͛7<?X__ 2ΕFMĠS^˧[NTd[7&d68XLݳ_4L޲>[2Wn#gg7b=~ [{ƝxL";xo/ynIעMg)NzRG'L=Z|8x_px =ĬV eW_xqRw΀{wu(=+ \E}˚E%p-ivчB+)3 ӕmFw';ԚrlS֎&*2PR_[לuqB ITUӟld[&wz_Ú۟r}ZBzzt[ԭsu4%Ylg:h g :gp7 weÆ +//Ӽy(ˊҠ2ߙ(~?X7EsܺeT+R(PP9Uq[ N>S8@ƹ)2OzxhBGTO$v`Gx/kSmR;f6%π 0??.a~>8dffuJ&(p)lz^fLx cy|~kkkUUc]tX2jRK2+[ZųL7< @P]] Wb a嗔Ew/z 8h0Hp@<a1Z 6TUUņ0Tr!0xϳI7^CZ!wK3<N__ A |yE4]@0b mӈINT5D<{ {WIg |{~޳D о/͒ !@@@x·g%WKXH / ӞUyd;t[A< SvzPh5eƨHe>S/ _x·x$4$=SˍA҇.]J#H;Zg0Yޓ݁%/W>W g 3=3DwP@&Eb p3Wjl(8%A4(O$L*$R08"0XE< Sz>η_f1LMBнEi7n=+ně9𷨋Mn)c|yg};* |H5m硕z*Ӯ]J+*֞h~3cjrftK4@@@5g |{ 1$I9]Z6egüL1MFĒ"̸@/g='go?__g/7ӵ-(4?.*Ikёio2 #ŰU. ueF< oϟN~O㘗,XiDkT0uט6{a֖[ ޼Zˋɩy\W,1[fxgG3u 3=3dR BGŤL!Kj4m!^%">iwgZI^=c3ߞ- x9HRYzR*݀9Fa33 3~ ߞ?vk˫ڙmyUD=GOzZfv)f$Sj-y}_ +yD<#lc?eǼH[b{IHc?ji**HZ?4^EC Af-c6Dn! | s@%bO-LwQ׹-8c;o)Ib3FcR>+0I/3=g6pf&wLS$?Ǥ/7f a8}3ٳԲFO闋ȓLjhC9#XϐH L] op.@GWA%͈E&&F}u@@.@<t/囟?&`gaח~,` l@wĤN_73>J UN" ]@@|gge?{\ uMreDW ˽Z#4Oeh@4>3|AĘTp$ !eR10D x CuM5  SA Z>QX<E@R F2A<{!M&Sl;DgIibzyOJajsaglMWZu++ڕ6 wVu:/(G_qhΰ _<WW_T 2d63l r#\I͈zQGayDijov6NNwZ>S̩BCX7.i?`L X$Bw  5w!ռEVX50&{!πtuuQ(_>AɄmwl?oR{7r_Go 433^ggLK#V0\ML=C\uʉxƮWn>vZsZ[N ~/8E_PPA{ : xо#0@<a1D<`Wd*36YF:һ5MhY&(ܶl05Ay|^LcC>.ܜN a D3tLSVb0-&^\oh_ C{wE]|WP&4b@@@t  7rFO3U 3gIV?L%I$2z@@@t ݀x  3g |7 0@< A 3[`}}}3g A@@6[ϐERDX_+ 'т,B Ep ?,KMc8Ԡ$ @A X%'!H!,.NEQ4 ibT޶T E-D( .:>IAu oJ!O@<6nTd*Y*)X /;Ȥb@h8ch DnoDgRG 4XԿ o^dz'Ms/rqvTJ-n.9}2_{j֚vx"^W6>k 5`ٍg$X`͠~Rn%/ga~s_>E58Kvv׫D9L$6|PL6n墱J{+ 3-"ʋo&Y1y=ȡ/ނxz Fu,`*`91MuB')ΠQi$ۻB]Kd:'塌 AU#b!O Qh24Xr"|YE K )3il8P,ӔiD a rqLA@ .H^oujOK]%I)|qtND˥)+<' OJmNS2H|>-L&@sYB'a tw?&99w]Pz9Y17ldC X@d7=iUYGɤc\Li,4UD"Rp@OO0D*]pC֝3͔$~zp;|K $H*DgJdw%[vdB>/Й8 p X& t2BR@ȒCPb(8 084\<^%Qht+"HEB6K“(T:M~{F9|nt #BH(D3o9ZmDCV?=>E$ D<{y$@֛zzIa^c1pR1wvNmiGߖq=#:,@U<\mf0f0^$zmÀfGrzci1jmdCy:xwx^f`{fLuђg:ֈMphT_S9^dz#o]At2.se21 0Zy8=dRlƓ~]iXVvNsM5{B^#PSe$iLzRlAMaPzJ &l_9ސE7<#,O~DIM.^h?֕$vuץcngF",P]۴13Oo]+O|LZx+KWOvkzM4(y _{r=Fx))Ӵtv[VQd ^tQo]'k°G[_VGIC5ZZhD?g]zDgf?U,g-.\4sc'ֶ%.*}_)}4*ْxjK򱊒6B9ZF]:;rvR zEi&o$ _y&/;BZp%*Qq tK'Q#1~~<lzI]謹\\q:#h٣pv䆞ؖZYp, O^w2F*ݸߤb;t6HJStv޾`]'G%M83g@HYx;aEKe J$,-8'nڮ!+A Y9 q1`kεq/wGysl)'c>)>eqw%6V[:ӟs73ΖT׆GJsg_D[I|Ԟ~=e/dc_FqU|H~~3k0M.MY4%h*{4CWyx=訏a SoweII OCVܑ߳t׸cb-]6!xQ4,6?՞Nbҥ~/$lXک76x q.l)}l&yɨֺꬲ*3ϙß:rOv71qw;)>ւ iܹŦ5!k6۷F!DJI# sreT)0$< hwYm/{O]^pcK(}iJslPtm,m`Bճ#ѽ#f cF |[3wCan>g9VY?|03~y+ (XnKKgÉMjte / S{~moBx^FyÃWEZqխ`qx s bL1$_~IRb/!D lsD-`j[o̬Re+woνU{eL5*2OvYpˑaV-sL|gAl^?.Tz#@ʇ*F꺯Wz~(clk0Su0ֽU KoQ\uKs{nzb|b{=A>V/S_2EЗQhAdH+DX1g*0'6iO8pNmϥ}1vk.kFk gÛ5Uxm5K9AUTW*#T8g75{:'ч'^aV}F<{[yK?ժb6B  Xm5A3-Ky'dO;ĝNW^FnpkFٮ{a=㼨o'{DQϸ13|)wu%괻O9 I7gM|9?xHDme w[/ KG5Oޔ 2O;eSJ"_ },R{ I.8ˠ0mSbC]I2BmU>6^㹩֚XP:6eFfTіl1 q慮! m7-wQ=탧9^̘o/M*6ˤ$[S($"%0q vt|Jt^&>S^7L4eQw,[]odWo[,M]ܰ?wҭ(^gmUE1%u:k{RX@&?xYwv/g\Zn*U7k}n N̯>9t.&Xy!?.6/M4s{-)gƥ cl1꾈wڶ?YvPәG\Eyi 82R7T?\WI*ٽewY 1{4 n; XeGU_g 忋eȺnwʮu&v[UWQ$5/ "Oa8XA G|Q^BtJ!1|riâJx>cx7!~5L[@-%i~V8Ȣ6@$\sȜڞu)[DMr g|CĽ.\?jVxz+-a9VkIɧo 0D9-&tV^7 Vf`q\Ũm⚥2K"j+HWjcvi-؉mprחf5jKͪ/͘mzp`U嵛{j?O|i?\Z7w=#MU0M JטiuØz;65Cν|jz/hOFXF]-t0C][ ~[Lqn B0?'J:{.&'[0,^p]e.eiEBa%K&HW5@[oɍ3k4{;:C<ÓIA<G$pt?/H&<H#ѐX"I44#I(@H D*Q"|R)M_|sq! jgTg%E=c-Kzt1 eЗ)E?_' =szg ң_/C}y^AtS:xƤ עSwYi6 ƷImgȧA-Ͼ60(g@,3B@ EОʤ-;mjlg4d}a\mHuIi] jU%.:;qg I:@w.E PT ,,DQA%UPn:8XO8'~vv;}ڋ#3?ëjfA* HU~^=i?̐|sF;.F./TozOWTQTs諯Ft#=3 ics< K $ r$ʕ%dHNXY"<%`{HH/!NQ|8) EO=#AF׬##5r icmhfQ ?oJ,koaW3 :DS#L勤lm cLY V1vk&-g,ܿY >pBŽ126$ Ү> o;{OVa6r{?rrru]R^9u+ª[o^oFF 9on:sa`A:ӜB]u g;[g~$_qj /6 FG4? nU˵3|0r7ǽڇ/2E#}\X5I }|Oʒ)tzgTVVYԻgHO33.Ii%&+jsN?(\l83RGKgu~$j `;wJ©K2V>TBPQwLˠWLHq2^l02'3z.jl!%6HO3xzg@ܶ7p00'n14])e߉L-D3)cťW1"Mg9+'.2B} ۜ|,Zc1 $U9sq^ܼ]-Gs8O-3O{Ƥe흞{0qu|ZC2W SL9@ R+r03Eׄ*mHv4 L,6`<}eRf<M̐)K, #đZg+͸ӆ wn:N3KCQK6.Uz숊RtS݇f <鞁 V[]QnACdTu%6f8ݾ- P3+[2mL26C e?jd6zya-+YQקa99KX];{s#3kT?[YC_öC pWLIDi~&NknϐRm͇Iaztb'tG;(c'R=߰.u8-.LncF ٚ_]xFjGyqC&BC'Y6_8]D۰l0/83J4fT  ?JO c0|L+vEkg| UC67߇~as]7ī|\]~  7 =R'j-to~31YV6-_CS'\ltDb/u2/_rAiW/p6n˼w84i=<At\GY+pw+TcFC I<>&#y,4@xmHgt $Md FHgx-+~GBTmH(YSgr:dQ(} $ yBc@g*'<83<8zgt#BawГa"& xqP]Q 0Zo? y‡hI$j=Ëg8 }O^A)qyMѺ<8zgw"Eala#6UTt?k֍Scz=3yw:!mSa4.S;~ٌ63z.=39vlF)C3@lARjhS <6Fap"F}g%"v %Tjgʝw"B#q6T(D a4Aۄ3٧h?2yH$YHy,F+EB C墱X̷BDH n;B!X<F T\!<6&88PT q "/B\,oWðęG@( nl@W U\.HBC[HK\B"1$5+8EDC%idEPx@(pRp8Hw!DXxk-SӰ_hG)#>Va8WSYX6!B8ňH\Q s @O MHgp9sk\deMA}Iv4W%jU"a+'՞ZTW'u򠖢<^]a(SщfF*d_춦Njo#7-"Y7בZJZJ^dԑYW=>]j%yP?C ^00#7P"I4]} uIgJouQn\%KK%C)?[tfߡ+bŻ}!C'JL(%L%+c6Ā饷/y}dtOrsҒ[>#*b֪)0]9g9:[K٢ƧGN 9T|N ,\3}4{؟frqů:>\ Y@]21!`|G/U:߄8 RqsVh)_f#E! *3>t2;3#+}C>A-l` 4W< 5J8ܬ 4g" mw\:Y{i3.enAHB܆ZMS]-w;Uұđv)xr=;HYPE61L3p`6r`cY9rώ&Ss%>~$pĭ35尗NmǎpS^nռ)3B3 P_n&בOmkbqP24u  AĨ,i Teuuf[R!!b/HZo ^Z_Cg jTlkckG[+bdԴ5hd| "nSY~5AHJj !h؆԰&ҲT*8>vtp8y ] u4Xtp+EjjHm ,QAEKF["Zd`I±"ø#4ɢO-zF;x JAJ-,ƑUh2\6 ơQ{W<bbd,$n.!Qp_|'ՔqIK$[qTtuaJd ok*& $Ka`t41:`H–fUF8m,d*dqx0++G%b1ՒwQ*s;-h;*8aEDZZD$c֛9ucQ4g^cQl,߫a1ʃG".%W׊T_h+ >Sn;y:l溆+rLo_rjpo%p%ieFIP iԾ.qjB4'`)'yTu[ :tP~I e%Arز+ Hgv<,n>.;»_†m#IXGo$hN;.3fSҩ=15()oO\ٜwċ:աÓ #o$֩BK_湎Qqhw"Y1 'l4n˸~9N-po4Ujo9` 7.Y& " HoE`|I~۔Ws):F:(rVsBlfȐU G'Gd7 p$K[PkGug؊2Ţ1bgrn'y/ʝp}oҞr՚/PJ\'c7KtL(qa2!efIe+zم53kл=?Ӥ+)ܖ{Lpb5jïu:4EX}ocЯ(B}Nl &X(S:m9dhPTĒl% +,\5ct{CSk9ޜrc⦖לҭc31SrF}j?FYlQ!ѩ|N NX淖h9sF=~t;j~ciIuOL/*|2*-9W_5}L8_4n錡Es1澯ڒP:t@~z]ܨ2o9䭁!aTzSm̹4C 7@{VzY^6 '!M߿9?~aJ6k=RK/lW2zm^fYN(lmW릻 Ss#̾Dn*WdMeFjtcLjmu)F20G2d"}0a6f`d^7VQ {deJ_niCb޽vk7bF݇' ֧R(0rSo]jmÉBT:"LЀ Db>c 79{ /:ԺIՌ.HEa먧 S ch|^[rbES`$x,c o}|# "dǼBr"gɹ__3|8$Z.`8u,~o!Dl ,"#*73iʃ=> N_X*qv*c {m 0B}=i#".n2L2Y`g=um`3^W@G(gc䖚kejlR$g];)v^tɵfCv͵EgVc ڷ!_Hu`rd IAo=@֦$\}cv+f O}O03~_ yt=6(Fxj3AS4;=CTyg;C9ς柝t=IS+b}꽒 7fmX_T?^١oL]5a~kV ;w߄ hk!{C/LmxvtE[RQǍ夏1J"'lzv2Vs!ozs m`"m875)*s7;b(9iJږOќpP0&Eѧ Ө 8f\va'MasP2!&dO5gUkك;3X7j7M&'h*m-OB =~qPź~4]vFwtk"JVYOENI2|yOЍiK۶)D$ANiw[^86VK2ĕ]jfД[XeͿЋYu3f ʼq.~as:)Qa&Z䠤*;qʓ'أ(jhƵ&)Q>xd;Z@"uktϞm'JP+ݱTp¶ڌ/2vW3LܫL>oa(s& Zs|4zrB.d:g3]Bť/Dd\T{6ug{[5zZ0umn;MؒUVUwW+6'~t:ʑMԛS;=;^&3ce+C3çO+ ^r} CUK>;*h&! A)KG>5^è,)WN-5C=IT{Gim$zsk:JZ ˃78:=VBʣ=A'6ҳW;4Mݨ?6Bn$_:'{[si(uͳ-4?uְS~F+ߔeU${Sm4zɰio4'i|j {.-%+Q;w=c3$^PR=s?ۤhiZڨ>q$Fɳ\n4plgܞIvT4"Bώ <m-sLF ig>̉%4U GvC'Er5ʢaQkhL83 \_rkgz iUvp86PU"aR? W(;ȶ%muTWOpXƔjh?F#qyt?^qXssHC)FFF7LLкFX}t6~!4clsgDė1uU(_3ʓ^NDZfD3&D.\xԄJ.]\ bbXƪim.<&=cqôӯ3P6>^ΊxQ}]g)q$G6q@:J 9Mfg`T|tlPgX-HD !ŕ$ƁQ*ћ qVH'U`TrZTImD_=j&zϛ]+؉xrIձr+f??߷Jyڝ[U*ut*qֹWguTX:ǚ m D-[F"jeWksjzc&, M4pΣvgW7e(Ա>΄ȚvChob2iq" >ϵ3cw?˪Ă{jۮ>c6xveس'zPe󳐨'ڕPZX]hB/+ۈ۵ > V?pa l4 -)/ENΪe(jդbĞQ$oM{Ɩc5~۸nF1ʳnz^'B`i`kY|/6-N4r3L Ɏ{7};G}aȴeC⤫a}f 3%ROa"̉zU>ô{ mDkǒ:XҢmo.gsQձޞd%Gd%QZQAwF@< H=g"C&D斖ڌCW@ ɿ]%D$N Ւ~l&r9Emwnc5:ѵ+9?cpJyBac{EP_)v(9^WЉ_}, fgS*:U(?CbEȧ0!"_"y|:SJ2m~x1-L9?EsJ߮$5ֹw{`V$fx-23FQ?e3c_r@/x.~Ҧdַ6=彛1ʹBѳc,.45,i%0`UmIDATQd<q3u^*Z(7gJ (GWmn)ϊ q6Ϻb? )bXO`HdqKx<͇ϋ;e2a Ʒz"piAi63' R"C-uɷ&kB8$g)x񍞁kgphX$[_\\~VLjPNJt^%Wx~No[/7@ܶߑ{ȨMBG8a0mhcZ=K\["_<~d5}f*Vq  ٣(*1J QGcM&إ4[<@3<:;Nj) @o;k /cCV }zN x=ɵ2\|>C]Cc3dOXռ9 WPI?lZ哐'M8<Pg|ƓCo'ק}g?Ϟ=cX?irjƏӅy;K箛Ar3gtwF-],3 @O;jӷvQt~g=3R !lhk`22DY2ߧ <H5]qM*7 H;Q׻h~,3?"'J),ǝH3غ ma<23U9/--!^C0&Ugu]k'WB2rqM.6NrKn?eT6b8?N{WS֣@M=T!o7N5]e yfZe&8A{<o$3,TeEhDs1( K`tM|iϩL kE˴W5;xY+Iid*oa usR|Icxھ MAGu!(!]cFWɃ|X֢wsߥel TQoMJzFc1r3M?]:%j:L8,d@m$HD`OI3w<3Dڼ#H:vƍė%ݻq'}Ib ճ_it%ۥTnv6]5YG"+7ZVܽpڛvyl8x zLѳfLbkD;{Ku6*\?4o/3^ @:q"lna Cqhix 632d`pVHAjnU)D$3ahhhkm)mt`0L*P)D,Q[ D!ax-lo "u!^NSTi(6 eee_ě~&¬.8Rȩx UGiKgS`X5W D"Y<yas"F83Z9 t_z]A&3T_ӣ<OĞ!'' /?xg=FiBn 3 3 {ag <hgG<=?@xz3x{~43 ~gdp.ZZZtttg`eEW3BR+: @J<H3)xgR @ H)3<Rg)x F'>L?%3)= `-K -O\OEDBqk&$Q I=tVFw5 vݛk )7v]7LmxA %PAOޅ;rJ ^w,[Cx tgSf-M#)OdTA}rS'*.Bʃ'?Q@ N]֓+)xQOYW/eNWSNnI @JV6$Sx[IL (g?V w>c(9̘_ /F-b*[=;qN?-?l}mN:SD]}3ȄA֪yѧwn:#--?Y\RQ3d4b˅; ݊d2aþMH'#x)7!WO>3R2FXc1׶>xey+b2zoС6eة}%B i|y`ͺed5!3~+SzYs\lt]0u-mc꘦>]mM>agPb\2YY+e&Lg{cV;Z9jʲ7F7 -?S_sz^͸ z> <R~м𿛯|H2>"=+!IM׭sOkUD 9l.n~ 83N{.vZy9*.+m_{ƕJŞ!{cf0k &vK_WLՕ5 4)󫷇`EʲX}uYcW,. L}j:mUyQ & P@:DT֝˹,1O \8u O Ѝ˞sf({"(6-W@k; '/8jHzsou,fb.ޟ2o|S`-"qΨa(zMQٵZC:v,_f0p.>3|Qs_< kik5YxhhX$x8# 3d݆/XaAidܖvq .L5pvs6d;L:`0Vձ6ήPnk[9{w:XuIwGzbhΊ\Dxϲp6o5c4=~z%=ZҐe#n;kbVsžaMp ׿Y Ѻg0 <5D#gqw>kZHʴ{7cH -3gp/hy*P"FNĹ{U*&9EpSA!I ӗBMz qJC6L> 43<=t߽ίj^IU"Ν7kwz|n//~k"vEЙ(͟s?"hȋ}0JfŖ@2?3C{m*zDmn4/8f3*`d'x{y<?)3 g <hgG<=?@xz=3Ma6@oC\kHgjҮ_?6% :#&rǨf=dw#Dف{J~^gn 6F^\/'g0fwu5OB#:n BO?{ꏸh"Ӽ&o(jLxe2DWb3 Vu2WhD ͞qwν 5/Ȩj4^ґ\;[?J o HCҁ%QrEA =իu^IRwj~uRx' O5aW/Ґ|2skc&H3^\ *oNy!NCօ'9W>w U 3RWu6EYOzێ4C5v]lt?z$;sPiK!3C7{S4} Q4 GCҦ^Ys{9,' Rys sD4 #QQ#T_*_>ZO0i^}g $'X$bv:UwvmN!O㻜w*v'ߧW} /StzjQ1{=²rsgO$wTM5_UmPʒSSR%XT_?uW wM'9ΗnI x7Ggh=ګ?CVӶYgZ6mՋI:Zs.ߊ)Q;-QM*c>;E4 J ֮|xN)1i8/誃c!+η5jz~aJLnWOup4K6D"h +OCAI-~3[+@grKVzPnnCĬ!kpUQv6>eƍ54M^XVfϺu!O inݠ?y--A[kЋiCv?tm\SF|]^PO) KfVeNbwd?}&d4=?uyVSZ7`)a;3vd!ݺ4oS/(*,Jg]UؘƮ됳|BDT%7wXK=y:ރE!)v6"Zq,dJޜζzsEB}S/TF}ĸlv!W(<~:!qtBdddtC=y黤<pic [v-/Z?TV)Kќ lϙ/u43ik~1)9G#q1:CVsnKW+Ojڻdtu5֝2]0&wO,|:M,z}6y^s CXж\-Y{2فJwa_Cvq9j}ۑ t-y!RNlZB==^T5>e{;jY+L$(a[̹ <ԒX|7tJOoSoBC;)g _k۹)5ŜSGExD\Qk3[cdnx#ΰuޭZR<ҩg a]OXfC>v^.rUID16 __Gb!Z/+.͌|rYN R2uFkˎ?ѸK+$]0-<˘t8wowsTm,I'G)klk#mtצOEI6i{ym}{$)igHaųϦY| G~_773\^3);c usܧNFm"O 3sgcs'eT3F^pʜ'ĠHgKЎxV->,[cm3o@ߞh3K{vg$8Ђ]Qp%T?I:bhk! :_Ag37Ne'%%K&EZ:rAX/a{*"QsH6R<*6dA΋B~kwWG+1_OWr`<2N O76>x5qjDvv]ͱ[2ܶ=o<9?|~)>D У*I^DPyT?[D];4˶nxٓGZ{juG-9;;VuC!)GF/._-A 3`x+ҭD+fP+;c!#V;mbTꃑVn,Z׭Ɓ^6OӬ8Զo']TM .ouyVPG&ܶgl}\/>h6C7+ZY|$ڊFҊ^񆭽hڡB&r#.|Yklüh^8>W,թyhC4 oNl\rɧqa.fW&8t衬MM18;##O'AK0-:I3;/ 8Y65v8KLiA>tt78ot755wy1.ݯt޳nŝo N=uf1/c%3&/_<1V 5}}9QoyPt57}qinؾU˶\Lͳ|4tGydIB_-\*̽7B䝱ɭήӮT;{8zvw.Zi3j?yoNj$gdo!PQ ڙ v_mnde>yРډc/bu;u>F" [9s{e#V0\Ɩc}NStƇWSf{#(R0cB6N0O;\6$8Y$&O8ĶHDM>FY1g6.r虬E NL׳oK4VZi nRygHcNofŻcg.*lCN':VZp;gٸ [v`A ?>FxL0uFȊ]M8d׭2'V.#{WnAB'ߠ&Ĝ2fLNV{fu>nR5Ud)o%V.t^5~\ό㍪3?Ufͪ/3[3UUuZ}&t Ν\;5WOǺfT3 yhoK$RY^1dRl5ܻtʽ0h%b$=juDsm?>nGC_Ө恩3oR}?PiBg93Mv nKgOL绦22[Rpf՞ |HaŽ!kf-O~iK{lR6:*8dG]'_!@[^m&NΎQ]']0G+=Ҩ 4uF _U|nrN-~mE{ЫP(`_HvC5x5tC;7 4tAg93 :oh @}@s@gt:Pߠ37 4tAg93 :oh @}@s@gt:Pߠ3@U(WLM}R@g93P ϟ?/..nQԙ&M~h TBll,j,EKׁ@s@g:?p܄fAg T3 FCg);[{{/]:J: t*:IB@,DL!~[g)NVSb3Ag3Mʡ;ou]?S+z *R BƋ+dT *Pm}:R:Pt*;CVmYnfv< / UÐ@9wJo7 nڢ!D/* Sې_ !_kb7Z}W?:Pt*;CT$,&~6t$'p B<]Ѐu[^nu<' r)-™ lN Dm sCT-sDgDq .ԀJ&G7.ldienmdbϣφ=, uoʾv#¾[7W)4^vx d֛јDU۱s:%G.[UFm9.鋏=47$Ph@gj@%|@QDTYQ/4~ý _]NXYK :Mf2xmZn-/Z,Ѩ&ܨ=X N=0qAQԵ{I|2;6en8Gϵc΍~ t6 T¿wF)ᗾ|!m{y'jkHѰCWVb<'лaܢ5Eθeˉ`Iyn:y}aEknIJֶm;rգБ @m L X53|}'Sģ :xw2Lg>6%84}{h'Y;Ro73\<٫?mJΐ8wCj؊,(P$6m殝J1SZhر uxȨ-{f-_)YYB\u4%̍;vNI82+ (ڻ|¦8rLup({Gv23u75lJ&~Iڳo-F;{wliB(M~~'Qdݼs{o1 kFxr':{hO/ |dҬ;>6]4'Wқ;3#1*qJ.y^==޺d6׫WzJL9.``[ڏ^ԞT9_|v f 6D%oD=(J*-6T' -ܢڠ3P &(*(+LV̚v̈́ڠ3P 9j]2宑w Jk: t* PHRN'*++mmm3t*댆EQW3ON=37 4tAg93 :oh @}@s@g[zzt>:#33 PgPghlDK P!h I) @MAgtj :3PS5 t@ @g3j:5P) @MAgtj :3PS5@{5(4E˖-Dw:5Tr劕U͓ 㜝EP) 䰧zXXXVz }_^tV) j:gR F@:~@gi3lg(x(\k8DR{AC,:t:v*(H:au>zv_l_#ooV q~~],u*C#lȯ.A^ƽ]~9r[gӋ@!̋vsKtm Ps#fX~mMP_hkх?n[nKפz+ j]Exw#goWY}s:Q-0ڼy6lMG! ߍH49ѕYkRlD֝zvn̐-]x /[ :Mg:wD] ?fqu;[YdN)CE-PbB H՞ TAD+_zʃ2a3 TmD%0Ȼc3S,EV oG ⎥RXFW [|}Xg8z7Ғ+;2=ǍݍLVSh@gi3P(M8s6I'.73lԁn H 8b}x.8XjUqv| Ǣ9mL 6zwobZ=_'jlF/u=<ѸSaŝ_ҳ)5䲅Ͽ&1\̟>~{Sr{I?L謣}{\A\g,rpӤmB_k CgIӓAc+peha2g`[]Ν۲ڎՉxmUt8H"+ޞZ?aDiiZJդ Q :!A %ft8ߟX{"{^4c3/6Ɲ7#6:;#bP?tjӡO3:ަݩz&.wz⦮L<:Xx i+}ً[/3gc&yt;*: ab/:nkգ+i<)ےM)2 ]1pS"DIנ g-e&~p+*-* 3jY2[8.6wPK\ɵkz%EpZ'oh07%?&KքqsO<|-bvtչ0jٖn3gѣA;_JDe1uN \6&?i%e_zIsmR2?388eqh_лz 2ziˋ} 鈔_E8AAiESqi @gi3y|vܝ+ Ay ^!Nif휅T03^uVUgtd;'IhrLOnN>s՝ge.-;֒p]weˬ5C;BFz2\n8ܙK9\8Z^Ǻ5*;|3]fǎfs܅fm1~NKSj]|dD7OL8,-](,Qtst34}3oOm]}aƆupޘZl[8E1.}m6iPr4:y:pb_Bga3LgO!,sNL֏Y~{Qկ^s3ϒAgi3Q;v۷/t*:9QaÆ]]]:3,--z }999^^^36n8h TtrS=!!G)Dw;c |sS3mֿx*:}) صkW޽3P5흱{n??? Tt@ |{gٳ:P) @MAgtj :3PS5 t@ @g3j:5P) @MAgtj :3PS5 t@ @g3j:5P) @MAgtj :3PS?fff =~Fp8tj;ikk7{P( l =x^DbK3P}?3P}u+ Tt@]Ag3 :PW@C)++o錊 x`AgddH]266nԨ?/ONN.--m%+++33455U,7Ū==vv>^h(jo34~=o&c%%%_6B X78,Xj36Z b^Ưw@Agh"egCCÆK,NqqH$Rg`9//F}3H$c11:u3tt:CAg/ t&E-* " ED2J!I$8*,"!Ѩ:ubq$"P,8:C&`K=?宰)*C ~OAg~QgȄOz \u)c\,u)8IꑠyI'^ 4Q]=~QgH9OnDdrVinClfCa8v}hœ7ΐr&hcOx@ťYOo) \nCkQKb1QnuFV©+4_}Hs\ݝ{k:CV+ɔV#{46}rew?oG&Y|rwXe庤庇];#@ow '9%YmxaK#{V."yg)-77{Ui|QEEE˖-k_ fff*;lD=mmmU[yT*-**RaУ"5*t&"UvdD! })K|ǂVWpdUj]p:|r@iѓ W^s}kݐ_ST.8,-" ʄx6܈%lN>OD$i0H+ӵ OMWΐq^*Z7K*2*Xq(")RB Em#S]L""!sP/l6jDp`ϜD`&MlU 6Bܪ?# K:޺E,GH Ε=؄9>=Kf,23~Mg'^8Xy`z?,E]ٵr,\$ҷ_ӽI3_uBe6cLvy؍9:f^7-7ޤn;ܯ\Gʏ3/録ԁz3 w$ |ING'%.nrMdZ>;2x _'bQ[dqCkNqJR{L4#ًLOJyjZUtlA{)|]U'3I}&4>JJo<`͓ ûgwŔ98-\Ǭ>(H$PAWZ!Qt\M*h1KLj3ܯEsݾt?'6kɜJ!ǧn}Փ/zwcy]IWYɏoy6rbOx\347&&ܸ;>*.~g/J}~vj!ݠQ.[߾(>hܽGg+A“bK禍u` qiGmԢ(Aަdr)6&@b[)Y=]HFa+Jy28C!cafC3OvFAʳ lT/}M7ut{@';C9Sp@%onܚVڊòBvjrje=gb?uƭx{te;u!m %o%j R$7GkJ(te98Cj@Xy43Re{3ıKM-_ 9jrN7}\9T|)YjI&@X*!b#Ny~Li(~luqNy_[*Dc"]S3ri/v^ojfE!@g']w>ʛ ècMg񤟘#;CZrg#ceR!7i䝗lRrbZ;#|)%3~dqAcuvhZ wF{g*K3q ] W)76ͭʼB!amgCVrR:TLǒ:VfwJr&꫞?pp&5spObi EE<SOR73Cgʢ[m3e`45vַÊ.s~~'t8Wc-7s2oDNZPw-2ޜ!ӅN1lrRYK]ͤe913ژ&۵?`6MgvVn JR-NO+ s[+1$:,SINY6Fz Tss巆P/?2X<9Y 9-k3tSN]֭* cǏg,F $'UlҸhR'#.Ϡ9 Mܴb2xSS z3^ {?&Z8 TVQZS : ȲHee QPf 2r" T"4ZM>vae9E!}* P{bE]hؔD]]b0ZZkPCv Bg2_;-~Ρ3@|9K[PYl6bO>TB@<ÖH$جa@qqqiiʮ3zυ Umy